diff --git a/changelog.md b/changelog.md index f59516c..e79dbf4 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,12 @@ +## [1.8.2] - 2025-05-12 +* fix: seeds would not randomize in some Comfy setting +* fix: combo of `LoadImage` became smaller in last version +* fix: sliders not worked. +* fix: cannot run API nodes even is logged in. +* fix: NaN error when there is no `getLayer` linked to `getImage` +* optimization: output of `SendImage` now become a `layer_or_group` +* optimization: no longer compress image when connecting with IP address. (For those who use Comfy in intranet) + ## [1.8.1] - 2025-05-06 * fix: `GetImage` with `quality` not works in some ComfyUI. * optimization: more detailed websocket error diff --git a/javascript/sdppp-comfy.js b/javascript/sdppp-comfy.js index 3554b7a..1179b56 100644 --- a/javascript/sdppp-comfy.js +++ b/javascript/sdppp-comfy.js @@ -9802,39 +9802,7 @@ var require_mocha = __commonJS({ ]; var constants$1 = utils$1.defineConstants( /** - * {@link Runner}-related constants. Used by reporters. Each event emits the corresponding object, unless otherwise indicated. - * @example - * const Mocha = require('mocha'); - * const Base = Mocha.reporters.Base; - * const { - * EVENT_HOOK_BEGIN, - * EVENT_TEST_PASS, - * EVENT_TEST_FAIL, - * EVENT_TEST_END - * } = Mocha.Runner.constants - * - * function MyReporter(runner, options) { - * Base.call(this, runner, options); - * - * runner.on(EVENT_HOOK_BEGIN, function(hook) { - * console.log('hook called: ', hook.title); - * }); - * - * runner.on(EVENT_TEST_PASS, function(test) { - * console.log('pass: %s', test.fullTitle()); - * }); - * - * runner.on(EVENT_TEST_FAIL, function(test, err) { - * console.log('fail: %s -- error: %s', test.fullTitle(), err.message); - * }); - * - * runner.on(EVENT_TEST_END, function() { - * console.log('end: %d/%d', runner.stats.passes, runner.stats.tests); - * }); - * } - * - * module.exports = MyReporter; - * + * {@link Runner}-related constants. * @public * @memberof Runner * @readonly @@ -9884,13 +9852,7 @@ var require_mocha = __commonJS({ */ EVENT_TEST_END: "test end", /** - * Emitted when {@link Test} execution fails. Includes an `err` object of type `Error`. - * @example - * runner.on(EVENT_TEST_FAIL, function(test, err) { - * console.log('fail: %s -- error: %s', test.fullTitle(), err.message); - * }); - * - * + * Emitted when {@link Test} execution fails */ EVENT_TEST_FAIL: "fail", /** @@ -11852,7 +11814,7 @@ var require_mocha = __commonJS({ ) ); tests.forEach(function(t) { - self2.test(t, options); + self2.test(t); }); self2.write(""); }); @@ -11876,12 +11838,12 @@ var require_mocha = __commonJS({ Base.consoleLog(line3); } }; - XUnit.prototype.test = function(test2, options) { + XUnit.prototype.test = function(test2) { Base.useColors = false; var attrs = { classname: test2.parent.fullTitle(), name: test2.title, - file: testFilePath(test2.file, options), + file: test2.file, time: test2.duration / 1e3 || 0 }; if (test2.state === STATE_FAILED2) { @@ -11921,12 +11883,6 @@ var require_mocha = __commonJS({ } return tag2; } - function testFilePath(filepath, options) { - if (options && options.reporterOptions && options.reporterOptions.showRelativePaths) { - return path.relative(process2.cwd(), filepath); - } - return filepath; - } XUnit.description = "XUnit-compatible XML output"; })(xunit); var markdown = { exports: {} }; @@ -12694,7 +12650,7 @@ var require_mocha = __commonJS({ return this; }; var name = "mocha"; - var version4 = "11.2.2"; + var version4 = "11.1.0"; var homepage = "https://mochajs.org/"; var notifyLogo = "https://ibin.co/4QuRuGjXvl36.png"; var require$$17 = { @@ -14449,7 +14405,7 @@ var require_react_development = __commonJS({ } return dispatcher; } - function useContext67(Context3) { + function useContext66(Context3) { var dispatcher = resolveDispatcher(); { if (Context3._context !== void 0) { @@ -15255,7 +15211,7 @@ var require_react_development = __commonJS({ exports.startTransition = startTransition; exports.unstable_act = act; exports.useCallback = useCallback21; - exports.useContext = useContext67; + exports.useContext = useContext66; exports.useDebugValue = useDebugValue; exports.useDeferredValue = useDeferredValue; exports.useEffect = useEffect69; @@ -47765,8 +47721,7 @@ var localeValues = { TimePicker: en_US_default3, Calendar: en_US_default5, global: { - placeholder: "Please select", - close: "Close" + placeholder: "Please select" }, Table: { filterTitle: "Filter menu", @@ -49878,7 +49833,7 @@ var PresetColors = ["blue", "purple", "cyan", "green", "magenta", "pink", "red", var import_react13 = __toESM(require_react()); // node_modules/antd/es/version/version.js -var version_default2 = "5.25.1"; +var version_default2 = "5.24.7"; // node_modules/antd/es/version/index.js var version_default3 = version_default2; @@ -52476,70 +52431,37 @@ var ReactDOM3 = __toESM(require_react_dom()); function _regeneratorRuntime() { "use strict"; _regeneratorRuntime = function _regeneratorRuntime2() { - return r; + return e; }; - var t, r = {}, e = Object.prototype, n = e.hasOwnProperty, o = "function" == typeof Symbol ? Symbol : {}, i = o.iterator || "@@iterator", a = o.asyncIterator || "@@asyncIterator", u = o.toStringTag || "@@toStringTag"; - function c(t2, r2, e2, n2) { - return Object.defineProperty(t2, r2, { - value: e2, - enumerable: !n2, - configurable: !n2, - writable: !n2 - }); + var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function(t2, e2, r2) { + t2[e2] = r2.value; + }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; + function define2(t2, e2, r2) { + return Object.defineProperty(t2, e2, { + value: r2, + enumerable: true, + configurable: true, + writable: true + }), t2[e2]; } try { - c({}, ""); + define2({}, ""); } catch (t2) { - c = function c2(t3, r2, e2) { - return t3[r2] = e2; + define2 = function define3(t3, e2, r2) { + return t3[e2] = r2; }; } - function h(r2, e2, n2, o2) { - var i2 = e2 && e2.prototype instanceof Generator ? e2 : Generator, a2 = Object.create(i2.prototype); - return c(a2, "_invoke", /* @__PURE__ */ function(r3, e3, n3) { - var o3 = 1; - return function(i3, a3) { - if (3 === o3) throw Error("Generator is already running"); - if (4 === o3) { - if ("throw" === i3) throw a3; - return { - value: t, - done: true - }; - } - for (n3.method = i3, n3.arg = a3; ; ) { - var u2 = n3.delegate; - if (u2) { - var c2 = d(u2, n3); - if (c2) { - if (c2 === f) continue; - return c2; - } - } - if ("next" === n3.method) n3.sent = n3._sent = n3.arg; - else if ("throw" === n3.method) { - if (1 === o3) throw o3 = 4, n3.arg; - n3.dispatchException(n3.arg); - } else "return" === n3.method && n3.abrupt("return", n3.arg); - o3 = 3; - var h2 = s(r3, e3, n3); - if ("normal" === h2.type) { - if (o3 = n3.done ? 4 : 2, h2.arg === f) continue; - return { - value: h2.arg, - done: n3.done - }; - } - "throw" === h2.type && (o3 = 4, n3.method = "throw", n3.arg = h2.arg); - } - }; - }(r2, n2, new Context3(o2 || [])), true), a2; + function wrap(t2, e2, r2, n2) { + var i2 = e2 && e2.prototype instanceof Generator ? e2 : Generator, a2 = Object.create(i2.prototype), c2 = new Context3(n2 || []); + return o(a2, "_invoke", { + value: makeInvokeMethod(t2, r2, c2) + }), a2; } - function s(t2, r2, e2) { + function tryCatch(t2, e2, r2) { try { return { type: "normal", - arg: t2.call(r2, e2) + arg: t2.call(e2, r2) }; } catch (t3) { return { @@ -52548,187 +52470,248 @@ function _regeneratorRuntime() { }; } } - r.wrap = h; - var f = {}; + e.wrap = wrap; + var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() { } function GeneratorFunction() { } function GeneratorFunctionPrototype() { } - var l = {}; - c(l, i, function() { + var p = {}; + define2(p, a, function() { return this; }); - var p = Object.getPrototypeOf, y = p && p(p(x([]))); - y && y !== e && n.call(y, i) && (l = y); - var v = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(l); - function g(t2) { - ["next", "throw", "return"].forEach(function(r2) { - c(t2, r2, function(t3) { - return this._invoke(r2, t3); + var d = Object.getPrototypeOf, v = d && d(d(values([]))); + v && v !== r && n.call(v, a) && (p = v); + var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); + function defineIteratorMethods(t2) { + ["next", "throw", "return"].forEach(function(e2) { + define2(t2, e2, function(t3) { + return this._invoke(e2, t3); }); }); } - function AsyncIterator(t2, r2) { - function e2(o3, i2, a2, u2) { - var c2 = s(t2[o3], t2, i2); + function AsyncIterator(t2, e2) { + function invoke(r3, o2, i2, a2) { + var c2 = tryCatch(t2[r3], t2, o2); if ("throw" !== c2.type) { - var h2 = c2.arg, f2 = h2.value; - return f2 && "object" == _typeof(f2) && n.call(f2, "__await") ? r2.resolve(f2.__await).then(function(t3) { - e2("next", t3, a2, u2); + var u2 = c2.arg, h2 = u2.value; + return h2 && "object" == _typeof(h2) && n.call(h2, "__await") ? e2.resolve(h2.__await).then(function(t3) { + invoke("next", t3, i2, a2); }, function(t3) { - e2("throw", t3, a2, u2); - }) : r2.resolve(f2).then(function(t3) { - h2.value = t3, a2(h2); + invoke("throw", t3, i2, a2); + }) : e2.resolve(h2).then(function(t3) { + u2.value = t3, i2(u2); }, function(t3) { - return e2("throw", t3, a2, u2); + return invoke("throw", t3, i2, a2); }); } - u2(c2.arg); + a2(c2.arg); } - var o2; - c(this, "_invoke", function(t3, n2) { - function i2() { - return new r2(function(r3, o3) { - e2(t3, n2, r3, o3); - }); + var r2; + o(this, "_invoke", { + value: function value2(t3, n2) { + function callInvokeWithMethodAndArg() { + return new e2(function(e3, r3) { + invoke(t3, n2, e3, r3); + }); + } + return r2 = r2 ? r2.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } - return o2 = o2 ? o2.then(i2, i2) : i2(); - }, true); + }); } - function d(r2, e2) { - var n2 = e2.method, o2 = r2.i[n2]; - if (o2 === t) return e2.delegate = null, "throw" === n2 && r2.i["return"] && (e2.method = "return", e2.arg = t, d(r2, e2), "throw" === e2.method) || "return" !== n2 && (e2.method = "throw", e2.arg = new TypeError("The iterator does not provide a '" + n2 + "' method")), f; - var i2 = s(o2, r2.i, e2.arg); - if ("throw" === i2.type) return e2.method = "throw", e2.arg = i2.arg, e2.delegate = null, f; + function makeInvokeMethod(e2, r2, n2) { + var o2 = h; + return function(i2, a2) { + if (o2 === f) throw Error("Generator is already running"); + if (o2 === s) { + if ("throw" === i2) throw a2; + return { + value: t, + done: true + }; + } + for (n2.method = i2, n2.arg = a2; ; ) { + var c2 = n2.delegate; + if (c2) { + var u2 = maybeInvokeDelegate(c2, n2); + if (u2) { + if (u2 === y) continue; + return u2; + } + } + if ("next" === n2.method) n2.sent = n2._sent = n2.arg; + else if ("throw" === n2.method) { + if (o2 === h) throw o2 = s, n2.arg; + n2.dispatchException(n2.arg); + } else "return" === n2.method && n2.abrupt("return", n2.arg); + o2 = f; + var p2 = tryCatch(e2, r2, n2); + if ("normal" === p2.type) { + if (o2 = n2.done ? s : l, p2.arg === y) continue; + return { + value: p2.arg, + done: n2.done + }; + } + "throw" === p2.type && (o2 = s, n2.method = "throw", n2.arg = p2.arg); + } + }; + } + function maybeInvokeDelegate(e2, r2) { + var n2 = r2.method, o2 = e2.iterator[n2]; + if (o2 === t) return r2.delegate = null, "throw" === n2 && e2.iterator["return"] && (r2.method = "return", r2.arg = t, maybeInvokeDelegate(e2, r2), "throw" === r2.method) || "return" !== n2 && (r2.method = "throw", r2.arg = new TypeError("The iterator does not provide a '" + n2 + "' method")), y; + var i2 = tryCatch(o2, e2.iterator, r2.arg); + if ("throw" === i2.type) return r2.method = "throw", r2.arg = i2.arg, r2.delegate = null, y; var a2 = i2.arg; - return a2 ? a2.done ? (e2[r2.r] = a2.value, e2.next = r2.n, "return" !== e2.method && (e2.method = "next", e2.arg = t), e2.delegate = null, f) : a2 : (e2.method = "throw", e2.arg = new TypeError("iterator result is not an object"), e2.delegate = null, f); + return a2 ? a2.done ? (r2[e2.resultName] = a2.value, r2.next = e2.nextLoc, "return" !== r2.method && (r2.method = "next", r2.arg = t), r2.delegate = null, y) : a2 : (r2.method = "throw", r2.arg = new TypeError("iterator result is not an object"), r2.delegate = null, y); } - function w(t2) { - this.tryEntries.push(t2); + function pushTryEntry(t2) { + var e2 = { + tryLoc: t2[0] + }; + 1 in t2 && (e2.catchLoc = t2[1]), 2 in t2 && (e2.finallyLoc = t2[2], e2.afterLoc = t2[3]), this.tryEntries.push(e2); } - function m(r2) { - var e2 = r2[4] || {}; - e2.type = "normal", e2.arg = t, r2[4] = e2; + function resetTryEntry(t2) { + var e2 = t2.completion || {}; + e2.type = "normal", delete e2.arg, t2.completion = e2; } function Context3(t2) { - this.tryEntries = [[-1]], t2.forEach(w, this), this.reset(true); + this.tryEntries = [{ + tryLoc: "root" + }], t2.forEach(pushTryEntry, this), this.reset(true); } - function x(r2) { - if (null != r2) { - var e2 = r2[i]; - if (e2) return e2.call(r2); - if ("function" == typeof r2.next) return r2; - if (!isNaN(r2.length)) { - var o2 = -1, a2 = function e3() { - for (; ++o2 < r2.length; ) if (n.call(r2, o2)) return e3.value = r2[o2], e3.done = false, e3; - return e3.value = t, e3.done = true, e3; + function values(e2) { + if (e2 || "" === e2) { + var r2 = e2[a]; + if (r2) return r2.call(e2); + if ("function" == typeof e2.next) return e2; + if (!isNaN(e2.length)) { + var o2 = -1, i2 = function next2() { + for (; ++o2 < e2.length; ) if (n.call(e2, o2)) return next2.value = e2[o2], next2.done = false, next2; + return next2.value = t, next2.done = true, next2; }; - return a2.next = a2; + return i2.next = i2; } } - throw new TypeError(_typeof(r2) + " is not iterable"); + throw new TypeError(_typeof(e2) + " is not iterable"); } - return GeneratorFunction.prototype = GeneratorFunctionPrototype, c(v, "constructor", GeneratorFunctionPrototype), c(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = c(GeneratorFunctionPrototype, u, "GeneratorFunction"), r.isGeneratorFunction = function(t2) { - var r2 = "function" == typeof t2 && t2.constructor; - return !!r2 && (r2 === GeneratorFunction || "GeneratorFunction" === (r2.displayName || r2.name)); - }, r.mark = function(t2) { - return Object.setPrototypeOf ? Object.setPrototypeOf(t2, GeneratorFunctionPrototype) : (t2.__proto__ = GeneratorFunctionPrototype, c(t2, u, "GeneratorFunction")), t2.prototype = Object.create(v), t2; - }, r.awrap = function(t2) { + return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { + value: GeneratorFunctionPrototype, + configurable: true + }), o(GeneratorFunctionPrototype, "constructor", { + value: GeneratorFunction, + configurable: true + }), GeneratorFunction.displayName = define2(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function(t2) { + var e2 = "function" == typeof t2 && t2.constructor; + return !!e2 && (e2 === GeneratorFunction || "GeneratorFunction" === (e2.displayName || e2.name)); + }, e.mark = function(t2) { + return Object.setPrototypeOf ? Object.setPrototypeOf(t2, GeneratorFunctionPrototype) : (t2.__proto__ = GeneratorFunctionPrototype, define2(t2, u, "GeneratorFunction")), t2.prototype = Object.create(g), t2; + }, e.awrap = function(t2) { return { __await: t2 }; - }, g(AsyncIterator.prototype), c(AsyncIterator.prototype, a, function() { + }, defineIteratorMethods(AsyncIterator.prototype), define2(AsyncIterator.prototype, c, function() { return this; - }), r.AsyncIterator = AsyncIterator, r.async = function(t2, e2, n2, o2, i2) { + }), e.AsyncIterator = AsyncIterator, e.async = function(t2, r2, n2, o2, i2) { void 0 === i2 && (i2 = Promise); - var a2 = new AsyncIterator(h(t2, e2, n2, o2), i2); - return r.isGeneratorFunction(e2) ? a2 : a2.next().then(function(t3) { + var a2 = new AsyncIterator(wrap(t2, r2, n2, o2), i2); + return e.isGeneratorFunction(r2) ? a2 : a2.next().then(function(t3) { return t3.done ? t3.value : a2.next(); }); - }, g(v), c(v, u, "Generator"), c(v, i, function() { + }, defineIteratorMethods(g), define2(g, u, "Generator"), define2(g, a, function() { return this; - }), c(v, "toString", function() { + }), define2(g, "toString", function() { return "[object Generator]"; - }), r.keys = function(t2) { - var r2 = Object(t2), e2 = []; - for (var n2 in r2) e2.unshift(n2); - return function t3() { - for (; e2.length; ) if ((n2 = e2.pop()) in r2) return t3.value = n2, t3.done = false, t3; - return t3.done = true, t3; + }), e.keys = function(t2) { + var e2 = Object(t2), r2 = []; + for (var n2 in e2) r2.push(n2); + return r2.reverse(), function next2() { + for (; r2.length; ) { + var t3 = r2.pop(); + if (t3 in e2) return next2.value = t3, next2.done = false, next2; + } + return next2.done = true, next2; }; - }, r.values = x, Context3.prototype = { + }, e.values = values, Context3.prototype = { constructor: Context3, - reset: function reset(r2) { - if (this.prev = this.next = 0, this.sent = this._sent = t, this.done = false, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(m), !r2) for (var e2 in this) "t" === e2.charAt(0) && n.call(this, e2) && !isNaN(+e2.slice(1)) && (this[e2] = t); + reset: function reset(e2) { + if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = false, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e2) for (var r2 in this) "t" === r2.charAt(0) && n.call(this, r2) && !isNaN(+r2.slice(1)) && (this[r2] = t); }, stop: function stop() { this.done = true; - var t2 = this.tryEntries[0][4]; + var t2 = this.tryEntries[0].completion; if ("throw" === t2.type) throw t2.arg; return this.rval; }, - dispatchException: function dispatchException(r2) { - if (this.done) throw r2; - var e2 = this; - function n2(t2) { - a2.type = "throw", a2.arg = r2, e2.next = t2; + dispatchException: function dispatchException(e2) { + if (this.done) throw e2; + var r2 = this; + function handle(n2, o3) { + return a2.type = "throw", a2.arg = e2, r2.next = n2, o3 && (r2.method = "next", r2.arg = t), !!o3; } - for (var o2 = e2.tryEntries.length - 1; o2 >= 0; --o2) { - var i2 = this.tryEntries[o2], a2 = i2[4], u2 = this.prev, c2 = i2[1], h2 = i2[2]; - if (-1 === i2[0]) return n2("end"), false; - if (!c2 && !h2) throw Error("try statement without catch or finally"); - if (null != i2[0] && i2[0] <= u2) { - if (u2 < c2) return this.method = "next", this.arg = t, n2(c2), true; - if (u2 < h2) return n2(h2), false; + for (var o2 = this.tryEntries.length - 1; o2 >= 0; --o2) { + var i2 = this.tryEntries[o2], a2 = i2.completion; + if ("root" === i2.tryLoc) return handle("end"); + if (i2.tryLoc <= this.prev) { + var c2 = n.call(i2, "catchLoc"), u2 = n.call(i2, "finallyLoc"); + if (c2 && u2) { + if (this.prev < i2.catchLoc) return handle(i2.catchLoc, true); + if (this.prev < i2.finallyLoc) return handle(i2.finallyLoc); + } else if (c2) { + if (this.prev < i2.catchLoc) return handle(i2.catchLoc, true); + } else { + if (!u2) throw Error("try statement without catch or finally"); + if (this.prev < i2.finallyLoc) return handle(i2.finallyLoc); + } } } }, - abrupt: function abrupt(t2, r2) { - for (var e2 = this.tryEntries.length - 1; e2 >= 0; --e2) { - var n2 = this.tryEntries[e2]; - if (n2[0] > -1 && n2[0] <= this.prev && this.prev < n2[2]) { - var o2 = n2; + abrupt: function abrupt(t2, e2) { + for (var r2 = this.tryEntries.length - 1; r2 >= 0; --r2) { + var o2 = this.tryEntries[r2]; + if (o2.tryLoc <= this.prev && n.call(o2, "finallyLoc") && this.prev < o2.finallyLoc) { + var i2 = o2; break; } } - o2 && ("break" === t2 || "continue" === t2) && o2[0] <= r2 && r2 <= o2[2] && (o2 = null); - var i2 = o2 ? o2[4] : {}; - return i2.type = t2, i2.arg = r2, o2 ? (this.method = "next", this.next = o2[2], f) : this.complete(i2); + i2 && ("break" === t2 || "continue" === t2) && i2.tryLoc <= e2 && e2 <= i2.finallyLoc && (i2 = null); + var a2 = i2 ? i2.completion : {}; + return a2.type = t2, a2.arg = e2, i2 ? (this.method = "next", this.next = i2.finallyLoc, y) : this.complete(a2); }, - complete: function complete(t2, r2) { + complete: function complete(t2, e2) { if ("throw" === t2.type) throw t2.arg; - return "break" === t2.type || "continue" === t2.type ? this.next = t2.arg : "return" === t2.type ? (this.rval = this.arg = t2.arg, this.method = "return", this.next = "end") : "normal" === t2.type && r2 && (this.next = r2), f; + return "break" === t2.type || "continue" === t2.type ? this.next = t2.arg : "return" === t2.type ? (this.rval = this.arg = t2.arg, this.method = "return", this.next = "end") : "normal" === t2.type && e2 && (this.next = e2), y; }, finish: function finish(t2) { - for (var r2 = this.tryEntries.length - 1; r2 >= 0; --r2) { - var e2 = this.tryEntries[r2]; - if (e2[2] === t2) return this.complete(e2[4], e2[3]), m(e2), f; + for (var e2 = this.tryEntries.length - 1; e2 >= 0; --e2) { + var r2 = this.tryEntries[e2]; + if (r2.finallyLoc === t2) return this.complete(r2.completion, r2.afterLoc), resetTryEntry(r2), y; } }, "catch": function _catch(t2) { - for (var r2 = this.tryEntries.length - 1; r2 >= 0; --r2) { - var e2 = this.tryEntries[r2]; - if (e2[0] === t2) { - var n2 = e2[4]; + for (var e2 = this.tryEntries.length - 1; e2 >= 0; --e2) { + var r2 = this.tryEntries[e2]; + if (r2.tryLoc === t2) { + var n2 = r2.completion; if ("throw" === n2.type) { var o2 = n2.arg; - m(e2); + resetTryEntry(r2); } return o2; } } throw Error("illegal catch attempt"); }, - delegateYield: function delegateYield(r2, e2, n2) { + delegateYield: function delegateYield(e2, r2, n2) { return this.delegate = { - i: x(r2), - r: e2, - n: n2 - }, "next" === this.method && (this.arg = t), f; + iterator: values(e2), + resultName: r2, + nextLoc: n2 + }, "next" === this.method && (this.arg = t), y; } - }, r; + }, e; } // node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js @@ -52856,10 +52839,7 @@ var defaultReactRender = (node2, container) => { }; }; var unstableRender = defaultReactRender; -function unstableSetRender(render4) { - if (render4) { - unstableRender = render4; - } +function getReactRender() { return unstableRender; } @@ -53128,7 +53108,7 @@ var showWaveEffect = (target, info) => { holder.style.left = "0px"; holder.style.top = "0px"; target === null || target === void 0 ? void 0 : target.insertBefore(holder, target === null || target === void 0 ? void 0 : target.firstChild); - const reactRender2 = unstableSetRender(); + const reactRender2 = getReactRender(); let unmountCallback = null; function registerUnmount() { return unmountCallback; @@ -55552,25 +55532,16 @@ var InternalCompoundedButton = /* @__PURE__ */ import_react39.default.forwardRef autoFocus } = props, rest = __rest5(props, ["loading", "prefixCls", "color", "variant", "type", "danger", "shape", "size", "styles", "disabled", "className", "rootClassName", "children", "icon", "iconPosition", "ghost", "block", "htmlType", "classNames", "style", "autoInsertSpace", "autoFocus"]); const mergedType = type5 || "default"; - const { - button - } = import_react39.default.useContext(ConfigContext); const [mergedColor, mergedVariant] = (0, import_react39.useMemo)(() => { if (color && variant) { return [color, variant]; } - if (type5 || danger) { - const colorVariantPair = ButtonTypeMap[mergedType] || []; - if (danger) { - return ["danger", colorVariantPair[1]]; - } - return colorVariantPair; + const colorVariantPair = ButtonTypeMap[mergedType] || []; + if (danger) { + return ["danger", colorVariantPair[1]]; } - if ((button === null || button === void 0 ? void 0 : button.color) && (button === null || button === void 0 ? void 0 : button.variant)) { - return [button.color, button.variant]; - } - return ["default", "outlined"]; - }, [type5, color, variant, danger, button === null || button === void 0 ? void 0 : button.variant, button === null || button === void 0 ? void 0 : button.color]); + return colorVariantPair; + }, [type5, color, variant, danger]); const isDanger = mergedColor === "danger"; const mergedColorText = isDanger ? "dangerous" : mergedColor; const { @@ -55668,7 +55639,7 @@ var InternalCompoundedButton = /* @__PURE__ */ import_react39.default.forwardRef const linkButtonRestProps = omit(rest, ["navigate"]); const classes = (0, import_classnames14.default)(prefixCls, hashId, cssVarCls, { [`${prefixCls}-${shape}`]: shape !== "default" && shape, - // Compatible with versions earlier than 5.21.0 + // line(253 - 254): Compatible with versions earlier than 5.21.0 [`${prefixCls}-${mergedType}`]: mergedType, [`${prefixCls}-dangerous`]: danger, [`${prefixCls}-color-${mergedColorText}`]: mergedColorText, @@ -60309,8 +60280,8 @@ var TransBtn = function TransBtn2(props) { onClick, "aria-hidden": true }, icon !== void 0 ? icon : /* @__PURE__ */ React95.createElement("span", { - className: (0, import_classnames19.default)(className.split(/\s+/).map(function(cls6) { - return "".concat(cls6, "-icon"); + className: (0, import_classnames19.default)(className.split(/\s+/).map(function(cls5) { + return "".concat(cls5, "-icon"); })) }, children)); }; @@ -61458,10 +61429,10 @@ var Popup = /* @__PURE__ */ React114.forwardRef(function(props, ref) { } }), function(_ref, motionRef) { var motionClassName = _ref.className, motionStyle = _ref.style; - var cls6 = (0, import_classnames27.default)(prefixCls, motionClassName, className); + var cls5 = (0, import_classnames27.default)(prefixCls, motionClassName, className); return /* @__PURE__ */ React114.createElement("div", { ref: composeRef(resizeObserverRef, ref, motionRef), - className: cls6, + className: cls5, style: _objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2({ "--arrow-x": "".concat(arrowPos.x || 0, "px"), "--arrow-y": "".concat(arrowPos.y || 0, "px") @@ -63419,15 +63390,15 @@ var CacheMap = /* @__PURE__ */ function() { _classCallCheck(this, CacheMap2); _defineProperty(this, "maps", void 0); _defineProperty(this, "id", 0); - _defineProperty(this, "diffRecords", /* @__PURE__ */ new Map()); + _defineProperty(this, "diffKeys", /* @__PURE__ */ new Set()); this.maps = /* @__PURE__ */ Object.create(null); } _createClass(CacheMap2, [{ key: "set", value: function set2(key, value2) { - this.diffRecords.set(key, this.maps[key]); this.maps[key] = value2; this.id += 1; + this.diffKeys.add(key); } }, { key: "get", @@ -63441,12 +63412,12 @@ var CacheMap = /* @__PURE__ */ function() { }, { key: "resetRecord", value: function resetRecord() { - this.diffRecords.clear(); + this.diffKeys.clear(); } }, { key: "getRecord", value: function getRecord() { - return this.diffRecords; + return this.diffKeys; } }]); return CacheMap2; @@ -64112,10 +64083,9 @@ function RawList(props, ref) { React134.useLayoutEffect(function() { var changedRecord = heights.getRecord(); if (changedRecord.size === 1) { - var recordKey = Array.from(changedRecord.keys())[0]; - var prevCacheHeight = changedRecord.get(recordKey); + var recordKey = Array.from(changedRecord)[0]; var startItem = mergedData[start]; - if (startItem && prevCacheHeight === void 0) { + if (startItem) { var startIndexKey = getKey2(startItem); if (startIndexKey === recordKey) { var realStartHeight = heights.get(recordKey); @@ -64487,7 +64457,7 @@ var OptionList = function OptionList2(_, ref) { var value2 = Array.from(rawValues)[0]; var index3 = memoFlattenOptions.findIndex(function(_ref2) { var data = _ref2.data; - return searchValue ? String(data.value).startsWith(searchValue) : data.value === value2; + return data.value === value2; }); if (index3 !== -1) { setActive(index3); @@ -66612,13 +66582,6 @@ var genBaseStyle = (token2) => { inputPaddingHorizontalBase, iconCls } = token2; - const hoverShowClearStyle = { - [`${componentCls}-clear`]: { - opacity: 1, - background: token2.colorBgBase, - borderRadius: "50%" - } - }; return { [componentCls]: Object.assign(Object.assign({}, resetComponent(token2)), { position: "relative", @@ -66720,11 +66683,14 @@ var genBaseStyle = (token2) => { display: "block" }, "&:hover": { - color: token2.colorIcon + color: token2.colorTextTertiary } }, - "@media(hover:none)": hoverShowClearStyle, - "&:hover": hoverShowClearStyle + [`&:hover ${componentCls}-clear`]: { + opacity: 1, + background: token2.colorBgBase, + borderRadius: "50%" + } }), // ========================= Feedback ========================== [`${componentCls}-status`]: { @@ -66949,7 +66915,7 @@ var __rest7 = function(s, e) { }; var SECRET_COMBOBOX_MODE_DO_NOT_USE = "SECRET_COMBOBOX_MODE_DO_NOT_USE"; var InternalSelect = (props, ref) => { - var _a, _b, _c, _d, _e; + var _a; const { prefixCls: customizePrefixCls, bordered, @@ -66976,14 +66942,8 @@ var InternalSelect = (props, ref) => { transitionName, tagRender, maxCount, - prefix, - dropdownRender, - popupRender, - onDropdownVisibleChange, - onOpenChange, - styles, - classNames: classNames71 - } = props, rest = __rest7(props, ["prefixCls", "bordered", "className", "rootClassName", "getPopupContainer", "popupClassName", "dropdownClassName", "listHeight", "placement", "listItemHeight", "size", "disabled", "notFoundContent", "status", "builtinPlacements", "dropdownMatchSelectWidth", "popupMatchSelectWidth", "direction", "style", "allowClear", "variant", "dropdownStyle", "transitionName", "tagRender", "maxCount", "prefix", "dropdownRender", "popupRender", "onDropdownVisibleChange", "onOpenChange", "styles", "classNames"]); + prefix + } = props, rest = __rest7(props, ["prefixCls", "bordered", "className", "rootClassName", "getPopupContainer", "popupClassName", "dropdownClassName", "listHeight", "placement", "listItemHeight", "size", "disabled", "notFoundContent", "status", "builtinPlacements", "dropdownMatchSelectWidth", "popupMatchSelectWidth", "direction", "style", "allowClear", "variant", "dropdownStyle", "transitionName", "tagRender", "maxCount", "prefix"]); const { getPopupContainer: getContextPopupContainer, getPrefixCls, @@ -66993,13 +66953,7 @@ var InternalSelect = (props, ref) => { popupMatchSelectWidth: contextPopupMatchSelectWidth, popupOverflow } = React153.useContext(ConfigContext); - const { - showSearch, - style: contextStyle, - styles: contextStyles, - className: contextClassName, - classNames: contextClassNames - } = useComponentConfig("select"); + const contextSelect = useComponentConfig("select"); const [, token2] = useToken(); const listItemHeight = customListItemHeight !== null && customListItemHeight !== void 0 ? customListItemHeight : token2 === null || token2 === void 0 ? void 0 : token2.controlHeight; const prefixCls = getPrefixCls("select", customizePrefixCls); @@ -67027,9 +66981,6 @@ var InternalSelect = (props, ref) => { const isMultiple3 = mode === "multiple" || mode === "tags"; const showSuffixIcon = useShowArrow(props.suffixIcon, props.showArrow); const mergedPopupMatchSelectWidth = (_a = popupMatchSelectWidth !== null && popupMatchSelectWidth !== void 0 ? popupMatchSelectWidth : dropdownMatchSelectWidth) !== null && _a !== void 0 ? _a : contextPopupMatchSelectWidth; - const mergedPopupStyle = ((_b = styles === null || styles === void 0 ? void 0 : styles.popup) === null || _b === void 0 ? void 0 : _b.root) || ((_c = contextStyles.popup) === null || _c === void 0 ? void 0 : _c.root) || dropdownStyle; - const mergedPopupRender = popupRender || dropdownRender; - const mergedOnOpenChange = onOpenChange || onDropdownVisibleChange; const { status: contextStatus, hasFeedback, @@ -67064,9 +67015,9 @@ var InternalSelect = (props, ref) => { clearIcon } : allowClear; const selectProps = omit(rest, ["suffixIcon", "itemIcon"]); - const mergedPopupClassName = (0, import_classnames37.default)(((_d = classNames71 === null || classNames71 === void 0 ? void 0 : classNames71.popup) === null || _d === void 0 ? void 0 : _d.root) || ((_e = contextClassNames === null || contextClassNames === void 0 ? void 0 : contextClassNames.popup) === null || _e === void 0 ? void 0 : _e.root) || popupClassName || dropdownClassName, { + const mergedPopupClassName = (0, import_classnames37.default)(popupClassName || dropdownClassName, { [`${prefixCls}-dropdown-${direction}`]: direction === "rtl" - }, rootClassName, contextClassNames.root, classNames71 === null || classNames71 === void 0 ? void 0 : classNames71.root, cssVarCls, rootCls, hashId); + }, rootClassName, cssVarCls, rootCls, hashId); const mergedSize = useSize_default((ctx) => { var _a2; return (_a2 = customizeSize !== null && customizeSize !== void 0 ? customizeSize : compactSize) !== null && _a2 !== void 0 ? _a2 : ctx; @@ -67079,7 +67030,7 @@ var InternalSelect = (props, ref) => { [`${prefixCls}-rtl`]: direction === "rtl", [`${prefixCls}-${variant}`]: enableVariantCls, [`${prefixCls}-in-form-item`]: isFormItemInput - }, getStatusClassNames(prefixCls, mergedStatus, hasFeedback), compactItemClassnames, contextClassName, className, contextClassNames.root, classNames71 === null || classNames71 === void 0 ? void 0 : classNames71.root, rootClassName, cssVarCls, rootCls, hashId); + }, getStatusClassNames(prefixCls, mergedStatus, hasFeedback), compactItemClassnames, contextSelect.className, className, rootClassName, cssVarCls, rootCls, hashId); const memoPlacement = React153.useMemo(() => { if (placement !== void 0) { return placement; @@ -67088,29 +67039,19 @@ var InternalSelect = (props, ref) => { }, [placement, direction]); if (true) { const warning6 = devUseWarning("Select"); - const deprecatedProps = { - dropdownMatchSelectWidth: "popupMatchSelectWidth", - dropdownStyle: "styles.popup.root", - dropdownClassName: "classNames.popup.root", - popupClassName: "classNames.popup.root", - dropdownRender: "popupRender", - onDropdownVisibleChange: "onOpenChange", - bordered: "variant" - }; - Object.entries(deprecatedProps).forEach((_ref) => { - let [oldProp, newProp] = _ref; - warning6.deprecated(!(oldProp in props), oldProp, newProp); - }); + warning6.deprecated(!dropdownClassName, "dropdownClassName", "popupClassName"); + warning6.deprecated(dropdownMatchSelectWidth === void 0, "dropdownMatchSelectWidth", "popupMatchSelectWidth"); true ? warning6(!("showArrow" in props), "deprecated", "`showArrow` is deprecated which will be removed in next major version. It will be a default behavior, you can hide it by setting `suffixIcon` to null.") : void 0; + warning6.deprecated(!("bordered" in props), "bordered", "variant"); true ? warning6(!(typeof maxCount !== "undefined" && !isMultiple3), "usage", "`maxCount` only works with mode `multiple` or `tags`") : void 0; } - const [zIndex] = useZIndex("SelectLike", mergedPopupStyle === null || mergedPopupStyle === void 0 ? void 0 : mergedPopupStyle.zIndex); + const [zIndex] = useZIndex("SelectLike", dropdownStyle === null || dropdownStyle === void 0 ? void 0 : dropdownStyle.zIndex); return wrapCSSVar(/* @__PURE__ */ React153.createElement(es_default9, Object.assign({ ref, virtual, - showSearch + showSearch: contextSelect.showSearch }, selectProps, { - style: Object.assign(Object.assign(Object.assign(Object.assign({}, contextStyles.root), styles === null || styles === void 0 ? void 0 : styles.root), contextStyle), style2), + style: Object.assign(Object.assign({}, contextSelect.style), style2), dropdownMatchSelectWidth: mergedPopupMatchSelectWidth, transitionName: getTransitionName2(rootPrefixCls, "slide-up", transitionName), builtinPlacements: mergedBuiltinPlacements_default(builtinPlacements, popupOverflow), @@ -67130,13 +67071,11 @@ var InternalSelect = (props, ref) => { getPopupContainer: getPopupContainer || getContextPopupContainer, dropdownClassName: mergedPopupClassName, disabled: mergedDisabled, - dropdownStyle: Object.assign(Object.assign({}, mergedPopupStyle), { + dropdownStyle: Object.assign(Object.assign({}, dropdownStyle), { zIndex }), maxCount: isMultiple3 ? maxCount : void 0, - tagRender: isMultiple3 ? tagRender : void 0, - dropdownRender: mergedPopupRender, - onDropdownVisibleChange: mergedOnOpenChange + tagRender: isMultiple3 ? tagRender : void 0 }))); }; if (true) { @@ -67914,9 +67853,9 @@ var PurePanel2 = (props) => { const colorInfo = parseColor(prefixCls, color); const arrowContentStyle = colorInfo.arrowStyle; const formattedOverlayInnerStyle = Object.assign(Object.assign({}, overlayInnerStyle), colorInfo.overlayStyle); - const cls6 = (0, import_classnames41.default)(hashId, cssVarCls, prefixCls, `${prefixCls}-pure`, `${prefixCls}-placement-${placement}`, className, colorInfo.className); + const cls5 = (0, import_classnames41.default)(hashId, cssVarCls, prefixCls, `${prefixCls}-pure`, `${prefixCls}-placement-${placement}`, className, colorInfo.className); return wrapCSSVar(/* @__PURE__ */ React157.createElement("div", { - className: cls6, + className: cls5, style: arrowContentStyle }, /* @__PURE__ */ React157.createElement("div", { className: `${prefixCls}-arrow` @@ -67949,7 +67888,6 @@ var InternalTooltip = /* @__PURE__ */ React158.forwardRef((props, ref) => { afterOpenChange, afterVisibleChange, destroyTooltipOnHide, - destroyOnHidden, arrow = true, title, overlay, @@ -67966,7 +67904,7 @@ var InternalTooltip = /* @__PURE__ */ React158.forwardRef((props, ref) => { overlayClassName, styles, classNames: tooltipClassNames - } = props, restProps = __rest8(props, ["prefixCls", "openClassName", "getTooltipContainer", "color", "overlayInnerStyle", "children", "afterOpenChange", "afterVisibleChange", "destroyTooltipOnHide", "destroyOnHidden", "arrow", "title", "overlay", "builtinPlacements", "arrowPointAtCenter", "autoAdjustOverflow", "motion", "getPopupContainer", "placement", "mouseEnterDelay", "mouseLeaveDelay", "overlayStyle", "rootClassName", "overlayClassName", "styles", "classNames"]); + } = props, restProps = __rest8(props, ["prefixCls", "openClassName", "getTooltipContainer", "color", "overlayInnerStyle", "children", "afterOpenChange", "afterVisibleChange", "destroyTooltipOnHide", "arrow", "title", "overlay", "builtinPlacements", "arrowPointAtCenter", "autoAdjustOverflow", "motion", "getPopupContainer", "placement", "mouseEnterDelay", "mouseLeaveDelay", "overlayStyle", "rootClassName", "overlayClassName", "styles", "classNames"]); const mergedShowArrow = !!arrow; const [, token2] = useToken(); const { @@ -67997,7 +67935,7 @@ var InternalTooltip = /* @__PURE__ */ React158.forwardRef((props, ref) => { }; }); if (true) { - [["visible", "open"], ["defaultVisible", "defaultOpen"], ["onVisibleChange", "onOpenChange"], ["afterVisibleChange", "afterOpenChange"], ["destroyTooltipOnHide", "destroyOnHidden"], ["arrowPointAtCenter", "arrow={{ pointAtCenter: true }}"], ["overlayStyle", "styles={{ root: {} }}"], ["overlayInnerStyle", "styles={{ body: {} }}"], ["overlayClassName", 'classNames={{ root: "" }}']].forEach((_ref) => { + [["visible", "open"], ["defaultVisible", "defaultOpen"], ["onVisibleChange", "onOpenChange"], ["afterVisibleChange", "afterOpenChange"], ["arrowPointAtCenter", "arrow={{ pointAtCenter: true }}"], ["overlayStyle", "styles={{ root: {} }}"], ["overlayInnerStyle", "styles={{ body: {} }}"], ["overlayClassName", 'classNames={{ root: "" }}']].forEach((_ref) => { let [deprecatedName, newName] = _ref; warning6.deprecated(!(deprecatedName in props), deprecatedName, newName); }); @@ -68088,8 +68026,7 @@ var InternalTooltip = /* @__PURE__ */ React158.forwardRef((props, ref) => { motionName: getTransitionName2(rootPrefixCls, "zoom-big-fast", props.transitionName), motionDeadline: 1e3 }, - // TODO: In the future, destroyTooltipOnHide in rc-tooltip needs to be upgrade to destroyOnHidden - destroyTooltipOnHide: destroyOnHidden !== null && destroyOnHidden !== void 0 ? destroyOnHidden : !!destroyTooltipOnHide + destroyTooltipOnHide: !!destroyTooltipOnHide }), tempOpen ? cloneElement3(child, { className: childCls }) : child); @@ -68908,7 +68845,7 @@ var genAllowClearStyle = (token2) => { outline: "none", backgroundColor: "transparent", "&:hover": { - color: token2.colorIcon + color: token2.colorTextTertiary }, "&:active": { color: token2.colorText @@ -68979,8 +68916,7 @@ var genAffixStyle = (token2) => { } }, "&-show-count-suffix": { - color: colorTextDescription, - direction: "ltr" + color: colorTextDescription }, "&-show-count-has-suffix": { marginInlineEnd: token2.paddingXXS @@ -69569,7 +69505,7 @@ var InternalCheckbox = (props, ref) => { className: checkboxClass, disabled: mergedDisabled, ref: mergedRef - })), children !== void 0 && children !== null && /* @__PURE__ */ React163.createElement("span", { + })), children !== void 0 && /* @__PURE__ */ React163.createElement("span", { className: `${prefixCls}-label` }, children)))); }; @@ -69656,13 +69592,13 @@ var CheckboxGroup = /* @__PURE__ */ React164.forwardRef((props, ref) => { value: option.value, checked: value2.includes(option.value), onChange: option.onChange, - className: (0, import_classnames45.default)(`${groupPrefixCls}-item`, option.className), + className: `${groupPrefixCls}-item`, style: option.style, title: option.title, id: option.id, required: option.required }, option.label)) : children; - const memoizedContext = React164.useMemo(() => ({ + const context = { toggleOption, value: value2, disabled: restProps.disabled, @@ -69670,7 +69606,7 @@ var CheckboxGroup = /* @__PURE__ */ React164.forwardRef((props, ref) => { // https://github.com/ant-design/ant-design/issues/16376 registerValue, cancelValue - }), [toggleOption, value2, restProps.disabled, restProps.name, registerValue, cancelValue]); + }; const classString = (0, import_classnames45.default)(groupPrefixCls, { [`${groupPrefixCls}-rtl`]: direction === "rtl" }, className, rootClassName, cssVarCls, rootCls, hashId); @@ -69680,7 +69616,7 @@ var CheckboxGroup = /* @__PURE__ */ React164.forwardRef((props, ref) => { }, domProps, { ref }), /* @__PURE__ */ React164.createElement(GroupContext_default.Provider, { - value: memoizedContext + value: context }, childrenNode))); }); var Group_default = CheckboxGroup; @@ -71076,7 +71012,7 @@ var genInputNumberStyles = (token2) => { paddingBlockSM, paddingBlockLG, paddingInlineLG, - colorIcon, + colorTextDescription, motionDurationMid, handleHoverColor, handleOpacity, @@ -71272,7 +71208,7 @@ var genInputNumberStyles = (token2) => { [`${componentCls}-handler`]: { height: "50%", overflow: "hidden", - color: colorIcon, + color: colorTextDescription, fontWeight: "bold", lineHeight: 0, textAlign: "center", @@ -71293,7 +71229,7 @@ var genInputNumberStyles = (token2) => { } }, "&-up-inner, &-down-inner": Object.assign(Object.assign({}, resetIcon()), { - color: colorIcon, + color: colorTextDescription, transition: `all ${motionDurationMid} linear`, userSelect: "none" }) @@ -72908,8 +72844,7 @@ var import_react72 = __toESM(require_react()); var SliderTooltip = /* @__PURE__ */ React186.forwardRef((props, ref) => { const { open, - draggingDelete, - value: value2 + draggingDelete } = props; const innerRef = (0, import_react72.useRef)(null); const mergedOpen = open && !draggingDelete; @@ -72932,7 +72867,7 @@ var SliderTooltip = /* @__PURE__ */ React186.forwardRef((props, ref) => { cancelKeepAlign(); } return cancelKeepAlign; - }, [mergedOpen, props.title, value2]); + }, [mergedOpen, props.title]); return /* @__PURE__ */ React186.createElement(tooltip_default, Object.assign({ ref: composeRef(innerRef, ref) }, props, { @@ -73446,7 +73381,6 @@ var Slider4 = /* @__PURE__ */ import_react73.default.forwardRef((props, ref) => return /* @__PURE__ */ import_react73.default.createElement(SliderTooltip_default, Object.assign({}, tooltipProps, { prefixCls: getPrefixCls("tooltip", customizeTooltipPrefixCls !== null && customizeTooltipPrefixCls !== void 0 ? customizeTooltipPrefixCls : legacyTooltipPrefixCls), title: mergedTipFormatter ? mergedTipFormatter(info.value) : "", - value: info.value, open, placement: getTooltipPlacement(tooltipPlacement !== null && tooltipPlacement !== void 0 ? tooltipPlacement : legacyTooltipPlacement, vertical), key: index3, @@ -73899,7 +73833,7 @@ var Operations = function Operations2(props) { className: "".concat(prefixCls, "-footer") }, showProgress && /* @__PURE__ */ React192.createElement("div", { className: "".concat(prefixCls, "-progress") - }, countRender ? countRender(current + 1, count) : /* @__PURE__ */ React192.createElement("bdi", null, "".concat(current + 1, " / ").concat(count))), toolbarRender ? toolbarRender(toolbarNode, _objectSpread2(_objectSpread2({ + }, countRender ? countRender(current + 1, count) : "".concat(current + 1, " / ").concat(count)), toolbarRender ? toolbarRender(toolbarNode, _objectSpread2(_objectSpread2({ icons: { prevIcon: switchPrevNode, nextIcon: switchNextNode, @@ -75254,8 +75188,7 @@ var InternalPreviewGroup = (_a) => { preview } = _a, otherProps = __rest15(_a, ["previewPrefixCls", "preview"]); const { - getPrefixCls, - direction + getPrefixCls } = React203.useContext(ConfigContext); const prefixCls = getPrefixCls("image", customizePrefixCls); const previewPrefixCls = `${prefixCls}-preview`; @@ -75263,10 +75196,6 @@ var InternalPreviewGroup = (_a) => { const rootCls = useCSSVarCls_default(prefixCls); const [wrapCSSVar, hashId, cssVarCls] = style_default12(prefixCls, rootCls); const [zIndex] = useZIndex("ImagePreview", typeof preview === "object" ? preview.zIndex : void 0); - const memoizedIcons = React203.useMemo(() => Object.assign(Object.assign({}, icons), { - left: direction === "rtl" ? /* @__PURE__ */ React203.createElement(RightOutlined_default2, null) : /* @__PURE__ */ React203.createElement(LeftOutlined_default2, null), - right: direction === "rtl" ? /* @__PURE__ */ React203.createElement(LeftOutlined_default2, null) : /* @__PURE__ */ React203.createElement(RightOutlined_default2, null) - }), [direction]); const mergedPreview = React203.useMemo(() => { var _a2; if (preview === false) { @@ -75284,7 +75213,7 @@ var InternalPreviewGroup = (_a) => { return wrapCSSVar(/* @__PURE__ */ React203.createElement(es_default16.PreviewGroup, Object.assign({ preview: mergedPreview, previewPrefixCls, - icons: memoizedIcons + icons }, otherProps))); }; var PreviewGroup_default2 = InternalPreviewGroup; @@ -75306,10 +75235,6 @@ var Image2 = (props) => { rootClassName, style: style2 } = props, otherProps = __rest16(props, ["prefixCls", "preview", "className", "rootClassName", "style"]); - if (true) { - const warning6 = devUseWarning("Image"); - warning6.deprecated(!(preview && typeof preview === "object" && "destroyOnClose" in preview), "destroyOnClose", "destroyOnHidden"); - } const { getPrefixCls, getPopupContainer: getContextPopupContainer, @@ -75333,18 +75258,14 @@ var Image2 = (props) => { const { getContainer: getContainer2, closeIcon, - rootClassName: rootClassName2, - destroyOnClose, - destroyOnHidden - } = _preview, restPreviewProps = __rest16(_preview, ["getContainer", "closeIcon", "rootClassName", "destroyOnClose", "destroyOnHidden"]); + rootClassName: rootClassName2 + } = _preview, restPreviewProps = __rest16(_preview, ["getContainer", "closeIcon", "rootClassName"]); return Object.assign(Object.assign({ mask: /* @__PURE__ */ React204.createElement("div", { className: `${prefixCls}-mask-info` }, /* @__PURE__ */ React204.createElement(EyeOutlined_default2, null), imageLocale === null || imageLocale === void 0 ? void 0 : imageLocale.preview), icons }, restPreviewProps), { - // TODO: In the future, destroyOnClose in rc-image needs to be upgrade to destroyOnHidden - destroyOnClose: destroyOnHidden !== null && destroyOnHidden !== void 0 ? destroyOnHidden : destroyOnClose, rootClassName: (0, import_classnames65.default)(mergedRootClassName, rootClassName2), getContainer: getContainer2 !== null && getContainer2 !== void 0 ? getContainer2 : getContextPopupContainer, transitionName: getTransitionName2(rootPrefixCls, "zoom", _preview.transitionName), @@ -75384,7 +75305,7 @@ var Group3 = (props) => { const prefixCls = getPrefixCls("input-group", customizePrefixCls); const inputPrefixCls = getPrefixCls("input"); const [wrapCSSVar, hashId, cssVarCls] = style_default7(inputPrefixCls); - const cls6 = (0, import_classnames66.default)(prefixCls, cssVarCls, { + const cls5 = (0, import_classnames66.default)(prefixCls, cssVarCls, { [`${prefixCls}-lg`]: props.size === "large", [`${prefixCls}-sm`]: props.size === "small", [`${prefixCls}-compact`]: props.compact, @@ -75399,7 +75320,7 @@ var Group3 = (props) => { warning6.deprecated(false, "Input.Group", "Space.Compact"); } return wrapCSSVar(/* @__PURE__ */ React205.createElement("span", { - className: cls6, + className: cls5, style: props.style, onMouseEnter: props.onMouseEnter, onMouseLeave: props.onMouseLeave, @@ -75413,7 +75334,7 @@ var Group_default2 = Group3; // node_modules/antd/es/input/OTP/index.js var React207 = __toESM(require_react()); -var import_classnames68 = __toESM(require_classnames()); +var import_classnames67 = __toESM(require_classnames()); // node_modules/antd/es/input/style/otp.js var genOTPStyle = (token2) => { @@ -75427,28 +75348,6 @@ var genOTPStyle = (token2) => { alignItems: "center", flexWrap: "nowrap", columnGap: paddingXS, - [`${componentCls}-input-wrapper`]: { - position: "relative", - [`${componentCls}-mask-icon`]: { - position: "absolute", - zIndex: "1", - top: "50%", - right: "50%", - transform: "translate(50%, -50%)", - pointerEvents: "none" - }, - [`${componentCls}-mask-input`]: { - color: "transparent", - caretColor: "var(--ant-color-text)" - }, - [`${componentCls}-mask-input[type=number]::-webkit-inner-spin-button`]: { - "-webkit-appearance": "none", - margin: 0 - }, - [`${componentCls}-mask-input[type=number]`]: { - "-moz-appearance": "textfield" - } - }, "&-rtl": { direction: "rtl" }, @@ -75473,7 +75372,6 @@ var otp_default = genStyleHooks(["Input", "OTP"], (token2) => { // node_modules/antd/es/input/OTP/OTPInput.js var React206 = __toESM(require_react()); -var import_classnames67 = __toESM(require_classnames()); var __rest17 = function(s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; @@ -75484,23 +75382,18 @@ var __rest17 = function(s, e) { }; var OTPInput = /* @__PURE__ */ React206.forwardRef((props, ref) => { const { - className, value: value2, onChange, onActiveChange, index: index3, mask - } = props, restProps = __rest17(props, ["className", "value", "onChange", "onActiveChange", "index", "mask"]); - const { - getPrefixCls - } = React206.useContext(ConfigContext); - const prefixCls = getPrefixCls("otp"); - const maskValue = typeof mask === "string" ? mask : value2; - const inputRef = React206.useRef(null); - React206.useImperativeHandle(ref, () => inputRef.current); + } = props, restProps = __rest17(props, ["value", "onChange", "onActiveChange", "index", "mask"]); + const internalValue = value2 && typeof mask === "string" ? mask : value2; const onInternalChange = (e) => { onChange(index3, e.target.value); }; + const inputRef = React206.useRef(null); + React206.useImperativeHandle(ref, () => inputRef.current); const syncSelection = () => { raf_default(() => { var _a; @@ -75531,28 +75424,18 @@ var OTPInput = /* @__PURE__ */ React206.forwardRef((props, ref) => { } syncSelection(); }; - return /* @__PURE__ */ React206.createElement("span", { - className: `${prefixCls}-input-wrapper`, - role: "presentation" - }, mask && value2 !== "" && value2 !== void 0 && /* @__PURE__ */ React206.createElement("span", { - className: `${prefixCls}-mask-icon`, - "aria-hidden": "true" - }, maskValue), /* @__PURE__ */ React206.createElement(Input_default3, Object.assign({ - "aria-label": `OTP Input ${index3 + 1}`, + return /* @__PURE__ */ React206.createElement(Input_default3, Object.assign({ type: mask === true ? "password" : "text" }, restProps, { ref: inputRef, - value: value2, + value: internalValue, onInput: onInternalChange, onFocus: syncSelection, onKeyDown: onInternalKeyDown, onKeyUp: onInternalKeyUp, onMouseDown: syncSelection, - onMouseUp: syncSelection, - className: (0, import_classnames67.default)(className, { - [`${prefixCls}-mask-input`]: mask - }) - }))); + onMouseUp: syncSelection + })); }); var OTPInput_default = OTPInput; @@ -75706,12 +75589,11 @@ var OTP = /* @__PURE__ */ React207.forwardRef((props, ref) => { }; return wrapCSSVar(/* @__PURE__ */ React207.createElement("div", Object.assign({}, domAttrs, { ref: containerRef, - className: (0, import_classnames68.default)(prefixCls, { + className: (0, import_classnames67.default)(prefixCls, { [`${prefixCls}-sm`]: mergedSize === "small", [`${prefixCls}-lg`]: mergedSize === "large", [`${prefixCls}-rtl`]: direction === "rtl" - }, cssVarCls, hashId), - role: "group" + }, cssVarCls, hashId) }), /* @__PURE__ */ React207.createElement(FormItemInputContext.Provider, { value: proxyFormContext }, Array.from({ @@ -75767,7 +75649,7 @@ if (true) { var EyeInvisibleOutlined_default2 = RefIcon17; // node_modules/antd/es/input/Password.js -var import_classnames69 = __toESM(require_classnames()); +var import_classnames68 = __toESM(require_classnames()); var __rest19 = function(s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; @@ -75841,7 +75723,7 @@ var Password = /* @__PURE__ */ React209.forwardRef((props, ref) => { const inputPrefixCls = getPrefixCls("input", customizeInputPrefixCls); const prefixCls = getPrefixCls("input-password", customizePrefixCls); const suffixIcon = visibilityToggle && getIcon(prefixCls); - const inputClassName = (0, import_classnames69.default)(prefixCls, className, { + const inputClassName = (0, import_classnames68.default)(prefixCls, className, { [`${prefixCls}-${size}`]: !!size }); const omittedProps = Object.assign(Object.assign({}, omit(restProps, ["suffix", "iconRender", "visibilityToggle"])), { @@ -75864,7 +75746,7 @@ var Password_default = Password; // node_modules/antd/es/input/Search.js var React210 = __toESM(require_react()); -var import_classnames70 = __toESM(require_classnames()); +var import_classnames69 = __toESM(require_classnames()); var __rest20 = function(s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; @@ -75968,13 +75850,13 @@ var Search = /* @__PURE__ */ React210.forwardRef((props, ref) => { key: "addonAfter" })]; } - const cls6 = (0, import_classnames70.default)(prefixCls, { + const cls5 = (0, import_classnames69.default)(prefixCls, { [`${prefixCls}-rtl`]: direction === "rtl", [`${prefixCls}-${size}`]: !!size, [`${prefixCls}-with-button`]: !!enterButton }, className); const newProps = Object.assign(Object.assign({}, restProps), { - className: cls6, + className: cls5, prefixCls: inputPrefixCls, type: "search" }); @@ -76007,14 +75889,14 @@ var Search_default = Search; // node_modules/antd/es/input/TextArea.js var React213 = __toESM(require_react()); var import_react86 = __toESM(require_react()); -var import_classnames73 = __toESM(require_classnames()); +var import_classnames72 = __toESM(require_classnames()); // node_modules/rc-textarea/es/TextArea.js -var import_classnames72 = __toESM(require_classnames()); +var import_classnames71 = __toESM(require_classnames()); var import_react85 = __toESM(require_react()); // node_modules/rc-textarea/es/ResizableTextArea.js -var import_classnames71 = __toESM(require_classnames()); +var import_classnames70 = __toESM(require_classnames()); var React211 = __toESM(require_react()); // node_modules/rc-textarea/es/calculateNodeHeight.js @@ -76201,7 +76083,7 @@ var ResizableTextArea = /* @__PURE__ */ React211.forwardRef(function(props, ref) }, /* @__PURE__ */ React211.createElement("textarea", _extends({}, restProps, { ref: textareaRef, style: mergedStyle, - className: (0, import_classnames71.default)(prefixCls, className, _defineProperty({}, "".concat(prefixCls, "-disabled"), disabled)), + className: (0, import_classnames70.default)(prefixCls, className, _defineProperty({}, "".concat(prefixCls, "-disabled"), disabled)), disabled, value: mergedValue, onChange: onInternalChange @@ -76316,7 +76198,7 @@ var TextArea = /* @__PURE__ */ import_react85.default.forwardRef(function(_ref, dataCount = "".concat(valueLength).concat(hasMaxLength ? " / ".concat(mergedMax) : ""); } suffixNode = /* @__PURE__ */ import_react85.default.createElement(import_react85.default.Fragment, null, suffixNode, /* @__PURE__ */ import_react85.default.createElement("span", { - className: (0, import_classnames72.default)("".concat(prefixCls, "-data-count"), classNames71 === null || classNames71 === void 0 ? void 0 : classNames71.count), + className: (0, import_classnames71.default)("".concat(prefixCls, "-data-count"), classNames71 === null || classNames71 === void 0 ? void 0 : classNames71.count), style: styles === null || styles === void 0 ? void 0 : styles.count }, dataCount)); } @@ -76336,11 +76218,11 @@ var TextArea = /* @__PURE__ */ import_react85.default.forwardRef(function(_ref, suffix: suffixNode, prefixCls, classNames: _objectSpread2(_objectSpread2({}, classNames71), {}, { - affixWrapper: (0, import_classnames72.default)(classNames71 === null || classNames71 === void 0 ? void 0 : classNames71.affixWrapper, _defineProperty(_defineProperty({}, "".concat(prefixCls, "-show-count"), showCount), "".concat(prefixCls, "-textarea-allow-clear"), allowClear)) + affixWrapper: (0, import_classnames71.default)(classNames71 === null || classNames71 === void 0 ? void 0 : classNames71.affixWrapper, _defineProperty(_defineProperty({}, "".concat(prefixCls, "-show-count"), showCount), "".concat(prefixCls, "-textarea-allow-clear"), allowClear)) }), disabled, focused, - className: (0, import_classnames72.default)(className, isOutOfRange && "".concat(prefixCls, "-out-of-range")), + className: (0, import_classnames71.default)(className, isOutOfRange && "".concat(prefixCls, "-out-of-range")), style: _objectSpread2(_objectSpread2({}, style2), textareaResized && !isPureTextArea ? { height: "auto" } : {}), @@ -76361,7 +76243,7 @@ var TextArea = /* @__PURE__ */ import_react85.default.forwardRef(function(_ref, onBlur: handleBlur, onCompositionStart: onInternalCompositionStart, onCompositionEnd: onInternalCompositionEnd, - className: (0, import_classnames72.default)(classNames71 === null || classNames71 === void 0 ? void 0 : classNames71.textarea), + className: (0, import_classnames71.default)(classNames71 === null || classNames71 === void 0 ? void 0 : classNames71.textarea), style: _objectSpread2(_objectSpread2({}, styles === null || styles === void 0 ? void 0 : styles.textarea), {}, { resize: style2 === null || style2 === void 0 ? void 0 : style2.resize }), @@ -76406,6 +76288,10 @@ var genTextAreaStyle = (token2) => { [textareaPrefixCls]: { position: "relative", "&-show-count": { + // https://github.com/ant-design/ant-design/issues/33049 + [`> ${componentCls}`]: { + height: "100%" + }, [`${componentCls}-data-count`]: { position: "absolute", bottom: token2.calc(token2.fontSize).mul(token2.lineHeight).mul(-1).equal(), @@ -76458,14 +76344,6 @@ var genTextAreaStyle = (token2) => { } } }, - [`&-affix-wrapper${componentCls}-affix-wrapper-rtl`]: { - [`${componentCls}-suffix`]: { - [`${componentCls}-data-count`]: { - direction: "ltr", - insetInlineStart: 0 - } - } - }, [`&-affix-wrapper${componentCls}-affix-wrapper-sm`]: { [`${componentCls}-suffix`]: { [`${componentCls}-clear-icon`]: { @@ -76592,7 +76470,7 @@ var TextArea2 = /* @__PURE__ */ (0, import_react86.forwardRef)((props, ref) => { styles: Object.assign(Object.assign({}, contextStyles), styles), disabled: mergedDisabled, allowClear: mergedAllowClear, - className: (0, import_classnames73.default)( + className: (0, import_classnames72.default)( cssVarCls, rootCls, className, @@ -76603,14 +76481,14 @@ var TextArea2 = /* @__PURE__ */ (0, import_react86.forwardRef)((props, ref) => { resizeDirty && `${prefixCls}-textarea-affix-wrapper-resize-dirty` ), classNames: Object.assign(Object.assign(Object.assign({}, classes), contextClassNames), { - textarea: (0, import_classnames73.default)({ + textarea: (0, import_classnames72.default)({ [`${prefixCls}-sm`]: mergedSize === "small", [`${prefixCls}-lg`]: mergedSize === "large" }, hashId, classes === null || classes === void 0 ? void 0 : classes.textarea, contextClassNames.textarea, isMouseDown && `${prefixCls}-mouse-active`), - variant: (0, import_classnames73.default)({ + variant: (0, import_classnames72.default)({ [`${prefixCls}-${variant}`]: enableVariantCls }, getStatusClassNames(prefixCls, mergedStatus)), - affixWrapper: (0, import_classnames73.default)(`${prefixCls}-textarea-affix-wrapper`, { + affixWrapper: (0, import_classnames72.default)(`${prefixCls}-textarea-affix-wrapper`, { [`${prefixCls}-affix-wrapper-rtl`]: direction === "rtl", [`${prefixCls}-affix-wrapper-sm`]: mergedSize === "small", [`${prefixCls}-affix-wrapper-lg`]: mergedSize === "large", @@ -76640,15 +76518,15 @@ var input_default = Input5; // node_modules/antd/es/progress/progress.js var React221 = __toESM(require_react()); -var import_classnames79 = __toESM(require_classnames()); +var import_classnames78 = __toESM(require_classnames()); // node_modules/antd/es/progress/Circle.js var React218 = __toESM(require_react()); -var import_classnames76 = __toESM(require_classnames()); +var import_classnames75 = __toESM(require_classnames()); // node_modules/rc-progress/es/Line.js var React214 = __toESM(require_react()); -var import_classnames74 = __toESM(require_classnames()); +var import_classnames73 = __toESM(require_classnames()); // node_modules/rc-progress/es/common.js var import_react87 = __toESM(require_react()); @@ -76700,7 +76578,7 @@ var Line = function Line2(props) { var viewBoxString = "0 0 100 ".concat(strokeWidth); var stackPtg = 0; return /* @__PURE__ */ React214.createElement("svg", _extends({ - className: (0, import_classnames74.default)("".concat(prefixCls, "-line"), className), + className: (0, import_classnames73.default)("".concat(prefixCls, "-line"), className), viewBox: viewBoxString, preserveAspectRatio: "none", style: style2 @@ -76752,7 +76630,7 @@ if (true) { // node_modules/rc-progress/es/Circle/index.js var React217 = __toESM(require_react()); -var import_classnames75 = __toESM(require_classnames()); +var import_classnames74 = __toESM(require_classnames()); // node_modules/rc-progress/es/hooks/useId.js var React215 = __toESM(require_react()); @@ -76948,7 +76826,7 @@ var Circle = function Circle2(props) { }); }; return /* @__PURE__ */ React217.createElement("svg", _extends({ - className: (0, import_classnames75.default)("".concat(prefixCls, "-circle"), className), + className: (0, import_classnames74.default)("".concat(prefixCls, "-circle"), className), viewBox: "0 0 ".concat(VIEW_BOX_SIZE, " ").concat(VIEW_BOX_SIZE), style: style2, id, @@ -77098,7 +76976,7 @@ var Circle3 = (props) => { success, strokeColor: props.strokeColor }); - const wrapperClassName = (0, import_classnames76.default)(`${prefixCls}-inner`, { + const wrapperClassName = (0, import_classnames75.default)(`${prefixCls}-inner`, { [`${prefixCls}-circle-gradient`]: isGradient }); const circleContent = /* @__PURE__ */ React218.createElement(Circle_default, { @@ -77129,7 +77007,7 @@ var Circle_default2 = Circle3; // node_modules/antd/es/progress/Line.js var React219 = __toESM(require_react()); -var import_classnames77 = __toESM(require_classnames()); +var import_classnames76 = __toESM(require_classnames()); // node_modules/antd/es/progress/style/index.js var LineStrokeColorVar = "--progress-line-stroke-color"; @@ -77535,7 +77413,7 @@ var Line3 = (props) => { className: `${prefixCls}-inner`, style: trailStyle }, /* @__PURE__ */ React219.createElement("div", { - className: (0, import_classnames77.default)(`${prefixCls}-bg`, `${prefixCls}-bg-${infoPosition}`), + className: (0, import_classnames76.default)(`${prefixCls}-bg`, `${prefixCls}-bg-${infoPosition}`), style: percentStyle }, infoPosition === "inner" && children), successPercent !== void 0 && /* @__PURE__ */ React219.createElement("div", { className: `${prefixCls}-success-bg`, @@ -77554,7 +77432,7 @@ var Line_default2 = Line3; // node_modules/antd/es/progress/Steps.js var React220 = __toESM(require_react()); -var import_classnames78 = __toESM(require_classnames()); +var import_classnames77 = __toESM(require_classnames()); var Steps3 = (props) => { const { size, @@ -77582,7 +77460,7 @@ var Steps3 = (props) => { const color = Array.isArray(strokeColor) ? strokeColor[i] : strokeColor; styledSteps[i] = /* @__PURE__ */ React220.createElement("div", { key: i, - className: (0, import_classnames78.default)(`${prefixCls}-steps-item`, { + className: (0, import_classnames77.default)(`${prefixCls}-steps-item`, { [`${prefixCls}-steps-item-active`]: i <= current - 1 }), style: { @@ -77673,7 +77551,7 @@ var Progress = /* @__PURE__ */ React221.forwardRef((props, ref) => { text = isLineType ? /* @__PURE__ */ React221.createElement(CheckCircleFilled_default2, null) : /* @__PURE__ */ React221.createElement(CheckOutlined_default2, null); } return /* @__PURE__ */ React221.createElement("span", { - className: (0, import_classnames79.default)(`${prefixCls}-text`, { + className: (0, import_classnames78.default)(`${prefixCls}-text`, { [`${prefixCls}-text-bright`]: isBrightInnerColor, [`${prefixCls}-text-${infoAlign}`]: isPureLineType, [`${prefixCls}-text-${infoPosition}`]: isPureLineType @@ -77718,7 +77596,7 @@ var Progress = /* @__PURE__ */ React221.forwardRef((props, ref) => { progressStatus }), progressInfo); } - const classString = (0, import_classnames79.default)(prefixCls, `${prefixCls}-status-${progressStatus}`, { + const classString = (0, import_classnames78.default)(prefixCls, `${prefixCls}-status-${progressStatus}`, { [`${prefixCls}-${type5 === "dashboard" && "circle" || type5}`]: type5 !== "line", [`${prefixCls}-inline-circle`]: type5 === "circle" && getSize(size, "circle")[0] <= 20, [`${prefixCls}-line`]: isPureLineType, @@ -77877,13 +77755,13 @@ var React233 = __toESM(require_react()); // node_modules/antd/es/upload/Upload.js var React232 = __toESM(require_react()); var import_react_dom7 = __toESM(require_react_dom()); -var import_classnames83 = __toESM(require_classnames()); +var import_classnames82 = __toESM(require_classnames()); // node_modules/rc-upload/es/Upload.js var import_react89 = __toESM(require_react()); // node_modules/rc-upload/es/AjaxUploader.js -var import_classnames80 = __toESM(require_classnames()); +var import_classnames79 = __toESM(require_classnames()); var import_react88 = __toESM(require_react()); // node_modules/rc-upload/es/attr-accept.js @@ -78227,53 +78105,42 @@ var AjaxUploader = /* @__PURE__ */ function(_Component) { _this.onClick(e); } }); - _defineProperty(_assertThisInitialized(_this), "onFileDropOrPaste", /* @__PURE__ */ function() { + _defineProperty(_assertThisInitialized(_this), "onFileDrop", /* @__PURE__ */ function() { var _ref = _asyncToGenerator(/* @__PURE__ */ _regeneratorRuntime().mark(function _callee(e) { - var _this$props2, multiple, accept, directory, items, files, dataTransfer, clipboardData, acceptFiles; + var multiple, files, _files; return _regeneratorRuntime().wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: + multiple = _this.props.multiple; e.preventDefault(); if (!(e.type === "dragover")) { - _context.next = 3; + _context.next = 4; break; } return _context.abrupt("return"); - case 3: - _this$props2 = _this.props, multiple = _this$props2.multiple, accept = _this$props2.accept, directory = _this$props2.directory; - items = []; - files = []; - if (e.type === "drop") { - dataTransfer = e.dataTransfer; - items = _toConsumableArray(dataTransfer.items || []); - files = _toConsumableArray(dataTransfer.files || []); - } else if (e.type === "paste") { - clipboardData = e.clipboardData; - items = _toConsumableArray(clipboardData.items || []); - files = _toConsumableArray(clipboardData.files || []); - } - if (!directory) { - _context.next = 14; + case 4: + if (!_this.props.directory) { + _context.next = 11; break; } - _context.next = 10; - return traverseFileTree_default(Array.prototype.slice.call(items), function(_file) { + _context.next = 7; + return traverseFileTree_default(Array.prototype.slice.call(e.dataTransfer.items), function(_file) { return attr_accept_default(_file, _this.props.accept); }); - case 10: + case 7: files = _context.sent; _this.uploadFiles(files); - _context.next = 17; + _context.next = 14; break; - case 14: - acceptFiles = _toConsumableArray(files).filter(function(file) { - return attr_accept_default(file, accept); + case 11: + _files = _toConsumableArray(e.dataTransfer.files).filter(function(file) { + return attr_accept_default(file, _this.props.accept); }); if (multiple === false) { - acceptFiles = files.slice(0, 1); + _files = _files.slice(0, 1); } - _this.uploadFiles(acceptFiles); - case 17: + _this.uploadFiles(_files); + case 14: case "end": return _context.stop(); } @@ -78283,12 +78150,6 @@ var AjaxUploader = /* @__PURE__ */ function(_Component) { return _ref.apply(this, arguments); }; }()); - _defineProperty(_assertThisInitialized(_this), "onPrePaste", function(e) { - var pastable = _this.props.pastable; - if (pastable) { - _this.onFileDropOrPaste(e); - } - }); _defineProperty(_assertThisInitialized(_this), "uploadFiles", function(files) { var originFiles = _toConsumableArray(files); var postFiles = originFiles.map(function(file) { @@ -78411,27 +78272,12 @@ var AjaxUploader = /* @__PURE__ */ function(_Component) { key: "componentDidMount", value: function componentDidMount() { this._isMounted = true; - var pastable = this.props.pastable; - if (pastable) { - document.addEventListener("paste", this.onPrePaste); - } } }, { key: "componentWillUnmount", value: function componentWillUnmount() { this._isMounted = false; this.abort(); - document.removeEventListener("paste", this.onPrePaste); - } - }, { - key: "componentDidUpdate", - value: function componentDidUpdate(prevProps) { - var pastable = this.props.pastable; - if (pastable && !prevProps.pastable) { - document.addEventListener("paste", this.onPrePaste); - } else if (!pastable && prevProps.pastable) { - document.removeEventListener("paste", this.onPrePaste); - } } }, { key: "post", @@ -78441,7 +78287,7 @@ var AjaxUploader = /* @__PURE__ */ function(_Component) { if (!this._isMounted) { return; } - var _this$props3 = this.props, onStart = _this$props3.onStart, customRequest = _this$props3.customRequest, name = _this$props3.name, headers = _this$props3.headers, withCredentials = _this$props3.withCredentials, method4 = _this$props3.method; + var _this$props2 = this.props, onStart = _this$props2.onStart, customRequest = _this$props2.customRequest, name = _this$props2.name, headers = _this$props2.headers, withCredentials = _this$props2.withCredentials, method4 = _this$props2.method; var uid3 = origin.uid; var request = customRequest || upload; var requestOption = { @@ -78499,8 +78345,8 @@ var AjaxUploader = /* @__PURE__ */ function(_Component) { }, { key: "render", value: function render4() { - var _this$props4 = this.props, Tag = _this$props4.component, prefixCls = _this$props4.prefixCls, className = _this$props4.className, _this$props4$classNam = _this$props4.classNames, classNames71 = _this$props4$classNam === void 0 ? {} : _this$props4$classNam, disabled = _this$props4.disabled, id = _this$props4.id, name = _this$props4.name, style2 = _this$props4.style, _this$props4$styles = _this$props4.styles, styles = _this$props4$styles === void 0 ? {} : _this$props4$styles, multiple = _this$props4.multiple, accept = _this$props4.accept, capture = _this$props4.capture, children = _this$props4.children, directory = _this$props4.directory, openFileDialogOnClick = _this$props4.openFileDialogOnClick, onMouseEnter = _this$props4.onMouseEnter, onMouseLeave = _this$props4.onMouseLeave, hasControlInside = _this$props4.hasControlInside, otherProps = _objectWithoutProperties(_this$props4, _excluded39); - var cls6 = (0, import_classnames80.default)(_defineProperty(_defineProperty(_defineProperty({}, prefixCls, true), "".concat(prefixCls, "-disabled"), disabled), className, className)); + var _this$props3 = this.props, Tag = _this$props3.component, prefixCls = _this$props3.prefixCls, className = _this$props3.className, _this$props3$classNam = _this$props3.classNames, classNames71 = _this$props3$classNam === void 0 ? {} : _this$props3$classNam, disabled = _this$props3.disabled, id = _this$props3.id, name = _this$props3.name, style2 = _this$props3.style, _this$props3$styles = _this$props3.styles, styles = _this$props3$styles === void 0 ? {} : _this$props3$styles, multiple = _this$props3.multiple, accept = _this$props3.accept, capture = _this$props3.capture, children = _this$props3.children, directory = _this$props3.directory, openFileDialogOnClick = _this$props3.openFileDialogOnClick, onMouseEnter = _this$props3.onMouseEnter, onMouseLeave = _this$props3.onMouseLeave, hasControlInside = _this$props3.hasControlInside, otherProps = _objectWithoutProperties(_this$props3, _excluded39); + var cls5 = (0, import_classnames79.default)(_defineProperty(_defineProperty(_defineProperty({}, prefixCls, true), "".concat(prefixCls, "-disabled"), disabled), className, className)); var dirProps = directory ? { directory: "directory", webkitdirectory: "webkitdirectory" @@ -78512,12 +78358,12 @@ var AjaxUploader = /* @__PURE__ */ function(_Component) { }, onMouseEnter, onMouseLeave, - onDrop: this.onFileDropOrPaste, - onDragOver: this.onFileDropOrPaste, + onDrop: this.onFileDrop, + onDragOver: this.onFileDrop, tabIndex: hasControlInside ? void 0 : "0" }; return /* @__PURE__ */ import_react88.default.createElement(Tag, _extends({}, events, { - className: cls6, + className: cls5, role: hasControlInside ? void 0 : "button", style: style2 }), /* @__PURE__ */ import_react88.default.createElement("input", _extends({}, pickAttrs(otherProps, { @@ -78729,7 +78575,7 @@ var genListStyle = (token2) => { } }, [`${componentCls}-icon ${iconCls}`]: { - color: token2.colorIcon, + color: token2.colorTextDescription, fontSize }, [`${itemCls}-progress`]: { @@ -79093,7 +78939,7 @@ var genBaseStyle4 = (token2) => { }; }; var prepareComponentToken10 = (token2) => ({ - actionsColor: token2.colorIcon + actionsColor: token2.colorTextDescription }); var style_default14 = genStyleHooks("Upload", (token2) => { const { @@ -79113,7 +78959,7 @@ var style_default14 = genStyleHooks("Upload", (token2) => { // node_modules/antd/es/upload/UploadList/index.js var React231 = __toESM(require_react()); -var import_classnames82 = __toESM(require_classnames()); +var import_classnames81 = __toESM(require_classnames()); // node_modules/antd/es/upload/utils.js function file2Obj(file) { @@ -79241,7 +79087,7 @@ function previewImage(file) { // node_modules/antd/es/upload/UploadList/ListItem.js var React230 = __toESM(require_react()); -var import_classnames81 = __toESM(require_classnames()); +var import_classnames80 = __toESM(require_classnames()); var ListItem = /* @__PURE__ */ React230.forwardRef((_ref, ref) => { let { prefixCls, @@ -79292,7 +79138,7 @@ var ListItem = /* @__PURE__ */ React230.forwardRef((_ref, ref) => { }, iconNode); if (listType === "picture" || listType === "picture-card" || listType === "picture-circle") { if (mergedStatus === "uploading" || !file.thumbUrl && !file.url) { - const uploadingClassName = (0, import_classnames81.default)(`${prefixCls}-list-item-thumbnail`, { + const uploadingClassName = (0, import_classnames80.default)(`${prefixCls}-list-item-thumbnail`, { [`${prefixCls}-list-item-file`]: mergedStatus !== "uploading" }); icon = /* @__PURE__ */ React230.createElement("div", { @@ -79305,7 +79151,7 @@ var ListItem = /* @__PURE__ */ React230.forwardRef((_ref, ref) => { className: `${prefixCls}-list-item-image`, crossOrigin: file.crossOrigin }) : iconNode; - const aClassName = (0, import_classnames81.default)(`${prefixCls}-list-item-thumbnail`, { + const aClassName = (0, import_classnames80.default)(`${prefixCls}-list-item-thumbnail`, { [`${prefixCls}-list-item-file`]: isImgUrl && !isImgUrl(file) }); icon = /* @__PURE__ */ React230.createElement("a", { @@ -79317,7 +79163,7 @@ var ListItem = /* @__PURE__ */ React230.forwardRef((_ref, ref) => { }, thumbnail); } } - const listItemClassName = (0, import_classnames81.default)(`${prefixCls}-list-item`, `${prefixCls}-list-item-${mergedStatus}`); + const listItemClassName = (0, import_classnames80.default)(`${prefixCls}-list-item`, `${prefixCls}-list-item-${mergedStatus}`); const linkProps = typeof file.linkProps === "string" ? JSON.parse(file.linkProps) : file.linkProps; const removeIcon = (typeof showRemoveIcon === "function" ? showRemoveIcon(file) : showRemoveIcon) ? actionIconRender( (typeof customRemoveIcon === "function" ? customRemoveIcon(file) : customRemoveIcon) || /* @__PURE__ */ React230.createElement(DeleteOutlined_default2, null), @@ -79331,7 +79177,7 @@ var ListItem = /* @__PURE__ */ React230.forwardRef((_ref, ref) => { const downloadIcon = (typeof showDownloadIcon === "function" ? showDownloadIcon(file) : showDownloadIcon) && mergedStatus === "done" ? actionIconRender((typeof customDownloadIcon === "function" ? customDownloadIcon(file) : customDownloadIcon) || /* @__PURE__ */ React230.createElement(DownloadOutlined_default2, null), () => onDownload(file), prefixCls, locale6.downloadFile) : null; const downloadOrDelete = listType !== "picture-card" && listType !== "picture-circle" && /* @__PURE__ */ React230.createElement("span", { key: "download-delete", - className: (0, import_classnames81.default)(`${prefixCls}-list-item-actions`, { + className: (0, import_classnames80.default)(`${prefixCls}-list-item-actions`, { picture: listType === "picture" }) }, downloadIcon, removeIcon); @@ -79339,7 +79185,7 @@ var ListItem = /* @__PURE__ */ React230.forwardRef((_ref, ref) => { const extra = extraContent && /* @__PURE__ */ React230.createElement("span", { className: `${prefixCls}-list-item-extra` }, extraContent); - const listItemNameClass = (0, import_classnames81.default)(`${prefixCls}-list-item-name`); + const listItemNameClass = (0, import_classnames80.default)(`${prefixCls}-list-item-name`); const fileName = file.url ? /* @__PURE__ */ React230.createElement("a", Object.assign({ key: "view", target: "_blank", @@ -79386,7 +79232,7 @@ var ListItem = /* @__PURE__ */ React230.forwardRef((_ref, ref) => { "aria-labelledby": file["aria-labelledby"] })) : null; return /* @__PURE__ */ React230.createElement("div", { - className: (0, import_classnames81.default)(`${prefixCls}-list-item-progress`, motionClassName) + className: (0, import_classnames80.default)(`${prefixCls}-list-item-progress`, motionClassName) }, loadingProgress); })); const message = file.response && typeof file.response === "string" ? file.response : ((_a = file.error) === null || _a === void 0 ? void 0 : _a.statusText) || ((_b = file.error) === null || _b === void 0 ? void 0 : _b.message) || locale6.uploadError; @@ -79395,7 +79241,7 @@ var ListItem = /* @__PURE__ */ React230.forwardRef((_ref, ref) => { getPopupContainer: (node2) => node2.parentNode }, dom) : dom; return /* @__PURE__ */ React230.createElement("div", { - className: (0, import_classnames81.default)(`${prefixCls}-list-item-container`, className), + className: (0, import_classnames80.default)(`${prefixCls}-list-item-container`, className), style: style2, ref }, itemRender ? itemRender(item, file, items, { @@ -79497,9 +79343,11 @@ var InternalUploadList = (props, ref) => { (_b = (_a = customIcon.props).onClick) === null || _b === void 0 ? void 0 : _b.call(_a, e); } }, - className: `${prefixCls2}-list-item-action`, - disabled: acceptUploadDisabled ? disabled : false + className: `${prefixCls2}-list-item-action` }; + if (acceptUploadDisabled) { + btnProps.disabled = disabled; + } return /* @__PURE__ */ React231.isValidElement(customIcon) ? /* @__PURE__ */ React231.createElement(button_default2, Object.assign({}, btnProps, { icon: cloneElement3(customIcon, Object.assign(Object.assign({}, customIcon.props), { onClick: () => { @@ -79516,7 +79364,7 @@ var InternalUploadList = (props, ref) => { } = React231.useContext(ConfigContext); const prefixCls = getPrefixCls("upload", customizePrefixCls); const rootPrefixCls = getPrefixCls(); - const listClassNames = (0, import_classnames82.default)(`${prefixCls}-list`, `${prefixCls}-list-${listType}`); + const listClassNames = (0, import_classnames81.default)(`${prefixCls}-list`, `${prefixCls}-list-${listType}`); const listItemMotion = React231.useMemo(() => omit(motion_default(rootPrefixCls), ["onAppearEnd", "onEnterEnd", "onLeaveEnd"]), [rootPrefixCls]); const motionConfig = Object.assign(Object.assign({}, isPictureCardOrCirle ? {} : listItemMotion), { motionDeadline: 2e3, @@ -79572,7 +79420,7 @@ var InternalUploadList = (props, ref) => { style: motionStyle } = _ref2; return cloneElement3(appendAction, (oriProps) => ({ - className: (0, import_classnames82.default)(oriProps.className, motionClassName), + className: (0, import_classnames81.default)(oriProps.className, motionClassName), style: Object.assign(Object.assign(Object.assign({}, motionStyle), { // prevent the element has hover css pseudo-class that may cause animation to end prematurely. pointerEvents: motionClassName ? "none" : void 0 @@ -79907,14 +79755,14 @@ var InternalUpload = (props, ref) => { disabled: mergedDisabled }); }; - const mergedCls = (0, import_classnames83.default)(wrapperCls, className, rootClassName, hashId, cssVarCls, ctxUpload === null || ctxUpload === void 0 ? void 0 : ctxUpload.className, { + const mergedCls = (0, import_classnames82.default)(wrapperCls, className, rootClassName, hashId, cssVarCls, ctxUpload === null || ctxUpload === void 0 ? void 0 : ctxUpload.className, { [`${prefixCls}-rtl`]: direction === "rtl", [`${prefixCls}-picture-card-wrapper`]: listType === "picture-card", [`${prefixCls}-picture-circle-wrapper`]: listType === "picture-circle" }); const mergedStyle = Object.assign(Object.assign({}, ctxUpload === null || ctxUpload === void 0 ? void 0 : ctxUpload.style), style2); if (type5 === "drag") { - const dragCls = (0, import_classnames83.default)(hashId, prefixCls, `${prefixCls}-drag`, { + const dragCls = (0, import_classnames82.default)(hashId, prefixCls, `${prefixCls}-drag`, { [`${prefixCls}-drag-uploading`]: mergedFileList.some((file) => file.status === "uploading"), [`${prefixCls}-drag-hover`]: dragState === "dragover", [`${prefixCls}-disabled`]: mergedDisabled, @@ -79936,7 +79784,7 @@ var InternalUpload = (props, ref) => { className: `${prefixCls}-drag-container` }, children))), renderUploadList())); } - const uploadBtnCls = (0, import_classnames83.default)(prefixCls, `${prefixCls}-select`, { + const uploadBtnCls = (0, import_classnames82.default)(prefixCls, `${prefixCls}-select`, { [`${prefixCls}-disabled`]: mergedDisabled, [`${prefixCls}-hidden`]: !children }); @@ -81112,6 +80960,6 @@ fast-json-patch/module/duplex.mjs: *) @babel/runtime/helpers/esm/regeneratorRuntime.js: - (*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE *) + (*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE *) */ -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzL21vY2hhL25vZGVfbW9kdWxlcy9yb2xsdXAtcGx1Z2luLW5vZGUtZ2xvYmFscy9zcmMvZ2xvYmFsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9ub2RlX21vZHVsZXMvcHJvY2Vzcy1lczYvYnJvd3Nlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbm9kZV9tb2R1bGVzL2Jyb3dzZXItc3Rkb3V0L2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9saWIvYnJvd3Nlci9wYXJzZS1xdWVyeS5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbGliL2Jyb3dzZXIvaGlnaGxpZ2h0LXRhZ3MuanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL25vZGVfbW9kdWxlcy9lc2NhcGUtc3RyaW5nLXJlZ2V4cC9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbm9kZV9tb2R1bGVzL2RpZmYvbGliL2RpZmYvYmFzZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbm9kZV9tb2R1bGVzL2RpZmYvbGliL2RpZmYvY2hhcmFjdGVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9ub2RlX21vZHVsZXMvZGlmZi9saWIvdXRpbC9wYXJhbXMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL25vZGVfbW9kdWxlcy9kaWZmL2xpYi9kaWZmL3dvcmQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL25vZGVfbW9kdWxlcy9kaWZmL2xpYi9kaWZmL2xpbmUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL25vZGVfbW9kdWxlcy9kaWZmL2xpYi9kaWZmL3NlbnRlbmNlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9ub2RlX21vZHVsZXMvZGlmZi9saWIvZGlmZi9jc3MuanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL25vZGVfbW9kdWxlcy9kaWZmL2xpYi9kaWZmL2pzb24uanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL25vZGVfbW9kdWxlcy9kaWZmL2xpYi9kaWZmL2FycmF5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9ub2RlX21vZHVsZXMvZGlmZi9saWIvcGF0Y2gvcGFyc2UuanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL25vZGVfbW9kdWxlcy9kaWZmL2xpYi91dGlsL2Rpc3RhbmNlLWl0ZXJhdG9yLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9ub2RlX21vZHVsZXMvZGlmZi9saWIvcGF0Y2gvYXBwbHkuanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL25vZGVfbW9kdWxlcy9kaWZmL2xpYi9wYXRjaC9jcmVhdGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL25vZGVfbW9kdWxlcy9kaWZmL2xpYi91dGlsL2FycmF5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9ub2RlX21vZHVsZXMvZGlmZi9saWIvcGF0Y2gvbWVyZ2UuanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL25vZGVfbW9kdWxlcy9kaWZmL2xpYi9wYXRjaC9yZXZlcnNlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9ub2RlX21vZHVsZXMvZGlmZi9saWIvY29udmVydC9kbXAuanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL25vZGVfbW9kdWxlcy9kaWZmL2xpYi9jb252ZXJ0L3htbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbm9kZV9tb2R1bGVzL2RpZmYvbGliL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9ub2RlX21vZHVsZXMvbXMvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL25vZGVfbW9kdWxlcy9idWZmZXItZXM2L2Jhc2U2NC5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbm9kZV9tb2R1bGVzL2J1ZmZlci1lczYvaWVlZTc1NC5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbm9kZV9tb2R1bGVzL2J1ZmZlci1lczYvaXNBcnJheS5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbm9kZV9tb2R1bGVzL2J1ZmZlci1lczYvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL25vZGVfbW9kdWxlcy9yb2xsdXAtcGx1Z2luLW5vZGUtZ2xvYmFscy9zcmMvYnJvd3Nlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbm9kZV9tb2R1bGVzL2hlL2hlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9saWIvdXRpbHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL25vZGVfbW9kdWxlcy9sb2ctc3ltYm9scy9icm93c2VyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9saWIvcGVuZGluZy5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbm9kZV9tb2R1bGVzL2RlYnVnL25vZGVfbW9kdWxlcy9tcy9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9jb21tb24uanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvYnJvd3Nlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbGliL2Vycm9ycy5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbGliL3J1bm5hYmxlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9saWIvaG9vay5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbGliL3N1aXRlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9saWIvcnVubmVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9saWIvcmVwb3J0ZXJzL2Jhc2UuanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL2xpYi9yZXBvcnRlcnMvZG90LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9saWIvcmVwb3J0ZXJzL2RvYy5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbGliL3JlcG9ydGVycy90YXAuanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL2xpYi9yZXBvcnRlcnMvanNvbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbGliL3JlcG9ydGVycy9odG1sLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9saWIvcmVwb3J0ZXJzL2xpc3QuanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL2xpYi9yZXBvcnRlcnMvbWluLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9saWIvcmVwb3J0ZXJzL3NwZWMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL2xpYi9yZXBvcnRlcnMvbnlhbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbGliL3JlcG9ydGVycy94dW5pdC5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbGliL3JlcG9ydGVycy9tYXJrZG93bi5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbGliL3JlcG9ydGVycy9wcm9ncmVzcy5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbGliL3JlcG9ydGVycy9sYW5kaW5nLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9saWIvcmVwb3J0ZXJzL2pzb24tc3RyZWFtLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9saWIvcmVwb3J0ZXJzL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9saWIvc3RhdHMtY29sbGVjdG9yLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9saWIvdGVzdC5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbGliL2ludGVyZmFjZXMvY29tbW9uLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9saWIvaW50ZXJmYWNlcy9iZGQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL2xpYi9pbnRlcmZhY2VzL3RkZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbGliL2ludGVyZmFjZXMvcXVuaXQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL2xpYi9pbnRlcmZhY2VzL2V4cG9ydHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL2xpYi9pbnRlcmZhY2VzL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9saWIvY29udGV4dC5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbGliL21vY2hhLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9icm93c2VyLWVudHJ5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yZWFjdC9janMvcmVhY3QuZGV2ZWxvcG1lbnQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JlYWN0L2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9zY2hlZHVsZXIvY2pzL3NjaGVkdWxlci5kZXZlbG9wbWVudC5qcyIsICIuLi9ub2RlX21vZHVsZXMvc2NoZWR1bGVyL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vY2pzL3JlYWN0LWRvbS5kZXZlbG9wbWVudC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vY2xpZW50LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9jbGFzc25hbWVzL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1pcy9janMvcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWlzL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yZWFjdC9janMvcmVhY3QtanN4LXJ1bnRpbWUuZGV2ZWxvcG1lbnQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JlYWN0L2pzeC1ydW50aW1lLmpzIiwgIi4uL3R5cGVzY3JpcHRzL3Rlc3QvbW9jaGEvY29tZnkvY29tZnkudGVzdC5tdHMiLCAiLi4vbm9kZV9tb2R1bGVzL2Zhc3QtanNvbi1wYXRjaC9tb2R1bGUvY29yZS5tanMiLCAiLi4vbm9kZV9tb2R1bGVzL2Zhc3QtanNvbi1wYXRjaC9tb2R1bGUvaGVscGVycy5tanMiLCAiLi4vbm9kZV9tb2R1bGVzL2Zhc3QtanNvbi1wYXRjaC9tb2R1bGUvZHVwbGV4Lm1qcyIsICIuLi9ub2RlX21vZHVsZXMvZmFzdC1qc29uLXBhdGNoL2luZGV4Lm1qcyIsICIuLi90eXBlc2NyaXB0cy9zcmMvY29tbW9uL3N0b3JlL3N0b3JlLm10cyIsICIuLi90eXBlc2NyaXB0cy9zcmMvc3RvcmUvcGFnZS5tdHMiLCAiLi4vdHlwZXNjcmlwdHMvc3JjL3N0b3JlL3Bob3Rvc2hvcC5tdHMiLCAiLi4vdHlwZXNjcmlwdHMvc3JjL2NvbW1vbi9zdG9yZS9zdG9yZS1tYXAubXRzIiwgIi4uL3R5cGVzY3JpcHRzL21vZHVsZXMvY29tZnkvc3JjL2NvbWZ5LWdsb2JhbHMubXRzIiwgIi4uL3R5cGVzY3JpcHRzL21vZHVsZXMvY29tZnkvcGhvdG9zaG9wTW9kZWxzLm10cyIsICIuLi90eXBlc2NyaXB0cy9zcmMvY29tbW9uL2VuLm10cyIsICIuLi90eXBlc2NyaXB0cy9zcmMvY29tbW9uL3poLWNuLm10cyIsICIuLi90eXBlc2NyaXB0cy9zcmMvY29tbW9uL2kxOG4ubXRzIiwgIi4uL3R5cGVzY3JpcHRzL3NyYy9jb21tb24vcGhvdG9zaG9wL3NwZWNpYWxMYXllci5tdHMiLCAiLi4vdHlwZXNjcmlwdHMvc3JjL2NvbW1vbi9waG90b3Nob3AvaWRlbnRpZnkubXRzIiwgIi4uL3R5cGVzY3JpcHRzL3NyYy9jb21tb24vc2RwcHBYLm10cyIsICIuLi90eXBlc2NyaXB0cy9zcmMvc3RvcmUvaGVscGVycy5tdHMiLCAiLi4vdHlwZXNjcmlwdHMvbW9kdWxlcy9jb21meS9zcmMvdXRpbC5tdHMiLCAiLi4vdHlwZXNjcmlwdHMvc3JjL2NvbW1vbi9mbHVzaGVyLm10cyIsICIuLi90eXBlc2NyaXB0cy9zcmMvY29tbW9uL3NvY2tldC9taXhpbnMvTWFpblN0b3JlSG9sZGVyLm10cyIsICIuLi90eXBlc2NyaXB0cy9zcmMvY29tbW9uL3NvY2tldC9taXhpbnMvU3RvcmVNYXBIb2xkZXIubXRzIiwgIi4uL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tcGFyc2VyL2J1aWxkL2VzbS9jb21tb25zLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tcGFyc2VyL2J1aWxkL2VzbS9lbmNvZGVQYWNrZXQuYnJvd3Nlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvZW5naW5lLmlvLXBhcnNlci9idWlsZC9lc20vY29udHJpYi9iYXNlNjQtYXJyYXlidWZmZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2VuZ2luZS5pby1wYXJzZXIvYnVpbGQvZXNtL2RlY29kZVBhY2tldC5icm93c2VyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tcGFyc2VyL2J1aWxkL2VzbS9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHNvY2tldC5pby9jb21wb25lbnQtZW1pdHRlci9saWIvZXNtL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2J1aWxkL2VzbS9nbG9iYWxzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2J1aWxkL2VzbS91dGlsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2J1aWxkL2VzbS9jb250cmliL3BhcnNlcXMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2VuZ2luZS5pby1jbGllbnQvYnVpbGQvZXNtL3RyYW5zcG9ydC5qcyIsICIuLi9ub2RlX21vZHVsZXMvZW5naW5lLmlvLWNsaWVudC9idWlsZC9lc20vdHJhbnNwb3J0cy9wb2xsaW5nLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2J1aWxkL2VzbS9jb250cmliL2hhcy1jb3JzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2J1aWxkL2VzbS90cmFuc3BvcnRzL3BvbGxpbmcteGhyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2J1aWxkL2VzbS90cmFuc3BvcnRzL3dlYnNvY2tldC5qcyIsICIuLi9ub2RlX21vZHVsZXMvZW5naW5lLmlvLWNsaWVudC9idWlsZC9lc20vdHJhbnNwb3J0cy93ZWJ0cmFuc3BvcnQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2VuZ2luZS5pby1jbGllbnQvYnVpbGQvZXNtL3RyYW5zcG9ydHMvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL2VuZ2luZS5pby1jbGllbnQvYnVpbGQvZXNtL2NvbnRyaWIvcGFyc2V1cmkuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2VuZ2luZS5pby1jbGllbnQvYnVpbGQvZXNtL3NvY2tldC5qcyIsICIuLi9ub2RlX21vZHVsZXMvZW5naW5lLmlvLWNsaWVudC9idWlsZC9lc20vaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL3NvY2tldC5pby1jbGllbnQvYnVpbGQvZXNtL3VybC5qcyIsICIuLi9ub2RlX21vZHVsZXMvc29ja2V0LmlvLXBhcnNlci9idWlsZC9lc20vaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL3NvY2tldC5pby1wYXJzZXIvYnVpbGQvZXNtL2lzLWJpbmFyeS5qcyIsICIuLi9ub2RlX21vZHVsZXMvc29ja2V0LmlvLXBhcnNlci9idWlsZC9lc20vYmluYXJ5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9zb2NrZXQuaW8tY2xpZW50L2J1aWxkL2VzbS9vbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvc29ja2V0LmlvLWNsaWVudC9idWlsZC9lc20vc29ja2V0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9zb2NrZXQuaW8tY2xpZW50L2J1aWxkL2VzbS9jb250cmliL2JhY2tvMi5qcyIsICIuLi9ub2RlX21vZHVsZXMvc29ja2V0LmlvLWNsaWVudC9idWlsZC9lc20vbWFuYWdlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvc29ja2V0LmlvLWNsaWVudC9idWlsZC9lc20vaW5kZXguanMiLCAiLi4vc2RwcHBfcHl0aG9uL3ZlcnNpb24udHh0IiwgIi4uL3R5cGVzY3JpcHRzL3NyYy9jb21tb24vdmVyc2lvbi5tdHMiLCAiLi4vdHlwZXNjcmlwdHMvc3JjL2NvbW1vbi9zb2NrZXQvU29ja2V0Lm10cyIsICIuLi90eXBlc2NyaXB0cy9zcmMvc29ja2V0L1Bob3Rvc2hvcENhbGxlci5tdHMiLCAiLi4vdHlwZXNjcmlwdHMvbW9kdWxlcy9jb21meS9zcmMvZGVmYXVsdEdyYXBoLm10cyIsICIuLi90eXBlc2NyaXB0cy9tb2R1bGVzL2NvbWZ5L3NyYy9ncmFwaC10by1mb3JtLm10cyIsICIuLi90eXBlc2NyaXB0cy9tb2R1bGVzL2NvbWZ5L3NyYy9QcmV2aWV3U2VuZGVyLm10cyIsICIuLi90eXBlc2NyaXB0cy9tb2R1bGVzL2NvbWZ5L3NyYy9zb2NrZXQvV29ya2Zsb3dDYWxsZWUubXRzIiwgIi4uL3R5cGVzY3JpcHRzL21vZHVsZXMvY29tZnkvc3JjL3NvY2tldC9Db21meVNvY2tldC5tdHMiLCAiLi4vdHlwZXNjcmlwdHMvc3JjL2NvbW1vbi9zdHJpbmctdXRpbC5tdHMiLCAiLi4vdHlwZXNjcmlwdHMvbW9kdWxlcy9jb21meS9zcmMvbGl0ZWdyYXBoL2ZlLXdpZGdldHMubXRzIiwgIi4uL3R5cGVzY3JpcHRzL21vZHVsZXMvY29tZnkvc3JjL2NvbWZ5LW5vZGVzL1NEUFBQTm9kZS5tdHMiLCAiLi4vdHlwZXNjcmlwdHMvbW9kdWxlcy9jb21meS9zcmMvY29tZnktbm9kZXMvU0RQUFBEb3dubG9hZGFibGVOb2RlLm10cyIsICIuLi90eXBlc2NyaXB0cy9tb2R1bGVzL2NvbWZ5L3NyYy9jb21meS1ub2Rlcy9JbnB1dHMubXRzIiwgIi4uL3R5cGVzY3JpcHRzL21vZHVsZXMvY29tZnkvc3JjL2NvbWZ5LW5vZGVzL1NEUFBQTm9kZVdpdGhJbnB1dC5tdHMiLCAiLi4vdHlwZXNjcmlwdHMvbW9kdWxlcy9jb21meS9zcmMvY29tZnktbm9kZXMvbm9kZXMubXRzIiwgIi4uL3R5cGVzY3JpcHRzL21vZHVsZXMvY29tZnkvc3JjL2NvbWZ5LW5vZGVzL2xlZ2FjeS1ub2Rlcy5tdHMiLCAiLi4vdHlwZXNjcmlwdHMvbW9kdWxlcy9jb21meS9zcmMvbGl0ZWdyYXBoL25vZGUtd3JhcHBlci5tdHMiLCAiLi4vdHlwZXNjcmlwdHMvbW9kdWxlcy9jb21meS9zcmMvcG9wdXAvc2RwcHBQb3B1cC5tdHMiLCAiLi4vdHlwZXNjcmlwdHMvbW9kdWxlcy9jb21meS9zcmMvcG9wdXAvQ29tZnlQb3B1cC5jc3MiLCAiLi4vdHlwZXNjcmlwdHMvbW9kdWxlcy9jb21meS9zcmMvcG9wdXAvdHN4L0NvbWZ5UG9wdXAudHN4IiwgIi4uL3R5cGVzY3JpcHRzL21vZHVsZXMvY29tZnkvc3JjL3BvcHVwL3RzeC9TZXR0aW5ncy50c3giLCAiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXJlc2l6ZS1vYnNlcnZlci9lcy9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy11dGlsL2VzL1JlYWN0L2lzRnJhZ21lbnQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvQ2hpbGRyZW4vdG9BcnJheS5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdXRpbC9lcy93YXJuaW5nLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b1ByaW1pdGl2ZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Qcm9wZXJ0eUtleS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHkuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvRG9tL2ZpbmRET01Ob2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy11dGlsL2VzL3JlZi5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9ob29rcy91c2VNZW1vLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1yZXNpemUtb2JzZXJ2ZXIvZXMvU2luZ2xlT2JzZXJ2ZXIvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXJlc2l6ZS1vYnNlcnZlci9lcy9Db2xsZWN0aW9uLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yZXNpemUtb2JzZXJ2ZXItcG9seWZpbGwvZGlzdC9SZXNpemVPYnNlcnZlci5lcy5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtcmVzaXplLW9ic2VydmVyL2VzL3V0aWxzL29ic2VydmVyVXRpbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2suanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zZXRQcm90b3R5cGVPZi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2dldFByb3RvdHlwZU9mLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2Fzc2VydFRoaXNJbml0aWFsaXplZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vcG9zc2libGVDb25zdHJ1Y3RvclJldHVybi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlU3VwZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXJlc2l6ZS1vYnNlcnZlci9lcy9TaW5nbGVPYnNlcnZlci9Eb21XcmFwcGVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hcnJheUxpa2VUb0FycmF5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hcnJheVdpdGhvdXRIb2xlcy5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaXRlcmFibGVUb0FycmF5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vbm9uSXRlcmFibGVTcHJlYWQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy11dGlsL2VzL3JhZi5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9jb25maWctcHJvdmlkZXIvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2FycmF5V2l0aEhvbGVzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pdGVyYWJsZVRvQXJyYXlMaW1pdC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vbm9uSXRlcmFibGVSZXN0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZW1vdGlvbi9oYXNoL2Rpc3QvaGFzaC5icm93c2VyLmVzbS5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9Eb20vY2FuVXNlRG9tLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy11dGlsL2VzL0RvbS9jb250YWlucy5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9Eb20vZHluYW1pY0NTUy5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vY3NzaW5qcy9lcy9ob29rcy91c2VDYWNoZVRva2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllcy5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9pc0VxdWFsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9jc3NpbmpzL2VzL1N0eWxlQ29udGV4dC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vY3NzaW5qcy9lcy9DYWNoZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vY3NzaW5qcy9lcy90aGVtZS9jYWxjL0NTU0NhbGN1bGF0b3IuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2Nzc2luanMvZXMvdGhlbWUvVGhlbWVDYWNoZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vY3NzaW5qcy9lcy90aGVtZS9UaGVtZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vY3NzaW5qcy9lcy90aGVtZS9jcmVhdGVUaGVtZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vY3NzaW5qcy9lcy91dGlsL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9jc3NpbmpzL2VzL3V0aWwvY3NzLXZhcmlhYmxlcy5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vY3NzaW5qcy9lcy9ob29rcy91c2VHbG9iYWxDYWNoZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9ob29rcy91c2VMYXlvdXRFZmZlY3QuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2Nzc2luanMvZXMvaG9va3MvdXNlQ29tcGF0aWJsZUluc2VydGlvbkVmZmVjdC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vY3NzaW5qcy9lcy9ob29rcy91c2VFZmZlY3RDbGVhbnVwUmVnaXN0ZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2Nzc2luanMvZXMvaG9va3MvdXNlSE1SLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9jc3NpbmpzL2VzL2hvb2tzL3VzZUNTU1ZhclJlZ2lzdGVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9jc3NpbmpzL2VzL2hvb2tzL3VzZVN0eWxlUmVnaXN0ZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BlbW90aW9uL3VuaXRsZXNzL2Rpc3QvdW5pdGxlc3MuYnJvd3Nlci5lc20uanMiLCAiLi4vbm9kZV9tb2R1bGVzL3N0eWxpcy9zcmMvRW51bS5qcyIsICIuLi9ub2RlX21vZHVsZXMvc3R5bGlzL3NyYy9VdGlsaXR5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9zdHlsaXMvc3JjL1Rva2VuaXplci5qcyIsICIuLi9ub2RlX21vZHVsZXMvc3R5bGlzL3NyYy9QYXJzZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3N0eWxpcy9zcmMvU2VyaWFsaXplci5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vY3NzaW5qcy9lcy9saW50ZXJzL3V0aWxzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9jc3NpbmpzL2VzL2xpbnRlcnMvY29udGVudFF1b3Rlc0xpbnRlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vY3NzaW5qcy9lcy9saW50ZXJzL2hhc2hlZEFuaW1hdGlvbkxpbnRlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vY3NzaW5qcy9lcy91dGlsL2NhY2hlTWFwVXRpbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vY3NzaW5qcy9lcy9leHRyYWN0U3R5bGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2Nzc2luanMvZXMvS2V5ZnJhbWVzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9jc3NpbmpzL2VzL3RyYW5zZm9ybWVycy9sZWdhY3lMb2dpY2FsUHJvcGVydGllcy5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvY29tcG9uZW50cy9Db250ZXh0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0FycmF5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy11dGlsL2VzL3V0aWxzL2dldC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdXRpbC9lcy91dGlscy9zZXQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvX3V0aWwvd2FybmluZy5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9mb3JtL3ZhbGlkYXRlTWVzc2FnZXNDb250ZXh0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2xvY2FsZS9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtcGFnaW5hdGlvbi9lcy9sb2NhbGUvZW5fVVMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXBpY2tlci9lcy9sb2NhbGUvY29tbW9uLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1waWNrZXIvZXMvbG9jYWxlL2VuX1VTLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3RpbWUtcGlja2VyL2xvY2FsZS9lbl9VUy5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9kYXRlLXBpY2tlci9sb2NhbGUvZW5fVVMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvY2FsZW5kYXIvbG9jYWxlL2VuX1VTLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2xvY2FsZS9lbl9VUy5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9tb2RhbC9sb2NhbGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvbG9jYWxlL2NvbnRleHQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvbG9jYWxlL3VzZUxvY2FsZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy90aGVtZS9jb250ZXh0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3RoZW1lL3RoZW1lcy9zZWVkLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9mYXN0LWNvbG9yL2VzL0Zhc3RDb2xvci5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vY29sb3JzL2VzL2dlbmVyYXRlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9jb2xvcnMvZXMvcHJlc2V0cy5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy90aGVtZS90aGVtZXMvc2hhcmVkL2dlbkNvbG9yTWFwVG9rZW4uanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvdGhlbWUvdGhlbWVzL3NoYXJlZC9nZW5SYWRpdXMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvdGhlbWUvdGhlbWVzL3NoYXJlZC9nZW5Db21tb25NYXBUb2tlbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy90aGVtZS90aGVtZXMvc2hhcmVkL2dlbkNvbnRyb2xIZWlnaHQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvdGhlbWUvdGhlbWVzL3NoYXJlZC9nZW5Gb250U2l6ZXMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvdGhlbWUvdGhlbWVzL3NoYXJlZC9nZW5Gb250TWFwVG9rZW4uanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvdGhlbWUvdGhlbWVzL3NoYXJlZC9nZW5TaXplTWFwVG9rZW4uanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvdGhlbWUvdGhlbWVzL2RlZmF1bHQvY29sb3JBbGdvcml0aG0uanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvdGhlbWUvdGhlbWVzL2RlZmF1bHQvY29sb3JzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3RoZW1lL3RoZW1lcy9kZWZhdWx0L2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3RoZW1lL3RoZW1lcy9kZWZhdWx0L3RoZW1lLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2NvbmZpZy1wcm92aWRlci9jb250ZXh0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2NvbmZpZy1wcm92aWRlci9jc3NWYXJpYWJsZXMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvY29uZmlnLXByb3ZpZGVyL0Rpc2FibGVkQ29udGV4dC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9jb25maWctcHJvdmlkZXIvaG9va3MvdXNlQ29uZmlnLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2NvbmZpZy1wcm92aWRlci9TaXplQ29udGV4dC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vY3NzaW5qcy11dGlscy9lcy91dGlsL2dlblN0eWxlVXRpbHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2Nzc2luanMtdXRpbHMvZXMvdXRpbC9jYWxjL2NhbGN1bGF0b3IuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2Nzc2luanMtdXRpbHMvZXMvdXRpbC9jYWxjL0NTU0NhbGN1bGF0b3IuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2Nzc2luanMtdXRpbHMvZXMvdXRpbC9jYWxjL051bUNhbGN1bGF0b3IuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2Nzc2luanMtdXRpbHMvZXMvdXRpbC9jYWxjL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9jc3NpbmpzLXV0aWxzL2VzL3V0aWwvZ2V0Q29tcFZhclByZWZpeC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9ob29rcy91c2VFdmVudC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9ob29rcy91c2VTdGF0ZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9ob29rcy91c2VNZXJnZWRTdGF0ZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vY3NzaW5qcy11dGlscy9lcy91dGlsL2dldENvbXBvbmVudFRva2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9jc3NpbmpzLXV0aWxzL2VzL3V0aWwvc3RhdGlzdGljLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9jc3NpbmpzLXV0aWxzL2VzL3V0aWwvZ2V0RGVmYXVsdENvbXBvbmVudFRva2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9jc3NpbmpzLXV0aWxzL2VzL3V0aWwvbWF4bWluLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9jc3NpbmpzLXV0aWxzL2VzL191dGlsL2hvb2tzL3VzZVVuaXF1ZU1lbW8uanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2Nzc2luanMtdXRpbHMvZXMvaG9va3MvdXNlQ1NQLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3RoZW1lL2ludGVyZmFjZS9wcmVzZXRDb2xvcnMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvdGhlbWUvdXNlVG9rZW4uanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvdmVyc2lvbi92ZXJzaW9uLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3ZlcnNpb24vaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvdGhlbWUvdXRpbC9nZXRBbHBoYUNvbG9yLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3RoZW1lL3V0aWwvYWxpYXMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvdGhlbWUvdXRpbC9nZW5TdHlsZVV0aWxzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3N0eWxlL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3RoZW1lL3V0aWwvZ2VuUHJlc2V0Q29sb3IuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvdGhlbWUvdXRpbC91c2VSZXNldEljb25TdHlsZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9jb25maWctcHJvdmlkZXIvaG9va3MvdXNlVGhlbWVLZXkuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvY29uZmlnLXByb3ZpZGVyL2hvb2tzL3VzZVRoZW1lLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2NvbmZpZy1wcm92aWRlci9Nb3Rpb25XcmFwcGVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1tb3Rpb24vZXMvQ1NTTW90aW9uLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1tb3Rpb24vZXMvY29udGV4dC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtbW90aW9uL2VzL0RvbVdyYXBwZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvaG9va3MvdXNlU3luY1N0YXRlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1tb3Rpb24vZXMvaG9va3MvdXNlU3RhdHVzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1tb3Rpb24vZXMvaW50ZXJmYWNlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1tb3Rpb24vZXMvaG9va3MvdXNlRG9tTW90aW9uRXZlbnRzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1tb3Rpb24vZXMvdXRpbC9tb3Rpb24uanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLW1vdGlvbi9lcy9ob29rcy91c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1tb3Rpb24vZXMvaG9va3MvdXNlU3RlcFF1ZXVlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1tb3Rpb24vZXMvaG9va3MvdXNlTmV4dEZyYW1lLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1tb3Rpb24vZXMvQ1NTTW90aW9uTGlzdC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtbW90aW9uL2VzL3V0aWwvZGlmZi5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtbW90aW9uL2VzL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2NvbmZpZy1wcm92aWRlci9Qcm9wV2FybmluZy5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvQ2hlY2tDaXJjbGVGaWxsZWQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vQ2hlY2tDaXJjbGVGaWxsZWQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2NvbXBvbmVudHMvQW50ZEljb24uanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2NvbXBvbmVudHMvSWNvbkJhc2UuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvRG9tL3NoYWRvdy5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvdXRpbHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2NvbXBvbmVudHMvdHdvVG9uZVByaW1hcnlDb2xvci5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvQ2xvc2VDaXJjbGVGaWxsZWQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vQ2xvc2VDaXJjbGVGaWxsZWQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0Nsb3NlT3V0bGluZWQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vQ2xvc2VPdXRsaW5lZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9waWNrQXR0cnMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvX3V0aWwvcmVhY3ROb2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2NvbmZpZy1wcm92aWRlci9ob29rcy91c2VDU1NWYXJDbHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvS2V5Q29kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvTG9hZGluZ091dGxpbmVkLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL0xvYWRpbmdPdXRsaW5lZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9fdXRpbC9ob29rcy91c2VaSW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvX3V0aWwvemluZGV4Q29udGV4dC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9jb25maWctcHJvdmlkZXIvVW5zdGFibGVDb250ZXh0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9yZWdlbmVyYXRvclJ1bnRpbWUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2FzeW5jVG9HZW5lcmF0b3IuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvUmVhY3QvcmVuZGVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL191dGlsL21vdGlvbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9idXR0b24vYnV0dG9uLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy11dGlsL2VzL29taXQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvX3V0aWwvd2F2ZS9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9Eb20vaXNWaXNpYmxlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL191dGlsL3dhdmUvc3R5bGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvX3V0aWwvd2F2ZS91c2VXYXZlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL191dGlsL3dhdmUvaW50ZXJmYWNlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL191dGlsL3dhdmUvV2F2ZUVmZmVjdC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9fdXRpbC93YXZlL3V0aWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvY29uZmlnLXByb3ZpZGVyL2hvb2tzL3VzZVNpemUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvc3BhY2UvQ29tcGFjdC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9idXR0b24vYnV0dG9uLWdyb3VwLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2J1dHRvbi9idXR0b25IZWxwZXJzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2J1dHRvbi9EZWZhdWx0TG9hZGluZ0ljb24uanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvYnV0dG9uL0ljb25XcmFwcGVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2J1dHRvbi9zdHlsZS9ncm91cC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9jb2xvci1waWNrZXIvZXMvQ29sb3JQaWNrZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvY29sb3ItcGlja2VyL2VzL2NvbG9yLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L2NvbG9yLXBpY2tlci9lcy91dGlsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L2NvbG9yLXBpY2tlci9lcy9jb21wb25lbnRzL0NvbG9yQmxvY2suanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvY29sb3ItcGlja2VyL2VzL2NvbXBvbmVudHMvUGlja2VyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L2NvbG9yLXBpY2tlci9lcy9ob29rcy91c2VDb2xvckRyYWcuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvY29sb3ItcGlja2VyL2VzL2NvbXBvbmVudHMvSGFuZGxlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9jb2xvci1waWNrZXIvZXMvY29tcG9uZW50cy9QYWxldHRlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L2NvbG9yLXBpY2tlci9lcy9jb21wb25lbnRzL1RyYW5zZm9ybS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9jb2xvci1waWNrZXIvZXMvaG9va3MvdXNlQ29sb3JTdGF0ZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9jb2xvci1waWNrZXIvZXMvaG9va3MvdXNlQ29tcG9uZW50LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L2NvbG9yLXBpY2tlci9lcy9jb21wb25lbnRzL1NsaWRlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9jb2xvci1waWNrZXIvZXMvY29tcG9uZW50cy9HcmFkaWVudC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9jb2xvci1waWNrZXIvY29sb3IuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvY29sb3ItcGlja2VyL2NvbXBvbmVudHMvQ29sb3JQcmVzZXRzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9SaWdodE91dGxpbmVkLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL1JpZ2h0T3V0bGluZWQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvc3R5bGUvbW90aW9uL2NvbGxhcHNlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3N0eWxlL21vdGlvbi9tb3Rpb24uanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvc3R5bGUvbW90aW9uL2ZhZGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvc3R5bGUvbW90aW9uL21vdmUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvc3R5bGUvbW90aW9uL3NsaWRlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3N0eWxlL21vdGlvbi96b29tLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2J1dHRvbi9zdHlsZS90b2tlbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9idXR0b24vc3R5bGUvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvc3R5bGUvY29tcGFjdC1pdGVtLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3N0eWxlL2NvbXBhY3QtaXRlbS12ZXJ0aWNhbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9idXR0b24vc3R5bGUvY29tcGFjdC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9idXR0b24vaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvcG9ydGFsL2VzL1BvcnRhbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9wb3J0YWwvZXMvQ29udGV4dC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9wb3J0YWwvZXMvdXNlRG9tLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L3BvcnRhbC9lcy91c2VTY3JvbGxMb2NrZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvZ2V0U2Nyb2xsQmFyU2l6ZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9wb3J0YWwvZXMvdXRpbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9wb3J0YWwvZXMvbW9jay5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9wb3J0YWwvZXMvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLWRpYWxvZy9lcy9EaWFsb2dXcmFwLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1kaWFsb2cvZXMvY29udGV4dC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtZGlhbG9nL2VzL0RpYWxvZy9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9ob29rcy91c2VJZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtZGlhbG9nL2VzL3V0aWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLWRpYWxvZy9lcy9EaWFsb2cvQ29udGVudC9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtZGlhbG9nL2VzL0RpYWxvZy9Db250ZW50L1BhbmVsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1kaWFsb2cvZXMvRGlhbG9nL0NvbnRlbnQvTWVtb0NoaWxkcmVuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1kaWFsb2cvZXMvRGlhbG9nL01hc2suanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLWRpYWxvZy9lcy9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9fdXRpbC9Db250ZXh0SXNvbGF0b3IuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvZm9ybS9jb250ZXh0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1maWVsZC1mb3JtL2VzL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1maWVsZC1mb3JtL2VzL0ZpZWxkLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1maWVsZC1mb3JtL2VzL0ZpZWxkQ29udGV4dC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtZmllbGQtZm9ybS9lcy9MaXN0Q29udGV4dC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtZmllbGQtZm9ybS9lcy91dGlscy90eXBlVXRpbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9hc3luYy12YWxpZGF0b3IvZXMvbWVzc2FnZXMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2lzTmF0aXZlRnVuY3Rpb24uanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NvbnN0cnVjdC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vd3JhcE5hdGl2ZVN1cGVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L2FzeW5jLXZhbGlkYXRvci9lcy91dGlsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L2FzeW5jLXZhbGlkYXRvci9lcy9ydWxlL2VudW0uanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvYXN5bmMtdmFsaWRhdG9yL2VzL3J1bGUvcGF0dGVybi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9hc3luYy12YWxpZGF0b3IvZXMvcnVsZS9yYW5nZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9hc3luYy12YWxpZGF0b3IvZXMvcnVsZS9yZXF1aXJlZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9hc3luYy12YWxpZGF0b3IvZXMvcnVsZS91cmwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvYXN5bmMtdmFsaWRhdG9yL2VzL3J1bGUvdHlwZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9hc3luYy12YWxpZGF0b3IvZXMvcnVsZS93aGl0ZXNwYWNlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L2FzeW5jLXZhbGlkYXRvci9lcy9ydWxlL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L2FzeW5jLXZhbGlkYXRvci9lcy92YWxpZGF0b3IvYW55LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L2FzeW5jLXZhbGlkYXRvci9lcy92YWxpZGF0b3IvYXJyYXkuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvYXN5bmMtdmFsaWRhdG9yL2VzL3ZhbGlkYXRvci9ib29sZWFuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L2FzeW5jLXZhbGlkYXRvci9lcy92YWxpZGF0b3IvZGF0ZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9hc3luYy12YWxpZGF0b3IvZXMvdmFsaWRhdG9yL2VudW0uanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvYXN5bmMtdmFsaWRhdG9yL2VzL3ZhbGlkYXRvci9mbG9hdC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9hc3luYy12YWxpZGF0b3IvZXMvdmFsaWRhdG9yL2ludGVnZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvYXN5bmMtdmFsaWRhdG9yL2VzL3ZhbGlkYXRvci9tZXRob2QuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvYXN5bmMtdmFsaWRhdG9yL2VzL3ZhbGlkYXRvci9udW1iZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvYXN5bmMtdmFsaWRhdG9yL2VzL3ZhbGlkYXRvci9vYmplY3QuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvYXN5bmMtdmFsaWRhdG9yL2VzL3ZhbGlkYXRvci9wYXR0ZXJuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L2FzeW5jLXZhbGlkYXRvci9lcy92YWxpZGF0b3IvcmVnZXhwLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L2FzeW5jLXZhbGlkYXRvci9lcy92YWxpZGF0b3IvcmVxdWlyZWQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvYXN5bmMtdmFsaWRhdG9yL2VzL3ZhbGlkYXRvci9zdHJpbmcuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvYXN5bmMtdmFsaWRhdG9yL2VzL3ZhbGlkYXRvci90eXBlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L2FzeW5jLXZhbGlkYXRvci9lcy92YWxpZGF0b3IvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvYXN5bmMtdmFsaWRhdG9yL2VzL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1maWVsZC1mb3JtL2VzL3V0aWxzL3ZhbGlkYXRlVXRpbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtZmllbGQtZm9ybS9lcy91dGlscy9tZXNzYWdlcy5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtZmllbGQtZm9ybS9lcy91dGlscy92YWx1ZVV0aWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLWZpZWxkLWZvcm0vZXMvTGlzdC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtZmllbGQtZm9ybS9lcy91c2VGb3JtLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1maWVsZC1mb3JtL2VzL3V0aWxzL2FzeW5jVXRpbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtZmllbGQtZm9ybS9lcy91dGlscy9OYW1lTWFwLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1maWVsZC1mb3JtL2VzL0Zvcm0uanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLWZpZWxkLWZvcm0vZXMvRm9ybUNvbnRleHQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLWZpZWxkLWZvcm0vZXMvdXNlV2F0Y2guanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvZ3JpZC9zdHlsZS9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9tb2RhbC9zdHlsZS9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9fdXRpbC9QdXJlUGFuZWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvc2VsZWN0L2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1zZWxlY3QvZXMvU2VsZWN0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1zZWxlY3QvZXMvQmFzZVNlbGVjdC9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9pc01vYmlsZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL1RyYW5zQnRuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1zZWxlY3QvZXMvaG9va3MvdXNlQWxsb3dDbGVhci5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL2hvb2tzL3VzZUJhc2VQcm9wcy5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL2hvb2tzL3VzZURlbGF5UmVzZXQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy9ob29rcy91c2VMb2NrLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1zZWxlY3QvZXMvaG9va3MvdXNlU2VsZWN0VHJpZ2dlckNvbnRyb2wuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy9TZWxlY3Rvci9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL3V0aWxzL2tleVV0aWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy9TZWxlY3Rvci9NdWx0aXBsZVNlbGVjdG9yLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1vdmVyZmxvdy9lcy9PdmVyZmxvdy5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtb3ZlcmZsb3cvZXMvSXRlbS5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtb3ZlcmZsb3cvZXMvaG9va3MvdXNlRWZmZWN0U3RhdGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLW92ZXJmbG93L2VzL2hvb2tzL2NoYW5uZWxVcGRhdGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLW92ZXJmbG93L2VzL1Jhd0l0ZW0uanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLW92ZXJmbG93L2VzL2NvbnRleHQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLW92ZXJmbG93L2VzL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1zZWxlY3QvZXMvU2VsZWN0b3IvSW5wdXQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy9ob29rcy91c2VMYXlvdXRFZmZlY3QuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy91dGlscy9jb21tb25VdGlsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1zZWxlY3QvZXMvU2VsZWN0b3IvU2luZ2xlU2VsZWN0b3IuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvdHJpZ2dlci9lcy9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC90cmlnZ2VyL2VzL1BvcHVwL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L3RyaWdnZXIvZXMvUG9wdXAvQXJyb3cuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvdHJpZ2dlci9lcy9Qb3B1cC9NYXNrLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L3RyaWdnZXIvZXMvUG9wdXAvUG9wdXBDb250ZW50LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L3RyaWdnZXIvZXMvVHJpZ2dlcldyYXBwZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvdHJpZ2dlci9lcy9jb250ZXh0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L3RyaWdnZXIvZXMvaG9va3MvdXNlQWN0aW9uLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L3RyaWdnZXIvZXMvaG9va3MvdXNlQWxpZ24uanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvdHJpZ2dlci9lcy91dGlsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L3RyaWdnZXIvZXMvaG9va3MvdXNlV2F0Y2guanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvdHJpZ2dlci9lcy9ob29rcy91c2VXaW5DbGljay5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL1NlbGVjdFRyaWdnZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy91dGlscy92YWx1ZVV0aWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy9TZWxlY3RDb250ZXh0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1zZWxlY3QvZXMvQmFzZVNlbGVjdC9Qb2xpdGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy9PcHRHcm91cC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL09wdGlvbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL09wdGlvbkxpc3QuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9lcy9MaXN0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvZXMvRmlsbGVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvZXMvaG9va3MvdXNlQ2hpbGRyZW4uanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9lcy9JdGVtLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvZXMvaG9va3MvdXNlRGlmZkl0ZW0uanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9lcy91dGlscy9hbGdvcml0aG1VdGlsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvZXMvaG9va3MvdXNlRnJhbWVXaGVlbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdmlydHVhbC1saXN0L2VzL3V0aWxzL2lzRmlyZWZveC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdmlydHVhbC1saXN0L2VzL2hvb2tzL3VzZU9yaWdpblNjcm9sbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdmlydHVhbC1saXN0L2VzL2hvb2tzL3VzZUdldFNpemUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9lcy9ob29rcy91c2VIZWlnaHRzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvZXMvdXRpbHMvQ2FjaGVNYXAuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9lcy9ob29rcy91c2VNb2JpbGVUb3VjaE1vdmUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9lcy9ob29rcy91c2VTY3JvbGxEcmFnLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvZXMvaG9va3MvdXNlU2Nyb2xsVG8uanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9lcy9TY3JvbGxCYXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9lcy91dGlscy9zY3JvbGxiYXJVdGlsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvZXMvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy91dGlscy9wbGF0Zm9ybVV0aWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy9ob29rcy91c2VDYWNoZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL2hvb2tzL3VzZUZpbHRlck9wdGlvbnMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy9ob29rcy91c2VJZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL2hvb2tzL3VzZU9wdGlvbnMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy91dGlscy9sZWdhY3lVdGlsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1zZWxlY3QvZXMvaG9va3MvdXNlUmVmRnVuYy5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL3V0aWxzL3dhcm5pbmdQcm9wc1V0aWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9fdXRpbC9zdGF0dXNVdGlscy5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9jb25maWctcHJvdmlkZXIvZGVmYXVsdFJlbmRlckVtcHR5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2VtcHR5L2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2VtcHR5L2VtcHR5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2VtcHR5L3NpbXBsZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9lbXB0eS9zdHlsZS9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9mb3JtL2hvb2tzL3VzZVZhcmlhbnRzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3NlbGVjdC9tZXJnZWRCdWlsdGluUGxhY2VtZW50cy5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9zZWxlY3Qvc3R5bGUvZHJvcGRvd24uanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvc2VsZWN0L3N0eWxlL211bHRpcGxlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3NlbGVjdC9zdHlsZS9zaW5nbGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvc2VsZWN0L3N0eWxlL3Rva2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3NlbGVjdC9zdHlsZS92YXJpYW50cy5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9zZWxlY3Qvc3R5bGUvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvc2VsZWN0L3VzZUljb25zLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9DaGVja091dGxpbmVkLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL0NoZWNrT3V0bGluZWQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0Rvd25PdXRsaW5lZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9Eb3duT3V0bGluZWQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL1NlYXJjaE91dGxpbmVkLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL1NlYXJjaE91dGxpbmVkLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3NlbGVjdC91c2VTaG93QXJyb3cuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvX3V0aWwvaG9va3MvdXNlRm9yY2VVcGRhdGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvdG9vbHRpcC9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdG9vbHRpcC9lcy9Qb3B1cC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdG9vbHRpcC9lcy9Ub29sdGlwLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy10b29sdGlwL2VzL3BsYWNlbWVudHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXRvb2x0aXAvZXMvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvc3R5bGUvcm91bmRlZEFycm93LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3N0eWxlL3BsYWNlbWVudEFycm93LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL191dGlsL3BsYWNlbWVudHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvdG9vbHRpcC9QdXJlUGFuZWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvdG9vbHRpcC9zdHlsZS9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy90b29sdGlwL3V0aWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvX3V0aWwvY29sb3JzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9MZWZ0T3V0bGluZWQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vTGVmdE91dGxpbmVkLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1jaGVja2JveC9lcy9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9jaGVja2JveC91c2VCdWJibGVMb2NrLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2lucHV0L3N0eWxlL3Rva2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2lucHV0L3N0eWxlL3ZhcmlhbnRzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2lucHV0L3N0eWxlL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2NoZWNrYm94L3N0eWxlL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2NoZWNrYm94L0NoZWNrYm94LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2NoZWNrYm94L0dyb3VwQ29udGV4dC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9jaGVja2JveC9Hcm91cC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9jaGVja2JveC9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9pbnB1dC1udW1iZXIvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL1VwT3V0bGluZWQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vVXBPdXRsaW5lZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9taW5pLWRlY2ltYWwvZXMvc3VwcG9ydFV0aWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvbWluaS1kZWNpbWFsL2VzL251bWJlclV0aWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvbWluaS1kZWNpbWFsL2VzL0JpZ0ludERlY2ltYWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvbWluaS1kZWNpbWFsL2VzL051bWJlckRlY2ltYWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvbWluaS1kZWNpbWFsL2VzL01pbmlEZWNpbWFsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L21pbmktZGVjaW1hbC9lcy9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtaW5wdXQtbnVtYmVyL2VzL0lucHV0TnVtYmVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1pbnB1dC9lcy9CYXNlSW5wdXQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLWlucHV0L2VzL3V0aWxzL2NvbW1vblV0aWxzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1pbnB1dC9lcy9JbnB1dC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtaW5wdXQvZXMvaG9va3MvdXNlQ291bnQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLWlucHV0L2VzL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy11dGlsL2VzL3Byb3h5T2JqZWN0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1pbnB1dC1udW1iZXIvZXMvaG9va3MvdXNlQ3Vyc29yLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1pbnB1dC1udW1iZXIvZXMvU3RlcEhhbmRsZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvaG9va3MvdXNlTW9iaWxlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1pbnB1dC1udW1iZXIvZXMvdXRpbHMvbnVtYmVyVXRpbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtaW5wdXQtbnVtYmVyL2VzL2hvb2tzL3VzZUZyYW1lLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1pbnB1dC1udW1iZXIvZXMvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvaW5wdXQtbnVtYmVyL3N0eWxlL3Rva2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2lucHV0LW51bWJlci9zdHlsZS9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9pbnB1dC9JbnB1dC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9fdXRpbC9nZXRBbGxvd0NsZWFyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2lucHV0L2hvb2tzL3VzZVJlbW92ZVBhc3N3b3JkVGltZW91dC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9pbnB1dC91dGlscy5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtc2xpZGVyL2VzL1NsaWRlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtc2xpZGVyL2VzL0hhbmRsZXMvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNsaWRlci9lcy91dGlsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1zbGlkZXIvZXMvSGFuZGxlcy9IYW5kbGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNsaWRlci9lcy9jb250ZXh0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1zbGlkZXIvZXMvTWFya3MvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNsaWRlci9lcy9NYXJrcy9NYXJrLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1zbGlkZXIvZXMvU3RlcHMvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNsaWRlci9lcy9TdGVwcy9Eb3QuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNsaWRlci9lcy9UcmFja3MvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNsaWRlci9lcy9UcmFja3MvVHJhY2suanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNsaWRlci9lcy9ob29rcy91c2VEcmFnLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1zbGlkZXIvZXMvaG9va3MvdXNlT2Zmc2V0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1zbGlkZXIvZXMvaG9va3MvdXNlUmFuZ2UuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNsaWRlci9lcy9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9zbGlkZXIvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvc2xpZGVyL0NvbnRleHQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvc2xpZGVyL1NsaWRlclRvb2x0aXAuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvc2xpZGVyL3N0eWxlL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3NsaWRlci91c2VSYWZMb2NrLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL191dGlsL2dhcFNpemUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvZmxleC9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9mbGV4L3V0aWxzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2ZsZXgvc3R5bGUvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvaW1hZ2UvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0V5ZU91dGxpbmVkLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL0V5ZU91dGxpbmVkLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1pbWFnZS9lcy9JbWFnZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9Eb20vY3NzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1pbWFnZS9lcy9QcmV2aWV3LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy11dGlsL2VzL0RvbS9hZGRFdmVudExpc3RlbmVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1pbWFnZS9lcy9PcGVyYXRpb25zLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1pbWFnZS9lcy9jb250ZXh0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1pbWFnZS9lcy9ob29rcy91c2VJbWFnZVRyYW5zZm9ybS5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtaW1hZ2UvZXMvaG9va3MvdXNlTW91c2VFdmVudC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtaW1hZ2UvZXMvZ2V0Rml4U2NhbGVFbGVUcmFuc1Bvc2l0aW9uLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1pbWFnZS9lcy9wcmV2aWV3Q29uZmlnLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1pbWFnZS9lcy9ob29rcy91c2VTdGF0dXMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLWltYWdlL2VzL3V0aWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLWltYWdlL2VzL2hvb2tzL3VzZVRvdWNoRXZlbnQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLWltYWdlL2VzL1ByZXZpZXdHcm91cC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtaW1hZ2UvZXMvaG9va3MvdXNlUHJldmlld0l0ZW1zLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1pbWFnZS9lcy9jb21tb24uanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLWltYWdlL2VzL2hvb2tzL3VzZVJlZ2lzdGVySW1hZ2UuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLWltYWdlL2VzL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2ltYWdlL1ByZXZpZXdHcm91cC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvUm90YXRlTGVmdE91dGxpbmVkLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL1JvdGF0ZUxlZnRPdXRsaW5lZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvUm90YXRlUmlnaHRPdXRsaW5lZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9Sb3RhdGVSaWdodE91dGxpbmVkLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9Td2FwT3V0bGluZWQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vU3dhcE91dGxpbmVkLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9ab29tSW5PdXRsaW5lZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9ab29tSW5PdXRsaW5lZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvWm9vbU91dE91dGxpbmVkLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL1pvb21PdXRPdXRsaW5lZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9pbWFnZS9zdHlsZS9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9pbnB1dC9Hcm91cC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9pbnB1dC9PVFAvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvaW5wdXQvc3R5bGUvb3RwLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2lucHV0L09UUC9PVFBJbnB1dC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9pbnB1dC9QYXNzd29yZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvRXllSW52aXNpYmxlT3V0bGluZWQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vRXllSW52aXNpYmxlT3V0bGluZWQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvaW5wdXQvU2VhcmNoLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2lucHV0L1RleHRBcmVhLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy10ZXh0YXJlYS9lcy9UZXh0QXJlYS5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdGV4dGFyZWEvZXMvUmVzaXphYmxlVGV4dEFyZWEuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXRleHRhcmVhL2VzL2NhbGN1bGF0ZU5vZGVIZWlnaHQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXRleHRhcmVhL2VzL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2lucHV0L3N0eWxlL3RleHRhcmVhLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2lucHV0L2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3Byb2dyZXNzL3Byb2dyZXNzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3Byb2dyZXNzL0NpcmNsZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtcHJvZ3Jlc3MvZXMvTGluZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtcHJvZ3Jlc3MvZXMvY29tbW9uLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1wcm9ncmVzcy9lcy9DaXJjbGUvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXByb2dyZXNzL2VzL2hvb2tzL3VzZUlkLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1wcm9ncmVzcy9lcy9DaXJjbGUvUHRnQ2lyY2xlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1wcm9ncmVzcy9lcy9DaXJjbGUvdXRpbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9wcm9ncmVzcy91dGlscy5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9wcm9ncmVzcy9MaW5lLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3Byb2dyZXNzL3N0eWxlL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3Byb2dyZXNzL1N0ZXBzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3Byb2dyZXNzL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9EZWxldGVPdXRsaW5lZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9EZWxldGVPdXRsaW5lZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvRG93bmxvYWRPdXRsaW5lZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9Eb3dubG9hZE91dGxpbmVkLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9GaWxlVHdvVG9uZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9GaWxlVHdvVG9uZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvUGFwZXJDbGlwT3V0bGluZWQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vUGFwZXJDbGlwT3V0bGluZWQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL1BpY3R1cmVUd29Ub25lLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL1BpY3R1cmVUd29Ub25lLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9VcGxvYWRPdXRsaW5lZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9VcGxvYWRPdXRsaW5lZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy91cGxvYWQvRHJhZ2dlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy91cGxvYWQvVXBsb2FkLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy11cGxvYWQvZXMvVXBsb2FkLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy11cGxvYWQvZXMvQWpheFVwbG9hZGVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy11cGxvYWQvZXMvYXR0ci1hY2NlcHQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXVwbG9hZC9lcy9yZXF1ZXN0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy11cGxvYWQvZXMvdHJhdmVyc2VGaWxlVHJlZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdXBsb2FkL2VzL3VpZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdXBsb2FkL2VzL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3VwbG9hZC9zdHlsZS9kcmFnZ2VyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3VwbG9hZC9zdHlsZS9saXN0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3VwbG9hZC9zdHlsZS9tb3Rpb24uanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvdXBsb2FkL3N0eWxlL3BpY3R1cmUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvdXBsb2FkL3N0eWxlL3J0bC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy91cGxvYWQvc3R5bGUvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvdXBsb2FkL1VwbG9hZExpc3QvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvdXBsb2FkL3V0aWxzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3VwbG9hZC9VcGxvYWRMaXN0L0xpc3RJdGVtLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3VwbG9hZC9pbmRleC5qcyIsICIuLi90eXBlc2NyaXB0cy9tb2R1bGVzL2NvbWZ5L3NyYy9wb3B1cC90c3gvV29ya2Zsb3dFZGl0V2ViLnRzeCIsICIuLi90eXBlc2NyaXB0cy9zcmMvY29tbW9uL1dvcmtmbG93RWRpdC50c3giLCAiLi4vdHlwZXNjcmlwdHMvc3JjL2NvbW1vbi90c3gvdXRpbC50cyIsICIuLi90eXBlc2NyaXB0cy9tb2R1bGVzL2NvbWZ5L3NyYy9wb3B1cC90c3gvd2lkZ2V0cy9udW1iZXIudHN4IiwgIi4uL3R5cGVzY3JpcHRzL21vZHVsZXMvY29tZnkvc3JjL3BvcHVwL3RzeC93aWRnZXRzL2hvb2tzLm10cyIsICIuLi90eXBlc2NyaXB0cy9tb2R1bGVzL2NvbWZ5L3NyYy9wb3B1cC90c3gvd2lkZ2V0cy9jb21iby50c3giLCAiLi4vdHlwZXNjcmlwdHMvbW9kdWxlcy9jb21meS9zcmMvcG9wdXAvdHN4L3dpZGdldHMvdG9nZ2xlLnRzeCIsICIuLi90eXBlc2NyaXB0cy9tb2R1bGVzL2NvbWZ5L3NyYy9wb3B1cC90c3gvd2lkZ2V0cy9zdHJpbmcudHN4IiwgIi4uL3R5cGVzY3JpcHRzL21vZHVsZXMvY29tZnkvc3JjL3BvcHVwL3RzeC93aWRnZXRzL0VkaXRhYmxlVGl0bGUudHN4IiwgIi4uL3R5cGVzY3JpcHRzL21vZHVsZXMvY29tZnkvc3JjL3BvcHVwL3RzeC93aWRnZXRzL2ltYWdlX21hc2tfcGF0aC50c3giLCAiLi4vdHlwZXNjcmlwdHMvbW9kdWxlcy9jb21meS9zcmMvcG9wdXAvdHN4L0NvbWZ5U2lkZWJhci50c3giLCAiLi4vdHlwZXNjcmlwdHMvbW9kdWxlcy9jb21meS9zcmMvd2lkZ2V0dGFibGUtZW50cnkubXRzIiwgIi4uL3R5cGVzY3JpcHRzL21vZHVsZXMvY29tZnkvc3JjL2NvbWZ5LWVudHJ5Lm10cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IGRlZmF1bHQgKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOlxuICAgICAgICAgICAgdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDpcbiAgICAgICAgICAgIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB7fSk7XG4iLCAiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG4vLyBiYXNlZCBvZmYgaHR0cHM6Ly9naXRodWIuY29tL2RlZnVuY3R6b21iaWUvbm9kZS1wcm9jZXNzL2Jsb2IvbWFzdGVyL2Jyb3dzZXIuanNcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG52YXIgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbmlmICh0eXBlb2YgZ2xvYmFsLnNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbn1cbmlmICh0eXBlb2YgZ2xvYmFsLmNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbn1cblxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG5leHRUaWNrKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59XG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xuZXhwb3J0IHZhciB0aXRsZSA9ICdicm93c2VyJztcbmV4cG9ydCB2YXIgcGxhdGZvcm0gPSAnYnJvd3Nlcic7XG5leHBvcnQgdmFyIGJyb3dzZXIgPSB0cnVlO1xuZXhwb3J0IHZhciBlbnYgPSB7fTtcbmV4cG9ydCB2YXIgYXJndiA9IFtdO1xuZXhwb3J0IHZhciB2ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5leHBvcnQgdmFyIHZlcnNpb25zID0ge307XG5leHBvcnQgdmFyIHJlbGVhc2UgPSB7fTtcbmV4cG9ydCB2YXIgY29uZmlnID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5leHBvcnQgdmFyIG9uID0gbm9vcDtcbmV4cG9ydCB2YXIgYWRkTGlzdGVuZXIgPSBub29wO1xuZXhwb3J0IHZhciBvbmNlID0gbm9vcDtcbmV4cG9ydCB2YXIgb2ZmID0gbm9vcDtcbmV4cG9ydCB2YXIgcmVtb3ZlTGlzdGVuZXIgPSBub29wO1xuZXhwb3J0IHZhciByZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xuZXhwb3J0IHZhciBlbWl0ID0gbm9vcDtcblxuZXhwb3J0IGZ1bmN0aW9uIGJpbmRpbmcobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGN3ZCAoKSB7IHJldHVybiAnLycgfVxuZXhwb3J0IGZ1bmN0aW9uIGNoZGlyIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiB1bWFzaygpIHsgcmV0dXJuIDA7IH1cblxuLy8gZnJvbSBodHRwczovL2dpdGh1Yi5jb20va3VtYXZpcy9icm93c2VyLXByb2Nlc3MtaHJ0aW1lL2Jsb2IvbWFzdGVyL2luZGV4LmpzXG52YXIgcGVyZm9ybWFuY2UgPSBnbG9iYWwucGVyZm9ybWFuY2UgfHwge31cbnZhciBwZXJmb3JtYW5jZU5vdyA9XG4gIHBlcmZvcm1hbmNlLm5vdyAgICAgICAgfHxcbiAgcGVyZm9ybWFuY2UubW96Tm93ICAgICB8fFxuICBwZXJmb3JtYW5jZS5tc05vdyAgICAgIHx8XG4gIHBlcmZvcm1hbmNlLm9Ob3cgICAgICAgfHxcbiAgcGVyZm9ybWFuY2Uud2Via2l0Tm93ICB8fFxuICBmdW5jdGlvbigpeyByZXR1cm4gKG5ldyBEYXRlKCkpLmdldFRpbWUoKSB9XG5cbi8vIGdlbmVyYXRlIHRpbWVzdGFtcCBvciBkZWx0YVxuLy8gc2VlIGh0dHA6Ly9ub2RlanMub3JnL2FwaS9wcm9jZXNzLmh0bWwjcHJvY2Vzc19wcm9jZXNzX2hydGltZVxuZXhwb3J0IGZ1bmN0aW9uIGhydGltZShwcmV2aW91c1RpbWVzdGFtcCl7XG4gIHZhciBjbG9ja3RpbWUgPSBwZXJmb3JtYW5jZU5vdy5jYWxsKHBlcmZvcm1hbmNlKSoxZS0zXG4gIHZhciBzZWNvbmRzID0gTWF0aC5mbG9vcihjbG9ja3RpbWUpXG4gIHZhciBuYW5vc2Vjb25kcyA9IE1hdGguZmxvb3IoKGNsb2NrdGltZSUxKSoxZTkpXG4gIGlmIChwcmV2aW91c1RpbWVzdGFtcCkge1xuICAgIHNlY29uZHMgPSBzZWNvbmRzIC0gcHJldmlvdXNUaW1lc3RhbXBbMF1cbiAgICBuYW5vc2Vjb25kcyA9IG5hbm9zZWNvbmRzIC0gcHJldmlvdXNUaW1lc3RhbXBbMV1cbiAgICBpZiAobmFub3NlY29uZHM8MCkge1xuICAgICAgc2Vjb25kcy0tXG4gICAgICBuYW5vc2Vjb25kcyArPSAxZTlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtzZWNvbmRzLG5hbm9zZWNvbmRzXVxufVxuXG52YXIgc3RhcnRUaW1lID0gbmV3IERhdGUoKTtcbmV4cG9ydCBmdW5jdGlvbiB1cHRpbWUoKSB7XG4gIHZhciBjdXJyZW50VGltZSA9IG5ldyBEYXRlKCk7XG4gIHZhciBkaWYgPSBjdXJyZW50VGltZSAtIHN0YXJ0VGltZTtcbiAgcmV0dXJuIGRpZiAvIDEwMDA7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmV4dFRpY2s6IG5leHRUaWNrLFxuICB0aXRsZTogdGl0bGUsXG4gIGJyb3dzZXI6IGJyb3dzZXIsXG4gIGVudjogZW52LFxuICBhcmd2OiBhcmd2LFxuICB2ZXJzaW9uOiB2ZXJzaW9uLFxuICB2ZXJzaW9uczogdmVyc2lvbnMsXG4gIG9uOiBvbixcbiAgYWRkTGlzdGVuZXI6IGFkZExpc3RlbmVyLFxuICBvbmNlOiBvbmNlLFxuICBvZmY6IG9mZixcbiAgcmVtb3ZlTGlzdGVuZXI6IHJlbW92ZUxpc3RlbmVyLFxuICByZW1vdmVBbGxMaXN0ZW5lcnM6IHJlbW92ZUFsbExpc3RlbmVycyxcbiAgZW1pdDogZW1pdCxcbiAgYmluZGluZzogYmluZGluZyxcbiAgY3dkOiBjd2QsXG4gIGNoZGlyOiBjaGRpcixcbiAgdW1hc2s6IHVtYXNrLFxuICBocnRpbWU6IGhydGltZSxcbiAgcGxhdGZvcm06IHBsYXRmb3JtLFxuICByZWxlYXNlOiByZWxlYXNlLFxuICBjb25maWc6IGNvbmZpZyxcbiAgdXB0aW1lOiB1cHRpbWVcbn07XG4iLCAidmFyIFdyaXRhYmxlU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJykuV3JpdGFibGVcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ3V0aWwnKS5pbmhlcml0c1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJyb3dzZXJTdGRvdXRcblxuXG5pbmhlcml0cyhCcm93c2VyU3Rkb3V0LCBXcml0YWJsZVN0cmVhbSlcblxuZnVuY3Rpb24gQnJvd3NlclN0ZG91dChvcHRzKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBCcm93c2VyU3Rkb3V0KSkgcmV0dXJuIG5ldyBCcm93c2VyU3Rkb3V0KG9wdHMpXG5cbiAgb3B0cyA9IG9wdHMgfHwge31cbiAgV3JpdGFibGVTdHJlYW0uY2FsbCh0aGlzLCBvcHRzKVxuICB0aGlzLmxhYmVsID0gKG9wdHMubGFiZWwgIT09IHVuZGVmaW5lZCkgPyBvcHRzLmxhYmVsIDogJ3N0ZG91dCdcbn1cblxuQnJvd3NlclN0ZG91dC5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24oY2h1bmtzLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIG91dHB1dCA9IGNodW5rcy50b1N0cmluZyA/IGNodW5rcy50b1N0cmluZygpIDogY2h1bmtzXG4gIGlmICh0aGlzLmxhYmVsID09PSBmYWxzZSkge1xuICAgIGNvbnNvbGUubG9nKG91dHB1dClcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZyh0aGlzLmxhYmVsKyc6Jywgb3V0cHV0KVxuICB9XG4gIHByb2Nlc3MubmV4dFRpY2soY2IpXG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBgcXNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gcXNcbiAqIEByZXR1cm4ge09iamVjdDxzdHJpbmcsIHN0cmluZz59XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcGFyc2VRdWVyeShxcykge1xuICByZXR1cm4gcXNcbiAgICAucmVwbGFjZSgnPycsICcnKVxuICAgIC5zcGxpdCgnJicpXG4gICAgLnJlZHVjZShmdW5jdGlvbiAob2JqLCBwYWlyKSB7XG4gICAgICB2YXIgaSA9IHBhaXIuaW5kZXhPZignPScpO1xuICAgICAgdmFyIGtleSA9IHBhaXIuc2xpY2UoMCwgaSk7XG4gICAgICB2YXIgdmFsID0gcGFpci5zbGljZSgrK2kpO1xuXG4gICAgICAvLyBEdWUgdG8gaG93IHRoZSBVUkxTZWFyY2hQYXJhbXMgQVBJIHRyZWF0cyBzcGFjZXNcbiAgICAgIG9ialtrZXldID0gZGVjb2RlVVJJQ29tcG9uZW50KHZhbC5yZXBsYWNlKC9cXCsvZywgJyUyMCcpKTtcblxuICAgICAgcmV0dXJuIG9iajtcbiAgICB9LCB7fSk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBIaWdobGlnaHQgdGhlIGdpdmVuIHN0cmluZyBvZiBganNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30ganNcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gaGlnaGxpZ2h0KGpzKSB7XG4gIHJldHVybiBqc1xuICAgIC5yZXBsYWNlKC88L2csICcmbHQ7JylcbiAgICAucmVwbGFjZSgvPi9nLCAnJmd0OycpXG4gICAgLnJlcGxhY2UoL1xcL1xcLyguKikvZ20sICc8c3BhbiBjbGFzcz1cImNvbW1lbnRcIj4vLyQxPC9zcGFuPicpXG4gICAgLnJlcGxhY2UoLygnLio/JykvZ20sICc8c3BhbiBjbGFzcz1cInN0cmluZ1wiPiQxPC9zcGFuPicpXG4gICAgLnJlcGxhY2UoLyhcXGQrXFwuXFxkKykvZ20sICc8c3BhbiBjbGFzcz1cIm51bWJlclwiPiQxPC9zcGFuPicpXG4gICAgLnJlcGxhY2UoLyhcXGQrKS9nbSwgJzxzcGFuIGNsYXNzPVwibnVtYmVyXCI+JDE8L3NwYW4+JylcbiAgICAucmVwbGFjZShcbiAgICAgIC9cXGJuZXdbIFxcdF0rKFxcdyspL2dtLFxuICAgICAgJzxzcGFuIGNsYXNzPVwia2V5d29yZFwiPm5ldzwvc3Bhbj4gPHNwYW4gY2xhc3M9XCJpbml0XCI+JDE8L3NwYW4+J1xuICAgIClcbiAgICAucmVwbGFjZShcbiAgICAgIC9cXGIoZnVuY3Rpb258bmV3fHRocm93fHJldHVybnx2YXJ8aWZ8ZWxzZSlcXGIvZ20sXG4gICAgICAnPHNwYW4gY2xhc3M9XCJrZXl3b3JkXCI+JDE8L3NwYW4+J1xuICAgICk7XG59XG5cbi8qKlxuICogSGlnaGxpZ2h0IHRoZSBjb250ZW50cyBvZiB0YWcgYG5hbWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGhpZ2hsaWdodFRhZ3MobmFtZSkge1xuICB2YXIgY29kZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NoYScpLmdldEVsZW1lbnRzQnlUYWdOYW1lKG5hbWUpO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gY29kZS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgIGNvZGVbaV0uaW5uZXJIVE1MID0gaGlnaGxpZ2h0KGNvZGVbaV0uaW5uZXJIVE1MKTtcbiAgfVxufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gc3RyaW5nID0+IHtcblx0aWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBzdHJpbmcnKTtcblx0fVxuXG5cdC8vIEVzY2FwZSBjaGFyYWN0ZXJzIHdpdGggc3BlY2lhbCBtZWFuaW5nIGVpdGhlciBpbnNpZGUgb3Igb3V0c2lkZSBjaGFyYWN0ZXIgc2V0cy5cblx0Ly8gVXNlIGEgc2ltcGxlIGJhY2tzbGFzaCBlc2NhcGUgd2hlbiBpdOKAmXMgYWx3YXlzIHZhbGlkLCBhbmQgYSBcXHVubm5uIGVzY2FwZSB3aGVuIHRoZSBzaW1wbGVyIGZvcm0gd291bGQgYmUgZGlzYWxsb3dlZCBieSBVbmljb2RlIHBhdHRlcm5z4oCZIHN0cmljdGVyIGdyYW1tYXIuXG5cdHJldHVybiBzdHJpbmdcblx0XHQucmVwbGFjZSgvW3xcXFxce30oKVtcXF1eJCsqPy5dL2csICdcXFxcJCYnKVxuXHRcdC5yZXBsYWNlKC8tL2csICdcXFxceDJkJyk7XG59O1xuIiwgIi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cblwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBEaWZmO1xuXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuZnVuY3Rpb24gRGlmZigpIHt9XG5cbkRpZmYucHJvdG90eXBlID0ge1xuICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5cbiAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgZGlmZjogZnVuY3Rpb24gZGlmZihvbGRTdHJpbmcsIG5ld1N0cmluZykge1xuICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICB2YXIgX29wdGlvbnMkdGltZW91dDtcblxuICAgIHZhclxuICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gICAgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG4gICAgdmFyIGNhbGxiYWNrID0gb3B0aW9ucy5jYWxsYmFjaztcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgZnVuY3Rpb24gZG9uZSh2YWx1ZSkge1xuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNhbGxiYWNrKHVuZGVmaW5lZCwgdmFsdWUpO1xuICAgICAgICB9LCAwKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgfSAvLyBBbGxvdyBzdWJjbGFzc2VzIHRvIG1hc3NhZ2UgdGhlIGlucHV0IHByaW9yIHRvIHJ1bm5pbmdcblxuXG4gICAgb2xkU3RyaW5nID0gdGhpcy5jYXN0SW5wdXQob2xkU3RyaW5nKTtcbiAgICBuZXdTdHJpbmcgPSB0aGlzLmNhc3RJbnB1dChuZXdTdHJpbmcpO1xuICAgIG9sZFN0cmluZyA9IHRoaXMucmVtb3ZlRW1wdHkodGhpcy50b2tlbml6ZShvbGRTdHJpbmcpKTtcbiAgICBuZXdTdHJpbmcgPSB0aGlzLnJlbW92ZUVtcHR5KHRoaXMudG9rZW5pemUobmV3U3RyaW5nKSk7XG4gICAgdmFyIG5ld0xlbiA9IG5ld1N0cmluZy5sZW5ndGgsXG4gICAgICAgIG9sZExlbiA9IG9sZFN0cmluZy5sZW5ndGg7XG4gICAgdmFyIGVkaXRMZW5ndGggPSAxO1xuICAgIHZhciBtYXhFZGl0TGVuZ3RoID0gbmV3TGVuICsgb2xkTGVuO1xuXG4gICAgaWYgKG9wdGlvbnMubWF4RWRpdExlbmd0aCkge1xuICAgICAgbWF4RWRpdExlbmd0aCA9IE1hdGgubWluKG1heEVkaXRMZW5ndGgsIG9wdGlvbnMubWF4RWRpdExlbmd0aCk7XG4gICAgfVxuXG4gICAgdmFyIG1heEV4ZWN1dGlvblRpbWUgPVxuICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICAoX29wdGlvbnMkdGltZW91dCA9XG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgICBvcHRpb25zLnRpbWVvdXQpICE9PSBudWxsICYmIF9vcHRpb25zJHRpbWVvdXQgIT09IHZvaWQgMCA/IF9vcHRpb25zJHRpbWVvdXQgOiBJbmZpbml0eTtcbiAgICB2YXIgYWJvcnRBZnRlclRpbWVzdGFtcCA9IERhdGUubm93KCkgKyBtYXhFeGVjdXRpb25UaW1lO1xuICAgIHZhciBiZXN0UGF0aCA9IFt7XG4gICAgICBvbGRQb3M6IC0xLFxuICAgICAgbGFzdENvbXBvbmVudDogdW5kZWZpbmVkXG4gICAgfV07IC8vIFNlZWQgZWRpdExlbmd0aCA9IDAsIGkuZS4gdGhlIGNvbnRlbnQgc3RhcnRzIHdpdGggdGhlIHNhbWUgdmFsdWVzXG5cbiAgICB2YXIgbmV3UG9zID0gdGhpcy5leHRyYWN0Q29tbW9uKGJlc3RQYXRoWzBdLCBuZXdTdHJpbmcsIG9sZFN0cmluZywgMCk7XG5cbiAgICBpZiAoYmVzdFBhdGhbMF0ub2xkUG9zICsgMSA+PSBvbGRMZW4gJiYgbmV3UG9zICsgMSA+PSBuZXdMZW4pIHtcbiAgICAgIC8vIElkZW50aXR5IHBlciB0aGUgZXF1YWxpdHkgYW5kIHRva2VuaXplclxuICAgICAgcmV0dXJuIGRvbmUoW3tcbiAgICAgICAgdmFsdWU6IHRoaXMuam9pbihuZXdTdHJpbmcpLFxuICAgICAgICBjb3VudDogbmV3U3RyaW5nLmxlbmd0aFxuICAgICAgfV0pO1xuICAgIH0gLy8gT25jZSB3ZSBoaXQgdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIGVkaXQgZ3JhcGggb24gc29tZSBkaWFnb25hbCBrLCB3ZSBjYW5cbiAgICAvLyBkZWZpbml0ZWx5IHJlYWNoIHRoZSBlbmQgb2YgdGhlIGVkaXQgZ3JhcGggaW4gbm8gbW9yZSB0aGFuIGsgZWRpdHMsIHNvXG4gICAgLy8gdGhlcmUncyBubyBwb2ludCBpbiBjb25zaWRlcmluZyBhbnkgbW92ZXMgdG8gZGlhZ29uYWwgaysxIGFueSBtb3JlIChmcm9tXG4gICAgLy8gd2hpY2ggd2UncmUgZ3VhcmFudGVlZCB0byBuZWVkIGF0IGxlYXN0IGsrMSBtb3JlIGVkaXRzKS5cbiAgICAvLyBTaW1pbGFybHksIG9uY2Ugd2UndmUgcmVhY2hlZCB0aGUgYm90dG9tIG9mIHRoZSBlZGl0IGdyYXBoLCB0aGVyZSdzIG5vXG4gICAgLy8gcG9pbnQgY29uc2lkZXJpbmcgbW92ZXMgdG8gbG93ZXIgZGlhZ29uYWxzLlxuICAgIC8vIFdlIHJlY29yZCB0aGlzIGZhY3QgYnkgc2V0dGluZyBtaW5EaWFnb25hbFRvQ29uc2lkZXIgYW5kXG4gICAgLy8gbWF4RGlhZ29uYWxUb0NvbnNpZGVyIHRvIHNvbWUgZmluaXRlIHZhbHVlIG9uY2Ugd2UndmUgaGl0IHRoZSBlZGdlIG9mXG4gICAgLy8gdGhlIGVkaXQgZ3JhcGguXG4gICAgLy8gVGhpcyBvcHRpbWl6YXRpb24gaXMgbm90IGZhaXRoZnVsIHRvIHRoZSBvcmlnaW5hbCBhbGdvcml0aG0gcHJlc2VudGVkIGluXG4gICAgLy8gTXllcnMncyBwYXBlciwgd2hpY2ggaW5zdGVhZCBwb2ludGxlc3NseSBleHRlbmRzIEQtcGF0aHMgb2ZmIHRoZSBlbmQgb2ZcbiAgICAvLyB0aGUgZWRpdCBncmFwaCAtIHNlZSBwYWdlIDcgb2YgTXllcnMncyBwYXBlciB3aGljaCBub3RlcyB0aGlzIHBvaW50XG4gICAgLy8gZXhwbGljaXRseSBhbmQgaWxsdXN0cmF0ZXMgaXQgd2l0aCBhIGRpYWdyYW0uIFRoaXMgaGFzIG1ham9yIHBlcmZvcm1hbmNlXG4gICAgLy8gaW1wbGljYXRpb25zIGZvciBzb21lIGNvbW1vbiBzY2VuYXJpb3MuIEZvciBpbnN0YW5jZSwgdG8gY29tcHV0ZSBhIGRpZmZcbiAgICAvLyB3aGVyZSB0aGUgbmV3IHRleHQgc2ltcGx5IGFwcGVuZHMgZCBjaGFyYWN0ZXJzIG9uIHRoZSBlbmQgb2YgdGhlXG4gICAgLy8gb3JpZ2luYWwgdGV4dCBvZiBsZW5ndGggbiwgdGhlIHRydWUgTXllcnMgYWxnb3JpdGhtIHdpbGwgdGFrZSBPKG4rZF4yKVxuICAgIC8vIHRpbWUgd2hpbGUgdGhpcyBvcHRpbWl6YXRpb24gbmVlZHMgb25seSBPKG4rZCkgdGltZS5cblxuXG4gICAgdmFyIG1pbkRpYWdvbmFsVG9Db25zaWRlciA9IC1JbmZpbml0eSxcbiAgICAgICAgbWF4RGlhZ29uYWxUb0NvbnNpZGVyID0gSW5maW5pdHk7IC8vIE1haW4gd29ya2VyIG1ldGhvZC4gY2hlY2tzIGFsbCBwZXJtdXRhdGlvbnMgb2YgYSBnaXZlbiBlZGl0IGxlbmd0aCBmb3IgYWNjZXB0YW5jZS5cblxuICAgIGZ1bmN0aW9uIGV4ZWNFZGl0TGVuZ3RoKCkge1xuICAgICAgZm9yICh2YXIgZGlhZ29uYWxQYXRoID0gTWF0aC5tYXgobWluRGlhZ29uYWxUb0NvbnNpZGVyLCAtZWRpdExlbmd0aCk7IGRpYWdvbmFsUGF0aCA8PSBNYXRoLm1pbihtYXhEaWFnb25hbFRvQ29uc2lkZXIsIGVkaXRMZW5ndGgpOyBkaWFnb25hbFBhdGggKz0gMikge1xuICAgICAgICB2YXIgYmFzZVBhdGggPVxuICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICAgICAgIHZvaWQgMFxuICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgICAgICA7XG4gICAgICAgIHZhciByZW1vdmVQYXRoID0gYmVzdFBhdGhbZGlhZ29uYWxQYXRoIC0gMV0sXG4gICAgICAgICAgICBhZGRQYXRoID0gYmVzdFBhdGhbZGlhZ29uYWxQYXRoICsgMV07XG5cbiAgICAgICAgaWYgKHJlbW92ZVBhdGgpIHtcbiAgICAgICAgICAvLyBObyBvbmUgZWxzZSBpcyBnb2luZyB0byBhdHRlbXB0IHRvIHVzZSB0aGlzIHZhbHVlLCBjbGVhciBpdFxuICAgICAgICAgIGJlc3RQYXRoW2RpYWdvbmFsUGF0aCAtIDFdID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNhbkFkZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChhZGRQYXRoKSB7XG4gICAgICAgICAgLy8gd2hhdCBuZXdQb3Mgd2lsbCBiZSBhZnRlciB3ZSBkbyBhbiBpbnNlcnRpb246XG4gICAgICAgICAgdmFyIGFkZFBhdGhOZXdQb3MgPSBhZGRQYXRoLm9sZFBvcyAtIGRpYWdvbmFsUGF0aDtcbiAgICAgICAgICBjYW5BZGQgPSBhZGRQYXRoICYmIDAgPD0gYWRkUGF0aE5ld1BvcyAmJiBhZGRQYXRoTmV3UG9zIDwgbmV3TGVuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNhblJlbW92ZSA9IHJlbW92ZVBhdGggJiYgcmVtb3ZlUGF0aC5vbGRQb3MgKyAxIDwgb2xkTGVuO1xuXG4gICAgICAgIGlmICghY2FuQWRkICYmICFjYW5SZW1vdmUpIHtcbiAgICAgICAgICAvLyBJZiB0aGlzIHBhdGggaXMgYSB0ZXJtaW5hbCB0aGVuIHBydW5lXG4gICAgICAgICAgYmVzdFBhdGhbZGlhZ29uYWxQYXRoXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSAvLyBTZWxlY3QgdGhlIGRpYWdvbmFsIHRoYXQgd2Ugd2FudCB0byBicmFuY2ggZnJvbS4gV2Ugc2VsZWN0IHRoZSBwcmlvclxuICAgICAgICAvLyBwYXRoIHdob3NlIHBvc2l0aW9uIGluIHRoZSBvbGQgc3RyaW5nIGlzIHRoZSBmYXJ0aGVzdCBmcm9tIHRoZSBvcmlnaW5cbiAgICAgICAgLy8gYW5kIGRvZXMgbm90IHBhc3MgdGhlIGJvdW5kcyBvZiB0aGUgZGlmZiBncmFwaFxuICAgICAgICAvLyBUT0RPOiBSZW1vdmUgdGhlIGArIDFgIGhlcmUgdG8gbWFrZSBiZWhhdmlvciBtYXRjaCBNeWVycyBhbGdvcml0aG1cbiAgICAgICAgLy8gICAgICAgYW5kIHByZWZlciB0byBvcmRlciByZW1vdmFscyBiZWZvcmUgaW5zZXJ0aW9ucy5cblxuXG4gICAgICAgIGlmICghY2FuUmVtb3ZlIHx8IGNhbkFkZCAmJiByZW1vdmVQYXRoLm9sZFBvcyArIDEgPCBhZGRQYXRoLm9sZFBvcykge1xuICAgICAgICAgIGJhc2VQYXRoID0gc2VsZi5hZGRUb1BhdGgoYWRkUGF0aCwgdHJ1ZSwgdW5kZWZpbmVkLCAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBiYXNlUGF0aCA9IHNlbGYuYWRkVG9QYXRoKHJlbW92ZVBhdGgsIHVuZGVmaW5lZCwgdHJ1ZSwgMSk7XG4gICAgICAgIH1cblxuICAgICAgICBuZXdQb3MgPSBzZWxmLmV4dHJhY3RDb21tb24oYmFzZVBhdGgsIG5ld1N0cmluZywgb2xkU3RyaW5nLCBkaWFnb25hbFBhdGgpO1xuXG4gICAgICAgIGlmIChiYXNlUGF0aC5vbGRQb3MgKyAxID49IG9sZExlbiAmJiBuZXdQb3MgKyAxID49IG5ld0xlbikge1xuICAgICAgICAgIC8vIElmIHdlIGhhdmUgaGl0IHRoZSBlbmQgb2YgYm90aCBzdHJpbmdzLCB0aGVuIHdlIGFyZSBkb25lXG4gICAgICAgICAgcmV0dXJuIGRvbmUoYnVpbGRWYWx1ZXMoc2VsZiwgYmFzZVBhdGgubGFzdENvbXBvbmVudCwgbmV3U3RyaW5nLCBvbGRTdHJpbmcsIHNlbGYudXNlTG9uZ2VzdFRva2VuKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYmVzdFBhdGhbZGlhZ29uYWxQYXRoXSA9IGJhc2VQYXRoO1xuXG4gICAgICAgICAgaWYgKGJhc2VQYXRoLm9sZFBvcyArIDEgPj0gb2xkTGVuKSB7XG4gICAgICAgICAgICBtYXhEaWFnb25hbFRvQ29uc2lkZXIgPSBNYXRoLm1pbihtYXhEaWFnb25hbFRvQ29uc2lkZXIsIGRpYWdvbmFsUGF0aCAtIDEpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChuZXdQb3MgKyAxID49IG5ld0xlbikge1xuICAgICAgICAgICAgbWluRGlhZ29uYWxUb0NvbnNpZGVyID0gTWF0aC5tYXgobWluRGlhZ29uYWxUb0NvbnNpZGVyLCBkaWFnb25hbFBhdGggKyAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZWRpdExlbmd0aCsrO1xuICAgIH0gLy8gUGVyZm9ybXMgdGhlIGxlbmd0aCBvZiBlZGl0IGl0ZXJhdGlvbi4gSXMgYSBiaXQgZnVnbHkgYXMgdGhpcyBoYXMgdG8gc3VwcG9ydCB0aGVcbiAgICAvLyBzeW5jIGFuZCBhc3luYyBtb2RlIHdoaWNoIGlzIG5ldmVyIGZ1bi4gTG9vcHMgb3ZlciBleGVjRWRpdExlbmd0aCB1bnRpbCBhIHZhbHVlXG4gICAgLy8gaXMgcHJvZHVjZWQsIG9yIHVudGlsIHRoZSBlZGl0IGxlbmd0aCBleGNlZWRzIG9wdGlvbnMubWF4RWRpdExlbmd0aCAoaWYgZ2l2ZW4pLFxuICAgIC8vIGluIHdoaWNoIGNhc2UgaXQgd2lsbCByZXR1cm4gdW5kZWZpbmVkLlxuXG5cbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIChmdW5jdGlvbiBleGVjKCkge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoZWRpdExlbmd0aCA+IG1heEVkaXRMZW5ndGggfHwgRGF0ZS5ub3coKSA+IGFib3J0QWZ0ZXJUaW1lc3RhbXApIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghZXhlY0VkaXRMZW5ndGgoKSkge1xuICAgICAgICAgICAgZXhlYygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgMCk7XG4gICAgICB9KSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aGlsZSAoZWRpdExlbmd0aCA8PSBtYXhFZGl0TGVuZ3RoICYmIERhdGUubm93KCkgPD0gYWJvcnRBZnRlclRpbWVzdGFtcCkge1xuICAgICAgICB2YXIgcmV0ID0gZXhlY0VkaXRMZW5ndGgoKTtcblxuICAgICAgICBpZiAocmV0KSB7XG4gICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5cbiAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgYWRkVG9QYXRoOiBmdW5jdGlvbiBhZGRUb1BhdGgocGF0aCwgYWRkZWQsIHJlbW92ZWQsIG9sZFBvc0luYykge1xuICAgIHZhciBsYXN0ID0gcGF0aC5sYXN0Q29tcG9uZW50O1xuXG4gICAgaWYgKGxhc3QgJiYgbGFzdC5hZGRlZCA9PT0gYWRkZWQgJiYgbGFzdC5yZW1vdmVkID09PSByZW1vdmVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvbGRQb3M6IHBhdGgub2xkUG9zICsgb2xkUG9zSW5jLFxuICAgICAgICBsYXN0Q29tcG9uZW50OiB7XG4gICAgICAgICAgY291bnQ6IGxhc3QuY291bnQgKyAxLFxuICAgICAgICAgIGFkZGVkOiBhZGRlZCxcbiAgICAgICAgICByZW1vdmVkOiByZW1vdmVkLFxuICAgICAgICAgIHByZXZpb3VzQ29tcG9uZW50OiBsYXN0LnByZXZpb3VzQ29tcG9uZW50XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9sZFBvczogcGF0aC5vbGRQb3MgKyBvbGRQb3NJbmMsXG4gICAgICAgIGxhc3RDb21wb25lbnQ6IHtcbiAgICAgICAgICBjb3VudDogMSxcbiAgICAgICAgICBhZGRlZDogYWRkZWQsXG4gICAgICAgICAgcmVtb3ZlZDogcmVtb3ZlZCxcbiAgICAgICAgICBwcmV2aW91c0NvbXBvbmVudDogbGFzdFxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfSxcblxuICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5cbiAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgZXh0cmFjdENvbW1vbjogZnVuY3Rpb24gZXh0cmFjdENvbW1vbihiYXNlUGF0aCwgbmV3U3RyaW5nLCBvbGRTdHJpbmcsIGRpYWdvbmFsUGF0aCkge1xuICAgIHZhciBuZXdMZW4gPSBuZXdTdHJpbmcubGVuZ3RoLFxuICAgICAgICBvbGRMZW4gPSBvbGRTdHJpbmcubGVuZ3RoLFxuICAgICAgICBvbGRQb3MgPSBiYXNlUGF0aC5vbGRQb3MsXG4gICAgICAgIG5ld1BvcyA9IG9sZFBvcyAtIGRpYWdvbmFsUGF0aCxcbiAgICAgICAgY29tbW9uQ291bnQgPSAwO1xuXG4gICAgd2hpbGUgKG5ld1BvcyArIDEgPCBuZXdMZW4gJiYgb2xkUG9zICsgMSA8IG9sZExlbiAmJiB0aGlzLmVxdWFscyhuZXdTdHJpbmdbbmV3UG9zICsgMV0sIG9sZFN0cmluZ1tvbGRQb3MgKyAxXSkpIHtcbiAgICAgIG5ld1BvcysrO1xuICAgICAgb2xkUG9zKys7XG4gICAgICBjb21tb25Db3VudCsrO1xuICAgIH1cblxuICAgIGlmIChjb21tb25Db3VudCkge1xuICAgICAgYmFzZVBhdGgubGFzdENvbXBvbmVudCA9IHtcbiAgICAgICAgY291bnQ6IGNvbW1vbkNvdW50LFxuICAgICAgICBwcmV2aW91c0NvbXBvbmVudDogYmFzZVBhdGgubGFzdENvbXBvbmVudFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBiYXNlUGF0aC5vbGRQb3MgPSBvbGRQb3M7XG4gICAgcmV0dXJuIG5ld1BvcztcbiAgfSxcblxuICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5cbiAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgZXF1YWxzOiBmdW5jdGlvbiBlcXVhbHMobGVmdCwgcmlnaHQpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmNvbXBhcmF0b3IpIHtcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuY29tcGFyYXRvcihsZWZ0LCByaWdodCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBsZWZ0ID09PSByaWdodCB8fCB0aGlzLm9wdGlvbnMuaWdub3JlQ2FzZSAmJiBsZWZ0LnRvTG93ZXJDYXNlKCkgPT09IHJpZ2h0LnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICB9LFxuXG4gIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cblxuICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICByZW1vdmVFbXB0eTogZnVuY3Rpb24gcmVtb3ZlRW1wdHkoYXJyYXkpIHtcbiAgICB2YXIgcmV0ID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYXJyYXlbaV0pIHtcbiAgICAgICAgcmV0LnB1c2goYXJyYXlbaV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXQ7XG4gIH0sXG5cbiAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuXG4gIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gIGNhc3RJbnB1dDogZnVuY3Rpb24gY2FzdElucHV0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9LFxuXG4gIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cblxuICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICB0b2tlbml6ZTogZnVuY3Rpb24gdG9rZW5pemUodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUuc3BsaXQoJycpO1xuICB9LFxuXG4gIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cblxuICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICBqb2luOiBmdW5jdGlvbiBqb2luKGNoYXJzKSB7XG4gICAgcmV0dXJuIGNoYXJzLmpvaW4oJycpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBidWlsZFZhbHVlcyhkaWZmLCBsYXN0Q29tcG9uZW50LCBuZXdTdHJpbmcsIG9sZFN0cmluZywgdXNlTG9uZ2VzdFRva2VuKSB7XG4gIC8vIEZpcnN0IHdlIGNvbnZlcnQgb3VyIGxpbmtlZCBsaXN0IG9mIGNvbXBvbmVudHMgaW4gcmV2ZXJzZSBvcmRlciB0byBhblxuICAvLyBhcnJheSBpbiB0aGUgcmlnaHQgb3JkZXI6XG4gIHZhciBjb21wb25lbnRzID0gW107XG4gIHZhciBuZXh0Q29tcG9uZW50O1xuXG4gIHdoaWxlIChsYXN0Q29tcG9uZW50KSB7XG4gICAgY29tcG9uZW50cy5wdXNoKGxhc3RDb21wb25lbnQpO1xuICAgIG5leHRDb21wb25lbnQgPSBsYXN0Q29tcG9uZW50LnByZXZpb3VzQ29tcG9uZW50O1xuICAgIGRlbGV0ZSBsYXN0Q29tcG9uZW50LnByZXZpb3VzQ29tcG9uZW50O1xuICAgIGxhc3RDb21wb25lbnQgPSBuZXh0Q29tcG9uZW50O1xuICB9XG5cbiAgY29tcG9uZW50cy5yZXZlcnNlKCk7XG4gIHZhciBjb21wb25lbnRQb3MgPSAwLFxuICAgICAgY29tcG9uZW50TGVuID0gY29tcG9uZW50cy5sZW5ndGgsXG4gICAgICBuZXdQb3MgPSAwLFxuICAgICAgb2xkUG9zID0gMDtcblxuICBmb3IgKDsgY29tcG9uZW50UG9zIDwgY29tcG9uZW50TGVuOyBjb21wb25lbnRQb3MrKykge1xuICAgIHZhciBjb21wb25lbnQgPSBjb21wb25lbnRzW2NvbXBvbmVudFBvc107XG5cbiAgICBpZiAoIWNvbXBvbmVudC5yZW1vdmVkKSB7XG4gICAgICBpZiAoIWNvbXBvbmVudC5hZGRlZCAmJiB1c2VMb25nZXN0VG9rZW4pIHtcbiAgICAgICAgdmFyIHZhbHVlID0gbmV3U3RyaW5nLnNsaWNlKG5ld1BvcywgbmV3UG9zICsgY29tcG9uZW50LmNvdW50KTtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5tYXAoZnVuY3Rpb24gKHZhbHVlLCBpKSB7XG4gICAgICAgICAgdmFyIG9sZFZhbHVlID0gb2xkU3RyaW5nW29sZFBvcyArIGldO1xuICAgICAgICAgIHJldHVybiBvbGRWYWx1ZS5sZW5ndGggPiB2YWx1ZS5sZW5ndGggPyBvbGRWYWx1ZSA6IHZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgICAgY29tcG9uZW50LnZhbHVlID0gZGlmZi5qb2luKHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBvbmVudC52YWx1ZSA9IGRpZmYuam9pbihuZXdTdHJpbmcuc2xpY2UobmV3UG9zLCBuZXdQb3MgKyBjb21wb25lbnQuY291bnQpKTtcbiAgICAgIH1cblxuICAgICAgbmV3UG9zICs9IGNvbXBvbmVudC5jb3VudDsgLy8gQ29tbW9uIGNhc2VcblxuICAgICAgaWYgKCFjb21wb25lbnQuYWRkZWQpIHtcbiAgICAgICAgb2xkUG9zICs9IGNvbXBvbmVudC5jb3VudDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29tcG9uZW50LnZhbHVlID0gZGlmZi5qb2luKG9sZFN0cmluZy5zbGljZShvbGRQb3MsIG9sZFBvcyArIGNvbXBvbmVudC5jb3VudCkpO1xuICAgICAgb2xkUG9zICs9IGNvbXBvbmVudC5jb3VudDsgLy8gUmV2ZXJzZSBhZGQgYW5kIHJlbW92ZSBzbyByZW1vdmVzIGFyZSBvdXRwdXQgZmlyc3QgdG8gbWF0Y2ggY29tbW9uIGNvbnZlbnRpb25cbiAgICAgIC8vIFRoZSBkaWZmaW5nIGFsZ29yaXRobSBpcyB0aWVkIHRvIGFkZCB0aGVuIHJlbW92ZSBvdXRwdXQgYW5kIHRoaXMgaXMgdGhlIHNpbXBsZXN0XG4gICAgICAvLyByb3V0ZSB0byBnZXQgdGhlIGRlc2lyZWQgb3V0cHV0IHdpdGggbWluaW1hbCBvdmVyaGVhZC5cblxuICAgICAgaWYgKGNvbXBvbmVudFBvcyAmJiBjb21wb25lbnRzW2NvbXBvbmVudFBvcyAtIDFdLmFkZGVkKSB7XG4gICAgICAgIHZhciB0bXAgPSBjb21wb25lbnRzW2NvbXBvbmVudFBvcyAtIDFdO1xuICAgICAgICBjb21wb25lbnRzW2NvbXBvbmVudFBvcyAtIDFdID0gY29tcG9uZW50c1tjb21wb25lbnRQb3NdO1xuICAgICAgICBjb21wb25lbnRzW2NvbXBvbmVudFBvc10gPSB0bXA7XG4gICAgICB9XG4gICAgfVxuICB9IC8vIFNwZWNpYWwgY2FzZSBoYW5kbGUgZm9yIHdoZW4gb25lIHRlcm1pbmFsIGlzIGlnbm9yZWQgKGkuZS4gd2hpdGVzcGFjZSkuXG4gIC8vIEZvciB0aGlzIGNhc2Ugd2UgbWVyZ2UgdGhlIHRlcm1pbmFsIGludG8gdGhlIHByaW9yIHN0cmluZyBhbmQgZHJvcCB0aGUgY2hhbmdlLlxuICAvLyBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBzdHJpbmcgbW9kZS5cblxuXG4gIHZhciBmaW5hbENvbXBvbmVudCA9IGNvbXBvbmVudHNbY29tcG9uZW50TGVuIC0gMV07XG5cbiAgaWYgKGNvbXBvbmVudExlbiA+IDEgJiYgdHlwZW9mIGZpbmFsQ29tcG9uZW50LnZhbHVlID09PSAnc3RyaW5nJyAmJiAoZmluYWxDb21wb25lbnQuYWRkZWQgfHwgZmluYWxDb21wb25lbnQucmVtb3ZlZCkgJiYgZGlmZi5lcXVhbHMoJycsIGZpbmFsQ29tcG9uZW50LnZhbHVlKSkge1xuICAgIGNvbXBvbmVudHNbY29tcG9uZW50TGVuIC0gMl0udmFsdWUgKz0gZmluYWxDb21wb25lbnQudmFsdWU7XG4gICAgY29tcG9uZW50cy5wb3AoKTtcbiAgfVxuXG4gIHJldHVybiBjb21wb25lbnRzO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMM055WXk5a2FXWm1MMkpoYzJVdWFuTWlYU3dpYm1GdFpYTWlPbHNpUkdsbVppSXNJbkJ5YjNSdmRIbHdaU0lzSW1ScFptWWlMQ0p2YkdSVGRISnBibWNpTENKdVpYZFRkSEpwYm1jaUxDSnZjSFJwYjI1eklpd2lZMkZzYkdKaFkyc2lMQ0p6Wld4bUlpd2laRzl1WlNJc0luWmhiSFZsSWl3aWMyVjBWR2x0Wlc5MWRDSXNJblZ1WkdWbWFXNWxaQ0lzSW1OaGMzUkpibkIxZENJc0luSmxiVzkyWlVWdGNIUjVJaXdpZEc5clpXNXBlbVVpTENKdVpYZE1aVzRpTENKc1pXNW5kR2dpTENKdmJHUk1aVzRpTENKbFpHbDBUR1Z1WjNSb0lpd2liV0Y0UldScGRFeGxibWQwYUNJc0lrMWhkR2dpTENKdGFXNGlMQ0p0WVhoRmVHVmpkWFJwYjI1VWFXMWxJaXdpZEdsdFpXOTFkQ0lzSWtsdVptbHVhWFI1SWl3aVlXSnZjblJCWm5SbGNsUnBiV1Z6ZEdGdGNDSXNJa1JoZEdVaUxDSnViM2NpTENKaVpYTjBVR0YwYUNJc0ltOXNaRkJ2Y3lJc0lteGhjM1JEYjIxd2IyNWxiblFpTENKdVpYZFFiM01pTENKbGVIUnlZV04wUTI5dGJXOXVJaXdpYW05cGJpSXNJbU52ZFc1MElpd2liV2x1UkdsaFoyOXVZV3hVYjBOdmJuTnBaR1Z5SWl3aWJXRjRSR2xoWjI5dVlXeFViME52Ym5OcFpHVnlJaXdpWlhobFkwVmthWFJNWlc1bmRHZ2lMQ0prYVdGbmIyNWhiRkJoZEdnaUxDSnRZWGdpTENKaVlYTmxVR0YwYUNJc0luSmxiVzkyWlZCaGRHZ2lMQ0poWkdSUVlYUm9JaXdpWTJGdVFXUmtJaXdpWVdSa1VHRjBhRTVsZDFCdmN5SXNJbU5oYmxKbGJXOTJaU0lzSW1Ga1pGUnZVR0YwYUNJc0ltSjFhV3hrVm1Gc2RXVnpJaXdpZFhObFRHOXVaMlZ6ZEZSdmEyVnVJaXdpWlhobFl5SXNJbkpsZENJc0luQmhkR2dpTENKaFpHUmxaQ0lzSW5KbGJXOTJaV1FpTENKdmJHUlFiM05KYm1NaUxDSnNZWE4wSWl3aWNISmxkbWx2ZFhORGIyMXdiMjVsYm5RaUxDSmpiMjF0YjI1RGIzVnVkQ0lzSW1WeGRXRnNjeUlzSW14bFpuUWlMQ0p5YVdkb2RDSXNJbU52YlhCaGNtRjBiM0lpTENKcFoyNXZjbVZEWVhObElpd2lkRzlNYjNkbGNrTmhjMlVpTENKaGNuSmhlU0lzSW1raUxDSndkWE5vSWl3aWMzQnNhWFFpTENKamFHRnljeUlzSW1OdmJYQnZibVZ1ZEhNaUxDSnVaWGgwUTI5dGNHOXVaVzUwSWl3aWNtVjJaWEp6WlNJc0ltTnZiWEJ2Ym1WdWRGQnZjeUlzSW1OdmJYQnZibVZ1ZEV4bGJpSXNJbU52YlhCdmJtVnVkQ0lzSW5Oc2FXTmxJaXdpYldGd0lpd2liMnhrVm1Gc2RXVWlMQ0owYlhBaUxDSm1hVzVoYkVOdmJYQnZibVZ1ZENJc0luQnZjQ0pkTENKdFlYQndhVzVuY3lJNklqczdPenM3T3pzN08wRkJRV1VzVTBGQlUwRXNTVUZCVkN4SFFVRm5RaXhEUVVGRk96dEJRVVZxUTBFc1NVRkJTU3hEUVVGRFF5eFRRVUZNTEVkQlFXbENPMEZCUVVFN08wRkJRVUU3UVVGRFprTXNSVUZCUVVFc1NVRkVaU3huUWtGRFZrTXNVMEZFVlN4RlFVTkRReXhUUVVSRUxFVkJRekJDTzBGQlFVRTdRVUZCUVRzN1FVRkJRVHRCUVVGQk8wRkJRV1JETEVsQlFVRkJMRTlCUVdNc2RVVkJRVW9zUlVGQlNUdEJRVU4yUXl4UlFVRkpReXhSUVVGUkxFZEJRVWRFTEU5QlFVOHNRMEZCUTBNc1VVRkJka0k3TzBGQlEwRXNVVUZCU1N4UFFVRlBSQ3hQUVVGUUxFdEJRVzFDTEZWQlFYWkNMRVZCUVcxRE8wRkJRMnBEUXl4TlFVRkJRU3hSUVVGUkxFZEJRVWRFTEU5QlFWZzdRVUZEUVVFc1RVRkJRVUVzVDBGQlR5eEhRVUZITEVWQlFWWTdRVUZEUkRzN1FVRkRSQ3hUUVVGTFFTeFBRVUZNTEVkQlFXVkJMRTlCUVdZN1FVRkZRU3hSUVVGSlJTeEpRVUZKTEVkQlFVY3NTVUZCV0RzN1FVRkZRU3hoUVVGVFF5eEpRVUZVTEVOQlFXTkRMRXRCUVdRc1JVRkJjVUk3UVVGRGJrSXNWVUZCU1Vnc1VVRkJTaXhGUVVGak8wRkJRMXBKTEZGQlFVRkJMRlZCUVZVc1EwRkJReXhaUVVGWE8wRkJRVVZLTEZWQlFVRkJMRkZCUVZFc1EwRkJRMHNzVTBGQlJDeEZRVUZaUml4TFFVRmFMRU5CUVZJN1FVRkJOa0lzVTBGQk0wTXNSVUZCTmtNc1EwRkJOME1zUTBGQlZqdEJRVU5CTEdWQlFVOHNTVUZCVUR0QlFVTkVMRTlCU0VRc1RVRkhUenRCUVVOTUxHVkJRVTlCTEV0QlFWQTdRVUZEUkR0QlFVTkdMRXRCYWtKelF5eERRVzFDZGtNN096dEJRVU5CVGl4SlFVRkJRU3hUUVVGVExFZEJRVWNzUzBGQlMxTXNVMEZCVEN4RFFVRmxWQ3hUUVVGbUxFTkJRVm83UVVGRFFVTXNTVUZCUVVFc1UwRkJVeXhIUVVGSExFdEJRVXRSTEZOQlFVd3NRMEZCWlZJc1UwRkJaaXhEUVVGYU8wRkJSVUZFTEVsQlFVRkJMRk5CUVZNc1IwRkJSeXhMUVVGTFZTeFhRVUZNTEVOQlFXbENMRXRCUVV0RExGRkJRVXdzUTBGQlkxZ3NVMEZCWkN4RFFVRnFRaXhEUVVGYU8wRkJRMEZETEVsQlFVRkJMRk5CUVZNc1IwRkJSeXhMUVVGTFV5eFhRVUZNTEVOQlFXbENMRXRCUVV0RExGRkJRVXdzUTBGQlkxWXNVMEZCWkN4RFFVRnFRaXhEUVVGYU8wRkJSVUVzVVVGQlNWY3NUVUZCVFN4SFFVRkhXQ3hUUVVGVExFTkJRVU5aTEUxQlFYWkNPMEZCUVVFc1VVRkJLMEpETEUxQlFVMHNSMEZCUjJRc1UwRkJVeXhEUVVGRFlTeE5RVUZzUkR0QlFVTkJMRkZCUVVsRkxGVkJRVlVzUjBGQlJ5eERRVUZxUWp0QlFVTkJMRkZCUVVsRExHRkJRV0VzUjBGQlIwb3NUVUZCVFN4SFFVRkhSU3hOUVVFM1FqczdRVUZEUVN4UlFVRkhXaXhQUVVGUExFTkJRVU5qTEdGQlFWZ3NSVUZCTUVJN1FVRkRlRUpCTEUxQlFVRkJMR0ZCUVdFc1IwRkJSME1zU1VGQlNTeERRVUZEUXl4SFFVRk1MRU5CUVZOR0xHRkJRVlFzUlVGQmQwSmtMRTlCUVU4c1EwRkJRMk1zWVVGQmFFTXNRMEZCYUVJN1FVRkRSRHM3UVVGRFJDeFJRVUZOUnl4blFrRkJaMEk3UVVGQlFUdEJRVUZCTzBGQlFVRTdRVUZCUjJwQ0xFbEJRVUZCTEU5QlFVOHNRMEZCUTJ0Q0xFOUJRVmdzSzBSQlFYTkNReXhSUVVFMVF6dEJRVU5CTEZGQlFVMURMRzFDUVVGdFFpeEhRVUZIUXl4SlFVRkpMRU5CUVVORExFZEJRVXdzUzBGQllVd3NaMEpCUVhwRE8wRkJSVUVzVVVGQlNVMHNVVUZCVVN4SFFVRkhMRU5CUVVNN1FVRkJSVU1zVFVGQlFVRXNUVUZCVFN4RlFVRkZMRU5CUVVNc1EwRkJXRHRCUVVGalF5eE5RVUZCUVN4aFFVRmhMRVZCUVVWdVFqdEJRVUUzUWl4TFFVRkVMRU5CUVdZc1EwRnVRM1ZETEVOQmNVTjJRenM3UVVGRFFTeFJRVUZKYjBJc1RVRkJUU3hIUVVGSExFdEJRVXRETEdGQlFVd3NRMEZCYlVKS0xGRkJRVkVzUTBGQlF5eERRVUZFTEVOQlFUTkNMRVZCUVdkRGVFSXNVMEZCYUVNc1JVRkJNa05FTEZOQlFUTkRMRVZCUVhORUxFTkJRWFJFTEVOQlFXSTdPMEZCUTBFc1VVRkJTWGxDTEZGQlFWRXNRMEZCUXl4RFFVRkVMRU5CUVZJc1EwRkJXVU1zVFVGQldpeEhRVUZ4UWl4RFFVRnlRaXhKUVVFd1Fsb3NUVUZCTVVJc1NVRkJiME5qTEUxQlFVMHNSMEZCUnl4RFFVRlVMRWxCUVdOb1FpeE5RVUYwUkN4RlFVRTRSRHRCUVVNMVJEdEJRVU5CTEdGQlFVOVFMRWxCUVVrc1EwRkJReXhEUVVGRE8wRkJRVU5ETEZGQlFVRkJMRXRCUVVzc1JVRkJSU3hMUVVGTGQwSXNTVUZCVEN4RFFVRlZOMElzVTBGQlZpeERRVUZTTzBGQlFUaENPRUlzVVVGQlFVRXNTMEZCU3l4RlFVRkZPVUlzVTBGQlV5eERRVUZEV1R0QlFVRXZReXhQUVVGRUxFTkJRVVFzUTBGQldEdEJRVU5FTEV0Qk1VTnpReXhEUVRSRGRrTTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUczdPMEZCUTBFc1VVRkJTVzFDTEhGQ1FVRnhRaXhIUVVGSExFTkJRVU5ZTEZGQlFUZENPMEZCUVVFc1VVRkJkVU5aTEhGQ1FVRnhRaXhIUVVGSFdpeFJRVUV2UkN4RFFUZEVkVU1zUTBFclJIWkRPenRCUVVOQkxHRkJRVk5oTEdOQlFWUXNSMEZCTUVJN1FVRkRlRUlzVjBGRFJTeEpRVUZKUXl4WlFVRlpMRWRCUVVkc1FpeEpRVUZKTEVOQlFVTnRRaXhIUVVGTUxFTkJRVk5LTEhGQ1FVRlVMRVZCUVdkRExFTkJRVU5xUWl4VlFVRnFReXhEUVVSeVFpeEZRVVZGYjBJc1dVRkJXU3hKUVVGSmJFSXNTVUZCU1N4RFFVRkRReXhIUVVGTUxFTkJRVk5sTEhGQ1FVRlVMRVZCUVdkRGJFSXNWVUZCYUVNc1EwRkdiRUlzUlVGSFJXOUNMRmxCUVZrc1NVRkJTU3hEUVVoc1FpeEZRVWxGTzBGQlEwRXNXVUZCU1VVc1VVRkJVVHRCUVVGQk8wRkJRVUU3UVVGQldqdEJRVUZCTzBGQlEwRXNXVUZCU1VNc1ZVRkJWU3hIUVVGSFlpeFJRVUZSTEVOQlFVTlZMRmxCUVZrc1IwRkJSeXhEUVVGb1FpeERRVUY2UWp0QlFVRkJMRmxCUTBsSkxFOUJRVThzUjBGQlIyUXNVVUZCVVN4RFFVRkRWU3haUVVGWkxFZEJRVWNzUTBGQmFFSXNRMEZFZEVJN08wRkJSVUVzV1VGQlNVY3NWVUZCU2l4RlFVRm5RanRCUVVOa08wRkJRMEZpTEZWQlFVRkJMRkZCUVZFc1EwRkJRMVVzV1VGQldTeEhRVUZITEVOQlFXaENMRU5CUVZJc1IwRkJOa0l6UWl4VFFVRTNRanRCUVVORU96dEJRVVZFTEZsQlFVbG5ReXhOUVVGTkxFZEJRVWNzUzBGQllqczdRVUZEUVN4WlFVRkpSQ3hQUVVGS0xFVkJRV0U3UVVGRFdEdEJRVU5CTEdOQlFVMUZMR0ZCUVdFc1IwRkJSMFlzVDBGQlR5eERRVUZEWWl4TlFVRlNMRWRCUVdsQ1V5eFpRVUYyUXp0QlFVTkJTeXhWUVVGQlFTeE5RVUZOTEVkQlFVZEVMRTlCUVU4c1NVRkJTU3hMUVVGTFJTeGhRVUZvUWl4SlFVRnBRMEVzWVVGQllTeEhRVUZITjBJc1RVRkJNVVE3UVVGRFJEczdRVUZGUkN4WlFVRkpPRUlzVTBGQlV5eEhRVUZIU2l4VlFVRlZMRWxCUVVsQkxGVkJRVlVzUTBGQlExb3NUVUZCV0N4SFFVRnZRaXhEUVVGd1FpeEhRVUYzUWxvc1RVRkJkRVE3TzBGQlEwRXNXVUZCU1N4RFFVRkRNRUlzVFVGQlJDeEpRVUZYTEVOQlFVTkZMRk5CUVdoQ0xFVkJRVEpDTzBGQlEzcENPMEZCUTBGcVFpeFZRVUZCUVN4UlFVRlJMRU5CUVVOVkxGbEJRVVFzUTBGQlVpeEhRVUY1UWpOQ0xGTkJRWHBDTzBGQlEwRTdRVUZEUkN4VFFYSkNSQ3hEUVhWQ1FUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPenM3UVVGRFFTeFpRVUZKTEVOQlFVTnJReXhUUVVGRUxFbEJRV1ZHTEUxQlFVMHNTVUZCU1VZc1ZVRkJWU3hEUVVGRFdpeE5RVUZZTEVkQlFXOUNMRU5CUVhCQ0xFZEJRWGRDWVN4UFFVRlBMRU5CUVVOaUxFMUJRVGRFTEVWQlFYTkZPMEZCUTNCRlZ5eFZRVUZCUVN4UlFVRlJMRWRCUVVkcVF5eEpRVUZKTEVOQlFVTjFReXhUUVVGTUxFTkJRV1ZLTEU5QlFXWXNSVUZCZDBJc1NVRkJlRUlzUlVGQk9FSXZRaXhUUVVFNVFpeEZRVUY1UXl4RFFVRjZReXhEUVVGWU8wRkJRMFFzVTBGR1JDeE5RVVZQTzBGQlEwdzJRaXhWUVVGQlFTeFJRVUZSTEVkQlFVZHFReXhKUVVGSkxFTkJRVU4xUXl4VFFVRk1MRU5CUVdWTUxGVkJRV1lzUlVGQk1rSTVRaXhUUVVFelFpeEZRVUZ6UXl4SlFVRjBReXhGUVVFMFF5eERRVUUxUXl4RFFVRllPMEZCUTBRN08wRkJSVVJ2UWl4UlFVRkJRU3hOUVVGTkxFZEJRVWQ0UWl4SlFVRkpMRU5CUVVONVFpeGhRVUZNTEVOQlFXMUNVU3hSUVVGdVFpeEZRVUUyUW5CRExGTkJRVGRDTEVWQlFYZERSQ3hUUVVGNFF5eEZRVUZ0UkcxRExGbEJRVzVFTEVOQlFWUTdPMEZCUlVFc1dVRkJTVVVzVVVGQlVTeERRVUZEV0N4TlFVRlVMRWRCUVd0Q0xFTkJRV3hDTEVsQlFYVkNXaXhOUVVGMlFpeEpRVUZwUTJNc1RVRkJUU3hIUVVGSExFTkJRVlFzU1VGQlkyaENMRTFCUVc1RUxFVkJRVEpFTzBGQlEzcEVPMEZCUTBFc2FVSkJRVTlRTEVsQlFVa3NRMEZCUTNWRExGZEJRVmNzUTBGQlEzaERMRWxCUVVRc1JVRkJUMmxETEZGQlFWRXNRMEZCUTFZc1lVRkJhRUlzUlVGQkswSXhRaXhUUVVFdlFpeEZRVUV3UTBRc1UwRkJNVU1zUlVGQmNVUkpMRWxCUVVrc1EwRkJRM2xETEdWQlFURkVMRU5CUVZvc1EwRkJXRHRCUVVORUxGTkJTRVFzVFVGSFR6dEJRVU5NY0VJc1ZVRkJRVUVzVVVGQlVTeERRVUZEVlN4WlFVRkVMRU5CUVZJc1IwRkJlVUpGTEZGQlFYcENPenRCUVVOQkxHTkJRVWxCTEZGQlFWRXNRMEZCUTFnc1RVRkJWQ3hIUVVGclFpeERRVUZzUWl4SlFVRjFRbG9zVFVGQk0wSXNSVUZCYlVNN1FVRkRha050UWl4WlFVRkJRU3h4UWtGQmNVSXNSMEZCUjJoQ0xFbEJRVWtzUTBGQlEwTXNSMEZCVEN4RFFVRlRaU3h4UWtGQlZDeEZRVUZuUTBVc1dVRkJXU3hIUVVGSExFTkJRUzlETEVOQlFYaENPMEZCUTBRN08wRkJRMFFzWTBGQlNWQXNUVUZCVFN4SFFVRkhMRU5CUVZRc1NVRkJZMmhDTEUxQlFXeENMRVZCUVRCQ08wRkJRM2hDYjBJc1dVRkJRVUVzY1VKQlFYRkNMRWRCUVVkbUxFbEJRVWtzUTBGQlEyMUNMRWRCUVV3c1EwRkJVMG9zY1VKQlFWUXNSVUZCWjBOSExGbEJRVmtzUjBGQlJ5eERRVUV2UXl4RFFVRjRRanRCUVVORU8wRkJRMFk3UVVGRFJqczdRVUZGUkhCQ0xFMUJRVUZCTEZWQlFWVTdRVUZEV0N4TFFYaEljME1zUTBFd1NIWkRPMEZCUTBFN1FVRkRRVHRCUVVOQk96czdRVUZEUVN4UlFVRkpXaXhSUVVGS0xFVkJRV003UVVGRFdDeG5Ra0ZCVXpKRExFbEJRVlFzUjBGQlowSTdRVUZEWm5aRExGRkJRVUZCTEZWQlFWVXNRMEZCUXl4WlFVRlhPMEZCUTNCQ0xHTkJRVWxSTEZWQlFWVXNSMEZCUjBNc1lVRkJZaXhKUVVFNFFrOHNTVUZCU1N4RFFVRkRReXhIUVVGTUxFdEJRV0ZHTEcxQ1FVRXZReXhGUVVGdlJUdEJRVU5zUlN4dFFrRkJUMjVDTEZGQlFWRXNSVUZCWmp0QlFVTkVPenRCUVVWRUxHTkJRVWtzUTBGQlF5dENMR05CUVdNc1JVRkJia0lzUlVGQmRVSTdRVUZEY2tKWkxGbEJRVUZCTEVsQlFVazdRVUZEVER0QlFVTkdMRk5CVWxNc1JVRlJVQ3hEUVZKUExFTkJRVlk3UVVGVFJDeFBRVlpCTEVkQlFVUTdRVUZYUkN4TFFWcEVMRTFCV1U4N1FVRkRUQ3hoUVVGUEwwSXNWVUZCVlN4SlFVRkpReXhoUVVGa0xFbEJRU3RDVHl4SlFVRkpMRU5CUVVORExFZEJRVXdzVFVGQlkwWXNiVUpCUVhCRUxFVkJRWGxGTzBGQlEzWkZMRmxCUVVsNVFpeEhRVUZITEVkQlFVZGlMR05CUVdNc1JVRkJlRUk3TzBGQlEwRXNXVUZCU1dFc1IwRkJTaXhGUVVGVE8wRkJRMUFzYVVKQlFVOUJMRWRCUVZBN1FVRkRSRHRCUVVOR08wRkJRMFk3UVVGRFJpeEhRVzVLWXpzN1FVRkJRVHM3UVVGQlFUdEJRWEZLWmtvc1JVRkJRVUVzVTBGeVNtVXNjVUpCY1VwTVN5eEpRWEpLU3l4RlFYRktRME1zUzBGeVNrUXNSVUZ4U2xGRExFOUJja3BTTEVWQmNVcHBRa01zVTBGeVNtcENMRVZCY1VvMFFqdEJRVU42UXl4UlFVRkpReXhKUVVGSkxFZEJRVWRLTEVsQlFVa3NRMEZCUTNKQ0xHRkJRV2hDT3p0QlFVTkJMRkZCUVVsNVFpeEpRVUZKTEVsQlFVbEJMRWxCUVVrc1EwRkJRMGdzUzBGQlRDeExRVUZsUVN4TFFVRjJRaXhKUVVGblEwY3NTVUZCU1N4RFFVRkRSaXhQUVVGTUxFdEJRV2xDUVN4UFFVRnlSQ3hGUVVFNFJEdEJRVU0xUkN4aFFVRlBPMEZCUTB4NFFpeFJRVUZCUVN4TlFVRk5MRVZCUVVWelFpeEpRVUZKTEVOQlFVTjBRaXhOUVVGTUxFZEJRV041UWl4VFFVUnFRanRCUVVWTWVFSXNVVUZCUVVFc1lVRkJZU3hGUVVGRk8wRkJRVU5KTEZWQlFVRkJMRXRCUVVzc1JVRkJSWEZDTEVsQlFVa3NRMEZCUTNKQ0xFdEJRVXdzUjBGQllTeERRVUZ5UWp0QlFVRjNRbXRDTEZWQlFVRkJMRXRCUVVzc1JVRkJSVUVzUzBGQkwwSTdRVUZCYzBORExGVkJRVUZCTEU5QlFVOHNSVUZCUlVFc1QwRkJMME03UVVGQmQwUkhMRlZCUVVGQkxHbENRVUZwUWl4RlFVRkZSQ3hKUVVGSkxFTkJRVU5ETzBGQlFXaEdPMEZCUmxZc1QwRkJVRHRCUVVsRUxFdEJURVFzVFVGTFR6dEJRVU5NTEdGQlFVODdRVUZEVEROQ0xGRkJRVUZCTEUxQlFVMHNSVUZCUlhOQ0xFbEJRVWtzUTBGQlEzUkNMRTFCUVV3c1IwRkJZM2xDTEZOQlJHcENPMEZCUlV4NFFpeFJRVUZCUVN4aFFVRmhMRVZCUVVVN1FVRkJRMGtzVlVGQlFVRXNTMEZCU3l4RlFVRkZMRU5CUVZJN1FVRkJWMnRDTEZWQlFVRkJMRXRCUVVzc1JVRkJSVUVzUzBGQmJFSTdRVUZCZVVKRExGVkJRVUZCTEU5QlFVOHNSVUZCUlVFc1QwRkJiRU03UVVGQk1rTkhMRlZCUVVGQkxHbENRVUZwUWl4RlFVRkZSRHRCUVVFNVJEdEJRVVpXTEU5QlFWQTdRVUZKUkR0QlFVTkdMRWRCYkV0ak96dEJRVUZCT3p0QlFVRkJPMEZCYlV0bWRrSXNSVUZCUVVFc1lVRnVTMlVzZVVKQmJVdEVVU3hSUVc1TFF5eEZRVzFMVTNCRExGTkJia3RVTEVWQmJVdHZRa1FzVTBGdVMzQkNMRVZCYlVzclFtMURMRmxCYmtzdlFpeEZRVzFMTmtNN1FVRkRNVVFzVVVGQlNYWkNMRTFCUVUwc1IwRkJSMWdzVTBGQlV5eERRVUZEV1N4TlFVRjJRanRCUVVGQkxGRkJRMGxETEUxQlFVMHNSMEZCUjJRc1UwRkJVeXhEUVVGRFlTeE5RVVIyUWp0QlFVRkJMRkZCUlVsaExFMUJRVTBzUjBGQlIxY3NVVUZCVVN4RFFVRkRXQ3hOUVVaMFFqdEJRVUZCTEZGQlIwbEZMRTFCUVUwc1IwRkJSMFlzVFVGQlRTeEhRVUZIVXl4WlFVaDBRanRCUVVGQkxGRkJTMGx0UWl4WFFVRlhMRWRCUVVjc1EwRk1iRUk3TzBGQlRVRXNWMEZCVHpGQ0xFMUJRVTBzUjBGQlJ5eERRVUZVTEVkQlFXRm9RaXhOUVVGaUxFbEJRWFZDWXl4TlFVRk5MRWRCUVVjc1EwRkJWQ3hIUVVGaFdpeE5RVUZ3UXl4SlFVRTRReXhMUVVGTGVVTXNUVUZCVEN4RFFVRlpkRVFzVTBGQlV5eERRVUZETWtJc1RVRkJUU3hIUVVGSExFTkJRVllzUTBGQmNrSXNSVUZCYlVNMVFpeFRRVUZUTEVOQlFVTXdRaXhOUVVGTkxFZEJRVWNzUTBGQlZpeERRVUUxUXl4RFFVRnlSQ3hGUVVGblNEdEJRVU01UjBVc1RVRkJRVUVzVFVGQlRUdEJRVU5PUml4TlFVRkJRU3hOUVVGTk8wRkJRMDQwUWl4TlFVRkJRU3hYUVVGWE8wRkJRMW83TzBGQlJVUXNVVUZCU1VFc1YwRkJTaXhGUVVGcFFqdEJRVU5tYWtJc1RVRkJRVUVzVVVGQlVTeERRVUZEVml4aFFVRlVMRWRCUVhsQ08wRkJRVU5KTEZGQlFVRkJMRXRCUVVzc1JVRkJSWFZDTEZkQlFWSTdRVUZCY1VKRUxGRkJRVUZCTEdsQ1FVRnBRaXhGUVVGRmFFSXNVVUZCVVN4RFFVRkRWanRCUVVGcVJDeFBRVUY2UWp0QlFVTkVPenRCUVVWRVZTeEpRVUZCUVN4UlFVRlJMRU5CUVVOWUxFMUJRVlFzUjBGQmEwSkJMRTFCUVd4Q08wRkJRMEVzVjBGQlQwVXNUVUZCVUR0QlFVTkVMRWRCZEV4ak96dEJRVUZCT3p0QlFVRkJPMEZCZDB4bU1rSXNSVUZCUVVFc1RVRjRUR1VzYTBKQmQweFNReXhKUVhoTVVTeEZRWGRNUmtNc1MwRjRURVVzUlVGM1RFczdRVUZEYkVJc1VVRkJTU3hMUVVGTGRrUXNUMEZCVEN4RFFVRmhkMFFzVlVGQmFrSXNSVUZCTmtJN1FVRkRNMElzWVVGQlR5eExRVUZMZUVRc1QwRkJUQ3hEUVVGaGQwUXNWVUZCWWl4RFFVRjNRa1lzU1VGQmVFSXNSVUZCT0VKRExFdEJRVGxDTEVOQlFWQTdRVUZEUkN4TFFVWkVMRTFCUlU4N1FVRkRUQ3hoUVVGUFJDeEpRVUZKTEV0QlFVdERMRXRCUVZRc1NVRkRSQ3hMUVVGTGRrUXNUMEZCVEN4RFFVRmhlVVFzVlVGQllpeEpRVUV5UWtnc1NVRkJTU3hEUVVGRFNTeFhRVUZNTEU5QlFYVkNTQ3hMUVVGTExFTkJRVU5ITEZkQlFVNHNSVUZFZUVRN1FVRkZSRHRCUVVOR0xFZEJMMHhqT3p0QlFVRkJPenRCUVVGQk8wRkJaMDFtYkVRc1JVRkJRVUVzVjBGb1RXVXNkVUpCWjAxSWJVUXNTMEZvVFVjc1JVRm5UVWs3UVVGRGFrSXNVVUZCU1dRc1IwRkJSeXhIUVVGSExFVkJRVlk3TzBGQlEwRXNVMEZCU3l4SlFVRkpaU3hEUVVGRExFZEJRVWNzUTBGQllpeEZRVUZuUWtFc1EwRkJReXhIUVVGSFJDeExRVUZMTEVOQlFVTm9SQ3hOUVVFeFFpeEZRVUZyUTJsRUxFTkJRVU1zUlVGQmJrTXNSVUZCZFVNN1FVRkRja01zVlVGQlNVUXNTMEZCU3l4RFFVRkRReXhEUVVGRUxFTkJRVlFzUlVGQll6dEJRVU5hWml4UlFVRkJRU3hIUVVGSExFTkJRVU5uUWl4SlFVRktMRU5CUVZOR0xFdEJRVXNzUTBGQlEwTXNRMEZCUkN4RFFVRmtPMEZCUTBRN1FVRkRSanM3UVVGRFJDeFhRVUZQWml4SFFVRlFPMEZCUTBRc1IwRjRUV003TzBGQlFVRTdPMEZCUVVFN1FVRjVUV1owUXl4RlFVRkJRU3hUUVhwTlpTeHhRa0Y1VFV4SUxFdEJlazFMTEVWQmVVMUZPMEZCUTJZc1YwRkJUMEVzUzBGQlVEdEJRVU5FTEVkQk0wMWpPenRCUVVGQk96dEJRVUZCTzBGQk5FMW1TeXhGUVVGQlFTeFJRVFZOWlN4dlFrRTBUVTVNTEV0Qk5VMU5MRVZCTkUxRE8wRkJRMlFzVjBGQlQwRXNTMEZCU3l4RFFVRkRNRVFzUzBGQlRpeERRVUZaTEVWQlFWb3NRMEZCVUR0QlFVTkVMRWRCT1Uxak96dEJRVUZCT3p0QlFVRkJPMEZCSzAxbWJFTXNSVUZCUVVFc1NVRXZUV1VzWjBKQkswMVdiVU1zUzBFdlRWVXNSVUVyVFVnN1FVRkRWaXhYUVVGUFFTeExRVUZMTEVOQlFVTnVReXhKUVVGT0xFTkJRVmNzUlVGQldDeERRVUZRTzBGQlEwUTdRVUZxVG1Nc1EwRkJha0k3TzBGQmIwNUJMRk5CUVZOakxGZEJRVlFzUTBGQmNVSTNReXhKUVVGeVFpeEZRVUV5UWpSQ0xHRkJRVE5DTEVWQlFUQkRNVUlzVTBGQk1VTXNSVUZCY1VSRUxGTkJRWEpFTEVWQlFXZEZOa01zWlVGQmFFVXNSVUZCYVVZN1FVRkRMMFU3UVVGRFFUdEJRVU5CTEUxQlFVMXhRaXhWUVVGVkxFZEJRVWNzUlVGQmJrSTdRVUZEUVN4TlFVRkpReXhoUVVGS096dEJRVU5CTEZOQlFVOTRReXhoUVVGUUxFVkJRWE5DTzBGQlEzQkNkVU1zU1VGQlFVRXNWVUZCVlN4RFFVRkRTQ3hKUVVGWUxFTkJRV2RDY0VNc1lVRkJhRUk3UVVGRFFYZERMRWxCUVVGQkxHRkJRV0VzUjBGQlIzaERMR0ZCUVdFc1EwRkJRekJDTEdsQ1FVRTVRanRCUVVOQkxGZEJRVTh4UWl4aFFVRmhMRU5CUVVNd1FpeHBRa0ZCY2tJN1FVRkRRVEZDTEVsQlFVRkJMR0ZCUVdFc1IwRkJSM2RETEdGQlFXaENPMEZCUTBRN08wRkJRMFJFTEVWQlFVRkJMRlZCUVZVc1EwRkJRMFVzVDBGQldEdEJRVVZCTEUxQlFVbERMRmxCUVZrc1IwRkJSeXhEUVVGdVFqdEJRVUZCTEUxQlEwbERMRmxCUVZrc1IwRkJSMG9zVlVGQlZTeERRVUZEY2tRc1RVRkVPVUk3UVVGQlFTeE5RVVZKWlN4TlFVRk5MRWRCUVVjc1EwRkdZanRCUVVGQkxFMUJSMGxHTEUxQlFVMHNSMEZCUnl4RFFVaGlPenRCUVV0QkxGTkJRVTh5UXl4WlFVRlpMRWRCUVVkRExGbEJRWFJDTEVWQlFXOURSQ3haUVVGWkxFVkJRV2hFTEVWQlFXOUVPMEZCUTJ4RUxGRkJRVWxGTEZOQlFWTXNSMEZCUjB3c1ZVRkJWU3hEUVVGRFJ5eFpRVUZFTEVOQlFURkNPenRCUVVOQkxGRkJRVWtzUTBGQlEwVXNVMEZCVXl4RFFVRkRja0lzVDBGQlppeEZRVUYzUWp0QlFVTjBRaXhWUVVGSkxFTkJRVU54UWl4VFFVRlRMRU5CUVVOMFFpeExRVUZZTEVsQlFXOUNTaXhsUVVGNFFpeEZRVUY1UXp0QlFVTjJReXhaUVVGSmRrTXNTMEZCU3l4SFFVRkhUQ3hUUVVGVExFTkJRVU4xUlN4TFFVRldMRU5CUVdkQ05VTXNUVUZCYUVJc1JVRkJkMEpCTEUxQlFVMHNSMEZCUnpKRExGTkJRVk1zUTBGQlEzaERMRXRCUVRORExFTkJRVm83UVVGRFFYcENMRkZCUVVGQkxFdEJRVXNzUjBGQlIwRXNTMEZCU3l4RFFVRkRiVVVzUjBGQlRpeERRVUZWTEZWQlFWTnVSU3hMUVVGVUxFVkJRV2RDZDBRc1EwRkJhRUlzUlVGQmJVSTdRVUZEYmtNc1kwRkJTVmtzVVVGQlVTeEhRVUZITVVVc1UwRkJVeXhEUVVGRE1FSXNUVUZCVFN4SFFVRkhiME1zUTBGQlZpeERRVUY0UWp0QlFVTkJMR2xDUVVGUFdTeFJRVUZSTEVOQlFVTTNSQ3hOUVVGVUxFZEJRV3RDVUN4TFFVRkxMRU5CUVVOUExFMUJRWGhDTEVkQlFXbEROa1FzVVVGQmFrTXNSMEZCTkVOd1JTeExRVUZ1UkR0QlFVTkVMRk5CU0U4c1EwRkJVanRCUVV0QmFVVXNVVUZCUVVFc1UwRkJVeXhEUVVGRGFrVXNTMEZCVml4SFFVRnJRbEFzU1VGQlNTeERRVUZESzBJc1NVRkJUQ3hEUVVGVmVFSXNTMEZCVml4RFFVRnNRanRCUVVORUxFOUJVa1FzVFVGUlR6dEJRVU5NYVVVc1VVRkJRVUVzVTBGQlV5eERRVUZEYWtVc1MwRkJWaXhIUVVGclFsQXNTVUZCU1N4RFFVRkRLMElzU1VGQlRDeERRVUZWTjBJc1UwRkJVeXhEUVVGRGRVVXNTMEZCVml4RFFVRm5RalZETEUxQlFXaENMRVZCUVhkQ1FTeE5RVUZOTEVkQlFVY3lReXhUUVVGVExFTkJRVU40UXl4TFFVRXpReXhEUVVGV0xFTkJRV3hDTzBGQlEwUTdPMEZCUTBSSUxFMUJRVUZCTEUxQlFVMHNTVUZCU1RKRExGTkJRVk1zUTBGQlEzaERMRXRCUVhCQ0xFTkJXbk5DTEVOQlkzUkNPenRCUVVOQkxGVkJRVWtzUTBGQlEzZERMRk5CUVZNc1EwRkJRM1JDTEV0QlFXWXNSVUZCYzBJN1FVRkRjRUoyUWl4UlFVRkJRU3hOUVVGTkxFbEJRVWsyUXl4VFFVRlRMRU5CUVVONFF5eExRVUZ3UWp0QlFVTkVPMEZCUTBZc1MwRnNRa1FzVFVGclFrODdRVUZEVEhkRExFMUJRVUZCTEZOQlFWTXNRMEZCUTJwRkxFdEJRVllzUjBGQmEwSlFMRWxCUVVrc1EwRkJReXRDTEVsQlFVd3NRMEZCVlRsQ0xGTkJRVk1zUTBGQlEzZEZMRXRCUVZZc1EwRkJaMEk1UXl4TlFVRm9RaXhGUVVGM1FrRXNUVUZCVFN4SFFVRkhOa01zVTBGQlV5eERRVUZEZUVNc1MwRkJNME1zUTBGQlZpeERRVUZzUWp0QlFVTkJUQ3hOUVVGQlFTeE5RVUZOTEVsQlFVazJReXhUUVVGVExFTkJRVU40UXl4TFFVRndRaXhEUVVaTExFTkJTVXc3UVVGRFFUdEJRVU5CT3p0QlFVTkJMRlZCUVVselF5eFpRVUZaTEVsQlFVbElMRlZCUVZVc1EwRkJRMGNzV1VGQldTeEhRVUZITEVOQlFXaENMRU5CUVZZc1EwRkJOa0p3UWl4TFFVRnFSQ3hGUVVGM1JEdEJRVU4wUkN4WlFVRkpNRUlzUjBGQlJ5eEhRVUZIVkN4VlFVRlZMRU5CUVVOSExGbEJRVmtzUjBGQlJ5eERRVUZvUWl4RFFVRndRanRCUVVOQlNDeFJRVUZCUVN4VlFVRlZMRU5CUVVOSExGbEJRVmtzUjBGQlJ5eERRVUZvUWl4RFFVRldMRWRCUVN0Q1NDeFZRVUZWTEVOQlFVTkhMRmxCUVVRc1EwRkJla003UVVGRFFVZ3NVVUZCUVVFc1ZVRkJWU3hEUVVGRFJ5eFpRVUZFTEVOQlFWWXNSMEZCTWtKTkxFZEJRVE5DTzBGQlEwUTdRVUZEUmp0QlFVTkdMRWRCYmtRNFJTeERRWEZFTDBVN1FVRkRRVHRCUVVOQk96czdRVUZEUVN4TlFVRkpReXhqUVVGakxFZEJRVWRXTEZWQlFWVXNRMEZCUTBrc1dVRkJXU3hIUVVGSExFTkJRV2hDTEVOQlFTOUNPenRCUVVOQkxFMUJRVWxCTEZsQlFWa3NSMEZCUnl4RFFVRm1MRWxCUTBjc1QwRkJUMDBzWTBGQll5eERRVUZEZEVVc1MwRkJkRUlzUzBGQlowTXNVVUZFYmtNc1MwRkZTWE5GTEdOQlFXTXNRMEZCUXpOQ0xFdEJRV1lzU1VGQmQwSXlRaXhqUVVGakxFTkJRVU14UWl4UFFVWXpReXhMUVVkSGJrUXNTVUZCU1N4RFFVRkRkMFFzVFVGQlRDeERRVUZaTEVWQlFWb3NSVUZCWjBKeFFpeGpRVUZqTEVOQlFVTjBSU3hMUVVFdlFpeERRVWhRTEVWQlJ6aERPMEZCUXpWRE5FUXNTVUZCUVVFc1ZVRkJWU3hEUVVGRFNTeFpRVUZaTEVkQlFVY3NRMEZCYUVJc1EwRkJWaXhEUVVFMlFtaEZMRXRCUVRkQ0xFbEJRWE5EYzBVc1kwRkJZeXhEUVVGRGRFVXNTMEZCY2tRN1FVRkRRVFJFTEVsQlFVRkJMRlZCUVZVc1EwRkJRMWNzUjBGQldEdEJRVU5FT3p0QlFVVkVMRk5CUVU5WUxGVkJRVkE3UVVGRFJDSXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJbVY0Y0c5eWRDQmtaV1poZFd4MElHWjFibU4wYVc5dUlFUnBabVlvS1NCN2ZWeHVYRzVFYVdabUxuQnliM1J2ZEhsd1pTQTlJSHRjYmlBZ1pHbG1aaWh2YkdSVGRISnBibWNzSUc1bGQxTjBjbWx1Wnl3Z2IzQjBhVzl1Y3lBOUlIdDlLU0I3WEc0Z0lDQWdiR1YwSUdOaGJHeGlZV05ySUQwZ2IzQjBhVzl1Y3k1allXeHNZbUZqYXp0Y2JpQWdJQ0JwWmlBb2RIbHdaVzltSUc5d2RHbHZibk1nUFQwOUlDZG1kVzVqZEdsdmJpY3BJSHRjYmlBZ0lDQWdJR05oYkd4aVlXTnJJRDBnYjNCMGFXOXVjenRjYmlBZ0lDQWdJRzl3ZEdsdmJuTWdQU0I3ZlR0Y2JpQWdJQ0I5WEc0Z0lDQWdkR2hwY3k1dmNIUnBiMjV6SUQwZ2IzQjBhVzl1Y3p0Y2JseHVJQ0FnSUd4bGRDQnpaV3htSUQwZ2RHaHBjenRjYmx4dUlDQWdJR1oxYm1OMGFXOXVJR1J2Ym1Vb2RtRnNkV1VwSUh0Y2JpQWdJQ0FnSUdsbUlDaGpZV3hzWW1GamF5a2dlMXh1SUNBZ0lDQWdJQ0J6WlhSVWFXMWxiM1YwS0daMWJtTjBhVzl1S0NrZ2V5QmpZV3hzWW1GamF5aDFibVJsWm1sdVpXUXNJSFpoYkhWbEtUc2dmU3dnTUNrN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCMGNuVmxPMXh1SUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlIWmhiSFZsTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmx4dUlDQWdJQzh2SUVGc2JHOTNJSE4xWW1Oc1lYTnpaWE1nZEc4Z2JXRnpjMkZuWlNCMGFHVWdhVzV3ZFhRZ2NISnBiM0lnZEc4Z2NuVnVibWx1WjF4dUlDQWdJRzlzWkZOMGNtbHVaeUE5SUhSb2FYTXVZMkZ6ZEVsdWNIVjBLRzlzWkZOMGNtbHVaeWs3WEc0Z0lDQWdibVYzVTNSeWFXNW5JRDBnZEdocGN5NWpZWE4wU1c1d2RYUW9ibVYzVTNSeWFXNW5LVHRjYmx4dUlDQWdJRzlzWkZOMGNtbHVaeUE5SUhSb2FYTXVjbVZ0YjNabFJXMXdkSGtvZEdocGN5NTBiMnRsYm1sNlpTaHZiR1JUZEhKcGJtY3BLVHRjYmlBZ0lDQnVaWGRUZEhKcGJtY2dQU0IwYUdsekxuSmxiVzkyWlVWdGNIUjVLSFJvYVhNdWRHOXJaVzVwZW1Vb2JtVjNVM1J5YVc1bktTazdYRzVjYmlBZ0lDQnNaWFFnYm1WM1RHVnVJRDBnYm1WM1UzUnlhVzVuTG14bGJtZDBhQ3dnYjJ4a1RHVnVJRDBnYjJ4a1UzUnlhVzVuTG14bGJtZDBhRHRjYmlBZ0lDQnNaWFFnWldScGRFeGxibWQwYUNBOUlERTdYRzRnSUNBZ2JHVjBJRzFoZUVWa2FYUk1aVzVuZEdnZ1BTQnVaWGRNWlc0Z0t5QnZiR1JNWlc0N1hHNGdJQ0FnYVdZb2IzQjBhVzl1Y3k1dFlYaEZaR2wwVEdWdVozUm9LU0I3WEc0Z0lDQWdJQ0J0WVhoRlpHbDBUR1Z1WjNSb0lEMGdUV0YwYUM1dGFXNG9iV0Y0UldScGRFeGxibWQwYUN3Z2IzQjBhVzl1Y3k1dFlYaEZaR2wwVEdWdVozUm9LVHRjYmlBZ0lDQjlYRzRnSUNBZ1kyOXVjM1FnYldGNFJYaGxZM1YwYVc5dVZHbHRaU0E5SUc5d2RHbHZibk11ZEdsdFpXOTFkQ0EvUHlCSmJtWnBibWwwZVR0Y2JpQWdJQ0JqYjI1emRDQmhZbTl5ZEVGbWRHVnlWR2x0WlhOMFlXMXdJRDBnUkdGMFpTNXViM2NvS1NBcklHMWhlRVY0WldOMWRHbHZibFJwYldVN1hHNWNiaUFnSUNCc1pYUWdZbVZ6ZEZCaGRHZ2dQU0JiZXlCdmJHUlFiM002SUMweExDQnNZWE4wUTI5dGNHOXVaVzUwT2lCMWJtUmxabWx1WldRZ2ZWMDdYRzVjYmlBZ0lDQXZMeUJUWldWa0lHVmthWFJNWlc1bmRHZ2dQU0F3TENCcExtVXVJSFJvWlNCamIyNTBaVzUwSUhOMFlYSjBjeUIzYVhSb0lIUm9aU0J6WVcxbElIWmhiSFZsYzF4dUlDQWdJR3hsZENCdVpYZFFiM01nUFNCMGFHbHpMbVY0ZEhKaFkzUkRiMjF0YjI0b1ltVnpkRkJoZEdoYk1GMHNJRzVsZDFOMGNtbHVaeXdnYjJ4a1UzUnlhVzVuTENBd0tUdGNiaUFnSUNCcFppQW9ZbVZ6ZEZCaGRHaGJNRjB1YjJ4a1VHOXpJQ3NnTVNBK1BTQnZiR1JNWlc0Z0ppWWdibVYzVUc5eklDc2dNU0ErUFNCdVpYZE1aVzRwSUh0Y2JpQWdJQ0FnSUM4dklFbGtaVzUwYVhSNUlIQmxjaUIwYUdVZ1pYRjFZV3hwZEhrZ1lXNWtJSFJ2YTJWdWFYcGxjbHh1SUNBZ0lDQWdjbVYwZFhKdUlHUnZibVVvVzN0MllXeDFaVG9nZEdocGN5NXFiMmx1S0c1bGQxTjBjbWx1Wnlrc0lHTnZkVzUwT2lCdVpYZFRkSEpwYm1jdWJHVnVaM1JvZlYwcE8xeHVJQ0FnSUgxY2JseHVJQ0FnSUM4dklFOXVZMlVnZDJVZ2FHbDBJSFJvWlNCeWFXZG9kQ0JsWkdkbElHOW1JSFJvWlNCbFpHbDBJR2R5WVhCb0lHOXVJSE52YldVZ1pHbGhaMjl1WVd3Z2F5d2dkMlVnWTJGdVhHNGdJQ0FnTHk4Z1pHVm1hVzVwZEdWc2VTQnlaV0ZqYUNCMGFHVWdaVzVrSUc5bUlIUm9aU0JsWkdsMElHZHlZWEJvSUdsdUlHNXZJRzF2Y21VZ2RHaGhiaUJySUdWa2FYUnpMQ0J6YjF4dUlDQWdJQzh2SUhSb1pYSmxKM01nYm04Z2NHOXBiblFnYVc0Z1kyOXVjMmxrWlhKcGJtY2dZVzU1SUcxdmRtVnpJSFJ2SUdScFlXZHZibUZzSUdzck1TQmhibmtnYlc5eVpTQW9abkp2YlZ4dUlDQWdJQzh2SUhkb2FXTm9JSGRsSjNKbElHZDFZWEpoYm5SbFpXUWdkRzhnYm1WbFpDQmhkQ0JzWldGemRDQnJLekVnYlc5eVpTQmxaR2wwY3lrdVhHNGdJQ0FnTHk4Z1UybHRhV3hoY214NUxDQnZibU5sSUhkbEozWmxJSEpsWVdOb1pXUWdkR2hsSUdKdmRIUnZiU0J2WmlCMGFHVWdaV1JwZENCbmNtRndhQ3dnZEdobGNtVW5jeUJ1YjF4dUlDQWdJQzh2SUhCdmFXNTBJR052Ym5OcFpHVnlhVzVuSUcxdmRtVnpJSFJ2SUd4dmQyVnlJR1JwWVdkdmJtRnNjeTVjYmlBZ0lDQXZMeUJYWlNCeVpXTnZjbVFnZEdocGN5Qm1ZV04wSUdKNUlITmxkSFJwYm1jZ2JXbHVSR2xoWjI5dVlXeFViME52Ym5OcFpHVnlJR0Z1WkZ4dUlDQWdJQzh2SUcxaGVFUnBZV2R2Ym1Gc1ZHOURiMjV6YVdSbGNpQjBieUJ6YjIxbElHWnBibWwwWlNCMllXeDFaU0J2Ym1ObElIZGxKM1psSUdocGRDQjBhR1VnWldSblpTQnZabHh1SUNBZ0lDOHZJSFJvWlNCbFpHbDBJR2R5WVhCb0xseHVJQ0FnSUM4dklGUm9hWE1nYjNCMGFXMXBlbUYwYVc5dUlHbHpJRzV2ZENCbVlXbDBhR1oxYkNCMGJ5QjBhR1VnYjNKcFoybHVZV3dnWVd4bmIzSnBkR2h0SUhCeVpYTmxiblJsWkNCcGJseHVJQ0FnSUM4dklFMTVaWEp6SjNNZ2NHRndaWElzSUhkb2FXTm9JR2x1YzNSbFlXUWdjRzlwYm5Sc1pYTnpiSGtnWlhoMFpXNWtjeUJFTFhCaGRHaHpJRzltWmlCMGFHVWdaVzVrSUc5bVhHNGdJQ0FnTHk4Z2RHaGxJR1ZrYVhRZ1ozSmhjR2dnTFNCelpXVWdjR0ZuWlNBM0lHOW1JRTE1WlhKekozTWdjR0Z3WlhJZ2QyaHBZMmdnYm05MFpYTWdkR2hwY3lCd2IybHVkRnh1SUNBZ0lDOHZJR1Y0Y0d4cFkybDBiSGtnWVc1a0lHbHNiSFZ6ZEhKaGRHVnpJR2wwSUhkcGRHZ2dZU0JrYVdGbmNtRnRMaUJVYUdseklHaGhjeUJ0WVdwdmNpQndaWEptYjNKdFlXNWpaVnh1SUNBZ0lDOHZJR2x0Y0d4cFkyRjBhVzl1Y3lCbWIzSWdjMjl0WlNCamIyMXRiMjRnYzJObGJtRnlhVzl6TGlCR2IzSWdhVzV6ZEdGdVkyVXNJSFJ2SUdOdmJYQjFkR1VnWVNCa2FXWm1YRzRnSUNBZ0x5OGdkMmhsY21VZ2RHaGxJRzVsZHlCMFpYaDBJSE5wYlhCc2VTQmhjSEJsYm1SeklHUWdZMmhoY21GamRHVnljeUJ2YmlCMGFHVWdaVzVrSUc5bUlIUm9aVnh1SUNBZ0lDOHZJRzl5YVdkcGJtRnNJSFJsZUhRZ2IyWWdiR1Z1WjNSb0lHNHNJSFJvWlNCMGNuVmxJRTE1WlhKeklHRnNaMjl5YVhSb2JTQjNhV3hzSUhSaGEyVWdUeWh1SzJSZU1pbGNiaUFnSUNBdkx5QjBhVzFsSUhkb2FXeGxJSFJvYVhNZ2IzQjBhVzFwZW1GMGFXOXVJRzVsWldSeklHOXViSGtnVHlodUsyUXBJSFJwYldVdVhHNGdJQ0FnYkdWMElHMXBia1JwWVdkdmJtRnNWRzlEYjI1emFXUmxjaUE5SUMxSmJtWnBibWwwZVN3Z2JXRjRSR2xoWjI5dVlXeFViME52Ym5OcFpHVnlJRDBnU1c1bWFXNXBkSGs3WEc1Y2JpQWdJQ0F2THlCTllXbHVJSGR2Y210bGNpQnRaWFJvYjJRdUlHTm9aV05yY3lCaGJHd2djR1Z5YlhWMFlYUnBiMjV6SUc5bUlHRWdaMmwyWlc0Z1pXUnBkQ0JzWlc1bmRHZ2dabTl5SUdGalkyVndkR0Z1WTJVdVhHNGdJQ0FnWm5WdVkzUnBiMjRnWlhobFkwVmthWFJNWlc1bmRHZ29LU0I3WEc0Z0lDQWdJQ0JtYjNJZ0tGeHVJQ0FnSUNBZ0lDQnNaWFFnWkdsaFoyOXVZV3hRWVhSb0lEMGdUV0YwYUM1dFlYZ29iV2x1UkdsaFoyOXVZV3hVYjBOdmJuTnBaR1Z5TENBdFpXUnBkRXhsYm1kMGFDazdYRzRnSUNBZ0lDQWdJR1JwWVdkdmJtRnNVR0YwYUNBOFBTQk5ZWFJvTG0xcGJpaHRZWGhFYVdGbmIyNWhiRlJ2UTI5dWMybGtaWElzSUdWa2FYUk1aVzVuZEdncE8xeHVJQ0FnSUNBZ0lDQmthV0ZuYjI1aGJGQmhkR2dnS3owZ01seHVJQ0FnSUNBZ0tTQjdYRzRnSUNBZ0lDQWdJR3hsZENCaVlYTmxVR0YwYUR0Y2JpQWdJQ0FnSUNBZ2JHVjBJSEpsYlc5MlpWQmhkR2dnUFNCaVpYTjBVR0YwYUZ0a2FXRm5iMjVoYkZCaGRHZ2dMU0F4WFN4Y2JpQWdJQ0FnSUNBZ0lDQWdJR0ZrWkZCaGRHZ2dQU0JpWlhOMFVHRjBhRnRrYVdGbmIyNWhiRkJoZEdnZ0t5QXhYVHRjYmlBZ0lDQWdJQ0FnYVdZZ0tISmxiVzkyWlZCaGRHZ3BJSHRjYmlBZ0lDQWdJQ0FnSUNBdkx5Qk9ieUJ2Ym1VZ1pXeHpaU0JwY3lCbmIybHVaeUIwYnlCaGRIUmxiWEIwSUhSdklIVnpaU0IwYUdseklIWmhiSFZsTENCamJHVmhjaUJwZEZ4dUlDQWdJQ0FnSUNBZ0lHSmxjM1JRWVhSb1cyUnBZV2R2Ym1Gc1VHRjBhQ0F0SURGZElEMGdkVzVrWldacGJtVmtPMXh1SUNBZ0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUNBZ2JHVjBJR05oYmtGa1pDQTlJR1poYkhObE8xeHVJQ0FnSUNBZ0lDQnBaaUFvWVdSa1VHRjBhQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDOHZJSGRvWVhRZ2JtVjNVRzl6SUhkcGJHd2dZbVVnWVdaMFpYSWdkMlVnWkc4Z1lXNGdhVzV6WlhKMGFXOXVPbHh1SUNBZ0lDQWdJQ0FnSUdOdmJuTjBJR0ZrWkZCaGRHaE9aWGRRYjNNZ1BTQmhaR1JRWVhSb0xtOXNaRkJ2Y3lBdElHUnBZV2R2Ym1Gc1VHRjBhRHRjYmlBZ0lDQWdJQ0FnSUNCallXNUJaR1FnUFNCaFpHUlFZWFJvSUNZbUlEQWdQRDBnWVdSa1VHRjBhRTVsZDFCdmN5QW1KaUJoWkdSUVlYUm9UbVYzVUc5eklEd2dibVYzVEdWdU8xeHVJQ0FnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQ0FnYkdWMElHTmhibEpsYlc5MlpTQTlJSEpsYlc5MlpWQmhkR2dnSmlZZ2NtVnRiM1psVUdGMGFDNXZiR1JRYjNNZ0t5QXhJRHdnYjJ4a1RHVnVPMXh1SUNBZ0lDQWdJQ0JwWmlBb0lXTmhia0ZrWkNBbUppQWhZMkZ1VW1WdGIzWmxLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0x5OGdTV1lnZEdocGN5QndZWFJvSUdseklHRWdkR1Z5YldsdVlXd2dkR2hsYmlCd2NuVnVaVnh1SUNBZ0lDQWdJQ0FnSUdKbGMzUlFZWFJvVzJScFlXZHZibUZzVUdGMGFGMGdQU0IxYm1SbFptbHVaV1E3WEc0Z0lDQWdJQ0FnSUNBZ1kyOXVkR2x1ZFdVN1hHNGdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0F2THlCVFpXeGxZM1FnZEdobElHUnBZV2R2Ym1Gc0lIUm9ZWFFnZDJVZ2QyRnVkQ0IwYnlCaWNtRnVZMmdnWm5KdmJTNGdWMlVnYzJWc1pXTjBJSFJvWlNCd2NtbHZjbHh1SUNBZ0lDQWdJQ0F2THlCd1lYUm9JSGRvYjNObElIQnZjMmwwYVc5dUlHbHVJSFJvWlNCdmJHUWdjM1J5YVc1bklHbHpJSFJvWlNCbVlYSjBhR1Z6ZENCbWNtOXRJSFJvWlNCdmNtbG5hVzVjYmlBZ0lDQWdJQ0FnTHk4Z1lXNWtJR1J2WlhNZ2JtOTBJSEJoYzNNZ2RHaGxJR0p2ZFc1a2N5QnZaaUIwYUdVZ1pHbG1aaUJuY21Gd2FGeHVJQ0FnSUNBZ0lDQXZMeUJVVDBSUE9pQlNaVzF2ZG1VZ2RHaGxJR0FySURGZ0lHaGxjbVVnZEc4Z2JXRnJaU0JpWldoaGRtbHZjaUJ0WVhSamFDQk5lV1Z5Y3lCaGJHZHZjbWwwYUcxY2JpQWdJQ0FnSUNBZ0x5OGdJQ0FnSUNBZ1lXNWtJSEJ5WldabGNpQjBieUJ2Y21SbGNpQnlaVzF2ZG1Gc2N5QmlaV1p2Y21VZ2FXNXpaWEowYVc5dWN5NWNiaUFnSUNBZ0lDQWdhV1lnS0NGallXNVNaVzF2ZG1VZ2ZId2dLR05oYmtGa1pDQW1KaUJ5WlcxdmRtVlFZWFJvTG05c1pGQnZjeUFySURFZ1BDQmhaR1JRWVhSb0xtOXNaRkJ2Y3lrcElIdGNiaUFnSUNBZ0lDQWdJQ0JpWVhObFVHRjBhQ0E5SUhObGJHWXVZV1JrVkc5UVlYUm9LR0ZrWkZCaGRHZ3NJSFJ5ZFdVc0lIVnVaR1ZtYVc1bFpDd2dNQ2s3WEc0Z0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUNBZ1ltRnpaVkJoZEdnZ1BTQnpaV3htTG1Ga1pGUnZVR0YwYUNoeVpXMXZkbVZRWVhSb0xDQjFibVJsWm1sdVpXUXNJSFJ5ZFdVc0lERXBPMXh1SUNBZ0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUNBZ2JtVjNVRzl6SUQwZ2MyVnNaaTVsZUhSeVlXTjBRMjl0Ylc5dUtHSmhjMlZRWVhSb0xDQnVaWGRUZEhKcGJtY3NJRzlzWkZOMGNtbHVaeXdnWkdsaFoyOXVZV3hRWVhSb0tUdGNibHh1SUNBZ0lDQWdJQ0JwWmlBb1ltRnpaVkJoZEdndWIyeGtVRzl6SUNzZ01TQStQU0J2YkdSTVpXNGdKaVlnYm1WM1VHOXpJQ3NnTVNBK1BTQnVaWGRNWlc0cElIdGNiaUFnSUNBZ0lDQWdJQ0F2THlCSlppQjNaU0JvWVhabElHaHBkQ0IwYUdVZ1pXNWtJRzltSUdKdmRHZ2djM1J5YVc1bmN5d2dkR2hsYmlCM1pTQmhjbVVnWkc5dVpWeHVJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQmtiMjVsS0dKMWFXeGtWbUZzZFdWektITmxiR1lzSUdKaGMyVlFZWFJvTG14aGMzUkRiMjF3YjI1bGJuUXNJRzVsZDFOMGNtbHVaeXdnYjJ4a1UzUnlhVzVuTENCelpXeG1MblZ6WlV4dmJtZGxjM1JVYjJ0bGJpa3BPMXh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0FnSUdKbGMzUlFZWFJvVzJScFlXZHZibUZzVUdGMGFGMGdQU0JpWVhObFVHRjBhRHRjYmlBZ0lDQWdJQ0FnSUNCcFppQW9ZbUZ6WlZCaGRHZ3ViMnhrVUc5eklDc2dNU0ErUFNCdmJHUk1aVzRwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJRzFoZUVScFlXZHZibUZzVkc5RGIyNXphV1JsY2lBOUlFMWhkR2d1YldsdUtHMWhlRVJwWVdkdmJtRnNWRzlEYjI1emFXUmxjaXdnWkdsaFoyOXVZV3hRWVhSb0lDMGdNU2s3WEc0Z0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQWdJR2xtSUNodVpYZFFiM01nS3lBeElENDlJRzVsZDB4bGJpa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2JXbHVSR2xoWjI5dVlXeFViME52Ym5OcFpHVnlJRDBnVFdGMGFDNXRZWGdvYldsdVJHbGhaMjl1WVd4VWIwTnZibk5wWkdWeUxDQmthV0ZuYjI1aGJGQmhkR2dnS3lBeEtUdGNiaUFnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ1pXUnBkRXhsYm1kMGFDc3JPMXh1SUNBZ0lIMWNibHh1SUNBZ0lDOHZJRkJsY21admNtMXpJSFJvWlNCc1pXNW5kR2dnYjJZZ1pXUnBkQ0JwZEdWeVlYUnBiMjR1SUVseklHRWdZbWwwSUdaMVoyeDVJR0Z6SUhSb2FYTWdhR0Z6SUhSdklITjFjSEJ2Y25RZ2RHaGxYRzRnSUNBZ0x5OGdjM2x1WXlCaGJtUWdZWE41Ym1NZ2JXOWtaU0IzYUdsamFDQnBjeUJ1WlhabGNpQm1kVzR1SUV4dmIzQnpJRzkyWlhJZ1pYaGxZMFZrYVhSTVpXNW5kR2dnZFc1MGFXd2dZU0IyWVd4MVpWeHVJQ0FnSUM4dklHbHpJSEJ5YjJSMVkyVmtMQ0J2Y2lCMWJuUnBiQ0IwYUdVZ1pXUnBkQ0JzWlc1bmRHZ2daWGhqWldWa2N5QnZjSFJwYjI1ekxtMWhlRVZrYVhSTVpXNW5kR2dnS0dsbUlHZHBkbVZ1S1N4Y2JpQWdJQ0F2THlCcGJpQjNhR2xqYUNCallYTmxJR2wwSUhkcGJHd2djbVYwZFhKdUlIVnVaR1ZtYVc1bFpDNWNiaUFnSUNCcFppQW9ZMkZzYkdKaFkyc3BJSHRjYmlBZ0lDQWdJQ2htZFc1amRHbHZiaUJsZUdWaktDa2dlMXh1SUNBZ0lDQWdJQ0J6WlhSVWFXMWxiM1YwS0daMWJtTjBhVzl1S0NrZ2UxeHVJQ0FnSUNBZ0lDQWdJR2xtSUNobFpHbDBUR1Z1WjNSb0lENGdiV0Y0UldScGRFeGxibWQwYUNCOGZDQkVZWFJsTG01dmR5Z3BJRDRnWVdKdmNuUkJablJsY2xScGJXVnpkR0Z0Y0NrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJR05oYkd4aVlXTnJLQ2s3WEc0Z0lDQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQWdJQ0FnYVdZZ0tDRmxlR1ZqUldScGRFeGxibWQwYUNncEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCbGVHVmpLQ2s3WEc0Z0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQjlMQ0F3S1R0Y2JpQWdJQ0FnSUgwb0tTazdYRzRnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUhkb2FXeGxJQ2hsWkdsMFRHVnVaM1JvSUR3OUlHMWhlRVZrYVhSTVpXNW5kR2dnSmlZZ1JHRjBaUzV1YjNjb0tTQThQU0JoWW05eWRFRm1kR1Z5VkdsdFpYTjBZVzF3S1NCN1hHNGdJQ0FnSUNBZ0lHeGxkQ0J5WlhRZ1BTQmxlR1ZqUldScGRFeGxibWQwYUNncE8xeHVJQ0FnSUNBZ0lDQnBaaUFvY21WMEtTQjdYRzRnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJSEpsZER0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgxY2JpQWdmU3hjYmx4dUlDQmhaR1JVYjFCaGRHZ29jR0YwYUN3Z1lXUmtaV1FzSUhKbGJXOTJaV1FzSUc5c1pGQnZjMGx1WXlrZ2UxeHVJQ0FnSUd4bGRDQnNZWE4wSUQwZ2NHRjBhQzVzWVhOMFEyOXRjRzl1Wlc1ME8xeHVJQ0FnSUdsbUlDaHNZWE4wSUNZbUlHeGhjM1F1WVdSa1pXUWdQVDA5SUdGa1pHVmtJQ1ltSUd4aGMzUXVjbVZ0YjNabFpDQTlQVDBnY21WdGIzWmxaQ2tnZTF4dUlDQWdJQ0FnY21WMGRYSnVJSHRjYmlBZ0lDQWdJQ0FnYjJ4a1VHOXpPaUJ3WVhSb0xtOXNaRkJ2Y3lBcklHOXNaRkJ2YzBsdVl5eGNiaUFnSUNBZ0lDQWdiR0Z6ZEVOdmJYQnZibVZ1ZERvZ2UyTnZkVzUwT2lCc1lYTjBMbU52ZFc1MElDc2dNU3dnWVdSa1pXUTZJR0ZrWkdWa0xDQnlaVzF2ZG1Wa09pQnlaVzF2ZG1Wa0xDQndjbVYyYVc5MWMwTnZiWEJ2Ym1WdWREb2diR0Z6ZEM1d2NtVjJhVzkxYzBOdmJYQnZibVZ1ZENCOVhHNGdJQ0FnSUNCOU8xeHVJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdlMXh1SUNBZ0lDQWdJQ0J2YkdSUWIzTTZJSEJoZEdndWIyeGtVRzl6SUNzZ2IyeGtVRzl6U1c1akxGeHVJQ0FnSUNBZ0lDQnNZWE4wUTI5dGNHOXVaVzUwT2lCN1kyOTFiblE2SURFc0lHRmtaR1ZrT2lCaFpHUmxaQ3dnY21WdGIzWmxaRG9nY21WdGIzWmxaQ3dnY0hKbGRtbHZkWE5EYjIxd2IyNWxiblE2SUd4aGMzUWdmVnh1SUNBZ0lDQWdmVHRjYmlBZ0lDQjlYRzRnSUgwc1hHNGdJR1Y0ZEhKaFkzUkRiMjF0YjI0b1ltRnpaVkJoZEdnc0lHNWxkMU4wY21sdVp5d2diMnhrVTNSeWFXNW5MQ0JrYVdGbmIyNWhiRkJoZEdncElIdGNiaUFnSUNCc1pYUWdibVYzVEdWdUlEMGdibVYzVTNSeWFXNW5MbXhsYm1kMGFDeGNiaUFnSUNBZ0lDQWdiMnhrVEdWdUlEMGdiMnhrVTNSeWFXNW5MbXhsYm1kMGFDeGNiaUFnSUNBZ0lDQWdiMnhrVUc5eklEMGdZbUZ6WlZCaGRHZ3ViMnhrVUc5ekxGeHVJQ0FnSUNBZ0lDQnVaWGRRYjNNZ1BTQnZiR1JRYjNNZ0xTQmthV0ZuYjI1aGJGQmhkR2dzWEc1Y2JpQWdJQ0FnSUNBZ1kyOXRiVzl1UTI5MWJuUWdQU0F3TzF4dUlDQWdJSGRvYVd4bElDaHVaWGRRYjNNZ0t5QXhJRHdnYm1WM1RHVnVJQ1ltSUc5c1pGQnZjeUFySURFZ1BDQnZiR1JNWlc0Z0ppWWdkR2hwY3k1bGNYVmhiSE1vYm1WM1UzUnlhVzVuVzI1bGQxQnZjeUFySURGZExDQnZiR1JUZEhKcGJtZGJiMnhrVUc5eklDc2dNVjBwS1NCN1hHNGdJQ0FnSUNCdVpYZFFiM01yS3p0Y2JpQWdJQ0FnSUc5c1pGQnZjeXNyTzF4dUlDQWdJQ0FnWTI5dGJXOXVRMjkxYm5Rckt6dGNiaUFnSUNCOVhHNWNiaUFnSUNCcFppQW9ZMjl0Ylc5dVEyOTFiblFwSUh0Y2JpQWdJQ0FnSUdKaGMyVlFZWFJvTG14aGMzUkRiMjF3YjI1bGJuUWdQU0I3WTI5MWJuUTZJR052YlcxdmJrTnZkVzUwTENCd2NtVjJhVzkxYzBOdmJYQnZibVZ1ZERvZ1ltRnpaVkJoZEdndWJHRnpkRU52YlhCdmJtVnVkSDA3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdZbUZ6WlZCaGRHZ3ViMnhrVUc5eklEMGdiMnhrVUc5ek8xeHVJQ0FnSUhKbGRIVnliaUJ1WlhkUWIzTTdYRzRnSUgwc1hHNWNiaUFnWlhGMVlXeHpLR3hsWm5Rc0lISnBaMmgwS1NCN1hHNGdJQ0FnYVdZZ0tIUm9hWE11YjNCMGFXOXVjeTVqYjIxd1lYSmhkRzl5S1NCN1hHNGdJQ0FnSUNCeVpYUjFjbTRnZEdocGN5NXZjSFJwYjI1ekxtTnZiWEJoY21GMGIzSW9iR1ZtZEN3Z2NtbG5hSFFwTzF4dUlDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z2JHVm1kQ0E5UFQwZ2NtbG5hSFJjYmlBZ0lDQWdJQ0FnZkh3Z0tIUm9hWE11YjNCMGFXOXVjeTVwWjI1dmNtVkRZWE5sSUNZbUlHeGxablF1ZEc5TWIzZGxja05oYzJVb0tTQTlQVDBnY21sbmFIUXVkRzlNYjNkbGNrTmhjMlVvS1NrN1hHNGdJQ0FnZlZ4dUlDQjlMRnh1SUNCeVpXMXZkbVZGYlhCMGVTaGhjbkpoZVNrZ2UxeHVJQ0FnSUd4bGRDQnlaWFFnUFNCYlhUdGNiaUFnSUNCbWIzSWdLR3hsZENCcElEMGdNRHNnYVNBOElHRnljbUY1TG14bGJtZDBhRHNnYVNzcktTQjdYRzRnSUNBZ0lDQnBaaUFvWVhKeVlYbGJhVjBwSUh0Y2JpQWdJQ0FnSUNBZ2NtVjBMbkIxYzJnb1lYSnlZWGxiYVYwcE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgxY2JpQWdJQ0J5WlhSMWNtNGdjbVYwTzF4dUlDQjlMRnh1SUNCallYTjBTVzV3ZFhRb2RtRnNkV1VwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdkbUZzZFdVN1hHNGdJSDBzWEc0Z0lIUnZhMlZ1YVhwbEtIWmhiSFZsS1NCN1hHNGdJQ0FnY21WMGRYSnVJSFpoYkhWbExuTndiR2wwS0NjbktUdGNiaUFnZlN4Y2JpQWdhbTlwYmloamFHRnljeWtnZTF4dUlDQWdJSEpsZEhWeWJpQmphR0Z5Y3k1cWIybHVLQ2NuS1R0Y2JpQWdmVnh1ZlR0Y2JseHVablZ1WTNScGIyNGdZblZwYkdSV1lXeDFaWE1vWkdsbVppd2diR0Z6ZEVOdmJYQnZibVZ1ZEN3Z2JtVjNVM1J5YVc1bkxDQnZiR1JUZEhKcGJtY3NJSFZ6WlV4dmJtZGxjM1JVYjJ0bGJpa2dlMXh1SUNBdkx5QkdhWEp6ZENCM1pTQmpiMjUyWlhKMElHOTFjaUJzYVc1clpXUWdiR2x6ZENCdlppQmpiMjF3YjI1bGJuUnpJR2x1SUhKbGRtVnljMlVnYjNKa1pYSWdkRzhnWVc1Y2JpQWdMeThnWVhKeVlYa2dhVzRnZEdobElISnBaMmgwSUc5eVpHVnlPbHh1SUNCamIyNXpkQ0JqYjIxd2IyNWxiblJ6SUQwZ1cxMDdYRzRnSUd4bGRDQnVaWGgwUTI5dGNHOXVaVzUwTzF4dUlDQjNhR2xzWlNBb2JHRnpkRU52YlhCdmJtVnVkQ2tnZTF4dUlDQWdJR052YlhCdmJtVnVkSE11Y0hWemFDaHNZWE4wUTI5dGNHOXVaVzUwS1R0Y2JpQWdJQ0J1WlhoMFEyOXRjRzl1Wlc1MElEMGdiR0Z6ZEVOdmJYQnZibVZ1ZEM1d2NtVjJhVzkxYzBOdmJYQnZibVZ1ZER0Y2JpQWdJQ0JrWld4bGRHVWdiR0Z6ZEVOdmJYQnZibVZ1ZEM1d2NtVjJhVzkxYzBOdmJYQnZibVZ1ZER0Y2JpQWdJQ0JzWVhOMFEyOXRjRzl1Wlc1MElEMGdibVY0ZEVOdmJYQnZibVZ1ZER0Y2JpQWdmVnh1SUNCamIyMXdiMjVsYm5SekxuSmxkbVZ5YzJVb0tUdGNibHh1SUNCc1pYUWdZMjl0Y0c5dVpXNTBVRzl6SUQwZ01DeGNiaUFnSUNBZ0lHTnZiWEJ2Ym1WdWRFeGxiaUE5SUdOdmJYQnZibVZ1ZEhNdWJHVnVaM1JvTEZ4dUlDQWdJQ0FnYm1WM1VHOXpJRDBnTUN4Y2JpQWdJQ0FnSUc5c1pGQnZjeUE5SURBN1hHNWNiaUFnWm05eUlDZzdJR052YlhCdmJtVnVkRkJ2Y3lBOElHTnZiWEJ2Ym1WdWRFeGxianNnWTI5dGNHOXVaVzUwVUc5ekt5c3BJSHRjYmlBZ0lDQnNaWFFnWTI5dGNHOXVaVzUwSUQwZ1kyOXRjRzl1Wlc1MGMxdGpiMjF3YjI1bGJuUlFiM05kTzF4dUlDQWdJR2xtSUNnaFkyOXRjRzl1Wlc1MExuSmxiVzkyWldRcElIdGNiaUFnSUNBZ0lHbG1JQ2doWTI5dGNHOXVaVzUwTG1Ga1pHVmtJQ1ltSUhWelpVeHZibWRsYzNSVWIydGxiaWtnZTF4dUlDQWdJQ0FnSUNCc1pYUWdkbUZzZFdVZ1BTQnVaWGRUZEhKcGJtY3VjMnhwWTJVb2JtVjNVRzl6TENCdVpYZFFiM01nS3lCamIyMXdiMjVsYm5RdVkyOTFiblFwTzF4dUlDQWdJQ0FnSUNCMllXeDFaU0E5SUhaaGJIVmxMbTFoY0NobWRXNWpkR2x2YmloMllXeDFaU3dnYVNrZ2UxeHVJQ0FnSUNBZ0lDQWdJR3hsZENCdmJHUldZV3gxWlNBOUlHOXNaRk4wY21sdVoxdHZiR1JRYjNNZ0t5QnBYVHRjYmlBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnYjJ4a1ZtRnNkV1V1YkdWdVozUm9JRDRnZG1Gc2RXVXViR1Z1WjNSb0lEOGdiMnhrVm1Gc2RXVWdPaUIyWVd4MVpUdGNiaUFnSUNBZ0lDQWdmU2s3WEc1Y2JpQWdJQ0FnSUNBZ1kyOXRjRzl1Wlc1MExuWmhiSFZsSUQwZ1pHbG1aaTVxYjJsdUtIWmhiSFZsS1R0Y2JpQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUdOdmJYQnZibVZ1ZEM1MllXeDFaU0E5SUdScFptWXVhbTlwYmlodVpYZFRkSEpwYm1jdWMyeHBZMlVvYm1WM1VHOXpMQ0J1WlhkUWIzTWdLeUJqYjIxd2IyNWxiblF1WTI5MWJuUXBLVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQWdJRzVsZDFCdmN5QXJQU0JqYjIxd2IyNWxiblF1WTI5MWJuUTdYRzVjYmlBZ0lDQWdJQzh2SUVOdmJXMXZiaUJqWVhObFhHNGdJQ0FnSUNCcFppQW9JV052YlhCdmJtVnVkQzVoWkdSbFpDa2dlMXh1SUNBZ0lDQWdJQ0J2YkdSUWIzTWdLejBnWTI5dGNHOXVaVzUwTG1OdmRXNTBPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNCamIyMXdiMjVsYm5RdWRtRnNkV1VnUFNCa2FXWm1MbXB2YVc0b2IyeGtVM1J5YVc1bkxuTnNhV05sS0c5c1pGQnZjeXdnYjJ4a1VHOXpJQ3NnWTI5dGNHOXVaVzUwTG1OdmRXNTBLU2s3WEc0Z0lDQWdJQ0J2YkdSUWIzTWdLejBnWTI5dGNHOXVaVzUwTG1OdmRXNTBPMXh1WEc0Z0lDQWdJQ0F2THlCU1pYWmxjbk5sSUdGa1pDQmhibVFnY21WdGIzWmxJSE52SUhKbGJXOTJaWE1nWVhKbElHOTFkSEIxZENCbWFYSnpkQ0IwYnlCdFlYUmphQ0JqYjIxdGIyNGdZMjl1ZG1WdWRHbHZibHh1SUNBZ0lDQWdMeThnVkdobElHUnBabVpwYm1jZ1lXeG5iM0pwZEdodElHbHpJSFJwWldRZ2RHOGdZV1JrSUhSb1pXNGdjbVZ0YjNabElHOTFkSEIxZENCaGJtUWdkR2hwY3lCcGN5QjBhR1VnYzJsdGNHeGxjM1JjYmlBZ0lDQWdJQzh2SUhKdmRYUmxJSFJ2SUdkbGRDQjBhR1VnWkdWemFYSmxaQ0J2ZFhSd2RYUWdkMmwwYUNCdGFXNXBiV0ZzSUc5MlpYSm9aV0ZrTGx4dUlDQWdJQ0FnYVdZZ0tHTnZiWEJ2Ym1WdWRGQnZjeUFtSmlCamIyMXdiMjVsYm5SelcyTnZiWEJ2Ym1WdWRGQnZjeUF0SURGZExtRmtaR1ZrS1NCN1hHNGdJQ0FnSUNBZ0lHeGxkQ0IwYlhBZ1BTQmpiMjF3YjI1bGJuUnpXMk52YlhCdmJtVnVkRkJ2Y3lBdElERmRPMXh1SUNBZ0lDQWdJQ0JqYjIxd2IyNWxiblJ6VzJOdmJYQnZibVZ1ZEZCdmN5QXRJREZkSUQwZ1kyOXRjRzl1Wlc1MGMxdGpiMjF3YjI1bGJuUlFiM05kTzF4dUlDQWdJQ0FnSUNCamIyMXdiMjVsYm5SelcyTnZiWEJ2Ym1WdWRGQnZjMTBnUFNCMGJYQTdYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZWeHVJQ0I5WEc1Y2JpQWdMeThnVTNCbFkybGhiQ0JqWVhObElHaGhibVJzWlNCbWIzSWdkMmhsYmlCdmJtVWdkR1Z5YldsdVlXd2dhWE1nYVdkdWIzSmxaQ0FvYVM1bExpQjNhR2wwWlhOd1lXTmxLUzVjYmlBZ0x5OGdSbTl5SUhSb2FYTWdZMkZ6WlNCM1pTQnRaWEpuWlNCMGFHVWdkR1Z5YldsdVlXd2dhVzUwYnlCMGFHVWdjSEpwYjNJZ2MzUnlhVzVuSUdGdVpDQmtjbTl3SUhSb1pTQmphR0Z1WjJVdVhHNGdJQzh2SUZSb2FYTWdhWE1nYjI1c2VTQmhkbUZwYkdGaWJHVWdabTl5SUhOMGNtbHVaeUJ0YjJSbExseHVJQ0JzWlhRZ1ptbHVZV3hEYjIxd2IyNWxiblFnUFNCamIyMXdiMjVsYm5SelcyTnZiWEJ2Ym1WdWRFeGxiaUF0SURGZE8xeHVJQ0JwWmlBb1kyOXRjRzl1Wlc1MFRHVnVJRDRnTVZ4dUlDQWdJQ0FnSmlZZ2RIbHdaVzltSUdacGJtRnNRMjl0Y0c5dVpXNTBMblpoYkhWbElEMDlQU0FuYzNSeWFXNW5KMXh1SUNBZ0lDQWdKaVlnS0dacGJtRnNRMjl0Y0c5dVpXNTBMbUZrWkdWa0lIeDhJR1pwYm1Gc1EyOXRjRzl1Wlc1MExuSmxiVzkyWldRcFhHNGdJQ0FnSUNBbUppQmthV1ptTG1WeGRXRnNjeWduSnl3Z1ptbHVZV3hEYjIxd2IyNWxiblF1ZG1Gc2RXVXBLU0I3WEc0Z0lDQWdZMjl0Y0c5dVpXNTBjMXRqYjIxd2IyNWxiblJNWlc0Z0xTQXlYUzUyWVd4MVpTQXJQU0JtYVc1aGJFTnZiWEJ2Ym1WdWRDNTJZV3gxWlR0Y2JpQWdJQ0JqYjIxd2IyNWxiblJ6TG5CdmNDZ3BPMXh1SUNCOVhHNWNiaUFnY21WMGRYSnVJR052YlhCdmJtVnVkSE03WEc1OVhHNGlYWDA9XG4iLCAiLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRpZmZDaGFycyA9IGRpZmZDaGFycztcbmV4cG9ydHMuY2hhcmFjdGVyRGlmZiA9IHZvaWQgMDtcblxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbnZhclxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuX2Jhc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2Jhc2VcIikpXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuO1xuXG4vKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovIGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xudmFyIGNoYXJhY3RlckRpZmYgPSBuZXdcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl9iYXNlXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuW1xuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuXCJkZWZhdWx0XCJcbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG5dKCk7XG5cbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbmV4cG9ydHMuY2hhcmFjdGVyRGlmZiA9IGNoYXJhY3RlckRpZmY7XG5cbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG5mdW5jdGlvbiBkaWZmQ2hhcnMob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGNoYXJhY3RlckRpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTlrYVdabUwyTm9ZWEpoWTNSbGNpNXFjeUpkTENKdVlXMWxjeUk2V3lKamFHRnlZV04wWlhKRWFXWm1JaXdpUkdsbVppSXNJbVJwWm1aRGFHRnljeUlzSW05c1pGTjBjaUlzSW01bGQxTjBjaUlzSW05d2RHbHZibk1pTENKa2FXWm1JbDBzSW0xaGNIQnBibWR6SWpvaU96czdPenM3T3pzN08wRkJRVUU3UVVGQlFUdEJRVUZCTzBGQlFVRTdRVUZCUVRzN096czdRVUZGVHl4SlFVRk5RU3hoUVVGaExFZEJRVWM3UVVGQlNVTTdRVUZCUVVFN1FVRkJRVUU3UVVGQlFVRTdRVUZCUVVFN1FVRkJRVUU3UVVGQlFVRTdRVUZCUVVFc1EwRkJTaXhGUVVGMFFqczdPenM3TzBGQlEwRXNVMEZCVTBNc1UwRkJWQ3hEUVVGdFFrTXNUVUZCYmtJc1JVRkJNa0pETEUxQlFUTkNMRVZCUVcxRFF5eFBRVUZ1UXl4RlFVRTBRenRCUVVGRkxGTkJRVTlNTEdGQlFXRXNRMEZCUTAwc1NVRkJaQ3hEUVVGdFFrZ3NUVUZCYmtJc1JVRkJNa0pETEUxQlFUTkNMRVZCUVcxRFF5eFBRVUZ1UXl4RFFVRlFPMEZCUVhGRUlpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lhVzF3YjNKMElFUnBabVlnWm5KdmJTQW5MaTlpWVhObEp6dGNibHh1Wlhod2IzSjBJR052Ym5OMElHTm9ZWEpoWTNSbGNrUnBabVlnUFNCdVpYY2dSR2xtWmlncE8xeHVaWGh3YjNKMElHWjFibU4wYVc5dUlHUnBabVpEYUdGeWN5aHZiR1JUZEhJc0lHNWxkMU4wY2l3Z2IzQjBhVzl1Y3lrZ2V5QnlaWFIxY200Z1kyaGhjbUZqZEdWeVJHbG1aaTVrYVdabUtHOXNaRk4wY2l3Z2JtVjNVM1J5TENCdmNIUnBiMjV6S1RzZ2ZWeHVJbDE5XG4iLCAiLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmdlbmVyYXRlT3B0aW9ucyA9IGdlbmVyYXRlT3B0aW9ucztcblxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbmZ1bmN0aW9uIGdlbmVyYXRlT3B0aW9ucyhvcHRpb25zLCBkZWZhdWx0cykge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBkZWZhdWx0cy5jYWxsYmFjayA9IG9wdGlvbnM7XG4gIH0gZWxzZSBpZiAob3B0aW9ucykge1xuICAgIGZvciAodmFyIG5hbWUgaW4gb3B0aW9ucykge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgIGRlZmF1bHRzW25hbWVdID0gb3B0aW9uc1tuYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGVmYXVsdHM7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTkxZEdsc0wzQmhjbUZ0Y3k1cWN5SmRMQ0p1WVcxbGN5STZXeUpuWlc1bGNtRjBaVTl3ZEdsdmJuTWlMQ0p2Y0hScGIyNXpJaXdpWkdWbVlYVnNkSE1pTENKallXeHNZbUZqYXlJc0ltNWhiV1VpTENKb1lYTlBkMjVRY205d1pYSjBlU0pkTENKdFlYQndhVzVuY3lJNklqczdPenM3T3pzN08wRkJRVThzVTBGQlUwRXNaVUZCVkN4RFFVRjVRa01zVDBGQmVrSXNSVUZCYTBORExGRkJRV3hETEVWQlFUUkRPMEZCUTJwRUxFMUJRVWtzVDBGQlQwUXNUMEZCVUN4TFFVRnRRaXhWUVVGMlFpeEZRVUZ0UXp0QlFVTnFRME1zU1VGQlFVRXNVVUZCVVN4RFFVRkRReXhSUVVGVUxFZEJRVzlDUml4UFFVRndRanRCUVVORUxFZEJSa1FzVFVGRlR5eEpRVUZKUVN4UFFVRktMRVZCUVdFN1FVRkRiRUlzVTBGQlN5eEpRVUZKUnl4SlFVRlVMRWxCUVdsQ1NDeFBRVUZxUWl4RlFVRXdRanRCUVVONFFqdEJRVU5CTEZWQlFVbEJMRTlCUVU4c1EwRkJRMGtzWTBGQlVpeERRVUYxUWtRc1NVRkJka0lzUTBGQlNpeEZRVUZyUXp0QlFVTm9RMFlzVVVGQlFVRXNVVUZCVVN4RFFVRkRSU3hKUVVGRUxFTkJRVklzUjBGQmFVSklMRTlCUVU4c1EwRkJRMGNzU1VGQlJDeERRVUY0UWp0QlFVTkVPMEZCUTBZN1FVRkRSanM3UVVGRFJDeFRRVUZQUml4UlFVRlFPMEZCUTBRaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SmxlSEJ2Y25RZ1puVnVZM1JwYjI0Z1oyVnVaWEpoZEdWUGNIUnBiMjV6S0c5d2RHbHZibk1zSUdSbFptRjFiSFJ6S1NCN1hHNGdJR2xtSUNoMGVYQmxiMllnYjNCMGFXOXVjeUE5UFQwZ0oyWjFibU4wYVc5dUp5a2dlMXh1SUNBZ0lHUmxabUYxYkhSekxtTmhiR3hpWVdOcklEMGdiM0IwYVc5dWN6dGNiaUFnZlNCbGJITmxJR2xtSUNodmNIUnBiMjV6S1NCN1hHNGdJQ0FnWm05eUlDaHNaWFFnYm1GdFpTQnBiaUJ2Y0hScGIyNXpLU0I3WEc0Z0lDQWdJQ0F2S2lCcGMzUmhibUoxYkNCcFoyNXZjbVVnWld4elpTQXFMMXh1SUNBZ0lDQWdhV1lnS0c5d2RHbHZibk11YUdGelQzZHVVSEp2Y0dWeWRIa29ibUZ0WlNrcElIdGNiaUFnSUNBZ0lDQWdaR1ZtWVhWc2RITmJibUZ0WlYwZ1BTQnZjSFJwYjI1elcyNWhiV1ZkTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmlBZ2ZWeHVJQ0J5WlhSMWNtNGdaR1ZtWVhWc2RITTdYRzU5WEc0aVhYMD1cbiIsICIvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5cInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGlmZldvcmRzID0gZGlmZldvcmRzO1xuZXhwb3J0cy5kaWZmV29yZHNXaXRoU3BhY2UgPSBkaWZmV29yZHNXaXRoU3BhY2U7XG5leHBvcnRzLndvcmREaWZmID0gdm9pZCAwO1xuXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xudmFyXG4vKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5fYmFzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vYmFzZVwiKSlcbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG47XG5cbnZhclxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuX3BhcmFtcyA9IHJlcXVpcmUoXCIuLi91dGlsL3BhcmFtc1wiKVxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbjtcblxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbi8vIEJhc2VkIG9uIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xhdGluX3NjcmlwdF9pbl9Vbmljb2RlXG4vL1xuLy8gUmFuZ2VzIGFuZCBleGNlcHRpb25zOlxuLy8gTGF0aW4tMSBTdXBwbGVtZW50LCAwMDgw4oCTMDBGRlxuLy8gIC0gVSswMEQ3ICDDlyBNdWx0aXBsaWNhdGlvbiBzaWduXG4vLyAgLSBVKzAwRjcgIMO3IERpdmlzaW9uIHNpZ25cbi8vIExhdGluIEV4dGVuZGVkLUEsIDAxMDDigJMwMTdGXG4vLyBMYXRpbiBFeHRlbmRlZC1CLCAwMTgw4oCTMDI0RlxuLy8gSVBBIEV4dGVuc2lvbnMsIDAyNTDigJMwMkFGXG4vLyBTcGFjaW5nIE1vZGlmaWVyIExldHRlcnMsIDAyQjDigJMwMkZGXG4vLyAgLSBVKzAyQzcgIMuHICYjNzExOyAgQ2Fyb25cbi8vICAtIFUrMDJEOCAgy5ggJiM3Mjg7ICBCcmV2ZVxuLy8gIC0gVSswMkQ5ICDLmSAmIzcyOTsgIERvdCBBYm92ZVxuLy8gIC0gVSswMkRBICDLmiAmIzczMDsgIFJpbmcgQWJvdmVcbi8vICAtIFUrMDJEQiAgy5sgJiM3MzE7ICBPZ29uZWtcbi8vICAtIFUrMDJEQyAgy5wgJiM3MzI7ICBTbWFsbCBUaWxkZVxuLy8gIC0gVSswMkREICDLnSAmIzczMzsgIERvdWJsZSBBY3V0ZSBBY2NlbnRcbi8vIExhdGluIEV4dGVuZGVkIEFkZGl0aW9uYWwsIDFFMDDigJMxRUZGXG52YXIgZXh0ZW5kZWRXb3JkQ2hhcnMgPSAvXltBLVphLXpcXHhDMC1cXHUwMkM2XFx1MDJDOC1cXHUwMkQ3XFx1MDJERS1cXHUwMkZGXFx1MUUwMC1cXHUxRUZGXSskLztcbnZhciByZVdoaXRlc3BhY2UgPSAvXFxTLztcbnZhciB3b3JkRGlmZiA9IG5ld1xuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuX2Jhc2Vcbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG5bXG4vKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5cImRlZmF1bHRcIlxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbl0oKTtcblxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuZXhwb3J0cy53b3JkRGlmZiA9IHdvcmREaWZmO1xuXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xud29yZERpZmYuZXF1YWxzID0gZnVuY3Rpb24gKGxlZnQsIHJpZ2h0KSB7XG4gIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlQ2FzZSkge1xuICAgIGxlZnQgPSBsZWZ0LnRvTG93ZXJDYXNlKCk7XG4gICAgcmlnaHQgPSByaWdodC50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgcmV0dXJuIGxlZnQgPT09IHJpZ2h0IHx8IHRoaXMub3B0aW9ucy5pZ25vcmVXaGl0ZXNwYWNlICYmICFyZVdoaXRlc3BhY2UudGVzdChsZWZ0KSAmJiAhcmVXaGl0ZXNwYWNlLnRlc3QocmlnaHQpO1xufTtcblxud29yZERpZmYudG9rZW5pemUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgLy8gQWxsIHdoaXRlc3BhY2Ugc3ltYm9scyBleGNlcHQgbmV3bGluZSBncm91cCBpbnRvIG9uZSB0b2tlbiwgZWFjaCBuZXdsaW5lIC0gaW4gc2VwYXJhdGUgdG9rZW5cbiAgdmFyIHRva2VucyA9IHZhbHVlLnNwbGl0KC8oW15cXFNcXHJcXG5dK3xbKClbXFxde30nXCJcXHJcXG5dfFxcYikvKTsgLy8gSm9pbiB0aGUgYm91bmRhcnkgc3BsaXRzIHRoYXQgd2UgZG8gbm90IGNvbnNpZGVyIHRvIGJlIGJvdW5kYXJpZXMuIFRoaXMgaXMgcHJpbWFyaWx5IHRoZSBleHRlbmRlZCBMYXRpbiBjaGFyYWN0ZXIgc2V0LlxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIC8vIElmIHdlIGhhdmUgYW4gZW1wdHkgc3RyaW5nIGluIHRoZSBuZXh0IGZpZWxkIGFuZCB3ZSBoYXZlIG9ubHkgd29yZCBjaGFycyBiZWZvcmUgYW5kIGFmdGVyLCBtZXJnZVxuICAgIGlmICghdG9rZW5zW2kgKyAxXSAmJiB0b2tlbnNbaSArIDJdICYmIGV4dGVuZGVkV29yZENoYXJzLnRlc3QodG9rZW5zW2ldKSAmJiBleHRlbmRlZFdvcmRDaGFycy50ZXN0KHRva2Vuc1tpICsgMl0pKSB7XG4gICAgICB0b2tlbnNbaV0gKz0gdG9rZW5zW2kgKyAyXTtcbiAgICAgIHRva2Vucy5zcGxpY2UoaSArIDEsIDIpO1xuICAgICAgaS0tO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0b2tlbnM7XG59O1xuXG5mdW5jdGlvbiBkaWZmV29yZHMob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9XG4gIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgKDAsXG4gIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG5cbiAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICBfcGFyYW1zXG4gIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gIC5cbiAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICBnZW5lcmF0ZU9wdGlvbnMpXG4gIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gIChvcHRpb25zLCB7XG4gICAgaWdub3JlV2hpdGVzcGFjZTogdHJ1ZVxuICB9KTtcbiAgcmV0dXJuIHdvcmREaWZmLmRpZmYob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBkaWZmV29yZHNXaXRoU3BhY2Uob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHdvcmREaWZmLmRpZmYob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMM055WXk5a2FXWm1MM2R2Y21RdWFuTWlYU3dpYm1GdFpYTWlPbHNpWlhoMFpXNWtaV1JYYjNKa1EyaGhjbk1pTENKeVpWZG9hWFJsYzNCaFkyVWlMQ0ozYjNKa1JHbG1aaUlzSWtScFptWWlMQ0psY1hWaGJITWlMQ0pzWldaMElpd2ljbWxuYUhRaUxDSnZjSFJwYjI1eklpd2lhV2R1YjNKbFEyRnpaU0lzSW5SdlRHOTNaWEpEWVhObElpd2lhV2R1YjNKbFYyaHBkR1Z6Y0dGalpTSXNJblJsYzNRaUxDSjBiMnRsYm1sNlpTSXNJblpoYkhWbElpd2lkRzlyWlc1eklpd2ljM0JzYVhRaUxDSnBJaXdpYkdWdVozUm9JaXdpYzNCc2FXTmxJaXdpWkdsbVpsZHZjbVJ6SWl3aWIyeGtVM1J5SWl3aWJtVjNVM1J5SWl3aVoyVnVaWEpoZEdWUGNIUnBiMjV6SWl3aVpHbG1aaUlzSW1ScFptWlhiM0prYzFkcGRHaFRjR0ZqWlNKZExDSnRZWEJ3YVc1bmN5STZJanM3T3pzN096czdPenM3UVVGQlFUdEJRVUZCTzBGQlFVRTdRVUZCUVR0QlFVRkJPenRCUVVOQk8wRkJRVUU3UVVGQlFUdEJRVUZCTzBGQlFVRTdPenM3TzBGQlJVRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRXNTVUZCVFVFc2FVSkJRV2xDTEVkQlFVY3NLMFJCUVRGQ08wRkJSVUVzU1VGQlRVTXNXVUZCV1N4SFFVRkhMRWxCUVhKQ08wRkJSVThzU1VGQlRVTXNVVUZCVVN4SFFVRkhPMEZCUVVsRE8wRkJRVUZCTzBGQlFVRkJPMEZCUVVGQk8wRkJRVUZCTzBGQlFVRkJPMEZCUVVGQk8wRkJRVUZCTEVOQlFVb3NSVUZCYWtJN096czdPenRCUVVOUVJDeFJRVUZSTEVOQlFVTkZMRTFCUVZRc1IwRkJhMElzVlVGQlUwTXNTVUZCVkN4RlFVRmxReXhMUVVGbUxFVkJRWE5DTzBGQlEzUkRMRTFCUVVrc1MwRkJTME1zVDBGQlRDeERRVUZoUXl4VlFVRnFRaXhGUVVFMlFqdEJRVU16UWtnc1NVRkJRVUVzU1VGQlNTeEhRVUZIUVN4SlFVRkpMRU5CUVVOSkxGZEJRVXdzUlVGQlVEdEJRVU5CU0N4SlFVRkJRU3hMUVVGTExFZEJRVWRCTEV0QlFVc3NRMEZCUTBjc1YwRkJUaXhGUVVGU08wRkJRMFE3TzBGQlEwUXNVMEZCVDBvc1NVRkJTU3hMUVVGTFF5eExRVUZVTEVsQlFXMUNMRXRCUVV0RExFOUJRVXdzUTBGQllVY3NaMEpCUVdJc1NVRkJhVU1zUTBGQlExUXNXVUZCV1N4RFFVRkRWU3hKUVVGaUxFTkJRV3RDVGl4SlFVRnNRaXhEUVVGc1F5eEpRVUUyUkN4RFFVRkRTaXhaUVVGWkxFTkJRVU5WTEVsQlFXSXNRMEZCYTBKTUxFdEJRV3hDTEVOQlFYaEdPMEZCUTBRc1EwRk9SRHM3UVVGUFFVb3NVVUZCVVN4RFFVRkRWU3hSUVVGVUxFZEJRVzlDTEZWQlFWTkRMRXRCUVZRc1JVRkJaMEk3UVVGRGJFTTdRVUZEUVN4TlFVRkpReXhOUVVGTkxFZEJRVWRFTEV0QlFVc3NRMEZCUTBVc1MwRkJUaXhEUVVGWkxHbERRVUZhTEVOQlFXSXNRMEZHYTBNc1EwRkpiRU03TzBGQlEwRXNUMEZCU3l4SlFVRkpReXhEUVVGRExFZEJRVWNzUTBGQllpeEZRVUZuUWtFc1EwRkJReXhIUVVGSFJpeE5RVUZOTEVOQlFVTkhMRTFCUVZBc1IwRkJaMElzUTBGQmNFTXNSVUZCZFVORUxFTkJRVU1zUlVGQmVFTXNSVUZCTkVNN1FVRkRNVU03UVVGRFFTeFJRVUZKTEVOQlFVTkdMRTFCUVUwc1EwRkJRMFVzUTBGQlF5eEhRVUZITEVOQlFVd3NRMEZCVUN4SlFVRnJRa1lzVFVGQlRTeERRVUZEUlN4RFFVRkRMRWRCUVVjc1EwRkJUQ3hEUVVGNFFpeEpRVU5MYUVJc2FVSkJRV2xDTEVOQlFVTlhMRWxCUVd4Q0xFTkJRWFZDUnl4TlFVRk5MRU5CUVVORkxFTkJRVVFzUTBGQk4wSXNRMEZFVEN4SlFVVkxhRUlzYVVKQlFXbENMRU5CUVVOWExFbEJRV3hDTEVOQlFYVkNSeXhOUVVGTkxFTkJRVU5GTEVOQlFVTXNSMEZCUnl4RFFVRk1MRU5CUVRkQ0xFTkJSbFFzUlVGRlowUTdRVUZET1VOR0xFMUJRVUZCTEUxQlFVMHNRMEZCUTBVc1EwRkJSQ3hEUVVGT0xFbEJRV0ZHTEUxQlFVMHNRMEZCUTBVc1EwRkJReXhIUVVGSExFTkJRVXdzUTBGQmJrSTdRVUZEUVVZc1RVRkJRVUVzVFVGQlRTeERRVUZEU1N4TlFVRlFMRU5CUVdOR0xFTkJRVU1zUjBGQlJ5eERRVUZzUWl4RlFVRnhRaXhEUVVGeVFqdEJRVU5CUVN4TlFVRkJRU3hEUVVGRE8wRkJRMFk3UVVGRFJqczdRVUZGUkN4VFFVRlBSaXhOUVVGUU8wRkJRMFFzUTBGcVFrUTdPMEZCYlVKUExGTkJRVk5MTEZOQlFWUXNRMEZCYlVKRExFMUJRVzVDTEVWQlFUSkNReXhOUVVFelFpeEZRVUZ0UTJRc1QwRkJia01zUlVGQk5FTTdRVUZEYWtSQkxFVkJRVUZCTEU5QlFVODdRVUZCUnp0QlFVRkJPMEZCUVVFN08wRkJRVUZsTzBGQlFVRkJPMEZCUVVGQk8wRkJRVUZCTzBGQlFVRkJPMEZCUVVGQk8wRkJRVUU3UVVGQlFTeEhRVUZuUW1Zc1QwRkJhRUlzUlVGQmVVSTdRVUZCUTBjc1NVRkJRVUVzWjBKQlFXZENMRVZCUVVVN1FVRkJia0lzUjBGQmVrSXNRMEZCVmp0QlFVTkJMRk5CUVU5U0xGRkJRVkVzUTBGQlEzRkNMRWxCUVZRc1EwRkJZMGdzVFVGQlpDeEZRVUZ6UWtNc1RVRkJkRUlzUlVGQk9FSmtMRTlCUVRsQ0xFTkJRVkE3UVVGRFJEczdRVUZGVFN4VFFVRlRhVUlzYTBKQlFWUXNRMEZCTkVKS0xFMUJRVFZDTEVWQlFXOURReXhOUVVGd1F5eEZRVUUwUTJRc1QwRkJOVU1zUlVGQmNVUTdRVUZETVVRc1UwRkJUMHdzVVVGQlVTeERRVUZEY1VJc1NVRkJWQ3hEUVVGalNDeE5RVUZrTEVWQlFYTkNReXhOUVVGMFFpeEZRVUU0UW1Rc1QwRkJPVUlzUTBGQlVEdEJRVU5FSWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaWFXMXdiM0owSUVScFptWWdabkp2YlNBbkxpOWlZWE5sSnp0Y2JtbHRjRzl5ZENCN1oyVnVaWEpoZEdWUGNIUnBiMjV6ZlNCbWNtOXRJQ2N1TGk5MWRHbHNMM0JoY21GdGN5YzdYRzVjYmk4dklFSmhjMlZrSUc5dUlHaDBkSEJ6T2k4dlpXNHVkMmxyYVhCbFpHbGhMbTl5Wnk5M2FXdHBMMHhoZEdsdVgzTmpjbWx3ZEY5cGJsOVZibWxqYjJSbFhHNHZMMXh1THk4Z1VtRnVaMlZ6SUdGdVpDQmxlR05sY0hScGIyNXpPbHh1THk4Z1RHRjBhVzR0TVNCVGRYQndiR1Z0Wlc1MExDQXdNRGd3NG9DVE1EQkdSbHh1THk4Z0lDMGdWU3N3TUVRM0lDRERseUJOZFd4MGFYQnNhV05oZEdsdmJpQnphV2R1WEc0dkx5QWdMU0JWS3pBd1JqY2dJTU8zSUVScGRtbHphVzl1SUhOcFoyNWNiaTh2SUV4aGRHbHVJRVY0ZEdWdVpHVmtMVUVzSURBeE1ERGlnSk13TVRkR1hHNHZMeUJNWVhScGJpQkZlSFJsYm1SbFpDMUNMQ0F3TVRndzRvQ1RNREkwUmx4dUx5OGdTVkJCSUVWNGRHVnVjMmx2Ym5Nc0lEQXlOVERpZ0pNd01rRkdYRzR2THlCVGNHRmphVzVuSUUxdlpHbG1hV1Z5SUV4bGRIUmxjbk1zSURBeVFqRGlnSk13TWtaR1hHNHZMeUFnTFNCVkt6QXlRemNnSU11SElDWWpOekV4T3lBZ1EyRnliMjVjYmk4dklDQXRJRlVyTURKRU9DQWd5NWdnSmlNM01qZzdJQ0JDY21WMlpWeHVMeThnSUMwZ1ZTc3dNa1E1SUNETG1TQW1JemN5T1RzZ0lFUnZkQ0JCWW05MlpWeHVMeThnSUMwZ1ZTc3dNa1JCSUNETG1pQW1JemN6TURzZ0lGSnBibWNnUVdKdmRtVmNiaTh2SUNBdElGVXJNREpFUWlBZ3k1c2dKaU0zTXpFN0lDQlBaMjl1Wld0Y2JpOHZJQ0F0SUZVck1ESkVReUFneTV3Z0ppTTNNekk3SUNCVGJXRnNiQ0JVYVd4a1pWeHVMeThnSUMwZ1ZTc3dNa1JFSUNETG5TQW1JemN6TXpzZ0lFUnZkV0pzWlNCQlkzVjBaU0JCWTJObGJuUmNiaTh2SUV4aGRHbHVJRVY0ZEdWdVpHVmtJRUZrWkdsMGFXOXVZV3dzSURGRk1ERGlnSk14UlVaR1hHNWpiMjV6ZENCbGVIUmxibVJsWkZkdmNtUkRhR0Z5Y3lBOUlDOWVXMkV0ZWtFdFdseGNkWHRETUgwdFhGeDFlMFpHZlZ4Y2RYdEVPSDB0WEZ4MWUwWTJmVnhjZFh0R09IMHRYRngxZXpKRE5uMWNYSFY3TWtNNGZTMWNYSFY3TWtRM2ZWeGNkWHN5UkVWOUxWeGNkWHN5UmtaOVhGeDFlekZGTURCOUxWeGNkWHN4UlVaR2ZWMHJKQzkxTzF4dVhHNWpiMjV6ZENCeVpWZG9hWFJsYzNCaFkyVWdQU0F2WEZ4VEx6dGNibHh1Wlhod2IzSjBJR052Ym5OMElIZHZjbVJFYVdabUlEMGdibVYzSUVScFptWW9LVHRjYm5kdmNtUkVhV1ptTG1WeGRXRnNjeUE5SUdaMWJtTjBhVzl1S0d4bFpuUXNJSEpwWjJoMEtTQjdYRzRnSUdsbUlDaDBhR2x6TG05d2RHbHZibk11YVdkdWIzSmxRMkZ6WlNrZ2UxeHVJQ0FnSUd4bFpuUWdQU0JzWldaMExuUnZURzkzWlhKRFlYTmxLQ2s3WEc0Z0lDQWdjbWxuYUhRZ1BTQnlhV2RvZEM1MGIweHZkMlZ5UTJGelpTZ3BPMXh1SUNCOVhHNGdJSEpsZEhWeWJpQnNaV1owSUQwOVBTQnlhV2RvZENCOGZDQW9kR2hwY3k1dmNIUnBiMjV6TG1sbmJtOXlaVmRvYVhSbGMzQmhZMlVnSmlZZ0lYSmxWMmhwZEdWemNHRmpaUzUwWlhOMEtHeGxablFwSUNZbUlDRnlaVmRvYVhSbGMzQmhZMlV1ZEdWemRDaHlhV2RvZENrcE8xeHVmVHRjYm5kdmNtUkVhV1ptTG5SdmEyVnVhWHBsSUQwZ1puVnVZM1JwYjI0b2RtRnNkV1VwSUh0Y2JpQWdMeThnUVd4c0lIZG9hWFJsYzNCaFkyVWdjM2x0WW05c2N5QmxlR05sY0hRZ2JtVjNiR2x1WlNCbmNtOTFjQ0JwYm5SdklHOXVaU0IwYjJ0bGJpd2daV0ZqYUNCdVpYZHNhVzVsSUMwZ2FXNGdjMlZ3WVhKaGRHVWdkRzlyWlc1Y2JpQWdiR1YwSUhSdmEyVnVjeUE5SUhaaGJIVmxMbk53YkdsMEtDOG9XMTVjWEZOY1hISmNYRzVkSzN4YktDbGJYRnhkZTMwblhDSmNYSEpjWEc1ZGZGeGNZaWt2S1R0Y2JseHVJQ0F2THlCS2IybHVJSFJvWlNCaWIzVnVaR0Z5ZVNCemNHeHBkSE1nZEdoaGRDQjNaU0JrYnlCdWIzUWdZMjl1YzJsa1pYSWdkRzhnWW1VZ1ltOTFibVJoY21sbGN5NGdWR2hwY3lCcGN5QndjbWx0WVhKcGJIa2dkR2hsSUdWNGRHVnVaR1ZrSUV4aGRHbHVJR05vWVhKaFkzUmxjaUJ6WlhRdVhHNGdJR1p2Y2lBb2JHVjBJR2tnUFNBd095QnBJRHdnZEc5clpXNXpMbXhsYm1kMGFDQXRJREU3SUdrckt5a2dlMXh1SUNBZ0lDOHZJRWxtSUhkbElHaGhkbVVnWVc0Z1pXMXdkSGtnYzNSeWFXNW5JR2x1SUhSb1pTQnVaWGgwSUdacFpXeGtJR0Z1WkNCM1pTQm9ZWFpsSUc5dWJIa2dkMjl5WkNCamFHRnljeUJpWldadmNtVWdZVzVrSUdGbWRHVnlMQ0J0WlhKblpWeHVJQ0FnSUdsbUlDZ2hkRzlyWlc1elcya2dLeUF4WFNBbUppQjBiMnRsYm5OYmFTQXJJREpkWEc0Z0lDQWdJQ0FnSUNBZ0ppWWdaWGgwWlc1a1pXUlhiM0prUTJoaGNuTXVkR1Z6ZENoMGIydGxibk5iYVYwcFhHNGdJQ0FnSUNBZ0lDQWdKaVlnWlhoMFpXNWtaV1JYYjNKa1EyaGhjbk11ZEdWemRDaDBiMnRsYm5OYmFTQXJJREpkS1NrZ2UxeHVJQ0FnSUNBZ2RHOXJaVzV6VzJsZElDczlJSFJ2YTJWdWMxdHBJQ3NnTWwwN1hHNGdJQ0FnSUNCMGIydGxibk11YzNCc2FXTmxLR2tnS3lBeExDQXlLVHRjYmlBZ0lDQWdJR2t0TFR0Y2JpQWdJQ0I5WEc0Z0lIMWNibHh1SUNCeVpYUjFjbTRnZEc5clpXNXpPMXh1ZlR0Y2JseHVaWGh3YjNKMElHWjFibU4wYVc5dUlHUnBabVpYYjNKa2N5aHZiR1JUZEhJc0lHNWxkMU4wY2l3Z2IzQjBhVzl1Y3lrZ2UxeHVJQ0J2Y0hScGIyNXpJRDBnWjJWdVpYSmhkR1ZQY0hScGIyNXpLRzl3ZEdsdmJuTXNJSHRwWjI1dmNtVlhhR2wwWlhOd1lXTmxPaUIwY25WbGZTazdYRzRnSUhKbGRIVnliaUIzYjNKa1JHbG1aaTVrYVdabUtHOXNaRk4wY2l3Z2JtVjNVM1J5TENCdmNIUnBiMjV6S1R0Y2JuMWNibHh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJR1JwWm1aWGIzSmtjMWRwZEdoVGNHRmpaU2h2YkdSVGRISXNJRzVsZDFOMGNpd2diM0IwYVc5dWN5a2dlMXh1SUNCeVpYUjFjbTRnZDI5eVpFUnBabVl1WkdsbVppaHZiR1JUZEhJc0lHNWxkMU4wY2l3Z2IzQjBhVzl1Y3lrN1hHNTlYRzRpWFgwPVxuIiwgIi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cblwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kaWZmTGluZXMgPSBkaWZmTGluZXM7XG5leHBvcnRzLmRpZmZUcmltbWVkTGluZXMgPSBkaWZmVHJpbW1lZExpbmVzO1xuZXhwb3J0cy5saW5lRGlmZiA9IHZvaWQgMDtcblxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbnZhclxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuX2Jhc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2Jhc2VcIikpXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuO1xuXG52YXJcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl9wYXJhbXMgPSByZXF1aXJlKFwiLi4vdXRpbC9wYXJhbXNcIilcbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG47XG5cbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8gZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG52YXIgbGluZURpZmYgPSBuZXdcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl9iYXNlXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuW1xuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuXCJkZWZhdWx0XCJcbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG5dKCk7XG5cbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbmV4cG9ydHMubGluZURpZmYgPSBsaW5lRGlmZjtcblxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbmxpbmVEaWZmLnRva2VuaXplID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIGlmICh0aGlzLm9wdGlvbnMuc3RyaXBUcmFpbGluZ0NyKSB7XG4gICAgLy8gcmVtb3ZlIG9uZSBcXHIgYmVmb3JlIFxcbiB0byBtYXRjaCBHTlUgZGlmZidzIC0tc3RyaXAtdHJhaWxpbmctY3IgYmVoYXZpb3JcbiAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1xcclxcbi9nLCAnXFxuJyk7XG4gIH1cblxuICB2YXIgcmV0TGluZXMgPSBbXSxcbiAgICAgIGxpbmVzQW5kTmV3bGluZXMgPSB2YWx1ZS5zcGxpdCgvKFxcbnxcXHJcXG4pLyk7IC8vIElnbm9yZSB0aGUgZmluYWwgZW1wdHkgdG9rZW4gdGhhdCBvY2N1cnMgaWYgdGhlIHN0cmluZyBlbmRzIHdpdGggYSBuZXcgbGluZVxuXG4gIGlmICghbGluZXNBbmROZXdsaW5lc1tsaW5lc0FuZE5ld2xpbmVzLmxlbmd0aCAtIDFdKSB7XG4gICAgbGluZXNBbmROZXdsaW5lcy5wb3AoKTtcbiAgfSAvLyBNZXJnZSB0aGUgY29udGVudCBhbmQgbGluZSBzZXBhcmF0b3JzIGludG8gc2luZ2xlIHRva2Vuc1xuXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lc0FuZE5ld2xpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGxpbmUgPSBsaW5lc0FuZE5ld2xpbmVzW2ldO1xuXG4gICAgaWYgKGkgJSAyICYmICF0aGlzLm9wdGlvbnMubmV3bGluZUlzVG9rZW4pIHtcbiAgICAgIHJldExpbmVzW3JldExpbmVzLmxlbmd0aCAtIDFdICs9IGxpbmU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlV2hpdGVzcGFjZSkge1xuICAgICAgICBsaW5lID0gbGluZS50cmltKCk7XG4gICAgICB9XG5cbiAgICAgIHJldExpbmVzLnB1c2gobGluZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldExpbmVzO1xufTtcblxuZnVuY3Rpb24gZGlmZkxpbmVzKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjaykge1xuICByZXR1cm4gbGluZURpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spO1xufVxuXG5mdW5jdGlvbiBkaWZmVHJpbW1lZExpbmVzKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjaykge1xuICB2YXIgb3B0aW9ucyA9XG4gIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgKDAsXG4gIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG5cbiAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICBfcGFyYW1zXG4gIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gIC5cbiAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICBnZW5lcmF0ZU9wdGlvbnMpXG4gIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gIChjYWxsYmFjaywge1xuICAgIGlnbm9yZVdoaXRlc3BhY2U6IHRydWVcbiAgfSk7XG4gIHJldHVybiBsaW5lRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OWthV1ptTDJ4cGJtVXVhbk1pWFN3aWJtRnRaWE1pT2xzaWJHbHVaVVJwWm1ZaUxDSkVhV1ptSWl3aWRHOXJaVzVwZW1VaUxDSjJZV3gxWlNJc0ltOXdkR2x2Ym5NaUxDSnpkSEpwY0ZSeVlXbHNhVzVuUTNJaUxDSnlaWEJzWVdObElpd2ljbVYwVEdsdVpYTWlMQ0pzYVc1bGMwRnVaRTVsZDJ4cGJtVnpJaXdpYzNCc2FYUWlMQ0pzWlc1bmRHZ2lMQ0p3YjNBaUxDSnBJaXdpYkdsdVpTSXNJbTVsZDJ4cGJtVkpjMVJ2YTJWdUlpd2lhV2R1YjNKbFYyaHBkR1Z6Y0dGalpTSXNJblJ5YVcwaUxDSndkWE5vSWl3aVpHbG1aa3hwYm1Weklpd2liMnhrVTNSeUlpd2libVYzVTNSeUlpd2lZMkZzYkdKaFkyc2lMQ0prYVdabUlpd2laR2xtWmxSeWFXMXRaV1JNYVc1bGN5SXNJbWRsYm1WeVlYUmxUM0IwYVc5dWN5SmRMQ0p0WVhCd2FXNW5jeUk2SWpzN096czdPenM3T3pzN1FVRkJRVHRCUVVGQk8wRkJRVUU3UVVGQlFUdEJRVUZCT3p0QlFVTkJPMEZCUVVFN1FVRkJRVHRCUVVGQk8wRkJRVUU3T3pzN08wRkJSVThzU1VGQlRVRXNVVUZCVVN4SFFVRkhPMEZCUVVsRE8wRkJRVUZCTzBGQlFVRkJPMEZCUVVGQk8wRkJRVUZCTzBGQlFVRkJPMEZCUVVGQk8wRkJRVUZCTEVOQlFVb3NSVUZCYWtJN096czdPenRCUVVOUVJDeFJRVUZSTEVOQlFVTkZMRkZCUVZRc1IwRkJiMElzVlVGQlUwTXNTMEZCVkN4RlFVRm5RanRCUVVOc1F5eE5RVUZITEV0QlFVdERMRTlCUVV3c1EwRkJZVU1zWlVGQmFFSXNSVUZCYVVNN1FVRkRMMEk3UVVGRFFVWXNTVUZCUVVFc1MwRkJTeXhIUVVGSFFTeExRVUZMTEVOQlFVTkhMRTlCUVU0c1EwRkJZeXhQUVVGa0xFVkJRWFZDTEVsQlFYWkNMRU5CUVZJN1FVRkRSRHM3UVVGRlJDeE5RVUZKUXl4UlFVRlJMRWRCUVVjc1JVRkJaanRCUVVGQkxFMUJRMGxETEdkQ1FVRm5RaXhIUVVGSFRDeExRVUZMTEVOQlFVTk5MRXRCUVU0c1EwRkJXU3hYUVVGYUxFTkJSSFpDTEVOQlRtdERMRU5CVTJ4RE96dEJRVU5CTEUxQlFVa3NRMEZCUTBRc1owSkJRV2RDTEVOQlFVTkJMR2RDUVVGblFpeERRVUZEUlN4TlFVRnFRaXhIUVVFd1FpeERRVUV6UWl4RFFVRnlRaXhGUVVGdlJEdEJRVU5zUkVZc1NVRkJRVUVzWjBKQlFXZENMRU5CUVVOSExFZEJRV3BDTzBGQlEwUXNSMEZhYVVNc1EwRmpiRU03T3p0QlFVTkJMRTlCUVVzc1NVRkJTVU1zUTBGQlF5eEhRVUZITEVOQlFXSXNSVUZCWjBKQkxFTkJRVU1zUjBGQlIwb3NaMEpCUVdkQ0xFTkJRVU5GTEUxQlFYSkRMRVZCUVRaRFJTeERRVUZETEVWQlFUbERMRVZCUVd0RU8wRkJRMmhFTEZGQlFVbERMRWxCUVVrc1IwRkJSMHdzWjBKQlFXZENMRU5CUVVOSkxFTkJRVVFzUTBGQk0wSTdPMEZCUlVFc1VVRkJTVUVzUTBGQlF5eEhRVUZITEVOQlFVb3NTVUZCVXl4RFFVRkRMRXRCUVV0U0xFOUJRVXdzUTBGQllWVXNZMEZCTTBJc1JVRkJNa003UVVGRGVrTlFMRTFCUVVGQkxGRkJRVkVzUTBGQlEwRXNVVUZCVVN4RFFVRkRSeXhOUVVGVUxFZEJRV3RDTEVOQlFXNUNMRU5CUVZJc1NVRkJhVU5ITEVsQlFXcERPMEZCUTBRc1MwRkdSQ3hOUVVWUE8wRkJRMHdzVlVGQlNTeExRVUZMVkN4UFFVRk1MRU5CUVdGWExHZENRVUZxUWl4RlFVRnRRenRCUVVOcVEwWXNVVUZCUVVFc1NVRkJTU3hIUVVGSFFTeEpRVUZKTEVOQlFVTkhMRWxCUVV3c1JVRkJVRHRCUVVORU96dEJRVU5FVkN4TlFVRkJRU3hSUVVGUkxFTkJRVU5WTEVsQlFWUXNRMEZCWTBvc1NVRkJaRHRCUVVORU8wRkJRMFk3TzBGQlJVUXNVMEZCVDA0c1VVRkJVRHRCUVVORUxFTkJOMEpFT3p0QlFTdENUeXhUUVVGVFZ5eFRRVUZVTEVOQlFXMUNReXhOUVVGdVFpeEZRVUV5UWtNc1RVRkJNMElzUlVGQmJVTkRMRkZCUVc1RExFVkJRVFpETzBGQlFVVXNVMEZCVDNKQ0xGRkJRVkVzUTBGQlEzTkNMRWxCUVZRc1EwRkJZMGdzVFVGQlpDeEZRVUZ6UWtNc1RVRkJkRUlzUlVGQk9FSkRMRkZCUVRsQ0xFTkJRVkE3UVVGQmFVUTdPMEZCUTJoSExGTkJRVk5GTEdkQ1FVRlVMRU5CUVRCQ1NpeE5RVUV4UWl4RlFVRnJRME1zVFVGQmJFTXNSVUZCTUVORExGRkJRVEZETEVWQlFXOUVPMEZCUTNwRUxFMUJRVWxxUWl4UFFVRlBPMEZCUVVjN1FVRkJRVHRCUVVGQk96dEJRVUZCYjBJN1FVRkJRVUU3UVVGQlFVRTdRVUZCUVVFN1FVRkJRVUU3UVVGQlFVRTdRVUZCUVR0QlFVRkJMRWRCUVdkQ1NDeFJRVUZvUWl4RlFVRXdRanRCUVVGRFRpeEpRVUZCUVN4blFrRkJaMElzUlVGQlJUdEJRVUZ1UWl4SFFVRXhRaXhEUVVGa08wRkJRMEVzVTBGQlQyWXNVVUZCVVN4RFFVRkRjMElzU1VGQlZDeERRVUZqU0N4TlFVRmtMRVZCUVhOQ1F5eE5RVUYwUWl4RlFVRTRRbWhDTEU5QlFUbENMRU5CUVZBN1FVRkRSQ0lzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSW1sdGNHOXlkQ0JFYVdabUlHWnliMjBnSnk0dlltRnpaU2M3WEc1cGJYQnZjblFnZTJkbGJtVnlZWFJsVDNCMGFXOXVjMzBnWm5KdmJTQW5MaTR2ZFhScGJDOXdZWEpoYlhNbk8xeHVYRzVsZUhCdmNuUWdZMjl1YzNRZ2JHbHVaVVJwWm1ZZ1BTQnVaWGNnUkdsbVppZ3BPMXh1YkdsdVpVUnBabVl1ZEc5clpXNXBlbVVnUFNCbWRXNWpkR2x2YmloMllXeDFaU2tnZTF4dUlDQnBaaWgwYUdsekxtOXdkR2x2Ym5NdWMzUnlhWEJVY21GcGJHbHVaME55S1NCN1hHNGdJQ0FnTHk4Z2NtVnRiM1psSUc5dVpTQmNYSElnWW1WbWIzSmxJRnhjYmlCMGJ5QnRZWFJqYUNCSFRsVWdaR2xtWmlkeklDMHRjM1J5YVhBdGRISmhhV3hwYm1jdFkzSWdZbVZvWVhacGIzSmNiaUFnSUNCMllXeDFaU0E5SUhaaGJIVmxMbkpsY0d4aFkyVW9MMXhjY2x4Y2JpOW5MQ0FuWEZ4dUp5azdYRzRnSUgxY2JseHVJQ0JzWlhRZ2NtVjBUR2x1WlhNZ1BTQmJYU3hjYmlBZ0lDQWdJR3hwYm1WelFXNWtUbVYzYkdsdVpYTWdQU0IyWVd4MVpTNXpjR3hwZENndktGeGNibnhjWEhKY1hHNHBMeWs3WEc1Y2JpQWdMeThnU1dkdWIzSmxJSFJvWlNCbWFXNWhiQ0JsYlhCMGVTQjBiMnRsYmlCMGFHRjBJRzlqWTNWeWN5QnBaaUIwYUdVZ2MzUnlhVzVuSUdWdVpITWdkMmwwYUNCaElHNWxkeUJzYVc1bFhHNGdJR2xtSUNnaGJHbHVaWE5CYm1ST1pYZHNhVzVsYzF0c2FXNWxjMEZ1WkU1bGQyeHBibVZ6TG14bGJtZDBhQ0F0SURGZEtTQjdYRzRnSUNBZ2JHbHVaWE5CYm1ST1pYZHNhVzVsY3k1d2IzQW9LVHRjYmlBZ2ZWeHVYRzRnSUM4dklFMWxjbWRsSUhSb1pTQmpiMjUwWlc1MElHRnVaQ0JzYVc1bElITmxjR0Z5WVhSdmNuTWdhVzUwYnlCemFXNW5iR1VnZEc5clpXNXpYRzRnSUdadmNpQW9iR1YwSUdrZ1BTQXdPeUJwSUR3Z2JHbHVaWE5CYm1ST1pYZHNhVzVsY3k1c1pXNW5kR2c3SUdrckt5a2dlMXh1SUNBZ0lHeGxkQ0JzYVc1bElEMGdiR2x1WlhOQmJtUk9aWGRzYVc1bGMxdHBYVHRjYmx4dUlDQWdJR2xtSUNocElDVWdNaUFtSmlBaGRHaHBjeTV2Y0hScGIyNXpMbTVsZDJ4cGJtVkpjMVJ2YTJWdUtTQjdYRzRnSUNBZ0lDQnlaWFJNYVc1bGMxdHlaWFJNYVc1bGN5NXNaVzVuZEdnZ0xTQXhYU0FyUFNCc2FXNWxPMXh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNCcFppQW9kR2hwY3k1dmNIUnBiMjV6TG1sbmJtOXlaVmRvYVhSbGMzQmhZMlVwSUh0Y2JpQWdJQ0FnSUNBZ2JHbHVaU0E5SUd4cGJtVXVkSEpwYlNncE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2NtVjBUR2x1WlhNdWNIVnphQ2hzYVc1bEtUdGNiaUFnSUNCOVhHNGdJSDFjYmx4dUlDQnlaWFIxY200Z2NtVjBUR2x1WlhNN1hHNTlPMXh1WEc1bGVIQnZjblFnWm5WdVkzUnBiMjRnWkdsbVpreHBibVZ6S0c5c1pGTjBjaXdnYm1WM1UzUnlMQ0JqWVd4c1ltRmpheWtnZXlCeVpYUjFjbTRnYkdsdVpVUnBabVl1WkdsbVppaHZiR1JUZEhJc0lHNWxkMU4wY2l3Z1kyRnNiR0poWTJzcE95QjlYRzVsZUhCdmNuUWdablZ1WTNScGIyNGdaR2xtWmxSeWFXMXRaV1JNYVc1bGN5aHZiR1JUZEhJc0lHNWxkMU4wY2l3Z1kyRnNiR0poWTJzcElIdGNiaUFnYkdWMElHOXdkR2x2Ym5NZ1BTQm5aVzVsY21GMFpVOXdkR2x2Ym5Nb1kyRnNiR0poWTJzc0lIdHBaMjV2Y21WWGFHbDBaWE53WVdObE9pQjBjblZsZlNrN1hHNGdJSEpsZEhWeWJpQnNhVzVsUkdsbVppNWthV1ptS0c5c1pGTjBjaXdnYm1WM1UzUnlMQ0J2Y0hScGIyNXpLVHRjYm4xY2JpSmRmUT09XG4iLCAiLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRpZmZTZW50ZW5jZXMgPSBkaWZmU2VudGVuY2VzO1xuZXhwb3J0cy5zZW50ZW5jZURpZmYgPSB2b2lkIDA7XG5cbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG52YXJcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl9iYXNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9iYXNlXCIpKVxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbjtcblxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbnZhciBzZW50ZW5jZURpZmYgPSBuZXdcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl9iYXNlXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuW1xuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuXCJkZWZhdWx0XCJcbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG5dKCk7XG5cbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbmV4cG9ydHMuc2VudGVuY2VEaWZmID0gc2VudGVuY2VEaWZmO1xuXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuc2VudGVuY2VEaWZmLnRva2VuaXplID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZS5zcGxpdCgvKFxcUy4rP1suIT9dKSg/PVxccyt8JCkvKTtcbn07XG5cbmZ1bmN0aW9uIGRpZmZTZW50ZW5jZXMob2xkU3RyLCBuZXdTdHIsIGNhbGxiYWNrKSB7XG4gIHJldHVybiBzZW50ZW5jZURpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMM055WXk5a2FXWm1MM05sYm5SbGJtTmxMbXB6SWwwc0ltNWhiV1Z6SWpwYkluTmxiblJsYm1ObFJHbG1aaUlzSWtScFptWWlMQ0owYjJ0bGJtbDZaU0lzSW5aaGJIVmxJaXdpYzNCc2FYUWlMQ0prYVdabVUyVnVkR1Z1WTJWeklpd2liMnhrVTNSeUlpd2libVYzVTNSeUlpd2lZMkZzYkdKaFkyc2lMQ0prYVdabUlsMHNJbTFoY0hCcGJtZHpJam9pT3pzN096czdPenM3TzBGQlFVRTdRVUZCUVR0QlFVRkJPMEZCUVVFN1FVRkJRVHM3T3pzN1FVRkhUeXhKUVVGTlFTeFpRVUZaTEVkQlFVYzdRVUZCU1VNN1FVRkJRVUU3UVVGQlFVRTdRVUZCUVVFN1FVRkJRVUU3UVVGQlFVRTdRVUZCUVVFN1FVRkJRVUVzUTBGQlNpeEZRVUZ5UWpzN096czdPMEZCUTFCRUxGbEJRVmtzUTBGQlEwVXNVVUZCWWl4SFFVRjNRaXhWUVVGVFF5eExRVUZVTEVWQlFXZENPMEZCUTNSRExGTkJRVTlCTEV0QlFVc3NRMEZCUTBNc1MwRkJUaXhEUVVGWkxIVkNRVUZhTEVOQlFWQTdRVUZEUkN4RFFVWkVPenRCUVVsUExGTkJRVk5ETEdGQlFWUXNRMEZCZFVKRExFMUJRWFpDTEVWQlFTdENReXhOUVVFdlFpeEZRVUYxUTBNc1VVRkJka01zUlVGQmFVUTdRVUZCUlN4VFFVRlBVaXhaUVVGWkxFTkJRVU5UTEVsQlFXSXNRMEZCYTBKSUxFMUJRV3hDTEVWQlFUQkNReXhOUVVFeFFpeEZRVUZyUTBNc1VVRkJiRU1zUTBGQlVEdEJRVUZ4UkNJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYkltbHRjRzl5ZENCRWFXWm1JR1p5YjIwZ0p5NHZZbUZ6WlNjN1hHNWNibHh1Wlhod2IzSjBJR052Ym5OMElITmxiblJsYm1ObFJHbG1aaUE5SUc1bGR5QkVhV1ptS0NrN1hHNXpaVzUwWlc1alpVUnBabVl1ZEc5clpXNXBlbVVnUFNCbWRXNWpkR2x2YmloMllXeDFaU2tnZTF4dUlDQnlaWFIxY200Z2RtRnNkV1V1YzNCc2FYUW9MeWhjWEZNdUt6OWJMaUUvWFNrb1B6MWNYSE1yZkNRcEx5azdYRzU5TzF4dVhHNWxlSEJ2Y25RZ1puVnVZM1JwYjI0Z1pHbG1abE5sYm5SbGJtTmxjeWh2YkdSVGRISXNJRzVsZDFOMGNpd2dZMkZzYkdKaFkyc3BJSHNnY21WMGRYSnVJSE5sYm5SbGJtTmxSR2xtWmk1a2FXWm1LRzlzWkZOMGNpd2dibVYzVTNSeUxDQmpZV3hzWW1GamF5azdJSDFjYmlKZGZRPT1cbiIsICIvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5cInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGlmZkNzcyA9IGRpZmZDc3M7XG5leHBvcnRzLmNzc0RpZmYgPSB2b2lkIDA7XG5cbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG52YXJcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl9iYXNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9iYXNlXCIpKVxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbjtcblxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbnZhciBjc3NEaWZmID0gbmV3XG4vKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5fYmFzZVxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbltcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cblwiZGVmYXVsdFwiXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuXSgpO1xuXG4vKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5leHBvcnRzLmNzc0RpZmYgPSBjc3NEaWZmO1xuXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuY3NzRGlmZi50b2tlbml6ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUuc3BsaXQoLyhbe306OyxdfFxccyspLyk7XG59O1xuXG5mdW5jdGlvbiBkaWZmQ3NzKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjaykge1xuICByZXR1cm4gY3NzRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjayk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTlrYVdabUwyTnpjeTVxY3lKZExDSnVZVzFsY3lJNld5SmpjM05FYVdabUlpd2lSR2xtWmlJc0luUnZhMlZ1YVhwbElpd2lkbUZzZFdVaUxDSnpjR3hwZENJc0ltUnBabVpEYzNNaUxDSnZiR1JUZEhJaUxDSnVaWGRUZEhJaUxDSmpZV3hzWW1GamF5SXNJbVJwWm1ZaVhTd2liV0Z3Y0dsdVozTWlPaUk3T3pzN096czdPenM3UVVGQlFUdEJRVUZCTzBGQlFVRTdRVUZCUVR0QlFVRkJPenM3T3p0QlFVVlBMRWxCUVUxQkxFOUJRVThzUjBGQlJ6dEJRVUZKUXp0QlFVRkJRVHRCUVVGQlFUdEJRVUZCUVR0QlFVRkJRVHRCUVVGQlFUdEJRVUZCUVR0QlFVRkJRU3hEUVVGS0xFVkJRV2hDT3pzN096czdRVUZEVUVRc1QwRkJUeXhEUVVGRFJTeFJRVUZTTEVkQlFXMUNMRlZCUVZORExFdEJRVlFzUlVGQlowSTdRVUZEYWtNc1UwRkJUMEVzUzBGQlN5eERRVUZEUXl4TFFVRk9MRU5CUVZrc1pVRkJXaXhEUVVGUU8wRkJRMFFzUTBGR1JEczdRVUZKVHl4VFFVRlRReXhQUVVGVUxFTkJRV2xDUXl4TlFVRnFRaXhGUVVGNVFrTXNUVUZCZWtJc1JVRkJhVU5ETEZGQlFXcERMRVZCUVRKRE8wRkJRVVVzVTBGQlQxSXNUMEZCVHl4RFFVRkRVeXhKUVVGU0xFTkJRV0ZJTEUxQlFXSXNSVUZCY1VKRExFMUJRWEpDTEVWQlFUWkNReXhSUVVFM1FpeERRVUZRTzBGQlFXZEVJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpYVcxd2IzSjBJRVJwWm1ZZ1puSnZiU0FuTGk5aVlYTmxKenRjYmx4dVpYaHdiM0owSUdOdmJuTjBJR056YzBScFptWWdQU0J1WlhjZ1JHbG1aaWdwTzF4dVkzTnpSR2xtWmk1MGIydGxibWw2WlNBOUlHWjFibU4wYVc5dUtIWmhiSFZsS1NCN1hHNGdJSEpsZEhWeWJpQjJZV3gxWlM1emNHeHBkQ2d2S0Z0N2ZUbzdMRjE4WEZ4ekt5a3ZLVHRjYm4wN1hHNWNibVY0Y0c5eWRDQm1kVzVqZEdsdmJpQmthV1ptUTNOektHOXNaRk4wY2l3Z2JtVjNVM1J5TENCallXeHNZbUZqYXlrZ2V5QnlaWFIxY200Z1kzTnpSR2xtWmk1a2FXWm1LRzlzWkZOMGNpd2dibVYzVTNSeUxDQmpZV3hzWW1GamF5azdJSDFjYmlKZGZRPT1cbiIsICIvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5cInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGlmZkpzb24gPSBkaWZmSnNvbjtcbmV4cG9ydHMuY2Fub25pY2FsaXplID0gY2Fub25pY2FsaXplO1xuZXhwb3J0cy5qc29uRGlmZiA9IHZvaWQgMDtcblxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbnZhclxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuX2Jhc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2Jhc2VcIikpXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuO1xuXG52YXJcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl9saW5lID0gcmVxdWlyZShcIi4vbGluZVwiKVxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbjtcblxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfVxuXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xudmFyIG9iamVjdFByb3RvdHlwZVRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBqc29uRGlmZiA9IG5ld1xuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuX2Jhc2Vcbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG5bXG4vKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5cImRlZmF1bHRcIlxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbl0oKTsgLy8gRGlzY3JpbWluYXRlIGJldHdlZW4gdHdvIGxpbmVzIG9mIHByZXR0eS1wcmludGVkLCBzZXJpYWxpemVkIEpTT04gd2hlcmUgb25lIG9mIHRoZW0gaGFzIGFcbi8vIGRhbmdsaW5nIGNvbW1hIGFuZCB0aGUgb3RoZXIgZG9lc24ndC4gVHVybnMgb3V0IGluY2x1ZGluZyB0aGUgZGFuZ2xpbmcgY29tbWEgeWllbGRzIHRoZSBuaWNlc3Qgb3V0cHV0OlxuXG4vKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5leHBvcnRzLmpzb25EaWZmID0ganNvbkRpZmY7XG5cbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG5qc29uRGlmZi51c2VMb25nZXN0VG9rZW4gPSB0cnVlO1xuanNvbkRpZmYudG9rZW5pemUgPVxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuX2xpbmVcbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4uXG4vKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5saW5lRGlmZlxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbi50b2tlbml6ZTtcblxuanNvbkRpZmYuY2FzdElucHV0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgdmFyIF90aGlzJG9wdGlvbnMgPVxuICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICB0aGlzLm9wdGlvbnMsXG4gICAgICB1bmRlZmluZWRSZXBsYWNlbWVudCA9IF90aGlzJG9wdGlvbnMudW5kZWZpbmVkUmVwbGFjZW1lbnQsXG4gICAgICBfdGhpcyRvcHRpb25zJHN0cmluZ2kgPSBfdGhpcyRvcHRpb25zLnN0cmluZ2lmeVJlcGxhY2VyLFxuICAgICAgc3RyaW5naWZ5UmVwbGFjZXIgPSBfdGhpcyRvcHRpb25zJHN0cmluZ2kgPT09IHZvaWQgMCA/IGZ1bmN0aW9uIChrLCB2KVxuICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gIHtcbiAgICByZXR1cm4gKFxuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgICAgIHR5cGVvZiB2ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZFJlcGxhY2VtZW50IDogdlxuICAgICk7XG4gIH0gOiBfdGhpcyRvcHRpb25zJHN0cmluZ2k7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiBKU09OLnN0cmluZ2lmeShjYW5vbmljYWxpemUodmFsdWUsIG51bGwsIG51bGwsIHN0cmluZ2lmeVJlcGxhY2VyKSwgc3RyaW5naWZ5UmVwbGFjZXIsICcgICcpO1xufTtcblxuanNvbkRpZmYuZXF1YWxzID0gZnVuY3Rpb24gKGxlZnQsIHJpZ2h0KSB7XG4gIHJldHVybiAoXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgIF9iYXNlXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgICBbXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgIFwiZGVmYXVsdFwiXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgICBdLnByb3RvdHlwZS5lcXVhbHMuY2FsbChqc29uRGlmZiwgbGVmdC5yZXBsYWNlKC8sKFtcXHJcXG5dKS9nLCAnJDEnKSwgcmlnaHQucmVwbGFjZSgvLChbXFxyXFxuXSkvZywgJyQxJykpXG4gICk7XG59O1xuXG5mdW5jdGlvbiBkaWZmSnNvbihvbGRPYmosIG5ld09iaiwgb3B0aW9ucykge1xuICByZXR1cm4ganNvbkRpZmYuZGlmZihvbGRPYmosIG5ld09iaiwgb3B0aW9ucyk7XG59IC8vIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgcHJlc2VuY2Ugb2YgY2lyY3VsYXIgcmVmZXJlbmNlcyBieSBiYWlsaW5nIG91dCB3aGVuIGVuY291bnRlcmluZyBhblxuLy8gb2JqZWN0IHRoYXQgaXMgYWxyZWFkeSBvbiB0aGUgXCJzdGFja1wiIG9mIGl0ZW1zIGJlaW5nIHByb2Nlc3NlZC4gQWNjZXB0cyBhbiBvcHRpb25hbCByZXBsYWNlclxuXG5cbmZ1bmN0aW9uIGNhbm9uaWNhbGl6ZShvYmosIHN0YWNrLCByZXBsYWNlbWVudFN0YWNrLCByZXBsYWNlciwga2V5KSB7XG4gIHN0YWNrID0gc3RhY2sgfHwgW107XG4gIHJlcGxhY2VtZW50U3RhY2sgPSByZXBsYWNlbWVudFN0YWNrIHx8IFtdO1xuXG4gIGlmIChyZXBsYWNlcikge1xuICAgIG9iaiA9IHJlcGxhY2VyKGtleSwgb2JqKTtcbiAgfVxuXG4gIHZhciBpO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBzdGFjay5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGlmIChzdGFja1tpXSA9PT0gb2JqKSB7XG4gICAgICByZXR1cm4gcmVwbGFjZW1lbnRTdGFja1tpXTtcbiAgICB9XG4gIH1cblxuICB2YXIgY2Fub25pY2FsaXplZE9iajtcblxuICBpZiAoJ1tvYmplY3QgQXJyYXldJyA9PT0gb2JqZWN0UHJvdG90eXBlVG9TdHJpbmcuY2FsbChvYmopKSB7XG4gICAgc3RhY2sucHVzaChvYmopO1xuICAgIGNhbm9uaWNhbGl6ZWRPYmogPSBuZXcgQXJyYXkob2JqLmxlbmd0aCk7XG4gICAgcmVwbGFjZW1lbnRTdGFjay5wdXNoKGNhbm9uaWNhbGl6ZWRPYmopO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgY2Fub25pY2FsaXplZE9ialtpXSA9IGNhbm9uaWNhbGl6ZShvYmpbaV0sIHN0YWNrLCByZXBsYWNlbWVudFN0YWNrLCByZXBsYWNlciwga2V5KTtcbiAgICB9XG5cbiAgICBzdGFjay5wb3AoKTtcbiAgICByZXBsYWNlbWVudFN0YWNrLnBvcCgpO1xuICAgIHJldHVybiBjYW5vbmljYWxpemVkT2JqO1xuICB9XG5cbiAgaWYgKG9iaiAmJiBvYmoudG9KU09OKSB7XG4gICAgb2JqID0gb2JqLnRvSlNPTigpO1xuICB9XG5cbiAgaWYgKFxuICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gIF90eXBlb2YoXG4gIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gIG9iaikgPT09ICdvYmplY3QnICYmIG9iaiAhPT0gbnVsbCkge1xuICAgIHN0YWNrLnB1c2gob2JqKTtcbiAgICBjYW5vbmljYWxpemVkT2JqID0ge307XG4gICAgcmVwbGFjZW1lbnRTdGFjay5wdXNoKGNhbm9uaWNhbGl6ZWRPYmopO1xuXG4gICAgdmFyIHNvcnRlZEtleXMgPSBbXSxcbiAgICAgICAgX2tleTtcblxuICAgIGZvciAoX2tleSBpbiBvYmopIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KF9rZXkpKSB7XG4gICAgICAgIHNvcnRlZEtleXMucHVzaChfa2V5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzb3J0ZWRLZXlzLnNvcnQoKTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBzb3J0ZWRLZXlzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBfa2V5ID0gc29ydGVkS2V5c1tpXTtcbiAgICAgIGNhbm9uaWNhbGl6ZWRPYmpbX2tleV0gPSBjYW5vbmljYWxpemUob2JqW19rZXldLCBzdGFjaywgcmVwbGFjZW1lbnRTdGFjaywgcmVwbGFjZXIsIF9rZXkpO1xuICAgIH1cblxuICAgIHN0YWNrLnBvcCgpO1xuICAgIHJlcGxhY2VtZW50U3RhY2sucG9wKCk7XG4gIH0gZWxzZSB7XG4gICAgY2Fub25pY2FsaXplZE9iaiA9IG9iajtcbiAgfVxuXG4gIHJldHVybiBjYW5vbmljYWxpemVkT2JqO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMM055WXk5a2FXWm1MMnB6YjI0dWFuTWlYU3dpYm1GdFpYTWlPbHNpYjJKcVpXTjBVSEp2ZEc5MGVYQmxWRzlUZEhKcGJtY2lMQ0pQWW1wbFkzUWlMQ0p3Y205MGIzUjVjR1VpTENKMGIxTjBjbWx1WnlJc0ltcHpiMjVFYVdabUlpd2lSR2xtWmlJc0luVnpaVXh2Ym1kbGMzUlViMnRsYmlJc0luUnZhMlZ1YVhwbElpd2liR2x1WlVScFptWWlMQ0pqWVhOMFNXNXdkWFFpTENKMllXeDFaU0lzSW05d2RHbHZibk1pTENKMWJtUmxabWx1WldSU1pYQnNZV05sYldWdWRDSXNJbk4wY21sdVoybG1lVkpsY0d4aFkyVnlJaXdpYXlJc0luWWlMQ0pLVTA5T0lpd2ljM1J5YVc1bmFXWjVJaXdpWTJGdWIyNXBZMkZzYVhwbElpd2laWEYxWVd4eklpd2liR1ZtZENJc0luSnBaMmgwSWl3aVkyRnNiQ0lzSW5KbGNHeGhZMlVpTENKa2FXWm1Tbk52YmlJc0ltOXNaRTlpYWlJc0ltNWxkMDlpYWlJc0ltUnBabVlpTENKdlltb2lMQ0p6ZEdGamF5SXNJbkpsY0d4aFkyVnRaVzUwVTNSaFkyc2lMQ0p5WlhCc1lXTmxjaUlzSW10bGVTSXNJbWtpTENKc1pXNW5kR2dpTENKallXNXZibWxqWVd4cGVtVmtUMkpxSWl3aWNIVnphQ0lzSWtGeWNtRjVJaXdpY0c5d0lpd2lkRzlLVTA5T0lpd2ljMjl5ZEdWa1MyVjVjeUlzSW1oaGMwOTNibEJ5YjNCbGNuUjVJaXdpYzI5eWRDSmRMQ0p0WVhCd2FXNW5jeUk2SWpzN096czdPenM3T3pzN1FVRkJRVHRCUVVGQk8wRkJRVUU3UVVGQlFUdEJRVUZCT3p0QlFVTkJPMEZCUVVFN1FVRkJRVHRCUVVGQk8wRkJRVUU3T3pzN096czdRVUZGUVN4SlFVRk5RU3gxUWtGQmRVSXNSMEZCUjBNc1RVRkJUU3hEUVVGRFF5eFRRVUZRTEVOQlFXbENReXhSUVVGcVJEdEJRVWRQTEVsQlFVMURMRkZCUVZFc1IwRkJSenRCUVVGSlF6dEJRVUZCUVR0QlFVRkJRVHRCUVVGQlFUdEJRVUZCUVR0QlFVRkJRVHRCUVVGQlFUdEJRVUZCUVN4RFFVRktMRVZCUVdwQ0xFTXNRMEZEVUR0QlFVTkJPenM3T3pzN1FVRkRRVVFzVVVGQlVTeERRVUZEUlN4bFFVRlVMRWRCUVRKQ0xFbEJRVE5DTzBGQlJVRkdMRkZCUVZFc1EwRkJRMGNzVVVGQlZEdEJRVUZ2UWtNN1FVRkJRVUU3UVVGQlFVRTdRVUZCUVVFN1FVRkJRVUU3UVVGQlFVRTdRVUZCUVR0QlFVRkJMRU5CUVZORUxGRkJRVGRDT3p0QlFVTkJTQ3hSUVVGUkxFTkJRVU5MTEZOQlFWUXNSMEZCY1VJc1ZVRkJVME1zUzBGQlZDeEZRVUZuUWp0QlFVRkJPMEZCUVVFN1FVRkJRVHRCUVVNclJTeFBRVUZMUXl4UFFVUndSanRCUVVGQkxFMUJRelZDUXl4dlFrRkVORUlzYVVKQlF6VkNRU3h2UWtGRU5FSTdRVUZCUVN3MFEwRkRUa01zYVVKQlJFMDdRVUZCUVN4TlFVTk9RU3hwUWtGRVRTeHpRMEZEWXl4VlFVRkRReXhEUVVGRUxFVkJRVWxETEVOQlFVbzdRVUZCUVR0QlFVRkJPMEZCUVVFN1FVRkJRVHRCUVVGVkxHRkJRVTlCTEVOQlFWQXNTMEZCWVN4WFFVRmlMRWRCUVRKQ1NDeHZRa0ZCTTBJc1IwRkJhMFJITzBGQlFUVkVPMEZCUVVFc1IwRkVaRHRCUVVkdVF5eFRRVUZQTEU5QlFVOU1MRXRCUVZBc1MwRkJhVUlzVVVGQmFrSXNSMEZCTkVKQkxFdEJRVFZDTEVkQlFXOURUU3hKUVVGSkxFTkJRVU5ETEZOQlFVd3NRMEZCWlVNc1dVRkJXU3hEUVVGRFVpeExRVUZFTEVWQlFWRXNTVUZCVWl4RlFVRmpMRWxCUVdRc1JVRkJiMEpITEdsQ1FVRndRaXhEUVVFelFpeEZRVUZ0UlVFc2FVSkJRVzVGTEVWQlFYTkdMRWxCUVhSR0xFTkJRVE5ETzBGQlEwUXNRMEZLUkRzN1FVRkxRVlFzVVVGQlVTeERRVUZEWlN4TlFVRlVMRWRCUVd0Q0xGVkJRVk5ETEVsQlFWUXNSVUZCWlVNc1MwRkJaaXhGUVVGelFqdEJRVU4wUXl4VFFVRlBhRUk3UVVGQlFVRTdRVUZCUVVFN1FVRkJRVUU3UVVGQlFVRTdRVUZCUVVFN1FVRkJRVUU3UVVGQlFVRTdRVUZCUVVFc1RVRkJTMGdzVTBGQlRDeERRVUZsYVVJc1RVRkJaaXhEUVVGelFrY3NTVUZCZEVJc1EwRkJNa0pzUWl4UlFVRXpRaXhGUVVGeFEyZENMRWxCUVVrc1EwRkJRMGNzVDBGQlRDeERRVUZoTEZsQlFXSXNSVUZCTWtJc1NVRkJNMElzUTBGQmNrTXNSVUZCZFVWR0xFdEJRVXNzUTBGQlEwVXNUMEZCVGl4RFFVRmpMRmxCUVdRc1JVRkJORUlzU1VGQk5VSXNRMEZCZGtVN1FVRkJVRHRCUVVORUxFTkJSa1E3TzBGQlNVOHNVMEZCVTBNc1VVRkJWQ3hEUVVGclFrTXNUVUZCYkVJc1JVRkJNRUpETEUxQlFURkNMRVZCUVd0RFppeFBRVUZzUXl4RlFVRXlRenRCUVVGRkxGTkJRVTlRTEZGQlFWRXNRMEZCUTNWQ0xFbEJRVlFzUTBGQlkwWXNUVUZCWkN4RlFVRnpRa01zVFVGQmRFSXNSVUZCT0VKbUxFOUJRVGxDTEVOQlFWQTdRVUZCWjBRc1F5eERRVVZ3Unp0QlFVTkJPenM3UVVGRFR5eFRRVUZUVHl4WlFVRlVMRU5CUVhOQ1ZTeEhRVUYwUWl4RlFVRXlRa01zUzBGQk0wSXNSVUZCYTBORExHZENRVUZzUXl4RlFVRnZSRU1zVVVGQmNFUXNSVUZCT0VSRExFZEJRVGxFTEVWQlFXMUZPMEZCUTNoRlNDeEZRVUZCUVN4TFFVRkxMRWRCUVVkQkxFdEJRVXNzU1VGQlNTeEZRVUZxUWp0QlFVTkJReXhGUVVGQlFTeG5Ra0ZCWjBJc1IwRkJSMEVzWjBKQlFXZENMRWxCUVVrc1JVRkJka003TzBGQlJVRXNUVUZCU1VNc1VVRkJTaXhGUVVGak8wRkJRMXBJTEVsQlFVRkJMRWRCUVVjc1IwRkJSMGNzVVVGQlVTeERRVUZEUXl4SFFVRkVMRVZCUVUxS0xFZEJRVTRzUTBGQlpEdEJRVU5FT3p0QlFVVkVMRTFCUVVsTExFTkJRVW83TzBGQlJVRXNUMEZCUzBFc1EwRkJReXhIUVVGSExFTkJRVlFzUlVGQldVRXNRMEZCUXl4SFFVRkhTaXhMUVVGTExFTkJRVU5MTEUxQlFYUkNMRVZCUVRoQ1JDeERRVUZETEVsQlFVa3NRMEZCYmtNc1JVRkJjME03UVVGRGNFTXNVVUZCU1Vvc1MwRkJTeXhEUVVGRFNTeERRVUZFTEVOQlFVd3NTMEZCWVV3c1IwRkJha0lzUlVGQmMwSTdRVUZEY0VJc1lVRkJUMFVzWjBKQlFXZENMRU5CUVVOSExFTkJRVVFzUTBGQmRrSTdRVUZEUkR0QlFVTkdPenRCUVVWRUxFMUJRVWxGTEdkQ1FVRktPenRCUVVWQkxFMUJRVWtzY1VKQlFYRkNia01zZFVKQlFYVkNMRU5CUVVOelFpeEpRVUY0UWl4RFFVRTJRazBzUjBGQk4wSXNRMEZCZWtJc1JVRkJORVE3UVVGRE1VUkRMRWxCUVVGQkxFdEJRVXNzUTBGQlEwOHNTVUZCVGl4RFFVRlhVaXhIUVVGWU8wRkJRMEZQTEVsQlFVRkJMR2RDUVVGblFpeEhRVUZITEVsQlFVbEZMRXRCUVVvc1EwRkJWVlFzUjBGQlJ5eERRVUZEVFN4TlFVRmtMRU5CUVc1Q08wRkJRMEZLTEVsQlFVRkJMR2RDUVVGblFpeERRVUZEVFN4SlFVRnFRaXhEUVVGelFrUXNaMEpCUVhSQ096dEJRVU5CTEZOQlFVdEdMRU5CUVVNc1IwRkJSeXhEUVVGVUxFVkJRVmxCTEVOQlFVTXNSMEZCUjB3c1IwRkJSeXhEUVVGRFRTeE5RVUZ3UWl4RlFVRTBRa1FzUTBGQlF5eEpRVUZKTEVOQlFXcERMRVZCUVc5RE8wRkJRMnhEUlN4TlFVRkJRU3huUWtGQlowSXNRMEZCUTBZc1EwRkJSQ3hEUVVGb1FpeEhRVUZ6UW1Zc1dVRkJXU3hEUVVGRFZTeEhRVUZITEVOQlFVTkxMRU5CUVVRc1EwRkJTaXhGUVVGVFNpeExRVUZVTEVWQlFXZENReXhuUWtGQmFFSXNSVUZCYTBORExGRkJRV3hETEVWQlFUUkRReXhIUVVFMVF5eERRVUZzUXp0QlFVTkVPenRCUVVORVNDeEpRVUZCUVN4TFFVRkxMRU5CUVVOVExFZEJRVTQ3UVVGRFFWSXNTVUZCUVVFc1owSkJRV2RDTEVOQlFVTlJMRWRCUVdwQ08wRkJRMEVzVjBGQlQwZ3NaMEpCUVZBN1FVRkRSRHM3UVVGRlJDeE5RVUZKVUN4SFFVRkhMRWxCUVVsQkxFZEJRVWNzUTBGQlExY3NUVUZCWml4RlFVRjFRanRCUVVOeVFsZ3NTVUZCUVVFc1IwRkJSeXhIUVVGSFFTeEhRVUZITEVOQlFVTlhMRTFCUVVvc1JVRkJUanRCUVVORU96dEJRVVZFTzBGQlFVazdRVUZCUVR0QlFVRkJPMEZCUVU5WUxFVkJRVUZCTEVkQlFWQXNUVUZCWlN4UlFVRm1MRWxCUVRKQ1FTeEhRVUZITEV0QlFVc3NTVUZCZGtNc1JVRkJOa003UVVGRE0wTkRMRWxCUVVGQkxFdEJRVXNzUTBGQlEwOHNTVUZCVGl4RFFVRlhVaXhIUVVGWU8wRkJRMEZQTEVsQlFVRkJMR2RDUVVGblFpeEhRVUZITEVWQlFXNUNPMEZCUTBGTUxFbEJRVUZCTEdkQ1FVRm5RaXhEUVVGRFRTeEpRVUZxUWl4RFFVRnpRa1FzWjBKQlFYUkNPenRCUVVOQkxGRkJRVWxMTEZWQlFWVXNSMEZCUnl4RlFVRnFRanRCUVVGQkxGRkJRMGxTTEVsQlJFbzdPMEZCUlVFc1UwRkJTMEVzU1VGQlRDeEpRVUZaU2l4SFFVRmFMRVZCUVdsQ08wRkJRMlk3UVVGRFFTeFZRVUZKUVN4SFFVRkhMRU5CUVVOaExHTkJRVW9zUTBGQmJVSlVMRWxCUVc1Q0xFTkJRVW9zUlVGQk5rSTdRVUZETTBKUkxGRkJRVUZCTEZWQlFWVXNRMEZCUTBvc1NVRkJXQ3hEUVVGblFrb3NTVUZCYUVJN1FVRkRSRHRCUVVOR096dEJRVU5FVVN4SlFVRkJRU3hWUVVGVkxFTkJRVU5GTEVsQlFWZzdPMEZCUTBFc1UwRkJTMVFzUTBGQlF5eEhRVUZITEVOQlFWUXNSVUZCV1VFc1EwRkJReXhIUVVGSFR5eFZRVUZWTEVOQlFVTk9MRTFCUVROQ0xFVkJRVzFEUkN4RFFVRkRMRWxCUVVrc1EwRkJlRU1zUlVGQk1rTTdRVUZEZWtORUxFMUJRVUZCTEVsQlFVY3NSMEZCUjFFc1ZVRkJWU3hEUVVGRFVDeERRVUZFTEVOQlFXaENPMEZCUTBGRkxFMUJRVUZCTEdkQ1FVRm5RaXhEUVVGRFNDeEpRVUZFTEVOQlFXaENMRWRCUVhkQ1pDeFpRVUZaTEVOQlFVTlZMRWRCUVVjc1EwRkJRMGtzU1VGQlJDeERRVUZLTEVWQlFWZElMRXRCUVZnc1JVRkJhMEpETEdkQ1FVRnNRaXhGUVVGdlEwTXNVVUZCY0VNc1JVRkJPRU5ETEVsQlFUbERMRU5CUVhCRE8wRkJRMFE3TzBGQlEwUklMRWxCUVVGQkxFdEJRVXNzUTBGQlExTXNSMEZCVGp0QlFVTkJVaXhKUVVGQlFTeG5Ra0ZCWjBJc1EwRkJRMUVzUjBGQmFrSTdRVUZEUkN4SFFXNUNSQ3hOUVcxQ1R6dEJRVU5NU0N4SlFVRkJRU3huUWtGQlowSXNSMEZCUjFBc1IwRkJia0k3UVVGRFJEczdRVUZEUkN4VFFVRlBUeXhuUWtGQlVEdEJRVU5FSWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaWFXMXdiM0owSUVScFptWWdabkp2YlNBbkxpOWlZWE5sSnp0Y2JtbHRjRzl5ZENCN2JHbHVaVVJwWm1aOUlHWnliMjBnSnk0dmJHbHVaU2M3WEc1Y2JtTnZibk4wSUc5aWFtVmpkRkJ5YjNSdmRIbHdaVlJ2VTNSeWFXNW5JRDBnVDJKcVpXTjBMbkJ5YjNSdmRIbHdaUzUwYjFOMGNtbHVaenRjYmx4dVhHNWxlSEJ2Y25RZ1kyOXVjM1FnYW5OdmJrUnBabVlnUFNCdVpYY2dSR2xtWmlncE8xeHVMeThnUkdselkzSnBiV2x1WVhSbElHSmxkSGRsWlc0Z2RIZHZJR3hwYm1WeklHOW1JSEJ5WlhSMGVTMXdjbWx1ZEdWa0xDQnpaWEpwWVd4cGVtVmtJRXBUVDA0Z2QyaGxjbVVnYjI1bElHOW1JSFJvWlcwZ2FHRnpJR0ZjYmk4dklHUmhibWRzYVc1bklHTnZiVzFoSUdGdVpDQjBhR1VnYjNSb1pYSWdaRzlsYzI0bmRDNGdWSFZ5Ym5NZ2IzVjBJR2x1WTJ4MVpHbHVaeUIwYUdVZ1pHRnVaMnhwYm1jZ1kyOXRiV0VnZVdsbGJHUnpJSFJvWlNCdWFXTmxjM1FnYjNWMGNIVjBPbHh1YW5OdmJrUnBabVl1ZFhObFRHOXVaMlZ6ZEZSdmEyVnVJRDBnZEhKMVpUdGNibHh1YW5OdmJrUnBabVl1ZEc5clpXNXBlbVVnUFNCc2FXNWxSR2xtWmk1MGIydGxibWw2WlR0Y2JtcHpiMjVFYVdabUxtTmhjM1JKYm5CMWRDQTlJR1oxYm1OMGFXOXVLSFpoYkhWbEtTQjdYRzRnSUdOdmJuTjBJSHQxYm1SbFptbHVaV1JTWlhCc1lXTmxiV1Z1ZEN3Z2MzUnlhVzVuYVdaNVVtVndiR0ZqWlhJZ1BTQW9heXdnZGlrZ1BUNGdkSGx3Wlc5bUlIWWdQVDA5SUNkMWJtUmxabWx1WldRbklEOGdkVzVrWldacGJtVmtVbVZ3YkdGalpXMWxiblFnT2lCMmZTQTlJSFJvYVhNdWIzQjBhVzl1Y3p0Y2JseHVJQ0J5WlhSMWNtNGdkSGx3Wlc5bUlIWmhiSFZsSUQwOVBTQW5jM1J5YVc1bkp5QS9JSFpoYkhWbElEb2dTbE5QVGk1emRISnBibWRwWm5rb1kyRnViMjVwWTJGc2FYcGxLSFpoYkhWbExDQnVkV3hzTENCdWRXeHNMQ0J6ZEhKcGJtZHBabmxTWlhCc1lXTmxjaWtzSUhOMGNtbHVaMmxtZVZKbGNHeGhZMlZ5TENBbklDQW5LVHRjYm4wN1hHNXFjMjl1UkdsbVppNWxjWFZoYkhNZ1BTQm1kVzVqZEdsdmJpaHNaV1owTENCeWFXZG9kQ2tnZTF4dUlDQnlaWFIxY200Z1JHbG1aaTV3Y205MGIzUjVjR1V1WlhGMVlXeHpMbU5oYkd3b2FuTnZia1JwWm1Zc0lHeGxablF1Y21Wd2JHRmpaU2d2TENoYlhGeHlYRnh1WFNrdlp5d2dKeVF4Snlrc0lISnBaMmgwTG5KbGNHeGhZMlVvTHl3b1cxeGNjbHhjYmwwcEwyY3NJQ2NrTVNjcEtUdGNibjA3WEc1Y2JtVjRjRzl5ZENCbWRXNWpkR2x2YmlCa2FXWm1Tbk52YmlodmJHUlBZbW9zSUc1bGQwOWlhaXdnYjNCMGFXOXVjeWtnZXlCeVpYUjFjbTRnYW5OdmJrUnBabVl1WkdsbVppaHZiR1JQWW1vc0lHNWxkMDlpYWl3Z2IzQjBhVzl1Y3lrN0lIMWNibHh1THk4Z1ZHaHBjeUJtZFc1amRHbHZiaUJvWVc1a2JHVnpJSFJvWlNCd2NtVnpaVzVqWlNCdlppQmphWEpqZFd4aGNpQnlaV1psY21WdVkyVnpJR0o1SUdKaGFXeHBibWNnYjNWMElIZG9aVzRnWlc1amIzVnVkR1Z5YVc1bklHRnVYRzR2THlCdlltcGxZM1FnZEdoaGRDQnBjeUJoYkhKbFlXUjVJRzl1SUhSb1pTQmNJbk4wWVdOclhDSWdiMllnYVhSbGJYTWdZbVZwYm1jZ2NISnZZMlZ6YzJWa0xpQkJZMk5sY0hSeklHRnVJRzl3ZEdsdmJtRnNJSEpsY0d4aFkyVnlYRzVsZUhCdmNuUWdablZ1WTNScGIyNGdZMkZ1YjI1cFkyRnNhWHBsS0c5aWFpd2djM1JoWTJzc0lISmxjR3hoWTJWdFpXNTBVM1JoWTJzc0lISmxjR3hoWTJWeUxDQnJaWGtwSUh0Y2JpQWdjM1JoWTJzZ1BTQnpkR0ZqYXlCOGZDQmJYVHRjYmlBZ2NtVndiR0ZqWlcxbGJuUlRkR0ZqYXlBOUlISmxjR3hoWTJWdFpXNTBVM1JoWTJzZ2ZId2dXMTA3WEc1Y2JpQWdhV1lnS0hKbGNHeGhZMlZ5S1NCN1hHNGdJQ0FnYjJKcUlEMGdjbVZ3YkdGalpYSW9hMlY1TENCdlltb3BPMXh1SUNCOVhHNWNiaUFnYkdWMElHazdYRzVjYmlBZ1ptOXlJQ2hwSUQwZ01Ec2dhU0E4SUhOMFlXTnJMbXhsYm1kMGFEc2dhU0FyUFNBeEtTQjdYRzRnSUNBZ2FXWWdLSE4wWVdOclcybGRJRDA5UFNCdlltb3BJSHRjYmlBZ0lDQWdJSEpsZEhWeWJpQnlaWEJzWVdObGJXVnVkRk4wWVdOclcybGRPMXh1SUNBZ0lIMWNiaUFnZlZ4dVhHNGdJR3hsZENCallXNXZibWxqWVd4cGVtVmtUMkpxTzF4dVhHNGdJR2xtSUNnblcyOWlhbVZqZENCQmNuSmhlVjBuSUQwOVBTQnZZbXBsWTNSUWNtOTBiM1I1Y0dWVWIxTjBjbWx1Wnk1allXeHNLRzlpYWlrcElIdGNiaUFnSUNCemRHRmpheTV3ZFhOb0tHOWlhaWs3WEc0Z0lDQWdZMkZ1YjI1cFkyRnNhWHBsWkU5aWFpQTlJRzVsZHlCQmNuSmhlU2h2WW1vdWJHVnVaM1JvS1R0Y2JpQWdJQ0J5WlhCc1lXTmxiV1Z1ZEZOMFlXTnJMbkIxYzJnb1kyRnViMjVwWTJGc2FYcGxaRTlpYWlrN1hHNGdJQ0FnWm05eUlDaHBJRDBnTURzZ2FTQThJRzlpYWk1c1pXNW5kR2c3SUdrZ0t6MGdNU2tnZTF4dUlDQWdJQ0FnWTJGdWIyNXBZMkZzYVhwbFpFOWlhbHRwWFNBOUlHTmhibTl1YVdOaGJHbDZaU2h2WW1wYmFWMHNJSE4wWVdOckxDQnlaWEJzWVdObGJXVnVkRk4wWVdOckxDQnlaWEJzWVdObGNpd2dhMlY1S1R0Y2JpQWdJQ0I5WEc0Z0lDQWdjM1JoWTJzdWNHOXdLQ2s3WEc0Z0lDQWdjbVZ3YkdGalpXMWxiblJUZEdGamF5NXdiM0FvS1R0Y2JpQWdJQ0J5WlhSMWNtNGdZMkZ1YjI1cFkyRnNhWHBsWkU5aWFqdGNiaUFnZlZ4dVhHNGdJR2xtSUNodlltb2dKaVlnYjJKcUxuUnZTbE5QVGlrZ2UxeHVJQ0FnSUc5aWFpQTlJRzlpYWk1MGIwcFRUMDRvS1R0Y2JpQWdmVnh1WEc0Z0lHbG1JQ2gwZVhCbGIyWWdiMkpxSUQwOVBTQW5iMkpxWldOMEp5QW1KaUJ2WW1vZ0lUMDlJRzUxYkd3cElIdGNiaUFnSUNCemRHRmpheTV3ZFhOb0tHOWlhaWs3WEc0Z0lDQWdZMkZ1YjI1cFkyRnNhWHBsWkU5aWFpQTlJSHQ5TzF4dUlDQWdJSEpsY0d4aFkyVnRaVzUwVTNSaFkyc3VjSFZ6YUNoallXNXZibWxqWVd4cGVtVmtUMkpxS1R0Y2JpQWdJQ0JzWlhRZ2MyOXlkR1ZrUzJWNWN5QTlJRnRkTEZ4dUlDQWdJQ0FnSUNCclpYazdYRzRnSUNBZ1ptOXlJQ2hyWlhrZ2FXNGdiMkpxS1NCN1hHNGdJQ0FnSUNBdktpQnBjM1JoYm1KMWJDQnBaMjV2Y21VZ1pXeHpaU0FxTDF4dUlDQWdJQ0FnYVdZZ0tHOWlhaTVvWVhOUGQyNVFjbTl3WlhKMGVTaHJaWGtwS1NCN1hHNGdJQ0FnSUNBZ0lITnZjblJsWkV0bGVYTXVjSFZ6YUNoclpYa3BPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lIMWNiaUFnSUNCemIzSjBaV1JMWlhsekxuTnZjblFvS1R0Y2JpQWdJQ0JtYjNJZ0tHa2dQU0F3T3lCcElEd2djMjl5ZEdWa1MyVjVjeTVzWlc1bmRHZzdJR2tnS3owZ01Ta2dlMXh1SUNBZ0lDQWdhMlY1SUQwZ2MyOXlkR1ZrUzJWNWMxdHBYVHRjYmlBZ0lDQWdJR05oYm05dWFXTmhiR2w2WldSUFltcGJhMlY1WFNBOUlHTmhibTl1YVdOaGJHbDZaU2h2WW1wYmEyVjVYU3dnYzNSaFkyc3NJSEpsY0d4aFkyVnRaVzUwVTNSaFkyc3NJSEpsY0d4aFkyVnlMQ0JyWlhrcE8xeHVJQ0FnSUgxY2JpQWdJQ0J6ZEdGamF5NXdiM0FvS1R0Y2JpQWdJQ0J5WlhCc1lXTmxiV1Z1ZEZOMFlXTnJMbkJ2Y0NncE8xeHVJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lHTmhibTl1YVdOaGJHbDZaV1JQWW1vZ1BTQnZZbW83WEc0Z0lIMWNiaUFnY21WMGRYSnVJR05oYm05dWFXTmhiR2w2WldSUFltbzdYRzU5WEc0aVhYMD1cbiIsICIvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5cInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGlmZkFycmF5cyA9IGRpZmZBcnJheXM7XG5leHBvcnRzLmFycmF5RGlmZiA9IHZvaWQgMDtcblxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbnZhclxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuX2Jhc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2Jhc2VcIikpXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuO1xuXG4vKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovIGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xudmFyIGFycmF5RGlmZiA9IG5ld1xuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuX2Jhc2Vcbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG5bXG4vKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5cImRlZmF1bHRcIlxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbl0oKTtcblxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuZXhwb3J0cy5hcnJheURpZmYgPSBhcnJheURpZmY7XG5cbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG5hcnJheURpZmYudG9rZW5pemUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlLnNsaWNlKCk7XG59O1xuXG5hcnJheURpZmYuam9pbiA9IGFycmF5RGlmZi5yZW1vdmVFbXB0eSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWU7XG59O1xuXG5mdW5jdGlvbiBkaWZmQXJyYXlzKG9sZEFyciwgbmV3QXJyLCBjYWxsYmFjaykge1xuICByZXR1cm4gYXJyYXlEaWZmLmRpZmYob2xkQXJyLCBuZXdBcnIsIGNhbGxiYWNrKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OWthV1ptTDJGeWNtRjVMbXB6SWwwc0ltNWhiV1Z6SWpwYkltRnljbUY1UkdsbVppSXNJa1JwWm1ZaUxDSjBiMnRsYm1sNlpTSXNJblpoYkhWbElpd2ljMnhwWTJVaUxDSnFiMmx1SWl3aWNtVnRiM1psUlcxd2RIa2lMQ0prYVdabVFYSnlZWGx6SWl3aWIyeGtRWEp5SWl3aWJtVjNRWEp5SWl3aVkyRnNiR0poWTJzaUxDSmthV1ptSWwwc0ltMWhjSEJwYm1keklqb2lPenM3T3pzN096czdPMEZCUVVFN1FVRkJRVHRCUVVGQk8wRkJRVUU3UVVGQlFUczdPenM3UVVGRlR5eEpRVUZOUVN4VFFVRlRMRWRCUVVjN1FVRkJTVU03UVVGQlFVRTdRVUZCUVVFN1FVRkJRVUU3UVVGQlFVRTdRVUZCUVVFN1FVRkJRVUU3UVVGQlFVRXNRMEZCU2l4RlFVRnNRanM3T3pzN08wRkJRMUJFTEZOQlFWTXNRMEZCUTBVc1VVRkJWaXhIUVVGeFFpeFZRVUZUUXl4TFFVRlVMRVZCUVdkQ08wRkJRMjVETEZOQlFVOUJMRXRCUVVzc1EwRkJRME1zUzBGQlRpeEZRVUZRTzBGQlEwUXNRMEZHUkRzN1FVRkhRVW9zVTBGQlV5eERRVUZEU3l4SlFVRldMRWRCUVdsQ1RDeFRRVUZUTEVOQlFVTk5MRmRCUVZZc1IwRkJkMElzVlVGQlUwZ3NTMEZCVkN4RlFVRm5RanRCUVVOMlJDeFRRVUZQUVN4TFFVRlFPMEZCUTBRc1EwRkdSRHM3UVVGSlR5eFRRVUZUU1N4VlFVRlVMRU5CUVc5Q1F5eE5RVUZ3UWl4RlFVRTBRa01zVFVGQk5VSXNSVUZCYjBORExGRkJRWEJETEVWQlFUaERPMEZCUVVVc1UwRkJUMVlzVTBGQlV5eERRVUZEVnl4SlFVRldMRU5CUVdWSUxFMUJRV1lzUlVGQmRVSkRMRTFCUVhaQ0xFVkJRU3RDUXl4UlFVRXZRaXhEUVVGUU8wRkJRV3RFSWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaWFXMXdiM0owSUVScFptWWdabkp2YlNBbkxpOWlZWE5sSnp0Y2JseHVaWGh3YjNKMElHTnZibk4wSUdGeWNtRjVSR2xtWmlBOUlHNWxkeUJFYVdabUtDazdYRzVoY25KaGVVUnBabVl1ZEc5clpXNXBlbVVnUFNCbWRXNWpkR2x2YmloMllXeDFaU2tnZTF4dUlDQnlaWFIxY200Z2RtRnNkV1V1YzJ4cFkyVW9LVHRjYm4wN1hHNWhjbkpoZVVScFptWXVhbTlwYmlBOUlHRnljbUY1UkdsbVppNXlaVzF2ZG1WRmJYQjBlU0E5SUdaMWJtTjBhVzl1S0haaGJIVmxLU0I3WEc0Z0lISmxkSFZ5YmlCMllXeDFaVHRjYm4wN1hHNWNibVY0Y0c5eWRDQm1kVzVqZEdsdmJpQmthV1ptUVhKeVlYbHpLRzlzWkVGeWNpd2dibVYzUVhKeUxDQmpZV3hzWW1GamF5a2dleUJ5WlhSMWNtNGdZWEp5WVhsRWFXWm1MbVJwWm1Zb2IyeGtRWEp5TENCdVpYZEJjbklzSUdOaGJHeGlZV05yS1RzZ2ZWeHVJbDE5XG4iLCAiLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLnBhcnNlUGF0Y2ggPSBwYXJzZVBhdGNoO1xuXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuZnVuY3Rpb24gcGFyc2VQYXRjaCh1bmlEaWZmKSB7XG4gIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgdmFyXG4gIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICB2YXIgZGlmZnN0ciA9IHVuaURpZmYuc3BsaXQoL1xcclxcbnxbXFxuXFx2XFxmXFxyXFx4ODVdLyksXG4gICAgICBkZWxpbWl0ZXJzID0gdW5pRGlmZi5tYXRjaCgvXFxyXFxufFtcXG5cXHZcXGZcXHJcXHg4NV0vZykgfHwgW10sXG4gICAgICBsaXN0ID0gW10sXG4gICAgICBpID0gMDtcblxuICBmdW5jdGlvbiBwYXJzZUluZGV4KCkge1xuICAgIHZhciBpbmRleCA9IHt9O1xuICAgIGxpc3QucHVzaChpbmRleCk7IC8vIFBhcnNlIGRpZmYgbWV0YWRhdGFcblxuICAgIHdoaWxlIChpIDwgZGlmZnN0ci5sZW5ndGgpIHtcbiAgICAgIHZhciBsaW5lID0gZGlmZnN0cltpXTsgLy8gRmlsZSBoZWFkZXIgZm91bmQsIGVuZCBwYXJzaW5nIGRpZmYgbWV0YWRhdGFcblxuICAgICAgaWYgKC9eKFxcLVxcLVxcLXxcXCtcXCtcXCt8QEApXFxzLy50ZXN0KGxpbmUpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSAvLyBEaWZmIGluZGV4XG5cblxuICAgICAgdmFyIGhlYWRlciA9IC9eKD86SW5kZXg6fGRpZmYoPzogLXIgXFx3KykrKVxccysoLis/KVxccyokLy5leGVjKGxpbmUpO1xuXG4gICAgICBpZiAoaGVhZGVyKSB7XG4gICAgICAgIGluZGV4LmluZGV4ID0gaGVhZGVyWzFdO1xuICAgICAgfVxuXG4gICAgICBpKys7XG4gICAgfSAvLyBQYXJzZSBmaWxlIGhlYWRlcnMgaWYgdGhleSBhcmUgZGVmaW5lZC4gVW5pZmllZCBkaWZmIHJlcXVpcmVzIHRoZW0sIGJ1dFxuICAgIC8vIHRoZXJlJ3Mgbm8gdGVjaG5pY2FsIGlzc3VlcyB0byBoYXZlIGFuIGlzb2xhdGVkIGh1bmsgd2l0aG91dCBmaWxlIGhlYWRlclxuXG5cbiAgICBwYXJzZUZpbGVIZWFkZXIoaW5kZXgpO1xuICAgIHBhcnNlRmlsZUhlYWRlcihpbmRleCk7IC8vIFBhcnNlIGh1bmtzXG5cbiAgICBpbmRleC5odW5rcyA9IFtdO1xuXG4gICAgd2hpbGUgKGkgPCBkaWZmc3RyLmxlbmd0aCkge1xuICAgICAgdmFyIF9saW5lID0gZGlmZnN0cltpXTtcblxuICAgICAgaWYgKC9eKEluZGV4OnxkaWZmfFxcLVxcLVxcLXxcXCtcXCtcXCspXFxzLy50ZXN0KF9saW5lKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSBpZiAoL15AQC8udGVzdChfbGluZSkpIHtcbiAgICAgICAgaW5kZXguaHVua3MucHVzaChwYXJzZUh1bmsoKSk7XG4gICAgICB9IGVsc2UgaWYgKF9saW5lICYmIG9wdGlvbnMuc3RyaWN0KSB7XG4gICAgICAgIC8vIElnbm9yZSB1bmV4cGVjdGVkIGNvbnRlbnQgdW5sZXNzIGluIHN0cmljdCBtb2RlXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBsaW5lICcgKyAoaSArIDEpICsgJyAnICsgSlNPTi5zdHJpbmdpZnkoX2xpbmUpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGkrKztcbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gUGFyc2VzIHRoZSAtLS0gYW5kICsrKyBoZWFkZXJzLCBpZiBub25lIGFyZSBmb3VuZCwgbm8gbGluZXNcbiAgLy8gYXJlIGNvbnN1bWVkLlxuXG5cbiAgZnVuY3Rpb24gcGFyc2VGaWxlSGVhZGVyKGluZGV4KSB7XG4gICAgdmFyIGZpbGVIZWFkZXIgPSAvXigtLS18XFwrXFwrXFwrKVxccysoLiopJC8uZXhlYyhkaWZmc3RyW2ldKTtcblxuICAgIGlmIChmaWxlSGVhZGVyKSB7XG4gICAgICB2YXIga2V5UHJlZml4ID0gZmlsZUhlYWRlclsxXSA9PT0gJy0tLScgPyAnb2xkJyA6ICduZXcnO1xuICAgICAgdmFyIGRhdGEgPSBmaWxlSGVhZGVyWzJdLnNwbGl0KCdcXHQnLCAyKTtcbiAgICAgIHZhciBmaWxlTmFtZSA9IGRhdGFbMF0ucmVwbGFjZSgvXFxcXFxcXFwvZywgJ1xcXFwnKTtcblxuICAgICAgaWYgKC9eXCIuKlwiJC8udGVzdChmaWxlTmFtZSkpIHtcbiAgICAgICAgZmlsZU5hbWUgPSBmaWxlTmFtZS5zdWJzdHIoMSwgZmlsZU5hbWUubGVuZ3RoIC0gMik7XG4gICAgICB9XG5cbiAgICAgIGluZGV4W2tleVByZWZpeCArICdGaWxlTmFtZSddID0gZmlsZU5hbWU7XG4gICAgICBpbmRleFtrZXlQcmVmaXggKyAnSGVhZGVyJ10gPSAoZGF0YVsxXSB8fCAnJykudHJpbSgpO1xuICAgICAgaSsrO1xuICAgIH1cbiAgfSAvLyBQYXJzZXMgYSBodW5rXG4gIC8vIFRoaXMgYXNzdW1lcyB0aGF0IHdlIGFyZSBhdCB0aGUgc3RhcnQgb2YgYSBodW5rLlxuXG5cbiAgZnVuY3Rpb24gcGFyc2VIdW5rKCkge1xuICAgIHZhciBjaHVua0hlYWRlckluZGV4ID0gaSxcbiAgICAgICAgY2h1bmtIZWFkZXJMaW5lID0gZGlmZnN0cltpKytdLFxuICAgICAgICBjaHVua0hlYWRlciA9IGNodW5rSGVhZGVyTGluZS5zcGxpdCgvQEAgLShcXGQrKSg/OiwoXFxkKykpPyBcXCsoXFxkKykoPzosKFxcZCspKT8gQEAvKTtcbiAgICB2YXIgaHVuayA9IHtcbiAgICAgIG9sZFN0YXJ0OiArY2h1bmtIZWFkZXJbMV0sXG4gICAgICBvbGRMaW5lczogdHlwZW9mIGNodW5rSGVhZGVyWzJdID09PSAndW5kZWZpbmVkJyA/IDEgOiArY2h1bmtIZWFkZXJbMl0sXG4gICAgICBuZXdTdGFydDogK2NodW5rSGVhZGVyWzNdLFxuICAgICAgbmV3TGluZXM6IHR5cGVvZiBjaHVua0hlYWRlcls0XSA9PT0gJ3VuZGVmaW5lZCcgPyAxIDogK2NodW5rSGVhZGVyWzRdLFxuICAgICAgbGluZXM6IFtdLFxuICAgICAgbGluZWRlbGltaXRlcnM6IFtdXG4gICAgfTsgLy8gVW5pZmllZCBEaWZmIEZvcm1hdCBxdWlyazogSWYgdGhlIGNodW5rIHNpemUgaXMgMCxcbiAgICAvLyB0aGUgZmlyc3QgbnVtYmVyIGlzIG9uZSBsb3dlciB0aGFuIG9uZSB3b3VsZCBleHBlY3QuXG4gICAgLy8gaHR0cHM6Ly93d3cuYXJ0aW1hLmNvbS93ZWJsb2dzL3ZpZXdwb3N0LmpzcD90aHJlYWQ9MTY0MjkzXG5cbiAgICBpZiAoaHVuay5vbGRMaW5lcyA9PT0gMCkge1xuICAgICAgaHVuay5vbGRTdGFydCArPSAxO1xuICAgIH1cblxuICAgIGlmIChodW5rLm5ld0xpbmVzID09PSAwKSB7XG4gICAgICBodW5rLm5ld1N0YXJ0ICs9IDE7XG4gICAgfVxuXG4gICAgdmFyIGFkZENvdW50ID0gMCxcbiAgICAgICAgcmVtb3ZlQ291bnQgPSAwO1xuXG4gICAgZm9yICg7IGkgPCBkaWZmc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBMaW5lcyBzdGFydGluZyB3aXRoICctLS0nIGNvdWxkIGJlIG1pc3Rha2VuIGZvciB0aGUgXCJyZW1vdmUgbGluZVwiIG9wZXJhdGlvblxuICAgICAgLy8gQnV0IHRoZXkgY291bGQgYmUgdGhlIGhlYWRlciBmb3IgdGhlIG5leHQgZmlsZS4gVGhlcmVmb3JlIHBydW5lIHN1Y2ggY2FzZXMgb3V0LlxuICAgICAgaWYgKGRpZmZzdHJbaV0uaW5kZXhPZignLS0tICcpID09PSAwICYmIGkgKyAyIDwgZGlmZnN0ci5sZW5ndGggJiYgZGlmZnN0cltpICsgMV0uaW5kZXhPZignKysrICcpID09PSAwICYmIGRpZmZzdHJbaSArIDJdLmluZGV4T2YoJ0BAJykgPT09IDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHZhciBvcGVyYXRpb24gPSBkaWZmc3RyW2ldLmxlbmd0aCA9PSAwICYmIGkgIT0gZGlmZnN0ci5sZW5ndGggLSAxID8gJyAnIDogZGlmZnN0cltpXVswXTtcblxuICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJysnIHx8IG9wZXJhdGlvbiA9PT0gJy0nIHx8IG9wZXJhdGlvbiA9PT0gJyAnIHx8IG9wZXJhdGlvbiA9PT0gJ1xcXFwnKSB7XG4gICAgICAgIGh1bmsubGluZXMucHVzaChkaWZmc3RyW2ldKTtcbiAgICAgICAgaHVuay5saW5lZGVsaW1pdGVycy5wdXNoKGRlbGltaXRlcnNbaV0gfHwgJ1xcbicpO1xuXG4gICAgICAgIGlmIChvcGVyYXRpb24gPT09ICcrJykge1xuICAgICAgICAgIGFkZENvdW50Kys7XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uID09PSAnLScpIHtcbiAgICAgICAgICByZW1vdmVDb3VudCsrO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJyAnKSB7XG4gICAgICAgICAgYWRkQ291bnQrKztcbiAgICAgICAgICByZW1vdmVDb3VudCsrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IC8vIEhhbmRsZSB0aGUgZW1wdHkgYmxvY2sgY291bnQgY2FzZVxuXG5cbiAgICBpZiAoIWFkZENvdW50ICYmIGh1bmsubmV3TGluZXMgPT09IDEpIHtcbiAgICAgIGh1bmsubmV3TGluZXMgPSAwO1xuICAgIH1cblxuICAgIGlmICghcmVtb3ZlQ291bnQgJiYgaHVuay5vbGRMaW5lcyA9PT0gMSkge1xuICAgICAgaHVuay5vbGRMaW5lcyA9IDA7XG4gICAgfSAvLyBQZXJmb3JtIG9wdGlvbmFsIHNhbml0eSBjaGVja2luZ1xuXG5cbiAgICBpZiAob3B0aW9ucy5zdHJpY3QpIHtcbiAgICAgIGlmIChhZGRDb3VudCAhPT0gaHVuay5uZXdMaW5lcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FkZGVkIGxpbmUgY291bnQgZGlkIG5vdCBtYXRjaCBmb3IgaHVuayBhdCBsaW5lICcgKyAoY2h1bmtIZWFkZXJJbmRleCArIDEpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlbW92ZUNvdW50ICE9PSBodW5rLm9sZExpbmVzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUmVtb3ZlZCBsaW5lIGNvdW50IGRpZCBub3QgbWF0Y2ggZm9yIGh1bmsgYXQgbGluZSAnICsgKGNodW5rSGVhZGVySW5kZXggKyAxKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGh1bms7XG4gIH1cblxuICB3aGlsZSAoaSA8IGRpZmZzdHIubGVuZ3RoKSB7XG4gICAgcGFyc2VJbmRleCgpO1xuICB9XG5cbiAgcmV0dXJuIGxpc3Q7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTl3WVhSamFDOXdZWEp6WlM1cWN5SmRMQ0p1WVcxbGN5STZXeUp3WVhKelpWQmhkR05vSWl3aWRXNXBSR2xtWmlJc0ltOXdkR2x2Ym5NaUxDSmthV1ptYzNSeUlpd2ljM0JzYVhRaUxDSmtaV3hwYldsMFpYSnpJaXdpYldGMFkyZ2lMQ0pzYVhOMElpd2lhU0lzSW5CaGNuTmxTVzVrWlhnaUxDSnBibVJsZUNJc0luQjFjMmdpTENKc1pXNW5kR2dpTENKc2FXNWxJaXdpZEdWemRDSXNJbWhsWVdSbGNpSXNJbVY0WldNaUxDSndZWEp6WlVacGJHVklaV0ZrWlhJaUxDSm9kVzVyY3lJc0luQmhjbk5sU0hWdWF5SXNJbk4wY21samRDSXNJa1Z5Y205eUlpd2lTbE5QVGlJc0luTjBjbWx1WjJsbWVTSXNJbVpwYkdWSVpXRmtaWElpTENKclpYbFFjbVZtYVhnaUxDSmtZWFJoSWl3aVptbHNaVTVoYldVaUxDSnlaWEJzWVdObElpd2ljM1ZpYzNSeUlpd2lkSEpwYlNJc0ltTm9kVzVyU0dWaFpHVnlTVzVrWlhnaUxDSmphSFZ1YTBobFlXUmxja3hwYm1VaUxDSmphSFZ1YTBobFlXUmxjaUlzSW1oMWJtc2lMQ0p2YkdSVGRHRnlkQ0lzSW05c1pFeHBibVZ6SWl3aWJtVjNVM1JoY25RaUxDSnVaWGRNYVc1bGN5SXNJbXhwYm1Weklpd2liR2x1WldSbGJHbHRhWFJsY25NaUxDSmhaR1JEYjNWdWRDSXNJbkpsYlc5MlpVTnZkVzUwSWl3aWFXNWtaWGhQWmlJc0ltOXdaWEpoZEdsdmJpSmRMQ0p0WVhCd2FXNW5jeUk2SWpzN096czdPenM3TzBGQlFVOHNVMEZCVTBFc1ZVRkJWQ3hEUVVGdlFrTXNUMEZCY0VJc1JVRkJNa003UVVGQlFUdEJRVUZCTzBGQlFVRTdRVUZCWkVNc1JVRkJRVUVzVDBGQll5eDFSVUZCU2l4RlFVRkpPMEZCUTJoRUxFMUJRVWxETEU5QlFVOHNSMEZCUjBZc1QwRkJUeXhEUVVGRFJ5eExRVUZTTEVOQlFXTXNjVUpCUVdRc1EwRkJaRHRCUVVGQkxFMUJRMGxETEZWQlFWVXNSMEZCUjBvc1QwRkJUeXhEUVVGRFN5eExRVUZTTEVOQlFXTXNjMEpCUVdRc1MwRkJlVU1zUlVGRU1VUTdRVUZCUVN4TlFVVkpReXhKUVVGSkxFZEJRVWNzUlVGR1dEdEJRVUZCTEUxQlIwbERMRU5CUVVNc1IwRkJSeXhEUVVoU096dEJRVXRCTEZkQlFWTkRMRlZCUVZRc1IwRkJjMEk3UVVGRGNFSXNVVUZCU1VNc1MwRkJTeXhIUVVGSExFVkJRVm83UVVGRFFVZ3NTVUZCUVVFc1NVRkJTU3hEUVVGRFNTeEpRVUZNTEVOQlFWVkVMRXRCUVZZc1JVRkdiMElzUTBGSmNFSTdPMEZCUTBFc1YwRkJUMFlzUTBGQlF5eEhRVUZIVEN4UFFVRlBMRU5CUVVOVExFMUJRVzVDTEVWQlFUSkNPMEZCUTNwQ0xGVkJRVWxETEVsQlFVa3NSMEZCUjFZc1QwRkJUeXhEUVVGRFN5eERRVUZFTEVOQlFXeENMRU5CUkhsQ0xFTkJSM3BDT3p0QlFVTkJMRlZCUVVzc2RVSkJRVVFzUTBGQk1FSk5MRWxCUVRGQ0xFTkJRU3RDUkN4SlFVRXZRaXhEUVVGS0xFVkJRVEJETzBGQlEzaERPMEZCUTBRc1QwRk9kMElzUTBGUmVrSTdPenRCUVVOQkxGVkJRVWxGTEUxQlFVMHNSMEZCU1N3d1EwRkJSQ3hEUVVFMlEwTXNTVUZCTjBNc1EwRkJhMFJJTEVsQlFXeEVMRU5CUVdJN08wRkJRMEVzVlVGQlNVVXNUVUZCU2l4RlFVRlpPMEZCUTFaTUxGRkJRVUZCTEV0QlFVc3NRMEZCUTBFc1MwRkJUaXhIUVVGalN5eE5RVUZOTEVOQlFVTXNRMEZCUkN4RFFVRndRanRCUVVORU96dEJRVVZFVUN4TlFVRkJRU3hEUVVGRE8wRkJRMFlzUzBGd1FtMUNMRU5CYzBKd1FqdEJRVU5CT3pzN1FVRkRRVk1zU1VGQlFVRXNaVUZCWlN4RFFVRkRVQ3hMUVVGRUxFTkJRV1k3UVVGRFFVOHNTVUZCUVVFc1pVRkJaU3hEUVVGRFVDeExRVUZFTEVOQlFXWXNRMEY2UW05Q0xFTkJNa0p3UWpzN1FVRkRRVUVzU1VGQlFVRXNTMEZCU3l4RFFVRkRVU3hMUVVGT0xFZEJRV01zUlVGQlpEczdRVUZGUVN4WFFVRlBWaXhEUVVGRExFZEJRVWRNTEU5QlFVOHNRMEZCUTFNc1RVRkJia0lzUlVGQk1rSTdRVUZEZWtJc1ZVRkJTVU1zUzBGQlNTeEhRVUZIVml4UFFVRlBMRU5CUVVOTExFTkJRVVFzUTBGQmJFSTdPMEZCUlVFc1ZVRkJTeXhuUTBGQlJDeERRVUZ0UTAwc1NVRkJia01zUTBGQmQwTkVMRXRCUVhoRExFTkJRVW9zUlVGQmJVUTdRVUZEYWtRN1FVRkRSQ3hQUVVaRUxFMUJSVThzU1VGQlN5eExRVUZFTEVOQlFWRkRMRWxCUVZJc1EwRkJZVVFzUzBGQllpeERRVUZLTEVWQlFYZENPMEZCUXpkQ1NDeFJRVUZCUVN4TFFVRkxMRU5CUVVOUkxFdEJRVTRzUTBGQldWQXNTVUZCV2l4RFFVRnBRbEVzVTBGQlV5eEZRVUV4UWp0QlFVTkVMRTlCUmswc1RVRkZRU3hKUVVGSlRpeExRVUZKTEVsQlFVbFlMRTlCUVU4c1EwRkJRMnRDTEUxQlFYQkNMRVZCUVRSQ08wRkJRMnBETzBGQlEwRXNZMEZCVFN4SlFVRkpReXhMUVVGS0xFTkJRVlVzYlVKQlFXMUNZaXhEUVVGRExFZEJRVWNzUTBGQmRrSXNTVUZCTkVJc1IwRkJOVUlzUjBGQmEwTmpMRWxCUVVrc1EwRkJRME1zVTBGQlRDeERRVUZsVml4TFFVRm1MRU5CUVRWRExFTkJRVTQ3UVVGRFJDeFBRVWhOTEUxQlIwRTdRVUZEVEV3c1VVRkJRVUVzUTBGQlF6dEJRVU5HTzBGQlEwWTdRVUZEUml4SFFXeEVLME1zUTBGdlJHaEVPMEZCUTBFN096dEJRVU5CTEZkQlFWTlRMR1ZCUVZRc1EwRkJlVUpRTEV0QlFYcENMRVZCUVdkRE8wRkJRemxDTEZGQlFVMWpMRlZCUVZVc1IwRkJTU3gxUWtGQlJDeERRVUV3UWxJc1NVRkJNVUlzUTBGQkswSmlMRTlCUVU4c1EwRkJRMHNzUTBGQlJDeERRVUYwUXl4RFFVRnVRanM3UVVGRFFTeFJRVUZKWjBJc1ZVRkJTaXhGUVVGblFqdEJRVU5rTEZWQlFVbERMRk5CUVZNc1IwRkJSMFFzVlVGQlZTeERRVUZETEVOQlFVUXNRMEZCVml4TFFVRnJRaXhMUVVGc1FpeEhRVUV3UWl4TFFVRXhRaXhIUVVGclF5eExRVUZzUkR0QlFVTkJMRlZCUVUxRkxFbEJRVWtzUjBGQlIwWXNWVUZCVlN4RFFVRkRMRU5CUVVRc1EwRkJWaXhEUVVGamNFSXNTMEZCWkN4RFFVRnZRaXhKUVVGd1FpeEZRVUV3UWl4RFFVRXhRaXhEUVVGaU8wRkJRMEVzVlVGQlNYVkNMRkZCUVZFc1IwRkJSMFFzU1VGQlNTeERRVUZETEVOQlFVUXNRMEZCU2l4RFFVRlJSU3hQUVVGU0xFTkJRV2RDTEU5QlFXaENMRVZCUVhsQ0xFbEJRWHBDTEVOQlFXWTdPMEZCUTBFc1ZVRkJTeXhSUVVGRUxFTkJRVmRrTEVsQlFWZ3NRMEZCWjBKaExGRkJRV2hDTEVOQlFVb3NSVUZCSzBJN1FVRkROMEpCTEZGQlFVRkJMRkZCUVZFc1IwRkJSMEVzVVVGQlVTeERRVUZEUlN4TlFVRlVMRU5CUVdkQ0xFTkJRV2hDTEVWQlFXMUNSaXhSUVVGUkxFTkJRVU5tTEUxQlFWUXNSMEZCYTBJc1EwRkJja01zUTBGQldEdEJRVU5FT3p0QlFVTkVSaXhOUVVGQlFTeExRVUZMTEVOQlFVTmxMRk5CUVZNc1IwRkJSeXhWUVVGaUxFTkJRVXdzUjBGQlowTkZMRkZCUVdoRE8wRkJRMEZxUWl4TlFVRkJRU3hMUVVGTExFTkJRVU5sTEZOQlFWTXNSMEZCUnl4UlFVRmlMRU5CUVV3c1IwRkJPRUlzUTBGQlEwTXNTVUZCU1N4RFFVRkRMRU5CUVVRc1EwRkJTaXhKUVVGWExFVkJRVm9zUlVGQlowSkpMRWxCUVdoQ0xFVkJRVGxDTzBGQlJVRjBRaXhOUVVGQlFTeERRVUZETzBGQlEwWTdRVUZEUml4SFFYQkZLME1zUTBGelJXaEVPMEZCUTBFN096dEJRVU5CTEZkQlFWTlhMRk5CUVZRc1IwRkJjVUk3UVVGRGJrSXNVVUZCU1Zrc1owSkJRV2RDTEVkQlFVZDJRaXhEUVVGMlFqdEJRVUZCTEZGQlEwbDNRaXhsUVVGbExFZEJRVWMzUWl4UFFVRlBMRU5CUVVOTExFTkJRVU1zUlVGQlJpeERRVVEzUWp0QlFVRkJMRkZCUlVsNVFpeFhRVUZYTEVkQlFVZEVMR1ZCUVdVc1EwRkJRelZDTEV0QlFXaENMRU5CUVhOQ0xEUkRRVUYwUWl4RFFVWnNRanRCUVVsQkxGRkJRVWs0UWl4SlFVRkpMRWRCUVVjN1FVRkRWRU1zVFVGQlFVRXNVVUZCVVN4RlFVRkZMRU5CUVVOR0xGZEJRVmNzUTBGQlF5eERRVUZFTEVOQlJHSTdRVUZGVkVjc1RVRkJRVUVzVVVGQlVTeEZRVUZGTEU5QlFVOUlMRmRCUVZjc1EwRkJReXhEUVVGRUxFTkJRV3hDTEV0QlFUQkNMRmRCUVRGQ0xFZEJRWGRETEVOQlFYaERMRWRCUVRSRExFTkJRVU5CTEZkQlFWY3NRMEZCUXl4RFFVRkVMRU5CUm5wRU8wRkJSMVJKTEUxQlFVRkJMRkZCUVZFc1JVRkJSU3hEUVVGRFNpeFhRVUZYTEVOQlFVTXNRMEZCUkN4RFFVaGlPMEZCU1ZSTExFMUJRVUZCTEZGQlFWRXNSVUZCUlN4UFFVRlBUQ3hYUVVGWExFTkJRVU1zUTBGQlJDeERRVUZzUWl4TFFVRXdRaXhYUVVFeFFpeEhRVUYzUXl4RFFVRjRReXhIUVVFMFF5eERRVUZEUVN4WFFVRlhMRU5CUVVNc1EwRkJSQ3hEUVVwNlJEdEJRVXRVVFN4TlFVRkJRU3hMUVVGTExFVkJRVVVzUlVGTVJUdEJRVTFVUXl4TlFVRkJRU3hqUVVGakxFVkJRVVU3UVVGT1VDeExRVUZZTEVOQlRHMUNMRU5CWTI1Q08wRkJRMEU3UVVGRFFUczdRVUZEUVN4UlFVRkpUaXhKUVVGSkxFTkJRVU5GTEZGQlFVd3NTMEZCYTBJc1EwRkJkRUlzUlVGQmVVSTdRVUZEZGtKR0xFMUJRVUZCTEVsQlFVa3NRMEZCUTBNc1VVRkJUQ3hKUVVGcFFpeERRVUZxUWp0QlFVTkVPenRCUVVORUxGRkJRVWxFTEVsQlFVa3NRMEZCUTBrc1VVRkJUQ3hMUVVGclFpeERRVUYwUWl4RlFVRjVRanRCUVVOMlFrb3NUVUZCUVVFc1NVRkJTU3hEUVVGRFJ5eFJRVUZNTEVsQlFXbENMRU5CUVdwQ08wRkJRMFE3TzBGQlJVUXNVVUZCU1Vrc1VVRkJVU3hIUVVGSExFTkJRV1k3UVVGQlFTeFJRVU5KUXl4WFFVRlhMRWRCUVVjc1EwRkViRUk3TzBGQlJVRXNWMEZCVDJ4RExFTkJRVU1zUjBGQlIwd3NUMEZCVHl4RFFVRkRVeXhOUVVGdVFpeEZRVUV5UWtvc1EwRkJReXhGUVVFMVFpeEZRVUZuUXp0QlFVTTVRanRCUVVOQk8wRkJRMEVzVlVGQlNVd3NUMEZCVHl4RFFVRkRTeXhEUVVGRUxFTkJRVkFzUTBGQlYyMURMRTlCUVZnc1EwRkJiVUlzVFVGQmJrSXNUVUZCSzBJc1EwRkJMMElzU1VGRFRXNURMRU5CUVVNc1IwRkJSeXhEUVVGS0xFZEJRVkZNTEU5QlFVOHNRMEZCUTFNc1RVRkVkRUlzU1VGRlMxUXNUMEZCVHl4RFFVRkRTeXhEUVVGRExFZEJRVWNzUTBGQlRDeERRVUZRTEVOQlFXVnRReXhQUVVGbUxFTkJRWFZDTEUxQlFYWkNMRTFCUVcxRExFTkJSbmhETEVsQlIwdDRReXhQUVVGUExFTkJRVU5MTEVOQlFVTXNSMEZCUnl4RFFVRk1MRU5CUVZBc1EwRkJaVzFETEU5QlFXWXNRMEZCZFVJc1NVRkJka0lzVFVGQmFVTXNRMEZJTVVNc1JVRkhOa003UVVGRGVrTTdRVUZEU0RzN1FVRkRSQ3hWUVVGSlF5eFRRVUZUTEVkQlFVbDZReXhQUVVGUExFTkJRVU5MTEVOQlFVUXNRMEZCVUN4RFFVRlhTU3hOUVVGWUxFbEJRWEZDTEVOQlFYSkNMRWxCUVRCQ1NpeERRVUZETEVsQlFVdE1MRTlCUVU4c1EwRkJRMU1zVFVGQlVpeEhRVUZwUWl4RFFVRnNSQ3hIUVVGM1JDeEhRVUY0UkN4SFFVRTRSRlFzVDBGQlR5eERRVUZEU3l4RFFVRkVMRU5CUVZBc1EwRkJWeXhEUVVGWUxFTkJRVGxGT3p0QlFVVkJMRlZCUVVsdlF5eFRRVUZUTEV0QlFVc3NSMEZCWkN4SlFVRnhRa0VzVTBGQlV5eExRVUZMTEVkQlFXNURMRWxCUVRCRFFTeFRRVUZUTEV0QlFVc3NSMEZCZUVRc1NVRkJLMFJCTEZOQlFWTXNTMEZCU3l4SlFVRnFSaXhGUVVGMVJqdEJRVU55UmxZc1VVRkJRVUVzU1VGQlNTeERRVUZEU3l4TFFVRk1MRU5CUVZjMVFpeEpRVUZZTEVOQlFXZENVaXhQUVVGUExFTkJRVU5MTEVOQlFVUXNRMEZCZGtJN1FVRkRRVEJDTEZGQlFVRkJMRWxCUVVrc1EwRkJRMDBzWTBGQlRDeERRVUZ2UWpkQ0xFbEJRWEJDTEVOQlFYbENUaXhWUVVGVkxFTkJRVU5ITEVOQlFVUXNRMEZCVml4SlFVRnBRaXhKUVVFeFF6czdRVUZGUVN4WlFVRkpiME1zVTBGQlV5eExRVUZMTEVkQlFXeENMRVZCUVhWQ08wRkJRM0pDU0N4VlFVRkJRU3hSUVVGUk8wRkJRMVFzVTBGR1JDeE5RVVZQTEVsQlFVbEhMRk5CUVZNc1MwRkJTeXhIUVVGc1FpeEZRVUYxUWp0QlFVTTFRa1lzVlVGQlFVRXNWMEZCVnp0QlFVTmFMRk5CUmswc1RVRkZRU3hKUVVGSlJTeFRRVUZUTEV0QlFVc3NSMEZCYkVJc1JVRkJkVUk3UVVGRE5VSklMRlZCUVVGQkxGRkJRVkU3UVVGRFVrTXNWVUZCUVVFc1YwRkJWenRCUVVOYU8wRkJRMFlzVDBGYVJDeE5RVmxQTzBGQlEwdzdRVUZEUkR0QlFVTkdMRXRCY0VSclFpeERRWE5FYmtJN096dEJRVU5CTEZGQlFVa3NRMEZCUTBRc1VVRkJSQ3hKUVVGaFVDeEpRVUZKTEVOQlFVTkpMRkZCUVV3c1MwRkJhMElzUTBGQmJrTXNSVUZCYzBNN1FVRkRjRU5LTEUxQlFVRkJMRWxCUVVrc1EwRkJRMGtzVVVGQlRDeEhRVUZuUWl4RFFVRm9RanRCUVVORU96dEJRVU5FTEZGQlFVa3NRMEZCUTBrc1YwRkJSQ3hKUVVGblFsSXNTVUZCU1N4RFFVRkRSU3hSUVVGTUxFdEJRV3RDTEVOQlFYUkRMRVZCUVhsRE8wRkJRM1pEUml4TlFVRkJRU3hKUVVGSkxFTkJRVU5GTEZGQlFVd3NSMEZCWjBJc1EwRkJhRUk3UVVGRFJDeExRVFZFYTBJc1EwRTRSRzVDT3pzN1FVRkRRU3hSUVVGSmJFTXNUMEZCVHl4RFFVRkRhMElzVFVGQldpeEZRVUZ2UWp0QlFVTnNRaXhWUVVGSmNVSXNVVUZCVVN4TFFVRkxVQ3hKUVVGSkxFTkJRVU5KTEZGQlFYUkNMRVZCUVdkRE8wRkJRemxDTEdOQlFVMHNTVUZCU1dwQ0xFdEJRVW9zUTBGQlZTeHpSRUZCYzBSVkxHZENRVUZuUWl4SFFVRkhMRU5CUVhwRkxFTkJRVllzUTBGQlRqdEJRVU5FT3p0QlFVTkVMRlZCUVVsWExGZEJRVmNzUzBGQlMxSXNTVUZCU1N4RFFVRkRSU3hSUVVGNlFpeEZRVUZ0UXp0QlFVTnFReXhqUVVGTkxFbEJRVWxtTEV0QlFVb3NRMEZCVlN4M1JFRkJkMFJWTEdkQ1FVRm5RaXhIUVVGSExFTkJRVE5GTEVOQlFWWXNRMEZCVGp0QlFVTkVPMEZCUTBZN08wRkJSVVFzVjBGQlQwY3NTVUZCVUR0QlFVTkVPenRCUVVWRUxGTkJRVTh4UWl4RFFVRkRMRWRCUVVkTUxFOUJRVThzUTBGQlExTXNUVUZCYmtJc1JVRkJNa0k3UVVGRGVrSklMRWxCUVVGQkxGVkJRVlU3UVVGRFdEczdRVUZGUkN4VFFVRlBSaXhKUVVGUU8wRkJRMFFpTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lKbGVIQnZjblFnWm5WdVkzUnBiMjRnY0dGeWMyVlFZWFJqYUNoMWJtbEVhV1ptTENCdmNIUnBiMjV6SUQwZ2UzMHBJSHRjYmlBZ2JHVjBJR1JwWm1aemRISWdQU0IxYm1sRWFXWm1Mbk53YkdsMEtDOWNYSEpjWEc1OFcxeGNibHhjZGx4Y1pseGNjbHhjZURnMVhTOHBMRnh1SUNBZ0lDQWdaR1ZzYVcxcGRHVnljeUE5SUhWdWFVUnBabVl1YldGMFkyZ29MMXhjY2x4Y2JueGJYRnh1WEZ4MlhGeG1YRnh5WEZ4NE9EVmRMMmNwSUh4OElGdGRMRnh1SUNBZ0lDQWdiR2x6ZENBOUlGdGRMRnh1SUNBZ0lDQWdhU0E5SURBN1hHNWNiaUFnWm5WdVkzUnBiMjRnY0dGeWMyVkpibVJsZUNncElIdGNiaUFnSUNCc1pYUWdhVzVrWlhnZ1BTQjdmVHRjYmlBZ0lDQnNhWE4wTG5CMWMyZ29hVzVrWlhncE8xeHVYRzRnSUNBZ0x5OGdVR0Z5YzJVZ1pHbG1aaUJ0WlhSaFpHRjBZVnh1SUNBZ0lIZG9hV3hsSUNocElEd2daR2xtWm5OMGNpNXNaVzVuZEdncElIdGNiaUFnSUNBZ0lHeGxkQ0JzYVc1bElEMGdaR2xtWm5OMGNsdHBYVHRjYmx4dUlDQWdJQ0FnTHk4Z1JtbHNaU0JvWldGa1pYSWdabTkxYm1Rc0lHVnVaQ0J3WVhKemFXNW5JR1JwWm1ZZ2JXVjBZV1JoZEdGY2JpQWdJQ0FnSUdsbUlDZ29MMTRvWEZ3dFhGd3RYRnd0ZkZ4Y0sxeGNLMXhjSzN4QVFDbGNYSE12S1M1MFpYTjBLR3hwYm1VcEtTQjdYRzRnSUNBZ0lDQWdJR0p5WldGck8xeHVJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQXZMeUJFYVdabUlHbHVaR1Y0WEc0Z0lDQWdJQ0JzWlhRZ2FHVmhaR1Z5SUQwZ0tDOWVLRDg2U1c1a1pYZzZmR1JwWm1Zb1B6b2dMWElnWEZ4M0t5a3JLVnhjY3lzb0xpcy9LVnhjY3lva0x5a3VaWGhsWXloc2FXNWxLVHRjYmlBZ0lDQWdJR2xtSUNob1pXRmtaWElwSUh0Y2JpQWdJQ0FnSUNBZ2FXNWtaWGd1YVc1a1pYZ2dQU0JvWldGa1pYSmJNVjA3WEc0Z0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUdrckt6dGNiaUFnSUNCOVhHNWNiaUFnSUNBdkx5QlFZWEp6WlNCbWFXeGxJR2hsWVdSbGNuTWdhV1lnZEdobGVTQmhjbVVnWkdWbWFXNWxaQzRnVlc1cFptbGxaQ0JrYVdabUlISmxjWFZwY21WeklIUm9aVzBzSUdKMWRGeHVJQ0FnSUM4dklIUm9aWEpsSjNNZ2JtOGdkR1ZqYUc1cFkyRnNJR2x6YzNWbGN5QjBieUJvWVhabElHRnVJR2x6YjJ4aGRHVmtJR2gxYm1zZ2QybDBhRzkxZENCbWFXeGxJR2hsWVdSbGNseHVJQ0FnSUhCaGNuTmxSbWxzWlVobFlXUmxjaWhwYm1SbGVDazdYRzRnSUNBZ2NHRnljMlZHYVd4bFNHVmhaR1Z5S0dsdVpHVjRLVHRjYmx4dUlDQWdJQzh2SUZCaGNuTmxJR2gxYm10elhHNGdJQ0FnYVc1a1pYZ3VhSFZ1YTNNZ1BTQmJYVHRjYmx4dUlDQWdJSGRvYVd4bElDaHBJRHdnWkdsbVpuTjBjaTVzWlc1bmRHZ3BJSHRjYmlBZ0lDQWdJR3hsZENCc2FXNWxJRDBnWkdsbVpuTjBjbHRwWFR0Y2JseHVJQ0FnSUNBZ2FXWWdLQ2d2WGloSmJtUmxlRHA4WkdsbVpueGNYQzFjWEMxY1hDMThYRndyWEZ3clhGd3JLVnhjY3k4cExuUmxjM1FvYkdsdVpTa3BJSHRjYmlBZ0lDQWdJQ0FnWW5KbFlXczdYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2FXWWdLQ2d2WGtCQUx5a3VkR1Z6ZENoc2FXNWxLU2tnZTF4dUlDQWdJQ0FnSUNCcGJtUmxlQzVvZFc1cmN5NXdkWE5vS0hCaGNuTmxTSFZ1YXlncEtUdGNiaUFnSUNBZ0lIMGdaV3h6WlNCcFppQW9iR2x1WlNBbUppQnZjSFJwYjI1ekxuTjBjbWxqZENrZ2UxeHVJQ0FnSUNBZ0lDQXZMeUJKWjI1dmNtVWdkVzVsZUhCbFkzUmxaQ0JqYjI1MFpXNTBJSFZ1YkdWemN5QnBiaUJ6ZEhKcFkzUWdiVzlrWlZ4dUlDQWdJQ0FnSUNCMGFISnZkeUJ1WlhjZ1JYSnliM0lvSjFWdWEyNXZkMjRnYkdsdVpTQW5JQ3NnS0drZ0t5QXhLU0FySUNjZ0p5QXJJRXBUVDA0dWMzUnlhVzVuYVdaNUtHeHBibVVwS1R0Y2JpQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUdrckt6dGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNGdJSDFjYmx4dUlDQXZMeUJRWVhKelpYTWdkR2hsSUMwdExTQmhibVFnS3lzcklHaGxZV1JsY25Nc0lHbG1JRzV2Ym1VZ1lYSmxJR1p2ZFc1a0xDQnVieUJzYVc1bGMxeHVJQ0F2THlCaGNtVWdZMjl1YzNWdFpXUXVYRzRnSUdaMWJtTjBhVzl1SUhCaGNuTmxSbWxzWlVobFlXUmxjaWhwYm1SbGVDa2dlMXh1SUNBZ0lHTnZibk4wSUdacGJHVklaV0ZrWlhJZ1BTQW9MMTRvTFMwdGZGeGNLMXhjSzF4Y0t5bGNYSE1yS0M0cUtTUXZLUzVsZUdWaktHUnBabVp6ZEhKYmFWMHBPMXh1SUNBZ0lHbG1JQ2htYVd4bFNHVmhaR1Z5S1NCN1hHNGdJQ0FnSUNCc1pYUWdhMlY1VUhKbFptbDRJRDBnWm1sc1pVaGxZV1JsY2xzeFhTQTlQVDBnSnkwdExTY2dQeUFuYjJ4a0p5QTZJQ2R1Wlhjbk8xeHVJQ0FnSUNBZ1kyOXVjM1FnWkdGMFlTQTlJR1pwYkdWSVpXRmtaWEpiTWwwdWMzQnNhWFFvSjF4Y2RDY3NJRElwTzF4dUlDQWdJQ0FnYkdWMElHWnBiR1ZPWVcxbElEMGdaR0YwWVZzd1hTNXlaWEJzWVdObEtDOWNYRnhjWEZ4Y1hDOW5MQ0FuWEZ4Y1hDY3BPMXh1SUNBZ0lDQWdhV1lnS0Nndlhsd2lMaXBjSWlRdktTNTBaWE4wS0dacGJHVk9ZVzFsS1NrZ2UxeHVJQ0FnSUNBZ0lDQm1hV3hsVG1GdFpTQTlJR1pwYkdWT1lXMWxMbk4xWW5OMGNpZ3hMQ0JtYVd4bFRtRnRaUzVzWlc1bmRHZ2dMU0F5S1R0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0FnSUdsdVpHVjRXMnRsZVZCeVpXWnBlQ0FySUNkR2FXeGxUbUZ0WlNkZElEMGdabWxzWlU1aGJXVTdYRzRnSUNBZ0lDQnBibVJsZUZ0clpYbFFjbVZtYVhnZ0t5QW5TR1ZoWkdWeUoxMGdQU0FvWkdGMFlWc3hYU0I4ZkNBbkp5a3VkSEpwYlNncE8xeHVYRzRnSUNBZ0lDQnBLeXM3WEc0Z0lDQWdmVnh1SUNCOVhHNWNiaUFnTHk4Z1VHRnljMlZ6SUdFZ2FIVnVhMXh1SUNBdkx5QlVhR2x6SUdGemMzVnRaWE1nZEdoaGRDQjNaU0JoY21VZ1lYUWdkR2hsSUhOMFlYSjBJRzltSUdFZ2FIVnVheTVjYmlBZ1puVnVZM1JwYjI0Z2NHRnljMlZJZFc1cktDa2dlMXh1SUNBZ0lHeGxkQ0JqYUhWdWEwaGxZV1JsY2tsdVpHVjRJRDBnYVN4Y2JpQWdJQ0FnSUNBZ1kyaDFibXRJWldGa1pYSk1hVzVsSUQwZ1pHbG1abk4wY2x0cEt5dGRMRnh1SUNBZ0lDQWdJQ0JqYUhWdWEwaGxZV1JsY2lBOUlHTm9kVzVyU0dWaFpHVnlUR2x1WlM1emNHeHBkQ2d2UUVBZ0xTaGNYR1FyS1NnL09pd29YRnhrS3lrcFB5QmNYQ3NvWEZ4a0t5a29Qem9zS0Z4Y1pDc3BLVDhnUUVBdktUdGNibHh1SUNBZ0lHeGxkQ0JvZFc1cklEMGdlMXh1SUNBZ0lDQWdiMnhrVTNSaGNuUTZJQ3RqYUhWdWEwaGxZV1JsY2xzeFhTeGNiaUFnSUNBZ0lHOXNaRXhwYm1Wek9pQjBlWEJsYjJZZ1kyaDFibXRJWldGa1pYSmJNbDBnUFQwOUlDZDFibVJsWm1sdVpXUW5JRDhnTVNBNklDdGphSFZ1YTBobFlXUmxjbHN5WFN4Y2JpQWdJQ0FnSUc1bGQxTjBZWEowT2lBclkyaDFibXRJWldGa1pYSmJNMTBzWEc0Z0lDQWdJQ0J1WlhkTWFXNWxjem9nZEhsd1pXOW1JR05vZFc1clNHVmhaR1Z5V3pSZElEMDlQU0FuZFc1a1pXWnBibVZrSnlBL0lERWdPaUFyWTJoMWJtdElaV0ZrWlhKYk5GMHNYRzRnSUNBZ0lDQnNhVzVsY3pvZ1cxMHNYRzRnSUNBZ0lDQnNhVzVsWkdWc2FXMXBkR1Z5Y3pvZ1cxMWNiaUFnSUNCOU8xeHVYRzRnSUNBZ0x5OGdWVzVwWm1sbFpDQkVhV1ptSUVadmNtMWhkQ0J4ZFdseWF6b2dTV1lnZEdobElHTm9kVzVySUhOcGVtVWdhWE1nTUN4Y2JpQWdJQ0F2THlCMGFHVWdabWx5YzNRZ2JuVnRZbVZ5SUdseklHOXVaU0JzYjNkbGNpQjBhR0Z1SUc5dVpTQjNiM1ZzWkNCbGVIQmxZM1F1WEc0Z0lDQWdMeThnYUhSMGNITTZMeTkzZDNjdVlYSjBhVzFoTG1OdmJTOTNaV0pzYjJkekwzWnBaWGR3YjNOMExtcHpjRDkwYUhKbFlXUTlNVFkwTWprelhHNGdJQ0FnYVdZZ0tHaDFibXN1YjJ4a1RHbHVaWE1nUFQwOUlEQXBJSHRjYmlBZ0lDQWdJR2gxYm1zdWIyeGtVM1JoY25RZ0t6MGdNVHRjYmlBZ0lDQjlYRzRnSUNBZ2FXWWdLR2gxYm1zdWJtVjNUR2x1WlhNZ1BUMDlJREFwSUh0Y2JpQWdJQ0FnSUdoMWJtc3VibVYzVTNSaGNuUWdLejBnTVR0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0JzWlhRZ1lXUmtRMjkxYm5RZ1BTQXdMRnh1SUNBZ0lDQWdJQ0J5WlcxdmRtVkRiM1Z1ZENBOUlEQTdYRzRnSUNBZ1ptOXlJQ2c3SUdrZ1BDQmthV1ptYzNSeUxteGxibWQwYURzZ2FTc3JLU0I3WEc0Z0lDQWdJQ0F2THlCTWFXNWxjeUJ6ZEdGeWRHbHVaeUIzYVhSb0lDY3RMUzBuSUdOdmRXeGtJR0psSUcxcGMzUmhhMlZ1SUdadmNpQjBhR1VnWENKeVpXMXZkbVVnYkdsdVpWd2lJRzl3WlhKaGRHbHZibHh1SUNBZ0lDQWdMeThnUW5WMElIUm9aWGtnWTI5MWJHUWdZbVVnZEdobElHaGxZV1JsY2lCbWIzSWdkR2hsSUc1bGVIUWdabWxzWlM0Z1ZHaGxjbVZtYjNKbElIQnlkVzVsSUhOMVkyZ2dZMkZ6WlhNZ2IzVjBMbHh1SUNBZ0lDQWdhV1lnS0dScFptWnpkSEpiYVYwdWFXNWtaWGhQWmlnbkxTMHRJQ2NwSUQwOVBTQXdYRzRnSUNBZ0lDQWdJQ0FnSUNBbUppQW9hU0FySURJZ1BDQmthV1ptYzNSeUxteGxibWQwYUNsY2JpQWdJQ0FnSUNBZ0lDQWdJQ1ltSUdScFptWnpkSEpiYVNBcklERmRMbWx1WkdWNFQyWW9KeXNyS3lBbktTQTlQVDBnTUZ4dUlDQWdJQ0FnSUNBZ0lDQWdKaVlnWkdsbVpuTjBjbHRwSUNzZ01sMHVhVzVrWlhoUFppZ25RRUFuS1NBOVBUMGdNQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lHSnlaV0ZyTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJQ0FnYkdWMElHOXdaWEpoZEdsdmJpQTlJQ2hrYVdabWMzUnlXMmxkTG14bGJtZDBhQ0E5UFNBd0lDWW1JR2tnSVQwZ0tHUnBabVp6ZEhJdWJHVnVaM1JvSUMwZ01Ta3BJRDhnSnlBbklEb2daR2xtWm5OMGNsdHBYVnN3WFR0Y2JseHVJQ0FnSUNBZ2FXWWdLRzl3WlhKaGRHbHZiaUE5UFQwZ0p5c25JSHg4SUc5d1pYSmhkR2x2YmlBOVBUMGdKeTBuSUh4OElHOXdaWEpoZEdsdmJpQTlQVDBnSnlBbklIeDhJRzl3WlhKaGRHbHZiaUE5UFQwZ0oxeGNYRnduS1NCN1hHNGdJQ0FnSUNBZ0lHaDFibXN1YkdsdVpYTXVjSFZ6YUNoa2FXWm1jM1J5VzJsZEtUdGNiaUFnSUNBZ0lDQWdhSFZ1YXk1c2FXNWxaR1ZzYVcxcGRHVnljeTV3ZFhOb0tHUmxiR2x0YVhSbGNuTmJhVjBnZkh3Z0oxeGNiaWNwTzF4dVhHNGdJQ0FnSUNBZ0lHbG1JQ2h2Y0dWeVlYUnBiMjRnUFQwOUlDY3JKeWtnZTF4dUlDQWdJQ0FnSUNBZ0lHRmtaRU52ZFc1MEt5czdYRzRnSUNBZ0lDQWdJSDBnWld4elpTQnBaaUFvYjNCbGNtRjBhVzl1SUQwOVBTQW5MU2NwSUh0Y2JpQWdJQ0FnSUNBZ0lDQnlaVzF2ZG1WRGIzVnVkQ3NyTzF4dUlDQWdJQ0FnSUNCOUlHVnNjMlVnYVdZZ0tHOXdaWEpoZEdsdmJpQTlQVDBnSnlBbktTQjdYRzRnSUNBZ0lDQWdJQ0FnWVdSa1EyOTFiblFyS3p0Y2JpQWdJQ0FnSUNBZ0lDQnlaVzF2ZG1WRGIzVnVkQ3NyTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNCaWNtVmhhenRjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlYRzVjYmlBZ0lDQXZMeUJJWVc1a2JHVWdkR2hsSUdWdGNIUjVJR0pzYjJOcklHTnZkVzUwSUdOaGMyVmNiaUFnSUNCcFppQW9JV0ZrWkVOdmRXNTBJQ1ltSUdoMWJtc3VibVYzVEdsdVpYTWdQVDA5SURFcElIdGNiaUFnSUNBZ0lHaDFibXN1Ym1WM1RHbHVaWE1nUFNBd08xeHVJQ0FnSUgxY2JpQWdJQ0JwWmlBb0lYSmxiVzkyWlVOdmRXNTBJQ1ltSUdoMWJtc3ViMnhrVEdsdVpYTWdQVDA5SURFcElIdGNiaUFnSUNBZ0lHaDFibXN1YjJ4a1RHbHVaWE1nUFNBd08xeHVJQ0FnSUgxY2JseHVJQ0FnSUM4dklGQmxjbVp2Y20wZ2IzQjBhVzl1WVd3Z2MyRnVhWFI1SUdOb1pXTnJhVzVuWEc0Z0lDQWdhV1lnS0c5d2RHbHZibk11YzNSeWFXTjBLU0I3WEc0Z0lDQWdJQ0JwWmlBb1lXUmtRMjkxYm5RZ0lUMDlJR2gxYm1zdWJtVjNUR2x1WlhNcElIdGNiaUFnSUNBZ0lDQWdkR2h5YjNjZ2JtVjNJRVZ5Y205eUtDZEJaR1JsWkNCc2FXNWxJR052ZFc1MElHUnBaQ0J1YjNRZ2JXRjBZMmdnWm05eUlHaDFibXNnWVhRZ2JHbHVaU0FuSUNzZ0tHTm9kVzVyU0dWaFpHVnlTVzVrWlhnZ0t5QXhLU2s3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdJQ0JwWmlBb2NtVnRiM1psUTI5MWJuUWdJVDA5SUdoMWJtc3ViMnhrVEdsdVpYTXBJSHRjYmlBZ0lDQWdJQ0FnZEdoeWIzY2dibVYzSUVWeWNtOXlLQ2RTWlcxdmRtVmtJR3hwYm1VZ1kyOTFiblFnWkdsa0lHNXZkQ0J0WVhSamFDQm1iM0lnYUhWdWF5QmhkQ0JzYVc1bElDY2dLeUFvWTJoMWJtdElaV0ZrWlhKSmJtUmxlQ0FySURFcEtUdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNWNiaUFnSUNCeVpYUjFjbTRnYUhWdWF6dGNiaUFnZlZ4dVhHNGdJSGRvYVd4bElDaHBJRHdnWkdsbVpuTjBjaTVzWlc1bmRHZ3BJSHRjYmlBZ0lDQndZWEp6WlVsdVpHVjRLQ2s3WEc0Z0lIMWNibHh1SUNCeVpYUjFjbTRnYkdsemREdGNibjFjYmlKZGZRPT1cbiIsICIvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5cInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7XG5cbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4vLyBJdGVyYXRvciB0aGF0IHRyYXZlcnNlcyBpbiB0aGUgcmFuZ2Ugb2YgW21pbiwgbWF4XSwgc3RlcHBpbmdcbi8vIGJ5IGRpc3RhbmNlIGZyb20gYSBnaXZlbiBzdGFydCBwb3NpdGlvbi4gSS5lLiBmb3IgWzAsIDRdLCB3aXRoXG4vLyBzdGFydCBvZiAyLCB0aGlzIHdpbGwgaXRlcmF0ZSAyLCAzLCAxLCA0LCAwLlxuZnVuY3Rpb25cbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl9kZWZhdWx0XG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuKHN0YXJ0LCBtaW5MaW5lLCBtYXhMaW5lKSB7XG4gIHZhciB3YW50Rm9yd2FyZCA9IHRydWUsXG4gICAgICBiYWNrd2FyZEV4aGF1c3RlZCA9IGZhbHNlLFxuICAgICAgZm9yd2FyZEV4aGF1c3RlZCA9IGZhbHNlLFxuICAgICAgbG9jYWxPZmZzZXQgPSAxO1xuICByZXR1cm4gZnVuY3Rpb24gaXRlcmF0b3IoKSB7XG4gICAgaWYgKHdhbnRGb3J3YXJkICYmICFmb3J3YXJkRXhoYXVzdGVkKSB7XG4gICAgICBpZiAoYmFja3dhcmRFeGhhdXN0ZWQpIHtcbiAgICAgICAgbG9jYWxPZmZzZXQrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdhbnRGb3J3YXJkID0gZmFsc2U7XG4gICAgICB9IC8vIENoZWNrIGlmIHRyeWluZyB0byBmaXQgYmV5b25kIHRleHQgbGVuZ3RoLCBhbmQgaWYgbm90LCBjaGVjayBpdCBmaXRzXG4gICAgICAvLyBhZnRlciBvZmZzZXQgbG9jYXRpb24gKG9yIGRlc2lyZWQgbG9jYXRpb24gb24gZmlyc3QgaXRlcmF0aW9uKVxuXG5cbiAgICAgIGlmIChzdGFydCArIGxvY2FsT2Zmc2V0IDw9IG1heExpbmUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsT2Zmc2V0O1xuICAgICAgfVxuXG4gICAgICBmb3J3YXJkRXhoYXVzdGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIWJhY2t3YXJkRXhoYXVzdGVkKSB7XG4gICAgICBpZiAoIWZvcndhcmRFeGhhdXN0ZWQpIHtcbiAgICAgICAgd2FudEZvcndhcmQgPSB0cnVlO1xuICAgICAgfSAvLyBDaGVjayBpZiB0cnlpbmcgdG8gZml0IGJlZm9yZSB0ZXh0IGJlZ2lubmluZywgYW5kIGlmIG5vdCwgY2hlY2sgaXQgZml0c1xuICAgICAgLy8gYmVmb3JlIG9mZnNldCBsb2NhdGlvblxuXG5cbiAgICAgIGlmIChtaW5MaW5lIDw9IHN0YXJ0IC0gbG9jYWxPZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIC1sb2NhbE9mZnNldCsrO1xuICAgICAgfVxuXG4gICAgICBiYWNrd2FyZEV4aGF1c3RlZCA9IHRydWU7XG4gICAgICByZXR1cm4gaXRlcmF0b3IoKTtcbiAgICB9IC8vIFdlIHRyaWVkIHRvIGZpdCBodW5rIGJlZm9yZSB0ZXh0IGJlZ2lubmluZyBhbmQgYmV5b25kIHRleHQgbGVuZ3RoLCB0aGVuXG4gICAgLy8gaHVuayBjYW4ndCBmaXQgb24gdGhlIHRleHQuIFJldHVybiB1bmRlZmluZWRcblxuICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMM055WXk5MWRHbHNMMlJwYzNSaGJtTmxMV2wwWlhKaGRHOXlMbXB6SWwwc0ltNWhiV1Z6SWpwYkluTjBZWEowSWl3aWJXbHVUR2x1WlNJc0ltMWhlRXhwYm1VaUxDSjNZVzUwUm05eWQyRnlaQ0lzSW1KaFkydDNZWEprUlhob1lYVnpkR1ZrSWl3aVptOXlkMkZ5WkVWNGFHRjFjM1JsWkNJc0lteHZZMkZzVDJabWMyVjBJaXdpYVhSbGNtRjBiM0lpWFN3aWJXRndjR2x1WjNNaU9pSTdPenM3T3pzN096dEJRVUZCTzBGQlEwRTdRVUZEUVR0QlFVTmxPMEZCUVVFN1FVRkJRVHRCUVVGQk8wRkJRVUVzUTBGQlUwRXNTMEZCVkN4RlFVRm5Ra01zVDBGQmFFSXNSVUZCZVVKRExFOUJRWHBDTEVWQlFXdERPMEZCUXk5RExFMUJRVWxETEZkQlFWY3NSMEZCUnl4SlFVRnNRanRCUVVGQkxFMUJRMGxETEdsQ1FVRnBRaXhIUVVGSExFdEJSSGhDTzBGQlFVRXNUVUZGU1VNc1owSkJRV2RDTEVkQlFVY3NTMEZHZGtJN1FVRkJRU3hOUVVkSlF5eFhRVUZYTEVkQlFVY3NRMEZJYkVJN1FVRkxRU3hUUVVGUExGTkJRVk5ETEZGQlFWUXNSMEZCYjBJN1FVRkRla0lzVVVGQlNVb3NWMEZCVnl4SlFVRkpMRU5CUVVORkxHZENRVUZ3UWl4RlFVRnpRenRCUVVOd1F5eFZRVUZKUkN4cFFrRkJTaXhGUVVGMVFqdEJRVU55UWtVc1VVRkJRVUVzVjBGQlZ6dEJRVU5hTEU5QlJrUXNUVUZGVHp0QlFVTk1TQ3hSUVVGQlFTeFhRVUZYTEVkQlFVY3NTMEZCWkR0QlFVTkVMRTlCVEcxRExFTkJUM0JETzBGQlEwRTdPenRCUVVOQkxGVkJRVWxJTEV0QlFVc3NSMEZCUjAwc1YwRkJVaXhKUVVGMVFrb3NUMEZCTTBJc1JVRkJiME03UVVGRGJFTXNaVUZCVDBrc1YwRkJVRHRCUVVORU96dEJRVVZFUkN4TlFVRkJRU3huUWtGQlowSXNSMEZCUnl4SlFVRnVRanRCUVVORU96dEJRVVZFTEZGQlFVa3NRMEZCUTBRc2FVSkJRVXdzUlVGQmQwSTdRVUZEZEVJc1ZVRkJTU3hEUVVGRFF5eG5Ra0ZCVEN4RlFVRjFRanRCUVVOeVFrWXNVVUZCUVVFc1YwRkJWeXhIUVVGSExFbEJRV1E3UVVGRFJDeFBRVWh4UWl4RFFVdDBRanRCUVVOQk96czdRVUZEUVN4VlFVRkpSaXhQUVVGUExFbEJRVWxFTEV0QlFVc3NSMEZCUjAwc1YwRkJka0lzUlVGQmIwTTdRVUZEYkVNc1pVRkJUeXhEUVVGRFFTeFhRVUZYTEVWQlFXNUNPMEZCUTBRN08wRkJSVVJHTEUxQlFVRkJMR2xDUVVGcFFpeEhRVUZITEVsQlFYQkNPMEZCUTBFc1lVRkJUMGNzVVVGQlVTeEZRVUZtTzBGQlEwUXNTMEU1UW5kQ0xFTkJaME42UWp0QlFVTkJPenRCUVVORUxFZEJiRU5FTzBGQmJVTkVJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpTHk4Z1NYUmxjbUYwYjNJZ2RHaGhkQ0IwY21GMlpYSnpaWE1nYVc0Z2RHaGxJSEpoYm1kbElHOW1JRnR0YVc0c0lHMWhlRjBzSUhOMFpYQndhVzVuWEc0dkx5QmllU0JrYVhOMFlXNWpaU0JtY205dElHRWdaMmwyWlc0Z2MzUmhjblFnY0c5emFYUnBiMjR1SUVrdVpTNGdabTl5SUZzd0xDQTBYU3dnZDJsMGFGeHVMeThnYzNSaGNuUWdiMllnTWl3Z2RHaHBjeUIzYVd4c0lHbDBaWEpoZEdVZ01pd2dNeXdnTVN3Z05Dd2dNQzVjYm1WNGNHOXlkQ0JrWldaaGRXeDBJR1oxYm1OMGFXOXVLSE4wWVhKMExDQnRhVzVNYVc1bExDQnRZWGhNYVc1bEtTQjdYRzRnSUd4bGRDQjNZVzUwUm05eWQyRnlaQ0E5SUhSeWRXVXNYRzRnSUNBZ0lDQmlZV05yZDJGeVpFVjRhR0YxYzNSbFpDQTlJR1poYkhObExGeHVJQ0FnSUNBZ1ptOXlkMkZ5WkVWNGFHRjFjM1JsWkNBOUlHWmhiSE5sTEZ4dUlDQWdJQ0FnYkc5allXeFBabVp6WlhRZ1BTQXhPMXh1WEc0Z0lISmxkSFZ5YmlCbWRXNWpkR2x2YmlCcGRHVnlZWFJ2Y2lncElIdGNiaUFnSUNCcFppQW9kMkZ1ZEVadmNuZGhjbVFnSmlZZ0lXWnZjbmRoY21SRmVHaGhkWE4wWldRcElIdGNiaUFnSUNBZ0lHbG1JQ2hpWVdOcmQyRnlaRVY0YUdGMWMzUmxaQ2tnZTF4dUlDQWdJQ0FnSUNCc2IyTmhiRTltWm5ObGRDc3JPMXh1SUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdkMkZ1ZEVadmNuZGhjbVFnUFNCbVlXeHpaVHRjYmlBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnTHk4Z1EyaGxZMnNnYVdZZ2RISjVhVzVuSUhSdklHWnBkQ0JpWlhsdmJtUWdkR1Y0ZENCc1pXNW5kR2dzSUdGdVpDQnBaaUJ1YjNRc0lHTm9aV05ySUdsMElHWnBkSE5jYmlBZ0lDQWdJQzh2SUdGbWRHVnlJRzltWm5ObGRDQnNiMk5oZEdsdmJpQW9iM0lnWkdWemFYSmxaQ0JzYjJOaGRHbHZiaUJ2YmlCbWFYSnpkQ0JwZEdWeVlYUnBiMjRwWEc0Z0lDQWdJQ0JwWmlBb2MzUmhjblFnS3lCc2IyTmhiRTltWm5ObGRDQThQU0J0WVhoTWFXNWxLU0I3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJzYjJOaGJFOW1abk5sZER0Y2JpQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ1ptOXlkMkZ5WkVWNGFHRjFjM1JsWkNBOUlIUnlkV1U3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdhV1lnS0NGaVlXTnJkMkZ5WkVWNGFHRjFjM1JsWkNrZ2UxeHVJQ0FnSUNBZ2FXWWdLQ0ZtYjNKM1lYSmtSWGhvWVhWemRHVmtLU0I3WEc0Z0lDQWdJQ0FnSUhkaGJuUkdiM0ozWVhKa0lEMGdkSEoxWlR0Y2JpQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0x5OGdRMmhsWTJzZ2FXWWdkSEo1YVc1bklIUnZJR1pwZENCaVpXWnZjbVVnZEdWNGRDQmlaV2RwYm01cGJtY3NJR0Z1WkNCcFppQnViM1FzSUdOb1pXTnJJR2wwSUdacGRITmNiaUFnSUNBZ0lDOHZJR0psWm05eVpTQnZabVp6WlhRZ2JHOWpZWFJwYjI1Y2JpQWdJQ0FnSUdsbUlDaHRhVzVNYVc1bElEdzlJSE4wWVhKMElDMGdiRzlqWVd4UFptWnpaWFFwSUh0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUMxc2IyTmhiRTltWm5ObGRDc3JPMXh1SUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0JpWVdOcmQyRnlaRVY0YUdGMWMzUmxaQ0E5SUhSeWRXVTdYRzRnSUNBZ0lDQnlaWFIxY200Z2FYUmxjbUYwYjNJb0tUdGNiaUFnSUNCOVhHNWNiaUFnSUNBdkx5QlhaU0IwY21sbFpDQjBieUJtYVhRZ2FIVnVheUJpWldadmNtVWdkR1Y0ZENCaVpXZHBibTVwYm1jZ1lXNWtJR0psZVc5dVpDQjBaWGgwSUd4bGJtZDBhQ3dnZEdobGJseHVJQ0FnSUM4dklHaDFibXNnWTJGdUozUWdabWwwSUc5dUlIUm9aU0IwWlhoMExpQlNaWFIxY200Z2RXNWtaV1pwYm1Wa1hHNGdJSDA3WEc1OVhHNGlYWDA9XG4iLCAiLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmFwcGx5UGF0Y2ggPSBhcHBseVBhdGNoO1xuZXhwb3J0cy5hcHBseVBhdGNoZXMgPSBhcHBseVBhdGNoZXM7XG5cbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG52YXJcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl9wYXJzZSA9IHJlcXVpcmUoXCIuL3BhcnNlXCIpXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuO1xuXG52YXJcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl9kaXN0YW5jZUl0ZXJhdG9yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vdXRpbC9kaXN0YW5jZS1pdGVyYXRvclwiKSlcbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG47XG5cbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8gZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG5mdW5jdGlvbiBhcHBseVBhdGNoKHNvdXJjZSwgdW5pRGlmZikge1xuICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gIHZhclxuICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcblxuICBpZiAodHlwZW9mIHVuaURpZmYgPT09ICdzdHJpbmcnKSB7XG4gICAgdW5pRGlmZiA9XG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgICgwLFxuICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG5cbiAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICAgX3BhcnNlXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgICAuXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgIHBhcnNlUGF0Y2gpXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgICAodW5pRGlmZik7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh1bmlEaWZmKSkge1xuICAgIGlmICh1bmlEaWZmLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYXBwbHlQYXRjaCBvbmx5IHdvcmtzIHdpdGggYSBzaW5nbGUgaW5wdXQuJyk7XG4gICAgfVxuXG4gICAgdW5pRGlmZiA9IHVuaURpZmZbMF07XG4gIH0gLy8gQXBwbHkgdGhlIGRpZmYgdG8gdGhlIGlucHV0XG5cblxuICB2YXIgbGluZXMgPSBzb3VyY2Uuc3BsaXQoL1xcclxcbnxbXFxuXFx2XFxmXFxyXFx4ODVdLyksXG4gICAgICBkZWxpbWl0ZXJzID0gc291cmNlLm1hdGNoKC9cXHJcXG58W1xcblxcdlxcZlxcclxceDg1XS9nKSB8fCBbXSxcbiAgICAgIGh1bmtzID0gdW5pRGlmZi5odW5rcyxcbiAgICAgIGNvbXBhcmVMaW5lID0gb3B0aW9ucy5jb21wYXJlTGluZSB8fCBmdW5jdGlvbiAobGluZU51bWJlciwgbGluZSwgb3BlcmF0aW9uLCBwYXRjaENvbnRlbnQpXG4gIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAge1xuICAgIHJldHVybiAoXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgICAgbGluZSA9PT0gcGF0Y2hDb250ZW50XG4gICAgKTtcbiAgfSxcbiAgICAgIGVycm9yQ291bnQgPSAwLFxuICAgICAgZnV6ekZhY3RvciA9IG9wdGlvbnMuZnV6ekZhY3RvciB8fCAwLFxuICAgICAgbWluTGluZSA9IDAsXG4gICAgICBvZmZzZXQgPSAwLFxuICAgICAgcmVtb3ZlRU9GTkwsXG4gICAgICBhZGRFT0ZOTDtcbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgaHVuayBleGFjdGx5IGZpdHMgb24gdGhlIHByb3ZpZGVkIGxvY2F0aW9uXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gaHVua0ZpdHMoaHVuaywgdG9Qb3MpIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGh1bmsubGluZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBsaW5lID0gaHVuay5saW5lc1tqXSxcbiAgICAgICAgICBvcGVyYXRpb24gPSBsaW5lLmxlbmd0aCA+IDAgPyBsaW5lWzBdIDogJyAnLFxuICAgICAgICAgIGNvbnRlbnQgPSBsaW5lLmxlbmd0aCA+IDAgPyBsaW5lLnN1YnN0cigxKSA6IGxpbmU7XG5cbiAgICAgIGlmIChvcGVyYXRpb24gPT09ICcgJyB8fCBvcGVyYXRpb24gPT09ICctJykge1xuICAgICAgICAvLyBDb250ZXh0IHNhbml0eSBjaGVja1xuICAgICAgICBpZiAoIWNvbXBhcmVMaW5lKHRvUG9zICsgMSwgbGluZXNbdG9Qb3NdLCBvcGVyYXRpb24sIGNvbnRlbnQpKSB7XG4gICAgICAgICAgZXJyb3JDb3VudCsrO1xuXG4gICAgICAgICAgaWYgKGVycm9yQ291bnQgPiBmdXp6RmFjdG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdG9Qb3MrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyBTZWFyY2ggYmVzdCBmaXQgb2Zmc2V0cyBmb3IgZWFjaCBodW5rIGJhc2VkIG9uIHRoZSBwcmV2aW91cyBvbmVzXG5cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGh1bmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGh1bmsgPSBodW5rc1tpXSxcbiAgICAgICAgbWF4TGluZSA9IGxpbmVzLmxlbmd0aCAtIGh1bmsub2xkTGluZXMsXG4gICAgICAgIGxvY2FsT2Zmc2V0ID0gMCxcbiAgICAgICAgdG9Qb3MgPSBvZmZzZXQgKyBodW5rLm9sZFN0YXJ0IC0gMTtcbiAgICB2YXIgaXRlcmF0b3IgPVxuICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICAoMCxcbiAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgIF9kaXN0YW5jZUl0ZXJhdG9yXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgICBbXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgIFwiZGVmYXVsdFwiXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgICBdKSh0b1BvcywgbWluTGluZSwgbWF4TGluZSk7XG5cbiAgICBmb3IgKDsgbG9jYWxPZmZzZXQgIT09IHVuZGVmaW5lZDsgbG9jYWxPZmZzZXQgPSBpdGVyYXRvcigpKSB7XG4gICAgICBpZiAoaHVua0ZpdHMoaHVuaywgdG9Qb3MgKyBsb2NhbE9mZnNldCkpIHtcbiAgICAgICAgaHVuay5vZmZzZXQgPSBvZmZzZXQgKz0gbG9jYWxPZmZzZXQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChsb2NhbE9mZnNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBTZXQgbG93ZXIgdGV4dCBsaW1pdCB0byBlbmQgb2YgdGhlIGN1cnJlbnQgaHVuaywgc28gbmV4dCBvbmVzIGRvbid0IHRyeVxuICAgIC8vIHRvIGZpdCBvdmVyIGFscmVhZHkgcGF0Y2hlZCB0ZXh0XG5cblxuICAgIG1pbkxpbmUgPSBodW5rLm9mZnNldCArIGh1bmsub2xkU3RhcnQgKyBodW5rLm9sZExpbmVzO1xuICB9IC8vIEFwcGx5IHBhdGNoIGh1bmtzXG5cblxuICB2YXIgZGlmZk9mZnNldCA9IDA7XG5cbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGh1bmtzLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBfaHVuayA9IGh1bmtzW19pXSxcbiAgICAgICAgX3RvUG9zID0gX2h1bmsub2xkU3RhcnQgKyBfaHVuay5vZmZzZXQgKyBkaWZmT2Zmc2V0IC0gMTtcblxuICAgIGRpZmZPZmZzZXQgKz0gX2h1bmsubmV3TGluZXMgLSBfaHVuay5vbGRMaW5lcztcblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgX2h1bmsubGluZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBsaW5lID0gX2h1bmsubGluZXNbal0sXG4gICAgICAgICAgb3BlcmF0aW9uID0gbGluZS5sZW5ndGggPiAwID8gbGluZVswXSA6ICcgJyxcbiAgICAgICAgICBjb250ZW50ID0gbGluZS5sZW5ndGggPiAwID8gbGluZS5zdWJzdHIoMSkgOiBsaW5lLFxuICAgICAgICAgIGRlbGltaXRlciA9IF9odW5rLmxpbmVkZWxpbWl0ZXJzICYmIF9odW5rLmxpbmVkZWxpbWl0ZXJzW2pdIHx8ICdcXG4nO1xuXG4gICAgICBpZiAob3BlcmF0aW9uID09PSAnICcpIHtcbiAgICAgICAgX3RvUG9zKys7XG4gICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJy0nKSB7XG4gICAgICAgIGxpbmVzLnNwbGljZShfdG9Qb3MsIDEpO1xuICAgICAgICBkZWxpbWl0ZXJzLnNwbGljZShfdG9Qb3MsIDEpO1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT09ICcrJykge1xuICAgICAgICBsaW5lcy5zcGxpY2UoX3RvUG9zLCAwLCBjb250ZW50KTtcbiAgICAgICAgZGVsaW1pdGVycy5zcGxpY2UoX3RvUG9zLCAwLCBkZWxpbWl0ZXIpO1xuICAgICAgICBfdG9Qb3MrKztcbiAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uID09PSAnXFxcXCcpIHtcbiAgICAgICAgdmFyIHByZXZpb3VzT3BlcmF0aW9uID0gX2h1bmsubGluZXNbaiAtIDFdID8gX2h1bmsubGluZXNbaiAtIDFdWzBdIDogbnVsbDtcblxuICAgICAgICBpZiAocHJldmlvdXNPcGVyYXRpb24gPT09ICcrJykge1xuICAgICAgICAgIHJlbW92ZUVPRk5MID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChwcmV2aW91c09wZXJhdGlvbiA9PT0gJy0nKSB7XG4gICAgICAgICAgYWRkRU9GTkwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IC8vIEhhbmRsZSBFT0ZOTCBpbnNlcnRpb24vcmVtb3ZhbFxuXG5cbiAgaWYgKHJlbW92ZUVPRk5MKSB7XG4gICAgd2hpbGUgKCFsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSkge1xuICAgICAgbGluZXMucG9wKCk7XG4gICAgICBkZWxpbWl0ZXJzLnBvcCgpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChhZGRFT0ZOTCkge1xuICAgIGxpbmVzLnB1c2goJycpO1xuICAgIGRlbGltaXRlcnMucHVzaCgnXFxuJyk7XG4gIH1cblxuICBmb3IgKHZhciBfayA9IDA7IF9rIDwgbGluZXMubGVuZ3RoIC0gMTsgX2srKykge1xuICAgIGxpbmVzW19rXSA9IGxpbmVzW19rXSArIGRlbGltaXRlcnNbX2tdO1xuICB9XG5cbiAgcmV0dXJuIGxpbmVzLmpvaW4oJycpO1xufSAvLyBXcmFwcGVyIHRoYXQgc3VwcG9ydHMgbXVsdGlwbGUgZmlsZSBwYXRjaGVzIHZpYSBjYWxsYmFja3MuXG5cblxuZnVuY3Rpb24gYXBwbHlQYXRjaGVzKHVuaURpZmYsIG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiB1bmlEaWZmID09PSAnc3RyaW5nJykge1xuICAgIHVuaURpZmYgPVxuICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICAoMCxcbiAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgIF9wYXJzZVxuICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gICAgLlxuICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICBwYXJzZVBhdGNoKVxuICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gICAgKHVuaURpZmYpO1xuICB9XG5cbiAgdmFyIGN1cnJlbnRJbmRleCA9IDA7XG5cbiAgZnVuY3Rpb24gcHJvY2Vzc0luZGV4KCkge1xuICAgIHZhciBpbmRleCA9IHVuaURpZmZbY3VycmVudEluZGV4KytdO1xuXG4gICAgaWYgKCFpbmRleCkge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBvcHRpb25zLmxvYWRGaWxlKGluZGV4LCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLmNvbXBsZXRlKGVycik7XG4gICAgICB9XG5cbiAgICAgIHZhciB1cGRhdGVkQ29udGVudCA9IGFwcGx5UGF0Y2goZGF0YSwgaW5kZXgsIG9wdGlvbnMpO1xuICAgICAgb3B0aW9ucy5wYXRjaGVkKGluZGV4LCB1cGRhdGVkQ29udGVudCwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGxldGUoZXJyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByb2Nlc3NJbmRleCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcm9jZXNzSW5kZXgoKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OXdZWFJqYUM5aGNIQnNlUzVxY3lKZExDSnVZVzFsY3lJNld5SmhjSEJzZVZCaGRHTm9JaXdpYzI5MWNtTmxJaXdpZFc1cFJHbG1aaUlzSW05d2RHbHZibk1pTENKd1lYSnpaVkJoZEdOb0lpd2lRWEp5WVhraUxDSnBjMEZ5Y21GNUlpd2liR1Z1WjNSb0lpd2lSWEp5YjNJaUxDSnNhVzVsY3lJc0luTndiR2wwSWl3aVpHVnNhVzFwZEdWeWN5SXNJbTFoZEdOb0lpd2lhSFZ1YTNNaUxDSmpiMjF3WVhKbFRHbHVaU0lzSW14cGJtVk9kVzFpWlhJaUxDSnNhVzVsSWl3aWIzQmxjbUYwYVc5dUlpd2ljR0YwWTJoRGIyNTBaVzUwSWl3aVpYSnliM0pEYjNWdWRDSXNJbVoxZW5wR1lXTjBiM0lpTENKdGFXNU1hVzVsSWl3aWIyWm1jMlYwSWl3aWNtVnRiM1psUlU5R1Rrd2lMQ0poWkdSRlQwWk9UQ0lzSW1oMWJtdEdhWFJ6SWl3aWFIVnVheUlzSW5SdlVHOXpJaXdpYWlJc0ltTnZiblJsYm5RaUxDSnpkV0p6ZEhJaUxDSnBJaXdpYldGNFRHbHVaU0lzSW05c1pFeHBibVZ6SWl3aWJHOWpZV3hQWm1aelpYUWlMQ0p2YkdSVGRHRnlkQ0lzSW1sMFpYSmhkRzl5SWl3aVpHbHpkR0Z1WTJWSmRHVnlZWFJ2Y2lJc0luVnVaR1ZtYVc1bFpDSXNJbVJwWm1aUFptWnpaWFFpTENKdVpYZE1hVzVsY3lJc0ltUmxiR2x0YVhSbGNpSXNJbXhwYm1Wa1pXeHBiV2wwWlhKeklpd2ljM0JzYVdObElpd2ljSEpsZG1sdmRYTlBjR1Z5WVhScGIyNGlMQ0p3YjNBaUxDSndkWE5vSWl3aVgyc2lMQ0pxYjJsdUlpd2lZWEJ3YkhsUVlYUmphR1Z6SWl3aVkzVnljbVZ1ZEVsdVpHVjRJaXdpY0hKdlkyVnpjMGx1WkdWNElpd2lhVzVrWlhnaUxDSmpiMjF3YkdWMFpTSXNJbXh2WVdSR2FXeGxJaXdpWlhKeUlpd2laR0YwWVNJc0luVndaR0YwWldSRGIyNTBaVzUwSWl3aWNHRjBZMmhsWkNKZExDSnRZWEJ3YVc1bmN5STZJanM3T3pzN096czdPenRCUVVGQk8wRkJRVUU3UVVGQlFUdEJRVUZCTzBGQlFVRTdPMEZCUTBFN1FVRkJRVHRCUVVGQk8wRkJRVUU3UVVGQlFUczdPenM3UVVGRlR5eFRRVUZUUVN4VlFVRlVMRU5CUVc5Q1F5eE5RVUZ3UWl4RlFVRTBRa01zVDBGQk5VSXNSVUZCYlVRN1FVRkJRVHRCUVVGQk8wRkJRVUU3UVVGQlpFTXNSVUZCUVVFc1QwRkJZeXgxUlVGQlNpeEZRVUZKT3p0QlFVTjRSQ3hOUVVGSkxFOUJRVTlFTEU5QlFWQXNTMEZCYlVJc1VVRkJka0lzUlVGQmFVTTdRVUZETDBKQkxFbEJRVUZCTEU5QlFVODdRVUZCUnp0QlFVRkJPMEZCUVVFN08wRkJRVUZGTzBGQlFVRkJPMEZCUVVGQk8wRkJRVUZCTzBGQlFVRkJPMEZCUVVGQk8wRkJRVUU3UVVGQlFTeExRVUZYUml4UFFVRllMRU5CUVZZN1FVRkRSRHM3UVVGRlJDeE5RVUZKUnl4TFFVRkxMRU5CUVVORExFOUJRVTRzUTBGQlkwb3NUMEZCWkN4RFFVRktMRVZCUVRSQ08wRkJRekZDTEZGQlFVbEJMRTlCUVU4c1EwRkJRMHNzVFVGQlVpeEhRVUZwUWl4RFFVRnlRaXhGUVVGM1FqdEJRVU4wUWl4WlFVRk5MRWxCUVVsRExFdEJRVW9zUTBGQlZTdzBRMEZCVml4RFFVRk9PMEZCUTBRN08wRkJSVVJPTEVsQlFVRkJMRTlCUVU4c1IwRkJSMEVzVDBGQlR5eERRVUZETEVOQlFVUXNRMEZCYWtJN1FVRkRSQ3hIUVZoMVJDeERRV0Y0UkRzN08wRkJRMEVzVFVGQlNVOHNTMEZCU3l4SFFVRkhVaXhOUVVGTkxFTkJRVU5UTEV0QlFWQXNRMEZCWVN4eFFrRkJZaXhEUVVGYU8wRkJRVUVzVFVGRFNVTXNWVUZCVlN4SFFVRkhWaXhOUVVGTkxFTkJRVU5YTEV0QlFWQXNRMEZCWVN4elFrRkJZaXhMUVVGM1F5eEZRVVI2UkR0QlFVRkJMRTFCUlVsRExFdEJRVXNzUjBGQlIxZ3NUMEZCVHl4RFFVRkRWeXhMUVVad1FqdEJRVUZCTEUxQlNVbERMRmRCUVZjc1IwRkJSMWdzVDBGQlR5eERRVUZEVnl4WFFVRlNMRWxCUVhkQ0xGVkJRVU5ETEZWQlFVUXNSVUZCWVVNc1NVRkJZaXhGUVVGdFFrTXNVMEZCYmtJc1JVRkJPRUpETEZsQlFUbENPMEZCUVVFN1FVRkJRVHRCUVVGQk8wRkJRVUU3UVVGQkswTkdMRTFCUVVGQkxFbEJRVWtzUzBGQlMwVTdRVUZCZUVRN1FVRkJRU3hIUVVveFF6dEJRVUZCTEUxQlMwbERMRlZCUVZVc1IwRkJSeXhEUVV4cVFqdEJRVUZCTEUxQlRVbERMRlZCUVZVc1IwRkJSMnBDTEU5QlFVOHNRMEZCUTJsQ0xGVkJRVklzU1VGQmMwSXNRMEZPZGtNN1FVRkJRU3hOUVU5SlF5eFBRVUZQTEVkQlFVY3NRMEZRWkR0QlFVRkJMRTFCVVVsRExFMUJRVTBzUjBGQlJ5eERRVkppTzBGQlFVRXNUVUZWU1VNc1YwRldTanRCUVVGQkxFMUJWMGxETEZGQldFbzdRVUZoUVRzN096czdRVUZIUVN4WFFVRlRReXhSUVVGVUxFTkJRV3RDUXl4SlFVRnNRaXhGUVVGM1FrTXNTMEZCZUVJc1JVRkJLMEk3UVVGRE4wSXNVMEZCU3l4SlFVRkpReXhEUVVGRExFZEJRVWNzUTBGQllpeEZRVUZuUWtFc1EwRkJReXhIUVVGSFJpeEpRVUZKTEVOQlFVTnFRaXhMUVVGTUxFTkJRVmRHTEUxQlFTOUNMRVZCUVhWRGNVSXNRMEZCUXl4RlFVRjRReXhGUVVFMFF6dEJRVU14UXl4VlFVRkpXaXhKUVVGSkxFZEJRVWRWTEVsQlFVa3NRMEZCUTJwQ0xFdEJRVXdzUTBGQlYyMUNMRU5CUVZnc1EwRkJXRHRCUVVGQkxGVkJRMGxZTEZOQlFWTXNSMEZCU1VRc1NVRkJTU3hEUVVGRFZDeE5RVUZNTEVkQlFXTXNRMEZCWkN4SFFVRnJRbE1zU1VGQlNTeERRVUZETEVOQlFVUXNRMEZCZEVJc1IwRkJORUlzUjBGRU4wTTdRVUZCUVN4VlFVVkpZU3hQUVVGUExFZEJRVWxpTEVsQlFVa3NRMEZCUTFRc1RVRkJUQ3hIUVVGakxFTkJRV1FzUjBGQmEwSlRMRWxCUVVrc1EwRkJRMk1zVFVGQlRDeERRVUZaTEVOQlFWb3NRMEZCYkVJc1IwRkJiVU5rTEVsQlJteEVPenRCUVVsQkxGVkJRVWxETEZOQlFWTXNTMEZCU3l4SFFVRmtMRWxCUVhGQ1FTeFRRVUZUTEV0QlFVc3NSMEZCZGtNc1JVRkJORU03UVVGRE1VTTdRVUZEUVN4WlFVRkpMRU5CUVVOSUxGZEJRVmNzUTBGQlEyRXNTMEZCU3l4SFFVRkhMRU5CUVZRc1JVRkJXV3hDTEV0QlFVc3NRMEZCUTJ0Q0xFdEJRVVFzUTBGQmFrSXNSVUZCTUVKV0xGTkJRVEZDTEVWQlFYRkRXU3hQUVVGeVF5eERRVUZvUWl4RlFVRXJSRHRCUVVNM1JGWXNWVUZCUVVFc1ZVRkJWVHM3UVVGRlZpeGpRVUZKUVN4VlFVRlZMRWRCUVVkRExGVkJRV3BDTEVWQlFUWkNPMEZCUXpOQ0xHMUNRVUZQTEV0QlFWQTdRVUZEUkR0QlFVTkdPenRCUVVORVR5eFJRVUZCUVN4TFFVRkxPMEZCUTA0N1FVRkRSanM3UVVGRlJDeFhRVUZQTEVsQlFWQTdRVUZEUkN4SFFXeEVkVVFzUTBGdlJIaEVPenM3UVVGRFFTeFBRVUZMTEVsQlFVbEpMRU5CUVVNc1IwRkJSeXhEUVVGaUxFVkJRV2RDUVN4RFFVRkRMRWRCUVVkc1FpeExRVUZMTEVOQlFVTk9MRTFCUVRGQ0xFVkJRV3REZDBJc1EwRkJReXhGUVVGdVF5eEZRVUYxUXp0QlFVTnlReXhSUVVGSlRDeEpRVUZKTEVkQlFVZGlMRXRCUVVzc1EwRkJRMnRDTEVOQlFVUXNRMEZCYUVJN1FVRkJRU3hSUVVOSlF5eFBRVUZQTEVkQlFVZDJRaXhMUVVGTExFTkJRVU5HTEUxQlFVNHNSMEZCWlcxQ0xFbEJRVWtzUTBGQlEwOHNVVUZFYkVNN1FVRkJRU3hSUVVWSlF5eFhRVUZYTEVkQlFVY3NRMEZHYkVJN1FVRkJRU3hSUVVkSlVDeExRVUZMTEVkQlFVZE1MRTFCUVUwc1IwRkJSMGtzU1VGQlNTeERRVUZEVXl4UlFVRmtMRWRCUVhsQ0xFTkJTSEpETzBGQlMwRXNVVUZCU1VNc1VVRkJVVHRCUVVGSE8wRkJRVUU3UVVGQlFUczdRVUZCUVVNN1FVRkJRVUU3UVVGQlFVRTdRVUZCUVVFN1FVRkJRVUU3UVVGQlFVRTdRVUZCUVVFN1FVRkJRVUVzVDBGQmFVSldMRXRCUVdwQ0xFVkJRWGRDVGl4UFFVRjRRaXhGUVVGcFExY3NUMEZCYWtNc1EwRkJaanM3UVVGRlFTeFhRVUZQUlN4WFFVRlhMRXRCUVV0SkxGTkJRWFpDTEVWQlFXdERTaXhYUVVGWExFZEJRVWRGTEZGQlFWRXNSVUZCZUVRc1JVRkJORVE3UVVGRE1VUXNWVUZCU1Znc1VVRkJVU3hEUVVGRFF5eEpRVUZFTEVWQlFVOURMRXRCUVVzc1IwRkJSMDhzVjBGQlppeERRVUZhTEVWQlFYbERPMEZCUTNaRFVpeFJRVUZCUVN4SlFVRkpMRU5CUVVOS0xFMUJRVXdzUjBGQlkwRXNUVUZCVFN4SlFVRkpXU3hYUVVGNFFqdEJRVU5CTzBGQlEwUTdRVUZEUmpzN1FVRkZSQ3hSUVVGSlFTeFhRVUZYTEV0QlFVdEpMRk5CUVhCQ0xFVkJRU3RDTzBGQlF6ZENMR0ZCUVU4c1MwRkJVRHRCUVVORUxFdEJha0p2UXl4RFFXMUNja003UVVGRFFUczdPMEZCUTBGcVFpeEpRVUZCUVN4UFFVRlBMRWRCUVVkTExFbEJRVWtzUTBGQlEwb3NUVUZCVEN4SFFVRmpTU3hKUVVGSkxFTkJRVU5UTEZGQlFXNUNMRWRCUVRoQ1ZDeEpRVUZKTEVOQlFVTlBMRkZCUVRkRE8wRkJRMFFzUjBFelJYVkVMRU5CTmtWNFJEczdPMEZCUTBFc1RVRkJTVTBzVlVGQlZTeEhRVUZITEVOQlFXcENPenRCUVVOQkxFOUJRVXNzU1VGQlNWSXNSVUZCUXl4SFFVRkhMRU5CUVdJc1JVRkJaMEpCTEVWQlFVTXNSMEZCUjJ4Q0xFdEJRVXNzUTBGQlEwNHNUVUZCTVVJc1JVRkJhME4zUWl4RlFVRkRMRVZCUVc1RExFVkJRWFZETzBGQlEzSkRMRkZCUVVsTUxFdEJRVWtzUjBGQlIySXNTMEZCU3l4RFFVRkRhMElzUlVGQlJDeERRVUZvUWp0QlFVRkJMRkZCUTBsS0xFMUJRVXNzUjBGQlIwUXNTMEZCU1N4RFFVRkRVeXhSUVVGTUxFZEJRV2RDVkN4TFFVRkpMRU5CUVVOS0xFMUJRWEpDTEVkQlFUaENhVUlzVlVGQk9VSXNSMEZCTWtNc1EwRkVka1E3TzBGQlJVRkJMRWxCUVVGQkxGVkJRVlVzU1VGQlNXSXNTMEZCU1N4RFFVRkRZeXhSUVVGTUxFZEJRV2RDWkN4TFFVRkpMRU5CUVVOUExGRkJRVzVET3p0QlFVVkJMRk5CUVVzc1NVRkJTVXdzUTBGQlF5eEhRVUZITEVOQlFXSXNSVUZCWjBKQkxFTkJRVU1zUjBGQlIwWXNTMEZCU1N4RFFVRkRha0lzUzBGQlRDeERRVUZYUml4TlFVRXZRaXhGUVVGMVEzRkNMRU5CUVVNc1JVRkJlRU1zUlVGQk5FTTdRVUZETVVNc1ZVRkJTVm9zU1VGQlNTeEhRVUZIVlN4TFFVRkpMRU5CUVVOcVFpeExRVUZNTEVOQlFWZHRRaXhEUVVGWUxFTkJRVmc3UVVGQlFTeFZRVU5KV0N4VFFVRlRMRWRCUVVsRUxFbEJRVWtzUTBGQlExUXNUVUZCVEN4SFFVRmpMRU5CUVdRc1IwRkJhMEpUTEVsQlFVa3NRMEZCUXl4RFFVRkVMRU5CUVhSQ0xFZEJRVFJDTEVkQlJEZERPMEZCUVVFc1ZVRkZTV0VzVDBGQlR5eEhRVUZKWWl4SlFVRkpMRU5CUVVOVUxFMUJRVXdzUjBGQll5eERRVUZrTEVkQlFXdENVeXhKUVVGSkxFTkJRVU5qTEUxQlFVd3NRMEZCV1N4RFFVRmFMRU5CUVd4Q0xFZEJRVzFEWkN4SlFVWnNSRHRCUVVGQkxGVkJSMGw1UWl4VFFVRlRMRWRCUVVkbUxFdEJRVWtzUTBGQlEyZENMR05CUVV3c1NVRkJkVUpvUWl4TFFVRkpMRU5CUVVOblFpeGpRVUZNTEVOQlFXOUNaQ3hEUVVGd1FpeERRVUYyUWl4SlFVRnBSQ3hKUVVocVJUczdRVUZMUVN4VlFVRkpXQ3hUUVVGVExFdEJRVXNzUjBGQmJFSXNSVUZCZFVJN1FVRkRja0pWTEZGQlFVRkJMRTFCUVVzN1FVRkRUaXhQUVVaRUxFMUJSVThzU1VGQlNWWXNVMEZCVXl4TFFVRkxMRWRCUVd4Q0xFVkJRWFZDTzBGQlF6VkNVaXhSUVVGQlFTeExRVUZMTEVOQlFVTnJReXhOUVVGT0xFTkJRV0ZvUWl4TlFVRmlMRVZCUVc5Q0xFTkJRWEJDTzBGQlEwRm9RaXhSUVVGQlFTeFZRVUZWTEVOQlFVTm5ReXhOUVVGWUxFTkJRV3RDYUVJc1RVRkJiRUlzUlVGQmVVSXNRMEZCZWtJN1FVRkRSanRCUVVORExFOUJTazBzVFVGSlFTeEpRVUZKVml4VFFVRlRMRXRCUVVzc1IwRkJiRUlzUlVGQmRVSTdRVUZETlVKU0xGRkJRVUZCTEV0QlFVc3NRMEZCUTJ0RExFMUJRVTRzUTBGQllXaENMRTFCUVdJc1JVRkJiMElzUTBGQmNFSXNSVUZCZFVKRkxFOUJRWFpDTzBGQlEwRnNRaXhSUVVGQlFTeFZRVUZWTEVOQlFVTm5ReXhOUVVGWUxFTkJRV3RDYUVJc1RVRkJiRUlzUlVGQmVVSXNRMEZCZWtJc1JVRkJORUpqTEZOQlFUVkNPMEZCUTBGa0xGRkJRVUZCTEUxQlFVczdRVUZEVGl4UFFVcE5MRTFCU1VFc1NVRkJTVllzVTBGQlV5eExRVUZMTEVsQlFXeENMRVZCUVhkQ08wRkJRemRDTEZsQlFVa3lRaXhwUWtGQmFVSXNSMEZCUjJ4Q0xFdEJRVWtzUTBGQlEycENMRXRCUVV3c1EwRkJWMjFDTEVOQlFVTXNSMEZCUnl4RFFVRm1MRWxCUVc5Q1JpeExRVUZKTEVOQlFVTnFRaXhMUVVGTUxFTkJRVmR0UWl4RFFVRkRMRWRCUVVjc1EwRkJaaXhGUVVGclFpeERRVUZzUWl4RFFVRndRaXhIUVVFeVF5eEpRVUZ1UlRzN1FVRkRRU3haUVVGSlowSXNhVUpCUVdsQ0xFdEJRVXNzUjBGQk1VSXNSVUZCSzBJN1FVRkROMEp5UWl4VlFVRkJRU3hYUVVGWExFZEJRVWNzU1VGQlpEdEJRVU5FTEZOQlJrUXNUVUZGVHl4SlFVRkpjVUlzYVVKQlFXbENMRXRCUVVzc1IwRkJNVUlzUlVGQkswSTdRVUZEY0VOd1FpeFZRVUZCUVN4UlFVRlJMRWRCUVVjc1NVRkJXRHRCUVVORU8wRkJRMFk3UVVGRFJqdEJRVU5HTEVkQk4wZDFSQ3hEUVN0SGVFUTdPenRCUVVOQkxFMUJRVWxFTEZkQlFVb3NSVUZCYVVJN1FVRkRaaXhYUVVGUExFTkJRVU5rTEV0QlFVc3NRMEZCUTBFc1MwRkJTeXhEUVVGRFJpeE5RVUZPTEVkQlFXVXNRMEZCYUVJc1EwRkJZaXhGUVVGcFF6dEJRVU12UWtVc1RVRkJRVUVzUzBGQlN5eERRVUZEYjBNc1IwRkJUanRCUVVOQmJFTXNUVUZCUVVFc1ZVRkJWU3hEUVVGRGEwTXNSMEZCV0R0QlFVTkVPMEZCUTBZc1IwRk1SQ3hOUVV0UExFbEJRVWx5UWl4UlFVRktMRVZCUVdNN1FVRkRia0ptTEVsQlFVRkJMRXRCUVVzc1EwRkJRM0ZETEVsQlFVNHNRMEZCVnl4RlFVRllPMEZCUTBGdVF5eEpRVUZCUVN4VlFVRlZMRU5CUVVOdFF5eEpRVUZZTEVOQlFXZENMRWxCUVdoQ08wRkJRMFE3TzBGQlEwUXNUMEZCU3l4SlFVRkpReXhGUVVGRkxFZEJRVWNzUTBGQlpDeEZRVUZwUWtFc1JVRkJSU3hIUVVGSGRFTXNTMEZCU3l4RFFVRkRSaXhOUVVGT0xFZEJRV1VzUTBGQmNrTXNSVUZCZDBOM1F5eEZRVUZGTEVWQlFURkRMRVZCUVRoRE8wRkJRelZEZEVNc1NVRkJRVUVzUzBGQlN5eERRVUZEYzBNc1JVRkJSQ3hEUVVGTUxFZEJRVmwwUXl4TFFVRkxMRU5CUVVOelF5eEZRVUZFTEVOQlFVd3NSMEZCV1hCRExGVkJRVlVzUTBGQlEyOURMRVZCUVVRc1EwRkJiRU03UVVGRFJEczdRVUZEUkN4VFFVRlBkRU1zUzBGQlN5eERRVUZEZFVNc1NVRkJUaXhEUVVGWExFVkJRVmdzUTBGQlVEdEJRVU5FTEVNc1EwRkZSRHM3TzBGQlEwOHNVMEZCVTBNc1dVRkJWQ3hEUVVGelFpOURMRTlCUVhSQ0xFVkJRU3RDUXl4UFFVRXZRaXhGUVVGM1F6dEJRVU0zUXl4TlFVRkpMRTlCUVU5RUxFOUJRVkFzUzBGQmJVSXNVVUZCZGtJc1JVRkJhVU03UVVGREwwSkJMRWxCUVVGQkxFOUJRVTg3UVVGQlJ6dEJRVUZCTzBGQlFVRTdPMEZCUVVGRk8wRkJRVUZCTzBGQlFVRkJPMEZCUVVGQk8wRkJRVUZCTzBGQlFVRkJPMEZCUVVFN1FVRkJRU3hMUVVGWFJpeFBRVUZZTEVOQlFWWTdRVUZEUkRzN1FVRkZSQ3hOUVVGSlowUXNXVUZCV1N4SFFVRkhMRU5CUVc1Q096dEJRVU5CTEZkQlFWTkRMRmxCUVZRc1IwRkJkMEk3UVVGRGRFSXNVVUZCU1VNc1MwRkJTeXhIUVVGSGJFUXNUMEZCVHl4RFFVRkRaMFFzV1VGQldTeEZRVUZpTEVOQlFXNUNPenRCUVVOQkxGRkJRVWtzUTBGQlEwVXNTMEZCVEN4RlFVRlpPMEZCUTFZc1lVRkJUMnBFTEU5QlFVOHNRMEZCUTJ0RUxGRkJRVklzUlVGQlVEdEJRVU5FT3p0QlFVVkViRVFzU1VGQlFVRXNUMEZCVHl4RFFVRkRiVVFzVVVGQlVpeERRVUZwUWtZc1MwRkJha0lzUlVGQmQwSXNWVUZCVTBjc1IwRkJWQ3hGUVVGalF5eEpRVUZrTEVWQlFXOUNPMEZCUXpGRExGVkJRVWxFTEVkQlFVb3NSVUZCVXp0QlFVTlFMR1ZCUVU5d1JDeFBRVUZQTEVOQlFVTnJSQ3hSUVVGU0xFTkJRV2xDUlN4SFFVRnFRaXhEUVVGUU8wRkJRMFE3TzBGQlJVUXNWVUZCU1VVc1kwRkJZeXhIUVVGSGVrUXNWVUZCVlN4RFFVRkRkMFFzU1VGQlJDeEZRVUZQU2l4TFFVRlFMRVZCUVdOcVJDeFBRVUZrTEVOQlFTOUNPMEZCUTBGQkxFMUJRVUZCTEU5QlFVOHNRMEZCUTNWRUxFOUJRVklzUTBGQlowSk9MRXRCUVdoQ0xFVkJRWFZDU3l4alFVRjJRaXhGUVVGMVF5eFZRVUZUUml4SFFVRlVMRVZCUVdNN1FVRkRia1FzV1VGQlNVRXNSMEZCU2l4RlFVRlRPMEZCUTFBc2FVSkJRVTl3UkN4UFFVRlBMRU5CUVVOclJDeFJRVUZTTEVOQlFXbENSU3hIUVVGcVFpeERRVUZRTzBGQlEwUTdPMEZCUlVSS0xGRkJRVUZCTEZsQlFWazdRVUZEWWl4UFFVNUVPMEZCVDBRc1MwRmlSRHRCUVdORU96dEJRVU5FUVN4RlFVRkJRU3haUVVGWk8wRkJRMklpTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lKcGJYQnZjblFnZTNCaGNuTmxVR0YwWTJoOUlHWnliMjBnSnk0dmNHRnljMlVuTzF4dWFXMXdiM0owSUdScGMzUmhibU5sU1hSbGNtRjBiM0lnWm5KdmJTQW5MaTR2ZFhScGJDOWthWE4wWVc1alpTMXBkR1Z5WVhSdmNpYzdYRzVjYm1WNGNHOXlkQ0JtZFc1amRHbHZiaUJoY0hCc2VWQmhkR05vS0hOdmRYSmpaU3dnZFc1cFJHbG1aaXdnYjNCMGFXOXVjeUE5SUh0OUtTQjdYRzRnSUdsbUlDaDBlWEJsYjJZZ2RXNXBSR2xtWmlBOVBUMGdKM04wY21sdVp5Y3BJSHRjYmlBZ0lDQjFibWxFYVdabUlEMGdjR0Z5YzJWUVlYUmphQ2gxYm1sRWFXWm1LVHRjYmlBZ2ZWeHVYRzRnSUdsbUlDaEJjbkpoZVM1cGMwRnljbUY1S0hWdWFVUnBabVlwS1NCN1hHNGdJQ0FnYVdZZ0tIVnVhVVJwWm1ZdWJHVnVaM1JvSUQ0Z01Ta2dlMXh1SUNBZ0lDQWdkR2h5YjNjZ2JtVjNJRVZ5Y205eUtDZGhjSEJzZVZCaGRHTm9JRzl1YkhrZ2QyOXlhM01nZDJsMGFDQmhJSE5wYm1kc1pTQnBibkIxZEM0bktUdGNiaUFnSUNCOVhHNWNiaUFnSUNCMWJtbEVhV1ptSUQwZ2RXNXBSR2xtWmxzd1hUdGNiaUFnZlZ4dVhHNGdJQzh2SUVGd2NHeDVJSFJvWlNCa2FXWm1JSFJ2SUhSb1pTQnBibkIxZEZ4dUlDQnNaWFFnYkdsdVpYTWdQU0J6YjNWeVkyVXVjM0JzYVhRb0wxeGNjbHhjYm54YlhGeHVYRngyWEZ4bVhGeHlYRng0T0RWZEx5a3NYRzRnSUNBZ0lDQmtaV3hwYldsMFpYSnpJRDBnYzI5MWNtTmxMbTFoZEdOb0tDOWNYSEpjWEc1OFcxeGNibHhjZGx4Y1pseGNjbHhjZURnMVhTOW5LU0I4ZkNCYlhTeGNiaUFnSUNBZ0lHaDFibXR6SUQwZ2RXNXBSR2xtWmk1b2RXNXJjeXhjYmx4dUlDQWdJQ0FnWTI5dGNHRnlaVXhwYm1VZ1BTQnZjSFJwYjI1ekxtTnZiWEJoY21WTWFXNWxJSHg4SUNnb2JHbHVaVTUxYldKbGNpd2diR2x1WlN3Z2IzQmxjbUYwYVc5dUxDQndZWFJqYUVOdmJuUmxiblFwSUQwK0lHeHBibVVnUFQwOUlIQmhkR05vUTI5dWRHVnVkQ2tzWEc0Z0lDQWdJQ0JsY25KdmNrTnZkVzUwSUQwZ01DeGNiaUFnSUNBZ0lHWjFlbnBHWVdOMGIzSWdQU0J2Y0hScGIyNXpMbVoxZW5wR1lXTjBiM0lnZkh3Z01DeGNiaUFnSUNBZ0lHMXBia3hwYm1VZ1BTQXdMRnh1SUNBZ0lDQWdiMlptYzJWMElEMGdNQ3hjYmx4dUlDQWdJQ0FnY21WdGIzWmxSVTlHVGt3c1hHNGdJQ0FnSUNCaFpHUkZUMFpPVER0Y2JseHVJQ0F2S2lwY2JpQWdJQ29nUTJobFkydHpJR2xtSUhSb1pTQm9kVzVySUdWNFlXTjBiSGtnWm1sMGN5QnZiaUIwYUdVZ2NISnZkbWxrWldRZ2JHOWpZWFJwYjI1Y2JpQWdJQ292WEc0Z0lHWjFibU4wYVc5dUlHaDFibXRHYVhSektHaDFibXNzSUhSdlVHOXpLU0I3WEc0Z0lDQWdabTl5SUNoc1pYUWdhaUE5SURBN0lHb2dQQ0JvZFc1ckxteHBibVZ6TG14bGJtZDBhRHNnYWlzcktTQjdYRzRnSUNBZ0lDQnNaWFFnYkdsdVpTQTlJR2gxYm1zdWJHbHVaWE5iYWwwc1hHNGdJQ0FnSUNBZ0lDQWdiM0JsY21GMGFXOXVJRDBnS0d4cGJtVXViR1Z1WjNSb0lENGdNQ0EvSUd4cGJtVmJNRjBnT2lBbklDY3BMRnh1SUNBZ0lDQWdJQ0FnSUdOdmJuUmxiblFnUFNBb2JHbHVaUzVzWlc1bmRHZ2dQaUF3SUQ4Z2JHbHVaUzV6ZFdKemRISW9NU2tnT2lCc2FXNWxLVHRjYmx4dUlDQWdJQ0FnYVdZZ0tHOXdaWEpoZEdsdmJpQTlQVDBnSnlBbklIeDhJRzl3WlhKaGRHbHZiaUE5UFQwZ0p5MG5LU0I3WEc0Z0lDQWdJQ0FnSUM4dklFTnZiblJsZUhRZ2MyRnVhWFI1SUdOb1pXTnJYRzRnSUNBZ0lDQWdJR2xtSUNnaFkyOXRjR0Z5WlV4cGJtVW9kRzlRYjNNZ0t5QXhMQ0JzYVc1bGMxdDBiMUJ2YzEwc0lHOXdaWEpoZEdsdmJpd2dZMjl1ZEdWdWRDa3BJSHRjYmlBZ0lDQWdJQ0FnSUNCbGNuSnZja052ZFc1MEt5czdYRzVjYmlBZ0lDQWdJQ0FnSUNCcFppQW9aWEp5YjNKRGIzVnVkQ0ErSUdaMWVucEdZV04wYjNJcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJtWVd4elpUdGNiaUFnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ2RHOVFiM01yS3p0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc1Y2JpQWdJQ0J5WlhSMWNtNGdkSEoxWlR0Y2JpQWdmVnh1WEc0Z0lDOHZJRk5sWVhKamFDQmlaWE4wSUdacGRDQnZabVp6WlhSeklHWnZjaUJsWVdOb0lHaDFibXNnWW1GelpXUWdiMjRnZEdobElIQnlaWFpwYjNWeklHOXVaWE5jYmlBZ1ptOXlJQ2hzWlhRZ2FTQTlJREE3SUdrZ1BDQm9kVzVyY3k1c1pXNW5kR2c3SUdrckt5a2dlMXh1SUNBZ0lHeGxkQ0JvZFc1cklEMGdhSFZ1YTNOYmFWMHNYRzRnSUNBZ0lDQWdJRzFoZUV4cGJtVWdQU0JzYVc1bGN5NXNaVzVuZEdnZ0xTQm9kVzVyTG05c1pFeHBibVZ6TEZ4dUlDQWdJQ0FnSUNCc2IyTmhiRTltWm5ObGRDQTlJREFzWEc0Z0lDQWdJQ0FnSUhSdlVHOXpJRDBnYjJabWMyVjBJQ3NnYUhWdWF5NXZiR1JUZEdGeWRDQXRJREU3WEc1Y2JpQWdJQ0JzWlhRZ2FYUmxjbUYwYjNJZ1BTQmthWE4wWVc1alpVbDBaWEpoZEc5eUtIUnZVRzl6TENCdGFXNU1hVzVsTENCdFlYaE1hVzVsS1R0Y2JseHVJQ0FnSUdadmNpQW9PeUJzYjJOaGJFOW1abk5sZENBaFBUMGdkVzVrWldacGJtVmtPeUJzYjJOaGJFOW1abk5sZENBOUlHbDBaWEpoZEc5eUtDa3BJSHRjYmlBZ0lDQWdJR2xtSUNob2RXNXJSbWwwY3lob2RXNXJMQ0IwYjFCdmN5QXJJR3h2WTJGc1QyWm1jMlYwS1NrZ2UxeHVJQ0FnSUNBZ0lDQm9kVzVyTG05bVpuTmxkQ0E5SUc5bVpuTmxkQ0FyUFNCc2IyTmhiRTltWm5ObGREdGNiaUFnSUNBZ0lDQWdZbkpsWVdzN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dVhHNGdJQ0FnYVdZZ0tHeHZZMkZzVDJabWMyVjBJRDA5UFNCMWJtUmxabWx1WldRcElIdGNiaUFnSUNBZ0lISmxkSFZ5YmlCbVlXeHpaVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQXZMeUJUWlhRZ2JHOTNaWElnZEdWNGRDQnNhVzFwZENCMGJ5QmxibVFnYjJZZ2RHaGxJR04xY25KbGJuUWdhSFZ1YXl3Z2MyOGdibVY0ZENCdmJtVnpJR1J2YmlkMElIUnllVnh1SUNBZ0lDOHZJSFJ2SUdacGRDQnZkbVZ5SUdGc2NtVmhaSGtnY0dGMFkyaGxaQ0IwWlhoMFhHNGdJQ0FnYldsdVRHbHVaU0E5SUdoMWJtc3ViMlptYzJWMElDc2dhSFZ1YXk1dmJHUlRkR0Z5ZENBcklHaDFibXN1YjJ4a1RHbHVaWE03WEc0Z0lIMWNibHh1SUNBdkx5QkJjSEJzZVNCd1lYUmphQ0JvZFc1cmMxeHVJQ0JzWlhRZ1pHbG1aazltWm5ObGRDQTlJREE3WEc0Z0lHWnZjaUFvYkdWMElHa2dQU0F3T3lCcElEd2dhSFZ1YTNNdWJHVnVaM1JvT3lCcEt5c3BJSHRjYmlBZ0lDQnNaWFFnYUhWdWF5QTlJR2gxYm10elcybGRMRnh1SUNBZ0lDQWdJQ0IwYjFCdmN5QTlJR2gxYm1zdWIyeGtVM1JoY25RZ0t5Qm9kVzVyTG05bVpuTmxkQ0FySUdScFptWlBabVp6WlhRZ0xTQXhPMXh1SUNBZ0lHUnBabVpQWm1aelpYUWdLejBnYUhWdWF5NXVaWGRNYVc1bGN5QXRJR2gxYm1zdWIyeGtUR2x1WlhNN1hHNWNiaUFnSUNCbWIzSWdLR3hsZENCcUlEMGdNRHNnYWlBOElHaDFibXN1YkdsdVpYTXViR1Z1WjNSb095QnFLeXNwSUh0Y2JpQWdJQ0FnSUd4bGRDQnNhVzVsSUQwZ2FIVnVheTVzYVc1bGMxdHFYU3hjYmlBZ0lDQWdJQ0FnSUNCdmNHVnlZWFJwYjI0Z1BTQW9iR2x1WlM1c1pXNW5kR2dnUGlBd0lEOGdiR2x1WlZzd1hTQTZJQ2NnSnlrc1hHNGdJQ0FnSUNBZ0lDQWdZMjl1ZEdWdWRDQTlJQ2hzYVc1bExteGxibWQwYUNBK0lEQWdQeUJzYVc1bExuTjFZbk4wY2lneEtTQTZJR3hwYm1VcExGeHVJQ0FnSUNBZ0lDQWdJR1JsYkdsdGFYUmxjaUE5SUdoMWJtc3ViR2x1WldSbGJHbHRhWFJsY25NZ0ppWWdhSFZ1YXk1c2FXNWxaR1ZzYVcxcGRHVnljMXRxWFNCOGZDQW5YRnh1Snp0Y2JseHVJQ0FnSUNBZ2FXWWdLRzl3WlhKaGRHbHZiaUE5UFQwZ0p5QW5LU0I3WEc0Z0lDQWdJQ0FnSUhSdlVHOXpLeXM3WEc0Z0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0c5d1pYSmhkR2x2YmlBOVBUMGdKeTBuS1NCN1hHNGdJQ0FnSUNBZ0lHeHBibVZ6TG5Od2JHbGpaU2gwYjFCdmN5d2dNU2s3WEc0Z0lDQWdJQ0FnSUdSbGJHbHRhWFJsY25NdWMzQnNhV05sS0hSdlVHOXpMQ0F4S1R0Y2JpQWdJQ0FnSUM4cUlHbHpkR0Z1WW5Wc0lHbG5ibTl5WlNCbGJITmxJQ292WEc0Z0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0c5d1pYSmhkR2x2YmlBOVBUMGdKeXNuS1NCN1hHNGdJQ0FnSUNBZ0lHeHBibVZ6TG5Od2JHbGpaU2gwYjFCdmN5d2dNQ3dnWTI5dWRHVnVkQ2s3WEc0Z0lDQWdJQ0FnSUdSbGJHbHRhWFJsY25NdWMzQnNhV05sS0hSdlVHOXpMQ0F3TENCa1pXeHBiV2wwWlhJcE8xeHVJQ0FnSUNBZ0lDQjBiMUJ2Y3lzck8xeHVJQ0FnSUNBZ2ZTQmxiSE5sSUdsbUlDaHZjR1Z5WVhScGIyNGdQVDA5SUNkY1hGeGNKeWtnZTF4dUlDQWdJQ0FnSUNCc1pYUWdjSEpsZG1sdmRYTlBjR1Z5WVhScGIyNGdQU0JvZFc1ckxteHBibVZ6VzJvZ0xTQXhYU0EvSUdoMWJtc3ViR2x1WlhOYmFpQXRJREZkV3pCZElEb2diblZzYkR0Y2JpQWdJQ0FnSUNBZ2FXWWdLSEJ5WlhacGIzVnpUM0JsY21GMGFXOXVJRDA5UFNBbkt5Y3BJSHRjYmlBZ0lDQWdJQ0FnSUNCeVpXMXZkbVZGVDBaT1RDQTlJSFJ5ZFdVN1hHNGdJQ0FnSUNBZ0lIMGdaV3h6WlNCcFppQW9jSEpsZG1sdmRYTlBjR1Z5WVhScGIyNGdQVDA5SUNjdEp5a2dlMXh1SUNBZ0lDQWdJQ0FnSUdGa1pFVlBSazVNSUQwZ2RISjFaVHRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmlBZ2ZWeHVYRzRnSUM4dklFaGhibVJzWlNCRlQwWk9UQ0JwYm5ObGNuUnBiMjR2Y21WdGIzWmhiRnh1SUNCcFppQW9jbVZ0YjNabFJVOUdUa3dwSUh0Y2JpQWdJQ0IzYUdsc1pTQW9JV3hwYm1WelcyeHBibVZ6TG14bGJtZDBhQ0F0SURGZEtTQjdYRzRnSUNBZ0lDQnNhVzVsY3k1d2IzQW9LVHRjYmlBZ0lDQWdJR1JsYkdsdGFYUmxjbk11Y0c5d0tDazdYRzRnSUNBZ2ZWeHVJQ0I5SUdWc2MyVWdhV1lnS0dGa1pFVlBSazVNS1NCN1hHNGdJQ0FnYkdsdVpYTXVjSFZ6YUNnbkp5azdYRzRnSUNBZ1pHVnNhVzFwZEdWeWN5NXdkWE5vS0NkY1hHNG5LVHRjYmlBZ2ZWeHVJQ0JtYjNJZ0tHeGxkQ0JmYXlBOUlEQTdJRjlySUR3Z2JHbHVaWE11YkdWdVozUm9JQzBnTVRzZ1gyc3JLeWtnZTF4dUlDQWdJR3hwYm1WelcxOXJYU0E5SUd4cGJtVnpXMTlyWFNBcklHUmxiR2x0YVhSbGNuTmJYMnRkTzF4dUlDQjlYRzRnSUhKbGRIVnliaUJzYVc1bGN5NXFiMmx1S0NjbktUdGNibjFjYmx4dUx5OGdWM0poY0hCbGNpQjBhR0YwSUhOMWNIQnZjblJ6SUcxMWJIUnBjR3hsSUdacGJHVWdjR0YwWTJobGN5QjJhV0VnWTJGc2JHSmhZMnR6TGx4dVpYaHdiM0owSUdaMWJtTjBhVzl1SUdGd2NHeDVVR0YwWTJobGN5aDFibWxFYVdabUxDQnZjSFJwYjI1ektTQjdYRzRnSUdsbUlDaDBlWEJsYjJZZ2RXNXBSR2xtWmlBOVBUMGdKM04wY21sdVp5Y3BJSHRjYmlBZ0lDQjFibWxFYVdabUlEMGdjR0Z5YzJWUVlYUmphQ2gxYm1sRWFXWm1LVHRjYmlBZ2ZWeHVYRzRnSUd4bGRDQmpkWEp5Wlc1MFNXNWtaWGdnUFNBd08xeHVJQ0JtZFc1amRHbHZiaUJ3Y205alpYTnpTVzVrWlhnb0tTQjdYRzRnSUNBZ2JHVjBJR2x1WkdWNElEMGdkVzVwUkdsbVpsdGpkWEp5Wlc1MFNXNWtaWGdySzEwN1hHNGdJQ0FnYVdZZ0tDRnBibVJsZUNrZ2UxeHVJQ0FnSUNBZ2NtVjBkWEp1SUc5d2RHbHZibk11WTI5dGNHeGxkR1VvS1R0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0J2Y0hScGIyNXpMbXh2WVdSR2FXeGxLR2x1WkdWNExDQm1kVzVqZEdsdmJpaGxjbklzSUdSaGRHRXBJSHRjYmlBZ0lDQWdJR2xtSUNobGNuSXBJSHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJRzl3ZEdsdmJuTXVZMjl0Y0d4bGRHVW9aWEp5S1R0Y2JpQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ2JHVjBJSFZ3WkdGMFpXUkRiMjUwWlc1MElEMGdZWEJ3YkhsUVlYUmphQ2hrWVhSaExDQnBibVJsZUN3Z2IzQjBhVzl1Y3lrN1hHNGdJQ0FnSUNCdmNIUnBiMjV6TG5CaGRHTm9aV1FvYVc1a1pYZ3NJSFZ3WkdGMFpXUkRiMjUwWlc1MExDQm1kVzVqZEdsdmJpaGxjbklwSUh0Y2JpQWdJQ0FnSUNBZ2FXWWdLR1Z5Y2lrZ2UxeHVJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQnZjSFJwYjI1ekxtTnZiWEJzWlhSbEtHVnljaWs3WEc0Z0lDQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0lDQndjbTlqWlhOelNXNWtaWGdvS1R0Y2JpQWdJQ0FnSUgwcE8xeHVJQ0FnSUgwcE8xeHVJQ0I5WEc0Z0lIQnliMk5sYzNOSmJtUmxlQ2dwTzF4dWZWeHVJbDE5XG4iLCAiLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLnN0cnVjdHVyZWRQYXRjaCA9IHN0cnVjdHVyZWRQYXRjaDtcbmV4cG9ydHMuZm9ybWF0UGF0Y2ggPSBmb3JtYXRQYXRjaDtcbmV4cG9ydHMuY3JlYXRlVHdvRmlsZXNQYXRjaCA9IGNyZWF0ZVR3b0ZpbGVzUGF0Y2g7XG5leHBvcnRzLmNyZWF0ZVBhdGNoID0gY3JlYXRlUGF0Y2g7XG5cbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG52YXJcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl9saW5lID0gcmVxdWlyZShcIi4uL2RpZmYvbGluZVwiKVxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbjtcblxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyBmdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7IH1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7IGlmICh0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoaXRlcikpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpOyB9XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KGFycik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG5mdW5jdGlvbiBzdHJ1Y3R1cmVkUGF0Y2gob2xkRmlsZU5hbWUsIG5ld0ZpbGVOYW1lLCBvbGRTdHIsIG5ld1N0ciwgb2xkSGVhZGVyLCBuZXdIZWFkZXIsIG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zLmNvbnRleHQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgb3B0aW9ucy5jb250ZXh0ID0gNDtcbiAgfVxuXG4gIHZhciBkaWZmID1cbiAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAoMCxcbiAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cblxuICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gIF9saW5lXG4gIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gIC5cbiAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICBkaWZmTGluZXMpXG4gIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gIChvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucyk7XG5cbiAgaWYgKCFkaWZmKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZGlmZi5wdXNoKHtcbiAgICB2YWx1ZTogJycsXG4gICAgbGluZXM6IFtdXG4gIH0pOyAvLyBBcHBlbmQgYW4gZW1wdHkgdmFsdWUgdG8gbWFrZSBjbGVhbnVwIGVhc2llclxuXG4gIGZ1bmN0aW9uIGNvbnRleHRMaW5lcyhsaW5lcykge1xuICAgIHJldHVybiBsaW5lcy5tYXAoZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICByZXR1cm4gJyAnICsgZW50cnk7XG4gICAgfSk7XG4gIH1cblxuICB2YXIgaHVua3MgPSBbXTtcbiAgdmFyIG9sZFJhbmdlU3RhcnQgPSAwLFxuICAgICAgbmV3UmFuZ2VTdGFydCA9IDAsXG4gICAgICBjdXJSYW5nZSA9IFtdLFxuICAgICAgb2xkTGluZSA9IDEsXG4gICAgICBuZXdMaW5lID0gMTtcblxuICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKFxuICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICBpKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBkaWZmW2ldLFxuICAgICAgICBsaW5lcyA9IGN1cnJlbnQubGluZXMgfHwgY3VycmVudC52YWx1ZS5yZXBsYWNlKC9cXG4kLywgJycpLnNwbGl0KCdcXG4nKTtcbiAgICBjdXJyZW50LmxpbmVzID0gbGluZXM7XG5cbiAgICBpZiAoY3VycmVudC5hZGRlZCB8fCBjdXJyZW50LnJlbW92ZWQpIHtcbiAgICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICAgIHZhciBfY3VyUmFuZ2U7XG5cbiAgICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gICAgICAvLyBJZiB3ZSBoYXZlIHByZXZpb3VzIGNvbnRleHQsIHN0YXJ0IHdpdGggdGhhdFxuICAgICAgaWYgKCFvbGRSYW5nZVN0YXJ0KSB7XG4gICAgICAgIHZhciBwcmV2ID0gZGlmZltpIC0gMV07XG4gICAgICAgIG9sZFJhbmdlU3RhcnQgPSBvbGRMaW5lO1xuICAgICAgICBuZXdSYW5nZVN0YXJ0ID0gbmV3TGluZTtcblxuICAgICAgICBpZiAocHJldikge1xuICAgICAgICAgIGN1clJhbmdlID0gb3B0aW9ucy5jb250ZXh0ID4gMCA/IGNvbnRleHRMaW5lcyhwcmV2LmxpbmVzLnNsaWNlKC1vcHRpb25zLmNvbnRleHQpKSA6IFtdO1xuICAgICAgICAgIG9sZFJhbmdlU3RhcnQgLT0gY3VyUmFuZ2UubGVuZ3RoO1xuICAgICAgICAgIG5ld1JhbmdlU3RhcnQgLT0gY3VyUmFuZ2UubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICB9IC8vIE91dHB1dCBvdXIgY2hhbmdlc1xuXG5cbiAgICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cblxuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cblxuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgICAgKF9jdXJSYW5nZSA9XG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgICAgY3VyUmFuZ2UpLnB1c2guYXBwbHkoXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICAgICBfY3VyUmFuZ2VcbiAgICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gICAgICAsXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICAgICBfdG9Db25zdW1hYmxlQXJyYXkoXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgICAgbGluZXMubWFwKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICByZXR1cm4gKGN1cnJlbnQuYWRkZWQgPyAnKycgOiAnLScpICsgZW50cnk7XG4gICAgICB9KSkpOyAvLyBUcmFjayB0aGUgdXBkYXRlZCBmaWxlIHBvc2l0aW9uXG5cblxuICAgICAgaWYgKGN1cnJlbnQuYWRkZWQpIHtcbiAgICAgICAgbmV3TGluZSArPSBsaW5lcy5sZW5ndGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbGRMaW5lICs9IGxpbmVzLmxlbmd0aDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWRlbnRpY2FsIGNvbnRleHQgbGluZXMuIFRyYWNrIGxpbmUgY2hhbmdlc1xuICAgICAgaWYgKG9sZFJhbmdlU3RhcnQpIHtcbiAgICAgICAgLy8gQ2xvc2Ugb3V0IGFueSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIG91dHB1dCAob3Igam9pbiBvdmVybGFwcGluZylcbiAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA8PSBvcHRpb25zLmNvbnRleHQgKiAyICYmIGkgPCBkaWZmLmxlbmd0aCAtIDIpIHtcbiAgICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICAgICAgICAgdmFyIF9jdXJSYW5nZTI7XG5cbiAgICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgICAgICAgIC8vIE92ZXJsYXBwaW5nXG5cbiAgICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5cbiAgICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuXG4gICAgICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgICAgICAgIChfY3VyUmFuZ2UyID1cbiAgICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgICAgICAgIGN1clJhbmdlKS5wdXNoLmFwcGx5KFxuICAgICAgICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICAgICAgICBfY3VyUmFuZ2UyXG4gICAgICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgICAgICAgICAsXG4gICAgICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgICAgICAgIF90b0NvbnN1bWFibGVBcnJheShcbiAgICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgICAgICAgIGNvbnRleHRMaW5lcyhsaW5lcykpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICAgICAgICAgdmFyIF9jdXJSYW5nZTM7XG5cbiAgICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgICAgICAgIC8vIGVuZCB0aGUgcmFuZ2UgYW5kIG91dHB1dFxuICAgICAgICAgIHZhciBjb250ZXh0U2l6ZSA9IE1hdGgubWluKGxpbmVzLmxlbmd0aCwgb3B0aW9ucy5jb250ZXh0KTtcblxuICAgICAgICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cblxuICAgICAgICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG5cbiAgICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICAgICAgICAgKF9jdXJSYW5nZTMgPVxuICAgICAgICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gICAgICAgICAgY3VyUmFuZ2UpLnB1c2guYXBwbHkoXG4gICAgICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgICAgICAgIF9jdXJSYW5nZTNcbiAgICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgICAgICAgICxcbiAgICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICAgICAgICAgX3RvQ29uc3VtYWJsZUFycmF5KFxuICAgICAgICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gICAgICAgICAgY29udGV4dExpbmVzKGxpbmVzLnNsaWNlKDAsIGNvbnRleHRTaXplKSkpKTtcblxuICAgICAgICAgIHZhciBodW5rID0ge1xuICAgICAgICAgICAgb2xkU3RhcnQ6IG9sZFJhbmdlU3RhcnQsXG4gICAgICAgICAgICBvbGRMaW5lczogb2xkTGluZSAtIG9sZFJhbmdlU3RhcnQgKyBjb250ZXh0U2l6ZSxcbiAgICAgICAgICAgIG5ld1N0YXJ0OiBuZXdSYW5nZVN0YXJ0LFxuICAgICAgICAgICAgbmV3TGluZXM6IG5ld0xpbmUgLSBuZXdSYW5nZVN0YXJ0ICsgY29udGV4dFNpemUsXG4gICAgICAgICAgICBsaW5lczogY3VyUmFuZ2VcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgaWYgKGkgPj0gZGlmZi5sZW5ndGggLSAyICYmIGxpbmVzLmxlbmd0aCA8PSBvcHRpb25zLmNvbnRleHQpIHtcbiAgICAgICAgICAgIC8vIEVPRiBpcyBpbnNpZGUgdGhpcyBodW5rXG4gICAgICAgICAgICB2YXIgb2xkRU9GTmV3bGluZSA9IC9cXG4kLy50ZXN0KG9sZFN0cik7XG4gICAgICAgICAgICB2YXIgbmV3RU9GTmV3bGluZSA9IC9cXG4kLy50ZXN0KG5ld1N0cik7XG4gICAgICAgICAgICB2YXIgbm9ObEJlZm9yZUFkZHMgPSBsaW5lcy5sZW5ndGggPT0gMCAmJiBjdXJSYW5nZS5sZW5ndGggPiBodW5rLm9sZExpbmVzO1xuXG4gICAgICAgICAgICBpZiAoIW9sZEVPRk5ld2xpbmUgJiYgbm9ObEJlZm9yZUFkZHMgJiYgb2xkU3RyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlOiBvbGQgaGFzIG5vIGVvbCBhbmQgbm8gdHJhaWxpbmcgY29udGV4dDsgbm8tbmwgY2FuIGVuZCB1cCBiZWZvcmUgYWRkc1xuICAgICAgICAgICAgICAvLyBob3dldmVyLCBpZiB0aGUgb2xkIGZpbGUgaXMgZW1wdHksIGRvIG5vdCBvdXRwdXQgdGhlIG5vLW5sIGxpbmVcbiAgICAgICAgICAgICAgY3VyUmFuZ2Uuc3BsaWNlKGh1bmsub2xkTGluZXMsIDAsICdcXFxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFvbGRFT0ZOZXdsaW5lICYmICFub05sQmVmb3JlQWRkcyB8fCAhbmV3RU9GTmV3bGluZSkge1xuICAgICAgICAgICAgICBjdXJSYW5nZS5wdXNoKCdcXFxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBodW5rcy5wdXNoKGh1bmspO1xuICAgICAgICAgIG9sZFJhbmdlU3RhcnQgPSAwO1xuICAgICAgICAgIG5ld1JhbmdlU3RhcnQgPSAwO1xuICAgICAgICAgIGN1clJhbmdlID0gW107XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgb2xkTGluZSArPSBsaW5lcy5sZW5ndGg7XG4gICAgICBuZXdMaW5lICs9IGxpbmVzLmxlbmd0aDtcbiAgICB9XG4gIH07XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaWZmLmxlbmd0aDsgaSsrKSB7XG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgIF9sb29wKFxuICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gICAgaSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG9sZEZpbGVOYW1lOiBvbGRGaWxlTmFtZSxcbiAgICBuZXdGaWxlTmFtZTogbmV3RmlsZU5hbWUsXG4gICAgb2xkSGVhZGVyOiBvbGRIZWFkZXIsXG4gICAgbmV3SGVhZGVyOiBuZXdIZWFkZXIsXG4gICAgaHVua3M6IGh1bmtzXG4gIH07XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFBhdGNoKGRpZmYpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZGlmZikpIHtcbiAgICByZXR1cm4gZGlmZi5tYXAoZm9ybWF0UGF0Y2gpLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgdmFyIHJldCA9IFtdO1xuXG4gIGlmIChkaWZmLm9sZEZpbGVOYW1lID09IGRpZmYubmV3RmlsZU5hbWUpIHtcbiAgICByZXQucHVzaCgnSW5kZXg6ICcgKyBkaWZmLm9sZEZpbGVOYW1lKTtcbiAgfVxuXG4gIHJldC5wdXNoKCc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Jyk7XG4gIHJldC5wdXNoKCctLS0gJyArIGRpZmYub2xkRmlsZU5hbWUgKyAodHlwZW9mIGRpZmYub2xkSGVhZGVyID09PSAndW5kZWZpbmVkJyA/ICcnIDogJ1xcdCcgKyBkaWZmLm9sZEhlYWRlcikpO1xuICByZXQucHVzaCgnKysrICcgKyBkaWZmLm5ld0ZpbGVOYW1lICsgKHR5cGVvZiBkaWZmLm5ld0hlYWRlciA9PT0gJ3VuZGVmaW5lZCcgPyAnJyA6ICdcXHQnICsgZGlmZi5uZXdIZWFkZXIpKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGRpZmYuaHVua3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaHVuayA9IGRpZmYuaHVua3NbaV07IC8vIFVuaWZpZWQgRGlmZiBGb3JtYXQgcXVpcms6IElmIHRoZSBjaHVuayBzaXplIGlzIDAsXG4gICAgLy8gdGhlIGZpcnN0IG51bWJlciBpcyBvbmUgbG93ZXIgdGhhbiBvbmUgd291bGQgZXhwZWN0LlxuICAgIC8vIGh0dHBzOi8vd3d3LmFydGltYS5jb20vd2VibG9ncy92aWV3cG9zdC5qc3A/dGhyZWFkPTE2NDI5M1xuXG4gICAgaWYgKGh1bmsub2xkTGluZXMgPT09IDApIHtcbiAgICAgIGh1bmsub2xkU3RhcnQgLT0gMTtcbiAgICB9XG5cbiAgICBpZiAoaHVuay5uZXdMaW5lcyA9PT0gMCkge1xuICAgICAgaHVuay5uZXdTdGFydCAtPSAxO1xuICAgIH1cblxuICAgIHJldC5wdXNoKCdAQCAtJyArIGh1bmsub2xkU3RhcnQgKyAnLCcgKyBodW5rLm9sZExpbmVzICsgJyArJyArIGh1bmsubmV3U3RhcnQgKyAnLCcgKyBodW5rLm5ld0xpbmVzICsgJyBAQCcpO1xuICAgIHJldC5wdXNoLmFwcGx5KHJldCwgaHVuay5saW5lcyk7XG4gIH1cblxuICByZXR1cm4gcmV0LmpvaW4oJ1xcbicpICsgJ1xcbic7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVR3b0ZpbGVzUGF0Y2gob2xkRmlsZU5hbWUsIG5ld0ZpbGVOYW1lLCBvbGRTdHIsIG5ld1N0ciwgb2xkSGVhZGVyLCBuZXdIZWFkZXIsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGZvcm1hdFBhdGNoKHN0cnVjdHVyZWRQYXRjaChvbGRGaWxlTmFtZSwgbmV3RmlsZU5hbWUsIG9sZFN0ciwgbmV3U3RyLCBvbGRIZWFkZXIsIG5ld0hlYWRlciwgb3B0aW9ucykpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVQYXRjaChmaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKSB7XG4gIHJldHVybiBjcmVhdGVUd29GaWxlc1BhdGNoKGZpbGVOYW1lLCBmaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OXdZWFJqYUM5amNtVmhkR1V1YW5NaVhTd2libUZ0WlhNaU9sc2ljM1J5ZFdOMGRYSmxaRkJoZEdOb0lpd2liMnhrUm1sc1pVNWhiV1VpTENKdVpYZEdhV3hsVG1GdFpTSXNJbTlzWkZOMGNpSXNJbTVsZDFOMGNpSXNJbTlzWkVobFlXUmxjaUlzSW01bGQwaGxZV1JsY2lJc0ltOXdkR2x2Ym5NaUxDSmpiMjUwWlhoMElpd2laR2xtWmlJc0ltUnBabVpNYVc1bGN5SXNJbkIxYzJnaUxDSjJZV3gxWlNJc0lteHBibVZ6SWl3aVkyOXVkR1Y0ZEV4cGJtVnpJaXdpYldGd0lpd2laVzUwY25raUxDSm9kVzVyY3lJc0ltOXNaRkpoYm1kbFUzUmhjblFpTENKdVpYZFNZVzVuWlZOMFlYSjBJaXdpWTNWeVVtRnVaMlVpTENKdmJHUk1hVzVsSWl3aWJtVjNUR2x1WlNJc0lta2lMQ0pqZFhKeVpXNTBJaXdpY21Wd2JHRmpaU0lzSW5Od2JHbDBJaXdpWVdSa1pXUWlMQ0p5WlcxdmRtVmtJaXdpY0hKbGRpSXNJbk5zYVdObElpd2liR1Z1WjNSb0lpd2lZMjl1ZEdWNGRGTnBlbVVpTENKTllYUm9JaXdpYldsdUlpd2lhSFZ1YXlJc0ltOXNaRk4wWVhKMElpd2liMnhrVEdsdVpYTWlMQ0p1WlhkVGRHRnlkQ0lzSW01bGQweHBibVZ6SWl3aWIyeGtSVTlHVG1WM2JHbHVaU0lzSW5SbGMzUWlMQ0p1WlhkRlQwWk9aWGRzYVc1bElpd2libTlPYkVKbFptOXlaVUZrWkhNaUxDSnpjR3hwWTJVaUxDSm1iM0p0WVhSUVlYUmphQ0lzSWtGeWNtRjVJaXdpYVhOQmNuSmhlU0lzSW1wdmFXNGlMQ0p5WlhRaUxDSmhjSEJzZVNJc0ltTnlaV0YwWlZSM2IwWnBiR1Z6VUdGMFkyZ2lMQ0pqY21WaGRHVlFZWFJqYUNJc0ltWnBiR1ZPWVcxbElsMHNJbTFoY0hCcGJtZHpJam9pT3pzN096czdPenM3T3pzN1FVRkJRVHRCUVVGQk8wRkJRVUU3UVVGQlFUdEJRVUZCT3pzN096czdPenM3T3pzN096czdRVUZGVHl4VFFVRlRRU3hsUVVGVUxFTkJRWGxDUXl4WFFVRjZRaXhGUVVGelEwTXNWMEZCZEVNc1JVRkJiVVJETEUxQlFXNUVMRVZCUVRKRVF5eE5RVUV6UkN4RlFVRnRSVU1zVTBGQmJrVXNSVUZCT0VWRExGTkJRVGxGTEVWQlFYbEdReXhQUVVGNlJpeEZRVUZyUnp0QlFVTjJSeXhOUVVGSkxFTkJRVU5CTEU5QlFVd3NSVUZCWXp0QlFVTmFRU3hKUVVGQlFTeFBRVUZQTEVkQlFVY3NSVUZCVmp0QlFVTkVPenRCUVVORUxFMUJRVWtzVDBGQlQwRXNUMEZCVHl4RFFVRkRReXhQUVVGbUxFdEJRVEpDTEZkQlFTOUNMRVZCUVRSRE8wRkJRekZEUkN4SlFVRkJRU3hQUVVGUExFTkJRVU5ETEU5QlFWSXNSMEZCYTBJc1EwRkJiRUk3UVVGRFJEczdRVUZGUkN4TlFVRk5ReXhKUVVGSk8wRkJRVWM3UVVGQlFUdEJRVUZCT3p0QlFVRkJRenRCUVVGQlFUdEJRVUZCUVR0QlFVRkJRVHRCUVVGQlFUdEJRVUZCUVR0QlFVRkJPMEZCUVVFc1IwRkJWVkFzVFVGQlZpeEZRVUZyUWtNc1RVRkJiRUlzUlVGQk1FSkhMRTlCUVRGQ0xFTkJRV0k3TzBGQlEwRXNUVUZCUnl4RFFVRkRSU3hKUVVGS0xFVkJRVlU3UVVGRFVqdEJRVU5FT3p0QlFVVkVRU3hGUVVGQlFTeEpRVUZKTEVOQlFVTkZMRWxCUVV3c1EwRkJWVHRCUVVGRFF5eEpRVUZCUVN4TFFVRkxMRVZCUVVVc1JVRkJVanRCUVVGWlF5eEpRVUZCUVN4TFFVRkxMRVZCUVVVN1FVRkJia0lzUjBGQlZpeEZRV0oxUnl4RFFXRndSVHM3UVVGRmJrTXNWMEZCVTBNc1dVRkJWQ3hEUVVGelFrUXNTMEZCZEVJc1JVRkJOa0k3UVVGRE0wSXNWMEZCVDBFc1MwRkJTeXhEUVVGRFJTeEhRVUZPTEVOQlFWVXNWVUZCVTBNc1MwRkJWQ3hGUVVGblFqdEJRVUZGTEdGQlFVOHNUVUZCVFVFc1MwRkJZanRCUVVGeFFpeExRVUZxUkN4RFFVRlFPMEZCUTBRN08wRkJSVVFzVFVGQlNVTXNTMEZCU3l4SFFVRkhMRVZCUVZvN1FVRkRRU3hOUVVGSlF5eGhRVUZoTEVkQlFVY3NRMEZCY0VJN1FVRkJRU3hOUVVGMVFrTXNZVUZCWVN4SFFVRkhMRU5CUVhaRE8wRkJRVUVzVFVGQk1FTkRMRkZCUVZFc1IwRkJSeXhGUVVGeVJEdEJRVUZCTEUxQlEwbERMRTlCUVU4c1IwRkJSeXhEUVVSa08wRkJRVUVzVFVGRGFVSkRMRTlCUVU4c1IwRkJSeXhEUVVRelFqczdRVUZ3UW5WSE8wRkJRVUU3UVVGQlFUdEJRWE5DT1VaRExFVkJRVUZCTEVOQmRFSTRSanRCUVhWQ2NrY3NVVUZCVFVNc1QwRkJUeXhIUVVGSFppeEpRVUZKTEVOQlFVTmpMRU5CUVVRc1EwRkJjRUk3UVVGQlFTeFJRVU5OVml4TFFVRkxMRWRCUVVkWExFOUJRVThzUTBGQlExZ3NTMEZCVWl4SlFVRnBRbGNzVDBGQlR5eERRVUZEV2l4TFFVRlNMRU5CUVdOaExFOUJRV1FzUTBGQmMwSXNTMEZCZEVJc1JVRkJOa0lzUlVGQk4wSXNSVUZCYVVORExFdEJRV3BETEVOQlFYVkRMRWxCUVhaRExFTkJSQzlDTzBGQlJVRkdMRWxCUVVGQkxFOUJRVThzUTBGQlExZ3NTMEZCVWl4SFFVRm5Ra0VzUzBGQmFFSTdPMEZCUlVFc1VVRkJTVmNzVDBGQlR5eERRVUZEUnl4TFFVRlNMRWxCUVdsQ1NDeFBRVUZQTEVOQlFVTkpMRTlCUVRkQ0xFVkJRWE5ETzBGQlFVRTdRVUZCUVRzN1FVRkJRVHRCUVVOd1F6dEJRVU5CTEZWQlFVa3NRMEZCUTFZc1lVRkJUQ3hGUVVGdlFqdEJRVU5zUWl4WlFVRk5WeXhKUVVGSkxFZEJRVWR3UWl4SlFVRkpMRU5CUVVOakxFTkJRVU1zUjBGQlJ5eERRVUZNTEVOQlFXcENPMEZCUTBGTUxGRkJRVUZCTEdGQlFXRXNSMEZCUjBjc1QwRkJhRUk3UVVGRFFVWXNVVUZCUVVFc1lVRkJZU3hIUVVGSFJ5eFBRVUZvUWpzN1FVRkZRU3haUVVGSlR5eEpRVUZLTEVWQlFWVTdRVUZEVWxRc1ZVRkJRVUVzVVVGQlVTeEhRVUZIWWl4UFFVRlBMRU5CUVVORExFOUJRVklzUjBGQmEwSXNRMEZCYkVJc1IwRkJjMEpOTEZsQlFWa3NRMEZCUTJVc1NVRkJTU3hEUVVGRGFFSXNTMEZCVEN4RFFVRlhhVUlzUzBGQldDeERRVUZwUWl4RFFVRkRka0lzVDBGQlR5eERRVUZEUXl4UFFVRXhRaXhEUVVGRUxFTkJRV3hETEVkQlFYbEZMRVZCUVhCR08wRkJRMEZWTEZWQlFVRkJMR0ZCUVdFc1NVRkJTVVVzVVVGQlVTeERRVUZEVnl4TlFVRXhRanRCUVVOQldpeFZRVUZCUVN4aFFVRmhMRWxCUVVsRExGRkJRVkVzUTBGQlExY3NUVUZCTVVJN1FVRkRSRHRCUVVOR0xFOUJXbTFETEVOQlkzQkRPenM3UVVGRFFUczdRVUZCUVRzN1FVRkJRVHRCUVVGQk8wRkJRVUU3UVVGQlFWZ3NUVUZCUVVFc1VVRkJVU3hGUVVGRFZDeEpRVUZVTzBGQlFVRTdRVUZCUVR0QlFVRkJPMEZCUVVFN1FVRkJRVHRCUVVGQk8wRkJRVUU3UVVGQmEwSkZMRTFCUVVGQkxFdEJRVXNzUTBGQlEwVXNSMEZCVGl4RFFVRlZMRlZCUVZORExFdEJRVlFzUlVGQlowSTdRVUZETVVNc1pVRkJUeXhEUVVGRFVTeFBRVUZQTEVOQlFVTkhMRXRCUVZJc1IwRkJaMElzUjBGQmFFSXNSMEZCYzBJc1IwRkJka0lzU1VGQk9FSllMRXRCUVhKRE8wRkJRMFFzVDBGR2FVSXNRMEZCYkVJc1IwRm1iME1zUTBGdFFuQkRPenM3UVVGRFFTeFZRVUZKVVN4UFFVRlBMRU5CUVVOSExFdEJRVm9zUlVGQmJVSTdRVUZEYWtKTUxGRkJRVUZCTEU5QlFVOHNTVUZCU1ZRc1MwRkJTeXhEUVVGRGEwSXNUVUZCYWtJN1FVRkRSQ3hQUVVaRUxFMUJSVTg3UVVGRFRGWXNVVUZCUVVFc1QwRkJUeXhKUVVGSlVpeExRVUZMTEVOQlFVTnJRaXhOUVVGcVFqdEJRVU5FTzBGQlEwWXNTMEY2UWtRc1RVRjVRazg3UVVGRFREdEJRVU5CTEZWQlFVbGlMR0ZCUVVvc1JVRkJiVUk3UVVGRGFrSTdRVUZEUVN4WlFVRkpUQ3hMUVVGTExFTkJRVU5yUWl4TlFVRk9MRWxCUVdkQ2VFSXNUMEZCVHl4RFFVRkRReXhQUVVGU0xFZEJRV3RDTEVOQlFXeERMRWxCUVhWRFpTeERRVUZETEVkQlFVZGtMRWxCUVVrc1EwRkJRM05DTEUxQlFVd3NSMEZCWXl4RFFVRTNSQ3hGUVVGblJUdEJRVUZCTzBGQlFVRTdPMEZCUVVFN1FVRkRPVVE3TzBGQlEwRTdPMEZCUVVFN08wRkJRVUU3UVVGQlFUdEJRVUZCTzBGQlFVRllMRlZCUVVGQkxGRkJRVkVzUlVGQlExUXNTVUZCVkR0QlFVRkJPMEZCUVVFN1FVRkJRVHRCUVVGQk8wRkJRVUU3UVVGQlFUdEJRVUZCTzBGQlFXdENSeXhWUVVGQlFTeFpRVUZaTEVOQlFVTkVMRXRCUVVRc1EwRkJPVUk3UVVGRFJDeFRRVWhFTEUxQlIwODdRVUZCUVR0QlFVRkJPenRCUVVGQk8wRkJRMHc3UVVGRFFTeGpRVUZKYlVJc1YwRkJWeXhIUVVGSFF5eEpRVUZKTEVOQlFVTkRMRWRCUVV3c1EwRkJVM0pDTEV0QlFVc3NRMEZCUTJ0Q0xFMUJRV1lzUlVGQmRVSjRRaXhQUVVGUExFTkJRVU5ETEU5QlFTOUNMRU5CUVd4Q096dEJRVU5CT3p0QlFVRkJPenRCUVVGQk8wRkJRVUU3UVVGQlFUdEJRVUZCV1N4VlFVRkJRU3hSUVVGUkxFVkJRVU5VTEVsQlFWUTdRVUZCUVR0QlFVRkJPMEZCUVVFN1FVRkJRVHRCUVVGQk8wRkJRVUU3UVVGQlFUdEJRVUZyUWtjc1ZVRkJRVUVzV1VGQldTeERRVUZEUkN4TFFVRkxMRU5CUVVOcFFpeExRVUZPTEVOQlFWa3NRMEZCV2l4RlFVRmxSU3hYUVVGbUxFTkJRVVFzUTBGQk9VSTdPMEZCUlVFc1kwRkJTVWNzU1VGQlNTeEhRVUZITzBGQlExUkRMRmxCUVVGQkxGRkJRVkVzUlVGQlJXeENMR0ZCUkVRN1FVRkZWRzFDTEZsQlFVRkJMRkZCUVZFc1JVRkJSMmhDTEU5QlFVOHNSMEZCUjBnc1lVRkJWaXhIUVVFd1FtTXNWMEZHTlVJN1FVRkhWRTBzV1VGQlFVRXNVVUZCVVN4RlFVRkZia0lzWVVGSVJEdEJRVWxVYjBJc1dVRkJRVUVzVVVGQlVTeEZRVUZIYWtJc1QwRkJUeXhIUVVGSFNDeGhRVUZXTEVkQlFUQkNZU3hYUVVvMVFqdEJRVXRVYmtJc1dVRkJRVUVzUzBGQlN5eEZRVUZGVHp0QlFVeEZMRmRCUVZnN08wRkJUMEVzWTBGQlNVY3NRMEZCUXl4SlFVRkpaQ3hKUVVGSkxFTkJRVU56UWl4TlFVRk1MRWRCUVdNc1EwRkJia0lzU1VGQmQwSnNRaXhMUVVGTExFTkJRVU5yUWl4TlFVRk9MRWxCUVdkQ2VFSXNUMEZCVHl4RFFVRkRReXhQUVVGd1JDeEZRVUUyUkR0QlFVTXpSRHRCUVVOQkxHZENRVUZKWjBNc1lVRkJZU3hIUVVGTExFdEJRVVFzUTBGQlVVTXNTVUZCVWl4RFFVRmhkRU1zVFVGQllpeERRVUZ5UWp0QlFVTkJMR2RDUVVGSmRVTXNZVUZCWVN4SFFVRkxMRXRCUVVRc1EwRkJVVVFzU1VGQlVpeERRVUZoY2tNc1RVRkJZaXhEUVVGeVFqdEJRVU5CTEdkQ1FVRkpkVU1zWTBGQll5eEhRVUZIT1VJc1MwRkJTeXhEUVVGRGEwSXNUVUZCVGl4SlFVRm5RaXhEUVVGb1FpeEpRVUZ4UWxnc1VVRkJVU3hEUVVGRFZ5eE5RVUZVTEVkQlFXdENTU3hKUVVGSkxFTkJRVU5GTEZGQlFXcEZPenRCUVVOQkxHZENRVUZKTEVOQlFVTkhMR0ZCUVVRc1NVRkJhMEpITEdOQlFXeENMRWxCUVc5RGVFTXNUVUZCVFN4RFFVRkRORUlzVFVGQlVDeEhRVUZuUWl4RFFVRjRSQ3hGUVVFeVJEdEJRVU42UkR0QlFVTkJPMEZCUTBGWUxHTkJRVUZCTEZGQlFWRXNRMEZCUTNkQ0xFMUJRVlFzUTBGQlowSlVMRWxCUVVrc1EwRkJRMFVzVVVGQmNrSXNSVUZCSzBJc1EwRkJMMElzUlVGQmEwTXNPRUpCUVd4RE8wRkJRMFE3TzBGQlEwUXNaMEpCUVVzc1EwRkJRMGNzWVVGQlJDeEpRVUZyUWl4RFFVRkRSeXhqUVVGd1FpeEpRVUYxUXl4RFFVRkRSQ3hoUVVFMVF5eEZRVUV5UkR0QlFVTjZSSFJDTEdOQlFVRkJMRkZCUVZFc1EwRkJRMVFzU1VGQlZDeERRVUZqTERoQ1FVRmtPMEZCUTBRN1FVRkRSanM3UVVGRFJFMHNWVUZCUVVFc1MwRkJTeXhEUVVGRFRpeEpRVUZPTEVOQlFWZDNRaXhKUVVGWU8wRkJSVUZxUWl4VlFVRkJRU3hoUVVGaExFZEJRVWNzUTBGQmFFSTdRVUZEUVVNc1ZVRkJRVUVzWVVGQllTeEhRVUZITEVOQlFXaENPMEZCUTBGRExGVkJRVUZCTEZGQlFWRXNSMEZCUnl4RlFVRllPMEZCUTBRN1FVRkRSanM3UVVGRFJFTXNUVUZCUVVFc1QwRkJUeXhKUVVGSlVpeExRVUZMTEVOQlFVTnJRaXhOUVVGcVFqdEJRVU5CVkN4TlFVRkJRU3hQUVVGUExFbEJRVWxVTEV0QlFVc3NRMEZCUTJ0Q0xFMUJRV3BDTzBGQlEwUTdRVUU1Um05SE96dEJRWE5DZGtjc1QwRkJTeXhKUVVGSlVpeERRVUZETEVkQlFVY3NRMEZCWWl4RlFVRm5Ra0VzUTBGQlF5eEhRVUZIWkN4SlFVRkpMRU5CUVVOelFpeE5RVUY2UWl4RlFVRnBRMUlzUTBGQlF5eEZRVUZzUXl4RlFVRnpRenRCUVVGQk8wRkJRVUU3UVVGQlFUdEJRVUUzUWtFc1NVRkJRVUVzUTBGQk5rSTdRVUY1UlhKRE96dEJRVVZFTEZOQlFVODdRVUZEVEhSQ0xFbEJRVUZCTEZkQlFWY3NSVUZCUlVFc1YwRkVVanRCUVVOeFFrTXNTVUZCUVVFc1YwRkJWeXhGUVVGRlFTeFhRVVJzUXp0QlFVVk1SeXhKUVVGQlFTeFRRVUZUTEVWQlFVVkJMRk5CUms0N1FVRkZhVUpETEVsQlFVRkJMRk5CUVZNc1JVRkJSVUVzVTBGR05VSTdRVUZIVEZjc1NVRkJRVUVzUzBGQlN5eEZRVUZGUVR0QlFVaEdMRWRCUVZBN1FVRkxSRHM3UVVGRlRTeFRRVUZUTkVJc1YwRkJWQ3hEUVVGeFFuQkRMRWxCUVhKQ0xFVkJRVEpDTzBGQlEyaERMRTFCUVVseFF5eExRVUZMTEVOQlFVTkRMRTlCUVU0c1EwRkJZM1JETEVsQlFXUXNRMEZCU2l4RlFVRjVRanRCUVVOMlFpeFhRVUZQUVN4SlFVRkpMRU5CUVVOTkxFZEJRVXdzUTBGQlV6aENMRmRCUVZRc1JVRkJjMEpITEVsQlFYUkNMRU5CUVRKQ0xFbEJRVE5DTEVOQlFWQTdRVUZEUkRzN1FVRkZSQ3hOUVVGTlF5eEhRVUZITEVkQlFVY3NSVUZCV2pzN1FVRkRRU3hOUVVGSmVFTXNTVUZCU1N4RFFVRkRVaXhYUVVGTUxFbEJRVzlDVVN4SlFVRkpMRU5CUVVOUUxGZEJRVGRDTEVWQlFUQkRPMEZCUTNoREswTXNTVUZCUVVFc1IwRkJSeXhEUVVGRGRFTXNTVUZCU2l4RFFVRlRMRmxCUVZsR0xFbEJRVWtzUTBGQlExSXNWMEZCTVVJN1FVRkRSRHM3UVVGRFJHZEVMRVZCUVVGQkxFZEJRVWNzUTBGQlEzUkRMRWxCUVVvc1EwRkJVeXh4UlVGQlZEdEJRVU5CYzBNc1JVRkJRVUVzUjBGQlJ5eERRVUZEZEVNc1NVRkJTaXhEUVVGVExGTkJRVk5HTEVsQlFVa3NRMEZCUTFJc1YwRkJaQ3hKUVVFMlFpeFBRVUZQVVN4SlFVRkpMRU5CUVVOS0xGTkJRVm9zUzBGQk1FSXNWMEZCTVVJc1IwRkJkME1zUlVGQmVFTXNSMEZCTmtNc1QwRkJUMGtzU1VGQlNTeERRVUZEU2l4VFFVRjBSaXhEUVVGVU8wRkJRMEUwUXl4RlFVRkJRU3hIUVVGSExFTkJRVU4wUXl4SlFVRktMRU5CUVZNc1UwRkJVMFlzU1VGQlNTeERRVUZEVUN4WFFVRmtMRWxCUVRaQ0xFOUJRVTlQTEVsQlFVa3NRMEZCUTBnc1UwRkJXaXhMUVVFd1FpeFhRVUV4UWl4SFFVRjNReXhGUVVGNFF5eEhRVUUyUXl4UFFVRlBSeXhKUVVGSkxFTkJRVU5JTEZOQlFYUkdMRU5CUVZRN08wRkJSVUVzVDBGQlN5eEpRVUZKYVVJc1EwRkJReXhIUVVGSExFTkJRV0lzUlVGQlowSkJMRU5CUVVNc1IwRkJSMlFzU1VGQlNTeERRVUZEVVN4TFFVRk1MRU5CUVZkakxFMUJRUzlDTEVWQlFYVkRVaXhEUVVGRExFVkJRWGhETEVWQlFUUkRPMEZCUXpGRExGRkJRVTFaTEVsQlFVa3NSMEZCUnpGQ0xFbEJRVWtzUTBGQlExRXNTMEZCVEN4RFFVRlhUU3hEUVVGWUxFTkJRV0lzUTBGRU1FTXNRMEZGTVVNN1FVRkRRVHRCUVVOQk96dEJRVU5CTEZGQlFVbFpMRWxCUVVrc1EwRkJRMFVzVVVGQlRDeExRVUZyUWl4RFFVRjBRaXhGUVVGNVFqdEJRVU4yUWtZc1RVRkJRVUVzU1VGQlNTeERRVUZEUXl4UlFVRk1MRWxCUVdsQ0xFTkJRV3BDTzBGQlEwUTdPMEZCUTBRc1VVRkJTVVFzU1VGQlNTeERRVUZEU1N4UlFVRk1MRXRCUVd0Q0xFTkJRWFJDTEVWQlFYbENPMEZCUTNaQ1NpeE5RVUZCUVN4SlFVRkpMRU5CUVVOSExGRkJRVXdzU1VGQmFVSXNRMEZCYWtJN1FVRkRSRHM3UVVGRFJGY3NTVUZCUVVFc1IwRkJSeXhEUVVGRGRFTXNTVUZCU2l4RFFVTkZMRk5CUVZOM1FpeEpRVUZKTEVOQlFVTkRMRkZCUVdRc1IwRkJlVUlzUjBGQmVrSXNSMEZCSzBKRUxFbEJRVWtzUTBGQlEwVXNVVUZCY0VNc1IwRkRSU3hKUVVSR0xFZEJRMU5HTEVsQlFVa3NRMEZCUTBjc1VVRkVaQ3hIUVVONVFpeEhRVVI2UWl4SFFVTXJRa2dzU1VGQlNTeERRVUZEU1N4UlFVUndReXhIUVVWRkxFdEJTRW83UVVGTFFWVXNTVUZCUVVFc1IwRkJSeXhEUVVGRGRFTXNTVUZCU2l4RFFVRlRkVU1zUzBGQlZDeERRVUZsUkN4SFFVRm1MRVZCUVc5Q1pDeEpRVUZKTEVOQlFVTjBRaXhMUVVGNlFqdEJRVU5FT3p0QlFVVkVMRk5CUVU5dlF5eEhRVUZITEVOQlFVTkVMRWxCUVVvc1EwRkJVeXhKUVVGVUxFbEJRV2xDTEVsQlFYaENPMEZCUTBRN08wRkJSVTBzVTBGQlUwY3NiVUpCUVZRc1EwRkJOa0pzUkN4WFFVRTNRaXhGUVVFd1EwTXNWMEZCTVVNc1JVRkJkVVJETEUxQlFYWkVMRVZCUVN0RVF5eE5RVUV2UkN4RlFVRjFSVU1zVTBGQmRrVXNSVUZCYTBaRExGTkJRV3hHTEVWQlFUWkdReXhQUVVFM1JpeEZRVUZ6Unp0QlFVTXpSeXhUUVVGUGMwTXNWMEZCVnl4RFFVRkROME1zWlVGQlpTeERRVUZEUXl4WFFVRkVMRVZCUVdORExGZEJRV1FzUlVGQk1rSkRMRTFCUVROQ0xFVkJRVzFEUXl4TlFVRnVReXhGUVVFeVEwTXNVMEZCTTBNc1JVRkJjMFJETEZOQlFYUkVMRVZCUVdsRlF5eFBRVUZxUlN4RFFVRm9RaXhEUVVGc1FqdEJRVU5FT3p0QlFVVk5MRk5CUVZNMlF5eFhRVUZVTEVOQlFYRkNReXhSUVVGeVFpeEZRVUVyUW14RUxFMUJRUzlDTEVWQlFYVkRReXhOUVVGMlF5eEZRVUVyUTBNc1UwRkJMME1zUlVGQk1FUkRMRk5CUVRGRUxFVkJRWEZGUXl4UFFVRnlSU3hGUVVFNFJUdEJRVU51Uml4VFFVRlBORU1zYlVKQlFXMUNMRU5CUVVORkxGRkJRVVFzUlVGQlYwRXNVVUZCV0N4RlFVRnhRbXhFTEUxQlFYSkNMRVZCUVRaQ1F5eE5RVUUzUWl4RlFVRnhRME1zVTBGQmNrTXNSVUZCWjBSRExGTkJRV2hFTEVWQlFUSkVReXhQUVVFelJDeERRVUV4UWp0QlFVTkVJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpYVcxd2IzSjBJSHRrYVdabVRHbHVaWE45SUdaeWIyMGdKeTR1TDJScFptWXZiR2x1WlNjN1hHNWNibVY0Y0c5eWRDQm1kVzVqZEdsdmJpQnpkSEoxWTNSMWNtVmtVR0YwWTJnb2IyeGtSbWxzWlU1aGJXVXNJRzVsZDBacGJHVk9ZVzFsTENCdmJHUlRkSElzSUc1bGQxTjBjaXdnYjJ4a1NHVmhaR1Z5TENCdVpYZElaV0ZrWlhJc0lHOXdkR2x2Ym5NcElIdGNiaUFnYVdZZ0tDRnZjSFJwYjI1ektTQjdYRzRnSUNBZ2IzQjBhVzl1Y3lBOUlIdDlPMXh1SUNCOVhHNGdJR2xtSUNoMGVYQmxiMllnYjNCMGFXOXVjeTVqYjI1MFpYaDBJRDA5UFNBbmRXNWtaV1pwYm1Wa0p5a2dlMXh1SUNBZ0lHOXdkR2x2Ym5NdVkyOXVkR1Y0ZENBOUlEUTdYRzRnSUgxY2JseHVJQ0JqYjI1emRDQmthV1ptSUQwZ1pHbG1aa3hwYm1WektHOXNaRk4wY2l3Z2JtVjNVM1J5TENCdmNIUnBiMjV6S1R0Y2JpQWdhV1lvSVdScFptWXBJSHRjYmlBZ0lDQnlaWFIxY200N1hHNGdJSDFjYmx4dUlDQmthV1ptTG5CMWMyZ29lM1poYkhWbE9pQW5KeXdnYkdsdVpYTTZJRnRkZlNrN0lDOHZJRUZ3Y0dWdVpDQmhiaUJsYlhCMGVTQjJZV3gxWlNCMGJ5QnRZV3RsSUdOc1pXRnVkWEFnWldGemFXVnlYRzVjYmlBZ1puVnVZM1JwYjI0Z1kyOXVkR1Y0ZEV4cGJtVnpLR3hwYm1WektTQjdYRzRnSUNBZ2NtVjBkWEp1SUd4cGJtVnpMbTFoY0NobWRXNWpkR2x2YmlobGJuUnllU2tnZXlCeVpYUjFjbTRnSnlBbklDc2daVzUwY25rN0lIMHBPMXh1SUNCOVhHNWNiaUFnYkdWMElHaDFibXR6SUQwZ1cxMDdYRzRnSUd4bGRDQnZiR1JTWVc1blpWTjBZWEowSUQwZ01Dd2dibVYzVW1GdVoyVlRkR0Z5ZENBOUlEQXNJR04xY2xKaGJtZGxJRDBnVzEwc1hHNGdJQ0FnSUNCdmJHUk1hVzVsSUQwZ01Td2dibVYzVEdsdVpTQTlJREU3WEc0Z0lHWnZjaUFvYkdWMElHa2dQU0F3T3lCcElEd2daR2xtWmk1c1pXNW5kR2c3SUdrckt5a2dlMXh1SUNBZ0lHTnZibk4wSUdOMWNuSmxiblFnUFNCa2FXWm1XMmxkTEZ4dUlDQWdJQ0FnSUNBZ0lHeHBibVZ6SUQwZ1kzVnljbVZ1ZEM1c2FXNWxjeUI4ZkNCamRYSnlaVzUwTG5aaGJIVmxMbkpsY0d4aFkyVW9MMXhjYmlRdkxDQW5KeWt1YzNCc2FYUW9KMXhjYmljcE8xeHVJQ0FnSUdOMWNuSmxiblF1YkdsdVpYTWdQU0JzYVc1bGN6dGNibHh1SUNBZ0lHbG1JQ2hqZFhKeVpXNTBMbUZrWkdWa0lIeDhJR04xY25KbGJuUXVjbVZ0YjNabFpDa2dlMXh1SUNBZ0lDQWdMeThnU1dZZ2QyVWdhR0YyWlNCd2NtVjJhVzkxY3lCamIyNTBaWGgwTENCemRHRnlkQ0IzYVhSb0lIUm9ZWFJjYmlBZ0lDQWdJR2xtSUNnaGIyeGtVbUZ1WjJWVGRHRnlkQ2tnZTF4dUlDQWdJQ0FnSUNCamIyNXpkQ0J3Y21WMklEMGdaR2xtWmx0cElDMGdNVjA3WEc0Z0lDQWdJQ0FnSUc5c1pGSmhibWRsVTNSaGNuUWdQU0J2YkdSTWFXNWxPMXh1SUNBZ0lDQWdJQ0J1WlhkU1lXNW5aVk4wWVhKMElEMGdibVYzVEdsdVpUdGNibHh1SUNBZ0lDQWdJQ0JwWmlBb2NISmxkaWtnZTF4dUlDQWdJQ0FnSUNBZ0lHTjFjbEpoYm1kbElEMGdiM0IwYVc5dWN5NWpiMjUwWlhoMElENGdNQ0EvSUdOdmJuUmxlSFJNYVc1bGN5aHdjbVYyTG14cGJtVnpMbk5zYVdObEtDMXZjSFJwYjI1ekxtTnZiblJsZUhRcEtTQTZJRnRkTzF4dUlDQWdJQ0FnSUNBZ0lHOXNaRkpoYm1kbFUzUmhjblFnTFQwZ1kzVnlVbUZ1WjJVdWJHVnVaM1JvTzF4dUlDQWdJQ0FnSUNBZ0lHNWxkMUpoYm1kbFUzUmhjblFnTFQwZ1kzVnlVbUZ1WjJVdWJHVnVaM1JvTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDOHZJRTkxZEhCMWRDQnZkWElnWTJoaGJtZGxjMXh1SUNBZ0lDQWdZM1Z5VW1GdVoyVXVjSFZ6YUNndUxpNGdiR2x1WlhNdWJXRndLR1oxYm1OMGFXOXVLR1Z1ZEhKNUtTQjdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQW9ZM1Z5Y21WdWRDNWhaR1JsWkNBL0lDY3JKeUE2SUNjdEp5a2dLeUJsYm5SeWVUdGNiaUFnSUNBZ0lIMHBLVHRjYmx4dUlDQWdJQ0FnTHk4Z1ZISmhZMnNnZEdobElIVndaR0YwWldRZ1ptbHNaU0J3YjNOcGRHbHZibHh1SUNBZ0lDQWdhV1lnS0dOMWNuSmxiblF1WVdSa1pXUXBJSHRjYmlBZ0lDQWdJQ0FnYm1WM1RHbHVaU0FyUFNCc2FXNWxjeTVzWlc1bmRHZzdYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQnZiR1JNYVc1bElDczlJR3hwYm1WekxteGxibWQwYUR0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdMeThnU1dSbGJuUnBZMkZzSUdOdmJuUmxlSFFnYkdsdVpYTXVJRlJ5WVdOcklHeHBibVVnWTJoaGJtZGxjMXh1SUNBZ0lDQWdhV1lnS0c5c1pGSmhibWRsVTNSaGNuUXBJSHRjYmlBZ0lDQWdJQ0FnTHk4Z1EyeHZjMlVnYjNWMElHRnVlU0JqYUdGdVoyVnpJSFJvWVhRZ2FHRjJaU0JpWldWdUlHOTFkSEIxZENBb2IzSWdhbTlwYmlCdmRtVnliR0Z3Y0dsdVp5bGNiaUFnSUNBZ0lDQWdhV1lnS0d4cGJtVnpMbXhsYm1kMGFDQThQU0J2Y0hScGIyNXpMbU52Ym5SbGVIUWdLaUF5SUNZbUlHa2dQQ0JrYVdabUxteGxibWQwYUNBdElESXBJSHRjYmlBZ0lDQWdJQ0FnSUNBdkx5QlBkbVZ5YkdGd2NHbHVaMXh1SUNBZ0lDQWdJQ0FnSUdOMWNsSmhibWRsTG5CMWMyZ29MaTR1SUdOdmJuUmxlSFJNYVc1bGN5aHNhVzVsY3lrcE8xeHVJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQWdJQzh2SUdWdVpDQjBhR1VnY21GdVoyVWdZVzVrSUc5MWRIQjFkRnh1SUNBZ0lDQWdJQ0FnSUd4bGRDQmpiMjUwWlhoMFUybDZaU0E5SUUxaGRHZ3ViV2x1S0d4cGJtVnpMbXhsYm1kMGFDd2diM0IwYVc5dWN5NWpiMjUwWlhoMEtUdGNiaUFnSUNBZ0lDQWdJQ0JqZFhKU1lXNW5aUzV3ZFhOb0tDNHVMaUJqYjI1MFpYaDBUR2x1WlhNb2JHbHVaWE11YzJ4cFkyVW9NQ3dnWTI5dWRHVjRkRk5wZW1VcEtTazdYRzVjYmlBZ0lDQWdJQ0FnSUNCc1pYUWdhSFZ1YXlBOUlIdGNiaUFnSUNBZ0lDQWdJQ0FnSUc5c1pGTjBZWEowT2lCdmJHUlNZVzVuWlZOMFlYSjBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ2IyeGtUR2x1WlhNNklDaHZiR1JNYVc1bElDMGdiMnhrVW1GdVoyVlRkR0Z5ZENBcklHTnZiblJsZUhSVGFYcGxLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lHNWxkMU4wWVhKME9pQnVaWGRTWVc1blpWTjBZWEowTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdibVYzVEdsdVpYTTZJQ2h1WlhkTWFXNWxJQzBnYm1WM1VtRnVaMlZUZEdGeWRDQXJJR052Ym5SbGVIUlRhWHBsS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJR3hwYm1Wek9pQmpkWEpTWVc1blpWeHVJQ0FnSUNBZ0lDQWdJSDA3WEc0Z0lDQWdJQ0FnSUNBZ2FXWWdLR2tnUGowZ1pHbG1aaTVzWlc1bmRHZ2dMU0F5SUNZbUlHeHBibVZ6TG14bGJtZDBhQ0E4UFNCdmNIUnBiMjV6TG1OdmJuUmxlSFFwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQzh2SUVWUFJpQnBjeUJwYm5OcFpHVWdkR2hwY3lCb2RXNXJYRzRnSUNBZ0lDQWdJQ0FnSUNCc1pYUWdiMnhrUlU5R1RtVjNiR2x1WlNBOUlDZ29MMXhjYmlRdktTNTBaWE4wS0c5c1pGTjBjaWtwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdiR1YwSUc1bGQwVlBSazVsZDJ4cGJtVWdQU0FvS0M5Y1hHNGtMeWt1ZEdWemRDaHVaWGRUZEhJcEtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUd4bGRDQnViMDVzUW1WbWIzSmxRV1JrY3lBOUlHeHBibVZ6TG14bGJtZDBhQ0E5UFNBd0lDWW1JR04xY2xKaGJtZGxMbXhsYm1kMGFDQStJR2gxYm1zdWIyeGtUR2x1WlhNN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb0lXOXNaRVZQUms1bGQyeHBibVVnSmlZZ2JtOU9iRUpsWm05eVpVRmtaSE1nSmlZZ2IyeGtVM1J5TG14bGJtZDBhQ0ErSURBcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0x5OGdjM0JsWTJsaGJDQmpZWE5sT2lCdmJHUWdhR0Z6SUc1dklHVnZiQ0JoYm1RZ2JtOGdkSEpoYVd4cGJtY2dZMjl1ZEdWNGREc2dibTh0Ym13Z1kyRnVJR1Z1WkNCMWNDQmlaV1p2Y21VZ1lXUmtjMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQXZMeUJvYjNkbGRtVnlMQ0JwWmlCMGFHVWdiMnhrSUdacGJHVWdhWE1nWlcxd2RIa3NJR1J2SUc1dmRDQnZkWFJ3ZFhRZ2RHaGxJRzV2TFc1c0lHeHBibVZjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdZM1Z5VW1GdVoyVXVjM0JzYVdObEtHaDFibXN1YjJ4a1RHbHVaWE1zSURBc0lDZGNYRnhjSUU1dklHNWxkMnhwYm1VZ1lYUWdaVzVrSUc5bUlHWnBiR1VuS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2dvSVc5c1pFVlBSazVsZDJ4cGJtVWdKaVlnSVc1dlRteENaV1p2Y21WQlpHUnpLU0I4ZkNBaGJtVjNSVTlHVG1WM2JHbHVaU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0JqZFhKU1lXNW5aUzV3ZFhOb0tDZGNYRnhjSUU1dklHNWxkMnhwYm1VZ1lYUWdaVzVrSUc5bUlHWnBiR1VuS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdhSFZ1YTNNdWNIVnphQ2hvZFc1cktUdGNibHh1SUNBZ0lDQWdJQ0FnSUc5c1pGSmhibWRsVTNSaGNuUWdQU0F3TzF4dUlDQWdJQ0FnSUNBZ0lHNWxkMUpoYm1kbFUzUmhjblFnUFNBd08xeHVJQ0FnSUNBZ0lDQWdJR04xY2xKaGJtZGxJRDBnVzEwN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lIMWNiaUFnSUNBZ0lHOXNaRXhwYm1VZ0t6MGdiR2x1WlhNdWJHVnVaM1JvTzF4dUlDQWdJQ0FnYm1WM1RHbHVaU0FyUFNCc2FXNWxjeTVzWlc1bmRHZzdYRzRnSUNBZ2ZWeHVJQ0I5WEc1Y2JpQWdjbVYwZFhKdUlIdGNiaUFnSUNCdmJHUkdhV3hsVG1GdFpUb2diMnhrUm1sc1pVNWhiV1VzSUc1bGQwWnBiR1ZPWVcxbE9pQnVaWGRHYVd4bFRtRnRaU3hjYmlBZ0lDQnZiR1JJWldGa1pYSTZJRzlzWkVobFlXUmxjaXdnYm1WM1NHVmhaR1Z5T2lCdVpYZElaV0ZrWlhJc1hHNGdJQ0FnYUhWdWEzTTZJR2gxYm10elhHNGdJSDA3WEc1OVhHNWNibVY0Y0c5eWRDQm1kVzVqZEdsdmJpQm1iM0p0WVhSUVlYUmphQ2hrYVdabUtTQjdYRzRnSUdsbUlDaEJjbkpoZVM1cGMwRnljbUY1S0dScFptWXBLU0I3WEc0Z0lDQWdjbVYwZFhKdUlHUnBabVl1YldGd0tHWnZjbTFoZEZCaGRHTm9LUzVxYjJsdUtDZGNYRzRuS1R0Y2JpQWdmVnh1WEc0Z0lHTnZibk4wSUhKbGRDQTlJRnRkTzF4dUlDQnBaaUFvWkdsbVppNXZiR1JHYVd4bFRtRnRaU0E5UFNCa2FXWm1MbTVsZDBacGJHVk9ZVzFsS1NCN1hHNGdJQ0FnY21WMExuQjFjMmdvSjBsdVpHVjRPaUFuSUNzZ1pHbG1aaTV2YkdSR2FXeGxUbUZ0WlNrN1hHNGdJSDFjYmlBZ2NtVjBMbkIxYzJnb0p6MDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDBuS1R0Y2JpQWdjbVYwTG5CMWMyZ29KeTB0TFNBbklDc2daR2xtWmk1dmJHUkdhV3hsVG1GdFpTQXJJQ2gwZVhCbGIyWWdaR2xtWmk1dmJHUklaV0ZrWlhJZ1BUMDlJQ2QxYm1SbFptbHVaV1FuSUQ4Z0p5Y2dPaUFuWEZ4MEp5QXJJR1JwWm1ZdWIyeGtTR1ZoWkdWeUtTazdYRzRnSUhKbGRDNXdkWE5vS0Njckt5c2dKeUFySUdScFptWXVibVYzUm1sc1pVNWhiV1VnS3lBb2RIbHdaVzltSUdScFptWXVibVYzU0dWaFpHVnlJRDA5UFNBbmRXNWtaV1pwYm1Wa0p5QS9JQ2NuSURvZ0oxeGNkQ2NnS3lCa2FXWm1MbTVsZDBobFlXUmxjaWtwTzF4dVhHNGdJR1p2Y2lBb2JHVjBJR2tnUFNBd095QnBJRHdnWkdsbVppNW9kVzVyY3k1c1pXNW5kR2c3SUdrckt5a2dlMXh1SUNBZ0lHTnZibk4wSUdoMWJtc2dQU0JrYVdabUxtaDFibXR6VzJsZE8xeHVJQ0FnSUM4dklGVnVhV1pwWldRZ1JHbG1aaUJHYjNKdFlYUWdjWFZwY21zNklFbG1JSFJvWlNCamFIVnVheUJ6YVhwbElHbHpJREFzWEc0Z0lDQWdMeThnZEdobElHWnBjbk4wSUc1MWJXSmxjaUJwY3lCdmJtVWdiRzkzWlhJZ2RHaGhiaUJ2Ym1VZ2QyOTFiR1FnWlhod1pXTjBMbHh1SUNBZ0lDOHZJR2gwZEhCek9pOHZkM2QzTG1GeWRHbHRZUzVqYjIwdmQyVmliRzluY3k5MmFXVjNjRzl6ZEM1cWMzQS9kR2h5WldGa1BURTJOREk1TTF4dUlDQWdJR2xtSUNob2RXNXJMbTlzWkV4cGJtVnpJRDA5UFNBd0tTQjdYRzRnSUNBZ0lDQm9kVzVyTG05c1pGTjBZWEowSUMwOUlERTdYRzRnSUNBZ2ZWeHVJQ0FnSUdsbUlDaG9kVzVyTG01bGQweHBibVZ6SUQwOVBTQXdLU0I3WEc0Z0lDQWdJQ0JvZFc1ckxtNWxkMU4wWVhKMElDMDlJREU3WEc0Z0lDQWdmVnh1SUNBZ0lISmxkQzV3ZFhOb0tGeHVJQ0FnSUNBZ0owQkFJQzBuSUNzZ2FIVnVheTV2YkdSVGRHRnlkQ0FySUNjc0p5QXJJR2gxYm1zdWIyeGtUR2x1WlhOY2JpQWdJQ0FnSUNzZ0p5QXJKeUFySUdoMWJtc3VibVYzVTNSaGNuUWdLeUFuTENjZ0t5Qm9kVzVyTG01bGQweHBibVZ6WEc0Z0lDQWdJQ0FySUNjZ1FFQW5YRzRnSUNBZ0tUdGNiaUFnSUNCeVpYUXVjSFZ6YUM1aGNIQnNlU2h5WlhRc0lHaDFibXN1YkdsdVpYTXBPMXh1SUNCOVhHNWNiaUFnY21WMGRYSnVJSEpsZEM1cWIybHVLQ2RjWEc0bktTQXJJQ2RjWEc0bk8xeHVmVnh1WEc1bGVIQnZjblFnWm5WdVkzUnBiMjRnWTNKbFlYUmxWSGR2Um1sc1pYTlFZWFJqYUNodmJHUkdhV3hsVG1GdFpTd2dibVYzUm1sc1pVNWhiV1VzSUc5c1pGTjBjaXdnYm1WM1UzUnlMQ0J2YkdSSVpXRmtaWElzSUc1bGQwaGxZV1JsY2l3Z2IzQjBhVzl1Y3lrZ2UxeHVJQ0J5WlhSMWNtNGdabTl5YldGMFVHRjBZMmdvYzNSeWRXTjBkWEpsWkZCaGRHTm9LRzlzWkVacGJHVk9ZVzFsTENCdVpYZEdhV3hsVG1GdFpTd2diMnhrVTNSeUxDQnVaWGRUZEhJc0lHOXNaRWhsWVdSbGNpd2dibVYzU0dWaFpHVnlMQ0J2Y0hScGIyNXpLU2s3WEc1OVhHNWNibVY0Y0c5eWRDQm1kVzVqZEdsdmJpQmpjbVZoZEdWUVlYUmphQ2htYVd4bFRtRnRaU3dnYjJ4a1UzUnlMQ0J1WlhkVGRISXNJRzlzWkVobFlXUmxjaXdnYm1WM1NHVmhaR1Z5TENCdmNIUnBiMjV6S1NCN1hHNGdJSEpsZEhWeWJpQmpjbVZoZEdWVWQyOUdhV3hsYzFCaGRHTm9LR1pwYkdWT1lXMWxMQ0JtYVd4bFRtRnRaU3dnYjJ4a1UzUnlMQ0J1WlhkVGRISXNJRzlzWkVobFlXUmxjaXdnYm1WM1NHVmhaR1Z5TENCdmNIUnBiMjV6S1R0Y2JuMWNiaUpkZlE9PVxuIiwgIi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cblwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5hcnJheUVxdWFsID0gYXJyYXlFcXVhbDtcbmV4cG9ydHMuYXJyYXlTdGFydHNXaXRoID0gYXJyYXlTdGFydHNXaXRoO1xuXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuZnVuY3Rpb24gYXJyYXlFcXVhbChhLCBiKSB7XG4gIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gYXJyYXlTdGFydHNXaXRoKGEsIGIpO1xufVxuXG5mdW5jdGlvbiBhcnJheVN0YXJ0c1dpdGgoYXJyYXksIHN0YXJ0KSB7XG4gIGlmIChzdGFydC5sZW5ndGggPiBhcnJheS5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0YXJ0Lmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHN0YXJ0W2ldICE9PSBhcnJheVtpXSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMM055WXk5MWRHbHNMMkZ5Y21GNUxtcHpJbDBzSW01aGJXVnpJanBiSW1GeWNtRjVSWEYxWVd3aUxDSmhJaXdpWWlJc0lteGxibWQwYUNJc0ltRnljbUY1VTNSaGNuUnpWMmwwYUNJc0ltRnljbUY1SWl3aWMzUmhjblFpTENKcElsMHNJbTFoY0hCcGJtZHpJam9pT3pzN096czdPenM3TzBGQlFVOHNVMEZCVTBFc1ZVRkJWQ3hEUVVGdlFrTXNRMEZCY0VJc1JVRkJkVUpETEVOQlFYWkNMRVZCUVRCQ08wRkJReTlDTEUxQlFVbEVMRU5CUVVNc1EwRkJRMFVzVFVGQlJpeExRVUZoUkN4RFFVRkRMRU5CUVVORExFMUJRVzVDTEVWQlFUSkNPMEZCUTNwQ0xGZEJRVThzUzBGQlVEdEJRVU5FT3p0QlFVVkVMRk5CUVU5RExHVkJRV1VzUTBGQlEwZ3NRMEZCUkN4RlFVRkpReXhEUVVGS0xFTkJRWFJDTzBGQlEwUTdPMEZCUlUwc1UwRkJVMFVzWlVGQlZDeERRVUY1UWtNc1MwRkJla0lzUlVGQlowTkRMRXRCUVdoRExFVkJRWFZETzBGQlF6VkRMRTFCUVVsQkxFdEJRVXNzUTBGQlEwZ3NUVUZCVGl4SFFVRmxSU3hMUVVGTExFTkJRVU5HTEUxQlFYcENMRVZCUVdsRE8wRkJReTlDTEZkQlFVOHNTMEZCVUR0QlFVTkVPenRCUVVWRUxFOUJRVXNzU1VGQlNVa3NRMEZCUXl4SFFVRkhMRU5CUVdJc1JVRkJaMEpCTEVOQlFVTXNSMEZCUjBRc1MwRkJTeXhEUVVGRFNDeE5RVUV4UWl4RlFVRnJRMGtzUTBGQlF5eEZRVUZ1UXl4RlFVRjFRenRCUVVOeVF5eFJRVUZKUkN4TFFVRkxMRU5CUVVORExFTkJRVVFzUTBGQlRDeExRVUZoUml4TFFVRkxMRU5CUVVORkxFTkJRVVFzUTBGQmRFSXNSVUZCTWtJN1FVRkRla0lzWVVGQlR5eExRVUZRTzBGQlEwUTdRVUZEUmpzN1FVRkZSQ3hUUVVGUExFbEJRVkE3UVVGRFJDSXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJbVY0Y0c5eWRDQm1kVzVqZEdsdmJpQmhjbkpoZVVWeGRXRnNLR0VzSUdJcElIdGNiaUFnYVdZZ0tHRXViR1Z1WjNSb0lDRTlQU0JpTG14bGJtZDBhQ2tnZTF4dUlDQWdJSEpsZEhWeWJpQm1ZV3h6WlR0Y2JpQWdmVnh1WEc0Z0lISmxkSFZ5YmlCaGNuSmhlVk4wWVhKMGMxZHBkR2dvWVN3Z1lpazdYRzU5WEc1Y2JtVjRjRzl5ZENCbWRXNWpkR2x2YmlCaGNuSmhlVk4wWVhKMGMxZHBkR2dvWVhKeVlYa3NJSE4wWVhKMEtTQjdYRzRnSUdsbUlDaHpkR0Z5ZEM1c1pXNW5kR2dnUGlCaGNuSmhlUzVzWlc1bmRHZ3BJSHRjYmlBZ0lDQnlaWFIxY200Z1ptRnNjMlU3WEc0Z0lIMWNibHh1SUNCbWIzSWdLR3hsZENCcElEMGdNRHNnYVNBOElITjBZWEowTG14bGJtZDBhRHNnYVNzcktTQjdYRzRnSUNBZ2FXWWdLSE4wWVhKMFcybGRJQ0U5UFNCaGNuSmhlVnRwWFNrZ2UxeHVJQ0FnSUNBZ2NtVjBkWEp1SUdaaGJITmxPMXh1SUNBZ0lIMWNiaUFnZlZ4dVhHNGdJSEpsZEhWeWJpQjBjblZsTzF4dWZWeHVJbDE5XG4iLCAiLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmNhbGNMaW5lQ291bnQgPSBjYWxjTGluZUNvdW50O1xuZXhwb3J0cy5tZXJnZSA9IG1lcmdlO1xuXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xudmFyXG4vKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5fY3JlYXRlID0gcmVxdWlyZShcIi4vY3JlYXRlXCIpXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuO1xuXG52YXJcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl9wYXJzZSA9IHJlcXVpcmUoXCIuL3BhcnNlXCIpXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuO1xuXG52YXJcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl9hcnJheSA9IHJlcXVpcmUoXCIuLi91dGlsL2FycmF5XCIpXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuO1xuXG4vKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovIGZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgcmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfbm9uSXRlcmFibGVTcHJlYWQoKTsgfVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHsgaWYgKHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChpdGVyKSkgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7IH1cblxuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkoYXJyKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbmZ1bmN0aW9uIGNhbGNMaW5lQ291bnQoaHVuaykge1xuICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gIHZhciBfY2FsY09sZE5ld0xpbmVDb3VudCA9XG4gIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gIGNhbGNPbGROZXdMaW5lQ291bnQoaHVuay5saW5lcyksXG4gICAgICBvbGRMaW5lcyA9IF9jYWxjT2xkTmV3TGluZUNvdW50Lm9sZExpbmVzLFxuICAgICAgbmV3TGluZXMgPSBfY2FsY09sZE5ld0xpbmVDb3VudC5uZXdMaW5lcztcblxuICBpZiAob2xkTGluZXMgIT09IHVuZGVmaW5lZCkge1xuICAgIGh1bmsub2xkTGluZXMgPSBvbGRMaW5lcztcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgaHVuay5vbGRMaW5lcztcbiAgfVxuXG4gIGlmIChuZXdMaW5lcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaHVuay5uZXdMaW5lcyA9IG5ld0xpbmVzO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBodW5rLm5ld0xpbmVzO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1lcmdlKG1pbmUsIHRoZWlycywgYmFzZSkge1xuICBtaW5lID0gbG9hZFBhdGNoKG1pbmUsIGJhc2UpO1xuICB0aGVpcnMgPSBsb2FkUGF0Y2godGhlaXJzLCBiYXNlKTtcbiAgdmFyIHJldCA9IHt9OyAvLyBGb3IgaW5kZXggd2UganVzdCBsZXQgaXQgcGFzcyB0aHJvdWdoIGFzIGl0IGRvZXNuJ3QgaGF2ZSBhbnkgbmVjZXNzYXJ5IG1lYW5pbmcuXG4gIC8vIExlYXZpbmcgc2FuaXR5IGNoZWNrcyBvbiB0aGlzIHRvIHRoZSBBUEkgY29uc3VtZXIgdGhhdCBtYXkga25vdyBtb3JlIGFib3V0IHRoZVxuICAvLyBtZWFuaW5nIGluIHRoZWlyIG93biBjb250ZXh0LlxuXG4gIGlmIChtaW5lLmluZGV4IHx8IHRoZWlycy5pbmRleCkge1xuICAgIHJldC5pbmRleCA9IG1pbmUuaW5kZXggfHwgdGhlaXJzLmluZGV4O1xuICB9XG5cbiAgaWYgKG1pbmUubmV3RmlsZU5hbWUgfHwgdGhlaXJzLm5ld0ZpbGVOYW1lKSB7XG4gICAgaWYgKCFmaWxlTmFtZUNoYW5nZWQobWluZSkpIHtcbiAgICAgIC8vIE5vIGhlYWRlciBvciBubyBjaGFuZ2UgaW4gb3VycywgdXNlIHRoZWlycyAoYW5kIG91cnMgaWYgdGhlaXJzIGRvZXMgbm90IGV4aXN0KVxuICAgICAgcmV0Lm9sZEZpbGVOYW1lID0gdGhlaXJzLm9sZEZpbGVOYW1lIHx8IG1pbmUub2xkRmlsZU5hbWU7XG4gICAgICByZXQubmV3RmlsZU5hbWUgPSB0aGVpcnMubmV3RmlsZU5hbWUgfHwgbWluZS5uZXdGaWxlTmFtZTtcbiAgICAgIHJldC5vbGRIZWFkZXIgPSB0aGVpcnMub2xkSGVhZGVyIHx8IG1pbmUub2xkSGVhZGVyO1xuICAgICAgcmV0Lm5ld0hlYWRlciA9IHRoZWlycy5uZXdIZWFkZXIgfHwgbWluZS5uZXdIZWFkZXI7XG4gICAgfSBlbHNlIGlmICghZmlsZU5hbWVDaGFuZ2VkKHRoZWlycykpIHtcbiAgICAgIC8vIE5vIGhlYWRlciBvciBubyBjaGFuZ2UgaW4gdGhlaXJzLCB1c2Ugb3Vyc1xuICAgICAgcmV0Lm9sZEZpbGVOYW1lID0gbWluZS5vbGRGaWxlTmFtZTtcbiAgICAgIHJldC5uZXdGaWxlTmFtZSA9IG1pbmUubmV3RmlsZU5hbWU7XG4gICAgICByZXQub2xkSGVhZGVyID0gbWluZS5vbGRIZWFkZXI7XG4gICAgICByZXQubmV3SGVhZGVyID0gbWluZS5uZXdIZWFkZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEJvdGggY2hhbmdlZC4uLiBmaWd1cmUgaXQgb3V0XG4gICAgICByZXQub2xkRmlsZU5hbWUgPSBzZWxlY3RGaWVsZChyZXQsIG1pbmUub2xkRmlsZU5hbWUsIHRoZWlycy5vbGRGaWxlTmFtZSk7XG4gICAgICByZXQubmV3RmlsZU5hbWUgPSBzZWxlY3RGaWVsZChyZXQsIG1pbmUubmV3RmlsZU5hbWUsIHRoZWlycy5uZXdGaWxlTmFtZSk7XG4gICAgICByZXQub2xkSGVhZGVyID0gc2VsZWN0RmllbGQocmV0LCBtaW5lLm9sZEhlYWRlciwgdGhlaXJzLm9sZEhlYWRlcik7XG4gICAgICByZXQubmV3SGVhZGVyID0gc2VsZWN0RmllbGQocmV0LCBtaW5lLm5ld0hlYWRlciwgdGhlaXJzLm5ld0hlYWRlcik7XG4gICAgfVxuICB9XG5cbiAgcmV0Lmh1bmtzID0gW107XG4gIHZhciBtaW5lSW5kZXggPSAwLFxuICAgICAgdGhlaXJzSW5kZXggPSAwLFxuICAgICAgbWluZU9mZnNldCA9IDAsXG4gICAgICB0aGVpcnNPZmZzZXQgPSAwO1xuXG4gIHdoaWxlIChtaW5lSW5kZXggPCBtaW5lLmh1bmtzLmxlbmd0aCB8fCB0aGVpcnNJbmRleCA8IHRoZWlycy5odW5rcy5sZW5ndGgpIHtcbiAgICB2YXIgbWluZUN1cnJlbnQgPSBtaW5lLmh1bmtzW21pbmVJbmRleF0gfHwge1xuICAgICAgb2xkU3RhcnQ6IEluZmluaXR5XG4gICAgfSxcbiAgICAgICAgdGhlaXJzQ3VycmVudCA9IHRoZWlycy5odW5rc1t0aGVpcnNJbmRleF0gfHwge1xuICAgICAgb2xkU3RhcnQ6IEluZmluaXR5XG4gICAgfTtcblxuICAgIGlmIChodW5rQmVmb3JlKG1pbmVDdXJyZW50LCB0aGVpcnNDdXJyZW50KSkge1xuICAgICAgLy8gVGhpcyBwYXRjaCBkb2VzIG5vdCBvdmVybGFwIHdpdGggYW55IG9mIHRoZSBvdGhlcnMsIHlheS5cbiAgICAgIHJldC5odW5rcy5wdXNoKGNsb25lSHVuayhtaW5lQ3VycmVudCwgbWluZU9mZnNldCkpO1xuICAgICAgbWluZUluZGV4Kys7XG4gICAgICB0aGVpcnNPZmZzZXQgKz0gbWluZUN1cnJlbnQubmV3TGluZXMgLSBtaW5lQ3VycmVudC5vbGRMaW5lcztcbiAgICB9IGVsc2UgaWYgKGh1bmtCZWZvcmUodGhlaXJzQ3VycmVudCwgbWluZUN1cnJlbnQpKSB7XG4gICAgICAvLyBUaGlzIHBhdGNoIGRvZXMgbm90IG92ZXJsYXAgd2l0aCBhbnkgb2YgdGhlIG90aGVycywgeWF5LlxuICAgICAgcmV0Lmh1bmtzLnB1c2goY2xvbmVIdW5rKHRoZWlyc0N1cnJlbnQsIHRoZWlyc09mZnNldCkpO1xuICAgICAgdGhlaXJzSW5kZXgrKztcbiAgICAgIG1pbmVPZmZzZXQgKz0gdGhlaXJzQ3VycmVudC5uZXdMaW5lcyAtIHRoZWlyc0N1cnJlbnQub2xkTGluZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE92ZXJsYXAsIG1lcmdlIGFzIGJlc3Qgd2UgY2FuXG4gICAgICB2YXIgbWVyZ2VkSHVuayA9IHtcbiAgICAgICAgb2xkU3RhcnQ6IE1hdGgubWluKG1pbmVDdXJyZW50Lm9sZFN0YXJ0LCB0aGVpcnNDdXJyZW50Lm9sZFN0YXJ0KSxcbiAgICAgICAgb2xkTGluZXM6IDAsXG4gICAgICAgIG5ld1N0YXJ0OiBNYXRoLm1pbihtaW5lQ3VycmVudC5uZXdTdGFydCArIG1pbmVPZmZzZXQsIHRoZWlyc0N1cnJlbnQub2xkU3RhcnQgKyB0aGVpcnNPZmZzZXQpLFxuICAgICAgICBuZXdMaW5lczogMCxcbiAgICAgICAgbGluZXM6IFtdXG4gICAgICB9O1xuICAgICAgbWVyZ2VMaW5lcyhtZXJnZWRIdW5rLCBtaW5lQ3VycmVudC5vbGRTdGFydCwgbWluZUN1cnJlbnQubGluZXMsIHRoZWlyc0N1cnJlbnQub2xkU3RhcnQsIHRoZWlyc0N1cnJlbnQubGluZXMpO1xuICAgICAgdGhlaXJzSW5kZXgrKztcbiAgICAgIG1pbmVJbmRleCsrO1xuICAgICAgcmV0Lmh1bmtzLnB1c2gobWVyZ2VkSHVuayk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gbG9hZFBhdGNoKHBhcmFtLCBiYXNlKSB7XG4gIGlmICh0eXBlb2YgcGFyYW0gPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKC9eQEAvbS50ZXN0KHBhcmFtKSB8fCAvXkluZGV4Oi9tLnRlc3QocGFyYW0pKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICAgICAgICgwLFxuICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuXG4gICAgICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICAgICAgX3BhcnNlXG4gICAgICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gICAgICAgIC5cbiAgICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgICAgICBwYXJzZVBhdGNoKVxuICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgICAgICAocGFyYW0pWzBdXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghYmFzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdXN0IHByb3ZpZGUgYSBiYXNlIHJlZmVyZW5jZSBvciBwYXNzIGluIGEgcGF0Y2gnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgICAgKDAsXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICAgICBfY3JlYXRlXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgICAgLlxuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgICAgc3RydWN0dXJlZFBhdGNoKVxuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgICAgICh1bmRlZmluZWQsIHVuZGVmaW5lZCwgYmFzZSwgcGFyYW0pXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBwYXJhbTtcbn1cblxuZnVuY3Rpb24gZmlsZU5hbWVDaGFuZ2VkKHBhdGNoKSB7XG4gIHJldHVybiBwYXRjaC5uZXdGaWxlTmFtZSAmJiBwYXRjaC5uZXdGaWxlTmFtZSAhPT0gcGF0Y2gub2xkRmlsZU5hbWU7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdEZpZWxkKGluZGV4LCBtaW5lLCB0aGVpcnMpIHtcbiAgaWYgKG1pbmUgPT09IHRoZWlycykge1xuICAgIHJldHVybiBtaW5lO1xuICB9IGVsc2Uge1xuICAgIGluZGV4LmNvbmZsaWN0ID0gdHJ1ZTtcbiAgICByZXR1cm4ge1xuICAgICAgbWluZTogbWluZSxcbiAgICAgIHRoZWlyczogdGhlaXJzXG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBodW5rQmVmb3JlKHRlc3QsIGNoZWNrKSB7XG4gIHJldHVybiB0ZXN0Lm9sZFN0YXJ0IDwgY2hlY2sub2xkU3RhcnQgJiYgdGVzdC5vbGRTdGFydCArIHRlc3Qub2xkTGluZXMgPCBjaGVjay5vbGRTdGFydDtcbn1cblxuZnVuY3Rpb24gY2xvbmVIdW5rKGh1bmssIG9mZnNldCkge1xuICByZXR1cm4ge1xuICAgIG9sZFN0YXJ0OiBodW5rLm9sZFN0YXJ0LFxuICAgIG9sZExpbmVzOiBodW5rLm9sZExpbmVzLFxuICAgIG5ld1N0YXJ0OiBodW5rLm5ld1N0YXJ0ICsgb2Zmc2V0LFxuICAgIG5ld0xpbmVzOiBodW5rLm5ld0xpbmVzLFxuICAgIGxpbmVzOiBodW5rLmxpbmVzXG4gIH07XG59XG5cbmZ1bmN0aW9uIG1lcmdlTGluZXMoaHVuaywgbWluZU9mZnNldCwgbWluZUxpbmVzLCB0aGVpck9mZnNldCwgdGhlaXJMaW5lcykge1xuICAvLyBUaGlzIHdpbGwgZ2VuZXJhbGx5IHJlc3VsdCBpbiBhIGNvbmZsaWN0ZWQgaHVuaywgYnV0IHRoZXJlIGFyZSBjYXNlcyB3aGVyZSB0aGUgY29udGV4dFxuICAvLyBpcyB0aGUgb25seSBvdmVybGFwIHdoZXJlIHdlIGNhbiBzdWNjZXNzZnVsbHkgbWVyZ2UgdGhlIGNvbnRlbnQgaGVyZS5cbiAgdmFyIG1pbmUgPSB7XG4gICAgb2Zmc2V0OiBtaW5lT2Zmc2V0LFxuICAgIGxpbmVzOiBtaW5lTGluZXMsXG4gICAgaW5kZXg6IDBcbiAgfSxcbiAgICAgIHRoZWlyID0ge1xuICAgIG9mZnNldDogdGhlaXJPZmZzZXQsXG4gICAgbGluZXM6IHRoZWlyTGluZXMsXG4gICAgaW5kZXg6IDBcbiAgfTsgLy8gSGFuZGxlIGFueSBsZWFkaW5nIGNvbnRlbnRcblxuICBpbnNlcnRMZWFkaW5nKGh1bmssIG1pbmUsIHRoZWlyKTtcbiAgaW5zZXJ0TGVhZGluZyhodW5rLCB0aGVpciwgbWluZSk7IC8vIE5vdyBpbiB0aGUgb3ZlcmxhcCBjb250ZW50LiBTY2FuIHRocm91Z2ggYW5kIHNlbGVjdCB0aGUgYmVzdCBjaGFuZ2VzIGZyb20gZWFjaC5cblxuICB3aGlsZSAobWluZS5pbmRleCA8IG1pbmUubGluZXMubGVuZ3RoICYmIHRoZWlyLmluZGV4IDwgdGhlaXIubGluZXMubGVuZ3RoKSB7XG4gICAgdmFyIG1pbmVDdXJyZW50ID0gbWluZS5saW5lc1ttaW5lLmluZGV4XSxcbiAgICAgICAgdGhlaXJDdXJyZW50ID0gdGhlaXIubGluZXNbdGhlaXIuaW5kZXhdO1xuXG4gICAgaWYgKChtaW5lQ3VycmVudFswXSA9PT0gJy0nIHx8IG1pbmVDdXJyZW50WzBdID09PSAnKycpICYmICh0aGVpckN1cnJlbnRbMF0gPT09ICctJyB8fCB0aGVpckN1cnJlbnRbMF0gPT09ICcrJykpIHtcbiAgICAgIC8vIEJvdGggbW9kaWZpZWQgLi4uXG4gICAgICBtdXR1YWxDaGFuZ2UoaHVuaywgbWluZSwgdGhlaXIpO1xuICAgIH0gZWxzZSBpZiAobWluZUN1cnJlbnRbMF0gPT09ICcrJyAmJiB0aGVpckN1cnJlbnRbMF0gPT09ICcgJykge1xuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgICAgdmFyIF9odW5rJGxpbmVzO1xuXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgICAgLy8gTWluZSBpbnNlcnRlZFxuXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5cbiAgICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG5cbiAgICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICAgIChfaHVuayRsaW5lcyA9XG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgICAgaHVuay5saW5lcykucHVzaC5hcHBseShcbiAgICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICAgIF9odW5rJGxpbmVzXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgICAgLFxuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgICAgX3RvQ29uc3VtYWJsZUFycmF5KFxuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgICAgIGNvbGxlY3RDaGFuZ2UobWluZSkpKTtcbiAgICB9IGVsc2UgaWYgKHRoZWlyQ3VycmVudFswXSA9PT0gJysnICYmIG1pbmVDdXJyZW50WzBdID09PSAnICcpIHtcbiAgICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICAgIHZhciBfaHVuayRsaW5lczI7XG5cbiAgICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gICAgICAvLyBUaGVpcnMgaW5zZXJ0ZWRcblxuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICAgICAoX2h1bmskbGluZXMyID1cbiAgICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gICAgICBodW5rLmxpbmVzKS5wdXNoLmFwcGx5KFxuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgICAgX2h1bmskbGluZXMyXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgICAgLFxuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgICAgX3RvQ29uc3VtYWJsZUFycmF5KFxuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgICAgIGNvbGxlY3RDaGFuZ2UodGhlaXIpKSk7XG4gICAgfSBlbHNlIGlmIChtaW5lQ3VycmVudFswXSA9PT0gJy0nICYmIHRoZWlyQ3VycmVudFswXSA9PT0gJyAnKSB7XG4gICAgICAvLyBNaW5lIHJlbW92ZWQgb3IgZWRpdGVkXG4gICAgICByZW1vdmFsKGh1bmssIG1pbmUsIHRoZWlyKTtcbiAgICB9IGVsc2UgaWYgKHRoZWlyQ3VycmVudFswXSA9PT0gJy0nICYmIG1pbmVDdXJyZW50WzBdID09PSAnICcpIHtcbiAgICAgIC8vIFRoZWlyIHJlbW92ZWQgb3IgZWRpdGVkXG4gICAgICByZW1vdmFsKGh1bmssIHRoZWlyLCBtaW5lLCB0cnVlKTtcbiAgICB9IGVsc2UgaWYgKG1pbmVDdXJyZW50ID09PSB0aGVpckN1cnJlbnQpIHtcbiAgICAgIC8vIENvbnRleHQgaWRlbnRpdHlcbiAgICAgIGh1bmsubGluZXMucHVzaChtaW5lQ3VycmVudCk7XG4gICAgICBtaW5lLmluZGV4Kys7XG4gICAgICB0aGVpci5pbmRleCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDb250ZXh0IG1pc21hdGNoXG4gICAgICBjb25mbGljdChodW5rLCBjb2xsZWN0Q2hhbmdlKG1pbmUpLCBjb2xsZWN0Q2hhbmdlKHRoZWlyKSk7XG4gICAgfVxuICB9IC8vIE5vdyBwdXNoIGFueXRoaW5nIHRoYXQgbWF5IGJlIHJlbWFpbmluZ1xuXG5cbiAgaW5zZXJ0VHJhaWxpbmcoaHVuaywgbWluZSk7XG4gIGluc2VydFRyYWlsaW5nKGh1bmssIHRoZWlyKTtcbiAgY2FsY0xpbmVDb3VudChodW5rKTtcbn1cblxuZnVuY3Rpb24gbXV0dWFsQ2hhbmdlKGh1bmssIG1pbmUsIHRoZWlyKSB7XG4gIHZhciBteUNoYW5nZXMgPSBjb2xsZWN0Q2hhbmdlKG1pbmUpLFxuICAgICAgdGhlaXJDaGFuZ2VzID0gY29sbGVjdENoYW5nZSh0aGVpcik7XG5cbiAgaWYgKGFsbFJlbW92ZXMobXlDaGFuZ2VzKSAmJiBhbGxSZW1vdmVzKHRoZWlyQ2hhbmdlcykpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIHJlbW92ZSBjaGFuZ2VzIHRoYXQgYXJlIHN1cGVyc2V0cyBvZiBvbmUgYW5vdGhlclxuICAgIGlmIChcbiAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICAgKDAsXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cblxuICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICBfYXJyYXlcbiAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgIC5cbiAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICAgYXJyYXlTdGFydHNXaXRoKVxuICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gICAgKG15Q2hhbmdlcywgdGhlaXJDaGFuZ2VzKSAmJiBza2lwUmVtb3ZlU3VwZXJzZXQodGhlaXIsIG15Q2hhbmdlcywgbXlDaGFuZ2VzLmxlbmd0aCAtIHRoZWlyQ2hhbmdlcy5sZW5ndGgpKSB7XG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICAgICB2YXIgX2h1bmskbGluZXMzO1xuXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5cbiAgICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG5cbiAgICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICAgIChfaHVuayRsaW5lczMgPVxuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgICAgIGh1bmsubGluZXMpLnB1c2guYXBwbHkoXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICAgICBfaHVuayRsaW5lczNcbiAgICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gICAgICAsXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICAgICBfdG9Db25zdW1hYmxlQXJyYXkoXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgICAgbXlDaGFuZ2VzKSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKFxuICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICAoMCxcbiAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgIF9hcnJheVxuICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gICAgLlxuICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICBhcnJheVN0YXJ0c1dpdGgpXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgICAodGhlaXJDaGFuZ2VzLCBteUNoYW5nZXMpICYmIHNraXBSZW1vdmVTdXBlcnNldChtaW5lLCB0aGVpckNoYW5nZXMsIHRoZWlyQ2hhbmdlcy5sZW5ndGggLSBteUNoYW5nZXMubGVuZ3RoKSkge1xuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgICAgdmFyIF9odW5rJGxpbmVzNDtcblxuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cblxuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICAgICAoX2h1bmskbGluZXM0ID1cbiAgICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gICAgICBodW5rLmxpbmVzKS5wdXNoLmFwcGx5KFxuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgICAgX2h1bmskbGluZXM0XG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgICAgLFxuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgICAgX3RvQ29uc3VtYWJsZUFycmF5KFxuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgICAgIHRoZWlyQ2hhbmdlcykpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICB9IGVsc2UgaWYgKFxuICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICgwLFxuICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuXG4gIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgX2FycmF5XG4gIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gIC5cbiAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICBhcnJheUVxdWFsKVxuICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAobXlDaGFuZ2VzLCB0aGVpckNoYW5nZXMpKSB7XG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgIHZhciBfaHVuayRsaW5lczU7XG5cbiAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cblxuICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICAoX2h1bmskbGluZXM1ID1cbiAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgIGh1bmsubGluZXMpLnB1c2guYXBwbHkoXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgIF9odW5rJGxpbmVzNVxuICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gICAgLFxuICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICBfdG9Db25zdW1hYmxlQXJyYXkoXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgICBteUNoYW5nZXMpKTtcblxuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbmZsaWN0KGh1bmssIG15Q2hhbmdlcywgdGhlaXJDaGFuZ2VzKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZhbChodW5rLCBtaW5lLCB0aGVpciwgc3dhcCkge1xuICB2YXIgbXlDaGFuZ2VzID0gY29sbGVjdENoYW5nZShtaW5lKSxcbiAgICAgIHRoZWlyQ2hhbmdlcyA9IGNvbGxlY3RDb250ZXh0KHRoZWlyLCBteUNoYW5nZXMpO1xuXG4gIGlmICh0aGVpckNoYW5nZXMubWVyZ2VkKSB7XG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgIHZhciBfaHVuayRsaW5lczY7XG5cbiAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cblxuICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICAoX2h1bmskbGluZXM2ID1cbiAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgIGh1bmsubGluZXMpLnB1c2guYXBwbHkoXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgIF9odW5rJGxpbmVzNlxuICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gICAgLFxuICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICBfdG9Db25zdW1hYmxlQXJyYXkoXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgICB0aGVpckNoYW5nZXMubWVyZ2VkKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uZmxpY3QoaHVuaywgc3dhcCA/IHRoZWlyQ2hhbmdlcyA6IG15Q2hhbmdlcywgc3dhcCA/IG15Q2hhbmdlcyA6IHRoZWlyQ2hhbmdlcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29uZmxpY3QoaHVuaywgbWluZSwgdGhlaXIpIHtcbiAgaHVuay5jb25mbGljdCA9IHRydWU7XG4gIGh1bmsubGluZXMucHVzaCh7XG4gICAgY29uZmxpY3Q6IHRydWUsXG4gICAgbWluZTogbWluZSxcbiAgICB0aGVpcnM6IHRoZWlyXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpbnNlcnRMZWFkaW5nKGh1bmssIGluc2VydCwgdGhlaXIpIHtcbiAgd2hpbGUgKGluc2VydC5vZmZzZXQgPCB0aGVpci5vZmZzZXQgJiYgaW5zZXJ0LmluZGV4IDwgaW5zZXJ0LmxpbmVzLmxlbmd0aCkge1xuICAgIHZhciBsaW5lID0gaW5zZXJ0LmxpbmVzW2luc2VydC5pbmRleCsrXTtcbiAgICBodW5rLmxpbmVzLnB1c2gobGluZSk7XG4gICAgaW5zZXJ0Lm9mZnNldCsrO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluc2VydFRyYWlsaW5nKGh1bmssIGluc2VydCkge1xuICB3aGlsZSAoaW5zZXJ0LmluZGV4IDwgaW5zZXJ0LmxpbmVzLmxlbmd0aCkge1xuICAgIHZhciBsaW5lID0gaW5zZXJ0LmxpbmVzW2luc2VydC5pbmRleCsrXTtcbiAgICBodW5rLmxpbmVzLnB1c2gobGluZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29sbGVjdENoYW5nZShzdGF0ZSkge1xuICB2YXIgcmV0ID0gW10sXG4gICAgICBvcGVyYXRpb24gPSBzdGF0ZS5saW5lc1tzdGF0ZS5pbmRleF1bMF07XG5cbiAgd2hpbGUgKHN0YXRlLmluZGV4IDwgc3RhdGUubGluZXMubGVuZ3RoKSB7XG4gICAgdmFyIGxpbmUgPSBzdGF0ZS5saW5lc1tzdGF0ZS5pbmRleF07IC8vIEdyb3VwIGFkZGl0aW9ucyB0aGF0IGFyZSBpbW1lZGlhdGVseSBhZnRlciBzdWJ0cmFjdGlvbnMgYW5kIHRyZWF0IHRoZW0gYXMgb25lIFwiYXRvbWljXCIgbW9kaWZ5IGNoYW5nZS5cblxuICAgIGlmIChvcGVyYXRpb24gPT09ICctJyAmJiBsaW5lWzBdID09PSAnKycpIHtcbiAgICAgIG9wZXJhdGlvbiA9ICcrJztcbiAgICB9XG5cbiAgICBpZiAob3BlcmF0aW9uID09PSBsaW5lWzBdKSB7XG4gICAgICByZXQucHVzaChsaW5lKTtcbiAgICAgIHN0YXRlLmluZGV4Kys7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RDb250ZXh0KHN0YXRlLCBtYXRjaENoYW5nZXMpIHtcbiAgdmFyIGNoYW5nZXMgPSBbXSxcbiAgICAgIG1lcmdlZCA9IFtdLFxuICAgICAgbWF0Y2hJbmRleCA9IDAsXG4gICAgICBjb250ZXh0Q2hhbmdlcyA9IGZhbHNlLFxuICAgICAgY29uZmxpY3RlZCA9IGZhbHNlO1xuXG4gIHdoaWxlIChtYXRjaEluZGV4IDwgbWF0Y2hDaGFuZ2VzLmxlbmd0aCAmJiBzdGF0ZS5pbmRleCA8IHN0YXRlLmxpbmVzLmxlbmd0aCkge1xuICAgIHZhciBjaGFuZ2UgPSBzdGF0ZS5saW5lc1tzdGF0ZS5pbmRleF0sXG4gICAgICAgIG1hdGNoID0gbWF0Y2hDaGFuZ2VzW21hdGNoSW5kZXhdOyAvLyBPbmNlIHdlJ3ZlIGhpdCBvdXIgYWRkLCB0aGVuIHdlIGFyZSBkb25lXG5cbiAgICBpZiAobWF0Y2hbMF0gPT09ICcrJykge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgY29udGV4dENoYW5nZXMgPSBjb250ZXh0Q2hhbmdlcyB8fCBjaGFuZ2VbMF0gIT09ICcgJztcbiAgICBtZXJnZWQucHVzaChtYXRjaCk7XG4gICAgbWF0Y2hJbmRleCsrOyAvLyBDb25zdW1lIGFueSBhZGRpdGlvbnMgaW4gdGhlIG90aGVyIGJsb2NrIGFzIGEgY29uZmxpY3QgdG8gYXR0ZW1wdFxuICAgIC8vIHRvIHB1bGwgaW4gdGhlIHJlbWFpbmluZyBjb250ZXh0IGFmdGVyIHRoaXNcblxuICAgIGlmIChjaGFuZ2VbMF0gPT09ICcrJykge1xuICAgICAgY29uZmxpY3RlZCA9IHRydWU7XG5cbiAgICAgIHdoaWxlIChjaGFuZ2VbMF0gPT09ICcrJykge1xuICAgICAgICBjaGFuZ2VzLnB1c2goY2hhbmdlKTtcbiAgICAgICAgY2hhbmdlID0gc3RhdGUubGluZXNbKytzdGF0ZS5pbmRleF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1hdGNoLnN1YnN0cigxKSA9PT0gY2hhbmdlLnN1YnN0cigxKSkge1xuICAgICAgY2hhbmdlcy5wdXNoKGNoYW5nZSk7XG4gICAgICBzdGF0ZS5pbmRleCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25mbGljdGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoKG1hdGNoQ2hhbmdlc1ttYXRjaEluZGV4XSB8fCAnJylbMF0gPT09ICcrJyAmJiBjb250ZXh0Q2hhbmdlcykge1xuICAgIGNvbmZsaWN0ZWQgPSB0cnVlO1xuICB9XG5cbiAgaWYgKGNvbmZsaWN0ZWQpIHtcbiAgICByZXR1cm4gY2hhbmdlcztcbiAgfVxuXG4gIHdoaWxlIChtYXRjaEluZGV4IDwgbWF0Y2hDaGFuZ2VzLmxlbmd0aCkge1xuICAgIG1lcmdlZC5wdXNoKG1hdGNoQ2hhbmdlc1ttYXRjaEluZGV4KytdKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbWVyZ2VkOiBtZXJnZWQsXG4gICAgY2hhbmdlczogY2hhbmdlc1xuICB9O1xufVxuXG5mdW5jdGlvbiBhbGxSZW1vdmVzKGNoYW5nZXMpIHtcbiAgcmV0dXJuIGNoYW5nZXMucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCBjaGFuZ2UpIHtcbiAgICByZXR1cm4gcHJldiAmJiBjaGFuZ2VbMF0gPT09ICctJztcbiAgfSwgdHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIHNraXBSZW1vdmVTdXBlcnNldChzdGF0ZSwgcmVtb3ZlQ2hhbmdlcywgZGVsdGEpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWx0YTsgaSsrKSB7XG4gICAgdmFyIGNoYW5nZUNvbnRlbnQgPSByZW1vdmVDaGFuZ2VzW3JlbW92ZUNoYW5nZXMubGVuZ3RoIC0gZGVsdGEgKyBpXS5zdWJzdHIoMSk7XG5cbiAgICBpZiAoc3RhdGUubGluZXNbc3RhdGUuaW5kZXggKyBpXSAhPT0gJyAnICsgY2hhbmdlQ29udGVudCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRlLmluZGV4ICs9IGRlbHRhO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY2FsY09sZE5ld0xpbmVDb3VudChsaW5lcykge1xuICB2YXIgb2xkTGluZXMgPSAwO1xuICB2YXIgbmV3TGluZXMgPSAwO1xuICBsaW5lcy5mb3JFYWNoKGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgaWYgKHR5cGVvZiBsaW5lICE9PSAnc3RyaW5nJykge1xuICAgICAgdmFyIG15Q291bnQgPSBjYWxjT2xkTmV3TGluZUNvdW50KGxpbmUubWluZSk7XG4gICAgICB2YXIgdGhlaXJDb3VudCA9IGNhbGNPbGROZXdMaW5lQ291bnQobGluZS50aGVpcnMpO1xuXG4gICAgICBpZiAob2xkTGluZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAobXlDb3VudC5vbGRMaW5lcyA9PT0gdGhlaXJDb3VudC5vbGRMaW5lcykge1xuICAgICAgICAgIG9sZExpbmVzICs9IG15Q291bnQub2xkTGluZXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2xkTGluZXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG5ld0xpbmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKG15Q291bnQubmV3TGluZXMgPT09IHRoZWlyQ291bnQubmV3TGluZXMpIHtcbiAgICAgICAgICBuZXdMaW5lcyArPSBteUNvdW50Lm5ld0xpbmVzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld0xpbmVzID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChuZXdMaW5lcyAhPT0gdW5kZWZpbmVkICYmIChsaW5lWzBdID09PSAnKycgfHwgbGluZVswXSA9PT0gJyAnKSkge1xuICAgICAgICBuZXdMaW5lcysrO1xuICAgICAgfVxuXG4gICAgICBpZiAob2xkTGluZXMgIT09IHVuZGVmaW5lZCAmJiAobGluZVswXSA9PT0gJy0nIHx8IGxpbmVbMF0gPT09ICcgJykpIHtcbiAgICAgICAgb2xkTGluZXMrKztcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZXR1cm4ge1xuICAgIG9sZExpbmVzOiBvbGRMaW5lcyxcbiAgICBuZXdMaW5lczogbmV3TGluZXNcbiAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OXdZWFJqYUM5dFpYSm5aUzVxY3lKZExDSnVZVzFsY3lJNld5SmpZV3hqVEdsdVpVTnZkVzUwSWl3aWFIVnVheUlzSW1OaGJHTlBiR1JPWlhkTWFXNWxRMjkxYm5RaUxDSnNhVzVsY3lJc0ltOXNaRXhwYm1Weklpd2libVYzVEdsdVpYTWlMQ0oxYm1SbFptbHVaV1FpTENKdFpYSm5aU0lzSW0xcGJtVWlMQ0owYUdWcGNuTWlMQ0ppWVhObElpd2liRzloWkZCaGRHTm9JaXdpY21WMElpd2lhVzVrWlhnaUxDSnVaWGRHYVd4bFRtRnRaU0lzSW1acGJHVk9ZVzFsUTJoaGJtZGxaQ0lzSW05c1pFWnBiR1ZPWVcxbElpd2liMnhrU0dWaFpHVnlJaXdpYm1WM1NHVmhaR1Z5SWl3aWMyVnNaV04wUm1sbGJHUWlMQ0pvZFc1cmN5SXNJbTFwYm1WSmJtUmxlQ0lzSW5Sb1pXbHljMGx1WkdWNElpd2liV2x1WlU5bVpuTmxkQ0lzSW5Sb1pXbHljMDltWm5ObGRDSXNJbXhsYm1kMGFDSXNJbTFwYm1WRGRYSnlaVzUwSWl3aWIyeGtVM1JoY25RaUxDSkpibVpwYm1sMGVTSXNJblJvWldseWMwTjFjbkpsYm5RaUxDSm9kVzVyUW1WbWIzSmxJaXdpY0hWemFDSXNJbU5zYjI1bFNIVnVheUlzSW0xbGNtZGxaRWgxYm1zaUxDSk5ZWFJvSWl3aWJXbHVJaXdpYm1WM1UzUmhjblFpTENKdFpYSm5aVXhwYm1Weklpd2ljR0Z5WVcwaUxDSjBaWE4wSWl3aWNHRnljMlZRWVhSamFDSXNJa1Z5Y205eUlpd2ljM1J5ZFdOMGRYSmxaRkJoZEdOb0lpd2ljR0YwWTJnaUxDSmpiMjVtYkdsamRDSXNJbU5vWldOcklpd2liMlptYzJWMElpd2liV2x1WlV4cGJtVnpJaXdpZEdobGFYSlBabVp6WlhRaUxDSjBhR1ZwY2t4cGJtVnpJaXdpZEdobGFYSWlMQ0pwYm5ObGNuUk1aV0ZrYVc1bklpd2lkR2hsYVhKRGRYSnlaVzUwSWl3aWJYVjBkV0ZzUTJoaGJtZGxJaXdpWTI5c2JHVmpkRU5vWVc1blpTSXNJbkpsYlc5MllXd2lMQ0pwYm5ObGNuUlVjbUZwYkdsdVp5SXNJbTE1UTJoaGJtZGxjeUlzSW5Sb1pXbHlRMmhoYm1kbGN5SXNJbUZzYkZKbGJXOTJaWE1pTENKaGNuSmhlVk4wWVhKMGMxZHBkR2dpTENKemEybHdVbVZ0YjNabFUzVndaWEp6WlhRaUxDSmhjbkpoZVVWeGRXRnNJaXdpYzNkaGNDSXNJbU52Ykd4bFkzUkRiMjUwWlhoMElpd2liV1Z5WjJWa0lpd2lhVzV6WlhKMElpd2liR2x1WlNJc0luTjBZWFJsSWl3aWIzQmxjbUYwYVc5dUlpd2liV0YwWTJoRGFHRnVaMlZ6SWl3aVkyaGhibWRsY3lJc0ltMWhkR05vU1c1a1pYZ2lMQ0pqYjI1MFpYaDBRMmhoYm1kbGN5SXNJbU52Ym1ac2FXTjBaV1FpTENKamFHRnVaMlVpTENKdFlYUmphQ0lzSW5OMVluTjBjaUlzSW5KbFpIVmpaU0lzSW5CeVpYWWlMQ0p5WlcxdmRtVkRhR0Z1WjJWeklpd2laR1ZzZEdFaUxDSnBJaXdpWTJoaGJtZGxRMjl1ZEdWdWRDSXNJbVp2Y2tWaFkyZ2lMQ0p0ZVVOdmRXNTBJaXdpZEdobGFYSkRiM1Z1ZENKZExDSnRZWEJ3YVc1bmN5STZJanM3T3pzN096czdPenRCUVVGQk8wRkJRVUU3UVVGQlFUdEJRVUZCTzBGQlFVRTdPMEZCUTBFN1FVRkJRVHRCUVVGQk8wRkJRVUU3UVVGQlFUczdRVUZGUVR0QlFVRkJPMEZCUVVFN1FVRkJRVHRCUVVGQk96czdPenM3T3pzN096czdPenM3UVVGRlR5eFRRVUZUUVN4aFFVRlVMRU5CUVhWQ1F5eEpRVUYyUWl4RlFVRTJRanRCUVVGQk8wRkJRVUU3UVVGQlFUdEJRVU5NUXl4RlFVRkJRU3h0UWtGQmJVSXNRMEZCUTBRc1NVRkJTU3hEUVVGRFJTeExRVUZPTEVOQlJHUTdRVUZCUVN4TlFVTXpRa01zVVVGRU1rSXNkMEpCUXpOQ1FTeFJRVVF5UWp0QlFVRkJMRTFCUTJwQ1F5eFJRVVJwUWl4M1FrRkRha0pCTEZGQlJHbENPenRCUVVkc1F5eE5RVUZKUkN4UlFVRlJMRXRCUVV0RkxGTkJRV3BDTEVWQlFUUkNPMEZCUXpGQ1RDeEpRVUZCUVN4SlFVRkpMRU5CUVVOSExGRkJRVXdzUjBGQlowSkJMRkZCUVdoQ08wRkJRMFFzUjBGR1JDeE5RVVZQTzBGQlEwd3NWMEZCVDBnc1NVRkJTU3hEUVVGRFJ5eFJRVUZhTzBGQlEwUTdPMEZCUlVRc1RVRkJTVU1zVVVGQlVTeExRVUZMUXl4VFFVRnFRaXhGUVVFMFFqdEJRVU14UWt3c1NVRkJRVUVzU1VGQlNTeERRVUZEU1N4UlFVRk1MRWRCUVdkQ1FTeFJRVUZvUWp0QlFVTkVMRWRCUmtRc1RVRkZUenRCUVVOTUxGZEJRVTlLTEVsQlFVa3NRMEZCUTBrc1VVRkJXanRCUVVORU8wRkJRMFk3TzBGQlJVMHNVMEZCVTBVc1MwRkJWQ3hEUVVGbFF5eEpRVUZtTEVWQlFYRkNReXhOUVVGeVFpeEZRVUUyUWtNc1NVRkJOMElzUlVGQmJVTTdRVUZEZUVOR0xFVkJRVUZCTEVsQlFVa3NSMEZCUjBjc1UwRkJVeXhEUVVGRFNDeEpRVUZFTEVWQlFVOUZMRWxCUVZBc1EwRkJhRUk3UVVGRFFVUXNSVUZCUVVFc1RVRkJUU3hIUVVGSFJTeFRRVUZUTEVOQlFVTkdMRTFCUVVRc1JVRkJVME1zU1VGQlZDeERRVUZzUWp0QlFVVkJMRTFCUVVsRkxFZEJRVWNzUjBGQlJ5eEZRVUZXTEVOQlNuZERMRU5CVFhoRE8wRkJRMEU3UVVGRFFUczdRVUZEUVN4TlFVRkpTaXhKUVVGSkxFTkJRVU5MTEV0QlFVd3NTVUZCWTBvc1RVRkJUU3hEUVVGRFNTeExRVUY2UWl4RlFVRm5RenRCUVVNNVFrUXNTVUZCUVVFc1IwRkJSeXhEUVVGRFF5eExRVUZLTEVkQlFWbE1MRWxCUVVrc1EwRkJRMHNzUzBGQlRDeEpRVUZqU2l4TlFVRk5MRU5CUVVOSkxFdEJRV3BETzBGQlEwUTdPMEZCUlVRc1RVRkJTVXdzU1VGQlNTeERRVUZEVFN4WFFVRk1MRWxCUVc5Q1RDeE5RVUZOTEVOQlFVTkxMRmRCUVM5Q0xFVkJRVFJETzBGQlF6RkRMRkZCUVVrc1EwRkJRME1zWlVGQlpTeERRVUZEVUN4SlFVRkVMRU5CUVhCQ0xFVkJRVFJDTzBGQlF6RkNPMEZCUTBGSkxFMUJRVUZCTEVkQlFVY3NRMEZCUTBrc1YwRkJTaXhIUVVGclFsQXNUVUZCVFN4RFFVRkRUeXhYUVVGUUxFbEJRWE5DVWl4SlFVRkpMRU5CUVVOUkxGZEJRVGRETzBGQlEwRktMRTFCUVVGQkxFZEJRVWNzUTBGQlEwVXNWMEZCU2l4SFFVRnJRa3dzVFVGQlRTeERRVUZEU3l4WFFVRlFMRWxCUVhOQ1RpeEpRVUZKTEVOQlFVTk5MRmRCUVRkRE8wRkJRMEZHTEUxQlFVRkJMRWRCUVVjc1EwRkJRMHNzVTBGQlNpeEhRVUZuUWxJc1RVRkJUU3hEUVVGRFVTeFRRVUZRTEVsQlFXOUNWQ3hKUVVGSkxFTkJRVU5UTEZOQlFYcERPMEZCUTBGTUxFMUJRVUZCTEVkQlFVY3NRMEZCUTAwc1UwRkJTaXhIUVVGblFsUXNUVUZCVFN4RFFVRkRVeXhUUVVGUUxFbEJRVzlDVml4SlFVRkpMRU5CUVVOVkxGTkJRWHBETzBGQlEwUXNTMEZPUkN4TlFVMVBMRWxCUVVrc1EwRkJRMGdzWlVGQlpTeERRVUZEVGl4TlFVRkVMRU5CUVhCQ0xFVkJRVGhDTzBGQlEyNURPMEZCUTBGSExFMUJRVUZCTEVkQlFVY3NRMEZCUTBrc1YwRkJTaXhIUVVGclFsSXNTVUZCU1N4RFFVRkRVU3hYUVVGMlFqdEJRVU5CU2l4TlFVRkJRU3hIUVVGSExFTkJRVU5GTEZkQlFVb3NSMEZCYTBKT0xFbEJRVWtzUTBGQlEwMHNWMEZCZGtJN1FVRkRRVVlzVFVGQlFVRXNSMEZCUnl4RFFVRkRTeXhUUVVGS0xFZEJRV2RDVkN4SlFVRkpMRU5CUVVOVExGTkJRWEpDTzBGQlEwRk1MRTFCUVVGQkxFZEJRVWNzUTBGQlEwMHNVMEZCU2l4SFFVRm5RbFlzU1VGQlNTeERRVUZEVlN4VFFVRnlRanRCUVVORUxFdEJUazBzVFVGTlFUdEJRVU5NTzBGQlEwRk9MRTFCUVVGQkxFZEJRVWNzUTBGQlEwa3NWMEZCU2l4SFFVRnJRa2NzVjBGQlZ5eERRVUZEVUN4SFFVRkVMRVZCUVUxS0xFbEJRVWtzUTBGQlExRXNWMEZCV0N4RlFVRjNRbEFzVFVGQlRTeERRVUZEVHl4WFFVRXZRaXhEUVVFM1FqdEJRVU5CU2l4TlFVRkJRU3hIUVVGSExFTkJRVU5GTEZkQlFVb3NSMEZCYTBKTExGZEJRVmNzUTBGQlExQXNSMEZCUkN4RlFVRk5TaXhKUVVGSkxFTkJRVU5OTEZkQlFWZ3NSVUZCZDBKTUxFMUJRVTBzUTBGQlEwc3NWMEZCTDBJc1EwRkJOMEk3UVVGRFFVWXNUVUZCUVVFc1IwRkJSeXhEUVVGRFN5eFRRVUZLTEVkQlFXZENSU3hYUVVGWExFTkJRVU5RTEVkQlFVUXNSVUZCVFVvc1NVRkJTU3hEUVVGRFV5eFRRVUZZTEVWQlFYTkNVaXhOUVVGTkxFTkJRVU5STEZOQlFUZENMRU5CUVROQ08wRkJRMEZNTEUxQlFVRkJMRWRCUVVjc1EwRkJRMDBzVTBGQlNpeEhRVUZuUWtNc1YwRkJWeXhEUVVGRFVDeEhRVUZFTEVWQlFVMUtMRWxCUVVrc1EwRkJRMVVzVTBGQldDeEZRVUZ6UWxRc1RVRkJUU3hEUVVGRFV5eFRRVUUzUWl4RFFVRXpRanRCUVVORU8wRkJRMFk3TzBGQlJVUk9MRVZCUVVGQkxFZEJRVWNzUTBGQlExRXNTMEZCU2l4SFFVRlpMRVZCUVZvN1FVRkZRU3hOUVVGSlF5eFRRVUZUTEVkQlFVY3NRMEZCYUVJN1FVRkJRU3hOUVVOSlF5eFhRVUZYTEVkQlFVY3NRMEZFYkVJN1FVRkJRU3hOUVVWSlF5eFZRVUZWTEVkQlFVY3NRMEZHYWtJN1FVRkJRU3hOUVVkSlF5eFpRVUZaTEVkQlFVY3NRMEZJYmtJN08wRkJTMEVzVTBGQlQwZ3NVMEZCVXl4SFFVRkhZaXhKUVVGSkxFTkJRVU5aTEV0QlFVd3NRMEZCVjBzc1RVRkJka0lzU1VGQmFVTklMRmRCUVZjc1IwRkJSMklzVFVGQlRTeERRVUZEVnl4TFFVRlFMRU5CUVdGTExFMUJRVzVGTEVWQlFUSkZPMEZCUTNwRkxGRkJRVWxETEZkQlFWY3NSMEZCUjJ4Q0xFbEJRVWtzUTBGQlExa3NTMEZCVEN4RFFVRlhReXhUUVVGWUxFdEJRWGxDTzBGQlFVTk5MRTFCUVVGQkxGRkJRVkVzUlVGQlJVTTdRVUZCV0N4TFFVRXpRenRCUVVGQkxGRkJRMGxETEdGQlFXRXNSMEZCUjNCQ0xFMUJRVTBzUTBGQlExY3NTMEZCVUN4RFFVRmhSU3hYUVVGaUxFdEJRVFpDTzBGQlFVTkxMRTFCUVVGQkxGRkJRVkVzUlVGQlJVTTdRVUZCV0N4TFFVUnFSRHM3UVVGSFFTeFJRVUZKUlN4VlFVRlZMRU5CUVVOS0xGZEJRVVFzUlVGQlkwY3NZVUZCWkN4RFFVRmtMRVZCUVRSRE8wRkJRekZETzBGQlEwRnFRaXhOUVVGQlFTeEhRVUZITEVOQlFVTlJMRXRCUVVvc1EwRkJWVmNzU1VGQlZpeERRVUZsUXl4VFFVRlRMRU5CUVVOT0xGZEJRVVFzUlVGQlkwZ3NWVUZCWkN4RFFVRjRRanRCUVVOQlJpeE5RVUZCUVN4VFFVRlRPMEZCUTFSSExFMUJRVUZCTEZsQlFWa3NTVUZCU1VVc1YwRkJWeXhEUVVGRGNrSXNVVUZCV2l4SFFVRjFRbkZDTEZkQlFWY3NRMEZCUTNSQ0xGRkJRVzVFTzBGQlEwUXNTMEZNUkN4TlFVdFBMRWxCUVVrd1FpeFZRVUZWTEVOQlFVTkVMR0ZCUVVRc1JVRkJaMEpJTEZkQlFXaENMRU5CUVdRc1JVRkJORU03UVVGRGFrUTdRVUZEUVdRc1RVRkJRVUVzUjBGQlJ5eERRVUZEVVN4TFFVRktMRU5CUVZWWExFbEJRVllzUTBGQlpVTXNVMEZCVXl4RFFVRkRTQ3hoUVVGRUxFVkJRV2RDVEN4WlFVRm9RaXhEUVVGNFFqdEJRVU5CUml4TlFVRkJRU3hYUVVGWE8wRkJRMWhETEUxQlFVRkJMRlZCUVZVc1NVRkJTVTBzWVVGQllTeERRVUZEZUVJc1VVRkJaQ3hIUVVGNVFuZENMR0ZCUVdFc1EwRkJRM3BDTEZGQlFYSkVPMEZCUTBRc1MwRk1UU3hOUVV0Qk8wRkJRMHc3UVVGRFFTeFZRVUZKTmtJc1ZVRkJWU3hIUVVGSE8wRkJRMlpPTEZGQlFVRkJMRkZCUVZFc1JVRkJSVThzU1VGQlNTeERRVUZEUXl4SFFVRk1MRU5CUVZOVUxGZEJRVmNzUTBGQlEwTXNVVUZCY2tJc1JVRkJLMEpGTEdGQlFXRXNRMEZCUTBZc1VVRkJOME1zUTBGRVN6dEJRVVZtZGtJc1VVRkJRVUVzVVVGQlVTeEZRVUZGTEVOQlJrczdRVUZIWm1kRExGRkJRVUZCTEZGQlFWRXNSVUZCUlVZc1NVRkJTU3hEUVVGRFF5eEhRVUZNTEVOQlFWTlVMRmRCUVZjc1EwRkJRMVVzVVVGQldpeEhRVUYxUW1Jc1ZVRkJhRU1zUlVGQk5FTk5MR0ZCUVdFc1EwRkJRMFlzVVVGQlpDeEhRVUY1UWtnc1dVRkJja1VzUTBGSVN6dEJRVWxtYmtJc1VVRkJRVUVzVVVGQlVTeEZRVUZGTEVOQlNrczdRVUZMWmtZc1VVRkJRVUVzUzBGQlN5eEZRVUZGTzBGQlRGRXNUMEZCYWtJN1FVRlBRV3RETEUxQlFVRkJMRlZCUVZVc1EwRkJRMG9zVlVGQlJDeEZRVUZoVUN4WFFVRlhMRU5CUVVORExGRkJRWHBDTEVWQlFXMURSQ3hYUVVGWExFTkJRVU4yUWl4TFFVRXZReXhGUVVGelJEQkNMR0ZCUVdFc1EwRkJRMFlzVVVGQmNFVXNSVUZCT0VWRkxHRkJRV0VzUTBGQlF6RkNMRXRCUVRWR0xFTkJRVlk3UVVGRFFXMUNMRTFCUVVGQkxGZEJRVmM3UVVGRFdFUXNUVUZCUVVFc1UwRkJVenRCUVVWVVZDeE5RVUZCUVN4SFFVRkhMRU5CUVVOUkxFdEJRVW9zUTBGQlZWY3NTVUZCVml4RFFVRmxSU3hWUVVGbU8wRkJRMFE3UVVGRFJqczdRVUZGUkN4VFFVRlBja0lzUjBGQlVEdEJRVU5FT3p0QlFVVkVMRk5CUVZORUxGTkJRVlFzUTBGQmJVSXlRaXhMUVVGdVFpeEZRVUV3UWpWQ0xFbEJRVEZDTEVWQlFXZERPMEZCUXpsQ0xFMUJRVWtzVDBGQlR6UkNMRXRCUVZBc1MwRkJhVUlzVVVGQmNrSXNSVUZCSzBJN1FVRkROMElzVVVGQlN5eE5RVUZFTEVOQlFWTkRMRWxCUVZRc1EwRkJZMFFzUzBGQlpDeExRVUV3UWl4VlFVRkVMRU5CUVdGRExFbEJRV0lzUTBGQmEwSkVMRXRCUVd4Q0xFTkJRVGRDTEVWQlFYZEVPMEZCUTNSRUxHRkJRVTg3UVVGQlFUdEJRVUZCTzBGQlFVRTdPMEZCUVVGRk8wRkJRVUZCTzBGQlFVRkJPMEZCUVVGQk8wRkJRVUZCTzBGQlFVRkJPMEZCUVVFN1FVRkJRU3hUUVVGWFJpeExRVUZZTEVWQlFXdENMRU5CUVd4Q08wRkJRVkE3UVVGRFJEczdRVUZGUkN4UlFVRkpMRU5CUVVNMVFpeEpRVUZNTEVWQlFWYzdRVUZEVkN4WlFVRk5MRWxCUVVrclFpeExRVUZLTEVOQlFWVXNhMFJCUVZZc1EwRkJUanRCUVVORU96dEJRVU5FTEZkQlFVODdRVUZCUVR0QlFVRkJPMEZCUVVFN08wRkJRVUZETzBGQlFVRkJPMEZCUVVGQk8wRkJRVUZCTzBGQlFVRkJPMEZCUVVGQk8wRkJRVUU3UVVGQlFTeFBRVUZuUW5CRExGTkJRV2hDTEVWQlFUSkNRU3hUUVVFelFpeEZRVUZ6UTBrc1NVRkJkRU1zUlVGQk5FTTBRaXhMUVVFMVF6dEJRVUZRTzBGQlEwUTdPMEZCUlVRc1UwRkJUMEVzUzBGQlVEdEJRVU5FT3p0QlFVVkVMRk5CUVZOMlFpeGxRVUZVTEVOQlFYbENORUlzUzBGQmVrSXNSVUZCWjBNN1FVRkRPVUlzVTBGQlQwRXNTMEZCU3l4RFFVRkROMElzVjBGQlRpeEpRVUZ4UWpaQ0xFdEJRVXNzUTBGQlF6ZENMRmRCUVU0c1MwRkJjMEkyUWl4TFFVRkxMRU5CUVVNelFpeFhRVUY0UkR0QlFVTkVPenRCUVVWRUxGTkJRVk5ITEZkQlFWUXNRMEZCY1VKT0xFdEJRWEpDTEVWQlFUUkNUQ3hKUVVFMVFpeEZRVUZyUTBNc1RVRkJiRU1zUlVGQk1FTTdRVUZEZUVNc1RVRkJTVVFzU1VGQlNTeExRVUZMUXl4TlFVRmlMRVZCUVhGQ08wRkJRMjVDTEZkQlFVOUVMRWxCUVZBN1FVRkRSQ3hIUVVaRUxFMUJSVTg3UVVGRFRFc3NTVUZCUVVFc1MwRkJTeXhEUVVGREswSXNVVUZCVGl4SFFVRnBRaXhKUVVGcVFqdEJRVU5CTEZkQlFVODdRVUZCUTNCRExFMUJRVUZCTEVsQlFVa3NSVUZCU2tFc1NVRkJSRHRCUVVGUFF5eE5RVUZCUVN4TlFVRk5MRVZCUVU1Qk8wRkJRVkFzUzBGQlVEdEJRVU5FTzBGQlEwWTdPMEZCUlVRc1UwRkJVM0ZDTEZWQlFWUXNRMEZCYjBKVExFbEJRWEJDTEVWQlFUQkNUU3hMUVVFeFFpeEZRVUZwUXp0QlFVTXZRaXhUUVVGUFRpeEpRVUZKTEVOQlFVTmFMRkZCUVV3c1IwRkJaMEpyUWl4TFFVRkxMRU5CUVVOc1FpeFJRVUYwUWl4SlFVTkVXU3hKUVVGSkxFTkJRVU5hTEZGQlFVd3NSMEZCWjBKWkxFbEJRVWtzUTBGQlEyNURMRkZCUVhSQ0xFZEJRV3REZVVNc1MwRkJTeXhEUVVGRGJFSXNVVUZFTjBNN1FVRkZSRHM3UVVGRlJDeFRRVUZUU3l4VFFVRlVMRU5CUVcxQ0wwSXNTVUZCYmtJc1JVRkJlVUkyUXl4TlFVRjZRaXhGUVVGcFF6dEJRVU12UWl4VFFVRlBPMEZCUTB4dVFpeEpRVUZCUVN4UlFVRlJMRVZCUVVVeFFpeEpRVUZKTEVOQlFVTXdRaXhSUVVSV08wRkJRMjlDZGtJc1NVRkJRVUVzVVVGQlVTeEZRVUZGU0N4SlFVRkpMRU5CUVVOSExGRkJSRzVETzBGQlJVeG5ReXhKUVVGQlFTeFJRVUZSTEVWQlFVVnVReXhKUVVGSkxFTkJRVU50UXl4UlFVRk1MRWRCUVdkQ1ZTeE5RVVp5UWp0QlFVVTJRbnBETEVsQlFVRkJMRkZCUVZFc1JVRkJSVW9zU1VGQlNTeERRVUZEU1N4UlFVWTFRenRCUVVkTVJpeEpRVUZCUVN4TFFVRkxMRVZCUVVWR0xFbEJRVWtzUTBGQlEwVTdRVUZJVUN4SFFVRlFPMEZCUzBRN08wRkJSVVFzVTBGQlUydERMRlZCUVZRc1EwRkJiMEp3UXl4SlFVRndRaXhGUVVFd1FuTkNMRlZCUVRGQ0xFVkJRWE5EZDBJc1UwRkJkRU1zUlVGQmFVUkRMRmRCUVdwRUxFVkJRVGhFUXl4VlFVRTVSQ3hGUVVFd1JUdEJRVU40UlR0QlFVTkJPMEZCUTBFc1RVRkJTWHBETEVsQlFVa3NSMEZCUnp0QlFVRkRjME1zU1VGQlFVRXNUVUZCVFN4RlFVRkZka0lzVlVGQlZEdEJRVUZ4UW5CQ0xFbEJRVUZCTEV0QlFVc3NSVUZCUlRSRExGTkJRVFZDTzBGQlFYVkRiRU1zU1VGQlFVRXNTMEZCU3l4RlFVRkZPMEZCUVRsRExFZEJRVmc3UVVGQlFTeE5RVU5KY1VNc1MwRkJTeXhIUVVGSE8wRkJRVU5LTEVsQlFVRkJMRTFCUVUwc1JVRkJSVVVzVjBGQlZEdEJRVUZ6UWpkRExFbEJRVUZCTEV0QlFVc3NSVUZCUlRoRExGVkJRVGRDTzBGQlFYbERjRU1zU1VGQlFVRXNTMEZCU3l4RlFVRkZPMEZCUVdoRUxFZEJSRm9zUTBGSWQwVXNRMEZOZUVVN08wRkJRMEZ6UXl4RlFVRkJRU3hoUVVGaExFTkJRVU5zUkN4SlFVRkVMRVZCUVU5UExFbEJRVkFzUlVGQllUQkRMRXRCUVdJc1EwRkJZanRCUVVOQlF5eEZRVUZCUVN4aFFVRmhMRU5CUVVOc1JDeEpRVUZFTEVWQlFVOXBSQ3hMUVVGUUxFVkJRV014UXl4SlFVRmtMRU5CUVdJc1EwRlNkMFVzUTBGVmVFVTdPMEZCUTBFc1UwRkJUMEVzU1VGQlNTeERRVUZEU3l4TFFVRk1MRWRCUVdGTUxFbEJRVWtzUTBGQlEwd3NTMEZCVEN4RFFVRlhjMElzVFVGQmVFSXNTVUZCYTBONVFpeExRVUZMTEVOQlFVTnlReXhMUVVGT0xFZEJRV054UXl4TFFVRkxMRU5CUVVNdlF5eExRVUZPTEVOQlFWbHpRaXhOUVVGdVJTeEZRVUV5UlR0QlFVTjZSU3hSUVVGSlF5eFhRVUZYTEVkQlFVZHNRaXhKUVVGSkxFTkJRVU5NTEV0QlFVd3NRMEZCVjBzc1NVRkJTU3hEUVVGRFN5eExRVUZvUWl4RFFVRnNRanRCUVVGQkxGRkJRMGwxUXl4WlFVRlpMRWRCUVVkR0xFdEJRVXNzUTBGQlF5OURMRXRCUVU0c1EwRkJXU3RETEV0QlFVc3NRMEZCUTNKRExFdEJRV3hDTEVOQlJHNUNPenRCUVVkQkxGRkJRVWtzUTBGQlEyRXNWMEZCVnl4RFFVRkRMRU5CUVVRc1EwRkJXQ3hMUVVGdFFpeEhRVUZ1UWl4SlFVRXdRa0VzVjBGQlZ5eERRVUZETEVOQlFVUXNRMEZCV0N4TFFVRnRRaXhIUVVFNVF5eE5RVU5KTUVJc1dVRkJXU3hEUVVGRExFTkJRVVFzUTBGQldpeExRVUZ2UWl4SFFVRndRaXhKUVVFeVFrRXNXVUZCV1N4RFFVRkRMRU5CUVVRc1EwRkJXaXhMUVVGdlFpeEhRVVJ1UkN4RFFVRktMRVZCUXpaRU8wRkJRek5FTzBGQlEwRkRMRTFCUVVGQkxGbEJRVmtzUTBGQlEzQkVMRWxCUVVRc1JVRkJUMDhzU1VGQlVDeEZRVUZoTUVNc1MwRkJZaXhEUVVGYU8wRkJRMFFzUzBGS1JDeE5RVWxQTEVsQlFVbDRRaXhYUVVGWExFTkJRVU1zUTBGQlJDeERRVUZZTEV0QlFXMUNMRWRCUVc1Q0xFbEJRVEJDTUVJc1dVRkJXU3hEUVVGRExFTkJRVVFzUTBGQldpeExRVUZ2UWl4SFFVRnNSQ3hGUVVGMVJEdEJRVUZCTzBGQlFVRTdPMEZCUVVFN1FVRkROVVE3TzBGQlEwRTdPMEZCUVVFN08wRkJRVUU3UVVGQlFUdEJRVUZCTzBGQlFVRnVSQ3hOUVVGQlFTeEpRVUZKTEVOQlFVTkZMRXRCUVV3c1JVRkJWelJDTEVsQlFWZzdRVUZCUVR0QlFVRkJPMEZCUVVFN1FVRkJRVHRCUVVGQk8wRkJRVUU3UVVGQlFUdEJRVUZ2UW5WQ0xFMUJRVUZCTEdGQlFXRXNRMEZCUXpsRExFbEJRVVFzUTBGQmFrTTdRVUZEUkN4TFFVaE5MRTFCUjBFc1NVRkJTVFJETEZsQlFWa3NRMEZCUXl4RFFVRkVMRU5CUVZvc1MwRkJiMElzUjBGQmNFSXNTVUZCTWtJeFFpeFhRVUZYTEVOQlFVTXNRMEZCUkN4RFFVRllMRXRCUVcxQ0xFZEJRV3hFTEVWQlFYVkVPMEZCUVVFN1FVRkJRVHM3UVVGQlFUdEJRVU0xUkRzN1FVRkRRVHM3UVVGQlFUczdRVUZCUVR0QlFVRkJPMEZCUVVFN1FVRkJRWHBDTEUxQlFVRkJMRWxCUVVrc1EwRkJRMFVzUzBGQlRDeEZRVUZYTkVJc1NVRkJXRHRCUVVGQk8wRkJRVUU3UVVGQlFUdEJRVUZCTzBGQlFVRTdRVUZCUVR0QlFVRkJPMEZCUVc5Q2RVSXNUVUZCUVVFc1lVRkJZU3hEUVVGRFNpeExRVUZFTEVOQlFXcERPMEZCUTBRc1MwRklUU3hOUVVkQkxFbEJRVWw0UWl4WFFVRlhMRU5CUVVNc1EwRkJSQ3hEUVVGWUxFdEJRVzFDTEVkQlFXNUNMRWxCUVRCQ01FSXNXVUZCV1N4RFFVRkRMRU5CUVVRc1EwRkJXaXhMUVVGdlFpeEhRVUZzUkN4RlFVRjFSRHRCUVVNMVJEdEJRVU5CUnl4TlFVRkJRU3hQUVVGUExFTkJRVU4wUkN4SlFVRkVMRVZCUVU5UExFbEJRVkFzUlVGQllUQkRMRXRCUVdJc1EwRkJVRHRCUVVORUxFdEJTRTBzVFVGSFFTeEpRVUZKUlN4WlFVRlpMRU5CUVVNc1EwRkJSQ3hEUVVGYUxFdEJRVzlDTEVkQlFYQkNMRWxCUVRKQ01VSXNWMEZCVnl4RFFVRkRMRU5CUVVRc1EwRkJXQ3hMUVVGdFFpeEhRVUZzUkN4RlFVRjFSRHRCUVVNMVJEdEJRVU5CTmtJc1RVRkJRVUVzVDBGQlR5eERRVUZEZEVRc1NVRkJSQ3hGUVVGUGFVUXNTMEZCVUN4RlFVRmpNVU1zU1VGQlpDeEZRVUZ2UWl4SlFVRndRaXhEUVVGUU8wRkJRMFFzUzBGSVRTeE5RVWRCTEVsQlFVbHJRaXhYUVVGWExFdEJRVXN3UWl4WlFVRndRaXhGUVVGclF6dEJRVU4yUXp0QlFVTkJia1FzVFVGQlFVRXNTVUZCU1N4RFFVRkRSU3hMUVVGTUxFTkJRVmMwUWl4SlFVRllMRU5CUVdkQ1RDeFhRVUZvUWp0QlFVTkJiRUlzVFVGQlFVRXNTVUZCU1N4RFFVRkRTeXhMUVVGTU8wRkJRMEZ4UXl4TlFVRkJRU3hMUVVGTExFTkJRVU55UXl4TFFVRk9PMEZCUTBRc1MwRk1UU3hOUVV0Qk8wRkJRMHc3UVVGRFFTdENMRTFCUVVGQkxGRkJRVkVzUTBGQlF6TkRMRWxCUVVRc1JVRkJUM0ZFTEdGQlFXRXNRMEZCUXpsRExFbEJRVVFzUTBGQmNFSXNSVUZCTkVJNFF5eGhRVUZoTEVOQlFVTktMRXRCUVVRc1EwRkJla01zUTBGQlVqdEJRVU5FTzBGQlEwWXNSMEY0UTNWRkxFTkJNRU40UlRzN08wRkJRMEZOTEVWQlFVRkJMR05CUVdNc1EwRkJRM1pFTEVsQlFVUXNSVUZCVDA4c1NVRkJVQ3hEUVVGa08wRkJRMEZuUkN4RlFVRkJRU3hqUVVGakxFTkJRVU4yUkN4SlFVRkVMRVZCUVU5cFJDeExRVUZRTEVOQlFXUTdRVUZGUVd4RUxFVkJRVUZCTEdGQlFXRXNRMEZCUTBNc1NVRkJSQ3hEUVVGaU8wRkJRMFE3TzBGQlJVUXNVMEZCVTI5RUxGbEJRVlFzUTBGQmMwSndSQ3hKUVVGMFFpeEZRVUUwUWs4c1NVRkJOVUlzUlVGQmEwTXdReXhMUVVGc1F5eEZRVUY1UXp0QlFVTjJReXhOUVVGSlR5eFRRVUZUTEVkQlFVZElMR0ZCUVdFc1EwRkJRemxETEVsQlFVUXNRMEZCTjBJN1FVRkJRU3hOUVVOSmEwUXNXVUZCV1N4SFFVRkhTaXhoUVVGaExFTkJRVU5LTEV0QlFVUXNRMEZFYUVNN08wRkJSMEVzVFVGQlNWTXNWVUZCVlN4RFFVRkRSaXhUUVVGRUxFTkJRVllzU1VGQmVVSkZMRlZCUVZVc1EwRkJRMFFzV1VGQlJDeERRVUYyUXl4RlFVRjFSRHRCUVVOeVJEdEJRVU5CTzBGQlFVazdRVUZCUVR0QlFVRkJPenRCUVVGQlJUdEJRVUZCUVR0QlFVRkJRVHRCUVVGQlFUdEJRVUZCUVR0QlFVRkJRVHRCUVVGQk8wRkJRVUVzUzBGQlowSklMRk5CUVdoQ0xFVkJRVEpDUXl4WlFVRXpRaXhMUVVOSFJ5eHJRa0ZCYTBJc1EwRkJRMWdzUzBGQlJDeEZRVUZSVHl4VFFVRlNMRVZCUVcxQ1FTeFRRVUZUTEVOQlFVTm9ReXhOUVVGV0xFZEJRVzFDYVVNc1dVRkJXU3hEUVVGRGFrTXNUVUZCYmtRc1EwRkVla0lzUlVGRGNVWTdRVUZCUVR0QlFVRkJPenRCUVVGQk96dEJRVU51UmpzN1FVRkJRVHM3UVVGQlFUdEJRVUZCTzBGQlFVRTdRVUZCUVhoQ0xFMUJRVUZCTEVsQlFVa3NRMEZCUTBVc1MwRkJUQ3hGUVVGWE5FSXNTVUZCV0R0QlFVRkJPMEZCUVVFN1FVRkJRVHRCUVVGQk8wRkJRVUU3UVVGQlFUdEJRVUZCTzBGQlFXOUNNRUlzVFVGQlFVRXNVMEZCY0VJN08wRkJRMEU3UVVGRFJDeExRVXBFTEUxQlNVODdRVUZCU1R0QlFVRkJPMEZCUVVFN08wRkJRVUZITzBGQlFVRkJPMEZCUVVGQk8wRkJRVUZCTzBGQlFVRkJPMEZCUVVGQk8wRkJRVUU3UVVGQlFTeExRVUZuUWtZc1dVRkJhRUlzUlVGQk9FSkVMRk5CUVRsQ0xFdEJRMHBKTEd0Q1FVRnJRaXhEUVVGRGNrUXNTVUZCUkN4RlFVRlBhMFFzV1VGQlVDeEZRVUZ4UWtFc1dVRkJXU3hEUVVGRGFrTXNUVUZCWWl4SFFVRnpRbWRETEZOQlFWTXNRMEZCUTJoRExFMUJRWEpFTEVOQlJHeENMRVZCUTJkR08wRkJRVUU3UVVGQlFUczdRVUZCUVRzN1FVRkRja1k3TzBGQlFVRTdPMEZCUVVFN1FVRkJRVHRCUVVGQk8wRkJRVUY0UWl4TlFVRkJRU3hKUVVGSkxFTkJRVU5GTEV0QlFVd3NSVUZCVnpSQ0xFbEJRVmc3UVVGQlFUdEJRVUZCTzBGQlFVRTdRVUZCUVR0QlFVRkJPMEZCUVVFN1FVRkJRVHRCUVVGdlFqSkNMRTFCUVVGQkxGbEJRWEJDT3p0QlFVTkJPMEZCUTBRN1FVRkRSaXhIUVZoRUxFMUJWMDg3UVVGQlNUdEJRVUZCTzBGQlFVRTdPMEZCUVVGSk8wRkJRVUZCTzBGQlFVRkJPMEZCUVVGQk8wRkJRVUZCTzBGQlFVRkJPMEZCUVVFN1FVRkJRU3hIUVVGWFRDeFRRVUZZTEVWQlFYTkNReXhaUVVGMFFpeERRVUZLTEVWQlFYbERPMEZCUVVFN1FVRkJRVHM3UVVGQlFUczdRVUZET1VNN08wRkJRVUU3TzBGQlFVRTdRVUZCUVR0QlFVRkJPMEZCUVVGNlJDeEpRVUZCUVN4SlFVRkpMRU5CUVVORkxFdEJRVXdzUlVGQlZ6UkNMRWxCUVZnN1FVRkJRVHRCUVVGQk8wRkJRVUU3UVVGQlFUdEJRVUZCTzBGQlFVRTdRVUZCUVR0QlFVRnZRakJDTEVsQlFVRkJMRk5CUVhCQ096dEJRVU5CTzBGQlEwUTdPMEZCUlVSaUxFVkJRVUZCTEZGQlFWRXNRMEZCUXpORExFbEJRVVFzUlVGQlQzZEVMRk5CUVZBc1JVRkJhMEpETEZsQlFXeENMRU5CUVZJN1FVRkRSRHM3UVVGRlJDeFRRVUZUU0N4UFFVRlVMRU5CUVdsQ2RFUXNTVUZCYWtJc1JVRkJkVUpQTEVsQlFYWkNMRVZCUVRaQ01FTXNTMEZCTjBJc1JVRkJiME5oTEVsQlFYQkRMRVZCUVRCRE8wRkJRM2hETEUxQlFVbE9MRk5CUVZNc1IwRkJSMGdzWVVGQllTeERRVUZET1VNc1NVRkJSQ3hEUVVFM1FqdEJRVUZCTEUxQlEwbHJSQ3haUVVGWkxFZEJRVWROTEdOQlFXTXNRMEZCUTJRc1MwRkJSQ3hGUVVGUlR5eFRRVUZTTEVOQlJHcERPenRCUVVWQkxFMUJRVWxETEZsQlFWa3NRMEZCUTA4c1RVRkJha0lzUlVGQmVVSTdRVUZCUVR0QlFVRkJPenRCUVVGQk96dEJRVU4yUWpzN1FVRkJRVHM3UVVGQlFUdEJRVUZCTzBGQlFVRTdRVUZCUVdoRkxFbEJRVUZCTEVsQlFVa3NRMEZCUTBVc1MwRkJUQ3hGUVVGWE5FSXNTVUZCV0R0QlFVRkJPMEZCUVVFN1FVRkJRVHRCUVVGQk8wRkJRVUU3UVVGQlFUdEJRVUZCTzBGQlFXOUNNa0lzU1VGQlFVRXNXVUZCV1N4RFFVRkRUeXhOUVVGcVF6dEJRVU5FTEVkQlJrUXNUVUZGVHp0QlFVTk1ja0lzU1VGQlFVRXNVVUZCVVN4RFFVRkRNME1zU1VGQlJDeEZRVUZQT0VRc1NVRkJTU3hIUVVGSFRDeFpRVUZJTEVkQlFXdENSQ3hUUVVFM1FpeEZRVUYzUTAwc1NVRkJTU3hIUVVGSFRpeFRRVUZJTEVkQlFXVkRMRmxCUVRORUxFTkJRVkk3UVVGRFJEdEJRVU5HT3p0QlFVVkVMRk5CUVZOa0xGRkJRVlFzUTBGQmEwSXpReXhKUVVGc1FpeEZRVUYzUWs4c1NVRkJlRUlzUlVGQk9FSXdReXhMUVVFNVFpeEZRVUZ4UXp0QlFVTnVRMnBFTEVWQlFVRkJMRWxCUVVrc1EwRkJRekpETEZGQlFVd3NSMEZCWjBJc1NVRkJhRUk3UVVGRFFUTkRMRVZCUVVGQkxFbEJRVWtzUTBGQlEwVXNTMEZCVEN4RFFVRlhORUlzU1VGQldDeERRVUZuUWp0QlFVTmtZU3hKUVVGQlFTeFJRVUZSTEVWQlFVVXNTVUZFU1R0QlFVVmtjRU1zU1VGQlFVRXNTVUZCU1N4RlFVRkZRU3hKUVVaUk8wRkJSMlJETEVsQlFVRkJMRTFCUVUwc1JVRkJSWGxETzBGQlNFMHNSMEZCYUVJN1FVRkxSRHM3UVVGRlJDeFRRVUZUUXl4aFFVRlVMRU5CUVhWQ2JFUXNTVUZCZGtJc1JVRkJOa0pwUlN4TlFVRTNRaXhGUVVGeFEyaENMRXRCUVhKRExFVkJRVFJETzBGQlF6RkRMRk5CUVU5blFpeE5RVUZOTEVOQlFVTndRaXhOUVVGUUxFZEJRV2RDU1N4TFFVRkxMRU5CUVVOS0xFMUJRWFJDTEVsQlFXZERiMElzVFVGQlRTeERRVUZEY2tRc1MwRkJVQ3hIUVVGbGNVUXNUVUZCVFN4RFFVRkRMMFFzUzBGQlVDeERRVUZoYzBJc1RVRkJia1VzUlVGQk1rVTdRVUZEZWtVc1VVRkJTVEJETEVsQlFVa3NSMEZCUjBRc1RVRkJUU3hEUVVGREwwUXNTMEZCVUN4RFFVRmhLMFFzVFVGQlRTeERRVUZEY2tRc1MwRkJVQ3hGUVVGaUxFTkJRVmc3UVVGRFFWb3NTVUZCUVVFc1NVRkJTU3hEUVVGRFJTeExRVUZNTEVOQlFWYzBRaXhKUVVGWUxFTkJRV2RDYjBNc1NVRkJhRUk3UVVGRFFVUXNTVUZCUVVFc1RVRkJUU3hEUVVGRGNFSXNUVUZCVUR0QlFVTkVPMEZCUTBZN08wRkJRMFFzVTBGQlUxVXNZMEZCVkN4RFFVRjNRblpFTEVsQlFYaENMRVZCUVRoQ2FVVXNUVUZCT1VJc1JVRkJjME03UVVGRGNFTXNVMEZCVDBFc1RVRkJUU3hEUVVGRGNrUXNTMEZCVUN4SFFVRmxjVVFzVFVGQlRTeERRVUZETDBRc1MwRkJVQ3hEUVVGaGMwSXNUVUZCYmtNc1JVRkJNa003UVVGRGVrTXNVVUZCU1RCRExFbEJRVWtzUjBGQlIwUXNUVUZCVFN4RFFVRkRMMFFzUzBGQlVDeERRVUZoSzBRc1RVRkJUU3hEUVVGRGNrUXNTMEZCVUN4RlFVRmlMRU5CUVZnN1FVRkRRVm9zU1VGQlFVRXNTVUZCU1N4RFFVRkRSU3hMUVVGTUxFTkJRVmMwUWl4SlFVRllMRU5CUVdkQ2IwTXNTVUZCYUVJN1FVRkRSRHRCUVVOR096dEJRVVZFTEZOQlFWTmlMR0ZCUVZRc1EwRkJkVUpqTEV0QlFYWkNMRVZCUVRoQ08wRkJRelZDTEUxQlFVbDRSQ3hIUVVGSExFZEJRVWNzUlVGQlZqdEJRVUZCTEUxQlEwbDVSQ3hUUVVGVExFZEJRVWRFTEV0QlFVc3NRMEZCUTJwRkxFdEJRVTRzUTBGQldXbEZMRXRCUVVzc1EwRkJRM1pFTEV0QlFXeENMRVZCUVhsQ0xFTkJRWHBDTEVOQlJHaENPenRCUVVWQkxGTkJRVTkxUkN4TFFVRkxMRU5CUVVOMlJDeExRVUZPTEVkQlFXTjFSQ3hMUVVGTExFTkJRVU5xUlN4TFFVRk9MRU5CUVZselFpeE5RVUZxUXl4RlFVRjVRenRCUVVOMlF5eFJRVUZKTUVNc1NVRkJTU3hIUVVGSFF5eExRVUZMTEVOQlFVTnFSU3hMUVVGT0xFTkJRVmxwUlN4TFFVRkxMRU5CUVVOMlJDeExRVUZzUWl4RFFVRllMRU5CUkhWRExFTkJSM1pET3p0QlFVTkJMRkZCUVVsM1JDeFRRVUZUTEV0QlFVc3NSMEZCWkN4SlFVRnhRa1lzU1VGQlNTeERRVUZETEVOQlFVUXNRMEZCU2l4TFFVRlpMRWRCUVhKRExFVkJRVEJETzBGQlEzaERSU3hOUVVGQlFTeFRRVUZUTEVkQlFVY3NSMEZCV2p0QlFVTkVPenRCUVVWRUxGRkJRVWxCTEZOQlFWTXNTMEZCUzBZc1NVRkJTU3hEUVVGRExFTkJRVVFzUTBGQmRFSXNSVUZCTWtJN1FVRkRla0oyUkN4TlFVRkJRU3hIUVVGSExFTkJRVU50UWl4SlFVRktMRU5CUVZOdlF5eEpRVUZVTzBGQlEwRkRMRTFCUVVGQkxFdEJRVXNzUTBGQlEzWkVMRXRCUVU0N1FVRkRSQ3hMUVVoRUxFMUJSMDg3UVVGRFREdEJRVU5FTzBGQlEwWTdPMEZCUlVRc1UwRkJUMFFzUjBGQlVEdEJRVU5FT3p0QlFVTkVMRk5CUVZOdlJDeGpRVUZVTEVOQlFYZENTU3hMUVVGNFFpeEZRVUVyUWtVc1dVRkJMMElzUlVGQk5rTTdRVUZETTBNc1RVRkJTVU1zVDBGQlR5eEhRVUZITEVWQlFXUTdRVUZCUVN4TlFVTkpUaXhOUVVGTkxFZEJRVWNzUlVGRVlqdEJRVUZCTEUxQlJVbFBMRlZCUVZVc1IwRkJSeXhEUVVacVFqdEJRVUZCTEUxQlIwbERMR05CUVdNc1IwRkJSeXhMUVVoeVFqdEJRVUZCTEUxQlNVbERMRlZCUVZVc1IwRkJSeXhMUVVwcVFqczdRVUZMUVN4VFFVRlBSaXhWUVVGVkxFZEJRVWRHTEZsQlFWa3NRMEZCUXpkRExFMUJRVEZDTEVsQlEwVXlReXhMUVVGTExFTkJRVU4yUkN4TFFVRk9MRWRCUVdOMVJDeExRVUZMTEVOQlFVTnFSU3hMUVVGT0xFTkJRVmx6UWl4TlFVUnVReXhGUVVNeVF6dEJRVU42UXl4UlFVRkphMFFzVFVGQlRTeEhRVUZIVUN4TFFVRkxMRU5CUVVOcVJTeExRVUZPTEVOQlFWbHBSU3hMUVVGTExFTkJRVU4yUkN4TFFVRnNRaXhEUVVGaU8wRkJRVUVzVVVGRFNTdEVMRXRCUVVzc1IwRkJSMDRzV1VGQldTeERRVUZEUlN4VlFVRkVMRU5CUkhoQ0xFTkJSSGxETEVOQlNYcERPenRCUVVOQkxGRkJRVWxKTEV0QlFVc3NRMEZCUXl4RFFVRkVMRU5CUVV3c1MwRkJZU3hIUVVGcVFpeEZRVUZ6UWp0QlFVTndRanRCUVVORU96dEJRVVZFU0N4SlFVRkJRU3hqUVVGakxFZEJRVWRCTEdOQlFXTXNTVUZCU1VVc1RVRkJUU3hEUVVGRExFTkJRVVFzUTBGQlRpeExRVUZqTEVkQlFXcEVPMEZCUlVGV0xFbEJRVUZCTEUxQlFVMHNRMEZCUTJ4RExFbEJRVkFzUTBGQldUWkRMRXRCUVZvN1FVRkRRVW9zU1VGQlFVRXNWVUZCVlN4SFFWb3JRaXhEUVdONlF6dEJRVU5CT3p0QlFVTkJMRkZCUVVsSExFMUJRVTBzUTBGQlF5eERRVUZFTEVOQlFVNHNTMEZCWXl4SFFVRnNRaXhGUVVGMVFqdEJRVU55UWtRc1RVRkJRVUVzVlVGQlZTeEhRVUZITEVsQlFXSTdPMEZCUlVFc1lVRkJUME1zVFVGQlRTeERRVUZETEVOQlFVUXNRMEZCVGl4TFFVRmpMRWRCUVhKQ0xFVkJRVEJDTzBGQlEzaENTaXhSUVVGQlFTeFBRVUZQTEVOQlFVTjRReXhKUVVGU0xFTkJRV0UwUXl4TlFVRmlPMEZCUTBGQkxGRkJRVUZCTEUxQlFVMHNSMEZCUjFBc1MwRkJTeXhEUVVGRGFrVXNTMEZCVGl4RFFVRlpMRVZCUVVWcFJTeExRVUZMTEVOQlFVTjJSQ3hMUVVGd1FpeERRVUZVTzBGQlEwUTdRVUZEUmpzN1FVRkZSQ3hSUVVGSkswUXNTMEZCU3l4RFFVRkRReXhOUVVGT0xFTkJRV0VzUTBGQllpeE5RVUZ2UWtZc1RVRkJUU3hEUVVGRFJTeE5RVUZRTEVOQlFXTXNRMEZCWkN4RFFVRjRRaXhGUVVFd1F6dEJRVU40UTA0c1RVRkJRVUVzVDBGQlR5eERRVUZEZUVNc1NVRkJVaXhEUVVGaE5FTXNUVUZCWWp0QlFVTkJVQ3hOUVVGQlFTeExRVUZMTEVOQlFVTjJSQ3hMUVVGT08wRkJRMFFzUzBGSVJDeE5RVWRQTzBGQlEwdzJSQ3hOUVVGQlFTeFZRVUZWTEVkQlFVY3NTVUZCWWp0QlFVTkVPMEZCUTBZN08wRkJSVVFzVFVGQlNTeERRVUZEU2l4WlFVRlpMRU5CUVVORkxGVkJRVVFzUTBGQldpeEpRVUUwUWl4RlFVRTNRaXhGUVVGcFF5eERRVUZxUXl4TlFVRjNReXhIUVVGNFF5eEpRVU5IUXl4alFVUlFMRVZCUTNWQ08wRkJRM0pDUXl4SlFVRkJRU3hWUVVGVkxFZEJRVWNzU1VGQllqdEJRVU5FT3p0QlFVVkVMRTFCUVVsQkxGVkJRVW9zUlVGQlowSTdRVUZEWkN4WFFVRlBTQ3hQUVVGUU8wRkJRMFE3TzBGQlJVUXNVMEZCVDBNc1ZVRkJWU3hIUVVGSFJpeFpRVUZaTEVOQlFVTTNReXhOUVVGcVF5eEZRVUY1UXp0QlFVTjJRM2RETEVsQlFVRkJMRTFCUVUwc1EwRkJRMnhETEVsQlFWQXNRMEZCV1hWRExGbEJRVmtzUTBGQlEwVXNWVUZCVlN4RlFVRllMRU5CUVhoQ08wRkJRMFE3TzBGQlJVUXNVMEZCVHp0QlFVTk1VQ3hKUVVGQlFTeE5RVUZOTEVWQlFVNUJMRTFCUkVzN1FVRkZURTBzU1VGQlFVRXNUMEZCVHl4RlFVRlFRVHRCUVVaTExFZEJRVkE3UVVGSlJEczdRVUZGUkN4VFFVRlRXaXhWUVVGVUxFTkJRVzlDV1N4UFFVRndRaXhGUVVFMlFqdEJRVU16UWl4VFFVRlBRU3hQUVVGUExFTkJRVU5QTEUxQlFWSXNRMEZCWlN4VlFVRlRReXhKUVVGVUxFVkJRV1ZLTEUxQlFXWXNSVUZCZFVJN1FVRkRNME1zVjBGQlQwa3NTVUZCU1N4SlFVRkpTaXhOUVVGTkxFTkJRVU1zUTBGQlJDeERRVUZPTEV0QlFXTXNSMEZCTjBJN1FVRkRSQ3hIUVVaTkxFVkJSVW9zU1VGR1NTeERRVUZRTzBGQlIwUTdPMEZCUTBRc1UwRkJVMlFzYTBKQlFWUXNRMEZCTkVKUExFdEJRVFZDTEVWQlFXMURXU3hoUVVGdVF5eEZRVUZyUkVNc1MwRkJiRVFzUlVGQmVVUTdRVUZEZGtRc1QwRkJTeXhKUVVGSlF5eERRVUZETEVkQlFVY3NRMEZCWWl4RlFVRm5Ra0VzUTBGQlF5eEhRVUZIUkN4TFFVRndRaXhGUVVFeVFrTXNRMEZCUXl4RlFVRTFRaXhGUVVGblF6dEJRVU01UWl4UlFVRkpReXhoUVVGaExFZEJRVWRJTEdGQlFXRXNRMEZCUTBFc1lVRkJZU3hEUVVGRGRrUXNUVUZCWkN4SFFVRjFRbmRFTEV0QlFYWkNMRWRCUVN0Q1F5eERRVUZvUXl4RFFVRmlMRU5CUVdkRVRDeE5RVUZvUkN4RFFVRjFSQ3hEUVVGMlJDeERRVUZ3UWpzN1FVRkRRU3hSUVVGSlZDeExRVUZMTEVOQlFVTnFSU3hMUVVGT0xFTkJRVmxwUlN4TFFVRkxMRU5CUVVOMlJDeExRVUZPTEVkQlFXTnhSU3hEUVVFeFFpeE5RVUZwUXl4TlFVRk5ReXhoUVVFelF5eEZRVUV3UkR0QlFVTjRSQ3hoUVVGUExFdEJRVkE3UVVGRFJEdEJRVU5HT3p0QlFVVkVaaXhGUVVGQlFTeExRVUZMTEVOQlFVTjJSQ3hMUVVGT0xFbEJRV1Z2UlN4TFFVRm1PMEZCUTBFc1UwRkJUeXhKUVVGUU8wRkJRMFE3TzBGQlJVUXNVMEZCVXk5RkxHMUNRVUZVTEVOQlFUWkNReXhMUVVFM1FpeEZRVUZ2UXp0QlFVTnNReXhOUVVGSlF5eFJRVUZSTEVkQlFVY3NRMEZCWmp0QlFVTkJMRTFCUVVsRExGRkJRVkVzUjBGQlJ5eERRVUZtTzBGQlJVRkdMRVZCUVVGQkxFdEJRVXNzUTBGQlEybEdMRTlCUVU0c1EwRkJZeXhWUVVGVGFrSXNTVUZCVkN4RlFVRmxPMEZCUXpOQ0xGRkJRVWtzVDBGQlQwRXNTVUZCVUN4TFFVRm5RaXhSUVVGd1FpeEZRVUU0UWp0QlFVTTFRaXhWUVVGSmEwSXNUMEZCVHl4SFFVRkhia1lzYlVKQlFXMUNMRU5CUVVOcFJTeEpRVUZKTEVOQlFVTXpSQ3hKUVVGT0xFTkJRV3BETzBGQlEwRXNWVUZCU1RoRkxGVkJRVlVzUjBGQlIzQkdMRzFDUVVGdFFpeERRVUZEYVVVc1NVRkJTU3hEUVVGRE1VUXNUVUZCVGl4RFFVRndRenM3UVVGRlFTeFZRVUZKVEN4UlFVRlJMRXRCUVV0RkxGTkJRV3BDTEVWQlFUUkNPMEZCUXpGQ0xGbEJRVWtyUlN4UFFVRlBMRU5CUVVOcVJpeFJRVUZTTEV0QlFYRkNhMFlzVlVGQlZTeERRVUZEYkVZc1VVRkJjRU1zUlVGQk9FTTdRVUZETlVOQkxGVkJRVUZCTEZGQlFWRXNTVUZCU1dsR0xFOUJRVThzUTBGQlEycEdMRkZCUVhCQ08wRkJRMFFzVTBGR1JDeE5RVVZQTzBGQlEweEJMRlZCUVVGQkxGRkJRVkVzUjBGQlIwVXNVMEZCV0R0QlFVTkVPMEZCUTBZN08wRkJSVVFzVlVGQlNVUXNVVUZCVVN4TFFVRkxReXhUUVVGcVFpeEZRVUUwUWp0QlFVTXhRaXhaUVVGSkswVXNUMEZCVHl4RFFVRkRhRVlzVVVGQlVpeExRVUZ4UW1sR0xGVkJRVlVzUTBGQlEycEdMRkZCUVhCRExFVkJRVGhETzBGQlF6VkRRU3hWUVVGQlFTeFJRVUZSTEVsQlFVbG5SaXhQUVVGUExFTkJRVU5vUml4UlFVRndRanRCUVVORUxGTkJSa1FzVFVGRlR6dEJRVU5NUVN4VlFVRkJRU3hSUVVGUkxFZEJRVWRETEZOQlFWZzdRVUZEUkR0QlFVTkdPMEZCUTBZc1MwRnVRa1FzVFVGdFFrODdRVUZEVEN4VlFVRkpSQ3hSUVVGUkxFdEJRVXRETEZOQlFXSXNTMEZCTWtJMlJDeEpRVUZKTEVOQlFVTXNRMEZCUkN4RFFVRktMRXRCUVZrc1IwRkJXaXhKUVVGdFFrRXNTVUZCU1N4RFFVRkRMRU5CUVVRc1EwRkJTaXhMUVVGWkxFZEJRVEZFTEVOQlFVb3NSVUZCYjBVN1FVRkRiRVU1UkN4UlFVRkJRU3hSUVVGUk8wRkJRMVE3TzBGQlEwUXNWVUZCU1VRc1VVRkJVU3hMUVVGTFJTeFRRVUZpTEV0QlFUSkNOa1FzU1VGQlNTeERRVUZETEVOQlFVUXNRMEZCU2l4TFFVRlpMRWRCUVZvc1NVRkJiVUpCTEVsQlFVa3NRMEZCUXl4RFFVRkVMRU5CUVVvc1MwRkJXU3hIUVVFeFJDeERRVUZLTEVWQlFXOUZPMEZCUTJ4RkwwUXNVVUZCUVVFc1VVRkJVVHRCUVVOVU8wRkJRMFk3UVVGRFJpeEhRVFZDUkR0QlFUaENRU3hUUVVGUE8wRkJRVU5CTEVsQlFVRkJMRkZCUVZFc1JVRkJVa0VzVVVGQlJEdEJRVUZYUXl4SlFVRkJRU3hSUVVGUkxFVkJRVkpCTzBGQlFWZ3NSMEZCVUR0QlFVTkVJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpYVcxd2IzSjBJSHR6ZEhKMVkzUjFjbVZrVUdGMFkyaDlJR1p5YjIwZ0p5NHZZM0psWVhSbEp6dGNibWx0Y0c5eWRDQjdjR0Z5YzJWUVlYUmphSDBnWm5KdmJTQW5MaTl3WVhKelpTYzdYRzVjYm1sdGNHOXlkQ0I3WVhKeVlYbEZjWFZoYkN3Z1lYSnlZWGxUZEdGeWRITlhhWFJvZlNCbWNtOXRJQ2N1TGk5MWRHbHNMMkZ5Y21GNUp6dGNibHh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJR05oYkdOTWFXNWxRMjkxYm5Rb2FIVnVheWtnZTF4dUlDQmpiMjV6ZENCN2IyeGtUR2x1WlhNc0lHNWxkMHhwYm1WemZTQTlJR05oYkdOUGJHUk9aWGRNYVc1bFEyOTFiblFvYUhWdWF5NXNhVzVsY3lrN1hHNWNiaUFnYVdZZ0tHOXNaRXhwYm1WeklDRTlQU0IxYm1SbFptbHVaV1FwSUh0Y2JpQWdJQ0JvZFc1ckxtOXNaRXhwYm1WeklEMGdiMnhrVEdsdVpYTTdYRzRnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdaR1ZzWlhSbElHaDFibXN1YjJ4a1RHbHVaWE03WEc0Z0lIMWNibHh1SUNCcFppQW9ibVYzVEdsdVpYTWdJVDA5SUhWdVpHVm1hVzVsWkNrZ2UxeHVJQ0FnSUdoMWJtc3VibVYzVEdsdVpYTWdQU0J1WlhkTWFXNWxjenRjYmlBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0JrWld4bGRHVWdhSFZ1YXk1dVpYZE1hVzVsY3p0Y2JpQWdmVnh1ZlZ4dVhHNWxlSEJ2Y25RZ1puVnVZM1JwYjI0Z2JXVnlaMlVvYldsdVpTd2dkR2hsYVhKekxDQmlZWE5sS1NCN1hHNGdJRzFwYm1VZ1BTQnNiMkZrVUdGMFkyZ29iV2x1WlN3Z1ltRnpaU2s3WEc0Z0lIUm9aV2x5Y3lBOUlHeHZZV1JRWVhSamFDaDBhR1ZwY25Nc0lHSmhjMlVwTzF4dVhHNGdJR3hsZENCeVpYUWdQU0I3ZlR0Y2JseHVJQ0F2THlCR2IzSWdhVzVrWlhnZ2QyVWdhblZ6ZENCc1pYUWdhWFFnY0dGemN5QjBhSEp2ZFdkb0lHRnpJR2wwSUdSdlpYTnVKM1FnYUdGMlpTQmhibmtnYm1WalpYTnpZWEo1SUcxbFlXNXBibWN1WEc0Z0lDOHZJRXhsWVhacGJtY2djMkZ1YVhSNUlHTm9aV05yY3lCdmJpQjBhR2x6SUhSdklIUm9aU0JCVUVrZ1kyOXVjM1Z0WlhJZ2RHaGhkQ0J0WVhrZ2EyNXZkeUJ0YjNKbElHRmliM1YwSUhSb1pWeHVJQ0F2THlCdFpXRnVhVzVuSUdsdUlIUm9aV2x5SUc5M2JpQmpiMjUwWlhoMExseHVJQ0JwWmlBb2JXbHVaUzVwYm1SbGVDQjhmQ0IwYUdWcGNuTXVhVzVrWlhncElIdGNiaUFnSUNCeVpYUXVhVzVrWlhnZ1BTQnRhVzVsTG1sdVpHVjRJSHg4SUhSb1pXbHljeTVwYm1SbGVEdGNiaUFnZlZ4dVhHNGdJR2xtSUNodGFXNWxMbTVsZDBacGJHVk9ZVzFsSUh4OElIUm9aV2x5Y3k1dVpYZEdhV3hsVG1GdFpTa2dlMXh1SUNBZ0lHbG1JQ2doWm1sc1pVNWhiV1ZEYUdGdVoyVmtLRzFwYm1VcEtTQjdYRzRnSUNBZ0lDQXZMeUJPYnlCb1pXRmtaWElnYjNJZ2JtOGdZMmhoYm1kbElHbHVJRzkxY25Nc0lIVnpaU0IwYUdWcGNuTWdLR0Z1WkNCdmRYSnpJR2xtSUhSb1pXbHljeUJrYjJWeklHNXZkQ0JsZUdsemRDbGNiaUFnSUNBZ0lISmxkQzV2YkdSR2FXeGxUbUZ0WlNBOUlIUm9aV2x5Y3k1dmJHUkdhV3hsVG1GdFpTQjhmQ0J0YVc1bExtOXNaRVpwYkdWT1lXMWxPMXh1SUNBZ0lDQWdjbVYwTG01bGQwWnBiR1ZPWVcxbElEMGdkR2hsYVhKekxtNWxkMFpwYkdWT1lXMWxJSHg4SUcxcGJtVXVibVYzUm1sc1pVNWhiV1U3WEc0Z0lDQWdJQ0J5WlhRdWIyeGtTR1ZoWkdWeUlEMGdkR2hsYVhKekxtOXNaRWhsWVdSbGNpQjhmQ0J0YVc1bExtOXNaRWhsWVdSbGNqdGNiaUFnSUNBZ0lISmxkQzV1WlhkSVpXRmtaWElnUFNCMGFHVnBjbk11Ym1WM1NHVmhaR1Z5SUh4OElHMXBibVV1Ym1WM1NHVmhaR1Z5TzF4dUlDQWdJSDBnWld4elpTQnBaaUFvSVdacGJHVk9ZVzFsUTJoaGJtZGxaQ2gwYUdWcGNuTXBLU0I3WEc0Z0lDQWdJQ0F2THlCT2J5Qm9aV0ZrWlhJZ2IzSWdibThnWTJoaGJtZGxJR2x1SUhSb1pXbHljeXdnZFhObElHOTFjbk5jYmlBZ0lDQWdJSEpsZEM1dmJHUkdhV3hsVG1GdFpTQTlJRzFwYm1VdWIyeGtSbWxzWlU1aGJXVTdYRzRnSUNBZ0lDQnlaWFF1Ym1WM1JtbHNaVTVoYldVZ1BTQnRhVzVsTG01bGQwWnBiR1ZPWVcxbE8xeHVJQ0FnSUNBZ2NtVjBMbTlzWkVobFlXUmxjaUE5SUcxcGJtVXViMnhrU0dWaFpHVnlPMXh1SUNBZ0lDQWdjbVYwTG01bGQwaGxZV1JsY2lBOUlHMXBibVV1Ym1WM1NHVmhaR1Z5TzF4dUlDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQXZMeUJDYjNSb0lHTm9ZVzVuWldRdUxpNGdabWxuZFhKbElHbDBJRzkxZEZ4dUlDQWdJQ0FnY21WMExtOXNaRVpwYkdWT1lXMWxJRDBnYzJWc1pXTjBSbWxsYkdRb2NtVjBMQ0J0YVc1bExtOXNaRVpwYkdWT1lXMWxMQ0IwYUdWcGNuTXViMnhrUm1sc1pVNWhiV1VwTzF4dUlDQWdJQ0FnY21WMExtNWxkMFpwYkdWT1lXMWxJRDBnYzJWc1pXTjBSbWxsYkdRb2NtVjBMQ0J0YVc1bExtNWxkMFpwYkdWT1lXMWxMQ0IwYUdWcGNuTXVibVYzUm1sc1pVNWhiV1VwTzF4dUlDQWdJQ0FnY21WMExtOXNaRWhsWVdSbGNpQTlJSE5sYkdWamRFWnBaV3hrS0hKbGRDd2diV2x1WlM1dmJHUklaV0ZrWlhJc0lIUm9aV2x5Y3k1dmJHUklaV0ZrWlhJcE8xeHVJQ0FnSUNBZ2NtVjBMbTVsZDBobFlXUmxjaUE5SUhObGJHVmpkRVpwWld4a0tISmxkQ3dnYldsdVpTNXVaWGRJWldGa1pYSXNJSFJvWldseWN5NXVaWGRJWldGa1pYSXBPMXh1SUNBZ0lIMWNiaUFnZlZ4dVhHNGdJSEpsZEM1b2RXNXJjeUE5SUZ0ZE8xeHVYRzRnSUd4bGRDQnRhVzVsU1c1a1pYZ2dQU0F3TEZ4dUlDQWdJQ0FnZEdobGFYSnpTVzVrWlhnZ1BTQXdMRnh1SUNBZ0lDQWdiV2x1WlU5bVpuTmxkQ0E5SURBc1hHNGdJQ0FnSUNCMGFHVnBjbk5QWm1aelpYUWdQU0F3TzF4dVhHNGdJSGRvYVd4bElDaHRhVzVsU1c1a1pYZ2dQQ0J0YVc1bExtaDFibXR6TG14bGJtZDBhQ0I4ZkNCMGFHVnBjbk5KYm1SbGVDQThJSFJvWldseWN5NW9kVzVyY3k1c1pXNW5kR2dwSUh0Y2JpQWdJQ0JzWlhRZ2JXbHVaVU4xY25KbGJuUWdQU0J0YVc1bExtaDFibXR6VzIxcGJtVkpibVJsZUYwZ2ZId2dlMjlzWkZOMFlYSjBPaUJKYm1acGJtbDBlWDBzWEc0Z0lDQWdJQ0FnSUhSb1pXbHljME4xY25KbGJuUWdQU0IwYUdWcGNuTXVhSFZ1YTNOYmRHaGxhWEp6U1c1a1pYaGRJSHg4SUh0dmJHUlRkR0Z5ZERvZ1NXNW1hVzVwZEhsOU8xeHVYRzRnSUNBZ2FXWWdLR2gxYm10Q1pXWnZjbVVvYldsdVpVTjFjbkpsYm5Rc0lIUm9aV2x5YzBOMWNuSmxiblFwS1NCN1hHNGdJQ0FnSUNBdkx5QlVhR2x6SUhCaGRHTm9JR1J2WlhNZ2JtOTBJRzkyWlhKc1lYQWdkMmwwYUNCaGJua2diMllnZEdobElHOTBhR1Z5Y3l3Z2VXRjVMbHh1SUNBZ0lDQWdjbVYwTG1oMWJtdHpMbkIxYzJnb1kyeHZibVZJZFc1cktHMXBibVZEZFhKeVpXNTBMQ0J0YVc1bFQyWm1jMlYwS1NrN1hHNGdJQ0FnSUNCdGFXNWxTVzVrWlhnckt6dGNiaUFnSUNBZ0lIUm9aV2x5YzA5bVpuTmxkQ0FyUFNCdGFXNWxRM1Z5Y21WdWRDNXVaWGRNYVc1bGN5QXRJRzFwYm1WRGRYSnlaVzUwTG05c1pFeHBibVZ6TzF4dUlDQWdJSDBnWld4elpTQnBaaUFvYUhWdWEwSmxabTl5WlNoMGFHVnBjbk5EZFhKeVpXNTBMQ0J0YVc1bFEzVnljbVZ1ZENrcElIdGNiaUFnSUNBZ0lDOHZJRlJvYVhNZ2NHRjBZMmdnWkc5bGN5QnViM1FnYjNabGNteGhjQ0IzYVhSb0lHRnVlU0J2WmlCMGFHVWdiM1JvWlhKekxDQjVZWGt1WEc0Z0lDQWdJQ0J5WlhRdWFIVnVhM011Y0hWemFDaGpiRzl1WlVoMWJtc29kR2hsYVhKelEzVnljbVZ1ZEN3Z2RHaGxhWEp6VDJabWMyVjBLU2s3WEc0Z0lDQWdJQ0IwYUdWcGNuTkpibVJsZUNzck8xeHVJQ0FnSUNBZ2JXbHVaVTltWm5ObGRDQXJQU0IwYUdWcGNuTkRkWEp5Wlc1MExtNWxkMHhwYm1WeklDMGdkR2hsYVhKelEzVnljbVZ1ZEM1dmJHUk1hVzVsY3p0Y2JpQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdMeThnVDNabGNteGhjQ3dnYldWeVoyVWdZWE1nWW1WemRDQjNaU0JqWVc1Y2JpQWdJQ0FnSUd4bGRDQnRaWEpuWldSSWRXNXJJRDBnZTF4dUlDQWdJQ0FnSUNCdmJHUlRkR0Z5ZERvZ1RXRjBhQzV0YVc0b2JXbHVaVU4xY25KbGJuUXViMnhrVTNSaGNuUXNJSFJvWldseWMwTjFjbkpsYm5RdWIyeGtVM1JoY25RcExGeHVJQ0FnSUNBZ0lDQnZiR1JNYVc1bGN6b2dNQ3hjYmlBZ0lDQWdJQ0FnYm1WM1UzUmhjblE2SUUxaGRHZ3ViV2x1S0cxcGJtVkRkWEp5Wlc1MExtNWxkMU4wWVhKMElDc2diV2x1WlU5bVpuTmxkQ3dnZEdobGFYSnpRM1Z5Y21WdWRDNXZiR1JUZEdGeWRDQXJJSFJvWldseWMwOW1abk5sZENrc1hHNGdJQ0FnSUNBZ0lHNWxkMHhwYm1Wek9pQXdMRnh1SUNBZ0lDQWdJQ0JzYVc1bGN6b2dXMTFjYmlBZ0lDQWdJSDA3WEc0Z0lDQWdJQ0J0WlhKblpVeHBibVZ6S0cxbGNtZGxaRWgxYm1zc0lHMXBibVZEZFhKeVpXNTBMbTlzWkZOMFlYSjBMQ0J0YVc1bFEzVnljbVZ1ZEM1c2FXNWxjeXdnZEdobGFYSnpRM1Z5Y21WdWRDNXZiR1JUZEdGeWRDd2dkR2hsYVhKelEzVnljbVZ1ZEM1c2FXNWxjeWs3WEc0Z0lDQWdJQ0IwYUdWcGNuTkpibVJsZUNzck8xeHVJQ0FnSUNBZ2JXbHVaVWx1WkdWNEt5czdYRzVjYmlBZ0lDQWdJSEpsZEM1b2RXNXJjeTV3ZFhOb0tHMWxjbWRsWkVoMWJtc3BPMXh1SUNBZ0lIMWNiaUFnZlZ4dVhHNGdJSEpsZEhWeWJpQnlaWFE3WEc1OVhHNWNibVoxYm1OMGFXOXVJR3h2WVdSUVlYUmphQ2h3WVhKaGJTd2dZbUZ6WlNrZ2UxeHVJQ0JwWmlBb2RIbHdaVzltSUhCaGNtRnRJRDA5UFNBbmMzUnlhVzVuSnlrZ2UxeHVJQ0FnSUdsbUlDZ29MMTVBUUM5dEtTNTBaWE4wS0hCaGNtRnRLU0I4ZkNBb0tDOWVTVzVrWlhnNkwyMHBMblJsYzNRb2NHRnlZVzBwS1NrZ2UxeHVJQ0FnSUNBZ2NtVjBkWEp1SUhCaGNuTmxVR0YwWTJnb2NHRnlZVzBwV3pCZE8xeHVJQ0FnSUgxY2JseHVJQ0FnSUdsbUlDZ2hZbUZ6WlNrZ2UxeHVJQ0FnSUNBZ2RHaHliM2NnYm1WM0lFVnljbTl5S0NkTmRYTjBJSEJ5YjNacFpHVWdZU0JpWVhObElISmxabVZ5Wlc1alpTQnZjaUJ3WVhOeklHbHVJR0VnY0dGMFkyZ25LVHRjYmlBZ0lDQjlYRzRnSUNBZ2NtVjBkWEp1SUhOMGNuVmpkSFZ5WldSUVlYUmphQ2gxYm1SbFptbHVaV1FzSUhWdVpHVm1hVzVsWkN3Z1ltRnpaU3dnY0dGeVlXMHBPMXh1SUNCOVhHNWNiaUFnY21WMGRYSnVJSEJoY21GdE8xeHVmVnh1WEc1bWRXNWpkR2x2YmlCbWFXeGxUbUZ0WlVOb1lXNW5aV1FvY0dGMFkyZ3BJSHRjYmlBZ2NtVjBkWEp1SUhCaGRHTm9MbTVsZDBacGJHVk9ZVzFsSUNZbUlIQmhkR05vTG01bGQwWnBiR1ZPWVcxbElDRTlQU0J3WVhSamFDNXZiR1JHYVd4bFRtRnRaVHRjYm4xY2JseHVablZ1WTNScGIyNGdjMlZzWldOMFJtbGxiR1FvYVc1a1pYZ3NJRzFwYm1Vc0lIUm9aV2x5Y3lrZ2UxeHVJQ0JwWmlBb2JXbHVaU0E5UFQwZ2RHaGxhWEp6S1NCN1hHNGdJQ0FnY21WMGRYSnVJRzFwYm1VN1hHNGdJSDBnWld4elpTQjdYRzRnSUNBZ2FXNWtaWGd1WTI5dVpteHBZM1FnUFNCMGNuVmxPMXh1SUNBZ0lISmxkSFZ5YmlCN2JXbHVaU3dnZEdobGFYSnpmVHRjYmlBZ2ZWeHVmVnh1WEc1bWRXNWpkR2x2YmlCb2RXNXJRbVZtYjNKbEtIUmxjM1FzSUdOb1pXTnJLU0I3WEc0Z0lISmxkSFZ5YmlCMFpYTjBMbTlzWkZOMFlYSjBJRHdnWTJobFkyc3ViMnhrVTNSaGNuUmNiaUFnSUNBbUppQW9kR1Z6ZEM1dmJHUlRkR0Z5ZENBcklIUmxjM1F1YjJ4a1RHbHVaWE1wSUR3Z1kyaGxZMnN1YjJ4a1UzUmhjblE3WEc1OVhHNWNibVoxYm1OMGFXOXVJR05zYjI1bFNIVnVheWhvZFc1ckxDQnZabVp6WlhRcElIdGNiaUFnY21WMGRYSnVJSHRjYmlBZ0lDQnZiR1JUZEdGeWREb2dhSFZ1YXk1dmJHUlRkR0Z5ZEN3Z2IyeGtUR2x1WlhNNklHaDFibXN1YjJ4a1RHbHVaWE1zWEc0Z0lDQWdibVYzVTNSaGNuUTZJR2gxYm1zdWJtVjNVM1JoY25RZ0t5QnZabVp6WlhRc0lHNWxkMHhwYm1Wek9pQm9kVzVyTG01bGQweHBibVZ6TEZ4dUlDQWdJR3hwYm1Wek9pQm9kVzVyTG14cGJtVnpYRzRnSUgwN1hHNTlYRzVjYm1aMWJtTjBhVzl1SUcxbGNtZGxUR2x1WlhNb2FIVnVheXdnYldsdVpVOW1abk5sZEN3Z2JXbHVaVXhwYm1WekxDQjBhR1ZwY2s5bVpuTmxkQ3dnZEdobGFYSk1hVzVsY3lrZ2UxeHVJQ0F2THlCVWFHbHpJSGRwYkd3Z1oyVnVaWEpoYkd4NUlISmxjM1ZzZENCcGJpQmhJR052Ym1ac2FXTjBaV1FnYUhWdWF5d2dZblYwSUhSb1pYSmxJR0Z5WlNCallYTmxjeUIzYUdWeVpTQjBhR1VnWTI5dWRHVjRkRnh1SUNBdkx5QnBjeUIwYUdVZ2IyNXNlU0J2ZG1WeWJHRndJSGRvWlhKbElIZGxJR05oYmlCemRXTmpaWE56Wm5Wc2JIa2diV1Z5WjJVZ2RHaGxJR052Ym5SbGJuUWdhR1Z5WlM1Y2JpQWdiR1YwSUcxcGJtVWdQU0I3YjJabWMyVjBPaUJ0YVc1bFQyWm1jMlYwTENCc2FXNWxjem9nYldsdVpVeHBibVZ6TENCcGJtUmxlRG9nTUgwc1hHNGdJQ0FnSUNCMGFHVnBjaUE5SUh0dlptWnpaWFE2SUhSb1pXbHlUMlptYzJWMExDQnNhVzVsY3pvZ2RHaGxhWEpNYVc1bGN5d2dhVzVrWlhnNklEQjlPMXh1WEc0Z0lDOHZJRWhoYm1Sc1pTQmhibmtnYkdWaFpHbHVaeUJqYjI1MFpXNTBYRzRnSUdsdWMyVnlkRXhsWVdScGJtY29hSFZ1YXl3Z2JXbHVaU3dnZEdobGFYSXBPMXh1SUNCcGJuTmxjblJNWldGa2FXNW5LR2gxYm1zc0lIUm9aV2x5TENCdGFXNWxLVHRjYmx4dUlDQXZMeUJPYjNjZ2FXNGdkR2hsSUc5MlpYSnNZWEFnWTI5dWRHVnVkQzRnVTJOaGJpQjBhSEp2ZFdkb0lHRnVaQ0J6Wld4bFkzUWdkR2hsSUdKbGMzUWdZMmhoYm1kbGN5Qm1jbTl0SUdWaFkyZ3VYRzRnSUhkb2FXeGxJQ2h0YVc1bExtbHVaR1Y0SUR3Z2JXbHVaUzVzYVc1bGN5NXNaVzVuZEdnZ0ppWWdkR2hsYVhJdWFXNWtaWGdnUENCMGFHVnBjaTVzYVc1bGN5NXNaVzVuZEdncElIdGNiaUFnSUNCc1pYUWdiV2x1WlVOMWNuSmxiblFnUFNCdGFXNWxMbXhwYm1WelcyMXBibVV1YVc1a1pYaGRMRnh1SUNBZ0lDQWdJQ0IwYUdWcGNrTjFjbkpsYm5RZ1BTQjBhR1ZwY2k1c2FXNWxjMXQwYUdWcGNpNXBibVJsZUYwN1hHNWNiaUFnSUNCcFppQW9LRzFwYm1WRGRYSnlaVzUwV3pCZElEMDlQU0FuTFNjZ2ZId2diV2x1WlVOMWNuSmxiblJiTUYwZ1BUMDlJQ2NySnlsY2JpQWdJQ0FnSUNBZ0ppWWdLSFJvWldseVEzVnljbVZ1ZEZzd1hTQTlQVDBnSnkwbklIeDhJSFJvWldseVEzVnljbVZ1ZEZzd1hTQTlQVDBnSnlzbktTa2dlMXh1SUNBZ0lDQWdMeThnUW05MGFDQnRiMlJwWm1sbFpDQXVMaTVjYmlBZ0lDQWdJRzExZEhWaGJFTm9ZVzVuWlNob2RXNXJMQ0J0YVc1bExDQjBhR1ZwY2lrN1hHNGdJQ0FnZlNCbGJITmxJR2xtSUNodGFXNWxRM1Z5Y21WdWRGc3dYU0E5UFQwZ0p5c25JQ1ltSUhSb1pXbHlRM1Z5Y21WdWRGc3dYU0E5UFQwZ0p5QW5LU0I3WEc0Z0lDQWdJQ0F2THlCTmFXNWxJR2x1YzJWeWRHVmtYRzRnSUNBZ0lDQm9kVzVyTG14cGJtVnpMbkIxYzJnb0xpNHVJR052Ykd4bFkzUkRhR0Z1WjJVb2JXbHVaU2twTzF4dUlDQWdJSDBnWld4elpTQnBaaUFvZEdobGFYSkRkWEp5Wlc1MFd6QmRJRDA5UFNBbkt5Y2dKaVlnYldsdVpVTjFjbkpsYm5SYk1GMGdQVDA5SUNjZ0p5a2dlMXh1SUNBZ0lDQWdMeThnVkdobGFYSnpJR2x1YzJWeWRHVmtYRzRnSUNBZ0lDQm9kVzVyTG14cGJtVnpMbkIxYzJnb0xpNHVJR052Ykd4bFkzUkRhR0Z1WjJVb2RHaGxhWElwS1R0Y2JpQWdJQ0I5SUdWc2MyVWdhV1lnS0cxcGJtVkRkWEp5Wlc1MFd6QmRJRDA5UFNBbkxTY2dKaVlnZEdobGFYSkRkWEp5Wlc1MFd6QmRJRDA5UFNBbklDY3BJSHRjYmlBZ0lDQWdJQzh2SUUxcGJtVWdjbVZ0YjNabFpDQnZjaUJsWkdsMFpXUmNiaUFnSUNBZ0lISmxiVzkyWVd3b2FIVnVheXdnYldsdVpTd2dkR2hsYVhJcE8xeHVJQ0FnSUgwZ1pXeHpaU0JwWmlBb2RHaGxhWEpEZFhKeVpXNTBXekJkSUQwOVBTQW5MU2NnSmlZZ2JXbHVaVU4xY25KbGJuUmJNRjBnUFQwOUlDY2dKeWtnZTF4dUlDQWdJQ0FnTHk4Z1ZHaGxhWElnY21WdGIzWmxaQ0J2Y2lCbFpHbDBaV1JjYmlBZ0lDQWdJSEpsYlc5MllXd29hSFZ1YXl3Z2RHaGxhWElzSUcxcGJtVXNJSFJ5ZFdVcE8xeHVJQ0FnSUgwZ1pXeHpaU0JwWmlBb2JXbHVaVU4xY25KbGJuUWdQVDA5SUhSb1pXbHlRM1Z5Y21WdWRDa2dlMXh1SUNBZ0lDQWdMeThnUTI5dWRHVjRkQ0JwWkdWdWRHbDBlVnh1SUNBZ0lDQWdhSFZ1YXk1c2FXNWxjeTV3ZFhOb0tHMXBibVZEZFhKeVpXNTBLVHRjYmlBZ0lDQWdJRzFwYm1VdWFXNWtaWGdyS3p0Y2JpQWdJQ0FnSUhSb1pXbHlMbWx1WkdWNEt5czdYRzRnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUM4dklFTnZiblJsZUhRZ2JXbHpiV0YwWTJoY2JpQWdJQ0FnSUdOdmJtWnNhV04wS0doMWJtc3NJR052Ykd4bFkzUkRhR0Z1WjJVb2JXbHVaU2tzSUdOdmJHeGxZM1JEYUdGdVoyVW9kR2hsYVhJcEtUdGNiaUFnSUNCOVhHNGdJSDFjYmx4dUlDQXZMeUJPYjNjZ2NIVnphQ0JoYm5sMGFHbHVaeUIwYUdGMElHMWhlU0JpWlNCeVpXMWhhVzVwYm1kY2JpQWdhVzV6WlhKMFZISmhhV3hwYm1jb2FIVnVheXdnYldsdVpTazdYRzRnSUdsdWMyVnlkRlJ5WVdsc2FXNW5LR2gxYm1zc0lIUm9aV2x5S1R0Y2JseHVJQ0JqWVd4alRHbHVaVU52ZFc1MEtHaDFibXNwTzF4dWZWeHVYRzVtZFc1amRHbHZiaUJ0ZFhSMVlXeERhR0Z1WjJVb2FIVnVheXdnYldsdVpTd2dkR2hsYVhJcElIdGNiaUFnYkdWMElHMTVRMmhoYm1kbGN5QTlJR052Ykd4bFkzUkRhR0Z1WjJVb2JXbHVaU2tzWEc0Z0lDQWdJQ0IwYUdWcGNrTm9ZVzVuWlhNZ1BTQmpiMnhzWldOMFEyaGhibWRsS0hSb1pXbHlLVHRjYmx4dUlDQnBaaUFvWVd4c1VtVnRiM1psY3lodGVVTm9ZVzVuWlhNcElDWW1JR0ZzYkZKbGJXOTJaWE1vZEdobGFYSkRhR0Z1WjJWektTa2dlMXh1SUNBZ0lDOHZJRk53WldOcFlXd2dZMkZ6WlNCbWIzSWdjbVZ0YjNabElHTm9ZVzVuWlhNZ2RHaGhkQ0JoY21VZ2MzVndaWEp6WlhSeklHOW1JRzl1WlNCaGJtOTBhR1Z5WEc0Z0lDQWdhV1lnS0dGeWNtRjVVM1JoY25SelYybDBhQ2h0ZVVOb1lXNW5aWE1zSUhSb1pXbHlRMmhoYm1kbGN5bGNiaUFnSUNBZ0lDQWdKaVlnYzJ0cGNGSmxiVzkyWlZOMWNHVnljMlYwS0hSb1pXbHlMQ0J0ZVVOb1lXNW5aWE1zSUcxNVEyaGhibWRsY3k1c1pXNW5kR2dnTFNCMGFHVnBja05vWVc1blpYTXViR1Z1WjNSb0tTa2dlMXh1SUNBZ0lDQWdhSFZ1YXk1c2FXNWxjeTV3ZFhOb0tDNHVMaUJ0ZVVOb1lXNW5aWE1wTzF4dUlDQWdJQ0FnY21WMGRYSnVPMXh1SUNBZ0lIMGdaV3h6WlNCcFppQW9ZWEp5WVhsVGRHRnlkSE5YYVhSb0tIUm9aV2x5UTJoaGJtZGxjeXdnYlhsRGFHRnVaMlZ6S1Z4dUlDQWdJQ0FnSUNBbUppQnphMmx3VW1WdGIzWmxVM1Z3WlhKelpYUW9iV2x1WlN3Z2RHaGxhWEpEYUdGdVoyVnpMQ0IwYUdWcGNrTm9ZVzVuWlhNdWJHVnVaM1JvSUMwZ2JYbERhR0Z1WjJWekxteGxibWQwYUNrcElIdGNiaUFnSUNBZ0lHaDFibXN1YkdsdVpYTXVjSFZ6YUNndUxpNGdkR2hsYVhKRGFHRnVaMlZ6S1R0Y2JpQWdJQ0FnSUhKbGRIVnlianRjYmlBZ0lDQjlYRzRnSUgwZ1pXeHpaU0JwWmlBb1lYSnlZWGxGY1hWaGJDaHRlVU5vWVc1blpYTXNJSFJvWldseVEyaGhibWRsY3lrcElIdGNiaUFnSUNCb2RXNXJMbXhwYm1WekxuQjFjMmdvTGk0dUlHMTVRMmhoYm1kbGN5azdYRzRnSUNBZ2NtVjBkWEp1TzF4dUlDQjlYRzVjYmlBZ1kyOXVabXhwWTNRb2FIVnVheXdnYlhsRGFHRnVaMlZ6TENCMGFHVnBja05vWVc1blpYTXBPMXh1ZlZ4dVhHNW1kVzVqZEdsdmJpQnlaVzF2ZG1Gc0tHaDFibXNzSUcxcGJtVXNJSFJvWldseUxDQnpkMkZ3S1NCN1hHNGdJR3hsZENCdGVVTm9ZVzVuWlhNZ1BTQmpiMnhzWldOMFEyaGhibWRsS0cxcGJtVXBMRnh1SUNBZ0lDQWdkR2hsYVhKRGFHRnVaMlZ6SUQwZ1kyOXNiR1ZqZEVOdmJuUmxlSFFvZEdobGFYSXNJRzE1UTJoaGJtZGxjeWs3WEc0Z0lHbG1JQ2gwYUdWcGNrTm9ZVzVuWlhNdWJXVnlaMlZrS1NCN1hHNGdJQ0FnYUhWdWF5NXNhVzVsY3k1d2RYTm9LQzR1TGlCMGFHVnBja05vWVc1blpYTXViV1Z5WjJWa0tUdGNiaUFnZlNCbGJITmxJSHRjYmlBZ0lDQmpiMjVtYkdsamRDaG9kVzVyTENCemQyRndJRDhnZEdobGFYSkRhR0Z1WjJWeklEb2diWGxEYUdGdVoyVnpMQ0J6ZDJGd0lEOGdiWGxEYUdGdVoyVnpJRG9nZEdobGFYSkRhR0Z1WjJWektUdGNiaUFnZlZ4dWZWeHVYRzVtZFc1amRHbHZiaUJqYjI1bWJHbGpkQ2hvZFc1ckxDQnRhVzVsTENCMGFHVnBjaWtnZTF4dUlDQm9kVzVyTG1OdmJtWnNhV04wSUQwZ2RISjFaVHRjYmlBZ2FIVnVheTVzYVc1bGN5NXdkWE5vS0h0Y2JpQWdJQ0JqYjI1bWJHbGpkRG9nZEhKMVpTeGNiaUFnSUNCdGFXNWxPaUJ0YVc1bExGeHVJQ0FnSUhSb1pXbHljem9nZEdobGFYSmNiaUFnZlNrN1hHNTlYRzVjYm1aMWJtTjBhVzl1SUdsdWMyVnlkRXhsWVdScGJtY29hSFZ1YXl3Z2FXNXpaWEowTENCMGFHVnBjaWtnZTF4dUlDQjNhR2xzWlNBb2FXNXpaWEowTG05bVpuTmxkQ0E4SUhSb1pXbHlMbTltWm5ObGRDQW1KaUJwYm5ObGNuUXVhVzVrWlhnZ1BDQnBibk5sY25RdWJHbHVaWE11YkdWdVozUm9LU0I3WEc0Z0lDQWdiR1YwSUd4cGJtVWdQU0JwYm5ObGNuUXViR2x1WlhOYmFXNXpaWEowTG1sdVpHVjRLeXRkTzF4dUlDQWdJR2gxYm1zdWJHbHVaWE11Y0hWemFDaHNhVzVsS1R0Y2JpQWdJQ0JwYm5ObGNuUXViMlptYzJWMEt5czdYRzRnSUgxY2JuMWNibVoxYm1OMGFXOXVJR2x1YzJWeWRGUnlZV2xzYVc1bktHaDFibXNzSUdsdWMyVnlkQ2tnZTF4dUlDQjNhR2xzWlNBb2FXNXpaWEowTG1sdVpHVjRJRHdnYVc1elpYSjBMbXhwYm1WekxteGxibWQwYUNrZ2UxeHVJQ0FnSUd4bGRDQnNhVzVsSUQwZ2FXNXpaWEowTG14cGJtVnpXMmx1YzJWeWRDNXBibVJsZUNzclhUdGNiaUFnSUNCb2RXNXJMbXhwYm1WekxuQjFjMmdvYkdsdVpTazdYRzRnSUgxY2JuMWNibHh1Wm5WdVkzUnBiMjRnWTI5c2JHVmpkRU5vWVc1blpTaHpkR0YwWlNrZ2UxeHVJQ0JzWlhRZ2NtVjBJRDBnVzEwc1hHNGdJQ0FnSUNCdmNHVnlZWFJwYjI0Z1BTQnpkR0YwWlM1c2FXNWxjMXR6ZEdGMFpTNXBibVJsZUYxYk1GMDdYRzRnSUhkb2FXeGxJQ2h6ZEdGMFpTNXBibVJsZUNBOElITjBZWFJsTG14cGJtVnpMbXhsYm1kMGFDa2dlMXh1SUNBZ0lHeGxkQ0JzYVc1bElEMGdjM1JoZEdVdWJHbHVaWE5iYzNSaGRHVXVhVzVrWlhoZE8xeHVYRzRnSUNBZ0x5OGdSM0p2ZFhBZ1lXUmthWFJwYjI1eklIUm9ZWFFnWVhKbElHbHRiV1ZrYVdGMFpXeDVJR0ZtZEdWeUlITjFZblJ5WVdOMGFXOXVjeUJoYm1RZ2RISmxZWFFnZEdobGJTQmhjeUJ2Ym1VZ1hDSmhkRzl0YVdOY0lpQnRiMlJwWm5rZ1kyaGhibWRsTGx4dUlDQWdJR2xtSUNodmNHVnlZWFJwYjI0Z1BUMDlJQ2N0SnlBbUppQnNhVzVsV3pCZElEMDlQU0FuS3ljcElIdGNiaUFnSUNBZ0lHOXdaWEpoZEdsdmJpQTlJQ2NySnp0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0JwWmlBb2IzQmxjbUYwYVc5dUlEMDlQU0JzYVc1bFd6QmRLU0I3WEc0Z0lDQWdJQ0J5WlhRdWNIVnphQ2hzYVc1bEtUdGNiaUFnSUNBZ0lITjBZWFJsTG1sdVpHVjRLeXM3WEc0Z0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lHSnlaV0ZyTzF4dUlDQWdJSDFjYmlBZ2ZWeHVYRzRnSUhKbGRIVnliaUJ5WlhRN1hHNTlYRzVtZFc1amRHbHZiaUJqYjJ4c1pXTjBRMjl1ZEdWNGRDaHpkR0YwWlN3Z2JXRjBZMmhEYUdGdVoyVnpLU0I3WEc0Z0lHeGxkQ0JqYUdGdVoyVnpJRDBnVzEwc1hHNGdJQ0FnSUNCdFpYSm5aV1FnUFNCYlhTeGNiaUFnSUNBZ0lHMWhkR05vU1c1a1pYZ2dQU0F3TEZ4dUlDQWdJQ0FnWTI5dWRHVjRkRU5vWVc1blpYTWdQU0JtWVd4elpTeGNiaUFnSUNBZ0lHTnZibVpzYVdOMFpXUWdQU0JtWVd4elpUdGNiaUFnZDJocGJHVWdLRzFoZEdOb1NXNWtaWGdnUENCdFlYUmphRU5vWVc1blpYTXViR1Z1WjNSb1hHNGdJQ0FnSUNBZ0lDWW1JSE4wWVhSbExtbHVaR1Y0SUR3Z2MzUmhkR1V1YkdsdVpYTXViR1Z1WjNSb0tTQjdYRzRnSUNBZ2JHVjBJR05vWVc1blpTQTlJSE4wWVhSbExteHBibVZ6VzNOMFlYUmxMbWx1WkdWNFhTeGNiaUFnSUNBZ0lDQWdiV0YwWTJnZ1BTQnRZWFJqYUVOb1lXNW5aWE5iYldGMFkyaEpibVJsZUYwN1hHNWNiaUFnSUNBdkx5QlBibU5sSUhkbEozWmxJR2hwZENCdmRYSWdZV1JrTENCMGFHVnVJSGRsSUdGeVpTQmtiMjVsWEc0Z0lDQWdhV1lnS0cxaGRHTm9XekJkSUQwOVBTQW5LeWNwSUh0Y2JpQWdJQ0FnSUdKeVpXRnJPMXh1SUNBZ0lIMWNibHh1SUNBZ0lHTnZiblJsZUhSRGFHRnVaMlZ6SUQwZ1kyOXVkR1Y0ZEVOb1lXNW5aWE1nZkh3Z1kyaGhibWRsV3pCZElDRTlQU0FuSUNjN1hHNWNiaUFnSUNCdFpYSm5aV1F1Y0hWemFDaHRZWFJqYUNrN1hHNGdJQ0FnYldGMFkyaEpibVJsZUNzck8xeHVYRzRnSUNBZ0x5OGdRMjl1YzNWdFpTQmhibmtnWVdSa2FYUnBiMjV6SUdsdUlIUm9aU0J2ZEdobGNpQmliRzlqYXlCaGN5QmhJR052Ym1ac2FXTjBJSFJ2SUdGMGRHVnRjSFJjYmlBZ0lDQXZMeUIwYnlCd2RXeHNJR2x1SUhSb1pTQnlaVzFoYVc1cGJtY2dZMjl1ZEdWNGRDQmhablJsY2lCMGFHbHpYRzRnSUNBZ2FXWWdLR05vWVc1blpWc3dYU0E5UFQwZ0p5c25LU0I3WEc0Z0lDQWdJQ0JqYjI1bWJHbGpkR1ZrSUQwZ2RISjFaVHRjYmx4dUlDQWdJQ0FnZDJocGJHVWdLR05vWVc1blpWc3dYU0E5UFQwZ0p5c25LU0I3WEc0Z0lDQWdJQ0FnSUdOb1lXNW5aWE11Y0hWemFDaGphR0Z1WjJVcE8xeHVJQ0FnSUNBZ0lDQmphR0Z1WjJVZ1BTQnpkR0YwWlM1c2FXNWxjMXNySzNOMFlYUmxMbWx1WkdWNFhUdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNWNiaUFnSUNCcFppQW9iV0YwWTJndWMzVmljM1J5S0RFcElEMDlQU0JqYUdGdVoyVXVjM1ZpYzNSeUtERXBLU0I3WEc0Z0lDQWdJQ0JqYUdGdVoyVnpMbkIxYzJnb1kyaGhibWRsS1R0Y2JpQWdJQ0FnSUhOMFlYUmxMbWx1WkdWNEt5czdYRzRnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUdOdmJtWnNhV04wWldRZ1BTQjBjblZsTzF4dUlDQWdJSDFjYmlBZ2ZWeHVYRzRnSUdsbUlDZ29iV0YwWTJoRGFHRnVaMlZ6VzIxaGRHTm9TVzVrWlhoZElIeDhJQ2NuS1Zzd1hTQTlQVDBnSnlzblhHNGdJQ0FnSUNBbUppQmpiMjUwWlhoMFEyaGhibWRsY3lrZ2UxeHVJQ0FnSUdOdmJtWnNhV04wWldRZ1BTQjBjblZsTzF4dUlDQjlYRzVjYmlBZ2FXWWdLR052Ym1ac2FXTjBaV1FwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdZMmhoYm1kbGN6dGNiaUFnZlZ4dVhHNGdJSGRvYVd4bElDaHRZWFJqYUVsdVpHVjRJRHdnYldGMFkyaERhR0Z1WjJWekxteGxibWQwYUNrZ2UxeHVJQ0FnSUcxbGNtZGxaQzV3ZFhOb0tHMWhkR05vUTJoaGJtZGxjMXR0WVhSamFFbHVaR1Y0S3l0ZEtUdGNiaUFnZlZ4dVhHNGdJSEpsZEhWeWJpQjdYRzRnSUNBZ2JXVnlaMlZrTEZ4dUlDQWdJR05vWVc1blpYTmNiaUFnZlR0Y2JuMWNibHh1Wm5WdVkzUnBiMjRnWVd4c1VtVnRiM1psY3loamFHRnVaMlZ6S1NCN1hHNGdJSEpsZEhWeWJpQmphR0Z1WjJWekxuSmxaSFZqWlNobWRXNWpkR2x2Ymlod2NtVjJMQ0JqYUdGdVoyVXBJSHRjYmlBZ0lDQnlaWFIxY200Z2NISmxkaUFtSmlCamFHRnVaMlZiTUYwZ1BUMDlJQ2N0Snp0Y2JpQWdmU3dnZEhKMVpTazdYRzU5WEc1bWRXNWpkR2x2YmlCemEybHdVbVZ0YjNabFUzVndaWEp6WlhRb2MzUmhkR1VzSUhKbGJXOTJaVU5vWVc1blpYTXNJR1JsYkhSaEtTQjdYRzRnSUdadmNpQW9iR1YwSUdrZ1BTQXdPeUJwSUR3Z1pHVnNkR0U3SUdrckt5a2dlMXh1SUNBZ0lHeGxkQ0JqYUdGdVoyVkRiMjUwWlc1MElEMGdjbVZ0YjNabFEyaGhibWRsYzF0eVpXMXZkbVZEYUdGdVoyVnpMbXhsYm1kMGFDQXRJR1JsYkhSaElDc2dhVjB1YzNWaWMzUnlLREVwTzF4dUlDQWdJR2xtSUNoemRHRjBaUzVzYVc1bGMxdHpkR0YwWlM1cGJtUmxlQ0FySUdsZElDRTlQU0FuSUNjZ0t5QmphR0Z1WjJWRGIyNTBaVzUwS1NCN1hHNGdJQ0FnSUNCeVpYUjFjbTRnWm1Gc2MyVTdYRzRnSUNBZ2ZWeHVJQ0I5WEc1Y2JpQWdjM1JoZEdVdWFXNWtaWGdnS3owZ1pHVnNkR0U3WEc0Z0lISmxkSFZ5YmlCMGNuVmxPMXh1ZlZ4dVhHNW1kVzVqZEdsdmJpQmpZV3hqVDJ4a1RtVjNUR2x1WlVOdmRXNTBLR3hwYm1WektTQjdYRzRnSUd4bGRDQnZiR1JNYVc1bGN5QTlJREE3WEc0Z0lHeGxkQ0J1WlhkTWFXNWxjeUE5SURBN1hHNWNiaUFnYkdsdVpYTXVabTl5UldGamFDaG1kVzVqZEdsdmJpaHNhVzVsS1NCN1hHNGdJQ0FnYVdZZ0tIUjVjR1Z2WmlCc2FXNWxJQ0U5UFNBbmMzUnlhVzVuSnlrZ2UxeHVJQ0FnSUNBZ2JHVjBJRzE1UTI5MWJuUWdQU0JqWVd4alQyeGtUbVYzVEdsdVpVTnZkVzUwS0d4cGJtVXViV2x1WlNrN1hHNGdJQ0FnSUNCc1pYUWdkR2hsYVhKRGIzVnVkQ0E5SUdOaGJHTlBiR1JPWlhkTWFXNWxRMjkxYm5Rb2JHbHVaUzUwYUdWcGNuTXBPMXh1WEc0Z0lDQWdJQ0JwWmlBb2IyeGtUR2x1WlhNZ0lUMDlJSFZ1WkdWbWFXNWxaQ2tnZTF4dUlDQWdJQ0FnSUNCcFppQW9iWGxEYjNWdWRDNXZiR1JNYVc1bGN5QTlQVDBnZEdobGFYSkRiM1Z1ZEM1dmJHUk1hVzVsY3lrZ2UxeHVJQ0FnSUNBZ0lDQWdJRzlzWkV4cGJtVnpJQ3M5SUcxNVEyOTFiblF1YjJ4a1RHbHVaWE03WEc0Z0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUNBZ2IyeGtUR2x1WlhNZ1BTQjFibVJsWm1sdVpXUTdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnYVdZZ0tHNWxkMHhwYm1WeklDRTlQU0IxYm1SbFptbHVaV1FwSUh0Y2JpQWdJQ0FnSUNBZ2FXWWdLRzE1UTI5MWJuUXVibVYzVEdsdVpYTWdQVDA5SUhSb1pXbHlRMjkxYm5RdWJtVjNUR2x1WlhNcElIdGNiaUFnSUNBZ0lDQWdJQ0J1WlhkTWFXNWxjeUFyUFNCdGVVTnZkVzUwTG01bGQweHBibVZ6TzF4dUlDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNBZ0lHNWxkMHhwYm1WeklEMGdkVzVrWldacGJtVmtPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lHbG1JQ2h1WlhkTWFXNWxjeUFoUFQwZ2RXNWtaV1pwYm1Wa0lDWW1JQ2hzYVc1bFd6QmRJRDA5UFNBbkt5Y2dmSHdnYkdsdVpWc3dYU0E5UFQwZ0p5QW5LU2tnZTF4dUlDQWdJQ0FnSUNCdVpYZE1hVzVsY3lzck8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2FXWWdLRzlzWkV4cGJtVnpJQ0U5UFNCMWJtUmxabWx1WldRZ0ppWWdLR3hwYm1WYk1GMGdQVDA5SUNjdEp5QjhmQ0JzYVc1bFd6QmRJRDA5UFNBbklDY3BLU0I3WEc0Z0lDQWdJQ0FnSUc5c1pFeHBibVZ6S3lzN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dUlDQjlLVHRjYmx4dUlDQnlaWFIxY200Z2UyOXNaRXhwYm1WekxDQnVaWGRNYVc1bGMzMDdYRzU5WEc0aVhYMD1cbiIsICIvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5cInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMucmV2ZXJzZVBhdGNoID0gcmV2ZXJzZVBhdGNoO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgaWYgKGVudW1lcmFibGVPbmx5KSBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSk7IGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgaWYgKGkgJSAyKSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHsgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTsgfSBlbHNlIHsgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbmZ1bmN0aW9uIHJldmVyc2VQYXRjaChzdHJ1Y3R1cmVkUGF0Y2gpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoc3RydWN0dXJlZFBhdGNoKSkge1xuICAgIHJldHVybiBzdHJ1Y3R1cmVkUGF0Y2gubWFwKHJldmVyc2VQYXRjaCkucmV2ZXJzZSgpO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICAgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LFxuICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gICAgc3RydWN0dXJlZFBhdGNoKSwge30sIHtcbiAgICAgIG9sZEZpbGVOYW1lOiBzdHJ1Y3R1cmVkUGF0Y2gubmV3RmlsZU5hbWUsXG4gICAgICBvbGRIZWFkZXI6IHN0cnVjdHVyZWRQYXRjaC5uZXdIZWFkZXIsXG4gICAgICBuZXdGaWxlTmFtZTogc3RydWN0dXJlZFBhdGNoLm9sZEZpbGVOYW1lLFxuICAgICAgbmV3SGVhZGVyOiBzdHJ1Y3R1cmVkUGF0Y2gub2xkSGVhZGVyLFxuICAgICAgaHVua3M6IHN0cnVjdHVyZWRQYXRjaC5odW5rcy5tYXAoZnVuY3Rpb24gKGh1bmspIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBvbGRMaW5lczogaHVuay5uZXdMaW5lcyxcbiAgICAgICAgICBvbGRTdGFydDogaHVuay5uZXdTdGFydCxcbiAgICAgICAgICBuZXdMaW5lczogaHVuay5vbGRMaW5lcyxcbiAgICAgICAgICBuZXdTdGFydDogaHVuay5vbGRTdGFydCxcbiAgICAgICAgICBsaW5lZGVsaW1pdGVyczogaHVuay5saW5lZGVsaW1pdGVycyxcbiAgICAgICAgICBsaW5lczogaHVuay5saW5lcy5tYXAoZnVuY3Rpb24gKGwpIHtcbiAgICAgICAgICAgIGlmIChsLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICAgICAgICAgICAgICBcIitcIi5jb25jYXQoXG4gICAgICAgICAgICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgICAgICAgICAgICAgICBsLnNsaWNlKDEpKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobC5zdGFydHNXaXRoKCcrJykpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICAgICAgICAgICAgICAgXCItXCIuY29uY2F0KFxuICAgICAgICAgICAgICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gICAgICAgICAgICAgICAgbC5zbGljZSgxKSlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGw7XG4gICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgfSlcbiAgKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OXdZWFJqYUM5eVpYWmxjbk5sTG1weklsMHNJbTVoYldWeklqcGJJbkpsZG1WeWMyVlFZWFJqYUNJc0luTjBjblZqZEhWeVpXUlFZWFJqYUNJc0lrRnljbUY1SWl3aWFYTkJjbkpoZVNJc0ltMWhjQ0lzSW5KbGRtVnljMlVpTENKdmJHUkdhV3hsVG1GdFpTSXNJbTVsZDBacGJHVk9ZVzFsSWl3aWIyeGtTR1ZoWkdWeUlpd2libVYzU0dWaFpHVnlJaXdpYUhWdWEzTWlMQ0pvZFc1cklpd2liMnhrVEdsdVpYTWlMQ0p1WlhkTWFXNWxjeUlzSW05c1pGTjBZWEowSWl3aWJtVjNVM1JoY25RaUxDSnNhVzVsWkdWc2FXMXBkR1Z5Y3lJc0lteHBibVZ6SWl3aWJDSXNJbk4wWVhKMGMxZHBkR2dpTENKemJHbGpaU0pkTENKdFlYQndhVzVuY3lJNklqczdPenM3T3pzN096czdPenM3TzBGQlFVOHNVMEZCVTBFc1dVRkJWQ3hEUVVGelFrTXNaVUZCZEVJc1JVRkJkVU03UVVGRE5VTXNUVUZCU1VNc1MwRkJTeXhEUVVGRFF5eFBRVUZPTEVOQlFXTkdMR1ZCUVdRc1EwRkJTaXhGUVVGdlF6dEJRVU5zUXl4WFFVRlBRU3hsUVVGbExFTkJRVU5ITEVkQlFXaENMRU5CUVc5Q1NpeFpRVUZ3UWl4RlFVRnJRMHNzVDBGQmJFTXNSVUZCVUR0QlFVTkVPenRCUVVWRU8wRkJRVUU3UVVGQlFUdEJRVUZCTzBGQlEwdEtMRWxCUVVGQkxHVkJSRXc3UVVGRlJVc3NUVUZCUVVFc1YwRkJWeXhGUVVGRlRDeGxRVUZsTEVOQlFVTk5MRmRCUmk5Q08wRkJSMFZETEUxQlFVRkJMRk5CUVZNc1JVRkJSVkFzWlVGQlpTeERRVUZEVVN4VFFVZzNRanRCUVVsRlJpeE5RVUZCUVN4WFFVRlhMRVZCUVVWT0xHVkJRV1VzUTBGQlEwc3NWMEZLTDBJN1FVRkxSVWNzVFVGQlFVRXNVMEZCVXl4RlFVRkZVaXhsUVVGbExFTkJRVU5QTEZOQlREZENPMEZCVFVWRkxFMUJRVUZCTEV0QlFVc3NSVUZCUlZRc1pVRkJaU3hEUVVGRFV5eExRVUZvUWl4RFFVRnpRazRzUjBGQmRFSXNRMEZCTUVJc1ZVRkJRVThzU1VGQlNTeEZRVUZKTzBGQlEzWkRMR1ZCUVU4N1FVRkRURU1zVlVGQlFVRXNVVUZCVVN4RlFVRkZSQ3hKUVVGSkxFTkJRVU5GTEZGQlJGWTdRVUZGVEVNc1ZVRkJRVUVzVVVGQlVTeEZRVUZGU0N4SlFVRkpMRU5CUVVOSkxGRkJSbFk3UVVGSFRFWXNWVUZCUVVFc1VVRkJVU3hGUVVGRlJpeEpRVUZKTEVOQlFVTkRMRkZCU0ZZN1FVRkpURWNzVlVGQlFVRXNVVUZCVVN4RlFVRkZTaXhKUVVGSkxFTkJRVU5ITEZGQlNsWTdRVUZMVEVVc1ZVRkJRVUVzWTBGQll5eEZRVUZGVEN4SlFVRkpMRU5CUVVOTExHTkJUR2hDTzBGQlRVeERMRlZCUVVGQkxFdEJRVXNzUlVGQlJVNHNTVUZCU1N4RFFVRkRUU3hMUVVGTUxFTkJRVmRpTEVkQlFWZ3NRMEZCWlN4VlFVRkJZeXhEUVVGRExFVkJRVWs3UVVGRGVrSXNaMEpCUVVsQkxFTkJRVU1zUTBGQlEwTXNWVUZCUml4RFFVRmhMRWRCUVdJc1EwRkJTaXhGUVVGMVFqdEJRVUZGTzBGQlFVRTdRVUZCUVR0QlFVRkJPMEZCUVZkRUxHZENRVUZCUVN4RFFVRkRMRU5CUVVORkxFdEJRVVlzUTBGQlVTeERRVUZTTEVOQlFWZzdRVUZCUVR0QlFVRXdRanM3UVVGRGJrUXNaMEpCUVVsR0xFTkJRVU1zUTBGQlEwTXNWVUZCUml4RFFVRmhMRWRCUVdJc1EwRkJTaXhGUVVGMVFqdEJRVUZGTzBGQlFVRTdRVUZCUVR0QlFVRkJPMEZCUVZkRUxHZENRVUZCUVN4RFFVRkRMRU5CUVVORkxFdEJRVVlzUTBGQlVTeERRVUZTTEVOQlFWZzdRVUZCUVR0QlFVRXdRanM3UVVGRGJrUXNiVUpCUVU5R0xFTkJRVkE3UVVGRFJDeFhRVXBOTzBGQlRrWXNVMEZCVUR0QlFWbEVMRTlCWWswN1FVRk9WRHRCUVVGQk8wRkJjVUpFSWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaVpYaHdiM0owSUdaMWJtTjBhVzl1SUhKbGRtVnljMlZRWVhSamFDaHpkSEoxWTNSMWNtVmtVR0YwWTJncElIdGNiaUFnYVdZZ0tFRnljbUY1TG1selFYSnlZWGtvYzNSeWRXTjBkWEpsWkZCaGRHTm9LU2tnZTF4dUlDQWdJSEpsZEhWeWJpQnpkSEoxWTNSMWNtVmtVR0YwWTJndWJXRndLSEpsZG1WeWMyVlFZWFJqYUNrdWNtVjJaWEp6WlNncE8xeHVJQ0I5WEc1Y2JpQWdjbVYwZFhKdUlIdGNiaUFnSUNBdUxpNXpkSEoxWTNSMWNtVmtVR0YwWTJnc1hHNGdJQ0FnYjJ4a1JtbHNaVTVoYldVNklITjBjblZqZEhWeVpXUlFZWFJqYUM1dVpYZEdhV3hsVG1GdFpTeGNiaUFnSUNCdmJHUklaV0ZrWlhJNklITjBjblZqZEhWeVpXUlFZWFJqYUM1dVpYZElaV0ZrWlhJc1hHNGdJQ0FnYm1WM1JtbHNaVTVoYldVNklITjBjblZqZEhWeVpXUlFZWFJqYUM1dmJHUkdhV3hsVG1GdFpTeGNiaUFnSUNCdVpYZElaV0ZrWlhJNklITjBjblZqZEhWeVpXUlFZWFJqYUM1dmJHUklaV0ZrWlhJc1hHNGdJQ0FnYUhWdWEzTTZJSE4wY25WamRIVnlaV1JRWVhSamFDNW9kVzVyY3k1dFlYQW9hSFZ1YXlBOVBpQjdYRzRnSUNBZ0lDQnlaWFIxY200Z2UxeHVJQ0FnSUNBZ0lDQnZiR1JNYVc1bGN6b2dhSFZ1YXk1dVpYZE1hVzVsY3l4Y2JpQWdJQ0FnSUNBZ2IyeGtVM1JoY25RNklHaDFibXN1Ym1WM1UzUmhjblFzWEc0Z0lDQWdJQ0FnSUc1bGQweHBibVZ6T2lCb2RXNXJMbTlzWkV4cGJtVnpMRnh1SUNBZ0lDQWdJQ0J1WlhkVGRHRnlkRG9nYUhWdWF5NXZiR1JUZEdGeWRDeGNiaUFnSUNBZ0lDQWdiR2x1WldSbGJHbHRhWFJsY25NNklHaDFibXN1YkdsdVpXUmxiR2x0YVhSbGNuTXNYRzRnSUNBZ0lDQWdJR3hwYm1Wek9pQm9kVzVyTG14cGJtVnpMbTFoY0Noc0lEMCtJSHRjYmlBZ0lDQWdJQ0FnSUNCcFppQW9iQzV6ZEdGeWRITlhhWFJvS0NjdEp5a3BJSHNnY21WMGRYSnVJR0FySkh0c0xuTnNhV05sS0RFcGZXQTdJSDFjYmlBZ0lDQWdJQ0FnSUNCcFppQW9iQzV6ZEdGeWRITlhhWFJvS0Njckp5a3BJSHNnY21WMGRYSnVJR0F0Skh0c0xuTnNhV05sS0RFcGZXQTdJSDFjYmlBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnYkR0Y2JpQWdJQ0FnSUNBZ2ZTbGNiaUFnSUNBZ0lIMDdYRzRnSUNBZ2ZTbGNiaUFnZlR0Y2JuMWNiaUpkZlE9PVxuIiwgIi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cblwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5jb252ZXJ0Q2hhbmdlc1RvRE1QID0gY29udmVydENoYW5nZXNUb0RNUDtcblxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbi8vIFNlZTogaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZS1kaWZmLW1hdGNoLXBhdGNoL3dpa2kvQVBJXG5mdW5jdGlvbiBjb252ZXJ0Q2hhbmdlc1RvRE1QKGNoYW5nZXMpIHtcbiAgdmFyIHJldCA9IFtdLFxuICAgICAgY2hhbmdlLFxuICAgICAgb3BlcmF0aW9uO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2hhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgIGNoYW5nZSA9IGNoYW5nZXNbaV07XG5cbiAgICBpZiAoY2hhbmdlLmFkZGVkKSB7XG4gICAgICBvcGVyYXRpb24gPSAxO1xuICAgIH0gZWxzZSBpZiAoY2hhbmdlLnJlbW92ZWQpIHtcbiAgICAgIG9wZXJhdGlvbiA9IC0xO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcGVyYXRpb24gPSAwO1xuICAgIH1cblxuICAgIHJldC5wdXNoKFtvcGVyYXRpb24sIGNoYW5nZS52YWx1ZV0pO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OWpiMjUyWlhKMEwyUnRjQzVxY3lKZExDSnVZVzFsY3lJNld5SmpiMjUyWlhKMFEyaGhibWRsYzFSdlJFMVFJaXdpWTJoaGJtZGxjeUlzSW5KbGRDSXNJbU5vWVc1blpTSXNJbTl3WlhKaGRHbHZiaUlzSW1raUxDSnNaVzVuZEdnaUxDSmhaR1JsWkNJc0luSmxiVzkyWldRaUxDSndkWE5vSWl3aWRtRnNkV1VpWFN3aWJXRndjR2x1WjNNaU9pSTdPenM3T3pzN096dEJRVUZCTzBGQlEwOHNVMEZCVTBFc2JVSkJRVlFzUTBGQk5rSkRMRTlCUVRkQ0xFVkJRWE5ETzBGQlF6TkRMRTFCUVVsRExFZEJRVWNzUjBGQlJ5eEZRVUZXTzBGQlFVRXNUVUZEU1VNc1RVRkVTanRCUVVGQkxFMUJSVWxETEZOQlJrbzdPMEZCUjBFc1QwRkJTeXhKUVVGSlF5eERRVUZETEVkQlFVY3NRMEZCWWl4RlFVRm5Ra0VzUTBGQlF5eEhRVUZIU2l4UFFVRlBMRU5CUVVOTExFMUJRVFZDTEVWQlFXOURSQ3hEUVVGRExFVkJRWEpETEVWQlFYbERPMEZCUTNaRFJpeEpRVUZCUVN4TlFVRk5MRWRCUVVkR0xFOUJRVThzUTBGQlEwa3NRMEZCUkN4RFFVRm9RanM3UVVGRFFTeFJRVUZKUml4TlFVRk5MRU5CUVVOSkxFdEJRVmdzUlVGQmEwSTdRVUZEYUVKSUxFMUJRVUZCTEZOQlFWTXNSMEZCUnl4RFFVRmFPMEZCUTBRc1MwRkdSQ3hOUVVWUExFbEJRVWxFTEUxQlFVMHNRMEZCUTBzc1QwRkJXQ3hGUVVGdlFqdEJRVU42UWtvc1RVRkJRVUVzVTBGQlV5eEhRVUZITEVOQlFVTXNRMEZCWWp0QlFVTkVMRXRCUmswc1RVRkZRVHRCUVVOTVFTeE5RVUZCUVN4VFFVRlRMRWRCUVVjc1EwRkJXanRCUVVORU96dEJRVVZFUml4SlFVRkJRU3hIUVVGSExFTkJRVU5QTEVsQlFVb3NRMEZCVXl4RFFVRkRUQ3hUUVVGRUxFVkJRVmxFTEUxQlFVMHNRMEZCUTA4c1MwRkJia0lzUTBGQlZEdEJRVU5FT3p0QlFVTkVMRk5CUVU5U0xFZEJRVkE3UVVGRFJDSXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJaTh2SUZObFpUb2dhSFIwY0RvdkwyTnZaR1V1WjI5dloyeGxMbU52YlM5d0wyZHZiMmRzWlMxa2FXWm1MVzFoZEdOb0xYQmhkR05vTDNkcGEya3ZRVkJKWEc1bGVIQnZjblFnWm5WdVkzUnBiMjRnWTI5dWRtVnlkRU5vWVc1blpYTlViMFJOVUNoamFHRnVaMlZ6S1NCN1hHNGdJR3hsZENCeVpYUWdQU0JiWFN4Y2JpQWdJQ0FnSUdOb1lXNW5aU3hjYmlBZ0lDQWdJRzl3WlhKaGRHbHZianRjYmlBZ1ptOXlJQ2hzWlhRZ2FTQTlJREE3SUdrZ1BDQmphR0Z1WjJWekxteGxibWQwYURzZ2FTc3JLU0I3WEc0Z0lDQWdZMmhoYm1kbElEMGdZMmhoYm1kbGMxdHBYVHRjYmlBZ0lDQnBaaUFvWTJoaGJtZGxMbUZrWkdWa0tTQjdYRzRnSUNBZ0lDQnZjR1Z5WVhScGIyNGdQU0F4TzF4dUlDQWdJSDBnWld4elpTQnBaaUFvWTJoaGJtZGxMbkpsYlc5MlpXUXBJSHRjYmlBZ0lDQWdJRzl3WlhKaGRHbHZiaUE5SUMweE8xeHVJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0J2Y0dWeVlYUnBiMjRnUFNBd08xeHVJQ0FnSUgxY2JseHVJQ0FnSUhKbGRDNXdkWE5vS0Z0dmNHVnlZWFJwYjI0c0lHTm9ZVzVuWlM1MllXeDFaVjBwTzF4dUlDQjlYRzRnSUhKbGRIVnliaUJ5WlhRN1hHNTlYRzRpWFgwPVxuIiwgIi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cblwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5jb252ZXJ0Q2hhbmdlc1RvWE1MID0gY29udmVydENoYW5nZXNUb1hNTDtcblxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbmZ1bmN0aW9uIGNvbnZlcnRDaGFuZ2VzVG9YTUwoY2hhbmdlcykge1xuICB2YXIgcmV0ID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNoYW5nZSA9IGNoYW5nZXNbaV07XG5cbiAgICBpZiAoY2hhbmdlLmFkZGVkKSB7XG4gICAgICByZXQucHVzaCgnPGlucz4nKTtcbiAgICB9IGVsc2UgaWYgKGNoYW5nZS5yZW1vdmVkKSB7XG4gICAgICByZXQucHVzaCgnPGRlbD4nKTtcbiAgICB9XG5cbiAgICByZXQucHVzaChlc2NhcGVIVE1MKGNoYW5nZS52YWx1ZSkpO1xuXG4gICAgaWYgKGNoYW5nZS5hZGRlZCkge1xuICAgICAgcmV0LnB1c2goJzwvaW5zPicpO1xuICAgIH0gZWxzZSBpZiAoY2hhbmdlLnJlbW92ZWQpIHtcbiAgICAgIHJldC5wdXNoKCc8L2RlbD4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmV0LmpvaW4oJycpO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVIVE1MKHMpIHtcbiAgdmFyIG4gPSBzO1xuICBuID0gbi5yZXBsYWNlKC8mL2csICcmYW1wOycpO1xuICBuID0gbi5yZXBsYWNlKC88L2csICcmbHQ7Jyk7XG4gIG4gPSBuLnJlcGxhY2UoLz4vZywgJyZndDsnKTtcbiAgbiA9IG4ucmVwbGFjZSgvXCIvZywgJyZxdW90OycpO1xuICByZXR1cm4gbjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OWpiMjUyWlhKMEwzaHRiQzVxY3lKZExDSnVZVzFsY3lJNld5SmpiMjUyWlhKMFEyaGhibWRsYzFSdldFMU1JaXdpWTJoaGJtZGxjeUlzSW5KbGRDSXNJbWtpTENKc1pXNW5kR2dpTENKamFHRnVaMlVpTENKaFpHUmxaQ0lzSW5CMWMyZ2lMQ0p5WlcxdmRtVmtJaXdpWlhOallYQmxTRlJOVENJc0luWmhiSFZsSWl3aWFtOXBiaUlzSW5NaUxDSnVJaXdpY21Wd2JHRmpaU0pkTENKdFlYQndhVzVuY3lJNklqczdPenM3T3pzN08wRkJRVThzVTBGQlUwRXNiVUpCUVZRc1EwRkJOa0pETEU5QlFUZENMRVZCUVhORE8wRkJRek5ETEUxQlFVbERMRWRCUVVjc1IwRkJSeXhGUVVGV096dEJRVU5CTEU5QlFVc3NTVUZCU1VNc1EwRkJReXhIUVVGSExFTkJRV0lzUlVGQlowSkJMRU5CUVVNc1IwRkJSMFlzVDBGQlR5eERRVUZEUnl4TlFVRTFRaXhGUVVGdlEwUXNRMEZCUXl4RlFVRnlReXhGUVVGNVF6dEJRVU4yUXl4UlFVRkpSU3hOUVVGTkxFZEJRVWRLTEU5QlFVOHNRMEZCUTBVc1EwRkJSQ3hEUVVGd1FqczdRVUZEUVN4UlFVRkpSU3hOUVVGTkxFTkJRVU5ETEV0QlFWZ3NSVUZCYTBJN1FVRkRhRUpLTEUxQlFVRkJMRWRCUVVjc1EwRkJRMHNzU1VGQlNpeERRVUZUTEU5QlFWUTdRVUZEUkN4TFFVWkVMRTFCUlU4c1NVRkJTVVlzVFVGQlRTeERRVUZEUnl4UFFVRllMRVZCUVc5Q08wRkJRM3BDVGl4TlFVRkJRU3hIUVVGSExFTkJRVU5MTEVsQlFVb3NRMEZCVXl4UFFVRlVPMEZCUTBRN08wRkJSVVJNTEVsQlFVRkJMRWRCUVVjc1EwRkJRMHNzU1VGQlNpeERRVUZUUlN4VlFVRlZMRU5CUVVOS0xFMUJRVTBzUTBGQlEwc3NTMEZCVWl4RFFVRnVRanM3UVVGRlFTeFJRVUZKVEN4TlFVRk5MRU5CUVVORExFdEJRVmdzUlVGQmEwSTdRVUZEYUVKS0xFMUJRVUZCTEVkQlFVY3NRMEZCUTBzc1NVRkJTaXhEUVVGVExGRkJRVlE3UVVGRFJDeExRVVpFTEUxQlJVOHNTVUZCU1VZc1RVRkJUU3hEUVVGRFJ5eFBRVUZZTEVWQlFXOUNPMEZCUTNwQ1RpeE5RVUZCUVN4SFFVRkhMRU5CUVVOTExFbEJRVW9zUTBGQlV5eFJRVUZVTzBGQlEwUTdRVUZEUmpzN1FVRkRSQ3hUUVVGUFRDeEhRVUZITEVOQlFVTlRMRWxCUVVvc1EwRkJVeXhGUVVGVUxFTkJRVkE3UVVGRFJEczdRVUZGUkN4VFFVRlRSaXhWUVVGVUxFTkJRVzlDUnl4RFFVRndRaXhGUVVGMVFqdEJRVU55UWl4TlFVRkpReXhEUVVGRExFZEJRVWRFTEVOQlFWSTdRVUZEUVVNc1JVRkJRVUVzUTBGQlF5eEhRVUZIUVN4RFFVRkRMRU5CUVVORExFOUJRVVlzUTBGQlZTeEpRVUZXTEVWQlFXZENMRTlCUVdoQ0xFTkJRVW83UVVGRFFVUXNSVUZCUVVFc1EwRkJReXhIUVVGSFFTeERRVUZETEVOQlFVTkRMRTlCUVVZc1EwRkJWU3hKUVVGV0xFVkJRV2RDTEUxQlFXaENMRU5CUVVvN1FVRkRRVVFzUlVGQlFVRXNRMEZCUXl4SFFVRkhRU3hEUVVGRExFTkJRVU5ETEU5QlFVWXNRMEZCVlN4SlFVRldMRVZCUVdkQ0xFMUJRV2hDTEVOQlFVbzdRVUZEUVVRc1JVRkJRVUVzUTBGQlF5eEhRVUZIUVN4RFFVRkRMRU5CUVVORExFOUJRVVlzUTBGQlZTeEpRVUZXTEVWQlFXZENMRkZCUVdoQ0xFTkJRVW83UVVGRlFTeFRRVUZQUkN4RFFVRlFPMEZCUTBRaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SmxlSEJ2Y25RZ1puVnVZM1JwYjI0Z1kyOXVkbVZ5ZEVOb1lXNW5aWE5VYjFoTlRDaGphR0Z1WjJWektTQjdYRzRnSUd4bGRDQnlaWFFnUFNCYlhUdGNiaUFnWm05eUlDaHNaWFFnYVNBOUlEQTdJR2tnUENCamFHRnVaMlZ6TG14bGJtZDBhRHNnYVNzcktTQjdYRzRnSUNBZ2JHVjBJR05vWVc1blpTQTlJR05vWVc1blpYTmJhVjA3WEc0Z0lDQWdhV1lnS0dOb1lXNW5aUzVoWkdSbFpDa2dlMXh1SUNBZ0lDQWdjbVYwTG5CMWMyZ29KenhwYm5NK0p5azdYRzRnSUNBZ2ZTQmxiSE5sSUdsbUlDaGphR0Z1WjJVdWNtVnRiM1psWkNrZ2UxeHVJQ0FnSUNBZ2NtVjBMbkIxYzJnb0p6eGtaV3crSnlrN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnY21WMExuQjFjMmdvWlhOallYQmxTRlJOVENoamFHRnVaMlV1ZG1Gc2RXVXBLVHRjYmx4dUlDQWdJR2xtSUNoamFHRnVaMlV1WVdSa1pXUXBJSHRjYmlBZ0lDQWdJSEpsZEM1d2RYTm9LQ2M4TDJsdWN6NG5LVHRjYmlBZ0lDQjlJR1ZzYzJVZ2FXWWdLR05vWVc1blpTNXlaVzF2ZG1Wa0tTQjdYRzRnSUNBZ0lDQnlaWFF1Y0hWemFDZ25QQzlrWld3K0p5azdYRzRnSUNBZ2ZWeHVJQ0I5WEc0Z0lISmxkSFZ5YmlCeVpYUXVhbTlwYmlnbkp5azdYRzU5WEc1Y2JtWjFibU4wYVc5dUlHVnpZMkZ3WlVoVVRVd29jeWtnZTF4dUlDQnNaWFFnYmlBOUlITTdYRzRnSUc0Z1BTQnVMbkpsY0d4aFkyVW9MeVl2Wnl3Z0p5WmhiWEE3SnlrN1hHNGdJRzRnUFNCdUxuSmxjR3hoWTJVb0x6d3ZaeXdnSnlac2REc25LVHRjYmlBZ2JpQTlJRzR1Y21Wd2JHRmpaU2d2UGk5bkxDQW5KbWQwT3ljcE8xeHVJQ0J1SUQwZ2JpNXlaWEJzWVdObEtDOWNJaTluTENBbkpuRjFiM1E3SnlrN1hHNWNiaUFnY21WMGRYSnVJRzQ3WEc1OVhHNGlYWDA9XG4iLCAiLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJEaWZmXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9iYXNlW1wiZGVmYXVsdFwiXTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJkaWZmQ2hhcnNcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2NoYXJhY3Rlci5kaWZmQ2hhcnM7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZGlmZldvcmRzXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF93b3JkLmRpZmZXb3JkcztcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJkaWZmV29yZHNXaXRoU3BhY2VcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3dvcmQuZGlmZldvcmRzV2l0aFNwYWNlO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImRpZmZMaW5lc1wiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfbGluZS5kaWZmTGluZXM7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZGlmZlRyaW1tZWRMaW5lc1wiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfbGluZS5kaWZmVHJpbW1lZExpbmVzO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImRpZmZTZW50ZW5jZXNcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3NlbnRlbmNlLmRpZmZTZW50ZW5jZXM7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZGlmZkNzc1wiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfY3NzLmRpZmZDc3M7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZGlmZkpzb25cIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2pzb24uZGlmZkpzb247XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiY2Fub25pY2FsaXplXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9qc29uLmNhbm9uaWNhbGl6ZTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJkaWZmQXJyYXlzXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9hcnJheS5kaWZmQXJyYXlzO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImFwcGx5UGF0Y2hcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2FwcGx5LmFwcGx5UGF0Y2g7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiYXBwbHlQYXRjaGVzXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9hcHBseS5hcHBseVBhdGNoZXM7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwicGFyc2VQYXRjaFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfcGFyc2UucGFyc2VQYXRjaDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJtZXJnZVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfbWVyZ2UubWVyZ2U7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwicmV2ZXJzZVBhdGNoXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9yZXZlcnNlLnJldmVyc2VQYXRjaDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJzdHJ1Y3R1cmVkUGF0Y2hcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2NyZWF0ZS5zdHJ1Y3R1cmVkUGF0Y2g7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiY3JlYXRlVHdvRmlsZXNQYXRjaFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfY3JlYXRlLmNyZWF0ZVR3b0ZpbGVzUGF0Y2g7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiY3JlYXRlUGF0Y2hcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2NyZWF0ZS5jcmVhdGVQYXRjaDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJmb3JtYXRQYXRjaFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfY3JlYXRlLmZvcm1hdFBhdGNoO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImNvbnZlcnRDaGFuZ2VzVG9ETVBcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2RtcC5jb252ZXJ0Q2hhbmdlc1RvRE1QO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImNvbnZlcnRDaGFuZ2VzVG9YTUxcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3htbC5jb252ZXJ0Q2hhbmdlc1RvWE1MO1xuICB9XG59KTtcblxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbnZhclxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuX2Jhc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2RpZmYvYmFzZVwiKSlcbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG47XG5cbnZhclxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuX2NoYXJhY3RlciA9IHJlcXVpcmUoXCIuL2RpZmYvY2hhcmFjdGVyXCIpXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuO1xuXG52YXJcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl93b3JkID0gcmVxdWlyZShcIi4vZGlmZi93b3JkXCIpXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuO1xuXG52YXJcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl9saW5lID0gcmVxdWlyZShcIi4vZGlmZi9saW5lXCIpXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuO1xuXG52YXJcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl9zZW50ZW5jZSA9IHJlcXVpcmUoXCIuL2RpZmYvc2VudGVuY2VcIilcbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG47XG5cbnZhclxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuX2NzcyA9IHJlcXVpcmUoXCIuL2RpZmYvY3NzXCIpXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuO1xuXG52YXJcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl9qc29uID0gcmVxdWlyZShcIi4vZGlmZi9qc29uXCIpXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuO1xuXG52YXJcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl9hcnJheSA9IHJlcXVpcmUoXCIuL2RpZmYvYXJyYXlcIilcbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG47XG5cbnZhclxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuX2FwcGx5ID0gcmVxdWlyZShcIi4vcGF0Y2gvYXBwbHlcIilcbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG47XG5cbnZhclxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuX3BhcnNlID0gcmVxdWlyZShcIi4vcGF0Y2gvcGFyc2VcIilcbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG47XG5cbnZhclxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuX21lcmdlID0gcmVxdWlyZShcIi4vcGF0Y2gvbWVyZ2VcIilcbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG47XG5cbnZhclxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuX3JldmVyc2UgPSByZXF1aXJlKFwiLi9wYXRjaC9yZXZlcnNlXCIpXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuO1xuXG52YXJcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl9jcmVhdGUgPSByZXF1aXJlKFwiLi9wYXRjaC9jcmVhdGVcIilcbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG47XG5cbnZhclxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuX2RtcCA9IHJlcXVpcmUoXCIuL2NvbnZlcnQvZG1wXCIpXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuO1xuXG52YXJcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl94bWwgPSByZXF1aXJlKFwiLi9jb252ZXJ0L3htbFwiKVxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbjtcblxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMM055WXk5cGJtUmxlQzVxY3lKZExDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pT3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096dEJRV2RDUVR0QlFVRkJPMEZCUVVFN1FVRkJRVHRCUVVGQk96dEJRVU5CTzBGQlFVRTdRVUZCUVR0QlFVRkJPMEZCUVVFN08wRkJRMEU3UVVGQlFUdEJRVUZCTzBGQlFVRTdRVUZCUVRzN1FVRkRRVHRCUVVGQk8wRkJRVUU3UVVGQlFUdEJRVUZCT3p0QlFVTkJPMEZCUVVFN1FVRkJRVHRCUVVGQk8wRkJRVUU3TzBGQlJVRTdRVUZCUVR0QlFVRkJPMEZCUVVFN1FVRkJRVHM3UVVGRFFUdEJRVUZCTzBGQlFVRTdRVUZCUVR0QlFVRkJPenRCUVVWQk8wRkJRVUU3UVVGQlFUdEJRVUZCTzBGQlFVRTdPMEZCUlVFN1FVRkJRVHRCUVVGQk8wRkJRVUU3UVVGQlFUczdRVUZEUVR0QlFVRkJPMEZCUVVFN1FVRkJRVHRCUVVGQk96dEJRVU5CTzBGQlFVRTdRVUZCUVR0QlFVRkJPMEZCUVVFN08wRkJRMEU3UVVGQlFUdEJRVUZCTzBGQlFVRTdRVUZCUVRzN1FVRkRRVHRCUVVGQk8wRkJRVUU3UVVGQlFUdEJRVUZCT3p0QlFVVkJPMEZCUVVFN1FVRkJRVHRCUVVGQk8wRkJRVUU3TzBGQlEwRTdRVUZCUVR0QlFVRkJPMEZCUVVFN1FVRkJRU0lzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSWk4cUlGTmxaU0JNU1VORlRsTkZJR1pwYkdVZ1ptOXlJSFJsY20xeklHOW1JSFZ6WlNBcUwxeHVYRzR2S2x4dUlDb2dWR1Y0ZENCa2FXWm1JR2x0Y0d4bGJXVnVkR0YwYVc5dUxseHVJQ3BjYmlBcUlGUm9hWE1nYkdsaWNtRnllU0J6ZFhCd2IzSjBjeUIwYUdVZ1ptOXNiRzkzYVc1bklFRlFTWE02WEc0Z0tpQkVhV1ptTG1ScFptWkRhR0Z5Y3pvZ1EyaGhjbUZqZEdWeUlHSjVJR05vWVhKaFkzUmxjaUJrYVdabVhHNGdLaUJFYVdabUxtUnBabVpYYjNKa2N6b2dWMjl5WkNBb1lYTWdaR1ZtYVc1bFpDQmllU0JjWEdJZ2NtVm5aWGdwSUdScFptWWdkMmhwWTJnZ2FXZHViM0psY3lCM2FHbDBaWE53WVdObFhHNGdLaUJFYVdabUxtUnBabVpNYVc1bGN6b2dUR2x1WlNCaVlYTmxaQ0JrYVdabVhHNGdLbHh1SUNvZ1JHbG1aaTVrYVdabVEzTnpPaUJFYVdabUlIUmhjbWRsZEdWa0lHRjBJRU5UVXlCamIyNTBaVzUwWEc0Z0tseHVJQ29nVkdobGMyVWdiV1YwYUc5a2N5QmhjbVVnWW1GelpXUWdiMjRnZEdobElHbHRjR3hsYldWdWRHRjBhVzl1SUhCeWIzQnZjMlZrSUdsdVhHNGdLaUJjSWtGdUlFOG9Ua1FwSUVScFptWmxjbVZ1WTJVZ1FXeG5iM0pwZEdodElHRnVaQ0JwZEhNZ1ZtRnlhV0YwYVc5dWMxd2lJQ2hOZVdWeWN5d2dNVGs0TmlrdVhHNGdLaUJvZEhSd09pOHZZMmwwWlhObFpYSjRMbWx6ZEM1d2MzVXVaV1IxTDNacFpYZGtiMk12YzNWdGJXRnllVDlrYjJrOU1UQXVNUzR4TGpRdU5qa3lOMXh1SUNvdlhHNXBiWEJ2Y25RZ1JHbG1aaUJtY205dElDY3VMMlJwWm1ZdlltRnpaU2M3WEc1cGJYQnZjblFnZTJScFptWkRhR0Z5YzMwZ1puSnZiU0FuTGk5a2FXWm1MMk5vWVhKaFkzUmxjaWM3WEc1cGJYQnZjblFnZTJScFptWlhiM0prY3l3Z1pHbG1abGR2Y21SelYybDBhRk53WVdObGZTQm1jbTl0SUNjdUwyUnBabVl2ZDI5eVpDYzdYRzVwYlhCdmNuUWdlMlJwWm1aTWFXNWxjeXdnWkdsbVpsUnlhVzF0WldSTWFXNWxjMzBnWm5KdmJTQW5MaTlrYVdabUwyeHBibVVuTzF4dWFXMXdiM0owSUh0a2FXWm1VMlZ1ZEdWdVkyVnpmU0JtY205dElDY3VMMlJwWm1ZdmMyVnVkR1Z1WTJVbk8xeHVYRzVwYlhCdmNuUWdlMlJwWm1aRGMzTjlJR1p5YjIwZ0p5NHZaR2xtWmk5amMzTW5PMXh1YVcxd2IzSjBJSHRrYVdabVNuTnZiaXdnWTJGdWIyNXBZMkZzYVhwbGZTQm1jbTl0SUNjdUwyUnBabVl2YW5OdmJpYzdYRzVjYm1sdGNHOXlkQ0I3WkdsbVprRnljbUY1YzMwZ1puSnZiU0FuTGk5a2FXWm1MMkZ5Y21GNUp6dGNibHh1YVcxd2IzSjBJSHRoY0hCc2VWQmhkR05vTENCaGNIQnNlVkJoZEdOb1pYTjlJR1p5YjIwZ0p5NHZjR0YwWTJndllYQndiSGtuTzF4dWFXMXdiM0owSUh0d1lYSnpaVkJoZEdOb2ZTQm1jbTl0SUNjdUwzQmhkR05vTDNCaGNuTmxKenRjYm1sdGNHOXlkQ0I3YldWeVoyVjlJR1p5YjIwZ0p5NHZjR0YwWTJndmJXVnlaMlVuTzF4dWFXMXdiM0owSUh0eVpYWmxjbk5sVUdGMFkyaDlJR1p5YjIwZ0p5NHZjR0YwWTJndmNtVjJaWEp6WlNjN1hHNXBiWEJ2Y25RZ2UzTjBjblZqZEhWeVpXUlFZWFJqYUN3Z1kzSmxZWFJsVkhkdlJtbHNaWE5RWVhSamFDd2dZM0psWVhSbFVHRjBZMmdzSUdadmNtMWhkRkJoZEdOb2ZTQm1jbTl0SUNjdUwzQmhkR05vTDJOeVpXRjBaU2M3WEc1Y2JtbHRjRzl5ZENCN1kyOXVkbVZ5ZEVOb1lXNW5aWE5VYjBSTlVIMGdabkp2YlNBbkxpOWpiMjUyWlhKMEwyUnRjQ2M3WEc1cGJYQnZjblFnZTJOdmJuWmxjblJEYUdGdVoyVnpWRzlZVFV4OUlHWnliMjBnSnk0dlkyOXVkbVZ5ZEM5NGJXd25PMXh1WEc1bGVIQnZjblFnZTF4dUlDQkVhV1ptTEZ4dVhHNGdJR1JwWm1aRGFHRnljeXhjYmlBZ1pHbG1abGR2Y21SekxGeHVJQ0JrYVdabVYyOXlaSE5YYVhSb1UzQmhZMlVzWEc0Z0lHUnBabVpNYVc1bGN5eGNiaUFnWkdsbVpsUnlhVzF0WldSTWFXNWxjeXhjYmlBZ1pHbG1abE5sYm5SbGJtTmxjeXhjYmx4dUlDQmthV1ptUTNOekxGeHVJQ0JrYVdabVNuTnZiaXhjYmx4dUlDQmthV1ptUVhKeVlYbHpMRnh1WEc0Z0lITjBjblZqZEhWeVpXUlFZWFJqYUN4Y2JpQWdZM0psWVhSbFZIZHZSbWxzWlhOUVlYUmphQ3hjYmlBZ1kzSmxZWFJsVUdGMFkyZ3NYRzRnSUdadmNtMWhkRkJoZEdOb0xGeHVJQ0JoY0hCc2VWQmhkR05vTEZ4dUlDQmhjSEJzZVZCaGRHTm9aWE1zWEc0Z0lIQmhjbk5sVUdGMFkyZ3NYRzRnSUcxbGNtZGxMRnh1SUNCeVpYWmxjbk5sVUdGMFkyZ3NYRzRnSUdOdmJuWmxjblJEYUdGdVoyVnpWRzlFVFZBc1hHNGdJR052Ym5abGNuUkRhR0Z1WjJWelZHOVlUVXdzWEc0Z0lHTmhibTl1YVdOaGJHbDZaVnh1ZlR0Y2JpSmRmUT09XG4iLCAiLyoqXG4gKiBIZWxwZXJzLlxuICovXG5cbnZhciBzID0gMTAwMDtcbnZhciBtID0gcyAqIDYwO1xudmFyIGggPSBtICogNjA7XG52YXIgZCA9IGggKiAyNDtcbnZhciB3ID0gZCAqIDc7XG52YXIgeSA9IGQgKiAzNjUuMjU7XG5cbi8qKlxuICogUGFyc2Ugb3IgZm9ybWF0IHRoZSBnaXZlbiBgdmFsYC5cbiAqXG4gKiBPcHRpb25zOlxuICpcbiAqICAtIGBsb25nYCB2ZXJib3NlIGZvcm1hdHRpbmcgW2ZhbHNlXVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gdmFsXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhyb3cgYW4gZXJyb3IgaWYgdmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSBudW1iZXJcbiAqIEByZXR1cm4ge1N0cmluZ3xOdW1iZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHZhbCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsO1xuICBpZiAodHlwZSA9PT0gJ3N0cmluZycgJiYgdmFsLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gcGFyc2UodmFsKTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZSh2YWwpKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMubG9uZyA/IGZtdExvbmcodmFsKSA6IGZtdFNob3J0KHZhbCk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgICd2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIHZhbGlkIG51bWJlci4gdmFsPScgK1xuICAgICAgSlNPTi5zdHJpbmdpZnkodmFsKVxuICApO1xufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gYHN0cmAgYW5kIHJldHVybiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2Uoc3RyKSB7XG4gIHN0ciA9IFN0cmluZyhzdHIpO1xuICBpZiAoc3RyLmxlbmd0aCA+IDEwMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbWF0Y2ggPSAvXigtPyg/OlxcZCspP1xcLj9cXGQrKSAqKG1pbGxpc2Vjb25kcz98bXNlY3M/fG1zfHNlY29uZHM/fHNlY3M/fHN8bWludXRlcz98bWlucz98bXxob3Vycz98aHJzP3xofGRheXM/fGR8d2Vla3M/fHd8eWVhcnM/fHlycz98eSk/JC9pLmV4ZWMoXG4gICAgc3RyXG4gICk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG4gPSBwYXJzZUZsb2F0KG1hdGNoWzFdKTtcbiAgdmFyIHR5cGUgPSAobWF0Y2hbMl0gfHwgJ21zJykudG9Mb3dlckNhc2UoKTtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAneWVhcnMnOlxuICAgIGNhc2UgJ3llYXInOlxuICAgIGNhc2UgJ3lycyc6XG4gICAgY2FzZSAneXInOlxuICAgIGNhc2UgJ3knOlxuICAgICAgcmV0dXJuIG4gKiB5O1xuICAgIGNhc2UgJ3dlZWtzJzpcbiAgICBjYXNlICd3ZWVrJzpcbiAgICBjYXNlICd3JzpcbiAgICAgIHJldHVybiBuICogdztcbiAgICBjYXNlICdkYXlzJzpcbiAgICBjYXNlICdkYXknOlxuICAgIGNhc2UgJ2QnOlxuICAgICAgcmV0dXJuIG4gKiBkO1xuICAgIGNhc2UgJ2hvdXJzJzpcbiAgICBjYXNlICdob3VyJzpcbiAgICBjYXNlICdocnMnOlxuICAgIGNhc2UgJ2hyJzpcbiAgICBjYXNlICdoJzpcbiAgICAgIHJldHVybiBuICogaDtcbiAgICBjYXNlICdtaW51dGVzJzpcbiAgICBjYXNlICdtaW51dGUnOlxuICAgIGNhc2UgJ21pbnMnOlxuICAgIGNhc2UgJ21pbic6XG4gICAgY2FzZSAnbSc6XG4gICAgICByZXR1cm4gbiAqIG07XG4gICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgY2FzZSAnc2Vjb25kJzpcbiAgICBjYXNlICdzZWNzJzpcbiAgICBjYXNlICdzZWMnOlxuICAgIGNhc2UgJ3MnOlxuICAgICAgcmV0dXJuIG4gKiBzO1xuICAgIGNhc2UgJ21pbGxpc2Vjb25kcyc6XG4gICAgY2FzZSAnbWlsbGlzZWNvbmQnOlxuICAgIGNhc2UgJ21zZWNzJzpcbiAgICBjYXNlICdtc2VjJzpcbiAgICBjYXNlICdtcyc6XG4gICAgICByZXR1cm4gbjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFNob3J0IGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZtdFNob3J0KG1zKSB7XG4gIHZhciBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgaWYgKG1zQWJzID49IGQpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGQpICsgJ2QnO1xuICB9XG4gIGlmIChtc0FicyA+PSBoKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBoKSArICdoJztcbiAgfVxuICBpZiAobXNBYnMgPj0gbSkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbSkgKyAnbSc7XG4gIH1cbiAgaWYgKG1zQWJzID49IHMpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIHMpICsgJ3MnO1xuICB9XG4gIHJldHVybiBtcyArICdtcyc7XG59XG5cbi8qKlxuICogTG9uZyBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmbXRMb25nKG1zKSB7XG4gIHZhciBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgaWYgKG1zQWJzID49IGQpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgZCwgJ2RheScpO1xuICB9XG4gIGlmIChtc0FicyA+PSBoKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGgsICdob3VyJyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IG0pIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgbSwgJ21pbnV0ZScpO1xuICB9XG4gIGlmIChtc0FicyA+PSBzKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIHMsICdzZWNvbmQnKTtcbiAgfVxuICByZXR1cm4gbXMgKyAnIG1zJztcbn1cblxuLyoqXG4gKiBQbHVyYWxpemF0aW9uIGhlbHBlci5cbiAqL1xuXG5mdW5jdGlvbiBwbHVyYWwobXMsIG1zQWJzLCBuLCBuYW1lKSB7XG4gIHZhciBpc1BsdXJhbCA9IG1zQWJzID49IG4gKiAxLjU7XG4gIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbikgKyAnICcgKyBuYW1lICsgKGlzUGx1cmFsID8gJ3MnIDogJycpO1xufVxuIiwgIlxudmFyIGxvb2t1cCA9IFtdXG52YXIgcmV2TG9va3VwID0gW11cbnZhciBBcnIgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBVaW50OEFycmF5IDogQXJyYXlcbnZhciBpbml0ZWQgPSBmYWxzZTtcbmZ1bmN0aW9uIGluaXQgKCkge1xuICBpbml0ZWQgPSB0cnVlO1xuICB2YXIgY29kZSA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJ1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gY29kZS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgIGxvb2t1cFtpXSA9IGNvZGVbaV1cbiAgICByZXZMb29rdXBbY29kZS5jaGFyQ29kZUF0KGkpXSA9IGlcbiAgfVxuXG4gIHJldkxvb2t1cFsnLScuY2hhckNvZGVBdCgwKV0gPSA2MlxuICByZXZMb29rdXBbJ18nLmNoYXJDb2RlQXQoMCldID0gNjNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvQnl0ZUFycmF5IChiNjQpIHtcbiAgaWYgKCFpbml0ZWQpIHtcbiAgICBpbml0KCk7XG4gIH1cbiAgdmFyIGksIGosIGwsIHRtcCwgcGxhY2VIb2xkZXJzLCBhcnJcbiAgdmFyIGxlbiA9IGI2NC5sZW5ndGhcblxuICBpZiAobGVuICUgNCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQnKVxuICB9XG5cbiAgLy8gdGhlIG51bWJlciBvZiBlcXVhbCBzaWducyAocGxhY2UgaG9sZGVycylcbiAgLy8gaWYgdGhlcmUgYXJlIHR3byBwbGFjZWhvbGRlcnMsIHRoYW4gdGhlIHR3byBjaGFyYWN0ZXJzIGJlZm9yZSBpdFxuICAvLyByZXByZXNlbnQgb25lIGJ5dGVcbiAgLy8gaWYgdGhlcmUgaXMgb25seSBvbmUsIHRoZW4gdGhlIHRocmVlIGNoYXJhY3RlcnMgYmVmb3JlIGl0IHJlcHJlc2VudCAyIGJ5dGVzXG4gIC8vIHRoaXMgaXMganVzdCBhIGNoZWFwIGhhY2sgdG8gbm90IGRvIGluZGV4T2YgdHdpY2VcbiAgcGxhY2VIb2xkZXJzID0gYjY0W2xlbiAtIDJdID09PSAnPScgPyAyIDogYjY0W2xlbiAtIDFdID09PSAnPScgPyAxIDogMFxuXG4gIC8vIGJhc2U2NCBpcyA0LzMgKyB1cCB0byB0d28gY2hhcmFjdGVycyBvZiB0aGUgb3JpZ2luYWwgZGF0YVxuICBhcnIgPSBuZXcgQXJyKGxlbiAqIDMgLyA0IC0gcGxhY2VIb2xkZXJzKVxuXG4gIC8vIGlmIHRoZXJlIGFyZSBwbGFjZWhvbGRlcnMsIG9ubHkgZ2V0IHVwIHRvIHRoZSBsYXN0IGNvbXBsZXRlIDQgY2hhcnNcbiAgbCA9IHBsYWNlSG9sZGVycyA+IDAgPyBsZW4gLSA0IDogbGVuXG5cbiAgdmFyIEwgPSAwXG5cbiAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBsOyBpICs9IDQsIGogKz0gMykge1xuICAgIHRtcCA9IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDE4KSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCAxMikgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPDwgNikgfCByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDMpXVxuICAgIGFycltMKytdID0gKHRtcCA+PiAxNikgJiAweEZGXG4gICAgYXJyW0wrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltMKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVycyA9PT0gMikge1xuICAgIHRtcCA9IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDIpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldID4+IDQpXG4gICAgYXJyW0wrK10gPSB0bXAgJiAweEZGXG4gIH0gZWxzZSBpZiAocGxhY2VIb2xkZXJzID09PSAxKSB7XG4gICAgdG1wID0gKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTApIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDQpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildID4+IDIpXG4gICAgYXJyW0wrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltMKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuICByZXR1cm4gbG9va3VwW251bSA+PiAxOCAmIDB4M0ZdICsgbG9va3VwW251bSA+PiAxMiAmIDB4M0ZdICsgbG9va3VwW251bSA+PiA2ICYgMHgzRl0gKyBsb29rdXBbbnVtICYgMHgzRl1cbn1cblxuZnVuY3Rpb24gZW5jb2RlQ2h1bmsgKHVpbnQ4LCBzdGFydCwgZW5kKSB7XG4gIHZhciB0bXBcbiAgdmFyIG91dHB1dCA9IFtdXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSAzKSB7XG4gICAgdG1wID0gKHVpbnQ4W2ldIDw8IDE2KSArICh1aW50OFtpICsgMV0gPDwgOCkgKyAodWludDhbaSArIDJdKVxuICAgIG91dHB1dC5wdXNoKHRyaXBsZXRUb0Jhc2U2NCh0bXApKVxuICB9XG4gIHJldHVybiBvdXRwdXQuam9pbignJylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21CeXRlQXJyYXkgKHVpbnQ4KSB7XG4gIGlmICghaW5pdGVkKSB7XG4gICAgaW5pdCgpO1xuICB9XG4gIHZhciB0bXBcbiAgdmFyIGxlbiA9IHVpbnQ4Lmxlbmd0aFxuICB2YXIgZXh0cmFCeXRlcyA9IGxlbiAlIDMgLy8gaWYgd2UgaGF2ZSAxIGJ5dGUgbGVmdCwgcGFkIDIgYnl0ZXNcbiAgdmFyIG91dHB1dCA9ICcnXG4gIHZhciBwYXJ0cyA9IFtdXG4gIHZhciBtYXhDaHVua0xlbmd0aCA9IDE2MzgzIC8vIG11c3QgYmUgbXVsdGlwbGUgb2YgM1xuXG4gIC8vIGdvIHRocm91Z2ggdGhlIGFycmF5IGV2ZXJ5IHRocmVlIGJ5dGVzLCB3ZSdsbCBkZWFsIHdpdGggdHJhaWxpbmcgc3R1ZmYgbGF0ZXJcbiAgZm9yICh2YXIgaSA9IDAsIGxlbjIgPSBsZW4gLSBleHRyYUJ5dGVzOyBpIDwgbGVuMjsgaSArPSBtYXhDaHVua0xlbmd0aCkge1xuICAgIHBhcnRzLnB1c2goZW5jb2RlQ2h1bmsodWludDgsIGksIChpICsgbWF4Q2h1bmtMZW5ndGgpID4gbGVuMiA/IGxlbjIgOiAoaSArIG1heENodW5rTGVuZ3RoKSkpXG4gIH1cblxuICAvLyBwYWQgdGhlIGVuZCB3aXRoIHplcm9zLCBidXQgbWFrZSBzdXJlIHRvIG5vdCBmb3JnZXQgdGhlIGV4dHJhIGJ5dGVzXG4gIGlmIChleHRyYUJ5dGVzID09PSAxKSB7XG4gICAgdG1wID0gdWludDhbbGVuIC0gMV1cbiAgICBvdXRwdXQgKz0gbG9va3VwW3RtcCA+PiAyXVxuICAgIG91dHB1dCArPSBsb29rdXBbKHRtcCA8PCA0KSAmIDB4M0ZdXG4gICAgb3V0cHV0ICs9ICc9PSdcbiAgfSBlbHNlIGlmIChleHRyYUJ5dGVzID09PSAyKSB7XG4gICAgdG1wID0gKHVpbnQ4W2xlbiAtIDJdIDw8IDgpICsgKHVpbnQ4W2xlbiAtIDFdKVxuICAgIG91dHB1dCArPSBsb29rdXBbdG1wID4+IDEwXVxuICAgIG91dHB1dCArPSBsb29rdXBbKHRtcCA+PiA0KSAmIDB4M0ZdXG4gICAgb3V0cHV0ICs9IGxvb2t1cFsodG1wIDw8IDIpICYgMHgzRl1cbiAgICBvdXRwdXQgKz0gJz0nXG4gIH1cblxuICBwYXJ0cy5wdXNoKG91dHB1dClcblxuICByZXR1cm4gcGFydHMuam9pbignJylcbn1cbiIsICJcbmV4cG9ydCBmdW5jdGlvbiByZWFkIChidWZmZXIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtXG4gIHZhciBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgbkJpdHMgPSAtN1xuICB2YXIgaSA9IGlzTEUgPyAobkJ5dGVzIC0gMSkgOiAwXG4gIHZhciBkID0gaXNMRSA/IC0xIDogMVxuICB2YXIgcyA9IGJ1ZmZlcltvZmZzZXQgKyBpXVxuXG4gIGkgKz0gZFxuXG4gIGUgPSBzICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIHMgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IGVMZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgZSA9IGUgKiAyNTYgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBtID0gZSAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBlID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBtTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IG0gPSBtICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzXG4gIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkge1xuICAgIHJldHVybiBtID8gTmFOIDogKChzID8gLTEgOiAxKSAqIEluZmluaXR5KVxuICB9IGVsc2Uge1xuICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbilcbiAgICBlID0gZSAtIGVCaWFzXG4gIH1cbiAgcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBNYXRoLnBvdygyLCBlIC0gbUxlbilcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlIChidWZmZXIsIHZhbHVlLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbSwgY1xuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIHJ0ID0gKG1MZW4gPT09IDIzID8gTWF0aC5wb3coMiwgLTI0KSAtIE1hdGgucG93KDIsIC03NykgOiAwKVxuICB2YXIgaSA9IGlzTEUgPyAwIDogKG5CeXRlcyAtIDEpXG4gIHZhciBkID0gaXNMRSA/IDEgOiAtMVxuICB2YXIgcyA9IHZhbHVlIDwgMCB8fCAodmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCkgPyAxIDogMFxuXG4gIHZhbHVlID0gTWF0aC5hYnModmFsdWUpXG5cbiAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpIHtcbiAgICBtID0gaXNOYU4odmFsdWUpID8gMSA6IDBcbiAgICBlID0gZU1heFxuICB9IGVsc2Uge1xuICAgIGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKVxuICAgIGlmICh2YWx1ZSAqIChjID0gTWF0aC5wb3coMiwgLWUpKSA8IDEpIHtcbiAgICAgIGUtLVxuICAgICAgYyAqPSAyXG4gICAgfVxuICAgIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgdmFsdWUgKz0gcnQgLyBjXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlICs9IHJ0ICogTWF0aC5wb3coMiwgMSAtIGVCaWFzKVxuICAgIH1cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrK1xuICAgICAgYyAvPSAyXG4gICAgfVxuXG4gICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XG4gICAgICBtID0gMFxuICAgICAgZSA9IGVNYXhcbiAgICB9IGVsc2UgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICBtID0gKHZhbHVlICogYyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSBlICsgZUJpYXNcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHZhbHVlICogTWF0aC5wb3coMiwgZUJpYXMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gMFxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBtTGVuID49IDg7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IG0gJiAweGZmLCBpICs9IGQsIG0gLz0gMjU2LCBtTGVuIC09IDgpIHt9XG5cbiAgZSA9IChlIDw8IG1MZW4pIHwgbVxuICBlTGVuICs9IG1MZW5cbiAgZm9yICg7IGVMZW4gPiAwOyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBlICYgMHhmZiwgaSArPSBkLCBlIC89IDI1NiwgZUxlbiAtPSA4KSB7fVxuXG4gIGJ1ZmZlcltvZmZzZXQgKyBpIC0gZF0gfD0gcyAqIDEyOFxufVxuIiwgInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5leHBvcnQgZGVmYXVsdCBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIChhcnIpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoYXJyKSA9PSAnW29iamVjdCBBcnJheV0nO1xufTtcbiIsICIvKiFcbiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxmZXJvc3NAZmVyb3NzLm9yZz4gPGh0dHA6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xuXG5cbmltcG9ydCAqIGFzIGJhc2U2NCBmcm9tICcuL2Jhc2U2NCdcbmltcG9ydCAqIGFzIGllZWU3NTQgZnJvbSAnLi9pZWVlNzU0J1xuaW1wb3J0IGlzQXJyYXkgZnJvbSAnLi9pc0FycmF5J1xuXG5leHBvcnQgdmFyIElOU1BFQ1RfTUFYX0JZVEVTID0gNTBcblxuLyoqXG4gKiBJZiBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgOlxuICogICA9PT0gdHJ1ZSAgICBVc2UgVWludDhBcnJheSBpbXBsZW1lbnRhdGlvbiAoZmFzdGVzdClcbiAqICAgPT09IGZhbHNlICAgVXNlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiAobW9zdCBjb21wYXRpYmxlLCBldmVuIElFNilcbiAqXG4gKiBCcm93c2VycyB0aGF0IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGFyZSBJRSAxMCssIEZpcmVmb3ggNCssIENocm9tZSA3KywgU2FmYXJpIDUuMSssXG4gKiBPcGVyYSAxMS42KywgaU9TIDQuMisuXG4gKlxuICogRHVlIHRvIHZhcmlvdXMgYnJvd3NlciBidWdzLCBzb21ldGltZXMgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIHVzZWQgZXZlblxuICogd2hlbiB0aGUgYnJvd3NlciBzdXBwb3J0cyB0eXBlZCBhcnJheXMuXG4gKlxuICogTm90ZTpcbiAqXG4gKiAgIC0gRmlyZWZveCA0LTI5IGxhY2tzIHN1cHBvcnQgZm9yIGFkZGluZyBuZXcgcHJvcGVydGllcyB0byBgVWludDhBcnJheWAgaW5zdGFuY2VzLFxuICogICAgIFNlZTogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk1NDM4LlxuICpcbiAqICAgLSBDaHJvbWUgOS0xMCBpcyBtaXNzaW5nIHRoZSBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uLlxuICpcbiAqICAgLSBJRTEwIGhhcyBhIGJyb2tlbiBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYXJyYXlzIG9mXG4gKiAgICAgaW5jb3JyZWN0IGxlbmd0aCBpbiBzb21lIHNpdHVhdGlvbnMuXG5cbiAqIFdlIGRldGVjdCB0aGVzZSBidWdneSBicm93c2VycyBhbmQgc2V0IGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGAgdG8gYGZhbHNlYCBzbyB0aGV5XG4gKiBnZXQgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaXMgc2xvd2VyIGJ1dCBiZWhhdmVzIGNvcnJlY3RseS5cbiAqL1xuQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgPSBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVCAhPT0gdW5kZWZpbmVkXG4gID8gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgOiB0cnVlXG5cbi8qXG4gKiBFeHBvcnQga01heExlbmd0aCBhZnRlciB0eXBlZCBhcnJheSBzdXBwb3J0IGlzIGRldGVybWluZWQuXG4gKi9cbnZhciBfa01heExlbmd0aCA9IGtNYXhMZW5ndGgoKVxuZXhwb3J0IHtfa01heExlbmd0aCBhcyBrTWF4TGVuZ3RofTtcbmZ1bmN0aW9uIHR5cGVkQXJyYXlTdXBwb3J0ICgpIHtcbiAgcmV0dXJuIHRydWU7XG4gIC8vIHJvbGx1cCBpc3N1ZXNcbiAgLy8gdHJ5IHtcbiAgLy8gICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMSlcbiAgLy8gICBhcnIuX19wcm90b19fID0ge1xuICAvLyAgICAgX19wcm90b19fOiBVaW50OEFycmF5LnByb3RvdHlwZSxcbiAgLy8gICAgIGZvbzogZnVuY3Rpb24gKCkgeyByZXR1cm4gNDIgfVxuICAvLyAgIH1cbiAgLy8gICByZXR1cm4gYXJyLmZvbygpID09PSA0MiAmJiAvLyB0eXBlZCBhcnJheSBpbnN0YW5jZXMgY2FuIGJlIGF1Z21lbnRlZFxuICAvLyAgICAgICB0eXBlb2YgYXJyLnN1YmFycmF5ID09PSAnZnVuY3Rpb24nICYmIC8vIGNocm9tZSA5LTEwIGxhY2sgYHN1YmFycmF5YFxuICAvLyAgICAgICBhcnIuc3ViYXJyYXkoMSwgMSkuYnl0ZUxlbmd0aCA9PT0gMCAvLyBpZTEwIGhhcyBicm9rZW4gYHN1YmFycmF5YFxuICAvLyB9IGNhdGNoIChlKSB7XG4gIC8vICAgcmV0dXJuIGZhbHNlXG4gIC8vIH1cbn1cblxuZnVuY3Rpb24ga01heExlbmd0aCAoKSB7XG4gIHJldHVybiBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVFxuICAgID8gMHg3ZmZmZmZmZlxuICAgIDogMHgzZmZmZmZmZlxufVxuXG5mdW5jdGlvbiBjcmVhdGVCdWZmZXIgKHRoYXQsIGxlbmd0aCkge1xuICBpZiAoa01heExlbmd0aCgpIDwgbGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgdHlwZWQgYXJyYXkgbGVuZ3RoJylcbiAgfVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSwgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICB0aGF0ID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKVxuICAgIHRoYXQuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrOiBSZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBCdWZmZXIgY2xhc3NcbiAgICBpZiAodGhhdCA9PT0gbnVsbCkge1xuICAgICAgdGhhdCA9IG5ldyBCdWZmZXIobGVuZ3RoKVxuICAgIH1cbiAgICB0aGF0Lmxlbmd0aCA9IGxlbmd0aFxuICB9XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuLyoqXG4gKiBUaGUgQnVmZmVyIGNvbnN0cnVjdG9yIHJldHVybnMgaW5zdGFuY2VzIG9mIGBVaW50OEFycmF5YCB0aGF0IGhhdmUgdGhlaXJcbiAqIHByb3RvdHlwZSBjaGFuZ2VkIHRvIGBCdWZmZXIucHJvdG90eXBlYC4gRnVydGhlcm1vcmUsIGBCdWZmZXJgIGlzIGEgc3ViY2xhc3Mgb2ZcbiAqIGBVaW50OEFycmF5YCwgc28gdGhlIHJldHVybmVkIGluc3RhbmNlcyB3aWxsIGhhdmUgYWxsIHRoZSBub2RlIGBCdWZmZXJgIG1ldGhvZHNcbiAqIGFuZCB0aGUgYFVpbnQ4QXJyYXlgIG1ldGhvZHMuIFNxdWFyZSBicmFja2V0IG5vdGF0aW9uIHdvcmtzIGFzIGV4cGVjdGVkIC0tIGl0XG4gKiByZXR1cm5zIGEgc2luZ2xlIG9jdGV0LlxuICpcbiAqIFRoZSBgVWludDhBcnJheWAgcHJvdG90eXBlIHJlbWFpbnMgdW5tb2RpZmllZC5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gQnVmZmVyIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmICEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlcikpIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIC8vIENvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nT3JPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZydcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIGFsbG9jVW5zYWZlKHRoaXMsIGFyZylcbiAgfVxuICByZXR1cm4gZnJvbSh0aGlzLCBhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnBvb2xTaXplID0gODE5MiAvLyBub3QgdXNlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uXG5cbi8vIFRPRE86IExlZ2FjeSwgbm90IG5lZWRlZCBhbnltb3JlLiBSZW1vdmUgaW4gbmV4dCBtYWpvciB2ZXJzaW9uLlxuQnVmZmVyLl9hdWdtZW50ID0gZnVuY3Rpb24gKGFycikge1xuICBhcnIuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICByZXR1cm4gYXJyXG59XG5cbmZ1bmN0aW9uIGZyb20gKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpXG4gIH1cblxuICByZXR1cm4gZnJvbU9iamVjdCh0aGF0LCB2YWx1ZSlcbn1cblxuLyoqXG4gKiBGdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBCdWZmZXIoYXJnLCBlbmNvZGluZykgYnV0IHRocm93cyBhIFR5cGVFcnJvclxuICogaWYgdmFsdWUgaXMgYSBudW1iZXIuXG4gKiBCdWZmZXIuZnJvbShzdHJbLCBlbmNvZGluZ10pXG4gKiBCdWZmZXIuZnJvbShhcnJheSlcbiAqIEJ1ZmZlci5mcm9tKGJ1ZmZlcilcbiAqIEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyWywgYnl0ZU9mZnNldFssIGxlbmd0aF1dKVxuICoqL1xuQnVmZmVyLmZyb20gPSBmdW5jdGlvbiAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gZnJvbShudWxsLCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5pZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgQnVmZmVyLnByb3RvdHlwZS5fX3Byb3RvX18gPSBVaW50OEFycmF5LnByb3RvdHlwZVxuICBCdWZmZXIuX19wcm90b19fID0gVWludDhBcnJheVxuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnNwZWNpZXMgJiZcbiAgICAgIEJ1ZmZlcltTeW1ib2wuc3BlY2llc10gPT09IEJ1ZmZlcikge1xuICAgIC8vIEZpeCBzdWJhcnJheSgpIGluIEVTMjAxNi4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9wdWxsLzk3XG4gICAgLy8gT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlciwgU3ltYm9sLnNwZWNpZXMsIHtcbiAgICAvLyAgIHZhbHVlOiBudWxsLFxuICAgIC8vICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgLy8gfSlcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRTaXplIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfSBlbHNlIGlmIChzaXplIDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWxsb2MgKHRoYXQsIHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgaWYgKHNpemUgPD0gMCkge1xuICAgIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbiAgfVxuICBpZiAoZmlsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT25seSBwYXkgYXR0ZW50aW9uIHRvIGVuY29kaW5nIGlmIGl0J3MgYSBzdHJpbmcuIFRoaXNcbiAgICAvLyBwcmV2ZW50cyBhY2NpZGVudGFsbHkgc2VuZGluZyBpbiBhIG51bWJlciB0aGF0IHdvdWxkXG4gICAgLy8gYmUgaW50ZXJwcmV0dGVkIGFzIGEgc3RhcnQgb2Zmc2V0LlxuICAgIHJldHVybiB0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnXG4gICAgICA/IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKS5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgICAgOiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSkuZmlsbChmaWxsKVxuICB9XG4gIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiBhbGxvYyhzaXplWywgZmlsbFssIGVuY29kaW5nXV0pXG4gKiovXG5CdWZmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGFsbG9jKG51bGwsIHNpemUsIGZpbGwsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBhbGxvY1Vuc2FmZSAodGhhdCwgc2l6ZSkge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSA8IDAgPyAwIDogY2hlY2tlZChzaXplKSB8IDApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7ICsraSkge1xuICAgICAgdGhhdFtpXSA9IDBcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIEJ1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIFNsb3dCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nICh0aGF0LCBzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnIHx8IGVuY29kaW5nID09PSAnJykge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gIH1cblxuICBpZiAoIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiZW5jb2RpbmdcIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJylcbiAgfVxuXG4gIHZhciBsZW5ndGggPSBieXRlTGVuZ3RoKHN0cmluZywgZW5jb2RpbmcpIHwgMFxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aClcblxuICB2YXIgYWN0dWFsID0gdGhhdC53cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuXG4gIGlmIChhY3R1YWwgIT09IGxlbmd0aCkge1xuICAgIC8vIFdyaXRpbmcgYSBoZXggc3RyaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgd2lsbFxuICAgIC8vIGNhdXNlIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZpcnN0IGludmFsaWQgY2hhcmFjdGVyIHRvIGJlIGlnbm9yZWQuIChlLmcuXG4gICAgLy8gJ2FieHhjZCcgd2lsbCBiZSB0cmVhdGVkIGFzICdhYicpXG4gICAgdGhhdCA9IHRoYXQuc2xpY2UoMCwgYWN0dWFsKVxuICB9XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5TGlrZSAodGhhdCwgYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCA8IDAgPyAwIDogY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIHRoYXRbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUJ1ZmZlciAodGhhdCwgYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICBhcnJheS5ieXRlTGVuZ3RoIC8vIHRoaXMgdGhyb3dzIGlmIGBhcnJheWAgaXMgbm90IGEgdmFsaWQgQXJyYXlCdWZmZXJcblxuICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXFwnb2Zmc2V0XFwnIGlzIG91dCBvZiBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0ICsgKGxlbmd0aCB8fCAwKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcXCdsZW5ndGhcXCcgaXMgb3V0IG9mIGJvdW5kcycpXG4gIH1cblxuICBpZiAoYnl0ZU9mZnNldCA9PT0gdW5kZWZpbmVkICYmIGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSlcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQpXG4gIH0gZWxzZSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IGFycmF5XG4gICAgdGhhdC5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIHRoYXQgPSBmcm9tQXJyYXlMaWtlKHRoYXQsIGFycmF5KVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21PYmplY3QgKHRoYXQsIG9iaikge1xuICBpZiAoaW50ZXJuYWxJc0J1ZmZlcihvYmopKSB7XG4gICAgdmFyIGxlbiA9IGNoZWNrZWQob2JqLmxlbmd0aCkgfCAwXG4gICAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW4pXG5cbiAgICBpZiAodGhhdC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGF0XG4gICAgfVxuXG4gICAgb2JqLmNvcHkodGhhdCwgMCwgMCwgbGVuKVxuICAgIHJldHVybiB0aGF0XG4gIH1cblxuICBpZiAob2JqKSB7XG4gICAgaWYgKCh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIG9iai5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgfHwgJ2xlbmd0aCcgaW4gb2JqKSB7XG4gICAgICBpZiAodHlwZW9mIG9iai5sZW5ndGggIT09ICdudW1iZXInIHx8IGlzbmFuKG9iai5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgMClcbiAgICAgIH1cbiAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKHRoYXQsIG9iailcbiAgICB9XG5cbiAgICBpZiAob2JqLnR5cGUgPT09ICdCdWZmZXInICYmIGlzQXJyYXkob2JqLmRhdGEpKSB7XG4gICAgICByZXR1cm4gZnJvbUFycmF5TGlrZSh0aGF0LCBvYmouZGF0YSlcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCdGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuJylcbn1cblxuZnVuY3Rpb24gY2hlY2tlZCAobGVuZ3RoKSB7XG4gIC8vIE5vdGU6IGNhbm5vdCB1c2UgYGxlbmd0aCA8IGtNYXhMZW5ndGgoKWAgaGVyZSBiZWNhdXNlIHRoYXQgZmFpbHMgd2hlblxuICAvLyBsZW5ndGggaXMgTmFOICh3aGljaCBpcyBvdGhlcndpc2UgY29lcmNlZCB0byB6ZXJvLilcbiAgaWYgKGxlbmd0aCA+PSBrTWF4TGVuZ3RoKCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAnc2l6ZTogMHgnICsga01heExlbmd0aCgpLnRvU3RyaW5nKDE2KSArICcgYnl0ZXMnKVxuICB9XG4gIHJldHVybiBsZW5ndGggfCAwXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBTbG93QnVmZmVyIChsZW5ndGgpIHtcbiAgaWYgKCtsZW5ndGggIT0gbGVuZ3RoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZXFlcWVxXG4gICAgbGVuZ3RoID0gMFxuICB9XG4gIHJldHVybiBCdWZmZXIuYWxsb2MoK2xlbmd0aClcbn1cbkJ1ZmZlci5pc0J1ZmZlciA9IGlzQnVmZmVyO1xuZnVuY3Rpb24gaW50ZXJuYWxJc0J1ZmZlciAoYikge1xuICByZXR1cm4gISEoYiAhPSBudWxsICYmIGIuX2lzQnVmZmVyKVxufVxuXG5CdWZmZXIuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKGEsIGIpIHtcbiAgaWYgKCFpbnRlcm5hbElzQnVmZmVyKGEpIHx8ICFpbnRlcm5hbElzQnVmZmVyKGIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycycpXG4gIH1cblxuICBpZiAoYSA9PT0gYikgcmV0dXJuIDBcblxuICB2YXIgeCA9IGEubGVuZ3RoXG4gIHZhciB5ID0gYi5sZW5ndGhcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXVxuICAgICAgeSA9IGJbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5CdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0IChsaXN0LCBsZW5ndGgpIHtcbiAgaWYgKCFpc0FycmF5KGxpc3QpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBCdWZmZXIuYWxsb2MoMClcbiAgfVxuXG4gIHZhciBpXG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGxlbmd0aCA9IDBcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoXG4gICAgfVxuICB9XG5cbiAgdmFyIGJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShsZW5ndGgpXG4gIHZhciBwb3MgPSAwXG4gIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGJ1ZiA9IGxpc3RbaV1cbiAgICBpZiAoIWludGVybmFsSXNCdWZmZXIoYnVmKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgICB9XG4gICAgYnVmLmNvcHkoYnVmZmVyLCBwb3MpXG4gICAgcG9zICs9IGJ1Zi5sZW5ndGhcbiAgfVxuICByZXR1cm4gYnVmZmVyXG59XG5cbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKGludGVybmFsSXNCdWZmZXIoc3RyaW5nKSkge1xuICAgIHJldHVybiBzdHJpbmcubGVuZ3RoXG4gIH1cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgKEFycmF5QnVmZmVyLmlzVmlldyhzdHJpbmcpIHx8IHN0cmluZyBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSkge1xuICAgIHJldHVybiBzdHJpbmcuYnl0ZUxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuICAgIHN0cmluZyA9ICcnICsgc3RyaW5nXG4gIH1cblxuICB2YXIgbGVuID0gc3RyaW5nLmxlbmd0aFxuICBpZiAobGVuID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIFVzZSBhIGZvciBsb29wIHRvIGF2b2lkIHJlY3Vyc2lvblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsZW5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIGxlbiAqIDJcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBsZW4gPj4+IDFcbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aCAvLyBhc3N1bWUgdXRmOFxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuQnVmZmVyLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5cbmZ1bmN0aW9uIHNsb3dUb1N0cmluZyAoZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcblxuICAvLyBObyBuZWVkIHRvIHZlcmlmeSB0aGF0IFwidGhpcy5sZW5ndGggPD0gTUFYX1VJTlQzMlwiIHNpbmNlIGl0J3MgYSByZWFkLW9ubHlcbiAgLy8gcHJvcGVydHkgb2YgYSB0eXBlZCBhcnJheS5cblxuICAvLyBUaGlzIGJlaGF2ZXMgbmVpdGhlciBsaWtlIFN0cmluZyBub3IgVWludDhBcnJheSBpbiB0aGF0IHdlIHNldCBzdGFydC9lbmRcbiAgLy8gdG8gdGhlaXIgdXBwZXIvbG93ZXIgYm91bmRzIGlmIHRoZSB2YWx1ZSBwYXNzZWQgaXMgb3V0IG9mIHJhbmdlLlxuICAvLyB1bmRlZmluZWQgaXMgaGFuZGxlZCBzcGVjaWFsbHkgYXMgcGVyIEVDTUEtMjYyIDZ0aCBFZGl0aW9uLFxuICAvLyBTZWN0aW9uIDEzLjMuMy43IFJ1bnRpbWUgU2VtYW50aWNzOiBLZXllZEJpbmRpbmdJbml0aWFsaXphdGlvbi5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQgfHwgc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgLy8gUmV0dXJuIGVhcmx5IGlmIHN0YXJ0ID4gdGhpcy5sZW5ndGguIERvbmUgaGVyZSB0byBwcmV2ZW50IHBvdGVudGlhbCB1aW50MzJcbiAgLy8gY29lcmNpb24gZmFpbCBiZWxvdy5cbiAgaWYgKHN0YXJ0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCB8fCBlbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoZW5kIDw9IDApIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIC8vIEZvcmNlIGNvZXJzaW9uIHRvIHVpbnQzMi4gVGhpcyB3aWxsIGFsc28gY29lcmNlIGZhbHNleS9OYU4gdmFsdWVzIHRvIDAuXG4gIGVuZCA+Pj49IDBcbiAgc3RhcnQgPj4+PSAwXG5cbiAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGF0aW4xU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1dGYxNmxlU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKGVuY29kaW5nICsgJycpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbi8vIFRoZSBwcm9wZXJ0eSBpcyB1c2VkIGJ5IGBCdWZmZXIuaXNCdWZmZXJgIGFuZCBgaXMtYnVmZmVyYCAoaW4gU2FmYXJpIDUtNykgdG8gZGV0ZWN0XG4vLyBCdWZmZXIgaW5zdGFuY2VzLlxuQnVmZmVyLnByb3RvdHlwZS5faXNCdWZmZXIgPSB0cnVlXG5cbmZ1bmN0aW9uIHN3YXAgKGIsIG4sIG0pIHtcbiAgdmFyIGkgPSBiW25dXG4gIGJbbl0gPSBiW21dXG4gIGJbbV0gPSBpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDE2ID0gZnVuY3Rpb24gc3dhcDE2ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSAyICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSAyKSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgMSlcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAzMiA9IGZ1bmN0aW9uIHN3YXAzMiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgNCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDMpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDIpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwNjQgPSBmdW5jdGlvbiBzd2FwNjQgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDggIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDgpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyA3KVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyA2KVxuICAgIHN3YXAodGhpcywgaSArIDIsIGkgKyA1KVxuICAgIHN3YXAodGhpcywgaSArIDMsIGkgKyA0KVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoKSB7XG4gIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aCB8IDBcbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuICcnXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIDAsIGxlbmd0aClcbiAgcmV0dXJuIHNsb3dUb1N0cmluZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzIChiKSB7XG4gIGlmICghaW50ZXJuYWxJc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIGlmICh0aGlzID09PSBiKSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYikgPT09IDBcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gIHZhciBzdHIgPSAnJ1xuICB2YXIgbWF4ID0gSU5TUEVDVF9NQVhfQllURVNcbiAgaWYgKHRoaXMubGVuZ3RoID4gMCkge1xuICAgIHN0ciA9IHRoaXMudG9TdHJpbmcoJ2hleCcsIDAsIG1heCkubWF0Y2goLy57Mn0vZykuam9pbignICcpXG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbWF4KSBzdHIgKz0gJyAuLi4gJ1xuICB9XG4gIHJldHVybiAnPEJ1ZmZlciAnICsgc3RyICsgJz4nXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKHRhcmdldCwgc3RhcnQsIGVuZCwgdGhpc1N0YXJ0LCB0aGlzRW5kKSB7XG4gIGlmICghaW50ZXJuYWxJc0J1ZmZlcih0YXJnZXQpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIH1cblxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuZCA9IHRhcmdldCA/IHRhcmdldC5sZW5ndGggOiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc1N0YXJ0ID0gMFxuICB9XG4gIGlmICh0aGlzRW5kID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzRW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChzdGFydCA8IDAgfHwgZW5kID4gdGFyZ2V0Lmxlbmd0aCB8fCB0aGlzU3RhcnQgPCAwIHx8IHRoaXNFbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdvdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICB9XG5cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kICYmIHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kKSB7XG4gICAgcmV0dXJuIC0xXG4gIH1cbiAgaWYgKHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAxXG4gIH1cblxuICBzdGFydCA+Pj49IDBcbiAgZW5kID4+Pj0gMFxuICB0aGlzU3RhcnQgPj4+PSAwXG4gIHRoaXNFbmQgPj4+PSAwXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCkgcmV0dXJuIDBcblxuICB2YXIgeCA9IHRoaXNFbmQgLSB0aGlzU3RhcnRcbiAgdmFyIHkgPSBlbmQgLSBzdGFydFxuICB2YXIgbGVuID0gTWF0aC5taW4oeCwgeSlcblxuICB2YXIgdGhpc0NvcHkgPSB0aGlzLnNsaWNlKHRoaXNTdGFydCwgdGhpc0VuZClcbiAgdmFyIHRhcmdldENvcHkgPSB0YXJnZXQuc2xpY2Uoc3RhcnQsIGVuZClcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKHRoaXNDb3B5W2ldICE9PSB0YXJnZXRDb3B5W2ldKSB7XG4gICAgICB4ID0gdGhpc0NvcHlbaV1cbiAgICAgIHkgPSB0YXJnZXRDb3B5W2ldXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuLy8gRmluZHMgZWl0aGVyIHRoZSBmaXJzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPj0gYGJ5dGVPZmZzZXRgLFxuLy8gT1IgdGhlIGxhc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0IDw9IGBieXRlT2Zmc2V0YC5cbi8vXG4vLyBBcmd1bWVudHM6XG4vLyAtIGJ1ZmZlciAtIGEgQnVmZmVyIHRvIHNlYXJjaFxuLy8gLSB2YWwgLSBhIHN0cmluZywgQnVmZmVyLCBvciBudW1iZXJcbi8vIC0gYnl0ZU9mZnNldCAtIGFuIGluZGV4IGludG8gYGJ1ZmZlcmA7IHdpbGwgYmUgY2xhbXBlZCB0byBhbiBpbnQzMlxuLy8gLSBlbmNvZGluZyAtIGFuIG9wdGlvbmFsIGVuY29kaW5nLCByZWxldmFudCBpcyB2YWwgaXMgYSBzdHJpbmdcbi8vIC0gZGlyIC0gdHJ1ZSBmb3IgaW5kZXhPZiwgZmFsc2UgZm9yIGxhc3RJbmRleE9mXG5mdW5jdGlvbiBiaWRpcmVjdGlvbmFsSW5kZXhPZiAoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgLy8gRW1wdHkgYnVmZmVyIG1lYW5zIG5vIG1hdGNoXG4gIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSByZXR1cm4gLTFcblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldFxuICBpZiAodHlwZW9mIGJ5dGVPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBieXRlT2Zmc2V0XG4gICAgYnl0ZU9mZnNldCA9IDBcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0ID4gMHg3ZmZmZmZmZikge1xuICAgIGJ5dGVPZmZzZXQgPSAweDdmZmZmZmZmXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IC0weDgwMDAwMDAwKSB7XG4gICAgYnl0ZU9mZnNldCA9IC0weDgwMDAwMDAwXG4gIH1cbiAgYnl0ZU9mZnNldCA9ICtieXRlT2Zmc2V0ICAvLyBDb2VyY2UgdG8gTnVtYmVyLlxuICBpZiAoaXNOYU4oYnl0ZU9mZnNldCkpIHtcbiAgICAvLyBieXRlT2Zmc2V0OiBpdCBpdCdzIHVuZGVmaW5lZCwgbnVsbCwgTmFOLCBcImZvb1wiLCBldGMsIHNlYXJjaCB3aG9sZSBidWZmZXJcbiAgICBieXRlT2Zmc2V0ID0gZGlyID8gMCA6IChidWZmZXIubGVuZ3RoIC0gMSlcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0OiBuZWdhdGl2ZSBvZmZzZXRzIHN0YXJ0IGZyb20gdGhlIGVuZCBvZiB0aGUgYnVmZmVyXG4gIGlmIChieXRlT2Zmc2V0IDwgMCkgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggKyBieXRlT2Zmc2V0XG4gIGlmIChieXRlT2Zmc2V0ID49IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICBpZiAoZGlyKSByZXR1cm4gLTFcbiAgICBlbHNlIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoIC0gMVxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAwKSB7XG4gICAgaWYgKGRpcikgYnl0ZU9mZnNldCA9IDBcbiAgICBlbHNlIHJldHVybiAtMVxuICB9XG5cbiAgLy8gTm9ybWFsaXplIHZhbFxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICB2YWwgPSBCdWZmZXIuZnJvbSh2YWwsIGVuY29kaW5nKVxuICB9XG5cbiAgLy8gRmluYWxseSwgc2VhcmNoIGVpdGhlciBpbmRleE9mIChpZiBkaXIgaXMgdHJ1ZSkgb3IgbGFzdEluZGV4T2ZcbiAgaWYgKGludGVybmFsSXNCdWZmZXIodmFsKSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nL2J1ZmZlciBhbHdheXMgZmFpbHNcbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAweEZGIC8vIFNlYXJjaCBmb3IgYSBieXRlIHZhbHVlIFswLTI1NV1cbiAgICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiZcbiAgICAgICAgdHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmIChkaXIpIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgWyB2YWwgXSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlcicpXG59XG5cbmZ1bmN0aW9uIGFycmF5SW5kZXhPZiAoYXJyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgdmFyIGluZGV4U2l6ZSA9IDFcbiAgdmFyIGFyckxlbmd0aCA9IGFyci5sZW5ndGhcbiAgdmFyIHZhbExlbmd0aCA9IHZhbC5sZW5ndGhcblxuICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgaWYgKGVuY29kaW5nID09PSAndWNzMicgfHwgZW5jb2RpbmcgPT09ICd1Y3MtMicgfHxcbiAgICAgICAgZW5jb2RpbmcgPT09ICd1dGYxNmxlJyB8fCBlbmNvZGluZyA9PT0gJ3V0Zi0xNmxlJykge1xuICAgICAgaWYgKGFyci5sZW5ndGggPCAyIHx8IHZhbC5sZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfVxuICAgICAgaW5kZXhTaXplID0gMlxuICAgICAgYXJyTGVuZ3RoIC89IDJcbiAgICAgIHZhbExlbmd0aCAvPSAyXG4gICAgICBieXRlT2Zmc2V0IC89IDJcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWFkIChidWYsIGkpIHtcbiAgICBpZiAoaW5kZXhTaXplID09PSAxKSB7XG4gICAgICByZXR1cm4gYnVmW2ldXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidWYucmVhZFVJbnQxNkJFKGkgKiBpbmRleFNpemUpXG4gICAgfVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGRpcikge1xuICAgIHZhciBmb3VuZEluZGV4ID0gLTFcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpIDwgYXJyTGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChyZWFkKGFyciwgaSkgPT09IHJlYWQodmFsLCBmb3VuZEluZGV4ID09PSAtMSA/IDAgOiBpIC0gZm91bmRJbmRleCkpIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKSBmb3VuZEluZGV4ID0gaVxuICAgICAgICBpZiAoaSAtIGZvdW5kSW5kZXggKyAxID09PSB2YWxMZW5ndGgpIHJldHVybiBmb3VuZEluZGV4ICogaW5kZXhTaXplXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZm91bmRJbmRleCAhPT0gLTEpIGkgLT0gaSAtIGZvdW5kSW5kZXhcbiAgICAgICAgZm91bmRJbmRleCA9IC0xXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChieXRlT2Zmc2V0ICsgdmFsTGVuZ3RoID4gYXJyTGVuZ3RoKSBieXRlT2Zmc2V0ID0gYXJyTGVuZ3RoIC0gdmFsTGVuZ3RoXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBmb3VuZCA9IHRydWVcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmFsTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKHJlYWQoYXJyLCBpICsgaikgIT09IHJlYWQodmFsLCBqKSkge1xuICAgICAgICAgIGZvdW5kID0gZmFsc2VcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZm91bmQpIHJldHVybiBpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gdGhpcy5pbmRleE9mKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpICE9PSAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCB0cnVlKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmxhc3RJbmRleE9mID0gZnVuY3Rpb24gbGFzdEluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGZhbHNlKVxufVxuXG5mdW5jdGlvbiBoZXhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIG9mZnNldCA9IE51bWJlcihvZmZzZXQpIHx8IDBcbiAgdmFyIHJlbWFpbmluZyA9IGJ1Zi5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKVxuICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICAgIH1cbiAgfVxuXG4gIC8vIG11c3QgYmUgYW4gZXZlbiBudW1iZXIgb2YgZGlnaXRzXG4gIHZhciBzdHJMZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGlmIChzdHJMZW4gJSAyICE9PSAwKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGhleCBzdHJpbmcnKVxuXG4gIGlmIChsZW5ndGggPiBzdHJMZW4gLyAyKSB7XG4gICAgbGVuZ3RoID0gc3RyTGVuIC8gMlxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KVxuICAgIGlmIChpc05hTihwYXJzZWQpKSByZXR1cm4gaVxuICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHBhcnNlZFxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIHV0ZjhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjhUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGFzY2lpV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihhc2NpaVRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gbGF0aW4xV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYXNjaWlXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGJhc2U2NFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYmFzZTY0VG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiB1Y3MyV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGYxNmxlVG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gd3JpdGUgKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKSB7XG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcpXG4gIGlmIChvZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBvZmZzZXRcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgb2Zmc2V0WywgbGVuZ3RoXVssIGVuY29kaW5nXSlcbiAgfSBlbHNlIGlmIChpc0Zpbml0ZShvZmZzZXQpKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICBsZW5ndGggPSBsZW5ndGggfCAwXG4gICAgICBpZiAoZW5jb2RpbmcgPT09IHVuZGVmaW5lZCkgZW5jb2RpbmcgPSAndXRmOCdcbiAgICB9IGVsc2Uge1xuICAgICAgZW5jb2RpbmcgPSBsZW5ndGhcbiAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZFxuICAgIH1cbiAgLy8gbGVnYWN5IHdyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldCwgbGVuZ3RoKSAtIHJlbW92ZSBpbiB2MC4xM1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCdcbiAgICApXG4gIH1cblxuICB2YXIgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IGxlbmd0aCA+IHJlbWFpbmluZykgbGVuZ3RoID0gcmVtYWluaW5nXG5cbiAgaWYgKChzdHJpbmcubGVuZ3RoID4gMCAmJiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwKSkgfHwgb2Zmc2V0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsYXRpbjFXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAvLyBXYXJuaW5nOiBtYXhMZW5ndGggbm90IHRha2VuIGludG8gYWNjb3VudCBpbiBiYXNlNjRXcml0ZVxuICAgICAgICByZXR1cm4gYmFzZTY0V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHVjczJXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04gKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdCdWZmZXInLFxuICAgIGRhdGE6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2FyciB8fCB0aGlzLCAwKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gYnVmLmxlbmd0aCkge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1Zi5zbGljZShzdGFydCwgZW5kKSlcbiAgfVxufVxuXG5mdW5jdGlvbiB1dGY4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG4gIHZhciByZXMgPSBbXVxuXG4gIHZhciBpID0gc3RhcnRcbiAgd2hpbGUgKGkgPCBlbmQpIHtcbiAgICB2YXIgZmlyc3RCeXRlID0gYnVmW2ldXG4gICAgdmFyIGNvZGVQb2ludCA9IG51bGxcbiAgICB2YXIgYnl0ZXNQZXJTZXF1ZW5jZSA9IChmaXJzdEJ5dGUgPiAweEVGKSA/IDRcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4REYpID8gM1xuICAgICAgOiAoZmlyc3RCeXRlID4gMHhCRikgPyAyXG4gICAgICA6IDFcblxuICAgIGlmIChpICsgYnl0ZXNQZXJTZXF1ZW5jZSA8PSBlbmQpIHtcbiAgICAgIHZhciBzZWNvbmRCeXRlLCB0aGlyZEJ5dGUsIGZvdXJ0aEJ5dGUsIHRlbXBDb2RlUG9pbnRcblxuICAgICAgc3dpdGNoIChieXRlc1BlclNlcXVlbmNlKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBpZiAoZmlyc3RCeXRlIDwgMHg4MCkge1xuICAgICAgICAgICAgY29kZVBvaW50ID0gZmlyc3RCeXRlXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4MUYpIDw8IDB4NiB8IChzZWNvbmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3Rikge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweEMgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4NiB8ICh0aGlyZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGRiAmJiAodGVtcENvZGVQb2ludCA8IDB4RDgwMCB8fCB0ZW1wQ29kZVBvaW50ID4gMHhERkZGKSkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBmb3VydGhCeXRlID0gYnVmW2kgKyAzXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAoZm91cnRoQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHgxMiB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHhDIHwgKHRoaXJkQnl0ZSAmIDB4M0YpIDw8IDB4NiB8IChmb3VydGhCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHhGRkZGICYmIHRlbXBDb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2RlUG9pbnQgPT09IG51bGwpIHtcbiAgICAgIC8vIHdlIGRpZCBub3QgZ2VuZXJhdGUgYSB2YWxpZCBjb2RlUG9pbnQgc28gaW5zZXJ0IGFcbiAgICAgIC8vIHJlcGxhY2VtZW50IGNoYXIgKFUrRkZGRCkgYW5kIGFkdmFuY2Ugb25seSAxIGJ5dGVcbiAgICAgIGNvZGVQb2ludCA9IDB4RkZGRFxuICAgICAgYnl0ZXNQZXJTZXF1ZW5jZSA9IDFcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA+IDB4RkZGRikge1xuICAgICAgLy8gZW5jb2RlIHRvIHV0ZjE2IChzdXJyb2dhdGUgcGFpciBkYW5jZSlcbiAgICAgIGNvZGVQb2ludCAtPSAweDEwMDAwXG4gICAgICByZXMucHVzaChjb2RlUG9pbnQgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApXG4gICAgICBjb2RlUG9pbnQgPSAweERDMDAgfCBjb2RlUG9pbnQgJiAweDNGRlxuICAgIH1cblxuICAgIHJlcy5wdXNoKGNvZGVQb2ludClcbiAgICBpICs9IGJ5dGVzUGVyU2VxdWVuY2VcbiAgfVxuXG4gIHJldHVybiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkocmVzKVxufVxuXG4vLyBCYXNlZCBvbiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMjc0NzI3Mi82ODA3NDIsIHRoZSBicm93c2VyIHdpdGhcbi8vIHRoZSBsb3dlc3QgbGltaXQgaXMgQ2hyb21lLCB3aXRoIDB4MTAwMDAgYXJncy5cbi8vIFdlIGdvIDEgbWFnbml0dWRlIGxlc3MsIGZvciBzYWZldHlcbnZhciBNQVhfQVJHVU1FTlRTX0xFTkdUSCA9IDB4MTAwMFxuXG5mdW5jdGlvbiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkgKGNvZGVQb2ludHMpIHtcbiAgdmFyIGxlbiA9IGNvZGVQb2ludHMubGVuZ3RoXG4gIGlmIChsZW4gPD0gTUFYX0FSR1VNRU5UU19MRU5HVEgpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNvZGVQb2ludHMpIC8vIGF2b2lkIGV4dHJhIHNsaWNlKClcbiAgfVxuXG4gIC8vIERlY29kZSBpbiBjaHVua3MgdG8gYXZvaWQgXCJjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIi5cbiAgdmFyIHJlcyA9ICcnXG4gIHZhciBpID0gMFxuICB3aGlsZSAoaSA8IGxlbikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFxuICAgICAgU3RyaW5nLFxuICAgICAgY29kZVBvaW50cy5zbGljZShpLCBpICs9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKVxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldICYgMHg3RilcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGxhdGluMVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGhleFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGhcblxuICBpZiAoIXN0YXJ0IHx8IHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIGlmICghZW5kIHx8IGVuZCA8IDAgfHwgZW5kID4gbGVuKSBlbmQgPSBsZW5cblxuICB2YXIgb3V0ID0gJydcbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICBvdXQgKz0gdG9IZXgoYnVmW2ldKVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGJ5dGVzID0gYnVmLnNsaWNlKHN0YXJ0LCBlbmQpXG4gIHZhciByZXMgPSAnJ1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0gKyBieXRlc1tpICsgMV0gKiAyNTYpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIHN0YXJ0ID0gfn5zdGFydFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IH5+ZW5kXG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ICs9IGxlblxuICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMFxuICB9IGVsc2UgaWYgKHN0YXJ0ID4gbGVuKSB7XG4gICAgc3RhcnQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IGxlblxuICAgIGlmIChlbmQgPCAwKSBlbmQgPSAwXG4gIH0gZWxzZSBpZiAoZW5kID4gbGVuKSB7XG4gICAgZW5kID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgdmFyIG5ld0J1ZlxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBuZXdCdWYgPSB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpXG4gICAgbmV3QnVmLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2xpY2VMZW4gPSBlbmQgLSBzdGFydFxuICAgIG5ld0J1ZiA9IG5ldyBCdWZmZXIoc2xpY2VMZW4sIHVuZGVmaW5lZClcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWNlTGVuOyArK2kpIHtcbiAgICAgIG5ld0J1ZltpXSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdCdWZcbn1cblxuLypcbiAqIE5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYnVmZmVyIGlzbid0IHRyeWluZyB0byB3cml0ZSBvdXQgb2YgYm91bmRzLlxuICovXG5mdW5jdGlvbiBjaGVja09mZnNldCAob2Zmc2V0LCBleHQsIGxlbmd0aCkge1xuICBpZiAoKG9mZnNldCAlIDEpICE9PSAwIHx8IG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdvZmZzZXQgaXMgbm90IHVpbnQnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gbGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRMRSA9IGZ1bmN0aW9uIHJlYWRVSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRCRSA9IGZ1bmN0aW9uIHJlYWRVSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG4gIH1cblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdXG4gIHZhciBtdWwgPSAxXG4gIHdoaWxlIChieXRlTGVuZ3RoID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDggPSBmdW5jdGlvbiByZWFkVUludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkUgPSBmdW5jdGlvbiByZWFkVUludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgOCkgfCB0aGlzW29mZnNldCArIDFdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkxFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICgodGhpc1tvZmZzZXRdKSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikpICtcbiAgICAgICh0aGlzW29mZnNldCArIDNdICogMHgxMDAwMDAwKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdICogMHgxMDAwMDAwKSArXG4gICAgKCh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgIHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludExFID0gZnVuY3Rpb24gcmVhZEludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludEJFID0gZnVuY3Rpb24gcmVhZEludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoXG4gIHZhciBtdWwgPSAxXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0taV1cbiAgd2hpbGUgKGkgPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1pXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDggPSBmdW5jdGlvbiByZWFkSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICBpZiAoISh0aGlzW29mZnNldF0gJiAweDgwKSkgcmV0dXJuICh0aGlzW29mZnNldF0pXG4gIHJldHVybiAoKDB4ZmYgLSB0aGlzW29mZnNldF0gKyAxKSAqIC0xKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIDFdIHwgKHRoaXNbb2Zmc2V0XSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiByZWFkSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdKSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10gPDwgMjQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyQkUgPSBmdW5jdGlvbiByZWFkSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDI0KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0TEUgPSBmdW5jdGlvbiByZWFkRmxvYXRMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0QkUgPSBmdW5jdGlvbiByZWFkRmxvYXRCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgNTIsIDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUJFID0gZnVuY3Rpb24gcmVhZERvdWJsZUJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgNTIsIDgpXG59XG5cbmZ1bmN0aW9uIGNoZWNrSW50IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKCFpbnRlcm5hbElzQnVmZmVyKGJ1ZikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiYnVmZmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpXG4gIGlmICh2YWx1ZSA+IG1heCB8fCB2YWx1ZSA8IG1pbikgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1widmFsdWVcIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludExFID0gZnVuY3Rpb24gd3JpdGVVSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludEJFID0gZnVuY3Rpb24gd3JpdGVVSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDggPSBmdW5jdGlvbiB3cml0ZVVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4ZmYsIDApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSlcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuZnVuY3Rpb24gb2JqZWN0V3JpdGVVSW50MTYgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuKSB7XG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmICsgdmFsdWUgKyAxXG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgMik7IGkgPCBqOyArK2kpIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgJiAoMHhmZiA8PCAoOCAqIChsaXR0bGVFbmRpYW4gPyBpIDogMSAtIGkpKSkpID4+PlxuICAgICAgKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkgKiA4XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuZnVuY3Rpb24gb2JqZWN0V3JpdGVVSW50MzIgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuKSB7XG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBvZmZzZXQsIDQpOyBpIDwgajsgKytpKSB7XG4gICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlID4+PiAobGl0dGxlRW5kaWFuID8gaSA6IDMgLSBpKSAqIDgpICYgMHhmZlxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludExFID0gZnVuY3Rpb24gd3JpdGVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGggLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICB2YXIgaSA9IDBcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpIC0gMV0gIT09IDApIHtcbiAgICAgIHN1YiA9IDFcbiAgICB9XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludEJFID0gZnVuY3Rpb24gd3JpdGVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGggLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpICsgMV0gIT09IDApIHtcbiAgICAgIHN1YiA9IDFcbiAgICB9XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDggPSBmdW5jdGlvbiB3cml0ZUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHg3ZiwgLTB4ODApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSlcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmICsgdmFsdWUgKyAxXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbmZ1bmN0aW9uIGNoZWNrSUVFRTc1NCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbiAgaWYgKG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5mdW5jdGlvbiB3cml0ZUZsb2F0IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDQsIDMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgsIC0zLjQwMjgyMzQ2NjM4NTI4ODZlKzM4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDIzLCA0KVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRMRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdEJFID0gZnVuY3Rpb24gd3JpdGVGbG9hdEJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRG91YmxlIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDgsIDEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4LCAtMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgNTIsIDgpXG4gIHJldHVybiBvZmZzZXQgKyA4XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVMRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUJFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuLy8gY29weSh0YXJnZXRCdWZmZXIsIHRhcmdldFN0YXJ0PTAsIHNvdXJjZVN0YXJ0PTAsIHNvdXJjZUVuZD1idWZmZXIubGVuZ3RoKVxuQnVmZmVyLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gY29weSAodGFyZ2V0LCB0YXJnZXRTdGFydCwgc3RhcnQsIGVuZCkge1xuICBpZiAoIXN0YXJ0KSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgJiYgZW5kICE9PSAwKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0U3RhcnQgPj0gdGFyZ2V0Lmxlbmd0aCkgdGFyZ2V0U3RhcnQgPSB0YXJnZXQubGVuZ3RoXG4gIGlmICghdGFyZ2V0U3RhcnQpIHRhcmdldFN0YXJ0ID0gMFxuICBpZiAoZW5kID4gMCAmJiBlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICAvLyBDb3B5IDAgYnl0ZXM7IHdlJ3JlIGRvbmVcbiAgaWYgKGVuZCA9PT0gc3RhcnQpIHJldHVybiAwXG4gIGlmICh0YXJnZXQubGVuZ3RoID09PSAwIHx8IHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIEZhdGFsIGVycm9yIGNvbmRpdGlvbnNcbiAgaWYgKHRhcmdldFN0YXJ0IDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgfVxuICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlU3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChlbmQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlRW5kIG91dCBvZiBib3VuZHMnKVxuXG4gIC8vIEFyZSB3ZSBvb2I/XG4gIGlmIChlbmQgPiB0aGlzLmxlbmd0aCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCA8IGVuZCAtIHN0YXJ0KSB7XG4gICAgZW5kID0gdGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0ICsgc3RhcnRcbiAgfVxuXG4gIHZhciBsZW4gPSBlbmQgLSBzdGFydFxuICB2YXIgaVxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQgJiYgc3RhcnQgPCB0YXJnZXRTdGFydCAmJiB0YXJnZXRTdGFydCA8IGVuZCkge1xuICAgIC8vIGRlc2NlbmRpbmcgY29weSBmcm9tIGVuZFxuICAgIGZvciAoaSA9IGxlbiAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfSBlbHNlIGlmIChsZW4gPCAxMDAwIHx8ICFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIGFzY2VuZGluZyBjb3B5IGZyb20gc3RhcnRcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKFxuICAgICAgdGFyZ2V0LFxuICAgICAgdGhpcy5zdWJhcnJheShzdGFydCwgc3RhcnQgKyBsZW4pLFxuICAgICAgdGFyZ2V0U3RhcnRcbiAgICApXG4gIH1cblxuICByZXR1cm4gbGVuXG59XG5cbi8vIFVzYWdlOlxuLy8gICAgYnVmZmVyLmZpbGwobnVtYmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChidWZmZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKHN0cmluZ1ssIG9mZnNldFssIGVuZF1dWywgZW5jb2RpbmddKVxuQnVmZmVyLnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gZmlsbCAodmFsLCBzdGFydCwgZW5kLCBlbmNvZGluZykge1xuICAvLyBIYW5kbGUgc3RyaW5nIGNhc2VzOlxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAodHlwZW9mIHN0YXJ0ID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBzdGFydFxuICAgICAgc3RhcnQgPSAwXG4gICAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGVuZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gZW5kXG4gICAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICAgIH1cbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdmFyIGNvZGUgPSB2YWwuY2hhckNvZGVBdCgwKVxuICAgICAgaWYgKGNvZGUgPCAyNTYpIHtcbiAgICAgICAgdmFsID0gY29kZVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nJylcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycgJiYgIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHZhbCA9IHZhbCAmIDI1NVxuICB9XG5cbiAgLy8gSW52YWxpZCByYW5nZXMgYXJlIG5vdCBzZXQgdG8gYSBkZWZhdWx0LCBzbyBjYW4gcmFuZ2UgY2hlY2sgZWFybHkuXG4gIGlmIChzdGFydCA8IDAgfHwgdGhpcy5sZW5ndGggPCBzdGFydCB8fCB0aGlzLmxlbmd0aCA8IGVuZCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdPdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICB9XG5cbiAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBzdGFydCA9IHN0YXJ0ID4+PiAwXG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gdGhpcy5sZW5ndGggOiBlbmQgPj4+IDBcblxuICBpZiAoIXZhbCkgdmFsID0gMFxuXG4gIHZhciBpXG4gIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICAgIHRoaXNbaV0gPSB2YWxcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGJ5dGVzID0gaW50ZXJuYWxJc0J1ZmZlcih2YWwpXG4gICAgICA/IHZhbFxuICAgICAgOiB1dGY4VG9CeXRlcyhuZXcgQnVmZmVyKHZhbCwgZW5jb2RpbmcpLnRvU3RyaW5nKCkpXG4gICAgdmFyIGxlbiA9IGJ5dGVzLmxlbmd0aFxuICAgIGZvciAoaSA9IDA7IGkgPCBlbmQgLSBzdGFydDsgKytpKSB7XG4gICAgICB0aGlzW2kgKyBzdGFydF0gPSBieXRlc1tpICUgbGVuXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbi8vIEhFTFBFUiBGVU5DVElPTlNcbi8vID09PT09PT09PT09PT09PT1cblxudmFyIElOVkFMSURfQkFTRTY0X1JFID0gL1teK1xcLzAtOUEtWmEtei1fXS9nXG5cbmZ1bmN0aW9uIGJhc2U2NGNsZWFuIChzdHIpIHtcbiAgLy8gTm9kZSBzdHJpcHMgb3V0IGludmFsaWQgY2hhcmFjdGVycyBsaWtlIFxcbiBhbmQgXFx0IGZyb20gdGhlIHN0cmluZywgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHN0ciA9IHN0cmluZ3RyaW0oc3RyKS5yZXBsYWNlKElOVkFMSURfQkFTRTY0X1JFLCAnJylcbiAgLy8gTm9kZSBjb252ZXJ0cyBzdHJpbmdzIHdpdGggbGVuZ3RoIDwgMiB0byAnJ1xuICBpZiAoc3RyLmxlbmd0aCA8IDIpIHJldHVybiAnJ1xuICAvLyBOb2RlIGFsbG93cyBmb3Igbm9uLXBhZGRlZCBiYXNlNjQgc3RyaW5ncyAobWlzc2luZyB0cmFpbGluZyA9PT0pLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgd2hpbGUgKHN0ci5sZW5ndGggJSA0ICE9PSAwKSB7XG4gICAgc3RyID0gc3RyICsgJz0nXG4gIH1cbiAgcmV0dXJuIHN0clxufVxuXG5mdW5jdGlvbiBzdHJpbmd0cmltIChzdHIpIHtcbiAgaWYgKHN0ci50cmltKSByZXR1cm4gc3RyLnRyaW0oKVxuICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMrfFxccyskL2csICcnKVxufVxuXG5mdW5jdGlvbiB0b0hleCAobikge1xuICBpZiAobiA8IDE2KSByZXR1cm4gJzAnICsgbi50b1N0cmluZygxNilcbiAgcmV0dXJuIG4udG9TdHJpbmcoMTYpXG59XG5cbmZ1bmN0aW9uIHV0ZjhUb0J5dGVzIChzdHJpbmcsIHVuaXRzKSB7XG4gIHVuaXRzID0gdW5pdHMgfHwgSW5maW5pdHlcbiAgdmFyIGNvZGVQb2ludFxuICB2YXIgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aFxuICB2YXIgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcbiAgdmFyIGJ5dGVzID0gW11cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgY29kZVBvaW50ID0gc3RyaW5nLmNoYXJDb2RlQXQoaSlcblxuICAgIC8vIGlzIHN1cnJvZ2F0ZSBjb21wb25lbnRcbiAgICBpZiAoY29kZVBvaW50ID4gMHhEN0ZGICYmIGNvZGVQb2ludCA8IDB4RTAwMCkge1xuICAgICAgLy8gbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICghbGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgICAvLyBubyBsZWFkIHlldFxuICAgICAgICBpZiAoY29kZVBvaW50ID4gMHhEQkZGKSB7XG4gICAgICAgICAgLy8gdW5leHBlY3RlZCB0cmFpbFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH0gZWxzZSBpZiAoaSArIDEgPT09IGxlbmd0aCkge1xuICAgICAgICAgIC8vIHVucGFpcmVkIGxlYWRcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdmFsaWQgbGVhZFxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gMiBsZWFkcyBpbiBhIHJvd1xuICAgICAgaWYgKGNvZGVQb2ludCA8IDB4REMwMCkge1xuICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyB2YWxpZCBzdXJyb2dhdGUgcGFpclxuICAgICAgY29kZVBvaW50ID0gKGxlYWRTdXJyb2dhdGUgLSAweEQ4MDAgPDwgMTAgfCBjb2RlUG9pbnQgLSAweERDMDApICsgMHgxMDAwMFxuICAgIH0gZWxzZSBpZiAobGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgLy8gdmFsaWQgYm1wIGNoYXIsIGJ1dCBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgfVxuXG4gICAgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcblxuICAgIC8vIGVuY29kZSB1dGY4XG4gICAgaWYgKGNvZGVQb2ludCA8IDB4ODApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMSkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChjb2RlUG9pbnQpXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDgwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2IHwgMHhDMCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyB8IDB4RTAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDQpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDEyIHwgMHhGMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb2RlIHBvaW50JylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnl0ZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlUb0J5dGVzIChzdHIpIHtcbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgLy8gTm9kZSdzIGNvZGUgc2VlbXMgdG8gYmUgZG9pbmcgdGhpcyBhbmQgbm90ICYgMHg3Ri4uXG4gICAgYnl0ZUFycmF5LnB1c2goc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGKVxuICB9XG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVRvQnl0ZXMgKHN0ciwgdW5pdHMpIHtcbiAgdmFyIGMsIGhpLCBsb1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcblxuICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKVxuICAgIGhpID0gYyA+PiA4XG4gICAgbG8gPSBjICUgMjU2XG4gICAgYnl0ZUFycmF5LnB1c2gobG8pXG4gICAgYnl0ZUFycmF5LnB1c2goaGkpXG4gIH1cblxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cblxuZnVuY3Rpb24gYmFzZTY0VG9CeXRlcyAoc3RyKSB7XG4gIHJldHVybiBiYXNlNjQudG9CeXRlQXJyYXkoYmFzZTY0Y2xlYW4oc3RyKSlcbn1cblxuZnVuY3Rpb24gYmxpdEJ1ZmZlciAoc3JjLCBkc3QsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKGkgKyBvZmZzZXQgPj0gZHN0Lmxlbmd0aCkgfHwgKGkgPj0gc3JjLmxlbmd0aCkpIGJyZWFrXG4gICAgZHN0W2kgKyBvZmZzZXRdID0gc3JjW2ldXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gaXNuYW4gKHZhbCkge1xuICByZXR1cm4gdmFsICE9PSB2YWwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWNvbXBhcmVcbn1cblxuXG4vLyB0aGUgZm9sbG93aW5nIGlzIGZyb20gaXMtYnVmZmVyLCBhbHNvIGJ5IEZlcm9zcyBBYm91a2hhZGlqZWggYW5kIHdpdGggc2FtZSBsaXNlbmNlXG4vLyBUaGUgX2lzQnVmZmVyIGNoZWNrIGlzIGZvciBTYWZhcmkgNS03IHN1cHBvcnQsIGJlY2F1c2UgaXQncyBtaXNzaW5nXG4vLyBPYmplY3QucHJvdG90eXBlLmNvbnN0cnVjdG9yLiBSZW1vdmUgdGhpcyBldmVudHVhbGx5XG5leHBvcnQgZnVuY3Rpb24gaXNCdWZmZXIob2JqKSB7XG4gIHJldHVybiBvYmogIT0gbnVsbCAmJiAoISFvYmouX2lzQnVmZmVyIHx8IGlzRmFzdEJ1ZmZlcihvYmopIHx8IGlzU2xvd0J1ZmZlcihvYmopKVxufVxuXG5mdW5jdGlvbiBpc0Zhc3RCdWZmZXIgKG9iaikge1xuICByZXR1cm4gISFvYmouY29uc3RydWN0b3IgJiYgdHlwZW9mIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlciA9PT0gJ2Z1bmN0aW9uJyAmJiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIob2JqKVxufVxuXG4vLyBGb3IgTm9kZSB2MC4xMCBzdXBwb3J0LiBSZW1vdmUgdGhpcyBldmVudHVhbGx5LlxuZnVuY3Rpb24gaXNTbG93QnVmZmVyIChvYmopIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmoucmVhZEZsb2F0TEUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG9iai5zbGljZSA9PT0gJ2Z1bmN0aW9uJyAmJiBpc0Zhc3RCdWZmZXIob2JqLnNsaWNlKDAsIDApKVxufVxuIiwgImV4cG9ydCB2YXIgYnJvd3NlciA9IHRydWU7XG4iLCAiLyohIGh0dHBzOi8vbXRocy5iZS9oZSB2MS4yLjAgYnkgQG1hdGhpYXMgfCBNSVQgbGljZW5zZSAqL1xuOyhmdW5jdGlvbihyb290KSB7XG5cblx0Ly8gRGV0ZWN0IGZyZWUgdmFyaWFibGVzIGBleHBvcnRzYC5cblx0dmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cztcblxuXHQvLyBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC5cblx0dmFyIGZyZWVNb2R1bGUgPSB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJlxuXHRcdG1vZHVsZS5leHBvcnRzID09IGZyZWVFeHBvcnRzICYmIG1vZHVsZTtcblxuXHQvLyBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZ2xvYmFsYCwgZnJvbSBOb2RlLmpzIG9yIEJyb3dzZXJpZmllZCBjb2RlLFxuXHQvLyBhbmQgdXNlIGl0IGFzIGByb290YC5cblx0dmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbDtcblx0aWYgKGZyZWVHbG9iYWwuZ2xvYmFsID09PSBmcmVlR2xvYmFsIHx8IGZyZWVHbG9iYWwud2luZG93ID09PSBmcmVlR2xvYmFsKSB7XG5cdFx0cm9vdCA9IGZyZWVHbG9iYWw7XG5cdH1cblxuXHQvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuXHQvLyBBbGwgYXN0cmFsIHN5bWJvbHMuXG5cdHZhciByZWdleEFzdHJhbFN5bWJvbHMgPSAvW1xcdUQ4MDAtXFx1REJGRl1bXFx1REMwMC1cXHVERkZGXS9nO1xuXHQvLyBBbGwgQVNDSUkgc3ltYm9scyAobm90IGp1c3QgcHJpbnRhYmxlIEFTQ0lJKSBleGNlcHQgdGhvc2UgbGlzdGVkIGluIHRoZVxuXHQvLyBmaXJzdCBjb2x1bW4gb2YgdGhlIG92ZXJyaWRlcyB0YWJsZS5cblx0Ly8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjdGFibGUtY2hhcnJlZi1vdmVycmlkZXNcblx0dmFyIHJlZ2V4QXNjaWlXaGl0ZWxpc3QgPSAvW1xceDAxLVxceDdGXS9nO1xuXHQvLyBBbGwgQk1QIHN5bWJvbHMgdGhhdCBhcmUgbm90IEFTQ0lJIG5ld2xpbmVzLCBwcmludGFibGUgQVNDSUkgc3ltYm9scywgb3Jcblx0Ly8gY29kZSBwb2ludHMgbGlzdGVkIGluIHRoZSBmaXJzdCBjb2x1bW4gb2YgdGhlIG92ZXJyaWRlcyB0YWJsZSBvblxuXHQvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCN0YWJsZS1jaGFycmVmLW92ZXJyaWRlcy5cblx0dmFyIHJlZ2V4Qm1wV2hpdGVsaXN0ID0gL1tcXHgwMS1cXHRcXHgwQlxcZlxceDBFLVxceDFGXFx4N0ZcXHg4MVxceDhEXFx4OEZcXHg5MFxceDlEXFx4QTAtXFx1RkZGRl0vZztcblxuXHR2YXIgcmVnZXhFbmNvZGVOb25Bc2NpaSA9IC88XFx1MjBEMnw9XFx1MjBFNXw+XFx1MjBEMnxcXHUyMDVGXFx1MjAwQXxcXHUyMTlEXFx1MDMzOHxcXHUyMjAyXFx1MDMzOHxcXHUyMjIwXFx1MjBEMnxcXHUyMjI5XFx1RkUwMHxcXHUyMjJBXFx1RkUwMHxcXHUyMjNDXFx1MjBEMnxcXHUyMjNEXFx1MDMzMXxcXHUyMjNFXFx1MDMzM3xcXHUyMjQyXFx1MDMzOHxcXHUyMjRCXFx1MDMzOHxcXHUyMjREXFx1MjBEMnxcXHUyMjRFXFx1MDMzOHxcXHUyMjRGXFx1MDMzOHxcXHUyMjUwXFx1MDMzOHxcXHUyMjYxXFx1MjBFNXxcXHUyMjY0XFx1MjBEMnxcXHUyMjY1XFx1MjBEMnxcXHUyMjY2XFx1MDMzOHxcXHUyMjY3XFx1MDMzOHxcXHUyMjY4XFx1RkUwMHxcXHUyMjY5XFx1RkUwMHxcXHUyMjZBXFx1MDMzOHxcXHUyMjZBXFx1MjBEMnxcXHUyMjZCXFx1MDMzOHxcXHUyMjZCXFx1MjBEMnxcXHUyMjdGXFx1MDMzOHxcXHUyMjgyXFx1MjBEMnxcXHUyMjgzXFx1MjBEMnxcXHUyMjhBXFx1RkUwMHxcXHUyMjhCXFx1RkUwMHxcXHUyMjhGXFx1MDMzOHxcXHUyMjkwXFx1MDMzOHxcXHUyMjkzXFx1RkUwMHxcXHUyMjk0XFx1RkUwMHxcXHUyMkI0XFx1MjBEMnxcXHUyMkI1XFx1MjBEMnxcXHUyMkQ4XFx1MDMzOHxcXHUyMkQ5XFx1MDMzOHxcXHUyMkRBXFx1RkUwMHxcXHUyMkRCXFx1RkUwMHxcXHUyMkY1XFx1MDMzOHxcXHUyMkY5XFx1MDMzOHxcXHUyOTMzXFx1MDMzOHxcXHUyOUNGXFx1MDMzOHxcXHUyOUQwXFx1MDMzOHxcXHUyQTZEXFx1MDMzOHxcXHUyQTcwXFx1MDMzOHxcXHUyQTdEXFx1MDMzOHxcXHUyQTdFXFx1MDMzOHxcXHUyQUExXFx1MDMzOHxcXHUyQUEyXFx1MDMzOHxcXHUyQUFDXFx1RkUwMHxcXHUyQUFEXFx1RkUwMHxcXHUyQUFGXFx1MDMzOHxcXHUyQUIwXFx1MDMzOHxcXHUyQUM1XFx1MDMzOHxcXHUyQUM2XFx1MDMzOHxcXHUyQUNCXFx1RkUwMHxcXHUyQUNDXFx1RkUwMHxcXHUyQUZEXFx1MjBFNXxbXFx4QTAtXFx1MDExM1xcdTAxMTYtXFx1MDEyMlxcdTAxMjQtXFx1MDEyQlxcdTAxMkUtXFx1MDE0RFxcdTAxNTAtXFx1MDE3RVxcdTAxOTJcXHUwMUI1XFx1MDFGNVxcdTAyMzdcXHUwMkM2XFx1MDJDN1xcdTAyRDgtXFx1MDJERFxcdTAzMTFcXHUwMzkxLVxcdTAzQTFcXHUwM0EzLVxcdTAzQTlcXHUwM0IxLVxcdTAzQzlcXHUwM0QxXFx1MDNEMlxcdTAzRDVcXHUwM0Q2XFx1MDNEQ1xcdTAzRERcXHUwM0YwXFx1MDNGMVxcdTAzRjVcXHUwM0Y2XFx1MDQwMS1cXHUwNDBDXFx1MDQwRS1cXHUwNDRGXFx1MDQ1MS1cXHUwNDVDXFx1MDQ1RVxcdTA0NUZcXHUyMDAyLVxcdTIwMDVcXHUyMDA3LVxcdTIwMTBcXHUyMDEzLVxcdTIwMTZcXHUyMDE4LVxcdTIwMUFcXHUyMDFDLVxcdTIwMUVcXHUyMDIwLVxcdTIwMjJcXHUyMDI1XFx1MjAyNlxcdTIwMzAtXFx1MjAzNVxcdTIwMzlcXHUyMDNBXFx1MjAzRVxcdTIwNDFcXHUyMDQzXFx1MjA0NFxcdTIwNEZcXHUyMDU3XFx1MjA1Ri1cXHUyMDYzXFx1MjBBQ1xcdTIwREJcXHUyMERDXFx1MjEwMlxcdTIxMDVcXHUyMTBBLVxcdTIxMTNcXHUyMTE1LVxcdTIxMUVcXHUyMTIyXFx1MjEyNFxcdTIxMjctXFx1MjEyOVxcdTIxMkNcXHUyMTJEXFx1MjEyRi1cXHUyMTMxXFx1MjEzMy1cXHUyMTM4XFx1MjE0NS1cXHUyMTQ4XFx1MjE1My1cXHUyMTVFXFx1MjE5MC1cXHUyMTlCXFx1MjE5RC1cXHUyMUE3XFx1MjFBOS1cXHUyMUFFXFx1MjFCMC1cXHUyMUIzXFx1MjFCNS1cXHUyMUI3XFx1MjFCQS1cXHUyMURCXFx1MjFERFxcdTIxRTRcXHUyMUU1XFx1MjFGNVxcdTIxRkQtXFx1MjIwNVxcdTIyMDctXFx1MjIwOVxcdTIyMEJcXHUyMjBDXFx1MjIwRi1cXHUyMjE0XFx1MjIxNi1cXHUyMjE4XFx1MjIxQVxcdTIyMUQtXFx1MjIzOFxcdTIyM0EtXFx1MjI1N1xcdTIyNTlcXHUyMjVBXFx1MjI1Q1xcdTIyNUYtXFx1MjI2MlxcdTIyNjQtXFx1MjI4QlxcdTIyOEQtXFx1MjI5QlxcdTIyOUQtXFx1MjJBNVxcdTIyQTctXFx1MjJCMFxcdTIyQjItXFx1MjJCQlxcdTIyQkQtXFx1MjJEQlxcdTIyREUtXFx1MjJFM1xcdTIyRTYtXFx1MjJGN1xcdTIyRjktXFx1MjJGRVxcdTIzMDVcXHUyMzA2XFx1MjMwOC1cXHUyMzEwXFx1MjMxMlxcdTIzMTNcXHUyMzE1XFx1MjMxNlxcdTIzMUMtXFx1MjMxRlxcdTIzMjJcXHUyMzIzXFx1MjMyRFxcdTIzMkVcXHUyMzM2XFx1MjMzRFxcdTIzM0ZcXHUyMzdDXFx1MjNCMFxcdTIzQjFcXHUyM0I0LVxcdTIzQjZcXHUyM0RDLVxcdTIzREZcXHUyM0UyXFx1MjNFN1xcdTI0MjNcXHUyNEM4XFx1MjUwMFxcdTI1MDJcXHUyNTBDXFx1MjUxMFxcdTI1MTRcXHUyNTE4XFx1MjUxQ1xcdTI1MjRcXHUyNTJDXFx1MjUzNFxcdTI1M0NcXHUyNTUwLVxcdTI1NkNcXHUyNTgwXFx1MjU4NFxcdTI1ODhcXHUyNTkxLVxcdTI1OTNcXHUyNUExXFx1MjVBQVxcdTI1QUJcXHUyNUFEXFx1MjVBRVxcdTI1QjFcXHUyNUIzLVxcdTI1QjVcXHUyNUI4XFx1MjVCOVxcdTI1QkQtXFx1MjVCRlxcdTI1QzJcXHUyNUMzXFx1MjVDQVxcdTI1Q0JcXHUyNUVDXFx1MjVFRlxcdTI1RjgtXFx1MjVGQ1xcdTI2MDVcXHUyNjA2XFx1MjYwRVxcdTI2NDBcXHUyNjQyXFx1MjY2MFxcdTI2NjNcXHUyNjY1XFx1MjY2NlxcdTI2NkFcXHUyNjZELVxcdTI2NkZcXHUyNzEzXFx1MjcxN1xcdTI3MjBcXHUyNzM2XFx1Mjc1OFxcdTI3NzJcXHUyNzczXFx1MjdDOFxcdTI3QzlcXHUyN0U2LVxcdTI3RURcXHUyN0Y1LVxcdTI3RkFcXHUyN0ZDXFx1MjdGRlxcdTI5MDItXFx1MjkwNVxcdTI5MEMtXFx1MjkxM1xcdTI5MTZcXHUyOTE5LVxcdTI5MjBcXHUyOTIzLVxcdTI5MkFcXHUyOTMzXFx1MjkzNS1cXHUyOTM5XFx1MjkzQ1xcdTI5M0RcXHUyOTQ1XFx1Mjk0OC1cXHUyOTRCXFx1Mjk0RS1cXHUyOTc2XFx1Mjk3OFxcdTI5NzlcXHUyOTdCLVxcdTI5N0ZcXHUyOTg1XFx1Mjk4NlxcdTI5OEItXFx1Mjk5NlxcdTI5OUFcXHUyOTlDXFx1Mjk5RFxcdTI5QTQtXFx1MjlCN1xcdTI5QjlcXHUyOUJCXFx1MjlCQ1xcdTI5QkUtXFx1MjlDNVxcdTI5QzlcXHUyOUNELVxcdTI5RDBcXHUyOURDLVxcdTI5REVcXHUyOUUzLVxcdTI5RTVcXHUyOUVCXFx1MjlGNFxcdTI5RjZcXHUyQTAwLVxcdTJBMDJcXHUyQTA0XFx1MkEwNlxcdTJBMENcXHUyQTBEXFx1MkExMC1cXHUyQTE3XFx1MkEyMi1cXHUyQTI3XFx1MkEyOVxcdTJBMkFcXHUyQTJELVxcdTJBMzFcXHUyQTMzLVxcdTJBM0NcXHUyQTNGXFx1MkE0MFxcdTJBNDItXFx1MkE0RFxcdTJBNTBcXHUyQTUzLVxcdTJBNThcXHUyQTVBLVxcdTJBNURcXHUyQTVGXFx1MkE2NlxcdTJBNkFcXHUyQTZELVxcdTJBNzVcXHUyQTc3LVxcdTJBOUFcXHUyQTlELVxcdTJBQTJcXHUyQUE0LVxcdTJBQjBcXHUyQUIzLVxcdTJBQzhcXHUyQUNCXFx1MkFDQ1xcdTJBQ0YtXFx1MkFEQlxcdTJBRTRcXHUyQUU2LVxcdTJBRTlcXHUyQUVCLVxcdTJBRjNcXHUyQUZEXFx1RkIwMC1cXHVGQjA0XXxcXHVEODM1W1xcdURDOUNcXHVEQzlFXFx1REM5RlxcdURDQTJcXHVEQ0E1XFx1RENBNlxcdURDQTktXFx1RENBQ1xcdURDQUUtXFx1RENCOVxcdURDQkJcXHVEQ0JELVxcdURDQzNcXHVEQ0M1LVxcdURDQ0ZcXHVERDA0XFx1REQwNVxcdUREMDctXFx1REQwQVxcdUREMEQtXFx1REQxNFxcdUREMTYtXFx1REQxQ1xcdUREMUUtXFx1REQzOVxcdUREM0ItXFx1REQzRVxcdURENDAtXFx1REQ0NFxcdURENDZcXHVERDRBLVxcdURENTBcXHVERDUyLVxcdURENkJdL2c7XG5cdHZhciBlbmNvZGVNYXAgPSB7J1xceEFEJzonc2h5JywnXFx1MjAwQyc6J3p3bmonLCdcXHUyMDBEJzonendqJywnXFx1MjAwRSc6J2xybScsJ1xcdTIwNjMnOidpYycsJ1xcdTIwNjInOidpdCcsJ1xcdTIwNjEnOidhZicsJ1xcdTIwMEYnOidybG0nLCdcXHUyMDBCJzonWmVyb1dpZHRoU3BhY2UnLCdcXHUyMDYwJzonTm9CcmVhaycsJ1xcdTAzMTEnOidEb3duQnJldmUnLCdcXHUyMERCJzondGRvdCcsJ1xcdTIwREMnOidEb3REb3QnLCdcXHQnOidUYWInLCdcXG4nOidOZXdMaW5lJywnXFx1MjAwOCc6J3B1bmNzcCcsJ1xcdTIwNUYnOidNZWRpdW1TcGFjZScsJ1xcdTIwMDknOid0aGluc3AnLCdcXHUyMDBBJzonaGFpcnNwJywnXFx1MjAwNCc6J2Vtc3AxMycsJ1xcdTIwMDInOidlbnNwJywnXFx1MjAwNSc6J2Vtc3AxNCcsJ1xcdTIwMDMnOidlbXNwJywnXFx1MjAwNyc6J251bXNwJywnXFx4QTAnOiduYnNwJywnXFx1MjA1RlxcdTIwMEEnOidUaGlja1NwYWNlJywnXFx1MjAzRSc6J29saW5lJywnXyc6J2xvd2JhcicsJ1xcdTIwMTAnOidkYXNoJywnXFx1MjAxMyc6J25kYXNoJywnXFx1MjAxNCc6J21kYXNoJywnXFx1MjAxNSc6J2hvcmJhcicsJywnOidjb21tYScsJzsnOidzZW1pJywnXFx1MjA0Ric6J2JzZW1pJywnOic6J2NvbG9uJywnXFx1MkE3NCc6J0NvbG9uZScsJyEnOidleGNsJywnXFx4QTEnOidpZXhjbCcsJz8nOidxdWVzdCcsJ1xceEJGJzonaXF1ZXN0JywnLic6J3BlcmlvZCcsJ1xcdTIwMjUnOidubGRyJywnXFx1MjAyNic6J21sZHInLCdcXHhCNyc6J21pZGRvdCcsJ1xcJyc6J2Fwb3MnLCdcXHUyMDE4JzonbHNxdW8nLCdcXHUyMDE5JzoncnNxdW8nLCdcXHUyMDFBJzonc2JxdW8nLCdcXHUyMDM5JzonbHNhcXVvJywnXFx1MjAzQSc6J3JzYXF1bycsJ1wiJzoncXVvdCcsJ1xcdTIwMUMnOidsZHF1bycsJ1xcdTIwMUQnOidyZHF1bycsJ1xcdTIwMUUnOidiZHF1bycsJ1xceEFCJzonbGFxdW8nLCdcXHhCQic6J3JhcXVvJywnKCc6J2xwYXInLCcpJzoncnBhcicsJ1snOidsc3FiJywnXSc6J3JzcWInLCd7JzonbGN1YicsJ30nOidyY3ViJywnXFx1MjMwOCc6J2xjZWlsJywnXFx1MjMwOSc6J3JjZWlsJywnXFx1MjMwQSc6J2xmbG9vcicsJ1xcdTIzMEInOidyZmxvb3InLCdcXHUyOTg1JzonbG9wYXInLCdcXHUyOTg2Jzoncm9wYXInLCdcXHUyOThCJzonbGJya2UnLCdcXHUyOThDJzoncmJya2UnLCdcXHUyOThEJzonbGJya3NsdScsJ1xcdTI5OEUnOidyYnJrc2xkJywnXFx1Mjk4Ric6J2xicmtzbGQnLCdcXHUyOTkwJzoncmJya3NsdScsJ1xcdTI5OTEnOidsYW5nZCcsJ1xcdTI5OTInOidyYW5nZCcsJ1xcdTI5OTMnOidscGFybHQnLCdcXHUyOTk0JzoncnBhcmd0JywnXFx1Mjk5NSc6J2d0bFBhcicsJ1xcdTI5OTYnOidsdHJQYXInLCdcXHUyN0U2JzonbG9icmsnLCdcXHUyN0U3Jzoncm9icmsnLCdcXHUyN0U4JzonbGFuZycsJ1xcdTI3RTknOidyYW5nJywnXFx1MjdFQSc6J0xhbmcnLCdcXHUyN0VCJzonUmFuZycsJ1xcdTI3RUMnOidsb2FuZycsJ1xcdTI3RUQnOidyb2FuZycsJ1xcdTI3NzInOidsYmJyaycsJ1xcdTI3NzMnOidyYmJyaycsJ1xcdTIwMTYnOidWZXJ0JywnXFx4QTcnOidzZWN0JywnXFx4QjYnOidwYXJhJywnQCc6J2NvbW1hdCcsJyonOidhc3QnLCcvJzonc29sJywndW5kZWZpbmVkJzpudWxsLCcmJzonYW1wJywnIyc6J251bScsJyUnOidwZXJjbnQnLCdcXHUyMDMwJzoncGVybWlsJywnXFx1MjAzMSc6J3BlcnRlbmsnLCdcXHUyMDIwJzonZGFnZ2VyJywnXFx1MjAyMSc6J0RhZ2dlcicsJ1xcdTIwMjInOididWxsJywnXFx1MjA0Myc6J2h5YnVsbCcsJ1xcdTIwMzInOidwcmltZScsJ1xcdTIwMzMnOidQcmltZScsJ1xcdTIwMzQnOid0cHJpbWUnLCdcXHUyMDU3JzoncXByaW1lJywnXFx1MjAzNSc6J2JwcmltZScsJ1xcdTIwNDEnOidjYXJldCcsJ2AnOidncmF2ZScsJ1xceEI0JzonYWN1dGUnLCdcXHUwMkRDJzondGlsZGUnLCdeJzonSGF0JywnXFx4QUYnOidtYWNyJywnXFx1MDJEOCc6J2JyZXZlJywnXFx1MDJEOSc6J2RvdCcsJ1xceEE4JzonZGllJywnXFx1MDJEQSc6J3JpbmcnLCdcXHUwMkREJzonZGJsYWMnLCdcXHhCOCc6J2NlZGlsJywnXFx1MDJEQic6J29nb24nLCdcXHUwMkM2JzonY2lyYycsJ1xcdTAyQzcnOidjYXJvbicsJ1xceEIwJzonZGVnJywnXFx4QTknOidjb3B5JywnXFx4QUUnOidyZWcnLCdcXHUyMTE3JzonY29weXNyJywnXFx1MjExOCc6J3dwJywnXFx1MjExRSc6J3J4JywnXFx1MjEyNyc6J21obycsJ1xcdTIxMjknOidpaW90YScsJ1xcdTIxOTAnOidsYXJyJywnXFx1MjE5QSc6J25sYXJyJywnXFx1MjE5Mic6J3JhcnInLCdcXHUyMTlCJzonbnJhcnInLCdcXHUyMTkxJzondWFycicsJ1xcdTIxOTMnOidkYXJyJywnXFx1MjE5NCc6J2hhcnInLCdcXHUyMUFFJzonbmhhcnInLCdcXHUyMTk1JzondmFycicsJ1xcdTIxOTYnOidud2FycicsJ1xcdTIxOTcnOiduZWFycicsJ1xcdTIxOTgnOidzZWFycicsJ1xcdTIxOTknOidzd2FycicsJ1xcdTIxOUQnOidyYXJydycsJ1xcdTIxOURcXHUwMzM4JzonbnJhcnJ3JywnXFx1MjE5RSc6J0xhcnInLCdcXHUyMTlGJzonVWFycicsJ1xcdTIxQTAnOidSYXJyJywnXFx1MjFBMSc6J0RhcnInLCdcXHUyMUEyJzonbGFycnRsJywnXFx1MjFBMyc6J3JhcnJ0bCcsJ1xcdTIxQTQnOidtYXBzdG9sZWZ0JywnXFx1MjFBNSc6J21hcHN0b3VwJywnXFx1MjFBNic6J21hcCcsJ1xcdTIxQTcnOidtYXBzdG9kb3duJywnXFx1MjFBOSc6J2xhcnJoaycsJ1xcdTIxQUEnOidyYXJyaGsnLCdcXHUyMUFCJzonbGFycmxwJywnXFx1MjFBQyc6J3JhcnJscCcsJ1xcdTIxQUQnOidoYXJydycsJ1xcdTIxQjAnOidsc2gnLCdcXHUyMUIxJzoncnNoJywnXFx1MjFCMic6J2xkc2gnLCdcXHUyMUIzJzoncmRzaCcsJ1xcdTIxQjUnOidjcmFycicsJ1xcdTIxQjYnOidjdWxhcnInLCdcXHUyMUI3JzonY3VyYXJyJywnXFx1MjFCQSc6J29sYXJyJywnXFx1MjFCQic6J29yYXJyJywnXFx1MjFCQyc6J2xoYXJ1JywnXFx1MjFCRCc6J2xoYXJkJywnXFx1MjFCRSc6J3VoYXJyJywnXFx1MjFCRic6J3VoYXJsJywnXFx1MjFDMCc6J3JoYXJ1JywnXFx1MjFDMSc6J3JoYXJkJywnXFx1MjFDMic6J2RoYXJyJywnXFx1MjFDMyc6J2RoYXJsJywnXFx1MjFDNCc6J3JsYXJyJywnXFx1MjFDNSc6J3VkYXJyJywnXFx1MjFDNic6J2xyYXJyJywnXFx1MjFDNyc6J2xsYXJyJywnXFx1MjFDOCc6J3V1YXJyJywnXFx1MjFDOSc6J3JyYXJyJywnXFx1MjFDQSc6J2RkYXJyJywnXFx1MjFDQic6J2xyaGFyJywnXFx1MjFDQyc6J3JsaGFyJywnXFx1MjFEMCc6J2xBcnInLCdcXHUyMUNEJzonbmxBcnInLCdcXHUyMUQxJzondUFycicsJ1xcdTIxRDInOidyQXJyJywnXFx1MjFDRic6J25yQXJyJywnXFx1MjFEMyc6J2RBcnInLCdcXHUyMUQ0JzonaWZmJywnXFx1MjFDRSc6J25oQXJyJywnXFx1MjFENSc6J3ZBcnInLCdcXHUyMUQ2JzonbndBcnInLCdcXHUyMUQ3JzonbmVBcnInLCdcXHUyMUQ4Jzonc2VBcnInLCdcXHUyMUQ5Jzonc3dBcnInLCdcXHUyMURBJzonbEFhcnInLCdcXHUyMURCJzonckFhcnInLCdcXHUyMUREJzonemlncmFycicsJ1xcdTIxRTQnOidsYXJyYicsJ1xcdTIxRTUnOidyYXJyYicsJ1xcdTIxRjUnOidkdWFycicsJ1xcdTIxRkQnOidsb2FycicsJ1xcdTIxRkUnOidyb2FycicsJ1xcdTIxRkYnOidob2FycicsJ1xcdTIyMDAnOidmb3JhbGwnLCdcXHUyMjAxJzonY29tcCcsJ1xcdTIyMDInOidwYXJ0JywnXFx1MjIwMlxcdTAzMzgnOiducGFydCcsJ1xcdTIyMDMnOidleGlzdCcsJ1xcdTIyMDQnOiduZXhpc3QnLCdcXHUyMjA1JzonZW1wdHknLCdcXHUyMjA3JzonRGVsJywnXFx1MjIwOCc6J2luJywnXFx1MjIwOSc6J25vdGluJywnXFx1MjIwQic6J25pJywnXFx1MjIwQyc6J25vdG5pJywnXFx1MDNGNic6J2JlcHNpJywnXFx1MjIwRic6J3Byb2QnLCdcXHUyMjEwJzonY29wcm9kJywnXFx1MjIxMSc6J3N1bScsJysnOidwbHVzJywnXFx4QjEnOidwbScsJ1xceEY3JzonZGl2JywnXFx4RDcnOid0aW1lcycsJzwnOidsdCcsJ1xcdTIyNkUnOidubHQnLCc8XFx1MjBEMic6J252bHQnLCc9JzonZXF1YWxzJywnXFx1MjI2MCc6J25lJywnPVxcdTIwRTUnOidibmUnLCdcXHUyQTc1JzonRXF1YWwnLCc+JzonZ3QnLCdcXHUyMjZGJzonbmd0JywnPlxcdTIwRDInOidudmd0JywnXFx4QUMnOidub3QnLCd8JzondmVydCcsJ1xceEE2JzonYnJ2YmFyJywnXFx1MjIxMic6J21pbnVzJywnXFx1MjIxMyc6J21wJywnXFx1MjIxNCc6J3BsdXNkbycsJ1xcdTIwNDQnOidmcmFzbCcsJ1xcdTIyMTYnOidzZXRtbicsJ1xcdTIyMTcnOidsb3dhc3QnLCdcXHUyMjE4JzonY29tcGZuJywnXFx1MjIxQSc6J1NxcnQnLCdcXHUyMjFEJzoncHJvcCcsJ1xcdTIyMUUnOidpbmZpbicsJ1xcdTIyMUYnOidhbmdydCcsJ1xcdTIyMjAnOidhbmcnLCdcXHUyMjIwXFx1MjBEMic6J25hbmcnLCdcXHUyMjIxJzonYW5nbXNkJywnXFx1MjIyMic6J2FuZ3NwaCcsJ1xcdTIyMjMnOidtaWQnLCdcXHUyMjI0Jzonbm1pZCcsJ1xcdTIyMjUnOidwYXInLCdcXHUyMjI2JzonbnBhcicsJ1xcdTIyMjcnOidhbmQnLCdcXHUyMjI4Jzonb3InLCdcXHUyMjI5JzonY2FwJywnXFx1MjIyOVxcdUZFMDAnOidjYXBzJywnXFx1MjIyQSc6J2N1cCcsJ1xcdTIyMkFcXHVGRTAwJzonY3VwcycsJ1xcdTIyMkInOidpbnQnLCdcXHUyMjJDJzonSW50JywnXFx1MjIyRCc6J3RpbnQnLCdcXHUyQTBDJzoncWludCcsJ1xcdTIyMkUnOidvaW50JywnXFx1MjIyRic6J0NvbmludCcsJ1xcdTIyMzAnOidDY29uaW50JywnXFx1MjIzMSc6J2N3aW50JywnXFx1MjIzMic6J2N3Y29uaW50JywnXFx1MjIzMyc6J2F3Y29uaW50JywnXFx1MjIzNCc6J3RoZXJlNCcsJ1xcdTIyMzUnOidiZWNhdXMnLCdcXHUyMjM2JzoncmF0aW8nLCdcXHUyMjM3JzonQ29sb24nLCdcXHUyMjM4JzonbWludXNkJywnXFx1MjIzQSc6J21ERG90JywnXFx1MjIzQic6J2hvbXRodCcsJ1xcdTIyM0MnOidzaW0nLCdcXHUyMjQxJzonbnNpbScsJ1xcdTIyM0NcXHUyMEQyJzonbnZzaW0nLCdcXHUyMjNEJzonYnNpbScsJ1xcdTIyM0RcXHUwMzMxJzoncmFjZScsJ1xcdTIyM0UnOidhYycsJ1xcdTIyM0VcXHUwMzMzJzonYWNFJywnXFx1MjIzRic6J2FjZCcsJ1xcdTIyNDAnOid3cicsJ1xcdTIyNDInOidlc2ltJywnXFx1MjI0MlxcdTAzMzgnOiduZXNpbScsJ1xcdTIyNDMnOidzaW1lJywnXFx1MjI0NCc6J25zaW1lJywnXFx1MjI0NSc6J2NvbmcnLCdcXHUyMjQ3JzonbmNvbmcnLCdcXHUyMjQ2Jzonc2ltbmUnLCdcXHUyMjQ4JzonYXAnLCdcXHUyMjQ5JzonbmFwJywnXFx1MjI0QSc6J2FwZScsJ1xcdTIyNEInOidhcGlkJywnXFx1MjI0QlxcdTAzMzgnOiduYXBpZCcsJ1xcdTIyNEMnOidiY29uZycsJ1xcdTIyNEQnOidDdXBDYXAnLCdcXHUyMjZEJzonTm90Q3VwQ2FwJywnXFx1MjI0RFxcdTIwRDInOidudmFwJywnXFx1MjI0RSc6J2J1bXAnLCdcXHUyMjRFXFx1MDMzOCc6J25idW1wJywnXFx1MjI0Ric6J2J1bXBlJywnXFx1MjI0RlxcdTAzMzgnOiduYnVtcGUnLCdcXHUyMjUwJzonZG90ZXEnLCdcXHUyMjUwXFx1MDMzOCc6J25lZG90JywnXFx1MjI1MSc6J2VEb3QnLCdcXHUyMjUyJzonZWZEb3QnLCdcXHUyMjUzJzonZXJEb3QnLCdcXHUyMjU0JzonY29sb25lJywnXFx1MjI1NSc6J2Vjb2xvbicsJ1xcdTIyNTYnOidlY2lyJywnXFx1MjI1Nyc6J2NpcmUnLCdcXHUyMjU5Jzond2VkZ2VxJywnXFx1MjI1QSc6J3ZlZWVxJywnXFx1MjI1Qyc6J3RyaWUnLCdcXHUyMjVGJzonZXF1ZXN0JywnXFx1MjI2MSc6J2VxdWl2JywnXFx1MjI2Mic6J25lcXVpdicsJ1xcdTIyNjFcXHUyMEU1JzonYm5lcXVpdicsJ1xcdTIyNjQnOidsZScsJ1xcdTIyNzAnOidubGUnLCdcXHUyMjY0XFx1MjBEMic6J252bGUnLCdcXHUyMjY1JzonZ2UnLCdcXHUyMjcxJzonbmdlJywnXFx1MjI2NVxcdTIwRDInOidudmdlJywnXFx1MjI2Nic6J2xFJywnXFx1MjI2NlxcdTAzMzgnOidubEUnLCdcXHUyMjY3JzonZ0UnLCdcXHUyMjY3XFx1MDMzOCc6J25nRScsJ1xcdTIyNjhcXHVGRTAwJzonbHZuRScsJ1xcdTIyNjgnOidsbkUnLCdcXHUyMjY5JzonZ25FJywnXFx1MjI2OVxcdUZFMDAnOidndm5FJywnXFx1MjI2QSc6J2xsJywnXFx1MjI2QVxcdTAzMzgnOiduTHR2JywnXFx1MjI2QVxcdTIwRDInOiduTHQnLCdcXHUyMjZCJzonZ2cnLCdcXHUyMjZCXFx1MDMzOCc6J25HdHYnLCdcXHUyMjZCXFx1MjBEMic6J25HdCcsJ1xcdTIyNkMnOid0d2l4dCcsJ1xcdTIyNzInOidsc2ltJywnXFx1MjI3NCc6J25sc2ltJywnXFx1MjI3Myc6J2dzaW0nLCdcXHUyMjc1JzonbmdzaW0nLCdcXHUyMjc2JzonbGcnLCdcXHUyMjc4JzonbnRsZycsJ1xcdTIyNzcnOidnbCcsJ1xcdTIyNzknOidudGdsJywnXFx1MjI3QSc6J3ByJywnXFx1MjI4MCc6J25wcicsJ1xcdTIyN0InOidzYycsJ1xcdTIyODEnOiduc2MnLCdcXHUyMjdDJzoncHJjdWUnLCdcXHUyMkUwJzonbnByY3VlJywnXFx1MjI3RCc6J3NjY3VlJywnXFx1MjJFMSc6J25zY2N1ZScsJ1xcdTIyN0UnOidwcnNpbScsJ1xcdTIyN0YnOidzY3NpbScsJ1xcdTIyN0ZcXHUwMzM4JzonTm90U3VjY2VlZHNUaWxkZScsJ1xcdTIyODInOidzdWInLCdcXHUyMjg0JzonbnN1YicsJ1xcdTIyODJcXHUyMEQyJzondm5zdWInLCdcXHUyMjgzJzonc3VwJywnXFx1MjI4NSc6J25zdXAnLCdcXHUyMjgzXFx1MjBEMic6J3Zuc3VwJywnXFx1MjI4Nic6J3N1YmUnLCdcXHUyMjg4JzonbnN1YmUnLCdcXHUyMjg3Jzonc3VwZScsJ1xcdTIyODknOiduc3VwZScsJ1xcdTIyOEFcXHVGRTAwJzondnN1Ym5lJywnXFx1MjI4QSc6J3N1Ym5lJywnXFx1MjI4QlxcdUZFMDAnOid2c3VwbmUnLCdcXHUyMjhCJzonc3VwbmUnLCdcXHUyMjhEJzonY3VwZG90JywnXFx1MjI4RSc6J3VwbHVzJywnXFx1MjI4Ric6J3Nxc3ViJywnXFx1MjI4RlxcdTAzMzgnOidOb3RTcXVhcmVTdWJzZXQnLCdcXHUyMjkwJzonc3FzdXAnLCdcXHUyMjkwXFx1MDMzOCc6J05vdFNxdWFyZVN1cGVyc2V0JywnXFx1MjI5MSc6J3Nxc3ViZScsJ1xcdTIyRTInOiduc3FzdWJlJywnXFx1MjI5Mic6J3Nxc3VwZScsJ1xcdTIyRTMnOiduc3FzdXBlJywnXFx1MjI5Myc6J3NxY2FwJywnXFx1MjI5M1xcdUZFMDAnOidzcWNhcHMnLCdcXHUyMjk0Jzonc3FjdXAnLCdcXHUyMjk0XFx1RkUwMCc6J3NxY3VwcycsJ1xcdTIyOTUnOidvcGx1cycsJ1xcdTIyOTYnOidvbWludXMnLCdcXHUyMjk3Jzonb3RpbWVzJywnXFx1MjI5OCc6J29zb2wnLCdcXHUyMjk5Jzonb2RvdCcsJ1xcdTIyOUEnOidvY2lyJywnXFx1MjI5Qic6J29hc3QnLCdcXHUyMjlEJzonb2Rhc2gnLCdcXHUyMjlFJzoncGx1c2InLCdcXHUyMjlGJzonbWludXNiJywnXFx1MjJBMCc6J3RpbWVzYicsJ1xcdTIyQTEnOidzZG90YicsJ1xcdTIyQTInOid2ZGFzaCcsJ1xcdTIyQUMnOidudmRhc2gnLCdcXHUyMkEzJzonZGFzaHYnLCdcXHUyMkE0JzondG9wJywnXFx1MjJBNSc6J2JvdCcsJ1xcdTIyQTcnOidtb2RlbHMnLCdcXHUyMkE4JzondkRhc2gnLCdcXHUyMkFEJzonbnZEYXNoJywnXFx1MjJBOSc6J1ZkYXNoJywnXFx1MjJBRSc6J25WZGFzaCcsJ1xcdTIyQUEnOidWdmRhc2gnLCdcXHUyMkFCJzonVkRhc2gnLCdcXHUyMkFGJzonblZEYXNoJywnXFx1MjJCMCc6J3BydXJlbCcsJ1xcdTIyQjInOid2bHRyaScsJ1xcdTIyRUEnOidubHRyaScsJ1xcdTIyQjMnOid2cnRyaScsJ1xcdTIyRUInOiducnRyaScsJ1xcdTIyQjQnOidsdHJpZScsJ1xcdTIyRUMnOidubHRyaWUnLCdcXHUyMkI0XFx1MjBEMic6J252bHRyaWUnLCdcXHUyMkI1JzoncnRyaWUnLCdcXHUyMkVEJzonbnJ0cmllJywnXFx1MjJCNVxcdTIwRDInOidudnJ0cmllJywnXFx1MjJCNic6J29yaWdvZicsJ1xcdTIyQjcnOidpbW9mJywnXFx1MjJCOCc6J211bWFwJywnXFx1MjJCOSc6J2hlcmNvbicsJ1xcdTIyQkEnOidpbnRjYWwnLCdcXHUyMkJCJzondmVlYmFyJywnXFx1MjJCRCc6J2JhcnZlZScsJ1xcdTIyQkUnOidhbmdydHZiJywnXFx1MjJCRic6J2xydHJpJywnXFx1MjJDMCc6J1dlZGdlJywnXFx1MjJDMSc6J1ZlZScsJ1xcdTIyQzInOid4Y2FwJywnXFx1MjJDMyc6J3hjdXAnLCdcXHUyMkM0JzonZGlhbScsJ1xcdTIyQzUnOidzZG90JywnXFx1MjJDNic6J1N0YXInLCdcXHUyMkM3JzonZGl2b254JywnXFx1MjJDOCc6J2Jvd3RpZScsJ1xcdTIyQzknOidsdGltZXMnLCdcXHUyMkNBJzoncnRpbWVzJywnXFx1MjJDQic6J2x0aHJlZScsJ1xcdTIyQ0MnOidydGhyZWUnLCdcXHUyMkNEJzonYnNpbWUnLCdcXHUyMkNFJzonY3V2ZWUnLCdcXHUyMkNGJzonY3V3ZWQnLCdcXHUyMkQwJzonU3ViJywnXFx1MjJEMSc6J1N1cCcsJ1xcdTIyRDInOidDYXAnLCdcXHUyMkQzJzonQ3VwJywnXFx1MjJENCc6J2ZvcmsnLCdcXHUyMkQ1JzonZXBhcicsJ1xcdTIyRDYnOidsdGRvdCcsJ1xcdTIyRDcnOidndGRvdCcsJ1xcdTIyRDgnOidMbCcsJ1xcdTIyRDhcXHUwMzM4JzonbkxsJywnXFx1MjJEOSc6J0dnJywnXFx1MjJEOVxcdTAzMzgnOiduR2cnLCdcXHUyMkRBXFx1RkUwMCc6J2xlc2cnLCdcXHUyMkRBJzonbGVnJywnXFx1MjJEQic6J2dlbCcsJ1xcdTIyREJcXHVGRTAwJzonZ2VzbCcsJ1xcdTIyREUnOidjdWVwcicsJ1xcdTIyREYnOidjdWVzYycsJ1xcdTIyRTYnOidsbnNpbScsJ1xcdTIyRTcnOidnbnNpbScsJ1xcdTIyRTgnOidwcm5zaW0nLCdcXHUyMkU5Jzonc2Nuc2ltJywnXFx1MjJFRSc6J3ZlbGxpcCcsJ1xcdTIyRUYnOidjdGRvdCcsJ1xcdTIyRjAnOid1dGRvdCcsJ1xcdTIyRjEnOidkdGRvdCcsJ1xcdTIyRjInOidkaXNpbicsJ1xcdTIyRjMnOidpc2luc3YnLCdcXHUyMkY0JzonaXNpbnMnLCdcXHUyMkY1JzonaXNpbmRvdCcsJ1xcdTIyRjVcXHUwMzM4Jzonbm90aW5kb3QnLCdcXHUyMkY2Jzonbm90aW52YycsJ1xcdTIyRjcnOidub3RpbnZiJywnXFx1MjJGOSc6J2lzaW5FJywnXFx1MjJGOVxcdTAzMzgnOidub3RpbkUnLCdcXHUyMkZBJzonbmlzZCcsJ1xcdTIyRkInOid4bmlzJywnXFx1MjJGQyc6J25pcycsJ1xcdTIyRkQnOidub3RuaXZjJywnXFx1MjJGRSc6J25vdG5pdmInLCdcXHUyMzA1JzonYmFyd2VkJywnXFx1MjMwNic6J0JhcndlZCcsJ1xcdTIzMEMnOidkcmNyb3AnLCdcXHUyMzBEJzonZGxjcm9wJywnXFx1MjMwRSc6J3VyY3JvcCcsJ1xcdTIzMEYnOid1bGNyb3AnLCdcXHUyMzEwJzonYm5vdCcsJ1xcdTIzMTInOidwcm9mbGluZScsJ1xcdTIzMTMnOidwcm9mc3VyZicsJ1xcdTIzMTUnOid0ZWxyZWMnLCdcXHUyMzE2JzondGFyZ2V0JywnXFx1MjMxQyc6J3VsY29ybicsJ1xcdTIzMUQnOid1cmNvcm4nLCdcXHUyMzFFJzonZGxjb3JuJywnXFx1MjMxRic6J2RyY29ybicsJ1xcdTIzMjInOidmcm93bicsJ1xcdTIzMjMnOidzbWlsZScsJ1xcdTIzMkQnOidjeWxjdHknLCdcXHUyMzJFJzoncHJvZmFsYXInLCdcXHUyMzM2JzondG9wYm90JywnXFx1MjMzRCc6J292YmFyJywnXFx1MjMzRic6J3NvbGJhcicsJ1xcdTIzN0MnOidhbmd6YXJyJywnXFx1MjNCMCc6J2xtb3VzdCcsJ1xcdTIzQjEnOidybW91c3QnLCdcXHUyM0I0JzondGJyaycsJ1xcdTIzQjUnOidiYnJrJywnXFx1MjNCNic6J2Jicmt0YnJrJywnXFx1MjNEQyc6J092ZXJQYXJlbnRoZXNpcycsJ1xcdTIzREQnOidVbmRlclBhcmVudGhlc2lzJywnXFx1MjNERSc6J092ZXJCcmFjZScsJ1xcdTIzREYnOidVbmRlckJyYWNlJywnXFx1MjNFMic6J3RycGV6aXVtJywnXFx1MjNFNyc6J2VsaW50ZXJzJywnXFx1MjQyMyc6J2JsYW5rJywnXFx1MjUwMCc6J2JveGgnLCdcXHUyNTAyJzonYm94dicsJ1xcdTI1MEMnOidib3hkcicsJ1xcdTI1MTAnOidib3hkbCcsJ1xcdTI1MTQnOidib3h1cicsJ1xcdTI1MTgnOidib3h1bCcsJ1xcdTI1MUMnOidib3h2cicsJ1xcdTI1MjQnOidib3h2bCcsJ1xcdTI1MkMnOidib3hoZCcsJ1xcdTI1MzQnOidib3hodScsJ1xcdTI1M0MnOidib3h2aCcsJ1xcdTI1NTAnOidib3hIJywnXFx1MjU1MSc6J2JveFYnLCdcXHUyNTUyJzonYm94ZFInLCdcXHUyNTUzJzonYm94RHInLCdcXHUyNTU0JzonYm94RFInLCdcXHUyNTU1JzonYm94ZEwnLCdcXHUyNTU2JzonYm94RGwnLCdcXHUyNTU3JzonYm94REwnLCdcXHUyNTU4JzonYm94dVInLCdcXHUyNTU5JzonYm94VXInLCdcXHUyNTVBJzonYm94VVInLCdcXHUyNTVCJzonYm94dUwnLCdcXHUyNTVDJzonYm94VWwnLCdcXHUyNTVEJzonYm94VUwnLCdcXHUyNTVFJzonYm94dlInLCdcXHUyNTVGJzonYm94VnInLCdcXHUyNTYwJzonYm94VlInLCdcXHUyNTYxJzonYm94dkwnLCdcXHUyNTYyJzonYm94VmwnLCdcXHUyNTYzJzonYm94VkwnLCdcXHUyNTY0JzonYm94SGQnLCdcXHUyNTY1JzonYm94aEQnLCdcXHUyNTY2JzonYm94SEQnLCdcXHUyNTY3JzonYm94SHUnLCdcXHUyNTY4JzonYm94aFUnLCdcXHUyNTY5JzonYm94SFUnLCdcXHUyNTZBJzonYm94dkgnLCdcXHUyNTZCJzonYm94VmgnLCdcXHUyNTZDJzonYm94VkgnLCdcXHUyNTgwJzondWhibGsnLCdcXHUyNTg0JzonbGhibGsnLCdcXHUyNTg4JzonYmxvY2snLCdcXHUyNTkxJzonYmxrMTQnLCdcXHUyNTkyJzonYmxrMTInLCdcXHUyNTkzJzonYmxrMzQnLCdcXHUyNUExJzonc3F1JywnXFx1MjVBQSc6J3NxdWYnLCdcXHUyNUFCJzonRW1wdHlWZXJ5U21hbGxTcXVhcmUnLCdcXHUyNUFEJzoncmVjdCcsJ1xcdTI1QUUnOidtYXJrZXInLCdcXHUyNUIxJzonZmx0bnMnLCdcXHUyNUIzJzoneHV0cmknLCdcXHUyNUI0JzondXRyaWYnLCdcXHUyNUI1JzondXRyaScsJ1xcdTI1QjgnOidydHJpZicsJ1xcdTI1QjknOidydHJpJywnXFx1MjVCRCc6J3hkdHJpJywnXFx1MjVCRSc6J2R0cmlmJywnXFx1MjVCRic6J2R0cmknLCdcXHUyNUMyJzonbHRyaWYnLCdcXHUyNUMzJzonbHRyaScsJ1xcdTI1Q0EnOidsb3onLCdcXHUyNUNCJzonY2lyJywnXFx1MjVFQyc6J3RyaWRvdCcsJ1xcdTI1RUYnOid4Y2lyYycsJ1xcdTI1RjgnOid1bHRyaScsJ1xcdTI1RjknOid1cnRyaScsJ1xcdTI1RkEnOidsbHRyaScsJ1xcdTI1RkInOidFbXB0eVNtYWxsU3F1YXJlJywnXFx1MjVGQyc6J0ZpbGxlZFNtYWxsU3F1YXJlJywnXFx1MjYwNSc6J3N0YXJmJywnXFx1MjYwNic6J3N0YXInLCdcXHUyNjBFJzoncGhvbmUnLCdcXHUyNjQwJzonZmVtYWxlJywnXFx1MjY0Mic6J21hbGUnLCdcXHUyNjYwJzonc3BhZGVzJywnXFx1MjY2Myc6J2NsdWJzJywnXFx1MjY2NSc6J2hlYXJ0cycsJ1xcdTI2NjYnOidkaWFtcycsJ1xcdTI2NkEnOidzdW5nJywnXFx1MjcxMyc6J2NoZWNrJywnXFx1MjcxNyc6J2Nyb3NzJywnXFx1MjcyMCc6J21hbHQnLCdcXHUyNzM2Jzonc2V4dCcsJ1xcdTI3NTgnOidWZXJ0aWNhbFNlcGFyYXRvcicsJ1xcdTI3QzgnOidic29saHN1YicsJ1xcdTI3QzknOidzdXBoc29sJywnXFx1MjdGNSc6J3hsYXJyJywnXFx1MjdGNic6J3hyYXJyJywnXFx1MjdGNyc6J3hoYXJyJywnXFx1MjdGOCc6J3hsQXJyJywnXFx1MjdGOSc6J3hyQXJyJywnXFx1MjdGQSc6J3hoQXJyJywnXFx1MjdGQyc6J3htYXAnLCdcXHUyN0ZGJzonZHppZ3JhcnInLCdcXHUyOTAyJzonbnZsQXJyJywnXFx1MjkwMyc6J252ckFycicsJ1xcdTI5MDQnOidudkhhcnInLCdcXHUyOTA1JzonTWFwJywnXFx1MjkwQyc6J2xiYXJyJywnXFx1MjkwRCc6J3JiYXJyJywnXFx1MjkwRSc6J2xCYXJyJywnXFx1MjkwRic6J3JCYXJyJywnXFx1MjkxMCc6J1JCYXJyJywnXFx1MjkxMSc6J0REb3RyYWhkJywnXFx1MjkxMic6J1VwQXJyb3dCYXInLCdcXHUyOTEzJzonRG93bkFycm93QmFyJywnXFx1MjkxNic6J1JhcnJ0bCcsJ1xcdTI5MTknOidsYXRhaWwnLCdcXHUyOTFBJzoncmF0YWlsJywnXFx1MjkxQic6J2xBdGFpbCcsJ1xcdTI5MUMnOidyQXRhaWwnLCdcXHUyOTFEJzonbGFycmZzJywnXFx1MjkxRSc6J3JhcnJmcycsJ1xcdTI5MUYnOidsYXJyYmZzJywnXFx1MjkyMCc6J3JhcnJiZnMnLCdcXHUyOTIzJzonbndhcmhrJywnXFx1MjkyNCc6J25lYXJoaycsJ1xcdTI5MjUnOidzZWFyaGsnLCdcXHUyOTI2Jzonc3dhcmhrJywnXFx1MjkyNyc6J253bmVhcicsJ1xcdTI5MjgnOid0b2VhJywnXFx1MjkyOSc6J3Rvc2EnLCdcXHUyOTJBJzonc3dud2FyJywnXFx1MjkzMyc6J3JhcnJjJywnXFx1MjkzM1xcdTAzMzgnOiducmFycmMnLCdcXHUyOTM1JzonY3VkYXJycicsJ1xcdTI5MzYnOidsZGNhJywnXFx1MjkzNyc6J3JkY2EnLCdcXHUyOTM4JzonY3VkYXJybCcsJ1xcdTI5MzknOidsYXJycGwnLCdcXHUyOTNDJzonY3VyYXJybScsJ1xcdTI5M0QnOidjdWxhcnJwJywnXFx1Mjk0NSc6J3JhcnJwbCcsJ1xcdTI5NDgnOidoYXJyY2lyJywnXFx1Mjk0OSc6J1VhcnJvY2lyJywnXFx1Mjk0QSc6J2x1cmRzaGFyJywnXFx1Mjk0Qic6J2xkcnVzaGFyJywnXFx1Mjk0RSc6J0xlZnRSaWdodFZlY3RvcicsJ1xcdTI5NEYnOidSaWdodFVwRG93blZlY3RvcicsJ1xcdTI5NTAnOidEb3duTGVmdFJpZ2h0VmVjdG9yJywnXFx1Mjk1MSc6J0xlZnRVcERvd25WZWN0b3InLCdcXHUyOTUyJzonTGVmdFZlY3RvckJhcicsJ1xcdTI5NTMnOidSaWdodFZlY3RvckJhcicsJ1xcdTI5NTQnOidSaWdodFVwVmVjdG9yQmFyJywnXFx1Mjk1NSc6J1JpZ2h0RG93blZlY3RvckJhcicsJ1xcdTI5NTYnOidEb3duTGVmdFZlY3RvckJhcicsJ1xcdTI5NTcnOidEb3duUmlnaHRWZWN0b3JCYXInLCdcXHUyOTU4JzonTGVmdFVwVmVjdG9yQmFyJywnXFx1Mjk1OSc6J0xlZnREb3duVmVjdG9yQmFyJywnXFx1Mjk1QSc6J0xlZnRUZWVWZWN0b3InLCdcXHUyOTVCJzonUmlnaHRUZWVWZWN0b3InLCdcXHUyOTVDJzonUmlnaHRVcFRlZVZlY3RvcicsJ1xcdTI5NUQnOidSaWdodERvd25UZWVWZWN0b3InLCdcXHUyOTVFJzonRG93bkxlZnRUZWVWZWN0b3InLCdcXHUyOTVGJzonRG93blJpZ2h0VGVlVmVjdG9yJywnXFx1Mjk2MCc6J0xlZnRVcFRlZVZlY3RvcicsJ1xcdTI5NjEnOidMZWZ0RG93blRlZVZlY3RvcicsJ1xcdTI5NjInOidsSGFyJywnXFx1Mjk2Myc6J3VIYXInLCdcXHUyOTY0JzonckhhcicsJ1xcdTI5NjUnOidkSGFyJywnXFx1Mjk2Nic6J2x1cnVoYXInLCdcXHUyOTY3JzonbGRyZGhhcicsJ1xcdTI5NjgnOidydWx1aGFyJywnXFx1Mjk2OSc6J3JkbGRoYXInLCdcXHUyOTZBJzonbGhhcnVsJywnXFx1Mjk2Qic6J2xsaGFyZCcsJ1xcdTI5NkMnOidyaGFydWwnLCdcXHUyOTZEJzonbHJoYXJkJywnXFx1Mjk2RSc6J3VkaGFyJywnXFx1Mjk2Ric6J2R1aGFyJywnXFx1Mjk3MCc6J1JvdW5kSW1wbGllcycsJ1xcdTI5NzEnOidlcmFycicsJ1xcdTI5NzInOidzaW1yYXJyJywnXFx1Mjk3Myc6J2xhcnJzaW0nLCdcXHUyOTc0JzoncmFycnNpbScsJ1xcdTI5NzUnOidyYXJyYXAnLCdcXHUyOTc2JzonbHRsYXJyJywnXFx1Mjk3OCc6J2d0cmFycicsJ1xcdTI5NzknOidzdWJyYXJyJywnXFx1Mjk3Qic6J3N1cGxhcnInLCdcXHUyOTdDJzonbGZpc2h0JywnXFx1Mjk3RCc6J3JmaXNodCcsJ1xcdTI5N0UnOid1ZmlzaHQnLCdcXHUyOTdGJzonZGZpc2h0JywnXFx1Mjk5QSc6J3Z6aWd6YWcnLCdcXHUyOTlDJzondmFuZ3J0JywnXFx1Mjk5RCc6J2FuZ3J0dmJkJywnXFx1MjlBNCc6J2FuZ2UnLCdcXHUyOUE1JzoncmFuZ2UnLCdcXHUyOUE2JzonZHdhbmdsZScsJ1xcdTI5QTcnOid1d2FuZ2xlJywnXFx1MjlBOCc6J2FuZ21zZGFhJywnXFx1MjlBOSc6J2FuZ21zZGFiJywnXFx1MjlBQSc6J2FuZ21zZGFjJywnXFx1MjlBQic6J2FuZ21zZGFkJywnXFx1MjlBQyc6J2FuZ21zZGFlJywnXFx1MjlBRCc6J2FuZ21zZGFmJywnXFx1MjlBRSc6J2FuZ21zZGFnJywnXFx1MjlBRic6J2FuZ21zZGFoJywnXFx1MjlCMCc6J2JlbXB0eXYnLCdcXHUyOUIxJzonZGVtcHR5dicsJ1xcdTI5QjInOidjZW1wdHl2JywnXFx1MjlCMyc6J3JhZW1wdHl2JywnXFx1MjlCNCc6J2xhZW1wdHl2JywnXFx1MjlCNSc6J29oYmFyJywnXFx1MjlCNic6J29taWQnLCdcXHUyOUI3Jzonb3BhcicsJ1xcdTI5QjknOidvcGVycCcsJ1xcdTI5QkInOidvbGNyb3NzJywnXFx1MjlCQyc6J29kc29sZCcsJ1xcdTI5QkUnOidvbGNpcicsJ1xcdTI5QkYnOidvZmNpcicsJ1xcdTI5QzAnOidvbHQnLCdcXHUyOUMxJzonb2d0JywnXFx1MjlDMic6J2NpcnNjaXInLCdcXHUyOUMzJzonY2lyRScsJ1xcdTI5QzQnOidzb2xiJywnXFx1MjlDNSc6J2Jzb2xiJywnXFx1MjlDOSc6J2JveGJveCcsJ1xcdTI5Q0QnOid0cmlzYicsJ1xcdTI5Q0UnOidydHJpbHRyaScsJ1xcdTI5Q0YnOidMZWZ0VHJpYW5nbGVCYXInLCdcXHUyOUNGXFx1MDMzOCc6J05vdExlZnRUcmlhbmdsZUJhcicsJ1xcdTI5RDAnOidSaWdodFRyaWFuZ2xlQmFyJywnXFx1MjlEMFxcdTAzMzgnOidOb3RSaWdodFRyaWFuZ2xlQmFyJywnXFx1MjlEQyc6J2lpbmZpbicsJ1xcdTI5REQnOidpbmZpbnRpZScsJ1xcdTI5REUnOidudmluZmluJywnXFx1MjlFMyc6J2VwYXJzbCcsJ1xcdTI5RTQnOidzbWVwYXJzbCcsJ1xcdTI5RTUnOidlcXZwYXJzbCcsJ1xcdTI5RUInOidsb3pmJywnXFx1MjlGNCc6J1J1bGVEZWxheWVkJywnXFx1MjlGNic6J2Rzb2wnLCdcXHUyQTAwJzoneG9kb3QnLCdcXHUyQTAxJzoneG9wbHVzJywnXFx1MkEwMic6J3hvdGltZScsJ1xcdTJBMDQnOid4dXBsdXMnLCdcXHUyQTA2JzoneHNxY3VwJywnXFx1MkEwRCc6J2ZwYXJ0aW50JywnXFx1MkExMCc6J2NpcmZuaW50JywnXFx1MkExMSc6J2F3aW50JywnXFx1MkExMic6J3JwcG9saW50JywnXFx1MkExMyc6J3NjcG9saW50JywnXFx1MkExNCc6J25wb2xpbnQnLCdcXHUyQTE1JzoncG9pbnRpbnQnLCdcXHUyQTE2JzoncXVhdGludCcsJ1xcdTJBMTcnOidpbnRsYXJoaycsJ1xcdTJBMjInOidwbHVzY2lyJywnXFx1MkEyMyc6J3BsdXNhY2lyJywnXFx1MkEyNCc6J3NpbXBsdXMnLCdcXHUyQTI1JzoncGx1c2R1JywnXFx1MkEyNic6J3BsdXNzaW0nLCdcXHUyQTI3JzoncGx1c3R3bycsJ1xcdTJBMjknOidtY29tbWEnLCdcXHUyQTJBJzonbWludXNkdScsJ1xcdTJBMkQnOidsb3BsdXMnLCdcXHUyQTJFJzoncm9wbHVzJywnXFx1MkEyRic6J0Nyb3NzJywnXFx1MkEzMCc6J3RpbWVzZCcsJ1xcdTJBMzEnOid0aW1lc2JhcicsJ1xcdTJBMzMnOidzbWFzaHAnLCdcXHUyQTM0JzonbG90aW1lcycsJ1xcdTJBMzUnOidyb3RpbWVzJywnXFx1MkEzNic6J290aW1lc2FzJywnXFx1MkEzNyc6J090aW1lcycsJ1xcdTJBMzgnOidvZGl2JywnXFx1MkEzOSc6J3RyaXBsdXMnLCdcXHUyQTNBJzondHJpbWludXMnLCdcXHUyQTNCJzondHJpdGltZScsJ1xcdTJBM0MnOidpcHJvZCcsJ1xcdTJBM0YnOidhbWFsZycsJ1xcdTJBNDAnOidjYXBkb3QnLCdcXHUyQTQyJzonbmN1cCcsJ1xcdTJBNDMnOiduY2FwJywnXFx1MkE0NCc6J2NhcGFuZCcsJ1xcdTJBNDUnOidjdXBvcicsJ1xcdTJBNDYnOidjdXBjYXAnLCdcXHUyQTQ3JzonY2FwY3VwJywnXFx1MkE0OCc6J2N1cGJyY2FwJywnXFx1MkE0OSc6J2NhcGJyY3VwJywnXFx1MkE0QSc6J2N1cGN1cCcsJ1xcdTJBNEInOidjYXBjYXAnLCdcXHUyQTRDJzonY2N1cHMnLCdcXHUyQTREJzonY2NhcHMnLCdcXHUyQTUwJzonY2N1cHNzbScsJ1xcdTJBNTMnOidBbmQnLCdcXHUyQTU0JzonT3InLCdcXHUyQTU1JzonYW5kYW5kJywnXFx1MkE1Nic6J29yb3InLCdcXHUyQTU3Jzonb3JzbG9wZScsJ1xcdTJBNTgnOidhbmRzbG9wZScsJ1xcdTJBNUEnOidhbmR2JywnXFx1MkE1Qic6J29ydicsJ1xcdTJBNUMnOidhbmRkJywnXFx1MkE1RCc6J29yZCcsJ1xcdTJBNUYnOid3ZWRiYXInLCdcXHUyQTY2Jzonc2RvdGUnLCdcXHUyQTZBJzonc2ltZG90JywnXFx1MkE2RCc6J2Nvbmdkb3QnLCdcXHUyQTZEXFx1MDMzOCc6J25jb25nZG90JywnXFx1MkE2RSc6J2Vhc3RlcicsJ1xcdTJBNkYnOidhcGFjaXInLCdcXHUyQTcwJzonYXBFJywnXFx1MkE3MFxcdTAzMzgnOiduYXBFJywnXFx1MkE3MSc6J2VwbHVzJywnXFx1MkE3Mic6J3BsdXNlJywnXFx1MkE3Myc6J0VzaW0nLCdcXHUyQTc3JzonZUREb3QnLCdcXHUyQTc4JzonZXF1aXZERCcsJ1xcdTJBNzknOidsdGNpcicsJ1xcdTJBN0EnOidndGNpcicsJ1xcdTJBN0InOidsdHF1ZXN0JywnXFx1MkE3Qyc6J2d0cXVlc3QnLCdcXHUyQTdEJzonbGVzJywnXFx1MkE3RFxcdTAzMzgnOidubGVzJywnXFx1MkE3RSc6J2dlcycsJ1xcdTJBN0VcXHUwMzM4JzonbmdlcycsJ1xcdTJBN0YnOidsZXNkb3QnLCdcXHUyQTgwJzonZ2VzZG90JywnXFx1MkE4MSc6J2xlc2RvdG8nLCdcXHUyQTgyJzonZ2VzZG90bycsJ1xcdTJBODMnOidsZXNkb3RvcicsJ1xcdTJBODQnOidnZXNkb3RvbCcsJ1xcdTJBODUnOidsYXAnLCdcXHUyQTg2JzonZ2FwJywnXFx1MkE4Nyc6J2xuZScsJ1xcdTJBODgnOidnbmUnLCdcXHUyQTg5JzonbG5hcCcsJ1xcdTJBOEEnOidnbmFwJywnXFx1MkE4Qic6J2xFZycsJ1xcdTJBOEMnOidnRWwnLCdcXHUyQThEJzonbHNpbWUnLCdcXHUyQThFJzonZ3NpbWUnLCdcXHUyQThGJzonbHNpbWcnLCdcXHUyQTkwJzonZ3NpbWwnLCdcXHUyQTkxJzonbGdFJywnXFx1MkE5Mic6J2dsRScsJ1xcdTJBOTMnOidsZXNnZXMnLCdcXHUyQTk0JzonZ2VzbGVzJywnXFx1MkE5NSc6J2VscycsJ1xcdTJBOTYnOidlZ3MnLCdcXHUyQTk3JzonZWxzZG90JywnXFx1MkE5OCc6J2Vnc2RvdCcsJ1xcdTJBOTknOidlbCcsJ1xcdTJBOUEnOidlZycsJ1xcdTJBOUQnOidzaW1sJywnXFx1MkE5RSc6J3NpbWcnLCdcXHUyQTlGJzonc2ltbEUnLCdcXHUyQUEwJzonc2ltZ0UnLCdcXHUyQUExJzonTGVzc0xlc3MnLCdcXHUyQUExXFx1MDMzOCc6J05vdE5lc3RlZExlc3NMZXNzJywnXFx1MkFBMic6J0dyZWF0ZXJHcmVhdGVyJywnXFx1MkFBMlxcdTAzMzgnOidOb3ROZXN0ZWRHcmVhdGVyR3JlYXRlcicsJ1xcdTJBQTQnOidnbGonLCdcXHUyQUE1JzonZ2xhJywnXFx1MkFBNic6J2x0Y2MnLCdcXHUyQUE3JzonZ3RjYycsJ1xcdTJBQTgnOidsZXNjYycsJ1xcdTJBQTknOidnZXNjYycsJ1xcdTJBQUEnOidzbXQnLCdcXHUyQUFCJzonbGF0JywnXFx1MkFBQyc6J3NtdGUnLCdcXHUyQUFDXFx1RkUwMCc6J3NtdGVzJywnXFx1MkFBRCc6J2xhdGUnLCdcXHUyQUFEXFx1RkUwMCc6J2xhdGVzJywnXFx1MkFBRSc6J2J1bXBFJywnXFx1MkFBRic6J3ByZScsJ1xcdTJBQUZcXHUwMzM4JzonbnByZScsJ1xcdTJBQjAnOidzY2UnLCdcXHUyQUIwXFx1MDMzOCc6J25zY2UnLCdcXHUyQUIzJzoncHJFJywnXFx1MkFCNCc6J3NjRScsJ1xcdTJBQjUnOidwcm5FJywnXFx1MkFCNic6J3NjbkUnLCdcXHUyQUI3JzoncHJhcCcsJ1xcdTJBQjgnOidzY2FwJywnXFx1MkFCOSc6J3BybmFwJywnXFx1MkFCQSc6J3NjbmFwJywnXFx1MkFCQic6J1ByJywnXFx1MkFCQyc6J1NjJywnXFx1MkFCRCc6J3N1YmRvdCcsJ1xcdTJBQkUnOidzdXBkb3QnLCdcXHUyQUJGJzonc3VicGx1cycsJ1xcdTJBQzAnOidzdXBwbHVzJywnXFx1MkFDMSc6J3N1Ym11bHQnLCdcXHUyQUMyJzonc3VwbXVsdCcsJ1xcdTJBQzMnOidzdWJlZG90JywnXFx1MkFDNCc6J3N1cGVkb3QnLCdcXHUyQUM1Jzonc3ViRScsJ1xcdTJBQzVcXHUwMzM4JzonbnN1YkUnLCdcXHUyQUM2Jzonc3VwRScsJ1xcdTJBQzZcXHUwMzM4JzonbnN1cEUnLCdcXHUyQUM3Jzonc3Vic2ltJywnXFx1MkFDOCc6J3N1cHNpbScsJ1xcdTJBQ0JcXHVGRTAwJzondnN1Ym5FJywnXFx1MkFDQic6J3N1Ym5FJywnXFx1MkFDQ1xcdUZFMDAnOid2c3VwbkUnLCdcXHUyQUNDJzonc3VwbkUnLCdcXHUyQUNGJzonY3N1YicsJ1xcdTJBRDAnOidjc3VwJywnXFx1MkFEMSc6J2NzdWJlJywnXFx1MkFEMic6J2NzdXBlJywnXFx1MkFEMyc6J3N1YnN1cCcsJ1xcdTJBRDQnOidzdXBzdWInLCdcXHUyQUQ1Jzonc3Vic3ViJywnXFx1MkFENic6J3N1cHN1cCcsJ1xcdTJBRDcnOidzdXBoc3ViJywnXFx1MkFEOCc6J3N1cGRzdWInLCdcXHUyQUQ5JzonZm9ya3YnLCdcXHUyQURBJzondG9wZm9yaycsJ1xcdTJBREInOidtbGNwJywnXFx1MkFFNCc6J0Rhc2h2JywnXFx1MkFFNic6J1ZkYXNobCcsJ1xcdTJBRTcnOidCYXJ2JywnXFx1MkFFOCc6J3ZCYXInLCdcXHUyQUU5JzondkJhcnYnLCdcXHUyQUVCJzonVmJhcicsJ1xcdTJBRUMnOidOb3QnLCdcXHUyQUVEJzonYk5vdCcsJ1xcdTJBRUUnOidybm1pZCcsJ1xcdTJBRUYnOidjaXJtaWQnLCdcXHUyQUYwJzonbWlkY2lyJywnXFx1MkFGMSc6J3RvcGNpcicsJ1xcdTJBRjInOiduaHBhcicsJ1xcdTJBRjMnOidwYXJzaW0nLCdcXHUyQUZEJzoncGFyc2wnLCdcXHUyQUZEXFx1MjBFNSc6J25wYXJzbCcsJ1xcdTI2NkQnOidmbGF0JywnXFx1MjY2RSc6J25hdHVyJywnXFx1MjY2Ric6J3NoYXJwJywnXFx4QTQnOidjdXJyZW4nLCdcXHhBMic6J2NlbnQnLCckJzonZG9sbGFyJywnXFx4QTMnOidwb3VuZCcsJ1xceEE1JzoneWVuJywnXFx1MjBBQyc6J2V1cm8nLCdcXHhCOSc6J3N1cDEnLCdcXHhCRCc6J2hhbGYnLCdcXHUyMTUzJzonZnJhYzEzJywnXFx4QkMnOidmcmFjMTQnLCdcXHUyMTU1JzonZnJhYzE1JywnXFx1MjE1OSc6J2ZyYWMxNicsJ1xcdTIxNUInOidmcmFjMTgnLCdcXHhCMic6J3N1cDInLCdcXHUyMTU0JzonZnJhYzIzJywnXFx1MjE1Nic6J2ZyYWMyNScsJ1xceEIzJzonc3VwMycsJ1xceEJFJzonZnJhYzM0JywnXFx1MjE1Nyc6J2ZyYWMzNScsJ1xcdTIxNUMnOidmcmFjMzgnLCdcXHUyMTU4JzonZnJhYzQ1JywnXFx1MjE1QSc6J2ZyYWM1NicsJ1xcdTIxNUQnOidmcmFjNTgnLCdcXHUyMTVFJzonZnJhYzc4JywnXFx1RDgzNVxcdURDQjYnOidhc2NyJywnXFx1RDgzNVxcdURENTInOidhb3BmJywnXFx1RDgzNVxcdUREMUUnOidhZnInLCdcXHVEODM1XFx1REQzOCc6J0FvcGYnLCdcXHVEODM1XFx1REQwNCc6J0FmcicsJ1xcdUQ4MzVcXHVEQzlDJzonQXNjcicsJ1xceEFBJzonb3JkZicsJ1xceEUxJzonYWFjdXRlJywnXFx4QzEnOidBYWN1dGUnLCdcXHhFMCc6J2FncmF2ZScsJ1xceEMwJzonQWdyYXZlJywnXFx1MDEwMyc6J2FicmV2ZScsJ1xcdTAxMDInOidBYnJldmUnLCdcXHhFMic6J2FjaXJjJywnXFx4QzInOidBY2lyYycsJ1xceEU1JzonYXJpbmcnLCdcXHhDNSc6J2FuZ3N0JywnXFx4RTQnOidhdW1sJywnXFx4QzQnOidBdW1sJywnXFx4RTMnOidhdGlsZGUnLCdcXHhDMyc6J0F0aWxkZScsJ1xcdTAxMDUnOidhb2dvbicsJ1xcdTAxMDQnOidBb2dvbicsJ1xcdTAxMDEnOidhbWFjcicsJ1xcdTAxMDAnOidBbWFjcicsJ1xceEU2JzonYWVsaWcnLCdcXHhDNic6J0FFbGlnJywnXFx1RDgzNVxcdURDQjcnOidic2NyJywnXFx1RDgzNVxcdURENTMnOidib3BmJywnXFx1RDgzNVxcdUREMUYnOidiZnInLCdcXHVEODM1XFx1REQzOSc6J0JvcGYnLCdcXHUyMTJDJzonQnNjcicsJ1xcdUQ4MzVcXHVERDA1JzonQmZyJywnXFx1RDgzNVxcdUREMjAnOidjZnInLCdcXHVEODM1XFx1RENCOCc6J2NzY3InLCdcXHVEODM1XFx1REQ1NCc6J2NvcGYnLCdcXHUyMTJEJzonQ2ZyJywnXFx1RDgzNVxcdURDOUUnOidDc2NyJywnXFx1MjEwMic6J0NvcGYnLCdcXHUwMTA3JzonY2FjdXRlJywnXFx1MDEwNic6J0NhY3V0ZScsJ1xcdTAxMDknOidjY2lyYycsJ1xcdTAxMDgnOidDY2lyYycsJ1xcdTAxMEQnOidjY2Fyb24nLCdcXHUwMTBDJzonQ2Nhcm9uJywnXFx1MDEwQic6J2Nkb3QnLCdcXHUwMTBBJzonQ2RvdCcsJ1xceEU3JzonY2NlZGlsJywnXFx4QzcnOidDY2VkaWwnLCdcXHUyMTA1JzonaW5jYXJlJywnXFx1RDgzNVxcdUREMjEnOidkZnInLCdcXHUyMTQ2JzonZGQnLCdcXHVEODM1XFx1REQ1NSc6J2RvcGYnLCdcXHVEODM1XFx1RENCOSc6J2RzY3InLCdcXHVEODM1XFx1REM5Ric6J0RzY3InLCdcXHVEODM1XFx1REQwNyc6J0RmcicsJ1xcdTIxNDUnOidERCcsJ1xcdUQ4MzVcXHVERDNCJzonRG9wZicsJ1xcdTAxMEYnOidkY2Fyb24nLCdcXHUwMTBFJzonRGNhcm9uJywnXFx1MDExMSc6J2RzdHJvaycsJ1xcdTAxMTAnOidEc3Ryb2snLCdcXHhGMCc6J2V0aCcsJ1xceEQwJzonRVRIJywnXFx1MjE0Nyc6J2VlJywnXFx1MjEyRic6J2VzY3InLCdcXHVEODM1XFx1REQyMic6J2VmcicsJ1xcdUQ4MzVcXHVERDU2JzonZW9wZicsJ1xcdTIxMzAnOidFc2NyJywnXFx1RDgzNVxcdUREMDgnOidFZnInLCdcXHVEODM1XFx1REQzQyc6J0VvcGYnLCdcXHhFOSc6J2VhY3V0ZScsJ1xceEM5JzonRWFjdXRlJywnXFx4RTgnOidlZ3JhdmUnLCdcXHhDOCc6J0VncmF2ZScsJ1xceEVBJzonZWNpcmMnLCdcXHhDQSc6J0VjaXJjJywnXFx1MDExQic6J2VjYXJvbicsJ1xcdTAxMUEnOidFY2Fyb24nLCdcXHhFQic6J2V1bWwnLCdcXHhDQic6J0V1bWwnLCdcXHUwMTE3JzonZWRvdCcsJ1xcdTAxMTYnOidFZG90JywnXFx1MDExOSc6J2VvZ29uJywnXFx1MDExOCc6J0VvZ29uJywnXFx1MDExMyc6J2VtYWNyJywnXFx1MDExMic6J0VtYWNyJywnXFx1RDgzNVxcdUREMjMnOidmZnInLCdcXHVEODM1XFx1REQ1Nyc6J2ZvcGYnLCdcXHVEODM1XFx1RENCQic6J2ZzY3InLCdcXHVEODM1XFx1REQwOSc6J0ZmcicsJ1xcdUQ4MzVcXHVERDNEJzonRm9wZicsJ1xcdTIxMzEnOidGc2NyJywnXFx1RkIwMCc6J2ZmbGlnJywnXFx1RkIwMyc6J2ZmaWxpZycsJ1xcdUZCMDQnOidmZmxsaWcnLCdcXHVGQjAxJzonZmlsaWcnLCdmaic6J2ZqbGlnJywnXFx1RkIwMic6J2ZsbGlnJywnXFx1MDE5Mic6J2Zub2YnLCdcXHUyMTBBJzonZ3NjcicsJ1xcdUQ4MzVcXHVERDU4JzonZ29wZicsJ1xcdUQ4MzVcXHVERDI0JzonZ2ZyJywnXFx1RDgzNVxcdURDQTInOidHc2NyJywnXFx1RDgzNVxcdUREM0UnOidHb3BmJywnXFx1RDgzNVxcdUREMEEnOidHZnInLCdcXHUwMUY1JzonZ2FjdXRlJywnXFx1MDExRic6J2dicmV2ZScsJ1xcdTAxMUUnOidHYnJldmUnLCdcXHUwMTFEJzonZ2NpcmMnLCdcXHUwMTFDJzonR2NpcmMnLCdcXHUwMTIxJzonZ2RvdCcsJ1xcdTAxMjAnOidHZG90JywnXFx1MDEyMic6J0djZWRpbCcsJ1xcdUQ4MzVcXHVERDI1JzonaGZyJywnXFx1MjEwRSc6J3BsYW5ja2gnLCdcXHVEODM1XFx1RENCRCc6J2hzY3InLCdcXHVEODM1XFx1REQ1OSc6J2hvcGYnLCdcXHUyMTBCJzonSHNjcicsJ1xcdTIxMEMnOidIZnInLCdcXHUyMTBEJzonSG9wZicsJ1xcdTAxMjUnOidoY2lyYycsJ1xcdTAxMjQnOidIY2lyYycsJ1xcdTIxMEYnOidoYmFyJywnXFx1MDEyNyc6J2hzdHJvaycsJ1xcdTAxMjYnOidIc3Ryb2snLCdcXHVEODM1XFx1REQ1QSc6J2lvcGYnLCdcXHVEODM1XFx1REQyNic6J2lmcicsJ1xcdUQ4MzVcXHVEQ0JFJzonaXNjcicsJ1xcdTIxNDgnOidpaScsJ1xcdUQ4MzVcXHVERDQwJzonSW9wZicsJ1xcdTIxMTAnOidJc2NyJywnXFx1MjExMSc6J0ltJywnXFx4RUQnOidpYWN1dGUnLCdcXHhDRCc6J0lhY3V0ZScsJ1xceEVDJzonaWdyYXZlJywnXFx4Q0MnOidJZ3JhdmUnLCdcXHhFRSc6J2ljaXJjJywnXFx4Q0UnOidJY2lyYycsJ1xceEVGJzonaXVtbCcsJ1xceENGJzonSXVtbCcsJ1xcdTAxMjknOidpdGlsZGUnLCdcXHUwMTI4JzonSXRpbGRlJywnXFx1MDEzMCc6J0lkb3QnLCdcXHUwMTJGJzonaW9nb24nLCdcXHUwMTJFJzonSW9nb24nLCdcXHUwMTJCJzonaW1hY3InLCdcXHUwMTJBJzonSW1hY3InLCdcXHUwMTMzJzonaWpsaWcnLCdcXHUwMTMyJzonSUpsaWcnLCdcXHUwMTMxJzonaW1hdGgnLCdcXHVEODM1XFx1RENCRic6J2pzY3InLCdcXHVEODM1XFx1REQ1Qic6J2pvcGYnLCdcXHVEODM1XFx1REQyNyc6J2pmcicsJ1xcdUQ4MzVcXHVEQ0E1JzonSnNjcicsJ1xcdUQ4MzVcXHVERDBEJzonSmZyJywnXFx1RDgzNVxcdURENDEnOidKb3BmJywnXFx1MDEzNSc6J2pjaXJjJywnXFx1MDEzNCc6J0pjaXJjJywnXFx1MDIzNyc6J2ptYXRoJywnXFx1RDgzNVxcdURENUMnOidrb3BmJywnXFx1RDgzNVxcdURDQzAnOidrc2NyJywnXFx1RDgzNVxcdUREMjgnOidrZnInLCdcXHVEODM1XFx1RENBNic6J0tzY3InLCdcXHVEODM1XFx1REQ0Mic6J0tvcGYnLCdcXHVEODM1XFx1REQwRSc6J0tmcicsJ1xcdTAxMzcnOidrY2VkaWwnLCdcXHUwMTM2JzonS2NlZGlsJywnXFx1RDgzNVxcdUREMjknOidsZnInLCdcXHVEODM1XFx1RENDMSc6J2xzY3InLCdcXHUyMTEzJzonZWxsJywnXFx1RDgzNVxcdURENUQnOidsb3BmJywnXFx1MjExMic6J0xzY3InLCdcXHVEODM1XFx1REQwRic6J0xmcicsJ1xcdUQ4MzVcXHVERDQzJzonTG9wZicsJ1xcdTAxM0EnOidsYWN1dGUnLCdcXHUwMTM5JzonTGFjdXRlJywnXFx1MDEzRSc6J2xjYXJvbicsJ1xcdTAxM0QnOidMY2Fyb24nLCdcXHUwMTNDJzonbGNlZGlsJywnXFx1MDEzQic6J0xjZWRpbCcsJ1xcdTAxNDInOidsc3Ryb2snLCdcXHUwMTQxJzonTHN0cm9rJywnXFx1MDE0MCc6J2xtaWRvdCcsJ1xcdTAxM0YnOidMbWlkb3QnLCdcXHVEODM1XFx1REQyQSc6J21mcicsJ1xcdUQ4MzVcXHVERDVFJzonbW9wZicsJ1xcdUQ4MzVcXHVEQ0MyJzonbXNjcicsJ1xcdUQ4MzVcXHVERDEwJzonTWZyJywnXFx1RDgzNVxcdURENDQnOidNb3BmJywnXFx1MjEzMyc6J01zY3InLCdcXHVEODM1XFx1REQyQic6J25mcicsJ1xcdUQ4MzVcXHVERDVGJzonbm9wZicsJ1xcdUQ4MzVcXHVEQ0MzJzonbnNjcicsJ1xcdTIxMTUnOidOb3BmJywnXFx1RDgzNVxcdURDQTknOidOc2NyJywnXFx1RDgzNVxcdUREMTEnOidOZnInLCdcXHUwMTQ0JzonbmFjdXRlJywnXFx1MDE0Myc6J05hY3V0ZScsJ1xcdTAxNDgnOiduY2Fyb24nLCdcXHUwMTQ3JzonTmNhcm9uJywnXFx4RjEnOidudGlsZGUnLCdcXHhEMSc6J050aWxkZScsJ1xcdTAxNDYnOiduY2VkaWwnLCdcXHUwMTQ1JzonTmNlZGlsJywnXFx1MjExNic6J251bWVybycsJ1xcdTAxNEInOidlbmcnLCdcXHUwMTRBJzonRU5HJywnXFx1RDgzNVxcdURENjAnOidvb3BmJywnXFx1RDgzNVxcdUREMkMnOidvZnInLCdcXHUyMTM0Jzonb3NjcicsJ1xcdUQ4MzVcXHVEQ0FBJzonT3NjcicsJ1xcdUQ4MzVcXHVERDEyJzonT2ZyJywnXFx1RDgzNVxcdURENDYnOidPb3BmJywnXFx4QkEnOidvcmRtJywnXFx4RjMnOidvYWN1dGUnLCdcXHhEMyc6J09hY3V0ZScsJ1xceEYyJzonb2dyYXZlJywnXFx4RDInOidPZ3JhdmUnLCdcXHhGNCc6J29jaXJjJywnXFx4RDQnOidPY2lyYycsJ1xceEY2Jzonb3VtbCcsJ1xceEQ2JzonT3VtbCcsJ1xcdTAxNTEnOidvZGJsYWMnLCdcXHUwMTUwJzonT2RibGFjJywnXFx4RjUnOidvdGlsZGUnLCdcXHhENSc6J090aWxkZScsJ1xceEY4Jzonb3NsYXNoJywnXFx4RDgnOidPc2xhc2gnLCdcXHUwMTREJzonb21hY3InLCdcXHUwMTRDJzonT21hY3InLCdcXHUwMTUzJzonb2VsaWcnLCdcXHUwMTUyJzonT0VsaWcnLCdcXHVEODM1XFx1REQyRCc6J3BmcicsJ1xcdUQ4MzVcXHVEQ0M1JzoncHNjcicsJ1xcdUQ4MzVcXHVERDYxJzoncG9wZicsJ1xcdTIxMTknOidQb3BmJywnXFx1RDgzNVxcdUREMTMnOidQZnInLCdcXHVEODM1XFx1RENBQic6J1BzY3InLCdcXHVEODM1XFx1REQ2Mic6J3FvcGYnLCdcXHVEODM1XFx1REQyRSc6J3FmcicsJ1xcdUQ4MzVcXHVEQ0M2JzoncXNjcicsJ1xcdUQ4MzVcXHVEQ0FDJzonUXNjcicsJ1xcdUQ4MzVcXHVERDE0JzonUWZyJywnXFx1MjExQSc6J1FvcGYnLCdcXHUwMTM4Jzona2dyZWVuJywnXFx1RDgzNVxcdUREMkYnOidyZnInLCdcXHVEODM1XFx1REQ2Myc6J3JvcGYnLCdcXHVEODM1XFx1RENDNyc6J3JzY3InLCdcXHUyMTFCJzonUnNjcicsJ1xcdTIxMUMnOidSZScsJ1xcdTIxMUQnOidSb3BmJywnXFx1MDE1NSc6J3JhY3V0ZScsJ1xcdTAxNTQnOidSYWN1dGUnLCdcXHUwMTU5JzoncmNhcm9uJywnXFx1MDE1OCc6J1JjYXJvbicsJ1xcdTAxNTcnOidyY2VkaWwnLCdcXHUwMTU2JzonUmNlZGlsJywnXFx1RDgzNVxcdURENjQnOidzb3BmJywnXFx1RDgzNVxcdURDQzgnOidzc2NyJywnXFx1RDgzNVxcdUREMzAnOidzZnInLCdcXHVEODM1XFx1REQ0QSc6J1NvcGYnLCdcXHVEODM1XFx1REQxNic6J1NmcicsJ1xcdUQ4MzVcXHVEQ0FFJzonU3NjcicsJ1xcdTI0QzgnOidvUycsJ1xcdTAxNUInOidzYWN1dGUnLCdcXHUwMTVBJzonU2FjdXRlJywnXFx1MDE1RCc6J3NjaXJjJywnXFx1MDE1Qyc6J1NjaXJjJywnXFx1MDE2MSc6J3NjYXJvbicsJ1xcdTAxNjAnOidTY2Fyb24nLCdcXHUwMTVGJzonc2NlZGlsJywnXFx1MDE1RSc6J1NjZWRpbCcsJ1xceERGJzonc3psaWcnLCdcXHVEODM1XFx1REQzMSc6J3RmcicsJ1xcdUQ4MzVcXHVEQ0M5JzondHNjcicsJ1xcdUQ4MzVcXHVERDY1JzondG9wZicsJ1xcdUQ4MzVcXHVEQ0FGJzonVHNjcicsJ1xcdUQ4MzVcXHVERDE3JzonVGZyJywnXFx1RDgzNVxcdURENEInOidUb3BmJywnXFx1MDE2NSc6J3RjYXJvbicsJ1xcdTAxNjQnOidUY2Fyb24nLCdcXHUwMTYzJzondGNlZGlsJywnXFx1MDE2Mic6J1RjZWRpbCcsJ1xcdTIxMjInOid0cmFkZScsJ1xcdTAxNjcnOid0c3Ryb2snLCdcXHUwMTY2JzonVHN0cm9rJywnXFx1RDgzNVxcdURDQ0EnOid1c2NyJywnXFx1RDgzNVxcdURENjYnOid1b3BmJywnXFx1RDgzNVxcdUREMzInOid1ZnInLCdcXHVEODM1XFx1REQ0Qyc6J1VvcGYnLCdcXHVEODM1XFx1REQxOCc6J1VmcicsJ1xcdUQ4MzVcXHVEQ0IwJzonVXNjcicsJ1xceEZBJzondWFjdXRlJywnXFx4REEnOidVYWN1dGUnLCdcXHhGOSc6J3VncmF2ZScsJ1xceEQ5JzonVWdyYXZlJywnXFx1MDE2RCc6J3VicmV2ZScsJ1xcdTAxNkMnOidVYnJldmUnLCdcXHhGQic6J3VjaXJjJywnXFx4REInOidVY2lyYycsJ1xcdTAxNkYnOid1cmluZycsJ1xcdTAxNkUnOidVcmluZycsJ1xceEZDJzondXVtbCcsJ1xceERDJzonVXVtbCcsJ1xcdTAxNzEnOid1ZGJsYWMnLCdcXHUwMTcwJzonVWRibGFjJywnXFx1MDE2OSc6J3V0aWxkZScsJ1xcdTAxNjgnOidVdGlsZGUnLCdcXHUwMTczJzondW9nb24nLCdcXHUwMTcyJzonVW9nb24nLCdcXHUwMTZCJzondW1hY3InLCdcXHUwMTZBJzonVW1hY3InLCdcXHVEODM1XFx1REQzMyc6J3ZmcicsJ1xcdUQ4MzVcXHVERDY3Jzondm9wZicsJ1xcdUQ4MzVcXHVEQ0NCJzondnNjcicsJ1xcdUQ4MzVcXHVERDE5JzonVmZyJywnXFx1RDgzNVxcdURENEQnOidWb3BmJywnXFx1RDgzNVxcdURDQjEnOidWc2NyJywnXFx1RDgzNVxcdURENjgnOid3b3BmJywnXFx1RDgzNVxcdURDQ0MnOid3c2NyJywnXFx1RDgzNVxcdUREMzQnOid3ZnInLCdcXHVEODM1XFx1RENCMic6J1dzY3InLCdcXHVEODM1XFx1REQ0RSc6J1dvcGYnLCdcXHVEODM1XFx1REQxQSc6J1dmcicsJ1xcdTAxNzUnOid3Y2lyYycsJ1xcdTAxNzQnOidXY2lyYycsJ1xcdUQ4MzVcXHVERDM1JzoneGZyJywnXFx1RDgzNVxcdURDQ0QnOid4c2NyJywnXFx1RDgzNVxcdURENjknOid4b3BmJywnXFx1RDgzNVxcdURENEYnOidYb3BmJywnXFx1RDgzNVxcdUREMUInOidYZnInLCdcXHVEODM1XFx1RENCMyc6J1hzY3InLCdcXHVEODM1XFx1REQzNic6J3lmcicsJ1xcdUQ4MzVcXHVEQ0NFJzoneXNjcicsJ1xcdUQ4MzVcXHVERDZBJzoneW9wZicsJ1xcdUQ4MzVcXHVEQ0I0JzonWXNjcicsJ1xcdUQ4MzVcXHVERDFDJzonWWZyJywnXFx1RDgzNVxcdURENTAnOidZb3BmJywnXFx4RkQnOid5YWN1dGUnLCdcXHhERCc6J1lhY3V0ZScsJ1xcdTAxNzcnOid5Y2lyYycsJ1xcdTAxNzYnOidZY2lyYycsJ1xceEZGJzoneXVtbCcsJ1xcdTAxNzgnOidZdW1sJywnXFx1RDgzNVxcdURDQ0YnOid6c2NyJywnXFx1RDgzNVxcdUREMzcnOid6ZnInLCdcXHVEODM1XFx1REQ2Qic6J3pvcGYnLCdcXHUyMTI4JzonWmZyJywnXFx1MjEyNCc6J1pvcGYnLCdcXHVEODM1XFx1RENCNSc6J1pzY3InLCdcXHUwMTdBJzonemFjdXRlJywnXFx1MDE3OSc6J1phY3V0ZScsJ1xcdTAxN0UnOid6Y2Fyb24nLCdcXHUwMTdEJzonWmNhcm9uJywnXFx1MDE3Qyc6J3pkb3QnLCdcXHUwMTdCJzonWmRvdCcsJ1xcdTAxQjUnOidpbXBlZCcsJ1xceEZFJzondGhvcm4nLCdcXHhERSc6J1RIT1JOJywnXFx1MDE0OSc6J25hcG9zJywnXFx1MDNCMSc6J2FscGhhJywnXFx1MDM5MSc6J0FscGhhJywnXFx1MDNCMic6J2JldGEnLCdcXHUwMzkyJzonQmV0YScsJ1xcdTAzQjMnOidnYW1tYScsJ1xcdTAzOTMnOidHYW1tYScsJ1xcdTAzQjQnOidkZWx0YScsJ1xcdTAzOTQnOidEZWx0YScsJ1xcdTAzQjUnOidlcHNpJywnXFx1MDNGNSc6J2Vwc2l2JywnXFx1MDM5NSc6J0Vwc2lsb24nLCdcXHUwM0REJzonZ2FtbWFkJywnXFx1MDNEQyc6J0dhbW1hZCcsJ1xcdTAzQjYnOid6ZXRhJywnXFx1MDM5Nic6J1pldGEnLCdcXHUwM0I3JzonZXRhJywnXFx1MDM5Nyc6J0V0YScsJ1xcdTAzQjgnOid0aGV0YScsJ1xcdTAzRDEnOid0aGV0YXYnLCdcXHUwMzk4JzonVGhldGEnLCdcXHUwM0I5JzonaW90YScsJ1xcdTAzOTknOidJb3RhJywnXFx1MDNCQSc6J2thcHBhJywnXFx1MDNGMCc6J2thcHBhdicsJ1xcdTAzOUEnOidLYXBwYScsJ1xcdTAzQkInOidsYW1iZGEnLCdcXHUwMzlCJzonTGFtYmRhJywnXFx1MDNCQyc6J211JywnXFx4QjUnOidtaWNybycsJ1xcdTAzOUMnOidNdScsJ1xcdTAzQkQnOidudScsJ1xcdTAzOUQnOidOdScsJ1xcdTAzQkUnOid4aScsJ1xcdTAzOUUnOidYaScsJ1xcdTAzQkYnOidvbWljcm9uJywnXFx1MDM5Ric6J09taWNyb24nLCdcXHUwM0MwJzoncGknLCdcXHUwM0Q2JzoncGl2JywnXFx1MDNBMCc6J1BpJywnXFx1MDNDMSc6J3JobycsJ1xcdTAzRjEnOidyaG92JywnXFx1MDNBMSc6J1JobycsJ1xcdTAzQzMnOidzaWdtYScsJ1xcdTAzQTMnOidTaWdtYScsJ1xcdTAzQzInOidzaWdtYWYnLCdcXHUwM0M0JzondGF1JywnXFx1MDNBNCc6J1RhdScsJ1xcdTAzQzUnOid1cHNpJywnXFx1MDNBNSc6J1Vwc2lsb24nLCdcXHUwM0QyJzonVXBzaScsJ1xcdTAzQzYnOidwaGknLCdcXHUwM0Q1JzoncGhpdicsJ1xcdTAzQTYnOidQaGknLCdcXHUwM0M3JzonY2hpJywnXFx1MDNBNyc6J0NoaScsJ1xcdTAzQzgnOidwc2knLCdcXHUwM0E4JzonUHNpJywnXFx1MDNDOSc6J29tZWdhJywnXFx1MDNBOSc6J29obScsJ1xcdTA0MzAnOidhY3knLCdcXHUwNDEwJzonQWN5JywnXFx1MDQzMSc6J2JjeScsJ1xcdTA0MTEnOidCY3knLCdcXHUwNDMyJzondmN5JywnXFx1MDQxMic6J1ZjeScsJ1xcdTA0MzMnOidnY3knLCdcXHUwNDEzJzonR2N5JywnXFx1MDQ1Myc6J2dqY3knLCdcXHUwNDAzJzonR0pjeScsJ1xcdTA0MzQnOidkY3knLCdcXHUwNDE0JzonRGN5JywnXFx1MDQ1Mic6J2RqY3knLCdcXHUwNDAyJzonREpjeScsJ1xcdTA0MzUnOidpZWN5JywnXFx1MDQxNSc6J0lFY3knLCdcXHUwNDUxJzonaW9jeScsJ1xcdTA0MDEnOidJT2N5JywnXFx1MDQ1NCc6J2p1a2N5JywnXFx1MDQwNCc6J0p1a2N5JywnXFx1MDQzNic6J3poY3knLCdcXHUwNDE2JzonWkhjeScsJ1xcdTA0MzcnOid6Y3knLCdcXHUwNDE3JzonWmN5JywnXFx1MDQ1NSc6J2RzY3knLCdcXHUwNDA1JzonRFNjeScsJ1xcdTA0MzgnOidpY3knLCdcXHUwNDE4JzonSWN5JywnXFx1MDQ1Nic6J2l1a2N5JywnXFx1MDQwNic6J0l1a2N5JywnXFx1MDQ1Nyc6J3lpY3knLCdcXHUwNDA3JzonWUljeScsJ1xcdTA0MzknOidqY3knLCdcXHUwNDE5JzonSmN5JywnXFx1MDQ1OCc6J2pzZXJjeScsJ1xcdTA0MDgnOidKc2VyY3knLCdcXHUwNDNBJzona2N5JywnXFx1MDQxQSc6J0tjeScsJ1xcdTA0NUMnOidramN5JywnXFx1MDQwQyc6J0tKY3knLCdcXHUwNDNCJzonbGN5JywnXFx1MDQxQic6J0xjeScsJ1xcdTA0NTknOidsamN5JywnXFx1MDQwOSc6J0xKY3knLCdcXHUwNDNDJzonbWN5JywnXFx1MDQxQyc6J01jeScsJ1xcdTA0M0QnOiduY3knLCdcXHUwNDFEJzonTmN5JywnXFx1MDQ1QSc6J25qY3knLCdcXHUwNDBBJzonTkpjeScsJ1xcdTA0M0UnOidvY3knLCdcXHUwNDFFJzonT2N5JywnXFx1MDQzRic6J3BjeScsJ1xcdTA0MUYnOidQY3knLCdcXHUwNDQwJzoncmN5JywnXFx1MDQyMCc6J1JjeScsJ1xcdTA0NDEnOidzY3knLCdcXHUwNDIxJzonU2N5JywnXFx1MDQ0Mic6J3RjeScsJ1xcdTA0MjInOidUY3knLCdcXHUwNDVCJzondHNoY3knLCdcXHUwNDBCJzonVFNIY3knLCdcXHUwNDQzJzondWN5JywnXFx1MDQyMyc6J1VjeScsJ1xcdTA0NUUnOid1YnJjeScsJ1xcdTA0MEUnOidVYnJjeScsJ1xcdTA0NDQnOidmY3knLCdcXHUwNDI0JzonRmN5JywnXFx1MDQ0NSc6J2toY3knLCdcXHUwNDI1JzonS0hjeScsJ1xcdTA0NDYnOid0c2N5JywnXFx1MDQyNic6J1RTY3knLCdcXHUwNDQ3JzonY2hjeScsJ1xcdTA0MjcnOidDSGN5JywnXFx1MDQ1Ric6J2R6Y3knLCdcXHUwNDBGJzonRFpjeScsJ1xcdTA0NDgnOidzaGN5JywnXFx1MDQyOCc6J1NIY3knLCdcXHUwNDQ5Jzonc2hjaGN5JywnXFx1MDQyOSc6J1NIQ0hjeScsJ1xcdTA0NEEnOidoYXJkY3knLCdcXHUwNDJBJzonSEFSRGN5JywnXFx1MDQ0Qic6J3ljeScsJ1xcdTA0MkInOidZY3knLCdcXHUwNDRDJzonc29mdGN5JywnXFx1MDQyQyc6J1NPRlRjeScsJ1xcdTA0NEQnOidlY3knLCdcXHUwNDJEJzonRWN5JywnXFx1MDQ0RSc6J3l1Y3knLCdcXHUwNDJFJzonWVVjeScsJ1xcdTA0NEYnOid5YWN5JywnXFx1MDQyRic6J1lBY3knLCdcXHUyMTM1JzonYWxlcGgnLCdcXHUyMTM2JzonYmV0aCcsJ1xcdTIxMzcnOidnaW1lbCcsJ1xcdTIxMzgnOidkYWxldGgnfTtcblxuXHR2YXIgcmVnZXhFc2NhcGUgPSAvW1wiJic8PmBdL2c7XG5cdHZhciBlc2NhcGVNYXAgPSB7XG5cdFx0J1wiJzogJyZxdW90OycsXG5cdFx0JyYnOiAnJmFtcDsnLFxuXHRcdCdcXCcnOiAnJiN4Mjc7Jyxcblx0XHQnPCc6ICcmbHQ7Jyxcblx0XHQvLyBTZWUgaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2FtYmlndW91cy1hbXBlcnNhbmRzOiBpbiBIVE1MLCB0aGVcblx0XHQvLyBmb2xsb3dpbmcgaXMgbm90IHN0cmljdGx5IG5lY2Vzc2FyeSB1bmxlc3MgaXTigJlzIHBhcnQgb2YgYSB0YWcgb3IgYW5cblx0XHQvLyB1bnF1b3RlZCBhdHRyaWJ1dGUgdmFsdWUuIFdl4oCZcmUgb25seSBlc2NhcGluZyBpdCB0byBzdXBwb3J0IHRob3NlXG5cdFx0Ly8gc2l0dWF0aW9ucywgYW5kIGZvciBYTUwgc3VwcG9ydC5cblx0XHQnPic6ICcmZ3Q7Jyxcblx0XHQvLyBJbiBJbnRlcm5ldCBFeHBsb3JlciDiiaQgOCwgdGhlIGJhY2t0aWNrIGNoYXJhY3RlciBjYW4gYmUgdXNlZFxuXHRcdC8vIHRvIGJyZWFrIG91dCBvZiAodW4pcXVvdGVkIGF0dHJpYnV0ZSB2YWx1ZXMgb3IgSFRNTCBjb21tZW50cy5cblx0XHQvLyBTZWUgaHR0cDovL2h0bWw1c2VjLm9yZy8jMTAyLCBodHRwOi8vaHRtbDVzZWMub3JnLyMxMDgsIGFuZFxuXHRcdC8vIGh0dHA6Ly9odG1sNXNlYy5vcmcvIzEzMy5cblx0XHQnYCc6ICcmI3g2MDsnXG5cdH07XG5cblx0dmFyIHJlZ2V4SW52YWxpZEVudGl0eSA9IC8mIyg/Olt4WF1bXmEtZkEtRjAtOV18W14wLTl4WF0pLztcblx0dmFyIHJlZ2V4SW52YWxpZFJhd0NvZGVQb2ludCA9IC9bXFwwLVxceDA4XFx4MEJcXHgwRS1cXHgxRlxceDdGLVxceDlGXFx1RkREMC1cXHVGREVGXFx1RkZGRVxcdUZGRkZdfFtcXHVEODNGXFx1RDg3RlxcdUQ4QkZcXHVEOEZGXFx1RDkzRlxcdUQ5N0ZcXHVEOUJGXFx1RDlGRlxcdURBM0ZcXHVEQTdGXFx1REFCRlxcdURBRkZcXHVEQjNGXFx1REI3RlxcdURCQkZcXHVEQkZGXVtcXHVERkZFXFx1REZGRl18W1xcdUQ4MDAtXFx1REJGRl0oPyFbXFx1REMwMC1cXHVERkZGXSl8KD86W15cXHVEODAwLVxcdURCRkZdfF4pW1xcdURDMDAtXFx1REZGRl0vO1xuXHR2YXIgcmVnZXhEZWNvZGUgPSAvJihDb3VudGVyQ2xvY2t3aXNlQ29udG91ckludGVncmFsfERvdWJsZUxvbmdMZWZ0UmlnaHRBcnJvd3xDbG9ja3dpc2VDb250b3VySW50ZWdyYWx8Tm90TmVzdGVkR3JlYXRlckdyZWF0ZXJ8Tm90U3F1YXJlU3VwZXJzZXRFcXVhbHxEaWFjcml0aWNhbERvdWJsZUFjdXRlfE5vdFJpZ2h0VHJpYW5nbGVFcXVhbHxOb3RTdWNjZWVkc1NsYW50RXF1YWx8Tm90UHJlY2VkZXNTbGFudEVxdWFsfENsb3NlQ3VybHlEb3VibGVRdW90ZXxOZWdhdGl2ZVZlcnlUaGluU3BhY2V8RG91YmxlQ29udG91ckludGVncmFsfEZpbGxlZFZlcnlTbWFsbFNxdWFyZXxDYXBpdGFsRGlmZmVyZW50aWFsRHxPcGVuQ3VybHlEb3VibGVRdW90ZXxFbXB0eVZlcnlTbWFsbFNxdWFyZXxOZXN0ZWRHcmVhdGVyR3JlYXRlcnxEb3VibGVMb25nUmlnaHRBcnJvd3xOb3RMZWZ0VHJpYW5nbGVFcXVhbHxOb3RHcmVhdGVyU2xhbnRFcXVhbHxSZXZlcnNlVXBFcXVpbGlicml1bXxEb3VibGVMZWZ0UmlnaHRBcnJvd3xOb3RTcXVhcmVTdWJzZXRFcXVhbHxOb3REb3VibGVWZXJ0aWNhbEJhcnxSaWdodEFycm93TGVmdEFycm93fE5vdEdyZWF0ZXJGdWxsRXF1YWx8Tm90UmlnaHRUcmlhbmdsZUJhcnxTcXVhcmVTdXBlcnNldEVxdWFsfERvd25MZWZ0UmlnaHRWZWN0b3J8RG91YmxlTG9uZ0xlZnRBcnJvd3xsZWZ0cmlnaHRzcXVpZ2Fycm93fExlZnRBcnJvd1JpZ2h0QXJyb3d8TmVnYXRpdmVNZWRpdW1TcGFjZXxibGFja3RyaWFuZ2xlcmlnaHR8UmlnaHREb3duVmVjdG9yQmFyfFByZWNlZGVzU2xhbnRFcXVhbHxSaWdodERvdWJsZUJyYWNrZXR8U3VjY2VlZHNTbGFudEVxdWFsfE5vdExlZnRUcmlhbmdsZUJhcnxSaWdodFRyaWFuZ2xlRXF1YWx8U3F1YXJlSW50ZXJzZWN0aW9ufFJpZ2h0RG93blRlZVZlY3RvcnxSZXZlcnNlRXF1aWxpYnJpdW18TmVnYXRpdmVUaGlja1NwYWNlfGxvbmdsZWZ0cmlnaHRhcnJvd3xMb25nbGVmdHJpZ2h0YXJyb3d8TG9uZ0xlZnRSaWdodEFycm93fERvd25SaWdodFRlZVZlY3RvcnxEb3duUmlnaHRWZWN0b3JCYXJ8R3JlYXRlclNsYW50RXF1YWx8U3F1YXJlU3Vic2V0RXF1YWx8TGVmdERvd25WZWN0b3JCYXJ8TGVmdERvdWJsZUJyYWNrZXR8VmVydGljYWxTZXBhcmF0b3J8cmlnaHRsZWZ0aGFycG9vbnN8Tm90R3JlYXRlckdyZWF0ZXJ8Tm90U3F1YXJlU3VwZXJzZXR8YmxhY2t0cmlhbmdsZWxlZnR8YmxhY2t0cmlhbmdsZWRvd258TmVnYXRpdmVUaGluU3BhY2V8TGVmdERvd25UZWVWZWN0b3J8Tm90TGVzc1NsYW50RXF1YWx8bGVmdHJpZ2h0aGFycG9vbnN8RG91YmxlVXBEb3duQXJyb3d8RG91YmxlVmVydGljYWxCYXJ8TGVmdFRyaWFuZ2xlRXF1YWx8RmlsbGVkU21hbGxTcXVhcmV8dHdvaGVhZHJpZ2h0YXJyb3d8Tm90TmVzdGVkTGVzc0xlc3N8RG93bkxlZnRUZWVWZWN0b3J8RG93bkxlZnRWZWN0b3JCYXJ8UmlnaHRBbmdsZUJyYWNrZXR8Tm90VGlsZGVGdWxsRXF1YWx8Tm90UmV2ZXJzZUVsZW1lbnR8UmlnaHRVcERvd25WZWN0b3J8RGlhY3JpdGljYWxUaWxkZXxOb3RTdWNjZWVkc1RpbGRlfGNpcmNsZWFycm93cmlnaHR8Tm90UHJlY2VkZXNFcXVhbHxyaWdodGhhcnBvb25kb3dufERvdWJsZVJpZ2h0QXJyb3d8Tm90U3VjY2VlZHNFcXVhbHxOb25CcmVha2luZ1NwYWNlfE5vdFJpZ2h0VHJpYW5nbGV8TGVzc0VxdWFsR3JlYXRlcnxSaWdodFVwVGVlVmVjdG9yfExlZnRBbmdsZUJyYWNrZXR8R3JlYXRlckZ1bGxFcXVhbHxEb3duQXJyb3dVcEFycm93fFJpZ2h0VXBWZWN0b3JCYXJ8dHdvaGVhZGxlZnRhcnJvd3xHcmVhdGVyRXF1YWxMZXNzfGRvd25oYXJwb29ucmlnaHR8UmlnaHRUcmlhbmdsZUJhcnxudHJpYW5nbGVyaWdodGVxfE5vdFN1cGVyc2V0RXF1YWx8TGVmdFVwRG93blZlY3RvcnxEaWFjcml0aWNhbEFjdXRlfHJpZ2h0cmlnaHRhcnJvd3N8dmFydHJpYW5nbGVyaWdodHxVcEFycm93RG93bkFycm93fERpYWNyaXRpY2FsR3JhdmV8VW5kZXJQYXJlbnRoZXNpc3xFbXB0eVNtYWxsU3F1YXJlfExlZnRVcFZlY3RvckJhcnxsZWZ0cmlnaHRhcnJvd3N8RG93blJpZ2h0VmVjdG9yfGRvd25oYXJwb29ubGVmdHx0cmlhbmdsZXJpZ2h0ZXF8U2hvcnRSaWdodEFycm93fE92ZXJQYXJlbnRoZXNpc3xEb3VibGVMZWZ0QXJyb3d8RG91YmxlRG93bkFycm93fE5vdFNxdWFyZVN1YnNldHxiaWd0cmlhbmdsZWRvd258bnRyaWFuZ2xlbGVmdGVxfFVwcGVyUmlnaHRBcnJvd3xjdXJ2ZWFycm93cmlnaHR8dmFydHJpYW5nbGVsZWZ0fE5vdExlZnRUcmlhbmdsZXxubGVmdHJpZ2h0YXJyb3d8TG93ZXJSaWdodEFycm93fE5vdEh1bXBEb3duSHVtcHxOb3RHcmVhdGVyVGlsZGV8cmlnaHR0aHJlZXRpbWVzfExlZnRVcFRlZVZlY3RvcnxOb3RHcmVhdGVyRXF1YWx8c3RyYWlnaHRlcHNpbG9ufExlZnRUcmlhbmdsZUJhcnxyaWdodHNxdWlnYXJyb3d8Q29udG91ckludGVncmFsfHJpZ2h0bGVmdGFycm93c3xDbG9zZUN1cmx5UXVvdGV8UmlnaHREb3duVmVjdG9yfExlZnRSaWdodFZlY3RvcnxuTGVmdHJpZ2h0YXJyb3d8bGVmdGhhcnBvb25kb3dufGNpcmNsZWFycm93bGVmdHxTcXVhcmVTdXBlcnNldHxPcGVuQ3VybHlRdW90ZXxob29rcmlnaHRhcnJvd3xIb3Jpem9udGFsTGluZXxEaWFjcml0aWNhbERvdHxOb3RMZXNzR3JlYXRlcnxudHJpYW5nbGVyaWdodHxEb3VibGVSaWdodFRlZXxJbnZpc2libGVDb21tYXxJbnZpc2libGVUaW1lc3xMb3dlckxlZnRBcnJvd3xEb3duTGVmdFZlY3RvcnxOb3RTdWJzZXRFcXVhbHxjdXJ2ZWFycm93bGVmdHx0cmlhbmdsZWxlZnRlcXxOb3RWZXJ0aWNhbEJhcnxUaWxkZUZ1bGxFcXVhbHxkb3duZG93bmFycm93c3xOb3RHcmVhdGVyTGVzc3xSaWdodFRlZVZlY3RvcnxaZXJvV2lkdGhTcGFjZXxsb29wYXJyb3dyaWdodHxMb25nUmlnaHRBcnJvd3xkb3VibGViYXJ3ZWRnZXxTaG9ydExlZnRBcnJvd3xTaG9ydERvd25BcnJvd3xSaWdodFZlY3RvckJhcnxHcmVhdGVyR3JlYXRlcnxSZXZlcnNlRWxlbWVudHxyaWdodGhhcnBvb251cHxMZXNzU2xhbnRFcXVhbHxsZWZ0dGhyZWV0aW1lc3x1cGhhcnBvb25yaWdodHxyaWdodGFycm93dGFpbHxMZWZ0RG93blZlY3RvcnxMb25ncmlnaHRhcnJvd3xOZXN0ZWRMZXNzTGVzc3xVcHBlckxlZnRBcnJvd3xuc2hvcnRwYXJhbGxlbHxsZWZ0bGVmdGFycm93c3xsZWZ0cmlnaHRhcnJvd3xMZWZ0cmlnaHRhcnJvd3xMZWZ0UmlnaHRBcnJvd3xsb25ncmlnaHRhcnJvd3x1cGhhcnBvb25sZWZ0fFJpZ2h0QXJyb3dCYXJ8QXBwbHlGdW5jdGlvbnxMZWZ0VGVlVmVjdG9yfGxlZnRhcnJvd3RhaWx8Tm90RXF1YWxUaWxkZXx2YXJzdWJzZXRuZXFxfHZhcnN1cHNldG5lcXF8UmlnaHRUZWVBcnJvd3xTdWNjZWVkc0VxdWFsfFN1Y2NlZWRzVGlsZGV8TGVmdFZlY3RvckJhcnxTdXBlcnNldEVxdWFsfGhvb2tsZWZ0YXJyb3d8RGlmZmVyZW50aWFsRHxWZXJ0aWNhbFRpbGRlfFZlcnlUaGluU3BhY2V8YmxhY2t0cmlhbmdsZXxiaWd0cmlhbmdsZXVwfExlc3NGdWxsRXF1YWx8ZGl2aWRlb250aW1lc3xsZWZ0aGFycG9vbnVwfFVwRXF1aWxpYnJpdW18bnRyaWFuZ2xlbGVmdHxSaWdodFRyaWFuZ2xlfG1lYXN1cmVkYW5nbGV8c2hvcnRwYXJhbGxlbHxsb25nbGVmdGFycm93fExvbmdsZWZ0YXJyb3d8TG9uZ0xlZnRBcnJvd3xEb3VibGVMZWZ0VGVlfFBvaW5jYXJlcGxhbmV8UHJlY2VkZXNFcXVhbHx0cmlhbmdsZXJpZ2h0fERvdWJsZVVwQXJyb3d8UmlnaHRVcFZlY3RvcnxmYWxsaW5nZG90c2VxfGxvb3BhcnJvd2xlZnR8UHJlY2VkZXNUaWxkZXxOb3RUaWxkZUVxdWFsfE5vdFRpbGRlVGlsZGV8c21hbGxzZXRtaW51c3xQcm9wb3J0aW9uYWx8dHJpYW5nbGVsZWZ0fHRyaWFuZ2xlZG93bnxVbmRlckJyYWNrZXR8Tm90SHVtcEVxdWFsfGV4cG9uZW50aWFsZXxFeHBvbmVudGlhbEV8Tm90TGVzc1RpbGRlfEhpbGJlcnRTcGFjZXxSaWdodENlaWxpbmd8YmxhY2tsb3plbmdlfHZhcnN1cHNldG5lcXxIdW1wRG93bkh1bXB8R3JlYXRlckVxdWFsfFZlcnRpY2FsTGluZXxMZWZ0VGVlQXJyb3d8Tm90TGVzc0VxdWFsfERvd25UZWVBcnJvd3xMZWZ0VHJpYW5nbGV8dmFyc3Vic2V0bmVxfEludGVyc2VjdGlvbnxOb3RDb25ncnVlbnR8RG93bkFycm93QmFyfExlZnRVcFZlY3RvcnxMZWZ0QXJyb3dCYXJ8cmlzaW5nZG90c2VxfEdyZWF0ZXJUaWxkZXxSb3VuZEltcGxpZXN8U3F1YXJlU3Vic2V0fFNob3J0VXBBcnJvd3xOb3RTdXBlcnNldHxxdWF0ZXJuaW9uc3xwcmVjbmFwcHJveHxiYWNrZXBzaWxvbnxwcmVjY3VybHllcXxPdmVyQnJhY2tldHxibGFja3NxdWFyZXxNZWRpdW1TcGFjZXxWZXJ0aWNhbEJhcnxjaXJjbGVkY2lyY3xjaXJjbGVkZGFzaHxDaXJjbGVNaW51c3xDaXJjbGVUaW1lc3xMZXNzR3JlYXRlcnxjdXJseWVxcHJlY3xjdXJseWVxc3VjY3xkaWFtb25kc3VpdHxVcERvd25BcnJvd3xVcGRvd25hcnJvd3xSdWxlRGVsYXllZHxScmlnaHRhcnJvd3x1cGRvd25hcnJvd3xSaWdodFZlY3RvcnxuUmlnaHRhcnJvd3xucmlnaHRhcnJvd3xlcXNsYW50bGVzc3xMZWZ0Q2VpbGluZ3xFcXVpbGlicml1bXxTbWFsbENpcmNsZXxleHBlY3RhdGlvbnxOb3RTdWNjZWVkc3x0aGlja2FwcHJveHxHcmVhdGVyTGVzc3xTcXVhcmVVbmlvbnxOb3RQcmVjZWRlc3xOb3RMZXNzTGVzc3xzdHJhaWdodHBoaXxzdWNjbmFwcHJveHxzdWNjY3VybHllcXxTdWJzZXRFcXVhbHxzcXN1cHNldGVxfFByb3BvcnRpb258TGFwbGFjZXRyZnxJbWFnaW5hcnlJfHN1cHNldG5lcXF8Tm90R3JlYXRlcnxndHJlcXFsZXNzfE5vdEVsZW1lbnR8VGhpY2tTcGFjZXxUaWxkZUVxdWFsfFRpbGRlVGlsZGV8Rm91cmllcnRyZnxybW91c3RhY2hlfEVxdWFsVGlsZGV8ZXFzbGFudGd0cnxVbmRlckJyYWNlfExlZnRWZWN0b3J8VXBBcnJvd0JhcnxuTGVmdGFycm93fG5zdWJzZXRlcXF8c3Vic2V0bmVxcXxuc3Vwc2V0ZXFxfG5sZWZ0YXJyb3d8c3VjY2FwcHJveHxsZXNzYXBwcm94fFVwVGVlQXJyb3d8dXB1cGFycm93c3xjdXJseXdlZGdlfGxlc3NlcXFndHJ8dmFyZXBzaWxvbnx2YXJub3RoaW5nfFJpZ2h0Rmxvb3J8Y29tcGxlbWVudHxDaXJjbGVQbHVzfHNxc3Vic2V0ZXF8TGxlZnRhcnJvd3xjaXJjbGVkYXN0fFJpZ2h0QXJyb3d8UmlnaHRhcnJvd3xyaWdodGFycm93fGxtb3VzdGFjaGV8QmVybm91bGxpc3xwcmVjYXBwcm94fG1hcHN0b2xlZnR8bWFwc3RvZG93bnxsb25nbWFwc3RvfGRvdHNxdWFyZXxkb3duYXJyb3d8RG91YmxlRG90fG5zdWJzZXRlcXxzdXBzZXRuZXF8bGVmdGFycm93fG5zdXBzZXRlcXxzdWJzZXRuZXF8VGhpblNwYWNlfG5nZXFzbGFudHxzdWJzZXRlcXF8SHVtcEVxdWFsfE5vdFN1YnNldHx0cmlhbmdsZXF8Tm90Q3VwQ2FwfGxlc3NlcWd0cnxoZWFydHN1aXR8VHJpcGxlRG90fExlZnRhcnJvd3xDb3Byb2R1Y3R8Q29uZ3J1ZW50fHZhcnByb3B0b3xjb21wbGV4ZXN8Z3ZlcnRuZXFxfExlZnRBcnJvd3xMZXNzVGlsZGV8c3Vwc2V0ZXFxfE1pbnVzUGx1c3xDaXJjbGVEb3R8bmxlcXNsYW50fE5vdEV4aXN0c3xndHJlcWxlc3N8bnBhcmFsbGVsfFVuaW9uUGx1c3xMZWZ0Rmxvb3J8Y2hlY2ttYXJrfENlbnRlckRvdHxjZW50ZXJkb3R8TWVsbGludHJmfGd0cmFwcHJveHxiaWdvdGltZXN8T3ZlckJyYWNlfHNwYWRlc3VpdHx0aGVyZWZvcmV8cGl0Y2hmb3JrfHJhdGlvbmFsc3xQbHVzTWludXN8QmFja3NsYXNofFRoZXJlZm9yZXxEb3duQnJldmV8YmFja3NpbWVxfGJhY2twcmltZXxEb3duQXJyb3d8bnNob3J0bWlkfERvd25hcnJvd3xsdmVydG5lcXF8ZXF2cGFyc2x8aW1hZ2xpbmV8aW1hZ3BhcnR8aW5maW50aWV8aW50ZWdlcnN8SW50ZWdyYWx8aW50ZXJjYWx8TGVzc0xlc3N8VWFycm9jaXJ8aW50bGFyaGt8c3FzdXBzZXR8YW5nbXNkYWZ8c3FzdWJzZXR8bGxjb3JuZXJ8dmFydGhldGF8Y3VwYnJjYXB8bG5hcHByb3h8U3VwZXJzZXR8U3VjaFRoYXR8c3VjY25zaW18c3VjY25lcXF8YW5nbXNkYWd8YmlndXBsdXN8Y3VybHl2ZWV8dHJwZXppdW18U3VjY2VlZHN8Tm90VGlsZGV8Ymlnd2VkZ2V8YW5nbXNkYWh8YW5ncnR2YmR8dHJpbWludXN8Y3djb25pbnR8ZnBhcnRpbnR8bHJjb3JuZXJ8c21lcGFyc2x8c3Vic2V0ZXF8dXJjb3JuZXJ8bHVyZHNoYXJ8bGFlbXB0eXZ8RERvdHJhaGR8YXBwcm94ZXF8bGRydXNoYXJ8YXdjb25pbnR8bWFwc3RvdXB8YmFja2Nvbmd8c2hvcnRtaWR8dHJpYW5nbGV8Z2Vxc2xhbnR8Z2VzZG90b2x8dGltZXNiYXJ8Y2lyY2xlZFJ8Y2lyY2xlZFN8c2V0bWludXN8bXVsdGltYXB8bmF0dXJhbHN8c2Nwb2xpbnR8bmNvbmdkb3R8UmlnaHRUZWV8Ym94bWludXN8Z25hcHByb3h8Ym94dGltZXN8YW5kc2xvcGV8dGhpY2tzaW18YW5nbXNkYWF8dmFyc2lnbWF8Y2lyZm5pbnR8cnRyaWx0cml8YW5nbXNkYWJ8cnBwb2xpbnR8YW5nbXNkYWN8YmFyd2VkZ2V8ZHJia2Fyb3d8Y2x1YnN1aXR8dGhldGFzeW18YnNvbGhzdWJ8Y2FwYnJjdXB8ZHppZ3JhcnJ8ZG90ZXFkb3R8RG90RXF1YWx8ZG90bWludXN8VW5kZXJCYXJ8Tm90RXF1YWx8cmVhbHBhcnR8b3RpbWVzYXN8dWxjb3JuZXJ8aGtzZWFyb3d8aGtzd2Fyb3d8cGFyYWxsZWx8UGFydGlhbER8ZWxpbnRlcnN8ZW1wdHlzZXR8cGx1c2FjaXJ8YmJya3Ricmt8YW5nbXNkYWR8cG9pbnRpbnR8Ymlnb3BsdXN8YW5nbXNkYWV8UHJlY2VkZXN8Ymlnc3FjdXB8dmFya2FwcGF8bm90aW5kb3R8c3Vwc2V0ZXF8cHJlY25lcXF8cHJlY25zaW18cHJvZmFsYXJ8cHJvZmxpbmV8cHJvZnN1cmZ8bGVxc2xhbnR8bGVzZG90b3J8cmFlbXB0eXZ8c3VicGx1c3xub3RuaXZifG5vdG5pdmN8c3VicmFycnx6aWdyYXJyfHZ6aWd6YWd8c3VibXVsdHxzdWJlZG90fEVsZW1lbnR8YmV0d2VlbnxjaXJzY2lyfGxhcnJiZnN8bGFycnNpbXxsb3RpbWVzfGxicmtzbGR8bGJya3NsdXxsb3plbmdlfGxkcmRoYXJ8ZGJrYXJvd3xiaWdjaXJjfGVwc2lsb258c2ltcmFycnxzaW1wbHVzfGx0cXVlc3R8RXBzaWxvbnxsdXJ1aGFyfGd0cXVlc3R8bWFsdGVzZXxucG9saW50fGVxY29sb258bnByZWNlcXxiaWdvZG90fGRkYWdnZXJ8Z3RybGVzc3xibmVxdWl2fGhhcnJjaXJ8ZGRvdHNlcXxlcXVpdkREfGJhY2tzaW18ZGVtcHR5dnxuc3FzdWJlfG5zcXN1cGV8VXBzaWxvbnxuc3Vic2V0fHVwc2lsb258bWludXNkdXxuc3VjY2VxfHN3YXJyb3d8bnN1cHNldHxjb2xvbmVxfHNlYXJyb3d8Ym94cGx1c3xuYXBwcm94fG5hdHVyYWx8YXN5bXBlcXxhbGVmc3ltfGNvbmdkb3R8bmVhcnJvd3xiaWdzdGFyfGRpYW1vbmR8c3VwcGx1c3x0cml0aW1lfExlZnRUZWV8bnZpbmZpbnx0cmlwbHVzfE5ld0xpbmV8bnZsdHJpZXxudnJ0cmllfG53YXJyb3d8bmV4aXN0c3xEaWFtb25kfHJ1bHVoYXJ8SW1wbGllc3xzdXBtdWx0fGFuZ3phcnJ8c3VwbGFycnxzdXBoc3VifHF1ZXN0ZXF8YmVjYXVzZXxkaWdhbW1hfEJlY2F1c2V8b2xjcm9zc3xiZW1wdHl2fG9taWNyb258T21pY3Jvbnxyb3RpbWVzfE5vQnJlYWt8aW50cHJvZHxhbmdydHZifG9yZGVyb2Z8dXdhbmdsZXxzdXBoc29sfGxlc2RvdG98b3JzbG9wZXxEb3duVGVlfHJlYWxpbmV8Y3VkYXJybHxyZGxkaGFyfE92ZXJCYXJ8c3VwZWRvdHxsZXNzZG90fHN1cGRzdWJ8dG9wZm9ya3xzdWNjc2ltfHJicmtzbHV8cmJya3NsZHxwZXJ0ZW5rfGN1ZGFycnJ8aXNpbmRvdHxwbGFuY2tofGxlc3NndHJ8cGx1c2NpcnxnZXNkb3RvfHBsdXNzaW18cGx1c3R3b3xsZXNzc2ltfGN1bGFycnB8cmFycnNpbXxDYXlsZXlzfG5vdGludmF8bm90aW52Ynxub3RpbnZjfFVwQXJyb3d8VXBhcnJvd3x1cGFycm93fE5vdExlc3N8ZHdhbmdsZXxwcmVjc2ltfFByb2R1Y3R8Y3VyYXJybXxDY29uaW50fGRvdHBsdXN8cmFycmJmc3xjY3Vwc3NtfENlZGlsbGF8Y2VtcHR5dnxub3RuaXZhfHF1YXRpbnR8ZnJhYzM1fGZyYWMzOHxmcmFjNDV8ZnJhYzU2fGZyYWM1OHxmcmFjNzh8dHJpZG90fHhvcGx1c3xnYWN1dGV8Z2FtbWFkfEdhbW1hZHxsZmlzaHR8bGZsb29yfGJpZ2N1cHxzcXN1cGV8Z2JyZXZlfEdicmV2ZXxsaGFydWx8c3FzdWJlfHNxY3Vwc3xHY2VkaWx8YXBhY2lyfGxsaGFyZHxsbWlkb3R8TG1pZG90fGxtb3VzdHxhbmRhbmR8c3FjYXBzfGFwcHJveHxBYnJldmV8c3BhZGVzfGNpcmNlcXx0cHJpbWV8ZGl2aWRlfHRvcGNpcnxBc3NpZ258dG9wYm90fGdlc2RvdHxkaXZvbnh8eHVwbHVzfHRpbWVzZHxnZXNsZXN8YXRpbGRlfHNvbGJhcnxTT0ZUY3l8bG9wbHVzfHRpbWVzYnxsb3dhc3R8bG93YmFyfGRsY29ybnxkbGNyb3B8c29mdGN5fGRvbGxhcnxscGFybHR8dGhrc2ltfGxyaGFyZHxBdGlsZGV8bHNhcXVvfHNtYXNocHxiaWd2ZWV8dGhpbnNwfHdyZWF0aHxia2Fyb3d8bHNxdW9yfGxzdHJva3xMc3Ryb2t8bHRocmVlfGx0aW1lc3xsdGxhcnJ8RG90RG90fHNpbWRvdHxsdHJQYXJ8d2VpZXJwfHhzcWN1cHxhbmdtc2R8c2lnbWF2fHNpZ21hZnx6ZWV0cmZ8WmNhcm9ufHpjYXJvbnxtYXBzdG98dnN1cG5lfHRoZXRhdnxjaXJtaWR8bWFya2VyfG1jb21tYXxaYWN1dGV8dnN1Ym5FfHRoZXJlNHxndGxQYXJ8dnN1Ym5lfGJvdHRvbXxndHJhcnJ8U0hDSGN5fHNoY2hjeXxtaWRhc3R8bWlkY2lyfG1pZGRvdHxtaW51c2J8bWludXNkfGd0cmRvdHxib3d0aWV8c2Zyb3dufG1ucGx1c3xtb2RlbHN8Y29sb25lfHNlc3dhcnxDb2xvbmV8bXN0cG9zfHNlYXJoa3xndHJzaW18bmFjdXRlfE5hY3V0ZXxib3hib3h8dGVscmVjfGhhaXJzcHxUY2VkaWx8bmJ1bXBlfHNjbnNpbXxuY2Fyb258TmNhcm9ufG5jZWRpbHxOY2VkaWx8aGFtaWx0fFNjZWRpbHxuZWFyaGt8aGFyZGN5fEhBUkRjeXx0Y2VkaWx8VGNhcm9ufGNvbW1hdHxuZXF1aXZ8bmVzZWFyfHRjYXJvbnx0YXJnZXR8aGVhcnRzfG5leGlzdHx2YXJyaG98c2NlZGlsfFNjYXJvbnxzY2Fyb258aGVsbGlwfFNhY3V0ZXxzYWN1dGV8aGVyY29ufHN3bndhcnxjb21wZm58cnRpbWVzfHJ0aHJlZXxyc3F1b3J8cnNhcXVvfHphY3V0ZXx3ZWRnZXF8aG9tdGh0fGJhcnZlZXxiYXJ3ZWR8QmFyd2VkfHJwYXJndHxob3JiYXJ8Y29uaW50fHN3YXJoa3xyb3BsdXN8bmx0cmllfGhzbGFzaHxoc3Ryb2t8SHN0cm9rfHJtb3VzdHxDb25pbnR8YnByaW1lfGh5YnVsbHxoeXBoZW58aWFjdXRlfElhY3V0ZXxzdXBzdXB8c3Vwc3VifHN1cHNpbXx2YXJwaGl8Y29wcm9kfGJydmJhcnxhZ3JhdmV8U3Vwc2V0fHN1cHNldHxpZ3JhdmV8SWdyYXZlfG5vdGluRXxBZ3JhdmV8aWlpaW50fGlpbmZpbnxjb3B5c3J8d2VkYmFyfFZlcmJhcnx2YW5ncnR8YmVjYXVzfGluY2FyZXx2ZXJiYXJ8aW5vZG90fGJ1bGxldHxkcmNvcm58aW50Y2FsfGRyY3JvcHxjdWxhcnJ8dmVsbGlwfFV0aWxkZXxidW1wZXF8Y3VwY2FwfGRzdHJva3xEc3Ryb2t8Q3VwQ2FwfGN1cGN1cHxjdXBkb3R8ZWFjdXRlfEVhY3V0ZXxzdXBkb3R8aXF1ZXN0fGVhc3RlcnxlY2Fyb258RWNhcm9ufGVjb2xvbnxpc2luc3Z8dXRpbGRlfGl0aWxkZXxJdGlsZGV8Y3VyYXJyfHN1Y2NlcXxCdW1wZXF8Y2FjdXRlfHVsY3JvcHxucGFyc2x8Q2FjdXRlfG5wcmN1ZXxlZ3JhdmV8RWdyYXZlfG5yYXJyY3xucmFycnd8c3Vic3VwfHN1YnN1YnxucnRyaWV8anNlcmN5fG5zY2N1ZXxKc2VyY3l8a2FwcGF2fGtjZWRpbHxLY2VkaWx8c3Vic2ltfHVsY29ybnxuc2ltZXF8ZWdzZG90fHZlZWJhcnxrZ3JlZW58Y2FwYW5kfGVsc2RvdHxTdWJzZXR8c3Vic2V0fGN1cnJlbnxhYWN1dGV8bGFjdXRlfExhY3V0ZXxlbXB0eXZ8bnRpbGRlfE50aWxkZXxsYWdyYW58bGFtYmRhfExhbWJkYXxjYXBjYXB8VWdyYXZlfGxhbmdsZXxzdWJkb3R8ZW1zcDEzfG51bWVyb3xlbXNwMTR8bnZkYXNofG52RGFzaHxuVmRhc2h8blZEYXNofHVncmF2ZXx1ZmlzaHR8bnZIYXJyfGxhcnJmc3xudmxBcnJ8bGFycmhrfGxhcnJscHxsYXJycGx8bnZyQXJyfFVkYmxhY3xud2FyaGt8bGFycnRsfG53bmVhcnxvYWN1dGV8T2FjdXRlfGxhdGFpbHxsQXRhaWx8c3N0YXJmfGxicmFjZXxvZGJsYWN8T2RibGFjfGxicmFja3x1ZGJsYWN8b2Rzb2xkfGVwYXJzbHxsY2Fyb258TGNhcm9ufG9ncmF2ZXxPZ3JhdmV8bGNlZGlsfExjZWRpbHxBYWN1dGV8c3NtaWxlfHNzZXRtbnxzcXVhcmZ8bGRxdW9yfGNhcGN1cHxvbWludXN8Y3lsY3R5fHJoYXJ1bHxlcWNpcmN8ZGFnZ2VyfHJmbG9vcnxyZmlzaHR8RGFnZ2VyfGRhbGV0aHxlcXVhbHN8b3JpZ29mfGNhcGRvdHxlcXVlc3R8ZGNhcm9ufERjYXJvbnxyZHF1b3J8b3NsYXNofE9zbGFzaHxvdGlsZGV8T3RpbGRlfG90aW1lc3xPdGltZXN8dXJjcm9wfFVicmV2ZXx1YnJldmV8WWFjdXRlfFVhY3V0ZXx1YWN1dGV8UmNlZGlsfHJjZWRpbHx1cmNvcm58cGFyc2ltfFJjYXJvbnxWZGFzaGx8cmNhcm9ufFRzdHJva3xwZXJjbnR8cGVyaW9kfHBlcm1pbHxFeGlzdHN8eWFjdXRlfHJicmFja3xyYnJhY2V8cGhtbWF0fGNjYXJvbnxDY2Fyb258cGxhbmNrfGNjZWRpbHxwbGFua3Z8dHN0cm9rfGZlbWFsZXxwbHVzZG98cGx1c2R1fGZmaWxpZ3xwbHVzbW58ZmZsbGlnfENjZWRpbHxyQXRhaWx8ZGZpc2h0fGJlcm5vdXxyYXRhaWx8UmFycnRsfHJhcnJ0bHxhbmdzcGh8cmFycnBsfHJhcnJscHxyYXJyaGt8eHdlZGdlfHhvdGltZXxmb3JhbGx8Rm9yQWxsfFZ2ZGFzaHx2c3VwbkV8cHJlY2VxfGJpZ2NhcHxmcmFjMTJ8ZnJhYzEzfGZyYWMxNHxwcmltZXN8cmFycmZzfHBybnNpbXxmcmFjMTV8U3F1YXJlfGZyYWMxNnxzcXVhcmV8bGVzZG90fGZyYWMxOHxmcmFjMjN8cHJvcHRvfHBydXJlbHxyYXJyYXB8cmFuZ2xlfHB1bmNzcHxmcmFjMjV8UmFjdXRlfHFwcmltZXxyYWN1dGV8bGVzZ2VzfGZyYWMzNHxhYnJldmV8QUVsaWd8ZXFzaW18dXRkb3R8c2V0bW58dXJ0cml8RXF1YWx8VXJpbmd8c2VBcnJ8dXJpbmd8c2VhcnJ8ZGFzaHZ8RGFzaHZ8bXVtYXB8bmFibGF8aW9nb258SW9nb258c2RvdGV8c2RvdGJ8c2NzaW18bmFwaWR8bmFwb3N8ZXF1aXZ8bmF0dXJ8QWNpcmN8ZGJsYWN8ZXJhcnJ8bmJ1bXB8aXByb2R8ZXJEb3R8dWNpcmN8YXdpbnR8ZXNkb3R8YW5ncnR8bmNvbmd8aXNpbkV8c2NuYXB8U2NpcmN8c2NpcmN8bmRhc2h8aXNpbnN8VWJyY3l8bmVhcnJ8bmVBcnJ8aXNpbnZ8bmVkb3R8dWJyY3l8YWN1dGV8WWNpcmN8aXVrY3l8SXVrY3l8eHV0cml8bmVzaW18Y2FyZXR8amNpcmN8SmNpcmN8Y2Fyb258dHdpeHR8ZGRhcnJ8c2NjdWV8ZXhpc3R8am1hdGh8c2JxdW98bmdlcXF8YW5nc3R8Y2NhcHN8bGNlaWx8bmdzaW18VXBUZWV8ZGVsdGF8RGVsdGF8cnRyaWZ8bmhhcnJ8bmhBcnJ8bmhwYXJ8cnRyaWV8anVrY3l8SnVrY3l8a2FwcGF8cnNxdW98S2FwcGF8bmxhcnJ8bmxBcnJ8VFNIY3l8cnJhcnJ8YW9nb258QW9nb258ZmZsaWd8eHJhcnJ8dHNoY3l8Y2NpcmN8bmxlcXF8ZmlsaWd8dXBzaWh8bmxlc3N8ZGhhcmx8bmxzaW18ZmpsaWd8cm9wYXJ8bmx0cml8ZGhhcnJ8cm9icmt8cm9hcnJ8ZmxsaWd8Zmx0bnN8cm9hbmd8cm5taWR8c3VibkV8c3VibmV8bEFhcnJ8dHJpc2J8Q2NpcmN8YWNpcmN8Y2N1cHN8Ymxhbmt8VkRhc2h8Zm9ya3Z8VmRhc2h8bGFuZ2R8Y2VkaWx8YmxrMTJ8YmxrMTR8bGFxdW98c3RybnN8ZGlhbXN8bm90aW58dkRhc2h8bGFycmJ8YmxrMzR8YmxvY2t8ZGlzaW58dXBsdXN8dmRhc2h8dkJhcnZ8YWVsaWd8c3RhcmZ8V2VkZ2V8Y2hlY2t8eHJBcnJ8bGF0ZXN8bGJhcnJ8bEJhcnJ8bm90bml8bGJicmt8YmNvbmd8ZnJhc2x8bGJya2V8ZnJvd258dnJ0cml8dnByb3B8dm5zdXB8Z2FtbWF8R2FtbWF8d2VkZ2V8eG9kb3R8YmRxdW98c3JhcnJ8ZG90ZXF8bGRxdW98Ym94ZGx8Ym94ZEx8Z2NpcmN8R2NpcmN8Ym94RGx8Ym94REx8Ym94ZHJ8Ym94ZFJ8Ym94RHJ8VFJBREV8dHJhZGV8cmxoYXJ8Ym94RFJ8dm5zdWJ8bnBhcnR8dmx0cml8cmxhcnJ8Ym94aGR8Ym94aER8bnByZWN8Z2VzY2N8bnJhcnJ8bnJBcnJ8Ym94SGR8Ym94SER8Ym94aHV8Ym94aFV8bnJ0cml8Ym94SHV8Y2x1YnN8Ym94SFV8dGltZXN8Y29sb258Q29sb258Z2ltZWx8eGxBcnJ8VGlsZGV8bnNpbWV8dGlsZGV8bnNtaWR8bnNwYXJ8VEhPUk58dGhvcm58eGxhcnJ8bnN1YmV8bnN1YkV8dGhrYXB8eGhBcnJ8Y29tbWF8bnN1Y2N8Ym94dWx8Ym94dUx8bnN1cGV8bnN1cEV8Z25lcXF8Z25zaW18Ym94VWx8Ym94VUx8Z3JhdmV8Ym94dXJ8Ym94dVJ8Ym94VXJ8Ym94VVJ8bGVzY2N8YW5nbGV8YmVwc2l8Ym94dmh8dmFycGl8Ym94dkh8bnVtc3B8VGhldGF8Z3NpbWV8Z3NpbWx8dGhldGF8Ym94Vmh8Ym94Vkh8Ym94dmx8Z3RjaXJ8Z3Rkb3R8Ym94dkx8Ym94Vmx8Ym94Vkx8Y3JhcnJ8Y3Jvc3N8Q3Jvc3N8bnZzaW18Ym94dnJ8bndhcnJ8bndBcnJ8c3FzdXB8ZHRkb3R8VW9nb258bGhhcmR8bGhhcnV8ZHRyaWZ8b2NpcmN8T2NpcmN8bGhibGt8ZHVhcnJ8b2Rhc2h8c3FzdWJ8SGFjZWt8c3FjdXB8bGxhcnJ8ZHVoYXJ8b2VsaWd8T0VsaWd8b2ZjaXJ8Ym94dlJ8dW9nb258bGx0cml8Ym94VnJ8Y3N1YmV8dXVhcnJ8b2hiYXJ8Y3N1cGV8Y3Rkb3R8b2xhcnJ8b2xjaXJ8aGFycnd8b2xpbmV8c3FjYXB8b21hY3J8T21hY3J8b21lZ2F8T21lZ2F8Ym94VlJ8YWxlcGh8bG5lcXF8bG5zaW18bG9hbmd8bG9hcnJ8cmhhcnV8bG9icmt8aGNpcmN8b3BlcnB8b3BsdXN8cmhhcmR8SGNpcmN8b3JhcnJ8VW5pb258b3JkZXJ8ZWNpcmN8RWNpcmN8Y3VlcHJ8c3psaWd8Y3Vlc2N8YnJldmV8cmVhbHN8ZUREb3R8QnJldmV8aG9hcnJ8bG9wYXJ8dXRyaWZ8cmRxdW98VW1hY3J8dW1hY3J8ZWZEb3R8c3dBcnJ8dWx0cml8YWxwaGF8cmNlaWx8b3ZiYXJ8c3dhcnJ8V2NpcmN8d2NpcmN8c210ZXN8c21pbGV8YnNlbWl8bHJhcnJ8YXJpbmd8cGFyc2x8bHJoYXJ8YnNpbWV8dWhibGt8bHJ0cml8Y3Vwb3J8QXJpbmd8dWhhcnJ8dWhhcmx8c2xhcnJ8cmJya2V8YnNvbGJ8bHNpbWV8cmJicmt8UkJhcnJ8bHNpbWd8cGhvbmV8ckJhcnJ8cmJhcnJ8aWNpcmN8bHNxdW98SWNpcmN8ZW1hY3J8RW1hY3J8cmF0aW98c2ltbmV8cGx1c2J8c2ltbEV8c2ltZ0V8c2ltZXF8cGx1c2V8bHRjaXJ8bHRkb3R8ZW1wdHl8eGhhcnJ8eGR0cml8aWV4Y2x8QWxwaGF8bHRyaWV8cmFycnd8cG91bmR8bHRyaWZ8eGNpcmN8YnVtcGV8cHJjdWV8YnVtcEV8YXN5bXB8YW1hY3J8Y3V2ZWV8U2lnbWF8c2lnbWF8aWlpbnR8dWRoYXJ8aWlvdGF8aWpsaWd8SUpsaWd8c3VwbkV8aW1hY3J8SW1hY3J8cHJpbWV8UHJpbWV8aW1hZ2V8cHJuYXB8ZW9nb258RW9nb258cmFycmN8bWRhc2h8bUREb3R8Y3V3ZWR8aW1hdGh8c3VwbmV8aW1wZWR8QW1hY3J8dWRhcnJ8cHJzaW18bWljcm98cmFycmJ8Y3dpbnR8cmFxdW98aW5maW58ZXBsdXN8cmFuZ2V8cmFuZ2R8VWNpcmN8cmFkaWN8bWludXN8YW1hbGd8dmVlZXF8ckFhcnJ8ZXBzaXZ8eWNpcmN8cXVlc3R8c2hhcnB8cXVvdHx6d25qfFFzY3J8cmFjZXxxc2NyfFFvcGZ8cW9wZnxxaW50fHJhbmd8UmFuZ3xac2NyfHpzY3J8Wm9wZnx6b3BmfHJhcnJ8ckFycnxSYXJyfFBzY3J8cHNjcnxwcm9wfHByb2R8cHJuRXxwcmVjfFpIY3l8emhjeXxwcmFwfFpldGF8emV0YXxQb3BmfHBvcGZ8WmRvdHxwbHVzfHpkb3R8WXVtbHx5dW1sfHBoaXZ8WVVjeXx5dWN5fFlzY3J8eXNjcnxwZXJwfFlvcGZ8eW9wZnxwYXJ0fHBhcmF8WUljeXxPdW1sfHJjdWJ8eWljeXxZQWN5fHJkY2F8b3VtbHxvc29sfE9zY3J8cmRzaHx5YWN5fHJlYWx8b3Njcnx4dmVlfGFuZGR8cmVjdHxhbmR2fFhzY3J8b3JvcnxvcmRtfG9yZGZ8eHNjcnxhbmdlfGFvcGZ8QW9wZnxySGFyfFhvcGZ8b3BhcnxPb3BmfHhvcGZ8eG5pc3xyaG92fG9vcGZ8b21pZHx4bWFwfG9pbnR8YXBpZHxhcG9zfG9nb258YXNjcnxBc2NyfG9kb3R8b2Rpdnx4Y3VwfHhjYXB8b2NpcnxvYXN0fG52bHR8bnZsZXxudmd0fG52Z2V8bnZhcHxXc2NyfHdzY3J8YXVtbHxudGxnfG50Z2x8bnN1cHxuc3VifG5zaW18TnNjcnxuc2NyfG5zY2V8V29wZnxyaW5nfG5wcmV8d29wZnxucGFyfEF1bWx8QmFydnxiYnJrfE5vcGZ8bm9wZnxubWlkfG5MdHZ8YmV0YXxyb3BmfFJvcGZ8QmV0YXxiZXRofG5sZXN8cnBhcnxubGVxfGJub3R8Yk5vdHxubGRyfE5KY3l8cnNjcnxSc2NyfFZzY3J8dnNjcnxyc3FifG5qY3l8Ym9wZnxuaXNkfEJvcGZ8cnRyaXxWb3BmfG5HdHZ8bmd0cnx2b3BmfGJveGh8Ym94SHxib3h2fG5nZXN8bmdlcXxib3hWfGJzY3J8c2NhcHxCc2NyfGJzaW18VmVydHx2ZXJ0fGJzb2x8YnVsbHxidW1wfGNhcHN8Y2RvdHxuY3VwfHNjbkV8bmNhcHxuYnNwfG5hcEV8Q2RvdHxjZW50fHNkb3R8VmJhcnxuYW5nfHZCYXJ8Y2hjeXxNc2NyfG1zY3J8c2VjdHxzZW1pfENIY3l8TW9wZnxtb3BmfHNleHR8Y2lyY3xjaXJlfG1sZHJ8bWxjcHxjaXJFfGNvbXB8c2hjeXxTSGN5fHZBcnJ8dmFycnxjb25nfGNvcGZ8Q29wZnxjb3B5fENPUFl8bWFsdHxtYWxlfG1hY3J8bHZuRXxjc2NyfGx0cml8c2ltZXxsdGNjfHNpbWd8Q3NjcnxzaW1sfGNzdWJ8VXVtbHxsc3FifGxzaW18dXVtbHxjc3VwfExzY3J8bHNjcnx1dHJpfHNtaWR8bHBhcnxjdXBzfHNtdGV8bG96ZnxkYXJyfExvcGZ8VXNjcnxzb2xifGxvcGZ8c29wZnxTb3BmfGxuZXF8dXNjcnxzcGFyfGRBcnJ8bG5hcHxEYXJyfGRhc2h8U3FydHxMSmN5fGxqY3l8bEhhcnxkSGFyfFVwc2l8dXBzaXxkaWFtfGxlc2d8ZGpjeXxESmN5fGxlcXF8ZG9wZnxEb3BmfGRzY3J8RHNjcnxkc2N5fGxkc2h8bGRjYXxzcXVmfERTY3l8c3NjcnxTc2NyfGRzb2x8bGN1YnxsYXRlfHN0YXJ8U3RhcnxVb3BmfExhcnJ8bEFycnxsYXJyfHVvcGZ8ZHRyaXxkemN5fHN1YmV8c3ViRXxMYW5nfGxhbmd8S3Njcnxrc2NyfEtvcGZ8a29wZnxLSmN5fGtqY3l8S0hjeXxraGN5fERaY3l8ZWNpcnxlZG90fGVEb3R8SnNjcnxqc2NyfHN1Y2N8Sm9wZnxqb3BmfEVkb3R8dUhhcnxlbXNwfGVuc3B8SXVtbHxpdW1sfGVvcGZ8aXNpbnxJc2NyfGlzY3J8RW9wZnxlcGFyfHN1bmd8ZXBzaXxlc2NyfHN1cDF8c3VwMnxzdXAzfElvdGF8aW90YXxzdXBlfHN1cEV8SW9wZnxpb3BmfElPY3l8aW9jeXxFc2NyfGVzaW18RXNpbXxpbW9mfFVhcnJ8UVVPVHx1QXJyfHVhcnJ8ZXVtbHxJRWN5fGllY3l8SWRvdHxFdW1sfGV1cm98ZXhjbHxIc2NyfGhzY3J8SG9wZnxob3BmfFRTY3l8dHNjeXxUc2NyfGhiYXJ8dHNjcnxmbGF0fHRicmt8Zm5vZnxoQXJyfGhhcnJ8aGFsZnxmb3BmfEZvcGZ8dGRvdHxndm5FfGZvcmt8dHJpZXxndGNjfGZzY3J8RnNjcnxnZG90fGdzaW18R3Njcnxnc2NyfEdvcGZ8Z29wZnxnbmVxfEdkb3R8dG9zYXxnbmFwfFRvcGZ8dG9wZnxnZXFxfHRvZWF8R0pjeXxnamN5fHRpbnR8Z2VzbHxtaWR8U2ZyfGdnZ3x0b3B8Z2VzfGdsYXxnbEV8Z2xqfGdlcXxnbmV8Z0VsfGdlbHxnbkV8R2N5fGdjeXxnYXB8VGZyfHRmcnxUY3l8dGN5fEhhdHxUYXV8RmZyfHRhdXxUYWJ8aGZyfEhmcnxmZnJ8RmN5fGZjeXxpY3l8SWN5fGlmZnxFVEh8ZXRofGlmcnxJZnJ8RXRhfGV0YXxpbnR8SW50fFN1cHxzdXB8dWN5fFVjeXxTdW18c3VtfGpjeXxFTkd8dWZyfFVmcnxlbmd8SmN5fGpmcnxlbHN8ZWxsfGVnc3xFZnJ8ZWZyfEpmcnx1bWx8a2N5fEtjeXxFY3l8ZWN5fGtmcnxLZnJ8bGFwfFN1YnxzdWJ8bGF0fGxjeXxMY3l8bGVnfERvdHxkb3R8bEVnfGxlcXxsZXN8c3F1fGRpdnxkaWV8bGZyfExmcnxsZ0V8RGZyfGRmcnxEZWx8ZGVnfERjeXxkY3l8bG5lfGxuRXxzb2x8bG96fHNtdHxDdXB8bHJtfGN1cHxsc2h8THNofHNpbXxzaHl8bWFwfE1hcHxtY3l8TWN5fG1mcnxNZnJ8bWhvfGdmcnxHZnJ8c2ZyfGNpcnxDaGl8Y2hpfG5hcHxDZnJ8dmN5fFZjeXxjZnJ8U2N5fHNjeXxuY3l8TmN5fHZlZXxWZWV8Q2FwfGNhcHxuZnJ8c2NFfHNjZXxOZnJ8bmdlfG5nRXxuR2d8dmZyfFZmcnxuZ3R8Ym90fG5HdHxuaXN8bml2fFJzaHxyc2h8bmxlfG5sRXxibmV8QmZyfGJmcnxuTGx8bmx0fG5MdHxCY3l8YmN5fG5vdHxOb3R8cmxtfHdmcnxXZnJ8bnByfG5zY3xudW18b2N5fGFzdHxPY3l8b2ZyfHhmcnxYZnJ8T2ZyfG9ndHxvaG18YXBFfG9sdHxSaG98YXBlfHJob3xSZnJ8cmZyfG9yZHxSRUd8YW5nfHJlZ3xvcnZ8QW5kfGFuZHxBTVB8UmN5fGFtcHxBZnJ8eWN5fFljeXx5ZW58eWZyfFlmcnxyY3l8cGFyfHBjeXxQY3l8cGZyfFBmcnxwaGl8UGhpfGFmcnxBY3l8YWN5fHpjeXxaY3l8cGl2fGFjRXxhY2R8emZyfFpmcnxwcmV8cHJFfHBzaXxQc2l8cWZyfFFmcnx6d2p8T3J8Z2V8R2d8Z3R8Z2d8ZWx8b1N8bHR8THR8TFR8UmV8bGd8Z2x8ZWd8bmV8SW18aXR8bGV8RER8d3B8d3J8bnV8TnV8ZGR8bEV8U2N8c2N8cGl8UGl8ZWV8YWZ8bGx8TGx8cnh8Z0V8eGl8cG18WGl8aWN8cHJ8UHJ8aW58bml8bXB8bXV8YWN8TXV8b3J8YXB8R3R8R1R8aWkpO3wmKEFhY3V0ZXxBZ3JhdmV8QXRpbGRlfENjZWRpbHxFYWN1dGV8RWdyYXZlfElhY3V0ZXxJZ3JhdmV8TnRpbGRlfE9hY3V0ZXxPZ3JhdmV8T3NsYXNofE90aWxkZXxVYWN1dGV8VWdyYXZlfFlhY3V0ZXxhYWN1dGV8YWdyYXZlfGF0aWxkZXxicnZiYXJ8Y2NlZGlsfGN1cnJlbnxkaXZpZGV8ZWFjdXRlfGVncmF2ZXxmcmFjMTJ8ZnJhYzE0fGZyYWMzNHxpYWN1dGV8aWdyYXZlfGlxdWVzdHxtaWRkb3R8bnRpbGRlfG9hY3V0ZXxvZ3JhdmV8b3NsYXNofG90aWxkZXxwbHVzbW58dWFjdXRlfHVncmF2ZXx5YWN1dGV8QUVsaWd8QWNpcmN8QXJpbmd8RWNpcmN8SWNpcmN8T2NpcmN8VEhPUk58VWNpcmN8YWNpcmN8YWN1dGV8YWVsaWd8YXJpbmd8Y2VkaWx8ZWNpcmN8aWNpcmN8aWV4Y2x8bGFxdW98bWljcm98b2NpcmN8cG91bmR8cmFxdW98c3psaWd8dGhvcm58dGltZXN8dWNpcmN8QXVtbHxDT1BZfEV1bWx8SXVtbHxPdW1sfFFVT1R8VXVtbHxhdW1sfGNlbnR8Y29weXxldW1sfGl1bWx8bWFjcnxuYnNwfG9yZGZ8b3JkbXxvdW1sfHBhcmF8cXVvdHxzZWN0fHN1cDF8c3VwMnxzdXAzfHV1bWx8eXVtbHxBTVB8RVRIfFJFR3xhbXB8ZGVnfGV0aHxub3R8cmVnfHNoeXx1bWx8eWVufEdUfExUfGd0fGx0KSg/ITspKFs9YS16QS1aMC05XT8pfCYjKFswLTldKykoOz8pfCYjW3hYXShbYS1mQS1GMC05XSspKDs/KXwmKFswLTlhLXpBLVpdKykvZztcblx0dmFyIGRlY29kZU1hcCA9IHsnYWFjdXRlJzonXFx4RTEnLCdBYWN1dGUnOidcXHhDMScsJ2FicmV2ZSc6J1xcdTAxMDMnLCdBYnJldmUnOidcXHUwMTAyJywnYWMnOidcXHUyMjNFJywnYWNkJzonXFx1MjIzRicsJ2FjRSc6J1xcdTIyM0VcXHUwMzMzJywnYWNpcmMnOidcXHhFMicsJ0FjaXJjJzonXFx4QzInLCdhY3V0ZSc6J1xceEI0JywnYWN5JzonXFx1MDQzMCcsJ0FjeSc6J1xcdTA0MTAnLCdhZWxpZyc6J1xceEU2JywnQUVsaWcnOidcXHhDNicsJ2FmJzonXFx1MjA2MScsJ2Fmcic6J1xcdUQ4MzVcXHVERDFFJywnQWZyJzonXFx1RDgzNVxcdUREMDQnLCdhZ3JhdmUnOidcXHhFMCcsJ0FncmF2ZSc6J1xceEMwJywnYWxlZnN5bSc6J1xcdTIxMzUnLCdhbGVwaCc6J1xcdTIxMzUnLCdhbHBoYSc6J1xcdTAzQjEnLCdBbHBoYSc6J1xcdTAzOTEnLCdhbWFjcic6J1xcdTAxMDEnLCdBbWFjcic6J1xcdTAxMDAnLCdhbWFsZyc6J1xcdTJBM0YnLCdhbXAnOicmJywnQU1QJzonJicsJ2FuZCc6J1xcdTIyMjcnLCdBbmQnOidcXHUyQTUzJywnYW5kYW5kJzonXFx1MkE1NScsJ2FuZGQnOidcXHUyQTVDJywnYW5kc2xvcGUnOidcXHUyQTU4JywnYW5kdic6J1xcdTJBNUEnLCdhbmcnOidcXHUyMjIwJywnYW5nZSc6J1xcdTI5QTQnLCdhbmdsZSc6J1xcdTIyMjAnLCdhbmdtc2QnOidcXHUyMjIxJywnYW5nbXNkYWEnOidcXHUyOUE4JywnYW5nbXNkYWInOidcXHUyOUE5JywnYW5nbXNkYWMnOidcXHUyOUFBJywnYW5nbXNkYWQnOidcXHUyOUFCJywnYW5nbXNkYWUnOidcXHUyOUFDJywnYW5nbXNkYWYnOidcXHUyOUFEJywnYW5nbXNkYWcnOidcXHUyOUFFJywnYW5nbXNkYWgnOidcXHUyOUFGJywnYW5ncnQnOidcXHUyMjFGJywnYW5ncnR2Yic6J1xcdTIyQkUnLCdhbmdydHZiZCc6J1xcdTI5OUQnLCdhbmdzcGgnOidcXHUyMjIyJywnYW5nc3QnOidcXHhDNScsJ2FuZ3phcnInOidcXHUyMzdDJywnYW9nb24nOidcXHUwMTA1JywnQW9nb24nOidcXHUwMTA0JywnYW9wZic6J1xcdUQ4MzVcXHVERDUyJywnQW9wZic6J1xcdUQ4MzVcXHVERDM4JywnYXAnOidcXHUyMjQ4JywnYXBhY2lyJzonXFx1MkE2RicsJ2FwZSc6J1xcdTIyNEEnLCdhcEUnOidcXHUyQTcwJywnYXBpZCc6J1xcdTIyNEInLCdhcG9zJzonXFwnJywnQXBwbHlGdW5jdGlvbic6J1xcdTIwNjEnLCdhcHByb3gnOidcXHUyMjQ4JywnYXBwcm94ZXEnOidcXHUyMjRBJywnYXJpbmcnOidcXHhFNScsJ0FyaW5nJzonXFx4QzUnLCdhc2NyJzonXFx1RDgzNVxcdURDQjYnLCdBc2NyJzonXFx1RDgzNVxcdURDOUMnLCdBc3NpZ24nOidcXHUyMjU0JywnYXN0JzonKicsJ2FzeW1wJzonXFx1MjI0OCcsJ2FzeW1wZXEnOidcXHUyMjREJywnYXRpbGRlJzonXFx4RTMnLCdBdGlsZGUnOidcXHhDMycsJ2F1bWwnOidcXHhFNCcsJ0F1bWwnOidcXHhDNCcsJ2F3Y29uaW50JzonXFx1MjIzMycsJ2F3aW50JzonXFx1MkExMScsJ2JhY2tjb25nJzonXFx1MjI0QycsJ2JhY2tlcHNpbG9uJzonXFx1MDNGNicsJ2JhY2twcmltZSc6J1xcdTIwMzUnLCdiYWNrc2ltJzonXFx1MjIzRCcsJ2JhY2tzaW1lcSc6J1xcdTIyQ0QnLCdCYWNrc2xhc2gnOidcXHUyMjE2JywnQmFydic6J1xcdTJBRTcnLCdiYXJ2ZWUnOidcXHUyMkJEJywnYmFyd2VkJzonXFx1MjMwNScsJ0JhcndlZCc6J1xcdTIzMDYnLCdiYXJ3ZWRnZSc6J1xcdTIzMDUnLCdiYnJrJzonXFx1MjNCNScsJ2Jicmt0YnJrJzonXFx1MjNCNicsJ2Jjb25nJzonXFx1MjI0QycsJ2JjeSc6J1xcdTA0MzEnLCdCY3knOidcXHUwNDExJywnYmRxdW8nOidcXHUyMDFFJywnYmVjYXVzJzonXFx1MjIzNScsJ2JlY2F1c2UnOidcXHUyMjM1JywnQmVjYXVzZSc6J1xcdTIyMzUnLCdiZW1wdHl2JzonXFx1MjlCMCcsJ2JlcHNpJzonXFx1MDNGNicsJ2Jlcm5vdSc6J1xcdTIxMkMnLCdCZXJub3VsbGlzJzonXFx1MjEyQycsJ2JldGEnOidcXHUwM0IyJywnQmV0YSc6J1xcdTAzOTInLCdiZXRoJzonXFx1MjEzNicsJ2JldHdlZW4nOidcXHUyMjZDJywnYmZyJzonXFx1RDgzNVxcdUREMUYnLCdCZnInOidcXHVEODM1XFx1REQwNScsJ2JpZ2NhcCc6J1xcdTIyQzInLCdiaWdjaXJjJzonXFx1MjVFRicsJ2JpZ2N1cCc6J1xcdTIyQzMnLCdiaWdvZG90JzonXFx1MkEwMCcsJ2JpZ29wbHVzJzonXFx1MkEwMScsJ2JpZ290aW1lcyc6J1xcdTJBMDInLCdiaWdzcWN1cCc6J1xcdTJBMDYnLCdiaWdzdGFyJzonXFx1MjYwNScsJ2JpZ3RyaWFuZ2xlZG93bic6J1xcdTI1QkQnLCdiaWd0cmlhbmdsZXVwJzonXFx1MjVCMycsJ2JpZ3VwbHVzJzonXFx1MkEwNCcsJ2JpZ3ZlZSc6J1xcdTIyQzEnLCdiaWd3ZWRnZSc6J1xcdTIyQzAnLCdia2Fyb3cnOidcXHUyOTBEJywnYmxhY2tsb3plbmdlJzonXFx1MjlFQicsJ2JsYWNrc3F1YXJlJzonXFx1MjVBQScsJ2JsYWNrdHJpYW5nbGUnOidcXHUyNUI0JywnYmxhY2t0cmlhbmdsZWRvd24nOidcXHUyNUJFJywnYmxhY2t0cmlhbmdsZWxlZnQnOidcXHUyNUMyJywnYmxhY2t0cmlhbmdsZXJpZ2h0JzonXFx1MjVCOCcsJ2JsYW5rJzonXFx1MjQyMycsJ2JsazEyJzonXFx1MjU5MicsJ2JsazE0JzonXFx1MjU5MScsJ2JsazM0JzonXFx1MjU5MycsJ2Jsb2NrJzonXFx1MjU4OCcsJ2JuZSc6Jz1cXHUyMEU1JywnYm5lcXVpdic6J1xcdTIyNjFcXHUyMEU1JywnYm5vdCc6J1xcdTIzMTAnLCdiTm90JzonXFx1MkFFRCcsJ2JvcGYnOidcXHVEODM1XFx1REQ1MycsJ0JvcGYnOidcXHVEODM1XFx1REQzOScsJ2JvdCc6J1xcdTIyQTUnLCdib3R0b20nOidcXHUyMkE1JywnYm93dGllJzonXFx1MjJDOCcsJ2JveGJveCc6J1xcdTI5QzknLCdib3hkbCc6J1xcdTI1MTAnLCdib3hkTCc6J1xcdTI1NTUnLCdib3hEbCc6J1xcdTI1NTYnLCdib3hETCc6J1xcdTI1NTcnLCdib3hkcic6J1xcdTI1MEMnLCdib3hkUic6J1xcdTI1NTInLCdib3hEcic6J1xcdTI1NTMnLCdib3hEUic6J1xcdTI1NTQnLCdib3hoJzonXFx1MjUwMCcsJ2JveEgnOidcXHUyNTUwJywnYm94aGQnOidcXHUyNTJDJywnYm94aEQnOidcXHUyNTY1JywnYm94SGQnOidcXHUyNTY0JywnYm94SEQnOidcXHUyNTY2JywnYm94aHUnOidcXHUyNTM0JywnYm94aFUnOidcXHUyNTY4JywnYm94SHUnOidcXHUyNTY3JywnYm94SFUnOidcXHUyNTY5JywnYm94bWludXMnOidcXHUyMjlGJywnYm94cGx1cyc6J1xcdTIyOUUnLCdib3h0aW1lcyc6J1xcdTIyQTAnLCdib3h1bCc6J1xcdTI1MTgnLCdib3h1TCc6J1xcdTI1NUInLCdib3hVbCc6J1xcdTI1NUMnLCdib3hVTCc6J1xcdTI1NUQnLCdib3h1cic6J1xcdTI1MTQnLCdib3h1Uic6J1xcdTI1NTgnLCdib3hVcic6J1xcdTI1NTknLCdib3hVUic6J1xcdTI1NUEnLCdib3h2JzonXFx1MjUwMicsJ2JveFYnOidcXHUyNTUxJywnYm94dmgnOidcXHUyNTNDJywnYm94dkgnOidcXHUyNTZBJywnYm94VmgnOidcXHUyNTZCJywnYm94VkgnOidcXHUyNTZDJywnYm94dmwnOidcXHUyNTI0JywnYm94dkwnOidcXHUyNTYxJywnYm94VmwnOidcXHUyNTYyJywnYm94VkwnOidcXHUyNTYzJywnYm94dnInOidcXHUyNTFDJywnYm94dlInOidcXHUyNTVFJywnYm94VnInOidcXHUyNTVGJywnYm94VlInOidcXHUyNTYwJywnYnByaW1lJzonXFx1MjAzNScsJ2JyZXZlJzonXFx1MDJEOCcsJ0JyZXZlJzonXFx1MDJEOCcsJ2JydmJhcic6J1xceEE2JywnYnNjcic6J1xcdUQ4MzVcXHVEQ0I3JywnQnNjcic6J1xcdTIxMkMnLCdic2VtaSc6J1xcdTIwNEYnLCdic2ltJzonXFx1MjIzRCcsJ2JzaW1lJzonXFx1MjJDRCcsJ2Jzb2wnOidcXFxcJywnYnNvbGInOidcXHUyOUM1JywnYnNvbGhzdWInOidcXHUyN0M4JywnYnVsbCc6J1xcdTIwMjInLCdidWxsZXQnOidcXHUyMDIyJywnYnVtcCc6J1xcdTIyNEUnLCdidW1wZSc6J1xcdTIyNEYnLCdidW1wRSc6J1xcdTJBQUUnLCdidW1wZXEnOidcXHUyMjRGJywnQnVtcGVxJzonXFx1MjI0RScsJ2NhY3V0ZSc6J1xcdTAxMDcnLCdDYWN1dGUnOidcXHUwMTA2JywnY2FwJzonXFx1MjIyOScsJ0NhcCc6J1xcdTIyRDInLCdjYXBhbmQnOidcXHUyQTQ0JywnY2FwYnJjdXAnOidcXHUyQTQ5JywnY2FwY2FwJzonXFx1MkE0QicsJ2NhcGN1cCc6J1xcdTJBNDcnLCdjYXBkb3QnOidcXHUyQTQwJywnQ2FwaXRhbERpZmZlcmVudGlhbEQnOidcXHUyMTQ1JywnY2Fwcyc6J1xcdTIyMjlcXHVGRTAwJywnY2FyZXQnOidcXHUyMDQxJywnY2Fyb24nOidcXHUwMkM3JywnQ2F5bGV5cyc6J1xcdTIxMkQnLCdjY2Fwcyc6J1xcdTJBNEQnLCdjY2Fyb24nOidcXHUwMTBEJywnQ2Nhcm9uJzonXFx1MDEwQycsJ2NjZWRpbCc6J1xceEU3JywnQ2NlZGlsJzonXFx4QzcnLCdjY2lyYyc6J1xcdTAxMDknLCdDY2lyYyc6J1xcdTAxMDgnLCdDY29uaW50JzonXFx1MjIzMCcsJ2NjdXBzJzonXFx1MkE0QycsJ2NjdXBzc20nOidcXHUyQTUwJywnY2RvdCc6J1xcdTAxMEInLCdDZG90JzonXFx1MDEwQScsJ2NlZGlsJzonXFx4QjgnLCdDZWRpbGxhJzonXFx4QjgnLCdjZW1wdHl2JzonXFx1MjlCMicsJ2NlbnQnOidcXHhBMicsJ2NlbnRlcmRvdCc6J1xceEI3JywnQ2VudGVyRG90JzonXFx4QjcnLCdjZnInOidcXHVEODM1XFx1REQyMCcsJ0Nmcic6J1xcdTIxMkQnLCdjaGN5JzonXFx1MDQ0NycsJ0NIY3knOidcXHUwNDI3JywnY2hlY2snOidcXHUyNzEzJywnY2hlY2ttYXJrJzonXFx1MjcxMycsJ2NoaSc6J1xcdTAzQzcnLCdDaGknOidcXHUwM0E3JywnY2lyJzonXFx1MjVDQicsJ2NpcmMnOidcXHUwMkM2JywnY2lyY2VxJzonXFx1MjI1NycsJ2NpcmNsZWFycm93bGVmdCc6J1xcdTIxQkEnLCdjaXJjbGVhcnJvd3JpZ2h0JzonXFx1MjFCQicsJ2NpcmNsZWRhc3QnOidcXHUyMjlCJywnY2lyY2xlZGNpcmMnOidcXHUyMjlBJywnY2lyY2xlZGRhc2gnOidcXHUyMjlEJywnQ2lyY2xlRG90JzonXFx1MjI5OScsJ2NpcmNsZWRSJzonXFx4QUUnLCdjaXJjbGVkUyc6J1xcdTI0QzgnLCdDaXJjbGVNaW51cyc6J1xcdTIyOTYnLCdDaXJjbGVQbHVzJzonXFx1MjI5NScsJ0NpcmNsZVRpbWVzJzonXFx1MjI5NycsJ2NpcmUnOidcXHUyMjU3JywnY2lyRSc6J1xcdTI5QzMnLCdjaXJmbmludCc6J1xcdTJBMTAnLCdjaXJtaWQnOidcXHUyQUVGJywnY2lyc2Npcic6J1xcdTI5QzInLCdDbG9ja3dpc2VDb250b3VySW50ZWdyYWwnOidcXHUyMjMyJywnQ2xvc2VDdXJseURvdWJsZVF1b3RlJzonXFx1MjAxRCcsJ0Nsb3NlQ3VybHlRdW90ZSc6J1xcdTIwMTknLCdjbHVicyc6J1xcdTI2NjMnLCdjbHVic3VpdCc6J1xcdTI2NjMnLCdjb2xvbic6JzonLCdDb2xvbic6J1xcdTIyMzcnLCdjb2xvbmUnOidcXHUyMjU0JywnQ29sb25lJzonXFx1MkE3NCcsJ2NvbG9uZXEnOidcXHUyMjU0JywnY29tbWEnOicsJywnY29tbWF0JzonQCcsJ2NvbXAnOidcXHUyMjAxJywnY29tcGZuJzonXFx1MjIxOCcsJ2NvbXBsZW1lbnQnOidcXHUyMjAxJywnY29tcGxleGVzJzonXFx1MjEwMicsJ2NvbmcnOidcXHUyMjQ1JywnY29uZ2RvdCc6J1xcdTJBNkQnLCdDb25ncnVlbnQnOidcXHUyMjYxJywnY29uaW50JzonXFx1MjIyRScsJ0NvbmludCc6J1xcdTIyMkYnLCdDb250b3VySW50ZWdyYWwnOidcXHUyMjJFJywnY29wZic6J1xcdUQ4MzVcXHVERDU0JywnQ29wZic6J1xcdTIxMDInLCdjb3Byb2QnOidcXHUyMjEwJywnQ29wcm9kdWN0JzonXFx1MjIxMCcsJ2NvcHknOidcXHhBOScsJ0NPUFknOidcXHhBOScsJ2NvcHlzcic6J1xcdTIxMTcnLCdDb3VudGVyQ2xvY2t3aXNlQ29udG91ckludGVncmFsJzonXFx1MjIzMycsJ2NyYXJyJzonXFx1MjFCNScsJ2Nyb3NzJzonXFx1MjcxNycsJ0Nyb3NzJzonXFx1MkEyRicsJ2NzY3InOidcXHVEODM1XFx1RENCOCcsJ0NzY3InOidcXHVEODM1XFx1REM5RScsJ2NzdWInOidcXHUyQUNGJywnY3N1YmUnOidcXHUyQUQxJywnY3N1cCc6J1xcdTJBRDAnLCdjc3VwZSc6J1xcdTJBRDInLCdjdGRvdCc6J1xcdTIyRUYnLCdjdWRhcnJsJzonXFx1MjkzOCcsJ2N1ZGFycnInOidcXHUyOTM1JywnY3VlcHInOidcXHUyMkRFJywnY3Vlc2MnOidcXHUyMkRGJywnY3VsYXJyJzonXFx1MjFCNicsJ2N1bGFycnAnOidcXHUyOTNEJywnY3VwJzonXFx1MjIyQScsJ0N1cCc6J1xcdTIyRDMnLCdjdXBicmNhcCc6J1xcdTJBNDgnLCdjdXBjYXAnOidcXHUyQTQ2JywnQ3VwQ2FwJzonXFx1MjI0RCcsJ2N1cGN1cCc6J1xcdTJBNEEnLCdjdXBkb3QnOidcXHUyMjhEJywnY3Vwb3InOidcXHUyQTQ1JywnY3Vwcyc6J1xcdTIyMkFcXHVGRTAwJywnY3VyYXJyJzonXFx1MjFCNycsJ2N1cmFycm0nOidcXHUyOTNDJywnY3VybHllcXByZWMnOidcXHUyMkRFJywnY3VybHllcXN1Y2MnOidcXHUyMkRGJywnY3VybHl2ZWUnOidcXHUyMkNFJywnY3VybHl3ZWRnZSc6J1xcdTIyQ0YnLCdjdXJyZW4nOidcXHhBNCcsJ2N1cnZlYXJyb3dsZWZ0JzonXFx1MjFCNicsJ2N1cnZlYXJyb3dyaWdodCc6J1xcdTIxQjcnLCdjdXZlZSc6J1xcdTIyQ0UnLCdjdXdlZCc6J1xcdTIyQ0YnLCdjd2NvbmludCc6J1xcdTIyMzInLCdjd2ludCc6J1xcdTIyMzEnLCdjeWxjdHknOidcXHUyMzJEJywnZGFnZ2VyJzonXFx1MjAyMCcsJ0RhZ2dlcic6J1xcdTIwMjEnLCdkYWxldGgnOidcXHUyMTM4JywnZGFycic6J1xcdTIxOTMnLCdkQXJyJzonXFx1MjFEMycsJ0RhcnInOidcXHUyMUExJywnZGFzaCc6J1xcdTIwMTAnLCdkYXNodic6J1xcdTIyQTMnLCdEYXNodic6J1xcdTJBRTQnLCdkYmthcm93JzonXFx1MjkwRicsJ2RibGFjJzonXFx1MDJERCcsJ2RjYXJvbic6J1xcdTAxMEYnLCdEY2Fyb24nOidcXHUwMTBFJywnZGN5JzonXFx1MDQzNCcsJ0RjeSc6J1xcdTA0MTQnLCdkZCc6J1xcdTIxNDYnLCdERCc6J1xcdTIxNDUnLCdkZGFnZ2VyJzonXFx1MjAyMScsJ2RkYXJyJzonXFx1MjFDQScsJ0REb3RyYWhkJzonXFx1MjkxMScsJ2Rkb3RzZXEnOidcXHUyQTc3JywnZGVnJzonXFx4QjAnLCdEZWwnOidcXHUyMjA3JywnZGVsdGEnOidcXHUwM0I0JywnRGVsdGEnOidcXHUwMzk0JywnZGVtcHR5dic6J1xcdTI5QjEnLCdkZmlzaHQnOidcXHUyOTdGJywnZGZyJzonXFx1RDgzNVxcdUREMjEnLCdEZnInOidcXHVEODM1XFx1REQwNycsJ2RIYXInOidcXHUyOTY1JywnZGhhcmwnOidcXHUyMUMzJywnZGhhcnInOidcXHUyMUMyJywnRGlhY3JpdGljYWxBY3V0ZSc6J1xceEI0JywnRGlhY3JpdGljYWxEb3QnOidcXHUwMkQ5JywnRGlhY3JpdGljYWxEb3VibGVBY3V0ZSc6J1xcdTAyREQnLCdEaWFjcml0aWNhbEdyYXZlJzonYCcsJ0RpYWNyaXRpY2FsVGlsZGUnOidcXHUwMkRDJywnZGlhbSc6J1xcdTIyQzQnLCdkaWFtb25kJzonXFx1MjJDNCcsJ0RpYW1vbmQnOidcXHUyMkM0JywnZGlhbW9uZHN1aXQnOidcXHUyNjY2JywnZGlhbXMnOidcXHUyNjY2JywnZGllJzonXFx4QTgnLCdEaWZmZXJlbnRpYWxEJzonXFx1MjE0NicsJ2RpZ2FtbWEnOidcXHUwM0REJywnZGlzaW4nOidcXHUyMkYyJywnZGl2JzonXFx4RjcnLCdkaXZpZGUnOidcXHhGNycsJ2RpdmlkZW9udGltZXMnOidcXHUyMkM3JywnZGl2b254JzonXFx1MjJDNycsJ2RqY3knOidcXHUwNDUyJywnREpjeSc6J1xcdTA0MDInLCdkbGNvcm4nOidcXHUyMzFFJywnZGxjcm9wJzonXFx1MjMwRCcsJ2RvbGxhcic6JyQnLCdkb3BmJzonXFx1RDgzNVxcdURENTUnLCdEb3BmJzonXFx1RDgzNVxcdUREM0InLCdkb3QnOidcXHUwMkQ5JywnRG90JzonXFx4QTgnLCdEb3REb3QnOidcXHUyMERDJywnZG90ZXEnOidcXHUyMjUwJywnZG90ZXFkb3QnOidcXHUyMjUxJywnRG90RXF1YWwnOidcXHUyMjUwJywnZG90bWludXMnOidcXHUyMjM4JywnZG90cGx1cyc6J1xcdTIyMTQnLCdkb3RzcXVhcmUnOidcXHUyMkExJywnZG91YmxlYmFyd2VkZ2UnOidcXHUyMzA2JywnRG91YmxlQ29udG91ckludGVncmFsJzonXFx1MjIyRicsJ0RvdWJsZURvdCc6J1xceEE4JywnRG91YmxlRG93bkFycm93JzonXFx1MjFEMycsJ0RvdWJsZUxlZnRBcnJvdyc6J1xcdTIxRDAnLCdEb3VibGVMZWZ0UmlnaHRBcnJvdyc6J1xcdTIxRDQnLCdEb3VibGVMZWZ0VGVlJzonXFx1MkFFNCcsJ0RvdWJsZUxvbmdMZWZ0QXJyb3cnOidcXHUyN0Y4JywnRG91YmxlTG9uZ0xlZnRSaWdodEFycm93JzonXFx1MjdGQScsJ0RvdWJsZUxvbmdSaWdodEFycm93JzonXFx1MjdGOScsJ0RvdWJsZVJpZ2h0QXJyb3cnOidcXHUyMUQyJywnRG91YmxlUmlnaHRUZWUnOidcXHUyMkE4JywnRG91YmxlVXBBcnJvdyc6J1xcdTIxRDEnLCdEb3VibGVVcERvd25BcnJvdyc6J1xcdTIxRDUnLCdEb3VibGVWZXJ0aWNhbEJhcic6J1xcdTIyMjUnLCdkb3duYXJyb3cnOidcXHUyMTkzJywnRG93bmFycm93JzonXFx1MjFEMycsJ0Rvd25BcnJvdyc6J1xcdTIxOTMnLCdEb3duQXJyb3dCYXInOidcXHUyOTEzJywnRG93bkFycm93VXBBcnJvdyc6J1xcdTIxRjUnLCdEb3duQnJldmUnOidcXHUwMzExJywnZG93bmRvd25hcnJvd3MnOidcXHUyMUNBJywnZG93bmhhcnBvb25sZWZ0JzonXFx1MjFDMycsJ2Rvd25oYXJwb29ucmlnaHQnOidcXHUyMUMyJywnRG93bkxlZnRSaWdodFZlY3Rvcic6J1xcdTI5NTAnLCdEb3duTGVmdFRlZVZlY3Rvcic6J1xcdTI5NUUnLCdEb3duTGVmdFZlY3Rvcic6J1xcdTIxQkQnLCdEb3duTGVmdFZlY3RvckJhcic6J1xcdTI5NTYnLCdEb3duUmlnaHRUZWVWZWN0b3InOidcXHUyOTVGJywnRG93blJpZ2h0VmVjdG9yJzonXFx1MjFDMScsJ0Rvd25SaWdodFZlY3RvckJhcic6J1xcdTI5NTcnLCdEb3duVGVlJzonXFx1MjJBNCcsJ0Rvd25UZWVBcnJvdyc6J1xcdTIxQTcnLCdkcmJrYXJvdyc6J1xcdTI5MTAnLCdkcmNvcm4nOidcXHUyMzFGJywnZHJjcm9wJzonXFx1MjMwQycsJ2RzY3InOidcXHVEODM1XFx1RENCOScsJ0RzY3InOidcXHVEODM1XFx1REM5RicsJ2RzY3knOidcXHUwNDU1JywnRFNjeSc6J1xcdTA0MDUnLCdkc29sJzonXFx1MjlGNicsJ2RzdHJvayc6J1xcdTAxMTEnLCdEc3Ryb2snOidcXHUwMTEwJywnZHRkb3QnOidcXHUyMkYxJywnZHRyaSc6J1xcdTI1QkYnLCdkdHJpZic6J1xcdTI1QkUnLCdkdWFycic6J1xcdTIxRjUnLCdkdWhhcic6J1xcdTI5NkYnLCdkd2FuZ2xlJzonXFx1MjlBNicsJ2R6Y3knOidcXHUwNDVGJywnRFpjeSc6J1xcdTA0MEYnLCdkemlncmFycic6J1xcdTI3RkYnLCdlYWN1dGUnOidcXHhFOScsJ0VhY3V0ZSc6J1xceEM5JywnZWFzdGVyJzonXFx1MkE2RScsJ2VjYXJvbic6J1xcdTAxMUInLCdFY2Fyb24nOidcXHUwMTFBJywnZWNpcic6J1xcdTIyNTYnLCdlY2lyYyc6J1xceEVBJywnRWNpcmMnOidcXHhDQScsJ2Vjb2xvbic6J1xcdTIyNTUnLCdlY3knOidcXHUwNDREJywnRWN5JzonXFx1MDQyRCcsJ2VERG90JzonXFx1MkE3NycsJ2Vkb3QnOidcXHUwMTE3JywnZURvdCc6J1xcdTIyNTEnLCdFZG90JzonXFx1MDExNicsJ2VlJzonXFx1MjE0NycsJ2VmRG90JzonXFx1MjI1MicsJ2Vmcic6J1xcdUQ4MzVcXHVERDIyJywnRWZyJzonXFx1RDgzNVxcdUREMDgnLCdlZyc6J1xcdTJBOUEnLCdlZ3JhdmUnOidcXHhFOCcsJ0VncmF2ZSc6J1xceEM4JywnZWdzJzonXFx1MkE5NicsJ2Vnc2RvdCc6J1xcdTJBOTgnLCdlbCc6J1xcdTJBOTknLCdFbGVtZW50JzonXFx1MjIwOCcsJ2VsaW50ZXJzJzonXFx1MjNFNycsJ2VsbCc6J1xcdTIxMTMnLCdlbHMnOidcXHUyQTk1JywnZWxzZG90JzonXFx1MkE5NycsJ2VtYWNyJzonXFx1MDExMycsJ0VtYWNyJzonXFx1MDExMicsJ2VtcHR5JzonXFx1MjIwNScsJ2VtcHR5c2V0JzonXFx1MjIwNScsJ0VtcHR5U21hbGxTcXVhcmUnOidcXHUyNUZCJywnZW1wdHl2JzonXFx1MjIwNScsJ0VtcHR5VmVyeVNtYWxsU3F1YXJlJzonXFx1MjVBQicsJ2Vtc3AnOidcXHUyMDAzJywnZW1zcDEzJzonXFx1MjAwNCcsJ2Vtc3AxNCc6J1xcdTIwMDUnLCdlbmcnOidcXHUwMTRCJywnRU5HJzonXFx1MDE0QScsJ2Vuc3AnOidcXHUyMDAyJywnZW9nb24nOidcXHUwMTE5JywnRW9nb24nOidcXHUwMTE4JywnZW9wZic6J1xcdUQ4MzVcXHVERDU2JywnRW9wZic6J1xcdUQ4MzVcXHVERDNDJywnZXBhcic6J1xcdTIyRDUnLCdlcGFyc2wnOidcXHUyOUUzJywnZXBsdXMnOidcXHUyQTcxJywnZXBzaSc6J1xcdTAzQjUnLCdlcHNpbG9uJzonXFx1MDNCNScsJ0Vwc2lsb24nOidcXHUwMzk1JywnZXBzaXYnOidcXHUwM0Y1JywnZXFjaXJjJzonXFx1MjI1NicsJ2VxY29sb24nOidcXHUyMjU1JywnZXFzaW0nOidcXHUyMjQyJywnZXFzbGFudGd0cic6J1xcdTJBOTYnLCdlcXNsYW50bGVzcyc6J1xcdTJBOTUnLCdFcXVhbCc6J1xcdTJBNzUnLCdlcXVhbHMnOic9JywnRXF1YWxUaWxkZSc6J1xcdTIyNDInLCdlcXVlc3QnOidcXHUyMjVGJywnRXF1aWxpYnJpdW0nOidcXHUyMUNDJywnZXF1aXYnOidcXHUyMjYxJywnZXF1aXZERCc6J1xcdTJBNzgnLCdlcXZwYXJzbCc6J1xcdTI5RTUnLCdlcmFycic6J1xcdTI5NzEnLCdlckRvdCc6J1xcdTIyNTMnLCdlc2NyJzonXFx1MjEyRicsJ0VzY3InOidcXHUyMTMwJywnZXNkb3QnOidcXHUyMjUwJywnZXNpbSc6J1xcdTIyNDInLCdFc2ltJzonXFx1MkE3MycsJ2V0YSc6J1xcdTAzQjcnLCdFdGEnOidcXHUwMzk3JywnZXRoJzonXFx4RjAnLCdFVEgnOidcXHhEMCcsJ2V1bWwnOidcXHhFQicsJ0V1bWwnOidcXHhDQicsJ2V1cm8nOidcXHUyMEFDJywnZXhjbCc6JyEnLCdleGlzdCc6J1xcdTIyMDMnLCdFeGlzdHMnOidcXHUyMjAzJywnZXhwZWN0YXRpb24nOidcXHUyMTMwJywnZXhwb25lbnRpYWxlJzonXFx1MjE0NycsJ0V4cG9uZW50aWFsRSc6J1xcdTIxNDcnLCdmYWxsaW5nZG90c2VxJzonXFx1MjI1MicsJ2ZjeSc6J1xcdTA0NDQnLCdGY3knOidcXHUwNDI0JywnZmVtYWxlJzonXFx1MjY0MCcsJ2ZmaWxpZyc6J1xcdUZCMDMnLCdmZmxpZyc6J1xcdUZCMDAnLCdmZmxsaWcnOidcXHVGQjA0JywnZmZyJzonXFx1RDgzNVxcdUREMjMnLCdGZnInOidcXHVEODM1XFx1REQwOScsJ2ZpbGlnJzonXFx1RkIwMScsJ0ZpbGxlZFNtYWxsU3F1YXJlJzonXFx1MjVGQycsJ0ZpbGxlZFZlcnlTbWFsbFNxdWFyZSc6J1xcdTI1QUEnLCdmamxpZyc6J2ZqJywnZmxhdCc6J1xcdTI2NkQnLCdmbGxpZyc6J1xcdUZCMDInLCdmbHRucyc6J1xcdTI1QjEnLCdmbm9mJzonXFx1MDE5MicsJ2ZvcGYnOidcXHVEODM1XFx1REQ1NycsJ0ZvcGYnOidcXHVEODM1XFx1REQzRCcsJ2ZvcmFsbCc6J1xcdTIyMDAnLCdGb3JBbGwnOidcXHUyMjAwJywnZm9yayc6J1xcdTIyRDQnLCdmb3Jrdic6J1xcdTJBRDknLCdGb3VyaWVydHJmJzonXFx1MjEzMScsJ2ZwYXJ0aW50JzonXFx1MkEwRCcsJ2ZyYWMxMic6J1xceEJEJywnZnJhYzEzJzonXFx1MjE1MycsJ2ZyYWMxNCc6J1xceEJDJywnZnJhYzE1JzonXFx1MjE1NScsJ2ZyYWMxNic6J1xcdTIxNTknLCdmcmFjMTgnOidcXHUyMTVCJywnZnJhYzIzJzonXFx1MjE1NCcsJ2ZyYWMyNSc6J1xcdTIxNTYnLCdmcmFjMzQnOidcXHhCRScsJ2ZyYWMzNSc6J1xcdTIxNTcnLCdmcmFjMzgnOidcXHUyMTVDJywnZnJhYzQ1JzonXFx1MjE1OCcsJ2ZyYWM1Nic6J1xcdTIxNUEnLCdmcmFjNTgnOidcXHUyMTVEJywnZnJhYzc4JzonXFx1MjE1RScsJ2ZyYXNsJzonXFx1MjA0NCcsJ2Zyb3duJzonXFx1MjMyMicsJ2ZzY3InOidcXHVEODM1XFx1RENCQicsJ0ZzY3InOidcXHUyMTMxJywnZ2FjdXRlJzonXFx1MDFGNScsJ2dhbW1hJzonXFx1MDNCMycsJ0dhbW1hJzonXFx1MDM5MycsJ2dhbW1hZCc6J1xcdTAzREQnLCdHYW1tYWQnOidcXHUwM0RDJywnZ2FwJzonXFx1MkE4NicsJ2dicmV2ZSc6J1xcdTAxMUYnLCdHYnJldmUnOidcXHUwMTFFJywnR2NlZGlsJzonXFx1MDEyMicsJ2djaXJjJzonXFx1MDExRCcsJ0djaXJjJzonXFx1MDExQycsJ2djeSc6J1xcdTA0MzMnLCdHY3knOidcXHUwNDEzJywnZ2RvdCc6J1xcdTAxMjEnLCdHZG90JzonXFx1MDEyMCcsJ2dlJzonXFx1MjI2NScsJ2dFJzonXFx1MjI2NycsJ2dlbCc6J1xcdTIyREInLCdnRWwnOidcXHUyQThDJywnZ2VxJzonXFx1MjI2NScsJ2dlcXEnOidcXHUyMjY3JywnZ2Vxc2xhbnQnOidcXHUyQTdFJywnZ2VzJzonXFx1MkE3RScsJ2dlc2NjJzonXFx1MkFBOScsJ2dlc2RvdCc6J1xcdTJBODAnLCdnZXNkb3RvJzonXFx1MkE4MicsJ2dlc2RvdG9sJzonXFx1MkE4NCcsJ2dlc2wnOidcXHUyMkRCXFx1RkUwMCcsJ2dlc2xlcyc6J1xcdTJBOTQnLCdnZnInOidcXHVEODM1XFx1REQyNCcsJ0dmcic6J1xcdUQ4MzVcXHVERDBBJywnZ2cnOidcXHUyMjZCJywnR2cnOidcXHUyMkQ5JywnZ2dnJzonXFx1MjJEOScsJ2dpbWVsJzonXFx1MjEzNycsJ2dqY3knOidcXHUwNDUzJywnR0pjeSc6J1xcdTA0MDMnLCdnbCc6J1xcdTIyNzcnLCdnbGEnOidcXHUyQUE1JywnZ2xFJzonXFx1MkE5MicsJ2dsaic6J1xcdTJBQTQnLCdnbmFwJzonXFx1MkE4QScsJ2duYXBwcm94JzonXFx1MkE4QScsJ2duZSc6J1xcdTJBODgnLCdnbkUnOidcXHUyMjY5JywnZ25lcSc6J1xcdTJBODgnLCdnbmVxcSc6J1xcdTIyNjknLCdnbnNpbSc6J1xcdTIyRTcnLCdnb3BmJzonXFx1RDgzNVxcdURENTgnLCdHb3BmJzonXFx1RDgzNVxcdUREM0UnLCdncmF2ZSc6J2AnLCdHcmVhdGVyRXF1YWwnOidcXHUyMjY1JywnR3JlYXRlckVxdWFsTGVzcyc6J1xcdTIyREInLCdHcmVhdGVyRnVsbEVxdWFsJzonXFx1MjI2NycsJ0dyZWF0ZXJHcmVhdGVyJzonXFx1MkFBMicsJ0dyZWF0ZXJMZXNzJzonXFx1MjI3NycsJ0dyZWF0ZXJTbGFudEVxdWFsJzonXFx1MkE3RScsJ0dyZWF0ZXJUaWxkZSc6J1xcdTIyNzMnLCdnc2NyJzonXFx1MjEwQScsJ0dzY3InOidcXHVEODM1XFx1RENBMicsJ2dzaW0nOidcXHUyMjczJywnZ3NpbWUnOidcXHUyQThFJywnZ3NpbWwnOidcXHUyQTkwJywnZ3QnOic+JywnR3QnOidcXHUyMjZCJywnR1QnOic+JywnZ3RjYyc6J1xcdTJBQTcnLCdndGNpcic6J1xcdTJBN0EnLCdndGRvdCc6J1xcdTIyRDcnLCdndGxQYXInOidcXHUyOTk1JywnZ3RxdWVzdCc6J1xcdTJBN0MnLCdndHJhcHByb3gnOidcXHUyQTg2JywnZ3RyYXJyJzonXFx1Mjk3OCcsJ2d0cmRvdCc6J1xcdTIyRDcnLCdndHJlcWxlc3MnOidcXHUyMkRCJywnZ3RyZXFxbGVzcyc6J1xcdTJBOEMnLCdndHJsZXNzJzonXFx1MjI3NycsJ2d0cnNpbSc6J1xcdTIyNzMnLCdndmVydG5lcXEnOidcXHUyMjY5XFx1RkUwMCcsJ2d2bkUnOidcXHUyMjY5XFx1RkUwMCcsJ0hhY2VrJzonXFx1MDJDNycsJ2hhaXJzcCc6J1xcdTIwMEEnLCdoYWxmJzonXFx4QkQnLCdoYW1pbHQnOidcXHUyMTBCJywnaGFyZGN5JzonXFx1MDQ0QScsJ0hBUkRjeSc6J1xcdTA0MkEnLCdoYXJyJzonXFx1MjE5NCcsJ2hBcnInOidcXHUyMUQ0JywnaGFycmNpcic6J1xcdTI5NDgnLCdoYXJydyc6J1xcdTIxQUQnLCdIYXQnOideJywnaGJhcic6J1xcdTIxMEYnLCdoY2lyYyc6J1xcdTAxMjUnLCdIY2lyYyc6J1xcdTAxMjQnLCdoZWFydHMnOidcXHUyNjY1JywnaGVhcnRzdWl0JzonXFx1MjY2NScsJ2hlbGxpcCc6J1xcdTIwMjYnLCdoZXJjb24nOidcXHUyMkI5JywnaGZyJzonXFx1RDgzNVxcdUREMjUnLCdIZnInOidcXHUyMTBDJywnSGlsYmVydFNwYWNlJzonXFx1MjEwQicsJ2hrc2Vhcm93JzonXFx1MjkyNScsJ2hrc3dhcm93JzonXFx1MjkyNicsJ2hvYXJyJzonXFx1MjFGRicsJ2hvbXRodCc6J1xcdTIyM0InLCdob29rbGVmdGFycm93JzonXFx1MjFBOScsJ2hvb2tyaWdodGFycm93JzonXFx1MjFBQScsJ2hvcGYnOidcXHVEODM1XFx1REQ1OScsJ0hvcGYnOidcXHUyMTBEJywnaG9yYmFyJzonXFx1MjAxNScsJ0hvcml6b250YWxMaW5lJzonXFx1MjUwMCcsJ2hzY3InOidcXHVEODM1XFx1RENCRCcsJ0hzY3InOidcXHUyMTBCJywnaHNsYXNoJzonXFx1MjEwRicsJ2hzdHJvayc6J1xcdTAxMjcnLCdIc3Ryb2snOidcXHUwMTI2JywnSHVtcERvd25IdW1wJzonXFx1MjI0RScsJ0h1bXBFcXVhbCc6J1xcdTIyNEYnLCdoeWJ1bGwnOidcXHUyMDQzJywnaHlwaGVuJzonXFx1MjAxMCcsJ2lhY3V0ZSc6J1xceEVEJywnSWFjdXRlJzonXFx4Q0QnLCdpYyc6J1xcdTIwNjMnLCdpY2lyYyc6J1xceEVFJywnSWNpcmMnOidcXHhDRScsJ2ljeSc6J1xcdTA0MzgnLCdJY3knOidcXHUwNDE4JywnSWRvdCc6J1xcdTAxMzAnLCdpZWN5JzonXFx1MDQzNScsJ0lFY3knOidcXHUwNDE1JywnaWV4Y2wnOidcXHhBMScsJ2lmZic6J1xcdTIxRDQnLCdpZnInOidcXHVEODM1XFx1REQyNicsJ0lmcic6J1xcdTIxMTEnLCdpZ3JhdmUnOidcXHhFQycsJ0lncmF2ZSc6J1xceENDJywnaWknOidcXHUyMTQ4JywnaWlpaW50JzonXFx1MkEwQycsJ2lpaW50JzonXFx1MjIyRCcsJ2lpbmZpbic6J1xcdTI5REMnLCdpaW90YSc6J1xcdTIxMjknLCdpamxpZyc6J1xcdTAxMzMnLCdJSmxpZyc6J1xcdTAxMzInLCdJbSc6J1xcdTIxMTEnLCdpbWFjcic6J1xcdTAxMkInLCdJbWFjcic6J1xcdTAxMkEnLCdpbWFnZSc6J1xcdTIxMTEnLCdJbWFnaW5hcnlJJzonXFx1MjE0OCcsJ2ltYWdsaW5lJzonXFx1MjExMCcsJ2ltYWdwYXJ0JzonXFx1MjExMScsJ2ltYXRoJzonXFx1MDEzMScsJ2ltb2YnOidcXHUyMkI3JywnaW1wZWQnOidcXHUwMUI1JywnSW1wbGllcyc6J1xcdTIxRDInLCdpbic6J1xcdTIyMDgnLCdpbmNhcmUnOidcXHUyMTA1JywnaW5maW4nOidcXHUyMjFFJywnaW5maW50aWUnOidcXHUyOUREJywnaW5vZG90JzonXFx1MDEzMScsJ2ludCc6J1xcdTIyMkInLCdJbnQnOidcXHUyMjJDJywnaW50Y2FsJzonXFx1MjJCQScsJ2ludGVnZXJzJzonXFx1MjEyNCcsJ0ludGVncmFsJzonXFx1MjIyQicsJ2ludGVyY2FsJzonXFx1MjJCQScsJ0ludGVyc2VjdGlvbic6J1xcdTIyQzInLCdpbnRsYXJoayc6J1xcdTJBMTcnLCdpbnRwcm9kJzonXFx1MkEzQycsJ0ludmlzaWJsZUNvbW1hJzonXFx1MjA2MycsJ0ludmlzaWJsZVRpbWVzJzonXFx1MjA2MicsJ2lvY3knOidcXHUwNDUxJywnSU9jeSc6J1xcdTA0MDEnLCdpb2dvbic6J1xcdTAxMkYnLCdJb2dvbic6J1xcdTAxMkUnLCdpb3BmJzonXFx1RDgzNVxcdURENUEnLCdJb3BmJzonXFx1RDgzNVxcdURENDAnLCdpb3RhJzonXFx1MDNCOScsJ0lvdGEnOidcXHUwMzk5JywnaXByb2QnOidcXHUyQTNDJywnaXF1ZXN0JzonXFx4QkYnLCdpc2NyJzonXFx1RDgzNVxcdURDQkUnLCdJc2NyJzonXFx1MjExMCcsJ2lzaW4nOidcXHUyMjA4JywnaXNpbmRvdCc6J1xcdTIyRjUnLCdpc2luRSc6J1xcdTIyRjknLCdpc2lucyc6J1xcdTIyRjQnLCdpc2luc3YnOidcXHUyMkYzJywnaXNpbnYnOidcXHUyMjA4JywnaXQnOidcXHUyMDYyJywnaXRpbGRlJzonXFx1MDEyOScsJ0l0aWxkZSc6J1xcdTAxMjgnLCdpdWtjeSc6J1xcdTA0NTYnLCdJdWtjeSc6J1xcdTA0MDYnLCdpdW1sJzonXFx4RUYnLCdJdW1sJzonXFx4Q0YnLCdqY2lyYyc6J1xcdTAxMzUnLCdKY2lyYyc6J1xcdTAxMzQnLCdqY3knOidcXHUwNDM5JywnSmN5JzonXFx1MDQxOScsJ2pmcic6J1xcdUQ4MzVcXHVERDI3JywnSmZyJzonXFx1RDgzNVxcdUREMEQnLCdqbWF0aCc6J1xcdTAyMzcnLCdqb3BmJzonXFx1RDgzNVxcdURENUInLCdKb3BmJzonXFx1RDgzNVxcdURENDEnLCdqc2NyJzonXFx1RDgzNVxcdURDQkYnLCdKc2NyJzonXFx1RDgzNVxcdURDQTUnLCdqc2VyY3knOidcXHUwNDU4JywnSnNlcmN5JzonXFx1MDQwOCcsJ2p1a2N5JzonXFx1MDQ1NCcsJ0p1a2N5JzonXFx1MDQwNCcsJ2thcHBhJzonXFx1MDNCQScsJ0thcHBhJzonXFx1MDM5QScsJ2thcHBhdic6J1xcdTAzRjAnLCdrY2VkaWwnOidcXHUwMTM3JywnS2NlZGlsJzonXFx1MDEzNicsJ2tjeSc6J1xcdTA0M0EnLCdLY3knOidcXHUwNDFBJywna2ZyJzonXFx1RDgzNVxcdUREMjgnLCdLZnInOidcXHVEODM1XFx1REQwRScsJ2tncmVlbic6J1xcdTAxMzgnLCdraGN5JzonXFx1MDQ0NScsJ0tIY3knOidcXHUwNDI1Jywna2pjeSc6J1xcdTA0NUMnLCdLSmN5JzonXFx1MDQwQycsJ2tvcGYnOidcXHVEODM1XFx1REQ1QycsJ0tvcGYnOidcXHVEODM1XFx1REQ0MicsJ2tzY3InOidcXHVEODM1XFx1RENDMCcsJ0tzY3InOidcXHVEODM1XFx1RENBNicsJ2xBYXJyJzonXFx1MjFEQScsJ2xhY3V0ZSc6J1xcdTAxM0EnLCdMYWN1dGUnOidcXHUwMTM5JywnbGFlbXB0eXYnOidcXHUyOUI0JywnbGFncmFuJzonXFx1MjExMicsJ2xhbWJkYSc6J1xcdTAzQkInLCdMYW1iZGEnOidcXHUwMzlCJywnbGFuZyc6J1xcdTI3RTgnLCdMYW5nJzonXFx1MjdFQScsJ2xhbmdkJzonXFx1Mjk5MScsJ2xhbmdsZSc6J1xcdTI3RTgnLCdsYXAnOidcXHUyQTg1JywnTGFwbGFjZXRyZic6J1xcdTIxMTInLCdsYXF1byc6J1xceEFCJywnbGFycic6J1xcdTIxOTAnLCdsQXJyJzonXFx1MjFEMCcsJ0xhcnInOidcXHUyMTlFJywnbGFycmInOidcXHUyMUU0JywnbGFycmJmcyc6J1xcdTI5MUYnLCdsYXJyZnMnOidcXHUyOTFEJywnbGFycmhrJzonXFx1MjFBOScsJ2xhcnJscCc6J1xcdTIxQUInLCdsYXJycGwnOidcXHUyOTM5JywnbGFycnNpbSc6J1xcdTI5NzMnLCdsYXJydGwnOidcXHUyMUEyJywnbGF0JzonXFx1MkFBQicsJ2xhdGFpbCc6J1xcdTI5MTknLCdsQXRhaWwnOidcXHUyOTFCJywnbGF0ZSc6J1xcdTJBQUQnLCdsYXRlcyc6J1xcdTJBQURcXHVGRTAwJywnbGJhcnInOidcXHUyOTBDJywnbEJhcnInOidcXHUyOTBFJywnbGJicmsnOidcXHUyNzcyJywnbGJyYWNlJzoneycsJ2xicmFjayc6J1snLCdsYnJrZSc6J1xcdTI5OEInLCdsYnJrc2xkJzonXFx1Mjk4RicsJ2xicmtzbHUnOidcXHUyOThEJywnbGNhcm9uJzonXFx1MDEzRScsJ0xjYXJvbic6J1xcdTAxM0QnLCdsY2VkaWwnOidcXHUwMTNDJywnTGNlZGlsJzonXFx1MDEzQicsJ2xjZWlsJzonXFx1MjMwOCcsJ2xjdWInOid7JywnbGN5JzonXFx1MDQzQicsJ0xjeSc6J1xcdTA0MUInLCdsZGNhJzonXFx1MjkzNicsJ2xkcXVvJzonXFx1MjAxQycsJ2xkcXVvcic6J1xcdTIwMUUnLCdsZHJkaGFyJzonXFx1Mjk2NycsJ2xkcnVzaGFyJzonXFx1Mjk0QicsJ2xkc2gnOidcXHUyMUIyJywnbGUnOidcXHUyMjY0JywnbEUnOidcXHUyMjY2JywnTGVmdEFuZ2xlQnJhY2tldCc6J1xcdTI3RTgnLCdsZWZ0YXJyb3cnOidcXHUyMTkwJywnTGVmdGFycm93JzonXFx1MjFEMCcsJ0xlZnRBcnJvdyc6J1xcdTIxOTAnLCdMZWZ0QXJyb3dCYXInOidcXHUyMUU0JywnTGVmdEFycm93UmlnaHRBcnJvdyc6J1xcdTIxQzYnLCdsZWZ0YXJyb3d0YWlsJzonXFx1MjFBMicsJ0xlZnRDZWlsaW5nJzonXFx1MjMwOCcsJ0xlZnREb3VibGVCcmFja2V0JzonXFx1MjdFNicsJ0xlZnREb3duVGVlVmVjdG9yJzonXFx1Mjk2MScsJ0xlZnREb3duVmVjdG9yJzonXFx1MjFDMycsJ0xlZnREb3duVmVjdG9yQmFyJzonXFx1Mjk1OScsJ0xlZnRGbG9vcic6J1xcdTIzMEEnLCdsZWZ0aGFycG9vbmRvd24nOidcXHUyMUJEJywnbGVmdGhhcnBvb251cCc6J1xcdTIxQkMnLCdsZWZ0bGVmdGFycm93cyc6J1xcdTIxQzcnLCdsZWZ0cmlnaHRhcnJvdyc6J1xcdTIxOTQnLCdMZWZ0cmlnaHRhcnJvdyc6J1xcdTIxRDQnLCdMZWZ0UmlnaHRBcnJvdyc6J1xcdTIxOTQnLCdsZWZ0cmlnaHRhcnJvd3MnOidcXHUyMUM2JywnbGVmdHJpZ2h0aGFycG9vbnMnOidcXHUyMUNCJywnbGVmdHJpZ2h0c3F1aWdhcnJvdyc6J1xcdTIxQUQnLCdMZWZ0UmlnaHRWZWN0b3InOidcXHUyOTRFJywnTGVmdFRlZSc6J1xcdTIyQTMnLCdMZWZ0VGVlQXJyb3cnOidcXHUyMUE0JywnTGVmdFRlZVZlY3Rvcic6J1xcdTI5NUEnLCdsZWZ0dGhyZWV0aW1lcyc6J1xcdTIyQ0InLCdMZWZ0VHJpYW5nbGUnOidcXHUyMkIyJywnTGVmdFRyaWFuZ2xlQmFyJzonXFx1MjlDRicsJ0xlZnRUcmlhbmdsZUVxdWFsJzonXFx1MjJCNCcsJ0xlZnRVcERvd25WZWN0b3InOidcXHUyOTUxJywnTGVmdFVwVGVlVmVjdG9yJzonXFx1Mjk2MCcsJ0xlZnRVcFZlY3Rvcic6J1xcdTIxQkYnLCdMZWZ0VXBWZWN0b3JCYXInOidcXHUyOTU4JywnTGVmdFZlY3Rvcic6J1xcdTIxQkMnLCdMZWZ0VmVjdG9yQmFyJzonXFx1Mjk1MicsJ2xlZyc6J1xcdTIyREEnLCdsRWcnOidcXHUyQThCJywnbGVxJzonXFx1MjI2NCcsJ2xlcXEnOidcXHUyMjY2JywnbGVxc2xhbnQnOidcXHUyQTdEJywnbGVzJzonXFx1MkE3RCcsJ2xlc2NjJzonXFx1MkFBOCcsJ2xlc2RvdCc6J1xcdTJBN0YnLCdsZXNkb3RvJzonXFx1MkE4MScsJ2xlc2RvdG9yJzonXFx1MkE4MycsJ2xlc2cnOidcXHUyMkRBXFx1RkUwMCcsJ2xlc2dlcyc6J1xcdTJBOTMnLCdsZXNzYXBwcm94JzonXFx1MkE4NScsJ2xlc3Nkb3QnOidcXHUyMkQ2JywnbGVzc2VxZ3RyJzonXFx1MjJEQScsJ2xlc3NlcXFndHInOidcXHUyQThCJywnTGVzc0VxdWFsR3JlYXRlcic6J1xcdTIyREEnLCdMZXNzRnVsbEVxdWFsJzonXFx1MjI2NicsJ0xlc3NHcmVhdGVyJzonXFx1MjI3NicsJ2xlc3NndHInOidcXHUyMjc2JywnTGVzc0xlc3MnOidcXHUyQUExJywnbGVzc3NpbSc6J1xcdTIyNzInLCdMZXNzU2xhbnRFcXVhbCc6J1xcdTJBN0QnLCdMZXNzVGlsZGUnOidcXHUyMjcyJywnbGZpc2h0JzonXFx1Mjk3QycsJ2xmbG9vcic6J1xcdTIzMEEnLCdsZnInOidcXHVEODM1XFx1REQyOScsJ0xmcic6J1xcdUQ4MzVcXHVERDBGJywnbGcnOidcXHUyMjc2JywnbGdFJzonXFx1MkE5MScsJ2xIYXInOidcXHUyOTYyJywnbGhhcmQnOidcXHUyMUJEJywnbGhhcnUnOidcXHUyMUJDJywnbGhhcnVsJzonXFx1Mjk2QScsJ2xoYmxrJzonXFx1MjU4NCcsJ2xqY3knOidcXHUwNDU5JywnTEpjeSc6J1xcdTA0MDknLCdsbCc6J1xcdTIyNkEnLCdMbCc6J1xcdTIyRDgnLCdsbGFycic6J1xcdTIxQzcnLCdsbGNvcm5lcic6J1xcdTIzMUUnLCdMbGVmdGFycm93JzonXFx1MjFEQScsJ2xsaGFyZCc6J1xcdTI5NkInLCdsbHRyaSc6J1xcdTI1RkEnLCdsbWlkb3QnOidcXHUwMTQwJywnTG1pZG90JzonXFx1MDEzRicsJ2xtb3VzdCc6J1xcdTIzQjAnLCdsbW91c3RhY2hlJzonXFx1MjNCMCcsJ2xuYXAnOidcXHUyQTg5JywnbG5hcHByb3gnOidcXHUyQTg5JywnbG5lJzonXFx1MkE4NycsJ2xuRSc6J1xcdTIyNjgnLCdsbmVxJzonXFx1MkE4NycsJ2xuZXFxJzonXFx1MjI2OCcsJ2xuc2ltJzonXFx1MjJFNicsJ2xvYW5nJzonXFx1MjdFQycsJ2xvYXJyJzonXFx1MjFGRCcsJ2xvYnJrJzonXFx1MjdFNicsJ2xvbmdsZWZ0YXJyb3cnOidcXHUyN0Y1JywnTG9uZ2xlZnRhcnJvdyc6J1xcdTI3RjgnLCdMb25nTGVmdEFycm93JzonXFx1MjdGNScsJ2xvbmdsZWZ0cmlnaHRhcnJvdyc6J1xcdTI3RjcnLCdMb25nbGVmdHJpZ2h0YXJyb3cnOidcXHUyN0ZBJywnTG9uZ0xlZnRSaWdodEFycm93JzonXFx1MjdGNycsJ2xvbmdtYXBzdG8nOidcXHUyN0ZDJywnbG9uZ3JpZ2h0YXJyb3cnOidcXHUyN0Y2JywnTG9uZ3JpZ2h0YXJyb3cnOidcXHUyN0Y5JywnTG9uZ1JpZ2h0QXJyb3cnOidcXHUyN0Y2JywnbG9vcGFycm93bGVmdCc6J1xcdTIxQUInLCdsb29wYXJyb3dyaWdodCc6J1xcdTIxQUMnLCdsb3Bhcic6J1xcdTI5ODUnLCdsb3BmJzonXFx1RDgzNVxcdURENUQnLCdMb3BmJzonXFx1RDgzNVxcdURENDMnLCdsb3BsdXMnOidcXHUyQTJEJywnbG90aW1lcyc6J1xcdTJBMzQnLCdsb3dhc3QnOidcXHUyMjE3JywnbG93YmFyJzonXycsJ0xvd2VyTGVmdEFycm93JzonXFx1MjE5OScsJ0xvd2VyUmlnaHRBcnJvdyc6J1xcdTIxOTgnLCdsb3onOidcXHUyNUNBJywnbG96ZW5nZSc6J1xcdTI1Q0EnLCdsb3pmJzonXFx1MjlFQicsJ2xwYXInOicoJywnbHBhcmx0JzonXFx1Mjk5MycsJ2xyYXJyJzonXFx1MjFDNicsJ2xyY29ybmVyJzonXFx1MjMxRicsJ2xyaGFyJzonXFx1MjFDQicsJ2xyaGFyZCc6J1xcdTI5NkQnLCdscm0nOidcXHUyMDBFJywnbHJ0cmknOidcXHUyMkJGJywnbHNhcXVvJzonXFx1MjAzOScsJ2xzY3InOidcXHVEODM1XFx1RENDMScsJ0xzY3InOidcXHUyMTEyJywnbHNoJzonXFx1MjFCMCcsJ0xzaCc6J1xcdTIxQjAnLCdsc2ltJzonXFx1MjI3MicsJ2xzaW1lJzonXFx1MkE4RCcsJ2xzaW1nJzonXFx1MkE4RicsJ2xzcWInOidbJywnbHNxdW8nOidcXHUyMDE4JywnbHNxdW9yJzonXFx1MjAxQScsJ2xzdHJvayc6J1xcdTAxNDInLCdMc3Ryb2snOidcXHUwMTQxJywnbHQnOic8JywnTHQnOidcXHUyMjZBJywnTFQnOic8JywnbHRjYyc6J1xcdTJBQTYnLCdsdGNpcic6J1xcdTJBNzknLCdsdGRvdCc6J1xcdTIyRDYnLCdsdGhyZWUnOidcXHUyMkNCJywnbHRpbWVzJzonXFx1MjJDOScsJ2x0bGFycic6J1xcdTI5NzYnLCdsdHF1ZXN0JzonXFx1MkE3QicsJ2x0cmknOidcXHUyNUMzJywnbHRyaWUnOidcXHUyMkI0JywnbHRyaWYnOidcXHUyNUMyJywnbHRyUGFyJzonXFx1Mjk5NicsJ2x1cmRzaGFyJzonXFx1Mjk0QScsJ2x1cnVoYXInOidcXHUyOTY2JywnbHZlcnRuZXFxJzonXFx1MjI2OFxcdUZFMDAnLCdsdm5FJzonXFx1MjI2OFxcdUZFMDAnLCdtYWNyJzonXFx4QUYnLCdtYWxlJzonXFx1MjY0MicsJ21hbHQnOidcXHUyNzIwJywnbWFsdGVzZSc6J1xcdTI3MjAnLCdtYXAnOidcXHUyMUE2JywnTWFwJzonXFx1MjkwNScsJ21hcHN0byc6J1xcdTIxQTYnLCdtYXBzdG9kb3duJzonXFx1MjFBNycsJ21hcHN0b2xlZnQnOidcXHUyMUE0JywnbWFwc3RvdXAnOidcXHUyMUE1JywnbWFya2VyJzonXFx1MjVBRScsJ21jb21tYSc6J1xcdTJBMjknLCdtY3knOidcXHUwNDNDJywnTWN5JzonXFx1MDQxQycsJ21kYXNoJzonXFx1MjAxNCcsJ21ERG90JzonXFx1MjIzQScsJ21lYXN1cmVkYW5nbGUnOidcXHUyMjIxJywnTWVkaXVtU3BhY2UnOidcXHUyMDVGJywnTWVsbGludHJmJzonXFx1MjEzMycsJ21mcic6J1xcdUQ4MzVcXHVERDJBJywnTWZyJzonXFx1RDgzNVxcdUREMTAnLCdtaG8nOidcXHUyMTI3JywnbWljcm8nOidcXHhCNScsJ21pZCc6J1xcdTIyMjMnLCdtaWRhc3QnOicqJywnbWlkY2lyJzonXFx1MkFGMCcsJ21pZGRvdCc6J1xceEI3JywnbWludXMnOidcXHUyMjEyJywnbWludXNiJzonXFx1MjI5RicsJ21pbnVzZCc6J1xcdTIyMzgnLCdtaW51c2R1JzonXFx1MkEyQScsJ01pbnVzUGx1cyc6J1xcdTIyMTMnLCdtbGNwJzonXFx1MkFEQicsJ21sZHInOidcXHUyMDI2JywnbW5wbHVzJzonXFx1MjIxMycsJ21vZGVscyc6J1xcdTIyQTcnLCdtb3BmJzonXFx1RDgzNVxcdURENUUnLCdNb3BmJzonXFx1RDgzNVxcdURENDQnLCdtcCc6J1xcdTIyMTMnLCdtc2NyJzonXFx1RDgzNVxcdURDQzInLCdNc2NyJzonXFx1MjEzMycsJ21zdHBvcyc6J1xcdTIyM0UnLCdtdSc6J1xcdTAzQkMnLCdNdSc6J1xcdTAzOUMnLCdtdWx0aW1hcCc6J1xcdTIyQjgnLCdtdW1hcCc6J1xcdTIyQjgnLCduYWJsYSc6J1xcdTIyMDcnLCduYWN1dGUnOidcXHUwMTQ0JywnTmFjdXRlJzonXFx1MDE0MycsJ25hbmcnOidcXHUyMjIwXFx1MjBEMicsJ25hcCc6J1xcdTIyNDknLCduYXBFJzonXFx1MkE3MFxcdTAzMzgnLCduYXBpZCc6J1xcdTIyNEJcXHUwMzM4JywnbmFwb3MnOidcXHUwMTQ5JywnbmFwcHJveCc6J1xcdTIyNDknLCduYXR1cic6J1xcdTI2NkUnLCduYXR1cmFsJzonXFx1MjY2RScsJ25hdHVyYWxzJzonXFx1MjExNScsJ25ic3AnOidcXHhBMCcsJ25idW1wJzonXFx1MjI0RVxcdTAzMzgnLCduYnVtcGUnOidcXHUyMjRGXFx1MDMzOCcsJ25jYXAnOidcXHUyQTQzJywnbmNhcm9uJzonXFx1MDE0OCcsJ05jYXJvbic6J1xcdTAxNDcnLCduY2VkaWwnOidcXHUwMTQ2JywnTmNlZGlsJzonXFx1MDE0NScsJ25jb25nJzonXFx1MjI0NycsJ25jb25nZG90JzonXFx1MkE2RFxcdTAzMzgnLCduY3VwJzonXFx1MkE0MicsJ25jeSc6J1xcdTA0M0QnLCdOY3knOidcXHUwNDFEJywnbmRhc2gnOidcXHUyMDEzJywnbmUnOidcXHUyMjYwJywnbmVhcmhrJzonXFx1MjkyNCcsJ25lYXJyJzonXFx1MjE5NycsJ25lQXJyJzonXFx1MjFENycsJ25lYXJyb3cnOidcXHUyMTk3JywnbmVkb3QnOidcXHUyMjUwXFx1MDMzOCcsJ05lZ2F0aXZlTWVkaXVtU3BhY2UnOidcXHUyMDBCJywnTmVnYXRpdmVUaGlja1NwYWNlJzonXFx1MjAwQicsJ05lZ2F0aXZlVGhpblNwYWNlJzonXFx1MjAwQicsJ05lZ2F0aXZlVmVyeVRoaW5TcGFjZSc6J1xcdTIwMEInLCduZXF1aXYnOidcXHUyMjYyJywnbmVzZWFyJzonXFx1MjkyOCcsJ25lc2ltJzonXFx1MjI0MlxcdTAzMzgnLCdOZXN0ZWRHcmVhdGVyR3JlYXRlcic6J1xcdTIyNkInLCdOZXN0ZWRMZXNzTGVzcyc6J1xcdTIyNkEnLCdOZXdMaW5lJzonXFxuJywnbmV4aXN0JzonXFx1MjIwNCcsJ25leGlzdHMnOidcXHUyMjA0JywnbmZyJzonXFx1RDgzNVxcdUREMkInLCdOZnInOidcXHVEODM1XFx1REQxMScsJ25nZSc6J1xcdTIyNzEnLCduZ0UnOidcXHUyMjY3XFx1MDMzOCcsJ25nZXEnOidcXHUyMjcxJywnbmdlcXEnOidcXHUyMjY3XFx1MDMzOCcsJ25nZXFzbGFudCc6J1xcdTJBN0VcXHUwMzM4Jywnbmdlcyc6J1xcdTJBN0VcXHUwMzM4JywnbkdnJzonXFx1MjJEOVxcdTAzMzgnLCduZ3NpbSc6J1xcdTIyNzUnLCduZ3QnOidcXHUyMjZGJywnbkd0JzonXFx1MjI2QlxcdTIwRDInLCduZ3RyJzonXFx1MjI2RicsJ25HdHYnOidcXHUyMjZCXFx1MDMzOCcsJ25oYXJyJzonXFx1MjFBRScsJ25oQXJyJzonXFx1MjFDRScsJ25ocGFyJzonXFx1MkFGMicsJ25pJzonXFx1MjIwQicsJ25pcyc6J1xcdTIyRkMnLCduaXNkJzonXFx1MjJGQScsJ25pdic6J1xcdTIyMEInLCduamN5JzonXFx1MDQ1QScsJ05KY3knOidcXHUwNDBBJywnbmxhcnInOidcXHUyMTlBJywnbmxBcnInOidcXHUyMUNEJywnbmxkcic6J1xcdTIwMjUnLCdubGUnOidcXHUyMjcwJywnbmxFJzonXFx1MjI2NlxcdTAzMzgnLCdubGVmdGFycm93JzonXFx1MjE5QScsJ25MZWZ0YXJyb3cnOidcXHUyMUNEJywnbmxlZnRyaWdodGFycm93JzonXFx1MjFBRScsJ25MZWZ0cmlnaHRhcnJvdyc6J1xcdTIxQ0UnLCdubGVxJzonXFx1MjI3MCcsJ25sZXFxJzonXFx1MjI2NlxcdTAzMzgnLCdubGVxc2xhbnQnOidcXHUyQTdEXFx1MDMzOCcsJ25sZXMnOidcXHUyQTdEXFx1MDMzOCcsJ25sZXNzJzonXFx1MjI2RScsJ25MbCc6J1xcdTIyRDhcXHUwMzM4JywnbmxzaW0nOidcXHUyMjc0Jywnbmx0JzonXFx1MjI2RScsJ25MdCc6J1xcdTIyNkFcXHUyMEQyJywnbmx0cmknOidcXHUyMkVBJywnbmx0cmllJzonXFx1MjJFQycsJ25MdHYnOidcXHUyMjZBXFx1MDMzOCcsJ25taWQnOidcXHUyMjI0JywnTm9CcmVhayc6J1xcdTIwNjAnLCdOb25CcmVha2luZ1NwYWNlJzonXFx4QTAnLCdub3BmJzonXFx1RDgzNVxcdURENUYnLCdOb3BmJzonXFx1MjExNScsJ25vdCc6J1xceEFDJywnTm90JzonXFx1MkFFQycsJ05vdENvbmdydWVudCc6J1xcdTIyNjInLCdOb3RDdXBDYXAnOidcXHUyMjZEJywnTm90RG91YmxlVmVydGljYWxCYXInOidcXHUyMjI2JywnTm90RWxlbWVudCc6J1xcdTIyMDknLCdOb3RFcXVhbCc6J1xcdTIyNjAnLCdOb3RFcXVhbFRpbGRlJzonXFx1MjI0MlxcdTAzMzgnLCdOb3RFeGlzdHMnOidcXHUyMjA0JywnTm90R3JlYXRlcic6J1xcdTIyNkYnLCdOb3RHcmVhdGVyRXF1YWwnOidcXHUyMjcxJywnTm90R3JlYXRlckZ1bGxFcXVhbCc6J1xcdTIyNjdcXHUwMzM4JywnTm90R3JlYXRlckdyZWF0ZXInOidcXHUyMjZCXFx1MDMzOCcsJ05vdEdyZWF0ZXJMZXNzJzonXFx1MjI3OScsJ05vdEdyZWF0ZXJTbGFudEVxdWFsJzonXFx1MkE3RVxcdTAzMzgnLCdOb3RHcmVhdGVyVGlsZGUnOidcXHUyMjc1JywnTm90SHVtcERvd25IdW1wJzonXFx1MjI0RVxcdTAzMzgnLCdOb3RIdW1wRXF1YWwnOidcXHUyMjRGXFx1MDMzOCcsJ25vdGluJzonXFx1MjIwOScsJ25vdGluZG90JzonXFx1MjJGNVxcdTAzMzgnLCdub3RpbkUnOidcXHUyMkY5XFx1MDMzOCcsJ25vdGludmEnOidcXHUyMjA5Jywnbm90aW52Yic6J1xcdTIyRjcnLCdub3RpbnZjJzonXFx1MjJGNicsJ05vdExlZnRUcmlhbmdsZSc6J1xcdTIyRUEnLCdOb3RMZWZ0VHJpYW5nbGVCYXInOidcXHUyOUNGXFx1MDMzOCcsJ05vdExlZnRUcmlhbmdsZUVxdWFsJzonXFx1MjJFQycsJ05vdExlc3MnOidcXHUyMjZFJywnTm90TGVzc0VxdWFsJzonXFx1MjI3MCcsJ05vdExlc3NHcmVhdGVyJzonXFx1MjI3OCcsJ05vdExlc3NMZXNzJzonXFx1MjI2QVxcdTAzMzgnLCdOb3RMZXNzU2xhbnRFcXVhbCc6J1xcdTJBN0RcXHUwMzM4JywnTm90TGVzc1RpbGRlJzonXFx1MjI3NCcsJ05vdE5lc3RlZEdyZWF0ZXJHcmVhdGVyJzonXFx1MkFBMlxcdTAzMzgnLCdOb3ROZXN0ZWRMZXNzTGVzcyc6J1xcdTJBQTFcXHUwMzM4Jywnbm90bmknOidcXHUyMjBDJywnbm90bml2YSc6J1xcdTIyMEMnLCdub3RuaXZiJzonXFx1MjJGRScsJ25vdG5pdmMnOidcXHUyMkZEJywnTm90UHJlY2VkZXMnOidcXHUyMjgwJywnTm90UHJlY2VkZXNFcXVhbCc6J1xcdTJBQUZcXHUwMzM4JywnTm90UHJlY2VkZXNTbGFudEVxdWFsJzonXFx1MjJFMCcsJ05vdFJldmVyc2VFbGVtZW50JzonXFx1MjIwQycsJ05vdFJpZ2h0VHJpYW5nbGUnOidcXHUyMkVCJywnTm90UmlnaHRUcmlhbmdsZUJhcic6J1xcdTI5RDBcXHUwMzM4JywnTm90UmlnaHRUcmlhbmdsZUVxdWFsJzonXFx1MjJFRCcsJ05vdFNxdWFyZVN1YnNldCc6J1xcdTIyOEZcXHUwMzM4JywnTm90U3F1YXJlU3Vic2V0RXF1YWwnOidcXHUyMkUyJywnTm90U3F1YXJlU3VwZXJzZXQnOidcXHUyMjkwXFx1MDMzOCcsJ05vdFNxdWFyZVN1cGVyc2V0RXF1YWwnOidcXHUyMkUzJywnTm90U3Vic2V0JzonXFx1MjI4MlxcdTIwRDInLCdOb3RTdWJzZXRFcXVhbCc6J1xcdTIyODgnLCdOb3RTdWNjZWVkcyc6J1xcdTIyODEnLCdOb3RTdWNjZWVkc0VxdWFsJzonXFx1MkFCMFxcdTAzMzgnLCdOb3RTdWNjZWVkc1NsYW50RXF1YWwnOidcXHUyMkUxJywnTm90U3VjY2VlZHNUaWxkZSc6J1xcdTIyN0ZcXHUwMzM4JywnTm90U3VwZXJzZXQnOidcXHUyMjgzXFx1MjBEMicsJ05vdFN1cGVyc2V0RXF1YWwnOidcXHUyMjg5JywnTm90VGlsZGUnOidcXHUyMjQxJywnTm90VGlsZGVFcXVhbCc6J1xcdTIyNDQnLCdOb3RUaWxkZUZ1bGxFcXVhbCc6J1xcdTIyNDcnLCdOb3RUaWxkZVRpbGRlJzonXFx1MjI0OScsJ05vdFZlcnRpY2FsQmFyJzonXFx1MjIyNCcsJ25wYXInOidcXHUyMjI2JywnbnBhcmFsbGVsJzonXFx1MjIyNicsJ25wYXJzbCc6J1xcdTJBRkRcXHUyMEU1JywnbnBhcnQnOidcXHUyMjAyXFx1MDMzOCcsJ25wb2xpbnQnOidcXHUyQTE0JywnbnByJzonXFx1MjI4MCcsJ25wcmN1ZSc6J1xcdTIyRTAnLCducHJlJzonXFx1MkFBRlxcdTAzMzgnLCducHJlYyc6J1xcdTIyODAnLCducHJlY2VxJzonXFx1MkFBRlxcdTAzMzgnLCducmFycic6J1xcdTIxOUInLCduckFycic6J1xcdTIxQ0YnLCducmFycmMnOidcXHUyOTMzXFx1MDMzOCcsJ25yYXJydyc6J1xcdTIxOURcXHUwMzM4JywnbnJpZ2h0YXJyb3cnOidcXHUyMTlCJywnblJpZ2h0YXJyb3cnOidcXHUyMUNGJywnbnJ0cmknOidcXHUyMkVCJywnbnJ0cmllJzonXFx1MjJFRCcsJ25zYyc6J1xcdTIyODEnLCduc2NjdWUnOidcXHUyMkUxJywnbnNjZSc6J1xcdTJBQjBcXHUwMzM4JywnbnNjcic6J1xcdUQ4MzVcXHVEQ0MzJywnTnNjcic6J1xcdUQ4MzVcXHVEQ0E5JywnbnNob3J0bWlkJzonXFx1MjIyNCcsJ25zaG9ydHBhcmFsbGVsJzonXFx1MjIyNicsJ25zaW0nOidcXHUyMjQxJywnbnNpbWUnOidcXHUyMjQ0JywnbnNpbWVxJzonXFx1MjI0NCcsJ25zbWlkJzonXFx1MjIyNCcsJ25zcGFyJzonXFx1MjIyNicsJ25zcXN1YmUnOidcXHUyMkUyJywnbnNxc3VwZSc6J1xcdTIyRTMnLCduc3ViJzonXFx1MjI4NCcsJ25zdWJlJzonXFx1MjI4OCcsJ25zdWJFJzonXFx1MkFDNVxcdTAzMzgnLCduc3Vic2V0JzonXFx1MjI4MlxcdTIwRDInLCduc3Vic2V0ZXEnOidcXHUyMjg4JywnbnN1YnNldGVxcSc6J1xcdTJBQzVcXHUwMzM4JywnbnN1Y2MnOidcXHUyMjgxJywnbnN1Y2NlcSc6J1xcdTJBQjBcXHUwMzM4JywnbnN1cCc6J1xcdTIyODUnLCduc3VwZSc6J1xcdTIyODknLCduc3VwRSc6J1xcdTJBQzZcXHUwMzM4JywnbnN1cHNldCc6J1xcdTIyODNcXHUyMEQyJywnbnN1cHNldGVxJzonXFx1MjI4OScsJ25zdXBzZXRlcXEnOidcXHUyQUM2XFx1MDMzOCcsJ250Z2wnOidcXHUyMjc5JywnbnRpbGRlJzonXFx4RjEnLCdOdGlsZGUnOidcXHhEMScsJ250bGcnOidcXHUyMjc4JywnbnRyaWFuZ2xlbGVmdCc6J1xcdTIyRUEnLCdudHJpYW5nbGVsZWZ0ZXEnOidcXHUyMkVDJywnbnRyaWFuZ2xlcmlnaHQnOidcXHUyMkVCJywnbnRyaWFuZ2xlcmlnaHRlcSc6J1xcdTIyRUQnLCdudSc6J1xcdTAzQkQnLCdOdSc6J1xcdTAzOUQnLCdudW0nOicjJywnbnVtZXJvJzonXFx1MjExNicsJ251bXNwJzonXFx1MjAwNycsJ252YXAnOidcXHUyMjREXFx1MjBEMicsJ252ZGFzaCc6J1xcdTIyQUMnLCdudkRhc2gnOidcXHUyMkFEJywnblZkYXNoJzonXFx1MjJBRScsJ25WRGFzaCc6J1xcdTIyQUYnLCdudmdlJzonXFx1MjI2NVxcdTIwRDInLCdudmd0JzonPlxcdTIwRDInLCdudkhhcnInOidcXHUyOTA0JywnbnZpbmZpbic6J1xcdTI5REUnLCdudmxBcnInOidcXHUyOTAyJywnbnZsZSc6J1xcdTIyNjRcXHUyMEQyJywnbnZsdCc6JzxcXHUyMEQyJywnbnZsdHJpZSc6J1xcdTIyQjRcXHUyMEQyJywnbnZyQXJyJzonXFx1MjkwMycsJ252cnRyaWUnOidcXHUyMkI1XFx1MjBEMicsJ252c2ltJzonXFx1MjIzQ1xcdTIwRDInLCdud2FyaGsnOidcXHUyOTIzJywnbndhcnInOidcXHUyMTk2JywnbndBcnInOidcXHUyMUQ2JywnbndhcnJvdyc6J1xcdTIxOTYnLCdud25lYXInOidcXHUyOTI3Jywnb2FjdXRlJzonXFx4RjMnLCdPYWN1dGUnOidcXHhEMycsJ29hc3QnOidcXHUyMjlCJywnb2Npcic6J1xcdTIyOUEnLCdvY2lyYyc6J1xceEY0JywnT2NpcmMnOidcXHhENCcsJ29jeSc6J1xcdTA0M0UnLCdPY3knOidcXHUwNDFFJywnb2Rhc2gnOidcXHUyMjlEJywnb2RibGFjJzonXFx1MDE1MScsJ09kYmxhYyc6J1xcdTAxNTAnLCdvZGl2JzonXFx1MkEzOCcsJ29kb3QnOidcXHUyMjk5Jywnb2Rzb2xkJzonXFx1MjlCQycsJ29lbGlnJzonXFx1MDE1MycsJ09FbGlnJzonXFx1MDE1MicsJ29mY2lyJzonXFx1MjlCRicsJ29mcic6J1xcdUQ4MzVcXHVERDJDJywnT2ZyJzonXFx1RDgzNVxcdUREMTInLCdvZ29uJzonXFx1MDJEQicsJ29ncmF2ZSc6J1xceEYyJywnT2dyYXZlJzonXFx4RDInLCdvZ3QnOidcXHUyOUMxJywnb2hiYXInOidcXHUyOUI1Jywnb2htJzonXFx1MDNBOScsJ29pbnQnOidcXHUyMjJFJywnb2xhcnInOidcXHUyMUJBJywnb2xjaXInOidcXHUyOUJFJywnb2xjcm9zcyc6J1xcdTI5QkInLCdvbGluZSc6J1xcdTIwM0UnLCdvbHQnOidcXHUyOUMwJywnb21hY3InOidcXHUwMTREJywnT21hY3InOidcXHUwMTRDJywnb21lZ2EnOidcXHUwM0M5JywnT21lZ2EnOidcXHUwM0E5Jywnb21pY3Jvbic6J1xcdTAzQkYnLCdPbWljcm9uJzonXFx1MDM5RicsJ29taWQnOidcXHUyOUI2Jywnb21pbnVzJzonXFx1MjI5NicsJ29vcGYnOidcXHVEODM1XFx1REQ2MCcsJ09vcGYnOidcXHVEODM1XFx1REQ0NicsJ29wYXInOidcXHUyOUI3JywnT3BlbkN1cmx5RG91YmxlUXVvdGUnOidcXHUyMDFDJywnT3BlbkN1cmx5UXVvdGUnOidcXHUyMDE4Jywnb3BlcnAnOidcXHUyOUI5Jywnb3BsdXMnOidcXHUyMjk1Jywnb3InOidcXHUyMjI4JywnT3InOidcXHUyQTU0Jywnb3JhcnInOidcXHUyMUJCJywnb3JkJzonXFx1MkE1RCcsJ29yZGVyJzonXFx1MjEzNCcsJ29yZGVyb2YnOidcXHUyMTM0Jywnb3JkZic6J1xceEFBJywnb3JkbSc6J1xceEJBJywnb3JpZ29mJzonXFx1MjJCNicsJ29yb3InOidcXHUyQTU2Jywnb3JzbG9wZSc6J1xcdTJBNTcnLCdvcnYnOidcXHUyQTVCJywnb1MnOidcXHUyNEM4Jywnb3Njcic6J1xcdTIxMzQnLCdPc2NyJzonXFx1RDgzNVxcdURDQUEnLCdvc2xhc2gnOidcXHhGOCcsJ09zbGFzaCc6J1xceEQ4Jywnb3NvbCc6J1xcdTIyOTgnLCdvdGlsZGUnOidcXHhGNScsJ090aWxkZSc6J1xceEQ1Jywnb3RpbWVzJzonXFx1MjI5NycsJ090aW1lcyc6J1xcdTJBMzcnLCdvdGltZXNhcyc6J1xcdTJBMzYnLCdvdW1sJzonXFx4RjYnLCdPdW1sJzonXFx4RDYnLCdvdmJhcic6J1xcdTIzM0QnLCdPdmVyQmFyJzonXFx1MjAzRScsJ092ZXJCcmFjZSc6J1xcdTIzREUnLCdPdmVyQnJhY2tldCc6J1xcdTIzQjQnLCdPdmVyUGFyZW50aGVzaXMnOidcXHUyM0RDJywncGFyJzonXFx1MjIyNScsJ3BhcmEnOidcXHhCNicsJ3BhcmFsbGVsJzonXFx1MjIyNScsJ3BhcnNpbSc6J1xcdTJBRjMnLCdwYXJzbCc6J1xcdTJBRkQnLCdwYXJ0JzonXFx1MjIwMicsJ1BhcnRpYWxEJzonXFx1MjIwMicsJ3BjeSc6J1xcdTA0M0YnLCdQY3knOidcXHUwNDFGJywncGVyY250JzonJScsJ3BlcmlvZCc6Jy4nLCdwZXJtaWwnOidcXHUyMDMwJywncGVycCc6J1xcdTIyQTUnLCdwZXJ0ZW5rJzonXFx1MjAzMScsJ3Bmcic6J1xcdUQ4MzVcXHVERDJEJywnUGZyJzonXFx1RDgzNVxcdUREMTMnLCdwaGknOidcXHUwM0M2JywnUGhpJzonXFx1MDNBNicsJ3BoaXYnOidcXHUwM0Q1JywncGhtbWF0JzonXFx1MjEzMycsJ3Bob25lJzonXFx1MjYwRScsJ3BpJzonXFx1MDNDMCcsJ1BpJzonXFx1MDNBMCcsJ3BpdGNoZm9yayc6J1xcdTIyRDQnLCdwaXYnOidcXHUwM0Q2JywncGxhbmNrJzonXFx1MjEwRicsJ3BsYW5ja2gnOidcXHUyMTBFJywncGxhbmt2JzonXFx1MjEwRicsJ3BsdXMnOicrJywncGx1c2FjaXInOidcXHUyQTIzJywncGx1c2InOidcXHUyMjlFJywncGx1c2Npcic6J1xcdTJBMjInLCdwbHVzZG8nOidcXHUyMjE0JywncGx1c2R1JzonXFx1MkEyNScsJ3BsdXNlJzonXFx1MkE3MicsJ1BsdXNNaW51cyc6J1xceEIxJywncGx1c21uJzonXFx4QjEnLCdwbHVzc2ltJzonXFx1MkEyNicsJ3BsdXN0d28nOidcXHUyQTI3JywncG0nOidcXHhCMScsJ1BvaW5jYXJlcGxhbmUnOidcXHUyMTBDJywncG9pbnRpbnQnOidcXHUyQTE1JywncG9wZic6J1xcdUQ4MzVcXHVERDYxJywnUG9wZic6J1xcdTIxMTknLCdwb3VuZCc6J1xceEEzJywncHInOidcXHUyMjdBJywnUHInOidcXHUyQUJCJywncHJhcCc6J1xcdTJBQjcnLCdwcmN1ZSc6J1xcdTIyN0MnLCdwcmUnOidcXHUyQUFGJywncHJFJzonXFx1MkFCMycsJ3ByZWMnOidcXHUyMjdBJywncHJlY2FwcHJveCc6J1xcdTJBQjcnLCdwcmVjY3VybHllcSc6J1xcdTIyN0MnLCdQcmVjZWRlcyc6J1xcdTIyN0EnLCdQcmVjZWRlc0VxdWFsJzonXFx1MkFBRicsJ1ByZWNlZGVzU2xhbnRFcXVhbCc6J1xcdTIyN0MnLCdQcmVjZWRlc1RpbGRlJzonXFx1MjI3RScsJ3ByZWNlcSc6J1xcdTJBQUYnLCdwcmVjbmFwcHJveCc6J1xcdTJBQjknLCdwcmVjbmVxcSc6J1xcdTJBQjUnLCdwcmVjbnNpbSc6J1xcdTIyRTgnLCdwcmVjc2ltJzonXFx1MjI3RScsJ3ByaW1lJzonXFx1MjAzMicsJ1ByaW1lJzonXFx1MjAzMycsJ3ByaW1lcyc6J1xcdTIxMTknLCdwcm5hcCc6J1xcdTJBQjknLCdwcm5FJzonXFx1MkFCNScsJ3BybnNpbSc6J1xcdTIyRTgnLCdwcm9kJzonXFx1MjIwRicsJ1Byb2R1Y3QnOidcXHUyMjBGJywncHJvZmFsYXInOidcXHUyMzJFJywncHJvZmxpbmUnOidcXHUyMzEyJywncHJvZnN1cmYnOidcXHUyMzEzJywncHJvcCc6J1xcdTIyMUQnLCdQcm9wb3J0aW9uJzonXFx1MjIzNycsJ1Byb3BvcnRpb25hbCc6J1xcdTIyMUQnLCdwcm9wdG8nOidcXHUyMjFEJywncHJzaW0nOidcXHUyMjdFJywncHJ1cmVsJzonXFx1MjJCMCcsJ3BzY3InOidcXHVEODM1XFx1RENDNScsJ1BzY3InOidcXHVEODM1XFx1RENBQicsJ3BzaSc6J1xcdTAzQzgnLCdQc2knOidcXHUwM0E4JywncHVuY3NwJzonXFx1MjAwOCcsJ3Fmcic6J1xcdUQ4MzVcXHVERDJFJywnUWZyJzonXFx1RDgzNVxcdUREMTQnLCdxaW50JzonXFx1MkEwQycsJ3FvcGYnOidcXHVEODM1XFx1REQ2MicsJ1FvcGYnOidcXHUyMTFBJywncXByaW1lJzonXFx1MjA1NycsJ3FzY3InOidcXHVEODM1XFx1RENDNicsJ1FzY3InOidcXHVEODM1XFx1RENBQycsJ3F1YXRlcm5pb25zJzonXFx1MjEwRCcsJ3F1YXRpbnQnOidcXHUyQTE2JywncXVlc3QnOic/JywncXVlc3RlcSc6J1xcdTIyNUYnLCdxdW90JzonXCInLCdRVU9UJzonXCInLCdyQWFycic6J1xcdTIxREInLCdyYWNlJzonXFx1MjIzRFxcdTAzMzEnLCdyYWN1dGUnOidcXHUwMTU1JywnUmFjdXRlJzonXFx1MDE1NCcsJ3JhZGljJzonXFx1MjIxQScsJ3JhZW1wdHl2JzonXFx1MjlCMycsJ3JhbmcnOidcXHUyN0U5JywnUmFuZyc6J1xcdTI3RUInLCdyYW5nZCc6J1xcdTI5OTInLCdyYW5nZSc6J1xcdTI5QTUnLCdyYW5nbGUnOidcXHUyN0U5JywncmFxdW8nOidcXHhCQicsJ3JhcnInOidcXHUyMTkyJywnckFycic6J1xcdTIxRDInLCdSYXJyJzonXFx1MjFBMCcsJ3JhcnJhcCc6J1xcdTI5NzUnLCdyYXJyYic6J1xcdTIxRTUnLCdyYXJyYmZzJzonXFx1MjkyMCcsJ3JhcnJjJzonXFx1MjkzMycsJ3JhcnJmcyc6J1xcdTI5MUUnLCdyYXJyaGsnOidcXHUyMUFBJywncmFycmxwJzonXFx1MjFBQycsJ3JhcnJwbCc6J1xcdTI5NDUnLCdyYXJyc2ltJzonXFx1Mjk3NCcsJ3JhcnJ0bCc6J1xcdTIxQTMnLCdSYXJydGwnOidcXHUyOTE2JywncmFycncnOidcXHUyMTlEJywncmF0YWlsJzonXFx1MjkxQScsJ3JBdGFpbCc6J1xcdTI5MUMnLCdyYXRpbyc6J1xcdTIyMzYnLCdyYXRpb25hbHMnOidcXHUyMTFBJywncmJhcnInOidcXHUyOTBEJywnckJhcnInOidcXHUyOTBGJywnUkJhcnInOidcXHUyOTEwJywncmJicmsnOidcXHUyNzczJywncmJyYWNlJzonfScsJ3JicmFjayc6J10nLCdyYnJrZSc6J1xcdTI5OEMnLCdyYnJrc2xkJzonXFx1Mjk4RScsJ3JicmtzbHUnOidcXHUyOTkwJywncmNhcm9uJzonXFx1MDE1OScsJ1JjYXJvbic6J1xcdTAxNTgnLCdyY2VkaWwnOidcXHUwMTU3JywnUmNlZGlsJzonXFx1MDE1NicsJ3JjZWlsJzonXFx1MjMwOScsJ3JjdWInOid9JywncmN5JzonXFx1MDQ0MCcsJ1JjeSc6J1xcdTA0MjAnLCdyZGNhJzonXFx1MjkzNycsJ3JkbGRoYXInOidcXHUyOTY5JywncmRxdW8nOidcXHUyMDFEJywncmRxdW9yJzonXFx1MjAxRCcsJ3Jkc2gnOidcXHUyMUIzJywnUmUnOidcXHUyMTFDJywncmVhbCc6J1xcdTIxMUMnLCdyZWFsaW5lJzonXFx1MjExQicsJ3JlYWxwYXJ0JzonXFx1MjExQycsJ3JlYWxzJzonXFx1MjExRCcsJ3JlY3QnOidcXHUyNUFEJywncmVnJzonXFx4QUUnLCdSRUcnOidcXHhBRScsJ1JldmVyc2VFbGVtZW50JzonXFx1MjIwQicsJ1JldmVyc2VFcXVpbGlicml1bSc6J1xcdTIxQ0InLCdSZXZlcnNlVXBFcXVpbGlicml1bSc6J1xcdTI5NkYnLCdyZmlzaHQnOidcXHUyOTdEJywncmZsb29yJzonXFx1MjMwQicsJ3Jmcic6J1xcdUQ4MzVcXHVERDJGJywnUmZyJzonXFx1MjExQycsJ3JIYXInOidcXHUyOTY0JywncmhhcmQnOidcXHUyMUMxJywncmhhcnUnOidcXHUyMUMwJywncmhhcnVsJzonXFx1Mjk2QycsJ3Jobyc6J1xcdTAzQzEnLCdSaG8nOidcXHUwM0ExJywncmhvdic6J1xcdTAzRjEnLCdSaWdodEFuZ2xlQnJhY2tldCc6J1xcdTI3RTknLCdyaWdodGFycm93JzonXFx1MjE5MicsJ1JpZ2h0YXJyb3cnOidcXHUyMUQyJywnUmlnaHRBcnJvdyc6J1xcdTIxOTInLCdSaWdodEFycm93QmFyJzonXFx1MjFFNScsJ1JpZ2h0QXJyb3dMZWZ0QXJyb3cnOidcXHUyMUM0JywncmlnaHRhcnJvd3RhaWwnOidcXHUyMUEzJywnUmlnaHRDZWlsaW5nJzonXFx1MjMwOScsJ1JpZ2h0RG91YmxlQnJhY2tldCc6J1xcdTI3RTcnLCdSaWdodERvd25UZWVWZWN0b3InOidcXHUyOTVEJywnUmlnaHREb3duVmVjdG9yJzonXFx1MjFDMicsJ1JpZ2h0RG93blZlY3RvckJhcic6J1xcdTI5NTUnLCdSaWdodEZsb29yJzonXFx1MjMwQicsJ3JpZ2h0aGFycG9vbmRvd24nOidcXHUyMUMxJywncmlnaHRoYXJwb29udXAnOidcXHUyMUMwJywncmlnaHRsZWZ0YXJyb3dzJzonXFx1MjFDNCcsJ3JpZ2h0bGVmdGhhcnBvb25zJzonXFx1MjFDQycsJ3JpZ2h0cmlnaHRhcnJvd3MnOidcXHUyMUM5JywncmlnaHRzcXVpZ2Fycm93JzonXFx1MjE5RCcsJ1JpZ2h0VGVlJzonXFx1MjJBMicsJ1JpZ2h0VGVlQXJyb3cnOidcXHUyMUE2JywnUmlnaHRUZWVWZWN0b3InOidcXHUyOTVCJywncmlnaHR0aHJlZXRpbWVzJzonXFx1MjJDQycsJ1JpZ2h0VHJpYW5nbGUnOidcXHUyMkIzJywnUmlnaHRUcmlhbmdsZUJhcic6J1xcdTI5RDAnLCdSaWdodFRyaWFuZ2xlRXF1YWwnOidcXHUyMkI1JywnUmlnaHRVcERvd25WZWN0b3InOidcXHUyOTRGJywnUmlnaHRVcFRlZVZlY3Rvcic6J1xcdTI5NUMnLCdSaWdodFVwVmVjdG9yJzonXFx1MjFCRScsJ1JpZ2h0VXBWZWN0b3JCYXInOidcXHUyOTU0JywnUmlnaHRWZWN0b3InOidcXHUyMUMwJywnUmlnaHRWZWN0b3JCYXInOidcXHUyOTUzJywncmluZyc6J1xcdTAyREEnLCdyaXNpbmdkb3RzZXEnOidcXHUyMjUzJywncmxhcnInOidcXHUyMUM0JywncmxoYXInOidcXHUyMUNDJywncmxtJzonXFx1MjAwRicsJ3Jtb3VzdCc6J1xcdTIzQjEnLCdybW91c3RhY2hlJzonXFx1MjNCMScsJ3JubWlkJzonXFx1MkFFRScsJ3JvYW5nJzonXFx1MjdFRCcsJ3JvYXJyJzonXFx1MjFGRScsJ3JvYnJrJzonXFx1MjdFNycsJ3JvcGFyJzonXFx1Mjk4NicsJ3JvcGYnOidcXHVEODM1XFx1REQ2MycsJ1JvcGYnOidcXHUyMTFEJywncm9wbHVzJzonXFx1MkEyRScsJ3JvdGltZXMnOidcXHUyQTM1JywnUm91bmRJbXBsaWVzJzonXFx1Mjk3MCcsJ3JwYXInOicpJywncnBhcmd0JzonXFx1Mjk5NCcsJ3JwcG9saW50JzonXFx1MkExMicsJ3JyYXJyJzonXFx1MjFDOScsJ1JyaWdodGFycm93JzonXFx1MjFEQicsJ3JzYXF1byc6J1xcdTIwM0EnLCdyc2NyJzonXFx1RDgzNVxcdURDQzcnLCdSc2NyJzonXFx1MjExQicsJ3JzaCc6J1xcdTIxQjEnLCdSc2gnOidcXHUyMUIxJywncnNxYic6J10nLCdyc3F1byc6J1xcdTIwMTknLCdyc3F1b3InOidcXHUyMDE5JywncnRocmVlJzonXFx1MjJDQycsJ3J0aW1lcyc6J1xcdTIyQ0EnLCdydHJpJzonXFx1MjVCOScsJ3J0cmllJzonXFx1MjJCNScsJ3J0cmlmJzonXFx1MjVCOCcsJ3J0cmlsdHJpJzonXFx1MjlDRScsJ1J1bGVEZWxheWVkJzonXFx1MjlGNCcsJ3J1bHVoYXInOidcXHUyOTY4JywncngnOidcXHUyMTFFJywnc2FjdXRlJzonXFx1MDE1QicsJ1NhY3V0ZSc6J1xcdTAxNUEnLCdzYnF1byc6J1xcdTIwMUEnLCdzYyc6J1xcdTIyN0InLCdTYyc6J1xcdTJBQkMnLCdzY2FwJzonXFx1MkFCOCcsJ3NjYXJvbic6J1xcdTAxNjEnLCdTY2Fyb24nOidcXHUwMTYwJywnc2NjdWUnOidcXHUyMjdEJywnc2NlJzonXFx1MkFCMCcsJ3NjRSc6J1xcdTJBQjQnLCdzY2VkaWwnOidcXHUwMTVGJywnU2NlZGlsJzonXFx1MDE1RScsJ3NjaXJjJzonXFx1MDE1RCcsJ1NjaXJjJzonXFx1MDE1QycsJ3NjbmFwJzonXFx1MkFCQScsJ3NjbkUnOidcXHUyQUI2Jywnc2Nuc2ltJzonXFx1MjJFOScsJ3NjcG9saW50JzonXFx1MkExMycsJ3Njc2ltJzonXFx1MjI3RicsJ3NjeSc6J1xcdTA0NDEnLCdTY3knOidcXHUwNDIxJywnc2RvdCc6J1xcdTIyQzUnLCdzZG90Yic6J1xcdTIyQTEnLCdzZG90ZSc6J1xcdTJBNjYnLCdzZWFyaGsnOidcXHUyOTI1Jywnc2VhcnInOidcXHUyMTk4Jywnc2VBcnInOidcXHUyMUQ4Jywnc2VhcnJvdyc6J1xcdTIxOTgnLCdzZWN0JzonXFx4QTcnLCdzZW1pJzonOycsJ3Nlc3dhcic6J1xcdTI5MjknLCdzZXRtaW51cyc6J1xcdTIyMTYnLCdzZXRtbic6J1xcdTIyMTYnLCdzZXh0JzonXFx1MjczNicsJ3Nmcic6J1xcdUQ4MzVcXHVERDMwJywnU2ZyJzonXFx1RDgzNVxcdUREMTYnLCdzZnJvd24nOidcXHUyMzIyJywnc2hhcnAnOidcXHUyNjZGJywnc2hjaGN5JzonXFx1MDQ0OScsJ1NIQ0hjeSc6J1xcdTA0MjknLCdzaGN5JzonXFx1MDQ0OCcsJ1NIY3knOidcXHUwNDI4JywnU2hvcnREb3duQXJyb3cnOidcXHUyMTkzJywnU2hvcnRMZWZ0QXJyb3cnOidcXHUyMTkwJywnc2hvcnRtaWQnOidcXHUyMjIzJywnc2hvcnRwYXJhbGxlbCc6J1xcdTIyMjUnLCdTaG9ydFJpZ2h0QXJyb3cnOidcXHUyMTkyJywnU2hvcnRVcEFycm93JzonXFx1MjE5MScsJ3NoeSc6J1xceEFEJywnc2lnbWEnOidcXHUwM0MzJywnU2lnbWEnOidcXHUwM0EzJywnc2lnbWFmJzonXFx1MDNDMicsJ3NpZ21hdic6J1xcdTAzQzInLCdzaW0nOidcXHUyMjNDJywnc2ltZG90JzonXFx1MkE2QScsJ3NpbWUnOidcXHUyMjQzJywnc2ltZXEnOidcXHUyMjQzJywnc2ltZyc6J1xcdTJBOUUnLCdzaW1nRSc6J1xcdTJBQTAnLCdzaW1sJzonXFx1MkE5RCcsJ3NpbWxFJzonXFx1MkE5RicsJ3NpbW5lJzonXFx1MjI0NicsJ3NpbXBsdXMnOidcXHUyQTI0Jywnc2ltcmFycic6J1xcdTI5NzInLCdzbGFycic6J1xcdTIxOTAnLCdTbWFsbENpcmNsZSc6J1xcdTIyMTgnLCdzbWFsbHNldG1pbnVzJzonXFx1MjIxNicsJ3NtYXNocCc6J1xcdTJBMzMnLCdzbWVwYXJzbCc6J1xcdTI5RTQnLCdzbWlkJzonXFx1MjIyMycsJ3NtaWxlJzonXFx1MjMyMycsJ3NtdCc6J1xcdTJBQUEnLCdzbXRlJzonXFx1MkFBQycsJ3NtdGVzJzonXFx1MkFBQ1xcdUZFMDAnLCdzb2Z0Y3knOidcXHUwNDRDJywnU09GVGN5JzonXFx1MDQyQycsJ3NvbCc6Jy8nLCdzb2xiJzonXFx1MjlDNCcsJ3NvbGJhcic6J1xcdTIzM0YnLCdzb3BmJzonXFx1RDgzNVxcdURENjQnLCdTb3BmJzonXFx1RDgzNVxcdURENEEnLCdzcGFkZXMnOidcXHUyNjYwJywnc3BhZGVzdWl0JzonXFx1MjY2MCcsJ3NwYXInOidcXHUyMjI1Jywnc3FjYXAnOidcXHUyMjkzJywnc3FjYXBzJzonXFx1MjI5M1xcdUZFMDAnLCdzcWN1cCc6J1xcdTIyOTQnLCdzcWN1cHMnOidcXHUyMjk0XFx1RkUwMCcsJ1NxcnQnOidcXHUyMjFBJywnc3FzdWInOidcXHUyMjhGJywnc3FzdWJlJzonXFx1MjI5MScsJ3Nxc3Vic2V0JzonXFx1MjI4RicsJ3Nxc3Vic2V0ZXEnOidcXHUyMjkxJywnc3FzdXAnOidcXHUyMjkwJywnc3FzdXBlJzonXFx1MjI5MicsJ3Nxc3Vwc2V0JzonXFx1MjI5MCcsJ3Nxc3Vwc2V0ZXEnOidcXHUyMjkyJywnc3F1JzonXFx1MjVBMScsJ3NxdWFyZSc6J1xcdTI1QTEnLCdTcXVhcmUnOidcXHUyNUExJywnU3F1YXJlSW50ZXJzZWN0aW9uJzonXFx1MjI5MycsJ1NxdWFyZVN1YnNldCc6J1xcdTIyOEYnLCdTcXVhcmVTdWJzZXRFcXVhbCc6J1xcdTIyOTEnLCdTcXVhcmVTdXBlcnNldCc6J1xcdTIyOTAnLCdTcXVhcmVTdXBlcnNldEVxdWFsJzonXFx1MjI5MicsJ1NxdWFyZVVuaW9uJzonXFx1MjI5NCcsJ3NxdWFyZic6J1xcdTI1QUEnLCdzcXVmJzonXFx1MjVBQScsJ3NyYXJyJzonXFx1MjE5MicsJ3NzY3InOidcXHVEODM1XFx1RENDOCcsJ1NzY3InOidcXHVEODM1XFx1RENBRScsJ3NzZXRtbic6J1xcdTIyMTYnLCdzc21pbGUnOidcXHUyMzIzJywnc3N0YXJmJzonXFx1MjJDNicsJ3N0YXInOidcXHUyNjA2JywnU3Rhcic6J1xcdTIyQzYnLCdzdGFyZic6J1xcdTI2MDUnLCdzdHJhaWdodGVwc2lsb24nOidcXHUwM0Y1Jywnc3RyYWlnaHRwaGknOidcXHUwM0Q1Jywnc3RybnMnOidcXHhBRicsJ3N1Yic6J1xcdTIyODInLCdTdWInOidcXHUyMkQwJywnc3ViZG90JzonXFx1MkFCRCcsJ3N1YmUnOidcXHUyMjg2Jywnc3ViRSc6J1xcdTJBQzUnLCdzdWJlZG90JzonXFx1MkFDMycsJ3N1Ym11bHQnOidcXHUyQUMxJywnc3VibmUnOidcXHUyMjhBJywnc3VibkUnOidcXHUyQUNCJywnc3VicGx1cyc6J1xcdTJBQkYnLCdzdWJyYXJyJzonXFx1Mjk3OScsJ3N1YnNldCc6J1xcdTIyODInLCdTdWJzZXQnOidcXHUyMkQwJywnc3Vic2V0ZXEnOidcXHUyMjg2Jywnc3Vic2V0ZXFxJzonXFx1MkFDNScsJ1N1YnNldEVxdWFsJzonXFx1MjI4NicsJ3N1YnNldG5lcSc6J1xcdTIyOEEnLCdzdWJzZXRuZXFxJzonXFx1MkFDQicsJ3N1YnNpbSc6J1xcdTJBQzcnLCdzdWJzdWInOidcXHUyQUQ1Jywnc3Vic3VwJzonXFx1MkFEMycsJ3N1Y2MnOidcXHUyMjdCJywnc3VjY2FwcHJveCc6J1xcdTJBQjgnLCdzdWNjY3VybHllcSc6J1xcdTIyN0QnLCdTdWNjZWVkcyc6J1xcdTIyN0InLCdTdWNjZWVkc0VxdWFsJzonXFx1MkFCMCcsJ1N1Y2NlZWRzU2xhbnRFcXVhbCc6J1xcdTIyN0QnLCdTdWNjZWVkc1RpbGRlJzonXFx1MjI3RicsJ3N1Y2NlcSc6J1xcdTJBQjAnLCdzdWNjbmFwcHJveCc6J1xcdTJBQkEnLCdzdWNjbmVxcSc6J1xcdTJBQjYnLCdzdWNjbnNpbSc6J1xcdTIyRTknLCdzdWNjc2ltJzonXFx1MjI3RicsJ1N1Y2hUaGF0JzonXFx1MjIwQicsJ3N1bSc6J1xcdTIyMTEnLCdTdW0nOidcXHUyMjExJywnc3VuZyc6J1xcdTI2NkEnLCdzdXAnOidcXHUyMjgzJywnU3VwJzonXFx1MjJEMScsJ3N1cDEnOidcXHhCOScsJ3N1cDInOidcXHhCMicsJ3N1cDMnOidcXHhCMycsJ3N1cGRvdCc6J1xcdTJBQkUnLCdzdXBkc3ViJzonXFx1MkFEOCcsJ3N1cGUnOidcXHUyMjg3Jywnc3VwRSc6J1xcdTJBQzYnLCdzdXBlZG90JzonXFx1MkFDNCcsJ1N1cGVyc2V0JzonXFx1MjI4MycsJ1N1cGVyc2V0RXF1YWwnOidcXHUyMjg3Jywnc3VwaHNvbCc6J1xcdTI3QzknLCdzdXBoc3ViJzonXFx1MkFENycsJ3N1cGxhcnInOidcXHUyOTdCJywnc3VwbXVsdCc6J1xcdTJBQzInLCdzdXBuZSc6J1xcdTIyOEInLCdzdXBuRSc6J1xcdTJBQ0MnLCdzdXBwbHVzJzonXFx1MkFDMCcsJ3N1cHNldCc6J1xcdTIyODMnLCdTdXBzZXQnOidcXHUyMkQxJywnc3Vwc2V0ZXEnOidcXHUyMjg3Jywnc3Vwc2V0ZXFxJzonXFx1MkFDNicsJ3N1cHNldG5lcSc6J1xcdTIyOEInLCdzdXBzZXRuZXFxJzonXFx1MkFDQycsJ3N1cHNpbSc6J1xcdTJBQzgnLCdzdXBzdWInOidcXHUyQUQ0Jywnc3Vwc3VwJzonXFx1MkFENicsJ3N3YXJoayc6J1xcdTI5MjYnLCdzd2Fycic6J1xcdTIxOTknLCdzd0Fycic6J1xcdTIxRDknLCdzd2Fycm93JzonXFx1MjE5OScsJ3N3bndhcic6J1xcdTI5MkEnLCdzemxpZyc6J1xceERGJywnVGFiJzonXFx0JywndGFyZ2V0JzonXFx1MjMxNicsJ3RhdSc6J1xcdTAzQzQnLCdUYXUnOidcXHUwM0E0JywndGJyayc6J1xcdTIzQjQnLCd0Y2Fyb24nOidcXHUwMTY1JywnVGNhcm9uJzonXFx1MDE2NCcsJ3RjZWRpbCc6J1xcdTAxNjMnLCdUY2VkaWwnOidcXHUwMTYyJywndGN5JzonXFx1MDQ0MicsJ1RjeSc6J1xcdTA0MjInLCd0ZG90JzonXFx1MjBEQicsJ3RlbHJlYyc6J1xcdTIzMTUnLCd0ZnInOidcXHVEODM1XFx1REQzMScsJ1Rmcic6J1xcdUQ4MzVcXHVERDE3JywndGhlcmU0JzonXFx1MjIzNCcsJ3RoZXJlZm9yZSc6J1xcdTIyMzQnLCdUaGVyZWZvcmUnOidcXHUyMjM0JywndGhldGEnOidcXHUwM0I4JywnVGhldGEnOidcXHUwMzk4JywndGhldGFzeW0nOidcXHUwM0QxJywndGhldGF2JzonXFx1MDNEMScsJ3RoaWNrYXBwcm94JzonXFx1MjI0OCcsJ3RoaWNrc2ltJzonXFx1MjIzQycsJ1RoaWNrU3BhY2UnOidcXHUyMDVGXFx1MjAwQScsJ3RoaW5zcCc6J1xcdTIwMDknLCdUaGluU3BhY2UnOidcXHUyMDA5JywndGhrYXAnOidcXHUyMjQ4JywndGhrc2ltJzonXFx1MjIzQycsJ3Rob3JuJzonXFx4RkUnLCdUSE9STic6J1xceERFJywndGlsZGUnOidcXHUwMkRDJywnVGlsZGUnOidcXHUyMjNDJywnVGlsZGVFcXVhbCc6J1xcdTIyNDMnLCdUaWxkZUZ1bGxFcXVhbCc6J1xcdTIyNDUnLCdUaWxkZVRpbGRlJzonXFx1MjI0OCcsJ3RpbWVzJzonXFx4RDcnLCd0aW1lc2InOidcXHUyMkEwJywndGltZXNiYXInOidcXHUyQTMxJywndGltZXNkJzonXFx1MkEzMCcsJ3RpbnQnOidcXHUyMjJEJywndG9lYSc6J1xcdTI5MjgnLCd0b3AnOidcXHUyMkE0JywndG9wYm90JzonXFx1MjMzNicsJ3RvcGNpcic6J1xcdTJBRjEnLCd0b3BmJzonXFx1RDgzNVxcdURENjUnLCdUb3BmJzonXFx1RDgzNVxcdURENEInLCd0b3Bmb3JrJzonXFx1MkFEQScsJ3Rvc2EnOidcXHUyOTI5JywndHByaW1lJzonXFx1MjAzNCcsJ3RyYWRlJzonXFx1MjEyMicsJ1RSQURFJzonXFx1MjEyMicsJ3RyaWFuZ2xlJzonXFx1MjVCNScsJ3RyaWFuZ2xlZG93bic6J1xcdTI1QkYnLCd0cmlhbmdsZWxlZnQnOidcXHUyNUMzJywndHJpYW5nbGVsZWZ0ZXEnOidcXHUyMkI0JywndHJpYW5nbGVxJzonXFx1MjI1QycsJ3RyaWFuZ2xlcmlnaHQnOidcXHUyNUI5JywndHJpYW5nbGVyaWdodGVxJzonXFx1MjJCNScsJ3RyaWRvdCc6J1xcdTI1RUMnLCd0cmllJzonXFx1MjI1QycsJ3RyaW1pbnVzJzonXFx1MkEzQScsJ1RyaXBsZURvdCc6J1xcdTIwREInLCd0cmlwbHVzJzonXFx1MkEzOScsJ3RyaXNiJzonXFx1MjlDRCcsJ3RyaXRpbWUnOidcXHUyQTNCJywndHJwZXppdW0nOidcXHUyM0UyJywndHNjcic6J1xcdUQ4MzVcXHVEQ0M5JywnVHNjcic6J1xcdUQ4MzVcXHVEQ0FGJywndHNjeSc6J1xcdTA0NDYnLCdUU2N5JzonXFx1MDQyNicsJ3RzaGN5JzonXFx1MDQ1QicsJ1RTSGN5JzonXFx1MDQwQicsJ3RzdHJvayc6J1xcdTAxNjcnLCdUc3Ryb2snOidcXHUwMTY2JywndHdpeHQnOidcXHUyMjZDJywndHdvaGVhZGxlZnRhcnJvdyc6J1xcdTIxOUUnLCd0d29oZWFkcmlnaHRhcnJvdyc6J1xcdTIxQTAnLCd1YWN1dGUnOidcXHhGQScsJ1VhY3V0ZSc6J1xceERBJywndWFycic6J1xcdTIxOTEnLCd1QXJyJzonXFx1MjFEMScsJ1VhcnInOidcXHUyMTlGJywnVWFycm9jaXInOidcXHUyOTQ5JywndWJyY3knOidcXHUwNDVFJywnVWJyY3knOidcXHUwNDBFJywndWJyZXZlJzonXFx1MDE2RCcsJ1VicmV2ZSc6J1xcdTAxNkMnLCd1Y2lyYyc6J1xceEZCJywnVWNpcmMnOidcXHhEQicsJ3VjeSc6J1xcdTA0NDMnLCdVY3knOidcXHUwNDIzJywndWRhcnInOidcXHUyMUM1JywndWRibGFjJzonXFx1MDE3MScsJ1VkYmxhYyc6J1xcdTAxNzAnLCd1ZGhhcic6J1xcdTI5NkUnLCd1ZmlzaHQnOidcXHUyOTdFJywndWZyJzonXFx1RDgzNVxcdUREMzInLCdVZnInOidcXHVEODM1XFx1REQxOCcsJ3VncmF2ZSc6J1xceEY5JywnVWdyYXZlJzonXFx4RDknLCd1SGFyJzonXFx1Mjk2MycsJ3VoYXJsJzonXFx1MjFCRicsJ3VoYXJyJzonXFx1MjFCRScsJ3VoYmxrJzonXFx1MjU4MCcsJ3VsY29ybic6J1xcdTIzMUMnLCd1bGNvcm5lcic6J1xcdTIzMUMnLCd1bGNyb3AnOidcXHUyMzBGJywndWx0cmknOidcXHUyNUY4JywndW1hY3InOidcXHUwMTZCJywnVW1hY3InOidcXHUwMTZBJywndW1sJzonXFx4QTgnLCdVbmRlckJhcic6J18nLCdVbmRlckJyYWNlJzonXFx1MjNERicsJ1VuZGVyQnJhY2tldCc6J1xcdTIzQjUnLCdVbmRlclBhcmVudGhlc2lzJzonXFx1MjNERCcsJ1VuaW9uJzonXFx1MjJDMycsJ1VuaW9uUGx1cyc6J1xcdTIyOEUnLCd1b2dvbic6J1xcdTAxNzMnLCdVb2dvbic6J1xcdTAxNzInLCd1b3BmJzonXFx1RDgzNVxcdURENjYnLCdVb3BmJzonXFx1RDgzNVxcdURENEMnLCd1cGFycm93JzonXFx1MjE5MScsJ1VwYXJyb3cnOidcXHUyMUQxJywnVXBBcnJvdyc6J1xcdTIxOTEnLCdVcEFycm93QmFyJzonXFx1MjkxMicsJ1VwQXJyb3dEb3duQXJyb3cnOidcXHUyMUM1JywndXBkb3duYXJyb3cnOidcXHUyMTk1JywnVXBkb3duYXJyb3cnOidcXHUyMUQ1JywnVXBEb3duQXJyb3cnOidcXHUyMTk1JywnVXBFcXVpbGlicml1bSc6J1xcdTI5NkUnLCd1cGhhcnBvb25sZWZ0JzonXFx1MjFCRicsJ3VwaGFycG9vbnJpZ2h0JzonXFx1MjFCRScsJ3VwbHVzJzonXFx1MjI4RScsJ1VwcGVyTGVmdEFycm93JzonXFx1MjE5NicsJ1VwcGVyUmlnaHRBcnJvdyc6J1xcdTIxOTcnLCd1cHNpJzonXFx1MDNDNScsJ1Vwc2knOidcXHUwM0QyJywndXBzaWgnOidcXHUwM0QyJywndXBzaWxvbic6J1xcdTAzQzUnLCdVcHNpbG9uJzonXFx1MDNBNScsJ1VwVGVlJzonXFx1MjJBNScsJ1VwVGVlQXJyb3cnOidcXHUyMUE1JywndXB1cGFycm93cyc6J1xcdTIxQzgnLCd1cmNvcm4nOidcXHUyMzFEJywndXJjb3JuZXInOidcXHUyMzFEJywndXJjcm9wJzonXFx1MjMwRScsJ3VyaW5nJzonXFx1MDE2RicsJ1VyaW5nJzonXFx1MDE2RScsJ3VydHJpJzonXFx1MjVGOScsJ3VzY3InOidcXHVEODM1XFx1RENDQScsJ1VzY3InOidcXHVEODM1XFx1RENCMCcsJ3V0ZG90JzonXFx1MjJGMCcsJ3V0aWxkZSc6J1xcdTAxNjknLCdVdGlsZGUnOidcXHUwMTY4JywndXRyaSc6J1xcdTI1QjUnLCd1dHJpZic6J1xcdTI1QjQnLCd1dWFycic6J1xcdTIxQzgnLCd1dW1sJzonXFx4RkMnLCdVdW1sJzonXFx4REMnLCd1d2FuZ2xlJzonXFx1MjlBNycsJ3ZhbmdydCc6J1xcdTI5OUMnLCd2YXJlcHNpbG9uJzonXFx1MDNGNScsJ3ZhcmthcHBhJzonXFx1MDNGMCcsJ3Zhcm5vdGhpbmcnOidcXHUyMjA1JywndmFycGhpJzonXFx1MDNENScsJ3ZhcnBpJzonXFx1MDNENicsJ3ZhcnByb3B0byc6J1xcdTIyMUQnLCd2YXJyJzonXFx1MjE5NScsJ3ZBcnInOidcXHUyMUQ1JywndmFycmhvJzonXFx1MDNGMScsJ3ZhcnNpZ21hJzonXFx1MDNDMicsJ3ZhcnN1YnNldG5lcSc6J1xcdTIyOEFcXHVGRTAwJywndmFyc3Vic2V0bmVxcSc6J1xcdTJBQ0JcXHVGRTAwJywndmFyc3Vwc2V0bmVxJzonXFx1MjI4QlxcdUZFMDAnLCd2YXJzdXBzZXRuZXFxJzonXFx1MkFDQ1xcdUZFMDAnLCd2YXJ0aGV0YSc6J1xcdTAzRDEnLCd2YXJ0cmlhbmdsZWxlZnQnOidcXHUyMkIyJywndmFydHJpYW5nbGVyaWdodCc6J1xcdTIyQjMnLCd2QmFyJzonXFx1MkFFOCcsJ1ZiYXInOidcXHUyQUVCJywndkJhcnYnOidcXHUyQUU5JywndmN5JzonXFx1MDQzMicsJ1ZjeSc6J1xcdTA0MTInLCd2ZGFzaCc6J1xcdTIyQTInLCd2RGFzaCc6J1xcdTIyQTgnLCdWZGFzaCc6J1xcdTIyQTknLCdWRGFzaCc6J1xcdTIyQUInLCdWZGFzaGwnOidcXHUyQUU2JywndmVlJzonXFx1MjIyOCcsJ1ZlZSc6J1xcdTIyQzEnLCd2ZWViYXInOidcXHUyMkJCJywndmVlZXEnOidcXHUyMjVBJywndmVsbGlwJzonXFx1MjJFRScsJ3ZlcmJhcic6J3wnLCdWZXJiYXInOidcXHUyMDE2JywndmVydCc6J3wnLCdWZXJ0JzonXFx1MjAxNicsJ1ZlcnRpY2FsQmFyJzonXFx1MjIyMycsJ1ZlcnRpY2FsTGluZSc6J3wnLCdWZXJ0aWNhbFNlcGFyYXRvcic6J1xcdTI3NTgnLCdWZXJ0aWNhbFRpbGRlJzonXFx1MjI0MCcsJ1ZlcnlUaGluU3BhY2UnOidcXHUyMDBBJywndmZyJzonXFx1RDgzNVxcdUREMzMnLCdWZnInOidcXHVEODM1XFx1REQxOScsJ3ZsdHJpJzonXFx1MjJCMicsJ3Zuc3ViJzonXFx1MjI4MlxcdTIwRDInLCd2bnN1cCc6J1xcdTIyODNcXHUyMEQyJywndm9wZic6J1xcdUQ4MzVcXHVERDY3JywnVm9wZic6J1xcdUQ4MzVcXHVERDREJywndnByb3AnOidcXHUyMjFEJywndnJ0cmknOidcXHUyMkIzJywndnNjcic6J1xcdUQ4MzVcXHVEQ0NCJywnVnNjcic6J1xcdUQ4MzVcXHVEQ0IxJywndnN1Ym5lJzonXFx1MjI4QVxcdUZFMDAnLCd2c3VibkUnOidcXHUyQUNCXFx1RkUwMCcsJ3ZzdXBuZSc6J1xcdTIyOEJcXHVGRTAwJywndnN1cG5FJzonXFx1MkFDQ1xcdUZFMDAnLCdWdmRhc2gnOidcXHUyMkFBJywndnppZ3phZyc6J1xcdTI5OUEnLCd3Y2lyYyc6J1xcdTAxNzUnLCdXY2lyYyc6J1xcdTAxNzQnLCd3ZWRiYXInOidcXHUyQTVGJywnd2VkZ2UnOidcXHUyMjI3JywnV2VkZ2UnOidcXHUyMkMwJywnd2VkZ2VxJzonXFx1MjI1OScsJ3dlaWVycCc6J1xcdTIxMTgnLCd3ZnInOidcXHVEODM1XFx1REQzNCcsJ1dmcic6J1xcdUQ4MzVcXHVERDFBJywnd29wZic6J1xcdUQ4MzVcXHVERDY4JywnV29wZic6J1xcdUQ4MzVcXHVERDRFJywnd3AnOidcXHUyMTE4Jywnd3InOidcXHUyMjQwJywnd3JlYXRoJzonXFx1MjI0MCcsJ3dzY3InOidcXHVEODM1XFx1RENDQycsJ1dzY3InOidcXHVEODM1XFx1RENCMicsJ3hjYXAnOidcXHUyMkMyJywneGNpcmMnOidcXHUyNUVGJywneGN1cCc6J1xcdTIyQzMnLCd4ZHRyaSc6J1xcdTI1QkQnLCd4ZnInOidcXHVEODM1XFx1REQzNScsJ1hmcic6J1xcdUQ4MzVcXHVERDFCJywneGhhcnInOidcXHUyN0Y3JywneGhBcnInOidcXHUyN0ZBJywneGknOidcXHUwM0JFJywnWGknOidcXHUwMzlFJywneGxhcnInOidcXHUyN0Y1JywneGxBcnInOidcXHUyN0Y4JywneG1hcCc6J1xcdTI3RkMnLCd4bmlzJzonXFx1MjJGQicsJ3hvZG90JzonXFx1MkEwMCcsJ3hvcGYnOidcXHVEODM1XFx1REQ2OScsJ1hvcGYnOidcXHVEODM1XFx1REQ0RicsJ3hvcGx1cyc6J1xcdTJBMDEnLCd4b3RpbWUnOidcXHUyQTAyJywneHJhcnInOidcXHUyN0Y2JywneHJBcnInOidcXHUyN0Y5JywneHNjcic6J1xcdUQ4MzVcXHVEQ0NEJywnWHNjcic6J1xcdUQ4MzVcXHVEQ0IzJywneHNxY3VwJzonXFx1MkEwNicsJ3h1cGx1cyc6J1xcdTJBMDQnLCd4dXRyaSc6J1xcdTI1QjMnLCd4dmVlJzonXFx1MjJDMScsJ3h3ZWRnZSc6J1xcdTIyQzAnLCd5YWN1dGUnOidcXHhGRCcsJ1lhY3V0ZSc6J1xceEREJywneWFjeSc6J1xcdTA0NEYnLCdZQWN5JzonXFx1MDQyRicsJ3ljaXJjJzonXFx1MDE3NycsJ1ljaXJjJzonXFx1MDE3NicsJ3ljeSc6J1xcdTA0NEInLCdZY3knOidcXHUwNDJCJywneWVuJzonXFx4QTUnLCd5ZnInOidcXHVEODM1XFx1REQzNicsJ1lmcic6J1xcdUQ4MzVcXHVERDFDJywneWljeSc6J1xcdTA0NTcnLCdZSWN5JzonXFx1MDQwNycsJ3lvcGYnOidcXHVEODM1XFx1REQ2QScsJ1lvcGYnOidcXHVEODM1XFx1REQ1MCcsJ3lzY3InOidcXHVEODM1XFx1RENDRScsJ1lzY3InOidcXHVEODM1XFx1RENCNCcsJ3l1Y3knOidcXHUwNDRFJywnWVVjeSc6J1xcdTA0MkUnLCd5dW1sJzonXFx4RkYnLCdZdW1sJzonXFx1MDE3OCcsJ3phY3V0ZSc6J1xcdTAxN0EnLCdaYWN1dGUnOidcXHUwMTc5JywnemNhcm9uJzonXFx1MDE3RScsJ1pjYXJvbic6J1xcdTAxN0QnLCd6Y3knOidcXHUwNDM3JywnWmN5JzonXFx1MDQxNycsJ3pkb3QnOidcXHUwMTdDJywnWmRvdCc6J1xcdTAxN0InLCd6ZWV0cmYnOidcXHUyMTI4JywnWmVyb1dpZHRoU3BhY2UnOidcXHUyMDBCJywnemV0YSc6J1xcdTAzQjYnLCdaZXRhJzonXFx1MDM5NicsJ3pmcic6J1xcdUQ4MzVcXHVERDM3JywnWmZyJzonXFx1MjEyOCcsJ3poY3knOidcXHUwNDM2JywnWkhjeSc6J1xcdTA0MTYnLCd6aWdyYXJyJzonXFx1MjFERCcsJ3pvcGYnOidcXHVEODM1XFx1REQ2QicsJ1pvcGYnOidcXHUyMTI0JywnenNjcic6J1xcdUQ4MzVcXHVEQ0NGJywnWnNjcic6J1xcdUQ4MzVcXHVEQ0I1JywnendqJzonXFx1MjAwRCcsJ3p3bmonOidcXHUyMDBDJ307XG5cdHZhciBkZWNvZGVNYXBMZWdhY3kgPSB7J2FhY3V0ZSc6J1xceEUxJywnQWFjdXRlJzonXFx4QzEnLCdhY2lyYyc6J1xceEUyJywnQWNpcmMnOidcXHhDMicsJ2FjdXRlJzonXFx4QjQnLCdhZWxpZyc6J1xceEU2JywnQUVsaWcnOidcXHhDNicsJ2FncmF2ZSc6J1xceEUwJywnQWdyYXZlJzonXFx4QzAnLCdhbXAnOicmJywnQU1QJzonJicsJ2FyaW5nJzonXFx4RTUnLCdBcmluZyc6J1xceEM1JywnYXRpbGRlJzonXFx4RTMnLCdBdGlsZGUnOidcXHhDMycsJ2F1bWwnOidcXHhFNCcsJ0F1bWwnOidcXHhDNCcsJ2JydmJhcic6J1xceEE2JywnY2NlZGlsJzonXFx4RTcnLCdDY2VkaWwnOidcXHhDNycsJ2NlZGlsJzonXFx4QjgnLCdjZW50JzonXFx4QTInLCdjb3B5JzonXFx4QTknLCdDT1BZJzonXFx4QTknLCdjdXJyZW4nOidcXHhBNCcsJ2RlZyc6J1xceEIwJywnZGl2aWRlJzonXFx4RjcnLCdlYWN1dGUnOidcXHhFOScsJ0VhY3V0ZSc6J1xceEM5JywnZWNpcmMnOidcXHhFQScsJ0VjaXJjJzonXFx4Q0EnLCdlZ3JhdmUnOidcXHhFOCcsJ0VncmF2ZSc6J1xceEM4JywnZXRoJzonXFx4RjAnLCdFVEgnOidcXHhEMCcsJ2V1bWwnOidcXHhFQicsJ0V1bWwnOidcXHhDQicsJ2ZyYWMxMic6J1xceEJEJywnZnJhYzE0JzonXFx4QkMnLCdmcmFjMzQnOidcXHhCRScsJ2d0JzonPicsJ0dUJzonPicsJ2lhY3V0ZSc6J1xceEVEJywnSWFjdXRlJzonXFx4Q0QnLCdpY2lyYyc6J1xceEVFJywnSWNpcmMnOidcXHhDRScsJ2lleGNsJzonXFx4QTEnLCdpZ3JhdmUnOidcXHhFQycsJ0lncmF2ZSc6J1xceENDJywnaXF1ZXN0JzonXFx4QkYnLCdpdW1sJzonXFx4RUYnLCdJdW1sJzonXFx4Q0YnLCdsYXF1byc6J1xceEFCJywnbHQnOic8JywnTFQnOic8JywnbWFjcic6J1xceEFGJywnbWljcm8nOidcXHhCNScsJ21pZGRvdCc6J1xceEI3JywnbmJzcCc6J1xceEEwJywnbm90JzonXFx4QUMnLCdudGlsZGUnOidcXHhGMScsJ050aWxkZSc6J1xceEQxJywnb2FjdXRlJzonXFx4RjMnLCdPYWN1dGUnOidcXHhEMycsJ29jaXJjJzonXFx4RjQnLCdPY2lyYyc6J1xceEQ0Jywnb2dyYXZlJzonXFx4RjInLCdPZ3JhdmUnOidcXHhEMicsJ29yZGYnOidcXHhBQScsJ29yZG0nOidcXHhCQScsJ29zbGFzaCc6J1xceEY4JywnT3NsYXNoJzonXFx4RDgnLCdvdGlsZGUnOidcXHhGNScsJ090aWxkZSc6J1xceEQ1Jywnb3VtbCc6J1xceEY2JywnT3VtbCc6J1xceEQ2JywncGFyYSc6J1xceEI2JywncGx1c21uJzonXFx4QjEnLCdwb3VuZCc6J1xceEEzJywncXVvdCc6J1wiJywnUVVPVCc6J1wiJywncmFxdW8nOidcXHhCQicsJ3JlZyc6J1xceEFFJywnUkVHJzonXFx4QUUnLCdzZWN0JzonXFx4QTcnLCdzaHknOidcXHhBRCcsJ3N1cDEnOidcXHhCOScsJ3N1cDInOidcXHhCMicsJ3N1cDMnOidcXHhCMycsJ3N6bGlnJzonXFx4REYnLCd0aG9ybic6J1xceEZFJywnVEhPUk4nOidcXHhERScsJ3RpbWVzJzonXFx4RDcnLCd1YWN1dGUnOidcXHhGQScsJ1VhY3V0ZSc6J1xceERBJywndWNpcmMnOidcXHhGQicsJ1VjaXJjJzonXFx4REInLCd1Z3JhdmUnOidcXHhGOScsJ1VncmF2ZSc6J1xceEQ5JywndW1sJzonXFx4QTgnLCd1dW1sJzonXFx4RkMnLCdVdW1sJzonXFx4REMnLCd5YWN1dGUnOidcXHhGRCcsJ1lhY3V0ZSc6J1xceEREJywneWVuJzonXFx4QTUnLCd5dW1sJzonXFx4RkYnfTtcblx0dmFyIGRlY29kZU1hcE51bWVyaWMgPSB7JzAnOidcXHVGRkZEJywnMTI4JzonXFx1MjBBQycsJzEzMCc6J1xcdTIwMUEnLCcxMzEnOidcXHUwMTkyJywnMTMyJzonXFx1MjAxRScsJzEzMyc6J1xcdTIwMjYnLCcxMzQnOidcXHUyMDIwJywnMTM1JzonXFx1MjAyMScsJzEzNic6J1xcdTAyQzYnLCcxMzcnOidcXHUyMDMwJywnMTM4JzonXFx1MDE2MCcsJzEzOSc6J1xcdTIwMzknLCcxNDAnOidcXHUwMTUyJywnMTQyJzonXFx1MDE3RCcsJzE0NSc6J1xcdTIwMTgnLCcxNDYnOidcXHUyMDE5JywnMTQ3JzonXFx1MjAxQycsJzE0OCc6J1xcdTIwMUQnLCcxNDknOidcXHUyMDIyJywnMTUwJzonXFx1MjAxMycsJzE1MSc6J1xcdTIwMTQnLCcxNTInOidcXHUwMkRDJywnMTUzJzonXFx1MjEyMicsJzE1NCc6J1xcdTAxNjEnLCcxNTUnOidcXHUyMDNBJywnMTU2JzonXFx1MDE1MycsJzE1OCc6J1xcdTAxN0UnLCcxNTknOidcXHUwMTc4J307XG5cdHZhciBpbnZhbGlkUmVmZXJlbmNlQ29kZVBvaW50cyA9IFsxLDIsMyw0LDUsNiw3LDgsMTEsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMTI3LDEyOCwxMjksMTMwLDEzMSwxMzIsMTMzLDEzNCwxMzUsMTM2LDEzNywxMzgsMTM5LDE0MCwxNDEsMTQyLDE0MywxNDQsMTQ1LDE0NiwxNDcsMTQ4LDE0OSwxNTAsMTUxLDE1MiwxNTMsMTU0LDE1NSwxNTYsMTU3LDE1OCwxNTksNjQ5NzYsNjQ5NzcsNjQ5NzgsNjQ5NzksNjQ5ODAsNjQ5ODEsNjQ5ODIsNjQ5ODMsNjQ5ODQsNjQ5ODUsNjQ5ODYsNjQ5ODcsNjQ5ODgsNjQ5ODksNjQ5OTAsNjQ5OTEsNjQ5OTIsNjQ5OTMsNjQ5OTQsNjQ5OTUsNjQ5OTYsNjQ5OTcsNjQ5OTgsNjQ5OTksNjUwMDAsNjUwMDEsNjUwMDIsNjUwMDMsNjUwMDQsNjUwMDUsNjUwMDYsNjUwMDcsNjU1MzQsNjU1MzUsMTMxMDcwLDEzMTA3MSwxOTY2MDYsMTk2NjA3LDI2MjE0MiwyNjIxNDMsMzI3Njc4LDMyNzY3OSwzOTMyMTQsMzkzMjE1LDQ1ODc1MCw0NTg3NTEsNTI0Mjg2LDUyNDI4Nyw1ODk4MjIsNTg5ODIzLDY1NTM1OCw2NTUzNTksNzIwODk0LDcyMDg5NSw3ODY0MzAsNzg2NDMxLDg1MTk2Niw4NTE5NjcsOTE3NTAyLDkxNzUwMyw5ODMwMzgsOTgzMDM5LDEwNDg1NzQsMTA0ODU3NSwxMTE0MTEwLDExMTQxMTFdO1xuXG5cdC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5cdHZhciBzdHJpbmdGcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlO1xuXG5cdHZhciBvYmplY3QgPSB7fTtcblx0dmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0Lmhhc093blByb3BlcnR5O1xuXHR2YXIgaGFzID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eU5hbWUpIHtcblx0XHRyZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5TmFtZSk7XG5cdH07XG5cblx0dmFyIGNvbnRhaW5zID0gZnVuY3Rpb24oYXJyYXksIHZhbHVlKSB7XG5cdFx0dmFyIGluZGV4ID0gLTE7XG5cdFx0dmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblx0XHR3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuXHRcdFx0aWYgKGFycmF5W2luZGV4XSA9PSB2YWx1ZSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9O1xuXG5cdHZhciBtZXJnZSA9IGZ1bmN0aW9uKG9wdGlvbnMsIGRlZmF1bHRzKSB7XG5cdFx0aWYgKCFvcHRpb25zKSB7XG5cdFx0XHRyZXR1cm4gZGVmYXVsdHM7XG5cdFx0fVxuXHRcdHZhciByZXN1bHQgPSB7fTtcblx0XHR2YXIga2V5O1xuXHRcdGZvciAoa2V5IGluIGRlZmF1bHRzKSB7XG5cdFx0XHQvLyBBIGBoYXNPd25Qcm9wZXJ0eWAgY2hlY2sgaXMgbm90IG5lZWRlZCBoZXJlLCBzaW5jZSBvbmx5IHJlY29nbml6ZWRcblx0XHRcdC8vIG9wdGlvbiBuYW1lcyBhcmUgdXNlZCBhbnl3YXkuIEFueSBvdGhlcnMgYXJlIGlnbm9yZWQuXG5cdFx0XHRyZXN1bHRba2V5XSA9IGhhcyhvcHRpb25zLCBrZXkpID8gb3B0aW9uc1trZXldIDogZGVmYXVsdHNba2V5XTtcblx0XHR9XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fTtcblxuXHQvLyBNb2RpZmllZCB2ZXJzaW9uIG9mIGB1Y3MyZW5jb2RlYDsgc2VlIGh0dHBzOi8vbXRocy5iZS9wdW55Y29kZS5cblx0dmFyIGNvZGVQb2ludFRvU3ltYm9sID0gZnVuY3Rpb24oY29kZVBvaW50LCBzdHJpY3QpIHtcblx0XHR2YXIgb3V0cHV0ID0gJyc7XG5cdFx0aWYgKChjb2RlUG9pbnQgPj0gMHhEODAwICYmIGNvZGVQb2ludCA8PSAweERGRkYpIHx8IGNvZGVQb2ludCA+IDB4MTBGRkZGKSB7XG5cdFx0XHQvLyBTZWUgaXNzdWUgIzQ6XG5cdFx0XHQvLyDigJxPdGhlcndpc2UsIGlmIHRoZSBudW1iZXIgaXMgaW4gdGhlIHJhbmdlIDB4RDgwMCB0byAweERGRkYgb3IgaXNcblx0XHRcdC8vIGdyZWF0ZXIgdGhhbiAweDEwRkZGRiwgdGhlbiB0aGlzIGlzIGEgcGFyc2UgZXJyb3IuIFJldHVybiBhIFUrRkZGRFxuXHRcdFx0Ly8gUkVQTEFDRU1FTlQgQ0hBUkFDVEVSLuKAnVxuXHRcdFx0aWYgKHN0cmljdCkge1xuXHRcdFx0XHRwYXJzZUVycm9yKCdjaGFyYWN0ZXIgcmVmZXJlbmNlIG91dHNpZGUgdGhlIHBlcm1pc3NpYmxlIFVuaWNvZGUgcmFuZ2UnKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiAnXFx1RkZGRCc7XG5cdFx0fVxuXHRcdGlmIChoYXMoZGVjb2RlTWFwTnVtZXJpYywgY29kZVBvaW50KSkge1xuXHRcdFx0aWYgKHN0cmljdCkge1xuXHRcdFx0XHRwYXJzZUVycm9yKCdkaXNhbGxvd2VkIGNoYXJhY3RlciByZWZlcmVuY2UnKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBkZWNvZGVNYXBOdW1lcmljW2NvZGVQb2ludF07XG5cdFx0fVxuXHRcdGlmIChzdHJpY3QgJiYgY29udGFpbnMoaW52YWxpZFJlZmVyZW5jZUNvZGVQb2ludHMsIGNvZGVQb2ludCkpIHtcblx0XHRcdHBhcnNlRXJyb3IoJ2Rpc2FsbG93ZWQgY2hhcmFjdGVyIHJlZmVyZW5jZScpO1xuXHRcdH1cblx0XHRpZiAoY29kZVBvaW50ID4gMHhGRkZGKSB7XG5cdFx0XHRjb2RlUG9pbnQgLT0gMHgxMDAwMDtcblx0XHRcdG91dHB1dCArPSBzdHJpbmdGcm9tQ2hhckNvZGUoY29kZVBvaW50ID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKTtcblx0XHRcdGNvZGVQb2ludCA9IDB4REMwMCB8IGNvZGVQb2ludCAmIDB4M0ZGO1xuXHRcdH1cblx0XHRvdXRwdXQgKz0gc3RyaW5nRnJvbUNoYXJDb2RlKGNvZGVQb2ludCk7XG5cdFx0cmV0dXJuIG91dHB1dDtcblx0fTtcblxuXHR2YXIgaGV4RXNjYXBlID0gZnVuY3Rpb24oY29kZVBvaW50KSB7XG5cdFx0cmV0dXJuICcmI3gnICsgY29kZVBvaW50LnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpICsgJzsnO1xuXHR9O1xuXG5cdHZhciBkZWNFc2NhcGUgPSBmdW5jdGlvbihjb2RlUG9pbnQpIHtcblx0XHRyZXR1cm4gJyYjJyArIGNvZGVQb2ludCArICc7Jztcblx0fTtcblxuXHR2YXIgcGFyc2VFcnJvciA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHtcblx0XHR0aHJvdyBFcnJvcignUGFyc2UgZXJyb3I6ICcgKyBtZXNzYWdlKTtcblx0fTtcblxuXHQvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuXHR2YXIgZW5jb2RlID0gZnVuY3Rpb24oc3RyaW5nLCBvcHRpb25zKSB7XG5cdFx0b3B0aW9ucyA9IG1lcmdlKG9wdGlvbnMsIGVuY29kZS5vcHRpb25zKTtcblx0XHR2YXIgc3RyaWN0ID0gb3B0aW9ucy5zdHJpY3Q7XG5cdFx0aWYgKHN0cmljdCAmJiByZWdleEludmFsaWRSYXdDb2RlUG9pbnQudGVzdChzdHJpbmcpKSB7XG5cdFx0XHRwYXJzZUVycm9yKCdmb3JiaWRkZW4gY29kZSBwb2ludCcpO1xuXHRcdH1cblx0XHR2YXIgZW5jb2RlRXZlcnl0aGluZyA9IG9wdGlvbnMuZW5jb2RlRXZlcnl0aGluZztcblx0XHR2YXIgdXNlTmFtZWRSZWZlcmVuY2VzID0gb3B0aW9ucy51c2VOYW1lZFJlZmVyZW5jZXM7XG5cdFx0dmFyIGFsbG93VW5zYWZlU3ltYm9scyA9IG9wdGlvbnMuYWxsb3dVbnNhZmVTeW1ib2xzO1xuXHRcdHZhciBlc2NhcGVDb2RlUG9pbnQgPSBvcHRpb25zLmRlY2ltYWwgPyBkZWNFc2NhcGUgOiBoZXhFc2NhcGU7XG5cblx0XHR2YXIgZXNjYXBlQm1wU3ltYm9sID0gZnVuY3Rpb24oc3ltYm9sKSB7XG5cdFx0XHRyZXR1cm4gZXNjYXBlQ29kZVBvaW50KHN5bWJvbC5jaGFyQ29kZUF0KDApKTtcblx0XHR9O1xuXG5cdFx0aWYgKGVuY29kZUV2ZXJ5dGhpbmcpIHtcblx0XHRcdC8vIEVuY29kZSBBU0NJSSBzeW1ib2xzLlxuXHRcdFx0c3RyaW5nID0gc3RyaW5nLnJlcGxhY2UocmVnZXhBc2NpaVdoaXRlbGlzdCwgZnVuY3Rpb24oc3ltYm9sKSB7XG5cdFx0XHRcdC8vIFVzZSBuYW1lZCByZWZlcmVuY2VzIGlmIHJlcXVlc3RlZCAmIHBvc3NpYmxlLlxuXHRcdFx0XHRpZiAodXNlTmFtZWRSZWZlcmVuY2VzICYmIGhhcyhlbmNvZGVNYXAsIHN5bWJvbCkpIHtcblx0XHRcdFx0XHRyZXR1cm4gJyYnICsgZW5jb2RlTWFwW3N5bWJvbF0gKyAnOyc7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGVzY2FwZUJtcFN5bWJvbChzeW1ib2wpO1xuXHRcdFx0fSk7XG5cdFx0XHQvLyBTaG9ydGVuIGEgZmV3IGVzY2FwZXMgdGhhdCByZXByZXNlbnQgdHdvIHN5bWJvbHMsIG9mIHdoaWNoIGF0IGxlYXN0IG9uZVxuXHRcdFx0Ly8gaXMgd2l0aGluIHRoZSBBU0NJSSByYW5nZS5cblx0XHRcdGlmICh1c2VOYW1lZFJlZmVyZW5jZXMpIHtcblx0XHRcdFx0c3RyaW5nID0gc3RyaW5nXG5cdFx0XHRcdFx0LnJlcGxhY2UoLyZndDtcXHUyMEQyL2csICcmbnZndDsnKVxuXHRcdFx0XHRcdC5yZXBsYWNlKC8mbHQ7XFx1MjBEMi9nLCAnJm52bHQ7Jylcblx0XHRcdFx0XHQucmVwbGFjZSgvJiN4NjY7JiN4NkE7L2csICcmZmpsaWc7Jyk7XG5cdFx0XHR9XG5cdFx0XHQvLyBFbmNvZGUgbm9uLUFTQ0lJIHN5bWJvbHMuXG5cdFx0XHRpZiAodXNlTmFtZWRSZWZlcmVuY2VzKSB7XG5cdFx0XHRcdC8vIEVuY29kZSBub24tQVNDSUkgc3ltYm9scyB0aGF0IGNhbiBiZSByZXBsYWNlZCB3aXRoIGEgbmFtZWQgcmVmZXJlbmNlLlxuXHRcdFx0XHRzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShyZWdleEVuY29kZU5vbkFzY2lpLCBmdW5jdGlvbihzdHJpbmcpIHtcblx0XHRcdFx0XHQvLyBOb3RlOiB0aGVyZSBpcyBubyBuZWVkIHRvIGNoZWNrIGBoYXMoZW5jb2RlTWFwLCBzdHJpbmcpYCBoZXJlLlxuXHRcdFx0XHRcdHJldHVybiAnJicgKyBlbmNvZGVNYXBbc3RyaW5nXSArICc7Jztcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHQvLyBOb3RlOiBhbnkgcmVtYWluaW5nIG5vbi1BU0NJSSBzeW1ib2xzIGFyZSBoYW5kbGVkIG91dHNpZGUgb2YgdGhlIGBpZmAuXG5cdFx0fSBlbHNlIGlmICh1c2VOYW1lZFJlZmVyZW5jZXMpIHtcblx0XHRcdC8vIEFwcGx5IG5hbWVkIGNoYXJhY3RlciByZWZlcmVuY2VzLlxuXHRcdFx0Ly8gRW5jb2RlIGA8PlwiJyZgIHVzaW5nIG5hbWVkIGNoYXJhY3RlciByZWZlcmVuY2VzLlxuXHRcdFx0aWYgKCFhbGxvd1Vuc2FmZVN5bWJvbHMpIHtcblx0XHRcdFx0c3RyaW5nID0gc3RyaW5nLnJlcGxhY2UocmVnZXhFc2NhcGUsIGZ1bmN0aW9uKHN0cmluZykge1xuXHRcdFx0XHRcdHJldHVybiAnJicgKyBlbmNvZGVNYXBbc3RyaW5nXSArICc7JzsgLy8gbm8gbmVlZCB0byBjaGVjayBgaGFzKClgIGhlcmVcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHQvLyBTaG9ydGVuIGVzY2FwZXMgdGhhdCByZXByZXNlbnQgdHdvIHN5bWJvbHMsIG9mIHdoaWNoIGF0IGxlYXN0IG9uZSBpc1xuXHRcdFx0Ly8gYDw+XCInJmAuXG5cdFx0XHRzdHJpbmcgPSBzdHJpbmdcblx0XHRcdFx0LnJlcGxhY2UoLyZndDtcXHUyMEQyL2csICcmbnZndDsnKVxuXHRcdFx0XHQucmVwbGFjZSgvJmx0O1xcdTIwRDIvZywgJyZudmx0OycpO1xuXHRcdFx0Ly8gRW5jb2RlIG5vbi1BU0NJSSBzeW1ib2xzIHRoYXQgY2FuIGJlIHJlcGxhY2VkIHdpdGggYSBuYW1lZCByZWZlcmVuY2UuXG5cdFx0XHRzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShyZWdleEVuY29kZU5vbkFzY2lpLCBmdW5jdGlvbihzdHJpbmcpIHtcblx0XHRcdFx0Ly8gTm90ZTogdGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayBgaGFzKGVuY29kZU1hcCwgc3RyaW5nKWAgaGVyZS5cblx0XHRcdFx0cmV0dXJuICcmJyArIGVuY29kZU1hcFtzdHJpbmddICsgJzsnO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIGlmICghYWxsb3dVbnNhZmVTeW1ib2xzKSB7XG5cdFx0XHQvLyBFbmNvZGUgYDw+XCInJmAgdXNpbmcgaGV4YWRlY2ltYWwgZXNjYXBlcywgbm93IHRoYXQgdGhleeKAmXJlIG5vdCBoYW5kbGVkXG5cdFx0XHQvLyB1c2luZyBuYW1lZCBjaGFyYWN0ZXIgcmVmZXJlbmNlcy5cblx0XHRcdHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKHJlZ2V4RXNjYXBlLCBlc2NhcGVCbXBTeW1ib2wpO1xuXHRcdH1cblx0XHRyZXR1cm4gc3RyaW5nXG5cdFx0XHQvLyBFbmNvZGUgYXN0cmFsIHN5bWJvbHMuXG5cdFx0XHQucmVwbGFjZShyZWdleEFzdHJhbFN5bWJvbHMsIGZ1bmN0aW9uKCQwKSB7XG5cdFx0XHRcdC8vIGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nI3N1cnJvZ2F0ZS1mb3JtdWxhZVxuXHRcdFx0XHR2YXIgaGlnaCA9ICQwLmNoYXJDb2RlQXQoMCk7XG5cdFx0XHRcdHZhciBsb3cgPSAkMC5jaGFyQ29kZUF0KDEpO1xuXHRcdFx0XHR2YXIgY29kZVBvaW50ID0gKGhpZ2ggLSAweEQ4MDApICogMHg0MDAgKyBsb3cgLSAweERDMDAgKyAweDEwMDAwO1xuXHRcdFx0XHRyZXR1cm4gZXNjYXBlQ29kZVBvaW50KGNvZGVQb2ludCk7XG5cdFx0XHR9KVxuXHRcdFx0Ly8gRW5jb2RlIGFueSByZW1haW5pbmcgQk1QIHN5bWJvbHMgdGhhdCBhcmUgbm90IHByaW50YWJsZSBBU0NJSSBzeW1ib2xzXG5cdFx0XHQvLyB1c2luZyBhIGhleGFkZWNpbWFsIGVzY2FwZS5cblx0XHRcdC5yZXBsYWNlKHJlZ2V4Qm1wV2hpdGVsaXN0LCBlc2NhcGVCbXBTeW1ib2wpO1xuXHR9O1xuXHQvLyBFeHBvc2UgZGVmYXVsdCBvcHRpb25zIChzbyB0aGV5IGNhbiBiZSBvdmVycmlkZGVuIGdsb2JhbGx5KS5cblx0ZW5jb2RlLm9wdGlvbnMgPSB7XG5cdFx0J2FsbG93VW5zYWZlU3ltYm9scyc6IGZhbHNlLFxuXHRcdCdlbmNvZGVFdmVyeXRoaW5nJzogZmFsc2UsXG5cdFx0J3N0cmljdCc6IGZhbHNlLFxuXHRcdCd1c2VOYW1lZFJlZmVyZW5jZXMnOiBmYWxzZSxcblx0XHQnZGVjaW1hbCcgOiBmYWxzZVxuXHR9O1xuXG5cdHZhciBkZWNvZGUgPSBmdW5jdGlvbihodG1sLCBvcHRpb25zKSB7XG5cdFx0b3B0aW9ucyA9IG1lcmdlKG9wdGlvbnMsIGRlY29kZS5vcHRpb25zKTtcblx0XHR2YXIgc3RyaWN0ID0gb3B0aW9ucy5zdHJpY3Q7XG5cdFx0aWYgKHN0cmljdCAmJiByZWdleEludmFsaWRFbnRpdHkudGVzdChodG1sKSkge1xuXHRcdFx0cGFyc2VFcnJvcignbWFsZm9ybWVkIGNoYXJhY3RlciByZWZlcmVuY2UnKTtcblx0XHR9XG5cdFx0cmV0dXJuIGh0bWwucmVwbGFjZShyZWdleERlY29kZSwgZnVuY3Rpb24oJDAsICQxLCAkMiwgJDMsICQ0LCAkNSwgJDYsICQ3LCAkOCkge1xuXHRcdFx0dmFyIGNvZGVQb2ludDtcblx0XHRcdHZhciBzZW1pY29sb247XG5cdFx0XHR2YXIgZGVjRGlnaXRzO1xuXHRcdFx0dmFyIGhleERpZ2l0cztcblx0XHRcdHZhciByZWZlcmVuY2U7XG5cdFx0XHR2YXIgbmV4dDtcblxuXHRcdFx0aWYgKCQxKSB7XG5cdFx0XHRcdHJlZmVyZW5jZSA9ICQxO1xuXHRcdFx0XHQvLyBOb3RlOiB0aGVyZSBpcyBubyBuZWVkIHRvIGNoZWNrIGBoYXMoZGVjb2RlTWFwLCByZWZlcmVuY2UpYC5cblx0XHRcdFx0cmV0dXJuIGRlY29kZU1hcFtyZWZlcmVuY2VdO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoJDIpIHtcblx0XHRcdFx0Ly8gRGVjb2RlIG5hbWVkIGNoYXJhY3RlciByZWZlcmVuY2VzIHdpdGhvdXQgdHJhaWxpbmcgYDtgLCBlLmcuIGAmYW1wYC5cblx0XHRcdFx0Ly8gVGhpcyBpcyBvbmx5IGEgcGFyc2UgZXJyb3IgaWYgaXQgZ2V0cyBjb252ZXJ0ZWQgdG8gYCZgLCBvciBpZiBpdCBpc1xuXHRcdFx0XHQvLyBmb2xsb3dlZCBieSBgPWAgaW4gYW4gYXR0cmlidXRlIGNvbnRleHQuXG5cdFx0XHRcdHJlZmVyZW5jZSA9ICQyO1xuXHRcdFx0XHRuZXh0ID0gJDM7XG5cdFx0XHRcdGlmIChuZXh0ICYmIG9wdGlvbnMuaXNBdHRyaWJ1dGVWYWx1ZSkge1xuXHRcdFx0XHRcdGlmIChzdHJpY3QgJiYgbmV4dCA9PSAnPScpIHtcblx0XHRcdFx0XHRcdHBhcnNlRXJyb3IoJ2AmYCBkaWQgbm90IHN0YXJ0IGEgY2hhcmFjdGVyIHJlZmVyZW5jZScpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gJDA7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aWYgKHN0cmljdCkge1xuXHRcdFx0XHRcdFx0cGFyc2VFcnJvcihcblx0XHRcdFx0XHRcdFx0J25hbWVkIGNoYXJhY3RlciByZWZlcmVuY2Ugd2FzIG5vdCB0ZXJtaW5hdGVkIGJ5IGEgc2VtaWNvbG9uJ1xuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gTm90ZTogdGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayBgaGFzKGRlY29kZU1hcExlZ2FjeSwgcmVmZXJlbmNlKWAuXG5cdFx0XHRcdFx0cmV0dXJuIGRlY29kZU1hcExlZ2FjeVtyZWZlcmVuY2VdICsgKG5leHQgfHwgJycpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICgkNCkge1xuXHRcdFx0XHQvLyBEZWNvZGUgZGVjaW1hbCBlc2NhcGVzLCBlLmcuIGAmIzExOTU1ODtgLlxuXHRcdFx0XHRkZWNEaWdpdHMgPSAkNDtcblx0XHRcdFx0c2VtaWNvbG9uID0gJDU7XG5cdFx0XHRcdGlmIChzdHJpY3QgJiYgIXNlbWljb2xvbikge1xuXHRcdFx0XHRcdHBhcnNlRXJyb3IoJ2NoYXJhY3RlciByZWZlcmVuY2Ugd2FzIG5vdCB0ZXJtaW5hdGVkIGJ5IGEgc2VtaWNvbG9uJyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29kZVBvaW50ID0gcGFyc2VJbnQoZGVjRGlnaXRzLCAxMCk7XG5cdFx0XHRcdHJldHVybiBjb2RlUG9pbnRUb1N5bWJvbChjb2RlUG9pbnQsIHN0cmljdCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICgkNikge1xuXHRcdFx0XHQvLyBEZWNvZGUgaGV4YWRlY2ltYWwgZXNjYXBlcywgZS5nLiBgJiN4MUQzMDY7YC5cblx0XHRcdFx0aGV4RGlnaXRzID0gJDY7XG5cdFx0XHRcdHNlbWljb2xvbiA9ICQ3O1xuXHRcdFx0XHRpZiAoc3RyaWN0ICYmICFzZW1pY29sb24pIHtcblx0XHRcdFx0XHRwYXJzZUVycm9yKCdjaGFyYWN0ZXIgcmVmZXJlbmNlIHdhcyBub3QgdGVybWluYXRlZCBieSBhIHNlbWljb2xvbicpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvZGVQb2ludCA9IHBhcnNlSW50KGhleERpZ2l0cywgMTYpO1xuXHRcdFx0XHRyZXR1cm4gY29kZVBvaW50VG9TeW1ib2woY29kZVBvaW50LCBzdHJpY3QpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiB3ZeKAmXJlIHN0aWxsIGhlcmUsIGBpZiAoJDcpYCBpcyBpbXBsaWVkOyBpdOKAmXMgYW4gYW1iaWd1b3VzXG5cdFx0XHQvLyBhbXBlcnNhbmQgZm9yIHN1cmUuIGh0dHBzOi8vbXRocy5iZS9ub3Rlcy9hbWJpZ3VvdXMtYW1wZXJzYW5kc1xuXHRcdFx0aWYgKHN0cmljdCkge1xuXHRcdFx0XHRwYXJzZUVycm9yKFxuXHRcdFx0XHRcdCduYW1lZCBjaGFyYWN0ZXIgcmVmZXJlbmNlIHdhcyBub3QgdGVybWluYXRlZCBieSBhIHNlbWljb2xvbidcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdHJldHVybiAkMDtcblx0XHR9KTtcblx0fTtcblx0Ly8gRXhwb3NlIGRlZmF1bHQgb3B0aW9ucyAoc28gdGhleSBjYW4gYmUgb3ZlcnJpZGRlbiBnbG9iYWxseSkuXG5cdGRlY29kZS5vcHRpb25zID0ge1xuXHRcdCdpc0F0dHJpYnV0ZVZhbHVlJzogZmFsc2UsXG5cdFx0J3N0cmljdCc6IGZhbHNlXG5cdH07XG5cblx0dmFyIGVzY2FwZSA9IGZ1bmN0aW9uKHN0cmluZykge1xuXHRcdHJldHVybiBzdHJpbmcucmVwbGFjZShyZWdleEVzY2FwZSwgZnVuY3Rpb24oJDApIHtcblx0XHRcdC8vIE5vdGU6IHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sgYGhhcyhlc2NhcGVNYXAsICQwKWAgaGVyZS5cblx0XHRcdHJldHVybiBlc2NhcGVNYXBbJDBdO1xuXHRcdH0pO1xuXHR9O1xuXG5cdC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5cdHZhciBoZSA9IHtcblx0XHQndmVyc2lvbic6ICcxLjIuMCcsXG5cdFx0J2VuY29kZSc6IGVuY29kZSxcblx0XHQnZGVjb2RlJzogZGVjb2RlLFxuXHRcdCdlc2NhcGUnOiBlc2NhcGUsXG5cdFx0J3VuZXNjYXBlJzogZGVjb2RlXG5cdH07XG5cblx0Ly8gU29tZSBBTUQgYnVpbGQgb3B0aW1pemVycywgbGlrZSByLmpzLCBjaGVjayBmb3Igc3BlY2lmaWMgY29uZGl0aW9uIHBhdHRlcm5zXG5cdC8vIGxpa2UgdGhlIGZvbGxvd2luZzpcblx0aWYgKFxuXHRcdHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdHR5cGVvZiBkZWZpbmUuYW1kID09ICdvYmplY3QnICYmXG5cdFx0ZGVmaW5lLmFtZFxuXHQpIHtcblx0XHRkZWZpbmUoZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gaGU7XG5cdFx0fSk7XG5cdH1cdGVsc2UgaWYgKGZyZWVFeHBvcnRzICYmICFmcmVlRXhwb3J0cy5ub2RlVHlwZSkge1xuXHRcdGlmIChmcmVlTW9kdWxlKSB7IC8vIGluIE5vZGUuanMsIGlvLmpzLCBvciBSaW5nb0pTIHYwLjguMCtcblx0XHRcdGZyZWVNb2R1bGUuZXhwb3J0cyA9IGhlO1xuXHRcdH0gZWxzZSB7IC8vIGluIE5hcndoYWwgb3IgUmluZ29KUyB2MC43LjAtXG5cdFx0XHRmb3IgKHZhciBrZXkgaW4gaGUpIHtcblx0XHRcdFx0aGFzKGhlLCBrZXkpICYmIChmcmVlRXhwb3J0c1trZXldID0gaGVba2V5XSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2UgeyAvLyBpbiBSaGlubyBvciBhIHdlYiBicm93c2VyXG5cdFx0cm9vdC5oZSA9IGhlO1xuXHR9XG5cbn0odGhpcykpO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBWYXJpb3VzIHV0aWxpdHkgZnVuY3Rpb25zIHVzZWQgdGhyb3VnaG91dCBNb2NoYSdzIGNvZGViYXNlLlxuICogQG1vZHVsZSB1dGlsc1xuICovXG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xudmFyIHBhdGggPSByZXF1aXJlKCdub2RlOnBhdGgnKTtcbnZhciB1dGlsID0gcmVxdWlyZSgnbm9kZTp1dGlsJyk7XG52YXIgaGUgPSByZXF1aXJlKCdoZScpO1xuXG5jb25zdCBNT0NIQV9JRF9QUk9QX05BTUUgPSAnX19tb2NoYV9pZF9fJztcblxuLyoqXG4gKiBJbmhlcml0IHRoZSBwcm90b3R5cGUgbWV0aG9kcyBmcm9tIG9uZSBjb25zdHJ1Y3RvciBpbnRvIGFub3RoZXIuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY3RvciAtIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHdoaWNoIG5lZWRzIHRvIGluaGVyaXQgdGhlXG4gKiAgICAgcHJvdG90eXBlLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gc3VwZXJDdG9yIC0gQ29uc3RydWN0b3IgZnVuY3Rpb24gdG8gaW5oZXJpdCBwcm90b3R5cGUgZnJvbS5cbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gaWYgZWl0aGVyIGNvbnN0cnVjdG9yIGlzIG51bGwsIG9yIGlmIHN1cGVyIGNvbnN0cnVjdG9yXG4gKiAgICAgbGFja3MgYSBwcm90b3R5cGUuXG4gKi9cbmV4cG9ydHMuaW5oZXJpdHMgPSB1dGlsLmluaGVyaXRzO1xuXG4vKipcbiAqIEVzY2FwZSBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gdGhlIGdpdmVuIHN0cmluZyBvZiBodG1sLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGh0bWxcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZXhwb3J0cy5lc2NhcGUgPSBmdW5jdGlvbiAoaHRtbCkge1xuICByZXR1cm4gaGUuZW5jb2RlKFN0cmluZyhodG1sKSwge3VzZU5hbWVkUmVmZXJlbmNlczogZmFsc2V9KTtcbn07XG5cbi8qKlxuICogVGVzdCBpZiB0aGUgZ2l2ZW4gb2JqIGlzIHR5cGUgb2Ygc3RyaW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5leHBvcnRzLmlzU3RyaW5nID0gZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ3N0cmluZyc7XG59O1xuXG4vKipcbiAqIENvbXB1dGUgYSBzbHVnIGZyb20gdGhlIGdpdmVuIGBzdHJgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmV4cG9ydHMuc2x1ZyA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgcmV0dXJuIHN0clxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnJlcGxhY2UoL1xccysvZywgJy0nKVxuICAgIC5yZXBsYWNlKC9bXi1cXHddL2csICcnKVxuICAgIC5yZXBsYWNlKC8tezIsfS9nLCAnLScpO1xufTtcblxuLyoqXG4gKiBTdHJpcCB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbiBmcm9tIGBzdHJgLCBhbmQgcmUtaW5kZW50IGZvciBwcmUgd2hpdGVzcGFjZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmV4cG9ydHMuY2xlYW4gPSBmdW5jdGlvbiAoc3RyKSB7XG4gIHN0ciA9IHN0clxuICAgIC5yZXBsYWNlKC9cXHJcXG4/fFtcXG5cXHUyMDI4XFx1MjAyOV0vZywgJ1xcbicpXG4gICAgLnJlcGxhY2UoL15cXHVGRUZGLywgJycpXG4gICAgLy8gKHRyYWRpdGlvbmFsKS0+ICBzcGFjZS9uYW1lICAgICBwYXJhbWV0ZXJzICAgIGJvZHkgICAgIChsYW1iZGEpLT4gcGFyYW1ldGVycyAgICAgICBib2R5ICAgbXVsdGktc3RhdGVtZW50L3NpbmdsZSAgICAgICAgICBrZWVwIGJvZHkgY29udGVudFxuICAgIC5yZXBsYWNlKFxuICAgICAgL15mdW5jdGlvbig/Olxccyp8XFxzW14oXSopXFwoW14pXSpcXClcXHMqXFx7KCg/Oi58XFxuKSo/KVxcfSR8XlxcKFteKV0qXFwpXFxzKj0+XFxzKig/OlxceygoPzoufFxcbikqPylcXH18KCg/Oi58XFxuKSopKSQvLFxuICAgICAgJyQxJDIkMydcbiAgICApO1xuXG4gIHZhciBzcGFjZXMgPSBzdHIubWF0Y2goL15cXG4/KCAqKS8pWzFdLmxlbmd0aDtcbiAgdmFyIHRhYnMgPSBzdHIubWF0Y2goL15cXG4/KFxcdCopLylbMV0ubGVuZ3RoO1xuICB2YXIgcmUgPSBuZXcgUmVnRXhwKFxuICAgICdeXFxuPycgKyAodGFicyA/ICdcXHQnIDogJyAnKSArICd7JyArICh0YWJzIHx8IHNwYWNlcykgKyAnfScsXG4gICAgJ2dtJ1xuICApO1xuXG4gIHN0ciA9IHN0ci5yZXBsYWNlKHJlLCAnJyk7XG5cbiAgcmV0dXJuIHN0ci50cmltKCk7XG59O1xuXG4vKipcbiAqIElmIGEgdmFsdWUgY291bGQgaGF2ZSBwcm9wZXJ0aWVzLCBhbmQgaGFzIG5vbmUsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLFxuICogd2hpY2ggcmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZW1wdHkgdmFsdWUuXG4gKlxuICogRnVuY3Rpb25zIHcvIG5vIHByb3BlcnRpZXMgcmV0dXJuIGAnW0Z1bmN0aW9uXSdgXG4gKiBBcnJheXMgdy8gbGVuZ3RoID09PSAwIHJldHVybiBgJ1tdJ2BcbiAqIE9iamVjdHMgdy8gbm8gcHJvcGVydGllcyByZXR1cm4gYCd7fSdgXG4gKiBBbGwgZWxzZTogcmV0dXJuIHJlc3VsdCBvZiBgdmFsdWUudG9TdHJpbmcoKWBcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlSGludCBUaGUgdHlwZSBvZiB0aGUgdmFsdWVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGVtcHR5UmVwcmVzZW50YXRpb24odmFsdWUsIHR5cGVIaW50KSB7XG4gIHN3aXRjaCAodHlwZUhpbnQpIHtcbiAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICByZXR1cm4gJ1tGdW5jdGlvbl0nO1xuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICByZXR1cm4gJ3t9JztcbiAgICBjYXNlICdhcnJheSc6XG4gICAgICByZXR1cm4gJ1tdJztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBUYWtlcyBzb21lIHZhcmlhYmxlIGFuZCBhc2tzIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKClgIHdoYXQgaXQgdGhpbmtzIGl0XG4gKiBpcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvdG9TdHJpbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHRlc3QuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBDb21wdXRlZCB0eXBlXG4gKiBAZXhhbXBsZVxuICogY2Fub25pY2FsVHlwZSh7fSkgLy8gJ29iamVjdCdcbiAqIGNhbm9uaWNhbFR5cGUoW10pIC8vICdhcnJheSdcbiAqIGNhbm9uaWNhbFR5cGUoMSkgLy8gJ251bWJlcidcbiAqIGNhbm9uaWNhbFR5cGUoZmFsc2UpIC8vICdib29sZWFuJ1xuICogY2Fub25pY2FsVHlwZShJbmZpbml0eSkgLy8gJ251bWJlcidcbiAqIGNhbm9uaWNhbFR5cGUobnVsbCkgLy8gJ251bGwnXG4gKiBjYW5vbmljYWxUeXBlKG5ldyBEYXRlKCkpIC8vICdkYXRlJ1xuICogY2Fub25pY2FsVHlwZSgvZm9vLykgLy8gJ3JlZ2V4cCdcbiAqIGNhbm9uaWNhbFR5cGUoJ3R5cGUnKSAvLyAnc3RyaW5nJ1xuICogY2Fub25pY2FsVHlwZShnbG9iYWwpIC8vICdnbG9iYWwnXG4gKiBjYW5vbmljYWxUeXBlKG5ldyBTdHJpbmcoJ2ZvbycpIC8vICdvYmplY3QnXG4gKiBjYW5vbmljYWxUeXBlKGFzeW5jIGZ1bmN0aW9uKCkge30pIC8vICdhc3luY2Z1bmN0aW9uJ1xuICogY2Fub25pY2FsVHlwZShPYmplY3QuY3JlYXRlKG51bGwpKSAvLyAnbnVsbC1wcm90b3R5cGUnXG4gKi9cbnZhciBjYW5vbmljYWxUeXBlID0gKGV4cG9ydHMuY2Fub25pY2FsVHlwZSA9IGZ1bmN0aW9uIGNhbm9uaWNhbFR5cGUodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gJ3VuZGVmaW5lZCc7XG4gIH0gZWxzZSBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ251bGwnO1xuICB9IGVsc2UgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWx1ZSkpIHtcbiAgICByZXR1cm4gJ2J1ZmZlcic7XG4gIH0gZWxzZSBpZiAoT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKSA9PT0gbnVsbCkge1xuICAgIHJldHVybiAnbnVsbC1wcm90b3R5cGUnO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdcbiAgICAuY2FsbCh2YWx1ZSlcbiAgICAucmVwbGFjZSgvXlxcWy4rXFxzKC4rPyldJC8sICckMScpXG4gICAgLnRvTG93ZXJDYXNlKCk7XG59KTtcblxuLyoqXG4gKlxuICogUmV0dXJucyBhIGdlbmVyYWwgdHlwZSBvciBkYXRhIHN0cnVjdHVyZSBvZiBhIHZhcmlhYmxlXG4gKiBAcHJpdmF0ZVxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L0RhdGFfc3RydWN0dXJlc1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gdGVzdC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IE9uZSBvZiB1bmRlZmluZWQsIGJvb2xlYW4sIG51bWJlciwgc3RyaW5nLCBiaWdpbnQsIHN5bWJvbCwgb2JqZWN0XG4gKiBAZXhhbXBsZVxuICogdHlwZSh7fSkgLy8gJ29iamVjdCdcbiAqIHR5cGUoW10pIC8vICdhcnJheSdcbiAqIHR5cGUoMSkgLy8gJ251bWJlcidcbiAqIHR5cGUoZmFsc2UpIC8vICdib29sZWFuJ1xuICogdHlwZShJbmZpbml0eSkgLy8gJ251bWJlcidcbiAqIHR5cGUobnVsbCkgLy8gJ251bGwnXG4gKiB0eXBlKG5ldyBEYXRlKCkpIC8vICdvYmplY3QnXG4gKiB0eXBlKC9mb28vKSAvLyAnb2JqZWN0J1xuICogdHlwZSgndHlwZScpIC8vICdzdHJpbmcnXG4gKiB0eXBlKGdsb2JhbCkgLy8gJ29iamVjdCdcbiAqIHR5cGUobmV3IFN0cmluZygnZm9vJykgLy8gJ3N0cmluZydcbiAqL1xuZXhwb3J0cy50eXBlID0gZnVuY3Rpb24gdHlwZSh2YWx1ZSkge1xuICAvLyBOdWxsIGlzIHNwZWNpYWxcbiAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4gJ251bGwnO1xuICBjb25zdCBwcmltaXRpdmVzID0gbmV3IFNldChbXG4gICAgJ3VuZGVmaW5lZCcsXG4gICAgJ2Jvb2xlYW4nLFxuICAgICdudW1iZXInLFxuICAgICdzdHJpbmcnLFxuICAgICdiaWdpbnQnLFxuICAgICdzeW1ib2wnXG4gIF0pO1xuICBjb25zdCBfdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgaWYgKF90eXBlID09PSAnZnVuY3Rpb24nKSByZXR1cm4gX3R5cGU7XG4gIGlmIChwcmltaXRpdmVzLmhhcyhfdHlwZSkpIHJldHVybiBfdHlwZTtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSByZXR1cm4gJ3N0cmluZyc7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gJ2Vycm9yJztcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gJ2FycmF5JztcblxuICByZXR1cm4gX3R5cGU7XG59O1xuXG4vKipcbiAqIFN0cmluZ2lmeSBgdmFsdWVgLiBEaWZmZXJlbnQgYmVoYXZpb3IgZGVwZW5kaW5nIG9uIHR5cGUgb2YgdmFsdWU6XG4gKlxuICogLSBJZiBgdmFsdWVgIGlzIHVuZGVmaW5lZCBvciBudWxsLCByZXR1cm4gYCdbdW5kZWZpbmVkXSdgIG9yIGAnW251bGxdJ2AsIHJlc3BlY3RpdmVseS5cbiAqIC0gSWYgYHZhbHVlYCBpcyBub3QgYW4gb2JqZWN0LCBmdW5jdGlvbiBvciBhcnJheSwgcmV0dXJuIHJlc3VsdCBvZiBgdmFsdWUudG9TdHJpbmcoKWAgd3JhcHBlZCBpbiBkb3VibGUtcXVvdGVzLlxuICogLSBJZiBgdmFsdWVgIGlzIGFuICplbXB0eSogb2JqZWN0LCBmdW5jdGlvbiwgb3IgYXJyYXksIHJldHVybiByZXN1bHQgb2YgZnVuY3Rpb25cbiAqICAge0BsaW5rIGVtcHR5UmVwcmVzZW50YXRpb259LlxuICogLSBJZiBgdmFsdWVgIGhhcyBwcm9wZXJ0aWVzLCBjYWxsIHtAbGluayBleHBvcnRzLmNhbm9uaWNhbGl6ZX0gb24gaXQsIHRoZW4gcmV0dXJuIHJlc3VsdCBvZlxuICogICBKU09OLnN0cmluZ2lmeSgpLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAc2VlIGV4cG9ydHMudHlwZVxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5leHBvcnRzLnN0cmluZ2lmeSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICB2YXIgdHlwZUhpbnQgPSBjYW5vbmljYWxUeXBlKHZhbHVlKTtcblxuICBpZiAoIX5bJ29iamVjdCcsICdhcnJheScsICdmdW5jdGlvbicsICdudWxsLXByb3RvdHlwZSddLmluZGV4T2YodHlwZUhpbnQpKSB7XG4gICAgaWYgKHR5cGVIaW50ID09PSAnYnVmZmVyJykge1xuICAgICAgdmFyIGpzb24gPSBCdWZmZXIucHJvdG90eXBlLnRvSlNPTi5jYWxsKHZhbHVlKTtcbiAgICAgIC8vIEJhc2VkIG9uIHRoZSB0b0pTT04gcmVzdWx0XG4gICAgICByZXR1cm4ganNvblN0cmluZ2lmeShcbiAgICAgICAganNvbi5kYXRhICYmIGpzb24udHlwZSA/IGpzb24uZGF0YSA6IGpzb24sXG4gICAgICAgIDJcbiAgICAgICkucmVwbGFjZSgvLChcXG58JCkvZywgJyQxJyk7XG4gICAgfVxuXG4gICAgLy8gSUU3L0lFOCBoYXMgYSBiaXphcnJlIFN0cmluZyBjb25zdHJ1Y3RvcjsgbmVlZHMgdG8gYmUgY29lcmNlZFxuICAgIC8vIGludG8gYW4gYXJyYXkgYW5kIGJhY2sgdG8gb2JqLlxuICAgIGlmICh0eXBlSGludCA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgdmFsdWUgPSB2YWx1ZS5zcGxpdCgnJykucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGNoYXIsIGlkeCkge1xuICAgICAgICBhY2NbaWR4XSA9IGNoYXI7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCB7fSk7XG4gICAgICB0eXBlSGludCA9ICdvYmplY3QnO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ganNvblN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgcHJvcCBpbiB2YWx1ZSkge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIHByb3ApKSB7XG4gICAgICByZXR1cm4ganNvblN0cmluZ2lmeShcbiAgICAgICAgZXhwb3J0cy5jYW5vbmljYWxpemUodmFsdWUsIG51bGwsIHR5cGVIaW50KSxcbiAgICAgICAgMlxuICAgICAgKS5yZXBsYWNlKC8sKFxcbnwkKS9nLCAnJDEnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZW1wdHlSZXByZXNlbnRhdGlvbih2YWx1ZSwgdHlwZUhpbnQpO1xufTtcblxuLyoqXG4gKiBsaWtlIEpTT04uc3RyaW5naWZ5IGJ1dCBtb3JlIHNlbnNlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gIG9iamVjdFxuICogQHBhcmFtIHtudW1iZXI9fSBzcGFjZXNcbiAqIEBwYXJhbSB7bnVtYmVyPX0gZGVwdGhcbiAqIEByZXR1cm5zIHsqfVxuICovXG5mdW5jdGlvbiBqc29uU3RyaW5naWZ5KG9iamVjdCwgc3BhY2VzLCBkZXB0aCkge1xuICBpZiAodHlwZW9mIHNwYWNlcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyBwcmltaXRpdmUgdHlwZXNcbiAgICByZXR1cm4gX3N0cmluZ2lmeShvYmplY3QpO1xuICB9XG5cbiAgZGVwdGggPSBkZXB0aCB8fCAxO1xuICB2YXIgc3BhY2UgPSBzcGFjZXMgKiBkZXB0aDtcbiAgdmFyIHN0ciA9IEFycmF5LmlzQXJyYXkob2JqZWN0KSA/ICdbJyA6ICd7JztcbiAgdmFyIGVuZCA9IEFycmF5LmlzQXJyYXkob2JqZWN0KSA/ICddJyA6ICd9JztcbiAgdmFyIGxlbmd0aCA9XG4gICAgdHlwZW9mIG9iamVjdC5sZW5ndGggPT09ICdudW1iZXInXG4gICAgICA/IG9iamVjdC5sZW5ndGhcbiAgICAgIDogT2JqZWN0LmtleXMob2JqZWN0KS5sZW5ndGg7XG4gIC8vIGAucmVwZWF0KClgIHBvbHlmaWxsXG4gIGZ1bmN0aW9uIHJlcGVhdChzLCBuKSB7XG4gICAgcmV0dXJuIG5ldyBBcnJheShuKS5qb2luKHMpO1xuICB9XG5cbiAgZnVuY3Rpb24gX3N0cmluZ2lmeSh2YWwpIHtcbiAgICBzd2l0Y2ggKGNhbm9uaWNhbFR5cGUodmFsKSkge1xuICAgICAgY2FzZSAnbnVsbCc6XG4gICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICB2YWwgPSAnWycgKyB2YWwgKyAnXSc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYXJyYXknOlxuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgdmFsID0ganNvblN0cmluZ2lmeSh2YWwsIHNwYWNlcywgZGVwdGggKyAxKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ3JlZ2V4cCc6XG4gICAgICBjYXNlICdzeW1ib2wnOlxuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgdmFsID1cbiAgICAgICAgICB2YWwgPT09IDAgJiYgMSAvIHZhbCA9PT0gLUluZmluaXR5IC8vIGAtMGBcbiAgICAgICAgICAgID8gJy0wJ1xuICAgICAgICAgICAgOiB2YWwudG9TdHJpbmcoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdiaWdpbnQnOlxuICAgICAgICB2YWwgPSB2YWwudG9TdHJpbmcoKSArICduJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgdmFyIHNEYXRlID0gaXNOYU4odmFsLmdldFRpbWUoKSkgPyB2YWwudG9TdHJpbmcoKSA6IHZhbC50b0lTT1N0cmluZygpO1xuICAgICAgICB2YWwgPSAnW0RhdGU6ICcgKyBzRGF0ZSArICddJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdidWZmZXInOlxuICAgICAgICB2YXIganNvbiA9IHZhbC50b0pTT04oKTtcbiAgICAgICAgLy8gQmFzZWQgb24gdGhlIHRvSlNPTiByZXN1bHRcbiAgICAgICAganNvbiA9IGpzb24uZGF0YSAmJiBqc29uLnR5cGUgPyBqc29uLmRhdGEgOiBqc29uO1xuICAgICAgICB2YWwgPSAnW0J1ZmZlcjogJyArIGpzb25TdHJpbmdpZnkoanNvbiwgMiwgZGVwdGggKyAxKSArICddJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB2YWwgPVxuICAgICAgICAgIHZhbCA9PT0gJ1tGdW5jdGlvbl0nIHx8IHZhbCA9PT0gJ1tDaXJjdWxhcl0nXG4gICAgICAgICAgICA/IHZhbFxuICAgICAgICAgICAgOiBKU09OLnN0cmluZ2lmeSh2YWwpOyAvLyBzdHJpbmdcbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuXG4gIGZvciAodmFyIGkgaW4gb2JqZWN0KSB7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBpKSkge1xuICAgICAgY29udGludWU7IC8vIG5vdCBteSBidXNpbmVzc1xuICAgIH1cbiAgICAtLWxlbmd0aDtcbiAgICBzdHIgKz1cbiAgICAgICdcXG4gJyArXG4gICAgICByZXBlYXQoJyAnLCBzcGFjZSkgK1xuICAgICAgKEFycmF5LmlzQXJyYXkob2JqZWN0KSA/ICcnIDogJ1wiJyArIGkgKyAnXCI6ICcpICsgLy8ga2V5XG4gICAgICBfc3RyaW5naWZ5KG9iamVjdFtpXSkgKyAvLyB2YWx1ZVxuICAgICAgKGxlbmd0aCA/ICcsJyA6ICcnKTsgLy8gY29tbWFcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgc3RyICtcbiAgICAvLyBbXSwge31cbiAgICAoc3RyLmxlbmd0aCAhPT0gMSA/ICdcXG4nICsgcmVwZWF0KCcgJywgLS1zcGFjZSkgKyBlbmQgOiBlbmQpXG4gICk7XG59XG5cbi8qKlxuICogUmV0dXJuIGEgbmV3IFRoaW5nIHRoYXQgaGFzIHRoZSBrZXlzIGluIHNvcnRlZCBvcmRlci4gUmVjdXJzaXZlLlxuICpcbiAqIElmIHRoZSBUaGluZy4uLlxuICogLSBoYXMgYWxyZWFkeSBiZWVuIHNlZW4sIHJldHVybiBzdHJpbmcgYCdbQ2lyY3VsYXJdJ2BcbiAqIC0gaXMgYHVuZGVmaW5lZGAsIHJldHVybiBzdHJpbmcgYCdbdW5kZWZpbmVkXSdgXG4gKiAtIGlzIGBudWxsYCwgcmV0dXJuIHZhbHVlIGBudWxsYFxuICogLSBpcyBzb21lIG90aGVyIHByaW1pdGl2ZSwgcmV0dXJuIHRoZSB2YWx1ZVxuICogLSBpcyBub3QgYSBwcmltaXRpdmUgb3IgYW4gYEFycmF5YCwgYE9iamVjdGAsIG9yIGBGdW5jdGlvbmAsIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIFRoaW5nJ3MgYHRvU3RyaW5nKClgIG1ldGhvZFxuICogLSBpcyBhIG5vbi1lbXB0eSBgQXJyYXlgLCBgT2JqZWN0YCwgb3IgYEZ1bmN0aW9uYCwgcmV0dXJuIHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGFnYWluLlxuICogLSBpcyBhbiBlbXB0eSBgQXJyYXlgLCBgT2JqZWN0YCwgb3IgYEZ1bmN0aW9uYCwgcmV0dXJuIHRoZSByZXN1bHQgb2YgY2FsbGluZyBgZW1wdHlSZXByZXNlbnRhdGlvbigpYFxuICpcbiAqIEBwcml2YXRlXG4gKiBAc2VlIHtAbGluayBleHBvcnRzLnN0cmluZ2lmeX1cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhpbmcgdG8gaW5zcGVjdC4gIE1heSBvciBtYXkgbm90IGhhdmUgcHJvcGVydGllcy5cbiAqIEBwYXJhbSB7QXJyYXl9IFtzdGFjaz1bXV0gU3RhY2sgb2Ygc2VlbiB2YWx1ZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdHlwZUhpbnRdIFR5cGUgaGludFxuICogQHJldHVybiB7KE9iamVjdHxBcnJheXxGdW5jdGlvbnxzdHJpbmd8dW5kZWZpbmVkKX1cbiAqL1xuZXhwb3J0cy5jYW5vbmljYWxpemUgPSBmdW5jdGlvbiBjYW5vbmljYWxpemUodmFsdWUsIHN0YWNrLCB0eXBlSGludCkge1xuICB2YXIgY2Fub25pY2FsaXplZE9iajtcbiAgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbiAgdmFyIHByb3A7XG4gIC8qIGVzbGludC1lbmFibGUgbm8tdW51c2VkLXZhcnMgKi9cbiAgdHlwZUhpbnQgPSB0eXBlSGludCB8fCBjYW5vbmljYWxUeXBlKHZhbHVlKTtcbiAgZnVuY3Rpb24gd2l0aFN0YWNrKHZhbHVlLCBmbikge1xuICAgIHN0YWNrLnB1c2godmFsdWUpO1xuICAgIGZuKCk7XG4gICAgc3RhY2sucG9wKCk7XG4gIH1cblxuICBzdGFjayA9IHN0YWNrIHx8IFtdO1xuXG4gIGlmIChzdGFjay5pbmRleE9mKHZhbHVlKSAhPT0gLTEpIHtcbiAgICByZXR1cm4gJ1tDaXJjdWxhcl0nO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlSGludCkge1xuICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgY2FzZSAnYnVmZmVyJzpcbiAgICBjYXNlICdudWxsJzpcbiAgICAgIGNhbm9uaWNhbGl6ZWRPYmogPSB2YWx1ZTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2FycmF5JzpcbiAgICAgIHdpdGhTdGFjayh2YWx1ZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBjYW5vbmljYWxpemVkT2JqID0gdmFsdWUubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgcmV0dXJuIGV4cG9ydHMuY2Fub25pY2FsaXplKGl0ZW0sIHN0YWNrKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycywgbm8tdW5yZWFjaGFibGUtbG9vcCAqL1xuICAgICAgZm9yIChwcm9wIGluIHZhbHVlKSB7XG4gICAgICAgIGNhbm9uaWNhbGl6ZWRPYmogPSB7fTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIGd1YXJkLWZvci1pbiAqL1xuICAgICAgaWYgKCFjYW5vbmljYWxpemVkT2JqKSB7XG4gICAgICAgIGNhbm9uaWNhbGl6ZWRPYmogPSBlbXB0eVJlcHJlc2VudGF0aW9uKHZhbHVlLCB0eXBlSGludCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlICdudWxsLXByb3RvdHlwZSc6XG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgIGNhbm9uaWNhbGl6ZWRPYmogPSBjYW5vbmljYWxpemVkT2JqIHx8IHt9O1xuICAgICAgaWYgKHR5cGVIaW50ID09PSAnbnVsbC1wcm90b3R5cGUnICYmIFN5bWJvbC50b1N0cmluZ1RhZyBpbiB2YWx1ZSkge1xuICAgICAgICBjYW5vbmljYWxpemVkT2JqWydbU3ltYm9sLnRvU3RyaW5nVGFnXSddID0gdmFsdWVbU3ltYm9sLnRvU3RyaW5nVGFnXTtcbiAgICAgIH1cbiAgICAgIHdpdGhTdGFjayh2YWx1ZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZSlcbiAgICAgICAgICAuc29ydCgpXG4gICAgICAgICAgLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgY2Fub25pY2FsaXplZE9ialtrZXldID0gZXhwb3J0cy5jYW5vbmljYWxpemUodmFsdWVba2V5XSwgc3RhY2spO1xuICAgICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdkYXRlJzpcbiAgICBjYXNlICdudW1iZXInOlxuICAgIGNhc2UgJ3JlZ2V4cCc6XG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgY2FzZSAnc3ltYm9sJzpcbiAgICAgIGNhbm9uaWNhbGl6ZWRPYmogPSB2YWx1ZTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBjYW5vbmljYWxpemVkT2JqID0gdmFsdWUgKyAnJztcbiAgfVxuXG4gIHJldHVybiBjYW5vbmljYWxpemVkT2JqO1xufTtcblxuLyoqXG4gKiBAc3VtbWFyeVxuICogVGhpcyBGaWx0ZXIgYmFzZWQgb24gYG1vY2hhLWNsZWFuYCBtb2R1bGUuKHNlZTogYGdpdGh1Yi5jb20vcnN0YWNydXovbW9jaGEtY2xlYW5gKVxuICogQGRlc2NyaXB0aW9uXG4gKiBXaGVuIGludm9raW5nIHRoaXMgZnVuY3Rpb24geW91IGdldCBhIGZpbHRlciBmdW5jdGlvbiB0aGF0IGdldCB0aGUgRXJyb3Iuc3RhY2sgYXMgYW4gaW5wdXQsXG4gKiBhbmQgcmV0dXJuIGEgcHJldHRpZnkgb3V0cHV0LlxuICogKGkuZTogc3RyaXAgTW9jaGEgYW5kIGludGVybmFsIG5vZGUgZnVuY3Rpb25zIGZyb20gc3RhY2sgdHJhY2UpLlxuICogQHJldHVybnMge0Z1bmN0aW9ufVxuICovXG5leHBvcnRzLnN0YWNrVHJhY2VGaWx0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIFRPRE86IFJlcGxhY2Ugd2l0aCBgcHJvY2Vzcy5icm93c2VyYFxuICB2YXIgaXMgPSB0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnID8ge25vZGU6IHRydWV9IDoge2Jyb3dzZXI6IHRydWV9O1xuICB2YXIgc2xhc2ggPSBwYXRoLnNlcDtcbiAgdmFyIGN3ZDtcbiAgaWYgKGlzLm5vZGUpIHtcbiAgICBjd2QgPSBleHBvcnRzLmN3ZCgpICsgc2xhc2g7XG4gIH0gZWxzZSB7XG4gICAgY3dkID0gKFxuICAgICAgdHlwZW9mIGxvY2F0aW9uID09PSAndW5kZWZpbmVkJyA/IHdpbmRvdy5sb2NhdGlvbiA6IGxvY2F0aW9uXG4gICAgKS5ocmVmLnJlcGxhY2UoL1xcL1teL10qJC8sICcvJyk7XG4gICAgc2xhc2ggPSAnLyc7XG4gIH1cblxuICBmdW5jdGlvbiBpc01vY2hhSW50ZXJuYWwobGluZSkge1xuICAgIHJldHVybiAoXG4gICAgICB+bGluZS5pbmRleE9mKCdub2RlX21vZHVsZXMnICsgc2xhc2ggKyAnbW9jaGEnICsgc2xhc2gpIHx8XG4gICAgICB+bGluZS5pbmRleE9mKHNsYXNoICsgJ21vY2hhLmpzJykgfHxcbiAgICAgIH5saW5lLmluZGV4T2Yoc2xhc2ggKyAnbW9jaGEubWluLmpzJylcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNOb2RlSW50ZXJuYWwobGluZSkge1xuICAgIHJldHVybiAoXG4gICAgICB+bGluZS5pbmRleE9mKCcodGltZXJzLmpzOicpIHx8XG4gICAgICB+bGluZS5pbmRleE9mKCcoZXZlbnRzLmpzOicpIHx8XG4gICAgICB+bGluZS5pbmRleE9mKCcobm9kZS5qczonKSB8fFxuICAgICAgfmxpbmUuaW5kZXhPZignKG1vZHVsZS5qczonKSB8fFxuICAgICAgfmxpbmUuaW5kZXhPZignR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUubmV4dCAobmF0aXZlKScpIHx8XG4gICAgICBmYWxzZVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKHN0YWNrKSB7XG4gICAgc3RhY2sgPSBzdGFjay5zcGxpdCgnXFxuJyk7XG5cbiAgICBzdGFjayA9IHN0YWNrLnJlZHVjZShmdW5jdGlvbiAobGlzdCwgbGluZSkge1xuICAgICAgaWYgKGlzTW9jaGFJbnRlcm5hbChsaW5lKSkge1xuICAgICAgICByZXR1cm4gbGlzdDtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzLm5vZGUgJiYgaXNOb2RlSW50ZXJuYWwobGluZSkpIHtcbiAgICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgICB9XG5cbiAgICAgIC8vIENsZWFuIHVwIGN3ZChhYnNvbHV0ZSlcbiAgICAgIGlmICgvOlxcZCs6XFxkK1xcKT8kLy50ZXN0KGxpbmUpKSB7XG4gICAgICAgIGxpbmUgPSBsaW5lLnJlcGxhY2UoJygnICsgY3dkLCAnKCcpO1xuICAgICAgfVxuXG4gICAgICBsaXN0LnB1c2gobGluZSk7XG4gICAgICByZXR1cm4gbGlzdDtcbiAgICB9LCBbXSk7XG5cbiAgICByZXR1cm4gc3RhY2suam9pbignXFxuJyk7XG4gIH07XG59O1xuXG4vKipcbiAqIENydWRlLCBidXQgZWZmZWN0aXZlLlxuICogQHB1YmxpY1xuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgb3Igbm90IGB2YWx1ZWAgaXMgYSBQcm9taXNlXG4gKi9cbmV4cG9ydHMuaXNQcm9taXNlID0gZnVuY3Rpb24gaXNQcm9taXNlKHZhbHVlKSB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgdHlwZW9mIHZhbHVlLnRoZW4gPT09ICdmdW5jdGlvbidcbiAgKTtcbn07XG5cbi8qKlxuICogQ2xhbXBzIGEgbnVtZXJpYyB2YWx1ZSB0byBhbiBpbmNsdXNpdmUgcmFuZ2UuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVmFsdWUgdG8gYmUgY2xhbXBlZC5cbiAqIEBwYXJhbSB7bnVtYmVyW119IHJhbmdlIC0gVHdvIGVsZW1lbnQgYXJyYXkgc3BlY2lmeWluZyBbbWluLCBtYXhdIHJhbmdlLlxuICogQHJldHVybnMge251bWJlcn0gY2xhbXBlZCB2YWx1ZVxuICovXG5leHBvcnRzLmNsYW1wID0gZnVuY3Rpb24gY2xhbXAodmFsdWUsIHJhbmdlKSB7XG4gIHJldHVybiBNYXRoLm1pbihNYXRoLm1heCh2YWx1ZSwgcmFuZ2VbMF0pLCByYW5nZVsxXSk7XG59O1xuXG4vKipcbiAqIEl0J3MgYSBub29wLlxuICogQHB1YmxpY1xuICovXG5leHBvcnRzLm5vb3AgPSBmdW5jdGlvbiAoKSB7fTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbWFwLWxpa2Ugb2JqZWN0LlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQSBcIm1hcFwiIGlzIGFuIG9iamVjdCB3aXRoIG5vIHByb3RvdHlwZSwgZm9yIG91ciBwdXJwb3Nlcy4gSW4gc29tZSBjYXNlc1xuICogdGhpcyB3b3VsZCBiZSBtb3JlIGFwcHJvcHJpYXRlIHRoYW4gYSBgTWFwYCwgZXNwZWNpYWxseSBpZiB5b3VyIGVudmlyb25tZW50XG4gKiBkb2Vzbid0IHN1cHBvcnQgaXQuIFJlY29tbWVuZGVkIGZvciB1c2UgaW4gTW9jaGEncyBwdWJsaWMgQVBJcy5cbiAqXG4gKiBAcHVibGljXG4gKiBAc2VlIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9NYXAjQ3VzdG9tX2FuZF9OdWxsX29iamVjdHN8TUROOk1hcH1cbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9jcmVhdGUjQ3VzdG9tX2FuZF9OdWxsX29iamVjdHN8TUROOk9iamVjdC5jcmVhdGUgLSBDdXN0b20gb2JqZWN0c31cbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9hc3NpZ24jQ3VzdG9tX2FuZF9OdWxsX29iamVjdHN8TUROOk9iamVjdC5hc3NpZ259XG4gKiBAcGFyYW0gey4uLip9IFtvYmpdIC0gQXJndW1lbnRzIHRvIGBPYmplY3QuYXNzaWduKClgLlxuICogQHJldHVybnMge09iamVjdH0gQW4gb2JqZWN0IHdpdGggbm8gcHJvdG90eXBlLCBoYXZpbmcgYC4uLm9iamAgcHJvcGVydGllc1xuICovXG5leHBvcnRzLmNyZWF0ZU1hcCA9IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24uYXBwbHkoXG4gICAgbnVsbCxcbiAgICBbT2JqZWN0LmNyZWF0ZShudWxsKV0uY29uY2F0KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpXG4gICk7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSByZWFkLW9ubHkgbWFwLWxpa2Ugb2JqZWN0LlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVGhpcyBkaWZmZXJzIGZyb20ge0BsaW5rIG1vZHVsZTp1dGlscy5jcmVhdGVNYXAgY3JlYXRlTWFwfSBvbmx5IGluIHRoYXRcbiAqIHRoZSBhcmd1bWVudCBtdXN0IGJlIG5vbi1lbXB0eSwgYmVjYXVzZSB0aGUgcmVzdWx0IGlzIGZyb3plbi5cbiAqXG4gKiBAc2VlIHtAbGluayBtb2R1bGU6dXRpbHMuY3JlYXRlTWFwIGNyZWF0ZU1hcH1cbiAqIEBwYXJhbSB7Li4uKn0gW29ial0gLSBBcmd1bWVudHMgdG8gYE9iamVjdC5hc3NpZ24oKWAuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBBIGZyb3plbiBvYmplY3Qgd2l0aCBubyBwcm90b3R5cGUsIGhhdmluZyBgLi4ub2JqYCBwcm9wZXJ0aWVzXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IGlmIGFyZ3VtZW50IGlzIG5vdCBhIG5vbi1lbXB0eSBvYmplY3QuXG4gKi9cbmV4cG9ydHMuZGVmaW5lQ29uc3RhbnRzID0gZnVuY3Rpb24gKG9iaikge1xuICBpZiAoY2Fub25pY2FsVHlwZShvYmopICE9PSAnb2JqZWN0JyB8fCAhT2JqZWN0LmtleXMob2JqKS5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGFyZ3VtZW50OyBleHBlY3RlZCBhIG5vbi1lbXB0eSBvYmplY3QnKTtcbiAgfVxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShleHBvcnRzLmNyZWF0ZU1hcChvYmopKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5XG4gKlxuICogV3JhcHBlciBhcm91bmQgYHByb2Nlc3MuY3dkKClgIGZvciBpc29sYXRpb25cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydHMuY3dkID0gZnVuY3Rpb24gY3dkKCkge1xuICByZXR1cm4gcHJvY2Vzcy5jd2QoKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgTW9jaGEgaXMgcnVubmluZyBpbiBhIGJyb3dzZXIuXG4gKiBDaGVja3MgZm9yIGBwcm9jZXNzLmJyb3dzZXJgLlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnRzLmlzQnJvd3NlciA9IGZ1bmN0aW9uIGlzQnJvd3NlcigpIHtcbiAgcmV0dXJuIEJvb2xlYW4ocHJvY2Vzcy5icm93c2VyKTtcbn07XG5cbi8qXG4gKiBDYXN0cyBgdmFsdWVgIHRvIGFuIGFycmF5OyB1c2VmdWwgZm9yIG9wdGlvbmFsbHkgYWNjZXB0aW5nIGFycmF5IHBhcmFtZXRlcnNcbiAqXG4gKiBJdCBmb2xsb3dzIHRoZXNlIHJ1bGVzLCBkZXBlbmRpbmcgb24gYHZhbHVlYC4gIElmIGB2YWx1ZWAgaXMuLi5cbiAqIDEuIGB1bmRlZmluZWRgOiByZXR1cm4gYW4gZW1wdHkgQXJyYXlcbiAqIDIuIGBudWxsYDogcmV0dXJuIGFuIGFycmF5IHdpdGggYSBzaW5nbGUgYG51bGxgIGVsZW1lbnRcbiAqIDMuIEFueSBvdGhlciBvYmplY3Q6IHJldHVybiB0aGUgdmFsdWUgb2YgYEFycmF5LmZyb20oKWAgX2lmXyB0aGUgb2JqZWN0IGlzIGl0ZXJhYmxlXG4gKiA0LiBvdGhlcndpc2U6IHJldHVybiBhbiBhcnJheSB3aXRoIGEgc2luZ2xlIGVsZW1lbnQsIGB2YWx1ZWBcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgLSBTb21ldGhpbmcgdG8gY2FzdCB0byBhbiBBcnJheVxuICogQHJldHVybnMge0FycmF5PCo+fVxuICovXG5leHBvcnRzLmNhc3RBcnJheSA9IGZ1bmN0aW9uIGNhc3RBcnJheSh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gW251bGxdO1xuICB9XG4gIGlmIChcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgKHR5cGVvZiB2YWx1ZVtTeW1ib2wuaXRlcmF0b3JdID09PSAnZnVuY3Rpb24nIHx8IHZhbHVlLmxlbmd0aCAhPT0gdW5kZWZpbmVkKVxuICApIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIFt2YWx1ZV07XG59O1xuXG5leHBvcnRzLmNvbnN0YW50cyA9IGV4cG9ydHMuZGVmaW5lQ29uc3RhbnRzKHtcbiAgTU9DSEFfSURfUFJPUF9OQU1FXG59KTtcblxuY29uc3QgdW5pcXVlSURCYXNlID1cbiAgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5LV8nO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdW5pcXVlIGlkZW50aWZpZXJcbiAqIERvZXMgbm90IGNyZWF0ZSBjcnlwdG9ncmFwaGljYWxseSBzYWZlIGlkcy5cbiAqIFRyaXZpYWwgY29weSBvZiBuYW5vaWQvbm9uLXNlY3VyZVxuICogQHJldHVybnMge3N0cmluZ30gVW5pcXVlIGlkZW50aWZpZXJcbiAqL1xuZXhwb3J0cy51bmlxdWVJRCA9ICgpID0+IHtcbiAgbGV0IGlkID0gJyc7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgMjE7IGkrKykge1xuICAgIGlkICs9IHVuaXF1ZUlEQmFzZVsoTWF0aC5yYW5kb20oKSAqIDY0KSB8IDBdO1xuICB9XG4gIHJldHVybiBpZDtcbn07XG5cbmV4cG9ydHMuYXNzaWduTmV3TW9jaGFJRCA9IG9iaiA9PiB7XG4gIGNvbnN0IGlkID0gZXhwb3J0cy51bmlxdWVJRCgpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBNT0NIQV9JRF9QUk9QX05BTUUsIHtcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gaWQ7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG9iajtcbn07XG5cbi8qKlxuICogUmV0cmlldmVzIGEgTW9jaGEgSUQgZnJvbSBhbiBvYmplY3QsIGlmIHByZXNlbnQuXG4gKiBAcGFyYW0geyp9IFtvYmpdIC0gT2JqZWN0XG4gKiBAcmV0dXJucyB7c3RyaW5nfHZvaWR9XG4gKi9cbmV4cG9ydHMuZ2V0TW9jaGFJRCA9IG9iaiA9PlxuICBvYmogJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgPyBvYmpbTU9DSEFfSURfUFJPUF9OQU1FXSA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBSZXBsYWNlcyBhbnkgZGV0ZWN0ZWQgY2lyY3VsYXIgZGVwZW5kZW5jeSB3aXRoIHRoZSBzdHJpbmcgJ1tDaXJjdWxhcl0nXG4gKiBNdXRhdGVzIG9yaWdpbmFsIG9iamVjdFxuICogQHBhcmFtIGlucHV0T2JqIHsqfVxuICogQHJldHVybnMgeyp9XG4gKi9cbmV4cG9ydHMuYnJlYWtDaXJjdWxhckRlcHMgPSBpbnB1dE9iaiA9PiB7XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0KCk7XG5cbiAgZnVuY3Rpb24gX2JyZWFrQ2lyY3VsYXJEZXBzKG9iaikge1xuICAgIGlmIChvYmogJiYgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG4gICAgaWYgKHNlZW4uaGFzKG9iaikpIHtcbiAgICAgIHJldHVybiAnW0NpcmN1bGFyXSc7XG4gICAgfVxuXG4gICAgc2Vlbi5hZGQob2JqKTtcbiAgICBmb3IgKGNvbnN0IGsgaW4gb2JqKSB7XG4gICAgICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGspO1xuXG4gICAgICBpZiAoZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLndyaXRhYmxlKSB7XG4gICAgICAgIG9ialtrXSA9IF9icmVha0NpcmN1bGFyRGVwcyhvYmpba10sIGspO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRlbGV0aW5nIG1lYW5zIG9ubHkgYSBzZWVuIG9iamVjdCB0aGF0IGlzIGl0cyBvd24gY2hpbGQgd2lsbCBiZSBkZXRlY3RlZFxuICAgIHNlZW4uZGVsZXRlKG9iaik7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHJldHVybiBfYnJlYWtDaXJjdWxhckRlcHMoaW5wdXRPYmopO1xufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgcHJvdmlkZWQgaW5wdXQgY2FuIGJlIHBhcnNlZCBhcyBhIEphdmFTY3JpcHQgTnVtYmVyLlxuICovXG5leHBvcnRzLmlzTnVtZXJpYyA9IGlucHV0ID0+IHtcbiAgcmV0dXJuICFpc05hTihwYXJzZUZsb2F0KGlucHV0KSk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdGluZm86ICfihLnvuI8nLFxuXHRzdWNjZXNzOiAn4pyFJyxcblx0d2FybmluZzogJ+KaoO+4jycsXG5cdGVycm9yOiAn4p2M77iPJ1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuIEBtb2R1bGUgUGVuZGluZ1xuKi9cblxubW9kdWxlLmV4cG9ydHMgPSBQZW5kaW5nO1xuXG4vKipcbiAqIEluaXRpYWxpemUgYSBuZXcgYFBlbmRpbmdgIGVycm9yIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAqL1xuZnVuY3Rpb24gUGVuZGluZyhtZXNzYWdlKSB7XG4gIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG59XG4iLCAiLyoqXG4gKiBIZWxwZXJzLlxuICovXG5cbnZhciBzID0gMTAwMDtcbnZhciBtID0gcyAqIDYwO1xudmFyIGggPSBtICogNjA7XG52YXIgZCA9IGggKiAyNDtcbnZhciB3ID0gZCAqIDc7XG52YXIgeSA9IGQgKiAzNjUuMjU7XG5cbi8qKlxuICogUGFyc2Ugb3IgZm9ybWF0IHRoZSBnaXZlbiBgdmFsYC5cbiAqXG4gKiBPcHRpb25zOlxuICpcbiAqICAtIGBsb25nYCB2ZXJib3NlIGZvcm1hdHRpbmcgW2ZhbHNlXVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gdmFsXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhyb3cgYW4gZXJyb3IgaWYgdmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSBudW1iZXJcbiAqIEByZXR1cm4ge1N0cmluZ3xOdW1iZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odmFsLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWw7XG4gIGlmICh0eXBlID09PSAnc3RyaW5nJyAmJiB2YWwubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBwYXJzZSh2YWwpO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdudW1iZXInICYmIGlzRmluaXRlKHZhbCkpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5sb25nID8gZm10TG9uZyh2YWwpIDogZm10U2hvcnQodmFsKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgJ3ZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgdmFsaWQgbnVtYmVyLiB2YWw9JyArXG4gICAgICBKU09OLnN0cmluZ2lmeSh2YWwpXG4gICk7XG59O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBgc3RyYCBhbmQgcmV0dXJuIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZShzdHIpIHtcbiAgc3RyID0gU3RyaW5nKHN0cik7XG4gIGlmIChzdHIubGVuZ3RoID4gMTAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBtYXRjaCA9IC9eKC0/KD86XFxkKyk/XFwuP1xcZCspICoobWlsbGlzZWNvbmRzP3xtc2Vjcz98bXN8c2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx3ZWVrcz98d3x5ZWFycz98eXJzP3x5KT8kL2kuZXhlYyhcbiAgICBzdHJcbiAgKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbiA9IHBhcnNlRmxvYXQobWF0Y2hbMV0pO1xuICB2YXIgdHlwZSA9IChtYXRjaFsyXSB8fCAnbXMnKS50b0xvd2VyQ2FzZSgpO1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICd5ZWFycyc6XG4gICAgY2FzZSAneWVhcic6XG4gICAgY2FzZSAneXJzJzpcbiAgICBjYXNlICd5cic6XG4gICAgY2FzZSAneSc6XG4gICAgICByZXR1cm4gbiAqIHk7XG4gICAgY2FzZSAnd2Vla3MnOlxuICAgIGNhc2UgJ3dlZWsnOlxuICAgIGNhc2UgJ3cnOlxuICAgICAgcmV0dXJuIG4gKiB3O1xuICAgIGNhc2UgJ2RheXMnOlxuICAgIGNhc2UgJ2RheSc6XG4gICAgY2FzZSAnZCc6XG4gICAgICByZXR1cm4gbiAqIGQ7XG4gICAgY2FzZSAnaG91cnMnOlxuICAgIGNhc2UgJ2hvdXInOlxuICAgIGNhc2UgJ2hycyc6XG4gICAgY2FzZSAnaHInOlxuICAgIGNhc2UgJ2gnOlxuICAgICAgcmV0dXJuIG4gKiBoO1xuICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgY2FzZSAnbWlucyc6XG4gICAgY2FzZSAnbWluJzpcbiAgICBjYXNlICdtJzpcbiAgICAgIHJldHVybiBuICogbTtcbiAgICBjYXNlICdzZWNvbmRzJzpcbiAgICBjYXNlICdzZWNvbmQnOlxuICAgIGNhc2UgJ3NlY3MnOlxuICAgIGNhc2UgJ3NlYyc6XG4gICAgY2FzZSAncyc6XG4gICAgICByZXR1cm4gbiAqIHM7XG4gICAgY2FzZSAnbWlsbGlzZWNvbmRzJzpcbiAgICBjYXNlICdtaWxsaXNlY29uZCc6XG4gICAgY2FzZSAnbXNlY3MnOlxuICAgIGNhc2UgJ21zZWMnOlxuICAgIGNhc2UgJ21zJzpcbiAgICAgIHJldHVybiBuO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogU2hvcnQgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZm10U2hvcnQobXMpIHtcbiAgdmFyIG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICBpZiAobXNBYnMgPj0gZCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gZCkgKyAnZCc7XG4gIH1cbiAgaWYgKG1zQWJzID49IGgpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGgpICsgJ2gnO1xuICB9XG4gIGlmIChtc0FicyA+PSBtKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBtKSArICdtJztcbiAgfVxuICBpZiAobXNBYnMgPj0gcykge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gcykgKyAncyc7XG4gIH1cbiAgcmV0dXJuIG1zICsgJ21zJztcbn1cblxuLyoqXG4gKiBMb25nIGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZtdExvbmcobXMpIHtcbiAgdmFyIG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICBpZiAobXNBYnMgPj0gZCkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBkLCAnZGF5Jyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IGgpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgaCwgJ2hvdXInKTtcbiAgfVxuICBpZiAobXNBYnMgPj0gbSkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBtLCAnbWludXRlJyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IHMpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgcywgJ3NlY29uZCcpO1xuICB9XG4gIHJldHVybiBtcyArICcgbXMnO1xufVxuXG4vKipcbiAqIFBsdXJhbGl6YXRpb24gaGVscGVyLlxuICovXG5cbmZ1bmN0aW9uIHBsdXJhbChtcywgbXNBYnMsIG4sIG5hbWUpIHtcbiAgdmFyIGlzUGx1cmFsID0gbXNBYnMgPj0gbiAqIDEuNTtcbiAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBuKSArICcgJyArIG5hbWUgKyAoaXNQbHVyYWwgPyAncycgOiAnJyk7XG59XG4iLCAiXG4vKipcbiAqIFRoaXMgaXMgdGhlIGNvbW1vbiBsb2dpYyBmb3IgYm90aCB0aGUgTm9kZS5qcyBhbmQgd2ViIGJyb3dzZXJcbiAqIGltcGxlbWVudGF0aW9ucyBvZiBgZGVidWcoKWAuXG4gKi9cblxuZnVuY3Rpb24gc2V0dXAoZW52KSB7XG5cdGNyZWF0ZURlYnVnLmRlYnVnID0gY3JlYXRlRGVidWc7XG5cdGNyZWF0ZURlYnVnLmRlZmF1bHQgPSBjcmVhdGVEZWJ1Zztcblx0Y3JlYXRlRGVidWcuY29lcmNlID0gY29lcmNlO1xuXHRjcmVhdGVEZWJ1Zy5kaXNhYmxlID0gZGlzYWJsZTtcblx0Y3JlYXRlRGVidWcuZW5hYmxlID0gZW5hYmxlO1xuXHRjcmVhdGVEZWJ1Zy5lbmFibGVkID0gZW5hYmxlZDtcblx0Y3JlYXRlRGVidWcuaHVtYW5pemUgPSByZXF1aXJlKCdtcycpO1xuXHRjcmVhdGVEZWJ1Zy5kZXN0cm95ID0gZGVzdHJveTtcblxuXHRPYmplY3Qua2V5cyhlbnYpLmZvckVhY2goa2V5ID0+IHtcblx0XHRjcmVhdGVEZWJ1Z1trZXldID0gZW52W2tleV07XG5cdH0pO1xuXG5cdC8qKlxuXHQqIFRoZSBjdXJyZW50bHkgYWN0aXZlIGRlYnVnIG1vZGUgbmFtZXMsIGFuZCBuYW1lcyB0byBza2lwLlxuXHQqL1xuXG5cdGNyZWF0ZURlYnVnLm5hbWVzID0gW107XG5cdGNyZWF0ZURlYnVnLnNraXBzID0gW107XG5cblx0LyoqXG5cdCogTWFwIG9mIHNwZWNpYWwgXCIlblwiIGhhbmRsaW5nIGZ1bmN0aW9ucywgZm9yIHRoZSBkZWJ1ZyBcImZvcm1hdFwiIGFyZ3VtZW50LlxuXHQqXG5cdCogVmFsaWQga2V5IG5hbWVzIGFyZSBhIHNpbmdsZSwgbG93ZXIgb3IgdXBwZXItY2FzZSBsZXR0ZXIsIGkuZS4gXCJuXCIgYW5kIFwiTlwiLlxuXHQqL1xuXHRjcmVhdGVEZWJ1Zy5mb3JtYXR0ZXJzID0ge307XG5cblx0LyoqXG5cdCogU2VsZWN0cyBhIGNvbG9yIGZvciBhIGRlYnVnIG5hbWVzcGFjZVxuXHQqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2UgVGhlIG5hbWVzcGFjZSBzdHJpbmcgZm9yIHRoZSBkZWJ1ZyBpbnN0YW5jZSB0byBiZSBjb2xvcmVkXG5cdCogQHJldHVybiB7TnVtYmVyfFN0cmluZ30gQW4gQU5TSSBjb2xvciBjb2RlIGZvciB0aGUgZ2l2ZW4gbmFtZXNwYWNlXG5cdCogQGFwaSBwcml2YXRlXG5cdCovXG5cdGZ1bmN0aW9uIHNlbGVjdENvbG9yKG5hbWVzcGFjZSkge1xuXHRcdGxldCBoYXNoID0gMDtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZXNwYWNlLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRoYXNoID0gKChoYXNoIDw8IDUpIC0gaGFzaCkgKyBuYW1lc3BhY2UuY2hhckNvZGVBdChpKTtcblx0XHRcdGhhc2ggfD0gMDsgLy8gQ29udmVydCB0byAzMmJpdCBpbnRlZ2VyXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNyZWF0ZURlYnVnLmNvbG9yc1tNYXRoLmFicyhoYXNoKSAlIGNyZWF0ZURlYnVnLmNvbG9ycy5sZW5ndGhdO1xuXHR9XG5cdGNyZWF0ZURlYnVnLnNlbGVjdENvbG9yID0gc2VsZWN0Q29sb3I7XG5cblx0LyoqXG5cdCogQ3JlYXRlIGEgZGVidWdnZXIgd2l0aCB0aGUgZ2l2ZW4gYG5hbWVzcGFjZWAuXG5cdCpcblx0KiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlXG5cdCogQHJldHVybiB7RnVuY3Rpb259XG5cdCogQGFwaSBwdWJsaWNcblx0Ki9cblx0ZnVuY3Rpb24gY3JlYXRlRGVidWcobmFtZXNwYWNlKSB7XG5cdFx0bGV0IHByZXZUaW1lO1xuXHRcdGxldCBlbmFibGVPdmVycmlkZSA9IG51bGw7XG5cdFx0bGV0IG5hbWVzcGFjZXNDYWNoZTtcblx0XHRsZXQgZW5hYmxlZENhY2hlO1xuXG5cdFx0ZnVuY3Rpb24gZGVidWcoLi4uYXJncykge1xuXHRcdFx0Ly8gRGlzYWJsZWQ/XG5cdFx0XHRpZiAoIWRlYnVnLmVuYWJsZWQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBzZWxmID0gZGVidWc7XG5cblx0XHRcdC8vIFNldCBgZGlmZmAgdGltZXN0YW1wXG5cdFx0XHRjb25zdCBjdXJyID0gTnVtYmVyKG5ldyBEYXRlKCkpO1xuXHRcdFx0Y29uc3QgbXMgPSBjdXJyIC0gKHByZXZUaW1lIHx8IGN1cnIpO1xuXHRcdFx0c2VsZi5kaWZmID0gbXM7XG5cdFx0XHRzZWxmLnByZXYgPSBwcmV2VGltZTtcblx0XHRcdHNlbGYuY3VyciA9IGN1cnI7XG5cdFx0XHRwcmV2VGltZSA9IGN1cnI7XG5cblx0XHRcdGFyZ3NbMF0gPSBjcmVhdGVEZWJ1Zy5jb2VyY2UoYXJnc1swXSk7XG5cblx0XHRcdGlmICh0eXBlb2YgYXJnc1swXSAhPT0gJ3N0cmluZycpIHtcblx0XHRcdFx0Ly8gQW55dGhpbmcgZWxzZSBsZXQncyBpbnNwZWN0IHdpdGggJU9cblx0XHRcdFx0YXJncy51bnNoaWZ0KCclTycpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBcHBseSBhbnkgYGZvcm1hdHRlcnNgIHRyYW5zZm9ybWF0aW9uc1xuXHRcdFx0bGV0IGluZGV4ID0gMDtcblx0XHRcdGFyZ3NbMF0gPSBhcmdzWzBdLnJlcGxhY2UoLyUoW2EtekEtWiVdKS9nLCAobWF0Y2gsIGZvcm1hdCkgPT4ge1xuXHRcdFx0XHQvLyBJZiB3ZSBlbmNvdW50ZXIgYW4gZXNjYXBlZCAlIHRoZW4gZG9uJ3QgaW5jcmVhc2UgdGhlIGFycmF5IGluZGV4XG5cdFx0XHRcdGlmIChtYXRjaCA9PT0gJyUlJykge1xuXHRcdFx0XHRcdHJldHVybiAnJSc7XG5cdFx0XHRcdH1cblx0XHRcdFx0aW5kZXgrKztcblx0XHRcdFx0Y29uc3QgZm9ybWF0dGVyID0gY3JlYXRlRGVidWcuZm9ybWF0dGVyc1tmb3JtYXRdO1xuXHRcdFx0XHRpZiAodHlwZW9mIGZvcm1hdHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRcdGNvbnN0IHZhbCA9IGFyZ3NbaW5kZXhdO1xuXHRcdFx0XHRcdG1hdGNoID0gZm9ybWF0dGVyLmNhbGwoc2VsZiwgdmFsKTtcblxuXHRcdFx0XHRcdC8vIE5vdyB3ZSBuZWVkIHRvIHJlbW92ZSBgYXJnc1tpbmRleF1gIHNpbmNlIGl0J3MgaW5saW5lZCBpbiB0aGUgYGZvcm1hdGBcblx0XHRcdFx0XHRhcmdzLnNwbGljZShpbmRleCwgMSk7XG5cdFx0XHRcdFx0aW5kZXgtLTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gbWF0Y2g7XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gQXBwbHkgZW52LXNwZWNpZmljIGZvcm1hdHRpbmcgKGNvbG9ycywgZXRjLilcblx0XHRcdGNyZWF0ZURlYnVnLmZvcm1hdEFyZ3MuY2FsbChzZWxmLCBhcmdzKTtcblxuXHRcdFx0Y29uc3QgbG9nRm4gPSBzZWxmLmxvZyB8fCBjcmVhdGVEZWJ1Zy5sb2c7XG5cdFx0XHRsb2dGbi5hcHBseShzZWxmLCBhcmdzKTtcblx0XHR9XG5cblx0XHRkZWJ1Zy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG5cdFx0ZGVidWcudXNlQ29sb3JzID0gY3JlYXRlRGVidWcudXNlQ29sb3JzKCk7XG5cdFx0ZGVidWcuY29sb3IgPSBjcmVhdGVEZWJ1Zy5zZWxlY3RDb2xvcihuYW1lc3BhY2UpO1xuXHRcdGRlYnVnLmV4dGVuZCA9IGV4dGVuZDtcblx0XHRkZWJ1Zy5kZXN0cm95ID0gY3JlYXRlRGVidWcuZGVzdHJveTsgLy8gWFhYIFRlbXBvcmFyeS4gV2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UuXG5cblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZGVidWcsICdlbmFibGVkJywge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG5cdFx0XHRnZXQ6ICgpID0+IHtcblx0XHRcdFx0aWYgKGVuYWJsZU92ZXJyaWRlICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGVuYWJsZU92ZXJyaWRlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChuYW1lc3BhY2VzQ2FjaGUgIT09IGNyZWF0ZURlYnVnLm5hbWVzcGFjZXMpIHtcblx0XHRcdFx0XHRuYW1lc3BhY2VzQ2FjaGUgPSBjcmVhdGVEZWJ1Zy5uYW1lc3BhY2VzO1xuXHRcdFx0XHRcdGVuYWJsZWRDYWNoZSA9IGNyZWF0ZURlYnVnLmVuYWJsZWQobmFtZXNwYWNlKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBlbmFibGVkQ2FjaGU7XG5cdFx0XHR9LFxuXHRcdFx0c2V0OiB2ID0+IHtcblx0XHRcdFx0ZW5hYmxlT3ZlcnJpZGUgPSB2O1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly8gRW52LXNwZWNpZmljIGluaXRpYWxpemF0aW9uIGxvZ2ljIGZvciBkZWJ1ZyBpbnN0YW5jZXNcblx0XHRpZiAodHlwZW9mIGNyZWF0ZURlYnVnLmluaXQgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdGNyZWF0ZURlYnVnLmluaXQoZGVidWcpO1xuXHRcdH1cblxuXHRcdHJldHVybiBkZWJ1Zztcblx0fVxuXG5cdGZ1bmN0aW9uIGV4dGVuZChuYW1lc3BhY2UsIGRlbGltaXRlcikge1xuXHRcdGNvbnN0IG5ld0RlYnVnID0gY3JlYXRlRGVidWcodGhpcy5uYW1lc3BhY2UgKyAodHlwZW9mIGRlbGltaXRlciA9PT0gJ3VuZGVmaW5lZCcgPyAnOicgOiBkZWxpbWl0ZXIpICsgbmFtZXNwYWNlKTtcblx0XHRuZXdEZWJ1Zy5sb2cgPSB0aGlzLmxvZztcblx0XHRyZXR1cm4gbmV3RGVidWc7XG5cdH1cblxuXHQvKipcblx0KiBFbmFibGVzIGEgZGVidWcgbW9kZSBieSBuYW1lc3BhY2VzLiBUaGlzIGNhbiBpbmNsdWRlIG1vZGVzXG5cdCogc2VwYXJhdGVkIGJ5IGEgY29sb24gYW5kIHdpbGRjYXJkcy5cblx0KlxuXHQqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG5cdCogQGFwaSBwdWJsaWNcblx0Ki9cblx0ZnVuY3Rpb24gZW5hYmxlKG5hbWVzcGFjZXMpIHtcblx0XHRjcmVhdGVEZWJ1Zy5zYXZlKG5hbWVzcGFjZXMpO1xuXHRcdGNyZWF0ZURlYnVnLm5hbWVzcGFjZXMgPSBuYW1lc3BhY2VzO1xuXG5cdFx0Y3JlYXRlRGVidWcubmFtZXMgPSBbXTtcblx0XHRjcmVhdGVEZWJ1Zy5za2lwcyA9IFtdO1xuXG5cdFx0bGV0IGk7XG5cdFx0Y29uc3Qgc3BsaXQgPSAodHlwZW9mIG5hbWVzcGFjZXMgPT09ICdzdHJpbmcnID8gbmFtZXNwYWNlcyA6ICcnKS5zcGxpdCgvW1xccyxdKy8pO1xuXHRcdGNvbnN0IGxlbiA9IHNwbGl0Lmxlbmd0aDtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0aWYgKCFzcGxpdFtpXSkge1xuXHRcdFx0XHQvLyBpZ25vcmUgZW1wdHkgc3RyaW5nc1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0bmFtZXNwYWNlcyA9IHNwbGl0W2ldLnJlcGxhY2UoL1xcKi9nLCAnLio/Jyk7XG5cblx0XHRcdGlmIChuYW1lc3BhY2VzWzBdID09PSAnLScpIHtcblx0XHRcdFx0Y3JlYXRlRGVidWcuc2tpcHMucHVzaChuZXcgUmVnRXhwKCdeJyArIG5hbWVzcGFjZXMuc2xpY2UoMSkgKyAnJCcpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNyZWF0ZURlYnVnLm5hbWVzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzICsgJyQnKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCogRGlzYWJsZSBkZWJ1ZyBvdXRwdXQuXG5cdCpcblx0KiBAcmV0dXJuIHtTdHJpbmd9IG5hbWVzcGFjZXNcblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBkaXNhYmxlKCkge1xuXHRcdGNvbnN0IG5hbWVzcGFjZXMgPSBbXG5cdFx0XHQuLi5jcmVhdGVEZWJ1Zy5uYW1lcy5tYXAodG9OYW1lc3BhY2UpLFxuXHRcdFx0Li4uY3JlYXRlRGVidWcuc2tpcHMubWFwKHRvTmFtZXNwYWNlKS5tYXAobmFtZXNwYWNlID0+ICctJyArIG5hbWVzcGFjZSlcblx0XHRdLmpvaW4oJywnKTtcblx0XHRjcmVhdGVEZWJ1Zy5lbmFibGUoJycpO1xuXHRcdHJldHVybiBuYW1lc3BhY2VzO1xuXHR9XG5cblx0LyoqXG5cdCogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBtb2RlIG5hbWUgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVcblx0KiBAcmV0dXJuIHtCb29sZWFufVxuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGVuYWJsZWQobmFtZSkge1xuXHRcdGlmIChuYW1lW25hbWUubGVuZ3RoIC0gMV0gPT09ICcqJykge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0bGV0IGk7XG5cdFx0bGV0IGxlbjtcblxuXHRcdGZvciAoaSA9IDAsIGxlbiA9IGNyZWF0ZURlYnVnLnNraXBzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRpZiAoY3JlYXRlRGVidWcuc2tpcHNbaV0udGVzdChuYW1lKSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Zm9yIChpID0gMCwgbGVuID0gY3JlYXRlRGVidWcubmFtZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGlmIChjcmVhdGVEZWJ1Zy5uYW1lc1tpXS50ZXN0KG5hbWUpKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQqIENvbnZlcnQgcmVnZXhwIHRvIG5hbWVzcGFjZVxuXHQqXG5cdCogQHBhcmFtIHtSZWdFeHB9IHJlZ3hlcFxuXHQqIEByZXR1cm4ge1N0cmluZ30gbmFtZXNwYWNlXG5cdCogQGFwaSBwcml2YXRlXG5cdCovXG5cdGZ1bmN0aW9uIHRvTmFtZXNwYWNlKHJlZ2V4cCkge1xuXHRcdHJldHVybiByZWdleHAudG9TdHJpbmcoKVxuXHRcdFx0LnN1YnN0cmluZygyLCByZWdleHAudG9TdHJpbmcoKS5sZW5ndGggLSAyKVxuXHRcdFx0LnJlcGxhY2UoL1xcLlxcKlxcPyQvLCAnKicpO1xuXHR9XG5cblx0LyoqXG5cdCogQ29lcmNlIGB2YWxgLlxuXHQqXG5cdCogQHBhcmFtIHtNaXhlZH0gdmFsXG5cdCogQHJldHVybiB7TWl4ZWR9XG5cdCogQGFwaSBwcml2YXRlXG5cdCovXG5cdGZ1bmN0aW9uIGNvZXJjZSh2YWwpIHtcblx0XHRpZiAodmFsIGluc3RhbmNlb2YgRXJyb3IpIHtcblx0XHRcdHJldHVybiB2YWwuc3RhY2sgfHwgdmFsLm1lc3NhZ2U7XG5cdFx0fVxuXHRcdHJldHVybiB2YWw7XG5cdH1cblxuXHQvKipcblx0KiBYWFggRE8gTk9UIFVTRS4gVGhpcyBpcyBhIHRlbXBvcmFyeSBzdHViIGZ1bmN0aW9uLlxuXHQqIFhYWCBJdCBXSUxMIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS5cblx0Ki9cblx0ZnVuY3Rpb24gZGVzdHJveSgpIHtcblx0XHRjb25zb2xlLndhcm4oJ0luc3RhbmNlIG1ldGhvZCBgZGVidWcuZGVzdHJveSgpYCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgYGRlYnVnYC4nKTtcblx0fVxuXG5cdGNyZWF0ZURlYnVnLmVuYWJsZShjcmVhdGVEZWJ1Zy5sb2FkKCkpO1xuXG5cdHJldHVybiBjcmVhdGVEZWJ1Zztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzZXR1cDtcbiIsICIvKiBlc2xpbnQtZW52IGJyb3dzZXIgKi9cblxuLyoqXG4gKiBUaGlzIGlzIHRoZSB3ZWIgYnJvd3NlciBpbXBsZW1lbnRhdGlvbiBvZiBgZGVidWcoKWAuXG4gKi9cblxuZXhwb3J0cy5mb3JtYXRBcmdzID0gZm9ybWF0QXJncztcbmV4cG9ydHMuc2F2ZSA9IHNhdmU7XG5leHBvcnRzLmxvYWQgPSBsb2FkO1xuZXhwb3J0cy51c2VDb2xvcnMgPSB1c2VDb2xvcnM7XG5leHBvcnRzLnN0b3JhZ2UgPSBsb2NhbHN0b3JhZ2UoKTtcbmV4cG9ydHMuZGVzdHJveSA9ICgoKSA9PiB7XG5cdGxldCB3YXJuZWQgPSBmYWxzZTtcblxuXHRyZXR1cm4gKCkgPT4ge1xuXHRcdGlmICghd2FybmVkKSB7XG5cdFx0XHR3YXJuZWQgPSB0cnVlO1xuXHRcdFx0Y29uc29sZS53YXJuKCdJbnN0YW5jZSBtZXRob2QgYGRlYnVnLmRlc3Ryb3koKWAgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIGRvZXMgYW55dGhpbmcuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIGBkZWJ1Z2AuJyk7XG5cdFx0fVxuXHR9O1xufSkoKTtcblxuLyoqXG4gKiBDb2xvcnMuXG4gKi9cblxuZXhwb3J0cy5jb2xvcnMgPSBbXG5cdCcjMDAwMENDJyxcblx0JyMwMDAwRkYnLFxuXHQnIzAwMzNDQycsXG5cdCcjMDAzM0ZGJyxcblx0JyMwMDY2Q0MnLFxuXHQnIzAwNjZGRicsXG5cdCcjMDA5OUNDJyxcblx0JyMwMDk5RkYnLFxuXHQnIzAwQ0MwMCcsXG5cdCcjMDBDQzMzJyxcblx0JyMwMENDNjYnLFxuXHQnIzAwQ0M5OScsXG5cdCcjMDBDQ0NDJyxcblx0JyMwMENDRkYnLFxuXHQnIzMzMDBDQycsXG5cdCcjMzMwMEZGJyxcblx0JyMzMzMzQ0MnLFxuXHQnIzMzMzNGRicsXG5cdCcjMzM2NkNDJyxcblx0JyMzMzY2RkYnLFxuXHQnIzMzOTlDQycsXG5cdCcjMzM5OUZGJyxcblx0JyMzM0NDMDAnLFxuXHQnIzMzQ0MzMycsXG5cdCcjMzNDQzY2Jyxcblx0JyMzM0NDOTknLFxuXHQnIzMzQ0NDQycsXG5cdCcjMzNDQ0ZGJyxcblx0JyM2NjAwQ0MnLFxuXHQnIzY2MDBGRicsXG5cdCcjNjYzM0NDJyxcblx0JyM2NjMzRkYnLFxuXHQnIzY2Q0MwMCcsXG5cdCcjNjZDQzMzJyxcblx0JyM5OTAwQ0MnLFxuXHQnIzk5MDBGRicsXG5cdCcjOTkzM0NDJyxcblx0JyM5OTMzRkYnLFxuXHQnIzk5Q0MwMCcsXG5cdCcjOTlDQzMzJyxcblx0JyNDQzAwMDAnLFxuXHQnI0NDMDAzMycsXG5cdCcjQ0MwMDY2Jyxcblx0JyNDQzAwOTknLFxuXHQnI0NDMDBDQycsXG5cdCcjQ0MwMEZGJyxcblx0JyNDQzMzMDAnLFxuXHQnI0NDMzMzMycsXG5cdCcjQ0MzMzY2Jyxcblx0JyNDQzMzOTknLFxuXHQnI0NDMzNDQycsXG5cdCcjQ0MzM0ZGJyxcblx0JyNDQzY2MDAnLFxuXHQnI0NDNjYzMycsXG5cdCcjQ0M5OTAwJyxcblx0JyNDQzk5MzMnLFxuXHQnI0NDQ0MwMCcsXG5cdCcjQ0NDQzMzJyxcblx0JyNGRjAwMDAnLFxuXHQnI0ZGMDAzMycsXG5cdCcjRkYwMDY2Jyxcblx0JyNGRjAwOTknLFxuXHQnI0ZGMDBDQycsXG5cdCcjRkYwMEZGJyxcblx0JyNGRjMzMDAnLFxuXHQnI0ZGMzMzMycsXG5cdCcjRkYzMzY2Jyxcblx0JyNGRjMzOTknLFxuXHQnI0ZGMzNDQycsXG5cdCcjRkYzM0ZGJyxcblx0JyNGRjY2MDAnLFxuXHQnI0ZGNjYzMycsXG5cdCcjRkY5OTAwJyxcblx0JyNGRjk5MzMnLFxuXHQnI0ZGQ0MwMCcsXG5cdCcjRkZDQzMzJ1xuXTtcblxuLyoqXG4gKiBDdXJyZW50bHkgb25seSBXZWJLaXQtYmFzZWQgV2ViIEluc3BlY3RvcnMsIEZpcmVmb3ggPj0gdjMxLFxuICogYW5kIHRoZSBGaXJlYnVnIGV4dGVuc2lvbiAoYW55IEZpcmVmb3ggdmVyc2lvbikgYXJlIGtub3duXG4gKiB0byBzdXBwb3J0IFwiJWNcIiBDU1MgY3VzdG9taXphdGlvbnMuXG4gKlxuICogVE9ETzogYWRkIGEgYGxvY2FsU3RvcmFnZWAgdmFyaWFibGUgdG8gZXhwbGljaXRseSBlbmFibGUvZGlzYWJsZSBjb2xvcnNcbiAqL1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuZnVuY3Rpb24gdXNlQ29sb3JzKCkge1xuXHQvLyBOQjogSW4gYW4gRWxlY3Ryb24gcHJlbG9hZCBzY3JpcHQsIGRvY3VtZW50IHdpbGwgYmUgZGVmaW5lZCBidXQgbm90IGZ1bGx5XG5cdC8vIGluaXRpYWxpemVkLiBTaW5jZSB3ZSBrbm93IHdlJ3JlIGluIENocm9tZSwgd2UnbGwganVzdCBkZXRlY3QgdGhpcyBjYXNlXG5cdC8vIGV4cGxpY2l0bHlcblx0aWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5wcm9jZXNzICYmICh3aW5kb3cucHJvY2Vzcy50eXBlID09PSAncmVuZGVyZXInIHx8IHdpbmRvdy5wcm9jZXNzLl9fbndqcykpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8vIEludGVybmV0IEV4cGxvcmVyIGFuZCBFZGdlIGRvIG5vdCBzdXBwb3J0IGNvbG9ycy5cblx0aWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC8oZWRnZXx0cmlkZW50KVxcLyhcXGQrKS8pKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Ly8gSXMgd2Via2l0PyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xNjQ1OTYwNi8zNzY3NzNcblx0Ly8gZG9jdW1lbnQgaXMgdW5kZWZpbmVkIGluIHJlYWN0LW5hdGl2ZTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0LW5hdGl2ZS9wdWxsLzE2MzJcblx0cmV0dXJuICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLldlYmtpdEFwcGVhcmFuY2UpIHx8XG5cdFx0Ly8gSXMgZmlyZWJ1Zz8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzk4MTIwLzM3Njc3M1xuXHRcdCh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuY29uc29sZSAmJiAod2luZG93LmNvbnNvbGUuZmlyZWJ1ZyB8fCAod2luZG93LmNvbnNvbGUuZXhjZXB0aW9uICYmIHdpbmRvdy5jb25zb2xlLnRhYmxlKSkpIHx8XG5cdFx0Ly8gSXMgZmlyZWZveCA+PSB2MzE/XG5cdFx0Ly8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9Ub29scy9XZWJfQ29uc29sZSNTdHlsaW5nX21lc3NhZ2VzXG5cdFx0KHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9maXJlZm94XFwvKFxcZCspLykgJiYgcGFyc2VJbnQoUmVnRXhwLiQxLCAxMCkgPj0gMzEpIHx8XG5cdFx0Ly8gRG91YmxlIGNoZWNrIHdlYmtpdCBpbiB1c2VyQWdlbnQganVzdCBpbiBjYXNlIHdlIGFyZSBpbiBhIHdvcmtlclxuXHRcdCh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvYXBwbGV3ZWJraXRcXC8oXFxkKykvKSk7XG59XG5cbi8qKlxuICogQ29sb3JpemUgbG9nIGFyZ3VtZW50cyBpZiBlbmFibGVkLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZm9ybWF0QXJncyhhcmdzKSB7XG5cdGFyZ3NbMF0gPSAodGhpcy51c2VDb2xvcnMgPyAnJWMnIDogJycpICtcblx0XHR0aGlzLm5hbWVzcGFjZSArXG5cdFx0KHRoaXMudXNlQ29sb3JzID8gJyAlYycgOiAnICcpICtcblx0XHRhcmdzWzBdICtcblx0XHQodGhpcy51c2VDb2xvcnMgPyAnJWMgJyA6ICcgJykgK1xuXHRcdCcrJyArIG1vZHVsZS5leHBvcnRzLmh1bWFuaXplKHRoaXMuZGlmZik7XG5cblx0aWYgKCF0aGlzLnVzZUNvbG9ycykge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGNvbnN0IGMgPSAnY29sb3I6ICcgKyB0aGlzLmNvbG9yO1xuXHRhcmdzLnNwbGljZSgxLCAwLCBjLCAnY29sb3I6IGluaGVyaXQnKTtcblxuXHQvLyBUaGUgZmluYWwgXCIlY1wiIGlzIHNvbWV3aGF0IHRyaWNreSwgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBvdGhlclxuXHQvLyBhcmd1bWVudHMgcGFzc2VkIGVpdGhlciBiZWZvcmUgb3IgYWZ0ZXIgdGhlICVjLCBzbyB3ZSBuZWVkIHRvXG5cdC8vIGZpZ3VyZSBvdXQgdGhlIGNvcnJlY3QgaW5kZXggdG8gaW5zZXJ0IHRoZSBDU1MgaW50b1xuXHRsZXQgaW5kZXggPSAwO1xuXHRsZXQgbGFzdEMgPSAwO1xuXHRhcmdzWzBdLnJlcGxhY2UoLyVbYS16QS1aJV0vZywgbWF0Y2ggPT4ge1xuXHRcdGlmIChtYXRjaCA9PT0gJyUlJykge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpbmRleCsrO1xuXHRcdGlmIChtYXRjaCA9PT0gJyVjJykge1xuXHRcdFx0Ly8gV2Ugb25seSBhcmUgaW50ZXJlc3RlZCBpbiB0aGUgKmxhc3QqICVjXG5cdFx0XHQvLyAodGhlIHVzZXIgbWF5IGhhdmUgcHJvdmlkZWQgdGhlaXIgb3duKVxuXHRcdFx0bGFzdEMgPSBpbmRleDtcblx0XHR9XG5cdH0pO1xuXG5cdGFyZ3Muc3BsaWNlKGxhc3RDLCAwLCBjKTtcbn1cblxuLyoqXG4gKiBJbnZva2VzIGBjb25zb2xlLmRlYnVnKClgIHdoZW4gYXZhaWxhYmxlLlxuICogTm8tb3Agd2hlbiBgY29uc29sZS5kZWJ1Z2AgaXMgbm90IGEgXCJmdW5jdGlvblwiLlxuICogSWYgYGNvbnNvbGUuZGVidWdgIGlzIG5vdCBhdmFpbGFibGUsIGZhbGxzIGJhY2tcbiAqIHRvIGBjb25zb2xlLmxvZ2AuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuZXhwb3J0cy5sb2cgPSBjb25zb2xlLmRlYnVnIHx8IGNvbnNvbGUubG9nIHx8ICgoKSA9PiB7fSk7XG5cbi8qKlxuICogU2F2ZSBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBzYXZlKG5hbWVzcGFjZXMpIHtcblx0dHJ5IHtcblx0XHRpZiAobmFtZXNwYWNlcykge1xuXHRcdFx0ZXhwb3J0cy5zdG9yYWdlLnNldEl0ZW0oJ2RlYnVnJywgbmFtZXNwYWNlcyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGV4cG9ydHMuc3RvcmFnZS5yZW1vdmVJdGVtKCdkZWJ1ZycpO1xuXHRcdH1cblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBTd2FsbG93XG5cdFx0Ly8gWFhYIChAUWl4LSkgc2hvdWxkIHdlIGJlIGxvZ2dpbmcgdGhlc2U/XG5cdH1cbn1cblxuLyoqXG4gKiBMb2FkIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHJldHVybnMgdGhlIHByZXZpb3VzbHkgcGVyc2lzdGVkIGRlYnVnIG1vZGVzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gbG9hZCgpIHtcblx0bGV0IHI7XG5cdHRyeSB7XG5cdFx0ciA9IGV4cG9ydHMuc3RvcmFnZS5nZXRJdGVtKCdkZWJ1ZycpO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIFN3YWxsb3dcblx0XHQvLyBYWFggKEBRaXgtKSBzaG91bGQgd2UgYmUgbG9nZ2luZyB0aGVzZT9cblx0fVxuXG5cdC8vIElmIGRlYnVnIGlzbid0IHNldCBpbiBMUywgYW5kIHdlJ3JlIGluIEVsZWN0cm9uLCB0cnkgdG8gbG9hZCAkREVCVUdcblx0aWYgKCFyICYmIHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiAnZW52JyBpbiBwcm9jZXNzKSB7XG5cdFx0ciA9IHByb2Nlc3MuZW52LkRFQlVHO1xuXHR9XG5cblx0cmV0dXJuIHI7XG59XG5cbi8qKlxuICogTG9jYWxzdG9yYWdlIGF0dGVtcHRzIHRvIHJldHVybiB0aGUgbG9jYWxzdG9yYWdlLlxuICpcbiAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugc2FmYXJpIHRocm93c1xuICogd2hlbiBhIHVzZXIgZGlzYWJsZXMgY29va2llcy9sb2NhbHN0b3JhZ2VcbiAqIGFuZCB5b3UgYXR0ZW1wdCB0byBhY2Nlc3MgaXQuXG4gKlxuICogQHJldHVybiB7TG9jYWxTdG9yYWdlfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbG9jYWxzdG9yYWdlKCkge1xuXHR0cnkge1xuXHRcdC8vIFRWTUxLaXQgKEFwcGxlIFRWIEpTIFJ1bnRpbWUpIGRvZXMgbm90IGhhdmUgYSB3aW5kb3cgb2JqZWN0LCBqdXN0IGxvY2FsU3RvcmFnZSBpbiB0aGUgZ2xvYmFsIGNvbnRleHRcblx0XHQvLyBUaGUgQnJvd3NlciBhbHNvIGhhcyBsb2NhbFN0b3JhZ2UgaW4gdGhlIGdsb2JhbCBjb250ZXh0LlxuXHRcdHJldHVybiBsb2NhbFN0b3JhZ2U7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gU3dhbGxvd1xuXHRcdC8vIFhYWCAoQFFpeC0pIHNob3VsZCB3ZSBiZSBsb2dnaW5nIHRoZXNlP1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9jb21tb24nKShleHBvcnRzKTtcblxuY29uc3Qge2Zvcm1hdHRlcnN9ID0gbW9kdWxlLmV4cG9ydHM7XG5cbi8qKlxuICogTWFwICVqIHRvIGBKU09OLnN0cmluZ2lmeSgpYCwgc2luY2Ugbm8gV2ViIEluc3BlY3RvcnMgZG8gdGhhdCBieSBkZWZhdWx0LlxuICovXG5cbmZvcm1hdHRlcnMuaiA9IGZ1bmN0aW9uICh2KSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIEpTT04uc3RyaW5naWZ5KHYpO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdHJldHVybiAnW1VuZXhwZWN0ZWRKU09OUGFyc2VFcnJvcl06ICcgKyBlcnJvci5tZXNzYWdlO1xuXHR9XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3Qge2Zvcm1hdH0gPSByZXF1aXJlKCdub2RlOnV0aWwnKTtcblxuLyoqXG4gKiBDb250YWlucyBlcnJvciBjb2RlcywgZmFjdG9yeSBmdW5jdGlvbnMgdG8gY3JlYXRlIHRocm93YWJsZSBlcnJvciBvYmplY3RzLFxuICogYW5kIHdhcm5pbmcvZGVwcmVjYXRpb24gZnVuY3Rpb25zLlxuICogQG1vZHVsZVxuICovXG5cbi8qKlxuICogcHJvY2Vzcy5lbWl0V2FybmluZyBvciBhIHBvbHlmaWxsXG4gKiBAc2VlIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvcHJvY2Vzcy5odG1sI3Byb2Nlc3NfcHJvY2Vzc19lbWl0d2FybmluZ193YXJuaW5nX29wdGlvbnNcbiAqIEBpZ25vcmVcbiAqL1xuY29uc3QgZW1pdFdhcm5pbmcgPSAobXNnLCB0eXBlKSA9PiB7XG4gIGlmIChwcm9jZXNzLmVtaXRXYXJuaW5nKSB7XG4gICAgcHJvY2Vzcy5lbWl0V2FybmluZyhtc2csIHR5cGUpO1xuICB9IGVsc2Uge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zb2xlLndhcm4odHlwZSArICc6ICcgKyBtc2cpO1xuICAgIH0pO1xuICB9XG59O1xuXG4vKipcbiAqIFNob3cgYSBkZXByZWNhdGlvbiB3YXJuaW5nLiBFYWNoIGRpc3RpbmN0IG1lc3NhZ2UgaXMgb25seSBkaXNwbGF5ZWQgb25jZS5cbiAqIElnbm9yZXMgZW1wdHkgbWVzc2FnZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttc2ddIC0gV2FybmluZyB0byBwcmludFxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgZGVwcmVjYXRlID0gbXNnID0+IHtcbiAgbXNnID0gU3RyaW5nKG1zZyk7XG4gIGlmIChtc2cgJiYgIWRlcHJlY2F0ZS5jYWNoZVttc2ddKSB7XG4gICAgZGVwcmVjYXRlLmNhY2hlW21zZ10gPSB0cnVlO1xuICAgIGVtaXRXYXJuaW5nKG1zZywgJ0RlcHJlY2F0aW9uV2FybmluZycpO1xuICB9XG59O1xuZGVwcmVjYXRlLmNhY2hlID0ge307XG5cbi8qKlxuICogU2hvdyBhIGdlbmVyaWMgd2FybmluZy5cbiAqIElnbm9yZXMgZW1wdHkgbWVzc2FnZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttc2ddIC0gV2FybmluZyB0byBwcmludFxuICogQHByaXZhdGVcbiAqL1xuY29uc3Qgd2FybiA9IG1zZyA9PiB7XG4gIGlmIChtc2cpIHtcbiAgICBlbWl0V2FybmluZyhtc2cpO1xuICB9XG59O1xuXG4vKipcbiAqIFdoZW4gTW9jaGEgdGhyb3dzIGV4Y2VwdGlvbnMgKG9yIHJlamVjdHMgYFByb21pc2VgcyksIGl0IGF0dGVtcHRzIHRvIGFzc2lnbiBhIGBjb2RlYCBwcm9wZXJ0eSB0byB0aGUgYEVycm9yYCBvYmplY3QsIGZvciBlYXNpZXIgaGFuZGxpbmcuIFRoZXNlIGFyZSB0aGUgcG90ZW50aWFsIHZhbHVlcyBvZiBgY29kZWAuXG4gKiBAcHVibGljXG4gKiBAbmFtZXNwYWNlXG4gKiBAbWVtYmVyb2YgbW9kdWxlOmxpYi9lcnJvcnNcbiAqL1xudmFyIGNvbnN0YW50cyA9IHtcbiAgLyoqXG4gICAqIEFuIHVucmVjb3ZlcmFibGUgZXJyb3IuXG4gICAqIEBjb25zdGFudFxuICAgKiBAZGVmYXVsdFxuICAgKi9cbiAgRkFUQUw6ICdFUlJfTU9DSEFfRkFUQUwnLFxuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBhbiBhcmd1bWVudCB0byBhIGZ1bmN0aW9uIGNhbGwgaXMgaW52YWxpZFxuICAgKiBAY29uc3RhbnRcbiAgICogQGRlZmF1bHRcbiAgICovXG4gIElOVkFMSURfQVJHX1RZUEU6ICdFUlJfTU9DSEFfSU5WQUxJRF9BUkdfVFlQRScsXG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiBhbiBhcmd1bWVudCB0byBhIGZ1bmN0aW9uIGNhbGwgaXMgaW52YWxpZFxuICAgKiBAY29uc3RhbnRcbiAgICogQGRlZmF1bHRcbiAgICovXG4gIElOVkFMSURfQVJHX1ZBTFVFOiAnRVJSX01PQ0hBX0lOVkFMSURfQVJHX1ZBTFVFJyxcblxuICAvKipcbiAgICogU29tZXRoaW5nIHdhcyB0aHJvd24sIGJ1dCBpdCB3YXNuJ3QgYW4gYEVycm9yYFxuICAgKiBAY29uc3RhbnRcbiAgICogQGRlZmF1bHRcbiAgICovXG4gIElOVkFMSURfRVhDRVBUSU9OOiAnRVJSX01PQ0hBX0lOVkFMSURfRVhDRVBUSU9OJyxcblxuICAvKipcbiAgICogQW4gaW50ZXJmYWNlIChlLmcuLCBgTW9jaGEuaW50ZXJmYWNlc2ApIGlzIHVua25vd24gb3IgaW52YWxpZFxuICAgKiBAY29uc3RhbnRcbiAgICogQGRlZmF1bHRcbiAgICovXG4gIElOVkFMSURfSU5URVJGQUNFOiAnRVJSX01PQ0hBX0lOVkFMSURfSU5URVJGQUNFJyxcblxuICAvKipcbiAgICogQSByZXBvcnRlciAoLmUuZywgYE1vY2hhLnJlcG9ydGVyc2ApIGlzIHVua25vd24gb3IgaW52YWxpZFxuICAgKiBAY29uc3RhbnRcbiAgICogQGRlZmF1bHRcbiAgICovXG4gIElOVkFMSURfUkVQT1JURVI6ICdFUlJfTU9DSEFfSU5WQUxJRF9SRVBPUlRFUicsXG5cbiAgLyoqXG4gICAqIGBkb25lKClgIHdhcyBjYWxsZWQgdHdpY2UgaW4gYSBgVGVzdGAgb3IgYEhvb2tgIGNhbGxiYWNrXG4gICAqIEBjb25zdGFudFxuICAgKiBAZGVmYXVsdFxuICAgKi9cbiAgTVVMVElQTEVfRE9ORTogJ0VSUl9NT0NIQV9NVUxUSVBMRV9ET05FJyxcblxuICAvKipcbiAgICogTm8gZmlsZXMgbWF0Y2hlZCB0aGUgcGF0dGVybiBwcm92aWRlZCBieSB0aGUgdXNlclxuICAgKiBAY29uc3RhbnRcbiAgICogQGRlZmF1bHRcbiAgICovXG4gIE5PX0ZJTEVTX01BVENIX1BBVFRFUk46ICdFUlJfTU9DSEFfTk9fRklMRVNfTUFUQ0hfUEFUVEVSTicsXG5cbiAgLyoqXG4gICAqIEtub3duLCBidXQgdW5zdXBwb3J0ZWQgYmVoYXZpb3Igb2Ygc29tZSBraW5kXG4gICAqIEBjb25zdGFudFxuICAgKiBAZGVmYXVsdFxuICAgKi9cbiAgVU5TVVBQT1JURUQ6ICdFUlJfTU9DSEFfVU5TVVBQT1JURUQnLFxuXG4gIC8qKlxuICAgKiBJbnZhbGlkIHN0YXRlIHRyYW5zaXRpb24gb2NjdXJyaW5nIGluIGBNb2NoYWAgaW5zdGFuY2VcbiAgICogQGNvbnN0YW50XG4gICAqIEBkZWZhdWx0XG4gICAqL1xuICBJTlNUQU5DRV9BTFJFQURZX1JVTk5JTkc6ICdFUlJfTU9DSEFfSU5TVEFOQ0VfQUxSRUFEWV9SVU5OSU5HJyxcblxuICAvKipcbiAgICogSW52YWxpZCBzdGF0ZSB0cmFuc2l0aW9uIG9jY3VycmluZyBpbiBgTW9jaGFgIGluc3RhbmNlXG4gICAqIEBjb25zdGFudFxuICAgKiBAZGVmYXVsdFxuICAgKi9cbiAgSU5TVEFOQ0VfQUxSRUFEWV9ESVNQT1NFRDogJ0VSUl9NT0NIQV9JTlNUQU5DRV9BTFJFQURZX0RJU1BPU0VEJyxcblxuICAvKipcbiAgICogVXNlIG9mIGBvbmx5KClgIHcvIGAtLWZvcmJpZC1vbmx5YCByZXN1bHRzIGluIHRoaXMgZXJyb3IuXG4gICAqIEBjb25zdGFudFxuICAgKiBAZGVmYXVsdFxuICAgKi9cbiAgRk9SQklEREVOX0VYQ0xVU0lWSVRZOiAnRVJSX01PQ0hBX0ZPUkJJRERFTl9FWENMVVNJVklUWScsXG5cbiAgLyoqXG4gICAqIFRvIGJlIHRocm93biB3aGVuIGEgdXNlci1kZWZpbmVkIHBsdWdpbiBpbXBsZW1lbnRhdGlvbiAoZS5nLiwgYG1vY2hhSG9va3NgKSBpcyBpbnZhbGlkXG4gICAqIEBjb25zdGFudFxuICAgKiBAZGVmYXVsdFxuICAgKi9cbiAgSU5WQUxJRF9QTFVHSU5fSU1QTEVNRU5UQVRJT046ICdFUlJfTU9DSEFfSU5WQUxJRF9QTFVHSU5fSU1QTEVNRU5UQVRJT04nLFxuXG4gIC8qKlxuICAgKiBUbyBiZSB0aHJvd24gd2hlbiBhIGJ1aWx0aW4gb3IgdGhpcmQtcGFydHkgcGx1Z2luIGRlZmluaXRpb24gKHRoZSBfZGVmaW5pdGlvbl8gb2YgYG1vY2hhSG9va3NgKSBpcyBpbnZhbGlkXG4gICAqIEBjb25zdGFudFxuICAgKiBAZGVmYXVsdFxuICAgKi9cbiAgSU5WQUxJRF9QTFVHSU5fREVGSU5JVElPTjogJ0VSUl9NT0NIQV9JTlZBTElEX1BMVUdJTl9ERUZJTklUSU9OJyxcblxuICAvKipcbiAgICogV2hlbiBhIHJ1bm5hYmxlIGV4Y2VlZHMgaXRzIGFsbG93ZWQgcnVuIHRpbWUuXG4gICAqIEBjb25zdGFudFxuICAgKiBAZGVmYXVsdFxuICAgKi9cbiAgVElNRU9VVDogJ0VSUl9NT0NIQV9USU1FT1VUJyxcblxuICAvKipcbiAgICogSW5wdXQgZmlsZSBpcyBub3QgYWJsZSB0byBiZSBwYXJzZWRcbiAgICogQGNvbnN0YW50XG4gICAqIEBkZWZhdWx0XG4gICAqL1xuICBVTlBBUlNBQkxFX0ZJTEU6ICdFUlJfTU9DSEFfVU5QQVJTQUJMRV9GSUxFJ1xufTtcblxuLyoqXG4gKiBBIHNldCBjb250YWluaW5nIGFsbCBzdHJpbmcgdmFsdWVzIG9mIGFsbCBNb2NoYSBlcnJvciBjb25zdGFudHMsIGZvciB1c2UgYnkge0BsaW5rIGlzTW9jaGFFcnJvcn0uXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBNT0NIQV9FUlJPUlMgPSBuZXcgU2V0KE9iamVjdC52YWx1ZXMoY29uc3RhbnRzKSk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBlcnJvciBvYmplY3QgdG8gYmUgdGhyb3duIHdoZW4gbm8gZmlsZXMgdG8gYmUgdGVzdGVkIGNvdWxkIGJlIGZvdW5kIHVzaW5nIHNwZWNpZmllZCBwYXR0ZXJuLlxuICpcbiAqIEBwdWJsaWNcbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gRXJyb3IgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0dGVybiAtIFVzZXItc3BlY2lmaWVkIGFyZ3VtZW50IHZhbHVlLlxuICogQHJldHVybnMge0Vycm9yfSBpbnN0YW5jZSBkZXRhaWxpbmcgdGhlIGVycm9yIGNvbmRpdGlvblxuICovXG5mdW5jdGlvbiBjcmVhdGVOb0ZpbGVzTWF0Y2hQYXR0ZXJuRXJyb3IobWVzc2FnZSwgcGF0dGVybikge1xuICB2YXIgZXJyID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICBlcnIuY29kZSA9IGNvbnN0YW50cy5OT19GSUxFU19NQVRDSF9QQVRURVJOO1xuICBlcnIucGF0dGVybiA9IHBhdHRlcm47XG4gIHJldHVybiBlcnI7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBlcnJvciBvYmplY3QgdG8gYmUgdGhyb3duIHdoZW4gdGhlIHJlcG9ydGVyIHNwZWNpZmllZCBpbiB0aGUgb3B0aW9ucyB3YXMgbm90IGZvdW5kLlxuICpcbiAqIEBwdWJsaWNcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gRXJyb3IgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVwb3J0ZXIgLSBVc2VyLXNwZWNpZmllZCByZXBvcnRlciB2YWx1ZS5cbiAqIEByZXR1cm5zIHtFcnJvcn0gaW5zdGFuY2UgZGV0YWlsaW5nIHRoZSBlcnJvciBjb25kaXRpb25cbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW52YWxpZFJlcG9ydGVyRXJyb3IobWVzc2FnZSwgcmVwb3J0ZXIpIHtcbiAgdmFyIGVyciA9IG5ldyBUeXBlRXJyb3IobWVzc2FnZSk7XG4gIGVyci5jb2RlID0gY29uc3RhbnRzLklOVkFMSURfUkVQT1JURVI7XG4gIGVyci5yZXBvcnRlciA9IHJlcG9ydGVyO1xuICByZXR1cm4gZXJyO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gZXJyb3Igb2JqZWN0IHRvIGJlIHRocm93biB3aGVuIHRoZSBpbnRlcmZhY2Ugc3BlY2lmaWVkIGluIHRoZSBvcHRpb25zIHdhcyBub3QgZm91bmQuXG4gKlxuICogQHB1YmxpY1xuICogQHN0YXRpY1xuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBFcnJvciBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB1aSAtIFVzZXItc3BlY2lmaWVkIGludGVyZmFjZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHtFcnJvcn0gaW5zdGFuY2UgZGV0YWlsaW5nIHRoZSBlcnJvciBjb25kaXRpb25cbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW52YWxpZEludGVyZmFjZUVycm9yKG1lc3NhZ2UsIHVpKSB7XG4gIHZhciBlcnIgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIGVyci5jb2RlID0gY29uc3RhbnRzLklOVkFMSURfSU5URVJGQUNFO1xuICBlcnIuaW50ZXJmYWNlID0gdWk7XG4gIHJldHVybiBlcnI7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBlcnJvciBvYmplY3QgdG8gYmUgdGhyb3duIHdoZW4gYSBiZWhhdmlvciwgb3B0aW9uLCBvciBwYXJhbWV0ZXIgaXMgdW5zdXBwb3J0ZWQuXG4gKlxuICogQHB1YmxpY1xuICogQHN0YXRpY1xuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBFcnJvciBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZC5cbiAqIEByZXR1cm5zIHtFcnJvcn0gaW5zdGFuY2UgZGV0YWlsaW5nIHRoZSBlcnJvciBjb25kaXRpb25cbiAqL1xuZnVuY3Rpb24gY3JlYXRlVW5zdXBwb3J0ZWRFcnJvcihtZXNzYWdlKSB7XG4gIHZhciBlcnIgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIGVyci5jb2RlID0gY29uc3RhbnRzLlVOU1VQUE9SVEVEO1xuICByZXR1cm4gZXJyO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gZXJyb3Igb2JqZWN0IHRvIGJlIHRocm93biB3aGVuIGFuIGFyZ3VtZW50IGlzIG1pc3NpbmcuXG4gKlxuICogQHB1YmxpY1xuICogQHN0YXRpY1xuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBFcnJvciBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmd1bWVudCAtIEFyZ3VtZW50IG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWQgLSBFeHBlY3RlZCBhcmd1bWVudCBkYXRhdHlwZS5cbiAqIEByZXR1cm5zIHtFcnJvcn0gaW5zdGFuY2UgZGV0YWlsaW5nIHRoZSBlcnJvciBjb25kaXRpb25cbiAqL1xuZnVuY3Rpb24gY3JlYXRlTWlzc2luZ0FyZ3VtZW50RXJyb3IobWVzc2FnZSwgYXJndW1lbnQsIGV4cGVjdGVkKSB7XG4gIHJldHVybiBjcmVhdGVJbnZhbGlkQXJndW1lbnRUeXBlRXJyb3IobWVzc2FnZSwgYXJndW1lbnQsIGV4cGVjdGVkKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGVycm9yIG9iamVjdCB0byBiZSB0aHJvd24gd2hlbiBhbiBhcmd1bWVudCBkaWQgbm90IHVzZSB0aGUgc3VwcG9ydGVkIHR5cGVcbiAqXG4gKiBAcHVibGljXG4gKiBAc3RhdGljXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIEVycm9yIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3VtZW50IC0gQXJndW1lbnQgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZCAtIEV4cGVjdGVkIGFyZ3VtZW50IGRhdGF0eXBlLlxuICogQHJldHVybnMge0Vycm9yfSBpbnN0YW5jZSBkZXRhaWxpbmcgdGhlIGVycm9yIGNvbmRpdGlvblxuICovXG5mdW5jdGlvbiBjcmVhdGVJbnZhbGlkQXJndW1lbnRUeXBlRXJyb3IobWVzc2FnZSwgYXJndW1lbnQsIGV4cGVjdGVkKSB7XG4gIHZhciBlcnIgPSBuZXcgVHlwZUVycm9yKG1lc3NhZ2UpO1xuICBlcnIuY29kZSA9IGNvbnN0YW50cy5JTlZBTElEX0FSR19UWVBFO1xuICBlcnIuYXJndW1lbnQgPSBhcmd1bWVudDtcbiAgZXJyLmV4cGVjdGVkID0gZXhwZWN0ZWQ7XG4gIGVyci5hY3R1YWwgPSB0eXBlb2YgYXJndW1lbnQ7XG4gIHJldHVybiBlcnI7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBlcnJvciBvYmplY3QgdG8gYmUgdGhyb3duIHdoZW4gYW4gYXJndW1lbnQgZGlkIG5vdCB1c2UgdGhlIHN1cHBvcnRlZCB2YWx1ZVxuICpcbiAqIEBwdWJsaWNcbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gRXJyb3IgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJndW1lbnQgLSBBcmd1bWVudCBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gQXJndW1lbnQgdmFsdWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3JlYXNvbl0gLSBXaHkgdmFsdWUgaXMgaW52YWxpZC5cbiAqIEByZXR1cm5zIHtFcnJvcn0gaW5zdGFuY2UgZGV0YWlsaW5nIHRoZSBlcnJvciBjb25kaXRpb25cbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW52YWxpZEFyZ3VtZW50VmFsdWVFcnJvcihtZXNzYWdlLCBhcmd1bWVudCwgdmFsdWUsIHJlYXNvbikge1xuICB2YXIgZXJyID0gbmV3IFR5cGVFcnJvcihtZXNzYWdlKTtcbiAgZXJyLmNvZGUgPSBjb25zdGFudHMuSU5WQUxJRF9BUkdfVkFMVUU7XG4gIGVyci5hcmd1bWVudCA9IGFyZ3VtZW50O1xuICBlcnIudmFsdWUgPSB2YWx1ZTtcbiAgZXJyLnJlYXNvbiA9IHR5cGVvZiByZWFzb24gIT09ICd1bmRlZmluZWQnID8gcmVhc29uIDogJ2lzIGludmFsaWQnO1xuICByZXR1cm4gZXJyO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gZXJyb3Igb2JqZWN0IHRvIGJlIHRocm93biB3aGVuIGFuIGV4Y2VwdGlvbiB3YXMgY2F1Z2h0LCBidXQgdGhlIGBFcnJvcmAgaXMgZmFsc3kgb3IgdW5kZWZpbmVkLlxuICpcbiAqIEBwdWJsaWNcbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gRXJyb3IgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQuXG4gKiBAcmV0dXJucyB7RXJyb3J9IGluc3RhbmNlIGRldGFpbGluZyB0aGUgZXJyb3IgY29uZGl0aW9uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUludmFsaWRFeGNlcHRpb25FcnJvcihtZXNzYWdlLCB2YWx1ZSkge1xuICB2YXIgZXJyID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICBlcnIuY29kZSA9IGNvbnN0YW50cy5JTlZBTElEX0VYQ0VQVElPTjtcbiAgZXJyLnZhbHVlVHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgZXJyLnZhbHVlID0gdmFsdWU7XG4gIHJldHVybiBlcnI7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBlcnJvciBvYmplY3QgdG8gYmUgdGhyb3duIHdoZW4gYW4gdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cnMuXG4gKlxuICogQHB1YmxpY1xuICogQHN0YXRpY1xuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBFcnJvciBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZC5cbiAqIEByZXR1cm5zIHtFcnJvcn0gaW5zdGFuY2UgZGV0YWlsaW5nIHRoZSBlcnJvciBjb25kaXRpb25cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRmF0YWxFcnJvcihtZXNzYWdlLCB2YWx1ZSkge1xuICB2YXIgZXJyID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICBlcnIuY29kZSA9IGNvbnN0YW50cy5GQVRBTDtcbiAgZXJyLnZhbHVlVHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgZXJyLnZhbHVlID0gdmFsdWU7XG4gIHJldHVybiBlcnI7XG59XG5cbi8qKlxuICogRHluYW1pY2FsbHkgY3JlYXRlcyBhIHBsdWdpbi10eXBlLXNwZWNpZmljIGVycm9yIGJhc2VkIG9uIHBsdWdpbiB0eXBlXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIEVycm9yIG1lc3NhZ2VcbiAqIEBwYXJhbSB7XCJyZXBvcnRlclwifFwidWlcIn0gcGx1Z2luVHlwZSAtIFBsdWdpbiB0eXBlLiBGdXR1cmU6IGV4cGFuZCBhcyBuZWVkZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcGx1Z2luSWRdIC0gTmFtZS9wYXRoIG9mIHBsdWdpbiwgaWYgYW55XG4gKiBAdGhyb3dzIFdoZW4gYHBsdWdpblR5cGVgIGlzIG5vdCBrbm93blxuICogQHB1YmxpY1xuICogQHN0YXRpY1xuICogQHJldHVybnMge0Vycm9yfVxuICovXG5mdW5jdGlvbiBjcmVhdGVJbnZhbGlkTGVnYWN5UGx1Z2luRXJyb3IobWVzc2FnZSwgcGx1Z2luVHlwZSwgcGx1Z2luSWQpIHtcbiAgc3dpdGNoIChwbHVnaW5UeXBlKSB7XG4gICAgY2FzZSAncmVwb3J0ZXInOlxuICAgICAgcmV0dXJuIGNyZWF0ZUludmFsaWRSZXBvcnRlckVycm9yKG1lc3NhZ2UsIHBsdWdpbklkKTtcbiAgICBjYXNlICd1aSc6XG4gICAgICByZXR1cm4gY3JlYXRlSW52YWxpZEludGVyZmFjZUVycm9yKG1lc3NhZ2UsIHBsdWdpbklkKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIHBsdWdpblR5cGUgXCInICsgcGx1Z2luVHlwZSArICdcIicpO1xuICB9XG59XG5cbi8qKlxuICogKipERVBSRUNBVEVEKiouICBVc2Uge0BsaW5rIGNyZWF0ZUludmFsaWRMZWdhY3lQbHVnaW5FcnJvcn0gaW5zdGVhZCAgRHluYW1pY2FsbHkgY3JlYXRlcyBhIHBsdWdpbi10eXBlLXNwZWNpZmljIGVycm9yIGJhc2VkIG9uIHBsdWdpbiB0eXBlXG4gKiBAZGVwcmVjYXRlZFxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBFcnJvciBtZXNzYWdlXG4gKiBAcGFyYW0ge1wicmVwb3J0ZXJcInxcImludGVyZmFjZVwifSBwbHVnaW5UeXBlIC0gUGx1Z2luIHR5cGUuIEZ1dHVyZTogZXhwYW5kIGFzIG5lZWRlZFxuICogQHBhcmFtIHtzdHJpbmd9IFtwbHVnaW5JZF0gLSBOYW1lL3BhdGggb2YgcGx1Z2luLCBpZiBhbnlcbiAqIEB0aHJvd3MgV2hlbiBgcGx1Z2luVHlwZWAgaXMgbm90IGtub3duXG4gKiBAcHVibGljXG4gKiBAc3RhdGljXG4gKiBAcmV0dXJucyB7RXJyb3J9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUludmFsaWRQbHVnaW5FcnJvciguLi5hcmdzKSB7XG4gIGRlcHJlY2F0ZSgnVXNlIGNyZWF0ZUludmFsaWRMZWdhY3lQbHVnaW5FcnJvcigpIGluc3RlYWQnKTtcbiAgcmV0dXJuIGNyZWF0ZUludmFsaWRMZWdhY3lQbHVnaW5FcnJvciguLi5hcmdzKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGVycm9yIG9iamVjdCB0byBiZSB0aHJvd24gd2hlbiBhIG1vY2hhIG9iamVjdCdzIGBydW5gIG1ldGhvZCBpcyBleGVjdXRlZCB3aGlsZSBpdCBpcyBhbHJlYWR5IGRpc3Bvc2VkLlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgVGhlIGVycm9yIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkLlxuICogQHBhcmFtIHtib29sZWFufSBjbGVhblJlZmVyZW5jZXNBZnRlclJ1biB0aGUgdmFsdWUgb2YgYGNsZWFuUmVmZXJlbmNlc0FmdGVyUnVuYFxuICogQHBhcmFtIHtNb2NoYX0gaW5zdGFuY2UgdGhlIG1vY2hhIGluc3RhbmNlIHRoYXQgdGhyb3cgdGhpcyBlcnJvclxuICogQHN0YXRpY1xuICovXG5mdW5jdGlvbiBjcmVhdGVNb2NoYUluc3RhbmNlQWxyZWFkeURpc3Bvc2VkRXJyb3IoXG4gIG1lc3NhZ2UsXG4gIGNsZWFuUmVmZXJlbmNlc0FmdGVyUnVuLFxuICBpbnN0YW5jZVxuKSB7XG4gIHZhciBlcnIgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIGVyci5jb2RlID0gY29uc3RhbnRzLklOU1RBTkNFX0FMUkVBRFlfRElTUE9TRUQ7XG4gIGVyci5jbGVhblJlZmVyZW5jZXNBZnRlclJ1biA9IGNsZWFuUmVmZXJlbmNlc0FmdGVyUnVuO1xuICBlcnIuaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgcmV0dXJuIGVycjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGVycm9yIG9iamVjdCB0byBiZSB0aHJvd24gd2hlbiBhIG1vY2hhIG9iamVjdCdzIGBydW5gIG1ldGhvZCBpcyBjYWxsZWQgd2hpbGUgYSB0ZXN0IHJ1biBpcyBpbiBwcm9ncmVzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIFRoZSBlcnJvciBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZC5cbiAqIEBzdGF0aWNcbiAqIEBwdWJsaWNcbiAqL1xuZnVuY3Rpb24gY3JlYXRlTW9jaGFJbnN0YW5jZUFscmVhZHlSdW5uaW5nRXJyb3IobWVzc2FnZSwgaW5zdGFuY2UpIHtcbiAgdmFyIGVyciA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgZXJyLmNvZGUgPSBjb25zdGFudHMuSU5TVEFOQ0VfQUxSRUFEWV9SVU5OSU5HO1xuICBlcnIuaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgcmV0dXJuIGVycjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGVycm9yIG9iamVjdCB0byBiZSB0aHJvd24gd2hlbiBkb25lKCkgaXMgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGluIGEgdGVzdFxuICpcbiAqIEBwdWJsaWNcbiAqIEBwYXJhbSB7UnVubmFibGV9IHJ1bm5hYmxlIC0gT3JpZ2luYWwgcnVubmFibGVcbiAqIEBwYXJhbSB7RXJyb3J9IFtvcmlnaW5hbEVycl0gLSBPcmlnaW5hbCBlcnJvciwgaWYgYW55XG4gKiBAcmV0dXJucyB7RXJyb3J9IGluc3RhbmNlIGRldGFpbGluZyB0aGUgZXJyb3IgY29uZGl0aW9uXG4gKiBAc3RhdGljXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU11bHRpcGxlRG9uZUVycm9yKHJ1bm5hYmxlLCBvcmlnaW5hbEVycikge1xuICB2YXIgdGl0bGU7XG4gIHRyeSB7XG4gICAgdGl0bGUgPSBmb3JtYXQoJzwlcz4nLCBydW5uYWJsZS5mdWxsVGl0bGUoKSk7XG4gICAgaWYgKHJ1bm5hYmxlLnBhcmVudC5yb290KSB7XG4gICAgICB0aXRsZSArPSAnIChvZiByb290IHN1aXRlKSc7XG4gICAgfVxuICB9IGNhdGNoIChpZ25vcmVkKSB7XG4gICAgdGl0bGUgPSBmb3JtYXQoJzwlcz4gKG9mIHVua25vd24gc3VpdGUpJywgcnVubmFibGUudGl0bGUpO1xuICB9XG4gIHZhciBtZXNzYWdlID0gZm9ybWF0KFxuICAgICdkb25lKCkgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGluICVzICVzJyxcbiAgICBydW5uYWJsZS50eXBlID8gcnVubmFibGUudHlwZSA6ICd1bmtub3duIHJ1bm5hYmxlJyxcbiAgICB0aXRsZVxuICApO1xuICBpZiAocnVubmFibGUuZmlsZSkge1xuICAgIG1lc3NhZ2UgKz0gZm9ybWF0KCcgb2YgZmlsZSAlcycsIHJ1bm5hYmxlLmZpbGUpO1xuICB9XG4gIGlmIChvcmlnaW5hbEVycikge1xuICAgIG1lc3NhZ2UgKz0gZm9ybWF0KCc7IGluIGFkZGl0aW9uLCBkb25lKCkgcmVjZWl2ZWQgZXJyb3I6ICVzJywgb3JpZ2luYWxFcnIpO1xuICB9XG5cbiAgdmFyIGVyciA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgZXJyLmNvZGUgPSBjb25zdGFudHMuTVVMVElQTEVfRE9ORTtcbiAgZXJyLnZhbHVlVHlwZSA9IHR5cGVvZiBvcmlnaW5hbEVycjtcbiAgZXJyLnZhbHVlID0gb3JpZ2luYWxFcnI7XG4gIHJldHVybiBlcnI7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBlcnJvciBvYmplY3QgdG8gYmUgdGhyb3duIHdoZW4gYC5vbmx5KClgIGlzIHVzZWQgd2l0aFxuICogYC0tZm9yYmlkLW9ubHlgLlxuICogQHN0YXRpY1xuICogQHB1YmxpY1xuICogQHBhcmFtIHtNb2NoYX0gbW9jaGEgLSBNb2NoYSBpbnN0YW5jZVxuICogQHJldHVybnMge0Vycm9yfSBFcnJvciB3aXRoIGNvZGUge0BsaW5rIGNvbnN0YW50cy5GT1JCSURERU5fRVhDTFVTSVZJVFl9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUZvcmJpZGRlbkV4Y2x1c2l2aXR5RXJyb3IobW9jaGEpIHtcbiAgdmFyIGVyciA9IG5ldyBFcnJvcihcbiAgICBtb2NoYS5pc1dvcmtlclxuICAgICAgPyAnYC5vbmx5YCBpcyBub3Qgc3VwcG9ydGVkIGluIHBhcmFsbGVsIG1vZGUnXG4gICAgICA6ICdgLm9ubHlgIGZvcmJpZGRlbiBieSAtLWZvcmJpZC1vbmx5J1xuICApO1xuICBlcnIuY29kZSA9IGNvbnN0YW50cy5GT1JCSURERU5fRVhDTFVTSVZJVFk7XG4gIHJldHVybiBlcnI7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBlcnJvciBvYmplY3QgdG8gYmUgdGhyb3duIHdoZW4gYSBwbHVnaW4gZGVmaW5pdGlvbiBpcyBpbnZhbGlkXG4gKiBAc3RhdGljXG4gKiBAcGFyYW0ge3N0cmluZ30gbXNnIC0gRXJyb3IgbWVzc2FnZVxuICogQHBhcmFtIHtQbHVnaW5EZWZpbml0aW9ufSBbcGx1Z2luRGVmXSAtIFByb2JsZW1hdGljIHBsdWdpbiBkZWZpbml0aW9uXG4gKiBAcHVibGljXG4gKiBAcmV0dXJucyB7RXJyb3J9IEVycm9yIHdpdGggY29kZSB7QGxpbmsgY29uc3RhbnRzLklOVkFMSURfUExVR0lOX0RFRklOSVRJT059XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUludmFsaWRQbHVnaW5EZWZpbml0aW9uRXJyb3IobXNnLCBwbHVnaW5EZWYpIHtcbiAgY29uc3QgZXJyID0gbmV3IEVycm9yKG1zZyk7XG4gIGVyci5jb2RlID0gY29uc3RhbnRzLklOVkFMSURfUExVR0lOX0RFRklOSVRJT047XG4gIGVyci5wbHVnaW5EZWYgPSBwbHVnaW5EZWY7XG4gIHJldHVybiBlcnI7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBlcnJvciBvYmplY3QgdG8gYmUgdGhyb3duIHdoZW4gYSBwbHVnaW4gaW1wbGVtZW50YXRpb24gKHVzZXIgY29kZSkgaXMgaW52YWxpZFxuICogQHN0YXRpY1xuICogQHBhcmFtIHtzdHJpbmd9IG1zZyAtIEVycm9yIG1lc3NhZ2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0c10gLSBQbHVnaW4gZGVmaW5pdGlvbiBhbmQgdXNlci1zdXBwbGllZCBpbXBsZW1lbnRhdGlvblxuICogQHBhcmFtIHtQbHVnaW5EZWZpbml0aW9ufSBbb3B0cy5wbHVnaW5EZWZdIC0gUGx1Z2luIERlZmluaXRpb25cbiAqIEBwYXJhbSB7Kn0gW29wdHMucGx1Z2luSW1wbF0gLSBQbHVnaW4gSW1wbGVtZW50YXRpb24gKHVzZXItc3VwcGxpZWQpXG4gKiBAcHVibGljXG4gKiBAcmV0dXJucyB7RXJyb3J9IEVycm9yIHdpdGggY29kZSB7QGxpbmsgY29uc3RhbnRzLklOVkFMSURfUExVR0lOX0RFRklOSVRJT059XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUludmFsaWRQbHVnaW5JbXBsZW1lbnRhdGlvbkVycm9yKFxuICBtc2csXG4gIHtwbHVnaW5EZWYsIHBsdWdpbkltcGx9ID0ge31cbikge1xuICBjb25zdCBlcnIgPSBuZXcgRXJyb3IobXNnKTtcbiAgZXJyLmNvZGUgPSBjb25zdGFudHMuSU5WQUxJRF9QTFVHSU5fSU1QTEVNRU5UQVRJT047XG4gIGVyci5wbHVnaW5EZWYgPSBwbHVnaW5EZWY7XG4gIGVyci5wbHVnaW5JbXBsID0gcGx1Z2luSW1wbDtcbiAgcmV0dXJuIGVycjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGVycm9yIG9iamVjdCB0byBiZSB0aHJvd24gd2hlbiBhIHJ1bm5hYmxlIGV4Y2VlZHMgaXRzIGFsbG93ZWQgcnVuIHRpbWUuXG4gKiBAc3RhdGljXG4gKiBAcGFyYW0ge3N0cmluZ30gbXNnIC0gRXJyb3IgbWVzc2FnZVxuICogQHBhcmFtIHtudW1iZXJ9IFt0aW1lb3V0XSAtIFRpbWVvdXQgaW4gbXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBbZmlsZV0gLSBGaWxlLCBpZiBnaXZlblxuICogQHJldHVybnMge01vY2hhVGltZW91dEVycm9yfVxuICovXG5mdW5jdGlvbiBjcmVhdGVUaW1lb3V0RXJyb3IobXNnLCB0aW1lb3V0LCBmaWxlKSB7XG4gIGNvbnN0IGVyciA9IG5ldyBFcnJvcihtc2cpO1xuICBlcnIuY29kZSA9IGNvbnN0YW50cy5USU1FT1VUO1xuICBlcnIudGltZW91dCA9IHRpbWVvdXQ7XG4gIGVyci5maWxlID0gZmlsZTtcbiAgcmV0dXJuIGVycjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGVycm9yIG9iamVjdCB0byBiZSB0aHJvd24gd2hlbiBmaWxlIGlzIHVucGFyc2FibGVcbiAqIEBwdWJsaWNcbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gRXJyb3IgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBGaWxlIG5hbWVcbiAqIEByZXR1cm5zIHtFcnJvcn0gRXJyb3Igd2l0aCBjb2RlIHtAbGluayBjb25zdGFudHMuVU5QQVJTQUJMRV9GSUxFfVxuICovXG5mdW5jdGlvbiBjcmVhdGVVbnBhcnNhYmxlRmlsZUVycm9yKG1lc3NhZ2UsIGZpbGVuYW1lKSB7XG4gIHZhciBlcnIgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIGVyci5jb2RlID0gY29uc3RhbnRzLlVOUEFSU0FCTEVfRklMRTtcbiAgcmV0dXJuIGVycjtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlcnJvciBjYW1lIG91dCBvZiBNb2NoYS5cbiAqIF9DYW4gc3VmZmVyIGZyb20gZmFsc2UgbmVnYXRpdmVzLCBidXQgbm90IGZhbHNlIHBvc2l0aXZlcy5fXG4gKiBAc3RhdGljXG4gKiBAcHVibGljXG4gKiBAcGFyYW0geyp9IGVyciAtIEVycm9yLCBvciBhbnl0aGluZ1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGlzTW9jaGFFcnJvciA9IGVyciA9PlxuICBCb29sZWFuKGVyciAmJiB0eXBlb2YgZXJyID09PSAnb2JqZWN0JyAmJiBNT0NIQV9FUlJPUlMuaGFzKGVyci5jb2RlKSk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBjb25zdGFudHMsXG4gIGNyZWF0ZUZhdGFsRXJyb3IsXG4gIGNyZWF0ZUZvcmJpZGRlbkV4Y2x1c2l2aXR5RXJyb3IsXG4gIGNyZWF0ZUludmFsaWRBcmd1bWVudFR5cGVFcnJvcixcbiAgY3JlYXRlSW52YWxpZEFyZ3VtZW50VmFsdWVFcnJvcixcbiAgY3JlYXRlSW52YWxpZEV4Y2VwdGlvbkVycm9yLFxuICBjcmVhdGVJbnZhbGlkSW50ZXJmYWNlRXJyb3IsXG4gIGNyZWF0ZUludmFsaWRMZWdhY3lQbHVnaW5FcnJvcixcbiAgY3JlYXRlSW52YWxpZFBsdWdpbkRlZmluaXRpb25FcnJvcixcbiAgY3JlYXRlSW52YWxpZFBsdWdpbkVycm9yLFxuICBjcmVhdGVJbnZhbGlkUGx1Z2luSW1wbGVtZW50YXRpb25FcnJvcixcbiAgY3JlYXRlSW52YWxpZFJlcG9ydGVyRXJyb3IsXG4gIGNyZWF0ZU1pc3NpbmdBcmd1bWVudEVycm9yLFxuICBjcmVhdGVNb2NoYUluc3RhbmNlQWxyZWFkeURpc3Bvc2VkRXJyb3IsXG4gIGNyZWF0ZU1vY2hhSW5zdGFuY2VBbHJlYWR5UnVubmluZ0Vycm9yLFxuICBjcmVhdGVNdWx0aXBsZURvbmVFcnJvcixcbiAgY3JlYXRlTm9GaWxlc01hdGNoUGF0dGVybkVycm9yLFxuICBjcmVhdGVUaW1lb3V0RXJyb3IsXG4gIGNyZWF0ZVVucGFyc2FibGVGaWxlRXJyb3IsXG4gIGNyZWF0ZVVuc3VwcG9ydGVkRXJyb3IsXG4gIGRlcHJlY2F0ZSxcbiAgaXNNb2NoYUVycm9yLFxuICB3YXJuXG59O1xuXG4vKipcbiAqIFRoZSBlcnJvciB0aHJvd24gd2hlbiBhIFJ1bm5hYmxlIHRpbWVzIG91dFxuICogQG1lbWJlcm9mIG1vZHVsZTpsaWIvZXJyb3JzXG4gKiBAdHlwZWRlZiB7RXJyb3J9IE1vY2hhVGltZW91dEVycm9yXG4gKiBAcHJvcGVydHkge2NvbnN0YW50cy5USU1FT1VUfSBjb2RlIC0gRXJyb3IgY29kZVxuICogQHByb3BlcnR5IHtudW1iZXI/fSB0aW1lb3V0IFRpbWVvdXQgaW4gbXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nP30gZmlsZSBGaWxlcGF0aCwgaWYgZ2l2ZW5cbiAqL1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJ25vZGU6ZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xudmFyIFBlbmRpbmcgPSByZXF1aXJlKCcuL3BlbmRpbmcnKTtcbnZhciBkZWJ1ZyA9IHJlcXVpcmUoJ2RlYnVnJykoJ21vY2hhOnJ1bm5hYmxlJyk7XG52YXIgbWlsbGlzZWNvbmRzID0gcmVxdWlyZSgnbXMnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbmNvbnN0IHtcbiAgY3JlYXRlSW52YWxpZEV4Y2VwdGlvbkVycm9yLFxuICBjcmVhdGVNdWx0aXBsZURvbmVFcnJvcixcbiAgY3JlYXRlVGltZW91dEVycm9yXG59ID0gcmVxdWlyZSgnLi9lcnJvcnMnKTtcblxuLyoqXG4gKiBTYXZlIHRpbWVyIHJlZmVyZW5jZXMgdG8gYXZvaWQgU2lub24gaW50ZXJmZXJpbmcgKHNlZSBHSC0yMzcpLlxuICogQHByaXZhdGVcbiAqL1xudmFyIERhdGUgPSBnbG9iYWwuRGF0ZTtcbnZhciBzZXRUaW1lb3V0ID0gZ2xvYmFsLnNldFRpbWVvdXQ7XG52YXIgY2xlYXJUaW1lb3V0ID0gZ2xvYmFsLmNsZWFyVGltZW91dDtcbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbnZhciBNQVhfVElNRU9VVCA9IE1hdGgucG93KDIsIDMxKSAtIDE7XG5cbm1vZHVsZS5leHBvcnRzID0gUnVubmFibGU7XG5cbi8vIFwiQWRkaXRpb25hbCBwcm9wZXJ0aWVzXCIgZG9jIGNvbW1lbnQgYWRkZWQgZm9yIGhvc3RlZCBkb2NzIChtb2NoYWpzLm9yZy9hcGkpXG4vKipcbiAqIEluaXRpYWxpemUgYSBuZXcgYFJ1bm5hYmxlYCB3aXRoIHRoZSBnaXZlbiBgdGl0bGVgIGFuZCBjYWxsYmFjayBgZm5gLlxuICogQWRkaXRpb25hbCBwcm9wZXJ0aWVzLCBsaWtlIGBnZXRGdWxsVGl0bGUoKWAgYW5kIGBzbG93KClgLCBjYW4gYmUgdmlld2VkIGluIHRoZSBgUnVubmFibGVgIHNvdXJjZS5cbiAqXG4gKiBAY2xhc3NcbiAqIEBleHRlbmRzIGV4dGVybmFsOkV2ZW50RW1pdHRlclxuICogQHB1YmxpY1xuICogQHBhcmFtIHtTdHJpbmd9IHRpdGxlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICovXG5mdW5jdGlvbiBSdW5uYWJsZSh0aXRsZSwgZm4pIHtcbiAgdGhpcy50aXRsZSA9IHRpdGxlO1xuICB0aGlzLmZuID0gZm47XG4gIHRoaXMuYm9keSA9IChmbiB8fCAnJykudG9TdHJpbmcoKTtcbiAgdGhpcy5hc3luYyA9IGZuICYmIGZuLmxlbmd0aDtcbiAgdGhpcy5zeW5jID0gIXRoaXMuYXN5bmM7XG4gIHRoaXMuX3RpbWVvdXQgPSAyMDAwO1xuICB0aGlzLl9zbG93ID0gNzU7XG4gIHRoaXMuX3JldHJpZXMgPSAtMTtcbiAgdXRpbHMuYXNzaWduTmV3TW9jaGFJRCh0aGlzKTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdpZCcsIHtcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdXRpbHMuZ2V0TW9jaGFJRCh0aGlzKTtcbiAgICB9XG4gIH0pO1xuICB0aGlzLnJlc2V0KCk7XG59XG5cbi8qKlxuICogSW5oZXJpdCBmcm9tIGBFdmVudEVtaXR0ZXIucHJvdG90eXBlYC5cbiAqL1xudXRpbHMuaW5oZXJpdHMoUnVubmFibGUsIEV2ZW50RW1pdHRlcik7XG5cbi8qKlxuICogUmVzZXRzIHRoZSBzdGF0ZSBpbml0aWFsbHkgb3IgZm9yIGEgbmV4dCBydW4uXG4gKi9cblJ1bm5hYmxlLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy50aW1lZE91dCA9IGZhbHNlO1xuICB0aGlzLl9jdXJyZW50UmV0cnkgPSAwO1xuICB0aGlzLnBlbmRpbmcgPSBmYWxzZTtcbiAgZGVsZXRlIHRoaXMuc3RhdGU7XG4gIGRlbGV0ZSB0aGlzLmVycjtcbn07XG5cbi8qKlxuICogR2V0IGN1cnJlbnQgdGltZW91dCB2YWx1ZSBpbiBtc2Vjcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybnMge251bWJlcn0gY3VycmVudCB0aW1lb3V0IHRocmVzaG9sZCB2YWx1ZVxuICovXG4vKipcbiAqIEBzdW1tYXJ5XG4gKiBTZXQgdGltZW91dCB0aHJlc2hvbGQgdmFsdWUgKG1zZWNzKS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEEgc3RyaW5nIGFyZ3VtZW50IGNhbiB1c2Ugc2hvcnRoYW5kIChlLmcuLCBcIjJzXCIpIGFuZCB3aWxsIGJlIGNvbnZlcnRlZC5cbiAqIFRoZSB2YWx1ZSB3aWxsIGJlIGNsYW1wZWQgdG8gcmFuZ2UgWzxjb2RlPjA8L2NvZGU+LCA8Y29kZT4yXjxzdXA+MzE8L3N1cD4tMTwvY29kZT5dLlxuICogSWYgY2xhbXBlZCB2YWx1ZSBtYXRjaGVzIGVpdGhlciByYW5nZSBlbmRwb2ludCwgdGltZW91dHMgd2lsbCBiZSBkaXNhYmxlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvd09yV29ya2VyR2xvYmFsU2NvcGUvc2V0VGltZW91dCNNYXhpbXVtX2RlbGF5X3ZhbHVlfVxuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSBtcyAtIFRpbWVvdXQgdGhyZXNob2xkIHZhbHVlLlxuICogQHJldHVybnMge1J1bm5hYmxlfSB0aGlzXG4gKiBAY2hhaW5hYmxlXG4gKi9cblJ1bm5hYmxlLnByb3RvdHlwZS50aW1lb3V0ID0gZnVuY3Rpb24gKG1zKSB7XG4gIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIHJldHVybiB0aGlzLl90aW1lb3V0O1xuICB9XG4gIGlmICh0eXBlb2YgbXMgPT09ICdzdHJpbmcnKSB7XG4gICAgbXMgPSBtaWxsaXNlY29uZHMobXMpO1xuICB9XG5cbiAgLy8gQ2xhbXAgdG8gcmFuZ2VcbiAgdmFyIHJhbmdlID0gWzAsIE1BWF9USU1FT1VUXTtcbiAgbXMgPSB1dGlscy5jbGFtcChtcywgcmFuZ2UpO1xuXG4gIC8vIHNlZSAjMTY1MiBmb3IgcmVhc29uaW5nXG4gIGlmIChtcyA9PT0gcmFuZ2VbMF0gfHwgbXMgPT09IHJhbmdlWzFdKSB7XG4gICAgdGhpcy5fdGltZW91dCA9IDA7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fdGltZW91dCA9IG1zO1xuICB9XG4gIGRlYnVnKCd0aW1lb3V0ICVkJywgdGhpcy5fdGltZW91dCk7XG5cbiAgaWYgKHRoaXMudGltZXIpIHtcbiAgICB0aGlzLnJlc2V0VGltZW91dCgpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXQgb3IgZ2V0IHNsb3cgYG1zYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSBtc1xuICogQHJldHVybiB7UnVubmFibGV8bnVtYmVyfSBtcyBvciBSdW5uYWJsZSBpbnN0YW5jZS5cbiAqL1xuUnVubmFibGUucHJvdG90eXBlLnNsb3cgPSBmdW5jdGlvbiAobXMpIHtcbiAgaWYgKCFhcmd1bWVudHMubGVuZ3RoIHx8IHR5cGVvZiBtcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gdGhpcy5fc2xvdztcbiAgfVxuICBpZiAodHlwZW9mIG1zID09PSAnc3RyaW5nJykge1xuICAgIG1zID0gbWlsbGlzZWNvbmRzKG1zKTtcbiAgfVxuICBkZWJ1Zygnc2xvdyAlZCcsIG1zKTtcbiAgdGhpcy5fc2xvdyA9IG1zO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogSGFsdCBhbmQgbWFyayBhcyBwZW5kaW5nLlxuICpcbiAqIEBtZW1iZXJvZiBNb2NoYS5SdW5uYWJsZVxuICogQHB1YmxpY1xuICovXG5SdW5uYWJsZS5wcm90b3R5cGUuc2tpcCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5wZW5kaW5nID0gdHJ1ZTtcbiAgdGhyb3cgbmV3IFBlbmRpbmcoJ3N5bmMgc2tpcDsgYWJvcnRpbmcgZXhlY3V0aW9uJyk7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIHRoaXMgcnVubmFibGUgb3IgaXRzIHBhcmVudCBzdWl0ZSBpcyBtYXJrZWQgYXMgcGVuZGluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5SdW5uYWJsZS5wcm90b3R5cGUuaXNQZW5kaW5nID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5wZW5kaW5nIHx8ICh0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC5pc1BlbmRpbmcoKSk7XG59O1xuXG4vKipcbiAqIFJldHVybiBgdHJ1ZWAgaWYgdGhpcyBSdW5uYWJsZSBoYXMgZmFpbGVkLlxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqIEBwcml2YXRlXG4gKi9cblJ1bm5hYmxlLnByb3RvdHlwZS5pc0ZhaWxlZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICF0aGlzLmlzUGVuZGluZygpICYmIHRoaXMuc3RhdGUgPT09IGNvbnN0YW50cy5TVEFURV9GQUlMRUQ7XG59O1xuXG4vKipcbiAqIFJldHVybiBgdHJ1ZWAgaWYgdGhpcyBSdW5uYWJsZSBoYXMgcGFzc2VkLlxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqIEBwcml2YXRlXG4gKi9cblJ1bm5hYmxlLnByb3RvdHlwZS5pc1Bhc3NlZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICF0aGlzLmlzUGVuZGluZygpICYmIHRoaXMuc3RhdGUgPT09IGNvbnN0YW50cy5TVEFURV9QQVNTRUQ7XG59O1xuXG4vKipcbiAqIFNldCBvciBnZXQgbnVtYmVyIG9mIHJldHJpZXMuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuUnVubmFibGUucHJvdG90eXBlLnJldHJpZXMgPSBmdW5jdGlvbiAobikge1xuICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmV0cmllcztcbiAgfVxuICB0aGlzLl9yZXRyaWVzID0gbjtcbn07XG5cbi8qKlxuICogU2V0IG9yIGdldCBjdXJyZW50IHJldHJ5XG4gKlxuICogQHByaXZhdGVcbiAqL1xuUnVubmFibGUucHJvdG90eXBlLmN1cnJlbnRSZXRyeSA9IGZ1bmN0aW9uIChuKSB7XG4gIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIHJldHVybiB0aGlzLl9jdXJyZW50UmV0cnk7XG4gIH1cbiAgdGhpcy5fY3VycmVudFJldHJ5ID0gbjtcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBmdWxsIHRpdGxlIGdlbmVyYXRlZCBieSByZWN1cnNpdmVseSBjb25jYXRlbmF0aW5nIHRoZSBwYXJlbnQnc1xuICogZnVsbCB0aXRsZS5cbiAqXG4gKiBAbWVtYmVyb2YgTW9jaGEuUnVubmFibGVcbiAqIEBwdWJsaWNcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuUnVubmFibGUucHJvdG90eXBlLmZ1bGxUaXRsZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMudGl0bGVQYXRoKCkuam9pbignICcpO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIHRpdGxlIHBhdGggZ2VuZXJhdGVkIGJ5IGNvbmNhdGVuYXRpbmcgdGhlIHBhcmVudCdzIHRpdGxlIHBhdGggd2l0aCB0aGUgdGl0bGUuXG4gKlxuICogQG1lbWJlcm9mIE1vY2hhLlJ1bm5hYmxlXG4gKiBAcHVibGljXG4gKiBAcmV0dXJuIHtzdHJpbmdbXX1cbiAqL1xuUnVubmFibGUucHJvdG90eXBlLnRpdGxlUGF0aCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMucGFyZW50LnRpdGxlUGF0aCgpLmNvbmNhdChbdGhpcy50aXRsZV0pO1xufTtcblxuLyoqXG4gKiBDbGVhciB0aGUgdGltZW91dC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5SdW5uYWJsZS5wcm90b3R5cGUuY2xlYXJUaW1lb3V0ID0gZnVuY3Rpb24gKCkge1xuICBjbGVhclRpbWVvdXQodGhpcy50aW1lcik7XG59O1xuXG4vKipcbiAqIFJlc2V0IHRoZSB0aW1lb3V0LlxuICpcbiAqIEBwcml2YXRlXG4gKi9cblJ1bm5hYmxlLnByb3RvdHlwZS5yZXNldFRpbWVvdXQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIG1zID0gdGhpcy50aW1lb3V0KCkgfHwgTUFYX1RJTUVPVVQ7XG5cbiAgdGhpcy5jbGVhclRpbWVvdXQoKTtcbiAgdGhpcy50aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIGlmIChzZWxmLnRpbWVvdXQoKSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZWxmLmNhbGxiYWNrKHNlbGYuX3RpbWVvdXRFcnJvcihtcykpO1xuICAgIHNlbGYudGltZWRPdXQgPSB0cnVlO1xuICB9LCBtcyk7XG59O1xuXG4vKipcbiAqIFNldCBvciBnZXQgYSBsaXN0IG9mIHdoaXRlbGlzdGVkIGdsb2JhbHMgZm9yIHRoaXMgdGVzdCBydW4uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nW119IGdsb2JhbHNcbiAqL1xuUnVubmFibGUucHJvdG90eXBlLmdsb2JhbHMgPSBmdW5jdGlvbiAoZ2xvYmFscykge1xuICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gdGhpcy5fYWxsb3dlZEdsb2JhbHM7XG4gIH1cbiAgdGhpcy5fYWxsb3dlZEdsb2JhbHMgPSBnbG9iYWxzO1xufTtcblxuLyoqXG4gKiBSdW4gdGhlIHRlc3QgYW5kIGludm9rZSBgZm4oZXJyKWAuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEBwcml2YXRlXG4gKi9cblJ1bm5hYmxlLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoZm4pIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgc3RhcnQgPSBuZXcgRGF0ZSgpO1xuICB2YXIgY3R4ID0gdGhpcy5jdHg7XG4gIHZhciBmaW5pc2hlZDtcbiAgdmFyIGVycm9yV2FzSGFuZGxlZCA9IGZhbHNlO1xuXG4gIGlmICh0aGlzLmlzUGVuZGluZygpKSByZXR1cm4gZm4oKTtcblxuICAvLyBTb21ldGltZXMgdGhlIGN0eCBleGlzdHMsIGJ1dCBpdCBpcyBub3QgcnVubmFibGVcbiAgaWYgKGN0eCAmJiBjdHgucnVubmFibGUpIHtcbiAgICBjdHgucnVubmFibGUodGhpcyk7XG4gIH1cblxuICAvLyBjYWxsZWQgbXVsdGlwbGUgdGltZXNcbiAgZnVuY3Rpb24gbXVsdGlwbGUoZXJyKSB7XG4gICAgaWYgKGVycm9yV2FzSGFuZGxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlcnJvcldhc0hhbmRsZWQgPSB0cnVlO1xuICAgIHNlbGYuZW1pdCgnZXJyb3InLCBjcmVhdGVNdWx0aXBsZURvbmVFcnJvcihzZWxmLCBlcnIpKTtcbiAgfVxuXG4gIC8vIGZpbmlzaGVkXG4gIGZ1bmN0aW9uIGRvbmUoZXJyKSB7XG4gICAgdmFyIG1zID0gc2VsZi50aW1lb3V0KCk7XG4gICAgaWYgKHNlbGYudGltZWRPdXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZmluaXNoZWQpIHtcbiAgICAgIHJldHVybiBtdWx0aXBsZShlcnIpO1xuICAgIH1cblxuICAgIHNlbGYuY2xlYXJUaW1lb3V0KCk7XG4gICAgc2VsZi5kdXJhdGlvbiA9IG5ldyBEYXRlKCkgLSBzdGFydDtcbiAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgaWYgKCFlcnIgJiYgc2VsZi5kdXJhdGlvbiA+IG1zICYmIG1zID4gMCkge1xuICAgICAgZXJyID0gc2VsZi5fdGltZW91dEVycm9yKG1zKTtcbiAgICB9XG4gICAgZm4oZXJyKTtcbiAgfVxuXG4gIC8vIGZvciAucmVzZXRUaW1lb3V0KCkgYW5kIFJ1bm5lciN1bmNhdWdodCgpXG4gIHRoaXMuY2FsbGJhY2sgPSBkb25lO1xuXG4gIGlmICh0aGlzLmZuICYmIHR5cGVvZiB0aGlzLmZuLmNhbGwgIT09ICdmdW5jdGlvbicpIHtcbiAgICBkb25lKFxuICAgICAgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgJ0EgcnVubmFibGUgbXVzdCBiZSBwYXNzZWQgYSBmdW5jdGlvbiBhcyBpdHMgc2Vjb25kIGFyZ3VtZW50LidcbiAgICAgIClcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIGV4cGxpY2l0IGFzeW5jIHdpdGggYGRvbmVgIGFyZ3VtZW50XG4gIGlmICh0aGlzLmFzeW5jKSB7XG4gICAgdGhpcy5yZXNldFRpbWVvdXQoKTtcblxuICAgIC8vIGFsbG93cyBza2lwKCkgdG8gYmUgdXNlZCBpbiBhbiBleHBsaWNpdCBhc3luYyBjb250ZXh0XG4gICAgdGhpcy5za2lwID0gZnVuY3Rpb24gYXN5bmNTa2lwKCkge1xuICAgICAgdGhpcy5wZW5kaW5nID0gdHJ1ZTtcbiAgICAgIGRvbmUoKTtcbiAgICAgIC8vIGhhbHQgZXhlY3V0aW9uLCB0aGUgdW5jYXVnaHQgaGFuZGxlciB3aWxsIGlnbm9yZSB0aGUgZmFpbHVyZS5cbiAgICAgIHRocm93IG5ldyBQZW5kaW5nKCdhc3luYyBza2lwOyBhYm9ydGluZyBleGVjdXRpb24nKTtcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNhbGxGbkFzeW5jKHRoaXMuZm4pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gaGFuZGxlcyBhc3luYyBydW5uYWJsZXMgd2hpY2ggYWN0dWFsbHkgcnVuIHN5bmNocm9ub3VzbHlcbiAgICAgIGVycm9yV2FzSGFuZGxlZCA9IHRydWU7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgUGVuZGluZykge1xuICAgICAgICByZXR1cm47IC8vIGRvbmUoKSBpcyBhbHJlYWR5IGNhbGxlZCBpbiB0aGlzLnNraXAoKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmFsbG93VW5jYXVnaHQpIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgZG9uZShSdW5uYWJsZS50b1ZhbHVlT3JFcnJvcihlcnIpKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gc3luYyBvciBwcm9taXNlLXJldHVybmluZ1xuICB0cnkge1xuICAgIGNhbGxGbih0aGlzLmZuKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyb3JXYXNIYW5kbGVkID0gdHJ1ZTtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgUGVuZGluZykge1xuICAgICAgcmV0dXJuIGRvbmUoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYWxsb3dVbmNhdWdodCkge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICBkb25lKFJ1bm5hYmxlLnRvVmFsdWVPckVycm9yKGVycikpO1xuICB9XG5cbiAgZnVuY3Rpb24gY2FsbEZuKGZuKSB7XG4gICAgdmFyIHJlc3VsdCA9IGZuLmNhbGwoY3R4KTtcbiAgICBpZiAocmVzdWx0ICYmIHR5cGVvZiByZXN1bHQudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgc2VsZi5yZXNldFRpbWVvdXQoKTtcbiAgICAgIHJlc3VsdC50aGVuKFxuICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgIC8vIFJldHVybiBudWxsIHNvIGxpYnJhcmllcyBsaWtlIGJsdWViaXJkIGRvIG5vdCB3YXJuIGFib3V0XG4gICAgICAgICAgLy8gc3Vic2VxdWVudGx5IGNvbnN0cnVjdGVkIFByb21pc2VzLlxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9LFxuICAgICAgICBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgZG9uZShyZWFzb24gfHwgbmV3IEVycm9yKCdQcm9taXNlIHJlamVjdGVkIHdpdGggbm8gb3IgZmFsc3kgcmVhc29uJykpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc2VsZi5hc3luY09ubHkpIHtcbiAgICAgICAgcmV0dXJuIGRvbmUoXG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgJy0tYXN5bmMtb25seSBvcHRpb24gaW4gdXNlIHdpdGhvdXQgZGVjbGFyaW5nIGBkb25lKClgIG9yIHJldHVybmluZyBhIHByb21pc2UnXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBkb25lKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2FsbEZuQXN5bmMoZm4pIHtcbiAgICB2YXIgcmVzdWx0ID0gZm4uY2FsbChjdHgsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvciB8fCB0b1N0cmluZy5jYWxsKGVycikgPT09ICdbb2JqZWN0IEVycm9yXScpIHtcbiAgICAgICAgcmV0dXJuIGRvbmUoZXJyKTtcbiAgICAgIH1cbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlcnIpID09PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgICAgIHJldHVybiBkb25lKFxuICAgICAgICAgICAgbmV3IEVycm9yKCdkb25lKCkgaW52b2tlZCB3aXRoIG5vbi1FcnJvcjogJyArIEpTT04uc3RyaW5naWZ5KGVycikpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZG9uZShuZXcgRXJyb3IoJ2RvbmUoKSBpbnZva2VkIHdpdGggbm9uLUVycm9yOiAnICsgZXJyKSk7XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0ICYmIHV0aWxzLmlzUHJvbWlzZShyZXN1bHQpKSB7XG4gICAgICAgIHJldHVybiBkb25lKFxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgICdSZXNvbHV0aW9uIG1ldGhvZCBpcyBvdmVyc3BlY2lmaWVkLiBTcGVjaWZ5IGEgY2FsbGJhY2sgKm9yKiByZXR1cm4gYSBQcm9taXNlOyBub3QgYm90aC4nXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBkb25lKCk7XG4gICAgfSk7XG4gIH1cbn07XG5cbi8qKlxuICogSW5zdGFudGlhdGVzIGEgXCJ0aW1lb3V0XCIgZXJyb3JcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gbXMgLSBUaW1lb3V0IChpbiBtaWxsaXNlY29uZHMpXG4gKiBAcmV0dXJucyB7RXJyb3J9IGEgXCJ0aW1lb3V0XCIgZXJyb3JcbiAqIEBwcml2YXRlXG4gKi9cblJ1bm5hYmxlLnByb3RvdHlwZS5fdGltZW91dEVycm9yID0gZnVuY3Rpb24gKG1zKSB7XG4gIGxldCBtc2cgPSBgVGltZW91dCBvZiAke21zfW1zIGV4Y2VlZGVkLiBGb3IgYXN5bmMgdGVzdHMgYW5kIGhvb2tzLCBlbnN1cmUgXCJkb25lKClcIiBpcyBjYWxsZWQ7IGlmIHJldHVybmluZyBhIFByb21pc2UsIGVuc3VyZSBpdCByZXNvbHZlcy5gO1xuICBpZiAodGhpcy5maWxlKSB7XG4gICAgbXNnICs9ICcgKCcgKyB0aGlzLmZpbGUgKyAnKSc7XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZVRpbWVvdXRFcnJvcihtc2csIG1zLCB0aGlzLmZpbGUpO1xufTtcblxudmFyIGNvbnN0YW50cyA9IHV0aWxzLmRlZmluZUNvbnN0YW50cyhcbiAgLyoqXG4gICAqIHtAbGluayBSdW5uYWJsZX0tcmVsYXRlZCBjb25zdGFudHMuXG4gICAqIEBwdWJsaWNcbiAgICogQG1lbWJlcm9mIFJ1bm5hYmxlXG4gICAqIEByZWFkb25seVxuICAgKiBAc3RhdGljXG4gICAqIEBhbGlhcyBjb25zdGFudHNcbiAgICogQGVudW0ge3N0cmluZ31cbiAgICovXG4gIHtcbiAgICAvKipcbiAgICAgKiBWYWx1ZSBvZiBgc3RhdGVgIHByb3Agd2hlbiBhIGBSdW5uYWJsZWAgaGFzIGZhaWxlZFxuICAgICAqL1xuICAgIFNUQVRFX0ZBSUxFRDogJ2ZhaWxlZCcsXG4gICAgLyoqXG4gICAgICogVmFsdWUgb2YgYHN0YXRlYCBwcm9wIHdoZW4gYSBgUnVubmFibGVgIGhhcyBwYXNzZWRcbiAgICAgKi9cbiAgICBTVEFURV9QQVNTRUQ6ICdwYXNzZWQnLFxuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGBzdGF0ZWAgcHJvcCB3aGVuIGEgYFJ1bm5hYmxlYCBoYXMgYmVlbiBza2lwcGVkIGJ5IHVzZXJcbiAgICAgKi9cbiAgICBTVEFURV9QRU5ESU5HOiAncGVuZGluZydcbiAgfVxuKTtcblxuLyoqXG4gKiBHaXZlbiBgdmFsdWVgLCByZXR1cm4gaWRlbnRpdHkgaWYgdHJ1dGh5LCBvdGhlcndpc2UgY3JlYXRlIGFuIFwiaW52YWxpZCBleGNlcHRpb25cIiBlcnJvciBhbmQgcmV0dXJuIHRoYXQuXG4gKiBAcGFyYW0geyp9IFt2YWx1ZV0gLSBWYWx1ZSB0byByZXR1cm4sIGlmIHByZXNlbnRcbiAqIEByZXR1cm5zIHsqfEVycm9yfSBgdmFsdWVgLCBvdGhlcndpc2UgYW4gYEVycm9yYFxuICogQHByaXZhdGVcbiAqL1xuUnVubmFibGUudG9WYWx1ZU9yRXJyb3IgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSB8fFxuICAgIGNyZWF0ZUludmFsaWRFeGNlcHRpb25FcnJvcihcbiAgICAgICdSdW5uYWJsZSBmYWlsZWQgd2l0aCBmYWxzeSBvciB1bmRlZmluZWQgZXhjZXB0aW9uLiBQbGVhc2UgdGhyb3cgYW4gRXJyb3IgaW5zdGVhZC4nLFxuICAgICAgdmFsdWVcbiAgICApXG4gICk7XG59O1xuXG5SdW5uYWJsZS5jb25zdGFudHMgPSBjb25zdGFudHM7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgUnVubmFibGUgPSByZXF1aXJlKCcuL3J1bm5hYmxlJyk7XG5jb25zdCB7aW5oZXJpdHMsIGNvbnN0YW50c30gPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5jb25zdCB7TU9DSEFfSURfUFJPUF9OQU1FfSA9IGNvbnN0YW50cztcblxuLyoqXG4gKiBFeHBvc2UgYEhvb2tgLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gSG9vaztcblxuLyoqXG4gKiBJbml0aWFsaXplIGEgbmV3IGBIb29rYCB3aXRoIHRoZSBnaXZlbiBgdGl0bGVgIGFuZCBjYWxsYmFjayBgZm5gXG4gKlxuICogQGNsYXNzXG4gKiBAZXh0ZW5kcyBSdW5uYWJsZVxuICogQHBhcmFtIHtTdHJpbmd9IHRpdGxlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICovXG5mdW5jdGlvbiBIb29rKHRpdGxlLCBmbikge1xuICBSdW5uYWJsZS5jYWxsKHRoaXMsIHRpdGxlLCBmbik7XG4gIHRoaXMudHlwZSA9ICdob29rJztcbn1cblxuLyoqXG4gKiBJbmhlcml0IGZyb20gYFJ1bm5hYmxlLnByb3RvdHlwZWAuXG4gKi9cbmluaGVyaXRzKEhvb2ssIFJ1bm5hYmxlKTtcblxuLyoqXG4gKiBSZXNldHMgdGhlIHN0YXRlIGZvciBhIG5leHQgcnVuLlxuICovXG5Ib29rLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgUnVubmFibGUucHJvdG90eXBlLnJlc2V0LmNhbGwodGhpcyk7XG4gIGRlbGV0ZSB0aGlzLl9lcnJvcjtcbn07XG5cbi8qKlxuICogR2V0IG9yIHNldCB0aGUgdGVzdCBgZXJyYC5cbiAqXG4gKiBAbWVtYmVyb2YgSG9va1xuICogQHB1YmxpY1xuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcmV0dXJuIHtFcnJvcn1cbiAqL1xuSG9vay5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7XG4gIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIGVyciA9IHRoaXMuX2Vycm9yO1xuICAgIHRoaXMuX2Vycm9yID0gbnVsbDtcbiAgICByZXR1cm4gZXJyO1xuICB9XG5cbiAgdGhpcy5fZXJyb3IgPSBlcnI7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYW4gb2JqZWN0IHN1aXRhYmxlIGZvciBJUEMuXG4gKiBGdW5jdGlvbnMgYXJlIHJlcHJlc2VudGVkIGJ5IGtleXMgYmVnaW5uaW5nIHdpdGggYCQkYC5cbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG5Ib29rLnByb3RvdHlwZS5zZXJpYWxpemUgPSBmdW5jdGlvbiBzZXJpYWxpemUoKSB7XG4gIHJldHVybiB7XG4gICAgJCRjdXJyZW50UmV0cnk6IHRoaXMuY3VycmVudFJldHJ5KCksXG4gICAgJCRmdWxsVGl0bGU6IHRoaXMuZnVsbFRpdGxlKCksXG4gICAgJCRpc1BlbmRpbmc6IEJvb2xlYW4odGhpcy5pc1BlbmRpbmcoKSksXG4gICAgJCR0aXRsZVBhdGg6IHRoaXMudGl0bGVQYXRoKCksXG4gICAgY3R4OlxuICAgICAgdGhpcy5jdHggJiYgdGhpcy5jdHguY3VycmVudFRlc3RcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBjdXJyZW50VGVzdDoge1xuICAgICAgICAgICAgICB0aXRsZTogdGhpcy5jdHguY3VycmVudFRlc3QudGl0bGUsXG4gICAgICAgICAgICAgIFtNT0NIQV9JRF9QUk9QX05BTUVdOiB0aGlzLmN0eC5jdXJyZW50VGVzdC5pZFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fSxcbiAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICBmaWxlOiB0aGlzLmZpbGUsXG4gICAgcGFyZW50OiB7XG4gICAgICAkJGZ1bGxUaXRsZTogdGhpcy5wYXJlbnQuZnVsbFRpdGxlKCksXG4gICAgICBbTU9DSEFfSURfUFJPUF9OQU1FXTogdGhpcy5wYXJlbnQuaWRcbiAgICB9LFxuICAgIHN0YXRlOiB0aGlzLnN0YXRlLFxuICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICBbTU9DSEFfSURfUFJPUF9OQU1FXTogdGhpcy5pZFxuICB9O1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IHtFdmVudEVtaXR0ZXJ9ID0gcmVxdWlyZSgnbm9kZTpldmVudHMnKTtcbmNvbnN0IEhvb2sgPSByZXF1aXJlKCcuL2hvb2snKTtcbnZhciB7XG4gIGFzc2lnbk5ld01vY2hhSUQsXG4gIGNsYW1wLFxuICBjb25zdGFudHM6IHV0aWxzQ29uc3RhbnRzLFxuICBkZWZpbmVDb25zdGFudHMsXG4gIGdldE1vY2hhSUQsXG4gIGluaGVyaXRzLFxuICBpc1N0cmluZ1xufSA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbmNvbnN0IGRlYnVnID0gcmVxdWlyZSgnZGVidWcnKSgnbW9jaGE6c3VpdGUnKTtcbmNvbnN0IG1pbGxpc2Vjb25kcyA9IHJlcXVpcmUoJ21zJyk7XG5jb25zdCBlcnJvcnMgPSByZXF1aXJlKCcuL2Vycm9ycycpO1xuXG5jb25zdCB7TU9DSEFfSURfUFJPUF9OQU1FfSA9IHV0aWxzQ29uc3RhbnRzO1xuXG4vKipcbiAqIEV4cG9zZSBgU3VpdGVgLlxuICovXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IFN1aXRlO1xuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBgU3VpdGVgIHdpdGggdGhlIGdpdmVuIGB0aXRsZWAgYW5kIHBhcmVudCBgU3VpdGVgLlxuICpcbiAqIEBwdWJsaWNcbiAqIEBwYXJhbSB7U3VpdGV9IHBhcmVudCAtIFBhcmVudCBzdWl0ZSAocmVxdWlyZWQhKVxuICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlIC0gVGl0bGVcbiAqIEByZXR1cm4ge1N1aXRlfVxuICovXG5TdWl0ZS5jcmVhdGUgPSBmdW5jdGlvbiAocGFyZW50LCB0aXRsZSkge1xuICB2YXIgc3VpdGUgPSBuZXcgU3VpdGUodGl0bGUsIHBhcmVudC5jdHgpO1xuICBzdWl0ZS5wYXJlbnQgPSBwYXJlbnQ7XG4gIHRpdGxlID0gc3VpdGUuZnVsbFRpdGxlKCk7XG4gIHBhcmVudC5hZGRTdWl0ZShzdWl0ZSk7XG4gIHJldHVybiBzdWl0ZTtcbn07XG5cbi8qKlxuICogQ29uc3RydWN0cyBhIG5ldyBgU3VpdGVgIGluc3RhbmNlIHdpdGggdGhlIGdpdmVuIGB0aXRsZWAsIGBjdHhgLCBhbmQgYGlzUm9vdGAuXG4gKlxuICogQHB1YmxpY1xuICogQGNsYXNzXG4gKiBAZXh0ZW5kcyBFdmVudEVtaXR0ZXJcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvZXZlbnRzLmh0bWwjZXZlbnRzX2NsYXNzX2V2ZW50ZW1pdHRlcnxFdmVudEVtaXR0ZXJ9XG4gKiBAcGFyYW0ge3N0cmluZ30gdGl0bGUgLSBTdWl0ZSB0aXRsZS5cbiAqIEBwYXJhbSB7Q29udGV4dH0gcGFyZW50Q29udGV4dCAtIFBhcmVudCBjb250ZXh0IGluc3RhbmNlLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNSb290PWZhbHNlXSAtIFdoZXRoZXIgdGhpcyBpcyB0aGUgcm9vdCBzdWl0ZS5cbiAqL1xuZnVuY3Rpb24gU3VpdGUodGl0bGUsIHBhcmVudENvbnRleHQsIGlzUm9vdCkge1xuICBpZiAoIWlzU3RyaW5nKHRpdGxlKSkge1xuICAgIHRocm93IGVycm9ycy5jcmVhdGVJbnZhbGlkQXJndW1lbnRUeXBlRXJyb3IoXG4gICAgICAnU3VpdGUgYXJndW1lbnQgXCJ0aXRsZVwiIG11c3QgYmUgYSBzdHJpbmcuIFJlY2VpdmVkIHR5cGUgXCInICtcbiAgICAgICAgdHlwZW9mIHRpdGxlICtcbiAgICAgICAgJ1wiJyxcbiAgICAgICd0aXRsZScsXG4gICAgICAnc3RyaW5nJ1xuICAgICk7XG4gIH1cbiAgdGhpcy50aXRsZSA9IHRpdGxlO1xuICBmdW5jdGlvbiBDb250ZXh0KCkge31cbiAgQ29udGV4dC5wcm90b3R5cGUgPSBwYXJlbnRDb250ZXh0O1xuICB0aGlzLmN0eCA9IG5ldyBDb250ZXh0KCk7XG4gIHRoaXMuc3VpdGVzID0gW107XG4gIHRoaXMudGVzdHMgPSBbXTtcbiAgdGhpcy5yb290ID0gaXNSb290ID09PSB0cnVlO1xuICB0aGlzLnBlbmRpbmcgPSBmYWxzZTtcbiAgdGhpcy5fcmV0cmllcyA9IC0xO1xuICB0aGlzLl9iZWZvcmVFYWNoID0gW107XG4gIHRoaXMuX2JlZm9yZUFsbCA9IFtdO1xuICB0aGlzLl9hZnRlckVhY2ggPSBbXTtcbiAgdGhpcy5fYWZ0ZXJBbGwgPSBbXTtcbiAgdGhpcy5fdGltZW91dCA9IDIwMDA7XG4gIHRoaXMuX3Nsb3cgPSA3NTtcbiAgdGhpcy5fYmFpbCA9IGZhbHNlO1xuICB0aGlzLl9vbmx5VGVzdHMgPSBbXTtcbiAgdGhpcy5fb25seVN1aXRlcyA9IFtdO1xuICBhc3NpZ25OZXdNb2NoYUlEKHRoaXMpO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnaWQnLCB7XG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIGdldE1vY2hhSUQodGhpcyk7XG4gICAgfVxuICB9KTtcblxuICB0aGlzLnJlc2V0KCk7XG59XG5cbi8qKlxuICogSW5oZXJpdCBmcm9tIGBFdmVudEVtaXR0ZXIucHJvdG90eXBlYC5cbiAqL1xuaW5oZXJpdHMoU3VpdGUsIEV2ZW50RW1pdHRlcik7XG5cbi8qKlxuICogUmVzZXRzIHRoZSBzdGF0ZSBpbml0aWFsbHkgb3IgZm9yIGEgbmV4dCBydW4uXG4gKi9cblN1aXRlLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5kZWxheWVkID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGRvUmVzZXQodGhpbmdUb1Jlc2V0KSB7XG4gICAgdGhpbmdUb1Jlc2V0LnJlc2V0KCk7XG4gIH1cbiAgdGhpcy5zdWl0ZXMuZm9yRWFjaChkb1Jlc2V0KTtcbiAgdGhpcy50ZXN0cy5mb3JFYWNoKGRvUmVzZXQpO1xuICB0aGlzLl9iZWZvcmVFYWNoLmZvckVhY2goZG9SZXNldCk7XG4gIHRoaXMuX2FmdGVyRWFjaC5mb3JFYWNoKGRvUmVzZXQpO1xuICB0aGlzLl9iZWZvcmVBbGwuZm9yRWFjaChkb1Jlc2V0KTtcbiAgdGhpcy5fYWZ0ZXJBbGwuZm9yRWFjaChkb1Jlc2V0KTtcbn07XG5cbi8qKlxuICogUmV0dXJuIGEgY2xvbmUgb2YgdGhpcyBgU3VpdGVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHtTdWl0ZX1cbiAqL1xuU3VpdGUucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3VpdGUgPSBuZXcgU3VpdGUodGhpcy50aXRsZSk7XG4gIGRlYnVnKCdjbG9uZScpO1xuICBzdWl0ZS5jdHggPSB0aGlzLmN0eDtcbiAgc3VpdGUucm9vdCA9IHRoaXMucm9vdDtcbiAgc3VpdGUudGltZW91dCh0aGlzLnRpbWVvdXQoKSk7XG4gIHN1aXRlLnJldHJpZXModGhpcy5yZXRyaWVzKCkpO1xuICBzdWl0ZS5zbG93KHRoaXMuc2xvdygpKTtcbiAgc3VpdGUuYmFpbCh0aGlzLmJhaWwoKSk7XG4gIHJldHVybiBzdWl0ZTtcbn07XG5cbi8qKlxuICogU2V0IG9yIGdldCB0aW1lb3V0IGBtc2Agb3Igc2hvcnQtaGFuZCBzdWNoIGFzIFwiMnNcIi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHRvZG8gRG8gbm90IGF0dGVtcHQgdG8gc2V0IHZhbHVlIGlmIGBtc2AgaXMgdW5kZWZpbmVkXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IG1zXG4gKiBAcmV0dXJuIHtTdWl0ZXxudW1iZXJ9IGZvciBjaGFpbmluZ1xuICovXG5TdWl0ZS5wcm90b3R5cGUudGltZW91dCA9IGZ1bmN0aW9uIChtcykge1xuICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGltZW91dDtcbiAgfVxuICBpZiAodHlwZW9mIG1zID09PSAnc3RyaW5nJykge1xuICAgIG1zID0gbWlsbGlzZWNvbmRzKG1zKTtcbiAgfVxuXG4gIC8vIENsYW1wIHRvIHJhbmdlXG4gIHZhciBJTlRfTUFYID0gTWF0aC5wb3coMiwgMzEpIC0gMTtcbiAgdmFyIHJhbmdlID0gWzAsIElOVF9NQVhdO1xuICBtcyA9IGNsYW1wKG1zLCByYW5nZSk7XG5cbiAgZGVidWcoJ3RpbWVvdXQgJWQnLCBtcyk7XG4gIHRoaXMuX3RpbWVvdXQgPSBwYXJzZUludChtcywgMTApO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IG9yIGdldCBudW1iZXIgb2YgdGltZXMgdG8gcmV0cnkgYSBmYWlsZWQgdGVzdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSBuXG4gKiBAcmV0dXJuIHtTdWl0ZXxudW1iZXJ9IGZvciBjaGFpbmluZ1xuICovXG5TdWl0ZS5wcm90b3R5cGUucmV0cmllcyA9IGZ1bmN0aW9uIChuKSB7XG4gIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIHJldHVybiB0aGlzLl9yZXRyaWVzO1xuICB9XG4gIGRlYnVnKCdyZXRyaWVzICVkJywgbik7XG4gIHRoaXMuX3JldHJpZXMgPSBwYXJzZUludChuLCAxMCkgfHwgMDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCBvciBnZXQgc2xvdyBgbXNgIG9yIHNob3J0LWhhbmQgc3VjaCBhcyBcIjJzXCIuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gbXNcbiAqIEByZXR1cm4ge1N1aXRlfG51bWJlcn0gZm9yIGNoYWluaW5nXG4gKi9cblN1aXRlLnByb3RvdHlwZS5zbG93ID0gZnVuY3Rpb24gKG1zKSB7XG4gIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIHJldHVybiB0aGlzLl9zbG93O1xuICB9XG4gIGlmICh0eXBlb2YgbXMgPT09ICdzdHJpbmcnKSB7XG4gICAgbXMgPSBtaWxsaXNlY29uZHMobXMpO1xuICB9XG4gIGRlYnVnKCdzbG93ICVkJywgbXMpO1xuICB0aGlzLl9zbG93ID0gbXM7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXQgb3IgZ2V0IHdoZXRoZXIgdG8gYmFpbCBhZnRlciBmaXJzdCBlcnJvci5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtib29sZWFufSBiYWlsXG4gKiBAcmV0dXJuIHtTdWl0ZXxudW1iZXJ9IGZvciBjaGFpbmluZ1xuICovXG5TdWl0ZS5wcm90b3R5cGUuYmFpbCA9IGZ1bmN0aW9uIChiYWlsKSB7XG4gIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIHJldHVybiB0aGlzLl9iYWlsO1xuICB9XG4gIGRlYnVnKCdiYWlsICVzJywgYmFpbCk7XG4gIHRoaXMuX2JhaWwgPSBiYWlsO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhpcyBzdWl0ZSBvciBpdHMgcGFyZW50IHN1aXRlIGlzIG1hcmtlZCBhcyBwZW5kaW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cblN1aXRlLnByb3RvdHlwZS5pc1BlbmRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnBlbmRpbmcgfHwgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LmlzUGVuZGluZygpKTtcbn07XG5cbi8qKlxuICogR2VuZXJpYyBob29rLWNyZWF0b3IuXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlIC0gVGl0bGUgb2YgaG9va1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSBIb29rIGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7SG9va30gQSBuZXcgaG9va1xuICovXG5TdWl0ZS5wcm90b3R5cGUuX2NyZWF0ZUhvb2sgPSBmdW5jdGlvbiAodGl0bGUsIGZuKSB7XG4gIHZhciBob29rID0gbmV3IEhvb2sodGl0bGUsIGZuKTtcbiAgaG9vay5wYXJlbnQgPSB0aGlzO1xuICBob29rLnRpbWVvdXQodGhpcy50aW1lb3V0KCkpO1xuICBob29rLnJldHJpZXModGhpcy5yZXRyaWVzKCkpO1xuICBob29rLnNsb3codGhpcy5zbG93KCkpO1xuICBob29rLmN0eCA9IHRoaXMuY3R4O1xuICBob29rLmZpbGUgPSB0aGlzLmZpbGU7XG4gIHJldHVybiBob29rO1xufTtcblxuLyoqXG4gKiBSdW4gYGZuKHRlc3RbLCBkb25lXSlgIGJlZm9yZSBydW5uaW5nIHRlc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gdGl0bGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtTdWl0ZX0gZm9yIGNoYWluaW5nXG4gKi9cblN1aXRlLnByb3RvdHlwZS5iZWZvcmVBbGwgPSBmdW5jdGlvbiAodGl0bGUsIGZuKSB7XG4gIGlmICh0aGlzLmlzUGVuZGluZygpKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgaWYgKHR5cGVvZiB0aXRsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGZuID0gdGl0bGU7XG4gICAgdGl0bGUgPSBmbi5uYW1lO1xuICB9XG4gIHRpdGxlID0gJ1wiYmVmb3JlIGFsbFwiIGhvb2snICsgKHRpdGxlID8gJzogJyArIHRpdGxlIDogJycpO1xuXG4gIHZhciBob29rID0gdGhpcy5fY3JlYXRlSG9vayh0aXRsZSwgZm4pO1xuICB0aGlzLl9iZWZvcmVBbGwucHVzaChob29rKTtcbiAgdGhpcy5lbWl0KGNvbnN0YW50cy5FVkVOVF9TVUlURV9BRERfSE9PS19CRUZPUkVfQUxMLCBob29rKTtcbiAgcmV0dXJuIGhvb2s7XG59O1xuXG4vKipcbiAqIFJ1biBgZm4odGVzdFssIGRvbmVdKWAgYWZ0ZXIgcnVubmluZyB0ZXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHJldHVybiB7U3VpdGV9IGZvciBjaGFpbmluZ1xuICovXG5TdWl0ZS5wcm90b3R5cGUuYWZ0ZXJBbGwgPSBmdW5jdGlvbiAodGl0bGUsIGZuKSB7XG4gIGlmICh0aGlzLmlzUGVuZGluZygpKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgaWYgKHR5cGVvZiB0aXRsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGZuID0gdGl0bGU7XG4gICAgdGl0bGUgPSBmbi5uYW1lO1xuICB9XG4gIHRpdGxlID0gJ1wiYWZ0ZXIgYWxsXCIgaG9vaycgKyAodGl0bGUgPyAnOiAnICsgdGl0bGUgOiAnJyk7XG5cbiAgdmFyIGhvb2sgPSB0aGlzLl9jcmVhdGVIb29rKHRpdGxlLCBmbik7XG4gIHRoaXMuX2FmdGVyQWxsLnB1c2goaG9vayk7XG4gIHRoaXMuZW1pdChjb25zdGFudHMuRVZFTlRfU1VJVEVfQUREX0hPT0tfQUZURVJfQUxMLCBob29rKTtcbiAgcmV0dXJuIGhvb2s7XG59O1xuXG4vKipcbiAqIFJ1biBgZm4odGVzdFssIGRvbmVdKWAgYmVmb3JlIGVhY2ggdGVzdCBjYXNlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gdGl0bGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtTdWl0ZX0gZm9yIGNoYWluaW5nXG4gKi9cblN1aXRlLnByb3RvdHlwZS5iZWZvcmVFYWNoID0gZnVuY3Rpb24gKHRpdGxlLCBmbikge1xuICBpZiAodGhpcy5pc1BlbmRpbmcoKSkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGlmICh0eXBlb2YgdGl0bGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBmbiA9IHRpdGxlO1xuICAgIHRpdGxlID0gZm4ubmFtZTtcbiAgfVxuICB0aXRsZSA9ICdcImJlZm9yZSBlYWNoXCIgaG9vaycgKyAodGl0bGUgPyAnOiAnICsgdGl0bGUgOiAnJyk7XG5cbiAgdmFyIGhvb2sgPSB0aGlzLl9jcmVhdGVIb29rKHRpdGxlLCBmbik7XG4gIHRoaXMuX2JlZm9yZUVhY2gucHVzaChob29rKTtcbiAgdGhpcy5lbWl0KGNvbnN0YW50cy5FVkVOVF9TVUlURV9BRERfSE9PS19CRUZPUkVfRUFDSCwgaG9vayk7XG4gIHJldHVybiBob29rO1xufTtcblxuLyoqXG4gKiBSdW4gYGZuKHRlc3RbLCBkb25lXSlgIGFmdGVyIGVhY2ggdGVzdCBjYXNlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gdGl0bGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtTdWl0ZX0gZm9yIGNoYWluaW5nXG4gKi9cblN1aXRlLnByb3RvdHlwZS5hZnRlckVhY2ggPSBmdW5jdGlvbiAodGl0bGUsIGZuKSB7XG4gIGlmICh0aGlzLmlzUGVuZGluZygpKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgaWYgKHR5cGVvZiB0aXRsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGZuID0gdGl0bGU7XG4gICAgdGl0bGUgPSBmbi5uYW1lO1xuICB9XG4gIHRpdGxlID0gJ1wiYWZ0ZXIgZWFjaFwiIGhvb2snICsgKHRpdGxlID8gJzogJyArIHRpdGxlIDogJycpO1xuXG4gIHZhciBob29rID0gdGhpcy5fY3JlYXRlSG9vayh0aXRsZSwgZm4pO1xuICB0aGlzLl9hZnRlckVhY2gucHVzaChob29rKTtcbiAgdGhpcy5lbWl0KGNvbnN0YW50cy5FVkVOVF9TVUlURV9BRERfSE9PS19BRlRFUl9FQUNILCBob29rKTtcbiAgcmV0dXJuIGhvb2s7XG59O1xuXG4vKipcbiAqIEFkZCBhIHRlc3QgYHN1aXRlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtTdWl0ZX0gc3VpdGVcbiAqIEByZXR1cm4ge1N1aXRlfSBmb3IgY2hhaW5pbmdcbiAqL1xuU3VpdGUucHJvdG90eXBlLmFkZFN1aXRlID0gZnVuY3Rpb24gKHN1aXRlKSB7XG4gIHN1aXRlLnBhcmVudCA9IHRoaXM7XG4gIHN1aXRlLnJvb3QgPSBmYWxzZTtcbiAgc3VpdGUudGltZW91dCh0aGlzLnRpbWVvdXQoKSk7XG4gIHN1aXRlLnJldHJpZXModGhpcy5yZXRyaWVzKCkpO1xuICBzdWl0ZS5zbG93KHRoaXMuc2xvdygpKTtcbiAgc3VpdGUuYmFpbCh0aGlzLmJhaWwoKSk7XG4gIHRoaXMuc3VpdGVzLnB1c2goc3VpdGUpO1xuICB0aGlzLmVtaXQoY29uc3RhbnRzLkVWRU5UX1NVSVRFX0FERF9TVUlURSwgc3VpdGUpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQWRkIGEgYHRlc3RgIHRvIHRoaXMgc3VpdGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7VGVzdH0gdGVzdFxuICogQHJldHVybiB7U3VpdGV9IGZvciBjaGFpbmluZ1xuICovXG5TdWl0ZS5wcm90b3R5cGUuYWRkVGVzdCA9IGZ1bmN0aW9uICh0ZXN0KSB7XG4gIHRlc3QucGFyZW50ID0gdGhpcztcbiAgdGVzdC50aW1lb3V0KHRoaXMudGltZW91dCgpKTtcbiAgdGVzdC5yZXRyaWVzKHRoaXMucmV0cmllcygpKTtcbiAgdGVzdC5zbG93KHRoaXMuc2xvdygpKTtcbiAgdGVzdC5jdHggPSB0aGlzLmN0eDtcbiAgdGhpcy50ZXN0cy5wdXNoKHRlc3QpO1xuICB0aGlzLmVtaXQoY29uc3RhbnRzLkVWRU5UX1NVSVRFX0FERF9URVNULCB0ZXN0KTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJldHVybiB0aGUgZnVsbCB0aXRsZSBnZW5lcmF0ZWQgYnkgcmVjdXJzaXZlbHkgY29uY2F0ZW5hdGluZyB0aGUgcGFyZW50J3NcbiAqIGZ1bGwgdGl0bGUuXG4gKlxuICogQG1lbWJlcm9mIFN1aXRlXG4gKiBAcHVibGljXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cblN1aXRlLnByb3RvdHlwZS5mdWxsVGl0bGUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnRpdGxlUGF0aCgpLmpvaW4oJyAnKTtcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSB0aXRsZSBwYXRoIGdlbmVyYXRlZCBieSByZWN1cnNpdmVseSBjb25jYXRlbmF0aW5nIHRoZSBwYXJlbnQnc1xuICogdGl0bGUgcGF0aC5cbiAqXG4gKiBAbWVtYmVyb2YgU3VpdGVcbiAqIEBwdWJsaWNcbiAqIEByZXR1cm4ge3N0cmluZ1tdfVxuICovXG5TdWl0ZS5wcm90b3R5cGUudGl0bGVQYXRoID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGlmICh0aGlzLnBhcmVudCkge1xuICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQodGhpcy5wYXJlbnQudGl0bGVQYXRoKCkpO1xuICB9XG4gIGlmICghdGhpcy5yb290KSB7XG4gICAgcmVzdWx0LnB1c2godGhpcy50aXRsZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgdGVzdHMuXG4gKlxuICogQG1lbWJlcm9mIFN1aXRlXG4gKiBAcHVibGljXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cblN1aXRlLnByb3RvdHlwZS50b3RhbCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIChcbiAgICB0aGlzLnN1aXRlcy5yZWR1Y2UoZnVuY3Rpb24gKHN1bSwgc3VpdGUpIHtcbiAgICAgIHJldHVybiBzdW0gKyBzdWl0ZS50b3RhbCgpO1xuICAgIH0sIDApICsgdGhpcy50ZXN0cy5sZW5ndGhcbiAgKTtcbn07XG5cbi8qKlxuICogSXRlcmF0ZXMgdGhyb3VnaCBlYWNoIHN1aXRlIHJlY3Vyc2l2ZWx5IHRvIGZpbmQgYWxsIHRlc3RzLiBBcHBsaWVzIGFcbiAqIGZ1bmN0aW9uIGluIHRoZSBmb3JtYXQgYGZuKHRlc3QpYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEByZXR1cm4ge1N1aXRlfVxuICovXG5TdWl0ZS5wcm90b3R5cGUuZWFjaFRlc3QgPSBmdW5jdGlvbiAoZm4pIHtcbiAgdGhpcy50ZXN0cy5mb3JFYWNoKGZuKTtcbiAgdGhpcy5zdWl0ZXMuZm9yRWFjaChmdW5jdGlvbiAoc3VpdGUpIHtcbiAgICBzdWl0ZS5lYWNoVGVzdChmbik7XG4gIH0pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogVGhpcyB3aWxsIHJ1biB0aGUgcm9vdCBzdWl0ZSBpZiB3ZSBoYXBwZW4gdG8gYmUgcnVubmluZyBpbiBkZWxheWVkIG1vZGUuXG4gKiBAcHJpdmF0ZVxuICovXG5TdWl0ZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gcnVuKCkge1xuICBpZiAodGhpcy5yb290KSB7XG4gICAgdGhpcy5lbWl0KGNvbnN0YW50cy5FVkVOVF9ST09UX1NVSVRFX1JVTik7XG4gIH1cbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgc3VpdGUgaGFzIGFuIGBvbmx5YCB0ZXN0IG9yIHN1aXRlIGFzIGEgZGVzY2VuZGFudC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybnMge0Jvb2xlYW59XG4gKi9cblN1aXRlLnByb3RvdHlwZS5oYXNPbmx5ID0gZnVuY3Rpb24gaGFzT25seSgpIHtcbiAgcmV0dXJuIChcbiAgICB0aGlzLl9vbmx5VGVzdHMubGVuZ3RoID4gMCB8fFxuICAgIHRoaXMuX29ubHlTdWl0ZXMubGVuZ3RoID4gMCB8fFxuICAgIHRoaXMuc3VpdGVzLnNvbWUoZnVuY3Rpb24gKHN1aXRlKSB7XG4gICAgICByZXR1cm4gc3VpdGUuaGFzT25seSgpO1xuICAgIH0pXG4gICk7XG59O1xuXG4vKipcbiAqIEZpbHRlciBzdWl0ZXMgYmFzZWQgb24gYGlzT25seWAgbG9naWMuXG4gKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICovXG5TdWl0ZS5wcm90b3R5cGUuZmlsdGVyT25seSA9IGZ1bmN0aW9uIGZpbHRlck9ubHkoKSB7XG4gIGlmICh0aGlzLl9vbmx5VGVzdHMubGVuZ3RoKSB7XG4gICAgLy8gSWYgdGhlIHN1aXRlIGNvbnRhaW5zIGBvbmx5YCB0ZXN0cywgcnVuIHRob3NlIGFuZCBpZ25vcmUgYW55IG5lc3RlZCBzdWl0ZXMuXG4gICAgdGhpcy50ZXN0cyA9IHRoaXMuX29ubHlUZXN0cztcbiAgICB0aGlzLnN1aXRlcyA9IFtdO1xuICB9IGVsc2Uge1xuICAgIC8vIE90aGVyd2lzZSwgZG8gbm90IHJ1biBhbnkgb2YgdGhlIHRlc3RzIGluIHRoaXMgc3VpdGUuXG4gICAgdGhpcy50ZXN0cyA9IFtdO1xuICAgIHRoaXMuX29ubHlTdWl0ZXMuZm9yRWFjaChmdW5jdGlvbiAob25seVN1aXRlKSB7XG4gICAgICAvLyBJZiB0aGVyZSBhcmUgb3RoZXIgYG9ubHlgIHRlc3RzL3N1aXRlcyBuZXN0ZWQgaW4gdGhlIGN1cnJlbnQgYG9ubHlgIHN1aXRlLCB0aGVuIGZpbHRlciB0aGF0IGBvbmx5YCBzdWl0ZS5cbiAgICAgIC8vIE90aGVyd2lzZSwgYWxsIG9mIHRoZSB0ZXN0cyBvbiB0aGlzIGBvbmx5YCBzdWl0ZSBzaG91bGQgYmUgcnVuLCBzbyBkb24ndCBmaWx0ZXIgaXQuXG4gICAgICBpZiAob25seVN1aXRlLmhhc09ubHkoKSkge1xuICAgICAgICBvbmx5U3VpdGUuZmlsdGVyT25seSgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIFJ1biB0aGUgYG9ubHlgIHN1aXRlcywgYXMgd2VsbCBhcyBhbnkgb3RoZXIgc3VpdGVzIHRoYXQgaGF2ZSBgb25seWAgdGVzdHMvc3VpdGVzIGFzIGRlc2NlbmRhbnRzLlxuICAgIHZhciBvbmx5U3VpdGVzID0gdGhpcy5fb25seVN1aXRlcztcbiAgICB0aGlzLnN1aXRlcyA9IHRoaXMuc3VpdGVzLmZpbHRlcihmdW5jdGlvbiAoY2hpbGRTdWl0ZSkge1xuICAgICAgcmV0dXJuIG9ubHlTdWl0ZXMuaW5kZXhPZihjaGlsZFN1aXRlKSAhPT0gLTEgfHwgY2hpbGRTdWl0ZS5maWx0ZXJPbmx5KCk7XG4gICAgfSk7XG4gIH1cbiAgLy8gS2VlcCB0aGUgc3VpdGUgb25seSBpZiB0aGVyZSBpcyBzb21ldGhpbmcgdG8gcnVuXG4gIHJldHVybiB0aGlzLnRlc3RzLmxlbmd0aCA+IDAgfHwgdGhpcy5zdWl0ZXMubGVuZ3RoID4gMDtcbn07XG5cbi8qKlxuICogQWRkcyBhIHN1aXRlIHRvIHRoZSBsaXN0IG9mIHN1YnN1aXRlcyBtYXJrZWQgYG9ubHlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N1aXRlfSBzdWl0ZVxuICovXG5TdWl0ZS5wcm90b3R5cGUuYXBwZW5kT25seVN1aXRlID0gZnVuY3Rpb24gKHN1aXRlKSB7XG4gIHRoaXMuX29ubHlTdWl0ZXMucHVzaChzdWl0ZSk7XG59O1xuXG4vKipcbiAqIE1hcmtzIGEgc3VpdGUgdG8gYmUgYG9ubHlgLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cblN1aXRlLnByb3RvdHlwZS5tYXJrT25seSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQuYXBwZW5kT25seVN1aXRlKHRoaXMpO1xufTtcblxuLyoqXG4gKiBBZGRzIGEgdGVzdCB0byB0aGUgbGlzdCBvZiB0ZXN0cyBtYXJrZWQgYG9ubHlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1Rlc3R9IHRlc3RcbiAqL1xuU3VpdGUucHJvdG90eXBlLmFwcGVuZE9ubHlUZXN0ID0gZnVuY3Rpb24gKHRlc3QpIHtcbiAgdGhpcy5fb25seVRlc3RzLnB1c2godGVzdCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGFycmF5IG9mIGhvb2tzIGJ5IGhvb2sgbmFtZTsgc2VlIGBIT09LX1RZUEVfKmAgY29uc3RhbnRzLlxuICogQHByaXZhdGVcbiAqL1xuU3VpdGUucHJvdG90eXBlLmdldEhvb2tzID0gZnVuY3Rpb24gZ2V0SG9va3MobmFtZSkge1xuICByZXR1cm4gdGhpc1snXycgKyBuYW1lXTtcbn07XG5cbi8qKlxuICogY2xlYW5zIGFsbCByZWZlcmVuY2VzIGZyb20gdGhpcyBzdWl0ZSBhbmQgYWxsIGNoaWxkIHN1aXRlcy5cbiAqL1xuU3VpdGUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuc3VpdGVzLmZvckVhY2goZnVuY3Rpb24gKHN1aXRlKSB7XG4gICAgc3VpdGUuZGlzcG9zZSgpO1xuICB9KTtcbiAgdGhpcy5jbGVhblJlZmVyZW5jZXMoKTtcbn07XG5cbi8qKlxuICogQ2xlYW5zIHVwIHRoZSByZWZlcmVuY2VzIHRvIGFsbCB0aGUgZGVmZXJyZWQgZnVuY3Rpb25zXG4gKiAoYmVmb3JlL2FmdGVyL2JlZm9yZUVhY2gvYWZ0ZXJFYWNoKSBhbmQgdGVzdHMgb2YgYSBTdWl0ZS5cbiAqIFRoZXNlIG11c3QgYmUgZGVsZXRlZCBvdGhlcndpc2UgYSBtZW1vcnkgbGVhayBjYW4gaGFwcGVuLFxuICogYXMgdGhvc2UgZnVuY3Rpb25zIG1heSByZWZlcmVuY2UgdmFyaWFibGVzIGZyb20gY2xvc3VyZXMsXG4gKiB0aHVzIHRob3NlIHZhcmlhYmxlcyBjYW4gbmV2ZXIgYmUgZ2FyYmFnZSBjb2xsZWN0ZWQgYXMgbG9uZ1xuICogYXMgdGhlIGRlZmVycmVkIGZ1bmN0aW9ucyBleGlzdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5TdWl0ZS5wcm90b3R5cGUuY2xlYW5SZWZlcmVuY2VzID0gZnVuY3Rpb24gY2xlYW5SZWZlcmVuY2VzKCkge1xuICBmdW5jdGlvbiBjbGVhbkFyclJlZmVyZW5jZXMoYXJyKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGRlbGV0ZSBhcnJbaV0uZm47XG4gICAgfVxuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5fYmVmb3JlQWxsKSkge1xuICAgIGNsZWFuQXJyUmVmZXJlbmNlcyh0aGlzLl9iZWZvcmVBbGwpO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5fYmVmb3JlRWFjaCkpIHtcbiAgICBjbGVhbkFyclJlZmVyZW5jZXModGhpcy5fYmVmb3JlRWFjaCk7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLl9hZnRlckFsbCkpIHtcbiAgICBjbGVhbkFyclJlZmVyZW5jZXModGhpcy5fYWZ0ZXJBbGwpO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5fYWZ0ZXJFYWNoKSkge1xuICAgIGNsZWFuQXJyUmVmZXJlbmNlcyh0aGlzLl9hZnRlckVhY2gpO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnRlc3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgZGVsZXRlIHRoaXMudGVzdHNbaV0uZm47XG4gIH1cbn07XG5cbi8qKlxuICogUmV0dXJucyBhbiBvYmplY3Qgc3VpdGFibGUgZm9yIElQQy5cbiAqIEZ1bmN0aW9ucyBhcmUgcmVwcmVzZW50ZWQgYnkga2V5cyBiZWdpbm5pbmcgd2l0aCBgJCRgLlxuICogQHByaXZhdGVcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cblN1aXRlLnByb3RvdHlwZS5zZXJpYWxpemUgPSBmdW5jdGlvbiBzZXJpYWxpemUoKSB7XG4gIHJldHVybiB7XG4gICAgX2JhaWw6IHRoaXMuX2JhaWwsXG4gICAgJCRmdWxsVGl0bGU6IHRoaXMuZnVsbFRpdGxlKCksXG4gICAgJCRpc1BlbmRpbmc6IEJvb2xlYW4odGhpcy5pc1BlbmRpbmcoKSksXG4gICAgcm9vdDogdGhpcy5yb290LFxuICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgIFtNT0NIQV9JRF9QUk9QX05BTUVdOiB0aGlzLmlkLFxuICAgIHBhcmVudDogdGhpcy5wYXJlbnQgPyB7W01PQ0hBX0lEX1BST1BfTkFNRV06IHRoaXMucGFyZW50LmlkfSA6IG51bGxcbiAgfTtcbn07XG5cbnZhciBjb25zdGFudHMgPSBkZWZpbmVDb25zdGFudHMoXG4gIC8qKlxuICAgKiB7QGxpbmsgU3VpdGV9LXJlbGF0ZWQgY29uc3RhbnRzLlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBTdWl0ZVxuICAgKiBAYWxpYXMgY29uc3RhbnRzXG4gICAqIEByZWFkb25seVxuICAgKiBAc3RhdGljXG4gICAqIEBlbnVtIHtzdHJpbmd9XG4gICAqL1xuICB7XG4gICAgLyoqXG4gICAgICogRXZlbnQgZW1pdHRlZCBhZnRlciBhIHRlc3QgZmlsZSBoYXMgYmVlbiBsb2FkZWQuIE5vdCBlbWl0dGVkIGluIGJyb3dzZXIuXG4gICAgICovXG4gICAgRVZFTlRfRklMRV9QT1NUX1JFUVVJUkU6ICdwb3N0LXJlcXVpcmUnLFxuICAgIC8qKlxuICAgICAqIEV2ZW50IGVtaXR0ZWQgYmVmb3JlIGEgdGVzdCBmaWxlIGhhcyBiZWVuIGxvYWRlZC4gSW4gYnJvd3NlciwgdGhpcyBpcyBlbWl0dGVkIG9uY2UgYW4gaW50ZXJmYWNlIGhhcyBiZWVuIHNlbGVjdGVkLlxuICAgICAqL1xuICAgIEVWRU5UX0ZJTEVfUFJFX1JFUVVJUkU6ICdwcmUtcmVxdWlyZScsXG4gICAgLyoqXG4gICAgICogRXZlbnQgZW1pdHRlZCBpbW1lZGlhdGVseSBhZnRlciBhIHRlc3QgZmlsZSBoYXMgYmVlbiBsb2FkZWQuIE5vdCBlbWl0dGVkIGluIGJyb3dzZXIuXG4gICAgICovXG4gICAgRVZFTlRfRklMRV9SRVFVSVJFOiAncmVxdWlyZScsXG4gICAgLyoqXG4gICAgICogRXZlbnQgZW1pdHRlZCB3aGVuIGBnbG9iYWwucnVuKClgIGlzIGNhbGxlZCAodXNlIHdpdGggYGRlbGF5YCBvcHRpb24pLlxuICAgICAqL1xuICAgIEVWRU5UX1JPT1RfU1VJVEVfUlVOOiAncnVuJyxcblxuICAgIC8qKlxuICAgICAqIE5hbWVzcGFjZSBmb3IgY29sbGVjdGlvbiBvZiBhIGBTdWl0ZWAncyBcImFmdGVyIGFsbFwiIGhvb2tzLlxuICAgICAqL1xuICAgIEhPT0tfVFlQRV9BRlRFUl9BTEw6ICdhZnRlckFsbCcsXG4gICAgLyoqXG4gICAgICogTmFtZXNwYWNlIGZvciBjb2xsZWN0aW9uIG9mIGEgYFN1aXRlYCdzIFwiYWZ0ZXIgZWFjaFwiIGhvb2tzLlxuICAgICAqL1xuICAgIEhPT0tfVFlQRV9BRlRFUl9FQUNIOiAnYWZ0ZXJFYWNoJyxcbiAgICAvKipcbiAgICAgKiBOYW1lc3BhY2UgZm9yIGNvbGxlY3Rpb24gb2YgYSBgU3VpdGVgJ3MgXCJiZWZvcmUgYWxsXCIgaG9va3MuXG4gICAgICovXG4gICAgSE9PS19UWVBFX0JFRk9SRV9BTEw6ICdiZWZvcmVBbGwnLFxuICAgIC8qKlxuICAgICAqIE5hbWVzcGFjZSBmb3IgY29sbGVjdGlvbiBvZiBhIGBTdWl0ZWAncyBcImJlZm9yZSBlYWNoXCIgaG9va3MuXG4gICAgICovXG4gICAgSE9PS19UWVBFX0JFRk9SRV9FQUNIOiAnYmVmb3JlRWFjaCcsXG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGFmdGVyIGEgY2hpbGQgYFN1aXRlYCBoYXMgYmVlbiBhZGRlZCB0byBhIGBTdWl0ZWAuXG4gICAgICovXG4gICAgRVZFTlRfU1VJVEVfQUREX1NVSVRFOiAnc3VpdGUnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgYW4gXCJhZnRlciBhbGxcIiBgSG9va2AgaGFzIGJlZW4gYWRkZWQgdG8gYSBgU3VpdGVgLlxuICAgICAqL1xuICAgIEVWRU5UX1NVSVRFX0FERF9IT09LX0FGVEVSX0FMTDogJ2FmdGVyQWxsJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGFmdGVyIGFuIFwiYWZ0ZXIgZWFjaFwiIGBIb29rYCBoYXMgYmVlbiBhZGRlZCB0byBhIGBTdWl0ZWAuXG4gICAgICovXG4gICAgRVZFTlRfU1VJVEVfQUREX0hPT0tfQUZURVJfRUFDSDogJ2FmdGVyRWFjaCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBhZnRlciBhbiBcImJlZm9yZSBhbGxcIiBgSG9va2AgaGFzIGJlZW4gYWRkZWQgdG8gYSBgU3VpdGVgLlxuICAgICAqL1xuICAgIEVWRU5UX1NVSVRFX0FERF9IT09LX0JFRk9SRV9BTEw6ICdiZWZvcmVBbGwnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgYW4gXCJiZWZvcmUgZWFjaFwiIGBIb29rYCBoYXMgYmVlbiBhZGRlZCB0byBhIGBTdWl0ZWAuXG4gICAgICovXG4gICAgRVZFTlRfU1VJVEVfQUREX0hPT0tfQkVGT1JFX0VBQ0g6ICdiZWZvcmVFYWNoJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGFmdGVyIGEgYFRlc3RgIGhhcyBiZWVuIGFkZGVkIHRvIGEgYFN1aXRlYC5cbiAgICAgKi9cbiAgICBFVkVOVF9TVUlURV9BRERfVEVTVDogJ3Rlc3QnXG4gIH1cbik7XG5cblN1aXRlLmNvbnN0YW50cyA9IGNvbnN0YW50cztcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqIEBwcml2YXRlXG4gKi9cbnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdub2RlOmV2ZW50cycpLkV2ZW50RW1pdHRlcjtcbnZhciBQZW5kaW5nID0gcmVxdWlyZSgnLi9wZW5kaW5nJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgZGVidWcgPSByZXF1aXJlKCdkZWJ1ZycpKCdtb2NoYTpydW5uZXInKTtcbnZhciBSdW5uYWJsZSA9IHJlcXVpcmUoJy4vcnVubmFibGUnKTtcbnZhciBTdWl0ZSA9IHJlcXVpcmUoJy4vc3VpdGUnKTtcbnZhciBIT09LX1RZUEVfQkVGT1JFX0VBQ0ggPSBTdWl0ZS5jb25zdGFudHMuSE9PS19UWVBFX0JFRk9SRV9FQUNIO1xudmFyIEhPT0tfVFlQRV9BRlRFUl9FQUNIID0gU3VpdGUuY29uc3RhbnRzLkhPT0tfVFlQRV9BRlRFUl9FQUNIO1xudmFyIEhPT0tfVFlQRV9BRlRFUl9BTEwgPSBTdWl0ZS5jb25zdGFudHMuSE9PS19UWVBFX0FGVEVSX0FMTDtcbnZhciBIT09LX1RZUEVfQkVGT1JFX0FMTCA9IFN1aXRlLmNvbnN0YW50cy5IT09LX1RZUEVfQkVGT1JFX0FMTDtcbnZhciBFVkVOVF9ST09UX1NVSVRFX1JVTiA9IFN1aXRlLmNvbnN0YW50cy5FVkVOVF9ST09UX1NVSVRFX1JVTjtcbnZhciBTVEFURV9GQUlMRUQgPSBSdW5uYWJsZS5jb25zdGFudHMuU1RBVEVfRkFJTEVEO1xudmFyIFNUQVRFX1BBU1NFRCA9IFJ1bm5hYmxlLmNvbnN0YW50cy5TVEFURV9QQVNTRUQ7XG52YXIgU1RBVEVfUEVORElORyA9IFJ1bm5hYmxlLmNvbnN0YW50cy5TVEFURV9QRU5ESU5HO1xudmFyIHN0YWNrRmlsdGVyID0gdXRpbHMuc3RhY2tUcmFjZUZpbHRlcigpO1xudmFyIHN0cmluZ2lmeSA9IHV0aWxzLnN0cmluZ2lmeTtcblxuY29uc3Qge1xuICBjcmVhdGVJbnZhbGlkRXhjZXB0aW9uRXJyb3IsXG4gIGNyZWF0ZVVuc3VwcG9ydGVkRXJyb3IsXG4gIGNyZWF0ZUZhdGFsRXJyb3IsXG4gIGlzTW9jaGFFcnJvcixcbiAgY29uc3RhbnRzOiBlcnJvckNvbnN0YW50c1xufSA9IHJlcXVpcmUoJy4vZXJyb3JzJyk7XG5cbi8qKlxuICogTm9uLWVudW1lcmFibGUgZ2xvYmFscy5cbiAqIEBwcml2YXRlXG4gKiBAcmVhZG9ubHlcbiAqL1xudmFyIGdsb2JhbHMgPSBbXG4gICdzZXRUaW1lb3V0JyxcbiAgJ2NsZWFyVGltZW91dCcsXG4gICdzZXRJbnRlcnZhbCcsXG4gICdjbGVhckludGVydmFsJyxcbiAgJ1hNTEh0dHBSZXF1ZXN0JyxcbiAgJ0RhdGUnLFxuICAnc2V0SW1tZWRpYXRlJyxcbiAgJ2NsZWFySW1tZWRpYXRlJ1xuXTtcblxudmFyIGNvbnN0YW50cyA9IHV0aWxzLmRlZmluZUNvbnN0YW50cyhcbiAgLyoqXG4gICAqIHtAbGluayBSdW5uZXJ9LXJlbGF0ZWQgY29uc3RhbnRzLiBVc2VkIGJ5IHJlcG9ydGVycy4gRWFjaCBldmVudCBlbWl0cyB0aGUgY29ycmVzcG9uZGluZyBvYmplY3QsIHVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLlxuICAgKiBAZXhhbXBsZVxuICAgKiBjb25zdCBNb2NoYSA9IHJlcXVpcmUoJ21vY2hhJyk7XG4gICAqIGNvbnN0IEJhc2UgPSBNb2NoYS5yZXBvcnRlcnMuQmFzZTtcbiAgICogY29uc3Qge1xuICAgKiAgIEVWRU5UX0hPT0tfQkVHSU4sXG4gICAqICAgRVZFTlRfVEVTVF9QQVNTLFxuICAgKiAgIEVWRU5UX1RFU1RfRkFJTCxcbiAgICogICBFVkVOVF9URVNUX0VORFxuICAgKiB9ID0gTW9jaGEuUnVubmVyLmNvbnN0YW50c1xuICAgKlxuICAgKiBmdW5jdGlvbiBNeVJlcG9ydGVyKHJ1bm5lciwgb3B0aW9ucykge1xuICAgKiAgIEJhc2UuY2FsbCh0aGlzLCBydW5uZXIsIG9wdGlvbnMpO1xuICAgKlxuICAgKiAgIHJ1bm5lci5vbihFVkVOVF9IT09LX0JFR0lOLCBmdW5jdGlvbihob29rKSB7XG4gICAqICAgICBjb25zb2xlLmxvZygnaG9vayBjYWxsZWQ6ICcsIGhvb2sudGl0bGUpO1xuICAgKiAgIH0pO1xuICAgKlxuICAgKiAgIHJ1bm5lci5vbihFVkVOVF9URVNUX1BBU1MsIGZ1bmN0aW9uKHRlc3QpIHtcbiAgICogICAgIGNvbnNvbGUubG9nKCdwYXNzOiAlcycsIHRlc3QuZnVsbFRpdGxlKCkpO1xuICAgKiAgIH0pO1xuICAgKlxuICAgKiAgIHJ1bm5lci5vbihFVkVOVF9URVNUX0ZBSUwsIGZ1bmN0aW9uKHRlc3QsIGVycikge1xuICAgKiAgICAgY29uc29sZS5sb2coJ2ZhaWw6ICVzIC0tIGVycm9yOiAlcycsIHRlc3QuZnVsbFRpdGxlKCksIGVyci5tZXNzYWdlKTtcbiAgICogICB9KTtcbiAgICpcbiAgICogICBydW5uZXIub24oRVZFTlRfVEVTVF9FTkQsIGZ1bmN0aW9uKCkge1xuICAgKiAgICAgY29uc29sZS5sb2coJ2VuZDogJWQvJWQnLCBydW5uZXIuc3RhdHMucGFzc2VzLCBydW5uZXIuc3RhdHMudGVzdHMpO1xuICAgKiAgIH0pO1xuICAgKiB9XG4gICAqXG4gICAqIG1vZHVsZS5leHBvcnRzID0gTXlSZXBvcnRlcjtcbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgUnVubmVyXG4gICAqIEByZWFkb25seVxuICAgKiBAYWxpYXMgY29uc3RhbnRzXG4gICAqIEBzdGF0aWNcbiAgICogQGVudW0ge3N0cmluZ31cbiAgICovXG4gIHtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4ge0BsaW5rIEhvb2t9IGV4ZWN1dGlvbiBiZWdpbnNcbiAgICAgKi9cbiAgICBFVkVOVF9IT09LX0JFR0lOOiAnaG9vaycsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHtAbGluayBIb29rfSBleGVjdXRpb24gZW5kc1xuICAgICAqL1xuICAgIEVWRU5UX0hPT0tfRU5EOiAnaG9vayBlbmQnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBSb290IHtAbGluayBTdWl0ZX0gZXhlY3V0aW9uIGJlZ2lucyAoYWxsIGZpbGVzIGhhdmUgYmVlbiBwYXJzZWQgYW5kIGhvb2tzL3Rlc3RzIGFyZSByZWFkeSBmb3IgZXhlY3V0aW9uKVxuICAgICAqL1xuICAgIEVWRU5UX1JVTl9CRUdJTjogJ3N0YXJ0JyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gUm9vdCB7QGxpbmsgU3VpdGV9IGV4ZWN1dGlvbiBoYXMgYmVlbiBkZWxheWVkIHZpYSBgZGVsYXlgIG9wdGlvblxuICAgICAqL1xuICAgIEVWRU5UX0RFTEFZX0JFR0lOOiAnd2FpdGluZycsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGRlbGF5ZWQgUm9vdCB7QGxpbmsgU3VpdGV9IGV4ZWN1dGlvbiBpcyB0cmlnZ2VyZWQgYnkgdXNlciB2aWEgYGdsb2JhbC5ydW4oKWBcbiAgICAgKi9cbiAgICBFVkVOVF9ERUxBWV9FTkQ6ICdyZWFkeScsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIFJvb3Qge0BsaW5rIFN1aXRlfSBleGVjdXRpb24gZW5kc1xuICAgICAqL1xuICAgIEVWRU5UX1JVTl9FTkQ6ICdlbmQnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB7QGxpbmsgU3VpdGV9IGV4ZWN1dGlvbiBiZWdpbnNcbiAgICAgKi9cbiAgICBFVkVOVF9TVUlURV9CRUdJTjogJ3N1aXRlJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4ge0BsaW5rIFN1aXRlfSBleGVjdXRpb24gZW5kc1xuICAgICAqL1xuICAgIEVWRU5UX1NVSVRFX0VORDogJ3N1aXRlIGVuZCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHtAbGluayBUZXN0fSBleGVjdXRpb24gYmVnaW5zXG4gICAgICovXG4gICAgRVZFTlRfVEVTVF9CRUdJTjogJ3Rlc3QnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB7QGxpbmsgVGVzdH0gZXhlY3V0aW9uIGVuZHNcbiAgICAgKi9cbiAgICBFVkVOVF9URVNUX0VORDogJ3Rlc3QgZW5kJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4ge0BsaW5rIFRlc3R9IGV4ZWN1dGlvbiBmYWlscy4gSW5jbHVkZXMgYW4gYGVycmAgb2JqZWN0IG9mIHR5cGUgYEVycm9yYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHJ1bm5lci5vbihFVkVOVF9URVNUX0ZBSUwsIGZ1bmN0aW9uKHRlc3QsIGVycikge1xuICAgICAqICAgY29uc29sZS5sb2coJ2ZhaWw6ICVzIC0tIGVycm9yOiAlcycsIHRlc3QuZnVsbFRpdGxlKCksIGVyci5tZXNzYWdlKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqXG4gICAgICovXG4gICAgRVZFTlRfVEVTVF9GQUlMOiAnZmFpbCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHtAbGluayBUZXN0fSBleGVjdXRpb24gc3VjY2VlZHNcbiAgICAgKi9cbiAgICBFVkVOVF9URVNUX1BBU1M6ICdwYXNzJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4ge0BsaW5rIFRlc3R9IGJlY29tZXMgcGVuZGluZ1xuICAgICAqL1xuICAgIEVWRU5UX1RFU1RfUEVORElORzogJ3BlbmRpbmcnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB7QGxpbmsgVGVzdH0gZXhlY3V0aW9uIGhhcyBmYWlsZWQsIGJ1dCB3aWxsIHJldHJ5XG4gICAgICovXG4gICAgRVZFTlRfVEVTVF9SRVRSWTogJ3JldHJ5JyxcbiAgICAvKipcbiAgICAgKiBJbml0aWFsIHN0YXRlIG9mIFJ1bm5lclxuICAgICAqL1xuICAgIFNUQVRFX0lETEU6ICdpZGxlJyxcbiAgICAvKipcbiAgICAgKiBTdGF0ZSBzZXQgdG8gdGhpcyB2YWx1ZSB3aGVuIHRoZSBSdW5uZXIgaGFzIHN0YXJ0ZWQgcnVubmluZ1xuICAgICAqL1xuICAgIFNUQVRFX1JVTk5JTkc6ICdydW5uaW5nJyxcbiAgICAvKipcbiAgICAgKiBTdGF0ZSBzZXQgdG8gdGhpcyB2YWx1ZSB3aGVuIHRoZSBSdW5uZXIgaGFzIHN0b3BwZWRcbiAgICAgKi9cbiAgICBTVEFURV9TVE9QUEVEOiAnc3RvcHBlZCdcbiAgfVxuKTtcblxuY2xhc3MgUnVubmVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYSBgUnVubmVyYCBhdCB0aGUgUm9vdCB7QGxpbmsgU3VpdGV9LCB3aGljaCByZXByZXNlbnRzIGEgaGllcmFyY2h5IG9mIHtAbGluayBTdWl0ZXxTdWl0ZXN9IGFuZCB7QGxpbmsgVGVzdHxUZXN0c30uXG4gICAqXG4gICAqIEBleHRlbmRzIGV4dGVybmFsOkV2ZW50RW1pdHRlclxuICAgKiBAcHVibGljXG4gICAqIEBjbGFzc1xuICAgKiBAcGFyYW0ge1N1aXRlfSBzdWl0ZSAtIFJvb3Qgc3VpdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRzXSAtIFNldHRpbmdzIG9iamVjdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmNsZWFuUmVmZXJlbmNlc0FmdGVyUnVuXSAtIFdoZXRoZXIgdG8gY2xlYW4gcmVmZXJlbmNlcyB0byB0ZXN0IGZucyBhbmQgaG9va3Mgd2hlbiBhIHN1aXRlIGlzIGRvbmUuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuZGVsYXldIC0gV2hldGhlciB0byBkZWxheSBleGVjdXRpb24gb2Ygcm9vdCBzdWl0ZSB1bnRpbCByZWFkeS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5kcnlSdW5dIC0gV2hldGhlciB0byByZXBvcnQgdGVzdHMgd2l0aG91dCBydW5uaW5nIHRoZW0uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuZmFpbFplcm9dIC0gV2hldGhlciB0byBmYWlsIHRlc3QgcnVuIGlmIHplcm8gdGVzdHMgZW5jb3VudGVyZWQuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzdWl0ZSwgb3B0cyA9IHt9KSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLl9nbG9iYWxzID0gW107XG4gICAgdGhpcy5fYWJvcnQgPSBmYWxzZTtcbiAgICB0aGlzLnN1aXRlID0gc3VpdGU7XG4gICAgdGhpcy5fb3B0cyA9IG9wdHM7XG4gICAgdGhpcy5zdGF0ZSA9IGNvbnN0YW50cy5TVEFURV9JRExFO1xuICAgIHRoaXMudG90YWwgPSBzdWl0ZS50b3RhbCgpO1xuICAgIHRoaXMuZmFpbHVyZXMgPSAwO1xuICAgIC8qKlxuICAgICAqIEB0eXBlIHtNYXA8RXZlbnRFbWl0dGVyLE1hcDxzdHJpbmcsU2V0PEV2ZW50TGlzdGVuZXI+Pj59XG4gICAgICovXG4gICAgdGhpcy5fZXZlbnRMaXN0ZW5lcnMgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5vbihjb25zdGFudHMuRVZFTlRfVEVTVF9FTkQsIGZ1bmN0aW9uICh0ZXN0KSB7XG4gICAgICBpZiAodGVzdC50eXBlID09PSAndGVzdCcgJiYgdGVzdC5yZXRyaWVkVGVzdCgpICYmIHRlc3QucGFyZW50KSB7XG4gICAgICAgIHZhciBpZHggPVxuICAgICAgICAgIHRlc3QucGFyZW50LnRlc3RzICYmIHRlc3QucGFyZW50LnRlc3RzLmluZGV4T2YodGVzdC5yZXRyaWVkVGVzdCgpKTtcbiAgICAgICAgaWYgKGlkeCA+IC0xKSB0ZXN0LnBhcmVudC50ZXN0c1tpZHhdID0gdGVzdDtcbiAgICAgIH1cbiAgICAgIHNlbGYuY2hlY2tHbG9iYWxzKHRlc3QpO1xuICAgIH0pO1xuICAgIHRoaXMub24oY29uc3RhbnRzLkVWRU5UX0hPT0tfRU5ELCBmdW5jdGlvbiAoaG9vaykge1xuICAgICAgc2VsZi5jaGVja0dsb2JhbHMoaG9vayk7XG4gICAgfSk7XG4gICAgdGhpcy5fZGVmYXVsdEdyZXAgPSAvLiovO1xuICAgIHRoaXMuZ3JlcCh0aGlzLl9kZWZhdWx0R3JlcCk7XG4gICAgdGhpcy5nbG9iYWxzKHRoaXMuZ2xvYmFsUHJvcHMoKSk7XG5cbiAgICB0aGlzLnVuY2F1Z2h0ID0gdGhpcy5fdW5jYXVnaHQuYmluZCh0aGlzKTtcbiAgICB0aGlzLnVuaGFuZGxlZCA9IChyZWFzb24sIHByb21pc2UpID0+IHtcbiAgICAgIGlmIChpc01vY2hhRXJyb3IocmVhc29uKSkge1xuICAgICAgICBkZWJ1ZyhcbiAgICAgICAgICAndHJhcHBlZCB1bmhhbmRsZWQgcmVqZWN0aW9uIGNvbWluZyBvdXQgb2YgTW9jaGE7IGZvcndhcmRpbmcgdG8gdW5jYXVnaHQgaGFuZGxlcjonLFxuICAgICAgICAgIHJlYXNvblxuICAgICAgICApO1xuICAgICAgICB0aGlzLnVuY2F1Z2h0KHJlYXNvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWJ1ZyhcbiAgICAgICAgICAndHJhcHBlZCB1bmhhbmRsZWQgcmVqZWN0aW9uIGZyb20gKHByb2JhYmx5KSB1c2VyIGNvZGU7IHJlLWVtaXR0aW5nIG9uIHByb2Nlc3MnXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX3JlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgcHJvY2VzcyxcbiAgICAgICAgICAndW5oYW5kbGVkUmVqZWN0aW9uJyxcbiAgICAgICAgICB0aGlzLnVuaGFuZGxlZFxuICAgICAgICApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHByb2Nlc3MuZW1pdCgndW5oYW5kbGVkUmVqZWN0aW9uJywgcmVhc29uLCBwcm9taXNlKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0aGlzLl9hZGRFdmVudExpc3RlbmVyKHByb2Nlc3MsICd1bmhhbmRsZWRSZWplY3Rpb24nLCB0aGlzLnVuaGFuZGxlZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogV3JhcHBlciBmb3Igc2V0SW1tZWRpYXRlLCBwcm9jZXNzLm5leHRUaWNrLCBvciBicm93c2VyIHBvbHlmaWxsLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcHJpdmF0ZVxuICovXG5SdW5uZXIuaW1tZWRpYXRlbHkgPSBnbG9iYWwuc2V0SW1tZWRpYXRlIHx8IHByb2Nlc3MubmV4dFRpY2s7XG5cbi8qKlxuICogUmVwbGFjZW1lbnQgZm9yIGB0YXJnZXQub24oZXZlbnROYW1lLCBsaXN0ZW5lcilgIHRoYXQgZG9lcyBib29ra2VlcGluZyB0byByZW1vdmUgdGhlbSB3aGVuIHRoaXMgcnVubmVyIGluc3RhbmNlIGlzIGRpc3Bvc2VkLlxuICogQHBhcmFtIHtFdmVudEVtaXR0ZXJ9IHRhcmdldCAtIFRoZSBgRXZlbnRFbWl0dGVyYFxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSAtIFRoZSBldmVudCBuYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gZm4gLSBMaXN0ZW5lciBmdW5jdGlvblxuICogQHByaXZhdGVcbiAqL1xuUnVubmVyLnByb3RvdHlwZS5fYWRkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uICh0YXJnZXQsIGV2ZW50TmFtZSwgbGlzdGVuZXIpIHtcbiAgZGVidWcoXG4gICAgJ19hZGRFdmVudExpc3RlbmVyKCk6IGFkZGluZyBmb3IgZXZlbnQgJXM7ICVkIGN1cnJlbnQgbGlzdGVuZXJzJyxcbiAgICBldmVudE5hbWUsXG4gICAgdGFyZ2V0Lmxpc3RlbmVyQ291bnQoZXZlbnROYW1lKVxuICApO1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBpZiAoXG4gICAgdGhpcy5fZXZlbnRMaXN0ZW5lcnMuaGFzKHRhcmdldCkgJiZcbiAgICB0aGlzLl9ldmVudExpc3RlbmVycy5nZXQodGFyZ2V0KS5oYXMoZXZlbnROYW1lKSAmJlxuICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJzLmdldCh0YXJnZXQpLmdldChldmVudE5hbWUpLmhhcyhsaXN0ZW5lcilcbiAgKSB7XG4gICAgZGVidWcoXG4gICAgICAnd2FybmluZzogdHJpZWQgdG8gYXR0YWNoIGR1cGxpY2F0ZSBldmVudCBsaXN0ZW5lciBmb3IgJXMnLFxuICAgICAgZXZlbnROYW1lXG4gICAgKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdGFyZ2V0Lm9uKGV2ZW50TmFtZSwgbGlzdGVuZXIpO1xuICBjb25zdCB0YXJnZXRMaXN0ZW5lcnMgPSB0aGlzLl9ldmVudExpc3RlbmVycy5oYXModGFyZ2V0KVxuICAgID8gdGhpcy5fZXZlbnRMaXN0ZW5lcnMuZ2V0KHRhcmdldClcbiAgICA6IG5ldyBNYXAoKTtcbiAgY29uc3QgdGFyZ2V0RXZlbnRMaXN0ZW5lcnMgPSB0YXJnZXRMaXN0ZW5lcnMuaGFzKGV2ZW50TmFtZSlcbiAgICA/IHRhcmdldExpc3RlbmVycy5nZXQoZXZlbnROYW1lKVxuICAgIDogbmV3IFNldCgpO1xuICB0YXJnZXRFdmVudExpc3RlbmVycy5hZGQobGlzdGVuZXIpO1xuICB0YXJnZXRMaXN0ZW5lcnMuc2V0KGV2ZW50TmFtZSwgdGFyZ2V0RXZlbnRMaXN0ZW5lcnMpO1xuICB0aGlzLl9ldmVudExpc3RlbmVycy5zZXQodGFyZ2V0LCB0YXJnZXRMaXN0ZW5lcnMpO1xufTtcblxuLyoqXG4gKiBSZXBsYWNlbWVudCBmb3IgYHRhcmdldC5yZW1vdmVMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyKWAgdGhhdCBhbHNvIHVwZGF0ZXMgdGhlIGJvb2trZWVwaW5nLlxuICogQHBhcmFtIHtFdmVudEVtaXR0ZXJ9IHRhcmdldCAtIFRoZSBgRXZlbnRFbWl0dGVyYFxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSAtIFRoZSBldmVudCBuYW1lXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBsaXN0ZW5lciAtIExpc3RlbmVyIGZ1bmN0aW9uXG4gKiBAcHJpdmF0ZVxuICovXG5SdW5uZXIucHJvdG90eXBlLl9yZW1vdmVFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKHRhcmdldCwgZXZlbnROYW1lLCBsaXN0ZW5lcikge1xuICB0YXJnZXQucmVtb3ZlTGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lcik7XG5cbiAgaWYgKHRoaXMuX2V2ZW50TGlzdGVuZXJzLmhhcyh0YXJnZXQpKSB7XG4gICAgY29uc3QgdGFyZ2V0TGlzdGVuZXJzID0gdGhpcy5fZXZlbnRMaXN0ZW5lcnMuZ2V0KHRhcmdldCk7XG4gICAgaWYgKHRhcmdldExpc3RlbmVycy5oYXMoZXZlbnROYW1lKSkge1xuICAgICAgY29uc3QgdGFyZ2V0RXZlbnRMaXN0ZW5lcnMgPSB0YXJnZXRMaXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSk7XG4gICAgICB0YXJnZXRFdmVudExpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuICAgICAgaWYgKCF0YXJnZXRFdmVudExpc3RlbmVycy5zaXplKSB7XG4gICAgICAgIHRhcmdldExpc3RlbmVycy5kZWxldGUoZXZlbnROYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCF0YXJnZXRMaXN0ZW5lcnMuc2l6ZSkge1xuICAgICAgdGhpcy5fZXZlbnRMaXN0ZW5lcnMuZGVsZXRlKHRhcmdldCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGRlYnVnKCd0cnlpbmcgdG8gcmVtb3ZlIGxpc3RlbmVyIGZvciB1bnRyYWNrZWQgb2JqZWN0ICVzJywgdGFyZ2V0KTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZW1vdmVzIGFsbCBldmVudCBoYW5kbGVycyBzZXQgZHVyaW5nIGEgcnVuIG9uIHRoaXMgaW5zdGFuY2UuXG4gKiBSZW1hcms6IHRoaXMgZG9lcyBfbm90XyBjbGVhbi9kaXNwb3NlIHRoZSB0ZXN0cyBvciBzdWl0ZXMgdGhlbXNlbHZlcy5cbiAqL1xuUnVubmVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICB0aGlzLl9ldmVudExpc3RlbmVycy5mb3JFYWNoKCh0YXJnZXRMaXN0ZW5lcnMsIHRhcmdldCkgPT4ge1xuICAgIHRhcmdldExpc3RlbmVycy5mb3JFYWNoKCh0YXJnZXRFdmVudExpc3RlbmVycywgZXZlbnROYW1lKSA9PiB7XG4gICAgICB0YXJnZXRFdmVudExpc3RlbmVycy5mb3JFYWNoKGxpc3RlbmVyID0+IHtcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUxpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXIpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuICB0aGlzLl9ldmVudExpc3RlbmVycy5jbGVhcigpO1xufTtcblxuLyoqXG4gKiBSdW4gdGVzdHMgd2l0aCBmdWxsIHRpdGxlcyBtYXRjaGluZyBgcmVgLiBVcGRhdGVzIHJ1bm5lci50b3RhbFxuICogd2l0aCBudW1iZXIgb2YgdGVzdHMgbWF0Y2hlZC5cbiAqXG4gKiBAcHVibGljXG4gKiBAbWVtYmVyb2YgUnVubmVyXG4gKiBAcGFyYW0ge1JlZ0V4cH0gcmVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaW52ZXJ0XG4gKiBAcmV0dXJuIHtSdW5uZXJ9IFJ1bm5lciBpbnN0YW5jZS5cbiAqL1xuUnVubmVyLnByb3RvdHlwZS5ncmVwID0gZnVuY3Rpb24gKHJlLCBpbnZlcnQpIHtcbiAgZGVidWcoJ2dyZXAoKTogc2V0dGluZyB0byAlcycsIHJlKTtcbiAgdGhpcy5fZ3JlcCA9IHJlO1xuICB0aGlzLl9pbnZlcnQgPSBpbnZlcnQ7XG4gIHRoaXMudG90YWwgPSB0aGlzLmdyZXBUb3RhbCh0aGlzLnN1aXRlKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG51bWJlciBvZiB0ZXN0cyBtYXRjaGluZyB0aGUgZ3JlcCBzZWFyY2ggZm9yIHRoZVxuICogZ2l2ZW4gc3VpdGUuXG4gKlxuICogQG1lbWJlcm9mIFJ1bm5lclxuICogQHB1YmxpY1xuICogQHBhcmFtIHtTdWl0ZX0gc3VpdGVcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuUnVubmVyLnByb3RvdHlwZS5ncmVwVG90YWwgPSBmdW5jdGlvbiAoc3VpdGUpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgdG90YWwgPSAwO1xuXG4gIHN1aXRlLmVhY2hUZXN0KGZ1bmN0aW9uICh0ZXN0KSB7XG4gICAgdmFyIG1hdGNoID0gc2VsZi5fZ3JlcC50ZXN0KHRlc3QuZnVsbFRpdGxlKCkpO1xuICAgIGlmIChzZWxmLl9pbnZlcnQpIHtcbiAgICAgIG1hdGNoID0gIW1hdGNoO1xuICAgIH1cbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIHRvdGFsKys7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gdG90YWw7XG59O1xuXG4vKipcbiAqIFJldHVybiBhIGxpc3Qgb2YgZ2xvYmFsIHByb3BlcnRpZXMuXG4gKlxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAcHJpdmF0ZVxuICovXG5SdW5uZXIucHJvdG90eXBlLmdsb2JhbFByb3BzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcHJvcHMgPSBPYmplY3Qua2V5cyhnbG9iYWwpO1xuXG4gIC8vIG5vbi1lbnVtZXJhYmxlc1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGdsb2JhbHMubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAofnByb3BzLmluZGV4T2YoZ2xvYmFsc1tpXSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBwcm9wcy5wdXNoKGdsb2JhbHNbaV0pO1xuICB9XG5cbiAgcmV0dXJuIHByb3BzO1xufTtcblxuLyoqXG4gKiBBbGxvdyB0aGUgZ2l2ZW4gYGFycmAgb2YgZ2xvYmFscy5cbiAqXG4gKiBAcHVibGljXG4gKiBAbWVtYmVyb2YgUnVubmVyXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJcbiAqIEByZXR1cm4ge1J1bm5lcn0gUnVubmVyIGluc3RhbmNlLlxuICovXG5SdW5uZXIucHJvdG90eXBlLmdsb2JhbHMgPSBmdW5jdGlvbiAoYXJyKSB7XG4gIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIHJldHVybiB0aGlzLl9nbG9iYWxzO1xuICB9XG4gIGRlYnVnKCdnbG9iYWxzKCk6IHNldHRpbmcgdG8gJU8nLCBhcnIpO1xuICB0aGlzLl9nbG9iYWxzID0gdGhpcy5fZ2xvYmFscy5jb25jYXQoYXJyKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIENoZWNrIGZvciBnbG9iYWwgdmFyaWFibGUgbGVha3MuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuUnVubmVyLnByb3RvdHlwZS5jaGVja0dsb2JhbHMgPSBmdW5jdGlvbiAodGVzdCkge1xuICBpZiAoIXRoaXMuY2hlY2tMZWFrcykge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgb2sgPSB0aGlzLl9nbG9iYWxzO1xuXG4gIHZhciBnbG9iYWxzID0gdGhpcy5nbG9iYWxQcm9wcygpO1xuICB2YXIgbGVha3M7XG5cbiAgaWYgKHRlc3QpIHtcbiAgICBvayA9IG9rLmNvbmNhdCh0ZXN0Ll9hbGxvd2VkR2xvYmFscyB8fCBbXSk7XG4gIH1cblxuICBpZiAodGhpcy5wcmV2R2xvYmFsc0xlbmd0aCA9PT0gZ2xvYmFscy5sZW5ndGgpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5wcmV2R2xvYmFsc0xlbmd0aCA9IGdsb2JhbHMubGVuZ3RoO1xuXG4gIGxlYWtzID0gZmlsdGVyTGVha3Mob2ssIGdsb2JhbHMpO1xuICB0aGlzLl9nbG9iYWxzID0gdGhpcy5fZ2xvYmFscy5jb25jYXQobGVha3MpO1xuXG4gIGlmIChsZWFrcy5sZW5ndGgpIHtcbiAgICB2YXIgbXNnID0gYGdsb2JhbCBsZWFrKHMpIGRldGVjdGVkOiAke2xlYWtzLm1hcChlID0+IGAnJHtlfSdgKS5qb2luKCcsICcpfWA7XG4gICAgdGhpcy5mYWlsKHRlc3QsIG5ldyBFcnJvcihtc2cpKTtcbiAgfVxufTtcblxuLyoqXG4gKiBGYWlsIHRoZSBnaXZlbiBgdGVzdGAuXG4gKlxuICogSWYgYHRlc3RgIGlzIGEgaG9vaywgZmFpbHVyZXMgd29yayBpbiB0aGUgZm9sbG93aW5nIHBhdHRlcm46XG4gKiAtIElmIGJhaWwsIHJ1biBjb3JyZXNwb25kaW5nIGBhZnRlciBlYWNoYCBhbmQgYGFmdGVyYCBob29rcyxcbiAqICAgdGhlbiBleGl0XG4gKiAtIEZhaWxlZCBgYmVmb3JlYCBob29rIHNraXBzIGFsbCB0ZXN0cyBpbiBhIHN1aXRlIGFuZCBzdWJzdWl0ZXMsXG4gKiAgIGJ1dCBqdW1wcyB0byBjb3JyZXNwb25kaW5nIGBhZnRlcmAgaG9va1xuICogLSBGYWlsZWQgYGJlZm9yZSBlYWNoYCBob29rIHNraXBzIHJlbWFpbmluZyB0ZXN0cyBpbiBhXG4gKiAgIHN1aXRlIGFuZCBqdW1wcyB0byBjb3JyZXNwb25kaW5nIGBhZnRlciBlYWNoYCBob29rLFxuICogICB3aGljaCBpcyBydW4gb25seSBvbmNlXG4gKiAtIEZhaWxlZCBgYWZ0ZXJgIGhvb2sgZG9lcyBub3QgYWx0ZXIgZXhlY3V0aW9uIG9yZGVyXG4gKiAtIEZhaWxlZCBgYWZ0ZXIgZWFjaGAgaG9vayBza2lwcyByZW1haW5pbmcgdGVzdHMgaW4gYVxuICogICBzdWl0ZSBhbmQgc3Vic3VpdGVzLCBidXQgZXhlY3V0ZXMgb3RoZXIgYGFmdGVyIGVhY2hgXG4gKiAgIGhvb2tzXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7UnVubmFibGV9IHRlc3RcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHBhcmFtIHtib29sZWFufSBbZm9yY2U9ZmFsc2VdIC0gV2hldGhlciB0byBmYWlsIGEgcGVuZGluZyB0ZXN0LlxuICovXG5SdW5uZXIucHJvdG90eXBlLmZhaWwgPSBmdW5jdGlvbiAodGVzdCwgZXJyLCBmb3JjZSkge1xuICBmb3JjZSA9IGZvcmNlID09PSB0cnVlO1xuICBpZiAodGVzdC5pc1BlbmRpbmcoKSAmJiAhZm9yY2UpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHRoaXMuc3RhdGUgPT09IGNvbnN0YW50cy5TVEFURV9TVE9QUEVEKSB7XG4gICAgaWYgKGVyci5jb2RlID09PSBlcnJvckNvbnN0YW50cy5NVUxUSVBMRV9ET05FKSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIHRocm93IGNyZWF0ZUZhdGFsRXJyb3IoXG4gICAgICAnVGVzdCBmYWlsZWQgYWZ0ZXIgcm9vdCBzdWl0ZSBleGVjdXRpb24gY29tcGxldGVkIScsXG4gICAgICBlcnJcbiAgICApO1xuICB9XG5cbiAgKyt0aGlzLmZhaWx1cmVzO1xuICBkZWJ1ZygndG90YWwgbnVtYmVyIG9mIGZhaWx1cmVzOiAlZCcsIHRoaXMuZmFpbHVyZXMpO1xuICB0ZXN0LnN0YXRlID0gU1RBVEVfRkFJTEVEO1xuXG4gIGlmICghaXNFcnJvcihlcnIpKSB7XG4gICAgZXJyID0gdGhyb3duMkVycm9yKGVycik7XG4gIH1cblxuICAvLyBGaWx0ZXIgdGhlIHN0YWNrIHRyYWNlc1xuICBpZiAoIXRoaXMuZnVsbFN0YWNrVHJhY2UpIHtcbiAgICBjb25zdCBhbHJlYWR5RmlsdGVyZWQgPSBuZXcgU2V0KCk7XG4gICAgbGV0IGN1cnJlbnRFcnIgPSBlcnI7XG5cbiAgICB3aGlsZSAoY3VycmVudEVyciAmJiBjdXJyZW50RXJyLnN0YWNrICYmICFhbHJlYWR5RmlsdGVyZWQuaGFzKGN1cnJlbnRFcnIpKSB7XG4gICAgICBhbHJlYWR5RmlsdGVyZWQuYWRkKGN1cnJlbnRFcnIpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjdXJyZW50RXJyLnN0YWNrID0gc3RhY2tGaWx0ZXIoY3VycmVudEVyci5zdGFjayk7XG4gICAgICB9IGNhdGNoIChpZ25vcmUpIHtcbiAgICAgICAgLy8gc29tZSBlbnZpcm9ubWVudHMgZG8gbm90IHRha2Uga2luZGx5IHRvIG1vbmtleWluZyB3aXRoIHRoZSBzdGFja1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50RXJyID0gY3VycmVudEVyci5jYXVzZTtcbiAgICB9XG4gIH1cblxuICB0aGlzLmVtaXQoY29uc3RhbnRzLkVWRU5UX1RFU1RfRkFJTCwgdGVzdCwgZXJyKTtcbn07XG5cbi8qKlxuICogUnVuIGhvb2sgYG5hbWVgIGNhbGxiYWNrcyBhbmQgdGhlbiBpbnZva2UgYGZuKClgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqL1xuXG5SdW5uZXIucHJvdG90eXBlLmhvb2sgPSBmdW5jdGlvbiAobmFtZSwgZm4pIHtcbiAgaWYgKHRoaXMuX29wdHMuZHJ5UnVuKSByZXR1cm4gZm4oKTtcblxuICB2YXIgc3VpdGUgPSB0aGlzLnN1aXRlO1xuICB2YXIgaG9va3MgPSBzdWl0ZS5nZXRIb29rcyhuYW1lKTtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIGZ1bmN0aW9uIG5leHQoaSkge1xuICAgIHZhciBob29rID0gaG9va3NbaV07XG4gICAgaWYgKCFob29rKSB7XG4gICAgICByZXR1cm4gZm4oKTtcbiAgICB9XG4gICAgc2VsZi5jdXJyZW50UnVubmFibGUgPSBob29rO1xuXG4gICAgaWYgKG5hbWUgPT09IEhPT0tfVFlQRV9CRUZPUkVfQUxMKSB7XG4gICAgICBob29rLmN0eC5jdXJyZW50VGVzdCA9IGhvb2sucGFyZW50LnRlc3RzWzBdO1xuICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gSE9PS19UWVBFX0FGVEVSX0FMTCkge1xuICAgICAgaG9vay5jdHguY3VycmVudFRlc3QgPSBob29rLnBhcmVudC50ZXN0c1tob29rLnBhcmVudC50ZXN0cy5sZW5ndGggLSAxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaG9vay5jdHguY3VycmVudFRlc3QgPSBzZWxmLnRlc3Q7XG4gICAgfVxuXG4gICAgc2V0SG9va1RpdGxlKGhvb2spO1xuXG4gICAgaG9vay5hbGxvd1VuY2F1Z2h0ID0gc2VsZi5hbGxvd1VuY2F1Z2h0O1xuXG4gICAgc2VsZi5lbWl0KGNvbnN0YW50cy5FVkVOVF9IT09LX0JFR0lOLCBob29rKTtcblxuICAgIGlmICghaG9vay5saXN0ZW5lcnMoJ2Vycm9yJykubGVuZ3RoKSB7XG4gICAgICBzZWxmLl9hZGRFdmVudExpc3RlbmVyKGhvb2ssICdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgc2VsZi5mYWlsKGhvb2ssIGVycik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBob29rLnJ1bihmdW5jdGlvbiBjYkhvb2tSdW4oZXJyKSB7XG4gICAgICB2YXIgdGVzdEVycm9yID0gaG9vay5lcnJvcigpO1xuICAgICAgaWYgKHRlc3RFcnJvcikge1xuICAgICAgICBzZWxmLmZhaWwoc2VsZi50ZXN0LCB0ZXN0RXJyb3IpO1xuICAgICAgfVxuICAgICAgLy8gY29uZGl0aW9uYWwgc2tpcFxuICAgICAgaWYgKGhvb2sucGVuZGluZykge1xuICAgICAgICBpZiAobmFtZSA9PT0gSE9PS19UWVBFX0FGVEVSX0VBQ0gpIHtcbiAgICAgICAgICAvLyBUT0RPIGRlZmluZSBhbmQgaW1wbGVtZW50IHVzZSBjYXNlXG4gICAgICAgICAgaWYgKHNlbGYudGVzdCkge1xuICAgICAgICAgICAgc2VsZi50ZXN0LnBlbmRpbmcgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChuYW1lID09PSBIT09LX1RZUEVfQkVGT1JFX0VBQ0gpIHtcbiAgICAgICAgICBpZiAoc2VsZi50ZXN0KSB7XG4gICAgICAgICAgICBzZWxmLnRlc3QucGVuZGluZyA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlbGYuZW1pdChjb25zdGFudHMuRVZFTlRfSE9PS19FTkQsIGhvb2spO1xuICAgICAgICAgIGhvb2sucGVuZGluZyA9IGZhbHNlOyAvLyBhY3RpdmF0ZXMgaG9vayBmb3IgbmV4dCB0ZXN0XG4gICAgICAgICAgcmV0dXJuIGZuKG5ldyBFcnJvcignYWJvcnQgaG9va0Rvd24nKSk7XG4gICAgICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gSE9PS19UWVBFX0JFRk9SRV9BTEwpIHtcbiAgICAgICAgICBzdWl0ZS50ZXN0cy5mb3JFYWNoKGZ1bmN0aW9uICh0ZXN0KSB7XG4gICAgICAgICAgICB0ZXN0LnBlbmRpbmcgPSB0cnVlO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHN1aXRlLnN1aXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChzdWl0ZSkge1xuICAgICAgICAgICAgc3VpdGUucGVuZGluZyA9IHRydWU7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaG9va3MgPSBbXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBob29rLnBlbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB2YXIgZXJyRm9yYmlkID0gY3JlYXRlVW5zdXBwb3J0ZWRFcnJvcignYHRoaXMuc2tpcGAgZm9yYmlkZGVuJyk7XG4gICAgICAgICAgc2VsZi5mYWlsKGhvb2ssIGVyckZvcmJpZCk7XG4gICAgICAgICAgcmV0dXJuIGZuKGVyckZvcmJpZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZXJyKSB7XG4gICAgICAgIHNlbGYuZmFpbChob29rLCBlcnIpO1xuICAgICAgICAvLyBzdG9wIGV4ZWN1dGluZyBob29rcywgbm90aWZ5IGNhbGxlZSBvZiBob29rIGVyclxuICAgICAgICByZXR1cm4gZm4oZXJyKTtcbiAgICAgIH1cbiAgICAgIHNlbGYuZW1pdChjb25zdGFudHMuRVZFTlRfSE9PS19FTkQsIGhvb2spO1xuICAgICAgZGVsZXRlIGhvb2suY3R4LmN1cnJlbnRUZXN0O1xuICAgICAgc2V0SG9va1RpdGxlKGhvb2spO1xuICAgICAgbmV4dCgrK2kpO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gc2V0SG9va1RpdGxlKGhvb2spIHtcbiAgICAgIGhvb2sub3JpZ2luYWxUaXRsZSA9IGhvb2sub3JpZ2luYWxUaXRsZSB8fCBob29rLnRpdGxlO1xuICAgICAgaWYgKGhvb2suY3R4ICYmIGhvb2suY3R4LmN1cnJlbnRUZXN0KSB7XG4gICAgICAgIGhvb2sudGl0bGUgPSBgJHtob29rLm9yaWdpbmFsVGl0bGV9IGZvciBcIiR7aG9vay5jdHguY3VycmVudFRlc3QudGl0bGV9XCJgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHBhcmVudFRpdGxlO1xuICAgICAgICBpZiAoaG9vay5wYXJlbnQudGl0bGUpIHtcbiAgICAgICAgICBwYXJlbnRUaXRsZSA9IGhvb2sucGFyZW50LnRpdGxlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhcmVudFRpdGxlID0gaG9vay5wYXJlbnQucm9vdCA/ICd7cm9vdH0nIDogJyc7XG4gICAgICAgIH1cbiAgICAgICAgaG9vay50aXRsZSA9IGAke2hvb2sub3JpZ2luYWxUaXRsZX0gaW4gXCIke3BhcmVudFRpdGxlfVwiYDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBSdW5uZXIuaW1tZWRpYXRlbHkoZnVuY3Rpb24gKCkge1xuICAgIG5leHQoMCk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBSdW4gaG9vayBgbmFtZWAgZm9yIHRoZSBnaXZlbiBhcnJheSBvZiBgc3VpdGVzYFxuICogaW4gb3JkZXIsIGFuZCBjYWxsYmFjayBgZm4oZXJyLCBlcnJTdWl0ZSlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtBcnJheX0gc3VpdGVzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICovXG5SdW5uZXIucHJvdG90eXBlLmhvb2tzID0gZnVuY3Rpb24gKG5hbWUsIHN1aXRlcywgZm4pIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgb3JpZyA9IHRoaXMuc3VpdGU7XG5cbiAgZnVuY3Rpb24gbmV4dChzdWl0ZSkge1xuICAgIHNlbGYuc3VpdGUgPSBzdWl0ZTtcblxuICAgIGlmICghc3VpdGUpIHtcbiAgICAgIHNlbGYuc3VpdGUgPSBvcmlnO1xuICAgICAgcmV0dXJuIGZuKCk7XG4gICAgfVxuXG4gICAgc2VsZi5ob29rKG5hbWUsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgdmFyIGVyclN1aXRlID0gc2VsZi5zdWl0ZTtcbiAgICAgICAgc2VsZi5zdWl0ZSA9IG9yaWc7XG4gICAgICAgIHJldHVybiBmbihlcnIsIGVyclN1aXRlKTtcbiAgICAgIH1cblxuICAgICAgbmV4dChzdWl0ZXMucG9wKCkpO1xuICAgIH0pO1xuICB9XG5cbiAgbmV4dChzdWl0ZXMucG9wKCkpO1xufTtcblxuLyoqXG4gKiBSdW4gJ2FmdGVyRWFjaCcgaG9va3MgZnJvbSBib3R0b20gdXAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcHJpdmF0ZVxuICovXG5SdW5uZXIucHJvdG90eXBlLmhvb2tVcCA9IGZ1bmN0aW9uIChuYW1lLCBmbikge1xuICB2YXIgc3VpdGVzID0gW3RoaXMuc3VpdGVdLmNvbmNhdCh0aGlzLnBhcmVudHMoKSkucmV2ZXJzZSgpO1xuICB0aGlzLmhvb2tzKG5hbWUsIHN1aXRlcywgZm4pO1xufTtcblxuLyoqXG4gKiBSdW4gJ2JlZm9yZUVhY2gnIGhvb2tzIGZyb20gdG9wIGxldmVsIGRvd24uXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcHJpdmF0ZVxuICovXG5SdW5uZXIucHJvdG90eXBlLmhvb2tEb3duID0gZnVuY3Rpb24gKG5hbWUsIGZuKSB7XG4gIHZhciBzdWl0ZXMgPSBbdGhpcy5zdWl0ZV0uY29uY2F0KHRoaXMucGFyZW50cygpKTtcbiAgdGhpcy5ob29rcyhuYW1lLCBzdWl0ZXMsIGZuKTtcbn07XG5cbi8qKlxuICogUmV0dXJuIGFuIGFycmF5IG9mIHBhcmVudCBTdWl0ZXMgZnJvbVxuICogY2xvc2VzdCB0byBmdXJ0aGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBwcml2YXRlXG4gKi9cblJ1bm5lci5wcm90b3R5cGUucGFyZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN1aXRlID0gdGhpcy5zdWl0ZTtcbiAgdmFyIHN1aXRlcyA9IFtdO1xuICB3aGlsZSAoc3VpdGUucGFyZW50KSB7XG4gICAgc3VpdGUgPSBzdWl0ZS5wYXJlbnQ7XG4gICAgc3VpdGVzLnB1c2goc3VpdGUpO1xuICB9XG4gIHJldHVybiBzdWl0ZXM7XG59O1xuXG4vKipcbiAqIFJ1biB0aGUgY3VycmVudCB0ZXN0IGFuZCBjYWxsYmFjayBgZm4oZXJyKWAuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEBwcml2YXRlXG4gKi9cblJ1bm5lci5wcm90b3R5cGUucnVuVGVzdCA9IGZ1bmN0aW9uIChmbikge1xuICBpZiAodGhpcy5fb3B0cy5kcnlSdW4pIHJldHVybiBSdW5uZXIuaW1tZWRpYXRlbHkoZm4pO1xuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHRlc3QgPSB0aGlzLnRlc3Q7XG5cbiAgaWYgKCF0ZXN0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHRoaXMuYXN5bmNPbmx5KSB7XG4gICAgdGVzdC5hc3luY09ubHkgPSB0cnVlO1xuICB9XG4gIHRoaXMuX2FkZEV2ZW50TGlzdGVuZXIodGVzdCwgJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xuICAgIHNlbGYuZmFpbCh0ZXN0LCBlcnIpO1xuICB9KTtcbiAgaWYgKHRoaXMuYWxsb3dVbmNhdWdodCkge1xuICAgIHRlc3QuYWxsb3dVbmNhdWdodCA9IHRydWU7XG4gICAgcmV0dXJuIHRlc3QucnVuKGZuKTtcbiAgfVxuICB0cnkge1xuICAgIHRlc3QucnVuKGZuKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZm4oZXJyKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSdW4gdGVzdHMgaW4gdGhlIGdpdmVuIGBzdWl0ZWAgYW5kIGludm9rZSB0aGUgY2FsbGJhY2sgYGZuKClgIHdoZW4gY29tcGxldGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3VpdGV9IHN1aXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICovXG5SdW5uZXIucHJvdG90eXBlLnJ1blRlc3RzID0gZnVuY3Rpb24gKHN1aXRlLCBmbikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciB0ZXN0cyA9IHN1aXRlLnRlc3RzLnNsaWNlKCk7XG4gIHZhciB0ZXN0O1xuXG4gIGZ1bmN0aW9uIGhvb2tFcnIoXywgZXJyU3VpdGUsIGFmdGVyKSB7XG4gICAgLy8gYmVmb3JlL2FmdGVyIEVhY2ggaG9vayBmb3IgZXJyU3VpdGUgZmFpbGVkOlxuICAgIHZhciBvcmlnID0gc2VsZi5zdWl0ZTtcblxuICAgIC8vIGZvciBmYWlsZWQgJ2FmdGVyIGVhY2gnIGhvb2sgc3RhcnQgZnJvbSBlcnJTdWl0ZSBwYXJlbnQsXG4gICAgLy8gb3RoZXJ3aXNlIHN0YXJ0IGZyb20gZXJyU3VpdGUgaXRzZWxmXG4gICAgc2VsZi5zdWl0ZSA9IGFmdGVyID8gZXJyU3VpdGUucGFyZW50IDogZXJyU3VpdGU7XG5cbiAgICBpZiAoc2VsZi5zdWl0ZSkge1xuICAgICAgc2VsZi5ob29rVXAoSE9PS19UWVBFX0FGVEVSX0VBQ0gsIGZ1bmN0aW9uIChlcnIyLCBlcnJTdWl0ZTIpIHtcbiAgICAgICAgc2VsZi5zdWl0ZSA9IG9yaWc7XG4gICAgICAgIC8vIHNvbWUgaG9va3MgbWF5IGZhaWwgZXZlbiBub3dcbiAgICAgICAgaWYgKGVycjIpIHtcbiAgICAgICAgICByZXR1cm4gaG9va0VycihlcnIyLCBlcnJTdWl0ZTIsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHJlcG9ydCBlcnJvciBzdWl0ZVxuICAgICAgICBmbihlcnJTdWl0ZSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdGhlcmUgaXMgbm8gbmVlZCBjYWxsaW5nIG90aGVyICdhZnRlciBlYWNoJyBob29rc1xuICAgICAgc2VsZi5zdWl0ZSA9IG9yaWc7XG4gICAgICBmbihlcnJTdWl0ZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbmV4dChlcnIsIGVyclN1aXRlKSB7XG4gICAgLy8gaWYgd2UgYmFpbCBhZnRlciBmaXJzdCBlcnJcbiAgICBpZiAoc2VsZi5mYWlsdXJlcyAmJiBzdWl0ZS5fYmFpbCkge1xuICAgICAgdGVzdHMgPSBbXTtcbiAgICB9XG5cbiAgICBpZiAoc2VsZi5fYWJvcnQpIHtcbiAgICAgIHJldHVybiBmbigpO1xuICAgIH1cblxuICAgIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBob29rRXJyKGVyciwgZXJyU3VpdGUsIHRydWUpO1xuICAgIH1cblxuICAgIC8vIG5leHQgdGVzdFxuICAgIHRlc3QgPSB0ZXN0cy5zaGlmdCgpO1xuXG4gICAgLy8gYWxsIGRvbmVcbiAgICBpZiAoIXRlc3QpIHtcbiAgICAgIHJldHVybiBmbigpO1xuICAgIH1cblxuICAgIC8vIGdyZXBcbiAgICB2YXIgbWF0Y2ggPSBzZWxmLl9ncmVwLnRlc3QodGVzdC5mdWxsVGl0bGUoKSk7XG4gICAgaWYgKHNlbGYuX2ludmVydCkge1xuICAgICAgbWF0Y2ggPSAhbWF0Y2g7XG4gICAgfVxuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIC8vIFJ1biBpbW1lZGlhdGVseSBvbmx5IGlmIHdlIGhhdmUgZGVmaW5lZCBhIGdyZXAuIFdoZW4gd2VcbiAgICAgIC8vIGRlZmluZSBhIGdyZXAg4oCUIEl0IGNhbiBjYXVzZSBtYXhpbXVtIGNhbGxzdGFjayBlcnJvciBpZlxuICAgICAgLy8gdGhlIGdyZXAgaXMgZG9pbmcgYSBsYXJnZSByZWN1cnNpdmUgbG9vcCBieSBuZWdsZWN0aW5nXG4gICAgICAvLyBhbGwgdGVzdHMuIFRoZSBydW4gaW1tZWRpYXRlbHkgZnVuY3Rpb24gYWxzbyBjb21lcyB3aXRoXG4gICAgICAvLyBhIHBlcmZvcm1hbmNlIGNvc3QuIFNvIHdlIGRvbid0IHdhbnQgdG8gcnVuIGltbWVkaWF0ZWx5XG4gICAgICAvLyBpZiB3ZSBydW4gdGhlIHdob2xlIHRlc3Qgc3VpdGUsIGJlY2F1c2UgcnVubmluZyB0aGUgd2hvbGVcbiAgICAgIC8vIHRlc3Qgc3VpdGUgZG9uJ3QgZG8gYW55IGltbWVkaWF0ZSByZWN1cnNpdmUgbG9vcHMuIFRodXMsXG4gICAgICAvLyBhbGxvd2luZyBhIEpTIHJ1bnRpbWUgdG8gYnJlYXRoZS5cbiAgICAgIGlmIChzZWxmLl9ncmVwICE9PSBzZWxmLl9kZWZhdWx0R3JlcCkge1xuICAgICAgICBSdW5uZXIuaW1tZWRpYXRlbHkobmV4dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0KCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gc3RhdGljIHNraXAsIG5vIGhvb2tzIGFyZSBleGVjdXRlZFxuICAgIGlmICh0ZXN0LmlzUGVuZGluZygpKSB7XG4gICAgICBpZiAoc2VsZi5mb3JiaWRQZW5kaW5nKSB7XG4gICAgICAgIHNlbGYuZmFpbCh0ZXN0LCBuZXcgRXJyb3IoJ1BlbmRpbmcgdGVzdCBmb3JiaWRkZW4nKSwgdHJ1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0ZXN0LnN0YXRlID0gU1RBVEVfUEVORElORztcbiAgICAgICAgc2VsZi5lbWl0KGNvbnN0YW50cy5FVkVOVF9URVNUX1BFTkRJTkcsIHRlc3QpO1xuICAgICAgfVxuICAgICAgc2VsZi5lbWl0KGNvbnN0YW50cy5FVkVOVF9URVNUX0VORCwgdGVzdCk7XG4gICAgICByZXR1cm4gbmV4dCgpO1xuICAgIH1cblxuICAgIC8vIGV4ZWN1dGUgdGVzdCBhbmQgaG9vayhzKVxuICAgIHNlbGYuZW1pdChjb25zdGFudHMuRVZFTlRfVEVTVF9CRUdJTiwgKHNlbGYudGVzdCA9IHRlc3QpKTtcbiAgICBzZWxmLmhvb2tEb3duKEhPT0tfVFlQRV9CRUZPUkVfRUFDSCwgZnVuY3Rpb24gKGVyciwgZXJyU3VpdGUpIHtcbiAgICAgIC8vIGNvbmRpdGlvbmFsIHNraXAgd2l0aGluIGJlZm9yZUVhY2hcbiAgICAgIGlmICh0ZXN0LmlzUGVuZGluZygpKSB7XG4gICAgICAgIGlmIChzZWxmLmZvcmJpZFBlbmRpbmcpIHtcbiAgICAgICAgICBzZWxmLmZhaWwodGVzdCwgbmV3IEVycm9yKCdQZW5kaW5nIHRlc3QgZm9yYmlkZGVuJyksIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRlc3Quc3RhdGUgPSBTVEFURV9QRU5ESU5HO1xuICAgICAgICAgIHNlbGYuZW1pdChjb25zdGFudHMuRVZFTlRfVEVTVF9QRU5ESU5HLCB0ZXN0KTtcbiAgICAgICAgfVxuICAgICAgICBzZWxmLmVtaXQoY29uc3RhbnRzLkVWRU5UX1RFU1RfRU5ELCB0ZXN0KTtcbiAgICAgICAgLy8gc2tpcCBpbm5lciBhZnRlckVhY2ggaG9va3MgYmVsb3cgZXJyU3VpdGUgbGV2ZWxcbiAgICAgICAgdmFyIG9yaWdTdWl0ZSA9IHNlbGYuc3VpdGU7XG4gICAgICAgIHNlbGYuc3VpdGUgPSBlcnJTdWl0ZSB8fCBzZWxmLnN1aXRlO1xuICAgICAgICByZXR1cm4gc2VsZi5ob29rVXAoSE9PS19UWVBFX0FGVEVSX0VBQ0gsIGZ1bmN0aW9uIChlLCBlU3VpdGUpIHtcbiAgICAgICAgICBzZWxmLnN1aXRlID0gb3JpZ1N1aXRlO1xuICAgICAgICAgIG5leHQoZSwgZVN1aXRlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHJldHVybiBob29rRXJyKGVyciwgZXJyU3VpdGUsIGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIHNlbGYuY3VycmVudFJ1bm5hYmxlID0gc2VsZi50ZXN0O1xuICAgICAgc2VsZi5ydW5UZXN0KGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgdGVzdCA9IHNlbGYudGVzdDtcbiAgICAgICAgLy8gY29uZGl0aW9uYWwgc2tpcCB3aXRoaW4gaXRcbiAgICAgICAgaWYgKHRlc3QucGVuZGluZykge1xuICAgICAgICAgIGlmIChzZWxmLmZvcmJpZFBlbmRpbmcpIHtcbiAgICAgICAgICAgIHNlbGYuZmFpbCh0ZXN0LCBuZXcgRXJyb3IoJ1BlbmRpbmcgdGVzdCBmb3JiaWRkZW4nKSwgdHJ1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRlc3Quc3RhdGUgPSBTVEFURV9QRU5ESU5HO1xuICAgICAgICAgICAgc2VsZi5lbWl0KGNvbnN0YW50cy5FVkVOVF9URVNUX1BFTkRJTkcsIHRlc3QpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZWxmLmVtaXQoY29uc3RhbnRzLkVWRU5UX1RFU1RfRU5ELCB0ZXN0KTtcbiAgICAgICAgICByZXR1cm4gc2VsZi5ob29rVXAoSE9PS19UWVBFX0FGVEVSX0VBQ0gsIG5leHQpO1xuICAgICAgICB9IGVsc2UgaWYgKGVycikge1xuICAgICAgICAgIHZhciByZXRyeSA9IHRlc3QuY3VycmVudFJldHJ5KCk7XG4gICAgICAgICAgaWYgKHJldHJ5IDwgdGVzdC5yZXRyaWVzKCkpIHtcbiAgICAgICAgICAgIHZhciBjbG9uZWRUZXN0ID0gdGVzdC5jbG9uZSgpO1xuICAgICAgICAgICAgY2xvbmVkVGVzdC5jdXJyZW50UmV0cnkocmV0cnkgKyAxKTtcbiAgICAgICAgICAgIHRlc3RzLnVuc2hpZnQoY2xvbmVkVGVzdCk7XG5cbiAgICAgICAgICAgIHNlbGYuZW1pdChjb25zdGFudHMuRVZFTlRfVEVTVF9SRVRSWSwgdGVzdCwgZXJyKTtcblxuICAgICAgICAgICAgLy8gRWFybHkgcmV0dXJuICsgaG9vayB0cmlnZ2VyIHNvIHRoYXQgaXQgZG9lc24ndFxuICAgICAgICAgICAgLy8gaW5jcmVtZW50IHRoZSBjb3VudCB3cm9uZ1xuICAgICAgICAgICAgcmV0dXJuIHNlbGYuaG9va1VwKEhPT0tfVFlQRV9BRlRFUl9FQUNILCBuZXh0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VsZi5mYWlsKHRlc3QsIGVycik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlbGYuZW1pdChjb25zdGFudHMuRVZFTlRfVEVTVF9FTkQsIHRlc3QpO1xuICAgICAgICAgIHJldHVybiBzZWxmLmhvb2tVcChIT09LX1RZUEVfQUZURVJfRUFDSCwgbmV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICB0ZXN0LnN0YXRlID0gU1RBVEVfUEFTU0VEO1xuICAgICAgICBzZWxmLmVtaXQoY29uc3RhbnRzLkVWRU5UX1RFU1RfUEFTUywgdGVzdCk7XG4gICAgICAgIHNlbGYuZW1pdChjb25zdGFudHMuRVZFTlRfVEVTVF9FTkQsIHRlc3QpO1xuICAgICAgICBzZWxmLmhvb2tVcChIT09LX1RZUEVfQUZURVJfRUFDSCwgbmV4dCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHRoaXMubmV4dCA9IG5leHQ7XG4gIHRoaXMuaG9va0VyciA9IGhvb2tFcnI7XG4gIG5leHQoKTtcbn07XG5cbi8qKlxuICogUnVuIHRoZSBnaXZlbiBgc3VpdGVgIGFuZCBpbnZva2UgdGhlIGNhbGxiYWNrIGBmbigpYCB3aGVuIGNvbXBsZXRlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N1aXRlfSBzdWl0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqL1xuUnVubmVyLnByb3RvdHlwZS5ydW5TdWl0ZSA9IGZ1bmN0aW9uIChzdWl0ZSwgZm4pIHtcbiAgdmFyIGkgPSAwO1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciB0b3RhbCA9IHRoaXMuZ3JlcFRvdGFsKHN1aXRlKTtcblxuICBkZWJ1ZygncnVuU3VpdGUoKTogcnVubmluZyAlcycsIHN1aXRlLmZ1bGxUaXRsZSgpKTtcblxuICBpZiAoIXRvdGFsIHx8IChzZWxmLmZhaWx1cmVzICYmIHN1aXRlLl9iYWlsKSkge1xuICAgIGRlYnVnKCdydW5TdWl0ZSgpOiBiYWlsaW5nJyk7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH1cblxuICB0aGlzLmVtaXQoY29uc3RhbnRzLkVWRU5UX1NVSVRFX0JFR0lOLCAodGhpcy5zdWl0ZSA9IHN1aXRlKSk7XG5cbiAgZnVuY3Rpb24gbmV4dChlcnJTdWl0ZSkge1xuICAgIGlmIChlcnJTdWl0ZSkge1xuICAgICAgLy8gY3VycmVudCBzdWl0ZSBmYWlsZWQgb24gYSBob29rIGZyb20gZXJyU3VpdGVcbiAgICAgIGlmIChlcnJTdWl0ZSA9PT0gc3VpdGUpIHtcbiAgICAgICAgLy8gaWYgZXJyU3VpdGUgaXMgY3VycmVudCBzdWl0ZVxuICAgICAgICAvLyBjb250aW51ZSB0byB0aGUgbmV4dCBzaWJsaW5nIHN1aXRlXG4gICAgICAgIHJldHVybiBkb25lKCk7XG4gICAgICB9XG4gICAgICAvLyBlcnJTdWl0ZSBpcyBhbW9uZyB0aGUgcGFyZW50cyBvZiBjdXJyZW50IHN1aXRlXG4gICAgICAvLyBzdG9wIGV4ZWN1dGlvbiBvZiBlcnJTdWl0ZSBhbmQgYWxsIHN1Yi1zdWl0ZXNcbiAgICAgIHJldHVybiBkb25lKGVyclN1aXRlKTtcbiAgICB9XG5cbiAgICBpZiAoc2VsZi5fYWJvcnQpIHtcbiAgICAgIHJldHVybiBkb25lKCk7XG4gICAgfVxuXG4gICAgdmFyIGN1cnIgPSBzdWl0ZS5zdWl0ZXNbaSsrXTtcbiAgICBpZiAoIWN1cnIpIHtcbiAgICAgIHJldHVybiBkb25lKCk7XG4gICAgfVxuXG4gICAgLy8gQXZvaWQgZ3JlcCBuZWdsZWN0aW5nIGxhcmdlIG51bWJlciBvZiB0ZXN0cyBjYXVzaW5nIGFcbiAgICAvLyBodWdlIHJlY3Vyc2l2ZSBsb29wIGFuZCB0aHVzIGEgbWF4aW11bSBjYWxsIHN0YWNrIGVycm9yLlxuICAgIC8vIFNlZSBjb21tZW50IGluIGB0aGlzLnJ1blRlc3RzKClgIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgIGlmIChzZWxmLl9ncmVwICE9PSBzZWxmLl9kZWZhdWx0R3JlcCkge1xuICAgICAgUnVubmVyLmltbWVkaWF0ZWx5KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi5ydW5TdWl0ZShjdXJyLCBuZXh0KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxmLnJ1blN1aXRlKGN1cnIsIG5leHQpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGRvbmUoZXJyU3VpdGUpIHtcbiAgICBzZWxmLnN1aXRlID0gc3VpdGU7XG4gICAgc2VsZi5uZXh0U3VpdGUgPSBuZXh0O1xuXG4gICAgLy8gcmVtb3ZlIHJlZmVyZW5jZSB0byB0ZXN0XG4gICAgZGVsZXRlIHNlbGYudGVzdDtcblxuICAgIHNlbGYuaG9vayhIT09LX1RZUEVfQUZURVJfQUxMLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLmVtaXQoY29uc3RhbnRzLkVWRU5UX1NVSVRFX0VORCwgc3VpdGUpO1xuICAgICAgZm4oZXJyU3VpdGUpO1xuICAgIH0pO1xuICB9XG5cbiAgdGhpcy5uZXh0U3VpdGUgPSBuZXh0O1xuXG4gIHRoaXMuaG9vayhIT09LX1RZUEVfQkVGT1JFX0FMTCwgZnVuY3Rpb24gKGVycikge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBkb25lKCk7XG4gICAgfVxuICAgIHNlbGYucnVuVGVzdHMoc3VpdGUsIG5leHQpO1xuICB9KTtcbn07XG5cbi8qKlxuICogSGFuZGxlIHVuY2F1Z2h0IGV4Y2VwdGlvbnMgd2l0aGluIHJ1bm5lci5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGJvdW5kIHRvIHRoZSBpbnN0YW5jZSBhcyBgUnVubmVyI3VuY2F1Z2h0YCBhdCBpbnN0YW50aWF0aW9uXG4gKiB0aW1lLiBJdCdzIGludGVuZGVkIHRvIGJlIGxpc3RlbmluZyBvbiB0aGUgYFByb2Nlc3MudW5jYXVnaHRFeGNlcHRpb25gIGV2ZW50LlxuICogSW4gb3JkZXIgdG8gbm90IGxlYWsgRUUgbGlzdGVuZXJzLCB3ZSBuZWVkIHRvIGVuc3VyZSBubyBtb3JlIHRoYW4gYSBzaW5nbGVcbiAqIGB1bmNhdWdodEV4Y2VwdGlvbmAgbGlzdGVuZXIgZXhpc3RzIHBlciBgUnVubmVyYC4gIFRoZSBvbmx5IHdheSB0byBkb1xuICogdGhpcy0tYmVjYXVzZSB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRoZSBjb250ZXh0IChhbmQgd2UgZG9uJ3QgaGF2ZSBsYW1iZGFzKS0taXNcbiAqIHRvIHVzZSBgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmRgLiBXZSBuZWVkIHN0cmljdCBlcXVhbGl0eSB0byB1bnJlZ2lzdGVyIGFuZFxuICogX29ubHlfIHVucmVnaXN0ZXIgdGhlIF9vbmVfIGxpc3RlbmVyIHdlIHNldCBmcm9tIHRoZVxuICogYFByb2Nlc3MudW5jYXVnaHRFeGNlcHRpb25gIGV2ZW50OyB3b3VsZCBiZSBwb29yIGZvcm0gdG8ganVzdCByZW1vdmVcbiAqIGV2ZXJ5dGhpbmcuIFNlZSB7QGxpbmsgUnVubmVyI3J1bn0gZm9yIHdoZXJlIHRoZSBldmVudCBsaXN0ZW5lciBpcyByZWdpc3RlcmVkXG4gKiBhbmQgdW5yZWdpc3RlcmVkLlxuICogQHBhcmFtIHtFcnJvcn0gZXJyIC0gU29tZSB1bmNhdWdodCBlcnJvclxuICogQHByaXZhdGVcbiAqL1xuUnVubmVyLnByb3RvdHlwZS5fdW5jYXVnaHQgPSBmdW5jdGlvbiAoZXJyKSB7XG4gIC8vIHRoaXMgaXMgZGVmZW5zaXZlIHRvIHByZXZlbnQgZnV0dXJlIGRldmVsb3BlcnMgZnJvbSBtaXMtY2FsbGluZyB0aGlzIGZ1bmN0aW9uLlxuICAvLyBpdCdzIG1vcmUgbGlrZWx5IHRoYXQgaXQnZCBiZSBjYWxsZWQgd2l0aCB0aGUgaW5jb3JyZWN0IGNvbnRleHQtLXNheSwgdGhlIGdsb2JhbFxuICAvLyBgcHJvY2Vzc2Agb2JqZWN0LS10aGFuIGl0IHdvdWxkIHRvIGJlIGNhbGxlZCB3aXRoIGEgY29udGV4dCB0aGF0IGlzIG5vdCBhIFwic3ViY2xhc3NcIlxuICAvLyBvZiBgUnVubmVyYC5cbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJ1bm5lcikpIHtcbiAgICB0aHJvdyBjcmVhdGVGYXRhbEVycm9yKFxuICAgICAgJ1J1bm5lciN1bmNhdWdodCgpIGNhbGxlZCB3aXRoIGludmFsaWQgY29udGV4dCcsXG4gICAgICB0aGlzXG4gICAgKTtcbiAgfVxuICBpZiAoZXJyIGluc3RhbmNlb2YgUGVuZGluZykge1xuICAgIGRlYnVnKCd1bmNhdWdodCgpOiBjYXVnaHQgYSBQZW5kaW5nJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIGJyb3dzZXIgZG9lcyBub3QgZXhpdCBzY3JpcHQgd2hlbiB0aHJvd2luZyBpbiBnbG9iYWwub25lcnJvcigpXG4gIGlmICh0aGlzLmFsbG93VW5jYXVnaHQgJiYgIXV0aWxzLmlzQnJvd3NlcigpKSB7XG4gICAgZGVidWcoJ3VuY2F1Z2h0KCk6IGJ1YmJsaW5nIGV4Y2VwdGlvbiBkdWUgdG8gLS1hbGxvdy11bmNhdWdodCcpO1xuICAgIHRocm93IGVycjtcbiAgfVxuXG4gIGlmICh0aGlzLnN0YXRlID09PSBjb25zdGFudHMuU1RBVEVfU1RPUFBFRCkge1xuICAgIGRlYnVnKCd1bmNhdWdodCgpOiB0aHJvd2luZyBhZnRlciBydW4gaGFzIGNvbXBsZXRlZCEnKTtcbiAgICB0aHJvdyBlcnI7XG4gIH1cblxuICBpZiAoZXJyKSB7XG4gICAgZGVidWcoJ3VuY2F1Z2h0KCk6IGdvdCB0cnV0aHkgZXhjZXB0aW9uICVPJywgZXJyKTtcbiAgfSBlbHNlIHtcbiAgICBkZWJ1ZygndW5jYXVnaHQoKTogdW5kZWZpbmVkL2ZhbHN5IGV4Y2VwdGlvbicpO1xuICAgIGVyciA9IGNyZWF0ZUludmFsaWRFeGNlcHRpb25FcnJvcihcbiAgICAgICdDYXVnaHQgZmFsc3kvdW5kZWZpbmVkIGV4Y2VwdGlvbiB3aGljaCB3b3VsZCBvdGhlcndpc2UgYmUgdW5jYXVnaHQuIE5vIHN0YWNrIHRyYWNlIGZvdW5kOyB0cnkgYSBkZWJ1Z2dlcicsXG4gICAgICBlcnJcbiAgICApO1xuICB9XG5cbiAgaWYgKCFpc0Vycm9yKGVycikpIHtcbiAgICBlcnIgPSB0aHJvd24yRXJyb3IoZXJyKTtcbiAgICBkZWJ1ZygndW5jYXVnaHQoKTogY29udmVydGVkIFwiZXJyb3JcIiAlbyB0byBFcnJvcicsIGVycik7XG4gIH1cbiAgZXJyLnVuY2F1Z2h0ID0gdHJ1ZTtcblxuICB2YXIgcnVubmFibGUgPSB0aGlzLmN1cnJlbnRSdW5uYWJsZTtcblxuICBpZiAoIXJ1bm5hYmxlKSB7XG4gICAgcnVubmFibGUgPSBuZXcgUnVubmFibGUoJ1VuY2F1Z2h0IGVycm9yIG91dHNpZGUgdGVzdCBzdWl0ZScpO1xuICAgIGRlYnVnKCd1bmNhdWdodCgpOiBubyBjdXJyZW50IFJ1bm5hYmxlOyBjcmVhdGVkIGEgcGhvbnkgb25lJyk7XG4gICAgcnVubmFibGUucGFyZW50ID0gdGhpcy5zdWl0ZTtcblxuICAgIGlmICh0aGlzLnN0YXRlID09PSBjb25zdGFudHMuU1RBVEVfUlVOTklORykge1xuICAgICAgZGVidWcoJ3VuY2F1Z2h0KCk6IGZhaWxpbmcgZ3JhY2VmdWxseScpO1xuICAgICAgdGhpcy5mYWlsKHJ1bm5hYmxlLCBlcnIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDYW4ndCByZWNvdmVyIGZyb20gdGhpcyBmYWlsdXJlXG4gICAgICBkZWJ1ZygndW5jYXVnaHQoKTogdGVzdCBydW4gaGFzIG5vdCB5ZXQgc3RhcnRlZDsgdW5yZWNvdmVyYWJsZScpO1xuICAgICAgdGhpcy5lbWl0KGNvbnN0YW50cy5FVkVOVF9SVU5fQkVHSU4pO1xuICAgICAgdGhpcy5mYWlsKHJ1bm5hYmxlLCBlcnIpO1xuICAgICAgdGhpcy5lbWl0KGNvbnN0YW50cy5FVkVOVF9SVU5fRU5EKTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICBydW5uYWJsZS5jbGVhclRpbWVvdXQoKTtcblxuICBpZiAocnVubmFibGUuaXNGYWlsZWQoKSkge1xuICAgIGRlYnVnKCd1bmNhdWdodCgpOiBSdW5uYWJsZSBoYXMgYWxyZWFkeSBmYWlsZWQnKTtcbiAgICAvLyBJZ25vcmUgZXJyb3IgaWYgYWxyZWFkeSBmYWlsZWRcbiAgICByZXR1cm47XG4gIH0gZWxzZSBpZiAocnVubmFibGUuaXNQZW5kaW5nKCkpIHtcbiAgICBkZWJ1ZygndW5jYXVnaHQoKTogcGVuZGluZyBSdW5uYWJsZSB3b3VuZCB1cCBmYWlsaW5nIScpO1xuICAgIC8vIHJlcG9ydCAncGVuZGluZyB0ZXN0JyByZXRyb3NwZWN0aXZlbHkgYXMgZmFpbGVkXG4gICAgdGhpcy5mYWlsKHJ1bm5hYmxlLCBlcnIsIHRydWUpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIHdlIGNhbm5vdCByZWNvdmVyIGdyYWNlZnVsbHkgaWYgYSBSdW5uYWJsZSBoYXMgYWxyZWFkeSBwYXNzZWRcbiAgLy8gdGhlbiBmYWlscyBhc3luY2hyb25vdXNseVxuICBpZiAocnVubmFibGUuaXNQYXNzZWQoKSkge1xuICAgIGRlYnVnKCd1bmNhdWdodCgpOiBSdW5uYWJsZSBoYXMgYWxyZWFkeSBwYXNzZWQ7IGJhaWxpbmcgZ3JhY2VmdWxseScpO1xuICAgIHRoaXMuZmFpbChydW5uYWJsZSwgZXJyKTtcbiAgICB0aGlzLmFib3J0KCk7XG4gIH0gZWxzZSB7XG4gICAgZGVidWcoJ3VuY2F1Z2h0KCk6IGZvcmNpbmcgUnVubmFibGUgdG8gY29tcGxldGUgd2l0aCBFcnJvcicpO1xuICAgIHJldHVybiBydW5uYWJsZS5jYWxsYmFjayhlcnIpO1xuICB9XG59O1xuXG4vKipcbiAqIFJ1biB0aGUgcm9vdCBzdWl0ZSBhbmQgaW52b2tlIGBmbihmYWlsdXJlcylgXG4gKiBvbiBjb21wbGV0aW9uLlxuICpcbiAqIEBwdWJsaWNcbiAqIEBtZW1iZXJvZiBSdW5uZXJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gQ2FsbGJhY2sgd2hlbiBmaW5pc2hlZFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRzXSAtIEZvciBzdWJjbGFzc2VzXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBvcHRzLmZpbGVzIC0gRmlsZXMgdG8gcnVuXG4gKiBAcGFyYW0ge09wdGlvbnN9IG9wdHMub3B0aW9ucyAtIGNvbW1hbmQtbGluZSBvcHRpb25zXG4gKiBAcmV0dXJucyB7UnVubmVyfSBSdW5uZXIgaW5zdGFuY2UuXG4gKi9cblJ1bm5lci5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKGZuLCBvcHRzID0ge30pIHtcbiAgdmFyIHJvb3RTdWl0ZSA9IHRoaXMuc3VpdGU7XG4gIHZhciBvcHRpb25zID0gb3B0cy5vcHRpb25zIHx8IHt9O1xuXG4gIGRlYnVnKCdydW4oKTogZ290IG9wdGlvbnM6ICVPJywgb3B0aW9ucyk7XG4gIGZuID0gZm4gfHwgZnVuY3Rpb24gKCkge307XG5cbiAgY29uc3QgZW5kID0gKCkgPT4ge1xuICAgIGlmICghdGhpcy50b3RhbCAmJiB0aGlzLl9vcHRzLmZhaWxaZXJvKSB0aGlzLmZhaWx1cmVzID0gMTtcblxuICAgIGRlYnVnKCdydW4oKTogcm9vdCBzdWl0ZSBjb21wbGV0ZWQ7IGVtaXR0aW5nICVzJywgY29uc3RhbnRzLkVWRU5UX1JVTl9FTkQpO1xuICAgIHRoaXMuZW1pdChjb25zdGFudHMuRVZFTlRfUlVOX0VORCk7XG4gIH07XG5cbiAgY29uc3QgYmVnaW4gPSAoKSA9PiB7XG4gICAgZGVidWcoJ3J1bigpOiBlbWl0dGluZyAlcycsIGNvbnN0YW50cy5FVkVOVF9SVU5fQkVHSU4pO1xuICAgIHRoaXMuZW1pdChjb25zdGFudHMuRVZFTlRfUlVOX0JFR0lOKTtcbiAgICBkZWJ1ZygncnVuKCk6IGVtaXR0ZWQgJXMnLCBjb25zdGFudHMuRVZFTlRfUlVOX0JFR0lOKTtcblxuICAgIHRoaXMucnVuU3VpdGUocm9vdFN1aXRlLCBlbmQpO1xuICB9O1xuXG4gIGNvbnN0IHByZXBhcmUgPSAoKSA9PiB7XG4gICAgZGVidWcoJ3J1bigpOiBzdGFydGluZycpO1xuICAgIC8vIElmIHRoZXJlIGlzIGFuIGBvbmx5YCBmaWx0ZXJcbiAgICBpZiAocm9vdFN1aXRlLmhhc09ubHkoKSkge1xuICAgICAgcm9vdFN1aXRlLmZpbHRlck9ubHkoKTtcbiAgICAgIGRlYnVnKCdydW4oKTogZmlsdGVyZWQgZXhjbHVzaXZlIFJ1bm5hYmxlcycpO1xuICAgIH1cbiAgICB0aGlzLnN0YXRlID0gY29uc3RhbnRzLlNUQVRFX1JVTk5JTkc7XG4gICAgaWYgKHRoaXMuX29wdHMuZGVsYXkpIHtcbiAgICAgIHRoaXMuZW1pdChjb25zdGFudHMuRVZFTlRfREVMQVlfRU5EKTtcbiAgICAgIGRlYnVnKCdydW4oKTogXCJkZWxheVwiIGVuZGVkJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJlZ2luKCk7XG4gIH07XG5cbiAgLy8gcmVmZXJlbmNlcyBjbGVhbnVwIHRvIGF2b2lkIG1lbW9yeSBsZWFrc1xuICBpZiAodGhpcy5fb3B0cy5jbGVhblJlZmVyZW5jZXNBZnRlclJ1bikge1xuICAgIHRoaXMub24oY29uc3RhbnRzLkVWRU5UX1NVSVRFX0VORCwgc3VpdGUgPT4ge1xuICAgICAgc3VpdGUuY2xlYW5SZWZlcmVuY2VzKCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBjYWxsYmFja1xuICB0aGlzLm9uKGNvbnN0YW50cy5FVkVOVF9SVU5fRU5ELCBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5zdGF0ZSA9IGNvbnN0YW50cy5TVEFURV9TVE9QUEVEO1xuICAgIGRlYnVnKCdydW4oKTogZW1pdHRlZCAlcycsIGNvbnN0YW50cy5FVkVOVF9SVU5fRU5EKTtcbiAgICBmbih0aGlzLmZhaWx1cmVzKTtcbiAgfSk7XG5cbiAgdGhpcy5fcmVtb3ZlRXZlbnRMaXN0ZW5lcihwcm9jZXNzLCAndW5jYXVnaHRFeGNlcHRpb24nLCB0aGlzLnVuY2F1Z2h0KTtcbiAgdGhpcy5fcmVtb3ZlRXZlbnRMaXN0ZW5lcihwcm9jZXNzLCAndW5oYW5kbGVkUmVqZWN0aW9uJywgdGhpcy51bmhhbmRsZWQpO1xuICB0aGlzLl9hZGRFdmVudExpc3RlbmVyKHByb2Nlc3MsICd1bmNhdWdodEV4Y2VwdGlvbicsIHRoaXMudW5jYXVnaHQpO1xuICB0aGlzLl9hZGRFdmVudExpc3RlbmVyKHByb2Nlc3MsICd1bmhhbmRsZWRSZWplY3Rpb24nLCB0aGlzLnVuaGFuZGxlZCk7XG5cbiAgaWYgKHRoaXMuX29wdHMuZGVsYXkpIHtcbiAgICAvLyBmb3IgcmVwb3J0ZXJzLCBJIGd1ZXNzLlxuICAgIC8vIG1pZ2h0IGJlIG5pY2UgdG8gZGVib3VuY2Ugc29tZSBkb3RzIHdoaWxlIHdlIHdhaXQuXG4gICAgdGhpcy5lbWl0KGNvbnN0YW50cy5FVkVOVF9ERUxBWV9CRUdJTiwgcm9vdFN1aXRlKTtcbiAgICByb290U3VpdGUub25jZShFVkVOVF9ST09UX1NVSVRFX1JVTiwgcHJlcGFyZSk7XG4gICAgZGVidWcoJ3J1bigpOiB3YWl0aW5nIGZvciBncmVlbiBsaWdodCBkdWUgdG8gLS1kZWxheScpO1xuICB9IGVsc2Uge1xuICAgIFJ1bm5lci5pbW1lZGlhdGVseShwcmVwYXJlKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBUb2dnbGUgcGFydGlhbCBvYmplY3QgbGlua2luZyBiZWhhdmlvcjsgdXNlZCBmb3IgYnVpbGRpbmcgb2JqZWN0IHJlZmVyZW5jZXMgZnJvbVxuICogdW5pcXVlIElEJ3MuIERvZXMgbm90aGluZyBpbiBzZXJpYWwgbW9kZSwgYmVjYXVzZSB0aGUgb2JqZWN0IHJlZmVyZW5jZXMgYWxyZWFkeSBleGlzdC5cbiAqIFN1YmNsYXNzZXMgY2FuIGltcGxlbWVudCB0aGlzIChlLmcuLCBgUGFyYWxsZWxCdWZmZXJlZFJ1bm5lcmApXG4gKiBAYWJzdHJhY3RcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3ZhbHVlXSAtIElmIGB0cnVlYCwgZW5hYmxlIHBhcnRpYWwgb2JqZWN0IGxpbmtpbmcsIG90aGVyd2lzZSBkaXNhYmxlXG4gKiBAcmV0dXJucyB7UnVubmVyfVxuICogQGNoYWluYWJsZVxuICogQHB1YmxpY1xuICogQGV4YW1wbGVcbiAqIC8vIHRoaXMgcmVwb3J0ZXIgbmVlZHMgcHJvcGVyIG9iamVjdCByZWZlcmVuY2VzIHdoZW4gcnVuIGluIHBhcmFsbGVsIG1vZGVcbiAqIGNsYXNzIE15UmVwb3J0ZXIge1xuICogICBjb25zdHJ1Y3RvcihydW5uZXIpIHtcbiAqICAgICBydW5uZXIubGlua1BhcnRpYWxPYmplY3RzKHRydWUpXG4gKiAgICAgICAub24oRVZFTlRfU1VJVEVfQkVHSU4sIHN1aXRlID0+IHtcbiAqICAgICAgICAgLy8gdGhpcyBTdWl0ZSBtYXkgYmUgdGhlIHNhbWUgb2JqZWN0Li4uXG4gKiAgICAgICB9KVxuICogICAgICAgLm9uKEVWRU5UX1RFU1RfQkVHSU4sIHRlc3QgPT4ge1xuICogICAgICAgICAvLyAuLi5hcyB0aGUgYHRlc3QucGFyZW50YCBwcm9wZXJ0eVxuICogICAgICAgfSk7XG4gKiAgIH1cbiAqIH1cbiAqL1xuUnVubmVyLnByb3RvdHlwZS5saW5rUGFydGlhbE9iamVjdHMgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKlxuICogTGlrZSB7QGxpbmsgUnVubmVyI3J1bn0sIGJ1dCBkb2VzIG5vdCBhY2NlcHQgYSBjYWxsYmFjayBhbmQgcmV0dXJucyBhIGBQcm9taXNlYCBpbnN0ZWFkIG9mIGEgYFJ1bm5lcmAuXG4gKiBUaGlzIGZ1bmN0aW9uIGNhbm5vdCByZWplY3Q7IGFuIGB1bmhhbmRsZWRSZWplY3Rpb25gIGV2ZW50IHdpbGwgYnViYmxlIHVwIHRvIHRoZSBgcHJvY2Vzc2Agb2JqZWN0IGluc3RlYWQuXG4gKiBAcHVibGljXG4gKiBAbWVtYmVyb2YgUnVubmVyXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdHNdIC0gT3B0aW9ucyBmb3Ige0BsaW5rIFJ1bm5lciNydW59XG4gKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSBGYWlsdXJlIGNvdW50XG4gKi9cblJ1bm5lci5wcm90b3R5cGUucnVuQXN5bmMgPSBhc3luYyBmdW5jdGlvbiBydW5Bc3luYyhvcHRzID0ge30pIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgIHRoaXMucnVuKHJlc29sdmUsIG9wdHMpO1xuICB9KTtcbn07XG5cbi8qKlxuICogQ2xlYW5seSBhYm9ydCBleGVjdXRpb24uXG4gKlxuICogQG1lbWJlcm9mIFJ1bm5lclxuICogQHB1YmxpY1xuICogQHJldHVybiB7UnVubmVyfSBSdW5uZXIgaW5zdGFuY2UuXG4gKi9cblJ1bm5lci5wcm90b3R5cGUuYWJvcnQgPSBmdW5jdGlvbiAoKSB7XG4gIGRlYnVnKCdhYm9ydCgpOiBhYm9ydGluZycpO1xuICB0aGlzLl9hYm9ydCA9IHRydWU7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIE1vY2hhIGlzIHJ1bm5pbmcgaW4gcGFyYWxsZWwgbW9kZS4gIEZvciByZXBvcnRlcnMuXG4gKlxuICogU3ViY2xhc3NlcyBzaG91bGQgcmV0dXJuIGFuIGFwcHJvcHJpYXRlIHZhbHVlLlxuICogQHB1YmxpY1xuICogQHJldHVybnMge2ZhbHNlfVxuICovXG5SdW5uZXIucHJvdG90eXBlLmlzUGFyYWxsZWxNb2RlID0gZnVuY3Rpb24gaXNQYXJhbGxlbE1vZGUoKSB7XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogQ29uZmlndXJlcyBhbiBhbHRlcm5hdGUgcmVwb3J0ZXIgZm9yIHdvcmtlciBwcm9jZXNzZXMgdG8gdXNlLiBTdWJjbGFzc2VzXG4gKiB1c2luZyB3b3JrZXIgcHJvY2Vzc2VzIHNob3VsZCBpbXBsZW1lbnQgdGhpcy5cbiAqIEBwdWJsaWNcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gQWJzb2x1dGUgcGF0aCB0byBhbHRlcm5hdGUgcmVwb3J0ZXIgZm9yIHdvcmtlciBwcm9jZXNzZXMgdG8gdXNlXG4gKiBAcmV0dXJucyB7UnVubmVyfVxuICogQHRocm93cyBXaGVuIGluIHNlcmlhbCBtb2RlXG4gKiBAY2hhaW5hYmxlXG4gKiBAYWJzdHJhY3RcbiAqL1xuUnVubmVyLnByb3RvdHlwZS53b3JrZXJSZXBvcnRlciA9IGZ1bmN0aW9uICgpIHtcbiAgdGhyb3cgY3JlYXRlVW5zdXBwb3J0ZWRFcnJvcignd29ya2VyUmVwb3J0ZXIoKSBub3Qgc3VwcG9ydGVkIGluIHNlcmlhbCBtb2RlJyk7XG59O1xuXG4vKipcbiAqIEZpbHRlciBsZWFrcyB3aXRoIHRoZSBnaXZlbiBnbG9iYWxzIGZsYWdnZWQgYXMgYG9rYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gb2tcbiAqIEBwYXJhbSB7QXJyYXl9IGdsb2JhbHNcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5mdW5jdGlvbiBmaWx0ZXJMZWFrcyhvaywgZ2xvYmFscykge1xuICByZXR1cm4gZ2xvYmFscy5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuICAgIC8vIEZpcmVmb3ggYW5kIENocm9tZSBleHBvc2VzIGlmcmFtZXMgYXMgaW5kZXggaW5zaWRlIHRoZSB3aW5kb3cgb2JqZWN0XG4gICAgaWYgKC9eXFxkKy8udGVzdChrZXkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gaW4gZmlyZWZveFxuICAgIC8vIGlmIHJ1bm5lciBydW5zIGluIGFuIGlmcmFtZSwgdGhpcyBpZnJhbWUncyB3aW5kb3cuZ2V0SW50ZXJmYWNlIG1ldGhvZFxuICAgIC8vIG5vdCBpbml0IGF0IGZpcnN0IGl0IGlzIGFzc2lnbmVkIGluIHNvbWUgc2Vjb25kc1xuICAgIGlmIChnbG9iYWwubmF2aWdhdG9yICYmIC9eZ2V0SW50ZXJmYWNlLy50ZXN0KGtleSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBhbiBpZnJhbWUgY291bGQgYmUgYXBwcm9hY2hlZCBieSB3aW5kb3dbaWZyYW1lSW5kZXhdXG4gICAgLy8gaW4gaWU2LDcsOCBhbmQgb3BlcmEsIGlmcmFtZUluZGV4IGlzIGVudW1lcmFibGUsIHRoaXMgY291bGQgY2F1c2UgbGVha1xuICAgIGlmIChnbG9iYWwubmF2aWdhdG9yICYmIC9eXFxkKy8udGVzdChrZXkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gT3BlcmEgYW5kIElFIGV4cG9zZSBnbG9iYWwgdmFyaWFibGVzIGZvciBIVE1MIGVsZW1lbnQgSURzIChpc3N1ZSAjMjQzKVxuICAgIGlmICgvXm1vY2hhLS8udGVzdChrZXkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIG1hdGNoZWQgPSBvay5maWx0ZXIoZnVuY3Rpb24gKG9rKSB7XG4gICAgICBpZiAofm9rLmluZGV4T2YoJyonKSkge1xuICAgICAgICByZXR1cm4ga2V5LmluZGV4T2Yob2suc3BsaXQoJyonKVswXSkgPT09IDA7XG4gICAgICB9XG4gICAgICByZXR1cm4ga2V5ID09PSBvaztcbiAgICB9KTtcbiAgICByZXR1cm4gIW1hdGNoZWQubGVuZ3RoICYmICghZ2xvYmFsLm5hdmlnYXRvciB8fCBrZXkgIT09ICdvbmVycm9yJyk7XG4gIH0pO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGFyZ3VtZW50IGlzIGFuIGluc3RhbmNlIG9mIEVycm9yIG9iamVjdCBvciBhIGR1Y2stdHlwZWQgZXF1aXZhbGVudC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGVyciAtIG9iamVjdCB0byBjaGVja1xuICogQHBhcmFtIHtzdHJpbmd9IGVyci5tZXNzYWdlIC0gZXJyb3IgbWVzc2FnZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzRXJyb3IoZXJyKSB7XG4gIHJldHVybiBlcnIgaW5zdGFuY2VvZiBFcnJvciB8fCAoZXJyICYmIHR5cGVvZiBlcnIubWVzc2FnZSA9PT0gJ3N0cmluZycpO1xufVxuXG4vKipcbiAqXG4gKiBDb252ZXJ0cyB0aHJvd24gbm9uLWV4dGVuc2libGUgdHlwZSBpbnRvIHByb3BlciBFcnJvci5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB0aHJvd24gLSBOb24tZXh0ZW5zaWJsZSB0eXBlIHRocm93biBieSBjb2RlXG4gKiBAcmV0dXJuIHtFcnJvcn1cbiAqL1xuZnVuY3Rpb24gdGhyb3duMkVycm9yKGVycikge1xuICByZXR1cm4gbmV3IEVycm9yKFxuICAgIGB0aGUgJHt1dGlscy5jYW5vbmljYWxUeXBlKGVycil9ICR7c3RyaW5naWZ5KFxuICAgICAgZXJyXG4gICAgKX0gd2FzIHRocm93biwgdGhyb3cgYW4gRXJyb3IgOilgXG4gICk7XG59XG5cblJ1bm5lci5jb25zdGFudHMgPSBjb25zdGFudHM7XG5cbi8qKlxuICogTm9kZS5qcycgYEV2ZW50RW1pdHRlcmBcbiAqIEBleHRlcm5hbCBFdmVudEVtaXR0ZXJcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvZXZlbnRzLmh0bWwjZXZlbnRzX2NsYXNzX2V2ZW50ZW1pdHRlcn1cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJ1bm5lcjtcbiIsICIndXNlIHN0cmljdCc7XG4vKipcbiAqIEBtb2R1bGUgQmFzZVxuICovXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIGRpZmYgPSByZXF1aXJlKCdkaWZmJyk7XG52YXIgbWlsbGlzZWNvbmRzID0gcmVxdWlyZSgnbXMnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgc3VwcG9ydHNDb2xvciA9IHJlcXVpcmUoJ3N1cHBvcnRzLWNvbG9yJyk7XG52YXIgc3ltYm9scyA9IHJlcXVpcmUoJ2xvZy1zeW1ib2xzJyk7XG52YXIgY29uc3RhbnRzID0gcmVxdWlyZSgnLi4vcnVubmVyJykuY29uc3RhbnRzO1xudmFyIEVWRU5UX1RFU1RfUEFTUyA9IGNvbnN0YW50cy5FVkVOVF9URVNUX1BBU1M7XG52YXIgRVZFTlRfVEVTVF9GQUlMID0gY29uc3RhbnRzLkVWRU5UX1RFU1RfRkFJTDtcblxuY29uc3QgaXNCcm93c2VyID0gdXRpbHMuaXNCcm93c2VyKCk7XG5cbmZ1bmN0aW9uIGdldEJyb3dzZXJXaW5kb3dTaXplKCkge1xuICBpZiAoJ2lubmVySGVpZ2h0JyBpbiBnbG9iYWwpIHtcbiAgICByZXR1cm4gW2dsb2JhbC5pbm5lckhlaWdodCwgZ2xvYmFsLmlubmVyV2lkdGhdO1xuICB9XG4gIC8vIEluIGEgV2ViIFdvcmtlciwgdGhlIERPTSBXaW5kb3cgaXMgbm90IGF2YWlsYWJsZS5cbiAgcmV0dXJuIFs2NDAsIDQ4MF07XG59XG5cbi8qKlxuICogRXhwb3NlIGBCYXNlYC5cbiAqL1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBCYXNlO1xuXG4vKipcbiAqIENoZWNrIGlmIGJvdGggc3RkaW8gc3RyZWFtcyBhcmUgYXNzb2NpYXRlZCB3aXRoIGEgdHR5LlxuICovXG5cbnZhciBpc2F0dHkgPSBpc0Jyb3dzZXIgfHwgKHByb2Nlc3Muc3Rkb3V0LmlzVFRZICYmIHByb2Nlc3Muc3RkZXJyLmlzVFRZKTtcblxuLyoqXG4gKiBTYXZlIGxvZyByZWZlcmVuY2VzIHRvIGF2b2lkIHRlc3RzIGludGVyZmVyaW5nIChzZWUgR0gtMzYwNCkuXG4gKi9cbnZhciBjb25zb2xlTG9nID0gY29uc29sZS5sb2c7XG5cbi8qKlxuICogRW5hYmxlIGNvbG9yaW5nIGJ5IGRlZmF1bHQsIGV4Y2VwdCBpbiB0aGUgYnJvd3NlciBpbnRlcmZhY2UuXG4gKi9cblxuZXhwb3J0cy51c2VDb2xvcnMgPVxuICAhaXNCcm93c2VyICYmXG4gIChzdXBwb3J0c0NvbG9yLnN0ZG91dCB8fCBwcm9jZXNzLmVudi5NT0NIQV9DT0xPUlMgIT09IHVuZGVmaW5lZCk7XG5cbi8qKlxuICogSW5saW5lIGRpZmZzIGluc3RlYWQgb2YgKy8tXG4gKi9cblxuZXhwb3J0cy5pbmxpbmVEaWZmcyA9IGZhbHNlO1xuXG4vKipcbiAqIFRydW5jYXRlIGRpZmZzIGxvbmdlciB0aGFuIHRoaXMgdmFsdWUgdG8gYXZvaWQgc2xvdyBwZXJmb3JtYW5jZVxuICovXG5leHBvcnRzLm1heERpZmZTaXplID0gODE5MjtcblxuLyoqXG4gKiBEZWZhdWx0IGNvbG9yIG1hcC5cbiAqL1xuXG5leHBvcnRzLmNvbG9ycyA9IHtcbiAgcGFzczogOTAsXG4gIGZhaWw6IDMxLFxuICAnYnJpZ2h0IHBhc3MnOiA5MixcbiAgJ2JyaWdodCBmYWlsJzogOTEsXG4gICdicmlnaHQgeWVsbG93JzogOTMsXG4gIHBlbmRpbmc6IDM2LFxuICBzdWl0ZTogMCxcbiAgJ2Vycm9yIHRpdGxlJzogMCxcbiAgJ2Vycm9yIG1lc3NhZ2UnOiAzMSxcbiAgJ2Vycm9yIHN0YWNrJzogOTAsXG4gIGNoZWNrbWFyazogMzIsXG4gIGZhc3Q6IDkwLFxuICBtZWRpdW06IDMzLFxuICBzbG93OiAzMSxcbiAgZ3JlZW46IDMyLFxuICBsaWdodDogOTAsXG4gICdkaWZmIGd1dHRlcic6IDkwLFxuICAnZGlmZiBhZGRlZCc6IDMyLFxuICAnZGlmZiByZW1vdmVkJzogMzEsXG4gICdkaWZmIGFkZGVkIGlubGluZSc6ICczMDs0MicsXG4gICdkaWZmIHJlbW92ZWQgaW5saW5lJzogJzMwOzQxJ1xufTtcblxuLyoqXG4gKiBEZWZhdWx0IHN5bWJvbCBtYXAuXG4gKi9cblxuZXhwb3J0cy5zeW1ib2xzID0ge1xuICBvazogc3ltYm9scy5zdWNjZXNzLFxuICBlcnI6IHN5bWJvbHMuZXJyb3IsXG4gIGRvdDogJy4nLFxuICBjb21tYTogJywnLFxuICBiYW5nOiAnISdcbn07XG5cbi8qKlxuICogQ29sb3IgYHN0cmAgd2l0aCB0aGUgZ2l2ZW4gYHR5cGVgLFxuICogYWxsb3dpbmcgY29sb3JzIHRvIGJlIGRpc2FibGVkLFxuICogYXMgd2VsbCBhcyB1c2VyLWRlZmluZWQgY29sb3JcbiAqIHNjaGVtZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbnZhciBjb2xvciA9IChleHBvcnRzLmNvbG9yID0gZnVuY3Rpb24gKHR5cGUsIHN0cikge1xuICBpZiAoIWV4cG9ydHMudXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIFN0cmluZyhzdHIpO1xuICB9XG4gIHJldHVybiAnXFx1MDAxYlsnICsgZXhwb3J0cy5jb2xvcnNbdHlwZV0gKyAnbScgKyBzdHIgKyAnXFx1MDAxYlswbSc7XG59KTtcblxuLyoqXG4gKiBFeHBvc2UgdGVybSB3aW5kb3cgc2l6ZSwgd2l0aCBzb21lIGRlZmF1bHRzIGZvciB3aGVuIHN0ZGVyciBpcyBub3QgYSB0dHkuXG4gKi9cblxuZXhwb3J0cy53aW5kb3cgPSB7XG4gIHdpZHRoOiA3NVxufTtcblxuaWYgKGlzYXR0eSkge1xuICBpZiAoaXNCcm93c2VyKSB7XG4gICAgZXhwb3J0cy53aW5kb3cud2lkdGggPSBnZXRCcm93c2VyV2luZG93U2l6ZSgpWzFdO1xuICB9IGVsc2Uge1xuICAgIGV4cG9ydHMud2luZG93LndpZHRoID0gcHJvY2Vzcy5zdGRvdXQuZ2V0V2luZG93U2l6ZSgxKVswXTtcbiAgfVxufVxuXG4vKipcbiAqIEV4cG9zZSBzb21lIGJhc2ljIGN1cnNvciBpbnRlcmFjdGlvbnMgdGhhdCBhcmUgY29tbW9uIGFtb25nIHJlcG9ydGVycy5cbiAqL1xuXG5leHBvcnRzLmN1cnNvciA9IHtcbiAgaGlkZTogZnVuY3Rpb24gKCkge1xuICAgIGlzYXR0eSAmJiBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFx1MDAxYls/MjVsJyk7XG4gIH0sXG5cbiAgc2hvdzogZnVuY3Rpb24gKCkge1xuICAgIGlzYXR0eSAmJiBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFx1MDAxYls/MjVoJyk7XG4gIH0sXG5cbiAgZGVsZXRlTGluZTogZnVuY3Rpb24gKCkge1xuICAgIGlzYXR0eSAmJiBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFx1MDAxYlsySycpO1xuICB9LFxuXG4gIGJlZ2lubmluZ09mTGluZTogZnVuY3Rpb24gKCkge1xuICAgIGlzYXR0eSAmJiBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFx1MDAxYlswRycpO1xuICB9LFxuXG4gIENSOiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGlzYXR0eSkge1xuICAgICAgZXhwb3J0cy5jdXJzb3IuZGVsZXRlTGluZSgpO1xuICAgICAgZXhwb3J0cy5jdXJzb3IuYmVnaW5uaW5nT2ZMaW5lKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXHInKTtcbiAgICB9XG4gIH1cbn07XG5cbnZhciBzaG93RGlmZiA9IChleHBvcnRzLnNob3dEaWZmID0gZnVuY3Rpb24gKGVycikge1xuICByZXR1cm4gKFxuICAgIGVyciAmJlxuICAgIGVyci5zaG93RGlmZiAhPT0gZmFsc2UgJiZcbiAgICBzYW1lVHlwZShlcnIuYWN0dWFsLCBlcnIuZXhwZWN0ZWQpICYmXG4gICAgZXJyLmV4cGVjdGVkICE9PSB1bmRlZmluZWRcbiAgKTtcbn0pO1xuXG5mdW5jdGlvbiBzdHJpbmdpZnlEaWZmT2JqcyhlcnIpIHtcbiAgaWYgKCF1dGlscy5pc1N0cmluZyhlcnIuYWN0dWFsKSB8fCAhdXRpbHMuaXNTdHJpbmcoZXJyLmV4cGVjdGVkKSkge1xuICAgIGVyci5hY3R1YWwgPSB1dGlscy5zdHJpbmdpZnkoZXJyLmFjdHVhbCk7XG4gICAgZXJyLmV4cGVjdGVkID0gdXRpbHMuc3RyaW5naWZ5KGVyci5leHBlY3RlZCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZGlmZiBiZXR3ZWVuIDIgc3RyaW5ncyB3aXRoIGNvbG91cmVkIEFOU0kgb3V0cHV0LlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVGhlIGRpZmYgd2lsbCBiZSBlaXRoZXIgaW5saW5lIG9yIHVuaWZpZWQgZGVwZW5kZW50IG9uIHRoZSB2YWx1ZVxuICogb2YgYEJhc2UuaW5saW5lRGlmZmAuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFjdHVhbFxuICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkXG4gKiBAcmV0dXJuIHtzdHJpbmd9IERpZmZcbiAqL1xuXG52YXIgZ2VuZXJhdGVEaWZmID0gKGV4cG9ydHMuZ2VuZXJhdGVEaWZmID0gZnVuY3Rpb24gKGFjdHVhbCwgZXhwZWN0ZWQpIHtcbiAgdHJ5IHtcbiAgICB2YXIgbWF4TGVuID0gZXhwb3J0cy5tYXhEaWZmU2l6ZTtcbiAgICB2YXIgc2tpcHBlZCA9IDA7XG4gICAgaWYgKG1heExlbiA+IDApIHtcbiAgICAgIHNraXBwZWQgPSBNYXRoLm1heChhY3R1YWwubGVuZ3RoIC0gbWF4TGVuLCBleHBlY3RlZC5sZW5ndGggLSBtYXhMZW4pO1xuICAgICAgYWN0dWFsID0gYWN0dWFsLnNsaWNlKDAsIG1heExlbik7XG4gICAgICBleHBlY3RlZCA9IGV4cGVjdGVkLnNsaWNlKDAsIG1heExlbik7XG4gICAgfVxuICAgIGxldCByZXN1bHQgPSBleHBvcnRzLmlubGluZURpZmZzXG4gICAgICA/IGlubGluZURpZmYoYWN0dWFsLCBleHBlY3RlZClcbiAgICAgIDogdW5pZmllZERpZmYoYWN0dWFsLCBleHBlY3RlZCk7XG4gICAgaWYgKHNraXBwZWQgPiAwKSB7XG4gICAgICByZXN1bHQgPSBgJHtyZXN1bHR9XFxuICAgICAgW21vY2hhXSBvdXRwdXQgdHJ1bmNhdGVkIHRvICR7bWF4TGVufSBjaGFyYWN0ZXJzLCBzZWUgXCJtYXhEaWZmU2l6ZVwiIHJlcG9ydGVyLW9wdGlvblxcbmA7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHZhciBtc2cgPVxuICAgICAgJ1xcbiAgICAgICcgK1xuICAgICAgY29sb3IoJ2RpZmYgYWRkZWQnLCAnKyBleHBlY3RlZCcpICtcbiAgICAgICcgJyArXG4gICAgICBjb2xvcignZGlmZiByZW1vdmVkJywgJy0gYWN0dWFsOiAgZmFpbGVkIHRvIGdlbmVyYXRlIE1vY2hhIGRpZmYnKSArXG4gICAgICAnXFxuJztcbiAgICByZXR1cm4gbXNnO1xuICB9XG59KTtcblxuLyoqXG4gKiBUcmF2ZXJzZXMgZXJyLmNhdXNlIGFuZCByZXR1cm5zIGFsbCBzdGFjayB0cmFjZXNcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcGFyYW0ge1NldDxFcnJvcj59IFtzZWVuXVxuICogQHJldHVybiB7RnVsbEVycm9yU3RhY2t9XG4gKi9cbnZhciBnZXRGdWxsRXJyb3JTdGFjayA9IGZ1bmN0aW9uIChlcnIsIHNlZW4pIHtcbiAgaWYgKHNlZW4gJiYgc2Vlbi5oYXMoZXJyKSkge1xuICAgIHJldHVybiB7IG1lc3NhZ2U6ICcnLCBtc2c6ICc8Y2lyY3VsYXI+Jywgc3RhY2s6ICcnIH07XG4gIH1cblxuICB2YXIgbWVzc2FnZTtcblxuICBpZiAodHlwZW9mIGVyci5pbnNwZWN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgbWVzc2FnZSA9IGVyci5pbnNwZWN0KCkgKyAnJztcbiAgfSBlbHNlIGlmIChlcnIubWVzc2FnZSAmJiB0eXBlb2YgZXJyLm1lc3NhZ2UudG9TdHJpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICBtZXNzYWdlID0gZXJyLm1lc3NhZ2UgKyAnJztcbiAgfSBlbHNlIHtcbiAgICBtZXNzYWdlID0gJyc7XG4gIH1cblxuICB2YXIgbXNnO1xuICB2YXIgc3RhY2sgPSBlcnIuc3RhY2sgfHwgbWVzc2FnZTtcbiAgdmFyIGluZGV4ID0gbWVzc2FnZSA/IHN0YWNrLmluZGV4T2YobWVzc2FnZSkgOiAtMTtcblxuICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgbXNnID0gbWVzc2FnZTtcbiAgfSBlbHNlIHtcbiAgICBpbmRleCArPSBtZXNzYWdlLmxlbmd0aDtcbiAgICBtc2cgPSBzdGFjay5zbGljZSgwLCBpbmRleCk7XG4gICAgLy8gcmVtb3ZlIG1zZyBmcm9tIHN0YWNrXG4gICAgc3RhY2sgPSBzdGFjay5zbGljZShpbmRleCArIDEpO1xuXG4gICAgaWYgKGVyci5jYXVzZSkge1xuICAgICAgc2VlbiA9IHNlZW4gfHwgbmV3IFNldCgpO1xuICAgICAgc2Vlbi5hZGQoZXJyKTtcbiAgICAgIGNvbnN0IGNhdXNlU3RhY2sgPSBnZXRGdWxsRXJyb3JTdGFjayhlcnIuY2F1c2UsIHNlZW4pXG4gICAgICBzdGFjayArPSAnXFxuICAgQ2F1c2VkIGJ5OiAnICsgY2F1c2VTdGFjay5tc2cgKyAoY2F1c2VTdGFjay5zdGFjayA/ICdcXG4nICsgY2F1c2VTdGFjay5zdGFjayA6ICcnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1lc3NhZ2UsXG4gICAgbXNnLFxuICAgIHN0YWNrXG4gIH07XG59O1xuXG4vKipcbiAqIE91dHB1dHMgdGhlIGdpdmVuIGBmYWlsdXJlc2AgYXMgYSBsaXN0LlxuICpcbiAqIEBwdWJsaWNcbiAqIEBtZW1iZXJvZiBNb2NoYS5yZXBvcnRlcnMuQmFzZVxuICogQHZhcmlhdGlvbiAxXG4gKiBAcGFyYW0ge09iamVjdFtdfSBmYWlsdXJlcyAtIEVhY2ggaXMgVGVzdCBpbnN0YW5jZSB3aXRoIGNvcnJlc3BvbmRpbmdcbiAqICAgICBFcnJvciBwcm9wZXJ0eVxuICovXG5leHBvcnRzLmxpc3QgPSBmdW5jdGlvbiAoZmFpbHVyZXMpIHtcbiAgdmFyIG11bHRpcGxlRXJyLCBtdWx0aXBsZVRlc3Q7XG4gIEJhc2UuY29uc29sZUxvZygpO1xuICBmYWlsdXJlcy5mb3JFYWNoKGZ1bmN0aW9uICh0ZXN0LCBpKSB7XG4gICAgLy8gZm9ybWF0XG4gICAgdmFyIGZtdCA9XG4gICAgICBjb2xvcignZXJyb3IgdGl0bGUnLCAnICAlcykgJXM6XFxuJykgK1xuICAgICAgY29sb3IoJ2Vycm9yIG1lc3NhZ2UnLCAnICAgICAlcycpICtcbiAgICAgIGNvbG9yKCdlcnJvciBzdGFjaycsICdcXG4lc1xcbicpO1xuXG4gICAgLy8gbXNnXG4gICAgdmFyIGVycjtcbiAgICBpZiAodGVzdC5lcnIgJiYgdGVzdC5lcnIubXVsdGlwbGUpIHtcbiAgICAgIGlmIChtdWx0aXBsZVRlc3QgIT09IHRlc3QpIHtcbiAgICAgICAgbXVsdGlwbGVUZXN0ID0gdGVzdDtcbiAgICAgICAgbXVsdGlwbGVFcnIgPSBbdGVzdC5lcnJdLmNvbmNhdCh0ZXN0LmVyci5tdWx0aXBsZSk7XG4gICAgICB9XG4gICAgICBlcnIgPSBtdWx0aXBsZUVyci5zaGlmdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlcnIgPSB0ZXN0LmVycjtcbiAgICB9XG5cbiAgICB2YXIgeyBtZXNzYWdlLCBtc2csIHN0YWNrIH0gPSBnZXRGdWxsRXJyb3JTdGFjayhlcnIpO1xuXG4gICAgLy8gdW5jYXVnaHRcbiAgICBpZiAoZXJyLnVuY2F1Z2h0KSB7XG4gICAgICBtc2cgPSAnVW5jYXVnaHQgJyArIG1zZztcbiAgICB9XG4gICAgLy8gZXhwbGljaXRseSBzaG93IGRpZmZcbiAgICBpZiAoIWV4cG9ydHMuaGlkZURpZmYgJiYgc2hvd0RpZmYoZXJyKSkge1xuICAgICAgc3RyaW5naWZ5RGlmZk9ianMoZXJyKTtcbiAgICAgIGZtdCA9XG4gICAgICAgIGNvbG9yKCdlcnJvciB0aXRsZScsICcgICVzKSAlczpcXG4lcycpICsgY29sb3IoJ2Vycm9yIHN0YWNrJywgJ1xcbiVzXFxuJyk7XG4gICAgICB2YXIgbWF0Y2ggPSBtZXNzYWdlLm1hdGNoKC9eKFteOl0rKTogZXhwZWN0ZWQvKTtcbiAgICAgIG1zZyA9ICdcXG4gICAgICAnICsgY29sb3IoJ2Vycm9yIG1lc3NhZ2UnLCBtYXRjaCA/IG1hdGNoWzFdIDogbXNnKTtcblxuICAgICAgbXNnICs9IGdlbmVyYXRlRGlmZihlcnIuYWN0dWFsLCBlcnIuZXhwZWN0ZWQpO1xuICAgIH1cblxuICAgIC8vIGluZGVudCBzdGFjayB0cmFjZVxuICAgIHN0YWNrID0gc3RhY2sucmVwbGFjZSgvXi9nbSwgJyAgJyk7XG5cbiAgICAvLyBpbmRlbnRlZCB0ZXN0IHRpdGxlXG4gICAgdmFyIHRlc3RUaXRsZSA9ICcnO1xuICAgIHRlc3QudGl0bGVQYXRoKCkuZm9yRWFjaChmdW5jdGlvbiAoc3RyLCBpbmRleCkge1xuICAgICAgaWYgKGluZGV4ICE9PSAwKSB7XG4gICAgICAgIHRlc3RUaXRsZSArPSAnXFxuICAgICAnO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbmRleDsgaSsrKSB7XG4gICAgICAgIHRlc3RUaXRsZSArPSAnICAnO1xuICAgICAgfVxuICAgICAgdGVzdFRpdGxlICs9IHN0cjtcbiAgICB9KTtcblxuICAgIEJhc2UuY29uc29sZUxvZyhmbXQsIGkgKyAxLCB0ZXN0VGl0bGUsIG1zZywgc3RhY2spO1xuICB9KTtcbn07XG5cbi8qKlxuICogQ29uc3RydWN0cyBhIG5ldyBgQmFzZWAgcmVwb3J0ZXIgaW5zdGFuY2UuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBbGwgb3RoZXIgcmVwb3J0ZXJzIGdlbmVyYWxseSBpbmhlcml0IGZyb20gdGhpcyByZXBvcnRlci5cbiAqXG4gKiBAcHVibGljXG4gKiBAY2xhc3NcbiAqIEBtZW1iZXJvZiBNb2NoYS5yZXBvcnRlcnNcbiAqIEBwYXJhbSB7UnVubmVyfSBydW5uZXIgLSBJbnN0YW5jZSB0cmlnZ2VycyByZXBvcnRlciBhY3Rpb25zLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIHJ1bm5lciBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIEJhc2UocnVubmVyLCBvcHRpb25zKSB7XG4gIHZhciBmYWlsdXJlcyA9ICh0aGlzLmZhaWx1cmVzID0gW10pO1xuXG4gIGlmICghcnVubmVyKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTWlzc2luZyBydW5uZXIgYXJndW1lbnQnKTtcbiAgfVxuICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB0aGlzLnJ1bm5lciA9IHJ1bm5lcjtcbiAgdGhpcy5zdGF0cyA9IHJ1bm5lci5zdGF0czsgLy8gYXNzaWduZWQgc28gUmVwb3J0ZXJzIGtlZXAgYSBjbG9zZXIgcmVmZXJlbmNlXG5cbiAgdmFyIG1heERpZmZTaXplT3B0ID1cbiAgICB0aGlzLm9wdGlvbnMucmVwb3J0ZXJPcHRpb24gJiYgdGhpcy5vcHRpb25zLnJlcG9ydGVyT3B0aW9uLm1heERpZmZTaXplO1xuICBpZiAobWF4RGlmZlNpemVPcHQgIT09IHVuZGVmaW5lZCAmJiAhaXNOYU4oTnVtYmVyKG1heERpZmZTaXplT3B0KSkpIHtcbiAgICBleHBvcnRzLm1heERpZmZTaXplID0gTnVtYmVyKG1heERpZmZTaXplT3B0KTtcbiAgfVxuXG4gIHJ1bm5lci5vbihFVkVOVF9URVNUX1BBU1MsIGZ1bmN0aW9uICh0ZXN0KSB7XG4gICAgaWYgKHRlc3QuZHVyYXRpb24gPiB0ZXN0LnNsb3coKSkge1xuICAgICAgdGVzdC5zcGVlZCA9ICdzbG93JztcbiAgICB9IGVsc2UgaWYgKHRlc3QuZHVyYXRpb24gPiB0ZXN0LnNsb3coKSAvIDIpIHtcbiAgICAgIHRlc3Quc3BlZWQgPSAnbWVkaXVtJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGVzdC5zcGVlZCA9ICdmYXN0JztcbiAgICB9XG4gIH0pO1xuXG4gIHJ1bm5lci5vbihFVkVOVF9URVNUX0ZBSUwsIGZ1bmN0aW9uICh0ZXN0LCBlcnIpIHtcbiAgICBpZiAoc2hvd0RpZmYoZXJyKSkge1xuICAgICAgc3RyaW5naWZ5RGlmZk9ianMoZXJyKTtcbiAgICB9XG4gICAgLy8gbW9yZSB0aGFuIG9uZSBlcnJvciBwZXIgdGVzdFxuICAgIGlmICh0ZXN0LmVyciAmJiBlcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgdGVzdC5lcnIubXVsdGlwbGUgPSAodGVzdC5lcnIubXVsdGlwbGUgfHwgW10pLmNvbmNhdChlcnIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0ZXN0LmVyciA9IGVycjtcbiAgICB9XG4gICAgZmFpbHVyZXMucHVzaCh0ZXN0KTtcbiAgfSk7XG59XG5cbi8qKlxuICogT3V0cHV0cyBjb21tb24gZXBpbG9ndWUgdXNlZCBieSBtYW55IG9mIHRoZSBidW5kbGVkIHJlcG9ydGVycy5cbiAqXG4gKiBAcHVibGljXG4gKiBAbWVtYmVyb2YgTW9jaGEucmVwb3J0ZXJzXG4gKi9cbkJhc2UucHJvdG90eXBlLmVwaWxvZ3VlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdHMgPSB0aGlzLnN0YXRzO1xuICB2YXIgZm10O1xuXG4gIEJhc2UuY29uc29sZUxvZygpO1xuXG4gIC8vIHBhc3Nlc1xuICBmbXQgPVxuICAgIGNvbG9yKCdicmlnaHQgcGFzcycsICcgJykgK1xuICAgIGNvbG9yKCdncmVlbicsICcgJWQgcGFzc2luZycpICtcbiAgICBjb2xvcignbGlnaHQnLCAnICglcyknKTtcblxuICBCYXNlLmNvbnNvbGVMb2coZm10LCBzdGF0cy5wYXNzZXMgfHwgMCwgbWlsbGlzZWNvbmRzKHN0YXRzLmR1cmF0aW9uKSk7XG5cbiAgLy8gcGVuZGluZ1xuICBpZiAoc3RhdHMucGVuZGluZykge1xuICAgIGZtdCA9IGNvbG9yKCdwZW5kaW5nJywgJyAnKSArIGNvbG9yKCdwZW5kaW5nJywgJyAlZCBwZW5kaW5nJyk7XG5cbiAgICBCYXNlLmNvbnNvbGVMb2coZm10LCBzdGF0cy5wZW5kaW5nKTtcbiAgfVxuXG4gIC8vIGZhaWx1cmVzXG4gIGlmIChzdGF0cy5mYWlsdXJlcykge1xuICAgIGZtdCA9IGNvbG9yKCdmYWlsJywgJyAgJWQgZmFpbGluZycpO1xuXG4gICAgQmFzZS5jb25zb2xlTG9nKGZtdCwgc3RhdHMuZmFpbHVyZXMpO1xuXG4gICAgQmFzZS5saXN0KHRoaXMuZmFpbHVyZXMpO1xuICAgIEJhc2UuY29uc29sZUxvZygpO1xuICB9XG5cbiAgQmFzZS5jb25zb2xlTG9nKCk7XG59O1xuXG4vKipcbiAqIFBhZHMgdGhlIGdpdmVuIGBzdHJgIHRvIGBsZW5gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcGFyYW0ge3N0cmluZ30gbGVuXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHBhZChzdHIsIGxlbikge1xuICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgcmV0dXJuIEFycmF5KGxlbiAtIHN0ci5sZW5ndGggKyAxKS5qb2luKCcgJykgKyBzdHI7XG59XG5cbi8qKlxuICogUmV0dXJucyBpbmxpbmUgZGlmZiBiZXR3ZWVuIDIgc3RyaW5ncyB3aXRoIGNvbG91cmVkIEFOU0kgb3V0cHV0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gYWN0dWFsXG4gKiBAcGFyYW0ge1N0cmluZ30gZXhwZWN0ZWRcbiAqIEByZXR1cm4ge3N0cmluZ30gRGlmZlxuICovXG5mdW5jdGlvbiBpbmxpbmVEaWZmKGFjdHVhbCwgZXhwZWN0ZWQpIHtcbiAgdmFyIG1zZyA9IGVycm9yRGlmZihhY3R1YWwsIGV4cGVjdGVkKTtcblxuICAvLyBsaW5lbm9zXG4gIHZhciBsaW5lcyA9IG1zZy5zcGxpdCgnXFxuJyk7XG4gIGlmIChsaW5lcy5sZW5ndGggPiA0KSB7XG4gICAgdmFyIHdpZHRoID0gU3RyaW5nKGxpbmVzLmxlbmd0aCkubGVuZ3RoO1xuICAgIG1zZyA9IGxpbmVzXG4gICAgICAubWFwKGZ1bmN0aW9uIChzdHIsIGkpIHtcbiAgICAgICAgcmV0dXJuIHBhZCgrK2ksIHdpZHRoKSArICcgfCcgKyAnICcgKyBzdHI7XG4gICAgICB9KVxuICAgICAgLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLy8gbGVnZW5kXG4gIG1zZyA9XG4gICAgJ1xcbicgK1xuICAgIGNvbG9yKCdkaWZmIHJlbW92ZWQgaW5saW5lJywgJ2FjdHVhbCcpICtcbiAgICAnICcgK1xuICAgIGNvbG9yKCdkaWZmIGFkZGVkIGlubGluZScsICdleHBlY3RlZCcpICtcbiAgICAnXFxuXFxuJyArXG4gICAgbXNnICtcbiAgICAnXFxuJztcblxuICAvLyBpbmRlbnRcbiAgbXNnID0gbXNnLnJlcGxhY2UoL14vZ20sICcgICAgICAnKTtcbiAgcmV0dXJuIG1zZztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHVuaWZpZWQgZGlmZiBiZXR3ZWVuIHR3byBzdHJpbmdzIHdpdGggY29sb3VyZWQgQU5TSSBvdXRwdXQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBhY3R1YWxcbiAqIEBwYXJhbSB7U3RyaW5nfSBleHBlY3RlZFxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZGlmZi5cbiAqL1xuZnVuY3Rpb24gdW5pZmllZERpZmYoYWN0dWFsLCBleHBlY3RlZCkge1xuICB2YXIgaW5kZW50ID0gJyAgICAgICc7XG4gIGZ1bmN0aW9uIGNsZWFuVXAobGluZSkge1xuICAgIGlmIChsaW5lWzBdID09PSAnKycpIHtcbiAgICAgIHJldHVybiBpbmRlbnQgKyBjb2xvckxpbmVzKCdkaWZmIGFkZGVkJywgbGluZSk7XG4gICAgfVxuICAgIGlmIChsaW5lWzBdID09PSAnLScpIHtcbiAgICAgIHJldHVybiBpbmRlbnQgKyBjb2xvckxpbmVzKCdkaWZmIHJlbW92ZWQnLCBsaW5lKTtcbiAgICB9XG4gICAgaWYgKGxpbmUubWF0Y2goL0BALykpIHtcbiAgICAgIHJldHVybiAnLS0nO1xuICAgIH1cbiAgICBpZiAobGluZS5tYXRjaCgvXFxcXCBObyBuZXdsaW5lLykpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gaW5kZW50ICsgbGluZTtcbiAgfVxuICBmdW5jdGlvbiBub3RCbGFuayhsaW5lKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBsaW5lICE9PSAndW5kZWZpbmVkJyAmJiBsaW5lICE9PSBudWxsO1xuICB9XG4gIHZhciBtc2cgPSBkaWZmLmNyZWF0ZVBhdGNoKCdzdHJpbmcnLCBhY3R1YWwsIGV4cGVjdGVkKTtcbiAgdmFyIGxpbmVzID0gbXNnLnNwbGl0KCdcXG4nKS5zcGxpY2UoNSk7XG4gIHJldHVybiAoXG4gICAgJ1xcbiAgICAgICcgK1xuICAgIGNvbG9yTGluZXMoJ2RpZmYgYWRkZWQnLCAnKyBleHBlY3RlZCcpICtcbiAgICAnICcgK1xuICAgIGNvbG9yTGluZXMoJ2RpZmYgcmVtb3ZlZCcsICctIGFjdHVhbCcpICtcbiAgICAnXFxuXFxuJyArXG4gICAgbGluZXMubWFwKGNsZWFuVXApLmZpbHRlcihub3RCbGFuaykuam9pbignXFxuJylcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGNoYXJhY3RlciBkaWZmIGZvciBgZXJyYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtTdHJpbmd9IGFjdHVhbFxuICogQHBhcmFtIHtTdHJpbmd9IGV4cGVjdGVkXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSBkaWZmXG4gKi9cbmZ1bmN0aW9uIGVycm9yRGlmZihhY3R1YWwsIGV4cGVjdGVkKSB7XG4gIHJldHVybiBkaWZmXG4gICAgLmRpZmZXb3Jkc1dpdGhTcGFjZShhY3R1YWwsIGV4cGVjdGVkKVxuICAgIC5tYXAoZnVuY3Rpb24gKHN0cikge1xuICAgICAgaWYgKHN0ci5hZGRlZCkge1xuICAgICAgICByZXR1cm4gY29sb3JMaW5lcygnZGlmZiBhZGRlZCBpbmxpbmUnLCBzdHIudmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKHN0ci5yZW1vdmVkKSB7XG4gICAgICAgIHJldHVybiBjb2xvckxpbmVzKCdkaWZmIHJlbW92ZWQgaW5saW5lJywgc3RyLnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHIudmFsdWU7XG4gICAgfSlcbiAgICAuam9pbignJyk7XG59XG5cbi8qKlxuICogQ29sb3JzIGxpbmVzIGZvciBgc3RyYCwgdXNpbmcgdGhlIGNvbG9yIGBuYW1lYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gY29sb3JMaW5lcyhuYW1lLCBzdHIpIHtcbiAgcmV0dXJuIHN0clxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAubWFwKGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgIHJldHVybiBjb2xvcihuYW1lLCBzdHIpO1xuICAgIH0pXG4gICAgLmpvaW4oJ1xcbicpO1xufVxuXG4vKipcbiAqIE9iamVjdCN0b1N0cmluZyByZWZlcmVuY2UuXG4gKi9cbnZhciBvYmpUb1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbi8qKlxuICogQ2hlY2tzIHRoYXQgYSAvIGIgaGF2ZSB0aGUgc2FtZSB0eXBlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gYVxuICogQHBhcmFtIHtPYmplY3R9IGJcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIHNhbWVUeXBlKGEsIGIpIHtcbiAgcmV0dXJuIG9ialRvU3RyaW5nLmNhbGwoYSkgPT09IG9ialRvU3RyaW5nLmNhbGwoYik7XG59XG5cbkJhc2UuY29uc29sZUxvZyA9IGNvbnNvbGVMb2c7XG5cbkJhc2UuYWJzdHJhY3QgPSB0cnVlO1xuXG4vKipcbiAqIEFuIG9iamVjdCB3aXRoIGFsbCBzdGFjayB0cmFjZXMgcmVjdXJzaXZlbHkgbW91bnRlZCBmcm9tIGVhY2ggZXJyLmNhdXNlXG4gKiBAbWVtYmVyb2YgbW9kdWxlOmxpYi9yZXBvcnRlcnMvYmFzZVxuICogQHR5cGVkZWYge09iamVjdH0gRnVsbEVycm9yU3RhY2tcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtZXNzYWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbXNnXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RhY2tcbiAqL1xuIiwgIid1c2Ugc3RyaWN0Jztcbi8qKlxuICogQG1vZHVsZSBEb3RcbiAqL1xuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICovXG5cbnZhciBCYXNlID0gcmVxdWlyZSgnLi9iYXNlJyk7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCcuLi91dGlscycpLmluaGVyaXRzO1xudmFyIGNvbnN0YW50cyA9IHJlcXVpcmUoJy4uL3J1bm5lcicpLmNvbnN0YW50cztcbnZhciBFVkVOVF9URVNUX1BBU1MgPSBjb25zdGFudHMuRVZFTlRfVEVTVF9QQVNTO1xudmFyIEVWRU5UX1RFU1RfRkFJTCA9IGNvbnN0YW50cy5FVkVOVF9URVNUX0ZBSUw7XG52YXIgRVZFTlRfUlVOX0JFR0lOID0gY29uc3RhbnRzLkVWRU5UX1JVTl9CRUdJTjtcbnZhciBFVkVOVF9URVNUX1BFTkRJTkcgPSBjb25zdGFudHMuRVZFTlRfVEVTVF9QRU5ESU5HO1xudmFyIEVWRU5UX1JVTl9FTkQgPSBjb25zdGFudHMuRVZFTlRfUlVOX0VORDtcblxuLyoqXG4gKiBFeHBvc2UgYERvdGAuXG4gKi9cblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gRG90O1xuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBuZXcgYERvdGAgcmVwb3J0ZXIgaW5zdGFuY2UuXG4gKlxuICogQHB1YmxpY1xuICogQGNsYXNzXG4gKiBAbWVtYmVyb2YgTW9jaGEucmVwb3J0ZXJzXG4gKiBAZXh0ZW5kcyBNb2NoYS5yZXBvcnRlcnMuQmFzZVxuICogQHBhcmFtIHtSdW5uZXJ9IHJ1bm5lciAtIEluc3RhbmNlIHRyaWdnZXJzIHJlcG9ydGVyIGFjdGlvbnMuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gcnVubmVyIG9wdGlvbnNcbiAqL1xuZnVuY3Rpb24gRG90KHJ1bm5lciwgb3B0aW9ucykge1xuICBCYXNlLmNhbGwodGhpcywgcnVubmVyLCBvcHRpb25zKTtcblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciB3aWR0aCA9IChCYXNlLndpbmRvdy53aWR0aCAqIDAuNzUpIHwgMDtcbiAgdmFyIG4gPSAtMTtcblxuICBydW5uZXIub24oRVZFTlRfUlVOX0JFR0lOLCBmdW5jdGlvbiAoKSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICB9KTtcblxuICBydW5uZXIub24oRVZFTlRfVEVTVF9QRU5ESU5HLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCsrbiAlIHdpZHRoID09PSAwKSB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuICAnKTtcbiAgICB9XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoQmFzZS5jb2xvcigncGVuZGluZycsIEJhc2Uuc3ltYm9scy5jb21tYSkpO1xuICB9KTtcblxuICBydW5uZXIub24oRVZFTlRfVEVTVF9QQVNTLCBmdW5jdGlvbiAodGVzdCkge1xuICAgIGlmICgrK24gJSB3aWR0aCA9PT0gMCkge1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbiAgJyk7XG4gICAgfVxuICAgIGlmICh0ZXN0LnNwZWVkID09PSAnc2xvdycpIHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKEJhc2UuY29sb3IoJ2JyaWdodCB5ZWxsb3cnLCBCYXNlLnN5bWJvbHMuZG90KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKEJhc2UuY29sb3IodGVzdC5zcGVlZCwgQmFzZS5zeW1ib2xzLmRvdCkpO1xuICAgIH1cbiAgfSk7XG5cbiAgcnVubmVyLm9uKEVWRU5UX1RFU1RfRkFJTCwgZnVuY3Rpb24gKCkge1xuICAgIGlmICgrK24gJSB3aWR0aCA9PT0gMCkge1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbiAgJyk7XG4gICAgfVxuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKEJhc2UuY29sb3IoJ2ZhaWwnLCBCYXNlLnN5bWJvbHMuYmFuZykpO1xuICB9KTtcblxuICBydW5uZXIub25jZShFVkVOVF9SVU5fRU5ELCBmdW5jdGlvbiAoKSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICAgIHNlbGYuZXBpbG9ndWUoKTtcbiAgfSk7XG59XG5cbi8qKlxuICogSW5oZXJpdCBmcm9tIGBCYXNlLnByb3RvdHlwZWAuXG4gKi9cbmluaGVyaXRzKERvdCwgQmFzZSk7XG5cbkRvdC5kZXNjcmlwdGlvbiA9ICdkb3QgbWF0cml4IHJlcHJlc2VudGF0aW9uJztcbiIsICIndXNlIHN0cmljdCc7XG4vKipcbiAqIEBtb2R1bGUgRG9jXG4gKi9cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgQmFzZSA9IHJlcXVpcmUoJy4vYmFzZScpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBjb25zdGFudHMgPSByZXF1aXJlKCcuLi9ydW5uZXInKS5jb25zdGFudHM7XG52YXIgRVZFTlRfVEVTVF9QQVNTID0gY29uc3RhbnRzLkVWRU5UX1RFU1RfUEFTUztcbnZhciBFVkVOVF9URVNUX0ZBSUwgPSBjb25zdGFudHMuRVZFTlRfVEVTVF9GQUlMO1xudmFyIEVWRU5UX1NVSVRFX0JFR0lOID0gY29uc3RhbnRzLkVWRU5UX1NVSVRFX0JFR0lOO1xudmFyIEVWRU5UX1NVSVRFX0VORCA9IGNvbnN0YW50cy5FVkVOVF9TVUlURV9FTkQ7XG5cbi8qKlxuICogRXhwb3NlIGBEb2NgLlxuICovXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IERvYztcblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgbmV3IGBEb2NgIHJlcG9ydGVyIGluc3RhbmNlLlxuICpcbiAqIEBwdWJsaWNcbiAqIEBjbGFzc1xuICogQG1lbWJlcm9mIE1vY2hhLnJlcG9ydGVyc1xuICogQGV4dGVuZHMgTW9jaGEucmVwb3J0ZXJzLkJhc2VcbiAqIEBwYXJhbSB7UnVubmVyfSBydW5uZXIgLSBJbnN0YW5jZSB0cmlnZ2VycyByZXBvcnRlciBhY3Rpb25zLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIHJ1bm5lciBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIERvYyhydW5uZXIsIG9wdGlvbnMpIHtcbiAgQmFzZS5jYWxsKHRoaXMsIHJ1bm5lciwgb3B0aW9ucyk7XG5cbiAgdmFyIGluZGVudHMgPSAyO1xuXG4gIGZ1bmN0aW9uIGluZGVudCgpIHtcbiAgICByZXR1cm4gQXJyYXkoaW5kZW50cykuam9pbignICAnKTtcbiAgfVxuXG4gIHJ1bm5lci5vbihFVkVOVF9TVUlURV9CRUdJTiwgZnVuY3Rpb24gKHN1aXRlKSB7XG4gICAgaWYgKHN1aXRlLnJvb3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgKytpbmRlbnRzO1xuICAgIEJhc2UuY29uc29sZUxvZygnJXM8c2VjdGlvbiBjbGFzcz1cInN1aXRlXCI+JywgaW5kZW50KCkpO1xuICAgICsraW5kZW50cztcbiAgICBCYXNlLmNvbnNvbGVMb2coJyVzPGgxPiVzPC9oMT4nLCBpbmRlbnQoKSwgdXRpbHMuZXNjYXBlKHN1aXRlLnRpdGxlKSk7XG4gICAgQmFzZS5jb25zb2xlTG9nKCclczxkbD4nLCBpbmRlbnQoKSk7XG4gIH0pO1xuXG4gIHJ1bm5lci5vbihFVkVOVF9TVUlURV9FTkQsIGZ1bmN0aW9uIChzdWl0ZSkge1xuICAgIGlmIChzdWl0ZS5yb290KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIEJhc2UuY29uc29sZUxvZygnJXM8L2RsPicsIGluZGVudCgpKTtcbiAgICAtLWluZGVudHM7XG4gICAgQmFzZS5jb25zb2xlTG9nKCclczwvc2VjdGlvbj4nLCBpbmRlbnQoKSk7XG4gICAgLS1pbmRlbnRzO1xuICB9KTtcblxuICBydW5uZXIub24oRVZFTlRfVEVTVF9QQVNTLCBmdW5jdGlvbiAodGVzdCkge1xuICAgIEJhc2UuY29uc29sZUxvZygnJXMgIDxkdD4lczwvZHQ+JywgaW5kZW50KCksIHV0aWxzLmVzY2FwZSh0ZXN0LnRpdGxlKSk7XG4gICAgQmFzZS5jb25zb2xlTG9nKCclcyAgPGR0PiVzPC9kdD4nLCBpbmRlbnQoKSwgdXRpbHMuZXNjYXBlKHRlc3QuZmlsZSkpO1xuICAgIHZhciBjb2RlID0gdXRpbHMuZXNjYXBlKHV0aWxzLmNsZWFuKHRlc3QuYm9keSkpO1xuICAgIEJhc2UuY29uc29sZUxvZygnJXMgIDxkZD48cHJlPjxjb2RlPiVzPC9jb2RlPjwvcHJlPjwvZGQ+JywgaW5kZW50KCksIGNvZGUpO1xuICB9KTtcblxuICBydW5uZXIub24oRVZFTlRfVEVTVF9GQUlMLCBmdW5jdGlvbiAodGVzdCwgZXJyKSB7XG4gICAgQmFzZS5jb25zb2xlTG9nKFxuICAgICAgJyVzICA8ZHQgY2xhc3M9XCJlcnJvclwiPiVzPC9kdD4nLFxuICAgICAgaW5kZW50KCksXG4gICAgICB1dGlscy5lc2NhcGUodGVzdC50aXRsZSlcbiAgICApO1xuICAgIEJhc2UuY29uc29sZUxvZyhcbiAgICAgICclcyAgPGR0IGNsYXNzPVwiZXJyb3JcIj4lczwvZHQ+JyxcbiAgICAgIGluZGVudCgpLFxuICAgICAgdXRpbHMuZXNjYXBlKHRlc3QuZmlsZSlcbiAgICApO1xuICAgIHZhciBjb2RlID0gdXRpbHMuZXNjYXBlKHV0aWxzLmNsZWFuKHRlc3QuYm9keSkpO1xuICAgIEJhc2UuY29uc29sZUxvZyhcbiAgICAgICclcyAgPGRkIGNsYXNzPVwiZXJyb3JcIj48cHJlPjxjb2RlPiVzPC9jb2RlPjwvcHJlPjwvZGQ+JyxcbiAgICAgIGluZGVudCgpLFxuICAgICAgY29kZVxuICAgICk7XG4gICAgQmFzZS5jb25zb2xlTG9nKFxuICAgICAgJyVzICA8ZGQgY2xhc3M9XCJlcnJvclwiPiVzPC9kZD4nLFxuICAgICAgaW5kZW50KCksXG4gICAgICB1dGlscy5lc2NhcGUoZXJyKVxuICAgICk7XG4gIH0pO1xufVxuXG5Eb2MuZGVzY3JpcHRpb24gPSAnSFRNTCBkb2N1bWVudGF0aW9uJztcbiIsICIndXNlIHN0cmljdCc7XG4vKipcbiAqIEBtb2R1bGUgVEFQXG4gKi9cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJ25vZGU6dXRpbCcpO1xudmFyIEJhc2UgPSByZXF1aXJlKCcuL2Jhc2UnKTtcbnZhciBjb25zdGFudHMgPSByZXF1aXJlKCcuLi9ydW5uZXInKS5jb25zdGFudHM7XG52YXIgRVZFTlRfVEVTVF9QQVNTID0gY29uc3RhbnRzLkVWRU5UX1RFU1RfUEFTUztcbnZhciBFVkVOVF9URVNUX0ZBSUwgPSBjb25zdGFudHMuRVZFTlRfVEVTVF9GQUlMO1xudmFyIEVWRU5UX1JVTl9CRUdJTiA9IGNvbnN0YW50cy5FVkVOVF9SVU5fQkVHSU47XG52YXIgRVZFTlRfUlVOX0VORCA9IGNvbnN0YW50cy5FVkVOVF9SVU5fRU5EO1xudmFyIEVWRU5UX1RFU1RfUEVORElORyA9IGNvbnN0YW50cy5FVkVOVF9URVNUX1BFTkRJTkc7XG52YXIgRVZFTlRfVEVTVF9FTkQgPSBjb25zdGFudHMuRVZFTlRfVEVTVF9FTkQ7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCcuLi91dGlscycpLmluaGVyaXRzO1xudmFyIHNwcmludGYgPSB1dGlsLmZvcm1hdDtcblxuLyoqXG4gKiBFeHBvc2UgYFRBUGAuXG4gKi9cblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gVEFQO1xuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBuZXcgYFRBUGAgcmVwb3J0ZXIgaW5zdGFuY2UuXG4gKlxuICogQHB1YmxpY1xuICogQGNsYXNzXG4gKiBAbWVtYmVyb2YgTW9jaGEucmVwb3J0ZXJzXG4gKiBAZXh0ZW5kcyBNb2NoYS5yZXBvcnRlcnMuQmFzZVxuICogQHBhcmFtIHtSdW5uZXJ9IHJ1bm5lciAtIEluc3RhbmNlIHRyaWdnZXJzIHJlcG9ydGVyIGFjdGlvbnMuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gcnVubmVyIG9wdGlvbnNcbiAqL1xuZnVuY3Rpb24gVEFQKHJ1bm5lciwgb3B0aW9ucykge1xuICBCYXNlLmNhbGwodGhpcywgcnVubmVyLCBvcHRpb25zKTtcblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBuID0gMTtcblxuICB2YXIgdGFwVmVyc2lvbiA9ICcxMic7XG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMucmVwb3J0ZXJPcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMucmVwb3J0ZXJPcHRpb25zLnRhcFZlcnNpb24pIHtcbiAgICAgIHRhcFZlcnNpb24gPSBvcHRpb25zLnJlcG9ydGVyT3B0aW9ucy50YXBWZXJzaW9uLnRvU3RyaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgdGhpcy5fcHJvZHVjZXIgPSBjcmVhdGVQcm9kdWNlcih0YXBWZXJzaW9uKTtcblxuICBydW5uZXIub25jZShFVkVOVF9SVU5fQkVHSU4sIGZ1bmN0aW9uICgpIHtcbiAgICBzZWxmLl9wcm9kdWNlci53cml0ZVZlcnNpb24oKTtcbiAgfSk7XG5cbiAgcnVubmVyLm9uKEVWRU5UX1RFU1RfRU5ELCBmdW5jdGlvbiAoKSB7XG4gICAgKytuO1xuICB9KTtcblxuICBydW5uZXIub24oRVZFTlRfVEVTVF9QRU5ESU5HLCBmdW5jdGlvbiAodGVzdCkge1xuICAgIHNlbGYuX3Byb2R1Y2VyLndyaXRlUGVuZGluZyhuLCB0ZXN0KTtcbiAgfSk7XG5cbiAgcnVubmVyLm9uKEVWRU5UX1RFU1RfUEFTUywgZnVuY3Rpb24gKHRlc3QpIHtcbiAgICBzZWxmLl9wcm9kdWNlci53cml0ZVBhc3MobiwgdGVzdCk7XG4gIH0pO1xuXG4gIHJ1bm5lci5vbihFVkVOVF9URVNUX0ZBSUwsIGZ1bmN0aW9uICh0ZXN0LCBlcnIpIHtcbiAgICBzZWxmLl9wcm9kdWNlci53cml0ZUZhaWwobiwgdGVzdCwgZXJyKTtcbiAgfSk7XG5cbiAgcnVubmVyLm9uY2UoRVZFTlRfUlVOX0VORCwgZnVuY3Rpb24gKCkge1xuICAgIHNlbGYuX3Byb2R1Y2VyLndyaXRlRXBpbG9ndWUocnVubmVyLnN0YXRzKTtcbiAgfSk7XG59XG5cbi8qKlxuICogSW5oZXJpdCBmcm9tIGBCYXNlLnByb3RvdHlwZWAuXG4gKi9cbmluaGVyaXRzKFRBUCwgQmFzZSk7XG5cbi8qKlxuICogUmV0dXJucyBhIFRBUC1zYWZlIHRpdGxlIG9mIGB0ZXN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtUZXN0fSB0ZXN0IC0gVGVzdCBpbnN0YW5jZS5cbiAqIEByZXR1cm4ge1N0cmluZ30gdGl0bGUgd2l0aCBhbnkgaGFzaCBjaGFyYWN0ZXIgcmVtb3ZlZFxuICovXG5mdW5jdGlvbiB0aXRsZSh0ZXN0KSB7XG4gIHJldHVybiB0ZXN0LmZ1bGxUaXRsZSgpLnJlcGxhY2UoLyMvZywgJycpO1xufVxuXG4vKipcbiAqIFdyaXRlcyBuZXdsaW5lLXRlcm1pbmF0ZWQgZm9ybWF0dGVkIHN0cmluZyB0byByZXBvcnRlciBvdXRwdXQgc3RyZWFtLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0IC0gYHByaW50ZmAtbGlrZSBmb3JtYXQgc3RyaW5nXG4gKiBAcGFyYW0gey4uLip9IFt2YXJBcmdzXSAtIEZvcm1hdCBzdHJpbmcgYXJndW1lbnRzXG4gKi9cbmZ1bmN0aW9uIHByaW50bG4oZm9ybWF0LCB2YXJBcmdzKSB7XG4gIHZhciB2YXJncyA9IEFycmF5LmZyb20oYXJndW1lbnRzKTtcbiAgdmFyZ3NbMF0gKz0gJ1xcbic7XG4gIHByb2Nlc3Muc3Rkb3V0LndyaXRlKHNwcmludGYuYXBwbHkobnVsbCwgdmFyZ3MpKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgYHRhcFZlcnNpb25gLWFwcHJvcHJpYXRlIFRBUCBwcm9kdWNlciBpbnN0YW5jZSwgaWYgcG9zc2libGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YXBWZXJzaW9uIC0gVmVyc2lvbiBvZiBUQVAgc3BlY2lmaWNhdGlvbiB0byBwcm9kdWNlLlxuICogQHJldHVybnMge1RBUFByb2R1Y2VyfSBzcGVjaWZpY2F0aW9uLWFwcHJvcHJpYXRlIGluc3RhbmNlXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGhhcyBubyBhc3NvY2lhdGVkIHByb2R1Y2VyLlxuICovXG5mdW5jdGlvbiBjcmVhdGVQcm9kdWNlcih0YXBWZXJzaW9uKSB7XG4gIHZhciBwcm9kdWNlcnMgPSB7XG4gICAgMTI6IG5ldyBUQVAxMlByb2R1Y2VyKCksXG4gICAgMTM6IG5ldyBUQVAxM1Byb2R1Y2VyKClcbiAgfTtcbiAgdmFyIHByb2R1Y2VyID0gcHJvZHVjZXJzW3RhcFZlcnNpb25dO1xuXG4gIGlmICghcHJvZHVjZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnaW52YWxpZCBvciB1bnN1cHBvcnRlZCBUQVAgdmVyc2lvbjogJyArIEpTT04uc3RyaW5naWZ5KHRhcFZlcnNpb24pXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBwcm9kdWNlcjtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeVxuICogQ29uc3RydWN0cyBhIG5ldyBUQVBQcm9kdWNlci5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIDxlbT5Pbmx5PC9lbT4gdG8gYmUgdXNlZCBhcyBhbiBhYnN0cmFjdCBiYXNlIGNsYXNzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gVEFQUHJvZHVjZXIoKSB7fVxuXG4vKipcbiAqIFdyaXRlcyB0aGUgVEFQIHZlcnNpb24gdG8gcmVwb3J0ZXIgb3V0cHV0IHN0cmVhbS5cbiAqXG4gKiBAYWJzdHJhY3RcbiAqL1xuVEFQUHJvZHVjZXIucHJvdG90eXBlLndyaXRlVmVyc2lvbiA9IGZ1bmN0aW9uICgpIHt9O1xuXG4vKipcbiAqIFdyaXRlcyB0aGUgcGxhbiB0byByZXBvcnRlciBvdXRwdXQgc3RyZWFtLlxuICpcbiAqIEBhYnN0cmFjdFxuICogQHBhcmFtIHtudW1iZXJ9IG50ZXN0cyAtIE51bWJlciBvZiB0ZXN0cyB0aGF0IGFyZSBwbGFubmVkIHRvIHJ1bi5cbiAqL1xuVEFQUHJvZHVjZXIucHJvdG90eXBlLndyaXRlUGxhbiA9IGZ1bmN0aW9uIChudGVzdHMpIHtcbiAgcHJpbnRsbignJWQuLiVkJywgMSwgbnRlc3RzKTtcbn07XG5cbi8qKlxuICogV3JpdGVzIHRoYXQgdGVzdCBwYXNzZWQgdG8gcmVwb3J0ZXIgb3V0cHV0IHN0cmVhbS5cbiAqXG4gKiBAYWJzdHJhY3RcbiAqIEBwYXJhbSB7bnVtYmVyfSBuIC0gSW5kZXggb2YgdGVzdCB0aGF0IHBhc3NlZC5cbiAqIEBwYXJhbSB7VGVzdH0gdGVzdCAtIEluc3RhbmNlIGNvbnRhaW5pbmcgdGVzdCBpbmZvcm1hdGlvbi5cbiAqL1xuVEFQUHJvZHVjZXIucHJvdG90eXBlLndyaXRlUGFzcyA9IGZ1bmN0aW9uIChuLCB0ZXN0KSB7XG4gIHByaW50bG4oJ29rICVkICVzJywgbiwgdGl0bGUodGVzdCkpO1xufTtcblxuLyoqXG4gKiBXcml0ZXMgdGhhdCB0ZXN0IHdhcyBza2lwcGVkIHRvIHJlcG9ydGVyIG91dHB1dCBzdHJlYW0uXG4gKlxuICogQGFic3RyYWN0XG4gKiBAcGFyYW0ge251bWJlcn0gbiAtIEluZGV4IG9mIHRlc3QgdGhhdCB3YXMgc2tpcHBlZC5cbiAqIEBwYXJhbSB7VGVzdH0gdGVzdCAtIEluc3RhbmNlIGNvbnRhaW5pbmcgdGVzdCBpbmZvcm1hdGlvbi5cbiAqL1xuVEFQUHJvZHVjZXIucHJvdG90eXBlLndyaXRlUGVuZGluZyA9IGZ1bmN0aW9uIChuLCB0ZXN0KSB7XG4gIHByaW50bG4oJ29rICVkICVzICMgU0tJUCAtJywgbiwgdGl0bGUodGVzdCkpO1xufTtcblxuLyoqXG4gKiBXcml0ZXMgdGhhdCB0ZXN0IGZhaWxlZCB0byByZXBvcnRlciBvdXRwdXQgc3RyZWFtLlxuICpcbiAqIEBhYnN0cmFjdFxuICogQHBhcmFtIHtudW1iZXJ9IG4gLSBJbmRleCBvZiB0ZXN0IHRoYXQgZmFpbGVkLlxuICogQHBhcmFtIHtUZXN0fSB0ZXN0IC0gSW5zdGFuY2UgY29udGFpbmluZyB0ZXN0IGluZm9ybWF0aW9uLlxuICogQHBhcmFtIHtFcnJvcn0gZXJyIC0gUmVhc29uIHRoZSB0ZXN0IGZhaWxlZC5cbiAqL1xuVEFQUHJvZHVjZXIucHJvdG90eXBlLndyaXRlRmFpbCA9IGZ1bmN0aW9uIChuLCB0ZXN0LCBlcnIpIHtcbiAgcHJpbnRsbignbm90IG9rICVkICVzJywgbiwgdGl0bGUodGVzdCkpO1xufTtcblxuLyoqXG4gKiBXcml0ZXMgdGhlIHN1bW1hcnkgZXBpbG9ndWUgdG8gcmVwb3J0ZXIgb3V0cHV0IHN0cmVhbS5cbiAqXG4gKiBAYWJzdHJhY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0cyAtIE9iamVjdCBjb250YWluaW5nIHJ1biBzdGF0aXN0aWNzLlxuICovXG5UQVBQcm9kdWNlci5wcm90b3R5cGUud3JpdGVFcGlsb2d1ZSA9IGZ1bmN0aW9uIChzdGF0cykge1xuICAvLyA6VEJEOiBXaHkgaXMgdGhpcyBub3QgY291bnRpbmcgcGVuZGluZyB0ZXN0cz9cbiAgcHJpbnRsbignIyB0ZXN0cyAnICsgKHN0YXRzLnBhc3NlcyArIHN0YXRzLmZhaWx1cmVzKSk7XG4gIHByaW50bG4oJyMgcGFzcyAnICsgc3RhdHMucGFzc2VzKTtcbiAgLy8gOlRCRDogV2h5IGFyZSB3ZSBub3Qgc2hvd2luZyBwZW5kaW5nIHJlc3VsdHM/XG4gIHByaW50bG4oJyMgZmFpbCAnICsgc3RhdHMuZmFpbHVyZXMpO1xuICB0aGlzLndyaXRlUGxhbihzdGF0cy5wYXNzZXMgKyBzdGF0cy5mYWlsdXJlcyArIHN0YXRzLnBlbmRpbmcpO1xufTtcblxuLyoqXG4gKiBAc3VtbWFyeVxuICogQ29uc3RydWN0cyBhIG5ldyBUQVAxMlByb2R1Y2VyLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUHJvZHVjZXMgb3V0cHV0IGNvbmZvcm1pbmcgdG8gdGhlIFRBUDEyIHNwZWNpZmljYXRpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgVEFQUHJvZHVjZXJcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vdGVzdGFueXRoaW5nLm9yZy90YXAtc3BlY2lmaWNhdGlvbi5odG1sfFNwZWNpZmljYXRpb259XG4gKi9cbmZ1bmN0aW9uIFRBUDEyUHJvZHVjZXIoKSB7XG4gIC8qKlxuICAgKiBXcml0ZXMgdGhhdCB0ZXN0IGZhaWxlZCB0byByZXBvcnRlciBvdXRwdXQgc3RyZWFtLCB3aXRoIGVycm9yIGZvcm1hdHRpbmcuXG4gICAqIEBvdmVycmlkZVxuICAgKi9cbiAgdGhpcy53cml0ZUZhaWwgPSBmdW5jdGlvbiAobiwgdGVzdCwgZXJyKSB7XG4gICAgVEFQUHJvZHVjZXIucHJvdG90eXBlLndyaXRlRmFpbC5jYWxsKHRoaXMsIG4sIHRlc3QsIGVycik7XG4gICAgaWYgKGVyci5tZXNzYWdlKSB7XG4gICAgICBwcmludGxuKGVyci5tZXNzYWdlLnJlcGxhY2UoL14vZ20sICcgICcpKTtcbiAgICB9XG4gICAgaWYgKGVyci5zdGFjaykge1xuICAgICAgcHJpbnRsbihlcnIuc3RhY2sucmVwbGFjZSgvXi9nbSwgJyAgJykpO1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBJbmhlcml0IGZyb20gYFRBUFByb2R1Y2VyLnByb3RvdHlwZWAuXG4gKi9cbmluaGVyaXRzKFRBUDEyUHJvZHVjZXIsIFRBUFByb2R1Y2VyKTtcblxuLyoqXG4gKiBAc3VtbWFyeVxuICogQ29uc3RydWN0cyBhIG5ldyBUQVAxM1Byb2R1Y2VyLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUHJvZHVjZXMgb3V0cHV0IGNvbmZvcm1pbmcgdG8gdGhlIFRBUDEzIHNwZWNpZmljYXRpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgVEFQUHJvZHVjZXJcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vdGVzdGFueXRoaW5nLm9yZy90YXAtdmVyc2lvbi0xMy1zcGVjaWZpY2F0aW9uLmh0bWx8U3BlY2lmaWNhdGlvbn1cbiAqL1xuZnVuY3Rpb24gVEFQMTNQcm9kdWNlcigpIHtcbiAgLyoqXG4gICAqIFdyaXRlcyB0aGUgVEFQIHZlcnNpb24gdG8gcmVwb3J0ZXIgb3V0cHV0IHN0cmVhbS5cbiAgICogQG92ZXJyaWRlXG4gICAqL1xuICB0aGlzLndyaXRlVmVyc2lvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICBwcmludGxuKCdUQVAgdmVyc2lvbiAxMycpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBXcml0ZXMgdGhhdCB0ZXN0IGZhaWxlZCB0byByZXBvcnRlciBvdXRwdXQgc3RyZWFtLCB3aXRoIGVycm9yIGZvcm1hdHRpbmcuXG4gICAqIEBvdmVycmlkZVxuICAgKi9cbiAgdGhpcy53cml0ZUZhaWwgPSBmdW5jdGlvbiAobiwgdGVzdCwgZXJyKSB7XG4gICAgVEFQUHJvZHVjZXIucHJvdG90eXBlLndyaXRlRmFpbC5jYWxsKHRoaXMsIG4sIHRlc3QsIGVycik7XG4gICAgdmFyIGVtaXRZYW1sQmxvY2sgPSBlcnIubWVzc2FnZSAhPSBudWxsIHx8IGVyci5zdGFjayAhPSBudWxsO1xuICAgIGlmIChlbWl0WWFtbEJsb2NrKSB7XG4gICAgICBwcmludGxuKGluZGVudCgxKSArICctLS0nKTtcbiAgICAgIGlmIChlcnIubWVzc2FnZSkge1xuICAgICAgICBwcmludGxuKGluZGVudCgyKSArICdtZXNzYWdlOiB8LScpO1xuICAgICAgICBwcmludGxuKGVyci5tZXNzYWdlLnJlcGxhY2UoL14vZ20sIGluZGVudCgzKSkpO1xuICAgICAgfVxuICAgICAgaWYgKGVyci5zdGFjaykge1xuICAgICAgICBwcmludGxuKGluZGVudCgyKSArICdzdGFjazogfC0nKTtcbiAgICAgICAgcHJpbnRsbihlcnIuc3RhY2sucmVwbGFjZSgvXi9nbSwgaW5kZW50KDMpKSk7XG4gICAgICB9XG4gICAgICBwcmludGxuKGluZGVudCgxKSArICcuLi4nKTtcbiAgICB9XG4gIH07XG5cbiAgZnVuY3Rpb24gaW5kZW50KGxldmVsKSB7XG4gICAgcmV0dXJuIEFycmF5KGxldmVsICsgMSkuam9pbignICAnKTtcbiAgfVxufVxuXG4vKipcbiAqIEluaGVyaXQgZnJvbSBgVEFQUHJvZHVjZXIucHJvdG90eXBlYC5cbiAqL1xuaW5oZXJpdHMoVEFQMTNQcm9kdWNlciwgVEFQUHJvZHVjZXIpO1xuXG5UQVAuZGVzY3JpcHRpb24gPSAnVEFQLWNvbXBhdGlibGUgb3V0cHV0JztcbiIsICIndXNlIHN0cmljdCc7XG4vKipcbiAqIEBtb2R1bGUgSlNPTlxuICovXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIEJhc2UgPSByZXF1aXJlKCcuL2Jhc2UnKTtcbnZhciBmcyA9IHJlcXVpcmUoJ25vZGU6ZnMnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnbm9kZTpwYXRoJyk7XG5jb25zdCBjcmVhdGVVbnN1cHBvcnRlZEVycm9yID0gcmVxdWlyZSgnLi4vZXJyb3JzJykuY3JlYXRlVW5zdXBwb3J0ZWRFcnJvcjtcbmNvbnN0IHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBjb25zdGFudHMgPSByZXF1aXJlKCcuLi9ydW5uZXInKS5jb25zdGFudHM7XG52YXIgRVZFTlRfVEVTVF9QQVNTID0gY29uc3RhbnRzLkVWRU5UX1RFU1RfUEFTUztcbnZhciBFVkVOVF9URVNUX1BFTkRJTkcgPSBjb25zdGFudHMuRVZFTlRfVEVTVF9QRU5ESU5HO1xudmFyIEVWRU5UX1RFU1RfRkFJTCA9IGNvbnN0YW50cy5FVkVOVF9URVNUX0ZBSUw7XG52YXIgRVZFTlRfVEVTVF9FTkQgPSBjb25zdGFudHMuRVZFTlRfVEVTVF9FTkQ7XG52YXIgRVZFTlRfUlVOX0VORCA9IGNvbnN0YW50cy5FVkVOVF9SVU5fRU5EO1xuXG4vKipcbiAqIEV4cG9zZSBgSlNPTmAuXG4gKi9cblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gSlNPTlJlcG9ydGVyO1xuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBuZXcgYEpTT05gIHJlcG9ydGVyIGluc3RhbmNlLlxuICpcbiAqIEBwdWJsaWNcbiAqIEBjbGFzcyBKU09OXG4gKiBAbWVtYmVyb2YgTW9jaGEucmVwb3J0ZXJzXG4gKiBAZXh0ZW5kcyBNb2NoYS5yZXBvcnRlcnMuQmFzZVxuICogQHBhcmFtIHtSdW5uZXJ9IHJ1bm5lciAtIEluc3RhbmNlIHRyaWdnZXJzIHJlcG9ydGVyIGFjdGlvbnMuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gcnVubmVyIG9wdGlvbnNcbiAqL1xuZnVuY3Rpb24gSlNPTlJlcG9ydGVyKHJ1bm5lciwgb3B0aW9ucyA9IHt9KSB7XG4gIEJhc2UuY2FsbCh0aGlzLCBydW5uZXIsIG9wdGlvbnMpO1xuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHRlc3RzID0gW107XG4gIHZhciBwZW5kaW5nID0gW107XG4gIHZhciBmYWlsdXJlcyA9IFtdO1xuICB2YXIgcGFzc2VzID0gW107XG4gIHZhciBvdXRwdXQ7XG5cbiAgaWYgKG9wdGlvbnMucmVwb3J0ZXJPcHRpb24gJiYgb3B0aW9ucy5yZXBvcnRlck9wdGlvbi5vdXRwdXQpIHtcbiAgICBpZiAodXRpbHMuaXNCcm93c2VyKCkpIHtcbiAgICAgIHRocm93IGNyZWF0ZVVuc3VwcG9ydGVkRXJyb3IoJ2ZpbGUgb3V0cHV0IG5vdCBzdXBwb3J0ZWQgaW4gYnJvd3NlcicpO1xuICAgIH1cbiAgICBvdXRwdXQgPSBvcHRpb25zLnJlcG9ydGVyT3B0aW9uLm91dHB1dDtcbiAgfVxuXG4gIHJ1bm5lci5vbihFVkVOVF9URVNUX0VORCwgZnVuY3Rpb24gKHRlc3QpIHtcbiAgICB0ZXN0cy5wdXNoKHRlc3QpO1xuICB9KTtcblxuICBydW5uZXIub24oRVZFTlRfVEVTVF9QQVNTLCBmdW5jdGlvbiAodGVzdCkge1xuICAgIHBhc3Nlcy5wdXNoKHRlc3QpO1xuICB9KTtcblxuICBydW5uZXIub24oRVZFTlRfVEVTVF9GQUlMLCBmdW5jdGlvbiAodGVzdCkge1xuICAgIGZhaWx1cmVzLnB1c2godGVzdCk7XG4gIH0pO1xuXG4gIHJ1bm5lci5vbihFVkVOVF9URVNUX1BFTkRJTkcsIGZ1bmN0aW9uICh0ZXN0KSB7XG4gICAgcGVuZGluZy5wdXNoKHRlc3QpO1xuICB9KTtcblxuICBydW5uZXIub25jZShFVkVOVF9SVU5fRU5ELCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG9iaiA9IHtcbiAgICAgIHN0YXRzOiBzZWxmLnN0YXRzLFxuICAgICAgdGVzdHM6IHRlc3RzLm1hcChjbGVhbiksXG4gICAgICBwZW5kaW5nOiBwZW5kaW5nLm1hcChjbGVhbiksXG4gICAgICBmYWlsdXJlczogZmFpbHVyZXMubWFwKGNsZWFuKSxcbiAgICAgIHBhc3NlczogcGFzc2VzLm1hcChjbGVhbilcbiAgICB9O1xuXG4gICAgcnVubmVyLnRlc3RSZXN1bHRzID0gb2JqO1xuXG4gICAgdmFyIGpzb24gPSBKU09OLnN0cmluZ2lmeShvYmosIG51bGwsIDIpO1xuICAgIGlmIChvdXRwdXQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZzLm1rZGlyU3luYyhwYXRoLmRpcm5hbWUob3V0cHV0KSwge3JlY3Vyc2l2ZTogdHJ1ZX0pO1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKG91dHB1dCwganNvbik7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBgJHtCYXNlLnN5bWJvbHMuZXJyfSBbbW9jaGFdIHdyaXRpbmcgb3V0cHV0IHRvIFwiJHtvdXRwdXR9XCIgZmFpbGVkOiAke2Vyci5tZXNzYWdlfVxcbmBcbiAgICAgICAgKTtcbiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoanNvbik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGpzb24pO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogUmV0dXJuIGEgcGxhaW4tb2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIGB0ZXN0YFxuICogZnJlZSBvZiBjeWNsaWMgcHJvcGVydGllcyBldGMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSB0ZXN0XG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGNsZWFuKHRlc3QpIHtcbiAgdmFyIGVyciA9IHRlc3QuZXJyIHx8IHt9O1xuICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICBlcnIgPSBlcnJvckpTT04oZXJyKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdGl0bGU6IHRlc3QudGl0bGUsXG4gICAgZnVsbFRpdGxlOiB0ZXN0LmZ1bGxUaXRsZSgpLFxuICAgIGZpbGU6IHRlc3QuZmlsZSxcbiAgICBkdXJhdGlvbjogdGVzdC5kdXJhdGlvbixcbiAgICBjdXJyZW50UmV0cnk6IHRlc3QuY3VycmVudFJldHJ5KCksXG4gICAgc3BlZWQ6IHRlc3Quc3BlZWQsXG4gICAgZXJyOiBjbGVhbkN5Y2xlcyhlcnIpXG4gIH07XG59XG5cbi8qKlxuICogUmVwbGFjZXMgYW55IGNpcmN1bGFyIHJlZmVyZW5jZXMgaW5zaWRlIGBvYmpgIHdpdGggJ1tvYmplY3QgT2JqZWN0XSdcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBjbGVhbkN5Y2xlcyhvYmopIHtcbiAgdmFyIGNhY2hlID0gW107XG4gIHJldHVybiBKU09OLnBhcnNlKFxuICAgIEpTT04uc3RyaW5naWZ5KG9iaiwgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChjYWNoZS5pbmRleE9mKHZhbHVlKSAhPT0gLTEpIHtcbiAgICAgICAgICAvLyBJbnN0ZWFkIG9mIGdvaW5nIGluIGEgY2lyY2xlLCB3ZSdsbCBwcmludCBbb2JqZWN0IE9iamVjdF1cbiAgICAgICAgICByZXR1cm4gJycgKyB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBjYWNoZS5wdXNoKHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogVHJhbnNmb3JtIGFuIEVycm9yIG9iamVjdCBpbnRvIGEgSlNPTiBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBlcnJvckpTT04oZXJyKSB7XG4gIHZhciByZXMgPSB7fTtcbiAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZXJyKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXNba2V5XSA9IGVycltrZXldO1xuICB9LCBlcnIpO1xuICByZXR1cm4gcmVzO1xufVxuXG5KU09OUmVwb3J0ZXIuZGVzY3JpcHRpb24gPSAnc2luZ2xlIEpTT04gb2JqZWN0JztcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qIGVzbGludC1lbnYgYnJvd3NlciAqL1xuLyoqXG4gKiBAbW9kdWxlIEhUTUxcbiAqL1xuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICovXG5cbnZhciBCYXNlID0gcmVxdWlyZSgnLi9iYXNlJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIGVzY2FwZVJlID0gcmVxdWlyZSgnZXNjYXBlLXN0cmluZy1yZWdleHAnKTtcbnZhciBjb25zdGFudHMgPSByZXF1aXJlKCcuLi9ydW5uZXInKS5jb25zdGFudHM7XG52YXIgRVZFTlRfVEVTVF9QQVNTID0gY29uc3RhbnRzLkVWRU5UX1RFU1RfUEFTUztcbnZhciBFVkVOVF9URVNUX0ZBSUwgPSBjb25zdGFudHMuRVZFTlRfVEVTVF9GQUlMO1xudmFyIEVWRU5UX1NVSVRFX0JFR0lOID0gY29uc3RhbnRzLkVWRU5UX1NVSVRFX0JFR0lOO1xudmFyIEVWRU5UX1NVSVRFX0VORCA9IGNvbnN0YW50cy5FVkVOVF9TVUlURV9FTkQ7XG52YXIgRVZFTlRfVEVTVF9QRU5ESU5HID0gY29uc3RhbnRzLkVWRU5UX1RFU1RfUEVORElORztcbnZhciBlc2NhcGUgPSB1dGlscy5lc2NhcGU7XG5cbi8qKlxuICogU2F2ZSB0aW1lciByZWZlcmVuY2VzIHRvIGF2b2lkIFNpbm9uIGludGVyZmVyaW5nIChzZWUgR0gtMjM3KS5cbiAqL1xuXG52YXIgRGF0ZSA9IGdsb2JhbC5EYXRlO1xuXG4vKipcbiAqIEV4cG9zZSBgSFRNTGAuXG4gKi9cblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gSFRNTDtcblxuLyoqXG4gKiBTdGF0cyB0ZW1wbGF0ZTogUmVzdWx0LCBwcm9ncmVzcywgcGFzc2VzLCBmYWlsdXJlcywgYW5kIGR1cmF0aW9uLlxuICovXG5cbnZhciBzdGF0c1RlbXBsYXRlID1cbiAgJzx1bCBpZD1cIm1vY2hhLXN0YXRzXCI+JyArXG4gICc8bGkgY2xhc3M9XCJyZXN1bHRcIj48L2xpPicgK1xuICAnPGxpIGNsYXNzPVwicHJvZ3Jlc3MtY29udGFpblwiPjxwcm9ncmVzcyBjbGFzcz1cInByb2dyZXNzLWVsZW1lbnRcIiBtYXg9XCIxMDBcIiB2YWx1ZT1cIjBcIj48L3Byb2dyZXNzPjxzdmcgY2xhc3M9XCJwcm9ncmVzcy1yaW5nXCI+PGNpcmNsZSBjbGFzcz1cInJpbmctZmxhdGxpZ2h0XCIgc3Ryb2tlLWRhc2hhcnJheT1cIjEwMCUsMCVcIi8+PGNpcmNsZSBjbGFzcz1cInJpbmctaGlnaGxpZ2h0XCIgc3Ryb2tlLWRhc2hhcnJheT1cIjAlLDEwMCVcIi8+PC9zdmc+PGRpdiBjbGFzcz1cInByb2dyZXNzLXRleHRcIj4wJTwvZGl2PjwvbGk+JyArXG4gICc8bGkgY2xhc3M9XCJwYXNzZXNcIj48YSBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApO1wiPnBhc3Nlczo8L2E+IDxlbT4wPC9lbT48L2xpPicgK1xuICAnPGxpIGNsYXNzPVwiZmFpbHVyZXNcIj48YSBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApO1wiPmZhaWx1cmVzOjwvYT4gPGVtPjA8L2VtPjwvbGk+JyArXG4gICc8bGkgY2xhc3M9XCJkdXJhdGlvblwiPmR1cmF0aW9uOiA8ZW0+MDwvZW0+czwvbGk+JyArXG4gICc8L3VsPic7XG5cbnZhciBwbGF5SWNvbiA9ICcmI3gyMDIzOyc7XG5cbi8qKlxuICogQ29uc3RydWN0cyBhIG5ldyBgSFRNTGAgcmVwb3J0ZXIgaW5zdGFuY2UuXG4gKlxuICogQHB1YmxpY1xuICogQGNsYXNzXG4gKiBAbWVtYmVyb2YgTW9jaGEucmVwb3J0ZXJzXG4gKiBAZXh0ZW5kcyBNb2NoYS5yZXBvcnRlcnMuQmFzZVxuICogQHBhcmFtIHtSdW5uZXJ9IHJ1bm5lciAtIEluc3RhbmNlIHRyaWdnZXJzIHJlcG9ydGVyIGFjdGlvbnMuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gcnVubmVyIG9wdGlvbnNcbiAqL1xuZnVuY3Rpb24gSFRNTChydW5uZXIsIG9wdGlvbnMpIHtcbiAgQmFzZS5jYWxsKHRoaXMsIHJ1bm5lciwgb3B0aW9ucyk7XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgc3RhdHMgPSB0aGlzLnN0YXRzO1xuICB2YXIgc3RhdCA9IGZyYWdtZW50KHN0YXRzVGVtcGxhdGUpO1xuICB2YXIgaXRlbXMgPSBzdGF0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdsaScpO1xuICBjb25zdCByZXN1bHRJbmRleCA9IDA7XG4gIGNvbnN0IHByb2dyZXNzSW5kZXggPSAxO1xuICBjb25zdCBwYXNzZXNJbmRleCA9IDI7XG4gIGNvbnN0IGZhaWx1cmVzSW5kZXggPSAzO1xuICBjb25zdCBkdXJhdGlvbkluZGV4ID0gNDtcbiAgLyoqIFN0YXQgaXRlbSBjb250YWluaW5nIHRoZSByb290IHN1aXRlIHBhc3Mgb3IgZmFpbCBpbmRpY2F0b3IgKGhhc0ZhaWx1cmVzID8gJ+KclicgOiAn4pyTJykgKi9cbiAgdmFyIHJlc3VsdEluZGljYXRvciA9IGl0ZW1zW3Jlc3VsdEluZGV4XTtcbiAgLyoqIFBhc3NlcyB0ZXh0IGFuZCBjb3VudCAqL1xuICBjb25zdCBwYXNzZXNTdGF0ID0gaXRlbXNbcGFzc2VzSW5kZXhdO1xuICAvKiogU3RhdCBpdGVtIGNvbnRhaW5pbmcgdGhlIHBhc3MgY291bnQgKG5vdCB0aGUgd29yZCwganVzdCB0aGUgbnVtYmVyKSAqL1xuICBjb25zdCBwYXNzZXNDb3VudCA9IHBhc3Nlc1N0YXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2VtJylbMF07XG4gIC8qKiBTdGF0IGl0ZW0gbGlua2luZyB0byBmaWx0ZXIgdG8gc2hvdyBvbmx5IHBhc3NpbmcgdGVzdHMgKi9cbiAgY29uc3QgcGFzc2VzTGluayA9IHBhc3Nlc1N0YXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2EnKVswXTtcbiAgLyoqIEZhaWx1cmVzIHRleHQgYW5kIGNvdW50ICovXG4gIGNvbnN0IGZhaWx1cmVzU3RhdCA9IGl0ZW1zW2ZhaWx1cmVzSW5kZXhdO1xuICAvKiogU3RhdCBpdGVtIGNvbnRhaW5pbmcgdGhlIGZhaWx1cmUgY291bnQgKG5vdCB0aGUgd29yZCwganVzdCB0aGUgbnVtYmVyKSAqL1xuICBjb25zdCBmYWlsdXJlc0NvdW50ID0gZmFpbHVyZXNTdGF0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdlbScpWzBdO1xuICAvKiogU3RhdCBpdGVtIGxpbmtpbmcgdG8gZmlsdGVyIHRvIHNob3cgb25seSBmYWlsaW5nIHRlc3RzICovXG4gIGNvbnN0IGZhaWx1cmVzTGluayA9IGZhaWx1cmVzU3RhdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYScpWzBdO1xuICAvKiogU3RhdCBpdGVtIGxpbmtpbmcgdG8gdGhlIGR1cmF0aW9uIHRpbWUgKG5vdCB0aGUgd29yZCBvciB1bml0LCBqdXN0IHRoZSBudW1iZXIpICovXG4gIHZhciBkdXJhdGlvbiA9IGl0ZW1zW2R1cmF0aW9uSW5kZXhdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdlbScpWzBdO1xuICB2YXIgcmVwb3J0ID0gZnJhZ21lbnQoJzx1bCBpZD1cIm1vY2hhLXJlcG9ydFwiPjwvdWw+Jyk7XG4gIHZhciBzdGFjayA9IFtyZXBvcnRdO1xuICB2YXIgcHJvZ3Jlc3NUZXh0ID0gaXRlbXNbcHJvZ3Jlc3NJbmRleF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2RpdicpWzBdO1xuICB2YXIgcHJvZ3Jlc3NCYXIgPSBpdGVtc1twcm9ncmVzc0luZGV4XS5nZXRFbGVtZW50c0J5VGFnTmFtZSgncHJvZ3Jlc3MnKVswXTtcbiAgdmFyIHByb2dyZXNzUmluZyA9IFtcbiAgICBpdGVtc1twcm9ncmVzc0luZGV4XS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdyaW5nLWZsYXRsaWdodCcpWzBdLFxuICAgIGl0ZW1zW3Byb2dyZXNzSW5kZXhdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3JpbmctaGlnaGxpZ2h0JylbMF1cbiAgXTtcbiAgdmFyIHByb2dyZXNzUmluZ1JhZGl1cyA9IG51bGw7IC8vIGNvbXB1dGVkIENTUyB1bmF2YWlsYWJsZSBub3csIHNvIHNldCBsYXRlclxuICB2YXIgcm9vdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NoYScpO1xuXG4gIGlmICghcm9vdCkge1xuICAgIHJldHVybiBlcnJvcignI21vY2hhIGRpdiBtaXNzaW5nLCBhZGQgaXQgdG8geW91ciBkb2N1bWVudCcpO1xuICB9XG5cbiAgLy8gcGFzcyB0b2dnbGVcbiAgb24ocGFzc2VzTGluaywgJ2NsaWNrJywgZnVuY3Rpb24gKGV2dCkge1xuICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHVuaGlkZSgpO1xuICAgIHZhciBuYW1lID0gL3Bhc3MvLnRlc3QocmVwb3J0LmNsYXNzTmFtZSkgPyAnJyA6ICcgcGFzcyc7XG4gICAgcmVwb3J0LmNsYXNzTmFtZSA9IHJlcG9ydC5jbGFzc05hbWUucmVwbGFjZSgvZmFpbHxwYXNzL2csICcnKSArIG5hbWU7XG4gICAgaWYgKHJlcG9ydC5jbGFzc05hbWUudHJpbSgpKSB7XG4gICAgICBoaWRlU3VpdGVzV2l0aG91dCgndGVzdCBwYXNzJyk7XG4gICAgfVxuICB9KTtcblxuICAvLyBmYWlsdXJlIHRvZ2dsZVxuICBvbihmYWlsdXJlc0xpbmssICdjbGljaycsIGZ1bmN0aW9uIChldnQpIHtcbiAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICB1bmhpZGUoKTtcbiAgICB2YXIgbmFtZSA9IC9mYWlsLy50ZXN0KHJlcG9ydC5jbGFzc05hbWUpID8gJycgOiAnIGZhaWwnO1xuICAgIHJlcG9ydC5jbGFzc05hbWUgPSByZXBvcnQuY2xhc3NOYW1lLnJlcGxhY2UoL2ZhaWx8cGFzcy9nLCAnJykgKyBuYW1lO1xuICAgIGlmIChyZXBvcnQuY2xhc3NOYW1lLnRyaW0oKSkge1xuICAgICAgaGlkZVN1aXRlc1dpdGhvdXQoJ3Rlc3QgZmFpbCcpO1xuICAgIH1cbiAgfSk7XG5cbiAgcm9vdC5hcHBlbmRDaGlsZChzdGF0KTtcbiAgcm9vdC5hcHBlbmRDaGlsZChyZXBvcnQpO1xuXG4gIHJ1bm5lci5vbihFVkVOVF9TVUlURV9CRUdJTiwgZnVuY3Rpb24gKHN1aXRlKSB7XG4gICAgaWYgKHN1aXRlLnJvb3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBzdWl0ZVxuICAgIHZhciB1cmwgPSBzZWxmLnN1aXRlVVJMKHN1aXRlKTtcbiAgICB2YXIgZWwgPSBmcmFnbWVudChcbiAgICAgICc8bGkgY2xhc3M9XCJzdWl0ZVwiPjxoMT48YSBocmVmPVwiJXNcIj4lczwvYT48L2gxPjwvbGk+JyxcbiAgICAgIHVybCxcbiAgICAgIGVzY2FwZShzdWl0ZS50aXRsZSlcbiAgICApO1xuXG4gICAgLy8gY29udGFpbmVyXG4gICAgc3RhY2tbMF0uYXBwZW5kQ2hpbGQoZWwpO1xuICAgIHN0YWNrLnVuc2hpZnQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndWwnKSk7XG4gICAgZWwuYXBwZW5kQ2hpbGQoc3RhY2tbMF0pO1xuICB9KTtcblxuICBydW5uZXIub24oRVZFTlRfU1VJVEVfRU5ELCBmdW5jdGlvbiAoc3VpdGUpIHtcbiAgICBpZiAoc3VpdGUucm9vdCkge1xuICAgICAgaWYgKHN0YXRzLmZhaWx1cmVzID09PSAwKSB7XG4gICAgICAgIHRleHQocmVzdWx0SW5kaWNhdG9yLCAn4pyTJyk7XG4gICAgICAgIHN0YXQuY2xhc3NOYW1lICs9ICcgcGFzcyc7XG4gICAgICB9XG4gICAgICB1cGRhdGVTdGF0cygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdGFjay5zaGlmdCgpO1xuICB9KTtcblxuICBydW5uZXIub24oRVZFTlRfVEVTVF9QQVNTLCBmdW5jdGlvbiAodGVzdCkge1xuICAgIHZhciB1cmwgPSBzZWxmLnRlc3RVUkwodGVzdCk7XG4gICAgdmFyIG1hcmt1cCA9XG4gICAgICAnPGxpIGNsYXNzPVwidGVzdCBwYXNzICVlXCI+PGgyPiVlPHNwYW4gY2xhc3M9XCJkdXJhdGlvblwiPiVlbXM8L3NwYW4+ICcgK1xuICAgICAgJzxhIGhyZWY9XCIlc1wiIGNsYXNzPVwicmVwbGF5XCI+JyArXG4gICAgICBwbGF5SWNvbiArXG4gICAgICAnPC9hPjwvaDI+PC9saT4nO1xuICAgIHZhciBlbCA9IGZyYWdtZW50KG1hcmt1cCwgdGVzdC5zcGVlZCwgdGVzdC50aXRsZSwgdGVzdC5kdXJhdGlvbiwgdXJsKTtcbiAgICBzZWxmLmFkZENvZGVUb2dnbGUoZWwsIHRlc3QuYm9keSk7XG4gICAgYXBwZW5kVG9TdGFjayhlbCk7XG4gICAgdXBkYXRlU3RhdHMoKTtcbiAgfSk7XG5cbiAgcnVubmVyLm9uKEVWRU5UX1RFU1RfRkFJTCwgZnVuY3Rpb24gKHRlc3QpIHtcbiAgICAvLyBVcGRhdGUgc3RhdCBpdGVtc1xuICAgIHRleHQocmVzdWx0SW5kaWNhdG9yLCAn4pyWJyk7XG4gICAgc3RhdC5jbGFzc05hbWUgKz0gJyBmYWlsJztcblxuICAgIHZhciBlbCA9IGZyYWdtZW50KFxuICAgICAgJzxsaSBjbGFzcz1cInRlc3QgZmFpbFwiPjxoMj4lZSA8YSBocmVmPVwiJWVcIiBjbGFzcz1cInJlcGxheVwiPicgK1xuICAgICAgICBwbGF5SWNvbiArXG4gICAgICAgICc8L2E+PC9oMj48L2xpPicsXG4gICAgICB0ZXN0LnRpdGxlLFxuICAgICAgc2VsZi50ZXN0VVJMKHRlc3QpXG4gICAgKTtcbiAgICB2YXIgc3RhY2tTdHJpbmc7IC8vIE5vdGU6IEluY2x1ZGVzIGxlYWRpbmcgbmV3bGluZVxuICAgIHZhciBtZXNzYWdlID0gdGVzdC5lcnIudG9TdHJpbmcoKTtcblxuICAgIC8vIDw9SUU3IHN0cmluZ2lmaWVzIHRvIFtPYmplY3QgRXJyb3JdLiBTaW5jZSBpdCBjYW4gYmUgb3ZlcmxvYWRlZCwgd2VcbiAgICAvLyBjaGVjayBmb3IgdGhlIHJlc3VsdCBvZiB0aGUgc3RyaW5naWZ5aW5nLlxuICAgIGlmIChtZXNzYWdlID09PSAnW29iamVjdCBFcnJvcl0nKSB7XG4gICAgICBtZXNzYWdlID0gdGVzdC5lcnIubWVzc2FnZTtcbiAgICB9XG5cbiAgICBpZiAodGVzdC5lcnIuc3RhY2spIHtcbiAgICAgIHZhciBpbmRleE9mTWVzc2FnZSA9IHRlc3QuZXJyLnN0YWNrLmluZGV4T2YodGVzdC5lcnIubWVzc2FnZSk7XG4gICAgICBpZiAoaW5kZXhPZk1lc3NhZ2UgPT09IC0xKSB7XG4gICAgICAgIHN0YWNrU3RyaW5nID0gdGVzdC5lcnIuc3RhY2s7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGFja1N0cmluZyA9IHRlc3QuZXJyLnN0YWNrLnNsaWNlKFxuICAgICAgICAgIHRlc3QuZXJyLm1lc3NhZ2UubGVuZ3RoICsgaW5kZXhPZk1lc3NhZ2VcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRlc3QuZXJyLnNvdXJjZVVSTCAmJiB0ZXN0LmVyci5saW5lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFNhZmFyaSBkb2Vzbid0IGdpdmUgeW91IGEgc3RhY2suIExldCdzIGF0IGxlYXN0IHByb3ZpZGUgYSBzb3VyY2UgbGluZS5cbiAgICAgIHN0YWNrU3RyaW5nID0gJ1xcbignICsgdGVzdC5lcnIuc291cmNlVVJMICsgJzonICsgdGVzdC5lcnIubGluZSArICcpJztcbiAgICB9XG5cbiAgICBzdGFja1N0cmluZyA9IHN0YWNrU3RyaW5nIHx8ICcnO1xuXG4gICAgaWYgKHRlc3QuZXJyLmh0bWxNZXNzYWdlICYmIHN0YWNrU3RyaW5nKSB7XG4gICAgICBlbC5hcHBlbmRDaGlsZChcbiAgICAgICAgZnJhZ21lbnQoXG4gICAgICAgICAgJzxkaXYgY2xhc3M9XCJodG1sLWVycm9yXCI+JXNcXG48cHJlIGNsYXNzPVwiZXJyb3JcIj4lZTwvcHJlPjwvZGl2PicsXG4gICAgICAgICAgdGVzdC5lcnIuaHRtbE1lc3NhZ2UsXG4gICAgICAgICAgc3RhY2tTdHJpbmdcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHRlc3QuZXJyLmh0bWxNZXNzYWdlKSB7XG4gICAgICBlbC5hcHBlbmRDaGlsZChcbiAgICAgICAgZnJhZ21lbnQoJzxkaXYgY2xhc3M9XCJodG1sLWVycm9yXCI+JXM8L2Rpdj4nLCB0ZXN0LmVyci5odG1sTWVzc2FnZSlcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsLmFwcGVuZENoaWxkKFxuICAgICAgICBmcmFnbWVudCgnPHByZSBjbGFzcz1cImVycm9yXCI+JWUlZTwvcHJlPicsIG1lc3NhZ2UsIHN0YWNrU3RyaW5nKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBzZWxmLmFkZENvZGVUb2dnbGUoZWwsIHRlc3QuYm9keSk7XG4gICAgYXBwZW5kVG9TdGFjayhlbCk7XG4gICAgdXBkYXRlU3RhdHMoKTtcbiAgfSk7XG5cbiAgcnVubmVyLm9uKEVWRU5UX1RFU1RfUEVORElORywgZnVuY3Rpb24gKHRlc3QpIHtcbiAgICB2YXIgZWwgPSBmcmFnbWVudChcbiAgICAgICc8bGkgY2xhc3M9XCJ0ZXN0IHBhc3MgcGVuZGluZ1wiPjxoMj4lZTwvaDI+PC9saT4nLFxuICAgICAgdGVzdC50aXRsZVxuICAgICk7XG4gICAgYXBwZW5kVG9TdGFjayhlbCk7XG4gICAgdXBkYXRlU3RhdHMoKTtcbiAgfSk7XG5cbiAgZnVuY3Rpb24gYXBwZW5kVG9TdGFjayhlbCkge1xuICAgIC8vIERvbid0IGNhbGwgLmFwcGVuZENoaWxkIGlmICNtb2NoYS1yZXBvcnQgd2FzIGFscmVhZHkgLnNoaWZ0KCknZWQgb2ZmIHRoZSBzdGFjay5cbiAgICBpZiAoc3RhY2tbMF0pIHtcbiAgICAgIHN0YWNrWzBdLmFwcGVuZENoaWxkKGVsKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVTdGF0cygpIHtcbiAgICB2YXIgcGVyY2VudCA9ICgoc3RhdHMudGVzdHMgLyBydW5uZXIudG90YWwpICogMTAwKSB8IDA7XG4gICAgcHJvZ3Jlc3NCYXIudmFsdWUgPSBwZXJjZW50O1xuICAgIGlmIChwcm9ncmVzc1RleHQpIHtcbiAgICAgIC8vIHNldHRpbmcgYSB0b0ZpeGVkIHRoYXQgaXMgdG9vIGxvdywgbWFrZXMgc21hbGwgY2hhbmdlcyB0byBwcm9ncmVzcyBub3Qgc2hvd25cbiAgICAgIC8vIHNldHRpbmcgaXQgdG9vIGhpZ2gsIG1ha2VzIHRoZSBwcm9ncmVzcyB0ZXh0IGxvbmdlciB0aGVuIGl0IG5lZWRzIHRvXG4gICAgICAvLyB0byBhZGRyZXNzIHRoaXMsIGNhbGN1bGF0ZSB0aGUgdG9GaXhlZCBiYXNlZCBvbiB0aGUgbWFnbml0dWRlIG9mIHRvdGFsXG4gICAgICB2YXIgZGVjaW1hbFBsYWNlcyA9IE1hdGguY2VpbChNYXRoLmxvZzEwKHJ1bm5lci50b3RhbCAvIDEwMCkpO1xuICAgICAgdGV4dChcbiAgICAgICAgcHJvZ3Jlc3NUZXh0LFxuICAgICAgICBwZXJjZW50LnRvRml4ZWQoTWF0aC5taW4oTWF0aC5tYXgoZGVjaW1hbFBsYWNlcywgMCksIDEwMCkpICsgJyUnXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAocHJvZ3Jlc3NSaW5nKSB7XG4gICAgICB2YXIgcmFkaXVzID0gcGFyc2VGbG9hdChnZXRDb21wdXRlZFN0eWxlKHByb2dyZXNzUmluZ1swXSkuZ2V0UHJvcGVydHlWYWx1ZSgncicpKTtcbiAgICAgIHZhciB3aG9sZUFyYyA9IE1hdGguUEkgKiAyICogcmFkaXVzO1xuICAgICAgdmFyIGhpZ2hsaWdodEFyYyA9IHBlcmNlbnQgKiAod2hvbGVBcmMgLyAxMDApO1xuICAgICAgLy8gVGhlIHByb2dyZXNzIHJpbmcgaXMgaW4gMiBwYXJ0cywgdGhlIGZsYXRsaWdodCBjb2xvciBhbmQgaGlnaGxpZ2h0IGNvbG9yLlxuICAgICAgLy8gUmVuZGVyaW5nIGJvdGggb24gdG9wIG9mIHRoZSBvdGhlciwgc2VlbXMgdG8gbWFrZSBhIDNyZCBjb2xvciBvbiB0aGUgZWRnZXMuXG4gICAgICAvLyBUbyBjcmVhdGUgMSB3aG9sZSByaW5nIHdpdGggMiBjb2xvcnMsIGJvdGggcGFydHMgYXJlIGludmVyc2Ugb2YgdGhlIG90aGVyLlxuICAgICAgcHJvZ3Jlc3NSaW5nWzBdLnN0eWxlWydzdHJva2UtZGFzaGFycmF5J10gPSBgMCwke2hpZ2hsaWdodEFyY31weCwke3dob2xlQXJjfXB4YDtcbiAgICAgIHByb2dyZXNzUmluZ1sxXS5zdHlsZVsnc3Ryb2tlLWRhc2hhcnJheSddID0gYCR7aGlnaGxpZ2h0QXJjfXB4LCR7d2hvbGVBcmN9cHhgO1xuICAgIH1cblxuICAgIC8vIHVwZGF0ZSBzdGF0c1xuICAgIHZhciBtcyA9IG5ldyBEYXRlKCkgLSBzdGF0cy5zdGFydDtcbiAgICB0ZXh0KHBhc3Nlc0NvdW50LCBzdGF0cy5wYXNzZXMpO1xuICAgIHRleHQoZmFpbHVyZXNDb3VudCwgc3RhdHMuZmFpbHVyZXMpO1xuICAgIHRleHQoZHVyYXRpb24sIChtcyAvIDEwMDApLnRvRml4ZWQoMikpO1xuICB9XG59XG5cbi8qKlxuICogTWFrZXMgYSBVUkwsIHByZXNlcnZpbmcgcXVlcnlzdHJpbmcgKFwic2VhcmNoXCIpIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNcbiAqIEByZXR1cm4ge3N0cmluZ30gQSBuZXcgVVJMLlxuICovXG5mdW5jdGlvbiBtYWtlVXJsKHMpIHtcbiAgdmFyIHNlYXJjaCA9IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2g7XG5cbiAgLy8gUmVtb3ZlIHByZXZpb3VzIHtncmVwLCBmZ3JlcCwgaW52ZXJ0fSBxdWVyeSBwYXJhbWV0ZXJzIGlmIHByZXNlbnRcbiAgaWYgKHNlYXJjaCkge1xuICAgIHNlYXJjaCA9IHNlYXJjaC5yZXBsYWNlKC9bPyZdKD86Zj9ncmVwfGludmVydCk9W14mXFxzXSovZywgJycpLnJlcGxhY2UoL14mLywgJz8nKTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lICtcbiAgICAoc2VhcmNoID8gc2VhcmNoICsgJyYnIDogJz8nKSArXG4gICAgJ2dyZXA9JyArXG4gICAgZW5jb2RlVVJJQ29tcG9uZW50KHMpXG4gICk7XG59XG5cbi8qKlxuICogUHJvdmlkZSBzdWl0ZSBVUkwuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtzdWl0ZV1cbiAqL1xuSFRNTC5wcm90b3R5cGUuc3VpdGVVUkwgPSBmdW5jdGlvbiAoc3VpdGUpIHtcbiAgcmV0dXJuIG1ha2VVcmwoJ14nICsgZXNjYXBlUmUoc3VpdGUuZnVsbFRpdGxlKCkpICsgJyAnKTtcbn07XG5cbi8qKlxuICogUHJvdmlkZSB0ZXN0IFVSTC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gW3Rlc3RdXG4gKi9cbkhUTUwucHJvdG90eXBlLnRlc3RVUkwgPSBmdW5jdGlvbiAodGVzdCkge1xuICByZXR1cm4gbWFrZVVybCgnXicgKyBlc2NhcGVSZSh0ZXN0LmZ1bGxUaXRsZSgpKSArICckJyk7XG59O1xuXG4vKipcbiAqIEFkZHMgY29kZSB0b2dnbGUgZnVuY3Rpb25hbGl0eSBmb3IgdGhlIHByb3ZpZGVkIHRlc3QncyBsaXN0IGVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHtIVE1MTElFbGVtZW50fSBlbFxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnRzXG4gKi9cbkhUTUwucHJvdG90eXBlLmFkZENvZGVUb2dnbGUgPSBmdW5jdGlvbiAoZWwsIGNvbnRlbnRzKSB7XG4gIHZhciBoMiA9IGVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoMicpWzBdO1xuXG4gIG9uKGgyLCAnY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgcHJlLnN0eWxlLmRpc3BsYXkgPSBwcmUuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgfSk7XG5cbiAgdmFyIHByZSA9IGZyYWdtZW50KCc8cHJlPjxjb2RlPiVlPC9jb2RlPjwvcHJlPicsIHV0aWxzLmNsZWFuKGNvbnRlbnRzKSk7XG4gIGVsLmFwcGVuZENoaWxkKHByZSk7XG4gIHByZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xufTtcblxuLyoqXG4gKiBEaXNwbGF5IGVycm9yIGBtc2dgLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc2dcbiAqL1xuZnVuY3Rpb24gZXJyb3IobXNnKSB7XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZnJhZ21lbnQoJzxkaXYgaWQ9XCJtb2NoYS1lcnJvclwiPiVzPC9kaXY+JywgbXNnKSk7XG59XG5cbi8qKlxuICogUmV0dXJuIGEgRE9NIGZyYWdtZW50IGZyb20gYGh0bWxgLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBodG1sXG4gKi9cbmZ1bmN0aW9uIGZyYWdtZW50KGh0bWwpIHtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgdmFyIGkgPSAxO1xuXG4gIGRpdi5pbm5lckhUTUwgPSBodG1sLnJlcGxhY2UoLyUoW3NlXSkvZywgZnVuY3Rpb24gKF8sIHR5cGUpIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ3MnOlxuICAgICAgICByZXR1cm4gU3RyaW5nKGFyZ3NbaSsrXSk7XG4gICAgICBjYXNlICdlJzpcbiAgICAgICAgcmV0dXJuIGVzY2FwZShhcmdzW2krK10pO1xuICAgICAgLy8gbm8gZGVmYXVsdFxuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGRpdi5maXJzdENoaWxkO1xufVxuXG4vKipcbiAqIENoZWNrIGZvciBzdWl0ZXMgdGhhdCBkbyBub3QgaGF2ZSBlbGVtZW50c1xuICogd2l0aCBgY2xhc3NuYW1lYCwgYW5kIGhpZGUgdGhlbS5cbiAqXG4gKiBAcGFyYW0ge3RleHR9IGNsYXNzbmFtZVxuICovXG5mdW5jdGlvbiBoaWRlU3VpdGVzV2l0aG91dChjbGFzc25hbWUpIHtcbiAgdmFyIHN1aXRlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3N1aXRlJyk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3VpdGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVscyA9IHN1aXRlc1tpXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGNsYXNzbmFtZSk7XG4gICAgaWYgKCFlbHMubGVuZ3RoKSB7XG4gICAgICBzdWl0ZXNbaV0uY2xhc3NOYW1lICs9ICcgaGlkZGVuJztcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBVbmhpZGUgLmhpZGRlbiBzdWl0ZXMuXG4gKi9cbmZ1bmN0aW9uIHVuaGlkZSgpIHtcbiAgdmFyIGVscyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3N1aXRlIGhpZGRlbicpO1xuICB3aGlsZSAoZWxzLmxlbmd0aCA+IDApIHtcbiAgICBlbHNbMF0uY2xhc3NOYW1lID0gZWxzWzBdLmNsYXNzTmFtZS5yZXBsYWNlKCdzdWl0ZSBoaWRkZW4nLCAnc3VpdGUnKTtcbiAgfVxufVxuXG4vKipcbiAqIFNldCBhbiBlbGVtZW50J3MgdGV4dCBjb250ZW50cy5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbFxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnRzXG4gKi9cbmZ1bmN0aW9uIHRleHQoZWwsIGNvbnRlbnRzKSB7XG4gIGlmIChlbC50ZXh0Q29udGVudCkge1xuICAgIGVsLnRleHRDb250ZW50ID0gY29udGVudHM7XG4gIH0gZWxzZSB7XG4gICAgZWwuaW5uZXJUZXh0ID0gY29udGVudHM7XG4gIH1cbn1cblxuLyoqXG4gKiBMaXN0ZW4gb24gYGV2ZW50YCB3aXRoIGNhbGxiYWNrIGBmbmAuXG4gKi9cbmZ1bmN0aW9uIG9uKGVsLCBldmVudCwgZm4pIHtcbiAgaWYgKGVsLmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBmbiwgZmFsc2UpO1xuICB9IGVsc2Uge1xuICAgIGVsLmF0dGFjaEV2ZW50KCdvbicgKyBldmVudCwgZm4pO1xuICB9XG59XG5cbkhUTUwuYnJvd3Nlck9ubHkgPSB0cnVlO1xuIiwgIid1c2Ugc3RyaWN0Jztcbi8qKlxuICogQG1vZHVsZSBMaXN0XG4gKi9cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgQmFzZSA9IHJlcXVpcmUoJy4vYmFzZScpO1xudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnLi4vdXRpbHMnKS5pbmhlcml0cztcbnZhciBjb25zdGFudHMgPSByZXF1aXJlKCcuLi9ydW5uZXInKS5jb25zdGFudHM7XG52YXIgRVZFTlRfUlVOX0JFR0lOID0gY29uc3RhbnRzLkVWRU5UX1JVTl9CRUdJTjtcbnZhciBFVkVOVF9SVU5fRU5EID0gY29uc3RhbnRzLkVWRU5UX1JVTl9FTkQ7XG52YXIgRVZFTlRfVEVTVF9CRUdJTiA9IGNvbnN0YW50cy5FVkVOVF9URVNUX0JFR0lOO1xudmFyIEVWRU5UX1RFU1RfRkFJTCA9IGNvbnN0YW50cy5FVkVOVF9URVNUX0ZBSUw7XG52YXIgRVZFTlRfVEVTVF9QQVNTID0gY29uc3RhbnRzLkVWRU5UX1RFU1RfUEFTUztcbnZhciBFVkVOVF9URVNUX1BFTkRJTkcgPSBjb25zdGFudHMuRVZFTlRfVEVTVF9QRU5ESU5HO1xudmFyIGNvbG9yID0gQmFzZS5jb2xvcjtcbnZhciBjdXJzb3IgPSBCYXNlLmN1cnNvcjtcblxuLyoqXG4gKiBFeHBvc2UgYExpc3RgLlxuICovXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IExpc3Q7XG5cbi8qKlxuICogQ29uc3RydWN0cyBhIG5ldyBgTGlzdGAgcmVwb3J0ZXIgaW5zdGFuY2UuXG4gKlxuICogQHB1YmxpY1xuICogQGNsYXNzXG4gKiBAbWVtYmVyb2YgTW9jaGEucmVwb3J0ZXJzXG4gKiBAZXh0ZW5kcyBNb2NoYS5yZXBvcnRlcnMuQmFzZVxuICogQHBhcmFtIHtSdW5uZXJ9IHJ1bm5lciAtIEluc3RhbmNlIHRyaWdnZXJzIHJlcG9ydGVyIGFjdGlvbnMuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gcnVubmVyIG9wdGlvbnNcbiAqL1xuZnVuY3Rpb24gTGlzdChydW5uZXIsIG9wdGlvbnMpIHtcbiAgQmFzZS5jYWxsKHRoaXMsIHJ1bm5lciwgb3B0aW9ucyk7XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgbiA9IDA7XG5cbiAgcnVubmVyLm9uKEVWRU5UX1JVTl9CRUdJTiwgZnVuY3Rpb24gKCkge1xuICAgIEJhc2UuY29uc29sZUxvZygpO1xuICB9KTtcblxuICBydW5uZXIub24oRVZFTlRfVEVTVF9CRUdJTiwgZnVuY3Rpb24gKHRlc3QpIHtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShjb2xvcigncGFzcycsICcgICAgJyArIHRlc3QuZnVsbFRpdGxlKCkgKyAnOiAnKSk7XG4gIH0pO1xuXG4gIHJ1bm5lci5vbihFVkVOVF9URVNUX1BFTkRJTkcsIGZ1bmN0aW9uICh0ZXN0KSB7XG4gICAgdmFyIGZtdCA9IGNvbG9yKCdjaGVja21hcmsnLCAnICAtJykgKyBjb2xvcigncGVuZGluZycsICcgJXMnKTtcbiAgICBCYXNlLmNvbnNvbGVMb2coZm10LCB0ZXN0LmZ1bGxUaXRsZSgpKTtcbiAgfSk7XG5cbiAgcnVubmVyLm9uKEVWRU5UX1RFU1RfUEFTUywgZnVuY3Rpb24gKHRlc3QpIHtcbiAgICB2YXIgZm10ID1cbiAgICAgIGNvbG9yKCdjaGVja21hcmsnLCAnICAnICsgQmFzZS5zeW1ib2xzLm9rKSArXG4gICAgICBjb2xvcigncGFzcycsICcgJXM6ICcpICtcbiAgICAgIGNvbG9yKHRlc3Quc3BlZWQsICclZG1zJyk7XG4gICAgY3Vyc29yLkNSKCk7XG4gICAgQmFzZS5jb25zb2xlTG9nKGZtdCwgdGVzdC5mdWxsVGl0bGUoKSwgdGVzdC5kdXJhdGlvbik7XG4gIH0pO1xuXG4gIHJ1bm5lci5vbihFVkVOVF9URVNUX0ZBSUwsIGZ1bmN0aW9uICh0ZXN0KSB7XG4gICAgY3Vyc29yLkNSKCk7XG4gICAgQmFzZS5jb25zb2xlTG9nKGNvbG9yKCdmYWlsJywgJyAgJWQpICVzJyksICsrbiwgdGVzdC5mdWxsVGl0bGUoKSk7XG4gIH0pO1xuXG4gIHJ1bm5lci5vbmNlKEVWRU5UX1JVTl9FTkQsIHNlbGYuZXBpbG9ndWUuYmluZChzZWxmKSk7XG59XG5cbi8qKlxuICogSW5oZXJpdCBmcm9tIGBCYXNlLnByb3RvdHlwZWAuXG4gKi9cbmluaGVyaXRzKExpc3QsIEJhc2UpO1xuXG5MaXN0LmRlc2NyaXB0aW9uID0gJ2xpa2UgXCJzcGVjXCIgcmVwb3J0ZXIgYnV0IGZsYXQnO1xuIiwgIid1c2Ugc3RyaWN0Jztcbi8qKlxuICogQG1vZHVsZSBNaW5cbiAqL1xuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICovXG5cbnZhciBCYXNlID0gcmVxdWlyZSgnLi9iYXNlJyk7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCcuLi91dGlscycpLmluaGVyaXRzO1xudmFyIGNvbnN0YW50cyA9IHJlcXVpcmUoJy4uL3J1bm5lcicpLmNvbnN0YW50cztcbnZhciBFVkVOVF9SVU5fRU5EID0gY29uc3RhbnRzLkVWRU5UX1JVTl9FTkQ7XG52YXIgRVZFTlRfUlVOX0JFR0lOID0gY29uc3RhbnRzLkVWRU5UX1JVTl9CRUdJTjtcblxuLyoqXG4gKiBFeHBvc2UgYE1pbmAuXG4gKi9cblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gTWluO1xuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBuZXcgYE1pbmAgcmVwb3J0ZXIgaW5zdGFuY2UuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGlzIG1pbmltYWwgdGVzdCByZXBvcnRlciBpcyBiZXN0IHVzZWQgd2l0aCAnLS13YXRjaCcuXG4gKlxuICogQHB1YmxpY1xuICogQGNsYXNzXG4gKiBAbWVtYmVyb2YgTW9jaGEucmVwb3J0ZXJzXG4gKiBAZXh0ZW5kcyBNb2NoYS5yZXBvcnRlcnMuQmFzZVxuICogQHBhcmFtIHtSdW5uZXJ9IHJ1bm5lciAtIEluc3RhbmNlIHRyaWdnZXJzIHJlcG9ydGVyIGFjdGlvbnMuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gcnVubmVyIG9wdGlvbnNcbiAqL1xuZnVuY3Rpb24gTWluKHJ1bm5lciwgb3B0aW9ucykge1xuICBCYXNlLmNhbGwodGhpcywgcnVubmVyLCBvcHRpb25zKTtcblxuICBydW5uZXIub24oRVZFTlRfUlVOX0JFR0lOLCBmdW5jdGlvbiAoKSB7XG4gICAgLy8gY2xlYXIgc2NyZWVuXG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcdTAwMWJbMkonKTtcbiAgICAvLyBzZXQgY3Vyc29yIHBvc2l0aW9uXG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcdTAwMWJbMTszSCcpO1xuICB9KTtcblxuICBydW5uZXIub25jZShFVkVOVF9SVU5fRU5ELCB0aGlzLmVwaWxvZ3VlLmJpbmQodGhpcykpO1xufVxuXG4vKipcbiAqIEluaGVyaXQgZnJvbSBgQmFzZS5wcm90b3R5cGVgLlxuICovXG5pbmhlcml0cyhNaW4sIEJhc2UpO1xuXG5NaW4uZGVzY3JpcHRpb24gPSAnZXNzZW50aWFsbHkganVzdCBhIHN1bW1hcnknO1xuIiwgIid1c2Ugc3RyaWN0Jztcbi8qKlxuICogQG1vZHVsZSBTcGVjXG4gKi9cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgQmFzZSA9IHJlcXVpcmUoJy4vYmFzZScpO1xudmFyIGNvbnN0YW50cyA9IHJlcXVpcmUoJy4uL3J1bm5lcicpLmNvbnN0YW50cztcbnZhciBFVkVOVF9SVU5fQkVHSU4gPSBjb25zdGFudHMuRVZFTlRfUlVOX0JFR0lOO1xudmFyIEVWRU5UX1JVTl9FTkQgPSBjb25zdGFudHMuRVZFTlRfUlVOX0VORDtcbnZhciBFVkVOVF9TVUlURV9CRUdJTiA9IGNvbnN0YW50cy5FVkVOVF9TVUlURV9CRUdJTjtcbnZhciBFVkVOVF9TVUlURV9FTkQgPSBjb25zdGFudHMuRVZFTlRfU1VJVEVfRU5EO1xudmFyIEVWRU5UX1RFU1RfRkFJTCA9IGNvbnN0YW50cy5FVkVOVF9URVNUX0ZBSUw7XG52YXIgRVZFTlRfVEVTVF9QQVNTID0gY29uc3RhbnRzLkVWRU5UX1RFU1RfUEFTUztcbnZhciBFVkVOVF9URVNUX1BFTkRJTkcgPSBjb25zdGFudHMuRVZFTlRfVEVTVF9QRU5ESU5HO1xudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnLi4vdXRpbHMnKS5pbmhlcml0cztcbnZhciBjb2xvciA9IEJhc2UuY29sb3I7XG5cbi8qKlxuICogRXhwb3NlIGBTcGVjYC5cbiAqL1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBTcGVjO1xuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBuZXcgYFNwZWNgIHJlcG9ydGVyIGluc3RhbmNlLlxuICpcbiAqIEBwdWJsaWNcbiAqIEBjbGFzc1xuICogQG1lbWJlcm9mIE1vY2hhLnJlcG9ydGVyc1xuICogQGV4dGVuZHMgTW9jaGEucmVwb3J0ZXJzLkJhc2VcbiAqIEBwYXJhbSB7UnVubmVyfSBydW5uZXIgLSBJbnN0YW5jZSB0cmlnZ2VycyByZXBvcnRlciBhY3Rpb25zLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIHJ1bm5lciBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIFNwZWMocnVubmVyLCBvcHRpb25zKSB7XG4gIEJhc2UuY2FsbCh0aGlzLCBydW5uZXIsIG9wdGlvbnMpO1xuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGluZGVudHMgPSAwO1xuICB2YXIgbiA9IDA7XG5cbiAgZnVuY3Rpb24gaW5kZW50KCkge1xuICAgIHJldHVybiBBcnJheShpbmRlbnRzKS5qb2luKCcgICcpO1xuICB9XG5cbiAgcnVubmVyLm9uKEVWRU5UX1JVTl9CRUdJTiwgZnVuY3Rpb24gKCkge1xuICAgIEJhc2UuY29uc29sZUxvZygpO1xuICB9KTtcblxuICBydW5uZXIub24oRVZFTlRfU1VJVEVfQkVHSU4sIGZ1bmN0aW9uIChzdWl0ZSkge1xuICAgICsraW5kZW50cztcbiAgICBCYXNlLmNvbnNvbGVMb2coY29sb3IoJ3N1aXRlJywgJyVzJXMnKSwgaW5kZW50KCksIHN1aXRlLnRpdGxlKTtcbiAgfSk7XG5cbiAgcnVubmVyLm9uKEVWRU5UX1NVSVRFX0VORCwgZnVuY3Rpb24gKCkge1xuICAgIC0taW5kZW50cztcbiAgICBpZiAoaW5kZW50cyA9PT0gMSkge1xuICAgICAgQmFzZS5jb25zb2xlTG9nKCk7XG4gICAgfVxuICB9KTtcblxuICBydW5uZXIub24oRVZFTlRfVEVTVF9QRU5ESU5HLCBmdW5jdGlvbiAodGVzdCkge1xuICAgIHZhciBmbXQgPSBpbmRlbnQoKSArIGNvbG9yKCdwZW5kaW5nJywgJyAgLSAlcycpO1xuICAgIEJhc2UuY29uc29sZUxvZyhmbXQsIHRlc3QudGl0bGUpO1xuICB9KTtcblxuICBydW5uZXIub24oRVZFTlRfVEVTVF9QQVNTLCBmdW5jdGlvbiAodGVzdCkge1xuICAgIHZhciBmbXQ7XG4gICAgaWYgKHRlc3Quc3BlZWQgPT09ICdmYXN0Jykge1xuICAgICAgZm10ID1cbiAgICAgICAgaW5kZW50KCkgK1xuICAgICAgICBjb2xvcignY2hlY2ttYXJrJywgJyAgJyArIEJhc2Uuc3ltYm9scy5vaykgK1xuICAgICAgICBjb2xvcigncGFzcycsICcgJXMnKTtcbiAgICAgIEJhc2UuY29uc29sZUxvZyhmbXQsIHRlc3QudGl0bGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmbXQgPVxuICAgICAgICBpbmRlbnQoKSArXG4gICAgICAgIGNvbG9yKCdjaGVja21hcmsnLCAnICAnICsgQmFzZS5zeW1ib2xzLm9rKSArXG4gICAgICAgIGNvbG9yKCdwYXNzJywgJyAlcycpICtcbiAgICAgICAgY29sb3IodGVzdC5zcGVlZCwgJyAoJWRtcyknKTtcbiAgICAgIEJhc2UuY29uc29sZUxvZyhmbXQsIHRlc3QudGl0bGUsIHRlc3QuZHVyYXRpb24pO1xuICAgIH1cbiAgfSk7XG5cbiAgcnVubmVyLm9uKEVWRU5UX1RFU1RfRkFJTCwgZnVuY3Rpb24gKHRlc3QpIHtcbiAgICBCYXNlLmNvbnNvbGVMb2coaW5kZW50KCkgKyBjb2xvcignZmFpbCcsICcgICVkKSAlcycpLCArK24sIHRlc3QudGl0bGUpO1xuICB9KTtcblxuICBydW5uZXIub25jZShFVkVOVF9SVU5fRU5ELCBzZWxmLmVwaWxvZ3VlLmJpbmQoc2VsZikpO1xufVxuXG4vKipcbiAqIEluaGVyaXQgZnJvbSBgQmFzZS5wcm90b3R5cGVgLlxuICovXG5pbmhlcml0cyhTcGVjLCBCYXNlKTtcblxuU3BlYy5kZXNjcmlwdGlvbiA9ICdoaWVyYXJjaGljYWwgJiB2ZXJib3NlIFtkZWZhdWx0XSc7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuLyoqXG4gKiBAbW9kdWxlIE55YW5cbiAqL1xuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICovXG5cbnZhciBCYXNlID0gcmVxdWlyZSgnLi9iYXNlJyk7XG52YXIgY29uc3RhbnRzID0gcmVxdWlyZSgnLi4vcnVubmVyJykuY29uc3RhbnRzO1xudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnLi4vdXRpbHMnKS5pbmhlcml0cztcbnZhciBFVkVOVF9SVU5fQkVHSU4gPSBjb25zdGFudHMuRVZFTlRfUlVOX0JFR0lOO1xudmFyIEVWRU5UX1RFU1RfUEVORElORyA9IGNvbnN0YW50cy5FVkVOVF9URVNUX1BFTkRJTkc7XG52YXIgRVZFTlRfVEVTVF9QQVNTID0gY29uc3RhbnRzLkVWRU5UX1RFU1RfUEFTUztcbnZhciBFVkVOVF9SVU5fRU5EID0gY29uc3RhbnRzLkVWRU5UX1JVTl9FTkQ7XG52YXIgRVZFTlRfVEVTVF9GQUlMID0gY29uc3RhbnRzLkVWRU5UX1RFU1RfRkFJTDtcblxuLyoqXG4gKiBFeHBvc2UgYERvdGAuXG4gKi9cblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gTnlhbkNhdDtcblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgbmV3IGBOeWFuYCByZXBvcnRlciBpbnN0YW5jZS5cbiAqXG4gKiBAcHVibGljXG4gKiBAY2xhc3MgTnlhblxuICogQG1lbWJlcm9mIE1vY2hhLnJlcG9ydGVyc1xuICogQGV4dGVuZHMgTW9jaGEucmVwb3J0ZXJzLkJhc2VcbiAqIEBwYXJhbSB7UnVubmVyfSBydW5uZXIgLSBJbnN0YW5jZSB0cmlnZ2VycyByZXBvcnRlciBhY3Rpb25zLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIHJ1bm5lciBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIE55YW5DYXQocnVubmVyLCBvcHRpb25zKSB7XG4gIEJhc2UuY2FsbCh0aGlzLCBydW5uZXIsIG9wdGlvbnMpO1xuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHdpZHRoID0gKEJhc2Uud2luZG93LndpZHRoICogMC43NSkgfCAwO1xuICB2YXIgbnlhbkNhdFdpZHRoID0gKHRoaXMubnlhbkNhdFdpZHRoID0gMTEpO1xuXG4gIHRoaXMuY29sb3JJbmRleCA9IDA7XG4gIHRoaXMubnVtYmVyT2ZMaW5lcyA9IDQ7XG4gIHRoaXMucmFpbmJvd0NvbG9ycyA9IHNlbGYuZ2VuZXJhdGVDb2xvcnMoKTtcbiAgdGhpcy5zY29yZWJvYXJkV2lkdGggPSA1O1xuICB0aGlzLnRpY2sgPSAwO1xuICB0aGlzLnRyYWplY3RvcmllcyA9IFtbXSwgW10sIFtdLCBbXV07XG4gIHRoaXMudHJhamVjdG9yeVdpZHRoTWF4ID0gd2lkdGggLSBueWFuQ2F0V2lkdGg7XG5cbiAgcnVubmVyLm9uKEVWRU5UX1JVTl9CRUdJTiwgZnVuY3Rpb24gKCkge1xuICAgIEJhc2UuY3Vyc29yLmhpZGUoKTtcbiAgICBzZWxmLmRyYXcoKTtcbiAgfSk7XG5cbiAgcnVubmVyLm9uKEVWRU5UX1RFU1RfUEVORElORywgZnVuY3Rpb24gKCkge1xuICAgIHNlbGYuZHJhdygpO1xuICB9KTtcblxuICBydW5uZXIub24oRVZFTlRfVEVTVF9QQVNTLCBmdW5jdGlvbiAoKSB7XG4gICAgc2VsZi5kcmF3KCk7XG4gIH0pO1xuXG4gIHJ1bm5lci5vbihFVkVOVF9URVNUX0ZBSUwsIGZ1bmN0aW9uICgpIHtcbiAgICBzZWxmLmRyYXcoKTtcbiAgfSk7XG5cbiAgcnVubmVyLm9uY2UoRVZFTlRfUlVOX0VORCwgZnVuY3Rpb24gKCkge1xuICAgIEJhc2UuY3Vyc29yLnNob3coKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYubnVtYmVyT2ZMaW5lczsgaSsrKSB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gICAgfVxuICAgIHNlbGYuZXBpbG9ndWUoKTtcbiAgfSk7XG59XG5cbi8qKlxuICogSW5oZXJpdCBmcm9tIGBCYXNlLnByb3RvdHlwZWAuXG4gKi9cbmluaGVyaXRzKE55YW5DYXQsIEJhc2UpO1xuXG4vKipcbiAqIERyYXcgdGhlIG55YW4gY2F0XG4gKlxuICogQHByaXZhdGVcbiAqL1xuXG5OeWFuQ2F0LnByb3RvdHlwZS5kcmF3ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmFwcGVuZFJhaW5ib3coKTtcbiAgdGhpcy5kcmF3U2NvcmVib2FyZCgpO1xuICB0aGlzLmRyYXdSYWluYm93KCk7XG4gIHRoaXMuZHJhd055YW5DYXQoKTtcbiAgdGhpcy50aWNrID0gIXRoaXMudGljaztcbn07XG5cbi8qKlxuICogRHJhdyB0aGUgXCJzY29yZWJvYXJkXCIgc2hvd2luZyB0aGUgbnVtYmVyXG4gKiBvZiBwYXNzZXMsIGZhaWx1cmVzIGFuZCBwZW5kaW5nIHRlc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cblxuTnlhbkNhdC5wcm90b3R5cGUuZHJhd1Njb3JlYm9hcmQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0cyA9IHRoaXMuc3RhdHM7XG5cbiAgZnVuY3Rpb24gZHJhdyh0eXBlLCBuKSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyAnKTtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShCYXNlLmNvbG9yKHR5cGUsIG4pKTtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gIH1cblxuICBkcmF3KCdncmVlbicsIHN0YXRzLnBhc3Nlcyk7XG4gIGRyYXcoJ2ZhaWwnLCBzdGF0cy5mYWlsdXJlcyk7XG4gIGRyYXcoJ3BlbmRpbmcnLCBzdGF0cy5wZW5kaW5nKTtcbiAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuXG4gIHRoaXMuY3Vyc29yVXAodGhpcy5udW1iZXJPZkxpbmVzKTtcbn07XG5cbi8qKlxuICogQXBwZW5kIHRoZSByYWluYm93LlxuICpcbiAqIEBwcml2YXRlXG4gKi9cblxuTnlhbkNhdC5wcm90b3R5cGUuYXBwZW5kUmFpbmJvdyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlZ21lbnQgPSB0aGlzLnRpY2sgPyAnXycgOiAnLSc7XG4gIHZhciByYWluYm93aWZpZWQgPSB0aGlzLnJhaW5ib3dpZnkoc2VnbWVudCk7XG5cbiAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMubnVtYmVyT2ZMaW5lczsgaW5kZXgrKykge1xuICAgIHZhciB0cmFqZWN0b3J5ID0gdGhpcy50cmFqZWN0b3JpZXNbaW5kZXhdO1xuICAgIGlmICh0cmFqZWN0b3J5Lmxlbmd0aCA+PSB0aGlzLnRyYWplY3RvcnlXaWR0aE1heCkge1xuICAgICAgdHJhamVjdG9yeS5zaGlmdCgpO1xuICAgIH1cbiAgICB0cmFqZWN0b3J5LnB1c2gocmFpbmJvd2lmaWVkKTtcbiAgfVxufTtcblxuLyoqXG4gKiBEcmF3IHRoZSByYWluYm93LlxuICpcbiAqIEBwcml2YXRlXG4gKi9cblxuTnlhbkNhdC5wcm90b3R5cGUuZHJhd1JhaW5ib3cgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICB0aGlzLnRyYWplY3Rvcmllcy5mb3JFYWNoKGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcdTAwMWJbJyArIHNlbGYuc2NvcmVib2FyZFdpZHRoICsgJ0MnKTtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShsaW5lLmpvaW4oJycpKTtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gIH0pO1xuXG4gIHRoaXMuY3Vyc29yVXAodGhpcy5udW1iZXJPZkxpbmVzKTtcbn07XG5cbi8qKlxuICogRHJhdyB0aGUgbnlhbiBjYXRcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5OeWFuQ2F0LnByb3RvdHlwZS5kcmF3TnlhbkNhdCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgc3RhcnRXaWR0aCA9IHRoaXMuc2NvcmVib2FyZFdpZHRoICsgdGhpcy50cmFqZWN0b3JpZXNbMF0ubGVuZ3RoO1xuICB2YXIgZGlzdCA9ICdcXHUwMDFiWycgKyBzdGFydFdpZHRoICsgJ0MnO1xuICB2YXIgcGFkZGluZyA9ICcnO1xuXG4gIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGRpc3QpO1xuICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXywtLS0tLS0sJyk7XG4gIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcblxuICBwcm9jZXNzLnN0ZG91dC53cml0ZShkaXN0KTtcbiAgcGFkZGluZyA9IHNlbGYudGljayA/ICcgICcgOiAnICAgJztcbiAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ198JyArIHBhZGRpbmcgKyAnL1xcXFxfL1xcXFwgJyk7XG4gIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcblxuICBwcm9jZXNzLnN0ZG91dC53cml0ZShkaXN0KTtcbiAgcGFkZGluZyA9IHNlbGYudGljayA/ICdfJyA6ICdfXyc7XG4gIHZhciB0YWlsID0gc2VsZi50aWNrID8gJ34nIDogJ14nO1xuICBwcm9jZXNzLnN0ZG91dC53cml0ZSh0YWlsICsgJ3wnICsgcGFkZGluZyArIHRoaXMuZmFjZSgpICsgJyAnKTtcbiAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuXG4gIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGRpc3QpO1xuICBwYWRkaW5nID0gc2VsZi50aWNrID8gJyAnIDogJyAgJztcbiAgcHJvY2Vzcy5zdGRvdXQud3JpdGUocGFkZGluZyArICdcIlwiICBcIlwiICcpO1xuICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG5cbiAgdGhpcy5jdXJzb3JVcCh0aGlzLm51bWJlck9mTGluZXMpO1xufTtcblxuLyoqXG4gKiBEcmF3IG55YW4gY2F0IGZhY2UuXG4gKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuXG5OeWFuQ2F0LnByb3RvdHlwZS5mYWNlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdHMgPSB0aGlzLnN0YXRzO1xuICBpZiAoc3RhdHMuZmFpbHVyZXMpIHtcbiAgICByZXR1cm4gJyggeCAueCknO1xuICB9IGVsc2UgaWYgKHN0YXRzLnBlbmRpbmcpIHtcbiAgICByZXR1cm4gJyggbyAubyknO1xuICB9IGVsc2UgaWYgKHN0YXRzLnBhc3Nlcykge1xuICAgIHJldHVybiAnKCBeIC5eKSc7XG4gIH1cbiAgcmV0dXJuICcoIC0gLi0pJztcbn07XG5cbi8qKlxuICogTW92ZSBjdXJzb3IgdXAgYG5gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge251bWJlcn0gblxuICovXG5cbk55YW5DYXQucHJvdG90eXBlLmN1cnNvclVwID0gZnVuY3Rpb24gKG4pIHtcbiAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcdTAwMWJbJyArIG4gKyAnQScpO1xufTtcblxuLyoqXG4gKiBNb3ZlIGN1cnNvciBkb3duIGBuYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IG5cbiAqL1xuXG5OeWFuQ2F0LnByb3RvdHlwZS5jdXJzb3JEb3duID0gZnVuY3Rpb24gKG4pIHtcbiAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcdTAwMWJbJyArIG4gKyAnQicpO1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZSByYWluYm93IGNvbG9ycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbk55YW5DYXQucHJvdG90eXBlLmdlbmVyYXRlQ29sb3JzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgY29sb3JzID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCA2ICogNzsgaSsrKSB7XG4gICAgdmFyIHBpMyA9IE1hdGguZmxvb3IoTWF0aC5QSSAvIDMpO1xuICAgIHZhciBuID0gaSAqICgxLjAgLyA2KTtcbiAgICB2YXIgciA9IE1hdGguZmxvb3IoMyAqIE1hdGguc2luKG4pICsgMyk7XG4gICAgdmFyIGcgPSBNYXRoLmZsb29yKDMgKiBNYXRoLnNpbihuICsgMiAqIHBpMykgKyAzKTtcbiAgICB2YXIgYiA9IE1hdGguZmxvb3IoMyAqIE1hdGguc2luKG4gKyA0ICogcGkzKSArIDMpO1xuICAgIGNvbG9ycy5wdXNoKDM2ICogciArIDYgKiBnICsgYiArIDE2KTtcbiAgfVxuXG4gIHJldHVybiBjb2xvcnM7XG59O1xuXG4vKipcbiAqIEFwcGx5IHJhaW5ib3cgdG8gdGhlIGdpdmVuIGBzdHJgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbk55YW5DYXQucHJvdG90eXBlLnJhaW5ib3dpZnkgPSBmdW5jdGlvbiAoc3RyKSB7XG4gIGlmICghQmFzZS51c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG4gIHZhciBjb2xvciA9IHRoaXMucmFpbmJvd0NvbG9yc1t0aGlzLmNvbG9ySW5kZXggJSB0aGlzLnJhaW5ib3dDb2xvcnMubGVuZ3RoXTtcbiAgdGhpcy5jb2xvckluZGV4ICs9IDE7XG4gIHJldHVybiAnXFx1MDAxYlszODs1OycgKyBjb2xvciArICdtJyArIHN0ciArICdcXHUwMDFiWzBtJztcbn07XG5cbk55YW5DYXQuZGVzY3JpcHRpb24gPSAnXCJueWFuIGNhdFwiJztcbiIsICIndXNlIHN0cmljdCc7XG4vKipcbiAqIEBtb2R1bGUgWFVuaXRcbiAqL1xuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICovXG5cbnZhciBCYXNlID0gcmVxdWlyZSgnLi9iYXNlJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIGZzID0gcmVxdWlyZSgnbm9kZTpmcycpO1xudmFyIHBhdGggPSByZXF1aXJlKCdub2RlOnBhdGgnKTtcbnZhciBlcnJvcnMgPSByZXF1aXJlKCcuLi9lcnJvcnMnKTtcbnZhciBjcmVhdGVVbnN1cHBvcnRlZEVycm9yID0gZXJyb3JzLmNyZWF0ZVVuc3VwcG9ydGVkRXJyb3I7XG52YXIgY29uc3RhbnRzID0gcmVxdWlyZSgnLi4vcnVubmVyJykuY29uc3RhbnRzO1xudmFyIEVWRU5UX1RFU1RfUEFTUyA9IGNvbnN0YW50cy5FVkVOVF9URVNUX1BBU1M7XG52YXIgRVZFTlRfVEVTVF9GQUlMID0gY29uc3RhbnRzLkVWRU5UX1RFU1RfRkFJTDtcbnZhciBFVkVOVF9SVU5fRU5EID0gY29uc3RhbnRzLkVWRU5UX1JVTl9FTkQ7XG52YXIgRVZFTlRfVEVTVF9QRU5ESU5HID0gY29uc3RhbnRzLkVWRU5UX1RFU1RfUEVORElORztcbnZhciBTVEFURV9GQUlMRUQgPSByZXF1aXJlKCcuLi9ydW5uYWJsZScpLmNvbnN0YW50cy5TVEFURV9GQUlMRUQ7XG52YXIgaW5oZXJpdHMgPSB1dGlscy5pbmhlcml0cztcbnZhciBlc2NhcGUgPSB1dGlscy5lc2NhcGU7XG5cbi8qKlxuICogU2F2ZSB0aW1lciByZWZlcmVuY2VzIHRvIGF2b2lkIFNpbm9uIGludGVyZmVyaW5nIChzZWUgR0gtMjM3KS5cbiAqL1xudmFyIERhdGUgPSBnbG9iYWwuRGF0ZTtcblxuLyoqXG4gKiBFeHBvc2UgYFhVbml0YC5cbiAqL1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBYVW5pdDtcblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgbmV3IGBYVW5pdGAgcmVwb3J0ZXIgaW5zdGFuY2UuXG4gKlxuICogQHB1YmxpY1xuICogQGNsYXNzXG4gKiBAbWVtYmVyb2YgTW9jaGEucmVwb3J0ZXJzXG4gKiBAZXh0ZW5kcyBNb2NoYS5yZXBvcnRlcnMuQmFzZVxuICogQHBhcmFtIHtSdW5uZXJ9IHJ1bm5lciAtIEluc3RhbmNlIHRyaWdnZXJzIHJlcG9ydGVyIGFjdGlvbnMuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gcnVubmVyIG9wdGlvbnNcbiAqL1xuZnVuY3Rpb24gWFVuaXQocnVubmVyLCBvcHRpb25zKSB7XG4gIEJhc2UuY2FsbCh0aGlzLCBydW5uZXIsIG9wdGlvbnMpO1xuXG4gIHZhciBzdGF0cyA9IHRoaXMuc3RhdHM7XG4gIHZhciB0ZXN0cyA9IFtdO1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgLy8gdGhlIG5hbWUgb2YgdGhlIHRlc3Qgc3VpdGUsIGFzIGl0IHdpbGwgYXBwZWFyIGluIHRoZSByZXN1bHRpbmcgWE1MIGZpbGVcbiAgdmFyIHN1aXRlTmFtZTtcblxuICAvLyB0aGUgZGVmYXVsdCBuYW1lIG9mIHRoZSB0ZXN0IHN1aXRlIGlmIG5vbmUgaXMgcHJvdmlkZWRcbiAgdmFyIERFRkFVTFRfU1VJVEVfTkFNRSA9ICdNb2NoYSBUZXN0cyc7XG5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5yZXBvcnRlck9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5yZXBvcnRlck9wdGlvbnMub3V0cHV0KSB7XG4gICAgICBpZiAoIWZzLmNyZWF0ZVdyaXRlU3RyZWFtKSB7XG4gICAgICAgIHRocm93IGNyZWF0ZVVuc3VwcG9ydGVkRXJyb3IoJ2ZpbGUgb3V0cHV0IG5vdCBzdXBwb3J0ZWQgaW4gYnJvd3NlcicpO1xuICAgICAgfVxuXG4gICAgICBmcy5ta2RpclN5bmMocGF0aC5kaXJuYW1lKG9wdGlvbnMucmVwb3J0ZXJPcHRpb25zLm91dHB1dCksIHtcbiAgICAgICAgcmVjdXJzaXZlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHNlbGYuZmlsZVN0cmVhbSA9IGZzLmNyZWF0ZVdyaXRlU3RyZWFtKG9wdGlvbnMucmVwb3J0ZXJPcHRpb25zLm91dHB1dCk7XG4gICAgfVxuXG4gICAgLy8gZ2V0IHRoZSBzdWl0ZSBuYW1lIGZyb20gdGhlIHJlcG9ydGVyIG9wdGlvbnMgKGlmIHByb3ZpZGVkKVxuICAgIHN1aXRlTmFtZSA9IG9wdGlvbnMucmVwb3J0ZXJPcHRpb25zLnN1aXRlTmFtZTtcbiAgfVxuXG4gIC8vIGZhbGwgYmFjayB0byB0aGUgZGVmYXVsdCBzdWl0ZSBuYW1lXG4gIHN1aXRlTmFtZSA9IHN1aXRlTmFtZSB8fCBERUZBVUxUX1NVSVRFX05BTUU7XG5cbiAgcnVubmVyLm9uKEVWRU5UX1RFU1RfUEVORElORywgZnVuY3Rpb24gKHRlc3QpIHtcbiAgICB0ZXN0cy5wdXNoKHRlc3QpO1xuICB9KTtcblxuICBydW5uZXIub24oRVZFTlRfVEVTVF9QQVNTLCBmdW5jdGlvbiAodGVzdCkge1xuICAgIHRlc3RzLnB1c2godGVzdCk7XG4gIH0pO1xuXG4gIHJ1bm5lci5vbihFVkVOVF9URVNUX0ZBSUwsIGZ1bmN0aW9uICh0ZXN0KSB7XG4gICAgdGVzdHMucHVzaCh0ZXN0KTtcbiAgfSk7XG5cbiAgcnVubmVyLm9uY2UoRVZFTlRfUlVOX0VORCwgZnVuY3Rpb24gKCkge1xuICAgIHNlbGYud3JpdGUoXG4gICAgICB0YWcoXG4gICAgICAgICd0ZXN0c3VpdGUnLFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogc3VpdGVOYW1lLFxuICAgICAgICAgIHRlc3RzOiBzdGF0cy50ZXN0cyxcbiAgICAgICAgICBmYWlsdXJlczogMCxcbiAgICAgICAgICBlcnJvcnM6IHN0YXRzLmZhaWx1cmVzLFxuICAgICAgICAgIHNraXBwZWQ6IHN0YXRzLnRlc3RzIC0gc3RhdHMuZmFpbHVyZXMgLSBzdGF0cy5wYXNzZXMsXG4gICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvVVRDU3RyaW5nKCksXG4gICAgICAgICAgdGltZTogc3RhdHMuZHVyYXRpb24gLyAxMDAwIHx8IDBcbiAgICAgICAgfSxcbiAgICAgICAgZmFsc2VcbiAgICAgIClcbiAgICApO1xuXG4gICAgdGVzdHMuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgc2VsZi50ZXN0KHQsIG9wdGlvbnMpO1xuICAgIH0pO1xuXG4gICAgc2VsZi53cml0ZSgnPC90ZXN0c3VpdGU+Jyk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEluaGVyaXQgZnJvbSBgQmFzZS5wcm90b3R5cGVgLlxuICovXG5pbmhlcml0cyhYVW5pdCwgQmFzZSk7XG5cbi8qKlxuICogT3ZlcnJpZGUgZG9uZSB0byBjbG9zZSB0aGUgc3RyZWFtIChpZiBpdCdzIGEgZmlsZSkuXG4gKlxuICogQHBhcmFtIGZhaWx1cmVzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICovXG5YVW5pdC5wcm90b3R5cGUuZG9uZSA9IGZ1bmN0aW9uIChmYWlsdXJlcywgZm4pIHtcbiAgaWYgKHRoaXMuZmlsZVN0cmVhbSkge1xuICAgIHRoaXMuZmlsZVN0cmVhbS5lbmQoZnVuY3Rpb24gKCkge1xuICAgICAgZm4oZmFpbHVyZXMpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGZuKGZhaWx1cmVzKTtcbiAgfVxufTtcblxuLyoqXG4gKiBXcml0ZSBvdXQgdGhlIGdpdmVuIGxpbmUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGxpbmVcbiAqL1xuWFVuaXQucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGxpbmUpIHtcbiAgaWYgKHRoaXMuZmlsZVN0cmVhbSkge1xuICAgIHRoaXMuZmlsZVN0cmVhbS53cml0ZShsaW5lICsgJ1xcbicpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJiBwcm9jZXNzLnN0ZG91dCkge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGxpbmUgKyAnXFxuJyk7XG4gIH0gZWxzZSB7XG4gICAgQmFzZS5jb25zb2xlTG9nKGxpbmUpO1xuICB9XG59O1xuXG4vKipcbiAqIE91dHB1dCB0YWcgZm9yIHRoZSBnaXZlbiBgdGVzdC5gXG4gKlxuICogQHBhcmFtIHtUZXN0fSB0ZXN0XG4gKi9cblhVbml0LnByb3RvdHlwZS50ZXN0ID0gZnVuY3Rpb24gKHRlc3QsIG9wdGlvbnMpIHtcbiAgQmFzZS51c2VDb2xvcnMgPSBmYWxzZTtcblxuICB2YXIgYXR0cnMgPSB7XG4gICAgY2xhc3NuYW1lOiB0ZXN0LnBhcmVudC5mdWxsVGl0bGUoKSxcbiAgICBuYW1lOiB0ZXN0LnRpdGxlLFxuICAgIGZpbGU6IHRlc3RGaWxlUGF0aCh0ZXN0LmZpbGUsIG9wdGlvbnMpLFxuICAgIHRpbWU6IHRlc3QuZHVyYXRpb24gLyAxMDAwIHx8IDBcbiAgfTtcblxuICBpZiAodGVzdC5zdGF0ZSA9PT0gU1RBVEVfRkFJTEVEKSB7XG4gICAgdmFyIGVyciA9IHRlc3QuZXJyO1xuICAgIHZhciBkaWZmID1cbiAgICAgICFCYXNlLmhpZGVEaWZmICYmIEJhc2Uuc2hvd0RpZmYoZXJyKVxuICAgICAgICA/ICdcXG4nICsgQmFzZS5nZW5lcmF0ZURpZmYoZXJyLmFjdHVhbCwgZXJyLmV4cGVjdGVkKVxuICAgICAgICA6ICcnO1xuICAgIHRoaXMud3JpdGUoXG4gICAgICB0YWcoXG4gICAgICAgICd0ZXN0Y2FzZScsXG4gICAgICAgIGF0dHJzLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgdGFnKFxuICAgICAgICAgICdmYWlsdXJlJyxcbiAgICAgICAgICB7fSxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBlc2NhcGUoZXJyLm1lc3NhZ2UpICsgZXNjYXBlKGRpZmYpICsgJ1xcbicgKyBlc2NhcGUoZXJyLnN0YWNrKVxuICAgICAgICApXG4gICAgICApXG4gICAgKTtcbiAgfSBlbHNlIGlmICh0ZXN0LmlzUGVuZGluZygpKSB7XG4gICAgdGhpcy53cml0ZSh0YWcoJ3Rlc3RjYXNlJywgYXR0cnMsIGZhbHNlLCB0YWcoJ3NraXBwZWQnLCB7fSwgdHJ1ZSkpKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLndyaXRlKHRhZygndGVzdGNhc2UnLCBhdHRycywgdHJ1ZSkpO1xuICB9XG59O1xuXG4vKipcbiAqIEhUTUwgdGFnIGhlbHBlci5cbiAqXG4gKiBAcGFyYW0gbmFtZVxuICogQHBhcmFtIGF0dHJzXG4gKiBAcGFyYW0gY2xvc2VcbiAqIEBwYXJhbSBjb250ZW50XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHRhZyhuYW1lLCBhdHRycywgY2xvc2UsIGNvbnRlbnQpIHtcbiAgdmFyIGVuZCA9IGNsb3NlID8gJy8+JyA6ICc+JztcbiAgdmFyIHBhaXJzID0gW107XG4gIHZhciB0YWc7XG5cbiAgZm9yICh2YXIga2V5IGluIGF0dHJzKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhdHRycywga2V5KSkge1xuICAgICAgcGFpcnMucHVzaChrZXkgKyAnPVwiJyArIGVzY2FwZShhdHRyc1trZXldKSArICdcIicpO1xuICAgIH1cbiAgfVxuXG4gIHRhZyA9ICc8JyArIG5hbWUgKyAocGFpcnMubGVuZ3RoID8gJyAnICsgcGFpcnMuam9pbignICcpIDogJycpICsgZW5kO1xuICBpZiAoY29udGVudCkge1xuICAgIHRhZyArPSBjb250ZW50ICsgJzwvJyArIG5hbWUgKyBlbmQ7XG4gIH1cbiAgcmV0dXJuIHRhZztcbn1cblxuZnVuY3Rpb24gdGVzdEZpbGVQYXRoKGZpbGVwYXRoLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMucmVwb3J0ZXJPcHRpb25zICYmIG9wdGlvbnMucmVwb3J0ZXJPcHRpb25zLnNob3dSZWxhdGl2ZVBhdGhzKSB7XG4gICAgcmV0dXJuIHBhdGgucmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgZmlsZXBhdGgpO1xuICB9XG5cbiAgcmV0dXJuIGZpbGVwYXRoO1xufVxuXG5YVW5pdC5kZXNjcmlwdGlvbiA9ICdYVW5pdC1jb21wYXRpYmxlIFhNTCBvdXRwdXQnO1xuIiwgIid1c2Ugc3RyaWN0Jztcbi8qKlxuICogQG1vZHVsZSBNYXJrZG93blxuICovXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIEJhc2UgPSByZXF1aXJlKCcuL2Jhc2UnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgY29uc3RhbnRzID0gcmVxdWlyZSgnLi4vcnVubmVyJykuY29uc3RhbnRzO1xudmFyIEVWRU5UX1JVTl9FTkQgPSBjb25zdGFudHMuRVZFTlRfUlVOX0VORDtcbnZhciBFVkVOVF9TVUlURV9CRUdJTiA9IGNvbnN0YW50cy5FVkVOVF9TVUlURV9CRUdJTjtcbnZhciBFVkVOVF9TVUlURV9FTkQgPSBjb25zdGFudHMuRVZFTlRfU1VJVEVfRU5EO1xudmFyIEVWRU5UX1RFU1RfUEFTUyA9IGNvbnN0YW50cy5FVkVOVF9URVNUX1BBU1M7XG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxudmFyIFNVSVRFX1BSRUZJWCA9ICckJztcblxuLyoqXG4gKiBFeHBvc2UgYE1hcmtkb3duYC5cbiAqL1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBNYXJrZG93bjtcblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgbmV3IGBNYXJrZG93bmAgcmVwb3J0ZXIgaW5zdGFuY2UuXG4gKlxuICogQHB1YmxpY1xuICogQGNsYXNzXG4gKiBAbWVtYmVyb2YgTW9jaGEucmVwb3J0ZXJzXG4gKiBAZXh0ZW5kcyBNb2NoYS5yZXBvcnRlcnMuQmFzZVxuICogQHBhcmFtIHtSdW5uZXJ9IHJ1bm5lciAtIEluc3RhbmNlIHRyaWdnZXJzIHJlcG9ydGVyIGFjdGlvbnMuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gcnVubmVyIG9wdGlvbnNcbiAqL1xuZnVuY3Rpb24gTWFya2Rvd24ocnVubmVyLCBvcHRpb25zKSB7XG4gIEJhc2UuY2FsbCh0aGlzLCBydW5uZXIsIG9wdGlvbnMpO1xuXG4gIHZhciBsZXZlbCA9IDA7XG4gIHZhciBidWYgPSAnJztcblxuICBmdW5jdGlvbiB0aXRsZShzdHIpIHtcbiAgICByZXR1cm4gQXJyYXkobGV2ZWwpLmpvaW4oJyMnKSArICcgJyArIHN0cjtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1hcFRPQyhzdWl0ZSwgb2JqKSB7XG4gICAgdmFyIHJldCA9IG9iajtcbiAgICB2YXIga2V5ID0gU1VJVEVfUFJFRklYICsgc3VpdGUudGl0bGU7XG5cbiAgICBvYmogPSBvYmpba2V5XSA9IG9ialtrZXldIHx8IHtzdWl0ZX07XG4gICAgc3VpdGUuc3VpdGVzLmZvckVhY2goZnVuY3Rpb24gKHN1aXRlKSB7XG4gICAgICBtYXBUT0Moc3VpdGUsIG9iaik7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgZnVuY3Rpb24gc3RyaW5naWZ5VE9DKG9iaiwgbGV2ZWwpIHtcbiAgICArK2xldmVsO1xuICAgIHZhciBidWYgPSAnJztcbiAgICB2YXIgbGluaztcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICBpZiAoa2V5ID09PSAnc3VpdGUnKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGtleSAhPT0gU1VJVEVfUFJFRklYKSB7XG4gICAgICAgIGxpbmsgPSAnIC0gWycgKyBrZXkuc3Vic3RyaW5nKDEpICsgJ10nO1xuICAgICAgICBsaW5rICs9ICcoIycgKyB1dGlscy5zbHVnKG9ialtrZXldLnN1aXRlLmZ1bGxUaXRsZSgpKSArICcpXFxuJztcbiAgICAgICAgYnVmICs9IEFycmF5KGxldmVsKS5qb2luKCcgICcpICsgbGluaztcbiAgICAgIH1cbiAgICAgIGJ1ZiArPSBzdHJpbmdpZnlUT0Mob2JqW2tleV0sIGxldmVsKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1ZjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdlbmVyYXRlVE9DKHN1aXRlKSB7XG4gICAgdmFyIG9iaiA9IG1hcFRPQyhzdWl0ZSwge30pO1xuICAgIHJldHVybiBzdHJpbmdpZnlUT0Mob2JqLCAwKTtcbiAgfVxuXG4gIGdlbmVyYXRlVE9DKHJ1bm5lci5zdWl0ZSk7XG5cbiAgcnVubmVyLm9uKEVWRU5UX1NVSVRFX0JFR0lOLCBmdW5jdGlvbiAoc3VpdGUpIHtcbiAgICArK2xldmVsO1xuICAgIHZhciBzbHVnID0gdXRpbHMuc2x1ZyhzdWl0ZS5mdWxsVGl0bGUoKSk7XG4gICAgYnVmICs9ICc8YSBuYW1lPVwiJyArIHNsdWcgKyAnXCI+PC9hPicgKyAnXFxuJztcbiAgICBidWYgKz0gdGl0bGUoc3VpdGUudGl0bGUpICsgJ1xcbic7XG4gIH0pO1xuXG4gIHJ1bm5lci5vbihFVkVOVF9TVUlURV9FTkQsIGZ1bmN0aW9uICgpIHtcbiAgICAtLWxldmVsO1xuICB9KTtcblxuICBydW5uZXIub24oRVZFTlRfVEVTVF9QQVNTLCBmdW5jdGlvbiAodGVzdCkge1xuICAgIHZhciBjb2RlID0gdXRpbHMuY2xlYW4odGVzdC5ib2R5KTtcbiAgICBidWYgKz0gdGVzdC50aXRsZSArICcuXFxuJztcbiAgICBidWYgKz0gJ1xcbmBgYGpzXFxuJztcbiAgICBidWYgKz0gY29kZSArICdcXG4nO1xuICAgIGJ1ZiArPSAnYGBgXFxuXFxuJztcbiAgfSk7XG5cbiAgcnVubmVyLm9uY2UoRVZFTlRfUlVOX0VORCwgZnVuY3Rpb24gKCkge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcjIFRPQ1xcbicpO1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGdlbmVyYXRlVE9DKHJ1bm5lci5zdWl0ZSkpO1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGJ1Zik7XG4gIH0pO1xufVxuXG5NYXJrZG93bi5kZXNjcmlwdGlvbiA9ICdHaXRIdWIgRmxhdm9yZWQgTWFya2Rvd24nO1xuIiwgIid1c2Ugc3RyaWN0Jztcbi8qKlxuICogQG1vZHVsZSBQcm9ncmVzc1xuICovXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIEJhc2UgPSByZXF1aXJlKCcuL2Jhc2UnKTtcbnZhciBjb25zdGFudHMgPSByZXF1aXJlKCcuLi9ydW5uZXInKS5jb25zdGFudHM7XG52YXIgRVZFTlRfUlVOX0JFR0lOID0gY29uc3RhbnRzLkVWRU5UX1JVTl9CRUdJTjtcbnZhciBFVkVOVF9URVNUX0VORCA9IGNvbnN0YW50cy5FVkVOVF9URVNUX0VORDtcbnZhciBFVkVOVF9SVU5fRU5EID0gY29uc3RhbnRzLkVWRU5UX1JVTl9FTkQ7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCcuLi91dGlscycpLmluaGVyaXRzO1xudmFyIGNvbG9yID0gQmFzZS5jb2xvcjtcbnZhciBjdXJzb3IgPSBCYXNlLmN1cnNvcjtcblxuLyoqXG4gKiBFeHBvc2UgYFByb2dyZXNzYC5cbiAqL1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBQcm9ncmVzcztcblxuLyoqXG4gKiBHZW5lcmFsIHByb2dyZXNzIGJhciBjb2xvci5cbiAqL1xuXG5CYXNlLmNvbG9ycy5wcm9ncmVzcyA9IDkwO1xuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBuZXcgYFByb2dyZXNzYCByZXBvcnRlciBpbnN0YW5jZS5cbiAqXG4gKiBAcHVibGljXG4gKiBAY2xhc3NcbiAqIEBtZW1iZXJvZiBNb2NoYS5yZXBvcnRlcnNcbiAqIEBleHRlbmRzIE1vY2hhLnJlcG9ydGVycy5CYXNlXG4gKiBAcGFyYW0ge1J1bm5lcn0gcnVubmVyIC0gSW5zdGFuY2UgdHJpZ2dlcnMgcmVwb3J0ZXIgYWN0aW9ucy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBydW5uZXIgb3B0aW9uc1xuICovXG5mdW5jdGlvbiBQcm9ncmVzcyhydW5uZXIsIG9wdGlvbnMpIHtcbiAgQmFzZS5jYWxsKHRoaXMsIHJ1bm5lciwgb3B0aW9ucyk7XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgd2lkdGggPSAoQmFzZS53aW5kb3cud2lkdGggKiAwLjUpIHwgMDtcbiAgdmFyIHRvdGFsID0gcnVubmVyLnRvdGFsO1xuICB2YXIgY29tcGxldGUgPSAwO1xuICB2YXIgbGFzdE4gPSAtMTtcblxuICAvLyBkZWZhdWx0IGNoYXJzXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgcmVwb3J0ZXJPcHRpb25zID0gb3B0aW9ucy5yZXBvcnRlck9wdGlvbnMgfHwge307XG5cbiAgb3B0aW9ucy5vcGVuID0gcmVwb3J0ZXJPcHRpb25zLm9wZW4gfHwgJ1snO1xuICBvcHRpb25zLmNvbXBsZXRlID0gcmVwb3J0ZXJPcHRpb25zLmNvbXBsZXRlIHx8ICfilqwnO1xuICBvcHRpb25zLmluY29tcGxldGUgPSByZXBvcnRlck9wdGlvbnMuaW5jb21wbGV0ZSB8fCBCYXNlLnN5bWJvbHMuZG90O1xuICBvcHRpb25zLmNsb3NlID0gcmVwb3J0ZXJPcHRpb25zLmNsb3NlIHx8ICddJztcbiAgb3B0aW9ucy52ZXJib3NlID0gcmVwb3J0ZXJPcHRpb25zLnZlcmJvc2UgfHwgZmFsc2U7XG5cbiAgLy8gdGVzdHMgc3RhcnRlZFxuICBydW5uZXIub24oRVZFTlRfUlVOX0JFR0lOLCBmdW5jdGlvbiAoKSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICAgIGN1cnNvci5oaWRlKCk7XG4gIH0pO1xuXG4gIC8vIHRlc3RzIGNvbXBsZXRlXG4gIHJ1bm5lci5vbihFVkVOVF9URVNUX0VORCwgZnVuY3Rpb24gKCkge1xuICAgIGNvbXBsZXRlKys7XG5cbiAgICB2YXIgcGVyY2VudCA9IGNvbXBsZXRlIC8gdG90YWw7XG4gICAgdmFyIG4gPSAod2lkdGggKiBwZXJjZW50KSB8IDA7XG4gICAgdmFyIGkgPSB3aWR0aCAtIG47XG5cbiAgICBpZiAobiA9PT0gbGFzdE4gJiYgIW9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgLy8gRG9uJ3QgcmUtcmVuZGVyIHRoZSBsaW5lIGlmIGl0IGhhc24ndCBjaGFuZ2VkXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxhc3ROID0gbjtcblxuICAgIGN1cnNvci5DUigpO1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXHUwMDFiW0onKTtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShjb2xvcigncHJvZ3Jlc3MnLCAnICAnICsgb3B0aW9ucy5vcGVuKSk7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoQXJyYXkobikuam9pbihvcHRpb25zLmNvbXBsZXRlKSk7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoQXJyYXkoaSkuam9pbihvcHRpb25zLmluY29tcGxldGUpKTtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShjb2xvcigncHJvZ3Jlc3MnLCBvcHRpb25zLmNsb3NlKSk7XG4gICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoY29sb3IoJ3Byb2dyZXNzJywgJyAnICsgY29tcGxldGUgKyAnIG9mICcgKyB0b3RhbCkpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gdGVzdHMgYXJlIGNvbXBsZXRlLCBvdXRwdXQgc29tZSBzdGF0c1xuICAvLyBhbmQgdGhlIGZhaWx1cmVzIGlmIGFueVxuICBydW5uZXIub25jZShFVkVOVF9SVU5fRU5ELCBmdW5jdGlvbiAoKSB7XG4gICAgY3Vyc29yLnNob3coKTtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gICAgc2VsZi5lcGlsb2d1ZSgpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBJbmhlcml0IGZyb20gYEJhc2UucHJvdG90eXBlYC5cbiAqL1xuaW5oZXJpdHMoUHJvZ3Jlc3MsIEJhc2UpO1xuXG5Qcm9ncmVzcy5kZXNjcmlwdGlvbiA9ICdhIHByb2dyZXNzIGJhcic7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuLyoqXG4gKiBAbW9kdWxlIExhbmRpbmdcbiAqL1xuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICovXG5cbnZhciBCYXNlID0gcmVxdWlyZSgnLi9iYXNlJyk7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCcuLi91dGlscycpLmluaGVyaXRzO1xudmFyIGNvbnN0YW50cyA9IHJlcXVpcmUoJy4uL3J1bm5lcicpLmNvbnN0YW50cztcbnZhciBFVkVOVF9SVU5fQkVHSU4gPSBjb25zdGFudHMuRVZFTlRfUlVOX0JFR0lOO1xudmFyIEVWRU5UX1JVTl9FTkQgPSBjb25zdGFudHMuRVZFTlRfUlVOX0VORDtcbnZhciBFVkVOVF9URVNUX0VORCA9IGNvbnN0YW50cy5FVkVOVF9URVNUX0VORDtcbnZhciBTVEFURV9GQUlMRUQgPSByZXF1aXJlKCcuLi9ydW5uYWJsZScpLmNvbnN0YW50cy5TVEFURV9GQUlMRUQ7XG5cbnZhciBjdXJzb3IgPSBCYXNlLmN1cnNvcjtcbnZhciBjb2xvciA9IEJhc2UuY29sb3I7XG5cbi8qKlxuICogRXhwb3NlIGBMYW5kaW5nYC5cbiAqL1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBMYW5kaW5nO1xuXG4vKipcbiAqIEFpcnBsYW5lIGNvbG9yLlxuICovXG5cbkJhc2UuY29sb3JzLnBsYW5lID0gMDtcblxuLyoqXG4gKiBBaXJwbGFuZSBjcmFzaCBjb2xvci5cbiAqL1xuXG5CYXNlLmNvbG9yc1sncGxhbmUgY3Jhc2gnXSA9IDMxO1xuXG4vKipcbiAqIFJ1bndheSBjb2xvci5cbiAqL1xuXG5CYXNlLmNvbG9ycy5ydW53YXkgPSA5MDtcblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgbmV3IGBMYW5kaW5nYCByZXBvcnRlciBpbnN0YW5jZS5cbiAqXG4gKiBAcHVibGljXG4gKiBAY2xhc3NcbiAqIEBtZW1iZXJvZiBNb2NoYS5yZXBvcnRlcnNcbiAqIEBleHRlbmRzIE1vY2hhLnJlcG9ydGVycy5CYXNlXG4gKiBAcGFyYW0ge1J1bm5lcn0gcnVubmVyIC0gSW5zdGFuY2UgdHJpZ2dlcnMgcmVwb3J0ZXIgYWN0aW9ucy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBydW5uZXIgb3B0aW9uc1xuICovXG5mdW5jdGlvbiBMYW5kaW5nKHJ1bm5lciwgb3B0aW9ucykge1xuICBCYXNlLmNhbGwodGhpcywgcnVubmVyLCBvcHRpb25zKTtcblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciB3aWR0aCA9IChCYXNlLndpbmRvdy53aWR0aCAqIDAuNzUpIHwgMDtcbiAgdmFyIHN0cmVhbSA9IHByb2Nlc3Muc3Rkb3V0O1xuXG4gIHZhciBwbGFuZSA9IGNvbG9yKCdwbGFuZScsICfinIgnKTtcbiAgdmFyIGNyYXNoZWQgPSAtMTtcbiAgdmFyIG4gPSAwO1xuICB2YXIgdG90YWwgPSAwO1xuXG4gIGZ1bmN0aW9uIHJ1bndheSgpIHtcbiAgICB2YXIgYnVmID0gQXJyYXkod2lkdGgpLmpvaW4oJy0nKTtcbiAgICByZXR1cm4gJyAgJyArIGNvbG9yKCdydW53YXknLCBidWYpO1xuICB9XG5cbiAgcnVubmVyLm9uKEVWRU5UX1JVTl9CRUdJTiwgZnVuY3Rpb24gKCkge1xuICAgIHN0cmVhbS53cml0ZSgnXFxuXFxuXFxuICAnKTtcbiAgICBjdXJzb3IuaGlkZSgpO1xuICB9KTtcblxuICBydW5uZXIub24oRVZFTlRfVEVTVF9FTkQsIGZ1bmN0aW9uICh0ZXN0KSB7XG4gICAgLy8gY2hlY2sgaWYgdGhlIHBsYW5lIGNyYXNoZWRcbiAgICB2YXIgY29sID0gY3Jhc2hlZCA9PT0gLTEgPyAoKHdpZHRoICogKytuKSAvICsrdG90YWwpIHwgMCA6IGNyYXNoZWQ7XG4gICAgLy8gc2hvdyB0aGUgY3Jhc2hcbiAgICBpZiAodGVzdC5zdGF0ZSA9PT0gU1RBVEVfRkFJTEVEKSB7XG4gICAgICBwbGFuZSA9IGNvbG9yKCdwbGFuZSBjcmFzaCcsICfinIgnKTtcbiAgICAgIGNyYXNoZWQgPSBjb2w7XG4gICAgfVxuXG4gICAgLy8gcmVuZGVyIGxhbmRpbmcgc3RyaXBcbiAgICBzdHJlYW0ud3JpdGUoJ1xcdTAwMWJbJyArICh3aWR0aCArIDEpICsgJ0RcXHUwMDFiWzJBJyk7XG4gICAgc3RyZWFtLndyaXRlKHJ1bndheSgpKTtcbiAgICBzdHJlYW0ud3JpdGUoJ1xcbiAgJyk7XG4gICAgc3RyZWFtLndyaXRlKGNvbG9yKCdydW53YXknLCBBcnJheShjb2wpLmpvaW4oJ+KLhScpKSk7XG4gICAgc3RyZWFtLndyaXRlKHBsYW5lKTtcbiAgICBzdHJlYW0ud3JpdGUoY29sb3IoJ3J1bndheScsIEFycmF5KHdpZHRoIC0gY29sKS5qb2luKCfii4UnKSArICdcXG4nKSk7XG4gICAgc3RyZWFtLndyaXRlKHJ1bndheSgpKTtcbiAgICBzdHJlYW0ud3JpdGUoJ1xcdTAwMWJbMG0nKTtcbiAgfSk7XG5cbiAgcnVubmVyLm9uY2UoRVZFTlRfUlVOX0VORCwgZnVuY3Rpb24gKCkge1xuICAgIGN1cnNvci5zaG93KCk7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICAgIHNlbGYuZXBpbG9ndWUoKTtcbiAgfSk7XG5cbiAgLy8gaWYgY3Vyc29yIGlzIGhpZGRlbiB3aGVuIHdlIGN0cmwtQywgdGhlbiBpdCB3aWxsIHJlbWFpbiBoaWRkZW4gdW5sZXNzLi4uXG4gIHByb2Nlc3Mub25jZSgnU0lHSU5UJywgZnVuY3Rpb24gKCkge1xuICAgIGN1cnNvci5zaG93KCk7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsICdTSUdJTlQnKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogSW5oZXJpdCBmcm9tIGBCYXNlLnByb3RvdHlwZWAuXG4gKi9cbmluaGVyaXRzKExhbmRpbmcsIEJhc2UpO1xuXG5MYW5kaW5nLmRlc2NyaXB0aW9uID0gJ1VuaWNvZGUgbGFuZGluZyBzdHJpcCc7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuLyoqXG4gKiBAbW9kdWxlIEpTT05TdHJlYW1cbiAqL1xuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICovXG5cbnZhciBCYXNlID0gcmVxdWlyZSgnLi9iYXNlJyk7XG52YXIgY29uc3RhbnRzID0gcmVxdWlyZSgnLi4vcnVubmVyJykuY29uc3RhbnRzO1xudmFyIEVWRU5UX1RFU1RfUEFTUyA9IGNvbnN0YW50cy5FVkVOVF9URVNUX1BBU1M7XG52YXIgRVZFTlRfVEVTVF9GQUlMID0gY29uc3RhbnRzLkVWRU5UX1RFU1RfRkFJTDtcbnZhciBFVkVOVF9SVU5fQkVHSU4gPSBjb25zdGFudHMuRVZFTlRfUlVOX0JFR0lOO1xudmFyIEVWRU5UX1JVTl9FTkQgPSBjb25zdGFudHMuRVZFTlRfUlVOX0VORDtcblxuLyoqXG4gKiBFeHBvc2UgYEpTT05TdHJlYW1gLlxuICovXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IEpTT05TdHJlYW07XG5cbi8qKlxuICogQ29uc3RydWN0cyBhIG5ldyBgSlNPTlN0cmVhbWAgcmVwb3J0ZXIgaW5zdGFuY2UuXG4gKlxuICogQHB1YmxpY1xuICogQGNsYXNzXG4gKiBAbWVtYmVyb2YgTW9jaGEucmVwb3J0ZXJzXG4gKiBAZXh0ZW5kcyBNb2NoYS5yZXBvcnRlcnMuQmFzZVxuICogQHBhcmFtIHtSdW5uZXJ9IHJ1bm5lciAtIEluc3RhbmNlIHRyaWdnZXJzIHJlcG9ydGVyIGFjdGlvbnMuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gcnVubmVyIG9wdGlvbnNcbiAqL1xuZnVuY3Rpb24gSlNPTlN0cmVhbShydW5uZXIsIG9wdGlvbnMpIHtcbiAgQmFzZS5jYWxsKHRoaXMsIHJ1bm5lciwgb3B0aW9ucyk7XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgdG90YWwgPSBydW5uZXIudG90YWw7XG5cbiAgcnVubmVyLm9uY2UoRVZFTlRfUlVOX0JFR0lOLCBmdW5jdGlvbiAoKSB7XG4gICAgd3JpdGVFdmVudChbJ3N0YXJ0Jywge3RvdGFsfV0pO1xuICB9KTtcblxuICBydW5uZXIub24oRVZFTlRfVEVTVF9QQVNTLCBmdW5jdGlvbiAodGVzdCkge1xuICAgIHdyaXRlRXZlbnQoWydwYXNzJywgY2xlYW4odGVzdCldKTtcbiAgfSk7XG5cbiAgcnVubmVyLm9uKEVWRU5UX1RFU1RfRkFJTCwgZnVuY3Rpb24gKHRlc3QsIGVycikge1xuICAgIHRlc3QgPSBjbGVhbih0ZXN0KTtcbiAgICB0ZXN0LmVyciA9IGVyci5tZXNzYWdlO1xuICAgIHRlc3Quc3RhY2sgPSBlcnIuc3RhY2sgfHwgbnVsbDtcbiAgICB3cml0ZUV2ZW50KFsnZmFpbCcsIHRlc3RdKTtcbiAgfSk7XG5cbiAgcnVubmVyLm9uY2UoRVZFTlRfUlVOX0VORCwgZnVuY3Rpb24gKCkge1xuICAgIHdyaXRlRXZlbnQoWydlbmQnLCBzZWxmLnN0YXRzXSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIE1vY2hhIGV2ZW50IHRvIGJlIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBzdHJlYW0uXG4gKiBAdHlwZWRlZiB7QXJyYXl9IEpTT05TdHJlYW1+TW9jaGFFdmVudFxuICovXG5cbi8qKlxuICogV3JpdGVzIE1vY2hhIGV2ZW50IHRvIHJlcG9ydGVyIG91dHB1dCBzdHJlYW0uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7SlNPTlN0cmVhbX5Nb2NoYUV2ZW50fSBldmVudCAtIE1vY2hhIGV2ZW50IHRvIGJlIG91dHB1dC5cbiAqL1xuZnVuY3Rpb24gd3JpdGVFdmVudChldmVudCkge1xuICBwcm9jZXNzLnN0ZG91dC53cml0ZShKU09OLnN0cmluZ2lmeShldmVudCkgKyAnXFxuJyk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhbiBvYmplY3QgbGl0ZXJhbCByZXByZXNlbnRhdGlvbiBvZiBgdGVzdGBcbiAqIGZyZWUgb2YgY3ljbGljIHByb3BlcnRpZXMsIGV0Yy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtUZXN0fSB0ZXN0IC0gSW5zdGFuY2UgdXNlZCBhcyBkYXRhIHNvdXJjZS5cbiAqIEByZXR1cm4ge09iamVjdH0gb2JqZWN0IGNvbnRhaW5pbmcgcGFyZWQtZG93biB0ZXN0IGluc3RhbmNlIGRhdGFcbiAqL1xuZnVuY3Rpb24gY2xlYW4odGVzdCkge1xuICByZXR1cm4ge1xuICAgIHRpdGxlOiB0ZXN0LnRpdGxlLFxuICAgIGZ1bGxUaXRsZTogdGVzdC5mdWxsVGl0bGUoKSxcbiAgICBmaWxlOiB0ZXN0LmZpbGUsXG4gICAgZHVyYXRpb246IHRlc3QuZHVyYXRpb24sXG4gICAgY3VycmVudFJldHJ5OiB0ZXN0LmN1cnJlbnRSZXRyeSgpLFxuICAgIHNwZWVkOiB0ZXN0LnNwZWVkXG4gIH07XG59XG5cbkpTT05TdHJlYW0uZGVzY3JpcHRpb24gPSAnbmV3bGluZSBkZWxpbWl0ZWQgSlNPTiBldmVudHMnO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLy8gQWxpYXMgZXhwb3J0cyB0byBhIHRoZWlyIG5vcm1hbGl6ZWQgZm9ybWF0IE1vY2hhI3JlcG9ydGVyIHRvIHByZXZlbnQgYSBuZWVkXG4vLyBmb3IgZHluYW1pYyAodHJ5L2NhdGNoKSByZXF1aXJlcywgd2hpY2ggQnJvd3NlcmlmeSBkb2Vzbid0IGhhbmRsZS5cbmV4cG9ydHMuQmFzZSA9IGV4cG9ydHMuYmFzZSA9IHJlcXVpcmUoJy4vYmFzZScpO1xuZXhwb3J0cy5Eb3QgPSBleHBvcnRzLmRvdCA9IHJlcXVpcmUoJy4vZG90Jyk7XG5leHBvcnRzLkRvYyA9IGV4cG9ydHMuZG9jID0gcmVxdWlyZSgnLi9kb2MnKTtcbmV4cG9ydHMuVEFQID0gZXhwb3J0cy50YXAgPSByZXF1aXJlKCcuL3RhcCcpO1xuZXhwb3J0cy5KU09OID0gZXhwb3J0cy5qc29uID0gcmVxdWlyZSgnLi9qc29uJyk7XG5leHBvcnRzLkhUTUwgPSBleHBvcnRzLmh0bWwgPSByZXF1aXJlKCcuL2h0bWwnKTtcbmV4cG9ydHMuTGlzdCA9IGV4cG9ydHMubGlzdCA9IHJlcXVpcmUoJy4vbGlzdCcpO1xuZXhwb3J0cy5NaW4gPSBleHBvcnRzLm1pbiA9IHJlcXVpcmUoJy4vbWluJyk7XG5leHBvcnRzLlNwZWMgPSBleHBvcnRzLnNwZWMgPSByZXF1aXJlKCcuL3NwZWMnKTtcbmV4cG9ydHMuTnlhbiA9IGV4cG9ydHMubnlhbiA9IHJlcXVpcmUoJy4vbnlhbicpO1xuZXhwb3J0cy5YVW5pdCA9IGV4cG9ydHMueHVuaXQgPSByZXF1aXJlKCcuL3h1bml0Jyk7XG5leHBvcnRzLk1hcmtkb3duID0gZXhwb3J0cy5tYXJrZG93biA9IHJlcXVpcmUoJy4vbWFya2Rvd24nKTtcbmV4cG9ydHMuUHJvZ3Jlc3MgPSBleHBvcnRzLnByb2dyZXNzID0gcmVxdWlyZSgnLi9wcm9ncmVzcycpO1xuZXhwb3J0cy5MYW5kaW5nID0gZXhwb3J0cy5sYW5kaW5nID0gcmVxdWlyZSgnLi9sYW5kaW5nJyk7XG5leHBvcnRzLkpTT05TdHJlYW0gPSBleHBvcnRzWydqc29uLXN0cmVhbSddID0gcmVxdWlyZSgnLi9qc29uLXN0cmVhbScpO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBQcm92aWRlcyBhIGZhY3RvcnkgZnVuY3Rpb24gZm9yIGEge0BsaW5rIFN0YXRzQ29sbGVjdG9yfSBvYmplY3QuXG4gKiBAbW9kdWxlXG4gKi9cblxudmFyIGNvbnN0YW50cyA9IHJlcXVpcmUoJy4vcnVubmVyJykuY29uc3RhbnRzO1xudmFyIEVWRU5UX1RFU1RfUEFTUyA9IGNvbnN0YW50cy5FVkVOVF9URVNUX1BBU1M7XG52YXIgRVZFTlRfVEVTVF9GQUlMID0gY29uc3RhbnRzLkVWRU5UX1RFU1RfRkFJTDtcbnZhciBFVkVOVF9TVUlURV9CRUdJTiA9IGNvbnN0YW50cy5FVkVOVF9TVUlURV9CRUdJTjtcbnZhciBFVkVOVF9SVU5fQkVHSU4gPSBjb25zdGFudHMuRVZFTlRfUlVOX0JFR0lOO1xudmFyIEVWRU5UX1RFU1RfUEVORElORyA9IGNvbnN0YW50cy5FVkVOVF9URVNUX1BFTkRJTkc7XG52YXIgRVZFTlRfUlVOX0VORCA9IGNvbnN0YW50cy5FVkVOVF9SVU5fRU5EO1xudmFyIEVWRU5UX1RFU1RfRU5EID0gY29uc3RhbnRzLkVWRU5UX1RFU1RfRU5EO1xuXG4vKipcbiAqIFRlc3Qgc3RhdGlzdGljcyBjb2xsZWN0b3IuXG4gKlxuICogQHB1YmxpY1xuICogQHR5cGVkZWYge09iamVjdH0gU3RhdHNDb2xsZWN0b3JcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzdWl0ZXMgLSBpbnRlZ2VyIGNvdW50IG9mIHN1aXRlcyBydW4uXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGVzdHMgLSBpbnRlZ2VyIGNvdW50IG9mIHRlc3RzIHJ1bi5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBwYXNzZXMgLSBpbnRlZ2VyIGNvdW50IG9mIHBhc3NpbmcgdGVzdHMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gcGVuZGluZyAtIGludGVnZXIgY291bnQgb2YgcGVuZGluZyB0ZXN0cy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBmYWlsdXJlcyAtIGludGVnZXIgY291bnQgb2YgZmFpbGVkIHRlc3RzLlxuICogQHByb3BlcnR5IHtEYXRlfSBzdGFydCAtIHRpbWUgd2hlbiB0ZXN0aW5nIGJlZ2FuLlxuICogQHByb3BlcnR5IHtEYXRlfSBlbmQgLSB0aW1lIHdoZW4gdGVzdGluZyBjb25jbHVkZWQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gZHVyYXRpb24gLSBudW1iZXIgb2YgbXNlY3MgdGhhdCB0ZXN0aW5nIHRvb2suXG4gKi9cblxudmFyIERhdGUgPSBnbG9iYWwuRGF0ZTtcblxuLyoqXG4gKiBQcm92aWRlcyBzdGF0cyBzdWNoIGFzIHRlc3QgZHVyYXRpb24sIG51bWJlciBvZiB0ZXN0cyBwYXNzZWQgLyBmYWlsZWQgZXRjLiwgYnkgbGlzdGVuaW5nIGZvciBldmVudHMgZW1pdHRlZCBieSBgcnVubmVyYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtSdW5uZXJ9IHJ1bm5lciAtIFJ1bm5lciBpbnN0YW5jZVxuICogQHRocm93cyB7VHlwZUVycm9yfSBJZiBmYWxzeSBgcnVubmVyYFxuICovXG5mdW5jdGlvbiBjcmVhdGVTdGF0c0NvbGxlY3RvcihydW5uZXIpIHtcbiAgLyoqXG4gICAqIEB0eXBlIFN0YXRzQ29sbGVjdG9yXG4gICAqL1xuICB2YXIgc3RhdHMgPSB7XG4gICAgc3VpdGVzOiAwLFxuICAgIHRlc3RzOiAwLFxuICAgIHBhc3NlczogMCxcbiAgICBwZW5kaW5nOiAwLFxuICAgIGZhaWx1cmVzOiAwXG4gIH07XG5cbiAgaWYgKCFydW5uZXIpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNaXNzaW5nIHJ1bm5lciBhcmd1bWVudCcpO1xuICB9XG5cbiAgcnVubmVyLnN0YXRzID0gc3RhdHM7XG5cbiAgcnVubmVyLm9uY2UoRVZFTlRfUlVOX0JFR0lOLCBmdW5jdGlvbiAoKSB7XG4gICAgc3RhdHMuc3RhcnQgPSBuZXcgRGF0ZSgpO1xuICB9KTtcbiAgcnVubmVyLm9uKEVWRU5UX1NVSVRFX0JFR0lOLCBmdW5jdGlvbiAoc3VpdGUpIHtcbiAgICBzdWl0ZS5yb290IHx8IHN0YXRzLnN1aXRlcysrO1xuICB9KTtcbiAgcnVubmVyLm9uKEVWRU5UX1RFU1RfUEFTUywgZnVuY3Rpb24gKCkge1xuICAgIHN0YXRzLnBhc3NlcysrO1xuICB9KTtcbiAgcnVubmVyLm9uKEVWRU5UX1RFU1RfRkFJTCwgZnVuY3Rpb24gKCkge1xuICAgIHN0YXRzLmZhaWx1cmVzKys7XG4gIH0pO1xuICBydW5uZXIub24oRVZFTlRfVEVTVF9QRU5ESU5HLCBmdW5jdGlvbiAoKSB7XG4gICAgc3RhdHMucGVuZGluZysrO1xuICB9KTtcbiAgcnVubmVyLm9uKEVWRU5UX1RFU1RfRU5ELCBmdW5jdGlvbiAoKSB7XG4gICAgc3RhdHMudGVzdHMrKztcbiAgfSk7XG4gIHJ1bm5lci5vbmNlKEVWRU5UX1JVTl9FTkQsIGZ1bmN0aW9uICgpIHtcbiAgICBzdGF0cy5lbmQgPSBuZXcgRGF0ZSgpO1xuICAgIHN0YXRzLmR1cmF0aW9uID0gc3RhdHMuZW5kIC0gc3RhdHMuc3RhcnQ7XG4gIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZVN0YXRzQ29sbGVjdG9yO1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBSdW5uYWJsZSA9IHJlcXVpcmUoJy4vcnVubmFibGUnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBlcnJvcnMgPSByZXF1aXJlKCcuL2Vycm9ycycpO1xudmFyIGNyZWF0ZUludmFsaWRBcmd1bWVudFR5cGVFcnJvciA9IGVycm9ycy5jcmVhdGVJbnZhbGlkQXJndW1lbnRUeXBlRXJyb3I7XG52YXIgaXNTdHJpbmcgPSB1dGlscy5pc1N0cmluZztcblxuY29uc3Qge01PQ0hBX0lEX1BST1BfTkFNRX0gPSB1dGlscy5jb25zdGFudHM7XG5cbm1vZHVsZS5leHBvcnRzID0gVGVzdDtcblxuLyoqXG4gKiBJbml0aWFsaXplIGEgbmV3IGBUZXN0YCB3aXRoIHRoZSBnaXZlbiBgdGl0bGVgIGFuZCBjYWxsYmFjayBgZm5gLlxuICpcbiAqIEBwdWJsaWNcbiAqIEBjbGFzc1xuICogQGV4dGVuZHMgUnVubmFibGVcbiAqIEBwYXJhbSB7U3RyaW5nfSB0aXRsZSAtIFRlc3QgdGl0bGUgKHJlcXVpcmVkKVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2ZuXSAtIFRlc3QgY2FsbGJhY2suICBJZiBvbWl0dGVkLCB0aGUgVGVzdCBpcyBjb25zaWRlcmVkIFwicGVuZGluZ1wiXG4gKi9cbmZ1bmN0aW9uIFRlc3QodGl0bGUsIGZuKSB7XG4gIGlmICghaXNTdHJpbmcodGl0bGUpKSB7XG4gICAgdGhyb3cgY3JlYXRlSW52YWxpZEFyZ3VtZW50VHlwZUVycm9yKFxuICAgICAgJ1Rlc3QgYXJndW1lbnQgXCJ0aXRsZVwiIHNob3VsZCBiZSBhIHN0cmluZy4gUmVjZWl2ZWQgdHlwZSBcIicgK1xuICAgICAgICB0eXBlb2YgdGl0bGUgK1xuICAgICAgICAnXCInLFxuICAgICAgJ3RpdGxlJyxcbiAgICAgICdzdHJpbmcnXG4gICAgKTtcbiAgfVxuICB0aGlzLnR5cGUgPSAndGVzdCc7XG4gIFJ1bm5hYmxlLmNhbGwodGhpcywgdGl0bGUsIGZuKTtcbiAgdGhpcy5yZXNldCgpO1xufVxuXG4vKipcbiAqIEluaGVyaXQgZnJvbSBgUnVubmFibGUucHJvdG90eXBlYC5cbiAqL1xudXRpbHMuaW5oZXJpdHMoVGVzdCwgUnVubmFibGUpO1xuXG4vKipcbiAqIFJlc2V0cyB0aGUgc3RhdGUgaW5pdGlhbGx5IG9yIGZvciBhIG5leHQgcnVuLlxuICovXG5UZXN0LnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgUnVubmFibGUucHJvdG90eXBlLnJlc2V0LmNhbGwodGhpcyk7XG4gIHRoaXMucGVuZGluZyA9ICF0aGlzLmZuO1xuICBkZWxldGUgdGhpcy5zdGF0ZTtcbn07XG5cbi8qKlxuICogU2V0IG9yIGdldCByZXRyaWVkIHRlc3RcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5UZXN0LnByb3RvdHlwZS5yZXRyaWVkVGVzdCA9IGZ1bmN0aW9uIChuKSB7XG4gIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIHJldHVybiB0aGlzLl9yZXRyaWVkVGVzdDtcbiAgfVxuICB0aGlzLl9yZXRyaWVkVGVzdCA9IG47XG59O1xuXG4vKipcbiAqIEFkZCB0ZXN0IHRvIHRoZSBsaXN0IG9mIHRlc3RzIG1hcmtlZCBgb25seWAuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuVGVzdC5wcm90b3R5cGUubWFya09ubHkgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMucGFyZW50LmFwcGVuZE9ubHlUZXN0KHRoaXMpO1xufTtcblxuVGVzdC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB0ZXN0ID0gbmV3IFRlc3QodGhpcy50aXRsZSwgdGhpcy5mbik7XG4gIHRlc3QudGltZW91dCh0aGlzLnRpbWVvdXQoKSk7XG4gIHRlc3Quc2xvdyh0aGlzLnNsb3coKSk7XG4gIHRlc3QucmV0cmllcyh0aGlzLnJldHJpZXMoKSk7XG4gIHRlc3QuY3VycmVudFJldHJ5KHRoaXMuY3VycmVudFJldHJ5KCkpO1xuICB0ZXN0LnJldHJpZWRUZXN0KHRoaXMucmV0cmllZFRlc3QoKSB8fCB0aGlzKTtcbiAgdGVzdC5nbG9iYWxzKHRoaXMuZ2xvYmFscygpKTtcbiAgdGVzdC5wYXJlbnQgPSB0aGlzLnBhcmVudDtcbiAgdGVzdC5maWxlID0gdGhpcy5maWxlO1xuICB0ZXN0LmN0eCA9IHRoaXMuY3R4O1xuICByZXR1cm4gdGVzdDtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhbiBtaW5pbWFsIG9iamVjdCBzdWl0YWJsZSBmb3IgdHJhbnNtaXNzaW9uIG92ZXIgSVBDLlxuICogRnVuY3Rpb25zIGFyZSByZXByZXNlbnRlZCBieSBrZXlzIGJlZ2lubmluZyB3aXRoIGAkJGAuXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybnMge09iamVjdH1cbiAqL1xuVGVzdC5wcm90b3R5cGUuc2VyaWFsaXplID0gZnVuY3Rpb24gc2VyaWFsaXplKCkge1xuICByZXR1cm4ge1xuICAgICQkY3VycmVudFJldHJ5OiB0aGlzLl9jdXJyZW50UmV0cnksXG4gICAgJCRmdWxsVGl0bGU6IHRoaXMuZnVsbFRpdGxlKCksXG4gICAgJCRpc1BlbmRpbmc6IEJvb2xlYW4odGhpcy5wZW5kaW5nKSxcbiAgICAkJHJldHJpZWRUZXN0OiB0aGlzLl9yZXRyaWVkVGVzdCB8fCBudWxsLFxuICAgICQkc2xvdzogdGhpcy5fc2xvdyxcbiAgICAkJHRpdGxlUGF0aDogdGhpcy50aXRsZVBhdGgoKSxcbiAgICBib2R5OiB0aGlzLmJvZHksXG4gICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgZXJyOiB0aGlzLmVycixcbiAgICBwYXJlbnQ6IHtcbiAgICAgICQkZnVsbFRpdGxlOiB0aGlzLnBhcmVudC5mdWxsVGl0bGUoKSxcbiAgICAgIFtNT0NIQV9JRF9QUk9QX05BTUVdOiB0aGlzLnBhcmVudC5pZFxuICAgIH0sXG4gICAgc3BlZWQ6IHRoaXMuc3BlZWQsXG4gICAgc3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgdHlwZTogdGhpcy50eXBlLFxuICAgIGZpbGU6IHRoaXMuZmlsZSxcbiAgICBbTU9DSEFfSURfUFJPUF9OQU1FXTogdGhpcy5pZFxuICB9O1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuIEBtb2R1bGUgaW50ZXJmYWNlcy9jb21tb25cbiovXG5cbnZhciBTdWl0ZSA9IHJlcXVpcmUoJy4uL3N1aXRlJyk7XG52YXIgZXJyb3JzID0gcmVxdWlyZSgnLi4vZXJyb3JzJyk7XG52YXIgY3JlYXRlTWlzc2luZ0FyZ3VtZW50RXJyb3IgPSBlcnJvcnMuY3JlYXRlTWlzc2luZ0FyZ3VtZW50RXJyb3I7XG52YXIgY3JlYXRlVW5zdXBwb3J0ZWRFcnJvciA9IGVycm9ycy5jcmVhdGVVbnN1cHBvcnRlZEVycm9yO1xudmFyIGNyZWF0ZUZvcmJpZGRlbkV4Y2x1c2l2aXR5RXJyb3IgPSBlcnJvcnMuY3JlYXRlRm9yYmlkZGVuRXhjbHVzaXZpdHlFcnJvcjtcblxuLyoqXG4gKiBGdW5jdGlvbnMgY29tbW9uIHRvIG1vcmUgdGhhbiBvbmUgaW50ZXJmYWNlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N1aXRlW119IHN1aXRlc1xuICogQHBhcmFtIHtDb250ZXh0fSBjb250ZXh0XG4gKiBAcGFyYW0ge01vY2hhfSBtb2NoYVxuICogQHJldHVybiB7T2JqZWN0fSBBbiBvYmplY3QgY29udGFpbmluZyBjb21tb24gZnVuY3Rpb25zLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzdWl0ZXMsIGNvbnRleHQsIG1vY2hhKSB7XG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgc3VpdGUgc2hvdWxkIGJlIHRlc3RlZC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtTdWl0ZX0gc3VpdGUgLSBzdWl0ZSB0byBjaGVja1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZEJlVGVzdGVkKHN1aXRlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICFtb2NoYS5vcHRpb25zLmdyZXAgfHxcbiAgICAgIChtb2NoYS5vcHRpb25zLmdyZXAgJiZcbiAgICAgICAgbW9jaGEub3B0aW9ucy5ncmVwLnRlc3Qoc3VpdGUuZnVsbFRpdGxlKCkpICYmXG4gICAgICAgICFtb2NoYS5vcHRpb25zLmludmVydClcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIG9ubHkgcHJlc2VudCBpZiBmbGFnIC0tZGVsYXkgaXMgcGFzc2VkIGludG8gTW9jaGEuIEl0IHRyaWdnZXJzXG4gICAgICogcm9vdCBzdWl0ZSBleGVjdXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N1aXRlfSBzdWl0ZSBUaGUgcm9vdCBzdWl0ZS5cbiAgICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBmdW5jdGlvbiB3aGljaCBydW5zIHRoZSByb290IHN1aXRlXG4gICAgICovXG4gICAgcnVuV2l0aFN1aXRlOiBmdW5jdGlvbiBydW5XaXRoU3VpdGUoc3VpdGUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiBydW4oKSB7XG4gICAgICAgIHN1aXRlLnJ1bigpO1xuICAgICAgfTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZSBiZWZvcmUgcnVubmluZyB0ZXN0cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAgICAgKi9cbiAgICBiZWZvcmU6IGZ1bmN0aW9uIChuYW1lLCBmbikge1xuICAgICAgcmV0dXJuIHN1aXRlc1swXS5iZWZvcmVBbGwobmFtZSwgZm4pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlIGFmdGVyIHJ1bm5pbmcgdGVzdHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gICAgICovXG4gICAgYWZ0ZXI6IGZ1bmN0aW9uIChuYW1lLCBmbikge1xuICAgICAgcmV0dXJuIHN1aXRlc1swXS5hZnRlckFsbChuYW1lLCBmbik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGUgYmVmb3JlIGVhY2ggdGVzdCBjYXNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICAgICAqL1xuICAgIGJlZm9yZUVhY2g6IGZ1bmN0aW9uIChuYW1lLCBmbikge1xuICAgICAgcmV0dXJuIHN1aXRlc1swXS5iZWZvcmVFYWNoKG5hbWUsIGZuKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZSBhZnRlciBlYWNoIHRlc3QgY2FzZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAgICAgKi9cbiAgICBhZnRlckVhY2g6IGZ1bmN0aW9uIChuYW1lLCBmbikge1xuICAgICAgcmV0dXJuIHN1aXRlc1swXS5hZnRlckVhY2gobmFtZSwgZm4pO1xuICAgIH0sXG5cbiAgICBzdWl0ZToge1xuICAgICAgLyoqXG4gICAgICAgKiBDcmVhdGUgYW4gZXhjbHVzaXZlIFN1aXRlOyBjb252ZW5pZW5jZSBmdW5jdGlvblxuICAgICAgICogU2VlIGRvY3N0cmluZyBmb3IgY3JlYXRlKCkgYmVsb3cuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdHNcbiAgICAgICAqIEByZXR1cm5zIHtTdWl0ZX1cbiAgICAgICAqL1xuICAgICAgb25seTogZnVuY3Rpb24gb25seShvcHRzKSB7XG4gICAgICAgIGlmIChtb2NoYS5vcHRpb25zLmZvcmJpZE9ubHkpIHtcbiAgICAgICAgICB0aHJvdyBjcmVhdGVGb3JiaWRkZW5FeGNsdXNpdml0eUVycm9yKG1vY2hhKTtcbiAgICAgICAgfVxuICAgICAgICBvcHRzLmlzT25seSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZShvcHRzKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ3JlYXRlIGEgU3VpdGUsIGJ1dCBza2lwIGl0OyBjb252ZW5pZW5jZSBmdW5jdGlvblxuICAgICAgICogU2VlIGRvY3N0cmluZyBmb3IgY3JlYXRlKCkgYmVsb3cuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdHNcbiAgICAgICAqIEByZXR1cm5zIHtTdWl0ZX1cbiAgICAgICAqL1xuICAgICAgc2tpcDogZnVuY3Rpb24gc2tpcChvcHRzKSB7XG4gICAgICAgIG9wdHMucGVuZGluZyA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZShvcHRzKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ3JlYXRlcyBhIHN1aXRlLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIE9wdGlvbnNcbiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLnRpdGxlIFRpdGxlIG9mIFN1aXRlXG4gICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5mbl0gU3VpdGUgRnVuY3Rpb24gKG5vdCBhbHdheXMgYXBwbGljYWJsZSlcbiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMucGVuZGluZ10gSXMgU3VpdGUgcGVuZGluZz9cbiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5maWxlXSBGaWxlcGF0aCB3aGVyZSB0aGlzIFN1aXRlIHJlc2lkZXNcbiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaXNPbmx5XSBJcyBTdWl0ZSBleGNsdXNpdmU/XG4gICAgICAgKiBAcmV0dXJucyB7U3VpdGV9XG4gICAgICAgKi9cbiAgICAgIGNyZWF0ZTogZnVuY3Rpb24gY3JlYXRlKG9wdHMpIHtcbiAgICAgICAgdmFyIHN1aXRlID0gU3VpdGUuY3JlYXRlKHN1aXRlc1swXSwgb3B0cy50aXRsZSk7XG4gICAgICAgIHN1aXRlLnBlbmRpbmcgPSBCb29sZWFuKG9wdHMucGVuZGluZyk7XG4gICAgICAgIHN1aXRlLmZpbGUgPSBvcHRzLmZpbGU7XG4gICAgICAgIHN1aXRlcy51bnNoaWZ0KHN1aXRlKTtcbiAgICAgICAgaWYgKG9wdHMuaXNPbmx5KSB7XG4gICAgICAgICAgc3VpdGUubWFya09ubHkoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgc3VpdGUucGVuZGluZyAmJlxuICAgICAgICAgIG1vY2hhLm9wdGlvbnMuZm9yYmlkUGVuZGluZyAmJlxuICAgICAgICAgIHNob3VsZEJlVGVzdGVkKHN1aXRlKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBjcmVhdGVVbnN1cHBvcnRlZEVycm9yKCdQZW5kaW5nIHRlc3QgZm9yYmlkZGVuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRzLmZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb3B0cy5mbi5jYWxsKHN1aXRlKTtcbiAgICAgICAgICBzdWl0ZXMuc2hpZnQoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb3B0cy5mbiA9PT0gJ3VuZGVmaW5lZCcgJiYgIXN1aXRlLnBlbmRpbmcpIHtcbiAgICAgICAgICB0aHJvdyBjcmVhdGVNaXNzaW5nQXJndW1lbnRFcnJvcihcbiAgICAgICAgICAgICdTdWl0ZSBcIicgK1xuICAgICAgICAgICAgICBzdWl0ZS5mdWxsVGl0bGUoKSArXG4gICAgICAgICAgICAgICdcIiB3YXMgZGVmaW5lZCBidXQgbm8gY2FsbGJhY2sgd2FzIHN1cHBsaWVkLiAnICtcbiAgICAgICAgICAgICAgJ1N1cHBseSBhIGNhbGxiYWNrIG9yIGV4cGxpY2l0bHkgc2tpcCB0aGUgc3VpdGUuJyxcbiAgICAgICAgICAgICdjYWxsYmFjaycsXG4gICAgICAgICAgICAnZnVuY3Rpb24nXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICghb3B0cy5mbiAmJiBzdWl0ZS5wZW5kaW5nKSB7XG4gICAgICAgICAgc3VpdGVzLnNoaWZ0KCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VpdGU7XG4gICAgICB9XG4gICAgfSxcblxuICAgIHRlc3Q6IHtcbiAgICAgIC8qKlxuICAgICAgICogRXhjbHVzaXZlIHRlc3QtY2FzZS5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0ge09iamVjdH0gbW9jaGFcbiAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHRlc3RcbiAgICAgICAqIEByZXR1cm5zIHsqfVxuICAgICAgICovXG4gICAgICBvbmx5OiBmdW5jdGlvbiAobW9jaGEsIHRlc3QpIHtcbiAgICAgICAgaWYgKG1vY2hhLm9wdGlvbnMuZm9yYmlkT25seSkge1xuICAgICAgICAgIHRocm93IGNyZWF0ZUZvcmJpZGRlbkV4Y2x1c2l2aXR5RXJyb3IobW9jaGEpO1xuICAgICAgICB9XG4gICAgICAgIHRlc3QubWFya09ubHkoKTtcbiAgICAgICAgcmV0dXJuIHRlc3Q7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFBlbmRpbmcgdGVzdCBjYXNlLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZVxuICAgICAgICovXG4gICAgICBza2lwOiBmdW5jdGlvbiAodGl0bGUpIHtcbiAgICAgICAgY29udGV4dC50ZXN0KHRpdGxlKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIFRlc3QgPSByZXF1aXJlKCcuLi90ZXN0Jyk7XG52YXIgRVZFTlRfRklMRV9QUkVfUkVRVUlSRSA9XG4gIHJlcXVpcmUoJy4uL3N1aXRlJykuY29uc3RhbnRzLkVWRU5UX0ZJTEVfUFJFX1JFUVVJUkU7XG5cbi8qKlxuICogQkRELXN0eWxlIGludGVyZmFjZTpcbiAqXG4gKiAgICAgIGRlc2NyaWJlKCdBcnJheScsIGZ1bmN0aW9uKCkge1xuICogICAgICAgIGRlc2NyaWJlKCcjaW5kZXhPZigpJywgZnVuY3Rpb24oKSB7XG4gKiAgICAgICAgICBpdCgnc2hvdWxkIHJldHVybiAtMSB3aGVuIG5vdCBwcmVzZW50JywgZnVuY3Rpb24oKSB7XG4gKiAgICAgICAgICAgIC8vIC4uLlxuICogICAgICAgICAgfSk7XG4gKlxuICogICAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIGluZGV4IHdoZW4gcHJlc2VudCcsIGZ1bmN0aW9uKCkge1xuICogICAgICAgICAgICAvLyAuLi5cbiAqICAgICAgICAgIH0pO1xuICogICAgICAgIH0pO1xuICogICAgICB9KTtcbiAqXG4gKiBAcGFyYW0ge1N1aXRlfSBzdWl0ZSBSb290IHN1aXRlLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJkZEludGVyZmFjZShzdWl0ZSkge1xuICB2YXIgc3VpdGVzID0gW3N1aXRlXTtcblxuICBzdWl0ZS5vbihFVkVOVF9GSUxFX1BSRV9SRVFVSVJFLCBmdW5jdGlvbiAoY29udGV4dCwgZmlsZSwgbW9jaGEpIHtcbiAgICB2YXIgY29tbW9uID0gcmVxdWlyZSgnLi9jb21tb24nKShzdWl0ZXMsIGNvbnRleHQsIG1vY2hhKTtcblxuICAgIGNvbnRleHQuYmVmb3JlID0gY29tbW9uLmJlZm9yZTtcbiAgICBjb250ZXh0LmFmdGVyID0gY29tbW9uLmFmdGVyO1xuICAgIGNvbnRleHQuYmVmb3JlRWFjaCA9IGNvbW1vbi5iZWZvcmVFYWNoO1xuICAgIGNvbnRleHQuYWZ0ZXJFYWNoID0gY29tbW9uLmFmdGVyRWFjaDtcbiAgICBjb250ZXh0LnJ1biA9IG1vY2hhLm9wdGlvbnMuZGVsYXkgJiYgY29tbW9uLnJ1bldpdGhTdWl0ZShzdWl0ZSk7XG4gICAgLyoqXG4gICAgICogRGVzY3JpYmUgYSBcInN1aXRlXCIgd2l0aCB0aGUgZ2l2ZW4gYHRpdGxlYFxuICAgICAqIGFuZCBjYWxsYmFjayBgZm5gIGNvbnRhaW5pbmcgbmVzdGVkIHN1aXRlc1xuICAgICAqIGFuZC9vciB0ZXN0cy5cbiAgICAgKi9cblxuICAgIGNvbnRleHQuZGVzY3JpYmUgPSBjb250ZXh0LmNvbnRleHQgPSBmdW5jdGlvbiAodGl0bGUsIGZuKSB7XG4gICAgICByZXR1cm4gY29tbW9uLnN1aXRlLmNyZWF0ZSh7XG4gICAgICAgIHRpdGxlLFxuICAgICAgICBmaWxlLFxuICAgICAgICBmblxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFBlbmRpbmcgZGVzY3JpYmUuXG4gICAgICovXG5cbiAgICBjb250ZXh0LnhkZXNjcmliZSA9XG4gICAgICBjb250ZXh0Lnhjb250ZXh0ID1cbiAgICAgIGNvbnRleHQuZGVzY3JpYmUuc2tpcCA9XG4gICAgICAgIGZ1bmN0aW9uICh0aXRsZSwgZm4pIHtcbiAgICAgICAgICByZXR1cm4gY29tbW9uLnN1aXRlLnNraXAoe1xuICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICBmaWxlLFxuICAgICAgICAgICAgZm5cbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgIC8qKlxuICAgICAqIEV4Y2x1c2l2ZSBzdWl0ZS5cbiAgICAgKi9cblxuICAgIGNvbnRleHQuZGVzY3JpYmUub25seSA9IGZ1bmN0aW9uICh0aXRsZSwgZm4pIHtcbiAgICAgIHJldHVybiBjb21tb24uc3VpdGUub25seSh7XG4gICAgICAgIHRpdGxlLFxuICAgICAgICBmaWxlLFxuICAgICAgICBmblxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIERlc2NyaWJlIGEgc3BlY2lmaWNhdGlvbiBvciB0ZXN0LWNhc2VcbiAgICAgKiB3aXRoIHRoZSBnaXZlbiBgdGl0bGVgIGFuZCBjYWxsYmFjayBgZm5gXG4gICAgICogYWN0aW5nIGFzIGEgdGh1bmsuXG4gICAgICovXG5cbiAgICBjb250ZXh0Lml0ID0gY29udGV4dC5zcGVjaWZ5ID0gZnVuY3Rpb24gKHRpdGxlLCBmbikge1xuICAgICAgdmFyIHN1aXRlID0gc3VpdGVzWzBdO1xuICAgICAgaWYgKHN1aXRlLmlzUGVuZGluZygpKSB7XG4gICAgICAgIGZuID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHZhciB0ZXN0ID0gbmV3IFRlc3QodGl0bGUsIGZuKTtcbiAgICAgIHRlc3QuZmlsZSA9IGZpbGU7XG4gICAgICBzdWl0ZS5hZGRUZXN0KHRlc3QpO1xuICAgICAgcmV0dXJuIHRlc3Q7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEV4Y2x1c2l2ZSB0ZXN0LWNhc2UuXG4gICAgICovXG5cbiAgICBjb250ZXh0Lml0Lm9ubHkgPSBmdW5jdGlvbiAodGl0bGUsIGZuKSB7XG4gICAgICByZXR1cm4gY29tbW9uLnRlc3Qub25seShtb2NoYSwgY29udGV4dC5pdCh0aXRsZSwgZm4pKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUGVuZGluZyB0ZXN0IGNhc2UuXG4gICAgICovXG5cbiAgICBjb250ZXh0LnhpdCA9XG4gICAgICBjb250ZXh0LnhzcGVjaWZ5ID1cbiAgICAgIGNvbnRleHQuaXQuc2tpcCA9XG4gICAgICAgIGZ1bmN0aW9uICh0aXRsZSkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0Lml0KHRpdGxlKTtcbiAgICAgICAgfTtcbiAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5kZXNjcmlwdGlvbiA9ICdCREQgb3IgUlNwZWMgc3R5bGUgW2RlZmF1bHRdJztcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBUZXN0ID0gcmVxdWlyZSgnLi4vdGVzdCcpO1xudmFyIEVWRU5UX0ZJTEVfUFJFX1JFUVVJUkUgPVxuICByZXF1aXJlKCcuLi9zdWl0ZScpLmNvbnN0YW50cy5FVkVOVF9GSUxFX1BSRV9SRVFVSVJFO1xuXG4vKipcbiAqIFRERC1zdHlsZSBpbnRlcmZhY2U6XG4gKlxuICogICAgICBzdWl0ZSgnQXJyYXknLCBmdW5jdGlvbigpIHtcbiAqICAgICAgICBzdWl0ZSgnI2luZGV4T2YoKScsIGZ1bmN0aW9uKCkge1xuICogICAgICAgICAgc3VpdGVTZXR1cChmdW5jdGlvbigpIHtcbiAqXG4gKiAgICAgICAgICB9KTtcbiAqXG4gKiAgICAgICAgICB0ZXN0KCdzaG91bGQgcmV0dXJuIC0xIHdoZW4gbm90IHByZXNlbnQnLCBmdW5jdGlvbigpIHtcbiAqXG4gKiAgICAgICAgICB9KTtcbiAqXG4gKiAgICAgICAgICB0ZXN0KCdzaG91bGQgcmV0dXJuIHRoZSBpbmRleCB3aGVuIHByZXNlbnQnLCBmdW5jdGlvbigpIHtcbiAqXG4gKiAgICAgICAgICB9KTtcbiAqXG4gKiAgICAgICAgICBzdWl0ZVRlYXJkb3duKGZ1bmN0aW9uKCkge1xuICpcbiAqICAgICAgICAgIH0pO1xuICogICAgICAgIH0pO1xuICogICAgICB9KTtcbiAqXG4gKiBAcGFyYW0ge1N1aXRlfSBzdWl0ZSBSb290IHN1aXRlLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzdWl0ZSkge1xuICB2YXIgc3VpdGVzID0gW3N1aXRlXTtcblxuICBzdWl0ZS5vbihFVkVOVF9GSUxFX1BSRV9SRVFVSVJFLCBmdW5jdGlvbiAoY29udGV4dCwgZmlsZSwgbW9jaGEpIHtcbiAgICB2YXIgY29tbW9uID0gcmVxdWlyZSgnLi9jb21tb24nKShzdWl0ZXMsIGNvbnRleHQsIG1vY2hhKTtcblxuICAgIGNvbnRleHQuc2V0dXAgPSBjb21tb24uYmVmb3JlRWFjaDtcbiAgICBjb250ZXh0LnRlYXJkb3duID0gY29tbW9uLmFmdGVyRWFjaDtcbiAgICBjb250ZXh0LnN1aXRlU2V0dXAgPSBjb21tb24uYmVmb3JlO1xuICAgIGNvbnRleHQuc3VpdGVUZWFyZG93biA9IGNvbW1vbi5hZnRlcjtcbiAgICBjb250ZXh0LnJ1biA9IG1vY2hhLm9wdGlvbnMuZGVsYXkgJiYgY29tbW9uLnJ1bldpdGhTdWl0ZShzdWl0ZSk7XG5cbiAgICAvKipcbiAgICAgKiBEZXNjcmliZSBhIFwic3VpdGVcIiB3aXRoIHRoZSBnaXZlbiBgdGl0bGVgIGFuZCBjYWxsYmFjayBgZm5gIGNvbnRhaW5pbmdcbiAgICAgKiBuZXN0ZWQgc3VpdGVzIGFuZC9vciB0ZXN0cy5cbiAgICAgKi9cbiAgICBjb250ZXh0LnN1aXRlID0gZnVuY3Rpb24gKHRpdGxlLCBmbikge1xuICAgICAgcmV0dXJuIGNvbW1vbi5zdWl0ZS5jcmVhdGUoe1xuICAgICAgICB0aXRsZSxcbiAgICAgICAgZmlsZSxcbiAgICAgICAgZm5cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBQZW5kaW5nIHN1aXRlLlxuICAgICAqL1xuICAgIGNvbnRleHQuc3VpdGUuc2tpcCA9IGZ1bmN0aW9uICh0aXRsZSwgZm4pIHtcbiAgICAgIHJldHVybiBjb21tb24uc3VpdGUuc2tpcCh7XG4gICAgICAgIHRpdGxlLFxuICAgICAgICBmaWxlLFxuICAgICAgICBmblxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEV4Y2x1c2l2ZSB0ZXN0LWNhc2UuXG4gICAgICovXG4gICAgY29udGV4dC5zdWl0ZS5vbmx5ID0gZnVuY3Rpb24gKHRpdGxlLCBmbikge1xuICAgICAgcmV0dXJuIGNvbW1vbi5zdWl0ZS5vbmx5KHtcbiAgICAgICAgdGl0bGUsXG4gICAgICAgIGZpbGUsXG4gICAgICAgIGZuXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRGVzY3JpYmUgYSBzcGVjaWZpY2F0aW9uIG9yIHRlc3QtY2FzZSB3aXRoIHRoZSBnaXZlbiBgdGl0bGVgIGFuZFxuICAgICAqIGNhbGxiYWNrIGBmbmAgYWN0aW5nIGFzIGEgdGh1bmsuXG4gICAgICovXG4gICAgY29udGV4dC50ZXN0ID0gZnVuY3Rpb24gKHRpdGxlLCBmbikge1xuICAgICAgdmFyIHN1aXRlID0gc3VpdGVzWzBdO1xuICAgICAgaWYgKHN1aXRlLmlzUGVuZGluZygpKSB7XG4gICAgICAgIGZuID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHZhciB0ZXN0ID0gbmV3IFRlc3QodGl0bGUsIGZuKTtcbiAgICAgIHRlc3QuZmlsZSA9IGZpbGU7XG4gICAgICBzdWl0ZS5hZGRUZXN0KHRlc3QpO1xuICAgICAgcmV0dXJuIHRlc3Q7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEV4Y2x1c2l2ZSB0ZXN0LWNhc2UuXG4gICAgICovXG5cbiAgICBjb250ZXh0LnRlc3Qub25seSA9IGZ1bmN0aW9uICh0aXRsZSwgZm4pIHtcbiAgICAgIHJldHVybiBjb21tb24udGVzdC5vbmx5KG1vY2hhLCBjb250ZXh0LnRlc3QodGl0bGUsIGZuKSk7XG4gICAgfTtcblxuICAgIGNvbnRleHQudGVzdC5za2lwID0gY29tbW9uLnRlc3Quc2tpcDtcbiAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5kZXNjcmlwdGlvbiA9XG4gICd0cmFkaXRpb25hbCBcInN1aXRlXCIvXCJ0ZXN0XCIgaW5zdGVhZCBvZiBCRERcXCdzIFwiZGVzY3JpYmVcIi9cIml0XCInO1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIFRlc3QgPSByZXF1aXJlKCcuLi90ZXN0Jyk7XG52YXIgRVZFTlRfRklMRV9QUkVfUkVRVUlSRSA9XG4gIHJlcXVpcmUoJy4uL3N1aXRlJykuY29uc3RhbnRzLkVWRU5UX0ZJTEVfUFJFX1JFUVVJUkU7XG5cbi8qKlxuICogUVVuaXQtc3R5bGUgaW50ZXJmYWNlOlxuICpcbiAqICAgICBzdWl0ZSgnQXJyYXknKTtcbiAqXG4gKiAgICAgdGVzdCgnI2xlbmd0aCcsIGZ1bmN0aW9uKCkge1xuICogICAgICAgdmFyIGFyciA9IFsxLDIsM107XG4gKiAgICAgICBvayhhcnIubGVuZ3RoID09IDMpO1xuICogICAgIH0pO1xuICpcbiAqICAgICB0ZXN0KCcjaW5kZXhPZigpJywgZnVuY3Rpb24oKSB7XG4gKiAgICAgICB2YXIgYXJyID0gWzEsMiwzXTtcbiAqICAgICAgIG9rKGFyci5pbmRleE9mKDEpID09IDApO1xuICogICAgICAgb2soYXJyLmluZGV4T2YoMikgPT0gMSk7XG4gKiAgICAgICBvayhhcnIuaW5kZXhPZigzKSA9PSAyKTtcbiAqICAgICB9KTtcbiAqXG4gKiAgICAgc3VpdGUoJ1N0cmluZycpO1xuICpcbiAqICAgICB0ZXN0KCcjbGVuZ3RoJywgZnVuY3Rpb24oKSB7XG4gKiAgICAgICBvaygnZm9vJy5sZW5ndGggPT0gMyk7XG4gKiAgICAgfSk7XG4gKlxuICogQHBhcmFtIHtTdWl0ZX0gc3VpdGUgUm9vdCBzdWl0ZS5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBxVW5pdEludGVyZmFjZShzdWl0ZSkge1xuICB2YXIgc3VpdGVzID0gW3N1aXRlXTtcblxuICBzdWl0ZS5vbihFVkVOVF9GSUxFX1BSRV9SRVFVSVJFLCBmdW5jdGlvbiAoY29udGV4dCwgZmlsZSwgbW9jaGEpIHtcbiAgICB2YXIgY29tbW9uID0gcmVxdWlyZSgnLi9jb21tb24nKShzdWl0ZXMsIGNvbnRleHQsIG1vY2hhKTtcblxuICAgIGNvbnRleHQuYmVmb3JlID0gY29tbW9uLmJlZm9yZTtcbiAgICBjb250ZXh0LmFmdGVyID0gY29tbW9uLmFmdGVyO1xuICAgIGNvbnRleHQuYmVmb3JlRWFjaCA9IGNvbW1vbi5iZWZvcmVFYWNoO1xuICAgIGNvbnRleHQuYWZ0ZXJFYWNoID0gY29tbW9uLmFmdGVyRWFjaDtcbiAgICBjb250ZXh0LnJ1biA9IG1vY2hhLm9wdGlvbnMuZGVsYXkgJiYgY29tbW9uLnJ1bldpdGhTdWl0ZShzdWl0ZSk7XG4gICAgLyoqXG4gICAgICogRGVzY3JpYmUgYSBcInN1aXRlXCIgd2l0aCB0aGUgZ2l2ZW4gYHRpdGxlYC5cbiAgICAgKi9cblxuICAgIGNvbnRleHQuc3VpdGUgPSBmdW5jdGlvbiAodGl0bGUpIHtcbiAgICAgIGlmIChzdWl0ZXMubGVuZ3RoID4gMSkge1xuICAgICAgICBzdWl0ZXMuc2hpZnQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb21tb24uc3VpdGUuY3JlYXRlKHtcbiAgICAgICAgdGl0bGUsXG4gICAgICAgIGZpbGUsXG4gICAgICAgIGZuOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEV4Y2x1c2l2ZSBTdWl0ZS5cbiAgICAgKi9cblxuICAgIGNvbnRleHQuc3VpdGUub25seSA9IGZ1bmN0aW9uICh0aXRsZSkge1xuICAgICAgaWYgKHN1aXRlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHN1aXRlcy5zaGlmdCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbW1vbi5zdWl0ZS5vbmx5KHtcbiAgICAgICAgdGl0bGUsXG4gICAgICAgIGZpbGUsXG4gICAgICAgIGZuOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIERlc2NyaWJlIGEgc3BlY2lmaWNhdGlvbiBvciB0ZXN0LWNhc2VcbiAgICAgKiB3aXRoIHRoZSBnaXZlbiBgdGl0bGVgIGFuZCBjYWxsYmFjayBgZm5gXG4gICAgICogYWN0aW5nIGFzIGEgdGh1bmsuXG4gICAgICovXG5cbiAgICBjb250ZXh0LnRlc3QgPSBmdW5jdGlvbiAodGl0bGUsIGZuKSB7XG4gICAgICB2YXIgdGVzdCA9IG5ldyBUZXN0KHRpdGxlLCBmbik7XG4gICAgICB0ZXN0LmZpbGUgPSBmaWxlO1xuICAgICAgc3VpdGVzWzBdLmFkZFRlc3QodGVzdCk7XG4gICAgICByZXR1cm4gdGVzdDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRXhjbHVzaXZlIHRlc3QtY2FzZS5cbiAgICAgKi9cblxuICAgIGNvbnRleHQudGVzdC5vbmx5ID0gZnVuY3Rpb24gKHRpdGxlLCBmbikge1xuICAgICAgcmV0dXJuIGNvbW1vbi50ZXN0Lm9ubHkobW9jaGEsIGNvbnRleHQudGVzdCh0aXRsZSwgZm4pKTtcbiAgICB9O1xuXG4gICAgY29udGV4dC50ZXN0LnNraXAgPSBjb21tb24udGVzdC5za2lwO1xuICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzLmRlc2NyaXB0aW9uID0gJ1FVbml0IHN0eWxlJztcbiIsICIndXNlIHN0cmljdCc7XG52YXIgU3VpdGUgPSByZXF1aXJlKCcuLi9zdWl0ZScpO1xudmFyIFRlc3QgPSByZXF1aXJlKCcuLi90ZXN0Jyk7XG5cbi8qKlxuICogRXhwb3J0cy1zdHlsZSAoYXMgTm9kZS5qcyBtb2R1bGUpIGludGVyZmFjZTpcbiAqXG4gKiAgICAgZXhwb3J0cy5BcnJheSA9IHtcbiAqICAgICAgICcjaW5kZXhPZigpJzoge1xuICogICAgICAgICAnc2hvdWxkIHJldHVybiAtMSB3aGVuIHRoZSB2YWx1ZSBpcyBub3QgcHJlc2VudCc6IGZ1bmN0aW9uKCkge1xuICpcbiAqICAgICAgICAgfSxcbiAqXG4gKiAgICAgICAgICdzaG91bGQgcmV0dXJuIHRoZSBjb3JyZWN0IGluZGV4IHdoZW4gdGhlIHZhbHVlIGlzIHByZXNlbnQnOiBmdW5jdGlvbigpIHtcbiAqXG4gKiAgICAgICAgIH1cbiAqICAgICAgIH1cbiAqICAgICB9O1xuICpcbiAqIEBwYXJhbSB7U3VpdGV9IHN1aXRlIFJvb3Qgc3VpdGUuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHN1aXRlKSB7XG4gIHZhciBzdWl0ZXMgPSBbc3VpdGVdO1xuXG4gIHN1aXRlLm9uKFN1aXRlLmNvbnN0YW50cy5FVkVOVF9GSUxFX1JFUVVJUkUsIHZpc2l0KTtcblxuICBmdW5jdGlvbiB2aXNpdChvYmosIGZpbGUpIHtcbiAgICB2YXIgc3VpdGU7XG4gICAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgICAgaWYgKHR5cGVvZiBvYmpba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YXIgZm4gPSBvYmpba2V5XTtcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICBjYXNlICdiZWZvcmUnOlxuICAgICAgICAgICAgc3VpdGVzWzBdLmJlZm9yZUFsbChmbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdhZnRlcic6XG4gICAgICAgICAgICBzdWl0ZXNbMF0uYWZ0ZXJBbGwoZm4pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnYmVmb3JlRWFjaCc6XG4gICAgICAgICAgICBzdWl0ZXNbMF0uYmVmb3JlRWFjaChmbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdhZnRlckVhY2gnOlxuICAgICAgICAgICAgc3VpdGVzWzBdLmFmdGVyRWFjaChmbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdmFyIHRlc3QgPSBuZXcgVGVzdChrZXksIGZuKTtcbiAgICAgICAgICAgIHRlc3QuZmlsZSA9IGZpbGU7XG4gICAgICAgICAgICBzdWl0ZXNbMF0uYWRkVGVzdCh0ZXN0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3VpdGUgPSBTdWl0ZS5jcmVhdGUoc3VpdGVzWzBdLCBrZXkpO1xuICAgICAgICBzdWl0ZXMudW5zaGlmdChzdWl0ZSk7XG4gICAgICAgIHZpc2l0KG9ialtrZXldLCBmaWxlKTtcbiAgICAgICAgc3VpdGVzLnNoaWZ0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5kZXNjcmlwdGlvbiA9ICdOb2RlLmpzIG1vZHVsZSAoXCJleHBvcnRzXCIpIHN0eWxlJztcbiIsICIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuYmRkID0gcmVxdWlyZSgnLi9iZGQnKTtcbmV4cG9ydHMudGRkID0gcmVxdWlyZSgnLi90ZGQnKTtcbmV4cG9ydHMucXVuaXQgPSByZXF1aXJlKCcuL3F1bml0Jyk7XG5leHBvcnRzLmV4cG9ydHMgPSByZXF1aXJlKCcuL2V4cG9ydHMnKTtcbiIsICIndXNlIHN0cmljdCc7XG4vKipcbiAqIEBtb2R1bGUgQ29udGV4dFxuICovXG4vKipcbiAqIEV4cG9zZSBgQ29udGV4dGAuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBDb250ZXh0O1xuXG4vKipcbiAqIEluaXRpYWxpemUgYSBuZXcgYENvbnRleHRgLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIENvbnRleHQoKSB7fVxuXG4vKipcbiAqIFNldCBvciBnZXQgdGhlIGNvbnRleHQgYFJ1bm5hYmxlYCB0byBgcnVubmFibGVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1J1bm5hYmxlfSBydW5uYWJsZVxuICogQHJldHVybiB7Q29udGV4dH0gY29udGV4dFxuICovXG5Db250ZXh0LnByb3RvdHlwZS5ydW5uYWJsZSA9IGZ1bmN0aW9uIChydW5uYWJsZSkge1xuICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gdGhpcy5fcnVubmFibGU7XG4gIH1cbiAgdGhpcy50ZXN0ID0gdGhpcy5fcnVubmFibGUgPSBydW5uYWJsZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCBvciBnZXQgdGVzdCB0aW1lb3V0IGBtc2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBtc1xuICogQHJldHVybiB7Q29udGV4dH0gc2VsZlxuICovXG5Db250ZXh0LnByb3RvdHlwZS50aW1lb3V0ID0gZnVuY3Rpb24gKG1zKSB7XG4gIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIHJldHVybiB0aGlzLnJ1bm5hYmxlKCkudGltZW91dCgpO1xuICB9XG4gIHRoaXMucnVubmFibGUoKS50aW1lb3V0KG1zKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCBvciBnZXQgdGVzdCBzbG93bmVzcyB0aHJlc2hvbGQgYG1zYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtDb250ZXh0fSBzZWxmXG4gKi9cbkNvbnRleHQucHJvdG90eXBlLnNsb3cgPSBmdW5jdGlvbiAobXMpIHtcbiAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHRoaXMucnVubmFibGUoKS5zbG93KCk7XG4gIH1cbiAgdGhpcy5ydW5uYWJsZSgpLnNsb3cobXMpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogTWFyayBhIHRlc3QgYXMgc2tpcHBlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHRocm93cyBQZW5kaW5nXG4gKi9cbkNvbnRleHQucHJvdG90eXBlLnNraXAgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMucnVubmFibGUoKS5za2lwKCk7XG59O1xuXG4vKipcbiAqIFNldCBvciBnZXQgYSBudW1iZXIgb2YgYWxsb3dlZCByZXRyaWVzIG9uIGZhaWxlZCB0ZXN0c1xuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge251bWJlcn0gblxuICogQHJldHVybiB7Q29udGV4dH0gc2VsZlxuICovXG5Db250ZXh0LnByb3RvdHlwZS5yZXRyaWVzID0gZnVuY3Rpb24gKG4pIHtcbiAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHRoaXMucnVubmFibGUoKS5yZXRyaWVzKCk7XG4gIH1cbiAgdGhpcy5ydW5uYWJsZSgpLnJldHJpZXMobik7XG4gIHJldHVybiB0aGlzO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qIVxuICogbW9jaGFcbiAqIENvcHlyaWdodChjKSAyMDExIFRKIEhvbG93YXljaHVrIDx0akB2aXNpb24tbWVkaWEuY2E+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG52YXIgZXNjYXBlUmUgPSByZXF1aXJlKCdlc2NhcGUtc3RyaW5nLXJlZ2V4cCcpO1xudmFyIHBhdGggPSByZXF1aXJlKCdub2RlOnBhdGgnKTtcbnZhciBidWlsdGluUmVwb3J0ZXJzID0gcmVxdWlyZSgnLi9yZXBvcnRlcnMnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBtb2NoYXJjID0gcmVxdWlyZSgnLi9tb2NoYXJjLmpzb24nKTtcbnZhciBTdWl0ZSA9IHJlcXVpcmUoJy4vc3VpdGUnKTtcbnZhciBlc21VdGlscyA9IHJlcXVpcmUoJy4vbm9kZWpzL2VzbS11dGlscycpO1xudmFyIGNyZWF0ZVN0YXRzQ29sbGVjdG9yID0gcmVxdWlyZSgnLi9zdGF0cy1jb2xsZWN0b3InKTtcbmNvbnN0IHtcbiAgY3JlYXRlSW52YWxpZFJlcG9ydGVyRXJyb3IsXG4gIGNyZWF0ZUludmFsaWRJbnRlcmZhY2VFcnJvcixcbiAgY3JlYXRlTW9jaGFJbnN0YW5jZUFscmVhZHlEaXNwb3NlZEVycm9yLFxuICBjcmVhdGVNb2NoYUluc3RhbmNlQWxyZWFkeVJ1bm5pbmdFcnJvcixcbiAgY3JlYXRlVW5zdXBwb3J0ZWRFcnJvclxufSA9IHJlcXVpcmUoJy4vZXJyb3JzJyk7XG5jb25zdCB7RVZFTlRfRklMRV9QUkVfUkVRVUlSRSwgRVZFTlRfRklMRV9QT1NUX1JFUVVJUkUsIEVWRU5UX0ZJTEVfUkVRVUlSRX0gPVxuICBTdWl0ZS5jb25zdGFudHM7XG52YXIgZGVidWcgPSByZXF1aXJlKCdkZWJ1ZycpKCdtb2NoYTptb2NoYScpO1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBNb2NoYTtcblxuLyoqXG4gKiBBIE1vY2hhIGluc3RhbmNlIGlzIGEgZmluaXRlIHN0YXRlIG1hY2hpbmUuXG4gKiBUaGVzZSBhcmUgdGhlIHN0YXRlcyBpdCBjYW4gYmUgaW4uXG4gKiBAcHJpdmF0ZVxuICovXG52YXIgbW9jaGFTdGF0ZXMgPSB1dGlscy5kZWZpbmVDb25zdGFudHMoe1xuICAvKipcbiAgICogSW5pdGlhbCBzdGF0ZSBvZiB0aGUgbW9jaGEgaW5zdGFuY2VcbiAgICogQHByaXZhdGVcbiAgICovXG4gIElOSVQ6ICdpbml0JyxcbiAgLyoqXG4gICAqIE1vY2hhIGluc3RhbmNlIGlzIHJ1bm5pbmcgdGVzdHNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIFJVTk5JTkc6ICdydW5uaW5nJyxcbiAgLyoqXG4gICAqIE1vY2hhIGluc3RhbmNlIGlzIGRvbmUgcnVubmluZyB0ZXN0cyBhbmQgcmVmZXJlbmNlcyB0byB0ZXN0IGZ1bmN0aW9ucyBhbmQgaG9va3MgYXJlIGNsZWFuZWQuXG4gICAqIFlvdSBjYW4gcmVzZXQgdGhpcyBzdGF0ZSBieSB1bmxvYWRpbmcgdGhlIHRlc3QgZmlsZXMuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBSRUZFUkVOQ0VTX0NMRUFORUQ6ICdyZWZlcmVuY2VzQ2xlYW5lZCcsXG4gIC8qKlxuICAgKiBNb2NoYSBpbnN0YW5jZSBpcyBkaXNwb3NlZCBhbmQgY2FuIG5vIGxvbmdlciBiZSB1c2VkLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgRElTUE9TRUQ6ICdkaXNwb3NlZCdcbn0pO1xuXG4vKipcbiAqIFRvIHJlcXVpcmUgbG9jYWwgVUlzIGFuZCByZXBvcnRlcnMgd2hlbiBydW5uaW5nIGluIG5vZGUuXG4gKi9cblxuaWYgKCF1dGlscy5pc0Jyb3dzZXIoKSAmJiB0eXBlb2YgbW9kdWxlLnBhdGhzICE9PSAndW5kZWZpbmVkJykge1xuICB2YXIgY3dkID0gdXRpbHMuY3dkKCk7XG4gIG1vZHVsZS5wYXRocy5wdXNoKGN3ZCwgcGF0aC5qb2luKGN3ZCwgJ25vZGVfbW9kdWxlcycpKTtcbn1cblxuLyoqXG4gKiBFeHBvc2UgaW50ZXJuYWxzLlxuICogQHByaXZhdGVcbiAqL1xuXG5leHBvcnRzLnV0aWxzID0gdXRpbHM7XG5leHBvcnRzLmludGVyZmFjZXMgPSByZXF1aXJlKCcuL2ludGVyZmFjZXMnKTtcbi8qKlxuICogQHB1YmxpY1xuICogQG1lbWJlcm9mIE1vY2hhXG4gKi9cbmV4cG9ydHMucmVwb3J0ZXJzID0gYnVpbHRpblJlcG9ydGVycztcbmV4cG9ydHMuUnVubmFibGUgPSByZXF1aXJlKCcuL3J1bm5hYmxlJyk7XG5leHBvcnRzLkNvbnRleHQgPSByZXF1aXJlKCcuL2NvbnRleHQnKTtcbi8qKlxuICpcbiAqIEBtZW1iZXJvZiBNb2NoYVxuICovXG5leHBvcnRzLlJ1bm5lciA9IHJlcXVpcmUoJy4vcnVubmVyJyk7XG5leHBvcnRzLlN1aXRlID0gU3VpdGU7XG5leHBvcnRzLkhvb2sgPSByZXF1aXJlKCcuL2hvb2snKTtcbmV4cG9ydHMuVGVzdCA9IHJlcXVpcmUoJy4vdGVzdCcpO1xuXG5sZXQgY3VycmVudENvbnRleHQ7XG5leHBvcnRzLmFmdGVyRWFjaCA9IGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gIHJldHVybiAoY3VycmVudENvbnRleHQuYWZ0ZXJFYWNoIHx8IGN1cnJlbnRDb250ZXh0LnRlYXJkb3duKS5hcHBseShcbiAgICB0aGlzLFxuICAgIGFyZ3NcbiAgKTtcbn07XG5leHBvcnRzLmFmdGVyID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgcmV0dXJuIChjdXJyZW50Q29udGV4dC5hZnRlciB8fCBjdXJyZW50Q29udGV4dC5zdWl0ZVRlYXJkb3duKS5hcHBseShcbiAgICB0aGlzLFxuICAgIGFyZ3NcbiAgKTtcbn07XG5leHBvcnRzLmJlZm9yZUVhY2ggPSBmdW5jdGlvbiAoLi4uYXJncykge1xuICByZXR1cm4gKGN1cnJlbnRDb250ZXh0LmJlZm9yZUVhY2ggfHwgY3VycmVudENvbnRleHQuc2V0dXApLmFwcGx5KHRoaXMsIGFyZ3MpO1xufTtcbmV4cG9ydHMuYmVmb3JlID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgcmV0dXJuIChjdXJyZW50Q29udGV4dC5iZWZvcmUgfHwgY3VycmVudENvbnRleHQuc3VpdGVTZXR1cCkuYXBwbHkodGhpcywgYXJncyk7XG59O1xuZXhwb3J0cy5kZXNjcmliZSA9IGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gIHJldHVybiAoY3VycmVudENvbnRleHQuZGVzY3JpYmUgfHwgY3VycmVudENvbnRleHQuc3VpdGUpLmFwcGx5KHRoaXMsIGFyZ3MpO1xufTtcbmV4cG9ydHMuZGVzY3JpYmUub25seSA9IGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gIHJldHVybiAoY3VycmVudENvbnRleHQuZGVzY3JpYmUgfHwgY3VycmVudENvbnRleHQuc3VpdGUpLm9ubHkuYXBwbHkoXG4gICAgdGhpcyxcbiAgICBhcmdzXG4gICk7XG59O1xuZXhwb3J0cy5kZXNjcmliZS5za2lwID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgcmV0dXJuIChjdXJyZW50Q29udGV4dC5kZXNjcmliZSB8fCBjdXJyZW50Q29udGV4dC5zdWl0ZSkuc2tpcC5hcHBseShcbiAgICB0aGlzLFxuICAgIGFyZ3NcbiAgKTtcbn07XG5leHBvcnRzLml0ID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgcmV0dXJuIChjdXJyZW50Q29udGV4dC5pdCB8fCBjdXJyZW50Q29udGV4dC50ZXN0KS5hcHBseSh0aGlzLCBhcmdzKTtcbn07XG5leHBvcnRzLml0Lm9ubHkgPSBmdW5jdGlvbiAoLi4uYXJncykge1xuICByZXR1cm4gKGN1cnJlbnRDb250ZXh0Lml0IHx8IGN1cnJlbnRDb250ZXh0LnRlc3QpLm9ubHkuYXBwbHkodGhpcywgYXJncyk7XG59O1xuZXhwb3J0cy5pdC5za2lwID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgcmV0dXJuIChjdXJyZW50Q29udGV4dC5pdCB8fCBjdXJyZW50Q29udGV4dC50ZXN0KS5za2lwLmFwcGx5KHRoaXMsIGFyZ3MpO1xufTtcbmV4cG9ydHMueGRlc2NyaWJlID0gZXhwb3J0cy5kZXNjcmliZS5za2lwO1xuZXhwb3J0cy54aXQgPSBleHBvcnRzLml0LnNraXA7XG5leHBvcnRzLnNldHVwID0gZXhwb3J0cy5iZWZvcmVFYWNoO1xuZXhwb3J0cy5zdWl0ZVNldHVwID0gZXhwb3J0cy5iZWZvcmU7XG5leHBvcnRzLnN1aXRlVGVhcmRvd24gPSBleHBvcnRzLmFmdGVyO1xuZXhwb3J0cy5zdWl0ZSA9IGV4cG9ydHMuZGVzY3JpYmU7XG5leHBvcnRzLnRlYXJkb3duID0gZXhwb3J0cy5hZnRlckVhY2g7XG5leHBvcnRzLnRlc3QgPSBleHBvcnRzLml0O1xuZXhwb3J0cy5ydW4gPSBmdW5jdGlvbiAoLi4uYXJncykge1xuICByZXR1cm4gY3VycmVudENvbnRleHQucnVuLmFwcGx5KHRoaXMsIGFyZ3MpO1xufTtcblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgbmV3IE1vY2hhIGluc3RhbmNlIHdpdGggYG9wdGlvbnNgLlxuICpcbiAqIEBwdWJsaWNcbiAqIEBjbGFzcyBNb2NoYVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIFNldHRpbmdzIG9iamVjdC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuYWxsb3dVbmNhdWdodF0gLSBQcm9wYWdhdGUgdW5jYXVnaHQgZXJyb3JzP1xuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5hc3luY09ubHldIC0gRm9yY2UgYGRvbmVgIGNhbGxiYWNrIG9yIHByb21pc2U/XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmJhaWxdIC0gQmFpbCBhZnRlciBmaXJzdCB0ZXN0IGZhaWx1cmU/XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmNoZWNrTGVha3NdIC0gQ2hlY2sgZm9yIGdsb2JhbCB2YXJpYWJsZSBsZWFrcz9cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuY29sb3JdIC0gQ29sb3IgVFRZIG91dHB1dCBmcm9tIHJlcG9ydGVyP1xuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5kZWxheV0gLSBEZWxheSByb290IHN1aXRlIGV4ZWN1dGlvbj9cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZGlmZl0gLSBTaG93IGRpZmYgb24gZmFpbHVyZT9cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZHJ5UnVuXSAtIFJlcG9ydCB0ZXN0cyB3aXRob3V0IHJ1bm5pbmcgdGhlbT9cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucGFzc09uRmFpbGluZ1Rlc3RTdWl0ZV0gLSBGYWlsIHRlc3QgcnVuIGlmIHRlc3RzIHdlcmUgZmFpbGVkP1xuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5mYWlsWmVyb10gLSBGYWlsIHRlc3QgcnVuIGlmIHplcm8gdGVzdHM/XG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuZmdyZXBdIC0gVGVzdCBmaWx0ZXIgZ2l2ZW4gc3RyaW5nLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5mb3JiaWRPbmx5XSAtIFRlc3RzIG1hcmtlZCBgb25seWAgZmFpbCB0aGUgc3VpdGU/XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmZvcmJpZFBlbmRpbmddIC0gUGVuZGluZyB0ZXN0cyBmYWlsIHRoZSBzdWl0ZT9cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZnVsbFRyYWNlXSAtIEZ1bGwgc3RhY2t0cmFjZSB1cG9uIGZhaWx1cmU/XG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBbb3B0aW9ucy5nbG9iYWxdIC0gVmFyaWFibGVzIGV4cGVjdGVkIGluIGdsb2JhbCBzY29wZS5cbiAqIEBwYXJhbSB7UmVnRXhwfHN0cmluZ30gW29wdGlvbnMuZ3JlcF0gLSBUZXN0IGZpbHRlciBnaXZlbiByZWd1bGFyIGV4cHJlc3Npb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmlubGluZURpZmZzXSAtIERpc3BsYXkgaW5saW5lIGRpZmZzP1xuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5pbnZlcnRdIC0gSW52ZXJ0IHRlc3QgZmlsdGVyIG1hdGNoZXM/XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLm5vSGlnaGxpZ2h0aW5nXSAtIERpc2FibGUgc3ludGF4IGhpZ2hsaWdodGluZz9cbiAqIEBwYXJhbSB7c3RyaW5nfGNvbnN0cnVjdG9yfSBbb3B0aW9ucy5yZXBvcnRlcl0gLSBSZXBvcnRlciBuYW1lIG9yIGNvbnN0cnVjdG9yLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnJlcG9ydGVyT3B0aW9uXSAtIFJlcG9ydGVyIHNldHRpbmdzIG9iamVjdC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5yZXRyaWVzXSAtIE51bWJlciBvZiB0aW1lcyB0byByZXRyeSBmYWlsZWQgdGVzdHMuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuc2xvd10gLSBTbG93IHRocmVzaG9sZCB2YWx1ZS5cbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gW29wdGlvbnMudGltZW91dF0gLSBUaW1lb3V0IHRocmVzaG9sZCB2YWx1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy51aV0gLSBJbnRlcmZhY2UgbmFtZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucGFyYWxsZWxdIC0gUnVuIGpvYnMgaW4gcGFyYWxsZWwuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuam9ic10gLSBNYXggbnVtYmVyIG9mIHdvcmtlciBwcm9jZXNzZXMgZm9yIHBhcmFsbGVsIHJ1bnMuXG4gKiBAcGFyYW0ge01vY2hhUm9vdEhvb2tPYmplY3R9IFtvcHRpb25zLnJvb3RIb29rc10gLSBIb29rcyB0byBib290c3RyYXAgdGhlIHJvb3Qgc3VpdGUgd2l0aC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IFtvcHRpb25zLnJlcXVpcmVdIC0gUGF0aG5hbWUgb2YgYHJvb3RIb29rc2AgcGx1Z2luIGZvciBwYXJhbGxlbCBydW5zLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5pc1dvcmtlcl0gLSBTaG91bGQgYmUgYHRydWVgIGlmIGBNb2NoYWAgcHJvY2VzcyBpcyBydW5uaW5nIGluIGEgd29ya2VyIHByb2Nlc3MuXG4gKi9cbmZ1bmN0aW9uIE1vY2hhKG9wdGlvbnMgPSB7fSkge1xuICBvcHRpb25zID0gey4uLm1vY2hhcmMsIC4uLm9wdGlvbnN9O1xuICB0aGlzLmZpbGVzID0gW107XG4gIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gIC8vIHJvb3Qgc3VpdGVcbiAgdGhpcy5zdWl0ZSA9IG5ldyBleHBvcnRzLlN1aXRlKCcnLCBuZXcgZXhwb3J0cy5Db250ZXh0KCksIHRydWUpO1xuICB0aGlzLl9jbGVhblJlZmVyZW5jZXNBZnRlclJ1biA9IHRydWU7XG4gIHRoaXMuX3N0YXRlID0gbW9jaGFTdGF0ZXMuSU5JVDtcblxuICB0aGlzLmdyZXAob3B0aW9ucy5ncmVwKVxuICAgIC5mZ3JlcChvcHRpb25zLmZncmVwKVxuICAgIC51aShvcHRpb25zLnVpKVxuICAgIC5yZXBvcnRlcihcbiAgICAgIG9wdGlvbnMucmVwb3J0ZXIsXG4gICAgICBvcHRpb25zWydyZXBvcnRlci1vcHRpb24nXSB8fFxuICAgICAgICBvcHRpb25zLnJlcG9ydGVyT3B0aW9uIHx8XG4gICAgICAgIG9wdGlvbnMucmVwb3J0ZXJPcHRpb25zIC8vIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgIClcbiAgICAuc2xvdyhvcHRpb25zLnNsb3cpXG4gICAgLmdsb2JhbChvcHRpb25zLmdsb2JhbCk7XG5cbiAgLy8gdGhpcyBndWFyZCBleGlzdHMgYmVjYXVzZSBTdWl0ZSN0aW1lb3V0IGRvZXMgbm90IGNvbnNpZGVyIGB1bmRlZmluZWRgIHRvIGJlIHZhbGlkIGlucHV0XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy50aW1lb3V0ICE9PSAndW5kZWZpbmVkJykge1xuICAgIHRoaXMudGltZW91dChvcHRpb25zLnRpbWVvdXQgPT09IGZhbHNlID8gMCA6IG9wdGlvbnMudGltZW91dCk7XG4gIH1cblxuICBpZiAoJ3JldHJpZXMnIGluIG9wdGlvbnMpIHtcbiAgICB0aGlzLnJldHJpZXMob3B0aW9ucy5yZXRyaWVzKTtcbiAgfVxuXG4gIFtcbiAgICAnYWxsb3dVbmNhdWdodCcsXG4gICAgJ2FzeW5jT25seScsXG4gICAgJ2JhaWwnLFxuICAgICdjaGVja0xlYWtzJyxcbiAgICAnY29sb3InLFxuICAgICdkZWxheScsXG4gICAgJ2RpZmYnLFxuICAgICdkcnlSdW4nLFxuICAgICdwYXNzT25GYWlsaW5nVGVzdFN1aXRlJyxcbiAgICAnZmFpbFplcm8nLFxuICAgICdmb3JiaWRPbmx5JyxcbiAgICAnZm9yYmlkUGVuZGluZycsXG4gICAgJ2Z1bGxUcmFjZScsXG4gICAgJ2lubGluZURpZmZzJyxcbiAgICAnaW52ZXJ0J1xuICBdLmZvckVhY2goZnVuY3Rpb24gKG9wdCkge1xuICAgIGlmIChvcHRpb25zW29wdF0pIHtcbiAgICAgIHRoaXNbb3B0XSgpO1xuICAgIH1cbiAgfSwgdGhpcyk7XG5cbiAgaWYgKG9wdGlvbnMucm9vdEhvb2tzKSB7XG4gICAgdGhpcy5yb290SG9va3Mob3B0aW9ucy5yb290SG9va3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjbGFzcyB3aGljaCB3ZSdsbCBpbnN0YW50aWF0ZSBpbiB7QGxpbmsgTW9jaGEjcnVufS4gIERlZmF1bHRzIHRvXG4gICAqIHtAbGluayBSdW5uZXJ9IGluIHNlcmlhbCBtb2RlOyBjaGFuZ2VzIGluIHBhcmFsbGVsIG1vZGUuXG4gICAqIEBtZW1iZXJvZiBNb2NoYVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgdGhpcy5fcnVubmVyQ2xhc3MgPSBleHBvcnRzLlJ1bm5lcjtcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdG8gY2FsbCB7QGxpbmsgTW9jaGEjbG9hZEZpbGVzfSBpbXBsaWNpdGx5IHdoZW4gY2FsbGluZ1xuICAgKiB7QGxpbmsgTW9jaGEjcnVufS4gIElmIHRoaXMgaXMgYHRydWVgLCB0aGVuIGl0J3MgdXAgdG8gdGhlIGNvbnN1bWVyIHRvIGNhbGxcbiAgICoge0BsaW5rIE1vY2hhI2xvYWRGaWxlc30gX29yXyB7QGxpbmsgTW9jaGEjbG9hZEZpbGVzQXN5bmN9LlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgTW9jaGFcbiAgICovXG4gIHRoaXMuX2xhenlMb2FkRmlsZXMgPSBmYWxzZTtcblxuICAvKipcbiAgICogSXQncyB1c2VmdWwgZm9yIGEgTW9jaGEgaW5zdGFuY2UgdG8ga25vdyBpZiBpdCdzIHJ1bm5pbmcgaW4gYSB3b3JrZXIgcHJvY2Vzcy5cbiAgICogV2UgY291bGQgZGVyaXZlIHRoaXMgdmlhIG90aGVyIG1lYW5zLCBidXQgaXQncyBoZWxwZnVsIHRvIGhhdmUgYSBmbGFnIHRvIHJlZmVyIHRvLlxuICAgKiBAbWVtYmVyb2YgTW9jaGFcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHRoaXMuaXNXb3JrZXIgPSBCb29sZWFuKG9wdGlvbnMuaXNXb3JrZXIpO1xuXG4gIHRoaXMuZ2xvYmFsU2V0dXAob3B0aW9ucy5nbG9iYWxTZXR1cClcbiAgICAuZ2xvYmFsVGVhcmRvd24ob3B0aW9ucy5nbG9iYWxUZWFyZG93bilcbiAgICAuZW5hYmxlR2xvYmFsU2V0dXAob3B0aW9ucy5lbmFibGVHbG9iYWxTZXR1cClcbiAgICAuZW5hYmxlR2xvYmFsVGVhcmRvd24ob3B0aW9ucy5lbmFibGVHbG9iYWxUZWFyZG93bik7XG5cbiAgaWYgKFxuICAgIG9wdGlvbnMucGFyYWxsZWwgJiZcbiAgICAodHlwZW9mIG9wdGlvbnMuam9icyA9PT0gJ3VuZGVmaW5lZCcgfHwgb3B0aW9ucy5qb2JzID4gMSlcbiAgKSB7XG4gICAgZGVidWcoJ2F0dGVtcHRpbmcgdG8gZW5hYmxlIHBhcmFsbGVsIG1vZGUnKTtcbiAgICB0aGlzLnBhcmFsbGVsTW9kZSh0cnVlKTtcbiAgfVxufVxuXG4vKipcbiAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgYmFpbGluZyBvbiB0aGUgZmlyc3QgZmFpbHVyZS5cbiAqXG4gKiBAcHVibGljXG4gKiBAc2VlIFtDTEkgb3B0aW9uXSguLi8jLWJhaWwtYilcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2JhaWw9dHJ1ZV0gLSBXaGV0aGVyIHRvIGJhaWwgb24gZmlyc3QgZXJyb3IuXG4gKiBAcmV0dXJucyB7TW9jaGF9IHRoaXNcbiAqIEBjaGFpbmFibGVcbiAqL1xuTW9jaGEucHJvdG90eXBlLmJhaWwgPSBmdW5jdGlvbiAoYmFpbCkge1xuICB0aGlzLnN1aXRlLmJhaWwoYmFpbCAhPT0gZmFsc2UpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQHN1bW1hcnlcbiAqIEFkZHMgYGZpbGVgIHRvIGJlIGxvYWRlZCBmb3IgZXhlY3V0aW9uLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVXNlZnVsIGZvciBnZW5lcmljIHNldHVwIGNvZGUgdGhhdCBtdXN0IGJlIGluY2x1ZGVkIHdpdGhpbiB0ZXN0IHN1aXRlLlxuICpcbiAqIEBwdWJsaWNcbiAqIEBzZWUgW0NMSSBvcHRpb25dKC4uLyMtZmlsZS1maWxlZGlyZWN0b3J5Z2xvYilcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlIC0gUGF0aG5hbWUgb2YgZmlsZSB0byBiZSBsb2FkZWQuXG4gKiBAcmV0dXJucyB7TW9jaGF9IHRoaXNcbiAqIEBjaGFpbmFibGVcbiAqL1xuTW9jaGEucHJvdG90eXBlLmFkZEZpbGUgPSBmdW5jdGlvbiAoZmlsZSkge1xuICB0aGlzLmZpbGVzLnB1c2goZmlsZSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXRzIHJlcG9ydGVyIHRvIGByZXBvcnRlcmAsIGRlZmF1bHRzIHRvIFwic3BlY1wiLlxuICpcbiAqIEBwdWJsaWNcbiAqIEBzZWUgW0NMSSBvcHRpb25dKC4uLyMtcmVwb3J0ZXItbmFtZS1yLW5hbWUpXG4gKiBAc2VlIFtSZXBvcnRlcnNdKC4uLyNyZXBvcnRlcnMpXG4gKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gcmVwb3J0ZXJOYW1lIC0gUmVwb3J0ZXIgbmFtZSBvciBjb25zdHJ1Y3Rvci5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVwb3J0ZXJPcHRpb25zXSAtIE9wdGlvbnMgdXNlZCB0byBjb25maWd1cmUgdGhlIHJlcG9ydGVyLlxuICogQHJldHVybnMge01vY2hhfSB0aGlzXG4gKiBAY2hhaW5hYmxlXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgcmVxdWVzdGVkIHJlcG9ydGVyIGNhbm5vdCBiZSBsb2FkZWRcbiAqIEBleGFtcGxlXG4gKlxuICogLy8gVXNlIFhVbml0IHJlcG9ydGVyIGFuZCBkaXJlY3QgaXRzIG91dHB1dCB0byBmaWxlXG4gKiBtb2NoYS5yZXBvcnRlcigneHVuaXQnLCB7IG91dHB1dDogJy9wYXRoL3RvL3Rlc3RzcGVjLnh1bml0LnhtbCcgfSk7XG4gKi9cbk1vY2hhLnByb3RvdHlwZS5yZXBvcnRlciA9IGZ1bmN0aW9uIChyZXBvcnRlck5hbWUsIHJlcG9ydGVyT3B0aW9ucykge1xuICBpZiAodHlwZW9mIHJlcG9ydGVyTmFtZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRoaXMuX3JlcG9ydGVyID0gcmVwb3J0ZXJOYW1lO1xuICB9IGVsc2Uge1xuICAgIHJlcG9ydGVyTmFtZSA9IHJlcG9ydGVyTmFtZSB8fCAnc3BlYyc7XG4gICAgdmFyIHJlcG9ydGVyO1xuICAgIC8vIFRyeSB0byBsb2FkIGEgYnVpbHQtaW4gcmVwb3J0ZXIuXG4gICAgaWYgKGJ1aWx0aW5SZXBvcnRlcnNbcmVwb3J0ZXJOYW1lXSkge1xuICAgICAgcmVwb3J0ZXIgPSBidWlsdGluUmVwb3J0ZXJzW3JlcG9ydGVyTmFtZV07XG4gICAgfVxuICAgIC8vIFRyeSB0byBsb2FkIHJlcG9ydGVycyBmcm9tIHByb2Nlc3MuY3dkKCkgYW5kIG5vZGVfbW9kdWxlc1xuICAgIGlmICghcmVwb3J0ZXIpIHtcbiAgICAgIGxldCBmb3VuZFJlcG9ydGVyO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm91bmRSZXBvcnRlciA9IHJlcXVpcmUucmVzb2x2ZShyZXBvcnRlck5hbWUpO1xuICAgICAgICByZXBvcnRlciA9IHJlcXVpcmUoZm91bmRSZXBvcnRlcik7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGZvdW5kUmVwb3J0ZXIpIHtcbiAgICAgICAgICB0aHJvdyBjcmVhdGVJbnZhbGlkUmVwb3J0ZXJFcnJvcihlcnIubWVzc2FnZSwgZm91bmRSZXBvcnRlcik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVHJ5IHRvIGxvYWQgcmVwb3J0ZXJzIGZyb20gYSBjd2QtcmVsYXRpdmUgcGF0aFxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlcG9ydGVyID0gcmVxdWlyZShwYXRoLnJlc29sdmUocmVwb3J0ZXJOYW1lKSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0aHJvdyBjcmVhdGVJbnZhbGlkUmVwb3J0ZXJFcnJvcihlLm1lc3NhZ2UsIHJlcG9ydGVyTmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fcmVwb3J0ZXIgPSByZXBvcnRlcjtcbiAgfVxuICB0aGlzLm9wdGlvbnMucmVwb3J0ZXJPcHRpb24gPSByZXBvcnRlck9wdGlvbnM7XG4gIC8vIGFsaWFzIG9wdGlvbiBuYW1lIGlzIHVzZWQgaW4gYnVpbHQtaW4gcmVwb3J0ZXJzIHh1bml0L3RhcC9wcm9ncmVzc1xuICB0aGlzLm9wdGlvbnMucmVwb3J0ZXJPcHRpb25zID0gcmVwb3J0ZXJPcHRpb25zO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0cyB0ZXN0IFVJIGBuYW1lYCwgZGVmYXVsdHMgdG8gXCJiZGRcIi5cbiAqXG4gKiBAcHVibGljXG4gKiBAc2VlIFtDTEkgb3B0aW9uXSguLi8jLXVpLW5hbWUtdS1uYW1lKVxuICogQHNlZSBbSW50ZXJmYWNlIERTTHNdKC4uLyNpbnRlcmZhY2VzKVxuICogQHBhcmFtIHtzdHJpbmd8RnVuY3Rpb259IFt1aT1iZGRdIC0gSW50ZXJmYWNlIG5hbWUgb3IgY2xhc3MuXG4gKiBAcmV0dXJucyB7TW9jaGF9IHRoaXNcbiAqIEBjaGFpbmFibGVcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiByZXF1ZXN0ZWQgaW50ZXJmYWNlIGNhbm5vdCBiZSBsb2FkZWRcbiAqL1xuTW9jaGEucHJvdG90eXBlLnVpID0gZnVuY3Rpb24gKHVpKSB7XG4gIHZhciBiaW5kSW50ZXJmYWNlO1xuICBpZiAodHlwZW9mIHVpID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYmluZEludGVyZmFjZSA9IHVpO1xuICB9IGVsc2Uge1xuICAgIHVpID0gdWkgfHwgJ2JkZCc7XG4gICAgYmluZEludGVyZmFjZSA9IGV4cG9ydHMuaW50ZXJmYWNlc1t1aV07XG4gICAgaWYgKCFiaW5kSW50ZXJmYWNlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBiaW5kSW50ZXJmYWNlID0gcmVxdWlyZSh1aSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgY3JlYXRlSW52YWxpZEludGVyZmFjZUVycm9yKGBpbnZhbGlkIGludGVyZmFjZSAnJHt1aX0nYCwgdWkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBiaW5kSW50ZXJmYWNlKHRoaXMuc3VpdGUpO1xuXG4gIHRoaXMuc3VpdGUub24oRVZFTlRfRklMRV9QUkVfUkVRVUlSRSwgZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICBjdXJyZW50Q29udGV4dCA9IGNvbnRleHQ7XG4gIH0pO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBMb2FkcyBgZmlsZXNgIHByaW9yIHRvIGV4ZWN1dGlvbi4gRG9lcyBub3Qgc3VwcG9ydCBFUyBNb2R1bGVzLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVGhlIGltcGxlbWVudGF0aW9uIHJlbGllcyBvbiBOb2RlJ3MgYHJlcXVpcmVgIHRvIGV4ZWN1dGVcbiAqIHRoZSB0ZXN0IGludGVyZmFjZSBmdW5jdGlvbnMgYW5kIHdpbGwgYmUgc3ViamVjdCB0byBpdHMgY2FjaGUuXG4gKiBTdXBwb3J0cyBvbmx5IENvbW1vbkpTIG1vZHVsZXMuIFRvIGxvYWQgRVMgbW9kdWxlcywgdXNlIE1vY2hhI2xvYWRGaWxlc0FzeW5jLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAc2VlIHtAbGluayBNb2NoYSNhZGRGaWxlfVxuICogQHNlZSB7QGxpbmsgTW9jaGEjcnVufVxuICogQHNlZSB7QGxpbmsgTW9jaGEjdW5sb2FkRmlsZXN9XG4gKiBAc2VlIHtAbGluayBNb2NoYSNsb2FkRmlsZXNBc3luY31cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtmbl0gLSBDYWxsYmFjayBpbnZva2VkIHVwb24gY29tcGxldGlvbi5cbiAqL1xuTW9jaGEucHJvdG90eXBlLmxvYWRGaWxlcyA9IGZ1bmN0aW9uIChmbikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBzdWl0ZSA9IHRoaXMuc3VpdGU7XG4gIHRoaXMuZmlsZXMuZm9yRWFjaChmdW5jdGlvbiAoZmlsZSkge1xuICAgIGZpbGUgPSBwYXRoLnJlc29sdmUoZmlsZSk7XG4gICAgc3VpdGUuZW1pdChFVkVOVF9GSUxFX1BSRV9SRVFVSVJFLCBnbG9iYWwsIGZpbGUsIHNlbGYpO1xuICAgIHN1aXRlLmVtaXQoRVZFTlRfRklMRV9SRVFVSVJFLCByZXF1aXJlKGZpbGUpLCBmaWxlLCBzZWxmKTtcbiAgICBzdWl0ZS5lbWl0KEVWRU5UX0ZJTEVfUE9TVF9SRVFVSVJFLCBnbG9iYWwsIGZpbGUsIHNlbGYpO1xuICB9KTtcbiAgZm4gJiYgZm4oKTtcbn07XG5cbi8qKlxuICogTG9hZHMgYGZpbGVzYCBwcmlvciB0byBleGVjdXRpb24uIFN1cHBvcnRzIE5vZGUgRVMgTW9kdWxlcy5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoZSBpbXBsZW1lbnRhdGlvbiByZWxpZXMgb24gTm9kZSdzIGByZXF1aXJlYCBhbmQgYGltcG9ydGAgdG8gZXhlY3V0ZVxuICogdGhlIHRlc3QgaW50ZXJmYWNlIGZ1bmN0aW9ucyBhbmQgd2lsbCBiZSBzdWJqZWN0IHRvIGl0cyBjYWNoZS5cbiAqIFN1cHBvcnRzIGJvdGggQ0pTIGFuZCBFU00gbW9kdWxlcy5cbiAqXG4gKiBAcHVibGljXG4gKiBAc2VlIHtAbGluayBNb2NoYSNhZGRGaWxlfVxuICogQHNlZSB7QGxpbmsgTW9jaGEjcnVufVxuICogQHNlZSB7QGxpbmsgTW9jaGEjdW5sb2FkRmlsZXN9XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gU2V0dGluZ3Mgb2JqZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuZXNtRGVjb3JhdG9yXSAtIEZ1bmN0aW9uIGludm9rZWQgb24gZXNtIG1vZHVsZSBuYW1lIHJpZ2h0IGJlZm9yZSBpbXBvcnRpbmcgaXQuIEJ5IGRlZmF1bHQgd2lsbCBwYXNzdGhyb3VnaCBhcyBpcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlfVxuICogQGV4YW1wbGVcbiAqXG4gKiAvLyBsb2FkcyBFU00gKGFuZCBDSlMpIHRlc3QgZmlsZXMgYXN5bmNocm9ub3VzbHksIHRoZW4gcnVucyByb290IHN1aXRlXG4gKiBtb2NoYS5sb2FkRmlsZXNBc3luYygpXG4gKiAgIC50aGVuKCgpID0+IG1vY2hhLnJ1bihmYWlsdXJlcyA9PiBwcm9jZXNzLmV4aXRDb2RlID0gZmFpbHVyZXMgPyAxIDogMCkpXG4gKiAgIC5jYXRjaCgoKSA9PiBwcm9jZXNzLmV4aXRDb2RlID0gMSk7XG4gKi9cbk1vY2hhLnByb3RvdHlwZS5sb2FkRmlsZXNBc3luYyA9IGZ1bmN0aW9uICh7ZXNtRGVjb3JhdG9yfSA9IHt9KSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHN1aXRlID0gdGhpcy5zdWl0ZTtcbiAgdGhpcy5sYXp5TG9hZEZpbGVzKHRydWUpO1xuXG4gIHJldHVybiBlc21VdGlscy5sb2FkRmlsZXNBc3luYyhcbiAgICB0aGlzLmZpbGVzLFxuICAgIGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICBzdWl0ZS5lbWl0KEVWRU5UX0ZJTEVfUFJFX1JFUVVJUkUsIGdsb2JhbCwgZmlsZSwgc2VsZik7XG4gICAgfSxcbiAgICBmdW5jdGlvbiAoZmlsZSwgcmVzdWx0TW9kdWxlKSB7XG4gICAgICBzdWl0ZS5lbWl0KEVWRU5UX0ZJTEVfUkVRVUlSRSwgcmVzdWx0TW9kdWxlLCBmaWxlLCBzZWxmKTtcbiAgICAgIHN1aXRlLmVtaXQoRVZFTlRfRklMRV9QT1NUX1JFUVVJUkUsIGdsb2JhbCwgZmlsZSwgc2VsZik7XG4gICAgfSxcbiAgICBlc21EZWNvcmF0b3JcbiAgKTtcbn07XG5cbi8qKlxuICogUmVtb3ZlcyBhIHByZXZpb3VzbHkgbG9hZGVkIGZpbGUgZnJvbSBOb2RlJ3MgYHJlcXVpcmVgIGNhY2hlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAc3RhdGljXG4gKiBAc2VlIHtAbGluayBNb2NoYSN1bmxvYWRGaWxlc31cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlIC0gUGF0aG5hbWUgb2YgZmlsZSB0byBiZSB1bmxvYWRlZC5cbiAqL1xuTW9jaGEudW5sb2FkRmlsZSA9IGZ1bmN0aW9uIChmaWxlKSB7XG4gIGlmICh1dGlscy5pc0Jyb3dzZXIoKSkge1xuICAgIHRocm93IGNyZWF0ZVVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICAndW5sb2FkRmlsZSgpIGlzIG9ubHkgc3VwcG9ydGVkIGluIGEgTm9kZS5qcyBlbnZpcm9ubWVudCdcbiAgICApO1xuICB9XG4gIHJldHVybiByZXF1aXJlKCcuL25vZGVqcy9maWxlLXVubG9hZGVyJykudW5sb2FkRmlsZShmaWxlKTtcbn07XG5cbi8qKlxuICogVW5sb2FkcyBgZmlsZXNgIGZyb20gTm9kZSdzIGByZXF1aXJlYCBjYWNoZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoaXMgYWxsb3dzIHJlcXVpcmVkIGZpbGVzIHRvIGJlIFwiZnJlc2hseVwiIHJlbG9hZGVkLCBwcm92aWRpbmcgdGhlIGFiaWxpdHlcbiAqIHRvIHJldXNlIGEgTW9jaGEgaW5zdGFuY2UgcHJvZ3JhbW1hdGljYWxseS5cbiAqIE5vdGU6IGRvZXMgbm90IGNsZWFyIEVTTSBtb2R1bGUgZmlsZXMgZnJvbSB0aGUgY2FjaGVcbiAqXG4gKiA8c3Ryb25nPkludGVuZGVkIGZvciBjb25zdW1lcnMgJm1kYXNoOyBub3QgdXNlZCBpbnRlcm5hbGx5PC9zdHJvbmc+XG4gKlxuICogQHB1YmxpY1xuICogQHNlZSB7QGxpbmsgTW9jaGEjcnVufVxuICogQHJldHVybnMge01vY2hhfSB0aGlzXG4gKiBAY2hhaW5hYmxlXG4gKi9cbk1vY2hhLnByb3RvdHlwZS51bmxvYWRGaWxlcyA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuX3N0YXRlID09PSBtb2NoYVN0YXRlcy5ESVNQT1NFRCkge1xuICAgIHRocm93IGNyZWF0ZU1vY2hhSW5zdGFuY2VBbHJlYWR5RGlzcG9zZWRFcnJvcihcbiAgICAgICdNb2NoYSBpbnN0YW5jZSBpcyBhbHJlYWR5IGRpc3Bvc2VkLCBpdCBjYW5ub3QgYmUgdXNlZCBhZ2Fpbi4nLFxuICAgICAgdGhpcy5fY2xlYW5SZWZlcmVuY2VzQWZ0ZXJSdW4sXG4gICAgICB0aGlzXG4gICAgKTtcbiAgfVxuXG4gIHRoaXMuZmlsZXMuZm9yRWFjaChmdW5jdGlvbiAoZmlsZSkge1xuICAgIE1vY2hhLnVubG9hZEZpbGUoZmlsZSk7XG4gIH0pO1xuICB0aGlzLl9zdGF0ZSA9IG1vY2hhU3RhdGVzLklOSVQ7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXRzIGBncmVwYCBmaWx0ZXIgYWZ0ZXIgZXNjYXBpbmcgUmVnRXhwIHNwZWNpYWwgY2hhcmFjdGVycy5cbiAqXG4gKiBAcHVibGljXG4gKiBAc2VlIHtAbGluayBNb2NoYSNncmVwfVxuICogQHBhcmFtIHtzdHJpbmd9IHN0ciAtIFZhbHVlIHRvIGJlIGNvbnZlcnRlZCB0byBhIHJlZ2V4cC5cbiAqIEByZXR1cm5zIHtNb2NoYX0gdGhpc1xuICogQGNoYWluYWJsZVxuICogQGV4YW1wbGVcbiAqXG4gKiAvLyBTZWxlY3QgdGVzdHMgd2hvc2UgZnVsbCB0aXRsZSBiZWdpbnMgd2l0aCBgXCJmb29cImAgZm9sbG93ZWQgYnkgYSBwZXJpb2RcbiAqIG1vY2hhLmZncmVwKCdmb28uJyk7XG4gKi9cbk1vY2hhLnByb3RvdHlwZS5mZ3JlcCA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgaWYgKCFzdHIpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICByZXR1cm4gdGhpcy5ncmVwKG5ldyBSZWdFeHAoZXNjYXBlUmUoc3RyKSkpO1xufTtcblxuLyoqXG4gKiBAc3VtbWFyeVxuICogU2V0cyBgZ3JlcGAgZmlsdGVyIHVzZWQgdG8gc2VsZWN0IHNwZWNpZmljIHRlc3RzIGZvciBleGVjdXRpb24uXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBJZiBgcmVgIGlzIGEgcmVnZXhwLWxpa2Ugc3RyaW5nLCBpdCB3aWxsIGJlIGNvbnZlcnRlZCB0byByZWdleHAuXG4gKiBUaGUgcmVnZXhwIGlzIHRlc3RlZCBhZ2FpbnN0IHRoZSBmdWxsIHRpdGxlIG9mIGVhY2ggdGVzdCAoaS5lLiwgdGhlXG4gKiBuYW1lIG9mIHRoZSB0ZXN0IHByZWNlZGVkIGJ5IHRpdGxlcyBvZiBlYWNoIGl0cyBhbmNlc3RyYWwgc3VpdGVzKS5cbiAqIEFzIHN1Y2gsIHVzaW5nIGFuIDxlbT5leGFjdC1tYXRjaDwvZW0+IGZpeGVkIHBhdHRlcm4gYWdhaW5zdCB0aGVcbiAqIHRlc3QgbmFtZSBpdHNlbGYgd2lsbCBub3QgeWllbGQgYW55IG1hdGNoZXMuXG4gKiA8YnI+XG4gKiA8c3Ryb25nPlByZXZpb3VzIGZpbHRlciB2YWx1ZSB3aWxsIGJlIG92ZXJ3cml0dGVuIG9uIGVhY2ggY2FsbCE8L3N0cm9uZz5cbiAqXG4gKiBAcHVibGljXG4gKiBAc2VlIFtDTEkgb3B0aW9uXSguLi8jLWdyZXAtcmVnZXhwLWctcmVnZXhwKVxuICogQHNlZSB7QGxpbmsgTW9jaGEjZmdyZXB9XG4gKiBAc2VlIHtAbGluayBNb2NoYSNpbnZlcnR9XG4gKiBAcGFyYW0ge1JlZ0V4cHxTdHJpbmd9IHJlIC0gUmVndWxhciBleHByZXNzaW9uIHVzZWQgdG8gc2VsZWN0IHRlc3RzLlxuICogQHJldHVybiB7TW9jaGF9IHRoaXNcbiAqIEBjaGFpbmFibGVcbiAqIEBleGFtcGxlXG4gKlxuICogLy8gU2VsZWN0IHRlc3RzIHdob3NlIGZ1bGwgdGl0bGUgY29udGFpbnMgYFwibWF0Y2hcImAsIGlnbm9yaW5nIGNhc2VcbiAqIG1vY2hhLmdyZXAoL21hdGNoL2kpO1xuICogQGV4YW1wbGVcbiAqXG4gKiAvLyBTYW1lIGFzIGFib3ZlIGJ1dCB3aXRoIHJlZ2V4cC1saWtlIHN0cmluZyBhcmd1bWVudFxuICogbW9jaGEuZ3JlcCgnL21hdGNoL2knKTtcbiAqIEBleGFtcGxlXG4gKlxuICogLy8gIyMgQW50aS1leGFtcGxlXG4gKiAvLyBHaXZlbiBlbWJlZGRlZCB0ZXN0IGBpdCgnb25seS10aGlzLXRlc3QnKWAuLi5cbiAqIG1vY2hhLmdyZXAoJy9eb25seS10aGlzLXRlc3QkLycpOyAgICAvLyBOTyEgVXNlIGAub25seSgpYCB0byBkbyB0aGlzIVxuICovXG5Nb2NoYS5wcm90b3R5cGUuZ3JlcCA9IGZ1bmN0aW9uIChyZSkge1xuICBpZiAodXRpbHMuaXNTdHJpbmcocmUpKSB7XG4gICAgLy8gZXh0cmFjdCBhcmdzIGlmIGl0J3MgcmVnZXgtbGlrZSwgaS5lOiBbc3RyaW5nLCBwYXR0ZXJuLCBmbGFnXVxuICAgIHZhciBhcmcgPSByZS5tYXRjaCgvXlxcLyguKilcXC8oW2dpbXldezAsNH0pJHwuKi8pO1xuICAgIHRoaXMub3B0aW9ucy5ncmVwID0gbmV3IFJlZ0V4cChhcmdbMV0gfHwgYXJnWzBdLCBhcmdbMl0pO1xuICB9IGVsc2Uge1xuICAgIHRoaXMub3B0aW9ucy5ncmVwID0gcmU7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEludmVydHMgYGdyZXBgIG1hdGNoZXMuXG4gKlxuICogQHB1YmxpY1xuICogQHNlZSB7QGxpbmsgTW9jaGEjZ3JlcH1cbiAqIEByZXR1cm4ge01vY2hhfSB0aGlzXG4gKiBAY2hhaW5hYmxlXG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIFNlbGVjdCB0ZXN0cyB3aG9zZSBmdWxsIHRpdGxlIGRvZXMgKm5vdCogY29udGFpbiBgXCJtYXRjaFwiYCwgaWdub3JpbmcgY2FzZVxuICogbW9jaGEuZ3JlcCgvbWF0Y2gvaSkuaW52ZXJ0KCk7XG4gKi9cbk1vY2hhLnByb3RvdHlwZS5pbnZlcnQgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMub3B0aW9ucy5pbnZlcnQgPSB0cnVlO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogRW5hYmxlcyBvciBkaXNhYmxlcyBjaGVja2luZyBmb3IgZ2xvYmFsIHZhcmlhYmxlcyBsZWFrZWQgd2hpbGUgcnVubmluZyB0ZXN0cy5cbiAqXG4gKiBAcHVibGljXG4gKiBAc2VlIFtDTEkgb3B0aW9uXSguLi8jLWNoZWNrLWxlYWtzKVxuICogQHBhcmFtIHtib29sZWFufSBbY2hlY2tMZWFrcz10cnVlXSAtIFdoZXRoZXIgdG8gY2hlY2sgZm9yIGdsb2JhbCB2YXJpYWJsZSBsZWFrcy5cbiAqIEByZXR1cm4ge01vY2hhfSB0aGlzXG4gKiBAY2hhaW5hYmxlXG4gKi9cbk1vY2hhLnByb3RvdHlwZS5jaGVja0xlYWtzID0gZnVuY3Rpb24gKGNoZWNrTGVha3MpIHtcbiAgdGhpcy5vcHRpb25zLmNoZWNrTGVha3MgPSBjaGVja0xlYWtzICE9PSBmYWxzZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgd2hldGhlciBvciBub3QgdG8gZGlzcG9zZSBhZnRlciBlYWNoIHRlc3QgcnVuLlxuICogRGlzYWJsZSB0aGlzIHRvIGVuc3VyZSB5b3UgY2FuIHJ1biB0aGUgdGVzdCBzdWl0ZSBtdWx0aXBsZSB0aW1lcy5cbiAqIElmIGRpc2FibGVkLCBiZSBzdXJlIHRvIGRpc3Bvc2UgbW9jaGEgd2hlbiB5b3UncmUgZG9uZSB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy5cbiAqIEBwdWJsaWNcbiAqIEBzZWUge0BsaW5rIE1vY2hhI2Rpc3Bvc2V9XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGNsZWFuUmVmZXJlbmNlc0FmdGVyUnVuXG4gKiBAcmV0dXJuIHtNb2NoYX0gdGhpc1xuICogQGNoYWluYWJsZVxuICovXG5Nb2NoYS5wcm90b3R5cGUuY2xlYW5SZWZlcmVuY2VzQWZ0ZXJSdW4gPSBmdW5jdGlvbiAoY2xlYW5SZWZlcmVuY2VzQWZ0ZXJSdW4pIHtcbiAgdGhpcy5fY2xlYW5SZWZlcmVuY2VzQWZ0ZXJSdW4gPSBjbGVhblJlZmVyZW5jZXNBZnRlclJ1biAhPT0gZmFsc2U7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBNYW51YWxseSBkaXNwb3NlIHRoaXMgbW9jaGEgaW5zdGFuY2UuIE1hcmsgdGhpcyBpbnN0YW5jZSBhcyBgZGlzcG9zZWRgIGFuZCB1bmFibGUgdG8gcnVuIG1vcmUgdGVzdHMuXG4gKiBJdCBhbHNvIHJlbW92ZXMgZnVuY3Rpb24gcmVmZXJlbmNlcyB0byB0ZXN0cyBmdW5jdGlvbnMgYW5kIGhvb2tzLCBzbyB2YXJpYWJsZXMgdHJhcHBlZCBpbiBjbG9zdXJlcyBjYW4gYmUgY2xlYW5lZCBieSB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IuXG4gKiBAcHVibGljXG4gKi9cbk1vY2hhLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5fc3RhdGUgPT09IG1vY2hhU3RhdGVzLlJVTk5JTkcpIHtcbiAgICB0aHJvdyBjcmVhdGVNb2NoYUluc3RhbmNlQWxyZWFkeVJ1bm5pbmdFcnJvcihcbiAgICAgICdDYW5ub3QgZGlzcG9zZSB3aGlsZSB0aGUgbW9jaGEgaW5zdGFuY2UgaXMgc3RpbGwgcnVubmluZyB0ZXN0cy4nXG4gICAgKTtcbiAgfVxuICB0aGlzLnVubG9hZEZpbGVzKCk7XG4gIHRoaXMuX3ByZXZpb3VzUnVubmVyICYmIHRoaXMuX3ByZXZpb3VzUnVubmVyLmRpc3Bvc2UoKTtcbiAgdGhpcy5zdWl0ZS5kaXNwb3NlKCk7XG4gIHRoaXMuX3N0YXRlID0gbW9jaGFTdGF0ZXMuRElTUE9TRUQ7XG59O1xuXG4vKipcbiAqIERpc3BsYXlzIGZ1bGwgc3RhY2sgdHJhY2UgdXBvbiB0ZXN0IGZhaWx1cmUuXG4gKlxuICogQHB1YmxpY1xuICogQHNlZSBbQ0xJIG9wdGlvbl0oLi4vIy1mdWxsLXRyYWNlKVxuICogQHBhcmFtIHtib29sZWFufSBbZnVsbFRyYWNlPXRydWVdIC0gV2hldGhlciB0byBwcmludCBmdWxsIHN0YWNrdHJhY2UgdXBvbiBmYWlsdXJlLlxuICogQHJldHVybiB7TW9jaGF9IHRoaXNcbiAqIEBjaGFpbmFibGVcbiAqL1xuTW9jaGEucHJvdG90eXBlLmZ1bGxUcmFjZSA9IGZ1bmN0aW9uIChmdWxsVHJhY2UpIHtcbiAgdGhpcy5vcHRpb25zLmZ1bGxUcmFjZSA9IGZ1bGxUcmFjZSAhPT0gZmFsc2U7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTcGVjaWZpZXMgd2hpdGVsaXN0IG9mIHZhcmlhYmxlIG5hbWVzIHRvIGJlIGV4cGVjdGVkIGluIGdsb2JhbCBzY29wZS5cbiAqXG4gKiBAcHVibGljXG4gKiBAc2VlIFtDTEkgb3B0aW9uXSguLi8jLWdsb2JhbC12YXJpYWJsZS1uYW1lKVxuICogQHNlZSB7QGxpbmsgTW9jaGEjY2hlY2tMZWFrc31cbiAqIEBwYXJhbSB7U3RyaW5nW118U3RyaW5nfSBnbG9iYWwgLSBBY2NlcHRlZCBnbG9iYWwgdmFyaWFibGUgbmFtZShzKS5cbiAqIEByZXR1cm4ge01vY2hhfSB0aGlzXG4gKiBAY2hhaW5hYmxlXG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIFNwZWNpZnkgdmFyaWFibGVzIHRvIGJlIGV4cGVjdGVkIGluIGdsb2JhbCBzY29wZVxuICogbW9jaGEuZ2xvYmFsKFsnalF1ZXJ5JywgJ015TGliJ10pO1xuICovXG5Nb2NoYS5wcm90b3R5cGUuZ2xvYmFsID0gZnVuY3Rpb24gKGdsb2JhbCkge1xuICB0aGlzLm9wdGlvbnMuZ2xvYmFsID0gKHRoaXMub3B0aW9ucy5nbG9iYWwgfHwgW10pXG4gICAgLmNvbmNhdChnbG9iYWwpXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5maWx0ZXIoZnVuY3Rpb24gKGVsdCwgaWR4LCBhcnIpIHtcbiAgICAgIHJldHVybiBhcnIuaW5kZXhPZihlbHQpID09PSBpZHg7XG4gICAgfSk7XG4gIHJldHVybiB0aGlzO1xufTtcbi8vIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgJ2dsb2JhbHMnIGlzIGFuIGFsaWFzIG9mICdnbG9iYWwnXG5Nb2NoYS5wcm90b3R5cGUuZ2xvYmFscyA9IE1vY2hhLnByb3RvdHlwZS5nbG9iYWw7XG5cbi8qKlxuICogRW5hYmxlcyBvciBkaXNhYmxlcyBUVFkgY29sb3Igb3V0cHV0IGJ5IHNjcmVlbi1vcmllbnRlZCByZXBvcnRlcnMuXG4gKlxuICogQHB1YmxpY1xuICogQHNlZSBbQ0xJIG9wdGlvbl0oLi4vIy1jb2xvci1jLWNvbG9ycylcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NvbG9yPXRydWVdIC0gV2hldGhlciB0byBlbmFibGUgY29sb3Igb3V0cHV0LlxuICogQHJldHVybiB7TW9jaGF9IHRoaXNcbiAqIEBjaGFpbmFibGVcbiAqL1xuTW9jaGEucHJvdG90eXBlLmNvbG9yID0gZnVuY3Rpb24gKGNvbG9yKSB7XG4gIHRoaXMub3B0aW9ucy5jb2xvciA9IGNvbG9yICE9PSBmYWxzZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgcmVwb3J0ZXIgdG8gdXNlIGlubGluZSBkaWZmcyAocmF0aGVyIHRoYW4gKy8tKVxuICogaW4gdGVzdCBmYWlsdXJlIG91dHB1dC5cbiAqXG4gKiBAcHVibGljXG4gKiBAc2VlIFtDTEkgb3B0aW9uXSguLi8jLWlubGluZS1kaWZmcylcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lubGluZURpZmZzPXRydWVdIC0gV2hldGhlciB0byB1c2UgaW5saW5lIGRpZmZzLlxuICogQHJldHVybiB7TW9jaGF9IHRoaXNcbiAqIEBjaGFpbmFibGVcbiAqL1xuTW9jaGEucHJvdG90eXBlLmlubGluZURpZmZzID0gZnVuY3Rpb24gKGlubGluZURpZmZzKSB7XG4gIHRoaXMub3B0aW9ucy5pbmxpbmVEaWZmcyA9IGlubGluZURpZmZzICE9PSBmYWxzZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgcmVwb3J0ZXIgdG8gaW5jbHVkZSBkaWZmIGluIHRlc3QgZmFpbHVyZSBvdXRwdXQuXG4gKlxuICogQHB1YmxpY1xuICogQHNlZSBbQ0xJIG9wdGlvbl0oLi4vIy1kaWZmKVxuICogQHBhcmFtIHtib29sZWFufSBbZGlmZj10cnVlXSAtIFdoZXRoZXIgdG8gc2hvdyBkaWZmIG9uIGZhaWx1cmUuXG4gKiBAcmV0dXJuIHtNb2NoYX0gdGhpc1xuICogQGNoYWluYWJsZVxuICovXG5Nb2NoYS5wcm90b3R5cGUuZGlmZiA9IGZ1bmN0aW9uIChkaWZmKSB7XG4gIHRoaXMub3B0aW9ucy5kaWZmID0gZGlmZiAhPT0gZmFsc2U7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBAc3VtbWFyeVxuICogU2V0cyB0aW1lb3V0IHRocmVzaG9sZCB2YWx1ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEEgc3RyaW5nIGFyZ3VtZW50IGNhbiB1c2Ugc2hvcnRoYW5kIChzdWNoIGFzIFwiMnNcIikgYW5kIHdpbGwgYmUgY29udmVydGVkLlxuICogSWYgdGhlIHZhbHVlIGlzIGAwYCwgdGltZW91dHMgd2lsbCBiZSBkaXNhYmxlZC5cbiAqXG4gKiBAcHVibGljXG4gKiBAc2VlIFtDTEkgb3B0aW9uXSguLi8jLXRpbWVvdXQtbXMtdC1tcylcbiAqIEBzZWUgW1RpbWVvdXRzXSguLi8jdGltZW91dHMpXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IG1zZWNzIC0gVGltZW91dCB0aHJlc2hvbGQgdmFsdWUuXG4gKiBAcmV0dXJuIHtNb2NoYX0gdGhpc1xuICogQGNoYWluYWJsZVxuICogQGV4YW1wbGVcbiAqXG4gKiAvLyBTZXRzIHRpbWVvdXQgdG8gb25lIHNlY29uZFxuICogbW9jaGEudGltZW91dCgxMDAwKTtcbiAqIEBleGFtcGxlXG4gKlxuICogLy8gU2FtZSBhcyBhYm92ZSBidXQgdXNpbmcgc3RyaW5nIGFyZ3VtZW50XG4gKiBtb2NoYS50aW1lb3V0KCcxcycpO1xuICovXG5Nb2NoYS5wcm90b3R5cGUudGltZW91dCA9IGZ1bmN0aW9uIChtc2Vjcykge1xuICB0aGlzLnN1aXRlLnRpbWVvdXQobXNlY3MpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0cyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRvIHJldHJ5IGZhaWxlZCB0ZXN0cy5cbiAqXG4gKiBAcHVibGljXG4gKiBAc2VlIFtDTEkgb3B0aW9uXSguLi8jLXJldHJpZXMtbilcbiAqIEBzZWUgW1JldHJ5IFRlc3RzXSguLi8jcmV0cnktdGVzdHMpXG4gKiBAcGFyYW0ge251bWJlcn0gcmV0cnkgLSBOdW1iZXIgb2YgdGltZXMgdG8gcmV0cnkgZmFpbGVkIHRlc3RzLlxuICogQHJldHVybiB7TW9jaGF9IHRoaXNcbiAqIEBjaGFpbmFibGVcbiAqIEBleGFtcGxlXG4gKlxuICogLy8gQWxsb3cgYW55IGZhaWxlZCB0ZXN0IHRvIHJldHJ5IG9uZSBtb3JlIHRpbWVcbiAqIG1vY2hhLnJldHJpZXMoMSk7XG4gKi9cbk1vY2hhLnByb3RvdHlwZS5yZXRyaWVzID0gZnVuY3Rpb24gKHJldHJ5KSB7XG4gIHRoaXMuc3VpdGUucmV0cmllcyhyZXRyeSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXRzIHNsb3duZXNzIHRocmVzaG9sZCB2YWx1ZS5cbiAqXG4gKiBAcHVibGljXG4gKiBAc2VlIFtDTEkgb3B0aW9uXSguLi8jLXNsb3ctbXMtcy1tcylcbiAqIEBwYXJhbSB7bnVtYmVyfSBtc2VjcyAtIFNsb3duZXNzIHRocmVzaG9sZCB2YWx1ZS5cbiAqIEByZXR1cm4ge01vY2hhfSB0aGlzXG4gKiBAY2hhaW5hYmxlXG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIFNldHMgXCJzbG93XCIgdGhyZXNob2xkIHRvIGhhbGYgYSBzZWNvbmRcbiAqIG1vY2hhLnNsb3coNTAwKTtcbiAqIEBleGFtcGxlXG4gKlxuICogLy8gU2FtZSBhcyBhYm92ZSBidXQgdXNpbmcgc3RyaW5nIGFyZ3VtZW50XG4gKiBtb2NoYS5zbG93KCcwLjVzJyk7XG4gKi9cbk1vY2hhLnByb3RvdHlwZS5zbG93ID0gZnVuY3Rpb24gKG1zZWNzKSB7XG4gIHRoaXMuc3VpdGUuc2xvdyhtc2Vjcyk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBGb3JjZXMgYWxsIHRlc3RzIHRvIGVpdGhlciBhY2NlcHQgYSBgZG9uZWAgY2FsbGJhY2sgb3IgcmV0dXJuIGEgcHJvbWlzZS5cbiAqXG4gKiBAcHVibGljXG4gKiBAc2VlIFtDTEkgb3B0aW9uXSguLi8jLWFzeW5jLW9ubHktYSlcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FzeW5jT25seT10cnVlXSAtIFdoZXRoZXIgdG8gZm9yY2UgYGRvbmVgIGNhbGxiYWNrIG9yIHByb21pc2UuXG4gKiBAcmV0dXJuIHtNb2NoYX0gdGhpc1xuICogQGNoYWluYWJsZVxuICovXG5Nb2NoYS5wcm90b3R5cGUuYXN5bmNPbmx5ID0gZnVuY3Rpb24gKGFzeW5jT25seSkge1xuICB0aGlzLm9wdGlvbnMuYXN5bmNPbmx5ID0gYXN5bmNPbmx5ICE9PSBmYWxzZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIERpc2FibGVzIHN5bnRheCBoaWdobGlnaHRpbmcgKGluIGJyb3dzZXIpLlxuICpcbiAqIEBwdWJsaWNcbiAqIEByZXR1cm4ge01vY2hhfSB0aGlzXG4gKiBAY2hhaW5hYmxlXG4gKi9cbk1vY2hhLnByb3RvdHlwZS5ub0hpZ2hsaWdodGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5vcHRpb25zLm5vSGlnaGxpZ2h0aW5nID0gdHJ1ZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdW5jYXVnaHQgZXJyb3JzIHRvIHByb3BhZ2F0ZS5cbiAqXG4gKiBAcHVibGljXG4gKiBAc2VlIFtDTEkgb3B0aW9uXSguLi8jLWFsbG93LXVuY2F1Z2h0KVxuICogQHBhcmFtIHtib29sZWFufSBbYWxsb3dVbmNhdWdodD10cnVlXSAtIFdoZXRoZXIgdG8gcHJvcGFnYXRlIHVuY2F1Z2h0IGVycm9ycy5cbiAqIEByZXR1cm4ge01vY2hhfSB0aGlzXG4gKiBAY2hhaW5hYmxlXG4gKi9cbk1vY2hhLnByb3RvdHlwZS5hbGxvd1VuY2F1Z2h0ID0gZnVuY3Rpb24gKGFsbG93VW5jYXVnaHQpIHtcbiAgdGhpcy5vcHRpb25zLmFsbG93VW5jYXVnaHQgPSBhbGxvd1VuY2F1Z2h0ICE9PSBmYWxzZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEBzdW1tYXJ5XG4gKiBEZWxheXMgcm9vdCBzdWl0ZSBleGVjdXRpb24uXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBVc2VkIHRvIHBlcmZvcm0gYXN5bmMgb3BlcmF0aW9ucyBiZWZvcmUgYW55IHN1aXRlcyBhcmUgcnVuLlxuICpcbiAqIEBwdWJsaWNcbiAqIEBzZWUgW2RlbGF5ZWQgcm9vdCBzdWl0ZV0oLi4vI2RlbGF5ZWQtcm9vdC1zdWl0ZSlcbiAqIEByZXR1cm5zIHtNb2NoYX0gdGhpc1xuICogQGNoYWluYWJsZVxuICovXG5Nb2NoYS5wcm90b3R5cGUuZGVsYXkgPSBmdW5jdGlvbiBkZWxheSgpIHtcbiAgdGhpcy5vcHRpb25zLmRlbGF5ID0gdHJ1ZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgcnVubmluZyB0ZXN0cyBpbiBkcnktcnVuIG1vZGUuXG4gKlxuICogQHB1YmxpY1xuICogQHNlZSBbQ0xJIG9wdGlvbl0oLi4vIy1kcnktcnVuKVxuICogQHBhcmFtIHtib29sZWFufSBbZHJ5UnVuPXRydWVdIC0gV2hldGhlciB0byBhY3RpdmF0ZSBkcnktcnVuIG1vZGUuXG4gKiBAcmV0dXJuIHtNb2NoYX0gdGhpc1xuICogQGNoYWluYWJsZVxuICovXG5Nb2NoYS5wcm90b3R5cGUuZHJ5UnVuID0gZnVuY3Rpb24gKGRyeVJ1bikge1xuICB0aGlzLm9wdGlvbnMuZHJ5UnVuID0gZHJ5UnVuICE9PSBmYWxzZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEZhaWxzIHRlc3QgcnVuIGlmIG5vIHRlc3RzIGVuY291bnRlcmVkIHdpdGggZXhpdC1jb2RlIDEuXG4gKlxuICogQHB1YmxpY1xuICogQHNlZSBbQ0xJIG9wdGlvbl0oLi4vIy1mYWlsLXplcm8pXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmYWlsWmVybz10cnVlXSAtIFdoZXRoZXIgdG8gZmFpbCB0ZXN0IHJ1bi5cbiAqIEByZXR1cm4ge01vY2hhfSB0aGlzXG4gKiBAY2hhaW5hYmxlXG4gKi9cbk1vY2hhLnByb3RvdHlwZS5mYWlsWmVybyA9IGZ1bmN0aW9uIChmYWlsWmVybykge1xuICB0aGlzLm9wdGlvbnMuZmFpbFplcm8gPSBmYWlsWmVybyAhPT0gZmFsc2U7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBGYWlsIHRlc3QgcnVuIGlmIHRlc3RzIHdlcmUgZmFpbGVkLlxuICpcbiAqIEBwdWJsaWNcbiAqIEBzZWUgW0NMSSBvcHRpb25dKC4uLyMtcGFzcy1vbi1mYWlsaW5nLXRlc3Qtc3VpdGUpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwYXNzT25GYWlsaW5nVGVzdFN1aXRlPWZhbHNlXSAtIFdoZXRoZXIgdG8gZmFpbCB0ZXN0IHJ1bi5cbiAqIEByZXR1cm4ge01vY2hhfSB0aGlzXG4gKiBAY2hhaW5hYmxlXG4gKi9cbk1vY2hhLnByb3RvdHlwZS5wYXNzT25GYWlsaW5nVGVzdFN1aXRlID0gZnVuY3Rpb24ocGFzc09uRmFpbGluZ1Rlc3RTdWl0ZSkge1xuICB0aGlzLm9wdGlvbnMucGFzc09uRmFpbGluZ1Rlc3RTdWl0ZSA9IHBhc3NPbkZhaWxpbmdUZXN0U3VpdGUgPT09IHRydWU7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBDYXVzZXMgdGVzdHMgbWFya2VkIGBvbmx5YCB0byBmYWlsIHRoZSBzdWl0ZS5cbiAqXG4gKiBAcHVibGljXG4gKiBAc2VlIFtDTEkgb3B0aW9uXSguLi8jLWZvcmJpZC1vbmx5KVxuICogQHBhcmFtIHtib29sZWFufSBbZm9yYmlkT25seT10cnVlXSAtIFdoZXRoZXIgdGVzdHMgbWFya2VkIGBvbmx5YCBmYWlsIHRoZSBzdWl0ZS5cbiAqIEByZXR1cm5zIHtNb2NoYX0gdGhpc1xuICogQGNoYWluYWJsZVxuICovXG5Nb2NoYS5wcm90b3R5cGUuZm9yYmlkT25seSA9IGZ1bmN0aW9uIChmb3JiaWRPbmx5KSB7XG4gIHRoaXMub3B0aW9ucy5mb3JiaWRPbmx5ID0gZm9yYmlkT25seSAhPT0gZmFsc2U7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBDYXVzZXMgcGVuZGluZyB0ZXN0cyBhbmQgdGVzdHMgbWFya2VkIGBza2lwYCB0byBmYWlsIHRoZSBzdWl0ZS5cbiAqXG4gKiBAcHVibGljXG4gKiBAc2VlIFtDTEkgb3B0aW9uXSguLi8jLWZvcmJpZC1wZW5kaW5nKVxuICogQHBhcmFtIHtib29sZWFufSBbZm9yYmlkUGVuZGluZz10cnVlXSAtIFdoZXRoZXIgcGVuZGluZyB0ZXN0cyBmYWlsIHRoZSBzdWl0ZS5cbiAqIEByZXR1cm5zIHtNb2NoYX0gdGhpc1xuICogQGNoYWluYWJsZVxuICovXG5Nb2NoYS5wcm90b3R5cGUuZm9yYmlkUGVuZGluZyA9IGZ1bmN0aW9uIChmb3JiaWRQZW5kaW5nKSB7XG4gIHRoaXMub3B0aW9ucy5mb3JiaWRQZW5kaW5nID0gZm9yYmlkUGVuZGluZyAhPT0gZmFsc2U7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgbW9jaGEgaXMgaW4gdGhlIHdyb25nIHN0YXRlIHRvIGJlIGFibGUgdG8gdHJhbnNpdGlvbiB0byBhIFwicnVubmluZ1wiIHN0YXRlLlxuICogQHByaXZhdGVcbiAqL1xuTW9jaGEucHJvdG90eXBlLl9ndWFyZFJ1bm5pbmdTdGF0ZVRyYW5zaXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLl9zdGF0ZSA9PT0gbW9jaGFTdGF0ZXMuUlVOTklORykge1xuICAgIHRocm93IGNyZWF0ZU1vY2hhSW5zdGFuY2VBbHJlYWR5UnVubmluZ0Vycm9yKFxuICAgICAgJ01vY2hhIGluc3RhbmNlIGlzIGN1cnJlbnRseSBydW5uaW5nIHRlc3RzLCBjYW5ub3Qgc3RhcnQgYSBuZXh0IHRlc3QgcnVuIHVudGlsIHRoaXMgb25lIGlzIGRvbmUnLFxuICAgICAgdGhpc1xuICAgICk7XG4gIH1cbiAgaWYgKFxuICAgIHRoaXMuX3N0YXRlID09PSBtb2NoYVN0YXRlcy5ESVNQT1NFRCB8fFxuICAgIHRoaXMuX3N0YXRlID09PSBtb2NoYVN0YXRlcy5SRUZFUkVOQ0VTX0NMRUFORURcbiAgKSB7XG4gICAgdGhyb3cgY3JlYXRlTW9jaGFJbnN0YW5jZUFscmVhZHlEaXNwb3NlZEVycm9yKFxuICAgICAgJ01vY2hhIGluc3RhbmNlIGlzIGFscmVhZHkgZGlzcG9zZWQsIGNhbm5vdCBzdGFydCBhIG5ldyB0ZXN0IHJ1bi4gUGxlYXNlIGNyZWF0ZSBhIG5ldyBtb2NoYSBpbnN0YW5jZS4gQmUgc3VyZSB0byBzZXQgZGlzYWJsZSBgY2xlYW5SZWZlcmVuY2VzQWZ0ZXJSdW5gIHdoZW4geW91IHdhbnQgdG8gcmV1c2UgdGhlIHNhbWUgbW9jaGEgaW5zdGFuY2UgZm9yIG11bHRpcGxlIHRlc3QgcnVucy4nLFxuICAgICAgdGhpcy5fY2xlYW5SZWZlcmVuY2VzQWZ0ZXJSdW4sXG4gICAgICB0aGlzXG4gICAgKTtcbiAgfVxufTtcblxuLyoqXG4gKiBNb2NoYSB2ZXJzaW9uIGFzIHNwZWNpZmllZCBieSBcInBhY2thZ2UuanNvblwiLlxuICpcbiAqIEBuYW1lIE1vY2hhI3ZlcnNpb25cbiAqIEB0eXBlIHN0cmluZ1xuICogQHJlYWRvbmx5XG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShNb2NoYS5wcm90b3R5cGUsICd2ZXJzaW9uJywge1xuICB2YWx1ZTogcmVxdWlyZSgnLi4vcGFja2FnZS5qc29uJykudmVyc2lvbixcbiAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IGZhbHNlXG59KTtcblxuLyoqXG4gKiBDYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gdGVzdCBleGVjdXRpb24gaXMgY29tcGxldGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjYWxsYmFjayBEb25lQ0JcbiAqIEBwYXJhbSB7bnVtYmVyfSBmYWlsdXJlcyAtIE51bWJlciBvZiBmYWlsdXJlcyB0aGF0IG9jY3VycmVkLlxuICovXG5cbi8qKlxuICogUnVucyByb290IHN1aXRlIGFuZCBpbnZva2VzIGBmbigpYCB3aGVuIGNvbXBsZXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVG8gcnVuIHRlc3RzIG11bHRpcGxlIHRpbWVzIChvciB0byBydW4gdGVzdHMgaW4gZmlsZXMgdGhhdCBhcmVcbiAqIGFscmVhZHkgaW4gdGhlIGByZXF1aXJlYCBjYWNoZSksIG1ha2Ugc3VyZSB0byBjbGVhciB0aGVtIGZyb21cbiAqIHRoZSBjYWNoZSBmaXJzdCFcbiAqXG4gKiBAcHVibGljXG4gKiBAc2VlIHtAbGluayBNb2NoYSN1bmxvYWRGaWxlc31cbiAqIEBzZWUge0BsaW5rIFJ1bm5lciNydW59XG4gKiBAcGFyYW0ge0RvbmVDQn0gW2ZuXSAtIENhbGxiYWNrIGludm9rZWQgd2hlbiB0ZXN0IGV4ZWN1dGlvbiBjb21wbGV0ZWQuXG4gKiBAcmV0dXJucyB7UnVubmVyfSBydW5uZXIgaW5zdGFuY2VcbiAqIEBleGFtcGxlXG4gKlxuICogLy8gZXhpdCB3aXRoIG5vbi16ZXJvIHN0YXR1cyBpZiB0aGVyZSB3ZXJlIHRlc3QgZmFpbHVyZXNcbiAqIG1vY2hhLnJ1bihmYWlsdXJlcyA9PiBwcm9jZXNzLmV4aXRDb2RlID0gZmFpbHVyZXMgPyAxIDogMCk7XG4gKi9cbk1vY2hhLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoZm4pIHtcbiAgdGhpcy5fZ3VhcmRSdW5uaW5nU3RhdGVUcmFuc2l0aW9uKCk7XG4gIHRoaXMuX3N0YXRlID0gbW9jaGFTdGF0ZXMuUlVOTklORztcbiAgaWYgKHRoaXMuX3ByZXZpb3VzUnVubmVyKSB7XG4gICAgdGhpcy5fcHJldmlvdXNSdW5uZXIuZGlzcG9zZSgpO1xuICAgIHRoaXMuc3VpdGUucmVzZXQoKTtcbiAgfVxuICBpZiAodGhpcy5maWxlcy5sZW5ndGggJiYgIXRoaXMuX2xhenlMb2FkRmlsZXMpIHtcbiAgICB0aGlzLmxvYWRGaWxlcygpO1xuICB9XG4gIHZhciBzdWl0ZSA9IHRoaXMuc3VpdGU7XG4gIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICBvcHRpb25zLmZpbGVzID0gdGhpcy5maWxlcztcbiAgY29uc3QgcnVubmVyID0gbmV3IHRoaXMuX3J1bm5lckNsYXNzKHN1aXRlLCB7XG4gICAgY2xlYW5SZWZlcmVuY2VzQWZ0ZXJSdW46IHRoaXMuX2NsZWFuUmVmZXJlbmNlc0FmdGVyUnVuLFxuICAgIGRlbGF5OiBvcHRpb25zLmRlbGF5LFxuICAgIGRyeVJ1bjogb3B0aW9ucy5kcnlSdW4sXG4gICAgZmFpbFplcm86IG9wdGlvbnMuZmFpbFplcm9cbiAgfSk7XG4gIGNyZWF0ZVN0YXRzQ29sbGVjdG9yKHJ1bm5lcik7XG4gIHZhciByZXBvcnRlciA9IG5ldyB0aGlzLl9yZXBvcnRlcihydW5uZXIsIG9wdGlvbnMpO1xuICBydW5uZXIuY2hlY2tMZWFrcyA9IG9wdGlvbnMuY2hlY2tMZWFrcyA9PT0gdHJ1ZTtcbiAgcnVubmVyLmZ1bGxTdGFja1RyYWNlID0gb3B0aW9ucy5mdWxsVHJhY2U7XG4gIHJ1bm5lci5hc3luY09ubHkgPSBvcHRpb25zLmFzeW5jT25seTtcbiAgcnVubmVyLmFsbG93VW5jYXVnaHQgPSBvcHRpb25zLmFsbG93VW5jYXVnaHQ7XG4gIHJ1bm5lci5mb3JiaWRPbmx5ID0gb3B0aW9ucy5mb3JiaWRPbmx5O1xuICBydW5uZXIuZm9yYmlkUGVuZGluZyA9IG9wdGlvbnMuZm9yYmlkUGVuZGluZztcbiAgaWYgKG9wdGlvbnMuZ3JlcCkge1xuICAgIHJ1bm5lci5ncmVwKG9wdGlvbnMuZ3JlcCwgb3B0aW9ucy5pbnZlcnQpO1xuICB9XG4gIGlmIChvcHRpb25zLmdsb2JhbCkge1xuICAgIHJ1bm5lci5nbG9iYWxzKG9wdGlvbnMuZ2xvYmFsKTtcbiAgfVxuICBpZiAob3B0aW9ucy5jb2xvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZXhwb3J0cy5yZXBvcnRlcnMuQmFzZS51c2VDb2xvcnMgPSBvcHRpb25zLmNvbG9yO1xuICB9XG4gIGV4cG9ydHMucmVwb3J0ZXJzLkJhc2UuaW5saW5lRGlmZnMgPSBvcHRpb25zLmlubGluZURpZmZzO1xuICBleHBvcnRzLnJlcG9ydGVycy5CYXNlLmhpZGVEaWZmID0gIW9wdGlvbnMuZGlmZjtcblxuICBjb25zdCBkb25lID0gZmFpbHVyZXMgPT4ge1xuICAgIHRoaXMuX3ByZXZpb3VzUnVubmVyID0gcnVubmVyO1xuICAgIHRoaXMuX3N0YXRlID0gdGhpcy5fY2xlYW5SZWZlcmVuY2VzQWZ0ZXJSdW5cbiAgICAgID8gbW9jaGFTdGF0ZXMuUkVGRVJFTkNFU19DTEVBTkVEXG4gICAgICA6IG1vY2hhU3RhdGVzLklOSVQ7XG4gICAgZm4gPSBmbiB8fCB1dGlscy5ub29wO1xuICAgIGlmICh0eXBlb2YgcmVwb3J0ZXIuZG9uZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmVwb3J0ZXIuZG9uZShmYWlsdXJlcywgZm4pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmbihmYWlsdXJlcyk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHJ1bkFzeW5jID0gYXN5bmMgcnVubmVyID0+IHtcbiAgICBjb25zdCBjb250ZXh0ID1cbiAgICAgIHRoaXMub3B0aW9ucy5lbmFibGVHbG9iYWxTZXR1cCAmJiB0aGlzLmhhc0dsb2JhbFNldHVwRml4dHVyZXMoKVxuICAgICAgICA/IGF3YWl0IHRoaXMucnVuR2xvYmFsU2V0dXAocnVubmVyKVxuICAgICAgICA6IHt9O1xuICAgIGNvbnN0IGZhaWx1cmVDb3VudCA9IGF3YWl0IHJ1bm5lci5ydW5Bc3luYyh7XG4gICAgICBmaWxlczogdGhpcy5maWxlcyxcbiAgICAgIG9wdGlvbnNcbiAgICB9KTtcbiAgICBpZiAodGhpcy5vcHRpb25zLmVuYWJsZUdsb2JhbFRlYXJkb3duICYmIHRoaXMuaGFzR2xvYmFsVGVhcmRvd25GaXh0dXJlcygpKSB7XG4gICAgICBhd2FpdCB0aGlzLnJ1bkdsb2JhbFRlYXJkb3duKHJ1bm5lciwge2NvbnRleHR9KTtcbiAgICB9XG4gICAgcmV0dXJuIGZhaWx1cmVDb3VudDtcbiAgfTtcblxuICAvLyBubyBcImNhdGNoXCIgaGVyZSBpcyBpbnRlbnRpb25hbC4gZXJyb3JzIGNvbWluZyBvdXQgb2ZcbiAgLy8gUnVubmVyI3J1biBhcmUgY29uc2lkZXJlZCB1bmNhdWdodC91bmhhbmRsZWQgYW5kIGNhdWdodFxuICAvLyBieSB0aGUgYHByb2Nlc3NgIGV2ZW50IGxpc3RlbmVycy5cbiAgLy8gYWxzbzogcmV0dXJuaW5nIGFueXRoaW5nIG90aGVyIHRoYW4gYHJ1bm5lcmAgd291bGQgYmUgYSBicmVha2luZ1xuICAvLyBjaGFuZ2VcbiAgcnVuQXN5bmMocnVubmVyKS50aGVuKGRvbmUpO1xuXG4gIHJldHVybiBydW5uZXI7XG59O1xuXG4vKipcbiAqIEFzc2lnbnMgaG9va3MgdG8gdGhlIHJvb3Qgc3VpdGVcbiAqIEBwYXJhbSB7TW9jaGFSb290SG9va09iamVjdH0gW2hvb2tzXSAtIEhvb2tzIHRvIGFzc2lnbiB0byByb290IHN1aXRlXG4gKiBAY2hhaW5hYmxlXG4gKi9cbk1vY2hhLnByb3RvdHlwZS5yb290SG9va3MgPSBmdW5jdGlvbiByb290SG9va3Moe1xuICBiZWZvcmVBbGwgPSBbXSxcbiAgYmVmb3JlRWFjaCA9IFtdLFxuICBhZnRlckFsbCA9IFtdLFxuICBhZnRlckVhY2ggPSBbXVxufSA9IHt9KSB7XG4gIGJlZm9yZUFsbCA9IHV0aWxzLmNhc3RBcnJheShiZWZvcmVBbGwpO1xuICBiZWZvcmVFYWNoID0gdXRpbHMuY2FzdEFycmF5KGJlZm9yZUVhY2gpO1xuICBhZnRlckFsbCA9IHV0aWxzLmNhc3RBcnJheShhZnRlckFsbCk7XG4gIGFmdGVyRWFjaCA9IHV0aWxzLmNhc3RBcnJheShhZnRlckVhY2gpO1xuICBiZWZvcmVBbGwuZm9yRWFjaChob29rID0+IHtcbiAgICB0aGlzLnN1aXRlLmJlZm9yZUFsbChob29rKTtcbiAgfSk7XG4gIGJlZm9yZUVhY2guZm9yRWFjaChob29rID0+IHtcbiAgICB0aGlzLnN1aXRlLmJlZm9yZUVhY2goaG9vayk7XG4gIH0pO1xuICBhZnRlckFsbC5mb3JFYWNoKGhvb2sgPT4ge1xuICAgIHRoaXMuc3VpdGUuYWZ0ZXJBbGwoaG9vayk7XG4gIH0pO1xuICBhZnRlckVhY2guZm9yRWFjaChob29rID0+IHtcbiAgICB0aGlzLnN1aXRlLmFmdGVyRWFjaChob29rKTtcbiAgfSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBUb2dnbGVzIHBhcmFsbGVsIG1vZGUuXG4gKlxuICogTXVzdCBiZSBydW4gYmVmb3JlIGNhbGxpbmcge0BsaW5rIE1vY2hhI3J1bn0uIENoYW5nZXMgdGhlIGBSdW5uZXJgIGNsYXNzIHRvXG4gKiB1c2U7IGFsc28gZW5hYmxlcyBsYXp5IGZpbGUgbG9hZGluZyBpZiBub3QgYWxyZWFkeSBkb25lIHNvLlxuICpcbiAqIFdhcm5pbmc6IHdoZW4gcGFzc2VkIGBmYWxzZWAgYW5kIGxhenkgbG9hZGluZyBoYXMgYmVlbiBlbmFibGVkIF92aWEgYW55IG1lYW5zXyAoaW5jbHVkaW5nIGNhbGxpbmcgYHBhcmFsbGVsTW9kZSh0cnVlKWApLCB0aGlzIG1ldGhvZCB3aWxsIF9ub3RfIGRpc2FibGUgbGF6eSBsb2FkaW5nLiBMYXp5IGxvYWRpbmcgaXMgYSBwcmVyZXF1aXNpdGUgZm9yIHBhcmFsbGVsXG4gKiBtb2RlLCBidXQgcGFyYWxsZWwgbW9kZSBpcyBfbm90XyBhIHByZXJlcXVpc2l0ZSBmb3IgbGF6eSBsb2FkaW5nIVxuICogQHBhcmFtIHtib29sZWFufSBbZW5hYmxlXSAtIElmIGB0cnVlYCwgZW5hYmxlOyBvdGhlcndpc2UgZGlzYWJsZS5cbiAqIEB0aHJvd3MgSWYgcnVuIGluIGJyb3dzZXJcbiAqIEB0aHJvd3MgSWYgTW9jaGEgbm90IGluIGBJTklUYCBzdGF0ZVxuICogQHJldHVybnMge01vY2hhfVxuICogQGNoYWluYWJsZVxuICogQHB1YmxpY1xuICovXG5Nb2NoYS5wcm90b3R5cGUucGFyYWxsZWxNb2RlID0gZnVuY3Rpb24gcGFyYWxsZWxNb2RlKGVuYWJsZSA9IHRydWUpIHtcbiAgaWYgKHV0aWxzLmlzQnJvd3NlcigpKSB7XG4gICAgdGhyb3cgY3JlYXRlVW5zdXBwb3J0ZWRFcnJvcigncGFyYWxsZWwgbW9kZSBpcyBvbmx5IHN1cHBvcnRlZCBpbiBOb2RlLmpzJyk7XG4gIH1cbiAgY29uc3QgcGFyYWxsZWwgPSBCb29sZWFuKGVuYWJsZSk7XG4gIGlmIChcbiAgICBwYXJhbGxlbCA9PT0gdGhpcy5vcHRpb25zLnBhcmFsbGVsICYmXG4gICAgdGhpcy5fbGF6eUxvYWRGaWxlcyAmJlxuICAgIHRoaXMuX3J1bm5lckNsYXNzICE9PSBleHBvcnRzLlJ1bm5lclxuICApIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBpZiAodGhpcy5fc3RhdGUgIT09IG1vY2hhU3RhdGVzLklOSVQpIHtcbiAgICB0aHJvdyBjcmVhdGVVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgJ2Nhbm5vdCBjaGFuZ2UgcGFyYWxsZWwgbW9kZSBhZnRlciBoYXZpbmcgY2FsbGVkIHJ1bigpJ1xuICAgICk7XG4gIH1cbiAgdGhpcy5vcHRpb25zLnBhcmFsbGVsID0gcGFyYWxsZWw7XG5cbiAgLy8gc3dhcCBSdW5uZXIgY2xhc3NcbiAgdGhpcy5fcnVubmVyQ2xhc3MgPSBwYXJhbGxlbFxuICAgID8gcmVxdWlyZSgnLi9ub2RlanMvcGFyYWxsZWwtYnVmZmVyZWQtcnVubmVyJylcbiAgICA6IGV4cG9ydHMuUnVubmVyO1xuXG4gIC8vIGxhenlMb2FkRmlsZXMgbWF5IGhhdmUgYmVlbiBzZXQgYHRydWVgIG90aGVyd2lzZSAoZm9yIEVTTSBsb2FkaW5nKSxcbiAgLy8gc28ga2VlcCBgdHJ1ZWAgaWYgc28uXG4gIHJldHVybiB0aGlzLmxhenlMb2FkRmlsZXModGhpcy5fbGF6eUxvYWRGaWxlcyB8fCBwYXJhbGxlbCk7XG59O1xuXG4vKipcbiAqIERpc2FibGVzIGltcGxpY2l0IGNhbGwgdG8ge0BsaW5rIE1vY2hhI2xvYWRGaWxlc30gaW4ge0BsaW5rIE1vY2hhI3J1bn0uIFRoaXNcbiAqIHNldHRpbmcgaXMgdXNlZCBieSB3YXRjaCBtb2RlLCBwYXJhbGxlbCBtb2RlLCBhbmQgZm9yIGxvYWRpbmcgRVNNIGZpbGVzLlxuICogQHRvZG8gVGhpcyBzaG91bGQgdGhyb3cgaWYgd2UndmUgYWxyZWFkeSBsb2FkZWQgZmlsZXM7IHN1Y2ggYmVoYXZpb3JcbiAqIG5lY2Vzc2l0YXRlcyBhZGRpbmcgYSBuZXcgc3RhdGUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtlbmFibGVdIC0gSWYgYHRydWVgLCBkaXNhYmxlIGVhZ2VyIGxvYWRpbmcgb2YgZmlsZXMgaW5cbiAqIHtAbGluayBNb2NoYSNydW59XG4gKiBAY2hhaW5hYmxlXG4gKiBAcHVibGljXG4gKi9cbk1vY2hhLnByb3RvdHlwZS5sYXp5TG9hZEZpbGVzID0gZnVuY3Rpb24gbGF6eUxvYWRGaWxlcyhlbmFibGUpIHtcbiAgdGhpcy5fbGF6eUxvYWRGaWxlcyA9IGVuYWJsZSA9PT0gdHJ1ZTtcbiAgZGVidWcoJ3NldCBsYXp5IGxvYWQgdG8gJXMnLCBlbmFibGUpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQ29uZmlndXJlcyBvbmUgb3IgbW9yZSBnbG9iYWwgc2V0dXAgZml4dHVyZXMuXG4gKlxuICogSWYgZ2l2ZW4gbm8gcGFyYW1ldGVycywgX3Vuc2V0c18gYW55IHByZXZpb3VzbHktc2V0IGZpeHR1cmVzLlxuICogQGNoYWluYWJsZVxuICogQHB1YmxpY1xuICogQHBhcmFtIHtNb2NoYUdsb2JhbEZpeHR1cmV8TW9jaGFHbG9iYWxGaXh0dXJlW119IFtzZXR1cEZuc10gLSBHbG9iYWwgc2V0dXAgZml4dHVyZShzKVxuICogQHJldHVybnMge01vY2hhfVxuICovXG5Nb2NoYS5wcm90b3R5cGUuZ2xvYmFsU2V0dXAgPSBmdW5jdGlvbiBnbG9iYWxTZXR1cChzZXR1cEZucyA9IFtdKSB7XG4gIHNldHVwRm5zID0gdXRpbHMuY2FzdEFycmF5KHNldHVwRm5zKTtcbiAgdGhpcy5vcHRpb25zLmdsb2JhbFNldHVwID0gc2V0dXBGbnM7XG4gIGRlYnVnKCdjb25maWd1cmVkICVkIGdsb2JhbCBzZXR1cCBmdW5jdGlvbnMnLCBzZXR1cEZucy5sZW5ndGgpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQ29uZmlndXJlcyBvbmUgb3IgbW9yZSBnbG9iYWwgdGVhcmRvd24gZml4dHVyZXMuXG4gKlxuICogSWYgZ2l2ZW4gbm8gcGFyYW1ldGVycywgX3Vuc2V0c18gYW55IHByZXZpb3VzbHktc2V0IGZpeHR1cmVzLlxuICogQGNoYWluYWJsZVxuICogQHB1YmxpY1xuICogQHBhcmFtIHtNb2NoYUdsb2JhbEZpeHR1cmV8TW9jaGFHbG9iYWxGaXh0dXJlW119IFt0ZWFyZG93bkZuc10gLSBHbG9iYWwgdGVhcmRvd24gZml4dHVyZShzKVxuICogQHJldHVybnMge01vY2hhfVxuICovXG5Nb2NoYS5wcm90b3R5cGUuZ2xvYmFsVGVhcmRvd24gPSBmdW5jdGlvbiBnbG9iYWxUZWFyZG93bih0ZWFyZG93bkZucyA9IFtdKSB7XG4gIHRlYXJkb3duRm5zID0gdXRpbHMuY2FzdEFycmF5KHRlYXJkb3duRm5zKTtcbiAgdGhpcy5vcHRpb25zLmdsb2JhbFRlYXJkb3duID0gdGVhcmRvd25GbnM7XG4gIGRlYnVnKCdjb25maWd1cmVkICVkIGdsb2JhbCB0ZWFyZG93biBmdW5jdGlvbnMnLCB0ZWFyZG93bkZucy5sZW5ndGgpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUnVuIGFueSBnbG9iYWwgc2V0dXAgZml4dHVyZXMgc2VxdWVudGlhbGx5LCBpZiBhbnkuXG4gKlxuICogVGhpcyBpcyBfYXV0b21hdGljYWxseSBjYWxsZWRfIGJ5IHtAbGluayBNb2NoYSNydW59IF91bmxlc3NfIHRoZSBgcnVuR2xvYmFsU2V0dXBgIG9wdGlvbiBpcyBgZmFsc2VgOyBzZWUge0BsaW5rIE1vY2hhI2VuYWJsZUdsb2JhbFNldHVwfS5cbiAqXG4gKiBUaGUgY29udGV4dCBvYmplY3QgdGhpcyBmdW5jdGlvbiByZXNvbHZlcyB3aXRoIHNob3VsZCBiZSBjb25zdW1lZCBieSB7QGxpbmsgTW9jaGEjcnVuR2xvYmFsVGVhcmRvd259LlxuICogQHBhcmFtIHtvYmplY3R9IFtjb250ZXh0XSAtIENvbnRleHQgb2JqZWN0IGlmIGFscmVhZHkgaGF2ZSBvbmVcbiAqIEBwdWJsaWNcbiAqIEByZXR1cm5zIHtQcm9taXNlPG9iamVjdD59IENvbnRleHQgb2JqZWN0XG4gKi9cbk1vY2hhLnByb3RvdHlwZS5ydW5HbG9iYWxTZXR1cCA9IGFzeW5jIGZ1bmN0aW9uIHJ1bkdsb2JhbFNldHVwKGNvbnRleHQgPSB7fSkge1xuICBjb25zdCB7Z2xvYmFsU2V0dXB9ID0gdGhpcy5vcHRpb25zO1xuICBpZiAoZ2xvYmFsU2V0dXAgJiYgZ2xvYmFsU2V0dXAubGVuZ3RoKSB7XG4gICAgZGVidWcoJ3J1bigpOiBnbG9iYWwgc2V0dXAgc3RhcnRpbmcnKTtcbiAgICBhd2FpdCB0aGlzLl9ydW5HbG9iYWxGaXh0dXJlcyhnbG9iYWxTZXR1cCwgY29udGV4dCk7XG4gICAgZGVidWcoJ3J1bigpOiBnbG9iYWwgc2V0dXAgY29tcGxldGUnKTtcbiAgfVxuICByZXR1cm4gY29udGV4dDtcbn07XG5cbi8qKlxuICogUnVuIGFueSBnbG9iYWwgdGVhcmRvd24gZml4dHVyZXMgc2VxdWVudGlhbGx5LCBpZiBhbnkuXG4gKlxuICogVGhpcyBpcyBfYXV0b21hdGljYWxseSBjYWxsZWRfIGJ5IHtAbGluayBNb2NoYSNydW59IF91bmxlc3NfIHRoZSBgcnVuR2xvYmFsVGVhcmRvd25gIG9wdGlvbiBpcyBgZmFsc2VgOyBzZWUge0BsaW5rIE1vY2hhI2VuYWJsZUdsb2JhbFRlYXJkb3dufS5cbiAqXG4gKiBTaG91bGQgYmUgY2FsbGVkIHdpdGggY29udGV4dCBvYmplY3QgcmV0dXJuZWQgYnkge0BsaW5rIE1vY2hhI3J1bkdsb2JhbFNldHVwfSwgaWYgYXBwbGljYWJsZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBbY29udGV4dF0gLSBDb250ZXh0IG9iamVjdCBpZiBhbHJlYWR5IGhhdmUgb25lXG4gKiBAcHVibGljXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxvYmplY3Q+fSBDb250ZXh0IG9iamVjdFxuICovXG5Nb2NoYS5wcm90b3R5cGUucnVuR2xvYmFsVGVhcmRvd24gPSBhc3luYyBmdW5jdGlvbiBydW5HbG9iYWxUZWFyZG93bihcbiAgY29udGV4dCA9IHt9XG4pIHtcbiAgY29uc3Qge2dsb2JhbFRlYXJkb3dufSA9IHRoaXMub3B0aW9ucztcbiAgaWYgKGdsb2JhbFRlYXJkb3duICYmIGdsb2JhbFRlYXJkb3duLmxlbmd0aCkge1xuICAgIGRlYnVnKCdydW4oKTogZ2xvYmFsIHRlYXJkb3duIHN0YXJ0aW5nJyk7XG4gICAgYXdhaXQgdGhpcy5fcnVuR2xvYmFsRml4dHVyZXMoZ2xvYmFsVGVhcmRvd24sIGNvbnRleHQpO1xuICB9XG4gIGRlYnVnKCdydW4oKTogZ2xvYmFsIHRlYXJkb3duIGNvbXBsZXRlJyk7XG4gIHJldHVybiBjb250ZXh0O1xufTtcblxuLyoqXG4gKiBSdW4gZ2xvYmFsIGZpeHR1cmVzIHNlcXVlbnRpYWxseSB3aXRoIGNvbnRleHQgYGNvbnRleHRgXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtNb2NoYUdsb2JhbEZpeHR1cmVbXX0gW2ZpeHR1cmVGbnNdIC0gRml4dHVyZXMgdG8gcnVuXG4gKiBAcGFyYW0ge29iamVjdH0gW2NvbnRleHRdIC0gY29udGV4dCBvYmplY3RcbiAqIEByZXR1cm5zIHtQcm9taXNlPG9iamVjdD59IGNvbnRleHQgb2JqZWN0XG4gKi9cbk1vY2hhLnByb3RvdHlwZS5fcnVuR2xvYmFsRml4dHVyZXMgPSBhc3luYyBmdW5jdGlvbiBfcnVuR2xvYmFsRml4dHVyZXMoXG4gIGZpeHR1cmVGbnMgPSBbXSxcbiAgY29udGV4dCA9IHt9XG4pIHtcbiAgZm9yIGF3YWl0IChjb25zdCBmaXh0dXJlRm4gb2YgZml4dHVyZUZucykge1xuICAgIGF3YWl0IGZpeHR1cmVGbi5jYWxsKGNvbnRleHQpO1xuICB9XG4gIHJldHVybiBjb250ZXh0O1xufTtcblxuLyoqXG4gKiBUb2dnbGUgZXhlY3V0aW9uIG9mIGFueSBnbG9iYWwgc2V0dXAgZml4dHVyZShzKVxuICpcbiAqIEBjaGFpbmFibGVcbiAqIEBwdWJsaWNcbiAqIEBwYXJhbSB7Ym9vbGVhbiB9IFtlbmFibGVkPXRydWVdIC0gSWYgYGZhbHNlYCwgZG8gbm90IHJ1biBnbG9iYWwgc2V0dXAgZml4dHVyZVxuICogQHJldHVybnMge01vY2hhfVxuICovXG5Nb2NoYS5wcm90b3R5cGUuZW5hYmxlR2xvYmFsU2V0dXAgPSBmdW5jdGlvbiBlbmFibGVHbG9iYWxTZXR1cChlbmFibGVkID0gdHJ1ZSkge1xuICB0aGlzLm9wdGlvbnMuZW5hYmxlR2xvYmFsU2V0dXAgPSBCb29sZWFuKGVuYWJsZWQpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogVG9nZ2xlIGV4ZWN1dGlvbiBvZiBhbnkgZ2xvYmFsIHRlYXJkb3duIGZpeHR1cmUocylcbiAqXG4gKiBAY2hhaW5hYmxlXG4gKiBAcHVibGljXG4gKiBAcGFyYW0ge2Jvb2xlYW4gfSBbZW5hYmxlZD10cnVlXSAtIElmIGBmYWxzZWAsIGRvIG5vdCBydW4gZ2xvYmFsIHRlYXJkb3duIGZpeHR1cmVcbiAqIEByZXR1cm5zIHtNb2NoYX1cbiAqL1xuTW9jaGEucHJvdG90eXBlLmVuYWJsZUdsb2JhbFRlYXJkb3duID0gZnVuY3Rpb24gZW5hYmxlR2xvYmFsVGVhcmRvd24oXG4gIGVuYWJsZWQgPSB0cnVlXG4pIHtcbiAgdGhpcy5vcHRpb25zLmVuYWJsZUdsb2JhbFRlYXJkb3duID0gQm9vbGVhbihlbmFibGVkKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIG9uZSBvciBtb3JlIGdsb2JhbCBzZXR1cCBmaXh0dXJlcyBoYXZlIGJlZW4gc3VwcGxpZWQuXG4gKiBAcHVibGljXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTW9jaGEucHJvdG90eXBlLmhhc0dsb2JhbFNldHVwRml4dHVyZXMgPSBmdW5jdGlvbiBoYXNHbG9iYWxTZXR1cEZpeHR1cmVzKCkge1xuICByZXR1cm4gQm9vbGVhbih0aGlzLm9wdGlvbnMuZ2xvYmFsU2V0dXAubGVuZ3RoKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgb25lIG9yIG1vcmUgZ2xvYmFsIHRlYXJkb3duIGZpeHR1cmVzIGhhdmUgYmVlbiBzdXBwbGllZC5cbiAqIEBwdWJsaWNcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5Nb2NoYS5wcm90b3R5cGUuaGFzR2xvYmFsVGVhcmRvd25GaXh0dXJlcyA9XG4gIGZ1bmN0aW9uIGhhc0dsb2JhbFRlYXJkb3duRml4dHVyZXMoKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odGhpcy5vcHRpb25zLmdsb2JhbFRlYXJkb3duLmxlbmd0aCk7XG4gIH07XG5cbi8qKlxuICogQW4gYWx0ZXJuYXRpdmUgd2F5IHRvIGRlZmluZSByb290IGhvb2tzIHRoYXQgd29ya3Mgd2l0aCBwYXJhbGxlbCBydW5zLlxuICogQHR5cGVkZWYge09iamVjdH0gTW9jaGFSb290SG9va09iamVjdFxuICogQHByb3BlcnR5IHtGdW5jdGlvbnxGdW5jdGlvbltdfSBbYmVmb3JlQWxsXSAtIFwiQmVmb3JlIGFsbFwiIGhvb2socylcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb258RnVuY3Rpb25bXX0gW2JlZm9yZUVhY2hdIC0gXCJCZWZvcmUgZWFjaFwiIGhvb2socylcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb258RnVuY3Rpb25bXX0gW2FmdGVyQWxsXSAtIFwiQWZ0ZXIgYWxsXCIgaG9vayhzKVxuICogQHByb3BlcnR5IHtGdW5jdGlvbnxGdW5jdGlvbltdfSBbYWZ0ZXJFYWNoXSAtIFwiQWZ0ZXIgZWFjaFwiIGhvb2socylcbiAqL1xuXG4vKipcbiAqIEFuIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHtAbGluayBNb2NoYVJvb3RIb29rT2JqZWN0fSwgZWl0aGVyIHN5bmMgb3IgYXN5bmMuXG4gICBAY2FsbGJhY2sgTW9jaGFSb290SG9va0Z1bmN0aW9uXG4gKiBAcmV0dXJucyB7TW9jaGFSb290SG9va09iamVjdHxQcm9taXNlPE1vY2hhUm9vdEhvb2tPYmplY3Q+fVxuICovXG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0J3MgaW52b2tlZCBfb25jZV8gd2hpY2ggaXMgZWl0aGVyIHN5bmMgb3IgYXN5bmMuXG4gKiBDYW4gYmUgYSBcInRlYXJkb3duXCIgb3IgXCJzZXR1cFwiLiAgVGhlc2Ugd2lsbCBhbGwgc2hhcmUgdGhlIHNhbWUgY29udGV4dC5cbiAqIEBjYWxsYmFjayBNb2NoYUdsb2JhbEZpeHR1cmVcbiAqIEByZXR1cm5zIHt2b2lkfFByb21pc2U8dm9pZD59XG4gKi9cblxuLyoqXG4gKiBBbiBvYmplY3QgbWFraW5nIHVwIGFsbCBuZWNlc3NhcnkgcGFydHMgb2YgYSBwbHVnaW4gbG9hZGVyIGFuZCBhZ2dyZWdhdG9yXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQbHVnaW5EZWZpbml0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZXhwb3J0TmFtZSAtIE5hbWVkIGV4cG9ydCB0byB1c2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbb3B0aW9uTmFtZV0gLSBPcHRpb24gbmFtZSBmb3IgTW9jaGEgY29uc3RydWN0b3IgKHVzZSBgZXhwb3J0TmFtZWAgaWYgb21pdHRlZClcbiAqIEBwcm9wZXJ0eSB7UGx1Z2luVmFsaWRhdG9yfSBbdmFsaWRhdGVdIC0gVmFsaWRhdG9yIGZ1bmN0aW9uXG4gKiBAcHJvcGVydHkge1BsdWdpbkZpbmFsaXplcn0gW2ZpbmFsaXplXSAtIEZpbmFsaXplci9hZ2dyZWdhdG9yIGZ1bmN0aW9uXG4gKi9cblxuLyoqXG4gKiBBIChzeW5jKSBmdW5jdGlvbiB0byBhc3NlcnQgYSB1c2VyLXN1cHBsaWVkIHBsdWdpbiBpbXBsZW1lbnRhdGlvbiBpcyB2YWxpZC5cbiAqXG4gKiBEZWZpbmVkIGluIGEge0BsaW5rIFBsdWdpbkRlZmluaXRpb259LlxuXG4gKiBAY2FsbGJhY2sgUGx1Z2luVmFsaWRhdG9yXG4gKiBAcGFyYW0geyp9IHZhbHVlIC0gVmFsdWUgdG8gY2hlY2tcbiAqIEB0aGlzIHtQbHVnaW5EZWZpbml0aW9ufVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRvIGZpbmFsaXplIHBsdWdpbnMgaW1wbHMgb2YgYSBwYXJ0aWN1bGFyIGlsa1xuICogQGNhbGxiYWNrIFBsdWdpbkZpbmFsaXplclxuICogQHBhcmFtIHtBcnJheTwqPn0gaW1wbHMgLSBVc2VyLXN1cHBsaWVkIGltcGxlbWVudGF0aW9uc1xuICogQHJldHVybnMge1Byb21pc2U8Kj58Kn1cbiAqL1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyogZXNsaW50IG5vLXVudXNlZC12YXJzOiBvZmYgKi9cbi8qIGVzbGludC1lbnYgY29tbW9uanMgKi9cblxuLyoqXG4gKiBTaGltIHByb2Nlc3Muc3Rkb3V0LlxuICovXG5cbnByb2Nlc3Muc3Rkb3V0ID0gcmVxdWlyZSgnYnJvd3Nlci1zdGRvdXQnKSh7bGFiZWw6IGZhbHNlfSk7XG5cbnZhciBwYXJzZVF1ZXJ5ID0gcmVxdWlyZSgnLi9saWIvYnJvd3Nlci9wYXJzZS1xdWVyeScpO1xudmFyIGhpZ2hsaWdodFRhZ3MgPSByZXF1aXJlKCcuL2xpYi9icm93c2VyL2hpZ2hsaWdodC10YWdzJyk7XG52YXIgTW9jaGEgPSByZXF1aXJlKCcuL2xpYi9tb2NoYScpO1xuXG4vKipcbiAqIENyZWF0ZSBhIE1vY2hhIGluc3RhbmNlLlxuICpcbiAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAqL1xuXG52YXIgbW9jaGEgPSBuZXcgTW9jaGEoe3JlcG9ydGVyOiAnaHRtbCd9KTtcblxuLyoqXG4gKiBTYXZlIHRpbWVyIHJlZmVyZW5jZXMgdG8gYXZvaWQgU2lub24gaW50ZXJmZXJpbmcgKHNlZSBHSC0yMzcpLlxuICovXG5cbnZhciBEYXRlID0gZ2xvYmFsLkRhdGU7XG52YXIgc2V0VGltZW91dCA9IGdsb2JhbC5zZXRUaW1lb3V0O1xudmFyIHNldEludGVydmFsID0gZ2xvYmFsLnNldEludGVydmFsO1xudmFyIGNsZWFyVGltZW91dCA9IGdsb2JhbC5jbGVhclRpbWVvdXQ7XG52YXIgY2xlYXJJbnRlcnZhbCA9IGdsb2JhbC5jbGVhckludGVydmFsO1xuXG52YXIgdW5jYXVnaHRFeGNlcHRpb25IYW5kbGVycyA9IFtdO1xuXG52YXIgb3JpZ2luYWxPbmVycm9ySGFuZGxlciA9IGdsb2JhbC5vbmVycm9yO1xuXG4vKipcbiAqIFJlbW92ZSB1bmNhdWdodEV4Y2VwdGlvbiBsaXN0ZW5lci5cbiAqIFJldmVydCB0byBvcmlnaW5hbCBvbmVycm9yIGhhbmRsZXIgaWYgcHJldmlvdXNseSBkZWZpbmVkLlxuICovXG5cbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbiAoZSwgZm4pIHtcbiAgaWYgKGUgPT09ICd1bmNhdWdodEV4Y2VwdGlvbicpIHtcbiAgICBpZiAob3JpZ2luYWxPbmVycm9ySGFuZGxlcikge1xuICAgICAgZ2xvYmFsLm9uZXJyb3IgPSBvcmlnaW5hbE9uZXJyb3JIYW5kbGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICBnbG9iYWwub25lcnJvciA9IGZ1bmN0aW9uICgpIHt9O1xuICAgIH1cbiAgICB2YXIgaSA9IHVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcnMuaW5kZXhPZihmbik7XG4gICAgaWYgKGkgIT09IC0xKSB7XG4gICAgICB1bmNhdWdodEV4Y2VwdGlvbkhhbmRsZXJzLnNwbGljZShpLCAxKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogSW1wbGVtZW50cyBsaXN0ZW5lckNvdW50IGZvciAndW5jYXVnaHRFeGNlcHRpb24nLlxuICovXG5cbnByb2Nlc3MubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIGlmIChuYW1lID09PSAndW5jYXVnaHRFeGNlcHRpb24nKSB7XG4gICAgcmV0dXJuIHVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcnMubGVuZ3RoO1xuICB9XG4gIHJldHVybiAwO1xufTtcblxuLyoqXG4gKiBJbXBsZW1lbnRzIHVuY2F1Z2h0RXhjZXB0aW9uIGxpc3RlbmVyLlxuICovXG5cbnByb2Nlc3Mub24gPSBmdW5jdGlvbiAoZSwgZm4pIHtcbiAgaWYgKGUgPT09ICd1bmNhdWdodEV4Y2VwdGlvbicpIHtcbiAgICBnbG9iYWwub25lcnJvciA9IGZ1bmN0aW9uIChtc2csIHVybCwgbGluZSwgY29sLCBlcnIpIHtcbiAgICAgIGZuKGVyciB8fCBuZXcgRXJyb3IobXNnICsgJyAoJyArIHVybCArICc6JyArIGxpbmUgKyAnOicgKyBjb2wgKyAnKScpKTtcbiAgICAgIHJldHVybiAhbW9jaGEub3B0aW9ucy5hbGxvd1VuY2F1Z2h0O1xuICAgIH07XG4gICAgdW5jYXVnaHRFeGNlcHRpb25IYW5kbGVycy5wdXNoKGZuKTtcbiAgfVxufTtcblxucHJvY2Vzcy5saXN0ZW5lcnMgPSBmdW5jdGlvbiAoZSkge1xuICBpZiAoZSA9PT0gJ3VuY2F1Z2h0RXhjZXB0aW9uJykge1xuICAgIHJldHVybiB1bmNhdWdodEV4Y2VwdGlvbkhhbmRsZXJzO1xuICB9XG4gIHJldHVybiBbXTtcbn07XG5cbi8vIFRoZSBCREQgVUkgaXMgcmVnaXN0ZXJlZCBieSBkZWZhdWx0LCBidXQgbm8gVUkgd2lsbCBiZSBmdW5jdGlvbmFsIGluIHRoZVxuLy8gYnJvd3NlciB3aXRob3V0IGFuIGV4cGxpY2l0IGNhbGwgdG8gdGhlIG92ZXJyaWRkZW4gYG1vY2hhLnVpYCAoc2VlIGJlbG93KS5cbi8vIEVuc3VyZSB0aGF0IHRoaXMgZGVmYXVsdCBVSSBkb2VzIG5vdCBleHBvc2UgaXRzIG1ldGhvZHMgdG8gdGhlIGdsb2JhbCBzY29wZS5cbm1vY2hhLnN1aXRlLnJlbW92ZUFsbExpc3RlbmVycygncHJlLXJlcXVpcmUnKTtcblxudmFyIGltbWVkaWF0ZVF1ZXVlID0gW107XG52YXIgaW1tZWRpYXRlVGltZW91dDtcblxuZnVuY3Rpb24gdGltZXNsaWNlKCkge1xuICB2YXIgaW1tZWRpYXRlU3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgd2hpbGUgKGltbWVkaWF0ZVF1ZXVlLmxlbmd0aCAmJiBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIGltbWVkaWF0ZVN0YXJ0IDwgMTAwKSB7XG4gICAgaW1tZWRpYXRlUXVldWUuc2hpZnQoKSgpO1xuICB9XG4gIGlmIChpbW1lZGlhdGVRdWV1ZS5sZW5ndGgpIHtcbiAgICBpbW1lZGlhdGVUaW1lb3V0ID0gc2V0VGltZW91dCh0aW1lc2xpY2UsIDApO1xuICB9IGVsc2Uge1xuICAgIGltbWVkaWF0ZVRpbWVvdXQgPSBudWxsO1xuICB9XG59XG5cbi8qKlxuICogSGlnaC1wZXJmb3JtYW5jZSBvdmVycmlkZSBvZiBSdW5uZXIuaW1tZWRpYXRlbHkuXG4gKi9cblxuTW9jaGEuUnVubmVyLmltbWVkaWF0ZWx5ID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gIGltbWVkaWF0ZVF1ZXVlLnB1c2goY2FsbGJhY2spO1xuICBpZiAoIWltbWVkaWF0ZVRpbWVvdXQpIHtcbiAgICBpbW1lZGlhdGVUaW1lb3V0ID0gc2V0VGltZW91dCh0aW1lc2xpY2UsIDApO1xuICB9XG59O1xuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGFsbG93IGFzc2VydGlvbiBsaWJyYXJpZXMgdG8gdGhyb3cgZXJyb3JzIGRpcmVjdGx5IGludG8gbW9jaGEuXG4gKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHJ1bm5pbmcgdGVzdHMgaW4gYSBicm93c2VyIGJlY2F1c2Ugd2luZG93Lm9uZXJyb3Igd2lsbFxuICogb25seSByZWNlaXZlIHRoZSAnbWVzc2FnZScgYXR0cmlidXRlIG9mIHRoZSBFcnJvci5cbiAqL1xubW9jaGEudGhyb3dFcnJvciA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgdW5jYXVnaHRFeGNlcHRpb25IYW5kbGVycy5mb3JFYWNoKGZ1bmN0aW9uIChmbikge1xuICAgIGZuKGVycik7XG4gIH0pO1xuICB0aHJvdyBlcnI7XG59O1xuXG4vKipcbiAqIE92ZXJyaWRlIHVpIHRvIGVuc3VyZSB0aGF0IHRoZSB1aSBmdW5jdGlvbnMgYXJlIGluaXRpYWxpemVkLlxuICogTm9ybWFsbHkgdGhpcyB3b3VsZCBoYXBwZW4gaW4gTW9jaGEucHJvdG90eXBlLmxvYWRGaWxlcy5cbiAqL1xuXG5tb2NoYS51aSA9IGZ1bmN0aW9uICh1aSkge1xuICBNb2NoYS5wcm90b3R5cGUudWkuY2FsbCh0aGlzLCB1aSk7XG4gIHRoaXMuc3VpdGUuZW1pdCgncHJlLXJlcXVpcmUnLCBnbG9iYWwsIG51bGwsIHRoaXMpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0dXAgbW9jaGEgd2l0aCB0aGUgZ2l2ZW4gc2V0dGluZyBvcHRpb25zLlxuICovXG5cbm1vY2hhLnNldHVwID0gZnVuY3Rpb24gKG9wdHMpIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnc3RyaW5nJykge1xuICAgIG9wdHMgPSB7dWk6IG9wdHN9O1xuICB9XG4gIGlmIChvcHRzLmRlbGF5ID09PSB0cnVlKSB7XG4gICAgdGhpcy5kZWxheSgpO1xuICB9XG4gIHZhciBzZWxmID0gdGhpcztcbiAgT2JqZWN0LmtleXMob3B0cylcbiAgICAuZmlsdGVyKGZ1bmN0aW9uIChvcHQpIHtcbiAgICAgIHJldHVybiBvcHQgIT09ICdkZWxheSc7XG4gICAgfSlcbiAgICAuZm9yRWFjaChmdW5jdGlvbiAob3B0KSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9wdHMsIG9wdCkpIHtcbiAgICAgICAgc2VsZltvcHRdKG9wdHNbb3B0XSk7XG4gICAgICB9XG4gICAgfSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBSdW4gbW9jaGEsIHJldHVybmluZyB0aGUgUnVubmVyLlxuICovXG5cbm1vY2hhLnJ1biA9IGZ1bmN0aW9uIChmbikge1xuICB2YXIgb3B0aW9ucyA9IG1vY2hhLm9wdGlvbnM7XG4gIG1vY2hhLmdsb2JhbHMoJ2xvY2F0aW9uJyk7XG5cbiAgdmFyIHF1ZXJ5ID0gcGFyc2VRdWVyeShnbG9iYWwubG9jYXRpb24uc2VhcmNoIHx8ICcnKTtcbiAgaWYgKHF1ZXJ5LmdyZXApIHtcbiAgICBtb2NoYS5ncmVwKHF1ZXJ5LmdyZXApO1xuICB9XG4gIGlmIChxdWVyeS5mZ3JlcCkge1xuICAgIG1vY2hhLmZncmVwKHF1ZXJ5LmZncmVwKTtcbiAgfVxuICBpZiAocXVlcnkuaW52ZXJ0KSB7XG4gICAgbW9jaGEuaW52ZXJ0KCk7XG4gIH1cblxuICByZXR1cm4gTW9jaGEucHJvdG90eXBlLnJ1bi5jYWxsKG1vY2hhLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgLy8gVGhlIERPTSBEb2N1bWVudCBpcyBub3QgYXZhaWxhYmxlIGluIFdlYiBXb3JrZXJzLlxuICAgIHZhciBkb2N1bWVudCA9IGdsb2JhbC5kb2N1bWVudDtcbiAgICBpZiAoXG4gICAgICBkb2N1bWVudCAmJlxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2hhJykgJiZcbiAgICAgIG9wdGlvbnMubm9IaWdobGlnaHRpbmcgIT09IHRydWVcbiAgICApIHtcbiAgICAgIGhpZ2hsaWdodFRhZ3MoJ2NvZGUnKTtcbiAgICB9XG4gICAgaWYgKGZuKSB7XG4gICAgICBmbihlcnIpO1xuICAgIH1cbiAgfSk7XG59O1xuXG4vKipcbiAqIEV4cG9zZSB0aGUgcHJvY2VzcyBzaGltLlxuICogaHR0cHM6Ly9naXRodWIuY29tL21vY2hhanMvbW9jaGEvcHVsbC85MTZcbiAqL1xuXG5Nb2NoYS5wcm9jZXNzID0gcHJvY2VzcztcblxuLyoqXG4gKiBFeHBvc2UgbW9jaGEuXG4gKi9cbmdsb2JhbC5Nb2NoYSA9IE1vY2hhO1xuZ2xvYmFsLm1vY2hhID0gbW9jaGE7XG5cbi8vIGZvciBidW5kbGVyczogZW5hYmxlIGBpbXBvcnQge2Rlc2NyaWJlLCBpdH0gZnJvbSAnbW9jaGEnYFxuLy8gYGJkZGAgaW50ZXJmYWNlIG9ubHlcbi8vIHByZXR0aWVyLWlnbm9yZVxuWyBcbiAgJ2Rlc2NyaWJlJywgJ2NvbnRleHQnLCAnaXQnLCAnc3BlY2lmeScsXG4gICd4ZGVzY3JpYmUnLCAneGNvbnRleHQnLCAneGl0JywgJ3hzcGVjaWZ5JyxcbiAgJ2JlZm9yZScsICdiZWZvcmVFYWNoJywgJ2FmdGVyRWFjaCcsICdhZnRlcidcbl0uZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgbW9jaGFba2V5XSA9IGdsb2JhbFtrZXldO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gbW9jaGE7XG4iLCAiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgJ3VzZSBzdHJpY3QnO1xuXG4vKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG5pZiAoXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0ID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0KG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgICB2YXIgUmVhY3RWZXJzaW9uID0gJzE4LjMuMSc7XG5cbi8vIEFUVEVOVElPTlxuLy8gV2hlbiBhZGRpbmcgbmV3IHN5bWJvbHMgdG8gdGhpcyBmaWxlLFxuLy8gUGxlYXNlIGNvbnNpZGVyIGFsc28gYWRkaW5nIHRvICdyZWFjdC1kZXZ0b29scy1zaGFyZWQvc3JjL2JhY2tlbmQvUmVhY3RTeW1ib2xzJ1xuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50LWxpa2UgdHlwZXMuXG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpO1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucG9ydGFsJyk7XG52YXIgUkVBQ1RfRlJBR01FTlRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmZyYWdtZW50Jyk7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN0cmljdF9tb2RlJyk7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnByb2ZpbGVyJyk7XG52YXIgUkVBQ1RfUFJPVklERVJfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnByb3ZpZGVyJyk7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuY29udGV4dCcpO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZScpO1xudmFyIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlX2xpc3QnKTtcbnZhciBSRUFDVF9NRU1PX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5tZW1vJyk7XG52YXIgUkVBQ1RfTEFaWV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubGF6eScpO1xudmFyIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Qub2Zmc2NyZWVuJyk7XG52YXIgTUFZQkVfSVRFUkFUT1JfU1lNQk9MID0gU3ltYm9sLml0ZXJhdG9yO1xudmFyIEZBVVhfSVRFUkFUT1JfU1lNQk9MID0gJ0BAaXRlcmF0b3InO1xuZnVuY3Rpb24gZ2V0SXRlcmF0b3JGbihtYXliZUl0ZXJhYmxlKSB7XG4gIGlmIChtYXliZUl0ZXJhYmxlID09PSBudWxsIHx8IHR5cGVvZiBtYXliZUl0ZXJhYmxlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIG1heWJlSXRlcmF0b3IgPSBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgJiYgbWF5YmVJdGVyYWJsZVtNQVlCRV9JVEVSQVRPUl9TWU1CT0xdIHx8IG1heWJlSXRlcmFibGVbRkFVWF9JVEVSQVRPUl9TWU1CT0xdO1xuXG4gIGlmICh0eXBlb2YgbWF5YmVJdGVyYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBtYXliZUl0ZXJhdG9yO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogS2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgZGlzcGF0Y2hlci5cbiAqL1xudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIgPSB7XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQHR5cGUge1JlYWN0Q29tcG9uZW50fVxuICAgKi9cbiAgY3VycmVudDogbnVsbFxufTtcblxuLyoqXG4gKiBLZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBiYXRjaCdzIGNvbmZpZ3VyYXRpb24gc3VjaCBhcyBob3cgbG9uZyBhbiB1cGRhdGVcbiAqIHNob3VsZCBzdXNwZW5kIGZvciBpZiBpdCBuZWVkcyB0by5cbiAqL1xudmFyIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnID0ge1xuICB0cmFuc2l0aW9uOiBudWxsXG59O1xuXG52YXIgUmVhY3RDdXJyZW50QWN0UXVldWUgPSB7XG4gIGN1cnJlbnQ6IG51bGwsXG4gIC8vIFVzZWQgdG8gcmVwcm9kdWNlIGJlaGF2aW9yIG9mIGBiYXRjaGVkVXBkYXRlc2AgaW4gbGVnYWN5IG1vZGUuXG4gIGlzQmF0Y2hpbmdMZWdhY3k6IGZhbHNlLFxuICBkaWRTY2hlZHVsZUxlZ2FjeVVwZGF0ZTogZmFsc2Vcbn07XG5cbi8qKlxuICogS2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgb3duZXIuXG4gKlxuICogVGhlIGN1cnJlbnQgb3duZXIgaXMgdGhlIGNvbXBvbmVudCB3aG8gc2hvdWxkIG93biBhbnkgY29tcG9uZW50cyB0aGF0IGFyZVxuICogY3VycmVudGx5IGJlaW5nIGNvbnN0cnVjdGVkLlxuICovXG52YXIgUmVhY3RDdXJyZW50T3duZXIgPSB7XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQHR5cGUge1JlYWN0Q29tcG9uZW50fVxuICAgKi9cbiAgY3VycmVudDogbnVsbFxufTtcblxudmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSB7fTtcbnZhciBjdXJyZW50RXh0cmFTdGFja0ZyYW1lID0gbnVsbDtcbmZ1bmN0aW9uIHNldEV4dHJhU3RhY2tGcmFtZShzdGFjaykge1xuICB7XG4gICAgY3VycmVudEV4dHJhU3RhY2tGcmFtZSA9IHN0YWNrO1xuICB9XG59XG5cbntcbiAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5zZXRFeHRyYVN0YWNrRnJhbWUgPSBmdW5jdGlvbiAoc3RhY2spIHtcbiAgICB7XG4gICAgICBjdXJyZW50RXh0cmFTdGFja0ZyYW1lID0gc3RhY2s7XG4gICAgfVxuICB9OyAvLyBTdGFjayBpbXBsZW1lbnRhdGlvbiBpbmplY3RlZCBieSB0aGUgY3VycmVudCByZW5kZXJlci5cblxuXG4gIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0Q3VycmVudFN0YWNrID0gbnVsbDtcblxuICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldFN0YWNrQWRkZW5kdW0gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHN0YWNrID0gJyc7IC8vIEFkZCBhbiBleHRyYSB0b3AgZnJhbWUgd2hpbGUgYW4gZWxlbWVudCBpcyBiZWluZyB2YWxpZGF0ZWRcblxuICAgIGlmIChjdXJyZW50RXh0cmFTdGFja0ZyYW1lKSB7XG4gICAgICBzdGFjayArPSBjdXJyZW50RXh0cmFTdGFja0ZyYW1lO1xuICAgIH0gLy8gRGVsZWdhdGUgdG8gdGhlIGluamVjdGVkIHJlbmRlcmVyLXNwZWNpZmljIGltcGxlbWVudGF0aW9uXG5cblxuICAgIHZhciBpbXBsID0gUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRDdXJyZW50U3RhY2s7XG5cbiAgICBpZiAoaW1wbCkge1xuICAgICAgc3RhY2sgKz0gaW1wbCgpIHx8ICcnO1xuICAgIH1cblxuICAgIHJldHVybiBzdGFjaztcbiAgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudmFyIGVuYWJsZVNjb3BlQVBJID0gZmFsc2U7IC8vIEV4cGVyaW1lbnRhbCBDcmVhdGUgRXZlbnQgSGFuZGxlIEFQSS5cbnZhciBlbmFibGVDYWNoZUVsZW1lbnQgPSBmYWxzZTtcbnZhciBlbmFibGVUcmFuc2l0aW9uVHJhY2luZyA9IGZhbHNlOyAvLyBObyBrbm93biBidWdzLCBidXQgbmVlZHMgcGVyZm9ybWFuY2UgdGVzdGluZ1xuXG52YXIgZW5hYmxlTGVnYWN5SGlkZGVuID0gZmFsc2U7IC8vIEVuYWJsZXMgdW5zdGFibGVfYXZvaWRUaGlzRmFsbGJhY2sgZmVhdHVyZSBpbiBGaWJlclxuLy8gc3R1ZmYuIEludGVuZGVkIHRvIGVuYWJsZSBSZWFjdCBjb3JlIG1lbWJlcnMgdG8gbW9yZSBlYXNpbHkgZGVidWcgc2NoZWR1bGluZ1xuLy8gaXNzdWVzIGluIERFViBidWlsZHMuXG5cbnZhciBlbmFibGVEZWJ1Z1RyYWNpbmcgPSBmYWxzZTsgLy8gVHJhY2sgd2hpY2ggRmliZXIocykgc2NoZWR1bGUgcmVuZGVyIHdvcmsuXG5cbnZhciBSZWFjdFNoYXJlZEludGVybmFscyA9IHtcbiAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjogUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixcbiAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWc6IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLFxuICBSZWFjdEN1cnJlbnRPd25lcjogUmVhY3RDdXJyZW50T3duZXJcbn07XG5cbntcbiAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG4gIFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEFjdFF1ZXVlID0gUmVhY3RDdXJyZW50QWN0UXVldWU7XG59XG5cbi8vIGJ5IGNhbGxzIHRvIHRoZXNlIG1ldGhvZHMgYnkgYSBCYWJlbCBwbHVnaW4uXG4vL1xuLy8gSW4gUFJPRCAob3IgaW4gcGFja2FnZXMgd2l0aG91dCBhY2Nlc3MgdG8gUmVhY3QgaW50ZXJuYWxzKSxcbi8vIHRoZXkgYXJlIGxlZnQgYXMgdGhleSBhcmUgaW5zdGVhZC5cblxuZnVuY3Rpb24gd2Fybihmb3JtYXQpIHtcbiAge1xuICAgIHtcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG5cbiAgICAgIHByaW50V2FybmluZygnd2FybicsIGZvcm1hdCwgYXJncyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBlcnJvcihmb3JtYXQpIHtcbiAge1xuICAgIHtcbiAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgIGFyZ3NbX2tleTIgLSAxXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICB9XG5cbiAgICAgIHByaW50V2FybmluZygnZXJyb3InLCBmb3JtYXQsIGFyZ3MpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludFdhcm5pbmcobGV2ZWwsIGZvcm1hdCwgYXJncykge1xuICAvLyBXaGVuIGNoYW5naW5nIHRoaXMgbG9naWMsIHlvdSBtaWdodCB3YW50IHRvIGFsc29cbiAgLy8gdXBkYXRlIGNvbnNvbGVXaXRoU3RhY2tEZXYud3d3LmpzIGFzIHdlbGwuXG4gIHtcbiAgICB2YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG4gICAgdmFyIHN0YWNrID0gUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRTdGFja0FkZGVuZHVtKCk7XG5cbiAgICBpZiAoc3RhY2sgIT09ICcnKSB7XG4gICAgICBmb3JtYXQgKz0gJyVzJztcbiAgICAgIGFyZ3MgPSBhcmdzLmNvbmNhdChbc3RhY2tdKTtcbiAgICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuXG5cbiAgICB2YXIgYXJnc1dpdGhGb3JtYXQgPSBhcmdzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIFN0cmluZyhpdGVtKTtcbiAgICB9KTsgLy8gQ2FyZWZ1bDogUk4gY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcmVmaXhcblxuICAgIGFyZ3NXaXRoRm9ybWF0LnVuc2hpZnQoJ1dhcm5pbmc6ICcgKyBmb3JtYXQpOyAvLyBXZSBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBzcHJlYWQgKG9yIC5hcHBseSkgZGlyZWN0bHkgYmVjYXVzZSBpdFxuICAgIC8vIGJyZWFrcyBJRTk6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTM2MTBcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nXG5cbiAgICBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChjb25zb2xlW2xldmVsXSwgY29uc29sZSwgYXJnc1dpdGhGb3JtYXQpO1xuICB9XG59XG5cbnZhciBkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnQgPSB7fTtcblxuZnVuY3Rpb24gd2Fybk5vb3AocHVibGljSW5zdGFuY2UsIGNhbGxlck5hbWUpIHtcbiAge1xuICAgIHZhciBfY29uc3RydWN0b3IgPSBwdWJsaWNJbnN0YW5jZS5jb25zdHJ1Y3RvcjtcbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IF9jb25zdHJ1Y3RvciAmJiAoX2NvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8IF9jb25zdHJ1Y3Rvci5uYW1lKSB8fCAnUmVhY3RDbGFzcyc7XG4gICAgdmFyIHdhcm5pbmdLZXkgPSBjb21wb25lbnROYW1lICsgXCIuXCIgKyBjYWxsZXJOYW1lO1xuXG4gICAgaWYgKGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudFt3YXJuaW5nS2V5XSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGVycm9yKFwiQ2FuJ3QgY2FsbCAlcyBvbiBhIGNvbXBvbmVudCB0aGF0IGlzIG5vdCB5ZXQgbW91bnRlZC4gXCIgKyAnVGhpcyBpcyBhIG5vLW9wLCBidXQgaXQgbWlnaHQgaW5kaWNhdGUgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4gJyArICdJbnN0ZWFkLCBhc3NpZ24gdG8gYHRoaXMuc3RhdGVgIGRpcmVjdGx5IG9yIGRlZmluZSBhIGBzdGF0ZSA9IHt9O2AgJyArICdjbGFzcyBwcm9wZXJ0eSB3aXRoIHRoZSBkZXNpcmVkIHN0YXRlIGluIHRoZSAlcyBjb21wb25lbnQuJywgY2FsbGVyTmFtZSwgY29tcG9uZW50TmFtZSk7XG5cbiAgICBkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnRbd2FybmluZ0tleV0gPSB0cnVlO1xuICB9XG59XG4vKipcbiAqIFRoaXMgaXMgdGhlIGFic3RyYWN0IEFQSSBmb3IgYW4gdXBkYXRlIHF1ZXVlLlxuICovXG5cblxudmFyIFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlID0ge1xuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoaXMgY29tcG9zaXRlIGNvbXBvbmVudCBpcyBtb3VudGVkLlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB3ZSB3YW50IHRvIHRlc3QuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgbW91bnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBmaW5hbFxuICAgKi9cbiAgaXNNb3VudGVkOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEZvcmNlcyBhbiB1cGRhdGUuIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHdpdGhcbiAgICogY2VydGFpbnR5IHRoYXQgd2UgYXJlICoqbm90KiogaW4gYSBET00gdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIFlvdSBtYXkgd2FudCB0byBjYWxsIHRoaXMgd2hlbiB5b3Uga25vdyB0aGF0IHNvbWUgZGVlcGVyIGFzcGVjdCBvZiB0aGVcbiAgICogY29tcG9uZW50J3Mgc3RhdGUgaGFzIGNoYW5nZWQgYnV0IGBzZXRTdGF0ZWAgd2FzIG5vdCBjYWxsZWQuXG4gICAqXG4gICAqIFRoaXMgd2lsbCBub3QgaW52b2tlIGBzaG91bGRDb21wb25lbnRVcGRhdGVgLCBidXQgaXQgd2lsbCBpbnZva2VcbiAgICogYGNvbXBvbmVudFdpbGxVcGRhdGVgIGFuZCBgY29tcG9uZW50RGlkVXBkYXRlYC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgY29tcG9uZW50IGlzIHVwZGF0ZWQuXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gY2FsbGVyTmFtZSBuYW1lIG9mIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGluIHRoZSBwdWJsaWMgQVBJLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVGb3JjZVVwZGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAnZm9yY2VVcGRhdGUnKTtcbiAgfSxcblxuICAvKipcbiAgICogUmVwbGFjZXMgYWxsIG9mIHRoZSBzdGF0ZS4gQWx3YXlzIHVzZSB0aGlzIG9yIGBzZXRTdGF0ZWAgdG8gbXV0YXRlIHN0YXRlLlxuICAgKiBZb3Ugc2hvdWxkIHRyZWF0IGB0aGlzLnN0YXRlYCBhcyBpbW11dGFibGUuXG4gICAqXG4gICAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGB0aGlzLnN0YXRlYCB3aWxsIGJlIGltbWVkaWF0ZWx5IHVwZGF0ZWQsIHNvXG4gICAqIGFjY2Vzc2luZyBgdGhpcy5zdGF0ZWAgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBvbGQgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gY29tcGxldGVTdGF0ZSBOZXh0IHN0YXRlLlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIGNvbXBvbmVudCBpcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0gez9zdHJpbmd9IGNhbGxlck5hbWUgbmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbiBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlUmVwbGFjZVN0YXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIGNvbXBsZXRlU3RhdGUsIGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdyZXBsYWNlU3RhdGUnKTtcbiAgfSxcblxuICAvKipcbiAgICogU2V0cyBhIHN1YnNldCBvZiB0aGUgc3RhdGUuIFRoaXMgb25seSBleGlzdHMgYmVjYXVzZSBfcGVuZGluZ1N0YXRlIGlzXG4gICAqIGludGVybmFsLiBUaGlzIHByb3ZpZGVzIGEgbWVyZ2luZyBzdHJhdGVneSB0aGF0IGlzIG5vdCBhdmFpbGFibGUgdG8gZGVlcFxuICAgKiBwcm9wZXJ0aWVzIHdoaWNoIGlzIGNvbmZ1c2luZy4gVE9ETzogRXhwb3NlIHBlbmRpbmdTdGF0ZSBvciBkb24ndCB1c2UgaXRcbiAgICogZHVyaW5nIHRoZSBtZXJnZS5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwYXJ0aWFsU3RhdGUgTmV4dCBwYXJ0aWFsIHN0YXRlIHRvIGJlIG1lcmdlZCB3aXRoIHN0YXRlLlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIGNvbXBvbmVudCBpcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0gez9zdHJpbmd9IE5hbWUgb2YgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaW4gdGhlIHB1YmxpYyBBUEkuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZVNldFN0YXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgJ3NldFN0YXRlJyk7XG4gIH1cbn07XG5cbnZhciBhc3NpZ24gPSBPYmplY3QuYXNzaWduO1xuXG52YXIgZW1wdHlPYmplY3QgPSB7fTtcblxue1xuICBPYmplY3QuZnJlZXplKGVtcHR5T2JqZWN0KTtcbn1cbi8qKlxuICogQmFzZSBjbGFzcyBoZWxwZXJzIGZvciB0aGUgdXBkYXRpbmcgc3RhdGUgb2YgYSBjb21wb25lbnQuXG4gKi9cblxuXG5mdW5jdGlvbiBDb21wb25lbnQocHJvcHMsIGNvbnRleHQsIHVwZGF0ZXIpIHtcbiAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OyAvLyBJZiBhIGNvbXBvbmVudCBoYXMgc3RyaW5nIHJlZnMsIHdlIHdpbGwgYXNzaWduIGEgZGlmZmVyZW50IG9iamVjdCBsYXRlci5cblxuICB0aGlzLnJlZnMgPSBlbXB0eU9iamVjdDsgLy8gV2UgaW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCB1cGRhdGVyIGJ1dCB0aGUgcmVhbCBvbmUgZ2V0cyBpbmplY3RlZCBieSB0aGVcbiAgLy8gcmVuZGVyZXIuXG5cbiAgdGhpcy51cGRhdGVyID0gdXBkYXRlciB8fCBSZWFjdE5vb3BVcGRhdGVRdWV1ZTtcbn1cblxuQ29tcG9uZW50LnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50ID0ge307XG4vKipcbiAqIFNldHMgYSBzdWJzZXQgb2YgdGhlIHN0YXRlLiBBbHdheXMgdXNlIHRoaXMgdG8gbXV0YXRlXG4gKiBzdGF0ZS4gWW91IHNob3VsZCB0cmVhdCBgdGhpcy5zdGF0ZWAgYXMgaW1tdXRhYmxlLlxuICpcbiAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGB0aGlzLnN0YXRlYCB3aWxsIGJlIGltbWVkaWF0ZWx5IHVwZGF0ZWQsIHNvXG4gKiBhY2Nlc3NpbmcgYHRoaXMuc3RhdGVgIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QgbWF5IHJldHVybiB0aGUgb2xkIHZhbHVlLlxuICpcbiAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGNhbGxzIHRvIGBzZXRTdGF0ZWAgd2lsbCBydW4gc3luY2hyb25vdXNseSxcbiAqIGFzIHRoZXkgbWF5IGV2ZW50dWFsbHkgYmUgYmF0Y2hlZCB0b2dldGhlci4gIFlvdSBjYW4gcHJvdmlkZSBhbiBvcHRpb25hbFxuICogY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIGNhbGwgdG8gc2V0U3RhdGUgaXMgYWN0dWFsbHlcbiAqIGNvbXBsZXRlZC5cbiAqXG4gKiBXaGVuIGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQgdG8gc2V0U3RhdGUsIGl0IHdpbGwgYmUgY2FsbGVkIGF0IHNvbWUgcG9pbnQgaW5cbiAqIHRoZSBmdXR1cmUgKG5vdCBzeW5jaHJvbm91c2x5KS4gSXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgdXAgdG8gZGF0ZVxuICogY29tcG9uZW50IGFyZ3VtZW50cyAoc3RhdGUsIHByb3BzLCBjb250ZXh0KS4gVGhlc2UgdmFsdWVzIGNhbiBiZSBkaWZmZXJlbnRcbiAqIGZyb20gdGhpcy4qIGJlY2F1c2UgeW91ciBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGFmdGVyIHJlY2VpdmVQcm9wcyBidXQgYmVmb3JlXG4gKiBzaG91bGRDb21wb25lbnRVcGRhdGUsIGFuZCB0aGlzIG5ldyBzdGF0ZSwgcHJvcHMsIGFuZCBjb250ZXh0IHdpbGwgbm90IHlldCBiZVxuICogYXNzaWduZWQgdG8gdGhpcy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdHxmdW5jdGlvbn0gcGFydGlhbFN0YXRlIE5leHQgcGFydGlhbCBzdGF0ZSBvciBmdW5jdGlvbiB0b1xuICogICAgICAgIHByb2R1Y2UgbmV4dCBwYXJ0aWFsIHN0YXRlIHRvIGJlIG1lcmdlZCB3aXRoIGN1cnJlbnQgc3RhdGUuXG4gKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIHN0YXRlIGlzIHVwZGF0ZWQuXG4gKiBAZmluYWxcbiAqIEBwcm90ZWN0ZWRcbiAqL1xuXG5Db21wb25lbnQucHJvdG90eXBlLnNldFN0YXRlID0gZnVuY3Rpb24gKHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBwYXJ0aWFsU3RhdGUgIT09ICdvYmplY3QnICYmIHR5cGVvZiBwYXJ0aWFsU3RhdGUgIT09ICdmdW5jdGlvbicgJiYgcGFydGlhbFN0YXRlICE9IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFN0YXRlKC4uLik6IHRha2VzIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMgdG8gdXBkYXRlIG9yIGEgJyArICdmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMuJyk7XG4gIH1cblxuICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZVNldFN0YXRlKHRoaXMsIHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2ssICdzZXRTdGF0ZScpO1xufTtcbi8qKlxuICogRm9yY2VzIGFuIHVwZGF0ZS4gVGhpcyBzaG91bGQgb25seSBiZSBpbnZva2VkIHdoZW4gaXQgaXMga25vd24gd2l0aFxuICogY2VydGFpbnR5IHRoYXQgd2UgYXJlICoqbm90KiogaW4gYSBET00gdHJhbnNhY3Rpb24uXG4gKlxuICogWW91IG1heSB3YW50IHRvIGNhbGwgdGhpcyB3aGVuIHlvdSBrbm93IHRoYXQgc29tZSBkZWVwZXIgYXNwZWN0IG9mIHRoZVxuICogY29tcG9uZW50J3Mgc3RhdGUgaGFzIGNoYW5nZWQgYnV0IGBzZXRTdGF0ZWAgd2FzIG5vdCBjYWxsZWQuXG4gKlxuICogVGhpcyB3aWxsIG5vdCBpbnZva2UgYHNob3VsZENvbXBvbmVudFVwZGF0ZWAsIGJ1dCBpdCB3aWxsIGludm9rZVxuICogYGNvbXBvbmVudFdpbGxVcGRhdGVgIGFuZCBgY29tcG9uZW50RGlkVXBkYXRlYC5cbiAqXG4gKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIHVwZGF0ZSBpcyBjb21wbGV0ZS5cbiAqIEBmaW5hbFxuICogQHByb3RlY3RlZFxuICovXG5cblxuQ29tcG9uZW50LnByb3RvdHlwZS5mb3JjZVVwZGF0ZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZUZvcmNlVXBkYXRlKHRoaXMsIGNhbGxiYWNrLCAnZm9yY2VVcGRhdGUnKTtcbn07XG4vKipcbiAqIERlcHJlY2F0ZWQgQVBJcy4gVGhlc2UgQVBJcyB1c2VkIHRvIGV4aXN0IG9uIGNsYXNzaWMgUmVhY3QgY2xhc3NlcyBidXQgc2luY2VcbiAqIHdlIHdvdWxkIGxpa2UgdG8gZGVwcmVjYXRlIHRoZW0sIHdlJ3JlIG5vdCBnb2luZyB0byBtb3ZlIHRoZW0gb3ZlciB0byB0aGlzXG4gKiBtb2Rlcm4gYmFzZSBjbGFzcy4gSW5zdGVhZCwgd2UgZGVmaW5lIGEgZ2V0dGVyIHRoYXQgd2FybnMgaWYgaXQncyBhY2Nlc3NlZC5cbiAqL1xuXG5cbntcbiAgdmFyIGRlcHJlY2F0ZWRBUElzID0ge1xuICAgIGlzTW91bnRlZDogWydpc01vdW50ZWQnLCAnSW5zdGVhZCwgbWFrZSBzdXJlIHRvIGNsZWFuIHVwIHN1YnNjcmlwdGlvbnMgYW5kIHBlbmRpbmcgcmVxdWVzdHMgaW4gJyArICdjb21wb25lbnRXaWxsVW5tb3VudCB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy4nXSxcbiAgICByZXBsYWNlU3RhdGU6IFsncmVwbGFjZVN0YXRlJywgJ1JlZmFjdG9yIHlvdXIgY29kZSB0byB1c2Ugc2V0U3RhdGUgaW5zdGVhZCAoc2VlICcgKyAnaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8zMjM2KS4nXVxuICB9O1xuXG4gIHZhciBkZWZpbmVEZXByZWNhdGlvbldhcm5pbmcgPSBmdW5jdGlvbiAobWV0aG9kTmFtZSwgaW5mbykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb21wb25lbnQucHJvdG90eXBlLCBtZXRob2ROYW1lLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2FybignJXMoLi4uKSBpcyBkZXByZWNhdGVkIGluIHBsYWluIEphdmFTY3JpcHQgUmVhY3QgY2xhc3Nlcy4gJXMnLCBpbmZvWzBdLCBpbmZvWzFdKTtcblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIGZvciAodmFyIGZuTmFtZSBpbiBkZXByZWNhdGVkQVBJcykge1xuICAgIGlmIChkZXByZWNhdGVkQVBJcy5oYXNPd25Qcm9wZXJ0eShmbk5hbWUpKSB7XG4gICAgICBkZWZpbmVEZXByZWNhdGlvbldhcm5pbmcoZm5OYW1lLCBkZXByZWNhdGVkQVBJc1tmbk5hbWVdKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gQ29tcG9uZW50RHVtbXkoKSB7fVxuXG5Db21wb25lbnREdW1teS5wcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuLyoqXG4gKiBDb252ZW5pZW5jZSBjb21wb25lbnQgd2l0aCBkZWZhdWx0IHNoYWxsb3cgZXF1YWxpdHkgY2hlY2sgZm9yIHNDVS5cbiAqL1xuXG5mdW5jdGlvbiBQdXJlQ29tcG9uZW50KHByb3BzLCBjb250ZXh0LCB1cGRhdGVyKSB7XG4gIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsgLy8gSWYgYSBjb21wb25lbnQgaGFzIHN0cmluZyByZWZzLCB3ZSB3aWxsIGFzc2lnbiBhIGRpZmZlcmVudCBvYmplY3QgbGF0ZXIuXG5cbiAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7XG4gIHRoaXMudXBkYXRlciA9IHVwZGF0ZXIgfHwgUmVhY3ROb29wVXBkYXRlUXVldWU7XG59XG5cbnZhciBwdXJlQ29tcG9uZW50UHJvdG90eXBlID0gUHVyZUNvbXBvbmVudC5wcm90b3R5cGUgPSBuZXcgQ29tcG9uZW50RHVtbXkoKTtcbnB1cmVDb21wb25lbnRQcm90b3R5cGUuY29uc3RydWN0b3IgPSBQdXJlQ29tcG9uZW50OyAvLyBBdm9pZCBhbiBleHRyYSBwcm90b3R5cGUganVtcCBmb3IgdGhlc2UgbWV0aG9kcy5cblxuYXNzaWduKHB1cmVDb21wb25lbnRQcm90b3R5cGUsIENvbXBvbmVudC5wcm90b3R5cGUpO1xucHVyZUNvbXBvbmVudFByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudCA9IHRydWU7XG5cbi8vIGFuIGltbXV0YWJsZSBvYmplY3Qgd2l0aCBhIHNpbmdsZSBtdXRhYmxlIHZhbHVlXG5mdW5jdGlvbiBjcmVhdGVSZWYoKSB7XG4gIHZhciByZWZPYmplY3QgPSB7XG4gICAgY3VycmVudDogbnVsbFxuICB9O1xuXG4gIHtcbiAgICBPYmplY3Quc2VhbChyZWZPYmplY3QpO1xuICB9XG5cbiAgcmV0dXJuIHJlZk9iamVjdDtcbn1cblxudmFyIGlzQXJyYXlJbXBsID0gQXJyYXkuaXNBcnJheTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlZGVjbGFyZVxuXG5mdW5jdGlvbiBpc0FycmF5KGEpIHtcbiAgcmV0dXJuIGlzQXJyYXlJbXBsKGEpO1xufVxuXG4vKlxuICogVGhlIGAnJyArIHZhbHVlYCBwYXR0ZXJuICh1c2VkIGluIGluIHBlcmYtc2Vuc2l0aXZlIGNvZGUpIHRocm93cyBmb3IgU3ltYm9sXG4gKiBhbmQgVGVtcG9yYWwuKiB0eXBlcy4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzIyMDY0LlxuICpcbiAqIFRoZSBmdW5jdGlvbnMgaW4gdGhpcyBtb2R1bGUgd2lsbCB0aHJvdyBhbiBlYXNpZXItdG8tdW5kZXJzdGFuZCxcbiAqIGVhc2llci10by1kZWJ1ZyBleGNlcHRpb24gd2l0aCBhIGNsZWFyIGVycm9ycyBtZXNzYWdlIG1lc3NhZ2UgZXhwbGFpbmluZyB0aGVcbiAqIHByb2JsZW0uIChJbnN0ZWFkIG9mIGEgY29uZnVzaW5nIGV4Y2VwdGlvbiB0aHJvd24gaW5zaWRlIHRoZSBpbXBsZW1lbnRhdGlvblxuICogb2YgdGhlIGB2YWx1ZWAgb2JqZWN0KS5cbiAqL1xuLy8gJEZsb3dGaXhNZSBvbmx5IGNhbGxlZCBpbiBERVYsIHNvIHZvaWQgcmV0dXJuIGlzIG5vdCBwb3NzaWJsZS5cbmZ1bmN0aW9uIHR5cGVOYW1lKHZhbHVlKSB7XG4gIHtcbiAgICAvLyB0b1N0cmluZ1RhZyBpcyBuZWVkZWQgZm9yIG5hbWVzcGFjZWQgdHlwZXMgbGlrZSBUZW1wb3JhbC5JbnN0YW50XG4gICAgdmFyIGhhc1RvU3RyaW5nVGFnID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wudG9TdHJpbmdUYWc7XG4gICAgdmFyIHR5cGUgPSBoYXNUb1N0cmluZ1RhZyAmJiB2YWx1ZVtTeW1ib2wudG9TdHJpbmdUYWddIHx8IHZhbHVlLmNvbnN0cnVjdG9yLm5hbWUgfHwgJ09iamVjdCc7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cbn0gLy8gJEZsb3dGaXhNZSBvbmx5IGNhbGxlZCBpbiBERVYsIHNvIHZvaWQgcmV0dXJuIGlzIG5vdCBwb3NzaWJsZS5cblxuXG5mdW5jdGlvbiB3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkge1xuICB7XG4gICAgdHJ5IHtcbiAgICAgIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICAvLyBJZiB5b3UgZW5kZWQgdXAgaGVyZSBieSBmb2xsb3dpbmcgYW4gZXhjZXB0aW9uIGNhbGwgc3RhY2ssIGhlcmUncyB3aGF0J3NcbiAgLy8gaGFwcGVuZWQ6IHlvdSBzdXBwbGllZCBhbiBvYmplY3Qgb3Igc3ltYm9sIHZhbHVlIHRvIFJlYWN0IChhcyBhIHByb3AsIGtleSxcbiAgLy8gRE9NIGF0dHJpYnV0ZSwgQ1NTIHByb3BlcnR5LCBzdHJpbmcgcmVmLCBldGMuKSBhbmQgd2hlbiBSZWFjdCB0cmllZCB0b1xuICAvLyBjb2VyY2UgaXQgdG8gYSBzdHJpbmcgdXNpbmcgYCcnICsgdmFsdWVgLCBhbiBleGNlcHRpb24gd2FzIHRocm93bi5cbiAgLy9cbiAgLy8gVGhlIG1vc3QgY29tbW9uIHR5cGVzIHRoYXQgd2lsbCBjYXVzZSB0aGlzIGV4Y2VwdGlvbiBhcmUgYFN5bWJvbGAgaW5zdGFuY2VzXG4gIC8vIGFuZCBUZW1wb3JhbCBvYmplY3RzIGxpa2UgYFRlbXBvcmFsLkluc3RhbnRgLiBCdXQgYW55IG9iamVjdCB0aGF0IGhhcyBhXG4gIC8vIGB2YWx1ZU9mYCBvciBgW1N5bWJvbC50b1ByaW1pdGl2ZV1gIG1ldGhvZCB0aGF0IHRocm93cyB3aWxsIGFsc28gY2F1c2UgdGhpc1xuICAvLyBleGNlcHRpb24uIChMaWJyYXJ5IGF1dGhvcnMgZG8gdGhpcyB0byBwcmV2ZW50IHVzZXJzIGZyb20gdXNpbmcgYnVpbHQtaW5cbiAgLy8gbnVtZXJpYyBvcGVyYXRvcnMgbGlrZSBgK2Agb3IgY29tcGFyaXNvbiBvcGVyYXRvcnMgbGlrZSBgPj1gIGJlY2F1c2UgY3VzdG9tXG4gIC8vIG1ldGhvZHMgYXJlIG5lZWRlZCB0byBwZXJmb3JtIGFjY3VyYXRlIGFyaXRobWV0aWMgb3IgY29tcGFyaXNvbi4pXG4gIC8vXG4gIC8vIFRvIGZpeCB0aGUgcHJvYmxlbSwgY29lcmNlIHRoaXMgb2JqZWN0IG9yIHN5bWJvbCB2YWx1ZSB0byBhIHN0cmluZyBiZWZvcmVcbiAgLy8gcGFzc2luZyBpdCB0byBSZWFjdC4gVGhlIG1vc3QgcmVsaWFibGUgd2F5IGlzIHVzdWFsbHkgYFN0cmluZyh2YWx1ZSlgLlxuICAvL1xuICAvLyBUbyBmaW5kIHdoaWNoIHZhbHVlIGlzIHRocm93aW5nLCBjaGVjayB0aGUgYnJvd3NlciBvciBkZWJ1Z2dlciBjb25zb2xlLlxuICAvLyBCZWZvcmUgdGhpcyBleGNlcHRpb24gd2FzIHRocm93biwgdGhlcmUgc2hvdWxkIGJlIGBjb25zb2xlLmVycm9yYCBvdXRwdXRcbiAgLy8gdGhhdCBzaG93cyB0aGUgdHlwZSAoU3ltYm9sLCBUZW1wb3JhbC5QbGFpbkRhdGUsIGV0Yy4pIHRoYXQgY2F1c2VkIHRoZVxuICAvLyBwcm9ibGVtIGFuZCBob3cgdGhhdCB0eXBlIHdhcyB1c2VkOiBrZXksIGF0cnJpYnV0ZSwgaW5wdXQgdmFsdWUgcHJvcCwgZXRjLlxuICAvLyBJbiBtb3N0IGNhc2VzLCB0aGlzIGNvbnNvbGUgb3V0cHV0IGFsc28gc2hvd3MgdGhlIGNvbXBvbmVudCBhbmQgaXRzXG4gIC8vIGFuY2VzdG9yIGNvbXBvbmVudHMgd2hlcmUgdGhlIGV4Y2VwdGlvbiBoYXBwZW5lZC5cbiAgLy9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG4gIHJldHVybiAnJyArIHZhbHVlO1xufVxuZnVuY3Rpb24gY2hlY2tLZXlTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICB7XG4gICAgaWYgKHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ1RoZSBwcm92aWRlZCBrZXkgaXMgYW4gdW5zdXBwb3J0ZWQgdHlwZSAlcy4nICsgJyBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgYmVmb3JlIHVzaW5nIGl0IGhlcmUuJywgdHlwZU5hbWUodmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7IC8vIHRocm93ICh0byBoZWxwIGNhbGxlcnMgZmluZCB0cm91Ymxlc2hvb3RpbmcgY29tbWVudHMpXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFdyYXBwZWROYW1lKG91dGVyVHlwZSwgaW5uZXJUeXBlLCB3cmFwcGVyTmFtZSkge1xuICB2YXIgZGlzcGxheU5hbWUgPSBvdXRlclR5cGUuZGlzcGxheU5hbWU7XG5cbiAgaWYgKGRpc3BsYXlOYW1lKSB7XG4gICAgcmV0dXJuIGRpc3BsYXlOYW1lO1xuICB9XG5cbiAgdmFyIGZ1bmN0aW9uTmFtZSA9IGlubmVyVHlwZS5kaXNwbGF5TmFtZSB8fCBpbm5lclR5cGUubmFtZSB8fCAnJztcbiAgcmV0dXJuIGZ1bmN0aW9uTmFtZSAhPT0gJycgPyB3cmFwcGVyTmFtZSArIFwiKFwiICsgZnVuY3Rpb25OYW1lICsgXCIpXCIgOiB3cmFwcGVyTmFtZTtcbn0gLy8gS2VlcCBpbiBzeW5jIHdpdGggcmVhY3QtcmVjb25jaWxlci9nZXRDb21wb25lbnROYW1lRnJvbUZpYmVyXG5cblxuZnVuY3Rpb24gZ2V0Q29udGV4dE5hbWUodHlwZSkge1xuICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCAnQ29udGV4dCc7XG59IC8vIE5vdGUgdGhhdCB0aGUgcmVjb25jaWxlciBwYWNrYWdlIHNob3VsZCBnZW5lcmFsbHkgcHJlZmVyIHRvIHVzZSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKCkgaW5zdGVhZC5cblxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSkge1xuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgLy8gSG9zdCByb290LCB0ZXh0IG5vZGUgb3IganVzdCBpbnZhbGlkIHR5cGUuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB7XG4gICAgaWYgKHR5cGVvZiB0eXBlLnRhZyA9PT0gJ251bWJlcicpIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCBhbiB1bmV4cGVjdGVkIG9iamVjdCBpbiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoKS4gJyArICdUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8IG51bGw7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICByZXR1cm4gJ0ZyYWdtZW50JztcblxuICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICByZXR1cm4gJ1BvcnRhbCc7XG5cbiAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICByZXR1cm4gJ1Byb2ZpbGVyJztcblxuICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgIHJldHVybiAnU3RyaWN0TW9kZSc7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlJztcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgcmV0dXJuICdTdXNwZW5zZUxpc3QnO1xuXG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUoY29udGV4dCkgKyAnLkNvbnN1bWVyJztcblxuICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICB2YXIgcHJvdmlkZXIgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUocHJvdmlkZXIuX2NvbnRleHQpICsgJy5Qcm92aWRlcic7XG5cbiAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgcmV0dXJuIGdldFdyYXBwZWROYW1lKHR5cGUsIHR5cGUucmVuZGVyLCAnRm9yd2FyZFJlZicpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgdmFyIG91dGVyTmFtZSA9IHR5cGUuZGlzcGxheU5hbWUgfHwgbnVsbDtcblxuICAgICAgICBpZiAob3V0ZXJOYW1lICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIG91dGVyTmFtZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZS50eXBlKSB8fCAnTWVtbyc7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSB0eXBlO1xuICAgICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShpbml0KHBheWxvYWQpKTtcbiAgICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciBSRVNFUlZFRF9QUk9QUyA9IHtcbiAga2V5OiB0cnVlLFxuICByZWY6IHRydWUsXG4gIF9fc2VsZjogdHJ1ZSxcbiAgX19zb3VyY2U6IHRydWVcbn07XG52YXIgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24sIHNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duLCBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzO1xuXG57XG4gIGRpZFdhcm5BYm91dFN0cmluZ1JlZnMgPSB7fTtcbn1cblxuZnVuY3Rpb24gaGFzVmFsaWRSZWYoY29uZmlnKSB7XG4gIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdyZWYnKSkge1xuICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCAncmVmJykuZ2V0O1xuXG4gICAgICBpZiAoZ2V0dGVyICYmIGdldHRlci5pc1JlYWN0V2FybmluZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvbmZpZy5yZWYgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gaGFzVmFsaWRLZXkoY29uZmlnKSB7XG4gIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdrZXknKSkge1xuICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCAna2V5JykuZ2V0O1xuXG4gICAgICBpZiAoZ2V0dGVyICYmIGdldHRlci5pc1JlYWN0V2FybmluZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvbmZpZy5rZXkgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHZhciB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkgPSBmdW5jdGlvbiAoKSB7XG4gICAge1xuICAgICAgaWYgKCFzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93bikge1xuICAgICAgICBzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93biA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJyVzOiBga2V5YCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3NwZWNpYWwtcHJvcHMpJywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkuaXNSZWFjdFdhcm5pbmcgPSB0cnVlO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvcHMsICdrZXknLCB7XG4gICAgZ2V0OiB3YXJuQWJvdXRBY2Nlc3NpbmdLZXksXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkZWZpbmVSZWZQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpIHtcbiAgdmFyIHdhcm5BYm91dEFjY2Vzc2luZ1JlZiA9IGZ1bmN0aW9uICgpIHtcbiAgICB7XG4gICAgICBpZiAoIXNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duKSB7XG4gICAgICAgIHNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignJXM6IGByZWZgIGlzIG5vdCBhIHByb3AuIFRyeWluZyB0byBhY2Nlc3MgaXQgd2lsbCByZXN1bHQgJyArICdpbiBgdW5kZWZpbmVkYCBiZWluZyByZXR1cm5lZC4gSWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBzYW1lICcgKyAndmFsdWUgd2l0aGluIHRoZSBjaGlsZCBjb21wb25lbnQsIHlvdSBzaG91bGQgcGFzcyBpdCBhcyBhIGRpZmZlcmVudCAnICsgJ3Byb3AuIChodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3BlY2lhbC1wcm9wcyknLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHdhcm5BYm91dEFjY2Vzc2luZ1JlZi5pc1JlYWN0V2FybmluZyA9IHRydWU7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgJ3JlZicsIHtcbiAgICBnZXQ6IHdhcm5BYm91dEFjY2Vzc2luZ1JlZixcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHdhcm5JZlN0cmluZ1JlZkNhbm5vdEJlQXV0b0NvbnZlcnRlZChjb25maWcpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgY29uZmlnLnJlZiA9PT0gJ3N0cmluZycgJiYgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCAmJiBjb25maWcuX19zZWxmICYmIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQuc3RhdGVOb2RlICE9PSBjb25maWcuX19zZWxmKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnR5cGUpO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZXJyb3IoJ0NvbXBvbmVudCBcIiVzXCIgY29udGFpbnMgdGhlIHN0cmluZyByZWYgXCIlc1wiLiAnICsgJ1N1cHBvcnQgZm9yIHN0cmluZyByZWZzIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiAnICsgJ1RoaXMgY2FzZSBjYW5ub3QgYmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gYW4gYXJyb3cgZnVuY3Rpb24uICcgKyAnV2UgYXNrIHlvdSB0byBtYW51YWxseSBmaXggdGhpcyBjYXNlIGJ5IHVzaW5nIHVzZVJlZigpIG9yIGNyZWF0ZVJlZigpIGluc3RlYWQuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1zdHJpbmctcmVmJywgY29tcG9uZW50TmFtZSwgY29uZmlnLnJlZik7XG5cbiAgICAgICAgZGlkV2FybkFib3V0U3RyaW5nUmVmc1tjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBSZWFjdCBlbGVtZW50LiBUaGlzIG5vIGxvbmdlciBhZGhlcmVzIHRvXG4gKiB0aGUgY2xhc3MgcGF0dGVybiwgc28gZG8gbm90IHVzZSBuZXcgdG8gY2FsbCBpdC4gQWxzbywgaW5zdGFuY2VvZiBjaGVja1xuICogd2lsbCBub3Qgd29yay4gSW5zdGVhZCB0ZXN0ICQkdHlwZW9mIGZpZWxkIGFnYWluc3QgU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpIHRvIGNoZWNrXG4gKiBpZiBzb21ldGhpbmcgaXMgYSBSZWFjdCBFbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7Kn0gdHlwZVxuICogQHBhcmFtIHsqfSBwcm9wc1xuICogQHBhcmFtIHsqfSBrZXlcbiAqIEBwYXJhbSB7c3RyaW5nfG9iamVjdH0gcmVmXG4gKiBAcGFyYW0geyp9IG93bmVyXG4gKiBAcGFyYW0geyp9IHNlbGYgQSAqdGVtcG9yYXJ5KiBoZWxwZXIgdG8gZGV0ZWN0IHBsYWNlcyB3aGVyZSBgdGhpc2AgaXNcbiAqIGRpZmZlcmVudCBmcm9tIHRoZSBgb3duZXJgIHdoZW4gUmVhY3QuY3JlYXRlRWxlbWVudCBpcyBjYWxsZWQsIHNvIHRoYXQgd2VcbiAqIGNhbiB3YXJuLiBXZSB3YW50IHRvIGdldCByaWQgb2Ygb3duZXIgYW5kIHJlcGxhY2Ugc3RyaW5nIGByZWZgcyB3aXRoIGFycm93XG4gKiBmdW5jdGlvbnMsIGFuZCBhcyBsb25nIGFzIGB0aGlzYCBhbmQgb3duZXIgYXJlIHRoZSBzYW1lLCB0aGVyZSB3aWxsIGJlIG5vXG4gKiBjaGFuZ2UgaW4gYmVoYXZpb3IuXG4gKiBAcGFyYW0geyp9IHNvdXJjZSBBbiBhbm5vdGF0aW9uIG9iamVjdCAoYWRkZWQgYnkgYSB0cmFuc3BpbGVyIG9yIG90aGVyd2lzZSlcbiAqIGluZGljYXRpbmcgZmlsZW5hbWUsIGxpbmUgbnVtYmVyLCBhbmQvb3Igb3RoZXIgaW5mb3JtYXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuXG5cbnZhciBSZWFjdEVsZW1lbnQgPSBmdW5jdGlvbiAodHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgb3duZXIsIHByb3BzKSB7XG4gIHZhciBlbGVtZW50ID0ge1xuICAgIC8vIFRoaXMgdGFnIGFsbG93cyB1cyB0byB1bmlxdWVseSBpZGVudGlmeSB0aGlzIGFzIGEgUmVhY3QgRWxlbWVudFxuICAgICQkdHlwZW9mOiBSRUFDVF9FTEVNRU5UX1RZUEUsXG4gICAgLy8gQnVpbHQtaW4gcHJvcGVydGllcyB0aGF0IGJlbG9uZyBvbiB0aGUgZWxlbWVudFxuICAgIHR5cGU6IHR5cGUsXG4gICAga2V5OiBrZXksXG4gICAgcmVmOiByZWYsXG4gICAgcHJvcHM6IHByb3BzLFxuICAgIC8vIFJlY29yZCB0aGUgY29tcG9uZW50IHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGlzIGVsZW1lbnQuXG4gICAgX293bmVyOiBvd25lclxuICB9O1xuXG4gIHtcbiAgICAvLyBUaGUgdmFsaWRhdGlvbiBmbGFnIGlzIGN1cnJlbnRseSBtdXRhdGl2ZS4gV2UgcHV0IGl0IG9uXG4gICAgLy8gYW4gZXh0ZXJuYWwgYmFja2luZyBzdG9yZSBzbyB0aGF0IHdlIGNhbiBmcmVlemUgdGhlIHdob2xlIG9iamVjdC5cbiAgICAvLyBUaGlzIGNhbiBiZSByZXBsYWNlZCB3aXRoIGEgV2Vha01hcCBvbmNlIHRoZXkgYXJlIGltcGxlbWVudGVkIGluXG4gICAgLy8gY29tbW9ubHkgdXNlZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMuXG4gICAgZWxlbWVudC5fc3RvcmUgPSB7fTsgLy8gVG8gbWFrZSBjb21wYXJpbmcgUmVhY3RFbGVtZW50cyBlYXNpZXIgZm9yIHRlc3RpbmcgcHVycG9zZXMsIHdlIG1ha2VcbiAgICAvLyB0aGUgdmFsaWRhdGlvbiBmbGFnIG5vbi1lbnVtZXJhYmxlICh3aGVyZSBwb3NzaWJsZSwgd2hpY2ggc2hvdWxkXG4gICAgLy8gaW5jbHVkZSBldmVyeSBlbnZpcm9ubWVudCB3ZSBydW4gdGVzdHMgaW4pLCBzbyB0aGUgdGVzdCBmcmFtZXdvcmtcbiAgICAvLyBpZ25vcmVzIGl0LlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQuX3N0b3JlLCAndmFsaWRhdGVkJywge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogZmFsc2VcbiAgICB9KTsgLy8gc2VsZiBhbmQgc291cmNlIGFyZSBERVYgb25seSBwcm9wZXJ0aWVzLlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdfc2VsZicsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBzZWxmXG4gICAgfSk7IC8vIFR3byBlbGVtZW50cyBjcmVhdGVkIGluIHR3byBkaWZmZXJlbnQgcGxhY2VzIHNob3VsZCBiZSBjb25zaWRlcmVkXG4gICAgLy8gZXF1YWwgZm9yIHRlc3RpbmcgcHVycG9zZXMgYW5kIHRoZXJlZm9yZSB3ZSBoaWRlIGl0IGZyb20gZW51bWVyYXRpb24uXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudCwgJ19zb3VyY2UnLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogc291cmNlXG4gICAgfSk7XG5cbiAgICBpZiAoT2JqZWN0LmZyZWV6ZSkge1xuICAgICAgT2JqZWN0LmZyZWV6ZShlbGVtZW50LnByb3BzKTtcbiAgICAgIE9iamVjdC5mcmVlemUoZWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59O1xuLyoqXG4gKiBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyBSZWFjdEVsZW1lbnQgb2YgdGhlIGdpdmVuIHR5cGUuXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI2NyZWF0ZWVsZW1lbnRcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KHR5cGUsIGNvbmZpZywgY2hpbGRyZW4pIHtcbiAgdmFyIHByb3BOYW1lOyAvLyBSZXNlcnZlZCBuYW1lcyBhcmUgZXh0cmFjdGVkXG5cbiAgdmFyIHByb3BzID0ge307XG4gIHZhciBrZXkgPSBudWxsO1xuICB2YXIgcmVmID0gbnVsbDtcbiAgdmFyIHNlbGYgPSBudWxsO1xuICB2YXIgc291cmNlID0gbnVsbDtcblxuICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICBpZiAoaGFzVmFsaWRSZWYoY29uZmlnKSkge1xuICAgICAgcmVmID0gY29uZmlnLnJlZjtcblxuICAgICAge1xuICAgICAgICB3YXJuSWZTdHJpbmdSZWZDYW5ub3RCZUF1dG9Db252ZXJ0ZWQoY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGFzVmFsaWRLZXkoY29uZmlnKSkge1xuICAgICAge1xuICAgICAgICBjaGVja0tleVN0cmluZ0NvZXJjaW9uKGNvbmZpZy5rZXkpO1xuICAgICAgfVxuXG4gICAgICBrZXkgPSAnJyArIGNvbmZpZy5rZXk7XG4gICAgfVxuXG4gICAgc2VsZiA9IGNvbmZpZy5fX3NlbGYgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb25maWcuX19zZWxmO1xuICAgIHNvdXJjZSA9IGNvbmZpZy5fX3NvdXJjZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGNvbmZpZy5fX3NvdXJjZTsgLy8gUmVtYWluaW5nIHByb3BlcnRpZXMgYXJlIGFkZGVkIHRvIGEgbmV3IHByb3BzIG9iamVjdFxuXG4gICAgZm9yIChwcm9wTmFtZSBpbiBjb25maWcpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgcHJvcE5hbWUpICYmICFSRVNFUlZFRF9QUk9QUy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gQ2hpbGRyZW4gY2FuIGJlIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQsIGFuZCB0aG9zZSBhcmUgdHJhbnNmZXJyZWQgb250b1xuICAvLyB0aGUgbmV3bHkgYWxsb2NhdGVkIHByb3BzIG9iamVjdC5cblxuXG4gIHZhciBjaGlsZHJlbkxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggLSAyO1xuXG4gIGlmIChjaGlsZHJlbkxlbmd0aCA9PT0gMSkge1xuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gIH0gZWxzZSBpZiAoY2hpbGRyZW5MZW5ndGggPiAxKSB7XG4gICAgdmFyIGNoaWxkQXJyYXkgPSBBcnJheShjaGlsZHJlbkxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkQXJyYXlbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmIChPYmplY3QuZnJlZXplKSB7XG4gICAgICAgIE9iamVjdC5mcmVlemUoY2hpbGRBcnJheSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZEFycmF5O1xuICB9IC8vIFJlc29sdmUgZGVmYXVsdCBwcm9wc1xuXG5cbiAgaWYgKHR5cGUgJiYgdHlwZS5kZWZhdWx0UHJvcHMpIHtcbiAgICB2YXIgZGVmYXVsdFByb3BzID0gdHlwZS5kZWZhdWx0UHJvcHM7XG5cbiAgICBmb3IgKHByb3BOYW1lIGluIGRlZmF1bHRQcm9wcykge1xuICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAge1xuICAgIGlmIChrZXkgfHwgcmVmKSB7XG4gICAgICB2YXIgZGlzcGxheU5hbWUgPSB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyA/IHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8ICdVbmtub3duJyA6IHR5cGU7XG5cbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlZikge1xuICAgICAgICBkZWZpbmVSZWZQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBSZWFjdEVsZW1lbnQodHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCwgcHJvcHMpO1xufVxuZnVuY3Rpb24gY2xvbmVBbmRSZXBsYWNlS2V5KG9sZEVsZW1lbnQsIG5ld0tleSkge1xuICB2YXIgbmV3RWxlbWVudCA9IFJlYWN0RWxlbWVudChvbGRFbGVtZW50LnR5cGUsIG5ld0tleSwgb2xkRWxlbWVudC5yZWYsIG9sZEVsZW1lbnQuX3NlbGYsIG9sZEVsZW1lbnQuX3NvdXJjZSwgb2xkRWxlbWVudC5fb3duZXIsIG9sZEVsZW1lbnQucHJvcHMpO1xuICByZXR1cm4gbmV3RWxlbWVudDtcbn1cbi8qKlxuICogQ2xvbmUgYW5kIHJldHVybiBhIG5ldyBSZWFjdEVsZW1lbnQgdXNpbmcgZWxlbWVudCBhcyB0aGUgc3RhcnRpbmcgcG9pbnQuXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI2Nsb25lZWxlbWVudFxuICovXG5cbmZ1bmN0aW9uIGNsb25lRWxlbWVudChlbGVtZW50LCBjb25maWcsIGNoaWxkcmVuKSB7XG4gIGlmIChlbGVtZW50ID09PSBudWxsIHx8IGVsZW1lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlJlYWN0LmNsb25lRWxlbWVudCguLi4pOiBUaGUgYXJndW1lbnQgbXVzdCBiZSBhIFJlYWN0IGVsZW1lbnQsIGJ1dCB5b3UgcGFzc2VkIFwiICsgZWxlbWVudCArIFwiLlwiKTtcbiAgfVxuXG4gIHZhciBwcm9wTmFtZTsgLy8gT3JpZ2luYWwgcHJvcHMgYXJlIGNvcGllZFxuXG4gIHZhciBwcm9wcyA9IGFzc2lnbih7fSwgZWxlbWVudC5wcm9wcyk7IC8vIFJlc2VydmVkIG5hbWVzIGFyZSBleHRyYWN0ZWRcblxuICB2YXIga2V5ID0gZWxlbWVudC5rZXk7XG4gIHZhciByZWYgPSBlbGVtZW50LnJlZjsgLy8gU2VsZiBpcyBwcmVzZXJ2ZWQgc2luY2UgdGhlIG93bmVyIGlzIHByZXNlcnZlZC5cblxuICB2YXIgc2VsZiA9IGVsZW1lbnQuX3NlbGY7IC8vIFNvdXJjZSBpcyBwcmVzZXJ2ZWQgc2luY2UgY2xvbmVFbGVtZW50IGlzIHVubGlrZWx5IHRvIGJlIHRhcmdldGVkIGJ5IGFcbiAgLy8gdHJhbnNwaWxlciwgYW5kIHRoZSBvcmlnaW5hbCBzb3VyY2UgaXMgcHJvYmFibHkgYSBiZXR0ZXIgaW5kaWNhdG9yIG9mIHRoZVxuICAvLyB0cnVlIG93bmVyLlxuXG4gIHZhciBzb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7IC8vIE93bmVyIHdpbGwgYmUgcHJlc2VydmVkLCB1bmxlc3MgcmVmIGlzIG92ZXJyaWRkZW5cblxuICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcblxuICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICBpZiAoaGFzVmFsaWRSZWYoY29uZmlnKSkge1xuICAgICAgLy8gU2lsZW50bHkgc3RlYWwgdGhlIHJlZiBmcm9tIHRoZSBwYXJlbnQuXG4gICAgICByZWYgPSBjb25maWcucmVmO1xuICAgICAgb3duZXIgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50O1xuICAgIH1cblxuICAgIGlmIChoYXNWYWxpZEtleShjb25maWcpKSB7XG4gICAgICB7XG4gICAgICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24oY29uZmlnLmtleSk7XG4gICAgICB9XG5cbiAgICAgIGtleSA9ICcnICsgY29uZmlnLmtleTtcbiAgICB9IC8vIFJlbWFpbmluZyBwcm9wZXJ0aWVzIG92ZXJyaWRlIGV4aXN0aW5nIHByb3BzXG5cblxuICAgIHZhciBkZWZhdWx0UHJvcHM7XG5cbiAgICBpZiAoZWxlbWVudC50eXBlICYmIGVsZW1lbnQudHlwZS5kZWZhdWx0UHJvcHMpIHtcbiAgICAgIGRlZmF1bHRQcm9wcyA9IGVsZW1lbnQudHlwZS5kZWZhdWx0UHJvcHM7XG4gICAgfVxuXG4gICAgZm9yIChwcm9wTmFtZSBpbiBjb25maWcpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgcHJvcE5hbWUpICYmICFSRVNFUlZFRF9QUk9QUy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgaWYgKGNvbmZpZ1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCAmJiBkZWZhdWx0UHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIFJlc29sdmUgZGVmYXVsdCBwcm9wc1xuICAgICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSAvLyBDaGlsZHJlbiBjYW4gYmUgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCwgYW5kIHRob3NlIGFyZSB0cmFuc2ZlcnJlZCBvbnRvXG4gIC8vIHRoZSBuZXdseSBhbGxvY2F0ZWQgcHJvcHMgb2JqZWN0LlxuXG5cbiAgdmFyIGNoaWxkcmVuTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCAtIDI7XG5cbiAgaWYgKGNoaWxkcmVuTGVuZ3RoID09PSAxKSB7XG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgfSBlbHNlIGlmIChjaGlsZHJlbkxlbmd0aCA+IDEpIHtcbiAgICB2YXIgY2hpbGRBcnJheSA9IEFycmF5KGNoaWxkcmVuTGVuZ3RoKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW5MZW5ndGg7IGkrKykge1xuICAgICAgY2hpbGRBcnJheVtpXSA9IGFyZ3VtZW50c1tpICsgMl07XG4gICAgfVxuXG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZEFycmF5O1xuICB9XG5cbiAgcmV0dXJuIFJlYWN0RWxlbWVudChlbGVtZW50LnR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIG93bmVyLCBwcm9wcyk7XG59XG4vKipcbiAqIFZlcmlmaWVzIHRoZSBvYmplY3QgaXMgYSBSZWFjdEVsZW1lbnQuXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI2lzdmFsaWRlbGVtZW50XG4gKiBAcGFyYW0gez9vYmplY3R9IG9iamVjdFxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBgb2JqZWN0YCBpcyBhIFJlYWN0RWxlbWVudC5cbiAqIEBmaW5hbFxuICovXG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50KG9iamVjdCkge1xuICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsICYmIG9iamVjdC4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xufVxuXG52YXIgU0VQQVJBVE9SID0gJy4nO1xudmFyIFNVQlNFUEFSQVRPUiA9ICc6Jztcbi8qKlxuICogRXNjYXBlIGFuZCB3cmFwIGtleSBzbyBpdCBpcyBzYWZlIHRvIHVzZSBhcyBhIHJlYWN0aWRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IHRvIGJlIGVzY2FwZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSBlc2NhcGVkIGtleS5cbiAqL1xuXG5mdW5jdGlvbiBlc2NhcGUoa2V5KSB7XG4gIHZhciBlc2NhcGVSZWdleCA9IC9bPTpdL2c7XG4gIHZhciBlc2NhcGVyTG9va3VwID0ge1xuICAgICc9JzogJz0wJyxcbiAgICAnOic6ICc9MidcbiAgfTtcbiAgdmFyIGVzY2FwZWRTdHJpbmcgPSBrZXkucmVwbGFjZShlc2NhcGVSZWdleCwgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgcmV0dXJuIGVzY2FwZXJMb29rdXBbbWF0Y2hdO1xuICB9KTtcbiAgcmV0dXJuICckJyArIGVzY2FwZWRTdHJpbmc7XG59XG4vKipcbiAqIFRPRE86IFRlc3QgdGhhdCBhIHNpbmdsZSBjaGlsZCBhbmQgYW4gYXJyYXkgd2l0aCBvbmUgaXRlbSBoYXZlIHRoZSBzYW1lIGtleVxuICogcGF0dGVybi5cbiAqL1xuXG5cbnZhciBkaWRXYXJuQWJvdXRNYXBzID0gZmFsc2U7XG52YXIgdXNlclByb3ZpZGVkS2V5RXNjYXBlUmVnZXggPSAvXFwvKy9nO1xuXG5mdW5jdGlvbiBlc2NhcGVVc2VyUHJvdmlkZWRLZXkodGV4dCkge1xuICByZXR1cm4gdGV4dC5yZXBsYWNlKHVzZXJQcm92aWRlZEtleUVzY2FwZVJlZ2V4LCAnJCYvJyk7XG59XG4vKipcbiAqIEdlbmVyYXRlIGEga2V5IHN0cmluZyB0aGF0IGlkZW50aWZpZXMgYSBlbGVtZW50IHdpdGhpbiBhIHNldC5cbiAqXG4gKiBAcGFyYW0geyp9IGVsZW1lbnQgQSBlbGVtZW50IHRoYXQgY291bGQgY29udGFpbiBhIG1hbnVhbCBrZXkuXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXggSW5kZXggdGhhdCBpcyB1c2VkIGlmIGEgbWFudWFsIGtleSBpcyBub3QgcHJvdmlkZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cblxuXG5mdW5jdGlvbiBnZXRFbGVtZW50S2V5KGVsZW1lbnQsIGluZGV4KSB7XG4gIC8vIERvIHNvbWUgdHlwZWNoZWNraW5nIGhlcmUgc2luY2Ugd2UgY2FsbCB0aGlzIGJsaW5kbHkuIFdlIHdhbnQgdG8gZW5zdXJlXG4gIC8vIHRoYXQgd2UgZG9uJ3QgYmxvY2sgcG90ZW50aWFsIGZ1dHVyZSBFUyBBUElzLlxuICBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdvYmplY3QnICYmIGVsZW1lbnQgIT09IG51bGwgJiYgZWxlbWVudC5rZXkgIT0gbnVsbCkge1xuICAgIC8vIEV4cGxpY2l0IGtleVxuICAgIHtcbiAgICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24oZWxlbWVudC5rZXkpO1xuICAgIH1cblxuICAgIHJldHVybiBlc2NhcGUoJycgKyBlbGVtZW50LmtleSk7XG4gIH0gLy8gSW1wbGljaXQga2V5IGRldGVybWluZWQgYnkgdGhlIGluZGV4IGluIHRoZSBzZXRcblxuXG4gIHJldHVybiBpbmRleC50b1N0cmluZygzNik7XG59XG5cbmZ1bmN0aW9uIG1hcEludG9BcnJheShjaGlsZHJlbiwgYXJyYXksIGVzY2FwZWRQcmVmaXgsIG5hbWVTb0ZhciwgY2FsbGJhY2spIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgY2hpbGRyZW47XG5cbiAgaWYgKHR5cGUgPT09ICd1bmRlZmluZWQnIHx8IHR5cGUgPT09ICdib29sZWFuJykge1xuICAgIC8vIEFsbCBvZiB0aGUgYWJvdmUgYXJlIHBlcmNlaXZlZCBhcyBudWxsLlxuICAgIGNoaWxkcmVuID0gbnVsbDtcbiAgfVxuXG4gIHZhciBpbnZva2VDYWxsYmFjayA9IGZhbHNlO1xuXG4gIGlmIChjaGlsZHJlbiA9PT0gbnVsbCkge1xuICAgIGludm9rZUNhbGxiYWNrID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICBpbnZva2VDYWxsYmFjayA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICBzd2l0Y2ggKGNoaWxkcmVuLiQkdHlwZW9mKSB7XG4gICAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICAgIGludm9rZUNhbGxiYWNrID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgfVxuICB9XG5cbiAgaWYgKGludm9rZUNhbGxiYWNrKSB7XG4gICAgdmFyIF9jaGlsZCA9IGNoaWxkcmVuO1xuICAgIHZhciBtYXBwZWRDaGlsZCA9IGNhbGxiYWNrKF9jaGlsZCk7IC8vIElmIGl0J3MgdGhlIG9ubHkgY2hpbGQsIHRyZWF0IHRoZSBuYW1lIGFzIGlmIGl0IHdhcyB3cmFwcGVkIGluIGFuIGFycmF5XG4gICAgLy8gc28gdGhhdCBpdCdzIGNvbnNpc3RlbnQgaWYgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBncm93czpcblxuICAgIHZhciBjaGlsZEtleSA9IG5hbWVTb0ZhciA9PT0gJycgPyBTRVBBUkFUT1IgKyBnZXRFbGVtZW50S2V5KF9jaGlsZCwgMCkgOiBuYW1lU29GYXI7XG5cbiAgICBpZiAoaXNBcnJheShtYXBwZWRDaGlsZCkpIHtcbiAgICAgIHZhciBlc2NhcGVkQ2hpbGRLZXkgPSAnJztcblxuICAgICAgaWYgKGNoaWxkS2V5ICE9IG51bGwpIHtcbiAgICAgICAgZXNjYXBlZENoaWxkS2V5ID0gZXNjYXBlVXNlclByb3ZpZGVkS2V5KGNoaWxkS2V5KSArICcvJztcbiAgICAgIH1cblxuICAgICAgbWFwSW50b0FycmF5KG1hcHBlZENoaWxkLCBhcnJheSwgZXNjYXBlZENoaWxkS2V5LCAnJywgZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgcmV0dXJuIGM7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKG1hcHBlZENoaWxkICE9IG51bGwpIHtcbiAgICAgIGlmIChpc1ZhbGlkRWxlbWVudChtYXBwZWRDaGlsZCkpIHtcbiAgICAgICAge1xuICAgICAgICAgIC8vIFRoZSBgaWZgIHN0YXRlbWVudCBoZXJlIHByZXZlbnRzIGF1dG8tZGlzYWJsaW5nIG9mIHRoZSBzYWZlXG4gICAgICAgICAgLy8gY29lcmNpb24gRVNMaW50IHJ1bGUsIHNvIHdlIG11c3QgbWFudWFsbHkgZGlzYWJsZSBpdCBiZWxvdy5cbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIFJlYWN0LlBvcnRhbCBkb2Vzbid0IGhhdmUgYSBrZXlcbiAgICAgICAgICBpZiAobWFwcGVkQ2hpbGQua2V5ICYmICghX2NoaWxkIHx8IF9jaGlsZC5rZXkgIT09IG1hcHBlZENoaWxkLmtleSkpIHtcbiAgICAgICAgICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24obWFwcGVkQ2hpbGQua2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBtYXBwZWRDaGlsZCA9IGNsb25lQW5kUmVwbGFjZUtleShtYXBwZWRDaGlsZCwgLy8gS2VlcCBib3RoIHRoZSAobWFwcGVkKSBhbmQgb2xkIGtleXMgaWYgdGhleSBkaWZmZXIsIGp1c3QgYXNcbiAgICAgICAgLy8gdHJhdmVyc2VBbGxDaGlsZHJlbiB1c2VkIHRvIGRvIGZvciBvYmplY3RzIGFzIGNoaWxkcmVuXG4gICAgICAgIGVzY2FwZWRQcmVmaXggKyAoIC8vICRGbG93Rml4TWUgRmxvdyBpbmNvcnJlY3RseSB0aGlua3MgUmVhY3QuUG9ydGFsIGRvZXNuJ3QgaGF2ZSBhIGtleVxuICAgICAgICBtYXBwZWRDaGlsZC5rZXkgJiYgKCFfY2hpbGQgfHwgX2NoaWxkLmtleSAhPT0gbWFwcGVkQ2hpbGQua2V5KSA/IC8vICRGbG93Rml4TWUgRmxvdyBpbmNvcnJlY3RseSB0aGlua3MgZXhpc3RpbmcgZWxlbWVudCdzIGtleSBjYW4gYmUgYSBudW1iZXJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG4gICAgICAgIGVzY2FwZVVzZXJQcm92aWRlZEtleSgnJyArIG1hcHBlZENoaWxkLmtleSkgKyAnLycgOiAnJykgKyBjaGlsZEtleSk7XG4gICAgICB9XG5cbiAgICAgIGFycmF5LnB1c2gobWFwcGVkQ2hpbGQpO1xuICAgIH1cblxuICAgIHJldHVybiAxO1xuICB9XG5cbiAgdmFyIGNoaWxkO1xuICB2YXIgbmV4dE5hbWU7XG4gIHZhciBzdWJ0cmVlQ291bnQgPSAwOyAvLyBDb3VudCBvZiBjaGlsZHJlbiBmb3VuZCBpbiB0aGUgY3VycmVudCBzdWJ0cmVlLlxuXG4gIHZhciBuZXh0TmFtZVByZWZpeCA9IG5hbWVTb0ZhciA9PT0gJycgPyBTRVBBUkFUT1IgOiBuYW1lU29GYXIgKyBTVUJTRVBBUkFUT1I7XG5cbiAgaWYgKGlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgIG5leHROYW1lID0gbmV4dE5hbWVQcmVmaXggKyBnZXRFbGVtZW50S2V5KGNoaWxkLCBpKTtcbiAgICAgIHN1YnRyZWVDb3VudCArPSBtYXBJbnRvQXJyYXkoY2hpbGQsIGFycmF5LCBlc2NhcGVkUHJlZml4LCBuZXh0TmFtZSwgY2FsbGJhY2spO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4oY2hpbGRyZW4pO1xuXG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgaXRlcmFibGVDaGlsZHJlbiA9IGNoaWxkcmVuO1xuXG4gICAgICB7XG4gICAgICAgIC8vIFdhcm4gYWJvdXQgdXNpbmcgTWFwcyBhcyBjaGlsZHJlblxuICAgICAgICBpZiAoaXRlcmF0b3JGbiA9PT0gaXRlcmFibGVDaGlsZHJlbi5lbnRyaWVzKSB7XG4gICAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRNYXBzKSB7XG4gICAgICAgICAgICB3YXJuKCdVc2luZyBNYXBzIGFzIGNoaWxkcmVuIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnVXNlIGFuIGFycmF5IG9mIGtleWVkIFJlYWN0RWxlbWVudHMgaW5zdGVhZC4nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkaWRXYXJuQWJvdXRNYXBzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwoaXRlcmFibGVDaGlsZHJlbik7XG4gICAgICB2YXIgc3RlcDtcbiAgICAgIHZhciBpaSA9IDA7XG5cbiAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgY2hpbGQgPSBzdGVwLnZhbHVlO1xuICAgICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgZ2V0RWxlbWVudEtleShjaGlsZCwgaWkrKyk7XG4gICAgICAgIHN1YnRyZWVDb3VudCArPSBtYXBJbnRvQXJyYXkoY2hpbGQsIGFycmF5LCBlc2NhcGVkUHJlZml4LCBuZXh0TmFtZSwgY2FsbGJhY2spO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICAgICAgdmFyIGNoaWxkcmVuU3RyaW5nID0gU3RyaW5nKGNoaWxkcmVuKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk9iamVjdHMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkIChmb3VuZDogXCIgKyAoY2hpbGRyZW5TdHJpbmcgPT09ICdbb2JqZWN0IE9iamVjdF0nID8gJ29iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhjaGlsZHJlbikuam9pbignLCAnKSArICd9JyA6IGNoaWxkcmVuU3RyaW5nKSArIFwiKS4gXCIgKyAnSWYgeW91IG1lYW50IHRvIHJlbmRlciBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4sIHVzZSBhbiBhcnJheSAnICsgJ2luc3RlYWQuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN1YnRyZWVDb3VudDtcbn1cblxuLyoqXG4gKiBNYXBzIGNoaWxkcmVuIHRoYXQgYXJlIHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI3JlYWN0Y2hpbGRyZW5tYXBcbiAqXG4gKiBUaGUgcHJvdmlkZWQgbWFwRnVuY3Rpb24oY2hpbGQsIGluZGV4KSB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaFxuICogbGVhZiBjaGlsZC5cbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKiwgaW50KX0gZnVuYyBUaGUgbWFwIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IENvbnRleHQgZm9yIG1hcEZ1bmN0aW9uLlxuICogQHJldHVybiB7b2JqZWN0fSBPYmplY3QgY29udGFpbmluZyB0aGUgb3JkZXJlZCBtYXAgb2YgcmVzdWx0cy5cbiAqL1xuZnVuY3Rpb24gbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmMsIGNvbnRleHQpIHtcbiAgaWYgKGNoaWxkcmVuID09IG51bGwpIHtcbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH1cblxuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBjb3VudCA9IDA7XG4gIG1hcEludG9BcnJheShjaGlsZHJlbiwgcmVzdWx0LCAnJywgJycsIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHJldHVybiBmdW5jLmNhbGwoY29udGV4dCwgY2hpbGQsIGNvdW50KyspO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuICogQ291bnQgdGhlIG51bWJlciBvZiBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzXG4gKiBgcHJvcHMuY2hpbGRyZW5gLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbmNvdW50XG4gKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBjb250YWluZXIuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBudW1iZXIgb2YgY2hpbGRyZW4uXG4gKi9cblxuXG5mdW5jdGlvbiBjb3VudENoaWxkcmVuKGNoaWxkcmVuKSB7XG4gIHZhciBuID0gMDtcbiAgbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmN0aW9uICgpIHtcbiAgICBuKys7IC8vIERvbid0IHJldHVybiBhbnl0aGluZ1xuICB9KTtcbiAgcmV0dXJuIG47XG59XG5cbi8qKlxuICogSXRlcmF0ZXMgdGhyb3VnaCBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmAuXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVuZm9yZWFjaFxuICpcbiAqIFRoZSBwcm92aWRlZCBmb3JFYWNoRnVuYyhjaGlsZCwgaW5kZXgpIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoXG4gKiBsZWFmIGNoaWxkLlxuICpcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHBhcmFtIHtmdW5jdGlvbigqLCBpbnQpfSBmb3JFYWNoRnVuY1xuICogQHBhcmFtIHsqfSBmb3JFYWNoQ29udGV4dCBDb250ZXh0IGZvciBmb3JFYWNoQ29udGV4dC5cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaENoaWxkcmVuKGNoaWxkcmVuLCBmb3JFYWNoRnVuYywgZm9yRWFjaENvbnRleHQpIHtcbiAgbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmN0aW9uICgpIHtcbiAgICBmb3JFYWNoRnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyAvLyBEb24ndCByZXR1cm4gYW55dGhpbmcuXG4gIH0sIGZvckVhY2hDb250ZXh0KTtcbn1cbi8qKlxuICogRmxhdHRlbiBhIGNoaWxkcmVuIG9iamVjdCAodHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gKSBhbmRcbiAqIHJldHVybiBhbiBhcnJheSB3aXRoIGFwcHJvcHJpYXRlbHkgcmUta2V5ZWQgY2hpbGRyZW4uXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVudG9hcnJheVxuICovXG5cblxuZnVuY3Rpb24gdG9BcnJheShjaGlsZHJlbikge1xuICByZXR1cm4gbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHJldHVybiBjaGlsZDtcbiAgfSkgfHwgW107XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGZpcnN0IGNoaWxkIGluIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiBhbmQgdmVyaWZpZXMgdGhhdCB0aGVyZVxuICogaXMgb25seSBvbmUgY2hpbGQgaW4gdGhlIGNvbGxlY3Rpb24uXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVub25seVxuICpcbiAqIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IGEgc2luZ2xlIGNoaWxkIGdldHNcbiAqIHBhc3NlZCB3aXRob3V0IGEgd3JhcHBlciwgYnV0IHRoZSBwdXJwb3NlIG9mIHRoaXMgaGVscGVyIGZ1bmN0aW9uIGlzIHRvXG4gKiBhYnN0cmFjdCBhd2F5IHRoZSBwYXJ0aWN1bGFyIHN0cnVjdHVyZSBvZiBjaGlsZHJlbi5cbiAqXG4gKiBAcGFyYW0gez9vYmplY3R9IGNoaWxkcmVuIENoaWxkIGNvbGxlY3Rpb24gc3RydWN0dXJlLlxuICogQHJldHVybiB7UmVhY3RFbGVtZW50fSBUaGUgZmlyc3QgYW5kIG9ubHkgYFJlYWN0RWxlbWVudGAgY29udGFpbmVkIGluIHRoZVxuICogc3RydWN0dXJlLlxuICovXG5cblxuZnVuY3Rpb24gb25seUNoaWxkKGNoaWxkcmVuKSB7XG4gIGlmICghaXNWYWxpZEVsZW1lbnQoY2hpbGRyZW4pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdSZWFjdC5DaGlsZHJlbi5vbmx5IGV4cGVjdGVkIHRvIHJlY2VpdmUgYSBzaW5nbGUgUmVhY3QgZWxlbWVudCBjaGlsZC4nKTtcbiAgfVxuXG4gIHJldHVybiBjaGlsZHJlbjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29udGV4dChkZWZhdWx0VmFsdWUpIHtcbiAgLy8gVE9ETzogU2Vjb25kIGFyZ3VtZW50IHVzZWQgdG8gYmUgYW4gb3B0aW9uYWwgYGNhbGN1bGF0ZUNoYW5nZWRCaXRzYFxuICAvLyBmdW5jdGlvbi4gV2FybiB0byByZXNlcnZlIGZvciBmdXR1cmUgdXNlP1xuICB2YXIgY29udGV4dCA9IHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfQ09OVEVYVF9UWVBFLFxuICAgIC8vIEFzIGEgd29ya2Fyb3VuZCB0byBzdXBwb3J0IG11bHRpcGxlIGNvbmN1cnJlbnQgcmVuZGVyZXJzLCB3ZSBjYXRlZ29yaXplXG4gICAgLy8gc29tZSByZW5kZXJlcnMgYXMgcHJpbWFyeSBhbmQgb3RoZXJzIGFzIHNlY29uZGFyeS4gV2Ugb25seSBleHBlY3RcbiAgICAvLyB0aGVyZSB0byBiZSB0d28gY29uY3VycmVudCByZW5kZXJlcnMgYXQgbW9zdDogUmVhY3QgTmF0aXZlIChwcmltYXJ5KSBhbmRcbiAgICAvLyBGYWJyaWMgKHNlY29uZGFyeSk7IFJlYWN0IERPTSAocHJpbWFyeSkgYW5kIFJlYWN0IEFSVCAoc2Vjb25kYXJ5KS5cbiAgICAvLyBTZWNvbmRhcnkgcmVuZGVyZXJzIHN0b3JlIHRoZWlyIGNvbnRleHQgdmFsdWVzIG9uIHNlcGFyYXRlIGZpZWxkcy5cbiAgICBfY3VycmVudFZhbHVlOiBkZWZhdWx0VmFsdWUsXG4gICAgX2N1cnJlbnRWYWx1ZTI6IGRlZmF1bHRWYWx1ZSxcbiAgICAvLyBVc2VkIHRvIHRyYWNrIGhvdyBtYW55IGNvbmN1cnJlbnQgcmVuZGVyZXJzIHRoaXMgY29udGV4dCBjdXJyZW50bHlcbiAgICAvLyBzdXBwb3J0cyB3aXRoaW4gaW4gYSBzaW5nbGUgcmVuZGVyZXIuIFN1Y2ggYXMgcGFyYWxsZWwgc2VydmVyIHJlbmRlcmluZy5cbiAgICBfdGhyZWFkQ291bnQ6IDAsXG4gICAgLy8gVGhlc2UgYXJlIGNpcmN1bGFyXG4gICAgUHJvdmlkZXI6IG51bGwsXG4gICAgQ29uc3VtZXI6IG51bGwsXG4gICAgLy8gQWRkIHRoZXNlIHRvIHVzZSBzYW1lIGhpZGRlbiBjbGFzcyBpbiBWTSBhcyBTZXJ2ZXJDb250ZXh0XG4gICAgX2RlZmF1bHRWYWx1ZTogbnVsbCxcbiAgICBfZ2xvYmFsTmFtZTogbnVsbFxuICB9O1xuICBjb250ZXh0LlByb3ZpZGVyID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9QUk9WSURFUl9UWVBFLFxuICAgIF9jb250ZXh0OiBjb250ZXh0XG4gIH07XG4gIHZhciBoYXNXYXJuZWRBYm91dFVzaW5nTmVzdGVkQ29udGV4dENvbnN1bWVycyA9IGZhbHNlO1xuICB2YXIgaGFzV2FybmVkQWJvdXRVc2luZ0NvbnN1bWVyUHJvdmlkZXIgPSBmYWxzZTtcbiAgdmFyIGhhc1dhcm5lZEFib3V0RGlzcGxheU5hbWVPbkNvbnN1bWVyID0gZmFsc2U7XG5cbiAge1xuICAgIC8vIEEgc2VwYXJhdGUgb2JqZWN0LCBidXQgcHJveGllcyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBjb250ZXh0IG9iamVjdCBmb3JcbiAgICAvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gSXQgaGFzIGEgZGlmZmVyZW50ICQkdHlwZW9mLCBzbyB3ZSBjYW4gcHJvcGVybHlcbiAgICAvLyB3YXJuIGZvciB0aGUgaW5jb3JyZWN0IHVzYWdlIG9mIENvbnRleHQgYXMgYSBDb25zdW1lci5cbiAgICB2YXIgQ29uc3VtZXIgPSB7XG4gICAgICAkJHR5cGVvZjogUkVBQ1RfQ09OVEVYVF9UWVBFLFxuICAgICAgX2NvbnRleHQ6IGNvbnRleHRcbiAgICB9OyAvLyAkRmxvd0ZpeE1lOiBGbG93IGNvbXBsYWlucyBhYm91dCBub3Qgc2V0dGluZyBhIHZhbHVlLCB3aGljaCBpcyBpbnRlbnRpb25hbCBoZXJlXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhDb25zdW1lciwge1xuICAgICAgUHJvdmlkZXI6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dFVzaW5nQ29uc3VtZXJQcm92aWRlcikge1xuICAgICAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ0NvbnN1bWVyUHJvdmlkZXIgPSB0cnVlO1xuXG4gICAgICAgICAgICBlcnJvcignUmVuZGVyaW5nIDxDb250ZXh0LkNvbnN1bWVyLlByb3ZpZGVyPiBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBEaWQgeW91IG1lYW4gdG8gcmVuZGVyIDxDb250ZXh0LlByb3ZpZGVyPiBpbnN0ZWFkPycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb250ZXh0LlByb3ZpZGVyO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfUHJvdmlkZXIpIHtcbiAgICAgICAgICBjb250ZXh0LlByb3ZpZGVyID0gX1Byb3ZpZGVyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgX2N1cnJlbnRWYWx1ZToge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5fY3VycmVudFZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgY29udGV4dC5fY3VycmVudFZhbHVlID0gX2N1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIF9jdXJyZW50VmFsdWUyOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9jdXJyZW50VmFsdWUyO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfY3VycmVudFZhbHVlMikge1xuICAgICAgICAgIGNvbnRleHQuX2N1cnJlbnRWYWx1ZTIgPSBfY3VycmVudFZhbHVlMjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIF90aHJlYWRDb3VudDoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5fdGhyZWFkQ291bnQ7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKF90aHJlYWRDb3VudCkge1xuICAgICAgICAgIGNvbnRleHQuX3RocmVhZENvdW50ID0gX3RocmVhZENvdW50O1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgQ29uc3VtZXI6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dFVzaW5nTmVzdGVkQ29udGV4dENvbnN1bWVycykge1xuICAgICAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ05lc3RlZENvbnRleHRDb25zdW1lcnMgPSB0cnVlO1xuXG4gICAgICAgICAgICBlcnJvcignUmVuZGVyaW5nIDxDb250ZXh0LkNvbnN1bWVyLkNvbnN1bWVyPiBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBEaWQgeW91IG1lYW4gdG8gcmVuZGVyIDxDb250ZXh0LkNvbnN1bWVyPiBpbnN0ZWFkPycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb250ZXh0LkNvbnN1bWVyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZGlzcGxheU5hbWU6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuZGlzcGxheU5hbWU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKGRpc3BsYXlOYW1lKSB7XG4gICAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dERpc3BsYXlOYW1lT25Db25zdW1lcikge1xuICAgICAgICAgICAgd2FybignU2V0dGluZyBgZGlzcGxheU5hbWVgIG9uIENvbnRleHQuQ29uc3VtZXIgaGFzIG5vIGVmZmVjdC4gJyArIFwiWW91IHNob3VsZCBzZXQgaXQgZGlyZWN0bHkgb24gdGhlIGNvbnRleHQgd2l0aCBDb250ZXh0LmRpc3BsYXlOYW1lID0gJyVzJy5cIiwgZGlzcGxheU5hbWUpO1xuXG4gICAgICAgICAgICBoYXNXYXJuZWRBYm91dERpc3BsYXlOYW1lT25Db25zdW1lciA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7IC8vICRGbG93Rml4TWU6IEZsb3cgY29tcGxhaW5zIGFib3V0IG1pc3NpbmcgcHJvcGVydGllcyBiZWNhdXNlIGl0IGRvZXNuJ3QgdW5kZXJzdGFuZCBkZWZpbmVQcm9wZXJ0eVxuXG4gICAgY29udGV4dC5Db25zdW1lciA9IENvbnN1bWVyO1xuICB9XG5cbiAge1xuICAgIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciA9IG51bGw7XG4gICAgY29udGV4dC5fY3VycmVudFJlbmRlcmVyMiA9IG51bGw7XG4gIH1cblxuICByZXR1cm4gY29udGV4dDtcbn1cblxudmFyIFVuaW5pdGlhbGl6ZWQgPSAtMTtcbnZhciBQZW5kaW5nID0gMDtcbnZhciBSZXNvbHZlZCA9IDE7XG52YXIgUmVqZWN0ZWQgPSAyO1xuXG5mdW5jdGlvbiBsYXp5SW5pdGlhbGl6ZXIocGF5bG9hZCkge1xuICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBVbmluaXRpYWxpemVkKSB7XG4gICAgdmFyIGN0b3IgPSBwYXlsb2FkLl9yZXN1bHQ7XG4gICAgdmFyIHRoZW5hYmxlID0gY3RvcigpOyAvLyBUcmFuc2l0aW9uIHRvIHRoZSBuZXh0IHN0YXRlLlxuICAgIC8vIFRoaXMgbWlnaHQgdGhyb3cgZWl0aGVyIGJlY2F1c2UgaXQncyBtaXNzaW5nIG9yIHRocm93cy4gSWYgc28sIHdlIHRyZWF0IGl0XG4gICAgLy8gYXMgc3RpbGwgdW5pbml0aWFsaXplZCBhbmQgdHJ5IGFnYWluIG5leHQgdGltZS4gV2hpY2ggaXMgdGhlIHNhbWUgYXMgd2hhdFxuICAgIC8vIGhhcHBlbnMgaWYgdGhlIGN0b3Igb3IgYW55IHdyYXBwZXJzIHByb2Nlc3NpbmcgdGhlIGN0b3IgdGhyb3dzLiBUaGlzIG1pZ2h0XG4gICAgLy8gZW5kIHVwIGZpeGluZyBpdCBpZiB0aGUgcmVzb2x1dGlvbiB3YXMgYSBjb25jdXJyZW5jeSBidWcuXG5cbiAgICB0aGVuYWJsZS50aGVuKGZ1bmN0aW9uIChtb2R1bGVPYmplY3QpIHtcbiAgICAgIGlmIChwYXlsb2FkLl9zdGF0dXMgPT09IFBlbmRpbmcgfHwgcGF5bG9hZC5fc3RhdHVzID09PSBVbmluaXRpYWxpemVkKSB7XG4gICAgICAgIC8vIFRyYW5zaXRpb24gdG8gdGhlIG5leHQgc3RhdGUuXG4gICAgICAgIHZhciByZXNvbHZlZCA9IHBheWxvYWQ7XG4gICAgICAgIHJlc29sdmVkLl9zdGF0dXMgPSBSZXNvbHZlZDtcbiAgICAgICAgcmVzb2x2ZWQuX3Jlc3VsdCA9IG1vZHVsZU9iamVjdDtcbiAgICAgIH1cbiAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgIGlmIChwYXlsb2FkLl9zdGF0dXMgPT09IFBlbmRpbmcgfHwgcGF5bG9hZC5fc3RhdHVzID09PSBVbmluaXRpYWxpemVkKSB7XG4gICAgICAgIC8vIFRyYW5zaXRpb24gdG8gdGhlIG5leHQgc3RhdGUuXG4gICAgICAgIHZhciByZWplY3RlZCA9IHBheWxvYWQ7XG4gICAgICAgIHJlamVjdGVkLl9zdGF0dXMgPSBSZWplY3RlZDtcbiAgICAgICAgcmVqZWN0ZWQuX3Jlc3VsdCA9IGVycm9yO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHBheWxvYWQuX3N0YXR1cyA9PT0gVW5pbml0aWFsaXplZCkge1xuICAgICAgLy8gSW4gY2FzZSwgd2UncmUgc3RpbGwgdW5pbml0aWFsaXplZCwgdGhlbiB3ZSdyZSB3YWl0aW5nIGZvciB0aGUgdGhlbmFibGVcbiAgICAgIC8vIHRvIHJlc29sdmUuIFNldCBpdCBhcyBwZW5kaW5nIGluIHRoZSBtZWFudGltZS5cbiAgICAgIHZhciBwZW5kaW5nID0gcGF5bG9hZDtcbiAgICAgIHBlbmRpbmcuX3N0YXR1cyA9IFBlbmRpbmc7XG4gICAgICBwZW5kaW5nLl9yZXN1bHQgPSB0aGVuYWJsZTtcbiAgICB9XG4gIH1cblxuICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBSZXNvbHZlZCkge1xuICAgIHZhciBtb2R1bGVPYmplY3QgPSBwYXlsb2FkLl9yZXN1bHQ7XG5cbiAgICB7XG4gICAgICBpZiAobW9kdWxlT2JqZWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3IoJ2xhenk6IEV4cGVjdGVkIHRoZSByZXN1bHQgb2YgYSBkeW5hbWljIGltcCcgKyAnb3J0KCkgY2FsbC4gJyArICdJbnN0ZWFkIHJlY2VpdmVkOiAlc1xcblxcbllvdXIgY29kZSBzaG91bGQgbG9vayBsaWtlOiBcXG4gICcgKyAvLyBCcmVhayB1cCBpbXBvcnRzIHRvIGF2b2lkIGFjY2lkZW50YWxseSBwYXJzaW5nIHRoZW0gYXMgZGVwZW5kZW5jaWVzLlxuICAgICAgICAnY29uc3QgTXlDb21wb25lbnQgPSBsYXp5KCgpID0+IGltcCcgKyBcIm9ydCgnLi9NeUNvbXBvbmVudCcpKVxcblxcblwiICsgJ0RpZCB5b3UgYWNjaWRlbnRhbGx5IHB1dCBjdXJseSBicmFjZXMgYXJvdW5kIHRoZSBpbXBvcnQ/JywgbW9kdWxlT2JqZWN0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAoISgnZGVmYXVsdCcgaW4gbW9kdWxlT2JqZWN0KSkge1xuICAgICAgICBlcnJvcignbGF6eTogRXhwZWN0ZWQgdGhlIHJlc3VsdCBvZiBhIGR5bmFtaWMgaW1wJyArICdvcnQoKSBjYWxsLiAnICsgJ0luc3RlYWQgcmVjZWl2ZWQ6ICVzXFxuXFxuWW91ciBjb2RlIHNob3VsZCBsb29rIGxpa2U6IFxcbiAgJyArIC8vIEJyZWFrIHVwIGltcG9ydHMgdG8gYXZvaWQgYWNjaWRlbnRhbGx5IHBhcnNpbmcgdGhlbSBhcyBkZXBlbmRlbmNpZXMuXG4gICAgICAgICdjb25zdCBNeUNvbXBvbmVudCA9IGxhenkoKCkgPT4gaW1wJyArIFwib3J0KCcuL015Q29tcG9uZW50JykpXCIsIG1vZHVsZU9iamVjdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZHVsZU9iamVjdC5kZWZhdWx0O1xuICB9IGVsc2Uge1xuICAgIHRocm93IHBheWxvYWQuX3Jlc3VsdDtcbiAgfVxufVxuXG5mdW5jdGlvbiBsYXp5KGN0b3IpIHtcbiAgdmFyIHBheWxvYWQgPSB7XG4gICAgLy8gV2UgdXNlIHRoZXNlIGZpZWxkcyB0byBzdG9yZSB0aGUgcmVzdWx0LlxuICAgIF9zdGF0dXM6IFVuaW5pdGlhbGl6ZWQsXG4gICAgX3Jlc3VsdDogY3RvclxuICB9O1xuICB2YXIgbGF6eVR5cGUgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX0xBWllfVFlQRSxcbiAgICBfcGF5bG9hZDogcGF5bG9hZCxcbiAgICBfaW5pdDogbGF6eUluaXRpYWxpemVyXG4gIH07XG5cbiAge1xuICAgIC8vIEluIHByb2R1Y3Rpb24sIHRoaXMgd291bGQganVzdCBzZXQgaXQgb24gdGhlIG9iamVjdC5cbiAgICB2YXIgZGVmYXVsdFByb3BzO1xuICAgIHZhciBwcm9wVHlwZXM7IC8vICRGbG93Rml4TWVcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGxhenlUeXBlLCB7XG4gICAgICBkZWZhdWx0UHJvcHM6IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdFByb3BzO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChuZXdEZWZhdWx0UHJvcHMpIHtcbiAgICAgICAgICBlcnJvcignUmVhY3QubGF6eSguLi4pOiBJdCBpcyBub3Qgc3VwcG9ydGVkIHRvIGFzc2lnbiBgZGVmYXVsdFByb3BzYCB0byAnICsgJ2EgbGF6eSBjb21wb25lbnQgaW1wb3J0LiBFaXRoZXIgc3BlY2lmeSB0aGVtIHdoZXJlIHRoZSBjb21wb25lbnQgJyArICdpcyBkZWZpbmVkLCBvciBjcmVhdGUgYSB3cmFwcGluZyBjb21wb25lbnQgYXJvdW5kIGl0LicpO1xuXG4gICAgICAgICAgZGVmYXVsdFByb3BzID0gbmV3RGVmYXVsdFByb3BzOyAvLyBNYXRjaCBwcm9kdWN0aW9uIGJlaGF2aW9yIG1vcmUgY2xvc2VseTpcbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lXG5cbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobGF6eVR5cGUsICdkZWZhdWx0UHJvcHMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBwcm9wVHlwZXM6IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gcHJvcFR5cGVzO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChuZXdQcm9wVHlwZXMpIHtcbiAgICAgICAgICBlcnJvcignUmVhY3QubGF6eSguLi4pOiBJdCBpcyBub3Qgc3VwcG9ydGVkIHRvIGFzc2lnbiBgcHJvcFR5cGVzYCB0byAnICsgJ2EgbGF6eSBjb21wb25lbnQgaW1wb3J0LiBFaXRoZXIgc3BlY2lmeSB0aGVtIHdoZXJlIHRoZSBjb21wb25lbnQgJyArICdpcyBkZWZpbmVkLCBvciBjcmVhdGUgYSB3cmFwcGluZyBjb21wb25lbnQgYXJvdW5kIGl0LicpO1xuXG4gICAgICAgICAgcHJvcFR5cGVzID0gbmV3UHJvcFR5cGVzOyAvLyBNYXRjaCBwcm9kdWN0aW9uIGJlaGF2aW9yIG1vcmUgY2xvc2VseTpcbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lXG5cbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobGF6eVR5cGUsICdwcm9wVHlwZXMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBsYXp5VHlwZTtcbn1cblxuZnVuY3Rpb24gZm9yd2FyZFJlZihyZW5kZXIpIHtcbiAge1xuICAgIGlmIChyZW5kZXIgIT0gbnVsbCAmJiByZW5kZXIuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSkge1xuICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVxdWlyZXMgYSByZW5kZXIgZnVuY3Rpb24gYnV0IHJlY2VpdmVkIGEgYG1lbW9gICcgKyAnY29tcG9uZW50LiBJbnN0ZWFkIG9mIGZvcndhcmRSZWYobWVtbyguLi4pKSwgdXNlICcgKyAnbWVtbyhmb3J3YXJkUmVmKC4uLikpLicpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlbmRlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVxdWlyZXMgYSByZW5kZXIgZnVuY3Rpb24gYnV0IHdhcyBnaXZlbiAlcy4nLCByZW5kZXIgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgcmVuZGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHJlbmRlci5sZW5ndGggIT09IDAgJiYgcmVuZGVyLmxlbmd0aCAhPT0gMikge1xuICAgICAgICBlcnJvcignZm9yd2FyZFJlZiByZW5kZXIgZnVuY3Rpb25zIGFjY2VwdCBleGFjdGx5IHR3byBwYXJhbWV0ZXJzOiBwcm9wcyBhbmQgcmVmLiAlcycsIHJlbmRlci5sZW5ndGggPT09IDEgPyAnRGlkIHlvdSBmb3JnZXQgdG8gdXNlIHRoZSByZWYgcGFyYW1ldGVyPycgOiAnQW55IGFkZGl0aW9uYWwgcGFyYW1ldGVyIHdpbGwgYmUgdW5kZWZpbmVkLicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZW5kZXIgIT0gbnVsbCkge1xuICAgICAgaWYgKHJlbmRlci5kZWZhdWx0UHJvcHMgIT0gbnVsbCB8fCByZW5kZXIucHJvcFR5cGVzICE9IG51bGwpIHtcbiAgICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVuZGVyIGZ1bmN0aW9ucyBkbyBub3Qgc3VwcG9ydCBwcm9wVHlwZXMgb3IgZGVmYXVsdFByb3BzLiAnICsgJ0RpZCB5b3UgYWNjaWRlbnRhbGx5IHBhc3MgYSBSZWFjdCBjb21wb25lbnQ/Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGVsZW1lbnRUeXBlID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFLFxuICAgIHJlbmRlcjogcmVuZGVyXG4gIH07XG5cbiAge1xuICAgIHZhciBvd25OYW1lO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50VHlwZSwgJ2Rpc3BsYXlOYW1lJywge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG93bk5hbWU7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBvd25OYW1lID0gbmFtZTsgLy8gVGhlIGlubmVyIGNvbXBvbmVudCBzaG91bGRuJ3QgaW5oZXJpdCB0aGlzIGRpc3BsYXkgbmFtZSBpbiBtb3N0IGNhc2VzLFxuICAgICAgICAvLyBiZWNhdXNlIHRoZSBjb21wb25lbnQgbWF5IGJlIHVzZWQgZWxzZXdoZXJlLlxuICAgICAgICAvLyBCdXQgaXQncyBuaWNlIGZvciBhbm9ueW1vdXMgZnVuY3Rpb25zIHRvIGluaGVyaXQgdGhlIG5hbWUsXG4gICAgICAgIC8vIHNvIHRoYXQgb3VyIGNvbXBvbmVudC1zdGFjayBnZW5lcmF0aW9uIGxvZ2ljIHdpbGwgZGlzcGxheSB0aGVpciBmcmFtZXMuXG4gICAgICAgIC8vIEFuIGFub255bW91cyBmdW5jdGlvbiBnZW5lcmFsbHkgc3VnZ2VzdHMgYSBwYXR0ZXJuIGxpa2U6XG4gICAgICAgIC8vICAgUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIHJlZikgPT4gey4uLn0pO1xuICAgICAgICAvLyBUaGlzIGtpbmQgb2YgaW5uZXIgZnVuY3Rpb24gaXMgbm90IHVzZWQgZWxzZXdoZXJlIHNvIHRoZSBzaWRlIGVmZmVjdCBpcyBva2F5LlxuXG4gICAgICAgIGlmICghcmVuZGVyLm5hbWUgJiYgIXJlbmRlci5kaXNwbGF5TmFtZSkge1xuICAgICAgICAgIHJlbmRlci5kaXNwbGF5TmFtZSA9IG5hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50VHlwZTtcbn1cblxudmFyIFJFQUNUX01PRFVMRV9SRUZFUkVOQ0U7XG5cbntcbiAgUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm1vZHVsZS5yZWZlcmVuY2UnKTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIE5vdGU6IHR5cGVvZiBtaWdodCBiZSBvdGhlciB0aGFuICdzeW1ib2wnIG9yICdudW1iZXInIChlLmcuIGlmIGl0J3MgYSBwb2x5ZmlsbCkuXG5cblxuICBpZiAodHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFIHx8IGVuYWJsZURlYnVnVHJhY2luZyAgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCBlbmFibGVMZWdhY3lIaWRkZW4gIHx8IHR5cGUgPT09IFJFQUNUX09GRlNDUkVFTl9UWVBFIHx8IGVuYWJsZVNjb3BlQVBJICB8fCBlbmFibGVDYWNoZUVsZW1lbnQgIHx8IGVuYWJsZVRyYW5zaXRpb25UcmFjaW5nICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCAvLyBUaGlzIG5lZWRzIHRvIGluY2x1ZGUgYWxsIHBvc3NpYmxlIG1vZHVsZSByZWZlcmVuY2Ugb2JqZWN0XG4gICAgLy8gdHlwZXMgc3VwcG9ydGVkIGJ5IGFueSBGbGlnaHQgY29uZmlndXJhdGlvbiBhbnl3aGVyZSBzaW5jZVxuICAgIC8vIHdlIGRvbid0IGtub3cgd2hpY2ggRmxpZ2h0IGJ1aWxkIHRoaXMgd2lsbCBlbmQgdXAgYmVpbmcgdXNlZFxuICAgIC8vIHdpdGguXG4gICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRSB8fCB0eXBlLmdldE1vZHVsZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbWVtbyh0eXBlLCBjb21wYXJlKSB7XG4gIHtcbiAgICBpZiAoIWlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSkge1xuICAgICAgZXJyb3IoJ21lbW86IFRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgY29tcG9uZW50LiBJbnN0ZWFkICcgKyAncmVjZWl2ZWQ6ICVzJywgdHlwZSA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiB0eXBlKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZWxlbWVudFR5cGUgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX01FTU9fVFlQRSxcbiAgICB0eXBlOiB0eXBlLFxuICAgIGNvbXBhcmU6IGNvbXBhcmUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb21wYXJlXG4gIH07XG5cbiAge1xuICAgIHZhciBvd25OYW1lO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50VHlwZSwgJ2Rpc3BsYXlOYW1lJywge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG93bk5hbWU7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBvd25OYW1lID0gbmFtZTsgLy8gVGhlIGlubmVyIGNvbXBvbmVudCBzaG91bGRuJ3QgaW5oZXJpdCB0aGlzIGRpc3BsYXkgbmFtZSBpbiBtb3N0IGNhc2VzLFxuICAgICAgICAvLyBiZWNhdXNlIHRoZSBjb21wb25lbnQgbWF5IGJlIHVzZWQgZWxzZXdoZXJlLlxuICAgICAgICAvLyBCdXQgaXQncyBuaWNlIGZvciBhbm9ueW1vdXMgZnVuY3Rpb25zIHRvIGluaGVyaXQgdGhlIG5hbWUsXG4gICAgICAgIC8vIHNvIHRoYXQgb3VyIGNvbXBvbmVudC1zdGFjayBnZW5lcmF0aW9uIGxvZ2ljIHdpbGwgZGlzcGxheSB0aGVpciBmcmFtZXMuXG4gICAgICAgIC8vIEFuIGFub255bW91cyBmdW5jdGlvbiBnZW5lcmFsbHkgc3VnZ2VzdHMgYSBwYXR0ZXJuIGxpa2U6XG4gICAgICAgIC8vICAgUmVhY3QubWVtbygocHJvcHMpID0+IHsuLi59KTtcbiAgICAgICAgLy8gVGhpcyBraW5kIG9mIGlubmVyIGZ1bmN0aW9uIGlzIG5vdCB1c2VkIGVsc2V3aGVyZSBzbyB0aGUgc2lkZSBlZmZlY3QgaXMgb2theS5cblxuICAgICAgICBpZiAoIXR5cGUubmFtZSAmJiAhdHlwZS5kaXNwbGF5TmFtZSkge1xuICAgICAgICAgIHR5cGUuZGlzcGxheU5hbWUgPSBuYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudFR5cGU7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVEaXNwYXRjaGVyKCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudDtcblxuICB7XG4gICAgaWYgKGRpc3BhdGNoZXIgPT09IG51bGwpIHtcbiAgICAgIGVycm9yKCdJbnZhbGlkIGhvb2sgY2FsbC4gSG9va3MgY2FuIG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uIGNvbXBvbmVudC4gVGhpcyBjb3VsZCBoYXBwZW4gZm9yJyArICcgb25lIG9mIHRoZSBmb2xsb3dpbmcgcmVhc29uczpcXG4nICsgJzEuIFlvdSBtaWdodCBoYXZlIG1pc21hdGNoaW5nIHZlcnNpb25zIG9mIFJlYWN0IGFuZCB0aGUgcmVuZGVyZXIgKHN1Y2ggYXMgUmVhY3QgRE9NKVxcbicgKyAnMi4gWW91IG1pZ2h0IGJlIGJyZWFraW5nIHRoZSBSdWxlcyBvZiBIb29rc1xcbicgKyAnMy4gWW91IG1pZ2h0IGhhdmUgbW9yZSB0aGFuIG9uZSBjb3B5IG9mIFJlYWN0IGluIHRoZSBzYW1lIGFwcFxcbicgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9pbnZhbGlkLWhvb2stY2FsbCBmb3IgdGlwcyBhYm91dCBob3cgdG8gZGVidWcgYW5kIGZpeCB0aGlzIHByb2JsZW0uJyk7XG4gICAgfVxuICB9IC8vIFdpbGwgcmVzdWx0IGluIGEgbnVsbCBhY2Nlc3MgZXJyb3IgaWYgYWNjZXNzZWQgb3V0c2lkZSByZW5kZXIgcGhhc2UuIFdlXG4gIC8vIGludGVudGlvbmFsbHkgZG9uJ3QgdGhyb3cgb3VyIG93biBlcnJvciBiZWNhdXNlIHRoaXMgaXMgaW4gYSBob3QgcGF0aC5cbiAgLy8gQWxzbyBoZWxwcyBlbnN1cmUgdGhpcyBpcyBpbmxpbmVkLlxuXG5cbiAgcmV0dXJuIGRpc3BhdGNoZXI7XG59XG5mdW5jdGlvbiB1c2VDb250ZXh0KENvbnRleHQpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuXG4gIHtcbiAgICAvLyBUT0RPOiBhZGQgYSBtb3JlIGdlbmVyaWMgd2FybmluZyBmb3IgaW52YWxpZCB2YWx1ZXMuXG4gICAgaWYgKENvbnRleHQuX2NvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIHJlYWxDb250ZXh0ID0gQ29udGV4dC5fY29udGV4dDsgLy8gRG9uJ3QgZGVkdXBsaWNhdGUgYmVjYXVzZSB0aGlzIGxlZ2l0aW1hdGVseSBjYXVzZXMgYnVnc1xuICAgICAgLy8gYW5kIG5vYm9keSBzaG91bGQgYmUgdXNpbmcgdGhpcyBpbiBleGlzdGluZyBjb2RlLlxuXG4gICAgICBpZiAocmVhbENvbnRleHQuQ29uc3VtZXIgPT09IENvbnRleHQpIHtcbiAgICAgICAgZXJyb3IoJ0NhbGxpbmcgdXNlQ29udGV4dChDb250ZXh0LkNvbnN1bWVyKSBpcyBub3Qgc3VwcG9ydGVkLCBtYXkgY2F1c2UgYnVncywgYW5kIHdpbGwgYmUgJyArICdyZW1vdmVkIGluIGEgZnV0dXJlIG1ham9yIHJlbGVhc2UuIERpZCB5b3UgbWVhbiB0byBjYWxsIHVzZUNvbnRleHQoQ29udGV4dCkgaW5zdGVhZD8nKTtcbiAgICAgIH0gZWxzZSBpZiAocmVhbENvbnRleHQuUHJvdmlkZXIgPT09IENvbnRleHQpIHtcbiAgICAgICAgZXJyb3IoJ0NhbGxpbmcgdXNlQ29udGV4dChDb250ZXh0LlByb3ZpZGVyKSBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBjYWxsIHVzZUNvbnRleHQoQ29udGV4dCkgaW5zdGVhZD8nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGlzcGF0Y2hlci51c2VDb250ZXh0KENvbnRleHQpO1xufVxuZnVuY3Rpb24gdXNlU3RhdGUoaW5pdGlhbFN0YXRlKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlU3RhdGUoaW5pdGlhbFN0YXRlKTtcbn1cbmZ1bmN0aW9uIHVzZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG59XG5mdW5jdGlvbiB1c2VSZWYoaW5pdGlhbFZhbHVlKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlUmVmKGluaXRpYWxWYWx1ZSk7XG59XG5mdW5jdGlvbiB1c2VFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VDYWxsYmFjayhjYWxsYmFjaywgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZU1lbW8oY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlTWVtbyhjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlRGVidWdWYWx1ZSh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAge1xuICAgIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgICByZXR1cm4gZGlzcGF0Y2hlci51c2VEZWJ1Z1ZhbHVlKHZhbHVlLCBmb3JtYXR0ZXJGbik7XG4gIH1cbn1cbmZ1bmN0aW9uIHVzZVRyYW5zaXRpb24oKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlVHJhbnNpdGlvbigpO1xufVxuZnVuY3Rpb24gdXNlRGVmZXJyZWRWYWx1ZSh2YWx1ZSkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZURlZmVycmVkVmFsdWUodmFsdWUpO1xufVxuZnVuY3Rpb24gdXNlSWQoKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlSWQoKTtcbn1cbmZ1bmN0aW9uIHVzZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpO1xufVxuXG4vLyBIZWxwZXJzIHRvIHBhdGNoIGNvbnNvbGUubG9ncyB0byBhdm9pZCBsb2dnaW5nIGR1cmluZyBzaWRlLWVmZmVjdCBmcmVlXG4vLyByZXBsYXlpbmcgb24gcmVuZGVyIGZ1bmN0aW9uLiBUaGlzIGN1cnJlbnRseSBvbmx5IHBhdGNoZXMgdGhlIG9iamVjdFxuLy8gbGF6aWx5IHdoaWNoIHdvbid0IGNvdmVyIGlmIHRoZSBsb2cgZnVuY3Rpb24gd2FzIGV4dHJhY3RlZCBlYWdlcmx5LlxuLy8gV2UgY291bGQgYWxzbyBlYWdlcmx5IHBhdGNoIHRoZSBtZXRob2QuXG52YXIgZGlzYWJsZWREZXB0aCA9IDA7XG52YXIgcHJldkxvZztcbnZhciBwcmV2SW5mbztcbnZhciBwcmV2V2FybjtcbnZhciBwcmV2RXJyb3I7XG52YXIgcHJldkdyb3VwO1xudmFyIHByZXZHcm91cENvbGxhcHNlZDtcbnZhciBwcmV2R3JvdXBFbmQ7XG5cbmZ1bmN0aW9uIGRpc2FibGVkTG9nKCkge31cblxuZGlzYWJsZWRMb2cuX19yZWFjdERpc2FibGVkTG9nID0gdHJ1ZTtcbmZ1bmN0aW9uIGRpc2FibGVMb2dzKCkge1xuICB7XG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgcHJldkxvZyA9IGNvbnNvbGUubG9nO1xuICAgICAgcHJldkluZm8gPSBjb25zb2xlLmluZm87XG4gICAgICBwcmV2V2FybiA9IGNvbnNvbGUud2FybjtcbiAgICAgIHByZXZFcnJvciA9IGNvbnNvbGUuZXJyb3I7XG4gICAgICBwcmV2R3JvdXAgPSBjb25zb2xlLmdyb3VwO1xuICAgICAgcHJldkdyb3VwQ29sbGFwc2VkID0gY29uc29sZS5ncm91cENvbGxhcHNlZDtcbiAgICAgIHByZXZHcm91cEVuZCA9IGNvbnNvbGUuZ3JvdXBFbmQ7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTkwOTlcblxuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBkaXNhYmxlZExvZyxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH07IC8vICRGbG93Rml4TWUgRmxvdyB0aGlua3MgY29uc29sZSBpcyBpbW11dGFibGUuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgaW5mbzogcHJvcHMsXG4gICAgICAgIGxvZzogcHJvcHMsXG4gICAgICAgIHdhcm46IHByb3BzLFxuICAgICAgICBlcnJvcjogcHJvcHMsXG4gICAgICAgIGdyb3VwOiBwcm9wcyxcbiAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IHByb3BzLFxuICAgICAgICBncm91cEVuZDogcHJvcHNcbiAgICAgIH0pO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICB9XG5cbiAgICBkaXNhYmxlZERlcHRoKys7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlZW5hYmxlTG9ncygpIHtcbiAge1xuICAgIGRpc2FibGVkRGVwdGgtLTtcblxuICAgIGlmIChkaXNhYmxlZERlcHRoID09PSAwKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBsb2c6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkxvZ1xuICAgICAgICB9KSxcbiAgICAgICAgaW5mbzogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2SW5mb1xuICAgICAgICB9KSxcbiAgICAgICAgd2FybjogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2V2FyblxuICAgICAgICB9KSxcbiAgICAgICAgZXJyb3I6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkVycm9yXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwQ29sbGFwc2VkOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cENvbGxhcHNlZFxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXBFbmQ6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwRW5kXG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgfVxuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPCAwKSB7XG4gICAgICBlcnJvcignZGlzYWJsZWREZXB0aCBmZWxsIGJlbG93IHplcm8uICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyO1xudmFyIHByZWZpeDtcbmZ1bmN0aW9uIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUsIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgaWYgKHByZWZpeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBFeHRyYWN0IHRoZSBWTSBzcGVjaWZpYyBwcmVmaXggdXNlZCBieSBlYWNoIGxpbmUuXG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICB2YXIgbWF0Y2ggPSB4LnN0YWNrLnRyaW0oKS5tYXRjaCgvXFxuKCAqKGF0ICk/KS8pO1xuICAgICAgICBwcmVmaXggPSBtYXRjaCAmJiBtYXRjaFsxXSB8fCAnJztcbiAgICAgIH1cbiAgICB9IC8vIFdlIHVzZSB0aGUgcHJlZml4IHRvIGVuc3VyZSBvdXIgc3RhY2tzIGxpbmUgdXAgd2l0aCBuYXRpdmUgc3RhY2sgZnJhbWVzLlxuXG5cbiAgICByZXR1cm4gJ1xcbicgKyBwcmVmaXggKyBuYW1lO1xuICB9XG59XG52YXIgcmVlbnRyeSA9IGZhbHNlO1xudmFyIGNvbXBvbmVudEZyYW1lQ2FjaGU7XG5cbntcbiAgdmFyIFBvc3NpYmx5V2Vha01hcCA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nID8gV2Vha01hcCA6IE1hcDtcbiAgY29tcG9uZW50RnJhbWVDYWNoZSA9IG5ldyBQb3NzaWJseVdlYWtNYXAoKTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShmbiwgY29uc3RydWN0KSB7XG4gIC8vIElmIHNvbWV0aGluZyBhc2tlZCBmb3IgYSBzdGFjayBpbnNpZGUgYSBmYWtlIHJlbmRlciwgaXQgc2hvdWxkIGdldCBpZ25vcmVkLlxuICBpZiAoICFmbiB8fCByZWVudHJ5KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAge1xuICAgIHZhciBmcmFtZSA9IGNvbXBvbmVudEZyYW1lQ2FjaGUuZ2V0KGZuKTtcblxuICAgIGlmIChmcmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZnJhbWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbnRyb2w7XG4gIHJlZW50cnkgPSB0cnVlO1xuICB2YXIgcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZSA9IEVycm9yLnByZXBhcmVTdGFja1RyYWNlOyAvLyAkRmxvd0ZpeE1lIEl0IGRvZXMgYWNjZXB0IHVuZGVmaW5lZC5cblxuICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHVuZGVmaW5lZDtcbiAgdmFyIHByZXZpb3VzRGlzcGF0Y2hlcjtcblxuICB7XG4gICAgcHJldmlvdXNEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7IC8vIFNldCB0aGUgZGlzcGF0Y2hlciBpbiBERVYgYmVjYXVzZSB0aGlzIG1pZ2h0IGJlIGNhbGwgaW4gdGhlIHJlbmRlciBmdW5jdGlvblxuICAgIC8vIGZvciB3YXJuaW5ncy5cblxuICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gbnVsbDtcbiAgICBkaXNhYmxlTG9ncygpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBUaGlzIHNob3VsZCB0aHJvdy5cbiAgICBpZiAoY29uc3RydWN0KSB7XG4gICAgICAvLyBTb21ldGhpbmcgc2hvdWxkIGJlIHNldHRpbmcgdGhlIHByb3BzIGluIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgIHZhciBGYWtlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfTsgLy8gJEZsb3dGaXhNZVxuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGYWtlLnByb3RvdHlwZSwgJ3Byb3BzJywge1xuICAgICAgICBzZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyBXZSB1c2UgYSB0aHJvd2luZyBzZXR0ZXIgaW5zdGVhZCBvZiBmcm96ZW4gb3Igbm9uLXdyaXRhYmxlIHByb3BzXG4gICAgICAgICAgLy8gYmVjYXVzZSB0aGF0IHdvbid0IHRocm93IGluIGEgbm9uLXN0cmljdCBtb2RlIGZ1bmN0aW9uLlxuICAgICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnICYmIFJlZmxlY3QuY29uc3RydWN0KSB7XG4gICAgICAgIC8vIFdlIGNvbnN0cnVjdCBhIGRpZmZlcmVudCBjb250cm9sIGZvciB0aGlzIGNhc2UgdG8gaW5jbHVkZSBhbnkgZXh0cmFcbiAgICAgICAgLy8gZnJhbWVzIGFkZGVkIGJ5IHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChGYWtlLCBbXSk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgfVxuXG4gICAgICAgIFJlZmxlY3QuY29uc3RydWN0KGZuLCBbXSwgRmFrZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIEZha2UuY2FsbCgpO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICAgIH1cblxuICAgICAgICBmbi5jYWxsKEZha2UucHJvdG90eXBlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICB9XG5cbiAgICAgIGZuKCk7XG4gICAgfVxuICB9IGNhdGNoIChzYW1wbGUpIHtcbiAgICAvLyBUaGlzIGlzIGlubGluZWQgbWFudWFsbHkgYmVjYXVzZSBjbG9zdXJlIGRvZXNuJ3QgZG8gaXQgZm9yIHVzLlxuICAgIGlmIChzYW1wbGUgJiYgY29udHJvbCAmJiB0eXBlb2Ygc2FtcGxlLnN0YWNrID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gVGhpcyBleHRyYWN0cyB0aGUgZmlyc3QgZnJhbWUgZnJvbSB0aGUgc2FtcGxlIHRoYXQgaXNuJ3QgYWxzbyBpbiB0aGUgY29udHJvbC5cbiAgICAgIC8vIFNraXBwaW5nIG9uZSBmcmFtZSB0aGF0IHdlIGFzc3VtZSBpcyB0aGUgZnJhbWUgdGhhdCBjYWxscyB0aGUgdHdvLlxuICAgICAgdmFyIHNhbXBsZUxpbmVzID0gc2FtcGxlLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBjb250cm9sTGluZXMgPSBjb250cm9sLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBzID0gc2FtcGxlTGluZXMubGVuZ3RoIC0gMTtcbiAgICAgIHZhciBjID0gY29udHJvbExpbmVzLmxlbmd0aCAtIDE7XG5cbiAgICAgIHdoaWxlIChzID49IDEgJiYgYyA+PSAwICYmIHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgLy8gV2UgZXhwZWN0IGF0IGxlYXN0IG9uZSBzdGFjayBmcmFtZSB0byBiZSBzaGFyZWQuXG4gICAgICAgIC8vIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgdGhlIHJvb3QgbW9zdCBvbmUuIEhvd2V2ZXIsIHN0YWNrIGZyYW1lcyBtYXkgYmVcbiAgICAgICAgLy8gY3V0IG9mZiBkdWUgdG8gbWF4aW11bSBzdGFjayBsaW1pdHMuIEluIHRoaXMgY2FzZSwgb25lIG1heWJlIGN1dCBvZmZcbiAgICAgICAgLy8gZWFybGllciB0aGFuIHRoZSBvdGhlci4gV2UgYXNzdW1lIHRoYXQgdGhlIHNhbXBsZSBpcyBsb25nZXIgb3IgdGhlIHNhbWVcbiAgICAgICAgLy8gYW5kIHRoZXJlIGZvciBjdXQgb2ZmIGVhcmxpZXIuIFNvIHdlIHNob3VsZCBmaW5kIHRoZSByb290IG1vc3QgZnJhbWUgaW5cbiAgICAgICAgLy8gdGhlIHNhbXBsZSBzb21ld2hlcmUgaW4gdGhlIGNvbnRyb2wuXG4gICAgICAgIGMtLTtcbiAgICAgIH1cblxuICAgICAgZm9yICg7IHMgPj0gMSAmJiBjID49IDA7IHMtLSwgYy0tKSB7XG4gICAgICAgIC8vIE5leHQgd2UgZmluZCB0aGUgZmlyc3Qgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgd2hpY2ggc2hvdWxkIGJlIHRoZVxuICAgICAgICAvLyBmcmFtZSB0aGF0IGNhbGxlZCBvdXIgc2FtcGxlIGZ1bmN0aW9uIGFuZCB0aGUgY29udHJvbC5cbiAgICAgICAgaWYgKHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAvLyBJbiBWOCwgdGhlIGZpcnN0IGxpbmUgaXMgZGVzY3JpYmluZyB0aGUgbWVzc2FnZSBidXQgb3RoZXIgVk1zIGRvbid0LlxuICAgICAgICAgIC8vIElmIHdlJ3JlIGFib3V0IHRvIHJldHVybiB0aGUgZmlyc3QgbGluZSwgYW5kIHRoZSBjb250cm9sIGlzIGFsc28gb24gdGhlIHNhbWVcbiAgICAgICAgICAvLyBsaW5lLCB0aGF0J3MgYSBwcmV0dHkgZ29vZCBpbmRpY2F0b3IgdGhhdCBvdXIgc2FtcGxlIHRocmV3IGF0IHNhbWUgbGluZSBhc1xuICAgICAgICAgIC8vIHRoZSBjb250cm9sLiBJLmUuIGJlZm9yZSB3ZSBlbnRlcmVkIHRoZSBzYW1wbGUgZnJhbWUuIFNvIHdlIGlnbm9yZSB0aGlzIHJlc3VsdC5cbiAgICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgeW91IHBhc3NlZCBhIGNsYXNzIHRvIGZ1bmN0aW9uIGNvbXBvbmVudCwgb3Igbm9uLWZ1bmN0aW9uLlxuICAgICAgICAgIGlmIChzICE9PSAxIHx8IGMgIT09IDEpIHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgcy0tO1xuICAgICAgICAgICAgICBjLS07IC8vIFdlIG1heSBzdGlsbCBoYXZlIHNpbWlsYXIgaW50ZXJtZWRpYXRlIGZyYW1lcyBmcm9tIHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgICAgICAgLy8gVGhlIG5leHQgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgc2hvdWxkIGJlIG91ciBtYXRjaCB0aG91Z2guXG5cbiAgICAgICAgICAgICAgaWYgKGMgPCAwIHx8IHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAgICAgICAvLyBWOCBhZGRzIGEgXCJuZXdcIiBwcmVmaXggZm9yIG5hdGl2ZSBjbGFzc2VzLiBMZXQncyByZW1vdmUgaXQgdG8gbWFrZSBpdCBwcmV0dGllci5cbiAgICAgICAgICAgICAgICB2YXIgX2ZyYW1lID0gJ1xcbicgKyBzYW1wbGVMaW5lc1tzXS5yZXBsYWNlKCcgYXQgbmV3ICcsICcgYXQgJyk7IC8vIElmIG91ciBjb21wb25lbnQgZnJhbWUgaXMgbGFiZWxlZCBcIjxhbm9ueW1vdXM+XCJcbiAgICAgICAgICAgICAgICAvLyBidXQgd2UgaGF2ZSBhIHVzZXItcHJvdmlkZWQgXCJkaXNwbGF5TmFtZVwiXG4gICAgICAgICAgICAgICAgLy8gc3BsaWNlIGl0IGluIHRvIG1ha2UgdGhlIHN0YWNrIG1vcmUgcmVhZGFibGUuXG5cblxuICAgICAgICAgICAgICAgIGlmIChmbi5kaXNwbGF5TmFtZSAmJiBfZnJhbWUuaW5jbHVkZXMoJzxhbm9ueW1vdXM+JykpIHtcbiAgICAgICAgICAgICAgICAgIF9mcmFtZSA9IF9mcmFtZS5yZXBsYWNlKCc8YW5vbnltb3VzPicsIGZuLmRpc3BsYXlOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEZyYW1lQ2FjaGUuc2V0KGZuLCBfZnJhbWUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gLy8gUmV0dXJuIHRoZSBsaW5lIHdlIGZvdW5kLlxuXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gX2ZyYW1lO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IHdoaWxlIChzID49IDEgJiYgYyA+PSAwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICByZWVudHJ5ID0gZmFsc2U7XG5cbiAgICB7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZpb3VzRGlzcGF0Y2hlcjtcbiAgICAgIHJlZW5hYmxlTG9ncygpO1xuICAgIH1cblxuICAgIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZTtcbiAgfSAvLyBGYWxsYmFjayB0byBqdXN0IHVzaW5nIHRoZSBuYW1lIGlmIHdlIGNvdWxkbid0IG1ha2UgaXQgdGhyb3cuXG5cblxuICB2YXIgbmFtZSA9IGZuID8gZm4uZGlzcGxheU5hbWUgfHwgZm4ubmFtZSA6ICcnO1xuICB2YXIgc3ludGhldGljRnJhbWUgPSBuYW1lID8gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSkgOiAnJztcblxuICB7XG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIHN5bnRoZXRpY0ZyYW1lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3ludGhldGljRnJhbWU7XG59XG5mdW5jdGlvbiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZm4sIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGZhbHNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QoQ29tcG9uZW50KSB7XG4gIHZhciBwcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICByZXR1cm4gISEocHJvdG90eXBlICYmIHByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUsIHNvdXJjZSwgb3duZXJGbikge1xuXG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB7XG4gICAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZSh0eXBlLCBzaG91bGRDb25zdHJ1Y3QodHlwZSkpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUodHlwZSk7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlJyk7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2VMaXN0Jyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUodHlwZS5yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgLy8gTWVtbyBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLnR5cGUsIHNvdXJjZSwgb3duZXJGbik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSB0eXBlO1xuICAgICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gTGF6eSBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgICAgIHJldHVybiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoaW5pdChwYXlsb2FkKSwgc291cmNlLCBvd25lckZuKTtcbiAgICAgICAgICB9IGNhdGNoICh4KSB7fVxuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG52YXIgbG9nZ2VkVHlwZUZhaWx1cmVzID0ge307XG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcblxuZnVuY3Rpb24gc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCkge1xuICB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSwgZWxlbWVudC5fc291cmNlLCBvd25lciA/IG93bmVyLnR5cGUgOiBudWxsKTtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMS5zZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja1Byb3BUeXBlcyh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24sIGNvbXBvbmVudE5hbWUsIGVsZW1lbnQpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWUgVGhpcyBpcyBva2F5IGJ1dCBGbG93IGRvZXNuJ3Qga25vdyBpdC5cbiAgICB2YXIgaGFzID0gRnVuY3Rpb24uY2FsbC5iaW5kKGhhc093blByb3BlcnR5KTtcblxuICAgIGZvciAodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHtcbiAgICAgIGlmIChoYXModHlwZVNwZWNzLCB0eXBlU3BlY05hbWUpKSB7XG4gICAgICAgIHZhciBlcnJvciQxID0gdm9pZCAwOyAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuXG4gICAgICAgIC8vIEFmdGVyIHRoZXNlIGhhdmUgYmVlbiBjbGVhbmVkIHVwLCB3ZSdsbCBsZXQgdGhlbSB0aHJvdy5cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhbiBpbnZhcmlhbnQgdGhhdCBnZXRzIGNhdWdodC4gSXQncyB0aGUgc2FtZVxuICAgICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS5cbiAgICAgICAgICBpZiAodHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgICAgICAgdmFyIGVyciA9IEVycm9yKChjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycpICsgJzogJyArIGxvY2F0aW9uICsgJyB0eXBlIGAnICsgdHlwZVNwZWNOYW1lICsgJ2AgaXMgaW52YWxpZDsgJyArICdpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UsIGJ1dCByZWNlaXZlZCBgJyArIHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSArICdgLicgKyAnVGhpcyBvZnRlbiBoYXBwZW5zIGJlY2F1c2Ugb2YgdHlwb3Mgc3VjaCBhcyBgUHJvcFR5cGVzLmZ1bmN0aW9uYCBpbnN0ZWFkIG9mIGBQcm9wVHlwZXMuZnVuY2AuJyk7XG4gICAgICAgICAgICBlcnIubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlcnJvciQxID0gdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0odmFsdWVzLCB0eXBlU3BlY05hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBudWxsLCAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnKTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICBlcnJvciQxID0gZXg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IkMSAmJiAhKGVycm9yJDEgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgIGVycm9yKCclczogdHlwZSBzcGVjaWZpY2F0aW9uIG9mICVzJyArICcgYCVzYCBpcyBpbnZhbGlkOyB0aGUgdHlwZSBjaGVja2VyICcgKyAnZnVuY3Rpb24gbXVzdCByZXR1cm4gYG51bGxgIG9yIGFuIGBFcnJvcmAgYnV0IHJldHVybmVkIGEgJXMuICcgKyAnWW91IG1heSBoYXZlIGZvcmdvdHRlbiB0byBwYXNzIGFuIGFyZ3VtZW50IHRvIHRoZSB0eXBlIGNoZWNrZXIgJyArICdjcmVhdG9yIChhcnJheU9mLCBpbnN0YW5jZU9mLCBvYmplY3RPZiwgb25lT2YsIG9uZU9mVHlwZSwgYW5kICcgKyAnc2hhcGUgYWxsIHJlcXVpcmUgYW4gYXJndW1lbnQpLicsIGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJywgbG9jYXRpb24sIHR5cGVTcGVjTmFtZSwgdHlwZW9mIGVycm9yJDEpO1xuXG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IkMSBpbnN0YW5jZW9mIEVycm9yICYmICEoZXJyb3IkMS5tZXNzYWdlIGluIGxvZ2dlZFR5cGVGYWlsdXJlcykpIHtcbiAgICAgICAgICAvLyBPbmx5IG1vbml0b3IgdGhpcyBmYWlsdXJlIG9uY2UgYmVjYXVzZSB0aGVyZSB0ZW5kcyB0byBiZSBhIGxvdCBvZiB0aGVcbiAgICAgICAgICAvLyBzYW1lIGVycm9yLlxuICAgICAgICAgIGxvZ2dlZFR5cGVGYWlsdXJlc1tlcnJvciQxLm1lc3NhZ2VdID0gdHJ1ZTtcbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgIGVycm9yKCdGYWlsZWQgJXMgdHlwZTogJXMnLCBsb2NhdGlvbiwgZXJyb3IkMS5tZXNzYWdlKTtcblxuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZWxlbWVudCkge1xuICB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSwgZWxlbWVudC5fc291cmNlLCBvd25lciA/IG93bmVyLnR5cGUgOiBudWxsKTtcbiAgICAgIHNldEV4dHJhU3RhY2tGcmFtZShzdGFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldEV4dHJhU3RhY2tGcmFtZShudWxsKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIHByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duO1xuXG57XG4gIHByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpIHtcbiAgaWYgKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQpIHtcbiAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnR5cGUpO1xuXG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIHJldHVybiAnXFxuXFxuQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBuYW1lICsgJ2AuJztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtKHNvdXJjZSkge1xuICBpZiAoc291cmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgZmlsZU5hbWUgPSBzb3VyY2UuZmlsZU5hbWUucmVwbGFjZSgvXi4qW1xcXFxcXC9dLywgJycpO1xuICAgIHZhciBsaW5lTnVtYmVyID0gc291cmNlLmxpbmVOdW1iZXI7XG4gICAgcmV0dXJuICdcXG5cXG5DaGVjayB5b3VyIGNvZGUgYXQgJyArIGZpbGVOYW1lICsgJzonICsgbGluZU51bWJlciArICcuJztcbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gZ2V0U291cmNlSW5mb0Vycm9yQWRkZW5kdW1Gb3JQcm9wcyhlbGVtZW50UHJvcHMpIHtcbiAgaWYgKGVsZW1lbnRQcm9wcyAhPT0gbnVsbCAmJiBlbGVtZW50UHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bShlbGVtZW50UHJvcHMuX19zb3VyY2UpO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuLyoqXG4gKiBXYXJuIGlmIHRoZXJlJ3Mgbm8ga2V5IGV4cGxpY2l0bHkgc2V0IG9uIGR5bmFtaWMgYXJyYXlzIG9mIGNoaWxkcmVuIG9yXG4gKiBvYmplY3Qga2V5cyBhcmUgbm90IHZhbGlkLiBUaGlzIGFsbG93cyB1cyB0byBrZWVwIHRyYWNrIG9mIGNoaWxkcmVuIGJldHdlZW5cbiAqIHVwZGF0ZXMuXG4gKi9cblxuXG52YXIgb3duZXJIYXNLZXlVc2VXYXJuaW5nID0ge307XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSkge1xuICB2YXIgaW5mbyA9IGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpO1xuXG4gIGlmICghaW5mbykge1xuICAgIHZhciBwYXJlbnROYW1lID0gdHlwZW9mIHBhcmVudFR5cGUgPT09ICdzdHJpbmcnID8gcGFyZW50VHlwZSA6IHBhcmVudFR5cGUuZGlzcGxheU5hbWUgfHwgcGFyZW50VHlwZS5uYW1lO1xuXG4gICAgaWYgKHBhcmVudE5hbWUpIHtcbiAgICAgIGluZm8gPSBcIlxcblxcbkNoZWNrIHRoZSB0b3AtbGV2ZWwgcmVuZGVyIGNhbGwgdXNpbmcgPFwiICsgcGFyZW50TmFtZSArIFwiPi5cIjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaW5mbztcbn1cbi8qKlxuICogV2FybiBpZiB0aGUgZWxlbWVudCBkb2Vzbid0IGhhdmUgYW4gZXhwbGljaXQga2V5IGFzc2lnbmVkIHRvIGl0LlxuICogVGhpcyBlbGVtZW50IGlzIGluIGFuIGFycmF5LiBUaGUgYXJyYXkgY291bGQgZ3JvdyBhbmQgc2hyaW5rIG9yIGJlXG4gKiByZW9yZGVyZWQuIEFsbCBjaGlsZHJlbiB0aGF0IGhhdmVuJ3QgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBhcmUgcmVxdWlyZWQgdG9cbiAqIGhhdmUgYSBcImtleVwiIHByb3BlcnR5IGFzc2lnbmVkIHRvIGl0LiBFcnJvciBzdGF0dXNlcyBhcmUgY2FjaGVkIHNvIGEgd2FybmluZ1xuICogd2lsbCBvbmx5IGJlIHNob3duIG9uY2UuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudCBFbGVtZW50IHRoYXQgcmVxdWlyZXMgYSBrZXkuXG4gKiBAcGFyYW0geyp9IHBhcmVudFR5cGUgZWxlbWVudCdzIHBhcmVudCdzIHR5cGUuXG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZUV4cGxpY2l0S2V5KGVsZW1lbnQsIHBhcmVudFR5cGUpIHtcbiAgaWYgKCFlbGVtZW50Ll9zdG9yZSB8fCBlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgfHwgZWxlbWVudC5rZXkgIT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG4gIHZhciBjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvID0gZ2V0Q3VycmVudENvbXBvbmVudEVycm9ySW5mbyhwYXJlbnRUeXBlKTtcblxuICBpZiAob3duZXJIYXNLZXlVc2VXYXJuaW5nW2N1cnJlbnRDb21wb25lbnRFcnJvckluZm9dKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgb3duZXJIYXNLZXlVc2VXYXJuaW5nW2N1cnJlbnRDb21wb25lbnRFcnJvckluZm9dID0gdHJ1ZTsgLy8gVXN1YWxseSB0aGUgY3VycmVudCBvd25lciBpcyB0aGUgb2ZmZW5kZXIsIGJ1dCBpZiBpdCBhY2NlcHRzIGNoaWxkcmVuIGFzIGFcbiAgLy8gcHJvcGVydHksIGl0IG1heSBiZSB0aGUgY3JlYXRvciBvZiB0aGUgY2hpbGQgdGhhdCdzIHJlc3BvbnNpYmxlIGZvclxuICAvLyBhc3NpZ25pbmcgaXQgYSBrZXkuXG5cbiAgdmFyIGNoaWxkT3duZXIgPSAnJztcblxuICBpZiAoZWxlbWVudCAmJiBlbGVtZW50Ll9vd25lciAmJiBlbGVtZW50Ll9vd25lciAhPT0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkge1xuICAgIC8vIEdpdmUgdGhlIGNvbXBvbmVudCB0aGF0IG9yaWdpbmFsbHkgY3JlYXRlZCB0aGlzIGNoaWxkLlxuICAgIGNoaWxkT3duZXIgPSBcIiBJdCB3YXMgcGFzc2VkIGEgY2hpbGQgZnJvbSBcIiArIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShlbGVtZW50Ll9vd25lci50eXBlKSArIFwiLlwiO1xuICB9XG5cbiAge1xuICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZWxlbWVudCk7XG5cbiAgICBlcnJvcignRWFjaCBjaGlsZCBpbiBhIGxpc3Qgc2hvdWxkIGhhdmUgYSB1bmlxdWUgXCJrZXlcIiBwcm9wLicgKyAnJXMlcyBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3dhcm5pbmcta2V5cyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nLCBjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvLCBjaGlsZE93bmVyKTtcblxuICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEobnVsbCk7XG4gIH1cbn1cbi8qKlxuICogRW5zdXJlIHRoYXQgZXZlcnkgZWxlbWVudCBlaXRoZXIgaXMgcGFzc2VkIGluIGEgc3RhdGljIGxvY2F0aW9uLCBpbiBhblxuICogYXJyYXkgd2l0aCBhbiBleHBsaWNpdCBrZXlzIHByb3BlcnR5IGRlZmluZWQsIG9yIGluIGFuIG9iamVjdCBsaXRlcmFsXG4gKiB3aXRoIHZhbGlkIGtleSBwcm9wZXJ0eS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqIEBwYXJhbSB7UmVhY3ROb2RlfSBub2RlIFN0YXRpY2FsbHkgcGFzc2VkIGNoaWxkIG9mIGFueSB0eXBlLlxuICogQHBhcmFtIHsqfSBwYXJlbnRUeXBlIG5vZGUncyBwYXJlbnQncyB0eXBlLlxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVDaGlsZEtleXMobm9kZSwgcGFyZW50VHlwZSkge1xuICBpZiAodHlwZW9mIG5vZGUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGlzQXJyYXkobm9kZSkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjaGlsZCA9IG5vZGVbaV07XG5cbiAgICAgIGlmIChpc1ZhbGlkRWxlbWVudChjaGlsZCkpIHtcbiAgICAgICAgdmFsaWRhdGVFeHBsaWNpdEtleShjaGlsZCwgcGFyZW50VHlwZSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzVmFsaWRFbGVtZW50KG5vZGUpKSB7XG4gICAgLy8gVGhpcyBlbGVtZW50IHdhcyBwYXNzZWQgaW4gYSB2YWxpZCBsb2NhdGlvbi5cbiAgICBpZiAobm9kZS5fc3RvcmUpIHtcbiAgICAgIG5vZGUuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG4gICAgfVxuICB9IGVsc2UgaWYgKG5vZGUpIHtcbiAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4obm9kZSk7XG5cbiAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIEVudHJ5IGl0ZXJhdG9ycyB1c2VkIHRvIHByb3ZpZGUgaW1wbGljaXQga2V5cyxcbiAgICAgIC8vIGJ1dCBub3cgd2UgcHJpbnQgYSBzZXBhcmF0ZSB3YXJuaW5nIGZvciB0aGVtIGxhdGVyLlxuICAgICAgaWYgKGl0ZXJhdG9yRm4gIT09IG5vZGUuZW50cmllcykge1xuICAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwobm9kZSk7XG4gICAgICAgIHZhciBzdGVwO1xuXG4gICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICBpZiAoaXNWYWxpZEVsZW1lbnQoc3RlcC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHZhbGlkYXRlRXhwbGljaXRLZXkoc3RlcC52YWx1ZSwgcGFyZW50VHlwZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEdpdmVuIGFuIGVsZW1lbnQsIHZhbGlkYXRlIHRoYXQgaXRzIHByb3BzIGZvbGxvdyB0aGUgcHJvcFR5cGVzIGRlZmluaXRpb24sXG4gKiBwcm92aWRlZCBieSB0aGUgdHlwZS5cbiAqXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudFxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wVHlwZXMoZWxlbWVudCkge1xuICB7XG4gICAgdmFyIHR5cGUgPSBlbGVtZW50LnR5cGU7XG5cbiAgICBpZiAodHlwZSA9PT0gbnVsbCB8fCB0eXBlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHByb3BUeXBlcztcblxuICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcHJvcFR5cGVzID0gdHlwZS5wcm9wVHlwZXM7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgLy8gTm90ZTogTWVtbyBvbmx5IGNoZWNrcyBvdXRlciBwcm9wcyBoZXJlLlxuICAgIC8vIElubmVyIHByb3BzIGFyZSBjaGVja2VkIGluIHRoZSByZWNvbmNpbGVyLlxuICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSkpIHtcbiAgICAgIHByb3BUeXBlcyA9IHR5cGUucHJvcFR5cGVzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHByb3BUeXBlcykge1xuICAgICAgLy8gSW50ZW50aW9uYWxseSBpbnNpZGUgdG8gYXZvaWQgdHJpZ2dlcmluZyBsYXp5IGluaXRpYWxpemVyczpcbiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpO1xuICAgICAgY2hlY2tQcm9wVHlwZXMocHJvcFR5cGVzLCBlbGVtZW50LnByb3BzLCAncHJvcCcsIG5hbWUsIGVsZW1lbnQpO1xuICAgIH0gZWxzZSBpZiAodHlwZS5Qcm9wVHlwZXMgIT09IHVuZGVmaW5lZCAmJiAhcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd24pIHtcbiAgICAgIHByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duID0gdHJ1ZTsgLy8gSW50ZW50aW9uYWxseSBpbnNpZGUgdG8gYXZvaWQgdHJpZ2dlcmluZyBsYXp5IGluaXRpYWxpemVyczpcblxuICAgICAgdmFyIF9uYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpO1xuXG4gICAgICBlcnJvcignQ29tcG9uZW50ICVzIGRlY2xhcmVkIGBQcm9wVHlwZXNgIGluc3RlYWQgb2YgYHByb3BUeXBlc2AuIERpZCB5b3UgbWlzc3BlbGwgdGhlIHByb3BlcnR5IGFzc2lnbm1lbnQ/JywgX25hbWUgfHwgJ1Vua25vd24nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHR5cGUuZ2V0RGVmYXVsdFByb3BzID09PSAnZnVuY3Rpb24nICYmICF0eXBlLmdldERlZmF1bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZCkge1xuICAgICAgZXJyb3IoJ2dldERlZmF1bHRQcm9wcyBpcyBvbmx5IHVzZWQgb24gY2xhc3NpYyBSZWFjdC5jcmVhdGVDbGFzcyAnICsgJ2RlZmluaXRpb25zLiBVc2UgYSBzdGF0aWMgcHJvcGVydHkgbmFtZWQgYGRlZmF1bHRQcm9wc2AgaW5zdGVhZC4nKTtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogR2l2ZW4gYSBmcmFnbWVudCwgdmFsaWRhdGUgdGhhdCBpdCBjYW4gb25seSBiZSBwcm92aWRlZCB3aXRoIGZyYWdtZW50IHByb3BzXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZnJhZ21lbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlRnJhZ21lbnRQcm9wcyhmcmFnbWVudCkge1xuICB7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhmcmFnbWVudC5wcm9wcyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuXG4gICAgICBpZiAoa2V5ICE9PSAnY2hpbGRyZW4nICYmIGtleSAhPT0gJ2tleScpIHtcbiAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShmcmFnbWVudCk7XG5cbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgcHJvcCBgJXNgIHN1cHBsaWVkIHRvIGBSZWFjdC5GcmFnbWVudGAuICcgKyAnUmVhY3QuRnJhZ21lbnQgY2FuIG9ubHkgaGF2ZSBga2V5YCBhbmQgYGNoaWxkcmVuYCBwcm9wcy4nLCBrZXkpO1xuXG4gICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEobnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmcmFnbWVudC5yZWYgIT09IG51bGwpIHtcbiAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZnJhZ21lbnQpO1xuXG4gICAgICBlcnJvcignSW52YWxpZCBhdHRyaWJ1dGUgYHJlZmAgc3VwcGxpZWQgdG8gYFJlYWN0LkZyYWdtZW50YC4nKTtcblxuICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShudWxsKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRXaXRoVmFsaWRhdGlvbih0eXBlLCBwcm9wcywgY2hpbGRyZW4pIHtcbiAgdmFyIHZhbGlkVHlwZSA9IGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKTsgLy8gV2Ugd2FybiBpbiB0aGlzIGNhc2UgYnV0IGRvbid0IHRocm93LiBXZSBleHBlY3QgdGhlIGVsZW1lbnQgY3JlYXRpb24gdG9cbiAgLy8gc3VjY2VlZCBhbmQgdGhlcmUgd2lsbCBsaWtlbHkgYmUgZXJyb3JzIGluIHJlbmRlci5cblxuICBpZiAoIXZhbGlkVHlwZSkge1xuICAgIHZhciBpbmZvID0gJyc7XG5cbiAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsICYmIE9iamVjdC5rZXlzKHR5cGUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaW5mbyArPSAnIFlvdSBsaWtlbHkgZm9yZ290IHRvIGV4cG9ydCB5b3VyIGNvbXBvbmVudCBmcm9tIHRoZSBmaWxlICcgKyBcIml0J3MgZGVmaW5lZCBpbiwgb3IgeW91IG1pZ2h0IGhhdmUgbWl4ZWQgdXAgZGVmYXVsdCBhbmQgbmFtZWQgaW1wb3J0cy5cIjtcbiAgICB9XG5cbiAgICB2YXIgc291cmNlSW5mbyA9IGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtRm9yUHJvcHMocHJvcHMpO1xuXG4gICAgaWYgKHNvdXJjZUluZm8pIHtcbiAgICAgIGluZm8gKz0gc291cmNlSW5mbztcbiAgICB9IGVsc2Uge1xuICAgICAgaW5mbyArPSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKTtcbiAgICB9XG5cbiAgICB2YXIgdHlwZVN0cmluZztcblxuICAgIGlmICh0eXBlID09PSBudWxsKSB7XG4gICAgICB0eXBlU3RyaW5nID0gJ251bGwnO1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheSh0eXBlKSkge1xuICAgICAgdHlwZVN0cmluZyA9ICdhcnJheSc7XG4gICAgfSBlbHNlIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFKSB7XG4gICAgICB0eXBlU3RyaW5nID0gXCI8XCIgKyAoZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUudHlwZSkgfHwgJ1Vua25vd24nKSArIFwiIC8+XCI7XG4gICAgICBpbmZvID0gJyBEaWQgeW91IGFjY2lkZW50YWxseSBleHBvcnQgYSBKU1ggbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgY29tcG9uZW50Pyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHR5cGVTdHJpbmcgPSB0eXBlb2YgdHlwZTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBlcnJvcignUmVhY3QuY3JlYXRlRWxlbWVudDogdHlwZSBpcyBpbnZhbGlkIC0tIGV4cGVjdGVkIGEgc3RyaW5nIChmb3IgJyArICdidWlsdC1pbiBjb21wb25lbnRzKSBvciBhIGNsYXNzL2Z1bmN0aW9uIChmb3IgY29tcG9zaXRlICcgKyAnY29tcG9uZW50cykgYnV0IGdvdDogJXMuJXMnLCB0eXBlU3RyaW5nLCBpbmZvKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gVGhlIHJlc3VsdCBjYW4gYmUgbnVsbGlzaCBpZiBhIG1vY2sgb3IgYSBjdXN0b20gZnVuY3Rpb24gaXMgdXNlZC5cbiAgLy8gVE9ETzogRHJvcCB0aGlzIHdoZW4gdGhlc2UgYXJlIG5vIGxvbmdlciBhbGxvd2VkIGFzIHRoZSB0eXBlIGFyZ3VtZW50LlxuXG4gIGlmIChlbGVtZW50ID09IG51bGwpIHtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfSAvLyBTa2lwIGtleSB3YXJuaW5nIGlmIHRoZSB0eXBlIGlzbid0IHZhbGlkIHNpbmNlIG91ciBrZXkgdmFsaWRhdGlvbiBsb2dpY1xuICAvLyBkb2Vzbid0IGV4cGVjdCBhIG5vbi1zdHJpbmcvZnVuY3Rpb24gdHlwZSBhbmQgY2FuIHRocm93IGNvbmZ1c2luZyBlcnJvcnMuXG4gIC8vIFdlIGRvbid0IHdhbnQgZXhjZXB0aW9uIGJlaGF2aW9yIHRvIGRpZmZlciBiZXR3ZWVuIGRldiBhbmQgcHJvZC5cbiAgLy8gKFJlbmRlcmluZyB3aWxsIHRocm93IHdpdGggYSBoZWxwZnVsIG1lc3NhZ2UgYW5kIGFzIHNvb24gYXMgdGhlIHR5cGUgaXNcbiAgLy8gZml4ZWQsIHRoZSBrZXkgd2FybmluZ3Mgd2lsbCBhcHBlYXIuKVxuXG5cbiAgaWYgKHZhbGlkVHlwZSkge1xuICAgIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWxpZGF0ZUNoaWxkS2V5cyhhcmd1bWVudHNbaV0sIHR5cGUpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFKSB7XG4gICAgdmFsaWRhdGVGcmFnbWVudFByb3BzKGVsZW1lbnQpO1xuICB9IGVsc2Uge1xuICAgIHZhbGlkYXRlUHJvcFR5cGVzKGVsZW1lbnQpO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG52YXIgZGlkV2FybkFib3V0RGVwcmVjYXRlZENyZWF0ZUZhY3RvcnkgPSBmYWxzZTtcbmZ1bmN0aW9uIGNyZWF0ZUZhY3RvcnlXaXRoVmFsaWRhdGlvbih0eXBlKSB7XG4gIHZhciB2YWxpZGF0ZWRGYWN0b3J5ID0gY3JlYXRlRWxlbWVudFdpdGhWYWxpZGF0aW9uLmJpbmQobnVsbCwgdHlwZSk7XG4gIHZhbGlkYXRlZEZhY3RvcnkudHlwZSA9IHR5cGU7XG5cbiAge1xuICAgIGlmICghZGlkV2FybkFib3V0RGVwcmVjYXRlZENyZWF0ZUZhY3RvcnkpIHtcbiAgICAgIGRpZFdhcm5BYm91dERlcHJlY2F0ZWRDcmVhdGVGYWN0b3J5ID0gdHJ1ZTtcblxuICAgICAgd2FybignUmVhY3QuY3JlYXRlRmFjdG9yeSgpIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAnICsgJ2EgZnV0dXJlIG1ham9yIHJlbGVhc2UuIENvbnNpZGVyIHVzaW5nIEpTWCAnICsgJ29yIHVzZSBSZWFjdC5jcmVhdGVFbGVtZW50KCkgZGlyZWN0bHkgaW5zdGVhZC4nKTtcbiAgICB9IC8vIExlZ2FjeSBob29rOiByZW1vdmUgaXRcblxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHZhbGlkYXRlZEZhY3RvcnksICd0eXBlJywge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2FybignRmFjdG9yeS50eXBlIGlzIGRlcHJlY2F0ZWQuIEFjY2VzcyB0aGUgY2xhc3MgZGlyZWN0bHkgJyArICdiZWZvcmUgcGFzc2luZyBpdCB0byBjcmVhdGVGYWN0b3J5LicpO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAndHlwZScsIHtcbiAgICAgICAgICB2YWx1ZTogdHlwZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVkRmFjdG9yeTtcbn1cbmZ1bmN0aW9uIGNsb25lRWxlbWVudFdpdGhWYWxpZGF0aW9uKGVsZW1lbnQsIHByb3BzLCBjaGlsZHJlbikge1xuICB2YXIgbmV3RWxlbWVudCA9IGNsb25lRWxlbWVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFsaWRhdGVDaGlsZEtleXMoYXJndW1lbnRzW2ldLCBuZXdFbGVtZW50LnR5cGUpO1xuICB9XG5cbiAgdmFsaWRhdGVQcm9wVHlwZXMobmV3RWxlbWVudCk7XG4gIHJldHVybiBuZXdFbGVtZW50O1xufVxuXG5mdW5jdGlvbiBzdGFydFRyYW5zaXRpb24oc2NvcGUsIG9wdGlvbnMpIHtcbiAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbjtcbiAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbiA9IHt9O1xuICB2YXIgY3VycmVudFRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uO1xuXG4gIHtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uLl91cGRhdGVkRmliZXJzID0gbmV3IFNldCgpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBzY29wZSgpO1xuICB9IGZpbmFsbHkge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcblxuICAgIHtcbiAgICAgIGlmIChwcmV2VHJhbnNpdGlvbiA9PT0gbnVsbCAmJiBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycykge1xuICAgICAgICB2YXIgdXBkYXRlZEZpYmVyc0NvdW50ID0gY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMuc2l6ZTtcblxuICAgICAgICBpZiAodXBkYXRlZEZpYmVyc0NvdW50ID4gMTApIHtcbiAgICAgICAgICB3YXJuKCdEZXRlY3RlZCBhIGxhcmdlIG51bWJlciBvZiB1cGRhdGVzIGluc2lkZSBzdGFydFRyYW5zaXRpb24uICcgKyAnSWYgdGhpcyBpcyBkdWUgdG8gYSBzdWJzY3JpcHRpb24gcGxlYXNlIHJlLXdyaXRlIGl0IHRvIHVzZSBSZWFjdCBwcm92aWRlZCBob29rcy4gJyArICdPdGhlcndpc2UgY29uY3VycmVudCBtb2RlIGd1YXJhbnRlZXMgYXJlIG9mZiB0aGUgdGFibGUuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycy5jbGVhcigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgZGlkV2FybkFib3V0TWVzc2FnZUNoYW5uZWwgPSBmYWxzZTtcbnZhciBlbnF1ZXVlVGFza0ltcGwgPSBudWxsO1xuZnVuY3Rpb24gZW5xdWV1ZVRhc2sodGFzaykge1xuICBpZiAoZW5xdWV1ZVRhc2tJbXBsID09PSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIHJlYWQgcmVxdWlyZSBvZmYgdGhlIG1vZHVsZSBvYmplY3QgdG8gZ2V0IGFyb3VuZCB0aGUgYnVuZGxlcnMuXG4gICAgICAvLyB3ZSBkb24ndCB3YW50IHRoZW0gdG8gZGV0ZWN0IGEgcmVxdWlyZSBhbmQgYnVuZGxlIGEgTm9kZSBwb2x5ZmlsbC5cbiAgICAgIHZhciByZXF1aXJlU3RyaW5nID0gKCdyZXF1aXJlJyArIE1hdGgucmFuZG9tKCkpLnNsaWNlKDAsIDcpO1xuICAgICAgdmFyIG5vZGVSZXF1aXJlID0gbW9kdWxlICYmIG1vZHVsZVtyZXF1aXJlU3RyaW5nXTsgLy8gYXNzdW1pbmcgd2UncmUgaW4gbm9kZSwgbGV0J3MgdHJ5IHRvIGdldCBub2RlJ3NcbiAgICAgIC8vIHZlcnNpb24gb2Ygc2V0SW1tZWRpYXRlLCBieXBhc3NpbmcgZmFrZSB0aW1lcnMgaWYgYW55LlxuXG4gICAgICBlbnF1ZXVlVGFza0ltcGwgPSBub2RlUmVxdWlyZS5jYWxsKG1vZHVsZSwgJ3RpbWVycycpLnNldEltbWVkaWF0ZTtcbiAgICB9IGNhdGNoIChfZXJyKSB7XG4gICAgICAvLyB3ZSdyZSBpbiBhIGJyb3dzZXJcbiAgICAgIC8vIHdlIGNhbid0IHVzZSByZWd1bGFyIHRpbWVycyBiZWNhdXNlIHRoZXkgbWF5IHN0aWxsIGJlIGZha2VkXG4gICAgICAvLyBzbyB3ZSB0cnkgTWVzc2FnZUNoYW5uZWwrcG9zdE1lc3NhZ2UgaW5zdGVhZFxuICAgICAgZW5xdWV1ZVRhc2tJbXBsID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoZGlkV2FybkFib3V0TWVzc2FnZUNoYW5uZWwgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBkaWRXYXJuQWJvdXRNZXNzYWdlQ2hhbm5lbCA9IHRydWU7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgTWVzc2FnZUNoYW5uZWwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIGVycm9yKCdUaGlzIGJyb3dzZXIgZG9lcyBub3QgaGF2ZSBhIE1lc3NhZ2VDaGFubmVsIGltcGxlbWVudGF0aW9uLCAnICsgJ3NvIGVucXVldWluZyB0YXNrcyB2aWEgYXdhaXQgYWN0KGFzeW5jICgpID0+IC4uLikgd2lsbCBmYWlsLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMgJyArICdpZiB5b3UgZW5jb3VudGVyIHRoaXMgd2FybmluZy4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgICAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGNhbGxiYWNrO1xuICAgICAgICBjaGFubmVsLnBvcnQyLnBvc3RNZXNzYWdlKHVuZGVmaW5lZCk7XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlbnF1ZXVlVGFza0ltcGwodGFzayk7XG59XG5cbnZhciBhY3RTY29wZURlcHRoID0gMDtcbnZhciBkaWRXYXJuTm9Bd2FpdEFjdCA9IGZhbHNlO1xuZnVuY3Rpb24gYWN0KGNhbGxiYWNrKSB7XG4gIHtcbiAgICAvLyBgYWN0YCBjYWxscyBjYW4gYmUgbmVzdGVkLCBzbyB3ZSB0cmFjayB0aGUgZGVwdGguIFRoaXMgcmVwcmVzZW50cyB0aGVcbiAgICAvLyBudW1iZXIgb2YgYGFjdGAgc2NvcGVzIG9uIHRoZSBzdGFjay5cbiAgICB2YXIgcHJldkFjdFNjb3BlRGVwdGggPSBhY3RTY29wZURlcHRoO1xuICAgIGFjdFNjb3BlRGVwdGgrKztcblxuICAgIGlmIChSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBvdXRlcm1vc3QgYGFjdGAgc2NvcGUuIEluaXRpYWxpemUgdGhlIHF1ZXVlLiBUaGUgcmVjb25jaWxlclxuICAgICAgLy8gd2lsbCBkZXRlY3QgdGhlIHF1ZXVlIGFuZCB1c2UgaXQgaW5zdGVhZCBvZiBTY2hlZHVsZXIuXG4gICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID0gW107XG4gICAgfVxuXG4gICAgdmFyIHByZXZJc0JhdGNoaW5nTGVnYWN5ID0gUmVhY3RDdXJyZW50QWN0UXVldWUuaXNCYXRjaGluZ0xlZ2FjeTtcbiAgICB2YXIgcmVzdWx0O1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFVzZWQgdG8gcmVwcm9kdWNlIGJlaGF2aW9yIG9mIGBiYXRjaGVkVXBkYXRlc2AgaW4gbGVnYWN5IG1vZGUuIE9ubHlcbiAgICAgIC8vIHNldCB0byBgdHJ1ZWAgd2hpbGUgdGhlIGdpdmVuIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLCBub3QgZm9yIHVwZGF0ZXNcbiAgICAgIC8vIHRyaWdnZXJlZCBkdXJpbmcgYW4gYXN5bmMgZXZlbnQsIGJlY2F1c2UgdGhpcyBpcyBob3cgdGhlIGxlZ2FjeVxuICAgICAgLy8gaW1wbGVtZW50YXRpb24gb2YgYGFjdGAgYmVoYXZlZC5cbiAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmlzQmF0Y2hpbmdMZWdhY3kgPSB0cnVlO1xuICAgICAgcmVzdWx0ID0gY2FsbGJhY2soKTsgLy8gUmVwbGljYXRlIGJlaGF2aW9yIG9mIG9yaWdpbmFsIGBhY3RgIGltcGxlbWVudGF0aW9uIGluIGxlZ2FjeSBtb2RlLFxuICAgICAgLy8gd2hpY2ggZmx1c2hlZCB1cGRhdGVzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBzY29wZSBmdW5jdGlvbiBleGl0cywgZXZlblxuICAgICAgLy8gaWYgaXQncyBhbiBhc3luYyBmdW5jdGlvbi5cblxuICAgICAgaWYgKCFwcmV2SXNCYXRjaGluZ0xlZ2FjeSAmJiBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5kaWRTY2hlZHVsZUxlZ2FjeVVwZGF0ZSkge1xuICAgICAgICB2YXIgcXVldWUgPSBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50O1xuXG4gICAgICAgIGlmIChxdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmRpZFNjaGVkdWxlTGVnYWN5VXBkYXRlID0gZmFsc2U7XG4gICAgICAgICAgZmx1c2hBY3RRdWV1ZShxdWV1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcG9wQWN0U2NvcGUocHJldkFjdFNjb3BlRGVwdGgpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmlzQmF0Y2hpbmdMZWdhY3kgPSBwcmV2SXNCYXRjaGluZ0xlZ2FjeTtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0ICE9PSBudWxsICYmIHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnICYmIHR5cGVvZiByZXN1bHQudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHRoZW5hYmxlUmVzdWx0ID0gcmVzdWx0OyAvLyBUaGUgY2FsbGJhY2sgaXMgYW4gYXN5bmMgZnVuY3Rpb24gKGkuZS4gcmV0dXJuZWQgYSBwcm9taXNlKS4gV2FpdFxuICAgICAgLy8gZm9yIGl0IHRvIHJlc29sdmUgYmVmb3JlIGV4aXRpbmcgdGhlIGN1cnJlbnQgc2NvcGUuXG5cbiAgICAgIHZhciB3YXNBd2FpdGVkID0gZmFsc2U7XG4gICAgICB2YXIgdGhlbmFibGUgPSB7XG4gICAgICAgIHRoZW46IGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICB3YXNBd2FpdGVkID0gdHJ1ZTtcbiAgICAgICAgICB0aGVuYWJsZVJlc3VsdC50aGVuKGZ1bmN0aW9uIChyZXR1cm5WYWx1ZSkge1xuICAgICAgICAgICAgcG9wQWN0U2NvcGUocHJldkFjdFNjb3BlRGVwdGgpO1xuXG4gICAgICAgICAgICBpZiAoYWN0U2NvcGVEZXB0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAvLyBXZSd2ZSBleGl0ZWQgdGhlIG91dGVybW9zdCBhY3Qgc2NvcGUuIFJlY3Vyc2l2ZWx5IGZsdXNoIHRoZVxuICAgICAgICAgICAgICAvLyBxdWV1ZSB1bnRpbCB0aGVyZSdzIG5vIHJlbWFpbmluZyB3b3JrLlxuICAgICAgICAgICAgICByZWN1cnNpdmVseUZsdXNoQXN5bmNBY3RXb3JrKHJldHVyblZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShyZXR1cm5WYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBUaGUgY2FsbGJhY2sgdGhyZXcgYW4gZXJyb3IuXG4gICAgICAgICAgICBwb3BBY3RTY29wZShwcmV2QWN0U2NvcGVEZXB0aCk7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB7XG4gICAgICAgIGlmICghZGlkV2Fybk5vQXdhaXRBY3QgJiYgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7fSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIXdhc0F3YWl0ZWQpIHtcbiAgICAgICAgICAgICAgZGlkV2Fybk5vQXdhaXRBY3QgPSB0cnVlO1xuXG4gICAgICAgICAgICAgIGVycm9yKCdZb3UgY2FsbGVkIGFjdChhc3luYyAoKSA9PiAuLi4pIHdpdGhvdXQgYXdhaXQuICcgKyAnVGhpcyBjb3VsZCBsZWFkIHRvIHVuZXhwZWN0ZWQgdGVzdGluZyBiZWhhdmlvdXIsICcgKyAnaW50ZXJsZWF2aW5nIG11bHRpcGxlIGFjdCBjYWxscyBhbmQgbWl4aW5nIHRoZWlyICcgKyAnc2NvcGVzLiAnICsgJ1lvdSBzaG91bGQgLSBhd2FpdCBhY3QoYXN5bmMgKCkgPT4gLi4uKTsnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhlbmFibGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciByZXR1cm5WYWx1ZSA9IHJlc3VsdDsgLy8gVGhlIGNhbGxiYWNrIGlzIG5vdCBhbiBhc3luYyBmdW5jdGlvbi4gRXhpdCB0aGUgY3VycmVudCBzY29wZVxuICAgICAgLy8gaW1tZWRpYXRlbHksIHdpdGhvdXQgYXdhaXRpbmcuXG5cbiAgICAgIHBvcEFjdFNjb3BlKHByZXZBY3RTY29wZURlcHRoKTtcblxuICAgICAgaWYgKGFjdFNjb3BlRGVwdGggPT09IDApIHtcbiAgICAgICAgLy8gRXhpdGluZyB0aGUgb3V0ZXJtb3N0IGFjdCBzY29wZS4gRmx1c2ggdGhlIHF1ZXVlLlxuICAgICAgICB2YXIgX3F1ZXVlID0gUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudDtcblxuICAgICAgICBpZiAoX3F1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgICAgZmx1c2hBY3RRdWV1ZShfcXVldWUpO1xuICAgICAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICB9IC8vIFJldHVybiBhIHRoZW5hYmxlLiBJZiB0aGUgdXNlciBhd2FpdHMgaXQsIHdlJ2xsIGZsdXNoIGFnYWluIGluXG4gICAgICAgIC8vIGNhc2UgYWRkaXRpb25hbCB3b3JrIHdhcyBzY2hlZHVsZWQgYnkgYSBtaWNyb3Rhc2suXG5cblxuICAgICAgICB2YXIgX3RoZW5hYmxlID0ge1xuICAgICAgICAgIHRoZW46IGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIC8vIENvbmZpcm0gd2UgaGF2ZW4ndCByZS1lbnRlcmVkIGFub3RoZXIgYGFjdGAgc2NvcGUsIGluIGNhc2VcbiAgICAgICAgICAgIC8vIHRoZSB1c2VyIGRvZXMgc29tZXRoaW5nIHdlaXJkIGxpa2UgYXdhaXQgdGhlIHRoZW5hYmxlXG4gICAgICAgICAgICAvLyBtdWx0aXBsZSB0aW1lcy5cbiAgICAgICAgICAgIGlmIChSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGZsdXNoIHRoZSBxdWV1ZSB1bnRpbCB0aGVyZSdzIG5vIHJlbWFpbmluZyB3b3JrLlxuICAgICAgICAgICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID0gW107XG4gICAgICAgICAgICAgIHJlY3Vyc2l2ZWx5Rmx1c2hBc3luY0FjdFdvcmsocmV0dXJuVmFsdWUsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXNvbHZlKHJldHVyblZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfdGhlbmFibGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBTaW5jZSB3ZSdyZSBpbnNpZGUgYSBuZXN0ZWQgYGFjdGAgc2NvcGUsIHRoZSByZXR1cm5lZCB0aGVuYWJsZVxuICAgICAgICAvLyBpbW1lZGlhdGVseSByZXNvbHZlcy4gVGhlIG91dGVyIHNjb3BlIHdpbGwgZmx1c2ggdGhlIHF1ZXVlLlxuICAgICAgICB2YXIgX3RoZW5hYmxlMiA9IHtcbiAgICAgICAgICB0aGVuOiBmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICByZXNvbHZlKHJldHVyblZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfdGhlbmFibGUyO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwb3BBY3RTY29wZShwcmV2QWN0U2NvcGVEZXB0aCkge1xuICB7XG4gICAgaWYgKHByZXZBY3RTY29wZURlcHRoICE9PSBhY3RTY29wZURlcHRoIC0gMSkge1xuICAgICAgZXJyb3IoJ1lvdSBzZWVtIHRvIGhhdmUgb3ZlcmxhcHBpbmcgYWN0KCkgY2FsbHMsIHRoaXMgaXMgbm90IHN1cHBvcnRlZC4gJyArICdCZSBzdXJlIHRvIGF3YWl0IHByZXZpb3VzIGFjdCgpIGNhbGxzIGJlZm9yZSBtYWtpbmcgYSBuZXcgb25lLiAnKTtcbiAgICB9XG5cbiAgICBhY3RTY29wZURlcHRoID0gcHJldkFjdFNjb3BlRGVwdGg7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVjdXJzaXZlbHlGbHVzaEFzeW5jQWN0V29yayhyZXR1cm5WYWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gIHtcbiAgICB2YXIgcXVldWUgPSBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50O1xuXG4gICAgaWYgKHF1ZXVlICE9PSBudWxsKSB7XG4gICAgICB0cnkge1xuICAgICAgICBmbHVzaEFjdFF1ZXVlKHF1ZXVlKTtcbiAgICAgICAgZW5xdWV1ZVRhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIE5vIGFkZGl0aW9uYWwgd29yayB3YXMgc2NoZWR1bGVkLiBGaW5pc2guXG4gICAgICAgICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc29sdmUocmV0dXJuVmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBLZWVwIGZsdXNoaW5nIHdvcmsgdW50aWwgdGhlcmUncyBub25lIGxlZnQuXG4gICAgICAgICAgICByZWN1cnNpdmVseUZsdXNoQXN5bmNBY3RXb3JrKHJldHVyblZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXNvbHZlKHJldHVyblZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIGlzRmx1c2hpbmcgPSBmYWxzZTtcblxuZnVuY3Rpb24gZmx1c2hBY3RRdWV1ZShxdWV1ZSkge1xuICB7XG4gICAgaWYgKCFpc0ZsdXNoaW5nKSB7XG4gICAgICAvLyBQcmV2ZW50IHJlLWVudHJhbmNlLlxuICAgICAgaXNGbHVzaGluZyA9IHRydWU7XG4gICAgICB2YXIgaSA9IDA7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBxdWV1ZVtpXTtcblxuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sodHJ1ZSk7XG4gICAgICAgICAgfSB3aGlsZSAoY2FsbGJhY2sgIT09IG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgcXVldWUubGVuZ3RoID0gMDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIElmIHNvbWV0aGluZyB0aHJvd3MsIGxlYXZlIHRoZSByZW1haW5pbmcgY2FsbGJhY2tzIG9uIHRoZSBxdWV1ZS5cbiAgICAgICAgcXVldWUgPSBxdWV1ZS5zbGljZShpICsgMSk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaXNGbHVzaGluZyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgY3JlYXRlRWxlbWVudCQxID0gIGNyZWF0ZUVsZW1lbnRXaXRoVmFsaWRhdGlvbiA7XG52YXIgY2xvbmVFbGVtZW50JDEgPSAgY2xvbmVFbGVtZW50V2l0aFZhbGlkYXRpb24gO1xudmFyIGNyZWF0ZUZhY3RvcnkgPSAgY3JlYXRlRmFjdG9yeVdpdGhWYWxpZGF0aW9uIDtcbnZhciBDaGlsZHJlbiA9IHtcbiAgbWFwOiBtYXBDaGlsZHJlbixcbiAgZm9yRWFjaDogZm9yRWFjaENoaWxkcmVuLFxuICBjb3VudDogY291bnRDaGlsZHJlbixcbiAgdG9BcnJheTogdG9BcnJheSxcbiAgb25seTogb25seUNoaWxkXG59O1xuXG5leHBvcnRzLkNoaWxkcmVuID0gQ2hpbGRyZW47XG5leHBvcnRzLkNvbXBvbmVudCA9IENvbXBvbmVudDtcbmV4cG9ydHMuRnJhZ21lbnQgPSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xuZXhwb3J0cy5Qcm9maWxlciA9IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG5leHBvcnRzLlB1cmVDb21wb25lbnQgPSBQdXJlQ29tcG9uZW50O1xuZXhwb3J0cy5TdHJpY3RNb2RlID0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbmV4cG9ydHMuU3VzcGVuc2UgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xuZXhwb3J0cy5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRCA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzO1xuZXhwb3J0cy5hY3QgPSBhY3Q7XG5leHBvcnRzLmNsb25lRWxlbWVudCA9IGNsb25lRWxlbWVudCQxO1xuZXhwb3J0cy5jcmVhdGVDb250ZXh0ID0gY3JlYXRlQ29udGV4dDtcbmV4cG9ydHMuY3JlYXRlRWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQkMTtcbmV4cG9ydHMuY3JlYXRlRmFjdG9yeSA9IGNyZWF0ZUZhY3Rvcnk7XG5leHBvcnRzLmNyZWF0ZVJlZiA9IGNyZWF0ZVJlZjtcbmV4cG9ydHMuZm9yd2FyZFJlZiA9IGZvcndhcmRSZWY7XG5leHBvcnRzLmlzVmFsaWRFbGVtZW50ID0gaXNWYWxpZEVsZW1lbnQ7XG5leHBvcnRzLmxhenkgPSBsYXp5O1xuZXhwb3J0cy5tZW1vID0gbWVtbztcbmV4cG9ydHMuc3RhcnRUcmFuc2l0aW9uID0gc3RhcnRUcmFuc2l0aW9uO1xuZXhwb3J0cy51bnN0YWJsZV9hY3QgPSBhY3Q7XG5leHBvcnRzLnVzZUNhbGxiYWNrID0gdXNlQ2FsbGJhY2s7XG5leHBvcnRzLnVzZUNvbnRleHQgPSB1c2VDb250ZXh0O1xuZXhwb3J0cy51c2VEZWJ1Z1ZhbHVlID0gdXNlRGVidWdWYWx1ZTtcbmV4cG9ydHMudXNlRGVmZXJyZWRWYWx1ZSA9IHVzZURlZmVycmVkVmFsdWU7XG5leHBvcnRzLnVzZUVmZmVjdCA9IHVzZUVmZmVjdDtcbmV4cG9ydHMudXNlSWQgPSB1c2VJZDtcbmV4cG9ydHMudXNlSW1wZXJhdGl2ZUhhbmRsZSA9IHVzZUltcGVyYXRpdmVIYW5kbGU7XG5leHBvcnRzLnVzZUluc2VydGlvbkVmZmVjdCA9IHVzZUluc2VydGlvbkVmZmVjdDtcbmV4cG9ydHMudXNlTGF5b3V0RWZmZWN0ID0gdXNlTGF5b3V0RWZmZWN0O1xuZXhwb3J0cy51c2VNZW1vID0gdXNlTWVtbztcbmV4cG9ydHMudXNlUmVkdWNlciA9IHVzZVJlZHVjZXI7XG5leHBvcnRzLnVzZVJlZiA9IHVzZVJlZjtcbmV4cG9ydHMudXNlU3RhdGUgPSB1c2VTdGF0ZTtcbmV4cG9ydHMudXNlU3luY0V4dGVybmFsU3RvcmUgPSB1c2VTeW5jRXh0ZXJuYWxTdG9yZTtcbmV4cG9ydHMudXNlVHJhbnNpdGlvbiA9IHVzZVRyYW5zaXRpb247XG5leHBvcnRzLnZlcnNpb24gPSBSZWFjdFZlcnNpb247XG4gICAgICAgICAgLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AobmV3IEVycm9yKCkpO1xufVxuICAgICAgICBcbiAgfSkoKTtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlIFJlYWN0XG4gKiBzY2hlZHVsZXIuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgJ3VzZSBzdHJpY3QnO1xuXG4vKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG5pZiAoXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0ID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0KG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgICB2YXIgZW5hYmxlU2NoZWR1bGVyRGVidWdnaW5nID0gZmFsc2U7XG52YXIgZW5hYmxlUHJvZmlsaW5nID0gZmFsc2U7XG52YXIgZnJhbWVZaWVsZE1zID0gNTtcblxuZnVuY3Rpb24gcHVzaChoZWFwLCBub2RlKSB7XG4gIHZhciBpbmRleCA9IGhlYXAubGVuZ3RoO1xuICBoZWFwLnB1c2gobm9kZSk7XG4gIHNpZnRVcChoZWFwLCBub2RlLCBpbmRleCk7XG59XG5mdW5jdGlvbiBwZWVrKGhlYXApIHtcbiAgcmV0dXJuIGhlYXAubGVuZ3RoID09PSAwID8gbnVsbCA6IGhlYXBbMF07XG59XG5mdW5jdGlvbiBwb3AoaGVhcCkge1xuICBpZiAoaGVhcC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBmaXJzdCA9IGhlYXBbMF07XG4gIHZhciBsYXN0ID0gaGVhcC5wb3AoKTtcblxuICBpZiAobGFzdCAhPT0gZmlyc3QpIHtcbiAgICBoZWFwWzBdID0gbGFzdDtcbiAgICBzaWZ0RG93bihoZWFwLCBsYXN0LCAwKTtcbiAgfVxuXG4gIHJldHVybiBmaXJzdDtcbn1cblxuZnVuY3Rpb24gc2lmdFVwKGhlYXAsIG5vZGUsIGkpIHtcbiAgdmFyIGluZGV4ID0gaTtcblxuICB3aGlsZSAoaW5kZXggPiAwKSB7XG4gICAgdmFyIHBhcmVudEluZGV4ID0gaW5kZXggLSAxID4+PiAxO1xuICAgIHZhciBwYXJlbnQgPSBoZWFwW3BhcmVudEluZGV4XTtcblxuICAgIGlmIChjb21wYXJlKHBhcmVudCwgbm9kZSkgPiAwKSB7XG4gICAgICAvLyBUaGUgcGFyZW50IGlzIGxhcmdlci4gU3dhcCBwb3NpdGlvbnMuXG4gICAgICBoZWFwW3BhcmVudEluZGV4XSA9IG5vZGU7XG4gICAgICBoZWFwW2luZGV4XSA9IHBhcmVudDtcbiAgICAgIGluZGV4ID0gcGFyZW50SW5kZXg7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSBwYXJlbnQgaXMgc21hbGxlci4gRXhpdC5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2lmdERvd24oaGVhcCwgbm9kZSwgaSkge1xuICB2YXIgaW5kZXggPSBpO1xuICB2YXIgbGVuZ3RoID0gaGVhcC5sZW5ndGg7XG4gIHZhciBoYWxmTGVuZ3RoID0gbGVuZ3RoID4+PiAxO1xuXG4gIHdoaWxlIChpbmRleCA8IGhhbGZMZW5ndGgpIHtcbiAgICB2YXIgbGVmdEluZGV4ID0gKGluZGV4ICsgMSkgKiAyIC0gMTtcbiAgICB2YXIgbGVmdCA9IGhlYXBbbGVmdEluZGV4XTtcbiAgICB2YXIgcmlnaHRJbmRleCA9IGxlZnRJbmRleCArIDE7XG4gICAgdmFyIHJpZ2h0ID0gaGVhcFtyaWdodEluZGV4XTsgLy8gSWYgdGhlIGxlZnQgb3IgcmlnaHQgbm9kZSBpcyBzbWFsbGVyLCBzd2FwIHdpdGggdGhlIHNtYWxsZXIgb2YgdGhvc2UuXG5cbiAgICBpZiAoY29tcGFyZShsZWZ0LCBub2RlKSA8IDApIHtcbiAgICAgIGlmIChyaWdodEluZGV4IDwgbGVuZ3RoICYmIGNvbXBhcmUocmlnaHQsIGxlZnQpIDwgMCkge1xuICAgICAgICBoZWFwW2luZGV4XSA9IHJpZ2h0O1xuICAgICAgICBoZWFwW3JpZ2h0SW5kZXhdID0gbm9kZTtcbiAgICAgICAgaW5kZXggPSByaWdodEluZGV4O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGVhcFtpbmRleF0gPSBsZWZ0O1xuICAgICAgICBoZWFwW2xlZnRJbmRleF0gPSBub2RlO1xuICAgICAgICBpbmRleCA9IGxlZnRJbmRleDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJpZ2h0SW5kZXggPCBsZW5ndGggJiYgY29tcGFyZShyaWdodCwgbm9kZSkgPCAwKSB7XG4gICAgICBoZWFwW2luZGV4XSA9IHJpZ2h0O1xuICAgICAgaGVhcFtyaWdodEluZGV4XSA9IG5vZGU7XG4gICAgICBpbmRleCA9IHJpZ2h0SW5kZXg7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5laXRoZXIgY2hpbGQgaXMgc21hbGxlci4gRXhpdC5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tcGFyZShhLCBiKSB7XG4gIC8vIENvbXBhcmUgc29ydCBpbmRleCBmaXJzdCwgdGhlbiB0YXNrIGlkLlxuICB2YXIgZGlmZiA9IGEuc29ydEluZGV4IC0gYi5zb3J0SW5kZXg7XG4gIHJldHVybiBkaWZmICE9PSAwID8gZGlmZiA6IGEuaWQgLSBiLmlkO1xufVxuXG4vLyBUT0RPOiBVc2Ugc3ltYm9scz9cbnZhciBJbW1lZGlhdGVQcmlvcml0eSA9IDE7XG52YXIgVXNlckJsb2NraW5nUHJpb3JpdHkgPSAyO1xudmFyIE5vcm1hbFByaW9yaXR5ID0gMztcbnZhciBMb3dQcmlvcml0eSA9IDQ7XG52YXIgSWRsZVByaW9yaXR5ID0gNTtcblxuZnVuY3Rpb24gbWFya1Rhc2tFcnJvcmVkKHRhc2ssIG1zKSB7XG59XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXZhciAqL1xuXG52YXIgaGFzUGVyZm9ybWFuY2VOb3cgPSB0eXBlb2YgcGVyZm9ybWFuY2UgPT09ICdvYmplY3QnICYmIHR5cGVvZiBwZXJmb3JtYW5jZS5ub3cgPT09ICdmdW5jdGlvbic7XG5cbmlmIChoYXNQZXJmb3JtYW5jZU5vdykge1xuICB2YXIgbG9jYWxQZXJmb3JtYW5jZSA9IHBlcmZvcm1hbmNlO1xuXG4gIGV4cG9ydHMudW5zdGFibGVfbm93ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBsb2NhbFBlcmZvcm1hbmNlLm5vdygpO1xuICB9O1xufSBlbHNlIHtcbiAgdmFyIGxvY2FsRGF0ZSA9IERhdGU7XG4gIHZhciBpbml0aWFsVGltZSA9IGxvY2FsRGF0ZS5ub3coKTtcblxuICBleHBvcnRzLnVuc3RhYmxlX25vdyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbG9jYWxEYXRlLm5vdygpIC0gaW5pdGlhbFRpbWU7XG4gIH07XG59IC8vIE1heCAzMSBiaXQgaW50ZWdlci4gVGhlIG1heCBpbnRlZ2VyIHNpemUgaW4gVjggZm9yIDMyLWJpdCBzeXN0ZW1zLlxuLy8gTWF0aC5wb3coMiwgMzApIC0gMVxuLy8gMGIxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFcblxuXG52YXIgbWF4U2lnbmVkMzFCaXRJbnQgPSAxMDczNzQxODIzOyAvLyBUaW1lcyBvdXQgaW1tZWRpYXRlbHlcblxudmFyIElNTUVESUFURV9QUklPUklUWV9USU1FT1VUID0gLTE7IC8vIEV2ZW50dWFsbHkgdGltZXMgb3V0XG5cbnZhciBVU0VSX0JMT0NLSU5HX1BSSU9SSVRZX1RJTUVPVVQgPSAyNTA7XG52YXIgTk9STUFMX1BSSU9SSVRZX1RJTUVPVVQgPSA1MDAwO1xudmFyIExPV19QUklPUklUWV9USU1FT1VUID0gMTAwMDA7IC8vIE5ldmVyIHRpbWVzIG91dFxuXG52YXIgSURMRV9QUklPUklUWV9USU1FT1VUID0gbWF4U2lnbmVkMzFCaXRJbnQ7IC8vIFRhc2tzIGFyZSBzdG9yZWQgb24gYSBtaW4gaGVhcFxuXG52YXIgdGFza1F1ZXVlID0gW107XG52YXIgdGltZXJRdWV1ZSA9IFtdOyAvLyBJbmNyZW1lbnRpbmcgaWQgY291bnRlci4gVXNlZCB0byBtYWludGFpbiBpbnNlcnRpb24gb3JkZXIuXG5cbnZhciB0YXNrSWRDb3VudGVyID0gMTsgLy8gUGF1c2luZyB0aGUgc2NoZWR1bGVyIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nLlxudmFyIGN1cnJlbnRUYXNrID0gbnVsbDtcbnZhciBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IE5vcm1hbFByaW9yaXR5OyAvLyBUaGlzIGlzIHNldCB3aGlsZSBwZXJmb3JtaW5nIHdvcmssIHRvIHByZXZlbnQgcmUtZW50cmFuY2UuXG5cbnZhciBpc1BlcmZvcm1pbmdXb3JrID0gZmFsc2U7XG52YXIgaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgPSBmYWxzZTtcbnZhciBpc0hvc3RUaW1lb3V0U2NoZWR1bGVkID0gZmFsc2U7IC8vIENhcHR1cmUgbG9jYWwgcmVmZXJlbmNlcyB0byBuYXRpdmUgQVBJcywgaW4gY2FzZSBhIHBvbHlmaWxsIG92ZXJyaWRlcyB0aGVtLlxuXG52YXIgbG9jYWxTZXRUaW1lb3V0ID0gdHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicgPyBzZXRUaW1lb3V0IDogbnVsbDtcbnZhciBsb2NhbENsZWFyVGltZW91dCA9IHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicgPyBjbGVhclRpbWVvdXQgOiBudWxsO1xudmFyIGxvY2FsU2V0SW1tZWRpYXRlID0gdHlwZW9mIHNldEltbWVkaWF0ZSAhPT0gJ3VuZGVmaW5lZCcgPyBzZXRJbW1lZGlhdGUgOiBudWxsOyAvLyBJRSBhbmQgTm9kZS5qcyArIGpzZG9tXG5cbnZhciBpc0lucHV0UGVuZGluZyA9IHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci5zY2hlZHVsaW5nICE9PSB1bmRlZmluZWQgJiYgbmF2aWdhdG9yLnNjaGVkdWxpbmcuaXNJbnB1dFBlbmRpbmcgIT09IHVuZGVmaW5lZCA/IG5hdmlnYXRvci5zY2hlZHVsaW5nLmlzSW5wdXRQZW5kaW5nLmJpbmQobmF2aWdhdG9yLnNjaGVkdWxpbmcpIDogbnVsbDtcblxuZnVuY3Rpb24gYWR2YW5jZVRpbWVycyhjdXJyZW50VGltZSkge1xuICAvLyBDaGVjayBmb3IgdGFza3MgdGhhdCBhcmUgbm8gbG9uZ2VyIGRlbGF5ZWQgYW5kIGFkZCB0aGVtIHRvIHRoZSBxdWV1ZS5cbiAgdmFyIHRpbWVyID0gcGVlayh0aW1lclF1ZXVlKTtcblxuICB3aGlsZSAodGltZXIgIT09IG51bGwpIHtcbiAgICBpZiAodGltZXIuY2FsbGJhY2sgPT09IG51bGwpIHtcbiAgICAgIC8vIFRpbWVyIHdhcyBjYW5jZWxsZWQuXG4gICAgICBwb3AodGltZXJRdWV1ZSk7XG4gICAgfSBlbHNlIGlmICh0aW1lci5zdGFydFRpbWUgPD0gY3VycmVudFRpbWUpIHtcbiAgICAgIC8vIFRpbWVyIGZpcmVkLiBUcmFuc2ZlciB0byB0aGUgdGFzayBxdWV1ZS5cbiAgICAgIHBvcCh0aW1lclF1ZXVlKTtcbiAgICAgIHRpbWVyLnNvcnRJbmRleCA9IHRpbWVyLmV4cGlyYXRpb25UaW1lO1xuICAgICAgcHVzaCh0YXNrUXVldWUsIHRpbWVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVtYWluaW5nIHRpbWVycyBhcmUgcGVuZGluZy5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aW1lciA9IHBlZWsodGltZXJRdWV1ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlVGltZW91dChjdXJyZW50VGltZSkge1xuICBpc0hvc3RUaW1lb3V0U2NoZWR1bGVkID0gZmFsc2U7XG4gIGFkdmFuY2VUaW1lcnMoY3VycmVudFRpbWUpO1xuXG4gIGlmICghaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQpIHtcbiAgICBpZiAocGVlayh0YXNrUXVldWUpICE9PSBudWxsKSB7XG4gICAgICBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9IHRydWU7XG4gICAgICByZXF1ZXN0SG9zdENhbGxiYWNrKGZsdXNoV29yayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBmaXJzdFRpbWVyID0gcGVlayh0aW1lclF1ZXVlKTtcblxuICAgICAgaWYgKGZpcnN0VGltZXIgIT09IG51bGwpIHtcbiAgICAgICAgcmVxdWVzdEhvc3RUaW1lb3V0KGhhbmRsZVRpbWVvdXQsIGZpcnN0VGltZXIuc3RhcnRUaW1lIC0gY3VycmVudFRpbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmbHVzaFdvcmsoaGFzVGltZVJlbWFpbmluZywgaW5pdGlhbFRpbWUpIHtcblxuXG4gIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gZmFsc2U7XG5cbiAgaWYgKGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQpIHtcbiAgICAvLyBXZSBzY2hlZHVsZWQgYSB0aW1lb3V0IGJ1dCBpdCdzIG5vIGxvbmdlciBuZWVkZWQuIENhbmNlbCBpdC5cbiAgICBpc0hvc3RUaW1lb3V0U2NoZWR1bGVkID0gZmFsc2U7XG4gICAgY2FuY2VsSG9zdFRpbWVvdXQoKTtcbiAgfVxuXG4gIGlzUGVyZm9ybWluZ1dvcmsgPSB0cnVlO1xuICB2YXIgcHJldmlvdXNQcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG5cbiAgdHJ5IHtcbiAgICBpZiAoZW5hYmxlUHJvZmlsaW5nKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gd29ya0xvb3AoaGFzVGltZVJlbWFpbmluZywgaW5pdGlhbFRpbWUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRUYXNrICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIGN1cnJlbnRUaW1lID0gZXhwb3J0cy51bnN0YWJsZV9ub3coKTtcbiAgICAgICAgICBtYXJrVGFza0Vycm9yZWQoY3VycmVudFRhc2ssIGN1cnJlbnRUaW1lKTtcbiAgICAgICAgICBjdXJyZW50VGFzay5pc1F1ZXVlZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIGNhdGNoIGluIHByb2QgY29kZSBwYXRoLlxuICAgICAgcmV0dXJuIHdvcmtMb29wKGhhc1RpbWVSZW1haW5pbmcsIGluaXRpYWxUaW1lKTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgY3VycmVudFRhc2sgPSBudWxsO1xuICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJldmlvdXNQcmlvcml0eUxldmVsO1xuICAgIGlzUGVyZm9ybWluZ1dvcmsgPSBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiB3b3JrTG9vcChoYXNUaW1lUmVtYWluaW5nLCBpbml0aWFsVGltZSkge1xuICB2YXIgY3VycmVudFRpbWUgPSBpbml0aWFsVGltZTtcbiAgYWR2YW5jZVRpbWVycyhjdXJyZW50VGltZSk7XG4gIGN1cnJlbnRUYXNrID0gcGVlayh0YXNrUXVldWUpO1xuXG4gIHdoaWxlIChjdXJyZW50VGFzayAhPT0gbnVsbCAmJiAhKGVuYWJsZVNjaGVkdWxlckRlYnVnZ2luZyApKSB7XG4gICAgaWYgKGN1cnJlbnRUYXNrLmV4cGlyYXRpb25UaW1lID4gY3VycmVudFRpbWUgJiYgKCFoYXNUaW1lUmVtYWluaW5nIHx8IHNob3VsZFlpZWxkVG9Ib3N0KCkpKSB7XG4gICAgICAvLyBUaGlzIGN1cnJlbnRUYXNrIGhhc24ndCBleHBpcmVkLCBhbmQgd2UndmUgcmVhY2hlZCB0aGUgZGVhZGxpbmUuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgY2FsbGJhY2sgPSBjdXJyZW50VGFzay5jYWxsYmFjaztcblxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGN1cnJlbnRUYXNrLmNhbGxiYWNrID0gbnVsbDtcbiAgICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gY3VycmVudFRhc2sucHJpb3JpdHlMZXZlbDtcbiAgICAgIHZhciBkaWRVc2VyQ2FsbGJhY2tUaW1lb3V0ID0gY3VycmVudFRhc2suZXhwaXJhdGlvblRpbWUgPD0gY3VycmVudFRpbWU7XG5cbiAgICAgIHZhciBjb250aW51YXRpb25DYWxsYmFjayA9IGNhbGxiYWNrKGRpZFVzZXJDYWxsYmFja1RpbWVvdXQpO1xuICAgICAgY3VycmVudFRpbWUgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpO1xuXG4gICAgICBpZiAodHlwZW9mIGNvbnRpbnVhdGlvbkNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGN1cnJlbnRUYXNrLmNhbGxiYWNrID0gY29udGludWF0aW9uQ2FsbGJhY2s7XG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIGlmIChjdXJyZW50VGFzayA9PT0gcGVlayh0YXNrUXVldWUpKSB7XG4gICAgICAgICAgcG9wKHRhc2tRdWV1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYWR2YW5jZVRpbWVycyhjdXJyZW50VGltZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvcCh0YXNrUXVldWUpO1xuICAgIH1cblxuICAgIGN1cnJlbnRUYXNrID0gcGVlayh0YXNrUXVldWUpO1xuICB9IC8vIFJldHVybiB3aGV0aGVyIHRoZXJlJ3MgYWRkaXRpb25hbCB3b3JrXG5cblxuICBpZiAoY3VycmVudFRhc2sgIT09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZmlyc3RUaW1lciA9IHBlZWsodGltZXJRdWV1ZSk7XG5cbiAgICBpZiAoZmlyc3RUaW1lciAhPT0gbnVsbCkge1xuICAgICAgcmVxdWVzdEhvc3RUaW1lb3V0KGhhbmRsZVRpbWVvdXQsIGZpcnN0VGltZXIuc3RhcnRUaW1lIC0gY3VycmVudFRpbWUpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9ydW5XaXRoUHJpb3JpdHkocHJpb3JpdHlMZXZlbCwgZXZlbnRIYW5kbGVyKSB7XG4gIHN3aXRjaCAocHJpb3JpdHlMZXZlbCkge1xuICAgIGNhc2UgSW1tZWRpYXRlUHJpb3JpdHk6XG4gICAgY2FzZSBVc2VyQmxvY2tpbmdQcmlvcml0eTpcbiAgICBjYXNlIE5vcm1hbFByaW9yaXR5OlxuICAgIGNhc2UgTG93UHJpb3JpdHk6XG4gICAgY2FzZSBJZGxlUHJpb3JpdHk6XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBwcmlvcml0eUxldmVsID0gTm9ybWFsUHJpb3JpdHk7XG4gIH1cblxuICB2YXIgcHJldmlvdXNQcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJpb3JpdHlMZXZlbDtcblxuICB0cnkge1xuICAgIHJldHVybiBldmVudEhhbmRsZXIoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByZXZpb3VzUHJpb3JpdHlMZXZlbDtcbiAgfVxufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9uZXh0KGV2ZW50SGFuZGxlcikge1xuICB2YXIgcHJpb3JpdHlMZXZlbDtcblxuICBzd2l0Y2ggKGN1cnJlbnRQcmlvcml0eUxldmVsKSB7XG4gICAgY2FzZSBJbW1lZGlhdGVQcmlvcml0eTpcbiAgICBjYXNlIFVzZXJCbG9ja2luZ1ByaW9yaXR5OlxuICAgIGNhc2UgTm9ybWFsUHJpb3JpdHk6XG4gICAgICAvLyBTaGlmdCBkb3duIHRvIG5vcm1hbCBwcmlvcml0eVxuICAgICAgcHJpb3JpdHlMZXZlbCA9IE5vcm1hbFByaW9yaXR5O1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgLy8gQW55dGhpbmcgbG93ZXIgdGhhbiBub3JtYWwgcHJpb3JpdHkgc2hvdWxkIHJlbWFpbiBhdCB0aGUgY3VycmVudCBsZXZlbC5cbiAgICAgIHByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgdmFyIHByZXZpb3VzUHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByaW9yaXR5TGV2ZWw7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZXZlbnRIYW5kbGVyKCk7XG4gIH0gZmluYWxseSB7XG4gICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmV2aW91c1ByaW9yaXR5TGV2ZWw7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfd3JhcENhbGxiYWNrKGNhbGxiYWNrKSB7XG4gIHZhciBwYXJlbnRQcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgLy8gVGhpcyBpcyBhIGZvcmsgb2YgcnVuV2l0aFByaW9yaXR5LCBpbmxpbmVkIGZvciBwZXJmb3JtYW5jZS5cbiAgICB2YXIgcHJldmlvdXNQcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwYXJlbnRQcmlvcml0eUxldmVsO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBjYWxsYmFjay5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByZXZpb3VzUHJpb3JpdHlMZXZlbDtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2socHJpb3JpdHlMZXZlbCwgY2FsbGJhY2ssIG9wdGlvbnMpIHtcbiAgdmFyIGN1cnJlbnRUaW1lID0gZXhwb3J0cy51bnN0YWJsZV9ub3coKTtcbiAgdmFyIHN0YXJ0VGltZTtcblxuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnICYmIG9wdGlvbnMgIT09IG51bGwpIHtcbiAgICB2YXIgZGVsYXkgPSBvcHRpb25zLmRlbGF5O1xuXG4gICAgaWYgKHR5cGVvZiBkZWxheSA9PT0gJ251bWJlcicgJiYgZGVsYXkgPiAwKSB7XG4gICAgICBzdGFydFRpbWUgPSBjdXJyZW50VGltZSArIGRlbGF5O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGFydFRpbWUgPSBjdXJyZW50VGltZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc3RhcnRUaW1lID0gY3VycmVudFRpbWU7XG4gIH1cblxuICB2YXIgdGltZW91dDtcblxuICBzd2l0Y2ggKHByaW9yaXR5TGV2ZWwpIHtcbiAgICBjYXNlIEltbWVkaWF0ZVByaW9yaXR5OlxuICAgICAgdGltZW91dCA9IElNTUVESUFURV9QUklPUklUWV9USU1FT1VUO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFVzZXJCbG9ja2luZ1ByaW9yaXR5OlxuICAgICAgdGltZW91dCA9IFVTRVJfQkxPQ0tJTkdfUFJJT1JJVFlfVElNRU9VVDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBJZGxlUHJpb3JpdHk6XG4gICAgICB0aW1lb3V0ID0gSURMRV9QUklPUklUWV9USU1FT1VUO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIExvd1ByaW9yaXR5OlxuICAgICAgdGltZW91dCA9IExPV19QUklPUklUWV9USU1FT1VUO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIE5vcm1hbFByaW9yaXR5OlxuICAgIGRlZmF1bHQ6XG4gICAgICB0aW1lb3V0ID0gTk9STUFMX1BSSU9SSVRZX1RJTUVPVVQ7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHZhciBleHBpcmF0aW9uVGltZSA9IHN0YXJ0VGltZSArIHRpbWVvdXQ7XG4gIHZhciBuZXdUYXNrID0ge1xuICAgIGlkOiB0YXNrSWRDb3VudGVyKyssXG4gICAgY2FsbGJhY2s6IGNhbGxiYWNrLFxuICAgIHByaW9yaXR5TGV2ZWw6IHByaW9yaXR5TGV2ZWwsXG4gICAgc3RhcnRUaW1lOiBzdGFydFRpbWUsXG4gICAgZXhwaXJhdGlvblRpbWU6IGV4cGlyYXRpb25UaW1lLFxuICAgIHNvcnRJbmRleDogLTFcbiAgfTtcblxuICBpZiAoc3RhcnRUaW1lID4gY3VycmVudFRpbWUpIHtcbiAgICAvLyBUaGlzIGlzIGEgZGVsYXllZCB0YXNrLlxuICAgIG5ld1Rhc2suc29ydEluZGV4ID0gc3RhcnRUaW1lO1xuICAgIHB1c2godGltZXJRdWV1ZSwgbmV3VGFzayk7XG5cbiAgICBpZiAocGVlayh0YXNrUXVldWUpID09PSBudWxsICYmIG5ld1Rhc2sgPT09IHBlZWsodGltZXJRdWV1ZSkpIHtcbiAgICAgIC8vIEFsbCB0YXNrcyBhcmUgZGVsYXllZCwgYW5kIHRoaXMgaXMgdGhlIHRhc2sgd2l0aCB0aGUgZWFybGllc3QgZGVsYXkuXG4gICAgICBpZiAoaXNIb3N0VGltZW91dFNjaGVkdWxlZCkge1xuICAgICAgICAvLyBDYW5jZWwgYW4gZXhpc3RpbmcgdGltZW91dC5cbiAgICAgICAgY2FuY2VsSG9zdFRpbWVvdXQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgfSAvLyBTY2hlZHVsZSBhIHRpbWVvdXQuXG5cblxuICAgICAgcmVxdWVzdEhvc3RUaW1lb3V0KGhhbmRsZVRpbWVvdXQsIHN0YXJ0VGltZSAtIGN1cnJlbnRUaW1lKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbmV3VGFzay5zb3J0SW5kZXggPSBleHBpcmF0aW9uVGltZTtcbiAgICBwdXNoKHRhc2tRdWV1ZSwgbmV3VGFzayk7XG4gICAgLy8gd2FpdCB1bnRpbCB0aGUgbmV4dCB0aW1lIHdlIHlpZWxkLlxuXG5cbiAgICBpZiAoIWlzSG9zdENhbGxiYWNrU2NoZWR1bGVkICYmICFpc1BlcmZvcm1pbmdXb3JrKSB7XG4gICAgICBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9IHRydWU7XG4gICAgICByZXF1ZXN0SG9zdENhbGxiYWNrKGZsdXNoV29yayk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld1Rhc2s7XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX3BhdXNlRXhlY3V0aW9uKCkge1xufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9jb250aW51ZUV4ZWN1dGlvbigpIHtcblxuICBpZiAoIWlzSG9zdENhbGxiYWNrU2NoZWR1bGVkICYmICFpc1BlcmZvcm1pbmdXb3JrKSB7XG4gICAgaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgPSB0cnVlO1xuICAgIHJlcXVlc3RIb3N0Q2FsbGJhY2soZmx1c2hXb3JrKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9nZXRGaXJzdENhbGxiYWNrTm9kZSgpIHtcbiAgcmV0dXJuIHBlZWsodGFza1F1ZXVlKTtcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfY2FuY2VsQ2FsbGJhY2sodGFzaykge1xuICAvLyByZW1vdmUgZnJvbSB0aGUgcXVldWUgYmVjYXVzZSB5b3UgY2FuJ3QgcmVtb3ZlIGFyYml0cmFyeSBub2RlcyBmcm9tIGFuXG4gIC8vIGFycmF5IGJhc2VkIGhlYXAsIG9ubHkgdGhlIGZpcnN0IG9uZS4pXG5cblxuICB0YXNrLmNhbGxiYWNrID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwoKSB7XG4gIHJldHVybiBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbn1cblxudmFyIGlzTWVzc2FnZUxvb3BSdW5uaW5nID0gZmFsc2U7XG52YXIgc2NoZWR1bGVkSG9zdENhbGxiYWNrID0gbnVsbDtcbnZhciB0YXNrVGltZW91dElEID0gLTE7IC8vIFNjaGVkdWxlciBwZXJpb2RpY2FsbHkgeWllbGRzIGluIGNhc2UgdGhlcmUgaXMgb3RoZXIgd29yayBvbiB0aGUgbWFpblxuLy8gdGhyZWFkLCBsaWtlIHVzZXIgZXZlbnRzLiBCeSBkZWZhdWx0LCBpdCB5aWVsZHMgbXVsdGlwbGUgdGltZXMgcGVyIGZyYW1lLlxuLy8gSXQgZG9lcyBub3QgYXR0ZW1wdCB0byBhbGlnbiB3aXRoIGZyYW1lIGJvdW5kYXJpZXMsIHNpbmNlIG1vc3QgdGFza3MgZG9uJ3Rcbi8vIG5lZWQgdG8gYmUgZnJhbWUgYWxpZ25lZDsgZm9yIHRob3NlIHRoYXQgZG8sIHVzZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUuXG5cbnZhciBmcmFtZUludGVydmFsID0gZnJhbWVZaWVsZE1zO1xudmFyIHN0YXJ0VGltZSA9IC0xO1xuXG5mdW5jdGlvbiBzaG91bGRZaWVsZFRvSG9zdCgpIHtcbiAgdmFyIHRpbWVFbGFwc2VkID0gZXhwb3J0cy51bnN0YWJsZV9ub3coKSAtIHN0YXJ0VGltZTtcblxuICBpZiAodGltZUVsYXBzZWQgPCBmcmFtZUludGVydmFsKSB7XG4gICAgLy8gVGhlIG1haW4gdGhyZWFkIGhhcyBvbmx5IGJlZW4gYmxvY2tlZCBmb3IgYSByZWFsbHkgc2hvcnQgYW1vdW50IG9mIHRpbWU7XG4gICAgLy8gc21hbGxlciB0aGFuIGEgc2luZ2xlIGZyYW1lLiBEb24ndCB5aWVsZCB5ZXQuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IC8vIFRoZSBtYWluIHRocmVhZCBoYXMgYmVlbiBibG9ja2VkIGZvciBhIG5vbi1uZWdsaWdpYmxlIGFtb3VudCBvZiB0aW1lLiBXZVxuXG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RQYWludCgpIHtcblxufVxuXG5mdW5jdGlvbiBmb3JjZUZyYW1lUmF0ZShmcHMpIHtcbiAgaWYgKGZwcyA8IDAgfHwgZnBzID4gMTI1KSB7XG4gICAgLy8gVXNpbmcgY29uc29sZVsnZXJyb3InXSB0byBldmFkZSBCYWJlbCBhbmQgRVNMaW50XG4gICAgY29uc29sZVsnZXJyb3InXSgnZm9yY2VGcmFtZVJhdGUgdGFrZXMgYSBwb3NpdGl2ZSBpbnQgYmV0d2VlbiAwIGFuZCAxMjUsICcgKyAnZm9yY2luZyBmcmFtZSByYXRlcyBoaWdoZXIgdGhhbiAxMjUgZnBzIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoZnBzID4gMCkge1xuICAgIGZyYW1lSW50ZXJ2YWwgPSBNYXRoLmZsb29yKDEwMDAgLyBmcHMpO1xuICB9IGVsc2Uge1xuICAgIC8vIHJlc2V0IHRoZSBmcmFtZXJhdGVcbiAgICBmcmFtZUludGVydmFsID0gZnJhbWVZaWVsZE1zO1xuICB9XG59XG5cbnZhciBwZXJmb3JtV29ya1VudGlsRGVhZGxpbmUgPSBmdW5jdGlvbiAoKSB7XG4gIGlmIChzY2hlZHVsZWRIb3N0Q2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICB2YXIgY3VycmVudFRpbWUgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpOyAvLyBLZWVwIHRyYWNrIG9mIHRoZSBzdGFydCB0aW1lIHNvIHdlIGNhbiBtZWFzdXJlIGhvdyBsb25nIHRoZSBtYWluIHRocmVhZFxuICAgIC8vIGhhcyBiZWVuIGJsb2NrZWQuXG5cbiAgICBzdGFydFRpbWUgPSBjdXJyZW50VGltZTtcbiAgICB2YXIgaGFzVGltZVJlbWFpbmluZyA9IHRydWU7IC8vIElmIGEgc2NoZWR1bGVyIHRhc2sgdGhyb3dzLCBleGl0IHRoZSBjdXJyZW50IGJyb3dzZXIgdGFzayBzbyB0aGVcbiAgICAvLyBlcnJvciBjYW4gYmUgb2JzZXJ2ZWQuXG4gICAgLy9cbiAgICAvLyBJbnRlbnRpb25hbGx5IG5vdCB1c2luZyBhIHRyeS1jYXRjaCwgc2luY2UgdGhhdCBtYWtlcyBzb21lIGRlYnVnZ2luZ1xuICAgIC8vIHRlY2huaXF1ZXMgaGFyZGVyLiBJbnN0ZWFkLCBpZiBgc2NoZWR1bGVkSG9zdENhbGxiYWNrYCBlcnJvcnMsIHRoZW5cbiAgICAvLyBgaGFzTW9yZVdvcmtgIHdpbGwgcmVtYWluIHRydWUsIGFuZCB3ZSdsbCBjb250aW51ZSB0aGUgd29yayBsb29wLlxuXG4gICAgdmFyIGhhc01vcmVXb3JrID0gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICBoYXNNb3JlV29yayA9IHNjaGVkdWxlZEhvc3RDYWxsYmFjayhoYXNUaW1lUmVtYWluaW5nLCBjdXJyZW50VGltZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChoYXNNb3JlV29yaykge1xuICAgICAgICAvLyBJZiB0aGVyZSdzIG1vcmUgd29yaywgc2NoZWR1bGUgdGhlIG5leHQgbWVzc2FnZSBldmVudCBhdCB0aGUgZW5kXG4gICAgICAgIC8vIG9mIHRoZSBwcmVjZWRpbmcgb25lLlxuICAgICAgICBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXNNZXNzYWdlTG9vcFJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgc2NoZWR1bGVkSG9zdENhbGxiYWNrID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaXNNZXNzYWdlTG9vcFJ1bm5pbmcgPSBmYWxzZTtcbiAgfSAvLyBZaWVsZGluZyB0byB0aGUgYnJvd3NlciB3aWxsIGdpdmUgaXQgYSBjaGFuY2UgdG8gcGFpbnQsIHNvIHdlIGNhblxufTtcblxudmFyIHNjaGVkdWxlUGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lO1xuXG5pZiAodHlwZW9mIGxvY2FsU2V0SW1tZWRpYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIE5vZGUuanMgYW5kIG9sZCBJRS5cbiAgLy8gVGhlcmUncyBhIGZldyByZWFzb25zIGZvciB3aHkgd2UgcHJlZmVyIHNldEltbWVkaWF0ZS5cbiAgLy9cbiAgLy8gVW5saWtlIE1lc3NhZ2VDaGFubmVsLCBpdCBkb2Vzbid0IHByZXZlbnQgYSBOb2RlLmpzIHByb2Nlc3MgZnJvbSBleGl0aW5nLlxuICAvLyAoRXZlbiB0aG91Z2ggdGhpcyBpcyBhIERPTSBmb3JrIG9mIHRoZSBTY2hlZHVsZXIsIHlvdSBjb3VsZCBnZXQgaGVyZVxuICAvLyB3aXRoIGEgbWl4IG9mIE5vZGUuanMgMTUrLCB3aGljaCBoYXMgYSBNZXNzYWdlQ2hhbm5lbCwgYW5kIGpzZG9tLilcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8yMDc1NlxuICAvL1xuICAvLyBCdXQgYWxzbywgaXQgcnVucyBlYXJsaWVyIHdoaWNoIGlzIHRoZSBzZW1hbnRpYyB3ZSB3YW50LlxuICAvLyBJZiBvdGhlciBicm93c2VycyBldmVyIGltcGxlbWVudCBpdCwgaXQncyBiZXR0ZXIgdG8gdXNlIGl0LlxuICAvLyBBbHRob3VnaCBib3RoIG9mIHRoZXNlIHdvdWxkIGJlIGluZmVyaW9yIHRvIG5hdGl2ZSBzY2hlZHVsaW5nLlxuICBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBsb2NhbFNldEltbWVkaWF0ZShwZXJmb3JtV29ya1VudGlsRGVhZGxpbmUpO1xuICB9O1xufSBlbHNlIGlmICh0eXBlb2YgTWVzc2FnZUNoYW5uZWwgIT09ICd1bmRlZmluZWQnKSB7XG4gIC8vIERPTSBhbmQgV29ya2VyIGVudmlyb25tZW50cy5cbiAgLy8gV2UgcHJlZmVyIE1lc3NhZ2VDaGFubmVsIGJlY2F1c2Ugb2YgdGhlIDRtcyBzZXRUaW1lb3V0IGNsYW1waW5nLlxuICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICB2YXIgcG9ydCA9IGNoYW5uZWwucG9ydDI7XG4gIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gcGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lO1xuXG4gIHNjaGVkdWxlUGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lID0gZnVuY3Rpb24gKCkge1xuICAgIHBvcnQucG9zdE1lc3NhZ2UobnVsbCk7XG4gIH07XG59IGVsc2Uge1xuICAvLyBXZSBzaG91bGQgb25seSBmYWxsYmFjayBoZXJlIGluIG5vbi1icm93c2VyIGVudmlyb25tZW50cy5cbiAgc2NoZWR1bGVQZXJmb3JtV29ya1VudGlsRGVhZGxpbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgbG9jYWxTZXRUaW1lb3V0KHBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSwgMCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RIb3N0Q2FsbGJhY2soY2FsbGJhY2spIHtcbiAgc2NoZWR1bGVkSG9zdENhbGxiYWNrID0gY2FsbGJhY2s7XG5cbiAgaWYgKCFpc01lc3NhZ2VMb29wUnVubmluZykge1xuICAgIGlzTWVzc2FnZUxvb3BSdW5uaW5nID0gdHJ1ZTtcbiAgICBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RIb3N0VGltZW91dChjYWxsYmFjaywgbXMpIHtcbiAgdGFza1RpbWVvdXRJRCA9IGxvY2FsU2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgY2FsbGJhY2soZXhwb3J0cy51bnN0YWJsZV9ub3coKSk7XG4gIH0sIG1zKTtcbn1cblxuZnVuY3Rpb24gY2FuY2VsSG9zdFRpbWVvdXQoKSB7XG4gIGxvY2FsQ2xlYXJUaW1lb3V0KHRhc2tUaW1lb3V0SUQpO1xuICB0YXNrVGltZW91dElEID0gLTE7XG59XG5cbnZhciB1bnN0YWJsZV9yZXF1ZXN0UGFpbnQgPSByZXF1ZXN0UGFpbnQ7XG52YXIgdW5zdGFibGVfUHJvZmlsaW5nID0gIG51bGw7XG5cbmV4cG9ydHMudW5zdGFibGVfSWRsZVByaW9yaXR5ID0gSWRsZVByaW9yaXR5O1xuZXhwb3J0cy51bnN0YWJsZV9JbW1lZGlhdGVQcmlvcml0eSA9IEltbWVkaWF0ZVByaW9yaXR5O1xuZXhwb3J0cy51bnN0YWJsZV9Mb3dQcmlvcml0eSA9IExvd1ByaW9yaXR5O1xuZXhwb3J0cy51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eSA9IE5vcm1hbFByaW9yaXR5O1xuZXhwb3J0cy51bnN0YWJsZV9Qcm9maWxpbmcgPSB1bnN0YWJsZV9Qcm9maWxpbmc7XG5leHBvcnRzLnVuc3RhYmxlX1VzZXJCbG9ja2luZ1ByaW9yaXR5ID0gVXNlckJsb2NraW5nUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrID0gdW5zdGFibGVfY2FuY2VsQ2FsbGJhY2s7XG5leHBvcnRzLnVuc3RhYmxlX2NvbnRpbnVlRXhlY3V0aW9uID0gdW5zdGFibGVfY29udGludWVFeGVjdXRpb247XG5leHBvcnRzLnVuc3RhYmxlX2ZvcmNlRnJhbWVSYXRlID0gZm9yY2VGcmFtZVJhdGU7XG5leHBvcnRzLnVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsID0gdW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWw7XG5leHBvcnRzLnVuc3RhYmxlX2dldEZpcnN0Q2FsbGJhY2tOb2RlID0gdW5zdGFibGVfZ2V0Rmlyc3RDYWxsYmFja05vZGU7XG5leHBvcnRzLnVuc3RhYmxlX25leHQgPSB1bnN0YWJsZV9uZXh0O1xuZXhwb3J0cy51bnN0YWJsZV9wYXVzZUV4ZWN1dGlvbiA9IHVuc3RhYmxlX3BhdXNlRXhlY3V0aW9uO1xuZXhwb3J0cy51bnN0YWJsZV9yZXF1ZXN0UGFpbnQgPSB1bnN0YWJsZV9yZXF1ZXN0UGFpbnQ7XG5leHBvcnRzLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eSA9IHVuc3RhYmxlX3J1bldpdGhQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayA9IHVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2s7XG5leHBvcnRzLnVuc3RhYmxlX3Nob3VsZFlpZWxkID0gc2hvdWxkWWllbGRUb0hvc3Q7XG5leHBvcnRzLnVuc3RhYmxlX3dyYXBDYWxsYmFjayA9IHVuc3RhYmxlX3dyYXBDYWxsYmFjaztcbiAgICAgICAgICAvKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG5pZiAoXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcChuZXcgRXJyb3IoKSk7XG59XG4gICAgICAgIFxuICB9KSgpO1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9zY2hlZHVsZXIucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvc2NoZWR1bGVyLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcblxuICAgICAgICAgICd1c2Ugc3RyaWN0JztcblxuLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydCA9PT1cbiAgICAnZnVuY3Rpb24nXG4pIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydChuZXcgRXJyb3IoKSk7XG59XG4gICAgICAgICAgdmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcbnZhciBTY2hlZHVsZXIgPSByZXF1aXJlKCdzY2hlZHVsZXInKTtcblxudmFyIFJlYWN0U2hhcmVkSW50ZXJuYWxzID0gUmVhY3QuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ7XG5cbnZhciBzdXBwcmVzc1dhcm5pbmcgPSBmYWxzZTtcbmZ1bmN0aW9uIHNldFN1cHByZXNzV2FybmluZyhuZXdTdXBwcmVzc1dhcm5pbmcpIHtcbiAge1xuICAgIHN1cHByZXNzV2FybmluZyA9IG5ld1N1cHByZXNzV2FybmluZztcbiAgfVxufSAvLyBJbiBERVYsIGNhbGxzIHRvIGNvbnNvbGUud2FybiBhbmQgY29uc29sZS5lcnJvciBnZXQgcmVwbGFjZWRcbi8vIGJ5IGNhbGxzIHRvIHRoZXNlIG1ldGhvZHMgYnkgYSBCYWJlbCBwbHVnaW4uXG4vL1xuLy8gSW4gUFJPRCAob3IgaW4gcGFja2FnZXMgd2l0aG91dCBhY2Nlc3MgdG8gUmVhY3QgaW50ZXJuYWxzKSxcbi8vIHRoZXkgYXJlIGxlZnQgYXMgdGhleSBhcmUgaW5zdGVhZC5cblxuZnVuY3Rpb24gd2Fybihmb3JtYXQpIHtcbiAge1xuICAgIGlmICghc3VwcHJlc3NXYXJuaW5nKSB7XG4gICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuXG4gICAgICBwcmludFdhcm5pbmcoJ3dhcm4nLCBmb3JtYXQsIGFyZ3MpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZXJyb3IoZm9ybWF0KSB7XG4gIHtcbiAgICBpZiAoIXN1cHByZXNzV2FybmluZykge1xuICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yID4gMSA/IF9sZW4yIC0gMSA6IDApLCBfa2V5MiA9IDE7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgICAgYXJnc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgIH1cblxuICAgICAgcHJpbnRXYXJuaW5nKCdlcnJvcicsIGZvcm1hdCwgYXJncyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHByaW50V2FybmluZyhsZXZlbCwgZm9ybWF0LCBhcmdzKSB7XG4gIC8vIFdoZW4gY2hhbmdpbmcgdGhpcyBsb2dpYywgeW91IG1pZ2h0IHdhbnQgdG8gYWxzb1xuICAvLyB1cGRhdGUgY29uc29sZVdpdGhTdGFja0Rldi53d3cuanMgYXMgd2VsbC5cbiAge1xuICAgIHZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcbiAgICB2YXIgc3RhY2sgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldFN0YWNrQWRkZW5kdW0oKTtcblxuICAgIGlmIChzdGFjayAhPT0gJycpIHtcbiAgICAgIGZvcm1hdCArPSAnJXMnO1xuICAgICAgYXJncyA9IGFyZ3MuY29uY2F0KFtzdGFja10pO1xuICAgIH0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG5cblxuICAgIHZhciBhcmdzV2l0aEZvcm1hdCA9IGFyZ3MubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKGl0ZW0pO1xuICAgIH0pOyAvLyBDYXJlZnVsOiBSTiBjdXJyZW50bHkgZGVwZW5kcyBvbiB0aGlzIHByZWZpeFxuXG4gICAgYXJnc1dpdGhGb3JtYXQudW5zaGlmdCgnV2FybmluZzogJyArIGZvcm1hdCk7IC8vIFdlIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIHNwcmVhZCAob3IgLmFwcGx5KSBkaXJlY3RseSBiZWNhdXNlIGl0XG4gICAgLy8gYnJlYWtzIElFOTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMzYxMFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmdcblxuICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKGNvbnNvbGVbbGV2ZWxdLCBjb25zb2xlLCBhcmdzV2l0aEZvcm1hdCk7XG4gIH1cbn1cblxudmFyIEZ1bmN0aW9uQ29tcG9uZW50ID0gMDtcbnZhciBDbGFzc0NvbXBvbmVudCA9IDE7XG52YXIgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudCA9IDI7IC8vIEJlZm9yZSB3ZSBrbm93IHdoZXRoZXIgaXQgaXMgZnVuY3Rpb24gb3IgY2xhc3NcblxudmFyIEhvc3RSb290ID0gMzsgLy8gUm9vdCBvZiBhIGhvc3QgdHJlZS4gQ291bGQgYmUgbmVzdGVkIGluc2lkZSBhbm90aGVyIG5vZGUuXG5cbnZhciBIb3N0UG9ydGFsID0gNDsgLy8gQSBzdWJ0cmVlLiBDb3VsZCBiZSBhbiBlbnRyeSBwb2ludCB0byBhIGRpZmZlcmVudCByZW5kZXJlci5cblxudmFyIEhvc3RDb21wb25lbnQgPSA1O1xudmFyIEhvc3RUZXh0ID0gNjtcbnZhciBGcmFnbWVudCA9IDc7XG52YXIgTW9kZSA9IDg7XG52YXIgQ29udGV4dENvbnN1bWVyID0gOTtcbnZhciBDb250ZXh0UHJvdmlkZXIgPSAxMDtcbnZhciBGb3J3YXJkUmVmID0gMTE7XG52YXIgUHJvZmlsZXIgPSAxMjtcbnZhciBTdXNwZW5zZUNvbXBvbmVudCA9IDEzO1xudmFyIE1lbW9Db21wb25lbnQgPSAxNDtcbnZhciBTaW1wbGVNZW1vQ29tcG9uZW50ID0gMTU7XG52YXIgTGF6eUNvbXBvbmVudCA9IDE2O1xudmFyIEluY29tcGxldGVDbGFzc0NvbXBvbmVudCA9IDE3O1xudmFyIERlaHlkcmF0ZWRGcmFnbWVudCA9IDE4O1xudmFyIFN1c3BlbnNlTGlzdENvbXBvbmVudCA9IDE5O1xudmFyIFNjb3BlQ29tcG9uZW50ID0gMjE7XG52YXIgT2Zmc2NyZWVuQ29tcG9uZW50ID0gMjI7XG52YXIgTGVnYWN5SGlkZGVuQ29tcG9uZW50ID0gMjM7XG52YXIgQ2FjaGVDb21wb25lbnQgPSAyNDtcbnZhciBUcmFjaW5nTWFya2VyQ29tcG9uZW50ID0gMjU7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnZhciBlbmFibGVDbGllbnRSZW5kZXJGYWxsYmFja09uVGV4dE1pc21hdGNoID0gdHJ1ZTsgLy8gVE9ETzogTmVlZCB0byByZXZpZXcgdGhpcyBjb2RlIG9uZSBtb3JlIHRpbWUgYmVmb3JlIGxhbmRpbmdcbi8vIHRoZSByZWFjdC1yZWNvbmNpbGVyIHBhY2thZ2UuXG5cbnZhciBlbmFibGVOZXdSZWNvbmNpbGVyID0gZmFsc2U7IC8vIFN1cHBvcnQgbGVnYWN5IFByaW1lciBzdXBwb3J0IG9uIGludGVybmFsIEZCIHd3d1xuXG52YXIgZW5hYmxlTGF6eUNvbnRleHRQcm9wYWdhdGlvbiA9IGZhbHNlOyAvLyBGQi1vbmx5IHVzYWdlLiBUaGUgbmV3IEFQSSBoYXMgZGlmZmVyZW50IHNlbWFudGljcy5cblxudmFyIGVuYWJsZUxlZ2FjeUhpZGRlbiA9IGZhbHNlOyAvLyBFbmFibGVzIHVuc3RhYmxlX2F2b2lkVGhpc0ZhbGxiYWNrIGZlYXR1cmUgaW4gRmliZXJcblxudmFyIGVuYWJsZVN1c3BlbnNlQXZvaWRUaGlzRmFsbGJhY2sgPSBmYWxzZTsgLy8gRW5hYmxlcyB1bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFjayBmZWF0dXJlIGluIEZpenpcbi8vIFJlYWN0IERPTSBDaG9wcGluZyBCbG9ja1xuLy9cbi8vIFNpbWlsYXIgdG8gbWFpbiBDaG9wcGluZyBCbG9jayBidXQgb25seSBmbGFncyByZWxhdGVkIHRvIFJlYWN0IERPTS4gVGhlc2UgYXJlXG4vLyBncm91cGVkIGJlY2F1c2Ugd2Ugd2lsbCBsaWtlbHkgYmF0Y2ggYWxsIG9mIHRoZW0gaW50byBhIHNpbmdsZSBtYWpvciByZWxlYXNlLlxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERpc2FibGUgc3VwcG9ydCBmb3IgY29tbWVudCBub2RlcyBhcyBSZWFjdCBET00gY29udGFpbmVycy4gQWxyZWFkeSBkaXNhYmxlZFxuLy8gaW4gb3BlbiBzb3VyY2UsIGJ1dCB3d3cgY29kZWJhc2Ugc3RpbGwgcmVsaWVzIG9uIGl0LiBOZWVkIHRvIHJlbW92ZS5cblxudmFyIGRpc2FibGVDb21tZW50c0FzRE9NQ29udGFpbmVycyA9IHRydWU7IC8vIERpc2FibGUgamF2YXNjcmlwdDogVVJMIHN0cmluZ3MgaW4gaHJlZiBmb3IgWFNTIHByb3RlY3Rpb24uXG4vLyBhbmQgY2xpZW50IHJlbmRlcmluZywgbW9zdGx5IHRvIGFsbG93IEpTWCBhdHRyaWJ1dGVzIHRvIGFwcGx5IHRvIHRoZSBjdXN0b21cbi8vIGVsZW1lbnQncyBvYmplY3QgcHJvcGVydGllcyBpbnN0ZWFkIG9mIG9ubHkgSFRNTCBhdHRyaWJ1dGVzLlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMTM0N1xuXG52YXIgZW5hYmxlQ3VzdG9tRWxlbWVudFByb3BlcnR5U3VwcG9ydCA9IGZhbHNlOyAvLyBEaXNhYmxlcyBjaGlsZHJlbiBmb3IgPHRleHRhcmVhPiBlbGVtZW50c1xudmFyIHdhcm5BYm91dFN0cmluZ1JlZnMgPSB0cnVlOyAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRGVidWdnaW5nIGFuZCBEZXZUb29sc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEFkZHMgdXNlciB0aW1pbmcgbWFya3MgZm9yIGUuZy4gc3RhdGUgdXBkYXRlcywgc3VzcGVuc2UsIGFuZCB3b3JrIGxvb3Agc3R1ZmYsXG4vLyBmb3IgYW4gZXhwZXJpbWVudGFsIHRpbWVsaW5lIHRvb2wuXG5cbnZhciBlbmFibGVTY2hlZHVsaW5nUHJvZmlsZXIgPSB0cnVlOyAvLyBIZWxwcyBpZGVudGlmeSBzaWRlIGVmZmVjdHMgaW4gcmVuZGVyLXBoYXNlIGxpZmVjeWNsZSBob29rcyBhbmQgc2V0U3RhdGVcblxudmFyIGVuYWJsZVByb2ZpbGVyVGltZXIgPSB0cnVlOyAvLyBSZWNvcmQgZHVyYXRpb25zIGZvciBjb21taXQgYW5kIHBhc3NpdmUgZWZmZWN0cyBwaGFzZXMuXG5cbnZhciBlbmFibGVQcm9maWxlckNvbW1pdEhvb2tzID0gdHJ1ZTsgLy8gUGhhc2UgcGFyYW0gcGFzc2VkIHRvIG9uUmVuZGVyIGNhbGxiYWNrIGRpZmZlcmVudGlhdGVzIGJldHdlZW4gYW4gXCJ1cGRhdGVcIiBhbmQgYSBcImNhc2NhZGluZy11cGRhdGVcIi5cblxudmFyIGFsbE5hdGl2ZUV2ZW50cyA9IG5ldyBTZXQoKTtcbi8qKlxuICogTWFwcGluZyBmcm9tIHJlZ2lzdHJhdGlvbiBuYW1lIHRvIGV2ZW50IG5hbWVcbiAqL1xuXG5cbnZhciByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzID0ge307XG4vKipcbiAqIE1hcHBpbmcgZnJvbSBsb3dlcmNhc2UgcmVnaXN0cmF0aW9uIG5hbWVzIHRvIHRoZSBwcm9wZXJseSBjYXNlZCB2ZXJzaW9uLFxuICogdXNlZCB0byB3YXJuIGluIHRoZSBjYXNlIG9mIG1pc3NpbmcgZXZlbnQgaGFuZGxlcnMuIEF2YWlsYWJsZVxuICogb25seSBpbiB0cnVlLlxuICogQHR5cGUge09iamVjdH1cbiAqL1xuXG52YXIgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lcyA9ICB7fSA7IC8vIFRydXN0IHRoZSBkZXZlbG9wZXIgdG8gb25seSB1c2UgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lcyBpbiB0cnVlXG5cbmZ1bmN0aW9uIHJlZ2lzdGVyVHdvUGhhc2VFdmVudChyZWdpc3RyYXRpb25OYW1lLCBkZXBlbmRlbmNpZXMpIHtcbiAgcmVnaXN0ZXJEaXJlY3RFdmVudChyZWdpc3RyYXRpb25OYW1lLCBkZXBlbmRlbmNpZXMpO1xuICByZWdpc3RlckRpcmVjdEV2ZW50KHJlZ2lzdHJhdGlvbk5hbWUgKyAnQ2FwdHVyZScsIGRlcGVuZGVuY2llcyk7XG59XG5mdW5jdGlvbiByZWdpc3RlckRpcmVjdEV2ZW50KHJlZ2lzdHJhdGlvbk5hbWUsIGRlcGVuZGVuY2llcykge1xuICB7XG4gICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXNbcmVnaXN0cmF0aW9uTmFtZV0pIHtcbiAgICAgIGVycm9yKCdFdmVudFJlZ2lzdHJ5OiBNb3JlIHRoYW4gb25lIHBsdWdpbiBhdHRlbXB0ZWQgdG8gcHVibGlzaCB0aGUgc2FtZSAnICsgJ3JlZ2lzdHJhdGlvbiBuYW1lLCBgJXNgLicsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXNbcmVnaXN0cmF0aW9uTmFtZV0gPSBkZXBlbmRlbmNpZXM7XG5cbiAge1xuICAgIHZhciBsb3dlckNhc2VkTmFtZSA9IHJlZ2lzdHJhdGlvbk5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzW2xvd2VyQ2FzZWROYW1lXSA9IHJlZ2lzdHJhdGlvbk5hbWU7XG5cbiAgICBpZiAocmVnaXN0cmF0aW9uTmFtZSA9PT0gJ29uRG91YmxlQ2xpY2snKSB7XG4gICAgICBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzLm9uZGJsY2xpY2sgPSByZWdpc3RyYXRpb25OYW1lO1xuICAgIH1cbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZGVwZW5kZW5jaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgYWxsTmF0aXZlRXZlbnRzLmFkZChkZXBlbmRlbmNpZXNbaV0pO1xuICB9XG59XG5cbnZhciBjYW5Vc2VET00gPSAhISh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgIT09ICd1bmRlZmluZWQnKTtcblxudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuLypcbiAqIFRoZSBgJycgKyB2YWx1ZWAgcGF0dGVybiAodXNlZCBpbiBpbiBwZXJmLXNlbnNpdGl2ZSBjb2RlKSB0aHJvd3MgZm9yIFN5bWJvbFxuICogYW5kIFRlbXBvcmFsLiogdHlwZXMuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8yMjA2NC5cbiAqXG4gKiBUaGUgZnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlIHdpbGwgdGhyb3cgYW4gZWFzaWVyLXRvLXVuZGVyc3RhbmQsXG4gKiBlYXNpZXItdG8tZGVidWcgZXhjZXB0aW9uIHdpdGggYSBjbGVhciBlcnJvcnMgbWVzc2FnZSBtZXNzYWdlIGV4cGxhaW5pbmcgdGhlXG4gKiBwcm9ibGVtLiAoSW5zdGVhZCBvZiBhIGNvbmZ1c2luZyBleGNlcHRpb24gdGhyb3duIGluc2lkZSB0aGUgaW1wbGVtZW50YXRpb25cbiAqIG9mIHRoZSBgdmFsdWVgIG9iamVjdCkuXG4gKi9cbi8vICRGbG93Rml4TWUgb25seSBjYWxsZWQgaW4gREVWLCBzbyB2b2lkIHJldHVybiBpcyBub3QgcG9zc2libGUuXG5mdW5jdGlvbiB0eXBlTmFtZSh2YWx1ZSkge1xuICB7XG4gICAgLy8gdG9TdHJpbmdUYWcgaXMgbmVlZGVkIGZvciBuYW1lc3BhY2VkIHR5cGVzIGxpa2UgVGVtcG9yYWwuSW5zdGFudFxuICAgIHZhciBoYXNUb1N0cmluZ1RhZyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLnRvU3RyaW5nVGFnO1xuICAgIHZhciB0eXBlID0gaGFzVG9TdHJpbmdUYWcgJiYgdmFsdWVbU3ltYm9sLnRvU3RyaW5nVGFnXSB8fCB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lIHx8ICdPYmplY3QnO1xuICAgIHJldHVybiB0eXBlO1xuICB9XG59IC8vICRGbG93Rml4TWUgb25seSBjYWxsZWQgaW4gREVWLCBzbyB2b2lkIHJldHVybiBpcyBub3QgcG9zc2libGUuXG5cblxuZnVuY3Rpb24gd2lsbENvZXJjaW9uVGhyb3codmFsdWUpIHtcbiAge1xuICAgIHRyeSB7XG4gICAgICB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAgLy8gSWYgeW91IGVuZGVkIHVwIGhlcmUgYnkgZm9sbG93aW5nIGFuIGV4Y2VwdGlvbiBjYWxsIHN0YWNrLCBoZXJlJ3Mgd2hhdCdzXG4gIC8vIGhhcHBlbmVkOiB5b3Ugc3VwcGxpZWQgYW4gb2JqZWN0IG9yIHN5bWJvbCB2YWx1ZSB0byBSZWFjdCAoYXMgYSBwcm9wLCBrZXksXG4gIC8vIERPTSBhdHRyaWJ1dGUsIENTUyBwcm9wZXJ0eSwgc3RyaW5nIHJlZiwgZXRjLikgYW5kIHdoZW4gUmVhY3QgdHJpZWQgdG9cbiAgLy8gY29lcmNlIGl0IHRvIGEgc3RyaW5nIHVzaW5nIGAnJyArIHZhbHVlYCwgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uXG4gIC8vXG4gIC8vIFRoZSBtb3N0IGNvbW1vbiB0eXBlcyB0aGF0IHdpbGwgY2F1c2UgdGhpcyBleGNlcHRpb24gYXJlIGBTeW1ib2xgIGluc3RhbmNlc1xuICAvLyBhbmQgVGVtcG9yYWwgb2JqZWN0cyBsaWtlIGBUZW1wb3JhbC5JbnN0YW50YC4gQnV0IGFueSBvYmplY3QgdGhhdCBoYXMgYVxuICAvLyBgdmFsdWVPZmAgb3IgYFtTeW1ib2wudG9QcmltaXRpdmVdYCBtZXRob2QgdGhhdCB0aHJvd3Mgd2lsbCBhbHNvIGNhdXNlIHRoaXNcbiAgLy8gZXhjZXB0aW9uLiAoTGlicmFyeSBhdXRob3JzIGRvIHRoaXMgdG8gcHJldmVudCB1c2VycyBmcm9tIHVzaW5nIGJ1aWx0LWluXG4gIC8vIG51bWVyaWMgb3BlcmF0b3JzIGxpa2UgYCtgIG9yIGNvbXBhcmlzb24gb3BlcmF0b3JzIGxpa2UgYD49YCBiZWNhdXNlIGN1c3RvbVxuICAvLyBtZXRob2RzIGFyZSBuZWVkZWQgdG8gcGVyZm9ybSBhY2N1cmF0ZSBhcml0aG1ldGljIG9yIGNvbXBhcmlzb24uKVxuICAvL1xuICAvLyBUbyBmaXggdGhlIHByb2JsZW0sIGNvZXJjZSB0aGlzIG9iamVjdCBvciBzeW1ib2wgdmFsdWUgdG8gYSBzdHJpbmcgYmVmb3JlXG4gIC8vIHBhc3NpbmcgaXQgdG8gUmVhY3QuIFRoZSBtb3N0IHJlbGlhYmxlIHdheSBpcyB1c3VhbGx5IGBTdHJpbmcodmFsdWUpYC5cbiAgLy9cbiAgLy8gVG8gZmluZCB3aGljaCB2YWx1ZSBpcyB0aHJvd2luZywgY2hlY2sgdGhlIGJyb3dzZXIgb3IgZGVidWdnZXIgY29uc29sZS5cbiAgLy8gQmVmb3JlIHRoaXMgZXhjZXB0aW9uIHdhcyB0aHJvd24sIHRoZXJlIHNob3VsZCBiZSBgY29uc29sZS5lcnJvcmAgb3V0cHV0XG4gIC8vIHRoYXQgc2hvd3MgdGhlIHR5cGUgKFN5bWJvbCwgVGVtcG9yYWwuUGxhaW5EYXRlLCBldGMuKSB0aGF0IGNhdXNlZCB0aGVcbiAgLy8gcHJvYmxlbSBhbmQgaG93IHRoYXQgdHlwZSB3YXMgdXNlZDoga2V5LCBhdHJyaWJ1dGUsIGlucHV0IHZhbHVlIHByb3AsIGV0Yy5cbiAgLy8gSW4gbW9zdCBjYXNlcywgdGhpcyBjb25zb2xlIG91dHB1dCBhbHNvIHNob3dzIHRoZSBjb21wb25lbnQgYW5kIGl0c1xuICAvLyBhbmNlc3RvciBjb21wb25lbnRzIHdoZXJlIHRoZSBleGNlcHRpb24gaGFwcGVuZWQuXG4gIC8vXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICByZXR1cm4gJycgKyB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbih2YWx1ZSwgYXR0cmlidXRlTmFtZSkge1xuICB7XG4gICAgaWYgKHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ1RoZSBwcm92aWRlZCBgJXNgIGF0dHJpYnV0ZSBpcyBhbiB1bnN1cHBvcnRlZCB0eXBlICVzLicgKyAnIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSBiZWZvcmUgdXNpbmcgaXQgaGVyZS4nLCBhdHRyaWJ1dGVOYW1lLCB0eXBlTmFtZSh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTsgLy8gdGhyb3cgKHRvIGhlbHAgY2FsbGVycyBmaW5kIHRyb3VibGVzaG9vdGluZyBjb21tZW50cylcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAge1xuICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdUaGUgcHJvdmlkZWQga2V5IGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY2hlY2tQcm9wU3RyaW5nQ29lcmNpb24odmFsdWUsIHByb3BOYW1lKSB7XG4gIHtcbiAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKSB7XG4gICAgICBlcnJvcignVGhlIHByb3ZpZGVkIGAlc2AgcHJvcCBpcyBhbiB1bnN1cHBvcnRlZCB0eXBlICVzLicgKyAnIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSBiZWZvcmUgdXNpbmcgaXQgaGVyZS4nLCBwcm9wTmFtZSwgdHlwZU5hbWUodmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7IC8vIHRocm93ICh0byBoZWxwIGNhbGxlcnMgZmluZCB0cm91Ymxlc2hvb3RpbmcgY29tbWVudHMpXG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjaGVja0NTU1Byb3BlcnR5U3RyaW5nQ29lcmNpb24odmFsdWUsIHByb3BOYW1lKSB7XG4gIHtcbiAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKSB7XG4gICAgICBlcnJvcignVGhlIHByb3ZpZGVkIGAlc2AgQ1NTIHByb3BlcnR5IGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIHByb3BOYW1lLCB0eXBlTmFtZSh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTsgLy8gdGhyb3cgKHRvIGhlbHAgY2FsbGVycyBmaW5kIHRyb3VibGVzaG9vdGluZyBjb21tZW50cylcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNoZWNrSHRtbFN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7XG4gIHtcbiAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKSB7XG4gICAgICBlcnJvcignVGhlIHByb3ZpZGVkIEhUTUwgbWFya3VwIHVzZXMgYSB2YWx1ZSBvZiB1bnN1cHBvcnRlZCB0eXBlICVzLicgKyAnIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSBiZWZvcmUgdXNpbmcgaXQgaGVyZS4nLCB0eXBlTmFtZSh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTsgLy8gdGhyb3cgKHRvIGhlbHAgY2FsbGVycyBmaW5kIHRyb3VibGVzaG9vdGluZyBjb21tZW50cylcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNoZWNrRm9ybUZpZWxkVmFsdWVTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICB7XG4gICAgaWYgKHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ0Zvcm0gZmllbGQgdmFsdWVzICh2YWx1ZSwgY2hlY2tlZCwgZGVmYXVsdFZhbHVlLCBvciBkZWZhdWx0Q2hlY2tlZCBwcm9wcyknICsgJyBtdXN0IGJlIHN0cmluZ3MsIG5vdCAlcy4nICsgJyBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgYmVmb3JlIHVzaW5nIGl0IGhlcmUuJywgdHlwZU5hbWUodmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7IC8vIHRocm93ICh0byBoZWxwIGNhbGxlcnMgZmluZCB0cm91Ymxlc2hvb3RpbmcgY29tbWVudHMpXG4gICAgfVxuICB9XG59XG5cbi8vIEEgcmVzZXJ2ZWQgYXR0cmlidXRlLlxuLy8gSXQgaXMgaGFuZGxlZCBieSBSZWFjdCBzZXBhcmF0ZWx5IGFuZCBzaG91bGRuJ3QgYmUgd3JpdHRlbiB0byB0aGUgRE9NLlxudmFyIFJFU0VSVkVEID0gMDsgLy8gQSBzaW1wbGUgc3RyaW5nIGF0dHJpYnV0ZS5cbi8vIEF0dHJpYnV0ZXMgdGhhdCBhcmVuJ3QgaW4gdGhlIGZpbHRlciBhcmUgcHJlc3VtZWQgdG8gaGF2ZSB0aGlzIHR5cGUuXG5cbnZhciBTVFJJTkcgPSAxOyAvLyBBIHN0cmluZyBhdHRyaWJ1dGUgdGhhdCBhY2NlcHRzIGJvb2xlYW5zIGluIFJlYWN0LiBJbiBIVE1MLCB0aGVzZSBhcmUgY2FsbGVkXG4vLyBcImVudW1lcmF0ZWRcIiBhdHRyaWJ1dGVzIHdpdGggXCJ0cnVlXCIgYW5kIFwiZmFsc2VcIiBhcyBwb3NzaWJsZSB2YWx1ZXMuXG4vLyBXaGVuIHRydWUsIGl0IHNob3VsZCBiZSBzZXQgdG8gYSBcInRydWVcIiBzdHJpbmcuXG4vLyBXaGVuIGZhbHNlLCBpdCBzaG91bGQgYmUgc2V0IHRvIGEgXCJmYWxzZVwiIHN0cmluZy5cblxudmFyIEJPT0xFQU5JU0hfU1RSSU5HID0gMjsgLy8gQSByZWFsIGJvb2xlYW4gYXR0cmlidXRlLlxuLy8gV2hlbiB0cnVlLCBpdCBzaG91bGQgYmUgcHJlc2VudCAoc2V0IGVpdGhlciB0byBhbiBlbXB0eSBzdHJpbmcgb3IgaXRzIG5hbWUpLlxuLy8gV2hlbiBmYWxzZSwgaXQgc2hvdWxkIGJlIG9taXR0ZWQuXG5cbnZhciBCT09MRUFOID0gMzsgLy8gQW4gYXR0cmlidXRlIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBmbGFnIGFzIHdlbGwgYXMgd2l0aCBhIHZhbHVlLlxuLy8gV2hlbiB0cnVlLCBpdCBzaG91bGQgYmUgcHJlc2VudCAoc2V0IGVpdGhlciB0byBhbiBlbXB0eSBzdHJpbmcgb3IgaXRzIG5hbWUpLlxuLy8gV2hlbiBmYWxzZSwgaXQgc2hvdWxkIGJlIG9taXR0ZWQuXG4vLyBGb3IgYW55IG90aGVyIHZhbHVlLCBzaG91bGQgYmUgcHJlc2VudCB3aXRoIHRoYXQgdmFsdWUuXG5cbnZhciBPVkVSTE9BREVEX0JPT0xFQU4gPSA0OyAvLyBBbiBhdHRyaWJ1dGUgdGhhdCBtdXN0IGJlIG51bWVyaWMgb3IgcGFyc2UgYXMgYSBudW1lcmljLlxuLy8gV2hlbiBmYWxzeSwgaXQgc2hvdWxkIGJlIHJlbW92ZWQuXG5cbnZhciBOVU1FUklDID0gNTsgLy8gQW4gYXR0cmlidXRlIHRoYXQgbXVzdCBiZSBwb3NpdGl2ZSBudW1lcmljIG9yIHBhcnNlIGFzIGEgcG9zaXRpdmUgbnVtZXJpYy5cbi8vIFdoZW4gZmFsc3ksIGl0IHNob3VsZCBiZSByZW1vdmVkLlxuXG52YXIgUE9TSVRJVkVfTlVNRVJJQyA9IDY7XG5cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbnZhciBBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSID0gXCI6QS1aX2EtelxcXFx1MDBDMC1cXFxcdTAwRDZcXFxcdTAwRDgtXFxcXHUwMEY2XFxcXHUwMEY4LVxcXFx1MDJGRlxcXFx1MDM3MC1cXFxcdTAzN0RcXFxcdTAzN0YtXFxcXHUxRkZGXFxcXHUyMDBDLVxcXFx1MjAwRFxcXFx1MjA3MC1cXFxcdTIxOEZcXFxcdTJDMDAtXFxcXHUyRkVGXFxcXHUzMDAxLVxcXFx1RDdGRlxcXFx1RjkwMC1cXFxcdUZEQ0ZcXFxcdUZERjAtXFxcXHVGRkZEXCI7XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4gKi9cblxudmFyIEFUVFJJQlVURV9OQU1FX0NIQVIgPSBBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSICsgXCJcXFxcLS4wLTlcXFxcdTAwQjdcXFxcdTAzMDAtXFxcXHUwMzZGXFxcXHUyMDNGLVxcXFx1MjA0MFwiO1xudmFyIFZBTElEX0FUVFJJQlVURV9OQU1FX1JFR0VYID0gbmV3IFJlZ0V4cCgnXlsnICsgQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUiArICddWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xudmFyIGlsbGVnYWxBdHRyaWJ1dGVOYW1lQ2FjaGUgPSB7fTtcbnZhciB2YWxpZGF0ZWRBdHRyaWJ1dGVOYW1lQ2FjaGUgPSB7fTtcbmZ1bmN0aW9uIGlzQXR0cmlidXRlTmFtZVNhZmUoYXR0cmlidXRlTmFtZSkge1xuICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh2YWxpZGF0ZWRBdHRyaWJ1dGVOYW1lQ2FjaGUsIGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChpbGxlZ2FsQXR0cmlidXRlTmFtZUNhY2hlLCBhdHRyaWJ1dGVOYW1lKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChWQUxJRF9BVFRSSUJVVEVfTkFNRV9SRUdFWC50ZXN0KGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgdmFsaWRhdGVkQXR0cmlidXRlTmFtZUNhY2hlW2F0dHJpYnV0ZU5hbWVdID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlsbGVnYWxBdHRyaWJ1dGVOYW1lQ2FjaGVbYXR0cmlidXRlTmFtZV0gPSB0cnVlO1xuXG4gIHtcbiAgICBlcnJvcignSW52YWxpZCBhdHRyaWJ1dGUgbmFtZTogYCVzYCcsIGF0dHJpYnV0ZU5hbWUpO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gc2hvdWxkSWdub3JlQXR0cmlidXRlKG5hbWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgaWYgKHByb3BlcnR5SW5mbyAhPT0gbnVsbCkge1xuICAgIHJldHVybiBwcm9wZXJ0eUluZm8udHlwZSA9PT0gUkVTRVJWRUQ7XG4gIH1cblxuICBpZiAoaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAobmFtZS5sZW5ndGggPiAyICYmIChuYW1lWzBdID09PSAnbycgfHwgbmFtZVswXSA9PT0gJ08nKSAmJiAobmFtZVsxXSA9PT0gJ24nIHx8IG5hbWVbMV0gPT09ICdOJykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHNob3VsZFJlbW92ZUF0dHJpYnV0ZVdpdGhXYXJuaW5nKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIGlmIChwcm9wZXJ0eUluZm8gIT09IG51bGwgJiYgcHJvcGVydHlJbmZvLnR5cGUgPT09IFJFU0VSVkVEKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICBjYXNlICdmdW5jdGlvbic6IC8vICRGbG93SXNzdWUgc3ltYm9sIGlzIHBlcmZlY3RseSB2YWxpZCBoZXJlXG5cbiAgICBjYXNlICdzeW1ib2wnOlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIHtcbiAgICAgICAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb3BlcnR5SW5mbyAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiAhcHJvcGVydHlJbmZvLmFjY2VwdHNCb29sZWFucztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgcHJlZml4ID0gbmFtZS50b0xvd2VyQ2FzZSgpLnNsaWNlKDAsIDUpO1xuICAgICAgICAgIHJldHVybiBwcmVmaXggIT09ICdkYXRhLScgJiYgcHJlZml4ICE9PSAnYXJpYS0nO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBzaG91bGRSZW1vdmVBdHRyaWJ1dGUobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGVXaXRoV2FybmluZyhuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHByb3BlcnR5SW5mbyAhPT0gbnVsbCkge1xuXG4gICAgc3dpdGNoIChwcm9wZXJ0eUluZm8udHlwZSkge1xuICAgICAgY2FzZSBCT09MRUFOOlxuICAgICAgICByZXR1cm4gIXZhbHVlO1xuXG4gICAgICBjYXNlIE9WRVJMT0FERURfQk9PTEVBTjpcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBmYWxzZTtcblxuICAgICAgY2FzZSBOVU1FUklDOlxuICAgICAgICByZXR1cm4gaXNOYU4odmFsdWUpO1xuXG4gICAgICBjYXNlIFBPU0lUSVZFX05VTUVSSUM6XG4gICAgICAgIHJldHVybiBpc05hTih2YWx1ZSkgfHwgdmFsdWUgPCAxO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGdldFByb3BlcnR5SW5mbyhuYW1lKSB7XG4gIHJldHVybiBwcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KG5hbWUpID8gcHJvcGVydGllc1tuYW1lXSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCB0eXBlLCBtdXN0VXNlUHJvcGVydHksIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZU5hbWVzcGFjZSwgc2FuaXRpemVVUkwsIHJlbW92ZUVtcHR5U3RyaW5nKSB7XG4gIHRoaXMuYWNjZXB0c0Jvb2xlYW5zID0gdHlwZSA9PT0gQk9PTEVBTklTSF9TVFJJTkcgfHwgdHlwZSA9PT0gQk9PTEVBTiB8fCB0eXBlID09PSBPVkVSTE9BREVEX0JPT0xFQU47XG4gIHRoaXMuYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZU5hbWU7XG4gIHRoaXMuYXR0cmlidXRlTmFtZXNwYWNlID0gYXR0cmlidXRlTmFtZXNwYWNlO1xuICB0aGlzLm11c3RVc2VQcm9wZXJ0eSA9IG11c3RVc2VQcm9wZXJ0eTtcbiAgdGhpcy5wcm9wZXJ0eU5hbWUgPSBuYW1lO1xuICB0aGlzLnR5cGUgPSB0eXBlO1xuICB0aGlzLnNhbml0aXplVVJMID0gc2FuaXRpemVVUkw7XG4gIHRoaXMucmVtb3ZlRW1wdHlTdHJpbmcgPSByZW1vdmVFbXB0eVN0cmluZztcbn0gLy8gV2hlbiBhZGRpbmcgYXR0cmlidXRlcyB0byB0aGlzIGxpc3QsIGJlIHN1cmUgdG8gYWxzbyBhZGQgdGhlbSB0b1xuLy8gdGhlIGBwb3NzaWJsZVN0YW5kYXJkTmFtZXNgIG1vZHVsZSB0byBlbnN1cmUgY2FzaW5nIGFuZCBpbmNvcnJlY3Rcbi8vIG5hbWUgd2FybmluZ3MuXG5cblxudmFyIHByb3BlcnRpZXMgPSB7fTsgLy8gVGhlc2UgcHJvcHMgYXJlIHJlc2VydmVkIGJ5IFJlYWN0LiBUaGV5IHNob3VsZG4ndCBiZSB3cml0dGVuIHRvIHRoZSBET00uXG5cbnZhciByZXNlcnZlZFByb3BzID0gWydjaGlsZHJlbicsICdkYW5nZXJvdXNseVNldElubmVySFRNTCcsIC8vIFRPRE86IFRoaXMgcHJldmVudHMgdGhlIGFzc2lnbm1lbnQgb2YgZGVmYXVsdFZhbHVlIHRvIHJlZ3VsYXJcbi8vIGVsZW1lbnRzIChub3QganVzdCBpbnB1dHMpLiBOb3cgdGhhdCBSZWFjdERPTUlucHV0IGFzc2lnbnMgdG8gdGhlXG4vLyBkZWZhdWx0VmFsdWUgcHJvcGVydHkgLS0gZG8gd2UgbmVlZCB0aGlzP1xuJ2RlZmF1bHRWYWx1ZScsICdkZWZhdWx0Q2hlY2tlZCcsICdpbm5lckhUTUwnLCAnc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nJywgJ3N1cHByZXNzSHlkcmF0aW9uV2FybmluZycsICdzdHlsZSddO1xuXG5yZXNlcnZlZFByb3BzLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgUkVTRVJWRUQsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBBIGZldyBSZWFjdCBzdHJpbmcgYXR0cmlidXRlcyBoYXZlIGEgZGlmZmVyZW50IG5hbWUuXG4vLyBUaGlzIGlzIGEgbWFwcGluZyBmcm9tIFJlYWN0IHByb3AgbmFtZXMgdG8gdGhlIGF0dHJpYnV0ZSBuYW1lcy5cblxuW1snYWNjZXB0Q2hhcnNldCcsICdhY2NlcHQtY2hhcnNldCddLCBbJ2NsYXNzTmFtZScsICdjbGFzcyddLCBbJ2h0bWxGb3InLCAnZm9yJ10sIFsnaHR0cEVxdWl2JywgJ2h0dHAtZXF1aXYnXV0uZm9yRWFjaChmdW5jdGlvbiAoX3JlZikge1xuICB2YXIgbmFtZSA9IF9yZWZbMF0sXG4gICAgICBhdHRyaWJ1dGVOYW1lID0gX3JlZlsxXTtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIFwiZW51bWVyYXRlZFwiIEhUTUwgYXR0cmlidXRlcyB0aGF0IGFjY2VwdCBcInRydWVcIiBhbmQgXCJmYWxzZVwiLlxuLy8gSW4gUmVhY3QsIHdlIGxldCB1c2VycyBwYXNzIGB0cnVlYCBhbmQgYGZhbHNlYCBldmVuIHRob3VnaCB0ZWNobmljYWxseVxuLy8gdGhlc2UgYXJlbid0IGJvb2xlYW4gYXR0cmlidXRlcyAodGhleSBhcmUgY29lcmNlZCB0byBzdHJpbmdzKS5cblxuWydjb250ZW50RWRpdGFibGUnLCAnZHJhZ2dhYmxlJywgJ3NwZWxsQ2hlY2snLCAndmFsdWUnXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIEJPT0xFQU5JU0hfU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgXCJlbnVtZXJhdGVkXCIgU1ZHIGF0dHJpYnV0ZXMgdGhhdCBhY2NlcHQgXCJ0cnVlXCIgYW5kIFwiZmFsc2VcIi5cbi8vIEluIFJlYWN0LCB3ZSBsZXQgdXNlcnMgcGFzcyBgdHJ1ZWAgYW5kIGBmYWxzZWAgZXZlbiB0aG91Z2ggdGVjaG5pY2FsbHlcbi8vIHRoZXNlIGFyZW4ndCBib29sZWFuIGF0dHJpYnV0ZXMgKHRoZXkgYXJlIGNvZXJjZWQgdG8gc3RyaW5ncykuXG4vLyBTaW5jZSB0aGVzZSBhcmUgU1ZHIGF0dHJpYnV0ZXMsIHRoZWlyIGF0dHJpYnV0ZSBuYW1lcyBhcmUgY2FzZS1zZW5zaXRpdmUuXG5cblsnYXV0b1JldmVyc2UnLCAnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCcsICdmb2N1c2FibGUnLCAncHJlc2VydmVBbHBoYSddLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgQk9PTEVBTklTSF9TVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgSFRNTCBib29sZWFuIGF0dHJpYnV0ZXMuXG5cblsnYWxsb3dGdWxsU2NyZWVuJywgJ2FzeW5jJywgLy8gTm90ZTogdGhlcmUgaXMgYSBzcGVjaWFsIGNhc2UgdGhhdCBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIHdyaXR0ZW4gdG8gdGhlIERPTVxuLy8gb24gdGhlIGNsaWVudCBzaWRlIGJlY2F1c2UgdGhlIGJyb3dzZXJzIGFyZSBpbmNvbnNpc3RlbnQuIEluc3RlYWQgd2UgY2FsbCBmb2N1cygpLlxuJ2F1dG9Gb2N1cycsICdhdXRvUGxheScsICdjb250cm9scycsICdkZWZhdWx0JywgJ2RlZmVyJywgJ2Rpc2FibGVkJywgJ2Rpc2FibGVQaWN0dXJlSW5QaWN0dXJlJywgJ2Rpc2FibGVSZW1vdGVQbGF5YmFjaycsICdmb3JtTm9WYWxpZGF0ZScsICdoaWRkZW4nLCAnbG9vcCcsICdub01vZHVsZScsICdub1ZhbGlkYXRlJywgJ29wZW4nLCAncGxheXNJbmxpbmUnLCAncmVhZE9ubHknLCAncmVxdWlyZWQnLCAncmV2ZXJzZWQnLCAnc2NvcGVkJywgJ3NlYW1sZXNzJywgLy8gTWljcm9kYXRhXG4naXRlbVNjb3BlJ10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBCT09MRUFOLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgdGhlIGZldyBSZWFjdCBwcm9wcyB0aGF0IHdlIHNldCBhcyBET00gcHJvcGVydGllc1xuLy8gcmF0aGVyIHRoYW4gYXR0cmlidXRlcy4gVGhlc2UgYXJlIGFsbCBib29sZWFucy5cblxuWydjaGVja2VkJywgLy8gTm90ZTogYG9wdGlvbi5zZWxlY3RlZGAgaXMgbm90IHVwZGF0ZWQgaWYgYHNlbGVjdC5tdWx0aXBsZWAgaXNcbi8vIGRpc2FibGVkIHdpdGggYHJlbW92ZUF0dHJpYnV0ZWAuIFdlIGhhdmUgc3BlY2lhbCBsb2dpYyBmb3IgaGFuZGxpbmcgdGhpcy5cbidtdWx0aXBsZScsICdtdXRlZCcsICdzZWxlY3RlZCcgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgQk9PTEVBTiwgdHJ1ZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIEhUTUwgYXR0cmlidXRlcyB0aGF0IGFyZSBcIm92ZXJsb2FkZWQgYm9vbGVhbnNcIjogdGhleSBiZWhhdmUgbGlrZVxuLy8gYm9vbGVhbnMsIGJ1dCBjYW4gYWxzbyBhY2NlcHQgYSBzdHJpbmcgdmFsdWUuXG5cblsnY2FwdHVyZScsICdkb3dubG9hZCcgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgT1ZFUkxPQURFRF9CT09MRUFOLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIEhUTUwgYXR0cmlidXRlcyB0aGF0IG11c3QgYmUgcG9zaXRpdmUgbnVtYmVycy5cblxuWydjb2xzJywgJ3Jvd3MnLCAnc2l6ZScsICdzcGFuJyAvLyBOT1RFOiBpZiB5b3UgYWRkIGEgY2FtZWxDYXNlZCBwcm9wIHRvIHRoaXMgbGlzdCxcbi8vIHlvdSdsbCBuZWVkIHRvIHNldCBhdHRyaWJ1dGVOYW1lIHRvIG5hbWUudG9Mb3dlckNhc2UoKVxuLy8gaW5zdGVhZCBpbiB0aGUgYXNzaWdubWVudCBiZWxvdy5cbl0uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBQT1NJVElWRV9OVU1FUklDLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIEhUTUwgYXR0cmlidXRlcyB0aGF0IG11c3QgYmUgbnVtYmVycy5cblxuWydyb3dTcGFuJywgJ3N0YXJ0J10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBOVU1FUklDLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pO1xudmFyIENBTUVMSVpFID0gL1tcXC1cXDpdKFthLXpdKS9nO1xuXG52YXIgY2FwaXRhbGl6ZSA9IGZ1bmN0aW9uICh0b2tlbikge1xuICByZXR1cm4gdG9rZW5bMV0udG9VcHBlckNhc2UoKTtcbn07IC8vIFRoaXMgaXMgYSBsaXN0IG9mIGFsbCBTVkcgYXR0cmlidXRlcyB0aGF0IG5lZWQgc3BlY2lhbCBjYXNpbmcsIG5hbWVzcGFjaW5nLFxuLy8gb3IgYm9vbGVhbiB2YWx1ZSBhc3NpZ25tZW50LiBSZWd1bGFyIGF0dHJpYnV0ZXMgdGhhdCBqdXN0IGFjY2VwdCBzdHJpbmdzXG4vLyBhbmQgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcmUgb21pdHRlZCwganVzdCBsaWtlIGluIHRoZSBIVE1MIGF0dHJpYnV0ZSBmaWx0ZXIuXG4vLyBTb21lIG9mIHRoZXNlIGF0dHJpYnV0ZXMgY2FuIGJlIGhhcmQgdG8gZmluZC4gVGhpcyBsaXN0IHdhcyBjcmVhdGVkIGJ5XG4vLyBzY3JhcGluZyB0aGUgTUROIGRvY3VtZW50YXRpb24uXG5cblxuWydhY2NlbnQtaGVpZ2h0JywgJ2FsaWdubWVudC1iYXNlbGluZScsICdhcmFiaWMtZm9ybScsICdiYXNlbGluZS1zaGlmdCcsICdjYXAtaGVpZ2h0JywgJ2NsaXAtcGF0aCcsICdjbGlwLXJ1bGUnLCAnY29sb3ItaW50ZXJwb2xhdGlvbicsICdjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnMnLCAnY29sb3ItcHJvZmlsZScsICdjb2xvci1yZW5kZXJpbmcnLCAnZG9taW5hbnQtYmFzZWxpbmUnLCAnZW5hYmxlLWJhY2tncm91bmQnLCAnZmlsbC1vcGFjaXR5JywgJ2ZpbGwtcnVsZScsICdmbG9vZC1jb2xvcicsICdmbG9vZC1vcGFjaXR5JywgJ2ZvbnQtZmFtaWx5JywgJ2ZvbnQtc2l6ZScsICdmb250LXNpemUtYWRqdXN0JywgJ2ZvbnQtc3RyZXRjaCcsICdmb250LXN0eWxlJywgJ2ZvbnQtdmFyaWFudCcsICdmb250LXdlaWdodCcsICdnbHlwaC1uYW1lJywgJ2dseXBoLW9yaWVudGF0aW9uLWhvcml6b250YWwnLCAnZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwnLCAnaG9yaXotYWR2LXgnLCAnaG9yaXotb3JpZ2luLXgnLCAnaW1hZ2UtcmVuZGVyaW5nJywgJ2xldHRlci1zcGFjaW5nJywgJ2xpZ2h0aW5nLWNvbG9yJywgJ21hcmtlci1lbmQnLCAnbWFya2VyLW1pZCcsICdtYXJrZXItc3RhcnQnLCAnb3ZlcmxpbmUtcG9zaXRpb24nLCAnb3ZlcmxpbmUtdGhpY2tuZXNzJywgJ3BhaW50LW9yZGVyJywgJ3Bhbm9zZS0xJywgJ3BvaW50ZXItZXZlbnRzJywgJ3JlbmRlcmluZy1pbnRlbnQnLCAnc2hhcGUtcmVuZGVyaW5nJywgJ3N0b3AtY29sb3InLCAnc3RvcC1vcGFjaXR5JywgJ3N0cmlrZXRocm91Z2gtcG9zaXRpb24nLCAnc3RyaWtldGhyb3VnaC10aGlja25lc3MnLCAnc3Ryb2tlLWRhc2hhcnJheScsICdzdHJva2UtZGFzaG9mZnNldCcsICdzdHJva2UtbGluZWNhcCcsICdzdHJva2UtbGluZWpvaW4nLCAnc3Ryb2tlLW1pdGVybGltaXQnLCAnc3Ryb2tlLW9wYWNpdHknLCAnc3Ryb2tlLXdpZHRoJywgJ3RleHQtYW5jaG9yJywgJ3RleHQtZGVjb3JhdGlvbicsICd0ZXh0LXJlbmRlcmluZycsICd1bmRlcmxpbmUtcG9zaXRpb24nLCAndW5kZXJsaW5lLXRoaWNrbmVzcycsICd1bmljb2RlLWJpZGknLCAndW5pY29kZS1yYW5nZScsICd1bml0cy1wZXItZW0nLCAndi1hbHBoYWJldGljJywgJ3YtaGFuZ2luZycsICd2LWlkZW9ncmFwaGljJywgJ3YtbWF0aGVtYXRpY2FsJywgJ3ZlY3Rvci1lZmZlY3QnLCAndmVydC1hZHYteScsICd2ZXJ0LW9yaWdpbi14JywgJ3ZlcnQtb3JpZ2luLXknLCAnd29yZC1zcGFjaW5nJywgJ3dyaXRpbmctbW9kZScsICd4bWxuczp4bGluaycsICd4LWhlaWdodCcgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUpIHtcbiAgdmFyIG5hbWUgPSBhdHRyaWJ1dGVOYW1lLnJlcGxhY2UoQ0FNRUxJWkUsIGNhcGl0YWxpemUpO1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZSwgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gU3RyaW5nIFNWRyBhdHRyaWJ1dGVzIHdpdGggdGhlIHhsaW5rIG5hbWVzcGFjZS5cblxuWyd4bGluazphY3R1YXRlJywgJ3hsaW5rOmFyY3JvbGUnLCAneGxpbms6cm9sZScsICd4bGluazpzaG93JywgJ3hsaW5rOnRpdGxlJywgJ3hsaW5rOnR5cGUnIC8vIE5PVEU6IGlmIHlvdSBhZGQgYSBjYW1lbENhc2VkIHByb3AgdG8gdGhpcyBsaXN0LFxuLy8geW91J2xsIG5lZWQgdG8gc2V0IGF0dHJpYnV0ZU5hbWUgdG8gbmFtZS50b0xvd2VyQ2FzZSgpXG4vLyBpbnN0ZWFkIGluIHRoZSBhc3NpZ25tZW50IGJlbG93LlxuXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHZhciBuYW1lID0gYXR0cmlidXRlTmFtZS5yZXBsYWNlKENBTUVMSVpFLCBjYXBpdGFsaXplKTtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUsICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBTdHJpbmcgU1ZHIGF0dHJpYnV0ZXMgd2l0aCB0aGUgeG1sIG5hbWVzcGFjZS5cblxuWyd4bWw6YmFzZScsICd4bWw6bGFuZycsICd4bWw6c3BhY2UnIC8vIE5PVEU6IGlmIHlvdSBhZGQgYSBjYW1lbENhc2VkIHByb3AgdG8gdGhpcyBsaXN0LFxuLy8geW91J2xsIG5lZWQgdG8gc2V0IGF0dHJpYnV0ZU5hbWUgdG8gbmFtZS50b0xvd2VyQ2FzZSgpXG4vLyBpbnN0ZWFkIGluIHRoZSBhc3NpZ25tZW50IGJlbG93LlxuXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHZhciBuYW1lID0gYXR0cmlidXRlTmFtZS5yZXBsYWNlKENBTUVMSVpFLCBjYXBpdGFsaXplKTtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUsICdodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UnLCBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGF0dHJpYnV0ZSBleGlzdHMgYm90aCBpbiBIVE1MIGFuZCBTVkcuXG4vLyBUaGUgYXR0cmlidXRlIG5hbWUgaXMgY2FzZS1zZW5zaXRpdmUgaW4gU1ZHIHNvIHdlIGNhbid0IGp1c3QgdXNlXG4vLyB0aGUgUmVhY3QgbmFtZSBsaWtlIHdlIGRvIGZvciBhdHRyaWJ1dGVzIHRoYXQgZXhpc3Qgb25seSBpbiBIVE1MLlxuXG5bJ3RhYkluZGV4JywgJ2Nyb3NzT3JpZ2luJ10uZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlTmFtZSkge1xuICBwcm9wZXJ0aWVzW2F0dHJpYnV0ZU5hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChhdHRyaWJ1dGVOYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZS50b0xvd2VyQ2FzZSgpLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGF0dHJpYnV0ZXMgYWNjZXB0IFVSTHMuIFRoZXNlIG11c3Qgbm90IGFsbG93IGphdmFzY3JpcHQ6IFVSTFMuXG4vLyBUaGVzZSB3aWxsIGFsc28gbmVlZCB0byBhY2NlcHQgVHJ1c3RlZCBUeXBlcyBvYmplY3QgaW4gdGhlIGZ1dHVyZS5cblxudmFyIHhsaW5rSHJlZiA9ICd4bGlua0hyZWYnO1xucHJvcGVydGllc1t4bGlua0hyZWZdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZCgneGxpbmtIcmVmJywgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4neGxpbms6aHJlZicsICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywgdHJ1ZSwgLy8gc2FuaXRpemVVUkxcbmZhbHNlKTtcblsnc3JjJywgJ2hyZWYnLCAnYWN0aW9uJywgJ2Zvcm1BY3Rpb24nXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHByb3BlcnRpZXNbYXR0cmlidXRlTmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKGF0dHJpYnV0ZU5hbWUsIFNUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBhdHRyaWJ1dGVOYW1lLnRvTG93ZXJDYXNlKCksIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIHRydWUsIC8vIHNhbml0aXplVVJMXG4gIHRydWUpO1xufSk7XG5cbi8vIGFuZCBhbnkgbmV3bGluZSBvciB0YWIgYXJlIGZpbHRlcmVkIG91dCBhcyBpZiB0aGV5J3JlIG5vdCBwYXJ0IG9mIHRoZSBVUkwuXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI3VybC1wYXJzaW5nXG4vLyBUYWIgb3IgbmV3bGluZSBhcmUgZGVmaW5lZCBhcyBcXHJcXG5cXHQ6XG4vLyBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jYXNjaWktdGFiLW9yLW5ld2xpbmVcbi8vIEEgQzAgY29udHJvbCBpcyBhIGNvZGUgcG9pbnQgaW4gdGhlIHJhbmdlIFxcdTAwMDAgTlVMTCB0byBcXHUwMDFGXG4vLyBJTkZPUk1BVElPTiBTRVBBUkFUT1IgT05FLCBpbmNsdXNpdmU6XG4vLyBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jYzAtY29udHJvbC1vci1zcGFjZVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG5cbnZhciBpc0phdmFTY3JpcHRQcm90b2NvbCA9IC9eW1xcdTAwMDAtXFx1MDAxRiBdKmpbXFxyXFxuXFx0XSphW1xcclxcblxcdF0qdltcXHJcXG5cXHRdKmFbXFxyXFxuXFx0XSpzW1xcclxcblxcdF0qY1tcXHJcXG5cXHRdKnJbXFxyXFxuXFx0XSppW1xcclxcblxcdF0qcFtcXHJcXG5cXHRdKnRbXFxyXFxuXFx0XSpcXDovaTtcbnZhciBkaWRXYXJuID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHNhbml0aXplVVJMKHVybCkge1xuICB7XG4gICAgaWYgKCFkaWRXYXJuICYmIGlzSmF2YVNjcmlwdFByb3RvY29sLnRlc3QodXJsKSkge1xuICAgICAgZGlkV2FybiA9IHRydWU7XG5cbiAgICAgIGVycm9yKCdBIGZ1dHVyZSB2ZXJzaW9uIG9mIFJlYWN0IHdpbGwgYmxvY2sgamF2YXNjcmlwdDogVVJMcyBhcyBhIHNlY3VyaXR5IHByZWNhdXRpb24uICcgKyAnVXNlIGV2ZW50IGhhbmRsZXJzIGluc3RlYWQgaWYgeW91IGNhbi4gSWYgeW91IG5lZWQgdG8gZ2VuZXJhdGUgdW5zYWZlIEhUTUwgdHJ5ICcgKyAndXNpbmcgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgaW5zdGVhZC4gUmVhY3Qgd2FzIHBhc3NlZCAlcy4nLCBKU09OLnN0cmluZ2lmeSh1cmwpKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIGZvciBhIHByb3BlcnR5IG9uIGEgbm9kZS4gT25seSB1c2VkIGluIERFViBmb3IgU1NSIHZhbGlkYXRpb24uXG4gKiBUaGUgXCJleHBlY3RlZFwiIGFyZ3VtZW50IGlzIHVzZWQgYXMgYSBoaW50IG9mIHdoYXQgdGhlIGV4cGVjdGVkIHZhbHVlIGlzLlxuICogU29tZSBwcm9wZXJ0aWVzIGhhdmUgbXVsdGlwbGUgZXF1aXZhbGVudCB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGdldFZhbHVlRm9yUHJvcGVydHkobm9kZSwgbmFtZSwgZXhwZWN0ZWQsIHByb3BlcnR5SW5mbykge1xuICB7XG4gICAgaWYgKHByb3BlcnR5SW5mby5tdXN0VXNlUHJvcGVydHkpIHtcbiAgICAgIHZhciBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eUluZm8ucHJvcGVydHlOYW1lO1xuICAgICAgcmV0dXJuIG5vZGVbcHJvcGVydHlOYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhpcyBjaGVjayBwcm90ZWN0cyBtdWx0aXBsZSB1c2VzIG9mIGBleHBlY3RlZGAsIHdoaWNoIGlzIHdoeSB0aGVcbiAgICAgIC8vIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uIHJ1bGUgaXMgZGlzYWJsZWQgaW4gc2V2ZXJhbCBzcG90c1xuICAgICAgLy8gYmVsb3cuXG4gICAgICB7XG4gICAgICAgIGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24oZXhwZWN0ZWQsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIHByb3BlcnR5SW5mby5zYW5pdGl6ZVVSTCkge1xuICAgICAgICAvLyBJZiB3ZSBoYXZlbid0IGZ1bGx5IGRpc2FibGVkIGphdmFzY3JpcHQ6IFVSTHMsIGFuZCBpZlxuICAgICAgICAvLyB0aGUgaHlkcmF0aW9uIGlzIHN1Y2Nlc3NmdWwgb2YgYSBqYXZhc2NyaXB0OiBVUkwsIHdlXG4gICAgICAgIC8vIHN0aWxsIHdhbnQgdG8gd2FybiBvbiB0aGUgY2xpZW50LlxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cbiAgICAgICAgc2FuaXRpemVVUkwoJycgKyBleHBlY3RlZCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBhdHRyaWJ1dGVOYW1lID0gcHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWU7XG4gICAgICB2YXIgc3RyaW5nVmFsdWUgPSBudWxsO1xuXG4gICAgICBpZiAocHJvcGVydHlJbmZvLnR5cGUgPT09IE9WRVJMT0FERURfQk9PTEVBTikge1xuICAgICAgICBpZiAobm9kZS5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkpIHtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBub2RlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGUobmFtZSwgZXhwZWN0ZWQsIHByb3BlcnR5SW5mbywgZmFsc2UpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cblxuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSAnJyArIGV4cGVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG5vZGUuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgICAgIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGUobmFtZSwgZXhwZWN0ZWQsIHByb3BlcnR5SW5mbywgZmFsc2UpKSB7XG4gICAgICAgICAgLy8gV2UgaGFkIGFuIGF0dHJpYnV0ZSBidXQgc2hvdWxkbid0IGhhdmUgaGFkIG9uZSwgc28gcmVhZCBpdFxuICAgICAgICAgIC8vIGZvciB0aGUgZXJyb3IgbWVzc2FnZS5cbiAgICAgICAgICByZXR1cm4gbm9kZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcGVydHlJbmZvLnR5cGUgPT09IEJPT0xFQU4pIHtcbiAgICAgICAgICAvLyBJZiB0aGlzIHdhcyBhIGJvb2xlYW4sIGl0IGRvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIHZhbHVlIGlzXG4gICAgICAgICAgLy8gdGhlIGZhY3QgdGhhdCB3ZSBoYXZlIGl0IGlzIHRoZSBzYW1lIGFzIHRoZSBleHBlY3RlZC5cbiAgICAgICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgICAgIH0gLy8gRXZlbiBpZiB0aGlzIHByb3BlcnR5IHVzZXMgYSBuYW1lc3BhY2Ugd2UgdXNlIGdldEF0dHJpYnV0ZVxuICAgICAgICAvLyBiZWNhdXNlIHdlIGFzc3VtZSBpdHMgbmFtZXNwYWNlZCBuYW1lIGlzIHRoZSBzYW1lIGFzIG91ciBjb25maWcuXG4gICAgICAgIC8vIFRvIHVzZSBnZXRBdHRyaWJ1dGVOUyB3ZSBuZWVkIHRoZSBsb2NhbCBuYW1lIHdoaWNoIHdlIGRvbid0IGhhdmVcbiAgICAgICAgLy8gaW4gb3VyIGNvbmZpZyBhdG0uXG5cblxuICAgICAgICBzdHJpbmdWYWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkUmVtb3ZlQXR0cmlidXRlKG5hbWUsIGV4cGVjdGVkLCBwcm9wZXJ0eUluZm8sIGZhbHNlKSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nVmFsdWUgPT09IG51bGwgPyBleHBlY3RlZCA6IHN0cmluZ1ZhbHVlOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cbiAgICAgIH0gZWxzZSBpZiAoc3RyaW5nVmFsdWUgPT09ICcnICsgZXhwZWN0ZWQpIHtcbiAgICAgICAgcmV0dXJuIGV4cGVjdGVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZ1ZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIGZvciBhIGF0dHJpYnV0ZSBvbiBhIG5vZGUuIE9ubHkgdXNlZCBpbiBERVYgZm9yIFNTUiB2YWxpZGF0aW9uLlxuICogVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHVzZWQgYXMgYSBoaW50IG9mIHdoYXQgdGhlIGV4cGVjdGVkIHZhbHVlIGlzLiBTb21lXG4gKiBhdHRyaWJ1dGVzIGhhdmUgbXVsdGlwbGUgZXF1aXZhbGVudCB2YWx1ZXMuXG4gKi9cblxuZnVuY3Rpb24gZ2V0VmFsdWVGb3JBdHRyaWJ1dGUobm9kZSwgbmFtZSwgZXhwZWN0ZWQsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIHtcbiAgICBpZiAoIWlzQXR0cmlidXRlTmFtZVNhZmUobmFtZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIW5vZGUuaGFzQXR0cmlidXRlKG5hbWUpKSB7XG4gICAgICByZXR1cm4gZXhwZWN0ZWQgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG51bGw7XG4gICAgfVxuXG4gICAgdmFyIHZhbHVlID0gbm9kZS5nZXRBdHRyaWJ1dGUobmFtZSk7XG5cbiAgICB7XG4gICAgICBjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKGV4cGVjdGVkLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT09ICcnICsgZXhwZWN0ZWQpIHtcbiAgICAgIHJldHVybiBleHBlY3RlZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cbi8qKlxuICogU2V0cyB0aGUgdmFsdWUgZm9yIGEgcHJvcGVydHkgb24gYSBub2RlLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqL1xuXG5mdW5jdGlvbiBzZXRWYWx1ZUZvclByb3BlcnR5KG5vZGUsIG5hbWUsIHZhbHVlLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICB2YXIgcHJvcGVydHlJbmZvID0gZ2V0UHJvcGVydHlJbmZvKG5hbWUpO1xuXG4gIGlmIChzaG91bGRJZ25vcmVBdHRyaWJ1dGUobmFtZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoc2hvdWxkUmVtb3ZlQXR0cmlidXRlKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSkge1xuICAgIHZhbHVlID0gbnVsbDtcbiAgfVxuXG5cbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnIHx8IHByb3BlcnR5SW5mbyA9PT0gbnVsbCkge1xuICAgIGlmIChpc0F0dHJpYnV0ZU5hbWVTYWZlKG5hbWUpKSB7XG4gICAgICB2YXIgX2F0dHJpYnV0ZU5hbWUgPSBuYW1lO1xuXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoX2F0dHJpYnV0ZU5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAge1xuICAgICAgICAgIGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24odmFsdWUsIG5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoX2F0dHJpYnV0ZU5hbWUsICAnJyArIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgbXVzdFVzZVByb3BlcnR5ID0gcHJvcGVydHlJbmZvLm11c3RVc2VQcm9wZXJ0eTtcblxuICBpZiAobXVzdFVzZVByb3BlcnR5KSB7XG4gICAgdmFyIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5SW5mby5wcm9wZXJ0eU5hbWU7XG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHZhciB0eXBlID0gcHJvcGVydHlJbmZvLnR5cGU7XG4gICAgICBub2RlW3Byb3BlcnR5TmFtZV0gPSB0eXBlID09PSBCT09MRUFOID8gZmFsc2UgOiAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ29udHJhcnkgdG8gYHNldEF0dHJpYnV0ZWAsIG9iamVjdCBwcm9wZXJ0aWVzIGFyZSBwcm9wZXJseVxuICAgICAgLy8gYHRvU3RyaW5nYGVkIGJ5IElFOC85LlxuICAgICAgbm9kZVtwcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9IC8vIFRoZSByZXN0IGFyZSB0cmVhdGVkIGFzIGF0dHJpYnV0ZXMgd2l0aCBzcGVjaWFsIGNhc2VzLlxuXG5cbiAgdmFyIGF0dHJpYnV0ZU5hbWUgPSBwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZSxcbiAgICAgIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lc3BhY2U7XG5cbiAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIF90eXBlID0gcHJvcGVydHlJbmZvLnR5cGU7XG4gICAgdmFyIGF0dHJpYnV0ZVZhbHVlO1xuXG4gICAgaWYgKF90eXBlID09PSBCT09MRUFOIHx8IF90eXBlID09PSBPVkVSTE9BREVEX0JPT0xFQU4gJiYgdmFsdWUgPT09IHRydWUpIHtcbiAgICAgIC8vIElmIGF0dHJpYnV0ZSB0eXBlIGlzIGJvb2xlYW4sIHdlIGtub3cgZm9yIHN1cmUgaXQgd29uJ3QgYmUgYW4gZXhlY3V0aW9uIHNpbmtcbiAgICAgIC8vIGFuZCB3ZSB3b24ndCByZXF1aXJlIFRydXN0ZWQgVHlwZSBoZXJlLlxuICAgICAgYXR0cmlidXRlVmFsdWUgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYHNldEF0dHJpYnV0ZWAgd2l0aCBvYmplY3RzIGJlY29tZXMgb25seSBgW29iamVjdF1gIGluIElFOC85LFxuICAgICAgLy8gKCcnICsgdmFsdWUpIG1ha2VzIGl0IG91dHB1dCB0aGUgY29ycmVjdCB0b1N0cmluZygpLXZhbHVlLlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbih2YWx1ZSwgYXR0cmlidXRlTmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9ICcnICsgdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9wZXJ0eUluZm8uc2FuaXRpemVVUkwpIHtcbiAgICAgICAgc2FuaXRpemVVUkwoYXR0cmlidXRlVmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGF0dHJpYnV0ZU5hbWVzcGFjZSkge1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGVOUyhhdHRyaWJ1dGVOYW1lc3BhY2UsIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBBVFRFTlRJT05cbi8vIFdoZW4gYWRkaW5nIG5ldyBzeW1ib2xzIHRvIHRoaXMgZmlsZSxcbi8vIFBsZWFzZSBjb25zaWRlciBhbHNvIGFkZGluZyB0byAncmVhY3QtZGV2dG9vbHMtc2hhcmVkL3NyYy9iYWNrZW5kL1JlYWN0U3ltYm9scydcbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLlxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKTtcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnBvcnRhbCcpO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mcmFnbWVudCcpO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpO1xudmFyIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm9maWxlcicpO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm92aWRlcicpO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbnRleHQnKTtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZm9yd2FyZF9yZWYnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2UnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0Jyk7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubWVtbycpO1xudmFyIFJFQUNUX0xBWllfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmxhenknKTtcbnZhciBSRUFDVF9TQ09QRV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc2NvcGUnKTtcbnZhciBSRUFDVF9ERUJVR19UUkFDSU5HX01PREVfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmRlYnVnX3RyYWNlX21vZGUnKTtcbnZhciBSRUFDVF9PRkZTQ1JFRU5fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm9mZnNjcmVlbicpO1xudmFyIFJFQUNUX0xFR0FDWV9ISURERU5fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmxlZ2FjeV9oaWRkZW4nKTtcbnZhciBSRUFDVF9DQUNIRV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuY2FjaGUnKTtcbnZhciBSRUFDVF9UUkFDSU5HX01BUktFUl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QudHJhY2luZ19tYXJrZXInKTtcbnZhciBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgPSBTeW1ib2wuaXRlcmF0b3I7XG52YXIgRkFVWF9JVEVSQVRPUl9TWU1CT0wgPSAnQEBpdGVyYXRvcic7XG5mdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHtcbiAgaWYgKG1heWJlSXRlcmFibGUgPT09IG51bGwgfHwgdHlwZW9mIG1heWJlSXRlcmFibGUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgbWF5YmVJdGVyYXRvciA9IE1BWUJFX0lURVJBVE9SX1NZTUJPTCAmJiBtYXliZUl0ZXJhYmxlW01BWUJFX0lURVJBVE9SX1NZTUJPTF0gfHwgbWF5YmVJdGVyYWJsZVtGQVVYX0lURVJBVE9SX1NZTUJPTF07XG5cbiAgaWYgKHR5cGVvZiBtYXliZUl0ZXJhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG1heWJlSXRlcmF0b3I7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxudmFyIGFzc2lnbiA9IE9iamVjdC5hc3NpZ247XG5cbi8vIEhlbHBlcnMgdG8gcGF0Y2ggY29uc29sZS5sb2dzIHRvIGF2b2lkIGxvZ2dpbmcgZHVyaW5nIHNpZGUtZWZmZWN0IGZyZWVcbi8vIHJlcGxheWluZyBvbiByZW5kZXIgZnVuY3Rpb24uIFRoaXMgY3VycmVudGx5IG9ubHkgcGF0Y2hlcyB0aGUgb2JqZWN0XG4vLyBsYXppbHkgd2hpY2ggd29uJ3QgY292ZXIgaWYgdGhlIGxvZyBmdW5jdGlvbiB3YXMgZXh0cmFjdGVkIGVhZ2VybHkuXG4vLyBXZSBjb3VsZCBhbHNvIGVhZ2VybHkgcGF0Y2ggdGhlIG1ldGhvZC5cbnZhciBkaXNhYmxlZERlcHRoID0gMDtcbnZhciBwcmV2TG9nO1xudmFyIHByZXZJbmZvO1xudmFyIHByZXZXYXJuO1xudmFyIHByZXZFcnJvcjtcbnZhciBwcmV2R3JvdXA7XG52YXIgcHJldkdyb3VwQ29sbGFwc2VkO1xudmFyIHByZXZHcm91cEVuZDtcblxuZnVuY3Rpb24gZGlzYWJsZWRMb2coKSB7fVxuXG5kaXNhYmxlZExvZy5fX3JlYWN0RGlzYWJsZWRMb2cgPSB0cnVlO1xuZnVuY3Rpb24gZGlzYWJsZUxvZ3MoKSB7XG4gIHtcbiAgICBpZiAoZGlzYWJsZWREZXB0aCA9PT0gMCkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgICBwcmV2TG9nID0gY29uc29sZS5sb2c7XG4gICAgICBwcmV2SW5mbyA9IGNvbnNvbGUuaW5mbztcbiAgICAgIHByZXZXYXJuID0gY29uc29sZS53YXJuO1xuICAgICAgcHJldkVycm9yID0gY29uc29sZS5lcnJvcjtcbiAgICAgIHByZXZHcm91cCA9IGNvbnNvbGUuZ3JvdXA7XG4gICAgICBwcmV2R3JvdXBDb2xsYXBzZWQgPSBjb25zb2xlLmdyb3VwQ29sbGFwc2VkO1xuICAgICAgcHJldkdyb3VwRW5kID0gY29uc29sZS5ncm91cEVuZDsgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xOTA5OVxuXG4gICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IGRpc2FibGVkTG9nLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBpbmZvOiBwcm9wcyxcbiAgICAgICAgbG9nOiBwcm9wcyxcbiAgICAgICAgd2FybjogcHJvcHMsXG4gICAgICAgIGVycm9yOiBwcm9wcyxcbiAgICAgICAgZ3JvdXA6IHByb3BzLFxuICAgICAgICBncm91cENvbGxhcHNlZDogcHJvcHMsXG4gICAgICAgIGdyb3VwRW5kOiBwcm9wc1xuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGRpc2FibGVkRGVwdGgrKztcbiAgfVxufVxuZnVuY3Rpb24gcmVlbmFibGVMb2dzKCkge1xuICB7XG4gICAgZGlzYWJsZWREZXB0aC0tO1xuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lIEZsb3cgdGhpbmtzIGNvbnNvbGUgaXMgaW1tdXRhYmxlLlxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjb25zb2xlLCB7XG4gICAgICAgIGxvZzogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2TG9nXG4gICAgICAgIH0pLFxuICAgICAgICBpbmZvOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZJbmZvXG4gICAgICAgIH0pLFxuICAgICAgICB3YXJuOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZXYXJuXG4gICAgICAgIH0pLFxuICAgICAgICBlcnJvcjogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2RXJyb3JcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cFxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwQ29sbGFwc2VkXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cEVuZDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBFbmRcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICB9XG5cbiAgICBpZiAoZGlzYWJsZWREZXB0aCA8IDApIHtcbiAgICAgIGVycm9yKCdkaXNhYmxlZERlcHRoIGZlbGwgYmVsb3cgemVyby4gJyArICdUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyO1xudmFyIHByZWZpeDtcbmZ1bmN0aW9uIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUsIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgaWYgKHByZWZpeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBFeHRyYWN0IHRoZSBWTSBzcGVjaWZpYyBwcmVmaXggdXNlZCBieSBlYWNoIGxpbmUuXG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICB2YXIgbWF0Y2ggPSB4LnN0YWNrLnRyaW0oKS5tYXRjaCgvXFxuKCAqKGF0ICk/KS8pO1xuICAgICAgICBwcmVmaXggPSBtYXRjaCAmJiBtYXRjaFsxXSB8fCAnJztcbiAgICAgIH1cbiAgICB9IC8vIFdlIHVzZSB0aGUgcHJlZml4IHRvIGVuc3VyZSBvdXIgc3RhY2tzIGxpbmUgdXAgd2l0aCBuYXRpdmUgc3RhY2sgZnJhbWVzLlxuXG5cbiAgICByZXR1cm4gJ1xcbicgKyBwcmVmaXggKyBuYW1lO1xuICB9XG59XG52YXIgcmVlbnRyeSA9IGZhbHNlO1xudmFyIGNvbXBvbmVudEZyYW1lQ2FjaGU7XG5cbntcbiAgdmFyIFBvc3NpYmx5V2Vha01hcCA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nID8gV2Vha01hcCA6IE1hcDtcbiAgY29tcG9uZW50RnJhbWVDYWNoZSA9IG5ldyBQb3NzaWJseVdlYWtNYXAoKTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShmbiwgY29uc3RydWN0KSB7XG4gIC8vIElmIHNvbWV0aGluZyBhc2tlZCBmb3IgYSBzdGFjayBpbnNpZGUgYSBmYWtlIHJlbmRlciwgaXQgc2hvdWxkIGdldCBpZ25vcmVkLlxuICBpZiAoICFmbiB8fCByZWVudHJ5KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAge1xuICAgIHZhciBmcmFtZSA9IGNvbXBvbmVudEZyYW1lQ2FjaGUuZ2V0KGZuKTtcblxuICAgIGlmIChmcmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZnJhbWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbnRyb2w7XG4gIHJlZW50cnkgPSB0cnVlO1xuICB2YXIgcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZSA9IEVycm9yLnByZXBhcmVTdGFja1RyYWNlOyAvLyAkRmxvd0ZpeE1lIEl0IGRvZXMgYWNjZXB0IHVuZGVmaW5lZC5cblxuICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHVuZGVmaW5lZDtcbiAgdmFyIHByZXZpb3VzRGlzcGF0Y2hlcjtcblxuICB7XG4gICAgcHJldmlvdXNEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50OyAvLyBTZXQgdGhlIGRpc3BhdGNoZXIgaW4gREVWIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBjYWxsIGluIHRoZSByZW5kZXIgZnVuY3Rpb25cbiAgICAvLyBmb3Igd2FybmluZ3MuXG5cbiAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQgPSBudWxsO1xuICAgIGRpc2FibGVMb2dzKCk7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIFRoaXMgc2hvdWxkIHRocm93LlxuICAgIGlmIChjb25zdHJ1Y3QpIHtcbiAgICAgIC8vIFNvbWV0aGluZyBzaG91bGQgYmUgc2V0dGluZyB0aGUgcHJvcHMgaW4gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAgdmFyIEZha2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lXG5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZha2UucHJvdG90eXBlLCAncHJvcHMnLCB7XG4gICAgICAgIHNldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIFdlIHVzZSBhIHRocm93aW5nIHNldHRlciBpbnN0ZWFkIG9mIGZyb3plbiBvciBub24td3JpdGFibGUgcHJvcHNcbiAgICAgICAgICAvLyBiZWNhdXNlIHRoYXQgd29uJ3QgdGhyb3cgaW4gYSBub24tc3RyaWN0IG1vZGUgZnVuY3Rpb24uXG4gICAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgJiYgUmVmbGVjdC5jb25zdHJ1Y3QpIHtcbiAgICAgICAgLy8gV2UgY29uc3RydWN0IGEgZGlmZmVyZW50IGNvbnRyb2wgZm9yIHRoaXMgY2FzZSB0byBpbmNsdWRlIGFueSBleHRyYVxuICAgICAgICAvLyBmcmFtZXMgYWRkZWQgYnkgdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICB0cnkge1xuICAgICAgICAgIFJlZmxlY3QuY29uc3RydWN0KEZha2UsIFtdKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgICB9XG5cbiAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoZm4sIFtdLCBGYWtlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgRmFrZS5jYWxsKCk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZuLmNhbGwoRmFrZS5wcm90b3R5cGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICBjb250cm9sID0geDtcbiAgICAgIH1cblxuICAgICAgZm4oKTtcbiAgICB9XG4gIH0gY2F0Y2ggKHNhbXBsZSkge1xuICAgIC8vIFRoaXMgaXMgaW5saW5lZCBtYW51YWxseSBiZWNhdXNlIGNsb3N1cmUgZG9lc24ndCBkbyBpdCBmb3IgdXMuXG4gICAgaWYgKHNhbXBsZSAmJiBjb250cm9sICYmIHR5cGVvZiBzYW1wbGUuc3RhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBUaGlzIGV4dHJhY3RzIHRoZSBmaXJzdCBmcmFtZSBmcm9tIHRoZSBzYW1wbGUgdGhhdCBpc24ndCBhbHNvIGluIHRoZSBjb250cm9sLlxuICAgICAgLy8gU2tpcHBpbmcgb25lIGZyYW1lIHRoYXQgd2UgYXNzdW1lIGlzIHRoZSBmcmFtZSB0aGF0IGNhbGxzIHRoZSB0d28uXG4gICAgICB2YXIgc2FtcGxlTGluZXMgPSBzYW1wbGUuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIGNvbnRyb2xMaW5lcyA9IGNvbnRyb2wuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIHMgPSBzYW1wbGVMaW5lcy5sZW5ndGggLSAxO1xuICAgICAgdmFyIGMgPSBjb250cm9sTGluZXMubGVuZ3RoIC0gMTtcblxuICAgICAgd2hpbGUgKHMgPj0gMSAmJiBjID49IDAgJiYgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAvLyBXZSBleHBlY3QgYXQgbGVhc3Qgb25lIHN0YWNrIGZyYW1lIHRvIGJlIHNoYXJlZC5cbiAgICAgICAgLy8gVHlwaWNhbGx5IHRoaXMgd2lsbCBiZSB0aGUgcm9vdCBtb3N0IG9uZS4gSG93ZXZlciwgc3RhY2sgZnJhbWVzIG1heSBiZVxuICAgICAgICAvLyBjdXQgb2ZmIGR1ZSB0byBtYXhpbXVtIHN0YWNrIGxpbWl0cy4gSW4gdGhpcyBjYXNlLCBvbmUgbWF5YmUgY3V0IG9mZlxuICAgICAgICAvLyBlYXJsaWVyIHRoYW4gdGhlIG90aGVyLiBXZSBhc3N1bWUgdGhhdCB0aGUgc2FtcGxlIGlzIGxvbmdlciBvciB0aGUgc2FtZVxuICAgICAgICAvLyBhbmQgdGhlcmUgZm9yIGN1dCBvZmYgZWFybGllci4gU28gd2Ugc2hvdWxkIGZpbmQgdGhlIHJvb3QgbW9zdCBmcmFtZSBpblxuICAgICAgICAvLyB0aGUgc2FtcGxlIHNvbWV3aGVyZSBpbiB0aGUgY29udHJvbC5cbiAgICAgICAgYy0tO1xuICAgICAgfVxuXG4gICAgICBmb3IgKDsgcyA+PSAxICYmIGMgPj0gMDsgcy0tLCBjLS0pIHtcbiAgICAgICAgLy8gTmV4dCB3ZSBmaW5kIHRoZSBmaXJzdCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSB3aGljaCBzaG91bGQgYmUgdGhlXG4gICAgICAgIC8vIGZyYW1lIHRoYXQgY2FsbGVkIG91ciBzYW1wbGUgZnVuY3Rpb24gYW5kIHRoZSBjb250cm9sLlxuICAgICAgICBpZiAoc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgIC8vIEluIFY4LCB0aGUgZmlyc3QgbGluZSBpcyBkZXNjcmliaW5nIHRoZSBtZXNzYWdlIGJ1dCBvdGhlciBWTXMgZG9uJ3QuXG4gICAgICAgICAgLy8gSWYgd2UncmUgYWJvdXQgdG8gcmV0dXJuIHRoZSBmaXJzdCBsaW5lLCBhbmQgdGhlIGNvbnRyb2wgaXMgYWxzbyBvbiB0aGUgc2FtZVxuICAgICAgICAgIC8vIGxpbmUsIHRoYXQncyBhIHByZXR0eSBnb29kIGluZGljYXRvciB0aGF0IG91ciBzYW1wbGUgdGhyZXcgYXQgc2FtZSBsaW5lIGFzXG4gICAgICAgICAgLy8gdGhlIGNvbnRyb2wuIEkuZS4gYmVmb3JlIHdlIGVudGVyZWQgdGhlIHNhbXBsZSBmcmFtZS4gU28gd2UgaWdub3JlIHRoaXMgcmVzdWx0LlxuICAgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiB5b3UgcGFzc2VkIGEgY2xhc3MgdG8gZnVuY3Rpb24gY29tcG9uZW50LCBvciBub24tZnVuY3Rpb24uXG4gICAgICAgICAgaWYgKHMgIT09IDEgfHwgYyAhPT0gMSkge1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBzLS07XG4gICAgICAgICAgICAgIGMtLTsgLy8gV2UgbWF5IHN0aWxsIGhhdmUgc2ltaWxhciBpbnRlcm1lZGlhdGUgZnJhbWVzIGZyb20gdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICAgICAgICAvLyBUaGUgbmV4dCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSBzaG91bGQgYmUgb3VyIG1hdGNoIHRob3VnaC5cblxuICAgICAgICAgICAgICBpZiAoYyA8IDAgfHwgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgICAgICAgIC8vIFY4IGFkZHMgYSBcIm5ld1wiIHByZWZpeCBmb3IgbmF0aXZlIGNsYXNzZXMuIExldCdzIHJlbW92ZSBpdCB0byBtYWtlIGl0IHByZXR0aWVyLlxuICAgICAgICAgICAgICAgIHZhciBfZnJhbWUgPSAnXFxuJyArIHNhbXBsZUxpbmVzW3NdLnJlcGxhY2UoJyBhdCBuZXcgJywgJyBhdCAnKTsgLy8gSWYgb3VyIGNvbXBvbmVudCBmcmFtZSBpcyBsYWJlbGVkIFwiPGFub255bW91cz5cIlxuICAgICAgICAgICAgICAgIC8vIGJ1dCB3ZSBoYXZlIGEgdXNlci1wcm92aWRlZCBcImRpc3BsYXlOYW1lXCJcbiAgICAgICAgICAgICAgICAvLyBzcGxpY2UgaXQgaW4gdG8gbWFrZSB0aGUgc3RhY2sgbW9yZSByZWFkYWJsZS5cblxuXG4gICAgICAgICAgICAgICAgaWYgKGZuLmRpc3BsYXlOYW1lICYmIF9mcmFtZS5pbmNsdWRlcygnPGFub255bW91cz4nKSkge1xuICAgICAgICAgICAgICAgICAgX2ZyYW1lID0gX2ZyYW1lLnJlcGxhY2UoJzxhbm9ueW1vdXM+JywgZm4uZGlzcGxheU5hbWUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIF9mcmFtZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSAvLyBSZXR1cm4gdGhlIGxpbmUgd2UgZm91bmQuXG5cblxuICAgICAgICAgICAgICAgIHJldHVybiBfZnJhbWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gd2hpbGUgKHMgPj0gMSAmJiBjID49IDApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHJlZW50cnkgPSBmYWxzZTtcblxuICAgIHtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudCA9IHByZXZpb3VzRGlzcGF0Y2hlcjtcbiAgICAgIHJlZW5hYmxlTG9ncygpO1xuICAgIH1cblxuICAgIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZTtcbiAgfSAvLyBGYWxsYmFjayB0byBqdXN0IHVzaW5nIHRoZSBuYW1lIGlmIHdlIGNvdWxkbid0IG1ha2UgaXQgdGhyb3cuXG5cblxuICB2YXIgbmFtZSA9IGZuID8gZm4uZGlzcGxheU5hbWUgfHwgZm4ubmFtZSA6ICcnO1xuICB2YXIgc3ludGhldGljRnJhbWUgPSBuYW1lID8gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSkgOiAnJztcblxuICB7XG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIHN5bnRoZXRpY0ZyYW1lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3ludGhldGljRnJhbWU7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlQ2xhc3NDb21wb25lbnRGcmFtZShjdG9yLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGN0b3IsIHRydWUpO1xuICB9XG59XG5mdW5jdGlvbiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZm4sIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGZhbHNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QoQ29tcG9uZW50KSB7XG4gIHZhciBwcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICByZXR1cm4gISEocHJvdG90eXBlICYmIHByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUsIHNvdXJjZSwgb3duZXJGbikge1xuXG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB7XG4gICAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZSh0eXBlLCBzaG91bGRDb25zdHJ1Y3QodHlwZSkpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUodHlwZSk7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlJyk7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2VMaXN0Jyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUodHlwZS5yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgLy8gTWVtbyBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLnR5cGUsIHNvdXJjZSwgb3duZXJGbik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSB0eXBlO1xuICAgICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gTGF6eSBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgICAgIHJldHVybiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoaW5pdChwYXlsb2FkKSwgc291cmNlLCBvd25lckZuKTtcbiAgICAgICAgICB9IGNhdGNoICh4KSB7fVxuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZUZpYmVyKGZpYmVyKSB7XG4gIHZhciBvd25lciA9ICBmaWJlci5fZGVidWdPd25lciA/IGZpYmVyLl9kZWJ1Z093bmVyLnR5cGUgOiBudWxsIDtcbiAgdmFyIHNvdXJjZSA9ICBmaWJlci5fZGVidWdTb3VyY2UgO1xuXG4gIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKGZpYmVyLnR5cGUpO1xuXG4gICAgY2FzZSBMYXp5Q29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdMYXp5Jyk7XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZScpO1xuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlTGlzdCcpO1xuXG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEluZGV0ZXJtaW5hdGVDb21wb25lbnQ6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZShmaWJlci50eXBlKTtcblxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZmliZXIudHlwZS5yZW5kZXIpO1xuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUNsYXNzQ29tcG9uZW50RnJhbWUoZmliZXIudHlwZSk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICcnO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFN0YWNrQnlGaWJlckluRGV2QW5kUHJvZCh3b3JrSW5Qcm9ncmVzcykge1xuICB0cnkge1xuICAgIHZhciBpbmZvID0gJyc7XG4gICAgdmFyIG5vZGUgPSB3b3JrSW5Qcm9ncmVzcztcblxuICAgIGRvIHtcbiAgICAgIGluZm8gKz0gZGVzY3JpYmVGaWJlcihub2RlKTtcbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9IHdoaWxlIChub2RlKTtcblxuICAgIHJldHVybiBpbmZvO1xuICB9IGNhdGNoICh4KSB7XG4gICAgcmV0dXJuICdcXG5FcnJvciBnZW5lcmF0aW5nIHN0YWNrOiAnICsgeC5tZXNzYWdlICsgJ1xcbicgKyB4LnN0YWNrO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFdyYXBwZWROYW1lKG91dGVyVHlwZSwgaW5uZXJUeXBlLCB3cmFwcGVyTmFtZSkge1xuICB2YXIgZGlzcGxheU5hbWUgPSBvdXRlclR5cGUuZGlzcGxheU5hbWU7XG5cbiAgaWYgKGRpc3BsYXlOYW1lKSB7XG4gICAgcmV0dXJuIGRpc3BsYXlOYW1lO1xuICB9XG5cbiAgdmFyIGZ1bmN0aW9uTmFtZSA9IGlubmVyVHlwZS5kaXNwbGF5TmFtZSB8fCBpbm5lclR5cGUubmFtZSB8fCAnJztcbiAgcmV0dXJuIGZ1bmN0aW9uTmFtZSAhPT0gJycgPyB3cmFwcGVyTmFtZSArIFwiKFwiICsgZnVuY3Rpb25OYW1lICsgXCIpXCIgOiB3cmFwcGVyTmFtZTtcbn0gLy8gS2VlcCBpbiBzeW5jIHdpdGggcmVhY3QtcmVjb25jaWxlci9nZXRDb21wb25lbnROYW1lRnJvbUZpYmVyXG5cblxuZnVuY3Rpb24gZ2V0Q29udGV4dE5hbWUodHlwZSkge1xuICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCAnQ29udGV4dCc7XG59IC8vIE5vdGUgdGhhdCB0aGUgcmVjb25jaWxlciBwYWNrYWdlIHNob3VsZCBnZW5lcmFsbHkgcHJlZmVyIHRvIHVzZSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKCkgaW5zdGVhZC5cblxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSkge1xuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgLy8gSG9zdCByb290LCB0ZXh0IG5vZGUgb3IganVzdCBpbnZhbGlkIHR5cGUuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB7XG4gICAgaWYgKHR5cGVvZiB0eXBlLnRhZyA9PT0gJ251bWJlcicpIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCBhbiB1bmV4cGVjdGVkIG9iamVjdCBpbiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoKS4gJyArICdUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8IG51bGw7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICByZXR1cm4gJ0ZyYWdtZW50JztcblxuICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICByZXR1cm4gJ1BvcnRhbCc7XG5cbiAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICByZXR1cm4gJ1Byb2ZpbGVyJztcblxuICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgIHJldHVybiAnU3RyaWN0TW9kZSc7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlJztcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgcmV0dXJuICdTdXNwZW5zZUxpc3QnO1xuXG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUoY29udGV4dCkgKyAnLkNvbnN1bWVyJztcblxuICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICB2YXIgcHJvdmlkZXIgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUocHJvdmlkZXIuX2NvbnRleHQpICsgJy5Qcm92aWRlcic7XG5cbiAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgcmV0dXJuIGdldFdyYXBwZWROYW1lKHR5cGUsIHR5cGUucmVuZGVyLCAnRm9yd2FyZFJlZicpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgdmFyIG91dGVyTmFtZSA9IHR5cGUuZGlzcGxheU5hbWUgfHwgbnVsbDtcblxuICAgICAgICBpZiAob3V0ZXJOYW1lICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIG91dGVyTmFtZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZS50eXBlKSB8fCAnTWVtbyc7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSB0eXBlO1xuICAgICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShpbml0KHBheWxvYWQpKTtcbiAgICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldFdyYXBwZWROYW1lJDEob3V0ZXJUeXBlLCBpbm5lclR5cGUsIHdyYXBwZXJOYW1lKSB7XG4gIHZhciBmdW5jdGlvbk5hbWUgPSBpbm5lclR5cGUuZGlzcGxheU5hbWUgfHwgaW5uZXJUeXBlLm5hbWUgfHwgJyc7XG4gIHJldHVybiBvdXRlclR5cGUuZGlzcGxheU5hbWUgfHwgKGZ1bmN0aW9uTmFtZSAhPT0gJycgPyB3cmFwcGVyTmFtZSArIFwiKFwiICsgZnVuY3Rpb25OYW1lICsgXCIpXCIgOiB3cmFwcGVyTmFtZSk7XG59IC8vIEtlZXAgaW4gc3luYyB3aXRoIHNoYXJlZC9nZXRDb21wb25lbnROYW1lRnJvbVR5cGVcblxuXG5mdW5jdGlvbiBnZXRDb250ZXh0TmFtZSQxKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgJ0NvbnRleHQnO1xufVxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB7XG4gIHZhciB0YWcgPSBmaWJlci50YWcsXG4gICAgICB0eXBlID0gZmliZXIudHlwZTtcblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgQ2FjaGVDb21wb25lbnQ6XG4gICAgICByZXR1cm4gJ0NhY2hlJztcblxuICAgIGNhc2UgQ29udGV4dENvbnN1bWVyOlxuICAgICAgdmFyIGNvbnRleHQgPSB0eXBlO1xuICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lJDEoY29udGV4dCkgKyAnLkNvbnN1bWVyJztcblxuICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgICAgdmFyIHByb3ZpZGVyID0gdHlwZTtcbiAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZSQxKHByb3ZpZGVyLl9jb250ZXh0KSArICcuUHJvdmlkZXInO1xuXG4gICAgY2FzZSBEZWh5ZHJhdGVkRnJhZ21lbnQ6XG4gICAgICByZXR1cm4gJ0RlaHlkcmF0ZWRGcmFnbWVudCc7XG5cbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICByZXR1cm4gZ2V0V3JhcHBlZE5hbWUkMSh0eXBlLCB0eXBlLnJlbmRlciwgJ0ZvcndhcmRSZWYnKTtcblxuICAgIGNhc2UgRnJhZ21lbnQ6XG4gICAgICByZXR1cm4gJ0ZyYWdtZW50JztcblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIC8vIEhvc3QgY29tcG9uZW50IHR5cGUgaXMgdGhlIGRpc3BsYXkgbmFtZSAoZS5nLiBcImRpdlwiLCBcIlZpZXdcIilcbiAgICAgIHJldHVybiB0eXBlO1xuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgcmV0dXJuICdQb3J0YWwnO1xuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHJldHVybiAnUm9vdCc7XG5cbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgcmV0dXJuICdUZXh0JztcblxuICAgIGNhc2UgTGF6eUNvbXBvbmVudDpcbiAgICAgIC8vIE5hbWUgY29tZXMgZnJvbSB0aGUgdHlwZSBpbiB0aGlzIGNhc2U7IHdlIGRvbid0IGhhdmUgYSB0YWcuXG4gICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpO1xuXG4gICAgY2FzZSBNb2RlOlxuICAgICAgaWYgKHR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEUpIHtcbiAgICAgICAgLy8gRG9uJ3QgYmUgbGVzcyBzcGVjaWZpYyB0aGFuIHNoYXJlZC9nZXRDb21wb25lbnROYW1lRnJvbVR5cGVcbiAgICAgICAgcmV0dXJuICdTdHJpY3RNb2RlJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICdNb2RlJztcblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgICAgcmV0dXJuICdPZmZzY3JlZW4nO1xuXG4gICAgY2FzZSBQcm9maWxlcjpcbiAgICAgIHJldHVybiAnUHJvZmlsZXInO1xuXG4gICAgY2FzZSBTY29wZUNvbXBvbmVudDpcbiAgICAgIHJldHVybiAnU2NvcGUnO1xuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHJldHVybiAnU3VzcGVuc2UnO1xuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlTGlzdCc7XG5cbiAgICBjYXNlIFRyYWNpbmdNYXJrZXJDb21wb25lbnQ6XG4gICAgICByZXR1cm4gJ1RyYWNpbmdNYXJrZXInO1xuICAgIC8vIFRoZSBkaXNwbGF5IG5hbWUgZm9yIHRoaXMgdGFncyBjb21lIGZyb20gdGhlIHVzZXItcHJvdmlkZWQgdHlwZTpcblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEluY29tcGxldGVDbGFzc0NvbXBvbmVudDpcbiAgICBjYXNlIEluZGV0ZXJtaW5hdGVDb21wb25lbnQ6XG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdHlwZTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG52YXIgY3VycmVudCA9IG51bGw7XG52YXIgaXNSZW5kZXJpbmcgPSBmYWxzZTtcbmZ1bmN0aW9uIGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCkge1xuICB7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBvd25lciA9IGN1cnJlbnQuX2RlYnVnT3duZXI7XG5cbiAgICBpZiAob3duZXIgIT09IG51bGwgJiYgdHlwZW9mIG93bmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIob3duZXIpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRDdXJyZW50RmliZXJTdGFja0luRGV2KCkge1xuICB7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9IC8vIFNhZmUgYmVjYXVzZSBpZiBjdXJyZW50IGZpYmVyIGV4aXN0cywgd2UgYXJlIHJlY29uY2lsaW5nLFxuICAgIC8vIGFuZCBpdCBpcyBndWFyYW50ZWVkIHRvIGJlIHRoZSB3b3JrLWluLXByb2dyZXNzIHZlcnNpb24uXG5cblxuICAgIHJldHVybiBnZXRTdGFja0J5RmliZXJJbkRldkFuZFByb2QoY3VycmVudCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzZXRDdXJyZW50RmliZXIoKSB7XG4gIHtcbiAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldEN1cnJlbnRTdGFjayA9IG51bGw7XG4gICAgY3VycmVudCA9IG51bGw7XG4gICAgaXNSZW5kZXJpbmcgPSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gc2V0Q3VycmVudEZpYmVyKGZpYmVyKSB7XG4gIHtcbiAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldEN1cnJlbnRTdGFjayA9IGZpYmVyID09PSBudWxsID8gbnVsbCA6IGdldEN1cnJlbnRGaWJlclN0YWNrSW5EZXY7XG4gICAgY3VycmVudCA9IGZpYmVyO1xuICAgIGlzUmVuZGVyaW5nID0gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldEN1cnJlbnRGaWJlcigpIHtcbiAge1xuICAgIHJldHVybiBjdXJyZW50O1xuICB9XG59XG5mdW5jdGlvbiBzZXRJc1JlbmRlcmluZyhyZW5kZXJpbmcpIHtcbiAge1xuICAgIGlzUmVuZGVyaW5nID0gcmVuZGVyaW5nO1xuICB9XG59XG5cbi8vIEZsb3cgZG9lcyBub3QgYWxsb3cgc3RyaW5nIGNvbmNhdGVuYXRpb24gb2YgbW9zdCBub24tc3RyaW5nIHR5cGVzLiBUbyB3b3JrXG4vLyBhcm91bmQgdGhpcyBsaW1pdGF0aW9uLCB3ZSB1c2UgYW4gb3BhcXVlIHR5cGUgdGhhdCBjYW4gb25seSBiZSBvYnRhaW5lZCBieVxuLy8gcGFzc2luZyB0aGUgdmFsdWUgdGhyb3VnaCBnZXRUb1N0cmluZ1ZhbHVlIGZpcnN0LlxuZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgLy8gVGhlIGNvZXJjaW9uIHNhZmV0eSBjaGVjayBpcyBwZXJmb3JtZWQgaW4gZ2V0VG9TdHJpbmdWYWx1ZSgpLlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cbiAgcmV0dXJuICcnICsgdmFsdWU7XG59XG5mdW5jdGlvbiBnZXRUb1N0cmluZ1ZhbHVlKHZhbHVlKSB7XG4gIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICByZXR1cm4gdmFsdWU7XG5cbiAgICBjYXNlICdvYmplY3QnOlxuICAgICAge1xuICAgICAgICBjaGVja0Zvcm1GaWVsZFZhbHVlU3RyaW5nQ29lcmNpb24odmFsdWUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdmFsdWU7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgLy8gZnVuY3Rpb24sIHN5bWJvbCBhcmUgYXNzaWduZWQgYXMgZW1wdHkgc3RyaW5nc1xuICAgICAgcmV0dXJuICcnO1xuICB9XG59XG5cbnZhciBoYXNSZWFkT25seVZhbHVlID0ge1xuICBidXR0b246IHRydWUsXG4gIGNoZWNrYm94OiB0cnVlLFxuICBpbWFnZTogdHJ1ZSxcbiAgaGlkZGVuOiB0cnVlLFxuICByYWRpbzogdHJ1ZSxcbiAgcmVzZXQ6IHRydWUsXG4gIHN1Ym1pdDogdHJ1ZVxufTtcbmZ1bmN0aW9uIGNoZWNrQ29udHJvbGxlZFZhbHVlUHJvcHModGFnTmFtZSwgcHJvcHMpIHtcbiAge1xuICAgIGlmICghKGhhc1JlYWRPbmx5VmFsdWVbcHJvcHMudHlwZV0gfHwgcHJvcHMub25DaGFuZ2UgfHwgcHJvcHMub25JbnB1dCB8fCBwcm9wcy5yZWFkT25seSB8fCBwcm9wcy5kaXNhYmxlZCB8fCBwcm9wcy52YWx1ZSA9PSBudWxsKSkge1xuICAgICAgZXJyb3IoJ1lvdSBwcm92aWRlZCBhIGB2YWx1ZWAgcHJvcCB0byBhIGZvcm0gZmllbGQgd2l0aG91dCBhbiAnICsgJ2BvbkNoYW5nZWAgaGFuZGxlci4gVGhpcyB3aWxsIHJlbmRlciBhIHJlYWQtb25seSBmaWVsZC4gSWYgJyArICd0aGUgZmllbGQgc2hvdWxkIGJlIG11dGFibGUgdXNlIGBkZWZhdWx0VmFsdWVgLiBPdGhlcndpc2UsICcgKyAnc2V0IGVpdGhlciBgb25DaGFuZ2VgIG9yIGByZWFkT25seWAuJyk7XG4gICAgfVxuXG4gICAgaWYgKCEocHJvcHMub25DaGFuZ2UgfHwgcHJvcHMucmVhZE9ubHkgfHwgcHJvcHMuZGlzYWJsZWQgfHwgcHJvcHMuY2hlY2tlZCA9PSBudWxsKSkge1xuICAgICAgZXJyb3IoJ1lvdSBwcm92aWRlZCBhIGBjaGVja2VkYCBwcm9wIHRvIGEgZm9ybSBmaWVsZCB3aXRob3V0IGFuICcgKyAnYG9uQ2hhbmdlYCBoYW5kbGVyLiBUaGlzIHdpbGwgcmVuZGVyIGEgcmVhZC1vbmx5IGZpZWxkLiBJZiAnICsgJ3RoZSBmaWVsZCBzaG91bGQgYmUgbXV0YWJsZSB1c2UgYGRlZmF1bHRDaGVja2VkYC4gT3RoZXJ3aXNlLCAnICsgJ3NldCBlaXRoZXIgYG9uQ2hhbmdlYCBvciBgcmVhZE9ubHlgLicpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc0NoZWNrYWJsZShlbGVtKSB7XG4gIHZhciB0eXBlID0gZWxlbS50eXBlO1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lO1xuICByZXR1cm4gbm9kZU5hbWUgJiYgbm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0JyAmJiAodHlwZSA9PT0gJ2NoZWNrYm94JyB8fCB0eXBlID09PSAncmFkaW8nKTtcbn1cblxuZnVuY3Rpb24gZ2V0VHJhY2tlcihub2RlKSB7XG4gIHJldHVybiBub2RlLl92YWx1ZVRyYWNrZXI7XG59XG5cbmZ1bmN0aW9uIGRldGFjaFRyYWNrZXIobm9kZSkge1xuICBub2RlLl92YWx1ZVRyYWNrZXIgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRWYWx1ZUZyb21Ob2RlKG5vZGUpIHtcbiAgdmFyIHZhbHVlID0gJyc7XG5cbiAgaWYgKCFub2RlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgaWYgKGlzQ2hlY2thYmxlKG5vZGUpKSB7XG4gICAgdmFsdWUgPSBub2RlLmNoZWNrZWQgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICB9IGVsc2Uge1xuICAgIHZhbHVlID0gbm9kZS52YWx1ZTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gdHJhY2tWYWx1ZU9uTm9kZShub2RlKSB7XG4gIHZhciB2YWx1ZUZpZWxkID0gaXNDaGVja2FibGUobm9kZSkgPyAnY2hlY2tlZCcgOiAndmFsdWUnO1xuICB2YXIgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobm9kZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHZhbHVlRmllbGQpO1xuXG4gIHtcbiAgICBjaGVja0Zvcm1GaWVsZFZhbHVlU3RyaW5nQ29lcmNpb24obm9kZVt2YWx1ZUZpZWxkXSk7XG4gIH1cblxuICB2YXIgY3VycmVudFZhbHVlID0gJycgKyBub2RlW3ZhbHVlRmllbGRdOyAvLyBpZiBzb21lb25lIGhhcyBhbHJlYWR5IGRlZmluZWQgYSB2YWx1ZSBvciBTYWZhcmksIHRoZW4gYmFpbFxuICAvLyBhbmQgZG9uJ3QgdHJhY2sgdmFsdWUgd2lsbCBjYXVzZSBvdmVyIHJlcG9ydGluZyBvZiBjaGFuZ2VzLFxuICAvLyBidXQgaXQncyBiZXR0ZXIgdGhlbiBhIGhhcmQgZmFpbHVyZVxuICAvLyAobmVlZGVkIGZvciBjZXJ0YWluIHRlc3RzIHRoYXQgc3B5T24gaW5wdXQgdmFsdWVzIGFuZCBTYWZhcmkpXG5cbiAgaWYgKG5vZGUuaGFzT3duUHJvcGVydHkodmFsdWVGaWVsZCkgfHwgdHlwZW9mIGRlc2NyaXB0b3IgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBkZXNjcmlwdG9yLmdldCAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgZGVzY3JpcHRvci5zZXQgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgZ2V0ID0gZGVzY3JpcHRvci5nZXQsXG4gICAgICBzZXQgPSBkZXNjcmlwdG9yLnNldDtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5vZGUsIHZhbHVlRmllbGQsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZ2V0LmNhbGwodGhpcyk7XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAge1xuICAgICAgICBjaGVja0Zvcm1GaWVsZFZhbHVlU3RyaW5nQ29lcmNpb24odmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50VmFsdWUgPSAnJyArIHZhbHVlO1xuICAgICAgc2V0LmNhbGwodGhpcywgdmFsdWUpO1xuICAgIH1cbiAgfSk7IC8vIFdlIGNvdWxkJ3ZlIHBhc3NlZCB0aGlzIHRoZSBmaXJzdCB0aW1lXG4gIC8vIGJ1dCBpdCB0cmlnZ2VycyBhIGJ1ZyBpbiBJRTExIGFuZCBFZGdlIDE0LzE1LlxuICAvLyBDYWxsaW5nIGRlZmluZVByb3BlcnR5KCkgYWdhaW4gc2hvdWxkIGJlIGVxdWl2YWxlbnQuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTE3NjhcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobm9kZSwgdmFsdWVGaWVsZCwge1xuICAgIGVudW1lcmFibGU6IGRlc2NyaXB0b3IuZW51bWVyYWJsZVxuICB9KTtcbiAgdmFyIHRyYWNrZXIgPSB7XG4gICAgZ2V0VmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBjdXJyZW50VmFsdWU7XG4gICAgfSxcbiAgICBzZXRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICB7XG4gICAgICAgIGNoZWNrRm9ybUZpZWxkVmFsdWVTdHJpbmdDb2VyY2lvbih2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnRWYWx1ZSA9ICcnICsgdmFsdWU7XG4gICAgfSxcbiAgICBzdG9wVHJhY2tpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGRldGFjaFRyYWNrZXIobm9kZSk7XG4gICAgICBkZWxldGUgbm9kZVt2YWx1ZUZpZWxkXTtcbiAgICB9XG4gIH07XG4gIHJldHVybiB0cmFja2VyO1xufVxuXG5mdW5jdGlvbiB0cmFjayhub2RlKSB7XG4gIGlmIChnZXRUcmFja2VyKG5vZGUpKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIFRPRE86IE9uY2UgaXQncyBqdXN0IEZpYmVyIHdlIGNhbiBtb3ZlIHRoaXMgdG8gbm9kZS5fd3JhcHBlclN0YXRlXG5cblxuICBub2RlLl92YWx1ZVRyYWNrZXIgPSB0cmFja1ZhbHVlT25Ob2RlKG5vZGUpO1xufVxuZnVuY3Rpb24gdXBkYXRlVmFsdWVJZkNoYW5nZWQobm9kZSkge1xuICBpZiAoIW5vZGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgdHJhY2tlciA9IGdldFRyYWNrZXIobm9kZSk7IC8vIGlmIHRoZXJlIGlzIG5vIHRyYWNrZXIgYXQgdGhpcyBwb2ludCBpdCdzIHVubGlrZWx5XG4gIC8vIHRoYXQgdHJ5aW5nIGFnYWluIHdpbGwgc3VjY2VlZFxuXG4gIGlmICghdHJhY2tlcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdmFyIGxhc3RWYWx1ZSA9IHRyYWNrZXIuZ2V0VmFsdWUoKTtcbiAgdmFyIG5leHRWYWx1ZSA9IGdldFZhbHVlRnJvbU5vZGUobm9kZSk7XG5cbiAgaWYgKG5leHRWYWx1ZSAhPT0gbGFzdFZhbHVlKSB7XG4gICAgdHJhY2tlci5zZXRWYWx1ZShuZXh0VmFsdWUpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRBY3RpdmVFbGVtZW50KGRvYykge1xuICBkb2MgPSBkb2MgfHwgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgPyBkb2N1bWVudCA6IHVuZGVmaW5lZCk7XG5cbiAgaWYgKHR5cGVvZiBkb2MgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBkb2MuYWN0aXZlRWxlbWVudCB8fCBkb2MuYm9keTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBkb2MuYm9keTtcbiAgfVxufVxuXG52YXIgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlID0gZmFsc2U7XG52YXIgZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZCA9IGZhbHNlO1xudmFyIGRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQgPSBmYWxzZTtcbnZhciBkaWRXYXJuVW5jb250cm9sbGVkVG9Db250cm9sbGVkID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGlzQ29udHJvbGxlZChwcm9wcykge1xuICB2YXIgdXNlc0NoZWNrZWQgPSBwcm9wcy50eXBlID09PSAnY2hlY2tib3gnIHx8IHByb3BzLnR5cGUgPT09ICdyYWRpbyc7XG4gIHJldHVybiB1c2VzQ2hlY2tlZCA/IHByb3BzLmNoZWNrZWQgIT0gbnVsbCA6IHByb3BzLnZhbHVlICE9IG51bGw7XG59XG4vKipcbiAqIEltcGxlbWVudHMgYW4gPGlucHV0PiBob3N0IGNvbXBvbmVudCB0aGF0IGFsbG93cyBzZXR0aW5nIHRoZXNlIG9wdGlvbmFsXG4gKiBwcm9wczogYGNoZWNrZWRgLCBgdmFsdWVgLCBgZGVmYXVsdENoZWNrZWRgLCBhbmQgYGRlZmF1bHRWYWx1ZWAuXG4gKlxuICogSWYgYGNoZWNrZWRgIG9yIGB2YWx1ZWAgYXJlIG5vdCBzdXBwbGllZCAob3IgbnVsbC91bmRlZmluZWQpLCB1c2VyIGFjdGlvbnNcbiAqIHRoYXQgYWZmZWN0IHRoZSBjaGVja2VkIHN0YXRlIG9yIHZhbHVlIHdpbGwgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LlxuICpcbiAqIElmIHRoZXkgYXJlIHN1cHBsaWVkIChhbmQgbm90IG51bGwvdW5kZWZpbmVkKSwgdGhlIHJlbmRlcmVkIGVsZW1lbnQgd2lsbCBub3RcbiAqIHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgZWxlbWVudC4gSW5zdGVhZCwgdGhlIHByb3BzIG11c3QgY2hhbmdlIGluIG9yZGVyIGZvclxuICogdGhlIHJlbmRlcmVkIGVsZW1lbnQgdG8gYmUgdXBkYXRlZC5cbiAqXG4gKiBUaGUgcmVuZGVyZWQgZWxlbWVudCB3aWxsIGJlIGluaXRpYWxpemVkIGFzIHVuY2hlY2tlZCAob3IgYGRlZmF1bHRDaGVja2VkYClcbiAqIHdpdGggYW4gZW1wdHkgdmFsdWUgKG9yIGBkZWZhdWx0VmFsdWVgKS5cbiAqXG4gKiBTZWUgaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMi9XRC1odG1sNS0yMDEyMTAyNS90aGUtaW5wdXQtZWxlbWVudC5odG1sXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRIb3N0UHJvcHMoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgY2hlY2tlZCA9IHByb3BzLmNoZWNrZWQ7XG4gIHZhciBob3N0UHJvcHMgPSBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgZGVmYXVsdENoZWNrZWQ6IHVuZGVmaW5lZCxcbiAgICBkZWZhdWx0VmFsdWU6IHVuZGVmaW5lZCxcbiAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgIGNoZWNrZWQ6IGNoZWNrZWQgIT0gbnVsbCA/IGNoZWNrZWQgOiBub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbENoZWNrZWRcbiAgfSk7XG4gIHJldHVybiBob3N0UHJvcHM7XG59XG5mdW5jdGlvbiBpbml0V3JhcHBlclN0YXRlKGVsZW1lbnQsIHByb3BzKSB7XG4gIHtcbiAgICBjaGVja0NvbnRyb2xsZWRWYWx1ZVByb3BzKCdpbnB1dCcsIHByb3BzKTtcblxuICAgIGlmIChwcm9wcy5jaGVja2VkICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZGVmYXVsdENoZWNrZWQgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZCkge1xuICAgICAgZXJyb3IoJyVzIGNvbnRhaW5zIGFuIGlucHV0IG9mIHR5cGUgJXMgd2l0aCBib3RoIGNoZWNrZWQgYW5kIGRlZmF1bHRDaGVja2VkIHByb3BzLiAnICsgJ0lucHV0IGVsZW1lbnRzIG11c3QgYmUgZWl0aGVyIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkICcgKyAnKHNwZWNpZnkgZWl0aGVyIHRoZSBjaGVja2VkIHByb3AsIG9yIHRoZSBkZWZhdWx0Q2hlY2tlZCBwcm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgJyArICdlbGVtZW50IGFuZCByZW1vdmUgb25lIG9mIHRoZXNlIHByb3BzLiBNb3JlIGluZm86ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2NvbnRyb2xsZWQtY29tcG9uZW50cycsIGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCkgfHwgJ0EgY29tcG9uZW50JywgcHJvcHMudHlwZSk7XG5cbiAgICAgIGRpZFdhcm5DaGVja2VkRGVmYXVsdENoZWNrZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUpIHtcbiAgICAgIGVycm9yKCclcyBjb250YWlucyBhbiBpbnB1dCBvZiB0eXBlICVzIHdpdGggYm90aCB2YWx1ZSBhbmQgZGVmYXVsdFZhbHVlIHByb3BzLiAnICsgJ0lucHV0IGVsZW1lbnRzIG11c3QgYmUgZWl0aGVyIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkICcgKyAnKHNwZWNpZnkgZWl0aGVyIHRoZSB2YWx1ZSBwcm9wLCBvciB0aGUgZGVmYXVsdFZhbHVlIHByb3AsIGJ1dCBub3QgJyArICdib3RoKS4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCAnICsgJ2VsZW1lbnQgYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzJywgZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKSB8fCAnQSBjb21wb25lbnQnLCBwcm9wcy50eXBlKTtcblxuICAgICAgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIHZhciBkZWZhdWx0VmFsdWUgPSBwcm9wcy5kZWZhdWx0VmFsdWUgPT0gbnVsbCA/ICcnIDogcHJvcHMuZGVmYXVsdFZhbHVlO1xuICBub2RlLl93cmFwcGVyU3RhdGUgPSB7XG4gICAgaW5pdGlhbENoZWNrZWQ6IHByb3BzLmNoZWNrZWQgIT0gbnVsbCA/IHByb3BzLmNoZWNrZWQgOiBwcm9wcy5kZWZhdWx0Q2hlY2tlZCxcbiAgICBpbml0aWFsVmFsdWU6IGdldFRvU3RyaW5nVmFsdWUocHJvcHMudmFsdWUgIT0gbnVsbCA/IHByb3BzLnZhbHVlIDogZGVmYXVsdFZhbHVlKSxcbiAgICBjb250cm9sbGVkOiBpc0NvbnRyb2xsZWQocHJvcHMpXG4gIH07XG59XG5mdW5jdGlvbiB1cGRhdGVDaGVja2VkKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIGNoZWNrZWQgPSBwcm9wcy5jaGVja2VkO1xuXG4gIGlmIChjaGVja2VkICE9IG51bGwpIHtcbiAgICBzZXRWYWx1ZUZvclByb3BlcnR5KG5vZGUsICdjaGVja2VkJywgY2hlY2tlZCwgZmFsc2UpO1xuICB9XG59XG5mdW5jdGlvbiB1cGRhdGVXcmFwcGVyKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcblxuICB7XG4gICAgdmFyIGNvbnRyb2xsZWQgPSBpc0NvbnRyb2xsZWQocHJvcHMpO1xuXG4gICAgaWYgKCFub2RlLl93cmFwcGVyU3RhdGUuY29udHJvbGxlZCAmJiBjb250cm9sbGVkICYmICFkaWRXYXJuVW5jb250cm9sbGVkVG9Db250cm9sbGVkKSB7XG4gICAgICBlcnJvcignQSBjb21wb25lbnQgaXMgY2hhbmdpbmcgYW4gdW5jb250cm9sbGVkIGlucHV0IHRvIGJlIGNvbnRyb2xsZWQuICcgKyAnVGhpcyBpcyBsaWtlbHkgY2F1c2VkIGJ5IHRoZSB2YWx1ZSBjaGFuZ2luZyBmcm9tIHVuZGVmaW5lZCB0byAnICsgJ2EgZGVmaW5lZCB2YWx1ZSwgd2hpY2ggc2hvdWxkIG5vdCBoYXBwZW4uICcgKyAnRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCAnICsgJ2VsZW1lbnQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgY29tcG9uZW50LiBNb3JlIGluZm86IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnKTtcblxuICAgICAgZGlkV2FyblVuY29udHJvbGxlZFRvQ29udHJvbGxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUuX3dyYXBwZXJTdGF0ZS5jb250cm9sbGVkICYmICFjb250cm9sbGVkICYmICFkaWRXYXJuQ29udHJvbGxlZFRvVW5jb250cm9sbGVkKSB7XG4gICAgICBlcnJvcignQSBjb21wb25lbnQgaXMgY2hhbmdpbmcgYSBjb250cm9sbGVkIGlucHV0IHRvIGJlIHVuY29udHJvbGxlZC4gJyArICdUaGlzIGlzIGxpa2VseSBjYXVzZWQgYnkgdGhlIHZhbHVlIGNoYW5naW5nIGZyb20gYSBkZWZpbmVkIHRvICcgKyAndW5kZWZpbmVkLCB3aGljaCBzaG91bGQgbm90IGhhcHBlbi4gJyArICdEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIGlucHV0ICcgKyAnZWxlbWVudCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBjb21wb25lbnQuIE1vcmUgaW5mbzogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2NvbnRyb2xsZWQtY29tcG9uZW50cycpO1xuXG4gICAgICBkaWRXYXJuQ29udHJvbGxlZFRvVW5jb250cm9sbGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVDaGVja2VkKGVsZW1lbnQsIHByb3BzKTtcbiAgdmFyIHZhbHVlID0gZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy52YWx1ZSk7XG4gIHZhciB0eXBlID0gcHJvcHMudHlwZTtcblxuICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgIGlmICh0eXBlID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKHZhbHVlID09PSAwICYmIG5vZGUudmFsdWUgPT09ICcnIHx8IC8vIFdlIGV4cGxpY2l0bHkgd2FudCB0byBjb2VyY2UgdG8gbnVtYmVyIGhlcmUgaWYgcG9zc2libGUuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgIG5vZGUudmFsdWUgIT0gdmFsdWUpIHtcbiAgICAgICAgbm9kZS52YWx1ZSA9IHRvU3RyaW5nKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vZGUudmFsdWUgIT09IHRvU3RyaW5nKHZhbHVlKSkge1xuICAgICAgbm9kZS52YWx1ZSA9IHRvU3RyaW5nKHZhbHVlKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3N1Ym1pdCcgfHwgdHlwZSA9PT0gJ3Jlc2V0Jykge1xuICAgIC8vIFN1Ym1pdC9yZXNldCBpbnB1dHMgbmVlZCB0aGUgYXR0cmlidXRlIHJlbW92ZWQgY29tcGxldGVseSB0byBhdm9pZFxuICAgIC8vIGJsYW5rLXRleHQgYnV0dG9ucy5cbiAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZSgndmFsdWUnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB7XG4gICAgLy8gV2hlbiBzeW5jaW5nIHRoZSB2YWx1ZSBhdHRyaWJ1dGUsIHRoZSB2YWx1ZSBjb21lcyBmcm9tIGEgY2FzY2FkZSBvZlxuICAgIC8vIHByb3BlcnRpZXM6XG4gICAgLy8gIDEuIFRoZSB2YWx1ZSBSZWFjdCBwcm9wZXJ0eVxuICAgIC8vICAyLiBUaGUgZGVmYXVsdFZhbHVlIFJlYWN0IHByb3BlcnR5XG4gICAgLy8gIDMuIE90aGVyd2lzZSB0aGVyZSBzaG91bGQgYmUgbm8gY2hhbmdlXG4gICAgaWYgKHByb3BzLmhhc093blByb3BlcnR5KCd2YWx1ZScpKSB7XG4gICAgICBzZXREZWZhdWx0VmFsdWUobm9kZSwgcHJvcHMudHlwZSwgdmFsdWUpO1xuICAgIH0gZWxzZSBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoJ2RlZmF1bHRWYWx1ZScpKSB7XG4gICAgICBzZXREZWZhdWx0VmFsdWUobm9kZSwgcHJvcHMudHlwZSwgZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy5kZWZhdWx0VmFsdWUpKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgLy8gV2hlbiBzeW5jaW5nIHRoZSBjaGVja2VkIGF0dHJpYnV0ZSwgaXQgb25seSBjaGFuZ2VzIHdoZW4gaXQgbmVlZHNcbiAgICAvLyB0byBiZSByZW1vdmVkLCBzdWNoIGFzIHRyYW5zaXRpb25pbmcgZnJvbSBhIGNoZWNrYm94IGludG8gYSB0ZXh0IGlucHV0XG4gICAgaWYgKHByb3BzLmNoZWNrZWQgPT0gbnVsbCAmJiBwcm9wcy5kZWZhdWx0Q2hlY2tlZCAhPSBudWxsKSB7XG4gICAgICBub2RlLmRlZmF1bHRDaGVja2VkID0gISFwcm9wcy5kZWZhdWx0Q2hlY2tlZDtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHBvc3RNb3VudFdyYXBwZXIoZWxlbWVudCwgcHJvcHMsIGlzSHlkcmF0aW5nKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDsgLy8gRG8gbm90IGFzc2lnbiB2YWx1ZSBpZiBpdCBpcyBhbHJlYWR5IHNldC4gVGhpcyBwcmV2ZW50cyB1c2VyIHRleHQgaW5wdXRcbiAgLy8gZnJvbSBiZWluZyBsb3N0IGR1cmluZyBTU1IgaHlkcmF0aW9uLlxuXG4gIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eSgndmFsdWUnKSB8fCBwcm9wcy5oYXNPd25Qcm9wZXJ0eSgnZGVmYXVsdFZhbHVlJykpIHtcbiAgICB2YXIgdHlwZSA9IHByb3BzLnR5cGU7XG4gICAgdmFyIGlzQnV0dG9uID0gdHlwZSA9PT0gJ3N1Ym1pdCcgfHwgdHlwZSA9PT0gJ3Jlc2V0JzsgLy8gQXZvaWQgc2V0dGluZyB2YWx1ZSBhdHRyaWJ1dGUgb24gc3VibWl0L3Jlc2V0IGlucHV0cyBhcyBpdCBvdmVycmlkZXMgdGhlXG4gICAgLy8gZGVmYXVsdCB2YWx1ZSBwcm92aWRlZCBieSB0aGUgYnJvd3Nlci4gU2VlOiAjMTI4NzJcblxuICAgIGlmIChpc0J1dHRvbiAmJiAocHJvcHMudmFsdWUgPT09IHVuZGVmaW5lZCB8fCBwcm9wcy52YWx1ZSA9PT0gbnVsbCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgaW5pdGlhbFZhbHVlID0gdG9TdHJpbmcobm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSk7IC8vIERvIG5vdCBhc3NpZ24gdmFsdWUgaWYgaXQgaXMgYWxyZWFkeSBzZXQuIFRoaXMgcHJldmVudHMgdXNlciB0ZXh0IGlucHV0XG4gICAgLy8gZnJvbSBiZWluZyBsb3N0IGR1cmluZyBTU1IgaHlkcmF0aW9uLlxuXG4gICAgaWYgKCFpc0h5ZHJhdGluZykge1xuICAgICAge1xuICAgICAgICAvLyBXaGVuIHN5bmNpbmcgdGhlIHZhbHVlIGF0dHJpYnV0ZSwgdGhlIHZhbHVlIHByb3BlcnR5IHNob3VsZCB1c2VcbiAgICAgICAgLy8gdGhlIHdyYXBwZXJTdGF0ZS5faW5pdGlhbFZhbHVlIHByb3BlcnR5LiBUaGlzIHVzZXM6XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgMS4gVGhlIHZhbHVlIFJlYWN0IHByb3BlcnR5IHdoZW4gcHJlc2VudFxuICAgICAgICAvLyAgIDIuIFRoZSBkZWZhdWx0VmFsdWUgUmVhY3QgcHJvcGVydHkgd2hlbiBwcmVzZW50XG4gICAgICAgIC8vICAgMy4gQW4gZW1wdHkgc3RyaW5nXG4gICAgICAgIGlmIChpbml0aWFsVmFsdWUgIT09IG5vZGUudmFsdWUpIHtcbiAgICAgICAgICBub2RlLnZhbHVlID0gaW5pdGlhbFZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAge1xuICAgICAgLy8gT3RoZXJ3aXNlLCB0aGUgdmFsdWUgYXR0cmlidXRlIGlzIHN5bmNocm9uaXplZCB0byB0aGUgcHJvcGVydHksXG4gICAgICAvLyBzbyB3ZSBhc3NpZ24gZGVmYXVsdFZhbHVlIHRvIHRoZSBzYW1lIHRoaW5nIGFzIHRoZSB2YWx1ZSBwcm9wZXJ0eVxuICAgICAgLy8gYXNzaWdubWVudCBzdGVwIGFib3ZlLlxuICAgICAgbm9kZS5kZWZhdWx0VmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gICAgfVxuICB9IC8vIE5vcm1hbGx5LCB3ZSdkIGp1c3QgZG8gYG5vZGUuY2hlY2tlZCA9IG5vZGUuY2hlY2tlZGAgdXBvbiBpbml0aWFsIG1vdW50LCBsZXNzIHRoaXMgYnVnXG4gIC8vIHRoaXMgaXMgbmVlZGVkIHRvIHdvcmsgYXJvdW5kIGEgY2hyb21lIGJ1ZyB3aGVyZSBzZXR0aW5nIGRlZmF1bHRDaGVja2VkXG4gIC8vIHdpbGwgc29tZXRpbWVzIGluZmx1ZW5jZSB0aGUgdmFsdWUgb2YgY2hlY2tlZCAoZXZlbiBhZnRlciBkZXRhY2htZW50KS5cbiAgLy8gUmVmZXJlbmNlOiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD02MDg0MTZcbiAgLy8gV2UgbmVlZCB0byB0ZW1wb3JhcmlseSB1bnNldCBuYW1lIHRvIGF2b2lkIGRpc3J1cHRpbmcgcmFkaW8gYnV0dG9uIGdyb3Vwcy5cblxuXG4gIHZhciBuYW1lID0gbm9kZS5uYW1lO1xuXG4gIGlmIChuYW1lICE9PSAnJykge1xuICAgIG5vZGUubmFtZSA9ICcnO1xuICB9XG5cbiAge1xuICAgIC8vIFdoZW4gc3luY2luZyB0aGUgY2hlY2tlZCBhdHRyaWJ1dGUsIGJvdGggdGhlIGNoZWNrZWQgcHJvcGVydHkgYW5kXG4gICAgLy8gYXR0cmlidXRlIGFyZSBhc3NpZ25lZCBhdCB0aGUgc2FtZSB0aW1lIHVzaW5nIGRlZmF1bHRDaGVja2VkLiBUaGlzIHVzZXM6XG4gICAgLy9cbiAgICAvLyAgIDEuIFRoZSBjaGVja2VkIFJlYWN0IHByb3BlcnR5IHdoZW4gcHJlc2VudFxuICAgIC8vICAgMi4gVGhlIGRlZmF1bHRDaGVja2VkIFJlYWN0IHByb3BlcnR5IHdoZW4gcHJlc2VudFxuICAgIC8vICAgMy4gT3RoZXJ3aXNlLCBmYWxzZVxuICAgIG5vZGUuZGVmYXVsdENoZWNrZWQgPSAhbm9kZS5kZWZhdWx0Q2hlY2tlZDtcbiAgICBub2RlLmRlZmF1bHRDaGVja2VkID0gISFub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbENoZWNrZWQ7XG4gIH1cblxuICBpZiAobmFtZSAhPT0gJycpIHtcbiAgICBub2RlLm5hbWUgPSBuYW1lO1xuICB9XG59XG5mdW5jdGlvbiByZXN0b3JlQ29udHJvbGxlZFN0YXRlKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdXBkYXRlV3JhcHBlcihub2RlLCBwcm9wcyk7XG4gIHVwZGF0ZU5hbWVkQ291c2lucyhub2RlLCBwcm9wcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU5hbWVkQ291c2lucyhyb290Tm9kZSwgcHJvcHMpIHtcbiAgdmFyIG5hbWUgPSBwcm9wcy5uYW1lO1xuXG4gIGlmIChwcm9wcy50eXBlID09PSAncmFkaW8nICYmIG5hbWUgIT0gbnVsbCkge1xuICAgIHZhciBxdWVyeVJvb3QgPSByb290Tm9kZTtcblxuICAgIHdoaWxlIChxdWVyeVJvb3QucGFyZW50Tm9kZSkge1xuICAgICAgcXVlcnlSb290ID0gcXVlcnlSb290LnBhcmVudE5vZGU7XG4gICAgfSAvLyBJZiBgcm9vdE5vZGUuZm9ybWAgd2FzIG5vbi1udWxsLCB0aGVuIHdlIGNvdWxkIHRyeSBgZm9ybS5lbGVtZW50c2AsXG4gICAgLy8gYnV0IHRoYXQgc29tZXRpbWVzIGJlaGF2ZXMgc3RyYW5nZWx5IGluIElFOC4gV2UgY291bGQgYWxzbyB0cnkgdXNpbmdcbiAgICAvLyBgZm9ybS5nZXRFbGVtZW50c0J5TmFtZWAsIGJ1dCB0aGF0IHdpbGwgb25seSByZXR1cm4gZGlyZWN0IGNoaWxkcmVuXG4gICAgLy8gYW5kIHdvbid0IGluY2x1ZGUgaW5wdXRzIHRoYXQgdXNlIHRoZSBIVE1MNSBgZm9ybT1gIGF0dHJpYnV0ZS4gU2luY2VcbiAgICAvLyB0aGUgaW5wdXQgbWlnaHQgbm90IGV2ZW4gYmUgaW4gYSBmb3JtLiBJdCBtaWdodCBub3QgZXZlbiBiZSBpbiB0aGVcbiAgICAvLyBkb2N1bWVudC4gTGV0J3MganVzdCB1c2UgdGhlIGxvY2FsIGBxdWVyeVNlbGVjdG9yQWxsYCB0byBlbnN1cmUgd2UgZG9uJ3RcbiAgICAvLyBtaXNzIGFueXRoaW5nLlxuXG5cbiAgICB7XG4gICAgICBjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKG5hbWUsICduYW1lJyk7XG4gICAgfVxuXG4gICAgdmFyIGdyb3VwID0gcXVlcnlSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W25hbWU9JyArIEpTT04uc3RyaW5naWZ5KCcnICsgbmFtZSkgKyAnXVt0eXBlPVwicmFkaW9cIl0nKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ3JvdXAubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBvdGhlck5vZGUgPSBncm91cFtpXTtcblxuICAgICAgaWYgKG90aGVyTm9kZSA9PT0gcm9vdE5vZGUgfHwgb3RoZXJOb2RlLmZvcm0gIT09IHJvb3ROb2RlLmZvcm0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IC8vIFRoaXMgd2lsbCB0aHJvdyBpZiByYWRpbyBidXR0b25zIHJlbmRlcmVkIGJ5IGRpZmZlcmVudCBjb3BpZXMgb2YgUmVhY3RcbiAgICAgIC8vIGFuZCB0aGUgc2FtZSBuYW1lIGFyZSByZW5kZXJlZCBpbnRvIHRoZSBzYW1lIGZvcm0gKHNhbWUgYXMgIzE5MzkpLlxuICAgICAgLy8gVGhhdCdzIHByb2JhYmx5IG9rYXk7IHdlIGRvbid0IHN1cHBvcnQgaXQganVzdCBhcyB3ZSBkb24ndCBzdXBwb3J0XG4gICAgICAvLyBtaXhpbmcgUmVhY3QgcmFkaW8gYnV0dG9ucyB3aXRoIG5vbi1SZWFjdCBvbmVzLlxuXG5cbiAgICAgIHZhciBvdGhlclByb3BzID0gZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZShvdGhlck5vZGUpO1xuXG4gICAgICBpZiAoIW90aGVyUHJvcHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWFjdERPTUlucHV0OiBNaXhpbmcgUmVhY3QgYW5kIG5vbi1SZWFjdCByYWRpbyBpbnB1dHMgd2l0aCB0aGUgJyArICdzYW1lIGBuYW1lYCBpcyBub3Qgc3VwcG9ydGVkLicpO1xuICAgICAgfSAvLyBXZSBuZWVkIHVwZGF0ZSB0aGUgdHJhY2tlZCB2YWx1ZSBvbiB0aGUgbmFtZWQgY291c2luIHNpbmNlIHRoZSB2YWx1ZVxuICAgICAgLy8gd2FzIGNoYW5nZWQgYnV0IHRoZSBpbnB1dCBzYXcgbm8gZXZlbnQgb3IgdmFsdWUgc2V0XG5cblxuICAgICAgdXBkYXRlVmFsdWVJZkNoYW5nZWQob3RoZXJOb2RlKTsgLy8gSWYgdGhpcyBpcyBhIGNvbnRyb2xsZWQgcmFkaW8gYnV0dG9uIGdyb3VwLCBmb3JjaW5nIHRoZSBpbnB1dCB0aGF0XG4gICAgICAvLyB3YXMgcHJldmlvdXNseSBjaGVja2VkIHRvIHVwZGF0ZSB3aWxsIGNhdXNlIGl0IHRvIGJlIGNvbWUgcmUtY2hlY2tlZFxuICAgICAgLy8gYXMgYXBwcm9wcmlhdGUuXG5cbiAgICAgIHVwZGF0ZVdyYXBwZXIob3RoZXJOb2RlLCBvdGhlclByb3BzKTtcbiAgICB9XG4gIH1cbn0gLy8gSW4gQ2hyb21lLCBhc3NpZ25pbmcgZGVmYXVsdFZhbHVlIHRvIGNlcnRhaW4gaW5wdXQgdHlwZXMgdHJpZ2dlcnMgaW5wdXQgdmFsaWRhdGlvbi5cbi8vIEZvciBudW1iZXIgaW5wdXRzLCB0aGUgZGlzcGxheSB2YWx1ZSBsb3NlcyB0cmFpbGluZyBkZWNpbWFsIHBvaW50cy4gRm9yIGVtYWlsIGlucHV0cyxcbi8vIENocm9tZSByYWlzZXMgXCJUaGUgc3BlY2lmaWVkIHZhbHVlIDx4PiBpcyBub3QgYSB2YWxpZCBlbWFpbCBhZGRyZXNzXCIuXG4vL1xuLy8gSGVyZSB3ZSBjaGVjayB0byBzZWUgaWYgdGhlIGRlZmF1bHRWYWx1ZSBoYXMgYWN0dWFsbHkgY2hhbmdlZCwgYXZvaWRpbmcgdGhlc2UgcHJvYmxlbXNcbi8vIHdoZW4gdGhlIHVzZXIgaXMgaW5wdXR0aW5nIHRleHRcbi8vXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcyNTNcblxuXG5mdW5jdGlvbiBzZXREZWZhdWx0VmFsdWUobm9kZSwgdHlwZSwgdmFsdWUpIHtcbiAgaWYgKCAvLyBGb2N1c2VkIG51bWJlciBpbnB1dHMgc3luY2hyb25pemUgb24gYmx1ci4gU2VlIENoYW5nZUV2ZW50UGx1Z2luLmpzXG4gIHR5cGUgIT09ICdudW1iZXInIHx8IGdldEFjdGl2ZUVsZW1lbnQobm9kZS5vd25lckRvY3VtZW50KSAhPT0gbm9kZSkge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IHRvU3RyaW5nKG5vZGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUpO1xuICAgIH0gZWxzZSBpZiAobm9kZS5kZWZhdWx0VmFsdWUgIT09IHRvU3RyaW5nKHZhbHVlKSkge1xuICAgICAgbm9kZS5kZWZhdWx0VmFsdWUgPSB0b1N0cmluZyh2YWx1ZSk7XG4gICAgfVxuICB9XG59XG5cbnZhciBkaWRXYXJuU2VsZWN0ZWRTZXRPbk9wdGlvbiA9IGZhbHNlO1xudmFyIGRpZFdhcm5JbnZhbGlkQ2hpbGQgPSBmYWxzZTtcbnZhciBkaWRXYXJuSW52YWxpZElubmVySFRNTCA9IGZhbHNlO1xuLyoqXG4gKiBJbXBsZW1lbnRzIGFuIDxvcHRpb24+IGhvc3QgY29tcG9uZW50IHRoYXQgd2FybnMgd2hlbiBgc2VsZWN0ZWRgIGlzIHNldC5cbiAqL1xuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BzKGVsZW1lbnQsIHByb3BzKSB7XG4gIHtcbiAgICAvLyBJZiBhIHZhbHVlIGlzIG5vdCBwcm92aWRlZCwgdGhlbiB0aGUgY2hpbGRyZW4gbXVzdCBiZSBzaW1wbGUuXG4gICAgaWYgKHByb3BzLnZhbHVlID09IG51bGwpIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcHMuY2hpbGRyZW4gPT09ICdvYmplY3QnICYmIHByb3BzLmNoaWxkcmVuICE9PSBudWxsKSB7XG4gICAgICAgIFJlYWN0LkNoaWxkcmVuLmZvckVhY2gocHJvcHMuY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICAgIGlmIChjaGlsZCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHR5cGVvZiBjaGlsZCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGNoaWxkID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghZGlkV2FybkludmFsaWRDaGlsZCkge1xuICAgICAgICAgICAgZGlkV2FybkludmFsaWRDaGlsZCA9IHRydWU7XG5cbiAgICAgICAgICAgIGVycm9yKCdDYW5ub3QgaW5mZXIgdGhlIG9wdGlvbiB2YWx1ZSBvZiBjb21wbGV4IGNoaWxkcmVuLiAnICsgJ1Bhc3MgYSBgdmFsdWVgIHByb3Agb3IgdXNlIGEgcGxhaW4gc3RyaW5nIGFzIGNoaWxkcmVuIHRvIDxvcHRpb24+LicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICE9IG51bGwpIHtcbiAgICAgICAgaWYgKCFkaWRXYXJuSW52YWxpZElubmVySFRNTCkge1xuICAgICAgICAgIGRpZFdhcm5JbnZhbGlkSW5uZXJIVE1MID0gdHJ1ZTtcblxuICAgICAgICAgIGVycm9yKCdQYXNzIGEgYHZhbHVlYCBwcm9wIGlmIHlvdSBzZXQgZGFuZ2Vyb3VzbHlJbm5lckhUTUwgc28gUmVhY3Qga25vd3MgJyArICd3aGljaCB2YWx1ZSBzaG91bGQgYmUgc2VsZWN0ZWQuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIFRPRE86IFJlbW92ZSBzdXBwb3J0IGZvciBgc2VsZWN0ZWRgIGluIDxvcHRpb24+LlxuXG5cbiAgICBpZiAocHJvcHMuc2VsZWN0ZWQgIT0gbnVsbCAmJiAhZGlkV2FyblNlbGVjdGVkU2V0T25PcHRpb24pIHtcbiAgICAgIGVycm9yKCdVc2UgdGhlIGBkZWZhdWx0VmFsdWVgIG9yIGB2YWx1ZWAgcHJvcHMgb24gPHNlbGVjdD4gaW5zdGVhZCBvZiAnICsgJ3NldHRpbmcgYHNlbGVjdGVkYCBvbiA8b3B0aW9uPi4nKTtcblxuICAgICAgZGlkV2FyblNlbGVjdGVkU2V0T25PcHRpb24gPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcG9zdE1vdW50V3JhcHBlciQxKGVsZW1lbnQsIHByb3BzKSB7XG4gIC8vIHZhbHVlPVwiXCIgc2hvdWxkIG1ha2UgYSB2YWx1ZSBhdHRyaWJ1dGUgKCM2MjE5KVxuICBpZiAocHJvcHMudmFsdWUgIT0gbnVsbCkge1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCd2YWx1ZScsIHRvU3RyaW5nKGdldFRvU3RyaW5nVmFsdWUocHJvcHMudmFsdWUpKSk7XG4gIH1cbn1cblxudmFyIGlzQXJyYXlJbXBsID0gQXJyYXkuaXNBcnJheTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlZGVjbGFyZVxuXG5mdW5jdGlvbiBpc0FycmF5KGEpIHtcbiAgcmV0dXJuIGlzQXJyYXlJbXBsKGEpO1xufVxuXG52YXIgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlJDE7XG5cbntcbiAgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlJDEgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkge1xuICB2YXIgb3duZXJOYW1lID0gZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKTtcblxuICBpZiAob3duZXJOYW1lKSB7XG4gICAgcmV0dXJuICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG93bmVyTmFtZSArICdgLic7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbnZhciB2YWx1ZVByb3BOYW1lcyA9IFsndmFsdWUnLCAnZGVmYXVsdFZhbHVlJ107XG4vKipcbiAqIFZhbGlkYXRpb24gZnVuY3Rpb24gZm9yIGB2YWx1ZWAgYW5kIGBkZWZhdWx0VmFsdWVgLlxuICovXG5cbmZ1bmN0aW9uIGNoZWNrU2VsZWN0UHJvcFR5cGVzKHByb3BzKSB7XG4gIHtcbiAgICBjaGVja0NvbnRyb2xsZWRWYWx1ZVByb3BzKCdzZWxlY3QnLCBwcm9wcyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlUHJvcE5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvcE5hbWUgPSB2YWx1ZVByb3BOYW1lc1tpXTtcblxuICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgcHJvcE5hbWVJc0FycmF5ID0gaXNBcnJheShwcm9wc1twcm9wTmFtZV0pO1xuXG4gICAgICBpZiAocHJvcHMubXVsdGlwbGUgJiYgIXByb3BOYW1lSXNBcnJheSkge1xuICAgICAgICBlcnJvcignVGhlIGAlc2AgcHJvcCBzdXBwbGllZCB0byA8c2VsZWN0PiBtdXN0IGJlIGFuIGFycmF5IGlmICcgKyAnYG11bHRpcGxlYCBpcyB0cnVlLiVzJywgcHJvcE5hbWUsIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpKTtcbiAgICAgIH0gZWxzZSBpZiAoIXByb3BzLm11bHRpcGxlICYmIHByb3BOYW1lSXNBcnJheSkge1xuICAgICAgICBlcnJvcignVGhlIGAlc2AgcHJvcCBzdXBwbGllZCB0byA8c2VsZWN0PiBtdXN0IGJlIGEgc2NhbGFyICcgKyAndmFsdWUgaWYgYG11bHRpcGxlYCBpcyBmYWxzZS4lcycsIHByb3BOYW1lLCBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU9wdGlvbnMobm9kZSwgbXVsdGlwbGUsIHByb3BWYWx1ZSwgc2V0RGVmYXVsdFNlbGVjdGVkKSB7XG4gIHZhciBvcHRpb25zID0gbm9kZS5vcHRpb25zO1xuXG4gIGlmIChtdWx0aXBsZSkge1xuICAgIHZhciBzZWxlY3RlZFZhbHVlcyA9IHByb3BWYWx1ZTtcbiAgICB2YXIgc2VsZWN0ZWRWYWx1ZSA9IHt9O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxlY3RlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gUHJlZml4IHRvIGF2b2lkIGNoYW9zIHdpdGggc3BlY2lhbCBrZXlzLlxuICAgICAgc2VsZWN0ZWRWYWx1ZVsnJCcgKyBzZWxlY3RlZFZhbHVlc1tpXV0gPSB0cnVlO1xuICAgIH1cblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBvcHRpb25zLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIHNlbGVjdGVkID0gc2VsZWN0ZWRWYWx1ZS5oYXNPd25Qcm9wZXJ0eSgnJCcgKyBvcHRpb25zW19pXS52YWx1ZSk7XG5cbiAgICAgIGlmIChvcHRpb25zW19pXS5zZWxlY3RlZCAhPT0gc2VsZWN0ZWQpIHtcbiAgICAgICAgb3B0aW9uc1tfaV0uc2VsZWN0ZWQgPSBzZWxlY3RlZDtcbiAgICAgIH1cblxuICAgICAgaWYgKHNlbGVjdGVkICYmIHNldERlZmF1bHRTZWxlY3RlZCkge1xuICAgICAgICBvcHRpb25zW19pXS5kZWZhdWx0U2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBEbyBub3Qgc2V0IGBzZWxlY3QudmFsdWVgIGFzIGV4YWN0IGJlaGF2aW9yIGlzbid0IGNvbnNpc3RlbnQgYWNyb3NzIGFsbFxuICAgIC8vIGJyb3dzZXJzIGZvciBhbGwgY2FzZXMuXG4gICAgdmFyIF9zZWxlY3RlZFZhbHVlID0gdG9TdHJpbmcoZ2V0VG9TdHJpbmdWYWx1ZShwcm9wVmFsdWUpKTtcblxuICAgIHZhciBkZWZhdWx0U2VsZWN0ZWQgPSBudWxsO1xuXG4gICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgb3B0aW9ucy5sZW5ndGg7IF9pMisrKSB7XG4gICAgICBpZiAob3B0aW9uc1tfaTJdLnZhbHVlID09PSBfc2VsZWN0ZWRWYWx1ZSkge1xuICAgICAgICBvcHRpb25zW19pMl0uc2VsZWN0ZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmIChzZXREZWZhdWx0U2VsZWN0ZWQpIHtcbiAgICAgICAgICBvcHRpb25zW19pMl0uZGVmYXVsdFNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGRlZmF1bHRTZWxlY3RlZCA9PT0gbnVsbCAmJiAhb3B0aW9uc1tfaTJdLmRpc2FibGVkKSB7XG4gICAgICAgIGRlZmF1bHRTZWxlY3RlZCA9IG9wdGlvbnNbX2kyXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGVmYXVsdFNlbGVjdGVkICE9PSBudWxsKSB7XG4gICAgICBkZWZhdWx0U2VsZWN0ZWQuc2VsZWN0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBJbXBsZW1lbnRzIGEgPHNlbGVjdD4gaG9zdCBjb21wb25lbnQgdGhhdCBhbGxvd3Mgb3B0aW9uYWxseSBzZXR0aW5nIHRoZVxuICogcHJvcHMgYHZhbHVlYCBhbmQgYGRlZmF1bHRWYWx1ZWAuIElmIGBtdWx0aXBsZWAgaXMgZmFsc2UsIHRoZSBwcm9wIG11c3QgYmUgYVxuICogc3RyaW5nYWJsZS4gSWYgYG11bHRpcGxlYCBpcyB0cnVlLCB0aGUgcHJvcCBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ2FibGVzLlxuICpcbiAqIElmIGB2YWx1ZWAgaXMgbm90IHN1cHBsaWVkIChvciBudWxsL3VuZGVmaW5lZCksIHVzZXIgYWN0aW9ucyB0aGF0IGNoYW5nZSB0aGVcbiAqIHNlbGVjdGVkIG9wdGlvbiB3aWxsIHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgcmVuZGVyZWQgb3B0aW9ucy5cbiAqXG4gKiBJZiBpdCBpcyBzdXBwbGllZCAoYW5kIG5vdCBudWxsL3VuZGVmaW5lZCksIHRoZSByZW5kZXJlZCBvcHRpb25zIHdpbGwgbm90XG4gKiB1cGRhdGUgaW4gcmVzcG9uc2UgdG8gdXNlciBhY3Rpb25zLiBJbnN0ZWFkLCB0aGUgYHZhbHVlYCBwcm9wIG11c3QgY2hhbmdlIGluXG4gKiBvcmRlciBmb3IgdGhlIHJlbmRlcmVkIG9wdGlvbnMgdG8gdXBkYXRlLlxuICpcbiAqIElmIGBkZWZhdWx0VmFsdWVgIGlzIHByb3ZpZGVkLCBhbnkgb3B0aW9ucyB3aXRoIHRoZSBzdXBwbGllZCB2YWx1ZXMgd2lsbCBiZVxuICogc2VsZWN0ZWQuXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRIb3N0UHJvcHMkMShlbGVtZW50LCBwcm9wcykge1xuICByZXR1cm4gYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHZhbHVlOiB1bmRlZmluZWRcbiAgfSk7XG59XG5mdW5jdGlvbiBpbml0V3JhcHBlclN0YXRlJDEoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuXG4gIHtcbiAgICBjaGVja1NlbGVjdFByb3BUeXBlcyhwcm9wcyk7XG4gIH1cblxuICBub2RlLl93cmFwcGVyU3RhdGUgPSB7XG4gICAgd2FzTXVsdGlwbGU6ICEhcHJvcHMubXVsdGlwbGVcbiAgfTtcblxuICB7XG4gICAgaWYgKHByb3BzLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSQxKSB7XG4gICAgICBlcnJvcignU2VsZWN0IGVsZW1lbnRzIG11c3QgYmUgZWl0aGVyIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkICcgKyAnKHNwZWNpZnkgZWl0aGVyIHRoZSB2YWx1ZSBwcm9wLCBvciB0aGUgZGVmYXVsdFZhbHVlIHByb3AsIGJ1dCBub3QgJyArICdib3RoKS4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBzZWxlY3QgJyArICdlbGVtZW50IGFuZCByZW1vdmUgb25lIG9mIHRoZXNlIHByb3BzLiBNb3JlIGluZm86ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2NvbnRyb2xsZWQtY29tcG9uZW50cycpO1xuXG4gICAgICBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUkMSA9IHRydWU7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBwb3N0TW91bnRXcmFwcGVyJDIoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICBub2RlLm11bHRpcGxlID0gISFwcm9wcy5tdWx0aXBsZTtcbiAgdmFyIHZhbHVlID0gcHJvcHMudmFsdWU7XG5cbiAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICB1cGRhdGVPcHRpb25zKG5vZGUsICEhcHJvcHMubXVsdGlwbGUsIHZhbHVlLCBmYWxzZSk7XG4gIH0gZWxzZSBpZiAocHJvcHMuZGVmYXVsdFZhbHVlICE9IG51bGwpIHtcbiAgICB1cGRhdGVPcHRpb25zKG5vZGUsICEhcHJvcHMubXVsdGlwbGUsIHByb3BzLmRlZmF1bHRWYWx1ZSwgdHJ1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHBvc3RVcGRhdGVXcmFwcGVyKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIHdhc011bHRpcGxlID0gbm9kZS5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlO1xuICBub2RlLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGUgPSAhIXByb3BzLm11bHRpcGxlO1xuICB2YXIgdmFsdWUgPSBwcm9wcy52YWx1ZTtcblxuICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgdmFsdWUsIGZhbHNlKTtcbiAgfSBlbHNlIGlmICh3YXNNdWx0aXBsZSAhPT0gISFwcm9wcy5tdWx0aXBsZSkge1xuICAgIC8vIEZvciBzaW1wbGljaXR5LCByZWFwcGx5IGBkZWZhdWx0VmFsdWVgIGlmIGBtdWx0aXBsZWAgaXMgdG9nZ2xlZC5cbiAgICBpZiAocHJvcHMuZGVmYXVsdFZhbHVlICE9IG51bGwpIHtcbiAgICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgcHJvcHMuZGVmYXVsdFZhbHVlLCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmV2ZXJ0IHRoZSBzZWxlY3QgYmFjayB0byBpdHMgZGVmYXVsdCB1bnNlbGVjdGVkIHN0YXRlLlxuICAgICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCBwcm9wcy5tdWx0aXBsZSA/IFtdIDogJycsIGZhbHNlKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc3RvcmVDb250cm9sbGVkU3RhdGUkMShlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIHZhciB2YWx1ZSA9IHByb3BzLnZhbHVlO1xuXG4gIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCB2YWx1ZSwgZmFsc2UpO1xuICB9XG59XG5cbnZhciBkaWRXYXJuVmFsRGVmYXVsdFZhbCA9IGZhbHNlO1xuXG4vKipcbiAqIEltcGxlbWVudHMgYSA8dGV4dGFyZWE+IGhvc3QgY29tcG9uZW50IHRoYXQgYWxsb3dzIHNldHRpbmcgYHZhbHVlYCwgYW5kXG4gKiBgZGVmYXVsdFZhbHVlYC4gVGhpcyBkaWZmZXJzIGZyb20gdGhlIHRyYWRpdGlvbmFsIERPTSBBUEkgYmVjYXVzZSB2YWx1ZSBpc1xuICogdXN1YWxseSBzZXQgYXMgUENEQVRBIGNoaWxkcmVuLlxuICpcbiAqIElmIGB2YWx1ZWAgaXMgbm90IHN1cHBsaWVkIChvciBudWxsL3VuZGVmaW5lZCksIHVzZXIgYWN0aW9ucyB0aGF0IGFmZmVjdCB0aGVcbiAqIHZhbHVlIHdpbGwgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LlxuICpcbiAqIElmIGB2YWx1ZWAgaXMgc3VwcGxpZWQgKGFuZCBub3QgbnVsbC91bmRlZmluZWQpLCB0aGUgcmVuZGVyZWQgZWxlbWVudCB3aWxsXG4gKiBub3QgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LiBJbnN0ZWFkLCB0aGUgYHZhbHVlYCBwcm9wIG11c3QgY2hhbmdlIGluXG4gKiBvcmRlciBmb3IgdGhlIHJlbmRlcmVkIGVsZW1lbnQgdG8gYmUgdXBkYXRlZC5cbiAqXG4gKiBUaGUgcmVuZGVyZWQgZWxlbWVudCB3aWxsIGJlIGluaXRpYWxpemVkIHdpdGggYW4gZW1wdHkgdmFsdWUsIHRoZSBwcm9wXG4gKiBgZGVmYXVsdFZhbHVlYCBpZiBzcGVjaWZpZWQsIG9yIHRoZSBjaGlsZHJlbiBjb250ZW50IChkZXByZWNhdGVkKS5cbiAqL1xuZnVuY3Rpb24gZ2V0SG9zdFByb3BzJDIoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuXG4gIGlmIChwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAhPSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgIGRvZXMgbm90IG1ha2Ugc2Vuc2Ugb24gPHRleHRhcmVhPi4nKTtcbiAgfSAvLyBBbHdheXMgc2V0IGNoaWxkcmVuIHRvIHRoZSBzYW1lIHRoaW5nLiBJbiBJRTksIHRoZSBzZWxlY3Rpb24gcmFuZ2Ugd2lsbFxuICAvLyBnZXQgcmVzZXQgaWYgYHRleHRDb250ZW50YCBpcyBtdXRhdGVkLiAgV2UgY291bGQgYWRkIGEgY2hlY2sgaW4gc2V0VGV4dENvbnRlbnRcbiAgLy8gdG8gb25seSBzZXQgdGhlIHZhbHVlIGlmL3doZW4gdGhlIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgbm9kZSB2YWx1ZSAod2hpY2ggd291bGRcbiAgLy8gY29tcGxldGVseSBzb2x2ZSB0aGlzIElFOSBidWcpLCBidXQgU2ViYXN0aWFuK1NvcGhpZSBzZWVtZWQgdG8gbGlrZSB0aGlzXG4gIC8vIHNvbHV0aW9uLiBUaGUgdmFsdWUgY2FuIGJlIGEgYm9vbGVhbiBvciBvYmplY3Qgc28gdGhhdCdzIHdoeSBpdCdzIGZvcmNlZFxuICAvLyB0byBiZSBhIHN0cmluZy5cblxuXG4gIHZhciBob3N0UHJvcHMgPSBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICBkZWZhdWx0VmFsdWU6IHVuZGVmaW5lZCxcbiAgICBjaGlsZHJlbjogdG9TdHJpbmcobm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSlcbiAgfSk7XG5cbiAgcmV0dXJuIGhvc3RQcm9wcztcbn1cbmZ1bmN0aW9uIGluaXRXcmFwcGVyU3RhdGUkMihlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG5cbiAge1xuICAgIGNoZWNrQ29udHJvbGxlZFZhbHVlUHJvcHMoJ3RleHRhcmVhJywgcHJvcHMpO1xuXG4gICAgaWYgKHByb3BzLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWxEZWZhdWx0VmFsKSB7XG4gICAgICBlcnJvcignJXMgY29udGFpbnMgYSB0ZXh0YXJlYSB3aXRoIGJvdGggdmFsdWUgYW5kIGRlZmF1bHRWYWx1ZSBwcm9wcy4gJyArICdUZXh0YXJlYSBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAnICsgJyhzcGVjaWZ5IGVpdGhlciB0aGUgdmFsdWUgcHJvcCwgb3IgdGhlIGRlZmF1bHRWYWx1ZSBwcm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgdGV4dGFyZWEgJyArICdhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnLCBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpIHx8ICdBIGNvbXBvbmVudCcpO1xuXG4gICAgICBkaWRXYXJuVmFsRGVmYXVsdFZhbCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGluaXRpYWxWYWx1ZSA9IHByb3BzLnZhbHVlOyAvLyBPbmx5IGJvdGhlciBmZXRjaGluZyBkZWZhdWx0IHZhbHVlIGlmIHdlJ3JlIGdvaW5nIHRvIHVzZSBpdFxuXG4gIGlmIChpbml0aWFsVmFsdWUgPT0gbnVsbCkge1xuICAgIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgICBkZWZhdWx0VmFsdWUgPSBwcm9wcy5kZWZhdWx0VmFsdWU7XG5cbiAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkge1xuICAgICAge1xuICAgICAgICBlcnJvcignVXNlIHRoZSBgZGVmYXVsdFZhbHVlYCBvciBgdmFsdWVgIHByb3BzIGluc3RlYWQgb2Ygc2V0dGluZyAnICsgJ2NoaWxkcmVuIG9uIDx0ZXh0YXJlYT4uJyk7XG4gICAgICB9XG5cbiAgICAgIHtcbiAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJZiB5b3Ugc3VwcGx5IGBkZWZhdWx0VmFsdWVgIG9uIGEgPHRleHRhcmVhPiwgZG8gbm90IHBhc3MgY2hpbGRyZW4uJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCc8dGV4dGFyZWE+IGNhbiBvbmx5IGhhdmUgYXQgbW9zdCBvbmUgY2hpbGQuJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlblswXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IGNoaWxkcmVuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkZWZhdWx0VmFsdWUgPT0gbnVsbCkge1xuICAgICAgZGVmYXVsdFZhbHVlID0gJyc7XG4gICAgfVxuXG4gICAgaW5pdGlhbFZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICB9XG5cbiAgbm9kZS5fd3JhcHBlclN0YXRlID0ge1xuICAgIGluaXRpYWxWYWx1ZTogZ2V0VG9TdHJpbmdWYWx1ZShpbml0aWFsVmFsdWUpXG4gIH07XG59XG5mdW5jdGlvbiB1cGRhdGVXcmFwcGVyJDEoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgdmFsdWUgPSBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLnZhbHVlKTtcbiAgdmFyIGRlZmF1bHRWYWx1ZSA9IGdldFRvU3RyaW5nVmFsdWUocHJvcHMuZGVmYXVsdFZhbHVlKTtcblxuICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgIC8vIENhc3QgYHZhbHVlYCB0byBhIHN0cmluZyB0byBlbnN1cmUgdGhlIHZhbHVlIGlzIHNldCBjb3JyZWN0bHkuIFdoaWxlXG4gICAgLy8gYnJvd3NlcnMgdHlwaWNhbGx5IGRvIHRoaXMgYXMgbmVjZXNzYXJ5LCBqc2RvbSBkb2Vzbid0LlxuICAgIHZhciBuZXdWYWx1ZSA9IHRvU3RyaW5nKHZhbHVlKTsgLy8gVG8gYXZvaWQgc2lkZSBlZmZlY3RzIChzdWNoIGFzIGxvc2luZyB0ZXh0IHNlbGVjdGlvbiksIG9ubHkgc2V0IHZhbHVlIGlmIGNoYW5nZWRcblxuICAgIGlmIChuZXdWYWx1ZSAhPT0gbm9kZS52YWx1ZSkge1xuICAgICAgbm9kZS52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5kZWZhdWx0VmFsdWUgPT0gbnVsbCAmJiBub2RlLmRlZmF1bHRWYWx1ZSAhPT0gbmV3VmFsdWUpIHtcbiAgICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gbmV3VmFsdWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7XG4gICAgbm9kZS5kZWZhdWx0VmFsdWUgPSB0b1N0cmluZyhkZWZhdWx0VmFsdWUpO1xuICB9XG59XG5mdW5jdGlvbiBwb3N0TW91bnRXcmFwcGVyJDMoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50OyAvLyBUaGlzIGlzIGluIHBvc3RNb3VudCBiZWNhdXNlIHdlIG5lZWQgYWNjZXNzIHRvIHRoZSBET00gbm9kZSwgd2hpY2ggaXMgbm90XG4gIC8vIGF2YWlsYWJsZSB1bnRpbCBhZnRlciB0aGUgY29tcG9uZW50IGhhcyBtb3VudGVkLlxuXG4gIHZhciB0ZXh0Q29udGVudCA9IG5vZGUudGV4dENvbnRlbnQ7IC8vIE9ubHkgc2V0IG5vZGUudmFsdWUgaWYgdGV4dENvbnRlbnQgaXMgZXF1YWwgdG8gdGhlIGV4cGVjdGVkXG4gIC8vIGluaXRpYWwgdmFsdWUuIEluIElFMTAvSUUxMSB0aGVyZSBpcyBhIGJ1ZyB3aGVyZSB0aGUgcGxhY2Vob2xkZXIgYXR0cmlidXRlXG4gIC8vIHdpbGwgcG9wdWxhdGUgdGV4dENvbnRlbnQgYXMgd2VsbC5cbiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubWljcm9zb2Z0LmNvbS9taWNyb3NvZnQtZWRnZS9wbGF0Zm9ybS9pc3N1ZXMvMTAxNTI1L1xuXG4gIGlmICh0ZXh0Q29udGVudCA9PT0gbm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSkge1xuICAgIGlmICh0ZXh0Q29udGVudCAhPT0gJycgJiYgdGV4dENvbnRlbnQgIT09IG51bGwpIHtcbiAgICAgIG5vZGUudmFsdWUgPSB0ZXh0Q29udGVudDtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc3RvcmVDb250cm9sbGVkU3RhdGUkMihlbGVtZW50LCBwcm9wcykge1xuICAvLyBET00gY29tcG9uZW50IGlzIHN0aWxsIG1vdW50ZWQ7IHVwZGF0ZVxuICB1cGRhdGVXcmFwcGVyJDEoZWxlbWVudCwgcHJvcHMpO1xufVxuXG52YXIgSFRNTF9OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCc7XG52YXIgTUFUSF9OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCc7XG52YXIgU1ZHX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7IC8vIEFzc3VtZXMgdGhlcmUgaXMgbm8gcGFyZW50IG5hbWVzcGFjZS5cblxuZnVuY3Rpb24gZ2V0SW50cmluc2ljTmFtZXNwYWNlKHR5cGUpIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnc3ZnJzpcbiAgICAgIHJldHVybiBTVkdfTkFNRVNQQUNFO1xuXG4gICAgY2FzZSAnbWF0aCc6XG4gICAgICByZXR1cm4gTUFUSF9OQU1FU1BBQ0U7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIEhUTUxfTkFNRVNQQUNFO1xuICB9XG59XG5mdW5jdGlvbiBnZXRDaGlsZE5hbWVzcGFjZShwYXJlbnROYW1lc3BhY2UsIHR5cGUpIHtcbiAgaWYgKHBhcmVudE5hbWVzcGFjZSA9PSBudWxsIHx8IHBhcmVudE5hbWVzcGFjZSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAvLyBObyAob3IgZGVmYXVsdCkgcGFyZW50IG5hbWVzcGFjZTogcG90ZW50aWFsIGVudHJ5IHBvaW50LlxuICAgIHJldHVybiBnZXRJbnRyaW5zaWNOYW1lc3BhY2UodHlwZSk7XG4gIH1cblxuICBpZiAocGFyZW50TmFtZXNwYWNlID09PSBTVkdfTkFNRVNQQUNFICYmIHR5cGUgPT09ICdmb3JlaWduT2JqZWN0Jykge1xuICAgIC8vIFdlJ3JlIGxlYXZpbmcgU1ZHLlxuICAgIHJldHVybiBIVE1MX05BTUVTUEFDRTtcbiAgfSAvLyBCeSBkZWZhdWx0LCBwYXNzIG5hbWVzcGFjZSBiZWxvdy5cblxuXG4gIHJldHVybiBwYXJlbnROYW1lc3BhY2U7XG59XG5cbi8qIGdsb2JhbHMgTVNBcHAgKi9cblxuLyoqXG4gKiBDcmVhdGUgYSBmdW5jdGlvbiB3aGljaCBoYXMgJ3Vuc2FmZScgcHJpdmlsZWdlcyAocmVxdWlyZWQgYnkgd2luZG93czggYXBwcylcbiAqL1xudmFyIGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24gPSBmdW5jdGlvbiAoZnVuYykge1xuICBpZiAodHlwZW9mIE1TQXBwICE9PSAndW5kZWZpbmVkJyAmJiBNU0FwcC5leGVjVW5zYWZlTG9jYWxGdW5jdGlvbikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMykge1xuICAgICAgTVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZnVuYyhhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZ1bmM7XG4gIH1cbn07XG5cbnZhciByZXVzYWJsZVNWR0NvbnRhaW5lcjtcbi8qKlxuICogU2V0IHRoZSBpbm5lckhUTUwgcHJvcGVydHkgb2YgYSBub2RlXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gKiBAcGFyYW0ge3N0cmluZ30gaHRtbFxuICogQGludGVybmFsXG4gKi9cblxudmFyIHNldElubmVySFRNTCA9IGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24gKG5vZGUsIGh0bWwpIHtcbiAgaWYgKG5vZGUubmFtZXNwYWNlVVJJID09PSBTVkdfTkFNRVNQQUNFKSB7XG5cbiAgICBpZiAoISgnaW5uZXJIVE1MJyBpbiBub2RlKSkge1xuICAgICAgLy8gSUUgZG9lcyBub3QgaGF2ZSBpbm5lckhUTUwgZm9yIFNWRyBub2Rlcywgc28gaW5zdGVhZCB3ZSBpbmplY3QgdGhlXG4gICAgICAvLyBuZXcgbWFya3VwIGluIGEgdGVtcCBub2RlIGFuZCB0aGVuIG1vdmUgdGhlIGNoaWxkIG5vZGVzIGFjcm9zcyBpbnRvXG4gICAgICAvLyB0aGUgdGFyZ2V0IG5vZGVcbiAgICAgIHJldXNhYmxlU1ZHQ29udGFpbmVyID0gcmV1c2FibGVTVkdDb250YWluZXIgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICByZXVzYWJsZVNWR0NvbnRhaW5lci5pbm5lckhUTUwgPSAnPHN2Zz4nICsgaHRtbC52YWx1ZU9mKCkudG9TdHJpbmcoKSArICc8L3N2Zz4nO1xuICAgICAgdmFyIHN2Z05vZGUgPSByZXVzYWJsZVNWR0NvbnRhaW5lci5maXJzdENoaWxkO1xuXG4gICAgICB3aGlsZSAobm9kZS5maXJzdENoaWxkKSB7XG4gICAgICAgIG5vZGUucmVtb3ZlQ2hpbGQobm9kZS5maXJzdENoaWxkKTtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKHN2Z05vZGUuZmlyc3RDaGlsZCkge1xuICAgICAgICBub2RlLmFwcGVuZENoaWxkKHN2Z05vZGUuZmlyc3RDaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBub2RlLmlubmVySFRNTCA9IGh0bWw7XG59KTtcblxuLyoqXG4gKiBIVE1MIG5vZGVUeXBlIHZhbHVlcyB0aGF0IHJlcHJlc2VudCB0aGUgdHlwZSBvZiB0aGUgbm9kZVxuICovXG52YXIgRUxFTUVOVF9OT0RFID0gMTtcbnZhciBURVhUX05PREUgPSAzO1xudmFyIENPTU1FTlRfTk9ERSA9IDg7XG52YXIgRE9DVU1FTlRfTk9ERSA9IDk7XG52YXIgRE9DVU1FTlRfRlJBR01FTlRfTk9ERSA9IDExO1xuXG4vKipcbiAqIFNldCB0aGUgdGV4dENvbnRlbnQgcHJvcGVydHkgb2YgYSBub2RlLiBGb3IgdGV4dCB1cGRhdGVzLCBpdCdzIGZhc3RlclxuICogdG8gc2V0IHRoZSBgbm9kZVZhbHVlYCBvZiB0aGUgVGV4dCBub2RlIGRpcmVjdGx5IGluc3RlYWQgb2YgdXNpbmdcbiAqIGAudGV4dENvbnRlbnRgIHdoaWNoIHdpbGwgcmVtb3ZlIHRoZSBleGlzdGluZyBub2RlIGFuZCBjcmVhdGUgYSBuZXcgb25lLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtzdHJpbmd9IHRleHRcbiAqIEBpbnRlcm5hbFxuICovXG5cbnZhciBzZXRUZXh0Q29udGVudCA9IGZ1bmN0aW9uIChub2RlLCB0ZXh0KSB7XG4gIGlmICh0ZXh0KSB7XG4gICAgdmFyIGZpcnN0Q2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQ7XG5cbiAgICBpZiAoZmlyc3RDaGlsZCAmJiBmaXJzdENoaWxkID09PSBub2RlLmxhc3RDaGlsZCAmJiBmaXJzdENoaWxkLm5vZGVUeXBlID09PSBURVhUX05PREUpIHtcbiAgICAgIGZpcnN0Q2hpbGQubm9kZVZhbHVlID0gdGV4dDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBub2RlLnRleHRDb250ZW50ID0gdGV4dDtcbn07XG5cbi8vIExpc3QgZGVyaXZlZCBmcm9tIEdlY2tvIHNvdXJjZSBjb2RlOlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvZ2Vja28tZGV2L2Jsb2IvNGU2MzhlZmM3MS9sYXlvdXQvc3R5bGUvdGVzdC9wcm9wZXJ0eV9kYXRhYmFzZS5qc1xudmFyIHNob3J0aGFuZFRvTG9uZ2hhbmQgPSB7XG4gIGFuaW1hdGlvbjogWydhbmltYXRpb25EZWxheScsICdhbmltYXRpb25EaXJlY3Rpb24nLCAnYW5pbWF0aW9uRHVyYXRpb24nLCAnYW5pbWF0aW9uRmlsbE1vZGUnLCAnYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQnLCAnYW5pbWF0aW9uTmFtZScsICdhbmltYXRpb25QbGF5U3RhdGUnLCAnYW5pbWF0aW9uVGltaW5nRnVuY3Rpb24nXSxcbiAgYmFja2dyb3VuZDogWydiYWNrZ3JvdW5kQXR0YWNobWVudCcsICdiYWNrZ3JvdW5kQ2xpcCcsICdiYWNrZ3JvdW5kQ29sb3InLCAnYmFja2dyb3VuZEltYWdlJywgJ2JhY2tncm91bmRPcmlnaW4nLCAnYmFja2dyb3VuZFBvc2l0aW9uWCcsICdiYWNrZ3JvdW5kUG9zaXRpb25ZJywgJ2JhY2tncm91bmRSZXBlYXQnLCAnYmFja2dyb3VuZFNpemUnXSxcbiAgYmFja2dyb3VuZFBvc2l0aW9uOiBbJ2JhY2tncm91bmRQb3NpdGlvblgnLCAnYmFja2dyb3VuZFBvc2l0aW9uWSddLFxuICBib3JkZXI6IFsnYm9yZGVyQm90dG9tQ29sb3InLCAnYm9yZGVyQm90dG9tU3R5bGUnLCAnYm9yZGVyQm90dG9tV2lkdGgnLCAnYm9yZGVySW1hZ2VPdXRzZXQnLCAnYm9yZGVySW1hZ2VSZXBlYXQnLCAnYm9yZGVySW1hZ2VTbGljZScsICdib3JkZXJJbWFnZVNvdXJjZScsICdib3JkZXJJbWFnZVdpZHRoJywgJ2JvcmRlckxlZnRDb2xvcicsICdib3JkZXJMZWZ0U3R5bGUnLCAnYm9yZGVyTGVmdFdpZHRoJywgJ2JvcmRlclJpZ2h0Q29sb3InLCAnYm9yZGVyUmlnaHRTdHlsZScsICdib3JkZXJSaWdodFdpZHRoJywgJ2JvcmRlclRvcENvbG9yJywgJ2JvcmRlclRvcFN0eWxlJywgJ2JvcmRlclRvcFdpZHRoJ10sXG4gIGJvcmRlckJsb2NrRW5kOiBbJ2JvcmRlckJsb2NrRW5kQ29sb3InLCAnYm9yZGVyQmxvY2tFbmRTdHlsZScsICdib3JkZXJCbG9ja0VuZFdpZHRoJ10sXG4gIGJvcmRlckJsb2NrU3RhcnQ6IFsnYm9yZGVyQmxvY2tTdGFydENvbG9yJywgJ2JvcmRlckJsb2NrU3RhcnRTdHlsZScsICdib3JkZXJCbG9ja1N0YXJ0V2lkdGgnXSxcbiAgYm9yZGVyQm90dG9tOiBbJ2JvcmRlckJvdHRvbUNvbG9yJywgJ2JvcmRlckJvdHRvbVN0eWxlJywgJ2JvcmRlckJvdHRvbVdpZHRoJ10sXG4gIGJvcmRlckNvbG9yOiBbJ2JvcmRlckJvdHRvbUNvbG9yJywgJ2JvcmRlckxlZnRDb2xvcicsICdib3JkZXJSaWdodENvbG9yJywgJ2JvcmRlclRvcENvbG9yJ10sXG4gIGJvcmRlckltYWdlOiBbJ2JvcmRlckltYWdlT3V0c2V0JywgJ2JvcmRlckltYWdlUmVwZWF0JywgJ2JvcmRlckltYWdlU2xpY2UnLCAnYm9yZGVySW1hZ2VTb3VyY2UnLCAnYm9yZGVySW1hZ2VXaWR0aCddLFxuICBib3JkZXJJbmxpbmVFbmQ6IFsnYm9yZGVySW5saW5lRW5kQ29sb3InLCAnYm9yZGVySW5saW5lRW5kU3R5bGUnLCAnYm9yZGVySW5saW5lRW5kV2lkdGgnXSxcbiAgYm9yZGVySW5saW5lU3RhcnQ6IFsnYm9yZGVySW5saW5lU3RhcnRDb2xvcicsICdib3JkZXJJbmxpbmVTdGFydFN0eWxlJywgJ2JvcmRlcklubGluZVN0YXJ0V2lkdGgnXSxcbiAgYm9yZGVyTGVmdDogWydib3JkZXJMZWZ0Q29sb3InLCAnYm9yZGVyTGVmdFN0eWxlJywgJ2JvcmRlckxlZnRXaWR0aCddLFxuICBib3JkZXJSYWRpdXM6IFsnYm9yZGVyQm90dG9tTGVmdFJhZGl1cycsICdib3JkZXJCb3R0b21SaWdodFJhZGl1cycsICdib3JkZXJUb3BMZWZ0UmFkaXVzJywgJ2JvcmRlclRvcFJpZ2h0UmFkaXVzJ10sXG4gIGJvcmRlclJpZ2h0OiBbJ2JvcmRlclJpZ2h0Q29sb3InLCAnYm9yZGVyUmlnaHRTdHlsZScsICdib3JkZXJSaWdodFdpZHRoJ10sXG4gIGJvcmRlclN0eWxlOiBbJ2JvcmRlckJvdHRvbVN0eWxlJywgJ2JvcmRlckxlZnRTdHlsZScsICdib3JkZXJSaWdodFN0eWxlJywgJ2JvcmRlclRvcFN0eWxlJ10sXG4gIGJvcmRlclRvcDogWydib3JkZXJUb3BDb2xvcicsICdib3JkZXJUb3BTdHlsZScsICdib3JkZXJUb3BXaWR0aCddLFxuICBib3JkZXJXaWR0aDogWydib3JkZXJCb3R0b21XaWR0aCcsICdib3JkZXJMZWZ0V2lkdGgnLCAnYm9yZGVyUmlnaHRXaWR0aCcsICdib3JkZXJUb3BXaWR0aCddLFxuICBjb2x1bW5SdWxlOiBbJ2NvbHVtblJ1bGVDb2xvcicsICdjb2x1bW5SdWxlU3R5bGUnLCAnY29sdW1uUnVsZVdpZHRoJ10sXG4gIGNvbHVtbnM6IFsnY29sdW1uQ291bnQnLCAnY29sdW1uV2lkdGgnXSxcbiAgZmxleDogWydmbGV4QmFzaXMnLCAnZmxleEdyb3cnLCAnZmxleFNocmluayddLFxuICBmbGV4RmxvdzogWydmbGV4RGlyZWN0aW9uJywgJ2ZsZXhXcmFwJ10sXG4gIGZvbnQ6IFsnZm9udEZhbWlseScsICdmb250RmVhdHVyZVNldHRpbmdzJywgJ2ZvbnRLZXJuaW5nJywgJ2ZvbnRMYW5ndWFnZU92ZXJyaWRlJywgJ2ZvbnRTaXplJywgJ2ZvbnRTaXplQWRqdXN0JywgJ2ZvbnRTdHJldGNoJywgJ2ZvbnRTdHlsZScsICdmb250VmFyaWFudCcsICdmb250VmFyaWFudEFsdGVybmF0ZXMnLCAnZm9udFZhcmlhbnRDYXBzJywgJ2ZvbnRWYXJpYW50RWFzdEFzaWFuJywgJ2ZvbnRWYXJpYW50TGlnYXR1cmVzJywgJ2ZvbnRWYXJpYW50TnVtZXJpYycsICdmb250VmFyaWFudFBvc2l0aW9uJywgJ2ZvbnRXZWlnaHQnLCAnbGluZUhlaWdodCddLFxuICBmb250VmFyaWFudDogWydmb250VmFyaWFudEFsdGVybmF0ZXMnLCAnZm9udFZhcmlhbnRDYXBzJywgJ2ZvbnRWYXJpYW50RWFzdEFzaWFuJywgJ2ZvbnRWYXJpYW50TGlnYXR1cmVzJywgJ2ZvbnRWYXJpYW50TnVtZXJpYycsICdmb250VmFyaWFudFBvc2l0aW9uJ10sXG4gIGdhcDogWydjb2x1bW5HYXAnLCAncm93R2FwJ10sXG4gIGdyaWQ6IFsnZ3JpZEF1dG9Db2x1bW5zJywgJ2dyaWRBdXRvRmxvdycsICdncmlkQXV0b1Jvd3MnLCAnZ3JpZFRlbXBsYXRlQXJlYXMnLCAnZ3JpZFRlbXBsYXRlQ29sdW1ucycsICdncmlkVGVtcGxhdGVSb3dzJ10sXG4gIGdyaWRBcmVhOiBbJ2dyaWRDb2x1bW5FbmQnLCAnZ3JpZENvbHVtblN0YXJ0JywgJ2dyaWRSb3dFbmQnLCAnZ3JpZFJvd1N0YXJ0J10sXG4gIGdyaWRDb2x1bW46IFsnZ3JpZENvbHVtbkVuZCcsICdncmlkQ29sdW1uU3RhcnQnXSxcbiAgZ3JpZENvbHVtbkdhcDogWydjb2x1bW5HYXAnXSxcbiAgZ3JpZEdhcDogWydjb2x1bW5HYXAnLCAncm93R2FwJ10sXG4gIGdyaWRSb3c6IFsnZ3JpZFJvd0VuZCcsICdncmlkUm93U3RhcnQnXSxcbiAgZ3JpZFJvd0dhcDogWydyb3dHYXAnXSxcbiAgZ3JpZFRlbXBsYXRlOiBbJ2dyaWRUZW1wbGF0ZUFyZWFzJywgJ2dyaWRUZW1wbGF0ZUNvbHVtbnMnLCAnZ3JpZFRlbXBsYXRlUm93cyddLFxuICBsaXN0U3R5bGU6IFsnbGlzdFN0eWxlSW1hZ2UnLCAnbGlzdFN0eWxlUG9zaXRpb24nLCAnbGlzdFN0eWxlVHlwZSddLFxuICBtYXJnaW46IFsnbWFyZ2luQm90dG9tJywgJ21hcmdpbkxlZnQnLCAnbWFyZ2luUmlnaHQnLCAnbWFyZ2luVG9wJ10sXG4gIG1hcmtlcjogWydtYXJrZXJFbmQnLCAnbWFya2VyTWlkJywgJ21hcmtlclN0YXJ0J10sXG4gIG1hc2s6IFsnbWFza0NsaXAnLCAnbWFza0NvbXBvc2l0ZScsICdtYXNrSW1hZ2UnLCAnbWFza01vZGUnLCAnbWFza09yaWdpbicsICdtYXNrUG9zaXRpb25YJywgJ21hc2tQb3NpdGlvblknLCAnbWFza1JlcGVhdCcsICdtYXNrU2l6ZSddLFxuICBtYXNrUG9zaXRpb246IFsnbWFza1Bvc2l0aW9uWCcsICdtYXNrUG9zaXRpb25ZJ10sXG4gIG91dGxpbmU6IFsnb3V0bGluZUNvbG9yJywgJ291dGxpbmVTdHlsZScsICdvdXRsaW5lV2lkdGgnXSxcbiAgb3ZlcmZsb3c6IFsnb3ZlcmZsb3dYJywgJ292ZXJmbG93WSddLFxuICBwYWRkaW5nOiBbJ3BhZGRpbmdCb3R0b20nLCAncGFkZGluZ0xlZnQnLCAncGFkZGluZ1JpZ2h0JywgJ3BhZGRpbmdUb3AnXSxcbiAgcGxhY2VDb250ZW50OiBbJ2FsaWduQ29udGVudCcsICdqdXN0aWZ5Q29udGVudCddLFxuICBwbGFjZUl0ZW1zOiBbJ2FsaWduSXRlbXMnLCAnanVzdGlmeUl0ZW1zJ10sXG4gIHBsYWNlU2VsZjogWydhbGlnblNlbGYnLCAnanVzdGlmeVNlbGYnXSxcbiAgdGV4dERlY29yYXRpb246IFsndGV4dERlY29yYXRpb25Db2xvcicsICd0ZXh0RGVjb3JhdGlvbkxpbmUnLCAndGV4dERlY29yYXRpb25TdHlsZSddLFxuICB0ZXh0RW1waGFzaXM6IFsndGV4dEVtcGhhc2lzQ29sb3InLCAndGV4dEVtcGhhc2lzU3R5bGUnXSxcbiAgdHJhbnNpdGlvbjogWyd0cmFuc2l0aW9uRGVsYXknLCAndHJhbnNpdGlvbkR1cmF0aW9uJywgJ3RyYW5zaXRpb25Qcm9wZXJ0eScsICd0cmFuc2l0aW9uVGltaW5nRnVuY3Rpb24nXSxcbiAgd29yZFdyYXA6IFsnb3ZlcmZsb3dXcmFwJ11cbn07XG5cbi8qKlxuICogQ1NTIHByb3BlcnRpZXMgd2hpY2ggYWNjZXB0IG51bWJlcnMgYnV0IGFyZSBub3QgaW4gdW5pdHMgb2YgXCJweFwiLlxuICovXG52YXIgaXNVbml0bGVzc051bWJlciA9IHtcbiAgYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6IHRydWUsXG4gIGFzcGVjdFJhdGlvOiB0cnVlLFxuICBib3JkZXJJbWFnZU91dHNldDogdHJ1ZSxcbiAgYm9yZGVySW1hZ2VTbGljZTogdHJ1ZSxcbiAgYm9yZGVySW1hZ2VXaWR0aDogdHJ1ZSxcbiAgYm94RmxleDogdHJ1ZSxcbiAgYm94RmxleEdyb3VwOiB0cnVlLFxuICBib3hPcmRpbmFsR3JvdXA6IHRydWUsXG4gIGNvbHVtbkNvdW50OiB0cnVlLFxuICBjb2x1bW5zOiB0cnVlLFxuICBmbGV4OiB0cnVlLFxuICBmbGV4R3JvdzogdHJ1ZSxcbiAgZmxleFBvc2l0aXZlOiB0cnVlLFxuICBmbGV4U2hyaW5rOiB0cnVlLFxuICBmbGV4TmVnYXRpdmU6IHRydWUsXG4gIGZsZXhPcmRlcjogdHJ1ZSxcbiAgZ3JpZEFyZWE6IHRydWUsXG4gIGdyaWRSb3c6IHRydWUsXG4gIGdyaWRSb3dFbmQ6IHRydWUsXG4gIGdyaWRSb3dTcGFuOiB0cnVlLFxuICBncmlkUm93U3RhcnQ6IHRydWUsXG4gIGdyaWRDb2x1bW46IHRydWUsXG4gIGdyaWRDb2x1bW5FbmQ6IHRydWUsXG4gIGdyaWRDb2x1bW5TcGFuOiB0cnVlLFxuICBncmlkQ29sdW1uU3RhcnQ6IHRydWUsXG4gIGZvbnRXZWlnaHQ6IHRydWUsXG4gIGxpbmVDbGFtcDogdHJ1ZSxcbiAgbGluZUhlaWdodDogdHJ1ZSxcbiAgb3BhY2l0eTogdHJ1ZSxcbiAgb3JkZXI6IHRydWUsXG4gIG9ycGhhbnM6IHRydWUsXG4gIHRhYlNpemU6IHRydWUsXG4gIHdpZG93czogdHJ1ZSxcbiAgekluZGV4OiB0cnVlLFxuICB6b29tOiB0cnVlLFxuICAvLyBTVkctcmVsYXRlZCBwcm9wZXJ0aWVzXG4gIGZpbGxPcGFjaXR5OiB0cnVlLFxuICBmbG9vZE9wYWNpdHk6IHRydWUsXG4gIHN0b3BPcGFjaXR5OiB0cnVlLFxuICBzdHJva2VEYXNoYXJyYXk6IHRydWUsXG4gIHN0cm9rZURhc2hvZmZzZXQ6IHRydWUsXG4gIHN0cm9rZU1pdGVybGltaXQ6IHRydWUsXG4gIHN0cm9rZU9wYWNpdHk6IHRydWUsXG4gIHN0cm9rZVdpZHRoOiB0cnVlXG59O1xuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4IHZlbmRvci1zcGVjaWZpYyBwcmVmaXgsIGVnOiBXZWJraXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgc3R5bGUgbmFtZSwgZWc6IHRyYW5zaXRpb25EdXJhdGlvblxuICogQHJldHVybiB7c3RyaW5nfSBzdHlsZSBuYW1lIHByZWZpeGVkIHdpdGggYHByZWZpeGAsIHByb3Blcmx5IGNhbWVsQ2FzZWQsIGVnOlxuICogV2Via2l0VHJhbnNpdGlvbkR1cmF0aW9uXG4gKi9cblxuZnVuY3Rpb24gcHJlZml4S2V5KHByZWZpeCwga2V5KSB7XG4gIHJldHVybiBwcmVmaXggKyBrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBrZXkuc3Vic3RyaW5nKDEpO1xufVxuLyoqXG4gKiBTdXBwb3J0IHN0eWxlIG5hbWVzIHRoYXQgbWF5IGNvbWUgcGFzc2VkIGluIHByZWZpeGVkIGJ5IGFkZGluZyBwZXJtdXRhdGlvbnNcbiAqIG9mIHZlbmRvciBwcmVmaXhlcy5cbiAqL1xuXG5cbnZhciBwcmVmaXhlcyA9IFsnV2Via2l0JywgJ21zJywgJ01veicsICdPJ107IC8vIFVzaW5nIE9iamVjdC5rZXlzIGhlcmUsIG9yIGVsc2UgdGhlIHZhbmlsbGEgZm9yLWluIGxvb3AgbWFrZXMgSUU4IGdvIGludG8gYW5cbi8vIGluZmluaXRlIGxvb3AsIGJlY2F1c2UgaXQgaXRlcmF0ZXMgb3ZlciB0aGUgbmV3bHkgYWRkZWQgcHJvcHMgdG9vLlxuXG5PYmplY3Qua2V5cyhpc1VuaXRsZXNzTnVtYmVyKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gIHByZWZpeGVzLmZvckVhY2goZnVuY3Rpb24gKHByZWZpeCkge1xuICAgIGlzVW5pdGxlc3NOdW1iZXJbcHJlZml4S2V5KHByZWZpeCwgcHJvcCldID0gaXNVbml0bGVzc051bWJlcltwcm9wXTtcbiAgfSk7XG59KTtcblxuLyoqXG4gKiBDb252ZXJ0IGEgdmFsdWUgaW50byB0aGUgcHJvcGVyIGNzcyB3cml0YWJsZSB2YWx1ZS4gVGhlIHN0eWxlIG5hbWUgYG5hbWVgXG4gKiBzaG91bGQgYmUgbG9naWNhbCAobm8gaHlwaGVucyksIGFzIHNwZWNpZmllZFxuICogaW4gYENTU1Byb3BlcnR5LmlzVW5pdGxlc3NOdW1iZXJgLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIENTUyBwcm9wZXJ0eSBuYW1lIHN1Y2ggYXMgYHRvcE1hcmdpbmAuXG4gKiBAcGFyYW0geyp9IHZhbHVlIENTUyBwcm9wZXJ0eSB2YWx1ZSBzdWNoIGFzIGAxMHB4YC5cbiAqIEByZXR1cm4ge3N0cmluZ30gTm9ybWFsaXplZCBzdHlsZSB2YWx1ZSB3aXRoIGRpbWVuc2lvbnMgYXBwbGllZC5cbiAqL1xuXG5mdW5jdGlvbiBkYW5nZXJvdXNTdHlsZVZhbHVlKG5hbWUsIHZhbHVlLCBpc0N1c3RvbVByb3BlcnR5KSB7XG4gIC8vIE5vdGUgdGhhdCB3ZSd2ZSByZW1vdmVkIGVzY2FwZVRleHRGb3JCcm93c2VyKCkgY2FsbHMgaGVyZSBzaW5jZSB0aGVcbiAgLy8gd2hvbGUgc3RyaW5nIHdpbGwgYmUgZXNjYXBlZCB3aGVuIHRoZSBhdHRyaWJ1dGUgaXMgaW5qZWN0ZWQgaW50b1xuICAvLyB0aGUgbWFya3VwLiBJZiB5b3UgcHJvdmlkZSB1bnNhZmUgdXNlciBkYXRhIGhlcmUgdGhleSBjYW4gaW5qZWN0XG4gIC8vIGFyYml0cmFyeSBDU1Mgd2hpY2ggbWF5IGJlIHByb2JsZW1hdGljIChJIGNvdWxkbid0IHJlcHJvIHRoaXMpOlxuICAvLyBodHRwczovL3d3dy5vd2FzcC5vcmcvaW5kZXgucGhwL1hTU19GaWx0ZXJfRXZhc2lvbl9DaGVhdF9TaGVldFxuICAvLyBodHRwOi8vd3d3LnRoZXNwYW5uZXIuY28udWsvMjAwNy8xMS8yNi91bHRpbWF0ZS14c3MtY3NzLWluamVjdGlvbi9cbiAgLy8gVGhpcyBpcyBub3QgYW4gWFNTIGhvbGUgYnV0IGluc3RlYWQgYSBwb3RlbnRpYWwgQ1NTIGluamVjdGlvbiBpc3N1ZVxuICAvLyB3aGljaCBoYXMgbGVhZCB0byBhIGdyZWF0ZXIgZGlzY3Vzc2lvbiBhYm91dCBob3cgd2UncmUgZ29pbmcgdG9cbiAgLy8gdHJ1c3QgVVJMcyBtb3ZpbmcgZm9yd2FyZC4gU2VlICMyMTE1OTAxXG4gIHZhciBpc0VtcHR5ID0gdmFsdWUgPT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyB8fCB2YWx1ZSA9PT0gJyc7XG5cbiAgaWYgKGlzRW1wdHkpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAoIWlzQ3VzdG9tUHJvcGVydHkgJiYgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiB2YWx1ZSAhPT0gMCAmJiAhKGlzVW5pdGxlc3NOdW1iZXIuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgaXNVbml0bGVzc051bWJlcltuYW1lXSkpIHtcbiAgICByZXR1cm4gdmFsdWUgKyAncHgnOyAvLyBQcmVzdW1lcyBpbXBsaWNpdCAncHgnIHN1ZmZpeCBmb3IgdW5pdGxlc3MgbnVtYmVyc1xuICB9XG5cbiAge1xuICAgIGNoZWNrQ1NTUHJvcGVydHlTdHJpbmdDb2VyY2lvbih2YWx1ZSwgbmFtZSk7XG4gIH1cblxuICByZXR1cm4gKCcnICsgdmFsdWUpLnRyaW0oKTtcbn1cblxudmFyIHVwcGVyY2FzZVBhdHRlcm4gPSAvKFtBLVpdKS9nO1xudmFyIG1zUGF0dGVybiA9IC9ebXMtLztcbi8qKlxuICogSHlwaGVuYXRlcyBhIGNhbWVsY2FzZWQgQ1NTIHByb3BlcnR5IG5hbWUsIGZvciBleGFtcGxlOlxuICpcbiAqICAgPiBoeXBoZW5hdGVTdHlsZU5hbWUoJ2JhY2tncm91bmRDb2xvcicpXG4gKiAgIDwgXCJiYWNrZ3JvdW5kLWNvbG9yXCJcbiAqICAgPiBoeXBoZW5hdGVTdHlsZU5hbWUoJ01velRyYW5zaXRpb24nKVxuICogICA8IFwiLW1vei10cmFuc2l0aW9uXCJcbiAqICAgPiBoeXBoZW5hdGVTdHlsZU5hbWUoJ21zVHJhbnNpdGlvbicpXG4gKiAgIDwgXCItbXMtdHJhbnNpdGlvblwiXG4gKlxuICogQXMgTW9kZXJuaXpyIHN1Z2dlc3RzIChodHRwOi8vbW9kZXJuaXpyLmNvbS9kb2NzLyNwcmVmaXhlZCksIGFuIGBtc2AgcHJlZml4XG4gKiBpcyBjb252ZXJ0ZWQgdG8gYC1tcy1gLlxuICovXG5cbmZ1bmN0aW9uIGh5cGhlbmF0ZVN0eWxlTmFtZShuYW1lKSB7XG4gIHJldHVybiBuYW1lLnJlcGxhY2UodXBwZXJjYXNlUGF0dGVybiwgJy0kMScpLnRvTG93ZXJDYXNlKCkucmVwbGFjZShtc1BhdHRlcm4sICctbXMtJyk7XG59XG5cbnZhciB3YXJuVmFsaWRTdHlsZSA9IGZ1bmN0aW9uICgpIHt9O1xuXG57XG4gIC8vICdtc1RyYW5zZm9ybScgaXMgY29ycmVjdCwgYnV0IHRoZSBvdGhlciBwcmVmaXhlcyBzaG91bGQgYmUgY2FwaXRhbGl6ZWRcbiAgdmFyIGJhZFZlbmRvcmVkU3R5bGVOYW1lUGF0dGVybiA9IC9eKD86d2Via2l0fG1venxvKVtBLVpdLztcbiAgdmFyIG1zUGF0dGVybiQxID0gL14tbXMtLztcbiAgdmFyIGh5cGhlblBhdHRlcm4gPSAvLSguKS9nOyAvLyBzdHlsZSB2YWx1ZXMgc2hvdWxkbid0IGNvbnRhaW4gYSBzZW1pY29sb25cblxuICB2YXIgYmFkU3R5bGVWYWx1ZVdpdGhTZW1pY29sb25QYXR0ZXJuID0gLztcXHMqJC87XG4gIHZhciB3YXJuZWRTdHlsZU5hbWVzID0ge307XG4gIHZhciB3YXJuZWRTdHlsZVZhbHVlcyA9IHt9O1xuICB2YXIgd2FybmVkRm9yTmFOVmFsdWUgPSBmYWxzZTtcbiAgdmFyIHdhcm5lZEZvckluZmluaXR5VmFsdWUgPSBmYWxzZTtcblxuICB2YXIgY2FtZWxpemUgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKGh5cGhlblBhdHRlcm4sIGZ1bmN0aW9uIChfLCBjaGFyYWN0ZXIpIHtcbiAgICAgIHJldHVybiBjaGFyYWN0ZXIudG9VcHBlckNhc2UoKTtcbiAgICB9KTtcbiAgfTtcblxuICB2YXIgd2Fybkh5cGhlbmF0ZWRTdHlsZU5hbWUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIGlmICh3YXJuZWRTdHlsZU5hbWVzLmhhc093blByb3BlcnR5KG5hbWUpICYmIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRTdHlsZU5hbWVzW25hbWVdID0gdHJ1ZTtcblxuICAgIGVycm9yKCdVbnN1cHBvcnRlZCBzdHlsZSBwcm9wZXJ0eSAlcy4gRGlkIHlvdSBtZWFuICVzPycsIG5hbWUsIC8vIEFzIEFuZGkgU21pdGggc3VnZ2VzdHNcbiAgICAvLyAoaHR0cDovL3d3dy5hbmRpc21pdGguY29tL2Jsb2cvMjAxMi8wMi9tb2Rlcm5penItcHJlZml4ZWQvKSwgYW4gYC1tc2AgcHJlZml4XG4gICAgLy8gaXMgY29udmVydGVkIHRvIGxvd2VyY2FzZSBgbXNgLlxuICAgIGNhbWVsaXplKG5hbWUucmVwbGFjZShtc1BhdHRlcm4kMSwgJ21zLScpKSk7XG4gIH07XG5cbiAgdmFyIHdhcm5CYWRWZW5kb3JlZFN0eWxlTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgaWYgKHdhcm5lZFN0eWxlTmFtZXMuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgd2FybmVkU3R5bGVOYW1lc1tuYW1lXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ1Vuc3VwcG9ydGVkIHZlbmRvci1wcmVmaXhlZCBzdHlsZSBwcm9wZXJ0eSAlcy4gRGlkIHlvdSBtZWFuICVzPycsIG5hbWUsIG5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpKTtcbiAgfTtcblxuICB2YXIgd2FyblN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKHdhcm5lZFN0eWxlVmFsdWVzLmhhc093blByb3BlcnR5KHZhbHVlKSAmJiB3YXJuZWRTdHlsZVZhbHVlc1t2YWx1ZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRTdHlsZVZhbHVlc1t2YWx1ZV0gPSB0cnVlO1xuXG4gICAgZXJyb3IoXCJTdHlsZSBwcm9wZXJ0eSB2YWx1ZXMgc2hvdWxkbid0IGNvbnRhaW4gYSBzZW1pY29sb24uIFwiICsgJ1RyeSBcIiVzOiAlc1wiIGluc3RlYWQuJywgbmFtZSwgdmFsdWUucmVwbGFjZShiYWRTdHlsZVZhbHVlV2l0aFNlbWljb2xvblBhdHRlcm4sICcnKSk7XG4gIH07XG5cbiAgdmFyIHdhcm5TdHlsZVZhbHVlSXNOYU4gPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICBpZiAod2FybmVkRm9yTmFOVmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRGb3JOYU5WYWx1ZSA9IHRydWU7XG5cbiAgICBlcnJvcignYE5hTmAgaXMgYW4gaW52YWxpZCB2YWx1ZSBmb3IgdGhlIGAlc2AgY3NzIHN0eWxlIHByb3BlcnR5LicsIG5hbWUpO1xuICB9O1xuXG4gIHZhciB3YXJuU3R5bGVWYWx1ZUlzSW5maW5pdHkgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICBpZiAod2FybmVkRm9ySW5maW5pdHlWYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdhcm5lZEZvckluZmluaXR5VmFsdWUgPSB0cnVlO1xuXG4gICAgZXJyb3IoJ2BJbmZpbml0eWAgaXMgYW4gaW52YWxpZCB2YWx1ZSBmb3IgdGhlIGAlc2AgY3NzIHN0eWxlIHByb3BlcnR5LicsIG5hbWUpO1xuICB9O1xuXG4gIHdhcm5WYWxpZFN0eWxlID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKG5hbWUuaW5kZXhPZignLScpID4gLTEpIHtcbiAgICAgIHdhcm5IeXBoZW5hdGVkU3R5bGVOYW1lKG5hbWUpO1xuICAgIH0gZWxzZSBpZiAoYmFkVmVuZG9yZWRTdHlsZU5hbWVQYXR0ZXJuLnRlc3QobmFtZSkpIHtcbiAgICAgIHdhcm5CYWRWZW5kb3JlZFN0eWxlTmFtZShuYW1lKTtcbiAgICB9IGVsc2UgaWYgKGJhZFN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uUGF0dGVybi50ZXN0KHZhbHVlKSkge1xuICAgICAgd2FyblN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uKG5hbWUsIHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKGlzTmFOKHZhbHVlKSkge1xuICAgICAgICB3YXJuU3R5bGVWYWx1ZUlzTmFOKG5hbWUsIHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoIWlzRmluaXRlKHZhbHVlKSkge1xuICAgICAgICB3YXJuU3R5bGVWYWx1ZUlzSW5maW5pdHkobmFtZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxudmFyIHdhcm5WYWxpZFN0eWxlJDEgPSB3YXJuVmFsaWRTdHlsZTtcblxuLyoqXG4gKiBPcGVyYXRpb25zIGZvciBkZWFsaW5nIHdpdGggQ1NTIHByb3BlcnRpZXMuXG4gKi9cblxuLyoqXG4gKiBUaGlzIGNyZWF0ZXMgYSBzdHJpbmcgdGhhdCBpcyBleHBlY3RlZCB0byBiZSBlcXVpdmFsZW50IHRvIHRoZSBzdHlsZVxuICogYXR0cmlidXRlIGdlbmVyYXRlZCBieSBzZXJ2ZXItc2lkZSByZW5kZXJpbmcuIEl0IGJ5LXBhc3NlcyB3YXJuaW5ncyBhbmRcbiAqIHNlY3VyaXR5IGNoZWNrcyBzbyBpdCdzIG5vdCBzYWZlIHRvIHVzZSB0aGlzIHZhbHVlIGZvciBhbnl0aGluZyBvdGhlciB0aGFuXG4gKiBjb21wYXJpc29uLiBJdCBpcyBvbmx5IHVzZWQgaW4gREVWIGZvciBTU1IgdmFsaWRhdGlvbi5cbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVEYW5nZXJvdXNTdHJpbmdGb3JTdHlsZXMoc3R5bGVzKSB7XG4gIHtcbiAgICB2YXIgc2VyaWFsaXplZCA9ICcnO1xuICAgIHZhciBkZWxpbWl0ZXIgPSAnJztcblxuICAgIGZvciAodmFyIHN0eWxlTmFtZSBpbiBzdHlsZXMpIHtcbiAgICAgIGlmICghc3R5bGVzLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBzdHlsZVZhbHVlID0gc3R5bGVzW3N0eWxlTmFtZV07XG5cbiAgICAgIGlmIChzdHlsZVZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgdmFyIGlzQ3VzdG9tUHJvcGVydHkgPSBzdHlsZU5hbWUuaW5kZXhPZignLS0nKSA9PT0gMDtcbiAgICAgICAgc2VyaWFsaXplZCArPSBkZWxpbWl0ZXIgKyAoaXNDdXN0b21Qcm9wZXJ0eSA/IHN0eWxlTmFtZSA6IGh5cGhlbmF0ZVN0eWxlTmFtZShzdHlsZU5hbWUpKSArICc6JztcbiAgICAgICAgc2VyaWFsaXplZCArPSBkYW5nZXJvdXNTdHlsZVZhbHVlKHN0eWxlTmFtZSwgc3R5bGVWYWx1ZSwgaXNDdXN0b21Qcm9wZXJ0eSk7XG4gICAgICAgIGRlbGltaXRlciA9ICc7JztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2VyaWFsaXplZCB8fCBudWxsO1xuICB9XG59XG4vKipcbiAqIFNldHMgdGhlIHZhbHVlIGZvciBtdWx0aXBsZSBzdHlsZXMgb24gYSBub2RlLiAgSWYgYSB2YWx1ZSBpcyBzcGVjaWZpZWQgYXNcbiAqICcnIChlbXB0eSBzdHJpbmcpLCB0aGUgY29ycmVzcG9uZGluZyBzdHlsZSBwcm9wZXJ0eSB3aWxsIGJlIHVuc2V0LlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtvYmplY3R9IHN0eWxlc1xuICovXG5cbmZ1bmN0aW9uIHNldFZhbHVlRm9yU3R5bGVzKG5vZGUsIHN0eWxlcykge1xuICB2YXIgc3R5bGUgPSBub2RlLnN0eWxlO1xuXG4gIGZvciAodmFyIHN0eWxlTmFtZSBpbiBzdHlsZXMpIHtcbiAgICBpZiAoIXN0eWxlcy5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgaXNDdXN0b21Qcm9wZXJ0eSA9IHN0eWxlTmFtZS5pbmRleE9mKCctLScpID09PSAwO1xuXG4gICAge1xuICAgICAgaWYgKCFpc0N1c3RvbVByb3BlcnR5KSB7XG4gICAgICAgIHdhcm5WYWxpZFN0eWxlJDEoc3R5bGVOYW1lLCBzdHlsZXNbc3R5bGVOYW1lXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHN0eWxlVmFsdWUgPSBkYW5nZXJvdXNTdHlsZVZhbHVlKHN0eWxlTmFtZSwgc3R5bGVzW3N0eWxlTmFtZV0sIGlzQ3VzdG9tUHJvcGVydHkpO1xuXG4gICAgaWYgKHN0eWxlTmFtZSA9PT0gJ2Zsb2F0Jykge1xuICAgICAgc3R5bGVOYW1lID0gJ2Nzc0Zsb2F0JztcbiAgICB9XG5cbiAgICBpZiAoaXNDdXN0b21Qcm9wZXJ0eSkge1xuICAgICAgc3R5bGUuc2V0UHJvcGVydHkoc3R5bGVOYW1lLCBzdHlsZVZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3R5bGVbc3R5bGVOYW1lXSA9IHN0eWxlVmFsdWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzVmFsdWVFbXB0eSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyB8fCB2YWx1ZSA9PT0gJyc7XG59XG4vKipcbiAqIEdpdmVuIHtjb2xvcjogJ3JlZCcsIG92ZXJmbG93OiAnaGlkZGVuJ30gcmV0dXJucyB7XG4gKiAgIGNvbG9yOiAnY29sb3InLFxuICogICBvdmVyZmxvd1g6ICdvdmVyZmxvdycsXG4gKiAgIG92ZXJmbG93WTogJ292ZXJmbG93JyxcbiAqIH0uIFRoaXMgY2FuIGJlIHJlYWQgYXMgXCJ0aGUgb3ZlcmZsb3dZIHByb3BlcnR5IHdhcyBzZXQgYnkgdGhlIG92ZXJmbG93XG4gKiBzaG9ydGhhbmRcIi4gVGhhdCBpcywgdGhlIHZhbHVlcyBhcmUgdGhlIHByb3BlcnR5IHRoYXQgZWFjaCB3YXMgZGVyaXZlZCBmcm9tLlxuICovXG5cblxuZnVuY3Rpb24gZXhwYW5kU2hvcnRoYW5kTWFwKHN0eWxlcykge1xuICB2YXIgZXhwYW5kZWQgPSB7fTtcblxuICBmb3IgKHZhciBrZXkgaW4gc3R5bGVzKSB7XG4gICAgdmFyIGxvbmdoYW5kcyA9IHNob3J0aGFuZFRvTG9uZ2hhbmRba2V5XSB8fCBba2V5XTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG9uZ2hhbmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBleHBhbmRlZFtsb25naGFuZHNbaV1dID0ga2V5O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleHBhbmRlZDtcbn1cbi8qKlxuICogV2hlbiBtaXhpbmcgc2hvcnRoYW5kIGFuZCBsb25naGFuZCBwcm9wZXJ0eSBuYW1lcywgd2Ugd2FybiBkdXJpbmcgdXBkYXRlcyBpZlxuICogd2UgZXhwZWN0IGFuIGluY29ycmVjdCByZXN1bHQgdG8gb2NjdXIuIEluIHBhcnRpY3VsYXIsIHdlIHdhcm4gZm9yOlxuICpcbiAqIFVwZGF0aW5nIGEgc2hvcnRoYW5kIHByb3BlcnR5IChsb25naGFuZCBnZXRzIG92ZXJ3cml0dGVuKTpcbiAqICAge2ZvbnQ6ICdmb28nLCBmb250VmFyaWFudDogJ2Jhcid9IC0+IHtmb250OiAnYmF6JywgZm9udFZhcmlhbnQ6ICdiYXInfVxuICogICBiZWNvbWVzIC5zdHlsZS5mb250ID0gJ2JheidcbiAqIFJlbW92aW5nIGEgc2hvcnRoYW5kIHByb3BlcnR5IChsb25naGFuZCBnZXRzIGxvc3QgdG9vKTpcbiAqICAge2ZvbnQ6ICdmb28nLCBmb250VmFyaWFudDogJ2Jhcid9IC0+IHtmb250VmFyaWFudDogJ2Jhcid9XG4gKiAgIGJlY29tZXMgLnN0eWxlLmZvbnQgPSAnJ1xuICogUmVtb3ZpbmcgYSBsb25naGFuZCBwcm9wZXJ0eSAoc2hvdWxkIHJldmVydCB0byBzaG9ydGhhbmQ7IGRvZXNuJ3QpOlxuICogICB7Zm9udDogJ2ZvbycsIGZvbnRWYXJpYW50OiAnYmFyJ30gLT4ge2ZvbnQ6ICdmb28nfVxuICogICBiZWNvbWVzIC5zdHlsZS5mb250VmFyaWFudCA9ICcnXG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZVNob3J0aGFuZFByb3BlcnR5Q29sbGlzaW9uSW5EZXYoc3R5bGVVcGRhdGVzLCBuZXh0U3R5bGVzKSB7XG4gIHtcbiAgICBpZiAoIW5leHRTdHlsZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZXhwYW5kZWRVcGRhdGVzID0gZXhwYW5kU2hvcnRoYW5kTWFwKHN0eWxlVXBkYXRlcyk7XG4gICAgdmFyIGV4cGFuZGVkU3R5bGVzID0gZXhwYW5kU2hvcnRoYW5kTWFwKG5leHRTdHlsZXMpO1xuICAgIHZhciB3YXJuZWRBYm91dCA9IHt9O1xuXG4gICAgZm9yICh2YXIga2V5IGluIGV4cGFuZGVkVXBkYXRlcykge1xuICAgICAgdmFyIG9yaWdpbmFsS2V5ID0gZXhwYW5kZWRVcGRhdGVzW2tleV07XG4gICAgICB2YXIgY29ycmVjdE9yaWdpbmFsS2V5ID0gZXhwYW5kZWRTdHlsZXNba2V5XTtcblxuICAgICAgaWYgKGNvcnJlY3RPcmlnaW5hbEtleSAmJiBvcmlnaW5hbEtleSAhPT0gY29ycmVjdE9yaWdpbmFsS2V5KSB7XG4gICAgICAgIHZhciB3YXJuaW5nS2V5ID0gb3JpZ2luYWxLZXkgKyAnLCcgKyBjb3JyZWN0T3JpZ2luYWxLZXk7XG5cbiAgICAgICAgaWYgKHdhcm5lZEFib3V0W3dhcm5pbmdLZXldKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB3YXJuZWRBYm91dFt3YXJuaW5nS2V5XSA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJyVzIGEgc3R5bGUgcHJvcGVydHkgZHVyaW5nIHJlcmVuZGVyICglcykgd2hlbiBhICcgKyAnY29uZmxpY3RpbmcgcHJvcGVydHkgaXMgc2V0ICglcykgY2FuIGxlYWQgdG8gc3R5bGluZyBidWdzLiBUbyAnICsgXCJhdm9pZCB0aGlzLCBkb24ndCBtaXggc2hvcnRoYW5kIGFuZCBub24tc2hvcnRoYW5kIHByb3BlcnRpZXMgXCIgKyAnZm9yIHRoZSBzYW1lIHZhbHVlOyBpbnN0ZWFkLCByZXBsYWNlIHRoZSBzaG9ydGhhbmQgd2l0aCAnICsgJ3NlcGFyYXRlIHZhbHVlcy4nLCBpc1ZhbHVlRW1wdHkoc3R5bGVVcGRhdGVzW29yaWdpbmFsS2V5XSkgPyAnUmVtb3ZpbmcnIDogJ1VwZGF0aW5nJywgb3JpZ2luYWxLZXksIGNvcnJlY3RPcmlnaW5hbEtleSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIEZvciBIVE1MLCBjZXJ0YWluIHRhZ3Mgc2hvdWxkIG9taXQgdGhlaXIgY2xvc2UgdGFnLiBXZSBrZWVwIGEgbGlzdCBmb3Jcbi8vIHRob3NlIHNwZWNpYWwtY2FzZSB0YWdzLlxudmFyIG9taXR0ZWRDbG9zZVRhZ3MgPSB7XG4gIGFyZWE6IHRydWUsXG4gIGJhc2U6IHRydWUsXG4gIGJyOiB0cnVlLFxuICBjb2w6IHRydWUsXG4gIGVtYmVkOiB0cnVlLFxuICBocjogdHJ1ZSxcbiAgaW1nOiB0cnVlLFxuICBpbnB1dDogdHJ1ZSxcbiAga2V5Z2VuOiB0cnVlLFxuICBsaW5rOiB0cnVlLFxuICBtZXRhOiB0cnVlLFxuICBwYXJhbTogdHJ1ZSxcbiAgc291cmNlOiB0cnVlLFxuICB0cmFjazogdHJ1ZSxcbiAgd2JyOiB0cnVlIC8vIE5PVEU6IG1lbnVpdGVtJ3MgY2xvc2UgdGFnIHNob3VsZCBiZSBvbWl0dGVkLCBidXQgdGhhdCBjYXVzZXMgcHJvYmxlbXMuXG5cbn07XG5cbi8vIGBvbWl0dGVkQ2xvc2VUYWdzYCBleGNlcHQgdGhhdCBgbWVudWl0ZW1gIHNob3VsZCBzdGlsbCBoYXZlIGl0cyBjbG9zaW5nIHRhZy5cblxudmFyIHZvaWRFbGVtZW50VGFncyA9IGFzc2lnbih7XG4gIG1lbnVpdGVtOiB0cnVlXG59LCBvbWl0dGVkQ2xvc2VUYWdzKTtcblxudmFyIEhUTUwgPSAnX19odG1sJztcblxuZnVuY3Rpb24gYXNzZXJ0VmFsaWRQcm9wcyh0YWcsIHByb3BzKSB7XG4gIGlmICghcHJvcHMpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gTm90ZSB0aGUgdXNlIG9mIGA9PWAgd2hpY2ggY2hlY2tzIGZvciBudWxsIG9yIHVuZGVmaW5lZC5cblxuXG4gIGlmICh2b2lkRWxlbWVudFRhZ3NbdGFnXSkge1xuICAgIGlmIChwcm9wcy5jaGlsZHJlbiAhPSBudWxsIHx8IHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICE9IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcih0YWcgKyBcIiBpcyBhIHZvaWQgZWxlbWVudCB0YWcgYW5kIG11c3QgbmVpdGhlciBoYXZlIGBjaGlsZHJlbmAgbm9yIFwiICsgJ3VzZSBgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgLicpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAhPSBudWxsKSB7XG4gICAgaWYgKHByb3BzLmNoaWxkcmVuICE9IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuIG9ubHkgc2V0IG9uZSBvZiBgY2hpbGRyZW5gIG9yIGBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTGAuJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAhPT0gJ29iamVjdCcgfHwgIShIVE1MIGluIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgIG11c3QgYmUgaW4gdGhlIGZvcm0gYHtfX2h0bWw6IC4uLn1gLiAnICsgJ1BsZWFzZSB2aXNpdCBodHRwczovL3JlYWN0anMub3JnL2xpbmsvZGFuZ2Vyb3VzbHktc2V0LWlubmVyLWh0bWwgJyArICdmb3IgbW9yZSBpbmZvcm1hdGlvbi4nKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgaWYgKCFwcm9wcy5zdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcgJiYgcHJvcHMuY29udGVudEVkaXRhYmxlICYmIHByb3BzLmNoaWxkcmVuICE9IG51bGwpIHtcbiAgICAgIGVycm9yKCdBIGNvbXBvbmVudCBpcyBgY29udGVudEVkaXRhYmxlYCBhbmQgY29udGFpbnMgYGNoaWxkcmVuYCBtYW5hZ2VkIGJ5ICcgKyAnUmVhY3QuIEl0IGlzIG5vdyB5b3VyIHJlc3BvbnNpYmlsaXR5IHRvIGd1YXJhbnRlZSB0aGF0IG5vbmUgb2YgJyArICd0aG9zZSBub2RlcyBhcmUgdW5leHBlY3RlZGx5IG1vZGlmaWVkIG9yIGR1cGxpY2F0ZWQuIFRoaXMgaXMgJyArICdwcm9iYWJseSBub3QgaW50ZW50aW9uYWwuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHByb3BzLnN0eWxlICE9IG51bGwgJiYgdHlwZW9mIHByb3BzLnN0eWxlICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIGBzdHlsZWAgcHJvcCBleHBlY3RzIGEgbWFwcGluZyBmcm9tIHN0eWxlIHByb3BlcnRpZXMgdG8gdmFsdWVzLCAnICsgXCJub3QgYSBzdHJpbmcuIEZvciBleGFtcGxlLCBzdHlsZT17e21hcmdpblJpZ2h0OiBzcGFjaW5nICsgJ2VtJ319IHdoZW4gXCIgKyAndXNpbmcgSlNYLicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzQ3VzdG9tQ29tcG9uZW50KHRhZ05hbWUsIHByb3BzKSB7XG4gIGlmICh0YWdOYW1lLmluZGV4T2YoJy0nKSA9PT0gLTEpIHtcbiAgICByZXR1cm4gdHlwZW9mIHByb3BzLmlzID09PSAnc3RyaW5nJztcbiAgfVxuXG4gIHN3aXRjaCAodGFnTmFtZSkge1xuICAgIC8vIFRoZXNlIGFyZSByZXNlcnZlZCBTVkcgYW5kIE1hdGhNTCBlbGVtZW50cy5cbiAgICAvLyBXZSBkb24ndCBtaW5kIHRoaXMgbGlzdCB0b28gbXVjaCBiZWNhdXNlIHdlIGV4cGVjdCBpdCB0byBuZXZlciBncm93LlxuICAgIC8vIFRoZSBhbHRlcm5hdGl2ZSBpcyB0byB0cmFjayB0aGUgbmFtZXNwYWNlIGluIGEgZmV3IHBsYWNlcyB3aGljaCBpcyBjb252b2x1dGVkLlxuICAgIC8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJjb21wb25lbnRzL3NwZWMvY3VzdG9tLyNjdXN0b20tZWxlbWVudHMtY29yZS1jb25jZXB0c1xuICAgIGNhc2UgJ2Fubm90YXRpb24teG1sJzpcbiAgICBjYXNlICdjb2xvci1wcm9maWxlJzpcbiAgICBjYXNlICdmb250LWZhY2UnOlxuICAgIGNhc2UgJ2ZvbnQtZmFjZS1zcmMnOlxuICAgIGNhc2UgJ2ZvbnQtZmFjZS11cmknOlxuICAgIGNhc2UgJ2ZvbnQtZmFjZS1mb3JtYXQnOlxuICAgIGNhc2UgJ2ZvbnQtZmFjZS1uYW1lJzpcbiAgICBjYXNlICdtaXNzaW5nLWdseXBoJzpcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vLyBXaGVuIGFkZGluZyBhdHRyaWJ1dGVzIHRvIHRoZSBIVE1MIG9yIFNWRyBhbGxvd2VkIGF0dHJpYnV0ZSBsaXN0LCBiZSBzdXJlIHRvXG4vLyBhbHNvIGFkZCB0aGVtIHRvIHRoaXMgbW9kdWxlIHRvIGVuc3VyZSBjYXNpbmcgYW5kIGluY29ycmVjdCBuYW1lXG4vLyB3YXJuaW5ncy5cbnZhciBwb3NzaWJsZVN0YW5kYXJkTmFtZXMgPSB7XG4gIC8vIEhUTUxcbiAgYWNjZXB0OiAnYWNjZXB0JyxcbiAgYWNjZXB0Y2hhcnNldDogJ2FjY2VwdENoYXJzZXQnLFxuICAnYWNjZXB0LWNoYXJzZXQnOiAnYWNjZXB0Q2hhcnNldCcsXG4gIGFjY2Vzc2tleTogJ2FjY2Vzc0tleScsXG4gIGFjdGlvbjogJ2FjdGlvbicsXG4gIGFsbG93ZnVsbHNjcmVlbjogJ2FsbG93RnVsbFNjcmVlbicsXG4gIGFsdDogJ2FsdCcsXG4gIGFzOiAnYXMnLFxuICBhc3luYzogJ2FzeW5jJyxcbiAgYXV0b2NhcGl0YWxpemU6ICdhdXRvQ2FwaXRhbGl6ZScsXG4gIGF1dG9jb21wbGV0ZTogJ2F1dG9Db21wbGV0ZScsXG4gIGF1dG9jb3JyZWN0OiAnYXV0b0NvcnJlY3QnLFxuICBhdXRvZm9jdXM6ICdhdXRvRm9jdXMnLFxuICBhdXRvcGxheTogJ2F1dG9QbGF5JyxcbiAgYXV0b3NhdmU6ICdhdXRvU2F2ZScsXG4gIGNhcHR1cmU6ICdjYXB0dXJlJyxcbiAgY2VsbHBhZGRpbmc6ICdjZWxsUGFkZGluZycsXG4gIGNlbGxzcGFjaW5nOiAnY2VsbFNwYWNpbmcnLFxuICBjaGFsbGVuZ2U6ICdjaGFsbGVuZ2UnLFxuICBjaGFyc2V0OiAnY2hhclNldCcsXG4gIGNoZWNrZWQ6ICdjaGVja2VkJyxcbiAgY2hpbGRyZW46ICdjaGlsZHJlbicsXG4gIGNpdGU6ICdjaXRlJyxcbiAgY2xhc3M6ICdjbGFzc05hbWUnLFxuICBjbGFzc2lkOiAnY2xhc3NJRCcsXG4gIGNsYXNzbmFtZTogJ2NsYXNzTmFtZScsXG4gIGNvbHM6ICdjb2xzJyxcbiAgY29sc3BhbjogJ2NvbFNwYW4nLFxuICBjb250ZW50OiAnY29udGVudCcsXG4gIGNvbnRlbnRlZGl0YWJsZTogJ2NvbnRlbnRFZGl0YWJsZScsXG4gIGNvbnRleHRtZW51OiAnY29udGV4dE1lbnUnLFxuICBjb250cm9sczogJ2NvbnRyb2xzJyxcbiAgY29udHJvbHNsaXN0OiAnY29udHJvbHNMaXN0JyxcbiAgY29vcmRzOiAnY29vcmRzJyxcbiAgY3Jvc3NvcmlnaW46ICdjcm9zc09yaWdpbicsXG4gIGRhbmdlcm91c2x5c2V0aW5uZXJodG1sOiAnZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwnLFxuICBkYXRhOiAnZGF0YScsXG4gIGRhdGV0aW1lOiAnZGF0ZVRpbWUnLFxuICBkZWZhdWx0OiAnZGVmYXVsdCcsXG4gIGRlZmF1bHRjaGVja2VkOiAnZGVmYXVsdENoZWNrZWQnLFxuICBkZWZhdWx0dmFsdWU6ICdkZWZhdWx0VmFsdWUnLFxuICBkZWZlcjogJ2RlZmVyJyxcbiAgZGlyOiAnZGlyJyxcbiAgZGlzYWJsZWQ6ICdkaXNhYmxlZCcsXG4gIGRpc2FibGVwaWN0dXJlaW5waWN0dXJlOiAnZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUnLFxuICBkaXNhYmxlcmVtb3RlcGxheWJhY2s6ICdkaXNhYmxlUmVtb3RlUGxheWJhY2snLFxuICBkb3dubG9hZDogJ2Rvd25sb2FkJyxcbiAgZHJhZ2dhYmxlOiAnZHJhZ2dhYmxlJyxcbiAgZW5jdHlwZTogJ2VuY1R5cGUnLFxuICBlbnRlcmtleWhpbnQ6ICdlbnRlcktleUhpbnQnLFxuICBmb3I6ICdodG1sRm9yJyxcbiAgZm9ybTogJ2Zvcm0nLFxuICBmb3JtbWV0aG9kOiAnZm9ybU1ldGhvZCcsXG4gIGZvcm1hY3Rpb246ICdmb3JtQWN0aW9uJyxcbiAgZm9ybWVuY3R5cGU6ICdmb3JtRW5jVHlwZScsXG4gIGZvcm1ub3ZhbGlkYXRlOiAnZm9ybU5vVmFsaWRhdGUnLFxuICBmb3JtdGFyZ2V0OiAnZm9ybVRhcmdldCcsXG4gIGZyYW1lYm9yZGVyOiAnZnJhbWVCb3JkZXInLFxuICBoZWFkZXJzOiAnaGVhZGVycycsXG4gIGhlaWdodDogJ2hlaWdodCcsXG4gIGhpZGRlbjogJ2hpZGRlbicsXG4gIGhpZ2g6ICdoaWdoJyxcbiAgaHJlZjogJ2hyZWYnLFxuICBocmVmbGFuZzogJ2hyZWZMYW5nJyxcbiAgaHRtbGZvcjogJ2h0bWxGb3InLFxuICBodHRwZXF1aXY6ICdodHRwRXF1aXYnLFxuICAnaHR0cC1lcXVpdic6ICdodHRwRXF1aXYnLFxuICBpY29uOiAnaWNvbicsXG4gIGlkOiAnaWQnLFxuICBpbWFnZXNpemVzOiAnaW1hZ2VTaXplcycsXG4gIGltYWdlc3Jjc2V0OiAnaW1hZ2VTcmNTZXQnLFxuICBpbm5lcmh0bWw6ICdpbm5lckhUTUwnLFxuICBpbnB1dG1vZGU6ICdpbnB1dE1vZGUnLFxuICBpbnRlZ3JpdHk6ICdpbnRlZ3JpdHknLFxuICBpczogJ2lzJyxcbiAgaXRlbWlkOiAnaXRlbUlEJyxcbiAgaXRlbXByb3A6ICdpdGVtUHJvcCcsXG4gIGl0ZW1yZWY6ICdpdGVtUmVmJyxcbiAgaXRlbXNjb3BlOiAnaXRlbVNjb3BlJyxcbiAgaXRlbXR5cGU6ICdpdGVtVHlwZScsXG4gIGtleXBhcmFtczogJ2tleVBhcmFtcycsXG4gIGtleXR5cGU6ICdrZXlUeXBlJyxcbiAga2luZDogJ2tpbmQnLFxuICBsYWJlbDogJ2xhYmVsJyxcbiAgbGFuZzogJ2xhbmcnLFxuICBsaXN0OiAnbGlzdCcsXG4gIGxvb3A6ICdsb29wJyxcbiAgbG93OiAnbG93JyxcbiAgbWFuaWZlc3Q6ICdtYW5pZmVzdCcsXG4gIG1hcmdpbndpZHRoOiAnbWFyZ2luV2lkdGgnLFxuICBtYXJnaW5oZWlnaHQ6ICdtYXJnaW5IZWlnaHQnLFxuICBtYXg6ICdtYXgnLFxuICBtYXhsZW5ndGg6ICdtYXhMZW5ndGgnLFxuICBtZWRpYTogJ21lZGlhJyxcbiAgbWVkaWFncm91cDogJ21lZGlhR3JvdXAnLFxuICBtZXRob2Q6ICdtZXRob2QnLFxuICBtaW46ICdtaW4nLFxuICBtaW5sZW5ndGg6ICdtaW5MZW5ndGgnLFxuICBtdWx0aXBsZTogJ211bHRpcGxlJyxcbiAgbXV0ZWQ6ICdtdXRlZCcsXG4gIG5hbWU6ICduYW1lJyxcbiAgbm9tb2R1bGU6ICdub01vZHVsZScsXG4gIG5vbmNlOiAnbm9uY2UnLFxuICBub3ZhbGlkYXRlOiAnbm9WYWxpZGF0ZScsXG4gIG9wZW46ICdvcGVuJyxcbiAgb3B0aW11bTogJ29wdGltdW0nLFxuICBwYXR0ZXJuOiAncGF0dGVybicsXG4gIHBsYWNlaG9sZGVyOiAncGxhY2Vob2xkZXInLFxuICBwbGF5c2lubGluZTogJ3BsYXlzSW5saW5lJyxcbiAgcG9zdGVyOiAncG9zdGVyJyxcbiAgcHJlbG9hZDogJ3ByZWxvYWQnLFxuICBwcm9maWxlOiAncHJvZmlsZScsXG4gIHJhZGlvZ3JvdXA6ICdyYWRpb0dyb3VwJyxcbiAgcmVhZG9ubHk6ICdyZWFkT25seScsXG4gIHJlZmVycmVycG9saWN5OiAncmVmZXJyZXJQb2xpY3knLFxuICByZWw6ICdyZWwnLFxuICByZXF1aXJlZDogJ3JlcXVpcmVkJyxcbiAgcmV2ZXJzZWQ6ICdyZXZlcnNlZCcsXG4gIHJvbGU6ICdyb2xlJyxcbiAgcm93czogJ3Jvd3MnLFxuICByb3dzcGFuOiAncm93U3BhbicsXG4gIHNhbmRib3g6ICdzYW5kYm94JyxcbiAgc2NvcGU6ICdzY29wZScsXG4gIHNjb3BlZDogJ3Njb3BlZCcsXG4gIHNjcm9sbGluZzogJ3Njcm9sbGluZycsXG4gIHNlYW1sZXNzOiAnc2VhbWxlc3MnLFxuICBzZWxlY3RlZDogJ3NlbGVjdGVkJyxcbiAgc2hhcGU6ICdzaGFwZScsXG4gIHNpemU6ICdzaXplJyxcbiAgc2l6ZXM6ICdzaXplcycsXG4gIHNwYW46ICdzcGFuJyxcbiAgc3BlbGxjaGVjazogJ3NwZWxsQ2hlY2snLFxuICBzcmM6ICdzcmMnLFxuICBzcmNkb2M6ICdzcmNEb2MnLFxuICBzcmNsYW5nOiAnc3JjTGFuZycsXG4gIHNyY3NldDogJ3NyY1NldCcsXG4gIHN0YXJ0OiAnc3RhcnQnLFxuICBzdGVwOiAnc3RlcCcsXG4gIHN0eWxlOiAnc3R5bGUnLFxuICBzdW1tYXJ5OiAnc3VtbWFyeScsXG4gIHRhYmluZGV4OiAndGFiSW5kZXgnLFxuICB0YXJnZXQ6ICd0YXJnZXQnLFxuICB0aXRsZTogJ3RpdGxlJyxcbiAgdHlwZTogJ3R5cGUnLFxuICB1c2VtYXA6ICd1c2VNYXAnLFxuICB2YWx1ZTogJ3ZhbHVlJyxcbiAgd2lkdGg6ICd3aWR0aCcsXG4gIHdtb2RlOiAnd21vZGUnLFxuICB3cmFwOiAnd3JhcCcsXG4gIC8vIFNWR1xuICBhYm91dDogJ2Fib3V0JyxcbiAgYWNjZW50aGVpZ2h0OiAnYWNjZW50SGVpZ2h0JyxcbiAgJ2FjY2VudC1oZWlnaHQnOiAnYWNjZW50SGVpZ2h0JyxcbiAgYWNjdW11bGF0ZTogJ2FjY3VtdWxhdGUnLFxuICBhZGRpdGl2ZTogJ2FkZGl0aXZlJyxcbiAgYWxpZ25tZW50YmFzZWxpbmU6ICdhbGlnbm1lbnRCYXNlbGluZScsXG4gICdhbGlnbm1lbnQtYmFzZWxpbmUnOiAnYWxpZ25tZW50QmFzZWxpbmUnLFxuICBhbGxvd3Jlb3JkZXI6ICdhbGxvd1Jlb3JkZXInLFxuICBhbHBoYWJldGljOiAnYWxwaGFiZXRpYycsXG4gIGFtcGxpdHVkZTogJ2FtcGxpdHVkZScsXG4gIGFyYWJpY2Zvcm06ICdhcmFiaWNGb3JtJyxcbiAgJ2FyYWJpYy1mb3JtJzogJ2FyYWJpY0Zvcm0nLFxuICBhc2NlbnQ6ICdhc2NlbnQnLFxuICBhdHRyaWJ1dGVuYW1lOiAnYXR0cmlidXRlTmFtZScsXG4gIGF0dHJpYnV0ZXR5cGU6ICdhdHRyaWJ1dGVUeXBlJyxcbiAgYXV0b3JldmVyc2U6ICdhdXRvUmV2ZXJzZScsXG4gIGF6aW11dGg6ICdhemltdXRoJyxcbiAgYmFzZWZyZXF1ZW5jeTogJ2Jhc2VGcmVxdWVuY3knLFxuICBiYXNlbGluZXNoaWZ0OiAnYmFzZWxpbmVTaGlmdCcsXG4gICdiYXNlbGluZS1zaGlmdCc6ICdiYXNlbGluZVNoaWZ0JyxcbiAgYmFzZXByb2ZpbGU6ICdiYXNlUHJvZmlsZScsXG4gIGJib3g6ICdiYm94JyxcbiAgYmVnaW46ICdiZWdpbicsXG4gIGJpYXM6ICdiaWFzJyxcbiAgYnk6ICdieScsXG4gIGNhbGNtb2RlOiAnY2FsY01vZGUnLFxuICBjYXBoZWlnaHQ6ICdjYXBIZWlnaHQnLFxuICAnY2FwLWhlaWdodCc6ICdjYXBIZWlnaHQnLFxuICBjbGlwOiAnY2xpcCcsXG4gIGNsaXBwYXRoOiAnY2xpcFBhdGgnLFxuICAnY2xpcC1wYXRoJzogJ2NsaXBQYXRoJyxcbiAgY2xpcHBhdGh1bml0czogJ2NsaXBQYXRoVW5pdHMnLFxuICBjbGlwcnVsZTogJ2NsaXBSdWxlJyxcbiAgJ2NsaXAtcnVsZSc6ICdjbGlwUnVsZScsXG4gIGNvbG9yOiAnY29sb3InLFxuICBjb2xvcmludGVycG9sYXRpb246ICdjb2xvckludGVycG9sYXRpb24nLFxuICAnY29sb3ItaW50ZXJwb2xhdGlvbic6ICdjb2xvckludGVycG9sYXRpb24nLFxuICBjb2xvcmludGVycG9sYXRpb25maWx0ZXJzOiAnY29sb3JJbnRlcnBvbGF0aW9uRmlsdGVycycsXG4gICdjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnMnOiAnY29sb3JJbnRlcnBvbGF0aW9uRmlsdGVycycsXG4gIGNvbG9ycHJvZmlsZTogJ2NvbG9yUHJvZmlsZScsXG4gICdjb2xvci1wcm9maWxlJzogJ2NvbG9yUHJvZmlsZScsXG4gIGNvbG9ycmVuZGVyaW5nOiAnY29sb3JSZW5kZXJpbmcnLFxuICAnY29sb3ItcmVuZGVyaW5nJzogJ2NvbG9yUmVuZGVyaW5nJyxcbiAgY29udGVudHNjcmlwdHR5cGU6ICdjb250ZW50U2NyaXB0VHlwZScsXG4gIGNvbnRlbnRzdHlsZXR5cGU6ICdjb250ZW50U3R5bGVUeXBlJyxcbiAgY3Vyc29yOiAnY3Vyc29yJyxcbiAgY3g6ICdjeCcsXG4gIGN5OiAnY3knLFxuICBkOiAnZCcsXG4gIGRhdGF0eXBlOiAnZGF0YXR5cGUnLFxuICBkZWNlbGVyYXRlOiAnZGVjZWxlcmF0ZScsXG4gIGRlc2NlbnQ6ICdkZXNjZW50JyxcbiAgZGlmZnVzZWNvbnN0YW50OiAnZGlmZnVzZUNvbnN0YW50JyxcbiAgZGlyZWN0aW9uOiAnZGlyZWN0aW9uJyxcbiAgZGlzcGxheTogJ2Rpc3BsYXknLFxuICBkaXZpc29yOiAnZGl2aXNvcicsXG4gIGRvbWluYW50YmFzZWxpbmU6ICdkb21pbmFudEJhc2VsaW5lJyxcbiAgJ2RvbWluYW50LWJhc2VsaW5lJzogJ2RvbWluYW50QmFzZWxpbmUnLFxuICBkdXI6ICdkdXInLFxuICBkeDogJ2R4JyxcbiAgZHk6ICdkeScsXG4gIGVkZ2Vtb2RlOiAnZWRnZU1vZGUnLFxuICBlbGV2YXRpb246ICdlbGV2YXRpb24nLFxuICBlbmFibGViYWNrZ3JvdW5kOiAnZW5hYmxlQmFja2dyb3VuZCcsXG4gICdlbmFibGUtYmFja2dyb3VuZCc6ICdlbmFibGVCYWNrZ3JvdW5kJyxcbiAgZW5kOiAnZW5kJyxcbiAgZXhwb25lbnQ6ICdleHBvbmVudCcsXG4gIGV4dGVybmFscmVzb3VyY2VzcmVxdWlyZWQ6ICdleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkJyxcbiAgZmlsbDogJ2ZpbGwnLFxuICBmaWxsb3BhY2l0eTogJ2ZpbGxPcGFjaXR5JyxcbiAgJ2ZpbGwtb3BhY2l0eSc6ICdmaWxsT3BhY2l0eScsXG4gIGZpbGxydWxlOiAnZmlsbFJ1bGUnLFxuICAnZmlsbC1ydWxlJzogJ2ZpbGxSdWxlJyxcbiAgZmlsdGVyOiAnZmlsdGVyJyxcbiAgZmlsdGVycmVzOiAnZmlsdGVyUmVzJyxcbiAgZmlsdGVydW5pdHM6ICdmaWx0ZXJVbml0cycsXG4gIGZsb29kb3BhY2l0eTogJ2Zsb29kT3BhY2l0eScsXG4gICdmbG9vZC1vcGFjaXR5JzogJ2Zsb29kT3BhY2l0eScsXG4gIGZsb29kY29sb3I6ICdmbG9vZENvbG9yJyxcbiAgJ2Zsb29kLWNvbG9yJzogJ2Zsb29kQ29sb3InLFxuICBmb2N1c2FibGU6ICdmb2N1c2FibGUnLFxuICBmb250ZmFtaWx5OiAnZm9udEZhbWlseScsXG4gICdmb250LWZhbWlseSc6ICdmb250RmFtaWx5JyxcbiAgZm9udHNpemU6ICdmb250U2l6ZScsXG4gICdmb250LXNpemUnOiAnZm9udFNpemUnLFxuICBmb250c2l6ZWFkanVzdDogJ2ZvbnRTaXplQWRqdXN0JyxcbiAgJ2ZvbnQtc2l6ZS1hZGp1c3QnOiAnZm9udFNpemVBZGp1c3QnLFxuICBmb250c3RyZXRjaDogJ2ZvbnRTdHJldGNoJyxcbiAgJ2ZvbnQtc3RyZXRjaCc6ICdmb250U3RyZXRjaCcsXG4gIGZvbnRzdHlsZTogJ2ZvbnRTdHlsZScsXG4gICdmb250LXN0eWxlJzogJ2ZvbnRTdHlsZScsXG4gIGZvbnR2YXJpYW50OiAnZm9udFZhcmlhbnQnLFxuICAnZm9udC12YXJpYW50JzogJ2ZvbnRWYXJpYW50JyxcbiAgZm9udHdlaWdodDogJ2ZvbnRXZWlnaHQnLFxuICAnZm9udC13ZWlnaHQnOiAnZm9udFdlaWdodCcsXG4gIGZvcm1hdDogJ2Zvcm1hdCcsXG4gIGZyb206ICdmcm9tJyxcbiAgZng6ICdmeCcsXG4gIGZ5OiAnZnknLFxuICBnMTogJ2cxJyxcbiAgZzI6ICdnMicsXG4gIGdseXBobmFtZTogJ2dseXBoTmFtZScsXG4gICdnbHlwaC1uYW1lJzogJ2dseXBoTmFtZScsXG4gIGdseXBob3JpZW50YXRpb25ob3Jpem9udGFsOiAnZ2x5cGhPcmllbnRhdGlvbkhvcml6b250YWwnLFxuICAnZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbCc6ICdnbHlwaE9yaWVudGF0aW9uSG9yaXpvbnRhbCcsXG4gIGdseXBob3JpZW50YXRpb252ZXJ0aWNhbDogJ2dseXBoT3JpZW50YXRpb25WZXJ0aWNhbCcsXG4gICdnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbCc6ICdnbHlwaE9yaWVudGF0aW9uVmVydGljYWwnLFxuICBnbHlwaHJlZjogJ2dseXBoUmVmJyxcbiAgZ3JhZGllbnR0cmFuc2Zvcm06ICdncmFkaWVudFRyYW5zZm9ybScsXG4gIGdyYWRpZW50dW5pdHM6ICdncmFkaWVudFVuaXRzJyxcbiAgaGFuZ2luZzogJ2hhbmdpbmcnLFxuICBob3JpemFkdng6ICdob3JpekFkdlgnLFxuICAnaG9yaXotYWR2LXgnOiAnaG9yaXpBZHZYJyxcbiAgaG9yaXpvcmlnaW54OiAnaG9yaXpPcmlnaW5YJyxcbiAgJ2hvcml6LW9yaWdpbi14JzogJ2hvcml6T3JpZ2luWCcsXG4gIGlkZW9ncmFwaGljOiAnaWRlb2dyYXBoaWMnLFxuICBpbWFnZXJlbmRlcmluZzogJ2ltYWdlUmVuZGVyaW5nJyxcbiAgJ2ltYWdlLXJlbmRlcmluZyc6ICdpbWFnZVJlbmRlcmluZycsXG4gIGluMjogJ2luMicsXG4gIGluOiAnaW4nLFxuICBpbmxpc3Q6ICdpbmxpc3QnLFxuICBpbnRlcmNlcHQ6ICdpbnRlcmNlcHQnLFxuICBrMTogJ2sxJyxcbiAgazI6ICdrMicsXG4gIGszOiAnazMnLFxuICBrNDogJ2s0JyxcbiAgazogJ2snLFxuICBrZXJuZWxtYXRyaXg6ICdrZXJuZWxNYXRyaXgnLFxuICBrZXJuZWx1bml0bGVuZ3RoOiAna2VybmVsVW5pdExlbmd0aCcsXG4gIGtlcm5pbmc6ICdrZXJuaW5nJyxcbiAga2V5cG9pbnRzOiAna2V5UG9pbnRzJyxcbiAga2V5c3BsaW5lczogJ2tleVNwbGluZXMnLFxuICBrZXl0aW1lczogJ2tleVRpbWVzJyxcbiAgbGVuZ3RoYWRqdXN0OiAnbGVuZ3RoQWRqdXN0JyxcbiAgbGV0dGVyc3BhY2luZzogJ2xldHRlclNwYWNpbmcnLFxuICAnbGV0dGVyLXNwYWNpbmcnOiAnbGV0dGVyU3BhY2luZycsXG4gIGxpZ2h0aW5nY29sb3I6ICdsaWdodGluZ0NvbG9yJyxcbiAgJ2xpZ2h0aW5nLWNvbG9yJzogJ2xpZ2h0aW5nQ29sb3InLFxuICBsaW1pdGluZ2NvbmVhbmdsZTogJ2xpbWl0aW5nQ29uZUFuZ2xlJyxcbiAgbG9jYWw6ICdsb2NhbCcsXG4gIG1hcmtlcmVuZDogJ21hcmtlckVuZCcsXG4gICdtYXJrZXItZW5kJzogJ21hcmtlckVuZCcsXG4gIG1hcmtlcmhlaWdodDogJ21hcmtlckhlaWdodCcsXG4gIG1hcmtlcm1pZDogJ21hcmtlck1pZCcsXG4gICdtYXJrZXItbWlkJzogJ21hcmtlck1pZCcsXG4gIG1hcmtlcnN0YXJ0OiAnbWFya2VyU3RhcnQnLFxuICAnbWFya2VyLXN0YXJ0JzogJ21hcmtlclN0YXJ0JyxcbiAgbWFya2VydW5pdHM6ICdtYXJrZXJVbml0cycsXG4gIG1hcmtlcndpZHRoOiAnbWFya2VyV2lkdGgnLFxuICBtYXNrOiAnbWFzaycsXG4gIG1hc2tjb250ZW50dW5pdHM6ICdtYXNrQ29udGVudFVuaXRzJyxcbiAgbWFza3VuaXRzOiAnbWFza1VuaXRzJyxcbiAgbWF0aGVtYXRpY2FsOiAnbWF0aGVtYXRpY2FsJyxcbiAgbW9kZTogJ21vZGUnLFxuICBudW1vY3RhdmVzOiAnbnVtT2N0YXZlcycsXG4gIG9mZnNldDogJ29mZnNldCcsXG4gIG9wYWNpdHk6ICdvcGFjaXR5JyxcbiAgb3BlcmF0b3I6ICdvcGVyYXRvcicsXG4gIG9yZGVyOiAnb3JkZXInLFxuICBvcmllbnQ6ICdvcmllbnQnLFxuICBvcmllbnRhdGlvbjogJ29yaWVudGF0aW9uJyxcbiAgb3JpZ2luOiAnb3JpZ2luJyxcbiAgb3ZlcmZsb3c6ICdvdmVyZmxvdycsXG4gIG92ZXJsaW5lcG9zaXRpb246ICdvdmVybGluZVBvc2l0aW9uJyxcbiAgJ292ZXJsaW5lLXBvc2l0aW9uJzogJ292ZXJsaW5lUG9zaXRpb24nLFxuICBvdmVybGluZXRoaWNrbmVzczogJ292ZXJsaW5lVGhpY2tuZXNzJyxcbiAgJ292ZXJsaW5lLXRoaWNrbmVzcyc6ICdvdmVybGluZVRoaWNrbmVzcycsXG4gIHBhaW50b3JkZXI6ICdwYWludE9yZGVyJyxcbiAgJ3BhaW50LW9yZGVyJzogJ3BhaW50T3JkZXInLFxuICBwYW5vc2UxOiAncGFub3NlMScsXG4gICdwYW5vc2UtMSc6ICdwYW5vc2UxJyxcbiAgcGF0aGxlbmd0aDogJ3BhdGhMZW5ndGgnLFxuICBwYXR0ZXJuY29udGVudHVuaXRzOiAncGF0dGVybkNvbnRlbnRVbml0cycsXG4gIHBhdHRlcm50cmFuc2Zvcm06ICdwYXR0ZXJuVHJhbnNmb3JtJyxcbiAgcGF0dGVybnVuaXRzOiAncGF0dGVyblVuaXRzJyxcbiAgcG9pbnRlcmV2ZW50czogJ3BvaW50ZXJFdmVudHMnLFxuICAncG9pbnRlci1ldmVudHMnOiAncG9pbnRlckV2ZW50cycsXG4gIHBvaW50czogJ3BvaW50cycsXG4gIHBvaW50c2F0eDogJ3BvaW50c0F0WCcsXG4gIHBvaW50c2F0eTogJ3BvaW50c0F0WScsXG4gIHBvaW50c2F0ejogJ3BvaW50c0F0WicsXG4gIHByZWZpeDogJ3ByZWZpeCcsXG4gIHByZXNlcnZlYWxwaGE6ICdwcmVzZXJ2ZUFscGhhJyxcbiAgcHJlc2VydmVhc3BlY3RyYXRpbzogJ3ByZXNlcnZlQXNwZWN0UmF0aW8nLFxuICBwcmltaXRpdmV1bml0czogJ3ByaW1pdGl2ZVVuaXRzJyxcbiAgcHJvcGVydHk6ICdwcm9wZXJ0eScsXG4gIHI6ICdyJyxcbiAgcmFkaXVzOiAncmFkaXVzJyxcbiAgcmVmeDogJ3JlZlgnLFxuICByZWZ5OiAncmVmWScsXG4gIHJlbmRlcmluZ2ludGVudDogJ3JlbmRlcmluZ0ludGVudCcsXG4gICdyZW5kZXJpbmctaW50ZW50JzogJ3JlbmRlcmluZ0ludGVudCcsXG4gIHJlcGVhdGNvdW50OiAncmVwZWF0Q291bnQnLFxuICByZXBlYXRkdXI6ICdyZXBlYXREdXInLFxuICByZXF1aXJlZGV4dGVuc2lvbnM6ICdyZXF1aXJlZEV4dGVuc2lvbnMnLFxuICByZXF1aXJlZGZlYXR1cmVzOiAncmVxdWlyZWRGZWF0dXJlcycsXG4gIHJlc291cmNlOiAncmVzb3VyY2UnLFxuICByZXN0YXJ0OiAncmVzdGFydCcsXG4gIHJlc3VsdDogJ3Jlc3VsdCcsXG4gIHJlc3VsdHM6ICdyZXN1bHRzJyxcbiAgcm90YXRlOiAncm90YXRlJyxcbiAgcng6ICdyeCcsXG4gIHJ5OiAncnknLFxuICBzY2FsZTogJ3NjYWxlJyxcbiAgc2VjdXJpdHk6ICdzZWN1cml0eScsXG4gIHNlZWQ6ICdzZWVkJyxcbiAgc2hhcGVyZW5kZXJpbmc6ICdzaGFwZVJlbmRlcmluZycsXG4gICdzaGFwZS1yZW5kZXJpbmcnOiAnc2hhcGVSZW5kZXJpbmcnLFxuICBzbG9wZTogJ3Nsb3BlJyxcbiAgc3BhY2luZzogJ3NwYWNpbmcnLFxuICBzcGVjdWxhcmNvbnN0YW50OiAnc3BlY3VsYXJDb25zdGFudCcsXG4gIHNwZWN1bGFyZXhwb25lbnQ6ICdzcGVjdWxhckV4cG9uZW50JyxcbiAgc3BlZWQ6ICdzcGVlZCcsXG4gIHNwcmVhZG1ldGhvZDogJ3NwcmVhZE1ldGhvZCcsXG4gIHN0YXJ0b2Zmc2V0OiAnc3RhcnRPZmZzZXQnLFxuICBzdGRkZXZpYXRpb246ICdzdGREZXZpYXRpb24nLFxuICBzdGVtaDogJ3N0ZW1oJyxcbiAgc3RlbXY6ICdzdGVtdicsXG4gIHN0aXRjaHRpbGVzOiAnc3RpdGNoVGlsZXMnLFxuICBzdG9wY29sb3I6ICdzdG9wQ29sb3InLFxuICAnc3RvcC1jb2xvcic6ICdzdG9wQ29sb3InLFxuICBzdG9wb3BhY2l0eTogJ3N0b3BPcGFjaXR5JyxcbiAgJ3N0b3Atb3BhY2l0eSc6ICdzdG9wT3BhY2l0eScsXG4gIHN0cmlrZXRocm91Z2hwb3NpdGlvbjogJ3N0cmlrZXRocm91Z2hQb3NpdGlvbicsXG4gICdzdHJpa2V0aHJvdWdoLXBvc2l0aW9uJzogJ3N0cmlrZXRocm91Z2hQb3NpdGlvbicsXG4gIHN0cmlrZXRocm91Z2h0aGlja25lc3M6ICdzdHJpa2V0aHJvdWdoVGhpY2tuZXNzJyxcbiAgJ3N0cmlrZXRocm91Z2gtdGhpY2tuZXNzJzogJ3N0cmlrZXRocm91Z2hUaGlja25lc3MnLFxuICBzdHJpbmc6ICdzdHJpbmcnLFxuICBzdHJva2U6ICdzdHJva2UnLFxuICBzdHJva2VkYXNoYXJyYXk6ICdzdHJva2VEYXNoYXJyYXknLFxuICAnc3Ryb2tlLWRhc2hhcnJheSc6ICdzdHJva2VEYXNoYXJyYXknLFxuICBzdHJva2VkYXNob2Zmc2V0OiAnc3Ryb2tlRGFzaG9mZnNldCcsXG4gICdzdHJva2UtZGFzaG9mZnNldCc6ICdzdHJva2VEYXNob2Zmc2V0JyxcbiAgc3Ryb2tlbGluZWNhcDogJ3N0cm9rZUxpbmVjYXAnLFxuICAnc3Ryb2tlLWxpbmVjYXAnOiAnc3Ryb2tlTGluZWNhcCcsXG4gIHN0cm9rZWxpbmVqb2luOiAnc3Ryb2tlTGluZWpvaW4nLFxuICAnc3Ryb2tlLWxpbmVqb2luJzogJ3N0cm9rZUxpbmVqb2luJyxcbiAgc3Ryb2tlbWl0ZXJsaW1pdDogJ3N0cm9rZU1pdGVybGltaXQnLFxuICAnc3Ryb2tlLW1pdGVybGltaXQnOiAnc3Ryb2tlTWl0ZXJsaW1pdCcsXG4gIHN0cm9rZXdpZHRoOiAnc3Ryb2tlV2lkdGgnLFxuICAnc3Ryb2tlLXdpZHRoJzogJ3N0cm9rZVdpZHRoJyxcbiAgc3Ryb2tlb3BhY2l0eTogJ3N0cm9rZU9wYWNpdHknLFxuICAnc3Ryb2tlLW9wYWNpdHknOiAnc3Ryb2tlT3BhY2l0eScsXG4gIHN1cHByZXNzY29udGVudGVkaXRhYmxld2FybmluZzogJ3N1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZycsXG4gIHN1cHByZXNzaHlkcmF0aW9ud2FybmluZzogJ3N1cHByZXNzSHlkcmF0aW9uV2FybmluZycsXG4gIHN1cmZhY2VzY2FsZTogJ3N1cmZhY2VTY2FsZScsXG4gIHN5c3RlbWxhbmd1YWdlOiAnc3lzdGVtTGFuZ3VhZ2UnLFxuICB0YWJsZXZhbHVlczogJ3RhYmxlVmFsdWVzJyxcbiAgdGFyZ2V0eDogJ3RhcmdldFgnLFxuICB0YXJnZXR5OiAndGFyZ2V0WScsXG4gIHRleHRhbmNob3I6ICd0ZXh0QW5jaG9yJyxcbiAgJ3RleHQtYW5jaG9yJzogJ3RleHRBbmNob3InLFxuICB0ZXh0ZGVjb3JhdGlvbjogJ3RleHREZWNvcmF0aW9uJyxcbiAgJ3RleHQtZGVjb3JhdGlvbic6ICd0ZXh0RGVjb3JhdGlvbicsXG4gIHRleHRsZW5ndGg6ICd0ZXh0TGVuZ3RoJyxcbiAgdGV4dHJlbmRlcmluZzogJ3RleHRSZW5kZXJpbmcnLFxuICAndGV4dC1yZW5kZXJpbmcnOiAndGV4dFJlbmRlcmluZycsXG4gIHRvOiAndG8nLFxuICB0cmFuc2Zvcm06ICd0cmFuc2Zvcm0nLFxuICB0eXBlb2Y6ICd0eXBlb2YnLFxuICB1MTogJ3UxJyxcbiAgdTI6ICd1MicsXG4gIHVuZGVybGluZXBvc2l0aW9uOiAndW5kZXJsaW5lUG9zaXRpb24nLFxuICAndW5kZXJsaW5lLXBvc2l0aW9uJzogJ3VuZGVybGluZVBvc2l0aW9uJyxcbiAgdW5kZXJsaW5ldGhpY2tuZXNzOiAndW5kZXJsaW5lVGhpY2tuZXNzJyxcbiAgJ3VuZGVybGluZS10aGlja25lc3MnOiAndW5kZXJsaW5lVGhpY2tuZXNzJyxcbiAgdW5pY29kZTogJ3VuaWNvZGUnLFxuICB1bmljb2RlYmlkaTogJ3VuaWNvZGVCaWRpJyxcbiAgJ3VuaWNvZGUtYmlkaSc6ICd1bmljb2RlQmlkaScsXG4gIHVuaWNvZGVyYW5nZTogJ3VuaWNvZGVSYW5nZScsXG4gICd1bmljb2RlLXJhbmdlJzogJ3VuaWNvZGVSYW5nZScsXG4gIHVuaXRzcGVyZW06ICd1bml0c1BlckVtJyxcbiAgJ3VuaXRzLXBlci1lbSc6ICd1bml0c1BlckVtJyxcbiAgdW5zZWxlY3RhYmxlOiAndW5zZWxlY3RhYmxlJyxcbiAgdmFscGhhYmV0aWM6ICd2QWxwaGFiZXRpYycsXG4gICd2LWFscGhhYmV0aWMnOiAndkFscGhhYmV0aWMnLFxuICB2YWx1ZXM6ICd2YWx1ZXMnLFxuICB2ZWN0b3JlZmZlY3Q6ICd2ZWN0b3JFZmZlY3QnLFxuICAndmVjdG9yLWVmZmVjdCc6ICd2ZWN0b3JFZmZlY3QnLFxuICB2ZXJzaW9uOiAndmVyc2lvbicsXG4gIHZlcnRhZHZ5OiAndmVydEFkdlknLFxuICAndmVydC1hZHYteSc6ICd2ZXJ0QWR2WScsXG4gIHZlcnRvcmlnaW54OiAndmVydE9yaWdpblgnLFxuICAndmVydC1vcmlnaW4teCc6ICd2ZXJ0T3JpZ2luWCcsXG4gIHZlcnRvcmlnaW55OiAndmVydE9yaWdpblknLFxuICAndmVydC1vcmlnaW4teSc6ICd2ZXJ0T3JpZ2luWScsXG4gIHZoYW5naW5nOiAndkhhbmdpbmcnLFxuICAndi1oYW5naW5nJzogJ3ZIYW5naW5nJyxcbiAgdmlkZW9ncmFwaGljOiAndklkZW9ncmFwaGljJyxcbiAgJ3YtaWRlb2dyYXBoaWMnOiAndklkZW9ncmFwaGljJyxcbiAgdmlld2JveDogJ3ZpZXdCb3gnLFxuICB2aWV3dGFyZ2V0OiAndmlld1RhcmdldCcsXG4gIHZpc2liaWxpdHk6ICd2aXNpYmlsaXR5JyxcbiAgdm1hdGhlbWF0aWNhbDogJ3ZNYXRoZW1hdGljYWwnLFxuICAndi1tYXRoZW1hdGljYWwnOiAndk1hdGhlbWF0aWNhbCcsXG4gIHZvY2FiOiAndm9jYWInLFxuICB3aWR0aHM6ICd3aWR0aHMnLFxuICB3b3Jkc3BhY2luZzogJ3dvcmRTcGFjaW5nJyxcbiAgJ3dvcmQtc3BhY2luZyc6ICd3b3JkU3BhY2luZycsXG4gIHdyaXRpbmdtb2RlOiAnd3JpdGluZ01vZGUnLFxuICAnd3JpdGluZy1tb2RlJzogJ3dyaXRpbmdNb2RlJyxcbiAgeDE6ICd4MScsXG4gIHgyOiAneDInLFxuICB4OiAneCcsXG4gIHhjaGFubmVsc2VsZWN0b3I6ICd4Q2hhbm5lbFNlbGVjdG9yJyxcbiAgeGhlaWdodDogJ3hIZWlnaHQnLFxuICAneC1oZWlnaHQnOiAneEhlaWdodCcsXG4gIHhsaW5rYWN0dWF0ZTogJ3hsaW5rQWN0dWF0ZScsXG4gICd4bGluazphY3R1YXRlJzogJ3hsaW5rQWN0dWF0ZScsXG4gIHhsaW5rYXJjcm9sZTogJ3hsaW5rQXJjcm9sZScsXG4gICd4bGluazphcmNyb2xlJzogJ3hsaW5rQXJjcm9sZScsXG4gIHhsaW5raHJlZjogJ3hsaW5rSHJlZicsXG4gICd4bGluazpocmVmJzogJ3hsaW5rSHJlZicsXG4gIHhsaW5rcm9sZTogJ3hsaW5rUm9sZScsXG4gICd4bGluazpyb2xlJzogJ3hsaW5rUm9sZScsXG4gIHhsaW5rc2hvdzogJ3hsaW5rU2hvdycsXG4gICd4bGluazpzaG93JzogJ3hsaW5rU2hvdycsXG4gIHhsaW5rdGl0bGU6ICd4bGlua1RpdGxlJyxcbiAgJ3hsaW5rOnRpdGxlJzogJ3hsaW5rVGl0bGUnLFxuICB4bGlua3R5cGU6ICd4bGlua1R5cGUnLFxuICAneGxpbms6dHlwZSc6ICd4bGlua1R5cGUnLFxuICB4bWxiYXNlOiAneG1sQmFzZScsXG4gICd4bWw6YmFzZSc6ICd4bWxCYXNlJyxcbiAgeG1sbGFuZzogJ3htbExhbmcnLFxuICAneG1sOmxhbmcnOiAneG1sTGFuZycsXG4gIHhtbG5zOiAneG1sbnMnLFxuICAneG1sOnNwYWNlJzogJ3htbFNwYWNlJyxcbiAgeG1sbnN4bGluazogJ3htbG5zWGxpbmsnLFxuICAneG1sbnM6eGxpbmsnOiAneG1sbnNYbGluaycsXG4gIHhtbHNwYWNlOiAneG1sU3BhY2UnLFxuICB5MTogJ3kxJyxcbiAgeTI6ICd5MicsXG4gIHk6ICd5JyxcbiAgeWNoYW5uZWxzZWxlY3RvcjogJ3lDaGFubmVsU2VsZWN0b3InLFxuICB6OiAneicsXG4gIHpvb21hbmRwYW46ICd6b29tQW5kUGFuJ1xufTtcblxudmFyIGFyaWFQcm9wZXJ0aWVzID0ge1xuICAnYXJpYS1jdXJyZW50JzogMCxcbiAgLy8gc3RhdGVcbiAgJ2FyaWEtZGVzY3JpcHRpb24nOiAwLFxuICAnYXJpYS1kZXRhaWxzJzogMCxcbiAgJ2FyaWEtZGlzYWJsZWQnOiAwLFxuICAvLyBzdGF0ZVxuICAnYXJpYS1oaWRkZW4nOiAwLFxuICAvLyBzdGF0ZVxuICAnYXJpYS1pbnZhbGlkJzogMCxcbiAgLy8gc3RhdGVcbiAgJ2FyaWEta2V5c2hvcnRjdXRzJzogMCxcbiAgJ2FyaWEtbGFiZWwnOiAwLFxuICAnYXJpYS1yb2xlZGVzY3JpcHRpb24nOiAwLFxuICAvLyBXaWRnZXQgQXR0cmlidXRlc1xuICAnYXJpYS1hdXRvY29tcGxldGUnOiAwLFxuICAnYXJpYS1jaGVja2VkJzogMCxcbiAgJ2FyaWEtZXhwYW5kZWQnOiAwLFxuICAnYXJpYS1oYXNwb3B1cCc6IDAsXG4gICdhcmlhLWxldmVsJzogMCxcbiAgJ2FyaWEtbW9kYWwnOiAwLFxuICAnYXJpYS1tdWx0aWxpbmUnOiAwLFxuICAnYXJpYS1tdWx0aXNlbGVjdGFibGUnOiAwLFxuICAnYXJpYS1vcmllbnRhdGlvbic6IDAsXG4gICdhcmlhLXBsYWNlaG9sZGVyJzogMCxcbiAgJ2FyaWEtcHJlc3NlZCc6IDAsXG4gICdhcmlhLXJlYWRvbmx5JzogMCxcbiAgJ2FyaWEtcmVxdWlyZWQnOiAwLFxuICAnYXJpYS1zZWxlY3RlZCc6IDAsXG4gICdhcmlhLXNvcnQnOiAwLFxuICAnYXJpYS12YWx1ZW1heCc6IDAsXG4gICdhcmlhLXZhbHVlbWluJzogMCxcbiAgJ2FyaWEtdmFsdWVub3cnOiAwLFxuICAnYXJpYS12YWx1ZXRleHQnOiAwLFxuICAvLyBMaXZlIFJlZ2lvbiBBdHRyaWJ1dGVzXG4gICdhcmlhLWF0b21pYyc6IDAsXG4gICdhcmlhLWJ1c3knOiAwLFxuICAnYXJpYS1saXZlJzogMCxcbiAgJ2FyaWEtcmVsZXZhbnQnOiAwLFxuICAvLyBEcmFnLWFuZC1Ecm9wIEF0dHJpYnV0ZXNcbiAgJ2FyaWEtZHJvcGVmZmVjdCc6IDAsXG4gICdhcmlhLWdyYWJiZWQnOiAwLFxuICAvLyBSZWxhdGlvbnNoaXAgQXR0cmlidXRlc1xuICAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JzogMCxcbiAgJ2FyaWEtY29sY291bnQnOiAwLFxuICAnYXJpYS1jb2xpbmRleCc6IDAsXG4gICdhcmlhLWNvbHNwYW4nOiAwLFxuICAnYXJpYS1jb250cm9scyc6IDAsXG4gICdhcmlhLWRlc2NyaWJlZGJ5JzogMCxcbiAgJ2FyaWEtZXJyb3JtZXNzYWdlJzogMCxcbiAgJ2FyaWEtZmxvd3RvJzogMCxcbiAgJ2FyaWEtbGFiZWxsZWRieSc6IDAsXG4gICdhcmlhLW93bnMnOiAwLFxuICAnYXJpYS1wb3NpbnNldCc6IDAsXG4gICdhcmlhLXJvd2NvdW50JzogMCxcbiAgJ2FyaWEtcm93aW5kZXgnOiAwLFxuICAnYXJpYS1yb3dzcGFuJzogMCxcbiAgJ2FyaWEtc2V0c2l6ZSc6IDBcbn07XG5cbnZhciB3YXJuZWRQcm9wZXJ0aWVzID0ge307XG52YXIgckFSSUEgPSBuZXcgUmVnRXhwKCdeKGFyaWEpLVsnICsgQVRUUklCVVRFX05BTUVfQ0hBUiArICddKiQnKTtcbnZhciByQVJJQUNhbWVsID0gbmV3IFJlZ0V4cCgnXihhcmlhKVtBLVpdWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnR5KHRhZ05hbWUsIG5hbWUpIHtcbiAge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHdhcm5lZFByb3BlcnRpZXMsIG5hbWUpICYmIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChyQVJJQUNhbWVsLnRlc3QobmFtZSkpIHtcbiAgICAgIHZhciBhcmlhTmFtZSA9ICdhcmlhLScgKyBuYW1lLnNsaWNlKDQpLnRvTG93ZXJDYXNlKCk7XG4gICAgICB2YXIgY29ycmVjdE5hbWUgPSBhcmlhUHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShhcmlhTmFtZSkgPyBhcmlhTmFtZSA6IG51bGw7IC8vIElmIHRoaXMgaXMgYW4gYXJpYS0qIGF0dHJpYnV0ZSwgYnV0IGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGtub3duIERPTVxuICAgICAgLy8gRE9NIHByb3BlcnRpZXMsIHRoZW4gaXQgaXMgYW4gaW52YWxpZCBhcmlhLSogYXR0cmlidXRlLlxuXG4gICAgICBpZiAoY29ycmVjdE5hbWUgPT0gbnVsbCkge1xuICAgICAgICBlcnJvcignSW52YWxpZCBBUklBIGF0dHJpYnV0ZSBgJXNgLiBBUklBIGF0dHJpYnV0ZXMgZm9sbG93IHRoZSBwYXR0ZXJuIGFyaWEtKiBhbmQgbXVzdCBiZSBsb3dlcmNhc2UuJywgbmFtZSk7XG5cbiAgICAgICAgd2FybmVkUHJvcGVydGllc1tuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSAvLyBhcmlhLSogYXR0cmlidXRlcyBzaG91bGQgYmUgbG93ZXJjYXNlOyBzdWdnZXN0IHRoZSBsb3dlcmNhc2UgdmVyc2lvbi5cblxuXG4gICAgICBpZiAobmFtZSAhPT0gY29ycmVjdE5hbWUpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgQVJJQSBhdHRyaWJ1dGUgYCVzYC4gRGlkIHlvdSBtZWFuIGAlc2A/JywgbmFtZSwgY29ycmVjdE5hbWUpO1xuXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAockFSSUEudGVzdChuYW1lKSkge1xuICAgICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgdmFyIHN0YW5kYXJkTmFtZSA9IGFyaWFQcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KGxvd2VyQ2FzZWROYW1lKSA/IGxvd2VyQ2FzZWROYW1lIDogbnVsbDsgLy8gSWYgdGhpcyBpcyBhbiBhcmlhLSogYXR0cmlidXRlLCBidXQgaXMgbm90IGxpc3RlZCBpbiB0aGUga25vd24gRE9NXG4gICAgICAvLyBET00gcHJvcGVydGllcywgdGhlbiBpdCBpcyBhbiBpbnZhbGlkIGFyaWEtKiBhdHRyaWJ1dGUuXG5cbiAgICAgIGlmIChzdGFuZGFyZE5hbWUgPT0gbnVsbCkge1xuICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSAvLyBhcmlhLSogYXR0cmlidXRlcyBzaG91bGQgYmUgbG93ZXJjYXNlOyBzdWdnZXN0IHRoZSBsb3dlcmNhc2UgdmVyc2lvbi5cblxuXG4gICAgICBpZiAobmFtZSAhPT0gc3RhbmRhcmROYW1lKSB7XG4gICAgICAgIGVycm9yKCdVbmtub3duIEFSSUEgYXR0cmlidXRlIGAlc2AuIERpZCB5b3UgbWVhbiBgJXNgPycsIG5hbWUsIHN0YW5kYXJkTmFtZSk7XG5cbiAgICAgICAgd2FybmVkUHJvcGVydGllc1tuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiB3YXJuSW52YWxpZEFSSUFQcm9wcyh0eXBlLCBwcm9wcykge1xuICB7XG4gICAgdmFyIGludmFsaWRQcm9wcyA9IFtdO1xuXG4gICAgZm9yICh2YXIga2V5IGluIHByb3BzKSB7XG4gICAgICB2YXIgaXNWYWxpZCA9IHZhbGlkYXRlUHJvcGVydHkodHlwZSwga2V5KTtcblxuICAgICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgIGludmFsaWRQcm9wcy5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHVua25vd25Qcm9wU3RyaW5nID0gaW52YWxpZFByb3BzLm1hcChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgcmV0dXJuICdgJyArIHByb3AgKyAnYCc7XG4gICAgfSkuam9pbignLCAnKTtcblxuICAgIGlmIChpbnZhbGlkUHJvcHMubGVuZ3RoID09PSAxKSB7XG4gICAgICBlcnJvcignSW52YWxpZCBhcmlhIHByb3AgJXMgb24gPCVzPiB0YWcuICcgKyAnRm9yIGRldGFpbHMsIHNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvaW52YWxpZC1hcmlhLXByb3BzJywgdW5rbm93blByb3BTdHJpbmcsIHR5cGUpO1xuICAgIH0gZWxzZSBpZiAoaW52YWxpZFByb3BzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGVycm9yKCdJbnZhbGlkIGFyaWEgcHJvcHMgJXMgb24gPCVzPiB0YWcuICcgKyAnRm9yIGRldGFpbHMsIHNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvaW52YWxpZC1hcmlhLXByb3BzJywgdW5rbm93blByb3BTdHJpbmcsIHR5cGUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnRpZXModHlwZSwgcHJvcHMpIHtcbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50KHR5cGUsIHByb3BzKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHdhcm5JbnZhbGlkQVJJQVByb3BzKHR5cGUsIHByb3BzKTtcbn1cblxudmFyIGRpZFdhcm5WYWx1ZU51bGwgPSBmYWxzZTtcbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydGllcyQxKHR5cGUsIHByb3BzKSB7XG4gIHtcbiAgICBpZiAodHlwZSAhPT0gJ2lucHV0JyAmJiB0eXBlICE9PSAndGV4dGFyZWEnICYmIHR5cGUgIT09ICdzZWxlY3QnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHByb3BzICE9IG51bGwgJiYgcHJvcHMudmFsdWUgPT09IG51bGwgJiYgIWRpZFdhcm5WYWx1ZU51bGwpIHtcbiAgICAgIGRpZFdhcm5WYWx1ZU51bGwgPSB0cnVlO1xuXG4gICAgICBpZiAodHlwZSA9PT0gJ3NlbGVjdCcgJiYgcHJvcHMubXVsdGlwbGUpIHtcbiAgICAgICAgZXJyb3IoJ2B2YWx1ZWAgcHJvcCBvbiBgJXNgIHNob3VsZCBub3QgYmUgbnVsbC4gJyArICdDb25zaWRlciB1c2luZyBhbiBlbXB0eSBhcnJheSB3aGVuIGBtdWx0aXBsZWAgaXMgc2V0IHRvIGB0cnVlYCAnICsgJ3RvIGNsZWFyIHRoZSBjb21wb25lbnQgb3IgYHVuZGVmaW5lZGAgZm9yIHVuY29udHJvbGxlZCBjb21wb25lbnRzLicsIHR5cGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IoJ2B2YWx1ZWAgcHJvcCBvbiBgJXNgIHNob3VsZCBub3QgYmUgbnVsbC4gJyArICdDb25zaWRlciB1c2luZyBhbiBlbXB0eSBzdHJpbmcgdG8gY2xlYXIgdGhlIGNvbXBvbmVudCBvciBgdW5kZWZpbmVkYCAnICsgJ2ZvciB1bmNvbnRyb2xsZWQgY29tcG9uZW50cy4nLCB0eXBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIHZhbGlkYXRlUHJvcGVydHkkMSA9IGZ1bmN0aW9uICgpIHt9O1xuXG57XG4gIHZhciB3YXJuZWRQcm9wZXJ0aWVzJDEgPSB7fTtcbiAgdmFyIEVWRU5UX05BTUVfUkVHRVggPSAvXm9uLi87XG4gIHZhciBJTlZBTElEX0VWRU5UX05BTUVfUkVHRVggPSAvXm9uW15BLVpdLztcbiAgdmFyIHJBUklBJDEgPSBuZXcgUmVnRXhwKCdeKGFyaWEpLVsnICsgQVRUUklCVVRFX05BTUVfQ0hBUiArICddKiQnKTtcbiAgdmFyIHJBUklBQ2FtZWwkMSA9IG5ldyBSZWdFeHAoJ14oYXJpYSlbQS1aXVsnICsgQVRUUklCVVRFX05BTUVfQ0hBUiArICddKiQnKTtcblxuICB2YWxpZGF0ZVByb3BlcnR5JDEgPSBmdW5jdGlvbiAodGFnTmFtZSwgbmFtZSwgdmFsdWUsIGV2ZW50UmVnaXN0cnkpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh3YXJuZWRQcm9wZXJ0aWVzJDEsIG5hbWUpICYmIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKGxvd2VyQ2FzZWROYW1lID09PSAnb25mb2N1c2luJyB8fCBsb3dlckNhc2VkTmFtZSA9PT0gJ29uZm9jdXNvdXQnKSB7XG4gICAgICBlcnJvcignUmVhY3QgdXNlcyBvbkZvY3VzIGFuZCBvbkJsdXIgaW5zdGVhZCBvZiBvbkZvY3VzSW4gYW5kIG9uRm9jdXNPdXQuICcgKyAnQWxsIFJlYWN0IGV2ZW50cyBhcmUgbm9ybWFsaXplZCB0byBidWJibGUsIHNvIG9uRm9jdXNJbiBhbmQgb25Gb2N1c091dCAnICsgJ2FyZSBub3QgbmVlZGVkL3N1cHBvcnRlZCBieSBSZWFjdC4nKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gLy8gV2UgY2FuJ3QgcmVseSBvbiB0aGUgZXZlbnQgc3lzdGVtIGJlaW5nIGluamVjdGVkIG9uIHRoZSBzZXJ2ZXIuXG5cblxuICAgIGlmIChldmVudFJlZ2lzdHJ5ICE9IG51bGwpIHtcbiAgICAgIHZhciByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzID0gZXZlbnRSZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLFxuICAgICAgICAgIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMgPSBldmVudFJlZ2lzdHJ5LnBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXM7XG5cbiAgICAgIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVnaXN0cmF0aW9uTmFtZSA9IHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMuaGFzT3duUHJvcGVydHkobG93ZXJDYXNlZE5hbWUpID8gcG9zc2libGVSZWdpc3RyYXRpb25OYW1lc1tsb3dlckNhc2VkTmFtZV0gOiBudWxsO1xuXG4gICAgICBpZiAocmVnaXN0cmF0aW9uTmFtZSAhPSBudWxsKSB7XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIGV2ZW50IGhhbmRsZXIgcHJvcGVydHkgYCVzYC4gRGlkIHlvdSBtZWFuIGAlc2A/JywgbmFtZSwgcmVnaXN0cmF0aW9uTmFtZSk7XG5cbiAgICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChFVkVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgICAgZXJyb3IoJ1Vua25vd24gZXZlbnQgaGFuZGxlciBwcm9wZXJ0eSBgJXNgLiBJdCB3aWxsIGJlIGlnbm9yZWQuJywgbmFtZSk7XG5cbiAgICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChFVkVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgIC8vIElmIG5vIGV2ZW50IHBsdWdpbnMgaGF2ZSBiZWVuIGluamVjdGVkLCB3ZSBhcmUgaW4gYSBzZXJ2ZXIgZW52aXJvbm1lbnQuXG4gICAgICAvLyBTbyB3ZSBjYW4ndCB0ZWxsIGlmIHRoZSBldmVudCBuYW1lIGlzIGNvcnJlY3QgZm9yIHN1cmUsIGJ1dCB3ZSBjYW4gZmlsdGVyXG4gICAgICAvLyBvdXQga25vd24gYmFkIG9uZXMgbGlrZSBgb25jbGlja2AuIFdlIGNhbid0IHN1Z2dlc3QgYSBzcGVjaWZpYyByZXBsYWNlbWVudCB0aG91Z2guXG4gICAgICBpZiAoSU5WQUxJRF9FVkVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgZXZlbnQgaGFuZGxlciBwcm9wZXJ0eSBgJXNgLiAnICsgJ1JlYWN0IGV2ZW50cyB1c2UgdGhlIGNhbWVsQ2FzZSBuYW1pbmcgY29udmVudGlvbiwgZm9yIGV4YW1wbGUgYG9uQ2xpY2tgLicsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSAvLyBMZXQgdGhlIEFSSUEgYXR0cmlidXRlIGhvb2sgdmFsaWRhdGUgQVJJQSBhdHRyaWJ1dGVzXG5cblxuICAgIGlmIChyQVJJQSQxLnRlc3QobmFtZSkgfHwgckFSSUFDYW1lbCQxLnRlc3QobmFtZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChsb3dlckNhc2VkTmFtZSA9PT0gJ2lubmVyaHRtbCcpIHtcbiAgICAgIGVycm9yKCdEaXJlY3RseSBzZXR0aW5nIHByb3BlcnR5IGBpbm5lckhUTUxgIGlzIG5vdCBwZXJtaXR0ZWQuICcgKyAnRm9yIG1vcmUgaW5mb3JtYXRpb24sIGxvb2t1cCBkb2N1bWVudGF0aW9uIG9uIGBkYW5nZXJvdXNseVNldElubmVySFRNTGAuJyk7XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAobG93ZXJDYXNlZE5hbWUgPT09ICdhcmlhJykge1xuICAgICAgZXJyb3IoJ1RoZSBgYXJpYWAgYXR0cmlidXRlIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlIGluIFJlYWN0LiAnICsgJ1Bhc3MgaW5kaXZpZHVhbCBgYXJpYS1gIGF0dHJpYnV0ZXMgaW5zdGVhZC4nKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChsb3dlckNhc2VkTmFtZSA9PT0gJ2lzJyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCBhIGAlc2AgZm9yIGEgc3RyaW5nIGF0dHJpYnV0ZSBgaXNgLiBJZiB0aGlzIGlzIGV4cGVjdGVkLCBjYXN0ICcgKyAndGhlIHZhbHVlIHRvIGEgc3RyaW5nLicsIHR5cGVvZiB2YWx1ZSk7XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpc05hTih2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCBOYU4gZm9yIHRoZSBgJXNgIGF0dHJpYnV0ZS4gSWYgdGhpcyBpcyBleHBlY3RlZCwgY2FzdCAnICsgJ3RoZSB2YWx1ZSB0byBhIHN0cmluZy4nLCBuYW1lKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciBwcm9wZXJ0eUluZm8gPSBnZXRQcm9wZXJ0eUluZm8obmFtZSk7XG4gICAgdmFyIGlzUmVzZXJ2ZWQgPSBwcm9wZXJ0eUluZm8gIT09IG51bGwgJiYgcHJvcGVydHlJbmZvLnR5cGUgPT09IFJFU0VSVkVEOyAvLyBLbm93biBhdHRyaWJ1dGVzIHNob3VsZCBtYXRjaCB0aGUgY2FzaW5nIHNwZWNpZmllZCBpbiB0aGUgcHJvcGVydHkgY29uZmlnLlxuXG4gICAgaWYgKHBvc3NpYmxlU3RhbmRhcmROYW1lcy5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkpIHtcbiAgICAgIHZhciBzdGFuZGFyZE5hbWUgPSBwb3NzaWJsZVN0YW5kYXJkTmFtZXNbbG93ZXJDYXNlZE5hbWVdO1xuXG4gICAgICBpZiAoc3RhbmRhcmROYW1lICE9PSBuYW1lKSB7XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIERPTSBwcm9wZXJ0eSBgJXNgLiBEaWQgeW91IG1lYW4gYCVzYD8nLCBuYW1lLCBzdGFuZGFyZE5hbWUpO1xuXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWlzUmVzZXJ2ZWQgJiYgbmFtZSAhPT0gbG93ZXJDYXNlZE5hbWUpIHtcbiAgICAgIC8vIFVua25vd24gYXR0cmlidXRlcyBzaG91bGQgaGF2ZSBsb3dlcmNhc2UgY2FzaW5nIHNpbmNlIHRoYXQncyBob3cgdGhleVxuICAgICAgLy8gd2lsbCBiZSBjYXNlZCBhbnl3YXkgd2l0aCBzZXJ2ZXIgcmVuZGVyaW5nLlxuICAgICAgZXJyb3IoJ1JlYWN0IGRvZXMgbm90IHJlY29nbml6ZSB0aGUgYCVzYCBwcm9wIG9uIGEgRE9NIGVsZW1lbnQuIElmIHlvdSAnICsgJ2ludGVudGlvbmFsbHkgd2FudCBpdCB0byBhcHBlYXIgaW4gdGhlIERPTSBhcyBhIGN1c3RvbSAnICsgJ2F0dHJpYnV0ZSwgc3BlbGwgaXQgYXMgbG93ZXJjYXNlIGAlc2AgaW5zdGVhZC4gJyArICdJZiB5b3UgYWNjaWRlbnRhbGx5IHBhc3NlZCBpdCBmcm9tIGEgcGFyZW50IGNvbXBvbmVudCwgcmVtb3ZlICcgKyAnaXQgZnJvbSB0aGUgRE9NIGVsZW1lbnQuJywgbmFtZSwgbG93ZXJDYXNlZE5hbWUpO1xuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nICYmIHNob3VsZFJlbW92ZUF0dHJpYnV0ZVdpdGhXYXJuaW5nKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGZhbHNlKSkge1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGVycm9yKCdSZWNlaXZlZCBgJXNgIGZvciBhIG5vbi1ib29sZWFuIGF0dHJpYnV0ZSBgJXNgLlxcblxcbicgKyAnSWYgeW91IHdhbnQgdG8gd3JpdGUgaXQgdG8gdGhlIERPTSwgcGFzcyBhIHN0cmluZyBpbnN0ZWFkOiAnICsgJyVzPVwiJXNcIiBvciAlcz17dmFsdWUudG9TdHJpbmcoKX0uJywgdmFsdWUsIG5hbWUsIG5hbWUsIHZhbHVlLCBuYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCdSZWNlaXZlZCBgJXNgIGZvciBhIG5vbi1ib29sZWFuIGF0dHJpYnV0ZSBgJXNgLlxcblxcbicgKyAnSWYgeW91IHdhbnQgdG8gd3JpdGUgaXQgdG8gdGhlIERPTSwgcGFzcyBhIHN0cmluZyBpbnN0ZWFkOiAnICsgJyVzPVwiJXNcIiBvciAlcz17dmFsdWUudG9TdHJpbmcoKX0uXFxuXFxuJyArICdJZiB5b3UgdXNlZCB0byBjb25kaXRpb25hbGx5IG9taXQgaXQgd2l0aCAlcz17Y29uZGl0aW9uICYmIHZhbHVlfSwgJyArICdwYXNzICVzPXtjb25kaXRpb24gPyB2YWx1ZSA6IHVuZGVmaW5lZH0gaW5zdGVhZC4nLCB2YWx1ZSwgbmFtZSwgbmFtZSwgdmFsdWUsIG5hbWUsIG5hbWUsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSAvLyBOb3cgdGhhdCB3ZSd2ZSB2YWxpZGF0ZWQgY2FzaW5nLCBkbyBub3QgdmFsaWRhdGVcbiAgICAvLyBkYXRhIHR5cGVzIGZvciByZXNlcnZlZCBwcm9wc1xuXG5cbiAgICBpZiAoaXNSZXNlcnZlZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSAvLyBXYXJuIHdoZW4gYSBrbm93biBhdHRyaWJ1dGUgaXMgYSBiYWQgdHlwZVxuXG5cbiAgICBpZiAoc2hvdWxkUmVtb3ZlQXR0cmlidXRlV2l0aFdhcm5pbmcobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgZmFsc2UpKSB7XG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gV2FybiB3aGVuIHBhc3NpbmcgdGhlIHN0cmluZ3MgJ2ZhbHNlJyBvciAndHJ1ZScgaW50byBhIGJvb2xlYW4gcHJvcFxuXG5cbiAgICBpZiAoKHZhbHVlID09PSAnZmFsc2UnIHx8IHZhbHVlID09PSAndHJ1ZScpICYmIHByb3BlcnR5SW5mbyAhPT0gbnVsbCAmJiBwcm9wZXJ0eUluZm8udHlwZSA9PT0gQk9PTEVBTikge1xuICAgICAgZXJyb3IoJ1JlY2VpdmVkIHRoZSBzdHJpbmcgYCVzYCBmb3IgdGhlIGJvb2xlYW4gYXR0cmlidXRlIGAlc2AuICcgKyAnJXMgJyArICdEaWQgeW91IG1lYW4gJXM9eyVzfT8nLCB2YWx1ZSwgbmFtZSwgdmFsdWUgPT09ICdmYWxzZScgPyAnVGhlIGJyb3dzZXIgd2lsbCBpbnRlcnByZXQgaXQgYXMgYSB0cnV0aHkgdmFsdWUuJyA6ICdBbHRob3VnaCB0aGlzIHdvcmtzLCBpdCB3aWxsIG5vdCB3b3JrIGFzIGV4cGVjdGVkIGlmIHlvdSBwYXNzIHRoZSBzdHJpbmcgXCJmYWxzZVwiLicsIG5hbWUsIHZhbHVlKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xufVxuXG52YXIgd2FyblVua25vd25Qcm9wZXJ0aWVzID0gZnVuY3Rpb24gKHR5cGUsIHByb3BzLCBldmVudFJlZ2lzdHJ5KSB7XG4gIHtcbiAgICB2YXIgdW5rbm93blByb3BzID0gW107XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gcHJvcHMpIHtcbiAgICAgIHZhciBpc1ZhbGlkID0gdmFsaWRhdGVQcm9wZXJ0eSQxKHR5cGUsIGtleSwgcHJvcHNba2V5XSwgZXZlbnRSZWdpc3RyeSk7XG5cbiAgICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgICB1bmtub3duUHJvcHMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciB1bmtub3duUHJvcFN0cmluZyA9IHVua25vd25Qcm9wcy5tYXAoZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgIHJldHVybiAnYCcgKyBwcm9wICsgJ2AnO1xuICAgIH0pLmpvaW4oJywgJyk7XG5cbiAgICBpZiAodW5rbm93blByb3BzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgZXJyb3IoJ0ludmFsaWQgdmFsdWUgZm9yIHByb3AgJXMgb24gPCVzPiB0YWcuIEVpdGhlciByZW1vdmUgaXQgZnJvbSB0aGUgZWxlbWVudCwgJyArICdvciBwYXNzIGEgc3RyaW5nIG9yIG51bWJlciB2YWx1ZSB0byBrZWVwIGl0IGluIHRoZSBET00uICcgKyAnRm9yIGRldGFpbHMsIHNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvYXR0cmlidXRlLWJlaGF2aW9yICcsIHVua25vd25Qcm9wU3RyaW5nLCB0eXBlKTtcbiAgICB9IGVsc2UgaWYgKHVua25vd25Qcm9wcy5sZW5ndGggPiAxKSB7XG4gICAgICBlcnJvcignSW52YWxpZCB2YWx1ZXMgZm9yIHByb3BzICVzIG9uIDwlcz4gdGFnLiBFaXRoZXIgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgZWxlbWVudCwgJyArICdvciBwYXNzIGEgc3RyaW5nIG9yIG51bWJlciB2YWx1ZSB0byBrZWVwIHRoZW0gaW4gdGhlIERPTS4gJyArICdGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9hdHRyaWJ1dGUtYmVoYXZpb3IgJywgdW5rbm93blByb3BTdHJpbmcsIHR5cGUpO1xuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0aWVzJDIodHlwZSwgcHJvcHMsIGV2ZW50UmVnaXN0cnkpIHtcbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50KHR5cGUsIHByb3BzKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHdhcm5Vbmtub3duUHJvcGVydGllcyh0eXBlLCBwcm9wcywgZXZlbnRSZWdpc3RyeSk7XG59XG5cbnZhciBJU19FVkVOVF9IQU5ETEVfTk9OX01BTkFHRURfTk9ERSA9IDE7XG52YXIgSVNfTk9OX0RFTEVHQVRFRCA9IDEgPDwgMTtcbnZhciBJU19DQVBUVVJFX1BIQVNFID0gMSA8PCAyO1xuLy8gc2V0IHRvIExFR0FDWV9GQl9TVVBQT1JULiBMRUdBQ1lfRkJfU1VQUE9SVCBvbmx5IGdldHMgc2V0IHdoZW5cbi8vIHdlIGNhbGwgd2lsbERlZmVyTGF0ZXJGb3JMZWdhY3lGQlN1cHBvcnQsIHRodXMgbm90IGJhaWxpbmcgb3V0XG4vLyB3aWxsIHJlc3VsdCBpbiBlbmRsZXNzIGN5Y2xlcyBsaWtlIGFuIGluZmluaXRlIGxvb3AuXG4vLyBXZSBhbHNvIGRvbid0IHdhbnQgdG8gZGVmZXIgZHVyaW5nIGV2ZW50IHJlcGxheWluZy5cblxudmFyIFNIT1VMRF9OT1RfUFJPQ0VTU19QT0xZRklMTF9FVkVOVF9QTFVHSU5TID0gSVNfRVZFTlRfSEFORExFX05PTl9NQU5BR0VEX05PREUgfCBJU19OT05fREVMRUdBVEVEIHwgSVNfQ0FQVFVSRV9QSEFTRTtcblxuLy8gVGhpcyBleGlzdHMgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jeSBiZXR3ZWVuIFJlYWN0RE9NRXZlbnRSZXBsYXlpbmdcbi8vIGFuZCBET01QbHVnaW5FdmVudFN5c3RlbS5cbnZhciBjdXJyZW50UmVwbGF5aW5nRXZlbnQgPSBudWxsO1xuZnVuY3Rpb24gc2V0UmVwbGF5aW5nRXZlbnQoZXZlbnQpIHtcbiAge1xuICAgIGlmIChjdXJyZW50UmVwbGF5aW5nRXZlbnQgIT09IG51bGwpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCBjdXJyZW50bHkgcmVwbGF5aW5nIGV2ZW50IHRvIGJlIG51bGwuIFRoaXMgZXJyb3IgJyArICdpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cblxuICBjdXJyZW50UmVwbGF5aW5nRXZlbnQgPSBldmVudDtcbn1cbmZ1bmN0aW9uIHJlc2V0UmVwbGF5aW5nRXZlbnQoKSB7XG4gIHtcbiAgICBpZiAoY3VycmVudFJlcGxheWluZ0V2ZW50ID09PSBudWxsKSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgY3VycmVudGx5IHJlcGxheWluZyBldmVudCB0byBub3QgYmUgbnVsbC4gVGhpcyBlcnJvciAnICsgJ2lzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxuXG4gIGN1cnJlbnRSZXBsYXlpbmdFdmVudCA9IG51bGw7XG59XG5mdW5jdGlvbiBpc1JlcGxheWluZ0V2ZW50KGV2ZW50KSB7XG4gIHJldHVybiBldmVudCA9PT0gY3VycmVudFJlcGxheWluZ0V2ZW50O1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHRhcmdldCBub2RlIGZyb20gYSBuYXRpdmUgYnJvd3NlciBldmVudCBieSBhY2NvdW50aW5nIGZvclxuICogaW5jb25zaXN0ZW5jaWVzIGluIGJyb3dzZXIgRE9NIEFQSXMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQHJldHVybiB7RE9NRXZlbnRUYXJnZXR9IFRhcmdldCBub2RlLlxuICovXG5cbmZ1bmN0aW9uIGdldEV2ZW50VGFyZ2V0KG5hdGl2ZUV2ZW50KSB7XG4gIC8vIEZhbGxiYWNrIHRvIG5hdGl2ZUV2ZW50LnNyY0VsZW1lbnQgZm9yIElFOVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEyNTA2XG4gIHZhciB0YXJnZXQgPSBuYXRpdmVFdmVudC50YXJnZXQgfHwgbmF0aXZlRXZlbnQuc3JjRWxlbWVudCB8fCB3aW5kb3c7IC8vIE5vcm1hbGl6ZSBTVkcgPHVzZT4gZWxlbWVudCBldmVudHMgIzQ5NjNcblxuICBpZiAodGFyZ2V0LmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50KSB7XG4gICAgdGFyZ2V0ID0gdGFyZ2V0LmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50O1xuICB9IC8vIFNhZmFyaSBtYXkgZmlyZSBldmVudHMgb24gdGV4dCBub2RlcyAoTm9kZS5URVhUX05PREUgaXMgMykuXG4gIC8vIEBzZWUgaHR0cDovL3d3dy5xdWlya3Ntb2RlLm9yZy9qcy9ldmVudHNfcHJvcGVydGllcy5odG1sXG5cblxuICByZXR1cm4gdGFyZ2V0Lm5vZGVUeXBlID09PSBURVhUX05PREUgPyB0YXJnZXQucGFyZW50Tm9kZSA6IHRhcmdldDtcbn1cblxudmFyIHJlc3RvcmVJbXBsID0gbnVsbDtcbnZhciByZXN0b3JlVGFyZ2V0ID0gbnVsbDtcbnZhciByZXN0b3JlUXVldWUgPSBudWxsO1xuXG5mdW5jdGlvbiByZXN0b3JlU3RhdGVPZlRhcmdldCh0YXJnZXQpIHtcbiAgLy8gV2UgcGVyZm9ybSB0aGlzIHRyYW5zbGF0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGV2ZW50IGxvb3Agc28gdGhhdCB3ZVxuICAvLyBhbHdheXMgcmVjZWl2ZSB0aGUgY29ycmVjdCBmaWJlciBoZXJlXG4gIHZhciBpbnRlcm5hbEluc3RhbmNlID0gZ2V0SW5zdGFuY2VGcm9tTm9kZSh0YXJnZXQpO1xuXG4gIGlmICghaW50ZXJuYWxJbnN0YW5jZSkge1xuICAgIC8vIFVubW91bnRlZFxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh0eXBlb2YgcmVzdG9yZUltcGwgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFJlc3RvcmVJbXBsZW1lbnRhdGlvbigpIG5lZWRzIHRvIGJlIGNhbGxlZCB0byBoYW5kbGUgYSB0YXJnZXQgZm9yIGNvbnRyb2xsZWQgJyArICdldmVudHMuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cblxuICB2YXIgc3RhdGVOb2RlID0gaW50ZXJuYWxJbnN0YW5jZS5zdGF0ZU5vZGU7IC8vIEd1YXJkIGFnYWluc3QgRmliZXIgYmVpbmcgdW5tb3VudGVkLlxuXG4gIGlmIChzdGF0ZU5vZGUpIHtcbiAgICB2YXIgX3Byb3BzID0gZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZShzdGF0ZU5vZGUpO1xuXG4gICAgcmVzdG9yZUltcGwoaW50ZXJuYWxJbnN0YW5jZS5zdGF0ZU5vZGUsIGludGVybmFsSW5zdGFuY2UudHlwZSwgX3Byb3BzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRSZXN0b3JlSW1wbGVtZW50YXRpb24oaW1wbCkge1xuICByZXN0b3JlSW1wbCA9IGltcGw7XG59XG5mdW5jdGlvbiBlbnF1ZXVlU3RhdGVSZXN0b3JlKHRhcmdldCkge1xuICBpZiAocmVzdG9yZVRhcmdldCkge1xuICAgIGlmIChyZXN0b3JlUXVldWUpIHtcbiAgICAgIHJlc3RvcmVRdWV1ZS5wdXNoKHRhcmdldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3RvcmVRdWV1ZSA9IFt0YXJnZXRdO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXN0b3JlVGFyZ2V0ID0gdGFyZ2V0O1xuICB9XG59XG5mdW5jdGlvbiBuZWVkc1N0YXRlUmVzdG9yZSgpIHtcbiAgcmV0dXJuIHJlc3RvcmVUYXJnZXQgIT09IG51bGwgfHwgcmVzdG9yZVF1ZXVlICE9PSBudWxsO1xufVxuZnVuY3Rpb24gcmVzdG9yZVN0YXRlSWZOZWVkZWQoKSB7XG4gIGlmICghcmVzdG9yZVRhcmdldCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciB0YXJnZXQgPSByZXN0b3JlVGFyZ2V0O1xuICB2YXIgcXVldWVkVGFyZ2V0cyA9IHJlc3RvcmVRdWV1ZTtcbiAgcmVzdG9yZVRhcmdldCA9IG51bGw7XG4gIHJlc3RvcmVRdWV1ZSA9IG51bGw7XG4gIHJlc3RvcmVTdGF0ZU9mVGFyZ2V0KHRhcmdldCk7XG5cbiAgaWYgKHF1ZXVlZFRhcmdldHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlZFRhcmdldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3RvcmVTdGF0ZU9mVGFyZ2V0KHF1ZXVlZFRhcmdldHNbaV0pO1xuICAgIH1cbiAgfVxufVxuXG4vLyB0aGUgcmVuZGVyZXIuIFN1Y2ggYXMgd2hlbiB3ZSdyZSBkaXNwYXRjaGluZyBldmVudHMgb3IgaWYgdGhpcmQgcGFydHlcbi8vIGxpYnJhcmllcyBuZWVkIHRvIGNhbGwgYmF0Y2hlZFVwZGF0ZXMuIEV2ZW50dWFsbHksIHRoaXMgQVBJIHdpbGwgZ28gYXdheSB3aGVuXG4vLyBldmVyeXRoaW5nIGlzIGJhdGNoZWQgYnkgZGVmYXVsdC4gV2UnbGwgdGhlbiBoYXZlIGEgc2ltaWxhciBBUEkgdG8gb3B0LW91dCBvZlxuLy8gc2NoZWR1bGVkIHdvcmsgYW5kIGluc3RlYWQgZG8gc3luY2hyb25vdXMgd29yay5cbi8vIERlZmF1bHRzXG5cbnZhciBiYXRjaGVkVXBkYXRlc0ltcGwgPSBmdW5jdGlvbiAoZm4sIGJvb2trZWVwaW5nKSB7XG4gIHJldHVybiBmbihib29ra2VlcGluZyk7XG59O1xuXG52YXIgZmx1c2hTeW5jSW1wbCA9IGZ1bmN0aW9uICgpIHt9O1xuXG52YXIgaXNJbnNpZGVFdmVudEhhbmRsZXIgPSBmYWxzZTtcblxuZnVuY3Rpb24gZmluaXNoRXZlbnRIYW5kbGVyKCkge1xuICAvLyBIZXJlIHdlIHdhaXQgdW50aWwgYWxsIHVwZGF0ZXMgaGF2ZSBwcm9wYWdhdGVkLCB3aGljaCBpcyBpbXBvcnRhbnRcbiAgLy8gd2hlbiB1c2luZyBjb250cm9sbGVkIGNvbXBvbmVudHMgd2l0aGluIGxheWVyczpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNjk4XG4gIC8vIFRoZW4gd2UgcmVzdG9yZSBzdGF0ZSBvZiBhbnkgY29udHJvbGxlZCBjb21wb25lbnQuXG4gIHZhciBjb250cm9sbGVkQ29tcG9uZW50c0hhdmVQZW5kaW5nVXBkYXRlcyA9IG5lZWRzU3RhdGVSZXN0b3JlKCk7XG5cbiAgaWYgKGNvbnRyb2xsZWRDb21wb25lbnRzSGF2ZVBlbmRpbmdVcGRhdGVzKSB7XG4gICAgLy8gSWYgYSBjb250cm9sbGVkIGV2ZW50IHdhcyBmaXJlZCwgd2UgbWF5IG5lZWQgdG8gcmVzdG9yZSB0aGUgc3RhdGUgb2ZcbiAgICAvLyB0aGUgRE9NIG5vZGUgYmFjayB0byB0aGUgY29udHJvbGxlZCB2YWx1ZS4gVGhpcyBpcyBuZWNlc3Nhcnkgd2hlbiBSZWFjdFxuICAgIC8vIGJhaWxzIG91dCBvZiB0aGUgdXBkYXRlIHdpdGhvdXQgdG91Y2hpbmcgdGhlIERPTS5cbiAgICAvLyBUT0RPOiBSZXN0b3JlIHN0YXRlIGluIHRoZSBtaWNyb3Rhc2ssIGFmdGVyIHRoZSBkaXNjcmV0ZSB1cGRhdGVzIGZsdXNoLFxuICAgIC8vIGluc3RlYWQgb2YgZWFybHkgZmx1c2hpbmcgdGhlbSBoZXJlLlxuICAgIGZsdXNoU3luY0ltcGwoKTtcbiAgICByZXN0b3JlU3RhdGVJZk5lZWRlZCgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJhdGNoZWRVcGRhdGVzKGZuLCBhLCBiKSB7XG4gIGlmIChpc0luc2lkZUV2ZW50SGFuZGxlcikge1xuICAgIC8vIElmIHdlIGFyZSBjdXJyZW50bHkgaW5zaWRlIGFub3RoZXIgYmF0Y2gsIHdlIG5lZWQgdG8gd2FpdCB1bnRpbCBpdFxuICAgIC8vIGZ1bGx5IGNvbXBsZXRlcyBiZWZvcmUgcmVzdG9yaW5nIHN0YXRlLlxuICAgIHJldHVybiBmbihhLCBiKTtcbiAgfVxuXG4gIGlzSW5zaWRlRXZlbnRIYW5kbGVyID0gdHJ1ZTtcblxuICB0cnkge1xuICAgIHJldHVybiBiYXRjaGVkVXBkYXRlc0ltcGwoZm4sIGEsIGIpO1xuICB9IGZpbmFsbHkge1xuICAgIGlzSW5zaWRlRXZlbnRIYW5kbGVyID0gZmFsc2U7XG4gICAgZmluaXNoRXZlbnRIYW5kbGVyKCk7XG4gIH1cbn0gLy8gVE9ETzogUmVwbGFjZSB3aXRoIGZsdXNoU3luY1xuZnVuY3Rpb24gc2V0QmF0Y2hpbmdJbXBsZW1lbnRhdGlvbihfYmF0Y2hlZFVwZGF0ZXNJbXBsLCBfZGlzY3JldGVVcGRhdGVzSW1wbCwgX2ZsdXNoU3luY0ltcGwpIHtcbiAgYmF0Y2hlZFVwZGF0ZXNJbXBsID0gX2JhdGNoZWRVcGRhdGVzSW1wbDtcbiAgZmx1c2hTeW5jSW1wbCA9IF9mbHVzaFN5bmNJbXBsO1xufVxuXG5mdW5jdGlvbiBpc0ludGVyYWN0aXZlKHRhZykge1xuICByZXR1cm4gdGFnID09PSAnYnV0dG9uJyB8fCB0YWcgPT09ICdpbnB1dCcgfHwgdGFnID09PSAnc2VsZWN0JyB8fCB0YWcgPT09ICd0ZXh0YXJlYSc7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFByZXZlbnRNb3VzZUV2ZW50KG5hbWUsIHR5cGUsIHByb3BzKSB7XG4gIHN3aXRjaCAobmFtZSkge1xuICAgIGNhc2UgJ29uQ2xpY2snOlxuICAgIGNhc2UgJ29uQ2xpY2tDYXB0dXJlJzpcbiAgICBjYXNlICdvbkRvdWJsZUNsaWNrJzpcbiAgICBjYXNlICdvbkRvdWJsZUNsaWNrQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Nb3VzZURvd24nOlxuICAgIGNhc2UgJ29uTW91c2VEb3duQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Nb3VzZU1vdmUnOlxuICAgIGNhc2UgJ29uTW91c2VNb3ZlQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Nb3VzZVVwJzpcbiAgICBjYXNlICdvbk1vdXNlVXBDYXB0dXJlJzpcbiAgICBjYXNlICdvbk1vdXNlRW50ZXInOlxuICAgICAgcmV0dXJuICEhKHByb3BzLmRpc2FibGVkICYmIGlzSW50ZXJhY3RpdmUodHlwZSkpO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gaW5zdCBUaGUgaW5zdGFuY2UsIHdoaWNoIGlzIHRoZSBzb3VyY2Ugb2YgZXZlbnRzLlxuICogQHBhcmFtIHtzdHJpbmd9IHJlZ2lzdHJhdGlvbk5hbWUgTmFtZSBvZiBsaXN0ZW5lciAoZS5nLiBgb25DbGlja2ApLlxuICogQHJldHVybiB7P2Z1bmN0aW9ufSBUaGUgc3RvcmVkIGNhbGxiYWNrLlxuICovXG5cblxuZnVuY3Rpb24gZ2V0TGlzdGVuZXIoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSkge1xuICB2YXIgc3RhdGVOb2RlID0gaW5zdC5zdGF0ZU5vZGU7XG5cbiAgaWYgKHN0YXRlTm9kZSA9PT0gbnVsbCkge1xuICAgIC8vIFdvcmsgaW4gcHJvZ3Jlc3MgKGV4OiBvbmxvYWQgZXZlbnRzIGluIGluY3JlbWVudGFsIG1vZGUpLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIHByb3BzID0gZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZShzdGF0ZU5vZGUpO1xuXG4gIGlmIChwcm9wcyA9PT0gbnVsbCkge1xuICAgIC8vIFdvcmsgaW4gcHJvZ3Jlc3MuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgbGlzdGVuZXIgPSBwcm9wc1tyZWdpc3RyYXRpb25OYW1lXTtcblxuICBpZiAoc2hvdWxkUHJldmVudE1vdXNlRXZlbnQocmVnaXN0cmF0aW9uTmFtZSwgaW5zdC50eXBlLCBwcm9wcykpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChsaXN0ZW5lciAmJiB0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBgXCIgKyByZWdpc3RyYXRpb25OYW1lICsgXCJgIGxpc3RlbmVyIHRvIGJlIGEgZnVuY3Rpb24sIGluc3RlYWQgZ290IGEgdmFsdWUgb2YgYFwiICsgdHlwZW9mIGxpc3RlbmVyICsgXCJgIHR5cGUuXCIpO1xuICB9XG5cbiAgcmV0dXJuIGxpc3RlbmVyO1xufVxuXG52YXIgcGFzc2l2ZUJyb3dzZXJFdmVudHNTdXBwb3J0ZWQgPSBmYWxzZTsgLy8gQ2hlY2sgaWYgYnJvd3NlciBzdXBwb3J0IGV2ZW50cyB3aXRoIHBhc3NpdmUgbGlzdGVuZXJzXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRXZlbnRUYXJnZXQvYWRkRXZlbnRMaXN0ZW5lciNTYWZlbHlfZGV0ZWN0aW5nX29wdGlvbl9zdXBwb3J0XG5cbmlmIChjYW5Vc2VET00pIHtcbiAgdHJ5IHtcbiAgICB2YXIgb3B0aW9ucyA9IHt9OyAvLyAkRmxvd0ZpeE1lOiBJZ25vcmUgRmxvdyBjb21wbGFpbmluZyBhYm91dCBuZWVkaW5nIGEgdmFsdWVcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvcHRpb25zLCAncGFzc2l2ZScsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICBwYXNzaXZlQnJvd3NlckV2ZW50c1N1cHBvcnRlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBvcHRpb25zLCBvcHRpb25zKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndGVzdCcsIG9wdGlvbnMsIG9wdGlvbnMpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcGFzc2l2ZUJyb3dzZXJFdmVudHNTdXBwb3J0ZWQgPSBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tQcm9kKG5hbWUsIGZ1bmMsIGNvbnRleHQsIGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgdmFyIGZ1bmNBcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAzKTtcblxuICB0cnkge1xuICAgIGZ1bmMuYXBwbHkoY29udGV4dCwgZnVuY0FyZ3MpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRoaXMub25FcnJvcihlcnJvcik7XG4gIH1cbn1cblxudmFyIGludm9rZUd1YXJkZWRDYWxsYmFja0ltcGwgPSBpbnZva2VHdWFyZGVkQ2FsbGJhY2tQcm9kO1xuXG57XG4gIC8vIEluIERFViBtb2RlLCB3ZSBzd2FwIG91dCBpbnZva2VHdWFyZGVkQ2FsbGJhY2sgZm9yIGEgc3BlY2lhbCB2ZXJzaW9uXG4gIC8vIHRoYXQgcGxheXMgbW9yZSBuaWNlbHkgd2l0aCB0aGUgYnJvd3NlcidzIERldlRvb2xzLiBUaGUgaWRlYSBpcyB0byBwcmVzZXJ2ZVxuICAvLyBcIlBhdXNlIG9uIGV4Y2VwdGlvbnNcIiBiZWhhdmlvci4gQmVjYXVzZSBSZWFjdCB3cmFwcyBhbGwgdXNlci1wcm92aWRlZFxuICAvLyBmdW5jdGlvbnMgaW4gaW52b2tlR3VhcmRlZENhbGxiYWNrLCBhbmQgdGhlIHByb2R1Y3Rpb24gdmVyc2lvbiBvZlxuICAvLyBpbnZva2VHdWFyZGVkQ2FsbGJhY2sgdXNlcyBhIHRyeS1jYXRjaCwgYWxsIHVzZXIgZXhjZXB0aW9ucyBhcmUgdHJlYXRlZFxuICAvLyBsaWtlIGNhdWdodCBleGNlcHRpb25zLCBhbmQgdGhlIERldlRvb2xzIHdvbid0IHBhdXNlIHVubGVzcyB0aGUgZGV2ZWxvcGVyXG4gIC8vIHRha2VzIHRoZSBleHRyYSBzdGVwIG9mIGVuYWJsaW5nIHBhdXNlIG9uIGNhdWdodCBleGNlcHRpb25zLiBUaGlzIGlzXG4gIC8vIHVuaW50dWl0aXZlLCB0aG91Z2gsIGJlY2F1c2UgZXZlbiB0aG91Z2ggUmVhY3QgaGFzIGNhdWdodCB0aGUgZXJyb3IsIGZyb21cbiAgLy8gdGhlIGRldmVsb3BlcidzIHBlcnNwZWN0aXZlLCB0aGUgZXJyb3IgaXMgdW5jYXVnaHQuXG4gIC8vXG4gIC8vIFRvIHByZXNlcnZlIHRoZSBleHBlY3RlZCBcIlBhdXNlIG9uIGV4Y2VwdGlvbnNcIiBiZWhhdmlvciwgd2UgZG9uJ3QgdXNlIGFcbiAgLy8gdHJ5LWNhdGNoIGluIERFVi4gSW5zdGVhZCwgd2Ugc3luY2hyb25vdXNseSBkaXNwYXRjaCBhIGZha2UgZXZlbnQgdG8gYSBmYWtlXG4gIC8vIERPTSBub2RlLCBhbmQgY2FsbCB0aGUgdXNlci1wcm92aWRlZCBjYWxsYmFjayBmcm9tIGluc2lkZSBhbiBldmVudCBoYW5kbGVyXG4gIC8vIGZvciB0aGF0IGZha2UgZXZlbnQuIElmIHRoZSBjYWxsYmFjayB0aHJvd3MsIHRoZSBlcnJvciBpcyBcImNhcHR1cmVkXCIgdXNpbmdcbiAgLy8gYSBnbG9iYWwgZXZlbnQgaGFuZGxlci4gQnV0IGJlY2F1c2UgdGhlIGVycm9yIGhhcHBlbnMgaW4gYSBkaWZmZXJlbnRcbiAgLy8gZXZlbnQgbG9vcCBjb250ZXh0LCBpdCBkb2VzIG5vdCBpbnRlcnJ1cHQgdGhlIG5vcm1hbCBwcm9ncmFtIGZsb3cuXG4gIC8vIEVmZmVjdGl2ZWx5LCB0aGlzIGdpdmVzIHVzIHRyeS1jYXRjaCBiZWhhdmlvciB3aXRob3V0IGFjdHVhbGx5IHVzaW5nXG4gIC8vIHRyeS1jYXRjaC4gTmVhdCFcbiAgLy8gQ2hlY2sgdGhhdCB0aGUgYnJvd3NlciBzdXBwb3J0cyB0aGUgQVBJcyB3ZSBuZWVkIHRvIGltcGxlbWVudCBvdXIgc3BlY2lhbFxuICAvLyBERVYgdmVyc2lvbiBvZiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZGlzcGF0Y2hFdmVudCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBmYWtlTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3JlYWN0Jyk7XG5cbiAgICBpbnZva2VHdWFyZGVkQ2FsbGJhY2tJbXBsID0gZnVuY3Rpb24gaW52b2tlR3VhcmRlZENhbGxiYWNrRGV2KG5hbWUsIGZ1bmMsIGNvbnRleHQsIGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgICAgIC8vIElmIGRvY3VtZW50IGRvZXNuJ3QgZXhpc3Qgd2Uga25vdyBmb3Igc3VyZSB3ZSB3aWxsIGNyYXNoIGluIHRoaXMgbWV0aG9kXG4gICAgICAvLyB3aGVuIHdlIGNhbGwgZG9jdW1lbnQuY3JlYXRlRXZlbnQoKS4gSG93ZXZlciB0aGlzIGNhbiBjYXVzZSBjb25mdXNpbmdcbiAgICAgIC8vIGVycm9yczogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2NyZWF0ZS1yZWFjdC1hcHAvaXNzdWVzLzM0ODJcbiAgICAgIC8vIFNvIHdlIHByZWVtcHRpdmVseSB0aHJvdyB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UgaW5zdGVhZC5cbiAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnIHx8IGRvY3VtZW50ID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGBkb2N1bWVudGAgZ2xvYmFsIHdhcyBkZWZpbmVkIHdoZW4gUmVhY3Qgd2FzIGluaXRpYWxpemVkLCBidXQgaXMgbm90ICcgKyAnZGVmaW5lZCBhbnltb3JlLiBUaGlzIGNhbiBoYXBwZW4gaW4gYSB0ZXN0IGVudmlyb25tZW50IGlmIGEgY29tcG9uZW50ICcgKyAnc2NoZWR1bGVzIGFuIHVwZGF0ZSBmcm9tIGFuIGFzeW5jaHJvbm91cyBjYWxsYmFjaywgYnV0IHRoZSB0ZXN0IGhhcyBhbHJlYWR5ICcgKyAnZmluaXNoZWQgcnVubmluZy4gVG8gc29sdmUgdGhpcywgeW91IGNhbiBlaXRoZXIgdW5tb3VudCB0aGUgY29tcG9uZW50IGF0ICcgKyAndGhlIGVuZCBvZiB5b3VyIHRlc3QgKGFuZCBlbnN1cmUgdGhhdCBhbnkgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgZ2V0ICcgKyAnY2FuY2VsZWQgaW4gYGNvbXBvbmVudFdpbGxVbm1vdW50YCksIG9yIHlvdSBjYW4gY2hhbmdlIHRoZSB0ZXN0IGl0c2VsZiAnICsgJ3RvIGJlIGFzeW5jaHJvbm91cy4nKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICAgICAgdmFyIGRpZENhbGwgPSBmYWxzZTsgLy8gS2VlcHMgdHJhY2sgb2Ygd2hldGhlciB0aGUgdXNlci1wcm92aWRlZCBjYWxsYmFjayB0aHJldyBhbiBlcnJvci4gV2VcbiAgICAgIC8vIHNldCB0aGlzIHRvIHRydWUgYXQgdGhlIGJlZ2lubmluZywgdGhlbiBzZXQgaXQgdG8gZmFsc2UgcmlnaHQgYWZ0ZXJcbiAgICAgIC8vIGNhbGxpbmcgdGhlIGZ1bmN0aW9uLiBJZiB0aGUgZnVuY3Rpb24gZXJyb3JzLCBgZGlkRXJyb3JgIHdpbGwgbmV2ZXIgYmVcbiAgICAgIC8vIHNldCB0byBmYWxzZS4gVGhpcyBzdHJhdGVneSB3b3JrcyBldmVuIGlmIHRoZSBicm93c2VyIGlzIGZsYWt5IGFuZFxuICAgICAgLy8gZmFpbHMgdG8gY2FsbCBvdXIgZ2xvYmFsIGVycm9yIGhhbmRsZXIsIGJlY2F1c2UgaXQgZG9lc24ndCByZWx5IG9uXG4gICAgICAvLyB0aGUgZXJyb3IgZXZlbnQgYXQgYWxsLlxuXG4gICAgICB2YXIgZGlkRXJyb3IgPSB0cnVlOyAvLyBLZWVwcyB0cmFjayBvZiB0aGUgdmFsdWUgb2Ygd2luZG93LmV2ZW50IHNvIHRoYXQgd2UgY2FuIHJlc2V0IGl0XG4gICAgICAvLyBkdXJpbmcgdGhlIGNhbGxiYWNrIHRvIGxldCB1c2VyIGNvZGUgYWNjZXNzIHdpbmRvdy5ldmVudCBpbiB0aGVcbiAgICAgIC8vIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBpdC5cblxuICAgICAgdmFyIHdpbmRvd0V2ZW50ID0gd2luZG93LmV2ZW50OyAvLyBLZWVwcyB0cmFjayBvZiB0aGUgZGVzY3JpcHRvciBvZiB3aW5kb3cuZXZlbnQgdG8gcmVzdG9yZSBpdCBhZnRlciBldmVudFxuICAgICAgLy8gZGlzcGF0Y2hpbmc6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTM2ODhcblxuICAgICAgdmFyIHdpbmRvd0V2ZW50RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnZXZlbnQnKTtcblxuICAgICAgZnVuY3Rpb24gcmVzdG9yZUFmdGVyRGlzcGF0Y2goKSB7XG4gICAgICAgIC8vIFdlIGltbWVkaWF0ZWx5IHJlbW92ZSB0aGUgY2FsbGJhY2sgZnJvbSBldmVudCBsaXN0ZW5lcnMgc28gdGhhdFxuICAgICAgICAvLyBuZXN0ZWQgYGludm9rZUd1YXJkZWRDYWxsYmFja2AgY2FsbHMgZG8gbm90IGNsYXNoLiBPdGhlcndpc2UsIGFcbiAgICAgICAgLy8gbmVzdGVkIGNhbGwgd291bGQgdHJpZ2dlciB0aGUgZmFrZSBldmVudCBoYW5kbGVycyBvZiBhbnkgY2FsbCBoaWdoZXJcbiAgICAgICAgLy8gaW4gdGhlIHN0YWNrLlxuICAgICAgICBmYWtlTm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2dFR5cGUsIGNhbGxDYWxsYmFjaywgZmFsc2UpOyAvLyBXZSBjaGVjayBmb3Igd2luZG93Lmhhc093blByb3BlcnR5KCdldmVudCcpIHRvIHByZXZlbnQgdGhlXG4gICAgICAgIC8vIHdpbmRvdy5ldmVudCBhc3NpZ25tZW50IGluIGJvdGggSUUgPD0gMTAgYXMgdGhleSB0aHJvdyBhbiBlcnJvclxuICAgICAgICAvLyBcIk1lbWJlciBub3QgZm91bmRcIiBpbiBzdHJpY3QgbW9kZSwgYW5kIGluIEZpcmVmb3ggd2hpY2ggZG9lcyBub3RcbiAgICAgICAgLy8gc3VwcG9ydCB3aW5kb3cuZXZlbnQuXG5cbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuZXZlbnQgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5oYXNPd25Qcm9wZXJ0eSgnZXZlbnQnKSkge1xuICAgICAgICAgIHdpbmRvdy5ldmVudCA9IHdpbmRvd0V2ZW50O1xuICAgICAgICB9XG4gICAgICB9IC8vIENyZWF0ZSBhbiBldmVudCBoYW5kbGVyIGZvciBvdXIgZmFrZSBldmVudC4gV2Ugd2lsbCBzeW5jaHJvbm91c2x5XG4gICAgICAvLyBkaXNwYXRjaCBvdXIgZmFrZSBldmVudCB1c2luZyBgZGlzcGF0Y2hFdmVudGAuIEluc2lkZSB0aGUgaGFuZGxlciwgd2VcbiAgICAgIC8vIGNhbGwgdGhlIHVzZXItcHJvdmlkZWQgY2FsbGJhY2suXG5cblxuICAgICAgdmFyIGZ1bmNBcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAzKTtcblxuICAgICAgZnVuY3Rpb24gY2FsbENhbGxiYWNrKCkge1xuICAgICAgICBkaWRDYWxsID0gdHJ1ZTtcbiAgICAgICAgcmVzdG9yZUFmdGVyRGlzcGF0Y2goKTtcbiAgICAgICAgZnVuYy5hcHBseShjb250ZXh0LCBmdW5jQXJncyk7XG4gICAgICAgIGRpZEVycm9yID0gZmFsc2U7XG4gICAgICB9IC8vIENyZWF0ZSBhIGdsb2JhbCBlcnJvciBldmVudCBoYW5kbGVyLiBXZSB1c2UgdGhpcyB0byBjYXB0dXJlIHRoZSB2YWx1ZVxuICAgICAgLy8gdGhhdCB3YXMgdGhyb3duLiBJdCdzIHBvc3NpYmxlIHRoYXQgdGhpcyBlcnJvciBoYW5kbGVyIHdpbGwgZmlyZSBtb3JlXG4gICAgICAvLyB0aGFuIG9uY2U7IGZvciBleGFtcGxlLCBpZiBub24tUmVhY3QgY29kZSBhbHNvIGNhbGxzIGBkaXNwYXRjaEV2ZW50YFxuICAgICAgLy8gYW5kIGEgaGFuZGxlciBmb3IgdGhhdCBldmVudCB0aHJvd3MuIFdlIHNob3VsZCBiZSByZXNpbGllbnQgdG8gbW9zdCBvZlxuICAgICAgLy8gdGhvc2UgY2FzZXMuIEV2ZW4gaWYgb3VyIGVycm9yIGV2ZW50IGhhbmRsZXIgZmlyZXMgbW9yZSB0aGFuIG9uY2UsIHRoZVxuICAgICAgLy8gbGFzdCBlcnJvciBldmVudCBpcyBhbHdheXMgdXNlZC4gSWYgdGhlIGNhbGxiYWNrIGFjdHVhbGx5IGRvZXMgZXJyb3IsXG4gICAgICAvLyB3ZSBrbm93IHRoYXQgdGhlIGxhc3QgZXJyb3IgZXZlbnQgaXMgdGhlIGNvcnJlY3Qgb25lLCBiZWNhdXNlIGl0J3Mgbm90XG4gICAgICAvLyBwb3NzaWJsZSBmb3IgYW55dGhpbmcgZWxzZSB0byBoYXZlIGhhcHBlbmVkIGluIGJldHdlZW4gb3VyIGNhbGxiYWNrXG4gICAgICAvLyBlcnJvcmluZyBhbmQgdGhlIGNvZGUgdGhhdCBmb2xsb3dzIHRoZSBgZGlzcGF0Y2hFdmVudGAgY2FsbCBiZWxvdy4gSWZcbiAgICAgIC8vIHRoZSBjYWxsYmFjayBkb2Vzbid0IGVycm9yLCBidXQgdGhlIGVycm9yIGV2ZW50IHdhcyBmaXJlZCwgd2Uga25vdyB0b1xuICAgICAgLy8gaWdub3JlIGl0IGJlY2F1c2UgYGRpZEVycm9yYCB3aWxsIGJlIGZhbHNlLCBhcyBkZXNjcmliZWQgYWJvdmUuXG5cblxuICAgICAgdmFyIGVycm9yOyAvLyBVc2UgdGhpcyB0byB0cmFjayB3aGV0aGVyIHRoZSBlcnJvciBldmVudCBpcyBldmVyIGNhbGxlZC5cblxuICAgICAgdmFyIGRpZFNldEVycm9yID0gZmFsc2U7XG4gICAgICB2YXIgaXNDcm9zc09yaWdpbkVycm9yID0gZmFsc2U7XG5cbiAgICAgIGZ1bmN0aW9uIGhhbmRsZVdpbmRvd0Vycm9yKGV2ZW50KSB7XG4gICAgICAgIGVycm9yID0gZXZlbnQuZXJyb3I7XG4gICAgICAgIGRpZFNldEVycm9yID0gdHJ1ZTtcblxuICAgICAgICBpZiAoZXJyb3IgPT09IG51bGwgJiYgZXZlbnQuY29sbm8gPT09IDAgJiYgZXZlbnQubGluZW5vID09PSAwKSB7XG4gICAgICAgICAgaXNDcm9zc09yaWdpbkVycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgLy8gU29tZSBvdGhlciBlcnJvciBoYW5kbGVyIGhhcyBwcmV2ZW50ZWQgZGVmYXVsdC5cbiAgICAgICAgICAvLyBCcm93c2VycyBzaWxlbmNlIHRoZSBlcnJvciByZXBvcnQgaWYgdGhpcyBoYXBwZW5zLlxuICAgICAgICAgIC8vIFdlJ2xsIHJlbWVtYmVyIHRoaXMgdG8gbGF0ZXIgZGVjaWRlIHdoZXRoZXIgdG8gbG9nIGl0IG9yIG5vdC5cbiAgICAgICAgICBpZiAoZXJyb3IgIT0gbnVsbCAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBlcnJvci5fc3VwcHJlc3NMb2dnaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGlubmVyKSB7Ly8gSWdub3JlLlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSAvLyBDcmVhdGUgYSBmYWtlIGV2ZW50IHR5cGUuXG5cblxuICAgICAgdmFyIGV2dFR5cGUgPSBcInJlYWN0LVwiICsgKG5hbWUgPyBuYW1lIDogJ2ludm9rZWd1YXJkZWRjYWxsYmFjaycpOyAvLyBBdHRhY2ggb3VyIGV2ZW50IGhhbmRsZXJzXG5cbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGhhbmRsZVdpbmRvd0Vycm9yKTtcbiAgICAgIGZha2VOb2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZ0VHlwZSwgY2FsbENhbGxiYWNrLCBmYWxzZSk7IC8vIFN5bmNocm9ub3VzbHkgZGlzcGF0Y2ggb3VyIGZha2UgZXZlbnQuIElmIHRoZSB1c2VyLXByb3ZpZGVkIGZ1bmN0aW9uXG4gICAgICAvLyBlcnJvcnMsIGl0IHdpbGwgdHJpZ2dlciBvdXIgZ2xvYmFsIGVycm9yIGhhbmRsZXIuXG5cbiAgICAgIGV2dC5pbml0RXZlbnQoZXZ0VHlwZSwgZmFsc2UsIGZhbHNlKTtcbiAgICAgIGZha2VOb2RlLmRpc3BhdGNoRXZlbnQoZXZ0KTtcblxuICAgICAgaWYgKHdpbmRvd0V2ZW50RGVzY3JpcHRvcikge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCAnZXZlbnQnLCB3aW5kb3dFdmVudERlc2NyaXB0b3IpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlkQ2FsbCAmJiBkaWRFcnJvcikge1xuICAgICAgICBpZiAoIWRpZFNldEVycm9yKSB7XG4gICAgICAgICAgLy8gVGhlIGNhbGxiYWNrIGVycm9yZWQsIGJ1dCB0aGUgZXJyb3IgZXZlbnQgbmV2ZXIgZmlyZWQuXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvcignQW4gZXJyb3Igd2FzIHRocm93biBpbnNpZGUgb25lIG9mIHlvdXIgY29tcG9uZW50cywgYnV0IFJlYWN0ICcgKyBcImRvZXNuJ3Qga25vdyB3aGF0IGl0IHdhcy4gVGhpcyBpcyBsaWtlbHkgZHVlIHRvIGJyb3dzZXIgXCIgKyAnZmxha2luZXNzLiBSZWFjdCBkb2VzIGl0cyBiZXN0IHRvIHByZXNlcnZlIHRoZSBcIlBhdXNlIG9uICcgKyAnZXhjZXB0aW9uc1wiIGJlaGF2aW9yIG9mIHRoZSBEZXZUb29scywgd2hpY2ggcmVxdWlyZXMgc29tZSAnICsgXCJERVYtbW9kZSBvbmx5IHRyaWNrcy4gSXQncyBwb3NzaWJsZSB0aGF0IHRoZXNlIGRvbid0IHdvcmsgaW4gXCIgKyAneW91ciBicm93c2VyLiBUcnkgdHJpZ2dlcmluZyB0aGUgZXJyb3IgaW4gcHJvZHVjdGlvbiBtb2RlLCAnICsgJ29yIHN3aXRjaGluZyB0byBhIG1vZGVybiBicm93c2VyLiBJZiB5b3Ugc3VzcGVjdCB0aGF0IHRoaXMgaXMgJyArICdhY3R1YWxseSBhbiBpc3N1ZSB3aXRoIFJlYWN0LCBwbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0Nyb3NzT3JpZ2luRXJyb3IpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKFwiQSBjcm9zcy1vcmlnaW4gZXJyb3Igd2FzIHRocm93bi4gUmVhY3QgZG9lc24ndCBoYXZlIGFjY2VzcyB0byBcIiArICd0aGUgYWN0dWFsIGVycm9yIG9iamVjdCBpbiBkZXZlbG9wbWVudC4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2Nyb3Nzb3JpZ2luLWVycm9yIGZvciBtb3JlIGluZm9ybWF0aW9uLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vbkVycm9yKGVycm9yKTtcbiAgICAgIH0gLy8gUmVtb3ZlIG91ciBldmVudCBsaXN0ZW5lcnNcblxuXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBoYW5kbGVXaW5kb3dFcnJvcik7XG5cbiAgICAgIGlmICghZGlkQ2FsbCkge1xuICAgICAgICAvLyBTb21ldGhpbmcgd2VudCByZWFsbHkgd3JvbmcsIGFuZCBvdXIgZXZlbnQgd2FzIG5vdCBkaXNwYXRjaGVkLlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE2NzM0XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTY1ODVcbiAgICAgICAgLy8gRmFsbCBiYWNrIHRvIHRoZSBwcm9kdWN0aW9uIGltcGxlbWVudGF0aW9uLlxuICAgICAgICByZXN0b3JlQWZ0ZXJEaXNwYXRjaCgpO1xuICAgICAgICByZXR1cm4gaW52b2tlR3VhcmRlZENhbGxiYWNrUHJvZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbn1cblxudmFyIGludm9rZUd1YXJkZWRDYWxsYmFja0ltcGwkMSA9IGludm9rZUd1YXJkZWRDYWxsYmFja0ltcGw7XG5cbnZhciBoYXNFcnJvciA9IGZhbHNlO1xudmFyIGNhdWdodEVycm9yID0gbnVsbDsgLy8gVXNlZCBieSBldmVudCBzeXN0ZW0gdG8gY2FwdHVyZS9yZXRocm93IHRoZSBmaXJzdCBlcnJvci5cblxudmFyIGhhc1JldGhyb3dFcnJvciA9IGZhbHNlO1xudmFyIHJldGhyb3dFcnJvciA9IG51bGw7XG52YXIgcmVwb3J0ZXIgPSB7XG4gIG9uRXJyb3I6IGZ1bmN0aW9uIChlcnJvcikge1xuICAgIGhhc0Vycm9yID0gdHJ1ZTtcbiAgICBjYXVnaHRFcnJvciA9IGVycm9yO1xuICB9XG59O1xuLyoqXG4gKiBDYWxsIGEgZnVuY3Rpb24gd2hpbGUgZ3VhcmRpbmcgYWdhaW5zdCBlcnJvcnMgdGhhdCBoYXBwZW5zIHdpdGhpbiBpdC5cbiAqIFJldHVybnMgYW4gZXJyb3IgaWYgaXQgdGhyb3dzLCBvdGhlcndpc2UgbnVsbC5cbiAqXG4gKiBJbiBwcm9kdWN0aW9uLCB0aGlzIGlzIGltcGxlbWVudGVkIHVzaW5nIGEgdHJ5LWNhdGNoLiBUaGUgcmVhc29uIHdlIGRvbid0XG4gKiB1c2UgYSB0cnktY2F0Y2ggZGlyZWN0bHkgaXMgc28gdGhhdCB3ZSBjYW4gc3dhcCBvdXQgYSBkaWZmZXJlbnRcbiAqIGltcGxlbWVudGF0aW9uIGluIERFViBtb2RlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIG9mIHRoZSBndWFyZCB0byB1c2UgZm9yIGxvZ2dpbmcgb3IgZGVidWdnaW5nXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnZva2VcbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBUaGUgY29udGV4dCB0byB1c2Ugd2hlbiBjYWxsaW5nIHRoZSBmdW5jdGlvblxuICogQHBhcmFtIHsuLi4qfSBhcmdzIEFyZ3VtZW50cyBmb3IgZnVuY3Rpb25cbiAqL1xuXG5mdW5jdGlvbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2sobmFtZSwgZnVuYywgY29udGV4dCwgYSwgYiwgYywgZCwgZSwgZikge1xuICBoYXNFcnJvciA9IGZhbHNlO1xuICBjYXVnaHRFcnJvciA9IG51bGw7XG4gIGludm9rZUd1YXJkZWRDYWxsYmFja0ltcGwkMS5hcHBseShyZXBvcnRlciwgYXJndW1lbnRzKTtcbn1cbi8qKlxuICogU2FtZSBhcyBpbnZva2VHdWFyZGVkQ2FsbGJhY2ssIGJ1dCBpbnN0ZWFkIG9mIHJldHVybmluZyBhbiBlcnJvciwgaXQgc3RvcmVzXG4gKiBpdCBpbiBhIGdsb2JhbCBzbyBpdCBjYW4gYmUgcmV0aHJvd24gYnkgYHJldGhyb3dDYXVnaHRFcnJvcmAgbGF0ZXIuXG4gKiBUT0RPOiBTZWUgaWYgY2F1Z2h0RXJyb3IgYW5kIHJldGhyb3dFcnJvciBjYW4gYmUgdW5pZmllZC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBvZiB0aGUgZ3VhcmQgdG8gdXNlIGZvciBsb2dnaW5nIG9yIGRlYnVnZ2luZ1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaW52b2tlXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgVGhlIGNvbnRleHQgdG8gdXNlIHdoZW4gY2FsbGluZyB0aGUgZnVuY3Rpb25cbiAqIEBwYXJhbSB7Li4uKn0gYXJncyBBcmd1bWVudHMgZm9yIGZ1bmN0aW9uXG4gKi9cblxuZnVuY3Rpb24gaW52b2tlR3VhcmRlZENhbGxiYWNrQW5kQ2F0Y2hGaXJzdEVycm9yKG5hbWUsIGZ1bmMsIGNvbnRleHQsIGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgaW52b2tlR3VhcmRlZENhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgaWYgKGhhc0Vycm9yKSB7XG4gICAgdmFyIGVycm9yID0gY2xlYXJDYXVnaHRFcnJvcigpO1xuXG4gICAgaWYgKCFoYXNSZXRocm93RXJyb3IpIHtcbiAgICAgIGhhc1JldGhyb3dFcnJvciA9IHRydWU7XG4gICAgICByZXRocm93RXJyb3IgPSBlcnJvcjtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogRHVyaW5nIGV4ZWN1dGlvbiBvZiBndWFyZGVkIGZ1bmN0aW9ucyB3ZSB3aWxsIGNhcHR1cmUgdGhlIGZpcnN0IGVycm9yIHdoaWNoXG4gKiB3ZSB3aWxsIHJldGhyb3cgdG8gYmUgaGFuZGxlZCBieSB0aGUgdG9wIGxldmVsIGVycm9yIGhhbmRsZXIuXG4gKi9cblxuZnVuY3Rpb24gcmV0aHJvd0NhdWdodEVycm9yKCkge1xuICBpZiAoaGFzUmV0aHJvd0Vycm9yKSB7XG4gICAgdmFyIGVycm9yID0gcmV0aHJvd0Vycm9yO1xuICAgIGhhc1JldGhyb3dFcnJvciA9IGZhbHNlO1xuICAgIHJldGhyb3dFcnJvciA9IG51bGw7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cbmZ1bmN0aW9uIGhhc0NhdWdodEVycm9yKCkge1xuICByZXR1cm4gaGFzRXJyb3I7XG59XG5mdW5jdGlvbiBjbGVhckNhdWdodEVycm9yKCkge1xuICBpZiAoaGFzRXJyb3IpIHtcbiAgICB2YXIgZXJyb3IgPSBjYXVnaHRFcnJvcjtcbiAgICBoYXNFcnJvciA9IGZhbHNlO1xuICAgIGNhdWdodEVycm9yID0gbnVsbDtcbiAgICByZXR1cm4gZXJyb3I7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhckNhdWdodEVycm9yIHdhcyBjYWxsZWQgYnV0IG5vIGVycm9yIHdhcyBjYXB0dXJlZC4gVGhpcyBlcnJvciAnICsgJ2lzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG59XG5cbi8qKlxuICogYFJlYWN0SW5zdGFuY2VNYXBgIG1haW50YWlucyBhIG1hcHBpbmcgZnJvbSBhIHB1YmxpYyBmYWNpbmcgc3RhdGVmdWxcbiAqIGluc3RhbmNlIChrZXkpIGFuZCB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gKHZhbHVlKS4gVGhpcyBhbGxvd3MgcHVibGljXG4gKiBtZXRob2RzIHRvIGFjY2VwdCB0aGUgdXNlciBmYWNpbmcgaW5zdGFuY2UgYXMgYW4gYXJndW1lbnQgYW5kIG1hcCB0aGVtIGJhY2tcbiAqIHRvIGludGVybmFsIG1ldGhvZHMuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgbW9kdWxlIGlzIGN1cnJlbnRseSBzaGFyZWQgYW5kIGFzc3VtZWQgdG8gYmUgc3RhdGVsZXNzLlxuICogSWYgdGhpcyBiZWNvbWVzIGFuIGFjdHVhbCBNYXAsIHRoYXQgd2lsbCBicmVhay5cbiAqL1xuZnVuY3Rpb24gZ2V0KGtleSkge1xuICByZXR1cm4ga2V5Ll9yZWFjdEludGVybmFscztcbn1cbmZ1bmN0aW9uIGhhcyhrZXkpIHtcbiAgcmV0dXJuIGtleS5fcmVhY3RJbnRlcm5hbHMgIT09IHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gIGtleS5fcmVhY3RJbnRlcm5hbHMgPSB2YWx1ZTtcbn1cblxuLy8gRG9uJ3QgY2hhbmdlIHRoZXNlIHR3byB2YWx1ZXMuIFRoZXkncmUgdXNlZCBieSBSZWFjdCBEZXYgVG9vbHMuXG52YXIgTm9GbGFncyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAqL1xuMDtcbnZhciBQZXJmb3JtZWRXb3JrID1cbi8qICAgICAgICAgICAgICAgICovXG4xOyAvLyBZb3UgY2FuIGNoYW5nZSB0aGUgcmVzdCAoYW5kIGFkZCBtb3JlKS5cblxudmFyIFBsYWNlbWVudCA9XG4vKiAgICAgICAgICAgICAgICAgICAgKi9cbjI7XG52YXIgVXBkYXRlID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuNDtcbnZhciBDaGlsZERlbGV0aW9uID1cbi8qICAgICAgICAgICAgICAgICovXG4xNjtcbnZhciBDb250ZW50UmVzZXQgPVxuLyogICAgICAgICAgICAgICAgICovXG4zMjtcbnZhciBDYWxsYmFjayA9XG4vKiAgICAgICAgICAgICAgICAgICAgICovXG42NDtcbnZhciBEaWRDYXB0dXJlID1cbi8qICAgICAgICAgICAgICAgICAgICovXG4xMjg7XG52YXIgRm9yY2VDbGllbnRSZW5kZXIgPVxuLyogICAgICAgICAgICAqL1xuMjU2O1xudmFyIFJlZiA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjUxMjtcbnZhciBTbmFwc2hvdCA9XG4vKiAgICAgICAgICAgICAgICAgICAgICovXG4xMDI0O1xudmFyIFBhc3NpdmUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbjIwNDg7XG52YXIgSHlkcmF0aW5nID1cbi8qICAgICAgICAgICAgICAgICAgICAqL1xuNDA5NjtcbnZhciBWaXNpYmlsaXR5ID1cbi8qICAgICAgICAgICAgICAgICAgICovXG44MTkyO1xudmFyIFN0b3JlQ29uc2lzdGVuY3kgPVxuLyogICAgICAgICAgICAgKi9cbjE2Mzg0O1xudmFyIExpZmVjeWNsZUVmZmVjdE1hc2sgPSBQYXNzaXZlIHwgVXBkYXRlIHwgQ2FsbGJhY2sgfCBSZWYgfCBTbmFwc2hvdCB8IFN0b3JlQ29uc2lzdGVuY3k7IC8vIFVuaW9uIG9mIGFsbCBjb21taXQgZmxhZ3MgKGZsYWdzIHdpdGggdGhlIGxpZmV0aW1lIG9mIGEgcGFydGljdWxhciBjb21taXQpXG5cbnZhciBIb3N0RWZmZWN0TWFzayA9XG4vKiAgICAgICAgICAgICAgICovXG4zMjc2NzsgLy8gVGhlc2UgYXJlIG5vdCByZWFsbHkgc2lkZSBlZmZlY3RzLCBidXQgd2Ugc3RpbGwgcmV1c2UgdGhpcyBmaWVsZC5cblxudmFyIEluY29tcGxldGUgPVxuLyogICAgICAgICAgICAgICAgICAgKi9cbjMyNzY4O1xudmFyIFNob3VsZENhcHR1cmUgPVxuLyogICAgICAgICAgICAgICAgKi9cbjY1NTM2O1xudmFyIEZvcmNlVXBkYXRlRm9yTGVnYWN5U3VzcGVuc2UgPVxuLyogKi9cbjEzMTA3MjtcbnZhciBGb3JrZWQgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG4xMDQ4NTc2OyAvLyBTdGF0aWMgdGFncyBkZXNjcmliZSBhc3BlY3RzIG9mIGEgZmliZXIgdGhhdCBhcmUgbm90IHNwZWNpZmljIHRvIGEgcmVuZGVyLFxuLy8gZS5nLiBhIGZpYmVyIHVzZXMgYSBwYXNzaXZlIGVmZmVjdCAoZXZlbiBpZiB0aGVyZSBhcmUgbm8gdXBkYXRlcyBvbiB0aGlzIHBhcnRpY3VsYXIgcmVuZGVyKS5cbi8vIFRoaXMgZW5hYmxlcyB1cyB0byBkZWZlciBtb3JlIHdvcmsgaW4gdGhlIHVubW91bnQgY2FzZSxcbi8vIHNpbmNlIHdlIGNhbiBkZWZlciB0cmF2ZXJzaW5nIHRoZSB0cmVlIGR1cmluZyBsYXlvdXQgdG8gbG9vayBmb3IgUGFzc2l2ZSBlZmZlY3RzLFxuLy8gYW5kIGluc3RlYWQgcmVseSBvbiB0aGUgc3RhdGljIGZsYWcgYXMgYSBzaWduYWwgdGhhdCB0aGVyZSBtYXkgYmUgY2xlYW51cCB3b3JrLlxuXG52YXIgUmVmU3RhdGljID1cbi8qICAgICAgICAgICAgICAgICAgICAqL1xuMjA5NzE1MjtcbnZhciBMYXlvdXRTdGF0aWMgPVxuLyogICAgICAgICAgICAgICAgICovXG40MTk0MzA0O1xudmFyIFBhc3NpdmVTdGF0aWMgPVxuLyogICAgICAgICAgICAgICAgKi9cbjgzODg2MDg7IC8vIFRoZXNlIGZsYWdzIGFsbG93IHVzIHRvIHRyYXZlcnNlIHRvIGZpYmVycyB0aGF0IGhhdmUgZWZmZWN0cyBvbiBtb3VudFxuLy8gd2l0aG91dCB0cmF2ZXJzaW5nIHRoZSBlbnRpcmUgdHJlZSBhZnRlciBldmVyeSBjb21taXQgZm9yXG4vLyBkb3VibGUgaW52b2tpbmdcblxudmFyIE1vdW50TGF5b3V0RGV2ID1cbi8qICAgICAgICAgICAgICAgKi9cbjE2Nzc3MjE2O1xudmFyIE1vdW50UGFzc2l2ZURldiA9XG4vKiAgICAgICAgICAgICAgKi9cbjMzNTU0NDMyOyAvLyBHcm91cHMgb2YgZmxhZ3MgdGhhdCBhcmUgdXNlZCBpbiB0aGUgY29tbWl0IHBoYXNlIHRvIHNraXAgb3ZlciB0cmVlcyB0aGF0XG4vLyBkb24ndCBjb250YWluIGVmZmVjdHMsIGJ5IGNoZWNraW5nIHN1YnRyZWVGbGFncy5cblxudmFyIEJlZm9yZU11dGF0aW9uTWFzayA9IC8vIFRPRE86IFJlbW92ZSBVcGRhdGUgZmxhZyBmcm9tIGJlZm9yZSBtdXRhdGlvbiBwaGFzZSBieSByZS1sYW5kaW5nIFZpc2liaWxpdHlcbi8vIGZsYWcgbG9naWMgKHNlZSAjMjAwNDMpXG5VcGRhdGUgfCBTbmFwc2hvdCB8ICggMCk7XG52YXIgTXV0YXRpb25NYXNrID0gUGxhY2VtZW50IHwgVXBkYXRlIHwgQ2hpbGREZWxldGlvbiB8IENvbnRlbnRSZXNldCB8IFJlZiB8IEh5ZHJhdGluZyB8IFZpc2liaWxpdHk7XG52YXIgTGF5b3V0TWFzayA9IFVwZGF0ZSB8IENhbGxiYWNrIHwgUmVmIHwgVmlzaWJpbGl0eTsgLy8gVE9ETzogU3BsaXQgaW50byBQYXNzaXZlTW91bnRNYXNrIGFuZCBQYXNzaXZlVW5tb3VudE1hc2tcblxudmFyIFBhc3NpdmVNYXNrID0gUGFzc2l2ZSB8IENoaWxkRGVsZXRpb247IC8vIFVuaW9uIG9mIHRhZ3MgdGhhdCBkb24ndCBnZXQgcmVzZXQgb24gY2xvbmVzLlxuLy8gVGhpcyBhbGxvd3MgY2VydGFpbiBjb25jZXB0cyB0byBwZXJzaXN0IHdpdGhvdXQgcmVjYWxjdWxhdGluZyB0aGVtLFxuLy8gZS5nLiB3aGV0aGVyIGEgc3VidHJlZSBjb250YWlucyBwYXNzaXZlIGVmZmVjdHMgb3IgcG9ydGFscy5cblxudmFyIFN0YXRpY01hc2sgPSBMYXlvdXRTdGF0aWMgfCBQYXNzaXZlU3RhdGljIHwgUmVmU3RhdGljO1xuXG52YXIgUmVhY3RDdXJyZW50T3duZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRPd25lcjtcbmZ1bmN0aW9uIGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpIHtcbiAgdmFyIG5vZGUgPSBmaWJlcjtcbiAgdmFyIG5lYXJlc3RNb3VudGVkID0gZmliZXI7XG5cbiAgaWYgKCFmaWJlci5hbHRlcm5hdGUpIHtcbiAgICAvLyBJZiB0aGVyZSBpcyBubyBhbHRlcm5hdGUsIHRoaXMgbWlnaHQgYmUgYSBuZXcgdHJlZSB0aGF0IGlzbid0IGluc2VydGVkXG4gICAgLy8geWV0LiBJZiBpdCBpcywgdGhlbiBpdCB3aWxsIGhhdmUgYSBwZW5kaW5nIGluc2VydGlvbiBlZmZlY3Qgb24gaXQuXG4gICAgdmFyIG5leHROb2RlID0gbm9kZTtcblxuICAgIGRvIHtcbiAgICAgIG5vZGUgPSBuZXh0Tm9kZTtcblxuICAgICAgaWYgKChub2RlLmZsYWdzICYgKFBsYWNlbWVudCB8IEh5ZHJhdGluZykpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYW4gaW5zZXJ0aW9uIG9yIGluLXByb2dyZXNzIGh5ZHJhdGlvbi4gVGhlIG5lYXJlc3QgcG9zc2libGVcbiAgICAgICAgLy8gbW91bnRlZCBmaWJlciBpcyB0aGUgcGFyZW50IGJ1dCB3ZSBuZWVkIHRvIGNvbnRpbnVlIHRvIGZpZ3VyZSBvdXRcbiAgICAgICAgLy8gaWYgdGhhdCBvbmUgaXMgc3RpbGwgbW91bnRlZC5cbiAgICAgICAgbmVhcmVzdE1vdW50ZWQgPSBub2RlLnJldHVybjtcbiAgICAgIH1cblxuICAgICAgbmV4dE5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9IHdoaWxlIChuZXh0Tm9kZSk7XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKG5vZGUucmV0dXJuKSB7XG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKG5vZGUudGFnID09PSBIb3N0Um9vdCkge1xuICAgIC8vIFRPRE86IENoZWNrIGlmIHRoaXMgd2FzIGEgbmVzdGVkIEhvc3RSb290IHdoZW4gdXNlZCB3aXRoXG4gICAgLy8gcmVuZGVyQ29udGFpbmVySW50b1N1YnRyZWUuXG4gICAgcmV0dXJuIG5lYXJlc3RNb3VudGVkO1xuICB9IC8vIElmIHdlIGRpZG4ndCBoaXQgdGhlIHJvb3QsIHRoYXQgbWVhbnMgdGhhdCB3ZSdyZSBpbiBhbiBkaXNjb25uZWN0ZWQgdHJlZVxuICAvLyB0aGF0IGhhcyBiZWVuIHVubW91bnRlZC5cblxuXG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZ2V0U3VzcGVuc2VJbnN0YW5jZUZyb21GaWJlcihmaWJlcikge1xuICBpZiAoZmliZXIudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIHZhciBzdXNwZW5zZVN0YXRlID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcblxuICAgIGlmIChzdXNwZW5zZVN0YXRlID09PSBudWxsKSB7XG4gICAgICB2YXIgY3VycmVudCA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgc3VzcGVuc2VTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGdldENvbnRhaW5lckZyb21GaWJlcihmaWJlcikge1xuICByZXR1cm4gZmliZXIudGFnID09PSBIb3N0Um9vdCA/IGZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvIDogbnVsbDtcbn1cbmZ1bmN0aW9uIGlzRmliZXJNb3VudGVkKGZpYmVyKSB7XG4gIHJldHVybiBnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKSA9PT0gZmliZXI7XG59XG5mdW5jdGlvbiBpc01vdW50ZWQoY29tcG9uZW50KSB7XG4gIHtcbiAgICB2YXIgb3duZXIgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50O1xuXG4gICAgaWYgKG93bmVyICE9PSBudWxsICYmIG93bmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgIHZhciBvd25lckZpYmVyID0gb3duZXI7XG4gICAgICB2YXIgaW5zdGFuY2UgPSBvd25lckZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgaWYgKCFpbnN0YW5jZS5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIpIHtcbiAgICAgICAgZXJyb3IoJyVzIGlzIGFjY2Vzc2luZyBpc01vdW50ZWQgaW5zaWRlIGl0cyByZW5kZXIoKSBmdW5jdGlvbi4gJyArICdyZW5kZXIoKSBzaG91bGQgYmUgYSBwdXJlIGZ1bmN0aW9uIG9mIHByb3BzIGFuZCBzdGF0ZS4gSXQgc2hvdWxkICcgKyAnbmV2ZXIgYWNjZXNzIHNvbWV0aGluZyB0aGF0IHJlcXVpcmVzIHN0YWxlIGRhdGEgZnJvbSB0aGUgcHJldmlvdXMgJyArICdyZW5kZXIsIHN1Y2ggYXMgcmVmcy4gTW92ZSB0aGlzIGxvZ2ljIHRvIGNvbXBvbmVudERpZE1vdW50IGFuZCAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZSBpbnN0ZWFkLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIob3duZXJGaWJlcikgfHwgJ0EgY29tcG9uZW50Jyk7XG4gICAgICB9XG5cbiAgICAgIGluc3RhbmNlLl93YXJuZWRBYm91dFJlZnNJblJlbmRlciA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGZpYmVyID0gZ2V0KGNvbXBvbmVudCk7XG5cbiAgaWYgKCFmaWJlcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKSA9PT0gZmliZXI7XG59XG5cbmZ1bmN0aW9uIGFzc2VydElzTW91bnRlZChmaWJlcikge1xuICBpZiAoZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcihmaWJlcikgIT09IGZpYmVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEN1cnJlbnRGaWJlclVzaW5nU2xvd1BhdGgoZmliZXIpIHtcbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoIWFsdGVybmF0ZSkge1xuICAgIC8vIElmIHRoZXJlIGlzIG5vIGFsdGVybmF0ZSwgdGhlbiB3ZSBvbmx5IG5lZWQgdG8gY2hlY2sgaWYgaXQgaXMgbW91bnRlZC5cbiAgICB2YXIgbmVhcmVzdE1vdW50ZWQgPSBnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKTtcblxuICAgIGlmIChuZWFyZXN0TW91bnRlZCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuJyk7XG4gICAgfVxuXG4gICAgaWYgKG5lYXJlc3RNb3VudGVkICE9PSBmaWJlcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpYmVyO1xuICB9IC8vIElmIHdlIGhhdmUgdHdvIHBvc3NpYmxlIGJyYW5jaGVzLCB3ZSdsbCB3YWxrIGJhY2t3YXJkcyB1cCB0byB0aGUgcm9vdFxuICAvLyB0byBzZWUgd2hhdCBwYXRoIHRoZSByb290IHBvaW50cyB0by4gT24gdGhlIHdheSB3ZSBtYXkgaGl0IG9uZSBvZiB0aGVcbiAgLy8gc3BlY2lhbCBjYXNlcyBhbmQgd2UnbGwgZGVhbCB3aXRoIHRoZW0uXG5cblxuICB2YXIgYSA9IGZpYmVyO1xuICB2YXIgYiA9IGFsdGVybmF0ZTtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIHZhciBwYXJlbnRBID0gYS5yZXR1cm47XG5cbiAgICBpZiAocGFyZW50QSA9PT0gbnVsbCkge1xuICAgICAgLy8gV2UncmUgYXQgdGhlIHJvb3QuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgcGFyZW50QiA9IHBhcmVudEEuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKHBhcmVudEIgPT09IG51bGwpIHtcbiAgICAgIC8vIFRoZXJlIGlzIG5vIGFsdGVybmF0ZS4gVGhpcyBpcyBhbiB1bnVzdWFsIGNhc2UuIEN1cnJlbnRseSwgaXQgb25seVxuICAgICAgLy8gaGFwcGVucyB3aGVuIGEgU3VzcGVuc2UgY29tcG9uZW50IGlzIGhpZGRlbi4gQW4gZXh0cmEgZnJhZ21lbnQgZmliZXJcbiAgICAgIC8vIGlzIGluc2VydGVkIGluIGJldHdlZW4gdGhlIFN1c3BlbnNlIGZpYmVyIGFuZCBpdHMgY2hpbGRyZW4uIFNraXBcbiAgICAgIC8vIG92ZXIgdGhpcyBleHRyYSBmcmFnbWVudCBmaWJlciBhbmQgcHJvY2VlZCB0byB0aGUgbmV4dCBwYXJlbnQuXG4gICAgICB2YXIgbmV4dFBhcmVudCA9IHBhcmVudEEucmV0dXJuO1xuXG4gICAgICBpZiAobmV4dFBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgICBhID0gYiA9IG5leHRQYXJlbnQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSAvLyBJZiB0aGVyZSdzIG5vIHBhcmVudCwgd2UncmUgYXQgdGhlIHJvb3QuXG5cblxuICAgICAgYnJlYWs7XG4gICAgfSAvLyBJZiBib3RoIGNvcGllcyBvZiB0aGUgcGFyZW50IGZpYmVyIHBvaW50IHRvIHRoZSBzYW1lIGNoaWxkLCB3ZSBjYW5cbiAgICAvLyBhc3N1bWUgdGhhdCB0aGUgY2hpbGQgaXMgY3VycmVudC4gVGhpcyBoYXBwZW5zIHdoZW4gd2UgYmFpbG91dCBvbiBsb3dcbiAgICAvLyBwcmlvcml0eTogdGhlIGJhaWxlZCBvdXQgZmliZXIncyBjaGlsZCByZXVzZXMgdGhlIGN1cnJlbnQgY2hpbGQuXG5cblxuICAgIGlmIChwYXJlbnRBLmNoaWxkID09PSBwYXJlbnRCLmNoaWxkKSB7XG4gICAgICB2YXIgY2hpbGQgPSBwYXJlbnRBLmNoaWxkO1xuXG4gICAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgICAgaWYgKGNoaWxkID09PSBhKSB7XG4gICAgICAgICAgLy8gV2UndmUgZGV0ZXJtaW5lZCB0aGF0IEEgaXMgdGhlIGN1cnJlbnQgYnJhbmNoLlxuICAgICAgICAgIGFzc2VydElzTW91bnRlZChwYXJlbnRBKTtcbiAgICAgICAgICByZXR1cm4gZmliZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hpbGQgPT09IGIpIHtcbiAgICAgICAgICAvLyBXZSd2ZSBkZXRlcm1pbmVkIHRoYXQgQiBpcyB0aGUgY3VycmVudCBicmFuY2guXG4gICAgICAgICAgYXNzZXJ0SXNNb3VudGVkKHBhcmVudEEpO1xuICAgICAgICAgIHJldHVybiBhbHRlcm5hdGU7XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgICB9IC8vIFdlIHNob3VsZCBuZXZlciBoYXZlIGFuIGFsdGVybmF0ZSBmb3IgYW55IG1vdW50aW5nIG5vZGUuIFNvIHRoZSBvbmx5XG4gICAgICAvLyB3YXkgdGhpcyBjb3VsZCBwb3NzaWJseSBoYXBwZW4gaXMgaWYgdGhpcyB3YXMgdW5tb3VudGVkLCBpZiBhdCBhbGwuXG5cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuJyk7XG4gICAgfVxuXG4gICAgaWYgKGEucmV0dXJuICE9PSBiLnJldHVybikge1xuICAgICAgLy8gVGhlIHJldHVybiBwb2ludGVyIG9mIEEgYW5kIHRoZSByZXR1cm4gcG9pbnRlciBvZiBCIHBvaW50IHRvIGRpZmZlcmVudFxuICAgICAgLy8gZmliZXJzLiBXZSBhc3N1bWUgdGhhdCByZXR1cm4gcG9pbnRlcnMgbmV2ZXIgY3Jpc3MtY3Jvc3MsIHNvIEEgbXVzdFxuICAgICAgLy8gYmVsb25nIHRvIHRoZSBjaGlsZCBzZXQgb2YgQS5yZXR1cm4sIGFuZCBCIG11c3QgYmVsb25nIHRvIHRoZSBjaGlsZFxuICAgICAgLy8gc2V0IG9mIEIucmV0dXJuLlxuICAgICAgYSA9IHBhcmVudEE7XG4gICAgICBiID0gcGFyZW50QjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIHJldHVybiBwb2ludGVycyBwb2ludCB0byB0aGUgc2FtZSBmaWJlci4gV2UnbGwgaGF2ZSB0byB1c2UgdGhlXG4gICAgICAvLyBkZWZhdWx0LCBzbG93IHBhdGg6IHNjYW4gdGhlIGNoaWxkIHNldHMgb2YgZWFjaCBwYXJlbnQgYWx0ZXJuYXRlIHRvIHNlZVxuICAgICAgLy8gd2hpY2ggY2hpbGQgYmVsb25ncyB0byB3aGljaCBzZXQuXG4gICAgICAvL1xuICAgICAgLy8gU2VhcmNoIHBhcmVudCBBJ3MgY2hpbGQgc2V0XG4gICAgICB2YXIgZGlkRmluZENoaWxkID0gZmFsc2U7XG4gICAgICB2YXIgX2NoaWxkID0gcGFyZW50QS5jaGlsZDtcblxuICAgICAgd2hpbGUgKF9jaGlsZCkge1xuICAgICAgICBpZiAoX2NoaWxkID09PSBhKSB7XG4gICAgICAgICAgZGlkRmluZENoaWxkID0gdHJ1ZTtcbiAgICAgICAgICBhID0gcGFyZW50QTtcbiAgICAgICAgICBiID0gcGFyZW50QjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChfY2hpbGQgPT09IGIpIHtcbiAgICAgICAgICBkaWRGaW5kQ2hpbGQgPSB0cnVlO1xuICAgICAgICAgIGIgPSBwYXJlbnRBO1xuICAgICAgICAgIGEgPSBwYXJlbnRCO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgX2NoaWxkID0gX2NoaWxkLnNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIGlmICghZGlkRmluZENoaWxkKSB7XG4gICAgICAgIC8vIFNlYXJjaCBwYXJlbnQgQidzIGNoaWxkIHNldFxuICAgICAgICBfY2hpbGQgPSBwYXJlbnRCLmNoaWxkO1xuXG4gICAgICAgIHdoaWxlIChfY2hpbGQpIHtcbiAgICAgICAgICBpZiAoX2NoaWxkID09PSBhKSB7XG4gICAgICAgICAgICBkaWRGaW5kQ2hpbGQgPSB0cnVlO1xuICAgICAgICAgICAgYSA9IHBhcmVudEI7XG4gICAgICAgICAgICBiID0gcGFyZW50QTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChfY2hpbGQgPT09IGIpIHtcbiAgICAgICAgICAgIGRpZEZpbmRDaGlsZCA9IHRydWU7XG4gICAgICAgICAgICBiID0gcGFyZW50QjtcbiAgICAgICAgICAgIGEgPSBwYXJlbnRBO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX2NoaWxkID0gX2NoaWxkLnNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWRpZEZpbmRDaGlsZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2hpbGQgd2FzIG5vdCBmb3VuZCBpbiBlaXRoZXIgcGFyZW50IHNldC4gVGhpcyBpbmRpY2F0ZXMgYSBidWcgJyArICdpbiBSZWFjdCByZWxhdGVkIHRvIHRoZSByZXR1cm4gcG9pbnRlci4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYS5hbHRlcm5hdGUgIT09IGIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlJldHVybiBmaWJlcnMgc2hvdWxkIGFsd2F5cyBiZSBlYWNoIG90aGVycycgYWx0ZXJuYXRlcy4gXCIgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH0gLy8gSWYgdGhlIHJvb3QgaXMgbm90IGEgaG9zdCBjb250YWluZXIsIHdlJ3JlIGluIGEgZGlzY29ubmVjdGVkIHRyZWUuIEkuZS5cbiAgLy8gdW5tb3VudGVkLlxuXG5cbiAgaWYgKGEudGFnICE9PSBIb3N0Um9vdCkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgbm9kZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LicpO1xuICB9XG5cbiAgaWYgKGEuc3RhdGVOb2RlLmN1cnJlbnQgPT09IGEpIHtcbiAgICAvLyBXZSd2ZSBkZXRlcm1pbmVkIHRoYXQgQSBpcyB0aGUgY3VycmVudCBicmFuY2guXG4gICAgcmV0dXJuIGZpYmVyO1xuICB9IC8vIE90aGVyd2lzZSBCIGhhcyB0byBiZSBjdXJyZW50IGJyYW5jaC5cblxuXG4gIHJldHVybiBhbHRlcm5hdGU7XG59XG5mdW5jdGlvbiBmaW5kQ3VycmVudEhvc3RGaWJlcihwYXJlbnQpIHtcbiAgdmFyIGN1cnJlbnRQYXJlbnQgPSBmaW5kQ3VycmVudEZpYmVyVXNpbmdTbG93UGF0aChwYXJlbnQpO1xuICByZXR1cm4gY3VycmVudFBhcmVudCAhPT0gbnVsbCA/IGZpbmRDdXJyZW50SG9zdEZpYmVySW1wbChjdXJyZW50UGFyZW50KSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGZpbmRDdXJyZW50SG9zdEZpYmVySW1wbChub2RlKSB7XG4gIC8vIE5leHQgd2UnbGwgZHJpbGwgZG93biB0aGlzIGNvbXBvbmVudCB0byBmaW5kIHRoZSBmaXJzdCBIb3N0Q29tcG9uZW50L1RleHQuXG4gIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBub2RlLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIHZhciBjaGlsZCA9IG5vZGUuY2hpbGQ7XG5cbiAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgdmFyIG1hdGNoID0gZmluZEN1cnJlbnRIb3N0RmliZXJJbXBsKGNoaWxkKTtcblxuICAgIGlmIChtYXRjaCAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG1hdGNoO1xuICAgIH1cblxuICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBmaW5kQ3VycmVudEhvc3RGaWJlcldpdGhOb1BvcnRhbHMocGFyZW50KSB7XG4gIHZhciBjdXJyZW50UGFyZW50ID0gZmluZEN1cnJlbnRGaWJlclVzaW5nU2xvd1BhdGgocGFyZW50KTtcbiAgcmV0dXJuIGN1cnJlbnRQYXJlbnQgIT09IG51bGwgPyBmaW5kQ3VycmVudEhvc3RGaWJlcldpdGhOb1BvcnRhbHNJbXBsKGN1cnJlbnRQYXJlbnQpIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gZmluZEN1cnJlbnRIb3N0RmliZXJXaXRoTm9Qb3J0YWxzSW1wbChub2RlKSB7XG4gIC8vIE5leHQgd2UnbGwgZHJpbGwgZG93biB0aGlzIGNvbXBvbmVudCB0byBmaW5kIHRoZSBmaXJzdCBIb3N0Q29tcG9uZW50L1RleHQuXG4gIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBub2RlLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIHZhciBjaGlsZCA9IG5vZGUuY2hpbGQ7XG5cbiAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgaWYgKGNoaWxkLnRhZyAhPT0gSG9zdFBvcnRhbCkge1xuICAgICAgdmFyIG1hdGNoID0gZmluZEN1cnJlbnRIb3N0RmliZXJXaXRoTm9Qb3J0YWxzSW1wbChjaGlsZCk7XG5cbiAgICAgIGlmIChtYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vIFRoaXMgbW9kdWxlIG9ubHkgZXhpc3RzIGFzIGFuIEVTTSB3cmFwcGVyIGFyb3VuZCB0aGUgZXh0ZXJuYWwgQ29tbW9uSlNcbnZhciBzY2hlZHVsZUNhbGxiYWNrID0gU2NoZWR1bGVyLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2s7XG52YXIgY2FuY2VsQ2FsbGJhY2sgPSBTY2hlZHVsZXIudW5zdGFibGVfY2FuY2VsQ2FsbGJhY2s7XG52YXIgc2hvdWxkWWllbGQgPSBTY2hlZHVsZXIudW5zdGFibGVfc2hvdWxkWWllbGQ7XG52YXIgcmVxdWVzdFBhaW50ID0gU2NoZWR1bGVyLnVuc3RhYmxlX3JlcXVlc3RQYWludDtcbnZhciBub3cgPSBTY2hlZHVsZXIudW5zdGFibGVfbm93O1xudmFyIGdldEN1cnJlbnRQcmlvcml0eUxldmVsID0gU2NoZWR1bGVyLnVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsO1xudmFyIEltbWVkaWF0ZVByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5O1xudmFyIFVzZXJCbG9ja2luZ1ByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX1VzZXJCbG9ja2luZ1ByaW9yaXR5O1xudmFyIE5vcm1hbFByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5O1xudmFyIExvd1ByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX0xvd1ByaW9yaXR5O1xudmFyIElkbGVQcmlvcml0eSA9IFNjaGVkdWxlci51bnN0YWJsZV9JZGxlUHJpb3JpdHk7XG4vLyB0aGlzIGRvZXNuJ3QgYWN0dWFsbHkgZXhpc3Qgb24gdGhlIHNjaGVkdWxlciwgYnV0IGl0ICpkb2VzKlxuLy8gb24gc2NoZWR1bGVyL3Vuc3RhYmxlX21vY2ssIHdoaWNoIHdlJ2xsIG5lZWQgZm9yIGludGVybmFsIHRlc3RpbmdcbnZhciB1bnN0YWJsZV95aWVsZFZhbHVlID0gU2NoZWR1bGVyLnVuc3RhYmxlX3lpZWxkVmFsdWU7XG52YXIgdW5zdGFibGVfc2V0RGlzYWJsZVlpZWxkVmFsdWUgPSBTY2hlZHVsZXIudW5zdGFibGVfc2V0RGlzYWJsZVlpZWxkVmFsdWU7XG5cbnZhciByZW5kZXJlcklEID0gbnVsbDtcbnZhciBpbmplY3RlZEhvb2sgPSBudWxsO1xudmFyIGluamVjdGVkUHJvZmlsaW5nSG9va3MgPSBudWxsO1xudmFyIGhhc0xvZ2dlZEVycm9yID0gZmFsc2U7XG52YXIgaXNEZXZUb29sc1ByZXNlbnQgPSB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJztcbmZ1bmN0aW9uIGluamVjdEludGVybmFscyhpbnRlcm5hbHMpIHtcbiAgaWYgKHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gTm8gRGV2VG9vbHNcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgaG9vayA9IF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztcblxuICBpZiAoaG9vay5pc0Rpc2FibGVkKSB7XG4gICAgLy8gVGhpcyBpc24ndCBhIHJlYWwgcHJvcGVydHkgb24gdGhlIGhvb2ssIGJ1dCBpdCBjYW4gYmUgc2V0IHRvIG9wdCBvdXRcbiAgICAvLyBvZiBEZXZUb29scyBpbnRlZ3JhdGlvbiBhbmQgYXNzb2NpYXRlZCB3YXJuaW5ncyBhbmQgbG9ncy5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzM4NzdcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICghaG9vay5zdXBwb3J0c0ZpYmVyKSB7XG4gICAge1xuICAgICAgZXJyb3IoJ1RoZSBpbnN0YWxsZWQgdmVyc2lvbiBvZiBSZWFjdCBEZXZUb29scyBpcyB0b28gb2xkIGFuZCB3aWxsIG5vdCB3b3JrICcgKyAnd2l0aCB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIFJlYWN0LiBQbGVhc2UgdXBkYXRlIFJlYWN0IERldlRvb2xzLiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWFjdC1kZXZ0b29scycpO1xuICAgIH0gLy8gRGV2VG9vbHMgZXhpc3RzLCBldmVuIHRob3VnaCBpdCBkb2Vzbid0IHN1cHBvcnQgRmliZXIuXG5cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBpZiAoZW5hYmxlU2NoZWR1bGluZ1Byb2ZpbGVyKSB7XG4gICAgICAvLyBDb25kaXRpb25hbGx5IGluamVjdCB0aGVzZSBob29rcyBvbmx5IGlmIFRpbWVsaW5lIHByb2ZpbGVyIGlzIHN1cHBvcnRlZCBieSB0aGlzIGJ1aWxkLlxuICAgICAgLy8gVGhpcyBnaXZlcyBEZXZUb29scyBhIHdheSB0byBmZWF0dXJlIGRldGVjdCB0aGF0IGlzbid0IHRpZWQgdG8gdmVyc2lvbiBudW1iZXJcbiAgICAgIC8vIChzaW5jZSBwcm9maWxpbmcgYW5kIHRpbWVsaW5lIGFyZSBjb250cm9sbGVkIGJ5IGRpZmZlcmVudCBmZWF0dXJlIGZsYWdzKS5cbiAgICAgIGludGVybmFscyA9IGFzc2lnbih7fSwgaW50ZXJuYWxzLCB7XG4gICAgICAgIGdldExhbmVMYWJlbE1hcDogZ2V0TGFuZUxhYmVsTWFwLFxuICAgICAgICBpbmplY3RQcm9maWxpbmdIb29rczogaW5qZWN0UHJvZmlsaW5nSG9va3NcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlbmRlcmVySUQgPSBob29rLmluamVjdChpbnRlcm5hbHMpOyAvLyBXZSBoYXZlIHN1Y2Nlc3NmdWxseSBpbmplY3RlZCwgc28gbm93IGl0IGlzIHNhZmUgdG8gc2V0IHVwIGhvb2tzLlxuXG4gICAgaW5qZWN0ZWRIb29rID0gaG9vaztcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gQ2F0Y2ggYWxsIGVycm9ycyBiZWNhdXNlIGl0IGlzIHVuc2FmZSB0byB0aHJvdyBkdXJpbmcgaW5pdGlhbGl6YXRpb24uXG4gICAge1xuICAgICAgZXJyb3IoJ1JlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJXMuJywgZXJyKTtcbiAgICB9XG4gIH1cblxuICBpZiAoaG9vay5jaGVja0RDRSkge1xuICAgIC8vIFRoaXMgaXMgdGhlIHJlYWwgRGV2VG9vbHMuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyBsaWtlbHkgYSBob29rIGluc3RhbGxlZCBieSBGYXN0IFJlZnJlc2ggcnVudGltZS5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIG9uU2NoZWR1bGVSb290KHJvb3QsIGNoaWxkcmVuKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRIb29rICYmIHR5cGVvZiBpbmplY3RlZEhvb2sub25TY2hlZHVsZUZpYmVyUm9vdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaW5qZWN0ZWRIb29rLm9uU2NoZWR1bGVGaWJlclJvb3QocmVuZGVyZXJJRCwgcm9vdCwgY2hpbGRyZW4pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmICggIWhhc0xvZ2dlZEVycm9yKSB7XG4gICAgICAgICAgaGFzTG9nZ2VkRXJyb3IgPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJ1JlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJXMnLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBvbkNvbW1pdFJvb3Qocm9vdCwgZXZlbnRQcmlvcml0eSkge1xuICBpZiAoaW5qZWN0ZWRIb29rICYmIHR5cGVvZiBpbmplY3RlZEhvb2sub25Db21taXRGaWJlclJvb3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0cnkge1xuICAgICAgdmFyIGRpZEVycm9yID0gKHJvb3QuY3VycmVudC5mbGFncyAmIERpZENhcHR1cmUpID09PSBEaWRDYXB0dXJlO1xuXG4gICAgICBpZiAoZW5hYmxlUHJvZmlsZXJUaW1lcikge1xuICAgICAgICB2YXIgc2NoZWR1bGVyUHJpb3JpdHk7XG5cbiAgICAgICAgc3dpdGNoIChldmVudFByaW9yaXR5KSB7XG4gICAgICAgICAgY2FzZSBEaXNjcmV0ZUV2ZW50UHJpb3JpdHk6XG4gICAgICAgICAgICBzY2hlZHVsZXJQcmlvcml0eSA9IEltbWVkaWF0ZVByaW9yaXR5O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIENvbnRpbnVvdXNFdmVudFByaW9yaXR5OlxuICAgICAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHkgPSBVc2VyQmxvY2tpbmdQcmlvcml0eTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBEZWZhdWx0RXZlbnRQcmlvcml0eTpcbiAgICAgICAgICAgIHNjaGVkdWxlclByaW9yaXR5ID0gTm9ybWFsUHJpb3JpdHk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgSWRsZUV2ZW50UHJpb3JpdHk6XG4gICAgICAgICAgICBzY2hlZHVsZXJQcmlvcml0eSA9IElkbGVQcmlvcml0eTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHNjaGVkdWxlclByaW9yaXR5ID0gTm9ybWFsUHJpb3JpdHk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGluamVjdGVkSG9vay5vbkNvbW1pdEZpYmVyUm9vdChyZW5kZXJlcklELCByb290LCBzY2hlZHVsZXJQcmlvcml0eSwgZGlkRXJyb3IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJSb290KHJlbmRlcmVySUQsIHJvb3QsIHVuZGVmaW5lZCwgZGlkRXJyb3IpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAge1xuICAgICAgICBpZiAoIWhhc0xvZ2dlZEVycm9yKSB7XG4gICAgICAgICAgaGFzTG9nZ2VkRXJyb3IgPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJ1JlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJXMnLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBvblBvc3RDb21taXRSb290KHJvb3QpIHtcbiAgaWYgKGluamVjdGVkSG9vayAmJiB0eXBlb2YgaW5qZWN0ZWRIb29rLm9uUG9zdENvbW1pdEZpYmVyUm9vdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICBpbmplY3RlZEhvb2sub25Qb3N0Q29tbWl0RmliZXJSb290KHJlbmRlcmVySUQsIHJvb3QpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAge1xuICAgICAgICBpZiAoIWhhc0xvZ2dlZEVycm9yKSB7XG4gICAgICAgICAgaGFzTG9nZ2VkRXJyb3IgPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJ1JlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJXMnLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBvbkNvbW1pdFVubW91bnQoZmliZXIpIHtcbiAgaWYgKGluamVjdGVkSG9vayAmJiB0eXBlb2YgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJVbm1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGluamVjdGVkSG9vay5vbkNvbW1pdEZpYmVyVW5tb3VudChyZW5kZXJlcklELCBmaWJlcik7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB7XG4gICAgICAgIGlmICghaGFzTG9nZ2VkRXJyb3IpIHtcbiAgICAgICAgICBoYXNMb2dnZWRFcnJvciA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignUmVhY3QgaW5zdHJ1bWVudGF0aW9uIGVuY291bnRlcmVkIGFuIGVycm9yOiAlcycsIGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKG5ld0lzU3RyaWN0TW9kZSkge1xuICB7XG4gICAgaWYgKHR5cGVvZiB1bnN0YWJsZV95aWVsZFZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBXZSdyZSBpbiBhIHRlc3QgYmVjYXVzZSBTY2hlZHVsZXIudW5zdGFibGVfeWllbGRWYWx1ZSBvbmx5IGV4aXN0c1xuICAgICAgLy8gaW4gU2NoZWR1bGVyTW9jay4gVG8gcmVkdWNlIHRoZSBub2lzZSBpbiBzdHJpY3QgbW9kZSB0ZXN0cyxcbiAgICAgIC8vIHN1cHByZXNzIHdhcm5pbmdzIGFuZCBkaXNhYmxlIHNjaGVkdWxlciB5aWVsZGluZyBkdXJpbmcgdGhlIGRvdWJsZSByZW5kZXJcbiAgICAgIHVuc3RhYmxlX3NldERpc2FibGVZaWVsZFZhbHVlKG5ld0lzU3RyaWN0TW9kZSk7XG4gICAgICBzZXRTdXBwcmVzc1dhcm5pbmcobmV3SXNTdHJpY3RNb2RlKTtcbiAgICB9XG5cbiAgICBpZiAoaW5qZWN0ZWRIb29rICYmIHR5cGVvZiBpbmplY3RlZEhvb2suc2V0U3RyaWN0TW9kZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaW5qZWN0ZWRIb29rLnNldFN0cmljdE1vZGUocmVuZGVyZXJJRCwgbmV3SXNTdHJpY3RNb2RlKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB7XG4gICAgICAgICAgaWYgKCFoYXNMb2dnZWRFcnJvcikge1xuICAgICAgICAgICAgaGFzTG9nZ2VkRXJyb3IgPSB0cnVlO1xuXG4gICAgICAgICAgICBlcnJvcignUmVhY3QgaW5zdHJ1bWVudGF0aW9uIGVuY291bnRlcmVkIGFuIGVycm9yOiAlcycsIGVycik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59IC8vIFByb2ZpbGVyIEFQSSBob29rc1xuXG5mdW5jdGlvbiBpbmplY3RQcm9maWxpbmdIb29rcyhwcm9maWxpbmdIb29rcykge1xuICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzID0gcHJvZmlsaW5nSG9va3M7XG59XG5cbmZ1bmN0aW9uIGdldExhbmVMYWJlbE1hcCgpIHtcbiAge1xuICAgIHZhciBtYXAgPSBuZXcgTWFwKCk7XG4gICAgdmFyIGxhbmUgPSAxO1xuXG4gICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IFRvdGFsTGFuZXM7IGluZGV4KyspIHtcbiAgICAgIHZhciBsYWJlbCA9IGdldExhYmVsRm9yTGFuZShsYW5lKTtcbiAgICAgIG1hcC5zZXQobGFuZSwgbGFiZWwpO1xuICAgICAgbGFuZSAqPSAyO1xuICAgIH1cblxuICAgIHJldHVybiBtYXA7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFya0NvbW1pdFN0YXJ0ZWQobGFuZXMpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21taXRTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21taXRTdGFydGVkKGxhbmVzKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21taXRTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbW1pdFN0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbW1pdFN0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UmVuZGVyU3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UmVuZGVyU3RhcnRlZChmaWJlcik7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RhcnRlZChmaWJlcikge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0YXJ0ZWQoZmliZXIpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RhcnRlZChmaWJlcikge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdGFydGVkKGZpYmVyKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0YXJ0ZWQoZmliZXIpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RhcnRlZChmaWJlcik7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0YXJ0ZWQoZmliZXIpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0YXJ0ZWQoZmliZXIpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudEVycm9yZWQoZmliZXIsIHRocm93blZhbHVlLCBsYW5lcykge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudEVycm9yZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudEVycm9yZWQoZmliZXIsIHRocm93blZhbHVlLCBsYW5lcyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50U3VzcGVuZGVkKGZpYmVyLCB3YWtlYWJsZSwgbGFuZXMpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRTdXNwZW5kZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFN1c3BlbmRlZChmaWJlciwgd2FrZWFibGUsIGxhbmVzKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtMYXlvdXRFZmZlY3RzU3RhcnRlZChsYW5lcykge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0xheW91dEVmZmVjdHNTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtMYXlvdXRFZmZlY3RzU3RhcnRlZChsYW5lcyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrTGF5b3V0RWZmZWN0c1N0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrTGF5b3V0RWZmZWN0c1N0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0xheW91dEVmZmVjdHNTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrUGFzc2l2ZUVmZmVjdHNTdGFydGVkKGxhbmVzKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUGFzc2l2ZUVmZmVjdHNTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtQYXNzaXZlRWZmZWN0c1N0YXJ0ZWQobGFuZXMpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya1Bhc3NpdmVFZmZlY3RzU3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtQYXNzaXZlRWZmZWN0c1N0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1Bhc3NpdmVFZmZlY3RzU3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya1JlbmRlclN0YXJ0ZWQobGFuZXMpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtSZW5kZXJTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtSZW5kZXJTdGFydGVkKGxhbmVzKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtSZW5kZXJZaWVsZGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlcllpZWxkZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlcllpZWxkZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtSZW5kZXJTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlclN0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlclN0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtSZW5kZXJTY2hlZHVsZWQobGFuZSkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlclNjaGVkdWxlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyU2NoZWR1bGVkKGxhbmUpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0ZvcmNlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrRm9yY2VVcGRhdGVTY2hlZHVsZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0ZvcmNlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtTdGF0ZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1N0YXRlVXBkYXRlU2NoZWR1bGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtTdGF0ZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSk7XG4gICAgfVxuICB9XG59XG5cbnZhciBOb01vZGUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjA7IC8vIFRPRE86IFJlbW92ZSBDb25jdXJyZW50TW9kZSBieSByZWFkaW5nIGZyb20gdGhlIHJvb3QgdGFnIGluc3RlYWRcblxudmFyIENvbmN1cnJlbnRNb2RlID1cbi8qICAgICAgICAgICAgICAgICAqL1xuMTtcbnZhciBQcm9maWxlTW9kZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgKi9cbjI7XG52YXIgU3RyaWN0TGVnYWN5TW9kZSA9XG4vKiAgICAgICAgICAgICAgICovXG44O1xudmFyIFN0cmljdEVmZmVjdHNNb2RlID1cbi8qICAgICAgICAgICAgICAqL1xuMTY7XG5cbi8vIFRPRE86IFRoaXMgaXMgcHJldHR5IHdlbGwgc3VwcG9ydGVkIGJ5IGJyb3dzZXJzLiBNYXliZSB3ZSBjYW4gZHJvcCBpdC5cbnZhciBjbHozMiA9IE1hdGguY2x6MzIgPyBNYXRoLmNsejMyIDogY2x6MzJGYWxsYmFjazsgLy8gQ291bnQgbGVhZGluZyB6ZXJvcy5cbi8vIEJhc2VkIG9uOlxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvTWF0aC9jbHozMlxuXG52YXIgbG9nID0gTWF0aC5sb2c7XG52YXIgTE4yID0gTWF0aC5MTjI7XG5cbmZ1bmN0aW9uIGNsejMyRmFsbGJhY2soeCkge1xuICB2YXIgYXNVaW50ID0geCA+Pj4gMDtcblxuICBpZiAoYXNVaW50ID09PSAwKSB7XG4gICAgcmV0dXJuIDMyO1xuICB9XG5cbiAgcmV0dXJuIDMxIC0gKGxvZyhhc1VpbnQpIC8gTE4yIHwgMCkgfCAwO1xufVxuXG4vLyBJZiB0aG9zZSB2YWx1ZXMgYXJlIGNoYW5nZWQgdGhhdCBwYWNrYWdlIHNob3VsZCBiZSByZWJ1aWx0IGFuZCByZWRlcGxveWVkLlxuXG52YXIgVG90YWxMYW5lcyA9IDMxO1xudmFyIE5vTGFuZXMgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuMDtcbnZhciBOb0xhbmUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICovXG4wO1xudmFyIFN5bmNMYW5lID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjE7XG52YXIgSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZSA9XG4vKiAgICAqL1xuMjtcbnZhciBJbnB1dENvbnRpbnVvdXNMYW5lID1cbi8qICAgICAgICAgICAgICovXG40O1xudmFyIERlZmF1bHRIeWRyYXRpb25MYW5lID1cbi8qICAgICAgICAgICAgKi9cbjg7XG52YXIgRGVmYXVsdExhbmUgPVxuLyogICAgICAgICAgICAgICAgICAgICAqL1xuMTY7XG52YXIgVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmUgPVxuLyogICAgICAgICAgICAgICAgKi9cbjMyO1xudmFyIFRyYW5zaXRpb25MYW5lcyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjQxOTQyNDA7XG52YXIgVHJhbnNpdGlvbkxhbmUxID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjY0O1xudmFyIFRyYW5zaXRpb25MYW5lMiA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4xMjg7XG52YXIgVHJhbnNpdGlvbkxhbmUzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjI1NjtcbnZhciBUcmFuc2l0aW9uTGFuZTQgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuNTEyO1xudmFyIFRyYW5zaXRpb25MYW5lNSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4xMDI0O1xudmFyIFRyYW5zaXRpb25MYW5lNiA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4yMDQ4O1xudmFyIFRyYW5zaXRpb25MYW5lNyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG40MDk2O1xudmFyIFRyYW5zaXRpb25MYW5lOCA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG44MTkyO1xudmFyIFRyYW5zaXRpb25MYW5lOSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4xNjM4NDtcbnZhciBUcmFuc2l0aW9uTGFuZTEwID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuMzI3Njg7XG52YXIgVHJhbnNpdGlvbkxhbmUxMSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjY1NTM2O1xudmFyIFRyYW5zaXRpb25MYW5lMTIgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG4xMzEwNzI7XG52YXIgVHJhbnNpdGlvbkxhbmUxMyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjI2MjE0NDtcbnZhciBUcmFuc2l0aW9uTGFuZTE0ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuNTI0Mjg4O1xudmFyIFRyYW5zaXRpb25MYW5lMTUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG4xMDQ4NTc2O1xudmFyIFRyYW5zaXRpb25MYW5lMTYgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG4yMDk3MTUyO1xudmFyIFJldHJ5TGFuZXMgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjEzMDAyMzQyNDtcbnZhciBSZXRyeUxhbmUxID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuNDE5NDMwNDtcbnZhciBSZXRyeUxhbmUyID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuODM4ODYwODtcbnZhciBSZXRyeUxhbmUzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTY3NzcyMTY7XG52YXIgUmV0cnlMYW5lNCA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjMzNTU0NDMyO1xudmFyIFJldHJ5TGFuZTUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG42NzEwODg2NDtcbnZhciBTb21lUmV0cnlMYW5lID0gUmV0cnlMYW5lMTtcbnZhciBTZWxlY3RpdmVIeWRyYXRpb25MYW5lID1cbi8qICAgICAgICAgICovXG4xMzQyMTc3Mjg7XG52YXIgTm9uSWRsZUxhbmVzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuMjY4NDM1NDU1O1xudmFyIElkbGVIeWRyYXRpb25MYW5lID1cbi8qICAgICAgICAgICAgICAgKi9cbjI2ODQzNTQ1NjtcbnZhciBJZGxlTGFuZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG41MzY4NzA5MTI7XG52YXIgT2Zmc2NyZWVuTGFuZSA9XG4vKiAgICAgICAgICAgICAgICAgICAqL1xuMTA3Mzc0MTgyNDsgLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciB0aGUgZXhwZXJpbWVudGFsIHRpbWVsaW5lIChyZWFjdC1kZXZ0b29scy10aW1lbGluZSlcbi8vIEl0IHNob3VsZCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgTGFuZXMgdmFsdWVzIGFib3ZlLlxuXG5mdW5jdGlvbiBnZXRMYWJlbEZvckxhbmUobGFuZSkge1xuICB7XG4gICAgaWYgKGxhbmUgJiBTeW5jTGFuZSkge1xuICAgICAgcmV0dXJuICdTeW5jJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIElucHV0Q29udGludW91c0h5ZHJhdGlvbkxhbmUpIHtcbiAgICAgIHJldHVybiAnSW5wdXRDb250aW51b3VzSHlkcmF0aW9uJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIElucHV0Q29udGludW91c0xhbmUpIHtcbiAgICAgIHJldHVybiAnSW5wdXRDb250aW51b3VzJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIERlZmF1bHRIeWRyYXRpb25MYW5lKSB7XG4gICAgICByZXR1cm4gJ0RlZmF1bHRIeWRyYXRpb24nO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgRGVmYXVsdExhbmUpIHtcbiAgICAgIHJldHVybiAnRGVmYXVsdCc7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBUcmFuc2l0aW9uSHlkcmF0aW9uTGFuZSkge1xuICAgICAgcmV0dXJuICdUcmFuc2l0aW9uSHlkcmF0aW9uJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIFRyYW5zaXRpb25MYW5lcykge1xuICAgICAgcmV0dXJuICdUcmFuc2l0aW9uJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIFJldHJ5TGFuZXMpIHtcbiAgICAgIHJldHVybiAnUmV0cnknO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgU2VsZWN0aXZlSHlkcmF0aW9uTGFuZSkge1xuICAgICAgcmV0dXJuICdTZWxlY3RpdmVIeWRyYXRpb24nO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgSWRsZUh5ZHJhdGlvbkxhbmUpIHtcbiAgICAgIHJldHVybiAnSWRsZUh5ZHJhdGlvbic7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBJZGxlTGFuZSkge1xuICAgICAgcmV0dXJuICdJZGxlJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIE9mZnNjcmVlbkxhbmUpIHtcbiAgICAgIHJldHVybiAnT2Zmc2NyZWVuJztcbiAgICB9XG4gIH1cbn1cbnZhciBOb1RpbWVzdGFtcCA9IC0xO1xudmFyIG5leHRUcmFuc2l0aW9uTGFuZSA9IFRyYW5zaXRpb25MYW5lMTtcbnZhciBuZXh0UmV0cnlMYW5lID0gUmV0cnlMYW5lMTtcblxuZnVuY3Rpb24gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMobGFuZXMpIHtcbiAgc3dpdGNoIChnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKGxhbmVzKSkge1xuICAgIGNhc2UgU3luY0xhbmU6XG4gICAgICByZXR1cm4gU3luY0xhbmU7XG5cbiAgICBjYXNlIElucHV0Q29udGludW91c0h5ZHJhdGlvbkxhbmU6XG4gICAgICByZXR1cm4gSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZTtcblxuICAgIGNhc2UgSW5wdXRDb250aW51b3VzTGFuZTpcbiAgICAgIHJldHVybiBJbnB1dENvbnRpbnVvdXNMYW5lO1xuXG4gICAgY2FzZSBEZWZhdWx0SHlkcmF0aW9uTGFuZTpcbiAgICAgIHJldHVybiBEZWZhdWx0SHlkcmF0aW9uTGFuZTtcblxuICAgIGNhc2UgRGVmYXVsdExhbmU6XG4gICAgICByZXR1cm4gRGVmYXVsdExhbmU7XG5cbiAgICBjYXNlIFRyYW5zaXRpb25IeWRyYXRpb25MYW5lOlxuICAgICAgcmV0dXJuIFRyYW5zaXRpb25IeWRyYXRpb25MYW5lO1xuXG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTI6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTM6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTQ6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTU6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTY6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTc6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTg6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTk6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEwOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTI6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEzOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTU6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE2OlxuICAgICAgcmV0dXJuIGxhbmVzICYgVHJhbnNpdGlvbkxhbmVzO1xuXG4gICAgY2FzZSBSZXRyeUxhbmUxOlxuICAgIGNhc2UgUmV0cnlMYW5lMjpcbiAgICBjYXNlIFJldHJ5TGFuZTM6XG4gICAgY2FzZSBSZXRyeUxhbmU0OlxuICAgIGNhc2UgUmV0cnlMYW5lNTpcbiAgICAgIHJldHVybiBsYW5lcyAmIFJldHJ5TGFuZXM7XG5cbiAgICBjYXNlIFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmU6XG4gICAgICByZXR1cm4gU2VsZWN0aXZlSHlkcmF0aW9uTGFuZTtcblxuICAgIGNhc2UgSWRsZUh5ZHJhdGlvbkxhbmU6XG4gICAgICByZXR1cm4gSWRsZUh5ZHJhdGlvbkxhbmU7XG5cbiAgICBjYXNlIElkbGVMYW5lOlxuICAgICAgcmV0dXJuIElkbGVMYW5lO1xuXG4gICAgY2FzZSBPZmZzY3JlZW5MYW5lOlxuICAgICAgcmV0dXJuIE9mZnNjcmVlbkxhbmU7XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICBlcnJvcignU2hvdWxkIGhhdmUgZm91bmQgbWF0Y2hpbmcgbGFuZXMuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuJyk7XG4gICAgICB9IC8vIFRoaXMgc2hvdWxkbid0IGJlIHJlYWNoYWJsZSwgYnV0IGFzIGEgZmFsbGJhY2ssIHJldHVybiB0aGUgZW50aXJlIGJpdG1hc2suXG5cblxuICAgICAgcmV0dXJuIGxhbmVzO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldE5leHRMYW5lcyhyb290LCB3aXBMYW5lcykge1xuICAvLyBFYXJseSBiYWlsb3V0IGlmIHRoZXJlJ3Mgbm8gcGVuZGluZyB3b3JrIGxlZnQuXG4gIHZhciBwZW5kaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lcztcblxuICBpZiAocGVuZGluZ0xhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgcmV0dXJuIE5vTGFuZXM7XG4gIH1cblxuICB2YXIgbmV4dExhbmVzID0gTm9MYW5lcztcbiAgdmFyIHN1c3BlbmRlZExhbmVzID0gcm9vdC5zdXNwZW5kZWRMYW5lcztcbiAgdmFyIHBpbmdlZExhbmVzID0gcm9vdC5waW5nZWRMYW5lczsgLy8gRG8gbm90IHdvcmsgb24gYW55IGlkbGUgd29yayB1bnRpbCBhbGwgdGhlIG5vbi1pZGxlIHdvcmsgaGFzIGZpbmlzaGVkLFxuICAvLyBldmVuIGlmIHRoZSB3b3JrIGlzIHN1c3BlbmRlZC5cblxuICB2YXIgbm9uSWRsZVBlbmRpbmdMYW5lcyA9IHBlbmRpbmdMYW5lcyAmIE5vbklkbGVMYW5lcztcblxuICBpZiAobm9uSWRsZVBlbmRpbmdMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgIHZhciBub25JZGxlVW5ibG9ja2VkTGFuZXMgPSBub25JZGxlUGVuZGluZ0xhbmVzICYgfnN1c3BlbmRlZExhbmVzO1xuXG4gICAgaWYgKG5vbklkbGVVbmJsb2NrZWRMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgbmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMobm9uSWRsZVVuYmxvY2tlZExhbmVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG5vbklkbGVQaW5nZWRMYW5lcyA9IG5vbklkbGVQZW5kaW5nTGFuZXMgJiBwaW5nZWRMYW5lcztcblxuICAgICAgaWYgKG5vbklkbGVQaW5nZWRMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgICBuZXh0TGFuZXMgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyhub25JZGxlUGluZ2VkTGFuZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBUaGUgb25seSByZW1haW5pbmcgd29yayBpcyBJZGxlLlxuICAgIHZhciB1bmJsb2NrZWRMYW5lcyA9IHBlbmRpbmdMYW5lcyAmIH5zdXNwZW5kZWRMYW5lcztcblxuICAgIGlmICh1bmJsb2NrZWRMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgbmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXModW5ibG9ja2VkTGFuZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocGluZ2VkTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgICAgbmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMocGluZ2VkTGFuZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChuZXh0TGFuZXMgPT09IE5vTGFuZXMpIHtcbiAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGJlIHJlYWNoYWJsZSBpZiB3ZSdyZSBzdXNwZW5kZWRcbiAgICAvLyBUT0RPOiBDb25zaWRlciB3YXJuaW5nIGluIHRoaXMgcGF0aCBpZiBhIGZhbGxiYWNrIHRpbWVyIGlzIG5vdCBzY2hlZHVsZWQuXG4gICAgcmV0dXJuIE5vTGFuZXM7XG4gIH0gLy8gSWYgd2UncmUgYWxyZWFkeSBpbiB0aGUgbWlkZGxlIG9mIGEgcmVuZGVyLCBzd2l0Y2hpbmcgbGFuZXMgd2lsbCBpbnRlcnJ1cHRcbiAgLy8gaXQgYW5kIHdlJ2xsIGxvc2Ugb3VyIHByb2dyZXNzLiBXZSBzaG91bGQgb25seSBkbyB0aGlzIGlmIHRoZSBuZXcgbGFuZXMgYXJlXG4gIC8vIGhpZ2hlciBwcmlvcml0eS5cblxuXG4gIGlmICh3aXBMYW5lcyAhPT0gTm9MYW5lcyAmJiB3aXBMYW5lcyAhPT0gbmV4dExhbmVzICYmIC8vIElmIHdlIGFscmVhZHkgc3VzcGVuZGVkIHdpdGggYSBkZWxheSwgdGhlbiBpbnRlcnJ1cHRpbmcgaXMgZmluZS4gRG9uJ3RcbiAgLy8gYm90aGVyIHdhaXRpbmcgdW50aWwgdGhlIHJvb3QgaXMgY29tcGxldGUuXG4gICh3aXBMYW5lcyAmIHN1c3BlbmRlZExhbmVzKSA9PT0gTm9MYW5lcykge1xuICAgIHZhciBuZXh0TGFuZSA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobmV4dExhbmVzKTtcbiAgICB2YXIgd2lwTGFuZSA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmUod2lwTGFuZXMpO1xuXG4gICAgaWYgKCAvLyBUZXN0cyB3aGV0aGVyIHRoZSBuZXh0IGxhbmUgaXMgZXF1YWwgb3IgbG93ZXIgcHJpb3JpdHkgdGhhbiB0aGUgd2lwXG4gICAgLy8gb25lLiBUaGlzIHdvcmtzIGJlY2F1c2UgdGhlIGJpdHMgZGVjcmVhc2UgaW4gcHJpb3JpdHkgYXMgeW91IGdvIGxlZnQuXG4gICAgbmV4dExhbmUgPj0gd2lwTGFuZSB8fCAvLyBEZWZhdWx0IHByaW9yaXR5IHVwZGF0ZXMgc2hvdWxkIG5vdCBpbnRlcnJ1cHQgdHJhbnNpdGlvbiB1cGRhdGVzLiBUaGVcbiAgICAvLyBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiBkZWZhdWx0IHVwZGF0ZXMgYW5kIHRyYW5zaXRpb24gdXBkYXRlcyBpcyB0aGF0XG4gICAgLy8gZGVmYXVsdCB1cGRhdGVzIGRvIG5vdCBzdXBwb3J0IHJlZnJlc2ggdHJhbnNpdGlvbnMuXG4gICAgbmV4dExhbmUgPT09IERlZmF1bHRMYW5lICYmICh3aXBMYW5lICYgVHJhbnNpdGlvbkxhbmVzKSAhPT0gTm9MYW5lcykge1xuICAgICAgLy8gS2VlcCB3b3JraW5nIG9uIHRoZSBleGlzdGluZyBpbi1wcm9ncmVzcyB0cmVlLiBEbyBub3QgaW50ZXJydXB0LlxuICAgICAgcmV0dXJuIHdpcExhbmVzO1xuICAgIH1cbiAgfVxuXG4gIGlmICgobmV4dExhbmVzICYgSW5wdXRDb250aW51b3VzTGFuZSkgIT09IE5vTGFuZXMpIHtcbiAgICAvLyBXaGVuIHVwZGF0ZXMgYXJlIHN5bmMgYnkgZGVmYXVsdCwgd2UgZW50YW5nbGUgY29udGludW91cyBwcmlvcml0eSB1cGRhdGVzXG4gICAgLy8gYW5kIGRlZmF1bHQgdXBkYXRlcywgc28gdGhleSByZW5kZXIgaW4gdGhlIHNhbWUgYmF0Y2guIFRoZSBvbmx5IHJlYXNvblxuICAgIC8vIHRoZXkgdXNlIHNlcGFyYXRlIGxhbmVzIGlzIGJlY2F1c2UgY29udGludW91cyB1cGRhdGVzIHNob3VsZCBpbnRlcnJ1cHRcbiAgICAvLyB0cmFuc2l0aW9ucywgYnV0IGRlZmF1bHQgdXBkYXRlcyBzaG91bGQgbm90LlxuICAgIG5leHRMYW5lcyB8PSBwZW5kaW5nTGFuZXMgJiBEZWZhdWx0TGFuZTtcbiAgfSAvLyBDaGVjayBmb3IgZW50YW5nbGVkIGxhbmVzIGFuZCBhZGQgdGhlbSB0byB0aGUgYmF0Y2guXG4gIC8vXG4gIC8vIEEgbGFuZSBpcyBzYWlkIHRvIGJlIGVudGFuZ2xlZCB3aXRoIGFub3RoZXIgd2hlbiBpdCdzIG5vdCBhbGxvd2VkIHRvIHJlbmRlclxuICAvLyBpbiBhIGJhdGNoIHRoYXQgZG9lcyBub3QgYWxzbyBpbmNsdWRlIHRoZSBvdGhlciBsYW5lLiBUeXBpY2FsbHkgd2UgZG8gdGhpc1xuICAvLyB3aGVuIG11bHRpcGxlIHVwZGF0ZXMgaGF2ZSB0aGUgc2FtZSBzb3VyY2UsIGFuZCB3ZSBvbmx5IHdhbnQgdG8gcmVzcG9uZCB0b1xuICAvLyB0aGUgbW9zdCByZWNlbnQgZXZlbnQgZnJvbSB0aGF0IHNvdXJjZS5cbiAgLy9cbiAgLy8gTm90ZSB0aGF0IHdlIGFwcGx5IGVudGFuZ2xlbWVudHMgKmFmdGVyKiBjaGVja2luZyBmb3IgcGFydGlhbCB3b3JrIGFib3ZlLlxuICAvLyBUaGlzIG1lYW5zIHRoYXQgaWYgYSBsYW5lIGlzIGVudGFuZ2xlZCBkdXJpbmcgYW4gaW50ZXJsZWF2ZWQgZXZlbnQgd2hpbGVcbiAgLy8gaXQncyBhbHJlYWR5IHJlbmRlcmluZywgd2Ugd29uJ3QgaW50ZXJydXB0IGl0LiBUaGlzIGlzIGludGVudGlvbmFsLCBzaW5jZVxuICAvLyBlbnRhbmdsZW1lbnQgaXMgdXN1YWxseSBcImJlc3QgZWZmb3J0XCI6IHdlJ2xsIHRyeSBvdXIgYmVzdCB0byByZW5kZXIgdGhlXG4gIC8vIGxhbmVzIGluIHRoZSBzYW1lIGJhdGNoLCBidXQgaXQncyBub3Qgd29ydGggdGhyb3dpbmcgb3V0IHBhcnRpYWxseVxuICAvLyBjb21wbGV0ZWQgd29yayBpbiBvcmRlciB0byBkbyBpdC5cbiAgLy8gVE9ETzogUmVjb25zaWRlciB0aGlzLiBUaGUgY291bnRlci1hcmd1bWVudCBpcyB0aGF0IHRoZSBwYXJ0aWFsIHdvcmtcbiAgLy8gcmVwcmVzZW50cyBhbiBpbnRlcm1lZGlhdGUgc3RhdGUsIHdoaWNoIHdlIGRvbid0IHdhbnQgdG8gc2hvdyB0byB0aGUgdXNlci5cbiAgLy8gQW5kIGJ5IHNwZW5kaW5nIGV4dHJhIHRpbWUgZmluaXNoaW5nIGl0LCB3ZSdyZSBpbmNyZWFzaW5nIHRoZSBhbW91bnQgb2ZcbiAgLy8gdGltZSBpdCB0YWtlcyB0byBzaG93IHRoZSBmaW5hbCBzdGF0ZSwgd2hpY2ggaXMgd2hhdCB0aGV5IGFyZSBhY3R1YWxseVxuICAvLyB3YWl0aW5nIGZvci5cbiAgLy9cbiAgLy8gRm9yIHRob3NlIGV4Y2VwdGlvbnMgd2hlcmUgZW50YW5nbGVtZW50IGlzIHNlbWFudGljYWxseSBpbXBvcnRhbnQsIGxpa2VcbiAgLy8gdXNlTXV0YWJsZVNvdXJjZSwgd2Ugc2hvdWxkIGVuc3VyZSB0aGF0IHRoZXJlIGlzIG5vIHBhcnRpYWwgd29yayBhdCB0aGVcbiAgLy8gdGltZSB3ZSBhcHBseSB0aGUgZW50YW5nbGVtZW50LlxuXG5cbiAgdmFyIGVudGFuZ2xlZExhbmVzID0gcm9vdC5lbnRhbmdsZWRMYW5lcztcblxuICBpZiAoZW50YW5nbGVkTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICB2YXIgZW50YW5nbGVtZW50cyA9IHJvb3QuZW50YW5nbGVtZW50cztcbiAgICB2YXIgbGFuZXMgPSBuZXh0TGFuZXMgJiBlbnRhbmdsZWRMYW5lcztcblxuICAgIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpO1xuICAgICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgICAgbmV4dExhbmVzIHw9IGVudGFuZ2xlbWVudHNbaW5kZXhdO1xuICAgICAgbGFuZXMgJj0gfmxhbmU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5leHRMYW5lcztcbn1cbmZ1bmN0aW9uIGdldE1vc3RSZWNlbnRFdmVudFRpbWUocm9vdCwgbGFuZXMpIHtcbiAgdmFyIGV2ZW50VGltZXMgPSByb290LmV2ZW50VGltZXM7XG4gIHZhciBtb3N0UmVjZW50RXZlbnRUaW1lID0gTm9UaW1lc3RhbXA7XG5cbiAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICB2YXIgZXZlbnRUaW1lID0gZXZlbnRUaW1lc1tpbmRleF07XG5cbiAgICBpZiAoZXZlbnRUaW1lID4gbW9zdFJlY2VudEV2ZW50VGltZSkge1xuICAgICAgbW9zdFJlY2VudEV2ZW50VGltZSA9IGV2ZW50VGltZTtcbiAgICB9XG5cbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxuXG4gIHJldHVybiBtb3N0UmVjZW50RXZlbnRUaW1lO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlRXhwaXJhdGlvblRpbWUobGFuZSwgY3VycmVudFRpbWUpIHtcbiAgc3dpdGNoIChsYW5lKSB7XG4gICAgY2FzZSBTeW5jTGFuZTpcbiAgICBjYXNlIElucHV0Q29udGludW91c0h5ZHJhdGlvbkxhbmU6XG4gICAgY2FzZSBJbnB1dENvbnRpbnVvdXNMYW5lOlxuICAgICAgLy8gVXNlciBpbnRlcmFjdGlvbnMgc2hvdWxkIGV4cGlyZSBzbGlnaHRseSBtb3JlIHF1aWNrbHkuXG4gICAgICAvL1xuICAgICAgLy8gTk9URTogVGhpcyBpcyBzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgY29uc3RhbnQgYXMgaW4gU2NoZWR1bGVyLmpzLlxuICAgICAgLy8gV2hlbiB3ZSBtYWRlIGl0IGxhcmdlciwgYSBwcm9kdWN0IG1ldHJpYyBpbiB3d3cgcmVncmVzc2VkLCBzdWdnZXN0aW5nXG4gICAgICAvLyB0aGVyZSdzIGEgdXNlciBpbnRlcmFjdGlvbiB0aGF0J3MgYmVpbmcgc3RhcnZlZCBieSBhIHNlcmllcyBvZlxuICAgICAgLy8gc3luY2hyb25vdXMgdXBkYXRlcy4gSWYgdGhhdCB0aGVvcnkgaXMgY29ycmVjdCwgdGhlIHByb3BlciBzb2x1dGlvbiBpc1xuICAgICAgLy8gdG8gZml4IHRoZSBzdGFydmF0aW9uLiBIb3dldmVyLCB0aGlzIHNjZW5hcmlvIHN1cHBvcnRzIHRoZSBpZGVhIHRoYXRcbiAgICAgIC8vIGV4cGlyYXRpb24gdGltZXMgYXJlIGFuIGltcG9ydGFudCBzYWZlZ3VhcmQgd2hlbiBzdGFydmF0aW9uXG4gICAgICAvLyBkb2VzIGhhcHBlbi5cbiAgICAgIHJldHVybiBjdXJyZW50VGltZSArIDI1MDtcblxuICAgIGNhc2UgRGVmYXVsdEh5ZHJhdGlvbkxhbmU6XG4gICAgY2FzZSBEZWZhdWx0TGFuZTpcbiAgICBjYXNlIFRyYW5zaXRpb25IeWRyYXRpb25MYW5lOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUyOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUzOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU0OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU1OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU2OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU3OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU4OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU5OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTE6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEyOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTQ6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE1OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNjpcbiAgICAgIHJldHVybiBjdXJyZW50VGltZSArIDUwMDA7XG5cbiAgICBjYXNlIFJldHJ5TGFuZTE6XG4gICAgY2FzZSBSZXRyeUxhbmUyOlxuICAgIGNhc2UgUmV0cnlMYW5lMzpcbiAgICBjYXNlIFJldHJ5TGFuZTQ6XG4gICAgY2FzZSBSZXRyeUxhbmU1OlxuICAgICAgLy8gVE9ETzogUmV0cmllcyBzaG91bGQgYmUgYWxsb3dlZCB0byBleHBpcmUgaWYgdGhleSBhcmUgQ1BVIGJvdW5kIGZvclxuICAgICAgLy8gdG9vIGxvbmcsIGJ1dCB3aGVuIEkgbWFkZSB0aGlzIGNoYW5nZSBpdCBjYXVzZWQgYSBzcGlrZSBpbiBicm93c2VyXG4gICAgICAvLyBjcmFzaGVzLiBUaGVyZSBtdXN0IGJlIHNvbWUgb3RoZXIgdW5kZXJseWluZyBidWc7IG5vdCBzdXBlciB1cmdlbnQgYnV0XG4gICAgICAvLyBpZGVhbGx5IHNob3VsZCBmaWd1cmUgb3V0IHdoeSBhbmQgZml4IGl0LiBVbmZvcnR1bmF0ZWx5IHdlIGRvbid0IGhhdmVcbiAgICAgIC8vIGEgcmVwcm8gZm9yIHRoZSBjcmFzaGVzLCBvbmx5IGRldGVjdGVkIHZpYSBwcm9kdWN0aW9uIG1ldHJpY3MuXG4gICAgICByZXR1cm4gTm9UaW1lc3RhbXA7XG5cbiAgICBjYXNlIFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmU6XG4gICAgY2FzZSBJZGxlSHlkcmF0aW9uTGFuZTpcbiAgICBjYXNlIElkbGVMYW5lOlxuICAgIGNhc2UgT2Zmc2NyZWVuTGFuZTpcbiAgICAgIC8vIEFueXRoaW5nIGlkbGUgcHJpb3JpdHkgb3IgbG93ZXIgc2hvdWxkIG5ldmVyIGV4cGlyZS5cbiAgICAgIHJldHVybiBOb1RpbWVzdGFtcDtcblxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIGVycm9yKCdTaG91bGQgaGF2ZSBmb3VuZCBtYXRjaGluZyBsYW5lcy4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIE5vVGltZXN0YW1wO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtTdGFydmVkTGFuZXNBc0V4cGlyZWQocm9vdCwgY3VycmVudFRpbWUpIHtcbiAgLy8gVE9ETzogVGhpcyBnZXRzIGNhbGxlZCBldmVyeSB0aW1lIHdlIHlpZWxkLiBXZSBjYW4gb3B0aW1pemUgYnkgc3RvcmluZ1xuICAvLyB0aGUgZWFybGllc3QgZXhwaXJhdGlvbiB0aW1lIG9uIHRoZSByb290LiBUaGVuIHVzZSB0aGF0IHRvIHF1aWNrbHkgYmFpbCBvdXRcbiAgLy8gb2YgdGhpcyBmdW5jdGlvbi5cbiAgdmFyIHBlbmRpbmdMYW5lcyA9IHJvb3QucGVuZGluZ0xhbmVzO1xuICB2YXIgc3VzcGVuZGVkTGFuZXMgPSByb290LnN1c3BlbmRlZExhbmVzO1xuICB2YXIgcGluZ2VkTGFuZXMgPSByb290LnBpbmdlZExhbmVzO1xuICB2YXIgZXhwaXJhdGlvblRpbWVzID0gcm9vdC5leHBpcmF0aW9uVGltZXM7IC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgcGVuZGluZyBsYW5lcyBhbmQgY2hlY2sgaWYgd2UndmUgcmVhY2hlZCB0aGVpclxuICAvLyBleHBpcmF0aW9uIHRpbWUuIElmIHNvLCB3ZSdsbCBhc3N1bWUgdGhlIHVwZGF0ZSBpcyBiZWluZyBzdGFydmVkIGFuZCBtYXJrXG4gIC8vIGl0IGFzIGV4cGlyZWQgdG8gZm9yY2UgaXQgdG8gZmluaXNoLlxuXG4gIHZhciBsYW5lcyA9IHBlbmRpbmdMYW5lcztcblxuICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgdmFyIGluZGV4ID0gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcyk7XG4gICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgIHZhciBleHBpcmF0aW9uVGltZSA9IGV4cGlyYXRpb25UaW1lc1tpbmRleF07XG5cbiAgICBpZiAoZXhwaXJhdGlvblRpbWUgPT09IE5vVGltZXN0YW1wKSB7XG4gICAgICAvLyBGb3VuZCBhIHBlbmRpbmcgbGFuZSB3aXRoIG5vIGV4cGlyYXRpb24gdGltZS4gSWYgaXQncyBub3Qgc3VzcGVuZGVkLCBvclxuICAgICAgLy8gaWYgaXQncyBwaW5nZWQsIGFzc3VtZSBpdCdzIENQVS1ib3VuZC4gQ29tcHV0ZSBhIG5ldyBleHBpcmF0aW9uIHRpbWVcbiAgICAgIC8vIHVzaW5nIHRoZSBjdXJyZW50IHRpbWUuXG4gICAgICBpZiAoKGxhbmUgJiBzdXNwZW5kZWRMYW5lcykgPT09IE5vTGFuZXMgfHwgKGxhbmUgJiBwaW5nZWRMYW5lcykgIT09IE5vTGFuZXMpIHtcbiAgICAgICAgLy8gQXNzdW1lcyB0aW1lc3RhbXBzIGFyZSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcuXG4gICAgICAgIGV4cGlyYXRpb25UaW1lc1tpbmRleF0gPSBjb21wdXRlRXhwaXJhdGlvblRpbWUobGFuZSwgY3VycmVudFRpbWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZXhwaXJhdGlvblRpbWUgPD0gY3VycmVudFRpbWUpIHtcbiAgICAgIC8vIFRoaXMgbGFuZSBleHBpcmVkXG4gICAgICByb290LmV4cGlyZWRMYW5lcyB8PSBsYW5lO1xuICAgIH1cblxuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG59IC8vIFRoaXMgcmV0dXJucyB0aGUgaGlnaGVzdCBwcmlvcml0eSBwZW5kaW5nIGxhbmVzIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGV5XG4vLyBhcmUgc3VzcGVuZGVkLlxuXG5mdW5jdGlvbiBnZXRIaWdoZXN0UHJpb3JpdHlQZW5kaW5nTGFuZXMocm9vdCkge1xuICByZXR1cm4gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMocm9vdC5wZW5kaW5nTGFuZXMpO1xufVxuZnVuY3Rpb24gZ2V0TGFuZXNUb1JldHJ5U3luY2hyb25vdXNseU9uRXJyb3Iocm9vdCkge1xuICB2YXIgZXZlcnl0aGluZ0J1dE9mZnNjcmVlbiA9IHJvb3QucGVuZGluZ0xhbmVzICYgfk9mZnNjcmVlbkxhbmU7XG5cbiAgaWYgKGV2ZXJ5dGhpbmdCdXRPZmZzY3JlZW4gIT09IE5vTGFuZXMpIHtcbiAgICByZXR1cm4gZXZlcnl0aGluZ0J1dE9mZnNjcmVlbjtcbiAgfVxuXG4gIGlmIChldmVyeXRoaW5nQnV0T2Zmc2NyZWVuICYgT2Zmc2NyZWVuTGFuZSkge1xuICAgIHJldHVybiBPZmZzY3JlZW5MYW5lO1xuICB9XG5cbiAgcmV0dXJuIE5vTGFuZXM7XG59XG5mdW5jdGlvbiBpbmNsdWRlc1N5bmNMYW5lKGxhbmVzKSB7XG4gIHJldHVybiAobGFuZXMgJiBTeW5jTGFuZSkgIT09IE5vTGFuZXM7XG59XG5mdW5jdGlvbiBpbmNsdWRlc05vbklkbGVXb3JrKGxhbmVzKSB7XG4gIHJldHVybiAobGFuZXMgJiBOb25JZGxlTGFuZXMpICE9PSBOb0xhbmVzO1xufVxuZnVuY3Rpb24gaW5jbHVkZXNPbmx5UmV0cmllcyhsYW5lcykge1xuICByZXR1cm4gKGxhbmVzICYgUmV0cnlMYW5lcykgPT09IGxhbmVzO1xufVxuZnVuY3Rpb24gaW5jbHVkZXNPbmx5Tm9uVXJnZW50TGFuZXMobGFuZXMpIHtcbiAgdmFyIFVyZ2VudExhbmVzID0gU3luY0xhbmUgfCBJbnB1dENvbnRpbnVvdXNMYW5lIHwgRGVmYXVsdExhbmU7XG4gIHJldHVybiAobGFuZXMgJiBVcmdlbnRMYW5lcykgPT09IE5vTGFuZXM7XG59XG5mdW5jdGlvbiBpbmNsdWRlc09ubHlUcmFuc2l0aW9ucyhsYW5lcykge1xuICByZXR1cm4gKGxhbmVzICYgVHJhbnNpdGlvbkxhbmVzKSA9PT0gbGFuZXM7XG59XG5mdW5jdGlvbiBpbmNsdWRlc0Jsb2NraW5nTGFuZShyb290LCBsYW5lcykge1xuXG4gIHZhciBTeW5jRGVmYXVsdExhbmVzID0gSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZSB8IElucHV0Q29udGludW91c0xhbmUgfCBEZWZhdWx0SHlkcmF0aW9uTGFuZSB8IERlZmF1bHRMYW5lO1xuICByZXR1cm4gKGxhbmVzICYgU3luY0RlZmF1bHRMYW5lcykgIT09IE5vTGFuZXM7XG59XG5mdW5jdGlvbiBpbmNsdWRlc0V4cGlyZWRMYW5lKHJvb3QsIGxhbmVzKSB7XG4gIC8vIFRoaXMgaXMgYSBzZXBhcmF0ZSBjaGVjayBmcm9tIGluY2x1ZGVzQmxvY2tpbmdMYW5lIGJlY2F1c2UgYSBsYW5lIGNhblxuICAvLyBleHBpcmUgYWZ0ZXIgYSByZW5kZXIgaGFzIGFscmVhZHkgc3RhcnRlZC5cbiAgcmV0dXJuIChsYW5lcyAmIHJvb3QuZXhwaXJlZExhbmVzKSAhPT0gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGlzVHJhbnNpdGlvbkxhbmUobGFuZSkge1xuICByZXR1cm4gKGxhbmUgJiBUcmFuc2l0aW9uTGFuZXMpICE9PSBOb0xhbmVzO1xufVxuZnVuY3Rpb24gY2xhaW1OZXh0VHJhbnNpdGlvbkxhbmUoKSB7XG4gIC8vIEN5Y2xlIHRocm91Z2ggdGhlIGxhbmVzLCBhc3NpZ25pbmcgZWFjaCBuZXcgdHJhbnNpdGlvbiB0byB0aGUgbmV4dCBsYW5lLlxuICAvLyBJbiBtb3N0IGNhc2VzLCB0aGlzIG1lYW5zIGV2ZXJ5IHRyYW5zaXRpb24gZ2V0cyBpdHMgb3duIGxhbmUsIHVudGlsIHdlXG4gIC8vIHJ1biBvdXQgb2YgbGFuZXMgYW5kIGN5Y2xlIGJhY2sgdG8gdGhlIGJlZ2lubmluZy5cbiAgdmFyIGxhbmUgPSBuZXh0VHJhbnNpdGlvbkxhbmU7XG4gIG5leHRUcmFuc2l0aW9uTGFuZSA8PD0gMTtcblxuICBpZiAoKG5leHRUcmFuc2l0aW9uTGFuZSAmIFRyYW5zaXRpb25MYW5lcykgPT09IE5vTGFuZXMpIHtcbiAgICBuZXh0VHJhbnNpdGlvbkxhbmUgPSBUcmFuc2l0aW9uTGFuZTE7XG4gIH1cblxuICByZXR1cm4gbGFuZTtcbn1cbmZ1bmN0aW9uIGNsYWltTmV4dFJldHJ5TGFuZSgpIHtcbiAgdmFyIGxhbmUgPSBuZXh0UmV0cnlMYW5lO1xuICBuZXh0UmV0cnlMYW5lIDw8PSAxO1xuXG4gIGlmICgobmV4dFJldHJ5TGFuZSAmIFJldHJ5TGFuZXMpID09PSBOb0xhbmVzKSB7XG4gICAgbmV4dFJldHJ5TGFuZSA9IFJldHJ5TGFuZTE7XG4gIH1cblxuICByZXR1cm4gbGFuZTtcbn1cbmZ1bmN0aW9uIGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobGFuZXMpIHtcbiAgcmV0dXJuIGxhbmVzICYgLWxhbmVzO1xufVxuZnVuY3Rpb24gcGlja0FyYml0cmFyeUxhbmUobGFuZXMpIHtcbiAgLy8gVGhpcyB3cmFwcGVyIGZ1bmN0aW9uIGdldHMgaW5saW5lZC4gT25seSBleGlzdHMgc28gdG8gY29tbXVuaWNhdGUgdGhhdCBpdFxuICAvLyBkb2Vzbid0IG1hdHRlciB3aGljaCBiaXQgaXMgc2VsZWN0ZWQ7IHlvdSBjYW4gcGljayBhbnkgYml0IHdpdGhvdXRcbiAgLy8gYWZmZWN0aW5nIHRoZSBhbGdvcml0aG1zIHdoZXJlIGl0cyB1c2VkLiBIZXJlIEknbSB1c2luZ1xuICAvLyBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lIGJlY2F1c2UgaXQgcmVxdWlyZXMgdGhlIGZld2VzdCBvcGVyYXRpb25zLlxuICByZXR1cm4gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZShsYW5lcyk7XG59XG5cbmZ1bmN0aW9uIHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpIHtcbiAgcmV0dXJuIDMxIC0gY2x6MzIobGFuZXMpO1xufVxuXG5mdW5jdGlvbiBsYW5lVG9JbmRleChsYW5lKSB7XG4gIHJldHVybiBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmUpO1xufVxuXG5mdW5jdGlvbiBpbmNsdWRlc1NvbWVMYW5lKGEsIGIpIHtcbiAgcmV0dXJuIChhICYgYikgIT09IE5vTGFuZXM7XG59XG5mdW5jdGlvbiBpc1N1YnNldE9mTGFuZXMoc2V0LCBzdWJzZXQpIHtcbiAgcmV0dXJuIChzZXQgJiBzdWJzZXQpID09PSBzdWJzZXQ7XG59XG5mdW5jdGlvbiBtZXJnZUxhbmVzKGEsIGIpIHtcbiAgcmV0dXJuIGEgfCBiO1xufVxuZnVuY3Rpb24gcmVtb3ZlTGFuZXMoc2V0LCBzdWJzZXQpIHtcbiAgcmV0dXJuIHNldCAmIH5zdWJzZXQ7XG59XG5mdW5jdGlvbiBpbnRlcnNlY3RMYW5lcyhhLCBiKSB7XG4gIHJldHVybiBhICYgYjtcbn0gLy8gU2VlbXMgcmVkdW5kYW50LCBidXQgaXQgY2hhbmdlcyB0aGUgdHlwZSBmcm9tIGEgc2luZ2xlIGxhbmUgKHVzZWQgZm9yXG4vLyB1cGRhdGVzKSB0byBhIGdyb3VwIG9mIGxhbmVzICh1c2VkIGZvciBmbHVzaGluZyB3b3JrKS5cblxuZnVuY3Rpb24gbGFuZVRvTGFuZXMobGFuZSkge1xuICByZXR1cm4gbGFuZTtcbn1cbmZ1bmN0aW9uIGhpZ2hlclByaW9yaXR5TGFuZShhLCBiKSB7XG4gIC8vIFRoaXMgd29ya3MgYmVjYXVzZSB0aGUgYml0IHJhbmdlcyBkZWNyZWFzZSBpbiBwcmlvcml0eSBhcyB5b3UgZ28gbGVmdC5cbiAgcmV0dXJuIGEgIT09IE5vTGFuZSAmJiBhIDwgYiA/IGEgOiBiO1xufVxuZnVuY3Rpb24gY3JlYXRlTGFuZU1hcChpbml0aWFsKSB7XG4gIC8vIEludGVudGlvbmFsbHkgcHVzaGluZyBvbmUgYnkgb25lLlxuICAvLyBodHRwczovL3Y4LmRldi9ibG9nL2VsZW1lbnRzLWtpbmRzI2F2b2lkLWNyZWF0aW5nLWhvbGVzXG4gIHZhciBsYW5lTWFwID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBUb3RhbExhbmVzOyBpKyspIHtcbiAgICBsYW5lTWFwLnB1c2goaW5pdGlhbCk7XG4gIH1cblxuICByZXR1cm4gbGFuZU1hcDtcbn1cbmZ1bmN0aW9uIG1hcmtSb290VXBkYXRlZChyb290LCB1cGRhdGVMYW5lLCBldmVudFRpbWUpIHtcbiAgcm9vdC5wZW5kaW5nTGFuZXMgfD0gdXBkYXRlTGFuZTsgLy8gSWYgdGhlcmUgYXJlIGFueSBzdXNwZW5kZWQgdHJhbnNpdGlvbnMsIGl0J3MgcG9zc2libGUgdGhpcyBuZXcgdXBkYXRlXG4gIC8vIGNvdWxkIHVuYmxvY2sgdGhlbS4gQ2xlYXIgdGhlIHN1c3BlbmRlZCBsYW5lcyBzbyB0aGF0IHdlIGNhbiB0cnkgcmVuZGVyaW5nXG4gIC8vIHRoZW0gYWdhaW4uXG4gIC8vXG4gIC8vIFRPRE86IFdlIHJlYWxseSBvbmx5IG5lZWQgdG8gdW5zdXNwZW5kIG9ubHkgbGFuZXMgdGhhdCBhcmUgaW4gdGhlXG4gIC8vIGBzdWJ0cmVlTGFuZXNgIG9mIHRoZSB1cGRhdGVkIGZpYmVyLCBvciB0aGUgdXBkYXRlIGxhbmVzIG9mIHRoZSByZXR1cm5cbiAgLy8gcGF0aC4gVGhpcyB3b3VsZCBleGNsdWRlIHN1c3BlbmRlZCB1cGRhdGVzIGluIGFuIHVucmVsYXRlZCBzaWJsaW5nIHRyZWUsXG4gIC8vIHNpbmNlIHRoZXJlJ3Mgbm8gd2F5IGZvciB0aGlzIHVwZGF0ZSB0byB1bmJsb2NrIGl0LlxuICAvL1xuICAvLyBXZSBkb24ndCBkbyB0aGlzIGlmIHRoZSBpbmNvbWluZyB1cGRhdGUgaXMgaWRsZSwgYmVjYXVzZSB3ZSBuZXZlciBwcm9jZXNzXG4gIC8vIGlkbGUgdXBkYXRlcyB1bnRpbCBhZnRlciBhbGwgdGhlIHJlZ3VsYXIgdXBkYXRlcyBoYXZlIGZpbmlzaGVkOyB0aGVyZSdzIG5vXG4gIC8vIHdheSBpdCBjb3VsZCB1bmJsb2NrIGEgdHJhbnNpdGlvbi5cblxuICBpZiAodXBkYXRlTGFuZSAhPT0gSWRsZUxhbmUpIHtcbiAgICByb290LnN1c3BlbmRlZExhbmVzID0gTm9MYW5lcztcbiAgICByb290LnBpbmdlZExhbmVzID0gTm9MYW5lcztcbiAgfVxuXG4gIHZhciBldmVudFRpbWVzID0gcm9vdC5ldmVudFRpbWVzO1xuICB2YXIgaW5kZXggPSBsYW5lVG9JbmRleCh1cGRhdGVMYW5lKTsgLy8gV2UgY2FuIGFsd2F5cyBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgdGltZXN0YW1wIGJlY2F1c2Ugd2UgcHJlZmVyIHRoZSBtb3N0XG4gIC8vIHJlY2VudCBldmVudCwgYW5kIHdlIGFzc3VtZSB0aW1lIGlzIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZy5cblxuICBldmVudFRpbWVzW2luZGV4XSA9IGV2ZW50VGltZTtcbn1cbmZ1bmN0aW9uIG1hcmtSb290U3VzcGVuZGVkKHJvb3QsIHN1c3BlbmRlZExhbmVzKSB7XG4gIHJvb3Quc3VzcGVuZGVkTGFuZXMgfD0gc3VzcGVuZGVkTGFuZXM7XG4gIHJvb3QucGluZ2VkTGFuZXMgJj0gfnN1c3BlbmRlZExhbmVzOyAvLyBUaGUgc3VzcGVuZGVkIGxhbmVzIGFyZSBubyBsb25nZXIgQ1BVLWJvdW5kLiBDbGVhciB0aGVpciBleHBpcmF0aW9uIHRpbWVzLlxuXG4gIHZhciBleHBpcmF0aW9uVGltZXMgPSByb290LmV4cGlyYXRpb25UaW1lcztcbiAgdmFyIGxhbmVzID0gc3VzcGVuZGVkTGFuZXM7XG5cbiAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICBleHBpcmF0aW9uVGltZXNbaW5kZXhdID0gTm9UaW1lc3RhbXA7XG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtSb290UGluZ2VkKHJvb3QsIHBpbmdlZExhbmVzLCBldmVudFRpbWUpIHtcbiAgcm9vdC5waW5nZWRMYW5lcyB8PSByb290LnN1c3BlbmRlZExhbmVzICYgcGluZ2VkTGFuZXM7XG59XG5mdW5jdGlvbiBtYXJrUm9vdEZpbmlzaGVkKHJvb3QsIHJlbWFpbmluZ0xhbmVzKSB7XG4gIHZhciBub0xvbmdlclBlbmRpbmdMYW5lcyA9IHJvb3QucGVuZGluZ0xhbmVzICYgfnJlbWFpbmluZ0xhbmVzO1xuICByb290LnBlbmRpbmdMYW5lcyA9IHJlbWFpbmluZ0xhbmVzOyAvLyBMZXQncyB0cnkgZXZlcnl0aGluZyBhZ2FpblxuXG4gIHJvb3Quc3VzcGVuZGVkTGFuZXMgPSBOb0xhbmVzO1xuICByb290LnBpbmdlZExhbmVzID0gTm9MYW5lcztcbiAgcm9vdC5leHBpcmVkTGFuZXMgJj0gcmVtYWluaW5nTGFuZXM7XG4gIHJvb3QubXV0YWJsZVJlYWRMYW5lcyAmPSByZW1haW5pbmdMYW5lcztcbiAgcm9vdC5lbnRhbmdsZWRMYW5lcyAmPSByZW1haW5pbmdMYW5lcztcbiAgdmFyIGVudGFuZ2xlbWVudHMgPSByb290LmVudGFuZ2xlbWVudHM7XG4gIHZhciBldmVudFRpbWVzID0gcm9vdC5ldmVudFRpbWVzO1xuICB2YXIgZXhwaXJhdGlvblRpbWVzID0gcm9vdC5leHBpcmF0aW9uVGltZXM7IC8vIENsZWFyIHRoZSBsYW5lcyB0aGF0IG5vIGxvbmdlciBoYXZlIHBlbmRpbmcgd29ya1xuXG4gIHZhciBsYW5lcyA9IG5vTG9uZ2VyUGVuZGluZ0xhbmVzO1xuXG4gIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgZW50YW5nbGVtZW50c1tpbmRleF0gPSBOb0xhbmVzO1xuICAgIGV2ZW50VGltZXNbaW5kZXhdID0gTm9UaW1lc3RhbXA7XG4gICAgZXhwaXJhdGlvblRpbWVzW2luZGV4XSA9IE5vVGltZXN0YW1wO1xuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG59XG5mdW5jdGlvbiBtYXJrUm9vdEVudGFuZ2xlZChyb290LCBlbnRhbmdsZWRMYW5lcykge1xuICAvLyBJbiBhZGRpdGlvbiB0byBlbnRhbmdsaW5nIGVhY2ggb2YgdGhlIGdpdmVuIGxhbmVzIHdpdGggZWFjaCBvdGhlciwgd2UgYWxzb1xuICAvLyBoYXZlIHRvIGNvbnNpZGVyIF90cmFuc2l0aXZlXyBlbnRhbmdsZW1lbnRzLiBGb3IgZWFjaCBsYW5lIHRoYXQgaXMgYWxyZWFkeVxuICAvLyBlbnRhbmdsZWQgd2l0aCAqYW55KiBvZiB0aGUgZ2l2ZW4gbGFuZXMsIHRoYXQgbGFuZSBpcyBub3cgdHJhbnNpdGl2ZWx5XG4gIC8vIGVudGFuZ2xlZCB3aXRoICphbGwqIHRoZSBnaXZlbiBsYW5lcy5cbiAgLy9cbiAgLy8gVHJhbnNsYXRlZDogSWYgQyBpcyBlbnRhbmdsZWQgd2l0aCBBLCB0aGVuIGVudGFuZ2xpbmcgQSB3aXRoIEIgYWxzb1xuICAvLyBlbnRhbmdsZXMgQyB3aXRoIEIuXG4gIC8vXG4gIC8vIElmIHRoaXMgaXMgaGFyZCB0byBncmFzcCwgaXQgbWlnaHQgaGVscCB0byBpbnRlbnRpb25hbGx5IGJyZWFrIHRoaXNcbiAgLy8gZnVuY3Rpb24gYW5kIGxvb2sgYXQgdGhlIHRlc3RzIHRoYXQgZmFpbCBpbiBSZWFjdFRyYW5zaXRpb24tdGVzdC5qcy4gVHJ5XG4gIC8vIGNvbW1lbnRpbmcgb3V0IG9uZSBvZiB0aGUgY29uZGl0aW9ucyBiZWxvdy5cbiAgdmFyIHJvb3RFbnRhbmdsZWRMYW5lcyA9IHJvb3QuZW50YW5nbGVkTGFuZXMgfD0gZW50YW5nbGVkTGFuZXM7XG4gIHZhciBlbnRhbmdsZW1lbnRzID0gcm9vdC5lbnRhbmdsZW1lbnRzO1xuICB2YXIgbGFuZXMgPSByb290RW50YW5nbGVkTGFuZXM7XG5cbiAgd2hpbGUgKGxhbmVzKSB7XG4gICAgdmFyIGluZGV4ID0gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcyk7XG4gICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuXG4gICAgaWYgKCAvLyBJcyB0aGlzIG9uZSBvZiB0aGUgbmV3bHkgZW50YW5nbGVkIGxhbmVzP1xuICAgIGxhbmUgJiBlbnRhbmdsZWRMYW5lcyB8IC8vIElzIHRoaXMgbGFuZSB0cmFuc2l0aXZlbHkgZW50YW5nbGVkIHdpdGggdGhlIG5ld2x5IGVudGFuZ2xlZCBsYW5lcz9cbiAgICBlbnRhbmdsZW1lbnRzW2luZGV4XSAmIGVudGFuZ2xlZExhbmVzKSB7XG4gICAgICBlbnRhbmdsZW1lbnRzW2luZGV4XSB8PSBlbnRhbmdsZWRMYW5lcztcbiAgICB9XG5cbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0QnVtcGVkTGFuZUZvckh5ZHJhdGlvbihyb290LCByZW5kZXJMYW5lcykge1xuICB2YXIgcmVuZGVyTGFuZSA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmUocmVuZGVyTGFuZXMpO1xuICB2YXIgbGFuZTtcblxuICBzd2l0Y2ggKHJlbmRlckxhbmUpIHtcbiAgICBjYXNlIElucHV0Q29udGludW91c0xhbmU6XG4gICAgICBsYW5lID0gSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBEZWZhdWx0TGFuZTpcbiAgICAgIGxhbmUgPSBEZWZhdWx0SHlkcmF0aW9uTGFuZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTI6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTM6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTQ6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTU6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTY6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTc6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTg6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTk6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEwOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTI6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEzOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTU6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE2OlxuICAgIGNhc2UgUmV0cnlMYW5lMTpcbiAgICBjYXNlIFJldHJ5TGFuZTI6XG4gICAgY2FzZSBSZXRyeUxhbmUzOlxuICAgIGNhc2UgUmV0cnlMYW5lNDpcbiAgICBjYXNlIFJldHJ5TGFuZTU6XG4gICAgICBsYW5lID0gVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmU7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgSWRsZUxhbmU6XG4gICAgICBsYW5lID0gSWRsZUh5ZHJhdGlvbkxhbmU7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBFdmVyeXRoaW5nIGVsc2UgaXMgYWxyZWFkeSBlaXRoZXIgYSBoeWRyYXRpb24gbGFuZSwgb3Igc2hvdWxkbid0XG4gICAgICAvLyBiZSByZXRyaWVkIGF0IGEgaHlkcmF0aW9uIGxhbmUuXG4gICAgICBsYW5lID0gTm9MYW5lO1xuICAgICAgYnJlYWs7XG4gIH0gLy8gQ2hlY2sgaWYgdGhlIGxhbmUgd2UgY2hvc2UgaXMgc3VzcGVuZGVkLiBJZiBzbywgdGhhdCBpbmRpY2F0ZXMgdGhhdCB3ZVxuICAvLyBhbHJlYWR5IGF0dGVtcHRlZCBhbmQgZmFpbGVkIHRvIGh5ZHJhdGUgYXQgdGhhdCBsZXZlbC4gQWxzbyBjaGVjayBpZiB3ZSdyZVxuICAvLyBhbHJlYWR5IHJlbmRlcmluZyB0aGF0IGxhbmUsIHdoaWNoIGlzIHJhcmUgYnV0IGNvdWxkIGhhcHBlbi5cblxuXG4gIGlmICgobGFuZSAmIChyb290LnN1c3BlbmRlZExhbmVzIHwgcmVuZGVyTGFuZXMpKSAhPT0gTm9MYW5lKSB7XG4gICAgLy8gR2l2ZSB1cCB0cnlpbmcgdG8gaHlkcmF0ZSBhbmQgZmFsbCBiYWNrIHRvIGNsaWVudCByZW5kZXIuXG4gICAgcmV0dXJuIE5vTGFuZTtcbiAgfVxuXG4gIHJldHVybiBsYW5lO1xufVxuZnVuY3Rpb24gYWRkRmliZXJUb0xhbmVzTWFwKHJvb3QsIGZpYmVyLCBsYW5lcykge1xuXG4gIGlmICghaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgcGVuZGluZ1VwZGF0ZXJzTGFuZU1hcCA9IHJvb3QucGVuZGluZ1VwZGF0ZXJzTGFuZU1hcDtcblxuICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgdmFyIGluZGV4ID0gbGFuZVRvSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICB2YXIgdXBkYXRlcnMgPSBwZW5kaW5nVXBkYXRlcnNMYW5lTWFwW2luZGV4XTtcbiAgICB1cGRhdGVycy5hZGQoZmliZXIpO1xuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG59XG5mdW5jdGlvbiBtb3ZlUGVuZGluZ0ZpYmVyc1RvTWVtb2l6ZWQocm9vdCwgbGFuZXMpIHtcblxuICBpZiAoIWlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHBlbmRpbmdVcGRhdGVyc0xhbmVNYXAgPSByb290LnBlbmRpbmdVcGRhdGVyc0xhbmVNYXA7XG4gIHZhciBtZW1vaXplZFVwZGF0ZXJzID0gcm9vdC5tZW1vaXplZFVwZGF0ZXJzO1xuXG4gIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICB2YXIgaW5kZXggPSBsYW5lVG9JbmRleChsYW5lcyk7XG4gICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgIHZhciB1cGRhdGVycyA9IHBlbmRpbmdVcGRhdGVyc0xhbmVNYXBbaW5kZXhdO1xuXG4gICAgaWYgKHVwZGF0ZXJzLnNpemUgPiAwKSB7XG4gICAgICB1cGRhdGVycy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgICAgIGlmIChhbHRlcm5hdGUgPT09IG51bGwgfHwgIW1lbW9pemVkVXBkYXRlcnMuaGFzKGFsdGVybmF0ZSkpIHtcbiAgICAgICAgICBtZW1vaXplZFVwZGF0ZXJzLmFkZChmaWJlcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdXBkYXRlcnMuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0VHJhbnNpdGlvbnNGb3JMYW5lcyhyb290LCBsYW5lcykge1xuICB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxudmFyIERpc2NyZXRlRXZlbnRQcmlvcml0eSA9IFN5bmNMYW5lO1xudmFyIENvbnRpbnVvdXNFdmVudFByaW9yaXR5ID0gSW5wdXRDb250aW51b3VzTGFuZTtcbnZhciBEZWZhdWx0RXZlbnRQcmlvcml0eSA9IERlZmF1bHRMYW5lO1xudmFyIElkbGVFdmVudFByaW9yaXR5ID0gSWRsZUxhbmU7XG52YXIgY3VycmVudFVwZGF0ZVByaW9yaXR5ID0gTm9MYW5lO1xuZnVuY3Rpb24gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCkge1xuICByZXR1cm4gY3VycmVudFVwZGF0ZVByaW9yaXR5O1xufVxuZnVuY3Rpb24gc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KG5ld1ByaW9yaXR5KSB7XG4gIGN1cnJlbnRVcGRhdGVQcmlvcml0eSA9IG5ld1ByaW9yaXR5O1xufVxuZnVuY3Rpb24gcnVuV2l0aFByaW9yaXR5KHByaW9yaXR5LCBmbikge1xuICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IGN1cnJlbnRVcGRhdGVQcmlvcml0eTtcblxuICB0cnkge1xuICAgIGN1cnJlbnRVcGRhdGVQcmlvcml0eSA9IHByaW9yaXR5O1xuICAgIHJldHVybiBmbigpO1xuICB9IGZpbmFsbHkge1xuICAgIGN1cnJlbnRVcGRhdGVQcmlvcml0eSA9IHByZXZpb3VzUHJpb3JpdHk7XG4gIH1cbn1cbmZ1bmN0aW9uIGhpZ2hlckV2ZW50UHJpb3JpdHkoYSwgYikge1xuICByZXR1cm4gYSAhPT0gMCAmJiBhIDwgYiA/IGEgOiBiO1xufVxuZnVuY3Rpb24gbG93ZXJFdmVudFByaW9yaXR5KGEsIGIpIHtcbiAgcmV0dXJuIGEgPT09IDAgfHwgYSA+IGIgPyBhIDogYjtcbn1cbmZ1bmN0aW9uIGlzSGlnaGVyRXZlbnRQcmlvcml0eShhLCBiKSB7XG4gIHJldHVybiBhICE9PSAwICYmIGEgPCBiO1xufVxuZnVuY3Rpb24gbGFuZXNUb0V2ZW50UHJpb3JpdHkobGFuZXMpIHtcbiAgdmFyIGxhbmUgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKGxhbmVzKTtcblxuICBpZiAoIWlzSGlnaGVyRXZlbnRQcmlvcml0eShEaXNjcmV0ZUV2ZW50UHJpb3JpdHksIGxhbmUpKSB7XG4gICAgcmV0dXJuIERpc2NyZXRlRXZlbnRQcmlvcml0eTtcbiAgfVxuXG4gIGlmICghaXNIaWdoZXJFdmVudFByaW9yaXR5KENvbnRpbnVvdXNFdmVudFByaW9yaXR5LCBsYW5lKSkge1xuICAgIHJldHVybiBDb250aW51b3VzRXZlbnRQcmlvcml0eTtcbiAgfVxuXG4gIGlmIChpbmNsdWRlc05vbklkbGVXb3JrKGxhbmUpKSB7XG4gICAgcmV0dXJuIERlZmF1bHRFdmVudFByaW9yaXR5O1xuICB9XG5cbiAgcmV0dXJuIElkbGVFdmVudFByaW9yaXR5O1xufVxuXG4vLyBUaGlzIGlzIGltcG9ydGVkIGJ5IHRoZSBldmVudCByZXBsYXlpbmcgaW1wbGVtZW50YXRpb24gaW4gUmVhY3QgRE9NLiBJdCdzXG4vLyBpbiBhIHNlcGFyYXRlIGZpbGUgdG8gYnJlYWsgYSBjaXJjdWxhciBkZXBlbmRlbmN5IGJldHdlZW4gdGhlIHJlbmRlcmVyIGFuZFxuLy8gdGhlIHJlY29uY2lsZXIuXG5mdW5jdGlvbiBpc1Jvb3REZWh5ZHJhdGVkKHJvb3QpIHtcbiAgdmFyIGN1cnJlbnRTdGF0ZSA9IHJvb3QuY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICByZXR1cm4gY3VycmVudFN0YXRlLmlzRGVoeWRyYXRlZDtcbn1cblxudmFyIF9hdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb247XG5cbmZ1bmN0aW9uIHNldEF0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbihmbikge1xuICBfYXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uID0gZm47XG59XG5mdW5jdGlvbiBhdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24oZmliZXIpIHtcbiAgX2F0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbihmaWJlcik7XG59XG52YXIgYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb247XG5mdW5jdGlvbiBzZXRBdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbihmbikge1xuICBhdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbiA9IGZuO1xufVxudmFyIGF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eTtcbmZ1bmN0aW9uIHNldEF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eShmbikge1xuICBhdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkgPSBmbjtcbn1cbnZhciBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkkMTtcbmZ1bmN0aW9uIHNldEdldEN1cnJlbnRVcGRhdGVQcmlvcml0eShmbikge1xuICBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkkMSA9IGZuO1xufVxudmFyIGF0dGVtcHRIeWRyYXRpb25BdFByaW9yaXR5O1xuZnVuY3Rpb24gc2V0QXR0ZW1wdEh5ZHJhdGlvbkF0UHJpb3JpdHkoZm4pIHtcbiAgYXR0ZW1wdEh5ZHJhdGlvbkF0UHJpb3JpdHkgPSBmbjtcbn0gLy8gVE9ETzogVXBncmFkZSB0aGlzIGRlZmluaXRpb24gb25jZSB3ZSdyZSBvbiBhIG5ld2VyIHZlcnNpb24gb2YgRmxvdyB0aGF0XG4vLyBoYXMgdGhpcyBkZWZpbml0aW9uIGJ1aWx0LWluLlxuXG52YXIgaGFzU2NoZWR1bGVkUmVwbGF5QXR0ZW1wdCA9IGZhbHNlOyAvLyBUaGUgcXVldWUgb2YgZGlzY3JldGUgZXZlbnRzIHRvIGJlIHJlcGxheWVkLlxuXG52YXIgcXVldWVkRGlzY3JldGVFdmVudHMgPSBbXTsgLy8gSW5kaWNhdGVzIGlmIGFueSBjb250aW51b3VzIGV2ZW50IHRhcmdldHMgYXJlIG5vbi1udWxsIGZvciBlYXJseSBiYWlsb3V0LlxuLy8gaWYgdGhlIGxhc3QgdGFyZ2V0IHdhcyBkZWh5ZHJhdGVkLlxuXG52YXIgcXVldWVkRm9jdXMgPSBudWxsO1xudmFyIHF1ZXVlZERyYWcgPSBudWxsO1xudmFyIHF1ZXVlZE1vdXNlID0gbnVsbDsgLy8gRm9yIHBvaW50ZXIgZXZlbnRzIHRoZXJlIGNhbiBiZSBvbmUgbGF0ZXN0IGV2ZW50IHBlciBwb2ludGVySWQuXG5cbnZhciBxdWV1ZWRQb2ludGVycyA9IG5ldyBNYXAoKTtcbnZhciBxdWV1ZWRQb2ludGVyQ2FwdHVyZXMgPSBuZXcgTWFwKCk7IC8vIFdlIGNvdWxkIGNvbnNpZGVyIHJlcGxheWluZyBzZWxlY3Rpb25jaGFuZ2UgYW5kIHRvdWNobW92ZXMgdG9vLlxuXG52YXIgcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzID0gW107XG52YXIgZGlzY3JldGVSZXBsYXlhYmxlRXZlbnRzID0gWydtb3VzZWRvd24nLCAnbW91c2V1cCcsICd0b3VjaGNhbmNlbCcsICd0b3VjaGVuZCcsICd0b3VjaHN0YXJ0JywgJ2F1eGNsaWNrJywgJ2RibGNsaWNrJywgJ3BvaW50ZXJjYW5jZWwnLCAncG9pbnRlcmRvd24nLCAncG9pbnRlcnVwJywgJ2RyYWdlbmQnLCAnZHJhZ3N0YXJ0JywgJ2Ryb3AnLCAnY29tcG9zaXRpb25lbmQnLCAnY29tcG9zaXRpb25zdGFydCcsICdrZXlkb3duJywgJ2tleXByZXNzJywgJ2tleXVwJywgJ2lucHV0JywgJ3RleHRJbnB1dCcsIC8vIEludGVudGlvbmFsbHkgY2FtZWxDYXNlXG4nY29weScsICdjdXQnLCAncGFzdGUnLCAnY2xpY2snLCAnY2hhbmdlJywgJ2NvbnRleHRtZW51JywgJ3Jlc2V0JywgJ3N1Ym1pdCddO1xuZnVuY3Rpb24gaXNEaXNjcmV0ZUV2ZW50VGhhdFJlcXVpcmVzSHlkcmF0aW9uKGV2ZW50VHlwZSkge1xuICByZXR1cm4gZGlzY3JldGVSZXBsYXlhYmxlRXZlbnRzLmluZGV4T2YoZXZlbnRUeXBlKSA+IC0xO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVRdWV1ZWRSZXBsYXlhYmxlRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIHtcbiAgICBibG9ja2VkT246IGJsb2NrZWRPbixcbiAgICBkb21FdmVudE5hbWU6IGRvbUV2ZW50TmFtZSxcbiAgICBldmVudFN5c3RlbUZsYWdzOiBldmVudFN5c3RlbUZsYWdzLFxuICAgIG5hdGl2ZUV2ZW50OiBuYXRpdmVFdmVudCxcbiAgICB0YXJnZXRDb250YWluZXJzOiBbdGFyZ2V0Q29udGFpbmVyXVxuICB9O1xufVxuXG5mdW5jdGlvbiBjbGVhcklmQ29udGludW91c0V2ZW50KGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpIHtcbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdmb2N1c2luJzpcbiAgICBjYXNlICdmb2N1c291dCc6XG4gICAgICBxdWV1ZWRGb2N1cyA9IG51bGw7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2RyYWdlbnRlcic6XG4gICAgY2FzZSAnZHJhZ2xlYXZlJzpcbiAgICAgIHF1ZXVlZERyYWcgPSBudWxsO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdtb3VzZW92ZXInOlxuICAgIGNhc2UgJ21vdXNlb3V0JzpcbiAgICAgIHF1ZXVlZE1vdXNlID0gbnVsbDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAncG9pbnRlcm92ZXInOlxuICAgIGNhc2UgJ3BvaW50ZXJvdXQnOlxuICAgICAge1xuICAgICAgICB2YXIgcG9pbnRlcklkID0gbmF0aXZlRXZlbnQucG9pbnRlcklkO1xuICAgICAgICBxdWV1ZWRQb2ludGVycy5kZWxldGUocG9pbnRlcklkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlICdnb3Rwb2ludGVyY2FwdHVyZSc6XG4gICAgY2FzZSAnbG9zdHBvaW50ZXJjYXB0dXJlJzpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9wb2ludGVySWQgPSBuYXRpdmVFdmVudC5wb2ludGVySWQ7XG4gICAgICAgIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5kZWxldGUoX3BvaW50ZXJJZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQoZXhpc3RpbmdRdWV1ZWRFdmVudCwgYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgaWYgKGV4aXN0aW5nUXVldWVkRXZlbnQgPT09IG51bGwgfHwgZXhpc3RpbmdRdWV1ZWRFdmVudC5uYXRpdmVFdmVudCAhPT0gbmF0aXZlRXZlbnQpIHtcbiAgICB2YXIgcXVldWVkRXZlbnQgPSBjcmVhdGVRdWV1ZWRSZXBsYXlhYmxlRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuXG4gICAgaWYgKGJsb2NrZWRPbiAhPT0gbnVsbCkge1xuICAgICAgdmFyIF9maWJlcjIgPSBnZXRJbnN0YW5jZUZyb21Ob2RlKGJsb2NrZWRPbik7XG5cbiAgICAgIGlmIChfZmliZXIyICE9PSBudWxsKSB7XG4gICAgICAgIC8vIEF0dGVtcHQgdG8gaW5jcmVhc2UgdGhlIHByaW9yaXR5IG9mIHRoaXMgdGFyZ2V0LlxuICAgICAgICBhdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbihfZmliZXIyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcXVldWVkRXZlbnQ7XG4gIH0gLy8gSWYgd2UgaGF2ZSBhbHJlYWR5IHF1ZXVlZCB0aGlzIGV4YWN0IGV2ZW50LCB0aGVuIGl0J3MgYmVjYXVzZVxuICAvLyB0aGUgZGlmZmVyZW50IGV2ZW50IHN5c3RlbXMgaGF2ZSBkaWZmZXJlbnQgRE9NIGV2ZW50IGxpc3RlbmVycy5cbiAgLy8gV2UgY2FuIGFjY3VtdWxhdGUgdGhlIGZsYWdzLCBhbmQgdGhlIHRhcmdldENvbnRhaW5lcnMsIGFuZFxuICAvLyBzdG9yZSBhIHNpbmdsZSBldmVudCB0byBiZSByZXBsYXllZC5cblxuXG4gIGV4aXN0aW5nUXVldWVkRXZlbnQuZXZlbnRTeXN0ZW1GbGFncyB8PSBldmVudFN5c3RlbUZsYWdzO1xuICB2YXIgdGFyZ2V0Q29udGFpbmVycyA9IGV4aXN0aW5nUXVldWVkRXZlbnQudGFyZ2V0Q29udGFpbmVycztcblxuICBpZiAodGFyZ2V0Q29udGFpbmVyICE9PSBudWxsICYmIHRhcmdldENvbnRhaW5lcnMuaW5kZXhPZih0YXJnZXRDb250YWluZXIpID09PSAtMSkge1xuICAgIHRhcmdldENvbnRhaW5lcnMucHVzaCh0YXJnZXRDb250YWluZXIpO1xuICB9XG5cbiAgcmV0dXJuIGV4aXN0aW5nUXVldWVkRXZlbnQ7XG59XG5cbmZ1bmN0aW9uIHF1ZXVlSWZDb250aW51b3VzRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgLy8gVGhlc2Ugc2V0IHJlbGF0ZWRUYXJnZXQgdG8gbnVsbCBiZWNhdXNlIHRoZSByZXBsYXllZCBldmVudCB3aWxsIGJlIHRyZWF0ZWQgYXMgaWYgd2VcbiAgLy8gbW92ZWQgZnJvbSBvdXRzaWRlIHRoZSB3aW5kb3cgKG5vIHRhcmdldCkgb250byB0aGUgdGFyZ2V0IG9uY2UgaXQgaHlkcmF0ZXMuXG4gIC8vIEluc3RlYWQgb2YgbXV0YXRpbmcgd2UgY291bGQgY2xvbmUgdGhlIGV2ZW50LlxuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ2ZvY3VzaW4nOlxuICAgICAge1xuICAgICAgICB2YXIgZm9jdXNFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgICAgICBxdWV1ZWRGb2N1cyA9IGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQocXVldWVkRm9jdXMsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIGZvY3VzRXZlbnQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgIGNhc2UgJ2RyYWdlbnRlcic6XG4gICAgICB7XG4gICAgICAgIHZhciBkcmFnRXZlbnQgPSBuYXRpdmVFdmVudDtcbiAgICAgICAgcXVldWVkRHJhZyA9IGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQocXVldWVkRHJhZywgYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgZHJhZ0V2ZW50KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICBjYXNlICdtb3VzZW92ZXInOlxuICAgICAge1xuICAgICAgICB2YXIgbW91c2VFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgICAgICBxdWV1ZWRNb3VzZSA9IGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQocXVldWVkTW91c2UsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG1vdXNlRXZlbnQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgIGNhc2UgJ3BvaW50ZXJvdmVyJzpcbiAgICAgIHtcbiAgICAgICAgdmFyIHBvaW50ZXJFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgICAgICB2YXIgcG9pbnRlcklkID0gcG9pbnRlckV2ZW50LnBvaW50ZXJJZDtcbiAgICAgICAgcXVldWVkUG9pbnRlcnMuc2V0KHBvaW50ZXJJZCwgYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChxdWV1ZWRQb2ludGVycy5nZXQocG9pbnRlcklkKSB8fCBudWxsLCBibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBwb2ludGVyRXZlbnQpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICBjYXNlICdnb3Rwb2ludGVyY2FwdHVyZSc6XG4gICAgICB7XG4gICAgICAgIHZhciBfcG9pbnRlckV2ZW50ID0gbmF0aXZlRXZlbnQ7XG4gICAgICAgIHZhciBfcG9pbnRlcklkMiA9IF9wb2ludGVyRXZlbnQucG9pbnRlcklkO1xuICAgICAgICBxdWV1ZWRQb2ludGVyQ2FwdHVyZXMuc2V0KF9wb2ludGVySWQyLCBhY2N1bXVsYXRlT3JDcmVhdGVDb250aW51b3VzUXVldWVkUmVwbGF5YWJsZUV2ZW50KHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5nZXQoX3BvaW50ZXJJZDIpIHx8IG51bGwsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIF9wb2ludGVyRXZlbnQpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59IC8vIENoZWNrIGlmIHRoaXMgdGFyZ2V0IGlzIHVuYmxvY2tlZC4gUmV0dXJucyB0cnVlIGlmIGl0J3MgdW5ibG9ja2VkLlxuXG5mdW5jdGlvbiBhdHRlbXB0RXhwbGljaXRIeWRyYXRpb25UYXJnZXQocXVldWVkVGFyZ2V0KSB7XG4gIC8vIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hhcmVzIGEgbG90IG9mIGxvZ2ljIHdpdGggZmluZEluc3RhbmNlQmxvY2tpbmdFdmVudC5cbiAgLy8gVHJ5IHRvIHVuaWZ5IHRoZW0uIEl0J3MgYSBiaXQgdHJpY2t5IHNpbmNlIGl0IHdvdWxkIHJlcXVpcmUgdHdvIHJldHVyblxuICAvLyB2YWx1ZXMuXG4gIHZhciB0YXJnZXRJbnN0ID0gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUocXVldWVkVGFyZ2V0LnRhcmdldCk7XG5cbiAgaWYgKHRhcmdldEluc3QgIT09IG51bGwpIHtcbiAgICB2YXIgbmVhcmVzdE1vdW50ZWQgPSBnZXROZWFyZXN0TW91bnRlZEZpYmVyKHRhcmdldEluc3QpO1xuXG4gICAgaWYgKG5lYXJlc3RNb3VudGVkICE9PSBudWxsKSB7XG4gICAgICB2YXIgdGFnID0gbmVhcmVzdE1vdW50ZWQudGFnO1xuXG4gICAgICBpZiAodGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBnZXRTdXNwZW5zZUluc3RhbmNlRnJvbUZpYmVyKG5lYXJlc3RNb3VudGVkKTtcblxuICAgICAgICBpZiAoaW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSdyZSBibG9ja2VkIG9uIGh5ZHJhdGluZyB0aGlzIGJvdW5kYXJ5LlxuICAgICAgICAgIC8vIEluY3JlYXNlIGl0cyBwcmlvcml0eS5cbiAgICAgICAgICBxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID0gaW5zdGFuY2U7XG4gICAgICAgICAgYXR0ZW1wdEh5ZHJhdGlvbkF0UHJpb3JpdHkocXVldWVkVGFyZ2V0LnByaW9yaXR5LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBhdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkobmVhcmVzdE1vdW50ZWQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0YWcgPT09IEhvc3RSb290KSB7XG4gICAgICAgIHZhciByb290ID0gbmVhcmVzdE1vdW50ZWQuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmIChpc1Jvb3REZWh5ZHJhdGVkKHJvb3QpKSB7XG4gICAgICAgICAgcXVldWVkVGFyZ2V0LmJsb2NrZWRPbiA9IGdldENvbnRhaW5lckZyb21GaWJlcihuZWFyZXN0TW91bnRlZCk7IC8vIFdlIGRvbid0IGN1cnJlbnRseSBoYXZlIGEgd2F5IHRvIGluY3JlYXNlIHRoZSBwcmlvcml0eSBvZlxuICAgICAgICAgIC8vIGEgcm9vdCBvdGhlciB0aGFuIHN5bmMuXG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gcXVldWVFeHBsaWNpdEh5ZHJhdGlvblRhcmdldCh0YXJnZXQpIHtcbiAgLy8gVE9ETzogVGhpcyB3aWxsIHJlYWQgdGhlIHByaW9yaXR5IGlmIGl0J3MgZGlzcGF0Y2hlZCBieSB0aGUgUmVhY3RcbiAgLy8gZXZlbnQgc3lzdGVtIGJ1dCBub3QgbmF0aXZlIGV2ZW50cy4gU2hvdWxkIHJlYWQgd2luZG93LmV2ZW50LnR5cGUsIGxpa2VcbiAgLy8gd2UgZG8gZm9yIHVwZGF0ZXMgKGdldEN1cnJlbnRFdmVudFByaW9yaXR5KS5cbiAgdmFyIHVwZGF0ZVByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5JDEoKTtcbiAgdmFyIHF1ZXVlZFRhcmdldCA9IHtcbiAgICBibG9ja2VkT246IG51bGwsXG4gICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgcHJpb3JpdHk6IHVwZGF0ZVByaW9yaXR5XG4gIH07XG4gIHZhciBpID0gMDtcblxuICBmb3IgKDsgaSA8IHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0cy5sZW5ndGg7IGkrKykge1xuICAgIC8vIFN0b3Agb25jZSB3ZSBoaXQgdGhlIGZpcnN0IHRhcmdldCB3aXRoIGxvd2VyIHByaW9yaXR5IHRoYW5cbiAgICBpZiAoIWlzSGlnaGVyRXZlbnRQcmlvcml0eSh1cGRhdGVQcmlvcml0eSwgcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzW2ldLnByaW9yaXR5KSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzLnNwbGljZShpLCAwLCBxdWV1ZWRUYXJnZXQpO1xuXG4gIGlmIChpID09PSAwKSB7XG4gICAgYXR0ZW1wdEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0KHF1ZXVlZFRhcmdldCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudChxdWV1ZWRFdmVudCkge1xuICBpZiAocXVldWVkRXZlbnQuYmxvY2tlZE9uICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIHRhcmdldENvbnRhaW5lcnMgPSBxdWV1ZWRFdmVudC50YXJnZXRDb250YWluZXJzO1xuXG4gIHdoaWxlICh0YXJnZXRDb250YWluZXJzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgdGFyZ2V0Q29udGFpbmVyID0gdGFyZ2V0Q29udGFpbmVyc1swXTtcbiAgICB2YXIgbmV4dEJsb2NrZWRPbiA9IGZpbmRJbnN0YW5jZUJsb2NraW5nRXZlbnQocXVldWVkRXZlbnQuZG9tRXZlbnROYW1lLCBxdWV1ZWRFdmVudC5ldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIHF1ZXVlZEV2ZW50Lm5hdGl2ZUV2ZW50KTtcblxuICAgIGlmIChuZXh0QmxvY2tlZE9uID09PSBudWxsKSB7XG4gICAgICB7XG4gICAgICAgIHZhciBuYXRpdmVFdmVudCA9IHF1ZXVlZEV2ZW50Lm5hdGl2ZUV2ZW50O1xuICAgICAgICB2YXIgbmF0aXZlRXZlbnRDbG9uZSA9IG5ldyBuYXRpdmVFdmVudC5jb25zdHJ1Y3RvcihuYXRpdmVFdmVudC50eXBlLCBuYXRpdmVFdmVudCk7XG4gICAgICAgIHNldFJlcGxheWluZ0V2ZW50KG5hdGl2ZUV2ZW50Q2xvbmUpO1xuICAgICAgICBuYXRpdmVFdmVudC50YXJnZXQuZGlzcGF0Y2hFdmVudChuYXRpdmVFdmVudENsb25lKTtcbiAgICAgICAgcmVzZXRSZXBsYXlpbmdFdmVudCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBXZSdyZSBzdGlsbCBibG9ja2VkLiBUcnkgYWdhaW4gbGF0ZXIuXG4gICAgICB2YXIgX2ZpYmVyMyA9IGdldEluc3RhbmNlRnJvbU5vZGUobmV4dEJsb2NrZWRPbik7XG5cbiAgICAgIGlmIChfZmliZXIzICE9PSBudWxsKSB7XG4gICAgICAgIGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uKF9maWJlcjMpO1xuICAgICAgfVxuXG4gICAgICBxdWV1ZWRFdmVudC5ibG9ja2VkT24gPSBuZXh0QmxvY2tlZE9uO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gVGhpcyB0YXJnZXQgY29udGFpbmVyIHdhcyBzdWNjZXNzZnVsbHkgZGlzcGF0Y2hlZC4gVHJ5IHRoZSBuZXh0LlxuXG5cbiAgICB0YXJnZXRDb250YWluZXJzLnNoaWZ0KCk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudEluTWFwKHF1ZXVlZEV2ZW50LCBrZXksIG1hcCkge1xuICBpZiAoYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudChxdWV1ZWRFdmVudCkpIHtcbiAgICBtYXAuZGVsZXRlKGtleSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVwbGF5VW5ibG9ja2VkRXZlbnRzKCkge1xuICBoYXNTY2hlZHVsZWRSZXBsYXlBdHRlbXB0ID0gZmFsc2U7XG5cblxuICBpZiAocXVldWVkRm9jdXMgIT09IG51bGwgJiYgYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudChxdWV1ZWRGb2N1cykpIHtcbiAgICBxdWV1ZWRGb2N1cyA9IG51bGw7XG4gIH1cblxuICBpZiAocXVldWVkRHJhZyAhPT0gbnVsbCAmJiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZERyYWcpKSB7XG4gICAgcXVldWVkRHJhZyA9IG51bGw7XG4gIH1cblxuICBpZiAocXVldWVkTW91c2UgIT09IG51bGwgJiYgYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudChxdWV1ZWRNb3VzZSkpIHtcbiAgICBxdWV1ZWRNb3VzZSA9IG51bGw7XG4gIH1cblxuICBxdWV1ZWRQb2ludGVycy5mb3JFYWNoKGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnRJbk1hcCk7XG4gIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5mb3JFYWNoKGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnRJbk1hcCk7XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWRFdmVudCwgdW5ibG9ja2VkKSB7XG4gIGlmIChxdWV1ZWRFdmVudC5ibG9ja2VkT24gPT09IHVuYmxvY2tlZCkge1xuICAgIHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiA9IG51bGw7XG5cbiAgICBpZiAoIWhhc1NjaGVkdWxlZFJlcGxheUF0dGVtcHQpIHtcbiAgICAgIGhhc1NjaGVkdWxlZFJlcGxheUF0dGVtcHQgPSB0cnVlOyAvLyBTY2hlZHVsZSBhIGNhbGxiYWNrIHRvIGF0dGVtcHQgcmVwbGF5aW5nIGFzIG1hbnkgZXZlbnRzIGFzIGFyZVxuICAgICAgLy8gbm93IHVuYmxvY2tlZC4gVGhpcyBmaXJzdCBtaWdodCBub3QgYWN0dWFsbHkgYmUgdW5ibG9ja2VkIHlldC5cbiAgICAgIC8vIFdlIGNvdWxkIGNoZWNrIGl0IGVhcmx5IHRvIGF2b2lkIHNjaGVkdWxpbmcgYW4gdW5uZWNlc3NhcnkgY2FsbGJhY2suXG5cbiAgICAgIFNjaGVkdWxlci51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrKFNjaGVkdWxlci51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eSwgcmVwbGF5VW5ibG9ja2VkRXZlbnRzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmV0cnlJZkJsb2NrZWRPbih1bmJsb2NrZWQpIHtcbiAgLy8gTWFyayBhbnl0aGluZyB0aGF0IHdhcyBibG9ja2VkIG9uIHRoaXMgYXMgbm8gbG9uZ2VyIGJsb2NrZWRcbiAgLy8gYW5kIGVsaWdpYmxlIGZvciBhIHJlcGxheS5cbiAgaWYgKHF1ZXVlZERpc2NyZXRlRXZlbnRzLmxlbmd0aCA+IDApIHtcbiAgICBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkRGlzY3JldGVFdmVudHNbMF0sIHVuYmxvY2tlZCk7IC8vIFRoaXMgaXMgYSBleHBvbmVudGlhbCBzZWFyY2ggZm9yIGVhY2ggYm91bmRhcnkgdGhhdCBjb21taXRzLiBJIHRoaW5rIGl0J3NcbiAgICAvLyB3b3J0aCBpdCBiZWNhdXNlIHdlIGV4cGVjdCB2ZXJ5IGZldyBkaXNjcmV0ZSBldmVudHMgdG8gcXVldWUgdXAgYW5kIG9uY2VcbiAgICAvLyB3ZSBhcmUgYWN0dWFsbHkgZnVsbHkgdW5ibG9ja2VkIGl0IHdpbGwgYmUgZmFzdCB0byByZXBsYXkgdGhlbS5cblxuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgcXVldWVkRGlzY3JldGVFdmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWV1ZWRFdmVudCA9IHF1ZXVlZERpc2NyZXRlRXZlbnRzW2ldO1xuXG4gICAgICBpZiAocXVldWVkRXZlbnQuYmxvY2tlZE9uID09PSB1bmJsb2NrZWQpIHtcbiAgICAgICAgcXVldWVkRXZlbnQuYmxvY2tlZE9uID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAocXVldWVkRm9jdXMgIT09IG51bGwpIHtcbiAgICBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkRm9jdXMsIHVuYmxvY2tlZCk7XG4gIH1cblxuICBpZiAocXVldWVkRHJhZyAhPT0gbnVsbCkge1xuICAgIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWREcmFnLCB1bmJsb2NrZWQpO1xuICB9XG5cbiAgaWYgKHF1ZXVlZE1vdXNlICE9PSBudWxsKSB7XG4gICAgc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZE1vdXNlLCB1bmJsb2NrZWQpO1xuICB9XG5cbiAgdmFyIHVuYmxvY2sgPSBmdW5jdGlvbiAocXVldWVkRXZlbnQpIHtcbiAgICByZXR1cm4gc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZEV2ZW50LCB1bmJsb2NrZWQpO1xuICB9O1xuXG4gIHF1ZXVlZFBvaW50ZXJzLmZvckVhY2godW5ibG9jayk7XG4gIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5mb3JFYWNoKHVuYmxvY2spO1xuXG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIHF1ZXVlZFRhcmdldCA9IHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0c1tfaV07XG5cbiAgICBpZiAocXVldWVkVGFyZ2V0LmJsb2NrZWRPbiA9PT0gdW5ibG9ja2VkKSB7XG4gICAgICBxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICB3aGlsZSAocXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgbmV4dEV4cGxpY2l0VGFyZ2V0ID0gcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzWzBdO1xuXG4gICAgaWYgKG5leHRFeHBsaWNpdFRhcmdldC5ibG9ja2VkT24gIT09IG51bGwpIHtcbiAgICAgIC8vIFdlJ3JlIHN0aWxsIGJsb2NrZWQuXG4gICAgICBicmVhaztcbiAgICB9IGVsc2Uge1xuICAgICAgYXR0ZW1wdEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0KG5leHRFeHBsaWNpdFRhcmdldCk7XG5cbiAgICAgIGlmIChuZXh0RXhwbGljaXRUYXJnZXQuYmxvY2tlZE9uID09PSBudWxsKSB7XG4gICAgICAgIC8vIFdlJ3JlIHVuYmxvY2tlZC5cbiAgICAgICAgcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzLnNoaWZ0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnOyAvLyBUT0RPOiBjYW4gd2Ugc3RvcCBleHBvcnRpbmcgdGhlc2U/XG5cbnZhciBfZW5hYmxlZCA9IHRydWU7IC8vIFRoaXMgaXMgZXhwb3J0ZWQgaW4gRkIgYnVpbGRzIGZvciB1c2UgYnkgbGVnYWN5IEZCIGxheWVyIGluZnJhLlxuLy8gV2UnZCBsaWtlIHRvIHJlbW92ZSB0aGlzIGJ1dCBpdCdzIG5vdCBjbGVhciBpZiB0aGlzIGlzIHNhZmUuXG5cbmZ1bmN0aW9uIHNldEVuYWJsZWQoZW5hYmxlZCkge1xuICBfZW5hYmxlZCA9ICEhZW5hYmxlZDtcbn1cbmZ1bmN0aW9uIGlzRW5hYmxlZCgpIHtcbiAgcmV0dXJuIF9lbmFibGVkO1xufVxuZnVuY3Rpb24gY3JlYXRlRXZlbnRMaXN0ZW5lcldyYXBwZXJXaXRoUHJpb3JpdHkodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MpIHtcbiAgdmFyIGV2ZW50UHJpb3JpdHkgPSBnZXRFdmVudFByaW9yaXR5KGRvbUV2ZW50TmFtZSk7XG4gIHZhciBsaXN0ZW5lcldyYXBwZXI7XG5cbiAgc3dpdGNoIChldmVudFByaW9yaXR5KSB7XG4gICAgY2FzZSBEaXNjcmV0ZUV2ZW50UHJpb3JpdHk6XG4gICAgICBsaXN0ZW5lcldyYXBwZXIgPSBkaXNwYXRjaERpc2NyZXRlRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgQ29udGludW91c0V2ZW50UHJpb3JpdHk6XG4gICAgICBsaXN0ZW5lcldyYXBwZXIgPSBkaXNwYXRjaENvbnRpbnVvdXNFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBEZWZhdWx0RXZlbnRQcmlvcml0eTpcbiAgICBkZWZhdWx0OlxuICAgICAgbGlzdGVuZXJXcmFwcGVyID0gZGlzcGF0Y2hFdmVudDtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIGxpc3RlbmVyV3JhcHBlci5iaW5kKG51bGwsIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hEaXNjcmV0ZUV2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgY29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uO1xuICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uID0gbnVsbDtcblxuICB0cnkge1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShEaXNjcmV0ZUV2ZW50UHJpb3JpdHkpO1xuICAgIGRpc3BhdGNoRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBjb250YWluZXIsIG5hdGl2ZUV2ZW50KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSk7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoQ29udGludW91c0V2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgY29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uO1xuICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uID0gbnVsbDtcblxuICB0cnkge1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShDb250aW51b3VzRXZlbnRQcmlvcml0eSk7XG4gICAgZGlzcGF0Y2hFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGNvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuICB9IGZpbmFsbHkge1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5KTtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgaWYgKCFfZW5hYmxlZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHtcbiAgICBkaXNwYXRjaEV2ZW50V2l0aEVuYWJsZUNhcHR1cmVQaGFzZVNlbGVjdGl2ZUh5ZHJhdGlvbldpdGhvdXREaXNjcmV0ZUV2ZW50UmVwbGF5KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hFdmVudFdpdGhFbmFibGVDYXB0dXJlUGhhc2VTZWxlY3RpdmVIeWRyYXRpb25XaXRob3V0RGlzY3JldGVFdmVudFJlcGxheShkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgdmFyIGJsb2NrZWRPbiA9IGZpbmRJbnN0YW5jZUJsb2NraW5nRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KTtcblxuICBpZiAoYmxvY2tlZE9uID09PSBudWxsKSB7XG4gICAgZGlzcGF0Y2hFdmVudEZvclBsdWdpbkV2ZW50U3lzdGVtKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIHJldHVybl90YXJnZXRJbnN0LCB0YXJnZXRDb250YWluZXIpO1xuICAgIGNsZWFySWZDb250aW51b3VzRXZlbnQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHF1ZXVlSWZDb250aW51b3VzRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpKSB7XG4gICAgbmF0aXZlRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgcmV0dXJuO1xuICB9IC8vIFdlIG5lZWQgdG8gY2xlYXIgb25seSBpZiB3ZSBkaWRuJ3QgcXVldWUgYmVjYXVzZVxuICAvLyBxdWV1ZWluZyBpcyBhY2N1bXVsYXRpdmUuXG5cblxuICBjbGVhcklmQ29udGludW91c0V2ZW50KGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpO1xuXG4gIGlmIChldmVudFN5c3RlbUZsYWdzICYgSVNfQ0FQVFVSRV9QSEFTRSAmJiBpc0Rpc2NyZXRlRXZlbnRUaGF0UmVxdWlyZXNIeWRyYXRpb24oZG9tRXZlbnROYW1lKSkge1xuICAgIHdoaWxlIChibG9ja2VkT24gIT09IG51bGwpIHtcbiAgICAgIHZhciBmaWJlciA9IGdldEluc3RhbmNlRnJvbU5vZGUoYmxvY2tlZE9uKTtcblxuICAgICAgaWYgKGZpYmVyICE9PSBudWxsKSB7XG4gICAgICAgIGF0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbihmaWJlcik7XG4gICAgICB9XG5cbiAgICAgIHZhciBuZXh0QmxvY2tlZE9uID0gZmluZEluc3RhbmNlQmxvY2tpbmdFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuXG4gICAgICBpZiAobmV4dEJsb2NrZWRPbiA9PT0gbnVsbCkge1xuICAgICAgICBkaXNwYXRjaEV2ZW50Rm9yUGx1Z2luRXZlbnRTeXN0ZW0oZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBuYXRpdmVFdmVudCwgcmV0dXJuX3RhcmdldEluc3QsIHRhcmdldENvbnRhaW5lcik7XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXh0QmxvY2tlZE9uID09PSBibG9ja2VkT24pIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGJsb2NrZWRPbiA9IG5leHRCbG9ja2VkT247XG4gICAgfVxuXG4gICAgaWYgKGJsb2NrZWRPbiAhPT0gbnVsbCkge1xuICAgICAgbmF0aXZlRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9IC8vIFRoaXMgaXMgbm90IHJlcGxheWFibGUgc28gd2UnbGwgaW52b2tlIGl0IGJ1dCB3aXRob3V0IGEgdGFyZ2V0LFxuICAvLyBpbiBjYXNlIHRoZSBldmVudCBzeXN0ZW0gbmVlZHMgdG8gdHJhY2UgaXQuXG5cblxuICBkaXNwYXRjaEV2ZW50Rm9yUGx1Z2luRXZlbnRTeXN0ZW0oZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBuYXRpdmVFdmVudCwgbnVsbCwgdGFyZ2V0Q29udGFpbmVyKTtcbn1cblxudmFyIHJldHVybl90YXJnZXRJbnN0ID0gbnVsbDsgLy8gUmV0dXJucyBhIFN1c3BlbnNlSW5zdGFuY2Ugb3IgQ29udGFpbmVyIGlmIGl0J3MgYmxvY2tlZC5cbi8vIFRoZSByZXR1cm5fdGFyZ2V0SW5zdCBmaWVsZCBhYm92ZSBpcyBjb25jZXB0dWFsbHkgcGFydCBvZiB0aGUgcmV0dXJuIHZhbHVlLlxuXG5mdW5jdGlvbiBmaW5kSW5zdGFuY2VCbG9ja2luZ0V2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICAvLyBUT0RPOiBXYXJuIGlmIF9lbmFibGVkIGlzIGZhbHNlLlxuICByZXR1cm5fdGFyZ2V0SW5zdCA9IG51bGw7XG4gIHZhciBuYXRpdmVFdmVudFRhcmdldCA9IGdldEV2ZW50VGFyZ2V0KG5hdGl2ZUV2ZW50KTtcbiAgdmFyIHRhcmdldEluc3QgPSBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShuYXRpdmVFdmVudFRhcmdldCk7XG5cbiAgaWYgKHRhcmdldEluc3QgIT09IG51bGwpIHtcbiAgICB2YXIgbmVhcmVzdE1vdW50ZWQgPSBnZXROZWFyZXN0TW91bnRlZEZpYmVyKHRhcmdldEluc3QpO1xuXG4gICAgaWYgKG5lYXJlc3RNb3VudGVkID09PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIHRyZWUgaGFzIGJlZW4gdW5tb3VudGVkIGFscmVhZHkuIERpc3BhdGNoIHdpdGhvdXQgYSB0YXJnZXQuXG4gICAgICB0YXJnZXRJbnN0ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHRhZyA9IG5lYXJlc3RNb3VudGVkLnRhZztcblxuICAgICAgaWYgKHRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZ2V0U3VzcGVuc2VJbnN0YW5jZUZyb21GaWJlcihuZWFyZXN0TW91bnRlZCk7XG5cbiAgICAgICAgaWYgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gUXVldWUgdGhlIGV2ZW50IHRvIGJlIHJlcGxheWVkIGxhdGVyLiBBYm9ydCBkaXNwYXRjaGluZyBzaW5jZSB3ZVxuICAgICAgICAgIC8vIGRvbid0IHdhbnQgdGhpcyBldmVudCBkaXNwYXRjaGVkIHR3aWNlIHRocm91Z2ggdGhlIGV2ZW50IHN5c3RlbS5cbiAgICAgICAgICAvLyBUT0RPOiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBkaXNjcmV0ZSBldmVudCBpbiB0aGUgcXVldWUuIFNjaGVkdWxlIGFuIGluY3JlYXNlZFxuICAgICAgICAgIC8vIHByaW9yaXR5IGZvciB0aGlzIGJvdW5kYXJ5LlxuICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgICAgfSAvLyBUaGlzIHNob3VsZG4ndCBoYXBwZW4sIHNvbWV0aGluZyB3ZW50IHdyb25nIGJ1dCB0byBhdm9pZCBibG9ja2luZ1xuICAgICAgICAvLyB0aGUgd2hvbGUgc3lzdGVtLCBkaXNwYXRjaCB0aGUgZXZlbnQgd2l0aG91dCBhIHRhcmdldC5cbiAgICAgICAgLy8gVE9ETzogV2Fybi5cblxuXG4gICAgICAgIHRhcmdldEluc3QgPSBudWxsO1xuICAgICAgfSBlbHNlIGlmICh0YWcgPT09IEhvc3RSb290KSB7XG4gICAgICAgIHZhciByb290ID0gbmVhcmVzdE1vdW50ZWQuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmIChpc1Jvb3REZWh5ZHJhdGVkKHJvb3QpKSB7XG4gICAgICAgICAgLy8gSWYgdGhpcyBoYXBwZW5zIGR1cmluZyBhIHJlcGxheSBzb21ldGhpbmcgd2VudCB3cm9uZyBhbmQgaXQgbWlnaHQgYmxvY2tcbiAgICAgICAgICAvLyB0aGUgd2hvbGUgc3lzdGVtLlxuICAgICAgICAgIHJldHVybiBnZXRDb250YWluZXJGcm9tRmliZXIobmVhcmVzdE1vdW50ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGFyZ2V0SW5zdCA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKG5lYXJlc3RNb3VudGVkICE9PSB0YXJnZXRJbnN0KSB7XG4gICAgICAgIC8vIElmIHdlIGdldCBhbiBldmVudCAoZXg6IGltZyBvbmxvYWQpIGJlZm9yZSBjb21taXR0aW5nIHRoYXRcbiAgICAgICAgLy8gY29tcG9uZW50J3MgbW91bnQsIGlnbm9yZSBpdCBmb3Igbm93ICh0aGF0IGlzLCB0cmVhdCBpdCBhcyBpZiBpdCB3YXMgYW5cbiAgICAgICAgLy8gZXZlbnQgb24gYSBub24tUmVhY3QgdHJlZSkuIFdlIG1pZ2h0IGFsc28gY29uc2lkZXIgcXVldWVpbmcgZXZlbnRzIGFuZFxuICAgICAgICAvLyBkaXNwYXRjaGluZyB0aGVtIGFmdGVyIHRoZSBtb3VudC5cbiAgICAgICAgdGFyZ2V0SW5zdCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuX3RhcmdldEluc3QgPSB0YXJnZXRJbnN0OyAvLyBXZSdyZSBub3QgYmxvY2tlZCBvbiBhbnl0aGluZy5cblxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGdldEV2ZW50UHJpb3JpdHkoZG9tRXZlbnROYW1lKSB7XG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgLy8gVXNlZCBieSBTaW1wbGVFdmVudFBsdWdpbjpcbiAgICBjYXNlICdjYW5jZWwnOlxuICAgIGNhc2UgJ2NsaWNrJzpcbiAgICBjYXNlICdjbG9zZSc6XG4gICAgY2FzZSAnY29udGV4dG1lbnUnOlxuICAgIGNhc2UgJ2NvcHknOlxuICAgIGNhc2UgJ2N1dCc6XG4gICAgY2FzZSAnYXV4Y2xpY2snOlxuICAgIGNhc2UgJ2RibGNsaWNrJzpcbiAgICBjYXNlICdkcmFnZW5kJzpcbiAgICBjYXNlICdkcmFnc3RhcnQnOlxuICAgIGNhc2UgJ2Ryb3AnOlxuICAgIGNhc2UgJ2ZvY3VzaW4nOlxuICAgIGNhc2UgJ2ZvY3Vzb3V0JzpcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgY2FzZSAnaW52YWxpZCc6XG4gICAgY2FzZSAna2V5ZG93bic6XG4gICAgY2FzZSAna2V5cHJlc3MnOlxuICAgIGNhc2UgJ2tleXVwJzpcbiAgICBjYXNlICdtb3VzZWRvd24nOlxuICAgIGNhc2UgJ21vdXNldXAnOlxuICAgIGNhc2UgJ3Bhc3RlJzpcbiAgICBjYXNlICdwYXVzZSc6XG4gICAgY2FzZSAncGxheSc6XG4gICAgY2FzZSAncG9pbnRlcmNhbmNlbCc6XG4gICAgY2FzZSAncG9pbnRlcmRvd24nOlxuICAgIGNhc2UgJ3BvaW50ZXJ1cCc6XG4gICAgY2FzZSAncmF0ZWNoYW5nZSc6XG4gICAgY2FzZSAncmVzZXQnOlxuICAgIGNhc2UgJ3Jlc2l6ZSc6XG4gICAgY2FzZSAnc2Vla2VkJzpcbiAgICBjYXNlICdzdWJtaXQnOlxuICAgIGNhc2UgJ3RvdWNoY2FuY2VsJzpcbiAgICBjYXNlICd0b3VjaGVuZCc6XG4gICAgY2FzZSAndG91Y2hzdGFydCc6XG4gICAgY2FzZSAndm9sdW1lY2hhbmdlJzogLy8gVXNlZCBieSBwb2x5ZmlsbHM6XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICBjYXNlICdjaGFuZ2UnOlxuICAgIGNhc2UgJ3NlbGVjdGlvbmNoYW5nZSc6XG4gICAgY2FzZSAndGV4dElucHV0JzpcbiAgICBjYXNlICdjb21wb3NpdGlvbnN0YXJ0JzpcbiAgICBjYXNlICdjb21wb3NpdGlvbmVuZCc6XG4gICAgY2FzZSAnY29tcG9zaXRpb251cGRhdGUnOiAvLyBPbmx5IGVuYWJsZUNyZWF0ZUV2ZW50SGFuZGxlQVBJOlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgY2FzZSAnYmVmb3JlYmx1cic6XG4gICAgY2FzZSAnYWZ0ZXJibHVyJzogLy8gTm90IHVzZWQgYnkgUmVhY3QgYnV0IGNvdWxkIGJlIGJ5IHVzZXIgY29kZTpcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgIGNhc2UgJ2JlZm9yZWlucHV0JzpcbiAgICBjYXNlICdibHVyJzpcbiAgICBjYXNlICdmdWxsc2NyZWVuY2hhbmdlJzpcbiAgICBjYXNlICdmb2N1cyc6XG4gICAgY2FzZSAnaGFzaGNoYW5nZSc6XG4gICAgY2FzZSAncG9wc3RhdGUnOlxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgY2FzZSAnc2VsZWN0c3RhcnQnOlxuICAgICAgcmV0dXJuIERpc2NyZXRlRXZlbnRQcmlvcml0eTtcblxuICAgIGNhc2UgJ2RyYWcnOlxuICAgIGNhc2UgJ2RyYWdlbnRlcic6XG4gICAgY2FzZSAnZHJhZ2V4aXQnOlxuICAgIGNhc2UgJ2RyYWdsZWF2ZSc6XG4gICAgY2FzZSAnZHJhZ292ZXInOlxuICAgIGNhc2UgJ21vdXNlbW92ZSc6XG4gICAgY2FzZSAnbW91c2VvdXQnOlxuICAgIGNhc2UgJ21vdXNlb3Zlcic6XG4gICAgY2FzZSAncG9pbnRlcm1vdmUnOlxuICAgIGNhc2UgJ3BvaW50ZXJvdXQnOlxuICAgIGNhc2UgJ3BvaW50ZXJvdmVyJzpcbiAgICBjYXNlICdzY3JvbGwnOlxuICAgIGNhc2UgJ3RvZ2dsZSc6XG4gICAgY2FzZSAndG91Y2htb3ZlJzpcbiAgICBjYXNlICd3aGVlbCc6IC8vIE5vdCB1c2VkIGJ5IFJlYWN0IGJ1dCBjb3VsZCBiZSBieSB1c2VyIGNvZGU6XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICBjYXNlICdtb3VzZWVudGVyJzpcbiAgICBjYXNlICdtb3VzZWxlYXZlJzpcbiAgICBjYXNlICdwb2ludGVyZW50ZXInOlxuICAgIGNhc2UgJ3BvaW50ZXJsZWF2ZSc6XG4gICAgICByZXR1cm4gQ29udGludW91c0V2ZW50UHJpb3JpdHk7XG5cbiAgICBjYXNlICdtZXNzYWdlJzpcbiAgICAgIHtcbiAgICAgICAgLy8gV2UgbWlnaHQgYmUgaW4gdGhlIFNjaGVkdWxlciBjYWxsYmFjay5cbiAgICAgICAgLy8gRXZlbnR1YWxseSB0aGlzIG1lY2hhbmlzbSB3aWxsIGJlIHJlcGxhY2VkIGJ5IGEgY2hlY2tcbiAgICAgICAgLy8gb2YgdGhlIGN1cnJlbnQgcHJpb3JpdHkgb24gdGhlIG5hdGl2ZSBzY2hlZHVsZXIuXG4gICAgICAgIHZhciBzY2hlZHVsZXJQcmlvcml0eSA9IGdldEN1cnJlbnRQcmlvcml0eUxldmVsKCk7XG5cbiAgICAgICAgc3dpdGNoIChzY2hlZHVsZXJQcmlvcml0eSkge1xuICAgICAgICAgIGNhc2UgSW1tZWRpYXRlUHJpb3JpdHk6XG4gICAgICAgICAgICByZXR1cm4gRGlzY3JldGVFdmVudFByaW9yaXR5O1xuXG4gICAgICAgICAgY2FzZSBVc2VyQmxvY2tpbmdQcmlvcml0eTpcbiAgICAgICAgICAgIHJldHVybiBDb250aW51b3VzRXZlbnRQcmlvcml0eTtcblxuICAgICAgICAgIGNhc2UgTm9ybWFsUHJpb3JpdHk6XG4gICAgICAgICAgY2FzZSBMb3dQcmlvcml0eTpcbiAgICAgICAgICAgIC8vIFRPRE86IEhhbmRsZSBMb3dTY2hlZHVsZXJQcmlvcml0eSwgc29tZWhvdy4gTWF5YmUgdGhlIHNhbWUgbGFuZSBhcyBoeWRyYXRpb24uXG4gICAgICAgICAgICByZXR1cm4gRGVmYXVsdEV2ZW50UHJpb3JpdHk7XG5cbiAgICAgICAgICBjYXNlIElkbGVQcmlvcml0eTpcbiAgICAgICAgICAgIHJldHVybiBJZGxlRXZlbnRQcmlvcml0eTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gRGVmYXVsdEV2ZW50UHJpb3JpdHk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gRGVmYXVsdEV2ZW50UHJpb3JpdHk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkRXZlbnRCdWJibGVMaXN0ZW5lcih0YXJnZXQsIGV2ZW50VHlwZSwgbGlzdGVuZXIpIHtcbiAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lciwgZmFsc2UpO1xuICByZXR1cm4gbGlzdGVuZXI7XG59XG5mdW5jdGlvbiBhZGRFdmVudENhcHR1cmVMaXN0ZW5lcih0YXJnZXQsIGV2ZW50VHlwZSwgbGlzdGVuZXIpIHtcbiAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lciwgdHJ1ZSk7XG4gIHJldHVybiBsaXN0ZW5lcjtcbn1cbmZ1bmN0aW9uIGFkZEV2ZW50Q2FwdHVyZUxpc3RlbmVyV2l0aFBhc3NpdmVGbGFnKHRhcmdldCwgZXZlbnRUeXBlLCBsaXN0ZW5lciwgcGFzc2l2ZSkge1xuICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyLCB7XG4gICAgY2FwdHVyZTogdHJ1ZSxcbiAgICBwYXNzaXZlOiBwYXNzaXZlXG4gIH0pO1xuICByZXR1cm4gbGlzdGVuZXI7XG59XG5mdW5jdGlvbiBhZGRFdmVudEJ1YmJsZUxpc3RlbmVyV2l0aFBhc3NpdmVGbGFnKHRhcmdldCwgZXZlbnRUeXBlLCBsaXN0ZW5lciwgcGFzc2l2ZSkge1xuICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyLCB7XG4gICAgcGFzc2l2ZTogcGFzc2l2ZVxuICB9KTtcbiAgcmV0dXJuIGxpc3RlbmVyO1xufVxuXG4vKipcbiAqIFRoZXNlIHZhcmlhYmxlcyBzdG9yZSBpbmZvcm1hdGlvbiBhYm91dCB0ZXh0IGNvbnRlbnQgb2YgYSB0YXJnZXQgbm9kZSxcbiAqIGFsbG93aW5nIGNvbXBhcmlzb24gb2YgY29udGVudCBiZWZvcmUgYW5kIGFmdGVyIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogSWRlbnRpZnkgdGhlIG5vZGUgd2hlcmUgc2VsZWN0aW9uIGN1cnJlbnRseSBiZWdpbnMsIHRoZW4gb2JzZXJ2ZVxuICogYm90aCBpdHMgdGV4dCBjb250ZW50IGFuZCBpdHMgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgRE9NLiBTaW5jZSB0aGVcbiAqIGJyb3dzZXIgbWF5IG5hdGl2ZWx5IHJlcGxhY2UgdGhlIHRhcmdldCBub2RlIGR1cmluZyBjb21wb3NpdGlvbiwgd2UgY2FuXG4gKiB1c2UgaXRzIHBvc2l0aW9uIHRvIGZpbmQgaXRzIHJlcGxhY2VtZW50LlxuICpcbiAqXG4gKi9cbnZhciByb290ID0gbnVsbDtcbnZhciBzdGFydFRleHQgPSBudWxsO1xudmFyIGZhbGxiYWNrVGV4dCA9IG51bGw7XG5mdW5jdGlvbiBpbml0aWFsaXplKG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHJvb3QgPSBuYXRpdmVFdmVudFRhcmdldDtcbiAgc3RhcnRUZXh0ID0gZ2V0VGV4dCgpO1xuICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHJlc2V0KCkge1xuICByb290ID0gbnVsbDtcbiAgc3RhcnRUZXh0ID0gbnVsbDtcbiAgZmFsbGJhY2tUZXh0ID0gbnVsbDtcbn1cbmZ1bmN0aW9uIGdldERhdGEoKSB7XG4gIGlmIChmYWxsYmFja1RleHQpIHtcbiAgICByZXR1cm4gZmFsbGJhY2tUZXh0O1xuICB9XG5cbiAgdmFyIHN0YXJ0O1xuICB2YXIgc3RhcnRWYWx1ZSA9IHN0YXJ0VGV4dDtcbiAgdmFyIHN0YXJ0TGVuZ3RoID0gc3RhcnRWYWx1ZS5sZW5ndGg7XG4gIHZhciBlbmQ7XG4gIHZhciBlbmRWYWx1ZSA9IGdldFRleHQoKTtcbiAgdmFyIGVuZExlbmd0aCA9IGVuZFZhbHVlLmxlbmd0aDtcblxuICBmb3IgKHN0YXJ0ID0gMDsgc3RhcnQgPCBzdGFydExlbmd0aDsgc3RhcnQrKykge1xuICAgIGlmIChzdGFydFZhbHVlW3N0YXJ0XSAhPT0gZW5kVmFsdWVbc3RhcnRdKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2YXIgbWluRW5kID0gc3RhcnRMZW5ndGggLSBzdGFydDtcblxuICBmb3IgKGVuZCA9IDE7IGVuZCA8PSBtaW5FbmQ7IGVuZCsrKSB7XG4gICAgaWYgKHN0YXJ0VmFsdWVbc3RhcnRMZW5ndGggLSBlbmRdICE9PSBlbmRWYWx1ZVtlbmRMZW5ndGggLSBlbmRdKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2YXIgc2xpY2VUYWlsID0gZW5kID4gMSA/IDEgLSBlbmQgOiB1bmRlZmluZWQ7XG4gIGZhbGxiYWNrVGV4dCA9IGVuZFZhbHVlLnNsaWNlKHN0YXJ0LCBzbGljZVRhaWwpO1xuICByZXR1cm4gZmFsbGJhY2tUZXh0O1xufVxuZnVuY3Rpb24gZ2V0VGV4dCgpIHtcbiAgaWYgKCd2YWx1ZScgaW4gcm9vdCkge1xuICAgIHJldHVybiByb290LnZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHJvb3QudGV4dENvbnRlbnQ7XG59XG5cbi8qKlxuICogYGNoYXJDb2RlYCByZXByZXNlbnRzIHRoZSBhY3R1YWwgXCJjaGFyYWN0ZXIgY29kZVwiIGFuZCBpcyBzYWZlIHRvIHVzZSB3aXRoXG4gKiBgU3RyaW5nLmZyb21DaGFyQ29kZWAuIEFzIHN1Y2gsIG9ubHkga2V5cyB0aGF0IGNvcnJlc3BvbmQgdG8gcHJpbnRhYmxlXG4gKiBjaGFyYWN0ZXJzIHByb2R1Y2UgYSB2YWxpZCBgY2hhckNvZGVgLCB0aGUgb25seSBleGNlcHRpb24gdG8gdGhpcyBpcyBFbnRlci5cbiAqIFRoZSBUYWIta2V5IGlzIGNvbnNpZGVyZWQgbm9uLXByaW50YWJsZSBhbmQgZG9lcyBub3QgaGF2ZSBhIGBjaGFyQ29kZWAsXG4gKiBwcmVzdW1hYmx5IGJlY2F1c2UgaXQgZG9lcyBub3QgcHJvZHVjZSBhIHRhYi1jaGFyYWN0ZXIgaW4gYnJvd3NlcnMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQHJldHVybiB7bnVtYmVyfSBOb3JtYWxpemVkIGBjaGFyQ29kZWAgcHJvcGVydHkuXG4gKi9cbmZ1bmN0aW9uIGdldEV2ZW50Q2hhckNvZGUobmF0aXZlRXZlbnQpIHtcbiAgdmFyIGNoYXJDb2RlO1xuICB2YXIga2V5Q29kZSA9IG5hdGl2ZUV2ZW50LmtleUNvZGU7XG5cbiAgaWYgKCdjaGFyQ29kZScgaW4gbmF0aXZlRXZlbnQpIHtcbiAgICBjaGFyQ29kZSA9IG5hdGl2ZUV2ZW50LmNoYXJDb2RlOyAvLyBGRiBkb2VzIG5vdCBzZXQgYGNoYXJDb2RlYCBmb3IgdGhlIEVudGVyLWtleSwgY2hlY2sgYWdhaW5zdCBga2V5Q29kZWAuXG5cbiAgICBpZiAoY2hhckNvZGUgPT09IDAgJiYga2V5Q29kZSA9PT0gMTMpIHtcbiAgICAgIGNoYXJDb2RlID0gMTM7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIElFOCBkb2VzIG5vdCBpbXBsZW1lbnQgYGNoYXJDb2RlYCwgYnV0IGBrZXlDb2RlYCBoYXMgdGhlIGNvcnJlY3QgdmFsdWUuXG4gICAgY2hhckNvZGUgPSBrZXlDb2RlO1xuICB9IC8vIElFIGFuZCBFZGdlIChvbiBXaW5kb3dzKSBhbmQgQ2hyb21lIC8gU2FmYXJpIChvbiBXaW5kb3dzIGFuZCBMaW51eClcbiAgLy8gcmVwb3J0IEVudGVyIGFzIGNoYXJDb2RlIDEwIHdoZW4gY3RybCBpcyBwcmVzc2VkLlxuXG5cbiAgaWYgKGNoYXJDb2RlID09PSAxMCkge1xuICAgIGNoYXJDb2RlID0gMTM7XG4gIH0gLy8gU29tZSBub24tcHJpbnRhYmxlIGtleXMgYXJlIHJlcG9ydGVkIGluIGBjaGFyQ29kZWAvYGtleUNvZGVgLCBkaXNjYXJkIHRoZW0uXG4gIC8vIE11c3Qgbm90IGRpc2NhcmQgdGhlIChub24tKXByaW50YWJsZSBFbnRlci1rZXkuXG5cblxuICBpZiAoY2hhckNvZGUgPj0gMzIgfHwgY2hhckNvZGUgPT09IDEzKSB7XG4gICAgcmV0dXJuIGNoYXJDb2RlO1xuICB9XG5cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGZ1bmN0aW9uVGhhdFJldHVybnNUcnVlKCkge1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZnVuY3Rpb25UaGF0UmV0dXJuc0ZhbHNlKCkge1xuICByZXR1cm4gZmFsc2U7XG59IC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhIGZhY3Rvcnkgc28gdGhhdCB3ZSBoYXZlIGRpZmZlcmVudCByZXR1cm5lZCBjb25zdHJ1Y3RvcnMuXG4vLyBJZiB3ZSBoYWQgYSBzaW5nbGUgY29uc3RydWN0b3IsIGl0IHdvdWxkIGJlIG1lZ2Ftb3JwaGljIGFuZCBlbmdpbmVzIHdvdWxkIGRlb3B0LlxuXG5cbmZ1bmN0aW9uIGNyZWF0ZVN5bnRoZXRpY0V2ZW50KEludGVyZmFjZSkge1xuICAvKipcbiAgICogU3ludGhldGljIGV2ZW50cyBhcmUgZGlzcGF0Y2hlZCBieSBldmVudCBwbHVnaW5zLCB0eXBpY2FsbHkgaW4gcmVzcG9uc2UgdG8gYVxuICAgKiB0b3AtbGV2ZWwgZXZlbnQgZGVsZWdhdGlvbiBoYW5kbGVyLlxuICAgKlxuICAgKiBUaGVzZSBzeXN0ZW1zIHNob3VsZCBnZW5lcmFsbHkgdXNlIHBvb2xpbmcgdG8gcmVkdWNlIHRoZSBmcmVxdWVuY3kgb2YgZ2FyYmFnZVxuICAgKiBjb2xsZWN0aW9uLiBUaGUgc3lzdGVtIHNob3VsZCBjaGVjayBgaXNQZXJzaXN0ZW50YCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGVcbiAgICogZXZlbnQgc2hvdWxkIGJlIHJlbGVhc2VkIGludG8gdGhlIHBvb2wgYWZ0ZXIgYmVpbmcgZGlzcGF0Y2hlZC4gVXNlcnMgdGhhdFxuICAgKiBuZWVkIGEgcGVyc2lzdGVkIGV2ZW50IHNob3VsZCBpbnZva2UgYHBlcnNpc3RgLlxuICAgKlxuICAgKiBTeW50aGV0aWMgZXZlbnRzIChhbmQgc3ViY2xhc3NlcykgaW1wbGVtZW50IHRoZSBET00gTGV2ZWwgMyBFdmVudHMgQVBJIGJ5XG4gICAqIG5vcm1hbGl6aW5nIGJyb3dzZXIgcXVpcmtzLiBTdWJjbGFzc2VzIGRvIG5vdCBuZWNlc3NhcmlseSBoYXZlIHRvIGltcGxlbWVudCBhXG4gICAqIERPTSBpbnRlcmZhY2U7IGN1c3RvbSBhcHBsaWNhdGlvbi1zcGVjaWZpYyBldmVudHMgY2FuIGFsc28gc3ViY2xhc3MgdGhpcy5cbiAgICovXG4gIGZ1bmN0aW9uIFN5bnRoZXRpY0Jhc2VFdmVudChyZWFjdE5hbWUsIHJlYWN0RXZlbnRUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgICB0aGlzLl9yZWFjdE5hbWUgPSByZWFjdE5hbWU7XG4gICAgdGhpcy5fdGFyZ2V0SW5zdCA9IHRhcmdldEluc3Q7XG4gICAgdGhpcy50eXBlID0gcmVhY3RFdmVudFR5cGU7XG4gICAgdGhpcy5uYXRpdmVFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgIHRoaXMudGFyZ2V0ID0gbmF0aXZlRXZlbnRUYXJnZXQ7XG4gICAgdGhpcy5jdXJyZW50VGFyZ2V0ID0gbnVsbDtcblxuICAgIGZvciAodmFyIF9wcm9wTmFtZSBpbiBJbnRlcmZhY2UpIHtcbiAgICAgIGlmICghSW50ZXJmYWNlLmhhc093blByb3BlcnR5KF9wcm9wTmFtZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBub3JtYWxpemUgPSBJbnRlcmZhY2VbX3Byb3BOYW1lXTtcblxuICAgICAgaWYgKG5vcm1hbGl6ZSkge1xuICAgICAgICB0aGlzW19wcm9wTmFtZV0gPSBub3JtYWxpemUobmF0aXZlRXZlbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpc1tfcHJvcE5hbWVdID0gbmF0aXZlRXZlbnRbX3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdFByZXZlbnRlZCA9IG5hdGl2ZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgIT0gbnVsbCA/IG5hdGl2ZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgOiBuYXRpdmVFdmVudC5yZXR1cm5WYWx1ZSA9PT0gZmFsc2U7XG5cbiAgICBpZiAoZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBmdW5jdGlvblRoYXRSZXR1cm5zRmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IGZ1bmN0aW9uVGhhdFJldHVybnNGYWxzZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFzc2lnbihTeW50aGV0aWNCYXNlRXZlbnQucHJvdG90eXBlLCB7XG4gICAgcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7XG4gICAgICB2YXIgZXZlbnQgPSB0aGlzLm5hdGl2ZUV2ZW50O1xuXG4gICAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LnByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IC8vICRGbG93Rml4TWUgLSBmbG93IGlzIG5vdCBhd2FyZSBvZiBgdW5rbm93bmAgaW4gSUVcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGV2ZW50LnJldHVyblZhbHVlICE9PSAndW5rbm93bicpIHtcbiAgICAgICAgZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZTtcbiAgICB9LFxuICAgIHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGV2ZW50ID0gdGhpcy5uYXRpdmVFdmVudDtcblxuICAgICAgaWYgKCFldmVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5zdG9wUHJvcGFnYXRpb24pIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IC8vICRGbG93Rml4TWUgLSBmbG93IGlzIG5vdCBhd2FyZSBvZiBgdW5rbm93bmAgaW4gSUVcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGV2ZW50LmNhbmNlbEJ1YmJsZSAhPT0gJ3Vua25vd24nKSB7XG4gICAgICAgIC8vIFRoZSBDaGFuZ2VFdmVudFBsdWdpbiByZWdpc3RlcnMgYSBcInByb3BlcnR5Y2hhbmdlXCIgZXZlbnQgZm9yXG4gICAgICAgIC8vIElFLiBUaGlzIGV2ZW50IGRvZXMgbm90IHN1cHBvcnQgYnViYmxpbmcgb3IgY2FuY2VsbGluZywgYW5kXG4gICAgICAgIC8vIGFueSByZWZlcmVuY2VzIHRvIGNhbmNlbEJ1YmJsZSB0aHJvdyBcIk1lbWJlciBub3QgZm91bmRcIi4gIEFcbiAgICAgICAgLy8gdHlwZW9mIGNoZWNrIG9mIFwidW5rbm93blwiIGNpcmN1bXZlbnRzIHRoaXMgaXNzdWUgKGFuZCBpcyBhbHNvXG4gICAgICAgIC8vIElFIHNwZWNpZmljKS5cbiAgICAgICAgZXZlbnQuY2FuY2VsQnViYmxlID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IGZ1bmN0aW9uVGhhdFJldHVybnNUcnVlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBXZSByZWxlYXNlIGFsbCBkaXNwYXRjaGVkIGBTeW50aGV0aWNFdmVudGBzIGFmdGVyIGVhY2ggZXZlbnQgbG9vcCwgYWRkaW5nXG4gICAgICogdGhlbSBiYWNrIGludG8gdGhlIHBvb2wuIFRoaXMgYWxsb3dzIGEgd2F5IHRvIGhvbGQgb250byBhIHJlZmVyZW5jZSB0aGF0XG4gICAgICogd29uJ3QgYmUgYWRkZWQgYmFjayBpbnRvIHRoZSBwb29sLlxuICAgICAqL1xuICAgIHBlcnNpc3Q6IGZ1bmN0aW9uICgpIHsvLyBNb2Rlcm4gZXZlbnQgc3lzdGVtIGRvZXNuJ3QgdXNlIHBvb2xpbmcuXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGlzIGV2ZW50IHNob3VsZCBiZSByZWxlYXNlZCBiYWNrIGludG8gdGhlIHBvb2wuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoaXMgc2hvdWxkIG5vdCBiZSByZWxlYXNlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGlzUGVyc2lzdGVudDogZnVuY3Rpb25UaGF0UmV0dXJuc1RydWVcbiAgfSk7XG4gIHJldHVybiBTeW50aGV0aWNCYXNlRXZlbnQ7XG59XG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG5cblxudmFyIEV2ZW50SW50ZXJmYWNlID0ge1xuICBldmVudFBoYXNlOiAwLFxuICBidWJibGVzOiAwLFxuICBjYW5jZWxhYmxlOiAwLFxuICB0aW1lU3RhbXA6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiBldmVudC50aW1lU3RhbXAgfHwgRGF0ZS5ub3coKTtcbiAgfSxcbiAgZGVmYXVsdFByZXZlbnRlZDogMCxcbiAgaXNUcnVzdGVkOiAwXG59O1xudmFyIFN5bnRoZXRpY0V2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoRXZlbnRJbnRlcmZhY2UpO1xuXG52YXIgVUlFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgRXZlbnRJbnRlcmZhY2UsIHtcbiAgdmlldzogMCxcbiAgZGV0YWlsOiAwXG59KTtcblxudmFyIFN5bnRoZXRpY1VJRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChVSUV2ZW50SW50ZXJmYWNlKTtcbnZhciBsYXN0TW92ZW1lbnRYO1xudmFyIGxhc3RNb3ZlbWVudFk7XG52YXIgbGFzdE1vdXNlRXZlbnQ7XG5cbmZ1bmN0aW9uIHVwZGF0ZU1vdXNlTW92ZW1lbnRQb2x5ZmlsbFN0YXRlKGV2ZW50KSB7XG4gIGlmIChldmVudCAhPT0gbGFzdE1vdXNlRXZlbnQpIHtcbiAgICBpZiAobGFzdE1vdXNlRXZlbnQgJiYgZXZlbnQudHlwZSA9PT0gJ21vdXNlbW92ZScpIHtcbiAgICAgIGxhc3RNb3ZlbWVudFggPSBldmVudC5zY3JlZW5YIC0gbGFzdE1vdXNlRXZlbnQuc2NyZWVuWDtcbiAgICAgIGxhc3RNb3ZlbWVudFkgPSBldmVudC5zY3JlZW5ZIC0gbGFzdE1vdXNlRXZlbnQuc2NyZWVuWTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGFzdE1vdmVtZW50WCA9IDA7XG4gICAgICBsYXN0TW92ZW1lbnRZID0gMDtcbiAgICB9XG5cbiAgICBsYXN0TW91c2VFdmVudCA9IGV2ZW50O1xuICB9XG59XG4vKipcbiAqIEBpbnRlcmZhY2UgTW91c2VFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxuXG52YXIgTW91c2VFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgVUlFdmVudEludGVyZmFjZSwge1xuICBzY3JlZW5YOiAwLFxuICBzY3JlZW5ZOiAwLFxuICBjbGllbnRYOiAwLFxuICBjbGllbnRZOiAwLFxuICBwYWdlWDogMCxcbiAgcGFnZVk6IDAsXG4gIGN0cmxLZXk6IDAsXG4gIHNoaWZ0S2V5OiAwLFxuICBhbHRLZXk6IDAsXG4gIG1ldGFLZXk6IDAsXG4gIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJTdGF0ZSxcbiAgYnV0dG9uOiAwLFxuICBidXR0b25zOiAwLFxuICByZWxhdGVkVGFyZ2V0OiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQucmVsYXRlZFRhcmdldCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZXZlbnQuZnJvbUVsZW1lbnQgPT09IGV2ZW50LnNyY0VsZW1lbnQgPyBldmVudC50b0VsZW1lbnQgOiBldmVudC5mcm9tRWxlbWVudDtcbiAgICByZXR1cm4gZXZlbnQucmVsYXRlZFRhcmdldDtcbiAgfSxcbiAgbW92ZW1lbnRYOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoJ21vdmVtZW50WCcgaW4gZXZlbnQpIHtcbiAgICAgIHJldHVybiBldmVudC5tb3ZlbWVudFg7XG4gICAgfVxuXG4gICAgdXBkYXRlTW91c2VNb3ZlbWVudFBvbHlmaWxsU3RhdGUoZXZlbnQpO1xuICAgIHJldHVybiBsYXN0TW92ZW1lbnRYO1xuICB9LFxuICBtb3ZlbWVudFk6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmICgnbW92ZW1lbnRZJyBpbiBldmVudCkge1xuICAgICAgcmV0dXJuIGV2ZW50Lm1vdmVtZW50WTtcbiAgICB9IC8vIERvbid0IG5lZWQgdG8gY2FsbCB1cGRhdGVNb3VzZU1vdmVtZW50UG9seWZpbGxTdGF0ZSgpIGhlcmVcbiAgICAvLyBiZWNhdXNlIGl0J3MgZ3VhcmFudGVlZCB0byBoYXZlIGFscmVhZHkgcnVuIHdoZW4gbW92ZW1lbnRYXG4gICAgLy8gd2FzIGNvcGllZC5cblxuXG4gICAgcmV0dXJuIGxhc3RNb3ZlbWVudFk7XG4gIH1cbn0pO1xuXG52YXIgU3ludGhldGljTW91c2VFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KE1vdXNlRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIERyYWdFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxudmFyIERyYWdFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgTW91c2VFdmVudEludGVyZmFjZSwge1xuICBkYXRhVHJhbnNmZXI6IDBcbn0pO1xuXG52YXIgU3ludGhldGljRHJhZ0V2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoRHJhZ0V2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBGb2N1c0V2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG52YXIgRm9jdXNFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgVUlFdmVudEludGVyZmFjZSwge1xuICByZWxhdGVkVGFyZ2V0OiAwXG59KTtcblxudmFyIFN5bnRoZXRpY0ZvY3VzRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChGb2N1c0V2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWFuaW1hdGlvbnMvI0FuaW1hdGlvbkV2ZW50LWludGVyZmFjZVxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQW5pbWF0aW9uRXZlbnRcbiAqL1xuXG52YXIgQW5pbWF0aW9uRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gIGFuaW1hdGlvbk5hbWU6IDAsXG4gIGVsYXBzZWRUaW1lOiAwLFxuICBwc2V1ZG9FbGVtZW50OiAwXG59KTtcblxudmFyIFN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoQW5pbWF0aW9uRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2NsaXBib2FyZC1hcGlzL1xuICovXG5cbnZhciBDbGlwYm9hcmRFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgRXZlbnRJbnRlcmZhY2UsIHtcbiAgY2xpcGJvYXJkRGF0YTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuICdjbGlwYm9hcmREYXRhJyBpbiBldmVudCA/IGV2ZW50LmNsaXBib2FyZERhdGEgOiB3aW5kb3cuY2xpcGJvYXJkRGF0YTtcbiAgfVxufSk7XG5cbnZhciBTeW50aGV0aWNDbGlwYm9hcmRFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KENsaXBib2FyZEV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvI2V2ZW50cy1jb21wb3NpdGlvbmV2ZW50c1xuICovXG5cbnZhciBDb21wb3NpdGlvbkV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwge1xuICBkYXRhOiAwXG59KTtcblxudmFyIFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChDb21wb3NpdGlvbkV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDEzL1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDEzMTEwNVxuICogICAgICAvI2V2ZW50cy1pbnB1dGV2ZW50c1xuICovXG4vLyBIYXBwZW5zIHRvIHNoYXJlIHRoZSBzYW1lIGxpc3QgZm9yIG5vdy5cblxudmFyIFN5bnRoZXRpY0lucHV0RXZlbnQgPSBTeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50O1xuLyoqXG4gKiBOb3JtYWxpemF0aW9uIG9mIGRlcHJlY2F0ZWQgSFRNTDUgYGtleWAgdmFsdWVzXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50I0tleV9uYW1lc1xuICovXG5cbnZhciBub3JtYWxpemVLZXkgPSB7XG4gIEVzYzogJ0VzY2FwZScsXG4gIFNwYWNlYmFyOiAnICcsXG4gIExlZnQ6ICdBcnJvd0xlZnQnLFxuICBVcDogJ0Fycm93VXAnLFxuICBSaWdodDogJ0Fycm93UmlnaHQnLFxuICBEb3duOiAnQXJyb3dEb3duJyxcbiAgRGVsOiAnRGVsZXRlJyxcbiAgV2luOiAnT1MnLFxuICBNZW51OiAnQ29udGV4dE1lbnUnLFxuICBBcHBzOiAnQ29udGV4dE1lbnUnLFxuICBTY3JvbGw6ICdTY3JvbGxMb2NrJyxcbiAgTW96UHJpbnRhYmxlS2V5OiAnVW5pZGVudGlmaWVkJ1xufTtcbi8qKlxuICogVHJhbnNsYXRpb24gZnJvbSBsZWdhY3kgYGtleUNvZGVgIHRvIEhUTUw1IGBrZXlgXG4gKiBPbmx5IHNwZWNpYWwga2V5cyBzdXBwb3J0ZWQsIGFsbCBvdGhlcnMgZGVwZW5kIG9uIGtleWJvYXJkIGxheW91dCBvciBicm93c2VyXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50I0tleV9uYW1lc1xuICovXG5cbnZhciB0cmFuc2xhdGVUb0tleSA9IHtcbiAgJzgnOiAnQmFja3NwYWNlJyxcbiAgJzknOiAnVGFiJyxcbiAgJzEyJzogJ0NsZWFyJyxcbiAgJzEzJzogJ0VudGVyJyxcbiAgJzE2JzogJ1NoaWZ0JyxcbiAgJzE3JzogJ0NvbnRyb2wnLFxuICAnMTgnOiAnQWx0JyxcbiAgJzE5JzogJ1BhdXNlJyxcbiAgJzIwJzogJ0NhcHNMb2NrJyxcbiAgJzI3JzogJ0VzY2FwZScsXG4gICczMic6ICcgJyxcbiAgJzMzJzogJ1BhZ2VVcCcsXG4gICczNCc6ICdQYWdlRG93bicsXG4gICczNSc6ICdFbmQnLFxuICAnMzYnOiAnSG9tZScsXG4gICczNyc6ICdBcnJvd0xlZnQnLFxuICAnMzgnOiAnQXJyb3dVcCcsXG4gICczOSc6ICdBcnJvd1JpZ2h0JyxcbiAgJzQwJzogJ0Fycm93RG93bicsXG4gICc0NSc6ICdJbnNlcnQnLFxuICAnNDYnOiAnRGVsZXRlJyxcbiAgJzExMic6ICdGMScsXG4gICcxMTMnOiAnRjInLFxuICAnMTE0JzogJ0YzJyxcbiAgJzExNSc6ICdGNCcsXG4gICcxMTYnOiAnRjUnLFxuICAnMTE3JzogJ0Y2JyxcbiAgJzExOCc6ICdGNycsXG4gICcxMTknOiAnRjgnLFxuICAnMTIwJzogJ0Y5JyxcbiAgJzEyMSc6ICdGMTAnLFxuICAnMTIyJzogJ0YxMScsXG4gICcxMjMnOiAnRjEyJyxcbiAgJzE0NCc6ICdOdW1Mb2NrJyxcbiAgJzE0NSc6ICdTY3JvbGxMb2NrJyxcbiAgJzIyNCc6ICdNZXRhJ1xufTtcbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQHJldHVybiB7c3RyaW5nfSBOb3JtYWxpemVkIGBrZXlgIHByb3BlcnR5LlxuICovXG5cbmZ1bmN0aW9uIGdldEV2ZW50S2V5KG5hdGl2ZUV2ZW50KSB7XG4gIGlmIChuYXRpdmVFdmVudC5rZXkpIHtcbiAgICAvLyBOb3JtYWxpemUgaW5jb25zaXN0ZW50IHZhbHVlcyByZXBvcnRlZCBieSBicm93c2VycyBkdWUgdG9cbiAgICAvLyBpbXBsZW1lbnRhdGlvbnMgb2YgYSB3b3JraW5nIGRyYWZ0IHNwZWNpZmljYXRpb24uXG4gICAgLy8gRmlyZUZveCBpbXBsZW1lbnRzIGBrZXlgIGJ1dCByZXR1cm5zIGBNb3pQcmludGFibGVLZXlgIGZvciBhbGxcbiAgICAvLyBwcmludGFibGUgY2hhcmFjdGVycyAobm9ybWFsaXplZCB0byBgVW5pZGVudGlmaWVkYCksIGlnbm9yZSBpdC5cbiAgICB2YXIga2V5ID0gbm9ybWFsaXplS2V5W25hdGl2ZUV2ZW50LmtleV0gfHwgbmF0aXZlRXZlbnQua2V5O1xuXG4gICAgaWYgKGtleSAhPT0gJ1VuaWRlbnRpZmllZCcpIHtcbiAgICAgIHJldHVybiBrZXk7XG4gICAgfVxuICB9IC8vIEJyb3dzZXIgZG9lcyBub3QgaW1wbGVtZW50IGBrZXlgLCBwb2x5ZmlsbCBhcyBtdWNoIG9mIGl0IGFzIHdlIGNhbi5cblxuXG4gIGlmIChuYXRpdmVFdmVudC50eXBlID09PSAna2V5cHJlc3MnKSB7XG4gICAgdmFyIGNoYXJDb2RlID0gZ2V0RXZlbnRDaGFyQ29kZShuYXRpdmVFdmVudCk7IC8vIFRoZSBlbnRlci1rZXkgaXMgdGVjaG5pY2FsbHkgYm90aCBwcmludGFibGUgYW5kIG5vbi1wcmludGFibGUgYW5kIGNhblxuICAgIC8vIHRodXMgYmUgY2FwdHVyZWQgYnkgYGtleXByZXNzYCwgbm8gb3RoZXIgbm9uLXByaW50YWJsZSBrZXkgc2hvdWxkLlxuXG4gICAgcmV0dXJuIGNoYXJDb2RlID09PSAxMyA/ICdFbnRlcicgOiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlKTtcbiAgfVxuXG4gIGlmIChuYXRpdmVFdmVudC50eXBlID09PSAna2V5ZG93bicgfHwgbmF0aXZlRXZlbnQudHlwZSA9PT0gJ2tleXVwJykge1xuICAgIC8vIFdoaWxlIHVzZXIga2V5Ym9hcmQgbGF5b3V0IGRldGVybWluZXMgdGhlIGFjdHVhbCBtZWFuaW5nIG9mIGVhY2hcbiAgICAvLyBga2V5Q29kZWAgdmFsdWUsIGFsbW9zdCBhbGwgZnVuY3Rpb24ga2V5cyBoYXZlIGEgdW5pdmVyc2FsIHZhbHVlLlxuICAgIHJldHVybiB0cmFuc2xhdGVUb0tleVtuYXRpdmVFdmVudC5rZXlDb2RlXSB8fCAnVW5pZGVudGlmaWVkJztcbiAgfVxuXG4gIHJldHVybiAnJztcbn1cbi8qKlxuICogVHJhbnNsYXRpb24gZnJvbSBtb2RpZmllciBrZXkgdG8gdGhlIGFzc29jaWF0ZWQgcHJvcGVydHkgaW4gdGhlIGV2ZW50LlxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvI2tleXMtTW9kaWZpZXJzXG4gKi9cblxuXG52YXIgbW9kaWZpZXJLZXlUb1Byb3AgPSB7XG4gIEFsdDogJ2FsdEtleScsXG4gIENvbnRyb2w6ICdjdHJsS2V5JyxcbiAgTWV0YTogJ21ldGFLZXknLFxuICBTaGlmdDogJ3NoaWZ0S2V5J1xufTsgLy8gT2xkZXIgYnJvd3NlcnMgKFNhZmFyaSA8PSAxMCwgaU9TIFNhZmFyaSA8PSAxMC4yKSBkbyBub3Qgc3VwcG9ydFxuLy8gZ2V0TW9kaWZpZXJTdGF0ZS4gSWYgZ2V0TW9kaWZpZXJTdGF0ZSBpcyBub3Qgc3VwcG9ydGVkLCB3ZSBtYXAgaXQgdG8gYSBzZXQgb2Zcbi8vIG1vZGlmaWVyIGtleXMgZXhwb3NlZCBieSB0aGUgZXZlbnQuIEluIHRoaXMgY2FzZSwgTG9jay1rZXlzIGFyZSBub3Qgc3VwcG9ydGVkLlxuXG5mdW5jdGlvbiBtb2RpZmllclN0YXRlR2V0dGVyKGtleUFyZykge1xuICB2YXIgc3ludGhldGljRXZlbnQgPSB0aGlzO1xuICB2YXIgbmF0aXZlRXZlbnQgPSBzeW50aGV0aWNFdmVudC5uYXRpdmVFdmVudDtcblxuICBpZiAobmF0aXZlRXZlbnQuZ2V0TW9kaWZpZXJTdGF0ZSkge1xuICAgIHJldHVybiBuYXRpdmVFdmVudC5nZXRNb2RpZmllclN0YXRlKGtleUFyZyk7XG4gIH1cblxuICB2YXIga2V5UHJvcCA9IG1vZGlmaWVyS2V5VG9Qcm9wW2tleUFyZ107XG4gIHJldHVybiBrZXlQcm9wID8gISFuYXRpdmVFdmVudFtrZXlQcm9wXSA6IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRFdmVudE1vZGlmaWVyU3RhdGUobmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIG1vZGlmaWVyU3RhdGVHZXR0ZXI7XG59XG4vKipcbiAqIEBpbnRlcmZhY2UgS2V5Ym9hcmRFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxuXG52YXIgS2V5Ym9hcmRFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgVUlFdmVudEludGVyZmFjZSwge1xuICBrZXk6IGdldEV2ZW50S2V5LFxuICBjb2RlOiAwLFxuICBsb2NhdGlvbjogMCxcbiAgY3RybEtleTogMCxcbiAgc2hpZnRLZXk6IDAsXG4gIGFsdEtleTogMCxcbiAgbWV0YUtleTogMCxcbiAgcmVwZWF0OiAwLFxuICBsb2NhbGU6IDAsXG4gIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJTdGF0ZSxcbiAgLy8gTGVnYWN5IEludGVyZmFjZVxuICBjaGFyQ29kZTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gYGNoYXJDb2RlYCBpcyB0aGUgcmVzdWx0IG9mIGEgS2V5UHJlc3MgZXZlbnQgYW5kIHJlcHJlc2VudHMgdGhlIHZhbHVlIG9mXG4gICAgLy8gdGhlIGFjdHVhbCBwcmludGFibGUgY2hhcmFjdGVyLlxuICAgIC8vIEtleVByZXNzIGlzIGRlcHJlY2F0ZWQsIGJ1dCBpdHMgcmVwbGFjZW1lbnQgaXMgbm90IHlldCBmaW5hbCBhbmQgbm90XG4gICAgLy8gaW1wbGVtZW50ZWQgaW4gYW55IG1ham9yIGJyb3dzZXIuIE9ubHkgS2V5UHJlc3MgaGFzIGNoYXJDb2RlLlxuICAgIGlmIChldmVudC50eXBlID09PSAna2V5cHJlc3MnKSB7XG4gICAgICByZXR1cm4gZ2V0RXZlbnRDaGFyQ29kZShldmVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH0sXG4gIGtleUNvZGU6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIGBrZXlDb2RlYCBpcyB0aGUgcmVzdWx0IG9mIGEgS2V5RG93bi9VcCBldmVudCBhbmQgcmVwcmVzZW50cyB0aGUgdmFsdWUgb2ZcbiAgICAvLyBwaHlzaWNhbCBrZXlib2FyZCBrZXkuXG4gICAgLy8gVGhlIGFjdHVhbCBtZWFuaW5nIG9mIHRoZSB2YWx1ZSBkZXBlbmRzIG9uIHRoZSB1c2Vycycga2V5Ym9hcmQgbGF5b3V0XG4gICAgLy8gd2hpY2ggY2Fubm90IGJlIGRldGVjdGVkLiBBc3N1bWluZyB0aGF0IGl0IGlzIGEgVVMga2V5Ym9hcmQgbGF5b3V0XG4gICAgLy8gcHJvdmlkZXMgYSBzdXJwcmlzaW5nbHkgYWNjdXJhdGUgbWFwcGluZyBmb3IgVVMgYW5kIEV1cm9wZWFuIHVzZXJzLlxuICAgIC8vIER1ZSB0byB0aGlzLCBpdCBpcyBsZWZ0IHRvIHRoZSB1c2VyIHRvIGltcGxlbWVudCBhdCB0aGlzIHRpbWUuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdrZXlkb3duJyB8fCBldmVudC50eXBlID09PSAna2V5dXAnKSB7XG4gICAgICByZXR1cm4gZXZlbnQua2V5Q29kZTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfSxcbiAgd2hpY2g6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIGB3aGljaGAgaXMgYW4gYWxpYXMgZm9yIGVpdGhlciBga2V5Q29kZWAgb3IgYGNoYXJDb2RlYCBkZXBlbmRpbmcgb24gdGhlXG4gICAgLy8gdHlwZSBvZiB0aGUgZXZlbnQuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdrZXlwcmVzcycpIHtcbiAgICAgIHJldHVybiBnZXRFdmVudENoYXJDb2RlKGV2ZW50KTtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleWRvd24nIHx8IGV2ZW50LnR5cGUgPT09ICdrZXl1cCcpIHtcbiAgICAgIHJldHVybiBldmVudC5rZXlDb2RlO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9XG59KTtcblxudmFyIFN5bnRoZXRpY0tleWJvYXJkRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChLZXlib2FyZEV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBQb2ludGVyRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvcG9pbnRlcmV2ZW50cy9cbiAqL1xuXG52YXIgUG9pbnRlckV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBNb3VzZUV2ZW50SW50ZXJmYWNlLCB7XG4gIHBvaW50ZXJJZDogMCxcbiAgd2lkdGg6IDAsXG4gIGhlaWdodDogMCxcbiAgcHJlc3N1cmU6IDAsXG4gIHRhbmdlbnRpYWxQcmVzc3VyZTogMCxcbiAgdGlsdFg6IDAsXG4gIHRpbHRZOiAwLFxuICB0d2lzdDogMCxcbiAgcG9pbnRlclR5cGU6IDAsXG4gIGlzUHJpbWFyeTogMFxufSk7XG5cbnZhciBTeW50aGV0aWNQb2ludGVyRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChQb2ludGVyRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIFRvdWNoRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvdG91Y2gtZXZlbnRzL1xuICovXG5cbnZhciBUb3VjaEV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBVSUV2ZW50SW50ZXJmYWNlLCB7XG4gIHRvdWNoZXM6IDAsXG4gIHRhcmdldFRvdWNoZXM6IDAsXG4gIGNoYW5nZWRUb3VjaGVzOiAwLFxuICBhbHRLZXk6IDAsXG4gIG1ldGFLZXk6IDAsXG4gIGN0cmxLZXk6IDAsXG4gIHNoaWZ0S2V5OiAwLFxuICBnZXRNb2RpZmllclN0YXRlOiBnZXRFdmVudE1vZGlmaWVyU3RhdGVcbn0pO1xuXG52YXIgU3ludGhldGljVG91Y2hFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFRvdWNoRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDkvV0QtY3NzMy10cmFuc2l0aW9ucy0yMDA5MDMyMC8jdHJhbnNpdGlvbi1ldmVudHMtXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9UcmFuc2l0aW9uRXZlbnRcbiAqL1xuXG52YXIgVHJhbnNpdGlvbkV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwge1xuICBwcm9wZXJ0eU5hbWU6IDAsXG4gIGVsYXBzZWRUaW1lOiAwLFxuICBwc2V1ZG9FbGVtZW50OiAwXG59KTtcblxudmFyIFN5bnRoZXRpY1RyYW5zaXRpb25FdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFRyYW5zaXRpb25FdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgV2hlZWxFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxudmFyIFdoZWVsRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIE1vdXNlRXZlbnRJbnRlcmZhY2UsIHtcbiAgZGVsdGFYOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gJ2RlbHRhWCcgaW4gZXZlbnQgPyBldmVudC5kZWx0YVggOiAvLyBGYWxsYmFjayB0byBgd2hlZWxEZWx0YVhgIGZvciBXZWJraXQgYW5kIG5vcm1hbGl6ZSAocmlnaHQgaXMgcG9zaXRpdmUpLlxuICAgICd3aGVlbERlbHRhWCcgaW4gZXZlbnQgPyAtZXZlbnQud2hlZWxEZWx0YVggOiAwO1xuICB9LFxuICBkZWx0YVk6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiAnZGVsdGFZJyBpbiBldmVudCA/IGV2ZW50LmRlbHRhWSA6IC8vIEZhbGxiYWNrIHRvIGB3aGVlbERlbHRhWWAgZm9yIFdlYmtpdCBhbmQgbm9ybWFsaXplIChkb3duIGlzIHBvc2l0aXZlKS5cbiAgICAnd2hlZWxEZWx0YVknIGluIGV2ZW50ID8gLWV2ZW50LndoZWVsRGVsdGFZIDogLy8gRmFsbGJhY2sgdG8gYHdoZWVsRGVsdGFgIGZvciBJRTw5IGFuZCBub3JtYWxpemUgKGRvd24gaXMgcG9zaXRpdmUpLlxuICAgICd3aGVlbERlbHRhJyBpbiBldmVudCA/IC1ldmVudC53aGVlbERlbHRhIDogMDtcbiAgfSxcbiAgZGVsdGFaOiAwLFxuICAvLyBCcm93c2VycyB3aXRob3V0IFwiZGVsdGFNb2RlXCIgaXMgcmVwb3J0aW5nIGluIHJhdyB3aGVlbCBkZWx0YSB3aGVyZSBvbmVcbiAgLy8gbm90Y2ggb24gdGhlIHNjcm9sbCBpcyBhbHdheXMgKy8tIDEyMCwgcm91Z2hseSBlcXVpdmFsZW50IHRvIHBpeGVscy5cbiAgLy8gQSBnb29kIGFwcHJveGltYXRpb24gb2YgRE9NX0RFTFRBX0xJTkUgKDEpIGlzIDUlIG9mIHZpZXdwb3J0IHNpemUgb3JcbiAgLy8gfjQwIHBpeGVscywgZm9yIERPTV9ERUxUQV9TQ1JFRU4gKDIpIGl0IGlzIDg3LjUlIG9mIHZpZXdwb3J0IHNpemUuXG4gIGRlbHRhTW9kZTogMFxufSk7XG5cbnZhciBTeW50aGV0aWNXaGVlbEV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoV2hlZWxFdmVudEludGVyZmFjZSk7XG5cbnZhciBFTkRfS0VZQ09ERVMgPSBbOSwgMTMsIDI3LCAzMl07IC8vIFRhYiwgUmV0dXJuLCBFc2MsIFNwYWNlXG5cbnZhciBTVEFSVF9LRVlDT0RFID0gMjI5O1xudmFyIGNhblVzZUNvbXBvc2l0aW9uRXZlbnQgPSBjYW5Vc2VET00gJiYgJ0NvbXBvc2l0aW9uRXZlbnQnIGluIHdpbmRvdztcbnZhciBkb2N1bWVudE1vZGUgPSBudWxsO1xuXG5pZiAoY2FuVXNlRE9NICYmICdkb2N1bWVudE1vZGUnIGluIGRvY3VtZW50KSB7XG4gIGRvY3VtZW50TW9kZSA9IGRvY3VtZW50LmRvY3VtZW50TW9kZTtcbn0gLy8gV2Via2l0IG9mZmVycyBhIHZlcnkgdXNlZnVsIGB0ZXh0SW5wdXRgIGV2ZW50IHRoYXQgY2FuIGJlIHVzZWQgdG9cbi8vIGRpcmVjdGx5IHJlcHJlc2VudCBgYmVmb3JlSW5wdXRgLiBUaGUgSUUgYHRleHRpbnB1dGAgZXZlbnQgaXMgbm90IGFzXG4vLyB1c2VmdWwsIHNvIHdlIGRvbid0IHVzZSBpdC5cblxuXG52YXIgY2FuVXNlVGV4dElucHV0RXZlbnQgPSBjYW5Vc2VET00gJiYgJ1RleHRFdmVudCcgaW4gd2luZG93ICYmICFkb2N1bWVudE1vZGU7IC8vIEluIElFOSssIHdlIGhhdmUgYWNjZXNzIHRvIGNvbXBvc2l0aW9uIGV2ZW50cywgYnV0IHRoZSBkYXRhIHN1cHBsaWVkXG4vLyBieSB0aGUgbmF0aXZlIGNvbXBvc2l0aW9uZW5kIGV2ZW50IG1heSBiZSBpbmNvcnJlY3QuIEphcGFuZXNlIGlkZW9ncmFwaGljXG4vLyBzcGFjZXMsIGZvciBpbnN0YW5jZSAoXFx1MzAwMCkgYXJlIG5vdCByZWNvcmRlZCBjb3JyZWN0bHkuXG5cbnZhciB1c2VGYWxsYmFja0NvbXBvc2l0aW9uRGF0YSA9IGNhblVzZURPTSAmJiAoIWNhblVzZUNvbXBvc2l0aW9uRXZlbnQgfHwgZG9jdW1lbnRNb2RlICYmIGRvY3VtZW50TW9kZSA+IDggJiYgZG9jdW1lbnRNb2RlIDw9IDExKTtcbnZhciBTUEFDRUJBUl9DT0RFID0gMzI7XG52YXIgU1BBQ0VCQVJfQ0hBUiA9IFN0cmluZy5mcm9tQ2hhckNvZGUoU1BBQ0VCQVJfQ09ERSk7XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyRXZlbnRzKCkge1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQoJ29uQmVmb3JlSW5wdXQnLCBbJ2NvbXBvc2l0aW9uZW5kJywgJ2tleXByZXNzJywgJ3RleHRJbnB1dCcsICdwYXN0ZSddKTtcbiAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KCdvbkNvbXBvc2l0aW9uRW5kJywgWydjb21wb3NpdGlvbmVuZCcsICdmb2N1c291dCcsICdrZXlkb3duJywgJ2tleXByZXNzJywgJ2tleXVwJywgJ21vdXNlZG93biddKTtcbiAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KCdvbkNvbXBvc2l0aW9uU3RhcnQnLCBbJ2NvbXBvc2l0aW9uc3RhcnQnLCAnZm9jdXNvdXQnLCAna2V5ZG93bicsICdrZXlwcmVzcycsICdrZXl1cCcsICdtb3VzZWRvd24nXSk7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25Db21wb3NpdGlvblVwZGF0ZScsIFsnY29tcG9zaXRpb251cGRhdGUnLCAnZm9jdXNvdXQnLCAna2V5ZG93bicsICdrZXlwcmVzcycsICdrZXl1cCcsICdtb3VzZWRvd24nXSk7XG59IC8vIFRyYWNrIHdoZXRoZXIgd2UndmUgZXZlciBoYW5kbGVkIGEga2V5cHJlc3Mgb24gdGhlIHNwYWNlIGtleS5cblxuXG52YXIgaGFzU3BhY2VLZXlwcmVzcyA9IGZhbHNlO1xuLyoqXG4gKiBSZXR1cm4gd2hldGhlciBhIG5hdGl2ZSBrZXlwcmVzcyBldmVudCBpcyBhc3N1bWVkIHRvIGJlIGEgY29tbWFuZC5cbiAqIFRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSBGaXJlZm94IGZpcmVzIGBrZXlwcmVzc2AgZXZlbnRzIGZvciBrZXkgY29tbWFuZHNcbiAqIChjdXQsIGNvcHksIHNlbGVjdC1hbGwsIGV0Yy4pIGV2ZW4gdGhvdWdoIG5vIGNoYXJhY3RlciBpcyBpbnNlcnRlZC5cbiAqL1xuXG5mdW5jdGlvbiBpc0tleXByZXNzQ29tbWFuZChuYXRpdmVFdmVudCkge1xuICByZXR1cm4gKG5hdGl2ZUV2ZW50LmN0cmxLZXkgfHwgbmF0aXZlRXZlbnQuYWx0S2V5IHx8IG5hdGl2ZUV2ZW50Lm1ldGFLZXkpICYmIC8vIGN0cmxLZXkgJiYgYWx0S2V5IGlzIGVxdWl2YWxlbnQgdG8gQWx0R3IsIGFuZCBpcyBub3QgYSBjb21tYW5kLlxuICAhKG5hdGl2ZUV2ZW50LmN0cmxLZXkgJiYgbmF0aXZlRXZlbnQuYWx0S2V5KTtcbn1cbi8qKlxuICogVHJhbnNsYXRlIG5hdGl2ZSB0b3AgbGV2ZWwgZXZlbnRzIGludG8gZXZlbnQgdHlwZXMuXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRDb21wb3NpdGlvbkV2ZW50VHlwZShkb21FdmVudE5hbWUpIHtcbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdjb21wb3NpdGlvbnN0YXJ0JzpcbiAgICAgIHJldHVybiAnb25Db21wb3NpdGlvblN0YXJ0JztcblxuICAgIGNhc2UgJ2NvbXBvc2l0aW9uZW5kJzpcbiAgICAgIHJldHVybiAnb25Db21wb3NpdGlvbkVuZCc7XG5cbiAgICBjYXNlICdjb21wb3NpdGlvbnVwZGF0ZSc6XG4gICAgICByZXR1cm4gJ29uQ29tcG9zaXRpb25VcGRhdGUnO1xuICB9XG59XG4vKipcbiAqIERvZXMgb3VyIGZhbGxiYWNrIGJlc3QtZ3Vlc3MgbW9kZWwgdGhpbmsgdGhpcyBldmVudCBzaWduaWZpZXMgdGhhdFxuICogY29tcG9zaXRpb24gaGFzIGJlZ3VuP1xuICovXG5cblxuZnVuY3Rpb24gaXNGYWxsYmFja0NvbXBvc2l0aW9uU3RhcnQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICByZXR1cm4gZG9tRXZlbnROYW1lID09PSAna2V5ZG93bicgJiYgbmF0aXZlRXZlbnQua2V5Q29kZSA9PT0gU1RBUlRfS0VZQ09ERTtcbn1cbi8qKlxuICogRG9lcyBvdXIgZmFsbGJhY2sgbW9kZSB0aGluayB0aGF0IHRoaXMgZXZlbnQgaXMgdGhlIGVuZCBvZiBjb21wb3NpdGlvbj9cbiAqL1xuXG5cbmZ1bmN0aW9uIGlzRmFsbGJhY2tDb21wb3NpdGlvbkVuZChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSB7XG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSAna2V5dXAnOlxuICAgICAgLy8gQ29tbWFuZCBrZXlzIGluc2VydCBvciBjbGVhciBJTUUgaW5wdXQuXG4gICAgICByZXR1cm4gRU5EX0tFWUNPREVTLmluZGV4T2YobmF0aXZlRXZlbnQua2V5Q29kZSkgIT09IC0xO1xuXG4gICAgY2FzZSAna2V5ZG93bic6XG4gICAgICAvLyBFeHBlY3QgSU1FIGtleUNvZGUgb24gZWFjaCBrZXlkb3duLiBJZiB3ZSBnZXQgYW55IG90aGVyXG4gICAgICAvLyBjb2RlIHdlIG11c3QgaGF2ZSBleGl0ZWQgZWFybGllci5cbiAgICAgIHJldHVybiBuYXRpdmVFdmVudC5rZXlDb2RlICE9PSBTVEFSVF9LRVlDT0RFO1xuXG4gICAgY2FzZSAna2V5cHJlc3MnOlxuICAgIGNhc2UgJ21vdXNlZG93bic6XG4gICAgY2FzZSAnZm9jdXNvdXQnOlxuICAgICAgLy8gRXZlbnRzIGFyZSBub3QgcG9zc2libGUgd2l0aG91dCBjYW5jZWxsaW5nIElNRS5cbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuLyoqXG4gKiBHb29nbGUgSW5wdXQgVG9vbHMgcHJvdmlkZXMgY29tcG9zaXRpb24gZGF0YSB2aWEgYSBDdXN0b21FdmVudCxcbiAqIHdpdGggdGhlIGBkYXRhYCBwcm9wZXJ0eSBwb3B1bGF0ZWQgaW4gdGhlIGBkZXRhaWxgIG9iamVjdC4gSWYgdGhpc1xuICogaXMgYXZhaWxhYmxlIG9uIHRoZSBldmVudCBvYmplY3QsIHVzZSBpdC4gSWYgbm90LCB0aGlzIGlzIGEgcGxhaW5cbiAqIGNvbXBvc2l0aW9uIGV2ZW50IGFuZCB3ZSBoYXZlIG5vdGhpbmcgc3BlY2lhbCB0byBleHRyYWN0LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudFxuICogQHJldHVybiB7P3N0cmluZ31cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldERhdGFGcm9tQ3VzdG9tRXZlbnQobmF0aXZlRXZlbnQpIHtcbiAgdmFyIGRldGFpbCA9IG5hdGl2ZUV2ZW50LmRldGFpbDtcblxuICBpZiAodHlwZW9mIGRldGFpbCA9PT0gJ29iamVjdCcgJiYgJ2RhdGEnIGluIGRldGFpbCkge1xuICAgIHJldHVybiBkZXRhaWwuZGF0YTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuLyoqXG4gKiBDaGVjayBpZiBhIGNvbXBvc2l0aW9uIGV2ZW50IHdhcyB0cmlnZ2VyZWQgYnkgS29yZWFuIElNRS5cbiAqIE91ciBmYWxsYmFjayBtb2RlIGRvZXMgbm90IHdvcmsgd2VsbCB3aXRoIElFJ3MgS29yZWFuIElNRSxcbiAqIHNvIGp1c3QgdXNlIG5hdGl2ZSBjb21wb3NpdGlvbiBldmVudHMgd2hlbiBLb3JlYW4gSU1FIGlzIHVzZWQuXG4gKiBBbHRob3VnaCBDb21wb3NpdGlvbkV2ZW50LmxvY2FsZSBwcm9wZXJ0eSBpcyBkZXByZWNhdGVkLFxuICogaXQgaXMgYXZhaWxhYmxlIGluIElFLCB3aGVyZSBvdXIgZmFsbGJhY2sgbW9kZSBpcyBlbmFibGVkLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudFxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuXG5cbmZ1bmN0aW9uIGlzVXNpbmdLb3JlYW5JTUUobmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIG5hdGl2ZUV2ZW50LmxvY2FsZSA9PT0gJ2tvJztcbn0gLy8gVHJhY2sgdGhlIGN1cnJlbnQgSU1FIGNvbXBvc2l0aW9uIHN0YXR1cywgaWYgYW55LlxuXG5cbnZhciBpc0NvbXBvc2luZyA9IGZhbHNlO1xuLyoqXG4gKiBAcmV0dXJuIHs/b2JqZWN0fSBBIFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQuXG4gKi9cblxuZnVuY3Rpb24gZXh0cmFjdENvbXBvc2l0aW9uRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgdmFyIGV2ZW50VHlwZTtcbiAgdmFyIGZhbGxiYWNrRGF0YTtcblxuICBpZiAoY2FuVXNlQ29tcG9zaXRpb25FdmVudCkge1xuICAgIGV2ZW50VHlwZSA9IGdldENvbXBvc2l0aW9uRXZlbnRUeXBlKGRvbUV2ZW50TmFtZSk7XG4gIH0gZWxzZSBpZiAoIWlzQ29tcG9zaW5nKSB7XG4gICAgaWYgKGlzRmFsbGJhY2tDb21wb3NpdGlvblN0YXJ0KGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpKSB7XG4gICAgICBldmVudFR5cGUgPSAnb25Db21wb3NpdGlvblN0YXJ0JztcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNGYWxsYmFja0NvbXBvc2l0aW9uRW5kKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpKSB7XG4gICAgZXZlbnRUeXBlID0gJ29uQ29tcG9zaXRpb25FbmQnO1xuICB9XG5cbiAgaWYgKCFldmVudFR5cGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmICh1c2VGYWxsYmFja0NvbXBvc2l0aW9uRGF0YSAmJiAhaXNVc2luZ0tvcmVhbklNRShuYXRpdmVFdmVudCkpIHtcbiAgICAvLyBUaGUgY3VycmVudCBjb21wb3NpdGlvbiBpcyBzdG9yZWQgc3RhdGljYWxseSBhbmQgbXVzdCBub3QgYmVcbiAgICAvLyBvdmVyd3JpdHRlbiB3aGlsZSBjb21wb3NpdGlvbiBjb250aW51ZXMuXG4gICAgaWYgKCFpc0NvbXBvc2luZyAmJiBldmVudFR5cGUgPT09ICdvbkNvbXBvc2l0aW9uU3RhcnQnKSB7XG4gICAgICBpc0NvbXBvc2luZyA9IGluaXRpYWxpemUobmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSAnb25Db21wb3NpdGlvbkVuZCcpIHtcbiAgICAgIGlmIChpc0NvbXBvc2luZykge1xuICAgICAgICBmYWxsYmFja0RhdGEgPSBnZXREYXRhKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGxpc3RlbmVycyA9IGFjY3VtdWxhdGVUd29QaGFzZUxpc3RlbmVycyh0YXJnZXRJbnN0LCBldmVudFR5cGUpO1xuXG4gIGlmIChsaXN0ZW5lcnMubGVuZ3RoID4gMCkge1xuICAgIHZhciBldmVudCA9IG5ldyBTeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50KGV2ZW50VHlwZSwgZG9tRXZlbnROYW1lLCBudWxsLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICBldmVudDogZXZlbnQsXG4gICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVyc1xuICAgIH0pO1xuXG4gICAgaWYgKGZhbGxiYWNrRGF0YSkge1xuICAgICAgLy8gSW5qZWN0IGRhdGEgZ2VuZXJhdGVkIGZyb20gZmFsbGJhY2sgcGF0aCBpbnRvIHRoZSBzeW50aGV0aWMgZXZlbnQuXG4gICAgICAvLyBUaGlzIG1hdGNoZXMgdGhlIHByb3BlcnR5IG9mIG5hdGl2ZSBDb21wb3NpdGlvbkV2ZW50SW50ZXJmYWNlLlxuICAgICAgZXZlbnQuZGF0YSA9IGZhbGxiYWNrRGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGN1c3RvbURhdGEgPSBnZXREYXRhRnJvbUN1c3RvbUV2ZW50KG5hdGl2ZUV2ZW50KTtcblxuICAgICAgaWYgKGN1c3RvbURhdGEgIT09IG51bGwpIHtcbiAgICAgICAgZXZlbnQuZGF0YSA9IGN1c3RvbURhdGE7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldE5hdGl2ZUJlZm9yZUlucHV0Q2hhcnMoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ2NvbXBvc2l0aW9uZW5kJzpcbiAgICAgIHJldHVybiBnZXREYXRhRnJvbUN1c3RvbUV2ZW50KG5hdGl2ZUV2ZW50KTtcblxuICAgIGNhc2UgJ2tleXByZXNzJzpcbiAgICAgIC8qKlxuICAgICAgICogSWYgbmF0aXZlIGB0ZXh0SW5wdXRgIGV2ZW50cyBhcmUgYXZhaWxhYmxlLCBvdXIgZ29hbCBpcyB0byBtYWtlXG4gICAgICAgKiB1c2Ugb2YgdGhlbS4gSG93ZXZlciwgdGhlcmUgaXMgYSBzcGVjaWFsIGNhc2U6IHRoZSBzcGFjZWJhciBrZXkuXG4gICAgICAgKiBJbiBXZWJraXQsIHByZXZlbnRpbmcgZGVmYXVsdCBvbiBhIHNwYWNlYmFyIGB0ZXh0SW5wdXRgIGV2ZW50XG4gICAgICAgKiBjYW5jZWxzIGNoYXJhY3RlciBpbnNlcnRpb24sIGJ1dCBpdCAqYWxzbyogY2F1c2VzIHRoZSBicm93c2VyXG4gICAgICAgKiB0byBmYWxsIGJhY2sgdG8gaXRzIGRlZmF1bHQgc3BhY2ViYXIgYmVoYXZpb3Igb2Ygc2Nyb2xsaW5nIHRoZVxuICAgICAgICogcGFnZS5cbiAgICAgICAqXG4gICAgICAgKiBUcmFja2luZyBhdDpcbiAgICAgICAqIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0zNTUxMDNcbiAgICAgICAqXG4gICAgICAgKiBUbyBhdm9pZCB0aGlzIGlzc3VlLCB1c2UgdGhlIGtleXByZXNzIGV2ZW50IGFzIGlmIG5vIGB0ZXh0SW5wdXRgXG4gICAgICAgKiBldmVudCBpcyBhdmFpbGFibGUuXG4gICAgICAgKi9cbiAgICAgIHZhciB3aGljaCA9IG5hdGl2ZUV2ZW50LndoaWNoO1xuXG4gICAgICBpZiAod2hpY2ggIT09IFNQQUNFQkFSX0NPREUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGhhc1NwYWNlS2V5cHJlc3MgPSB0cnVlO1xuICAgICAgcmV0dXJuIFNQQUNFQkFSX0NIQVI7XG5cbiAgICBjYXNlICd0ZXh0SW5wdXQnOlxuICAgICAgLy8gUmVjb3JkIHRoZSBjaGFyYWN0ZXJzIHRvIGJlIGFkZGVkIHRvIHRoZSBET00uXG4gICAgICB2YXIgY2hhcnMgPSBuYXRpdmVFdmVudC5kYXRhOyAvLyBJZiBpdCdzIGEgc3BhY2ViYXIgY2hhcmFjdGVyLCBhc3N1bWUgdGhhdCB3ZSBoYXZlIGFscmVhZHkgaGFuZGxlZFxuICAgICAgLy8gaXQgYXQgdGhlIGtleXByZXNzIGxldmVsIGFuZCBiYWlsIGltbWVkaWF0ZWx5LiBBbmRyb2lkIENocm9tZVxuICAgICAgLy8gZG9lc24ndCBnaXZlIHVzIGtleWNvZGVzLCBzbyB3ZSBuZWVkIHRvIGlnbm9yZSBpdC5cblxuICAgICAgaWYgKGNoYXJzID09PSBTUEFDRUJBUl9DSEFSICYmIGhhc1NwYWNlS2V5cHJlc3MpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjaGFycztcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBGb3Igb3RoZXIgbmF0aXZlIGV2ZW50IHR5cGVzLCBkbyBub3RoaW5nLlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbi8qKlxuICogRm9yIGJyb3dzZXJzIHRoYXQgZG8gbm90IHByb3ZpZGUgdGhlIGB0ZXh0SW5wdXRgIGV2ZW50LCBleHRyYWN0IHRoZVxuICogYXBwcm9wcmlhdGUgc3RyaW5nIHRvIHVzZSBmb3IgU3ludGhldGljSW5wdXRFdmVudC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEZhbGxiYWNrQmVmb3JlSW5wdXRDaGFycyhkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSB7XG4gIC8vIElmIHdlIGFyZSBjdXJyZW50bHkgY29tcG9zaW5nIChJTUUpIGFuZCB1c2luZyBhIGZhbGxiYWNrIHRvIGRvIHNvLFxuICAvLyB0cnkgdG8gZXh0cmFjdCB0aGUgY29tcG9zZWQgY2hhcmFjdGVycyBmcm9tIHRoZSBmYWxsYmFjayBvYmplY3QuXG4gIC8vIElmIGNvbXBvc2l0aW9uIGV2ZW50IGlzIGF2YWlsYWJsZSwgd2UgZXh0cmFjdCBhIHN0cmluZyBvbmx5IGF0XG4gIC8vIGNvbXBvc2l0aW9uZXZlbnQsIG90aGVyd2lzZSBleHRyYWN0IGl0IGF0IGZhbGxiYWNrIGV2ZW50cy5cbiAgaWYgKGlzQ29tcG9zaW5nKSB7XG4gICAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2NvbXBvc2l0aW9uZW5kJyB8fCAhY2FuVXNlQ29tcG9zaXRpb25FdmVudCAmJiBpc0ZhbGxiYWNrQ29tcG9zaXRpb25FbmQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkpIHtcbiAgICAgIHZhciBjaGFycyA9IGdldERhdGEoKTtcbiAgICAgIHJlc2V0KCk7XG4gICAgICBpc0NvbXBvc2luZyA9IGZhbHNlO1xuICAgICAgcmV0dXJuIGNoYXJzO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdwYXN0ZSc6XG4gICAgICAvLyBJZiBhIHBhc3RlIGV2ZW50IG9jY3VycyBhZnRlciBhIGtleXByZXNzLCB0aHJvdyBvdXQgdGhlIGlucHV0XG4gICAgICAvLyBjaGFycy4gUGFzdGUgZXZlbnRzIHNob3VsZCBub3QgbGVhZCB0byBCZWZvcmVJbnB1dCBldmVudHMuXG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgJ2tleXByZXNzJzpcbiAgICAgIC8qKlxuICAgICAgICogQXMgb2YgdjI3LCBGaXJlZm94IG1heSBmaXJlIGtleXByZXNzIGV2ZW50cyBldmVuIHdoZW4gbm8gY2hhcmFjdGVyXG4gICAgICAgKiB3aWxsIGJlIGluc2VydGVkLiBBIGZldyBwb3NzaWJpbGl0aWVzOlxuICAgICAgICpcbiAgICAgICAqIC0gYHdoaWNoYCBpcyBgMGAuIEFycm93IGtleXMsIEVzYyBrZXksIGV0Yy5cbiAgICAgICAqXG4gICAgICAgKiAtIGB3aGljaGAgaXMgdGhlIHByZXNzZWQga2V5IGNvZGUsIGJ1dCBubyBjaGFyIGlzIGF2YWlsYWJsZS5cbiAgICAgICAqICAgRXg6ICdBbHRHciArIGRgIGluIFBvbGlzaC4gVGhlcmUgaXMgbm8gbW9kaWZpZWQgY2hhcmFjdGVyIGZvclxuICAgICAgICogICB0aGlzIGtleSBjb21iaW5hdGlvbiBhbmQgbm8gY2hhcmFjdGVyIGlzIGluc2VydGVkIGludG8gdGhlXG4gICAgICAgKiAgIGRvY3VtZW50LCBidXQgRkYgZmlyZXMgdGhlIGtleXByZXNzIGZvciBjaGFyIGNvZGUgYDEwMGAgYW55d2F5LlxuICAgICAgICogICBObyBgaW5wdXRgIGV2ZW50IHdpbGwgb2NjdXIuXG4gICAgICAgKlxuICAgICAgICogLSBgd2hpY2hgIGlzIHRoZSBwcmVzc2VkIGtleSBjb2RlLCBidXQgYSBjb21tYW5kIGNvbWJpbmF0aW9uIGlzXG4gICAgICAgKiAgIGJlaW5nIHVzZWQuIEV4OiBgQ21kK0NgLiBObyBjaGFyYWN0ZXIgaXMgaW5zZXJ0ZWQsIGFuZCBub1xuICAgICAgICogICBgaW5wdXRgIGV2ZW50IHdpbGwgb2NjdXIuXG4gICAgICAgKi9cbiAgICAgIGlmICghaXNLZXlwcmVzc0NvbW1hbmQobmF0aXZlRXZlbnQpKSB7XG4gICAgICAgIC8vIElFIGZpcmVzIHRoZSBga2V5cHJlc3NgIGV2ZW50IHdoZW4gYSB1c2VyIHR5cGVzIGFuIGVtb2ppIHZpYVxuICAgICAgICAvLyBUb3VjaCBrZXlib2FyZCBvZiBXaW5kb3dzLiAgSW4gc3VjaCBhIGNhc2UsIHRoZSBgY2hhcmAgcHJvcGVydHlcbiAgICAgICAgLy8gaG9sZHMgYW4gZW1vamkgY2hhcmFjdGVyIGxpa2UgYFxcdUQ4M0RcXHVERTBBYC4gIEJlY2F1c2UgaXRzIGxlbmd0aFxuICAgICAgICAvLyBpcyAyLCB0aGUgcHJvcGVydHkgYHdoaWNoYCBkb2VzIG5vdCByZXByZXNlbnQgYW4gZW1vamkgY29ycmVjdGx5LlxuICAgICAgICAvLyBJbiBzdWNoIGEgY2FzZSwgd2UgZGlyZWN0bHkgcmV0dXJuIHRoZSBgY2hhcmAgcHJvcGVydHkgaW5zdGVhZCBvZlxuICAgICAgICAvLyB1c2luZyBgd2hpY2hgLlxuICAgICAgICBpZiAobmF0aXZlRXZlbnQuY2hhciAmJiBuYXRpdmVFdmVudC5jaGFyLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICByZXR1cm4gbmF0aXZlRXZlbnQuY2hhcjtcbiAgICAgICAgfSBlbHNlIGlmIChuYXRpdmVFdmVudC53aGljaCkge1xuICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKG5hdGl2ZUV2ZW50LndoaWNoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgJ2NvbXBvc2l0aW9uZW5kJzpcbiAgICAgIHJldHVybiB1c2VGYWxsYmFja0NvbXBvc2l0aW9uRGF0YSAmJiAhaXNVc2luZ0tvcmVhbklNRShuYXRpdmVFdmVudCkgPyBudWxsIDogbmF0aXZlRXZlbnQuZGF0YTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuLyoqXG4gKiBFeHRyYWN0IGEgU3ludGhldGljSW5wdXRFdmVudCBmb3IgYGJlZm9yZUlucHV0YCwgYmFzZWQgb24gZWl0aGVyIG5hdGl2ZVxuICogYHRleHRJbnB1dGAgb3IgZmFsbGJhY2sgYmVoYXZpb3IuXG4gKlxuICogQHJldHVybiB7P29iamVjdH0gQSBTeW50aGV0aWNJbnB1dEV2ZW50LlxuICovXG5cblxuZnVuY3Rpb24gZXh0cmFjdEJlZm9yZUlucHV0RXZlbnQoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgdmFyIGNoYXJzO1xuXG4gIGlmIChjYW5Vc2VUZXh0SW5wdXRFdmVudCkge1xuICAgIGNoYXJzID0gZ2V0TmF0aXZlQmVmb3JlSW5wdXRDaGFycyhkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KTtcbiAgfSBlbHNlIHtcbiAgICBjaGFycyA9IGdldEZhbGxiYWNrQmVmb3JlSW5wdXRDaGFycyhkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KTtcbiAgfSAvLyBJZiBubyBjaGFyYWN0ZXJzIGFyZSBiZWluZyBpbnNlcnRlZCwgbm8gQmVmb3JlSW5wdXQgZXZlbnQgc2hvdWxkXG4gIC8vIGJlIGZpcmVkLlxuXG5cbiAgaWYgKCFjaGFycykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGxpc3RlbmVycyA9IGFjY3VtdWxhdGVUd29QaGFzZUxpc3RlbmVycyh0YXJnZXRJbnN0LCAnb25CZWZvcmVJbnB1dCcpO1xuXG4gIGlmIChsaXN0ZW5lcnMubGVuZ3RoID4gMCkge1xuICAgIHZhciBldmVudCA9IG5ldyBTeW50aGV0aWNJbnB1dEV2ZW50KCdvbkJlZm9yZUlucHV0JywgJ2JlZm9yZWlucHV0JywgbnVsbCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBkaXNwYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgbGlzdGVuZXJzOiBsaXN0ZW5lcnNcbiAgICB9KTtcbiAgICBldmVudC5kYXRhID0gY2hhcnM7XG4gIH1cbn1cbi8qKlxuICogQ3JlYXRlIGFuIGBvbkJlZm9yZUlucHV0YCBldmVudCB0byBtYXRjaFxuICogaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAxMzExMDUvI2V2ZW50cy1pbnB1dGV2ZW50cy5cbiAqXG4gKiBUaGlzIGV2ZW50IHBsdWdpbiBpcyBiYXNlZCBvbiB0aGUgbmF0aXZlIGB0ZXh0SW5wdXRgIGV2ZW50XG4gKiBhdmFpbGFibGUgaW4gQ2hyb21lLCBTYWZhcmksIE9wZXJhLCBhbmQgSUUuIFRoaXMgZXZlbnQgZmlyZXMgYWZ0ZXJcbiAqIGBvbktleVByZXNzYCBhbmQgYG9uQ29tcG9zaXRpb25FbmRgLCBidXQgYmVmb3JlIGBvbklucHV0YC5cbiAqXG4gKiBgYmVmb3JlSW5wdXRgIGlzIHNwZWMnZCBidXQgbm90IGltcGxlbWVudGVkIGluIGFueSBicm93c2VycywgYW5kXG4gKiB0aGUgYGlucHV0YCBldmVudCBkb2VzIG5vdCBwcm92aWRlIGFueSB1c2VmdWwgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBoYXNcbiAqIGFjdHVhbGx5IGJlZW4gYWRkZWQsIGNvbnRyYXJ5IHRvIHRoZSBzcGVjLiBUaHVzLCBgdGV4dElucHV0YCBpcyB0aGUgYmVzdFxuICogYXZhaWxhYmxlIGV2ZW50IHRvIGlkZW50aWZ5IHRoZSBjaGFyYWN0ZXJzIHRoYXQgaGF2ZSBhY3R1YWxseSBiZWVuIGluc2VydGVkXG4gKiBpbnRvIHRoZSB0YXJnZXQgbm9kZS5cbiAqXG4gKiBUaGlzIHBsdWdpbiBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvciBlbWl0dGluZyBgY29tcG9zaXRpb25gIGV2ZW50cywgdGh1c1xuICogYWxsb3dpbmcgdXMgdG8gc2hhcmUgY29tcG9zaXRpb24gZmFsbGJhY2sgY29kZSBmb3IgYm90aCBgYmVmb3JlSW5wdXRgIGFuZFxuICogYGNvbXBvc2l0aW9uYCBldmVudCB0eXBlcy5cbiAqL1xuXG5cbmZ1bmN0aW9uIGV4dHJhY3RFdmVudHMoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuICBleHRyYWN0Q29tcG9zaXRpb25FdmVudChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gIGV4dHJhY3RCZWZvcmVJbnB1dEV2ZW50KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvbXVsdGlwYWdlL3RoZS1pbnB1dC1lbGVtZW50Lmh0bWwjaW5wdXQtdHlwZS1hdHRyLXN1bW1hcnlcbiAqL1xudmFyIHN1cHBvcnRlZElucHV0VHlwZXMgPSB7XG4gIGNvbG9yOiB0cnVlLFxuICBkYXRlOiB0cnVlLFxuICBkYXRldGltZTogdHJ1ZSxcbiAgJ2RhdGV0aW1lLWxvY2FsJzogdHJ1ZSxcbiAgZW1haWw6IHRydWUsXG4gIG1vbnRoOiB0cnVlLFxuICBudW1iZXI6IHRydWUsXG4gIHBhc3N3b3JkOiB0cnVlLFxuICByYW5nZTogdHJ1ZSxcbiAgc2VhcmNoOiB0cnVlLFxuICB0ZWw6IHRydWUsXG4gIHRleHQ6IHRydWUsXG4gIHRpbWU6IHRydWUsXG4gIHVybDogdHJ1ZSxcbiAgd2VlazogdHJ1ZVxufTtcblxuZnVuY3Rpb24gaXNUZXh0SW5wdXRFbGVtZW50KGVsZW0pIHtcbiAgdmFyIG5vZGVOYW1lID0gZWxlbSAmJiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICBpZiAobm9kZU5hbWUgPT09ICdpbnB1dCcpIHtcbiAgICByZXR1cm4gISFzdXBwb3J0ZWRJbnB1dFR5cGVzW2VsZW0udHlwZV07XG4gIH1cblxuICBpZiAobm9kZU5hbWUgPT09ICd0ZXh0YXJlYScpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYW4gZXZlbnQgaXMgc3VwcG9ydGVkIGluIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBlbnZpcm9ubWVudC5cbiAqXG4gKiBOT1RFOiBUaGlzIHdpbGwgbm90IHdvcmsgY29ycmVjdGx5IGZvciBub24tZ2VuZXJpYyBldmVudHMgc3VjaCBhcyBgY2hhbmdlYCxcbiAqIGByZXNldGAsIGBsb2FkYCwgYGVycm9yYCwgYW5kIGBzZWxlY3RgLlxuICpcbiAqIEJvcnJvd3MgZnJvbSBNb2Rlcm5penIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVN1ZmZpeCBFdmVudCBuYW1lLCBlLmcuIFwiY2xpY2tcIi5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGV2ZW50IGlzIHN1cHBvcnRlZC5cbiAqIEBpbnRlcm5hbFxuICogQGxpY2Vuc2UgTW9kZXJuaXpyIDMuMC4wcHJlIChDdXN0b20gQnVpbGQpIHwgTUlUXG4gKi9cblxuZnVuY3Rpb24gaXNFdmVudFN1cHBvcnRlZChldmVudE5hbWVTdWZmaXgpIHtcbiAgaWYgKCFjYW5Vc2VET00pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgZXZlbnROYW1lID0gJ29uJyArIGV2ZW50TmFtZVN1ZmZpeDtcbiAgdmFyIGlzU3VwcG9ydGVkID0gKGV2ZW50TmFtZSBpbiBkb2N1bWVudCk7XG5cbiAgaWYgKCFpc1N1cHBvcnRlZCkge1xuICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoZXZlbnROYW1lLCAncmV0dXJuOycpO1xuICAgIGlzU3VwcG9ydGVkID0gdHlwZW9mIGVsZW1lbnRbZXZlbnROYW1lXSA9PT0gJ2Z1bmN0aW9uJztcbiAgfVxuXG4gIHJldHVybiBpc1N1cHBvcnRlZDtcbn1cblxuZnVuY3Rpb24gcmVnaXN0ZXJFdmVudHMkMSgpIHtcbiAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KCdvbkNoYW5nZScsIFsnY2hhbmdlJywgJ2NsaWNrJywgJ2ZvY3VzaW4nLCAnZm9jdXNvdXQnLCAnaW5wdXQnLCAna2V5ZG93bicsICdrZXl1cCcsICdzZWxlY3Rpb25jaGFuZ2UnXSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUFuZEFjY3VtdWxhdGVDaGFuZ2VFdmVudChkaXNwYXRjaFF1ZXVlLCBpbnN0LCBuYXRpdmVFdmVudCwgdGFyZ2V0KSB7XG4gIC8vIEZsYWcgdGhpcyBldmVudCBsb29wIGFzIG5lZWRpbmcgc3RhdGUgcmVzdG9yZS5cbiAgZW5xdWV1ZVN0YXRlUmVzdG9yZSh0YXJnZXQpO1xuICB2YXIgbGlzdGVuZXJzID0gYWNjdW11bGF0ZVR3b1BoYXNlTGlzdGVuZXJzKGluc3QsICdvbkNoYW5nZScpO1xuXG4gIGlmIChsaXN0ZW5lcnMubGVuZ3RoID4gMCkge1xuICAgIHZhciBldmVudCA9IG5ldyBTeW50aGV0aWNFdmVudCgnb25DaGFuZ2UnLCAnY2hhbmdlJywgbnVsbCwgbmF0aXZlRXZlbnQsIHRhcmdldCk7XG4gICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgIGxpc3RlbmVyczogbGlzdGVuZXJzXG4gICAgfSk7XG4gIH1cbn1cbi8qKlxuICogRm9yIElFIHNoaW1zXG4gKi9cblxuXG52YXIgYWN0aXZlRWxlbWVudCA9IG51bGw7XG52YXIgYWN0aXZlRWxlbWVudEluc3QgPSBudWxsO1xuLyoqXG4gKiBTRUNUSU9OOiBoYW5kbGUgYGNoYW5nZWAgZXZlbnRcbiAqL1xuXG5mdW5jdGlvbiBzaG91bGRVc2VDaGFuZ2VFdmVudChlbGVtKSB7XG4gIHZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gbm9kZU5hbWUgPT09ICdzZWxlY3QnIHx8IG5vZGVOYW1lID09PSAnaW5wdXQnICYmIGVsZW0udHlwZSA9PT0gJ2ZpbGUnO1xufVxuXG5mdW5jdGlvbiBtYW51YWxEaXNwYXRjaENoYW5nZUV2ZW50KG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBkaXNwYXRjaFF1ZXVlID0gW107XG4gIGNyZWF0ZUFuZEFjY3VtdWxhdGVDaGFuZ2VFdmVudChkaXNwYXRjaFF1ZXVlLCBhY3RpdmVFbGVtZW50SW5zdCwgbmF0aXZlRXZlbnQsIGdldEV2ZW50VGFyZ2V0KG5hdGl2ZUV2ZW50KSk7IC8vIElmIGNoYW5nZSBhbmQgcHJvcGVydHljaGFuZ2UgYnViYmxlZCwgd2UnZCBqdXN0IGJpbmQgdG8gaXQgbGlrZSBhbGwgdGhlXG4gIC8vIG90aGVyIGV2ZW50cyBhbmQgaGF2ZSBpdCBnbyB0aHJvdWdoIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci4gU2luY2UgaXRcbiAgLy8gZG9lc24ndCwgd2UgbWFudWFsbHkgbGlzdGVuIGZvciB0aGUgZXZlbnRzIGFuZCBzbyB3ZSBoYXZlIHRvIGVucXVldWUgYW5kXG4gIC8vIHByb2Nlc3MgdGhlIGFic3RyYWN0IGV2ZW50IG1hbnVhbGx5LlxuICAvL1xuICAvLyBCYXRjaGluZyBpcyBuZWNlc3NhcnkgaGVyZSBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCBhbGwgZXZlbnQgaGFuZGxlcnMgcnVuXG4gIC8vIGJlZm9yZSB0aGUgbmV4dCByZXJlbmRlciAoaW5jbHVkaW5nIGV2ZW50IGhhbmRsZXJzIGF0dGFjaGVkIHRvIGFuY2VzdG9yXG4gIC8vIGVsZW1lbnRzIGluc3RlYWQgb2YgZGlyZWN0bHkgb24gdGhlIGlucHV0KS4gV2l0aG91dCB0aGlzLCBjb250cm9sbGVkXG4gIC8vIGNvbXBvbmVudHMgZG9uJ3Qgd29yayBwcm9wZXJseSBpbiBjb25qdW5jdGlvbiB3aXRoIGV2ZW50IGJ1YmJsaW5nIGJlY2F1c2VcbiAgLy8gdGhlIGNvbXBvbmVudCBpcyByZXJlbmRlcmVkIGFuZCB0aGUgdmFsdWUgcmV2ZXJ0ZWQgYmVmb3JlIGFsbCB0aGUgZXZlbnRcbiAgLy8gaGFuZGxlcnMgY2FuIHJ1bi4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNzA4LlxuXG4gIGJhdGNoZWRVcGRhdGVzKHJ1bkV2ZW50SW5CYXRjaCwgZGlzcGF0Y2hRdWV1ZSk7XG59XG5cbmZ1bmN0aW9uIHJ1bkV2ZW50SW5CYXRjaChkaXNwYXRjaFF1ZXVlKSB7XG4gIHByb2Nlc3NEaXNwYXRjaFF1ZXVlKGRpc3BhdGNoUXVldWUsIDApO1xufVxuXG5mdW5jdGlvbiBnZXRJbnN0SWZWYWx1ZUNoYW5nZWQodGFyZ2V0SW5zdCkge1xuICB2YXIgdGFyZ2V0Tm9kZSA9IGdldE5vZGVGcm9tSW5zdGFuY2UodGFyZ2V0SW5zdCk7XG5cbiAgaWYgKHVwZGF0ZVZhbHVlSWZDaGFuZ2VkKHRhcmdldE5vZGUpKSB7XG4gICAgcmV0dXJuIHRhcmdldEluc3Q7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvckNoYW5nZUV2ZW50KGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCkge1xuICBpZiAoZG9tRXZlbnROYW1lID09PSAnY2hhbmdlJykge1xuICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICB9XG59XG4vKipcbiAqIFNFQ1RJT046IGhhbmRsZSBgaW5wdXRgIGV2ZW50XG4gKi9cblxuXG52YXIgaXNJbnB1dEV2ZW50U3VwcG9ydGVkID0gZmFsc2U7XG5cbmlmIChjYW5Vc2VET00pIHtcbiAgLy8gSUU5IGNsYWltcyB0byBzdXBwb3J0IHRoZSBpbnB1dCBldmVudCBidXQgZmFpbHMgdG8gdHJpZ2dlciBpdCB3aGVuXG4gIC8vIGRlbGV0aW5nIHRleHQsIHNvIHdlIGlnbm9yZSBpdHMgaW5wdXQgZXZlbnRzLlxuICBpc0lucHV0RXZlbnRTdXBwb3J0ZWQgPSBpc0V2ZW50U3VwcG9ydGVkKCdpbnB1dCcpICYmICghZG9jdW1lbnQuZG9jdW1lbnRNb2RlIHx8IGRvY3VtZW50LmRvY3VtZW50TW9kZSA+IDkpO1xufVxuLyoqXG4gKiAoRm9yIElFIDw9OSkgU3RhcnRzIHRyYWNraW5nIHByb3BlcnR5Y2hhbmdlIGV2ZW50cyBvbiB0aGUgcGFzc2VkLWluIGVsZW1lbnRcbiAqIGFuZCBvdmVycmlkZSB0aGUgdmFsdWUgcHJvcGVydHkgc28gdGhhdCB3ZSBjYW4gZGlzdGluZ3Vpc2ggdXNlciBldmVudHMgZnJvbVxuICogdmFsdWUgY2hhbmdlcyBpbiBKUy5cbiAqL1xuXG5cbmZ1bmN0aW9uIHN0YXJ0V2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSh0YXJnZXQsIHRhcmdldEluc3QpIHtcbiAgYWN0aXZlRWxlbWVudCA9IHRhcmdldDtcbiAgYWN0aXZlRWxlbWVudEluc3QgPSB0YXJnZXRJbnN0O1xuICBhY3RpdmVFbGVtZW50LmF0dGFjaEV2ZW50KCdvbnByb3BlcnR5Y2hhbmdlJywgaGFuZGxlUHJvcGVydHlDaGFuZ2UpO1xufVxuLyoqXG4gKiAoRm9yIElFIDw9OSkgUmVtb3ZlcyB0aGUgZXZlbnQgbGlzdGVuZXJzIGZyb20gdGhlIGN1cnJlbnRseS10cmFja2VkIGVsZW1lbnQsXG4gKiBpZiBhbnkgZXhpc3RzLlxuICovXG5cblxuZnVuY3Rpb24gc3RvcFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UoKSB7XG4gIGlmICghYWN0aXZlRWxlbWVudCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGFjdGl2ZUVsZW1lbnQuZGV0YWNoRXZlbnQoJ29ucHJvcGVydHljaGFuZ2UnLCBoYW5kbGVQcm9wZXJ0eUNoYW5nZSk7XG4gIGFjdGl2ZUVsZW1lbnQgPSBudWxsO1xuICBhY3RpdmVFbGVtZW50SW5zdCA9IG51bGw7XG59XG4vKipcbiAqIChGb3IgSUUgPD05KSBIYW5kbGVzIGEgcHJvcGVydHljaGFuZ2UgZXZlbnQsIHNlbmRpbmcgYSBgY2hhbmdlYCBldmVudCBpZlxuICogdGhlIHZhbHVlIG9mIHRoZSBhY3RpdmUgZWxlbWVudCBoYXMgY2hhbmdlZC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGhhbmRsZVByb3BlcnR5Q2hhbmdlKG5hdGl2ZUV2ZW50KSB7XG4gIGlmIChuYXRpdmVFdmVudC5wcm9wZXJ0eU5hbWUgIT09ICd2YWx1ZScpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKGFjdGl2ZUVsZW1lbnRJbnN0KSkge1xuICAgIG1hbnVhbERpc3BhdGNoQ2hhbmdlRXZlbnQobmF0aXZlRXZlbnQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUV2ZW50c0ZvcklucHV0RXZlbnRQb2x5ZmlsbChkb21FdmVudE5hbWUsIHRhcmdldCwgdGFyZ2V0SW5zdCkge1xuICBpZiAoZG9tRXZlbnROYW1lID09PSAnZm9jdXNpbicpIHtcbiAgICAvLyBJbiBJRTksIHByb3BlcnR5Y2hhbmdlIGZpcmVzIGZvciBtb3N0IGlucHV0IGV2ZW50cyBidXQgaXMgYnVnZ3kgYW5kXG4gICAgLy8gZG9lc24ndCBmaXJlIHdoZW4gdGV4dCBpcyBkZWxldGVkLCBidXQgY29udmVuaWVudGx5LCBzZWxlY3Rpb25jaGFuZ2VcbiAgICAvLyBhcHBlYXJzIHRvIGZpcmUgaW4gYWxsIG9mIHRoZSByZW1haW5pbmcgY2FzZXMgc28gd2UgY2F0Y2ggdGhvc2UgYW5kXG4gICAgLy8gZm9yd2FyZCB0aGUgZXZlbnQgaWYgdGhlIHZhbHVlIGhhcyBjaGFuZ2VkXG4gICAgLy8gSW4gZWl0aGVyIGNhc2UsIHdlIGRvbid0IHdhbnQgdG8gY2FsbCB0aGUgZXZlbnQgaGFuZGxlciBpZiB0aGUgdmFsdWVcbiAgICAvLyBpcyBjaGFuZ2VkIGZyb20gSlMgc28gd2UgcmVkZWZpbmUgYSBzZXR0ZXIgZm9yIGAudmFsdWVgIHRoYXQgdXBkYXRlc1xuICAgIC8vIG91ciBhY3RpdmVFbGVtZW50VmFsdWUgdmFyaWFibGUsIGFsbG93aW5nIHVzIHRvIGlnbm9yZSB0aG9zZSBjaGFuZ2VzXG4gICAgLy9cbiAgICAvLyBzdG9wV2F0Y2hpbmcoKSBzaG91bGQgYmUgYSBub29wIGhlcmUgYnV0IHdlIGNhbGwgaXQganVzdCBpbiBjYXNlIHdlXG4gICAgLy8gbWlzc2VkIGEgYmx1ciBldmVudCBzb21laG93LlxuICAgIHN0b3BXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKCk7XG4gICAgc3RhcnRXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKHRhcmdldCwgdGFyZ2V0SW5zdCk7XG4gIH0gZWxzZSBpZiAoZG9tRXZlbnROYW1lID09PSAnZm9jdXNvdXQnKSB7XG4gICAgc3RvcFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UoKTtcbiAgfVxufSAvLyBGb3IgSUU4IGFuZCBJRTkuXG5cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvcklucHV0RXZlbnRQb2x5ZmlsbChkb21FdmVudE5hbWUsIHRhcmdldEluc3QpIHtcbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ3NlbGVjdGlvbmNoYW5nZScgfHwgZG9tRXZlbnROYW1lID09PSAna2V5dXAnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ2tleWRvd24nKSB7XG4gICAgLy8gT24gdGhlIHNlbGVjdGlvbmNoYW5nZSBldmVudCwgdGhlIHRhcmdldCBpcyBqdXN0IGRvY3VtZW50IHdoaWNoIGlzbid0XG4gICAgLy8gaGVscGZ1bCBmb3IgdXMgc28ganVzdCBjaGVjayBhY3RpdmVFbGVtZW50IGluc3RlYWQuXG4gICAgLy9cbiAgICAvLyA5OSUgb2YgdGhlIHRpbWUsIGtleWRvd24gYW5kIGtleXVwIGFyZW4ndCBuZWNlc3NhcnkuIElFOCBmYWlscyB0byBmaXJlXG4gICAgLy8gcHJvcGVydHljaGFuZ2Ugb24gdGhlIGZpcnN0IGlucHV0IGV2ZW50IGFmdGVyIHNldHRpbmcgYHZhbHVlYCBmcm9tIGFcbiAgICAvLyBzY3JpcHQgYW5kIGZpcmVzIG9ubHkga2V5ZG93biwga2V5cHJlc3MsIGtleXVwLiBDYXRjaGluZyBrZXl1cCB1c3VhbGx5XG4gICAgLy8gZ2V0cyBpdCBhbmQgY2F0Y2hpbmcga2V5ZG93biBsZXRzIHVzIGZpcmUgYW4gZXZlbnQgZm9yIHRoZSBmaXJzdFxuICAgIC8vIGtleXN0cm9rZSBpZiB1c2VyIGRvZXMgYSBrZXkgcmVwZWF0IChpdCdsbCBiZSBhIGxpdHRsZSBkZWxheWVkOiByaWdodFxuICAgIC8vIGJlZm9yZSB0aGUgc2Vjb25kIGtleXN0cm9rZSkuIE90aGVyIGlucHV0IG1ldGhvZHMgKGUuZy4sIHBhc3RlKSBzZWVtIHRvXG4gICAgLy8gZmlyZSBzZWxlY3Rpb25jaGFuZ2Ugbm9ybWFsbHkuXG4gICAgcmV0dXJuIGdldEluc3RJZlZhbHVlQ2hhbmdlZChhY3RpdmVFbGVtZW50SW5zdCk7XG4gIH1cbn1cbi8qKlxuICogU0VDVElPTjogaGFuZGxlIGBjbGlja2AgZXZlbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHNob3VsZFVzZUNsaWNrRXZlbnQoZWxlbSkge1xuICAvLyBVc2UgdGhlIGBjbGlja2AgZXZlbnQgdG8gZGV0ZWN0IGNoYW5nZXMgdG8gY2hlY2tib3ggYW5kIHJhZGlvIGlucHV0cy5cbiAgLy8gVGhpcyBhcHByb2FjaCB3b3JrcyBhY3Jvc3MgYWxsIGJyb3dzZXJzLCB3aGVyZWFzIGBjaGFuZ2VgIGRvZXMgbm90IGZpcmVcbiAgLy8gdW50aWwgYGJsdXJgIGluIElFOC5cbiAgdmFyIG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZTtcbiAgcmV0dXJuIG5vZGVOYW1lICYmIG5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpbnB1dCcgJiYgKGVsZW0udHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbGVtLnR5cGUgPT09ICdyYWRpbycpO1xufVxuXG5mdW5jdGlvbiBnZXRUYXJnZXRJbnN0Rm9yQ2xpY2tFdmVudChkb21FdmVudE5hbWUsIHRhcmdldEluc3QpIHtcbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2NsaWNrJykge1xuICAgIHJldHVybiBnZXRJbnN0SWZWYWx1ZUNoYW5nZWQodGFyZ2V0SW5zdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvcklucHV0T3JDaGFuZ2VFdmVudChkb21FdmVudE5hbWUsIHRhcmdldEluc3QpIHtcbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2lucHV0JyB8fCBkb21FdmVudE5hbWUgPT09ICdjaGFuZ2UnKSB7XG4gICAgcmV0dXJuIGdldEluc3RJZlZhbHVlQ2hhbmdlZCh0YXJnZXRJbnN0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVDb250cm9sbGVkSW5wdXRCbHVyKG5vZGUpIHtcbiAgdmFyIHN0YXRlID0gbm9kZS5fd3JhcHBlclN0YXRlO1xuXG4gIGlmICghc3RhdGUgfHwgIXN0YXRlLmNvbnRyb2xsZWQgfHwgbm9kZS50eXBlICE9PSAnbnVtYmVyJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHtcbiAgICAvLyBJZiBjb250cm9sbGVkLCBhc3NpZ24gdGhlIHZhbHVlIGF0dHJpYnV0ZSB0byB0aGUgY3VycmVudCB2YWx1ZSBvbiBibHVyXG4gICAgc2V0RGVmYXVsdFZhbHVlKG5vZGUsICdudW1iZXInLCBub2RlLnZhbHVlKTtcbiAgfVxufVxuLyoqXG4gKiBUaGlzIHBsdWdpbiBjcmVhdGVzIGFuIGBvbkNoYW5nZWAgZXZlbnQgdGhhdCBub3JtYWxpemVzIGNoYW5nZSBldmVudHNcbiAqIGFjcm9zcyBmb3JtIGVsZW1lbnRzLiBUaGlzIGV2ZW50IGZpcmVzIGF0IGEgdGltZSB3aGVuIGl0J3MgcG9zc2libGUgdG9cbiAqIGNoYW5nZSB0aGUgZWxlbWVudCdzIHZhbHVlIHdpdGhvdXQgc2VlaW5nIGEgZmxpY2tlci5cbiAqXG4gKiBTdXBwb3J0ZWQgZWxlbWVudHMgYXJlOlxuICogLSBpbnB1dCAoc2VlIGBpc1RleHRJbnB1dEVsZW1lbnRgKVxuICogLSB0ZXh0YXJlYVxuICogLSBzZWxlY3RcbiAqL1xuXG5cbmZ1bmN0aW9uIGV4dHJhY3RFdmVudHMkMShkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIHZhciB0YXJnZXROb2RlID0gdGFyZ2V0SW5zdCA/IGdldE5vZGVGcm9tSW5zdGFuY2UodGFyZ2V0SW5zdCkgOiB3aW5kb3c7XG4gIHZhciBnZXRUYXJnZXRJbnN0RnVuYywgaGFuZGxlRXZlbnRGdW5jO1xuXG4gIGlmIChzaG91bGRVc2VDaGFuZ2VFdmVudCh0YXJnZXROb2RlKSkge1xuICAgIGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvckNoYW5nZUV2ZW50O1xuICB9IGVsc2UgaWYgKGlzVGV4dElucHV0RWxlbWVudCh0YXJnZXROb2RlKSkge1xuICAgIGlmIChpc0lucHV0RXZlbnRTdXBwb3J0ZWQpIHtcbiAgICAgIGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvcklucHV0T3JDaGFuZ2VFdmVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2V0VGFyZ2V0SW5zdEZ1bmMgPSBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRFdmVudFBvbHlmaWxsO1xuICAgICAgaGFuZGxlRXZlbnRGdW5jID0gaGFuZGxlRXZlbnRzRm9ySW5wdXRFdmVudFBvbHlmaWxsO1xuICAgIH1cbiAgfSBlbHNlIGlmIChzaG91bGRVc2VDbGlja0V2ZW50KHRhcmdldE5vZGUpKSB7XG4gICAgZ2V0VGFyZ2V0SW5zdEZ1bmMgPSBnZXRUYXJnZXRJbnN0Rm9yQ2xpY2tFdmVudDtcbiAgfVxuXG4gIGlmIChnZXRUYXJnZXRJbnN0RnVuYykge1xuICAgIHZhciBpbnN0ID0gZ2V0VGFyZ2V0SW5zdEZ1bmMoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KTtcblxuICAgIGlmIChpbnN0KSB7XG4gICAgICBjcmVhdGVBbmRBY2N1bXVsYXRlQ2hhbmdlRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgaW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBpZiAoaGFuZGxlRXZlbnRGdW5jKSB7XG4gICAgaGFuZGxlRXZlbnRGdW5jKGRvbUV2ZW50TmFtZSwgdGFyZ2V0Tm9kZSwgdGFyZ2V0SW5zdCk7XG4gIH0gLy8gV2hlbiBibHVycmluZywgc2V0IHRoZSB2YWx1ZSBhdHRyaWJ1dGUgZm9yIG51bWJlciBpbnB1dHNcblxuXG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdmb2N1c291dCcpIHtcbiAgICBoYW5kbGVDb250cm9sbGVkSW5wdXRCbHVyKHRhcmdldE5vZGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyRXZlbnRzJDIoKSB7XG4gIHJlZ2lzdGVyRGlyZWN0RXZlbnQoJ29uTW91c2VFbnRlcicsIFsnbW91c2VvdXQnLCAnbW91c2VvdmVyJ10pO1xuICByZWdpc3RlckRpcmVjdEV2ZW50KCdvbk1vdXNlTGVhdmUnLCBbJ21vdXNlb3V0JywgJ21vdXNlb3ZlciddKTtcbiAgcmVnaXN0ZXJEaXJlY3RFdmVudCgnb25Qb2ludGVyRW50ZXInLCBbJ3BvaW50ZXJvdXQnLCAncG9pbnRlcm92ZXInXSk7XG4gIHJlZ2lzdGVyRGlyZWN0RXZlbnQoJ29uUG9pbnRlckxlYXZlJywgWydwb2ludGVyb3V0JywgJ3BvaW50ZXJvdmVyJ10pO1xufVxuLyoqXG4gKiBGb3IgYWxtb3N0IGV2ZXJ5IGludGVyYWN0aW9uIHdlIGNhcmUgYWJvdXQsIHRoZXJlIHdpbGwgYmUgYm90aCBhIHRvcC1sZXZlbFxuICogYG1vdXNlb3ZlcmAgYW5kIGBtb3VzZW91dGAgZXZlbnQgdGhhdCBvY2N1cnMuIE9ubHkgdXNlIGBtb3VzZW91dGAgc28gdGhhdFxuICogd2UgZG8gbm90IGV4dHJhY3QgZHVwbGljYXRlIGV2ZW50cy4gSG93ZXZlciwgbW92aW5nIHRoZSBtb3VzZSBpbnRvIHRoZVxuICogYnJvd3NlciBmcm9tIG91dHNpZGUgd2lsbCBub3QgZmlyZSBhIGBtb3VzZW91dGAgZXZlbnQuIEluIHRoaXMgY2FzZSwgd2UgdXNlXG4gKiB0aGUgYG1vdXNlb3ZlcmAgdG9wLWxldmVsIGV2ZW50LlxuICovXG5cblxuZnVuY3Rpb24gZXh0cmFjdEV2ZW50cyQyKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpIHtcbiAgdmFyIGlzT3ZlckV2ZW50ID0gZG9tRXZlbnROYW1lID09PSAnbW91c2VvdmVyJyB8fCBkb21FdmVudE5hbWUgPT09ICdwb2ludGVyb3Zlcic7XG4gIHZhciBpc091dEV2ZW50ID0gZG9tRXZlbnROYW1lID09PSAnbW91c2VvdXQnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ3BvaW50ZXJvdXQnO1xuXG4gIGlmIChpc092ZXJFdmVudCAmJiAhaXNSZXBsYXlpbmdFdmVudChuYXRpdmVFdmVudCkpIHtcbiAgICAvLyBJZiB0aGlzIGlzIGFuIG92ZXIgZXZlbnQgd2l0aCBhIHRhcmdldCwgd2UgbWlnaHQgaGF2ZSBhbHJlYWR5IGRpc3BhdGNoZWRcbiAgICAvLyB0aGUgZXZlbnQgaW4gdGhlIG91dCBldmVudCBvZiB0aGUgb3RoZXIgdGFyZ2V0LiBJZiB0aGlzIGlzIHJlcGxheWVkLFxuICAgIC8vIHRoZW4gaXQncyBiZWNhdXNlIHdlIGNvdWxkbid0IGRpc3BhdGNoIGFnYWluc3QgdGhpcyB0YXJnZXQgcHJldmlvdXNseVxuICAgIC8vIHNvIHdlIGhhdmUgdG8gZG8gaXQgbm93IGluc3RlYWQuXG4gICAgdmFyIHJlbGF0ZWQgPSBuYXRpdmVFdmVudC5yZWxhdGVkVGFyZ2V0IHx8IG5hdGl2ZUV2ZW50LmZyb21FbGVtZW50O1xuXG4gICAgaWYgKHJlbGF0ZWQpIHtcbiAgICAgIC8vIElmIHRoZSByZWxhdGVkIG5vZGUgaXMgbWFuYWdlZCBieSBSZWFjdCwgd2UgY2FuIGFzc3VtZSB0aGF0IHdlIGhhdmVcbiAgICAgIC8vIGFscmVhZHkgZGlzcGF0Y2hlZCB0aGUgY29ycmVzcG9uZGluZyBldmVudHMgZHVyaW5nIGl0cyBtb3VzZW91dC5cbiAgICAgIGlmIChnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShyZWxhdGVkKSB8fCBpc0NvbnRhaW5lck1hcmtlZEFzUm9vdChyZWxhdGVkKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCFpc091dEV2ZW50ICYmICFpc092ZXJFdmVudCkge1xuICAgIC8vIE11c3Qgbm90IGJlIGEgbW91c2Ugb3IgcG9pbnRlciBpbiBvciBvdXQgLSBpZ25vcmluZy5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgd2luOyAvLyBUT0RPOiB3aHkgaXMgdGhpcyBudWxsYWJsZSBpbiB0aGUgdHlwZXMgYnV0IHdlIHJlYWQgZnJvbSBpdD9cblxuICBpZiAobmF0aXZlRXZlbnRUYXJnZXQud2luZG93ID09PSBuYXRpdmVFdmVudFRhcmdldCkge1xuICAgIC8vIGBuYXRpdmVFdmVudFRhcmdldGAgaXMgcHJvYmFibHkgYSB3aW5kb3cgb2JqZWN0LlxuICAgIHdpbiA9IG5hdGl2ZUV2ZW50VGFyZ2V0O1xuICB9IGVsc2Uge1xuICAgIC8vIFRPRE86IEZpZ3VyZSBvdXQgd2h5IGBvd25lckRvY3VtZW50YCBpcyBzb21ldGltZXMgdW5kZWZpbmVkIGluIElFOC5cbiAgICB2YXIgZG9jID0gbmF0aXZlRXZlbnRUYXJnZXQub3duZXJEb2N1bWVudDtcblxuICAgIGlmIChkb2MpIHtcbiAgICAgIHdpbiA9IGRvYy5kZWZhdWx0VmlldyB8fCBkb2MucGFyZW50V2luZG93O1xuICAgIH0gZWxzZSB7XG4gICAgICB3aW4gPSB3aW5kb3c7XG4gICAgfVxuICB9XG5cbiAgdmFyIGZyb207XG4gIHZhciB0bztcblxuICBpZiAoaXNPdXRFdmVudCkge1xuICAgIHZhciBfcmVsYXRlZCA9IG5hdGl2ZUV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgbmF0aXZlRXZlbnQudG9FbGVtZW50O1xuXG4gICAgZnJvbSA9IHRhcmdldEluc3Q7XG4gICAgdG8gPSBfcmVsYXRlZCA/IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKF9yZWxhdGVkKSA6IG51bGw7XG5cbiAgICBpZiAodG8gIT09IG51bGwpIHtcbiAgICAgIHZhciBuZWFyZXN0TW91bnRlZCA9IGdldE5lYXJlc3RNb3VudGVkRmliZXIodG8pO1xuXG4gICAgICBpZiAodG8gIT09IG5lYXJlc3RNb3VudGVkIHx8IHRvLnRhZyAhPT0gSG9zdENvbXBvbmVudCAmJiB0by50YWcgIT09IEhvc3RUZXh0KSB7XG4gICAgICAgIHRvID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gTW92aW5nIHRvIGEgbm9kZSBmcm9tIG91dHNpZGUgdGhlIHdpbmRvdy5cbiAgICBmcm9tID0gbnVsbDtcbiAgICB0byA9IHRhcmdldEluc3Q7XG4gIH1cblxuICBpZiAoZnJvbSA9PT0gdG8pIHtcbiAgICAvLyBOb3RoaW5nIHBlcnRhaW5zIHRvIG91ciBtYW5hZ2VkIGNvbXBvbmVudHMuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY01vdXNlRXZlbnQ7XG4gIHZhciBsZWF2ZUV2ZW50VHlwZSA9ICdvbk1vdXNlTGVhdmUnO1xuICB2YXIgZW50ZXJFdmVudFR5cGUgPSAnb25Nb3VzZUVudGVyJztcbiAgdmFyIGV2ZW50VHlwZVByZWZpeCA9ICdtb3VzZSc7XG5cbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ3BvaW50ZXJvdXQnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ3BvaW50ZXJvdmVyJykge1xuICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1BvaW50ZXJFdmVudDtcbiAgICBsZWF2ZUV2ZW50VHlwZSA9ICdvblBvaW50ZXJMZWF2ZSc7XG4gICAgZW50ZXJFdmVudFR5cGUgPSAnb25Qb2ludGVyRW50ZXInO1xuICAgIGV2ZW50VHlwZVByZWZpeCA9ICdwb2ludGVyJztcbiAgfVxuXG4gIHZhciBmcm9tTm9kZSA9IGZyb20gPT0gbnVsbCA/IHdpbiA6IGdldE5vZGVGcm9tSW5zdGFuY2UoZnJvbSk7XG4gIHZhciB0b05vZGUgPSB0byA9PSBudWxsID8gd2luIDogZ2V0Tm9kZUZyb21JbnN0YW5jZSh0byk7XG4gIHZhciBsZWF2ZSA9IG5ldyBTeW50aGV0aWNFdmVudEN0b3IobGVhdmVFdmVudFR5cGUsIGV2ZW50VHlwZVByZWZpeCArICdsZWF2ZScsIGZyb20sIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gIGxlYXZlLnRhcmdldCA9IGZyb21Ob2RlO1xuICBsZWF2ZS5yZWxhdGVkVGFyZ2V0ID0gdG9Ob2RlO1xuICB2YXIgZW50ZXIgPSBudWxsOyAvLyBXZSBzaG91bGQgb25seSBwcm9jZXNzIHRoaXMgbmF0aXZlRXZlbnQgaWYgd2UgYXJlIHByb2Nlc3NpbmdcbiAgLy8gdGhlIGZpcnN0IGFuY2VzdG9yLiBOZXh0IHRpbWUsIHdlIHdpbGwgaWdub3JlIHRoZSBldmVudC5cblxuICB2YXIgbmF0aXZlVGFyZ2V0SW5zdCA9IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKG5hdGl2ZUV2ZW50VGFyZ2V0KTtcblxuICBpZiAobmF0aXZlVGFyZ2V0SW5zdCA9PT0gdGFyZ2V0SW5zdCkge1xuICAgIHZhciBlbnRlckV2ZW50ID0gbmV3IFN5bnRoZXRpY0V2ZW50Q3RvcihlbnRlckV2ZW50VHlwZSwgZXZlbnRUeXBlUHJlZml4ICsgJ2VudGVyJywgdG8sIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgZW50ZXJFdmVudC50YXJnZXQgPSB0b05vZGU7XG4gICAgZW50ZXJFdmVudC5yZWxhdGVkVGFyZ2V0ID0gZnJvbU5vZGU7XG4gICAgZW50ZXIgPSBlbnRlckV2ZW50O1xuICB9XG5cbiAgYWNjdW11bGF0ZUVudGVyTGVhdmVUd29QaGFzZUxpc3RlbmVycyhkaXNwYXRjaFF1ZXVlLCBsZWF2ZSwgZW50ZXIsIGZyb20sIHRvKTtcbn1cblxuLyoqXG4gKiBpbmxpbmVkIE9iamVjdC5pcyBwb2x5ZmlsbCB0byBhdm9pZCByZXF1aXJpbmcgY29uc3VtZXJzIHNoaXAgdGhlaXIgb3duXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNcbiAqL1xuZnVuY3Rpb24gaXMoeCwgeSkge1xuICByZXR1cm4geCA9PT0geSAmJiAoeCAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHkpIHx8IHggIT09IHggJiYgeSAhPT0geSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxuICA7XG59XG5cbnZhciBvYmplY3RJcyA9IHR5cGVvZiBPYmplY3QuaXMgPT09ICdmdW5jdGlvbicgPyBPYmplY3QuaXMgOiBpcztcblxuLyoqXG4gKiBQZXJmb3JtcyBlcXVhbGl0eSBieSBpdGVyYXRpbmcgdGhyb3VnaCBrZXlzIG9uIGFuIG9iamVjdCBhbmQgcmV0dXJuaW5nIGZhbHNlXG4gKiB3aGVuIGFueSBrZXkgaGFzIHZhbHVlcyB3aGljaCBhcmUgbm90IHN0cmljdGx5IGVxdWFsIGJldHdlZW4gdGhlIGFyZ3VtZW50cy5cbiAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSB2YWx1ZXMgb2YgYWxsIGtleXMgYXJlIHN0cmljdGx5IGVxdWFsLlxuICovXG5cbmZ1bmN0aW9uIHNoYWxsb3dFcXVhbChvYmpBLCBvYmpCKSB7XG4gIGlmIChvYmplY3RJcyhvYmpBLCBvYmpCKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmpBICE9PSAnb2JqZWN0JyB8fCBvYmpBID09PSBudWxsIHx8IHR5cGVvZiBvYmpCICE9PSAnb2JqZWN0JyB8fCBvYmpCID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGtleXNBID0gT2JqZWN0LmtleXMob2JqQSk7XG4gIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuXG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBUZXN0IGZvciBBJ3Mga2V5cyBkaWZmZXJlbnQgZnJvbSBCLlxuXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzQS5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjdXJyZW50S2V5ID0ga2V5c0FbaV07XG5cbiAgICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwob2JqQiwgY3VycmVudEtleSkgfHwgIW9iamVjdElzKG9iakFbY3VycmVudEtleV0sIG9iakJbY3VycmVudEtleV0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogR2l2ZW4gYW55IG5vZGUgcmV0dXJuIHRoZSBmaXJzdCBsZWFmIG5vZGUgd2l0aG91dCBjaGlsZHJlbi5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IG5vZGVcbiAqIEByZXR1cm4ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9XG4gKi9cblxuZnVuY3Rpb24gZ2V0TGVhZk5vZGUobm9kZSkge1xuICB3aGlsZSAobm9kZSAmJiBub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICBub2RlID0gbm9kZS5maXJzdENoaWxkO1xuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59XG4vKipcbiAqIEdldCB0aGUgbmV4dCBzaWJsaW5nIHdpdGhpbiBhIGNvbnRhaW5lci4gVGhpcyB3aWxsIHdhbGsgdXAgdGhlXG4gKiBET00gaWYgYSBub2RlJ3Mgc2libGluZ3MgaGF2ZSBiZWVuIGV4aGF1c3RlZC5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IG5vZGVcbiAqIEByZXR1cm4gez9ET01FbGVtZW50fERPTVRleHROb2RlfVxuICovXG5cblxuZnVuY3Rpb24gZ2V0U2libGluZ05vZGUobm9kZSkge1xuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlLm5leHRTaWJsaW5nKSB7XG4gICAgICByZXR1cm4gbm9kZS5uZXh0U2libGluZztcbiAgICB9XG5cbiAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICB9XG59XG4vKipcbiAqIEdldCBvYmplY3QgZGVzY3JpYmluZyB0aGUgbm9kZXMgd2hpY2ggY29udGFpbiBjaGFyYWN0ZXJzIGF0IG9mZnNldC5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IHJvb3RcbiAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXRcbiAqIEByZXR1cm4gez9vYmplY3R9XG4gKi9cblxuXG5mdW5jdGlvbiBnZXROb2RlRm9yQ2hhcmFjdGVyT2Zmc2V0KHJvb3QsIG9mZnNldCkge1xuICB2YXIgbm9kZSA9IGdldExlYWZOb2RlKHJvb3QpO1xuICB2YXIgbm9kZVN0YXJ0ID0gMDtcbiAgdmFyIG5vZGVFbmQgPSAwO1xuXG4gIHdoaWxlIChub2RlKSB7XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkge1xuICAgICAgbm9kZUVuZCA9IG5vZGVTdGFydCArIG5vZGUudGV4dENvbnRlbnQubGVuZ3RoO1xuXG4gICAgICBpZiAobm9kZVN0YXJ0IDw9IG9mZnNldCAmJiBub2RlRW5kID49IG9mZnNldCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICAgICAgb2Zmc2V0OiBvZmZzZXQgLSBub2RlU3RhcnRcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgbm9kZVN0YXJ0ID0gbm9kZUVuZDtcbiAgICB9XG5cbiAgICBub2RlID0gZ2V0TGVhZk5vZGUoZ2V0U2libGluZ05vZGUobm9kZSkpO1xuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBvdXRlck5vZGVcbiAqIEByZXR1cm4gez9vYmplY3R9XG4gKi9cblxuZnVuY3Rpb24gZ2V0T2Zmc2V0cyhvdXRlck5vZGUpIHtcbiAgdmFyIG93bmVyRG9jdW1lbnQgPSBvdXRlck5vZGUub3duZXJEb2N1bWVudDtcbiAgdmFyIHdpbiA9IG93bmVyRG9jdW1lbnQgJiYgb3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCB3aW5kb3c7XG4gIHZhciBzZWxlY3Rpb24gPSB3aW4uZ2V0U2VsZWN0aW9uICYmIHdpbi5nZXRTZWxlY3Rpb24oKTtcblxuICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGFuY2hvck5vZGUgPSBzZWxlY3Rpb24uYW5jaG9yTm9kZSxcbiAgICAgIGFuY2hvck9mZnNldCA9IHNlbGVjdGlvbi5hbmNob3JPZmZzZXQsXG4gICAgICBmb2N1c05vZGUgPSBzZWxlY3Rpb24uZm9jdXNOb2RlLFxuICAgICAgZm9jdXNPZmZzZXQgPSBzZWxlY3Rpb24uZm9jdXNPZmZzZXQ7IC8vIEluIEZpcmVmb3gsIGFuY2hvck5vZGUgYW5kIGZvY3VzTm9kZSBjYW4gYmUgXCJhbm9ueW1vdXMgZGl2c1wiLCBlLmcuIHRoZVxuICAvLyB1cC9kb3duIGJ1dHRvbnMgb24gYW4gPGlucHV0IHR5cGU9XCJudW1iZXJcIj4uIEFub255bW91cyBkaXZzIGRvIG5vdCBzZWVtIHRvXG4gIC8vIGV4cG9zZSBwcm9wZXJ0aWVzLCB0cmlnZ2VyaW5nIGEgXCJQZXJtaXNzaW9uIGRlbmllZCBlcnJvclwiIGlmIGFueSBvZiBpdHNcbiAgLy8gcHJvcGVydGllcyBhcmUgYWNjZXNzZWQuIFRoZSBvbmx5IHNlZW1pbmdseSBwb3NzaWJsZSB3YXkgdG8gYXZvaWQgZXJyb3JpbmdcbiAgLy8gaXMgdG8gYWNjZXNzIGEgcHJvcGVydHkgdGhhdCB0eXBpY2FsbHkgd29ya3MgZm9yIG5vbi1hbm9ueW1vdXMgZGl2cyBhbmRcbiAgLy8gY2F0Y2ggYW55IGVycm9yIHRoYXQgbWF5IG90aGVyd2lzZSBhcmlzZS4gU2VlXG4gIC8vIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTIwODQyN1xuXG4gIHRyeSB7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLWV4cHJlc3Npb25zICovXG4gICAgYW5jaG9yTm9kZS5ub2RlVHlwZTtcbiAgICBmb2N1c05vZGUubm9kZVR5cGU7XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby11bnVzZWQtZXhwcmVzc2lvbnMgKi9cbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGdldE1vZGVybk9mZnNldHNGcm9tUG9pbnRzKG91dGVyTm9kZSwgYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0LCBmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KTtcbn1cbi8qKlxuICogUmV0dXJucyB7c3RhcnQsIGVuZH0gd2hlcmUgYHN0YXJ0YCBpcyB0aGUgY2hhcmFjdGVyL2NvZGVwb2ludCBpbmRleCBvZlxuICogKGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCkgd2l0aGluIHRoZSB0ZXh0Q29udGVudCBvZiBgb3V0ZXJOb2RlYCwgYW5kXG4gKiBgZW5kYCBpcyB0aGUgaW5kZXggb2YgKGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQpLlxuICpcbiAqIFJldHVybnMgbnVsbCBpZiB5b3UgcGFzcyBpbiBnYXJiYWdlIGlucHV0IGJ1dCB3ZSBzaG91bGQgcHJvYmFibHkganVzdCBjcmFzaC5cbiAqXG4gKiBFeHBvcnRlZCBvbmx5IGZvciB0ZXN0aW5nLlxuICovXG5cbmZ1bmN0aW9uIGdldE1vZGVybk9mZnNldHNGcm9tUG9pbnRzKG91dGVyTm9kZSwgYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0LCBmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KSB7XG4gIHZhciBsZW5ndGggPSAwO1xuICB2YXIgc3RhcnQgPSAtMTtcbiAgdmFyIGVuZCA9IC0xO1xuICB2YXIgaW5kZXhXaXRoaW5BbmNob3IgPSAwO1xuICB2YXIgaW5kZXhXaXRoaW5Gb2N1cyA9IDA7XG4gIHZhciBub2RlID0gb3V0ZXJOb2RlO1xuICB2YXIgcGFyZW50Tm9kZSA9IG51bGw7XG5cbiAgb3V0ZXI6IHdoaWxlICh0cnVlKSB7XG4gICAgdmFyIG5leHQgPSBudWxsO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChub2RlID09PSBhbmNob3JOb2RlICYmIChhbmNob3JPZmZzZXQgPT09IDAgfHwgbm9kZS5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSkge1xuICAgICAgICBzdGFydCA9IGxlbmd0aCArIGFuY2hvck9mZnNldDtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUgPT09IGZvY3VzTm9kZSAmJiAoZm9jdXNPZmZzZXQgPT09IDAgfHwgbm9kZS5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSkge1xuICAgICAgICBlbmQgPSBsZW5ndGggKyBmb2N1c09mZnNldDtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkge1xuICAgICAgICBsZW5ndGggKz0gbm9kZS5ub2RlVmFsdWUubGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICBpZiAoKG5leHQgPSBub2RlLmZpcnN0Q2hpbGQpID09PSBudWxsKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSAvLyBNb3ZpbmcgZnJvbSBgbm9kZWAgdG8gaXRzIGZpcnN0IGNoaWxkIGBuZXh0YC5cblxuXG4gICAgICBwYXJlbnROb2RlID0gbm9kZTtcbiAgICAgIG5vZGUgPSBuZXh0O1xuICAgIH1cblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAobm9kZSA9PT0gb3V0ZXJOb2RlKSB7XG4gICAgICAgIC8vIElmIGBvdXRlck5vZGVgIGhhcyBjaGlsZHJlbiwgdGhpcyBpcyBhbHdheXMgdGhlIHNlY29uZCB0aW1lIHZpc2l0aW5nXG4gICAgICAgIC8vIGl0LiBJZiBpdCBoYXMgbm8gY2hpbGRyZW4sIHRoaXMgaXMgc3RpbGwgdGhlIGZpcnN0IGxvb3AsIGFuZCB0aGUgb25seVxuICAgICAgICAvLyB2YWxpZCBzZWxlY3Rpb24gaXMgYW5jaG9yTm9kZSBhbmQgZm9jdXNOb2RlIGJvdGggZXF1YWwgdG8gdGhpcyBub2RlXG4gICAgICAgIC8vIGFuZCBib3RoIG9mZnNldHMgMCwgaW4gd2hpY2ggY2FzZSB3ZSB3aWxsIGhhdmUgaGFuZGxlZCBhYm92ZS5cbiAgICAgICAgYnJlYWsgb3V0ZXI7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJlbnROb2RlID09PSBhbmNob3JOb2RlICYmICsraW5kZXhXaXRoaW5BbmNob3IgPT09IGFuY2hvck9mZnNldCkge1xuICAgICAgICBzdGFydCA9IGxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmVudE5vZGUgPT09IGZvY3VzTm9kZSAmJiArK2luZGV4V2l0aGluRm9jdXMgPT09IGZvY3VzT2Zmc2V0KSB7XG4gICAgICAgIGVuZCA9IGxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgaWYgKChuZXh0ID0gbm9kZS5uZXh0U2libGluZykgIT09IG51bGwpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBwYXJlbnROb2RlO1xuICAgICAgcGFyZW50Tm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICB9IC8vIE1vdmluZyBmcm9tIGBub2RlYCB0byBpdHMgbmV4dCBzaWJsaW5nIGBuZXh0YC5cblxuXG4gICAgbm9kZSA9IG5leHQ7XG4gIH1cblxuICBpZiAoc3RhcnQgPT09IC0xIHx8IGVuZCA9PT0gLTEpIHtcbiAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uIChXb3VsZCBoYXBwZW4gaWYgdGhlIGFuY2hvci9mb2N1cyBub2RlcyBhcmVuJ3RcbiAgICAvLyBhY3R1YWxseSBpbnNpZGUgdGhlIHBhc3NlZC1pbiBub2RlLilcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IHN0YXJ0LFxuICAgIGVuZDogZW5kXG4gIH07XG59XG4vKipcbiAqIEluIG1vZGVybiBub24tSUUgYnJvd3NlcnMsIHdlIGNhbiBzdXBwb3J0IGJvdGggZm9yd2FyZCBhbmQgYmFja3dhcmRcbiAqIHNlbGVjdGlvbnMuXG4gKlxuICogTm90ZTogSUUxMCsgc3VwcG9ydHMgdGhlIFNlbGVjdGlvbiBvYmplY3QsIGJ1dCBpdCBkb2VzIG5vdCBzdXBwb3J0XG4gKiB0aGUgYGV4dGVuZGAgbWV0aG9kLCB3aGljaCBtZWFucyB0aGF0IGV2ZW4gaW4gbW9kZXJuIElFLCBpdCdzIG5vdCBwb3NzaWJsZVxuICogdG8gcHJvZ3JhbW1hdGljYWxseSBjcmVhdGUgYSBiYWNrd2FyZCBzZWxlY3Rpb24uIFRodXMsIGZvciBhbGwgSUVcbiAqIHZlcnNpb25zLCB3ZSB1c2UgdGhlIG9sZCBJRSBBUEkgdG8gY3JlYXRlIG91ciBzZWxlY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX0gbm9kZVxuICogQHBhcmFtIHtvYmplY3R9IG9mZnNldHNcbiAqL1xuXG5mdW5jdGlvbiBzZXRPZmZzZXRzKG5vZGUsIG9mZnNldHMpIHtcbiAgdmFyIGRvYyA9IG5vZGUub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudDtcbiAgdmFyIHdpbiA9IGRvYyAmJiBkb2MuZGVmYXVsdFZpZXcgfHwgd2luZG93OyAvLyBFZGdlIGZhaWxzIHdpdGggXCJPYmplY3QgZXhwZWN0ZWRcIiBpbiBzb21lIHNjZW5hcmlvcy5cbiAgLy8gKEZvciBpbnN0YW5jZTogVGlueU1DRSBlZGl0b3IgdXNlZCBpbiBhIGxpc3QgY29tcG9uZW50IHRoYXQgc3VwcG9ydHMgcGFzdGluZyB0byBhZGQgbW9yZSxcbiAgLy8gZmFpbHMgd2hlbiBwYXN0aW5nIDEwMCsgaXRlbXMpXG5cbiAgaWYgKCF3aW4uZ2V0U2VsZWN0aW9uKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHNlbGVjdGlvbiA9IHdpbi5nZXRTZWxlY3Rpb24oKTtcbiAgdmFyIGxlbmd0aCA9IG5vZGUudGV4dENvbnRlbnQubGVuZ3RoO1xuICB2YXIgc3RhcnQgPSBNYXRoLm1pbihvZmZzZXRzLnN0YXJ0LCBsZW5ndGgpO1xuICB2YXIgZW5kID0gb2Zmc2V0cy5lbmQgPT09IHVuZGVmaW5lZCA/IHN0YXJ0IDogTWF0aC5taW4ob2Zmc2V0cy5lbmQsIGxlbmd0aCk7IC8vIElFIDExIHVzZXMgbW9kZXJuIHNlbGVjdGlvbiwgYnV0IGRvZXNuJ3Qgc3VwcG9ydCB0aGUgZXh0ZW5kIG1ldGhvZC5cbiAgLy8gRmxpcCBiYWNrd2FyZCBzZWxlY3Rpb25zLCBzbyB3ZSBjYW4gc2V0IHdpdGggYSBzaW5nbGUgcmFuZ2UuXG5cbiAgaWYgKCFzZWxlY3Rpb24uZXh0ZW5kICYmIHN0YXJ0ID4gZW5kKSB7XG4gICAgdmFyIHRlbXAgPSBlbmQ7XG4gICAgZW5kID0gc3RhcnQ7XG4gICAgc3RhcnQgPSB0ZW1wO1xuICB9XG5cbiAgdmFyIHN0YXJ0TWFya2VyID0gZ2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldChub2RlLCBzdGFydCk7XG4gIHZhciBlbmRNYXJrZXIgPSBnZXROb2RlRm9yQ2hhcmFjdGVyT2Zmc2V0KG5vZGUsIGVuZCk7XG5cbiAgaWYgKHN0YXJ0TWFya2VyICYmIGVuZE1hcmtlcikge1xuICAgIGlmIChzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMSAmJiBzZWxlY3Rpb24uYW5jaG9yTm9kZSA9PT0gc3RhcnRNYXJrZXIubm9kZSAmJiBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0ID09PSBzdGFydE1hcmtlci5vZmZzZXQgJiYgc2VsZWN0aW9uLmZvY3VzTm9kZSA9PT0gZW5kTWFya2VyLm5vZGUgJiYgc2VsZWN0aW9uLmZvY3VzT2Zmc2V0ID09PSBlbmRNYXJrZXIub2Zmc2V0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHJhbmdlID0gZG9jLmNyZWF0ZVJhbmdlKCk7XG4gICAgcmFuZ2Uuc2V0U3RhcnQoc3RhcnRNYXJrZXIubm9kZSwgc3RhcnRNYXJrZXIub2Zmc2V0KTtcbiAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG5cbiAgICBpZiAoc3RhcnQgPiBlbmQpIHtcbiAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgICBzZWxlY3Rpb24uZXh0ZW5kKGVuZE1hcmtlci5ub2RlLCBlbmRNYXJrZXIub2Zmc2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmFuZ2Uuc2V0RW5kKGVuZE1hcmtlci5ub2RlLCBlbmRNYXJrZXIub2Zmc2V0KTtcbiAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzVGV4dE5vZGUobm9kZSkge1xuICByZXR1cm4gbm9kZSAmJiBub2RlLm5vZGVUeXBlID09PSBURVhUX05PREU7XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zTm9kZShvdXRlck5vZGUsIGlubmVyTm9kZSkge1xuICBpZiAoIW91dGVyTm9kZSB8fCAhaW5uZXJOb2RlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2UgaWYgKG91dGVyTm9kZSA9PT0gaW5uZXJOb2RlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAoaXNUZXh0Tm9kZShvdXRlck5vZGUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2UgaWYgKGlzVGV4dE5vZGUoaW5uZXJOb2RlKSkge1xuICAgIHJldHVybiBjb250YWluc05vZGUob3V0ZXJOb2RlLCBpbm5lck5vZGUucGFyZW50Tm9kZSk7XG4gIH0gZWxzZSBpZiAoJ2NvbnRhaW5zJyBpbiBvdXRlck5vZGUpIHtcbiAgICByZXR1cm4gb3V0ZXJOb2RlLmNvbnRhaW5zKGlubmVyTm9kZSk7XG4gIH0gZWxzZSBpZiAob3V0ZXJOb2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSB7XG4gICAgcmV0dXJuICEhKG91dGVyTm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihpbm5lck5vZGUpICYgMTYpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0luRG9jdW1lbnQobm9kZSkge1xuICByZXR1cm4gbm9kZSAmJiBub2RlLm93bmVyRG9jdW1lbnQgJiYgY29udGFpbnNOb2RlKG5vZGUub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIG5vZGUpO1xufVxuXG5mdW5jdGlvbiBpc1NhbWVPcmlnaW5GcmFtZShpZnJhbWUpIHtcbiAgdHJ5IHtcbiAgICAvLyBBY2Nlc3NpbmcgdGhlIGNvbnRlbnREb2N1bWVudCBvZiBhIEhUTUxJZnJhbWVFbGVtZW50IGNhbiBjYXVzZSB0aGUgYnJvd3NlclxuICAgIC8vIHRvIHRocm93LCBlLmcuIGlmIGl0IGhhcyBhIGNyb3NzLW9yaWdpbiBzcmMgYXR0cmlidXRlLlxuICAgIC8vIFNhZmFyaSB3aWxsIHNob3cgYW4gZXJyb3IgaW4gdGhlIGNvbnNvbGUgd2hlbiB0aGUgYWNjZXNzIHJlc3VsdHMgaW4gXCJCbG9ja2VkIGEgZnJhbWUgd2l0aCBvcmlnaW5cIi4gZS5nOlxuICAgIC8vIGlmcmFtZS5jb250ZW50RG9jdW1lbnQuZGVmYXVsdFZpZXc7XG4gICAgLy8gQSBzYWZldHkgd2F5IGlzIHRvIGFjY2VzcyBvbmUgb2YgdGhlIGNyb3NzIG9yaWdpbiBwcm9wZXJ0aWVzOiBXaW5kb3cgb3IgTG9jYXRpb25cbiAgICAvLyBXaGljaCBtaWdodCByZXN1bHQgaW4gXCJTZWN1cml0eUVycm9yXCIgRE9NIEV4Y2VwdGlvbiBhbmQgaXQgaXMgY29tcGF0aWJsZSB0byBTYWZhcmkuXG4gICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvYnJvd3NlcnMuaHRtbCNpbnRlZ3JhdGlvbi13aXRoLWlkbFxuICAgIHJldHVybiB0eXBlb2YgaWZyYW1lLmNvbnRlbnRXaW5kb3cubG9jYXRpb24uaHJlZiA9PT0gJ3N0cmluZyc7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRBY3RpdmVFbGVtZW50RGVlcCgpIHtcbiAgdmFyIHdpbiA9IHdpbmRvdztcbiAgdmFyIGVsZW1lbnQgPSBnZXRBY3RpdmVFbGVtZW50KCk7XG5cbiAgd2hpbGUgKGVsZW1lbnQgaW5zdGFuY2VvZiB3aW4uSFRNTElGcmFtZUVsZW1lbnQpIHtcbiAgICBpZiAoaXNTYW1lT3JpZ2luRnJhbWUoZWxlbWVudCkpIHtcbiAgICAgIHdpbiA9IGVsZW1lbnQuY29udGVudFdpbmRvdztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgZWxlbWVudCA9IGdldEFjdGl2ZUVsZW1lbnQod2luLmRvY3VtZW50KTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufVxuLyoqXG4gKiBAUmVhY3RJbnB1dFNlbGVjdGlvbjogUmVhY3QgaW5wdXQgc2VsZWN0aW9uIG1vZHVsZS4gQmFzZWQgb24gU2VsZWN0aW9uLmpzLFxuICogYnV0IG1vZGlmaWVkIHRvIGJlIHN1aXRhYmxlIGZvciByZWFjdCBhbmQgaGFzIGEgY291cGxlIG9mIGJ1ZyBmaXhlcyAoZG9lc24ndFxuICogYXNzdW1lIGJ1dHRvbnMgaGF2ZSByYW5nZSBzZWxlY3Rpb25zIGFsbG93ZWQpLlxuICogSW5wdXQgc2VsZWN0aW9uIG1vZHVsZSBmb3IgUmVhY3QuXG4gKi9cblxuLyoqXG4gKiBAaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzOiB3ZSBnZXQgdGhlIGVsZW1lbnQgdHlwZXMgdGhhdCBzdXBwb3J0IHNlbGVjdGlvblxuICogZnJvbSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNkby1ub3QtYXBwbHksIGxvb2tpbmcgYXQgYHNlbGVjdGlvblN0YXJ0YFxuICogYW5kIGBzZWxlY3Rpb25FbmRgIHJvd3MuXG4gKi9cblxuXG5mdW5jdGlvbiBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMoZWxlbSkge1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtICYmIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gbm9kZU5hbWUgJiYgKG5vZGVOYW1lID09PSAnaW5wdXQnICYmIChlbGVtLnR5cGUgPT09ICd0ZXh0JyB8fCBlbGVtLnR5cGUgPT09ICdzZWFyY2gnIHx8IGVsZW0udHlwZSA9PT0gJ3RlbCcgfHwgZWxlbS50eXBlID09PSAndXJsJyB8fCBlbGVtLnR5cGUgPT09ICdwYXNzd29yZCcpIHx8IG5vZGVOYW1lID09PSAndGV4dGFyZWEnIHx8IGVsZW0uY29udGVudEVkaXRhYmxlID09PSAndHJ1ZScpO1xufVxuZnVuY3Rpb24gZ2V0U2VsZWN0aW9uSW5mb3JtYXRpb24oKSB7XG4gIHZhciBmb2N1c2VkRWxlbSA9IGdldEFjdGl2ZUVsZW1lbnREZWVwKCk7XG4gIHJldHVybiB7XG4gICAgZm9jdXNlZEVsZW06IGZvY3VzZWRFbGVtLFxuICAgIHNlbGVjdGlvblJhbmdlOiBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMoZm9jdXNlZEVsZW0pID8gZ2V0U2VsZWN0aW9uKGZvY3VzZWRFbGVtKSA6IG51bGxcbiAgfTtcbn1cbi8qKlxuICogQHJlc3RvcmVTZWxlY3Rpb246IElmIGFueSBzZWxlY3Rpb24gaW5mb3JtYXRpb24gd2FzIHBvdGVudGlhbGx5IGxvc3QsXG4gKiByZXN0b3JlIGl0LiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHBlcmZvcm1pbmcgb3BlcmF0aW9ucyB0aGF0IGNvdWxkIHJlbW92ZSBkb21cbiAqIG5vZGVzIGFuZCBwbGFjZSB0aGVtIGJhY2sgaW4sIHJlc3VsdGluZyBpbiBmb2N1cyBiZWluZyBsb3N0LlxuICovXG5cbmZ1bmN0aW9uIHJlc3RvcmVTZWxlY3Rpb24ocHJpb3JTZWxlY3Rpb25JbmZvcm1hdGlvbikge1xuICB2YXIgY3VyRm9jdXNlZEVsZW0gPSBnZXRBY3RpdmVFbGVtZW50RGVlcCgpO1xuICB2YXIgcHJpb3JGb2N1c2VkRWxlbSA9IHByaW9yU2VsZWN0aW9uSW5mb3JtYXRpb24uZm9jdXNlZEVsZW07XG4gIHZhciBwcmlvclNlbGVjdGlvblJhbmdlID0gcHJpb3JTZWxlY3Rpb25JbmZvcm1hdGlvbi5zZWxlY3Rpb25SYW5nZTtcblxuICBpZiAoY3VyRm9jdXNlZEVsZW0gIT09IHByaW9yRm9jdXNlZEVsZW0gJiYgaXNJbkRvY3VtZW50KHByaW9yRm9jdXNlZEVsZW0pKSB7XG4gICAgaWYgKHByaW9yU2VsZWN0aW9uUmFuZ2UgIT09IG51bGwgJiYgaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKHByaW9yRm9jdXNlZEVsZW0pKSB7XG4gICAgICBzZXRTZWxlY3Rpb24ocHJpb3JGb2N1c2VkRWxlbSwgcHJpb3JTZWxlY3Rpb25SYW5nZSk7XG4gICAgfSAvLyBGb2N1c2luZyBhIG5vZGUgY2FuIGNoYW5nZSB0aGUgc2Nyb2xsIHBvc2l0aW9uLCB3aGljaCBpcyB1bmRlc2lyYWJsZVxuXG5cbiAgICB2YXIgYW5jZXN0b3JzID0gW107XG4gICAgdmFyIGFuY2VzdG9yID0gcHJpb3JGb2N1c2VkRWxlbTtcblxuICAgIHdoaWxlIChhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudE5vZGUpIHtcbiAgICAgIGlmIChhbmNlc3Rvci5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIGFuY2VzdG9ycy5wdXNoKHtcbiAgICAgICAgICBlbGVtZW50OiBhbmNlc3RvcixcbiAgICAgICAgICBsZWZ0OiBhbmNlc3Rvci5zY3JvbGxMZWZ0LFxuICAgICAgICAgIHRvcDogYW5jZXN0b3Iuc2Nyb2xsVG9wXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcHJpb3JGb2N1c2VkRWxlbS5mb2N1cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcHJpb3JGb2N1c2VkRWxlbS5mb2N1cygpO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYW5jZXN0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaW5mbyA9IGFuY2VzdG9yc1tpXTtcbiAgICAgIGluZm8uZWxlbWVudC5zY3JvbGxMZWZ0ID0gaW5mby5sZWZ0O1xuICAgICAgaW5mby5lbGVtZW50LnNjcm9sbFRvcCA9IGluZm8udG9wO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBAZ2V0U2VsZWN0aW9uOiBHZXRzIHRoZSBzZWxlY3Rpb24gYm91bmRzIG9mIGEgZm9jdXNlZCB0ZXh0YXJlYSwgaW5wdXQgb3JcbiAqIGNvbnRlbnRFZGl0YWJsZSBub2RlLlxuICogLUBpbnB1dDogTG9vayB1cCBzZWxlY3Rpb24gYm91bmRzIG9mIHRoaXMgaW5wdXRcbiAqIC1AcmV0dXJuIHtzdGFydDogc2VsZWN0aW9uU3RhcnQsIGVuZDogc2VsZWN0aW9uRW5kfVxuICovXG5cbmZ1bmN0aW9uIGdldFNlbGVjdGlvbihpbnB1dCkge1xuICB2YXIgc2VsZWN0aW9uO1xuXG4gIGlmICgnc2VsZWN0aW9uU3RhcnQnIGluIGlucHV0KSB7XG4gICAgLy8gTW9kZXJuIGJyb3dzZXIgd2l0aCBpbnB1dCBvciB0ZXh0YXJlYS5cbiAgICBzZWxlY3Rpb24gPSB7XG4gICAgICBzdGFydDogaW5wdXQuc2VsZWN0aW9uU3RhcnQsXG4gICAgICBlbmQ6IGlucHV0LnNlbGVjdGlvbkVuZFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgLy8gQ29udGVudCBlZGl0YWJsZSBvciBvbGQgSUUgdGV4dGFyZWEuXG4gICAgc2VsZWN0aW9uID0gZ2V0T2Zmc2V0cyhpbnB1dCk7XG4gIH1cblxuICByZXR1cm4gc2VsZWN0aW9uIHx8IHtcbiAgICBzdGFydDogMCxcbiAgICBlbmQ6IDBcbiAgfTtcbn1cbi8qKlxuICogQHNldFNlbGVjdGlvbjogU2V0cyB0aGUgc2VsZWN0aW9uIGJvdW5kcyBvZiBhIHRleHRhcmVhIG9yIGlucHV0IGFuZCBmb2N1c2VzXG4gKiB0aGUgaW5wdXQuXG4gKiAtQGlucHV0ICAgICBTZXQgc2VsZWN0aW9uIGJvdW5kcyBvZiB0aGlzIGlucHV0IG9yIHRleHRhcmVhXG4gKiAtQG9mZnNldHMgICBPYmplY3Qgb2Ygc2FtZSBmb3JtIHRoYXQgaXMgcmV0dXJuZWQgZnJvbSBnZXQqXG4gKi9cblxuZnVuY3Rpb24gc2V0U2VsZWN0aW9uKGlucHV0LCBvZmZzZXRzKSB7XG4gIHZhciBzdGFydCA9IG9mZnNldHMuc3RhcnQ7XG4gIHZhciBlbmQgPSBvZmZzZXRzLmVuZDtcblxuICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmQgPSBzdGFydDtcbiAgfVxuXG4gIGlmICgnc2VsZWN0aW9uU3RhcnQnIGluIGlucHV0KSB7XG4gICAgaW5wdXQuc2VsZWN0aW9uU3RhcnQgPSBzdGFydDtcbiAgICBpbnB1dC5zZWxlY3Rpb25FbmQgPSBNYXRoLm1pbihlbmQsIGlucHV0LnZhbHVlLmxlbmd0aCk7XG4gIH0gZWxzZSB7XG4gICAgc2V0T2Zmc2V0cyhpbnB1dCwgb2Zmc2V0cyk7XG4gIH1cbn1cblxudmFyIHNraXBTZWxlY3Rpb25DaGFuZ2VFdmVudCA9IGNhblVzZURPTSAmJiAnZG9jdW1lbnRNb2RlJyBpbiBkb2N1bWVudCAmJiBkb2N1bWVudC5kb2N1bWVudE1vZGUgPD0gMTE7XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyRXZlbnRzJDMoKSB7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25TZWxlY3QnLCBbJ2ZvY3Vzb3V0JywgJ2NvbnRleHRtZW51JywgJ2RyYWdlbmQnLCAnZm9jdXNpbicsICdrZXlkb3duJywgJ2tleXVwJywgJ21vdXNlZG93bicsICdtb3VzZXVwJywgJ3NlbGVjdGlvbmNoYW5nZSddKTtcbn1cblxudmFyIGFjdGl2ZUVsZW1lbnQkMSA9IG51bGw7XG52YXIgYWN0aXZlRWxlbWVudEluc3QkMSA9IG51bGw7XG52YXIgbGFzdFNlbGVjdGlvbiA9IG51bGw7XG52YXIgbW91c2VEb3duID0gZmFsc2U7XG4vKipcbiAqIEdldCBhbiBvYmplY3Qgd2hpY2ggaXMgYSB1bmlxdWUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLlxuICpcbiAqIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBub3QgYmUgY29uc2lzdGVudCBhY3Jvc3Mgbm9kZXMgb3IgYnJvd3NlcnMsIGJ1dFxuICogdHdvIGlkZW50aWNhbCBzZWxlY3Rpb25zIG9uIHRoZSBzYW1lIG5vZGUgd2lsbCByZXR1cm4gaWRlbnRpY2FsIG9iamVjdHMuXG4gKi9cblxuZnVuY3Rpb24gZ2V0U2VsZWN0aW9uJDEobm9kZSkge1xuICBpZiAoJ3NlbGVjdGlvblN0YXJ0JyBpbiBub2RlICYmIGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhub2RlKSkge1xuICAgIHJldHVybiB7XG4gICAgICBzdGFydDogbm9kZS5zZWxlY3Rpb25TdGFydCxcbiAgICAgIGVuZDogbm9kZS5zZWxlY3Rpb25FbmRcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHZhciB3aW4gPSBub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHdpbmRvdztcbiAgICB2YXIgc2VsZWN0aW9uID0gd2luLmdldFNlbGVjdGlvbigpO1xuICAgIHJldHVybiB7XG4gICAgICBhbmNob3JOb2RlOiBzZWxlY3Rpb24uYW5jaG9yTm9kZSxcbiAgICAgIGFuY2hvck9mZnNldDogc2VsZWN0aW9uLmFuY2hvck9mZnNldCxcbiAgICAgIGZvY3VzTm9kZTogc2VsZWN0aW9uLmZvY3VzTm9kZSxcbiAgICAgIGZvY3VzT2Zmc2V0OiBzZWxlY3Rpb24uZm9jdXNPZmZzZXRcbiAgICB9O1xuICB9XG59XG4vKipcbiAqIEdldCBkb2N1bWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGV2ZW50IHRhcmdldC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEV2ZW50VGFyZ2V0RG9jdW1lbnQoZXZlbnRUYXJnZXQpIHtcbiAgcmV0dXJuIGV2ZW50VGFyZ2V0LndpbmRvdyA9PT0gZXZlbnRUYXJnZXQgPyBldmVudFRhcmdldC5kb2N1bWVudCA6IGV2ZW50VGFyZ2V0Lm5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFID8gZXZlbnRUYXJnZXQgOiBldmVudFRhcmdldC5vd25lckRvY3VtZW50O1xufVxuLyoqXG4gKiBQb2xsIHNlbGVjdGlvbiB0byBzZWUgd2hldGhlciBpdCdzIGNoYW5nZWQuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50XG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnRUYXJnZXRcbiAqIEByZXR1cm4gez9TeW50aGV0aWNFdmVudH1cbiAqL1xuXG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFNlbGVjdEV2ZW50KGRpc3BhdGNoUXVldWUsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICAvLyBFbnN1cmUgd2UgaGF2ZSB0aGUgcmlnaHQgZWxlbWVudCwgYW5kIHRoYXQgdGhlIHVzZXIgaXMgbm90IGRyYWdnaW5nIGFcbiAgLy8gc2VsZWN0aW9uICh0aGlzIG1hdGNoZXMgbmF0aXZlIGBzZWxlY3RgIGV2ZW50IGJlaGF2aW9yKS4gSW4gSFRNTDUsIHNlbGVjdFxuICAvLyBmaXJlcyBvbmx5IG9uIGlucHV0IGFuZCB0ZXh0YXJlYSB0aHVzIGlmIHRoZXJlJ3Mgbm8gZm9jdXNlZCBlbGVtZW50IHdlXG4gIC8vIHdvbid0IGRpc3BhdGNoLlxuICB2YXIgZG9jID0gZ2V0RXZlbnRUYXJnZXREb2N1bWVudChuYXRpdmVFdmVudFRhcmdldCk7XG5cbiAgaWYgKG1vdXNlRG93biB8fCBhY3RpdmVFbGVtZW50JDEgPT0gbnVsbCB8fCBhY3RpdmVFbGVtZW50JDEgIT09IGdldEFjdGl2ZUVsZW1lbnQoZG9jKSkge1xuICAgIHJldHVybjtcbiAgfSAvLyBPbmx5IGZpcmUgd2hlbiBzZWxlY3Rpb24gaGFzIGFjdHVhbGx5IGNoYW5nZWQuXG5cblxuICB2YXIgY3VycmVudFNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbiQxKGFjdGl2ZUVsZW1lbnQkMSk7XG5cbiAgaWYgKCFsYXN0U2VsZWN0aW9uIHx8ICFzaGFsbG93RXF1YWwobGFzdFNlbGVjdGlvbiwgY3VycmVudFNlbGVjdGlvbikpIHtcbiAgICBsYXN0U2VsZWN0aW9uID0gY3VycmVudFNlbGVjdGlvbjtcbiAgICB2YXIgbGlzdGVuZXJzID0gYWNjdW11bGF0ZVR3b1BoYXNlTGlzdGVuZXJzKGFjdGl2ZUVsZW1lbnRJbnN0JDEsICdvblNlbGVjdCcpO1xuXG4gICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgZXZlbnQgPSBuZXcgU3ludGhldGljRXZlbnQoJ29uU2VsZWN0JywgJ3NlbGVjdCcsIG51bGwsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgICBkaXNwYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgICBldmVudDogZXZlbnQsXG4gICAgICAgIGxpc3RlbmVyczogbGlzdGVuZXJzXG4gICAgICB9KTtcbiAgICAgIGV2ZW50LnRhcmdldCA9IGFjdGl2ZUVsZW1lbnQkMTtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogVGhpcyBwbHVnaW4gY3JlYXRlcyBhbiBgb25TZWxlY3RgIGV2ZW50IHRoYXQgbm9ybWFsaXplcyBzZWxlY3QgZXZlbnRzXG4gKiBhY3Jvc3MgZm9ybSBlbGVtZW50cy5cbiAqXG4gKiBTdXBwb3J0ZWQgZWxlbWVudHMgYXJlOlxuICogLSBpbnB1dCAoc2VlIGBpc1RleHRJbnB1dEVsZW1lbnRgKVxuICogLSB0ZXh0YXJlYVxuICogLSBjb250ZW50RWRpdGFibGVcbiAqXG4gKiBUaGlzIGRpZmZlcnMgZnJvbSBuYXRpdmUgYnJvd3NlciBpbXBsZW1lbnRhdGlvbnMgaW4gdGhlIGZvbGxvd2luZyB3YXlzOlxuICogLSBGaXJlcyBvbiBjb250ZW50RWRpdGFibGUgZmllbGRzIGFzIHdlbGwgYXMgaW5wdXRzLlxuICogLSBGaXJlcyBmb3IgY29sbGFwc2VkIHNlbGVjdGlvbi5cbiAqIC0gRmlyZXMgYWZ0ZXIgdXNlciBpbnB1dC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGV4dHJhY3RFdmVudHMkMyhkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIHZhciB0YXJnZXROb2RlID0gdGFyZ2V0SW5zdCA/IGdldE5vZGVGcm9tSW5zdGFuY2UodGFyZ2V0SW5zdCkgOiB3aW5kb3c7XG5cbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICAvLyBUcmFjayB0aGUgaW5wdXQgbm9kZSB0aGF0IGhhcyBmb2N1cy5cbiAgICBjYXNlICdmb2N1c2luJzpcbiAgICAgIGlmIChpc1RleHRJbnB1dEVsZW1lbnQodGFyZ2V0Tm9kZSkgfHwgdGFyZ2V0Tm9kZS5jb250ZW50RWRpdGFibGUgPT09ICd0cnVlJykge1xuICAgICAgICBhY3RpdmVFbGVtZW50JDEgPSB0YXJnZXROb2RlO1xuICAgICAgICBhY3RpdmVFbGVtZW50SW5zdCQxID0gdGFyZ2V0SW5zdDtcbiAgICAgICAgbGFzdFNlbGVjdGlvbiA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZm9jdXNvdXQnOlxuICAgICAgYWN0aXZlRWxlbWVudCQxID0gbnVsbDtcbiAgICAgIGFjdGl2ZUVsZW1lbnRJbnN0JDEgPSBudWxsO1xuICAgICAgbGFzdFNlbGVjdGlvbiA9IG51bGw7XG4gICAgICBicmVhaztcbiAgICAvLyBEb24ndCBmaXJlIHRoZSBldmVudCB3aGlsZSB0aGUgdXNlciBpcyBkcmFnZ2luZy4gVGhpcyBtYXRjaGVzIHRoZVxuICAgIC8vIHNlbWFudGljcyBvZiB0aGUgbmF0aXZlIHNlbGVjdCBldmVudC5cblxuICAgIGNhc2UgJ21vdXNlZG93bic6XG4gICAgICBtb3VzZURvd24gPSB0cnVlO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdjb250ZXh0bWVudSc6XG4gICAgY2FzZSAnbW91c2V1cCc6XG4gICAgY2FzZSAnZHJhZ2VuZCc6XG4gICAgICBtb3VzZURvd24gPSBmYWxzZTtcbiAgICAgIGNvbnN0cnVjdFNlbGVjdEV2ZW50KGRpc3BhdGNoUXVldWUsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgICBicmVhaztcbiAgICAvLyBDaHJvbWUgYW5kIElFIGZpcmUgbm9uLXN0YW5kYXJkIGV2ZW50IHdoZW4gc2VsZWN0aW9uIGlzIGNoYW5nZWQgKGFuZFxuICAgIC8vIHNvbWV0aW1lcyB3aGVuIGl0IGhhc24ndCkuIElFJ3MgZXZlbnQgZmlyZXMgb3V0IG9mIG9yZGVyIHdpdGggcmVzcGVjdFxuICAgIC8vIHRvIGtleSBhbmQgaW5wdXQgZXZlbnRzIG9uIGRlbGV0aW9uLCBzbyB3ZSBkaXNjYXJkIGl0LlxuICAgIC8vXG4gICAgLy8gRmlyZWZveCBkb2Vzbid0IHN1cHBvcnQgc2VsZWN0aW9uY2hhbmdlLCBzbyBjaGVjayBzZWxlY3Rpb24gc3RhdHVzXG4gICAgLy8gYWZ0ZXIgZWFjaCBrZXkgZW50cnkuIFRoZSBzZWxlY3Rpb24gY2hhbmdlcyBhZnRlciBrZXlkb3duIGFuZCBiZWZvcmVcbiAgICAvLyBrZXl1cCwgYnV0IHdlIGNoZWNrIG9uIGtleWRvd24gYXMgd2VsbCBpbiB0aGUgY2FzZSBvZiBob2xkaW5nIGRvd24gYVxuICAgIC8vIGtleSwgd2hlbiBtdWx0aXBsZSBrZXlkb3duIGV2ZW50cyBhcmUgZmlyZWQgYnV0IG9ubHkgb25lIGtleXVwIGlzLlxuICAgIC8vIFRoaXMgaXMgYWxzbyBvdXIgYXBwcm9hY2ggZm9yIElFIGhhbmRsaW5nLCBmb3IgdGhlIHJlYXNvbiBhYm92ZS5cblxuICAgIGNhc2UgJ3NlbGVjdGlvbmNoYW5nZSc6XG4gICAgICBpZiAoc2tpcFNlbGVjdGlvbkNoYW5nZUV2ZW50KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgLy8gZmFsbHMgdGhyb3VnaFxuXG4gICAgY2FzZSAna2V5ZG93bic6XG4gICAgY2FzZSAna2V5dXAnOlxuICAgICAgY29uc3RydWN0U2VsZWN0RXZlbnQoZGlzcGF0Y2hRdWV1ZSwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgfVxufVxuXG4vKipcbiAqIEdlbmVyYXRlIGEgbWFwcGluZyBvZiBzdGFuZGFyZCB2ZW5kb3IgcHJlZml4ZXMgdXNpbmcgdGhlIGRlZmluZWQgc3R5bGUgcHJvcGVydHkgYW5kIGV2ZW50IG5hbWUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0eWxlUHJvcFxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuXG5mdW5jdGlvbiBtYWtlUHJlZml4TWFwKHN0eWxlUHJvcCwgZXZlbnROYW1lKSB7XG4gIHZhciBwcmVmaXhlcyA9IHt9O1xuICBwcmVmaXhlc1tzdHlsZVByb3AudG9Mb3dlckNhc2UoKV0gPSBldmVudE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcHJlZml4ZXNbJ1dlYmtpdCcgKyBzdHlsZVByb3BdID0gJ3dlYmtpdCcgKyBldmVudE5hbWU7XG4gIHByZWZpeGVzWydNb3onICsgc3R5bGVQcm9wXSA9ICdtb3onICsgZXZlbnROYW1lO1xuICByZXR1cm4gcHJlZml4ZXM7XG59XG4vKipcbiAqIEEgbGlzdCBvZiBldmVudCBuYW1lcyB0byBhIGNvbmZpZ3VyYWJsZSBsaXN0IG9mIHZlbmRvciBwcmVmaXhlcy5cbiAqL1xuXG5cbnZhciB2ZW5kb3JQcmVmaXhlcyA9IHtcbiAgYW5pbWF0aW9uZW5kOiBtYWtlUHJlZml4TWFwKCdBbmltYXRpb24nLCAnQW5pbWF0aW9uRW5kJyksXG4gIGFuaW1hdGlvbml0ZXJhdGlvbjogbWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvbkl0ZXJhdGlvbicpLFxuICBhbmltYXRpb25zdGFydDogbWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvblN0YXJ0JyksXG4gIHRyYW5zaXRpb25lbmQ6IG1ha2VQcmVmaXhNYXAoJ1RyYW5zaXRpb24nLCAnVHJhbnNpdGlvbkVuZCcpXG59O1xuLyoqXG4gKiBFdmVudCBuYW1lcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGRldGVjdGVkIGFuZCBwcmVmaXhlZCAoaWYgYXBwbGljYWJsZSkuXG4gKi9cblxudmFyIHByZWZpeGVkRXZlbnROYW1lcyA9IHt9O1xuLyoqXG4gKiBFbGVtZW50IHRvIGNoZWNrIGZvciBwcmVmaXhlcyBvbi5cbiAqL1xuXG52YXIgc3R5bGUgPSB7fTtcbi8qKlxuICogQm9vdHN0cmFwIGlmIGEgRE9NIGV4aXN0cy5cbiAqL1xuXG5pZiAoY2FuVXNlRE9NKSB7XG4gIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jykuc3R5bGU7IC8vIE9uIHNvbWUgcGxhdGZvcm1zLCBpbiBwYXJ0aWN1bGFyIHNvbWUgcmVsZWFzZXMgb2YgQW5kcm9pZCA0LngsXG4gIC8vIHRoZSB1bi1wcmVmaXhlZCBcImFuaW1hdGlvblwiIGFuZCBcInRyYW5zaXRpb25cIiBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIG9uIHRoZVxuICAvLyBzdHlsZSBvYmplY3QgYnV0IHRoZSBldmVudHMgdGhhdCBmaXJlIHdpbGwgc3RpbGwgYmUgcHJlZml4ZWQsIHNvIHdlIG5lZWRcbiAgLy8gdG8gY2hlY2sgaWYgdGhlIHVuLXByZWZpeGVkIGV2ZW50cyBhcmUgdXNhYmxlLCBhbmQgaWYgbm90IHJlbW92ZSB0aGVtIGZyb20gdGhlIG1hcC5cblxuICBpZiAoISgnQW5pbWF0aW9uRXZlbnQnIGluIHdpbmRvdykpIHtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uZW5kLmFuaW1hdGlvbjtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uaXRlcmF0aW9uLmFuaW1hdGlvbjtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uc3RhcnQuYW5pbWF0aW9uO1xuICB9IC8vIFNhbWUgYXMgYWJvdmVcblxuXG4gIGlmICghKCdUcmFuc2l0aW9uRXZlbnQnIGluIHdpbmRvdykpIHtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMudHJhbnNpdGlvbmVuZC50cmFuc2l0aW9uO1xuICB9XG59XG4vKipcbiAqIEF0dGVtcHRzIHRvIGRldGVybWluZSB0aGUgY29ycmVjdCB2ZW5kb3IgcHJlZml4ZWQgZXZlbnQgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5cblxuZnVuY3Rpb24gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoZXZlbnROYW1lKSB7XG4gIGlmIChwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXSkge1xuICAgIHJldHVybiBwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXTtcbiAgfSBlbHNlIGlmICghdmVuZG9yUHJlZml4ZXNbZXZlbnROYW1lXSkge1xuICAgIHJldHVybiBldmVudE5hbWU7XG4gIH1cblxuICB2YXIgcHJlZml4TWFwID0gdmVuZG9yUHJlZml4ZXNbZXZlbnROYW1lXTtcblxuICBmb3IgKHZhciBzdHlsZVByb3AgaW4gcHJlZml4TWFwKSB7XG4gICAgaWYgKHByZWZpeE1hcC5oYXNPd25Qcm9wZXJ0eShzdHlsZVByb3ApICYmIHN0eWxlUHJvcCBpbiBzdHlsZSkge1xuICAgICAgcmV0dXJuIHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdID0gcHJlZml4TWFwW3N0eWxlUHJvcF07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV2ZW50TmFtZTtcbn1cblxudmFyIEFOSU1BVElPTl9FTkQgPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgnYW5pbWF0aW9uZW5kJyk7XG52YXIgQU5JTUFUSU9OX0lURVJBVElPTiA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCdhbmltYXRpb25pdGVyYXRpb24nKTtcbnZhciBBTklNQVRJT05fU1RBUlQgPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgnYW5pbWF0aW9uc3RhcnQnKTtcbnZhciBUUkFOU0lUSU9OX0VORCA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCd0cmFuc2l0aW9uZW5kJyk7XG5cbnZhciB0b3BMZXZlbEV2ZW50c1RvUmVhY3ROYW1lcyA9IG5ldyBNYXAoKTsgLy8gTk9URTogQ2FwaXRhbGl6YXRpb24gaXMgaW1wb3J0YW50IGluIHRoaXMgbGlzdCFcbi8vXG4vLyBFLmcuIGl0IG5lZWRzIFwicG9pbnRlckRvd25cIiwgbm90IFwicG9pbnRlcmRvd25cIi5cbi8vIFRoaXMgaXMgYmVjYXVzZSB3ZSBkZXJpdmUgYm90aCBSZWFjdCBuYW1lIChcIm9uUG9pbnRlckRvd25cIilcbi8vIGFuZCBET00gbmFtZSAoXCJwb2ludGVyZG93blwiKSBmcm9tIHRoZSBzYW1lIGxpc3QuXG4vL1xuLy8gRXhjZXB0aW9ucyB0aGF0IGRvbid0IG1hdGNoIHRoaXMgY29udmVudGlvbiBhcmUgbGlzdGVkIHNlcGFyYXRlbHkuXG4vL1xuLy8gcHJldHRpZXItaWdub3JlXG5cbnZhciBzaW1wbGVFdmVudFBsdWdpbkV2ZW50cyA9IFsnYWJvcnQnLCAnYXV4Q2xpY2snLCAnY2FuY2VsJywgJ2NhblBsYXknLCAnY2FuUGxheVRocm91Z2gnLCAnY2xpY2snLCAnY2xvc2UnLCAnY29udGV4dE1lbnUnLCAnY29weScsICdjdXQnLCAnZHJhZycsICdkcmFnRW5kJywgJ2RyYWdFbnRlcicsICdkcmFnRXhpdCcsICdkcmFnTGVhdmUnLCAnZHJhZ092ZXInLCAnZHJhZ1N0YXJ0JywgJ2Ryb3AnLCAnZHVyYXRpb25DaGFuZ2UnLCAnZW1wdGllZCcsICdlbmNyeXB0ZWQnLCAnZW5kZWQnLCAnZXJyb3InLCAnZ290UG9pbnRlckNhcHR1cmUnLCAnaW5wdXQnLCAnaW52YWxpZCcsICdrZXlEb3duJywgJ2tleVByZXNzJywgJ2tleVVwJywgJ2xvYWQnLCAnbG9hZGVkRGF0YScsICdsb2FkZWRNZXRhZGF0YScsICdsb2FkU3RhcnQnLCAnbG9zdFBvaW50ZXJDYXB0dXJlJywgJ21vdXNlRG93bicsICdtb3VzZU1vdmUnLCAnbW91c2VPdXQnLCAnbW91c2VPdmVyJywgJ21vdXNlVXAnLCAncGFzdGUnLCAncGF1c2UnLCAncGxheScsICdwbGF5aW5nJywgJ3BvaW50ZXJDYW5jZWwnLCAncG9pbnRlckRvd24nLCAncG9pbnRlck1vdmUnLCAncG9pbnRlck91dCcsICdwb2ludGVyT3ZlcicsICdwb2ludGVyVXAnLCAncHJvZ3Jlc3MnLCAncmF0ZUNoYW5nZScsICdyZXNldCcsICdyZXNpemUnLCAnc2Vla2VkJywgJ3NlZWtpbmcnLCAnc3RhbGxlZCcsICdzdWJtaXQnLCAnc3VzcGVuZCcsICd0aW1lVXBkYXRlJywgJ3RvdWNoQ2FuY2VsJywgJ3RvdWNoRW5kJywgJ3RvdWNoU3RhcnQnLCAndm9sdW1lQ2hhbmdlJywgJ3Njcm9sbCcsICd0b2dnbGUnLCAndG91Y2hNb3ZlJywgJ3dhaXRpbmcnLCAnd2hlZWwnXTtcblxuZnVuY3Rpb24gcmVnaXN0ZXJTaW1wbGVFdmVudChkb21FdmVudE5hbWUsIHJlYWN0TmFtZSkge1xuICB0b3BMZXZlbEV2ZW50c1RvUmVhY3ROYW1lcy5zZXQoZG9tRXZlbnROYW1lLCByZWFjdE5hbWUpO1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQocmVhY3ROYW1lLCBbZG9tRXZlbnROYW1lXSk7XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyU2ltcGxlRXZlbnRzKCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHNpbXBsZUV2ZW50UGx1Z2luRXZlbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGV2ZW50TmFtZSA9IHNpbXBsZUV2ZW50UGx1Z2luRXZlbnRzW2ldO1xuICAgIHZhciBkb21FdmVudE5hbWUgPSBldmVudE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgY2FwaXRhbGl6ZWRFdmVudCA9IGV2ZW50TmFtZVswXS50b1VwcGVyQ2FzZSgpICsgZXZlbnROYW1lLnNsaWNlKDEpO1xuICAgIHJlZ2lzdGVyU2ltcGxlRXZlbnQoZG9tRXZlbnROYW1lLCAnb24nICsgY2FwaXRhbGl6ZWRFdmVudCk7XG4gIH0gLy8gU3BlY2lhbCBjYXNlcyB3aGVyZSBldmVudCBuYW1lcyBkb24ndCBtYXRjaC5cblxuXG4gIHJlZ2lzdGVyU2ltcGxlRXZlbnQoQU5JTUFUSU9OX0VORCwgJ29uQW5pbWF0aW9uRW5kJyk7XG4gIHJlZ2lzdGVyU2ltcGxlRXZlbnQoQU5JTUFUSU9OX0lURVJBVElPTiwgJ29uQW5pbWF0aW9uSXRlcmF0aW9uJyk7XG4gIHJlZ2lzdGVyU2ltcGxlRXZlbnQoQU5JTUFUSU9OX1NUQVJULCAnb25BbmltYXRpb25TdGFydCcpO1xuICByZWdpc3RlclNpbXBsZUV2ZW50KCdkYmxjbGljaycsICdvbkRvdWJsZUNsaWNrJyk7XG4gIHJlZ2lzdGVyU2ltcGxlRXZlbnQoJ2ZvY3VzaW4nLCAnb25Gb2N1cycpO1xuICByZWdpc3RlclNpbXBsZUV2ZW50KCdmb2N1c291dCcsICdvbkJsdXInKTtcbiAgcmVnaXN0ZXJTaW1wbGVFdmVudChUUkFOU0lUSU9OX0VORCwgJ29uVHJhbnNpdGlvbkVuZCcpO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzJDQoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgcmVhY3ROYW1lID0gdG9wTGV2ZWxFdmVudHNUb1JlYWN0TmFtZXMuZ2V0KGRvbUV2ZW50TmFtZSk7XG5cbiAgaWYgKHJlYWN0TmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0V2ZW50O1xuICB2YXIgcmVhY3RFdmVudFR5cGUgPSBkb21FdmVudE5hbWU7XG5cbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdrZXlwcmVzcyc6XG4gICAgICAvLyBGaXJlZm94IGNyZWF0ZXMgYSBrZXlwcmVzcyBldmVudCBmb3IgZnVuY3Rpb24ga2V5cyB0b28uIFRoaXMgcmVtb3Zlc1xuICAgICAgLy8gdGhlIHVud2FudGVkIGtleXByZXNzIGV2ZW50cy4gRW50ZXIgaXMgaG93ZXZlciBib3RoIHByaW50YWJsZSBhbmRcbiAgICAgIC8vIG5vbi1wcmludGFibGUuIE9uZSB3b3VsZCBleHBlY3QgVGFiIHRvIGJlIGFzIHdlbGwgKGJ1dCBpdCBpc24ndCkuXG4gICAgICBpZiAoZ2V0RXZlbnRDaGFyQ29kZShuYXRpdmVFdmVudCkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuXG4gICAgY2FzZSAna2V5ZG93bic6XG4gICAgY2FzZSAna2V5dXAnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljS2V5Ym9hcmRFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZm9jdXNpbic6XG4gICAgICByZWFjdEV2ZW50VHlwZSA9ICdmb2N1cyc7XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNGb2N1c0V2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdmb2N1c291dCc6XG4gICAgICByZWFjdEV2ZW50VHlwZSA9ICdibHVyJztcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0ZvY3VzRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2JlZm9yZWJsdXInOlxuICAgIGNhc2UgJ2FmdGVyYmx1cic6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNGb2N1c0V2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdjbGljayc6XG4gICAgICAvLyBGaXJlZm94IGNyZWF0ZXMgYSBjbGljayBldmVudCBvbiByaWdodCBtb3VzZSBjbGlja3MuIFRoaXMgcmVtb3ZlcyB0aGVcbiAgICAgIC8vIHVud2FudGVkIGNsaWNrIGV2ZW50cy5cbiAgICAgIGlmIChuYXRpdmVFdmVudC5idXR0b24gPT09IDIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuXG4gICAgY2FzZSAnYXV4Y2xpY2snOlxuICAgIGNhc2UgJ2RibGNsaWNrJzpcbiAgICBjYXNlICdtb3VzZWRvd24nOlxuICAgIGNhc2UgJ21vdXNlbW92ZSc6XG4gICAgY2FzZSAnbW91c2V1cCc6IC8vIFRPRE86IERpc2FibGVkIGVsZW1lbnRzIHNob3VsZCBub3QgcmVzcG9uZCB0byBtb3VzZSBldmVudHNcblxuICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cblxuICAgIGNhc2UgJ21vdXNlb3V0JzpcbiAgICBjYXNlICdtb3VzZW92ZXInOlxuICAgIGNhc2UgJ2NvbnRleHRtZW51JzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY01vdXNlRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2RyYWcnOlxuICAgIGNhc2UgJ2RyYWdlbmQnOlxuICAgIGNhc2UgJ2RyYWdlbnRlcic6XG4gICAgY2FzZSAnZHJhZ2V4aXQnOlxuICAgIGNhc2UgJ2RyYWdsZWF2ZSc6XG4gICAgY2FzZSAnZHJhZ292ZXInOlxuICAgIGNhc2UgJ2RyYWdzdGFydCc6XG4gICAgY2FzZSAnZHJvcCc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNEcmFnRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RvdWNoY2FuY2VsJzpcbiAgICBjYXNlICd0b3VjaGVuZCc6XG4gICAgY2FzZSAndG91Y2htb3ZlJzpcbiAgICBjYXNlICd0b3VjaHN0YXJ0JzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1RvdWNoRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgQU5JTUFUSU9OX0VORDpcbiAgICBjYXNlIEFOSU1BVElPTl9JVEVSQVRJT046XG4gICAgY2FzZSBBTklNQVRJT05fU1RBUlQ6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNBbmltYXRpb25FdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBUUkFOU0lUSU9OX0VORDpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1RyYW5zaXRpb25FdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2Nyb2xsJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1VJRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3doZWVsJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1doZWVsRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2NvcHknOlxuICAgIGNhc2UgJ2N1dCc6XG4gICAgY2FzZSAncGFzdGUnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljQ2xpcGJvYXJkRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2dvdHBvaW50ZXJjYXB0dXJlJzpcbiAgICBjYXNlICdsb3N0cG9pbnRlcmNhcHR1cmUnOlxuICAgIGNhc2UgJ3BvaW50ZXJjYW5jZWwnOlxuICAgIGNhc2UgJ3BvaW50ZXJkb3duJzpcbiAgICBjYXNlICdwb2ludGVybW92ZSc6XG4gICAgY2FzZSAncG9pbnRlcm91dCc6XG4gICAgY2FzZSAncG9pbnRlcm92ZXInOlxuICAgIGNhc2UgJ3BvaW50ZXJ1cCc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNQb2ludGVyRXZlbnQ7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHZhciBpbkNhcHR1cmVQaGFzZSA9IChldmVudFN5c3RlbUZsYWdzICYgSVNfQ0FQVFVSRV9QSEFTRSkgIT09IDA7XG5cbiAge1xuICAgIC8vIFNvbWUgZXZlbnRzIGRvbid0IGJ1YmJsZSBpbiB0aGUgYnJvd3Nlci5cbiAgICAvLyBJbiB0aGUgcGFzdCwgUmVhY3QgaGFzIGFsd2F5cyBidWJibGVkIHRoZW0sIGJ1dCB0aGlzIGNhbiBiZSBzdXJwcmlzaW5nLlxuICAgIC8vIFdlJ3JlIGdvaW5nIHRvIHRyeSBhbGlnbmluZyBjbG9zZXIgdG8gdGhlIGJyb3dzZXIgYmVoYXZpb3IgYnkgbm90IGJ1YmJsaW5nXG4gICAgLy8gdGhlbSBpbiBSZWFjdCBlaXRoZXIuIFdlJ2xsIHN0YXJ0IGJ5IG5vdCBidWJibGluZyBvblNjcm9sbCwgYW5kIHRoZW4gZXhwYW5kLlxuICAgIHZhciBhY2N1bXVsYXRlVGFyZ2V0T25seSA9ICFpbkNhcHR1cmVQaGFzZSAmJiAvLyBUT0RPOiBpZGVhbGx5LCB3ZSdkIGV2ZW50dWFsbHkgYWRkIGFsbCBldmVudHMgZnJvbVxuICAgIC8vIG5vbkRlbGVnYXRlZEV2ZW50cyBsaXN0IGluIERPTVBsdWdpbkV2ZW50U3lzdGVtLlxuICAgIC8vIFRoZW4gd2UgY2FuIHJlbW92ZSB0aGlzIHNwZWNpYWwgbGlzdC5cbiAgICAvLyBUaGlzIGlzIGEgYnJlYWtpbmcgY2hhbmdlIHRoYXQgY2FuIHdhaXQgdW50aWwgUmVhY3QgMTguXG4gICAgZG9tRXZlbnROYW1lID09PSAnc2Nyb2xsJztcblxuICAgIHZhciBfbGlzdGVuZXJzID0gYWNjdW11bGF0ZVNpbmdsZVBoYXNlTGlzdGVuZXJzKHRhcmdldEluc3QsIHJlYWN0TmFtZSwgbmF0aXZlRXZlbnQudHlwZSwgaW5DYXB0dXJlUGhhc2UsIGFjY3VtdWxhdGVUYXJnZXRPbmx5KTtcblxuICAgIGlmIChfbGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIEludGVudGlvbmFsbHkgY3JlYXRlIGV2ZW50IGxhemlseS5cbiAgICAgIHZhciBfZXZlbnQgPSBuZXcgU3ludGhldGljRXZlbnRDdG9yKHJlYWN0TmFtZSwgcmVhY3RFdmVudFR5cGUsIG51bGwsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG5cbiAgICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICAgIGV2ZW50OiBfZXZlbnQsXG4gICAgICAgIGxpc3RlbmVyczogX2xpc3RlbmVyc1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbi8vIFRPRE86IHJlbW92ZSB0b3AtbGV2ZWwgc2lkZSBlZmZlY3QuXG5yZWdpc3RlclNpbXBsZUV2ZW50cygpO1xucmVnaXN0ZXJFdmVudHMkMigpO1xucmVnaXN0ZXJFdmVudHMkMSgpO1xucmVnaXN0ZXJFdmVudHMkMygpO1xucmVnaXN0ZXJFdmVudHMoKTtcblxuZnVuY3Rpb24gZXh0cmFjdEV2ZW50cyQ1KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpIHtcbiAgLy8gVE9ETzogd2Ugc2hvdWxkIHJlbW92ZSB0aGUgY29uY2VwdCBvZiBhIFwiU2ltcGxlRXZlbnRQbHVnaW5cIi5cbiAgLy8gVGhpcyBpcyB0aGUgYmFzaWMgZnVuY3Rpb25hbGl0eSBvZiB0aGUgZXZlbnQgc3lzdGVtLiBBbGxcbiAgLy8gdGhlIG90aGVyIHBsdWdpbnMgYXJlIGVzc2VudGlhbGx5IHBvbHlmaWxscy4gU28gdGhlIHBsdWdpblxuICAvLyBzaG91bGQgcHJvYmFibHkgYmUgaW5saW5lZCBzb21ld2hlcmUgYW5kIGhhdmUgaXRzIGxvZ2ljXG4gIC8vIGJlIGNvcmUgdGhlIHRvIGV2ZW50IHN5c3RlbS4gVGhpcyB3b3VsZCBwb3RlbnRpYWxseSBhbGxvd1xuICAvLyB1cyB0byBzaGlwIGJ1aWxkcyBvZiBSZWFjdCB3aXRob3V0IHRoZSBwb2x5ZmlsbGVkIHBsdWdpbnMgYmVsb3cuXG4gIGV4dHJhY3RFdmVudHMkNChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncyk7XG4gIHZhciBzaG91bGRQcm9jZXNzUG9seWZpbGxQbHVnaW5zID0gKGV2ZW50U3lzdGVtRmxhZ3MgJiBTSE9VTERfTk9UX1BST0NFU1NfUE9MWUZJTExfRVZFTlRfUExVR0lOUykgPT09IDA7IC8vIFdlIGRvbid0IHByb2Nlc3MgdGhlc2UgZXZlbnRzIHVubGVzcyB3ZSBhcmUgaW4gdGhlXG4gIC8vIGV2ZW50J3MgbmF0aXZlIFwiYnViYmxlXCIgcGhhc2UsIHdoaWNoIG1lYW5zIHRoYXQgd2UncmVcbiAgLy8gbm90IGluIHRoZSBjYXB0dXJlIHBoYXNlLiBUaGF0J3MgYmVjYXVzZSB3ZSBlbXVsYXRlXG4gIC8vIHRoZSBjYXB0dXJlIHBoYXNlIGhlcmUgc3RpbGwuIFRoaXMgaXMgYSB0cmFkZS1vZmYsXG4gIC8vIGJlY2F1c2UgaW4gYW4gaWRlYWwgd29ybGQgd2Ugd291bGQgbm90IGVtdWxhdGUgYW5kIHVzZVxuICAvLyB0aGUgcGhhc2VzIHByb3Blcmx5LCBsaWtlIHdlIGRvIHdpdGggdGhlIFNpbXBsZUV2ZW50XG4gIC8vIHBsdWdpbi4gSG93ZXZlciwgdGhlIHBsdWdpbnMgYmVsb3cgZWl0aGVyIGV4cGVjdFxuICAvLyBlbXVsYXRpb24gKEVudGVyTGVhdmUpIG9yIHVzZSBzdGF0ZSBsb2NhbGl6ZWQgdG8gdGhhdFxuICAvLyBwbHVnaW4gKEJlZm9yZUlucHV0LCBDaGFuZ2UsIFNlbGVjdCkuIFRoZSBzdGF0ZSBpblxuICAvLyB0aGVzZSBtb2R1bGVzIGNvbXBsaWNhdGVzIHRoaW5ncywgYXMgeW91J2xsIGVzc2VudGlhbGx5XG4gIC8vIGdldCB0aGUgY2FzZSB3aGVyZSB0aGUgY2FwdHVyZSBwaGFzZSBldmVudCBtaWdodCBjaGFuZ2VcbiAgLy8gc3RhdGUsIG9ubHkgZm9yIHRoZSBmb2xsb3dpbmcgYnViYmxlIGV2ZW50IHRvIGNvbWUgaW5cbiAgLy8gbGF0ZXIgYW5kIG5vdCB0cmlnZ2VyIGFueXRoaW5nIGFzIHRoZSBzdGF0ZSBub3dcbiAgLy8gaW52YWxpZGF0ZXMgdGhlIGhldXJpc3RpY3Mgb2YgdGhlIGV2ZW50IHBsdWdpbi4gV2VcbiAgLy8gY291bGQgYWx0ZXIgYWxsIHRoZXNlIHBsdWdpbnMgdG8gd29yayBpbiBzdWNoIHdheXMsIGJ1dFxuICAvLyB0aGF0IG1pZ2h0IGNhdXNlIG90aGVyIHVua25vd24gc2lkZS1lZmZlY3RzIHRoYXQgd2VcbiAgLy8gY2FuJ3QgZm9yZXNlZSByaWdodCBub3cuXG5cbiAgaWYgKHNob3VsZFByb2Nlc3NQb2x5ZmlsbFBsdWdpbnMpIHtcbiAgICBleHRyYWN0RXZlbnRzJDIoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIGV4dHJhY3RFdmVudHMkMShkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgZXh0cmFjdEV2ZW50cyQzKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBleHRyYWN0RXZlbnRzKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgfVxufSAvLyBMaXN0IG9mIGV2ZW50cyB0aGF0IG5lZWQgdG8gYmUgaW5kaXZpZHVhbGx5IGF0dGFjaGVkIHRvIG1lZGlhIGVsZW1lbnRzLlxuXG5cbnZhciBtZWRpYUV2ZW50VHlwZXMgPSBbJ2Fib3J0JywgJ2NhbnBsYXknLCAnY2FucGxheXRocm91Z2gnLCAnZHVyYXRpb25jaGFuZ2UnLCAnZW1wdGllZCcsICdlbmNyeXB0ZWQnLCAnZW5kZWQnLCAnZXJyb3InLCAnbG9hZGVkZGF0YScsICdsb2FkZWRtZXRhZGF0YScsICdsb2Fkc3RhcnQnLCAncGF1c2UnLCAncGxheScsICdwbGF5aW5nJywgJ3Byb2dyZXNzJywgJ3JhdGVjaGFuZ2UnLCAncmVzaXplJywgJ3NlZWtlZCcsICdzZWVraW5nJywgJ3N0YWxsZWQnLCAnc3VzcGVuZCcsICd0aW1ldXBkYXRlJywgJ3ZvbHVtZWNoYW5nZScsICd3YWl0aW5nJ107IC8vIFdlIHNob3VsZCBub3QgZGVsZWdhdGUgdGhlc2UgZXZlbnRzIHRvIHRoZSBjb250YWluZXIsIGJ1dCByYXRoZXJcbi8vIHNldCB0aGVtIG9uIHRoZSBhY3R1YWwgdGFyZ2V0IGVsZW1lbnQgaXRzZWxmLiBUaGlzIGlzIHByaW1hcmlseVxuLy8gYmVjYXVzZSB0aGVzZSBldmVudHMgZG8gbm90IGNvbnNpc3RlbnRseSBidWJibGUgaW4gdGhlIERPTS5cblxudmFyIG5vbkRlbGVnYXRlZEV2ZW50cyA9IG5ldyBTZXQoWydjYW5jZWwnLCAnY2xvc2UnLCAnaW52YWxpZCcsICdsb2FkJywgJ3Njcm9sbCcsICd0b2dnbGUnXS5jb25jYXQobWVkaWFFdmVudFR5cGVzKSk7XG5cbmZ1bmN0aW9uIGV4ZWN1dGVEaXNwYXRjaChldmVudCwgbGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpIHtcbiAgdmFyIHR5cGUgPSBldmVudC50eXBlIHx8ICd1bmtub3duLWV2ZW50JztcbiAgZXZlbnQuY3VycmVudFRhcmdldCA9IGN1cnJlbnRUYXJnZXQ7XG4gIGludm9rZUd1YXJkZWRDYWxsYmFja0FuZENhdGNoRmlyc3RFcnJvcih0eXBlLCBsaXN0ZW5lciwgdW5kZWZpbmVkLCBldmVudCk7XG4gIGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzRGlzcGF0Y2hRdWV1ZUl0ZW1zSW5PcmRlcihldmVudCwgZGlzcGF0Y2hMaXN0ZW5lcnMsIGluQ2FwdHVyZVBoYXNlKSB7XG4gIHZhciBwcmV2aW91c0luc3RhbmNlO1xuXG4gIGlmIChpbkNhcHR1cmVQaGFzZSkge1xuICAgIGZvciAodmFyIGkgPSBkaXNwYXRjaExpc3RlbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIF9kaXNwYXRjaExpc3RlbmVycyRpID0gZGlzcGF0Y2hMaXN0ZW5lcnNbaV0sXG4gICAgICAgICAgaW5zdGFuY2UgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkaS5pbnN0YW5jZSxcbiAgICAgICAgICBjdXJyZW50VGFyZ2V0ID0gX2Rpc3BhdGNoTGlzdGVuZXJzJGkuY3VycmVudFRhcmdldCxcbiAgICAgICAgICBsaXN0ZW5lciA9IF9kaXNwYXRjaExpc3RlbmVycyRpLmxpc3RlbmVyO1xuXG4gICAgICBpZiAoaW5zdGFuY2UgIT09IHByZXZpb3VzSW5zdGFuY2UgJiYgZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGV4ZWN1dGVEaXNwYXRjaChldmVudCwgbGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpO1xuICAgICAgcHJldmlvdXNJbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZGlzcGF0Y2hMaXN0ZW5lcnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgX2Rpc3BhdGNoTGlzdGVuZXJzJF9pID0gZGlzcGF0Y2hMaXN0ZW5lcnNbX2ldLFxuICAgICAgICAgIF9pbnN0YW5jZSA9IF9kaXNwYXRjaExpc3RlbmVycyRfaS5pbnN0YW5jZSxcbiAgICAgICAgICBfY3VycmVudFRhcmdldCA9IF9kaXNwYXRjaExpc3RlbmVycyRfaS5jdXJyZW50VGFyZ2V0LFxuICAgICAgICAgIF9saXN0ZW5lciA9IF9kaXNwYXRjaExpc3RlbmVycyRfaS5saXN0ZW5lcjtcblxuICAgICAgaWYgKF9pbnN0YW5jZSAhPT0gcHJldmlvdXNJbnN0YW5jZSAmJiBldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZXhlY3V0ZURpc3BhdGNoKGV2ZW50LCBfbGlzdGVuZXIsIF9jdXJyZW50VGFyZ2V0KTtcbiAgICAgIHByZXZpb3VzSW5zdGFuY2UgPSBfaW5zdGFuY2U7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NEaXNwYXRjaFF1ZXVlKGRpc3BhdGNoUXVldWUsIGV2ZW50U3lzdGVtRmxhZ3MpIHtcbiAgdmFyIGluQ2FwdHVyZVBoYXNlID0gKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19DQVBUVVJFX1BIQVNFKSAhPT0gMDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGRpc3BhdGNoUXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgX2Rpc3BhdGNoUXVldWUkaSA9IGRpc3BhdGNoUXVldWVbaV0sXG4gICAgICAgIGV2ZW50ID0gX2Rpc3BhdGNoUXVldWUkaS5ldmVudCxcbiAgICAgICAgbGlzdGVuZXJzID0gX2Rpc3BhdGNoUXVldWUkaS5saXN0ZW5lcnM7XG4gICAgcHJvY2Vzc0Rpc3BhdGNoUXVldWVJdGVtc0luT3JkZXIoZXZlbnQsIGxpc3RlbmVycywgaW5DYXB0dXJlUGhhc2UpOyAvLyAgZXZlbnQgc3lzdGVtIGRvZXNuJ3QgdXNlIHBvb2xpbmcuXG4gIH0gLy8gVGhpcyB3b3VsZCBiZSBhIGdvb2QgdGltZSB0byByZXRocm93IGlmIGFueSBvZiB0aGUgZXZlbnQgaGFuZGxlcnMgdGhyZXcuXG5cblxuICByZXRocm93Q2F1Z2h0RXJyb3IoKTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hFdmVudHNGb3JQbHVnaW5zKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIHRhcmdldEluc3QsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgbmF0aXZlRXZlbnRUYXJnZXQgPSBnZXRFdmVudFRhcmdldChuYXRpdmVFdmVudCk7XG4gIHZhciBkaXNwYXRjaFF1ZXVlID0gW107XG4gIGV4dHJhY3RFdmVudHMkNShkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncyk7XG4gIHByb2Nlc3NEaXNwYXRjaFF1ZXVlKGRpc3BhdGNoUXVldWUsIGV2ZW50U3lzdGVtRmxhZ3MpO1xufVxuXG5mdW5jdGlvbiBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KGRvbUV2ZW50TmFtZSwgdGFyZ2V0RWxlbWVudCkge1xuICB7XG4gICAgaWYgKCFub25EZWxlZ2F0ZWRFdmVudHMuaGFzKGRvbUV2ZW50TmFtZSkpIHtcbiAgICAgIGVycm9yKCdEaWQgbm90IGV4cGVjdCBhIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoKSBjYWxsIGZvciBcIiVzXCIuICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZG9tRXZlbnROYW1lKTtcbiAgICB9XG4gIH1cblxuICB2YXIgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lciA9IGZhbHNlO1xuICB2YXIgbGlzdGVuZXJTZXQgPSBnZXRFdmVudExpc3RlbmVyU2V0KHRhcmdldEVsZW1lbnQpO1xuICB2YXIgbGlzdGVuZXJTZXRLZXkgPSBnZXRMaXN0ZW5lclNldEtleShkb21FdmVudE5hbWUsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpO1xuXG4gIGlmICghbGlzdGVuZXJTZXQuaGFzKGxpc3RlbmVyU2V0S2V5KSkge1xuICAgIGFkZFRyYXBwZWRFdmVudExpc3RlbmVyKHRhcmdldEVsZW1lbnQsIGRvbUV2ZW50TmFtZSwgSVNfTk9OX0RFTEVHQVRFRCwgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lcik7XG4gICAgbGlzdGVuZXJTZXQuYWRkKGxpc3RlbmVyU2V0S2V5KTtcbiAgfVxufVxuZnVuY3Rpb24gbGlzdGVuVG9OYXRpdmVFdmVudChkb21FdmVudE5hbWUsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIsIHRhcmdldCkge1xuICB7XG4gICAgaWYgKG5vbkRlbGVnYXRlZEV2ZW50cy5oYXMoZG9tRXZlbnROYW1lKSAmJiAhaXNDYXB0dXJlUGhhc2VMaXN0ZW5lcikge1xuICAgICAgZXJyb3IoJ0RpZCBub3QgZXhwZWN0IGEgbGlzdGVuVG9OYXRpdmVFdmVudCgpIGNhbGwgZm9yIFwiJXNcIiBpbiB0aGUgYnViYmxlIHBoYXNlLiAnICsgJ1RoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGRvbUV2ZW50TmFtZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGV2ZW50U3lzdGVtRmxhZ3MgPSAwO1xuXG4gIGlmIChpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKSB7XG4gICAgZXZlbnRTeXN0ZW1GbGFncyB8PSBJU19DQVBUVVJFX1BIQVNFO1xuICB9XG5cbiAgYWRkVHJhcHBlZEV2ZW50TGlzdGVuZXIodGFyZ2V0LCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpO1xufSAvLyBUaGlzIGlzIG9ubHkgdXNlZCBieSBjcmVhdGVFdmVudEhhbmRsZSB3aGVuIHRoZVxudmFyIGxpc3RlbmluZ01hcmtlciA9ICdfcmVhY3RMaXN0ZW5pbmcnICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMik7XG5mdW5jdGlvbiBsaXN0ZW5Ub0FsbFN1cHBvcnRlZEV2ZW50cyhyb290Q29udGFpbmVyRWxlbWVudCkge1xuICBpZiAoIXJvb3RDb250YWluZXJFbGVtZW50W2xpc3RlbmluZ01hcmtlcl0pIHtcbiAgICByb290Q29udGFpbmVyRWxlbWVudFtsaXN0ZW5pbmdNYXJrZXJdID0gdHJ1ZTtcbiAgICBhbGxOYXRpdmVFdmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZG9tRXZlbnROYW1lKSB7XG4gICAgICAvLyBXZSBoYW5kbGUgc2VsZWN0aW9uY2hhbmdlIHNlcGFyYXRlbHkgYmVjYXVzZSBpdFxuICAgICAgLy8gZG9lc24ndCBidWJibGUgYW5kIG5lZWRzIHRvIGJlIG9uIHRoZSBkb2N1bWVudC5cbiAgICAgIGlmIChkb21FdmVudE5hbWUgIT09ICdzZWxlY3Rpb25jaGFuZ2UnKSB7XG4gICAgICAgIGlmICghbm9uRGVsZWdhdGVkRXZlbnRzLmhhcyhkb21FdmVudE5hbWUpKSB7XG4gICAgICAgICAgbGlzdGVuVG9OYXRpdmVFdmVudChkb21FdmVudE5hbWUsIGZhbHNlLCByb290Q29udGFpbmVyRWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBsaXN0ZW5Ub05hdGl2ZUV2ZW50KGRvbUV2ZW50TmFtZSwgdHJ1ZSwgcm9vdENvbnRhaW5lckVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHZhciBvd25lckRvY3VtZW50ID0gcm9vdENvbnRhaW5lckVsZW1lbnQubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgPyByb290Q29udGFpbmVyRWxlbWVudCA6IHJvb3RDb250YWluZXJFbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG5cbiAgICBpZiAob3duZXJEb2N1bWVudCAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhlIHNlbGVjdGlvbmNoYW5nZSBldmVudCBhbHNvIG5lZWRzIGRlZHVwbGljYXRpb25cbiAgICAgIC8vIGJ1dCBpdCBpcyBhdHRhY2hlZCB0byB0aGUgZG9jdW1lbnQuXG4gICAgICBpZiAoIW93bmVyRG9jdW1lbnRbbGlzdGVuaW5nTWFya2VyXSkge1xuICAgICAgICBvd25lckRvY3VtZW50W2xpc3RlbmluZ01hcmtlcl0gPSB0cnVlO1xuICAgICAgICBsaXN0ZW5Ub05hdGl2ZUV2ZW50KCdzZWxlY3Rpb25jaGFuZ2UnLCBmYWxzZSwgb3duZXJEb2N1bWVudCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkZFRyYXBwZWRFdmVudExpc3RlbmVyKHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBpc0NhcHR1cmVQaGFzZUxpc3RlbmVyLCBpc0RlZmVycmVkTGlzdGVuZXJGb3JMZWdhY3lGQlN1cHBvcnQpIHtcbiAgdmFyIGxpc3RlbmVyID0gY3JlYXRlRXZlbnRMaXN0ZW5lcldyYXBwZXJXaXRoUHJpb3JpdHkodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MpOyAvLyBJZiBwYXNzaXZlIG9wdGlvbiBpcyBub3Qgc3VwcG9ydGVkLCB0aGVuIHRoZSBldmVudCB3aWxsIGJlXG4gIC8vIGFjdGl2ZSBhbmQgbm90IHBhc3NpdmUuXG5cbiAgdmFyIGlzUGFzc2l2ZUxpc3RlbmVyID0gdW5kZWZpbmVkO1xuXG4gIGlmIChwYXNzaXZlQnJvd3NlckV2ZW50c1N1cHBvcnRlZCkge1xuICAgIC8vIEJyb3dzZXJzIGludHJvZHVjZWQgYW4gaW50ZXJ2ZW50aW9uLCBtYWtpbmcgdGhlc2UgZXZlbnRzXG4gICAgLy8gcGFzc2l2ZSBieSBkZWZhdWx0IG9uIGRvY3VtZW50LiBSZWFjdCBkb2Vzbid0IGJpbmQgdGhlbVxuICAgIC8vIHRvIGRvY3VtZW50IGFueW1vcmUsIGJ1dCBjaGFuZ2luZyB0aGlzIG5vdyB3b3VsZCB1bmRvXG4gICAgLy8gdGhlIHBlcmZvcm1hbmNlIHdpbnMgZnJvbSB0aGUgY2hhbmdlLiBTbyB3ZSBlbXVsYXRlXG4gICAgLy8gdGhlIGV4aXN0aW5nIGJlaGF2aW9yIG1hbnVhbGx5IG9uIHRoZSByb290cyBub3cuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xOTY1MVxuICAgIGlmIChkb21FdmVudE5hbWUgPT09ICd0b3VjaHN0YXJ0JyB8fCBkb21FdmVudE5hbWUgPT09ICd0b3VjaG1vdmUnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ3doZWVsJykge1xuICAgICAgaXNQYXNzaXZlTGlzdGVuZXIgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHRhcmdldENvbnRhaW5lciA9ICB0YXJnZXRDb250YWluZXI7XG4gIHZhciB1bnN1YnNjcmliZUxpc3RlbmVyOyAvLyBXaGVuIGxlZ2FjeUZCU3VwcG9ydCBpcyBlbmFibGVkLCBpdCdzIGZvciB3aGVuIHdlXG5cblxuICBpZiAoaXNDYXB0dXJlUGhhc2VMaXN0ZW5lcikge1xuICAgIGlmIChpc1Bhc3NpdmVMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB1bnN1YnNjcmliZUxpc3RlbmVyID0gYWRkRXZlbnRDYXB0dXJlTGlzdGVuZXJXaXRoUGFzc2l2ZUZsYWcodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGxpc3RlbmVyLCBpc1Bhc3NpdmVMaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVuc3Vic2NyaWJlTGlzdGVuZXIgPSBhZGRFdmVudENhcHR1cmVMaXN0ZW5lcih0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoaXNQYXNzaXZlTGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdW5zdWJzY3JpYmVMaXN0ZW5lciA9IGFkZEV2ZW50QnViYmxlTGlzdGVuZXJXaXRoUGFzc2l2ZUZsYWcodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGxpc3RlbmVyLCBpc1Bhc3NpdmVMaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVuc3Vic2NyaWJlTGlzdGVuZXIgPSBhZGRFdmVudEJ1YmJsZUxpc3RlbmVyKHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzTWF0Y2hpbmdSb290Q29udGFpbmVyKGdyYW5kQ29udGFpbmVyLCB0YXJnZXRDb250YWluZXIpIHtcbiAgcmV0dXJuIGdyYW5kQ29udGFpbmVyID09PSB0YXJnZXRDb250YWluZXIgfHwgZ3JhbmRDb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSAmJiBncmFuZENvbnRhaW5lci5wYXJlbnROb2RlID09PSB0YXJnZXRDb250YWluZXI7XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnRGb3JQbHVnaW5FdmVudFN5c3RlbShkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIG5hdGl2ZUV2ZW50LCB0YXJnZXRJbnN0LCB0YXJnZXRDb250YWluZXIpIHtcbiAgdmFyIGFuY2VzdG9ySW5zdCA9IHRhcmdldEluc3Q7XG5cbiAgaWYgKChldmVudFN5c3RlbUZsYWdzICYgSVNfRVZFTlRfSEFORExFX05PTl9NQU5BR0VEX05PREUpID09PSAwICYmIChldmVudFN5c3RlbUZsYWdzICYgSVNfTk9OX0RFTEVHQVRFRCkgPT09IDApIHtcbiAgICB2YXIgdGFyZ2V0Q29udGFpbmVyTm9kZSA9IHRhcmdldENvbnRhaW5lcjsgLy8gSWYgd2UgYXJlIHVzaW5nIHRoZSBsZWdhY3kgRkIgc3VwcG9ydCBmbGFnLCB3ZVxuXG4gICAgaWYgKHRhcmdldEluc3QgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoZSBiZWxvdyBsb2dpYyBhdHRlbXB0cyB0byB3b3JrIG91dCBpZiB3ZSBuZWVkIHRvIGNoYW5nZVxuICAgICAgLy8gdGhlIHRhcmdldCBmaWJlciB0byBhIGRpZmZlcmVudCBhbmNlc3Rvci4gV2UgaGFkIHNpbWlsYXIgbG9naWNcbiAgICAgIC8vIGluIHRoZSBsZWdhY3kgZXZlbnQgc3lzdGVtLCBleGNlcHQgdGhlIGJpZyBkaWZmZXJlbmNlIGJldHdlZW5cbiAgICAgIC8vIHN5c3RlbXMgaXMgdGhhdCB0aGUgbW9kZXJuIGV2ZW50IHN5c3RlbSBub3cgaGFzIGFuIGV2ZW50IGxpc3RlbmVyXG4gICAgICAvLyBhdHRhY2hlZCB0byBlYWNoIFJlYWN0IFJvb3QgYW5kIFJlYWN0IFBvcnRhbCBSb290LiBUb2dldGhlcixcbiAgICAgIC8vIHRoZSBET00gbm9kZXMgcmVwcmVzZW50aW5nIHRoZXNlIHJvb3RzIGFyZSB0aGUgXCJyb290Q29udGFpbmVyXCIuXG4gICAgICAvLyBUbyBmaWd1cmUgb3V0IHdoaWNoIGFuY2VzdG9yIGluc3RhbmNlIHdlIHNob3VsZCB1c2UsIHdlIHRyYXZlcnNlXG4gICAgICAvLyB1cCB0aGUgZmliZXIgdHJlZSBmcm9tIHRoZSB0YXJnZXQgaW5zdGFuY2UgYW5kIGF0dGVtcHQgdG8gZmluZFxuICAgICAgLy8gcm9vdCBib3VuZGFyaWVzIHRoYXQgbWF0Y2ggdGhhdCBvZiBvdXIgY3VycmVudCBcInJvb3RDb250YWluZXJcIi5cbiAgICAgIC8vIElmIHdlIGZpbmQgdGhhdCBcInJvb3RDb250YWluZXJcIiwgd2UgZmluZCB0aGUgcGFyZW50IGZpYmVyXG4gICAgICAvLyBzdWItdHJlZSBmb3IgdGhhdCByb290IGFuZCBtYWtlIHRoYXQgb3VyIGFuY2VzdG9yIGluc3RhbmNlLlxuICAgICAgdmFyIG5vZGUgPSB0YXJnZXRJbnN0O1xuXG4gICAgICBtYWluTG9vcDogd2hpbGUgKHRydWUpIHtcbiAgICAgICAgaWYgKG5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbm9kZVRhZyA9IG5vZGUudGFnO1xuXG4gICAgICAgIGlmIChub2RlVGFnID09PSBIb3N0Um9vdCB8fCBub2RlVGFnID09PSBIb3N0UG9ydGFsKSB7XG4gICAgICAgICAgdmFyIGNvbnRhaW5lciA9IG5vZGUuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG5cbiAgICAgICAgICBpZiAoaXNNYXRjaGluZ1Jvb3RDb250YWluZXIoY29udGFpbmVyLCB0YXJnZXRDb250YWluZXJOb2RlKSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG5vZGVUYWcgPT09IEhvc3RQb3J0YWwpIHtcbiAgICAgICAgICAgIC8vIFRoZSB0YXJnZXQgaXMgYSBwb3J0YWwsIGJ1dCBpdCdzIG5vdCB0aGUgcm9vdENvbnRhaW5lciB3ZSdyZSBsb29raW5nIGZvci5cbiAgICAgICAgICAgIC8vIE5vcm1hbGx5IHBvcnRhbHMgaGFuZGxlIHRoZWlyIG93biBldmVudHMgYWxsIHRoZSB3YXkgZG93biB0byB0aGUgcm9vdC5cbiAgICAgICAgICAgIC8vIFNvIHdlIHNob3VsZCBiZSBhYmxlIHRvIHN0b3Agbm93LiBIb3dldmVyLCB3ZSBkb24ndCBrbm93IGlmIHRoaXMgcG9ydGFsXG4gICAgICAgICAgICAvLyB3YXMgcGFydCBvZiAqb3VyKiByb290LlxuICAgICAgICAgICAgdmFyIGdyYW5kTm9kZSA9IG5vZGUucmV0dXJuO1xuXG4gICAgICAgICAgICB3aGlsZSAoZ3JhbmROb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHZhciBncmFuZFRhZyA9IGdyYW5kTm9kZS50YWc7XG5cbiAgICAgICAgICAgICAgaWYgKGdyYW5kVGFnID09PSBIb3N0Um9vdCB8fCBncmFuZFRhZyA9PT0gSG9zdFBvcnRhbCkge1xuICAgICAgICAgICAgICAgIHZhciBncmFuZENvbnRhaW5lciA9IGdyYW5kTm9kZS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcblxuICAgICAgICAgICAgICAgIGlmIChpc01hdGNoaW5nUm9vdENvbnRhaW5lcihncmFuZENvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHJvb3RDb250YWluZXIgd2UncmUgbG9va2luZyBmb3IgYW5kIHdlIGZvdW5kIGl0IGFzXG4gICAgICAgICAgICAgICAgICAvLyBhIHBhcmVudCBvZiB0aGUgUG9ydGFsLiBUaGF0IG1lYW5zIHdlIGNhbiBpZ25vcmUgaXQgYmVjYXVzZSB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIFBvcnRhbCB3aWxsIGJ1YmJsZSB0aHJvdWdoIHRvIHVzLlxuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGdyYW5kTm9kZSA9IGdyYW5kTm9kZS5yZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSAvLyBOb3cgd2UgbmVlZCB0byBmaW5kIGl0J3MgY29ycmVzcG9uZGluZyBob3N0IGZpYmVyIGluIHRoZSBvdGhlclxuICAgICAgICAgIC8vIHRyZWUuIFRvIGRvIHRoaXMgd2UgY2FuIHVzZSBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSwgYnV0IHdlXG4gICAgICAgICAgLy8gbmVlZCB0byB2YWxpZGF0ZSB0aGF0IHRoZSBmaWJlciBpcyBhIGhvc3QgaW5zdGFuY2UsIG90aGVyd2lzZVxuICAgICAgICAgIC8vIHdlIG5lZWQgdG8gdHJhdmVyc2UgdXAgdGhyb3VnaCB0aGUgRE9NIHRpbGwgd2UgZmluZCB0aGUgY29ycmVjdFxuICAgICAgICAgIC8vIG5vZGUgdGhhdCBpcyBmcm9tIHRoZSBvdGhlciB0cmVlLlxuXG5cbiAgICAgICAgICB3aGlsZSAoY29udGFpbmVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgcGFyZW50Tm9kZSA9IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKGNvbnRhaW5lcik7XG5cbiAgICAgICAgICAgIGlmIChwYXJlbnROb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHBhcmVudFRhZyA9IHBhcmVudE5vZGUudGFnO1xuXG4gICAgICAgICAgICBpZiAocGFyZW50VGFnID09PSBIb3N0Q29tcG9uZW50IHx8IHBhcmVudFRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAgICAgICAgICAgbm9kZSA9IGFuY2VzdG9ySW5zdCA9IHBhcmVudE5vZGU7XG4gICAgICAgICAgICAgIGNvbnRpbnVlIG1haW5Mb29wO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIucGFyZW50Tm9kZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBkaXNwYXRjaEV2ZW50c0ZvclBsdWdpbnMoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBuYXRpdmVFdmVudCwgYW5jZXN0b3JJbnN0KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KSB7XG4gIHJldHVybiB7XG4gICAgaW5zdGFuY2U6IGluc3RhbmNlLFxuICAgIGxpc3RlbmVyOiBsaXN0ZW5lcixcbiAgICBjdXJyZW50VGFyZ2V0OiBjdXJyZW50VGFyZ2V0XG4gIH07XG59XG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGVTaW5nbGVQaGFzZUxpc3RlbmVycyh0YXJnZXRGaWJlciwgcmVhY3ROYW1lLCBuYXRpdmVFdmVudFR5cGUsIGluQ2FwdHVyZVBoYXNlLCBhY2N1bXVsYXRlVGFyZ2V0T25seSwgbmF0aXZlRXZlbnQpIHtcbiAgdmFyIGNhcHR1cmVOYW1lID0gcmVhY3ROYW1lICE9PSBudWxsID8gcmVhY3ROYW1lICsgJ0NhcHR1cmUnIDogbnVsbDtcbiAgdmFyIHJlYWN0RXZlbnROYW1lID0gaW5DYXB0dXJlUGhhc2UgPyBjYXB0dXJlTmFtZSA6IHJlYWN0TmFtZTtcbiAgdmFyIGxpc3RlbmVycyA9IFtdO1xuICB2YXIgaW5zdGFuY2UgPSB0YXJnZXRGaWJlcjtcbiAgdmFyIGxhc3RIb3N0Q29tcG9uZW50ID0gbnVsbDsgLy8gQWNjdW11bGF0ZSBhbGwgaW5zdGFuY2VzIGFuZCBsaXN0ZW5lcnMgdmlhIHRoZSB0YXJnZXQgLT4gcm9vdCBwYXRoLlxuXG4gIHdoaWxlIChpbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgIHZhciBfaW5zdGFuY2UyID0gaW5zdGFuY2UsXG4gICAgICAgIHN0YXRlTm9kZSA9IF9pbnN0YW5jZTIuc3RhdGVOb2RlLFxuICAgICAgICB0YWcgPSBfaW5zdGFuY2UyLnRhZzsgLy8gSGFuZGxlIGxpc3RlbmVycyB0aGF0IGFyZSBvbiBIb3N0Q29tcG9uZW50cyAoaS5lLiA8ZGl2PilcblxuICAgIGlmICh0YWcgPT09IEhvc3RDb21wb25lbnQgJiYgc3RhdGVOb2RlICE9PSBudWxsKSB7XG4gICAgICBsYXN0SG9zdENvbXBvbmVudCA9IHN0YXRlTm9kZTsgLy8gY3JlYXRlRXZlbnRIYW5kbGUgbGlzdGVuZXJzXG5cblxuICAgICAgaWYgKHJlYWN0RXZlbnROYW1lICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBsaXN0ZW5lciA9IGdldExpc3RlbmVyKGluc3RhbmNlLCByZWFjdEV2ZW50TmFtZSk7XG5cbiAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpIHtcbiAgICAgICAgICBsaXN0ZW5lcnMucHVzaChjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBsaXN0ZW5lciwgbGFzdEhvc3RDb21wb25lbnQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gSWYgd2UgYXJlIG9ubHkgYWNjdW11bGF0aW5nIGV2ZW50cyBmb3IgdGhlIHRhcmdldCwgdGhlbiB3ZSBkb24ndFxuICAgIC8vIGNvbnRpbnVlIHRvIHByb3BhZ2F0ZSB0aHJvdWdoIHRoZSBSZWFjdCBmaWJlciB0cmVlIHRvIGZpbmQgb3RoZXJcbiAgICAvLyBsaXN0ZW5lcnMuXG5cblxuICAgIGlmIChhY2N1bXVsYXRlVGFyZ2V0T25seSkge1xuICAgICAgYnJlYWs7XG4gICAgfSAvLyBJZiB3ZSBhcmUgcHJvY2Vzc2luZyB0aGUgb25CZWZvcmVCbHVyIGV2ZW50LCB0aGVuIHdlIG5lZWQgdG8gdGFrZVxuXG4gICAgaW5zdGFuY2UgPSBpbnN0YW5jZS5yZXR1cm47XG4gIH1cblxuICByZXR1cm4gbGlzdGVuZXJzO1xufSAvLyBXZSBzaG91bGQgb25seSB1c2UgdGhpcyBmdW5jdGlvbiBmb3I6XG4vLyAtIEJlZm9yZUlucHV0RXZlbnRQbHVnaW5cbi8vIC0gQ2hhbmdlRXZlbnRQbHVnaW5cbi8vIC0gU2VsZWN0RXZlbnRQbHVnaW5cbi8vIFRoaXMgaXMgYmVjYXVzZSB3ZSBvbmx5IHByb2Nlc3MgdGhlc2UgcGx1Z2luc1xuLy8gaW4gdGhlIGJ1YmJsZSBwaGFzZSwgc28gd2UgbmVlZCB0byBhY2N1bXVsYXRlIHR3b1xuLy8gcGhhc2UgZXZlbnQgbGlzdGVuZXJzICh2aWEgZW11bGF0aW9uKS5cblxuZnVuY3Rpb24gYWNjdW11bGF0ZVR3b1BoYXNlTGlzdGVuZXJzKHRhcmdldEZpYmVyLCByZWFjdE5hbWUpIHtcbiAgdmFyIGNhcHR1cmVOYW1lID0gcmVhY3ROYW1lICsgJ0NhcHR1cmUnO1xuICB2YXIgbGlzdGVuZXJzID0gW107XG4gIHZhciBpbnN0YW5jZSA9IHRhcmdldEZpYmVyOyAvLyBBY2N1bXVsYXRlIGFsbCBpbnN0YW5jZXMgYW5kIGxpc3RlbmVycyB2aWEgdGhlIHRhcmdldCAtPiByb290IHBhdGguXG5cbiAgd2hpbGUgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgdmFyIF9pbnN0YW5jZTMgPSBpbnN0YW5jZSxcbiAgICAgICAgc3RhdGVOb2RlID0gX2luc3RhbmNlMy5zdGF0ZU5vZGUsXG4gICAgICAgIHRhZyA9IF9pbnN0YW5jZTMudGFnOyAvLyBIYW5kbGUgbGlzdGVuZXJzIHRoYXQgYXJlIG9uIEhvc3RDb21wb25lbnRzIChpLmUuIDxkaXY+KVxuXG4gICAgaWYgKHRhZyA9PT0gSG9zdENvbXBvbmVudCAmJiBzdGF0ZU5vZGUgIT09IG51bGwpIHtcbiAgICAgIHZhciBjdXJyZW50VGFyZ2V0ID0gc3RhdGVOb2RlO1xuICAgICAgdmFyIGNhcHR1cmVMaXN0ZW5lciA9IGdldExpc3RlbmVyKGluc3RhbmNlLCBjYXB0dXJlTmFtZSk7XG5cbiAgICAgIGlmIChjYXB0dXJlTGlzdGVuZXIgIT0gbnVsbCkge1xuICAgICAgICBsaXN0ZW5lcnMudW5zaGlmdChjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBjYXB0dXJlTGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGJ1YmJsZUxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoaW5zdGFuY2UsIHJlYWN0TmFtZSk7XG5cbiAgICAgIGlmIChidWJibGVMaXN0ZW5lciAhPSBudWxsKSB7XG4gICAgICAgIGxpc3RlbmVycy5wdXNoKGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGJ1YmJsZUxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5zdGFuY2UgPSBpbnN0YW5jZS5yZXR1cm47XG4gIH1cblxuICByZXR1cm4gbGlzdGVuZXJzO1xufVxuXG5mdW5jdGlvbiBnZXRQYXJlbnQoaW5zdCkge1xuICBpZiAoaW5zdCA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZG8ge1xuICAgIGluc3QgPSBpbnN0LnJldHVybjsgLy8gVE9ETzogSWYgdGhpcyBpcyBhIEhvc3RSb290IHdlIG1pZ2h0IHdhbnQgdG8gYmFpbCBvdXQuXG4gICAgLy8gVGhhdCBpcyBkZXBlbmRpbmcgb24gaWYgd2Ugd2FudCBuZXN0ZWQgc3VidHJlZXMgKGxheWVycykgdG8gYnViYmxlXG4gICAgLy8gZXZlbnRzIHRvIHRoZWlyIHBhcmVudC4gV2UgY291bGQgYWxzbyBnbyB0aHJvdWdoIHBhcmVudE5vZGUgb24gdGhlXG4gICAgLy8gaG9zdCBub2RlIGJ1dCB0aGF0IHdvdWxkbid0IHdvcmsgZm9yIFJlYWN0IE5hdGl2ZSBhbmQgZG9lc24ndCBsZXQgdXNcbiAgICAvLyBkbyB0aGUgcG9ydGFsIGZlYXR1cmUuXG4gIH0gd2hpbGUgKGluc3QgJiYgaW5zdC50YWcgIT09IEhvc3RDb21wb25lbnQpO1xuXG4gIGlmIChpbnN0KSB7XG4gICAgcmV0dXJuIGluc3Q7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogUmV0dXJuIHRoZSBsb3dlc3QgY29tbW9uIGFuY2VzdG9yIG9mIEEgYW5kIEIsIG9yIG51bGwgaWYgdGhleSBhcmUgaW5cbiAqIGRpZmZlcmVudCB0cmVlcy5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldExvd2VzdENvbW1vbkFuY2VzdG9yKGluc3RBLCBpbnN0Qikge1xuICB2YXIgbm9kZUEgPSBpbnN0QTtcbiAgdmFyIG5vZGVCID0gaW5zdEI7XG4gIHZhciBkZXB0aEEgPSAwO1xuXG4gIGZvciAodmFyIHRlbXBBID0gbm9kZUE7IHRlbXBBOyB0ZW1wQSA9IGdldFBhcmVudCh0ZW1wQSkpIHtcbiAgICBkZXB0aEErKztcbiAgfVxuXG4gIHZhciBkZXB0aEIgPSAwO1xuXG4gIGZvciAodmFyIHRlbXBCID0gbm9kZUI7IHRlbXBCOyB0ZW1wQiA9IGdldFBhcmVudCh0ZW1wQikpIHtcbiAgICBkZXB0aEIrKztcbiAgfSAvLyBJZiBBIGlzIGRlZXBlciwgY3Jhd2wgdXAuXG5cblxuICB3aGlsZSAoZGVwdGhBIC0gZGVwdGhCID4gMCkge1xuICAgIG5vZGVBID0gZ2V0UGFyZW50KG5vZGVBKTtcbiAgICBkZXB0aEEtLTtcbiAgfSAvLyBJZiBCIGlzIGRlZXBlciwgY3Jhd2wgdXAuXG5cblxuICB3aGlsZSAoZGVwdGhCIC0gZGVwdGhBID4gMCkge1xuICAgIG5vZGVCID0gZ2V0UGFyZW50KG5vZGVCKTtcbiAgICBkZXB0aEItLTtcbiAgfSAvLyBXYWxrIGluIGxvY2tzdGVwIHVudGlsIHdlIGZpbmQgYSBtYXRjaC5cblxuXG4gIHZhciBkZXB0aCA9IGRlcHRoQTtcblxuICB3aGlsZSAoZGVwdGgtLSkge1xuICAgIGlmIChub2RlQSA9PT0gbm9kZUIgfHwgbm9kZUIgIT09IG51bGwgJiYgbm9kZUEgPT09IG5vZGVCLmFsdGVybmF0ZSkge1xuICAgICAgcmV0dXJuIG5vZGVBO1xuICAgIH1cblxuICAgIG5vZGVBID0gZ2V0UGFyZW50KG5vZGVBKTtcbiAgICBub2RlQiA9IGdldFBhcmVudChub2RlQik7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gYWNjdW11bGF0ZUVudGVyTGVhdmVMaXN0ZW5lcnNGb3JFdmVudChkaXNwYXRjaFF1ZXVlLCBldmVudCwgdGFyZ2V0LCBjb21tb24sIGluQ2FwdHVyZVBoYXNlKSB7XG4gIHZhciByZWdpc3RyYXRpb25OYW1lID0gZXZlbnQuX3JlYWN0TmFtZTtcbiAgdmFyIGxpc3RlbmVycyA9IFtdO1xuICB2YXIgaW5zdGFuY2UgPSB0YXJnZXQ7XG5cbiAgd2hpbGUgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgaWYgKGluc3RhbmNlID09PSBjb21tb24pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBfaW5zdGFuY2U0ID0gaW5zdGFuY2UsXG4gICAgICAgIGFsdGVybmF0ZSA9IF9pbnN0YW5jZTQuYWx0ZXJuYXRlLFxuICAgICAgICBzdGF0ZU5vZGUgPSBfaW5zdGFuY2U0LnN0YXRlTm9kZSxcbiAgICAgICAgdGFnID0gX2luc3RhbmNlNC50YWc7XG5cbiAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsICYmIGFsdGVybmF0ZSA9PT0gY29tbW9uKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSBIb3N0Q29tcG9uZW50ICYmIHN0YXRlTm9kZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIGN1cnJlbnRUYXJnZXQgPSBzdGF0ZU5vZGU7XG5cbiAgICAgIGlmIChpbkNhcHR1cmVQaGFzZSkge1xuICAgICAgICB2YXIgY2FwdHVyZUxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoaW5zdGFuY2UsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuXG4gICAgICAgIGlmIChjYXB0dXJlTGlzdGVuZXIgIT0gbnVsbCkge1xuICAgICAgICAgIGxpc3RlbmVycy51bnNoaWZ0KGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGNhcHR1cmVMaXN0ZW5lciwgY3VycmVudFRhcmdldCkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFpbkNhcHR1cmVQaGFzZSkge1xuICAgICAgICB2YXIgYnViYmxlTGlzdGVuZXIgPSBnZXRMaXN0ZW5lcihpbnN0YW5jZSwgcmVnaXN0cmF0aW9uTmFtZSk7XG5cbiAgICAgICAgaWYgKGJ1YmJsZUxpc3RlbmVyICE9IG51bGwpIHtcbiAgICAgICAgICBsaXN0ZW5lcnMucHVzaChjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBidWJibGVMaXN0ZW5lciwgY3VycmVudFRhcmdldCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5zdGFuY2UgPSBpbnN0YW5jZS5yZXR1cm47XG4gIH1cblxuICBpZiAobGlzdGVuZXJzLmxlbmd0aCAhPT0gMCkge1xuICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICBldmVudDogZXZlbnQsXG4gICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVyc1xuICAgIH0pO1xuICB9XG59IC8vIFdlIHNob3VsZCBvbmx5IHVzZSB0aGlzIGZ1bmN0aW9uIGZvcjpcbi8vIC0gRW50ZXJMZWF2ZUV2ZW50UGx1Z2luXG4vLyBUaGlzIGlzIGJlY2F1c2Ugd2Ugb25seSBwcm9jZXNzIHRoaXMgcGx1Z2luXG4vLyBpbiB0aGUgYnViYmxlIHBoYXNlLCBzbyB3ZSBuZWVkIHRvIGFjY3VtdWxhdGUgdHdvXG4vLyBwaGFzZSBldmVudCBsaXN0ZW5lcnMuXG5cblxuZnVuY3Rpb24gYWNjdW11bGF0ZUVudGVyTGVhdmVUd29QaGFzZUxpc3RlbmVycyhkaXNwYXRjaFF1ZXVlLCBsZWF2ZUV2ZW50LCBlbnRlckV2ZW50LCBmcm9tLCB0bykge1xuICB2YXIgY29tbW9uID0gZnJvbSAmJiB0byA/IGdldExvd2VzdENvbW1vbkFuY2VzdG9yKGZyb20sIHRvKSA6IG51bGw7XG5cbiAgaWYgKGZyb20gIT09IG51bGwpIHtcbiAgICBhY2N1bXVsYXRlRW50ZXJMZWF2ZUxpc3RlbmVyc0ZvckV2ZW50KGRpc3BhdGNoUXVldWUsIGxlYXZlRXZlbnQsIGZyb20sIGNvbW1vbiwgZmFsc2UpO1xuICB9XG5cbiAgaWYgKHRvICE9PSBudWxsICYmIGVudGVyRXZlbnQgIT09IG51bGwpIHtcbiAgICBhY2N1bXVsYXRlRW50ZXJMZWF2ZUxpc3RlbmVyc0ZvckV2ZW50KGRpc3BhdGNoUXVldWUsIGVudGVyRXZlbnQsIHRvLCBjb21tb24sIHRydWUpO1xuICB9XG59XG5mdW5jdGlvbiBnZXRMaXN0ZW5lclNldEtleShkb21FdmVudE5hbWUsIGNhcHR1cmUpIHtcbiAgcmV0dXJuIGRvbUV2ZW50TmFtZSArIFwiX19cIiArIChjYXB0dXJlID8gJ2NhcHR1cmUnIDogJ2J1YmJsZScpO1xufVxuXG52YXIgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSBmYWxzZTtcbnZhciBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCA9ICdkYW5nZXJvdXNseVNldElubmVySFRNTCc7XG52YXIgU1VQUFJFU1NfQ09OVEVOVF9FRElUQUJMRV9XQVJOSU5HID0gJ3N1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyc7XG52YXIgU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcgPSAnc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJztcbnZhciBBVVRPRk9DVVMgPSAnYXV0b0ZvY3VzJztcbnZhciBDSElMRFJFTiA9ICdjaGlsZHJlbic7XG52YXIgU1RZTEUgPSAnc3R5bGUnO1xudmFyIEhUTUwkMSA9ICdfX2h0bWwnO1xudmFyIHdhcm5lZFVua25vd25UYWdzO1xudmFyIHZhbGlkYXRlUHJvcGVydGllc0luRGV2ZWxvcG1lbnQ7XG52YXIgd2FybkZvclByb3BEaWZmZXJlbmNlO1xudmFyIHdhcm5Gb3JFeHRyYUF0dHJpYnV0ZXM7XG52YXIgd2FybkZvckludmFsaWRFdmVudExpc3RlbmVyO1xudmFyIGNhbkRpZmZTdHlsZUZvckh5ZHJhdGlvbldhcm5pbmc7XG52YXIgbm9ybWFsaXplSFRNTDtcblxue1xuICB3YXJuZWRVbmtub3duVGFncyA9IHtcbiAgICAvLyBUaGVyZSBhcmUgd29ya2luZyBwb2x5ZmlsbHMgZm9yIDxkaWFsb2c+LiBMZXQgcGVvcGxlIHVzZSBpdC5cbiAgICBkaWFsb2c6IHRydWUsXG4gICAgLy8gRWxlY3Ryb24gc2hpcHMgYSBjdXN0b20gPHdlYnZpZXc+IHRhZyB0byBkaXNwbGF5IGV4dGVybmFsIHdlYiBjb250ZW50IGluXG4gICAgLy8gYW4gaXNvbGF0ZWQgZnJhbWUgYW5kIHByb2Nlc3MuXG4gICAgLy8gVGhpcyB0YWcgaXMgbm90IHByZXNlbnQgaW4gbm9uIEVsZWN0cm9uIGVudmlyb25tZW50cyBzdWNoIGFzIEpTRG9tIHdoaWNoXG4gICAgLy8gaXMgb2Z0ZW4gdXNlZCBmb3IgdGVzdGluZyBwdXJwb3Nlcy5cbiAgICAvLyBAc2VlIGh0dHBzOi8vZWxlY3Ryb25qcy5vcmcvZG9jcy9hcGkvd2Vidmlldy10YWdcbiAgICB3ZWJ2aWV3OiB0cnVlXG4gIH07XG5cbiAgdmFsaWRhdGVQcm9wZXJ0aWVzSW5EZXZlbG9wbWVudCA9IGZ1bmN0aW9uICh0eXBlLCBwcm9wcykge1xuICAgIHZhbGlkYXRlUHJvcGVydGllcyh0eXBlLCBwcm9wcyk7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzJDEodHlwZSwgcHJvcHMpO1xuICAgIHZhbGlkYXRlUHJvcGVydGllcyQyKHR5cGUsIHByb3BzLCB7XG4gICAgICByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzOiByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLFxuICAgICAgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lczogcG9zc2libGVSZWdpc3RyYXRpb25OYW1lc1xuICAgIH0pO1xuICB9OyAvLyBJRSAxMSBwYXJzZXMgJiBub3JtYWxpemVzIHRoZSBzdHlsZSBhdHRyaWJ1dGUgYXMgb3Bwb3NlZCB0byBvdGhlclxuICAvLyBicm93c2Vycy4gSXQgYWRkcyBzcGFjZXMgYW5kIHNvcnRzIHRoZSBwcm9wZXJ0aWVzIGluIHNvbWVcbiAgLy8gbm9uLWFscGhhYmV0aWNhbCBvcmRlci4gSGFuZGxpbmcgdGhhdCB3b3VsZCByZXF1aXJlIHNvcnRpbmcgQ1NTXG4gIC8vIHByb3BlcnRpZXMgaW4gdGhlIGNsaWVudCAmIHNlcnZlciB2ZXJzaW9ucyBvciBhcHBseWluZ1xuICAvLyBgZXhwZWN0ZWRTdHlsZWAgdG8gYSB0ZW1wb3JhcnkgRE9NIG5vZGUgdG8gcmVhZCBpdHMgYHN0eWxlYCBhdHRyaWJ1dGVcbiAgLy8gbm9ybWFsaXplZC4gU2luY2UgaXQgb25seSBhZmZlY3RzIElFLCB3ZSdyZSBza2lwcGluZyBzdHlsZSB3YXJuaW5nc1xuICAvLyBpbiB0aGF0IGJyb3dzZXIgY29tcGxldGVseSBpbiBmYXZvciBvZiBkb2luZyBhbGwgdGhhdCB3b3JrLlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMTgwN1xuXG5cbiAgY2FuRGlmZlN0eWxlRm9ySHlkcmF0aW9uV2FybmluZyA9IGNhblVzZURPTSAmJiAhZG9jdW1lbnQuZG9jdW1lbnRNb2RlO1xuXG4gIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZSA9IGZ1bmN0aW9uIChwcm9wTmFtZSwgc2VydmVyVmFsdWUsIGNsaWVudFZhbHVlKSB7XG4gICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG5vcm1hbGl6ZWRDbGllbnRWYWx1ZSA9IG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShjbGllbnRWYWx1ZSk7XG4gICAgdmFyIG5vcm1hbGl6ZWRTZXJ2ZXJWYWx1ZSA9IG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShzZXJ2ZXJWYWx1ZSk7XG5cbiAgICBpZiAobm9ybWFsaXplZFNlcnZlclZhbHVlID09PSBub3JtYWxpemVkQ2xpZW50VmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG5cbiAgICBlcnJvcignUHJvcCBgJXNgIGRpZCBub3QgbWF0Y2guIFNlcnZlcjogJXMgQ2xpZW50OiAlcycsIHByb3BOYW1lLCBKU09OLnN0cmluZ2lmeShub3JtYWxpemVkU2VydmVyVmFsdWUpLCBKU09OLnN0cmluZ2lmeShub3JtYWxpemVkQ2xpZW50VmFsdWUpKTtcbiAgfTtcblxuICB3YXJuRm9yRXh0cmFBdHRyaWJ1dGVzID0gZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWVzKSB7XG4gICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuICAgIHZhciBuYW1lcyA9IFtdO1xuICAgIGF0dHJpYnV0ZU5hbWVzLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIG5hbWVzLnB1c2gobmFtZSk7XG4gICAgfSk7XG5cbiAgICBlcnJvcignRXh0cmEgYXR0cmlidXRlcyBmcm9tIHRoZSBzZXJ2ZXI6ICVzJywgbmFtZXMpO1xuICB9O1xuXG4gIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uIChyZWdpc3RyYXRpb25OYW1lLCBsaXN0ZW5lcikge1xuICAgIGlmIChsaXN0ZW5lciA9PT0gZmFsc2UpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCBgJXNgIGxpc3RlbmVyIHRvIGJlIGEgZnVuY3Rpb24sIGluc3RlYWQgZ290IGBmYWxzZWAuXFxuXFxuJyArICdJZiB5b3UgdXNlZCB0byBjb25kaXRpb25hbGx5IG9taXQgaXQgd2l0aCAlcz17Y29uZGl0aW9uICYmIHZhbHVlfSwgJyArICdwYXNzICVzPXtjb25kaXRpb24gPyB2YWx1ZSA6IHVuZGVmaW5lZH0gaW5zdGVhZC4nLCByZWdpc3RyYXRpb25OYW1lLCByZWdpc3RyYXRpb25OYW1lLCByZWdpc3RyYXRpb25OYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIGAlc2AgbGlzdGVuZXIgdG8gYmUgYSBmdW5jdGlvbiwgaW5zdGVhZCBnb3QgYSB2YWx1ZSBvZiBgJXNgIHR5cGUuJywgcmVnaXN0cmF0aW9uTmFtZSwgdHlwZW9mIGxpc3RlbmVyKTtcbiAgICB9XG4gIH07IC8vIFBhcnNlIHRoZSBIVE1MIGFuZCByZWFkIGl0IGJhY2sgdG8gbm9ybWFsaXplIHRoZSBIVE1MIHN0cmluZyBzbyB0aGF0IGl0XG4gIC8vIGNhbiBiZSB1c2VkIGZvciBjb21wYXJpc29uLlxuXG5cbiAgbm9ybWFsaXplSFRNTCA9IGZ1bmN0aW9uIChwYXJlbnQsIGh0bWwpIHtcbiAgICAvLyBXZSBjb3VsZCBoYXZlIGNyZWF0ZWQgYSBzZXBhcmF0ZSBkb2N1bWVudCBoZXJlIHRvIGF2b2lkXG4gICAgLy8gcmUtaW5pdGlhbGl6aW5nIGN1c3RvbSBlbGVtZW50cyBpZiB0aGV5IGV4aXN0LiBCdXQgdGhpcyBicmVha3NcbiAgICAvLyBob3cgPG5vc2NyaXB0PiBpcyBiZWluZyBoYW5kbGVkLiBTbyB3ZSB1c2UgdGhlIHNhbWUgZG9jdW1lbnQuXG4gICAgLy8gU2VlIHRoZSBkaXNjdXNzaW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzExMTU3LlxuICAgIHZhciB0ZXN0RWxlbWVudCA9IHBhcmVudC5uYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFID8gcGFyZW50Lm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudChwYXJlbnQudGFnTmFtZSkgOiBwYXJlbnQub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMocGFyZW50Lm5hbWVzcGFjZVVSSSwgcGFyZW50LnRhZ05hbWUpO1xuICAgIHRlc3RFbGVtZW50LmlubmVySFRNTCA9IGh0bWw7XG4gICAgcmV0dXJuIHRlc3RFbGVtZW50LmlubmVySFRNTDtcbiAgfTtcbn0gLy8gSFRNTCBwYXJzaW5nIG5vcm1hbGl6ZXMgQ1IgYW5kIENSTEYgdG8gTEYuXG4vLyBJdCBhbHNvIGNhbiB0dXJuIFxcdTAwMDAgaW50byBcXHVGRkZEIGluc2lkZSBhdHRyaWJ1dGVzLlxuLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L3NpbmdsZS1wYWdlLmh0bWwjcHJlcHJvY2Vzc2luZy10aGUtaW5wdXQtc3RyZWFtXG4vLyBJZiB3ZSBoYXZlIGEgbWlzbWF0Y2gsIGl0IG1pZ2h0IGJlIGNhdXNlZCBieSB0aGF0LlxuLy8gV2Ugd2lsbCBzdGlsbCBwYXRjaCB1cCBpbiB0aGlzIGNhc2UgYnV0IG5vdCBmaXJlIHRoZSB3YXJuaW5nLlxuXG5cbnZhciBOT1JNQUxJWkVfTkVXTElORVNfUkVHRVggPSAvXFxyXFxuPy9nO1xudmFyIE5PUk1BTElaRV9OVUxMX0FORF9SRVBMQUNFTUVOVF9SRUdFWCA9IC9cXHUwMDAwfFxcdUZGRkQvZztcblxuZnVuY3Rpb24gbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlKG1hcmt1cCkge1xuICB7XG4gICAgY2hlY2tIdG1sU3RyaW5nQ29lcmNpb24obWFya3VwKTtcbiAgfVxuXG4gIHZhciBtYXJrdXBTdHJpbmcgPSB0eXBlb2YgbWFya3VwID09PSAnc3RyaW5nJyA/IG1hcmt1cCA6ICcnICsgbWFya3VwO1xuICByZXR1cm4gbWFya3VwU3RyaW5nLnJlcGxhY2UoTk9STUFMSVpFX05FV0xJTkVTX1JFR0VYLCAnXFxuJykucmVwbGFjZShOT1JNQUxJWkVfTlVMTF9BTkRfUkVQTEFDRU1FTlRfUkVHRVgsICcnKTtcbn1cblxuZnVuY3Rpb24gY2hlY2tGb3JVbm1hdGNoZWRUZXh0KHNlcnZlclRleHQsIGNsaWVudFRleHQsIGlzQ29uY3VycmVudE1vZGUsIHNob3VsZFdhcm5EZXYpIHtcbiAgdmFyIG5vcm1hbGl6ZWRDbGllbnRUZXh0ID0gbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlKGNsaWVudFRleHQpO1xuICB2YXIgbm9ybWFsaXplZFNlcnZlclRleHQgPSBub3JtYWxpemVNYXJrdXBGb3JUZXh0T3JBdHRyaWJ1dGUoc2VydmVyVGV4dCk7XG5cbiAgaWYgKG5vcm1hbGl6ZWRTZXJ2ZXJUZXh0ID09PSBub3JtYWxpemVkQ2xpZW50VGV4dCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChzaG91bGRXYXJuRGV2KSB7XG4gICAge1xuICAgICAgaWYgKCFkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJ1RleHQgY29udGVudCBkaWQgbm90IG1hdGNoLiBTZXJ2ZXI6IFwiJXNcIiBDbGllbnQ6IFwiJXNcIicsIG5vcm1hbGl6ZWRTZXJ2ZXJUZXh0LCBub3JtYWxpemVkQ2xpZW50VGV4dCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGlzQ29uY3VycmVudE1vZGUgJiYgZW5hYmxlQ2xpZW50UmVuZGVyRmFsbGJhY2tPblRleHRNaXNtYXRjaCkge1xuICAgIC8vIEluIGNvbmN1cnJlbnQgcm9vdHMsIHdlIHRocm93IHdoZW4gdGhlcmUncyBhIHRleHQgbWlzbWF0Y2ggYW5kIHJldmVydCB0b1xuICAgIC8vIGNsaWVudCByZW5kZXJpbmcsIHVwIHRvIHRoZSBuZWFyZXN0IFN1c3BlbnNlIGJvdW5kYXJ5LlxuICAgIHRocm93IG5ldyBFcnJvcignVGV4dCBjb250ZW50IGRvZXMgbm90IG1hdGNoIHNlcnZlci1yZW5kZXJlZCBIVE1MLicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldE93bmVyRG9jdW1lbnRGcm9tUm9vdENvbnRhaW5lcihyb290Q29udGFpbmVyRWxlbWVudCkge1xuICByZXR1cm4gcm9vdENvbnRhaW5lckVsZW1lbnQubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgPyByb290Q29udGFpbmVyRWxlbWVudCA6IHJvb3RDb250YWluZXJFbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG59XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5mdW5jdGlvbiB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChub2RlKSB7XG4gIC8vIE1vYmlsZSBTYWZhcmkgZG9lcyBub3QgZmlyZSBwcm9wZXJseSBidWJibGUgY2xpY2sgZXZlbnRzIG9uXG4gIC8vIG5vbi1pbnRlcmFjdGl2ZSBlbGVtZW50cywgd2hpY2ggbWVhbnMgZGVsZWdhdGVkIGNsaWNrIGxpc3RlbmVycyBkbyBub3RcbiAgLy8gZmlyZS4gVGhlIHdvcmthcm91bmQgZm9yIHRoaXMgYnVnIGludm9sdmVzIGF0dGFjaGluZyBhbiBlbXB0eSBjbGlja1xuICAvLyBsaXN0ZW5lciBvbiB0aGUgdGFyZ2V0IG5vZGUuXG4gIC8vIGh0dHBzOi8vd3d3LnF1aXJrc21vZGUub3JnL2Jsb2cvYXJjaGl2ZXMvMjAxMC8wOS9jbGlja19ldmVudF9kZWwuaHRtbFxuICAvLyBKdXN0IHNldCBpdCB1c2luZyB0aGUgb25jbGljayBwcm9wZXJ0eSBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gbWFuYWdlIGFueVxuICAvLyBib29ra2VlcGluZyBmb3IgaXQuIE5vdCBzdXJlIGlmIHdlIG5lZWQgdG8gY2xlYXIgaXQgd2hlbiB0aGUgbGlzdGVuZXIgaXNcbiAgLy8gcmVtb3ZlZC5cbiAgLy8gVE9ETzogT25seSBkbyB0aGlzIGZvciB0aGUgcmVsZXZhbnQgU2FmYXJpcyBtYXliZT9cbiAgbm9kZS5vbmNsaWNrID0gbm9vcDtcbn1cblxuZnVuY3Rpb24gc2V0SW5pdGlhbERPTVByb3BlcnRpZXModGFnLCBkb21FbGVtZW50LCByb290Q29udGFpbmVyRWxlbWVudCwgbmV4dFByb3BzLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICBmb3IgKHZhciBwcm9wS2V5IGluIG5leHRQcm9wcykge1xuICAgIGlmICghbmV4dFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgbmV4dFByb3AgPSBuZXh0UHJvcHNbcHJvcEtleV07XG5cbiAgICBpZiAocHJvcEtleSA9PT0gU1RZTEUpIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKG5leHRQcm9wKSB7XG4gICAgICAgICAgLy8gRnJlZXplIHRoZSBuZXh0IHN0eWxlIG9iamVjdCBzbyB0aGF0IHdlIGNhbiBhc3N1bWUgaXQgd29uJ3QgYmVcbiAgICAgICAgICAvLyBtdXRhdGVkLiBXZSBoYXZlIGFscmVhZHkgd2FybmVkIGZvciB0aGlzIGluIHRoZSBwYXN0LlxuICAgICAgICAgIE9iamVjdC5mcmVlemUobmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9IC8vIFJlbGllcyBvbiBgdXBkYXRlU3R5bGVzQnlJRGAgbm90IG11dGF0aW5nIGBzdHlsZVVwZGF0ZXNgLlxuXG5cbiAgICAgIHNldFZhbHVlRm9yU3R5bGVzKGRvbUVsZW1lbnQsIG5leHRQcm9wKTtcbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MKSB7XG4gICAgICB2YXIgbmV4dEh0bWwgPSBuZXh0UHJvcCA/IG5leHRQcm9wW0hUTUwkMV0gOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChuZXh0SHRtbCAhPSBudWxsKSB7XG4gICAgICAgIHNldElubmVySFRNTChkb21FbGVtZW50LCBuZXh0SHRtbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBDSElMRFJFTikge1xuICAgICAgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gQXZvaWQgc2V0dGluZyBpbml0aWFsIHRleHRDb250ZW50IHdoZW4gdGhlIHRleHQgaXMgZW1wdHkuIEluIElFMTEgc2V0dGluZ1xuICAgICAgICAvLyB0ZXh0Q29udGVudCBvbiBhIDx0ZXh0YXJlYT4gd2lsbCBjYXVzZSB0aGUgcGxhY2Vob2xkZXIgdG8gbm90XG4gICAgICAgIC8vIHNob3cgd2l0aGluIHRoZSA8dGV4dGFyZWE+IHVudGlsIGl0IGhhcyBiZWVuIGZvY3VzZWQgYW5kIGJsdXJyZWQgYWdhaW4uXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNjczMSNpc3N1ZWNvbW1lbnQtMjU0ODc0NTUzXG4gICAgICAgIHZhciBjYW5TZXRUZXh0Q29udGVudCA9IHRhZyAhPT0gJ3RleHRhcmVhJyB8fCBuZXh0UHJvcCAhPT0gJyc7XG5cbiAgICAgICAgaWYgKGNhblNldFRleHRDb250ZW50KSB7XG4gICAgICAgICAgc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCwgbmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCwgJycgKyBuZXh0UHJvcCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgfHwgcHJvcEtleSA9PT0gU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcpIDsgZWxzZSBpZiAocHJvcEtleSA9PT0gQVVUT0ZPQ1VTKSA7IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGlmIChuZXh0UHJvcCAhPSBudWxsKSB7XG4gICAgICAgIGlmICggdHlwZW9mIG5leHRQcm9wICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgd2FybkZvckludmFsaWRFdmVudExpc3RlbmVyKHByb3BLZXksIG5leHRQcm9wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wS2V5ID09PSAnb25TY3JvbGwnKSB7XG4gICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnc2Nyb2xsJywgZG9tRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5leHRQcm9wICE9IG51bGwpIHtcbiAgICAgIHNldFZhbHVlRm9yUHJvcGVydHkoZG9tRWxlbWVudCwgcHJvcEtleSwgbmV4dFByb3AsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlRE9NUHJvcGVydGllcyhkb21FbGVtZW50LCB1cGRhdGVQYXlsb2FkLCB3YXNDdXN0b21Db21wb25lbnRUYWcsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIC8vIFRPRE86IEhhbmRsZSB3YXNDdXN0b21Db21wb25lbnRUYWdcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB1cGRhdGVQYXlsb2FkLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgdmFyIHByb3BLZXkgPSB1cGRhdGVQYXlsb2FkW2ldO1xuICAgIHZhciBwcm9wVmFsdWUgPSB1cGRhdGVQYXlsb2FkW2kgKyAxXTtcblxuICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAgc2V0VmFsdWVGb3JTdHlsZXMoZG9tRWxlbWVudCwgcHJvcFZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MKSB7XG4gICAgICBzZXRJbm5lckhUTUwoZG9tRWxlbWVudCwgcHJvcFZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IENISUxEUkVOKSB7XG4gICAgICBzZXRUZXh0Q29udGVudChkb21FbGVtZW50LCBwcm9wVmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRWYWx1ZUZvclByb3BlcnR5KGRvbUVsZW1lbnQsIHByb3BLZXksIHByb3BWYWx1ZSwgaXNDdXN0b21Db21wb25lbnRUYWcpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KHR5cGUsIHByb3BzLCByb290Q29udGFpbmVyRWxlbWVudCwgcGFyZW50TmFtZXNwYWNlKSB7XG4gIHZhciBpc0N1c3RvbUNvbXBvbmVudFRhZzsgLy8gV2UgY3JlYXRlIHRhZ3MgaW4gdGhlIG5hbWVzcGFjZSBvZiB0aGVpciBwYXJlbnQgY29udGFpbmVyLCBleGNlcHQgSFRNTFxuICAvLyB0YWdzIGdldCBubyBuYW1lc3BhY2UuXG5cbiAgdmFyIG93bmVyRG9jdW1lbnQgPSBnZXRPd25lckRvY3VtZW50RnJvbVJvb3RDb250YWluZXIocm9vdENvbnRhaW5lckVsZW1lbnQpO1xuICB2YXIgZG9tRWxlbWVudDtcbiAgdmFyIG5hbWVzcGFjZVVSSSA9IHBhcmVudE5hbWVzcGFjZTtcblxuICBpZiAobmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgIG5hbWVzcGFjZVVSSSA9IGdldEludHJpbnNpY05hbWVzcGFjZSh0eXBlKTtcbiAgfVxuXG4gIGlmIChuYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAge1xuICAgICAgaXNDdXN0b21Db21wb25lbnRUYWcgPSBpc0N1c3RvbUNvbXBvbmVudCh0eXBlLCBwcm9wcyk7IC8vIFNob3VsZCB0aGlzIGNoZWNrIGJlIGdhdGVkIGJ5IHBhcmVudCBuYW1lc3BhY2U/IE5vdCBzdXJlIHdlIHdhbnQgdG9cbiAgICAgIC8vIGFsbG93IDxTVkc+IG9yIDxtQVRIPi5cblxuICAgICAgaWYgKCFpc0N1c3RvbUNvbXBvbmVudFRhZyAmJiB0eXBlICE9PSB0eXBlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgZXJyb3IoJzwlcyAvPiBpcyB1c2luZyBpbmNvcnJlY3QgY2FzaW5nLiAnICsgJ1VzZSBQYXNjYWxDYXNlIGZvciBSZWFjdCBjb21wb25lbnRzLCAnICsgJ29yIGxvd2VyY2FzZSBmb3IgSFRNTCBlbGVtZW50cy4nLCB0eXBlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gJ3NjcmlwdCcpIHtcbiAgICAgIC8vIENyZWF0ZSB0aGUgc2NyaXB0IHZpYSAuaW5uZXJIVE1MIHNvIGl0cyBcInBhcnNlci1pbnNlcnRlZFwiIGZsYWcgaXNcbiAgICAgIC8vIHNldCB0byB0cnVlIGFuZCBpdCBkb2VzIG5vdCBleGVjdXRlXG4gICAgICB2YXIgZGl2ID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgZGl2LmlubmVySFRNTCA9ICc8c2NyaXB0PjwnICsgJy9zY3JpcHQ+JzsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgLy8gVGhpcyBpcyBndWFyYW50ZWVkIHRvIHlpZWxkIGEgc2NyaXB0IGVsZW1lbnQuXG5cbiAgICAgIHZhciBmaXJzdENoaWxkID0gZGl2LmZpcnN0Q2hpbGQ7XG4gICAgICBkb21FbGVtZW50ID0gZGl2LnJlbW92ZUNoaWxkKGZpcnN0Q2hpbGQpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHByb3BzLmlzID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gJEZsb3dJc3N1ZSBgY3JlYXRlRWxlbWVudGAgc2hvdWxkIGJlIHVwZGF0ZWQgZm9yIFdlYiBDb21wb25lbnRzXG4gICAgICBkb21FbGVtZW50ID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KHR5cGUsIHtcbiAgICAgICAgaXM6IHByb3BzLmlzXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2VwYXJhdGUgZWxzZSBicmFuY2ggaW5zdGVhZCBvZiB1c2luZyBgcHJvcHMuaXMgfHwgdW5kZWZpbmVkYCBhYm92ZSBiZWNhdXNlIG9mIGEgRmlyZWZveCBidWcuXG4gICAgICAvLyBTZWUgZGlzY3Vzc2lvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC82ODk2XG4gICAgICAvLyBhbmQgZGlzY3Vzc2lvbiBpbiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjc2MjQwXG4gICAgICBkb21FbGVtZW50ID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KHR5cGUpOyAvLyBOb3JtYWxseSBhdHRyaWJ1dGVzIGFyZSBhc3NpZ25lZCBpbiBgc2V0SW5pdGlhbERPTVByb3BlcnRpZXNgLCBob3dldmVyIHRoZSBgbXVsdGlwbGVgIGFuZCBgc2l6ZWBcbiAgICAgIC8vIGF0dHJpYnV0ZXMgb24gYHNlbGVjdGBzIG5lZWRzIHRvIGJlIGFkZGVkIGJlZm9yZSBgb3B0aW9uYHMgYXJlIGluc2VydGVkLlxuICAgICAgLy8gVGhpcyBwcmV2ZW50czpcbiAgICAgIC8vIC0gYSBidWcgd2hlcmUgdGhlIGBzZWxlY3RgIGRvZXMgbm90IHNjcm9sbCB0byB0aGUgY29ycmVjdCBvcHRpb24gYmVjYXVzZSBzaW5ndWxhclxuICAgICAgLy8gIGBzZWxlY3RgIGVsZW1lbnRzIGF1dG9tYXRpY2FsbHkgcGljayB0aGUgZmlyc3QgaXRlbSAjMTMyMjJcbiAgICAgIC8vIC0gYSBidWcgd2hlcmUgdGhlIGBzZWxlY3RgIHNldCB0aGUgZmlyc3QgaXRlbSBhcyBzZWxlY3RlZCBkZXNwaXRlIHRoZSBgc2l6ZWAgYXR0cmlidXRlICMxNDIzOVxuICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTMyMjJcbiAgICAgIC8vIGFuZCBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE0MjM5XG5cbiAgICAgIGlmICh0eXBlID09PSAnc2VsZWN0Jykge1xuICAgICAgICB2YXIgbm9kZSA9IGRvbUVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKHByb3BzLm11bHRpcGxlKSB7XG4gICAgICAgICAgbm9kZS5tdWx0aXBsZSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAocHJvcHMuc2l6ZSkge1xuICAgICAgICAgIC8vIFNldHRpbmcgYSBzaXplIGdyZWF0ZXIgdGhhbiAxIGNhdXNlcyBhIHNlbGVjdCB0byBiZWhhdmUgbGlrZSBgbXVsdGlwbGU9dHJ1ZWAsIHdoZXJlXG4gICAgICAgICAgLy8gaXQgaXMgcG9zc2libGUgdGhhdCBubyBvcHRpb24gaXMgc2VsZWN0ZWQuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBUaGlzIGlzIG9ubHkgbmVjZXNzYXJ5IHdoZW4gYSBzZWxlY3QgaW4gXCJzaW5nbGUgc2VsZWN0aW9uIG1vZGVcIi5cbiAgICAgICAgICBub2RlLnNpemUgPSBwcm9wcy5zaXplO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGRvbUVsZW1lbnQgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2VVUkksIHR5cGUpO1xuICB9XG5cbiAge1xuICAgIGlmIChuYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICBpZiAoIWlzQ3VzdG9tQ29tcG9uZW50VGFnICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkb21FbGVtZW50KSA9PT0gJ1tvYmplY3QgSFRNTFVua25vd25FbGVtZW50XScgJiYgIWhhc093blByb3BlcnR5LmNhbGwod2FybmVkVW5rbm93blRhZ3MsIHR5cGUpKSB7XG4gICAgICAgIHdhcm5lZFVua25vd25UYWdzW3R5cGVdID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignVGhlIHRhZyA8JXM+IGlzIHVucmVjb2duaXplZCBpbiB0aGlzIGJyb3dzZXIuICcgKyAnSWYgeW91IG1lYW50IHRvIHJlbmRlciBhIFJlYWN0IGNvbXBvbmVudCwgc3RhcnQgaXRzIG5hbWUgd2l0aCAnICsgJ2FuIHVwcGVyY2FzZSBsZXR0ZXIuJywgdHlwZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRvbUVsZW1lbnQ7XG59XG5mdW5jdGlvbiBjcmVhdGVUZXh0Tm9kZSh0ZXh0LCByb290Q29udGFpbmVyRWxlbWVudCkge1xuICByZXR1cm4gZ2V0T3duZXJEb2N1bWVudEZyb21Sb290Q29udGFpbmVyKHJvb3RDb250YWluZXJFbGVtZW50KS5jcmVhdGVUZXh0Tm9kZSh0ZXh0KTtcbn1cbmZ1bmN0aW9uIHNldEluaXRpYWxQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHRhZywgcmF3UHJvcHMsIHJvb3RDb250YWluZXJFbGVtZW50KSB7XG4gIHZhciBpc0N1c3RvbUNvbXBvbmVudFRhZyA9IGlzQ3VzdG9tQ29tcG9uZW50KHRhZywgcmF3UHJvcHMpO1xuXG4gIHtcbiAgICB2YWxpZGF0ZVByb3BlcnRpZXNJbkRldmVsb3BtZW50KHRhZywgcmF3UHJvcHMpO1xuICB9IC8vIFRPRE86IE1ha2Ugc3VyZSB0aGF0IHdlIGNoZWNrIGlzTW91bnRlZCBiZWZvcmUgZmlyaW5nIGFueSBvZiB0aGVzZSBldmVudHMuXG5cblxuICB2YXIgcHJvcHM7XG5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdkaWFsb2cnOlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnY2FuY2VsJywgZG9tRWxlbWVudCk7XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdjbG9zZScsIGRvbUVsZW1lbnQpO1xuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnaWZyYW1lJzpcbiAgICBjYXNlICdvYmplY3QnOlxuICAgIGNhc2UgJ2VtYmVkJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBsb2FkIGV2ZW50LlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnbG9hZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndmlkZW8nOlxuICAgIGNhc2UgJ2F1ZGlvJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGVzZSBldmVudHMgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgYWxsIHRoZSBtZWRpYSBldmVudHMuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1lZGlhRXZlbnRUeXBlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KG1lZGlhRXZlbnRUeXBlc1tpXSwgZG9tRWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NvdXJjZSc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgZXJyb3IgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdlcnJvcicsIGRvbUVsZW1lbnQpO1xuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnaW1nJzpcbiAgICBjYXNlICdpbWFnZSc6XG4gICAgY2FzZSAnbGluayc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhlc2UgZXZlbnRzIGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIGVycm9yIGFuZCBsb2FkIGV2ZW50cy5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2Vycm9yJywgZG9tRWxlbWVudCk7XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdsb2FkJywgZG9tRWxlbWVudCk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdkZXRhaWxzJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSB0b2dnbGUgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCd0b2dnbGUnLCBkb21FbGVtZW50KTtcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIGluaXRXcmFwcGVyU3RhdGUoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgcHJvcHMgPSBnZXRIb3N0UHJvcHMoZG9tRWxlbWVudCwgcmF3UHJvcHMpOyAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgaW52YWxpZCBldmVudC5cblxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnaW52YWxpZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdvcHRpb24nOlxuICAgICAgdmFsaWRhdGVQcm9wcyhkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZSQxKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIHByb3BzID0gZ2V0SG9zdFByb3BzJDEoZG9tRWxlbWVudCwgcmF3UHJvcHMpOyAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgaW52YWxpZCBldmVudC5cblxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnaW52YWxpZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICBpbml0V3JhcHBlclN0YXRlJDIoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgcHJvcHMgPSBnZXRIb3N0UHJvcHMkMihkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LlxuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICB9XG5cbiAgYXNzZXJ0VmFsaWRQcm9wcyh0YWcsIHByb3BzKTtcbiAgc2V0SW5pdGlhbERPTVByb3BlcnRpZXModGFnLCBkb21FbGVtZW50LCByb290Q29udGFpbmVyRWxlbWVudCwgcHJvcHMsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKTtcblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB3ZSBjaGVjayBpZiB0aGlzIGlzIHN0aWxsIHVubW91bnRlZCBvciBkbyBhbnkgY2xlYW5cbiAgICAgIC8vIHVwIG5lY2Vzc2FyeSBzaW5jZSB3ZSBuZXZlciBzdG9wIHRyYWNraW5nIGFueW1vcmUuXG4gICAgICB0cmFjayhkb21FbGVtZW50KTtcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIoZG9tRWxlbWVudCwgcmF3UHJvcHMsIGZhbHNlKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgLy8gVE9ETzogTWFrZSBzdXJlIHdlIGNoZWNrIGlmIHRoaXMgaXMgc3RpbGwgdW5tb3VudGVkIG9yIGRvIGFueSBjbGVhblxuICAgICAgLy8gdXAgbmVjZXNzYXJ5IHNpbmNlIHdlIG5ldmVyIHN0b3AgdHJhY2tpbmcgYW55bW9yZS5cbiAgICAgIHRyYWNrKGRvbUVsZW1lbnQpO1xuICAgICAgcG9zdE1vdW50V3JhcHBlciQzKGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdvcHRpb24nOlxuICAgICAgcG9zdE1vdW50V3JhcHBlciQxKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIkMihkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAodHlwZW9mIHByb3BzLm9uQ2xpY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBjYXN0IG1heSBub3QgYmUgc291bmQgZm9yIFNWRywgTWF0aE1MIG9yIGN1c3RvbSBlbGVtZW50cy5cbiAgICAgICAgdHJhcENsaWNrT25Ob25JbnRlcmFjdGl2ZUVsZW1lbnQoZG9tRWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICB9XG59IC8vIENhbGN1bGF0ZSB0aGUgZGlmZiBiZXR3ZWVuIHRoZSB0d28gb2JqZWN0cy5cblxuZnVuY3Rpb24gZGlmZlByb3BlcnRpZXMoZG9tRWxlbWVudCwgdGFnLCBsYXN0UmF3UHJvcHMsIG5leHRSYXdQcm9wcywgcm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAge1xuICAgIHZhbGlkYXRlUHJvcGVydGllc0luRGV2ZWxvcG1lbnQodGFnLCBuZXh0UmF3UHJvcHMpO1xuICB9XG5cbiAgdmFyIHVwZGF0ZVBheWxvYWQgPSBudWxsO1xuICB2YXIgbGFzdFByb3BzO1xuICB2YXIgbmV4dFByb3BzO1xuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgbGFzdFByb3BzID0gZ2V0SG9zdFByb3BzKGRvbUVsZW1lbnQsIGxhc3RSYXdQcm9wcyk7XG4gICAgICBuZXh0UHJvcHMgPSBnZXRIb3N0UHJvcHMoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIGxhc3RQcm9wcyA9IGdldEhvc3RQcm9wcyQxKGRvbUVsZW1lbnQsIGxhc3RSYXdQcm9wcyk7XG4gICAgICBuZXh0UHJvcHMgPSBnZXRIb3N0UHJvcHMkMShkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICBsYXN0UHJvcHMgPSBnZXRIb3N0UHJvcHMkMihkb21FbGVtZW50LCBsYXN0UmF3UHJvcHMpO1xuICAgICAgbmV4dFByb3BzID0gZ2V0SG9zdFByb3BzJDIoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGxhc3RQcm9wcyA9IGxhc3RSYXdQcm9wcztcbiAgICAgIG5leHRQcm9wcyA9IG5leHRSYXdQcm9wcztcblxuICAgICAgaWYgKHR5cGVvZiBsYXN0UHJvcHMub25DbGljayAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgbmV4dFByb3BzLm9uQ2xpY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBjYXN0IG1heSBub3QgYmUgc291bmQgZm9yIFNWRywgTWF0aE1MIG9yIGN1c3RvbSBlbGVtZW50cy5cbiAgICAgICAgdHJhcENsaWNrT25Ob25JbnRlcmFjdGl2ZUVsZW1lbnQoZG9tRWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgYXNzZXJ0VmFsaWRQcm9wcyh0YWcsIG5leHRQcm9wcyk7XG4gIHZhciBwcm9wS2V5O1xuICB2YXIgc3R5bGVOYW1lO1xuICB2YXIgc3R5bGVVcGRhdGVzID0gbnVsbDtcblxuICBmb3IgKHByb3BLZXkgaW4gbGFzdFByb3BzKSB7XG4gICAgaWYgKG5leHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSB8fCAhbGFzdFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpIHx8IGxhc3RQcm9wc1twcm9wS2V5XSA9PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAocHJvcEtleSA9PT0gU1RZTEUpIHtcbiAgICAgIHZhciBsYXN0U3R5bGUgPSBsYXN0UHJvcHNbcHJvcEtleV07XG5cbiAgICAgIGZvciAoc3R5bGVOYW1lIGluIGxhc3RTdHlsZSkge1xuICAgICAgICBpZiAobGFzdFN0eWxlLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpIHtcbiAgICAgICAgICBpZiAoIXN0eWxlVXBkYXRlcykge1xuICAgICAgICAgICAgc3R5bGVVcGRhdGVzID0ge307XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc3R5bGVVcGRhdGVzW3N0eWxlTmFtZV0gPSAnJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gREFOR0VST1VTTFlfU0VUX0lOTkVSX0hUTUwgfHwgcHJvcEtleSA9PT0gQ0hJTERSRU4pIDsgZWxzZSBpZiAocHJvcEtleSA9PT0gU1VQUFJFU1NfQ09OVEVOVF9FRElUQUJMRV9XQVJOSU5HIHx8IHByb3BLZXkgPT09IFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HKSA7IGVsc2UgaWYgKHByb3BLZXkgPT09IEFVVE9GT0NVUykgOyBlbHNlIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlLiBJZiBhbnkgbGlzdGVuZXIgdXBkYXRlcyB3ZSBuZWVkIHRvIGVuc3VyZVxuICAgICAgLy8gdGhhdCB0aGUgXCJjdXJyZW50XCIgZmliZXIgcG9pbnRlciBnZXRzIHVwZGF0ZWQgc28gd2UgbmVlZCBhIGNvbW1pdFxuICAgICAgLy8gdG8gdXBkYXRlIHRoaXMgZWxlbWVudC5cbiAgICAgIGlmICghdXBkYXRlUGF5bG9hZCkge1xuICAgICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZvciBhbGwgb3RoZXIgZGVsZXRlZCBwcm9wZXJ0aWVzIHdlIGFkZCBpdCB0byB0aGUgcXVldWUuIFdlIHVzZVxuICAgICAgLy8gdGhlIGFsbG93ZWQgcHJvcGVydHkgbGlzdCBpbiB0aGUgY29tbWl0IHBoYXNlIGluc3RlYWQuXG4gICAgICAodXBkYXRlUGF5bG9hZCA9IHVwZGF0ZVBheWxvYWQgfHwgW10pLnB1c2gocHJvcEtleSwgbnVsbCk7XG4gICAgfVxuICB9XG5cbiAgZm9yIChwcm9wS2V5IGluIG5leHRQcm9wcykge1xuICAgIHZhciBuZXh0UHJvcCA9IG5leHRQcm9wc1twcm9wS2V5XTtcbiAgICB2YXIgbGFzdFByb3AgPSBsYXN0UHJvcHMgIT0gbnVsbCA/IGxhc3RQcm9wc1twcm9wS2V5XSA6IHVuZGVmaW5lZDtcblxuICAgIGlmICghbmV4dFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpIHx8IG5leHRQcm9wID09PSBsYXN0UHJvcCB8fCBuZXh0UHJvcCA9PSBudWxsICYmIGxhc3RQcm9wID09IG51bGwpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAge1xuICAgICAgICBpZiAobmV4dFByb3ApIHtcbiAgICAgICAgICAvLyBGcmVlemUgdGhlIG5leHQgc3R5bGUgb2JqZWN0IHNvIHRoYXQgd2UgY2FuIGFzc3VtZSBpdCB3b24ndCBiZVxuICAgICAgICAgIC8vIG11dGF0ZWQuIFdlIGhhdmUgYWxyZWFkeSB3YXJuZWQgZm9yIHRoaXMgaW4gdGhlIHBhc3QuXG4gICAgICAgICAgT2JqZWN0LmZyZWV6ZShuZXh0UHJvcCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGxhc3RQcm9wKSB7XG4gICAgICAgIC8vIFVuc2V0IHN0eWxlcyBvbiBgbGFzdFByb3BgIGJ1dCBub3Qgb24gYG5leHRQcm9wYC5cbiAgICAgICAgZm9yIChzdHlsZU5hbWUgaW4gbGFzdFByb3ApIHtcbiAgICAgICAgICBpZiAobGFzdFByb3AuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSAmJiAoIW5leHRQcm9wIHx8ICFuZXh0UHJvcC5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSkge1xuICAgICAgICAgICAgaWYgKCFzdHlsZVVwZGF0ZXMpIHtcbiAgICAgICAgICAgICAgc3R5bGVVcGRhdGVzID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN0eWxlVXBkYXRlc1tzdHlsZU5hbWVdID0gJyc7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIFVwZGF0ZSBzdHlsZXMgdGhhdCBjaGFuZ2VkIHNpbmNlIGBsYXN0UHJvcGAuXG5cblxuICAgICAgICBmb3IgKHN0eWxlTmFtZSBpbiBuZXh0UHJvcCkge1xuICAgICAgICAgIGlmIChuZXh0UHJvcC5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpICYmIGxhc3RQcm9wW3N0eWxlTmFtZV0gIT09IG5leHRQcm9wW3N0eWxlTmFtZV0pIHtcbiAgICAgICAgICAgIGlmICghc3R5bGVVcGRhdGVzKSB7XG4gICAgICAgICAgICAgIHN0eWxlVXBkYXRlcyA9IHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdHlsZVVwZGF0ZXNbc3R5bGVOYW1lXSA9IG5leHRQcm9wW3N0eWxlTmFtZV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBSZWxpZXMgb24gYHVwZGF0ZVN0eWxlc0J5SURgIG5vdCBtdXRhdGluZyBgc3R5bGVVcGRhdGVzYC5cbiAgICAgICAgaWYgKCFzdHlsZVVwZGF0ZXMpIHtcbiAgICAgICAgICBpZiAoIXVwZGF0ZVBheWxvYWQpIHtcbiAgICAgICAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB1cGRhdGVQYXlsb2FkLnB1c2gocHJvcEtleSwgc3R5bGVVcGRhdGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0eWxlVXBkYXRlcyA9IG5leHRQcm9wO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gREFOR0VST1VTTFlfU0VUX0lOTkVSX0hUTUwpIHtcbiAgICAgIHZhciBuZXh0SHRtbCA9IG5leHRQcm9wID8gbmV4dFByb3BbSFRNTCQxXSA6IHVuZGVmaW5lZDtcbiAgICAgIHZhciBsYXN0SHRtbCA9IGxhc3RQcm9wID8gbGFzdFByb3BbSFRNTCQxXSA6IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKG5leHRIdG1sICE9IG51bGwpIHtcbiAgICAgICAgaWYgKGxhc3RIdG1sICE9PSBuZXh0SHRtbCkge1xuICAgICAgICAgICh1cGRhdGVQYXlsb2FkID0gdXBkYXRlUGF5bG9hZCB8fCBbXSkucHVzaChwcm9wS2V5LCBuZXh0SHRtbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IENISUxEUkVOKSB7XG4gICAgICBpZiAodHlwZW9mIG5leHRQcm9wID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgbmV4dFByb3AgPT09ICdudW1iZXInKSB7XG4gICAgICAgICh1cGRhdGVQYXlsb2FkID0gdXBkYXRlUGF5bG9hZCB8fCBbXSkucHVzaChwcm9wS2V5LCAnJyArIG5leHRQcm9wKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IFNVUFBSRVNTX0NPTlRFTlRfRURJVEFCTEVfV0FSTklORyB8fCBwcm9wS2V5ID09PSBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORykgOyBlbHNlIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICBpZiAobmV4dFByb3AgIT0gbnVsbCkge1xuICAgICAgICAvLyBXZSBlYWdlcmx5IGxpc3RlbiB0byB0aGlzIGV2ZW4gdGhvdWdoIHdlIGhhdmVuJ3QgY29tbWl0dGVkIHlldC5cbiAgICAgICAgaWYgKCB0eXBlb2YgbmV4dFByb3AgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXIocHJvcEtleSwgbmV4dFByb3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb3BLZXkgPT09ICdvblNjcm9sbCcpIHtcbiAgICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdzY3JvbGwnLCBkb21FbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXVwZGF0ZVBheWxvYWQgJiYgbGFzdFByb3AgIT09IG5leHRQcm9wKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UuIElmIGFueSBsaXN0ZW5lciB1cGRhdGVzIHdlIG5lZWQgdG8gZW5zdXJlXG4gICAgICAgIC8vIHRoYXQgdGhlIFwiY3VycmVudFwiIHByb3BzIHBvaW50ZXIgZ2V0cyB1cGRhdGVkIHNvIHdlIG5lZWQgYSBjb21taXRcbiAgICAgICAgLy8gdG8gdXBkYXRlIHRoaXMgZWxlbWVudC5cbiAgICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGb3IgYW55IG90aGVyIHByb3BlcnR5IHdlIGFsd2F5cyBhZGQgaXQgdG8gdGhlIHF1ZXVlIGFuZCB0aGVuIHdlXG4gICAgICAvLyBmaWx0ZXIgaXQgb3V0IHVzaW5nIHRoZSBhbGxvd2VkIHByb3BlcnR5IGxpc3QgZHVyaW5nIHRoZSBjb21taXQuXG4gICAgICAodXBkYXRlUGF5bG9hZCA9IHVwZGF0ZVBheWxvYWQgfHwgW10pLnB1c2gocHJvcEtleSwgbmV4dFByb3ApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzdHlsZVVwZGF0ZXMpIHtcbiAgICB7XG4gICAgICB2YWxpZGF0ZVNob3J0aGFuZFByb3BlcnR5Q29sbGlzaW9uSW5EZXYoc3R5bGVVcGRhdGVzLCBuZXh0UHJvcHNbU1RZTEVdKTtcbiAgICB9XG5cbiAgICAodXBkYXRlUGF5bG9hZCA9IHVwZGF0ZVBheWxvYWQgfHwgW10pLnB1c2goU1RZTEUsIHN0eWxlVXBkYXRlcyk7XG4gIH1cblxuICByZXR1cm4gdXBkYXRlUGF5bG9hZDtcbn0gLy8gQXBwbHkgdGhlIGRpZmYuXG5cbmZ1bmN0aW9uIHVwZGF0ZVByb3BlcnRpZXMoZG9tRWxlbWVudCwgdXBkYXRlUGF5bG9hZCwgdGFnLCBsYXN0UmF3UHJvcHMsIG5leHRSYXdQcm9wcykge1xuICAvLyBVcGRhdGUgY2hlY2tlZCAqYmVmb3JlKiBuYW1lLlxuICAvLyBJbiB0aGUgbWlkZGxlIG9mIGFuIHVwZGF0ZSwgaXQgaXMgcG9zc2libGUgdG8gaGF2ZSBtdWx0aXBsZSBjaGVja2VkLlxuICAvLyBXaGVuIGEgY2hlY2tlZCByYWRpbyB0cmllcyB0byBjaGFuZ2UgbmFtZSwgYnJvd3NlciBtYWtlcyBhbm90aGVyIHJhZGlvJ3MgY2hlY2tlZCBmYWxzZS5cbiAgaWYgKHRhZyA9PT0gJ2lucHV0JyAmJiBuZXh0UmF3UHJvcHMudHlwZSA9PT0gJ3JhZGlvJyAmJiBuZXh0UmF3UHJvcHMubmFtZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlQ2hlY2tlZChkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICB9XG5cbiAgdmFyIHdhc0N1c3RvbUNvbXBvbmVudFRhZyA9IGlzQ3VzdG9tQ29tcG9uZW50KHRhZywgbGFzdFJhd1Byb3BzKTtcbiAgdmFyIGlzQ3VzdG9tQ29tcG9uZW50VGFnID0gaXNDdXN0b21Db21wb25lbnQodGFnLCBuZXh0UmF3UHJvcHMpOyAvLyBBcHBseSB0aGUgZGlmZi5cblxuICB1cGRhdGVET01Qcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHVwZGF0ZVBheWxvYWQsIHdhc0N1c3RvbUNvbXBvbmVudFRhZywgaXNDdXN0b21Db21wb25lbnRUYWcpOyAvLyBUT0RPOiBFbnN1cmUgdGhhdCBhbiB1cGRhdGUgZ2V0cyBzY2hlZHVsZWQgaWYgYW55IG9mIHRoZSBzcGVjaWFsIHByb3BzXG4gIC8vIGNoYW5nZWQuXG5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICAvLyBVcGRhdGUgdGhlIHdyYXBwZXIgYXJvdW5kIGlucHV0cyAqYWZ0ZXIqIHVwZGF0aW5nIHByb3BzLiBUaGlzIGhhcyB0b1xuICAgICAgLy8gaGFwcGVuIGFmdGVyIGB1cGRhdGVET01Qcm9wZXJ0aWVzYC4gT3RoZXJ3aXNlIEhUTUw1IGlucHV0IHZhbGlkYXRpb25zXG4gICAgICAvLyByYWlzZSB3YXJuaW5ncyBhbmQgcHJldmVudCB0aGUgbmV3IHZhbHVlIGZyb20gYmVpbmcgYXNzaWduZWQuXG4gICAgICB1cGRhdGVXcmFwcGVyKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIHVwZGF0ZVdyYXBwZXIkMShkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgLy8gPHNlbGVjdD4gdmFsdWUgdXBkYXRlIG5lZWRzIHRvIG9jY3VyIGFmdGVyIDxvcHRpb24+IGNoaWxkcmVuXG4gICAgICAvLyByZWNvbmNpbGlhdGlvblxuICAgICAgcG9zdFVwZGF0ZVdyYXBwZXIoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFBvc3NpYmxlU3RhbmRhcmROYW1lKHByb3BOYW1lKSB7XG4gIHtcbiAgICB2YXIgbG93ZXJDYXNlZE5hbWUgPSBwcm9wTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKCFwb3NzaWJsZVN0YW5kYXJkTmFtZXMuaGFzT3duUHJvcGVydHkobG93ZXJDYXNlZE5hbWUpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gcG9zc2libGVTdGFuZGFyZE5hbWVzW2xvd2VyQ2FzZWROYW1lXSB8fCBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpZmZIeWRyYXRlZFByb3BlcnRpZXMoZG9tRWxlbWVudCwgdGFnLCByYXdQcm9wcywgcGFyZW50TmFtZXNwYWNlLCByb290Q29udGFpbmVyRWxlbWVudCwgaXNDb25jdXJyZW50TW9kZSwgc2hvdWxkV2FybkRldikge1xuICB2YXIgaXNDdXN0b21Db21wb25lbnRUYWc7XG4gIHZhciBleHRyYUF0dHJpYnV0ZU5hbWVzO1xuXG4gIHtcbiAgICBpc0N1c3RvbUNvbXBvbmVudFRhZyA9IGlzQ3VzdG9tQ29tcG9uZW50KHRhZywgcmF3UHJvcHMpO1xuICAgIHZhbGlkYXRlUHJvcGVydGllc0luRGV2ZWxvcG1lbnQodGFnLCByYXdQcm9wcyk7XG4gIH0gLy8gVE9ETzogTWFrZSBzdXJlIHRoYXQgd2UgY2hlY2sgaXNNb3VudGVkIGJlZm9yZSBmaXJpbmcgYW55IG9mIHRoZXNlIGV2ZW50cy5cblxuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnZGlhbG9nJzpcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2NhbmNlbCcsIGRvbUVsZW1lbnQpO1xuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnY2xvc2UnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnaWZyYW1lJzpcbiAgICBjYXNlICdvYmplY3QnOlxuICAgIGNhc2UgJ2VtYmVkJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBsb2FkIGV2ZW50LlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnbG9hZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd2aWRlbyc6XG4gICAgY2FzZSAnYXVkaW8nOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoZXNlIGV2ZW50cyBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciBhbGwgdGhlIG1lZGlhIGV2ZW50cy5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWVkaWFFdmVudFR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQobWVkaWFFdmVudFR5cGVzW2ldLCBkb21FbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzb3VyY2UnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGVycm9yIGV2ZW50LlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnZXJyb3InLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnaW1nJzpcbiAgICBjYXNlICdpbWFnZSc6XG4gICAgY2FzZSAnbGluayc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhlc2UgZXZlbnRzIGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIGVycm9yIGFuZCBsb2FkIGV2ZW50cy5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2Vycm9yJywgZG9tRWxlbWVudCk7XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdsb2FkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2RldGFpbHMnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIHRvZ2dsZSBldmVudC5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ3RvZ2dsZScsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICBpbml0V3JhcHBlclN0YXRlKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTsgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGludmFsaWQgZXZlbnQuXG5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2ludmFsaWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgIHZhbGlkYXRlUHJvcHMoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZSQxKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTsgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGludmFsaWQgZXZlbnQuXG5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2ludmFsaWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZSQyKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTsgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGludmFsaWQgZXZlbnQuXG5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2ludmFsaWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgYXNzZXJ0VmFsaWRQcm9wcyh0YWcsIHJhd1Byb3BzKTtcblxuICB7XG4gICAgZXh0cmFBdHRyaWJ1dGVOYW1lcyA9IG5ldyBTZXQoKTtcbiAgICB2YXIgYXR0cmlidXRlcyA9IGRvbUVsZW1lbnQuYXR0cmlidXRlcztcblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIG5hbWUgPSBhdHRyaWJ1dGVzW19pXS5uYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgICAvLyBDb250cm9sbGVkIGF0dHJpYnV0ZXMgYXJlIG5vdCB2YWxpZGF0ZWRcbiAgICAgICAgLy8gVE9ETzogT25seSBpZ25vcmUgdGhlbSBvbiBjb250cm9sbGVkIHRhZ3MuXG4gICAgICAgIGNhc2UgJ3ZhbHVlJzpcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdjaGVja2VkJzpcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdzZWxlY3RlZCc6XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBJbnRlbnRpb25hbGx5IHVzZSB0aGUgb3JpZ2luYWwgbmFtZS5cbiAgICAgICAgICAvLyBTZWUgZGlzY3Vzc2lvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8xMDY3Ni5cbiAgICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmFkZChhdHRyaWJ1dGVzW19pXS5uYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgdXBkYXRlUGF5bG9hZCA9IG51bGw7XG5cbiAgZm9yICh2YXIgcHJvcEtleSBpbiByYXdQcm9wcykge1xuICAgIGlmICghcmF3UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciBuZXh0UHJvcCA9IHJhd1Byb3BzW3Byb3BLZXldO1xuXG4gICAgaWYgKHByb3BLZXkgPT09IENISUxEUkVOKSB7XG4gICAgICAvLyBGb3IgdGV4dCBjb250ZW50IGNoaWxkcmVuIHdlIGNvbXBhcmUgYWdhaW5zdCB0ZXh0Q29udGVudC4gVGhpc1xuICAgICAgLy8gbWlnaHQgbWF0Y2ggYWRkaXRpb25hbCBIVE1MIHRoYXQgaXMgaGlkZGVuIHdoZW4gd2UgcmVhZCBpdCB1c2luZ1xuICAgICAgLy8gdGV4dENvbnRlbnQuIEUuZy4gXCJmb29cIiB3aWxsIG1hdGNoIFwiZjxzcGFuPm9vPC9zcGFuPlwiIGJ1dCB0aGF0IHN0aWxsXG4gICAgICAvLyBzYXRpc2ZpZXMgb3VyIHJlcXVpcmVtZW50LiBPdXIgcmVxdWlyZW1lbnQgaXMgbm90IHRvIHByb2R1Y2UgcGVyZmVjdFxuICAgICAgLy8gSFRNTCBhbmQgYXR0cmlidXRlcy4gSWRlYWxseSB3ZSBzaG91bGQgcHJlc2VydmUgc3RydWN0dXJlIGJ1dCBpdCdzXG4gICAgICAvLyBvayBub3QgdG8gaWYgdGhlIHZpc2libGUgY29udGVudCBpcyBzdGlsbCBlbm91Z2ggdG8gaW5kaWNhdGUgd2hhdFxuICAgICAgLy8gZXZlbiBsaXN0ZW5lcnMgdGhlc2Ugbm9kZXMgbWlnaHQgYmUgd2lyZWQgdXAgdG8uXG4gICAgICAvLyBUT0RPOiBXYXJuIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBhIHNpbmdsZSB0ZXh0Tm9kZSBhcyBhIGNoaWxkLlxuICAgICAgLy8gVE9ETzogU2hvdWxkIHdlIHVzZSBkb21FbGVtZW50LmZpcnN0Q2hpbGQubm9kZVZhbHVlIHRvIGNvbXBhcmU/XG4gICAgICBpZiAodHlwZW9mIG5leHRQcm9wID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAoZG9tRWxlbWVudC50ZXh0Q29udGVudCAhPT0gbmV4dFByb3ApIHtcbiAgICAgICAgICBpZiAocmF3UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkddICE9PSB0cnVlKSB7XG4gICAgICAgICAgICBjaGVja0ZvclVubWF0Y2hlZFRleHQoZG9tRWxlbWVudC50ZXh0Q29udGVudCwgbmV4dFByb3AsIGlzQ29uY3VycmVudE1vZGUsIHNob3VsZFdhcm5EZXYpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZVBheWxvYWQgPSBbQ0hJTERSRU4sIG5leHRQcm9wXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbmV4dFByb3AgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGlmIChkb21FbGVtZW50LnRleHRDb250ZW50ICE9PSAnJyArIG5leHRQcm9wKSB7XG4gICAgICAgICAgaWYgKHJhd1Byb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HXSAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgY2hlY2tGb3JVbm1hdGNoZWRUZXh0KGRvbUVsZW1lbnQudGV4dENvbnRlbnQsIG5leHRQcm9wLCBpc0NvbmN1cnJlbnRNb2RlLCBzaG91bGRXYXJuRGV2KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB1cGRhdGVQYXlsb2FkID0gW0NISUxEUkVOLCAnJyArIG5leHRQcm9wXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkge1xuICAgICAgaWYgKG5leHRQcm9wICE9IG51bGwpIHtcbiAgICAgICAgaWYgKCB0eXBlb2YgbmV4dFByb3AgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXIocHJvcEtleSwgbmV4dFByb3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb3BLZXkgPT09ICdvblNjcm9sbCcpIHtcbiAgICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdzY3JvbGwnLCBkb21FbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc2hvdWxkV2FybkRldiAmJiB0cnVlICYmIC8vIENvbnZpbmNlIEZsb3cgd2UndmUgY2FsY3VsYXRlZCBpdCAoaXQncyBERVYtb25seSBpbiB0aGlzIG1ldGhvZC4pXG4gICAgdHlwZW9mIGlzQ3VzdG9tQ29tcG9uZW50VGFnID09PSAnYm9vbGVhbicpIHtcbiAgICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhlIHByb3BlcnRpZXMgY29ycmVzcG9uZCB0byB0aGVpciBleHBlY3RlZCB2YWx1ZXMuXG4gICAgICB2YXIgc2VydmVyVmFsdWUgPSB2b2lkIDA7XG4gICAgICB2YXIgcHJvcGVydHlJbmZvID0gaXNDdXN0b21Db21wb25lbnRUYWcgJiYgZW5hYmxlQ3VzdG9tRWxlbWVudFByb3BlcnR5U3VwcG9ydCA/IG51bGwgOiBnZXRQcm9wZXJ0eUluZm8ocHJvcEtleSk7XG5cbiAgICAgIGlmIChyYXdQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklOR10gPT09IHRydWUpIDsgZWxzZSBpZiAocHJvcEtleSA9PT0gU1VQUFJFU1NfQ09OVEVOVF9FRElUQUJMRV9XQVJOSU5HIHx8IHByb3BLZXkgPT09IFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HIHx8IC8vIENvbnRyb2xsZWQgYXR0cmlidXRlcyBhcmUgbm90IHZhbGlkYXRlZFxuICAgICAgLy8gVE9ETzogT25seSBpZ25vcmUgdGhlbSBvbiBjb250cm9sbGVkIHRhZ3MuXG4gICAgICBwcm9wS2V5ID09PSAndmFsdWUnIHx8IHByb3BLZXkgPT09ICdjaGVja2VkJyB8fCBwcm9wS2V5ID09PSAnc2VsZWN0ZWQnKSA7IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MKSB7XG4gICAgICAgIHZhciBzZXJ2ZXJIVE1MID0gZG9tRWxlbWVudC5pbm5lckhUTUw7XG4gICAgICAgIHZhciBuZXh0SHRtbCA9IG5leHRQcm9wID8gbmV4dFByb3BbSFRNTCQxXSA6IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAobmV4dEh0bWwgIT0gbnVsbCkge1xuICAgICAgICAgIHZhciBleHBlY3RlZEhUTUwgPSBub3JtYWxpemVIVE1MKGRvbUVsZW1lbnQsIG5leHRIdG1sKTtcblxuICAgICAgICAgIGlmIChleHBlY3RlZEhUTUwgIT09IHNlcnZlckhUTUwpIHtcbiAgICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBzZXJ2ZXJIVE1MLCBleHBlY3RlZEhUTUwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuZGVsZXRlKHByb3BLZXkpO1xuXG4gICAgICAgIGlmIChjYW5EaWZmU3R5bGVGb3JIeWRyYXRpb25XYXJuaW5nKSB7XG4gICAgICAgICAgdmFyIGV4cGVjdGVkU3R5bGUgPSBjcmVhdGVEYW5nZXJvdXNTdHJpbmdGb3JTdHlsZXMobmV4dFByb3ApO1xuICAgICAgICAgIHNlcnZlclZhbHVlID0gZG9tRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3N0eWxlJyk7XG5cbiAgICAgICAgICBpZiAoZXhwZWN0ZWRTdHlsZSAhPT0gc2VydmVyVmFsdWUpIHtcbiAgICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBzZXJ2ZXJWYWx1ZSwgZXhwZWN0ZWRTdHlsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnICYmICFlbmFibGVDdXN0b21FbGVtZW50UHJvcGVydHlTdXBwb3J0KSB7XG4gICAgICAgIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cbiAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcEtleS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgc2VydmVyVmFsdWUgPSBnZXRWYWx1ZUZvckF0dHJpYnV0ZShkb21FbGVtZW50LCBwcm9wS2V5LCBuZXh0UHJvcCk7XG5cbiAgICAgICAgaWYgKG5leHRQcm9wICE9PSBzZXJ2ZXJWYWx1ZSkge1xuICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBzZXJ2ZXJWYWx1ZSwgbmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFzaG91bGRJZ25vcmVBdHRyaWJ1dGUocHJvcEtleSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykgJiYgIXNob3VsZFJlbW92ZUF0dHJpYnV0ZShwcm9wS2V5LCBuZXh0UHJvcCwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykpIHtcbiAgICAgICAgdmFyIGlzTWlzbWF0Y2hEdWVUb0JhZENhc2luZyA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChwcm9wZXJ0eUluZm8gIT09IG51bGwpIHtcbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICAgIHNlcnZlclZhbHVlID0gZ2V0VmFsdWVGb3JQcm9wZXJ0eShkb21FbGVtZW50LCBwcm9wS2V5LCBuZXh0UHJvcCwgcHJvcGVydHlJbmZvKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgb3duTmFtZXNwYWNlID0gcGFyZW50TmFtZXNwYWNlO1xuXG4gICAgICAgICAgaWYgKG93bk5hbWVzcGFjZSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgICAgIG93bk5hbWVzcGFjZSA9IGdldEludHJpbnNpY05hbWVzcGFjZSh0YWcpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChvd25OYW1lc3BhY2UgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICAgICAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShwcm9wS2V5LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgc3RhbmRhcmROYW1lID0gZ2V0UG9zc2libGVTdGFuZGFyZE5hbWUocHJvcEtleSk7XG5cbiAgICAgICAgICAgIGlmIChzdGFuZGFyZE5hbWUgIT09IG51bGwgJiYgc3RhbmRhcmROYW1lICE9PSBwcm9wS2V5KSB7XG4gICAgICAgICAgICAgIC8vIElmIGFuIFNWRyBwcm9wIGlzIHN1cHBsaWVkIHdpdGggYmFkIGNhc2luZywgaXQgd2lsbFxuICAgICAgICAgICAgICAvLyBiZSBzdWNjZXNzZnVsbHkgcGFyc2VkIGZyb20gSFRNTCwgYnV0IHdpbGwgcHJvZHVjZSBhIG1pc21hdGNoXG4gICAgICAgICAgICAgIC8vIChhbmQgd291bGQgYmUgaW5jb3JyZWN0bHkgcmVuZGVyZWQgb24gdGhlIGNsaWVudCkuXG4gICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIHdlIGFscmVhZHkgd2FybiBhYm91dCBiYWQgY2FzaW5nIGVsc2V3aGVyZS5cbiAgICAgICAgICAgICAgLy8gU28gd2UnbGwgc2tpcCB0aGUgbWlzbGVhZGluZyBleHRyYSBtaXNtYXRjaCB3YXJuaW5nIGluIHRoaXMgY2FzZS5cbiAgICAgICAgICAgICAgaXNNaXNtYXRjaER1ZVRvQmFkQ2FzaW5nID0gdHJ1ZTsgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuXG4gICAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuZGVsZXRlKHN0YW5kYXJkTmFtZSk7XG4gICAgICAgICAgICB9IC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cblxuXG4gICAgICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShwcm9wS2V5KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZXJ2ZXJWYWx1ZSA9IGdldFZhbHVlRm9yQXR0cmlidXRlKGRvbUVsZW1lbnQsIHByb3BLZXksIG5leHRQcm9wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkb250V2FybkN1c3RvbUVsZW1lbnQgPSBlbmFibGVDdXN0b21FbGVtZW50UHJvcGVydHlTdXBwb3J0ICA7XG5cbiAgICAgICAgaWYgKCFkb250V2FybkN1c3RvbUVsZW1lbnQgJiYgbmV4dFByb3AgIT09IHNlcnZlclZhbHVlICYmICFpc01pc21hdGNoRHVlVG9CYWRDYXNpbmcpIHtcbiAgICAgICAgICB3YXJuRm9yUHJvcERpZmZlcmVuY2UocHJvcEtleSwgc2VydmVyVmFsdWUsIG5leHRQcm9wKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBpZiAoc2hvdWxkV2FybkRldikge1xuICAgICAgaWYgKCAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLnNpemUgPiAwICYmIHJhd1Byb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HXSAhPT0gdHJ1ZSkge1xuICAgICAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgICAgIHdhcm5Gb3JFeHRyYUF0dHJpYnV0ZXMoZXh0cmFBdHRyaWJ1dGVOYW1lcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICAvLyBUT0RPOiBNYWtlIHN1cmUgd2UgY2hlY2sgaWYgdGhpcyBpcyBzdGlsbCB1bm1vdW50ZWQgb3IgZG8gYW55IGNsZWFuXG4gICAgICAvLyB1cCBuZWNlc3Nhcnkgc2luY2Ugd2UgbmV2ZXIgc3RvcCB0cmFja2luZyBhbnltb3JlLlxuICAgICAgdHJhY2soZG9tRWxlbWVudCk7XG4gICAgICBwb3N0TW91bnRXcmFwcGVyKGRvbUVsZW1lbnQsIHJhd1Byb3BzLCB0cnVlKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgLy8gVE9ETzogTWFrZSBzdXJlIHdlIGNoZWNrIGlmIHRoaXMgaXMgc3RpbGwgdW5tb3VudGVkIG9yIGRvIGFueSBjbGVhblxuICAgICAgLy8gdXAgbmVjZXNzYXJ5IHNpbmNlIHdlIG5ldmVyIHN0b3AgdHJhY2tpbmcgYW55bW9yZS5cbiAgICAgIHRyYWNrKGRvbUVsZW1lbnQpO1xuICAgICAgcG9zdE1vdW50V3JhcHBlciQzKGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICAvLyBGb3IgaW5wdXQgYW5kIHRleHRhcmVhIHdlIGN1cnJlbnQgYWx3YXlzIHNldCB0aGUgdmFsdWUgcHJvcGVydHkgYXRcbiAgICAgIC8vIHBvc3QgbW91bnQgdG8gZm9yY2UgaXQgdG8gZGl2ZXJnZSBmcm9tIGF0dHJpYnV0ZXMuIEhvd2V2ZXIsIGZvclxuICAgICAgLy8gb3B0aW9uIGFuZCBzZWxlY3Qgd2UgZG9uJ3QgcXVpdGUgZG8gdGhlIHNhbWUgdGhpbmcgYW5kIHNlbGVjdFxuICAgICAgLy8gaXMgbm90IHJlc2lsaWVudCB0byB0aGUgRE9NIHN0YXRlIGNoYW5naW5nIHNvIHdlIGRvbid0IGRvIHRoYXQgaGVyZS5cbiAgICAgIC8vIFRPRE86IENvbnNpZGVyIG5vdCBkb2luZyB0aGlzIGZvciBpbnB1dCBhbmQgdGV4dGFyZWEuXG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAodHlwZW9mIHJhd1Byb3BzLm9uQ2xpY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBjYXN0IG1heSBub3QgYmUgc291bmQgZm9yIFNWRywgTWF0aE1MIG9yIGN1c3RvbSBlbGVtZW50cy5cbiAgICAgICAgdHJhcENsaWNrT25Ob25JbnRlcmFjdGl2ZUVsZW1lbnQoZG9tRWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZVBheWxvYWQ7XG59XG5mdW5jdGlvbiBkaWZmSHlkcmF0ZWRUZXh0KHRleHROb2RlLCB0ZXh0LCBpc0NvbmN1cnJlbnRNb2RlKSB7XG4gIHZhciBpc0RpZmZlcmVudCA9IHRleHROb2RlLm5vZGVWYWx1ZSAhPT0gdGV4dDtcbiAgcmV0dXJuIGlzRGlmZmVyZW50O1xufVxuZnVuY3Rpb24gd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlRWxlbWVudChwYXJlbnROb2RlLCBjaGlsZCkge1xuICB7XG4gICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ0RpZCBub3QgZXhwZWN0IHNlcnZlciBIVE1MIHRvIGNvbnRhaW4gYSA8JXM+IGluIDwlcz4uJywgY2hpbGQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgcGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxufVxuZnVuY3Rpb24gd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlVGV4dChwYXJlbnROb2RlLCBjaGlsZCkge1xuICB7XG4gICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ0RpZCBub3QgZXhwZWN0IHNlcnZlciBIVE1MIHRvIGNvbnRhaW4gdGhlIHRleHQgbm9kZSBcIiVzXCIgaW4gPCVzPi4nLCBjaGlsZC5ub2RlVmFsdWUsIHBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkRWxlbWVudChwYXJlbnROb2RlLCB0YWcsIHByb3BzKSB7XG4gIHtcbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG5cbiAgICBlcnJvcignRXhwZWN0ZWQgc2VydmVyIEhUTUwgdG8gY29udGFpbiBhIG1hdGNoaW5nIDwlcz4gaW4gPCVzPi4nLCB0YWcsIHBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkVGV4dChwYXJlbnROb2RlLCB0ZXh0KSB7XG4gIHtcbiAgICBpZiAodGV4dCA9PT0gJycpIHtcbiAgICAgIC8vIFdlIGV4cGVjdCB0byBpbnNlcnQgZW1wdHkgdGV4dCBub2RlcyBzaW5jZSB0aGV5J3JlIG5vdCByZXByZXNlbnRlZCBpblxuICAgICAgLy8gdGhlIEhUTUwuXG4gICAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyBzcGVjaWFsIGNhc2UgaWYgd2UgY2FuIGp1c3QgYXZvaWQgaW5zZXJ0aW5nIGVtcHR5XG4gICAgICAvLyB0ZXh0IG5vZGVzLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgIGVycm9yKCdFeHBlY3RlZCBzZXJ2ZXIgSFRNTCB0byBjb250YWluIGEgbWF0Y2hpbmcgdGV4dCBub2RlIGZvciBcIiVzXCIgaW4gPCVzPi4nLCB0ZXh0LCBwYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICB9XG59XG5mdW5jdGlvbiByZXN0b3JlQ29udHJvbGxlZFN0YXRlJDMoZG9tRWxlbWVudCwgdGFnLCBwcm9wcykge1xuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIHJlc3RvcmVDb250cm9sbGVkU3RhdGUoZG9tRWxlbWVudCwgcHJvcHMpO1xuICAgICAgcmV0dXJuO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQyKGRvbUVsZW1lbnQsIHByb3BzKTtcbiAgICAgIHJldHVybjtcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICByZXN0b3JlQ29udHJvbGxlZFN0YXRlJDEoZG9tRWxlbWVudCwgcHJvcHMpO1xuICAgICAgcmV0dXJuO1xuICB9XG59XG5cbnZhciB2YWxpZGF0ZURPTU5lc3RpbmcgPSBmdW5jdGlvbiAoKSB7fTtcblxudmFyIHVwZGF0ZWRBbmNlc3RvckluZm8gPSBmdW5jdGlvbiAoKSB7fTtcblxue1xuICAvLyBUaGlzIHZhbGlkYXRpb24gY29kZSB3YXMgd3JpdHRlbiBiYXNlZCBvbiB0aGUgSFRNTDUgcGFyc2luZyBzcGVjOlxuICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNoYXMtYW4tZWxlbWVudC1pbi1zY29wZVxuICAvL1xuICAvLyBOb3RlOiB0aGlzIGRvZXMgbm90IGNhdGNoIGFsbCBpbnZhbGlkIG5lc3RpbmcsIG5vciBkb2VzIGl0IHRyeSB0byAoYXMgaXQnc1xuICAvLyBub3QgY2xlYXIgd2hhdCBwcmFjdGljYWwgYmVuZWZpdCBkb2luZyBzbyBwcm92aWRlcyk7IGluc3RlYWQsIHdlIHdhcm4gb25seVxuICAvLyBmb3IgY2FzZXMgd2hlcmUgdGhlIHBhcnNlciB3aWxsIGdpdmUgYSBwYXJzZSB0cmVlIGRpZmZlcmluZyBmcm9tIHdoYXQgUmVhY3RcbiAgLy8gaW50ZW5kZWQuIEZvciBleGFtcGxlLCA8Yj48ZGl2PjwvZGl2PjwvYj4gaXMgaW52YWxpZCBidXQgd2UgZG9uJ3Qgd2FyblxuICAvLyBiZWNhdXNlIGl0IHN0aWxsIHBhcnNlcyBjb3JyZWN0bHk7IHdlIGRvIHdhcm4gZm9yIG90aGVyIGNhc2VzIGxpa2UgbmVzdGVkXG4gIC8vIDxwPiB0YWdzIHdoZXJlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlY29uZCBlbGVtZW50IGltcGxpY2l0bHkgY2xvc2VzIHRoZVxuICAvLyBmaXJzdCwgY2F1c2luZyBhIGNvbmZ1c2luZyBtZXNzLlxuICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNzcGVjaWFsXG4gIHZhciBzcGVjaWFsVGFncyA9IFsnYWRkcmVzcycsICdhcHBsZXQnLCAnYXJlYScsICdhcnRpY2xlJywgJ2FzaWRlJywgJ2Jhc2UnLCAnYmFzZWZvbnQnLCAnYmdzb3VuZCcsICdibG9ja3F1b3RlJywgJ2JvZHknLCAnYnInLCAnYnV0dG9uJywgJ2NhcHRpb24nLCAnY2VudGVyJywgJ2NvbCcsICdjb2xncm91cCcsICdkZCcsICdkZXRhaWxzJywgJ2RpcicsICdkaXYnLCAnZGwnLCAnZHQnLCAnZW1iZWQnLCAnZmllbGRzZXQnLCAnZmlnY2FwdGlvbicsICdmaWd1cmUnLCAnZm9vdGVyJywgJ2Zvcm0nLCAnZnJhbWUnLCAnZnJhbWVzZXQnLCAnaDEnLCAnaDInLCAnaDMnLCAnaDQnLCAnaDUnLCAnaDYnLCAnaGVhZCcsICdoZWFkZXInLCAnaGdyb3VwJywgJ2hyJywgJ2h0bWwnLCAnaWZyYW1lJywgJ2ltZycsICdpbnB1dCcsICdpc2luZGV4JywgJ2xpJywgJ2xpbmsnLCAnbGlzdGluZycsICdtYWluJywgJ21hcnF1ZWUnLCAnbWVudScsICdtZW51aXRlbScsICdtZXRhJywgJ25hdicsICdub2VtYmVkJywgJ25vZnJhbWVzJywgJ25vc2NyaXB0JywgJ29iamVjdCcsICdvbCcsICdwJywgJ3BhcmFtJywgJ3BsYWludGV4dCcsICdwcmUnLCAnc2NyaXB0JywgJ3NlY3Rpb24nLCAnc2VsZWN0JywgJ3NvdXJjZScsICdzdHlsZScsICdzdW1tYXJ5JywgJ3RhYmxlJywgJ3Rib2R5JywgJ3RkJywgJ3RlbXBsYXRlJywgJ3RleHRhcmVhJywgJ3Rmb290JywgJ3RoJywgJ3RoZWFkJywgJ3RpdGxlJywgJ3RyJywgJ3RyYWNrJywgJ3VsJywgJ3dicicsICd4bXAnXTsgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaGFzLWFuLWVsZW1lbnQtaW4tc2NvcGVcblxuICB2YXIgaW5TY29wZVRhZ3MgPSBbJ2FwcGxldCcsICdjYXB0aW9uJywgJ2h0bWwnLCAndGFibGUnLCAndGQnLCAndGgnLCAnbWFycXVlZScsICdvYmplY3QnLCAndGVtcGxhdGUnLCAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNodG1sLWludGVncmF0aW9uLXBvaW50XG4gIC8vIFRPRE86IERpc3Rpbmd1aXNoIGJ5IG5hbWVzcGFjZSBoZXJlIC0tIGZvciA8dGl0bGU+LCBpbmNsdWRpbmcgaXQgaGVyZVxuICAvLyBlcnJzIG9uIHRoZSBzaWRlIG9mIGZld2VyIHdhcm5pbmdzXG4gICdmb3JlaWduT2JqZWN0JywgJ2Rlc2MnLCAndGl0bGUnXTsgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaGFzLWFuLWVsZW1lbnQtaW4tYnV0dG9uLXNjb3BlXG5cbiAgdmFyIGJ1dHRvblNjb3BlVGFncyA9IGluU2NvcGVUYWdzLmNvbmNhdChbJ2J1dHRvbiddKTsgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjZ2VuZXJhdGUtaW1wbGllZC1lbmQtdGFnc1xuXG4gIHZhciBpbXBsaWVkRW5kVGFncyA9IFsnZGQnLCAnZHQnLCAnbGknLCAnb3B0aW9uJywgJ29wdGdyb3VwJywgJ3AnLCAncnAnLCAncnQnXTtcbiAgdmFyIGVtcHR5QW5jZXN0b3JJbmZvID0ge1xuICAgIGN1cnJlbnQ6IG51bGwsXG4gICAgZm9ybVRhZzogbnVsbCxcbiAgICBhVGFnSW5TY29wZTogbnVsbCxcbiAgICBidXR0b25UYWdJblNjb3BlOiBudWxsLFxuICAgIG5vYnJUYWdJblNjb3BlOiBudWxsLFxuICAgIHBUYWdJbkJ1dHRvblNjb3BlOiBudWxsLFxuICAgIGxpc3RJdGVtVGFnQXV0b2Nsb3Npbmc6IG51bGwsXG4gICAgZGxJdGVtVGFnQXV0b2Nsb3Npbmc6IG51bGxcbiAgfTtcblxuICB1cGRhdGVkQW5jZXN0b3JJbmZvID0gZnVuY3Rpb24gKG9sZEluZm8sIHRhZykge1xuICAgIHZhciBhbmNlc3RvckluZm8gPSBhc3NpZ24oe30sIG9sZEluZm8gfHwgZW1wdHlBbmNlc3RvckluZm8pO1xuXG4gICAgdmFyIGluZm8gPSB7XG4gICAgICB0YWc6IHRhZ1xuICAgIH07XG5cbiAgICBpZiAoaW5TY29wZVRhZ3MuaW5kZXhPZih0YWcpICE9PSAtMSkge1xuICAgICAgYW5jZXN0b3JJbmZvLmFUYWdJblNjb3BlID0gbnVsbDtcbiAgICAgIGFuY2VzdG9ySW5mby5idXR0b25UYWdJblNjb3BlID0gbnVsbDtcbiAgICAgIGFuY2VzdG9ySW5mby5ub2JyVGFnSW5TY29wZSA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGJ1dHRvblNjb3BlVGFncy5pbmRleE9mKHRhZykgIT09IC0xKSB7XG4gICAgICBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGUgPSBudWxsO1xuICAgIH0gLy8gU2VlIHJ1bGVzIGZvciAnbGknLCAnZGQnLCAnZHQnIHN0YXJ0IHRhZ3MgaW5cbiAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5ib2R5XG5cblxuICAgIGlmIChzcGVjaWFsVGFncy5pbmRleE9mKHRhZykgIT09IC0xICYmIHRhZyAhPT0gJ2FkZHJlc3MnICYmIHRhZyAhPT0gJ2RpdicgJiYgdGFnICE9PSAncCcpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5saXN0SXRlbVRhZ0F1dG9jbG9zaW5nID0gbnVsbDtcbiAgICAgIGFuY2VzdG9ySW5mby5kbEl0ZW1UYWdBdXRvY2xvc2luZyA9IG51bGw7XG4gICAgfVxuXG4gICAgYW5jZXN0b3JJbmZvLmN1cnJlbnQgPSBpbmZvO1xuXG4gICAgaWYgKHRhZyA9PT0gJ2Zvcm0nKSB7XG4gICAgICBhbmNlc3RvckluZm8uZm9ybVRhZyA9IGluZm87XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gJ2EnKSB7XG4gICAgICBhbmNlc3RvckluZm8uYVRhZ0luU2NvcGUgPSBpbmZvO1xuICAgIH1cblxuICAgIGlmICh0YWcgPT09ICdidXR0b24nKSB7XG4gICAgICBhbmNlc3RvckluZm8uYnV0dG9uVGFnSW5TY29wZSA9IGluZm87XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gJ25vYnInKSB7XG4gICAgICBhbmNlc3RvckluZm8ubm9iclRhZ0luU2NvcGUgPSBpbmZvO1xuICAgIH1cblxuICAgIGlmICh0YWcgPT09ICdwJykge1xuICAgICAgYW5jZXN0b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3BlID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAnbGknKSB7XG4gICAgICBhbmNlc3RvckluZm8ubGlzdEl0ZW1UYWdBdXRvY2xvc2luZyA9IGluZm87XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gJ2RkJyB8fCB0YWcgPT09ICdkdCcpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5kbEl0ZW1UYWdBdXRvY2xvc2luZyA9IGluZm87XG4gICAgfVxuXG4gICAgcmV0dXJuIGFuY2VzdG9ySW5mbztcbiAgfTtcbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlclxuICAgKi9cblxuXG4gIHZhciBpc1RhZ1ZhbGlkV2l0aFBhcmVudCA9IGZ1bmN0aW9uICh0YWcsIHBhcmVudFRhZykge1xuICAgIC8vIEZpcnN0LCBsZXQncyBjaGVjayBpZiB3ZSdyZSBpbiBhbiB1bnVzdWFsIHBhcnNpbmcgbW9kZS4uLlxuICAgIHN3aXRjaCAocGFyZW50VGFnKSB7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5zZWxlY3RcbiAgICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdvcHRpb24nIHx8IHRhZyA9PT0gJ29wdGdyb3VwJyB8fCB0YWcgPT09ICcjdGV4dCc7XG5cbiAgICAgIGNhc2UgJ29wdGdyb3VwJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ29wdGlvbicgfHwgdGFnID09PSAnI3RleHQnO1xuICAgICAgLy8gU3RyaWN0bHkgc3BlYWtpbmcsIHNlZWluZyBhbiA8b3B0aW9uPiBkb2Vzbid0IG1lYW4gd2UncmUgaW4gYSA8c2VsZWN0PlxuICAgICAgLy8gYnV0XG5cbiAgICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICcjdGV4dCc7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW50ZFxuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluY2FwdGlvblxuICAgICAgLy8gTm8gc3BlY2lhbCBiZWhhdmlvciBzaW5jZSB0aGVzZSBydWxlcyBmYWxsIGJhY2sgdG8gXCJpbiBib2R5XCIgbW9kZSBmb3JcbiAgICAgIC8vIGFsbCBleGNlcHQgc3BlY2lhbCB0YWJsZSBub2RlcyB3aGljaCBjYXVzZSBiYWQgcGFyc2luZyBiZWhhdmlvciBhbnl3YXkuXG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW50clxuXG4gICAgICBjYXNlICd0cic6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICd0aCcgfHwgdGFnID09PSAndGQnIHx8IHRhZyA9PT0gJ3N0eWxlJyB8fCB0YWcgPT09ICdzY3JpcHQnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnRib2R5XG5cbiAgICAgIGNhc2UgJ3Rib2R5JzpcbiAgICAgIGNhc2UgJ3RoZWFkJzpcbiAgICAgIGNhc2UgJ3Rmb290JzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ3RyJyB8fCB0YWcgPT09ICdzdHlsZScgfHwgdGFnID09PSAnc2NyaXB0JyB8fCB0YWcgPT09ICd0ZW1wbGF0ZSc7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5jb2xncm91cFxuXG4gICAgICBjYXNlICdjb2xncm91cCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdjb2wnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnRhYmxlXG5cbiAgICAgIGNhc2UgJ3RhYmxlJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2NhcHRpb24nIHx8IHRhZyA9PT0gJ2NvbGdyb3VwJyB8fCB0YWcgPT09ICd0Ym9keScgfHwgdGFnID09PSAndGZvb3QnIHx8IHRhZyA9PT0gJ3RoZWFkJyB8fCB0YWcgPT09ICdzdHlsZScgfHwgdGFnID09PSAnc2NyaXB0JyB8fCB0YWcgPT09ICd0ZW1wbGF0ZSc7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5oZWFkXG5cbiAgICAgIGNhc2UgJ2hlYWQnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnYmFzZScgfHwgdGFnID09PSAnYmFzZWZvbnQnIHx8IHRhZyA9PT0gJ2Jnc291bmQnIHx8IHRhZyA9PT0gJ2xpbmsnIHx8IHRhZyA9PT0gJ21ldGEnIHx8IHRhZyA9PT0gJ3RpdGxlJyB8fCB0YWcgPT09ICdub3NjcmlwdCcgfHwgdGFnID09PSAnbm9mcmFtZXMnIHx8IHRhZyA9PT0gJ3N0eWxlJyB8fCB0YWcgPT09ICdzY3JpcHQnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3NlbWFudGljcy5odG1sI3RoZS1odG1sLWVsZW1lbnRcblxuICAgICAgY2FzZSAnaHRtbCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdoZWFkJyB8fCB0YWcgPT09ICdib2R5JyB8fCB0YWcgPT09ICdmcmFtZXNldCc7XG5cbiAgICAgIGNhc2UgJ2ZyYW1lc2V0JzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2ZyYW1lJztcblxuICAgICAgY2FzZSAnI2RvY3VtZW50JzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2h0bWwnO1xuICAgIH0gLy8gUHJvYmFibHkgaW4gdGhlIFwiaW4gYm9keVwiIHBhcnNpbmcgbW9kZSwgc28gd2Ugb3V0bGF3IG9ubHkgdGFnIGNvbWJvc1xuICAgIC8vIHdoZXJlIHRoZSBwYXJzaW5nIHJ1bGVzIGNhdXNlIGltcGxpY2l0IG9wZW5zIG9yIGNsb3NlcyB0byBiZSBhZGRlZC5cbiAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5ib2R5XG5cblxuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlICdoMSc6XG4gICAgICBjYXNlICdoMic6XG4gICAgICBjYXNlICdoMyc6XG4gICAgICBjYXNlICdoNCc6XG4gICAgICBjYXNlICdoNSc6XG4gICAgICBjYXNlICdoNic6XG4gICAgICAgIHJldHVybiBwYXJlbnRUYWcgIT09ICdoMScgJiYgcGFyZW50VGFnICE9PSAnaDInICYmIHBhcmVudFRhZyAhPT0gJ2gzJyAmJiBwYXJlbnRUYWcgIT09ICdoNCcgJiYgcGFyZW50VGFnICE9PSAnaDUnICYmIHBhcmVudFRhZyAhPT0gJ2g2JztcblxuICAgICAgY2FzZSAncnAnOlxuICAgICAgY2FzZSAncnQnOlxuICAgICAgICByZXR1cm4gaW1wbGllZEVuZFRhZ3MuaW5kZXhPZihwYXJlbnRUYWcpID09PSAtMTtcblxuICAgICAgY2FzZSAnYm9keSc6XG4gICAgICBjYXNlICdjYXB0aW9uJzpcbiAgICAgIGNhc2UgJ2NvbCc6XG4gICAgICBjYXNlICdjb2xncm91cCc6XG4gICAgICBjYXNlICdmcmFtZXNldCc6XG4gICAgICBjYXNlICdmcmFtZSc6XG4gICAgICBjYXNlICdoZWFkJzpcbiAgICAgIGNhc2UgJ2h0bWwnOlxuICAgICAgY2FzZSAndGJvZHknOlxuICAgICAgY2FzZSAndGQnOlxuICAgICAgY2FzZSAndGZvb3QnOlxuICAgICAgY2FzZSAndGgnOlxuICAgICAgY2FzZSAndGhlYWQnOlxuICAgICAgY2FzZSAndHInOlxuICAgICAgICAvLyBUaGVzZSB0YWdzIGFyZSBvbmx5IHZhbGlkIHdpdGggYSBmZXcgcGFyZW50cyB0aGF0IGhhdmUgc3BlY2lhbCBjaGlsZFxuICAgICAgICAvLyBwYXJzaW5nIHJ1bGVzIC0tIGlmIHdlJ3JlIGRvd24gaGVyZSwgdGhlbiBub25lIG9mIHRob3NlIG1hdGNoZWQgYW5kXG4gICAgICAgIC8vIHNvIHdlIGFsbG93IGl0IG9ubHkgaWYgd2UgZG9uJ3Qga25vdyB3aGF0IHRoZSBwYXJlbnQgaXMsIGFzIGFsbCBvdGhlclxuICAgICAgICAvLyBjYXNlcyBhcmUgaW52YWxpZC5cbiAgICAgICAgcmV0dXJuIHBhcmVudFRhZyA9PSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyXG4gICAqL1xuXG5cbiAgdmFyIGZpbmRJbnZhbGlkQW5jZXN0b3JGb3JUYWcgPSBmdW5jdGlvbiAodGFnLCBhbmNlc3RvckluZm8pIHtcbiAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgY2FzZSAnYWRkcmVzcyc6XG4gICAgICBjYXNlICdhcnRpY2xlJzpcbiAgICAgIGNhc2UgJ2FzaWRlJzpcbiAgICAgIGNhc2UgJ2Jsb2NrcXVvdGUnOlxuICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgIGNhc2UgJ2RldGFpbHMnOlxuICAgICAgY2FzZSAnZGlhbG9nJzpcbiAgICAgIGNhc2UgJ2Rpcic6XG4gICAgICBjYXNlICdkaXYnOlxuICAgICAgY2FzZSAnZGwnOlxuICAgICAgY2FzZSAnZmllbGRzZXQnOlxuICAgICAgY2FzZSAnZmlnY2FwdGlvbic6XG4gICAgICBjYXNlICdmaWd1cmUnOlxuICAgICAgY2FzZSAnZm9vdGVyJzpcbiAgICAgIGNhc2UgJ2hlYWRlcic6XG4gICAgICBjYXNlICdoZ3JvdXAnOlxuICAgICAgY2FzZSAnbWFpbic6XG4gICAgICBjYXNlICdtZW51JzpcbiAgICAgIGNhc2UgJ25hdic6XG4gICAgICBjYXNlICdvbCc6XG4gICAgICBjYXNlICdwJzpcbiAgICAgIGNhc2UgJ3NlY3Rpb24nOlxuICAgICAgY2FzZSAnc3VtbWFyeSc6XG4gICAgICBjYXNlICd1bCc6XG4gICAgICBjYXNlICdwcmUnOlxuICAgICAgY2FzZSAnbGlzdGluZyc6XG4gICAgICBjYXNlICd0YWJsZSc6XG4gICAgICBjYXNlICdocic6XG4gICAgICBjYXNlICd4bXAnOlxuICAgICAgY2FzZSAnaDEnOlxuICAgICAgY2FzZSAnaDInOlxuICAgICAgY2FzZSAnaDMnOlxuICAgICAgY2FzZSAnaDQnOlxuICAgICAgY2FzZSAnaDUnOlxuICAgICAgY2FzZSAnaDYnOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3BlO1xuXG4gICAgICBjYXNlICdmb3JtJzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5mb3JtVGFnIHx8IGFuY2VzdG9ySW5mby5wVGFnSW5CdXR0b25TY29wZTtcblxuICAgICAgY2FzZSAnbGknOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmxpc3RJdGVtVGFnQXV0b2Nsb3Npbmc7XG5cbiAgICAgIGNhc2UgJ2RkJzpcbiAgICAgIGNhc2UgJ2R0JzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5kbEl0ZW1UYWdBdXRvY2xvc2luZztcblxuICAgICAgY2FzZSAnYnV0dG9uJzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5idXR0b25UYWdJblNjb3BlO1xuXG4gICAgICBjYXNlICdhJzpcbiAgICAgICAgLy8gU3BlYyBzYXlzIHNvbWV0aGluZyBhYm91dCBzdG9yaW5nIGEgbGlzdCBvZiBtYXJrZXJzLCBidXQgaXQgc291bmRzXG4gICAgICAgIC8vIGVxdWl2YWxlbnQgdG8gdGhpcyBjaGVjay5cbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5hVGFnSW5TY29wZTtcblxuICAgICAgY2FzZSAnbm9icic6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8ubm9iclRhZ0luU2NvcGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgdmFyIGRpZFdhcm4kMSA9IHt9O1xuXG4gIHZhbGlkYXRlRE9NTmVzdGluZyA9IGZ1bmN0aW9uIChjaGlsZFRhZywgY2hpbGRUZXh0LCBhbmNlc3RvckluZm8pIHtcbiAgICBhbmNlc3RvckluZm8gPSBhbmNlc3RvckluZm8gfHwgZW1wdHlBbmNlc3RvckluZm87XG4gICAgdmFyIHBhcmVudEluZm8gPSBhbmNlc3RvckluZm8uY3VycmVudDtcbiAgICB2YXIgcGFyZW50VGFnID0gcGFyZW50SW5mbyAmJiBwYXJlbnRJbmZvLnRhZztcblxuICAgIGlmIChjaGlsZFRleHQgIT0gbnVsbCkge1xuICAgICAgaWYgKGNoaWxkVGFnICE9IG51bGwpIHtcbiAgICAgICAgZXJyb3IoJ3ZhbGlkYXRlRE9NTmVzdGluZzogd2hlbiBjaGlsZFRleHQgaXMgcGFzc2VkLCBjaGlsZFRhZyBzaG91bGQgYmUgbnVsbCcpO1xuICAgICAgfVxuXG4gICAgICBjaGlsZFRhZyA9ICcjdGV4dCc7XG4gICAgfVxuXG4gICAgdmFyIGludmFsaWRQYXJlbnQgPSBpc1RhZ1ZhbGlkV2l0aFBhcmVudChjaGlsZFRhZywgcGFyZW50VGFnKSA/IG51bGwgOiBwYXJlbnRJbmZvO1xuICAgIHZhciBpbnZhbGlkQW5jZXN0b3IgPSBpbnZhbGlkUGFyZW50ID8gbnVsbCA6IGZpbmRJbnZhbGlkQW5jZXN0b3JGb3JUYWcoY2hpbGRUYWcsIGFuY2VzdG9ySW5mbyk7XG4gICAgdmFyIGludmFsaWRQYXJlbnRPckFuY2VzdG9yID0gaW52YWxpZFBhcmVudCB8fCBpbnZhbGlkQW5jZXN0b3I7XG5cbiAgICBpZiAoIWludmFsaWRQYXJlbnRPckFuY2VzdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGFuY2VzdG9yVGFnID0gaW52YWxpZFBhcmVudE9yQW5jZXN0b3IudGFnO1xuICAgIHZhciB3YXJuS2V5ID0gISFpbnZhbGlkUGFyZW50ICsgJ3wnICsgY2hpbGRUYWcgKyAnfCcgKyBhbmNlc3RvclRhZztcblxuICAgIGlmIChkaWRXYXJuJDFbd2FybktleV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuJDFbd2FybktleV0gPSB0cnVlO1xuICAgIHZhciB0YWdEaXNwbGF5TmFtZSA9IGNoaWxkVGFnO1xuICAgIHZhciB3aGl0ZXNwYWNlSW5mbyA9ICcnO1xuXG4gICAgaWYgKGNoaWxkVGFnID09PSAnI3RleHQnKSB7XG4gICAgICBpZiAoL1xcUy8udGVzdChjaGlsZFRleHQpKSB7XG4gICAgICAgIHRhZ0Rpc3BsYXlOYW1lID0gJ1RleHQgbm9kZXMnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFnRGlzcGxheU5hbWUgPSAnV2hpdGVzcGFjZSB0ZXh0IG5vZGVzJztcbiAgICAgICAgd2hpdGVzcGFjZUluZm8gPSBcIiBNYWtlIHN1cmUgeW91IGRvbid0IGhhdmUgYW55IGV4dHJhIHdoaXRlc3BhY2UgYmV0d2VlbiB0YWdzIG9uIFwiICsgJ2VhY2ggbGluZSBvZiB5b3VyIHNvdXJjZSBjb2RlLic7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhZ0Rpc3BsYXlOYW1lID0gJzwnICsgY2hpbGRUYWcgKyAnPic7XG4gICAgfVxuXG4gICAgaWYgKGludmFsaWRQYXJlbnQpIHtcbiAgICAgIHZhciBpbmZvID0gJyc7XG5cbiAgICAgIGlmIChhbmNlc3RvclRhZyA9PT0gJ3RhYmxlJyAmJiBjaGlsZFRhZyA9PT0gJ3RyJykge1xuICAgICAgICBpbmZvICs9ICcgQWRkIGEgPHRib2R5PiwgPHRoZWFkPiBvciA8dGZvb3Q+IHRvIHlvdXIgY29kZSB0byBtYXRjaCB0aGUgRE9NIHRyZWUgZ2VuZXJhdGVkIGJ5ICcgKyAndGhlIGJyb3dzZXIuJztcbiAgICAgIH1cblxuICAgICAgZXJyb3IoJ3ZhbGlkYXRlRE9NTmVzdGluZyguLi4pOiAlcyBjYW5ub3QgYXBwZWFyIGFzIGEgY2hpbGQgb2YgPCVzPi4lcyVzJywgdGFnRGlzcGxheU5hbWUsIGFuY2VzdG9yVGFnLCB3aGl0ZXNwYWNlSW5mbywgaW5mbyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVycm9yKCd2YWxpZGF0ZURPTU5lc3RpbmcoLi4uKTogJXMgY2Fubm90IGFwcGVhciBhcyBhIGRlc2NlbmRhbnQgb2YgJyArICc8JXM+LicsIHRhZ0Rpc3BsYXlOYW1lLCBhbmNlc3RvclRhZyk7XG4gICAgfVxuICB9O1xufVxuXG52YXIgU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkckMSA9ICdzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcnO1xudmFyIFNVU1BFTlNFX1NUQVJUX0RBVEEgPSAnJCc7XG52YXIgU1VTUEVOU0VfRU5EX0RBVEEgPSAnLyQnO1xudmFyIFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSA9ICckPyc7XG52YXIgU1VTUEVOU0VfRkFMTEJBQ0tfU1RBUlRfREFUQSA9ICckISc7XG52YXIgU1RZTEUkMSA9ICdzdHlsZSc7XG52YXIgZXZlbnRzRW5hYmxlZCA9IG51bGw7XG52YXIgc2VsZWN0aW9uSW5mb3JtYXRpb24gPSBudWxsO1xuZnVuY3Rpb24gZ2V0Um9vdEhvc3RDb250ZXh0KHJvb3RDb250YWluZXJJbnN0YW5jZSkge1xuICB2YXIgdHlwZTtcbiAgdmFyIG5hbWVzcGFjZTtcbiAgdmFyIG5vZGVUeXBlID0gcm9vdENvbnRhaW5lckluc3RhbmNlLm5vZGVUeXBlO1xuXG4gIHN3aXRjaCAobm9kZVR5cGUpIHtcbiAgICBjYXNlIERPQ1VNRU5UX05PREU6XG4gICAgY2FzZSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFOlxuICAgICAge1xuICAgICAgICB0eXBlID0gbm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgPyAnI2RvY3VtZW50JyA6ICcjZnJhZ21lbnQnO1xuICAgICAgICB2YXIgcm9vdCA9IHJvb3RDb250YWluZXJJbnN0YW5jZS5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgIG5hbWVzcGFjZSA9IHJvb3QgPyByb290Lm5hbWVzcGFjZVVSSSA6IGdldENoaWxkTmFtZXNwYWNlKG51bGwsICcnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICB2YXIgY29udGFpbmVyID0gbm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSA/IHJvb3RDb250YWluZXJJbnN0YW5jZS5wYXJlbnROb2RlIDogcm9vdENvbnRhaW5lckluc3RhbmNlO1xuICAgICAgICB2YXIgb3duTmFtZXNwYWNlID0gY29udGFpbmVyLm5hbWVzcGFjZVVSSSB8fCBudWxsO1xuICAgICAgICB0eXBlID0gY29udGFpbmVyLnRhZ05hbWU7XG4gICAgICAgIG5hbWVzcGFjZSA9IGdldENoaWxkTmFtZXNwYWNlKG93bk5hbWVzcGFjZSwgdHlwZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG5cbiAge1xuICAgIHZhciB2YWxpZGF0ZWRUYWcgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIGFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm8obnVsbCwgdmFsaWRhdGVkVGFnKTtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZXNwYWNlOiBuYW1lc3BhY2UsXG4gICAgICBhbmNlc3RvckluZm86IGFuY2VzdG9ySW5mb1xuICAgIH07XG4gIH1cbn1cbmZ1bmN0aW9uIGdldENoaWxkSG9zdENvbnRleHQocGFyZW50SG9zdENvbnRleHQsIHR5cGUsIHJvb3RDb250YWluZXJJbnN0YW5jZSkge1xuICB7XG4gICAgdmFyIHBhcmVudEhvc3RDb250ZXh0RGV2ID0gcGFyZW50SG9zdENvbnRleHQ7XG4gICAgdmFyIG5hbWVzcGFjZSA9IGdldENoaWxkTmFtZXNwYWNlKHBhcmVudEhvc3RDb250ZXh0RGV2Lm5hbWVzcGFjZSwgdHlwZSk7XG4gICAgdmFyIGFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm8ocGFyZW50SG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvLCB0eXBlKTtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZXNwYWNlOiBuYW1lc3BhY2UsXG4gICAgICBhbmNlc3RvckluZm86IGFuY2VzdG9ySW5mb1xuICAgIH07XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFB1YmxpY0luc3RhbmNlKGluc3RhbmNlKSB7XG4gIHJldHVybiBpbnN0YW5jZTtcbn1cbmZ1bmN0aW9uIHByZXBhcmVGb3JDb21taXQoY29udGFpbmVySW5mbykge1xuICBldmVudHNFbmFibGVkID0gaXNFbmFibGVkKCk7XG4gIHNlbGVjdGlvbkluZm9ybWF0aW9uID0gZ2V0U2VsZWN0aW9uSW5mb3JtYXRpb24oKTtcbiAgdmFyIGFjdGl2ZUluc3RhbmNlID0gbnVsbDtcblxuICBzZXRFbmFibGVkKGZhbHNlKTtcbiAgcmV0dXJuIGFjdGl2ZUluc3RhbmNlO1xufVxuZnVuY3Rpb24gcmVzZXRBZnRlckNvbW1pdChjb250YWluZXJJbmZvKSB7XG4gIHJlc3RvcmVTZWxlY3Rpb24oc2VsZWN0aW9uSW5mb3JtYXRpb24pO1xuICBzZXRFbmFibGVkKGV2ZW50c0VuYWJsZWQpO1xuICBldmVudHNFbmFibGVkID0gbnVsbDtcbiAgc2VsZWN0aW9uSW5mb3JtYXRpb24gPSBudWxsO1xufVxuZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2UodHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQsIGludGVybmFsSW5zdGFuY2VIYW5kbGUpIHtcbiAgdmFyIHBhcmVudE5hbWVzcGFjZTtcblxuICB7XG4gICAgLy8gVE9ETzogdGFrZSBuYW1lc3BhY2UgaW50byBhY2NvdW50IHdoZW4gdmFsaWRhdGluZy5cbiAgICB2YXIgaG9zdENvbnRleHREZXYgPSBob3N0Q29udGV4dDtcbiAgICB2YWxpZGF0ZURPTU5lc3RpbmcodHlwZSwgbnVsbCwgaG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvKTtcblxuICAgIGlmICh0eXBlb2YgcHJvcHMuY2hpbGRyZW4gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ251bWJlcicpIHtcbiAgICAgIHZhciBzdHJpbmcgPSAnJyArIHByb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIG93bkFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm8oaG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvLCB0eXBlKTtcbiAgICAgIHZhbGlkYXRlRE9NTmVzdGluZyhudWxsLCBzdHJpbmcsIG93bkFuY2VzdG9ySW5mbyk7XG4gICAgfVxuXG4gICAgcGFyZW50TmFtZXNwYWNlID0gaG9zdENvbnRleHREZXYubmFtZXNwYWNlO1xuICB9XG5cbiAgdmFyIGRvbUVsZW1lbnQgPSBjcmVhdGVFbGVtZW50KHR5cGUsIHByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIHBhcmVudE5hbWVzcGFjZSk7XG4gIHByZWNhY2hlRmliZXJOb2RlKGludGVybmFsSW5zdGFuY2VIYW5kbGUsIGRvbUVsZW1lbnQpO1xuICB1cGRhdGVGaWJlclByb3BzKGRvbUVsZW1lbnQsIHByb3BzKTtcbiAgcmV0dXJuIGRvbUVsZW1lbnQ7XG59XG5mdW5jdGlvbiBhcHBlbmRJbml0aWFsQ2hpbGQocGFyZW50SW5zdGFuY2UsIGNoaWxkKSB7XG4gIHBhcmVudEluc3RhbmNlLmFwcGVuZENoaWxkKGNoaWxkKTtcbn1cbmZ1bmN0aW9uIGZpbmFsaXplSW5pdGlhbENoaWxkcmVuKGRvbUVsZW1lbnQsIHR5cGUsIHByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0KSB7XG4gIHNldEluaXRpYWxQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHR5cGUsIHByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UpO1xuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ2J1dHRvbic6XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgcmV0dXJuICEhcHJvcHMuYXV0b0ZvY3VzO1xuXG4gICAgY2FzZSAnaW1nJzpcbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gcHJlcGFyZVVwZGF0ZShkb21FbGVtZW50LCB0eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQpIHtcbiAge1xuICAgIHZhciBob3N0Q29udGV4dERldiA9IGhvc3RDb250ZXh0O1xuXG4gICAgaWYgKHR5cGVvZiBuZXdQcm9wcy5jaGlsZHJlbiAhPT0gdHlwZW9mIG9sZFByb3BzLmNoaWxkcmVuICYmICh0eXBlb2YgbmV3UHJvcHMuY2hpbGRyZW4gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBuZXdQcm9wcy5jaGlsZHJlbiA9PT0gJ251bWJlcicpKSB7XG4gICAgICB2YXIgc3RyaW5nID0gJycgKyBuZXdQcm9wcy5jaGlsZHJlbjtcbiAgICAgIHZhciBvd25BbmNlc3RvckluZm8gPSB1cGRhdGVkQW5jZXN0b3JJbmZvKGhvc3RDb250ZXh0RGV2LmFuY2VzdG9ySW5mbywgdHlwZSk7XG4gICAgICB2YWxpZGF0ZURPTU5lc3RpbmcobnVsbCwgc3RyaW5nLCBvd25BbmNlc3RvckluZm8pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkaWZmUHJvcGVydGllcyhkb21FbGVtZW50LCB0eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMpO1xufVxuZnVuY3Rpb24gc2hvdWxkU2V0VGV4dENvbnRlbnQodHlwZSwgcHJvcHMpIHtcbiAgcmV0dXJuIHR5cGUgPT09ICd0ZXh0YXJlYScgfHwgdHlwZSA9PT0gJ25vc2NyaXB0JyB8fCB0eXBlb2YgcHJvcHMuY2hpbGRyZW4gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MID09PSAnb2JqZWN0JyAmJiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAhPT0gbnVsbCAmJiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTC5fX2h0bWwgIT0gbnVsbDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVRleHRJbnN0YW5jZSh0ZXh0LCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0LCBpbnRlcm5hbEluc3RhbmNlSGFuZGxlKSB7XG4gIHtcbiAgICB2YXIgaG9zdENvbnRleHREZXYgPSBob3N0Q29udGV4dDtcbiAgICB2YWxpZGF0ZURPTU5lc3RpbmcobnVsbCwgdGV4dCwgaG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvKTtcbiAgfVxuXG4gIHZhciB0ZXh0Tm9kZSA9IGNyZWF0ZVRleHROb2RlKHRleHQsIHJvb3RDb250YWluZXJJbnN0YW5jZSk7XG4gIHByZWNhY2hlRmliZXJOb2RlKGludGVybmFsSW5zdGFuY2VIYW5kbGUsIHRleHROb2RlKTtcbiAgcmV0dXJuIHRleHROb2RlO1xufVxuZnVuY3Rpb24gZ2V0Q3VycmVudEV2ZW50UHJpb3JpdHkoKSB7XG4gIHZhciBjdXJyZW50RXZlbnQgPSB3aW5kb3cuZXZlbnQ7XG5cbiAgaWYgKGN1cnJlbnRFdmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIERlZmF1bHRFdmVudFByaW9yaXR5O1xuICB9XG5cbiAgcmV0dXJuIGdldEV2ZW50UHJpb3JpdHkoY3VycmVudEV2ZW50LnR5cGUpO1xufVxuLy8gaWYgYSBjb21wb25lbnQganVzdCBpbXBvcnRzIFJlYWN0RE9NIChlLmcuIGZvciBmaW5kRE9NTm9kZSkuXG4vLyBTb21lIGVudmlyb25tZW50cyBtaWdodCBub3QgaGF2ZSBzZXRUaW1lb3V0IG9yIGNsZWFyVGltZW91dC5cblxudmFyIHNjaGVkdWxlVGltZW91dCA9IHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nID8gc2V0VGltZW91dCA6IHVuZGVmaW5lZDtcbnZhciBjYW5jZWxUaW1lb3V0ID0gdHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJyA/IGNsZWFyVGltZW91dCA6IHVuZGVmaW5lZDtcbnZhciBub1RpbWVvdXQgPSAtMTtcbnZhciBsb2NhbFByb21pc2UgPSB0eXBlb2YgUHJvbWlzZSA9PT0gJ2Z1bmN0aW9uJyA/IFByb21pc2UgOiB1bmRlZmluZWQ7IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS1cbnZhciBzY2hlZHVsZU1pY3JvdGFzayA9IHR5cGVvZiBxdWV1ZU1pY3JvdGFzayA9PT0gJ2Z1bmN0aW9uJyA/IHF1ZXVlTWljcm90YXNrIDogdHlwZW9mIGxvY2FsUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgPyBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgcmV0dXJuIGxvY2FsUHJvbWlzZS5yZXNvbHZlKG51bGwpLnRoZW4oY2FsbGJhY2spLmNhdGNoKGhhbmRsZUVycm9ySW5OZXh0VGljayk7XG59IDogc2NoZWR1bGVUaW1lb3V0OyAvLyBUT0RPOiBEZXRlcm1pbmUgdGhlIGJlc3QgZmFsbGJhY2sgaGVyZS5cblxuZnVuY3Rpb24gaGFuZGxlRXJyb3JJbk5leHRUaWNrKGVycm9yKSB7XG4gIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIHRocm93IGVycm9yO1xuICB9KTtcbn0gLy8gLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gY29tbWl0TW91bnQoZG9tRWxlbWVudCwgdHlwZSwgbmV3UHJvcHMsIGludGVybmFsSW5zdGFuY2VIYW5kbGUpIHtcbiAgLy8gRGVzcGl0ZSB0aGUgbmFtaW5nIHRoYXQgbWlnaHQgaW1wbHkgb3RoZXJ3aXNlLCB0aGlzIG1ldGhvZCBvbmx5XG4gIC8vIGZpcmVzIGlmIHRoZXJlIGlzIGFuIGBVcGRhdGVgIGVmZmVjdCBzY2hlZHVsZWQgZHVyaW5nIG1vdW50aW5nLlxuICAvLyBUaGlzIGhhcHBlbnMgaWYgYGZpbmFsaXplSW5pdGlhbENoaWxkcmVuYCByZXR1cm5zIGB0cnVlYCAod2hpY2ggaXRcbiAgLy8gZG9lcyB0byBpbXBsZW1lbnQgdGhlIGBhdXRvRm9jdXNgIGF0dHJpYnV0ZSBvbiB0aGUgY2xpZW50KS4gQnV0XG4gIC8vIHRoZXJlIGFyZSBhbHNvIG90aGVyIGNhc2VzIHdoZW4gdGhpcyBtaWdodCBoYXBwZW4gKHN1Y2ggYXMgcGF0Y2hpbmdcbiAgLy8gdXAgdGV4dCBjb250ZW50IGR1cmluZyBoeWRyYXRpb24gbWlzbWF0Y2gpLiBTbyB3ZSdsbCBjaGVjayB0aGlzIGFnYWluLlxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdidXR0b24nOlxuICAgIGNhc2UgJ2lucHV0JzpcbiAgICBjYXNlICdzZWxlY3QnOlxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIGlmIChuZXdQcm9wcy5hdXRvRm9jdXMpIHtcbiAgICAgICAgZG9tRWxlbWVudC5mb2N1cygpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG5cbiAgICBjYXNlICdpbWcnOlxuICAgICAge1xuICAgICAgICBpZiAobmV3UHJvcHMuc3JjKSB7XG4gICAgICAgICAgZG9tRWxlbWVudC5zcmMgPSBuZXdQcm9wcy5zcmM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNvbW1pdFVwZGF0ZShkb21FbGVtZW50LCB1cGRhdGVQYXlsb2FkLCB0eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMsIGludGVybmFsSW5zdGFuY2VIYW5kbGUpIHtcbiAgLy8gQXBwbHkgdGhlIGRpZmYgdG8gdGhlIERPTSBub2RlLlxuICB1cGRhdGVQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHVwZGF0ZVBheWxvYWQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcyk7IC8vIFVwZGF0ZSB0aGUgcHJvcHMgaGFuZGxlIHNvIHRoYXQgd2Uga25vdyB3aGljaCBwcm9wcyBhcmUgdGhlIG9uZXMgd2l0aFxuICAvLyB3aXRoIGN1cnJlbnQgZXZlbnQgaGFuZGxlcnMuXG5cbiAgdXBkYXRlRmliZXJQcm9wcyhkb21FbGVtZW50LCBuZXdQcm9wcyk7XG59XG5mdW5jdGlvbiByZXNldFRleHRDb250ZW50KGRvbUVsZW1lbnQpIHtcbiAgc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCwgJycpO1xufVxuZnVuY3Rpb24gY29tbWl0VGV4dFVwZGF0ZSh0ZXh0SW5zdGFuY2UsIG9sZFRleHQsIG5ld1RleHQpIHtcbiAgdGV4dEluc3RhbmNlLm5vZGVWYWx1ZSA9IG5ld1RleHQ7XG59XG5mdW5jdGlvbiBhcHBlbmRDaGlsZChwYXJlbnRJbnN0YW5jZSwgY2hpbGQpIHtcbiAgcGFyZW50SW5zdGFuY2UuYXBwZW5kQ2hpbGQoY2hpbGQpO1xufVxuZnVuY3Rpb24gYXBwZW5kQ2hpbGRUb0NvbnRhaW5lcihjb250YWluZXIsIGNoaWxkKSB7XG4gIHZhciBwYXJlbnROb2RlO1xuXG4gIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgIHBhcmVudE5vZGUgPSBjb250YWluZXIucGFyZW50Tm9kZTtcbiAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZCwgY29udGFpbmVyKTtcbiAgfSBlbHNlIHtcbiAgICBwYXJlbnROb2RlID0gY29udGFpbmVyO1xuICAgIHBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICB9IC8vIFRoaXMgY29udGFpbmVyIG1pZ2h0IGJlIHVzZWQgZm9yIGEgcG9ydGFsLlxuICAvLyBJZiBzb21ldGhpbmcgaW5zaWRlIGEgcG9ydGFsIGlzIGNsaWNrZWQsIHRoYXQgY2xpY2sgc2hvdWxkIGJ1YmJsZVxuICAvLyB0aHJvdWdoIHRoZSBSZWFjdCB0cmVlLiBIb3dldmVyLCBvbiBNb2JpbGUgU2FmYXJpIHRoZSBjbGljayB3b3VsZFxuICAvLyBuZXZlciBidWJibGUgdGhyb3VnaCB0aGUgKkRPTSogdHJlZSB1bmxlc3MgYW4gYW5jZXN0b3Igd2l0aCBvbmNsaWNrXG4gIC8vIGV2ZW50IGV4aXN0cy4gU28gd2Ugd291bGRuJ3Qgc2VlIGl0IGFuZCBkaXNwYXRjaCBpdC5cbiAgLy8gVGhpcyBpcyB3aHkgd2UgZW5zdXJlIHRoYXQgbm9uIFJlYWN0IHJvb3QgY29udGFpbmVycyBoYXZlIGlubGluZSBvbmNsaWNrXG4gIC8vIGRlZmluZWQuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTE5MThcblxuXG4gIHZhciByZWFjdFJvb3RDb250YWluZXIgPSBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lcjtcblxuICBpZiAoKHJlYWN0Um9vdENvbnRhaW5lciA9PT0gbnVsbCB8fCByZWFjdFJvb3RDb250YWluZXIgPT09IHVuZGVmaW5lZCkgJiYgcGFyZW50Tm9kZS5vbmNsaWNrID09PSBudWxsKSB7XG4gICAgLy8gVE9ETzogVGhpcyBjYXN0IG1heSBub3QgYmUgc291bmQgZm9yIFNWRywgTWF0aE1MIG9yIGN1c3RvbSBlbGVtZW50cy5cbiAgICB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChwYXJlbnROb2RlKTtcbiAgfVxufVxuZnVuY3Rpb24gaW5zZXJ0QmVmb3JlKHBhcmVudEluc3RhbmNlLCBjaGlsZCwgYmVmb3JlQ2hpbGQpIHtcbiAgcGFyZW50SW5zdGFuY2UuaW5zZXJ0QmVmb3JlKGNoaWxkLCBiZWZvcmVDaGlsZCk7XG59XG5mdW5jdGlvbiBpbnNlcnRJbkNvbnRhaW5lckJlZm9yZShjb250YWluZXIsIGNoaWxkLCBiZWZvcmVDaGlsZCkge1xuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICBjb250YWluZXIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2hpbGQsIGJlZm9yZUNoaWxkKTtcbiAgfSBlbHNlIHtcbiAgICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKGNoaWxkLCBiZWZvcmVDaGlsZCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlQ2hpbGQocGFyZW50SW5zdGFuY2UsIGNoaWxkKSB7XG4gIHBhcmVudEluc3RhbmNlLnJlbW92ZUNoaWxkKGNoaWxkKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZUNoaWxkRnJvbUNvbnRhaW5lcihjb250YWluZXIsIGNoaWxkKSB7XG4gIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgIGNvbnRhaW5lci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNoaWxkKTtcbiAgfSBlbHNlIHtcbiAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQoY2hpbGQpO1xuICB9XG59XG5mdW5jdGlvbiBjbGVhclN1c3BlbnNlQm91bmRhcnkocGFyZW50SW5zdGFuY2UsIHN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgdmFyIG5vZGUgPSBzdXNwZW5zZUluc3RhbmNlOyAvLyBEZWxldGUgYWxsIG5vZGVzIHdpdGhpbiB0aGlzIHN1c3BlbnNlIGJvdW5kYXJ5LlxuICAvLyBUaGVyZSBtaWdodCBiZSBuZXN0ZWQgbm9kZXMgc28gd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIGhvd1xuICAvLyBkZWVwIHdlIGFyZSBhbmQgb25seSBicmVhayBvdXQgd2hlbiB3ZSdyZSBiYWNrIG9uIHRvcC5cblxuICB2YXIgZGVwdGggPSAwO1xuXG4gIGRvIHtcbiAgICB2YXIgbmV4dE5vZGUgPSBub2RlLm5leHRTaWJsaW5nO1xuICAgIHBhcmVudEluc3RhbmNlLnJlbW92ZUNoaWxkKG5vZGUpO1xuXG4gICAgaWYgKG5leHROb2RlICYmIG5leHROb2RlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICAgIHZhciBkYXRhID0gbmV4dE5vZGUuZGF0YTtcblxuICAgICAgaWYgKGRhdGEgPT09IFNVU1BFTlNFX0VORF9EQVRBKSB7XG4gICAgICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgICAgIHBhcmVudEluc3RhbmNlLnJlbW92ZUNoaWxkKG5leHROb2RlKTsgLy8gUmV0cnkgaWYgYW55IGV2ZW50IHJlcGxheWluZyB3YXMgYmxvY2tlZCBvbiB0aGlzLlxuXG4gICAgICAgICAgcmV0cnlJZkJsb2NrZWRPbihzdXNwZW5zZUluc3RhbmNlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkYXRhID09PSBTVVNQRU5TRV9TVEFSVF9EQVRBIHx8IGRhdGEgPT09IFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBKSB7XG4gICAgICAgIGRlcHRoKys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbm9kZSA9IG5leHROb2RlO1xuICB9IHdoaWxlIChub2RlKTsgLy8gVE9ETzogV2Fybiwgd2UgZGlkbid0IGZpbmQgdGhlIGVuZCBjb21tZW50IGJvdW5kYXJ5LlxuICAvLyBSZXRyeSBpZiBhbnkgZXZlbnQgcmVwbGF5aW5nIHdhcyBibG9ja2VkIG9uIHRoaXMuXG5cblxuICByZXRyeUlmQmxvY2tlZE9uKHN1c3BlbnNlSW5zdGFuY2UpO1xufVxuZnVuY3Rpb24gY2xlYXJTdXNwZW5zZUJvdW5kYXJ5RnJvbUNvbnRhaW5lcihjb250YWluZXIsIHN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgY2xlYXJTdXNwZW5zZUJvdW5kYXJ5KGNvbnRhaW5lci5wYXJlbnROb2RlLCBzdXNwZW5zZUluc3RhbmNlKTtcbiAgfSBlbHNlIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgIGNsZWFyU3VzcGVuc2VCb3VuZGFyeShjb250YWluZXIsIHN1c3BlbnNlSW5zdGFuY2UpO1xuICB9IC8vIFJldHJ5IGlmIGFueSBldmVudCByZXBsYXlpbmcgd2FzIGJsb2NrZWQgb24gdGhpcy5cblxuXG4gIHJldHJ5SWZCbG9ja2VkT24oY29udGFpbmVyKTtcbn1cbmZ1bmN0aW9uIGhpZGVJbnN0YW5jZShpbnN0YW5jZSkge1xuICAvLyBUT0RPOiBEb2VzIHRoaXMgd29yayBmb3IgYWxsIGVsZW1lbnQgdHlwZXM/IFdoYXQgYWJvdXQgTWF0aE1MPyBTaG91bGQgd2VcbiAgLy8gcGFzcyBob3N0IGNvbnRleHQgdG8gdGhpcyBtZXRob2Q/XG4gIGluc3RhbmNlID0gaW5zdGFuY2U7XG4gIHZhciBzdHlsZSA9IGluc3RhbmNlLnN0eWxlO1xuXG4gIGlmICh0eXBlb2Ygc3R5bGUuc2V0UHJvcGVydHkgPT09ICdmdW5jdGlvbicpIHtcbiAgICBzdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsICdub25lJywgJ2ltcG9ydGFudCcpO1xuICB9IGVsc2Uge1xuICAgIHN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH1cbn1cbmZ1bmN0aW9uIGhpZGVUZXh0SW5zdGFuY2UodGV4dEluc3RhbmNlKSB7XG4gIHRleHRJbnN0YW5jZS5ub2RlVmFsdWUgPSAnJztcbn1cbmZ1bmN0aW9uIHVuaGlkZUluc3RhbmNlKGluc3RhbmNlLCBwcm9wcykge1xuICBpbnN0YW5jZSA9IGluc3RhbmNlO1xuICB2YXIgc3R5bGVQcm9wID0gcHJvcHNbU1RZTEUkMV07XG4gIHZhciBkaXNwbGF5ID0gc3R5bGVQcm9wICE9PSB1bmRlZmluZWQgJiYgc3R5bGVQcm9wICE9PSBudWxsICYmIHN0eWxlUHJvcC5oYXNPd25Qcm9wZXJ0eSgnZGlzcGxheScpID8gc3R5bGVQcm9wLmRpc3BsYXkgOiBudWxsO1xuICBpbnN0YW5jZS5zdHlsZS5kaXNwbGF5ID0gZGFuZ2Vyb3VzU3R5bGVWYWx1ZSgnZGlzcGxheScsIGRpc3BsYXkpO1xufVxuZnVuY3Rpb24gdW5oaWRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSwgdGV4dCkge1xuICB0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlID0gdGV4dDtcbn1cbmZ1bmN0aW9uIGNsZWFyQ29udGFpbmVyKGNvbnRhaW5lcikge1xuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICBjb250YWluZXIudGV4dENvbnRlbnQgPSAnJztcbiAgfSBlbHNlIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUpIHtcbiAgICBpZiAoY29udGFpbmVyLmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKGNvbnRhaW5lci5kb2N1bWVudEVsZW1lbnQpO1xuICAgIH1cbiAgfVxufSAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBjYW5IeWRyYXRlSW5zdGFuY2UoaW5zdGFuY2UsIHR5cGUsIHByb3BzKSB7XG4gIGlmIChpbnN0YW5jZS5ub2RlVHlwZSAhPT0gRUxFTUVOVF9OT0RFIHx8IHR5cGUudG9Mb3dlckNhc2UoKSAhPT0gaW5zdGFuY2Uubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9IC8vIFRoaXMgaGFzIG5vdyBiZWVuIHJlZmluZWQgdG8gYW4gZWxlbWVudCBub2RlLlxuXG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuZnVuY3Rpb24gY2FuSHlkcmF0ZVRleHRJbnN0YW5jZShpbnN0YW5jZSwgdGV4dCkge1xuICBpZiAodGV4dCA9PT0gJycgfHwgaW5zdGFuY2Uubm9kZVR5cGUgIT09IFRFWFRfTk9ERSkge1xuICAgIC8vIEVtcHR5IHN0cmluZ3MgYXJlIG5vdCBwYXJzZWQgYnkgSFRNTCBzbyB0aGVyZSB3b24ndCBiZSBhIGNvcnJlY3QgbWF0Y2ggaGVyZS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBUaGlzIGhhcyBub3cgYmVlbiByZWZpbmVkIHRvIGEgdGV4dCBub2RlLlxuXG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuZnVuY3Rpb24gY2FuSHlkcmF0ZVN1c3BlbnNlSW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgaWYgKGluc3RhbmNlLm5vZGVUeXBlICE9PSBDT01NRU5UX05PREUpIHtcbiAgICAvLyBFbXB0eSBzdHJpbmdzIGFyZSBub3QgcGFyc2VkIGJ5IEhUTUwgc28gdGhlcmUgd29uJ3QgYmUgYSBjb3JyZWN0IG1hdGNoIGhlcmUuXG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLy8gVGhpcyBoYXMgbm93IGJlZW4gcmVmaW5lZCB0byBhIHN1c3BlbnNlIG5vZGUuXG5cblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5mdW5jdGlvbiBpc1N1c3BlbnNlSW5zdGFuY2VQZW5kaW5nKGluc3RhbmNlKSB7XG4gIHJldHVybiBpbnN0YW5jZS5kYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEE7XG59XG5mdW5jdGlvbiBpc1N1c3BlbnNlSW5zdGFuY2VGYWxsYmFjayhpbnN0YW5jZSkge1xuICByZXR1cm4gaW5zdGFuY2UuZGF0YSA9PT0gU1VTUEVOU0VfRkFMTEJBQ0tfU1RBUlRfREFUQTtcbn1cbmZ1bmN0aW9uIGdldFN1c3BlbnNlSW5zdGFuY2VGYWxsYmFja0Vycm9yRGV0YWlscyhpbnN0YW5jZSkge1xuICB2YXIgZGF0YXNldCA9IGluc3RhbmNlLm5leHRTaWJsaW5nICYmIGluc3RhbmNlLm5leHRTaWJsaW5nLmRhdGFzZXQ7XG4gIHZhciBkaWdlc3QsIG1lc3NhZ2UsIHN0YWNrO1xuXG4gIGlmIChkYXRhc2V0KSB7XG4gICAgZGlnZXN0ID0gZGF0YXNldC5kZ3N0O1xuXG4gICAge1xuICAgICAgbWVzc2FnZSA9IGRhdGFzZXQubXNnO1xuICAgICAgc3RhY2sgPSBkYXRhc2V0LnN0Y2s7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIHJldHVybiB7XG4gICAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgICAgZGlnZXN0OiBkaWdlc3QsXG4gICAgICBzdGFjazogc3RhY2tcbiAgICB9O1xuICB9IC8vIGxldCB2YWx1ZSA9IHttZXNzYWdlOiB1bmRlZmluZWQsIGhhc2g6IHVuZGVmaW5lZH07XG4gIC8vIGNvbnN0IG5leHRTaWJsaW5nID0gaW5zdGFuY2UubmV4dFNpYmxpbmc7XG4gIC8vIGlmIChuZXh0U2libGluZykge1xuICAvLyAgIGNvbnN0IGRhdGFzZXQgPSAoKG5leHRTaWJsaW5nOiBhbnkpOiBIVE1MVGVtcGxhdGVFbGVtZW50KS5kYXRhc2V0O1xuICAvLyAgIHZhbHVlLm1lc3NhZ2UgPSBkYXRhc2V0Lm1zZztcbiAgLy8gICB2YWx1ZS5oYXNoID0gZGF0YXNldC5oYXNoO1xuICAvLyAgIGlmICh0cnVlKSB7XG4gIC8vICAgICB2YWx1ZS5zdGFjayA9IGRhdGFzZXQuc3RhY2s7XG4gIC8vICAgfVxuICAvLyB9XG4gIC8vIHJldHVybiB2YWx1ZTtcblxufVxuZnVuY3Rpb24gcmVnaXN0ZXJTdXNwZW5zZUluc3RhbmNlUmV0cnkoaW5zdGFuY2UsIGNhbGxiYWNrKSB7XG4gIGluc3RhbmNlLl9yZWFjdFJldHJ5ID0gY2FsbGJhY2s7XG59XG5cbmZ1bmN0aW9uIGdldE5leHRIeWRyYXRhYmxlKG5vZGUpIHtcbiAgLy8gU2tpcCBub24taHlkcmF0YWJsZSBub2Rlcy5cbiAgZm9yICg7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICB2YXIgbm9kZVR5cGUgPSBub2RlLm5vZGVUeXBlO1xuXG4gICAgaWYgKG5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgfHwgbm9kZVR5cGUgPT09IFRFWFRfTk9ERSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKG5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICAgIHZhciBub2RlRGF0YSA9IG5vZGUuZGF0YTtcblxuICAgICAgaWYgKG5vZGVEYXRhID09PSBTVVNQRU5TRV9TVEFSVF9EQVRBIHx8IG5vZGVEYXRhID09PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBIHx8IG5vZGVEYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlRGF0YSA9PT0gU1VTUEVOU0VfRU5EX0RBVEEpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59XG5cbmZ1bmN0aW9uIGdldE5leHRIeWRyYXRhYmxlU2libGluZyhpbnN0YW5jZSkge1xuICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGUoaW5zdGFuY2UubmV4dFNpYmxpbmcpO1xufVxuZnVuY3Rpb24gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGQocGFyZW50SW5zdGFuY2UpIHtcbiAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlKHBhcmVudEluc3RhbmNlLmZpcnN0Q2hpbGQpO1xufVxuZnVuY3Rpb24gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGRXaXRoaW5Db250YWluZXIocGFyZW50Q29udGFpbmVyKSB7XG4gIHJldHVybiBnZXROZXh0SHlkcmF0YWJsZShwYXJlbnRDb250YWluZXIuZmlyc3RDaGlsZCk7XG59XG5mdW5jdGlvbiBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZFdpdGhpblN1c3BlbnNlSW5zdGFuY2UocGFyZW50SW5zdGFuY2UpIHtcbiAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlKHBhcmVudEluc3RhbmNlLm5leHRTaWJsaW5nKTtcbn1cbmZ1bmN0aW9uIGh5ZHJhdGVJbnN0YW5jZShpbnN0YW5jZSwgdHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQsIGludGVybmFsSW5zdGFuY2VIYW5kbGUsIHNob3VsZFdhcm5EZXYpIHtcbiAgcHJlY2FjaGVGaWJlck5vZGUoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgaW5zdGFuY2UpOyAvLyBUT0RPOiBQb3NzaWJseSBkZWZlciB0aGlzIHVudGlsIHRoZSBjb21taXQgcGhhc2Ugd2hlcmUgYWxsIHRoZSBldmVudHNcbiAgLy8gZ2V0IGF0dGFjaGVkLlxuXG4gIHVwZGF0ZUZpYmVyUHJvcHMoaW5zdGFuY2UsIHByb3BzKTtcbiAgdmFyIHBhcmVudE5hbWVzcGFjZTtcblxuICB7XG4gICAgdmFyIGhvc3RDb250ZXh0RGV2ID0gaG9zdENvbnRleHQ7XG4gICAgcGFyZW50TmFtZXNwYWNlID0gaG9zdENvbnRleHREZXYubmFtZXNwYWNlO1xuICB9IC8vIFRPRE86IFRlbXBvcmFyeSBoYWNrIHRvIGNoZWNrIGlmIHdlJ3JlIGluIGEgY29uY3VycmVudCByb290LiBXZSBjYW4gZGVsZXRlXG4gIC8vIHdoZW4gdGhlIGxlZ2FjeSByb290IEFQSSBpcyByZW1vdmVkLlxuXG5cbiAgdmFyIGlzQ29uY3VycmVudE1vZGUgPSAoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZS5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG4gIHJldHVybiBkaWZmSHlkcmF0ZWRQcm9wZXJ0aWVzKGluc3RhbmNlLCB0eXBlLCBwcm9wcywgcGFyZW50TmFtZXNwYWNlLCByb290Q29udGFpbmVySW5zdGFuY2UsIGlzQ29uY3VycmVudE1vZGUsIHNob3VsZFdhcm5EZXYpO1xufVxuZnVuY3Rpb24gaHlkcmF0ZVRleHRJbnN0YW5jZSh0ZXh0SW5zdGFuY2UsIHRleHQsIGludGVybmFsSW5zdGFuY2VIYW5kbGUsIHNob3VsZFdhcm5EZXYpIHtcbiAgcHJlY2FjaGVGaWJlck5vZGUoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgdGV4dEluc3RhbmNlKTsgLy8gVE9ETzogVGVtcG9yYXJ5IGhhY2sgdG8gY2hlY2sgaWYgd2UncmUgaW4gYSBjb25jdXJyZW50IHJvb3QuIFdlIGNhbiBkZWxldGVcbiAgLy8gd2hlbiB0aGUgbGVnYWN5IHJvb3QgQVBJIGlzIHJlbW92ZWQuXG5cbiAgdmFyIGlzQ29uY3VycmVudE1vZGUgPSAoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZS5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG4gIHJldHVybiBkaWZmSHlkcmF0ZWRUZXh0KHRleHRJbnN0YW5jZSwgdGV4dCk7XG59XG5mdW5jdGlvbiBoeWRyYXRlU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZUluc3RhbmNlLCBpbnRlcm5hbEluc3RhbmNlSGFuZGxlKSB7XG4gIHByZWNhY2hlRmliZXJOb2RlKGludGVybmFsSW5zdGFuY2VIYW5kbGUsIHN1c3BlbnNlSW5zdGFuY2UpO1xufVxuZnVuY3Rpb24gZ2V0TmV4dEh5ZHJhdGFibGVJbnN0YW5jZUFmdGVyU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZUluc3RhbmNlKSB7XG4gIHZhciBub2RlID0gc3VzcGVuc2VJbnN0YW5jZS5uZXh0U2libGluZzsgLy8gU2tpcCBwYXN0IGFsbCBub2RlcyB3aXRoaW4gdGhpcyBzdXNwZW5zZSBib3VuZGFyeS5cbiAgLy8gVGhlcmUgbWlnaHQgYmUgbmVzdGVkIG5vZGVzIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiBob3dcbiAgLy8gZGVlcCB3ZSBhcmUgYW5kIG9ubHkgYnJlYWsgb3V0IHdoZW4gd2UncmUgYmFjayBvbiB0b3AuXG5cbiAgdmFyIGRlcHRoID0gMDtcblxuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICAgIHZhciBkYXRhID0gbm9kZS5kYXRhO1xuXG4gICAgICBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfRU5EX0RBVEEpIHtcbiAgICAgICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlU2libGluZyhub2RlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZXB0aC0tO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRhdGEgPT09IFNVU1BFTlNFX1NUQVJUX0RBVEEgfHwgZGF0YSA9PT0gU1VTUEVOU0VfRkFMTEJBQ0tfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEpIHtcbiAgICAgICAgZGVwdGgrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBub2RlID0gbm9kZS5uZXh0U2libGluZztcbiAgfSAvLyBUT0RPOiBXYXJuLCB3ZSBkaWRuJ3QgZmluZCB0aGUgZW5kIGNvbW1lbnQgYm91bmRhcnkuXG5cblxuICByZXR1cm4gbnVsbDtcbn0gLy8gUmV0dXJucyB0aGUgU3VzcGVuc2VJbnN0YW5jZSBpZiB0aGlzIG5vZGUgaXMgYSBkaXJlY3QgY2hpbGQgb2YgYVxuLy8gU3VzcGVuc2VJbnN0YW5jZS4gSS5lLiBpZiBpdHMgcHJldmlvdXMgc2libGluZyBpcyBhIENvbW1lbnQgd2l0aFxuLy8gU1VTUEVOU0VfeF9TVEFSVF9EQVRBLiBPdGhlcndpc2UsIG51bGwuXG5cbmZ1bmN0aW9uIGdldFBhcmVudFN1c3BlbnNlSW5zdGFuY2UodGFyZ2V0SW5zdGFuY2UpIHtcbiAgdmFyIG5vZGUgPSB0YXJnZXRJbnN0YW5jZS5wcmV2aW91c1NpYmxpbmc7IC8vIFNraXAgcGFzdCBhbGwgbm9kZXMgd2l0aGluIHRoaXMgc3VzcGVuc2UgYm91bmRhcnkuXG4gIC8vIFRoZXJlIG1pZ2h0IGJlIG5lc3RlZCBub2RlcyBzbyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgaG93XG4gIC8vIGRlZXAgd2UgYXJlIGFuZCBvbmx5IGJyZWFrIG91dCB3aGVuIHdlJ3JlIGJhY2sgb24gdG9wLlxuXG4gIHZhciBkZXB0aCA9IDA7XG5cbiAgd2hpbGUgKG5vZGUpIHtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgICB2YXIgZGF0YSA9IG5vZGUuZGF0YTtcblxuICAgICAgaWYgKGRhdGEgPT09IFNVU1BFTlNFX1NUQVJUX0RBVEEgfHwgZGF0YSA9PT0gU1VTUEVOU0VfRkFMTEJBQ0tfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEpIHtcbiAgICAgICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkYXRhID09PSBTVVNQRU5TRV9FTkRfREFUQSkge1xuICAgICAgICBkZXB0aCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5vZGUgPSBub2RlLnByZXZpb3VzU2libGluZztcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gY29tbWl0SHlkcmF0ZWRDb250YWluZXIoY29udGFpbmVyKSB7XG4gIC8vIFJldHJ5IGlmIGFueSBldmVudCByZXBsYXlpbmcgd2FzIGJsb2NrZWQgb24gdGhpcy5cbiAgcmV0cnlJZkJsb2NrZWRPbihjb250YWluZXIpO1xufVxuZnVuY3Rpb24gY29tbWl0SHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgLy8gUmV0cnkgaWYgYW55IGV2ZW50IHJlcGxheWluZyB3YXMgYmxvY2tlZCBvbiB0aGlzLlxuICByZXRyeUlmQmxvY2tlZE9uKHN1c3BlbnNlSW5zdGFuY2UpO1xufVxuZnVuY3Rpb24gc2hvdWxkRGVsZXRlVW5oeWRyYXRlZFRhaWxJbnN0YW5jZXMocGFyZW50VHlwZSkge1xuICByZXR1cm4gcGFyZW50VHlwZSAhPT0gJ2hlYWQnICYmIHBhcmVudFR5cGUgIT09ICdib2R5Jztcbn1cbmZ1bmN0aW9uIGRpZE5vdE1hdGNoSHlkcmF0ZWRDb250YWluZXJUZXh0SW5zdGFuY2UocGFyZW50Q29udGFpbmVyLCB0ZXh0SW5zdGFuY2UsIHRleHQsIGlzQ29uY3VycmVudE1vZGUpIHtcbiAgdmFyIHNob3VsZFdhcm5EZXYgPSB0cnVlO1xuICBjaGVja0ZvclVubWF0Y2hlZFRleHQodGV4dEluc3RhbmNlLm5vZGVWYWx1ZSwgdGV4dCwgaXNDb25jdXJyZW50TW9kZSwgc2hvdWxkV2FybkRldik7XG59XG5mdW5jdGlvbiBkaWROb3RNYXRjaEh5ZHJhdGVkVGV4dEluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgdGV4dEluc3RhbmNlLCB0ZXh0LCBpc0NvbmN1cnJlbnRNb2RlKSB7XG4gIGlmIChwYXJlbnRQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxXSAhPT0gdHJ1ZSkge1xuICAgIHZhciBzaG91bGRXYXJuRGV2ID0gdHJ1ZTtcbiAgICBjaGVja0ZvclVubWF0Y2hlZFRleHQodGV4dEluc3RhbmNlLm5vZGVWYWx1ZSwgdGV4dCwgaXNDb25jdXJyZW50TW9kZSwgc2hvdWxkV2FybkRldik7XG4gIH1cbn1cbmZ1bmN0aW9uIGRpZE5vdEh5ZHJhdGVJbnN0YW5jZVdpdGhpbkNvbnRhaW5lcihwYXJlbnRDb250YWluZXIsIGluc3RhbmNlKSB7XG4gIHtcbiAgICBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlRWxlbWVudChwYXJlbnRDb250YWluZXIsIGluc3RhbmNlKTtcbiAgICB9IGVsc2UgaWYgKGluc3RhbmNlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIDsgZWxzZSB7XG4gICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVUZXh0KHBhcmVudENvbnRhaW5lciwgaW5zdGFuY2UpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90SHlkcmF0ZUluc3RhbmNlV2l0aGluU3VzcGVuc2VJbnN0YW5jZShwYXJlbnRJbnN0YW5jZSwgaW5zdGFuY2UpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWU6IE9ubHkgRWxlbWVudCBvciBEb2N1bWVudCBjYW4gYmUgcGFyZW50IG5vZGVzLlxuICAgIHZhciBwYXJlbnROb2RlID0gcGFyZW50SW5zdGFuY2UucGFyZW50Tm9kZTtcblxuICAgIGlmIChwYXJlbnROb2RlICE9PSBudWxsKSB7XG4gICAgICBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVFbGVtZW50KHBhcmVudE5vZGUsIGluc3RhbmNlKTtcbiAgICAgIH0gZWxzZSBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkgOyBlbHNlIHtcbiAgICAgICAgd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlVGV4dChwYXJlbnROb2RlLCBpbnN0YW5jZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBkaWROb3RIeWRyYXRlSW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCBpbnN0YW5jZSwgaXNDb25jdXJyZW50TW9kZSkge1xuICB7XG4gICAgaWYgKGlzQ29uY3VycmVudE1vZGUgfHwgcGFyZW50UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkckMV0gIT09IHRydWUpIHtcbiAgICAgIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZUVsZW1lbnQocGFyZW50SW5zdGFuY2UsIGluc3RhbmNlKTtcbiAgICAgIH0gZWxzZSBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkgOyBlbHNlIHtcbiAgICAgICAgd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlVGV4dChwYXJlbnRJbnN0YW5jZSwgaW5zdGFuY2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVJbnN0YW5jZVdpdGhpbkNvbnRhaW5lcihwYXJlbnRDb250YWluZXIsIHR5cGUsIHByb3BzKSB7XG4gIHtcbiAgICB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZEVsZW1lbnQocGFyZW50Q29udGFpbmVyLCB0eXBlKTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVUZXh0SW5zdGFuY2VXaXRoaW5Db250YWluZXIocGFyZW50Q29udGFpbmVyLCB0ZXh0KSB7XG4gIHtcbiAgICB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZFRleHQocGFyZW50Q29udGFpbmVyLCB0ZXh0KTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVJbnN0YW5jZVdpdGhpblN1c3BlbnNlSW5zdGFuY2UocGFyZW50SW5zdGFuY2UsIHR5cGUsIHByb3BzKSB7XG4gIHtcbiAgICAvLyAkRmxvd0ZpeE1lOiBPbmx5IEVsZW1lbnQgb3IgRG9jdW1lbnQgY2FuIGJlIHBhcmVudCBub2Rlcy5cbiAgICB2YXIgcGFyZW50Tm9kZSA9IHBhcmVudEluc3RhbmNlLnBhcmVudE5vZGU7XG4gICAgaWYgKHBhcmVudE5vZGUgIT09IG51bGwpIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkRWxlbWVudChwYXJlbnROb2RlLCB0eXBlKTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVUZXh0SW5zdGFuY2VXaXRoaW5TdXNwZW5zZUluc3RhbmNlKHBhcmVudEluc3RhbmNlLCB0ZXh0KSB7XG4gIHtcbiAgICAvLyAkRmxvd0ZpeE1lOiBPbmx5IEVsZW1lbnQgb3IgRG9jdW1lbnQgY2FuIGJlIHBhcmVudCBub2Rlcy5cbiAgICB2YXIgcGFyZW50Tm9kZSA9IHBhcmVudEluc3RhbmNlLnBhcmVudE5vZGU7XG4gICAgaWYgKHBhcmVudE5vZGUgIT09IG51bGwpIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkVGV4dChwYXJlbnROb2RlLCB0ZXh0KTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIHR5cGUsIHByb3BzLCBpc0NvbmN1cnJlbnRNb2RlKSB7XG4gIHtcbiAgICBpZiAoaXNDb25jdXJyZW50TW9kZSB8fCBwYXJlbnRQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxXSAhPT0gdHJ1ZSkge1xuICAgICAgd2FybkZvckluc2VydGVkSHlkcmF0ZWRFbGVtZW50KHBhcmVudEluc3RhbmNlLCB0eXBlKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGRpZE5vdEZpbmRIeWRyYXRhYmxlVGV4dEluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgdGV4dCwgaXNDb25jdXJyZW50TW9kZSkge1xuICB7XG4gICAgaWYgKGlzQ29uY3VycmVudE1vZGUgfHwgcGFyZW50UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkckMV0gIT09IHRydWUpIHtcbiAgICAgIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkVGV4dChwYXJlbnRJbnN0YW5jZSwgdGV4dCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBlcnJvckh5ZHJhdGluZ0NvbnRhaW5lcihwYXJlbnRDb250YWluZXIpIHtcbiAge1xuICAgIC8vIFRPRE86IFRoaXMgZ2V0cyBsb2dnZWQgYnkgb25SZWNvdmVyYWJsZUVycm9yLCB0b28sIHNvIHdlIHNob3VsZCBiZVxuICAgIC8vIGFibGUgdG8gcmVtb3ZlIGl0LlxuICAgIGVycm9yKCdBbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgaHlkcmF0aW9uLiBUaGUgc2VydmVyIEhUTUwgd2FzIHJlcGxhY2VkIHdpdGggY2xpZW50IGNvbnRlbnQgaW4gPCVzPi4nLCBwYXJlbnRDb250YWluZXIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHByZXBhcmVQb3J0YWxNb3VudChwb3J0YWxJbnN0YW5jZSkge1xuICBsaXN0ZW5Ub0FsbFN1cHBvcnRlZEV2ZW50cyhwb3J0YWxJbnN0YW5jZSk7XG59XG5cbnZhciByYW5kb21LZXkgPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKTtcbnZhciBpbnRlcm5hbEluc3RhbmNlS2V5ID0gJ19fcmVhY3RGaWJlciQnICsgcmFuZG9tS2V5O1xudmFyIGludGVybmFsUHJvcHNLZXkgPSAnX19yZWFjdFByb3BzJCcgKyByYW5kb21LZXk7XG52YXIgaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleSA9ICdfX3JlYWN0Q29udGFpbmVyJCcgKyByYW5kb21LZXk7XG52YXIgaW50ZXJuYWxFdmVudEhhbmRsZXJzS2V5ID0gJ19fcmVhY3RFdmVudHMkJyArIHJhbmRvbUtleTtcbnZhciBpbnRlcm5hbEV2ZW50SGFuZGxlckxpc3RlbmVyc0tleSA9ICdfX3JlYWN0TGlzdGVuZXJzJCcgKyByYW5kb21LZXk7XG52YXIgaW50ZXJuYWxFdmVudEhhbmRsZXNTZXRLZXkgPSAnX19yZWFjdEhhbmRsZXMkJyArIHJhbmRvbUtleTtcbmZ1bmN0aW9uIGRldGFjaERlbGV0ZWRJbnN0YW5jZShub2RlKSB7XG4gIC8vIFRPRE86IFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgb24gaG9zdCBjb21wb25lbnRzLiBJIGRvbid0IHRoaW5rIGFsbCBvZlxuICAvLyB0aGVzZSBmaWVsZHMgYXJlIHJlbGV2YW50LlxuICBkZWxldGUgbm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XTtcbiAgZGVsZXRlIG5vZGVbaW50ZXJuYWxQcm9wc0tleV07XG4gIGRlbGV0ZSBub2RlW2ludGVybmFsRXZlbnRIYW5kbGVyc0tleV07XG4gIGRlbGV0ZSBub2RlW2ludGVybmFsRXZlbnRIYW5kbGVyTGlzdGVuZXJzS2V5XTtcbiAgZGVsZXRlIG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXNTZXRLZXldO1xufVxuZnVuY3Rpb24gcHJlY2FjaGVGaWJlck5vZGUoaG9zdEluc3QsIG5vZGUpIHtcbiAgbm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XSA9IGhvc3RJbnN0O1xufVxuZnVuY3Rpb24gbWFya0NvbnRhaW5lckFzUm9vdChob3N0Um9vdCwgbm9kZSkge1xuICBub2RlW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldID0gaG9zdFJvb3Q7XG59XG5mdW5jdGlvbiB1bm1hcmtDb250YWluZXJBc1Jvb3Qobm9kZSkge1xuICBub2RlW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldID0gbnVsbDtcbn1cbmZ1bmN0aW9uIGlzQ29udGFpbmVyTWFya2VkQXNSb290KG5vZGUpIHtcbiAgcmV0dXJuICEhbm9kZVtpbnRlcm5hbENvbnRhaW5lckluc3RhbmNlS2V5XTtcbn0gLy8gR2l2ZW4gYSBET00gbm9kZSwgcmV0dXJuIHRoZSBjbG9zZXN0IEhvc3RDb21wb25lbnQgb3IgSG9zdFRleHQgZmliZXIgYW5jZXN0b3IuXG4vLyBJZiB0aGUgdGFyZ2V0IG5vZGUgaXMgcGFydCBvZiBhIGh5ZHJhdGVkIG9yIG5vdCB5ZXQgcmVuZGVyZWQgc3VidHJlZSwgdGhlblxuLy8gdGhpcyBtYXkgYWxzbyByZXR1cm4gYSBTdXNwZW5zZUNvbXBvbmVudCBvciBIb3N0Um9vdCB0byBpbmRpY2F0ZSB0aGF0LlxuLy8gQ29uY2VwdHVhbGx5IHRoZSBIb3N0Um9vdCBmaWJlciBpcyBhIGNoaWxkIG9mIHRoZSBDb250YWluZXIgbm9kZS4gU28gaWYgeW91XG4vLyBwYXNzIHRoZSBDb250YWluZXIgbm9kZSBhcyB0aGUgdGFyZ2V0Tm9kZSwgeW91IHdpbGwgbm90IGFjdHVhbGx5IGdldCB0aGVcbi8vIEhvc3RSb290IGJhY2suIFRvIGdldCB0byB0aGUgSG9zdFJvb3QsIHlvdSBuZWVkIHRvIHBhc3MgYSBjaGlsZCBvZiBpdC5cbi8vIFRoZSBzYW1lIHRoaW5nIGFwcGxpZXMgdG8gU3VzcGVuc2UgYm91bmRhcmllcy5cblxuZnVuY3Rpb24gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUodGFyZ2V0Tm9kZSkge1xuICB2YXIgdGFyZ2V0SW5zdCA9IHRhcmdldE5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV07XG5cbiAgaWYgKHRhcmdldEluc3QpIHtcbiAgICAvLyBEb24ndCByZXR1cm4gSG9zdFJvb3Qgb3IgU3VzcGVuc2VDb21wb25lbnQgaGVyZS5cbiAgICByZXR1cm4gdGFyZ2V0SW5zdDtcbiAgfSAvLyBJZiB0aGUgZGlyZWN0IGV2ZW50IHRhcmdldCBpc24ndCBhIFJlYWN0IG93bmVkIERPTSBub2RlLCB3ZSBuZWVkIHRvIGxvb2tcbiAgLy8gdG8gc2VlIGlmIG9uZSBvZiBpdHMgcGFyZW50cyBpcyBhIFJlYWN0IG93bmVkIERPTSBub2RlLlxuXG5cbiAgdmFyIHBhcmVudE5vZGUgPSB0YXJnZXROb2RlLnBhcmVudE5vZGU7XG5cbiAgd2hpbGUgKHBhcmVudE5vZGUpIHtcbiAgICAvLyBXZSdsbCBjaGVjayBpZiB0aGlzIGlzIGEgY29udGFpbmVyIHJvb3QgdGhhdCBjb3VsZCBpbmNsdWRlXG4gICAgLy8gUmVhY3Qgbm9kZXMgaW4gdGhlIGZ1dHVyZS4gV2UgbmVlZCB0byBjaGVjayB0aGlzIGZpcnN0IGJlY2F1c2VcbiAgICAvLyBpZiB3ZSdyZSBhIGNoaWxkIG9mIGEgZGVoeWRyYXRlZCBjb250YWluZXIsIHdlIG5lZWQgdG8gZmlyc3RcbiAgICAvLyBmaW5kIHRoYXQgaW5uZXIgY29udGFpbmVyIGJlZm9yZSBtb3Zpbmcgb24gdG8gZmluZGluZyB0aGUgcGFyZW50XG4gICAgLy8gaW5zdGFuY2UuIE5vdGUgdGhhdCB3ZSBkb24ndCBjaGVjayB0aGlzIGZpZWxkIG9uICB0aGUgdGFyZ2V0Tm9kZVxuICAgIC8vIGl0c2VsZiBiZWNhdXNlIHRoZSBmaWJlcnMgYXJlIGNvbmNlcHR1YWxseSBiZXR3ZWVuIHRoZSBjb250YWluZXJcbiAgICAvLyBub2RlIGFuZCB0aGUgZmlyc3QgY2hpbGQuIEl0IGlzbid0IHN1cnJvdW5kaW5nIHRoZSBjb250YWluZXIgbm9kZS5cbiAgICAvLyBJZiBpdCdzIG5vdCBhIGNvbnRhaW5lciwgd2UgY2hlY2sgaWYgaXQncyBhbiBpbnN0YW5jZS5cbiAgICB0YXJnZXRJbnN0ID0gcGFyZW50Tm9kZVtpbnRlcm5hbENvbnRhaW5lckluc3RhbmNlS2V5XSB8fCBwYXJlbnROb2RlW2ludGVybmFsSW5zdGFuY2VLZXldO1xuXG4gICAgaWYgKHRhcmdldEluc3QpIHtcbiAgICAgIC8vIFNpbmNlIHRoaXMgd2Fzbid0IHRoZSBkaXJlY3QgdGFyZ2V0IG9mIHRoZSBldmVudCwgd2UgbWlnaHQgaGF2ZVxuICAgICAgLy8gc3RlcHBlZCBwYXN0IGRlaHlkcmF0ZWQgRE9NIG5vZGVzIHRvIGdldCBoZXJlLiBIb3dldmVyIHRoZXkgY291bGRcbiAgICAgIC8vIGFsc28gaGF2ZSBiZWVuIG5vbi1SZWFjdCBub2Rlcy4gV2UgbmVlZCB0byBhbnN3ZXIgd2hpY2ggb25lLlxuICAgICAgLy8gSWYgd2UgdGhlIGluc3RhbmNlIGRvZXNuJ3QgaGF2ZSBhbnkgY2hpbGRyZW4sIHRoZW4gdGhlcmUgY2FuJ3QgYmVcbiAgICAgIC8vIGEgbmVzdGVkIHN1c3BlbnNlIGJvdW5kYXJ5IHdpdGhpbiBpdC4gU28gd2UgY2FuIHVzZSB0aGlzIGFzIGEgZmFzdFxuICAgICAgLy8gYmFpbG91dC4gTW9zdCBvZiB0aGUgdGltZSwgd2hlbiBwZW9wbGUgYWRkIG5vbi1SZWFjdCBjaGlsZHJlbiB0b1xuICAgICAgLy8gdGhlIHRyZWUsIGl0IGlzIHVzaW5nIGEgcmVmIHRvIGEgY2hpbGQtbGVzcyBET00gbm9kZS5cbiAgICAgIC8vIE5vcm1hbGx5IHdlJ2Qgb25seSBuZWVkIHRvIGNoZWNrIG9uZSBvZiB0aGUgZmliZXJzIGJlY2F1c2UgaWYgaXRcbiAgICAgIC8vIGhhcyBldmVyIGdvbmUgZnJvbSBoYXZpbmcgY2hpbGRyZW4gdG8gZGVsZXRpbmcgdGhlbSBvciB2aWNlIHZlcnNhXG4gICAgICAvLyBpdCB3b3VsZCBoYXZlIGRlbGV0ZWQgdGhlIGRlaHlkcmF0ZWQgYm91bmRhcnkgbmVzdGVkIGluc2lkZSBhbHJlYWR5LlxuICAgICAgLy8gSG93ZXZlciwgc2luY2UgdGhlIEhvc3RSb290IHN0YXJ0cyBvdXQgd2l0aCBhbiBhbHRlcm5hdGUgaXQgbWlnaHRcbiAgICAgIC8vIGhhdmUgb25lIG9uIHRoZSBhbHRlcm5hdGUgc28gd2UgbmVlZCB0byBjaGVjayBpbiBjYXNlIHRoaXMgd2FzIGFcbiAgICAgIC8vIHJvb3QuXG4gICAgICB2YXIgYWx0ZXJuYXRlID0gdGFyZ2V0SW5zdC5hbHRlcm5hdGU7XG5cbiAgICAgIGlmICh0YXJnZXRJbnN0LmNoaWxkICE9PSBudWxsIHx8IGFsdGVybmF0ZSAhPT0gbnVsbCAmJiBhbHRlcm5hdGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgLy8gTmV4dCB3ZSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgdGhlIG5vZGUgdGhhdCBza2lwcGVkIHBhc3QgaXNcbiAgICAgICAgLy8gbmVzdGVkIHdpdGhpbiBhIGRlaHlkcmF0ZWQgYm91bmRhcnkgYW5kIGlmIHNvLCB3aGljaCBvbmUuXG4gICAgICAgIHZhciBzdXNwZW5zZUluc3RhbmNlID0gZ2V0UGFyZW50U3VzcGVuc2VJbnN0YW5jZSh0YXJnZXROb2RlKTtcblxuICAgICAgICB3aGlsZSAoc3VzcGVuc2VJbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlIGZvdW5kIGEgc3VzcGVuc2UgaW5zdGFuY2UuIFRoYXQgbWVhbnMgdGhhdCB3ZSBoYXZlbid0XG4gICAgICAgICAgLy8gaHlkcmF0ZWQgaXQgeWV0LiBFdmVuIHRob3VnaCB3ZSBsZWF2ZSB0aGUgY29tbWVudHMgaW4gdGhlXG4gICAgICAgICAgLy8gRE9NIGFmdGVyIGh5ZHJhdGluZywgYW5kIHRoZXJlIGFyZSBib3VuZGFyaWVzIGluIHRoZSBET01cbiAgICAgICAgICAvLyB0aGF0IGNvdWxkIGFscmVhZHkgYmUgaHlkcmF0ZWQsIHdlIHdvdWxkbid0IGhhdmUgZm91bmQgdGhlbVxuICAgICAgICAgIC8vIHRocm91Z2ggdGhpcyBwYXNzIHNpbmNlIGlmIHRoZSB0YXJnZXQgaXMgaHlkcmF0ZWQgaXQgd291bGRcbiAgICAgICAgICAvLyBoYXZlIGhhZCBhbiBpbnRlcm5hbEluc3RhbmNlS2V5IG9uIGl0LlxuICAgICAgICAgIC8vIExldCdzIGdldCB0aGUgZmliZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBTdXNwZW5zZUNvbXBvbmVudFxuICAgICAgICAgIC8vIGFzIHRoZSBkZWVwZXN0IGluc3RhbmNlLlxuICAgICAgICAgIHZhciB0YXJnZXRTdXNwZW5zZUluc3QgPSBzdXNwZW5zZUluc3RhbmNlW2ludGVybmFsSW5zdGFuY2VLZXldO1xuXG4gICAgICAgICAgaWYgKHRhcmdldFN1c3BlbnNlSW5zdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldFN1c3BlbnNlSW5zdDtcbiAgICAgICAgICB9IC8vIElmIHdlIGRvbid0IGZpbmQgYSBGaWJlciBvbiB0aGUgY29tbWVudCwgaXQgbWlnaHQgYmUgYmVjYXVzZVxuICAgICAgICAgIC8vIHdlIGhhdmVuJ3QgZ290dGVuIHRvIGh5ZHJhdGUgaXQgeWV0LiBUaGVyZSBtaWdodCBzdGlsbCBiZSBhXG4gICAgICAgICAgLy8gcGFyZW50IGJvdW5kYXJ5IHRoYXQgaGFzbid0IGFib3ZlIHRoaXMgb25lIHNvIHdlIG5lZWQgdG8gZmluZFxuICAgICAgICAgIC8vIHRoZSBvdXRlciBtb3N0IHRoYXQgaXMga25vd24uXG5cblxuICAgICAgICAgIHN1c3BlbnNlSW5zdGFuY2UgPSBnZXRQYXJlbnRTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpOyAvLyBJZiB3ZSBkb24ndCBmaW5kIG9uZSwgdGhlbiB0aGF0IHNob3VsZCBtZWFuIHRoYXQgdGhlIHBhcmVudFxuICAgICAgICAgIC8vIGhvc3QgY29tcG9uZW50IGFsc28gaGFzbid0IGh5ZHJhdGVkIHlldC4gV2UgY2FuIHJldHVybiBpdFxuICAgICAgICAgIC8vIGJlbG93IHNpbmNlIGl0IHdpbGwgYmFpbCBvdXQgb24gdGhlIGlzTW91bnRlZCBjaGVjayBsYXRlci5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGFyZ2V0SW5zdDtcbiAgICB9XG5cbiAgICB0YXJnZXROb2RlID0gcGFyZW50Tm9kZTtcbiAgICBwYXJlbnROb2RlID0gdGFyZ2V0Tm9kZS5wYXJlbnROb2RlO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4vKipcbiAqIEdpdmVuIGEgRE9NIG5vZGUsIHJldHVybiB0aGUgUmVhY3RET01Db21wb25lbnQgb3IgUmVhY3RET01UZXh0Q29tcG9uZW50XG4gKiBpbnN0YW5jZSwgb3IgbnVsbCBpZiB0aGUgbm9kZSB3YXMgbm90IHJlbmRlcmVkIGJ5IHRoaXMgUmVhY3QuXG4gKi9cblxuZnVuY3Rpb24gZ2V0SW5zdGFuY2VGcm9tTm9kZShub2RlKSB7XG4gIHZhciBpbnN0ID0gbm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XSB8fCBub2RlW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldO1xuXG4gIGlmIChpbnN0KSB7XG4gICAgaWYgKGluc3QudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IGluc3QudGFnID09PSBIb3N0VGV4dCB8fCBpbnN0LnRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQgfHwgaW5zdC50YWcgPT09IEhvc3RSb290KSB7XG4gICAgICByZXR1cm4gaW5zdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4vKipcbiAqIEdpdmVuIGEgUmVhY3RET01Db21wb25lbnQgb3IgUmVhY3RET01UZXh0Q29tcG9uZW50LCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmdcbiAqIERPTSBub2RlLlxuICovXG5cbmZ1bmN0aW9uIGdldE5vZGVGcm9tSW5zdGFuY2UoaW5zdCkge1xuICBpZiAoaW5zdC50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgaW5zdC50YWcgPT09IEhvc3RUZXh0KSB7XG4gICAgLy8gSW4gRmliZXIgdGhpcywgaXMganVzdCB0aGUgc3RhdGUgbm9kZSByaWdodCBub3cuIFdlIGFzc3VtZSBpdCB3aWxsIGJlXG4gICAgLy8gYSBob3N0IGNvbXBvbmVudCBvciBob3N0IHRleHQuXG4gICAgcmV0dXJuIGluc3Quc3RhdGVOb2RlO1xuICB9IC8vIFdpdGhvdXQgdGhpcyBmaXJzdCBpbnZhcmlhbnQsIHBhc3NpbmcgYSBub24tRE9NLWNvbXBvbmVudCB0cmlnZ2VycyB0aGUgbmV4dFxuICAvLyBpbnZhcmlhbnQgZm9yIGEgbWlzc2luZyBwYXJlbnQsIHdoaWNoIGlzIHN1cGVyIGNvbmZ1c2luZy5cblxuXG4gIHRocm93IG5ldyBFcnJvcignZ2V0Tm9kZUZyb21JbnN0YW5jZTogSW52YWxpZCBhcmd1bWVudC4nKTtcbn1cbmZ1bmN0aW9uIGdldEZpYmVyQ3VycmVudFByb3BzRnJvbU5vZGUobm9kZSkge1xuICByZXR1cm4gbm9kZVtpbnRlcm5hbFByb3BzS2V5XSB8fCBudWxsO1xufVxuZnVuY3Rpb24gdXBkYXRlRmliZXJQcm9wcyhub2RlLCBwcm9wcykge1xuICBub2RlW2ludGVybmFsUHJvcHNLZXldID0gcHJvcHM7XG59XG5mdW5jdGlvbiBnZXRFdmVudExpc3RlbmVyU2V0KG5vZGUpIHtcbiAgdmFyIGVsZW1lbnRMaXN0ZW5lclNldCA9IG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXJzS2V5XTtcblxuICBpZiAoZWxlbWVudExpc3RlbmVyU2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICBlbGVtZW50TGlzdGVuZXJTZXQgPSBub2RlW2ludGVybmFsRXZlbnRIYW5kbGVyc0tleV0gPSBuZXcgU2V0KCk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudExpc3RlbmVyU2V0O1xufVxuXG52YXIgbG9nZ2VkVHlwZUZhaWx1cmVzID0ge307XG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcblxuZnVuY3Rpb24gc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCkge1xuICB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSwgZWxlbWVudC5fc291cmNlLCBvd25lciA/IG93bmVyLnR5cGUgOiBudWxsKTtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMS5zZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja1Byb3BUeXBlcyh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24sIGNvbXBvbmVudE5hbWUsIGVsZW1lbnQpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWUgVGhpcyBpcyBva2F5IGJ1dCBGbG93IGRvZXNuJ3Qga25vdyBpdC5cbiAgICB2YXIgaGFzID0gRnVuY3Rpb24uY2FsbC5iaW5kKGhhc093blByb3BlcnR5KTtcblxuICAgIGZvciAodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHtcbiAgICAgIGlmIChoYXModHlwZVNwZWNzLCB0eXBlU3BlY05hbWUpKSB7XG4gICAgICAgIHZhciBlcnJvciQxID0gdm9pZCAwOyAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuXG4gICAgICAgIC8vIEFmdGVyIHRoZXNlIGhhdmUgYmVlbiBjbGVhbmVkIHVwLCB3ZSdsbCBsZXQgdGhlbSB0aHJvdy5cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhbiBpbnZhcmlhbnQgdGhhdCBnZXRzIGNhdWdodC4gSXQncyB0aGUgc2FtZVxuICAgICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS5cbiAgICAgICAgICBpZiAodHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgICAgICAgdmFyIGVyciA9IEVycm9yKChjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycpICsgJzogJyArIGxvY2F0aW9uICsgJyB0eXBlIGAnICsgdHlwZVNwZWNOYW1lICsgJ2AgaXMgaW52YWxpZDsgJyArICdpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UsIGJ1dCByZWNlaXZlZCBgJyArIHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSArICdgLicgKyAnVGhpcyBvZnRlbiBoYXBwZW5zIGJlY2F1c2Ugb2YgdHlwb3Mgc3VjaCBhcyBgUHJvcFR5cGVzLmZ1bmN0aW9uYCBpbnN0ZWFkIG9mIGBQcm9wVHlwZXMuZnVuY2AuJyk7XG4gICAgICAgICAgICBlcnIubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlcnJvciQxID0gdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0odmFsdWVzLCB0eXBlU3BlY05hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBudWxsLCAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnKTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICBlcnJvciQxID0gZXg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IkMSAmJiAhKGVycm9yJDEgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgIGVycm9yKCclczogdHlwZSBzcGVjaWZpY2F0aW9uIG9mICVzJyArICcgYCVzYCBpcyBpbnZhbGlkOyB0aGUgdHlwZSBjaGVja2VyICcgKyAnZnVuY3Rpb24gbXVzdCByZXR1cm4gYG51bGxgIG9yIGFuIGBFcnJvcmAgYnV0IHJldHVybmVkIGEgJXMuICcgKyAnWW91IG1heSBoYXZlIGZvcmdvdHRlbiB0byBwYXNzIGFuIGFyZ3VtZW50IHRvIHRoZSB0eXBlIGNoZWNrZXIgJyArICdjcmVhdG9yIChhcnJheU9mLCBpbnN0YW5jZU9mLCBvYmplY3RPZiwgb25lT2YsIG9uZU9mVHlwZSwgYW5kICcgKyAnc2hhcGUgYWxsIHJlcXVpcmUgYW4gYXJndW1lbnQpLicsIGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJywgbG9jYXRpb24sIHR5cGVTcGVjTmFtZSwgdHlwZW9mIGVycm9yJDEpO1xuXG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IkMSBpbnN0YW5jZW9mIEVycm9yICYmICEoZXJyb3IkMS5tZXNzYWdlIGluIGxvZ2dlZFR5cGVGYWlsdXJlcykpIHtcbiAgICAgICAgICAvLyBPbmx5IG1vbml0b3IgdGhpcyBmYWlsdXJlIG9uY2UgYmVjYXVzZSB0aGVyZSB0ZW5kcyB0byBiZSBhIGxvdCBvZiB0aGVcbiAgICAgICAgICAvLyBzYW1lIGVycm9yLlxuICAgICAgICAgIGxvZ2dlZFR5cGVGYWlsdXJlc1tlcnJvciQxLm1lc3NhZ2VdID0gdHJ1ZTtcbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgIGVycm9yKCdGYWlsZWQgJXMgdHlwZTogJXMnLCBsb2NhdGlvbiwgZXJyb3IkMS5tZXNzYWdlKTtcblxuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciB2YWx1ZVN0YWNrID0gW107XG52YXIgZmliZXJTdGFjaztcblxue1xuICBmaWJlclN0YWNrID0gW107XG59XG5cbnZhciBpbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjcmVhdGVDdXJzb3IoZGVmYXVsdFZhbHVlKSB7XG4gIHJldHVybiB7XG4gICAgY3VycmVudDogZGVmYXVsdFZhbHVlXG4gIH07XG59XG5cbmZ1bmN0aW9uIHBvcChjdXJzb3IsIGZpYmVyKSB7XG4gIGlmIChpbmRleCA8IDApIHtcbiAgICB7XG4gICAgICBlcnJvcignVW5leHBlY3RlZCBwb3AuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAge1xuICAgIGlmIChmaWJlciAhPT0gZmliZXJTdGFja1tpbmRleF0pIHtcbiAgICAgIGVycm9yKCdVbmV4cGVjdGVkIEZpYmVyIHBvcHBlZC4nKTtcbiAgICB9XG4gIH1cblxuICBjdXJzb3IuY3VycmVudCA9IHZhbHVlU3RhY2tbaW5kZXhdO1xuICB2YWx1ZVN0YWNrW2luZGV4XSA9IG51bGw7XG5cbiAge1xuICAgIGZpYmVyU3RhY2tbaW5kZXhdID0gbnVsbDtcbiAgfVxuXG4gIGluZGV4LS07XG59XG5cbmZ1bmN0aW9uIHB1c2goY3Vyc29yLCB2YWx1ZSwgZmliZXIpIHtcbiAgaW5kZXgrKztcbiAgdmFsdWVTdGFja1tpbmRleF0gPSBjdXJzb3IuY3VycmVudDtcblxuICB7XG4gICAgZmliZXJTdGFja1tpbmRleF0gPSBmaWJlcjtcbiAgfVxuXG4gIGN1cnNvci5jdXJyZW50ID0gdmFsdWU7XG59XG5cbnZhciB3YXJuZWRBYm91dE1pc3NpbmdHZXRDaGlsZENvbnRleHQ7XG5cbntcbiAgd2FybmVkQWJvdXRNaXNzaW5nR2V0Q2hpbGRDb250ZXh0ID0ge307XG59XG5cbnZhciBlbXB0eUNvbnRleHRPYmplY3QgPSB7fTtcblxue1xuICBPYmplY3QuZnJlZXplKGVtcHR5Q29udGV4dE9iamVjdCk7XG59IC8vIEEgY3Vyc29yIHRvIHRoZSBjdXJyZW50IG1lcmdlZCBjb250ZXh0IG9iamVjdCBvbiB0aGUgc3RhY2suXG5cblxudmFyIGNvbnRleHRTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihlbXB0eUNvbnRleHRPYmplY3QpOyAvLyBBIGN1cnNvciB0byBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjb250ZXh0IGhhcyBjaGFuZ2VkLlxuXG52YXIgZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihmYWxzZSk7IC8vIEtlZXAgdHJhY2sgb2YgdGhlIHByZXZpb3VzIGNvbnRleHQgb2JqZWN0IHRoYXQgd2FzIG9uIHRoZSBzdGFjay5cbi8vIFdlIHVzZSB0aGlzIHRvIGdldCBhY2Nlc3MgdG8gdGhlIHBhcmVudCBjb250ZXh0IGFmdGVyIHdlIGhhdmUgYWxyZWFkeVxuLy8gcHVzaGVkIHRoZSBuZXh0IGNvbnRleHQgcHJvdmlkZXIsIGFuZCBub3cgbmVlZCB0byBtZXJnZSB0aGVpciBjb250ZXh0cy5cblxudmFyIHByZXZpb3VzQ29udGV4dCA9IGVtcHR5Q29udGV4dE9iamVjdDtcblxuZnVuY3Rpb24gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIGRpZFB1c2hPd25Db250ZXh0SWZQcm92aWRlcikge1xuICB7XG4gICAgaWYgKGRpZFB1c2hPd25Db250ZXh0SWZQcm92aWRlciAmJiBpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICAvLyBJZiB0aGUgZmliZXIgaXMgYSBjb250ZXh0IHByb3ZpZGVyIGl0c2VsZiwgd2hlbiB3ZSByZWFkIGl0cyBjb250ZXh0XG4gICAgICAvLyB3ZSBtYXkgaGF2ZSBhbHJlYWR5IHB1c2hlZCBpdHMgb3duIGNoaWxkIGNvbnRleHQgb24gdGhlIHN0YWNrLiBBIGNvbnRleHRcbiAgICAgIC8vIHByb3ZpZGVyIHNob3VsZCBub3QgXCJzZWVcIiBpdHMgb3duIGNoaWxkIGNvbnRleHQuIFRoZXJlZm9yZSB3ZSByZWFkIHRoZVxuICAgICAgLy8gcHJldmlvdXMgKHBhcmVudCkgY29udGV4dCBpbnN0ZWFkIGZvciBhIGNvbnRleHQgcHJvdmlkZXIuXG4gICAgICByZXR1cm4gcHJldmlvdXNDb250ZXh0O1xuICAgIH1cblxuICAgIHJldHVybiBjb250ZXh0U3RhY2tDdXJzb3IuY3VycmVudDtcbiAgfVxufVxuXG5mdW5jdGlvbiBjYWNoZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCwgbWFza2VkQ29udGV4dCkge1xuICB7XG4gICAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQgPSB1bm1hc2tlZENvbnRleHQ7XG4gICAgaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNYXNrZWRDaGlsZENvbnRleHQgPSBtYXNrZWRDb250ZXh0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldE1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCkge1xuICB7XG4gICAgdmFyIHR5cGUgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgIHZhciBjb250ZXh0VHlwZXMgPSB0eXBlLmNvbnRleHRUeXBlcztcblxuICAgIGlmICghY29udGV4dFR5cGVzKSB7XG4gICAgICByZXR1cm4gZW1wdHlDb250ZXh0T2JqZWN0O1xuICAgIH0gLy8gQXZvaWQgcmVjcmVhdGluZyBtYXNrZWQgY29udGV4dCB1bmxlc3MgdW5tYXNrZWQgY29udGV4dCBoYXMgY2hhbmdlZC5cbiAgICAvLyBGYWlsaW5nIHRvIGRvIHRoaXMgd2lsbCByZXN1bHQgaW4gdW5uZWNlc3NhcnkgY2FsbHMgdG8gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcy5cbiAgICAvLyBUaGlzIG1heSB0cmlnZ2VyIGluZmluaXRlIGxvb3BzIGlmIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgY2FsbHMgc2V0U3RhdGUuXG5cblxuICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICAgIGlmIChpbnN0YW5jZSAmJiBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0ID09PSB1bm1hc2tlZENvbnRleHQpIHtcbiAgICAgIHJldHVybiBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dDtcbiAgICB9XG5cbiAgICB2YXIgY29udGV4dCA9IHt9O1xuXG4gICAgZm9yICh2YXIga2V5IGluIGNvbnRleHRUeXBlcykge1xuICAgICAgY29udGV4dFtrZXldID0gdW5tYXNrZWRDb250ZXh0W2tleV07XG4gICAgfVxuXG4gICAge1xuICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHdvcmtJblByb2dyZXNzKSB8fCAnVW5rbm93bic7XG4gICAgICBjaGVja1Byb3BUeXBlcyhjb250ZXh0VHlwZXMsIGNvbnRleHQsICdjb250ZXh0JywgbmFtZSk7XG4gICAgfSAvLyBDYWNoZSB1bm1hc2tlZCBjb250ZXh0IHNvIHdlIGNhbiBhdm9pZCByZWNyZWF0aW5nIG1hc2tlZCBjb250ZXh0IHVubGVzcyBuZWNlc3NhcnkuXG4gICAgLy8gQ29udGV4dCBpcyBjcmVhdGVkIGJlZm9yZSB0aGUgY2xhc3MgY29tcG9uZW50IGlzIGluc3RhbnRpYXRlZCBzbyBjaGVjayBmb3IgaW5zdGFuY2UuXG5cblxuICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgY2FjaGVDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQsIGNvbnRleHQpO1xuICAgIH1cblxuICAgIHJldHVybiBjb250ZXh0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc0NvbnRleHRDaGFuZ2VkKCkge1xuICB7XG4gICAgcmV0dXJuIGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IuY3VycmVudDtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0NvbnRleHRQcm92aWRlcih0eXBlKSB7XG4gIHtcbiAgICB2YXIgY2hpbGRDb250ZXh0VHlwZXMgPSB0eXBlLmNoaWxkQ29udGV4dFR5cGVzO1xuICAgIHJldHVybiBjaGlsZENvbnRleHRUeXBlcyAhPT0gbnVsbCAmJiBjaGlsZENvbnRleHRUeXBlcyAhPT0gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvcENvbnRleHQoZmliZXIpIHtcbiAge1xuICAgIHBvcChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBmaWJlcik7XG4gICAgcG9wKGNvbnRleHRTdGFja0N1cnNvciwgZmliZXIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvcFRvcExldmVsQ29udGV4dE9iamVjdChmaWJlcikge1xuICB7XG4gICAgcG9wKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yLCBmaWJlcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHVzaFRvcExldmVsQ29udGV4dE9iamVjdChmaWJlciwgY29udGV4dCwgZGlkQ2hhbmdlKSB7XG4gIHtcbiAgICBpZiAoY29udGV4dFN0YWNrQ3Vyc29yLmN1cnJlbnQgIT09IGVtcHR5Q29udGV4dE9iamVjdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIGNvbnRleHQgZm91bmQgb24gc3RhY2suICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG5cbiAgICBwdXNoKGNvbnRleHRTdGFja0N1cnNvciwgY29udGV4dCwgZmliZXIpO1xuICAgIHB1c2goZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZGlkQ2hhbmdlLCBmaWJlcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0NoaWxkQ29udGV4dChmaWJlciwgdHlwZSwgcGFyZW50Q29udGV4dCkge1xuICB7XG4gICAgdmFyIGluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuICAgIHZhciBjaGlsZENvbnRleHRUeXBlcyA9IHR5cGUuY2hpbGRDb250ZXh0VHlwZXM7IC8vIFRPRE8gKGJ2YXVnaG4pIFJlcGxhY2UgdGhpcyBiZWhhdmlvciB3aXRoIGFuIGludmFyaWFudCgpIGluIHRoZSBmdXR1cmUuXG4gICAgLy8gSXQgaGFzIG9ubHkgYmVlbiBhZGRlZCBpbiBGaWJlciB0byBtYXRjaCB0aGUgKHVuaW50ZW50aW9uYWwpIGJlaGF2aW9yIGluIFN0YWNrLlxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnVW5rbm93bic7XG5cbiAgICAgICAgaWYgKCF3YXJuZWRBYm91dE1pc3NpbmdHZXRDaGlsZENvbnRleHRbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgICB3YXJuZWRBYm91dE1pc3NpbmdHZXRDaGlsZENvbnRleHRbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJyVzLmNoaWxkQ29udGV4dFR5cGVzIGlzIHNwZWNpZmllZCBidXQgdGhlcmUgaXMgbm8gZ2V0Q2hpbGRDb250ZXh0KCkgbWV0aG9kICcgKyAnb24gdGhlIGluc3RhbmNlLiBZb3UgY2FuIGVpdGhlciBkZWZpbmUgZ2V0Q2hpbGRDb250ZXh0KCkgb24gJXMgb3IgcmVtb3ZlICcgKyAnY2hpbGRDb250ZXh0VHlwZXMgZnJvbSBpdC4nLCBjb21wb25lbnROYW1lLCBjb21wb25lbnROYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFyZW50Q29udGV4dDtcbiAgICB9XG5cbiAgICB2YXIgY2hpbGRDb250ZXh0ID0gaW5zdGFuY2UuZ2V0Q2hpbGRDb250ZXh0KCk7XG5cbiAgICBmb3IgKHZhciBjb250ZXh0S2V5IGluIGNoaWxkQ29udGV4dCkge1xuICAgICAgaWYgKCEoY29udGV4dEtleSBpbiBjaGlsZENvbnRleHRUeXBlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnVW5rbm93bicpICsgXCIuZ2V0Q2hpbGRDb250ZXh0KCk6IGtleSBcXFwiXCIgKyBjb250ZXh0S2V5ICsgXCJcXFwiIGlzIG5vdCBkZWZpbmVkIGluIGNoaWxkQ29udGV4dFR5cGVzLlwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB7XG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdVbmtub3duJztcbiAgICAgIGNoZWNrUHJvcFR5cGVzKGNoaWxkQ29udGV4dFR5cGVzLCBjaGlsZENvbnRleHQsICdjaGlsZCBjb250ZXh0JywgbmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFzc2lnbih7fSwgcGFyZW50Q29udGV4dCwgY2hpbGRDb250ZXh0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwdXNoQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzKSB7XG4gIHtcbiAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7IC8vIFdlIHB1c2ggdGhlIGNvbnRleHQgYXMgZWFybHkgYXMgcG9zc2libGUgdG8gZW5zdXJlIHN0YWNrIGludGVncml0eS5cbiAgICAvLyBJZiB0aGUgaW5zdGFuY2UgZG9lcyBub3QgZXhpc3QgeWV0LCB3ZSB3aWxsIHB1c2ggbnVsbCBhdCBmaXJzdCxcbiAgICAvLyBhbmQgcmVwbGFjZSBpdCBvbiB0aGUgc3RhY2sgbGF0ZXIgd2hlbiBpbnZhbGlkYXRpbmcgdGhlIGNvbnRleHQuXG5cbiAgICB2YXIgbWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQgPSBpbnN0YW5jZSAmJiBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dCB8fCBlbXB0eUNvbnRleHRPYmplY3Q7IC8vIFJlbWVtYmVyIHRoZSBwYXJlbnQgY29udGV4dCBzbyB3ZSBjYW4gbWVyZ2Ugd2l0aCBpdCBsYXRlci5cbiAgICAvLyBJbmhlcml0IHRoZSBwYXJlbnQncyBkaWQtcGVyZm9ybS13b3JrIHZhbHVlIHRvIGF2b2lkIGluYWR2ZXJ0ZW50bHkgYmxvY2tpbmcgdXBkYXRlcy5cblxuICAgIHByZXZpb3VzQ29udGV4dCA9IGNvbnRleHRTdGFja0N1cnNvci5jdXJyZW50O1xuICAgIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yLCBtZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgIHB1c2goZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvci5jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW52YWxpZGF0ZUNvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgdHlwZSwgZGlkQ2hhbmdlKSB7XG4gIHtcbiAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIGhhdmUgYW4gaW5zdGFuY2UgYnkgdGhpcyBwb2ludC4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIGlmIChkaWRDaGFuZ2UpIHtcbiAgICAgIC8vIE1lcmdlIHBhcmVudCBhbmQgb3duIGNvbnRleHQuXG4gICAgICAvLyBTa2lwIHRoaXMgaWYgd2UncmUgbm90IHVwZGF0aW5nIGR1ZSB0byBzQ1UuXG4gICAgICAvLyBUaGlzIGF2b2lkcyB1bm5lY2Vzc2FyaWx5IHJlY29tcHV0aW5nIG1lbW9pemVkIHZhbHVlcy5cbiAgICAgIHZhciBtZXJnZWRDb250ZXh0ID0gcHJvY2Vzc0NoaWxkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdHlwZSwgcHJldmlvdXNDb250ZXh0KTtcbiAgICAgIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0ID0gbWVyZ2VkQ29udGV4dDsgLy8gUmVwbGFjZSB0aGUgb2xkIChvciBlbXB0eSkgY29udGV4dCB3aXRoIHRoZSBuZXcgb25lLlxuICAgICAgLy8gSXQgaXMgaW1wb3J0YW50IHRvIHVud2luZCB0aGUgY29udGV4dCBpbiB0aGUgcmV2ZXJzZSBvcmRlci5cblxuICAgICAgcG9wKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHBvcChjb250ZXh0U3RhY2tDdXJzb3IsIHdvcmtJblByb2dyZXNzKTsgLy8gTm93IHB1c2ggdGhlIG5ldyBjb250ZXh0IGFuZCBtYXJrIHRoYXQgaXQgaGFzIGNoYW5nZWQuXG5cbiAgICAgIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yLCBtZXJnZWRDb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBwdXNoKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGRpZENoYW5nZSwgd29ya0luUHJvZ3Jlc3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwb3AoZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcHVzaChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBkaWRDaGFuZ2UsIHdvcmtJblByb2dyZXNzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEN1cnJlbnRVbm1hc2tlZENvbnRleHQoZmliZXIpIHtcbiAge1xuICAgIC8vIEN1cnJlbnRseSB0aGlzIGlzIG9ubHkgdXNlZCB3aXRoIHJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyOyBub3Qgc3VyZSBpZiBpdFxuICAgIC8vIG1ha2VzIHNlbnNlIGVsc2V3aGVyZVxuICAgIGlmICghaXNGaWJlck1vdW50ZWQoZmliZXIpIHx8IGZpYmVyLnRhZyAhPT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgc3VidHJlZSBwYXJlbnQgdG8gYmUgYSBtb3VudGVkIGNsYXNzIGNvbXBvbmVudC4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIHZhciBub2RlID0gZmliZXI7XG5cbiAgICBkbyB7XG4gICAgICBzd2l0Y2ggKG5vZGUudGFnKSB7XG4gICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAgcmV0dXJuIG5vZGUuc3RhdGVOb2RlLmNvbnRleHQ7XG5cbiAgICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgQ29tcG9uZW50ID0gbm9kZS50eXBlO1xuXG4gICAgICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgICAgICByZXR1cm4gbm9kZS5zdGF0ZU5vZGUuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH0gd2hpbGUgKG5vZGUgIT09IG51bGwpO1xuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdGb3VuZCB1bmV4cGVjdGVkIGRldGFjaGVkIHN1YnRyZWUgcGFyZW50LiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cbn1cblxudmFyIExlZ2FjeVJvb3QgPSAwO1xudmFyIENvbmN1cnJlbnRSb290ID0gMTtcblxudmFyIHN5bmNRdWV1ZSA9IG51bGw7XG52YXIgaW5jbHVkZXNMZWdhY3lTeW5jQ2FsbGJhY2tzID0gZmFsc2U7XG52YXIgaXNGbHVzaGluZ1N5bmNRdWV1ZSA9IGZhbHNlO1xuZnVuY3Rpb24gc2NoZWR1bGVTeW5jQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgLy8gUHVzaCB0aGlzIGNhbGxiYWNrIGludG8gYW4gaW50ZXJuYWwgcXVldWUuIFdlJ2xsIGZsdXNoIHRoZXNlIGVpdGhlciBpblxuICAvLyB0aGUgbmV4dCB0aWNrLCBvciBlYXJsaWVyIGlmIHNvbWV0aGluZyBjYWxscyBgZmx1c2hTeW5jQ2FsbGJhY2tRdWV1ZWAuXG4gIGlmIChzeW5jUXVldWUgPT09IG51bGwpIHtcbiAgICBzeW5jUXVldWUgPSBbY2FsbGJhY2tdO1xuICB9IGVsc2Uge1xuICAgIC8vIFB1c2ggb250byBleGlzdGluZyBxdWV1ZS4gRG9uJ3QgbmVlZCB0byBzY2hlZHVsZSBhIGNhbGxiYWNrIGJlY2F1c2VcbiAgICAvLyB3ZSBhbHJlYWR5IHNjaGVkdWxlZCBvbmUgd2hlbiB3ZSBjcmVhdGVkIHRoZSBxdWV1ZS5cbiAgICBzeW5jUXVldWUucHVzaChjYWxsYmFjayk7XG4gIH1cbn1cbmZ1bmN0aW9uIHNjaGVkdWxlTGVnYWN5U3luY0NhbGxiYWNrKGNhbGxiYWNrKSB7XG4gIGluY2x1ZGVzTGVnYWN5U3luY0NhbGxiYWNrcyA9IHRydWU7XG4gIHNjaGVkdWxlU3luY0NhbGxiYWNrKGNhbGxiYWNrKTtcbn1cbmZ1bmN0aW9uIGZsdXNoU3luY0NhbGxiYWNrc09ubHlJbkxlZ2FjeU1vZGUoKSB7XG4gIC8vIE9ubHkgZmx1c2hlcyB0aGUgcXVldWUgaWYgdGhlcmUncyBhIGxlZ2FjeSBzeW5jIGNhbGxiYWNrIHNjaGVkdWxlZC5cbiAgLy8gVE9ETzogVGhlcmUncyBvbmx5IGEgc2luZ2xlIHR5cGUgb2YgY2FsbGJhY2s6IHBlcmZvcm1TeW5jT25Xb3JrT25Sb290LiBTb1xuICAvLyBpdCBtaWdodCBtYWtlIG1vcmUgc2Vuc2UgZm9yIHRoZSBxdWV1ZSB0byBiZSBhIGxpc3Qgb2Ygcm9vdHMgaW5zdGVhZCBvZiBhXG4gIC8vIGxpc3Qgb2YgZ2VuZXJpYyBjYWxsYmFja3MuIFRoZW4gd2UgY2FuIGhhdmUgdHdvOiBvbmUgZm9yIGxlZ2FjeSByb290cywgb25lXG4gIC8vIGZvciBjb25jdXJyZW50IHJvb3RzLiBBbmQgdGhpcyBtZXRob2Qgd291bGQgb25seSBmbHVzaCB0aGUgbGVnYWN5IG9uZXMuXG4gIGlmIChpbmNsdWRlc0xlZ2FjeVN5bmNDYWxsYmFja3MpIHtcbiAgICBmbHVzaFN5bmNDYWxsYmFja3MoKTtcbiAgfVxufVxuZnVuY3Rpb24gZmx1c2hTeW5jQ2FsbGJhY2tzKCkge1xuICBpZiAoIWlzRmx1c2hpbmdTeW5jUXVldWUgJiYgc3luY1F1ZXVlICE9PSBudWxsKSB7XG4gICAgLy8gUHJldmVudCByZS1lbnRyYW5jZS5cbiAgICBpc0ZsdXNoaW5nU3luY1F1ZXVlID0gdHJ1ZTtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIHByZXZpb3VzVXBkYXRlUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcblxuICAgIHRyeSB7XG4gICAgICB2YXIgaXNTeW5jID0gdHJ1ZTtcbiAgICAgIHZhciBxdWV1ZSA9IHN5bmNRdWV1ZTsgLy8gVE9ETzogSXMgdGhpcyBuZWNlc3NhcnkgYW55bW9yZT8gVGhlIG9ubHkgdXNlciBjb2RlIHRoYXQgcnVucyBpbiB0aGlzXG4gICAgICAvLyBxdWV1ZSBpcyBpbiB0aGUgcmVuZGVyIG9yIGNvbW1pdCBwaGFzZXMuXG5cbiAgICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShEaXNjcmV0ZUV2ZW50UHJpb3JpdHkpO1xuXG4gICAgICBmb3IgKDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IHF1ZXVlW2ldO1xuXG4gICAgICAgIGRvIHtcbiAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrKGlzU3luYyk7XG4gICAgICAgIH0gd2hpbGUgKGNhbGxiYWNrICE9PSBudWxsKTtcbiAgICAgIH1cblxuICAgICAgc3luY1F1ZXVlID0gbnVsbDtcbiAgICAgIGluY2x1ZGVzTGVnYWN5U3luY0NhbGxiYWNrcyA9IGZhbHNlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBJZiBzb21ldGhpbmcgdGhyb3dzLCBsZWF2ZSB0aGUgcmVtYWluaW5nIGNhbGxiYWNrcyBvbiB0aGUgcXVldWUuXG4gICAgICBpZiAoc3luY1F1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgIHN5bmNRdWV1ZSA9IHN5bmNRdWV1ZS5zbGljZShpICsgMSk7XG4gICAgICB9IC8vIFJlc3VtZSBmbHVzaGluZyBpbiB0aGUgbmV4dCB0aWNrXG5cblxuICAgICAgc2NoZWR1bGVDYWxsYmFjayhJbW1lZGlhdGVQcmlvcml0eSwgZmx1c2hTeW5jQ2FsbGJhY2tzKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNVcGRhdGVQcmlvcml0eSk7XG4gICAgICBpc0ZsdXNoaW5nU3luY1F1ZXVlID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vIFRPRE86IFVzZSB0aGUgdW5pZmllZCBmaWJlciBzdGFjayBtb2R1bGUgaW5zdGVhZCBvZiB0aGlzIGxvY2FsIG9uZT9cbi8vIEludGVudGlvbmFsbHkgbm90IHVzaW5nIGl0IHlldCB0byBkZXJpc2sgdGhlIGluaXRpYWwgaW1wbGVtZW50YXRpb24sIGJlY2F1c2Vcbi8vIHRoZSB3YXkgd2UgcHVzaC9wb3AgdGhlc2UgdmFsdWVzIGlzIGEgYml0IHVudXN1YWwuIElmIHRoZXJlJ3MgYSBtaXN0YWtlLCBJJ2Rcbi8vIHJhdGhlciB0aGUgaWRzIGJlIHdyb25nIHRoYW4gY3Jhc2ggdGhlIHdob2xlIHJlY29uY2lsZXIuXG52YXIgZm9ya1N0YWNrID0gW107XG52YXIgZm9ya1N0YWNrSW5kZXggPSAwO1xudmFyIHRyZWVGb3JrUHJvdmlkZXIgPSBudWxsO1xudmFyIHRyZWVGb3JrQ291bnQgPSAwO1xudmFyIGlkU3RhY2sgPSBbXTtcbnZhciBpZFN0YWNrSW5kZXggPSAwO1xudmFyIHRyZWVDb250ZXh0UHJvdmlkZXIgPSBudWxsO1xudmFyIHRyZWVDb250ZXh0SWQgPSAxO1xudmFyIHRyZWVDb250ZXh0T3ZlcmZsb3cgPSAnJztcbmZ1bmN0aW9uIGlzRm9ya2VkQ2hpbGQod29ya0luUHJvZ3Jlc3MpIHtcbiAgd2FybklmTm90SHlkcmF0aW5nKCk7XG4gIHJldHVybiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBGb3JrZWQpICE9PSBOb0ZsYWdzO1xufVxuZnVuY3Rpb24gZ2V0Rm9ya3NBdExldmVsKHdvcmtJblByb2dyZXNzKSB7XG4gIHdhcm5JZk5vdEh5ZHJhdGluZygpO1xuICByZXR1cm4gdHJlZUZvcmtDb3VudDtcbn1cbmZ1bmN0aW9uIGdldFRyZWVJZCgpIHtcbiAgdmFyIG92ZXJmbG93ID0gdHJlZUNvbnRleHRPdmVyZmxvdztcbiAgdmFyIGlkV2l0aExlYWRpbmdCaXQgPSB0cmVlQ29udGV4dElkO1xuICB2YXIgaWQgPSBpZFdpdGhMZWFkaW5nQml0ICYgfmdldExlYWRpbmdCaXQoaWRXaXRoTGVhZGluZ0JpdCk7XG4gIHJldHVybiBpZC50b1N0cmluZygzMikgKyBvdmVyZmxvdztcbn1cbmZ1bmN0aW9uIHB1c2hUcmVlRm9yayh3b3JrSW5Qcm9ncmVzcywgdG90YWxDaGlsZHJlbikge1xuICAvLyBUaGlzIGlzIGNhbGxlZCByaWdodCBhZnRlciB3ZSByZWNvbmNpbGUgYW4gYXJyYXkgKG9yIGl0ZXJhdG9yKSBvZiBjaGlsZFxuICAvLyBmaWJlcnMsIGJlY2F1c2UgdGhhdCdzIHRoZSBvbmx5IHBsYWNlIHdoZXJlIHdlIGtub3cgaG93IG1hbnkgY2hpbGRyZW4gaW5cbiAgLy8gdGhlIHdob2xlIHNldCB3aXRob3V0IGRvaW5nIGV4dHJhIHdvcmsgbGF0ZXIsIG9yIHN0b3JpbmcgYWRkdGlvbmFsXG4gIC8vIGluZm9ybWF0aW9uIG9uIHRoZSBmaWJlci5cbiAgLy9cbiAgLy8gVGhhdCdzIHdoeSB0aGlzIGZ1bmN0aW9uIGlzIHNlcGFyYXRlIGZyb20gcHVzaFRyZWVJZCBcdTIwMTQgaXQncyBjYWxsZWQgZHVyaW5nXG4gIC8vIHRoZSByZW5kZXIgcGhhc2Ugb2YgdGhlIGZvcmsgcGFyZW50LCBub3QgdGhlIGNoaWxkLCB3aGljaCBpcyB3aGVyZSB3ZSBwdXNoXG4gIC8vIHRoZSBvdGhlciBjb250ZXh0IHZhbHVlcy5cbiAgLy9cbiAgLy8gSW4gdGhlIEZpenogaW1wbGVtZW50YXRpb24gdGhpcyBpcyBtdWNoIHNpbXBsZXIgYmVjYXVzZSB0aGUgY2hpbGQgaXNcbiAgLy8gcmVuZGVyZWQgaW4gdGhlIHNhbWUgY2FsbHN0YWNrIGFzIHRoZSBwYXJlbnQuXG4gIC8vXG4gIC8vIEl0IG1pZ2h0IGJlIGJldHRlciB0byBqdXN0IGFkZCBhIGBmb3Jrc2AgZmllbGQgdG8gdGhlIEZpYmVyIHR5cGUuIEl0IHdvdWxkXG4gIC8vIG1ha2UgdGhpcyBtb2R1bGUgc2ltcGxlci5cbiAgd2FybklmTm90SHlkcmF0aW5nKCk7XG4gIGZvcmtTdGFja1tmb3JrU3RhY2tJbmRleCsrXSA9IHRyZWVGb3JrQ291bnQ7XG4gIGZvcmtTdGFja1tmb3JrU3RhY2tJbmRleCsrXSA9IHRyZWVGb3JrUHJvdmlkZXI7XG4gIHRyZWVGb3JrUHJvdmlkZXIgPSB3b3JrSW5Qcm9ncmVzcztcbiAgdHJlZUZvcmtDb3VudCA9IHRvdGFsQ2hpbGRyZW47XG59XG5mdW5jdGlvbiBwdXNoVHJlZUlkKHdvcmtJblByb2dyZXNzLCB0b3RhbENoaWxkcmVuLCBpbmRleCkge1xuICB3YXJuSWZOb3RIeWRyYXRpbmcoKTtcbiAgaWRTdGFja1tpZFN0YWNrSW5kZXgrK10gPSB0cmVlQ29udGV4dElkO1xuICBpZFN0YWNrW2lkU3RhY2tJbmRleCsrXSA9IHRyZWVDb250ZXh0T3ZlcmZsb3c7XG4gIGlkU3RhY2tbaWRTdGFja0luZGV4KytdID0gdHJlZUNvbnRleHRQcm92aWRlcjtcbiAgdHJlZUNvbnRleHRQcm92aWRlciA9IHdvcmtJblByb2dyZXNzO1xuICB2YXIgYmFzZUlkV2l0aExlYWRpbmdCaXQgPSB0cmVlQ29udGV4dElkO1xuICB2YXIgYmFzZU92ZXJmbG93ID0gdHJlZUNvbnRleHRPdmVyZmxvdzsgLy8gVGhlIGxlZnRtb3N0IDEgbWFya3MgdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UsIG5vbi1pbmNsdXNpdmUuIEl0J3Mgbm90IHBhcnRcbiAgLy8gb2YgdGhlIGlkOyB3ZSB1c2UgaXQgdG8gYWNjb3VudCBmb3IgbGVhZGluZyAwcy5cblxuICB2YXIgYmFzZUxlbmd0aCA9IGdldEJpdExlbmd0aChiYXNlSWRXaXRoTGVhZGluZ0JpdCkgLSAxO1xuICB2YXIgYmFzZUlkID0gYmFzZUlkV2l0aExlYWRpbmdCaXQgJiB+KDEgPDwgYmFzZUxlbmd0aCk7XG4gIHZhciBzbG90ID0gaW5kZXggKyAxO1xuICB2YXIgbGVuZ3RoID0gZ2V0Qml0TGVuZ3RoKHRvdGFsQ2hpbGRyZW4pICsgYmFzZUxlbmd0aDsgLy8gMzAgaXMgdGhlIG1heCBsZW5ndGggd2UgY2FuIHN0b3JlIHdpdGhvdXQgb3ZlcmZsb3dpbmcsIHRha2luZyBpbnRvXG4gIC8vIGNvbnNpZGVyYXRpb24gdGhlIGxlYWRpbmcgMSB3ZSB1c2UgdG8gbWFyayB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZS5cblxuICBpZiAobGVuZ3RoID4gMzApIHtcbiAgICAvLyBXZSBvdmVyZmxvd2VkIHRoZSBiaXR3aXNlLXNhZmUgcmFuZ2UuIEZhbGwgYmFjayB0byBzbG93ZXIgYWxnb3JpdGhtLlxuICAgIC8vIFRoaXMgYnJhbmNoIGFzc3VtZXMgdGhlIGxlbmd0aCBvZiB0aGUgYmFzZSBpZCBpcyBncmVhdGVyIHRoYW4gNTsgaXQgd29uJ3RcbiAgICAvLyB3b3JrIGZvciBzbWFsbGVyIGlkcywgYmVjYXVzZSB5b3UgbmVlZCA1IGJpdHMgcGVyIGNoYXJhY3Rlci5cbiAgICAvL1xuICAgIC8vIFdlIGVuY29kZSB0aGUgaWQgaW4gbXVsdGlwbGUgc3RlcHM6IGZpcnN0IHRoZSBiYXNlIGlkLCB0aGVuIHRoZVxuICAgIC8vIHJlbWFpbmluZyBkaWdpdHMuXG4gICAgLy9cbiAgICAvLyBFYWNoIDUgYml0IHNlcXVlbmNlIGNvcnJlc3BvbmRzIHRvIGEgc2luZ2xlIGJhc2UgMzIgY2hhcmFjdGVyLiBTbyBmb3JcbiAgICAvLyBleGFtcGxlLCBpZiB0aGUgY3VycmVudCBpZCBpcyAyMyBiaXRzIGxvbmcsIHdlIGNhbiBjb252ZXJ0IDIwIG9mIHRob3NlXG4gICAgLy8gYml0cyBpbnRvIGEgc3RyaW5nIG9mIDQgY2hhcmFjdGVycywgd2l0aCAzIGJpdHMgbGVmdCBvdmVyLlxuICAgIC8vXG4gICAgLy8gRmlyc3QgY2FsY3VsYXRlIGhvdyBtYW55IGJpdHMgaW4gdGhlIGJhc2UgaWQgcmVwcmVzZW50IGEgY29tcGxldGVcbiAgICAvLyBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzLlxuICAgIHZhciBudW1iZXJPZk92ZXJmbG93Qml0cyA9IGJhc2VMZW5ndGggLSBiYXNlTGVuZ3RoICUgNTsgLy8gVGhlbiBjcmVhdGUgYSBiaXRtYXNrIHRoYXQgc2VsZWN0cyBvbmx5IHRob3NlIGJpdHMuXG5cbiAgICB2YXIgbmV3T3ZlcmZsb3dCaXRzID0gKDEgPDwgbnVtYmVyT2ZPdmVyZmxvd0JpdHMpIC0gMTsgLy8gU2VsZWN0IHRoZSBiaXRzLCBhbmQgY29udmVydCB0aGVtIHRvIGEgYmFzZSAzMiBzdHJpbmcuXG5cbiAgICB2YXIgbmV3T3ZlcmZsb3cgPSAoYmFzZUlkICYgbmV3T3ZlcmZsb3dCaXRzKS50b1N0cmluZygzMik7IC8vIE5vdyB3ZSBjYW4gcmVtb3ZlIHRob3NlIGJpdHMgZnJvbSB0aGUgYmFzZSBpZC5cblxuICAgIHZhciByZXN0T2ZCYXNlSWQgPSBiYXNlSWQgPj4gbnVtYmVyT2ZPdmVyZmxvd0JpdHM7XG4gICAgdmFyIHJlc3RPZkJhc2VMZW5ndGggPSBiYXNlTGVuZ3RoIC0gbnVtYmVyT2ZPdmVyZmxvd0JpdHM7IC8vIEZpbmFsbHksIGVuY29kZSB0aGUgcmVzdCBvZiB0aGUgYml0cyB1c2luZyB0aGUgbm9ybWFsIGFsZ29yaXRobS4gQmVjYXVzZVxuICAgIC8vIHdlIG1hZGUgbW9yZSByb29tLCB0aGlzIHRpbWUgaXQgd29uJ3Qgb3ZlcmZsb3cuXG5cbiAgICB2YXIgcmVzdE9mTGVuZ3RoID0gZ2V0Qml0TGVuZ3RoKHRvdGFsQ2hpbGRyZW4pICsgcmVzdE9mQmFzZUxlbmd0aDtcbiAgICB2YXIgcmVzdE9mTmV3Qml0cyA9IHNsb3QgPDwgcmVzdE9mQmFzZUxlbmd0aDtcbiAgICB2YXIgaWQgPSByZXN0T2ZOZXdCaXRzIHwgcmVzdE9mQmFzZUlkO1xuICAgIHZhciBvdmVyZmxvdyA9IG5ld092ZXJmbG93ICsgYmFzZU92ZXJmbG93O1xuICAgIHRyZWVDb250ZXh0SWQgPSAxIDw8IHJlc3RPZkxlbmd0aCB8IGlkO1xuICAgIHRyZWVDb250ZXh0T3ZlcmZsb3cgPSBvdmVyZmxvdztcbiAgfSBlbHNlIHtcbiAgICAvLyBOb3JtYWwgcGF0aFxuICAgIHZhciBuZXdCaXRzID0gc2xvdCA8PCBiYXNlTGVuZ3RoO1xuXG4gICAgdmFyIF9pZCA9IG5ld0JpdHMgfCBiYXNlSWQ7XG5cbiAgICB2YXIgX292ZXJmbG93ID0gYmFzZU92ZXJmbG93O1xuICAgIHRyZWVDb250ZXh0SWQgPSAxIDw8IGxlbmd0aCB8IF9pZDtcbiAgICB0cmVlQ29udGV4dE92ZXJmbG93ID0gX292ZXJmbG93O1xuICB9XG59XG5mdW5jdGlvbiBwdXNoTWF0ZXJpYWxpemVkVHJlZUlkKHdvcmtJblByb2dyZXNzKSB7XG4gIHdhcm5JZk5vdEh5ZHJhdGluZygpOyAvLyBUaGlzIGNvbXBvbmVudCBtYXRlcmlhbGl6ZWQgYW4gaWQuIFRoaXMgd2lsbCBhZmZlY3QgYW55IGlkcyB0aGF0IGFwcGVhclxuICAvLyBpbiBpdHMgY2hpbGRyZW4uXG5cbiAgdmFyIHJldHVybkZpYmVyID0gd29ya0luUHJvZ3Jlc3MucmV0dXJuO1xuXG4gIGlmIChyZXR1cm5GaWJlciAhPT0gbnVsbCkge1xuICAgIHZhciBudW1iZXJPZkZvcmtzID0gMTtcbiAgICB2YXIgc2xvdEluZGV4ID0gMDtcbiAgICBwdXNoVHJlZUZvcmsod29ya0luUHJvZ3Jlc3MsIG51bWJlck9mRm9ya3MpO1xuICAgIHB1c2hUcmVlSWQod29ya0luUHJvZ3Jlc3MsIG51bWJlck9mRm9ya3MsIHNsb3RJbmRleCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0Qml0TGVuZ3RoKG51bWJlcikge1xuICByZXR1cm4gMzIgLSBjbHozMihudW1iZXIpO1xufVxuXG5mdW5jdGlvbiBnZXRMZWFkaW5nQml0KGlkKSB7XG4gIHJldHVybiAxIDw8IGdldEJpdExlbmd0aChpZCkgLSAxO1xufVxuXG5mdW5jdGlvbiBwb3BUcmVlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcykge1xuICAvLyBSZXN0b3JlIHRoZSBwcmV2aW91cyB2YWx1ZXMuXG4gIC8vIFRoaXMgaXMgYSBiaXQgbW9yZSBjb21wbGljYXRlZCB0aGFuIG90aGVyIGNvbnRleHQtbGlrZSBtb2R1bGVzIGluIEZpYmVyXG4gIC8vIGJlY2F1c2UgdGhlIHNhbWUgRmliZXIgbWF5IGFwcGVhciBvbiB0aGUgc3RhY2sgbXVsdGlwbGUgdGltZXMgYW5kIGZvclxuICAvLyBkaWZmZXJlbnQgcmVhc29ucy4gV2UgaGF2ZSB0byBrZWVwIHBvcHBpbmcgdW50aWwgdGhlIHdvcmstaW4tcHJvZ3Jlc3MgaXNcbiAgLy8gbm8gbG9uZ2VyIGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrLlxuICB3aGlsZSAod29ya0luUHJvZ3Jlc3MgPT09IHRyZWVGb3JrUHJvdmlkZXIpIHtcbiAgICB0cmVlRm9ya1Byb3ZpZGVyID0gZm9ya1N0YWNrWy0tZm9ya1N0YWNrSW5kZXhdO1xuICAgIGZvcmtTdGFja1tmb3JrU3RhY2tJbmRleF0gPSBudWxsO1xuICAgIHRyZWVGb3JrQ291bnQgPSBmb3JrU3RhY2tbLS1mb3JrU3RhY2tJbmRleF07XG4gICAgZm9ya1N0YWNrW2ZvcmtTdGFja0luZGV4XSA9IG51bGw7XG4gIH1cblxuICB3aGlsZSAod29ya0luUHJvZ3Jlc3MgPT09IHRyZWVDb250ZXh0UHJvdmlkZXIpIHtcbiAgICB0cmVlQ29udGV4dFByb3ZpZGVyID0gaWRTdGFja1stLWlkU3RhY2tJbmRleF07XG4gICAgaWRTdGFja1tpZFN0YWNrSW5kZXhdID0gbnVsbDtcbiAgICB0cmVlQ29udGV4dE92ZXJmbG93ID0gaWRTdGFja1stLWlkU3RhY2tJbmRleF07XG4gICAgaWRTdGFja1tpZFN0YWNrSW5kZXhdID0gbnVsbDtcbiAgICB0cmVlQ29udGV4dElkID0gaWRTdGFja1stLWlkU3RhY2tJbmRleF07XG4gICAgaWRTdGFja1tpZFN0YWNrSW5kZXhdID0gbnVsbDtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0U3VzcGVuZGVkVHJlZUNvbnRleHQoKSB7XG4gIHdhcm5JZk5vdEh5ZHJhdGluZygpO1xuXG4gIGlmICh0cmVlQ29udGV4dFByb3ZpZGVyICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0cmVlQ29udGV4dElkLFxuICAgICAgb3ZlcmZsb3c6IHRyZWVDb250ZXh0T3ZlcmZsb3dcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5mdW5jdGlvbiByZXN0b3JlU3VzcGVuZGVkVHJlZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbmRlZENvbnRleHQpIHtcbiAgd2FybklmTm90SHlkcmF0aW5nKCk7XG4gIGlkU3RhY2tbaWRTdGFja0luZGV4KytdID0gdHJlZUNvbnRleHRJZDtcbiAgaWRTdGFja1tpZFN0YWNrSW5kZXgrK10gPSB0cmVlQ29udGV4dE92ZXJmbG93O1xuICBpZFN0YWNrW2lkU3RhY2tJbmRleCsrXSA9IHRyZWVDb250ZXh0UHJvdmlkZXI7XG4gIHRyZWVDb250ZXh0SWQgPSBzdXNwZW5kZWRDb250ZXh0LmlkO1xuICB0cmVlQ29udGV4dE92ZXJmbG93ID0gc3VzcGVuZGVkQ29udGV4dC5vdmVyZmxvdztcbiAgdHJlZUNvbnRleHRQcm92aWRlciA9IHdvcmtJblByb2dyZXNzO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZOb3RIeWRyYXRpbmcoKSB7XG4gIHtcbiAgICBpZiAoIWdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCB0byBiZSBoeWRyYXRpbmcuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlICcgKyAnYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG59XG5cbi8vIFRoaXMgbWF5IGhhdmUgYmVlbiBhbiBpbnNlcnRpb24gb3IgYSBoeWRyYXRpb24uXG5cbnZhciBoeWRyYXRpb25QYXJlbnRGaWJlciA9IG51bGw7XG52YXIgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IG51bGw7XG52YXIgaXNIeWRyYXRpbmcgPSBmYWxzZTsgLy8gVGhpcyBmbGFnIGFsbG93cyBmb3Igd2FybmluZyBzdXByZXNzaW9uIHdoZW4gd2UgZXhwZWN0IHRoZXJlIHRvIGJlIG1pc21hdGNoZXNcbi8vIGR1ZSB0byBlYXJsaWVyIG1pc21hdGNoZXMgb3IgYSBzdXNwZW5kZWQgZmliZXIuXG5cbnZhciBkaWRTdXNwZW5kT3JFcnJvckRFViA9IGZhbHNlOyAvLyBIeWRyYXRpb24gZXJyb3JzIHRoYXQgd2VyZSB0aHJvd24gaW5zaWRlIHRoaXMgYm91bmRhcnlcblxudmFyIGh5ZHJhdGlvbkVycm9ycyA9IG51bGw7XG5cbmZ1bmN0aW9uIHdhcm5JZkh5ZHJhdGluZygpIHtcbiAge1xuICAgIGlmIChpc0h5ZHJhdGluZykge1xuICAgICAgZXJyb3IoJ1dlIHNob3VsZCBub3QgYmUgaHlkcmF0aW5nIGhlcmUuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGEgYnVnLicpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtYXJrRGlkVGhyb3dXaGlsZUh5ZHJhdGluZ0RFVigpIHtcbiAge1xuICAgIGRpZFN1c3BlbmRPckVycm9yREVWID0gdHJ1ZTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkU3VzcGVuZE9yRXJyb3JXaGlsZUh5ZHJhdGluZ0RFVigpIHtcbiAge1xuICAgIHJldHVybiBkaWRTdXNwZW5kT3JFcnJvckRFVjtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbnRlckh5ZHJhdGlvblN0YXRlKGZpYmVyKSB7XG5cbiAgdmFyIHBhcmVudEluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZFdpdGhpbkNvbnRhaW5lcihwYXJlbnRJbnN0YW5jZSk7XG4gIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7XG4gIGlzSHlkcmF0aW5nID0gdHJ1ZTtcbiAgaHlkcmF0aW9uRXJyb3JzID0gbnVsbDtcbiAgZGlkU3VzcGVuZE9yRXJyb3JERVYgPSBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlZW50ZXJIeWRyYXRpb25TdGF0ZUZyb21EZWh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZShmaWJlciwgc3VzcGVuc2VJbnN0YW5jZSwgdHJlZUNvbnRleHQpIHtcblxuICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGRXaXRoaW5TdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpO1xuICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyO1xuICBpc0h5ZHJhdGluZyA9IHRydWU7XG4gIGh5ZHJhdGlvbkVycm9ycyA9IG51bGw7XG4gIGRpZFN1c3BlbmRPckVycm9yREVWID0gZmFsc2U7XG5cbiAgaWYgKHRyZWVDb250ZXh0ICE9PSBudWxsKSB7XG4gICAgcmVzdG9yZVN1c3BlbmRlZFRyZWVDb250ZXh0KGZpYmVyLCB0cmVlQ29udGV4dCk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gd2FyblVuaHlkcmF0ZWRJbnN0YW5jZShyZXR1cm5GaWJlciwgaW5zdGFuY2UpIHtcbiAge1xuICAgIHN3aXRjaCAocmV0dXJuRmliZXIudGFnKSB7XG4gICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICB7XG4gICAgICAgICAgZGlkTm90SHlkcmF0ZUluc3RhbmNlV2l0aGluQ29udGFpbmVyKHJldHVybkZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLCBpbnN0YW5jZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGlzQ29uY3VycmVudE1vZGUgPSAocmV0dXJuRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuICAgICAgICAgIGRpZE5vdEh5ZHJhdGVJbnN0YW5jZShyZXR1cm5GaWJlci50eXBlLCByZXR1cm5GaWJlci5tZW1vaXplZFByb3BzLCByZXR1cm5GaWJlci5zdGF0ZU5vZGUsIGluc3RhbmNlLCAvLyBUT0RPOiBEZWxldGUgdGhpcyBhcmd1bWVudCB3aGVuIHdlIHJlbW92ZSB0aGUgbGVnYWN5IHJvb3QgQVBJLlxuICAgICAgICAgIGlzQ29uY3VycmVudE1vZGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IHJldHVybkZpYmVyLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgaWYgKHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkgZGlkTm90SHlkcmF0ZUluc3RhbmNlV2l0aGluU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQsIGluc3RhbmNlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkZWxldGVIeWRyYXRhYmxlSW5zdGFuY2UocmV0dXJuRmliZXIsIGluc3RhbmNlKSB7XG4gIHdhcm5Vbmh5ZHJhdGVkSW5zdGFuY2UocmV0dXJuRmliZXIsIGluc3RhbmNlKTtcbiAgdmFyIGNoaWxkVG9EZWxldGUgPSBjcmVhdGVGaWJlckZyb21Ib3N0SW5zdGFuY2VGb3JEZWxldGlvbigpO1xuICBjaGlsZFRvRGVsZXRlLnN0YXRlTm9kZSA9IGluc3RhbmNlO1xuICBjaGlsZFRvRGVsZXRlLnJldHVybiA9IHJldHVybkZpYmVyO1xuICB2YXIgZGVsZXRpb25zID0gcmV0dXJuRmliZXIuZGVsZXRpb25zO1xuXG4gIGlmIChkZWxldGlvbnMgPT09IG51bGwpIHtcbiAgICByZXR1cm5GaWJlci5kZWxldGlvbnMgPSBbY2hpbGRUb0RlbGV0ZV07XG4gICAgcmV0dXJuRmliZXIuZmxhZ3MgfD0gQ2hpbGREZWxldGlvbjtcbiAgfSBlbHNlIHtcbiAgICBkZWxldGlvbnMucHVzaChjaGlsZFRvRGVsZXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuTm9uaHlkcmF0ZWRJbnN0YW5jZShyZXR1cm5GaWJlciwgZmliZXIpIHtcbiAge1xuICAgIGlmIChkaWRTdXNwZW5kT3JFcnJvckRFVikge1xuICAgICAgLy8gSW5zaWRlIGEgYm91bmRhcnkgdGhhdCBhbHJlYWR5IHN1c3BlbmRlZC4gV2UncmUgY3VycmVudGx5IHJlbmRlcmluZyB0aGVcbiAgICAgIC8vIHNpYmxpbmdzIG9mIGEgc3VzcGVuZGVkIG5vZGUuIFRoZSBtaXNtYXRjaCBtYXkgYmUgZHVlIHRvIHRoZSBtaXNzaW5nXG4gICAgICAvLyBkYXRhLCBzbyBpdCdzIHByb2JhYmx5IGEgZmFsc2UgcG9zaXRpdmUuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoIChyZXR1cm5GaWJlci50YWcpIHtcbiAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgcGFyZW50Q29udGFpbmVyID0gcmV0dXJuRmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG5cbiAgICAgICAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgICAgICB2YXIgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgICAgICAgICAgIHZhciBwcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVJbnN0YW5jZVdpdGhpbkNvbnRhaW5lcihwYXJlbnRDb250YWluZXIsIHR5cGUpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgICAgICAgICAgdmFyIHRleHQgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlVGV4dEluc3RhbmNlV2l0aGluQ29udGFpbmVyKHBhcmVudENvbnRhaW5lciwgdGV4dCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBwYXJlbnRUeXBlID0gcmV0dXJuRmliZXIudHlwZTtcbiAgICAgICAgICB2YXIgcGFyZW50UHJvcHMgPSByZXR1cm5GaWJlci5tZW1vaXplZFByb3BzO1xuICAgICAgICAgIHZhciBwYXJlbnRJbnN0YW5jZSA9IHJldHVybkZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgX3R5cGUgPSBmaWJlci50eXBlO1xuICAgICAgICAgICAgICAgIHZhciBfcHJvcHMgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICAgICAgdmFyIGlzQ29uY3VycmVudE1vZGUgPSAocmV0dXJuRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuICAgICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlSW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCBfdHlwZSwgX3Byb3BzLCAvLyBUT0RPOiBEZWxldGUgdGhpcyBhcmd1bWVudCB3aGVuIHdlIHJlbW92ZSB0aGUgbGVnYWN5IHJvb3QgQVBJLlxuICAgICAgICAgICAgICAgIGlzQ29uY3VycmVudE1vZGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgX3RleHQgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG5cbiAgICAgICAgICAgICAgICB2YXIgX2lzQ29uY3VycmVudE1vZGUgPSAocmV0dXJuRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuXG4gICAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVUZXh0SW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCBfdGV4dCwgLy8gVE9ETzogRGVsZXRlIHRoaXMgYXJndW1lbnQgd2hlbiB3ZSByZW1vdmUgdGhlIGxlZ2FjeSByb290IEFQSS5cbiAgICAgICAgICAgICAgICBfaXNDb25jdXJyZW50TW9kZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIHN1c3BlbnNlU3RhdGUgPSByZXR1cm5GaWJlci5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgIHZhciBfcGFyZW50SW5zdGFuY2UgPSBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQ7XG4gICAgICAgICAgaWYgKF9wYXJlbnRJbnN0YW5jZSAhPT0gbnVsbCkgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICAgICAgdmFyIF90eXBlMiA9IGZpYmVyLnR5cGU7XG4gICAgICAgICAgICAgIHZhciBfcHJvcHMyID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICAgICAgICBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlV2l0aGluU3VzcGVuc2VJbnN0YW5jZShfcGFyZW50SW5zdGFuY2UsIF90eXBlMik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgICAgICAgICB2YXIgX3RleHQyID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICAgICAgICBkaWROb3RGaW5kSHlkcmF0YWJsZVRleHRJbnN0YW5jZVdpdGhpblN1c3BlbnNlSW5zdGFuY2UoX3BhcmVudEluc3RhbmNlLCBfdGV4dDIpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnNlcnROb25IeWRyYXRlZEluc3RhbmNlKHJldHVybkZpYmVyLCBmaWJlcikge1xuICBmaWJlci5mbGFncyA9IGZpYmVyLmZsYWdzICYgfkh5ZHJhdGluZyB8IFBsYWNlbWVudDtcbiAgd2Fybk5vbmh5ZHJhdGVkSW5zdGFuY2UocmV0dXJuRmliZXIsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gdHJ5SHlkcmF0ZShmaWJlciwgbmV4dEluc3RhbmNlKSB7XG4gIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgICAgIHZhciBwcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgdmFyIGluc3RhbmNlID0gY2FuSHlkcmF0ZUluc3RhbmNlKG5leHRJbnN0YW5jZSwgdHlwZSk7XG5cbiAgICAgICAgaWYgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgZmliZXIuc3RhdGVOb2RlID0gaW5zdGFuY2U7XG4gICAgICAgICAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBmaWJlcjtcbiAgICAgICAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGQoaW5zdGFuY2UpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHRleHQgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgIHZhciB0ZXh0SW5zdGFuY2UgPSBjYW5IeWRyYXRlVGV4dEluc3RhbmNlKG5leHRJbnN0YW5jZSwgdGV4dCk7XG5cbiAgICAgICAgaWYgKHRleHRJbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGZpYmVyLnN0YXRlTm9kZSA9IHRleHRJbnN0YW5jZTtcbiAgICAgICAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyOyAvLyBUZXh0IEluc3RhbmNlcyBkb24ndCBoYXZlIGNoaWxkcmVuIHNvIHRoZXJlJ3Mgbm90aGluZyB0byBoeWRyYXRlLlxuXG4gICAgICAgICAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IG51bGw7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgc3VzcGVuc2VJbnN0YW5jZSA9IGNhbkh5ZHJhdGVTdXNwZW5zZUluc3RhbmNlKG5leHRJbnN0YW5jZSk7XG5cbiAgICAgICAgaWYgKHN1c3BlbnNlSW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IHtcbiAgICAgICAgICAgIGRlaHlkcmF0ZWQ6IHN1c3BlbnNlSW5zdGFuY2UsXG4gICAgICAgICAgICB0cmVlQ29udGV4dDogZ2V0U3VzcGVuZGVkVHJlZUNvbnRleHQoKSxcbiAgICAgICAgICAgIHJldHJ5TGFuZTogT2Zmc2NyZWVuTGFuZVxuICAgICAgICAgIH07XG4gICAgICAgICAgZmliZXIubWVtb2l6ZWRTdGF0ZSA9IHN1c3BlbnNlU3RhdGU7IC8vIFN0b3JlIHRoZSBkZWh5ZHJhdGVkIGZyYWdtZW50IGFzIGEgY2hpbGQgZmliZXIuXG4gICAgICAgICAgLy8gVGhpcyBzaW1wbGlmaWVzIHRoZSBjb2RlIGZvciBnZXRIb3N0U2libGluZyBhbmQgZGVsZXRpbmcgbm9kZXMsXG4gICAgICAgICAgLy8gc2luY2UgaXQgZG9lc24ndCBoYXZlIHRvIGNvbnNpZGVyIGFsbCBTdXNwZW5zZSBib3VuZGFyaWVzIGFuZFxuICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZXkncmUgZGVoeWRyYXRlZCBvbmVzIG9yIG5vdC5cblxuICAgICAgICAgIHZhciBkZWh5ZHJhdGVkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21EZWh5ZHJhdGVkRnJhZ21lbnQoc3VzcGVuc2VJbnN0YW5jZSk7XG4gICAgICAgICAgZGVoeWRyYXRlZEZyYWdtZW50LnJldHVybiA9IGZpYmVyO1xuICAgICAgICAgIGZpYmVyLmNoaWxkID0gZGVoeWRyYXRlZEZyYWdtZW50O1xuICAgICAgICAgIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7IC8vIFdoaWxlIGEgU3VzcGVuc2UgSW5zdGFuY2UgZG9lcyBoYXZlIGNoaWxkcmVuLCB3ZSB3b24ndCBzdGVwIGludG9cbiAgICAgICAgICAvLyBpdCBkdXJpbmcgdGhlIGZpcnN0IHBhc3MuIEluc3RlYWQsIHdlJ2xsIHJlZW50ZXIgaXQgbGF0ZXIuXG5cbiAgICAgICAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gbnVsbDtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkQ2xpZW50UmVuZGVyT25NaXNtYXRjaChmaWJlcikge1xuICByZXR1cm4gKGZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSAmJiAoZmliZXIuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gTm9GbGFncztcbn1cblxuZnVuY3Rpb24gdGhyb3dPbkh5ZHJhdGlvbk1pc21hdGNoKGZpYmVyKSB7XG4gIHRocm93IG5ldyBFcnJvcignSHlkcmF0aW9uIGZhaWxlZCBiZWNhdXNlIHRoZSBpbml0aWFsIFVJIGRvZXMgbm90IG1hdGNoIHdoYXQgd2FzICcgKyAncmVuZGVyZWQgb24gdGhlIHNlcnZlci4nKTtcbn1cblxuZnVuY3Rpb24gdHJ5VG9DbGFpbU5leHRIeWRyYXRhYmxlSW5zdGFuY2UoZmliZXIpIHtcbiAgaWYgKCFpc0h5ZHJhdGluZykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBuZXh0SW5zdGFuY2UgPSBuZXh0SHlkcmF0YWJsZUluc3RhbmNlO1xuXG4gIGlmICghbmV4dEluc3RhbmNlKSB7XG4gICAgaWYgKHNob3VsZENsaWVudFJlbmRlck9uTWlzbWF0Y2goZmliZXIpKSB7XG4gICAgICB3YXJuTm9uaHlkcmF0ZWRJbnN0YW5jZShoeWRyYXRpb25QYXJlbnRGaWJlciwgZmliZXIpO1xuICAgICAgdGhyb3dPbkh5ZHJhdGlvbk1pc21hdGNoKCk7XG4gICAgfSAvLyBOb3RoaW5nIHRvIGh5ZHJhdGUuIE1ha2UgaXQgYW4gaW5zZXJ0aW9uLlxuXG5cbiAgICBpbnNlcnROb25IeWRyYXRlZEluc3RhbmNlKGh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaWJlcik7XG4gICAgaXNIeWRyYXRpbmcgPSBmYWxzZTtcbiAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBmaXJzdEF0dGVtcHRlZEluc3RhbmNlID0gbmV4dEluc3RhbmNlO1xuXG4gIGlmICghdHJ5SHlkcmF0ZShmaWJlciwgbmV4dEluc3RhbmNlKSkge1xuICAgIGlmIChzaG91bGRDbGllbnRSZW5kZXJPbk1pc21hdGNoKGZpYmVyKSkge1xuICAgICAgd2Fybk5vbmh5ZHJhdGVkSW5zdGFuY2UoaHlkcmF0aW9uUGFyZW50RmliZXIsIGZpYmVyKTtcbiAgICAgIHRocm93T25IeWRyYXRpb25NaXNtYXRjaCgpO1xuICAgIH0gLy8gSWYgd2UgY2FuJ3QgaHlkcmF0ZSB0aGlzIGluc3RhbmNlIGxldCdzIHRyeSB0aGUgbmV4dCBvbmUuXG4gICAgLy8gV2UgdXNlIHRoaXMgYXMgYSBoZXVyaXN0aWMuIEl0J3MgYmFzZWQgb24gaW50dWl0aW9uIGFuZCBub3QgZGF0YSBzbyBpdFxuICAgIC8vIG1pZ2h0IGJlIGZsYXdlZCBvciB1bm5lY2Vzc2FyeS5cblxuXG4gICAgbmV4dEluc3RhbmNlID0gZ2V0TmV4dEh5ZHJhdGFibGVTaWJsaW5nKGZpcnN0QXR0ZW1wdGVkSW5zdGFuY2UpO1xuICAgIHZhciBwcmV2SHlkcmF0aW9uUGFyZW50RmliZXIgPSBoeWRyYXRpb25QYXJlbnRGaWJlcjtcblxuICAgIGlmICghbmV4dEluc3RhbmNlIHx8ICF0cnlIeWRyYXRlKGZpYmVyLCBuZXh0SW5zdGFuY2UpKSB7XG4gICAgICAvLyBOb3RoaW5nIHRvIGh5ZHJhdGUuIE1ha2UgaXQgYW4gaW5zZXJ0aW9uLlxuICAgICAgaW5zZXJ0Tm9uSHlkcmF0ZWRJbnN0YW5jZShoeWRyYXRpb25QYXJlbnRGaWJlciwgZmliZXIpO1xuICAgICAgaXNIeWRyYXRpbmcgPSBmYWxzZTtcbiAgICAgIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBXZSBtYXRjaGVkIHRoZSBuZXh0IG9uZSwgd2UnbGwgbm93IGFzc3VtZSB0aGF0IHRoZSBmaXJzdCBvbmUgd2FzXG4gICAgLy8gc3VwZXJmbHVvdXMgYW5kIHdlJ2xsIGRlbGV0ZSBpdC4gU2luY2Ugd2UgY2FuJ3QgZWFnZXJseSBkZWxldGUgaXRcbiAgICAvLyB3ZSdsbCBoYXZlIHRvIHNjaGVkdWxlIGEgZGVsZXRpb24uIFRvIGRvIHRoYXQsIHRoaXMgbm9kZSBuZWVkcyBhIGR1bW15XG4gICAgLy8gZmliZXIgYXNzb2NpYXRlZCB3aXRoIGl0LlxuXG5cbiAgICBkZWxldGVIeWRyYXRhYmxlSW5zdGFuY2UocHJldkh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaXJzdEF0dGVtcHRlZEluc3RhbmNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmVwYXJlVG9IeWRyYXRlSG9zdEluc3RhbmNlKGZpYmVyLCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0KSB7XG5cbiAgdmFyIGluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuICB2YXIgc2hvdWxkV2FybklmTWlzbWF0Y2hEZXYgPSAhZGlkU3VzcGVuZE9yRXJyb3JERVY7XG4gIHZhciB1cGRhdGVQYXlsb2FkID0gaHlkcmF0ZUluc3RhbmNlKGluc3RhbmNlLCBmaWJlci50eXBlLCBmaWJlci5tZW1vaXplZFByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0LCBmaWJlciwgc2hvdWxkV2FybklmTWlzbWF0Y2hEZXYpOyAvLyBUT0RPOiBUeXBlIHRoaXMgc3BlY2lmaWMgdG8gdGhpcyB0eXBlIG9mIGNvbXBvbmVudC5cblxuICBmaWJlci51cGRhdGVRdWV1ZSA9IHVwZGF0ZVBheWxvYWQ7IC8vIElmIHRoZSB1cGRhdGUgcGF5bG9hZCBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBpcyBhIGNoYW5nZSBvciBpZiB0aGVyZVxuICAvLyBpcyBhIG5ldyByZWYgd2UgbWFyayB0aGlzIGFzIGFuIHVwZGF0ZS5cblxuICBpZiAodXBkYXRlUGF5bG9hZCAhPT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlVG9IeWRyYXRlSG9zdFRleHRJbnN0YW5jZShmaWJlcikge1xuXG4gIHZhciB0ZXh0SW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG4gIHZhciB0ZXh0Q29udGVudCA9IGZpYmVyLm1lbW9pemVkUHJvcHM7XG4gIHZhciBzaG91bGRVcGRhdGUgPSBoeWRyYXRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSwgdGV4dENvbnRlbnQsIGZpYmVyKTtcblxuICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgLy8gV2UgYXNzdW1lIHRoYXQgcHJlcGFyZVRvSHlkcmF0ZUhvc3RUZXh0SW5zdGFuY2UgaXMgY2FsbGVkIGluIGEgY29udGV4dCB3aGVyZSB0aGVcbiAgICAvLyBoeWRyYXRpb24gcGFyZW50IGlzIHRoZSBwYXJlbnQgaG9zdCBjb21wb25lbnQgb2YgdGhpcyBob3N0IHRleHQuXG4gICAgdmFyIHJldHVybkZpYmVyID0gaHlkcmF0aW9uUGFyZW50RmliZXI7XG5cbiAgICBpZiAocmV0dXJuRmliZXIgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAocmV0dXJuRmliZXIudGFnKSB7XG4gICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHBhcmVudENvbnRhaW5lciA9IHJldHVybkZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICAgICAgICAgICAgdmFyIGlzQ29uY3VycmVudE1vZGUgPSAocmV0dXJuRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuICAgICAgICAgICAgZGlkTm90TWF0Y2hIeWRyYXRlZENvbnRhaW5lclRleHRJbnN0YW5jZShwYXJlbnRDb250YWluZXIsIHRleHRJbnN0YW5jZSwgdGV4dENvbnRlbnQsIC8vIFRPRE86IERlbGV0ZSB0aGlzIGFyZ3VtZW50IHdoZW4gd2UgcmVtb3ZlIHRoZSBsZWdhY3kgcm9vdCBBUEkuXG4gICAgICAgICAgICBpc0NvbmN1cnJlbnRNb2RlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHBhcmVudFR5cGUgPSByZXR1cm5GaWJlci50eXBlO1xuICAgICAgICAgICAgdmFyIHBhcmVudFByb3BzID0gcmV0dXJuRmliZXIubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICAgIHZhciBwYXJlbnRJbnN0YW5jZSA9IHJldHVybkZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgICAgdmFyIF9pc0NvbmN1cnJlbnRNb2RlMiA9IChyZXR1cm5GaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG5cbiAgICAgICAgICAgIGRpZE5vdE1hdGNoSHlkcmF0ZWRUZXh0SW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCB0ZXh0SW5zdGFuY2UsIHRleHRDb250ZW50LCAvLyBUT0RPOiBEZWxldGUgdGhpcyBhcmd1bWVudCB3aGVuIHdlIHJlbW92ZSB0aGUgbGVnYWN5IHJvb3QgQVBJLlxuICAgICAgICAgICAgX2lzQ29uY3VycmVudE1vZGUyKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gc2hvdWxkVXBkYXRlO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlVG9IeWRyYXRlSG9zdFN1c3BlbnNlSW5zdGFuY2UoZmliZXIpIHtcblxuICB2YXIgc3VzcGVuc2VTdGF0ZSA9IGZpYmVyLm1lbW9pemVkU3RhdGU7XG4gIHZhciBzdXNwZW5zZUluc3RhbmNlID0gc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCA/IHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZCA6IG51bGw7XG5cbiAgaWYgKCFzdXNwZW5zZUluc3RhbmNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byBoYXZlIGEgaHlkcmF0ZWQgc3VzcGVuc2UgaW5zdGFuY2UuICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxuXG4gIGh5ZHJhdGVTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gc2tpcFBhc3REZWh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZShmaWJlcikge1xuXG4gIHZhciBzdXNwZW5zZVN0YXRlID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHN1c3BlbnNlSW5zdGFuY2UgPSBzdXNwZW5zZVN0YXRlICE9PSBudWxsID8gc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkIDogbnVsbDtcblxuICBpZiAoIXN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIGhhdmUgYSBoeWRyYXRlZCBzdXNwZW5zZSBpbnN0YW5jZS4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlSW5zdGFuY2VBZnRlclN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSk7XG59XG5cbmZ1bmN0aW9uIHBvcFRvTmV4dEhvc3RQYXJlbnQoZmliZXIpIHtcbiAgdmFyIHBhcmVudCA9IGZpYmVyLnJldHVybjtcblxuICB3aGlsZSAocGFyZW50ICE9PSBudWxsICYmIHBhcmVudC50YWcgIT09IEhvc3RDb21wb25lbnQgJiYgcGFyZW50LnRhZyAhPT0gSG9zdFJvb3QgJiYgcGFyZW50LnRhZyAhPT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuO1xuICB9XG5cbiAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBwYXJlbnQ7XG59XG5cbmZ1bmN0aW9uIHBvcEh5ZHJhdGlvblN0YXRlKGZpYmVyKSB7XG5cbiAgaWYgKGZpYmVyICE9PSBoeWRyYXRpb25QYXJlbnRGaWJlcikge1xuICAgIC8vIFdlJ3JlIGRlZXBlciB0aGFuIHRoZSBjdXJyZW50IGh5ZHJhdGlvbiBjb250ZXh0LCBpbnNpZGUgYW4gaW5zZXJ0ZWRcbiAgICAvLyB0cmVlLlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaXNIeWRyYXRpbmcpIHtcbiAgICAvLyBJZiB3ZSdyZSBub3QgY3VycmVudGx5IGh5ZHJhdGluZyBidXQgd2UncmUgaW4gYSBoeWRyYXRpb24gY29udGV4dCwgdGhlblxuICAgIC8vIHdlIHdlcmUgYW4gaW5zZXJ0aW9uIGFuZCBub3cgbmVlZCB0byBwb3AgdXAgcmVlbnRlciBoeWRyYXRpb24gb2Ygb3VyXG4gICAgLy8gc2libGluZ3MuXG4gICAgcG9wVG9OZXh0SG9zdFBhcmVudChmaWJlcik7XG4gICAgaXNIeWRyYXRpbmcgPSB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBJZiB3ZSBoYXZlIGFueSByZW1haW5pbmcgaHlkcmF0YWJsZSBub2Rlcywgd2UgbmVlZCB0byBkZWxldGUgdGhlbSBub3cuXG4gIC8vIFdlIG9ubHkgZG8gdGhpcyBkZWVwZXIgdGhhbiBoZWFkIGFuZCBib2R5IHNpbmNlIHRoZXkgdGVuZCB0byBoYXZlIHJhbmRvbVxuICAvLyBvdGhlciBub2RlcyBpbiB0aGVtLiBXZSBhbHNvIGlnbm9yZSBjb21wb25lbnRzIHdpdGggcHVyZSB0ZXh0IGNvbnRlbnQgaW5cbiAgLy8gc2lkZSBvZiB0aGVtLiBXZSBhbHNvIGRvbid0IGRlbGV0ZSBhbnl0aGluZyBpbnNpZGUgdGhlIHJvb3QgY29udGFpbmVyLlxuXG5cbiAgaWYgKGZpYmVyLnRhZyAhPT0gSG9zdFJvb3QgJiYgKGZpYmVyLnRhZyAhPT0gSG9zdENvbXBvbmVudCB8fCBzaG91bGREZWxldGVVbmh5ZHJhdGVkVGFpbEluc3RhbmNlcyhmaWJlci50eXBlKSAmJiAhc2hvdWxkU2V0VGV4dENvbnRlbnQoZmliZXIudHlwZSwgZmliZXIubWVtb2l6ZWRQcm9wcykpKSB7XG4gICAgdmFyIG5leHRJbnN0YW5jZSA9IG5leHRIeWRyYXRhYmxlSW5zdGFuY2U7XG5cbiAgICBpZiAobmV4dEluc3RhbmNlKSB7XG4gICAgICBpZiAoc2hvdWxkQ2xpZW50UmVuZGVyT25NaXNtYXRjaChmaWJlcikpIHtcbiAgICAgICAgd2FybklmVW5oeWRyYXRlZFRhaWxOb2RlcyhmaWJlcik7XG4gICAgICAgIHRocm93T25IeWRyYXRpb25NaXNtYXRjaCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2hpbGUgKG5leHRJbnN0YW5jZSkge1xuICAgICAgICAgIGRlbGV0ZUh5ZHJhdGFibGVJbnN0YW5jZShmaWJlciwgbmV4dEluc3RhbmNlKTtcbiAgICAgICAgICBuZXh0SW5zdGFuY2UgPSBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcobmV4dEluc3RhbmNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHBvcFRvTmV4dEhvc3RQYXJlbnQoZmliZXIpO1xuXG4gIGlmIChmaWJlci50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IHNraXBQYXN0RGVoeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2UoZmliZXIpO1xuICB9IGVsc2Uge1xuICAgIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBoeWRyYXRpb25QYXJlbnRGaWJlciA/IGdldE5leHRIeWRyYXRhYmxlU2libGluZyhmaWJlci5zdGF0ZU5vZGUpIDogbnVsbDtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBoYXNVbmh5ZHJhdGVkVGFpbE5vZGVzKCkge1xuICByZXR1cm4gaXNIeWRyYXRpbmcgJiYgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gd2FybklmVW5oeWRyYXRlZFRhaWxOb2RlcyhmaWJlcikge1xuICB2YXIgbmV4dEluc3RhbmNlID0gbmV4dEh5ZHJhdGFibGVJbnN0YW5jZTtcblxuICB3aGlsZSAobmV4dEluc3RhbmNlKSB7XG4gICAgd2FyblVuaHlkcmF0ZWRJbnN0YW5jZShmaWJlciwgbmV4dEluc3RhbmNlKTtcbiAgICBuZXh0SW5zdGFuY2UgPSBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcobmV4dEluc3RhbmNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNldEh5ZHJhdGlvblN0YXRlKCkge1xuXG4gIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gbnVsbDtcbiAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IG51bGw7XG4gIGlzSHlkcmF0aW5nID0gZmFsc2U7XG4gIGRpZFN1c3BlbmRPckVycm9yREVWID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHVwZ3JhZGVIeWRyYXRpb25FcnJvcnNUb1JlY292ZXJhYmxlKCkge1xuICBpZiAoaHlkcmF0aW9uRXJyb3JzICE9PSBudWxsKSB7XG4gICAgLy8gU3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCBhIGZvcmNlZCBjbGllbnQgcmVuZGVyLiBUaGUgZXJyb3JzIHRoYXQgb2NjdXJyZWRcbiAgICAvLyBkdXJpbmcgdGhlIGh5ZHJhdGlvbiBhdHRlbXB0IGFyZSBub3cgcmVjb3ZlcmVkLiBXZSB3aWxsIGxvZyB0aGVtIGluXG4gICAgLy8gY29tbWl0IHBoYXNlLCBvbmNlIHRoZSBlbnRpcmUgdHJlZSBoYXMgZmluaXNoZWQuXG4gICAgcXVldWVSZWNvdmVyYWJsZUVycm9ycyhoeWRyYXRpb25FcnJvcnMpO1xuICAgIGh5ZHJhdGlvbkVycm9ycyA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0SXNIeWRyYXRpbmcoKSB7XG4gIHJldHVybiBpc0h5ZHJhdGluZztcbn1cblxuZnVuY3Rpb24gcXVldWVIeWRyYXRpb25FcnJvcihlcnJvcikge1xuICBpZiAoaHlkcmF0aW9uRXJyb3JzID09PSBudWxsKSB7XG4gICAgaHlkcmF0aW9uRXJyb3JzID0gW2Vycm9yXTtcbiAgfSBlbHNlIHtcbiAgICBoeWRyYXRpb25FcnJvcnMucHVzaChlcnJvcik7XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZztcbnZhciBOb1RyYW5zaXRpb24gPSBudWxsO1xuZnVuY3Rpb24gcmVxdWVzdEN1cnJlbnRUcmFuc2l0aW9uKCkge1xuICByZXR1cm4gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMS50cmFuc2l0aW9uO1xufVxuXG52YXIgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MgPSB7XG4gIHJlY29yZFVuc2FmZUxpZmVjeWNsZVdhcm5pbmdzOiBmdW5jdGlvbiAoZmliZXIsIGluc3RhbmNlKSB7fSxcbiAgZmx1c2hQZW5kaW5nVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3M6IGZ1bmN0aW9uICgpIHt9LFxuICByZWNvcmRMZWdhY3lDb250ZXh0V2FybmluZzogZnVuY3Rpb24gKGZpYmVyLCBpbnN0YW5jZSkge30sXG4gIGZsdXNoTGVnYWN5Q29udGV4dFdhcm5pbmc6IGZ1bmN0aW9uICgpIHt9LFxuICBkaXNjYXJkUGVuZGluZ1dhcm5pbmdzOiBmdW5jdGlvbiAoKSB7fVxufTtcblxue1xuICB2YXIgZmluZFN0cmljdFJvb3QgPSBmdW5jdGlvbiAoZmliZXIpIHtcbiAgICB2YXIgbWF5YmVTdHJpY3RSb290ID0gbnVsbDtcbiAgICB2YXIgbm9kZSA9IGZpYmVyO1xuXG4gICAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgIG1heWJlU3RyaWN0Um9vdCA9IG5vZGU7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gbWF5YmVTdHJpY3RSb290O1xuICB9O1xuXG4gIHZhciBzZXRUb1NvcnRlZFN0cmluZyA9IGZ1bmN0aW9uIChzZXQpIHtcbiAgICB2YXIgYXJyYXkgPSBbXTtcbiAgICBzZXQuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGFycmF5LnB1c2godmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiBhcnJheS5zb3J0KCkuam9pbignLCAnKTtcbiAgfTtcblxuICB2YXIgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdO1xuICB2YXIgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdO1xuICB2YXIgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTsgLy8gVHJhY2tzIGNvbXBvbmVudHMgd2UgaGF2ZSBhbHJlYWR5IHdhcm5lZCBhYm91dC5cblxuICB2YXIgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcyA9IG5ldyBTZXQoKTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyA9IGZ1bmN0aW9uIChmaWJlciwgaW5zdGFuY2UpIHtcbiAgICAvLyBEZWR1cGUgc3RyYXRlZ3k6IFdhcm4gb25jZSBwZXIgY29tcG9uZW50LlxuICAgIGlmIChkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmhhcyhmaWJlci50eXBlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nICYmIC8vIERvbid0IHdhcm4gYWJvdXQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLlxuICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudC5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MucHVzaChmaWJlcik7XG4gICAgfVxuXG4gICAgaWYgKGZpYmVyLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlICYmIHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzLl9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgIT09IHRydWUpIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MucHVzaChmaWJlcik7XG4gICAgfVxuXG4gICAgaWYgKGZpYmVyLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlICYmIHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MucHVzaChmaWJlcik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG5cbiAgICBpZiAoZmliZXIubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUgJiYgdHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG4gIH07XG5cbiAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MuZmx1c2hQZW5kaW5nVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gV2UgZG8gYW4gaW5pdGlhbCBwYXNzIHRvIGdhdGhlciBjb21wb25lbnQgbmFtZXNcbiAgICB2YXIgY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG5cbiAgICBpZiAocGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgICBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTtcbiAgICAgIH0pO1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gICAgfVxuXG4gICAgdmFyIFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gICAgfVxuXG4gICAgdmFyIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gICAgfVxuXG4gICAgdmFyIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG5cbiAgICBpZiAocGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgICBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTtcbiAgICAgIH0pO1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzID0gbmV3IFNldCgpO1xuXG4gICAgaWYgKHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBjb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMuYWRkKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdO1xuICAgIH0gLy8gRmluYWxseSwgd2UgZmx1c2ggYWxsIHRoZSB3YXJuaW5nc1xuICAgIC8vIFVOU0FGRV8gb25lcyBiZWZvcmUgdGhlIGRlcHJlY2F0ZWQgb25lcywgc2luY2UgdGhleSdsbCBiZSAnbG91ZGVyJ1xuXG5cbiAgICBpZiAoVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzLnNpemUgPiAwKSB7XG4gICAgICB2YXIgc29ydGVkTmFtZXMgPSBzZXRUb1NvcnRlZFN0cmluZyhVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMpO1xuXG4gICAgICBlcnJvcignVXNpbmcgVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCBpbiBzdHJpY3QgbW9kZSBpcyBub3QgcmVjb21tZW5kZWQgYW5kIG1heSBpbmRpY2F0ZSBidWdzIGluIHlvdXIgY29kZS4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4nICsgJyogTW92ZSBjb2RlIHdpdGggc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZE1vdW50LCBhbmQgc2V0IGluaXRpYWwgc3RhdGUgaW4gdGhlIGNvbnN0cnVjdG9yLlxcbicgKyAnXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJywgc29ydGVkTmFtZXMpO1xuICAgIH1cblxuICAgIGlmIChVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzLnNpemUgPiAwKSB7XG4gICAgICB2YXIgX3NvcnRlZE5hbWVzID0gc2V0VG9Tb3J0ZWRTdHJpbmcoVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyk7XG5cbiAgICAgIGVycm9yKCdVc2luZyBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyBpbiBzdHJpY3QgbW9kZSBpcyBub3QgcmVjb21tZW5kZWQgJyArICdhbmQgbWF5IGluZGljYXRlIGJ1Z3MgaW4geW91ciBjb2RlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbicgKyAnKiBNb3ZlIGRhdGEgZmV0Y2hpbmcgY29kZSBvciBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkVXBkYXRlLlxcbicgKyBcIiogSWYgeW91J3JlIHVwZGF0aW5nIHN0YXRlIHdoZW5ldmVyIHByb3BzIGNoYW5nZSwgXCIgKyAncmVmYWN0b3IgeW91ciBjb2RlIHRvIHVzZSBtZW1vaXphdGlvbiB0ZWNobmlxdWVzIG9yIG1vdmUgaXQgdG8gJyArICdzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLiBMZWFybiBtb3JlIGF0OiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvZGVyaXZlZC1zdGF0ZVxcbicgKyAnXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJywgX3NvcnRlZE5hbWVzKTtcbiAgICB9XG5cbiAgICBpZiAoVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcy5zaXplID4gMCkge1xuICAgICAgdmFyIF9zb3J0ZWROYW1lczIgPSBzZXRUb1NvcnRlZFN0cmluZyhVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzKTtcblxuICAgICAgZXJyb3IoJ1VzaW5nIFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlIGluIHN0cmljdCBtb2RlIGlzIG5vdCByZWNvbW1lbmRlZCAnICsgJ2FuZCBtYXkgaW5kaWNhdGUgYnVncyBpbiB5b3VyIGNvZGUuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuJyArICcqIE1vdmUgZGF0YSBmZXRjaGluZyBjb2RlIG9yIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRVcGRhdGUuXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBfc29ydGVkTmFtZXMyKTtcbiAgICB9XG5cbiAgICBpZiAoY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMuc2l6ZSA+IDApIHtcbiAgICAgIHZhciBfc29ydGVkTmFtZXMzID0gc2V0VG9Tb3J0ZWRTdHJpbmcoY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMpO1xuXG4gICAgICB3YXJuKCdjb21wb25lbnRXaWxsTW91bnQgaGFzIGJlZW4gcmVuYW1lZCwgYW5kIGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgdXNlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbicgKyAnKiBNb3ZlIGNvZGUgd2l0aCBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkTW91bnQsIGFuZCBzZXQgaW5pdGlhbCBzdGF0ZSBpbiB0aGUgY29uc3RydWN0b3IuXFxuJyArICcqIFJlbmFtZSBjb21wb25lbnRXaWxsTW91bnQgdG8gVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCB0byBzdXBwcmVzcyAnICsgJ3RoaXMgd2FybmluZyBpbiBub24tc3RyaWN0IG1vZGUuIEluIFJlYWN0IDE4LngsIG9ubHkgdGhlIFVOU0FGRV8gbmFtZSB3aWxsIHdvcmsuICcgKyAnVG8gcmVuYW1lIGFsbCBkZXByZWNhdGVkIGxpZmVjeWNsZXMgdG8gdGhlaXIgbmV3IG5hbWVzLCB5b3UgY2FuIHJ1biAnICsgJ2BucHggcmVhY3QtY29kZW1vZCByZW5hbWUtdW5zYWZlLWxpZmVjeWNsZXNgIGluIHlvdXIgcHJvamVjdCBzb3VyY2UgZm9sZGVyLlxcbicgKyAnXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJywgX3NvcnRlZE5hbWVzMyk7XG4gICAgfVxuXG4gICAgaWYgKGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcy5zaXplID4gMCkge1xuICAgICAgdmFyIF9zb3J0ZWROYW1lczQgPSBzZXRUb1NvcnRlZFN0cmluZyhjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMpO1xuXG4gICAgICB3YXJuKCdjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIGhhcyBiZWVuIHJlbmFtZWQsIGFuZCBpcyBub3QgcmVjb21tZW5kZWQgZm9yIHVzZS4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4nICsgJyogTW92ZSBkYXRhIGZldGNoaW5nIGNvZGUgb3Igc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZFVwZGF0ZS5cXG4nICsgXCIqIElmIHlvdSdyZSB1cGRhdGluZyBzdGF0ZSB3aGVuZXZlciBwcm9wcyBjaGFuZ2UsIHJlZmFjdG9yIHlvdXIgXCIgKyAnY29kZSB0byB1c2UgbWVtb2l6YXRpb24gdGVjaG5pcXVlcyBvciBtb3ZlIGl0IHRvICcgKyAnc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gTGVhcm4gbW9yZSBhdDogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2Rlcml2ZWQtc3RhdGVcXG4nICsgJyogUmVuYW1lIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgdG8gVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgdG8gc3VwcHJlc3MgJyArICd0aGlzIHdhcm5pbmcgaW4gbm9uLXN0cmljdCBtb2RlLiBJbiBSZWFjdCAxOC54LCBvbmx5IHRoZSBVTlNBRkVfIG5hbWUgd2lsbCB3b3JrLiAnICsgJ1RvIHJlbmFtZSBhbGwgZGVwcmVjYXRlZCBsaWZlY3ljbGVzIHRvIHRoZWlyIG5ldyBuYW1lcywgeW91IGNhbiBydW4gJyArICdgbnB4IHJlYWN0LWNvZGVtb2QgcmVuYW1lLXVuc2FmZS1saWZlY3ljbGVzYCBpbiB5b3VyIHByb2plY3Qgc291cmNlIGZvbGRlci5cXG4nICsgJ1xcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycsIF9zb3J0ZWROYW1lczQpO1xuICAgIH1cblxuICAgIGlmIChjb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMuc2l6ZSA+IDApIHtcbiAgICAgIHZhciBfc29ydGVkTmFtZXM1ID0gc2V0VG9Tb3J0ZWRTdHJpbmcoY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzKTtcblxuICAgICAgd2FybignY29tcG9uZW50V2lsbFVwZGF0ZSBoYXMgYmVlbiByZW5hbWVkLCBhbmQgaXMgbm90IHJlY29tbWVuZGVkIGZvciB1c2UuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuJyArICcqIE1vdmUgZGF0YSBmZXRjaGluZyBjb2RlIG9yIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRVcGRhdGUuXFxuJyArICcqIFJlbmFtZSBjb21wb25lbnRXaWxsVXBkYXRlIHRvIFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlIHRvIHN1cHByZXNzICcgKyAndGhpcyB3YXJuaW5nIGluIG5vbi1zdHJpY3QgbW9kZS4gSW4gUmVhY3QgMTgueCwgb25seSB0aGUgVU5TQUZFXyBuYW1lIHdpbGwgd29yay4gJyArICdUbyByZW5hbWUgYWxsIGRlcHJlY2F0ZWQgbGlmZWN5Y2xlcyB0byB0aGVpciBuZXcgbmFtZXMsIHlvdSBjYW4gcnVuICcgKyAnYG5weCByZWFjdC1jb2RlbW9kIHJlbmFtZS11bnNhZmUtbGlmZWN5Y2xlc2AgaW4geW91ciBwcm9qZWN0IHNvdXJjZSBmb2xkZXIuXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBfc29ydGVkTmFtZXM1KTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHBlbmRpbmdMZWdhY3lDb250ZXh0V2FybmluZyA9IG5ldyBNYXAoKTsgLy8gVHJhY2tzIGNvbXBvbmVudHMgd2UgaGF2ZSBhbHJlYWR5IHdhcm5lZCBhYm91dC5cblxuICB2YXIgZGlkV2FybkFib3V0TGVnYWN5Q29udGV4dCA9IG5ldyBTZXQoKTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRMZWdhY3lDb250ZXh0V2FybmluZyA9IGZ1bmN0aW9uIChmaWJlciwgaW5zdGFuY2UpIHtcbiAgICB2YXIgc3RyaWN0Um9vdCA9IGZpbmRTdHJpY3RSb290KGZpYmVyKTtcblxuICAgIGlmIChzdHJpY3RSb290ID09PSBudWxsKSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgdG8gZmluZCBhIFN0cmljdE1vZGUgY29tcG9uZW50IGluIGEgc3RyaWN0IG1vZGUgdHJlZS4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuXG4gICAgICByZXR1cm47XG4gICAgfSAvLyBEZWR1cCBzdHJhdGVneTogV2FybiBvbmNlIHBlciBjb21wb25lbnQuXG5cblxuICAgIGlmIChkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0LmhhcyhmaWJlci50eXBlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB3YXJuaW5nc0ZvclJvb3QgPSBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcuZ2V0KHN0cmljdFJvb3QpO1xuXG4gICAgaWYgKGZpYmVyLnR5cGUuY29udGV4dFR5cGVzICE9IG51bGwgfHwgZmliZXIudHlwZS5jaGlsZENvbnRleHRUeXBlcyAhPSBudWxsIHx8IGluc3RhbmNlICE9PSBudWxsICYmIHR5cGVvZiBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh3YXJuaW5nc0ZvclJvb3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB3YXJuaW5nc0ZvclJvb3QgPSBbXTtcbiAgICAgICAgcGVuZGluZ0xlZ2FjeUNvbnRleHRXYXJuaW5nLnNldChzdHJpY3RSb290LCB3YXJuaW5nc0ZvclJvb3QpO1xuICAgICAgfVxuXG4gICAgICB3YXJuaW5nc0ZvclJvb3QucHVzaChmaWJlcik7XG4gICAgfVxuICB9O1xuXG4gIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmZsdXNoTGVnYWN5Q29udGV4dFdhcm5pbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgcGVuZGluZ0xlZ2FjeUNvbnRleHRXYXJuaW5nLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyQXJyYXksIHN0cmljdFJvb3QpIHtcbiAgICAgIGlmIChmaWJlckFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBmaXJzdEZpYmVyID0gZmliZXJBcnJheVswXTtcbiAgICAgIHZhciB1bmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcbiAgICAgIGZpYmVyQXJyYXkuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgdW5pcXVlTmFtZXMuYWRkKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0TGVnYWN5Q29udGV4dC5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHZhciBzb3J0ZWROYW1lcyA9IHNldFRvU29ydGVkU3RyaW5nKHVuaXF1ZU5hbWVzKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0Q3VycmVudEZpYmVyKGZpcnN0RmliZXIpO1xuXG4gICAgICAgIGVycm9yKCdMZWdhY3kgY29udGV4dCBBUEkgaGFzIGJlZW4gZGV0ZWN0ZWQgd2l0aGluIGEgc3RyaWN0LW1vZGUgdHJlZS4nICsgJ1xcblxcblRoZSBvbGQgQVBJIHdpbGwgYmUgc3VwcG9ydGVkIGluIGFsbCAxNi54IHJlbGVhc2VzLCBidXQgYXBwbGljYXRpb25zICcgKyAndXNpbmcgaXQgc2hvdWxkIG1pZ3JhdGUgdG8gdGhlIG5ldyB2ZXJzaW9uLicgKyAnXFxuXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJyArICdcXG5cXG5MZWFybiBtb3JlIGFib3V0IHRoaXMgd2FybmluZyBoZXJlOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvbGVnYWN5LWNvbnRleHQnLCBzb3J0ZWROYW1lcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmRpc2NhcmRQZW5kaW5nV2FybmluZ3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdMZWdhY3lDb250ZXh0V2FybmluZyA9IG5ldyBNYXAoKTtcbiAgfTtcbn1cblxudmFyIGRpZFdhcm5BYm91dE1hcHM7XG52YXIgZGlkV2FybkFib3V0R2VuZXJhdG9ycztcbnZhciBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzO1xudmFyIG93bmVySGFzS2V5VXNlV2FybmluZztcbnZhciBvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmc7XG5cbnZhciB3YXJuRm9yTWlzc2luZ0tleSA9IGZ1bmN0aW9uIChjaGlsZCwgcmV0dXJuRmliZXIpIHt9O1xuXG57XG4gIGRpZFdhcm5BYm91dE1hcHMgPSBmYWxzZTtcbiAgZGlkV2FybkFib3V0R2VuZXJhdG9ycyA9IGZhbHNlO1xuICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzID0ge307XG4gIC8qKlxuICAgKiBXYXJuIGlmIHRoZXJlJ3Mgbm8ga2V5IGV4cGxpY2l0bHkgc2V0IG9uIGR5bmFtaWMgYXJyYXlzIG9mIGNoaWxkcmVuIG9yXG4gICAqIG9iamVjdCBrZXlzIGFyZSBub3QgdmFsaWQuIFRoaXMgYWxsb3dzIHVzIHRvIGtlZXAgdHJhY2sgb2YgY2hpbGRyZW4gYmV0d2VlblxuICAgKiB1cGRhdGVzLlxuICAgKi9cblxuICBvd25lckhhc0tleVVzZVdhcm5pbmcgPSB7fTtcbiAgb3duZXJIYXNGdW5jdGlvblR5cGVXYXJuaW5nID0ge307XG5cbiAgd2FybkZvck1pc3NpbmdLZXkgPSBmdW5jdGlvbiAoY2hpbGQsIHJldHVybkZpYmVyKSB7XG4gICAgaWYgKGNoaWxkID09PSBudWxsIHx8IHR5cGVvZiBjaGlsZCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWNoaWxkLl9zdG9yZSB8fCBjaGlsZC5fc3RvcmUudmFsaWRhdGVkIHx8IGNoaWxkLmtleSAhPSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjaGlsZC5fc3RvcmUgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlYWN0IENvbXBvbmVudCBpbiB3YXJuRm9yTWlzc2luZ0tleSBzaG91bGQgaGF2ZSBhIF9zdG9yZS4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIGNoaWxkLl9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihyZXR1cm5GaWJlcikgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICBpZiAob3duZXJIYXNLZXlVc2VXYXJuaW5nW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb3duZXJIYXNLZXlVc2VXYXJuaW5nW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcblxuICAgIGVycm9yKCdFYWNoIGNoaWxkIGluIGEgbGlzdCBzaG91bGQgaGF2ZSBhIHVuaXF1ZSAnICsgJ1wia2V5XCIgcHJvcC4gU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay93YXJuaW5nLWtleXMgZm9yICcgKyAnbW9yZSBpbmZvcm1hdGlvbi4nKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gaXNSZWFjdENsYXNzKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUucHJvdG90eXBlICYmIHR5cGUucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQ7XG59XG5cbmZ1bmN0aW9uIGNvZXJjZVJlZihyZXR1cm5GaWJlciwgY3VycmVudCwgZWxlbWVudCkge1xuICB2YXIgbWl4ZWRSZWYgPSBlbGVtZW50LnJlZjtcblxuICBpZiAobWl4ZWRSZWYgIT09IG51bGwgJiYgdHlwZW9mIG1peGVkUmVmICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBtaXhlZFJlZiAhPT0gJ29iamVjdCcpIHtcbiAgICB7XG4gICAgICAvLyBUT0RPOiBDbGVhbiB0aGlzIHVwIG9uY2Ugd2UgdHVybiBvbiB0aGUgc3RyaW5nIHJlZiB3YXJuaW5nIGZvclxuICAgICAgLy8gZXZlcnlvbmUsIGJlY2F1c2UgdGhlIHN0cmljdCBtb2RlIGNhc2Ugd2lsbCBubyBsb25nZXIgYmUgcmVsZXZhbnRcbiAgICAgIGlmICgocmV0dXJuRmliZXIubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUgfHwgd2FybkFib3V0U3RyaW5nUmVmcykgJiYgLy8gV2Ugd2FybiBpbiBSZWFjdEVsZW1lbnQuanMgaWYgb3duZXIgYW5kIHNlbGYgYXJlIGVxdWFsIGZvciBzdHJpbmcgcmVmc1xuICAgICAgLy8gYmVjYXVzZSB0aGVzZSBjYW5ub3QgYmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gYW4gYXJyb3cgZnVuY3Rpb25cbiAgICAgIC8vIHVzaW5nIGEgY29kZW1vZC4gVGhlcmVmb3JlLCB3ZSBkb24ndCBoYXZlIHRvIHdhcm4gYWJvdXQgc3RyaW5nIHJlZnMgYWdhaW4uXG4gICAgICAhKGVsZW1lbnQuX293bmVyICYmIGVsZW1lbnQuX3NlbGYgJiYgZWxlbWVudC5fb3duZXIuc3RhdGVOb2RlICE9PSBlbGVtZW50Ll9zZWxmKSAmJiAvLyBXaWxsIGFscmVhZHkgdGhyb3cgd2l0aCBcIkZ1bmN0aW9uIGNvbXBvbmVudHMgY2Fubm90IGhhdmUgc3RyaW5nIHJlZnNcIlxuICAgICAgIShlbGVtZW50Ll9vd25lciAmJiBlbGVtZW50Ll9vd25lci50YWcgIT09IENsYXNzQ29tcG9uZW50KSAmJiAvLyBXaWxsIGFscmVhZHkgd2FybiB3aXRoIFwiRnVuY3Rpb24gY29tcG9uZW50cyBjYW5ub3QgYmUgZ2l2ZW4gcmVmc1wiXG4gICAgICAhKHR5cGVvZiBlbGVtZW50LnR5cGUgPT09ICdmdW5jdGlvbicgJiYgIWlzUmVhY3RDbGFzcyhlbGVtZW50LnR5cGUpKSAmJiAvLyBXaWxsIGFscmVhZHkgdGhyb3cgd2l0aCBcIkVsZW1lbnQgcmVmIHdhcyBzcGVjaWZpZWQgYXMgYSBzdHJpbmcgKHNvbWVTdHJpbmdSZWYpIGJ1dCBubyBvd25lciB3YXMgc2V0XCJcbiAgICAgIGVsZW1lbnQuX293bmVyKSB7XG4gICAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihyZXR1cm5GaWJlcikgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgZXJyb3IoJ0NvbXBvbmVudCBcIiVzXCIgY29udGFpbnMgdGhlIHN0cmluZyByZWYgXCIlc1wiLiBTdXBwb3J0IGZvciBzdHJpbmcgcmVmcyAnICsgJ3dpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBXZSByZWNvbW1lbmQgdXNpbmcgJyArICd1c2VSZWYoKSBvciBjcmVhdGVSZWYoKSBpbnN0ZWFkLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtc3RyaW5nLXJlZicsIGNvbXBvbmVudE5hbWUsIG1peGVkUmVmKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbGVtZW50Ll9vd25lcikge1xuICAgICAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICB2YXIgaW5zdDtcblxuICAgICAgaWYgKG93bmVyKSB7XG4gICAgICAgIHZhciBvd25lckZpYmVyID0gb3duZXI7XG5cbiAgICAgICAgaWYgKG93bmVyRmliZXIudGFnICE9PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRnVuY3Rpb24gY29tcG9uZW50cyBjYW5ub3QgaGF2ZSBzdHJpbmcgcmVmcy4gJyArICdXZSByZWNvbW1lbmQgdXNpbmcgdXNlUmVmKCkgaW5zdGVhZC4gJyArICdMZWFybiBtb3JlIGFib3V0IHVzaW5nIHJlZnMgc2FmZWx5IGhlcmU6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N0cmljdC1tb2RlLXN0cmluZy1yZWYnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGluc3QgPSBvd25lckZpYmVyLnN0YXRlTm9kZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpbnN0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3Npbmcgb3duZXIgZm9yIHN0cmluZyByZWYgXCIgKyBtaXhlZFJlZiArIFwiLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBcIiArICdidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgfSAvLyBBc3NpZ25pbmcgdGhpcyB0byBhIGNvbnN0IHNvIEZsb3cga25vd3MgaXQgd29uJ3QgY2hhbmdlIGluIHRoZSBjbG9zdXJlXG5cblxuICAgICAgdmFyIHJlc29sdmVkSW5zdCA9IGluc3Q7XG5cbiAgICAgIHtcbiAgICAgICAgY2hlY2tQcm9wU3RyaW5nQ29lcmNpb24obWl4ZWRSZWYsICdyZWYnKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHN0cmluZ1JlZiA9ICcnICsgbWl4ZWRSZWY7IC8vIENoZWNrIGlmIHByZXZpb3VzIHN0cmluZyByZWYgbWF0Y2hlcyBuZXcgc3RyaW5nIHJlZlxuXG4gICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50LnJlZiAhPT0gbnVsbCAmJiB0eXBlb2YgY3VycmVudC5yZWYgPT09ICdmdW5jdGlvbicgJiYgY3VycmVudC5yZWYuX3N0cmluZ1JlZiA9PT0gc3RyaW5nUmVmKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50LnJlZjtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlZiA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgcmVmcyA9IHJlc29sdmVkSW5zdC5yZWZzO1xuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGRlbGV0ZSByZWZzW3N0cmluZ1JlZl07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVmc1tzdHJpbmdSZWZdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHJlZi5fc3RyaW5nUmVmID0gc3RyaW5nUmVmO1xuICAgICAgcmV0dXJuIHJlZjtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiBtaXhlZFJlZiAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCByZWYgdG8gYmUgYSBmdW5jdGlvbiwgYSBzdHJpbmcsIGFuIG9iamVjdCByZXR1cm5lZCBieSBSZWFjdC5jcmVhdGVSZWYoKSwgb3IgbnVsbC4nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlbGVtZW50Ll9vd25lcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFbGVtZW50IHJlZiB3YXMgc3BlY2lmaWVkIGFzIGEgc3RyaW5nIChcIiArIG1peGVkUmVmICsgXCIpIGJ1dCBubyBvd25lciB3YXMgc2V0LiBUaGlzIGNvdWxkIGhhcHBlbiBmb3Igb25lIG9mXCIgKyAnIHRoZSBmb2xsb3dpbmcgcmVhc29uczpcXG4nICsgJzEuIFlvdSBtYXkgYmUgYWRkaW5nIGEgcmVmIHRvIGEgZnVuY3Rpb24gY29tcG9uZW50XFxuJyArIFwiMi4gWW91IG1heSBiZSBhZGRpbmcgYSByZWYgdG8gYSBjb21wb25lbnQgdGhhdCB3YXMgbm90IGNyZWF0ZWQgaW5zaWRlIGEgY29tcG9uZW50J3MgcmVuZGVyIG1ldGhvZFxcblwiICsgJzMuIFlvdSBoYXZlIG11bHRpcGxlIGNvcGllcyBvZiBSZWFjdCBsb2FkZWRcXG4nICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvcmVmcy1tdXN0LWhhdmUtb3duZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1peGVkUmVmO1xufVxuXG5mdW5jdGlvbiB0aHJvd09uSW52YWxpZE9iamVjdFR5cGUocmV0dXJuRmliZXIsIG5ld0NoaWxkKSB7XG4gIHZhciBjaGlsZFN0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuZXdDaGlsZCk7XG4gIHRocm93IG5ldyBFcnJvcihcIk9iamVjdHMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkIChmb3VuZDogXCIgKyAoY2hpbGRTdHJpbmcgPT09ICdbb2JqZWN0IE9iamVjdF0nID8gJ29iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhuZXdDaGlsZCkuam9pbignLCAnKSArICd9JyA6IGNoaWxkU3RyaW5nKSArIFwiKS4gXCIgKyAnSWYgeW91IG1lYW50IHRvIHJlbmRlciBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4sIHVzZSBhbiBhcnJheSAnICsgJ2luc3RlYWQuJyk7XG59XG5cbmZ1bmN0aW9uIHdhcm5PbkZ1bmN0aW9uVHlwZShyZXR1cm5GaWJlcikge1xuICB7XG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHJldHVybkZpYmVyKSB8fCAnQ29tcG9uZW50JztcblxuICAgIGlmIChvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmdbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmdbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ0Z1bmN0aW9ucyBhcmUgbm90IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQuIFRoaXMgbWF5IGhhcHBlbiBpZiAnICsgJ3lvdSByZXR1cm4gYSBDb21wb25lbnQgaW5zdGVhZCBvZiA8Q29tcG9uZW50IC8+IGZyb20gcmVuZGVyLiAnICsgJ09yIG1heWJlIHlvdSBtZWFudCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gcmF0aGVyIHRoYW4gcmV0dXJuIGl0LicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVMYXp5KGxhenlUeXBlKSB7XG4gIHZhciBwYXlsb2FkID0gbGF6eVR5cGUuX3BheWxvYWQ7XG4gIHZhciBpbml0ID0gbGF6eVR5cGUuX2luaXQ7XG4gIHJldHVybiBpbml0KHBheWxvYWQpO1xufSAvLyBUaGlzIHdyYXBwZXIgZnVuY3Rpb24gZXhpc3RzIGJlY2F1c2UgSSBleHBlY3QgdG8gY2xvbmUgdGhlIGNvZGUgaW4gZWFjaCBwYXRoXG4vLyB0byBiZSBhYmxlIHRvIG9wdGltaXplIGVhY2ggcGF0aCBpbmRpdmlkdWFsbHkgYnkgYnJhbmNoaW5nIGVhcmx5LiBUaGlzIG5lZWRzXG4vLyBhIGNvbXBpbGVyIG9yIHdlIGNhbiBkbyBpdCBtYW51YWxseS4gSGVscGVycyB0aGF0IGRvbid0IG5lZWQgdGhpcyBicmFuY2hpbmdcbi8vIGxpdmUgb3V0c2lkZSBvZiB0aGlzIGZ1bmN0aW9uLlxuXG5cbmZ1bmN0aW9uIENoaWxkUmVjb25jaWxlcihzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gIGZ1bmN0aW9uIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZFRvRGVsZXRlKSB7XG4gICAgaWYgKCFzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAvLyBOb29wLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBkZWxldGlvbnMgPSByZXR1cm5GaWJlci5kZWxldGlvbnM7XG5cbiAgICBpZiAoZGVsZXRpb25zID09PSBudWxsKSB7XG4gICAgICByZXR1cm5GaWJlci5kZWxldGlvbnMgPSBbY2hpbGRUb0RlbGV0ZV07XG4gICAgICByZXR1cm5GaWJlci5mbGFncyB8PSBDaGlsZERlbGV0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGlvbnMucHVzaChjaGlsZFRvRGVsZXRlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpIHtcbiAgICBpZiAoIXNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgIC8vIE5vb3AuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IC8vIFRPRE86IEZvciB0aGUgc2hvdWxkQ2xvbmUgY2FzZSwgdGhpcyBjb3VsZCBiZSBtaWNyby1vcHRpbWl6ZWQgYSBiaXQgYnlcbiAgICAvLyBhc3N1bWluZyB0aGF0IGFmdGVyIHRoZSBmaXJzdCBjaGlsZCB3ZSd2ZSBhbHJlYWR5IGFkZGVkIGV2ZXJ5dGhpbmcuXG5cblxuICAgIHZhciBjaGlsZFRvRGVsZXRlID0gY3VycmVudEZpcnN0Q2hpbGQ7XG5cbiAgICB3aGlsZSAoY2hpbGRUb0RlbGV0ZSAhPT0gbnVsbCkge1xuICAgICAgZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkVG9EZWxldGUpO1xuICAgICAgY2hpbGRUb0RlbGV0ZSA9IGNoaWxkVG9EZWxldGUuc2libGluZztcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1hcFJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCkge1xuICAgIC8vIEFkZCB0aGUgcmVtYWluaW5nIGNoaWxkcmVuIHRvIGEgdGVtcG9yYXJ5IG1hcCBzbyB0aGF0IHdlIGNhbiBmaW5kIHRoZW0gYnlcbiAgICAvLyBrZXlzIHF1aWNrbHkuIEltcGxpY2l0IChudWxsKSBrZXlzIGdldCBhZGRlZCB0byB0aGlzIHNldCB3aXRoIHRoZWlyIGluZGV4XG4gICAgLy8gaW5zdGVhZC5cbiAgICB2YXIgZXhpc3RpbmdDaGlsZHJlbiA9IG5ldyBNYXAoKTtcbiAgICB2YXIgZXhpc3RpbmdDaGlsZCA9IGN1cnJlbnRGaXJzdENoaWxkO1xuXG4gICAgd2hpbGUgKGV4aXN0aW5nQ2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGlmIChleGlzdGluZ0NoaWxkLmtleSAhPT0gbnVsbCkge1xuICAgICAgICBleGlzdGluZ0NoaWxkcmVuLnNldChleGlzdGluZ0NoaWxkLmtleSwgZXhpc3RpbmdDaGlsZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleGlzdGluZ0NoaWxkcmVuLnNldChleGlzdGluZ0NoaWxkLmluZGV4LCBleGlzdGluZ0NoaWxkKTtcbiAgICAgIH1cblxuICAgICAgZXhpc3RpbmdDaGlsZCA9IGV4aXN0aW5nQ2hpbGQuc2libGluZztcbiAgICB9XG5cbiAgICByZXR1cm4gZXhpc3RpbmdDaGlsZHJlbjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVzZUZpYmVyKGZpYmVyLCBwZW5kaW5nUHJvcHMpIHtcbiAgICAvLyBXZSBjdXJyZW50bHkgc2V0IHNpYmxpbmcgdG8gbnVsbCBhbmQgaW5kZXggdG8gMCBoZXJlIGJlY2F1c2UgaXQgaXMgZWFzeVxuICAgIC8vIHRvIGZvcmdldCB0byBkbyBiZWZvcmUgcmV0dXJuaW5nIGl0LiBFLmcuIGZvciB0aGUgc2luZ2xlIGNoaWxkIGNhc2UuXG4gICAgdmFyIGNsb25lID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoZmliZXIsIHBlbmRpbmdQcm9wcyk7XG4gICAgY2xvbmUuaW5kZXggPSAwO1xuICAgIGNsb25lLnNpYmxpbmcgPSBudWxsO1xuICAgIHJldHVybiBjbG9uZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBsYWNlQ2hpbGQobmV3RmliZXIsIGxhc3RQbGFjZWRJbmRleCwgbmV3SW5kZXgpIHtcbiAgICBuZXdGaWJlci5pbmRleCA9IG5ld0luZGV4O1xuXG4gICAgaWYgKCFzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAvLyBEdXJpbmcgaHlkcmF0aW9uLCB0aGUgdXNlSWQgYWxnb3JpdGhtIG5lZWRzIHRvIGtub3cgd2hpY2ggZmliZXJzIGFyZVxuICAgICAgLy8gcGFydCBvZiBhIGxpc3Qgb2YgY2hpbGRyZW4gKGFycmF5cywgaXRlcmF0b3JzKS5cbiAgICAgIG5ld0ZpYmVyLmZsYWdzIHw9IEZvcmtlZDtcbiAgICAgIHJldHVybiBsYXN0UGxhY2VkSW5kZXg7XG4gICAgfVxuXG4gICAgdmFyIGN1cnJlbnQgPSBuZXdGaWJlci5hbHRlcm5hdGU7XG5cbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgdmFyIG9sZEluZGV4ID0gY3VycmVudC5pbmRleDtcblxuICAgICAgaWYgKG9sZEluZGV4IDwgbGFzdFBsYWNlZEluZGV4KSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBtb3ZlLlxuICAgICAgICBuZXdGaWJlci5mbGFncyB8PSBQbGFjZW1lbnQ7XG4gICAgICAgIHJldHVybiBsYXN0UGxhY2VkSW5kZXg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGlzIGl0ZW0gY2FuIHN0YXkgaW4gcGxhY2UuXG4gICAgICAgIHJldHVybiBvbGRJbmRleDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhpcyBpcyBhbiBpbnNlcnRpb24uXG4gICAgICBuZXdGaWJlci5mbGFncyB8PSBQbGFjZW1lbnQ7XG4gICAgICByZXR1cm4gbGFzdFBsYWNlZEluZGV4O1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHBsYWNlU2luZ2xlQ2hpbGQobmV3RmliZXIpIHtcbiAgICAvLyBUaGlzIGlzIHNpbXBsZXIgZm9yIHRoZSBzaW5nbGUgY2hpbGQgY2FzZS4gV2Ugb25seSBuZWVkIHRvIGRvIGFcbiAgICAvLyBwbGFjZW1lbnQgZm9yIGluc2VydGluZyBuZXcgY2hpbGRyZW4uXG4gICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMgJiYgbmV3RmliZXIuYWx0ZXJuYXRlID09PSBudWxsKSB7XG4gICAgICBuZXdGaWJlci5mbGFncyB8PSBQbGFjZW1lbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0ZpYmVyO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlVGV4dE5vZGUocmV0dXJuRmliZXIsIGN1cnJlbnQsIHRleHRDb250ZW50LCBsYW5lcykge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQudGFnICE9PSBIb3N0VGV4dCkge1xuICAgICAgLy8gSW5zZXJ0XG4gICAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbVRleHQodGV4dENvbnRlbnQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcbiAgICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXBkYXRlXG4gICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjdXJyZW50LCB0ZXh0Q29udGVudCk7XG4gICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVFbGVtZW50KHJldHVybkZpYmVyLCBjdXJyZW50LCBlbGVtZW50LCBsYW5lcykge1xuICAgIHZhciBlbGVtZW50VHlwZSA9IGVsZW1lbnQudHlwZTtcblxuICAgIGlmIChlbGVtZW50VHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgICAgcmV0dXJuIHVwZGF0ZUZyYWdtZW50KHJldHVybkZpYmVyLCBjdXJyZW50LCBlbGVtZW50LnByb3BzLmNoaWxkcmVuLCBsYW5lcywgZWxlbWVudC5rZXkpO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICBpZiAoY3VycmVudC5lbGVtZW50VHlwZSA9PT0gZWxlbWVudFR5cGUgfHwgKCAvLyBLZWVwIHRoaXMgY2hlY2sgaW5saW5lIHNvIGl0IG9ubHkgcnVucyBvbiB0aGUgZmFsc2UgcGF0aDpcbiAgICAgICBpc0NvbXBhdGlibGVGYW1pbHlGb3JIb3RSZWxvYWRpbmcoY3VycmVudCwgZWxlbWVudCkgKSB8fCAvLyBMYXp5IHR5cGVzIHNob3VsZCByZWNvbmNpbGUgdGhlaXIgcmVzb2x2ZWQgdHlwZS5cbiAgICAgIC8vIFdlIG5lZWQgdG8gZG8gdGhpcyBhZnRlciB0aGUgSG90IFJlbG9hZGluZyBjaGVjayBhYm92ZSxcbiAgICAgIC8vIGJlY2F1c2UgaG90IHJlbG9hZGluZyBoYXMgZGlmZmVyZW50IHNlbWFudGljcyB0aGFuIHByb2QgYmVjYXVzZVxuICAgICAgLy8gaXQgZG9lc24ndCByZXN1c3BlbmQuIFNvIHdlIGNhbid0IGxldCB0aGUgY2FsbCBiZWxvdyBzdXNwZW5kLlxuICAgICAgdHlwZW9mIGVsZW1lbnRUeXBlID09PSAnb2JqZWN0JyAmJiBlbGVtZW50VHlwZSAhPT0gbnVsbCAmJiBlbGVtZW50VHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFICYmIHJlc29sdmVMYXp5KGVsZW1lbnRUeXBlKSA9PT0gY3VycmVudC50eXBlKSB7XG4gICAgICAgIC8vIE1vdmUgYmFzZWQgb24gaW5kZXhcbiAgICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY3VycmVudCwgZWxlbWVudC5wcm9wcyk7XG4gICAgICAgIGV4aXN0aW5nLnJlZiA9IGNvZXJjZVJlZihyZXR1cm5GaWJlciwgY3VycmVudCwgZWxlbWVudCk7XG4gICAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBleGlzdGluZy5fZGVidWdTb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7XG4gICAgICAgICAgZXhpc3RpbmcuX2RlYnVnT3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBleGlzdGluZztcbiAgICAgIH1cbiAgICB9IC8vIEluc2VydFxuXG5cbiAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbUVsZW1lbnQoZWxlbWVudCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuICAgIGNyZWF0ZWQucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjdXJyZW50LCBlbGVtZW50KTtcbiAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgIHJldHVybiBjcmVhdGVkO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlUG9ydGFsKHJldHVybkZpYmVyLCBjdXJyZW50LCBwb3J0YWwsIGxhbmVzKSB7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudC50YWcgIT09IEhvc3RQb3J0YWwgfHwgY3VycmVudC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyAhPT0gcG9ydGFsLmNvbnRhaW5lckluZm8gfHwgY3VycmVudC5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb24gIT09IHBvcnRhbC5pbXBsZW1lbnRhdGlvbikge1xuICAgICAgLy8gSW5zZXJ0XG4gICAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbVBvcnRhbChwb3J0YWwsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcbiAgICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXBkYXRlXG4gICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjdXJyZW50LCBwb3J0YWwuY2hpbGRyZW4gfHwgW10pO1xuICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlRnJhZ21lbnQocmV0dXJuRmliZXIsIGN1cnJlbnQsIGZyYWdtZW50LCBsYW5lcywga2V5KSB7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudC50YWcgIT09IEZyYWdtZW50KSB7XG4gICAgICAvLyBJbnNlcnRcbiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZnJhZ21lbnQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzLCBrZXkpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVcGRhdGVcbiAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGN1cnJlbnQsIGZyYWdtZW50KTtcbiAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUNoaWxkKHJldHVybkZpYmVyLCBuZXdDaGlsZCwgbGFuZXMpIHtcbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnc3RyaW5nJyAmJiBuZXdDaGlsZCAhPT0gJycgfHwgdHlwZW9mIG5ld0NoaWxkID09PSAnbnVtYmVyJykge1xuICAgICAgLy8gVGV4dCBub2RlcyBkb24ndCBoYXZlIGtleXMuIElmIHRoZSBwcmV2aW91cyBub2RlIGlzIGltcGxpY2l0bHkga2V5ZWRcbiAgICAgIC8vIHdlIGNhbiBjb250aW51ZSB0byByZXBsYWNlIGl0IHdpdGhvdXQgYWJvcnRpbmcgZXZlbiBpZiBpdCBpcyBub3QgYSB0ZXh0XG4gICAgICAvLyBub2RlLlxuICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21UZXh0KCcnICsgbmV3Q2hpbGQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcbiAgICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnb2JqZWN0JyAmJiBuZXdDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChuZXdDaGlsZC4kJHR5cGVvZikge1xuICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgX2NyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21FbGVtZW50KG5ld0NoaWxkLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG5cbiAgICAgICAgICAgIF9jcmVhdGVkLnJlZiA9IGNvZXJjZVJlZihyZXR1cm5GaWJlciwgbnVsbCwgbmV3Q2hpbGQpO1xuICAgICAgICAgICAgX2NyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICAgICAgICByZXR1cm4gX2NyZWF0ZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIF9jcmVhdGVkMiA9IGNyZWF0ZUZpYmVyRnJvbVBvcnRhbChuZXdDaGlsZCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuXG4gICAgICAgICAgICBfY3JlYXRlZDIucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICAgICAgICByZXR1cm4gX2NyZWF0ZWQyO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgcGF5bG9hZCA9IG5ld0NoaWxkLl9wYXlsb2FkO1xuICAgICAgICAgICAgdmFyIGluaXQgPSBuZXdDaGlsZC5faW5pdDtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVDaGlsZChyZXR1cm5GaWJlciwgaW5pdChwYXlsb2FkKSwgbGFuZXMpO1xuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXJyYXkobmV3Q2hpbGQpIHx8IGdldEl0ZXJhdG9yRm4obmV3Q2hpbGQpKSB7XG4gICAgICAgIHZhciBfY3JlYXRlZDMgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChuZXdDaGlsZCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMsIG51bGwpO1xuXG4gICAgICAgIF9jcmVhdGVkMy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgICAgcmV0dXJuIF9jcmVhdGVkMztcbiAgICAgIH1cblxuICAgICAgdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3YXJuT25GdW5jdGlvblR5cGUocmV0dXJuRmliZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlU2xvdChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkLCBsYW5lcykge1xuICAgIC8vIFVwZGF0ZSB0aGUgZmliZXIgaWYgdGhlIGtleXMgbWF0Y2gsIG90aGVyd2lzZSByZXR1cm4gbnVsbC5cbiAgICB2YXIga2V5ID0gb2xkRmliZXIgIT09IG51bGwgPyBvbGRGaWJlci5rZXkgOiBudWxsO1xuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ3N0cmluZycgJiYgbmV3Q2hpbGQgIT09ICcnIHx8IHR5cGVvZiBuZXdDaGlsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgIC8vIFRleHQgbm9kZXMgZG9uJ3QgaGF2ZSBrZXlzLiBJZiB0aGUgcHJldmlvdXMgbm9kZSBpcyBpbXBsaWNpdGx5IGtleWVkXG4gICAgICAvLyB3ZSBjYW4gY29udGludWUgdG8gcmVwbGFjZSBpdCB3aXRob3V0IGFib3J0aW5nIGV2ZW4gaWYgaXQgaXMgbm90IGEgdGV4dFxuICAgICAgLy8gbm9kZS5cbiAgICAgIGlmIChrZXkgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1cGRhdGVUZXh0Tm9kZShyZXR1cm5GaWJlciwgb2xkRmliZXIsICcnICsgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnb2JqZWN0JyAmJiBuZXdDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChuZXdDaGlsZC4kJHR5cGVvZikge1xuICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAobmV3Q2hpbGQua2V5ID09PSBrZXkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZUVsZW1lbnQocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBuZXdDaGlsZCwgbGFuZXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKG5ld0NoaWxkLmtleSA9PT0ga2V5KSB7XG4gICAgICAgICAgICAgIHJldHVybiB1cGRhdGVQb3J0YWwocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBuZXdDaGlsZCwgbGFuZXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBwYXlsb2FkID0gbmV3Q2hpbGQuX3BheWxvYWQ7XG4gICAgICAgICAgICB2YXIgaW5pdCA9IG5ld0NoaWxkLl9pbml0O1xuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVNsb3QocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBpbml0KHBheWxvYWQpLCBsYW5lcyk7XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNBcnJheShuZXdDaGlsZCkgfHwgZ2V0SXRlcmF0b3JGbihuZXdDaGlsZCkpIHtcbiAgICAgICAgaWYgKGtleSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZUZyYWdtZW50KHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQsIGxhbmVzLCBudWxsKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3YXJuT25GdW5jdGlvblR5cGUocmV0dXJuRmliZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlRnJvbU1hcChleGlzdGluZ0NoaWxkcmVuLCByZXR1cm5GaWJlciwgbmV3SWR4LCBuZXdDaGlsZCwgbGFuZXMpIHtcbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnc3RyaW5nJyAmJiBuZXdDaGlsZCAhPT0gJycgfHwgdHlwZW9mIG5ld0NoaWxkID09PSAnbnVtYmVyJykge1xuICAgICAgLy8gVGV4dCBub2RlcyBkb24ndCBoYXZlIGtleXMsIHNvIHdlIG5laXRoZXIgaGF2ZSB0byBjaGVjayB0aGUgb2xkIG5vclxuICAgICAgLy8gbmV3IG5vZGUgZm9yIHRoZSBrZXkuIElmIGJvdGggYXJlIHRleHQgbm9kZXMsIHRoZXkgbWF0Y2guXG4gICAgICB2YXIgbWF0Y2hlZEZpYmVyID0gZXhpc3RpbmdDaGlsZHJlbi5nZXQobmV3SWR4KSB8fCBudWxsO1xuICAgICAgcmV0dXJuIHVwZGF0ZVRleHROb2RlKHJldHVybkZpYmVyLCBtYXRjaGVkRmliZXIsICcnICsgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnb2JqZWN0JyAmJiBuZXdDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChuZXdDaGlsZC4kJHR5cGVvZikge1xuICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgX21hdGNoZWRGaWJlciA9IGV4aXN0aW5nQ2hpbGRyZW4uZ2V0KG5ld0NoaWxkLmtleSA9PT0gbnVsbCA/IG5ld0lkeCA6IG5ld0NoaWxkLmtleSkgfHwgbnVsbDtcblxuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZUVsZW1lbnQocmV0dXJuRmliZXIsIF9tYXRjaGVkRmliZXIsIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIF9tYXRjaGVkRmliZXIyID0gZXhpc3RpbmdDaGlsZHJlbi5nZXQobmV3Q2hpbGQua2V5ID09PSBudWxsID8gbmV3SWR4IDogbmV3Q2hpbGQua2V5KSB8fCBudWxsO1xuXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlUG9ydGFsKHJldHVybkZpYmVyLCBfbWF0Y2hlZEZpYmVyMiwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBuZXdDaGlsZC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IG5ld0NoaWxkLl9pbml0O1xuICAgICAgICAgIHJldHVybiB1cGRhdGVGcm9tTWFwKGV4aXN0aW5nQ2hpbGRyZW4sIHJldHVybkZpYmVyLCBuZXdJZHgsIGluaXQocGF5bG9hZCksIGxhbmVzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXJyYXkobmV3Q2hpbGQpIHx8IGdldEl0ZXJhdG9yRm4obmV3Q2hpbGQpKSB7XG4gICAgICAgIHZhciBfbWF0Y2hlZEZpYmVyMyA9IGV4aXN0aW5nQ2hpbGRyZW4uZ2V0KG5ld0lkeCkgfHwgbnVsbDtcblxuICAgICAgICByZXR1cm4gdXBkYXRlRnJhZ21lbnQocmV0dXJuRmliZXIsIF9tYXRjaGVkRmliZXIzLCBuZXdDaGlsZCwgbGFuZXMsIG51bGwpO1xuICAgICAgfVxuXG4gICAgICB0aHJvd09uSW52YWxpZE9iamVjdFR5cGUocmV0dXJuRmliZXIsIG5ld0NoaWxkKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdhcm5PbkZ1bmN0aW9uVHlwZShyZXR1cm5GaWJlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIFdhcm5zIGlmIHRoZXJlIGlzIGEgZHVwbGljYXRlIG9yIG1pc3Npbmcga2V5XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gd2Fybk9uSW52YWxpZEtleShjaGlsZCwga25vd25LZXlzLCByZXR1cm5GaWJlcikge1xuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgY2hpbGQgIT09ICdvYmplY3QnIHx8IGNoaWxkID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBrbm93bktleXM7XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoY2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAgd2FybkZvck1pc3NpbmdLZXkoY2hpbGQsIHJldHVybkZpYmVyKTtcbiAgICAgICAgICB2YXIga2V5ID0gY2hpbGQua2V5O1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBrZXkgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoa25vd25LZXlzID09PSBudWxsKSB7XG4gICAgICAgICAgICBrbm93bktleXMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBrbm93bktleXMuYWRkKGtleSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWtub3duS2V5cy5oYXMoa2V5KSkge1xuICAgICAgICAgICAga25vd25LZXlzLmFkZChrZXkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZXJyb3IoJ0VuY291bnRlcmVkIHR3byBjaGlsZHJlbiB3aXRoIHRoZSBzYW1lIGtleSwgYCVzYC4gJyArICdLZXlzIHNob3VsZCBiZSB1bmlxdWUgc28gdGhhdCBjb21wb25lbnRzIG1haW50YWluIHRoZWlyIGlkZW50aXR5ICcgKyAnYWNyb3NzIHVwZGF0ZXMuIE5vbi11bmlxdWUga2V5cyBtYXkgY2F1c2UgY2hpbGRyZW4gdG8gYmUgJyArICdkdXBsaWNhdGVkIGFuZC9vciBvbWl0dGVkIFx1MjAxNCB0aGUgYmVoYXZpb3IgaXMgdW5zdXBwb3J0ZWQgYW5kICcgKyAnY291bGQgY2hhbmdlIGluIGEgZnV0dXJlIHZlcnNpb24uJywga2V5KTtcblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgIHZhciBwYXlsb2FkID0gY2hpbGQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBjaGlsZC5faW5pdDtcbiAgICAgICAgICB3YXJuT25JbnZhbGlkS2V5KGluaXQocGF5bG9hZCksIGtub3duS2V5cywgcmV0dXJuRmliZXIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBrbm93bktleXM7XG4gIH1cblxuICBmdW5jdGlvbiByZWNvbmNpbGVDaGlsZHJlbkFycmF5KHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGRyZW4sIGxhbmVzKSB7XG4gICAgLy8gVGhpcyBhbGdvcml0aG0gY2FuJ3Qgb3B0aW1pemUgYnkgc2VhcmNoaW5nIGZyb20gYm90aCBlbmRzIHNpbmNlIHdlXG4gICAgLy8gZG9uJ3QgaGF2ZSBiYWNrcG9pbnRlcnMgb24gZmliZXJzLiBJJ20gdHJ5aW5nIHRvIHNlZSBob3cgZmFyIHdlIGNhbiBnZXRcbiAgICAvLyB3aXRoIHRoYXQgbW9kZWwuIElmIGl0IGVuZHMgdXAgbm90IGJlaW5nIHdvcnRoIHRoZSB0cmFkZW9mZnMsIHdlIGNhblxuICAgIC8vIGFkZCBpdCBsYXRlci5cbiAgICAvLyBFdmVuIHdpdGggYSB0d28gZW5kZWQgb3B0aW1pemF0aW9uLCB3ZSdkIHdhbnQgdG8gb3B0aW1pemUgZm9yIHRoZSBjYXNlXG4gICAgLy8gd2hlcmUgdGhlcmUgYXJlIGZldyBjaGFuZ2VzIGFuZCBicnV0ZSBmb3JjZSB0aGUgY29tcGFyaXNvbiBpbnN0ZWFkIG9mXG4gICAgLy8gZ29pbmcgZm9yIHRoZSBNYXAuIEl0J2QgbGlrZSB0byBleHBsb3JlIGhpdHRpbmcgdGhhdCBwYXRoIGZpcnN0IGluXG4gICAgLy8gZm9yd2FyZC1vbmx5IG1vZGUgYW5kIG9ubHkgZ28gZm9yIHRoZSBNYXAgb25jZSB3ZSBub3RpY2UgdGhhdCB3ZSBuZWVkXG4gICAgLy8gbG90cyBvZiBsb29rIGFoZWFkLiBUaGlzIGRvZXNuJ3QgaGFuZGxlIHJldmVyc2FsIGFzIHdlbGwgYXMgdHdvIGVuZGVkXG4gICAgLy8gc2VhcmNoIGJ1dCB0aGF0J3MgdW51c3VhbC4gQmVzaWRlcywgZm9yIHRoZSB0d28gZW5kZWQgb3B0aW1pemF0aW9uIHRvXG4gICAgLy8gd29yayBvbiBJdGVyYWJsZXMsIHdlJ2QgbmVlZCB0byBjb3B5IHRoZSB3aG9sZSBzZXQuXG4gICAgLy8gSW4gdGhpcyBmaXJzdCBpdGVyYXRpb24sIHdlJ2xsIGp1c3QgbGl2ZSB3aXRoIGhpdHRpbmcgdGhlIGJhZCBjYXNlXG4gICAgLy8gKGFkZGluZyBldmVyeXRoaW5nIHRvIGEgTWFwKSBpbiBmb3IgZXZlcnkgaW5zZXJ0L21vdmUuXG4gICAgLy8gSWYgeW91IGNoYW5nZSB0aGlzIGNvZGUsIGFsc28gdXBkYXRlIHJlY29uY2lsZUNoaWxkcmVuSXRlcmF0b3IoKSB3aGljaFxuICAgIC8vIHVzZXMgdGhlIHNhbWUgYWxnb3JpdGhtLlxuICAgIHtcbiAgICAgIC8vIEZpcnN0LCB2YWxpZGF0ZSBrZXlzLlxuICAgICAgdmFyIGtub3duS2V5cyA9IG51bGw7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV3Q2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNoaWxkID0gbmV3Q2hpbGRyZW5baV07XG4gICAgICAgIGtub3duS2V5cyA9IHdhcm5PbkludmFsaWRLZXkoY2hpbGQsIGtub3duS2V5cywgcmV0dXJuRmliZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciByZXN1bHRpbmdGaXJzdENoaWxkID0gbnVsbDtcbiAgICB2YXIgcHJldmlvdXNOZXdGaWJlciA9IG51bGw7XG4gICAgdmFyIG9sZEZpYmVyID0gY3VycmVudEZpcnN0Q2hpbGQ7XG4gICAgdmFyIGxhc3RQbGFjZWRJbmRleCA9IDA7XG4gICAgdmFyIG5ld0lkeCA9IDA7XG4gICAgdmFyIG5leHRPbGRGaWJlciA9IG51bGw7XG5cbiAgICBmb3IgKDsgb2xkRmliZXIgIT09IG51bGwgJiYgbmV3SWR4IDwgbmV3Q2hpbGRyZW4ubGVuZ3RoOyBuZXdJZHgrKykge1xuICAgICAgaWYgKG9sZEZpYmVyLmluZGV4ID4gbmV3SWR4KSB7XG4gICAgICAgIG5leHRPbGRGaWJlciA9IG9sZEZpYmVyO1xuICAgICAgICBvbGRGaWJlciA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0T2xkRmliZXIgPSBvbGRGaWJlci5zaWJsaW5nO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmV3RmliZXIgPSB1cGRhdGVTbG90KHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGRyZW5bbmV3SWR4XSwgbGFuZXMpO1xuXG4gICAgICBpZiAobmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBicmVha3Mgb24gZW1wdHkgc2xvdHMgbGlrZSBudWxsIGNoaWxkcmVuLiBUaGF0J3NcbiAgICAgICAgLy8gdW5mb3J0dW5hdGUgYmVjYXVzZSBpdCB0cmlnZ2VycyB0aGUgc2xvdyBwYXRoIGFsbCB0aGUgdGltZS4gV2UgbmVlZFxuICAgICAgICAvLyBhIGJldHRlciB3YXkgdG8gY29tbXVuaWNhdGUgd2hldGhlciB0aGlzIHdhcyBhIG1pc3Mgb3IgbnVsbCxcbiAgICAgICAgLy8gYm9vbGVhbiwgdW5kZWZpbmVkLCBldGMuXG4gICAgICAgIGlmIChvbGRGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIG9sZEZpYmVyID0gbmV4dE9sZEZpYmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAgIGlmIChvbGRGaWJlciAmJiBuZXdGaWJlci5hbHRlcm5hdGUgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSBtYXRjaGVkIHRoZSBzbG90LCBidXQgd2UgZGlkbid0IHJldXNlIHRoZSBleGlzdGluZyBmaWJlciwgc28gd2VcbiAgICAgICAgICAvLyBuZWVkIHRvIGRlbGV0ZSB0aGUgZXhpc3RpbmcgY2hpbGQuXG4gICAgICAgICAgZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIG9sZEZpYmVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKG5ld0ZpYmVyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG5cbiAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgIC8vIFRPRE86IE1vdmUgb3V0IG9mIHRoZSBsb29wLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgdGhlIGZpcnN0IHJ1bi5cbiAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IG5ld0ZpYmVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVE9ETzogRGVmZXIgc2libGluZ3MgaWYgd2UncmUgbm90IGF0IHRoZSByaWdodCBpbmRleCBmb3IgdGhpcyBzbG90LlxuICAgICAgICAvLyBJLmUuIGlmIHdlIGhhZCBudWxsIHZhbHVlcyBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byBkZWZlciB0aGlzXG4gICAgICAgIC8vIGZvciBlYWNoIG51bGwgdmFsdWUuIEhvd2V2ZXIsIHdlIGFsc28gZG9uJ3Qgd2FudCB0byBjYWxsIHVwZGF0ZVNsb3RcbiAgICAgICAgLy8gd2l0aCB0aGUgcHJldmlvdXMgb25lLlxuICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBuZXdGaWJlcjtcbiAgICAgIH1cblxuICAgICAgcHJldmlvdXNOZXdGaWJlciA9IG5ld0ZpYmVyO1xuICAgICAgb2xkRmliZXIgPSBuZXh0T2xkRmliZXI7XG4gICAgfVxuXG4gICAgaWYgKG5ld0lkeCA9PT0gbmV3Q2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAvLyBXZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIG5ldyBjaGlsZHJlbi4gV2UgY2FuIGRlbGV0ZSB0aGUgcmVzdC5cbiAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBvbGRGaWJlcik7XG5cbiAgICAgIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgICAgIHZhciBudW1iZXJPZkZvcmtzID0gbmV3SWR4O1xuICAgICAgICBwdXNoVHJlZUZvcmsocmV0dXJuRmliZXIsIG51bWJlck9mRm9ya3MpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgICB9XG5cbiAgICBpZiAob2xkRmliZXIgPT09IG51bGwpIHtcbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYW55IG1vcmUgZXhpc3RpbmcgY2hpbGRyZW4gd2UgY2FuIGNob29zZSBhIGZhc3QgcGF0aFxuICAgICAgLy8gc2luY2UgdGhlIHJlc3Qgd2lsbCBhbGwgYmUgaW5zZXJ0aW9ucy5cbiAgICAgIGZvciAoOyBuZXdJZHggPCBuZXdDaGlsZHJlbi5sZW5ndGg7IG5ld0lkeCsrKSB7XG4gICAgICAgIHZhciBfbmV3RmliZXIgPSBjcmVhdGVDaGlsZChyZXR1cm5GaWJlciwgbmV3Q2hpbGRyZW5bbmV3SWR4XSwgbGFuZXMpO1xuXG4gICAgICAgIGlmIChfbmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQoX25ld0ZpYmVyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG5cbiAgICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBUT0RPOiBNb3ZlIG91dCBvZiB0aGUgbG9vcC4gVGhpcyBvbmx5IGhhcHBlbnMgZm9yIHRoZSBmaXJzdCBydW4uXG4gICAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IF9uZXdGaWJlcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBfbmV3RmliZXI7XG4gICAgICAgIH1cblxuICAgICAgICBwcmV2aW91c05ld0ZpYmVyID0gX25ld0ZpYmVyO1xuICAgICAgfVxuXG4gICAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgICAgICB2YXIgX251bWJlck9mRm9ya3MgPSBuZXdJZHg7XG4gICAgICAgIHB1c2hUcmVlRm9yayhyZXR1cm5GaWJlciwgX251bWJlck9mRm9ya3MpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgICB9IC8vIEFkZCBhbGwgY2hpbGRyZW4gdG8gYSBrZXkgbWFwIGZvciBxdWljayBsb29rdXBzLlxuXG5cbiAgICB2YXIgZXhpc3RpbmdDaGlsZHJlbiA9IG1hcFJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBvbGRGaWJlcik7IC8vIEtlZXAgc2Nhbm5pbmcgYW5kIHVzZSB0aGUgbWFwIHRvIHJlc3RvcmUgZGVsZXRlZCBpdGVtcyBhcyBtb3Zlcy5cblxuICAgIGZvciAoOyBuZXdJZHggPCBuZXdDaGlsZHJlbi5sZW5ndGg7IG5ld0lkeCsrKSB7XG4gICAgICB2YXIgX25ld0ZpYmVyMiA9IHVwZGF0ZUZyb21NYXAoZXhpc3RpbmdDaGlsZHJlbiwgcmV0dXJuRmliZXIsIG5ld0lkeCwgbmV3Q2hpbGRyZW5bbmV3SWR4XSwgbGFuZXMpO1xuXG4gICAgICBpZiAoX25ld0ZpYmVyMiAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgICAgIGlmIChfbmV3RmliZXIyLmFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gVGhlIG5ldyBmaWJlciBpcyBhIHdvcmsgaW4gcHJvZ3Jlc3MsIGJ1dCBpZiB0aGVyZSBleGlzdHMgYVxuICAgICAgICAgICAgLy8gY3VycmVudCwgdGhhdCBtZWFucyB0aGF0IHdlIHJldXNlZCB0aGUgZmliZXIuIFdlIG5lZWQgdG8gZGVsZXRlXG4gICAgICAgICAgICAvLyBpdCBmcm9tIHRoZSBjaGlsZCBsaXN0IHNvIHRoYXQgd2UgZG9uJ3QgYWRkIGl0IHRvIHRoZSBkZWxldGlvblxuICAgICAgICAgICAgLy8gbGlzdC5cbiAgICAgICAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uZGVsZXRlKF9uZXdGaWJlcjIua2V5ID09PSBudWxsID8gbmV3SWR4IDogX25ld0ZpYmVyMi5rZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQoX25ld0ZpYmVyMiwgbGFzdFBsYWNlZEluZGV4LCBuZXdJZHgpO1xuXG4gICAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IF9uZXdGaWJlcjI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gX25ld0ZpYmVyMjtcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBfbmV3RmliZXIyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAvLyBBbnkgZXhpc3RpbmcgY2hpbGRyZW4gdGhhdCB3ZXJlbid0IGNvbnN1bWVkIGFib3ZlIHdlcmUgZGVsZXRlZC4gV2UgbmVlZFxuICAgICAgLy8gdG8gYWRkIHRoZW0gdG8gdGhlIGRlbGV0aW9uIGxpc3QuXG4gICAgICBleGlzdGluZ0NoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIHJldHVybiBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAgIHZhciBfbnVtYmVyT2ZGb3JrczIgPSBuZXdJZHg7XG4gICAgICBwdXNoVHJlZUZvcmsocmV0dXJuRmliZXIsIF9udW1iZXJPZkZvcmtzMik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gIH1cblxuICBmdW5jdGlvbiByZWNvbmNpbGVDaGlsZHJlbkl0ZXJhdG9yKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGRyZW5JdGVyYWJsZSwgbGFuZXMpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBzYW1lIGltcGxlbWVudGF0aW9uIGFzIHJlY29uY2lsZUNoaWxkcmVuQXJyYXkoKSxcbiAgICAvLyBidXQgdXNpbmcgdGhlIGl0ZXJhdG9yIGluc3RlYWQuXG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKG5ld0NoaWxkcmVuSXRlcmFibGUpO1xuXG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FuIG9iamVjdCBpcyBub3QgYW4gaXRlcmFibGUuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiAnICsgJ1JlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICAvLyBXZSBkb24ndCBzdXBwb3J0IHJlbmRlcmluZyBHZW5lcmF0b3JzIGJlY2F1c2UgaXQncyBhIG11dGF0aW9uLlxuICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTI5OTVcbiAgICAgIGlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIC8vICRGbG93Rml4TWUgRmxvdyBkb2Vzbid0IGtub3cgYWJvdXQgdG9TdHJpbmdUYWdcbiAgICAgIG5ld0NoaWxkcmVuSXRlcmFibGVbU3ltYm9sLnRvU3RyaW5nVGFnXSA9PT0gJ0dlbmVyYXRvcicpIHtcbiAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRHZW5lcmF0b3JzKSB7XG4gICAgICAgICAgZXJyb3IoJ1VzaW5nIEdlbmVyYXRvcnMgYXMgY2hpbGRyZW4gaXMgdW5zdXBwb3J0ZWQgYW5kIHdpbGwgbGlrZWx5IHlpZWxkICcgKyAndW5leHBlY3RlZCByZXN1bHRzIGJlY2F1c2UgZW51bWVyYXRpbmcgYSBnZW5lcmF0b3IgbXV0YXRlcyBpdC4gJyArICdZb3UgbWF5IGNvbnZlcnQgaXQgdG8gYW4gYXJyYXkgd2l0aCBgQXJyYXkuZnJvbSgpYCBvciB0aGUgJyArICdgWy4uLnNwcmVhZF1gIG9wZXJhdG9yIGJlZm9yZSByZW5kZXJpbmcuIEtlZXAgaW4gbWluZCAnICsgJ3lvdSBtaWdodCBuZWVkIHRvIHBvbHlmaWxsIHRoZXNlIGZlYXR1cmVzIGZvciBvbGRlciBicm93c2Vycy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRpZFdhcm5BYm91dEdlbmVyYXRvcnMgPSB0cnVlO1xuICAgICAgfSAvLyBXYXJuIGFib3V0IHVzaW5nIE1hcHMgYXMgY2hpbGRyZW5cblxuXG4gICAgICBpZiAobmV3Q2hpbGRyZW5JdGVyYWJsZS5lbnRyaWVzID09PSBpdGVyYXRvckZuKSB7XG4gICAgICAgIGlmICghZGlkV2FybkFib3V0TWFwcykge1xuICAgICAgICAgIGVycm9yKCdVc2luZyBNYXBzIGFzIGNoaWxkcmVuIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnVXNlIGFuIGFycmF5IG9mIGtleWVkIFJlYWN0RWxlbWVudHMgaW5zdGVhZC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRpZFdhcm5BYm91dE1hcHMgPSB0cnVlO1xuICAgICAgfSAvLyBGaXJzdCwgdmFsaWRhdGUga2V5cy5cbiAgICAgIC8vIFdlJ2xsIGdldCBhIGRpZmZlcmVudCBpdGVyYXRvciBsYXRlciBmb3IgdGhlIG1haW4gcGFzcy5cblxuXG4gICAgICB2YXIgX25ld0NoaWxkcmVuID0gaXRlcmF0b3JGbi5jYWxsKG5ld0NoaWxkcmVuSXRlcmFibGUpO1xuXG4gICAgICBpZiAoX25ld0NoaWxkcmVuKSB7XG4gICAgICAgIHZhciBrbm93bktleXMgPSBudWxsO1xuXG4gICAgICAgIHZhciBfc3RlcCA9IF9uZXdDaGlsZHJlbi5uZXh0KCk7XG5cbiAgICAgICAgZm9yICg7ICFfc3RlcC5kb25lOyBfc3RlcCA9IF9uZXdDaGlsZHJlbi5uZXh0KCkpIHtcbiAgICAgICAgICB2YXIgY2hpbGQgPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgICBrbm93bktleXMgPSB3YXJuT25JbnZhbGlkS2V5KGNoaWxkLCBrbm93bktleXMsIHJldHVybkZpYmVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBuZXdDaGlsZHJlbiA9IGl0ZXJhdG9yRm4uY2FsbChuZXdDaGlsZHJlbkl0ZXJhYmxlKTtcblxuICAgIGlmIChuZXdDaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FuIGl0ZXJhYmxlIG9iamVjdCBwcm92aWRlZCBubyBpdGVyYXRvci4nKTtcbiAgICB9XG5cbiAgICB2YXIgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IG51bGw7XG4gICAgdmFyIHByZXZpb3VzTmV3RmliZXIgPSBudWxsO1xuICAgIHZhciBvbGRGaWJlciA9IGN1cnJlbnRGaXJzdENoaWxkO1xuICAgIHZhciBsYXN0UGxhY2VkSW5kZXggPSAwO1xuICAgIHZhciBuZXdJZHggPSAwO1xuICAgIHZhciBuZXh0T2xkRmliZXIgPSBudWxsO1xuICAgIHZhciBzdGVwID0gbmV3Q2hpbGRyZW4ubmV4dCgpO1xuXG4gICAgZm9yICg7IG9sZEZpYmVyICE9PSBudWxsICYmICFzdGVwLmRvbmU7IG5ld0lkeCsrLCBzdGVwID0gbmV3Q2hpbGRyZW4ubmV4dCgpKSB7XG4gICAgICBpZiAob2xkRmliZXIuaW5kZXggPiBuZXdJZHgpIHtcbiAgICAgICAgbmV4dE9sZEZpYmVyID0gb2xkRmliZXI7XG4gICAgICAgIG9sZEZpYmVyID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRPbGRGaWJlciA9IG9sZEZpYmVyLnNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIHZhciBuZXdGaWJlciA9IHVwZGF0ZVNsb3QocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBzdGVwLnZhbHVlLCBsYW5lcyk7XG5cbiAgICAgIGlmIChuZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGJyZWFrcyBvbiBlbXB0eSBzbG90cyBsaWtlIG51bGwgY2hpbGRyZW4uIFRoYXQnc1xuICAgICAgICAvLyB1bmZvcnR1bmF0ZSBiZWNhdXNlIGl0IHRyaWdnZXJzIHRoZSBzbG93IHBhdGggYWxsIHRoZSB0aW1lLiBXZSBuZWVkXG4gICAgICAgIC8vIGEgYmV0dGVyIHdheSB0byBjb21tdW5pY2F0ZSB3aGV0aGVyIHRoaXMgd2FzIGEgbWlzcyBvciBudWxsLFxuICAgICAgICAvLyBib29sZWFuLCB1bmRlZmluZWQsIGV0Yy5cbiAgICAgICAgaWYgKG9sZEZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgb2xkRmliZXIgPSBuZXh0T2xkRmliZXI7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgICAgaWYgKG9sZEZpYmVyICYmIG5ld0ZpYmVyLmFsdGVybmF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlIG1hdGNoZWQgdGhlIHNsb3QsIGJ1dCB3ZSBkaWRuJ3QgcmV1c2UgdGhlIGV4aXN0aW5nIGZpYmVyLCBzbyB3ZVxuICAgICAgICAgIC8vIG5lZWQgdG8gZGVsZXRlIHRoZSBleGlzdGluZyBjaGlsZC5cbiAgICAgICAgICBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgb2xkRmliZXIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQobmV3RmliZXIsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgLy8gVE9ETzogTW92ZSBvdXQgb2YgdGhlIGxvb3AuIFRoaXMgb25seSBoYXBwZW5zIGZvciB0aGUgZmlyc3QgcnVuLlxuICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gbmV3RmliZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUT0RPOiBEZWZlciBzaWJsaW5ncyBpZiB3ZSdyZSBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IGZvciB0aGlzIHNsb3QuXG4gICAgICAgIC8vIEkuZS4gaWYgd2UgaGFkIG51bGwgdmFsdWVzIGJlZm9yZSwgdGhlbiB3ZSB3YW50IHRvIGRlZmVyIHRoaXNcbiAgICAgICAgLy8gZm9yIGVhY2ggbnVsbCB2YWx1ZS4gSG93ZXZlciwgd2UgYWxzbyBkb24ndCB3YW50IHRvIGNhbGwgdXBkYXRlU2xvdFxuICAgICAgICAvLyB3aXRoIHRoZSBwcmV2aW91cyBvbmUuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IG5ld0ZpYmVyO1xuICAgICAgfVxuXG4gICAgICBwcmV2aW91c05ld0ZpYmVyID0gbmV3RmliZXI7XG4gICAgICBvbGRGaWJlciA9IG5leHRPbGRGaWJlcjtcbiAgICB9XG5cbiAgICBpZiAoc3RlcC5kb25lKSB7XG4gICAgICAvLyBXZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIG5ldyBjaGlsZHJlbi4gV2UgY2FuIGRlbGV0ZSB0aGUgcmVzdC5cbiAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBvbGRGaWJlcik7XG5cbiAgICAgIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgICAgIHZhciBudW1iZXJPZkZvcmtzID0gbmV3SWR4O1xuICAgICAgICBwdXNoVHJlZUZvcmsocmV0dXJuRmliZXIsIG51bWJlck9mRm9ya3MpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgICB9XG5cbiAgICBpZiAob2xkRmliZXIgPT09IG51bGwpIHtcbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYW55IG1vcmUgZXhpc3RpbmcgY2hpbGRyZW4gd2UgY2FuIGNob29zZSBhIGZhc3QgcGF0aFxuICAgICAgLy8gc2luY2UgdGhlIHJlc3Qgd2lsbCBhbGwgYmUgaW5zZXJ0aW9ucy5cbiAgICAgIGZvciAoOyAhc3RlcC5kb25lOyBuZXdJZHgrKywgc3RlcCA9IG5ld0NoaWxkcmVuLm5leHQoKSkge1xuICAgICAgICB2YXIgX25ld0ZpYmVyMyA9IGNyZWF0ZUNoaWxkKHJldHVybkZpYmVyLCBzdGVwLnZhbHVlLCBsYW5lcyk7XG5cbiAgICAgICAgaWYgKF9uZXdGaWJlcjMgPT09IG51bGwpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQoX25ld0ZpYmVyMywgbGFzdFBsYWNlZEluZGV4LCBuZXdJZHgpO1xuXG4gICAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gVE9ETzogTW92ZSBvdXQgb2YgdGhlIGxvb3AuIFRoaXMgb25seSBoYXBwZW5zIGZvciB0aGUgZmlyc3QgcnVuLlxuICAgICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBfbmV3RmliZXIzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IF9uZXdGaWJlcjM7XG4gICAgICAgIH1cblxuICAgICAgICBwcmV2aW91c05ld0ZpYmVyID0gX25ld0ZpYmVyMztcbiAgICAgIH1cblxuICAgICAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAgICAgdmFyIF9udW1iZXJPZkZvcmtzMyA9IG5ld0lkeDtcbiAgICAgICAgcHVzaFRyZWVGb3JrKHJldHVybkZpYmVyLCBfbnVtYmVyT2ZGb3JrczMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgICB9IC8vIEFkZCBhbGwgY2hpbGRyZW4gdG8gYSBrZXkgbWFwIGZvciBxdWljayBsb29rdXBzLlxuXG5cbiAgICB2YXIgZXhpc3RpbmdDaGlsZHJlbiA9IG1hcFJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBvbGRGaWJlcik7IC8vIEtlZXAgc2Nhbm5pbmcgYW5kIHVzZSB0aGUgbWFwIHRvIHJlc3RvcmUgZGVsZXRlZCBpdGVtcyBhcyBtb3Zlcy5cblxuICAgIGZvciAoOyAhc3RlcC5kb25lOyBuZXdJZHgrKywgc3RlcCA9IG5ld0NoaWxkcmVuLm5leHQoKSkge1xuICAgICAgdmFyIF9uZXdGaWJlcjQgPSB1cGRhdGVGcm9tTWFwKGV4aXN0aW5nQ2hpbGRyZW4sIHJldHVybkZpYmVyLCBuZXdJZHgsIHN0ZXAudmFsdWUsIGxhbmVzKTtcblxuICAgICAgaWYgKF9uZXdGaWJlcjQgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgICAgICBpZiAoX25ld0ZpYmVyNC5hbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFRoZSBuZXcgZmliZXIgaXMgYSB3b3JrIGluIHByb2dyZXNzLCBidXQgaWYgdGhlcmUgZXhpc3RzIGFcbiAgICAgICAgICAgIC8vIGN1cnJlbnQsIHRoYXQgbWVhbnMgdGhhdCB3ZSByZXVzZWQgdGhlIGZpYmVyLiBXZSBuZWVkIHRvIGRlbGV0ZVxuICAgICAgICAgICAgLy8gaXQgZnJvbSB0aGUgY2hpbGQgbGlzdCBzbyB0aGF0IHdlIGRvbid0IGFkZCBpdCB0byB0aGUgZGVsZXRpb25cbiAgICAgICAgICAgIC8vIGxpc3QuXG4gICAgICAgICAgICBleGlzdGluZ0NoaWxkcmVuLmRlbGV0ZShfbmV3RmliZXI0LmtleSA9PT0gbnVsbCA/IG5ld0lkeCA6IF9uZXdGaWJlcjQua2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKF9uZXdGaWJlcjQsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBfbmV3RmliZXI0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IF9uZXdGaWJlcjQ7XG4gICAgICAgIH1cblxuICAgICAgICBwcmV2aW91c05ld0ZpYmVyID0gX25ld0ZpYmVyNDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgLy8gQW55IGV4aXN0aW5nIGNoaWxkcmVuIHRoYXQgd2VyZW4ndCBjb25zdW1lZCBhYm92ZSB3ZXJlIGRlbGV0ZWQuIFdlIG5lZWRcbiAgICAgIC8vIHRvIGFkZCB0aGVtIHRvIHRoZSBkZWxldGlvbiBsaXN0LlxuICAgICAgZXhpc3RpbmdDaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICByZXR1cm4gZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgICB2YXIgX251bWJlck9mRm9ya3M0ID0gbmV3SWR4O1xuICAgICAgcHVzaFRyZWVGb3JrKHJldHVybkZpYmVyLCBfbnVtYmVyT2ZGb3JrczQpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVjb25jaWxlU2luZ2xlVGV4dE5vZGUocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCB0ZXh0Q29udGVudCwgbGFuZXMpIHtcbiAgICAvLyBUaGVyZSdzIG5vIG5lZWQgdG8gY2hlY2sgZm9yIGtleXMgb24gdGV4dCBub2RlcyBzaW5jZSB3ZSBkb24ndCBoYXZlIGFcbiAgICAvLyB3YXkgdG8gZGVmaW5lIHRoZW0uXG4gICAgaWYgKGN1cnJlbnRGaXJzdENoaWxkICE9PSBudWxsICYmIGN1cnJlbnRGaXJzdENoaWxkLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAgIC8vIFdlIGFscmVhZHkgaGF2ZSBhbiBleGlzdGluZyBub2RlIHNvIGxldCdzIGp1c3QgdXBkYXRlIGl0IGFuZCBkZWxldGVcbiAgICAgIC8vIHRoZSByZXN0LlxuICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLnNpYmxpbmcpO1xuICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY3VycmVudEZpcnN0Q2hpbGQsIHRleHRDb250ZW50KTtcbiAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgIH0gLy8gVGhlIGV4aXN0aW5nIGZpcnN0IGNoaWxkIGlzIG5vdCBhIHRleHQgbm9kZSBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSBvbmVcbiAgICAvLyBhbmQgZGVsZXRlIHRoZSBleGlzdGluZyBvbmVzLlxuXG5cbiAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpO1xuICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tVGV4dCh0ZXh0Q29udGVudCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgcmV0dXJuIGNyZWF0ZWQ7XG4gIH1cblxuICBmdW5jdGlvbiByZWNvbmNpbGVTaW5nbGVFbGVtZW50KHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgZWxlbWVudCwgbGFuZXMpIHtcbiAgICB2YXIga2V5ID0gZWxlbWVudC5rZXk7XG4gICAgdmFyIGNoaWxkID0gY3VycmVudEZpcnN0Q2hpbGQ7XG5cbiAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRPRE86IElmIGtleSA9PT0gbnVsbCBhbmQgY2hpbGQua2V5ID09PSBudWxsLCB0aGVuIHRoaXMgb25seSBhcHBsaWVzIHRvXG4gICAgICAvLyB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdC5cbiAgICAgIGlmIChjaGlsZC5rZXkgPT09IGtleSkge1xuICAgICAgICB2YXIgZWxlbWVudFR5cGUgPSBlbGVtZW50LnR5cGU7XG5cbiAgICAgICAgaWYgKGVsZW1lbnRUeXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFKSB7XG4gICAgICAgICAgaWYgKGNoaWxkLnRhZyA9PT0gRnJhZ21lbnQpIHtcbiAgICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZC5zaWJsaW5nKTtcbiAgICAgICAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGNoaWxkLCBlbGVtZW50LnByb3BzLmNoaWxkcmVuKTtcbiAgICAgICAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGV4aXN0aW5nLl9kZWJ1Z1NvdXJjZSA9IGVsZW1lbnQuX3NvdXJjZTtcbiAgICAgICAgICAgICAgZXhpc3RpbmcuX2RlYnVnT3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoY2hpbGQuZWxlbWVudFR5cGUgPT09IGVsZW1lbnRUeXBlIHx8ICggLy8gS2VlcCB0aGlzIGNoZWNrIGlubGluZSBzbyBpdCBvbmx5IHJ1bnMgb24gdGhlIGZhbHNlIHBhdGg6XG4gICAgICAgICAgIGlzQ29tcGF0aWJsZUZhbWlseUZvckhvdFJlbG9hZGluZyhjaGlsZCwgZWxlbWVudCkgKSB8fCAvLyBMYXp5IHR5cGVzIHNob3VsZCByZWNvbmNpbGUgdGhlaXIgcmVzb2x2ZWQgdHlwZS5cbiAgICAgICAgICAvLyBXZSBuZWVkIHRvIGRvIHRoaXMgYWZ0ZXIgdGhlIEhvdCBSZWxvYWRpbmcgY2hlY2sgYWJvdmUsXG4gICAgICAgICAgLy8gYmVjYXVzZSBob3QgcmVsb2FkaW5nIGhhcyBkaWZmZXJlbnQgc2VtYW50aWNzIHRoYW4gcHJvZCBiZWNhdXNlXG4gICAgICAgICAgLy8gaXQgZG9lc24ndCByZXN1c3BlbmQuIFNvIHdlIGNhbid0IGxldCB0aGUgY2FsbCBiZWxvdyBzdXNwZW5kLlxuICAgICAgICAgIHR5cGVvZiBlbGVtZW50VHlwZSA9PT0gJ29iamVjdCcgJiYgZWxlbWVudFR5cGUgIT09IG51bGwgJiYgZWxlbWVudFR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSAmJiByZXNvbHZlTGF6eShlbGVtZW50VHlwZSkgPT09IGNoaWxkLnR5cGUpIHtcbiAgICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZC5zaWJsaW5nKTtcblxuICAgICAgICAgICAgdmFyIF9leGlzdGluZyA9IHVzZUZpYmVyKGNoaWxkLCBlbGVtZW50LnByb3BzKTtcblxuICAgICAgICAgICAgX2V4aXN0aW5nLnJlZiA9IGNvZXJjZVJlZihyZXR1cm5GaWJlciwgY2hpbGQsIGVsZW1lbnQpO1xuICAgICAgICAgICAgX2V4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIF9leGlzdGluZy5fZGVidWdTb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7XG4gICAgICAgICAgICAgIF9leGlzdGluZy5fZGVidWdPd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gX2V4aXN0aW5nO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBEaWRuJ3QgbWF0Y2guXG5cblxuICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudC50eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFKSB7XG4gICAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGVsZW1lbnQucHJvcHMuY2hpbGRyZW4sIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzLCBlbGVtZW50LmtleSk7XG4gICAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBfY3JlYXRlZDQgPSBjcmVhdGVGaWJlckZyb21FbGVtZW50KGVsZW1lbnQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcblxuICAgICAgX2NyZWF0ZWQ0LnJlZiA9IGNvZXJjZVJlZihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIGVsZW1lbnQpO1xuICAgICAgX2NyZWF0ZWQ0LnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIF9jcmVhdGVkNDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWNvbmNpbGVTaW5nbGVQb3J0YWwocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBwb3J0YWwsIGxhbmVzKSB7XG4gICAgdmFyIGtleSA9IHBvcnRhbC5rZXk7XG4gICAgdmFyIGNoaWxkID0gY3VycmVudEZpcnN0Q2hpbGQ7XG5cbiAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRPRE86IElmIGtleSA9PT0gbnVsbCBhbmQgY2hpbGQua2V5ID09PSBudWxsLCB0aGVuIHRoaXMgb25seSBhcHBsaWVzIHRvXG4gICAgICAvLyB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdC5cbiAgICAgIGlmIChjaGlsZC5rZXkgPT09IGtleSkge1xuICAgICAgICBpZiAoY2hpbGQudGFnID09PSBIb3N0UG9ydGFsICYmIGNoaWxkLnN0YXRlTm9kZS5jb250YWluZXJJbmZvID09PSBwb3J0YWwuY29udGFpbmVySW5mbyAmJiBjaGlsZC5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb24gPT09IHBvcnRhbC5pbXBsZW1lbnRhdGlvbikge1xuICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZC5zaWJsaW5nKTtcbiAgICAgICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjaGlsZCwgcG9ydGFsLmNoaWxkcmVuIHx8IFtdKTtcbiAgICAgICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgIH1cblxuICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICAgIH1cblxuICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tUG9ydGFsKHBvcnRhbCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgcmV0dXJuIGNyZWF0ZWQ7XG4gIH0gLy8gVGhpcyBBUEkgd2lsbCB0YWcgdGhlIGNoaWxkcmVuIHdpdGggdGhlIHNpZGUtZWZmZWN0IG9mIHRoZSByZWNvbmNpbGlhdGlvblxuICAvLyBpdHNlbGYuIFRoZXkgd2lsbCBiZSBhZGRlZCB0byB0aGUgc2lkZS1lZmZlY3QgbGlzdCBhcyB3ZSBwYXNzIHRocm91Z2ggdGhlXG4gIC8vIGNoaWxkcmVuIGFuZCB0aGUgcGFyZW50LlxuXG5cbiAgZnVuY3Rpb24gcmVjb25jaWxlQ2hpbGRGaWJlcnMocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZCwgbGFuZXMpIHtcbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG5vdCByZWN1cnNpdmUuXG4gICAgLy8gSWYgdGhlIHRvcCBsZXZlbCBpdGVtIGlzIGFuIGFycmF5LCB3ZSB0cmVhdCBpdCBhcyBhIHNldCBvZiBjaGlsZHJlbixcbiAgICAvLyBub3QgYXMgYSBmcmFnbWVudC4gTmVzdGVkIGFycmF5cyBvbiB0aGUgb3RoZXIgaGFuZCB3aWxsIGJlIHRyZWF0ZWQgYXNcbiAgICAvLyBmcmFnbWVudCBub2Rlcy4gUmVjdXJzaW9uIGhhcHBlbnMgYXQgdGhlIG5vcm1hbCBmbG93LlxuICAgIC8vIEhhbmRsZSB0b3AgbGV2ZWwgdW5rZXllZCBmcmFnbWVudHMgYXMgaWYgdGhleSB3ZXJlIGFycmF5cy5cbiAgICAvLyBUaGlzIGxlYWRzIHRvIGFuIGFtYmlndWl0eSBiZXR3ZWVuIDw+e1suLi5dfTwvPiBhbmQgPD4uLi48Lz4uXG4gICAgLy8gV2UgdHJlYXQgdGhlIGFtYmlndW91cyBjYXNlcyBhYm92ZSB0aGUgc2FtZS5cbiAgICB2YXIgaXNVbmtleWVkVG9wTGV2ZWxGcmFnbWVudCA9IHR5cGVvZiBuZXdDaGlsZCA9PT0gJ29iamVjdCcgJiYgbmV3Q2hpbGQgIT09IG51bGwgJiYgbmV3Q2hpbGQudHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSAmJiBuZXdDaGlsZC5rZXkgPT09IG51bGw7XG5cbiAgICBpZiAoaXNVbmtleWVkVG9wTGV2ZWxGcmFnbWVudCkge1xuICAgICAgbmV3Q2hpbGQgPSBuZXdDaGlsZC5wcm9wcy5jaGlsZHJlbjtcbiAgICB9IC8vIEhhbmRsZSBvYmplY3QgdHlwZXNcblxuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ29iamVjdCcgJiYgbmV3Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIHBsYWNlU2luZ2xlQ2hpbGQocmVjb25jaWxlU2luZ2xlRWxlbWVudChyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkLCBsYW5lcykpO1xuXG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIHBsYWNlU2luZ2xlQ2hpbGQocmVjb25jaWxlU2luZ2xlUG9ydGFsKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKSk7XG5cbiAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBuZXdDaGlsZC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IG5ld0NoaWxkLl9pbml0OyAvLyBUT0RPOiBUaGlzIGZ1bmN0aW9uIGlzIHN1cHBvc2VkIHRvIGJlIG5vbi1yZWN1cnNpdmUuXG5cbiAgICAgICAgICByZXR1cm4gcmVjb25jaWxlQ2hpbGRGaWJlcnMocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBpbml0KHBheWxvYWQpLCBsYW5lcyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0FycmF5KG5ld0NoaWxkKSkge1xuICAgICAgICByZXR1cm4gcmVjb25jaWxlQ2hpbGRyZW5BcnJheShyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChnZXRJdGVyYXRvckZuKG5ld0NoaWxkKSkge1xuICAgICAgICByZXR1cm4gcmVjb25jaWxlQ2hpbGRyZW5JdGVyYXRvcihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgICB9XG5cbiAgICAgIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdzdHJpbmcnICYmIG5ld0NoaWxkICE9PSAnJyB8fCB0eXBlb2YgbmV3Q2hpbGQgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gcGxhY2VTaW5nbGVDaGlsZChyZWNvbmNpbGVTaW5nbGVUZXh0Tm9kZShyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsICcnICsgbmV3Q2hpbGQsIGxhbmVzKSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3YXJuT25GdW5jdGlvblR5cGUocmV0dXJuRmliZXIpO1xuICAgICAgfVxuICAgIH0gLy8gUmVtYWluaW5nIGNhc2VzIGFyZSBhbGwgdHJlYXRlZCBhcyBlbXB0eS5cblxuXG4gICAgcmV0dXJuIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCk7XG4gIH1cblxuICByZXR1cm4gcmVjb25jaWxlQ2hpbGRGaWJlcnM7XG59XG5cbnZhciByZWNvbmNpbGVDaGlsZEZpYmVycyA9IENoaWxkUmVjb25jaWxlcih0cnVlKTtcbnZhciBtb3VudENoaWxkRmliZXJzID0gQ2hpbGRSZWNvbmNpbGVyKGZhbHNlKTtcbmZ1bmN0aW9uIGNsb25lQ2hpbGRGaWJlcnMoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgd29ya0luUHJvZ3Jlc3MuY2hpbGQgIT09IGN1cnJlbnQuY2hpbGQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jlc3VtaW5nIHdvcmsgbm90IHlldCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9PT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBjdXJyZW50Q2hpbGQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgdmFyIG5ld0NoaWxkID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudENoaWxkLCBjdXJyZW50Q2hpbGQucGVuZGluZ1Byb3BzKTtcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBuZXdDaGlsZDtcbiAgbmV3Q2hpbGQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG5cbiAgd2hpbGUgKGN1cnJlbnRDaGlsZC5zaWJsaW5nICE9PSBudWxsKSB7XG4gICAgY3VycmVudENoaWxkID0gY3VycmVudENoaWxkLnNpYmxpbmc7XG4gICAgbmV3Q2hpbGQgPSBuZXdDaGlsZC5zaWJsaW5nID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudENoaWxkLCBjdXJyZW50Q2hpbGQucGVuZGluZ1Byb3BzKTtcbiAgICBuZXdDaGlsZC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgfVxuXG4gIG5ld0NoaWxkLnNpYmxpbmcgPSBudWxsO1xufSAvLyBSZXNldCBhIHdvcmtJblByb2dyZXNzIGNoaWxkIHNldCB0byBwcmVwYXJlIGl0IGZvciBhIHNlY29uZCBwYXNzLlxuXG5mdW5jdGlvbiByZXNldENoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBsYW5lcykge1xuICB2YXIgY2hpbGQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICByZXNldFdvcmtJblByb2dyZXNzKGNoaWxkLCBsYW5lcyk7XG4gICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICB9XG59XG5cbnZhciB2YWx1ZUN1cnNvciA9IGNyZWF0ZUN1cnNvcihudWxsKTtcbnZhciByZW5kZXJlclNpZ2lsO1xuXG57XG4gIC8vIFVzZSB0aGlzIHRvIGRldGVjdCBtdWx0aXBsZSByZW5kZXJlcnMgdXNpbmcgdGhlIHNhbWUgY29udGV4dFxuICByZW5kZXJlclNpZ2lsID0ge307XG59XG5cbnZhciBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9IG51bGw7XG52YXIgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gbnVsbDtcbnZhciBsYXN0RnVsbHlPYnNlcnZlZENvbnRleHQgPSBudWxsO1xudmFyIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSBmYWxzZTtcbmZ1bmN0aW9uIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpIHtcbiAgLy8gVGhpcyBpcyBjYWxsZWQgcmlnaHQgYmVmb3JlIFJlYWN0IHlpZWxkcyBleGVjdXRpb24sIHRvIGVuc3VyZSBgcmVhZENvbnRleHRgXG4gIC8vIGNhbm5vdCBiZSBjYWxsZWQgb3V0c2lkZSB0aGUgcmVuZGVyIHBoYXNlLlxuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9IG51bGw7XG4gIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IG51bGw7XG4gIGxhc3RGdWxseU9ic2VydmVkQ29udGV4dCA9IG51bGw7XG5cbiAge1xuICAgIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gZW50ZXJEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpIHtcbiAge1xuICAgIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSB0cnVlO1xuICB9XG59XG5mdW5jdGlvbiBleGl0RGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKSB7XG4gIHtcbiAgICBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIHB1c2hQcm92aWRlcihwcm92aWRlckZpYmVyLCBjb250ZXh0LCBuZXh0VmFsdWUpIHtcbiAge1xuICAgIHB1c2godmFsdWVDdXJzb3IsIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSwgcHJvdmlkZXJGaWJlcik7XG4gICAgY29udGV4dC5fY3VycmVudFZhbHVlID0gbmV4dFZhbHVlO1xuXG4gICAge1xuICAgICAgaWYgKGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciAhPT0gdW5kZWZpbmVkICYmIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciAhPT0gbnVsbCAmJiBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgIT09IHJlbmRlcmVyU2lnaWwpIHtcbiAgICAgICAgZXJyb3IoJ0RldGVjdGVkIG11bHRpcGxlIHJlbmRlcmVycyBjb25jdXJyZW50bHkgcmVuZGVyaW5nIHRoZSAnICsgJ3NhbWUgY29udGV4dCBwcm92aWRlci4gVGhpcyBpcyBjdXJyZW50bHkgdW5zdXBwb3J0ZWQuJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciA9IHJlbmRlcmVyU2lnaWw7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBwb3BQcm92aWRlcihjb250ZXh0LCBwcm92aWRlckZpYmVyKSB7XG4gIHZhciBjdXJyZW50VmFsdWUgPSB2YWx1ZUN1cnNvci5jdXJyZW50O1xuICBwb3AodmFsdWVDdXJzb3IsIHByb3ZpZGVyRmliZXIpO1xuXG4gIHtcbiAgICB7XG4gICAgICBjb250ZXh0Ll9jdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWU7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBzY2hlZHVsZUNvbnRleHRXb3JrT25QYXJlbnRQYXRoKHBhcmVudCwgcmVuZGVyTGFuZXMsIHByb3BhZ2F0aW9uUm9vdCkge1xuICAvLyBVcGRhdGUgdGhlIGNoaWxkIGxhbmVzIG9mIGFsbCB0aGUgYW5jZXN0b3JzLCBpbmNsdWRpbmcgdGhlIGFsdGVybmF0ZXMuXG4gIHZhciBub2RlID0gcGFyZW50O1xuXG4gIHdoaWxlIChub2RlICE9PSBudWxsKSB7XG4gICAgdmFyIGFsdGVybmF0ZSA9IG5vZGUuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKCFpc1N1YnNldE9mTGFuZXMobm9kZS5jaGlsZExhbmVzLCByZW5kZXJMYW5lcykpIHtcbiAgICAgIG5vZGUuY2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMobm9kZS5jaGlsZExhbmVzLCByZW5kZXJMYW5lcyk7XG5cbiAgICAgIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgYWx0ZXJuYXRlLmNoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5jaGlsZExhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChhbHRlcm5hdGUgIT09IG51bGwgJiYgIWlzU3Vic2V0T2ZMYW5lcyhhbHRlcm5hdGUuY2hpbGRMYW5lcywgcmVuZGVyTGFuZXMpKSB7XG4gICAgICBhbHRlcm5hdGUuY2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMoYWx0ZXJuYXRlLmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICB9XG5cbiAgICBpZiAobm9kZSA9PT0gcHJvcGFnYXRpb25Sb290KSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gIH1cblxuICB7XG4gICAgaWYgKG5vZGUgIT09IHByb3BhZ2F0aW9uUm9vdCkge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIHRvIGZpbmQgdGhlIHByb3BhZ2F0aW9uIHJvb3Qgd2hlbiBzY2hlZHVsaW5nIGNvbnRleHQgd29yay4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcHJvcGFnYXRlQ29udGV4dENoYW5nZSh3b3JrSW5Qcm9ncmVzcywgY29udGV4dCwgcmVuZGVyTGFuZXMpIHtcbiAge1xuICAgIHByb3BhZ2F0ZUNvbnRleHRDaGFuZ2VfZWFnZXIod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIHJlbmRlckxhbmVzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcm9wYWdhdGVDb250ZXh0Q2hhbmdlX2VhZ2VyKHdvcmtJblByb2dyZXNzLCBjb250ZXh0LCByZW5kZXJMYW5lcykge1xuXG4gIHZhciBmaWJlciA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuXG4gIGlmIChmaWJlciAhPT0gbnVsbCkge1xuICAgIC8vIFNldCB0aGUgcmV0dXJuIHBvaW50ZXIgb2YgdGhlIGNoaWxkIHRvIHRoZSB3b3JrLWluLXByb2dyZXNzIGZpYmVyLlxuICAgIGZpYmVyLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICB9XG5cbiAgd2hpbGUgKGZpYmVyICE9PSBudWxsKSB7XG4gICAgdmFyIG5leHRGaWJlciA9IHZvaWQgMDsgLy8gVmlzaXQgdGhpcyBmaWJlci5cblxuICAgIHZhciBsaXN0ID0gZmliZXIuZGVwZW5kZW5jaWVzO1xuXG4gICAgaWYgKGxpc3QgIT09IG51bGwpIHtcbiAgICAgIG5leHRGaWJlciA9IGZpYmVyLmNoaWxkO1xuICAgICAgdmFyIGRlcGVuZGVuY3kgPSBsaXN0LmZpcnN0Q29udGV4dDtcblxuICAgICAgd2hpbGUgKGRlcGVuZGVuY3kgIT09IG51bGwpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNvbnRleHQgbWF0Y2hlcy5cbiAgICAgICAgaWYgKGRlcGVuZGVuY3kuY29udGV4dCA9PT0gY29udGV4dCkge1xuICAgICAgICAgIC8vIE1hdGNoISBTY2hlZHVsZSBhbiB1cGRhdGUgb24gdGhpcyBmaWJlci5cbiAgICAgICAgICBpZiAoZmliZXIudGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgICAgICAgLy8gU2NoZWR1bGUgYSBmb3JjZSB1cGRhdGUgb24gdGhlIHdvcmstaW4tcHJvZ3Jlc3MuXG4gICAgICAgICAgICB2YXIgbGFuZSA9IHBpY2tBcmJpdHJhcnlMYW5lKHJlbmRlckxhbmVzKTtcbiAgICAgICAgICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoTm9UaW1lc3RhbXAsIGxhbmUpO1xuICAgICAgICAgICAgdXBkYXRlLnRhZyA9IEZvcmNlVXBkYXRlOyAvLyBUT0RPOiBCZWNhdXNlIHdlIGRvbid0IGhhdmUgYSB3b3JrLWluLXByb2dyZXNzLCB0aGlzIHdpbGwgYWRkIHRoZVxuICAgICAgICAgICAgLy8gdXBkYXRlIHRvIHRoZSBjdXJyZW50IGZpYmVyLCB0b28sIHdoaWNoIG1lYW5zIGl0IHdpbGwgcGVyc2lzdCBldmVuIGlmXG4gICAgICAgICAgICAvLyB0aGlzIHJlbmRlciBpcyB0aHJvd24gYXdheS4gU2luY2UgaXQncyBhIHJhY2UgY29uZGl0aW9uLCBub3Qgc3VyZSBpdCdzXG4gICAgICAgICAgICAvLyB3b3J0aCBmaXhpbmcuXG4gICAgICAgICAgICAvLyBJbmxpbmVkIGBlbnF1ZXVlVXBkYXRlYCB0byByZW1vdmUgaW50ZXJsZWF2ZWQgdXBkYXRlIGNoZWNrXG5cbiAgICAgICAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IGZpYmVyLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgICAgICBpZiAodXBkYXRlUXVldWUgPT09IG51bGwpIDsgZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBzaGFyZWRRdWV1ZSA9IHVwZGF0ZVF1ZXVlLnNoYXJlZDtcbiAgICAgICAgICAgICAgdmFyIHBlbmRpbmcgPSBzaGFyZWRRdWV1ZS5wZW5kaW5nO1xuXG4gICAgICAgICAgICAgIGlmIChwZW5kaW5nID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LlxuICAgICAgICAgICAgICAgIHVwZGF0ZS5uZXh0ID0gdXBkYXRlO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHVwZGF0ZS5uZXh0ID0gcGVuZGluZy5uZXh0O1xuICAgICAgICAgICAgICAgIHBlbmRpbmcubmV4dCA9IHVwZGF0ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHNoYXJlZFF1ZXVlLnBlbmRpbmcgPSB1cGRhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZmliZXIubGFuZXMgPSBtZXJnZUxhbmVzKGZpYmVyLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICAgICAgICAgIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGFsdGVybmF0ZS5sYW5lcyA9IG1lcmdlTGFuZXMoYWx0ZXJuYXRlLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2NoZWR1bGVDb250ZXh0V29ya09uUGFyZW50UGF0aChmaWJlci5yZXR1cm4sIHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcyk7IC8vIE1hcmsgdGhlIHVwZGF0ZWQgbGFuZXMgb24gdGhlIGxpc3QsIHRvby5cblxuICAgICAgICAgIGxpc3QubGFuZXMgPSBtZXJnZUxhbmVzKGxpc3QubGFuZXMsIHJlbmRlckxhbmVzKTsgLy8gU2luY2Ugd2UgYWxyZWFkeSBmb3VuZCBhIG1hdGNoLCB3ZSBjYW4gc3RvcCB0cmF2ZXJzaW5nIHRoZVxuICAgICAgICAgIC8vIGRlcGVuZGVuY3kgbGlzdC5cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVwZW5kZW5jeSA9IGRlcGVuZGVuY3kubmV4dDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZpYmVyLnRhZyA9PT0gQ29udGV4dFByb3ZpZGVyKSB7XG4gICAgICAvLyBEb24ndCBzY2FuIGRlZXBlciBpZiB0aGlzIGlzIGEgbWF0Y2hpbmcgcHJvdmlkZXJcbiAgICAgIG5leHRGaWJlciA9IGZpYmVyLnR5cGUgPT09IHdvcmtJblByb2dyZXNzLnR5cGUgPyBudWxsIDogZmliZXIuY2hpbGQ7XG4gICAgfSBlbHNlIGlmIChmaWJlci50YWcgPT09IERlaHlkcmF0ZWRGcmFnbWVudCkge1xuICAgICAgLy8gSWYgYSBkZWh5ZHJhdGVkIHN1c3BlbnNlIGJvdW5kYXJ5IGlzIGluIHRoaXMgc3VidHJlZSwgd2UgZG9uJ3Qga25vd1xuICAgICAgLy8gaWYgaXQgd2lsbCBoYXZlIGFueSBjb250ZXh0IGNvbnN1bWVycyBpbiBpdC4gVGhlIGJlc3Qgd2UgY2FuIGRvIGlzXG4gICAgICAvLyBtYXJrIGl0IGFzIGhhdmluZyB1cGRhdGVzLlxuICAgICAgdmFyIHBhcmVudFN1c3BlbnNlID0gZmliZXIucmV0dXJuO1xuXG4gICAgICBpZiAocGFyZW50U3VzcGVuc2UgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXZSBqdXN0IGNhbWUgZnJvbSBhIHBhcmVudCBzbyB3ZSBtdXN0IGhhdmUgaGFkIGEgcGFyZW50LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICAgICAgfVxuXG4gICAgICBwYXJlbnRTdXNwZW5zZS5sYW5lcyA9IG1lcmdlTGFuZXMocGFyZW50U3VzcGVuc2UubGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICAgIHZhciBfYWx0ZXJuYXRlID0gcGFyZW50U3VzcGVuc2UuYWx0ZXJuYXRlO1xuXG4gICAgICBpZiAoX2FsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICBfYWx0ZXJuYXRlLmxhbmVzID0gbWVyZ2VMYW5lcyhfYWx0ZXJuYXRlLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9IC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBwYXNzaW5nIHRoaXMgZmliZXIgYXMgdGhlIHBhcmVudFxuICAgICAgLy8gYmVjYXVzZSB3ZSB3YW50IHRvIHNjaGVkdWxlIHRoaXMgZmliZXIgYXMgaGF2aW5nIHdvcmtcbiAgICAgIC8vIG9uIGl0cyBjaGlsZHJlbi4gV2UnbGwgdXNlIHRoZSBjaGlsZExhbmVzIG9uXG4gICAgICAvLyB0aGlzIGZpYmVyIHRvIGluZGljYXRlIHRoYXQgYSBjb250ZXh0IGhhcyBjaGFuZ2VkLlxuXG5cbiAgICAgIHNjaGVkdWxlQ29udGV4dFdvcmtPblBhcmVudFBhdGgocGFyZW50U3VzcGVuc2UsIHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBuZXh0RmliZXIgPSBmaWJlci5zaWJsaW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUcmF2ZXJzZSBkb3duLlxuICAgICAgbmV4dEZpYmVyID0gZmliZXIuY2hpbGQ7XG4gICAgfVxuXG4gICAgaWYgKG5leHRGaWJlciAhPT0gbnVsbCkge1xuICAgICAgLy8gU2V0IHRoZSByZXR1cm4gcG9pbnRlciBvZiB0aGUgY2hpbGQgdG8gdGhlIHdvcmstaW4tcHJvZ3Jlc3MgZmliZXIuXG4gICAgICBuZXh0RmliZXIucmV0dXJuID0gZmliZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIGNoaWxkLiBUcmF2ZXJzZSB0byBuZXh0IHNpYmxpbmcuXG4gICAgICBuZXh0RmliZXIgPSBmaWJlcjtcblxuICAgICAgd2hpbGUgKG5leHRGaWJlciAhPT0gbnVsbCkge1xuICAgICAgICBpZiAobmV4dEZpYmVyID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICAgIC8vIFdlJ3JlIGJhY2sgdG8gdGhlIHJvb3Qgb2YgdGhpcyBzdWJ0cmVlLiBFeGl0LlxuICAgICAgICAgIG5leHRGaWJlciA9IG51bGw7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2libGluZyA9IG5leHRGaWJlci5zaWJsaW5nO1xuXG4gICAgICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gU2V0IHRoZSByZXR1cm4gcG9pbnRlciBvZiB0aGUgc2libGluZyB0byB0aGUgd29yay1pbi1wcm9ncmVzcyBmaWJlci5cbiAgICAgICAgICBzaWJsaW5nLnJldHVybiA9IG5leHRGaWJlci5yZXR1cm47XG4gICAgICAgICAgbmV4dEZpYmVyID0gc2libGluZztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSAvLyBObyBtb3JlIHNpYmxpbmdzLiBUcmF2ZXJzZSB1cC5cblxuXG4gICAgICAgIG5leHRGaWJlciA9IG5leHRGaWJlci5yZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmliZXIgPSBuZXh0RmliZXI7XG4gIH1cbn1cbmZ1bmN0aW9uIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9IHdvcmtJblByb2dyZXNzO1xuICBsYXN0Q29udGV4dERlcGVuZGVuY3kgPSBudWxsO1xuICBsYXN0RnVsbHlPYnNlcnZlZENvbnRleHQgPSBudWxsO1xuICB2YXIgZGVwZW5kZW5jaWVzID0gd29ya0luUHJvZ3Jlc3MuZGVwZW5kZW5jaWVzO1xuXG4gIGlmIChkZXBlbmRlbmNpZXMgIT09IG51bGwpIHtcbiAgICB7XG4gICAgICB2YXIgZmlyc3RDb250ZXh0ID0gZGVwZW5kZW5jaWVzLmZpcnN0Q29udGV4dDtcblxuICAgICAgaWYgKGZpcnN0Q29udGV4dCAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoaW5jbHVkZXNTb21lTGFuZShkZXBlbmRlbmNpZXMubGFuZXMsIHJlbmRlckxhbmVzKSkge1xuICAgICAgICAgIC8vIENvbnRleHQgbGlzdCBoYXMgYSBwZW5kaW5nIHVwZGF0ZS4gTWFyayB0aGF0IHRoaXMgZmliZXIgcGVyZm9ybWVkIHdvcmsuXG4gICAgICAgICAgbWFya1dvcmtJblByb2dyZXNzUmVjZWl2ZWRVcGRhdGUoKTtcbiAgICAgICAgfSAvLyBSZXNldCB0aGUgd29yay1pbi1wcm9ncmVzcyBsaXN0XG5cblxuICAgICAgICBkZXBlbmRlbmNpZXMuZmlyc3RDb250ZXh0ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHJlYWRDb250ZXh0KGNvbnRleHQpIHtcbiAge1xuICAgIC8vIFRoaXMgd2FybmluZyB3b3VsZCBmaXJlIGlmIHlvdSByZWFkIGNvbnRleHQgaW5zaWRlIGEgSG9vayBsaWtlIHVzZU1lbW8uXG4gICAgLy8gVW5saWtlIHRoZSBjbGFzcyBjaGVjayBiZWxvdywgaXQncyBub3QgZW5mb3JjZWQgaW4gcHJvZHVjdGlvbiBmb3IgcGVyZi5cbiAgICBpZiAoaXNEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVikge1xuICAgICAgZXJyb3IoJ0NvbnRleHQgY2FuIG9ubHkgYmUgcmVhZCB3aGlsZSBSZWFjdCBpcyByZW5kZXJpbmcuICcgKyAnSW4gY2xhc3NlcywgeW91IGNhbiByZWFkIGl0IGluIHRoZSByZW5kZXIgbWV0aG9kIG9yIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gJyArICdJbiBmdW5jdGlvbiBjb21wb25lbnRzLCB5b3UgY2FuIHJlYWQgaXQgZGlyZWN0bHkgaW4gdGhlIGZ1bmN0aW9uIGJvZHksIGJ1dCBub3QgJyArICdpbnNpZGUgSG9va3MgbGlrZSB1c2VSZWR1Y2VyKCkgb3IgdXNlTWVtbygpLicpO1xuICAgIH1cbiAgfVxuXG4gIHZhciB2YWx1ZSA9ICBjb250ZXh0Ll9jdXJyZW50VmFsdWUgO1xuXG4gIGlmIChsYXN0RnVsbHlPYnNlcnZlZENvbnRleHQgPT09IGNvbnRleHQpIDsgZWxzZSB7XG4gICAgdmFyIGNvbnRleHRJdGVtID0ge1xuICAgICAgY29udGV4dDogY29udGV4dCxcbiAgICAgIG1lbW9pemVkVmFsdWU6IHZhbHVlLFxuICAgICAgbmV4dDogbnVsbFxuICAgIH07XG5cbiAgICBpZiAobGFzdENvbnRleHREZXBlbmRlbmN5ID09PSBudWxsKSB7XG4gICAgICBpZiAoY3VycmVudGx5UmVuZGVyaW5nRmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb250ZXh0IGNhbiBvbmx5IGJlIHJlYWQgd2hpbGUgUmVhY3QgaXMgcmVuZGVyaW5nLiAnICsgJ0luIGNsYXNzZXMsIHlvdSBjYW4gcmVhZCBpdCBpbiB0aGUgcmVuZGVyIG1ldGhvZCBvciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuICcgKyAnSW4gZnVuY3Rpb24gY29tcG9uZW50cywgeW91IGNhbiByZWFkIGl0IGRpcmVjdGx5IGluIHRoZSBmdW5jdGlvbiBib2R5LCBidXQgbm90ICcgKyAnaW5zaWRlIEhvb2tzIGxpa2UgdXNlUmVkdWNlcigpIG9yIHVzZU1lbW8oKS4nKTtcbiAgICAgIH0gLy8gVGhpcyBpcyB0aGUgZmlyc3QgZGVwZW5kZW5jeSBmb3IgdGhpcyBjb21wb25lbnQuIENyZWF0ZSBhIG5ldyBsaXN0LlxuXG5cbiAgICAgIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IGNvbnRleHRJdGVtO1xuICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIuZGVwZW5kZW5jaWVzID0ge1xuICAgICAgICBsYW5lczogTm9MYW5lcyxcbiAgICAgICAgZmlyc3RDb250ZXh0OiBjb250ZXh0SXRlbVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQXBwZW5kIGEgbmV3IGNvbnRleHQgaXRlbS5cbiAgICAgIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IGxhc3RDb250ZXh0RGVwZW5kZW5jeS5uZXh0ID0gY29udGV4dEl0ZW07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vLyByZW5kZXIuIFdoZW4gdGhpcyByZW5kZXIgZXhpdHMsIGVpdGhlciBiZWNhdXNlIGl0IGZpbmlzaGVzIG9yIGJlY2F1c2UgaXQgaXNcbi8vIGludGVycnVwdGVkLCB0aGUgaW50ZXJsZWF2ZWQgdXBkYXRlcyB3aWxsIGJlIHRyYW5zZmVycmVkIG9udG8gdGhlIG1haW4gcGFydFxuLy8gb2YgdGhlIHF1ZXVlLlxuXG52YXIgY29uY3VycmVudFF1ZXVlcyA9IG51bGw7XG5mdW5jdGlvbiBwdXNoQ29uY3VycmVudFVwZGF0ZVF1ZXVlKHF1ZXVlKSB7XG4gIGlmIChjb25jdXJyZW50UXVldWVzID09PSBudWxsKSB7XG4gICAgY29uY3VycmVudFF1ZXVlcyA9IFtxdWV1ZV07XG4gIH0gZWxzZSB7XG4gICAgY29uY3VycmVudFF1ZXVlcy5wdXNoKHF1ZXVlKTtcbiAgfVxufVxuZnVuY3Rpb24gZmluaXNoUXVldWVpbmdDb25jdXJyZW50VXBkYXRlcygpIHtcbiAgLy8gVHJhbnNmZXIgdGhlIGludGVybGVhdmVkIHVwZGF0ZXMgb250byB0aGUgbWFpbiBxdWV1ZS4gRWFjaCBxdWV1ZSBoYXMgYVxuICAvLyBgcGVuZGluZ2AgZmllbGQgYW5kIGFuIGBpbnRlcmxlYXZlZGAgZmllbGQuIFdoZW4gdGhleSBhcmUgbm90IG51bGwsIHRoZXlcbiAgLy8gcG9pbnQgdG8gdGhlIGxhc3Qgbm9kZSBpbiBhIGNpcmN1bGFyIGxpbmtlZCBsaXN0LiBXZSBuZWVkIHRvIGFwcGVuZCB0aGVcbiAgLy8gaW50ZXJsZWF2ZWQgbGlzdCB0byB0aGUgZW5kIG9mIHRoZSBwZW5kaW5nIGxpc3QgYnkgam9pbmluZyB0aGVtIGludG8gYVxuICAvLyBzaW5nbGUsIGNpcmN1bGFyIGxpc3QuXG4gIGlmIChjb25jdXJyZW50UXVldWVzICE9PSBudWxsKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25jdXJyZW50UXVldWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcXVldWUgPSBjb25jdXJyZW50UXVldWVzW2ldO1xuICAgICAgdmFyIGxhc3RJbnRlcmxlYXZlZFVwZGF0ZSA9IHF1ZXVlLmludGVybGVhdmVkO1xuXG4gICAgICBpZiAobGFzdEludGVybGVhdmVkVXBkYXRlICE9PSBudWxsKSB7XG4gICAgICAgIHF1ZXVlLmludGVybGVhdmVkID0gbnVsbDtcbiAgICAgICAgdmFyIGZpcnN0SW50ZXJsZWF2ZWRVcGRhdGUgPSBsYXN0SW50ZXJsZWF2ZWRVcGRhdGUubmV4dDtcbiAgICAgICAgdmFyIGxhc3RQZW5kaW5nVXBkYXRlID0gcXVldWUucGVuZGluZztcblxuICAgICAgICBpZiAobGFzdFBlbmRpbmdVcGRhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgZmlyc3RQZW5kaW5nVXBkYXRlID0gbGFzdFBlbmRpbmdVcGRhdGUubmV4dDtcbiAgICAgICAgICBsYXN0UGVuZGluZ1VwZGF0ZS5uZXh0ID0gZmlyc3RJbnRlcmxlYXZlZFVwZGF0ZTtcbiAgICAgICAgICBsYXN0SW50ZXJsZWF2ZWRVcGRhdGUubmV4dCA9IGZpcnN0UGVuZGluZ1VwZGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHF1ZXVlLnBlbmRpbmcgPSBsYXN0SW50ZXJsZWF2ZWRVcGRhdGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uY3VycmVudFF1ZXVlcyA9IG51bGw7XG4gIH1cbn1cbmZ1bmN0aW9uIGVucXVldWVDb25jdXJyZW50SG9va1VwZGF0ZShmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSkge1xuICB2YXIgaW50ZXJsZWF2ZWQgPSBxdWV1ZS5pbnRlcmxlYXZlZDtcblxuICBpZiAoaW50ZXJsZWF2ZWQgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUuIENyZWF0ZSBhIGNpcmN1bGFyIGxpc3QuXG4gICAgdXBkYXRlLm5leHQgPSB1cGRhdGU7IC8vIEF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgcmVuZGVyLCB0aGlzIHF1ZXVlJ3MgaW50ZXJsZWF2ZWQgdXBkYXRlcyB3aWxsXG4gICAgLy8gYmUgdHJhbnNmZXJyZWQgdG8gdGhlIHBlbmRpbmcgcXVldWUuXG5cbiAgICBwdXNoQ29uY3VycmVudFVwZGF0ZVF1ZXVlKHF1ZXVlKTtcbiAgfSBlbHNlIHtcbiAgICB1cGRhdGUubmV4dCA9IGludGVybGVhdmVkLm5leHQ7XG4gICAgaW50ZXJsZWF2ZWQubmV4dCA9IHVwZGF0ZTtcbiAgfVxuXG4gIHF1ZXVlLmludGVybGVhdmVkID0gdXBkYXRlO1xuICByZXR1cm4gbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3QoZmliZXIsIGxhbmUpO1xufVxuZnVuY3Rpb24gZW5xdWV1ZUNvbmN1cnJlbnRIb29rVXBkYXRlQW5kRWFnZXJseUJhaWxvdXQoZmliZXIsIHF1ZXVlLCB1cGRhdGUsIGxhbmUpIHtcbiAgdmFyIGludGVybGVhdmVkID0gcXVldWUuaW50ZXJsZWF2ZWQ7XG5cbiAgaWYgKGludGVybGVhdmVkID09PSBudWxsKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LlxuICAgIHVwZGF0ZS5uZXh0ID0gdXBkYXRlOyAvLyBBdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHJlbmRlciwgdGhpcyBxdWV1ZSdzIGludGVybGVhdmVkIHVwZGF0ZXMgd2lsbFxuICAgIC8vIGJlIHRyYW5zZmVycmVkIHRvIHRoZSBwZW5kaW5nIHF1ZXVlLlxuXG4gICAgcHVzaENvbmN1cnJlbnRVcGRhdGVRdWV1ZShxdWV1ZSk7XG4gIH0gZWxzZSB7XG4gICAgdXBkYXRlLm5leHQgPSBpbnRlcmxlYXZlZC5uZXh0O1xuICAgIGludGVybGVhdmVkLm5leHQgPSB1cGRhdGU7XG4gIH1cblxuICBxdWV1ZS5pbnRlcmxlYXZlZCA9IHVwZGF0ZTtcbn1cbmZ1bmN0aW9uIGVucXVldWVDb25jdXJyZW50Q2xhc3NVcGRhdGUoZmliZXIsIHF1ZXVlLCB1cGRhdGUsIGxhbmUpIHtcbiAgdmFyIGludGVybGVhdmVkID0gcXVldWUuaW50ZXJsZWF2ZWQ7XG5cbiAgaWYgKGludGVybGVhdmVkID09PSBudWxsKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LlxuICAgIHVwZGF0ZS5uZXh0ID0gdXBkYXRlOyAvLyBBdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHJlbmRlciwgdGhpcyBxdWV1ZSdzIGludGVybGVhdmVkIHVwZGF0ZXMgd2lsbFxuICAgIC8vIGJlIHRyYW5zZmVycmVkIHRvIHRoZSBwZW5kaW5nIHF1ZXVlLlxuXG4gICAgcHVzaENvbmN1cnJlbnRVcGRhdGVRdWV1ZShxdWV1ZSk7XG4gIH0gZWxzZSB7XG4gICAgdXBkYXRlLm5leHQgPSBpbnRlcmxlYXZlZC5uZXh0O1xuICAgIGludGVybGVhdmVkLm5leHQgPSB1cGRhdGU7XG4gIH1cblxuICBxdWV1ZS5pbnRlcmxlYXZlZCA9IHVwZGF0ZTtcbiAgcmV0dXJuIG1hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290KGZpYmVyLCBsYW5lKTtcbn1cbmZ1bmN0aW9uIGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgbGFuZSkge1xuICByZXR1cm4gbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3QoZmliZXIsIGxhbmUpO1xufSAvLyBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gb3V0c2lkZSB0aGlzIG1vZHVsZSBzaG91bGQgb25seSBiZSBkb25lIGZvciBiYWNrd2FyZHNcbi8vIGNvbXBhdGliaWxpdHkgYW5kIHNob3VsZCBhbHdheXMgYmUgYWNjb21wYW5pZWQgYnkgYSB3YXJuaW5nLlxuXG52YXIgdW5zYWZlX21hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290ID0gbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3Q7XG5cbmZ1bmN0aW9uIG1hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290KHNvdXJjZUZpYmVyLCBsYW5lKSB7XG4gIC8vIFVwZGF0ZSB0aGUgc291cmNlIGZpYmVyJ3MgbGFuZXNcbiAgc291cmNlRmliZXIubGFuZXMgPSBtZXJnZUxhbmVzKHNvdXJjZUZpYmVyLmxhbmVzLCBsYW5lKTtcbiAgdmFyIGFsdGVybmF0ZSA9IHNvdXJjZUZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgYWx0ZXJuYXRlLmxhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUubGFuZXMsIGxhbmUpO1xuICB9XG5cbiAge1xuICAgIGlmIChhbHRlcm5hdGUgPT09IG51bGwgJiYgKHNvdXJjZUZpYmVyLmZsYWdzICYgKFBsYWNlbWVudCB8IEh5ZHJhdGluZykpICE9PSBOb0ZsYWdzKSB7XG4gICAgICB3YXJuQWJvdXRVcGRhdGVPbk5vdFlldE1vdW50ZWRGaWJlckluREVWKHNvdXJjZUZpYmVyKTtcbiAgICB9XG4gIH0gLy8gV2FsayB0aGUgcGFyZW50IHBhdGggdG8gdGhlIHJvb3QgYW5kIHVwZGF0ZSB0aGUgY2hpbGQgbGFuZXMuXG5cblxuICB2YXIgbm9kZSA9IHNvdXJjZUZpYmVyO1xuICB2YXIgcGFyZW50ID0gc291cmNlRmliZXIucmV0dXJuO1xuXG4gIHdoaWxlIChwYXJlbnQgIT09IG51bGwpIHtcbiAgICBwYXJlbnQuY2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMocGFyZW50LmNoaWxkTGFuZXMsIGxhbmUpO1xuICAgIGFsdGVybmF0ZSA9IHBhcmVudC5hbHRlcm5hdGU7XG5cbiAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICBhbHRlcm5hdGUuY2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMoYWx0ZXJuYXRlLmNoaWxkTGFuZXMsIGxhbmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB7XG4gICAgICAgIGlmICgocGFyZW50LmZsYWdzICYgKFBsYWNlbWVudCB8IEh5ZHJhdGluZykpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgd2FybkFib3V0VXBkYXRlT25Ob3RZZXRNb3VudGVkRmliZXJJbkRFVihzb3VyY2VGaWJlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBub2RlID0gcGFyZW50O1xuICAgIHBhcmVudCA9IHBhcmVudC5yZXR1cm47XG4gIH1cblxuICBpZiAobm9kZS50YWcgPT09IEhvc3RSb290KSB7XG4gICAgdmFyIHJvb3QgPSBub2RlLnN0YXRlTm9kZTtcbiAgICByZXR1cm4gcm9vdDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG52YXIgVXBkYXRlU3RhdGUgPSAwO1xudmFyIFJlcGxhY2VTdGF0ZSA9IDE7XG52YXIgRm9yY2VVcGRhdGUgPSAyO1xudmFyIENhcHR1cmVVcGRhdGUgPSAzOyAvLyBHbG9iYWwgc3RhdGUgdGhhdCBpcyByZXNldCBhdCB0aGUgYmVnaW5uaW5nIG9mIGNhbGxpbmcgYHByb2Nlc3NVcGRhdGVRdWV1ZWAuXG4vLyBJdCBzaG91bGQgb25seSBiZSByZWFkIHJpZ2h0IGFmdGVyIGNhbGxpbmcgYHByb2Nlc3NVcGRhdGVRdWV1ZWAsIHZpYVxuLy8gYGNoZWNrSGFzRm9yY2VVcGRhdGVBZnRlclByb2Nlc3NpbmdgLlxuXG52YXIgaGFzRm9yY2VVcGRhdGUgPSBmYWxzZTtcbnZhciBkaWRXYXJuVXBkYXRlSW5zaWRlVXBkYXRlO1xudmFyIGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZTtcblxue1xuICBkaWRXYXJuVXBkYXRlSW5zaWRlVXBkYXRlID0gZmFsc2U7XG4gIGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZSA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGluaXRpYWxpemVVcGRhdGVRdWV1ZShmaWJlcikge1xuICB2YXIgcXVldWUgPSB7XG4gICAgYmFzZVN0YXRlOiBmaWJlci5tZW1vaXplZFN0YXRlLFxuICAgIGZpcnN0QmFzZVVwZGF0ZTogbnVsbCxcbiAgICBsYXN0QmFzZVVwZGF0ZTogbnVsbCxcbiAgICBzaGFyZWQ6IHtcbiAgICAgIHBlbmRpbmc6IG51bGwsXG4gICAgICBpbnRlcmxlYXZlZDogbnVsbCxcbiAgICAgIGxhbmVzOiBOb0xhbmVzXG4gICAgfSxcbiAgICBlZmZlY3RzOiBudWxsXG4gIH07XG4gIGZpYmVyLnVwZGF0ZVF1ZXVlID0gcXVldWU7XG59XG5mdW5jdGlvbiBjbG9uZVVwZGF0ZVF1ZXVlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSB7XG4gIC8vIENsb25lIHRoZSB1cGRhdGUgcXVldWUgZnJvbSBjdXJyZW50LiBVbmxlc3MgaXQncyBhbHJlYWR5IGEgY2xvbmUuXG4gIHZhciBxdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuICB2YXIgY3VycmVudFF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTtcblxuICBpZiAocXVldWUgPT09IGN1cnJlbnRRdWV1ZSkge1xuICAgIHZhciBjbG9uZSA9IHtcbiAgICAgIGJhc2VTdGF0ZTogY3VycmVudFF1ZXVlLmJhc2VTdGF0ZSxcbiAgICAgIGZpcnN0QmFzZVVwZGF0ZTogY3VycmVudFF1ZXVlLmZpcnN0QmFzZVVwZGF0ZSxcbiAgICAgIGxhc3RCYXNlVXBkYXRlOiBjdXJyZW50UXVldWUubGFzdEJhc2VVcGRhdGUsXG4gICAgICBzaGFyZWQ6IGN1cnJlbnRRdWV1ZS5zaGFyZWQsXG4gICAgICBlZmZlY3RzOiBjdXJyZW50UXVldWUuZWZmZWN0c1xuICAgIH07XG4gICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBjbG9uZTtcbiAgfVxufVxuZnVuY3Rpb24gY3JlYXRlVXBkYXRlKGV2ZW50VGltZSwgbGFuZSkge1xuICB2YXIgdXBkYXRlID0ge1xuICAgIGV2ZW50VGltZTogZXZlbnRUaW1lLFxuICAgIGxhbmU6IGxhbmUsXG4gICAgdGFnOiBVcGRhdGVTdGF0ZSxcbiAgICBwYXlsb2FkOiBudWxsLFxuICAgIGNhbGxiYWNrOiBudWxsLFxuICAgIG5leHQ6IG51bGxcbiAgfTtcbiAgcmV0dXJuIHVwZGF0ZTtcbn1cbmZ1bmN0aW9uIGVucXVldWVVcGRhdGUoZmliZXIsIHVwZGF0ZSwgbGFuZSkge1xuICB2YXIgdXBkYXRlUXVldWUgPSBmaWJlci51cGRhdGVRdWV1ZTtcblxuICBpZiAodXBkYXRlUXVldWUgPT09IG51bGwpIHtcbiAgICAvLyBPbmx5IG9jY3VycyBpZiB0aGUgZmliZXIgaGFzIGJlZW4gdW5tb3VudGVkLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIHNoYXJlZFF1ZXVlID0gdXBkYXRlUXVldWUuc2hhcmVkO1xuXG4gIHtcbiAgICBpZiAoY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlID09PSBzaGFyZWRRdWV1ZSAmJiAhZGlkV2FyblVwZGF0ZUluc2lkZVVwZGF0ZSkge1xuICAgICAgZXJyb3IoJ0FuIHVwZGF0ZSAoc2V0U3RhdGUsIHJlcGxhY2VTdGF0ZSwgb3IgZm9yY2VVcGRhdGUpIHdhcyBzY2hlZHVsZWQgJyArICdmcm9tIGluc2lkZSBhbiB1cGRhdGUgZnVuY3Rpb24uIFVwZGF0ZSBmdW5jdGlvbnMgc2hvdWxkIGJlIHB1cmUsICcgKyAnd2l0aCB6ZXJvIHNpZGUtZWZmZWN0cy4gQ29uc2lkZXIgdXNpbmcgY29tcG9uZW50RGlkVXBkYXRlIG9yIGEgJyArICdjYWxsYmFjay4nKTtcblxuICAgICAgZGlkV2FyblVwZGF0ZUluc2lkZVVwZGF0ZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKGlzVW5zYWZlQ2xhc3NSZW5kZXJQaGFzZVVwZGF0ZSgpKSB7XG4gICAgLy8gVGhpcyBpcyBhbiB1bnNhZmUgcmVuZGVyIHBoYXNlIHVwZGF0ZS4gQWRkIGRpcmVjdGx5IHRvIHRoZSB1cGRhdGVcbiAgICAvLyBxdWV1ZSBzbyB3ZSBjYW4gcHJvY2VzcyBpdCBpbW1lZGlhdGVseSBkdXJpbmcgdGhlIGN1cnJlbnQgcmVuZGVyLlxuICAgIHZhciBwZW5kaW5nID0gc2hhcmVkUXVldWUucGVuZGluZztcblxuICAgIGlmIChwZW5kaW5nID09PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUuIENyZWF0ZSBhIGNpcmN1bGFyIGxpc3QuXG4gICAgICB1cGRhdGUubmV4dCA9IHVwZGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdXBkYXRlLm5leHQgPSBwZW5kaW5nLm5leHQ7XG4gICAgICBwZW5kaW5nLm5leHQgPSB1cGRhdGU7XG4gICAgfVxuXG4gICAgc2hhcmVkUXVldWUucGVuZGluZyA9IHVwZGF0ZTsgLy8gVXBkYXRlIHRoZSBjaGlsZExhbmVzIGV2ZW4gdGhvdWdoIHdlJ3JlIG1vc3QgbGlrZWx5IGFscmVhZHkgcmVuZGVyaW5nXG4gICAgLy8gdGhpcyBmaWJlci4gVGhpcyBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgaW4gdGhlIGNhc2Ugd2hlcmUgeW91XG4gICAgLy8gdXBkYXRlIGEgZGlmZmVyZW50IGNvbXBvbmVudCBkdXJpbmcgcmVuZGVyIHBoYXNlIHRoYW4gdGhlIG9uZSB0aGF0IGlzXG4gICAgLy8gY3VycmVudGx5IHJlbmRlcmluZ3MgKGEgcGF0dGVybiB0aGF0IGlzIGFjY29tcGFuaWVkIGJ5IGEgd2FybmluZykuXG5cbiAgICByZXR1cm4gdW5zYWZlX21hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290KGZpYmVyLCBsYW5lKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZW5xdWV1ZUNvbmN1cnJlbnRDbGFzc1VwZGF0ZShmaWJlciwgc2hhcmVkUXVldWUsIHVwZGF0ZSwgbGFuZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGVudGFuZ2xlVHJhbnNpdGlvbnMocm9vdCwgZmliZXIsIGxhbmUpIHtcbiAgdmFyIHVwZGF0ZVF1ZXVlID0gZmliZXIudXBkYXRlUXVldWU7XG5cbiAgaWYgKHVwZGF0ZVF1ZXVlID09PSBudWxsKSB7XG4gICAgLy8gT25seSBvY2N1cnMgaWYgdGhlIGZpYmVyIGhhcyBiZWVuIHVubW91bnRlZC5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgc2hhcmVkUXVldWUgPSB1cGRhdGVRdWV1ZS5zaGFyZWQ7XG5cbiAgaWYgKGlzVHJhbnNpdGlvbkxhbmUobGFuZSkpIHtcbiAgICB2YXIgcXVldWVMYW5lcyA9IHNoYXJlZFF1ZXVlLmxhbmVzOyAvLyBJZiBhbnkgZW50YW5nbGVkIGxhbmVzIGFyZSBubyBsb25nZXIgcGVuZGluZyBvbiB0aGUgcm9vdCwgdGhlbiB0aGV5IG11c3RcbiAgICAvLyBoYXZlIGZpbmlzaGVkLiBXZSBjYW4gcmVtb3ZlIHRoZW0gZnJvbSB0aGUgc2hhcmVkIHF1ZXVlLCB3aGljaCByZXByZXNlbnRzXG4gICAgLy8gYSBzdXBlcnNldCBvZiB0aGUgYWN0dWFsbHkgcGVuZGluZyBsYW5lcy4gSW4gc29tZSBjYXNlcyB3ZSBtYXkgZW50YW5nbGVcbiAgICAvLyBtb3JlIHRoYW4gd2UgbmVlZCB0bywgYnV0IHRoYXQncyBPSy4gSW4gZmFjdCBpdCdzIHdvcnNlIGlmIHdlICpkb24ndCpcbiAgICAvLyBlbnRhbmdsZSB3aGVuIHdlIHNob3VsZC5cblxuICAgIHF1ZXVlTGFuZXMgPSBpbnRlcnNlY3RMYW5lcyhxdWV1ZUxhbmVzLCByb290LnBlbmRpbmdMYW5lcyk7IC8vIEVudGFuZ2xlIHRoZSBuZXcgdHJhbnNpdGlvbiBsYW5lIHdpdGggdGhlIG90aGVyIHRyYW5zaXRpb24gbGFuZXMuXG5cbiAgICB2YXIgbmV3UXVldWVMYW5lcyA9IG1lcmdlTGFuZXMocXVldWVMYW5lcywgbGFuZSk7XG4gICAgc2hhcmVkUXVldWUubGFuZXMgPSBuZXdRdWV1ZUxhbmVzOyAvLyBFdmVuIGlmIHF1ZXVlLmxhbmVzIGFscmVhZHkgaW5jbHVkZSBsYW5lLCB3ZSBkb24ndCBrbm93IGZvciBjZXJ0YWluIGlmXG4gICAgLy8gdGhlIGxhbmUgZmluaXNoZWQgc2luY2UgdGhlIGxhc3QgdGltZSB3ZSBlbnRhbmdsZWQgaXQuIFNvIHdlIG5lZWQgdG9cbiAgICAvLyBlbnRhbmdsZSBpdCBhZ2FpbiwganVzdCB0byBiZSBzdXJlLlxuXG4gICAgbWFya1Jvb3RFbnRhbmdsZWQocm9vdCwgbmV3UXVldWVMYW5lcyk7XG4gIH1cbn1cbmZ1bmN0aW9uIGVucXVldWVDYXB0dXJlZFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgY2FwdHVyZWRVcGRhdGUpIHtcbiAgLy8gQ2FwdHVyZWQgdXBkYXRlcyBhcmUgdXBkYXRlcyB0aGF0IGFyZSB0aHJvd24gYnkgYSBjaGlsZCBkdXJpbmcgdGhlIHJlbmRlclxuICAvLyBwaGFzZS4gVGhleSBzaG91bGQgYmUgZGlzY2FyZGVkIGlmIHRoZSByZW5kZXIgaXMgYWJvcnRlZC4gVGhlcmVmb3JlLFxuICAvLyB3ZSBzaG91bGQgb25seSBwdXQgdGhlbSBvbiB0aGUgd29yay1pbi1wcm9ncmVzcyBxdWV1ZSwgbm90IHRoZSBjdXJyZW50IG9uZS5cbiAgdmFyIHF1ZXVlID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWU7IC8vIENoZWNrIGlmIHRoZSB3b3JrLWluLXByb2dyZXNzIHF1ZXVlIGlzIGEgY2xvbmUuXG5cbiAgdmFyIGN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGU7XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICB2YXIgY3VycmVudFF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTtcblxuICAgIGlmIChxdWV1ZSA9PT0gY3VycmVudFF1ZXVlKSB7XG4gICAgICAvLyBUaGUgd29yay1pbi1wcm9ncmVzcyBxdWV1ZSBpcyB0aGUgc2FtZSBhcyBjdXJyZW50LiBUaGlzIGhhcHBlbnMgd2hlblxuICAgICAgLy8gd2UgYmFpbCBvdXQgb24gYSBwYXJlbnQgZmliZXIgdGhhdCB0aGVuIGNhcHR1cmVzIGFuIGVycm9yIHRocm93biBieVxuICAgICAgLy8gYSBjaGlsZC4gU2luY2Ugd2Ugd2FudCB0byBhcHBlbmQgdGhlIHVwZGF0ZSBvbmx5IHRvIHRoZSB3b3JrLWluXG4gICAgICAvLyAtcHJvZ3Jlc3MgcXVldWUsIHdlIG5lZWQgdG8gY2xvbmUgdGhlIHVwZGF0ZXMuIFdlIHVzdWFsbHkgY2xvbmUgZHVyaW5nXG4gICAgICAvLyBwcm9jZXNzVXBkYXRlUXVldWUsIGJ1dCB0aGF0IGRpZG4ndCBoYXBwZW4gaW4gdGhpcyBjYXNlIGJlY2F1c2Ugd2VcbiAgICAgIC8vIHNraXBwZWQgb3ZlciB0aGUgcGFyZW50IHdoZW4gd2UgYmFpbGVkIG91dC5cbiAgICAgIHZhciBuZXdGaXJzdCA9IG51bGw7XG4gICAgICB2YXIgbmV3TGFzdCA9IG51bGw7XG4gICAgICB2YXIgZmlyc3RCYXNlVXBkYXRlID0gcXVldWUuZmlyc3RCYXNlVXBkYXRlO1xuXG4gICAgICBpZiAoZmlyc3RCYXNlVXBkYXRlICE9PSBudWxsKSB7XG4gICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgdXBkYXRlcyBhbmQgY2xvbmUgdGhlbS5cbiAgICAgICAgdmFyIHVwZGF0ZSA9IGZpcnN0QmFzZVVwZGF0ZTtcblxuICAgICAgICBkbyB7XG4gICAgICAgICAgdmFyIGNsb25lID0ge1xuICAgICAgICAgICAgZXZlbnRUaW1lOiB1cGRhdGUuZXZlbnRUaW1lLFxuICAgICAgICAgICAgbGFuZTogdXBkYXRlLmxhbmUsXG4gICAgICAgICAgICB0YWc6IHVwZGF0ZS50YWcsXG4gICAgICAgICAgICBwYXlsb2FkOiB1cGRhdGUucGF5bG9hZCxcbiAgICAgICAgICAgIGNhbGxiYWNrOiB1cGRhdGUuY2FsbGJhY2ssXG4gICAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmIChuZXdMYXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgICBuZXdGaXJzdCA9IG5ld0xhc3QgPSBjbG9uZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3TGFzdC5uZXh0ID0gY2xvbmU7XG4gICAgICAgICAgICBuZXdMYXN0ID0gY2xvbmU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdXBkYXRlID0gdXBkYXRlLm5leHQ7XG4gICAgICAgIH0gd2hpbGUgKHVwZGF0ZSAhPT0gbnVsbCk7IC8vIEFwcGVuZCB0aGUgY2FwdHVyZWQgdXBkYXRlIHRoZSBlbmQgb2YgdGhlIGNsb25lZCBsaXN0LlxuXG5cbiAgICAgICAgaWYgKG5ld0xhc3QgPT09IG51bGwpIHtcbiAgICAgICAgICBuZXdGaXJzdCA9IG5ld0xhc3QgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdMYXN0Lm5leHQgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgICAgICAgICBuZXdMYXN0ID0gY2FwdHVyZWRVcGRhdGU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoZXJlIGFyZSBubyBiYXNlIHVwZGF0ZXMuXG4gICAgICAgIG5ld0ZpcnN0ID0gbmV3TGFzdCA9IGNhcHR1cmVkVXBkYXRlO1xuICAgICAgfVxuXG4gICAgICBxdWV1ZSA9IHtcbiAgICAgICAgYmFzZVN0YXRlOiBjdXJyZW50UXVldWUuYmFzZVN0YXRlLFxuICAgICAgICBmaXJzdEJhc2VVcGRhdGU6IG5ld0ZpcnN0LFxuICAgICAgICBsYXN0QmFzZVVwZGF0ZTogbmV3TGFzdCxcbiAgICAgICAgc2hhcmVkOiBjdXJyZW50UXVldWUuc2hhcmVkLFxuICAgICAgICBlZmZlY3RzOiBjdXJyZW50UXVldWUuZWZmZWN0c1xuICAgICAgfTtcbiAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gcXVldWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9IC8vIEFwcGVuZCB0aGUgdXBkYXRlIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuXG5cblxuICB2YXIgbGFzdEJhc2VVcGRhdGUgPSBxdWV1ZS5sYXN0QmFzZVVwZGF0ZTtcblxuICBpZiAobGFzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICBxdWV1ZS5maXJzdEJhc2VVcGRhdGUgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgfSBlbHNlIHtcbiAgICBsYXN0QmFzZVVwZGF0ZS5uZXh0ID0gY2FwdHVyZWRVcGRhdGU7XG4gIH1cblxuICBxdWV1ZS5sYXN0QmFzZVVwZGF0ZSA9IGNhcHR1cmVkVXBkYXRlO1xufVxuXG5mdW5jdGlvbiBnZXRTdGF0ZUZyb21VcGRhdGUod29ya0luUHJvZ3Jlc3MsIHF1ZXVlLCB1cGRhdGUsIHByZXZTdGF0ZSwgbmV4dFByb3BzLCBpbnN0YW5jZSkge1xuICBzd2l0Y2ggKHVwZGF0ZS50YWcpIHtcbiAgICBjYXNlIFJlcGxhY2VTdGF0ZTpcbiAgICAgIHtcbiAgICAgICAgdmFyIHBheWxvYWQgPSB1cGRhdGUucGF5bG9hZDtcblxuICAgICAgICBpZiAodHlwZW9mIHBheWxvYWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAvLyBVcGRhdGVyIGZ1bmN0aW9uXG4gICAgICAgICAge1xuICAgICAgICAgICAgZW50ZXJEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBuZXh0U3RhdGUgPSBwYXlsb2FkLmNhbGwoaW5zdGFuY2UsIHByZXZTdGF0ZSwgbmV4dFByb3BzKTtcblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkLmNhbGwoaW5zdGFuY2UsIHByZXZTdGF0ZSwgbmV4dFByb3BzKTtcbiAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXhpdERpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG5leHRTdGF0ZTtcbiAgICAgICAgfSAvLyBTdGF0ZSBvYmplY3RcblxuXG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgfVxuXG4gICAgY2FzZSBDYXB0dXJlVXBkYXRlOlxuICAgICAge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IHdvcmtJblByb2dyZXNzLmZsYWdzICYgflNob3VsZENhcHR1cmUgfCBEaWRDYXB0dXJlO1xuICAgICAgfVxuICAgIC8vIEludGVudGlvbmFsIGZhbGx0aHJvdWdoXG5cbiAgICBjYXNlIFVwZGF0ZVN0YXRlOlxuICAgICAge1xuICAgICAgICB2YXIgX3BheWxvYWQgPSB1cGRhdGUucGF5bG9hZDtcbiAgICAgICAgdmFyIHBhcnRpYWxTdGF0ZTtcblxuICAgICAgICBpZiAodHlwZW9mIF9wYXlsb2FkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gVXBkYXRlciBmdW5jdGlvblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGVudGVyRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwYXJ0aWFsU3RhdGUgPSBfcGF5bG9hZC5jYWxsKGluc3RhbmNlLCBwcmV2U3RhdGUsIG5leHRQcm9wcyk7XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgX3BheWxvYWQuY2FsbChpbnN0YW5jZSwgcHJldlN0YXRlLCBuZXh0UHJvcHMpO1xuICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBleGl0RGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUGFydGlhbCBzdGF0ZSBvYmplY3RcbiAgICAgICAgICBwYXJ0aWFsU3RhdGUgPSBfcGF5bG9hZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJ0aWFsU3RhdGUgPT09IG51bGwgfHwgcGFydGlhbFN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBOdWxsIGFuZCB1bmRlZmluZWQgYXJlIHRyZWF0ZWQgYXMgbm8tb3BzLlxuICAgICAgICAgIHJldHVybiBwcmV2U3RhdGU7XG4gICAgICAgIH0gLy8gTWVyZ2UgdGhlIHBhcnRpYWwgc3RhdGUgYW5kIHRoZSBwcmV2aW91cyBzdGF0ZS5cblxuXG4gICAgICAgIHJldHVybiBhc3NpZ24oe30sIHByZXZTdGF0ZSwgcGFydGlhbFN0YXRlKTtcbiAgICAgIH1cblxuICAgIGNhc2UgRm9yY2VVcGRhdGU6XG4gICAgICB7XG4gICAgICAgIGhhc0ZvcmNlVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHByZXZTdGF0ZTtcbiAgICAgIH1cbiAgfVxuXG4gIHJldHVybiBwcmV2U3RhdGU7XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcywgcHJvcHMsIGluc3RhbmNlLCByZW5kZXJMYW5lcykge1xuICAvLyBUaGlzIGlzIGFsd2F5cyBub24tbnVsbCBvbiBhIENsYXNzQ29tcG9uZW50IG9yIEhvc3RSb290XG4gIHZhciBxdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuICBoYXNGb3JjZVVwZGF0ZSA9IGZhbHNlO1xuXG4gIHtcbiAgICBjdXJyZW50bHlQcm9jZXNzaW5nUXVldWUgPSBxdWV1ZS5zaGFyZWQ7XG4gIH1cblxuICB2YXIgZmlyc3RCYXNlVXBkYXRlID0gcXVldWUuZmlyc3RCYXNlVXBkYXRlO1xuICB2YXIgbGFzdEJhc2VVcGRhdGUgPSBxdWV1ZS5sYXN0QmFzZVVwZGF0ZTsgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIHBlbmRpbmcgdXBkYXRlcy4gSWYgc28sIHRyYW5zZmVyIHRoZW0gdG8gdGhlIGJhc2UgcXVldWUuXG5cbiAgdmFyIHBlbmRpbmdRdWV1ZSA9IHF1ZXVlLnNoYXJlZC5wZW5kaW5nO1xuXG4gIGlmIChwZW5kaW5nUXVldWUgIT09IG51bGwpIHtcbiAgICBxdWV1ZS5zaGFyZWQucGVuZGluZyA9IG51bGw7IC8vIFRoZSBwZW5kaW5nIHF1ZXVlIGlzIGNpcmN1bGFyLiBEaXNjb25uZWN0IHRoZSBwb2ludGVyIGJldHdlZW4gZmlyc3RcbiAgICAvLyBhbmQgbGFzdCBzbyB0aGF0IGl0J3Mgbm9uLWNpcmN1bGFyLlxuXG4gICAgdmFyIGxhc3RQZW5kaW5nVXBkYXRlID0gcGVuZGluZ1F1ZXVlO1xuICAgIHZhciBmaXJzdFBlbmRpbmdVcGRhdGUgPSBsYXN0UGVuZGluZ1VwZGF0ZS5uZXh0O1xuICAgIGxhc3RQZW5kaW5nVXBkYXRlLm5leHQgPSBudWxsOyAvLyBBcHBlbmQgcGVuZGluZyB1cGRhdGVzIHRvIGJhc2UgcXVldWVcblxuICAgIGlmIChsYXN0QmFzZVVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgZmlyc3RCYXNlVXBkYXRlID0gZmlyc3RQZW5kaW5nVXBkYXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICBsYXN0QmFzZVVwZGF0ZS5uZXh0ID0gZmlyc3RQZW5kaW5nVXBkYXRlO1xuICAgIH1cblxuICAgIGxhc3RCYXNlVXBkYXRlID0gbGFzdFBlbmRpbmdVcGRhdGU7IC8vIElmIHRoZXJlJ3MgYSBjdXJyZW50IHF1ZXVlLCBhbmQgaXQncyBkaWZmZXJlbnQgZnJvbSB0aGUgYmFzZSBxdWV1ZSwgdGhlblxuICAgIC8vIHdlIG5lZWQgdG8gdHJhbnNmZXIgdGhlIHVwZGF0ZXMgdG8gdGhhdCBxdWV1ZSwgdG9vLiBCZWNhdXNlIHRoZSBiYXNlXG4gICAgLy8gcXVldWUgaXMgYSBzaW5nbHktbGlua2VkIGxpc3Qgd2l0aCBubyBjeWNsZXMsIHdlIGNhbiBhcHBlbmQgdG8gYm90aFxuICAgIC8vIGxpc3RzIGFuZCB0YWtlIGFkdmFudGFnZSBvZiBzdHJ1Y3R1cmFsIHNoYXJpbmcuXG4gICAgLy8gVE9ETzogUGFzcyBgY3VycmVudGAgYXMgYXJndW1lbnRcblxuICAgIHZhciBjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgaXMgYWx3YXlzIG5vbi1udWxsIG9uIGEgQ2xhc3NDb21wb25lbnQgb3IgSG9zdFJvb3RcbiAgICAgIHZhciBjdXJyZW50UXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlO1xuICAgICAgdmFyIGN1cnJlbnRMYXN0QmFzZVVwZGF0ZSA9IGN1cnJlbnRRdWV1ZS5sYXN0QmFzZVVwZGF0ZTtcblxuICAgICAgaWYgKGN1cnJlbnRMYXN0QmFzZVVwZGF0ZSAhPT0gbGFzdEJhc2VVcGRhdGUpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRMYXN0QmFzZVVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGN1cnJlbnRRdWV1ZS5maXJzdEJhc2VVcGRhdGUgPSBmaXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3VycmVudExhc3RCYXNlVXBkYXRlLm5leHQgPSBmaXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50UXVldWUubGFzdEJhc2VVcGRhdGUgPSBsYXN0UGVuZGluZ1VwZGF0ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gVGhlc2UgdmFsdWVzIG1heSBjaGFuZ2UgYXMgd2UgcHJvY2VzcyB0aGUgcXVldWUuXG5cblxuICBpZiAoZmlyc3RCYXNlVXBkYXRlICE9PSBudWxsKSB7XG4gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBsaXN0IG9mIHVwZGF0ZXMgdG8gY29tcHV0ZSB0aGUgcmVzdWx0LlxuICAgIHZhciBuZXdTdGF0ZSA9IHF1ZXVlLmJhc2VTdGF0ZTsgLy8gVE9ETzogRG9uJ3QgbmVlZCB0byBhY2N1bXVsYXRlIHRoaXMuIEluc3RlYWQsIHdlIGNhbiByZW1vdmUgcmVuZGVyTGFuZXNcbiAgICAvLyBmcm9tIHRoZSBvcmlnaW5hbCBsYW5lcy5cblxuICAgIHZhciBuZXdMYW5lcyA9IE5vTGFuZXM7XG4gICAgdmFyIG5ld0Jhc2VTdGF0ZSA9IG51bGw7XG4gICAgdmFyIG5ld0ZpcnN0QmFzZVVwZGF0ZSA9IG51bGw7XG4gICAgdmFyIG5ld0xhc3RCYXNlVXBkYXRlID0gbnVsbDtcbiAgICB2YXIgdXBkYXRlID0gZmlyc3RCYXNlVXBkYXRlO1xuXG4gICAgZG8ge1xuICAgICAgdmFyIHVwZGF0ZUxhbmUgPSB1cGRhdGUubGFuZTtcbiAgICAgIHZhciB1cGRhdGVFdmVudFRpbWUgPSB1cGRhdGUuZXZlbnRUaW1lO1xuXG4gICAgICBpZiAoIWlzU3Vic2V0T2ZMYW5lcyhyZW5kZXJMYW5lcywgdXBkYXRlTGFuZSkpIHtcbiAgICAgICAgLy8gUHJpb3JpdHkgaXMgaW5zdWZmaWNpZW50LiBTa2lwIHRoaXMgdXBkYXRlLiBJZiB0aGlzIGlzIHRoZSBmaXJzdFxuICAgICAgICAvLyBza2lwcGVkIHVwZGF0ZSwgdGhlIHByZXZpb3VzIHVwZGF0ZS9zdGF0ZSBpcyB0aGUgbmV3IGJhc2VcbiAgICAgICAgLy8gdXBkYXRlL3N0YXRlLlxuICAgICAgICB2YXIgY2xvbmUgPSB7XG4gICAgICAgICAgZXZlbnRUaW1lOiB1cGRhdGVFdmVudFRpbWUsXG4gICAgICAgICAgbGFuZTogdXBkYXRlTGFuZSxcbiAgICAgICAgICB0YWc6IHVwZGF0ZS50YWcsXG4gICAgICAgICAgcGF5bG9hZDogdXBkYXRlLnBheWxvYWQsXG4gICAgICAgICAgY2FsbGJhY2s6IHVwZGF0ZS5jYWxsYmFjayxcbiAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKG5ld0xhc3RCYXNlVXBkYXRlID09PSBudWxsKSB7XG4gICAgICAgICAgbmV3Rmlyc3RCYXNlVXBkYXRlID0gbmV3TGFzdEJhc2VVcGRhdGUgPSBjbG9uZTtcbiAgICAgICAgICBuZXdCYXNlU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdMYXN0QmFzZVVwZGF0ZSA9IG5ld0xhc3RCYXNlVXBkYXRlLm5leHQgPSBjbG9uZTtcbiAgICAgICAgfSAvLyBVcGRhdGUgdGhlIHJlbWFpbmluZyBwcmlvcml0eSBpbiB0aGUgcXVldWUuXG5cblxuICAgICAgICBuZXdMYW5lcyA9IG1lcmdlTGFuZXMobmV3TGFuZXMsIHVwZGF0ZUxhbmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyB1cGRhdGUgZG9lcyBoYXZlIHN1ZmZpY2llbnQgcHJpb3JpdHkuXG4gICAgICAgIGlmIChuZXdMYXN0QmFzZVVwZGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBfY2xvbmUgPSB7XG4gICAgICAgICAgICBldmVudFRpbWU6IHVwZGF0ZUV2ZW50VGltZSxcbiAgICAgICAgICAgIC8vIFRoaXMgdXBkYXRlIGlzIGdvaW5nIHRvIGJlIGNvbW1pdHRlZCBzbyB3ZSBuZXZlciB3YW50IHVuY29tbWl0XG4gICAgICAgICAgICAvLyBpdC4gVXNpbmcgTm9MYW5lIHdvcmtzIGJlY2F1c2UgMCBpcyBhIHN1YnNldCBvZiBhbGwgYml0bWFza3MsIHNvXG4gICAgICAgICAgICAvLyB0aGlzIHdpbGwgbmV2ZXIgYmUgc2tpcHBlZCBieSB0aGUgY2hlY2sgYWJvdmUuXG4gICAgICAgICAgICBsYW5lOiBOb0xhbmUsXG4gICAgICAgICAgICB0YWc6IHVwZGF0ZS50YWcsXG4gICAgICAgICAgICBwYXlsb2FkOiB1cGRhdGUucGF5bG9hZCxcbiAgICAgICAgICAgIGNhbGxiYWNrOiB1cGRhdGUuY2FsbGJhY2ssXG4gICAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBuZXdMYXN0QmFzZVVwZGF0ZSA9IG5ld0xhc3RCYXNlVXBkYXRlLm5leHQgPSBfY2xvbmU7XG4gICAgICAgIH0gLy8gUHJvY2VzcyB0aGlzIHVwZGF0ZS5cblxuXG4gICAgICAgIG5ld1N0YXRlID0gZ2V0U3RhdGVGcm9tVXBkYXRlKHdvcmtJblByb2dyZXNzLCBxdWV1ZSwgdXBkYXRlLCBuZXdTdGF0ZSwgcHJvcHMsIGluc3RhbmNlKTtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gdXBkYXRlLmNhbGxiYWNrO1xuXG4gICAgICAgIGlmIChjYWxsYmFjayAhPT0gbnVsbCAmJiAvLyBJZiB0aGUgdXBkYXRlIHdhcyBhbHJlYWR5IGNvbW1pdHRlZCwgd2Ugc2hvdWxkIG5vdCBxdWV1ZSBpdHNcbiAgICAgICAgLy8gY2FsbGJhY2sgYWdhaW4uXG4gICAgICAgIHVwZGF0ZS5sYW5lICE9PSBOb0xhbmUpIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBDYWxsYmFjaztcbiAgICAgICAgICB2YXIgZWZmZWN0cyA9IHF1ZXVlLmVmZmVjdHM7XG5cbiAgICAgICAgICBpZiAoZWZmZWN0cyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcXVldWUuZWZmZWN0cyA9IFt1cGRhdGVdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlZmZlY3RzLnB1c2godXBkYXRlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdXBkYXRlID0gdXBkYXRlLm5leHQ7XG5cbiAgICAgIGlmICh1cGRhdGUgPT09IG51bGwpIHtcbiAgICAgICAgcGVuZGluZ1F1ZXVlID0gcXVldWUuc2hhcmVkLnBlbmRpbmc7XG5cbiAgICAgICAgaWYgKHBlbmRpbmdRdWV1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEFuIHVwZGF0ZSB3YXMgc2NoZWR1bGVkIGZyb20gaW5zaWRlIGEgcmVkdWNlci4gQWRkIHRoZSBuZXdcbiAgICAgICAgICAvLyBwZW5kaW5nIHVwZGF0ZXMgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBhbmQga2VlcCBwcm9jZXNzaW5nLlxuICAgICAgICAgIHZhciBfbGFzdFBlbmRpbmdVcGRhdGUgPSBwZW5kaW5nUXVldWU7IC8vIEludGVudGlvbmFsbHkgdW5zb3VuZC4gUGVuZGluZyB1cGRhdGVzIGZvcm0gYSBjaXJjdWxhciBsaXN0LCBidXQgd2VcbiAgICAgICAgICAvLyB1bnJhdmVsIHRoZW0gd2hlbiB0cmFuc2ZlcnJpbmcgdGhlbSB0byB0aGUgYmFzZSBxdWV1ZS5cblxuICAgICAgICAgIHZhciBfZmlyc3RQZW5kaW5nVXBkYXRlID0gX2xhc3RQZW5kaW5nVXBkYXRlLm5leHQ7XG4gICAgICAgICAgX2xhc3RQZW5kaW5nVXBkYXRlLm5leHQgPSBudWxsO1xuICAgICAgICAgIHVwZGF0ZSA9IF9maXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgICAgcXVldWUubGFzdEJhc2VVcGRhdGUgPSBfbGFzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgICAgcXVldWUuc2hhcmVkLnBlbmRpbmcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSB3aGlsZSAodHJ1ZSk7XG5cbiAgICBpZiAobmV3TGFzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgIG5ld0Jhc2VTdGF0ZSA9IG5ld1N0YXRlO1xuICAgIH1cblxuICAgIHF1ZXVlLmJhc2VTdGF0ZSA9IG5ld0Jhc2VTdGF0ZTtcbiAgICBxdWV1ZS5maXJzdEJhc2VVcGRhdGUgPSBuZXdGaXJzdEJhc2VVcGRhdGU7XG4gICAgcXVldWUubGFzdEJhc2VVcGRhdGUgPSBuZXdMYXN0QmFzZVVwZGF0ZTsgLy8gSW50ZXJsZWF2ZWQgdXBkYXRlcyBhcmUgc3RvcmVkIG9uIGEgc2VwYXJhdGUgcXVldWUuIFdlIGFyZW4ndCBnb2luZyB0b1xuICAgIC8vIHByb2Nlc3MgdGhlbSBkdXJpbmcgdGhpcyByZW5kZXIsIGJ1dCB3ZSBkbyBuZWVkIHRvIHRyYWNrIHdoaWNoIGxhbmVzXG4gICAgLy8gYXJlIHJlbWFpbmluZy5cblxuICAgIHZhciBsYXN0SW50ZXJsZWF2ZWQgPSBxdWV1ZS5zaGFyZWQuaW50ZXJsZWF2ZWQ7XG5cbiAgICBpZiAobGFzdEludGVybGVhdmVkICE9PSBudWxsKSB7XG4gICAgICB2YXIgaW50ZXJsZWF2ZWQgPSBsYXN0SW50ZXJsZWF2ZWQ7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgbmV3TGFuZXMgPSBtZXJnZUxhbmVzKG5ld0xhbmVzLCBpbnRlcmxlYXZlZC5sYW5lKTtcbiAgICAgICAgaW50ZXJsZWF2ZWQgPSBpbnRlcmxlYXZlZC5uZXh0O1xuICAgICAgfSB3aGlsZSAoaW50ZXJsZWF2ZWQgIT09IGxhc3RJbnRlcmxlYXZlZCk7XG4gICAgfSBlbHNlIGlmIChmaXJzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgIC8vIGBxdWV1ZS5sYW5lc2AgaXMgdXNlZCBmb3IgZW50YW5nbGluZyB0cmFuc2l0aW9ucy4gV2UgY2FuIHNldCBpdCBiYWNrIHRvXG4gICAgICAvLyB6ZXJvIG9uY2UgdGhlIHF1ZXVlIGlzIGVtcHR5LlxuICAgICAgcXVldWUuc2hhcmVkLmxhbmVzID0gTm9MYW5lcztcbiAgICB9IC8vIFNldCB0aGUgcmVtYWluaW5nIGV4cGlyYXRpb24gdGltZSB0byBiZSB3aGF0ZXZlciBpcyByZW1haW5pbmcgaW4gdGhlIHF1ZXVlLlxuICAgIC8vIFRoaXMgc2hvdWxkIGJlIGZpbmUgYmVjYXVzZSB0aGUgb25seSB0d28gb3RoZXIgdGhpbmdzIHRoYXQgY29udHJpYnV0ZSB0b1xuICAgIC8vIGV4cGlyYXRpb24gdGltZSBhcmUgcHJvcHMgYW5kIGNvbnRleHQuIFdlJ3JlIGFscmVhZHkgaW4gdGhlIG1pZGRsZSBvZiB0aGVcbiAgICAvLyBiZWdpbiBwaGFzZSBieSB0aGUgdGltZSB3ZSBzdGFydCBwcm9jZXNzaW5nIHRoZSBxdWV1ZSwgc28gd2UndmUgYWxyZWFkeVxuICAgIC8vIGRlYWx0IHdpdGggdGhlIHByb3BzLiBDb250ZXh0IGluIGNvbXBvbmVudHMgdGhhdCBzcGVjaWZ5XG4gICAgLy8gc2hvdWxkQ29tcG9uZW50VXBkYXRlIGlzIHRyaWNreTsgYnV0IHdlJ2xsIGhhdmUgdG8gYWNjb3VudCBmb3JcbiAgICAvLyB0aGF0IHJlZ2FyZGxlc3MuXG5cblxuICAgIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXMobmV3TGFuZXMpO1xuICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbmV3TGFuZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9XG5cbiAge1xuICAgIGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZSA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FsbENhbGxiYWNrKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgcGFzc2VkIGFzIGNhbGxiYWNrLiBFeHBlY3RlZCBhIGZ1bmN0aW9uLiBJbnN0ZWFkICcgKyAoXCJyZWNlaXZlZDogXCIgKyBjYWxsYmFjaykpO1xuICB9XG5cbiAgY2FsbGJhY2suY2FsbChjb250ZXh0KTtcbn1cblxuZnVuY3Rpb24gcmVzZXRIYXNGb3JjZVVwZGF0ZUJlZm9yZVByb2Nlc3NpbmcoKSB7XG4gIGhhc0ZvcmNlVXBkYXRlID0gZmFsc2U7XG59XG5mdW5jdGlvbiBjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkge1xuICByZXR1cm4gaGFzRm9yY2VVcGRhdGU7XG59XG5mdW5jdGlvbiBjb21taXRVcGRhdGVRdWV1ZShmaW5pc2hlZFdvcmssIGZpbmlzaGVkUXVldWUsIGluc3RhbmNlKSB7XG4gIC8vIENvbW1pdCB0aGUgZWZmZWN0c1xuICB2YXIgZWZmZWN0cyA9IGZpbmlzaGVkUXVldWUuZWZmZWN0cztcbiAgZmluaXNoZWRRdWV1ZS5lZmZlY3RzID0gbnVsbDtcblxuICBpZiAoZWZmZWN0cyAhPT0gbnVsbCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWZmZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVmZmVjdCA9IGVmZmVjdHNbaV07XG4gICAgICB2YXIgY2FsbGJhY2sgPSBlZmZlY3QuY2FsbGJhY2s7XG5cbiAgICAgIGlmIChjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAgICBlZmZlY3QuY2FsbGJhY2sgPSBudWxsO1xuICAgICAgICBjYWxsQ2FsbGJhY2soY2FsbGJhY2ssIGluc3RhbmNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIE5PX0NPTlRFWFQgPSB7fTtcbnZhciBjb250ZXh0U3RhY2tDdXJzb3IkMSA9IGNyZWF0ZUN1cnNvcihOT19DT05URVhUKTtcbnZhciBjb250ZXh0RmliZXJTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihOT19DT05URVhUKTtcbnZhciByb290SW5zdGFuY2VTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihOT19DT05URVhUKTtcblxuZnVuY3Rpb24gcmVxdWlyZWRDb250ZXh0KGMpIHtcbiAgaWYgKGMgPT09IE5PX0NPTlRFWFQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGhvc3QgY29udGV4dCB0byBleGlzdC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnICcgKyAnaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgcmV0dXJuIGM7XG59XG5cbmZ1bmN0aW9uIGdldFJvb3RIb3N0Q29udGFpbmVyKCkge1xuICB2YXIgcm9vdEluc3RhbmNlID0gcmVxdWlyZWRDb250ZXh0KHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yLmN1cnJlbnQpO1xuICByZXR1cm4gcm9vdEluc3RhbmNlO1xufVxuXG5mdW5jdGlvbiBwdXNoSG9zdENvbnRhaW5lcihmaWJlciwgbmV4dFJvb3RJbnN0YW5jZSkge1xuICAvLyBQdXNoIGN1cnJlbnQgcm9vdCBpbnN0YW5jZSBvbnRvIHRoZSBzdGFjaztcbiAgLy8gVGhpcyBhbGxvd3MgdXMgdG8gcmVzZXQgcm9vdCB3aGVuIHBvcnRhbHMgYXJlIHBvcHBlZC5cbiAgcHVzaChyb290SW5zdGFuY2VTdGFja0N1cnNvciwgbmV4dFJvb3RJbnN0YW5jZSwgZmliZXIpOyAvLyBUcmFjayB0aGUgY29udGV4dCBhbmQgdGhlIEZpYmVyIHRoYXQgcHJvdmlkZWQgaXQuXG4gIC8vIFRoaXMgZW5hYmxlcyB1cyB0byBwb3Agb25seSBGaWJlcnMgdGhhdCBwcm92aWRlIHVuaXF1ZSBjb250ZXh0cy5cblxuICBwdXNoKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLCBmaWJlciwgZmliZXIpOyAvLyBGaW5hbGx5LCB3ZSBuZWVkIHRvIHB1c2ggdGhlIGhvc3QgY29udGV4dCB0byB0aGUgc3RhY2suXG4gIC8vIEhvd2V2ZXIsIHdlIGNhbid0IGp1c3QgY2FsbCBnZXRSb290SG9zdENvbnRleHQoKSBhbmQgcHVzaCBpdCBiZWNhdXNlXG4gIC8vIHdlJ2QgaGF2ZSBhIGRpZmZlcmVudCBudW1iZXIgb2YgZW50cmllcyBvbiB0aGUgc3RhY2sgZGVwZW5kaW5nIG9uXG4gIC8vIHdoZXRoZXIgZ2V0Um9vdEhvc3RDb250ZXh0KCkgdGhyb3dzIHNvbWV3aGVyZSBpbiByZW5kZXJlciBjb2RlIG9yIG5vdC5cbiAgLy8gU28gd2UgcHVzaCBhbiBlbXB0eSB2YWx1ZSBmaXJzdC4gVGhpcyBsZXRzIHVzIHNhZmVseSB1bndpbmQgb24gZXJyb3JzLlxuXG4gIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yJDEsIE5PX0NPTlRFWFQsIGZpYmVyKTtcbiAgdmFyIG5leHRSb290Q29udGV4dCA9IGdldFJvb3RIb3N0Q29udGV4dChuZXh0Um9vdEluc3RhbmNlKTsgLy8gTm93IHRoYXQgd2Uga25vdyB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgdGhyb3csIHJlcGxhY2UgaXQuXG5cbiAgcG9wKGNvbnRleHRTdGFja0N1cnNvciQxLCBmaWJlcik7XG4gIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yJDEsIG5leHRSb290Q29udGV4dCwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBwb3BIb3N0Q29udGFpbmVyKGZpYmVyKSB7XG4gIHBvcChjb250ZXh0U3RhY2tDdXJzb3IkMSwgZmliZXIpO1xuICBwb3AoY29udGV4dEZpYmVyU3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgcG9wKHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yLCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIGdldEhvc3RDb250ZXh0KCkge1xuICB2YXIgY29udGV4dCA9IHJlcXVpcmVkQ29udGV4dChjb250ZXh0U3RhY2tDdXJzb3IkMS5jdXJyZW50KTtcbiAgcmV0dXJuIGNvbnRleHQ7XG59XG5cbmZ1bmN0aW9uIHB1c2hIb3N0Q29udGV4dChmaWJlcikge1xuICB2YXIgcm9vdEluc3RhbmNlID0gcmVxdWlyZWRDb250ZXh0KHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yLmN1cnJlbnQpO1xuICB2YXIgY29udGV4dCA9IHJlcXVpcmVkQ29udGV4dChjb250ZXh0U3RhY2tDdXJzb3IkMS5jdXJyZW50KTtcbiAgdmFyIG5leHRDb250ZXh0ID0gZ2V0Q2hpbGRIb3N0Q29udGV4dChjb250ZXh0LCBmaWJlci50eXBlKTsgLy8gRG9uJ3QgcHVzaCB0aGlzIEZpYmVyJ3MgY29udGV4dCB1bmxlc3MgaXQncyB1bmlxdWUuXG5cbiAgaWYgKGNvbnRleHQgPT09IG5leHRDb250ZXh0KSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIFRyYWNrIHRoZSBjb250ZXh0IGFuZCB0aGUgRmliZXIgdGhhdCBwcm92aWRlZCBpdC5cbiAgLy8gVGhpcyBlbmFibGVzIHVzIHRvIHBvcCBvbmx5IEZpYmVycyB0aGF0IHByb3ZpZGUgdW5pcXVlIGNvbnRleHRzLlxuXG5cbiAgcHVzaChjb250ZXh0RmliZXJTdGFja0N1cnNvciwgZmliZXIsIGZpYmVyKTtcbiAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IkMSwgbmV4dENvbnRleHQsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gcG9wSG9zdENvbnRleHQoZmliZXIpIHtcbiAgLy8gRG8gbm90IHBvcCB1bmxlc3MgdGhpcyBGaWJlciBwcm92aWRlZCB0aGUgY3VycmVudCBjb250ZXh0LlxuICAvLyBwdXNoSG9zdENvbnRleHQoKSBvbmx5IHB1c2hlcyBGaWJlcnMgdGhhdCBwcm92aWRlIHVuaXF1ZSBjb250ZXh0cy5cbiAgaWYgKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLmN1cnJlbnQgIT09IGZpYmVyKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcG9wKGNvbnRleHRTdGFja0N1cnNvciQxLCBmaWJlcik7XG4gIHBvcChjb250ZXh0RmliZXJTdGFja0N1cnNvciwgZmliZXIpO1xufVxuXG52YXIgRGVmYXVsdFN1c3BlbnNlQ29udGV4dCA9IDA7IC8vIFRoZSBTdXNwZW5zZSBDb250ZXh0IGlzIHNwbGl0IGludG8gdHdvIHBhcnRzLiBUaGUgbG93ZXIgYml0cyBpc1xuLy8gaW5oZXJpdGVkIGRlZXBseSBkb3duIHRoZSBzdWJ0cmVlLiBUaGUgdXBwZXIgYml0cyBvbmx5IGFmZmVjdFxuLy8gdGhpcyBpbW1lZGlhdGUgc3VzcGVuc2UgYm91bmRhcnkgYW5kIGdldHMgcmVzZXQgZWFjaCBuZXdcbi8vIGJvdW5kYXJ5IG9yIHN1c3BlbnNlIGxpc3QuXG5cbnZhciBTdWJ0cmVlU3VzcGVuc2VDb250ZXh0TWFzayA9IDE7IC8vIFN1YnRyZWUgRmxhZ3M6XG4vLyBJbnZpc2libGVQYXJlbnRTdXNwZW5zZUNvbnRleHQgaW5kaWNhdGVzIHRoYXQgb25lIG9mIG91ciBwYXJlbnQgU3VzcGVuc2Vcbi8vIGJvdW5kYXJpZXMgaXMgbm90IGN1cnJlbnRseSBzaG93aW5nIHZpc2libGUgbWFpbiBjb250ZW50LlxuLy8gRWl0aGVyIGJlY2F1c2UgaXQgaXMgYWxyZWFkeSBzaG93aW5nIGEgZmFsbGJhY2sgb3IgaXMgbm90IG1vdW50ZWQgYXQgYWxsLlxuLy8gV2UgY2FuIHVzZSB0aGlzIHRvIGRldGVybWluZSBpZiBpdCBpcyBkZXNpcmFibGUgdG8gdHJpZ2dlciBhIGZhbGxiYWNrIGF0XG4vLyB0aGUgcGFyZW50LiBJZiBub3QsIHRoZW4gd2UgbWlnaHQgbmVlZCB0byB0cmlnZ2VyIHVuZGVzaXJhYmxlIGJvdW5kYXJpZXNcbi8vIGFuZC9vciBzdXNwZW5kIHRoZSBjb21taXQgdG8gYXZvaWQgaGlkaW5nIHRoZSBwYXJlbnQgY29udGVudC5cblxudmFyIEludmlzaWJsZVBhcmVudFN1c3BlbnNlQ29udGV4dCA9IDE7IC8vIFNoYWxsb3cgRmxhZ3M6XG4vLyBGb3JjZVN1c3BlbnNlRmFsbGJhY2sgY2FuIGJlIHVzZWQgYnkgU3VzcGVuc2VMaXN0IHRvIGZvcmNlIG5ld2x5IGFkZGVkXG4vLyBpdGVtcyBpbnRvIHRoZWlyIGZhbGxiYWNrIHN0YXRlIGR1cmluZyBvbmUgb2YgdGhlIHJlbmRlciBwYXNzZXMuXG5cbnZhciBGb3JjZVN1c3BlbnNlRmFsbGJhY2sgPSAyO1xudmFyIHN1c3BlbnNlU3RhY2tDdXJzb3IgPSBjcmVhdGVDdXJzb3IoRGVmYXVsdFN1c3BlbnNlQ29udGV4dCk7XG5mdW5jdGlvbiBoYXNTdXNwZW5zZUNvbnRleHQocGFyZW50Q29udGV4dCwgZmxhZykge1xuICByZXR1cm4gKHBhcmVudENvbnRleHQgJiBmbGFnKSAhPT0gMDtcbn1cbmZ1bmN0aW9uIHNldERlZmF1bHRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHBhcmVudENvbnRleHQpIHtcbiAgcmV0dXJuIHBhcmVudENvbnRleHQgJiBTdWJ0cmVlU3VzcGVuc2VDb250ZXh0TWFzaztcbn1cbmZ1bmN0aW9uIHNldFNoYWxsb3dTdXNwZW5zZUNvbnRleHQocGFyZW50Q29udGV4dCwgc2hhbGxvd0NvbnRleHQpIHtcbiAgcmV0dXJuIHBhcmVudENvbnRleHQgJiBTdWJ0cmVlU3VzcGVuc2VDb250ZXh0TWFzayB8IHNoYWxsb3dDb250ZXh0O1xufVxuZnVuY3Rpb24gYWRkU3VidHJlZVN1c3BlbnNlQ29udGV4dChwYXJlbnRDb250ZXh0LCBzdWJ0cmVlQ29udGV4dCkge1xuICByZXR1cm4gcGFyZW50Q29udGV4dCB8IHN1YnRyZWVDb250ZXh0O1xufVxuZnVuY3Rpb24gcHVzaFN1c3BlbnNlQ29udGV4dChmaWJlciwgbmV3Q29udGV4dCkge1xuICBwdXNoKHN1c3BlbnNlU3RhY2tDdXJzb3IsIG5ld0NvbnRleHQsIGZpYmVyKTtcbn1cbmZ1bmN0aW9uIHBvcFN1c3BlbnNlQ29udGV4dChmaWJlcikge1xuICBwb3Aoc3VzcGVuc2VTdGFja0N1cnNvciwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRDYXB0dXJlU3VzcGVuc2Uod29ya0luUHJvZ3Jlc3MsIGhhc0ludmlzaWJsZVBhcmVudCkge1xuICAvLyBJZiBpdCB3YXMgdGhlIHByaW1hcnkgY2hpbGRyZW4gdGhhdCBqdXN0IHN1c3BlbmRlZCwgY2FwdHVyZSBhbmQgcmVuZGVyIHRoZVxuICAvLyBmYWxsYmFjay4gT3RoZXJ3aXNlLCBkb24ndCBjYXB0dXJlIGFuZCBidWJibGUgdG8gdGhlIG5leHQgYm91bmRhcnkuXG4gIHZhciBuZXh0U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChuZXh0U3RhdGUgIT09IG51bGwpIHtcbiAgICBpZiAobmV4dFN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICAgIC8vIEEgZGVoeWRyYXRlZCBib3VuZGFyeSBhbHdheXMgY2FwdHVyZXMuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgcHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzOyAvLyBSZWd1bGFyIGJvdW5kYXJpZXMgYWx3YXlzIGNhcHR1cmUuXG5cbiAge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIElmIGl0J3MgYSBib3VuZGFyeSB3ZSBzaG91bGQgYXZvaWQsIHRoZW4gd2UgcHJlZmVyIHRvIGJ1YmJsZSB1cCB0byB0aGVcbn1cbmZ1bmN0aW9uIGZpbmRGaXJzdFN1c3BlbmRlZChyb3cpIHtcbiAgdmFyIG5vZGUgPSByb3c7XG5cbiAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICBpZiAobm9kZS50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgICB2YXIgc3RhdGUgPSBub2RlLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgIGlmIChzdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgZGVoeWRyYXRlZCA9IHN0YXRlLmRlaHlkcmF0ZWQ7XG5cbiAgICAgICAgaWYgKGRlaHlkcmF0ZWQgPT09IG51bGwgfHwgaXNTdXNwZW5zZUluc3RhbmNlUGVuZGluZyhkZWh5ZHJhdGVkKSB8fCBpc1N1c3BlbnNlSW5zdGFuY2VGYWxsYmFjayhkZWh5ZHJhdGVkKSkge1xuICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChub2RlLnRhZyA9PT0gU3VzcGVuc2VMaXN0Q29tcG9uZW50ICYmIC8vIHJldmVhbE9yZGVyIHVuZGVmaW5lZCBjYW4ndCBiZSB0cnVzdGVkIGJlY2F1c2UgaXQgZG9uJ3RcbiAgICAvLyBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgaXQgc3VzcGVuZGVkIG9yIG5vdC5cbiAgICBub2RlLm1lbW9pemVkUHJvcHMucmV2ZWFsT3JkZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIGRpZFN1c3BlbmQgPSAobm9kZS5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzO1xuXG4gICAgICBpZiAoZGlkU3VzcGVuZCkge1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUgPT09IHJvdykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSByb3cpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgTm9GbGFncyQxID1cbi8qICAgKi9cbjA7IC8vIFJlcHJlc2VudHMgd2hldGhlciBlZmZlY3Qgc2hvdWxkIGZpcmUuXG5cbnZhciBIYXNFZmZlY3QgPVxuLyogKi9cbjE7IC8vIFJlcHJlc2VudHMgdGhlIHBoYXNlIGluIHdoaWNoIHRoZSBlZmZlY3QgKG5vdCB0aGUgY2xlYW4tdXApIGZpcmVzLlxuXG52YXIgSW5zZXJ0aW9uID1cbi8qICAqL1xuMjtcbnZhciBMYXlvdXQgPVxuLyogICAgKi9cbjQ7XG52YXIgUGFzc2l2ZSQxID1cbi8qICAgKi9cbjg7XG5cbi8vIGFuZCBzaG91bGQgYmUgcmVzZXQgYmVmb3JlIHN0YXJ0aW5nIGEgbmV3IHJlbmRlci5cbi8vIFRoaXMgdHJhY2tzIHdoaWNoIG11dGFibGUgc291cmNlcyBuZWVkIHRvIGJlIHJlc2V0IGFmdGVyIGEgcmVuZGVyLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NTb3VyY2VzID0gW107XG5mdW5jdGlvbiByZXNldFdvcmtJblByb2dyZXNzVmVyc2lvbnMoKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgd29ya0luUHJvZ3Jlc3NTb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG11dGFibGVTb3VyY2UgPSB3b3JrSW5Qcm9ncmVzc1NvdXJjZXNbaV07XG5cbiAgICB7XG4gICAgICBtdXRhYmxlU291cmNlLl93b3JrSW5Qcm9ncmVzc1ZlcnNpb25QcmltYXJ5ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICB3b3JrSW5Qcm9ncmVzc1NvdXJjZXMubGVuZ3RoID0gMDtcbn1cbi8vIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSB2ZXJzaW9uIHVzZWQgZm9yIHNlcnZlciByZW5kZXJpbmcgbWF0Y2hlcyB0aGUgb25lXG4vLyB0aGF0IGlzIGV2ZW50dWFsbHkgcmVhZCBkdXJpbmcgaHlkcmF0aW9uLlxuLy8gSWYgdGhleSBkb24ndCBtYXRjaCB0aGVyZSdzIGEgcG90ZW50aWFsIHRlYXIgYW5kIGEgZnVsbCBkZW9wdCByZW5kZXIgaXMgcmVxdWlyZWQuXG5cbmZ1bmN0aW9uIHJlZ2lzdGVyTXV0YWJsZVNvdXJjZUZvckh5ZHJhdGlvbihyb290LCBtdXRhYmxlU291cmNlKSB7XG4gIHZhciBnZXRWZXJzaW9uID0gbXV0YWJsZVNvdXJjZS5fZ2V0VmVyc2lvbjtcbiAgdmFyIHZlcnNpb24gPSBnZXRWZXJzaW9uKG11dGFibGVTb3VyY2UuX3NvdXJjZSk7IC8vIFRPRE8gQ2xlYXIgdGhpcyBkYXRhIG9uY2UgYWxsIHBlbmRpbmcgaHlkcmF0aW9uIHdvcmsgaXMgZmluaXNoZWQuXG4gIC8vIFJldGFpbmluZyBpdCBmb3JldmVyIG1heSBpbnRlcmZlcmUgd2l0aCBHQy5cblxuICBpZiAocm9vdC5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhID09IG51bGwpIHtcbiAgICByb290Lm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGEgPSBbbXV0YWJsZVNvdXJjZSwgdmVyc2lvbl07XG4gIH0gZWxzZSB7XG4gICAgcm9vdC5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhLnB1c2gobXV0YWJsZVNvdXJjZSwgdmVyc2lvbik7XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsXG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMiA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnO1xudmFyIGRpZFdhcm5BYm91dE1pc21hdGNoZWRIb29rc0ZvckNvbXBvbmVudDtcbnZhciBkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdDtcblxue1xuICBkaWRXYXJuQWJvdXRNaXNtYXRjaGVkSG9va3NGb3JDb21wb25lbnQgPSBuZXcgU2V0KCk7XG59XG5cbi8vIFRoZXNlIGFyZSBzZXQgcmlnaHQgYmVmb3JlIGNhbGxpbmcgdGhlIGNvbXBvbmVudC5cbnZhciByZW5kZXJMYW5lcyA9IE5vTGFuZXM7IC8vIFRoZSB3b3JrLWluLXByb2dyZXNzIGZpYmVyLiBJJ3ZlIG5hbWVkIGl0IGRpZmZlcmVudGx5IHRvIGRpc3Rpbmd1aXNoIGl0IGZyb21cbi8vIHRoZSB3b3JrLWluLXByb2dyZXNzIGhvb2suXG5cbnZhciBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gbnVsbDsgLy8gSG9va3MgYXJlIHN0b3JlZCBhcyBhIGxpbmtlZCBsaXN0IG9uIHRoZSBmaWJlcidzIG1lbW9pemVkU3RhdGUgZmllbGQuIFRoZVxuLy8gY3VycmVudCBob29rIGxpc3QgaXMgdGhlIGxpc3QgdGhhdCBiZWxvbmdzIHRvIHRoZSBjdXJyZW50IGZpYmVyLiBUaGVcbi8vIHdvcmstaW4tcHJvZ3Jlc3MgaG9vayBsaXN0IGlzIGEgbmV3IGxpc3QgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZVxuLy8gd29yay1pbi1wcm9ncmVzcyBmaWJlci5cblxudmFyIGN1cnJlbnRIb29rID0gbnVsbDtcbnZhciB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBudWxsOyAvLyBXaGV0aGVyIGFuIHVwZGF0ZSB3YXMgc2NoZWR1bGVkIGF0IGFueSBwb2ludCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS4gVGhpc1xuLy8gZG9lcyBub3QgZ2V0IHJlc2V0IGlmIHdlIGRvIGFub3RoZXIgcmVuZGVyIHBhc3M7IG9ubHkgd2hlbiB3ZSdyZSBjb21wbGV0ZWx5XG4vLyBmaW5pc2hlZCBldmFsdWF0aW5nIHRoaXMgY29tcG9uZW50LiBUaGlzIGlzIGFuIG9wdGltaXphdGlvbiBzbyB3ZSBrbm93XG4vLyB3aGV0aGVyIHdlIG5lZWQgdG8gY2xlYXIgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgYWZ0ZXIgYSB0aHJvdy5cblxudmFyIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSBmYWxzZTsgLy8gV2hlcmUgYW4gdXBkYXRlIHdhcyBzY2hlZHVsZWQgb25seSBkdXJpbmcgdGhlIGN1cnJlbnQgcmVuZGVyIHBhc3MuIFRoaXNcbi8vIGdldHMgcmVzZXQgYWZ0ZXIgZWFjaCBhdHRlbXB0LlxuLy8gVE9ETzogTWF5YmUgdGhlcmUncyBzb21lIHdheSB0byBjb25zb2xpZGF0ZSB0aGlzIHdpdGhcbi8vIGBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlYC4gT3Igd2l0aCBgbnVtYmVyT2ZSZVJlbmRlcnNgLlxuXG52YXIgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzID0gZmFsc2U7IC8vIENvdW50cyB0aGUgbnVtYmVyIG9mIHVzZUlkIGhvb2tzIGluIHRoaXMgY29tcG9uZW50LlxuXG52YXIgbG9jYWxJZENvdW50ZXIgPSAwOyAvLyBVc2VkIGZvciBpZHMgdGhhdCBhcmUgZ2VuZXJhdGVkIGNvbXBsZXRlbHkgY2xpZW50LXNpZGUgKGkuZS4gbm90IGR1cmluZ1xuLy8gaHlkcmF0aW9uKS4gVGhpcyBjb3VudGVyIGlzIGdsb2JhbCwgc28gY2xpZW50IGlkcyBhcmUgbm90IHN0YWJsZSBhY3Jvc3Ncbi8vIHJlbmRlciBhdHRlbXB0cy5cblxudmFyIGdsb2JhbENsaWVudElkQ291bnRlciA9IDA7XG52YXIgUkVfUkVOREVSX0xJTUlUID0gMjU7IC8vIEluIERFViwgdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBwcmltaXRpdmUgaG9va1xuXG52YXIgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBudWxsOyAvLyBJbiBERVYsIHRoaXMgbGlzdCBlbnN1cmVzIHRoYXQgaG9va3MgYXJlIGNhbGxlZCBpbiB0aGUgc2FtZSBvcmRlciBiZXR3ZWVuIHJlbmRlcnMuXG4vLyBUaGUgbGlzdCBzdG9yZXMgdGhlIG9yZGVyIG9mIGhvb2tzIHVzZWQgZHVyaW5nIHRoZSBpbml0aWFsIHJlbmRlciAobW91bnQpLlxuLy8gU3Vic2VxdWVudCByZW5kZXJzICh1cGRhdGVzKSByZWZlcmVuY2UgdGhpcyBsaXN0LlxuXG52YXIgaG9va1R5cGVzRGV2ID0gbnVsbDtcbnZhciBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xOyAvLyBJbiBERVYsIHRoaXMgdHJhY2tzIHdoZXRoZXIgY3VycmVudGx5IHJlbmRlcmluZyBjb21wb25lbnQgbmVlZHMgdG8gaWdub3JlXG4vLyB0aGUgZGVwZW5kZW5jaWVzIGZvciBIb29rcyB0aGF0IG5lZWQgdGhlbSAoZS5nLiB1c2VFZmZlY3Qgb3IgdXNlTWVtbykuXG4vLyBXaGVuIHRydWUsIHN1Y2ggSG9va3Mgd2lsbCBhbHdheXMgYmUgXCJyZW1vdW50ZWRcIi4gT25seSB1c2VkIGR1cmluZyBob3QgcmVsb2FkLlxuXG52YXIgaWdub3JlUHJldmlvdXNEZXBlbmRlbmNpZXMgPSBmYWxzZTtcblxuZnVuY3Rpb24gbW91bnRIb29rVHlwZXNEZXYoKSB7XG4gIHtcbiAgICB2YXIgaG9va05hbWUgPSBjdXJyZW50SG9va05hbWVJbkRldjtcblxuICAgIGlmIChob29rVHlwZXNEZXYgPT09IG51bGwpIHtcbiAgICAgIGhvb2tUeXBlc0RldiA9IFtob29rTmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGhvb2tUeXBlc0Rldi5wdXNoKGhvb2tOYW1lKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlSG9va1R5cGVzRGV2KCkge1xuICB7XG4gICAgdmFyIGhvb2tOYW1lID0gY3VycmVudEhvb2tOYW1lSW5EZXY7XG5cbiAgICBpZiAoaG9va1R5cGVzRGV2ICE9PSBudWxsKSB7XG4gICAgICBob29rVHlwZXNVcGRhdGVJbmRleERldisrO1xuXG4gICAgICBpZiAoaG9va1R5cGVzRGV2W2hvb2tUeXBlc1VwZGF0ZUluZGV4RGV2XSAhPT0gaG9va05hbWUpIHtcbiAgICAgICAgd2Fybk9uSG9va01pc21hdGNoSW5EZXYoaG9va05hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKSB7XG4gIHtcbiAgICBpZiAoZGVwcyAhPT0gdW5kZWZpbmVkICYmIGRlcHMgIT09IG51bGwgJiYgIWlzQXJyYXkoZGVwcykpIHtcbiAgICAgIC8vIFZlcmlmeSBkZXBzLCBidXQgb25seSBvbiBtb3VudCB0byBhdm9pZCBleHRyYSBjaGVja3MuXG4gICAgICAvLyBJdCdzIHVubGlrZWx5IHRoZWlyIHR5cGUgd291bGQgY2hhbmdlIGFzIHVzdWFsbHkgeW91IGRlZmluZSB0aGVtIGlubGluZS5cbiAgICAgIGVycm9yKCclcyByZWNlaXZlZCBhIGZpbmFsIGFyZ3VtZW50IHRoYXQgaXMgbm90IGFuIGFycmF5IChpbnN0ZWFkLCByZWNlaXZlZCBgJXNgKS4gV2hlbiAnICsgJ3NwZWNpZmllZCwgdGhlIGZpbmFsIGFyZ3VtZW50IG11c3QgYmUgYW4gYXJyYXkuJywgY3VycmVudEhvb2tOYW1lSW5EZXYsIHR5cGVvZiBkZXBzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gd2Fybk9uSG9va01pc21hdGNoSW5EZXYoY3VycmVudEhvb2tOYW1lKSB7XG4gIHtcbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSk7XG5cbiAgICBpZiAoIWRpZFdhcm5BYm91dE1pc21hdGNoZWRIb29rc0ZvckNvbXBvbmVudC5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgIGRpZFdhcm5BYm91dE1pc21hdGNoZWRIb29rc0ZvckNvbXBvbmVudC5hZGQoY29tcG9uZW50TmFtZSk7XG5cbiAgICAgIGlmIChob29rVHlwZXNEZXYgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIHRhYmxlID0gJyc7XG4gICAgICAgIHZhciBzZWNvbmRDb2x1bW5TdGFydCA9IDMwO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2OyBpKyspIHtcbiAgICAgICAgICB2YXIgb2xkSG9va05hbWUgPSBob29rVHlwZXNEZXZbaV07XG4gICAgICAgICAgdmFyIG5ld0hvb2tOYW1lID0gaSA9PT0gaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPyBjdXJyZW50SG9va05hbWUgOiBvbGRIb29rTmFtZTtcbiAgICAgICAgICB2YXIgcm93ID0gaSArIDEgKyBcIi4gXCIgKyBvbGRIb29rTmFtZTsgLy8gRXh0cmEgc3BhY2Ugc28gc2Vjb25kIGNvbHVtbiBsaW5lcyB1cFxuICAgICAgICAgIC8vIGxvbCBAIElFIG5vdCBzdXBwb3J0aW5nIFN0cmluZyNyZXBlYXRcblxuICAgICAgICAgIHdoaWxlIChyb3cubGVuZ3RoIDwgc2Vjb25kQ29sdW1uU3RhcnQpIHtcbiAgICAgICAgICAgIHJvdyArPSAnICc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcm93ICs9IG5ld0hvb2tOYW1lICsgJ1xcbic7XG4gICAgICAgICAgdGFibGUgKz0gcm93O1xuICAgICAgICB9XG5cbiAgICAgICAgZXJyb3IoJ1JlYWN0IGhhcyBkZXRlY3RlZCBhIGNoYW5nZSBpbiB0aGUgb3JkZXIgb2YgSG9va3MgY2FsbGVkIGJ5ICVzLiAnICsgJ1RoaXMgd2lsbCBsZWFkIHRvIGJ1Z3MgYW5kIGVycm9ycyBpZiBub3QgZml4ZWQuICcgKyAnRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlYWQgdGhlIFJ1bGVzIG9mIEhvb2tzOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvcnVsZXMtb2YtaG9va3NcXG5cXG4nICsgJyAgIFByZXZpb3VzIHJlbmRlciAgICAgICAgICAgIE5leHQgcmVuZGVyXFxuJyArICcgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4nICsgJyVzJyArICcgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cXG4nLCBjb21wb25lbnROYW1lLCB0YWJsZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHRocm93SW52YWxpZEhvb2tFcnJvcigpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGhvb2sgY2FsbC4gSG9va3MgY2FuIG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uIGNvbXBvbmVudC4gVGhpcyBjb3VsZCBoYXBwZW4gZm9yJyArICcgb25lIG9mIHRoZSBmb2xsb3dpbmcgcmVhc29uczpcXG4nICsgJzEuIFlvdSBtaWdodCBoYXZlIG1pc21hdGNoaW5nIHZlcnNpb25zIG9mIFJlYWN0IGFuZCB0aGUgcmVuZGVyZXIgKHN1Y2ggYXMgUmVhY3QgRE9NKVxcbicgKyAnMi4gWW91IG1pZ2h0IGJlIGJyZWFraW5nIHRoZSBSdWxlcyBvZiBIb29rc1xcbicgKyAnMy4gWW91IG1pZ2h0IGhhdmUgbW9yZSB0aGFuIG9uZSBjb3B5IG9mIFJlYWN0IGluIHRoZSBzYW1lIGFwcFxcbicgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9pbnZhbGlkLWhvb2stY2FsbCBmb3IgdGlwcyBhYm91dCBob3cgdG8gZGVidWcgYW5kIGZpeCB0aGlzIHByb2JsZW0uJyk7XG59XG5cbmZ1bmN0aW9uIGFyZUhvb2tJbnB1dHNFcXVhbChuZXh0RGVwcywgcHJldkRlcHMpIHtcbiAge1xuICAgIGlmIChpZ25vcmVQcmV2aW91c0RlcGVuZGVuY2llcykge1xuICAgICAgLy8gT25seSB0cnVlIHdoZW4gdGhpcyBjb21wb25lbnQgaXMgYmVpbmcgaG90IHJlbG9hZGVkLlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwcmV2RGVwcyA9PT0gbnVsbCkge1xuICAgIHtcbiAgICAgIGVycm9yKCclcyByZWNlaXZlZCBhIGZpbmFsIGFyZ3VtZW50IGR1cmluZyB0aGlzIHJlbmRlciwgYnV0IG5vdCBkdXJpbmcgJyArICd0aGUgcHJldmlvdXMgcmVuZGVyLiBFdmVuIHRob3VnaCB0aGUgZmluYWwgYXJndW1lbnQgaXMgb3B0aW9uYWwsICcgKyAnaXRzIHR5cGUgY2Fubm90IGNoYW5nZSBiZXR3ZWVuIHJlbmRlcnMuJywgY3VycmVudEhvb2tOYW1lSW5EZXYpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHtcbiAgICAvLyBEb24ndCBib3RoZXIgY29tcGFyaW5nIGxlbmd0aHMgaW4gcHJvZCBiZWNhdXNlIHRoZXNlIGFycmF5cyBzaG91bGQgYmVcbiAgICAvLyBwYXNzZWQgaW5saW5lLlxuICAgIGlmIChuZXh0RGVwcy5sZW5ndGggIT09IHByZXZEZXBzLmxlbmd0aCkge1xuICAgICAgZXJyb3IoJ1RoZSBmaW5hbCBhcmd1bWVudCBwYXNzZWQgdG8gJXMgY2hhbmdlZCBzaXplIGJldHdlZW4gcmVuZGVycy4gVGhlICcgKyAnb3JkZXIgYW5kIHNpemUgb2YgdGhpcyBhcnJheSBtdXN0IHJlbWFpbiBjb25zdGFudC5cXG5cXG4nICsgJ1ByZXZpb3VzOiAlc1xcbicgKyAnSW5jb21pbmc6ICVzJywgY3VycmVudEhvb2tOYW1lSW5EZXYsIFwiW1wiICsgcHJldkRlcHMuam9pbignLCAnKSArIFwiXVwiLCBcIltcIiArIG5leHREZXBzLmpvaW4oJywgJykgKyBcIl1cIik7XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmV2RGVwcy5sZW5ndGggJiYgaSA8IG5leHREZXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKG9iamVjdElzKG5leHREZXBzW2ldLCBwcmV2RGVwc1tpXSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZW5kZXJXaXRoSG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcHJvcHMsIHNlY29uZEFyZywgbmV4dFJlbmRlckxhbmVzKSB7XG4gIHJlbmRlckxhbmVzID0gbmV4dFJlbmRlckxhbmVzO1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gd29ya0luUHJvZ3Jlc3M7XG5cbiAge1xuICAgIGhvb2tUeXBlc0RldiA9IGN1cnJlbnQgIT09IG51bGwgPyBjdXJyZW50Ll9kZWJ1Z0hvb2tUeXBlcyA6IG51bGw7XG4gICAgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPSAtMTsgLy8gVXNlZCBmb3IgaG90IHJlbG9hZGluZzpcblxuICAgIGlnbm9yZVByZXZpb3VzRGVwZW5kZW5jaWVzID0gY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50LnR5cGUgIT09IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gIH1cblxuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IE5vTGFuZXM7IC8vIFRoZSBmb2xsb3dpbmcgc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHJlc2V0XG4gIC8vIGN1cnJlbnRIb29rID0gbnVsbDtcbiAgLy8gd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcbiAgLy8gZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IGZhbHNlO1xuICAvLyBsb2NhbElkQ291bnRlciA9IDA7XG4gIC8vIFRPRE8gV2FybiBpZiBubyBob29rcyBhcmUgdXNlZCBhdCBhbGwgZHVyaW5nIG1vdW50LCB0aGVuIHNvbWUgYXJlIHVzZWQgZHVyaW5nIHVwZGF0ZS5cbiAgLy8gQ3VycmVudGx5IHdlIHdpbGwgaWRlbnRpZnkgdGhlIHVwZGF0ZSByZW5kZXIgYXMgYSBtb3VudCBiZWNhdXNlIG1lbW9pemVkU3RhdGUgPT09IG51bGwuXG4gIC8vIFRoaXMgaXMgdHJpY2t5IGJlY2F1c2UgaXQncyB2YWxpZCBmb3IgY2VydGFpbiB0eXBlcyBvZiBjb21wb25lbnRzIChlLmcuIFJlYWN0LmxhenkpXG4gIC8vIFVzaW5nIG1lbW9pemVkU3RhdGUgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIG1vdW50L3VwZGF0ZSBvbmx5IHdvcmtzIGlmIGF0IGxlYXN0IG9uZSBzdGF0ZWZ1bCBob29rIGlzIHVzZWQuXG4gIC8vIE5vbi1zdGF0ZWZ1bCBob29rcyAoZS5nLiBjb250ZXh0KSBkb24ndCBnZXQgYWRkZWQgdG8gbWVtb2l6ZWRTdGF0ZSxcbiAgLy8gc28gbWVtb2l6ZWRTdGF0ZSB3b3VsZCBiZSBudWxsIGR1cmluZyB1cGRhdGVzIGFuZCBtb3VudHMuXG5cbiAge1xuICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuICAgIH0gZWxzZSBpZiAoaG9va1R5cGVzRGV2ICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGRpc3BhdGNoZXIgaGFuZGxlcyBhbiBlZGdlIGNhc2Ugd2hlcmUgYSBjb21wb25lbnQgaXMgdXBkYXRpbmcsXG4gICAgICAvLyBidXQgbm8gc3RhdGVmdWwgaG9va3MgaGF2ZSBiZWVuIHVzZWQuXG4gICAgICAvLyBXZSB3YW50IHRvIG1hdGNoIHRoZSBwcm9kdWN0aW9uIGNvZGUgYmVoYXZpb3IgKHdoaWNoIHdpbGwgdXNlIEhvb2tzRGlzcGF0Y2hlck9uTW91bnQpLFxuICAgICAgLy8gYnV0IHdpdGggdGhlIGV4dHJhIERFViB2YWxpZGF0aW9uIHRvIGVuc3VyZSBob29rcyBvcmRlcmluZyBoYXNuJ3QgY2hhbmdlZC5cbiAgICAgIC8vIFRoaXMgZGlzcGF0Y2hlciBkb2VzIHRoYXQuXG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEhvb2tzRGlzcGF0Y2hlck9uTW91bnRXaXRoSG9va1R5cGVzSW5ERVY7XG4gICAgfSBlbHNlIHtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjaGlsZHJlbiA9IENvbXBvbmVudChwcm9wcywgc2Vjb25kQXJnKTsgLy8gQ2hlY2sgaWYgdGhlcmUgd2FzIGEgcmVuZGVyIHBoYXNlIHVwZGF0ZVxuXG4gIGlmIChkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MpIHtcbiAgICAvLyBLZWVwIHJlbmRlcmluZyBpbiBhIGxvb3AgZm9yIGFzIGxvbmcgYXMgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgY29udGludWUgdG9cbiAgICAvLyBiZSBzY2hlZHVsZWQuIFVzZSBhIGNvdW50ZXIgdG8gcHJldmVudCBpbmZpbml0ZSBsb29wcy5cbiAgICB2YXIgbnVtYmVyT2ZSZVJlbmRlcnMgPSAwO1xuXG4gICAgZG8ge1xuICAgICAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzID0gZmFsc2U7XG4gICAgICBsb2NhbElkQ291bnRlciA9IDA7XG5cbiAgICAgIGlmIChudW1iZXJPZlJlUmVuZGVycyA+PSBSRV9SRU5ERVJfTElNSVQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb28gbWFueSByZS1yZW5kZXJzLiBSZWFjdCBsaW1pdHMgdGhlIG51bWJlciBvZiByZW5kZXJzIHRvIHByZXZlbnQgJyArICdhbiBpbmZpbml0ZSBsb29wLicpO1xuICAgICAgfVxuXG4gICAgICBudW1iZXJPZlJlUmVuZGVycyArPSAxO1xuXG4gICAgICB7XG4gICAgICAgIC8vIEV2ZW4gd2hlbiBob3QgcmVsb2FkaW5nLCBhbGxvdyBkZXBlbmRlbmNpZXMgdG8gc3RhYmlsaXplXG4gICAgICAgIC8vIGFmdGVyIGZpcnN0IHJlbmRlciB0byBwcmV2ZW50IGluZmluaXRlIHJlbmRlciBwaGFzZSB1cGRhdGVzLlxuICAgICAgICBpZ25vcmVQcmV2aW91c0RlcGVuZGVuY2llcyA9IGZhbHNlO1xuICAgICAgfSAvLyBTdGFydCBvdmVyIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdFxuXG5cbiAgICAgIGN1cnJlbnRIb29rID0gbnVsbDtcbiAgICAgIHdvcmtJblByb2dyZXNzSG9vayA9IG51bGw7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IG51bGw7XG5cbiAgICAgIHtcbiAgICAgICAgLy8gQWxzbyB2YWxpZGF0ZSBob29rIG9yZGVyIGZvciBjYXNjYWRpbmcgdXBkYXRlcy5cbiAgICAgICAgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPSAtMTtcbiAgICAgIH1cblxuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSAgSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWIDtcbiAgICAgIGNoaWxkcmVuID0gQ29tcG9uZW50KHByb3BzLCBzZWNvbmRBcmcpO1xuICAgIH0gd2hpbGUgKGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyk7XG4gIH0gLy8gV2UgY2FuIGFzc3VtZSB0aGUgcHJldmlvdXMgZGlzcGF0Y2hlciBpcyBhbHdheXMgdGhpcyBvbmUsIHNpbmNlIHdlIHNldCBpdFxuICAvLyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZW5kZXIgcGhhc2UgYW5kIHRoZXJlJ3Mgbm8gcmUtZW50cmFuY2UuXG5cblxuICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IENvbnRleHRPbmx5RGlzcGF0Y2hlcjtcblxuICB7XG4gICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnSG9va1R5cGVzID0gaG9va1R5cGVzRGV2O1xuICB9IC8vIFRoaXMgY2hlY2sgdXNlcyBjdXJyZW50SG9vayBzbyB0aGF0IGl0IHdvcmtzIHRoZSBzYW1lIGluIERFViBhbmQgcHJvZCBidW5kbGVzLlxuICAvLyBob29rVHlwZXNEZXYgY291bGQgY2F0Y2ggbW9yZSBjYXNlcyAoZS5nLiBjb250ZXh0KSBidXQgb25seSBpbiBERVYgYnVuZGxlcy5cblxuXG4gIHZhciBkaWRSZW5kZXJUb29GZXdIb29rcyA9IGN1cnJlbnRIb29rICE9PSBudWxsICYmIGN1cnJlbnRIb29rLm5leHQgIT09IG51bGw7XG4gIHJlbmRlckxhbmVzID0gTm9MYW5lcztcbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSA9IG51bGw7XG4gIGN1cnJlbnRIb29rID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcblxuICB7XG4gICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBudWxsO1xuICAgIGhvb2tUeXBlc0RldiA9IG51bGw7XG4gICAgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPSAtMTsgLy8gQ29uZmlybSB0aGF0IGEgc3RhdGljIGZsYWcgd2FzIG5vdCBhZGRlZCBvciByZW1vdmVkIHNpbmNlIHRoZSBsYXN0XG4gICAgLy8gcmVuZGVyLiBJZiB0aGlzIGZpcmVzLCBpdCBzdWdnZXN0cyB0aGF0IHdlIGluY29ycmVjdGx5IHJlc2V0IHRoZSBzdGF0aWNcbiAgICAvLyBmbGFncyBpbiBzb21lIG90aGVyIHBhcnQgb2YgdGhlIGNvZGViYXNlLiBUaGlzIGhhcyBoYXBwZW5lZCBiZWZvcmUsIGZvclxuICAgIC8vIGV4YW1wbGUsIGluIHRoZSBTdXNwZW5zZUxpc3QgaW1wbGVtZW50YXRpb24uXG5cbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiAoY3VycmVudC5mbGFncyAmIFN0YXRpY01hc2spICE9PSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBTdGF0aWNNYXNrKSAmJiAvLyBEaXNhYmxlIHRoaXMgd2FybmluZyBpbiBsZWdhY3kgbW9kZSwgYmVjYXVzZSBsZWdhY3kgU3VzcGVuc2UgaXMgd2VpcmRcbiAgICAvLyBhbmQgY3JlYXRlcyBmYWxzZSBwb3NpdGl2ZXMuIFRvIG1ha2UgdGhpcyB3b3JrIGluIGxlZ2FjeSBtb2RlLCB3ZSdkXG4gICAgLy8gbmVlZCB0byBtYXJrIGZpYmVycyB0aGF0IGNvbW1pdCBpbiBhbiBpbmNvbXBsZXRlIHN0YXRlLCBzb21laG93LiBGb3JcbiAgICAvLyBub3cgSSdsbCBkaXNhYmxlIHRoZSB3YXJuaW5nIHRoYXQgbW9zdCBvZiB0aGUgYnVncyB0aGF0IHdvdWxkIHRyaWdnZXJcbiAgICAvLyBpdCBhcmUgZWl0aGVyIGV4Y2x1c2l2ZSB0byBjb25jdXJyZW50IG1vZGUgb3IgZXhpc3QgaW4gYm90aC5cbiAgICAoY3VycmVudC5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgIGVycm9yKCdJbnRlcm5hbCBSZWFjdCBlcnJvcjogRXhwZWN0ZWQgc3RhdGljIGZsYWcgd2FzIG1pc3NpbmcuIFBsZWFzZSAnICsgJ25vdGlmeSB0aGUgUmVhY3QgdGVhbS4nKTtcbiAgICB9XG4gIH1cblxuICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlID0gZmFsc2U7IC8vIFRoaXMgaXMgcmVzZXQgYnkgY2hlY2tEaWRSZW5kZXJJZEhvb2tcbiAgLy8gbG9jYWxJZENvdW50ZXIgPSAwO1xuXG4gIGlmIChkaWRSZW5kZXJUb29GZXdIb29rcykge1xuICAgIHRocm93IG5ldyBFcnJvcignUmVuZGVyZWQgZmV3ZXIgaG9va3MgdGhhbiBleHBlY3RlZC4gVGhpcyBtYXkgYmUgY2F1c2VkIGJ5IGFuIGFjY2lkZW50YWwgJyArICdlYXJseSByZXR1cm4gc3RhdGVtZW50LicpO1xuICB9XG5cbiAgcmV0dXJuIGNoaWxkcmVuO1xufVxuZnVuY3Rpb24gY2hlY2tEaWRSZW5kZXJJZEhvb2soKSB7XG4gIC8vIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBldmVyeSByZW5kZXJXaXRoSG9va3MgY2FsbC5cbiAgLy8gQ29uY2VwdHVhbGx5LCBpdCdzIHBhcnQgb2YgdGhlIHJldHVybiB2YWx1ZSBvZiByZW5kZXJXaXRoSG9va3M7IGl0J3Mgb25seSBhXG4gIC8vIHNlcGFyYXRlIGZ1bmN0aW9uIHRvIGF2b2lkIHVzaW5nIGFuIGFycmF5IHR1cGxlLlxuICB2YXIgZGlkUmVuZGVySWRIb29rID0gbG9jYWxJZENvdW50ZXIgIT09IDA7XG4gIGxvY2FsSWRDb3VudGVyID0gMDtcbiAgcmV0dXJuIGRpZFJlbmRlcklkSG9vaztcbn1cbmZ1bmN0aW9uIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbGFuZXMpIHtcbiAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlOyAvLyBUT0RPOiBEb24ndCBuZWVkIHRvIHJlc2V0IHRoZSBmbGFncyBoZXJlLCBiZWNhdXNlIHRoZXkncmUgcmVzZXQgaW4gdGhlXG4gIC8vIGNvbXBsZXRlIHBoYXNlIChidWJibGVQcm9wZXJ0aWVzKS5cblxuICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSB+KE1vdW50UGFzc2l2ZURldiB8IE1vdW50TGF5b3V0RGV2IHwgUGFzc2l2ZSB8IFVwZGF0ZSk7XG4gIH0gZWxzZSB7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gfihQYXNzaXZlIHwgVXBkYXRlKTtcbiAgfVxuXG4gIGN1cnJlbnQubGFuZXMgPSByZW1vdmVMYW5lcyhjdXJyZW50LmxhbmVzLCBsYW5lcyk7XG59XG5mdW5jdGlvbiByZXNldEhvb2tzQWZ0ZXJUaHJvdygpIHtcbiAgLy8gV2UgY2FuIGFzc3VtZSB0aGUgcHJldmlvdXMgZGlzcGF0Y2hlciBpcyBhbHdheXMgdGhpcyBvbmUsIHNpbmNlIHdlIHNldCBpdFxuICAvLyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZW5kZXIgcGhhc2UgYW5kIHRoZXJlJ3Mgbm8gcmUtZW50cmFuY2UuXG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gQ29udGV4dE9ubHlEaXNwYXRjaGVyO1xuXG4gIGlmIChkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlKSB7XG4gICAgLy8gVGhlcmUgd2VyZSByZW5kZXIgcGhhc2UgdXBkYXRlcy4gVGhlc2UgYXJlIG9ubHkgdmFsaWQgZm9yIHRoaXMgcmVuZGVyXG4gICAgLy8gcGhhc2UsIHdoaWNoIHdlIGFyZSBub3cgYWJvcnRpbmcuIFJlbW92ZSB0aGUgdXBkYXRlcyBmcm9tIHRoZSBxdWV1ZXMgc29cbiAgICAvLyB0aGV5IGRvIG5vdCBwZXJzaXN0IHRvIHRoZSBuZXh0IHJlbmRlci4gRG8gbm90IHJlbW92ZSB1cGRhdGVzIGZyb20gaG9va3NcbiAgICAvLyB0aGF0IHdlcmVuJ3QgcHJvY2Vzc2VkLlxuICAgIC8vXG4gICAgLy8gT25seSByZXNldCB0aGUgdXBkYXRlcyBmcm9tIHRoZSBxdWV1ZSBpZiBpdCBoYXMgYSBjbG9uZS4gSWYgaXQgZG9lc1xuICAgIC8vIG5vdCBoYXZlIGEgY2xvbmUsIHRoYXQgbWVhbnMgaXQgd2Fzbid0IHByb2Nlc3NlZCwgYW5kIHRoZSB1cGRhdGVzIHdlcmVcbiAgICAvLyBzY2hlZHVsZWQgYmVmb3JlIHdlIGVudGVyZWQgdGhlIHJlbmRlciBwaGFzZS5cbiAgICB2YXIgaG9vayA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubWVtb2l6ZWRTdGF0ZTtcblxuICAgIHdoaWxlIChob29rICE9PSBudWxsKSB7XG4gICAgICB2YXIgcXVldWUgPSBob29rLnF1ZXVlO1xuXG4gICAgICBpZiAocXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgcXVldWUucGVuZGluZyA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGhvb2sgPSBob29rLm5leHQ7XG4gICAgfVxuXG4gICAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IGZhbHNlO1xuICB9XG5cbiAgcmVuZGVyTGFuZXMgPSBOb0xhbmVzO1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gbnVsbDtcbiAgY3VycmVudEhvb2sgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBudWxsO1xuXG4gIHtcbiAgICBob29rVHlwZXNEZXYgPSBudWxsO1xuICAgIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7XG4gICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBudWxsO1xuICAgIGlzVXBkYXRpbmdPcGFxdWVWYWx1ZUluUmVuZGVyUGhhc2UgPSBmYWxzZTtcbiAgfVxuXG4gIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyA9IGZhbHNlO1xuICBsb2NhbElkQ291bnRlciA9IDA7XG59XG5cbmZ1bmN0aW9uIG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCkge1xuICB2YXIgaG9vayA9IHtcbiAgICBtZW1vaXplZFN0YXRlOiBudWxsLFxuICAgIGJhc2VTdGF0ZTogbnVsbCxcbiAgICBiYXNlUXVldWU6IG51bGwsXG4gICAgcXVldWU6IG51bGwsXG4gICAgbmV4dDogbnVsbFxuICB9O1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc0hvb2sgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBob29rIGluIHRoZSBsaXN0XG4gICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tZW1vaXplZFN0YXRlID0gd29ya0luUHJvZ3Jlc3NIb29rID0gaG9vaztcbiAgfSBlbHNlIHtcbiAgICAvLyBBcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdFxuICAgIHdvcmtJblByb2dyZXNzSG9vayA9IHdvcmtJblByb2dyZXNzSG9vay5uZXh0ID0gaG9vaztcbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzc0hvb2s7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpIHtcbiAgLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJvdGggZm9yIHVwZGF0ZXMgYW5kIGZvciByZS1yZW5kZXJzIHRyaWdnZXJlZCBieSBhXG4gIC8vIHJlbmRlciBwaGFzZSB1cGRhdGUuIEl0IGFzc3VtZXMgdGhlcmUgaXMgZWl0aGVyIGEgY3VycmVudCBob29rIHdlIGNhblxuICAvLyBjbG9uZSwgb3IgYSB3b3JrLWluLXByb2dyZXNzIGhvb2sgZnJvbSBhIHByZXZpb3VzIHJlbmRlciBwYXNzIHRoYXQgd2UgY2FuXG4gIC8vIHVzZSBhcyBhIGJhc2UuIFdoZW4gd2UgcmVhY2ggdGhlIGVuZCBvZiB0aGUgYmFzZSBsaXN0LCB3ZSBtdXN0IHN3aXRjaCB0b1xuICAvLyB0aGUgZGlzcGF0Y2hlciB1c2VkIGZvciBtb3VudHMuXG4gIHZhciBuZXh0Q3VycmVudEhvb2s7XG5cbiAgaWYgKGN1cnJlbnRIb29rID09PSBudWxsKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmFsdGVybmF0ZTtcblxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICBuZXh0Q3VycmVudEhvb2sgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRDdXJyZW50SG9vayA9IG51bGw7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG5leHRDdXJyZW50SG9vayA9IGN1cnJlbnRIb29rLm5leHQ7XG4gIH1cblxuICB2YXIgbmV4dFdvcmtJblByb2dyZXNzSG9vaztcblxuICBpZiAod29ya0luUHJvZ3Jlc3NIb29rID09PSBudWxsKSB7XG4gICAgbmV4dFdvcmtJblByb2dyZXNzSG9vayA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubWVtb2l6ZWRTdGF0ZTtcbiAgfSBlbHNlIHtcbiAgICBuZXh0V29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQ7XG4gIH1cblxuICBpZiAobmV4dFdvcmtJblByb2dyZXNzSG9vayAhPT0gbnVsbCkge1xuICAgIC8vIFRoZXJlJ3MgYWxyZWFkeSBhIHdvcmstaW4tcHJvZ3Jlc3MuIFJldXNlIGl0LlxuICAgIHdvcmtJblByb2dyZXNzSG9vayA9IG5leHRXb3JrSW5Qcm9ncmVzc0hvb2s7XG4gICAgbmV4dFdvcmtJblByb2dyZXNzSG9vayA9IHdvcmtJblByb2dyZXNzSG9vay5uZXh0O1xuICAgIGN1cnJlbnRIb29rID0gbmV4dEN1cnJlbnRIb29rO1xuICB9IGVsc2Uge1xuICAgIC8vIENsb25lIGZyb20gdGhlIGN1cnJlbnQgaG9vay5cbiAgICBpZiAobmV4dEN1cnJlbnRIb29rID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlbmRlcmVkIG1vcmUgaG9va3MgdGhhbiBkdXJpbmcgdGhlIHByZXZpb3VzIHJlbmRlci4nKTtcbiAgICB9XG5cbiAgICBjdXJyZW50SG9vayA9IG5leHRDdXJyZW50SG9vaztcbiAgICB2YXIgbmV3SG9vayA9IHtcbiAgICAgIG1lbW9pemVkU3RhdGU6IGN1cnJlbnRIb29rLm1lbW9pemVkU3RhdGUsXG4gICAgICBiYXNlU3RhdGU6IGN1cnJlbnRIb29rLmJhc2VTdGF0ZSxcbiAgICAgIGJhc2VRdWV1ZTogY3VycmVudEhvb2suYmFzZVF1ZXVlLFxuICAgICAgcXVldWU6IGN1cnJlbnRIb29rLnF1ZXVlLFxuICAgICAgbmV4dDogbnVsbFxuICAgIH07XG5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3NIb29rID09PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBob29rIGluIHRoZSBsaXN0LlxuICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tZW1vaXplZFN0YXRlID0gd29ya0luUHJvZ3Jlc3NIb29rID0gbmV3SG9vaztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuXG4gICAgICB3b3JrSW5Qcm9ncmVzc0hvb2sgPSB3b3JrSW5Qcm9ncmVzc0hvb2submV4dCA9IG5ld0hvb2s7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzSG9vaztcbn1cblxuZnVuY3Rpb24gY3JlYXRlRnVuY3Rpb25Db21wb25lbnRVcGRhdGVRdWV1ZSgpIHtcbiAgcmV0dXJuIHtcbiAgICBsYXN0RWZmZWN0OiBudWxsLFxuICAgIHN0b3JlczogbnVsbFxuICB9O1xufVxuXG5mdW5jdGlvbiBiYXNpY1N0YXRlUmVkdWNlcihzdGF0ZSwgYWN0aW9uKSB7XG4gIC8vICRGbG93Rml4TWU6IEZsb3cgZG9lc24ndCBsaWtlIG1peGVkIHR5cGVzXG4gIHJldHVybiB0eXBlb2YgYWN0aW9uID09PSAnZnVuY3Rpb24nID8gYWN0aW9uKHN0YXRlKSA6IGFjdGlvbjtcbn1cblxuZnVuY3Rpb24gbW91bnRSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgaW5pdGlhbFN0YXRlO1xuXG4gIGlmIChpbml0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBpbml0aWFsU3RhdGUgPSBpbml0KGluaXRpYWxBcmcpO1xuICB9IGVsc2Uge1xuICAgIGluaXRpYWxTdGF0ZSA9IGluaXRpYWxBcmc7XG4gIH1cblxuICBob29rLm1lbW9pemVkU3RhdGUgPSBob29rLmJhc2VTdGF0ZSA9IGluaXRpYWxTdGF0ZTtcbiAgdmFyIHF1ZXVlID0ge1xuICAgIHBlbmRpbmc6IG51bGwsXG4gICAgaW50ZXJsZWF2ZWQ6IG51bGwsXG4gICAgbGFuZXM6IE5vTGFuZXMsXG4gICAgZGlzcGF0Y2g6IG51bGwsXG4gICAgbGFzdFJlbmRlcmVkUmVkdWNlcjogcmVkdWNlcixcbiAgICBsYXN0UmVuZGVyZWRTdGF0ZTogaW5pdGlhbFN0YXRlXG4gIH07XG4gIGhvb2sucXVldWUgPSBxdWV1ZTtcbiAgdmFyIGRpc3BhdGNoID0gcXVldWUuZGlzcGF0Y2ggPSBkaXNwYXRjaFJlZHVjZXJBY3Rpb24uYmluZChudWxsLCBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLCBxdWV1ZSk7XG4gIHJldHVybiBbaG9vay5tZW1vaXplZFN0YXRlLCBkaXNwYXRjaF07XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgcXVldWUgPSBob29rLnF1ZXVlO1xuXG4gIGlmIChxdWV1ZSA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2hvdWxkIGhhdmUgYSBxdWV1ZS4gVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgcXVldWUubGFzdFJlbmRlcmVkUmVkdWNlciA9IHJlZHVjZXI7XG4gIHZhciBjdXJyZW50ID0gY3VycmVudEhvb2s7IC8vIFRoZSBsYXN0IHJlYmFzZSB1cGRhdGUgdGhhdCBpcyBOT1QgcGFydCBvZiB0aGUgYmFzZSBzdGF0ZS5cblxuICB2YXIgYmFzZVF1ZXVlID0gY3VycmVudC5iYXNlUXVldWU7IC8vIFRoZSBsYXN0IHBlbmRpbmcgdXBkYXRlIHRoYXQgaGFzbid0IGJlZW4gcHJvY2Vzc2VkIHlldC5cblxuICB2YXIgcGVuZGluZ1F1ZXVlID0gcXVldWUucGVuZGluZztcblxuICBpZiAocGVuZGluZ1F1ZXVlICE9PSBudWxsKSB7XG4gICAgLy8gV2UgaGF2ZSBuZXcgdXBkYXRlcyB0aGF0IGhhdmVuJ3QgYmVlbiBwcm9jZXNzZWQgeWV0LlxuICAgIC8vIFdlJ2xsIGFkZCB0aGVtIHRvIHRoZSBiYXNlIHF1ZXVlLlxuICAgIGlmIChiYXNlUXVldWUgIT09IG51bGwpIHtcbiAgICAgIC8vIE1lcmdlIHRoZSBwZW5kaW5nIHF1ZXVlIGFuZCB0aGUgYmFzZSBxdWV1ZS5cbiAgICAgIHZhciBiYXNlRmlyc3QgPSBiYXNlUXVldWUubmV4dDtcbiAgICAgIHZhciBwZW5kaW5nRmlyc3QgPSBwZW5kaW5nUXVldWUubmV4dDtcbiAgICAgIGJhc2VRdWV1ZS5uZXh0ID0gcGVuZGluZ0ZpcnN0O1xuICAgICAgcGVuZGluZ1F1ZXVlLm5leHQgPSBiYXNlRmlyc3Q7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKGN1cnJlbnQuYmFzZVF1ZXVlICE9PSBiYXNlUXVldWUpIHtcbiAgICAgICAgLy8gSW50ZXJuYWwgaW52YXJpYW50IHRoYXQgc2hvdWxkIG5ldmVyIGhhcHBlbiwgYnV0IGZlYXNpYmx5IGNvdWxkIGluXG4gICAgICAgIC8vIHRoZSBmdXR1cmUgaWYgd2UgaW1wbGVtZW50IHJlc3VtaW5nLCBvciBzb21lIGZvcm0gb2YgdGhhdC5cbiAgICAgICAgZXJyb3IoJ0ludGVybmFsIGVycm9yOiBFeHBlY3RlZCB3b3JrLWluLXByb2dyZXNzIHF1ZXVlIHRvIGJlIGEgY2xvbmUuICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjdXJyZW50LmJhc2VRdWV1ZSA9IGJhc2VRdWV1ZSA9IHBlbmRpbmdRdWV1ZTtcbiAgICBxdWV1ZS5wZW5kaW5nID0gbnVsbDtcbiAgfVxuXG4gIGlmIChiYXNlUXVldWUgIT09IG51bGwpIHtcbiAgICAvLyBXZSBoYXZlIGEgcXVldWUgdG8gcHJvY2Vzcy5cbiAgICB2YXIgZmlyc3QgPSBiYXNlUXVldWUubmV4dDtcbiAgICB2YXIgbmV3U3RhdGUgPSBjdXJyZW50LmJhc2VTdGF0ZTtcbiAgICB2YXIgbmV3QmFzZVN0YXRlID0gbnVsbDtcbiAgICB2YXIgbmV3QmFzZVF1ZXVlRmlyc3QgPSBudWxsO1xuICAgIHZhciBuZXdCYXNlUXVldWVMYXN0ID0gbnVsbDtcbiAgICB2YXIgdXBkYXRlID0gZmlyc3Q7XG5cbiAgICBkbyB7XG4gICAgICB2YXIgdXBkYXRlTGFuZSA9IHVwZGF0ZS5sYW5lO1xuXG4gICAgICBpZiAoIWlzU3Vic2V0T2ZMYW5lcyhyZW5kZXJMYW5lcywgdXBkYXRlTGFuZSkpIHtcbiAgICAgICAgLy8gUHJpb3JpdHkgaXMgaW5zdWZmaWNpZW50LiBTa2lwIHRoaXMgdXBkYXRlLiBJZiB0aGlzIGlzIHRoZSBmaXJzdFxuICAgICAgICAvLyBza2lwcGVkIHVwZGF0ZSwgdGhlIHByZXZpb3VzIHVwZGF0ZS9zdGF0ZSBpcyB0aGUgbmV3IGJhc2VcbiAgICAgICAgLy8gdXBkYXRlL3N0YXRlLlxuICAgICAgICB2YXIgY2xvbmUgPSB7XG4gICAgICAgICAgbGFuZTogdXBkYXRlTGFuZSxcbiAgICAgICAgICBhY3Rpb246IHVwZGF0ZS5hY3Rpb24sXG4gICAgICAgICAgaGFzRWFnZXJTdGF0ZTogdXBkYXRlLmhhc0VhZ2VyU3RhdGUsXG4gICAgICAgICAgZWFnZXJTdGF0ZTogdXBkYXRlLmVhZ2VyU3RhdGUsXG4gICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChuZXdCYXNlUXVldWVMYXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgbmV3QmFzZVF1ZXVlRmlyc3QgPSBuZXdCYXNlUXVldWVMYXN0ID0gY2xvbmU7XG4gICAgICAgICAgbmV3QmFzZVN0YXRlID0gbmV3U3RhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3QmFzZVF1ZXVlTGFzdCA9IG5ld0Jhc2VRdWV1ZUxhc3QubmV4dCA9IGNsb25lO1xuICAgICAgICB9IC8vIFVwZGF0ZSB0aGUgcmVtYWluaW5nIHByaW9yaXR5IGluIHRoZSBxdWV1ZS5cbiAgICAgICAgLy8gVE9ETzogRG9uJ3QgbmVlZCB0byBhY2N1bXVsYXRlIHRoaXMuIEluc3RlYWQsIHdlIGNhbiByZW1vdmVcbiAgICAgICAgLy8gcmVuZGVyTGFuZXMgZnJvbSB0aGUgb3JpZ2luYWwgbGFuZXMuXG5cblxuICAgICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzID0gbWVyZ2VMYW5lcyhjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzLCB1cGRhdGVMYW5lKTtcbiAgICAgICAgbWFya1NraXBwZWRVcGRhdGVMYW5lcyh1cGRhdGVMYW5lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgdXBkYXRlIGRvZXMgaGF2ZSBzdWZmaWNpZW50IHByaW9yaXR5LlxuICAgICAgICBpZiAobmV3QmFzZVF1ZXVlTGFzdCAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBfY2xvbmUgPSB7XG4gICAgICAgICAgICAvLyBUaGlzIHVwZGF0ZSBpcyBnb2luZyB0byBiZSBjb21taXR0ZWQgc28gd2UgbmV2ZXIgd2FudCB1bmNvbW1pdFxuICAgICAgICAgICAgLy8gaXQuIFVzaW5nIE5vTGFuZSB3b3JrcyBiZWNhdXNlIDAgaXMgYSBzdWJzZXQgb2YgYWxsIGJpdG1hc2tzLCBzb1xuICAgICAgICAgICAgLy8gdGhpcyB3aWxsIG5ldmVyIGJlIHNraXBwZWQgYnkgdGhlIGNoZWNrIGFib3ZlLlxuICAgICAgICAgICAgbGFuZTogTm9MYW5lLFxuICAgICAgICAgICAgYWN0aW9uOiB1cGRhdGUuYWN0aW9uLFxuICAgICAgICAgICAgaGFzRWFnZXJTdGF0ZTogdXBkYXRlLmhhc0VhZ2VyU3RhdGUsXG4gICAgICAgICAgICBlYWdlclN0YXRlOiB1cGRhdGUuZWFnZXJTdGF0ZSxcbiAgICAgICAgICAgIG5leHQ6IG51bGxcbiAgICAgICAgICB9O1xuICAgICAgICAgIG5ld0Jhc2VRdWV1ZUxhc3QgPSBuZXdCYXNlUXVldWVMYXN0Lm5leHQgPSBfY2xvbmU7XG4gICAgICAgIH0gLy8gUHJvY2VzcyB0aGlzIHVwZGF0ZS5cblxuXG4gICAgICAgIGlmICh1cGRhdGUuaGFzRWFnZXJTdGF0ZSkge1xuICAgICAgICAgIC8vIElmIHRoaXMgdXBkYXRlIGlzIGEgc3RhdGUgdXBkYXRlIChub3QgYSByZWR1Y2VyKSBhbmQgd2FzIHByb2Nlc3NlZCBlYWdlcmx5LFxuICAgICAgICAgIC8vIHdlIGNhbiB1c2UgdGhlIGVhZ2VybHkgY29tcHV0ZWQgc3RhdGVcbiAgICAgICAgICBuZXdTdGF0ZSA9IHVwZGF0ZS5lYWdlclN0YXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBhY3Rpb24gPSB1cGRhdGUuYWN0aW9uO1xuICAgICAgICAgIG5ld1N0YXRlID0gcmVkdWNlcihuZXdTdGF0ZSwgYWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB1cGRhdGUgPSB1cGRhdGUubmV4dDtcbiAgICB9IHdoaWxlICh1cGRhdGUgIT09IG51bGwgJiYgdXBkYXRlICE9PSBmaXJzdCk7XG5cbiAgICBpZiAobmV3QmFzZVF1ZXVlTGFzdCA9PT0gbnVsbCkge1xuICAgICAgbmV3QmFzZVN0YXRlID0gbmV3U3RhdGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0Jhc2VRdWV1ZUxhc3QubmV4dCA9IG5ld0Jhc2VRdWV1ZUZpcnN0O1xuICAgIH0gLy8gTWFyayB0aGF0IHRoZSBmaWJlciBwZXJmb3JtZWQgd29yaywgYnV0IG9ubHkgaWYgdGhlIG5ldyBzdGF0ZSBpc1xuICAgIC8vIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IHN0YXRlLlxuXG5cbiAgICBpZiAoIW9iamVjdElzKG5ld1N0YXRlLCBob29rLm1lbW9pemVkU3RhdGUpKSB7XG4gICAgICBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpO1xuICAgIH1cblxuICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICAgIGhvb2suYmFzZVN0YXRlID0gbmV3QmFzZVN0YXRlO1xuICAgIGhvb2suYmFzZVF1ZXVlID0gbmV3QmFzZVF1ZXVlTGFzdDtcbiAgICBxdWV1ZS5sYXN0UmVuZGVyZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9IC8vIEludGVybGVhdmVkIHVwZGF0ZXMgYXJlIHN0b3JlZCBvbiBhIHNlcGFyYXRlIHF1ZXVlLiBXZSBhcmVuJ3QgZ29pbmcgdG9cbiAgLy8gcHJvY2VzcyB0aGVtIGR1cmluZyB0aGlzIHJlbmRlciwgYnV0IHdlIGRvIG5lZWQgdG8gdHJhY2sgd2hpY2ggbGFuZXNcbiAgLy8gYXJlIHJlbWFpbmluZy5cblxuXG4gIHZhciBsYXN0SW50ZXJsZWF2ZWQgPSBxdWV1ZS5pbnRlcmxlYXZlZDtcblxuICBpZiAobGFzdEludGVybGVhdmVkICE9PSBudWxsKSB7XG4gICAgdmFyIGludGVybGVhdmVkID0gbGFzdEludGVybGVhdmVkO1xuXG4gICAgZG8ge1xuICAgICAgdmFyIGludGVybGVhdmVkTGFuZSA9IGludGVybGVhdmVkLmxhbmU7XG4gICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzID0gbWVyZ2VMYW5lcyhjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzLCBpbnRlcmxlYXZlZExhbmUpO1xuICAgICAgbWFya1NraXBwZWRVcGRhdGVMYW5lcyhpbnRlcmxlYXZlZExhbmUpO1xuICAgICAgaW50ZXJsZWF2ZWQgPSBpbnRlcmxlYXZlZC5uZXh0O1xuICAgIH0gd2hpbGUgKGludGVybGVhdmVkICE9PSBsYXN0SW50ZXJsZWF2ZWQpO1xuICB9IGVsc2UgaWYgKGJhc2VRdWV1ZSA9PT0gbnVsbCkge1xuICAgIC8vIGBxdWV1ZS5sYW5lc2AgaXMgdXNlZCBmb3IgZW50YW5nbGluZyB0cmFuc2l0aW9ucy4gV2UgY2FuIHNldCBpdCBiYWNrIHRvXG4gICAgLy8gemVybyBvbmNlIHRoZSBxdWV1ZSBpcyBlbXB0eS5cbiAgICBxdWV1ZS5sYW5lcyA9IE5vTGFuZXM7XG4gIH1cblxuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaDtcbiAgcmV0dXJuIFtob29rLm1lbW9pemVkU3RhdGUsIGRpc3BhdGNoXTtcbn1cblxuZnVuY3Rpb24gcmVyZW5kZXJSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIHF1ZXVlID0gaG9vay5xdWV1ZTtcblxuICBpZiAocXVldWUgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nob3VsZCBoYXZlIGEgcXVldWUuIFRoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxuXG4gIHF1ZXVlLmxhc3RSZW5kZXJlZFJlZHVjZXIgPSByZWR1Y2VyOyAvLyBUaGlzIGlzIGEgcmUtcmVuZGVyLiBBcHBseSB0aGUgbmV3IHJlbmRlciBwaGFzZSB1cGRhdGVzIHRvIHRoZSBwcmV2aW91c1xuICAvLyB3b3JrLWluLXByb2dyZXNzIGhvb2suXG5cbiAgdmFyIGRpc3BhdGNoID0gcXVldWUuZGlzcGF0Y2g7XG4gIHZhciBsYXN0UmVuZGVyUGhhc2VVcGRhdGUgPSBxdWV1ZS5wZW5kaW5nO1xuICB2YXIgbmV3U3RhdGUgPSBob29rLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKGxhc3RSZW5kZXJQaGFzZVVwZGF0ZSAhPT0gbnVsbCkge1xuICAgIC8vIFRoZSBxdWV1ZSBkb2Vzbid0IHBlcnNpc3QgcGFzdCB0aGlzIHJlbmRlciBwYXNzLlxuICAgIHF1ZXVlLnBlbmRpbmcgPSBudWxsO1xuICAgIHZhciBmaXJzdFJlbmRlclBoYXNlVXBkYXRlID0gbGFzdFJlbmRlclBoYXNlVXBkYXRlLm5leHQ7XG4gICAgdmFyIHVwZGF0ZSA9IGZpcnN0UmVuZGVyUGhhc2VVcGRhdGU7XG5cbiAgICBkbyB7XG4gICAgICAvLyBQcm9jZXNzIHRoaXMgcmVuZGVyIHBoYXNlIHVwZGF0ZS4gV2UgZG9uJ3QgaGF2ZSB0byBjaGVjayB0aGVcbiAgICAgIC8vIHByaW9yaXR5IGJlY2F1c2UgaXQgd2lsbCBhbHdheXMgYmUgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnRcbiAgICAgIC8vIHJlbmRlcidzLlxuICAgICAgdmFyIGFjdGlvbiA9IHVwZGF0ZS5hY3Rpb247XG4gICAgICBuZXdTdGF0ZSA9IHJlZHVjZXIobmV3U3RhdGUsIGFjdGlvbik7XG4gICAgICB1cGRhdGUgPSB1cGRhdGUubmV4dDtcbiAgICB9IHdoaWxlICh1cGRhdGUgIT09IGZpcnN0UmVuZGVyUGhhc2VVcGRhdGUpOyAvLyBNYXJrIHRoYXQgdGhlIGZpYmVyIHBlcmZvcm1lZCB3b3JrLCBidXQgb25seSBpZiB0aGUgbmV3IHN0YXRlIGlzXG4gICAgLy8gZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgc3RhdGUuXG5cblxuICAgIGlmICghb2JqZWN0SXMobmV3U3RhdGUsIGhvb2subWVtb2l6ZWRTdGF0ZSkpIHtcbiAgICAgIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCk7XG4gICAgfVxuXG4gICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7IC8vIERvbid0IHBlcnNpc3QgdGhlIHN0YXRlIGFjY3VtdWxhdGVkIGZyb20gdGhlIHJlbmRlciBwaGFzZSB1cGRhdGVzIHRvXG4gICAgLy8gdGhlIGJhc2Ugc3RhdGUgdW5sZXNzIHRoZSBxdWV1ZSBpcyBlbXB0eS5cbiAgICAvLyBUT0RPOiBOb3Qgc3VyZSBpZiB0aGlzIGlzIHRoZSBkZXNpcmVkIHNlbWFudGljcywgYnV0IGl0J3Mgd2hhdCB3ZVxuICAgIC8vIGRvIGZvciBnRFNGUC4gSSBjYW4ndCByZW1lbWJlciB3aHkuXG5cbiAgICBpZiAoaG9vay5iYXNlUXVldWUgPT09IG51bGwpIHtcbiAgICAgIGhvb2suYmFzZVN0YXRlID0gbmV3U3RhdGU7XG4gICAgfVxuXG4gICAgcXVldWUubGFzdFJlbmRlcmVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgfVxuXG4gIHJldHVybiBbbmV3U3RhdGUsIGRpc3BhdGNoXTtcbn1cblxuZnVuY3Rpb24gbW91bnRNdXRhYmxlU291cmNlKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVNdXRhYmxlU291cmNlKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudFN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gIHZhciBmaWJlciA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDE7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHRTbmFwc2hvdDtcbiAgdmFyIGlzSHlkcmF0aW5nID0gZ2V0SXNIeWRyYXRpbmcoKTtcblxuICBpZiAoaXNIeWRyYXRpbmcpIHtcbiAgICBpZiAoZ2V0U2VydmVyU25hcHNob3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGdldFNlcnZlclNuYXBzaG90LCB3aGljaCBpcyByZXF1aXJlZCBmb3IgJyArICdzZXJ2ZXItcmVuZGVyZWQgY29udGVudC4gV2lsbCByZXZlcnQgdG8gY2xpZW50IHJlbmRlcmluZy4nKTtcbiAgICB9XG5cbiAgICBuZXh0U25hcHNob3QgPSBnZXRTZXJ2ZXJTbmFwc2hvdCgpO1xuXG4gICAge1xuICAgICAgaWYgKCFkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCkge1xuICAgICAgICBpZiAobmV4dFNuYXBzaG90ICE9PSBnZXRTZXJ2ZXJTbmFwc2hvdCgpKSB7XG4gICAgICAgICAgZXJyb3IoJ1RoZSByZXN1bHQgb2YgZ2V0U2VydmVyU25hcHNob3Qgc2hvdWxkIGJlIGNhY2hlZCB0byBhdm9pZCBhbiBpbmZpbml0ZSBsb29wJyk7XG5cbiAgICAgICAgICBkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbmV4dFNuYXBzaG90ID0gZ2V0U25hcHNob3QoKTtcblxuICAgIHtcbiAgICAgIGlmICghZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QpIHtcbiAgICAgICAgdmFyIGNhY2hlZFNuYXBzaG90ID0gZ2V0U25hcHNob3QoKTtcblxuICAgICAgICBpZiAoIW9iamVjdElzKG5leHRTbmFwc2hvdCwgY2FjaGVkU25hcHNob3QpKSB7XG4gICAgICAgICAgZXJyb3IoJ1RoZSByZXN1bHQgb2YgZ2V0U25hcHNob3Qgc2hvdWxkIGJlIGNhY2hlZCB0byBhdm9pZCBhbiBpbmZpbml0ZSBsb29wJyk7XG5cbiAgICAgICAgICBkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIFVubGVzcyB3ZSdyZSByZW5kZXJpbmcgYSBibG9ja2luZyBsYW5lLCBzY2hlZHVsZSBhIGNvbnNpc3RlbmN5IGNoZWNrLlxuICAgIC8vIFJpZ2h0IGJlZm9yZSBjb21taXR0aW5nLCB3ZSB3aWxsIHdhbGsgdGhlIHRyZWUgYW5kIGNoZWNrIGlmIGFueSBvZiB0aGVcbiAgICAvLyBzdG9yZXMgd2VyZSBtdXRhdGVkLlxuICAgIC8vXG4gICAgLy8gV2Ugd29uJ3QgZG8gdGhpcyBpZiB3ZSdyZSBoeWRyYXRpbmcgc2VydmVyLXJlbmRlcmVkIGNvbnRlbnQsIGJlY2F1c2UgaWZcbiAgICAvLyB0aGUgY29udGVudCBpcyBzdGFsZSwgaXQncyBhbHJlYWR5IHZpc2libGUgYW55d2F5LiBJbnN0ZWFkIHdlJ2xsIHBhdGNoXG4gICAgLy8gaXQgdXAgaW4gYSBwYXNzaXZlIGVmZmVjdC5cblxuXG4gICAgdmFyIHJvb3QgPSBnZXRXb3JrSW5Qcm9ncmVzc1Jvb3QoKTtcblxuICAgIGlmIChyb290ID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGEgd29yay1pbi1wcm9ncmVzcyByb290LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG5cbiAgICBpZiAoIWluY2x1ZGVzQmxvY2tpbmdMYW5lKHJvb3QsIHJlbmRlckxhbmVzKSkge1xuICAgICAgcHVzaFN0b3JlQ29uc2lzdGVuY3lDaGVjayhmaWJlciwgZ2V0U25hcHNob3QsIG5leHRTbmFwc2hvdCk7XG4gICAgfVxuICB9IC8vIFJlYWQgdGhlIGN1cnJlbnQgc25hcHNob3QgZnJvbSB0aGUgc3RvcmUgb24gZXZlcnkgcmVuZGVyLiBUaGlzIGJyZWFrcyB0aGVcbiAgLy8gbm9ybWFsIHJ1bGVzIG9mIFJlYWN0LCBhbmQgb25seSB3b3JrcyBiZWNhdXNlIHN0b3JlIHVwZGF0ZXMgYXJlXG4gIC8vIGFsd2F5cyBzeW5jaHJvbm91cy5cblxuXG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5leHRTbmFwc2hvdDtcbiAgdmFyIGluc3QgPSB7XG4gICAgdmFsdWU6IG5leHRTbmFwc2hvdCxcbiAgICBnZXRTbmFwc2hvdDogZ2V0U25hcHNob3RcbiAgfTtcbiAgaG9vay5xdWV1ZSA9IGluc3Q7IC8vIFNjaGVkdWxlIGFuIGVmZmVjdCB0byBzdWJzY3JpYmUgdG8gdGhlIHN0b3JlLlxuXG4gIG1vdW50RWZmZWN0KHN1YnNjcmliZVRvU3RvcmUuYmluZChudWxsLCBmaWJlciwgaW5zdCwgc3Vic2NyaWJlKSwgW3N1YnNjcmliZV0pOyAvLyBTY2hlZHVsZSBhbiBlZmZlY3QgdG8gdXBkYXRlIHRoZSBtdXRhYmxlIGluc3RhbmNlIGZpZWxkcy4gV2Ugd2lsbCB1cGRhdGVcbiAgLy8gdGhpcyB3aGVuZXZlciBzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBvciB2YWx1ZSBjaGFuZ2VzLiBCZWNhdXNlIHRoZXJlJ3Mgbm9cbiAgLy8gY2xlYW4tdXAgZnVuY3Rpb24sIGFuZCB3ZSB0cmFjayB0aGUgZGVwcyBjb3JyZWN0bHksIHdlIGNhbiBjYWxsIHB1c2hFZmZlY3RcbiAgLy8gZGlyZWN0bHksIHdpdGhvdXQgc3RvcmluZyBhbnkgYWRkaXRpb25hbCBzdGF0ZS4gRm9yIHRoZSBzYW1lIHJlYXNvbiwgd2VcbiAgLy8gZG9uJ3QgbmVlZCB0byBzZXQgYSBzdGF0aWMgZmxhZywgZWl0aGVyLlxuICAvLyBUT0RPOiBXZSBjYW4gbW92ZSB0aGlzIHRvIHRoZSBwYXNzaXZlIHBoYXNlIG9uY2Ugd2UgYWRkIGEgcHJlLWNvbW1pdFxuICAvLyBjb25zaXN0ZW5jeSBjaGVjay4gU2VlIHRoZSBuZXh0IGNvbW1lbnQuXG5cbiAgZmliZXIuZmxhZ3MgfD0gUGFzc2l2ZTtcbiAgcHVzaEVmZmVjdChIYXNFZmZlY3QgfCBQYXNzaXZlJDEsIHVwZGF0ZVN0b3JlSW5zdGFuY2UuYmluZChudWxsLCBmaWJlciwgaW5zdCwgbmV4dFNuYXBzaG90LCBnZXRTbmFwc2hvdCksIHVuZGVmaW5lZCwgbnVsbCk7XG4gIHJldHVybiBuZXh0U25hcHNob3Q7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gIHZhciBmaWJlciA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDE7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7IC8vIFJlYWQgdGhlIGN1cnJlbnQgc25hcHNob3QgZnJvbSB0aGUgc3RvcmUgb24gZXZlcnkgcmVuZGVyLiBUaGlzIGJyZWFrcyB0aGVcbiAgLy8gbm9ybWFsIHJ1bGVzIG9mIFJlYWN0LCBhbmQgb25seSB3b3JrcyBiZWNhdXNlIHN0b3JlIHVwZGF0ZXMgYXJlXG4gIC8vIGFsd2F5cyBzeW5jaHJvbm91cy5cblxuICB2YXIgbmV4dFNuYXBzaG90ID0gZ2V0U25hcHNob3QoKTtcblxuICB7XG4gICAgaWYgKCFkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCkge1xuICAgICAgdmFyIGNhY2hlZFNuYXBzaG90ID0gZ2V0U25hcHNob3QoKTtcblxuICAgICAgaWYgKCFvYmplY3RJcyhuZXh0U25hcHNob3QsIGNhY2hlZFNuYXBzaG90KSkge1xuICAgICAgICBlcnJvcignVGhlIHJlc3VsdCBvZiBnZXRTbmFwc2hvdCBzaG91bGQgYmUgY2FjaGVkIHRvIGF2b2lkIGFuIGluZmluaXRlIGxvb3AnKTtcblxuICAgICAgICBkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHByZXZTbmFwc2hvdCA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHNuYXBzaG90Q2hhbmdlZCA9ICFvYmplY3RJcyhwcmV2U25hcHNob3QsIG5leHRTbmFwc2hvdCk7XG5cbiAgaWYgKHNuYXBzaG90Q2hhbmdlZCkge1xuICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5leHRTbmFwc2hvdDtcbiAgICBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpO1xuICB9XG5cbiAgdmFyIGluc3QgPSBob29rLnF1ZXVlO1xuICB1cGRhdGVFZmZlY3Qoc3Vic2NyaWJlVG9TdG9yZS5iaW5kKG51bGwsIGZpYmVyLCBpbnN0LCBzdWJzY3JpYmUpLCBbc3Vic2NyaWJlXSk7IC8vIFdoZW5ldmVyIGdldFNuYXBzaG90IG9yIHN1YnNjcmliZSBjaGFuZ2VzLCB3ZSBuZWVkIHRvIGNoZWNrIGluIHRoZVxuICAvLyBjb21taXQgcGhhc2UgaWYgdGhlcmUgd2FzIGFuIGludGVybGVhdmVkIG11dGF0aW9uLiBJbiBjb25jdXJyZW50IG1vZGVcbiAgLy8gdGhpcyBjYW4gaGFwcGVuIGFsbCB0aGUgdGltZSwgYnV0IGV2ZW4gaW4gc3luY2hyb25vdXMgbW9kZSwgYW4gZWFybGllclxuICAvLyBlZmZlY3QgbWF5IGhhdmUgbXV0YXRlZCB0aGUgc3RvcmUuXG5cbiAgaWYgKGluc3QuZ2V0U25hcHNob3QgIT09IGdldFNuYXBzaG90IHx8IHNuYXBzaG90Q2hhbmdlZCB8fCAvLyBDaGVjayBpZiB0aGUgc3VzYmNyaWJlIGZ1bmN0aW9uIGNoYW5nZWQuIFdlIGNhbiBzYXZlIHNvbWUgbWVtb3J5IGJ5XG4gIC8vIGNoZWNraW5nIHdoZXRoZXIgd2Ugc2NoZWR1bGVkIGEgc3Vic2NyaXB0aW9uIGVmZmVjdCBhYm92ZS5cbiAgd29ya0luUHJvZ3Jlc3NIb29rICE9PSBudWxsICYmIHdvcmtJblByb2dyZXNzSG9vay5tZW1vaXplZFN0YXRlLnRhZyAmIEhhc0VmZmVjdCkge1xuICAgIGZpYmVyLmZsYWdzIHw9IFBhc3NpdmU7XG4gICAgcHVzaEVmZmVjdChIYXNFZmZlY3QgfCBQYXNzaXZlJDEsIHVwZGF0ZVN0b3JlSW5zdGFuY2UuYmluZChudWxsLCBmaWJlciwgaW5zdCwgbmV4dFNuYXBzaG90LCBnZXRTbmFwc2hvdCksIHVuZGVmaW5lZCwgbnVsbCk7IC8vIFVubGVzcyB3ZSdyZSByZW5kZXJpbmcgYSBibG9ja2luZyBsYW5lLCBzY2hlZHVsZSBhIGNvbnNpc3RlbmN5IGNoZWNrLlxuICAgIC8vIFJpZ2h0IGJlZm9yZSBjb21taXR0aW5nLCB3ZSB3aWxsIHdhbGsgdGhlIHRyZWUgYW5kIGNoZWNrIGlmIGFueSBvZiB0aGVcbiAgICAvLyBzdG9yZXMgd2VyZSBtdXRhdGVkLlxuXG4gICAgdmFyIHJvb3QgPSBnZXRXb3JrSW5Qcm9ncmVzc1Jvb3QoKTtcblxuICAgIGlmIChyb290ID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGEgd29yay1pbi1wcm9ncmVzcyByb290LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG5cbiAgICBpZiAoIWluY2x1ZGVzQmxvY2tpbmdMYW5lKHJvb3QsIHJlbmRlckxhbmVzKSkge1xuICAgICAgcHVzaFN0b3JlQ29uc2lzdGVuY3lDaGVjayhmaWJlciwgZ2V0U25hcHNob3QsIG5leHRTbmFwc2hvdCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5leHRTbmFwc2hvdDtcbn1cblxuZnVuY3Rpb24gcHVzaFN0b3JlQ29uc2lzdGVuY3lDaGVjayhmaWJlciwgZ2V0U25hcHNob3QsIHJlbmRlcmVkU25hcHNob3QpIHtcbiAgZmliZXIuZmxhZ3MgfD0gU3RvcmVDb25zaXN0ZW5jeTtcbiAgdmFyIGNoZWNrID0ge1xuICAgIGdldFNuYXBzaG90OiBnZXRTbmFwc2hvdCxcbiAgICB2YWx1ZTogcmVuZGVyZWRTbmFwc2hvdFxuICB9O1xuICB2YXIgY29tcG9uZW50VXBkYXRlUXVldWUgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLnVwZGF0ZVF1ZXVlO1xuXG4gIGlmIChjb21wb25lbnRVcGRhdGVRdWV1ZSA9PT0gbnVsbCkge1xuICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlID0gY3JlYXRlRnVuY3Rpb25Db21wb25lbnRVcGRhdGVRdWV1ZSgpO1xuICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEudXBkYXRlUXVldWUgPSBjb21wb25lbnRVcGRhdGVRdWV1ZTtcbiAgICBjb21wb25lbnRVcGRhdGVRdWV1ZS5zdG9yZXMgPSBbY2hlY2tdO1xuICB9IGVsc2Uge1xuICAgIHZhciBzdG9yZXMgPSBjb21wb25lbnRVcGRhdGVRdWV1ZS5zdG9yZXM7XG5cbiAgICBpZiAoc3RvcmVzID09PSBudWxsKSB7XG4gICAgICBjb21wb25lbnRVcGRhdGVRdWV1ZS5zdG9yZXMgPSBbY2hlY2tdO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG9yZXMucHVzaChjaGVjayk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN0b3JlSW5zdGFuY2UoZmliZXIsIGluc3QsIG5leHRTbmFwc2hvdCwgZ2V0U25hcHNob3QpIHtcbiAgLy8gVGhlc2UgYXJlIHVwZGF0ZWQgaW4gdGhlIHBhc3NpdmUgcGhhc2VcbiAgaW5zdC52YWx1ZSA9IG5leHRTbmFwc2hvdDtcbiAgaW5zdC5nZXRTbmFwc2hvdCA9IGdldFNuYXBzaG90OyAvLyBTb21ldGhpbmcgbWF5IGhhdmUgYmVlbiBtdXRhdGVkIGluIGJldHdlZW4gcmVuZGVyIGFuZCBjb21taXQuIFRoaXMgY291bGRcbiAgLy8gaGF2ZSBiZWVuIGluIGFuIGV2ZW50IHRoYXQgZmlyZWQgYmVmb3JlIHRoZSBwYXNzaXZlIGVmZmVjdHMsIG9yIGl0IGNvdWxkXG4gIC8vIGhhdmUgYmVlbiBpbiBhIGxheW91dCBlZmZlY3QuIEluIHRoYXQgY2FzZSwgd2Ugd291bGQgaGF2ZSB1c2VkIHRoZSBvbGRcbiAgLy8gc25hcHNobyBhbmQgZ2V0U25hcHNob3QgdmFsdWVzIHRvIGJhaWwgb3V0LiBXZSBuZWVkIHRvIGNoZWNrIG9uZSBtb3JlIHRpbWUuXG5cbiAgaWYgKGNoZWNrSWZTbmFwc2hvdENoYW5nZWQoaW5zdCkpIHtcbiAgICAvLyBGb3JjZSBhIHJlLXJlbmRlci5cbiAgICBmb3JjZVN0b3JlUmVyZW5kZXIoZmliZXIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN1YnNjcmliZVRvU3RvcmUoZmliZXIsIGluc3QsIHN1YnNjcmliZSkge1xuICB2YXIgaGFuZGxlU3RvcmVDaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gVGhlIHN0b3JlIGNoYW5nZWQuIENoZWNrIGlmIHRoZSBzbmFwc2hvdCBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgd2VcbiAgICAvLyByZWFkIGZyb20gdGhlIHN0b3JlLlxuICAgIGlmIChjaGVja0lmU25hcHNob3RDaGFuZ2VkKGluc3QpKSB7XG4gICAgICAvLyBGb3JjZSBhIHJlLXJlbmRlci5cbiAgICAgIGZvcmNlU3RvcmVSZXJlbmRlcihmaWJlcik7XG4gICAgfVxuICB9OyAvLyBTdWJzY3JpYmUgdG8gdGhlIHN0b3JlIGFuZCByZXR1cm4gYSBjbGVhbi11cCBmdW5jdGlvbi5cblxuXG4gIHJldHVybiBzdWJzY3JpYmUoaGFuZGxlU3RvcmVDaGFuZ2UpO1xufVxuXG5mdW5jdGlvbiBjaGVja0lmU25hcHNob3RDaGFuZ2VkKGluc3QpIHtcbiAgdmFyIGxhdGVzdEdldFNuYXBzaG90ID0gaW5zdC5nZXRTbmFwc2hvdDtcbiAgdmFyIHByZXZWYWx1ZSA9IGluc3QudmFsdWU7XG5cbiAgdHJ5IHtcbiAgICB2YXIgbmV4dFZhbHVlID0gbGF0ZXN0R2V0U25hcHNob3QoKTtcbiAgICByZXR1cm4gIW9iamVjdElzKHByZXZWYWx1ZSwgbmV4dFZhbHVlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JjZVN0b3JlUmVyZW5kZXIoZmliZXIpIHtcbiAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudFN0YXRlKGluaXRpYWxTdGF0ZSkge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG5cbiAgaWYgKHR5cGVvZiBpbml0aWFsU3RhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyAkRmxvd0ZpeE1lOiBGbG93IGRvZXNuJ3QgbGlrZSBtaXhlZCB0eXBlc1xuICAgIGluaXRpYWxTdGF0ZSA9IGluaXRpYWxTdGF0ZSgpO1xuICB9XG5cbiAgaG9vay5tZW1vaXplZFN0YXRlID0gaG9vay5iYXNlU3RhdGUgPSBpbml0aWFsU3RhdGU7XG4gIHZhciBxdWV1ZSA9IHtcbiAgICBwZW5kaW5nOiBudWxsLFxuICAgIGludGVybGVhdmVkOiBudWxsLFxuICAgIGxhbmVzOiBOb0xhbmVzLFxuICAgIGRpc3BhdGNoOiBudWxsLFxuICAgIGxhc3RSZW5kZXJlZFJlZHVjZXI6IGJhc2ljU3RhdGVSZWR1Y2VyLFxuICAgIGxhc3RSZW5kZXJlZFN0YXRlOiBpbml0aWFsU3RhdGVcbiAgfTtcbiAgaG9vay5xdWV1ZSA9IHF1ZXVlO1xuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaCA9IGRpc3BhdGNoU2V0U3RhdGUuYmluZChudWxsLCBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLCBxdWV1ZSk7XG4gIHJldHVybiBbaG9vay5tZW1vaXplZFN0YXRlLCBkaXNwYXRjaF07XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN0YXRlKGluaXRpYWxTdGF0ZSkge1xuICByZXR1cm4gdXBkYXRlUmVkdWNlcihiYXNpY1N0YXRlUmVkdWNlcik7XG59XG5cbmZ1bmN0aW9uIHJlcmVuZGVyU3RhdGUoaW5pdGlhbFN0YXRlKSB7XG4gIHJldHVybiByZXJlbmRlclJlZHVjZXIoYmFzaWNTdGF0ZVJlZHVjZXIpO1xufVxuXG5mdW5jdGlvbiBwdXNoRWZmZWN0KHRhZywgY3JlYXRlLCBkZXN0cm95LCBkZXBzKSB7XG4gIHZhciBlZmZlY3QgPSB7XG4gICAgdGFnOiB0YWcsXG4gICAgY3JlYXRlOiBjcmVhdGUsXG4gICAgZGVzdHJveTogZGVzdHJveSxcbiAgICBkZXBzOiBkZXBzLFxuICAgIC8vIENpcmN1bGFyXG4gICAgbmV4dDogbnVsbFxuICB9O1xuICB2YXIgY29tcG9uZW50VXBkYXRlUXVldWUgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLnVwZGF0ZVF1ZXVlO1xuXG4gIGlmIChjb21wb25lbnRVcGRhdGVRdWV1ZSA9PT0gbnVsbCkge1xuICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlID0gY3JlYXRlRnVuY3Rpb25Db21wb25lbnRVcGRhdGVRdWV1ZSgpO1xuICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEudXBkYXRlUXVldWUgPSBjb21wb25lbnRVcGRhdGVRdWV1ZTtcbiAgICBjb21wb25lbnRVcGRhdGVRdWV1ZS5sYXN0RWZmZWN0ID0gZWZmZWN0Lm5leHQgPSBlZmZlY3Q7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGxhc3RFZmZlY3QgPSBjb21wb25lbnRVcGRhdGVRdWV1ZS5sYXN0RWZmZWN0O1xuXG4gICAgaWYgKGxhc3RFZmZlY3QgPT09IG51bGwpIHtcbiAgICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgPSBlZmZlY3QubmV4dCA9IGVmZmVjdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGZpcnN0RWZmZWN0ID0gbGFzdEVmZmVjdC5uZXh0O1xuICAgICAgbGFzdEVmZmVjdC5uZXh0ID0gZWZmZWN0O1xuICAgICAgZWZmZWN0Lm5leHQgPSBmaXJzdEVmZmVjdDtcbiAgICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgPSBlZmZlY3Q7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVmZmVjdDtcbn1cblxuZnVuY3Rpb24gbW91bnRSZWYoaW5pdGlhbFZhbHVlKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcblxuICB7XG4gICAgdmFyIF9yZWYyID0ge1xuICAgICAgY3VycmVudDogaW5pdGlhbFZhbHVlXG4gICAgfTtcbiAgICBob29rLm1lbW9pemVkU3RhdGUgPSBfcmVmMjtcbiAgICByZXR1cm4gX3JlZjI7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlUmVmKGluaXRpYWxWYWx1ZSkge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICByZXR1cm4gaG9vay5tZW1vaXplZFN0YXRlO1xufVxuXG5mdW5jdGlvbiBtb3VudEVmZmVjdEltcGwoZmliZXJGbGFncywgaG9va0ZsYWdzLCBjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5mbGFncyB8PSBmaWJlckZsYWdzO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBwdXNoRWZmZWN0KEhhc0VmZmVjdCB8IGhvb2tGbGFncywgY3JlYXRlLCB1bmRlZmluZWQsIG5leHREZXBzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRWZmZWN0SW1wbChmaWJlckZsYWdzLCBob29rRmxhZ3MsIGNyZWF0ZSwgZGVwcykge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgdmFyIGRlc3Ryb3kgPSB1bmRlZmluZWQ7XG5cbiAgaWYgKGN1cnJlbnRIb29rICE9PSBudWxsKSB7XG4gICAgdmFyIHByZXZFZmZlY3QgPSBjdXJyZW50SG9vay5tZW1vaXplZFN0YXRlO1xuICAgIGRlc3Ryb3kgPSBwcmV2RWZmZWN0LmRlc3Ryb3k7XG5cbiAgICBpZiAobmV4dERlcHMgIT09IG51bGwpIHtcbiAgICAgIHZhciBwcmV2RGVwcyA9IHByZXZFZmZlY3QuZGVwcztcblxuICAgICAgaWYgKGFyZUhvb2tJbnB1dHNFcXVhbChuZXh0RGVwcywgcHJldkRlcHMpKSB7XG4gICAgICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHB1c2hFZmZlY3QoaG9va0ZsYWdzLCBjcmVhdGUsIGRlc3Ryb3ksIG5leHREZXBzKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEuZmxhZ3MgfD0gZmliZXJGbGFncztcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gcHVzaEVmZmVjdChIYXNFZmZlY3QgfCBob29rRmxhZ3MsIGNyZWF0ZSwgZGVzdHJveSwgbmV4dERlcHMpO1xufVxuXG5mdW5jdGlvbiBtb3VudEVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgaWYgKCAoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICByZXR1cm4gbW91bnRFZmZlY3RJbXBsKE1vdW50UGFzc2l2ZURldiB8IFBhc3NpdmUgfCBQYXNzaXZlU3RhdGljLCBQYXNzaXZlJDEsIGNyZWF0ZSwgZGVwcyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG1vdW50RWZmZWN0SW1wbChQYXNzaXZlIHwgUGFzc2l2ZVN0YXRpYywgUGFzc2l2ZSQxLCBjcmVhdGUsIGRlcHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgcmV0dXJuIHVwZGF0ZUVmZmVjdEltcGwoUGFzc2l2ZSwgUGFzc2l2ZSQxLCBjcmVhdGUsIGRlcHMpO1xufVxuXG5mdW5jdGlvbiBtb3VudEluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgcmV0dXJuIG1vdW50RWZmZWN0SW1wbChVcGRhdGUsIEluc2VydGlvbiwgY3JlYXRlLCBkZXBzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICByZXR1cm4gdXBkYXRlRWZmZWN0SW1wbChVcGRhdGUsIEluc2VydGlvbiwgY3JlYXRlLCBkZXBzKTtcbn1cblxuZnVuY3Rpb24gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBmaWJlckZsYWdzID0gVXBkYXRlO1xuXG4gIHtcbiAgICBmaWJlckZsYWdzIHw9IExheW91dFN0YXRpYztcbiAgfVxuXG4gIGlmICggKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgZmliZXJGbGFncyB8PSBNb3VudExheW91dERldjtcbiAgfVxuXG4gIHJldHVybiBtb3VudEVmZmVjdEltcGwoZmliZXJGbGFncywgTGF5b3V0LCBjcmVhdGUsIGRlcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHJldHVybiB1cGRhdGVFZmZlY3RJbXBsKFVwZGF0ZSwgTGF5b3V0LCBjcmVhdGUsIGRlcHMpO1xufVxuXG5mdW5jdGlvbiBpbXBlcmF0aXZlSGFuZGxlRWZmZWN0KGNyZWF0ZSwgcmVmKSB7XG4gIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIHJlZkNhbGxiYWNrID0gcmVmO1xuXG4gICAgdmFyIF9pbnN0ID0gY3JlYXRlKCk7XG5cbiAgICByZWZDYWxsYmFjayhfaW5zdCk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlZkNhbGxiYWNrKG51bGwpO1xuICAgIH07XG4gIH0gZWxzZSBpZiAocmVmICE9PSBudWxsICYmIHJlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIHJlZk9iamVjdCA9IHJlZjtcblxuICAgIHtcbiAgICAgIGlmICghcmVmT2JqZWN0Lmhhc093blByb3BlcnR5KCdjdXJyZW50JykpIHtcbiAgICAgICAgZXJyb3IoJ0V4cGVjdGVkIHVzZUltcGVyYXRpdmVIYW5kbGUoKSBmaXJzdCBhcmd1bWVudCB0byBlaXRoZXIgYmUgYSAnICsgJ3JlZiBjYWxsYmFjayBvciBSZWFjdC5jcmVhdGVSZWYoKSBvYmplY3QuIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsICdhbiBvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMocmVmT2JqZWN0KS5qb2luKCcsICcpICsgJ30nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgX2luc3QyID0gY3JlYXRlKCk7XG5cbiAgICByZWZPYmplY3QuY3VycmVudCA9IF9pbnN0MjtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmVmT2JqZWN0LmN1cnJlbnQgPSBudWxsO1xuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGNyZWF0ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIHVzZUltcGVyYXRpdmVIYW5kbGUoKSBzZWNvbmQgYXJndW1lbnQgdG8gYmUgYSBmdW5jdGlvbiAnICsgJ3RoYXQgY3JlYXRlcyBhIGhhbmRsZS4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY3JlYXRlICE9PSBudWxsID8gdHlwZW9mIGNyZWF0ZSA6ICdudWxsJyk7XG4gICAgfVxuICB9IC8vIFRPRE86IElmIGRlcHMgYXJlIHByb3ZpZGVkLCBzaG91bGQgd2Ugc2tpcCBjb21wYXJpbmcgdGhlIHJlZiBpdHNlbGY/XG5cblxuICB2YXIgZWZmZWN0RGVwcyA9IGRlcHMgIT09IG51bGwgJiYgZGVwcyAhPT0gdW5kZWZpbmVkID8gZGVwcy5jb25jYXQoW3JlZl0pIDogbnVsbDtcbiAgdmFyIGZpYmVyRmxhZ3MgPSBVcGRhdGU7XG5cbiAge1xuICAgIGZpYmVyRmxhZ3MgfD0gTGF5b3V0U3RhdGljO1xuICB9XG5cbiAgaWYgKCAoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICBmaWJlckZsYWdzIHw9IE1vdW50TGF5b3V0RGV2O1xuICB9XG5cbiAgcmV0dXJuIG1vdW50RWZmZWN0SW1wbChmaWJlckZsYWdzLCBMYXlvdXQsIGltcGVyYXRpdmVIYW5kbGVFZmZlY3QuYmluZChudWxsLCBjcmVhdGUsIHJlZiksIGVmZmVjdERlcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGNyZWF0ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIHVzZUltcGVyYXRpdmVIYW5kbGUoKSBzZWNvbmQgYXJndW1lbnQgdG8gYmUgYSBmdW5jdGlvbiAnICsgJ3RoYXQgY3JlYXRlcyBhIGhhbmRsZS4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY3JlYXRlICE9PSBudWxsID8gdHlwZW9mIGNyZWF0ZSA6ICdudWxsJyk7XG4gICAgfVxuICB9IC8vIFRPRE86IElmIGRlcHMgYXJlIHByb3ZpZGVkLCBzaG91bGQgd2Ugc2tpcCBjb21wYXJpbmcgdGhlIHJlZiBpdHNlbGY/XG5cblxuICB2YXIgZWZmZWN0RGVwcyA9IGRlcHMgIT09IG51bGwgJiYgZGVwcyAhPT0gdW5kZWZpbmVkID8gZGVwcy5jb25jYXQoW3JlZl0pIDogbnVsbDtcbiAgcmV0dXJuIHVwZGF0ZUVmZmVjdEltcGwoVXBkYXRlLCBMYXlvdXQsIGltcGVyYXRpdmVIYW5kbGVFZmZlY3QuYmluZChudWxsLCBjcmVhdGUsIHJlZiksIGVmZmVjdERlcHMpO1xufVxuXG5mdW5jdGlvbiBtb3VudERlYnVnVmFsdWUodmFsdWUsIGZvcm1hdHRlckZuKSB7Ly8gVGhpcyBob29rIGlzIG5vcm1hbGx5IGEgbm8tb3AuXG4gIC8vIFRoZSByZWFjdC1kZWJ1Zy1ob29rcyBwYWNrYWdlIGluamVjdHMgaXRzIG93biBpbXBsZW1lbnRhdGlvblxuICAvLyBzbyB0aGF0IGUuZy4gRGV2VG9vbHMgY2FuIGRpc3BsYXkgY3VzdG9tIGhvb2sgdmFsdWVzLlxufVxuXG52YXIgdXBkYXRlRGVidWdWYWx1ZSA9IG1vdW50RGVidWdWYWx1ZTtcblxuZnVuY3Rpb24gbW91bnRDYWxsYmFjayhjYWxsYmFjaywgZGVwcykge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBbY2FsbGJhY2ssIG5leHREZXBzXTtcbiAgcmV0dXJuIGNhbGxiYWNrO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcykge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgdmFyIHByZXZTdGF0ZSA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgaWYgKG5leHREZXBzICE9PSBudWxsKSB7XG4gICAgICB2YXIgcHJldkRlcHMgPSBwcmV2U3RhdGVbMV07XG5cbiAgICAgIGlmIChhcmVIb29rSW5wdXRzRXF1YWwobmV4dERlcHMsIHByZXZEZXBzKSkge1xuICAgICAgICByZXR1cm4gcHJldlN0YXRlWzBdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IFtjYWxsYmFjaywgbmV4dERlcHNdO1xuICByZXR1cm4gY2FsbGJhY2s7XG59XG5cbmZ1bmN0aW9uIG1vdW50TWVtbyhuZXh0Q3JlYXRlLCBkZXBzKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIHZhciBuZXh0VmFsdWUgPSBuZXh0Q3JlYXRlKCk7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IFtuZXh0VmFsdWUsIG5leHREZXBzXTtcbiAgcmV0dXJuIG5leHRWYWx1ZTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTWVtbyhuZXh0Q3JlYXRlLCBkZXBzKSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzO1xuICB2YXIgcHJldlN0YXRlID0gaG9vay5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChwcmV2U3RhdGUgIT09IG51bGwpIHtcbiAgICAvLyBBc3N1bWUgdGhlc2UgYXJlIGRlZmluZWQuIElmIHRoZXkncmUgbm90LCBhcmVIb29rSW5wdXRzRXF1YWwgd2lsbCB3YXJuLlxuICAgIGlmIChuZXh0RGVwcyAhPT0gbnVsbCkge1xuICAgICAgdmFyIHByZXZEZXBzID0gcHJldlN0YXRlWzFdO1xuXG4gICAgICBpZiAoYXJlSG9va0lucHV0c0VxdWFsKG5leHREZXBzLCBwcmV2RGVwcykpIHtcbiAgICAgICAgcmV0dXJuIHByZXZTdGF0ZVswXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgbmV4dFZhbHVlID0gbmV4dENyZWF0ZSgpO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBbbmV4dFZhbHVlLCBuZXh0RGVwc107XG4gIHJldHVybiBuZXh0VmFsdWU7XG59XG5cbmZ1bmN0aW9uIG1vdW50RGVmZXJyZWRWYWx1ZSh2YWx1ZSkge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHZhbHVlO1xuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZURlZmVycmVkVmFsdWUodmFsdWUpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIHJlc29sdmVkQ3VycmVudEhvb2sgPSBjdXJyZW50SG9vaztcbiAgdmFyIHByZXZWYWx1ZSA9IHJlc29sdmVkQ3VycmVudEhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgcmV0dXJuIHVwZGF0ZURlZmVycmVkVmFsdWVJbXBsKGhvb2ssIHByZXZWYWx1ZSwgdmFsdWUpO1xufVxuXG5mdW5jdGlvbiByZXJlbmRlckRlZmVycmVkVmFsdWUodmFsdWUpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcblxuICBpZiAoY3VycmVudEhvb2sgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIGEgcmVyZW5kZXIgZHVyaW5nIGEgbW91bnQuXG4gICAgaG9vay5tZW1vaXplZFN0YXRlID0gdmFsdWU7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaXMgYSByZXJlbmRlciBkdXJpbmcgYW4gdXBkYXRlLlxuICAgIHZhciBwcmV2VmFsdWUgPSBjdXJyZW50SG9vay5tZW1vaXplZFN0YXRlO1xuICAgIHJldHVybiB1cGRhdGVEZWZlcnJlZFZhbHVlSW1wbChob29rLCBwcmV2VmFsdWUsIHZhbHVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVEZWZlcnJlZFZhbHVlSW1wbChob29rLCBwcmV2VmFsdWUsIHZhbHVlKSB7XG4gIHZhciBzaG91bGREZWZlclZhbHVlID0gIWluY2x1ZGVzT25seU5vblVyZ2VudExhbmVzKHJlbmRlckxhbmVzKTtcblxuICBpZiAoc2hvdWxkRGVmZXJWYWx1ZSkge1xuICAgIC8vIFRoaXMgaXMgYW4gdXJnZW50IHVwZGF0ZS4gSWYgdGhlIHZhbHVlIGhhcyBjaGFuZ2VkLCBrZWVwIHVzaW5nIHRoZVxuICAgIC8vIHByZXZpb3VzIHZhbHVlIGFuZCBzcGF3biBhIGRlZmVycmVkIHJlbmRlciB0byB1cGRhdGUgaXQgbGF0ZXIuXG4gICAgaWYgKCFvYmplY3RJcyh2YWx1ZSwgcHJldlZhbHVlKSkge1xuICAgICAgLy8gU2NoZWR1bGUgYSBkZWZlcnJlZCByZW5kZXJcbiAgICAgIHZhciBkZWZlcnJlZExhbmUgPSBjbGFpbU5leHRUcmFuc2l0aW9uTGFuZSgpO1xuICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5sYW5lcyA9IG1lcmdlTGFuZXMoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5sYW5lcywgZGVmZXJyZWRMYW5lKTtcbiAgICAgIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXMoZGVmZXJyZWRMYW5lKTsgLy8gU2V0IHRoaXMgdG8gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSByZW5kZXJlZCB2YWx1ZSBpcyBpbmNvbnNpc3RlbnRcbiAgICAgIC8vIGZyb20gdGhlIGxhdGVzdCB2YWx1ZS4gVGhlIG5hbWUgXCJiYXNlU3RhdGVcIiBkb2Vzbid0IHJlYWxseSBtYXRjaCBob3cgd2VcbiAgICAgIC8vIHVzZSBpdCBiZWNhdXNlIHdlJ3JlIHJldXNpbmcgYSBzdGF0ZSBob29rIGZpZWxkIGluc3RlYWQgb2YgY3JlYXRpbmcgYVxuICAgICAgLy8gbmV3IG9uZS5cblxuICAgICAgaG9vay5iYXNlU3RhdGUgPSB0cnVlO1xuICAgIH0gLy8gUmV1c2UgdGhlIHByZXZpb3VzIHZhbHVlXG5cblxuICAgIHJldHVybiBwcmV2VmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyBub3QgYW4gdXJnZW50IHVwZGF0ZSwgc28gd2UgY2FuIHVzZSB0aGUgbGF0ZXN0IHZhbHVlIHJlZ2FyZGxlc3NcbiAgICAvLyBvZiB3aGF0IGl0IGlzLiBObyBuZWVkIHRvIGRlZmVyIGl0LlxuICAgIC8vIEhvd2V2ZXIsIGlmIHdlJ3JlIGN1cnJlbnRseSBpbnNpZGUgYSBzcGF3bmVkIHJlbmRlciwgdGhlbiB3ZSBuZWVkIHRvIG1hcmtcbiAgICAvLyB0aGlzIGFzIGFuIHVwZGF0ZSB0byBwcmV2ZW50IHRoZSBmaWJlciBmcm9tIGJhaWxpbmcgb3V0LlxuICAgIC8vXG4gICAgLy8gYGJhc2VTdGF0ZWAgaXMgdHJ1ZSB3aGVuIHRoZSBjdXJyZW50IHZhbHVlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSByZW5kZXJlZFxuICAgIC8vIHZhbHVlLiBUaGUgbmFtZSBkb2Vzbid0IHJlYWxseSBtYXRjaCBob3cgd2UgdXNlIGl0IGJlY2F1c2Ugd2UncmUgcmV1c2luZ1xuICAgIC8vIGEgc3RhdGUgaG9vayBmaWVsZCBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG9uZS5cbiAgICBpZiAoaG9vay5iYXNlU3RhdGUpIHtcbiAgICAgIC8vIEZsaXAgdGhpcyBiYWNrIHRvIGZhbHNlLlxuICAgICAgaG9vay5iYXNlU3RhdGUgPSBmYWxzZTtcbiAgICAgIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCk7XG4gICAgfVxuXG4gICAgaG9vay5tZW1vaXplZFN0YXRlID0gdmFsdWU7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0YXJ0VHJhbnNpdGlvbihzZXRQZW5kaW5nLCBjYWxsYmFjaywgb3B0aW9ucykge1xuICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoaGlnaGVyRXZlbnRQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5LCBDb250aW51b3VzRXZlbnRQcmlvcml0eSkpO1xuICBzZXRQZW5kaW5nKHRydWUpO1xuICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQyLnRyYW5zaXRpb247XG4gIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDIudHJhbnNpdGlvbiA9IHt9O1xuICB2YXIgY3VycmVudFRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQyLnRyYW5zaXRpb247XG5cbiAge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDIudHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycyA9IG5ldyBTZXQoKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgc2V0UGVuZGluZyhmYWxzZSk7XG4gICAgY2FsbGJhY2soKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSk7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMi50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG5cbiAgICB7XG4gICAgICBpZiAocHJldlRyYW5zaXRpb24gPT09IG51bGwgJiYgY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMpIHtcbiAgICAgICAgdmFyIHVwZGF0ZWRGaWJlcnNDb3VudCA9IGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzLnNpemU7XG5cbiAgICAgICAgaWYgKHVwZGF0ZWRGaWJlcnNDb3VudCA+IDEwKSB7XG4gICAgICAgICAgd2FybignRGV0ZWN0ZWQgYSBsYXJnZSBudW1iZXIgb2YgdXBkYXRlcyBpbnNpZGUgc3RhcnRUcmFuc2l0aW9uLiAnICsgJ0lmIHRoaXMgaXMgZHVlIHRvIGEgc3Vic2NyaXB0aW9uIHBsZWFzZSByZS13cml0ZSBpdCB0byB1c2UgUmVhY3QgcHJvdmlkZWQgaG9va3MuICcgKyAnT3RoZXJ3aXNlIGNvbmN1cnJlbnQgbW9kZSBndWFyYW50ZWVzIGFyZSBvZmYgdGhlIHRhYmxlLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMuY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRUcmFuc2l0aW9uKCkge1xuICB2YXIgX21vdW50U3RhdGUgPSBtb3VudFN0YXRlKGZhbHNlKSxcbiAgICAgIGlzUGVuZGluZyA9IF9tb3VudFN0YXRlWzBdLFxuICAgICAgc2V0UGVuZGluZyA9IF9tb3VudFN0YXRlWzFdOyAvLyBUaGUgYHN0YXJ0YCBtZXRob2QgbmV2ZXIgY2hhbmdlcy5cblxuXG4gIHZhciBzdGFydCA9IHN0YXJ0VHJhbnNpdGlvbi5iaW5kKG51bGwsIHNldFBlbmRpbmcpO1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHN0YXJ0O1xuICByZXR1cm4gW2lzUGVuZGluZywgc3RhcnRdO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVUcmFuc2l0aW9uKCkge1xuICB2YXIgX3VwZGF0ZVN0YXRlID0gdXBkYXRlU3RhdGUoKSxcbiAgICAgIGlzUGVuZGluZyA9IF91cGRhdGVTdGF0ZVswXTtcblxuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgc3RhcnQgPSBob29rLm1lbW9pemVkU3RhdGU7XG4gIHJldHVybiBbaXNQZW5kaW5nLCBzdGFydF07XG59XG5cbmZ1bmN0aW9uIHJlcmVuZGVyVHJhbnNpdGlvbigpIHtcbiAgdmFyIF9yZXJlbmRlclN0YXRlID0gcmVyZW5kZXJTdGF0ZSgpLFxuICAgICAgaXNQZW5kaW5nID0gX3JlcmVuZGVyU3RhdGVbMF07XG5cbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIHN0YXJ0ID0gaG9vay5tZW1vaXplZFN0YXRlO1xuICByZXR1cm4gW2lzUGVuZGluZywgc3RhcnRdO1xufVxuXG52YXIgaXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZSA9IGZhbHNlO1xuZnVuY3Rpb24gZ2V0SXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZUluREVWKCkge1xuICB7XG4gICAgcmV0dXJuIGlzVXBkYXRpbmdPcGFxdWVWYWx1ZUluUmVuZGVyUGhhc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRJZCgpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgcm9vdCA9IGdldFdvcmtJblByb2dyZXNzUm9vdCgpOyAvLyBUT0RPOiBJbiBGaXp6LCBpZCBnZW5lcmF0aW9uIGlzIHNwZWNpZmljIHRvIGVhY2ggc2VydmVyIGNvbmZpZy4gTWF5YmUgd2VcbiAgLy8gc2hvdWxkIGRvIHRoaXMgaW4gRmliZXIsIHRvbz8gRGVmZXJyaW5nIHRoaXMgZGVjaXNpb24gZm9yIG5vdyBiZWNhdXNlXG4gIC8vIHRoZXJlJ3Mgbm8gb3RoZXIgcGxhY2UgdG8gc3RvcmUgdGhlIHByZWZpeCBleGNlcHQgZm9yIGFuIGludGVybmFsIGZpZWxkIG9uXG4gIC8vIHRoZSBwdWJsaWMgY3JlYXRlUm9vdCBvYmplY3QsIHdoaWNoIHRoZSBmaWJlciB0cmVlIGRvZXMgbm90IGN1cnJlbnRseSBoYXZlXG4gIC8vIGEgcmVmZXJlbmNlIHRvLlxuXG4gIHZhciBpZGVudGlmaWVyUHJlZml4ID0gcm9vdC5pZGVudGlmaWVyUHJlZml4O1xuICB2YXIgaWQ7XG5cbiAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICB2YXIgdHJlZUlkID0gZ2V0VHJlZUlkKCk7IC8vIFVzZSBhIGNhcHRpYWwgUiBwcmVmaXggZm9yIHNlcnZlci1nZW5lcmF0ZWQgaWRzLlxuXG4gICAgaWQgPSAnOicgKyBpZGVudGlmaWVyUHJlZml4ICsgJ1InICsgdHJlZUlkOyAvLyBVbmxlc3MgdGhpcyBpcyB0aGUgZmlyc3QgaWQgYXQgdGhpcyBsZXZlbCwgYXBwZW5kIGEgbnVtYmVyIGF0IHRoZSBlbmRcbiAgICAvLyB0aGF0IHJlcHJlc2VudHMgdGhlIHBvc2l0aW9uIG9mIHRoaXMgdXNlSWQgaG9vayBhbW9uZyBhbGwgdGhlIHVzZUlkXG4gICAgLy8gaG9va3MgZm9yIHRoaXMgZmliZXIuXG5cbiAgICB2YXIgbG9jYWxJZCA9IGxvY2FsSWRDb3VudGVyKys7XG5cbiAgICBpZiAobG9jYWxJZCA+IDApIHtcbiAgICAgIGlkICs9ICdIJyArIGxvY2FsSWQudG9TdHJpbmcoMzIpO1xuICAgIH1cblxuICAgIGlkICs9ICc6JztcbiAgfSBlbHNlIHtcbiAgICAvLyBVc2UgYSBsb3dlcmNhc2UgciBwcmVmaXggZm9yIGNsaWVudC1nZW5lcmF0ZWQgaWRzLlxuICAgIHZhciBnbG9iYWxDbGllbnRJZCA9IGdsb2JhbENsaWVudElkQ291bnRlcisrO1xuICAgIGlkID0gJzonICsgaWRlbnRpZmllclByZWZpeCArICdyJyArIGdsb2JhbENsaWVudElkLnRvU3RyaW5nKDMyKSArICc6JztcbiAgfVxuXG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IGlkO1xuICByZXR1cm4gaWQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUlkKCkge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgaWQgPSBob29rLm1lbW9pemVkU3RhdGU7XG4gIHJldHVybiBpZDtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hSZWR1Y2VyQWN0aW9uKGZpYmVyLCBxdWV1ZSwgYWN0aW9uKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1szXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoXCJTdGF0ZSB1cGRhdGVzIGZyb20gdGhlIHVzZVN0YXRlKCkgYW5kIHVzZVJlZHVjZXIoKSBIb29rcyBkb24ndCBzdXBwb3J0IHRoZSBcIiArICdzZWNvbmQgY2FsbGJhY2sgYXJndW1lbnQuIFRvIGV4ZWN1dGUgYSBzaWRlIGVmZmVjdCBhZnRlciAnICsgJ3JlbmRlcmluZywgZGVjbGFyZSBpdCBpbiB0aGUgY29tcG9uZW50IGJvZHkgd2l0aCB1c2VFZmZlY3QoKS4nKTtcbiAgICB9XG4gIH1cblxuICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgdmFyIHVwZGF0ZSA9IHtcbiAgICBsYW5lOiBsYW5lLFxuICAgIGFjdGlvbjogYWN0aW9uLFxuICAgIGhhc0VhZ2VyU3RhdGU6IGZhbHNlLFxuICAgIGVhZ2VyU3RhdGU6IG51bGwsXG4gICAgbmV4dDogbnVsbFxuICB9O1xuXG4gIGlmIChpc1JlbmRlclBoYXNlVXBkYXRlKGZpYmVyKSkge1xuICAgIGVucXVldWVSZW5kZXJQaGFzZVVwZGF0ZShxdWV1ZSwgdXBkYXRlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50SG9va1VwZGF0ZShmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgICAgIGVudGFuZ2xlVHJhbnNpdGlvblVwZGF0ZShyb290LCBxdWV1ZSwgbGFuZSk7XG4gICAgfVxuICB9XG5cbiAgbWFya1VwZGF0ZUluRGV2VG9vbHMoZmliZXIsIGxhbmUpO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaFNldFN0YXRlKGZpYmVyLCBxdWV1ZSwgYWN0aW9uKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1szXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoXCJTdGF0ZSB1cGRhdGVzIGZyb20gdGhlIHVzZVN0YXRlKCkgYW5kIHVzZVJlZHVjZXIoKSBIb29rcyBkb24ndCBzdXBwb3J0IHRoZSBcIiArICdzZWNvbmQgY2FsbGJhY2sgYXJndW1lbnQuIFRvIGV4ZWN1dGUgYSBzaWRlIGVmZmVjdCBhZnRlciAnICsgJ3JlbmRlcmluZywgZGVjbGFyZSBpdCBpbiB0aGUgY29tcG9uZW50IGJvZHkgd2l0aCB1c2VFZmZlY3QoKS4nKTtcbiAgICB9XG4gIH1cblxuICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgdmFyIHVwZGF0ZSA9IHtcbiAgICBsYW5lOiBsYW5lLFxuICAgIGFjdGlvbjogYWN0aW9uLFxuICAgIGhhc0VhZ2VyU3RhdGU6IGZhbHNlLFxuICAgIGVhZ2VyU3RhdGU6IG51bGwsXG4gICAgbmV4dDogbnVsbFxuICB9O1xuXG4gIGlmIChpc1JlbmRlclBoYXNlVXBkYXRlKGZpYmVyKSkge1xuICAgIGVucXVldWVSZW5kZXJQaGFzZVVwZGF0ZShxdWV1ZSwgdXBkYXRlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGZpYmVyLmxhbmVzID09PSBOb0xhbmVzICYmIChhbHRlcm5hdGUgPT09IG51bGwgfHwgYWx0ZXJuYXRlLmxhbmVzID09PSBOb0xhbmVzKSkge1xuICAgICAgLy8gVGhlIHF1ZXVlIGlzIGN1cnJlbnRseSBlbXB0eSwgd2hpY2ggbWVhbnMgd2UgY2FuIGVhZ2VybHkgY29tcHV0ZSB0aGVcbiAgICAgIC8vIG5leHQgc3RhdGUgYmVmb3JlIGVudGVyaW5nIHRoZSByZW5kZXIgcGhhc2UuIElmIHRoZSBuZXcgc3RhdGUgaXMgdGhlXG4gICAgICAvLyBzYW1lIGFzIHRoZSBjdXJyZW50IHN0YXRlLCB3ZSBtYXkgYmUgYWJsZSB0byBiYWlsIG91dCBlbnRpcmVseS5cbiAgICAgIHZhciBsYXN0UmVuZGVyZWRSZWR1Y2VyID0gcXVldWUubGFzdFJlbmRlcmVkUmVkdWNlcjtcblxuICAgICAgaWYgKGxhc3RSZW5kZXJlZFJlZHVjZXIgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIHByZXZEaXNwYXRjaGVyO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBjdXJyZW50U3RhdGUgPSBxdWV1ZS5sYXN0UmVuZGVyZWRTdGF0ZTtcbiAgICAgICAgICB2YXIgZWFnZXJTdGF0ZSA9IGxhc3RSZW5kZXJlZFJlZHVjZXIoY3VycmVudFN0YXRlLCBhY3Rpb24pOyAvLyBTdGFzaCB0aGUgZWFnZXJseSBjb21wdXRlZCBzdGF0ZSwgYW5kIHRoZSByZWR1Y2VyIHVzZWQgdG8gY29tcHV0ZVxuICAgICAgICAgIC8vIGl0LCBvbiB0aGUgdXBkYXRlIG9iamVjdC4gSWYgdGhlIHJlZHVjZXIgaGFzbid0IGNoYW5nZWQgYnkgdGhlXG4gICAgICAgICAgLy8gdGltZSB3ZSBlbnRlciB0aGUgcmVuZGVyIHBoYXNlLCB0aGVuIHRoZSBlYWdlciBzdGF0ZSBjYW4gYmUgdXNlZFxuICAgICAgICAgIC8vIHdpdGhvdXQgY2FsbGluZyB0aGUgcmVkdWNlciBhZ2Fpbi5cblxuICAgICAgICAgIHVwZGF0ZS5oYXNFYWdlclN0YXRlID0gdHJ1ZTtcbiAgICAgICAgICB1cGRhdGUuZWFnZXJTdGF0ZSA9IGVhZ2VyU3RhdGU7XG5cbiAgICAgICAgICBpZiAob2JqZWN0SXMoZWFnZXJTdGF0ZSwgY3VycmVudFN0YXRlKSkge1xuICAgICAgICAgICAgLy8gRmFzdCBwYXRoLiBXZSBjYW4gYmFpbCBvdXQgd2l0aG91dCBzY2hlZHVsaW5nIFJlYWN0IHRvIHJlLXJlbmRlci5cbiAgICAgICAgICAgIC8vIEl0J3Mgc3RpbGwgcG9zc2libGUgdGhhdCB3ZSdsbCBuZWVkIHRvIHJlYmFzZSB0aGlzIHVwZGF0ZSBsYXRlcixcbiAgICAgICAgICAgIC8vIGlmIHRoZSBjb21wb25lbnQgcmUtcmVuZGVycyBmb3IgYSBkaWZmZXJlbnQgcmVhc29uIGFuZCBieSB0aGF0XG4gICAgICAgICAgICAvLyB0aW1lIHRoZSByZWR1Y2VyIGhhcyBjaGFuZ2VkLlxuICAgICAgICAgICAgLy8gVE9ETzogRG8gd2Ugc3RpbGwgbmVlZCB0byBlbnRhbmdsZSB0cmFuc2l0aW9ucyBpbiB0aGlzIGNhc2U/XG4gICAgICAgICAgICBlbnF1ZXVlQ29uY3VycmVudEhvb2tVcGRhdGVBbmRFYWdlcmx5QmFpbG91dChmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikgey8vIFN1cHByZXNzIHRoZSBlcnJvci4gSXQgd2lsbCB0aHJvdyBhZ2FpbiBpbiB0aGUgcmVuZGVyIHBoYXNlLlxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudEhvb2tVcGRhdGUoZmliZXIsIHF1ZXVlLCB1cGRhdGUsIGxhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gICAgICBlbnRhbmdsZVRyYW5zaXRpb25VcGRhdGUocm9vdCwgcXVldWUsIGxhbmUpO1xuICAgIH1cbiAgfVxuXG4gIG1hcmtVcGRhdGVJbkRldlRvb2xzKGZpYmVyLCBsYW5lKTtcbn1cblxuZnVuY3Rpb24gaXNSZW5kZXJQaGFzZVVwZGF0ZShmaWJlcikge1xuICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuICByZXR1cm4gZmliZXIgPT09IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEgfHwgYWx0ZXJuYXRlICE9PSBudWxsICYmIGFsdGVybmF0ZSA9PT0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMTtcbn1cblxuZnVuY3Rpb24gZW5xdWV1ZVJlbmRlclBoYXNlVXBkYXRlKHF1ZXVlLCB1cGRhdGUpIHtcbiAgLy8gVGhpcyBpcyBhIHJlbmRlciBwaGFzZSB1cGRhdGUuIFN0YXNoIGl0IGluIGEgbGF6aWx5LWNyZWF0ZWQgbWFwIG9mXG4gIC8vIHF1ZXVlIC0+IGxpbmtlZCBsaXN0IG9mIHVwZGF0ZXMuIEFmdGVyIHRoaXMgcmVuZGVyIHBhc3MsIHdlJ2xsIHJlc3RhcnRcbiAgLy8gYW5kIGFwcGx5IHRoZSBzdGFzaGVkIHVwZGF0ZXMgb24gdG9wIG9mIHRoZSB3b3JrLWluLXByb2dyZXNzIGhvb2suXG4gIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyA9IGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSB0cnVlO1xuICB2YXIgcGVuZGluZyA9IHF1ZXVlLnBlbmRpbmc7XG5cbiAgaWYgKHBlbmRpbmcgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUuIENyZWF0ZSBhIGNpcmN1bGFyIGxpc3QuXG4gICAgdXBkYXRlLm5leHQgPSB1cGRhdGU7XG4gIH0gZWxzZSB7XG4gICAgdXBkYXRlLm5leHQgPSBwZW5kaW5nLm5leHQ7XG4gICAgcGVuZGluZy5uZXh0ID0gdXBkYXRlO1xuICB9XG5cbiAgcXVldWUucGVuZGluZyA9IHVwZGF0ZTtcbn0gLy8gVE9ETzogTW92ZSB0byBSZWFjdEZpYmVyQ29uY3VycmVudFVwZGF0ZXM/XG5cblxuZnVuY3Rpb24gZW50YW5nbGVUcmFuc2l0aW9uVXBkYXRlKHJvb3QsIHF1ZXVlLCBsYW5lKSB7XG4gIGlmIChpc1RyYW5zaXRpb25MYW5lKGxhbmUpKSB7XG4gICAgdmFyIHF1ZXVlTGFuZXMgPSBxdWV1ZS5sYW5lczsgLy8gSWYgYW55IGVudGFuZ2xlZCBsYW5lcyBhcmUgbm8gbG9uZ2VyIHBlbmRpbmcgb24gdGhlIHJvb3QsIHRoZW4gdGhleVxuICAgIC8vIG11c3QgaGF2ZSBmaW5pc2hlZC4gV2UgY2FuIHJlbW92ZSB0aGVtIGZyb20gdGhlIHNoYXJlZCBxdWV1ZSwgd2hpY2hcbiAgICAvLyByZXByZXNlbnRzIGEgc3VwZXJzZXQgb2YgdGhlIGFjdHVhbGx5IHBlbmRpbmcgbGFuZXMuIEluIHNvbWUgY2FzZXMgd2VcbiAgICAvLyBtYXkgZW50YW5nbGUgbW9yZSB0aGFuIHdlIG5lZWQgdG8sIGJ1dCB0aGF0J3MgT0suIEluIGZhY3QgaXQncyB3b3JzZSBpZlxuICAgIC8vIHdlICpkb24ndCogZW50YW5nbGUgd2hlbiB3ZSBzaG91bGQuXG5cbiAgICBxdWV1ZUxhbmVzID0gaW50ZXJzZWN0TGFuZXMocXVldWVMYW5lcywgcm9vdC5wZW5kaW5nTGFuZXMpOyAvLyBFbnRhbmdsZSB0aGUgbmV3IHRyYW5zaXRpb24gbGFuZSB3aXRoIHRoZSBvdGhlciB0cmFuc2l0aW9uIGxhbmVzLlxuXG4gICAgdmFyIG5ld1F1ZXVlTGFuZXMgPSBtZXJnZUxhbmVzKHF1ZXVlTGFuZXMsIGxhbmUpO1xuICAgIHF1ZXVlLmxhbmVzID0gbmV3UXVldWVMYW5lczsgLy8gRXZlbiBpZiBxdWV1ZS5sYW5lcyBhbHJlYWR5IGluY2x1ZGUgbGFuZSwgd2UgZG9uJ3Qga25vdyBmb3IgY2VydGFpbiBpZlxuICAgIC8vIHRoZSBsYW5lIGZpbmlzaGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgd2UgZW50YW5nbGVkIGl0LiBTbyB3ZSBuZWVkIHRvXG4gICAgLy8gZW50YW5nbGUgaXQgYWdhaW4sIGp1c3QgdG8gYmUgc3VyZS5cblxuICAgIG1hcmtSb290RW50YW5nbGVkKHJvb3QsIG5ld1F1ZXVlTGFuZXMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtVcGRhdGVJbkRldlRvb2xzKGZpYmVyLCBsYW5lLCBhY3Rpb24pIHtcblxuICB7XG4gICAgbWFya1N0YXRlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKTtcbiAgfVxufVxuXG52YXIgQ29udGV4dE9ubHlEaXNwYXRjaGVyID0ge1xuICByZWFkQ29udGV4dDogcmVhZENvbnRleHQsXG4gIHVzZUNhbGxiYWNrOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUNvbnRleHQ6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlRWZmZWN0OiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUltcGVyYXRpdmVIYW5kbGU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlSW5zZXJ0aW9uRWZmZWN0OiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUxheW91dEVmZmVjdDogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VNZW1vOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZVJlZHVjZXI6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlUmVmOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZVN0YXRlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZURlYnVnVmFsdWU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlRGVmZXJyZWRWYWx1ZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VUcmFuc2l0aW9uOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZU11dGFibGVTb3VyY2U6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlU3luY0V4dGVybmFsU3RvcmU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlSWQ6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG59O1xuXG52YXIgSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWID0gbnVsbDtcbnZhciBIb29rc0Rpc3BhdGNoZXJPbk1vdW50V2l0aEhvb2tUeXBlc0luREVWID0gbnVsbDtcbnZhciBIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWID0gbnVsbDtcbnZhciBIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgPSBudWxsO1xudmFyIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVYgPSBudWxsO1xudmFyIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWID0gbnVsbDtcbnZhciBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWID0gbnVsbDtcblxue1xuICB2YXIgd2FybkludmFsaWRDb250ZXh0QWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgIGVycm9yKCdDb250ZXh0IGNhbiBvbmx5IGJlIHJlYWQgd2hpbGUgUmVhY3QgaXMgcmVuZGVyaW5nLiAnICsgJ0luIGNsYXNzZXMsIHlvdSBjYW4gcmVhZCBpdCBpbiB0aGUgcmVuZGVyIG1ldGhvZCBvciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuICcgKyAnSW4gZnVuY3Rpb24gY29tcG9uZW50cywgeW91IGNhbiByZWFkIGl0IGRpcmVjdGx5IGluIHRoZSBmdW5jdGlvbiBib2R5LCBidXQgbm90ICcgKyAnaW5zaWRlIEhvb2tzIGxpa2UgdXNlUmVkdWNlcigpIG9yIHVzZU1lbW8oKS4nKTtcbiAgfTtcblxuICB2YXIgd2FybkludmFsaWRIb29rQWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgIGVycm9yKCdEbyBub3QgY2FsbCBIb29rcyBpbnNpZGUgdXNlRWZmZWN0KC4uLiksIHVzZU1lbW8oLi4uKSwgb3Igb3RoZXIgYnVpbHQtaW4gSG9va3MuICcgKyAnWW91IGNhbiBvbmx5IGNhbGwgSG9va3MgYXQgdGhlIHRvcCBsZXZlbCBvZiB5b3VyIFJlYWN0IGZ1bmN0aW9uLiAnICsgJ0ZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvcnVsZXMtb2YtaG9va3MnKTtcbiAgfTtcblxuICBIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICByZXR1cm4gbW91bnRDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpO1xuICAgICAgcmV0dXJuIG1vdW50RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpO1xuICAgICAgcmV0dXJuIG1vdW50SW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICByZXR1cm4gbW91bnRJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHJldHVybiBtb3VudExheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTWVtbzogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50TWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50UmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50UmVmKGluaXRpYWxWYWx1ZSk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudERlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRNdXRhYmxlU291cmNlKCk7XG4gICAgfSxcbiAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTeW5jRXh0ZXJuYWxTdG9yZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50U3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpO1xuICAgIH0sXG4gICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRJZCgpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG5cbiAgSG9va3NEaXNwYXRjaGVyT25Nb3VudFdpdGhIb29rVHlwZXNJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50Q2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50SW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudEluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50TWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRSZWYoaW5pdGlhbFZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50TXV0YWJsZVNvdXJjZSgpO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCk7XG4gICAgfSxcbiAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSWQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRJZCgpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG5cbiAgSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTWVtbzogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlUmVmKCk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZURlZmVycmVkVmFsdWUodmFsdWUpO1xuICAgIH0sXG4gICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlVHJhbnNpdGlvbic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZU11dGFibGVTb3VyY2UoKTtcbiAgICB9LFxuICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN5bmNFeHRlcm5hbFN0b3JlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QpO1xuICAgIH0sXG4gICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUlkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcblxuICBIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gcmVyZW5kZXJSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVJlZigpO1xuICAgIH0sXG4gICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN0YXRlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiByZXJlbmRlclN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVEZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVyZW5kZXJEZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVyZW5kZXJUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZU11dGFibGVTb3VyY2UoKTtcbiAgICB9LFxuICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN5bmNFeHRlcm5hbFN0b3JlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QpO1xuICAgIH0sXG4gICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUlkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcblxuICBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgd2FybkludmFsaWRDb250ZXh0QWNjZXNzKCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUluc2VydGlvbkVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW5zZXJ0aW9uRWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudEluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50TGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50UmVmKGluaXRpYWxWYWx1ZSk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50TXV0YWJsZVNvdXJjZSgpO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50U3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpO1xuICAgIH0sXG4gICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudElkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcblxuICBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHdhcm5JbnZhbGlkQ29udGV4dEFjY2VzcygpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ2FsbGJhY2snO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVSZWYoKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlU3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlVHJhbnNpdGlvbigpO1xuICAgIH0sXG4gICAgdXNlTXV0YWJsZVNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTXV0YWJsZVNvdXJjZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZU11dGFibGVTb3VyY2UoKTtcbiAgICB9LFxuICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN5bmNFeHRlcm5hbFN0b3JlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCk7XG4gICAgfSxcbiAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSWQnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJZCgpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG5cbiAgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHdhcm5JbnZhbGlkQ29udGV4dEFjY2VzcygpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ2FsbGJhY2snO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHJlcmVuZGVyUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVJlZigpO1xuICAgIH0sXG4gICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN0YXRlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiByZXJlbmRlclN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZURlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlcmVuZGVyRGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVyZW5kZXJUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTXV0YWJsZVNvdXJjZSgpO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90KTtcbiAgICB9LFxuICAgIHVzZUlkOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJZCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUlkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcbn1cblxudmFyIG5vdyQxID0gU2NoZWR1bGVyLnVuc3RhYmxlX25vdztcbnZhciBjb21taXRUaW1lID0gMDtcbnZhciBsYXlvdXRFZmZlY3RTdGFydFRpbWUgPSAtMTtcbnZhciBwcm9maWxlclN0YXJ0VGltZSA9IC0xO1xudmFyIHBhc3NpdmVFZmZlY3RTdGFydFRpbWUgPSAtMTtcbi8qKlxuICogVHJhY2tzIHdoZXRoZXIgdGhlIGN1cnJlbnQgdXBkYXRlIHdhcyBhIG5lc3RlZC9jYXNjYWRpbmcgdXBkYXRlIChzY2hlZHVsZWQgZnJvbSBhIGxheW91dCBlZmZlY3QpLlxuICpcbiAqIFRoZSBvdmVyYWxsIHNlcXVlbmNlIGlzOlxuICogICAxLiByZW5kZXJcbiAqICAgMi4gY29tbWl0IChhbmQgY2FsbCBgb25SZW5kZXJgLCBgb25Db21taXRgKVxuICogICAzLiBjaGVjayBmb3IgbmVzdGVkIHVwZGF0ZXNcbiAqICAgNC4gZmx1c2ggcGFzc2l2ZSBlZmZlY3RzIChhbmQgY2FsbCBgb25Qb3N0Q29tbWl0YClcbiAqXG4gKiBOZXN0ZWQgdXBkYXRlcyBhcmUgaWRlbnRpZmllZCBpbiBzdGVwIDMgYWJvdmUsXG4gKiBidXQgc3RlcCA0IHN0aWxsIGFwcGxpZXMgdG8gdGhlIHdvcmsgdGhhdCB3YXMganVzdCBjb21taXR0ZWQuXG4gKiBXZSB1c2UgdHdvIGZsYWdzIHRvIHRyYWNrIG5lc3RlZCB1cGRhdGVzIHRoZW46XG4gKiBvbmUgdHJhY2tzIHdoZXRoZXIgdGhlIHVwY29taW5nIHVwZGF0ZSBpcyBhIG5lc3RlZCB1cGRhdGUsXG4gKiBhbmQgdGhlIG90aGVyIHRyYWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHVwZGF0ZSB3YXMgYSBuZXN0ZWQgdXBkYXRlLlxuICogVGhlIGZpcnN0IHZhbHVlIGdldHMgc3luY2VkIHRvIHRoZSBzZWNvbmQgYXQgdGhlIHN0YXJ0IG9mIHRoZSByZW5kZXIgcGhhc2UuXG4gKi9cblxudmFyIGN1cnJlbnRVcGRhdGVJc05lc3RlZCA9IGZhbHNlO1xudmFyIG5lc3RlZFVwZGF0ZVNjaGVkdWxlZCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBpc0N1cnJlbnRVcGRhdGVOZXN0ZWQoKSB7XG4gIHJldHVybiBjdXJyZW50VXBkYXRlSXNOZXN0ZWQ7XG59XG5cbmZ1bmN0aW9uIG1hcmtOZXN0ZWRVcGRhdGVTY2hlZHVsZWQoKSB7XG4gIHtcbiAgICBuZXN0ZWRVcGRhdGVTY2hlZHVsZWQgPSB0cnVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc2V0TmVzdGVkVXBkYXRlRmxhZygpIHtcbiAge1xuICAgIGN1cnJlbnRVcGRhdGVJc05lc3RlZCA9IGZhbHNlO1xuICAgIG5lc3RlZFVwZGF0ZVNjaGVkdWxlZCA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN5bmNOZXN0ZWRVcGRhdGVGbGFnKCkge1xuICB7XG4gICAgY3VycmVudFVwZGF0ZUlzTmVzdGVkID0gbmVzdGVkVXBkYXRlU2NoZWR1bGVkO1xuICAgIG5lc3RlZFVwZGF0ZVNjaGVkdWxlZCA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldENvbW1pdFRpbWUoKSB7XG4gIHJldHVybiBjb21taXRUaW1lO1xufVxuXG5mdW5jdGlvbiByZWNvcmRDb21taXRUaW1lKCkge1xuXG4gIGNvbW1pdFRpbWUgPSBub3ckMSgpO1xufVxuXG5mdW5jdGlvbiBzdGFydFByb2ZpbGVyVGltZXIoZmliZXIpIHtcblxuICBwcm9maWxlclN0YXJ0VGltZSA9IG5vdyQxKCk7XG5cbiAgaWYgKGZpYmVyLmFjdHVhbFN0YXJ0VGltZSA8IDApIHtcbiAgICBmaWJlci5hY3R1YWxTdGFydFRpbWUgPSBub3ckMSgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nKGZpYmVyKSB7XG5cbiAgcHJvZmlsZXJTdGFydFRpbWUgPSAtMTtcbn1cblxuZnVuY3Rpb24gc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREZWx0YShmaWJlciwgb3ZlcnJpZGVCYXNlVGltZSkge1xuXG4gIGlmIChwcm9maWxlclN0YXJ0VGltZSA+PSAwKSB7XG4gICAgdmFyIGVsYXBzZWRUaW1lID0gbm93JDEoKSAtIHByb2ZpbGVyU3RhcnRUaW1lO1xuICAgIGZpYmVyLmFjdHVhbER1cmF0aW9uICs9IGVsYXBzZWRUaW1lO1xuXG4gICAgaWYgKG92ZXJyaWRlQmFzZVRpbWUpIHtcbiAgICAgIGZpYmVyLnNlbGZCYXNlRHVyYXRpb24gPSBlbGFwc2VkVGltZTtcbiAgICB9XG5cbiAgICBwcm9maWxlclN0YXJ0VGltZSA9IC0xO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGZpYmVyKSB7XG5cbiAgaWYgKGxheW91dEVmZmVjdFN0YXJ0VGltZSA+PSAwKSB7XG4gICAgdmFyIGVsYXBzZWRUaW1lID0gbm93JDEoKSAtIGxheW91dEVmZmVjdFN0YXJ0VGltZTtcbiAgICBsYXlvdXRFZmZlY3RTdGFydFRpbWUgPSAtMTsgLy8gU3RvcmUgZHVyYXRpb24gb24gdGhlIG5leHQgbmVhcmVzdCBQcm9maWxlciBhbmNlc3RvclxuICAgIC8vIE9yIHRoZSByb290IChmb3IgdGhlIERldlRvb2xzIFByb2ZpbGVyIHRvIHJlYWQpXG5cbiAgICB2YXIgcGFyZW50RmliZXIgPSBmaWJlci5yZXR1cm47XG5cbiAgICB3aGlsZSAocGFyZW50RmliZXIgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAocGFyZW50RmliZXIudGFnKSB7XG4gICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAgdmFyIHJvb3QgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgcm9vdC5lZmZlY3REdXJhdGlvbiArPSBlbGFwc2VkVGltZTtcbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY2FzZSBQcm9maWxlcjpcbiAgICAgICAgICB2YXIgcGFyZW50U3RhdGVOb2RlID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgIHBhcmVudFN0YXRlTm9kZS5lZmZlY3REdXJhdGlvbiArPSBlbGFwc2VkVGltZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIucmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZWNvcmRQYXNzaXZlRWZmZWN0RHVyYXRpb24oZmliZXIpIHtcblxuICBpZiAocGFzc2l2ZUVmZmVjdFN0YXJ0VGltZSA+PSAwKSB7XG4gICAgdmFyIGVsYXBzZWRUaW1lID0gbm93JDEoKSAtIHBhc3NpdmVFZmZlY3RTdGFydFRpbWU7XG4gICAgcGFzc2l2ZUVmZmVjdFN0YXJ0VGltZSA9IC0xOyAvLyBTdG9yZSBkdXJhdGlvbiBvbiB0aGUgbmV4dCBuZWFyZXN0IFByb2ZpbGVyIGFuY2VzdG9yXG4gICAgLy8gT3IgdGhlIHJvb3QgKGZvciB0aGUgRGV2VG9vbHMgUHJvZmlsZXIgdG8gcmVhZClcblxuICAgIHZhciBwYXJlbnRGaWJlciA9IGZpYmVyLnJldHVybjtcblxuICAgIHdoaWxlIChwYXJlbnRGaWJlciAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChwYXJlbnRGaWJlci50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICB2YXIgcm9vdCA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgICAgICByb290LnBhc3NpdmVFZmZlY3REdXJhdGlvbiArPSBlbGFwc2VkVGltZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY2FzZSBQcm9maWxlcjpcbiAgICAgICAgICB2YXIgcGFyZW50U3RhdGVOb2RlID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgaWYgKHBhcmVudFN0YXRlTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gRGV0YWNoZWQgZmliZXJzIGhhdmUgdGhlaXIgc3RhdGUgbm9kZSBjbGVhcmVkIG91dC5cbiAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgdGhlIHJldHVybiBwb2ludGVyIGlzIGFsc28gY2xlYXJlZCBvdXQsXG4gICAgICAgICAgICAvLyBzbyB3ZSB3b24ndCBiZSBhYmxlIHRvIHJlcG9ydCB0aGUgdGltZSBzcGVudCBpbiB0aGlzIFByb2ZpbGVyJ3Mgc3VidHJlZS5cbiAgICAgICAgICAgIHBhcmVudFN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb24gKz0gZWxhcHNlZFRpbWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLnJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpIHtcblxuICBsYXlvdXRFZmZlY3RTdGFydFRpbWUgPSBub3ckMSgpO1xufVxuXG5mdW5jdGlvbiBzdGFydFBhc3NpdmVFZmZlY3RUaW1lcigpIHtcblxuICBwYXNzaXZlRWZmZWN0U3RhcnRUaW1lID0gbm93JDEoKTtcbn1cblxuZnVuY3Rpb24gdHJhbnNmZXJBY3R1YWxEdXJhdGlvbihmaWJlcikge1xuICAvLyBUcmFuc2ZlciB0aW1lIHNwZW50IHJlbmRlcmluZyB0aGVzZSBjaGlsZHJlbiBzbyB3ZSBkb24ndCBsb3NlIGl0XG4gIC8vIGFmdGVyIHdlIHJlcmVuZGVyLiBUaGlzIGlzIHVzZWQgYXMgYSBoZWxwZXIgaW4gc3BlY2lhbCBjYXNlc1xuICAvLyB3aGVyZSB3ZSBzaG91bGQgY291bnQgdGhlIHdvcmsgb2YgbXVsdGlwbGUgcGFzc2VzLlxuICB2YXIgY2hpbGQgPSBmaWJlci5jaGlsZDtcblxuICB3aGlsZSAoY2hpbGQpIHtcbiAgICBmaWJlci5hY3R1YWxEdXJhdGlvbiArPSBjaGlsZC5hY3R1YWxEdXJhdGlvbjtcbiAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZURlZmF1bHRQcm9wcyhDb21wb25lbnQsIGJhc2VQcm9wcykge1xuICBpZiAoQ29tcG9uZW50ICYmIENvbXBvbmVudC5kZWZhdWx0UHJvcHMpIHtcbiAgICAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHMuIFRha2VuIGZyb20gUmVhY3RFbGVtZW50XG4gICAgdmFyIHByb3BzID0gYXNzaWduKHt9LCBiYXNlUHJvcHMpO1xuICAgIHZhciBkZWZhdWx0UHJvcHMgPSBDb21wb25lbnQuZGVmYXVsdFByb3BzO1xuXG4gICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gZGVmYXVsdFByb3BzKSB7XG4gICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gZGVmYXVsdFByb3BzW3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcHJvcHM7XG4gIH1cblxuICByZXR1cm4gYmFzZVByb3BzO1xufVxuXG52YXIgZmFrZUludGVybmFsSW5zdGFuY2UgPSB7fTtcbnZhciBkaWRXYXJuQWJvdXRTdGF0ZUFzc2lnbm1lbnRGb3JDb21wb25lbnQ7XG52YXIgZGlkV2FybkFib3V0VW5pbml0aWFsaXplZFN0YXRlO1xudmFyIGRpZFdhcm5BYm91dEdldFNuYXBzaG90QmVmb3JlVXBkYXRlV2l0aG91dERpZFVwZGF0ZTtcbnZhciBkaWRXYXJuQWJvdXRMZWdhY3lMaWZlY3ljbGVzQW5kRGVyaXZlZFN0YXRlO1xudmFyIGRpZFdhcm5BYm91dFVuZGVmaW5lZERlcml2ZWRTdGF0ZTtcbnZhciB3YXJuT25VbmRlZmluZWREZXJpdmVkU3RhdGU7XG52YXIgd2Fybk9uSW52YWxpZENhbGxiYWNrO1xudmFyIGRpZFdhcm5BYm91dERpcmVjdGx5QXNzaWduaW5nUHJvcHNUb1N0YXRlO1xudmFyIGRpZFdhcm5BYm91dENvbnRleHRUeXBlQW5kQ29udGV4dFR5cGVzO1xudmFyIGRpZFdhcm5BYm91dEludmFsaWRhdGVDb250ZXh0VHlwZTtcbnZhciBkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0JDE7XG5cbntcbiAgZGlkV2FybkFib3V0U3RhdGVBc3NpZ25tZW50Rm9yQ29tcG9uZW50ID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXRVbmluaXRpYWxpemVkU3RhdGUgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dEdldFNuYXBzaG90QmVmb3JlVXBkYXRlV2l0aG91dERpZFVwZGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0RGlyZWN0bHlBc3NpZ25pbmdQcm9wc1RvU3RhdGUgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dFVuZGVmaW5lZERlcml2ZWRTdGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0Q29udGV4dFR5cGVBbmRDb250ZXh0VHlwZXMgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dEludmFsaWRhdGVDb250ZXh0VHlwZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0TGVnYWN5Q29udGV4dCQxID0gbmV3IFNldCgpO1xuICB2YXIgZGlkV2Fybk9uSW52YWxpZENhbGxiYWNrID0gbmV3IFNldCgpO1xuXG4gIHdhcm5PbkludmFsaWRDYWxsYmFjayA9IGZ1bmN0aW9uIChjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgIGlmIChjYWxsYmFjayA9PT0gbnVsbCB8fCB0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIga2V5ID0gY2FsbGVyTmFtZSArICdfJyArIGNhbGxiYWNrO1xuXG4gICAgaWYgKCFkaWRXYXJuT25JbnZhbGlkQ2FsbGJhY2suaGFzKGtleSkpIHtcbiAgICAgIGRpZFdhcm5PbkludmFsaWRDYWxsYmFjay5hZGQoa2V5KTtcblxuICAgICAgZXJyb3IoJyVzKC4uLik6IEV4cGVjdGVkIHRoZSBsYXN0IG9wdGlvbmFsIGBjYWxsYmFja2AgYXJndW1lbnQgdG8gYmUgYSAnICsgJ2Z1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjYWxsZXJOYW1lLCBjYWxsYmFjayk7XG4gICAgfVxuICB9O1xuXG4gIHdhcm5PblVuZGVmaW5lZERlcml2ZWRTdGF0ZSA9IGZ1bmN0aW9uICh0eXBlLCBwYXJ0aWFsU3RhdGUpIHtcbiAgICBpZiAocGFydGlhbFN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFVuZGVmaW5lZERlcml2ZWRTdGF0ZS5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgZGlkV2FybkFib3V0VW5kZWZpbmVkRGVyaXZlZFN0YXRlLmFkZChjb21wb25lbnROYW1lKTtcblxuICAgICAgICBlcnJvcignJXMuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKCk6IEEgdmFsaWQgc3RhdGUgb2JqZWN0IChvciBudWxsKSBtdXN0IGJlIHJldHVybmVkLiAnICsgJ1lvdSBoYXZlIHJldHVybmVkIHVuZGVmaW5lZC4nLCBjb21wb25lbnROYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH07IC8vIFRoaXMgaXMgc28gZ3Jvc3MgYnV0IGl0J3MgYXQgbGVhc3Qgbm9uLWNyaXRpY2FsIGFuZCBjYW4gYmUgcmVtb3ZlZCBpZlxuICAvLyBpdCBjYXVzZXMgcHJvYmxlbXMuIFRoaXMgaXMgbWVhbnQgdG8gZ2l2ZSBhIG5pY2VyIGVycm9yIG1lc3NhZ2UgZm9yXG4gIC8vIFJlYWN0RE9NMTUudW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIocmVhY3RET00xNkNvbXBvbmVudCxcbiAgLy8gLi4uKSkgd2hpY2ggb3RoZXJ3aXNlIHRocm93cyBhIFwiX3Byb2Nlc3NDaGlsZENvbnRleHQgaXMgbm90IGEgZnVuY3Rpb25cIlxuICAvLyBleGNlcHRpb24uXG5cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZmFrZUludGVybmFsSW5zdGFuY2UsICdfcHJvY2Vzc0NoaWxkQ29udGV4dCcsIHtcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdfcHJvY2Vzc0NoaWxkQ29udGV4dCBpcyBub3QgYXZhaWxhYmxlIGluIFJlYWN0IDE2Ky4gVGhpcyBsaWtlbHkgJyArICdtZWFucyB5b3UgaGF2ZSBtdWx0aXBsZSBjb3BpZXMgb2YgUmVhY3QgYW5kIGFyZSBhdHRlbXB0aW5nIHRvIG5lc3QgJyArICdhIFJlYWN0IDE1IHRyZWUgaW5zaWRlIGEgUmVhY3QgMTYgdHJlZSB1c2luZyAnICsgXCJ1bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lciwgd2hpY2ggaXNuJ3Qgc3VwcG9ydGVkLiBUcnkgXCIgKyAndG8gbWFrZSBzdXJlIHlvdSBoYXZlIG9ubHkgb25lIGNvcHkgb2YgUmVhY3QgKGFuZCBpZGVhbGx5LCBzd2l0Y2ggJyArICd0byBSZWFjdERPTS5jcmVhdGVQb3J0YWwpLicpO1xuICAgIH1cbiAgfSk7XG4gIE9iamVjdC5mcmVlemUoZmFrZUludGVybmFsSW5zdGFuY2UpO1xufVxuXG5mdW5jdGlvbiBhcHBseURlcml2ZWRTdGF0ZUZyb21Qcm9wcyh3b3JrSW5Qcm9ncmVzcywgY3RvciwgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLCBuZXh0UHJvcHMpIHtcbiAgdmFyIHByZXZTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIHZhciBwYXJ0aWFsU3RhdGUgPSBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMobmV4dFByb3BzLCBwcmV2U3RhdGUpO1xuXG4gIHtcbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gSW52b2tlIHRoZSBmdW5jdGlvbiBhbiBleHRyYSB0aW1lIHRvIGhlbHAgZGV0ZWN0IHNpZGUtZWZmZWN0cy5cbiAgICAgICAgcGFydGlhbFN0YXRlID0gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKG5leHRQcm9wcywgcHJldlN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3YXJuT25VbmRlZmluZWREZXJpdmVkU3RhdGUoY3RvciwgcGFydGlhbFN0YXRlKTtcbiAgfSAvLyBNZXJnZSB0aGUgcGFydGlhbCBzdGF0ZSBhbmQgdGhlIHByZXZpb3VzIHN0YXRlLlxuXG5cbiAgdmFyIG1lbW9pemVkU3RhdGUgPSBwYXJ0aWFsU3RhdGUgPT09IG51bGwgfHwgcGFydGlhbFN0YXRlID09PSB1bmRlZmluZWQgPyBwcmV2U3RhdGUgOiBhc3NpZ24oe30sIHByZXZTdGF0ZSwgcGFydGlhbFN0YXRlKTtcbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG1lbW9pemVkU3RhdGU7IC8vIE9uY2UgdGhlIHVwZGF0ZSBxdWV1ZSBpcyBlbXB0eSwgcGVyc2lzdCB0aGUgZGVyaXZlZCBzdGF0ZSBvbnRvIHRoZVxuICAvLyBiYXNlIHN0YXRlLlxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIC8vIFF1ZXVlIGlzIGFsd2F5cyBub24tbnVsbCBmb3IgY2xhc3Nlc1xuICAgIHZhciB1cGRhdGVRdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuICAgIHVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZSA9IG1lbW9pemVkU3RhdGU7XG4gIH1cbn1cblxudmFyIGNsYXNzQ29tcG9uZW50VXBkYXRlciA9IHtcbiAgaXNNb3VudGVkOiBpc01vdW50ZWQsXG4gIGVucXVldWVTZXRTdGF0ZTogZnVuY3Rpb24gKGluc3QsIHBheWxvYWQsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGZpYmVyID0gZ2V0KGluc3QpO1xuICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpO1xuICAgIHVwZGF0ZS5wYXlsb2FkID0gcGF5bG9hZDtcblxuICAgIGlmIChjYWxsYmFjayAhPT0gdW5kZWZpbmVkICYmIGNhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICB7XG4gICAgICAgIHdhcm5PbkludmFsaWRDYWxsYmFjayhjYWxsYmFjaywgJ3NldFN0YXRlJyk7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZS5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIHZhciByb290ID0gZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlLCBsYW5lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gICAgICBlbnRhbmdsZVRyYW5zaXRpb25zKHJvb3QsIGZpYmVyLCBsYW5lKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBtYXJrU3RhdGVVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpO1xuICAgIH1cbiAgfSxcbiAgZW5xdWV1ZVJlcGxhY2VTdGF0ZTogZnVuY3Rpb24gKGluc3QsIHBheWxvYWQsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGZpYmVyID0gZ2V0KGluc3QpO1xuICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpO1xuICAgIHVwZGF0ZS50YWcgPSBSZXBsYWNlU3RhdGU7XG4gICAgdXBkYXRlLnBheWxvYWQgPSBwYXlsb2FkO1xuXG4gICAgaWYgKGNhbGxiYWNrICE9PSB1bmRlZmluZWQgJiYgY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgIHtcbiAgICAgICAgd2Fybk9uSW52YWxpZENhbGxiYWNrKGNhbGxiYWNrLCAncmVwbGFjZVN0YXRlJyk7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZS5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIHZhciByb290ID0gZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlLCBsYW5lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gICAgICBlbnRhbmdsZVRyYW5zaXRpb25zKHJvb3QsIGZpYmVyLCBsYW5lKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBtYXJrU3RhdGVVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpO1xuICAgIH1cbiAgfSxcbiAgZW5xdWV1ZUZvcmNlVXBkYXRlOiBmdW5jdGlvbiAoaW5zdCwgY2FsbGJhY2spIHtcbiAgICB2YXIgZmliZXIgPSBnZXQoaW5zdCk7XG4gICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKGV2ZW50VGltZSwgbGFuZSk7XG4gICAgdXBkYXRlLnRhZyA9IEZvcmNlVXBkYXRlO1xuXG4gICAgaWYgKGNhbGxiYWNrICE9PSB1bmRlZmluZWQgJiYgY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgIHtcbiAgICAgICAgd2Fybk9uSW52YWxpZENhbGxiYWNrKGNhbGxiYWNrLCAnZm9yY2VVcGRhdGUnKTtcbiAgICAgIH1cblxuICAgICAgdXBkYXRlLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUsIGxhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgICAgIGVudGFuZ2xlVHJhbnNpdGlvbnMocm9vdCwgZmliZXIsIGxhbmUpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIG1hcmtGb3JjZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSk7XG4gICAgfVxuICB9XG59O1xuXG5mdW5jdGlvbiBjaGVja1Nob3VsZENvbXBvbmVudFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgY3Rvciwgb2xkUHJvcHMsIG5ld1Byb3BzLCBvbGRTdGF0ZSwgbmV3U3RhdGUsIG5leHRDb250ZXh0KSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICBpZiAodHlwZW9mIGluc3RhbmNlLnNob3VsZENvbXBvbmVudFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBzaG91bGRVcGRhdGUgPSBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUobmV3UHJvcHMsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG5cbiAgICB7XG4gICAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gSW52b2tlIHRoZSBmdW5jdGlvbiBhbiBleHRyYSB0aW1lIHRvIGhlbHAgZGV0ZWN0IHNpZGUtZWZmZWN0cy5cbiAgICAgICAgICBzaG91bGRVcGRhdGUgPSBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUobmV3UHJvcHMsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRVcGRhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlcnJvcignJXMuc2hvdWxkQ29tcG9uZW50VXBkYXRlKCk6IFJldHVybmVkIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIGEgJyArICdib29sZWFuIHZhbHVlLiBNYWtlIHN1cmUgdG8gcmV0dXJuIHRydWUgb3IgZmFsc2UuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2hvdWxkVXBkYXRlO1xuICB9XG5cbiAgaWYgKGN0b3IucHJvdG90eXBlICYmIGN0b3IucHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50KSB7XG4gICAgcmV0dXJuICFzaGFsbG93RXF1YWwob2xkUHJvcHMsIG5ld1Byb3BzKSB8fCAhc2hhbGxvd0VxdWFsKG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY2hlY2tDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBuZXdQcm9wcykge1xuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAge1xuICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdDb21wb25lbnQnO1xuICAgIHZhciByZW5kZXJQcmVzZW50ID0gaW5zdGFuY2UucmVuZGVyO1xuXG4gICAgaWYgKCFyZW5kZXJQcmVzZW50KSB7XG4gICAgICBpZiAoY3Rvci5wcm90b3R5cGUgJiYgdHlwZW9mIGN0b3IucHJvdG90eXBlLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBlcnJvcignJXMoLi4uKTogTm8gYHJlbmRlcmAgbWV0aG9kIGZvdW5kIG9uIHRoZSByZXR1cm5lZCBjb21wb25lbnQgJyArICdpbnN0YW5jZTogZGlkIHlvdSBhY2NpZGVudGFsbHkgcmV0dXJuIGFuIG9iamVjdCBmcm9tIHRoZSBjb25zdHJ1Y3Rvcj8nLCBuYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCclcyguLi4pOiBObyBgcmVuZGVyYCBtZXRob2QgZm91bmQgb24gdGhlIHJldHVybmVkIGNvbXBvbmVudCAnICsgJ2luc3RhbmNlOiB5b3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIGRlZmluZSBgcmVuZGVyYC4nLCBuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuZ2V0SW5pdGlhbFN0YXRlICYmICFpbnN0YW5jZS5nZXRJbml0aWFsU3RhdGUuaXNSZWFjdENsYXNzQXBwcm92ZWQgJiYgIWluc3RhbmNlLnN0YXRlKSB7XG4gICAgICBlcnJvcignZ2V0SW5pdGlhbFN0YXRlIHdhcyBkZWZpbmVkIG9uICVzLCBhIHBsYWluIEphdmFTY3JpcHQgY2xhc3MuICcgKyAnVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgY2xhc3NlcyBjcmVhdGVkIHVzaW5nIFJlYWN0LmNyZWF0ZUNsYXNzLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBkZWZpbmUgYSBzdGF0ZSBwcm9wZXJ0eSBpbnN0ZWFkPycsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5nZXREZWZhdWx0UHJvcHMgJiYgIWluc3RhbmNlLmdldERlZmF1bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZCkge1xuICAgICAgZXJyb3IoJ2dldERlZmF1bHRQcm9wcyB3YXMgZGVmaW5lZCBvbiAlcywgYSBwbGFpbiBKYXZhU2NyaXB0IGNsYXNzLiAnICsgJ1RoaXMgaXMgb25seSBzdXBwb3J0ZWQgZm9yIGNsYXNzZXMgY3JlYXRlZCB1c2luZyBSZWFjdC5jcmVhdGVDbGFzcy4gJyArICdVc2UgYSBzdGF0aWMgcHJvcGVydHkgdG8gZGVmaW5lIGRlZmF1bHRQcm9wcyBpbnN0ZWFkLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5wcm9wVHlwZXMpIHtcbiAgICAgIGVycm9yKCdwcm9wVHlwZXMgd2FzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgcHJvcGVydHkgb24gJXMuIFVzZSBhIHN0YXRpYyAnICsgJ3Byb3BlcnR5IHRvIGRlZmluZSBwcm9wVHlwZXMgaW5zdGVhZC4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuY29udGV4dFR5cGUpIHtcbiAgICAgIGVycm9yKCdjb250ZXh0VHlwZSB3YXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcy4gVXNlIGEgc3RhdGljICcgKyAncHJvcGVydHkgdG8gZGVmaW5lIGNvbnRleHRUeXBlIGluc3RlYWQuJywgbmFtZSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKGN0b3IuY2hpbGRDb250ZXh0VHlwZXMgJiYgIWRpZFdhcm5BYm91dExlZ2FjeUNvbnRleHQkMS5oYXMoY3RvcikgJiYgLy8gU3RyaWN0IE1vZGUgaGFzIGl0cyBvd24gd2FybmluZyBmb3IgbGVnYWN5IGNvbnRleHQsIHNvIHdlIGNhbiBza2lwXG4gICAgICAvLyB0aGlzIG9uZS5cbiAgICAgICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0JDEuYWRkKGN0b3IpO1xuXG4gICAgICAgIGVycm9yKCclcyB1c2VzIHRoZSBsZWdhY3kgY2hpbGRDb250ZXh0VHlwZXMgQVBJIHdoaWNoIGlzIG5vIGxvbmdlciAnICsgJ3N1cHBvcnRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UuIFVzZSAnICsgJ1JlYWN0LmNyZWF0ZUNvbnRleHQoKSBpbnN0ZWFkXFxuXFxuLicgKyAnTGVhcm4gbW9yZSBhYm91dCB0aGlzIHdhcm5pbmcgaGVyZTogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2xlZ2FjeS1jb250ZXh0JywgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjdG9yLmNvbnRleHRUeXBlcyAmJiAhZGlkV2FybkFib3V0TGVnYWN5Q29udGV4dCQxLmhhcyhjdG9yKSAmJiAvLyBTdHJpY3QgTW9kZSBoYXMgaXRzIG93biB3YXJuaW5nIGZvciBsZWdhY3kgY29udGV4dCwgc28gd2UgY2FuIHNraXBcbiAgICAgIC8vIHRoaXMgb25lLlxuICAgICAgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dExlZ2FjeUNvbnRleHQkMS5hZGQoY3Rvcik7XG5cbiAgICAgICAgZXJyb3IoJyVzIHVzZXMgdGhlIGxlZ2FjeSBjb250ZXh0VHlwZXMgQVBJIHdoaWNoIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgJyArICdhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UuIFVzZSAnICsgJ1JlYWN0LmNyZWF0ZUNvbnRleHQoKSB3aXRoIHN0YXRpYyBjb250ZXh0VHlwZSBpbnN0ZWFkLlxcblxcbicgKyAnTGVhcm4gbW9yZSBhYm91dCB0aGlzIHdhcm5pbmcgaGVyZTogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2xlZ2FjeS1jb250ZXh0JywgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbnN0YW5jZS5jb250ZXh0VHlwZXMpIHtcbiAgICAgICAgZXJyb3IoJ2NvbnRleHRUeXBlcyB3YXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcy4gVXNlIGEgc3RhdGljICcgKyAncHJvcGVydHkgdG8gZGVmaW5lIGNvbnRleHRUeXBlcyBpbnN0ZWFkLicsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY3Rvci5jb250ZXh0VHlwZSAmJiBjdG9yLmNvbnRleHRUeXBlcyAmJiAhZGlkV2FybkFib3V0Q29udGV4dFR5cGVBbmRDb250ZXh0VHlwZXMuaGFzKGN0b3IpKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dENvbnRleHRUeXBlQW5kQ29udGV4dFR5cGVzLmFkZChjdG9yKTtcblxuICAgICAgICBlcnJvcignJXMgZGVjbGFyZXMgYm90aCBjb250ZXh0VHlwZXMgYW5kIGNvbnRleHRUeXBlIHN0YXRpYyBwcm9wZXJ0aWVzLiAnICsgJ1RoZSBsZWdhY3kgY29udGV4dFR5cGVzIHByb3BlcnR5IHdpbGwgYmUgaWdub3JlZC4nLCBuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFNob3VsZFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdjb21wb25lbnRTaG91bGRVcGRhdGUoKS4gRGlkIHlvdSBtZWFuIHNob3VsZENvbXBvbmVudFVwZGF0ZSgpPyAnICsgJ1RoZSBuYW1lIGlzIHBocmFzZWQgYXMgYSBxdWVzdGlvbiBiZWNhdXNlIHRoZSBmdW5jdGlvbiBpcyAnICsgJ2V4cGVjdGVkIHRvIHJldHVybiBhIHZhbHVlLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChjdG9yLnByb3RvdHlwZSAmJiBjdG9yLnByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudCAmJiB0eXBlb2YgaW5zdGFuY2Uuc2hvdWxkQ29tcG9uZW50VXBkYXRlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgc2hvdWxkQ29tcG9uZW50VXBkYXRlKCkuICcgKyAnc2hvdWxkQ29tcG9uZW50VXBkYXRlIHNob3VsZCBub3QgYmUgdXNlZCB3aGVuIGV4dGVuZGluZyBSZWFjdC5QdXJlQ29tcG9uZW50LiAnICsgJ1BsZWFzZSBleHRlbmQgUmVhY3QuQ29tcG9uZW50IGlmIHNob3VsZENvbXBvbmVudFVwZGF0ZSBpcyB1c2VkLicsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQSBwdXJlIGNvbXBvbmVudCcpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVW5tb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdjb21wb25lbnREaWRVbm1vdW50KCkuIEJ1dCB0aGVyZSBpcyBubyBzdWNoIGxpZmVjeWNsZSBtZXRob2QuICcgKyAnRGlkIHlvdSBtZWFuIGNvbXBvbmVudFdpbGxVbm1vdW50KCk/JywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50RGlkUmVjZWl2ZVByb3BzKCkuIEJ1dCB0aGVyZSBpcyBubyBzdWNoIGxpZmVjeWNsZSBtZXRob2QuICcgKyAnSWYgeW91IG1lYW50IHRvIHVwZGF0ZSB0aGUgc3RhdGUgaW4gcmVzcG9uc2UgdG8gY2hhbmdpbmcgcHJvcHMsICcgKyAndXNlIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKS4gSWYgeW91IG1lYW50IHRvIGZldGNoIGRhdGEgb3IgJyArICdydW4gc2lkZS1lZmZlY3RzIG9yIG11dGF0aW9ucyBhZnRlciBSZWFjdCBoYXMgdXBkYXRlZCB0aGUgVUksIHVzZSBjb21wb25lbnREaWRVcGRhdGUoKS4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcygpLiBEaWQgeW91IG1lYW4gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpPycsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMoKS4gRGlkIHlvdSBtZWFuIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCk/JywgbmFtZSk7XG4gICAgfVxuXG4gICAgdmFyIGhhc011dGF0ZWRQcm9wcyA9IGluc3RhbmNlLnByb3BzICE9PSBuZXdQcm9wcztcblxuICAgIGlmIChpbnN0YW5jZS5wcm9wcyAhPT0gdW5kZWZpbmVkICYmIGhhc011dGF0ZWRQcm9wcykge1xuICAgICAgZXJyb3IoJyVzKC4uLik6IFdoZW4gY2FsbGluZyBzdXBlcigpIGluIGAlc2AsIG1ha2Ugc3VyZSB0byBwYXNzICcgKyBcInVwIHRoZSBzYW1lIHByb3BzIHRoYXQgeW91ciBjb21wb25lbnQncyBjb25zdHJ1Y3RvciB3YXMgcGFzc2VkLlwiLCBuYW1lLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuZGVmYXVsdFByb3BzKSB7XG4gICAgICBlcnJvcignU2V0dGluZyBkZWZhdWx0UHJvcHMgYXMgYW4gaW5zdGFuY2UgcHJvcGVydHkgb24gJXMgaXMgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBiZSBpZ25vcmVkLicgKyAnIEluc3RlYWQsIGRlZmluZSBkZWZhdWx0UHJvcHMgYXMgYSBzdGF0aWMgcHJvcGVydHkgb24gJXMuJywgbmFtZSwgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlICE9PSAnZnVuY3Rpb24nICYmICFkaWRXYXJuQWJvdXRHZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZVdpdGhvdXREaWRVcGRhdGUuaGFzKGN0b3IpKSB7XG4gICAgICBkaWRXYXJuQWJvdXRHZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZVdpdGhvdXREaWRVcGRhdGUuYWRkKGN0b3IpO1xuXG4gICAgICBlcnJvcignJXM6IGdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCkgc2hvdWxkIGJlIHVzZWQgd2l0aCBjb21wb25lbnREaWRVcGRhdGUoKS4gJyArICdUaGlzIGNvbXBvbmVudCBkZWZpbmVzIGdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCkgb25seS4nLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoY3RvcikpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXM6IGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcygpIGlzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgbWV0aG9kICcgKyAnYW5kIHdpbGwgYmUgaWdub3JlZC4gSW5zdGVhZCwgZGVjbGFyZSBpdCBhcyBhIHN0YXRpYyBtZXRob2QuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclczogZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKCkgaXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBtZXRob2QgJyArICdhbmQgd2lsbCBiZSBpZ25vcmVkLiBJbnN0ZWFkLCBkZWNsYXJlIGl0IGFzIGEgc3RhdGljIG1ldGhvZC4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGN0b3IuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclczogZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKSBpcyBkZWZpbmVkIGFzIGEgc3RhdGljIG1ldGhvZCAnICsgJ2FuZCB3aWxsIGJlIGlnbm9yZWQuIEluc3RlYWQsIGRlY2xhcmUgaXQgYXMgYW4gaW5zdGFuY2UgbWV0aG9kLicsIG5hbWUpO1xuICAgIH1cblxuICAgIHZhciBfc3RhdGUgPSBpbnN0YW5jZS5zdGF0ZTtcblxuICAgIGlmIChfc3RhdGUgJiYgKHR5cGVvZiBfc3RhdGUgIT09ICdvYmplY3QnIHx8IGlzQXJyYXkoX3N0YXRlKSkpIHtcbiAgICAgIGVycm9yKCclcy5zdGF0ZTogbXVzdCBiZSBzZXQgdG8gYW4gb2JqZWN0IG9yIG51bGwnLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldENoaWxkQ29udGV4dCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgY3Rvci5jaGlsZENvbnRleHRUeXBlcyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIGVycm9yKCclcy5nZXRDaGlsZENvbnRleHQoKTogY2hpbGRDb250ZXh0VHlwZXMgbXVzdCBiZSBkZWZpbmVkIGluIG9yZGVyIHRvICcgKyAndXNlIGdldENoaWxkQ29udGV4dCgpLicsIG5hbWUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhZG9wdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKSB7XG4gIGluc3RhbmNlLnVwZGF0ZXIgPSBjbGFzc0NvbXBvbmVudFVwZGF0ZXI7XG4gIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IGluc3RhbmNlOyAvLyBUaGUgaW5zdGFuY2UgbmVlZHMgYWNjZXNzIHRvIHRoZSBmaWJlciBzbyB0aGF0IGl0IGNhbiBzY2hlZHVsZSB1cGRhdGVzXG5cbiAgc2V0KGluc3RhbmNlLCB3b3JrSW5Qcm9ncmVzcyk7XG5cbiAge1xuICAgIGluc3RhbmNlLl9yZWFjdEludGVybmFsSW5zdGFuY2UgPSBmYWtlSW50ZXJuYWxJbnN0YW5jZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBwcm9wcykge1xuICB2YXIgaXNMZWdhY3lDb250ZXh0Q29uc3VtZXIgPSBmYWxzZTtcbiAgdmFyIHVubWFza2VkQ29udGV4dCA9IGVtcHR5Q29udGV4dE9iamVjdDtcbiAgdmFyIGNvbnRleHQgPSBlbXB0eUNvbnRleHRPYmplY3Q7XG4gIHZhciBjb250ZXh0VHlwZSA9IGN0b3IuY29udGV4dFR5cGU7XG5cbiAge1xuICAgIGlmICgnY29udGV4dFR5cGUnIGluIGN0b3IpIHtcbiAgICAgIHZhciBpc1ZhbGlkID0gLy8gQWxsb3cgbnVsbCBmb3IgY29uZGl0aW9uYWwgZGVjbGFyYXRpb25cbiAgICAgIGNvbnRleHRUeXBlID09PSBudWxsIHx8IGNvbnRleHRUeXBlICE9PSB1bmRlZmluZWQgJiYgY29udGV4dFR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSAmJiBjb250ZXh0VHlwZS5fY29udGV4dCA9PT0gdW5kZWZpbmVkOyAvLyBOb3QgYSA8Q29udGV4dC5Db25zdW1lcj5cblxuICAgICAgaWYgKCFpc1ZhbGlkICYmICFkaWRXYXJuQWJvdXRJbnZhbGlkYXRlQ29udGV4dFR5cGUuaGFzKGN0b3IpKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dEludmFsaWRhdGVDb250ZXh0VHlwZS5hZGQoY3Rvcik7XG4gICAgICAgIHZhciBhZGRlbmR1bSA9ICcnO1xuXG4gICAgICAgIGlmIChjb250ZXh0VHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYWRkZW5kdW0gPSAnIEhvd2V2ZXIsIGl0IGlzIHNldCB0byB1bmRlZmluZWQuICcgKyAnVGhpcyBjYW4gYmUgY2F1c2VkIGJ5IGEgdHlwbyBvciBieSBtaXhpbmcgdXAgbmFtZWQgYW5kIGRlZmF1bHQgaW1wb3J0cy4gJyArICdUaGlzIGNhbiBhbHNvIGhhcHBlbiBkdWUgdG8gYSBjaXJjdWxhciBkZXBlbmRlbmN5LCBzbyAnICsgJ3RyeSBtb3ZpbmcgdGhlIGNyZWF0ZUNvbnRleHQoKSBjYWxsIHRvIGEgc2VwYXJhdGUgZmlsZS4nO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb250ZXh0VHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBhZGRlbmR1bSA9ICcgSG93ZXZlciwgaXQgaXMgc2V0IHRvIGEgJyArIHR5cGVvZiBjb250ZXh0VHlwZSArICcuJztcbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0VHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRSkge1xuICAgICAgICAgIGFkZGVuZHVtID0gJyBEaWQgeW91IGFjY2lkZW50YWxseSBwYXNzIHRoZSBDb250ZXh0LlByb3ZpZGVyIGluc3RlYWQ/JztcbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0VHlwZS5fY29udGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gPENvbnRleHQuQ29uc3VtZXI+XG4gICAgICAgICAgYWRkZW5kdW0gPSAnIERpZCB5b3UgYWNjaWRlbnRhbGx5IHBhc3MgdGhlIENvbnRleHQuQ29uc3VtZXIgaW5zdGVhZD8nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFkZGVuZHVtID0gJyBIb3dldmVyLCBpdCBpcyBzZXQgdG8gYW4gb2JqZWN0IHdpdGgga2V5cyB7JyArIE9iamVjdC5rZXlzKGNvbnRleHRUeXBlKS5qb2luKCcsICcpICsgJ30uJztcbiAgICAgICAgfVxuXG4gICAgICAgIGVycm9yKCclcyBkZWZpbmVzIGFuIGludmFsaWQgY29udGV4dFR5cGUuICcgKyAnY29udGV4dFR5cGUgc2hvdWxkIHBvaW50IHRvIHRoZSBDb250ZXh0IG9iamVjdCByZXR1cm5lZCBieSBSZWFjdC5jcmVhdGVDb250ZXh0KCkuJXMnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoY3RvcikgfHwgJ0NvbXBvbmVudCcsIGFkZGVuZHVtKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIGNvbnRleHRUeXBlID09PSAnb2JqZWN0JyAmJiBjb250ZXh0VHlwZSAhPT0gbnVsbCkge1xuICAgIGNvbnRleHQgPSByZWFkQ29udGV4dChjb250ZXh0VHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgdW5tYXNrZWRDb250ZXh0ID0gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBjdG9yLCB0cnVlKTtcbiAgICB2YXIgY29udGV4dFR5cGVzID0gY3Rvci5jb250ZXh0VHlwZXM7XG4gICAgaXNMZWdhY3lDb250ZXh0Q29uc3VtZXIgPSBjb250ZXh0VHlwZXMgIT09IG51bGwgJiYgY29udGV4dFR5cGVzICE9PSB1bmRlZmluZWQ7XG4gICAgY29udGV4dCA9IGlzTGVnYWN5Q29udGV4dENvbnN1bWVyID8gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0KSA6IGVtcHR5Q29udGV4dE9iamVjdDtcbiAgfVxuXG4gIHZhciBpbnN0YW5jZSA9IG5ldyBjdG9yKHByb3BzLCBjb250ZXh0KTsgLy8gSW5zdGFudGlhdGUgdHdpY2UgdG8gaGVscCBkZXRlY3Qgc2lkZS1lZmZlY3RzLlxuXG4gIHtcbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgaW5zdGFuY2UgPSBuZXcgY3Rvcihwcm9wcywgY29udGV4dCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IGluc3RhbmNlLnN0YXRlICE9PSBudWxsICYmIGluc3RhbmNlLnN0YXRlICE9PSB1bmRlZmluZWQgPyBpbnN0YW5jZS5zdGF0ZSA6IG51bGw7XG4gIGFkb3B0Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpO1xuXG4gIHtcbiAgICBpZiAodHlwZW9mIGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nICYmIHN0YXRlID09PSBudWxsKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRVbmluaXRpYWxpemVkU3RhdGUuaGFzKGNvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZS5hZGQoY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgZXJyb3IoJ2Alc2AgdXNlcyBgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzYCBidXQgaXRzIGluaXRpYWwgc3RhdGUgaXMgJyArICclcy4gVGhpcyBpcyBub3QgcmVjb21tZW5kZWQuIEluc3RlYWQsIGRlZmluZSB0aGUgaW5pdGlhbCBzdGF0ZSBieSAnICsgJ2Fzc2lnbmluZyBhbiBvYmplY3QgdG8gYHRoaXMuc3RhdGVgIGluIHRoZSBjb25zdHJ1Y3RvciBvZiBgJXNgLiAnICsgJ1RoaXMgZW5zdXJlcyB0aGF0IGBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNgIGFyZ3VtZW50cyBoYXZlIGEgY29uc2lzdGVudCBzaGFwZS4nLCBjb21wb25lbnROYW1lLCBpbnN0YW5jZS5zdGF0ZSA9PT0gbnVsbCA/ICdudWxsJyA6ICd1bmRlZmluZWQnLCBjb21wb25lbnROYW1lKTtcbiAgICAgIH1cbiAgICB9IC8vIElmIG5ldyBjb21wb25lbnQgQVBJcyBhcmUgZGVmaW5lZCwgXCJ1bnNhZmVcIiBsaWZlY3ljbGVzIHdvbid0IGJlIGNhbGxlZC5cbiAgICAvLyBXYXJuIGFib3V0IHRoZXNlIGxpZmVjeWNsZXMgaWYgdGhleSBhcmUgcHJlc2VudC5cbiAgICAvLyBEb24ndCB3YXJuIGFib3V0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgbWV0aG9kcyB0aG91Z2guXG5cblxuICAgIGlmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgZm91bmRXaWxsTW91bnROYW1lID0gbnVsbDtcbiAgICAgIHZhciBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lID0gbnVsbDtcbiAgICAgIHZhciBmb3VuZFdpbGxVcGRhdGVOYW1lID0gbnVsbDtcblxuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50Ll9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgIT09IHRydWUpIHtcbiAgICAgICAgZm91bmRXaWxsTW91bnROYW1lID0gJ2NvbXBvbmVudFdpbGxNb3VudCc7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGZvdW5kV2lsbE1vdW50TmFtZSA9ICdVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50JztcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgICBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lID0gJ2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMnO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSA9ICdVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyc7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlLl9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgIT09IHRydWUpIHtcbiAgICAgICAgZm91bmRXaWxsVXBkYXRlTmFtZSA9ICdjb21wb25lbnRXaWxsVXBkYXRlJztcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGZvdW5kV2lsbFVwZGF0ZU5hbWUgPSAnVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUnO1xuICAgICAgfVxuXG4gICAgICBpZiAoZm91bmRXaWxsTW91bnROYW1lICE9PSBudWxsIHx8IGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgIT09IG51bGwgfHwgZm91bmRXaWxsVXBkYXRlTmFtZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgX2NvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoY3RvcikgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgICAgdmFyIG5ld0FwaU5hbWUgPSB0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicgPyAnZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKCknIDogJ2dldFNuYXBzaG90QmVmb3JlVXBkYXRlKCknO1xuXG4gICAgICAgIGlmICghZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZS5oYXMoX2NvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgICAgZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZS5hZGQoX2NvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgICAgZXJyb3IoJ1Vuc2FmZSBsZWdhY3kgbGlmZWN5Y2xlcyB3aWxsIG5vdCBiZSBjYWxsZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgbmV3IGNvbXBvbmVudCBBUElzLlxcblxcbicgKyAnJXMgdXNlcyAlcyBidXQgYWxzbyBjb250YWlucyB0aGUgZm9sbG93aW5nIGxlZ2FjeSBsaWZlY3ljbGVzOiVzJXMlc1xcblxcbicgKyAnVGhlIGFib3ZlIGxpZmVjeWNsZXMgc2hvdWxkIGJlIHJlbW92ZWQuIExlYXJuIG1vcmUgYWJvdXQgdGhpcyB3YXJuaW5nIGhlcmU6XFxuJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzJywgX2NvbXBvbmVudE5hbWUsIG5ld0FwaU5hbWUsIGZvdW5kV2lsbE1vdW50TmFtZSAhPT0gbnVsbCA/IFwiXFxuICBcIiArIGZvdW5kV2lsbE1vdW50TmFtZSA6ICcnLCBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lICE9PSBudWxsID8gXCJcXG4gIFwiICsgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSA6ICcnLCBmb3VuZFdpbGxVcGRhdGVOYW1lICE9PSBudWxsID8gXCJcXG4gIFwiICsgZm91bmRXaWxsVXBkYXRlTmFtZSA6ICcnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSAvLyBDYWNoZSB1bm1hc2tlZCBjb250ZXh0IHNvIHdlIGNhbiBhdm9pZCByZWNyZWF0aW5nIG1hc2tlZCBjb250ZXh0IHVubGVzcyBuZWNlc3NhcnkuXG4gIC8vIFJlYWN0RmliZXJDb250ZXh0IHVzdWFsbHkgdXBkYXRlcyB0aGlzIGNhY2hlIGJ1dCBjYW4ndCBmb3IgbmV3bHktY3JlYXRlZCBpbnN0YW5jZXMuXG5cblxuICBpZiAoaXNMZWdhY3lDb250ZXh0Q29uc3VtZXIpIHtcbiAgICBjYWNoZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCwgY29udGV4dCk7XG4gIH1cblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5cbmZ1bmN0aW9uIGNhbGxDb21wb25lbnRXaWxsTW91bnQod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKSB7XG4gIHZhciBvbGRTdGF0ZSA9IGluc3RhbmNlLnN0YXRlO1xuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50KCk7XG4gIH1cblxuICBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCk7XG4gIH1cblxuICBpZiAob2xkU3RhdGUgIT09IGluc3RhbmNlLnN0YXRlKSB7XG4gICAge1xuICAgICAgZXJyb3IoJyVzLmNvbXBvbmVudFdpbGxNb3VudCgpOiBBc3NpZ25pbmcgZGlyZWN0bHkgdG8gdGhpcy5zdGF0ZSBpcyAnICsgXCJkZXByZWNhdGVkIChleGNlcHQgaW5zaWRlIGEgY29tcG9uZW50J3MgXCIgKyAnY29uc3RydWN0b3IpLiBVc2Ugc2V0U3RhdGUgaW5zdGVhZC4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHdvcmtJblByb2dyZXNzKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgfVxuXG4gICAgY2xhc3NDb21wb25lbnRVcGRhdGVyLmVucXVldWVSZXBsYWNlU3RhdGUoaW5zdGFuY2UsIGluc3RhbmNlLnN0YXRlLCBudWxsKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjYWxsQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UsIG5ld1Byb3BzLCBuZXh0Q29udGV4dCkge1xuICB2YXIgb2xkU3RhdGUgPSBpbnN0YW5jZS5zdGF0ZTtcblxuICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5ld1Byb3BzLCBuZXh0Q29udGV4dCk7XG4gIH1cblxuICBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV3UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgfVxuXG4gIGlmIChpbnN0YW5jZS5zdGF0ZSAhPT0gb2xkU3RhdGUpIHtcbiAgICB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIod29ya0luUHJvZ3Jlc3MpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFN0YXRlQXNzaWdubWVudEZvckNvbXBvbmVudC5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgZGlkV2FybkFib3V0U3RhdGVBc3NpZ25tZW50Rm9yQ29tcG9uZW50LmFkZChjb21wb25lbnROYW1lKTtcblxuICAgICAgICBlcnJvcignJXMuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpOiBBc3NpZ25pbmcgZGlyZWN0bHkgdG8gJyArIFwidGhpcy5zdGF0ZSBpcyBkZXByZWNhdGVkIChleGNlcHQgaW5zaWRlIGEgY29tcG9uZW50J3MgXCIgKyAnY29uc3RydWN0b3IpLiBVc2Ugc2V0U3RhdGUgaW5zdGVhZC4nLCBjb21wb25lbnROYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjbGFzc0NvbXBvbmVudFVwZGF0ZXIuZW5xdWV1ZVJlcGxhY2VTdGF0ZShpbnN0YW5jZSwgaW5zdGFuY2Uuc3RhdGUsIG51bGwpO1xuICB9XG59IC8vIEludm9rZXMgdGhlIG1vdW50IGxpZmUtY3ljbGVzIG9uIGEgcHJldmlvdXNseSBuZXZlciByZW5kZXJlZCBpbnN0YW5jZS5cblxuXG5mdW5jdGlvbiBtb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG5ld1Byb3BzLCByZW5kZXJMYW5lcykge1xuICB7XG4gICAgY2hlY2tDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBuZXdQcm9wcyk7XG4gIH1cblxuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gIGluc3RhbmNlLnByb3BzID0gbmV3UHJvcHM7XG4gIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgaW5zdGFuY2UucmVmcyA9IHt9O1xuICBpbml0aWFsaXplVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MpO1xuICB2YXIgY29udGV4dFR5cGUgPSBjdG9yLmNvbnRleHRUeXBlO1xuXG4gIGlmICh0eXBlb2YgY29udGV4dFR5cGUgPT09ICdvYmplY3QnICYmIGNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgaW5zdGFuY2UuY29udGV4dCA9IHJlYWRDb250ZXh0KGNvbnRleHRUeXBlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgdW5tYXNrZWRDb250ZXh0ID0gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBjdG9yLCB0cnVlKTtcbiAgICBpbnN0YW5jZS5jb250ZXh0ID0gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0KTtcbiAgfVxuXG4gIHtcbiAgICBpZiAoaW5zdGFuY2Uuc3RhdGUgPT09IG5ld1Byb3BzKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXREaXJlY3RseUFzc2lnbmluZ1Byb3BzVG9TdGF0ZS5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgZGlkV2FybkFib3V0RGlyZWN0bHlBc3NpZ25pbmdQcm9wc1RvU3RhdGUuYWRkKGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGVycm9yKCclczogSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGFzc2lnbiBwcm9wcyBkaXJlY3RseSB0byBzdGF0ZSAnICsgXCJiZWNhdXNlIHVwZGF0ZXMgdG8gcHJvcHMgd29uJ3QgYmUgcmVmbGVjdGVkIGluIHN0YXRlLiBcIiArICdJbiBtb3N0IGNhc2VzLCBpdCBpcyBiZXR0ZXIgdG8gdXNlIHByb3BzIGRpcmVjdGx5LicsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MucmVjb3JkTGVnYWN5Q29udGV4dFdhcm5pbmcod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpO1xuICAgIH1cbiAgfVxuXG4gIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9IGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzO1xuXG4gIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV3UHJvcHMpO1xuICAgIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfSAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cblxuXG4gIGlmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlICE9PSAnZnVuY3Rpb24nICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSkge1xuICAgIGNhbGxDb21wb25lbnRXaWxsTW91bnQod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKTsgLy8gSWYgd2UgaGFkIGFkZGl0aW9uYWwgc3RhdGUgdXBkYXRlcyBkdXJpbmcgdGhpcyBsaWZlLWN5Y2xlLCBsZXQnc1xuICAgIC8vIHByb2Nlc3MgdGhlbSBub3cuXG5cbiAgICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG5ld1Byb3BzLCBpbnN0YW5jZSwgcmVuZGVyTGFuZXMpO1xuICAgIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZmliZXJGbGFncyA9IFVwZGF0ZTtcblxuICAgIHtcbiAgICAgIGZpYmVyRmxhZ3MgfD0gTGF5b3V0U3RhdGljO1xuICAgIH1cblxuICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgZmliZXJGbGFncyB8PSBNb3VudExheW91dERldjtcbiAgICB9XG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBmaWJlckZsYWdzO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc3VtZU1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgY3RvciwgbmV3UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgdmFyIG9sZFByb3BzID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcztcbiAgaW5zdGFuY2UucHJvcHMgPSBvbGRQcm9wcztcbiAgdmFyIG9sZENvbnRleHQgPSBpbnN0YW5jZS5jb250ZXh0O1xuICB2YXIgY29udGV4dFR5cGUgPSBjdG9yLmNvbnRleHRUeXBlO1xuICB2YXIgbmV4dENvbnRleHQgPSBlbXB0eUNvbnRleHRPYmplY3Q7XG5cbiAgaWYgKHR5cGVvZiBjb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgY29udGV4dFR5cGUgIT09IG51bGwpIHtcbiAgICBuZXh0Q29udGV4dCA9IHJlYWRDb250ZXh0KGNvbnRleHRUeXBlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbmV4dExlZ2FjeVVubWFza2VkQ29udGV4dCA9IGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgY3RvciwgdHJ1ZSk7XG4gICAgbmV4dENvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBuZXh0TGVnYWN5VW5tYXNrZWRDb250ZXh0KTtcbiAgfVxuXG4gIHZhciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPSBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcbiAgdmFyIGhhc05ld0xpZmVjeWNsZXMgPSB0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJzsgLy8gTm90ZTogRHVyaW5nIHRoZXNlIGxpZmUtY3ljbGVzLCBpbnN0YW5jZS5wcm9wcy9pbnN0YW5jZS5zdGF0ZSBhcmUgd2hhdFxuICAvLyBldmVyIHRoZSBwcmV2aW91c2x5IGF0dGVtcHRlZCB0byByZW5kZXIgLSBub3QgdGhlIFwiY3VycmVudFwiLiBIb3dldmVyLFxuICAvLyBkdXJpbmcgY29tcG9uZW50RGlkVXBkYXRlIHdlIHBhc3MgdGhlIFwiY3VycmVudFwiIHByb3BzLlxuICAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cblxuICBpZiAoIWhhc05ld0xpZmVjeWNsZXMgJiYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICBpZiAob2xkUHJvcHMgIT09IG5ld1Byb3BzIHx8IG9sZENvbnRleHQgIT09IG5leHRDb250ZXh0KSB7XG4gICAgICBjYWxsQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UsIG5ld1Byb3BzLCBuZXh0Q29udGV4dCk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXRIYXNGb3JjZVVwZGF0ZUJlZm9yZVByb2Nlc3NpbmcoKTtcbiAgdmFyIG9sZFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIG5ld1N0YXRlID0gaW5zdGFuY2Uuc3RhdGUgPSBvbGRTdGF0ZTtcbiAgcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCBuZXdQcm9wcywgaW5zdGFuY2UsIHJlbmRlckxhbmVzKTtcbiAgbmV3U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChvbGRQcm9wcyA9PT0gbmV3UHJvcHMgJiYgb2xkU3RhdGUgPT09IG5ld1N0YXRlICYmICFoYXNDb250ZXh0Q2hhbmdlZCgpICYmICFjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkpIHtcbiAgICAvLyBJZiBhbiB1cGRhdGUgd2FzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdlIHNob3VsZCBzY2hlZHVsZSBhbiBVcGRhdGVcbiAgICAvLyBlZmZlY3QgZXZlbiB0aG91Z2ggd2UncmUgYmFpbGluZyBvdXQsIHNvIHRoYXQgY1dVL2NEVSBhcmUgY2FsbGVkLlxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBmaWJlckZsYWdzID0gVXBkYXRlO1xuXG4gICAgICB7XG4gICAgICAgIGZpYmVyRmxhZ3MgfD0gTGF5b3V0U3RhdGljO1xuICAgICAgfVxuXG4gICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgZmliZXJGbGFncyB8PSBNb3VudExheW91dERldjtcbiAgICAgIH1cblxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gZmliZXJGbGFncztcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGFwcGx5RGVyaXZlZFN0YXRlRnJvbVByb3BzKHdvcmtJblByb2dyZXNzLCBjdG9yLCBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMsIG5ld1Byb3BzKTtcbiAgICBuZXdTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIH1cblxuICB2YXIgc2hvdWxkVXBkYXRlID0gY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZygpIHx8IGNoZWNrU2hvdWxkQ29tcG9uZW50VXBkYXRlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBvbGRQcm9wcywgbmV3UHJvcHMsIG9sZFN0YXRlLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpO1xuXG4gIGlmIChzaG91bGRVcGRhdGUpIHtcbiAgICAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgICAvLyBVbnNhZmUgbGlmZWN5Y2xlcyBzaG91bGQgbm90IGJlIGludm9rZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgdGhlIG5ldyBBUElzLlxuICAgIGlmICghaGFzTmV3TGlmZWN5Y2xlcyAmJiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBfZmliZXJGbGFncyA9IFVwZGF0ZTtcblxuICAgICAge1xuICAgICAgICBfZmliZXJGbGFncyB8PSBMYXlvdXRTdGF0aWM7XG4gICAgICB9XG5cbiAgICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICBfZmliZXJGbGFncyB8PSBNb3VudExheW91dERldjtcbiAgICAgIH1cblxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gX2ZpYmVyRmxhZ3M7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIElmIGFuIHVwZGF0ZSB3YXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgd2Ugc2hvdWxkIHNjaGVkdWxlIGFuIFVwZGF0ZVxuICAgIC8vIGVmZmVjdCBldmVuIHRob3VnaCB3ZSdyZSBiYWlsaW5nIG91dCwgc28gdGhhdCBjV1UvY0RVIGFyZSBjYWxsZWQuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIF9maWJlckZsYWdzMiA9IFVwZGF0ZTtcblxuICAgICAge1xuICAgICAgICBfZmliZXJGbGFnczIgfD0gTGF5b3V0U3RhdGljO1xuICAgICAgfVxuXG4gICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgX2ZpYmVyRmxhZ3MyIHw9IE1vdW50TGF5b3V0RGV2O1xuICAgICAgfVxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBfZmliZXJGbGFnczI7XG4gICAgfSAvLyBJZiBzaG91bGRDb21wb25lbnRVcGRhdGUgcmV0dXJuZWQgZmFsc2UsIHdlIHNob3VsZCBzdGlsbCB1cGRhdGUgdGhlXG4gICAgLy8gbWVtb2l6ZWQgc3RhdGUgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIHdvcmsgY2FuIGJlIHJldXNlZC5cblxuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IG5ld1Byb3BzO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgfSAvLyBVcGRhdGUgdGhlIGV4aXN0aW5nIGluc3RhbmNlJ3Mgc3RhdGUsIHByb3BzLCBhbmQgY29udGV4dCBwb2ludGVycyBldmVuXG4gIC8vIGlmIHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5zIGZhbHNlLlxuXG5cbiAgaW5zdGFuY2UucHJvcHMgPSBuZXdQcm9wcztcbiAgaW5zdGFuY2Uuc3RhdGUgPSBuZXdTdGF0ZTtcbiAgaW5zdGFuY2UuY29udGV4dCA9IG5leHRDb250ZXh0O1xuICByZXR1cm4gc2hvdWxkVXBkYXRlO1xufSAvLyBJbnZva2VzIHRoZSB1cGRhdGUgbGlmZS1jeWNsZXMgYW5kIHJldHVybnMgZmFsc2UgaWYgaXQgc2hvdWxkbid0IHJlcmVuZGVyLlxuXG5cbmZ1bmN0aW9uIHVwZGF0ZUNsYXNzSW5zdGFuY2UoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGN0b3IsIG5ld1Byb3BzLCByZW5kZXJMYW5lcykge1xuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gIGNsb25lVXBkYXRlUXVldWUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICB2YXIgdW5yZXNvbHZlZE9sZFByb3BzID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcztcbiAgdmFyIG9sZFByb3BzID0gd29ya0luUHJvZ3Jlc3MudHlwZSA9PT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPyB1bnJlc29sdmVkT2xkUHJvcHMgOiByZXNvbHZlRGVmYXVsdFByb3BzKHdvcmtJblByb2dyZXNzLnR5cGUsIHVucmVzb2x2ZWRPbGRQcm9wcyk7XG4gIGluc3RhbmNlLnByb3BzID0gb2xkUHJvcHM7XG4gIHZhciB1bnJlc29sdmVkTmV3UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBvbGRDb250ZXh0ID0gaW5zdGFuY2UuY29udGV4dDtcbiAgdmFyIGNvbnRleHRUeXBlID0gY3Rvci5jb250ZXh0VHlwZTtcbiAgdmFyIG5leHRDb250ZXh0ID0gZW1wdHlDb250ZXh0T2JqZWN0O1xuXG4gIGlmICh0eXBlb2YgY29udGV4dFR5cGUgPT09ICdvYmplY3QnICYmIGNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgbmV4dENvbnRleHQgPSByZWFkQ29udGV4dChjb250ZXh0VHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIG5leHRVbm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHRydWUpO1xuICAgIG5leHRDb250ZXh0ID0gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgbmV4dFVubWFza2VkQ29udGV4dCk7XG4gIH1cblxuICB2YXIgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID0gY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM7XG4gIHZhciBoYXNOZXdMaWZlY3ljbGVzID0gdHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbic7IC8vIE5vdGU6IER1cmluZyB0aGVzZSBsaWZlLWN5Y2xlcywgaW5zdGFuY2UucHJvcHMvaW5zdGFuY2Uuc3RhdGUgYXJlIHdoYXRcbiAgLy8gZXZlciB0aGUgcHJldmlvdXNseSBhdHRlbXB0ZWQgdG8gcmVuZGVyIC0gbm90IHRoZSBcImN1cnJlbnRcIi4gSG93ZXZlcixcbiAgLy8gZHVyaW5nIGNvbXBvbmVudERpZFVwZGF0ZSB3ZSBwYXNzIHRoZSBcImN1cnJlbnRcIiBwcm9wcy5cbiAgLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMsXG4gIC8vIFVuc2FmZSBsaWZlY3ljbGVzIHNob3VsZCBub3QgYmUgaW52b2tlZCBmb3IgY29tcG9uZW50cyB1c2luZyB0aGUgbmV3IEFQSXMuXG5cbiAgaWYgKCFoYXNOZXdMaWZlY3ljbGVzICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpKSB7XG4gICAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyAhPT0gdW5yZXNvbHZlZE5ld1Byb3BzIHx8IG9sZENvbnRleHQgIT09IG5leHRDb250ZXh0KSB7XG4gICAgICBjYWxsQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UsIG5ld1Byb3BzLCBuZXh0Q29udGV4dCk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXRIYXNGb3JjZVVwZGF0ZUJlZm9yZVByb2Nlc3NpbmcoKTtcbiAgdmFyIG9sZFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIG5ld1N0YXRlID0gaW5zdGFuY2Uuc3RhdGUgPSBvbGRTdGF0ZTtcbiAgcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCBuZXdQcm9wcywgaW5zdGFuY2UsIHJlbmRlckxhbmVzKTtcbiAgbmV3U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gIGlmICh1bnJlc29sdmVkT2xkUHJvcHMgPT09IHVucmVzb2x2ZWROZXdQcm9wcyAmJiBvbGRTdGF0ZSA9PT0gbmV3U3RhdGUgJiYgIWhhc0NvbnRleHRDaGFuZ2VkKCkgJiYgIWNoZWNrSGFzRm9yY2VVcGRhdGVBZnRlclByb2Nlc3NpbmcoKSAmJiAhKGVuYWJsZUxhenlDb250ZXh0UHJvcGFnYXRpb24gICApKSB7XG4gICAgLy8gSWYgYW4gdXBkYXRlIHdhcyBhbHJlYWR5IGluIHByb2dyZXNzLCB3ZSBzaG91bGQgc2NoZWR1bGUgYW4gVXBkYXRlXG4gICAgLy8gZWZmZWN0IGV2ZW4gdGhvdWdoIHdlJ3JlIGJhaWxpbmcgb3V0LCBzbyB0aGF0IGNXVS9jRFUgYXJlIGNhbGxlZC5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyAhPT0gY3VycmVudC5tZW1vaXplZFByb3BzIHx8IG9sZFN0YXRlICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh1bnJlc29sdmVkT2xkUHJvcHMgIT09IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB8fCBvbGRTdGF0ZSAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNuYXBzaG90O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV3UHJvcHMpO1xuICAgIG5ld1N0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfVxuXG4gIHZhciBzaG91bGRVcGRhdGUgPSBjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkgfHwgY2hlY2tTaG91bGRDb21wb25lbnRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG9sZFByb3BzLCBuZXdQcm9wcywgb2xkU3RhdGUsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCkgfHwgLy8gVE9ETzogSW4gc29tZSBjYXNlcywgd2UnbGwgZW5kIHVwIGNoZWNraW5nIGlmIGNvbnRleHQgaGFzIGNoYW5nZWQgdHdpY2UsXG4gIC8vIGJvdGggYmVmb3JlIGFuZCBhZnRlciBgc2hvdWxkQ29tcG9uZW50VXBkYXRlYCBoYXMgYmVlbiBjYWxsZWQuIE5vdCBpZGVhbCxcbiAgLy8gYnV0IEknbSBsb2F0aCB0byByZWZhY3RvciB0aGlzIGZ1bmN0aW9uLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgbWVtb2l6ZWRcbiAgLy8gY29tcG9uZW50cyBzbyBpdCdzIG5vdCB0aGF0IGNvbW1vbi5cbiAgZW5hYmxlTGF6eUNvbnRleHRQcm9wYWdhdGlvbiAgIDtcblxuICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMsXG4gICAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cbiAgICBpZiAoIWhhc05ld0xpZmVjeWNsZXMgJiYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlKG5ld1Byb3BzLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlKG5ld1Byb3BzLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU25hcHNob3Q7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIElmIGFuIHVwZGF0ZSB3YXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgd2Ugc2hvdWxkIHNjaGVkdWxlIGFuIFVwZGF0ZVxuICAgIC8vIGVmZmVjdCBldmVuIHRob3VnaCB3ZSdyZSBiYWlsaW5nIG91dCwgc28gdGhhdCBjV1UvY0RVIGFyZSBjYWxsZWQuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh1bnJlc29sdmVkT2xkUHJvcHMgIT09IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB8fCBvbGRTdGF0ZSAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAodW5yZXNvbHZlZE9sZFByb3BzICE9PSBjdXJyZW50Lm1lbW9pemVkUHJvcHMgfHwgb2xkU3RhdGUgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTbmFwc2hvdDtcbiAgICAgIH1cbiAgICB9IC8vIElmIHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5lZCBmYWxzZSwgd2Ugc2hvdWxkIHN0aWxsIHVwZGF0ZSB0aGVcbiAgICAvLyBtZW1vaXplZCBwcm9wcy9zdGF0ZSB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgd29yayBjYW4gYmUgcmV1c2VkLlxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gbmV3UHJvcHM7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9IC8vIFVwZGF0ZSB0aGUgZXhpc3RpbmcgaW5zdGFuY2UncyBzdGF0ZSwgcHJvcHMsIGFuZCBjb250ZXh0IHBvaW50ZXJzIGV2ZW5cbiAgLy8gaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybnMgZmFsc2UuXG5cblxuICBpbnN0YW5jZS5wcm9wcyA9IG5ld1Byb3BzO1xuICBpbnN0YW5jZS5zdGF0ZSA9IG5ld1N0YXRlO1xuICBpbnN0YW5jZS5jb250ZXh0ID0gbmV4dENvbnRleHQ7XG4gIHJldHVybiBzaG91bGRVcGRhdGU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKHZhbHVlLCBzb3VyY2UpIHtcbiAgLy8gSWYgdGhlIHZhbHVlIGlzIGFuIGVycm9yLCBjYWxsIHRoaXMgZnVuY3Rpb24gaW1tZWRpYXRlbHkgYWZ0ZXIgaXQgaXMgdGhyb3duXG4gIC8vIHNvIHRoZSBzdGFjayBpcyBhY2N1cmF0ZS5cbiAgcmV0dXJuIHtcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgc291cmNlOiBzb3VyY2UsXG4gICAgc3RhY2s6IGdldFN0YWNrQnlGaWJlckluRGV2QW5kUHJvZChzb3VyY2UpLFxuICAgIGRpZ2VzdDogbnVsbFxuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlQ2FwdHVyZWRWYWx1ZSh2YWx1ZSwgZGlnZXN0LCBzdGFjaykge1xuICByZXR1cm4ge1xuICAgIHZhbHVlOiB2YWx1ZSxcbiAgICBzb3VyY2U6IG51bGwsXG4gICAgc3RhY2s6IHN0YWNrICE9IG51bGwgPyBzdGFjayA6IG51bGwsXG4gICAgZGlnZXN0OiBkaWdlc3QgIT0gbnVsbCA/IGRpZ2VzdCA6IG51bGxcbiAgfTtcbn1cblxuLy8gVGhpcyBtb2R1bGUgaXMgZm9ya2VkIGluIGRpZmZlcmVudCBlbnZpcm9ubWVudHMuXG4vLyBCeSBkZWZhdWx0LCByZXR1cm4gYHRydWVgIHRvIGxvZyBlcnJvcnMgdG8gdGhlIGNvbnNvbGUuXG4vLyBGb3JrcyBjYW4gcmV0dXJuIGBmYWxzZWAgaWYgdGhpcyBpc24ndCBkZXNpcmFibGUuXG5mdW5jdGlvbiBzaG93RXJyb3JEaWFsb2coYm91bmRhcnksIGVycm9ySW5mbykge1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gbG9nQ2FwdHVyZWRFcnJvcihib3VuZGFyeSwgZXJyb3JJbmZvKSB7XG4gIHRyeSB7XG4gICAgdmFyIGxvZ0Vycm9yID0gc2hvd0Vycm9yRGlhbG9nKGJvdW5kYXJ5LCBlcnJvckluZm8pOyAvLyBBbGxvdyBpbmplY3RlZCBzaG93RXJyb3JEaWFsb2coKSB0byBwcmV2ZW50IGRlZmF1bHQgY29uc29sZS5lcnJvciBsb2dnaW5nLlxuICAgIC8vIFRoaXMgZW5hYmxlcyByZW5kZXJlcnMgbGlrZSBSZWFjdE5hdGl2ZSB0byBiZXR0ZXIgbWFuYWdlIHJlZGJveCBiZWhhdmlvci5cblxuICAgIGlmIChsb2dFcnJvciA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZXJyb3IgPSBlcnJvckluZm8udmFsdWU7XG5cbiAgICBpZiAodHJ1ZSkge1xuICAgICAgdmFyIHNvdXJjZSA9IGVycm9ySW5mby5zb3VyY2U7XG4gICAgICB2YXIgc3RhY2sgPSBlcnJvckluZm8uc3RhY2s7XG4gICAgICB2YXIgY29tcG9uZW50U3RhY2sgPSBzdGFjayAhPT0gbnVsbCA/IHN0YWNrIDogJyc7IC8vIEJyb3dzZXJzIHN1cHBvcnQgc2lsZW5jaW5nIHVuY2F1Z2h0IGVycm9ycyBieSBjYWxsaW5nXG4gICAgICAvLyBgcHJldmVudERlZmF1bHQoKWAgaW4gd2luZG93IGBlcnJvcmAgaGFuZGxlci5cbiAgICAgIC8vIFdlIHJlY29yZCB0aGlzIGluZm9ybWF0aW9uIGFzIGFuIGV4cGFuZG8gb24gdGhlIGVycm9yLlxuXG4gICAgICBpZiAoZXJyb3IgIT0gbnVsbCAmJiBlcnJvci5fc3VwcHJlc3NMb2dnaW5nKSB7XG4gICAgICAgIGlmIChib3VuZGFyeS50YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICAgICAgLy8gVGhlIGVycm9yIGlzIHJlY292ZXJhYmxlIGFuZCB3YXMgc2lsZW5jZWQuXG4gICAgICAgICAgLy8gSWdub3JlIGl0IGFuZCBkb24ndCBwcmludCB0aGUgc3RhY2sgYWRkZW5kdW0uXG4gICAgICAgICAgLy8gVGhpcyBpcyBoYW5keSBmb3IgdGVzdGluZyBlcnJvciBib3VuZGFyaWVzIHdpdGhvdXQgbm9pc2UuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IC8vIFRoZSBlcnJvciBpcyBmYXRhbC4gU2luY2UgdGhlIHNpbGVuY2luZyBtaWdodCBoYXZlXG4gICAgICAgIC8vIGJlZW4gYWNjaWRlbnRhbCwgd2UnbGwgc3VyZmFjZSBpdCBhbnl3YXkuXG4gICAgICAgIC8vIEhvd2V2ZXIsIHRoZSBicm93c2VyIHdvdWxkIGhhdmUgc2lsZW5jZWQgdGhlIG9yaWdpbmFsIGVycm9yXG4gICAgICAgIC8vIHNvIHdlJ2xsIHByaW50IGl0IGZpcnN0LCBhbmQgdGhlbiBwcmludCB0aGUgc3RhY2sgYWRkZW5kdW0uXG5cblxuICAgICAgICBjb25zb2xlWydlcnJvciddKGVycm9yKTsgLy8gRG9uJ3QgdHJhbnNmb3JtIHRvIG91ciB3cmFwcGVyXG4gICAgICAgIC8vIEZvciBhIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhpcyBibG9jaywgc2VlOlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8xMzM4NFxuICAgICAgfVxuXG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IHNvdXJjZSA/IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoc291cmNlKSA6IG51bGw7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZU1lc3NhZ2UgPSBjb21wb25lbnROYW1lID8gXCJUaGUgYWJvdmUgZXJyb3Igb2NjdXJyZWQgaW4gdGhlIDxcIiArIGNvbXBvbmVudE5hbWUgKyBcIj4gY29tcG9uZW50OlwiIDogJ1RoZSBhYm92ZSBlcnJvciBvY2N1cnJlZCBpbiBvbmUgb2YgeW91ciBSZWFjdCBjb21wb25lbnRzOic7XG4gICAgICB2YXIgZXJyb3JCb3VuZGFyeU1lc3NhZ2U7XG5cbiAgICAgIGlmIChib3VuZGFyeS50YWcgPT09IEhvc3RSb290KSB7XG4gICAgICAgIGVycm9yQm91bmRhcnlNZXNzYWdlID0gJ0NvbnNpZGVyIGFkZGluZyBhbiBlcnJvciBib3VuZGFyeSB0byB5b3VyIHRyZWUgdG8gY3VzdG9taXplIGVycm9yIGhhbmRsaW5nIGJlaGF2aW9yLlxcbicgKyAnVmlzaXQgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2Vycm9yLWJvdW5kYXJpZXMgdG8gbGVhcm4gbW9yZSBhYm91dCBlcnJvciBib3VuZGFyaWVzLic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZXJyb3JCb3VuZGFyeU5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGJvdW5kYXJ5KSB8fCAnQW5vbnltb3VzJztcbiAgICAgICAgZXJyb3JCb3VuZGFyeU1lc3NhZ2UgPSBcIlJlYWN0IHdpbGwgdHJ5IHRvIHJlY3JlYXRlIHRoaXMgY29tcG9uZW50IHRyZWUgZnJvbSBzY3JhdGNoIFwiICsgKFwidXNpbmcgdGhlIGVycm9yIGJvdW5kYXJ5IHlvdSBwcm92aWRlZCwgXCIgKyBlcnJvckJvdW5kYXJ5TmFtZSArIFwiLlwiKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbWJpbmVkTWVzc2FnZSA9IGNvbXBvbmVudE5hbWVNZXNzYWdlICsgXCJcXG5cIiArIGNvbXBvbmVudFN0YWNrICsgXCJcXG5cXG5cIiArIChcIlwiICsgZXJyb3JCb3VuZGFyeU1lc3NhZ2UpOyAvLyBJbiBkZXZlbG9wbWVudCwgd2UgcHJvdmlkZSBvdXIgb3duIG1lc3NhZ2Ugd2l0aCBqdXN0IHRoZSBjb21wb25lbnQgc3RhY2suXG4gICAgICAvLyBXZSBkb24ndCBpbmNsdWRlIHRoZSBvcmlnaW5hbCBlcnJvciBtZXNzYWdlIGFuZCBKUyBzdGFjayBiZWNhdXNlIHRoZSBicm93c2VyXG4gICAgICAvLyBoYXMgYWxyZWFkeSBwcmludGVkIGl0LiBFdmVuIGlmIHRoZSBhcHBsaWNhdGlvbiBzd2FsbG93cyB0aGUgZXJyb3IsIGl0IGlzIHN0aWxsXG4gICAgICAvLyBkaXNwbGF5ZWQgYnkgdGhlIGJyb3dzZXIgdGhhbmtzIHRvIHRoZSBERVYtb25seSBmYWtlIGV2ZW50IHRyaWNrIGluIFJlYWN0RXJyb3JVdGlscy5cblxuICAgICAgY29uc29sZVsnZXJyb3InXShjb21iaW5lZE1lc3NhZ2UpOyAvLyBEb24ndCB0cmFuc2Zvcm0gdG8gb3VyIHdyYXBwZXJcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSW4gcHJvZHVjdGlvbiwgd2UgcHJpbnQgdGhlIGVycm9yIGRpcmVjdGx5LlxuICAgICAgLy8gVGhpcyB3aWxsIGluY2x1ZGUgdGhlIG1lc3NhZ2UsIHRoZSBKUyBzdGFjaywgYW5kIGFueXRoaW5nIHRoZSBicm93c2VyIHdhbnRzIHRvIHNob3cuXG4gICAgICAvLyBXZSBwYXNzIHRoZSBlcnJvciBvYmplY3QgaW5zdGVhZCBvZiBjdXN0b20gbWVzc2FnZSBzbyB0aGF0IHRoZSBicm93c2VyIGRpc3BsYXlzIHRoZSBlcnJvciBuYXRpdmVseS5cbiAgICAgIGNvbnNvbGVbJ2Vycm9yJ10oZXJyb3IpOyAvLyBEb24ndCB0cmFuc2Zvcm0gdG8gb3VyIHdyYXBwZXJcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdywgb3IgUmVhY3QgaW50ZXJuYWwgc3RhdGUgd2lsbCBnZXQgbWVzc2VkIHVwLlxuICAgIC8vIElmIGNvbnNvbGUuZXJyb3IgaXMgb3ZlcnJpZGRlbiwgb3IgbG9nQ2FwdHVyZWRFcnJvcigpIHNob3dzIGEgZGlhbG9nIHRoYXQgdGhyb3dzLFxuICAgIC8vIHdlIHdhbnQgdG8gcmVwb3J0IHRoaXMgZXJyb3Igb3V0c2lkZSBvZiB0aGUgbm9ybWFsIHN0YWNrIGFzIGEgbGFzdCByZXNvcnQuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMzE4OFxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9KTtcbiAgfVxufVxuXG52YXIgUG9zc2libHlXZWFrTWFwJDEgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtNYXAgOiBNYXA7XG5cbmZ1bmN0aW9uIGNyZWF0ZVJvb3RFcnJvclVwZGF0ZShmaWJlciwgZXJyb3JJbmZvLCBsYW5lKSB7XG4gIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoTm9UaW1lc3RhbXAsIGxhbmUpOyAvLyBVbm1vdW50IHRoZSByb290IGJ5IHJlbmRlcmluZyBudWxsLlxuXG4gIHVwZGF0ZS50YWcgPSBDYXB0dXJlVXBkYXRlOyAvLyBDYXV0aW9uOiBSZWFjdCBEZXZUb29scyBjdXJyZW50bHkgZGVwZW5kcyBvbiB0aGlzIHByb3BlcnR5XG4gIC8vIGJlaW5nIGNhbGxlZCBcImVsZW1lbnRcIi5cblxuICB1cGRhdGUucGF5bG9hZCA9IHtcbiAgICBlbGVtZW50OiBudWxsXG4gIH07XG4gIHZhciBlcnJvciA9IGVycm9ySW5mby52YWx1ZTtcblxuICB1cGRhdGUuY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgb25VbmNhdWdodEVycm9yKGVycm9yKTtcbiAgICBsb2dDYXB0dXJlZEVycm9yKGZpYmVyLCBlcnJvckluZm8pO1xuICB9O1xuXG4gIHJldHVybiB1cGRhdGU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNsYXNzRXJyb3JVcGRhdGUoZmliZXIsIGVycm9ySW5mbywgbGFuZSkge1xuICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKE5vVGltZXN0YW1wLCBsYW5lKTtcbiAgdXBkYXRlLnRhZyA9IENhcHR1cmVVcGRhdGU7XG4gIHZhciBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPSBmaWJlci50eXBlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcjtcblxuICBpZiAodHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBlcnJvciQxID0gZXJyb3JJbmZvLnZhbHVlO1xuXG4gICAgdXBkYXRlLnBheWxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKGVycm9yJDEpO1xuICAgIH07XG5cbiAgICB1cGRhdGUuY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB7XG4gICAgICAgIG1hcmtGYWlsZWRFcnJvckJvdW5kYXJ5Rm9ySG90UmVsb2FkaW5nKGZpYmVyKTtcbiAgICAgIH1cblxuICAgICAgbG9nQ2FwdHVyZWRFcnJvcihmaWJlciwgZXJyb3JJbmZvKTtcbiAgICB9O1xuICB9XG5cbiAgdmFyIGluc3QgPSBmaWJlci5zdGF0ZU5vZGU7XG5cbiAgaWYgKGluc3QgIT09IG51bGwgJiYgdHlwZW9mIGluc3QuY29tcG9uZW50RGlkQ2F0Y2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICB1cGRhdGUuY2FsbGJhY2sgPSBmdW5jdGlvbiBjYWxsYmFjaygpIHtcbiAgICAgIHtcbiAgICAgICAgbWFya0ZhaWxlZEVycm9yQm91bmRhcnlGb3JIb3RSZWxvYWRpbmcoZmliZXIpO1xuICAgICAgfVxuXG4gICAgICBsb2dDYXB0dXJlZEVycm9yKGZpYmVyLCBlcnJvckluZm8pO1xuXG4gICAgICBpZiAodHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUbyBwcmVzZXJ2ZSB0aGUgcHJlZXhpc3RpbmcgcmV0cnkgYmVoYXZpb3Igb2YgZXJyb3IgYm91bmRhcmllcyxcbiAgICAgICAgLy8gd2Uga2VlcCB0cmFjayBvZiB3aGljaCBvbmVzIGFscmVhZHkgZmFpbGVkIGR1cmluZyB0aGlzIGJhdGNoLlxuICAgICAgICAvLyBUaGlzIGdldHMgcmVzZXQgYmVmb3JlIHdlIHlpZWxkIGJhY2sgdG8gdGhlIGJyb3dzZXIuXG4gICAgICAgIC8vIFRPRE86IFdhcm4gaW4gc3RyaWN0IG1vZGUgaWYgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIGlzXG4gICAgICAgIC8vIG5vdCBkZWZpbmVkLlxuICAgICAgICBtYXJrTGVnYWN5RXJyb3JCb3VuZGFyeUFzRmFpbGVkKHRoaXMpO1xuICAgICAgfVxuXG4gICAgICB2YXIgZXJyb3IkMSA9IGVycm9ySW5mby52YWx1ZTtcbiAgICAgIHZhciBzdGFjayA9IGVycm9ySW5mby5zdGFjaztcbiAgICAgIHRoaXMuY29tcG9uZW50RGlkQ2F0Y2goZXJyb3IkMSwge1xuICAgICAgICBjb21wb25lbnRTdGFjazogc3RhY2sgIT09IG51bGwgPyBzdGFjayA6ICcnXG4gICAgICB9KTtcblxuICAgICAge1xuICAgICAgICBpZiAodHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIC8vIElmIGNvbXBvbmVudERpZENhdGNoIGlzIHRoZSBvbmx5IGVycm9yIGJvdW5kYXJ5IG1ldGhvZCBkZWZpbmVkLFxuICAgICAgICAgIC8vIHRoZW4gaXQgbmVlZHMgdG8gY2FsbCBzZXRTdGF0ZSB0byByZWNvdmVyIGZyb20gZXJyb3JzLlxuICAgICAgICAgIC8vIElmIG5vIHN0YXRlIHVwZGF0ZSBpcyBzY2hlZHVsZWQgdGhlbiB0aGUgYm91bmRhcnkgd2lsbCBzd2FsbG93IHRoZSBlcnJvci5cbiAgICAgICAgICBpZiAoIWluY2x1ZGVzU29tZUxhbmUoZmliZXIubGFuZXMsIFN5bmNMYW5lKSkge1xuICAgICAgICAgICAgZXJyb3IoJyVzOiBFcnJvciBib3VuZGFyaWVzIHNob3VsZCBpbXBsZW1lbnQgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKCkuICcgKyAnSW4gdGhhdCBtZXRob2QsIHJldHVybiBhIHN0YXRlIHVwZGF0ZSB0byBkaXNwbGF5IGFuIGVycm9yIG1lc3NhZ2Ugb3IgZmFsbGJhY2sgVUkuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ1Vua25vd24nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZTtcbn1cblxuZnVuY3Rpb24gYXR0YWNoUGluZ0xpc3RlbmVyKHJvb3QsIHdha2VhYmxlLCBsYW5lcykge1xuICAvLyBBdHRhY2ggYSBwaW5nIGxpc3RlbmVyXG4gIC8vXG4gIC8vIFRoZSBkYXRhIG1pZ2h0IHJlc29sdmUgYmVmb3JlIHdlIGhhdmUgYSBjaGFuY2UgdG8gY29tbWl0IHRoZSBmYWxsYmFjay4gT3IsXG4gIC8vIGluIHRoZSBjYXNlIG9mIGEgcmVmcmVzaCwgd2UnbGwgbmV2ZXIgY29tbWl0IGEgZmFsbGJhY2suIFNvIHdlIG5lZWQgdG9cbiAgLy8gYXR0YWNoIGEgbGlzdGVuZXIgbm93LiBXaGVuIGl0IHJlc29sdmVzIChcInBpbmdzXCIpLCB3ZSBjYW4gZGVjaWRlIHdoZXRoZXIgdG9cbiAgLy8gdHJ5IHJlbmRlcmluZyB0aGUgdHJlZSBhZ2Fpbi5cbiAgLy9cbiAgLy8gT25seSBhdHRhY2ggYSBsaXN0ZW5lciBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBmb3IgdGhlIGxhbmVzXG4gIC8vIHdlJ3JlIGN1cnJlbnRseSByZW5kZXJpbmcgKHdoaWNoIGFjdHMgbGlrZSBhIFwidGhyZWFkIElEXCIgaGVyZSkuXG4gIC8vXG4gIC8vIFdlIG9ubHkgbmVlZCB0byBkbyB0aGlzIGluIGNvbmN1cnJlbnQgbW9kZS4gTGVnYWN5IFN1c3BlbnNlIGFsd2F5c1xuICAvLyBjb21taXRzIGZhbGxiYWNrcyBzeW5jaHJvbm91c2x5LCBzbyB0aGVyZSBhcmUgbm8gcGluZ3MuXG4gIHZhciBwaW5nQ2FjaGUgPSByb290LnBpbmdDYWNoZTtcbiAgdmFyIHRocmVhZElEcztcblxuICBpZiAocGluZ0NhY2hlID09PSBudWxsKSB7XG4gICAgcGluZ0NhY2hlID0gcm9vdC5waW5nQ2FjaGUgPSBuZXcgUG9zc2libHlXZWFrTWFwJDEoKTtcbiAgICB0aHJlYWRJRHMgPSBuZXcgU2V0KCk7XG4gICAgcGluZ0NhY2hlLnNldCh3YWtlYWJsZSwgdGhyZWFkSURzKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJlYWRJRHMgPSBwaW5nQ2FjaGUuZ2V0KHdha2VhYmxlKTtcblxuICAgIGlmICh0aHJlYWRJRHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyZWFkSURzID0gbmV3IFNldCgpO1xuICAgICAgcGluZ0NhY2hlLnNldCh3YWtlYWJsZSwgdGhyZWFkSURzKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIXRocmVhZElEcy5oYXMobGFuZXMpKSB7XG4gICAgLy8gTWVtb2l6ZSB1c2luZyB0aGUgdGhyZWFkIElEIHRvIHByZXZlbnQgcmVkdW5kYW50IGxpc3RlbmVycy5cbiAgICB0aHJlYWRJRHMuYWRkKGxhbmVzKTtcbiAgICB2YXIgcGluZyA9IHBpbmdTdXNwZW5kZWRSb290LmJpbmQobnVsbCwgcm9vdCwgd2FrZWFibGUsIGxhbmVzKTtcblxuICAgIHtcbiAgICAgIGlmIChpc0RldlRvb2xzUHJlc2VudCkge1xuICAgICAgICAvLyBJZiB3ZSBoYXZlIHBlbmRpbmcgd29yayBzdGlsbCwgcmVzdG9yZSB0aGUgb3JpZ2luYWwgdXBkYXRlcnNcbiAgICAgICAgcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhyb290LCBsYW5lcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd2FrZWFibGUudGhlbihwaW5nLCBwaW5nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhdHRhY2hSZXRyeUxpc3RlbmVyKHN1c3BlbnNlQm91bmRhcnksIHJvb3QsIHdha2VhYmxlLCBsYW5lcykge1xuICAvLyBSZXRyeSBsaXN0ZW5lclxuICAvL1xuICAvLyBJZiB0aGUgZmFsbGJhY2sgZG9lcyBjb21taXQsIHdlIG5lZWQgdG8gYXR0YWNoIGEgZGlmZmVyZW50IHR5cGUgb2ZcbiAgLy8gbGlzdGVuZXIuIFRoaXMgb25lIHNjaGVkdWxlcyBhbiB1cGRhdGUgb24gdGhlIFN1c3BlbnNlIGJvdW5kYXJ5IHRvIHR1cm5cbiAgLy8gdGhlIGZhbGxiYWNrIHN0YXRlIG9mZi5cbiAgLy9cbiAgLy8gU3Rhc2ggdGhlIHdha2VhYmxlIG9uIHRoZSBib3VuZGFyeSBmaWJlciBzbyB3ZSBjYW4gYWNjZXNzIGl0IGluIHRoZVxuICAvLyBjb21taXQgcGhhc2UuXG4gIC8vXG4gIC8vIFdoZW4gdGhlIHdha2VhYmxlIHJlc29sdmVzLCB3ZSdsbCBhdHRlbXB0IHRvIHJlbmRlciB0aGUgYm91bmRhcnlcbiAgLy8gYWdhaW4gKFwicmV0cnlcIikuXG4gIHZhciB3YWtlYWJsZXMgPSBzdXNwZW5zZUJvdW5kYXJ5LnVwZGF0ZVF1ZXVlO1xuXG4gIGlmICh3YWtlYWJsZXMgPT09IG51bGwpIHtcbiAgICB2YXIgdXBkYXRlUXVldWUgPSBuZXcgU2V0KCk7XG4gICAgdXBkYXRlUXVldWUuYWRkKHdha2VhYmxlKTtcbiAgICBzdXNwZW5zZUJvdW5kYXJ5LnVwZGF0ZVF1ZXVlID0gdXBkYXRlUXVldWU7XG4gIH0gZWxzZSB7XG4gICAgd2FrZWFibGVzLmFkZCh3YWtlYWJsZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzZXRTdXNwZW5kZWRDb21wb25lbnQoc291cmNlRmliZXIsIHJvb3RSZW5kZXJMYW5lcykge1xuICAvLyBBIGxlZ2FjeSBtb2RlIFN1c3BlbnNlIHF1aXJrLCBvbmx5IHJlbGV2YW50IHRvIGhvb2sgY29tcG9uZW50cy5cblxuXG4gIHZhciB0YWcgPSBzb3VyY2VGaWJlci50YWc7XG5cbiAgaWYgKChzb3VyY2VGaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUgJiYgKHRhZyA9PT0gRnVuY3Rpb25Db21wb25lbnQgfHwgdGFnID09PSBGb3J3YXJkUmVmIHx8IHRhZyA9PT0gU2ltcGxlTWVtb0NvbXBvbmVudCkpIHtcbiAgICB2YXIgY3VycmVudFNvdXJjZSA9IHNvdXJjZUZpYmVyLmFsdGVybmF0ZTtcblxuICAgIGlmIChjdXJyZW50U291cmNlKSB7XG4gICAgICBzb3VyY2VGaWJlci51cGRhdGVRdWV1ZSA9IGN1cnJlbnRTb3VyY2UudXBkYXRlUXVldWU7XG4gICAgICBzb3VyY2VGaWJlci5tZW1vaXplZFN0YXRlID0gY3VycmVudFNvdXJjZS5tZW1vaXplZFN0YXRlO1xuICAgICAgc291cmNlRmliZXIubGFuZXMgPSBjdXJyZW50U291cmNlLmxhbmVzO1xuICAgIH0gZWxzZSB7XG4gICAgICBzb3VyY2VGaWJlci51cGRhdGVRdWV1ZSA9IG51bGw7XG4gICAgICBzb3VyY2VGaWJlci5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TmVhcmVzdFN1c3BlbnNlQm91bmRhcnlUb0NhcHR1cmUocmV0dXJuRmliZXIpIHtcbiAgdmFyIG5vZGUgPSByZXR1cm5GaWJlcjtcblxuICBkbyB7XG4gICAgaWYgKG5vZGUudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCAmJiBzaG91bGRDYXB0dXJlU3VzcGVuc2Uobm9kZSkpIHtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH0gLy8gVGhpcyBib3VuZGFyeSBhbHJlYWR5IGNhcHR1cmVkIGR1cmluZyB0aGlzIHJlbmRlci4gQ29udGludWUgdG8gdGhlIG5leHRcbiAgICAvLyBib3VuZGFyeS5cblxuXG4gICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICB9IHdoaWxlIChub2RlICE9PSBudWxsKTtcblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gbWFya1N1c3BlbnNlQm91bmRhcnlTaG91bGRDYXB0dXJlKHN1c3BlbnNlQm91bmRhcnksIHJldHVybkZpYmVyLCBzb3VyY2VGaWJlciwgcm9vdCwgcm9vdFJlbmRlckxhbmVzKSB7XG4gIC8vIFRoaXMgbWFya3MgYSBTdXNwZW5zZSBib3VuZGFyeSBzbyB0aGF0IHdoZW4gd2UncmUgdW53aW5kaW5nIHRoZSBzdGFjayxcbiAgLy8gaXQgY2FwdHVyZXMgdGhlIHN1c3BlbmRlZCBcImV4Y2VwdGlvblwiIGFuZCBkb2VzIGEgc2Vjb25kIChmYWxsYmFjaykgcGFzcy5cbiAgaWYgKChzdXNwZW5zZUJvdW5kYXJ5Lm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgIC8vIExlZ2FjeSBNb2RlIFN1c3BlbnNlXG4gICAgLy9cbiAgICAvLyBJZiB0aGUgYm91bmRhcnkgaXMgaW4gbGVnYWN5IG1vZGUsIHdlIHNob3VsZCAqbm90KlxuICAgIC8vIHN1c3BlbmQgdGhlIGNvbW1pdC4gUHJldGVuZCBhcyBpZiB0aGUgc3VzcGVuZGVkIGNvbXBvbmVudCByZW5kZXJlZFxuICAgIC8vIG51bGwgYW5kIGtlZXAgcmVuZGVyaW5nLiBXaGVuIHRoZSBTdXNwZW5zZSBib3VuZGFyeSBjb21wbGV0ZXMsXG4gICAgLy8gd2UnbGwgZG8gYSBzZWNvbmQgcGFzcyB0byByZW5kZXIgdGhlIGZhbGxiYWNrLlxuICAgIGlmIChzdXNwZW5zZUJvdW5kYXJ5ID09PSByZXR1cm5GaWJlcikge1xuICAgICAgLy8gU3BlY2lhbCBjYXNlIHdoZXJlIHdlIHN1c3BlbmRlZCB3aGlsZSByZWNvbmNpbGluZyB0aGUgY2hpbGRyZW4gb2ZcbiAgICAgIC8vIGEgU3VzcGVuc2UgYm91bmRhcnkncyBpbm5lciBPZmZzY3JlZW4gd3JhcHBlciBmaWJlci4gVGhpcyBoYXBwZW5zXG4gICAgICAvLyB3aGVuIGEgUmVhY3QubGF6eSBjb21wb25lbnQgaXMgYSBkaXJlY3QgY2hpbGQgb2YgYVxuICAgICAgLy8gU3VzcGVuc2UgYm91bmRhcnkuXG4gICAgICAvL1xuICAgICAgLy8gU3VzcGVuc2UgYm91bmRhcmllcyBhcmUgaW1wbGVtZW50ZWQgYXMgbXVsdGlwbGUgZmliZXJzLCBidXQgdGhleVxuICAgICAgLy8gYXJlIGEgc2luZ2xlIGNvbmNlcHR1YWwgdW5pdC4gVGhlIGxlZ2FjeSBtb2RlIGJlaGF2aW9yIHdoZXJlIHdlXG4gICAgICAvLyBwcmV0ZW5kIHRoZSBzdXNwZW5kZWQgZmliZXIgY29tbWl0dGVkIGFzIGBudWxsYCB3b24ndCB3b3JrLFxuICAgICAgLy8gYmVjYXVzZSBpbiB0aGlzIGNhc2UgdGhlIFwic3VzcGVuZGVkXCIgZmliZXIgaXMgdGhlIGlubmVyXG4gICAgICAvLyBPZmZzY3JlZW4gd3JhcHBlci5cbiAgICAgIC8vXG4gICAgICAvLyBCZWNhdXNlIHRoZSBjb250ZW50cyBvZiB0aGUgYm91bmRhcnkgaGF2ZW4ndCBzdGFydGVkIHJlbmRlcmluZ1xuICAgICAgLy8geWV0IChpLmUuIG5vdGhpbmcgaW4gdGhlIHRyZWUgaGFzIHBhcnRpYWxseSByZW5kZXJlZCkgd2UgY2FuXG4gICAgICAvLyBzd2l0Y2ggdG8gdGhlIHJlZ3VsYXIsIGNvbmN1cnJlbnQgbW9kZSBiZWhhdmlvcjogbWFyayB0aGVcbiAgICAgIC8vIGJvdW5kYXJ5IHdpdGggU2hvdWxkQ2FwdHVyZSBhbmQgZW50ZXIgdGhlIHVud2luZCBwaGFzZS5cbiAgICAgIHN1c3BlbnNlQm91bmRhcnkuZmxhZ3MgfD0gU2hvdWxkQ2FwdHVyZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3VzcGVuc2VCb3VuZGFyeS5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgc291cmNlRmliZXIuZmxhZ3MgfD0gRm9yY2VVcGRhdGVGb3JMZWdhY3lTdXNwZW5zZTsgLy8gV2UncmUgZ29pbmcgdG8gY29tbWl0IHRoaXMgZmliZXIgZXZlbiB0aG91Z2ggaXQgZGlkbid0IGNvbXBsZXRlLlxuICAgICAgLy8gQnV0IHdlIHNob3VsZG4ndCBjYWxsIGFueSBsaWZlY3ljbGUgbWV0aG9kcyBvciBjYWxsYmFja3MuIFJlbW92ZVxuICAgICAgLy8gYWxsIGxpZmVjeWNsZSBlZmZlY3QgdGFncy5cblxuICAgICAgc291cmNlRmliZXIuZmxhZ3MgJj0gfihMaWZlY3ljbGVFZmZlY3RNYXNrIHwgSW5jb21wbGV0ZSk7XG5cbiAgICAgIGlmIChzb3VyY2VGaWJlci50YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICAgIHZhciBjdXJyZW50U291cmNlRmliZXIgPSBzb3VyY2VGaWJlci5hbHRlcm5hdGU7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRTb3VyY2VGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgYSBuZXcgbW91bnQuIENoYW5nZSB0aGUgdGFnIHNvIGl0J3Mgbm90IG1pc3Rha2VuIGZvciBhXG4gICAgICAgICAgLy8gY29tcGxldGVkIGNsYXNzIGNvbXBvbmVudC4gRm9yIGV4YW1wbGUsIHdlIHNob3VsZCBub3QgY2FsbFxuICAgICAgICAgIC8vIGNvbXBvbmVudFdpbGxVbm1vdW50IGlmIGl0IGlzIGRlbGV0ZWQuXG4gICAgICAgICAgc291cmNlRmliZXIudGFnID0gSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFdoZW4gd2UgdHJ5IHJlbmRlcmluZyBhZ2Fpbiwgd2Ugc2hvdWxkIG5vdCByZXVzZSB0aGUgY3VycmVudCBmaWJlcixcbiAgICAgICAgICAvLyBzaW5jZSBpdCdzIGtub3duIHRvIGJlIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4gVXNlIGEgZm9yY2UgdXBkYXRlIHRvXG4gICAgICAgICAgLy8gcHJldmVudCBhIGJhaWwgb3V0LlxuICAgICAgICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoTm9UaW1lc3RhbXAsIFN5bmNMYW5lKTtcbiAgICAgICAgICB1cGRhdGUudGFnID0gRm9yY2VVcGRhdGU7XG4gICAgICAgICAgZW5xdWV1ZVVwZGF0ZShzb3VyY2VGaWJlciwgdXBkYXRlLCBTeW5jTGFuZSk7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gVGhlIHNvdXJjZSBmaWJlciBkaWQgbm90IGNvbXBsZXRlLiBNYXJrIGl0IHdpdGggU3luYyBwcmlvcml0eSB0b1xuICAgICAgLy8gaW5kaWNhdGUgdGhhdCBpdCBzdGlsbCBoYXMgcGVuZGluZyB3b3JrLlxuXG5cbiAgICAgIHNvdXJjZUZpYmVyLmxhbmVzID0gbWVyZ2VMYW5lcyhzb3VyY2VGaWJlci5sYW5lcywgU3luY0xhbmUpO1xuICAgIH1cblxuICAgIHJldHVybiBzdXNwZW5zZUJvdW5kYXJ5O1xuICB9IC8vIENvbmZpcm1lZCB0aGF0IHRoZSBib3VuZGFyeSBpcyBpbiBhIGNvbmN1cnJlbnQgbW9kZSB0cmVlLiBDb250aW51ZVxuICAvLyB3aXRoIHRoZSBub3JtYWwgc3VzcGVuZCBwYXRoLlxuICAvL1xuICAvLyBBZnRlciB0aGlzIHdlJ2xsIHVzZSBhIHNldCBvZiBoZXVyaXN0aWNzIHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXNcbiAgLy8gcmVuZGVyIHBhc3Mgd2lsbCBydW4gdG8gY29tcGxldGlvbiBvciByZXN0YXJ0IG9yIFwic3VzcGVuZFwiIHRoZSBjb21taXQuXG4gIC8vIFRoZSBhY3R1YWwgbG9naWMgZm9yIHRoaXMgaXMgc3ByZWFkIG91dCBpbiBkaWZmZXJlbnQgcGxhY2VzLlxuICAvL1xuICAvLyBUaGlzIGZpcnN0IHByaW5jaXBsZSBpcyB0aGF0IGlmIHdlJ3JlIGdvaW5nIHRvIHN1c3BlbmQgd2hlbiB3ZSBjb21wbGV0ZVxuICAvLyBhIHJvb3QsIHRoZW4gd2Ugc2hvdWxkIGFsc28gcmVzdGFydCBpZiB3ZSBnZXQgYW4gdXBkYXRlIG9yIHBpbmcgdGhhdFxuICAvLyBtaWdodCB1bnN1c3BlbmQgaXQsIGFuZCB2aWNlIHZlcnNhLiBUaGUgb25seSByZWFzb24gdG8gc3VzcGVuZCBpc1xuICAvLyBiZWNhdXNlIHlvdSB0aGluayB5b3UgbWlnaHQgd2FudCB0byByZXN0YXJ0IGJlZm9yZSBjb21taXR0aW5nLiBIb3dldmVyLFxuICAvLyBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gcmVzdGFydCBvbmx5IHdoaWxlIGluIHRoZSBwZXJpb2Qgd2UncmUgc3VzcGVuZGVkLlxuICAvL1xuICAvLyBSZXN0YXJ0aW5nIHRvbyBhZ2dyZXNzaXZlbHkgaXMgYWxzbyBub3QgZ29vZCBiZWNhdXNlIGl0IHN0YXJ2ZXMgb3V0IGFueVxuICAvLyBpbnRlcm1lZGlhdGUgbG9hZGluZyBzdGF0ZS4gU28gd2UgdXNlIGhldXJpc3RpY3MgdG8gZGV0ZXJtaW5lIHdoZW4uXG4gIC8vIFN1c3BlbnNlIEhldXJpc3RpY3NcbiAgLy9cbiAgLy8gSWYgbm90aGluZyB0aHJldyBhIFByb21pc2Ugb3IgYWxsIHRoZSBzYW1lIGZhbGxiYWNrcyBhcmUgYWxyZWFkeSBzaG93aW5nLFxuICAvLyB0aGVuIGRvbid0IHN1c3BlbmQvcmVzdGFydC5cbiAgLy9cbiAgLy8gSWYgdGhpcyBpcyBhbiBpbml0aWFsIHJlbmRlciBvZiBhIG5ldyB0cmVlIG9mIFN1c3BlbnNlIGJvdW5kYXJpZXMgYW5kXG4gIC8vIHRob3NlIHRyaWdnZXIgYSBmYWxsYmFjaywgdGhlbiBkb24ndCBzdXNwZW5kL3Jlc3RhcnQuIFdlIHdhbnQgdG8gZW5zdXJlXG4gIC8vIHRoYXQgd2UgY2FuIHNob3cgdGhlIGluaXRpYWwgbG9hZGluZyBzdGF0ZSBhcyBxdWlja2x5IGFzIHBvc3NpYmxlLlxuICAvL1xuICAvLyBJZiB3ZSBoaXQgYSBcIkRlbGF5ZWRcIiBjYXNlLCBzdWNoIGFzIHdoZW4gd2UnZCBzd2l0Y2ggZnJvbSBjb250ZW50IGJhY2sgaW50b1xuICAvLyBhIGZhbGxiYWNrLCB0aGVuIHdlIHNob3VsZCBhbHdheXMgc3VzcGVuZC9yZXN0YXJ0LiBUcmFuc2l0aW9ucyBhcHBseVxuICAvLyB0byB0aGlzIGNhc2UuIElmIG5vbmUgaXMgZGVmaW5lZCwgSk5EIGlzIHVzZWQgaW5zdGVhZC5cbiAgLy9cbiAgLy8gSWYgd2UncmUgYWxyZWFkeSBzaG93aW5nIGEgZmFsbGJhY2sgYW5kIGl0IGdldHMgXCJyZXRyaWVkXCIsIGFsbG93aW5nIHVzIHRvIHNob3dcbiAgLy8gYW5vdGhlciBsZXZlbCwgYnV0IHRoZXJlJ3Mgc3RpbGwgYW4gaW5uZXIgYm91bmRhcnkgdGhhdCB3b3VsZCBzaG93IGEgZmFsbGJhY2ssXG4gIC8vIHRoZW4gd2Ugc3VzcGVuZC9yZXN0YXJ0IGZvciA1MDBtcyBzaW5jZSB0aGUgbGFzdCB0aW1lIHdlIHNob3dlZCBhIGZhbGxiYWNrXG4gIC8vIGFueXdoZXJlIGluIHRoZSB0cmVlLiBUaGlzIGVmZmVjdGl2ZWx5IHRocm90dGxlcyBwcm9ncmVzc2l2ZSBsb2FkaW5nIGludG8gYVxuICAvLyBjb25zaXN0ZW50IHRyYWluIG9mIGNvbW1pdHMuIFRoaXMgYWxzbyBnaXZlcyB1cyBhbiBvcHBvcnR1bml0eSB0byByZXN0YXJ0IHRvXG4gIC8vIGdldCB0byB0aGUgY29tcGxldGVkIHN0YXRlIHNsaWdodGx5IGVhcmxpZXIuXG4gIC8vXG4gIC8vIElmIHRoZXJlJ3MgYW1iaWd1aXR5IGR1ZSB0byBiYXRjaGluZyBpdCdzIHJlc29sdmVkIGluIHByZWZlcmVuY2Ugb2Y6XG4gIC8vIDEpIFwiZGVsYXllZFwiLCAyKSBcImluaXRpYWwgcmVuZGVyXCIsIDMpIFwicmV0cnlcIi5cbiAgLy9cbiAgLy8gV2Ugd2FudCB0byBlbnN1cmUgdGhhdCBhIFwiYnVzeVwiIHN0YXRlIGRvZXNuJ3QgZ2V0IGZvcmNlIGNvbW1pdHRlZC4gV2Ugd2FudCB0b1xuICAvLyBlbnN1cmUgdGhhdCBuZXcgaW5pdGlhbCBsb2FkaW5nIHN0YXRlcyBjYW4gY29tbWl0IGFzIHNvb24gYXMgcG9zc2libGUuXG5cblxuICBzdXNwZW5zZUJvdW5kYXJ5LmZsYWdzIHw9IFNob3VsZENhcHR1cmU7IC8vIFRPRE86IEkgdGhpbmsgd2UgY2FuIHJlbW92ZSB0aGlzLCBzaW5jZSB3ZSBub3cgdXNlIGBEaWRDYXB0dXJlYCBpblxuICAvLyB0aGUgYmVnaW4gcGhhc2UgdG8gcHJldmVudCBhbiBlYXJseSBiYWlsb3V0LlxuXG4gIHN1c3BlbnNlQm91bmRhcnkubGFuZXMgPSByb290UmVuZGVyTGFuZXM7XG4gIHJldHVybiBzdXNwZW5zZUJvdW5kYXJ5O1xufVxuXG5mdW5jdGlvbiB0aHJvd0V4Y2VwdGlvbihyb290LCByZXR1cm5GaWJlciwgc291cmNlRmliZXIsIHZhbHVlLCByb290UmVuZGVyTGFuZXMpIHtcbiAgLy8gVGhlIHNvdXJjZSBmaWJlciBkaWQgbm90IGNvbXBsZXRlLlxuICBzb3VyY2VGaWJlci5mbGFncyB8PSBJbmNvbXBsZXRlO1xuXG4gIHtcbiAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgIC8vIElmIHdlIGhhdmUgcGVuZGluZyB3b3JrIHN0aWxsLCByZXN0b3JlIHRoZSBvcmlnaW5hbCB1cGRhdGVyc1xuICAgICAgcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhyb290LCByb290UmVuZGVyTGFuZXMpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZS50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gVGhpcyBpcyBhIHdha2VhYmxlLiBUaGUgY29tcG9uZW50IHN1c3BlbmRlZC5cbiAgICB2YXIgd2FrZWFibGUgPSB2YWx1ZTtcbiAgICByZXNldFN1c3BlbmRlZENvbXBvbmVudChzb3VyY2VGaWJlcik7XG5cbiAgICB7XG4gICAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBzb3VyY2VGaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpIHtcbiAgICAgICAgbWFya0RpZFRocm93V2hpbGVIeWRyYXRpbmdERVYoKTtcbiAgICAgIH1cbiAgICB9XG5cblxuICAgIHZhciBzdXNwZW5zZUJvdW5kYXJ5ID0gZ2V0TmVhcmVzdFN1c3BlbnNlQm91bmRhcnlUb0NhcHR1cmUocmV0dXJuRmliZXIpO1xuXG4gICAgaWYgKHN1c3BlbnNlQm91bmRhcnkgIT09IG51bGwpIHtcbiAgICAgIHN1c3BlbnNlQm91bmRhcnkuZmxhZ3MgJj0gfkZvcmNlQ2xpZW50UmVuZGVyO1xuICAgICAgbWFya1N1c3BlbnNlQm91bmRhcnlTaG91bGRDYXB0dXJlKHN1c3BlbnNlQm91bmRhcnksIHJldHVybkZpYmVyLCBzb3VyY2VGaWJlciwgcm9vdCwgcm9vdFJlbmRlckxhbmVzKTsgLy8gV2Ugb25seSBhdHRhY2ggcGluZyBsaXN0ZW5lcnMgaW4gY29uY3VycmVudCBtb2RlLiBMZWdhY3kgU3VzcGVuc2UgYWx3YXlzXG4gICAgICAvLyBjb21taXRzIGZhbGxiYWNrcyBzeW5jaHJvbm91c2x5LCBzbyB0aGVyZSBhcmUgbm8gcGluZ3MuXG5cbiAgICAgIGlmIChzdXNwZW5zZUJvdW5kYXJ5Lm1vZGUgJiBDb25jdXJyZW50TW9kZSkge1xuICAgICAgICBhdHRhY2hQaW5nTGlzdGVuZXIocm9vdCwgd2FrZWFibGUsIHJvb3RSZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICAgIGF0dGFjaFJldHJ5TGlzdGVuZXIoc3VzcGVuc2VCb3VuZGFyeSwgcm9vdCwgd2FrZWFibGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBObyBib3VuZGFyeSB3YXMgZm91bmQuIFVubGVzcyB0aGlzIGlzIGEgc3luYyB1cGRhdGUsIHRoaXMgaXMgT0suXG4gICAgICAvLyBXZSBjYW4gc3VzcGVuZCBhbmQgd2FpdCBmb3IgbW9yZSBkYXRhIHRvIGFycml2ZS5cbiAgICAgIGlmICghaW5jbHVkZXNTeW5jTGFuZShyb290UmVuZGVyTGFuZXMpKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgbm90IGEgc3luYyB1cGRhdGUuIFN1c3BlbmQuIFNpbmNlIHdlJ3JlIG5vdCBhY3RpdmF0aW5nIGFcbiAgICAgICAgLy8gU3VzcGVuc2UgYm91bmRhcnksIHRoaXMgd2lsbCB1bndpbmQgYWxsIHRoZSB3YXkgdG8gdGhlIHJvb3Qgd2l0aG91dFxuICAgICAgICAvLyBwZXJmb3JtaW5nIGEgc2Vjb25kIHBhc3MgdG8gcmVuZGVyIGEgZmFsbGJhY2suIChUaGlzIGlzIGFyZ3VhYmx5IGhvd1xuICAgICAgICAvLyByZWZyZXNoIHRyYW5zaXRpb25zIHNob3VsZCB3b3JrLCB0b28sIHNpbmNlIHdlJ3JlIG5vdCBnb2luZyB0byBjb21taXRcbiAgICAgICAgLy8gdGhlIGZhbGxiYWNrcyBhbnl3YXkuKVxuICAgICAgICAvL1xuICAgICAgICAvLyBUaGlzIGNhc2UgYWxzbyBhcHBsaWVzIHRvIGluaXRpYWwgaHlkcmF0aW9uLlxuICAgICAgICBhdHRhY2hQaW5nTGlzdGVuZXIocm9vdCwgd2FrZWFibGUsIHJvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgIHJlbmRlckRpZFN1c3BlbmREZWxheUlmUG9zc2libGUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBUaGlzIGlzIGEgc3luYy9kaXNjcmV0ZSB1cGRhdGUuIFdlIHRyZWF0IHRoaXMgY2FzZSBsaWtlIGFuIGVycm9yXG4gICAgICAvLyBiZWNhdXNlIGRpc2NyZXRlIHJlbmRlcnMgYXJlIGV4cGVjdGVkIHRvIHByb2R1Y2UgYSBjb21wbGV0ZSB0cmVlXG4gICAgICAvLyBzeW5jaHJvbm91c2x5IHRvIG1haW50YWluIGNvbnNpc3RlbmN5IHdpdGggZXh0ZXJuYWwgc3RhdGUuXG5cblxuICAgICAgdmFyIHVuY2F1Z2h0U3VzcGVuc2VFcnJvciA9IG5ldyBFcnJvcignQSBjb21wb25lbnQgc3VzcGVuZGVkIHdoaWxlIHJlc3BvbmRpbmcgdG8gc3luY2hyb25vdXMgaW5wdXQuIFRoaXMgJyArICd3aWxsIGNhdXNlIHRoZSBVSSB0byBiZSByZXBsYWNlZCB3aXRoIGEgbG9hZGluZyBpbmRpY2F0b3IuIFRvICcgKyAnZml4LCB1cGRhdGVzIHRoYXQgc3VzcGVuZCBzaG91bGQgYmUgd3JhcHBlZCAnICsgJ3dpdGggc3RhcnRUcmFuc2l0aW9uLicpOyAvLyBJZiB3ZSdyZSBvdXRzaWRlIGEgdHJhbnNpdGlvbiwgZmFsbCB0aHJvdWdoIHRvIHRoZSByZWd1bGFyIGVycm9yIHBhdGguXG4gICAgICAvLyBUaGUgZXJyb3Igd2lsbCBiZSBjYXVnaHQgYnkgdGhlIG5lYXJlc3Qgc3VzcGVuc2UgYm91bmRhcnkuXG5cbiAgICAgIHZhbHVlID0gdW5jYXVnaHRTdXNwZW5zZUVycm9yO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIGEgcmVndWxhciBlcnJvciwgbm90IGEgU3VzcGVuc2Ugd2FrZWFibGUuXG4gICAgaWYgKGdldElzSHlkcmF0aW5nKCkgJiYgc291cmNlRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSB7XG4gICAgICBtYXJrRGlkVGhyb3dXaGlsZUh5ZHJhdGluZ0RFVigpO1xuXG4gICAgICB2YXIgX3N1c3BlbnNlQm91bmRhcnkgPSBnZXROZWFyZXN0U3VzcGVuc2VCb3VuZGFyeVRvQ2FwdHVyZShyZXR1cm5GaWJlcik7IC8vIElmIHRoZSBlcnJvciB3YXMgdGhyb3duIGR1cmluZyBoeWRyYXRpb24sIHdlIG1heSBiZSBhYmxlIHRvIHJlY292ZXIgYnlcbiAgICAgIC8vIGRpc2NhcmRpbmcgdGhlIGRlaHlkcmF0ZWQgY29udGVudCBhbmQgc3dpdGNoaW5nIHRvIGEgY2xpZW50IHJlbmRlci5cbiAgICAgIC8vIEluc3RlYWQgb2Ygc3VyZmFjaW5nIHRoZSBlcnJvciwgZmluZCB0aGUgbmVhcmVzdCBTdXNwZW5zZSBib3VuZGFyeVxuICAgICAgLy8gYW5kIHJlbmRlciBpdCBhZ2FpbiB3aXRob3V0IGh5ZHJhdGlvbi5cblxuXG4gICAgICBpZiAoX3N1c3BlbnNlQm91bmRhcnkgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKChfc3VzcGVuc2VCb3VuZGFyeS5mbGFncyAmIFNob3VsZENhcHR1cmUpID09PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgLy8gU2V0IGEgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IHdlIHNob3VsZCB0cnkgcmVuZGVyaW5nIHRoZSBub3JtYWxcbiAgICAgICAgICAvLyBjaGlsZHJlbiBhZ2Fpbiwgbm90IHRoZSBmYWxsYmFjay5cbiAgICAgICAgICBfc3VzcGVuc2VCb3VuZGFyeS5mbGFncyB8PSBGb3JjZUNsaWVudFJlbmRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIG1hcmtTdXNwZW5zZUJvdW5kYXJ5U2hvdWxkQ2FwdHVyZShfc3VzcGVuc2VCb3VuZGFyeSwgcmV0dXJuRmliZXIsIHNvdXJjZUZpYmVyLCByb290LCByb290UmVuZGVyTGFuZXMpOyAvLyBFdmVuIHRob3VnaCB0aGUgdXNlciBtYXkgbm90IGJlIGFmZmVjdGVkIGJ5IHRoaXMgZXJyb3IsIHdlIHNob3VsZFxuICAgICAgICAvLyBzdGlsbCBsb2cgaXQgc28gaXQgY2FuIGJlIGZpeGVkLlxuXG4gICAgICAgIHF1ZXVlSHlkcmF0aW9uRXJyb3IoY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIodmFsdWUsIHNvdXJjZUZpYmVyKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YWx1ZSA9IGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKHZhbHVlLCBzb3VyY2VGaWJlcik7XG4gIHJlbmRlckRpZEVycm9yKHZhbHVlKTsgLy8gV2UgZGlkbid0IGZpbmQgYSBib3VuZGFyeSB0aGF0IGNvdWxkIGhhbmRsZSB0aGlzIHR5cGUgb2YgZXhjZXB0aW9uLiBTdGFydFxuICAvLyBvdmVyIGFuZCB0cmF2ZXJzZSBwYXJlbnQgcGF0aCBhZ2FpbiwgdGhpcyB0aW1lIHRyZWF0aW5nIHRoZSBleGNlcHRpb25cbiAgLy8gYXMgYW4gZXJyb3IuXG5cbiAgdmFyIHdvcmtJblByb2dyZXNzID0gcmV0dXJuRmliZXI7XG5cbiAgZG8ge1xuICAgIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9lcnJvckluZm8gPSB2YWx1ZTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTaG91bGRDYXB0dXJlO1xuICAgICAgICAgIHZhciBsYW5lID0gcGlja0FyYml0cmFyeUxhbmUocm9vdFJlbmRlckxhbmVzKTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IG1lcmdlTGFuZXMod29ya0luUHJvZ3Jlc3MubGFuZXMsIGxhbmUpO1xuICAgICAgICAgIHZhciB1cGRhdGUgPSBjcmVhdGVSb290RXJyb3JVcGRhdGUod29ya0luUHJvZ3Jlc3MsIF9lcnJvckluZm8sIGxhbmUpO1xuICAgICAgICAgIGVucXVldWVDYXB0dXJlZFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgdXBkYXRlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgLy8gQ2FwdHVyZSBhbmQgcmV0cnlcbiAgICAgICAgdmFyIGVycm9ySW5mbyA9IHZhbHVlO1xuICAgICAgICB2YXIgY3RvciA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICAgICAgICBpZiAoKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IE5vRmxhZ3MgJiYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciA9PT0gJ2Z1bmN0aW9uJyB8fCBpbnN0YW5jZSAhPT0gbnVsbCAmJiB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkQ2F0Y2ggPT09ICdmdW5jdGlvbicgJiYgIWlzQWxyZWFkeUZhaWxlZExlZ2FjeUVycm9yQm91bmRhcnkoaW5zdGFuY2UpKSkge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNob3VsZENhcHR1cmU7XG5cbiAgICAgICAgICB2YXIgX2xhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShyb290UmVuZGVyTGFuZXMpO1xuXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBtZXJnZUxhbmVzKHdvcmtJblByb2dyZXNzLmxhbmVzLCBfbGFuZSk7IC8vIFNjaGVkdWxlIHRoZSBlcnJvciBib3VuZGFyeSB0byByZS1yZW5kZXIgdXNpbmcgdXBkYXRlZCBzdGF0ZVxuXG4gICAgICAgICAgdmFyIF91cGRhdGUgPSBjcmVhdGVDbGFzc0Vycm9yVXBkYXRlKHdvcmtJblByb2dyZXNzLCBlcnJvckluZm8sIF9sYW5lKTtcblxuICAgICAgICAgIGVucXVldWVDYXB0dXJlZFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgX3VwZGF0ZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MgPSB3b3JrSW5Qcm9ncmVzcy5yZXR1cm47XG4gIH0gd2hpbGUgKHdvcmtJblByb2dyZXNzICE9PSBudWxsKTtcbn1cblxuZnVuY3Rpb24gZ2V0U3VzcGVuZGVkQ2FjaGUoKSB7XG4gIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgU3VzcGVuc2UgYm91bmRhcnkgc3VzcGVuZHMuIEl0IHJldHVybnMgdGhlXG59XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50T3duZXI7XG52YXIgZGlkUmVjZWl2ZVVwZGF0ZSA9IGZhbHNlO1xudmFyIGRpZFdhcm5BYm91dEJhZENsYXNzO1xudmFyIGRpZFdhcm5BYm91dE1vZHVsZVBhdHRlcm5Db21wb25lbnQ7XG52YXIgZGlkV2FybkFib3V0Q29udGV4dFR5cGVPbkZ1bmN0aW9uQ29tcG9uZW50O1xudmFyIGRpZFdhcm5BYm91dEdldERlcml2ZWRTdGF0ZU9uRnVuY3Rpb25Db21wb25lbnQ7XG52YXIgZGlkV2FybkFib3V0RnVuY3Rpb25SZWZzO1xudmFyIGRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHM7XG52YXIgZGlkV2FybkFib3V0UmV2ZWFsT3JkZXI7XG52YXIgZGlkV2FybkFib3V0VGFpbE9wdGlvbnM7XG52YXIgZGlkV2FybkFib3V0RGVmYXVsdFByb3BzT25GdW5jdGlvbkNvbXBvbmVudDtcblxue1xuICBkaWRXYXJuQWJvdXRCYWRDbGFzcyA9IHt9O1xuICBkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50ID0ge307XG4gIGRpZFdhcm5BYm91dENvbnRleHRUeXBlT25GdW5jdGlvbkNvbXBvbmVudCA9IHt9O1xuICBkaWRXYXJuQWJvdXRHZXREZXJpdmVkU3RhdGVPbkZ1bmN0aW9uQ29tcG9uZW50ID0ge307XG4gIGRpZFdhcm5BYm91dEZ1bmN0aW9uUmVmcyA9IHt9O1xuICBkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzID0gZmFsc2U7XG4gIGRpZFdhcm5BYm91dFJldmVhbE9yZGVyID0ge307XG4gIGRpZFdhcm5BYm91dFRhaWxPcHRpb25zID0ge307XG4gIGRpZFdhcm5BYm91dERlZmF1bHRQcm9wc09uRnVuY3Rpb25Db21wb25lbnQgPSB7fTtcbn1cblxuZnVuY3Rpb24gcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAvLyBJZiB0aGlzIGlzIGEgZnJlc2ggbmV3IGNvbXBvbmVudCB0aGF0IGhhc24ndCBiZWVuIHJlbmRlcmVkIHlldCwgd2VcbiAgICAvLyB3b24ndCB1cGRhdGUgaXRzIGNoaWxkIHNldCBieSBhcHBseWluZyBtaW5pbWFsIHNpZGUtZWZmZWN0cy4gSW5zdGVhZCxcbiAgICAvLyB3ZSB3aWxsIGFkZCB0aGVtIGFsbCB0byB0aGUgY2hpbGQgYmVmb3JlIGl0IGdldHMgcmVuZGVyZWQuIFRoYXQgbWVhbnNcbiAgICAvLyB3ZSBjYW4gb3B0aW1pemUgdGhpcyByZWNvbmNpbGlhdGlvbiBwYXNzIGJ5IG5vdCB0cmFja2luZyBzaWRlLWVmZmVjdHMuXG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBtb3VudENoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBudWxsLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBJZiB0aGUgY3VycmVudCBjaGlsZCBpcyB0aGUgc2FtZSBhcyB0aGUgd29yayBpbiBwcm9ncmVzcywgaXQgbWVhbnMgdGhhdFxuICAgIC8vIHdlIGhhdmVuJ3QgeWV0IHN0YXJ0ZWQgYW55IHdvcmsgb24gdGhlc2UgY2hpbGRyZW4uIFRoZXJlZm9yZSwgd2UgdXNlXG4gICAgLy8gdGhlIGNsb25lIGFsZ29yaXRobSB0byBjcmVhdGUgYSBjb3B5IG9mIGFsbCB0aGUgY3VycmVudCBjaGlsZHJlbi5cbiAgICAvLyBJZiB3ZSBoYWQgYW55IHByb2dyZXNzZWQgd29yayBhbHJlYWR5LCB0aGF0IGlzIGludmFsaWQgYXQgdGhpcyBwb2ludCBzb1xuICAgIC8vIGxldCdzIHRocm93IGl0IG91dC5cbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBjdXJyZW50LmNoaWxkLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JjZVVubW91bnRDdXJyZW50QW5kUmVjb25jaWxlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRoaXMgZnVuY3Rpb24gaXMgZm9yayBvZiByZWNvbmNpbGVDaGlsZHJlbi4gSXQncyB1c2VkIGluIGNhc2VzIHdoZXJlIHdlXG4gIC8vIHdhbnQgdG8gcmVjb25jaWxlIHdpdGhvdXQgbWF0Y2hpbmcgYWdhaW5zdCB0aGUgZXhpc3Rpbmcgc2V0LiBUaGlzIGhhcyB0aGVcbiAgLy8gZWZmZWN0IG9mIGFsbCBjdXJyZW50IGNoaWxkcmVuIGJlaW5nIHVubW91bnRlZDsgZXZlbiBpZiB0aGUgdHlwZSBhbmQga2V5XG4gIC8vIGFyZSB0aGUgc2FtZSwgdGhlIG9sZCBjaGlsZCBpcyB1bm1vdW50ZWQgYW5kIGEgbmV3IGNoaWxkIGlzIGNyZWF0ZWQuXG4gIC8vXG4gIC8vIFRvIGRvIHRoaXMsIHdlJ3JlIGdvaW5nIHRvIGdvIHRocm91Z2ggdGhlIHJlY29uY2lsZSBhbGdvcml0aG0gdHdpY2UuIEluXG4gIC8vIHRoZSBmaXJzdCBwYXNzLCB3ZSBzY2hlZHVsZSBhIGRlbGV0aW9uIGZvciBhbGwgdGhlIGN1cnJlbnQgY2hpbGRyZW4gYnlcbiAgLy8gcGFzc2luZyBudWxsLlxuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBjdXJyZW50LmNoaWxkLCBudWxsLCByZW5kZXJMYW5lcyk7IC8vIEluIHRoZSBzZWNvbmQgcGFzcywgd2UgbW91bnQgdGhlIG5ldyBjaGlsZHJlbi4gVGhlIHRyaWNrIGhlcmUgaXMgdGhhdCB3ZVxuICAvLyBwYXNzIG51bGwgaW4gcGxhY2Ugb2Ygd2hlcmUgd2UgdXN1YWxseSBwYXNzIHRoZSBjdXJyZW50IGNoaWxkIHNldC4gVGhpcyBoYXNcbiAgLy8gdGhlIGVmZmVjdCBvZiByZW1vdW50aW5nIGFsbCBjaGlsZHJlbiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlaXJcbiAgLy8gaWRlbnRpdGllcyBtYXRjaC5cblxuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBudWxsLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRm9yd2FyZFJlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRPRE86IGN1cnJlbnQgY2FuIGJlIG5vbi1udWxsIGhlcmUgZXZlbiBpZiB0aGUgY29tcG9uZW50XG4gIC8vIGhhc24ndCB5ZXQgbW91bnRlZC4gVGhpcyBoYXBwZW5zIGFmdGVyIHRoZSBmaXJzdCByZW5kZXIgc3VzcGVuZHMuXG4gIC8vIFdlJ2xsIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGlzIGlzIGZpbmUgb3IgY2FuIGNhdXNlIGlzc3Vlcy5cbiAge1xuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgLy8gTGF6eSBjb21wb25lbnQgcHJvcHMgY2FuJ3QgYmUgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgcmVzb2x2ZWQgaGVyZS5cbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgIGlmIChpbm5lclByb3BUeXBlcykge1xuICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgcmVuZGVyID0gQ29tcG9uZW50LnJlbmRlcjtcbiAgdmFyIHJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjsgLy8gVGhlIHJlc3QgaXMgYSBmb3JrIG9mIHVwZGF0ZUZ1bmN0aW9uQ29tcG9uZW50XG5cbiAgdmFyIG5leHRDaGlsZHJlbjtcbiAgdmFyIGhhc0lkO1xuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gIHtcbiAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RhcnRlZCh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cblxuICB7XG4gICAgUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgc2V0SXNSZW5kZXJpbmcodHJ1ZSk7XG4gICAgbmV4dENoaWxkcmVuID0gcmVuZGVyV2l0aEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXIsIG5leHRQcm9wcywgcmVmLCByZW5kZXJMYW5lcyk7XG4gICAgaGFzSWQgPSBjaGVja0RpZFJlbmRlcklkSG9vaygpO1xuXG4gICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIG5leHRDaGlsZHJlbiA9IHJlbmRlcldpdGhIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyLCBuZXh0UHJvcHMsIHJlZiwgcmVuZGVyTGFuZXMpO1xuICAgICAgICBoYXNJZCA9IGNoZWNrRGlkUmVuZGVySWRIb29rKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2V0SXNSZW5kZXJpbmcoZmFsc2UpO1xuICB9XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCk7XG4gIH1cblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiAhZGlkUmVjZWl2ZVVwZGF0ZSkge1xuICAgIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBoYXNJZCkge1xuICAgIHB1c2hNYXRlcmlhbGl6ZWRUcmVlSWQod29ya0luUHJvZ3Jlc3MpO1xuICB9IC8vIFJlYWN0IERldlRvb2xzIHJlYWRzIHRoaXMgZmxhZy5cblxuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBlcmZvcm1lZFdvcms7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVNZW1vQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICB2YXIgdHlwZSA9IENvbXBvbmVudC50eXBlO1xuXG4gICAgaWYgKGlzU2ltcGxlRnVuY3Rpb25Db21wb25lbnQodHlwZSkgJiYgQ29tcG9uZW50LmNvbXBhcmUgPT09IG51bGwgJiYgLy8gU2ltcGxlTWVtb0NvbXBvbmVudCBjb2RlcGF0aCBkb2Vzbid0IHJlc29sdmUgb3V0ZXIgcHJvcHMgZWl0aGVyLlxuICAgIENvbXBvbmVudC5kZWZhdWx0UHJvcHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIHJlc29sdmVkVHlwZSA9IHR5cGU7XG5cbiAgICAgIHtcbiAgICAgICAgcmVzb2x2ZWRUeXBlID0gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHR5cGUpO1xuICAgICAgfSAvLyBJZiB0aGlzIGlzIGEgcGxhaW4gZnVuY3Rpb24gY29tcG9uZW50IHdpdGhvdXQgZGVmYXVsdCBwcm9wcyxcbiAgICAgIC8vIGFuZCB3aXRoIG9ubHkgdGhlIGRlZmF1bHQgc2hhbGxvdyBjb21wYXJpc29uLCB3ZSB1cGdyYWRlIGl0XG4gICAgICAvLyB0byBhIFNpbXBsZU1lbW9Db21wb25lbnQgdG8gYWxsb3cgZmFzdCBwYXRoIHVwZGF0ZXMuXG5cblxuICAgICAgd29ya0luUHJvZ3Jlc3MudGFnID0gU2ltcGxlTWVtb0NvbXBvbmVudDtcbiAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSByZXNvbHZlZFR5cGU7XG5cbiAgICAgIHtcbiAgICAgICAgdmFsaWRhdGVGdW5jdGlvbkNvbXBvbmVudEluRGV2KHdvcmtJblByb2dyZXNzLCB0eXBlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVwZGF0ZVNpbXBsZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlc29sdmVkVHlwZSwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgfVxuXG4gICAge1xuICAgICAgdmFyIGlubmVyUHJvcFR5cGVzID0gdHlwZS5wcm9wVHlwZXM7XG5cbiAgICAgIGlmIChpbm5lclByb3BUeXBlcykge1xuICAgICAgICAvLyBJbm5lciBtZW1vIGNvbXBvbmVudCBwcm9wcyBhcmVuJ3QgY3VycmVudGx5IHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50LlxuICAgICAgICAvLyBXZSBjb3VsZCBtb3ZlIGl0IHRoZXJlLCBidXQgd2UnZCBzdGlsbCBuZWVkIHRoaXMgZm9yIGxhenkgY29kZSBwYXRoLlxuICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKSk7XG4gICAgICB9XG5cbiAgICAgIGlmICggQ29tcG9uZW50LmRlZmF1bHRQcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpIHx8ICdVbmtub3duJztcblxuICAgICAgICBpZiAoIWRpZFdhcm5BYm91dERlZmF1bHRQcm9wc09uRnVuY3Rpb25Db21wb25lbnRbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgICBlcnJvcignJXM6IFN1cHBvcnQgZm9yIGRlZmF1bHRQcm9wcyB3aWxsIGJlIHJlbW92ZWQgZnJvbSBtZW1vIGNvbXBvbmVudHMgJyArICdpbiBhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBVc2UgSmF2YVNjcmlwdCBkZWZhdWx0IHBhcmFtZXRlcnMgaW5zdGVhZC4nLCBjb21wb25lbnROYW1lKTtcblxuICAgICAgICAgIGRpZFdhcm5BYm91dERlZmF1bHRQcm9wc09uRnVuY3Rpb25Db21wb25lbnRbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNoaWxkID0gY3JlYXRlRmliZXJGcm9tVHlwZUFuZFByb3BzKENvbXBvbmVudC50eXBlLCBudWxsLCBuZXh0UHJvcHMsIHdvcmtJblByb2dyZXNzLCB3b3JrSW5Qcm9ncmVzcy5tb2RlLCByZW5kZXJMYW5lcyk7XG4gICAgY2hpbGQucmVmID0gd29ya0luUHJvZ3Jlc3MucmVmO1xuICAgIGNoaWxkLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY2hpbGQ7XG4gICAgcmV0dXJuIGNoaWxkO1xuICB9XG5cbiAge1xuICAgIHZhciBfdHlwZSA9IENvbXBvbmVudC50eXBlO1xuICAgIHZhciBfaW5uZXJQcm9wVHlwZXMgPSBfdHlwZS5wcm9wVHlwZXM7XG5cbiAgICBpZiAoX2lubmVyUHJvcFR5cGVzKSB7XG4gICAgICAvLyBJbm5lciBtZW1vIGNvbXBvbmVudCBwcm9wcyBhcmVuJ3QgY3VycmVudGx5IHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50LlxuICAgICAgLy8gV2UgY291bGQgbW92ZSBpdCB0aGVyZSwgYnV0IHdlJ2Qgc3RpbGwgbmVlZCB0aGlzIGZvciBsYXp5IGNvZGUgcGF0aC5cbiAgICAgIGNoZWNrUHJvcFR5cGVzKF9pbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoX3R5cGUpKTtcbiAgICB9XG4gIH1cblxuICB2YXIgY3VycmVudENoaWxkID0gY3VycmVudC5jaGlsZDsgLy8gVGhpcyBpcyBhbHdheXMgZXhhY3RseSBvbmUgY2hpbGRcblxuICB2YXIgaGFzU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0ID0gY2hlY2tTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQoY3VycmVudCwgcmVuZGVyTGFuZXMpO1xuXG4gIGlmICghaGFzU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0KSB7XG4gICAgLy8gVGhpcyB3aWxsIGJlIHRoZSBwcm9wcyB3aXRoIHJlc29sdmVkIGRlZmF1bHRQcm9wcyxcbiAgICAvLyB1bmxpa2UgY3VycmVudC5tZW1vaXplZFByb3BzIHdoaWNoIHdpbGwgYmUgdGhlIHVucmVzb2x2ZWQgb25lcy5cbiAgICB2YXIgcHJldlByb3BzID0gY3VycmVudENoaWxkLm1lbW9pemVkUHJvcHM7IC8vIERlZmF1bHQgdG8gc2hhbGxvdyBjb21wYXJpc29uXG5cbiAgICB2YXIgY29tcGFyZSA9IENvbXBvbmVudC5jb21wYXJlO1xuICAgIGNvbXBhcmUgPSBjb21wYXJlICE9PSBudWxsID8gY29tcGFyZSA6IHNoYWxsb3dFcXVhbDtcblxuICAgIGlmIChjb21wYXJlKHByZXZQcm9wcywgbmV4dFByb3BzKSAmJiBjdXJyZW50LnJlZiA9PT0gd29ya0luUHJvZ3Jlc3MucmVmKSB7XG4gICAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIH1cbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuICB2YXIgbmV3Q2hpbGQgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50Q2hpbGQsIG5leHRQcm9wcyk7XG4gIG5ld0NoaWxkLnJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjtcbiAgbmV3Q2hpbGQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbmV3Q2hpbGQ7XG4gIHJldHVybiBuZXdDaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU2ltcGxlTWVtb0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRPRE86IGN1cnJlbnQgY2FuIGJlIG5vbi1udWxsIGhlcmUgZXZlbiBpZiB0aGUgY29tcG9uZW50XG4gIC8vIGhhc24ndCB5ZXQgbW91bnRlZC4gVGhpcyBoYXBwZW5zIHdoZW4gdGhlIGlubmVyIHJlbmRlciBzdXNwZW5kcy5cbiAgLy8gV2UnbGwgbmVlZCB0byBmaWd1cmUgb3V0IGlmIHRoaXMgaXMgZmluZSBvciBjYW4gY2F1c2UgaXNzdWVzLlxuICB7XG4gICAgaWYgKHdvcmtJblByb2dyZXNzLnR5cGUgIT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlKSB7XG4gICAgICAvLyBMYXp5IGNvbXBvbmVudCBwcm9wcyBjYW4ndCBiZSB2YWxpZGF0ZWQgaW4gY3JlYXRlRWxlbWVudFxuICAgICAgLy8gYmVjYXVzZSB0aGV5J3JlIG9ubHkgZ3VhcmFudGVlZCB0byBiZSByZXNvbHZlZCBoZXJlLlxuICAgICAgdmFyIG91dGVyTWVtb1R5cGUgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZTtcblxuICAgICAgaWYgKG91dGVyTWVtb1R5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSkge1xuICAgICAgICAvLyBXZSB3YXJuIHdoZW4geW91IGRlZmluZSBwcm9wVHlwZXMgb24gbGF6eSgpXG4gICAgICAgIC8vIHNvIGxldCdzIGp1c3Qgc2tpcCBvdmVyIGl0IHRvIGZpbmQgbWVtbygpIG91dGVyIHdyYXBwZXIuXG4gICAgICAgIC8vIElubmVyIHByb3BzIGZvciBtZW1vIGFyZSB2YWxpZGF0ZWQgbGF0ZXIuXG4gICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gb3V0ZXJNZW1vVHlwZTtcbiAgICAgICAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkO1xuICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBvdXRlck1lbW9UeXBlID0gaW5pdChwYXlsb2FkKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIG91dGVyTWVtb1R5cGUgPSBudWxsO1xuICAgICAgICB9IC8vIElubmVyIHByb3BUeXBlcyB3aWxsIGJlIHZhbGlkYXRlZCBpbiB0aGUgZnVuY3Rpb24gY29tcG9uZW50IHBhdGguXG5cblxuICAgICAgICB2YXIgb3V0ZXJQcm9wVHlwZXMgPSBvdXRlck1lbW9UeXBlICYmIG91dGVyTWVtb1R5cGUucHJvcFR5cGVzO1xuXG4gICAgICAgIGlmIChvdXRlclByb3BUeXBlcykge1xuICAgICAgICAgIGNoZWNrUHJvcFR5cGVzKG91dGVyUHJvcFR5cGVzLCBuZXh0UHJvcHMsIC8vIFJlc29sdmVkIChTaW1wbGVNZW1vQ29tcG9uZW50IGhhcyBubyBkZWZhdWx0UHJvcHMpXG4gICAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUob3V0ZXJNZW1vVHlwZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICB2YXIgcHJldlByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuXG4gICAgaWYgKHNoYWxsb3dFcXVhbChwcmV2UHJvcHMsIG5leHRQcm9wcykgJiYgY3VycmVudC5yZWYgPT09IHdvcmtJblByb2dyZXNzLnJlZiAmJiAoIC8vIFByZXZlbnQgYmFpbG91dCBpZiB0aGUgaW1wbGVtZW50YXRpb24gY2hhbmdlZCBkdWUgdG8gaG90IHJlbG9hZC5cbiAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9PT0gY3VycmVudC50eXBlICkpIHtcbiAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTsgLy8gVGhlIHByb3BzIGFyZSBzaGFsbG93bHkgZXF1YWwuIFJldXNlIHRoZSBwcmV2aW91cyBwcm9wcyBvYmplY3QsIGxpa2Ugd2VcbiAgICAgIC8vIHdvdWxkIGR1cmluZyBhIG5vcm1hbCBmaWJlciBiYWlsb3V0LlxuICAgICAgLy9cbiAgICAgIC8vIFdlIGRvbid0IGhhdmUgc3Ryb25nIGd1YXJhbnRlZXMgdGhhdCB0aGUgcHJvcHMgb2JqZWN0IGlzIHJlZmVyZW50aWFsbHlcbiAgICAgIC8vIGVxdWFsIGR1cmluZyB1cGRhdGVzIHdoZXJlIHdlIGNhbid0IGJhaWwgb3V0IGFueXdheSBcdTIwMTQgbGlrZSBpZiB0aGUgcHJvcHNcbiAgICAgIC8vIGFyZSBzaGFsbG93bHkgZXF1YWwsIGJ1dCB0aGVyZSdzIGEgbG9jYWwgc3RhdGUgb3IgY29udGV4dCB1cGRhdGUgaW4gdGhlXG4gICAgICAvLyBzYW1lIGJhdGNoLlxuICAgICAgLy9cbiAgICAgIC8vIEhvd2V2ZXIsIGFzIGEgcHJpbmNpcGxlLCB3ZSBzaG91bGQgYWltIHRvIG1ha2UgdGhlIGJlaGF2aW9yIGNvbnNpc3RlbnRcbiAgICAgIC8vIGFjcm9zcyBkaWZmZXJlbnQgd2F5cyBvZiBtZW1vaXppbmcgYSBjb21wb25lbnQuIEZvciBleGFtcGxlLCBSZWFjdC5tZW1vXG4gICAgICAvLyBoYXMgYSBkaWZmZXJlbnQgaW50ZXJuYWwgRmliZXIgbGF5b3V0IGlmIHlvdSBwYXNzIGEgbm9ybWFsIGZ1bmN0aW9uXG4gICAgICAvLyBjb21wb25lbnQgKFNpbXBsZU1lbW9Db21wb25lbnQpIHZlcnN1cyBpZiB5b3UgcGFzcyBhIGRpZmZlcmVudCB0eXBlXG4gICAgICAvLyBsaWtlIGZvcndhcmRSZWYgKE1lbW9Db21wb25lbnQpLiBCdXQgdGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuXG4gICAgICAvLyBXcmFwcGluZyBhIGNvbXBvbmVudCBpbiBmb3J3YXJkUmVmIChvciBSZWFjdC5sYXp5LCBldGMpIHNob3VsZG4ndFxuICAgICAgLy8gYWZmZWN0IHdoZXRoZXIgdGhlIHByb3BzIG9iamVjdCBpcyByZXVzZWQgZHVyaW5nIGEgYmFpbG91dC5cblxuICAgICAgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzID0gbmV4dFByb3BzID0gcHJldlByb3BzO1xuXG4gICAgICBpZiAoIWNoZWNrU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0KGN1cnJlbnQsIHJlbmRlckxhbmVzKSkge1xuICAgICAgICAvLyBUaGUgcGVuZGluZyBsYW5lcyB3ZXJlIGNsZWFyZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBiZWdpbldvcmsuIFdlJ3JlXG4gICAgICAgIC8vIGFib3V0IHRvIGJhaWwgb3V0LCBidXQgdGhlcmUgbWlnaHQgYmUgb3RoZXIgbGFuZXMgdGhhdCB3ZXJlbid0XG4gICAgICAgIC8vIGluY2x1ZGVkIGluIHRoZSBjdXJyZW50IHJlbmRlci4gVXN1YWxseSwgdGhlIHByaW9yaXR5IGxldmVsIG9mIHRoZVxuICAgICAgICAvLyByZW1haW5pbmcgdXBkYXRlcyBpcyBhY2N1bXVsYXRlZCBkdXJpbmcgdGhlIGV2YWx1YXRpb24gb2YgdGhlXG4gICAgICAgIC8vIGNvbXBvbmVudCAoaS5lLiB3aGVuIHByb2Nlc3NpbmcgdGhlIHVwZGF0ZSBxdWV1ZSkuIEJ1dCBzaW5jZSBzaW5jZVxuICAgICAgICAvLyB3ZSdyZSBiYWlsaW5nIG91dCBlYXJseSAqd2l0aG91dCogZXZhbHVhdGluZyB0aGUgY29tcG9uZW50LCB3ZSBuZWVkXG4gICAgICAgIC8vIHRvIGFjY291bnQgZm9yIGl0IGhlcmUsIHRvby4gUmVzZXQgdG8gdGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IGZpYmVyLlxuICAgICAgICAvLyBOT1RFOiBUaGlzIG9ubHkgYXBwbGllcyB0byBTaW1wbGVNZW1vQ29tcG9uZW50LCBub3QgTWVtb0NvbXBvbmVudCxcbiAgICAgICAgLy8gYmVjYXVzZSBhIE1lbW9Db21wb25lbnQgZmliZXIgZG9lcyBub3QgaGF2ZSBob29rcyBvciBhbiB1cGRhdGUgcXVldWU7XG4gICAgICAgIC8vIHJhdGhlciwgaXQgd3JhcHMgYXJvdW5kIGFuIGlubmVyIGNvbXBvbmVudCwgd2hpY2ggbWF5IG9yIG1heSBub3RcbiAgICAgICAgLy8gY29udGFpbnMgaG9va3MuXG4gICAgICAgIC8vIFRPRE86IE1vdmUgdGhlIHJlc2V0IGF0IGluIGJlZ2luV29yayBvdXQgb2YgdGhlIGNvbW1vbiBwYXRoIHNvIHRoYXRcbiAgICAgICAgLy8gdGhpcyBpcyBubyBsb25nZXIgbmVjZXNzYXJ5LlxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IGN1cnJlbnQubGFuZXM7XG4gICAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9IGVsc2UgaWYgKChjdXJyZW50LmZsYWdzICYgRm9yY2VVcGRhdGVGb3JMZWdhY3lTdXNwZW5zZSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSB0aGF0IG9ubHkgZXhpc3RzIGZvciBsZWdhY3kgbW9kZS5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzE5MjE2LlxuICAgICAgICBkaWRSZWNlaXZlVXBkYXRlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdXBkYXRlRnVuY3Rpb25Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU9mZnNjcmVlbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQgIT09IG51bGwgPyBjdXJyZW50Lm1lbW9pemVkU3RhdGUgOiBudWxsO1xuXG4gIGlmIChuZXh0UHJvcHMubW9kZSA9PT0gJ2hpZGRlbicgfHwgZW5hYmxlTGVnYWN5SGlkZGVuICkge1xuICAgIC8vIFJlbmRlcmluZyBhIGhpZGRlbiB0cmVlLlxuICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgICAvLyBJbiBsZWdhY3kgc3luYyBtb2RlLCBkb24ndCBkZWZlciB0aGUgc3VidHJlZS4gUmVuZGVyIGl0IG5vdy5cbiAgICAgIC8vIFRPRE86IENvbnNpZGVyIGhvdyBPZmZzY3JlZW4gc2hvdWxkIHdvcmsgd2l0aCB0cmFuc2l0aW9ucyBpbiB0aGUgZnV0dXJlXG4gICAgICB2YXIgbmV4dFN0YXRlID0ge1xuICAgICAgICBiYXNlTGFuZXM6IE5vTGFuZXMsXG4gICAgICAgIGNhY2hlUG9vbDogbnVsbCxcbiAgICAgICAgdHJhbnNpdGlvbnM6IG51bGxcbiAgICAgIH07XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbmV4dFN0YXRlO1xuXG4gICAgICBwdXNoUmVuZGVyTGFuZXMod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICB9IGVsc2UgaWYgKCFpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCBPZmZzY3JlZW5MYW5lKSkge1xuICAgICAgdmFyIHNwYXduZWRDYWNoZVBvb2wgPSBudWxsOyAvLyBXZSdyZSBoaWRkZW4sIGFuZCB3ZSdyZSBub3QgcmVuZGVyaW5nIGF0IE9mZnNjcmVlbi4gV2Ugd2lsbCBiYWlsIG91dFxuICAgICAgLy8gYW5kIHJlc3VtZSB0aGlzIHRyZWUgbGF0ZXIuXG5cbiAgICAgIHZhciBuZXh0QmFzZUxhbmVzO1xuXG4gICAgICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBwcmV2QmFzZUxhbmVzID0gcHJldlN0YXRlLmJhc2VMYW5lcztcbiAgICAgICAgbmV4dEJhc2VMYW5lcyA9IG1lcmdlTGFuZXMocHJldkJhc2VMYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dEJhc2VMYW5lcyA9IHJlbmRlckxhbmVzO1xuICAgICAgfSAvLyBTY2hlZHVsZSB0aGlzIGZpYmVyIHRvIHJlLXJlbmRlciBhdCBvZmZzY3JlZW4gcHJpb3JpdHkuIFRoZW4gYmFpbG91dC5cblxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMgPSBsYW5lVG9MYW5lcyhPZmZzY3JlZW5MYW5lKTtcbiAgICAgIHZhciBfbmV4dFN0YXRlID0ge1xuICAgICAgICBiYXNlTGFuZXM6IG5leHRCYXNlTGFuZXMsXG4gICAgICAgIGNhY2hlUG9vbDogc3Bhd25lZENhY2hlUG9vbCxcbiAgICAgICAgdHJhbnNpdGlvbnM6IG51bGxcbiAgICAgIH07XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gX25leHRTdGF0ZTtcbiAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgICAgIC8vIHRvIGF2b2lkIGEgcHVzaC9wb3AgbWlzYWxpZ25tZW50LlxuXG5cbiAgICAgIHB1c2hSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcywgbmV4dEJhc2VMYW5lcyk7XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBzZWNvbmQgcmVuZGVyLiBUaGUgc3Vycm91bmRpbmcgdmlzaWJsZSBjb250ZW50IGhhcyBhbHJlYWR5XG4gICAgICAvLyBjb21taXR0ZWQuIE5vdyB3ZSByZXN1bWUgcmVuZGVyaW5nIHRoZSBoaWRkZW4gdHJlZS5cbiAgICAgIC8vIFJlbmRlcmluZyBhdCBvZmZzY3JlZW4sIHNvIHdlIGNhbiBjbGVhciB0aGUgYmFzZSBsYW5lcy5cbiAgICAgIHZhciBfbmV4dFN0YXRlMiA9IHtcbiAgICAgICAgYmFzZUxhbmVzOiBOb0xhbmVzLFxuICAgICAgICBjYWNoZVBvb2w6IG51bGwsXG4gICAgICAgIHRyYW5zaXRpb25zOiBudWxsXG4gICAgICB9O1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IF9uZXh0U3RhdGUyOyAvLyBQdXNoIHRoZSBsYW5lcyB0aGF0IHdlcmUgc2tpcHBlZCB3aGVuIHdlIGJhaWxlZCBvdXQuXG5cbiAgICAgIHZhciBzdWJ0cmVlUmVuZGVyTGFuZXMgPSBwcmV2U3RhdGUgIT09IG51bGwgPyBwcmV2U3RhdGUuYmFzZUxhbmVzIDogcmVuZGVyTGFuZXM7XG5cbiAgICAgIHB1c2hSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcywgc3VidHJlZVJlbmRlckxhbmVzKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gUmVuZGVyaW5nIGEgdmlzaWJsZSB0cmVlLlxuICAgIHZhciBfc3VidHJlZVJlbmRlckxhbmVzO1xuXG4gICAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgLy8gV2UncmUgZ29pbmcgZnJvbSBoaWRkZW4gLT4gdmlzaWJsZS5cbiAgICAgIF9zdWJ0cmVlUmVuZGVyTGFuZXMgPSBtZXJnZUxhbmVzKHByZXZTdGF0ZS5iYXNlTGFuZXMsIHJlbmRlckxhbmVzKTtcblxuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFdlIHdlcmVuJ3QgcHJldmlvdXNseSBoaWRkZW4sIGFuZCB3ZSBzdGlsbCBhcmVuJ3QsIHNvIHRoZXJlJ3Mgbm90aGluZ1xuICAgICAgLy8gc3BlY2lhbCB0byBkby4gTmVlZCB0byBwdXNoIHRvIHRoZSBzdGFjayByZWdhcmRsZXNzLCB0aG91Z2gsIHRvIGF2b2lkXG4gICAgICAvLyBhIHB1c2gvcG9wIG1pc2FsaWdubWVudC5cbiAgICAgIF9zdWJ0cmVlUmVuZGVyTGFuZXMgPSByZW5kZXJMYW5lcztcbiAgICB9XG5cbiAgICBwdXNoUmVuZGVyTGFuZXMod29ya0luUHJvZ3Jlc3MsIF9zdWJ0cmVlUmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59IC8vIE5vdGU6IFRoZXNlIGhhcHBlbiB0byBoYXZlIGlkZW50aWNhbCBiZWdpbiBwaGFzZXMsIGZvciBub3cuIFdlIHNob3VsZG4ndCBob2xkXG5cbmZ1bmN0aW9uIHVwZGF0ZUZyYWdtZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgbmV4dENoaWxkcmVuID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTW9kZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5leHRDaGlsZHJlbiA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcy5jaGlsZHJlbjtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVByb2ZpbGVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuXG4gICAge1xuICAgICAgLy8gUmVzZXQgZWZmZWN0IGR1cmF0aW9ucyBmb3IgdGhlIG5leHQgZXZlbnR1YWwgZWZmZWN0IHBoYXNlLlxuICAgICAgLy8gVGhlc2UgYXJlIHJlc2V0IGR1cmluZyByZW5kZXIgdG8gYWxsb3cgdGhlIERldlRvb2xzIGNvbW1pdCBob29rIGEgY2hhbmNlIHRvIHJlYWQgdGhlbSxcbiAgICAgIHZhciBzdGF0ZU5vZGUgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgICBzdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb24gPSAwO1xuICAgICAgc3RhdGVOb2RlLnBhc3NpdmVFZmZlY3REdXJhdGlvbiA9IDA7XG4gICAgfVxuICB9XG5cbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIG1hcmtSZWYoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgdmFyIHJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjtcblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCAmJiByZWYgIT09IG51bGwgfHwgY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50LnJlZiAhPT0gcmVmKSB7XG4gICAgLy8gU2NoZWR1bGUgYSBSZWYgZWZmZWN0XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUmVmO1xuXG4gICAge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUmVmU3RhdGljO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIHtcbiAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgIC8vIExhenkgY29tcG9uZW50IHByb3BzIGNhbid0IGJlIHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50XG4gICAgICAvLyBiZWNhdXNlIHRoZXkncmUgb25seSBndWFyYW50ZWVkIHRvIGJlIHJlc29sdmVkIGhlcmUuXG4gICAgICB2YXIgaW5uZXJQcm9wVHlwZXMgPSBDb21wb25lbnQucHJvcFR5cGVzO1xuXG4gICAgICBpZiAoaW5uZXJQcm9wVHlwZXMpIHtcbiAgICAgICAgY2hlY2tQcm9wVHlwZXMoaW5uZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgcHJvcHNcbiAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbnRleHQ7XG5cbiAge1xuICAgIHZhciB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSk7XG4gICAgY29udGV4dCA9IGdldE1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCk7XG4gIH1cblxuICB2YXIgbmV4dENoaWxkcmVuO1xuICB2YXIgaGFzSWQ7XG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKHdvcmtJblByb2dyZXNzKTtcbiAgfVxuXG4gIHtcbiAgICBSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICBzZXRJc1JlbmRlcmluZyh0cnVlKTtcbiAgICBuZXh0Q2hpbGRyZW4gPSByZW5kZXJXaXRoSG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gICAgaGFzSWQgPSBjaGVja0RpZFJlbmRlcklkSG9vaygpO1xuXG4gICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIG5leHRDaGlsZHJlbiA9IHJlbmRlcldpdGhIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIGNvbnRleHQsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgaGFzSWQgPSBjaGVja0RpZFJlbmRlcklkSG9vaygpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHNldElzUmVuZGVyaW5nKGZhbHNlKTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpO1xuICB9XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgIWRpZFJlY2VpdmVVcGRhdGUpIHtcbiAgICBiYWlsb3V0SG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgaWYgKGdldElzSHlkcmF0aW5nKCkgJiYgaGFzSWQpIHtcbiAgICBwdXNoTWF0ZXJpYWxpemVkVHJlZUlkKHdvcmtJblByb2dyZXNzKTtcbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlQ2xhc3NDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcykge1xuICB7XG4gICAgLy8gVGhpcyBpcyB1c2VkIGJ5IERldlRvb2xzIHRvIGZvcmNlIGEgYm91bmRhcnkgdG8gZXJyb3IuXG4gICAgc3dpdGNoIChzaG91bGRFcnJvcih3b3JrSW5Qcm9ncmVzcykpIHtcbiAgICAgIGNhc2UgZmFsc2U6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgX2luc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgICAgICAgIHZhciBjdG9yID0gd29ya0luUHJvZ3Jlc3MudHlwZTsgLy8gVE9ETyBUaGlzIHdheSBvZiByZXNldHRpbmcgdGhlIGVycm9yIGJvdW5kYXJ5IHN0YXRlIGlzIGEgaGFjay5cbiAgICAgICAgICAvLyBJcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcz9cblxuICAgICAgICAgIHZhciB0ZW1wSW5zdGFuY2UgPSBuZXcgY3Rvcih3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzLCBfaW5zdGFuY2UuY29udGV4dCk7XG4gICAgICAgICAgdmFyIHN0YXRlID0gdGVtcEluc3RhbmNlLnN0YXRlO1xuXG4gICAgICAgICAgX2luc3RhbmNlLnVwZGF0ZXIuZW5xdWV1ZVNldFN0YXRlKF9pbnN0YW5jZSwgc3RhdGUsIG51bGwpO1xuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSB0cnVlOlxuICAgICAgICB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTaG91bGRDYXB0dXJlOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuXG4gICAgICAgICAgdmFyIGVycm9yJDEgPSBuZXcgRXJyb3IoJ1NpbXVsYXRlZCBlcnJvciBjb21pbmcgZnJvbSBEZXZUb29scycpO1xuICAgICAgICAgIHZhciBsYW5lID0gcGlja0FyYml0cmFyeUxhbmUocmVuZGVyTGFuZXMpO1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzcy5sYW5lcywgbGFuZSk7IC8vIFNjaGVkdWxlIHRoZSBlcnJvciBib3VuZGFyeSB0byByZS1yZW5kZXIgdXNpbmcgdXBkYXRlZCBzdGF0ZVxuXG4gICAgICAgICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZUNsYXNzRXJyb3JVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKGVycm9yJDEsIHdvcmtJblByb2dyZXNzKSwgbGFuZSk7XG4gICAgICAgICAgZW5xdWV1ZUNhcHR1cmVkVXBkYXRlKHdvcmtJblByb2dyZXNzLCB1cGRhdGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzLnR5cGUgIT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlKSB7XG4gICAgICAvLyBMYXp5IGNvbXBvbmVudCBwcm9wcyBjYW4ndCBiZSB2YWxpZGF0ZWQgaW4gY3JlYXRlRWxlbWVudFxuICAgICAgLy8gYmVjYXVzZSB0aGV5J3JlIG9ubHkgZ3VhcmFudGVlZCB0byBiZSByZXNvbHZlZCBoZXJlLlxuICAgICAgdmFyIGlubmVyUHJvcFR5cGVzID0gQ29tcG9uZW50LnByb3BUeXBlcztcblxuICAgICAgaWYgKGlubmVyUHJvcFR5cGVzKSB7XG4gICAgICAgIGNoZWNrUHJvcFR5cGVzKGlubmVyUHJvcFR5cGVzLCBuZXh0UHJvcHMsIC8vIFJlc29sdmVkIHByb3BzXG4gICAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSAvLyBQdXNoIGNvbnRleHQgcHJvdmlkZXJzIGVhcmx5IHRvIHByZXZlbnQgY29udGV4dCBzdGFjayBtaXNtYXRjaGVzLlxuICAvLyBEdXJpbmcgbW91bnRpbmcgd2UgZG9uJ3Qga25vdyB0aGUgY2hpbGQgY29udGV4dCB5ZXQgYXMgdGhlIGluc3RhbmNlIGRvZXNuJ3QgZXhpc3QuXG4gIC8vIFdlIHdpbGwgaW52YWxpZGF0ZSB0aGUgY2hpbGQgY29udGV4dCBpbiBmaW5pc2hDbGFzc0NvbXBvbmVudCgpIHJpZ2h0IGFmdGVyIHJlbmRlcmluZy5cblxuXG4gIHZhciBoYXNDb250ZXh0O1xuXG4gIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgaGFzQ29udGV4dCA9IHRydWU7XG4gICAgcHVzaENvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcyk7XG4gIH0gZWxzZSB7XG4gICAgaGFzQ29udGV4dCA9IGZhbHNlO1xuICB9XG5cbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICB2YXIgc2hvdWxkVXBkYXRlO1xuXG4gIGlmIChpbnN0YW5jZSA9PT0gbnVsbCkge1xuICAgIHJlc2V0U3VzcGVuZGVkQ3VycmVudE9uTW91bnRJbkxlZ2FjeU1vZGUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpOyAvLyBJbiB0aGUgaW5pdGlhbCBwYXNzIHdlIG1pZ2h0IG5lZWQgdG8gY29uc3RydWN0IHRoZSBpbnN0YW5jZS5cblxuICAgIGNvbnN0cnVjdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzKTtcbiAgICBtb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgc2hvdWxkVXBkYXRlID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgLy8gSW4gYSByZXN1bWUsIHdlJ2xsIGFscmVhZHkgaGF2ZSBhbiBpbnN0YW5jZSB3ZSBjYW4gcmV1c2UuXG4gICAgc2hvdWxkVXBkYXRlID0gcmVzdW1lTW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICB9IGVsc2Uge1xuICAgIHNob3VsZFVwZGF0ZSA9IHVwZGF0ZUNsYXNzSW5zdGFuY2UoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICB2YXIgbmV4dFVuaXRPZldvcmsgPSBmaW5pc2hDbGFzc0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBzaG91bGRVcGRhdGUsIGhhc0NvbnRleHQsIHJlbmRlckxhbmVzKTtcblxuICB7XG4gICAgdmFyIGluc3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgICBpZiAoc2hvdWxkVXBkYXRlICYmIGluc3QucHJvcHMgIT09IG5leHRQcm9wcykge1xuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzKSB7XG4gICAgICAgIGVycm9yKCdJdCBsb29rcyBsaWtlICVzIGlzIHJlYXNzaWduaW5nIGl0cyBvd24gYHRoaXMucHJvcHNgIHdoaWxlIHJlbmRlcmluZy4gJyArICdUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIGNhbiBsZWFkIHRvIGNvbmZ1c2luZyBidWdzLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIod29ya0luUHJvZ3Jlc3MpIHx8ICdhIGNvbXBvbmVudCcpO1xuICAgICAgfVxuXG4gICAgICBkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV4dFVuaXRPZldvcms7XG59XG5cbmZ1bmN0aW9uIGZpbmlzaENsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHNob3VsZFVwZGF0ZSwgaGFzQ29udGV4dCwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gUmVmcyBzaG91bGQgdXBkYXRlIGV2ZW4gaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybnMgZmFsc2VcbiAgbWFya1JlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHZhciBkaWRDYXB0dXJlRXJyb3IgPSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncztcblxuICBpZiAoIXNob3VsZFVwZGF0ZSAmJiAhZGlkQ2FwdHVyZUVycm9yKSB7XG4gICAgLy8gQ29udGV4dCBwcm92aWRlcnMgc2hvdWxkIGRlZmVyIHRvIHNDVSBmb3IgcmVuZGVyaW5nXG4gICAgaWYgKGhhc0NvbnRleHQpIHtcbiAgICAgIGludmFsaWRhdGVDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgZmFsc2UpO1xuICAgIH1cblxuICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7IC8vIFJlcmVuZGVyXG5cbiAgUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3M7XG4gIHZhciBuZXh0Q2hpbGRyZW47XG5cbiAgaWYgKGRpZENhcHR1cmVFcnJvciAmJiB0eXBlb2YgQ29tcG9uZW50LmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIElmIHdlIGNhcHR1cmVkIGFuIGVycm9yLCBidXQgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIGlzIG5vdCBkZWZpbmVkLFxuICAgIC8vIHVubW91bnQgYWxsIHRoZSBjaGlsZHJlbi4gY29tcG9uZW50RGlkQ2F0Y2ggd2lsbCBzY2hlZHVsZSBhbiB1cGRhdGUgdG9cbiAgICAvLyByZS1yZW5kZXIgYSBmYWxsYmFjay4gVGhpcyBpcyB0ZW1wb3JhcnkgdW50aWwgd2UgbWlncmF0ZSBldmVyeW9uZSB0b1xuICAgIC8vIHRoZSBuZXcgQVBJLlxuICAgIC8vIFRPRE86IFdhcm4gaW4gYSBmdXR1cmUgcmVsZWFzZS5cbiAgICBuZXh0Q2hpbGRyZW4gPSBudWxsO1xuXG4gICAge1xuICAgICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmcoKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAge1xuICAgICAgbWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQod29ya0luUHJvZ3Jlc3MpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIHNldElzUmVuZGVyaW5nKHRydWUpO1xuICAgICAgbmV4dENoaWxkcmVuID0gaW5zdGFuY2UucmVuZGVyKCk7XG5cbiAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpbnN0YW5jZS5yZW5kZXIoKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2V0SXNSZW5kZXJpbmcoZmFsc2UpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCk7XG4gICAgfVxuICB9IC8vIFJlYWN0IERldlRvb2xzIHJlYWRzIHRoaXMgZmxhZy5cblxuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBlcmZvcm1lZFdvcms7XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgZGlkQ2FwdHVyZUVycm9yKSB7XG4gICAgLy8gSWYgd2UncmUgcmVjb3ZlcmluZyBmcm9tIGFuIGVycm9yLCByZWNvbmNpbGUgd2l0aG91dCByZXVzaW5nIGFueSBvZlxuICAgIC8vIHRoZSBleGlzdGluZyBjaGlsZHJlbi4gQ29uY2VwdHVhbGx5LCB0aGUgbm9ybWFsIGNoaWxkcmVuIGFuZCB0aGUgY2hpbGRyZW5cbiAgICAvLyB0aGF0IGFyZSBzaG93biBvbiBlcnJvciBhcmUgdHdvIGRpZmZlcmVudCBzZXRzLCBzbyB3ZSBzaG91bGRuJ3QgcmV1c2VcbiAgICAvLyBub3JtYWwgY2hpbGRyZW4gZXZlbiBpZiB0aGVpciBpZGVudGl0aWVzIG1hdGNoLlxuICAgIGZvcmNlVW5tb3VudEN1cnJlbnRBbmRSZWNvbmNpbGUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB9IGVsc2Uge1xuICAgIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfSAvLyBNZW1vaXplIHN0YXRlIHVzaW5nIHRoZSB2YWx1ZXMgd2UganVzdCB1c2VkIHRvIHJlbmRlci5cbiAgLy8gVE9ETzogUmVzdHJ1Y3R1cmUgc28gd2UgbmV2ZXIgcmVhZCB2YWx1ZXMgZnJvbSB0aGUgaW5zdGFuY2UuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gaW5zdGFuY2Uuc3RhdGU7IC8vIFRoZSBjb250ZXh0IG1pZ2h0IGhhdmUgY2hhbmdlZCBzbyB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlIGl0LlxuXG4gIGlmIChoYXNDb250ZXh0KSB7XG4gICAgaW52YWxpZGF0ZUNvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCB0cnVlKTtcbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gcHVzaEhvc3RSb290Q29udGV4dCh3b3JrSW5Qcm9ncmVzcykge1xuICB2YXIgcm9vdCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICBpZiAocm9vdC5wZW5kaW5nQ29udGV4dCkge1xuICAgIHB1c2hUb3BMZXZlbENvbnRleHRPYmplY3Qod29ya0luUHJvZ3Jlc3MsIHJvb3QucGVuZGluZ0NvbnRleHQsIHJvb3QucGVuZGluZ0NvbnRleHQgIT09IHJvb3QuY29udGV4dCk7XG4gIH0gZWxzZSBpZiAocm9vdC5jb250ZXh0KSB7XG4gICAgLy8gU2hvdWxkIGFsd2F5cyBiZSBzZXRcbiAgICBwdXNoVG9wTGV2ZWxDb250ZXh0T2JqZWN0KHdvcmtJblByb2dyZXNzLCByb290LmNvbnRleHQsIGZhbHNlKTtcbiAgfVxuXG4gIHB1c2hIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzLCByb290LmNvbnRhaW5lckluZm8pO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVIb3N0Um9vdChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgcHVzaEhvc3RSb290Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nob3VsZCBoYXZlIGEgY3VycmVudCBmaWJlci4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgfVxuXG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBwcmV2U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgcHJldkNoaWxkcmVuID0gcHJldlN0YXRlLmVsZW1lbnQ7XG4gIGNsb25lVXBkYXRlUXVldWUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG5leHRQcm9wcywgbnVsbCwgcmVuZGVyTGFuZXMpO1xuICB2YXIgbmV4dFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHJvb3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gIC8vIGJlaW5nIGNhbGxlZCBcImVsZW1lbnRcIi5cblxuXG4gIHZhciBuZXh0Q2hpbGRyZW4gPSBuZXh0U3RhdGUuZWxlbWVudDtcblxuICBpZiAoIHByZXZTdGF0ZS5pc0RlaHlkcmF0ZWQpIHtcbiAgICAvLyBUaGlzIGlzIGEgaHlkcmF0aW9uIHJvb3Qgd2hvc2Ugc2hlbGwgaGFzIG5vdCB5ZXQgaHlkcmF0ZWQuIFdlIHNob3VsZFxuICAgIC8vIGF0dGVtcHQgdG8gaHlkcmF0ZS5cbiAgICAvLyBGbGlwIGlzRGVoeWRyYXRlZCB0byBmYWxzZSB0byBpbmRpY2F0ZSB0aGF0IHdoZW4gdGhpcyByZW5kZXJcbiAgICAvLyBmaW5pc2hlcywgdGhlIHJvb3Qgd2lsbCBubyBsb25nZXIgYmUgZGVoeWRyYXRlZC5cbiAgICB2YXIgb3ZlcnJpZGVTdGF0ZSA9IHtcbiAgICAgIGVsZW1lbnQ6IG5leHRDaGlsZHJlbixcbiAgICAgIGlzRGVoeWRyYXRlZDogZmFsc2UsXG4gICAgICBjYWNoZTogbmV4dFN0YXRlLmNhY2hlLFxuICAgICAgcGVuZGluZ1N1c3BlbnNlQm91bmRhcmllczogbmV4dFN0YXRlLnBlbmRpbmdTdXNwZW5zZUJvdW5kYXJpZXMsXG4gICAgICB0cmFuc2l0aW9uczogbmV4dFN0YXRlLnRyYW5zaXRpb25zXG4gICAgfTtcbiAgICB2YXIgdXBkYXRlUXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTsgLy8gYGJhc2VTdGF0ZWAgY2FuIGFsd2F5cyBiZSB0aGUgbGFzdCBzdGF0ZSBiZWNhdXNlIHRoZSByb290IGRvZXNuJ3RcbiAgICAvLyBoYXZlIHJlZHVjZXIgZnVuY3Rpb25zIHNvIGl0IGRvZXNuJ3QgbmVlZCByZWJhc2luZy5cblxuICAgIHVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZSA9IG92ZXJyaWRlU3RhdGU7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG92ZXJyaWRlU3RhdGU7XG5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBGb3JjZUNsaWVudFJlbmRlcikge1xuICAgICAgLy8gU29tZXRoaW5nIGVycm9yZWQgZHVyaW5nIGEgcHJldmlvdXMgYXR0ZW1wdCB0byBoeWRyYXRlIHRoZSBzaGVsbCwgc28gd2VcbiAgICAgIC8vIGZvcmNlZCBhIGNsaWVudCByZW5kZXIuXG4gICAgICB2YXIgcmVjb3ZlcmFibGVFcnJvciA9IGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKG5ldyBFcnJvcignVGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGh5ZHJhdGluZy4gQmVjYXVzZSB0aGUgZXJyb3IgaGFwcGVuZWQgb3V0c2lkZSAnICsgJ29mIGEgU3VzcGVuc2UgYm91bmRhcnksIHRoZSBlbnRpcmUgcm9vdCB3aWxsIHN3aXRjaCB0byAnICsgJ2NsaWVudCByZW5kZXJpbmcuJyksIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBtb3VudEhvc3RSb290V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcywgcmVjb3ZlcmFibGVFcnJvcik7XG4gICAgfSBlbHNlIGlmIChuZXh0Q2hpbGRyZW4gIT09IHByZXZDaGlsZHJlbikge1xuICAgICAgdmFyIF9yZWNvdmVyYWJsZUVycm9yID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIobmV3IEVycm9yKCdUaGlzIHJvb3QgcmVjZWl2ZWQgYW4gZWFybHkgdXBkYXRlLCBiZWZvcmUgYW55dGhpbmcgd2FzIGFibGUgJyArICdoeWRyYXRlLiBTd2l0Y2hlZCB0aGUgZW50aXJlIHJvb3QgdG8gY2xpZW50IHJlbmRlcmluZy4nKSwgd29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICByZXR1cm4gbW91bnRIb3N0Um9vdFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMsIF9yZWNvdmVyYWJsZUVycm9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIG91dGVybW9zdCBzaGVsbCBoYXMgbm90IGh5ZHJhdGVkIHlldC4gU3RhcnQgaHlkcmF0aW5nLlxuICAgICAgZW50ZXJIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgIHZhciBjaGlsZCA9IG1vdW50Q2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIG51bGwsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjaGlsZDtcbiAgICAgIHZhciBub2RlID0gY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgIC8vIE1hcmsgZWFjaCBjaGlsZCBhcyBoeWRyYXRpbmcuIFRoaXMgaXMgYSBmYXN0IHBhdGggdG8ga25vdyB3aGV0aGVyIHRoaXNcbiAgICAgICAgLy8gdHJlZSBpcyBwYXJ0IG9mIGEgaHlkcmF0aW5nIHRyZWUuIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgYSBjaGlsZFxuICAgICAgICAvLyBub2RlIGhhcyBmdWxseSBtb3VudGVkIHlldCwgYW5kIGZvciBzY2hlZHVsaW5nIGV2ZW50IHJlcGxheWluZy5cbiAgICAgICAgLy8gQ29uY2VwdHVhbGx5IHRoaXMgaXMgc2ltaWxhciB0byBQbGFjZW1lbnQgaW4gdGhhdCBhIG5ldyBzdWJ0cmVlIGlzXG4gICAgICAgIC8vIGluc2VydGVkIGludG8gdGhlIFJlYWN0IHRyZWUgaGVyZS4gSXQganVzdCBoYXBwZW5zIHRvIG5vdCBuZWVkIERPTVxuICAgICAgICAvLyBtdXRhdGlvbnMgYmVjYXVzZSBpdCBhbHJlYWR5IGV4aXN0cy5cbiAgICAgICAgbm9kZS5mbGFncyA9IG5vZGUuZmxhZ3MgJiB+UGxhY2VtZW50IHwgSHlkcmF0aW5nO1xuICAgICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBSb290IGlzIG5vdCBkZWh5ZHJhdGVkLiBFaXRoZXIgdGhpcyBpcyBhIGNsaWVudC1vbmx5IHJvb3QsIG9yIGl0XG4gICAgLy8gYWxyZWFkeSBoeWRyYXRlZC5cbiAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG5cbiAgICBpZiAobmV4dENoaWxkcmVuID09PSBwcmV2Q2hpbGRyZW4pIHtcbiAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgfVxuXG4gICAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiBtb3VudEhvc3RSb290V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcywgcmVjb3ZlcmFibGVFcnJvcikge1xuICAvLyBSZXZlcnQgdG8gY2xpZW50IHJlbmRlcmluZy5cbiAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuICBxdWV1ZUh5ZHJhdGlvbkVycm9yKHJlY292ZXJhYmxlRXJyb3IpO1xuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBGb3JjZUNsaWVudFJlbmRlcjtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUhvc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHB1c2hIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICB0cnlUb0NsYWltTmV4dEh5ZHJhdGFibGVJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cblxuICB2YXIgdHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBwcmV2UHJvcHMgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogbnVsbDtcbiAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgdmFyIGlzRGlyZWN0VGV4dENoaWxkID0gc2hvdWxkU2V0VGV4dENvbnRlbnQodHlwZSwgbmV4dFByb3BzKTtcblxuICBpZiAoaXNEaXJlY3RUZXh0Q2hpbGQpIHtcbiAgICAvLyBXZSBzcGVjaWFsIGNhc2UgYSBkaXJlY3QgdGV4dCBjaGlsZCBvZiBhIGhvc3Qgbm9kZS4gVGhpcyBpcyBhIGNvbW1vblxuICAgIC8vIGNhc2UuIFdlIHdvbid0IGhhbmRsZSBpdCBhcyBhIHJlaWZpZWQgY2hpbGQuIFdlIHdpbGwgaW5zdGVhZCBoYW5kbGVcbiAgICAvLyB0aGlzIGluIHRoZSBob3N0IGVudmlyb25tZW50IHRoYXQgYWxzbyBoYXMgYWNjZXNzIHRvIHRoaXMgcHJvcC4gVGhhdFxuICAgIC8vIGF2b2lkcyBhbGxvY2F0aW5nIGFub3RoZXIgSG9zdFRleHQgZmliZXIgYW5kIHRyYXZlcnNpbmcgaXQuXG4gICAgbmV4dENoaWxkcmVuID0gbnVsbDtcbiAgfSBlbHNlIGlmIChwcmV2UHJvcHMgIT09IG51bGwgJiYgc2hvdWxkU2V0VGV4dENvbnRlbnQodHlwZSwgcHJldlByb3BzKSkge1xuICAgIC8vIElmIHdlJ3JlIHN3aXRjaGluZyBmcm9tIGEgZGlyZWN0IHRleHQgY2hpbGQgdG8gYSBub3JtYWwgY2hpbGQsIG9yIHRvXG4gICAgLy8gZW1wdHksIHdlIG5lZWQgdG8gc2NoZWR1bGUgdGhlIHRleHQgY29udGVudCB0byBiZSByZXNldC5cbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBDb250ZW50UmVzZXQ7XG4gIH1cblxuICBtYXJrUmVmKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUhvc3RUZXh0KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSB7XG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgdHJ5VG9DbGFpbU5leHRIeWRyYXRhYmxlSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MpO1xuICB9IC8vIE5vdGhpbmcgdG8gZG8gaGVyZS4gVGhpcyBpcyB0ZXJtaW5hbC4gV2UnbGwgZG8gdGhlIGNvbXBsZXRpb24gc3RlcFxuICAvLyBpbW1lZGlhdGVseSBhZnRlci5cblxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBtb3VudExhenlDb21wb25lbnQoX2N1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBlbGVtZW50VHlwZSwgcmVuZGVyTGFuZXMpIHtcbiAgcmVzZXRTdXNwZW5kZWRDdXJyZW50T25Nb3VudEluTGVnYWN5TW9kZShfY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICB2YXIgcHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBsYXp5Q29tcG9uZW50ID0gZWxlbWVudFR5cGU7XG4gIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuICB2YXIgQ29tcG9uZW50ID0gaW5pdChwYXlsb2FkKTsgLy8gU3RvcmUgdGhlIHVud3JhcHBlZCBjb21wb25lbnQgaW4gdGhlIHR5cGUuXG5cbiAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudDtcbiAgdmFyIHJlc29sdmVkVGFnID0gd29ya0luUHJvZ3Jlc3MudGFnID0gcmVzb2x2ZUxhenlDb21wb25lbnRUYWcoQ29tcG9uZW50KTtcbiAgdmFyIHJlc29sdmVkUHJvcHMgPSByZXNvbHZlRGVmYXVsdFByb3BzKENvbXBvbmVudCwgcHJvcHMpO1xuICB2YXIgY2hpbGQ7XG5cbiAgc3dpdGNoIChyZXNvbHZlZFRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB2YWxpZGF0ZUZ1bmN0aW9uQ29tcG9uZW50SW5EZXYod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCk7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudCA9IHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyhDb21wb25lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGQgPSB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlZFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH1cblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gQ29tcG9uZW50ID0gcmVzb2x2ZUNsYXNzRm9ySG90UmVsb2FkaW5nKENvbXBvbmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZCA9IHVwZGF0ZUNsYXNzQ29tcG9uZW50KG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlc29sdmVkUHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgfVxuXG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudCA9IHJlc29sdmVGb3J3YXJkUmVmRm9ySG90UmVsb2FkaW5nKENvbXBvbmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZCA9IHVwZGF0ZUZvcndhcmRSZWYobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcmVzb2x2ZWRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICB9XG5cbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgICAgICAgIHZhciBvdXRlclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgICAgICAgIGlmIChvdXRlclByb3BUeXBlcykge1xuICAgICAgICAgICAgICBjaGVja1Byb3BUeXBlcyhvdXRlclByb3BUeXBlcywgcmVzb2x2ZWRQcm9wcywgLy8gUmVzb2x2ZWQgZm9yIG91dGVyIG9ubHlcbiAgICAgICAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGQgPSB1cGRhdGVNZW1vQ29tcG9uZW50KG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlc29sdmVEZWZhdWx0UHJvcHMoQ29tcG9uZW50LnR5cGUsIHJlc29sdmVkUHJvcHMpLCAvLyBUaGUgaW5uZXIgdHlwZSBjYW4gaGF2ZSBkZWZhdWx0cyB0b29cbiAgICAgICAgcmVuZGVyTGFuZXMpO1xuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICB9XG4gIH1cblxuICB2YXIgaGludCA9ICcnO1xuXG4gIHtcbiAgICBpZiAoQ29tcG9uZW50ICE9PSBudWxsICYmIHR5cGVvZiBDb21wb25lbnQgPT09ICdvYmplY3QnICYmIENvbXBvbmVudC4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICBoaW50ID0gJyBEaWQgeW91IHdyYXAgYSBjb21wb25lbnQgaW4gUmVhY3QubGF6eSgpIG1vcmUgdGhhbiBvbmNlPyc7XG4gICAgfVxuICB9IC8vIFRoaXMgbWVzc2FnZSBpbnRlbnRpb25hbGx5IGRvZXNuJ3QgbWVudGlvbiBGb3J3YXJkUmVmIG9yIE1lbW9Db21wb25lbnRcbiAgLy8gYmVjYXVzZSB0aGUgZmFjdCB0aGF0IGl0J3MgYSBzZXBhcmF0ZSB0eXBlIG9mIHdvcmsgaXMgYW5cbiAgLy8gaW1wbGVtZW50YXRpb24gZGV0YWlsLlxuXG5cbiAgdGhyb3cgbmV3IEVycm9yKFwiRWxlbWVudCB0eXBlIGlzIGludmFsaWQuIFJlY2VpdmVkIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvOiBcIiArIENvbXBvbmVudCArIFwiLiBcIiArIChcIkxhenkgZWxlbWVudCB0eXBlIG11c3QgcmVzb2x2ZSB0byBhIGNsYXNzIG9yIGZ1bmN0aW9uLlwiICsgaGludCkpO1xufVxuXG5mdW5jdGlvbiBtb3VudEluY29tcGxldGVDbGFzc0NvbXBvbmVudChfY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcykge1xuICByZXNldFN1c3BlbmRlZEN1cnJlbnRPbk1vdW50SW5MZWdhY3lNb2RlKF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7IC8vIFByb21vdGUgdGhlIGZpYmVyIHRvIGEgY2xhc3MgYW5kIHRyeSByZW5kZXJpbmcgYWdhaW4uXG5cbiAgd29ya0luUHJvZ3Jlc3MudGFnID0gQ2xhc3NDb21wb25lbnQ7IC8vIFRoZSByZXN0IG9mIHRoaXMgZnVuY3Rpb24gaXMgYSBmb3JrIG9mIGB1cGRhdGVDbGFzc0NvbXBvbmVudGBcbiAgLy8gUHVzaCBjb250ZXh0IHByb3ZpZGVycyBlYXJseSB0byBwcmV2ZW50IGNvbnRleHQgc3RhY2sgbWlzbWF0Y2hlcy5cbiAgLy8gRHVyaW5nIG1vdW50aW5nIHdlIGRvbid0IGtub3cgdGhlIGNoaWxkIGNvbnRleHQgeWV0IGFzIHRoZSBpbnN0YW5jZSBkb2Vzbid0IGV4aXN0LlxuICAvLyBXZSB3aWxsIGludmFsaWRhdGUgdGhlIGNoaWxkIGNvbnRleHQgaW4gZmluaXNoQ2xhc3NDb21wb25lbnQoKSByaWdodCBhZnRlciByZW5kZXJpbmcuXG5cbiAgdmFyIGhhc0NvbnRleHQ7XG5cbiAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICBoYXNDb250ZXh0ID0gdHJ1ZTtcbiAgICBwdXNoQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzKTtcbiAgfSBlbHNlIHtcbiAgICBoYXNDb250ZXh0ID0gZmFsc2U7XG4gIH1cblxuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICBjb25zdHJ1Y3RDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcyk7XG4gIG1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIGZpbmlzaENsYXNzQ29tcG9uZW50KG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHRydWUsIGhhc0NvbnRleHQsIHJlbmRlckxhbmVzKTtcbn1cblxuZnVuY3Rpb24gbW91bnRJbmRldGVybWluYXRlQ29tcG9uZW50KF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZW5kZXJMYW5lcykge1xuICByZXNldFN1c3BlbmRlZEN1cnJlbnRPbk1vdW50SW5MZWdhY3lNb2RlKF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHZhciBwcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIGNvbnRleHQ7XG5cbiAge1xuICAgIHZhciB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgZmFsc2UpO1xuICAgIGNvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpO1xuICB9XG5cbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgdmFyIHZhbHVlO1xuICB2YXIgaGFzSWQ7XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKHdvcmtJblByb2dyZXNzKTtcbiAgfVxuXG4gIHtcbiAgICBpZiAoQ29tcG9uZW50LnByb3RvdHlwZSAmJiB0eXBlb2YgQ29tcG9uZW50LnByb3RvdHlwZS5yZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dEJhZENsYXNzW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgIGVycm9yKFwiVGhlIDwlcyAvPiBjb21wb25lbnQgYXBwZWFycyB0byBoYXZlIGEgcmVuZGVyIG1ldGhvZCwgYnV0IGRvZXNuJ3QgZXh0ZW5kIFJlYWN0LkNvbXBvbmVudC4gXCIgKyAnVGhpcyBpcyBsaWtlbHkgdG8gY2F1c2UgZXJyb3JzLiBDaGFuZ2UgJXMgdG8gZXh0ZW5kIFJlYWN0LkNvbXBvbmVudCBpbnN0ZWFkLicsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dEJhZENsYXNzW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZExlZ2FjeUNvbnRleHRXYXJuaW5nKHdvcmtJblByb2dyZXNzLCBudWxsKTtcbiAgICB9XG5cbiAgICBzZXRJc1JlbmRlcmluZyh0cnVlKTtcbiAgICBSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICB2YWx1ZSA9IHJlbmRlcldpdGhIb29rcyhudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBwcm9wcywgY29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICAgIGhhc0lkID0gY2hlY2tEaWRSZW5kZXJJZEhvb2soKTtcbiAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gIH1cblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuXG4gIHtcbiAgICAvLyBTdXBwb3J0IGZvciBtb2R1bGUgY29tcG9uZW50cyBpcyBkZXByZWNhdGVkIGFuZCBpcyByZW1vdmVkIGJlaGluZCBhIGZsYWcuXG4gICAgLy8gV2hldGhlciBvciBub3QgaXQgd291bGQgY3Jhc2ggbGF0ZXIsIHdlIHdhbnQgdG8gc2hvdyBhIGdvb2QgbWVzc2FnZSBpbiBERVYgZmlyc3QuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJyAmJiB2YWx1ZS4kJHR5cGVvZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgX2NvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSB8fCAnVW5rbm93bic7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0TW9kdWxlUGF0dGVybkNvbXBvbmVudFtfY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZXJyb3IoJ1RoZSA8JXMgLz4gY29tcG9uZW50IGFwcGVhcnMgdG8gYmUgYSBmdW5jdGlvbiBjb21wb25lbnQgdGhhdCByZXR1cm5zIGEgY2xhc3MgaW5zdGFuY2UuICcgKyAnQ2hhbmdlICVzIHRvIGEgY2xhc3MgdGhhdCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCBpbnN0ZWFkLiAnICsgXCJJZiB5b3UgY2FuJ3QgdXNlIGEgY2xhc3MgdHJ5IGFzc2lnbmluZyB0aGUgcHJvdG90eXBlIG9uIHRoZSBmdW5jdGlvbiBhcyBhIHdvcmthcm91bmQuIFwiICsgXCJgJXMucHJvdG90eXBlID0gUmVhY3QuQ29tcG9uZW50LnByb3RvdHlwZWAuIERvbid0IHVzZSBhbiBhcnJvdyBmdW5jdGlvbiBzaW5jZSBpdCBcIiArICdjYW5ub3QgYmUgY2FsbGVkIHdpdGggYG5ld2AgYnkgUmVhY3QuJywgX2NvbXBvbmVudE5hbWUsIF9jb21wb25lbnROYW1lLCBfY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgZGlkV2FybkFib3V0TW9kdWxlUGF0dGVybkNvbXBvbmVudFtfY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICggLy8gUnVuIHRoZXNlIGNoZWNrcyBpbiBwcm9kdWN0aW9uIG9ubHkgaWYgdGhlIGZsYWcgaXMgb2ZmLlxuICAvLyBFdmVudHVhbGx5IHdlJ2xsIGRlbGV0ZSB0aGlzIGJyYW5jaCBhbHRvZ2V0aGVyLlxuICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUucmVuZGVyID09PSAnZnVuY3Rpb24nICYmIHZhbHVlLiQkdHlwZW9mID09PSB1bmRlZmluZWQpIHtcbiAgICB7XG4gICAgICB2YXIgX2NvbXBvbmVudE5hbWUyID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dE1vZHVsZVBhdHRlcm5Db21wb25lbnRbX2NvbXBvbmVudE5hbWUyXSkge1xuICAgICAgICBlcnJvcignVGhlIDwlcyAvPiBjb21wb25lbnQgYXBwZWFycyB0byBiZSBhIGZ1bmN0aW9uIGNvbXBvbmVudCB0aGF0IHJldHVybnMgYSBjbGFzcyBpbnN0YW5jZS4gJyArICdDaGFuZ2UgJXMgdG8gYSBjbGFzcyB0aGF0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IGluc3RlYWQuICcgKyBcIklmIHlvdSBjYW4ndCB1c2UgYSBjbGFzcyB0cnkgYXNzaWduaW5nIHRoZSBwcm90b3R5cGUgb24gdGhlIGZ1bmN0aW9uIGFzIGEgd29ya2Fyb3VuZC4gXCIgKyBcImAlcy5wcm90b3R5cGUgPSBSZWFjdC5Db21wb25lbnQucHJvdG90eXBlYC4gRG9uJ3QgdXNlIGFuIGFycm93IGZ1bmN0aW9uIHNpbmNlIGl0IFwiICsgJ2Nhbm5vdCBiZSBjYWxsZWQgd2l0aCBgbmV3YCBieSBSZWFjdC4nLCBfY29tcG9uZW50TmFtZTIsIF9jb21wb25lbnROYW1lMiwgX2NvbXBvbmVudE5hbWUyKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50W19jb21wb25lbnROYW1lMl0gPSB0cnVlO1xuICAgICAgfVxuICAgIH0gLy8gUHJvY2VlZCB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoaXMgaXMgYSBjbGFzcyBpbnN0YW5jZVxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBDbGFzc0NvbXBvbmVudDsgLy8gVGhyb3cgb3V0IGFueSBob29rcyB0aGF0IHdlcmUgdXNlZC5cblxuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDsgLy8gUHVzaCBjb250ZXh0IHByb3ZpZGVycyBlYXJseSB0byBwcmV2ZW50IGNvbnRleHQgc3RhY2sgbWlzbWF0Y2hlcy5cbiAgICAvLyBEdXJpbmcgbW91bnRpbmcgd2UgZG9uJ3Qga25vdyB0aGUgY2hpbGQgY29udGV4dCB5ZXQgYXMgdGhlIGluc3RhbmNlIGRvZXNuJ3QgZXhpc3QuXG4gICAgLy8gV2Ugd2lsbCBpbnZhbGlkYXRlIHRoZSBjaGlsZCBjb250ZXh0IGluIGZpbmlzaENsYXNzQ29tcG9uZW50KCkgcmlnaHQgYWZ0ZXIgcmVuZGVyaW5nLlxuXG4gICAgdmFyIGhhc0NvbnRleHQgPSBmYWxzZTtcblxuICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICBoYXNDb250ZXh0ID0gdHJ1ZTtcbiAgICAgIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICBoYXNDb250ZXh0ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IHZhbHVlLnN0YXRlICE9PSBudWxsICYmIHZhbHVlLnN0YXRlICE9PSB1bmRlZmluZWQgPyB2YWx1ZS5zdGF0ZSA6IG51bGw7XG4gICAgaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzKTtcbiAgICBhZG9wdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIHZhbHVlKTtcbiAgICBtb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICByZXR1cm4gZmluaXNoQ2xhc3NDb21wb25lbnQobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSwgaGFzQ29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICB9IGVsc2Uge1xuICAgIC8vIFByb2NlZWQgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGlzIGlzIGEgZnVuY3Rpb24gY29tcG9uZW50XG4gICAgd29ya0luUHJvZ3Jlc3MudGFnID0gRnVuY3Rpb25Db21wb25lbnQ7XG5cbiAgICB7XG5cbiAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YWx1ZSA9IHJlbmRlcldpdGhIb29rcyhudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBwcm9wcywgY29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICAgICAgICAgIGhhc0lkID0gY2hlY2tEaWRSZW5kZXJJZEhvb2soKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBoYXNJZCkge1xuICAgICAgcHVzaE1hdGVyaWFsaXplZFRyZWVJZCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuXG4gICAgcmVjb25jaWxlQ2hpbGRyZW4obnVsbCwgd29ya0luUHJvZ3Jlc3MsIHZhbHVlLCByZW5kZXJMYW5lcyk7XG5cbiAgICB7XG4gICAgICB2YWxpZGF0ZUZ1bmN0aW9uQ29tcG9uZW50SW5EZXYod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlRnVuY3Rpb25Db21wb25lbnRJbkRldih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50KSB7XG4gIHtcbiAgICBpZiAoQ29tcG9uZW50KSB7XG4gICAgICBpZiAoQ29tcG9uZW50LmNoaWxkQ29udGV4dFR5cGVzKSB7XG4gICAgICAgIGVycm9yKCclcyguLi4pOiBjaGlsZENvbnRleHRUeXBlcyBjYW5ub3QgYmUgZGVmaW5lZCBvbiBhIGZ1bmN0aW9uIGNvbXBvbmVudC4nLCBDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50Lm5hbWUgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5yZWYgIT09IG51bGwpIHtcbiAgICAgIHZhciBpbmZvID0gJyc7XG4gICAgICB2YXIgb3duZXJOYW1lID0gZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKTtcblxuICAgICAgaWYgKG93bmVyTmFtZSkge1xuICAgICAgICBpbmZvICs9ICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG93bmVyTmFtZSArICdgLic7XG4gICAgICB9XG5cbiAgICAgIHZhciB3YXJuaW5nS2V5ID0gb3duZXJOYW1lIHx8ICcnO1xuICAgICAgdmFyIGRlYnVnU291cmNlID0gd29ya0luUHJvZ3Jlc3MuX2RlYnVnU291cmNlO1xuXG4gICAgICBpZiAoZGVidWdTb3VyY2UpIHtcbiAgICAgICAgd2FybmluZ0tleSA9IGRlYnVnU291cmNlLmZpbGVOYW1lICsgJzonICsgZGVidWdTb3VyY2UubGluZU51bWJlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRGdW5jdGlvblJlZnNbd2FybmluZ0tleV0pIHtcbiAgICAgICAgZGlkV2FybkFib3V0RnVuY3Rpb25SZWZzW3dhcm5pbmdLZXldID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignRnVuY3Rpb24gY29tcG9uZW50cyBjYW5ub3QgYmUgZ2l2ZW4gcmVmcy4gJyArICdBdHRlbXB0cyB0byBhY2Nlc3MgdGhpcyByZWYgd2lsbCBmYWlsLiAnICsgJ0RpZCB5b3UgbWVhbiB0byB1c2UgUmVhY3QuZm9yd2FyZFJlZigpPyVzJywgaW5mbyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCBDb21wb25lbnQuZGVmYXVsdFByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dERlZmF1bHRQcm9wc09uRnVuY3Rpb25Db21wb25lbnRbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZXJyb3IoJyVzOiBTdXBwb3J0IGZvciBkZWZhdWx0UHJvcHMgd2lsbCBiZSByZW1vdmVkIGZyb20gZnVuY3Rpb24gY29tcG9uZW50cyAnICsgJ2luIGEgZnV0dXJlIG1ham9yIHJlbGVhc2UuIFVzZSBKYXZhU2NyaXB0IGRlZmF1bHQgcGFyYW1ldGVycyBpbnN0ZWFkLicsIGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dERlZmF1bHRQcm9wc09uRnVuY3Rpb25Db21wb25lbnRbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgQ29tcG9uZW50LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIF9jb21wb25lbnROYW1lMyA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpIHx8ICdVbmtub3duJztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRHZXREZXJpdmVkU3RhdGVPbkZ1bmN0aW9uQ29tcG9uZW50W19jb21wb25lbnROYW1lM10pIHtcbiAgICAgICAgZXJyb3IoJyVzOiBGdW5jdGlvbiBjb21wb25lbnRzIGRvIG5vdCBzdXBwb3J0IGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4nLCBfY29tcG9uZW50TmFtZTMpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dEdldERlcml2ZWRTdGF0ZU9uRnVuY3Rpb25Db21wb25lbnRbX2NvbXBvbmVudE5hbWUzXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBDb21wb25lbnQuY29udGV4dFR5cGUgPT09ICdvYmplY3QnICYmIENvbXBvbmVudC5jb250ZXh0VHlwZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIF9jb21wb25lbnROYW1lNCA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpIHx8ICdVbmtub3duJztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRDb250ZXh0VHlwZU9uRnVuY3Rpb25Db21wb25lbnRbX2NvbXBvbmVudE5hbWU0XSkge1xuICAgICAgICBlcnJvcignJXM6IEZ1bmN0aW9uIGNvbXBvbmVudHMgZG8gbm90IHN1cHBvcnQgY29udGV4dFR5cGUuJywgX2NvbXBvbmVudE5hbWU0KTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZU9uRnVuY3Rpb25Db21wb25lbnRbX2NvbXBvbmVudE5hbWU0XSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBTVVNQRU5ERURfTUFSS0VSID0ge1xuICBkZWh5ZHJhdGVkOiBudWxsLFxuICB0cmVlQ29udGV4dDogbnVsbCxcbiAgcmV0cnlMYW5lOiBOb0xhbmVcbn07XG5cbmZ1bmN0aW9uIG1vdW50U3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShyZW5kZXJMYW5lcykge1xuICByZXR1cm4ge1xuICAgIGJhc2VMYW5lczogcmVuZGVyTGFuZXMsXG4gICAgY2FjaGVQb29sOiBnZXRTdXNwZW5kZWRDYWNoZSgpLFxuICAgIHRyYW5zaXRpb25zOiBudWxsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN1c3BlbnNlT2Zmc2NyZWVuU3RhdGUocHJldk9mZnNjcmVlblN0YXRlLCByZW5kZXJMYW5lcykge1xuICB2YXIgY2FjaGVQb29sID0gbnVsbDtcblxuICByZXR1cm4ge1xuICAgIGJhc2VMYW5lczogbWVyZ2VMYW5lcyhwcmV2T2Zmc2NyZWVuU3RhdGUuYmFzZUxhbmVzLCByZW5kZXJMYW5lcyksXG4gICAgY2FjaGVQb29sOiBjYWNoZVBvb2wsXG4gICAgdHJhbnNpdGlvbnM6IHByZXZPZmZzY3JlZW5TdGF0ZS50cmFuc2l0aW9uc1xuICB9O1xufSAvLyBUT0RPOiBQcm9iYWJseSBzaG91bGQgaW5saW5lIHRoaXMgYmFja1xuXG5cbmZ1bmN0aW9uIHNob3VsZFJlbWFpbk9uRmFsbGJhY2soc3VzcGVuc2VDb250ZXh0LCBjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgLy8gSWYgd2UncmUgYWxyZWFkeSBzaG93aW5nIGEgZmFsbGJhY2ssIHRoZXJlIGFyZSBjYXNlcyB3aGVyZSB3ZSBuZWVkIHRvXG4gIC8vIHJlbWFpbiBvbiB0aGF0IGZhbGxiYWNrIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgY29udGVudCBoYXMgcmVzb2x2ZWQuXG4gIC8vIEZvciBleGFtcGxlLCBTdXNwZW5zZUxpc3QgY29vcmRpbmF0ZXMgd2hlbiBuZXN0ZWQgY29udGVudCBhcHBlYXJzLlxuICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgIHZhciBzdXNwZW5zZVN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuXG4gICAgaWYgKHN1c3BlbnNlU3RhdGUgPT09IG51bGwpIHtcbiAgICAgIC8vIEN1cnJlbnRseSBzaG93aW5nIGNvbnRlbnQuIERvbid0IGhpZGUgaXQsIGV2ZW4gaWYgRm9yY2VTdXNwZW5zZUZhbGxiYWNrXG4gICAgICAvLyBpcyB0cnVlLiBNb3JlIHByZWNpc2UgbmFtZSBtaWdodCBiZSBcIkZvcmNlUmVtYWluU3VzcGVuc2VGYWxsYmFja1wiLlxuICAgICAgLy8gTm90ZTogVGhpcyBpcyBhIGZhY3RvcmluZyBzbWVsbC4gQ2FuJ3QgcmVtYWluIG9uIGEgZmFsbGJhY2sgaWYgdGhlcmUnc1xuICAgICAgLy8gbm8gZmFsbGJhY2sgdG8gcmVtYWluIG9uLlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSAvLyBOb3QgY3VycmVudGx5IHNob3dpbmcgY29udGVudC4gQ29uc3VsdCB0aGUgU3VzcGVuc2UgY29udGV4dC5cblxuXG4gIHJldHVybiBoYXNTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0LCBGb3JjZVN1c3BlbnNlRmFsbGJhY2spO1xufVxuXG5mdW5jdGlvbiBnZXRSZW1haW5pbmdXb3JrSW5QcmltYXJ5VHJlZShjdXJyZW50LCByZW5kZXJMYW5lcykge1xuICAvLyBUT0RPOiBTaG91bGQgbm90IHJlbW92ZSByZW5kZXIgbGFuZXMgdGhhdCB3ZXJlIHBpbmdlZCBkdXJpbmcgdGhpcyByZW5kZXJcbiAgcmV0dXJuIHJlbW92ZUxhbmVzKGN1cnJlbnQuY2hpbGRMYW5lcywgcmVuZGVyTGFuZXMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTdXNwZW5zZUNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wczsgLy8gVGhpcyBpcyB1c2VkIGJ5IERldlRvb2xzIHRvIGZvcmNlIGEgYm91bmRhcnkgdG8gc3VzcGVuZC5cblxuICB7XG4gICAgaWYgKHNob3VsZFN1c3BlbmQod29ya0luUHJvZ3Jlc3MpKSB7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgIH1cbiAgfVxuXG4gIHZhciBzdXNwZW5zZUNvbnRleHQgPSBzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQ7XG4gIHZhciBzaG93RmFsbGJhY2sgPSBmYWxzZTtcbiAgdmFyIGRpZFN1c3BlbmQgPSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncztcblxuICBpZiAoZGlkU3VzcGVuZCB8fCBzaG91bGRSZW1haW5PbkZhbGxiYWNrKHN1c3BlbnNlQ29udGV4dCwgY3VycmVudCkpIHtcbiAgICAvLyBTb21ldGhpbmcgaW4gdGhpcyBib3VuZGFyeSdzIHN1YnRyZWUgYWxyZWFkeSBzdXNwZW5kZWQuIFN3aXRjaCB0b1xuICAgIC8vIHJlbmRlcmluZyB0aGUgZmFsbGJhY2sgY2hpbGRyZW4uXG4gICAgc2hvd0ZhbGxiYWNrID0gdHJ1ZTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSB+RGlkQ2FwdHVyZTtcbiAgfSBlbHNlIHtcbiAgICAvLyBBdHRlbXB0aW5nIHRoZSBtYWluIGNvbnRlbnRcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50Lm1lbW9pemVkU3RhdGUgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgaXMgYSBuZXcgbW91bnQgb3IgdGhpcyBib3VuZGFyeSBpcyBhbHJlYWR5IHNob3dpbmcgYSBmYWxsYmFjayBzdGF0ZS5cbiAgICAgIC8vIE1hcmsgdGhpcyBzdWJ0cmVlIGNvbnRleHQgYXMgaGF2aW5nIGF0IGxlYXN0IG9uZSBpbnZpc2libGUgcGFyZW50IHRoYXQgY291bGRcbiAgICAgIC8vIGhhbmRsZSB0aGUgZmFsbGJhY2sgc3RhdGUuXG4gICAgICAvLyBBdm9pZGVkIGJvdW5kYXJpZXMgYXJlIG5vdCBjb25zaWRlcmVkIHNpbmNlIHRoZXkgY2Fubm90IGhhbmRsZSBwcmVmZXJyZWQgZmFsbGJhY2sgc3RhdGVzLlxuICAgICAge1xuICAgICAgICBzdXNwZW5zZUNvbnRleHQgPSBhZGRTdWJ0cmVlU3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCwgSW52aXNpYmxlUGFyZW50U3VzcGVuc2VDb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdXNwZW5zZUNvbnRleHQgPSBzZXREZWZhdWx0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQpO1xuICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZUNvbnRleHQpOyAvLyBPSywgdGhlIG5leHQgcGFydCBpcyBjb25mdXNpbmcuIFdlJ3JlIGFib3V0IHRvIHJlY29uY2lsZSB0aGUgU3VzcGVuc2VcbiAgLy8gYm91bmRhcnkncyBjaGlsZHJlbi4gVGhpcyBpbnZvbHZlcyBzb21lIGN1c3RvbSByZWNvbmNpbGlhdGlvbiBsb2dpYy4gVHdvXG4gIC8vIG1haW4gcmVhc29ucyB0aGlzIGlzIHNvIGNvbXBsaWNhdGVkLlxuICAvL1xuICAvLyBGaXJzdCwgTGVnYWN5IE1vZGUgaGFzIGRpZmZlcmVudCBzZW1hbnRpY3MgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBUaGVcbiAgLy8gcHJpbWFyeSB0cmVlIHdpbGwgY29tbWl0IGluIGFuIGluY29uc2lzdGVudCBzdGF0ZSwgc28gd2hlbiB3ZSBkbyB0aGVcbiAgLy8gc2Vjb25kIHBhc3MgdG8gcmVuZGVyIHRoZSBmYWxsYmFjaywgd2UgZG8gc29tZSBleGNlZWRpbmdseSwgdWgsIGNsZXZlclxuICAvLyBoYWNrcyB0byBtYWtlIHRoYXQgbm90IHRvdGFsbHkgYnJlYWsuIExpa2UgdHJhbnNmZXJyaW5nIGVmZmVjdHMgYW5kXG4gIC8vIGRlbGV0aW9ucyBmcm9tIGhpZGRlbiB0cmVlLiBJbiBDb25jdXJyZW50IE1vZGUsIGl0J3MgbXVjaCBzaW1wbGVyLFxuICAvLyBiZWNhdXNlIHdlIGJhaWxvdXQgb24gdGhlIHByaW1hcnkgdHJlZSBjb21wbGV0ZWx5IGFuZCBsZWF2ZSBpdCBpbiBpdHMgb2xkXG4gIC8vIHN0YXRlLCBubyBlZmZlY3RzLiBTYW1lIGFzIHdoYXQgd2UgZG8gZm9yIE9mZnNjcmVlbiAoZXhjZXB0IHRoYXRcbiAgLy8gT2Zmc2NyZWVuIGRvZXNuJ3QgaGF2ZSB0aGUgZmlyc3QgcmVuZGVyIHBhc3MpLlxuICAvL1xuICAvLyBTZWNvbmQgaXMgaHlkcmF0aW9uLiBEdXJpbmcgaHlkcmF0aW9uLCB0aGUgU3VzcGVuc2UgZmliZXIgaGFzIGEgc2xpZ2h0bHlcbiAgLy8gZGlmZmVyZW50IGxheW91dCwgd2hlcmUgdGhlIGNoaWxkIHBvaW50cyB0byBhIGRlaHlkcmF0ZWQgZnJhZ21lbnQsIHdoaWNoXG4gIC8vIGNvbnRhaW5zIHRoZSBET00gcmVuZGVyZWQgYnkgdGhlIHNlcnZlci5cbiAgLy9cbiAgLy8gVGhpcmQsIGV2ZW4gaWYgeW91IHNldCBhbGwgdGhhdCBhc2lkZSwgU3VzcGVuc2UgaXMgbGlrZSBlcnJvciBib3VuZGFyaWVzIGluXG4gIC8vIHRoYXQgd2UgZmlyc3Qgd2UgdHJ5IHRvIHJlbmRlciBvbmUgdHJlZSwgYW5kIGlmIHRoYXQgZmFpbHMsIHdlIHJlbmRlciBhZ2FpblxuICAvLyBhbmQgc3dpdGNoIHRvIGEgZGlmZmVyZW50IHRyZWUuIExpa2UgYSB0cnkvY2F0Y2ggYmxvY2suIFNvIHdlIGhhdmUgdG8gdHJhY2tcbiAgLy8gd2hpY2ggYnJhbmNoIHdlJ3JlIGN1cnJlbnRseSByZW5kZXJpbmcuIElkZWFsbHkgd2Ugd291bGQgbW9kZWwgdGhpcyB1c2luZ1xuICAvLyBhIHN0YWNrLlxuXG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgLy8gSW5pdGlhbCBtb3VudFxuICAgIC8vIFNwZWNpYWwgcGF0aCBmb3IgaHlkcmF0aW9uXG4gICAgLy8gSWYgd2UncmUgY3VycmVudGx5IGh5ZHJhdGluZywgdHJ5IHRvIGh5ZHJhdGUgdGhpcyBib3VuZGFyeS5cbiAgICB0cnlUb0NsYWltTmV4dEh5ZHJhdGFibGVJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcyk7IC8vIFRoaXMgY291bGQndmUgYmVlbiBhIGRlaHlkcmF0ZWQgc3VzcGVuc2UgY29tcG9uZW50LlxuXG4gICAgdmFyIHN1c3BlbnNlU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gICAgaWYgKHN1c3BlbnNlU3RhdGUgIT09IG51bGwpIHtcbiAgICAgIHZhciBkZWh5ZHJhdGVkID0gc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkO1xuXG4gICAgICBpZiAoZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbW91bnREZWh5ZHJhdGVkU3VzcGVuc2VDb21wb25lbnQod29ya0luUHJvZ3Jlc3MsIGRlaHlkcmF0ZWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBuZXh0UHJpbWFyeUNoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICAgIHZhciBuZXh0RmFsbGJhY2tDaGlsZHJlbiA9IG5leHRQcm9wcy5mYWxsYmFjaztcblxuICAgIGlmIChzaG93RmFsbGJhY2spIHtcbiAgICAgIHZhciBmYWxsYmFja0ZyYWdtZW50ID0gbW91bnRTdXNwZW5zZUZhbGxiYWNrQ2hpbGRyZW4od29ya0luUHJvZ3Jlc3MsIG5leHRQcmltYXJ5Q2hpbGRyZW4sIG5leHRGYWxsYmFja0NoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gICAgICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50Lm1lbW9pemVkU3RhdGUgPSBtb3VudFN1c3BlbnNlT2Zmc2NyZWVuU3RhdGUocmVuZGVyTGFuZXMpO1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IFNVU1BFTkRFRF9NQVJLRVI7XG5cbiAgICAgIHJldHVybiBmYWxsYmFja0ZyYWdtZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbW91bnRTdXNwZW5zZVByaW1hcnlDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgbmV4dFByaW1hcnlDaGlsZHJlbik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaXMgYW4gdXBkYXRlLlxuICAgIC8vIFNwZWNpYWwgcGF0aCBmb3IgaHlkcmF0aW9uXG4gICAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcblxuICAgIGlmIChwcmV2U3RhdGUgIT09IG51bGwpIHtcbiAgICAgIHZhciBfZGVoeWRyYXRlZCA9IHByZXZTdGF0ZS5kZWh5ZHJhdGVkO1xuXG4gICAgICBpZiAoX2RlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZURlaHlkcmF0ZWRTdXNwZW5zZUNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgZGlkU3VzcGVuZCwgbmV4dFByb3BzLCBfZGVoeWRyYXRlZCwgcHJldlN0YXRlLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3dGYWxsYmFjaykge1xuICAgICAgdmFyIF9uZXh0RmFsbGJhY2tDaGlsZHJlbiA9IG5leHRQcm9wcy5mYWxsYmFjaztcbiAgICAgIHZhciBfbmV4dFByaW1hcnlDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgICAgIHZhciBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSB1cGRhdGVTdXNwZW5zZUZhbGxiYWNrQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIF9uZXh0UHJpbWFyeUNoaWxkcmVuLCBfbmV4dEZhbGxiYWNrQ2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgICAgIHZhciBfcHJpbWFyeUNoaWxkRnJhZ21lbnQyID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICB2YXIgcHJldk9mZnNjcmVlblN0YXRlID0gY3VycmVudC5jaGlsZC5tZW1vaXplZFN0YXRlO1xuICAgICAgX3ByaW1hcnlDaGlsZEZyYWdtZW50Mi5tZW1vaXplZFN0YXRlID0gcHJldk9mZnNjcmVlblN0YXRlID09PSBudWxsID8gbW91bnRTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHJlbmRlckxhbmVzKSA6IHVwZGF0ZVN1c3BlbnNlT2Zmc2NyZWVuU3RhdGUocHJldk9mZnNjcmVlblN0YXRlLCByZW5kZXJMYW5lcyk7XG5cbiAgICAgIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDIuY2hpbGRMYW5lcyA9IGdldFJlbWFpbmluZ1dvcmtJblByaW1hcnlUcmVlKGN1cnJlbnQsIHJlbmRlckxhbmVzKTtcbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBTVVNQRU5ERURfTUFSS0VSO1xuICAgICAgcmV0dXJuIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIF9uZXh0UHJpbWFyeUNoaWxkcmVuMiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcblxuICAgICAgdmFyIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDMgPSB1cGRhdGVTdXNwZW5zZVByaW1hcnlDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgX25leHRQcmltYXJ5Q2hpbGRyZW4yLCByZW5kZXJMYW5lcyk7XG5cbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDM7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1vdW50U3VzcGVuc2VQcmltYXJ5Q2hpbGRyZW4od29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG1vZGUgPSB3b3JrSW5Qcm9ncmVzcy5tb2RlO1xuICB2YXIgcHJpbWFyeUNoaWxkUHJvcHMgPSB7XG4gICAgbW9kZTogJ3Zpc2libGUnLFxuICAgIGNoaWxkcmVuOiBwcmltYXJ5Q2hpbGRyZW5cbiAgfTtcbiAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gbW91bnRXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKHByaW1hcnlDaGlsZFByb3BzLCBtb2RlKTtcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gIHJldHVybiBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZUZhbGxiYWNrQ2hpbGRyZW4od29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbiwgZmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG1vZGUgPSB3b3JrSW5Qcm9ncmVzcy5tb2RlO1xuICB2YXIgcHJvZ3Jlc3NlZFByaW1hcnlGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICB2YXIgcHJpbWFyeUNoaWxkUHJvcHMgPSB7XG4gICAgbW9kZTogJ2hpZGRlbicsXG4gICAgY2hpbGRyZW46IHByaW1hcnlDaGlsZHJlblxuICB9O1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gIHZhciBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG5cbiAgaWYgKChtb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUgJiYgcHJvZ3Jlc3NlZFByaW1hcnlGcmFnbWVudCAhPT0gbnVsbCkge1xuICAgIC8vIEluIGxlZ2FjeSBtb2RlLCB3ZSBjb21taXQgdGhlIHByaW1hcnkgdHJlZSBhcyBpZiBpdCBzdWNjZXNzZnVsbHlcbiAgICAvLyBjb21wbGV0ZWQsIGV2ZW4gdGhvdWdoIGl0J3MgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLlxuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gcHJvZ3Jlc3NlZFByaW1hcnlGcmFnbWVudDtcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5jaGlsZExhbmVzID0gTm9MYW5lcztcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5wZW5kaW5nUHJvcHMgPSBwcmltYXJ5Q2hpbGRQcm9wcztcblxuICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAvLyBSZXNldCB0aGUgZHVyYXRpb25zIGZyb20gdGhlIGZpcnN0IHBhc3Mgc28gdGhleSBhcmVuJ3QgaW5jbHVkZWQgaW4gdGhlXG4gICAgICAvLyBmaW5hbCBhbW91bnRzLiBUaGlzIHNlZW1zIGNvdW50ZXJpbnR1aXRpdmUsIHNpbmNlIHdlJ3JlIGludGVudGlvbmFsbHlcbiAgICAgIC8vIG5vdCBtZWFzdXJpbmcgcGFydCBvZiB0aGUgcmVuZGVyIHBoYXNlLCBidXQgdGhpcyBtYWtlcyBpdCBtYXRjaCB3aGF0IHdlXG4gICAgICAvLyBkbyBpbiBDb25jdXJyZW50IE1vZGUuXG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5hY3R1YWxEdXJhdGlvbiA9IDA7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5hY3R1YWxTdGFydFRpbWUgPSAtMTtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnNlbGZCYXNlRHVyYXRpb24gPSAwO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQudHJlZUJhc2VEdXJhdGlvbiA9IDA7XG4gICAgfVxuXG4gICAgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZmFsbGJhY2tDaGlsZHJlbiwgbW9kZSwgcmVuZGVyTGFuZXMsIG51bGwpO1xuICB9IGVsc2Uge1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gbW91bnRXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKHByaW1hcnlDaGlsZFByb3BzLCBtb2RlKTtcbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChmYWxsYmFja0NoaWxkcmVuLCBtb2RlLCByZW5kZXJMYW5lcywgbnVsbCk7XG4gIH1cblxuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgZmFsbGJhY2tDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zaWJsaW5nID0gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHByaW1hcnlDaGlsZEZyYWdtZW50O1xuICByZXR1cm4gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xufVxuXG5mdW5jdGlvbiBtb3VudFdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIob2Zmc2NyZWVuUHJvcHMsIG1vZGUsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRoZSBwcm9wcyBhcmd1bWVudCB0byBgY3JlYXRlRmliZXJGcm9tT2Zmc2NyZWVuYCBpcyBgYW55YCB0eXBlZCwgc28gd2UgdXNlXG4gIC8vIHRoaXMgd3JhcHBlciBmdW5jdGlvbiB0byBjb25zdHJhaW4gaXQuXG4gIHJldHVybiBjcmVhdGVGaWJlckZyb21PZmZzY3JlZW4ob2Zmc2NyZWVuUHJvcHMsIG1vZGUsIE5vTGFuZXMsIG51bGwpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKGN1cnJlbnQsIG9mZnNjcmVlblByb3BzKSB7XG4gIC8vIFRoZSBwcm9wcyBhcmd1bWVudCB0byBgY3JlYXRlV29ya0luUHJvZ3Jlc3NgIGlzIGBhbnlgIHR5cGVkLCBzbyB3ZSB1c2UgdGhpc1xuICAvLyB3cmFwcGVyIGZ1bmN0aW9uIHRvIGNvbnN0cmFpbiBpdC5cbiAgcmV0dXJuIGNyZWF0ZVdvcmtJblByb2dyZXNzKGN1cnJlbnQsIG9mZnNjcmVlblByb3BzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3VzcGVuc2VQcmltYXJ5Q2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudCA9IGN1cnJlbnQuY2hpbGQ7XG4gIHZhciBjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmc7XG4gIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHVwZGF0ZVdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIoY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LCB7XG4gICAgbW9kZTogJ3Zpc2libGUnLFxuICAgIGNoaWxkcmVuOiBwcmltYXJ5Q2hpbGRyZW5cbiAgfSk7XG5cbiAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5sYW5lcyA9IHJlbmRlckxhbmVzO1xuICB9XG5cbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmcgPSBudWxsO1xuXG4gIGlmIChjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgLy8gRGVsZXRlIHRoZSBmYWxsYmFjayBjaGlsZCBmcmFnbWVudFxuICAgIHZhciBkZWxldGlvbnMgPSB3b3JrSW5Qcm9ncmVzcy5kZWxldGlvbnM7XG5cbiAgICBpZiAoZGVsZXRpb25zID09PSBudWxsKSB7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5kZWxldGlvbnMgPSBbY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudF07XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBDaGlsZERlbGV0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGlvbnMucHVzaChjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50KTtcbiAgICB9XG4gIH1cblxuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHByaW1hcnlDaGlsZEZyYWdtZW50O1xuICByZXR1cm4gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN1c3BlbnNlRmFsbGJhY2tDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuLCBmYWxsYmFja0NoaWxkcmVuLCByZW5kZXJMYW5lcykge1xuICB2YXIgbW9kZSA9IHdvcmtJblByb2dyZXNzLm1vZGU7XG4gIHZhciBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBjdXJyZW50LmNoaWxkO1xuICB2YXIgY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudC5zaWJsaW5nO1xuICB2YXIgcHJpbWFyeUNoaWxkUHJvcHMgPSB7XG4gICAgbW9kZTogJ2hpZGRlbicsXG4gICAgY2hpbGRyZW46IHByaW1hcnlDaGlsZHJlblxuICB9O1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG5cbiAgaWYgKCAvLyBJbiBsZWdhY3kgbW9kZSwgd2UgY29tbWl0IHRoZSBwcmltYXJ5IHRyZWUgYXMgaWYgaXQgc3VjY2Vzc2Z1bGx5XG4gIC8vIGNvbXBsZXRlZCwgZXZlbiB0aG91Z2ggaXQncyBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuXG4gIChtb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUgJiYgLy8gTWFrZSBzdXJlIHdlJ3JlIG9uIHRoZSBzZWNvbmQgcGFzcywgaS5lLiB0aGUgcHJpbWFyeSBjaGlsZCBmcmFnbWVudCB3YXNcbiAgLy8gYWxyZWFkeSBjbG9uZWQuIEluIGxlZ2FjeSBtb2RlLCB0aGUgb25seSBjYXNlIHdoZXJlIHRoaXMgaXNuJ3QgdHJ1ZSBpc1xuICAvLyB3aGVuIERldlRvb2xzIGZvcmNlcyB1cyB0byBkaXNwbGF5IGEgZmFsbGJhY2s7IHdlIHNraXAgdGhlIGZpcnN0IHJlbmRlclxuICAvLyBwYXNzIGVudGlyZWx5IGFuZCBnbyBzdHJhaWdodCB0byByZW5kZXJpbmcgdGhlIGZhbGxiYWNrLiAoSW4gQ29uY3VycmVudFxuICAvLyBNb2RlLCBTdXNwZW5zZUxpc3QgY2FuIGFsc28gdHJpZ2dlciB0aGlzIHNjZW5hcmlvLCBidXQgdGhpcyBpcyBhIGxlZ2FjeS1cbiAgLy8gb25seSBjb2RlcGF0aC4pXG4gIHdvcmtJblByb2dyZXNzLmNoaWxkICE9PSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQpIHtcbiAgICB2YXIgcHJvZ3Jlc3NlZFByaW1hcnlGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gcHJvZ3Jlc3NlZFByaW1hcnlGcmFnbWVudDtcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5jaGlsZExhbmVzID0gTm9MYW5lcztcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5wZW5kaW5nUHJvcHMgPSBwcmltYXJ5Q2hpbGRQcm9wcztcblxuICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAvLyBSZXNldCB0aGUgZHVyYXRpb25zIGZyb20gdGhlIGZpcnN0IHBhc3Mgc28gdGhleSBhcmVuJ3QgaW5jbHVkZWQgaW4gdGhlXG4gICAgICAvLyBmaW5hbCBhbW91bnRzLiBUaGlzIHNlZW1zIGNvdW50ZXJpbnR1aXRpdmUsIHNpbmNlIHdlJ3JlIGludGVudGlvbmFsbHlcbiAgICAgIC8vIG5vdCBtZWFzdXJpbmcgcGFydCBvZiB0aGUgcmVuZGVyIHBoYXNlLCBidXQgdGhpcyBtYWtlcyBpdCBtYXRjaCB3aGF0IHdlXG4gICAgICAvLyBkbyBpbiBDb25jdXJyZW50IE1vZGUuXG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5hY3R1YWxEdXJhdGlvbiA9IDA7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5hY3R1YWxTdGFydFRpbWUgPSAtMTtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnNlbGZCYXNlRHVyYXRpb24gPSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb24gPSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICB9IC8vIFRoZSBmYWxsYmFjayBmaWJlciB3YXMgYWRkZWQgYXMgYSBkZWxldGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBhc3MuXG4gICAgLy8gSG93ZXZlciwgc2luY2Ugd2UncmUgZ29pbmcgdG8gcmVtYWluIG9uIHRoZSBmYWxsYmFjaywgd2Ugbm8gbG9uZ2VyIHdhbnRcbiAgICAvLyB0byBkZWxldGUgaXQuXG5cblxuICAgIHdvcmtJblByb2dyZXNzLmRlbGV0aW9ucyA9IG51bGw7XG4gIH0gZWxzZSB7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudCwgcHJpbWFyeUNoaWxkUHJvcHMpOyAvLyBTaW5jZSB3ZSdyZSByZXVzaW5nIGEgY3VycmVudCB0cmVlLCB3ZSBuZWVkIHRvIHJldXNlIHRoZSBmbGFncywgdG9vLlxuICAgIC8vIChXZSBkb24ndCBkbyB0aGlzIGluIGxlZ2FjeSBtb2RlLCBiZWNhdXNlIGluIGxlZ2FjeSBtb2RlIHdlIGRvbid0IHJlLXVzZVxuICAgIC8vIHRoZSBjdXJyZW50IHRyZWU7IHNlZSBwcmV2aW91cyBicmFuY2guKVxuXG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc3VidHJlZUZsYWdzID0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LnN1YnRyZWVGbGFncyAmIFN0YXRpY01hc2s7XG4gIH1cblxuICB2YXIgZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuXG4gIGlmIChjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudCwgZmFsbGJhY2tDaGlsZHJlbik7XG4gIH0gZWxzZSB7XG4gICAgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZmFsbGJhY2tDaGlsZHJlbiwgbW9kZSwgcmVuZGVyTGFuZXMsIG51bGwpOyAvLyBOZWVkcyBhIHBsYWNlbWVudCBlZmZlY3QgYmVjYXVzZSB0aGUgcGFyZW50ICh0aGUgU3VzcGVuc2UgYm91bmRhcnkpIGFscmVhZHlcbiAgICAvLyBtb3VudGVkIGJ1dCB0aGlzIGlzIGEgbmV3IGZpYmVyLlxuXG4gICAgZmFsbGJhY2tDaGlsZEZyYWdtZW50LmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgfVxuXG4gIGZhbGxiYWNrQ2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmcgPSBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gIHJldHVybiBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG59XG5cbmZ1bmN0aW9uIHJldHJ5U3VzcGVuc2VDb21wb25lbnRXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcywgcmVjb3ZlcmFibGVFcnJvcikge1xuICAvLyBGYWxsaW5nIGJhY2sgdG8gY2xpZW50IHJlbmRlcmluZy4gQmVjYXVzZSB0aGlzIGhhcyBwZXJmb3JtYW5jZVxuICAvLyBpbXBsaWNhdGlvbnMsIGl0J3MgY29uc2lkZXJlZCBhIHJlY292ZXJhYmxlIGVycm9yLCBldmVuIHRob3VnaCB0aGUgdXNlclxuICAvLyBsaWtlbHkgd29uJ3Qgb2JzZXJ2ZSBhbnl0aGluZyB3cm9uZyB3aXRoIHRoZSBVSS5cbiAgLy9cbiAgLy8gVGhlIGVycm9yIGlzIHBhc3NlZCBpbiBhcyBhbiBhcmd1bWVudCB0byBlbmZvcmNlIHRoYXQgZXZlcnkgY2FsbGVyIHByb3ZpZGVcbiAgLy8gYSBjdXN0b20gbWVzc2FnZSwgb3IgZXhwbGljaXRseSBvcHQgb3V0IChjdXJyZW50bHkgdGhlIG9ubHkgcGF0aCB0aGF0IG9wdHNcbiAgLy8gb3V0IGlzIGxlZ2FjeSBtb2RlOyBldmVyeSBjb25jdXJyZW50IHBhdGggcHJvdmlkZXMgYW4gZXJyb3IpLlxuICBpZiAocmVjb3ZlcmFibGVFcnJvciAhPT0gbnVsbCkge1xuICAgIHF1ZXVlSHlkcmF0aW9uRXJyb3IocmVjb3ZlcmFibGVFcnJvcik7XG4gIH0gLy8gVGhpcyB3aWxsIGFkZCB0aGUgb2xkIGZpYmVyIHRvIHRoZSBkZWxldGlvbiBsaXN0XG5cblxuICByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgY3VycmVudC5jaGlsZCwgbnVsbCwgcmVuZGVyTGFuZXMpOyAvLyBXZSdyZSBub3cgbm90IHN1c3BlbmRlZCBub3IgZGVoeWRyYXRlZC5cblxuICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgcHJpbWFyeUNoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBtb3VudFN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4pOyAvLyBOZWVkcyBhIHBsYWNlbWVudCBlZmZlY3QgYmVjYXVzZSB0aGUgcGFyZW50ICh0aGUgU3VzcGVuc2UgYm91bmRhcnkpIGFscmVhZHlcbiAgLy8gbW91bnRlZCBidXQgdGhpcyBpcyBhIG5ldyBmaWJlci5cblxuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5mbGFncyB8PSBQbGFjZW1lbnQ7XG4gIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICByZXR1cm4gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG59XG5cbmZ1bmN0aW9uIG1vdW50U3VzcGVuc2VGYWxsYmFja0FmdGVyUmV0cnlXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4sIGZhbGxiYWNrQ2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIHZhciBmaWJlck1vZGUgPSB3b3JrSW5Qcm9ncmVzcy5tb2RlO1xuICB2YXIgcHJpbWFyeUNoaWxkUHJvcHMgPSB7XG4gICAgbW9kZTogJ3Zpc2libGUnLFxuICAgIGNoaWxkcmVuOiBwcmltYXJ5Q2hpbGRyZW5cbiAgfTtcbiAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gbW91bnRXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKHByaW1hcnlDaGlsZFByb3BzLCBmaWJlck1vZGUpO1xuICB2YXIgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZmFsbGJhY2tDaGlsZHJlbiwgZmliZXJNb2RlLCByZW5kZXJMYW5lcywgbnVsbCk7IC8vIE5lZWRzIGEgcGxhY2VtZW50IGVmZmVjdCBiZWNhdXNlIHRoZSBwYXJlbnQgKHRoZSBTdXNwZW5zZVxuICAvLyBib3VuZGFyeSkgYWxyZWFkeSBtb3VudGVkIGJ1dCB0aGlzIGlzIGEgbmV3IGZpYmVyLlxuXG4gIGZhbGxiYWNrQ2hpbGRGcmFnbWVudC5mbGFncyB8PSBQbGFjZW1lbnQ7XG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICBmYWxsYmFja0NoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmcgPSBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG5cbiAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAvLyBXZSB3aWxsIGhhdmUgZHJvcHBlZCB0aGUgZWZmZWN0IGxpc3Qgd2hpY2ggY29udGFpbnMgdGhlXG4gICAgLy8gZGVsZXRpb24uIFdlIG5lZWQgdG8gcmVjb25jaWxlIHRvIGRlbGV0ZSB0aGUgY3VycmVudCBjaGlsZC5cbiAgICByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgY3VycmVudC5jaGlsZCwgbnVsbCwgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgcmV0dXJuIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gbW91bnREZWh5ZHJhdGVkU3VzcGVuc2VDb21wb25lbnQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbnNlSW5zdGFuY2UsIHJlbmRlckxhbmVzKSB7XG4gIC8vIER1cmluZyB0aGUgZmlyc3QgcGFzcywgd2UnbGwgYmFpbCBvdXQgYW5kIG5vdCBkcmlsbCBpbnRvIHRoZSBjaGlsZHJlbi5cbiAgLy8gSW5zdGVhZCwgd2UnbGwgbGVhdmUgdGhlIGNvbnRlbnQgaW4gcGxhY2UgYW5kIHRyeSB0byBoeWRyYXRlIGl0IGxhdGVyLlxuICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgIHtcbiAgICAgIGVycm9yKCdDYW5ub3QgaHlkcmF0ZSBTdXNwZW5zZSBpbiBsZWdhY3kgbW9kZS4gU3dpdGNoIGZyb20gJyArICdSZWFjdERPTS5oeWRyYXRlKGVsZW1lbnQsIGNvbnRhaW5lcikgdG8gJyArICdSZWFjdERPTUNsaWVudC5oeWRyYXRlUm9vdChjb250YWluZXIsIDxBcHAgLz4pJyArICcucmVuZGVyKGVsZW1lbnQpIG9yIHJlbW92ZSB0aGUgU3VzcGVuc2UgY29tcG9uZW50cyBmcm9tICcgKyAndGhlIHNlcnZlciByZW5kZXJlZCBjb21wb25lbnRzLicpO1xuICAgIH1cblxuICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbGFuZVRvTGFuZXMoU3luY0xhbmUpO1xuICB9IGVsc2UgaWYgKGlzU3VzcGVuc2VJbnN0YW5jZUZhbGxiYWNrKHN1c3BlbnNlSW5zdGFuY2UpKSB7XG4gICAgLy8gVGhpcyBpcyBhIGNsaWVudC1vbmx5IGJvdW5kYXJ5LiBTaW5jZSB3ZSB3b24ndCBnZXQgYW55IGNvbnRlbnQgZnJvbSB0aGUgc2VydmVyXG4gICAgLy8gZm9yIHRoaXMsIHdlIG5lZWQgdG8gc2NoZWR1bGUgdGhhdCBhdCBhIGhpZ2hlciBwcmlvcml0eSBiYXNlZCBvbiB3aGVuIGl0IHdvdWxkXG4gICAgLy8gaGF2ZSB0aW1lZCBvdXQuIEluIHRoZW9yeSB3ZSBjb3VsZCByZW5kZXIgaXQgaW4gdGhpcyBwYXNzIGJ1dCBpdCB3b3VsZCBoYXZlIHRoZVxuICAgIC8vIHdyb25nIHByaW9yaXR5IGFzc29jaWF0ZWQgd2l0aCBpdCBhbmQgd2lsbCBwcmV2ZW50IGh5ZHJhdGlvbiBvZiBwYXJlbnQgcGF0aC5cbiAgICAvLyBJbnN0ZWFkLCB3ZSdsbCBsZWF2ZSB3b3JrIGxlZnQgb24gaXQgdG8gcmVuZGVyIGl0IGluIGEgc2VwYXJhdGUgY29tbWl0LlxuICAgIC8vIFRPRE8gVGhpcyB0aW1lIHNob3VsZCBiZSB0aGUgdGltZSBhdCB3aGljaCB0aGUgc2VydmVyIHJlbmRlcmVkIHJlc3BvbnNlIHRoYXQgaXNcbiAgICAvLyBhIHBhcmVudCB0byB0aGlzIGJvdW5kYXJ5IHdhcyBkaXNwbGF5ZWQuIEhvd2V2ZXIsIHNpbmNlIHdlIGN1cnJlbnRseSBkb24ndCBoYXZlXG4gICAgLy8gYSBwcm90b2NvbCB0byB0cmFuc2ZlciB0aGF0IHRpbWUsIHdlJ2xsIGp1c3QgZXN0aW1hdGUgaXQgYnkgdXNpbmcgdGhlIGN1cnJlbnRcbiAgICAvLyB0aW1lLiBUaGlzIHdpbGwgbWVhbiB0aGF0IFN1c3BlbnNlIHRpbWVvdXRzIGFyZSBzbGlnaHRseSBzaGlmdGVkIHRvIGxhdGVyIHRoYW5cbiAgICAvLyB0aGV5IHNob3VsZCBiZS5cbiAgICAvLyBTY2hlZHVsZSBhIG5vcm1hbCBwcmkgdXBkYXRlIHRvIHJlbmRlciB0aGlzIGNvbnRlbnQuXG4gICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBsYW5lVG9MYW5lcyhEZWZhdWx0SHlkcmF0aW9uTGFuZSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gV2UnbGwgY29udGludWUgaHlkcmF0aW5nIHRoZSByZXN0IGF0IG9mZnNjcmVlbiBwcmlvcml0eSBzaW5jZSB3ZSdsbCBhbHJlYWR5XG4gICAgLy8gYmUgc2hvd2luZyB0aGUgcmlnaHQgY29udGVudCBjb21pbmcgZnJvbSB0aGUgc2VydmVyLCBpdCBpcyBubyBydXNoLlxuICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbGFuZVRvTGFuZXMoT2Zmc2NyZWVuTGFuZSk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRGVoeWRyYXRlZFN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBkaWRTdXNwZW5kLCBuZXh0UHJvcHMsIHN1c3BlbnNlSW5zdGFuY2UsIHN1c3BlbnNlU3RhdGUsIHJlbmRlckxhbmVzKSB7XG4gIGlmICghZGlkU3VzcGVuZCkge1xuICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHJlbmRlciBwYXNzLiBBdHRlbXB0IHRvIGh5ZHJhdGUuXG4gICAgLy8gV2Ugc2hvdWxkIG5ldmVyIGJlIGh5ZHJhdGluZyBhdCB0aGlzIHBvaW50IGJlY2F1c2UgaXQgaXMgdGhlIGZpcnN0IHBhc3MsXG4gICAgLy8gYnV0IGFmdGVyIHdlJ3ZlIGFscmVhZHkgY29tbWl0dGVkIG9uY2UuXG4gICAgd2FybklmSHlkcmF0aW5nKCk7XG5cbiAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgcmV0dXJuIHJldHJ5U3VzcGVuc2VDb21wb25lbnRXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcywgLy8gVE9ETzogV2hlbiB3ZSBkZWxldGUgbGVnYWN5IG1vZGUsIHdlIHNob3VsZCBtYWtlIHRoaXMgZXJyb3IgYXJndW1lbnRcbiAgICAgIC8vIHJlcXVpcmVkIFx1MjAxNCBldmVyeSBjb25jdXJyZW50IG1vZGUgcGF0aCB0aGF0IGNhdXNlcyBoeWRyYXRpb24gdG9cbiAgICAgIC8vIGRlLW9wdCB0byBjbGllbnQgcmVuZGVyaW5nIHNob3VsZCBoYXZlIGFuIGVycm9yIG1lc3NhZ2UuXG4gICAgICBudWxsKTtcbiAgICB9XG5cbiAgICBpZiAoaXNTdXNwZW5zZUluc3RhbmNlRmFsbGJhY2soc3VzcGVuc2VJbnN0YW5jZSkpIHtcbiAgICAgIC8vIFRoaXMgYm91bmRhcnkgaXMgaW4gYSBwZXJtYW5lbnQgZmFsbGJhY2sgc3RhdGUuIEluIHRoaXMgY2FzZSwgd2UnbGwgbmV2ZXJcbiAgICAgIC8vIGdldCBhbiB1cGRhdGUgYW5kIHdlJ2xsIG5ldmVyIGJlIGFibGUgdG8gaHlkcmF0ZSB0aGUgZmluYWwgY29udGVudC4gTGV0J3MganVzdCB0cnkgdGhlXG4gICAgICAvLyBjbGllbnQgc2lkZSByZW5kZXIgaW5zdGVhZC5cbiAgICAgIHZhciBkaWdlc3QsIG1lc3NhZ2UsIHN0YWNrO1xuXG4gICAgICB7XG4gICAgICAgIHZhciBfZ2V0U3VzcGVuc2VJbnN0YW5jZUYgPSBnZXRTdXNwZW5zZUluc3RhbmNlRmFsbGJhY2tFcnJvckRldGFpbHMoc3VzcGVuc2VJbnN0YW5jZSk7XG5cbiAgICAgICAgZGlnZXN0ID0gX2dldFN1c3BlbnNlSW5zdGFuY2VGLmRpZ2VzdDtcbiAgICAgICAgbWVzc2FnZSA9IF9nZXRTdXNwZW5zZUluc3RhbmNlRi5tZXNzYWdlO1xuICAgICAgICBzdGFjayA9IF9nZXRTdXNwZW5zZUluc3RhbmNlRi5zdGFjaztcbiAgICAgIH1cblxuICAgICAgdmFyIGVycm9yO1xuXG4gICAgICBpZiAobWVzc2FnZSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgICBlcnJvciA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yID0gbmV3IEVycm9yKCdUaGUgc2VydmVyIGNvdWxkIG5vdCBmaW5pc2ggdGhpcyBTdXNwZW5zZSBib3VuZGFyeSwgbGlrZWx5ICcgKyAnZHVlIHRvIGFuIGVycm9yIGR1cmluZyBzZXJ2ZXIgcmVuZGVyaW5nLiBTd2l0Y2hlZCB0byAnICsgJ2NsaWVudCByZW5kZXJpbmcuJyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBjYXB0dXJlZFZhbHVlID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZShlcnJvciwgZGlnZXN0LCBzdGFjayk7XG4gICAgICByZXR1cm4gcmV0cnlTdXNwZW5zZUNvbXBvbmVudFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzLCBjYXB0dXJlZFZhbHVlKTtcbiAgICB9XG4gICAgLy8gYW55IGNvbnRleHQgaGFzIGNoYW5nZWQsIHdlIG5lZWQgdG8gdHJlYXQgaXMgYXMgaWYgdGhlIGlucHV0IG1pZ2h0IGhhdmUgY2hhbmdlZC5cblxuXG4gICAgdmFyIGhhc0NvbnRleHRDaGFuZ2VkID0gaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgY3VycmVudC5jaGlsZExhbmVzKTtcblxuICAgIGlmIChkaWRSZWNlaXZlVXBkYXRlIHx8IGhhc0NvbnRleHRDaGFuZ2VkKSB7XG4gICAgICAvLyBUaGlzIGJvdW5kYXJ5IGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBmaXJzdCByZW5kZXIuIFRoaXMgbWVhbnMgdGhhdCB3ZSBhcmUgbm93IHVuYWJsZSB0b1xuICAgICAgLy8gaHlkcmF0ZSBpdC4gV2UgbWlnaHQgc3RpbGwgYmUgYWJsZSB0byBoeWRyYXRlIGl0IHVzaW5nIGEgaGlnaGVyIHByaW9yaXR5IGxhbmUuXG4gICAgICB2YXIgcm9vdCA9IGdldFdvcmtJblByb2dyZXNzUm9vdCgpO1xuXG4gICAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgYXR0ZW1wdEh5ZHJhdGlvbkF0TGFuZSA9IGdldEJ1bXBlZExhbmVGb3JIeWRyYXRpb24ocm9vdCwgcmVuZGVyTGFuZXMpO1xuXG4gICAgICAgIGlmIChhdHRlbXB0SHlkcmF0aW9uQXRMYW5lICE9PSBOb0xhbmUgJiYgYXR0ZW1wdEh5ZHJhdGlvbkF0TGFuZSAhPT0gc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmUpIHtcbiAgICAgICAgICAvLyBJbnRlbnRpb25hbGx5IG11dGF0aW5nIHNpbmNlIHRoaXMgcmVuZGVyIHdpbGwgZ2V0IGludGVycnVwdGVkLiBUaGlzXG4gICAgICAgICAgLy8gaXMgb25lIG9mIHRoZSB2ZXJ5IHJhcmUgdGltZXMgd2hlcmUgd2UgbXV0YXRlIHRoZSBjdXJyZW50IHRyZWVcbiAgICAgICAgICAvLyBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS5cbiAgICAgICAgICBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZSA9IGF0dGVtcHRIeWRyYXRpb25BdExhbmU7IC8vIFRPRE86IElkZWFsbHkgdGhpcyB3b3VsZCBpbmhlcml0IHRoZSBldmVudCB0aW1lIG9mIHRoZSBjdXJyZW50IHJlbmRlclxuXG4gICAgICAgICAgdmFyIGV2ZW50VGltZSA9IE5vVGltZXN0YW1wO1xuICAgICAgICAgIGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShjdXJyZW50LCBhdHRlbXB0SHlkcmF0aW9uQXRMYW5lKTtcbiAgICAgICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgY3VycmVudCwgYXR0ZW1wdEh5ZHJhdGlvbkF0TGFuZSwgZXZlbnRUaW1lKTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBJZiB3ZSBoYXZlIHNjaGVkdWxlZCBoaWdoZXIgcHJpIHdvcmsgYWJvdmUsIHRoaXMgd2lsbCBwcm9iYWJseSBqdXN0IGFib3J0IHRoZSByZW5kZXJcbiAgICAgIC8vIHNpbmNlIHdlIG5vdyBoYXZlIGhpZ2hlciBwcmlvcml0eSB3b3JrLCBidXQgaW4gY2FzZSBpdCBkb2Vzbid0LCB3ZSBuZWVkIHRvIHByZXBhcmUgdG9cbiAgICAgIC8vIHJlbmRlciBzb21ldGhpbmcsIGlmIHdlIHRpbWUgb3V0LiBFdmVuIGlmIHRoYXQgcmVxdWlyZXMgdXMgdG8gZGVsZXRlIGV2ZXJ5dGhpbmcgYW5kXG4gICAgICAvLyBza2lwIGh5ZHJhdGlvbi5cbiAgICAgIC8vIERlbGF5IGhhdmluZyB0byBkbyB0aGlzIGFzIGxvbmcgYXMgdGhlIHN1c3BlbnNlIHRpbWVvdXQgYWxsb3dzIHVzLlxuXG5cbiAgICAgIHJlbmRlckRpZFN1c3BlbmREZWxheUlmUG9zc2libGUoKTtcblxuICAgICAgdmFyIF9jYXB0dXJlZFZhbHVlID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZShuZXcgRXJyb3IoJ1RoaXMgU3VzcGVuc2UgYm91bmRhcnkgcmVjZWl2ZWQgYW4gdXBkYXRlIGJlZm9yZSBpdCBmaW5pc2hlZCAnICsgJ2h5ZHJhdGluZy4gVGhpcyBjYXVzZWQgdGhlIGJvdW5kYXJ5IHRvIHN3aXRjaCB0byBjbGllbnQgcmVuZGVyaW5nLiAnICsgJ1RoZSB1c3VhbCB3YXkgdG8gZml4IHRoaXMgaXMgdG8gd3JhcCB0aGUgb3JpZ2luYWwgdXBkYXRlICcgKyAnaW4gc3RhcnRUcmFuc2l0aW9uLicpKTtcblxuICAgICAgcmV0dXJuIHJldHJ5U3VzcGVuc2VDb21wb25lbnRXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcywgX2NhcHR1cmVkVmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoaXNTdXNwZW5zZUluc3RhbmNlUGVuZGluZyhzdXNwZW5zZUluc3RhbmNlKSkge1xuICAgICAgLy8gVGhpcyBjb21wb25lbnQgaXMgc3RpbGwgcGVuZGluZyBtb3JlIGRhdGEgZnJvbSB0aGUgc2VydmVyLCBzbyB3ZSBjYW4ndCBoeWRyYXRlIGl0c1xuICAgICAgLy8gY29udGVudC4gV2UgdHJlYXQgaXQgYXMgaWYgdGhpcyBjb21wb25lbnQgc3VzcGVuZGVkIGl0c2VsZi4gSXQgbWlnaHQgc2VlbSBhcyBpZlxuICAgICAgLy8gd2UgY291bGQganVzdCB0cnkgdG8gcmVuZGVyIGl0IGNsaWVudC1zaWRlIGluc3RlYWQuIEhvd2V2ZXIsIHRoaXMgd2lsbCBwZXJmb3JtIGFcbiAgICAgIC8vIGxvdCBvZiB1bm5lY2Vzc2FyeSB3b3JrIGFuZCBpcyB1bmxpa2VseSB0byBjb21wbGV0ZSBzaW5jZSBpdCBvZnRlbiB3aWxsIHN1c3BlbmRcbiAgICAgIC8vIG9uIG1pc3NpbmcgZGF0YSBhbnl3YXkuIEFkZGl0aW9uYWxseSwgdGhlIHNlcnZlciBtaWdodCBiZSBhYmxlIHRvIHJlbmRlciBtb3JlXG4gICAgICAvLyB0aGFuIHdlIGNhbiBvbiB0aGUgY2xpZW50IHlldC4gSW4gdGhhdCBjYXNlIHdlJ2QgZW5kIHVwIHdpdGggbW9yZSBmYWxsYmFjayBzdGF0ZXNcbiAgICAgIC8vIG9uIHRoZSBjbGllbnQgdGhhbiBpZiB3ZSBqdXN0IGxlYXZlIGl0IGFsb25lLiBJZiB0aGUgc2VydmVyIHRpbWVzIG91dCBvciBlcnJvcnNcbiAgICAgIC8vIHRoZXNlIHNob3VsZCB1cGRhdGUgdGhpcyBib3VuZGFyeSB0byB0aGUgcGVybWFuZW50IEZhbGxiYWNrIHN0YXRlIGluc3RlYWQuXG4gICAgICAvLyBNYXJrIGl0IGFzIGhhdmluZyBjYXB0dXJlZCAoaS5lLiBzdXNwZW5kZWQpLlxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTsgLy8gTGVhdmUgdGhlIGNoaWxkIGluIHBsYWNlLiBJLmUuIHRoZSBkZWh5ZHJhdGVkIGZyYWdtZW50LlxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGN1cnJlbnQuY2hpbGQ7IC8vIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gcmV0cnkgdGhpcyBib3VuZGFyeSBvbmNlIHRoZSBzZXJ2ZXIgaGFzIHNlbnQgdGhlIHJlc3VsdC5cblxuICAgICAgdmFyIHJldHJ5ID0gcmV0cnlEZWh5ZHJhdGVkU3VzcGVuc2VCb3VuZGFyeS5iaW5kKG51bGwsIGN1cnJlbnQpO1xuICAgICAgcmVnaXN0ZXJTdXNwZW5zZUluc3RhbmNlUmV0cnkoc3VzcGVuc2VJbnN0YW5jZSwgcmV0cnkpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IGF0dGVtcHQuXG4gICAgICByZWVudGVySHlkcmF0aW9uU3RhdGVGcm9tRGVoeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIHN1c3BlbnNlSW5zdGFuY2UsIHN1c3BlbnNlU3RhdGUudHJlZUNvbnRleHQpO1xuICAgICAgdmFyIHByaW1hcnlDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgICAgIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IG1vdW50U3VzcGVuc2VQcmltYXJ5Q2hpbGRyZW4od29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbik7IC8vIE1hcmsgdGhlIGNoaWxkcmVuIGFzIGh5ZHJhdGluZy4gVGhpcyBpcyBhIGZhc3QgcGF0aCB0byBrbm93IHdoZXRoZXIgdGhpc1xuICAgICAgLy8gdHJlZSBpcyBwYXJ0IG9mIGEgaHlkcmF0aW5nIHRyZWUuIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgYSBjaGlsZFxuICAgICAgLy8gbm9kZSBoYXMgZnVsbHkgbW91bnRlZCB5ZXQsIGFuZCBmb3Igc2NoZWR1bGluZyBldmVudCByZXBsYXlpbmcuXG4gICAgICAvLyBDb25jZXB0dWFsbHkgdGhpcyBpcyBzaW1pbGFyIHRvIFBsYWNlbWVudCBpbiB0aGF0IGEgbmV3IHN1YnRyZWUgaXNcbiAgICAgIC8vIGluc2VydGVkIGludG8gdGhlIFJlYWN0IHRyZWUgaGVyZS4gSXQganVzdCBoYXBwZW5zIHRvIG5vdCBuZWVkIERPTVxuICAgICAgLy8gbXV0YXRpb25zIGJlY2F1c2UgaXQgYWxyZWFkeSBleGlzdHMuXG5cbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmZsYWdzIHw9IEh5ZHJhdGluZztcbiAgICAgIHJldHVybiBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgc2Vjb25kIHJlbmRlciBwYXNzLiBXZSBhbHJlYWR5IGF0dGVtcHRlZCB0byBoeWRyYXRlZCwgYnV0XG4gICAgLy8gc29tZXRoaW5nIGVpdGhlciBzdXNwZW5kZWQgb3IgZXJyb3JlZC5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBGb3JjZUNsaWVudFJlbmRlcikge1xuICAgICAgLy8gU29tZXRoaW5nIGVycm9yZWQgZHVyaW5nIGh5ZHJhdGlvbi4gVHJ5IGFnYWluIHdpdGhvdXQgaHlkcmF0aW5nLlxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gfkZvcmNlQ2xpZW50UmVuZGVyO1xuXG4gICAgICB2YXIgX2NhcHR1cmVkVmFsdWUyID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZShuZXcgRXJyb3IoJ1RoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBoeWRyYXRpbmcgdGhpcyBTdXNwZW5zZSBib3VuZGFyeS4gJyArICdTd2l0Y2hlZCB0byBjbGllbnQgcmVuZGVyaW5nLicpKTtcblxuICAgICAgcmV0dXJuIHJldHJ5U3VzcGVuc2VDb21wb25lbnRXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcywgX2NhcHR1cmVkVmFsdWUyKTtcbiAgICB9IGVsc2UgaWYgKHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgIT09IG51bGwpIHtcbiAgICAgIC8vIFNvbWV0aGluZyBzdXNwZW5kZWQgYW5kIHdlIHNob3VsZCBzdGlsbCBiZSBpbiBkZWh5ZHJhdGVkIG1vZGUuXG4gICAgICAvLyBMZWF2ZSB0aGUgZXhpc3RpbmcgY2hpbGQgaW4gcGxhY2UuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGN1cnJlbnQuY2hpbGQ7IC8vIFRoZSBkZWh5ZHJhdGVkIGNvbXBsZXRpb24gcGFzcyBleHBlY3RzIHRoaXMgZmxhZyB0byBiZSB0aGVyZVxuICAgICAgLy8gYnV0IHRoZSBub3JtYWwgc3VzcGVuc2UgcGFzcyBkb2Vzbid0LlxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFN1c3BlbmRlZCBidXQgd2Ugc2hvdWxkIG5vIGxvbmdlciBiZSBpbiBkZWh5ZHJhdGVkIG1vZGUuXG4gICAgICAvLyBUaGVyZWZvcmUgd2Ugbm93IGhhdmUgdG8gcmVuZGVyIHRoZSBmYWxsYmFjay5cbiAgICAgIHZhciBuZXh0UHJpbWFyeUNoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIG5leHRGYWxsYmFja0NoaWxkcmVuID0gbmV4dFByb3BzLmZhbGxiYWNrO1xuICAgICAgdmFyIGZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IG1vdW50U3VzcGVuc2VGYWxsYmFja0FmdGVyUmV0cnlXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0UHJpbWFyeUNoaWxkcmVuLCBuZXh0RmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICAgICAgdmFyIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDQubWVtb2l6ZWRTdGF0ZSA9IG1vdW50U3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShyZW5kZXJMYW5lcyk7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gU1VTUEVOREVEX01BUktFUjtcbiAgICAgIHJldHVybiBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlU3VzcGVuc2VXb3JrT25GaWJlcihmaWJlciwgcmVuZGVyTGFuZXMsIHByb3BhZ2F0aW9uUm9vdCkge1xuICBmaWJlci5sYW5lcyA9IG1lcmdlTGFuZXMoZmliZXIubGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgYWx0ZXJuYXRlLmxhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUubGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHNjaGVkdWxlQ29udGV4dFdvcmtPblBhcmVudFBhdGgoZmliZXIucmV0dXJuLCByZW5kZXJMYW5lcywgcHJvcGFnYXRpb25Sb290KTtcbn1cblxuZnVuY3Rpb24gcHJvcGFnYXRlU3VzcGVuc2VDb250ZXh0Q2hhbmdlKHdvcmtJblByb2dyZXNzLCBmaXJzdENoaWxkLCByZW5kZXJMYW5lcykge1xuICAvLyBNYXJrIGFueSBTdXNwZW5zZSBib3VuZGFyaWVzIHdpdGggZmFsbGJhY2tzIGFzIGhhdmluZyB3b3JrIHRvIGRvLlxuICAvLyBJZiB0aGV5IHdlcmUgcHJldmlvdXNseSBmb3JjZWQgaW50byBmYWxsYmFja3MsIHRoZXkgbWF5IG5vdyBiZSBhYmxlXG4gIC8vIHRvIHVuYmxvY2suXG4gIHZhciBub2RlID0gZmlyc3RDaGlsZDtcblxuICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgIGlmIChub2RlLnRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICAgIHZhciBzdGF0ZSA9IG5vZGUubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgaWYgKHN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIHNjaGVkdWxlU3VzcGVuc2VXb3JrT25GaWJlcihub2RlLCByZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobm9kZS50YWcgPT09IFN1c3BlbnNlTGlzdENvbXBvbmVudCkge1xuICAgICAgLy8gSWYgdGhlIHRhaWwgaXMgaGlkZGVuIHRoZXJlIG1pZ2h0IG5vdCBiZSBhbiBTdXNwZW5zZSBib3VuZGFyaWVzXG4gICAgICAvLyB0byBzY2hlZHVsZSB3b3JrIG9uLiBJbiB0aGlzIGNhc2Ugd2UgaGF2ZSB0byBzY2hlZHVsZSBpdCBvbiB0aGVcbiAgICAgIC8vIGxpc3QgaXRzZWxmLlxuICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSB0byB0cmF2ZXJzZSB0byB0aGUgY2hpbGRyZW4gb2YgdGhlIGxpc3Qgc2luY2VcbiAgICAgIC8vIHRoZSBsaXN0IHdpbGwgcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugd2hlbiBpdCByZXJlbmRlcnMuXG4gICAgICBzY2hlZHVsZVN1c3BlbnNlV29ya09uRmliZXIobm9kZSwgcmVuZGVyTGFuZXMsIHdvcmtJblByb2dyZXNzKTtcbiAgICB9IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUgPT09IHdvcmtJblByb2dyZXNzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kTGFzdENvbnRlbnRSb3coZmlyc3RDaGlsZCkge1xuICAvLyBUaGlzIGlzIGdvaW5nIHRvIGZpbmQgdGhlIGxhc3Qgcm93IGFtb25nIHRoZXNlIGNoaWxkcmVuIHRoYXQgaXMgYWxyZWFkeVxuICAvLyBzaG93aW5nIGNvbnRlbnQgb24gdGhlIHNjcmVlbiwgYXMgb3Bwb3NlZCB0byBiZWluZyBpbiBmYWxsYmFjayBzdGF0ZSBvclxuICAvLyBuZXcuIElmIGEgcm93IGhhcyBtdWx0aXBsZSBTdXNwZW5zZSBib3VuZGFyaWVzLCBhbnkgb2YgdGhlbSBiZWluZyBpbiB0aGVcbiAgLy8gZmFsbGJhY2sgc3RhdGUsIGNvdW50cyBhcyB0aGUgd2hvbGUgcm93IGJlaW5nIGluIGEgZmFsbGJhY2sgc3RhdGUuXG4gIC8vIE5vdGUgdGhhdCB0aGUgXCJyb3dzXCIgd2lsbCBiZSB3b3JrSW5Qcm9ncmVzcywgYnV0IGFueSBuZXN0ZWQgY2hpbGRyZW5cbiAgLy8gd2lsbCBzdGlsbCBiZSBjdXJyZW50IHNpbmNlIHdlIGhhdmVuJ3QgcmVuZGVyZWQgdGhlbSB5ZXQuIFRoZSBtb3VudGVkXG4gIC8vIG9yZGVyIG1heSBub3QgYmUgdGhlIHNhbWUgYXMgdGhlIG5ldyBvcmRlci4gV2UgdXNlIHRoZSBuZXcgb3JkZXIuXG4gIHZhciByb3cgPSBmaXJzdENoaWxkO1xuICB2YXIgbGFzdENvbnRlbnRSb3cgPSBudWxsO1xuXG4gIHdoaWxlIChyb3cgIT09IG51bGwpIHtcbiAgICB2YXIgY3VycmVudFJvdyA9IHJvdy5hbHRlcm5hdGU7IC8vIE5ldyByb3dzIGNhbid0IGJlIGNvbnRlbnQgcm93cy5cblxuICAgIGlmIChjdXJyZW50Um93ICE9PSBudWxsICYmIGZpbmRGaXJzdFN1c3BlbmRlZChjdXJyZW50Um93KSA9PT0gbnVsbCkge1xuICAgICAgbGFzdENvbnRlbnRSb3cgPSByb3c7XG4gICAgfVxuXG4gICAgcm93ID0gcm93LnNpYmxpbmc7XG4gIH1cblxuICByZXR1cm4gbGFzdENvbnRlbnRSb3c7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUmV2ZWFsT3JkZXIocmV2ZWFsT3JkZXIpIHtcbiAge1xuICAgIGlmIChyZXZlYWxPcmRlciAhPT0gdW5kZWZpbmVkICYmIHJldmVhbE9yZGVyICE9PSAnZm9yd2FyZHMnICYmIHJldmVhbE9yZGVyICE9PSAnYmFja3dhcmRzJyAmJiByZXZlYWxPcmRlciAhPT0gJ3RvZ2V0aGVyJyAmJiAhZGlkV2FybkFib3V0UmV2ZWFsT3JkZXJbcmV2ZWFsT3JkZXJdKSB7XG4gICAgICBkaWRXYXJuQWJvdXRSZXZlYWxPcmRlcltyZXZlYWxPcmRlcl0gPSB0cnVlO1xuXG4gICAgICBpZiAodHlwZW9mIHJldmVhbE9yZGVyID09PSAnc3RyaW5nJykge1xuICAgICAgICBzd2l0Y2ggKHJldmVhbE9yZGVyLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICBjYXNlICd0b2dldGhlcic6XG4gICAgICAgICAgY2FzZSAnZm9yd2FyZHMnOlxuICAgICAgICAgIGNhc2UgJ2JhY2t3YXJkcyc6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGVycm9yKCdcIiVzXCIgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yIHJldmVhbE9yZGVyIG9uIDxTdXNwZW5zZUxpc3QgLz4uICcgKyAnVXNlIGxvd2VyY2FzZSBcIiVzXCIgaW5zdGVhZC4nLCByZXZlYWxPcmRlciwgcmV2ZWFsT3JkZXIudG9Mb3dlckNhc2UoKSk7XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICBjYXNlICdmb3J3YXJkJzpcbiAgICAgICAgICBjYXNlICdiYWNrd2FyZCc6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGVycm9yKCdcIiVzXCIgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yIHJldmVhbE9yZGVyIG9uIDxTdXNwZW5zZUxpc3QgLz4uICcgKyAnUmVhY3QgdXNlcyB0aGUgLXMgc3VmZml4IGluIHRoZSBzcGVsbGluZy4gVXNlIFwiJXNzXCIgaW5zdGVhZC4nLCByZXZlYWxPcmRlciwgcmV2ZWFsT3JkZXIudG9Mb3dlckNhc2UoKSk7XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgZXJyb3IoJ1wiJXNcIiBpcyBub3QgYSBzdXBwb3J0ZWQgcmV2ZWFsT3JkZXIgb24gPFN1c3BlbnNlTGlzdCAvPi4gJyArICdEaWQgeW91IG1lYW4gXCJ0b2dldGhlclwiLCBcImZvcndhcmRzXCIgb3IgXCJiYWNrd2FyZHNcIj8nLCByZXZlYWxPcmRlcik7XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcignJXMgaXMgbm90IGEgc3VwcG9ydGVkIHZhbHVlIGZvciByZXZlYWxPcmRlciBvbiA8U3VzcGVuc2VMaXN0IC8+LiAnICsgJ0RpZCB5b3UgbWVhbiBcInRvZ2V0aGVyXCIsIFwiZm9yd2FyZHNcIiBvciBcImJhY2t3YXJkc1wiPycsIHJldmVhbE9yZGVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVUYWlsT3B0aW9ucyh0YWlsTW9kZSwgcmV2ZWFsT3JkZXIpIHtcbiAge1xuICAgIGlmICh0YWlsTW9kZSAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuQWJvdXRUYWlsT3B0aW9uc1t0YWlsTW9kZV0pIHtcbiAgICAgIGlmICh0YWlsTW9kZSAhPT0gJ2NvbGxhcHNlZCcgJiYgdGFpbE1vZGUgIT09ICdoaWRkZW4nKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dFRhaWxPcHRpb25zW3RhaWxNb2RlXSA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJ1wiJXNcIiBpcyBub3QgYSBzdXBwb3J0ZWQgdmFsdWUgZm9yIHRhaWwgb24gPFN1c3BlbnNlTGlzdCAvPi4gJyArICdEaWQgeW91IG1lYW4gXCJjb2xsYXBzZWRcIiBvciBcImhpZGRlblwiPycsIHRhaWxNb2RlKTtcbiAgICAgIH0gZWxzZSBpZiAocmV2ZWFsT3JkZXIgIT09ICdmb3J3YXJkcycgJiYgcmV2ZWFsT3JkZXIgIT09ICdiYWNrd2FyZHMnKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dFRhaWxPcHRpb25zW3RhaWxNb2RlXSA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJzxTdXNwZW5zZUxpc3QgdGFpbD1cIiVzXCIgLz4gaXMgb25seSB2YWxpZCBpZiByZXZlYWxPcmRlciBpcyAnICsgJ1wiZm9yd2FyZHNcIiBvciBcImJhY2t3YXJkc1wiLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBzcGVjaWZ5IHJldmVhbE9yZGVyPVwiZm9yd2FyZHNcIj8nLCB0YWlsTW9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3VzcGVuc2VMaXN0TmVzdGVkQ2hpbGQoY2hpbGRTbG90LCBpbmRleCkge1xuICB7XG4gICAgdmFyIGlzQW5BcnJheSA9IGlzQXJyYXkoY2hpbGRTbG90KTtcbiAgICB2YXIgaXNJdGVyYWJsZSA9ICFpc0FuQXJyYXkgJiYgdHlwZW9mIGdldEl0ZXJhdG9yRm4oY2hpbGRTbG90KSA9PT0gJ2Z1bmN0aW9uJztcblxuICAgIGlmIChpc0FuQXJyYXkgfHwgaXNJdGVyYWJsZSkge1xuICAgICAgdmFyIHR5cGUgPSBpc0FuQXJyYXkgPyAnYXJyYXknIDogJ2l0ZXJhYmxlJztcblxuICAgICAgZXJyb3IoJ0EgbmVzdGVkICVzIHdhcyBwYXNzZWQgdG8gcm93ICMlcyBpbiA8U3VzcGVuc2VMaXN0IC8+LiBXcmFwIGl0IGluICcgKyAnYW4gYWRkaXRpb25hbCBTdXNwZW5zZUxpc3QgdG8gY29uZmlndXJlIGl0cyByZXZlYWxPcmRlcjogJyArICc8U3VzcGVuc2VMaXN0IHJldmVhbE9yZGVyPS4uLj4gLi4uICcgKyAnPFN1c3BlbnNlTGlzdCByZXZlYWxPcmRlcj0uLi4+eyVzfTwvU3VzcGVuc2VMaXN0PiAuLi4gJyArICc8L1N1c3BlbnNlTGlzdD4nLCB0eXBlLCBpbmRleCwgdHlwZSk7XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTdXNwZW5zZUxpc3RDaGlsZHJlbihjaGlsZHJlbiwgcmV2ZWFsT3JkZXIpIHtcbiAge1xuICAgIGlmICgocmV2ZWFsT3JkZXIgPT09ICdmb3J3YXJkcycgfHwgcmV2ZWFsT3JkZXIgPT09ICdiYWNrd2FyZHMnKSAmJiBjaGlsZHJlbiAhPT0gdW5kZWZpbmVkICYmIGNoaWxkcmVuICE9PSBudWxsICYmIGNoaWxkcmVuICE9PSBmYWxzZSkge1xuICAgICAgaWYgKGlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoIXZhbGlkYXRlU3VzcGVuc2VMaXN0TmVzdGVkQ2hpbGQoY2hpbGRyZW5baV0sIGkpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4oY2hpbGRyZW4pO1xuXG4gICAgICAgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHZhciBjaGlsZHJlbkl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKGNoaWxkcmVuKTtcblxuICAgICAgICAgIGlmIChjaGlsZHJlbkl0ZXJhdG9yKSB7XG4gICAgICAgICAgICB2YXIgc3RlcCA9IGNoaWxkcmVuSXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgdmFyIF9pID0gMDtcblxuICAgICAgICAgICAgZm9yICg7ICFzdGVwLmRvbmU7IHN0ZXAgPSBjaGlsZHJlbkl0ZXJhdG9yLm5leHQoKSkge1xuICAgICAgICAgICAgICBpZiAoIXZhbGlkYXRlU3VzcGVuc2VMaXN0TmVzdGVkQ2hpbGQoc3RlcC52YWx1ZSwgX2kpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgX2krKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXJyb3IoJ0Egc2luZ2xlIHJvdyB3YXMgcGFzc2VkIHRvIGEgPFN1c3BlbnNlTGlzdCByZXZlYWxPcmRlcj1cIiVzXCIgLz4uICcgKyAnVGhpcyBpcyBub3QgdXNlZnVsIHNpbmNlIGl0IG5lZWRzIG11bHRpcGxlIHJvd3MuICcgKyAnRGlkIHlvdSBtZWFuIHRvIHBhc3MgbXVsdGlwbGUgY2hpbGRyZW4gb3IgYW4gYXJyYXk/JywgcmV2ZWFsT3JkZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluaXRTdXNwZW5zZUxpc3RSZW5kZXJTdGF0ZSh3b3JrSW5Qcm9ncmVzcywgaXNCYWNrd2FyZHMsIHRhaWwsIGxhc3RDb250ZW50Um93LCB0YWlsTW9kZSkge1xuICB2YXIgcmVuZGVyU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChyZW5kZXJTdGF0ZSA9PT0gbnVsbCkge1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSB7XG4gICAgICBpc0JhY2t3YXJkczogaXNCYWNrd2FyZHMsXG4gICAgICByZW5kZXJpbmc6IG51bGwsXG4gICAgICByZW5kZXJpbmdTdGFydFRpbWU6IDAsXG4gICAgICBsYXN0OiBsYXN0Q29udGVudFJvdyxcbiAgICAgIHRhaWw6IHRhaWwsXG4gICAgICB0YWlsTW9kZTogdGFpbE1vZGVcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIC8vIFdlIGNhbiByZXVzZSB0aGUgZXhpc3Rpbmcgb2JqZWN0IGZyb20gcHJldmlvdXMgcmVuZGVycy5cbiAgICByZW5kZXJTdGF0ZS5pc0JhY2t3YXJkcyA9IGlzQmFja3dhcmRzO1xuICAgIHJlbmRlclN0YXRlLnJlbmRlcmluZyA9IG51bGw7XG4gICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nU3RhcnRUaW1lID0gMDtcbiAgICByZW5kZXJTdGF0ZS5sYXN0ID0gbGFzdENvbnRlbnRSb3c7XG4gICAgcmVuZGVyU3RhdGUudGFpbCA9IHRhaWw7XG4gICAgcmVuZGVyU3RhdGUudGFpbE1vZGUgPSB0YWlsTW9kZTtcbiAgfVxufSAvLyBUaGlzIGNhbiBlbmQgdXAgcmVuZGVyaW5nIHRoaXMgY29tcG9uZW50IG11bHRpcGxlIHBhc3Nlcy5cbi8vIFRoZSBmaXJzdCBwYXNzIHNwbGl0cyB0aGUgY2hpbGRyZW4gZmliZXJzIGludG8gdHdvIHNldHMuIEEgaGVhZCBhbmQgdGFpbC5cbi8vIFdlIGZpcnN0IHJlbmRlciB0aGUgaGVhZC4gSWYgYW55dGhpbmcgaXMgaW4gZmFsbGJhY2sgc3RhdGUsIHdlIGRvIGFub3RoZXJcbi8vIHBhc3MgdGhyb3VnaCBiZWdpbldvcmsgdG8gcmVyZW5kZXIgYWxsIGNoaWxkcmVuIChpbmNsdWRpbmcgdGhlIHRhaWwpIHdpdGhcbi8vIHRoZSBmb3JjZSBzdXNwZW5kIGNvbnRleHQuIElmIHRoZSBmaXJzdCByZW5kZXIgZGlkbid0IGhhdmUgYW55dGhpbmcgaW5cbi8vIGluIGZhbGxiYWNrIHN0YXRlLiBUaGVuIHdlIHJlbmRlciBlYWNoIHJvdyBpbiB0aGUgdGFpbCBvbmUtYnktb25lLlxuLy8gVGhhdCBoYXBwZW5zIGluIHRoZSBjb21wbGV0ZVdvcmsgcGhhc2Ugd2l0aG91dCBnb2luZyBiYWNrIHRvIGJlZ2luV29yay5cblxuXG5mdW5jdGlvbiB1cGRhdGVTdXNwZW5zZUxpc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciByZXZlYWxPcmRlciA9IG5leHRQcm9wcy5yZXZlYWxPcmRlcjtcbiAgdmFyIHRhaWxNb2RlID0gbmV4dFByb3BzLnRhaWw7XG4gIHZhciBuZXdDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgdmFsaWRhdGVSZXZlYWxPcmRlcihyZXZlYWxPcmRlcik7XG4gIHZhbGlkYXRlVGFpbE9wdGlvbnModGFpbE1vZGUsIHJldmVhbE9yZGVyKTtcbiAgdmFsaWRhdGVTdXNwZW5zZUxpc3RDaGlsZHJlbihuZXdDaGlsZHJlbiwgcmV2ZWFsT3JkZXIpO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV3Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgdmFyIHN1c3BlbnNlQ29udGV4dCA9IHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudDtcbiAgdmFyIHNob3VsZEZvcmNlRmFsbGJhY2sgPSBoYXNTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0LCBGb3JjZVN1c3BlbnNlRmFsbGJhY2spO1xuXG4gIGlmIChzaG91bGRGb3JjZUZhbGxiYWNrKSB7XG4gICAgc3VzcGVuc2VDb250ZXh0ID0gc2V0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQsIEZvcmNlU3VzcGVuc2VGYWxsYmFjayk7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZGlkU3VzcGVuZEJlZm9yZSA9IGN1cnJlbnQgIT09IG51bGwgJiYgKGN1cnJlbnQuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncztcblxuICAgIGlmIChkaWRTdXNwZW5kQmVmb3JlKSB7XG4gICAgICAvLyBJZiB3ZSBwcmV2aW91c2x5IGZvcmNlZCBhIGZhbGxiYWNrLCB3ZSBuZWVkIHRvIHNjaGVkdWxlIHdvcmtcbiAgICAgIC8vIG9uIGFueSBuZXN0ZWQgYm91bmRhcmllcyB0byBsZXQgdGhlbSBrbm93IHRvIHRyeSB0byByZW5kZXJcbiAgICAgIC8vIGFnYWluLiBUaGlzIGlzIHRoZSBzYW1lIGFzIGNvbnRleHQgdXBkYXRpbmcuXG4gICAgICBwcm9wYWdhdGVTdXNwZW5zZUNvbnRleHRDaGFuZ2Uod29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLmNoaWxkLCByZW5kZXJMYW5lcyk7XG4gICAgfVxuXG4gICAgc3VzcGVuc2VDb250ZXh0ID0gc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0KTtcbiAgfVxuXG4gIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbnNlQ29udGV4dCk7XG5cbiAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICAvLyBJbiBsZWdhY3kgbW9kZSwgU3VzcGVuc2VMaXN0IGRvZXNuJ3Qgd29yayBzbyB3ZSBqdXN0XG4gICAgLy8gdXNlIG1ha2UgaXQgYSBub29wIGJ5IHRyZWF0aW5nIGl0IGFzIHRoZSBkZWZhdWx0IHJldmVhbE9yZGVyLlxuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICB9IGVsc2Uge1xuICAgIHN3aXRjaCAocmV2ZWFsT3JkZXIpIHtcbiAgICAgIGNhc2UgJ2ZvcndhcmRzJzpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXN0Q29udGVudFJvdyA9IGZpbmRMYXN0Q29udGVudFJvdyh3b3JrSW5Qcm9ncmVzcy5jaGlsZCk7XG4gICAgICAgICAgdmFyIHRhaWw7XG5cbiAgICAgICAgICBpZiAobGFzdENvbnRlbnRSb3cgPT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFRoZSB3aG9sZSBsaXN0IGlzIHBhcnQgb2YgdGhlIHRhaWwuXG4gICAgICAgICAgICAvLyBUT0RPOiBXZSBjb3VsZCBmYXN0IHBhdGggYnkganVzdCByZW5kZXJpbmcgdGhlIHRhaWwgbm93LlxuICAgICAgICAgICAgdGFpbCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBudWxsO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBEaXNjb25uZWN0IHRoZSB0YWlsIHJvd3MgYWZ0ZXIgdGhlIGNvbnRlbnQgcm93LlxuICAgICAgICAgICAgLy8gV2UncmUgZ29pbmcgdG8gcmVuZGVyIHRoZW0gc2VwYXJhdGVseSBsYXRlci5cbiAgICAgICAgICAgIHRhaWwgPSBsYXN0Q29udGVudFJvdy5zaWJsaW5nO1xuICAgICAgICAgICAgbGFzdENvbnRlbnRSb3cuc2libGluZyA9IG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaW5pdFN1c3BlbnNlTGlzdFJlbmRlclN0YXRlKHdvcmtJblByb2dyZXNzLCBmYWxzZSwgLy8gaXNCYWNrd2FyZHNcbiAgICAgICAgICB0YWlsLCBsYXN0Q29udGVudFJvdywgdGFpbE1vZGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgJ2JhY2t3YXJkcyc6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBXZSdyZSBnb2luZyB0byBmaW5kIHRoZSBmaXJzdCByb3cgdGhhdCBoYXMgZXhpc3RpbmcgY29udGVudC5cbiAgICAgICAgICAvLyBBdCB0aGUgc2FtZSB0aW1lIHdlJ3JlIGdvaW5nIHRvIHJldmVyc2UgdGhlIGxpc3Qgb2YgZXZlcnl0aGluZ1xuICAgICAgICAgIC8vIHdlIHBhc3MgaW4gdGhlIG1lYW50aW1lLiBUaGF0J3MgZ29pbmcgdG8gYmUgb3VyIHRhaWwgaW4gcmV2ZXJzZVxuICAgICAgICAgIC8vIG9yZGVyLlxuICAgICAgICAgIHZhciBfdGFpbCA9IG51bGw7XG4gICAgICAgICAgdmFyIHJvdyA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbnVsbDtcblxuICAgICAgICAgIHdoaWxlIChyb3cgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBjdXJyZW50Um93ID0gcm93LmFsdGVybmF0ZTsgLy8gTmV3IHJvd3MgY2FuJ3QgYmUgY29udGVudCByb3dzLlxuXG4gICAgICAgICAgICBpZiAoY3VycmVudFJvdyAhPT0gbnVsbCAmJiBmaW5kRmlyc3RTdXNwZW5kZWQoY3VycmVudFJvdykgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtYWluIGNvbnRlbnQuXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcm93O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIG5leHRSb3cgPSByb3cuc2libGluZztcbiAgICAgICAgICAgIHJvdy5zaWJsaW5nID0gX3RhaWw7XG4gICAgICAgICAgICBfdGFpbCA9IHJvdztcbiAgICAgICAgICAgIHJvdyA9IG5leHRSb3c7XG4gICAgICAgICAgfSAvLyBUT0RPOiBJZiB3b3JrSW5Qcm9ncmVzcy5jaGlsZCBpcyBudWxsLCB3ZSBjYW4gY29udGludWUgb24gdGhlIHRhaWwgaW1tZWRpYXRlbHkuXG5cblxuICAgICAgICAgIGluaXRTdXNwZW5zZUxpc3RSZW5kZXJTdGF0ZSh3b3JrSW5Qcm9ncmVzcywgdHJ1ZSwgLy8gaXNCYWNrd2FyZHNcbiAgICAgICAgICBfdGFpbCwgbnVsbCwgLy8gbGFzdFxuICAgICAgICAgIHRhaWxNb2RlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlICd0b2dldGhlcic6XG4gICAgICAgIHtcbiAgICAgICAgICBpbml0U3VzcGVuc2VMaXN0UmVuZGVyU3RhdGUod29ya0luUHJvZ3Jlc3MsIGZhbHNlLCAvLyBpc0JhY2t3YXJkc1xuICAgICAgICAgIG51bGwsIC8vIHRhaWxcbiAgICAgICAgICBudWxsLCAvLyBsYXN0XG4gICAgICAgICAgdW5kZWZpbmVkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB7XG4gICAgICAgICAgLy8gVGhlIGRlZmF1bHQgcmV2ZWFsIG9yZGVyIGlzIHRoZSBzYW1lIGFzIG5vdCBoYXZpbmdcbiAgICAgICAgICAvLyBhIGJvdW5kYXJ5LlxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVQb3J0YWxDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHB1c2hIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzLCB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyk7XG4gIHZhciBuZXh0Q2hpbGRyZW4gPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAvLyBQb3J0YWxzIGFyZSBzcGVjaWFsIGJlY2F1c2Ugd2UgZG9uJ3QgYXBwZW5kIHRoZSBjaGlsZHJlbiBkdXJpbmcgbW91bnRcbiAgICAvLyBidXQgYXQgY29tbWl0LiBUaGVyZWZvcmUgd2UgbmVlZCB0byB0cmFjayBpbnNlcnRpb25zIHdoaWNoIHRoZSBub3JtYWxcbiAgICAvLyBmbG93IGRvZXNuJ3QgZG8gZHVyaW5nIG1vdW50LiBUaGlzIGRvZXNuJ3QgaGFwcGVuIGF0IHRoZSByb290IGJlY2F1c2VcbiAgICAvLyB0aGUgcm9vdCBhbHdheXMgc3RhcnRzIHdpdGggYSBcImN1cnJlbnRcIiB3aXRoIGEgbnVsbCBjaGlsZC5cbiAgICAvLyBUT0RPOiBDb25zaWRlciB1bmlmeWluZyB0aGlzIHdpdGggaG93IHRoZSByb290IHdvcmtzLlxuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmVjb25jaWxlQ2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIG51bGwsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB9IGVsc2Uge1xuICAgIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxudmFyIGhhc1dhcm5lZEFib3V0VXNpbmdOb1ZhbHVlUHJvcE9uQ29udGV4dFByb3ZpZGVyID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHVwZGF0ZUNvbnRleHRQcm92aWRlcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIHByb3ZpZGVyVHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gIHZhciBjb250ZXh0ID0gcHJvdmlkZXJUeXBlLl9jb250ZXh0O1xuICB2YXIgbmV3UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBvbGRQcm9wcyA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHM7XG4gIHZhciBuZXdWYWx1ZSA9IG5ld1Byb3BzLnZhbHVlO1xuXG4gIHtcbiAgICBpZiAoISgndmFsdWUnIGluIG5ld1Byb3BzKSkge1xuICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dFVzaW5nTm9WYWx1ZVByb3BPbkNvbnRleHRQcm92aWRlcikge1xuICAgICAgICBoYXNXYXJuZWRBYm91dFVzaW5nTm9WYWx1ZVByb3BPbkNvbnRleHRQcm92aWRlciA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJ1RoZSBgdmFsdWVgIHByb3AgaXMgcmVxdWlyZWQgZm9yIHRoZSBgPENvbnRleHQuUHJvdmlkZXI+YC4gRGlkIHlvdSBtaXNzcGVsbCBpdCBvciBmb3JnZXQgdG8gcGFzcyBpdD8nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcHJvdmlkZXJQcm9wVHlwZXMgPSB3b3JrSW5Qcm9ncmVzcy50eXBlLnByb3BUeXBlcztcblxuICAgIGlmIChwcm92aWRlclByb3BUeXBlcykge1xuICAgICAgY2hlY2tQcm9wVHlwZXMocHJvdmlkZXJQcm9wVHlwZXMsIG5ld1Byb3BzLCAncHJvcCcsICdDb250ZXh0LlByb3ZpZGVyJyk7XG4gICAgfVxuICB9XG5cbiAgcHVzaFByb3ZpZGVyKHdvcmtJblByb2dyZXNzLCBjb250ZXh0LCBuZXdWYWx1ZSk7XG5cbiAge1xuICAgIGlmIChvbGRQcm9wcyAhPT0gbnVsbCkge1xuICAgICAgdmFyIG9sZFZhbHVlID0gb2xkUHJvcHMudmFsdWU7XG5cbiAgICAgIGlmIChvYmplY3RJcyhvbGRWYWx1ZSwgbmV3VmFsdWUpKSB7XG4gICAgICAgIC8vIE5vIGNoYW5nZS4gQmFpbG91dCBlYXJseSBpZiBjaGlsZHJlbiBhcmUgdGhlIHNhbWUuXG4gICAgICAgIGlmIChvbGRQcm9wcy5jaGlsZHJlbiA9PT0gbmV3UHJvcHMuY2hpbGRyZW4gJiYgIWhhc0NvbnRleHRDaGFuZ2VkKCkpIHtcbiAgICAgICAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGUgY29udGV4dCB2YWx1ZSBjaGFuZ2VkLiBTZWFyY2ggZm9yIG1hdGNoaW5nIGNvbnN1bWVycyBhbmQgc2NoZWR1bGVcbiAgICAgICAgLy8gdGhlbSB0byB1cGRhdGUuXG4gICAgICAgIHByb3BhZ2F0ZUNvbnRleHRDaGFuZ2Uod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgbmV3Q2hpbGRyZW4gPSBuZXdQcm9wcy5jaGlsZHJlbjtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5ld0NoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxudmFyIGhhc1dhcm5lZEFib3V0VXNpbmdDb250ZXh0QXNDb25zdW1lciA9IGZhbHNlO1xuXG5mdW5jdGlvbiB1cGRhdGVDb250ZXh0Q29uc3VtZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBjb250ZXh0ID0gd29ya0luUHJvZ3Jlc3MudHlwZTsgLy8gVGhlIGxvZ2ljIGJlbG93IGZvciBDb250ZXh0IGRpZmZlcnMgZGVwZW5kaW5nIG9uIFBST0Qgb3IgREVWIG1vZGUuIEluXG4gIC8vIERFViBtb2RlLCB3ZSBjcmVhdGUgYSBzZXBhcmF0ZSBvYmplY3QgZm9yIENvbnRleHQuQ29uc3VtZXIgdGhhdCBhY3RzXG4gIC8vIGxpa2UgYSBwcm94eSB0byBDb250ZXh0LiBUaGlzIHByb3h5IG9iamVjdCBhZGRzIHVubmVjZXNzYXJ5IGNvZGUgaW4gUFJPRFxuICAvLyBzbyB3ZSB1c2UgdGhlIG9sZCBiZWhhdmlvdXIgKENvbnRleHQuQ29uc3VtZXIgcmVmZXJlbmNlcyBDb250ZXh0KSB0b1xuICAvLyByZWR1Y2Ugc2l6ZSBhbmQgb3ZlcmhlYWQuIFRoZSBzZXBhcmF0ZSBvYmplY3QgcmVmZXJlbmNlcyBjb250ZXh0IHZpYVxuICAvLyBhIHByb3BlcnR5IGNhbGxlZCBcIl9jb250ZXh0XCIsIHdoaWNoIGFsc28gZ2l2ZXMgdXMgdGhlIGFiaWxpdHkgdG8gY2hlY2tcbiAgLy8gaW4gREVWIG1vZGUgaWYgdGhpcyBwcm9wZXJ0eSBleGlzdHMgb3Igbm90IGFuZCB3YXJuIGlmIGl0IGRvZXMgbm90LlxuXG4gIHtcbiAgICBpZiAoY29udGV4dC5fY29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBUaGlzIG1heSBiZSBiZWNhdXNlIGl0J3MgYSBDb250ZXh0IChyYXRoZXIgdGhhbiBhIENvbnN1bWVyKS5cbiAgICAgIC8vIE9yIGl0IG1heSBiZSBiZWNhdXNlIGl0J3Mgb2xkZXIgUmVhY3Qgd2hlcmUgdGhleSdyZSB0aGUgc2FtZSB0aGluZy5cbiAgICAgIC8vIFdlIG9ubHkgd2FudCB0byB3YXJuIGlmIHdlJ3JlIHN1cmUgaXQncyBhIG5ldyBSZWFjdC5cbiAgICAgIGlmIChjb250ZXh0ICE9PSBjb250ZXh0LkNvbnN1bWVyKSB7XG4gICAgICAgIGlmICghaGFzV2FybmVkQWJvdXRVc2luZ0NvbnRleHRBc0NvbnN1bWVyKSB7XG4gICAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ0NvbnRleHRBc0NvbnN1bWVyID0gdHJ1ZTtcblxuICAgICAgICAgIGVycm9yKCdSZW5kZXJpbmcgPENvbnRleHQ+IGRpcmVjdGx5IGlzIG5vdCBzdXBwb3J0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAnICsgJ2EgZnV0dXJlIG1ham9yIHJlbGVhc2UuIERpZCB5b3UgbWVhbiB0byByZW5kZXIgPENvbnRleHQuQ29uc3VtZXI+IGluc3RlYWQ/Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29udGV4dCA9IGNvbnRleHQuX2NvbnRleHQ7XG4gICAgfVxuICB9XG5cbiAgdmFyIG5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgcmVuZGVyID0gbmV3UHJvcHMuY2hpbGRyZW47XG5cbiAge1xuICAgIGlmICh0eXBlb2YgcmVuZGVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignQSBjb250ZXh0IGNvbnN1bWVyIHdhcyByZW5kZXJlZCB3aXRoIG11bHRpcGxlIGNoaWxkcmVuLCBvciBhIGNoaWxkICcgKyBcInRoYXQgaXNuJ3QgYSBmdW5jdGlvbi4gQSBjb250ZXh0IGNvbnN1bWVyIGV4cGVjdHMgYSBzaW5nbGUgY2hpbGQgXCIgKyAndGhhdCBpcyBhIGZ1bmN0aW9uLiBJZiB5b3UgZGlkIHBhc3MgYSBmdW5jdGlvbiwgbWFrZSBzdXJlIHRoZXJlICcgKyAnaXMgbm8gdHJhaWxpbmcgb3IgbGVhZGluZyB3aGl0ZXNwYWNlIGFyb3VuZCBpdC4nKTtcbiAgICB9XG4gIH1cblxuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICB2YXIgbmV3VmFsdWUgPSByZWFkQ29udGV4dChjb250ZXh0KTtcblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQod29ya0luUHJvZ3Jlc3MpO1xuICB9XG5cbiAgdmFyIG5ld0NoaWxkcmVuO1xuXG4gIHtcbiAgICBSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICBzZXRJc1JlbmRlcmluZyh0cnVlKTtcbiAgICBuZXdDaGlsZHJlbiA9IHJlbmRlcihuZXdWYWx1ZSk7XG4gICAgc2V0SXNSZW5kZXJpbmcoZmFsc2UpO1xuICB9XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCk7XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5ld0NoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gbWFya1dvcmtJblByb2dyZXNzUmVjZWl2ZWRVcGRhdGUoKSB7XG4gIGRpZFJlY2VpdmVVcGRhdGUgPSB0cnVlO1xufVxuXG5mdW5jdGlvbiByZXNldFN1c3BlbmRlZEN1cnJlbnRPbk1vdW50SW5MZWdhY3lNb2RlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSB7XG4gIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIC8vIEEgbGF6eSBjb21wb25lbnQgb25seSBtb3VudHMgaWYgaXQgc3VzcGVuZGVkIGluc2lkZSBhIG5vbi1cbiAgICAgIC8vIGNvbmN1cnJlbnQgdHJlZSwgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLiBXZSB3YW50IHRvIHRyZWF0IGl0IGxpa2VcbiAgICAgIC8vIGEgbmV3IG1vdW50LCBldmVuIHRob3VnaCBhbiBlbXB0eSB2ZXJzaW9uIG9mIGl0IGFscmVhZHkgY29tbWl0dGVkLlxuICAgICAgLy8gRGlzY29ubmVjdCB0aGUgYWx0ZXJuYXRlIHBvaW50ZXJzLlxuICAgICAgY3VycmVudC5hbHRlcm5hdGUgPSBudWxsO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlID0gbnVsbDsgLy8gU2luY2UgdGhpcyBpcyBjb25jZXB0dWFsbHkgYSBuZXcgZmliZXIsIHNjaGVkdWxlIGEgUGxhY2VtZW50IGVmZmVjdFxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQbGFjZW1lbnQ7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgLy8gUmV1c2UgcHJldmlvdXMgZGVwZW5kZW5jaWVzXG4gICAgd29ya0luUHJvZ3Jlc3MuZGVwZW5kZW5jaWVzID0gY3VycmVudC5kZXBlbmRlbmNpZXM7XG4gIH1cblxuICB7XG4gICAgLy8gRG9uJ3QgdXBkYXRlIFwiYmFzZVwiIHJlbmRlciB0aW1lcyBmb3IgYmFpbG91dHMuXG4gICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmcoKTtcbiAgfVxuXG4gIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXMod29ya0luUHJvZ3Jlc3MubGFuZXMpOyAvLyBDaGVjayBpZiB0aGUgY2hpbGRyZW4gaGF2ZSBhbnkgcGVuZGluZyB3b3JrLlxuXG4gIGlmICghaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcykpIHtcbiAgICAvLyBUaGUgY2hpbGRyZW4gZG9uJ3QgaGF2ZSBhbnkgd29yayBlaXRoZXIuIFdlIGNhbiBza2lwIHRoZW0uXG4gICAgLy8gVE9ETzogT25jZSB3ZSBhZGQgYmFjayByZXN1bWluZywgd2Ugc2hvdWxkIGNoZWNrIGlmIHRoZSBjaGlsZHJlbiBhcmVcbiAgICAvLyBhIHdvcmstaW4tcHJvZ3Jlc3Mgc2V0LiBJZiBzbywgd2UgbmVlZCB0byB0cmFuc2ZlciB0aGVpciBlZmZlY3RzLlxuICAgIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSAvLyBUaGlzIGZpYmVyIGRvZXNuJ3QgaGF2ZSB3b3JrLCBidXQgaXRzIHN1YnRyZWUgZG9lcy4gQ2xvbmUgdGhlIGNoaWxkXG4gIC8vIGZpYmVycyBhbmQgY29udGludWUuXG5cblxuICBjbG9uZUNoaWxkRmliZXJzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiByZW1vdW50RmliZXIoY3VycmVudCwgb2xkV29ya0luUHJvZ3Jlc3MsIG5ld1dvcmtJblByb2dyZXNzKSB7XG4gIHtcbiAgICB2YXIgcmV0dXJuRmliZXIgPSBvbGRXb3JrSW5Qcm9ncmVzcy5yZXR1cm47XG5cbiAgICBpZiAocmV0dXJuRmliZXIgPT09IG51bGwpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBzd2FwIHRoZSByb290IGZpYmVyLicpO1xuICAgIH0gLy8gRGlzY29ubmVjdCBmcm9tIHRoZSBvbGQgY3VycmVudC5cbiAgICAvLyBJdCB3aWxsIGdldCBkZWxldGVkLlxuXG5cbiAgICBjdXJyZW50LmFsdGVybmF0ZSA9IG51bGw7XG4gICAgb2xkV29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlID0gbnVsbDsgLy8gQ29ubmVjdCB0byB0aGUgbmV3IHRyZWUuXG5cbiAgICBuZXdXb3JrSW5Qcm9ncmVzcy5pbmRleCA9IG9sZFdvcmtJblByb2dyZXNzLmluZGV4O1xuICAgIG5ld1dvcmtJblByb2dyZXNzLnNpYmxpbmcgPSBvbGRXb3JrSW5Qcm9ncmVzcy5zaWJsaW5nO1xuICAgIG5ld1dvcmtJblByb2dyZXNzLnJldHVybiA9IG9sZFdvcmtJblByb2dyZXNzLnJldHVybjtcbiAgICBuZXdXb3JrSW5Qcm9ncmVzcy5yZWYgPSBvbGRXb3JrSW5Qcm9ncmVzcy5yZWY7IC8vIFJlcGxhY2UgdGhlIGNoaWxkL3NpYmxpbmcgcG9pbnRlcnMgYWJvdmUgaXQuXG5cbiAgICBpZiAob2xkV29ya0luUHJvZ3Jlc3MgPT09IHJldHVybkZpYmVyLmNoaWxkKSB7XG4gICAgICByZXR1cm5GaWJlci5jaGlsZCA9IG5ld1dvcmtJblByb2dyZXNzO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcHJldlNpYmxpbmcgPSByZXR1cm5GaWJlci5jaGlsZDtcblxuICAgICAgaWYgKHByZXZTaWJsaW5nID09PSBudWxsKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgcGFyZW50IHRvIGhhdmUgYSBjaGlsZC4nKTtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKHByZXZTaWJsaW5nLnNpYmxpbmcgIT09IG9sZFdvcmtJblByb2dyZXNzKSB7XG4gICAgICAgIHByZXZTaWJsaW5nID0gcHJldlNpYmxpbmcuc2libGluZztcblxuICAgICAgICBpZiAocHJldlNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gZmluZCB0aGUgcHJldmlvdXMgc2libGluZy4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwcmV2U2libGluZy5zaWJsaW5nID0gbmV3V29ya0luUHJvZ3Jlc3M7XG4gICAgfSAvLyBEZWxldGUgdGhlIG9sZCBmaWJlciBhbmQgcGxhY2UgdGhlIG5ldyBvbmUuXG4gICAgLy8gU2luY2UgdGhlIG9sZCBmaWJlciBpcyBkaXNjb25uZWN0ZWQsIHdlIGhhdmUgdG8gc2NoZWR1bGUgaXQgbWFudWFsbHkuXG5cblxuICAgIHZhciBkZWxldGlvbnMgPSByZXR1cm5GaWJlci5kZWxldGlvbnM7XG5cbiAgICBpZiAoZGVsZXRpb25zID09PSBudWxsKSB7XG4gICAgICByZXR1cm5GaWJlci5kZWxldGlvbnMgPSBbY3VycmVudF07XG4gICAgICByZXR1cm5GaWJlci5mbGFncyB8PSBDaGlsZERlbGV0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGlvbnMucHVzaChjdXJyZW50KTtcbiAgICB9XG5cbiAgICBuZXdXb3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQbGFjZW1lbnQ7IC8vIFJlc3RhcnQgd29yayBmcm9tIHRoZSBuZXcgZmliZXIuXG5cbiAgICByZXR1cm4gbmV3V29ya0luUHJvZ3Jlc3M7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQoY3VycmVudCwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gQmVmb3JlIHBlcmZvcm1pbmcgYW4gZWFybHkgYmFpbG91dCwgd2UgbXVzdCBjaGVjayBpZiB0aGVyZSBhcmUgcGVuZGluZ1xuICAvLyB1cGRhdGVzIG9yIGNvbnRleHQuXG4gIHZhciB1cGRhdGVMYW5lcyA9IGN1cnJlbnQubGFuZXM7XG5cbiAgaWYgKGluY2x1ZGVzU29tZUxhbmUodXBkYXRlTGFuZXMsIHJlbmRlckxhbmVzKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIE5vIHBlbmRpbmcgdXBkYXRlLCBidXQgYmVjYXVzZSBjb250ZXh0IGlzIHByb3BhZ2F0ZWQgbGF6aWx5LCB3ZSBuZWVkXG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBhdHRlbXB0RWFybHlCYWlsb3V0SWZOb1NjaGVkdWxlZFVwZGF0ZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVGhpcyBmaWJlciBkb2VzIG5vdCBoYXZlIGFueSBwZW5kaW5nIHdvcmsuIEJhaWxvdXQgd2l0aG91dCBlbnRlcmluZ1xuICAvLyB0aGUgYmVnaW4gcGhhc2UuIFRoZXJlJ3Mgc3RpbGwgc29tZSBib29ra2VlcGluZyB3ZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmVcbiAgLy8gaW4gdGhpcyBvcHRpbWl6ZWQgcGF0aCwgbW9zdGx5IHB1c2hpbmcgc3R1ZmYgb250byB0aGUgc3RhY2suXG4gIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHB1c2hIb3N0Um9vdENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgdmFyIHJvb3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgICAgIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgcHVzaEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIENvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG5cbiAgICAgICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgICAgICBwdXNoQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgcHVzaEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICB7XG4gICAgICAgIHZhciBuZXdWYWx1ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMudmFsdWU7XG4gICAgICAgIHZhciBjb250ZXh0ID0gd29ya0luUHJvZ3Jlc3MudHlwZS5fY29udGV4dDtcbiAgICAgICAgcHVzaFByb3ZpZGVyKHdvcmtJblByb2dyZXNzLCBjb250ZXh0LCBuZXdWYWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBQcm9maWxlcjpcbiAgICAgIHtcbiAgICAgICAgLy8gUHJvZmlsZXIgc2hvdWxkIG9ubHkgY2FsbCBvblJlbmRlciB3aGVuIG9uZSBvZiBpdHMgZGVzY2VuZGFudHMgYWN0dWFsbHkgcmVuZGVyZWQuXG4gICAgICAgIHZhciBoYXNDaGlsZFdvcmsgPSBpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzKTtcblxuICAgICAgICBpZiAoaGFzQ2hpbGRXb3JrKSB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAge1xuICAgICAgICAgIC8vIFJlc2V0IGVmZmVjdCBkdXJhdGlvbnMgZm9yIHRoZSBuZXh0IGV2ZW50dWFsIGVmZmVjdCBwaGFzZS5cbiAgICAgICAgICAvLyBUaGVzZSBhcmUgcmVzZXQgZHVyaW5nIHJlbmRlciB0byBhbGxvdyB0aGUgRGV2VG9vbHMgY29tbWl0IGhvb2sgYSBjaGFuY2UgdG8gcmVhZCB0aGVtLFxuICAgICAgICAgIHZhciBzdGF0ZU5vZGUgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgICAgICAgc3RhdGVOb2RlLmVmZmVjdER1cmF0aW9uID0gMDtcbiAgICAgICAgICBzdGF0ZU5vZGUucGFzc2l2ZUVmZmVjdER1cmF0aW9uID0gMDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBzdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgaWYgKHN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKHN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHNldERlZmF1bHRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudCkpOyAvLyBXZSBrbm93IHRoYXQgdGhpcyBjb21wb25lbnQgd2lsbCBzdXNwZW5kIGFnYWluIGJlY2F1c2UgaWYgaXQgaGFzXG4gICAgICAgICAgICAvLyBiZWVuIHVuc3VzcGVuZGVkIGl0IGhhcyBjb21taXR0ZWQgYXMgYSByZXNvbHZlZCBTdXNwZW5zZSBjb21wb25lbnQuXG4gICAgICAgICAgICAvLyBJZiBpdCBuZWVkcyB0byBiZSByZXRyaWVkLCBpdCBzaG91bGQgaGF2ZSB3b3JrIHNjaGVkdWxlZCBvbiBpdC5cblxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTsgLy8gV2Ugc2hvdWxkIG5ldmVyIHJlbmRlciB0aGUgY2hpbGRyZW4gb2YgYSBkZWh5ZHJhdGVkIGJvdW5kYXJ5IHVudGlsIHdlXG4gICAgICAgICAgICAvLyB1cGdyYWRlIGl0LiBXZSByZXR1cm4gbnVsbCBpbnN0ZWFkIG9mIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsuXG5cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH0gLy8gSWYgdGhpcyBib3VuZGFyeSBpcyBjdXJyZW50bHkgdGltZWQgb3V0LCB3ZSBuZWVkIHRvIGRlY2lkZVxuICAgICAgICAgIC8vIHdoZXRoZXIgdG8gcmV0cnkgdGhlIHByaW1hcnkgY2hpbGRyZW4sIG9yIHRvIHNraXAgb3ZlciBpdCBhbmRcbiAgICAgICAgICAvLyBnbyBzdHJhaWdodCB0byB0aGUgZmFsbGJhY2suIENoZWNrIHRoZSBwcmlvcml0eSBvZiB0aGUgcHJpbWFyeVxuICAgICAgICAgIC8vIGNoaWxkIGZyYWdtZW50LlxuXG5cbiAgICAgICAgICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgICB2YXIgcHJpbWFyeUNoaWxkTGFuZXMgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudC5jaGlsZExhbmVzO1xuXG4gICAgICAgICAgaWYgKGluY2x1ZGVzU29tZUxhbmUocmVuZGVyTGFuZXMsIHByaW1hcnlDaGlsZExhbmVzKSkge1xuICAgICAgICAgICAgLy8gVGhlIHByaW1hcnkgY2hpbGRyZW4gaGF2ZSBwZW5kaW5nIHdvcmsuIFVzZSB0aGUgbm9ybWFsIHBhdGhcbiAgICAgICAgICAgIC8vIHRvIGF0dGVtcHQgdG8gcmVuZGVyIHRoZSBwcmltYXJ5IGNoaWxkcmVuIGFnYWluLlxuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFRoZSBwcmltYXJ5IGNoaWxkIGZyYWdtZW50IGRvZXMgbm90IGhhdmUgcGVuZGluZyB3b3JrIG1hcmtlZFxuICAgICAgICAgICAgLy8gb24gaXRcbiAgICAgICAgICAgIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHNldERlZmF1bHRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudCkpOyAvLyBUaGUgcHJpbWFyeSBjaGlsZHJlbiBkbyBub3QgaGF2ZSBwZW5kaW5nIHdvcmsgd2l0aCBzdWZmaWNpZW50XG4gICAgICAgICAgICAvLyBwcmlvcml0eS4gQmFpbG91dC5cblxuICAgICAgICAgICAgdmFyIGNoaWxkID0gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgICAgICAgICBpZiAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gVGhlIGZhbGxiYWNrIGNoaWxkcmVuIGhhdmUgcGVuZGluZyB3b3JrLiBTa2lwIG92ZXIgdGhlXG4gICAgICAgICAgICAgIC8vIHByaW1hcnkgY2hpbGRyZW4gYW5kIHdvcmsgb24gdGhlIGZhbGxiYWNrLlxuICAgICAgICAgICAgICByZXR1cm4gY2hpbGQuc2libGluZztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIE5vdGU6IFdlIGNhbiByZXR1cm4gYG51bGxgIGhlcmUgYmVjYXVzZSB3ZSBhbHJlYWR5IGNoZWNrZWRcbiAgICAgICAgICAgICAgLy8gd2hldGhlciB0aGVyZSB3ZXJlIG5lc3RlZCBjb250ZXh0IGNvbnN1bWVycywgdmlhIHRoZSBjYWxsIHRvXG4gICAgICAgICAgICAgIC8vIGBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrYCBhYm92ZS5cbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHNldERlZmF1bHRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGRpZFN1c3BlbmRCZWZvcmUgPSAoY3VycmVudC5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzO1xuXG4gICAgICAgIHZhciBfaGFzQ2hpbGRXb3JrID0gaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyk7XG5cbiAgICAgICAgaWYgKGRpZFN1c3BlbmRCZWZvcmUpIHtcbiAgICAgICAgICBpZiAoX2hhc0NoaWxkV29yaykge1xuICAgICAgICAgICAgLy8gSWYgc29tZXRoaW5nIHdhcyBpbiBmYWxsYmFjayBzdGF0ZSBsYXN0IHRpbWUsIGFuZCB3ZSBoYXZlIGFsbCB0aGVcbiAgICAgICAgICAgIC8vIHNhbWUgY2hpbGRyZW4gdGhlbiB3ZSdyZSBzdGlsbCBpbiBwcm9ncmVzc2l2ZSBsb2FkaW5nIHN0YXRlLlxuICAgICAgICAgICAgLy8gU29tZXRoaW5nIG1pZ2h0IGdldCB1bmJsb2NrZWQgYnkgc3RhdGUgdXBkYXRlcyBvciByZXRyaWVzIGluIHRoZVxuICAgICAgICAgICAgLy8gdHJlZSB3aGljaCB3aWxsIGFmZmVjdCB0aGUgdGFpbC4gU28gd2UgbmVlZCB0byB1c2UgdGhlIG5vcm1hbFxuICAgICAgICAgICAgLy8gcGF0aCB0byBjb21wdXRlIHRoZSBjb3JyZWN0IHRhaWwuXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlU3VzcGVuc2VMaXN0Q29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgICAgfSAvLyBJZiBub25lIG9mIHRoZSBjaGlsZHJlbiBoYWQgYW55IHdvcmssIHRoYXQgbWVhbnMgdGhhdCBub25lIG9mXG4gICAgICAgICAgLy8gdGhlbSBnb3QgcmV0cmllZCBzbyB0aGV5J2xsIHN0aWxsIGJlIGJsb2NrZWQgaW4gdGhlIHNhbWUgd2F5XG4gICAgICAgICAgLy8gYXMgYmVmb3JlLiBXZSBjYW4gZmFzdCBiYWlsIG91dC5cblxuXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgfSAvLyBJZiBub3RoaW5nIHN1c3BlbmRlZCBiZWZvcmUgYW5kIHdlJ3JlIHJlbmRlcmluZyB0aGUgc2FtZSBjaGlsZHJlbixcbiAgICAgICAgLy8gdGhlbiB0aGUgdGFpbCBkb2Vzbid0IG1hdHRlci4gQW55dGhpbmcgbmV3IHRoYXQgc3VzcGVuZHMgd2lsbCB3b3JrXG4gICAgICAgIC8vIGluIHRoZSBcInRvZ2V0aGVyXCIgbW9kZSwgc28gd2UgY2FuIGNvbnRpbnVlIGZyb20gdGhlIHN0YXRlIHdlIGhhZC5cblxuXG4gICAgICAgIHZhciByZW5kZXJTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgaWYgKHJlbmRlclN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gUmVzZXQgdG8gdGhlIFwidG9nZXRoZXJcIiBtb2RlIGluIGNhc2Ugd2UndmUgc3RhcnRlZCBhIGRpZmZlcmVudFxuICAgICAgICAgIC8vIHVwZGF0ZSBpbiB0aGUgcGFzdCBidXQgZGlkbid0IGNvbXBsZXRlIGl0LlxuICAgICAgICAgIHJlbmRlclN0YXRlLnJlbmRlcmluZyA9IG51bGw7XG4gICAgICAgICAgcmVuZGVyU3RhdGUudGFpbCA9IG51bGw7XG4gICAgICAgICAgcmVuZGVyU3RhdGUubGFzdEVmZmVjdCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQpO1xuXG4gICAgICAgIGlmIChfaGFzQ2hpbGRXb3JrKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gSWYgbm9uZSBvZiB0aGUgY2hpbGRyZW4gaGFkIGFueSB3b3JrLCB0aGF0IG1lYW5zIHRoYXQgbm9uZSBvZlxuICAgICAgICAgIC8vIHRoZW0gZ290IHJldHJpZWQgc28gdGhleSdsbCBzdGlsbCBiZSBibG9ja2VkIGluIHRoZSBzYW1lIHdheVxuICAgICAgICAgIC8vIGFzIGJlZm9yZS4gV2UgY2FuIGZhc3QgYmFpbCBvdXQuXG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgIGNhc2UgTGVnYWN5SGlkZGVuQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICAvLyBOZWVkIHRvIGNoZWNrIGlmIHRoZSB0cmVlIHN0aWxsIG5lZWRzIHRvIGJlIGRlZmVycmVkLiBUaGlzIGlzXG4gICAgICAgIC8vIGFsbW9zdCBpZGVudGljYWwgdG8gdGhlIGxvZ2ljIHVzZWQgaW4gdGhlIG5vcm1hbCB1cGRhdGUgcGF0aCxcbiAgICAgICAgLy8gc28gd2UnbGwganVzdCBlbnRlciB0aGF0LiBUaGUgb25seSBkaWZmZXJlbmNlIGlzIHdlJ2xsIGJhaWwgb3V0XG4gICAgICAgIC8vIGF0IHRoZSBuZXh0IGxldmVsIGluc3RlYWQgb2YgdGhpcyBvbmUsIGJlY2F1c2UgdGhlIGNoaWxkIHByb3BzXG4gICAgICAgIC8vIGhhdmUgbm90IGNoYW5nZWQuIFdoaWNoIGlzIGZpbmUuXG4gICAgICAgIC8vIFRPRE86IFByb2JhYmx5IHNob3VsZCByZWZhY3RvciBgYmVnaW5Xb3JrYCB0byBzcGxpdCB0aGUgYmFpbG91dFxuICAgICAgICAvLyBwYXRoIGZyb20gdGhlIG5vcm1hbCBwYXRoLiBJJ20gdGVtcHRlZCB0byBkbyBhIGxhYmVsZWQgYnJlYWsgaGVyZVxuICAgICAgICAvLyBidXQgSSB3b24ndCA6KVxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IE5vTGFuZXM7XG4gICAgICAgIHJldHVybiB1cGRhdGVPZmZzY3JlZW5Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cbiAgfVxuXG4gIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG59XG5cbmZ1bmN0aW9uIGJlZ2luV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAge1xuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5fZGVidWdOZWVkc1JlbW91bnQgJiYgY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyB3aWxsIHJlc3RhcnQgdGhlIGJlZ2luIHBoYXNlIHdpdGggYSBuZXcgZmliZXIuXG4gICAgICByZXR1cm4gcmVtb3VudEZpYmVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBjcmVhdGVGaWJlckZyb21UeXBlQW5kUHJvcHMod29ya0luUHJvZ3Jlc3MudHlwZSwgd29ya0luUHJvZ3Jlc3Mua2V5LCB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMsIHdvcmtJblByb2dyZXNzLl9kZWJ1Z093bmVyIHx8IG51bGwsIHdvcmtJblByb2dyZXNzLm1vZGUsIHdvcmtJblByb2dyZXNzLmxhbmVzKSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICB2YXIgb2xkUHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gICAgdmFyIG5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuXG4gICAgaWYgKG9sZFByb3BzICE9PSBuZXdQcm9wcyB8fCBoYXNDb250ZXh0Q2hhbmdlZCgpIHx8ICggLy8gRm9yY2UgYSByZS1yZW5kZXIgaWYgdGhlIGltcGxlbWVudGF0aW9uIGNoYW5nZWQgZHVlIHRvIGhvdCByZWxvYWQ6XG4gICAgIHdvcmtJblByb2dyZXNzLnR5cGUgIT09IGN1cnJlbnQudHlwZSApKSB7XG4gICAgICAvLyBJZiBwcm9wcyBvciBjb250ZXh0IGNoYW5nZWQsIG1hcmsgdGhlIGZpYmVyIGFzIGhhdmluZyBwZXJmb3JtZWQgd29yay5cbiAgICAgIC8vIFRoaXMgbWF5IGJlIHVuc2V0IGlmIHRoZSBwcm9wcyBhcmUgZGV0ZXJtaW5lZCB0byBiZSBlcXVhbCBsYXRlciAobWVtbykuXG4gICAgICBkaWRSZWNlaXZlVXBkYXRlID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTmVpdGhlciBwcm9wcyBub3IgbGVnYWN5IGNvbnRleHQgY2hhbmdlcy4gQ2hlY2sgaWYgdGhlcmUncyBhIHBlbmRpbmdcbiAgICAgIC8vIHVwZGF0ZSBvciBjb250ZXh0IGNoYW5nZS5cbiAgICAgIHZhciBoYXNTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQgPSBjaGVja1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dChjdXJyZW50LCByZW5kZXJMYW5lcyk7XG5cbiAgICAgIGlmICghaGFzU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0ICYmIC8vIElmIHRoaXMgaXMgdGhlIHNlY29uZCBwYXNzIG9mIGFuIGVycm9yIG9yIHN1c3BlbnNlIGJvdW5kYXJ5LCB0aGVyZVxuICAgICAgLy8gbWF5IG5vdCBiZSB3b3JrIHNjaGVkdWxlZCBvbiBgY3VycmVudGAsIHNvIHdlIGNoZWNrIGZvciB0aGlzIGZsYWcuXG4gICAgICAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gTm9GbGFncykge1xuICAgICAgICAvLyBObyBwZW5kaW5nIHVwZGF0ZXMgb3IgY29udGV4dC4gQmFpbCBvdXQgbm93LlxuICAgICAgICBkaWRSZWNlaXZlVXBkYXRlID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBhdHRlbXB0RWFybHlCYWlsb3V0SWZOb1NjaGVkdWxlZFVwZGF0ZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoKGN1cnJlbnQuZmxhZ3MgJiBGb3JjZVVwZGF0ZUZvckxlZ2FjeVN1c3BlbnNlKSAhPT0gTm9GbGFncykge1xuICAgICAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIHRoYXQgb25seSBleGlzdHMgZm9yIGxlZ2FjeSBtb2RlLlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTkyMTYuXG4gICAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQW4gdXBkYXRlIHdhcyBzY2hlZHVsZWQgb24gdGhpcyBmaWJlciwgYnV0IHRoZXJlIGFyZSBubyBuZXcgcHJvcHNcbiAgICAgICAgLy8gbm9yIGxlZ2FjeSBjb250ZXh0LiBTZXQgdGhpcyB0byBmYWxzZS4gSWYgYW4gdXBkYXRlIHF1ZXVlIG9yIGNvbnRleHRcbiAgICAgICAgLy8gY29uc3VtZXIgcHJvZHVjZXMgYSBjaGFuZ2VkIHZhbHVlLCBpdCB3aWxsIHNldCB0aGlzIHRvIHRydWUuIE90aGVyd2lzZSxcbiAgICAgICAgLy8gdGhlIGNvbXBvbmVudCB3aWxsIGFzc3VtZSB0aGUgY2hpbGRyZW4gaGF2ZSBub3QgY2hhbmdlZCBhbmQgYmFpbCBvdXQuXG4gICAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IGZhbHNlO1xuXG4gICAgaWYgKGdldElzSHlkcmF0aW5nKCkgJiYgaXNGb3JrZWRDaGlsZCh3b3JrSW5Qcm9ncmVzcykpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgY2hpbGQgYmVsb25ncyB0byBhIGxpc3Qgb2YgbXVsaXBsZSBjaGlsZHJlbiBpblxuICAgICAgLy8gaXRzIHBhcmVudC5cbiAgICAgIC8vXG4gICAgICAvLyBJbiBhIHRydWUgbXVsdGktdGhyZWFkZWQgaW1wbGVtZW50YXRpb24sIHdlIHdvdWxkIHJlbmRlciBjaGlsZHJlbiBvblxuICAgICAgLy8gcGFyYWxsZWwgdGhyZWFkcy4gVGhpcyB3b3VsZCByZXByZXNlbnQgdGhlIGJlZ2lubmluZyBvZiBhIG5ldyByZW5kZXJcbiAgICAgIC8vIHRocmVhZCBmb3IgdGhpcyBzdWJ0cmVlLlxuICAgICAgLy9cbiAgICAgIC8vIFdlIG9ubHkgdXNlIHRoaXMgZm9yIGlkIGdlbmVyYXRpb24gZHVyaW5nIGh5ZHJhdGlvbiwgd2hpY2ggaXMgd2h5IHRoZVxuICAgICAgLy8gbG9naWMgaXMgbG9jYXRlZCBpbiB0aGlzIHNwZWNpYWwgYnJhbmNoLlxuICAgICAgdmFyIHNsb3RJbmRleCA9IHdvcmtJblByb2dyZXNzLmluZGV4O1xuICAgICAgdmFyIG51bWJlck9mRm9ya3MgPSBnZXRGb3Jrc0F0TGV2ZWwoKTtcbiAgICAgIHB1c2hUcmVlSWQod29ya0luUHJvZ3Jlc3MsIG51bWJlck9mRm9ya3MsIHNsb3RJbmRleCk7XG4gICAgfVxuICB9IC8vIEJlZm9yZSBlbnRlcmluZyB0aGUgYmVnaW4gcGhhc2UsIGNsZWFyIHBlbmRpbmcgdXBkYXRlIHByaW9yaXR5LlxuICAvLyBUT0RPOiBUaGlzIGFzc3VtZXMgdGhhdCB3ZSdyZSBhYm91dCB0byBldmFsdWF0ZSB0aGUgY29tcG9uZW50IGFuZCBwcm9jZXNzXG4gIC8vIHRoZSB1cGRhdGUgcXVldWUuIEhvd2V2ZXIsIHRoZXJlJ3MgYW4gZXhjZXB0aW9uOiBTaW1wbGVNZW1vQ29tcG9uZW50XG4gIC8vIHNvbWV0aW1lcyBiYWlscyBvdXQgbGF0ZXIgaW4gdGhlIGJlZ2luIHBoYXNlLiBUaGlzIGluZGljYXRlcyB0aGF0IHdlIHNob3VsZFxuICAvLyBtb3ZlIHRoaXMgYXNzaWdubWVudCBvdXQgb2YgdGhlIGNvbW1vbiBwYXRoIGFuZCBpbnRvIGVhY2ggYnJhbmNoLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBOb0xhbmVzO1xuXG4gIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgY2FzZSBJbmRldGVybWluYXRlQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZXR1cm4gbW91bnRJbmRldGVybWluYXRlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCB3b3JrSW5Qcm9ncmVzcy50eXBlLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIExhenlDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBlbGVtZW50VHlwZSA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlO1xuICAgICAgICByZXR1cm4gbW91bnRMYXp5Q29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBlbGVtZW50VHlwZSwgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIENvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciB1bnJlc29sdmVkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gICAgICAgIHZhciByZXNvbHZlZFByb3BzID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPT09IENvbXBvbmVudCA/IHVucmVzb2x2ZWRQcm9wcyA6IHJlc29sdmVEZWZhdWx0UHJvcHMoQ29tcG9uZW50LCB1bnJlc29sdmVkUHJvcHMpO1xuICAgICAgICByZXR1cm4gdXBkYXRlRnVuY3Rpb25Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcmVzb2x2ZWRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9Db21wb25lbnQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICB2YXIgX3VucmVzb2x2ZWRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcblxuICAgICAgICB2YXIgX3Jlc29sdmVkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9PT0gX0NvbXBvbmVudCA/IF91bnJlc29sdmVkUHJvcHMgOiByZXNvbHZlRGVmYXVsdFByb3BzKF9Db21wb25lbnQsIF91bnJlc29sdmVkUHJvcHMpO1xuXG4gICAgICAgIHJldHVybiB1cGRhdGVDbGFzc0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgX0NvbXBvbmVudCwgX3Jlc29sdmVkUHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICByZXR1cm4gdXBkYXRlSG9zdFJvb3QoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHJldHVybiB1cGRhdGVIb3N0Q29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgcmV0dXJuIHVwZGF0ZUhvc3RUZXh0KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICByZXR1cm4gdXBkYXRlU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHJldHVybiB1cGRhdGVQb3J0YWxDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIHtcbiAgICAgICAgdmFyIHR5cGUgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICB2YXIgX3VucmVzb2x2ZWRQcm9wczIgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG5cbiAgICAgICAgdmFyIF9yZXNvbHZlZFByb3BzMiA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID09PSB0eXBlID8gX3VucmVzb2x2ZWRQcm9wczIgOiByZXNvbHZlRGVmYXVsdFByb3BzKHR5cGUsIF91bnJlc29sdmVkUHJvcHMyKTtcblxuICAgICAgICByZXR1cm4gdXBkYXRlRm9yd2FyZFJlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgdHlwZSwgX3Jlc29sdmVkUHJvcHMyLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIEZyYWdtZW50OlxuICAgICAgcmV0dXJuIHVwZGF0ZUZyYWdtZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIE1vZGU6XG4gICAgICByZXR1cm4gdXBkYXRlTW9kZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBQcm9maWxlcjpcbiAgICAgIHJldHVybiB1cGRhdGVQcm9maWxlcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICByZXR1cm4gdXBkYXRlQ29udGV4dFByb3ZpZGVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIENvbnRleHRDb25zdW1lcjpcbiAgICAgIHJldHVybiB1cGRhdGVDb250ZXh0Q29uc3VtZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIF90eXBlMiA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzMyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wczsgLy8gUmVzb2x2ZSBvdXRlciBwcm9wcyBmaXJzdCwgdGhlbiByZXNvbHZlIGlubmVyIHByb3BzLlxuXG4gICAgICAgIHZhciBfcmVzb2x2ZWRQcm9wczMgPSByZXNvbHZlRGVmYXVsdFByb3BzKF90eXBlMiwgX3VucmVzb2x2ZWRQcm9wczMpO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgICAgICAgIHZhciBvdXRlclByb3BUeXBlcyA9IF90eXBlMi5wcm9wVHlwZXM7XG5cbiAgICAgICAgICAgIGlmIChvdXRlclByb3BUeXBlcykge1xuICAgICAgICAgICAgICBjaGVja1Byb3BUeXBlcyhvdXRlclByb3BUeXBlcywgX3Jlc29sdmVkUHJvcHMzLCAvLyBSZXNvbHZlZCBmb3Igb3V0ZXIgb25seVxuICAgICAgICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShfdHlwZTIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBfcmVzb2x2ZWRQcm9wczMgPSByZXNvbHZlRGVmYXVsdFByb3BzKF90eXBlMi50eXBlLCBfcmVzb2x2ZWRQcm9wczMpO1xuICAgICAgICByZXR1cm4gdXBkYXRlTWVtb0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgX3R5cGUyLCBfcmVzb2x2ZWRQcm9wczMsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVNpbXBsZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLnR5cGUsIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBfQ29tcG9uZW50MiA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzNCA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcblxuICAgICAgICB2YXIgX3Jlc29sdmVkUHJvcHM0ID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPT09IF9Db21wb25lbnQyID8gX3VucmVzb2x2ZWRQcm9wczQgOiByZXNvbHZlRGVmYXVsdFByb3BzKF9Db21wb25lbnQyLCBfdW5yZXNvbHZlZFByb3BzNCk7XG5cbiAgICAgICAgcmV0dXJuIG1vdW50SW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfQ29tcG9uZW50MiwgX3Jlc29sdmVkUHJvcHM0LCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVN1c3BlbnNlTGlzdENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBTY29wZUNvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZXR1cm4gdXBkYXRlT2Zmc2NyZWVuQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHVuaXQgb2Ygd29yayB0YWcgKFwiICsgd29ya0luUHJvZ3Jlc3MudGFnICsgXCIpLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gXCIgKyAnUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xufVxuXG5mdW5jdGlvbiBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKSB7XG4gIC8vIFRhZyB0aGUgZmliZXIgd2l0aCBhbiB1cGRhdGUgZWZmZWN0LiBUaGlzIHR1cm5zIGEgUGxhY2VtZW50IGludG9cbiAgLy8gYSBQbGFjZW1lbnRBbmRVcGRhdGUuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbn1cblxuZnVuY3Rpb24gbWFya1JlZiQxKHdvcmtJblByb2dyZXNzKSB7XG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFJlZjtcblxuICB7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUmVmU3RhdGljO1xuICB9XG59XG5cbnZhciBhcHBlbmRBbGxDaGlsZHJlbjtcbnZhciB1cGRhdGVIb3N0Q29udGFpbmVyO1xudmFyIHVwZGF0ZUhvc3RDb21wb25lbnQkMTtcbnZhciB1cGRhdGVIb3N0VGV4dCQxO1xuXG57XG4gIC8vIE11dGF0aW9uIG1vZGVcbiAgYXBwZW5kQWxsQ2hpbGRyZW4gPSBmdW5jdGlvbiAocGFyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmVlZHNWaXNpYmlsaXR5VG9nZ2xlLCBpc0hpZGRlbikge1xuICAgIC8vIFdlIG9ubHkgaGF2ZSB0aGUgdG9wIEZpYmVyIHRoYXQgd2FzIGNyZWF0ZWQgYnV0IHdlIG5lZWQgcmVjdXJzZSBkb3duIGl0c1xuICAgIC8vIGNoaWxkcmVuIHRvIGZpbmQgYWxsIHRoZSB0ZXJtaW5hbCBub2Rlcy5cbiAgICB2YXIgbm9kZSA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuXG4gICAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBub2RlLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAgICAgYXBwZW5kSW5pdGlhbENoaWxkKHBhcmVudCwgbm9kZS5zdGF0ZU5vZGUpO1xuICAgICAgfSBlbHNlIGlmIChub2RlLnRhZyA9PT0gSG9zdFBvcnRhbCkgOyBlbHNlIGlmIChub2RlLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZSA9PT0gd29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gd29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gICAgfVxuICB9O1xuXG4gIHVwZGF0ZUhvc3RDb250YWluZXIgPSBmdW5jdGlvbiAoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHsvLyBOb29wXG4gIH07XG5cbiAgdXBkYXRlSG9zdENvbXBvbmVudCQxID0gZnVuY3Rpb24gKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCB0eXBlLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlKSB7XG4gICAgLy8gSWYgd2UgaGF2ZSBhbiBhbHRlcm5hdGUsIHRoYXQgbWVhbnMgdGhpcyBpcyBhbiB1cGRhdGUgYW5kIHdlIG5lZWQgdG9cbiAgICAvLyBzY2hlZHVsZSBhIHNpZGUtZWZmZWN0IHRvIGRvIHRoZSB1cGRhdGVzLlxuICAgIHZhciBvbGRQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcblxuICAgIGlmIChvbGRQcm9wcyA9PT0gbmV3UHJvcHMpIHtcbiAgICAgIC8vIEluIG11dGF0aW9uIG1vZGUsIHRoaXMgaXMgc3VmZmljaWVudCBmb3IgYSBiYWlsb3V0IGJlY2F1c2VcbiAgICAgIC8vIHdlIHdvbid0IHRvdWNoIHRoaXMgbm9kZSBldmVuIGlmIGNoaWxkcmVuIGNoYW5nZWQuXG4gICAgICByZXR1cm47XG4gICAgfSAvLyBJZiB3ZSBnZXQgdXBkYXRlZCBiZWNhdXNlIG9uZSBvZiBvdXIgY2hpbGRyZW4gdXBkYXRlZCwgd2UgZG9uJ3RcbiAgICAvLyBoYXZlIG5ld1Byb3BzIHNvIHdlJ2xsIGhhdmUgdG8gcmV1c2UgdGhlbS5cbiAgICAvLyBUT0RPOiBTcGxpdCB0aGUgdXBkYXRlIEFQSSBhcyBzZXBhcmF0ZSBmb3IgdGhlIHByb3BzIHZzLiBjaGlsZHJlbi5cbiAgICAvLyBFdmVuIGJldHRlciB3b3VsZCBiZSBpZiBjaGlsZHJlbiB3ZXJlbid0IHNwZWNpYWwgY2FzZWQgYXQgYWxsIHRoby5cblxuXG4gICAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgIHZhciBjdXJyZW50SG9zdENvbnRleHQgPSBnZXRIb3N0Q29udGV4dCgpOyAvLyBUT0RPOiBFeHBlcmllbmNpbmcgYW4gZXJyb3Igd2hlcmUgb2xkUHJvcHMgaXMgbnVsbC4gU3VnZ2VzdHMgYSBob3N0XG4gICAgLy8gY29tcG9uZW50IGlzIGhpdHRpbmcgdGhlIHJlc3VtZSBwYXRoLiBGaWd1cmUgb3V0IHdoeS4gUG9zc2libHlcbiAgICAvLyByZWxhdGVkIHRvIGBoaWRkZW5gLlxuXG4gICAgdmFyIHVwZGF0ZVBheWxvYWQgPSBwcmVwYXJlVXBkYXRlKGluc3RhbmNlLCB0eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgY3VycmVudEhvc3RDb250ZXh0KTsgLy8gVE9ETzogVHlwZSB0aGlzIHNwZWNpZmljIHRvIHRoaXMgdHlwZSBvZiBjb21wb25lbnQuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IHVwZGF0ZVBheWxvYWQ7IC8vIElmIHRoZSB1cGRhdGUgcGF5bG9hZCBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBpcyBhIGNoYW5nZSBvciBpZiB0aGVyZVxuICAgIC8vIGlzIGEgbmV3IHJlZiB3ZSBtYXJrIHRoaXMgYXMgYW4gdXBkYXRlLiBBbGwgdGhlIHdvcmsgaXMgZG9uZSBpbiBjb21taXRXb3JrLlxuXG4gICAgaWYgKHVwZGF0ZVBheWxvYWQpIHtcbiAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgIH1cbiAgfTtcblxuICB1cGRhdGVIb3N0VGV4dCQxID0gZnVuY3Rpb24gKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBvbGRUZXh0LCBuZXdUZXh0KSB7XG4gICAgLy8gSWYgdGhlIHRleHQgZGlmZmVycywgbWFyayBpdCBhcyBhbiB1cGRhdGUuIEFsbCB0aGUgd29yayBpbiBkb25lIGluIGNvbW1pdFdvcmsuXG4gICAgaWYgKG9sZFRleHQgIT09IG5ld1RleHQpIHtcbiAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gY3V0T2ZmVGFpbElmTmVlZGVkKHJlbmRlclN0YXRlLCBoYXNSZW5kZXJlZEFUYWlsRmFsbGJhY2spIHtcbiAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAvLyBJZiB3ZSdyZSBoeWRyYXRpbmcsIHdlIHNob3VsZCBjb25zdW1lIGFzIG1hbnkgaXRlbXMgYXMgd2UgY2FuXG4gICAgLy8gc28gd2UgZG9uJ3QgbGVhdmUgYW55IGJlaGluZC5cbiAgICByZXR1cm47XG4gIH1cblxuICBzd2l0Y2ggKHJlbmRlclN0YXRlLnRhaWxNb2RlKSB7XG4gICAgY2FzZSAnaGlkZGVuJzpcbiAgICAgIHtcbiAgICAgICAgLy8gQW55IGluc2VydGlvbnMgYXQgdGhlIGVuZCBvZiB0aGUgdGFpbCBsaXN0IGFmdGVyIHRoaXMgcG9pbnRcbiAgICAgICAgLy8gc2hvdWxkIGJlIGludmlzaWJsZS4gSWYgdGhlcmUgYXJlIGFscmVhZHkgbW91bnRlZCBib3VuZGFyaWVzXG4gICAgICAgIC8vIGFueXRoaW5nIGJlZm9yZSB0aGVtIGFyZSBub3QgY29uc2lkZXJlZCBmb3IgY29sbGFwc2luZy5cbiAgICAgICAgLy8gVGhlcmVmb3JlIHdlIG5lZWQgdG8gZ28gdGhyb3VnaCB0aGUgd2hvbGUgdGFpbCB0byBmaW5kIGlmXG4gICAgICAgIC8vIHRoZXJlIGFyZSBhbnkuXG4gICAgICAgIHZhciB0YWlsTm9kZSA9IHJlbmRlclN0YXRlLnRhaWw7XG4gICAgICAgIHZhciBsYXN0VGFpbE5vZGUgPSBudWxsO1xuXG4gICAgICAgIHdoaWxlICh0YWlsTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGlmICh0YWlsTm9kZS5hbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGxhc3RUYWlsTm9kZSA9IHRhaWxOb2RlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRhaWxOb2RlID0gdGFpbE5vZGUuc2libGluZztcbiAgICAgICAgfSAvLyBOZXh0IHdlJ3JlIHNpbXBseSBnb2luZyB0byBkZWxldGUgYWxsIGluc2VydGlvbnMgYWZ0ZXIgdGhlXG4gICAgICAgIC8vIGxhc3QgcmVuZGVyZWQgaXRlbS5cblxuXG4gICAgICAgIGlmIChsYXN0VGFpbE5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBBbGwgcmVtYWluaW5nIGl0ZW1zIGluIHRoZSB0YWlsIGFyZSBpbnNlcnRpb25zLlxuICAgICAgICAgIHJlbmRlclN0YXRlLnRhaWwgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIERldGFjaCB0aGUgaW5zZXJ0aW9uIGFmdGVyIHRoZSBsYXN0IG5vZGUgdGhhdCB3YXMgYWxyZWFkeVxuICAgICAgICAgIC8vIGluc2VydGVkLlxuICAgICAgICAgIGxhc3RUYWlsTm9kZS5zaWJsaW5nID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSAnY29sbGFwc2VkJzpcbiAgICAgIHtcbiAgICAgICAgLy8gQW55IGluc2VydGlvbnMgYXQgdGhlIGVuZCBvZiB0aGUgdGFpbCBsaXN0IGFmdGVyIHRoaXMgcG9pbnRcbiAgICAgICAgLy8gc2hvdWxkIGJlIGludmlzaWJsZS4gSWYgdGhlcmUgYXJlIGFscmVhZHkgbW91bnRlZCBib3VuZGFyaWVzXG4gICAgICAgIC8vIGFueXRoaW5nIGJlZm9yZSB0aGVtIGFyZSBub3QgY29uc2lkZXJlZCBmb3IgY29sbGFwc2luZy5cbiAgICAgICAgLy8gVGhlcmVmb3JlIHdlIG5lZWQgdG8gZ28gdGhyb3VnaCB0aGUgd2hvbGUgdGFpbCB0byBmaW5kIGlmXG4gICAgICAgIC8vIHRoZXJlIGFyZSBhbnkuXG4gICAgICAgIHZhciBfdGFpbE5vZGUgPSByZW5kZXJTdGF0ZS50YWlsO1xuICAgICAgICB2YXIgX2xhc3RUYWlsTm9kZSA9IG51bGw7XG5cbiAgICAgICAgd2hpbGUgKF90YWlsTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGlmIChfdGFpbE5vZGUuYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBfbGFzdFRhaWxOb2RlID0gX3RhaWxOb2RlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF90YWlsTm9kZSA9IF90YWlsTm9kZS5zaWJsaW5nO1xuICAgICAgICB9IC8vIE5leHQgd2UncmUgc2ltcGx5IGdvaW5nIHRvIGRlbGV0ZSBhbGwgaW5zZXJ0aW9ucyBhZnRlciB0aGVcbiAgICAgICAgLy8gbGFzdCByZW5kZXJlZCBpdGVtLlxuXG5cbiAgICAgICAgaWYgKF9sYXN0VGFpbE5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBBbGwgcmVtYWluaW5nIGl0ZW1zIGluIHRoZSB0YWlsIGFyZSBpbnNlcnRpb25zLlxuICAgICAgICAgIGlmICghaGFzUmVuZGVyZWRBVGFpbEZhbGxiYWNrICYmIHJlbmRlclN0YXRlLnRhaWwgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFdlIHN1c3BlbmRlZCBkdXJpbmcgdGhlIGhlYWQuIFdlIHdhbnQgdG8gc2hvdyBhdCBsZWFzdCBvbmVcbiAgICAgICAgICAgIC8vIHJvdyBhdCB0aGUgdGFpbC4gU28gd2UnbGwga2VlcCBvbiBhbmQgY3V0IG9mZiB0aGUgcmVzdC5cbiAgICAgICAgICAgIHJlbmRlclN0YXRlLnRhaWwuc2libGluZyA9IG51bGw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlbmRlclN0YXRlLnRhaWwgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBEZXRhY2ggdGhlIGluc2VydGlvbiBhZnRlciB0aGUgbGFzdCBub2RlIHRoYXQgd2FzIGFscmVhZHlcbiAgICAgICAgICAvLyBpbnNlcnRlZC5cbiAgICAgICAgICBfbGFzdFRhaWxOb2RlLnNpYmxpbmcgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYnViYmxlUHJvcGVydGllcyhjb21wbGV0ZWRXb3JrKSB7XG4gIHZhciBkaWRCYWlsb3V0ID0gY29tcGxldGVkV29yay5hbHRlcm5hdGUgIT09IG51bGwgJiYgY29tcGxldGVkV29yay5hbHRlcm5hdGUuY2hpbGQgPT09IGNvbXBsZXRlZFdvcmsuY2hpbGQ7XG4gIHZhciBuZXdDaGlsZExhbmVzID0gTm9MYW5lcztcbiAgdmFyIHN1YnRyZWVGbGFncyA9IE5vRmxhZ3M7XG5cbiAgaWYgKCFkaWRCYWlsb3V0KSB7XG4gICAgLy8gQnViYmxlIHVwIHRoZSBlYXJsaWVzdCBleHBpcmF0aW9uIHRpbWUuXG4gICAgaWYgKCAoY29tcGxldGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgIC8vIEluIHByb2ZpbGluZyBtb2RlLCByZXNldENoaWxkRXhwaXJhdGlvblRpbWUgaXMgYWxzbyB1c2VkIHRvIHJlc2V0XG4gICAgICAvLyBwcm9maWxlciBkdXJhdGlvbnMuXG4gICAgICB2YXIgYWN0dWFsRHVyYXRpb24gPSBjb21wbGV0ZWRXb3JrLmFjdHVhbER1cmF0aW9uO1xuICAgICAgdmFyIHRyZWVCYXNlRHVyYXRpb24gPSBjb21wbGV0ZWRXb3JrLnNlbGZCYXNlRHVyYXRpb247XG4gICAgICB2YXIgY2hpbGQgPSBjb21wbGV0ZWRXb3JrLmNoaWxkO1xuXG4gICAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbmV3Q2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMobmV3Q2hpbGRMYW5lcywgbWVyZ2VMYW5lcyhjaGlsZC5sYW5lcywgY2hpbGQuY2hpbGRMYW5lcykpO1xuICAgICAgICBzdWJ0cmVlRmxhZ3MgfD0gY2hpbGQuc3VidHJlZUZsYWdzO1xuICAgICAgICBzdWJ0cmVlRmxhZ3MgfD0gY2hpbGQuZmxhZ3M7IC8vIFdoZW4gYSBmaWJlciBpcyBjbG9uZWQsIGl0cyBhY3R1YWxEdXJhdGlvbiBpcyByZXNldCB0byAwLiBUaGlzIHZhbHVlIHdpbGxcbiAgICAgICAgLy8gb25seSBiZSB1cGRhdGVkIGlmIHdvcmsgaXMgZG9uZSBvbiB0aGUgZmliZXIgKGkuZS4gaXQgZG9lc24ndCBiYWlsb3V0KS5cbiAgICAgICAgLy8gV2hlbiB3b3JrIGlzIGRvbmUsIGl0IHNob3VsZCBidWJibGUgdG8gdGhlIHBhcmVudCdzIGFjdHVhbER1cmF0aW9uLiBJZlxuICAgICAgICAvLyB0aGUgZmliZXIgaGFzIG5vdCBiZWVuIGNsb25lZCB0aG91Z2gsIChtZWFuaW5nIG5vIHdvcmsgd2FzIGRvbmUpLCB0aGVuXG4gICAgICAgIC8vIHRoaXMgdmFsdWUgd2lsbCByZWZsZWN0IHRoZSBhbW91bnQgb2YgdGltZSBzcGVudCB3b3JraW5nIG9uIGEgcHJldmlvdXNcbiAgICAgICAgLy8gcmVuZGVyLiBJbiB0aGF0IGNhc2UgaXQgc2hvdWxkIG5vdCBidWJibGUuIFdlIGRldGVybWluZSB3aGV0aGVyIGl0IHdhc1xuICAgICAgICAvLyBjbG9uZWQgYnkgY29tcGFyaW5nIHRoZSBjaGlsZCBwb2ludGVyLlxuXG4gICAgICAgIGFjdHVhbER1cmF0aW9uICs9IGNoaWxkLmFjdHVhbER1cmF0aW9uO1xuICAgICAgICB0cmVlQmFzZUR1cmF0aW9uICs9IGNoaWxkLnRyZWVCYXNlRHVyYXRpb247XG4gICAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICAgIH1cblxuICAgICAgY29tcGxldGVkV29yay5hY3R1YWxEdXJhdGlvbiA9IGFjdHVhbER1cmF0aW9uO1xuICAgICAgY29tcGxldGVkV29yay50cmVlQmFzZUR1cmF0aW9uID0gdHJlZUJhc2VEdXJhdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIF9jaGlsZCA9IGNvbXBsZXRlZFdvcmsuY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChfY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbmV3Q2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMobmV3Q2hpbGRMYW5lcywgbWVyZ2VMYW5lcyhfY2hpbGQubGFuZXMsIF9jaGlsZC5jaGlsZExhbmVzKSk7XG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBfY2hpbGQuc3VidHJlZUZsYWdzO1xuICAgICAgICBzdWJ0cmVlRmxhZ3MgfD0gX2NoaWxkLmZsYWdzOyAvLyBVcGRhdGUgdGhlIHJldHVybiBwb2ludGVyIHNvIHRoZSB0cmVlIGlzIGNvbnNpc3RlbnQuIFRoaXMgaXMgYSBjb2RlXG4gICAgICAgIC8vIHNtZWxsIGJlY2F1c2UgaXQgYXNzdW1lcyB0aGUgY29tbWl0IHBoYXNlIGlzIG5ldmVyIGNvbmN1cnJlbnQgd2l0aFxuICAgICAgICAvLyB0aGUgcmVuZGVyIHBoYXNlLiBXaWxsIGFkZHJlc3MgZHVyaW5nIHJlZmFjdG9yIHRvIGFsdGVybmF0ZSBtb2RlbC5cblxuICAgICAgICBfY2hpbGQucmV0dXJuID0gY29tcGxldGVkV29yaztcbiAgICAgICAgX2NoaWxkID0gX2NoaWxkLnNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29tcGxldGVkV29yay5zdWJ0cmVlRmxhZ3MgfD0gc3VidHJlZUZsYWdzO1xuICB9IGVsc2Uge1xuICAgIC8vIEJ1YmJsZSB1cCB0aGUgZWFybGllc3QgZXhwaXJhdGlvbiB0aW1lLlxuICAgIGlmICggKGNvbXBsZXRlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAvLyBJbiBwcm9maWxpbmcgbW9kZSwgcmVzZXRDaGlsZEV4cGlyYXRpb25UaW1lIGlzIGFsc28gdXNlZCB0byByZXNldFxuICAgICAgLy8gcHJvZmlsZXIgZHVyYXRpb25zLlxuICAgICAgdmFyIF90cmVlQmFzZUR1cmF0aW9uID0gY29tcGxldGVkV29yay5zZWxmQmFzZUR1cmF0aW9uO1xuICAgICAgdmFyIF9jaGlsZDIgPSBjb21wbGV0ZWRXb3JrLmNoaWxkO1xuXG4gICAgICB3aGlsZSAoX2NoaWxkMiAhPT0gbnVsbCkge1xuICAgICAgICBuZXdDaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhuZXdDaGlsZExhbmVzLCBtZXJnZUxhbmVzKF9jaGlsZDIubGFuZXMsIF9jaGlsZDIuY2hpbGRMYW5lcykpOyAvLyBcIlN0YXRpY1wiIGZsYWdzIHNoYXJlIHRoZSBsaWZldGltZSBvZiB0aGUgZmliZXIvaG9vayB0aGV5IGJlbG9uZyB0byxcbiAgICAgICAgLy8gc28gd2Ugc2hvdWxkIGJ1YmJsZSB0aG9zZSB1cCBldmVuIGR1cmluZyBhIGJhaWxvdXQuIEFsbCB0aGUgb3RoZXJcbiAgICAgICAgLy8gZmxhZ3MgaGF2ZSBhIGxpZmV0aW1lIG9ubHkgb2YgYSBzaW5nbGUgcmVuZGVyICsgY29tbWl0LCBzbyB3ZSBzaG91bGRcbiAgICAgICAgLy8gaWdub3JlIHRoZW0uXG5cbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IF9jaGlsZDIuc3VidHJlZUZsYWdzICYgU3RhdGljTWFzaztcbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IF9jaGlsZDIuZmxhZ3MgJiBTdGF0aWNNYXNrO1xuICAgICAgICBfdHJlZUJhc2VEdXJhdGlvbiArPSBfY2hpbGQyLnRyZWVCYXNlRHVyYXRpb247XG4gICAgICAgIF9jaGlsZDIgPSBfY2hpbGQyLnNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIGNvbXBsZXRlZFdvcmsudHJlZUJhc2VEdXJhdGlvbiA9IF90cmVlQmFzZUR1cmF0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX2NoaWxkMyA9IGNvbXBsZXRlZFdvcmsuY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChfY2hpbGQzICE9PSBudWxsKSB7XG4gICAgICAgIG5ld0NoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKG5ld0NoaWxkTGFuZXMsIG1lcmdlTGFuZXMoX2NoaWxkMy5sYW5lcywgX2NoaWxkMy5jaGlsZExhbmVzKSk7IC8vIFwiU3RhdGljXCIgZmxhZ3Mgc2hhcmUgdGhlIGxpZmV0aW1lIG9mIHRoZSBmaWJlci9ob29rIHRoZXkgYmVsb25nIHRvLFxuICAgICAgICAvLyBzbyB3ZSBzaG91bGQgYnViYmxlIHRob3NlIHVwIGV2ZW4gZHVyaW5nIGEgYmFpbG91dC4gQWxsIHRoZSBvdGhlclxuICAgICAgICAvLyBmbGFncyBoYXZlIGEgbGlmZXRpbWUgb25seSBvZiBhIHNpbmdsZSByZW5kZXIgKyBjb21taXQsIHNvIHdlIHNob3VsZFxuICAgICAgICAvLyBpZ25vcmUgdGhlbS5cblxuICAgICAgICBzdWJ0cmVlRmxhZ3MgfD0gX2NoaWxkMy5zdWJ0cmVlRmxhZ3MgJiBTdGF0aWNNYXNrO1xuICAgICAgICBzdWJ0cmVlRmxhZ3MgfD0gX2NoaWxkMy5mbGFncyAmIFN0YXRpY01hc2s7IC8vIFVwZGF0ZSB0aGUgcmV0dXJuIHBvaW50ZXIgc28gdGhlIHRyZWUgaXMgY29uc2lzdGVudC4gVGhpcyBpcyBhIGNvZGVcbiAgICAgICAgLy8gc21lbGwgYmVjYXVzZSBpdCBhc3N1bWVzIHRoZSBjb21taXQgcGhhc2UgaXMgbmV2ZXIgY29uY3VycmVudCB3aXRoXG4gICAgICAgIC8vIHRoZSByZW5kZXIgcGhhc2UuIFdpbGwgYWRkcmVzcyBkdXJpbmcgcmVmYWN0b3IgdG8gYWx0ZXJuYXRlIG1vZGVsLlxuXG4gICAgICAgIF9jaGlsZDMucmV0dXJuID0gY29tcGxldGVkV29yaztcbiAgICAgICAgX2NoaWxkMyA9IF9jaGlsZDMuc2libGluZztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wbGV0ZWRXb3JrLnN1YnRyZWVGbGFncyB8PSBzdWJ0cmVlRmxhZ3M7XG4gIH1cblxuICBjb21wbGV0ZWRXb3JrLmNoaWxkTGFuZXMgPSBuZXdDaGlsZExhbmVzO1xuICByZXR1cm4gZGlkQmFpbG91dDtcbn1cblxuZnVuY3Rpb24gY29tcGxldGVEZWh5ZHJhdGVkU3VzcGVuc2VCb3VuZGFyeShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dFN0YXRlKSB7XG4gIGlmIChoYXNVbmh5ZHJhdGVkVGFpbE5vZGVzKCkgJiYgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSAmJiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gTm9GbGFncykge1xuICAgIHdhcm5JZlVuaHlkcmF0ZWRUYWlsTm9kZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBGb3JjZUNsaWVudFJlbmRlciB8IEluY29tcGxldGUgfCBTaG91bGRDYXB0dXJlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciB3YXNIeWRyYXRlZCA9IHBvcEh5ZHJhdGlvblN0YXRlKHdvcmtJblByb2dyZXNzKTtcblxuICBpZiAobmV4dFN0YXRlICE9PSBudWxsICYmIG5leHRTdGF0ZS5kZWh5ZHJhdGVkICE9PSBudWxsKSB7XG4gICAgLy8gV2UgbWlnaHQgYmUgaW5zaWRlIGEgaHlkcmF0aW9uIHN0YXRlIHRoZSBmaXJzdCB0aW1lIHdlJ3JlIHBpY2tpbmcgdXAgdGhpc1xuICAgIC8vIFN1c3BlbnNlIGJvdW5kYXJ5LCBhbmQgYWxzbyBhZnRlciB3ZSd2ZSByZWVudGVyZWQgaXQgZm9yIGZ1cnRoZXIgaHlkcmF0aW9uLlxuICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICBpZiAoIXdhc0h5ZHJhdGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQSBkZWh5ZHJhdGVkIHN1c3BlbnNlIGNvbXBvbmVudCB3YXMgY29tcGxldGVkIHdpdGhvdXQgYSBoeWRyYXRlZCBub2RlLiAnICsgJ1RoaXMgaXMgcHJvYmFibHkgYSBidWcgaW4gUmVhY3QuJyk7XG4gICAgICB9XG5cbiAgICAgIHByZXBhcmVUb0h5ZHJhdGVIb3N0U3VzcGVuc2VJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAge1xuICAgICAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgIHZhciBpc1RpbWVkT3V0U3VzcGVuc2UgPSBuZXh0U3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgICBpZiAoaXNUaW1lZE91dFN1c3BlbnNlKSB7XG4gICAgICAgICAgICAvLyBEb24ndCBjb3VudCB0aW1lIHNwZW50IGluIGEgdGltZWQgb3V0IFN1c3BlbnNlIHN1YnRyZWUgYXMgcGFydCBvZiB0aGUgYmFzZSBkdXJhdGlvbi5cbiAgICAgICAgICAgIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuXG4gICAgICAgICAgICBpZiAocHJpbWFyeUNoaWxkRnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gJEZsb3dGaXhNZSBGbG93IGRvZXNuJ3Qgc3VwcG9ydCB0eXBlIGNhc3RpbmcgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgLT0gb3BlcmF0b3JcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiAtPSBwcmltYXJ5Q2hpbGRGcmFnbWVudC50cmVlQmFzZUR1cmF0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFdlIG1pZ2h0IGhhdmUgcmVlbnRlcmVkIHRoaXMgYm91bmRhcnkgdG8gaHlkcmF0ZSBpdC4gSWYgc28sIHdlIG5lZWQgdG8gcmVzZXQgdGhlIGh5ZHJhdGlvblxuICAgICAgLy8gc3RhdGUgc2luY2Ugd2UncmUgbm93IGV4aXRpbmcgb3V0IG9mIGl0LiBwb3BIeWRyYXRpb25TdGF0ZSBkb2Vzbid0IGRvIHRoYXQgZm9yIHVzLlxuICAgICAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuXG4gICAgICBpZiAoKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IE5vRmxhZ3MpIHtcbiAgICAgICAgLy8gVGhpcyBib3VuZGFyeSBkaWQgbm90IHN1c3BlbmQgc28gaXQncyBub3cgaHlkcmF0ZWQgYW5kIHVuc3VzcGVuZGVkLlxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICAgIH0gLy8gSWYgbm90aGluZyBzdXNwZW5kZWQsIHdlIG5lZWQgdG8gc2NoZWR1bGUgYW4gZWZmZWN0IHRvIG1hcmsgdGhpcyBib3VuZGFyeVxuICAgICAgLy8gYXMgaGF2aW5nIGh5ZHJhdGVkIHNvIGV2ZW50cyBrbm93IHRoYXQgdGhleSdyZSBmcmVlIHRvIGJlIGludm9rZWQuXG4gICAgICAvLyBJdCdzIGFsc28gYSBzaWduYWwgdG8gcmVwbGF5IGV2ZW50cyBhbmQgdGhlIHN1c3BlbnNlIGNhbGxiYWNrLlxuICAgICAgLy8gSWYgc29tZXRoaW5nIHN1c3BlbmRlZCwgc2NoZWR1bGUgYW4gZWZmZWN0IHRvIGF0dGFjaCByZXRyeSBsaXN0ZW5lcnMuXG4gICAgICAvLyBTbyB3ZSBtaWdodCBhcyB3ZWxsIGFsd2F5cyBtYXJrIHRoaXMuXG5cblxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgIHtcbiAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICB2YXIgX2lzVGltZWRPdXRTdXNwZW5zZSA9IG5leHRTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICAgIGlmIChfaXNUaW1lZE91dFN1c3BlbnNlKSB7XG4gICAgICAgICAgICAvLyBEb24ndCBjb3VudCB0aW1lIHNwZW50IGluIGEgdGltZWQgb3V0IFN1c3BlbnNlIHN1YnRyZWUgYXMgcGFydCBvZiB0aGUgYmFzZSBkdXJhdGlvbi5cbiAgICAgICAgICAgIHZhciBfcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICAgICAgICAgICAgaWYgKF9wcmltYXJ5Q2hpbGRGcmFnbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyAkRmxvd0ZpeE1lIEZsb3cgZG9lc24ndCBzdXBwb3J0IHR5cGUgY2FzdGluZyBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSAtPSBvcGVyYXRvclxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uIC09IF9wcmltYXJ5Q2hpbGRGcmFnbWVudC50cmVlQmFzZUR1cmF0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgdGhpcyB0cmVlLiBJZiB0aGlzIHdhcyBhIGZvcmNlZCBjbGllbnQgcmVuZGVyLFxuICAgIC8vIHRoZXJlIG1heSBoYXZlIGJlZW4gcmVjb3ZlcmFibGUgZXJyb3JzIGR1cmluZyBmaXJzdCBoeWRyYXRpb25cbiAgICAvLyBhdHRlbXB0LiBJZiBzbywgYWRkIHRoZW0gdG8gYSBxdWV1ZSBzbyB3ZSBjYW4gbG9nIHRoZW0gaW4gdGhlXG4gICAgLy8gY29tbWl0IHBoYXNlLlxuICAgIHVwZ3JhZGVIeWRyYXRpb25FcnJvcnNUb1JlY292ZXJhYmxlKCk7IC8vIEZhbGwgdGhyb3VnaCB0byBub3JtYWwgU3VzcGVuc2UgcGF0aFxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tcGxldGVXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgbmV3UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7IC8vIE5vdGU6IFRoaXMgaW50ZW50aW9uYWxseSBkb2Vzbid0IGNoZWNrIGlmIHdlJ3JlIGh5ZHJhdGluZyBiZWNhdXNlIGNvbXBhcmluZ1xuICAvLyB0byB0aGUgY3VycmVudCB0cmVlIHByb3ZpZGVyIGZpYmVyIGlzIGp1c3QgYXMgZmFzdCBhbmQgbGVzcyBlcnJvci1wcm9uZS5cbiAgLy8gSWRlYWxseSB3ZSB3b3VsZCBoYXZlIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIHRoZSB3b3JrIGxvb3Agb25seVxuICAvLyBmb3IgaHlkcmF0aW9uLlxuXG4gIHBvcFRyZWVDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcblxuICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgIGNhc2UgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDpcbiAgICBjYXNlIExhenlDb21wb25lbnQ6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgRnJhZ21lbnQ6XG4gICAgY2FzZSBNb2RlOlxuICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgY2FzZSBDb250ZXh0Q29uc3VtZXI6XG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBDb21wb25lbnQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuXG4gICAgICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICAgICAgcG9wQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIH1cblxuICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAge1xuICAgICAgICB2YXIgZmliZXJSb290ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgICAgICBwb3BIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcG9wVG9wTGV2ZWxDb250ZXh0T2JqZWN0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmVzZXRXb3JrSW5Qcm9ncmVzc1ZlcnNpb25zKCk7XG5cbiAgICAgICAgaWYgKGZpYmVyUm9vdC5wZW5kaW5nQ29udGV4dCkge1xuICAgICAgICAgIGZpYmVyUm9vdC5jb250ZXh0ID0gZmliZXJSb290LnBlbmRpbmdDb250ZXh0O1xuICAgICAgICAgIGZpYmVyUm9vdC5wZW5kaW5nQ29udGV4dCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50LmNoaWxkID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gSWYgd2UgaHlkcmF0ZWQsIHBvcCBzbyB0aGF0IHdlIGNhbiBkZWxldGUgYW55IHJlbWFpbmluZyBjaGlsZHJlblxuICAgICAgICAgIC8vIHRoYXQgd2VyZW4ndCBoeWRyYXRlZC5cbiAgICAgICAgICB2YXIgd2FzSHlkcmF0ZWQgPSBwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAgICBpZiAod2FzSHlkcmF0ZWQpIHtcbiAgICAgICAgICAgIC8vIElmIHdlIGh5ZHJhdGVkLCB0aGVuIHdlJ2xsIG5lZWQgdG8gc2NoZWR1bGUgYW4gdXBkYXRlIGZvclxuICAgICAgICAgICAgLy8gdGhlIGNvbW1pdCBzaWRlLWVmZmVjdHMgb24gdGhlIHJvb3QuXG4gICAgICAgICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICAgICAgICBpZiAoIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBjbGllbnQgcm9vdFxuICAgICAgICAgICAgICAhcHJldlN0YXRlLmlzRGVoeWRyYXRlZCB8fCAvLyBDaGVjayBpZiB3ZSByZXZlcnRlZCB0byBjbGllbnQgcmVuZGVyaW5nIChlLmcuIGR1ZSB0byBhbiBlcnJvcilcbiAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRm9yY2VDbGllbnRSZW5kZXIpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgICAgICAgLy8gU2NoZWR1bGUgYW4gZWZmZWN0IHRvIGNsZWFyIHRoaXMgY29udGFpbmVyIGF0IHRoZSBzdGFydCBvZiB0aGVcbiAgICAgICAgICAgICAgICAvLyBuZXh0IGNvbW1pdC4gVGhpcyBoYW5kbGVzIHRoZSBjYXNlIG9mIFJlYWN0IHJlbmRlcmluZyBpbnRvIGFcbiAgICAgICAgICAgICAgICAvLyBjb250YWluZXIgd2l0aCBwcmV2aW91cyBjaGlsZHJlbi4gSXQncyBhbHNvIHNhZmUgdG8gZG8gZm9yXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlcyB0b28sIGJlY2F1c2UgY3VycmVudC5jaGlsZCB3b3VsZCBvbmx5IGJlIG51bGwgaWYgdGhlXG4gICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgcmVuZGVyIHdhcyBudWxsIChzbyB0aGUgY29udGFpbmVyIHdvdWxkIGFscmVhZHlcbiAgICAgICAgICAgICAgICAvLyBiZSBlbXB0eSkuXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU25hcHNob3Q7IC8vIElmIHRoaXMgd2FzIGEgZm9yY2VkIGNsaWVudCByZW5kZXIsIHRoZXJlIG1heSBoYXZlIGJlZW5cbiAgICAgICAgICAgICAgICAvLyByZWNvdmVyYWJsZSBlcnJvcnMgZHVyaW5nIGZpcnN0IGh5ZHJhdGlvbiBhdHRlbXB0LiBJZiBzbywgYWRkXG4gICAgICAgICAgICAgICAgLy8gdGhlbSB0byBhIHF1ZXVlIHNvIHdlIGNhbiBsb2cgdGhlbSBpbiB0aGUgY29tbWl0IHBoYXNlLlxuXG4gICAgICAgICAgICAgICAgdXBncmFkZUh5ZHJhdGlvbkVycm9yc1RvUmVjb3ZlcmFibGUoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHVwZGF0ZUhvc3RDb250YWluZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wSG9zdENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB2YXIgcm9vdENvbnRhaW5lckluc3RhbmNlID0gZ2V0Um9vdEhvc3RDb250YWluZXIoKTtcbiAgICAgICAgdmFyIHR5cGUgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuXG4gICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgdXBkYXRlSG9zdENvbXBvbmVudCQxKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCB0eXBlLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlKTtcblxuICAgICAgICAgIGlmIChjdXJyZW50LnJlZiAhPT0gd29ya0luUHJvZ3Jlc3MucmVmKSB7XG4gICAgICAgICAgICBtYXJrUmVmJDEod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIW5ld1Byb3BzKSB7XG4gICAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV2UgbXVzdCBoYXZlIG5ldyBwcm9wcyBmb3IgbmV3IG1vdW50cy4gVGhpcyBlcnJvciBpcyBsaWtlbHkgJyArICdjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgICAgICAgfSAvLyBUaGlzIGNhbiBoYXBwZW4gd2hlbiB3ZSBhYm9ydCB3b3JrLlxuXG5cbiAgICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGN1cnJlbnRIb3N0Q29udGV4dCA9IGdldEhvc3RDb250ZXh0KCk7IC8vIFRPRE86IE1vdmUgY3JlYXRlSW5zdGFuY2UgdG8gYmVnaW5Xb3JrIGFuZCBrZWVwIGl0IG9uIGEgY29udGV4dFxuICAgICAgICAgIC8vIFwic3RhY2tcIiBhcyB0aGUgcGFyZW50LiBUaGVuIGFwcGVuZCBjaGlsZHJlbiBhcyB3ZSBnbyBpbiBiZWdpbldvcmtcbiAgICAgICAgICAvLyBvciBjb21wbGV0ZVdvcmsgZGVwZW5kaW5nIG9uIHdoZXRoZXIgd2Ugd2FudCB0byBhZGQgdGhlbSB0b3AtPmRvd24gb3JcbiAgICAgICAgICAvLyBib3R0b20tPnVwLiBUb3AtPmRvd24gaXMgZmFzdGVyIGluIElFMTEuXG5cbiAgICAgICAgICB2YXIgX3dhc0h5ZHJhdGVkID0gcG9wSHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICAgICAgaWYgKF93YXNIeWRyYXRlZCkge1xuICAgICAgICAgICAgLy8gVE9ETzogTW92ZSB0aGlzIGFuZCBjcmVhdGVJbnN0YW5jZSBzdGVwIGludG8gdGhlIGJlZ2luUGhhc2VcbiAgICAgICAgICAgIC8vIHRvIGNvbnNvbGlkYXRlLlxuICAgICAgICAgICAgaWYgKHByZXBhcmVUb0h5ZHJhdGVIb3N0SW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgY3VycmVudEhvc3RDb250ZXh0KSkge1xuICAgICAgICAgICAgICAvLyBJZiBjaGFuZ2VzIHRvIHRoZSBoeWRyYXRlZCBub2RlIG5lZWQgdG8gYmUgYXBwbGllZCBhdCB0aGVcbiAgICAgICAgICAgICAgLy8gY29tbWl0LXBoYXNlIHdlIG1hcmsgdGhpcyBhcyBzdWNoLlxuICAgICAgICAgICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gY3JlYXRlSW5zdGFuY2UodHlwZSwgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgY3VycmVudEhvc3RDb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICBhcHBlbmRBbGxDaGlsZHJlbihpbnN0YW5jZSwgd29ya0luUHJvZ3Jlc3MsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBpbnN0YW5jZTsgLy8gQ2VydGFpbiByZW5kZXJlcnMgcmVxdWlyZSBjb21taXQtdGltZSBlZmZlY3RzIGZvciBpbml0aWFsIG1vdW50LlxuICAgICAgICAgICAgLy8gKGVnIERPTSByZW5kZXJlciBzdXBwb3J0cyBhdXRvLWZvY3VzIGZvciBjZXJ0YWluIGVsZW1lbnRzKS5cbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBzdWNoIHJlbmRlcmVycyBnZXQgc2NoZWR1bGVkIGZvciBsYXRlciB3b3JrLlxuXG4gICAgICAgICAgICBpZiAoZmluYWxpemVJbml0aWFsQ2hpbGRyZW4oaW5zdGFuY2UsIHR5cGUsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UpKSB7XG4gICAgICAgICAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5yZWYgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgcmVmIG9uIGEgaG9zdCBub2RlIHdlIG5lZWQgdG8gc2NoZWR1bGUgYSBjYWxsYmFja1xuICAgICAgICAgICAgbWFya1JlZiQxKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAge1xuICAgICAgICB2YXIgbmV3VGV4dCA9IG5ld1Byb3BzO1xuXG4gICAgICAgIGlmIChjdXJyZW50ICYmIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgdmFyIG9sZFRleHQgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7IC8vIElmIHdlIGhhdmUgYW4gYWx0ZXJuYXRlLCB0aGF0IG1lYW5zIHRoaXMgaXMgYW4gdXBkYXRlIGFuZCB3ZSBuZWVkXG4gICAgICAgICAgLy8gdG8gc2NoZWR1bGUgYSBzaWRlLWVmZmVjdCB0byBkbyB0aGUgdXBkYXRlcy5cblxuICAgICAgICAgIHVwZGF0ZUhvc3RUZXh0JDEoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG9sZFRleHQsIG5ld1RleHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0eXBlb2YgbmV3VGV4dCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXZSBtdXN0IGhhdmUgbmV3IHByb3BzIGZvciBuZXcgbW91bnRzLiBUaGlzIGVycm9yIGlzIGxpa2VseSAnICsgJ2NhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICAgICAgICB9IC8vIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHdlIGFib3J0IHdvcmsuXG5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgX3Jvb3RDb250YWluZXJJbnN0YW5jZSA9IGdldFJvb3RIb3N0Q29udGFpbmVyKCk7XG5cbiAgICAgICAgICB2YXIgX2N1cnJlbnRIb3N0Q29udGV4dCA9IGdldEhvc3RDb250ZXh0KCk7XG5cbiAgICAgICAgICB2YXIgX3dhc0h5ZHJhdGVkMiA9IHBvcEh5ZHJhdGlvblN0YXRlKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICAgIGlmIChfd2FzSHlkcmF0ZWQyKSB7XG4gICAgICAgICAgICBpZiAocHJlcGFyZVRvSHlkcmF0ZUhvc3RUZXh0SW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MpKSB7XG4gICAgICAgICAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBjcmVhdGVUZXh0SW5zdGFuY2UobmV3VGV4dCwgX3Jvb3RDb250YWluZXJJbnN0YW5jZSwgX2N1cnJlbnRIb3N0Q29udGV4dCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHZhciBuZXh0U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlOyAvLyBTcGVjaWFsIHBhdGggZm9yIGRlaHlkcmF0ZWQgYm91bmRhcmllcy4gV2UgbWF5IGV2ZW50dWFsbHkgbW92ZSB0aGlzXG4gICAgICAgIC8vIHRvIGl0cyBvd24gZmliZXIgdHlwZSBzbyB0aGF0IHdlIGNhbiBhZGQgb3RoZXIga2luZHMgb2YgaHlkcmF0aW9uXG4gICAgICAgIC8vIGJvdW5kYXJpZXMgdGhhdCBhcmVuJ3QgYXNzb2NpYXRlZCB3aXRoIGEgU3VzcGVuc2UgdHJlZS4gSW4gYW50aWNpcGF0aW9uXG4gICAgICAgIC8vIG9mIHN1Y2ggYSByZWZhY3RvciwgYWxsIHRoZSBoeWRyYXRpb24gbG9naWMgaXMgY29udGFpbmVkIGluXG4gICAgICAgIC8vIHRoaXMgYnJhbmNoLlxuXG4gICAgICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbCAmJiBjdXJyZW50Lm1lbW9pemVkU3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBmYWxsdGhyb3VnaFRvTm9ybWFsU3VzcGVuc2VQYXRoID0gY29tcGxldGVEZWh5ZHJhdGVkU3VzcGVuc2VCb3VuZGFyeShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dFN0YXRlKTtcblxuICAgICAgICAgIGlmICghZmFsbHRocm91Z2hUb05vcm1hbFN1c3BlbnNlUGF0aCkge1xuICAgICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLmZsYWdzICYgU2hvdWxkQ2FwdHVyZSkge1xuICAgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UuIFRoZXJlIHdlcmUgcmVtYWluaW5nIHVuaHlkcmF0ZWQgbm9kZXMuIFdlIHRyZWF0XG4gICAgICAgICAgICAgIC8vIHRoaXMgYXMgYSBtaXNtYXRjaC4gUmV2ZXJ0IHRvIGNsaWVudCByZW5kZXJpbmcuXG4gICAgICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIERpZCBub3QgZmluaXNoIGh5ZHJhdGluZywgZWl0aGVyIGJlY2F1c2UgdGhpcyBpcyB0aGUgaW5pdGlhbFxuICAgICAgICAgICAgICAvLyByZW5kZXIgb3IgYmVjYXVzZSBzb21ldGhpbmcgc3VzcGVuZGVkLlxuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IC8vIENvbnRpbnVlIHdpdGggdGhlIG5vcm1hbCBTdXNwZW5zZSBwYXRoLlxuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICAvLyBTb21ldGhpbmcgc3VzcGVuZGVkLiBSZS1yZW5kZXIgd2l0aCB0aGUgZmFsbGJhY2sgY2hpbGRyZW4uXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSByZW5kZXJMYW5lczsgLy8gRG8gbm90IHJlc2V0IHRoZSBlZmZlY3QgbGlzdC5cblxuICAgICAgICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgICAgdHJhbnNmZXJBY3R1YWxEdXJhdGlvbih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfSAvLyBEb24ndCBidWJibGUgcHJvcGVydGllcyBpbiB0aGlzIGNhc2UuXG5cblxuICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBuZXh0RGlkVGltZW91dCA9IG5leHRTdGF0ZSAhPT0gbnVsbDtcbiAgICAgICAgdmFyIHByZXZEaWRUaW1lb3V0ID0gY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50Lm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG4gICAgICAgIC8vIGEgcGFzc2l2ZSBlZmZlY3QsIHdoaWNoIGlzIHdoZW4gd2UgcHJvY2VzcyB0aGUgdHJhbnNpdGlvbnNcblxuXG4gICAgICAgIGlmIChuZXh0RGlkVGltZW91dCAhPT0gcHJldkRpZFRpbWVvdXQpIHtcbiAgICAgICAgICAvLyBhbiBlZmZlY3QgdG8gdG9nZ2xlIHRoZSBzdWJ0cmVlJ3MgdmlzaWJpbGl0eS4gV2hlbiB3ZSBzd2l0Y2ggZnJvbVxuICAgICAgICAgIC8vIGZhbGxiYWNrIC0+IHByaW1hcnksIHRoZSBpbm5lciBPZmZzY3JlZW4gZmliZXIgc2NoZWR1bGVzIHRoaXMgZWZmZWN0XG4gICAgICAgICAgLy8gYXMgcGFydCBvZiBpdHMgbm9ybWFsIGNvbXBsZXRlIHBoYXNlLiBCdXQgd2hlbiB3ZSBzd2l0Y2ggZnJvbVxuICAgICAgICAgIC8vIHByaW1hcnkgLT4gZmFsbGJhY2ssIHRoZSBpbm5lciBPZmZzY3JlZW4gZmliZXIgZG9lcyBub3QgaGF2ZSBhIGNvbXBsZXRlXG4gICAgICAgICAgLy8gcGhhc2UuIFNvIHdlIG5lZWQgdG8gc2NoZWR1bGUgaXRzIGVmZmVjdCBoZXJlLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gV2UgYWxzbyB1c2UgdGhpcyBmbGFnIHRvIGNvbm5lY3QvZGlzY29ubmVjdCB0aGUgZWZmZWN0cywgYnV0IHRoZSBzYW1lXG4gICAgICAgICAgLy8gbG9naWMgYXBwbGllczogd2hlbiByZS1jb25uZWN0aW5nLCB0aGUgT2Zmc2NyZWVuIGZpYmVyJ3MgY29tcGxldGVcbiAgICAgICAgICAvLyBwaGFzZSB3aWxsIGhhbmRsZSBzY2hlZHVsaW5nIHRoZSBlZmZlY3QuIEl0J3Mgb25seSB3aGVuIHRoZSBmYWxsYmFja1xuICAgICAgICAgIC8vIGlzIGFjdGl2ZSB0aGF0IHdlIGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC5cblxuXG4gICAgICAgICAgaWYgKG5leHREaWRUaW1lb3V0KSB7XG4gICAgICAgICAgICB2YXIgX29mZnNjcmVlbkZpYmVyMiA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgICAgX29mZnNjcmVlbkZpYmVyMi5mbGFncyB8PSBWaXNpYmlsaXR5OyAvLyBUT0RPOiBUaGlzIHdpbGwgc3RpbGwgc3VzcGVuZCBhIHN5bmNocm9ub3VzIHRyZWUgaWYgYW55dGhpbmdcbiAgICAgICAgICAgIC8vIGluIHRoZSBjb25jdXJyZW50IHRyZWUgYWxyZWFkeSBzdXNwZW5kZWQgZHVyaW5nIHRoaXMgcmVuZGVyLlxuICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGtub3duIGJ1Zy5cblxuICAgICAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgICAgLy8gVE9ETzogTW92ZSB0aGlzIGJhY2sgdG8gdGhyb3dFeGNlcHRpb24gYmVjYXVzZSB0aGlzIGlzIHRvbyBsYXRlXG4gICAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYSBsYXJnZSB0cmVlIHdoaWNoIGlzIGNvbW1vbiBmb3IgaW5pdGlhbCBsb2Fkcy4gV2VcbiAgICAgICAgICAgICAgLy8gZG9uJ3Qga25vdyBpZiB3ZSBzaG91bGQgcmVzdGFydCBhIHJlbmRlciBvciBub3QgdW50aWwgd2UgZ2V0XG4gICAgICAgICAgICAgIC8vIHRoaXMgbWFya2VyLCBhbmQgdGhpcyBpcyB0b28gbGF0ZS5cbiAgICAgICAgICAgICAgLy8gSWYgdGhpcyByZW5kZXIgYWxyZWFkeSBoYWQgYSBwaW5nIG9yIGxvd2VyIHByaSB1cGRhdGVzLFxuICAgICAgICAgICAgICAvLyBhbmQgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBrbm93IHdlJ3JlIGdvaW5nIHRvIHN1c3BlbmQgd2VcbiAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGFibGUgdG8gaW1tZWRpYXRlbHkgcmVzdGFydCBmcm9tIHdpdGhpbiB0aHJvd0V4Y2VwdGlvbi5cbiAgICAgICAgICAgICAgdmFyIGhhc0ludmlzaWJsZUNoaWxkQ29udGV4dCA9IGN1cnJlbnQgPT09IG51bGwgJiYgKHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMudW5zdGFibGVfYXZvaWRUaGlzRmFsbGJhY2sgIT09IHRydWUgfHwgIWVuYWJsZVN1c3BlbnNlQXZvaWRUaGlzRmFsbGJhY2spO1xuXG4gICAgICAgICAgICAgIGlmIChoYXNJbnZpc2libGVDaGlsZENvbnRleHQgfHwgaGFzU3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudCwgSW52aXNpYmxlUGFyZW50U3VzcGVuc2VDb250ZXh0KSkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgd2FzIGluIGFuIGludmlzaWJsZSB0cmVlIG9yIGEgbmV3IHJlbmRlciwgdGhlbiBzaG93aW5nXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBib3VuZGFyeSBpcyBvay5cbiAgICAgICAgICAgICAgICByZW5kZXJEaWRTdXNwZW5kKCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSdyZSBnb2luZyB0byBoYXZlIHRvIGhpZGUgY29udGVudCBzbyB3ZSBzaG91bGRcbiAgICAgICAgICAgICAgICAvLyBzdXNwZW5kIGZvciBsb25nZXIgaWYgcG9zc2libGUuXG4gICAgICAgICAgICAgICAgcmVuZGVyRGlkU3VzcGVuZERlbGF5SWZQb3NzaWJsZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHdha2VhYmxlcyA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgIGlmICh3YWtlYWJsZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBTY2hlZHVsZSBhbiBlZmZlY3QgdG8gYXR0YWNoIGEgcmV0cnkgbGlzdGVuZXIgdG8gdGhlIHByb21pc2UuXG4gICAgICAgICAgLy8gVE9ETzogTW92ZSB0byBwYXNzaXZlIHBoYXNlXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAge1xuICAgICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgICBpZiAobmV4dERpZFRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgLy8gRG9uJ3QgY291bnQgdGltZSBzcGVudCBpbiBhIHRpbWVkIG91dCBTdXNwZW5zZSBzdWJ0cmVlIGFzIHBhcnQgb2YgdGhlIGJhc2UgZHVyYXRpb24uXG4gICAgICAgICAgICAgIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuXG4gICAgICAgICAgICAgIGlmIChwcmltYXJ5Q2hpbGRGcmFnbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vICRGbG93Rml4TWUgRmxvdyBkb2Vzbid0IHN1cHBvcnQgdHlwZSBjYXN0aW5nIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIC09IG9wZXJhdG9yXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiAtPSBwcmltYXJ5Q2hpbGRGcmFnbWVudC50cmVlQmFzZUR1cmF0aW9uO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBwb3BIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHVwZGF0ZUhvc3RDb250YWluZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgICBwcmVwYXJlUG9ydGFsTW91bnQod29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICAgICAgfVxuXG4gICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICAvLyBQb3AgcHJvdmlkZXIgZmliZXJcbiAgICAgIHZhciBjb250ZXh0ID0gd29ya0luUHJvZ3Jlc3MudHlwZS5fY29udGV4dDtcbiAgICAgIHBvcFByb3ZpZGVyKGNvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIEluY29tcGxldGVDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgLy8gU2FtZSBhcyBjbGFzcyBjb21wb25lbnQgY2FzZS4gSSBwdXQgaXQgZG93biBoZXJlIHNvIHRoYXQgdGhlIHRhZ3MgYXJlXG4gICAgICAgIC8vIHNlcXVlbnRpYWwgdG8gZW5zdXJlIHRoaXMgc3dpdGNoIGlzIGNvbXBpbGVkIHRvIGEganVtcCB0YWJsZS5cbiAgICAgICAgdmFyIF9Db21wb25lbnQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuXG4gICAgICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihfQ29tcG9uZW50KSkge1xuICAgICAgICAgIHBvcENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHZhciByZW5kZXJTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgaWYgKHJlbmRlclN0YXRlID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UncmUgcnVubmluZyBpbiB0aGUgZGVmYXVsdCwgXCJpbmRlcGVuZGVudFwiIG1vZGUuXG4gICAgICAgICAgLy8gV2UgZG9uJ3QgZG8gYW55dGhpbmcgaW4gdGhpcyBtb2RlLlxuICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRpZFN1c3BlbmRBbHJlYWR5ID0gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG4gICAgICAgIHZhciByZW5kZXJlZFRhaWwgPSByZW5kZXJTdGF0ZS5yZW5kZXJpbmc7XG5cbiAgICAgICAgaWYgKHJlbmRlcmVkVGFpbCA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlIGp1c3QgcmVuZGVyZWQgdGhlIGhlYWQuXG4gICAgICAgICAgaWYgKCFkaWRTdXNwZW5kQWxyZWFkeSkge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgcGFzcy4gV2UgbmVlZCB0byBmaWd1cmUgb3V0IGlmIGFueXRoaW5nIGlzIHN0aWxsXG4gICAgICAgICAgICAvLyBzdXNwZW5kZWQgaW4gdGhlIHJlbmRlcmVkIHNldC5cbiAgICAgICAgICAgIC8vIElmIG5ldyBjb250ZW50IHVuc3VzcGVuZGVkLCBidXQgdGhlcmUncyBzdGlsbCBzb21lIGNvbnRlbnQgdGhhdFxuICAgICAgICAgICAgLy8gZGlkbid0LiBUaGVuIHdlIG5lZWQgdG8gZG8gYSBzZWNvbmQgcGFzcyB0aGF0IGZvcmNlcyBldmVyeXRoaW5nXG4gICAgICAgICAgICAvLyB0byBrZWVwIHNob3dpbmcgdGhlaXIgZmFsbGJhY2tzLlxuICAgICAgICAgICAgLy8gV2UgbWlnaHQgYmUgc3VzcGVuZGVkIGlmIHNvbWV0aGluZyBpbiB0aGlzIHJlbmRlciBwYXNzIHN1c3BlbmRlZCwgb3JcbiAgICAgICAgICAgIC8vIHNvbWV0aGluZyBpbiB0aGUgcHJldmlvdXMgY29tbWl0dGVkIHBhc3Mgc3VzcGVuZGVkLiBPdGhlcndpc2UsXG4gICAgICAgICAgICAvLyB0aGVyZSdzIG5vIGNoYW5jZSBzbyB3ZSBjYW4gc2tpcCB0aGUgZXhwZW5zaXZlIGNhbGwgdG9cbiAgICAgICAgICAgIC8vIGZpbmRGaXJzdFN1c3BlbmRlZC5cbiAgICAgICAgICAgIHZhciBjYW5ub3RCZVN1c3BlbmRlZCA9IHJlbmRlckhhc05vdFN1c3BlbmRlZFlldCgpICYmIChjdXJyZW50ID09PSBudWxsIHx8IChjdXJyZW50LmZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IE5vRmxhZ3MpO1xuXG4gICAgICAgICAgICBpZiAoIWNhbm5vdEJlU3VzcGVuZGVkKSB7XG4gICAgICAgICAgICAgIHZhciByb3cgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICAgICAgICAgICAgICB3aGlsZSAocm93ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN1c3BlbmRlZCA9IGZpbmRGaXJzdFN1c3BlbmRlZChyb3cpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHN1c3BlbmRlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgZGlkU3VzcGVuZEFscmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgZmFsc2UpOyAvLyBJZiB0aGlzIGlzIGEgbmV3bHkgc3VzcGVuZGVkIHRyZWUsIGl0IG1pZ2h0IG5vdCBnZXQgY29tbWl0dGVkIGFzXG4gICAgICAgICAgICAgICAgICAvLyBwYXJ0IG9mIHRoZSBzZWNvbmQgcGFzcy4gSW4gdGhhdCBjYXNlIG5vdGhpbmcgd2lsbCBzdWJzY3JpYmUgdG9cbiAgICAgICAgICAgICAgICAgIC8vIGl0cyB0aGVuYWJsZXMuIEluc3RlYWQsIHdlJ2xsIHRyYW5zZmVyIGl0cyB0aGVuYWJsZXMgdG8gdGhlXG4gICAgICAgICAgICAgICAgICAvLyBTdXNwZW5zZUxpc3Qgc28gdGhhdCBpdCBjYW4gcmV0cnkgaWYgdGhleSByZXNvbHZlLlxuICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgbWlnaHQgYmUgbXVsdGlwbGUgb2YgdGhlc2UgaW4gdGhlIGxpc3QgYnV0IHNpbmNlIHdlJ3JlXG4gICAgICAgICAgICAgICAgICAvLyBnb2luZyB0byB3YWl0IGZvciBhbGwgb2YgdGhlbSBhbnl3YXksIGl0IGRvZXNuJ3QgcmVhbGx5IG1hdHRlclxuICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggb25lcyBnZXRzIHRvIHBpbmcuIEluIHRoZW9yeSB3ZSBjb3VsZCBnZXQgY2xldmVyIGFuZCBrZWVwXG4gICAgICAgICAgICAgICAgICAvLyB0cmFjayBvZiBob3cgbWFueSBkZXBlbmRlbmNpZXMgcmVtYWluIGJ1dCBpdCBnZXRzIHRyaWNreSBiZWNhdXNlXG4gICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgbWVhbnRpbWUsIHdlIGNhbiBhZGQvcmVtb3ZlL2NoYW5nZSBpdGVtcyBhbmQgZGVwZW5kZW5jaWVzLlxuICAgICAgICAgICAgICAgICAgLy8gV2UgbWlnaHQgYmFpbCBvdXQgb2YgdGhlIGxvb3AgYmVmb3JlIGZpbmRpbmcgYW55IGJ1dCB0aGF0XG4gICAgICAgICAgICAgICAgICAvLyBkb2Vzbid0IG1hdHRlciBzaW5jZSB0aGF0IG1lYW5zIHRoYXQgdGhlIG90aGVyIGJvdW5kYXJpZXMgdGhhdFxuICAgICAgICAgICAgICAgICAgLy8gd2UgZGlkIGZpbmQgYWxyZWFkeSBoYXMgdGhlaXIgbGlzdGVuZXJzIGF0dGFjaGVkLlxuXG4gICAgICAgICAgICAgICAgICB2YXIgbmV3VGhlbmFibGVzID0gc3VzcGVuZGVkLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgICAgICAgICAgICBpZiAobmV3VGhlbmFibGVzICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbmV3VGhlbmFibGVzO1xuICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICAgICAgICAgICAgICB9IC8vIFJlcmVuZGVyIHRoZSB3aG9sZSBsaXN0LCBidXQgdGhpcyB0aW1lLCB3ZSdsbCBmb3JjZSBmYWxsYmFja3NcbiAgICAgICAgICAgICAgICAgIC8vIHRvIHN0YXkgaW4gcGxhY2UuXG4gICAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgZWZmZWN0IGZsYWdzIGJlZm9yZSBkb2luZyB0aGUgc2Vjb25kIHBhc3Mgc2luY2UgdGhhdCdzIG5vdyBpbnZhbGlkLlxuICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGNoaWxkIGZpYmVycyB0byB0aGVpciBvcmlnaW5hbCBzdGF0ZS5cblxuXG4gICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuICAgICAgICAgICAgICAgICAgcmVzZXRDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpOyAvLyBTZXQgdXAgdGhlIFN1c3BlbnNlIENvbnRleHQgdG8gZm9yY2Ugc3VzcGVuc2UgYW5kIGltbWVkaWF0ZWx5XG4gICAgICAgICAgICAgICAgICAvLyByZXJlbmRlciB0aGUgY2hpbGRyZW4uXG5cbiAgICAgICAgICAgICAgICAgIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHNldFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50LCBGb3JjZVN1c3BlbnNlRmFsbGJhY2spKTsgLy8gRG9uJ3QgYnViYmxlIHByb3BlcnRpZXMgaW4gdGhpcyBjYXNlLlxuXG4gICAgICAgICAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcm93ID0gcm93LnNpYmxpbmc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJlbmRlclN0YXRlLnRhaWwgIT09IG51bGwgJiYgbm93KCkgPiBnZXRSZW5kZXJUYXJnZXRUaW1lKCkpIHtcbiAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhbHJlYWR5IHBhc3NlZCBvdXIgQ1BVIGRlYWRsaW5lIGJ1dCB3ZSBzdGlsbCBoYXZlIHJvd3NcbiAgICAgICAgICAgICAgLy8gbGVmdCBpbiB0aGUgdGFpbC4gV2UnbGwganVzdCBnaXZlIHVwIGZ1cnRoZXIgYXR0ZW1wdHMgdG8gcmVuZGVyXG4gICAgICAgICAgICAgIC8vIHRoZSBtYWluIGNvbnRlbnQgYW5kIG9ubHkgcmVuZGVyIGZhbGxiYWNrcy5cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICAgICAgZGlkU3VzcGVuZEFscmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIGZhbHNlKTsgLy8gU2luY2Ugbm90aGluZyBhY3R1YWxseSBzdXNwZW5kZWQsIHRoZXJlIHdpbGwgbm90aGluZyB0byBwaW5nIHRoaXNcbiAgICAgICAgICAgICAgLy8gdG8gZ2V0IGl0IHN0YXJ0ZWQgYmFjayB1cCB0byBhdHRlbXB0IHRoZSBuZXh0IGl0ZW0uIFdoaWxlIGluIHRlcm1zXG4gICAgICAgICAgICAgIC8vIG9mIHByaW9yaXR5IHRoaXMgd29yayBoYXMgdGhlIHNhbWUgcHJpb3JpdHkgYXMgdGhpcyBjdXJyZW50IHJlbmRlcixcbiAgICAgICAgICAgICAgLy8gaXQncyBub3QgcGFydCBvZiB0aGUgc2FtZSB0cmFuc2l0aW9uIG9uY2UgdGhlIHRyYW5zaXRpb24gaGFzXG4gICAgICAgICAgICAgIC8vIGNvbW1pdHRlZC4gSWYgaXQncyBzeW5jLCB3ZSBzdGlsbCB3YW50IHRvIHlpZWxkIHNvIHRoYXQgaXQgY2FuIGJlXG4gICAgICAgICAgICAgIC8vIHBhaW50ZWQuIENvbmNlcHR1YWxseSwgdGhpcyBpcyByZWFsbHkgdGhlIHNhbWUgYXMgcGluZ2luZy5cbiAgICAgICAgICAgICAgLy8gV2UgY2FuIHVzZSBhbnkgUmV0cnlMYW5lIGV2ZW4gaWYgaXQncyB0aGUgb25lIGN1cnJlbnRseSByZW5kZXJpbmdcbiAgICAgICAgICAgICAgLy8gc2luY2Ugd2UncmUgbGVhdmluZyBpdCBiZWhpbmQgb24gdGhpcyBub2RlLlxuXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gU29tZVJldHJ5TGFuZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3V0T2ZmVGFpbElmTmVlZGVkKHJlbmRlclN0YXRlLCBmYWxzZSk7XG4gICAgICAgICAgfSAvLyBOZXh0IHdlJ3JlIGdvaW5nIHRvIHJlbmRlciB0aGUgdGFpbC5cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEFwcGVuZCB0aGUgcmVuZGVyZWQgcm93IHRvIHRoZSBjaGlsZCBsaXN0LlxuICAgICAgICAgIGlmICghZGlkU3VzcGVuZEFscmVhZHkpIHtcbiAgICAgICAgICAgIHZhciBfc3VzcGVuZGVkID0gZmluZEZpcnN0U3VzcGVuZGVkKHJlbmRlcmVkVGFpbCk7XG5cbiAgICAgICAgICAgIGlmIChfc3VzcGVuZGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgICAgICAgICAgIGRpZFN1c3BlbmRBbHJlYWR5ID0gdHJ1ZTsgLy8gRW5zdXJlIHdlIHRyYW5zZmVyIHRoZSB1cGRhdGUgcXVldWUgdG8gdGhlIHBhcmVudCBzbyB0aGF0IGl0IGRvZXNuJ3RcbiAgICAgICAgICAgICAgLy8gZ2V0IGxvc3QgaWYgdGhpcyByb3cgZW5kcyB1cCBkcm9wcGVkIGR1cmluZyBhIHNlY29uZCBwYXNzLlxuXG4gICAgICAgICAgICAgIHZhciBfbmV3VGhlbmFibGVzID0gX3N1c3BlbmRlZC51cGRhdGVRdWV1ZTtcblxuICAgICAgICAgICAgICBpZiAoX25ld1RoZW5hYmxlcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gX25ld1RoZW5hYmxlcztcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIHRydWUpOyAvLyBUaGlzIG1pZ2h0IGhhdmUgYmVlbiBtb2RpZmllZC5cblxuICAgICAgICAgICAgICBpZiAocmVuZGVyU3RhdGUudGFpbCA9PT0gbnVsbCAmJiByZW5kZXJTdGF0ZS50YWlsTW9kZSA9PT0gJ2hpZGRlbicgJiYgIXJlbmRlcmVkVGFpbC5hbHRlcm5hdGUgJiYgIWdldElzSHlkcmF0aW5nKCkgLy8gV2UgZG9uJ3QgY3V0IGl0IGlmIHdlJ3JlIGh5ZHJhdGluZy5cbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAvLyBXZSdyZSBkb25lLlxuICAgICAgICAgICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCAvLyBUaGUgdGltZSBpdCB0b29rIHRvIHJlbmRlciBsYXN0IHJvdyBpcyBncmVhdGVyIHRoYW4gdGhlIHJlbWFpbmluZ1xuICAgICAgICAgICAgLy8gdGltZSB3ZSBoYXZlIHRvIHJlbmRlci4gU28gcmVuZGVyaW5nIG9uZSBtb3JlIHJvdyB3b3VsZCBsaWtlbHlcbiAgICAgICAgICAgIC8vIGV4Y2VlZCBpdC5cbiAgICAgICAgICAgIG5vdygpICogMiAtIHJlbmRlclN0YXRlLnJlbmRlcmluZ1N0YXJ0VGltZSA+IGdldFJlbmRlclRhcmdldFRpbWUoKSAmJiByZW5kZXJMYW5lcyAhPT0gT2Zmc2NyZWVuTGFuZSkge1xuICAgICAgICAgICAgICAvLyBXZSBoYXZlIG5vdyBwYXNzZWQgb3VyIENQVSBkZWFkbGluZSBhbmQgd2UnbGwganVzdCBnaXZlIHVwIGZ1cnRoZXJcbiAgICAgICAgICAgICAgLy8gYXR0ZW1wdHMgdG8gcmVuZGVyIHRoZSBtYWluIGNvbnRlbnQgYW5kIG9ubHkgcmVuZGVyIGZhbGxiYWNrcy5cbiAgICAgICAgICAgICAgLy8gVGhlIGFzc3VtcHRpb24gaXMgdGhhdCB0aGlzIGlzIHVzdWFsbHkgZmFzdGVyLlxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICAgICAgICBkaWRTdXNwZW5kQWxyZWFkeSA9IHRydWU7XG4gICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgZmFsc2UpOyAvLyBTaW5jZSBub3RoaW5nIGFjdHVhbGx5IHN1c3BlbmRlZCwgdGhlcmUgd2lsbCBub3RoaW5nIHRvIHBpbmcgdGhpc1xuICAgICAgICAgICAgICAvLyB0byBnZXQgaXQgc3RhcnRlZCBiYWNrIHVwIHRvIGF0dGVtcHQgdGhlIG5leHQgaXRlbS4gV2hpbGUgaW4gdGVybXNcbiAgICAgICAgICAgICAgLy8gb2YgcHJpb3JpdHkgdGhpcyB3b3JrIGhhcyB0aGUgc2FtZSBwcmlvcml0eSBhcyB0aGlzIGN1cnJlbnQgcmVuZGVyLFxuICAgICAgICAgICAgICAvLyBpdCdzIG5vdCBwYXJ0IG9mIHRoZSBzYW1lIHRyYW5zaXRpb24gb25jZSB0aGUgdHJhbnNpdGlvbiBoYXNcbiAgICAgICAgICAgICAgLy8gY29tbWl0dGVkLiBJZiBpdCdzIHN5bmMsIHdlIHN0aWxsIHdhbnQgdG8geWllbGQgc28gdGhhdCBpdCBjYW4gYmVcbiAgICAgICAgICAgICAgLy8gcGFpbnRlZC4gQ29uY2VwdHVhbGx5LCB0aGlzIGlzIHJlYWxseSB0aGUgc2FtZSBhcyBwaW5naW5nLlxuICAgICAgICAgICAgICAvLyBXZSBjYW4gdXNlIGFueSBSZXRyeUxhbmUgZXZlbiBpZiBpdCdzIHRoZSBvbmUgY3VycmVudGx5IHJlbmRlcmluZ1xuICAgICAgICAgICAgICAvLyBzaW5jZSB3ZSdyZSBsZWF2aW5nIGl0IGJlaGluZCBvbiB0aGlzIG5vZGUuXG5cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBTb21lUmV0cnlMYW5lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChyZW5kZXJTdGF0ZS5pc0JhY2t3YXJkcykge1xuICAgICAgICAgICAgLy8gVGhlIGVmZmVjdCBsaXN0IG9mIHRoZSBiYWNrd2FyZHMgdGFpbCB3aWxsIGhhdmUgYmVlbiBhZGRlZFxuICAgICAgICAgICAgLy8gdG8gdGhlIGVuZC4gVGhpcyBicmVha3MgdGhlIGd1YXJhbnRlZSB0aGF0IGxpZmUtY3ljbGVzIGZpcmUgaW5cbiAgICAgICAgICAgIC8vIHNpYmxpbmcgb3JkZXIgYnV0IHRoYXQgaXNuJ3QgYSBzdHJvbmcgZ3VhcmFudGVlIHByb21pc2VkIGJ5IFJlYWN0LlxuICAgICAgICAgICAgLy8gRXNwZWNpYWxseSBzaW5jZSB0aGVzZSBtaWdodCBhbHNvIGp1c3QgcG9wIGluIGR1cmluZyBmdXR1cmUgY29tbWl0cy5cbiAgICAgICAgICAgIC8vIEFwcGVuZCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0LlxuICAgICAgICAgICAgcmVuZGVyZWRUYWlsLnNpYmxpbmcgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmVuZGVyZWRUYWlsO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgcHJldmlvdXNTaWJsaW5nID0gcmVuZGVyU3RhdGUubGFzdDtcblxuICAgICAgICAgICAgaWYgKHByZXZpb3VzU2libGluZyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICBwcmV2aW91c1NpYmxpbmcuc2libGluZyA9IHJlbmRlcmVkVGFpbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmVuZGVyZWRUYWlsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZW5kZXJTdGF0ZS5sYXN0ID0gcmVuZGVyZWRUYWlsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZW5kZXJTdGF0ZS50YWlsICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2Ugc3RpbGwgaGF2ZSB0YWlsIHJvd3MgdG8gcmVuZGVyLlxuICAgICAgICAgIC8vIFBvcCBhIHJvdy5cbiAgICAgICAgICB2YXIgbmV4dCA9IHJlbmRlclN0YXRlLnRhaWw7XG4gICAgICAgICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nID0gbmV4dDtcbiAgICAgICAgICByZW5kZXJTdGF0ZS50YWlsID0gbmV4dC5zaWJsaW5nO1xuICAgICAgICAgIHJlbmRlclN0YXRlLnJlbmRlcmluZ1N0YXJ0VGltZSA9IG5vdygpO1xuICAgICAgICAgIG5leHQuc2libGluZyA9IG51bGw7IC8vIFJlc3RvcmUgdGhlIGNvbnRleHQuXG4gICAgICAgICAgLy8gVE9ETzogV2UgY2FuIHByb2JhYmx5IGp1c3QgYXZvaWQgcG9wcGluZyBpdCBpbnN0ZWFkIGFuZCBvbmx5XG4gICAgICAgICAgLy8gc2V0dGluZyBpdCB0aGUgZmlyc3QgdGltZSB3ZSBnbyBmcm9tIG5vdCBzdXNwZW5kZWQgdG8gc3VzcGVuZGVkLlxuXG4gICAgICAgICAgdmFyIHN1c3BlbnNlQ29udGV4dCA9IHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudDtcblxuICAgICAgICAgIGlmIChkaWRTdXNwZW5kQWxyZWFkeSkge1xuICAgICAgICAgICAgc3VzcGVuc2VDb250ZXh0ID0gc2V0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQsIEZvcmNlU3VzcGVuc2VGYWxsYmFjayk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1c3BlbnNlQ29udGV4dCA9IHNldERlZmF1bHRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuc2VDb250ZXh0KTsgLy8gRG8gYSBwYXNzIG92ZXIgdGhlIG5leHQgcm93LlxuICAgICAgICAgIC8vIERvbid0IGJ1YmJsZSBwcm9wZXJ0aWVzIGluIHRoaXMgY2FzZS5cblxuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9XG5cbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTY29wZUNvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgIGNhc2UgTGVnYWN5SGlkZGVuQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBwb3BSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHZhciBfbmV4dFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgdmFyIG5leHRJc0hpZGRlbiA9IF9uZXh0U3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgX3ByZXZTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICB2YXIgcHJldklzSGlkZGVuID0gX3ByZXZTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICAgIGlmIChwcmV2SXNIaWRkZW4gIT09IG5leHRJc0hpZGRlbiAmJiAoIC8vIExlZ2FjeUhpZGRlbiBkb2Vzbid0IGRvIGFueSBoaWRpbmcgXHUyMDE0IGl0IG9ubHkgcHJlLXJlbmRlcnMuXG4gICAgICAgICAgIWVuYWJsZUxlZ2FjeUhpZGRlbiApKSB7XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBWaXNpYmlsaXR5O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbmV4dElzSGlkZGVuIHx8ICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBEb24ndCBidWJibGUgcHJvcGVydGllcyBmb3IgaGlkZGVuIGNoaWxkcmVuIHVubGVzcyB3ZSdyZSByZW5kZXJpbmdcbiAgICAgICAgICAvLyBhdCBvZmZzY3JlZW4gcHJpb3JpdHkuXG4gICAgICAgICAgaWYgKGluY2x1ZGVzU29tZUxhbmUoc3VidHJlZVJlbmRlckxhbmVzLCBPZmZzY3JlZW5MYW5lKSkge1xuICAgICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgd2FzIGFuIGluc2VydGlvbiBvciB1cGRhdGUgaW4gdGhlIGhpZGRlbiBzdWJ0cmVlLlxuICAgICAgICAgICAgICAvLyBJZiBzbywgd2UgbmVlZCB0byBoaWRlIHRob3NlIG5vZGVzIGluIHRoZSBjb21taXQgcGhhc2UsIHNvXG4gICAgICAgICAgICAgIC8vIHNjaGVkdWxlIGEgdmlzaWJpbGl0eSBlZmZlY3QuXG4gICAgICAgICAgICAgIGlmICggd29ya0luUHJvZ3Jlc3Muc3VidHJlZUZsYWdzICYgKFBsYWNlbWVudCB8IFVwZGF0ZSkpIHtcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBWaXNpYmlsaXR5O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBDYWNoZUNvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgVHJhY2luZ01hcmtlckNvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gdW5pdCBvZiB3b3JrIHRhZyAoXCIgKyB3b3JrSW5Qcm9ncmVzcy50YWcgKyBcIikuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBcIiArICdSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG59XG5cbmZ1bmN0aW9uIHVud2luZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIC8vIE5vdGU6IFRoaXMgaW50ZW50aW9uYWxseSBkb2Vzbid0IGNoZWNrIGlmIHdlJ3JlIGh5ZHJhdGluZyBiZWNhdXNlIGNvbXBhcmluZ1xuICAvLyB0byB0aGUgY3VycmVudCB0cmVlIHByb3ZpZGVyIGZpYmVyIGlzIGp1c3QgYXMgZmFzdCBhbmQgbGVzcyBlcnJvci1wcm9uZS5cbiAgLy8gSWRlYWxseSB3ZSB3b3VsZCBoYXZlIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIHRoZSB3b3JrIGxvb3Agb25seVxuICAvLyBmb3IgaHlkcmF0aW9uLlxuICBwb3BUcmVlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgIHBvcENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZsYWdzID0gd29ya0luUHJvZ3Jlc3MuZmxhZ3M7XG5cbiAgICAgICAgaWYgKGZsYWdzICYgU2hvdWxkQ2FwdHVyZSkge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID0gZmxhZ3MgJiB+U2hvdWxkQ2FwdHVyZSB8IERpZENhcHR1cmU7XG5cbiAgICAgICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyQWN0dWFsRHVyYXRpb24od29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHJvb3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgICAgIHBvcEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICBwb3BUb3BMZXZlbENvbnRleHRPYmplY3Qod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXNldFdvcmtJblByb2dyZXNzVmVyc2lvbnMoKTtcbiAgICAgICAgdmFyIF9mbGFncyA9IHdvcmtJblByb2dyZXNzLmZsYWdzO1xuXG4gICAgICAgIGlmICgoX2ZsYWdzICYgU2hvdWxkQ2FwdHVyZSkgIT09IE5vRmxhZ3MgJiYgKF9mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgLy8gVGhlcmUgd2FzIGFuIGVycm9yIGR1cmluZyByZW5kZXIgdGhhdCB3YXNuJ3QgY2FwdHVyZWQgYnkgYSBzdXNwZW5zZVxuICAgICAgICAgIC8vIGJvdW5kYXJ5LiBEbyBhIHNlY29uZCBwYXNzIG9uIHRoZSByb290IHRvIHVubW91bnQgdGhlIGNoaWxkcmVuLlxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID0gX2ZsYWdzICYgflNob3VsZENhcHR1cmUgfCBEaWRDYXB0dXJlO1xuICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgfSAvLyBXZSB1bndvdW5kIHRvIHRoZSByb290IHdpdGhvdXQgY29tcGxldGluZyBpdC4gRXhpdC5cblxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICAvLyBUT0RPOiBwb3BIeWRyYXRpb25TdGF0ZVxuICAgICAgICBwb3BIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgdmFyIHN1c3BlbnNlU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gICAgICAgIGlmIChzdXNwZW5zZVN0YXRlICE9PSBudWxsICYmIHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhyZXcgaW4gbmV3bHkgbW91bnRlZCBkZWh5ZHJhdGVkIGNvbXBvbmVudC4gVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gJyArICdSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIF9mbGFnczIgPSB3b3JrSW5Qcm9ncmVzcy5mbGFncztcblxuICAgICAgICBpZiAoX2ZsYWdzMiAmIFNob3VsZENhcHR1cmUpIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IF9mbGFnczIgJiB+U2hvdWxkQ2FwdHVyZSB8IERpZENhcHR1cmU7IC8vIENhcHR1cmVkIGEgc3VzcGVuc2UgZWZmZWN0LiBSZS1yZW5kZXIgdGhlIGJvdW5kYXJ5LlxuXG4gICAgICAgICAgaWYgKCAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgICB0cmFuc2ZlckFjdHVhbER1cmF0aW9uKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBwb3BTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MpOyAvLyBTdXNwZW5zZUxpc3QgZG9lc24ndCBhY3R1YWxseSBjYXRjaCBhbnl0aGluZy4gSXQgc2hvdWxkJ3ZlIGJlZW5cbiAgICAgICAgLy8gY2F1Z2h0IGJ5IGEgbmVzdGVkIGJvdW5kYXJ5LiBJZiBub3QsIGl0IHNob3VsZCBidWJibGUgdGhyb3VnaC5cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHBvcEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgIHZhciBjb250ZXh0ID0gd29ya0luUHJvZ3Jlc3MudHlwZS5fY29udGV4dDtcbiAgICAgIHBvcFByb3ZpZGVyKGNvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgY2FzZSBMZWdhY3lIaWRkZW5Db21wb25lbnQ6XG4gICAgICBwb3BSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgQ2FjaGVDb21wb25lbnQ6XG5cbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVud2luZEludGVycnVwdGVkV29yayhjdXJyZW50LCBpbnRlcnJ1cHRlZFdvcmssIHJlbmRlckxhbmVzKSB7XG4gIC8vIE5vdGU6IFRoaXMgaW50ZW50aW9uYWxseSBkb2Vzbid0IGNoZWNrIGlmIHdlJ3JlIGh5ZHJhdGluZyBiZWNhdXNlIGNvbXBhcmluZ1xuICAvLyB0byB0aGUgY3VycmVudCB0cmVlIHByb3ZpZGVyIGZpYmVyIGlzIGp1c3QgYXMgZmFzdCBhbmQgbGVzcyBlcnJvci1wcm9uZS5cbiAgLy8gSWRlYWxseSB3ZSB3b3VsZCBoYXZlIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIHRoZSB3b3JrIGxvb3Agb25seVxuICAvLyBmb3IgaHlkcmF0aW9uLlxuICBwb3BUcmVlQ29udGV4dChpbnRlcnJ1cHRlZFdvcmspO1xuXG4gIHN3aXRjaCAoaW50ZXJydXB0ZWRXb3JrLnRhZykge1xuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBjaGlsZENvbnRleHRUeXBlcyA9IGludGVycnVwdGVkV29yay50eXBlLmNoaWxkQ29udGV4dFR5cGVzO1xuXG4gICAgICAgIGlmIChjaGlsZENvbnRleHRUeXBlcyAhPT0gbnVsbCAmJiBjaGlsZENvbnRleHRUeXBlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcG9wQ29udGV4dChpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAge1xuICAgICAgICB2YXIgcm9vdCA9IGludGVycnVwdGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgIHBvcEhvc3RDb250YWluZXIoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgICAgcG9wVG9wTGV2ZWxDb250ZXh0T2JqZWN0KGludGVycnVwdGVkV29yayk7XG4gICAgICAgIHJlc2V0V29ya0luUHJvZ3Jlc3NWZXJzaW9ucygpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wSG9zdENvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBwb3BIb3N0Q29udGFpbmVyKGludGVycnVwdGVkV29yayk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICBwb3BTdXNwZW5zZUNvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICBwb3BTdXNwZW5zZUNvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICB2YXIgY29udGV4dCA9IGludGVycnVwdGVkV29yay50eXBlLl9jb250ZXh0O1xuICAgICAgcG9wUHJvdmlkZXIoY29udGV4dCwgaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgY2FzZSBMZWdhY3lIaWRkZW5Db21wb25lbnQ6XG4gICAgICBwb3BSZW5kZXJMYW5lcyhpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgYnJlYWs7XG4gIH1cbn1cblxudmFyIGRpZFdhcm5BYm91dFVuZGVmaW5lZFNuYXBzaG90QmVmb3JlVXBkYXRlID0gbnVsbDtcblxue1xuICBkaWRXYXJuQWJvdXRVbmRlZmluZWRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9IG5ldyBTZXQoKTtcbn0gLy8gVXNlZCBkdXJpbmcgdGhlIGNvbW1pdCBwaGFzZSB0byB0cmFjayB0aGUgc3RhdGUgb2YgdGhlIE9mZnNjcmVlbiBjb21wb25lbnQgc3RhY2suXG4vLyBBbGxvd3MgdXMgdG8gYXZvaWQgdHJhdmVyc2luZyB0aGUgcmV0dXJuIHBhdGggdG8gZmluZCB0aGUgbmVhcmVzdCBPZmZzY3JlZW4gYW5jZXN0b3IuXG4vLyBPbmx5IHVzZWQgd2hlbiBlbmFibGVTdXNwZW5zZUxheW91dEVmZmVjdFNlbWFudGljcyBpcyBlbmFibGVkLlxuXG5cbnZhciBvZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4gPSBmYWxzZTtcbnZhciBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gZmFsc2U7XG52YXIgUG9zc2libHlXZWFrU2V0ID0gdHlwZW9mIFdlYWtTZXQgPT09ICdmdW5jdGlvbicgPyBXZWFrU2V0IDogU2V0O1xudmFyIG5leHRFZmZlY3QgPSBudWxsOyAvLyBVc2VkIGZvciBQcm9maWxpbmcgYnVpbGRzIHRvIHRyYWNrIHVwZGF0ZXJzLlxuXG52YXIgaW5Qcm9ncmVzc0xhbmVzID0gbnVsbDtcbnZhciBpblByb2dyZXNzUm9vdCA9IG51bGw7XG5mdW5jdGlvbiByZXBvcnRVbmNhdWdodEVycm9ySW5ERVYoZXJyb3IpIHtcbiAgLy8gV3JhcHBpbmcgZWFjaCBzbWFsbCBwYXJ0IG9mIHRoZSBjb21taXQgcGhhc2UgaW50byBhIGd1YXJkZWRcbiAgLy8gY2FsbGJhY2sgaXMgYSBiaXQgdG9vIHNsb3cgKGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzIxNjY2KS5cbiAgLy8gQnV0IHdlIHJlbHkgb24gaXQgdG8gc3VyZmFjZSBlcnJvcnMgdG8gREVWIHRvb2xzIGxpa2Ugb3ZlcmxheXNcbiAgLy8gKGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMjE3MTIpLlxuICAvLyBBcyBhIGNvbXByb21pc2UsIHJldGhyb3cgb25seSBjYXVnaHQgZXJyb3JzIGluIGEgZ3VhcmQuXG4gIHtcbiAgICBpbnZva2VHdWFyZGVkQ2FsbGJhY2sobnVsbCwgZnVuY3Rpb24gKCkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG4gICAgY2xlYXJDYXVnaHRFcnJvcigpO1xuICB9XG59XG5cbnZhciBjYWxsQ29tcG9uZW50V2lsbFVubW91bnRXaXRoVGltZXIgPSBmdW5jdGlvbiAoY3VycmVudCwgaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gIGluc3RhbmNlLnN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuXG4gIGlmICggY3VycmVudC5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICB0cnkge1xuICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVubW91bnQoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oY3VycmVudCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVbm1vdW50KCk7XG4gIH1cbn07IC8vIENhcHR1cmUgZXJyb3JzIHNvIHRoZXkgZG9uJ3QgaW50ZXJydXB0IG1vdW50aW5nLlxuXG5cbmZ1bmN0aW9uIHNhZmVseUNhbGxDb21taXRIb29rTGF5b3V0RWZmZWN0TGlzdE1vdW50KGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpIHtcbiAgdHJ5IHtcbiAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KExheW91dCwgY3VycmVudCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IpO1xuICB9XG59IC8vIENhcHR1cmUgZXJyb3JzIHNvIHRoZXkgZG9uJ3QgaW50ZXJydXB0IHVubW91bnRpbmcuXG5cblxuZnVuY3Rpb24gc2FmZWx5Q2FsbENvbXBvbmVudFdpbGxVbm1vdW50KGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGluc3RhbmNlKSB7XG4gIHRyeSB7XG4gICAgY2FsbENvbXBvbmVudFdpbGxVbm1vdW50V2l0aFRpbWVyKGN1cnJlbnQsIGluc3RhbmNlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvcik7XG4gIH1cbn0gLy8gQ2FwdHVyZSBlcnJvcnMgc28gdGhleSBkb24ndCBpbnRlcnJ1cHQgbW91bnRpbmcuXG5cblxuZnVuY3Rpb24gc2FmZWx5Q2FsbENvbXBvbmVudERpZE1vdW50KGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGluc3RhbmNlKSB7XG4gIHRyeSB7XG4gICAgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvcik7XG4gIH1cbn0gLy8gQ2FwdHVyZSBlcnJvcnMgc28gdGhleSBkb24ndCBpbnRlcnJ1cHQgbW91bnRpbmcuXG5cblxuZnVuY3Rpb24gc2FmZWx5QXR0YWNoUmVmKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpIHtcbiAgdHJ5IHtcbiAgICBjb21taXRBdHRhY2hSZWYoY3VycmVudCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNhZmVseURldGFjaFJlZihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKSB7XG4gIHZhciByZWYgPSBjdXJyZW50LnJlZjtcblxuICBpZiAocmVmICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciByZXRWYWw7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChlbmFibGVQcm9maWxlclRpbWVyICYmIGVuYWJsZVByb2ZpbGVyQ29tbWl0SG9va3MgJiYgY3VycmVudC5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgcmV0VmFsID0gcmVmKG51bGwpO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihjdXJyZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0VmFsID0gcmVmKG51bGwpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvcik7XG4gICAgICB9XG5cbiAgICAgIHtcbiAgICAgICAgaWYgKHR5cGVvZiByZXRWYWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBlcnJvcignVW5leHBlY3RlZCByZXR1cm4gdmFsdWUgZnJvbSBhIGNhbGxiYWNrIHJlZiBpbiAlcy4gJyArICdBIGNhbGxiYWNrIHJlZiBzaG91bGQgbm90IHJldHVybiBhIGZ1bmN0aW9uLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoY3VycmVudCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2FmZWx5Q2FsbERlc3Ryb3koY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVzdHJveSkge1xuICB0cnkge1xuICAgIGRlc3Ryb3koKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvcik7XG4gIH1cbn1cblxudmFyIGZvY3VzZWRJbnN0YW5jZUhhbmRsZSA9IG51bGw7XG52YXIgc2hvdWxkRmlyZUFmdGVyQWN0aXZlSW5zdGFuY2VCbHVyID0gZmFsc2U7XG5mdW5jdGlvbiBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmlyc3RDaGlsZCkge1xuICBmb2N1c2VkSW5zdGFuY2VIYW5kbGUgPSBwcmVwYXJlRm9yQ29tbWl0KHJvb3QuY29udGFpbmVySW5mbyk7XG4gIG5leHRFZmZlY3QgPSBmaXJzdENoaWxkO1xuICBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHNfYmVnaW4oKTsgLy8gV2Ugbm8gbG9uZ2VyIG5lZWQgdG8gdHJhY2sgdGhlIGFjdGl2ZSBpbnN0YW5jZSBmaWJlclxuXG4gIHZhciBzaG91bGRGaXJlID0gc2hvdWxkRmlyZUFmdGVyQWN0aXZlSW5zdGFuY2VCbHVyO1xuICBzaG91bGRGaXJlQWZ0ZXJBY3RpdmVJbnN0YW5jZUJsdXIgPSBmYWxzZTtcbiAgZm9jdXNlZEluc3RhbmNlSGFuZGxlID0gbnVsbDtcbiAgcmV0dXJuIHNob3VsZEZpcmU7XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c19iZWdpbigpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0OyAvLyBUaGlzIHBoYXNlIGlzIG9ubHkgdXNlZCBmb3IgYmVmb3JlQWN0aXZlSW5zdGFuY2VCbHVyLlxuXG4gICAgdmFyIGNoaWxkID0gZmliZXIuY2hpbGQ7XG5cbiAgICBpZiAoKGZpYmVyLnN1YnRyZWVGbGFncyAmIEJlZm9yZU11dGF0aW9uTWFzaykgIT09IE5vRmxhZ3MgJiYgY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGNoaWxkLnJldHVybiA9IGZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IGNoaWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHNfY29tcGxldGUoKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzX2NvbXBsZXRlKCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG4gICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHNPbkZpYmVyKGZpYmVyKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgIH1cblxuICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgdmFyIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nO1xuXG4gICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgIHNpYmxpbmcucmV0dXJuID0gZmliZXIucmV0dXJuO1xuICAgICAgbmV4dEVmZmVjdCA9IHNpYmxpbmc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbmV4dEVmZmVjdCA9IGZpYmVyLnJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHNPbkZpYmVyKGZpbmlzaGVkV29yaykge1xuICB2YXIgY3VycmVudCA9IGZpbmlzaGVkV29yay5hbHRlcm5hdGU7XG4gIHZhciBmbGFncyA9IGZpbmlzaGVkV29yay5mbGFncztcblxuICBpZiAoKGZsYWdzICYgU25hcHNob3QpICE9PSBOb0ZsYWdzKSB7XG4gICAgc2V0Q3VycmVudEZpYmVyKGZpbmlzaGVkV29yayk7XG5cbiAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBwcmV2UHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gICAgICAgICAgICB2YXIgcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTsgLy8gV2UgY291bGQgdXBkYXRlIGluc3RhbmNlIHByb3BzIGFuZCBzdGF0ZSBoZXJlLFxuICAgICAgICAgICAgLy8gYnV0IGluc3RlYWQgd2UgcmVseSBvbiB0aGVtIGJlaW5nIHNldCBkdXJpbmcgbGFzdCByZW5kZXIuXG4gICAgICAgICAgICAvLyBUT0RPOiByZXZpc2l0IHRoaXMgd2hlbiB3ZSBpbXBsZW1lbnQgcmVzdW1pbmcuXG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWYgKGZpbmlzaGVkV29yay50eXBlID09PSBmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgJiYgIWRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UucHJvcHMgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzKSB7XG4gICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgcHJvcHMgdG8gbWF0Y2ggbWVtb2l6ZWQgcHJvcHMgYmVmb3JlICcgKyAnZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnByb3BzYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnN0YXRlICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHN0YXRlIHRvIG1hdGNoIG1lbW9pemVkIHN0YXRlIGJlZm9yZSAnICsgJ2dldFNuYXBzaG90QmVmb3JlVXBkYXRlLiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5zdGF0ZWAuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgc25hcHNob3QgPSBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgPT09IGZpbmlzaGVkV29yay50eXBlID8gcHJldlByb3BzIDogcmVzb2x2ZURlZmF1bHRQcm9wcyhmaW5pc2hlZFdvcmsudHlwZSwgcHJldlByb3BzKSwgcHJldlN0YXRlKTtcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB2YXIgZGlkV2FyblNldCA9IGRpZFdhcm5BYm91dFVuZGVmaW5lZFNuYXBzaG90QmVmb3JlVXBkYXRlO1xuXG4gICAgICAgICAgICAgIGlmIChzbmFwc2hvdCA9PT0gdW5kZWZpbmVkICYmICFkaWRXYXJuU2V0LmhhcyhmaW5pc2hlZFdvcmsudHlwZSkpIHtcbiAgICAgICAgICAgICAgICBkaWRXYXJuU2V0LmFkZChmaW5pc2hlZFdvcmsudHlwZSk7XG5cbiAgICAgICAgICAgICAgICBlcnJvcignJXMuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKTogQSBzbmFwc2hvdCB2YWx1ZSAob3IgbnVsbCkgJyArICdtdXN0IGJlIHJldHVybmVkLiBZb3UgaGF2ZSByZXR1cm5lZCB1bmRlZmluZWQuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9IHNuYXBzaG90O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgcm9vdCA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgICAgICBjbGVhckNvbnRhaW5lcihyb290LmNvbnRhaW5lckluZm8pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBjYXNlIEluY29tcGxldGVDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgLy8gTm90aGluZyB0byBkbyBmb3IgdGhlc2UgY29tcG9uZW50IHR5cGVzXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIHVuaXQgb2Ygd29yayB0YWcgc2hvdWxkIG5vdCBoYXZlIHNpZGUtZWZmZWN0cy4gVGhpcyBlcnJvciBpcyAnICsgJ2xpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoZmxhZ3MsIGZpbmlzaGVkV29yaywgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcikge1xuICB2YXIgdXBkYXRlUXVldWUgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG4gIHZhciBsYXN0RWZmZWN0ID0gdXBkYXRlUXVldWUgIT09IG51bGwgPyB1cGRhdGVRdWV1ZS5sYXN0RWZmZWN0IDogbnVsbDtcblxuICBpZiAobGFzdEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaXJzdEVmZmVjdCA9IGxhc3RFZmZlY3QubmV4dDtcbiAgICB2YXIgZWZmZWN0ID0gZmlyc3RFZmZlY3Q7XG5cbiAgICBkbyB7XG4gICAgICBpZiAoKGVmZmVjdC50YWcgJiBmbGFncykgPT09IGZsYWdzKSB7XG4gICAgICAgIC8vIFVubW91bnRcbiAgICAgICAgdmFyIGRlc3Ryb3kgPSBlZmZlY3QuZGVzdHJveTtcbiAgICAgICAgZWZmZWN0LmRlc3Ryb3kgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKGRlc3Ryb3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBQYXNzaXZlJDEpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RhcnRlZChmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJiBMYXlvdXQpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgbWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdGFydGVkKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKChmbGFncyAmIEluc2VydGlvbikgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICBzZXRJc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2FmZWx5Q2FsbERlc3Ryb3koZmluaXNoZWRXb3JrLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZXN0cm95KTtcblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBJbnNlcnRpb24pICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgc2V0SXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0KGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoKGZsYWdzICYgUGFzc2l2ZSQxKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0b3BwZWQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYgTGF5b3V0KSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RvcHBlZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBlZmZlY3QgPSBlZmZlY3QubmV4dDtcbiAgICB9IHdoaWxlIChlZmZlY3QgIT09IGZpcnN0RWZmZWN0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KGZsYWdzLCBmaW5pc2hlZFdvcmspIHtcbiAgdmFyIHVwZGF0ZVF1ZXVlID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlO1xuICB2YXIgbGFzdEVmZmVjdCA9IHVwZGF0ZVF1ZXVlICE9PSBudWxsID8gdXBkYXRlUXVldWUubGFzdEVmZmVjdCA6IG51bGw7XG5cbiAgaWYgKGxhc3RFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmlyc3RFZmZlY3QgPSBsYXN0RWZmZWN0Lm5leHQ7XG4gICAgdmFyIGVmZmVjdCA9IGZpcnN0RWZmZWN0O1xuXG4gICAgZG8ge1xuICAgICAgaWYgKChlZmZlY3QudGFnICYgZmxhZ3MpID09PSBmbGFncykge1xuICAgICAgICB7XG4gICAgICAgICAgaWYgKChmbGFncyAmIFBhc3NpdmUkMSkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0YXJ0ZWQoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmIExheW91dCkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgbWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RhcnRlZChmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBNb3VudFxuXG5cbiAgICAgICAgdmFyIGNyZWF0ZSA9IGVmZmVjdC5jcmVhdGU7XG5cbiAgICAgICAge1xuICAgICAgICAgIGlmICgoZmxhZ3MgJiBJbnNlcnRpb24pICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgIHNldElzUnVubmluZ0luc2VydGlvbkVmZmVjdCh0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBlZmZlY3QuZGVzdHJveSA9IGNyZWF0ZSgpO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoKGZsYWdzICYgSW5zZXJ0aW9uKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICBzZXRJc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QoZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoKGZsYWdzICYgUGFzc2l2ZSQxKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RvcHBlZCgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYgTGF5b3V0KSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdG9wcGVkKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAge1xuICAgICAgICAgIHZhciBkZXN0cm95ID0gZWZmZWN0LmRlc3Ryb3k7XG5cbiAgICAgICAgICBpZiAoZGVzdHJveSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBkZXN0cm95ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YXIgaG9va05hbWUgPSB2b2lkIDA7XG5cbiAgICAgICAgICAgIGlmICgoZWZmZWN0LnRhZyAmIExheW91dCkgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICAgICAgaG9va05hbWUgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGVmZmVjdC50YWcgJiBJbnNlcnRpb24pICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgICAgIGhvb2tOYW1lID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBob29rTmFtZSA9ICd1c2VFZmZlY3QnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgYWRkZW5kdW0gPSB2b2lkIDA7XG5cbiAgICAgICAgICAgIGlmIChkZXN0cm95ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIGFkZGVuZHVtID0gJyBZb3UgcmV0dXJuZWQgbnVsbC4gSWYgeW91ciBlZmZlY3QgZG9lcyBub3QgcmVxdWlyZSBjbGVhbiAnICsgJ3VwLCByZXR1cm4gdW5kZWZpbmVkIChvciBub3RoaW5nKS4nO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGVzdHJveS50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIGFkZGVuZHVtID0gJ1xcblxcbkl0IGxvb2tzIGxpa2UgeW91IHdyb3RlICcgKyBob29rTmFtZSArICcoYXN5bmMgKCkgPT4gLi4uKSBvciByZXR1cm5lZCBhIFByb21pc2UuICcgKyAnSW5zdGVhZCwgd3JpdGUgdGhlIGFzeW5jIGZ1bmN0aW9uIGluc2lkZSB5b3VyIGVmZmVjdCAnICsgJ2FuZCBjYWxsIGl0IGltbWVkaWF0ZWx5OlxcblxcbicgKyBob29rTmFtZSArICcoKCkgPT4ge1xcbicgKyAnICBhc3luYyBmdW5jdGlvbiBmZXRjaERhdGEoKSB7XFxuJyArICcgICAgLy8gWW91IGNhbiBhd2FpdCBoZXJlXFxuJyArICcgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBNeUFQSS5nZXREYXRhKHNvbWVJZCk7XFxuJyArICcgICAgLy8gLi4uXFxuJyArICcgIH1cXG4nICsgJyAgZmV0Y2hEYXRhKCk7XFxuJyArIFwifSwgW3NvbWVJZF0pOyAvLyBPciBbXSBpZiBlZmZlY3QgZG9lc24ndCBuZWVkIHByb3BzIG9yIHN0YXRlXFxuXFxuXCIgKyAnTGVhcm4gbW9yZSBhYm91dCBkYXRhIGZldGNoaW5nIHdpdGggSG9va3M6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9ob29rcy1kYXRhLWZldGNoaW5nJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGFkZGVuZHVtID0gJyBZb3UgcmV0dXJuZWQ6ICcgKyBkZXN0cm95O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBlcnJvcignJXMgbXVzdCBub3QgcmV0dXJuIGFueXRoaW5nIGJlc2lkZXMgYSBmdW5jdGlvbiwgJyArICd3aGljaCBpcyB1c2VkIGZvciBjbGVhbi11cC4lcycsIGhvb2tOYW1lLCBhZGRlbmR1bSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGVmZmVjdCA9IGVmZmVjdC5uZXh0O1xuICAgIH0gd2hpbGUgKGVmZmVjdCAhPT0gZmlyc3RFZmZlY3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVFZmZlY3REdXJhdGlvbnMoZmluaXNoZWRSb290LCBmaW5pc2hlZFdvcmspIHtcbiAge1xuICAgIC8vIE9ubHkgUHJvZmlsZXJzIHdpdGggd29yayBpbiB0aGVpciBzdWJ0cmVlIHdpbGwgaGF2ZSBhbiBVcGRhdGUgZWZmZWN0IHNjaGVkdWxlZC5cbiAgICBpZiAoKGZpbmlzaGVkV29yay5mbGFncyAmIFVwZGF0ZSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgICAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBwYXNzaXZlRWZmZWN0RHVyYXRpb24gPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlLnBhc3NpdmVFZmZlY3REdXJhdGlvbjtcbiAgICAgICAgICAgIHZhciBfZmluaXNoZWRXb3JrJG1lbW9pemUgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcyxcbiAgICAgICAgICAgICAgICBpZCA9IF9maW5pc2hlZFdvcmskbWVtb2l6ZS5pZCxcbiAgICAgICAgICAgICAgICBvblBvc3RDb21taXQgPSBfZmluaXNoZWRXb3JrJG1lbW9pemUub25Qb3N0Q29tbWl0OyAvLyBUaGlzIHZhbHVlIHdpbGwgc3RpbGwgcmVmbGVjdCB0aGUgcHJldmlvdXMgY29tbWl0IHBoYXNlLlxuICAgICAgICAgICAgLy8gSXQgZG9lcyBub3QgZ2V0IHJlc2V0IHVudGlsIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBjb21taXQgcGhhc2UuXG5cbiAgICAgICAgICAgIHZhciBjb21taXRUaW1lID0gZ2V0Q29tbWl0VGltZSgpO1xuICAgICAgICAgICAgdmFyIHBoYXNlID0gZmluaXNoZWRXb3JrLmFsdGVybmF0ZSA9PT0gbnVsbCA/ICdtb3VudCcgOiAndXBkYXRlJztcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAoaXNDdXJyZW50VXBkYXRlTmVzdGVkKCkpIHtcbiAgICAgICAgICAgICAgICBwaGFzZSA9ICduZXN0ZWQtdXBkYXRlJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9uUG9zdENvbW1pdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICBvblBvc3RDb21taXQoaWQsIHBoYXNlLCBwYXNzaXZlRWZmZWN0RHVyYXRpb24sIGNvbW1pdFRpbWUpO1xuICAgICAgICAgICAgfSAvLyBCdWJibGUgdGltZXMgdG8gdGhlIG5leHQgbmVhcmVzdCBhbmNlc3RvciBQcm9maWxlci5cbiAgICAgICAgICAgIC8vIEFmdGVyIHdlIHByb2Nlc3MgdGhhdCBQcm9maWxlciwgd2UnbGwgYnViYmxlIGZ1cnRoZXIgdXAuXG5cblxuICAgICAgICAgICAgdmFyIHBhcmVudEZpYmVyID0gZmluaXNoZWRXb3JrLnJldHVybjtcblxuICAgICAgICAgICAgb3V0ZXI6IHdoaWxlIChwYXJlbnRGaWJlciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICBzd2l0Y2ggKHBhcmVudEZpYmVyLnRhZykge1xuICAgICAgICAgICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAgICAgICAgICB2YXIgcm9vdCA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgICAgIHJvb3QucGFzc2l2ZUVmZmVjdER1cmF0aW9uICs9IHBhc3NpdmVFZmZlY3REdXJhdGlvbjtcbiAgICAgICAgICAgICAgICAgIGJyZWFrIG91dGVyO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBQcm9maWxlcjpcbiAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnRTdGF0ZU5vZGUgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgICAgICAgICBwYXJlbnRTdGF0ZU5vZGUucGFzc2l2ZUVmZmVjdER1cmF0aW9uICs9IHBhc3NpdmVFZmZlY3REdXJhdGlvbjtcbiAgICAgICAgICAgICAgICAgIGJyZWFrIG91dGVyO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcGFyZW50RmliZXIgPSBwYXJlbnRGaWJlci5yZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0TGF5b3V0RWZmZWN0T25GaWJlcihmaW5pc2hlZFJvb3QsIGN1cnJlbnQsIGZpbmlzaGVkV29yaywgY29tbWl0dGVkTGFuZXMpIHtcbiAgaWYgKChmaW5pc2hlZFdvcmsuZmxhZ3MgJiBMYXlvdXRNYXNrKSAhPT0gTm9GbGFncykge1xuICAgIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGlmICggIW9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pIHtcbiAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgbGF5b3V0IGVmZmVjdHMgaGF2ZSBhbHJlYWR5IGJlZW4gZGVzdHJveWVkIChkdXJpbmcgbXV0YXRpb24gcGhhc2UpLlxuICAgICAgICAgICAgLy8gVGhpcyBpcyBkb25lIHRvIHByZXZlbnQgc2libGluZyBjb21wb25lbnQgZWZmZWN0cyBmcm9tIGludGVyZmVyaW5nIHdpdGggZWFjaCBvdGhlcixcbiAgICAgICAgICAgIC8vIGUuZy4gYSBkZXN0cm95IGZ1bmN0aW9uIGluIG9uZSBjb21wb25lbnQgc2hvdWxkIG5ldmVyIG92ZXJyaWRlIGEgcmVmIHNldFxuICAgICAgICAgICAgLy8gYnkgYSBjcmVhdGUgZnVuY3Rpb24gaW4gYW5vdGhlciBjb21wb25lbnQgZHVyaW5nIHRoZSBzYW1lIGNvbW1pdC5cbiAgICAgICAgICAgIGlmICggZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KExheW91dCB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KExheW91dCB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcblxuICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsuZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICAgIGlmICghb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikge1xuICAgICAgICAgICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIFdlIGNvdWxkIHVwZGF0ZSBpbnN0YW5jZSBwcm9wcyBhbmQgc3RhdGUgaGVyZSxcbiAgICAgICAgICAgICAgICAvLyBidXQgaW5zdGVhZCB3ZSByZWx5IG9uIHRoZW0gYmVpbmcgc2V0IGR1cmluZyBsYXN0IHJlbmRlci5cbiAgICAgICAgICAgICAgICAvLyBUT0RPOiByZXZpc2l0IHRoaXMgd2hlbiB3ZSBpbXBsZW1lbnQgcmVzdW1pbmcuXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWYgKGZpbmlzaGVkV29yay50eXBlID09PSBmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgJiYgIWRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnByb3BzICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcykge1xuICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBwcm9wcyB0byBtYXRjaCBtZW1vaXplZCBwcm9wcyBiZWZvcmUgJyArICdjb21wb25lbnREaWRNb3VudC4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5zdGF0ZSAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgc3RhdGUgdG8gbWF0Y2ggbWVtb2l6ZWQgc3RhdGUgYmVmb3JlICcgKyAnY29tcG9uZW50RGlkTW91bnQuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQoKTtcbiAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBwcmV2UHJvcHMgPSBmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgPT09IGZpbmlzaGVkV29yay50eXBlID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogcmVzb2x2ZURlZmF1bHRQcm9wcyhmaW5pc2hlZFdvcmsudHlwZSwgY3VycmVudC5tZW1vaXplZFByb3BzKTtcbiAgICAgICAgICAgICAgICB2YXIgcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlOyAvLyBXZSBjb3VsZCB1cGRhdGUgaW5zdGFuY2UgcHJvcHMgYW5kIHN0YXRlIGhlcmUsXG4gICAgICAgICAgICAgICAgLy8gYnV0IGluc3RlYWQgd2UgcmVseSBvbiB0aGVtIGJlaW5nIHNldCBkdXJpbmcgbGFzdCByZW5kZXIuXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogcmV2aXNpdCB0aGlzIHdoZW4gd2UgaW1wbGVtZW50IHJlc3VtaW5nLlxuXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWYgKGZpbmlzaGVkV29yay50eXBlID09PSBmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgJiYgIWRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnByb3BzICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcykge1xuICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBwcm9wcyB0byBtYXRjaCBtZW1vaXplZCBwcm9wcyBiZWZvcmUgJyArICdjb21wb25lbnREaWRVcGRhdGUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnByb3BzYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2Uuc3RhdGUgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHN0YXRlIHRvIG1hdGNoIG1lbW9pemVkIHN0YXRlIGJlZm9yZSAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMuc3RhdGVgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICggZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUsIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlKTtcbiAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSwgaW5zdGFuY2UuX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gLy8gVE9ETzogSSB0aGluayB0aGlzIGlzIG5vdyBhbHdheXMgbm9uLW51bGwgYnkgdGhlIHRpbWUgaXQgcmVhY2hlcyB0aGVcbiAgICAgICAgICAvLyBjb21taXQgcGhhc2UuIENvbnNpZGVyIHJlbW92aW5nIHRoZSB0eXBlIGNoZWNrLlxuXG5cbiAgICAgICAgICB2YXIgdXBkYXRlUXVldWUgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG5cbiAgICAgICAgICBpZiAodXBkYXRlUXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWYgKGZpbmlzaGVkV29yay50eXBlID09PSBmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgJiYgIWRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UucHJvcHMgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzKSB7XG4gICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgcHJvcHMgdG8gbWF0Y2ggbWVtb2l6ZWQgcHJvcHMgYmVmb3JlICcgKyAncHJvY2Vzc2luZyB0aGUgdXBkYXRlIHF1ZXVlLiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5wcm9wc2AuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5zdGF0ZSAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBzdGF0ZSB0byBtYXRjaCBtZW1vaXplZCBzdGF0ZSBiZWZvcmUgJyArICdwcm9jZXNzaW5nIHRoZSB1cGRhdGUgcXVldWUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IC8vIFdlIGNvdWxkIHVwZGF0ZSBpbnN0YW5jZSBwcm9wcyBhbmQgc3RhdGUgaGVyZSxcbiAgICAgICAgICAgIC8vIGJ1dCBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlbSBiZWluZyBzZXQgZHVyaW5nIGxhc3QgcmVuZGVyLlxuICAgICAgICAgICAgLy8gVE9ETzogcmV2aXNpdCB0aGlzIHdoZW4gd2UgaW1wbGVtZW50IHJlc3VtaW5nLlxuXG5cbiAgICAgICAgICAgIGNvbW1pdFVwZGF0ZVF1ZXVlKGZpbmlzaGVkV29yaywgdXBkYXRlUXVldWUsIGluc3RhbmNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICB7XG4gICAgICAgICAgLy8gVE9ETzogSSB0aGluayB0aGlzIGlzIG5vdyBhbHdheXMgbm9uLW51bGwgYnkgdGhlIHRpbWUgaXQgcmVhY2hlcyB0aGVcbiAgICAgICAgICAvLyBjb21taXQgcGhhc2UuIENvbnNpZGVyIHJlbW92aW5nIHRoZSB0eXBlIGNoZWNrLlxuICAgICAgICAgIHZhciBfdXBkYXRlUXVldWUgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG5cbiAgICAgICAgICBpZiAoX3VwZGF0ZVF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgX2luc3RhbmNlID0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKGZpbmlzaGVkV29yay5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay5jaGlsZC50YWcpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgICAgICAgICAgICBfaW5zdGFuY2UgPSBnZXRQdWJsaWNJbnN0YW5jZShmaW5pc2hlZFdvcmsuY2hpbGQuc3RhdGVOb2RlKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgICAgICAgICAgIF9pbnN0YW5jZSA9IGZpbmlzaGVkV29yay5jaGlsZC5zdGF0ZU5vZGU7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb21taXRVcGRhdGVRdWV1ZShmaW5pc2hlZFdvcmssIF91cGRhdGVRdWV1ZSwgX2luc3RhbmNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgX2luc3RhbmNlMiA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7IC8vIFJlbmRlcmVycyBtYXkgc2NoZWR1bGUgd29yayB0byBiZSBkb25lIGFmdGVyIGhvc3QgY29tcG9uZW50cyBhcmUgbW91bnRlZFxuICAgICAgICAgIC8vIChlZyBET00gcmVuZGVyZXIgbWF5IHNjaGVkdWxlIGF1dG8tZm9jdXMgZm9yIGlucHV0cyBhbmQgZm9ybSBjb250cm9scykuXG4gICAgICAgICAgLy8gVGhlc2UgZWZmZWN0cyBzaG91bGQgb25seSBiZSBjb21taXR0ZWQgd2hlbiBjb21wb25lbnRzIGFyZSBmaXJzdCBtb3VudGVkLFxuICAgICAgICAgIC8vIGFrYSB3aGVuIHRoZXJlIGlzIG5vIGN1cnJlbnQvYWx0ZXJuYXRlLlxuXG4gICAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwgJiYgZmluaXNoZWRXb3JrLmZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAgICB2YXIgdHlwZSA9IGZpbmlzaGVkV29yay50eXBlO1xuICAgICAgICAgICAgdmFyIHByb3BzID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHM7XG4gICAgICAgICAgICBjb21taXRNb3VudChfaW5zdGFuY2UyLCB0eXBlLCBwcm9wcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgICAge1xuICAgICAgICAgIC8vIFdlIGhhdmUgbm8gbGlmZS1jeWNsZXMgYXNzb2NpYXRlZCB3aXRoIHRleHQuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgICB7XG4gICAgICAgICAgLy8gV2UgaGF2ZSBubyBsaWZlLWN5Y2xlcyBhc3NvY2lhdGVkIHdpdGggcG9ydGFscy5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgICB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIF9maW5pc2hlZFdvcmskbWVtb2l6ZTIgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcyxcbiAgICAgICAgICAgICAgICBvbkNvbW1pdCA9IF9maW5pc2hlZFdvcmskbWVtb2l6ZTIub25Db21taXQsXG4gICAgICAgICAgICAgICAgb25SZW5kZXIgPSBfZmluaXNoZWRXb3JrJG1lbW9pemUyLm9uUmVuZGVyO1xuICAgICAgICAgICAgdmFyIGVmZmVjdER1cmF0aW9uID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZS5lZmZlY3REdXJhdGlvbjtcbiAgICAgICAgICAgIHZhciBjb21taXRUaW1lID0gZ2V0Q29tbWl0VGltZSgpO1xuICAgICAgICAgICAgdmFyIHBoYXNlID0gY3VycmVudCA9PT0gbnVsbCA/ICdtb3VudCcgOiAndXBkYXRlJztcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAoaXNDdXJyZW50VXBkYXRlTmVzdGVkKCkpIHtcbiAgICAgICAgICAgICAgICBwaGFzZSA9ICduZXN0ZWQtdXBkYXRlJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9uUmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIG9uUmVuZGVyKGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzLmlkLCBwaGFzZSwgZmluaXNoZWRXb3JrLmFjdHVhbER1cmF0aW9uLCBmaW5pc2hlZFdvcmsudHJlZUJhc2VEdXJhdGlvbiwgZmluaXNoZWRXb3JrLmFjdHVhbFN0YXJ0VGltZSwgY29tbWl0VGltZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvbkNvbW1pdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIG9uQ29tbWl0KGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzLmlkLCBwaGFzZSwgZWZmZWN0RHVyYXRpb24sIGNvbW1pdFRpbWUpO1xuICAgICAgICAgICAgICB9IC8vIFNjaGVkdWxlIGEgcGFzc2l2ZSBlZmZlY3QgZm9yIHRoaXMgUHJvZmlsZXIgdG8gY2FsbCBvblBvc3RDb21taXQgaG9va3MuXG4gICAgICAgICAgICAgIC8vIFRoaXMgZWZmZWN0IHNob3VsZCBiZSBzY2hlZHVsZWQgZXZlbiBpZiB0aGVyZSBpcyBubyBvblBvc3RDb21taXQgY2FsbGJhY2sgZm9yIHRoaXMgUHJvZmlsZXIsXG4gICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlIGVmZmVjdCBpcyBhbHNvIHdoZXJlIHRpbWVzIGJ1YmJsZSB0byBwYXJlbnQgUHJvZmlsZXJzLlxuXG5cbiAgICAgICAgICAgICAgZW5xdWV1ZVBlbmRpbmdQYXNzaXZlUHJvZmlsZXJFZmZlY3QoZmluaXNoZWRXb3JrKTsgLy8gUHJvcGFnYXRlIGxheW91dCBlZmZlY3QgZHVyYXRpb25zIHRvIHRoZSBuZXh0IG5lYXJlc3QgUHJvZmlsZXIgYW5jZXN0b3IuXG4gICAgICAgICAgICAgIC8vIERvIG5vdCByZXNldCB0aGVzZSB2YWx1ZXMgdW50aWwgdGhlIG5leHQgcmVuZGVyIHNvIERldlRvb2xzIGhhcyBhIGNoYW5jZSB0byByZWFkIHRoZW0gZmlyc3QuXG5cbiAgICAgICAgICAgICAgdmFyIHBhcmVudEZpYmVyID0gZmluaXNoZWRXb3JrLnJldHVybjtcblxuICAgICAgICAgICAgICBvdXRlcjogd2hpbGUgKHBhcmVudEZpYmVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChwYXJlbnRGaWJlci50YWcpIHtcbiAgICAgICAgICAgICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAgICAgICAgICAgIHZhciByb290ID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgICAgICAgICAgICByb290LmVmZmVjdER1cmF0aW9uICs9IGVmZmVjdER1cmF0aW9uO1xuICAgICAgICAgICAgICAgICAgICBicmVhayBvdXRlcjtcblxuICAgICAgICAgICAgICAgICAgY2FzZSBQcm9maWxlcjpcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmVudFN0YXRlTm9kZSA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50U3RhdGVOb2RlLmVmZmVjdER1cmF0aW9uICs9IGVmZmVjdER1cmF0aW9uO1xuICAgICAgICAgICAgICAgICAgICBicmVhayBvdXRlcjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLnJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBjb21taXRTdXNwZW5zZUh5ZHJhdGlvbkNhbGxiYWNrcyhmaW5pc2hlZFJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICBjYXNlIEluY29tcGxldGVDbGFzc0NvbXBvbmVudDpcbiAgICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6XG4gICAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgTGVnYWN5SGlkZGVuQ29tcG9uZW50OlxuICAgICAgY2FzZSBUcmFjaW5nTWFya2VyQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIHVuaXQgb2Ygd29yayB0YWcgc2hvdWxkIG5vdCBoYXZlIHNpZGUtZWZmZWN0cy4gVGhpcyBlcnJvciBpcyAnICsgJ2xpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxuXG4gIGlmICggIW9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pIHtcbiAgICB7XG4gICAgICBpZiAoZmluaXNoZWRXb3JrLmZsYWdzICYgUmVmKSB7XG4gICAgICAgIGNvbW1pdEF0dGFjaFJlZihmaW5pc2hlZFdvcmspO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZWFwcGVhckxheW91dEVmZmVjdHNPbkZpYmVyKG5vZGUpIHtcbiAgLy8gVHVybiBvbiBsYXlvdXQgZWZmZWN0cyBpbiBhIHRyZWUgdGhhdCBwcmV2aW91c2x5IGRpc2FwcGVhcmVkLlxuICAvLyBUT0RPIChPZmZzY3JlZW4pIENoZWNrOiBmbGFncyAmIExheW91dFN0YXRpY1xuICBzd2l0Y2ggKG5vZGUudGFnKSB7XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoIG5vZGUubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgIHNhZmVseUNhbGxDb21taXRIb29rTGF5b3V0RWZmZWN0TGlzdE1vdW50KG5vZGUsIG5vZGUucmV0dXJuKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24obm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNhZmVseUNhbGxDb21taXRIb29rTGF5b3V0RWZmZWN0TGlzdE1vdW50KG5vZGUsIG5vZGUucmV0dXJuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gbm9kZS5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHNhZmVseUNhbGxDb21wb25lbnREaWRNb3VudChub2RlLCBub2RlLnJldHVybiwgaW5zdGFuY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2FmZWx5QXR0YWNoUmVmKG5vZGUsIG5vZGUucmV0dXJuKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHNhZmVseUF0dGFjaFJlZihub2RlLCBub2RlLnJldHVybik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGhpZGVPclVuaGlkZUFsbENoaWxkcmVuKGZpbmlzaGVkV29yaywgaXNIaWRkZW4pIHtcbiAgLy8gT25seSBoaWRlIG9yIHVuaGlkZSB0aGUgdG9wLW1vc3QgaG9zdCBub2Rlcy5cbiAgdmFyIGhvc3RTdWJ0cmVlUm9vdCA9IG51bGw7XG5cbiAge1xuICAgIC8vIFdlIG9ubHkgaGF2ZSB0aGUgdG9wIEZpYmVyIHRoYXQgd2FzIGluc2VydGVkIGJ1dCB3ZSBuZWVkIHRvIHJlY3Vyc2UgZG93biBpdHNcbiAgICAvLyBjaGlsZHJlbiB0byBmaW5kIGFsbCB0aGUgdGVybWluYWwgbm9kZXMuXG4gICAgdmFyIG5vZGUgPSBmaW5pc2hlZFdvcms7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50KSB7XG4gICAgICAgIGlmIChob3N0U3VidHJlZVJvb3QgPT09IG51bGwpIHtcbiAgICAgICAgICBob3N0U3VidHJlZVJvb3QgPSBub2RlO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IG5vZGUuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgICBpZiAoaXNIaWRkZW4pIHtcbiAgICAgICAgICAgICAgaGlkZUluc3RhbmNlKGluc3RhbmNlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHVuaGlkZUluc3RhbmNlKG5vZGUuc3RhdGVOb2RlLCBub2RlLm1lbW9pemVkUHJvcHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobm9kZS50YWcgPT09IEhvc3RUZXh0KSB7XG4gICAgICAgIGlmIChob3N0U3VidHJlZVJvb3QgPT09IG51bGwpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIF9pbnN0YW5jZTMgPSBub2RlLnN0YXRlTm9kZTtcblxuICAgICAgICAgICAgaWYgKGlzSGlkZGVuKSB7XG4gICAgICAgICAgICAgIGhpZGVUZXh0SW5zdGFuY2UoX2luc3RhbmNlMyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB1bmhpZGVUZXh0SW5zdGFuY2UoX2luc3RhbmNlMywgbm9kZS5tZW1vaXplZFByb3BzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKChub2RlLnRhZyA9PT0gT2Zmc2NyZWVuQ29tcG9uZW50IHx8IG5vZGUudGFnID09PSBMZWdhY3lIaWRkZW5Db21wb25lbnQpICYmIG5vZGUubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbCAmJiBub2RlICE9PSBmaW5pc2hlZFdvcmspIDsgZWxzZSBpZiAobm9kZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUgPT09IGZpbmlzaGVkV29yaykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSBmaW5pc2hlZFdvcmspIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaG9zdFN1YnRyZWVSb290ID09PSBub2RlKSB7XG4gICAgICAgICAgaG9zdFN1YnRyZWVSb290ID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGhvc3RTdWJ0cmVlUm9vdCA9PT0gbm9kZSkge1xuICAgICAgICBob3N0U3VidHJlZVJvb3QgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRBdHRhY2hSZWYoZmluaXNoZWRXb3JrKSB7XG4gIHZhciByZWYgPSBmaW5pc2hlZFdvcmsucmVmO1xuXG4gIGlmIChyZWYgIT09IG51bGwpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuICAgIHZhciBpbnN0YW5jZVRvVXNlO1xuXG4gICAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgIGluc3RhbmNlVG9Vc2UgPSBnZXRQdWJsaWNJbnN0YW5jZShpbnN0YW5jZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpbnN0YW5jZVRvVXNlID0gaW5zdGFuY2U7XG4gICAgfSAvLyBNb3ZlZCBvdXRzaWRlIHRvIGVuc3VyZSBEQ0Ugd29ya3Mgd2l0aCB0aGlzIGZsYWdcblxuICAgIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgcmV0VmFsO1xuXG4gICAgICBpZiAoIGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgcmV0VmFsID0gcmVmKGluc3RhbmNlVG9Vc2UpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldFZhbCA9IHJlZihpbnN0YW5jZVRvVXNlKTtcbiAgICAgIH1cblxuICAgICAge1xuICAgICAgICBpZiAodHlwZW9mIHJldFZhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGVycm9yKCdVbmV4cGVjdGVkIHJldHVybiB2YWx1ZSBmcm9tIGEgY2FsbGJhY2sgcmVmIGluICVzLiAnICsgJ0EgY2FsbGJhY2sgcmVmIHNob3VsZCBub3QgcmV0dXJuIGEgZnVuY3Rpb24uJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB7XG4gICAgICAgIGlmICghcmVmLmhhc093blByb3BlcnR5KCdjdXJyZW50JykpIHtcbiAgICAgICAgICBlcnJvcignVW5leHBlY3RlZCByZWYgb2JqZWN0IHByb3ZpZGVkIGZvciAlcy4gJyArICdVc2UgZWl0aGVyIGEgcmVmLXNldHRlciBmdW5jdGlvbiBvciBSZWFjdC5jcmVhdGVSZWYoKS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlZi5jdXJyZW50ID0gaW5zdGFuY2VUb1VzZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGV0YWNoRmliZXJNdXRhdGlvbihmaWJlcikge1xuICAvLyBDdXQgb2ZmIHRoZSByZXR1cm4gcG9pbnRlciB0byBkaXNjb25uZWN0IGl0IGZyb20gdGhlIHRyZWUuXG4gIC8vIFRoaXMgZW5hYmxlcyB1cyB0byBkZXRlY3QgYW5kIHdhcm4gYWdhaW5zdCBzdGF0ZSB1cGRhdGVzIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuXG4gIC8vIEl0IGFsc28gcHJldmVudHMgZXZlbnRzIGZyb20gYnViYmxpbmcgZnJvbSB3aXRoaW4gZGlzY29ubmVjdGVkIGNvbXBvbmVudHMuXG4gIC8vXG4gIC8vIElkZWFsbHksIHdlIHNob3VsZCBhbHNvIGNsZWFyIHRoZSBjaGlsZCBwb2ludGVyIG9mIHRoZSBwYXJlbnQgYWx0ZXJuYXRlIHRvIGxldCB0aGlzXG4gIC8vIGdldCBHQzplZCBidXQgd2UgZG9uJ3Qga25vdyB3aGljaCBmb3Igc3VyZSB3aGljaCBwYXJlbnQgaXMgdGhlIGN1cnJlbnRcbiAgLy8gb25lIHNvIHdlJ2xsIHNldHRsZSBmb3IgR0M6aW5nIHRoZSBzdWJ0cmVlIG9mIHRoaXMgY2hpbGQuXG4gIC8vIFRoaXMgY2hpbGQgaXRzZWxmIHdpbGwgYmUgR0M6ZWQgd2hlbiB0aGUgcGFyZW50IHVwZGF0ZXMgdGhlIG5leHQgdGltZS5cbiAgLy9cbiAgLy8gTm90ZSB0aGF0IHdlIGNhbid0IGNsZWFyIGNoaWxkIG9yIHNpYmxpbmcgcG9pbnRlcnMgeWV0LlxuICAvLyBUaGV5J3JlIG5lZWRlZCBmb3IgcGFzc2l2ZSBlZmZlY3RzIGFuZCBmb3IgZmluZERPTU5vZGUuXG4gIC8vIFdlIGRlZmVyIHRob3NlIGZpZWxkcywgYW5kIGFsbCBvdGhlciBjbGVhbnVwLCB0byB0aGUgcGFzc2l2ZSBwaGFzZSAoc2VlIGRldGFjaEZpYmVyQWZ0ZXJFZmZlY3RzKS5cbiAgLy9cbiAgLy8gRG9uJ3QgcmVzZXQgdGhlIGFsdGVybmF0ZSB5ZXQsIGVpdGhlci4gV2UgbmVlZCB0aGF0IHNvIHdlIGNhbiBkZXRhY2ggdGhlXG4gIC8vIGFsdGVybmF0ZSdzIGZpZWxkcyBpbiB0aGUgcGFzc2l2ZSBwaGFzZS4gQ2xlYXJpbmcgdGhlIHJldHVybiBwb2ludGVyIGlzXG4gIC8vIHN1ZmZpY2llbnQgZm9yIGZpbmRET01Ob2RlIHNlbWFudGljcy5cbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgYWx0ZXJuYXRlLnJldHVybiA9IG51bGw7XG4gIH1cblxuICBmaWJlci5yZXR1cm4gPSBudWxsO1xufVxuXG5mdW5jdGlvbiBkZXRhY2hGaWJlckFmdGVyRWZmZWN0cyhmaWJlcikge1xuICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICBmaWJlci5hbHRlcm5hdGUgPSBudWxsO1xuICAgIGRldGFjaEZpYmVyQWZ0ZXJFZmZlY3RzKGFsdGVybmF0ZSk7XG4gIH0gLy8gTm90ZTogRGVmZW5zaXZlbHkgdXNpbmcgbmVnYXRpb24gaW5zdGVhZCBvZiA8IGluIGNhc2VcbiAgLy8gYGRlbGV0ZWRUcmVlQ2xlYW5VcExldmVsYCBpcyB1bmRlZmluZWQuXG5cblxuICB7XG4gICAgLy8gQ2xlYXIgY3ljbGljYWwgRmliZXIgZmllbGRzLiBUaGlzIGxldmVsIGFsb25lIGlzIGRlc2lnbmVkIHRvIHJvdWdobHlcbiAgICAvLyBhcHByb3hpbWF0ZSB0aGUgcGxhbm5lZCBGaWJlciByZWZhY3Rvci4gSW4gdGhhdCB3b3JsZCwgYHNldFN0YXRlYCB3aWxsIGJlXG4gICAgLy8gYm91bmQgdG8gYSBzcGVjaWFsIFwiaW5zdGFuY2VcIiBvYmplY3QgaW5zdGVhZCBvZiBhIEZpYmVyLiBUaGUgSW5zdGFuY2VcbiAgICAvLyBvYmplY3Qgd2lsbCBub3QgaGF2ZSBhbnkgb2YgdGhlc2UgZmllbGRzLiBJdCB3aWxsIG9ubHkgYmUgY29ubmVjdGVkIHRvXG4gICAgLy8gdGhlIGZpYmVyIHRyZWUgdmlhIGEgc2luZ2xlIGxpbmsgYXQgdGhlIHJvb3QuIFNvIGlmIHRoaXMgbGV2ZWwgYWxvbmUgaXNcbiAgICAvLyBzdWZmaWNpZW50IHRvIGZpeCBtZW1vcnkgaXNzdWVzLCB0aGF0IGJvZGVzIHdlbGwgZm9yIG91ciBwbGFucy5cbiAgICBmaWJlci5jaGlsZCA9IG51bGw7XG4gICAgZmliZXIuZGVsZXRpb25zID0gbnVsbDtcbiAgICBmaWJlci5zaWJsaW5nID0gbnVsbDsgLy8gVGhlIGBzdGF0ZU5vZGVgIGlzIGN5Y2xpY2FsIGJlY2F1c2Ugb24gaG9zdCBub2RlcyBpdCBwb2ludHMgdG8gdGhlIGhvc3RcbiAgICAvLyB0cmVlLCB3aGljaCBoYXMgaXRzIG93biBwb2ludGVycyB0byBjaGlsZHJlbiwgcGFyZW50cywgYW5kIHNpYmxpbmdzLlxuICAgIC8vIFRoZSBvdGhlciBob3N0IG5vZGVzIGFsc28gcG9pbnQgYmFjayB0byBmaWJlcnMsIHNvIHdlIHNob3VsZCBkZXRhY2ggdGhhdFxuICAgIC8vIG9uZSwgdG9vLlxuXG4gICAgaWYgKGZpYmVyLnRhZyA9PT0gSG9zdENvbXBvbmVudCkge1xuICAgICAgdmFyIGhvc3RJbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgaWYgKGhvc3RJbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICBkZXRhY2hEZWxldGVkSW5zdGFuY2UoaG9zdEluc3RhbmNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmaWJlci5zdGF0ZU5vZGUgPSBudWxsOyAvLyBJJ20gaW50ZW50aW9uYWxseSBub3QgY2xlYXJpbmcgdGhlIGByZXR1cm5gIGZpZWxkIGluIHRoaXMgbGV2ZWwuIFdlXG4gICAgLy8gYWxyZWFkeSBkaXNjb25uZWN0IHRoZSBgcmV0dXJuYCBwb2ludGVyIGF0IHRoZSByb290IG9mIHRoZSBkZWxldGVkXG4gICAgLy8gc3VidHJlZSAoaW4gYGRldGFjaEZpYmVyTXV0YXRpb25gKS4gQmVzaWRlcywgYHJldHVybmAgYnkgaXRzZWxmIGlzIG5vdFxuICAgIC8vIGN5Y2xpY2FsIFx1MjAxNCBpdCdzIG9ubHkgY3ljbGljYWwgd2hlbiBjb21iaW5lZCB3aXRoIGBjaGlsZGAsIGBzaWJsaW5nYCwgYW5kXG4gICAgLy8gYGFsdGVybmF0ZWAuIEJ1dCB3ZSdsbCBjbGVhciBpdCBpbiB0aGUgbmV4dCBsZXZlbCBhbnl3YXksIGp1c3QgaW4gY2FzZS5cblxuICAgIHtcbiAgICAgIGZpYmVyLl9kZWJ1Z093bmVyID0gbnVsbDtcbiAgICB9XG5cbiAgICB7XG4gICAgICAvLyBUaGVvcmV0aWNhbGx5LCBub3RoaW5nIGluIGhlcmUgc2hvdWxkIGJlIG5lY2Vzc2FyeSwgYmVjYXVzZSB3ZSBhbHJlYWR5XG4gICAgICAvLyBkaXNjb25uZWN0ZWQgdGhlIGZpYmVyIGZyb20gdGhlIHRyZWUuIFNvIGV2ZW4gaWYgc29tZXRoaW5nIGxlYWtzIHRoaXNcbiAgICAgIC8vIHBhcnRpY3VsYXIgZmliZXIsIGl0IHdvbid0IGxlYWsgYW55dGhpbmcgZWxzZVxuICAgICAgLy9cbiAgICAgIC8vIFRoZSBwdXJwb3NlIG9mIHRoaXMgYnJhbmNoIGlzIHRvIGJlIHN1cGVyIGFnZ3Jlc3NpdmUgc28gd2UgY2FuIG1lYXN1cmVcbiAgICAgIC8vIGlmIHRoZXJlJ3MgYW55IGRpZmZlcmVuY2UgaW4gbWVtb3J5IGltcGFjdC4gSWYgdGhlcmUgaXMsIHRoYXQgY291bGRcbiAgICAgIC8vIGluZGljYXRlIGEgUmVhY3QgbGVhayB3ZSBkb24ndCBrbm93IGFib3V0LlxuICAgICAgZmliZXIucmV0dXJuID0gbnVsbDtcbiAgICAgIGZpYmVyLmRlcGVuZGVuY2llcyA9IG51bGw7XG4gICAgICBmaWJlci5tZW1vaXplZFByb3BzID0gbnVsbDtcbiAgICAgIGZpYmVyLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgICAgZmliZXIucGVuZGluZ1Byb3BzID0gbnVsbDtcbiAgICAgIGZpYmVyLnN0YXRlTm9kZSA9IG51bGw7IC8vIFRPRE86IE1vdmUgdG8gYGNvbW1pdFBhc3NpdmVVbm1vdW50SW5zaWRlRGVsZXRlZFRyZWVPbkZpYmVyYCBpbnN0ZWFkLlxuXG4gICAgICBmaWJlci51cGRhdGVRdWV1ZSA9IG51bGw7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldEhvc3RQYXJlbnRGaWJlcihmaWJlcikge1xuICB2YXIgcGFyZW50ID0gZmliZXIucmV0dXJuO1xuXG4gIHdoaWxlIChwYXJlbnQgIT09IG51bGwpIHtcbiAgICBpZiAoaXNIb3N0UGFyZW50KHBhcmVudCkpIHtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfVxuXG4gICAgcGFyZW50ID0gcGFyZW50LnJldHVybjtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gZmluZCBhIGhvc3QgcGFyZW50LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgJyArICdpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG59XG5cbmZ1bmN0aW9uIGlzSG9zdFBhcmVudChmaWJlcikge1xuICByZXR1cm4gZmliZXIudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IGZpYmVyLnRhZyA9PT0gSG9zdFJvb3QgfHwgZmliZXIudGFnID09PSBIb3N0UG9ydGFsO1xufVxuXG5mdW5jdGlvbiBnZXRIb3N0U2libGluZyhmaWJlcikge1xuICAvLyBXZSdyZSBnb2luZyB0byBzZWFyY2ggZm9yd2FyZCBpbnRvIHRoZSB0cmVlIHVudGlsIHdlIGZpbmQgYSBzaWJsaW5nIGhvc3RcbiAgLy8gbm9kZS4gVW5mb3J0dW5hdGVseSwgaWYgbXVsdGlwbGUgaW5zZXJ0aW9ucyBhcmUgZG9uZSBpbiBhIHJvdyB3ZSBoYXZlIHRvXG4gIC8vIHNlYXJjaCBwYXN0IHRoZW0uIFRoaXMgbGVhZHMgdG8gZXhwb25lbnRpYWwgc2VhcmNoIGZvciB0aGUgbmV4dCBzaWJsaW5nLlxuICAvLyBUT0RPOiBGaW5kIGEgbW9yZSBlZmZpY2llbnQgd2F5IHRvIGRvIHRoaXMuXG4gIHZhciBub2RlID0gZmliZXI7XG5cbiAgc2libGluZ3M6IHdoaWxlICh0cnVlKSB7XG4gICAgLy8gSWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcsIGxldCdzIHRyeSB0aGUgbmV4dCBzaWJsaW5nLlxuICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBpc0hvc3RQYXJlbnQobm9kZS5yZXR1cm4pKSB7XG4gICAgICAgIC8vIElmIHdlIHBvcCBvdXQgb2YgdGhlIHJvb3Qgb3IgaGl0IHRoZSBwYXJlbnQgdGhlIGZpYmVyIHdlIGFyZSB0aGVcbiAgICAgICAgLy8gbGFzdCBzaWJsaW5nLlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cblxuICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuXG4gICAgd2hpbGUgKG5vZGUudGFnICE9PSBIb3N0Q29tcG9uZW50ICYmIG5vZGUudGFnICE9PSBIb3N0VGV4dCAmJiBub2RlLnRhZyAhPT0gRGVoeWRyYXRlZEZyYWdtZW50KSB7XG4gICAgICAvLyBJZiBpdCBpcyBub3QgaG9zdCBub2RlIGFuZCwgd2UgbWlnaHQgaGF2ZSBhIGhvc3Qgbm9kZSBpbnNpZGUgaXQuXG4gICAgICAvLyBUcnkgdG8gc2VhcmNoIGRvd24gdW50aWwgd2UgZmluZCBvbmUuXG4gICAgICBpZiAobm9kZS5mbGFncyAmIFBsYWNlbWVudCkge1xuICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgY2hpbGQsIHRyeSB0aGUgc2libGluZ3MgaW5zdGVhZC5cbiAgICAgICAgY29udGludWUgc2libGluZ3M7XG4gICAgICB9IC8vIElmIHdlIGRvbid0IGhhdmUgYSBjaGlsZCwgdHJ5IHRoZSBzaWJsaW5ncyBpbnN0ZWFkLlxuICAgICAgLy8gV2UgYWxzbyBza2lwIHBvcnRhbHMgYmVjYXVzZSB0aGV5IGFyZSBub3QgcGFydCBvZiB0aGlzIGhvc3QgdHJlZS5cblxuXG4gICAgICBpZiAobm9kZS5jaGlsZCA9PT0gbnVsbCB8fCBub2RlLnRhZyA9PT0gSG9zdFBvcnRhbCkge1xuICAgICAgICBjb250aW51ZSBzaWJsaW5ncztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICB9XG4gICAgfSAvLyBDaGVjayBpZiB0aGlzIGhvc3Qgbm9kZSBpcyBzdGFibGUgb3IgYWJvdXQgdG8gYmUgcGxhY2VkLlxuXG5cbiAgICBpZiAoIShub2RlLmZsYWdzICYgUGxhY2VtZW50KSkge1xuICAgICAgLy8gRm91bmQgaXQhXG4gICAgICByZXR1cm4gbm9kZS5zdGF0ZU5vZGU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBsYWNlbWVudChmaW5pc2hlZFdvcmspIHtcblxuXG4gIHZhciBwYXJlbnRGaWJlciA9IGdldEhvc3RQYXJlbnRGaWJlcihmaW5pc2hlZFdvcmspOyAvLyBOb3RlOiB0aGVzZSB0d28gdmFyaWFibGVzICptdXN0KiBhbHdheXMgYmUgdXBkYXRlZCB0b2dldGhlci5cblxuICBzd2l0Y2ggKHBhcmVudEZpYmVyLnRhZykge1xuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHBhcmVudCA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICBpZiAocGFyZW50RmliZXIuZmxhZ3MgJiBDb250ZW50UmVzZXQpIHtcbiAgICAgICAgICAvLyBSZXNldCB0aGUgdGV4dCBjb250ZW50IG9mIHRoZSBwYXJlbnQgYmVmb3JlIGRvaW5nIGFueSBpbnNlcnRpb25zXG4gICAgICAgICAgcmVzZXRUZXh0Q29udGVudChwYXJlbnQpOyAvLyBDbGVhciBDb250ZW50UmVzZXQgZnJvbSB0aGUgZWZmZWN0IHRhZ1xuXG4gICAgICAgICAgcGFyZW50RmliZXIuZmxhZ3MgJj0gfkNvbnRlbnRSZXNldDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBiZWZvcmUgPSBnZXRIb3N0U2libGluZyhmaW5pc2hlZFdvcmspOyAvLyBXZSBvbmx5IGhhdmUgdGhlIHRvcCBGaWJlciB0aGF0IHdhcyBpbnNlcnRlZCBidXQgd2UgbmVlZCB0byByZWN1cnNlIGRvd24gaXRzXG4gICAgICAgIC8vIGNoaWxkcmVuIHRvIGZpbmQgYWxsIHRoZSB0ZXJtaW5hbCBub2Rlcy5cblxuICAgICAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGUoZmluaXNoZWRXb3JrLCBiZWZvcmUsIHBhcmVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICB7XG4gICAgICAgIHZhciBfcGFyZW50ID0gcGFyZW50RmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG5cbiAgICAgICAgdmFyIF9iZWZvcmUgPSBnZXRIb3N0U2libGluZyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZUludG9Db250YWluZXIoZmluaXNoZWRXb3JrLCBfYmVmb3JlLCBfcGFyZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lLW5vLWZhbGx0aHJvdWdoXG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGhvc3QgcGFyZW50IGZpYmVyLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgJyArICdpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlSW50b0NvbnRhaW5lcihub2RlLCBiZWZvcmUsIHBhcmVudCkge1xuICB2YXIgdGFnID0gbm9kZS50YWc7XG4gIHZhciBpc0hvc3QgPSB0YWcgPT09IEhvc3RDb21wb25lbnQgfHwgdGFnID09PSBIb3N0VGV4dDtcblxuICBpZiAoaXNIb3N0KSB7XG4gICAgdmFyIHN0YXRlTm9kZSA9IG5vZGUuc3RhdGVOb2RlO1xuXG4gICAgaWYgKGJlZm9yZSkge1xuICAgICAgaW5zZXJ0SW5Db250YWluZXJCZWZvcmUocGFyZW50LCBzdGF0ZU5vZGUsIGJlZm9yZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwcGVuZENoaWxkVG9Db250YWluZXIocGFyZW50LCBzdGF0ZU5vZGUpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0YWcgPT09IEhvc3RQb3J0YWwpIDsgZWxzZSB7XG4gICAgdmFyIGNoaWxkID0gbm9kZS5jaGlsZDtcblxuICAgIGlmIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlSW50b0NvbnRhaW5lcihjaGlsZCwgYmVmb3JlLCBwYXJlbnQpO1xuICAgICAgdmFyIHNpYmxpbmcgPSBjaGlsZC5zaWJsaW5nO1xuXG4gICAgICB3aGlsZSAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGVJbnRvQ29udGFpbmVyKHNpYmxpbmcsIGJlZm9yZSwgcGFyZW50KTtcbiAgICAgICAgc2libGluZyA9IHNpYmxpbmcuc2libGluZztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlKG5vZGUsIGJlZm9yZSwgcGFyZW50KSB7XG4gIHZhciB0YWcgPSBub2RlLnRhZztcbiAgdmFyIGlzSG9zdCA9IHRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCB0YWcgPT09IEhvc3RUZXh0O1xuXG4gIGlmIChpc0hvc3QpIHtcbiAgICB2YXIgc3RhdGVOb2RlID0gbm9kZS5zdGF0ZU5vZGU7XG5cbiAgICBpZiAoYmVmb3JlKSB7XG4gICAgICBpbnNlcnRCZWZvcmUocGFyZW50LCBzdGF0ZU5vZGUsIGJlZm9yZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwcGVuZENoaWxkKHBhcmVudCwgc3RhdGVOb2RlKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodGFnID09PSBIb3N0UG9ydGFsKSA7IGVsc2Uge1xuICAgIHZhciBjaGlsZCA9IG5vZGUuY2hpbGQ7XG5cbiAgICBpZiAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZShjaGlsZCwgYmVmb3JlLCBwYXJlbnQpO1xuICAgICAgdmFyIHNpYmxpbmcgPSBjaGlsZC5zaWJsaW5nO1xuXG4gICAgICB3aGlsZSAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGUoc2libGluZywgYmVmb3JlLCBwYXJlbnQpO1xuICAgICAgICBzaWJsaW5nID0gc2libGluZy5zaWJsaW5nO1xuICAgICAgfVxuICAgIH1cbiAgfVxufSAvLyBUaGVzZSBhcmUgdHJhY2tlZCBvbiB0aGUgc3RhY2sgYXMgd2UgcmVjdXJzaXZlbHkgdHJhdmVyc2UgYVxuLy8gZGVsZXRlZCBzdWJ0cmVlLlxuLy8gVE9ETzogVXBkYXRlIHRoZXNlIGR1cmluZyB0aGUgd2hvbGUgbXV0YXRpb24gcGhhc2UsIG5vdCBqdXN0IGR1cmluZ1xuLy8gYSBkZWxldGlvbi5cblxuXG52YXIgaG9zdFBhcmVudCA9IG51bGw7XG52YXIgaG9zdFBhcmVudElzQ29udGFpbmVyID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGNvbW1pdERlbGV0aW9uRWZmZWN0cyhyb290LCByZXR1cm5GaWJlciwgZGVsZXRlZEZpYmVyKSB7XG4gIHtcbiAgICAvLyBXZSBvbmx5IGhhdmUgdGhlIHRvcCBGaWJlciB0aGF0IHdhcyBkZWxldGVkIGJ1dCB3ZSBuZWVkIHRvIHJlY3Vyc2UgZG93biBpdHNcbiAgICAvLyBjaGlsZHJlbiB0byBmaW5kIGFsbCB0aGUgdGVybWluYWwgbm9kZXMuXG4gICAgLy8gUmVjdXJzaXZlbHkgZGVsZXRlIGFsbCBob3N0IG5vZGVzIGZyb20gdGhlIHBhcmVudCwgZGV0YWNoIHJlZnMsIGNsZWFuXG4gICAgLy8gdXAgbW91bnRlZCBsYXlvdXQgZWZmZWN0cywgYW5kIGNhbGwgY29tcG9uZW50V2lsbFVubW91bnQuXG4gICAgLy8gV2Ugb25seSBuZWVkIHRvIHJlbW92ZSB0aGUgdG9wbW9zdCBob3N0IGNoaWxkIGluIGVhY2ggYnJhbmNoLiBCdXQgdGhlbiB3ZVxuICAgIC8vIHN0aWxsIG5lZWQgdG8ga2VlcCB0cmF2ZXJzaW5nIHRvIHVubW91bnQgZWZmZWN0cywgcmVmcywgYW5kIGNXVS4gVE9ETzogV2VcbiAgICAvLyBjb3VsZCBzcGxpdCB0aGlzIGludG8gdHdvIHNlcGFyYXRlIHRyYXZlcnNhbHMgZnVuY3Rpb25zLCB3aGVyZSB0aGUgc2Vjb25kXG4gICAgLy8gb25lIGRvZXNuJ3QgaW5jbHVkZSBhbnkgcmVtb3ZlQ2hpbGQgbG9naWMuIFRoaXMgaXMgbWF5YmUgdGhlIHNhbWVcbiAgICAvLyBmdW5jdGlvbiBhcyBcImRpc2FwcGVhckxheW91dEVmZmVjdHNcIiAob3Igd2hhdGV2ZXIgdGhhdCB0dXJucyBpbnRvIGFmdGVyXG4gICAgLy8gdGhlIGxheW91dCBwaGFzZSBpcyByZWZhY3RvcmVkIHRvIHVzZSByZWN1cnNpb24pLlxuICAgIC8vIEJlZm9yZSBzdGFydGluZywgZmluZCB0aGUgbmVhcmVzdCBob3N0IHBhcmVudCBvbiB0aGUgc3RhY2sgc28gd2Uga25vd1xuICAgIC8vIHdoaWNoIGluc3RhbmNlL2NvbnRhaW5lciB0byByZW1vdmUgdGhlIGNoaWxkcmVuIGZyb20uXG4gICAgLy8gVE9ETzogSW5zdGVhZCBvZiBzZWFyY2hpbmcgdXAgdGhlIGZpYmVyIHJldHVybiBwYXRoIG9uIGV2ZXJ5IGRlbGV0aW9uLCB3ZVxuICAgIC8vIGNhbiB0cmFjayB0aGUgbmVhcmVzdCBob3N0IGNvbXBvbmVudCBvbiB0aGUgSlMgc3RhY2sgYXMgd2UgdHJhdmVyc2UgdGhlXG4gICAgLy8gdHJlZSBkdXJpbmcgdGhlIGNvbW1pdCBwaGFzZS4gVGhpcyB3b3VsZCBtYWtlIGluc2VydGlvbnMgZmFzdGVyLCB0b28uXG4gICAgdmFyIHBhcmVudCA9IHJldHVybkZpYmVyO1xuXG4gICAgZmluZFBhcmVudDogd2hpbGUgKHBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChwYXJlbnQudGFnKSB7XG4gICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBob3N0UGFyZW50ID0gcGFyZW50LnN0YXRlTm9kZTtcbiAgICAgICAgICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWsgZmluZFBhcmVudDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBob3N0UGFyZW50ID0gcGFyZW50LnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICAgICAgICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrIGZpbmRQYXJlbnQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBob3N0UGFyZW50ID0gcGFyZW50LnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICAgICAgICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrIGZpbmRQYXJlbnQ7XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChob3N0UGFyZW50ID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIGZpbmQgYSBob3N0IHBhcmVudC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5ICcgKyAnYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIGNvbW1pdERlbGV0aW9uRWZmZWN0c09uRmliZXIocm9vdCwgcmV0dXJuRmliZXIsIGRlbGV0ZWRGaWJlcik7XG4gICAgaG9zdFBhcmVudCA9IG51bGw7XG4gICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gZmFsc2U7XG4gIH1cblxuICBkZXRhY2hGaWJlck11dGF0aW9uKGRlbGV0ZWRGaWJlcik7XG59XG5cbmZ1bmN0aW9uIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBwYXJlbnQpIHtcbiAgLy8gVE9ETzogVXNlIGEgc3RhdGljIGZsYWcgdG8gc2tpcCB0cmVlcyB0aGF0IGRvbid0IGhhdmUgdW5tb3VudCBlZmZlY3RzXG4gIHZhciBjaGlsZCA9IHBhcmVudC5jaGlsZDtcblxuICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICBjb21taXREZWxldGlvbkVmZmVjdHNPbkZpYmVyKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgY2hpbGQpO1xuICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXREZWxldGlvbkVmZmVjdHNPbkZpYmVyKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKSB7XG4gIG9uQ29tbWl0VW5tb3VudChkZWxldGVkRmliZXIpOyAvLyBUaGUgY2FzZXMgaW4gdGhpcyBvdXRlciBzd2l0Y2ggbW9kaWZ5IHRoZSBzdGFjayBiZWZvcmUgdGhleSB0cmF2ZXJzZVxuICAvLyBpbnRvIHRoZWlyIHN1YnRyZWUuIFRoZXJlIGFyZSBzaW1wbGVyIGNhc2VzIGluIHRoZSBpbm5lciBzd2l0Y2hcbiAgLy8gdGhhdCBkb24ndCBtb2RpZnkgdGhlIHN0YWNrLlxuXG4gIHN3aXRjaCAoZGVsZXRlZEZpYmVyLnRhZykge1xuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCFvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuKSB7XG4gICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcik7XG4gICAgICAgIH0gLy8gSW50ZW50aW9uYWwgZmFsbHRocm91Z2ggdG8gbmV4dCBicmFuY2hcblxuICAgICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZS1uby1mYWxsdGhyb3VnaFxuXG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIHtcbiAgICAgICAgLy8gV2Ugb25seSBuZWVkIHRvIHJlbW92ZSB0aGUgbmVhcmVzdCBob3N0IGNoaWxkLiBTZXQgdGhlIGhvc3QgcGFyZW50XG4gICAgICAgIC8vIHRvIGBudWxsYCBvbiB0aGUgc3RhY2sgdG8gaW5kaWNhdGUgdGhhdCBuZXN0ZWQgY2hpbGRyZW4gZG9uJ3RcbiAgICAgICAgLy8gbmVlZCB0byBiZSByZW1vdmVkLlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIHByZXZIb3N0UGFyZW50ID0gaG9zdFBhcmVudDtcbiAgICAgICAgICB2YXIgcHJldkhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IGhvc3RQYXJlbnRJc0NvbnRhaW5lcjtcbiAgICAgICAgICBob3N0UGFyZW50ID0gbnVsbDtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgICBob3N0UGFyZW50ID0gcHJldkhvc3RQYXJlbnQ7XG4gICAgICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gcHJldkhvc3RQYXJlbnRJc0NvbnRhaW5lcjtcblxuICAgICAgICAgIGlmIChob3N0UGFyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBOb3cgdGhhdCBhbGwgdGhlIGNoaWxkIGVmZmVjdHMgaGF2ZSB1bm1vdW50ZWQsIHdlIGNhbiByZW1vdmUgdGhlXG4gICAgICAgICAgICAvLyBub2RlIGZyb20gdGhlIHRyZWUuXG4gICAgICAgICAgICBpZiAoaG9zdFBhcmVudElzQ29udGFpbmVyKSB7XG4gICAgICAgICAgICAgIHJlbW92ZUNoaWxkRnJvbUNvbnRhaW5lcihob3N0UGFyZW50LCBkZWxldGVkRmliZXIuc3RhdGVOb2RlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlbW92ZUNoaWxkKGhvc3RQYXJlbnQsIGRlbGV0ZWRGaWJlci5zdGF0ZU5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgRGVoeWRyYXRlZEZyYWdtZW50OlxuICAgICAge1xuICAgICAgICAvLyBEZWxldGUgdGhlIGRlaHlkcmF0ZWQgc3VzcGVuc2UgYm91bmRhcnkgYW5kIGFsbCBvZiBpdHMgY29udGVudC5cblxuXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoaG9zdFBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGhvc3RQYXJlbnRJc0NvbnRhaW5lcikge1xuICAgICAgICAgICAgICBjbGVhclN1c3BlbnNlQm91bmRhcnlGcm9tQ29udGFpbmVyKGhvc3RQYXJlbnQsIGRlbGV0ZWRGaWJlci5zdGF0ZU5vZGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY2xlYXJTdXNwZW5zZUJvdW5kYXJ5KGhvc3RQYXJlbnQsIGRlbGV0ZWRGaWJlci5zdGF0ZU5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIC8vIFdoZW4gd2UgZ28gaW50byBhIHBvcnRhbCwgaXQgYmVjb21lcyB0aGUgcGFyZW50IHRvIHJlbW92ZSBmcm9tLlxuICAgICAgICAgIHZhciBfcHJldkhvc3RQYXJlbnQgPSBob3N0UGFyZW50O1xuICAgICAgICAgIHZhciBfcHJldkhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IGhvc3RQYXJlbnRJc0NvbnRhaW5lcjtcbiAgICAgICAgICBob3N0UGFyZW50ID0gZGVsZXRlZEZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICAgICAgICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IHRydWU7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgICAgaG9zdFBhcmVudCA9IF9wcmV2SG9zdFBhcmVudDtcbiAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSBfcHJldkhvc3RQYXJlbnRJc0NvbnRhaW5lcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICghb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikge1xuICAgICAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IGRlbGV0ZWRGaWJlci51cGRhdGVRdWV1ZTtcblxuICAgICAgICAgIGlmICh1cGRhdGVRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGxhc3RFZmZlY3QgPSB1cGRhdGVRdWV1ZS5sYXN0RWZmZWN0O1xuXG4gICAgICAgICAgICBpZiAobGFzdEVmZmVjdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICB2YXIgZmlyc3RFZmZlY3QgPSBsYXN0RWZmZWN0Lm5leHQ7XG4gICAgICAgICAgICAgIHZhciBlZmZlY3QgPSBmaXJzdEVmZmVjdDtcblxuICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgdmFyIF9lZmZlY3QgPSBlZmZlY3QsXG4gICAgICAgICAgICAgICAgICAgIGRlc3Ryb3kgPSBfZWZmZWN0LmRlc3Ryb3ksXG4gICAgICAgICAgICAgICAgICAgIHRhZyA9IF9lZmZlY3QudGFnO1xuXG4gICAgICAgICAgICAgICAgaWYgKGRlc3Ryb3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgaWYgKCh0YWcgJiBJbnNlcnRpb24pICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgICAgICAgc2FmZWx5Q2FsbERlc3Ryb3koZGVsZXRlZEZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZXN0cm95KTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRhZyAmIExheW91dCkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgbWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdGFydGVkKGRlbGV0ZWRGaWJlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoIGRlbGV0ZWRGaWJlci5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgc2FmZWx5Q2FsbERlc3Ryb3koZGVsZXRlZEZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZXN0cm95KTtcbiAgICAgICAgICAgICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihkZWxldGVkRmliZXIpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHNhZmVseUNhbGxEZXN0cm95KGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVzdHJveSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgbWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdG9wcGVkKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBlZmZlY3QgPSBlZmZlY3QubmV4dDtcbiAgICAgICAgICAgICAgfSB3aGlsZSAoZWZmZWN0ICE9PSBmaXJzdEVmZmVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICghb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikge1xuICAgICAgICAgIHNhZmVseURldGFjaFJlZihkZWxldGVkRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpO1xuICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGRlbGV0ZWRGaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVbm1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBzYWZlbHlDYWxsQ29tcG9uZW50V2lsbFVubW91bnQoZGVsZXRlZEZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBpbnN0YW5jZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoIC8vIFRPRE86IFJlbW92ZSB0aGlzIGRlYWQgZmxhZ1xuICAgICAgICAgZGVsZXRlZEZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkge1xuICAgICAgICAgIC8vIElmIHRoaXMgb2Zmc2NyZWVuIGNvbXBvbmVudCBpcyBoaWRkZW4sIHdlIGFscmVhZHkgdW5tb3VudGVkIGl0LiBCZWZvcmVcbiAgICAgICAgICAvLyBkZWxldGluZyB0aGUgY2hpbGRyZW4sIHRyYWNrIHRoYXQgaXQncyBhbHJlYWR5IHVubW91bnRlZCBzbyB0aGF0IHdlXG4gICAgICAgICAgLy8gZG9uJ3QgYXR0ZW1wdCB0byB1bm1vdW50IHRoZSBlZmZlY3RzIGFnYWluLlxuICAgICAgICAgIC8vIFRPRE86IElmIHRoZSB0cmVlIGlzIGhpZGRlbiwgaW4gbW9zdCBjYXNlcyB3ZSBzaG91bGQgYmUgYWJsZSB0byBza2lwXG4gICAgICAgICAgLy8gb3ZlciB0aGUgbmVzdGVkIGNoaWxkcmVuIGVudGlyZWx5LiBBbiBleGNlcHRpb24gaXMgd2UgaGF2ZW4ndCB5ZXQgZm91bmRcbiAgICAgICAgICAvLyB0aGUgdG9wbW9zdCBob3N0IG5vZGUgdG8gZGVsZXRlLCB3aGljaCB3ZSBhbHJlYWR5IHRyYWNrIG9uIHRoZSBzdGFjay5cbiAgICAgICAgICAvLyBCdXQgdGhlIG90aGVyIGNhc2UgaXMgcG9ydGFscywgd2hpY2ggbmVlZCB0byBiZSBkZXRhY2hlZCBubyBtYXR0ZXIgaG93XG4gICAgICAgICAgLy8gZGVlcGx5IHRoZXkgYXJlIG5lc3RlZC4gV2Ugc2hvdWxkIHVzZSBhIHN1YnRyZWUgZmxhZyB0byB0cmFjayB3aGV0aGVyIGFcbiAgICAgICAgICAvLyBzdWJ0cmVlIGluY2x1ZGVzIGEgbmVzdGVkIHBvcnRhbC5cbiAgICAgICAgICB2YXIgcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuO1xuICAgICAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiB8fCBkZWxldGVkRmliZXIubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0U3VzcGVuc2VDYWxsYmFjayhmaW5pc2hlZFdvcmspIHtcbiAgLy8gVE9ETzogTW92ZSB0aGlzIHRvIHBhc3NpdmUgcGhhc2VcbiAgdmFyIG5ld1N0YXRlID0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGU7XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFN1c3BlbnNlSHlkcmF0aW9uQ2FsbGJhY2tzKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKSB7XG5cbiAgdmFyIG5ld1N0YXRlID0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKG5ld1N0YXRlID09PSBudWxsKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAgICAgIGlmIChwcmV2U3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIHN1c3BlbnNlSW5zdGFuY2UgPSBwcmV2U3RhdGUuZGVoeWRyYXRlZDtcblxuICAgICAgICBpZiAoc3VzcGVuc2VJbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGNvbW1pdEh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZUluc3RhbmNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhdHRhY2hTdXNwZW5zZVJldHJ5TGlzdGVuZXJzKGZpbmlzaGVkV29yaykge1xuICAvLyBJZiB0aGlzIGJvdW5kYXJ5IGp1c3QgdGltZWQgb3V0LCB0aGVuIGl0IHdpbGwgaGF2ZSBhIHNldCBvZiB3YWtlYWJsZXMuXG4gIC8vIEZvciBlYWNoIHdha2VhYmxlLCBhdHRhY2ggYSBsaXN0ZW5lciBzbyB0aGF0IHdoZW4gaXQgcmVzb2x2ZXMsIFJlYWN0XG4gIC8vIGF0dGVtcHRzIHRvIHJlLXJlbmRlciB0aGUgYm91bmRhcnkgaW4gdGhlIHByaW1hcnkgKHByZS10aW1lb3V0KSBzdGF0ZS5cbiAgdmFyIHdha2VhYmxlcyA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcblxuICBpZiAod2FrZWFibGVzICE9PSBudWxsKSB7XG4gICAgZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgICB2YXIgcmV0cnlDYWNoZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG5cbiAgICBpZiAocmV0cnlDYWNoZSA9PT0gbnVsbCkge1xuICAgICAgcmV0cnlDYWNoZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGUgPSBuZXcgUG9zc2libHlXZWFrU2V0KCk7XG4gICAgfVxuXG4gICAgd2FrZWFibGVzLmZvckVhY2goZnVuY3Rpb24gKHdha2VhYmxlKSB7XG4gICAgICAvLyBNZW1vaXplIHVzaW5nIHRoZSBib3VuZGFyeSBmaWJlciB0byBwcmV2ZW50IHJlZHVuZGFudCBsaXN0ZW5lcnMuXG4gICAgICB2YXIgcmV0cnkgPSByZXNvbHZlUmV0cnlXYWtlYWJsZS5iaW5kKG51bGwsIGZpbmlzaGVkV29yaywgd2FrZWFibGUpO1xuXG4gICAgICBpZiAoIXJldHJ5Q2FjaGUuaGFzKHdha2VhYmxlKSkge1xuICAgICAgICByZXRyeUNhY2hlLmFkZCh3YWtlYWJsZSk7XG5cbiAgICAgICAge1xuICAgICAgICAgIGlmIChpc0RldlRvb2xzUHJlc2VudCkge1xuICAgICAgICAgICAgaWYgKGluUHJvZ3Jlc3NMYW5lcyAhPT0gbnVsbCAmJiBpblByb2dyZXNzUm9vdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIHBlbmRpbmcgd29yayBzdGlsbCwgYXNzb2NpYXRlIHRoZSBvcmlnaW5hbCB1cGRhdGVycyB3aXRoIGl0LlxuICAgICAgICAgICAgICByZXN0b3JlUGVuZGluZ1VwZGF0ZXJzKGluUHJvZ3Jlc3NSb290LCBpblByb2dyZXNzTGFuZXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ0V4cGVjdGVkIGZpbmlzaGVkIHJvb3QgYW5kIGxhbmVzIHRvIGJlIHNldC4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB3YWtlYWJsZS50aGVuKHJldHJ5LCByZXRyeSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn0gLy8gVGhpcyBmdW5jdGlvbiBkZXRlY3RzIHdoZW4gYSBTdXNwZW5zZSBib3VuZGFyeSBnb2VzIGZyb20gdmlzaWJsZSB0byBoaWRkZW4uXG5mdW5jdGlvbiBjb21taXRNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrLCBjb21taXR0ZWRMYW5lcykge1xuICBpblByb2dyZXNzTGFuZXMgPSBjb21taXR0ZWRMYW5lcztcbiAgaW5Qcm9ncmVzc1Jvb3QgPSByb290O1xuICBzZXRDdXJyZW50RmliZXIoZmluaXNoZWRXb3JrKTtcbiAgY29tbWl0TXV0YXRpb25FZmZlY3RzT25GaWJlcihmaW5pc2hlZFdvcmssIHJvb3QpO1xuICBzZXRDdXJyZW50RmliZXIoZmluaXNoZWRXb3JrKTtcbiAgaW5Qcm9ncmVzc0xhbmVzID0gbnVsbDtcbiAgaW5Qcm9ncmVzc1Jvb3QgPSBudWxsO1xufVxuXG5mdW5jdGlvbiByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIHBhcmVudEZpYmVyLCBsYW5lcykge1xuICAvLyBEZWxldGlvbnMgZWZmZWN0cyBjYW4gYmUgc2NoZWR1bGVkIG9uIGFueSBmaWJlciB0eXBlLiBUaGV5IG5lZWQgdG8gaGFwcGVuXG4gIC8vIGJlZm9yZSB0aGUgY2hpbGRyZW4gZWZmZWN0cyBoYWUgZmlyZWQuXG4gIHZhciBkZWxldGlvbnMgPSBwYXJlbnRGaWJlci5kZWxldGlvbnM7XG5cbiAgaWYgKGRlbGV0aW9ucyAhPT0gbnVsbCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVsZXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2hpbGRUb0RlbGV0ZSA9IGRlbGV0aW9uc1tpXTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29tbWl0RGVsZXRpb25FZmZlY3RzKHJvb3QsIHBhcmVudEZpYmVyLCBjaGlsZFRvRGVsZXRlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGNoaWxkVG9EZWxldGUsIHBhcmVudEZpYmVyLCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHByZXZEZWJ1Z0ZpYmVyID0gZ2V0Q3VycmVudEZpYmVyKCk7XG5cbiAgaWYgKHBhcmVudEZpYmVyLnN1YnRyZWVGbGFncyAmIE11dGF0aW9uTWFzaykge1xuICAgIHZhciBjaGlsZCA9IHBhcmVudEZpYmVyLmNoaWxkO1xuXG4gICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBzZXRDdXJyZW50RmliZXIoY2hpbGQpO1xuICAgICAgY29tbWl0TXV0YXRpb25FZmZlY3RzT25GaWJlcihjaGlsZCwgcm9vdCk7XG4gICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgfVxuICB9XG5cbiAgc2V0Q3VycmVudEZpYmVyKHByZXZEZWJ1Z0ZpYmVyKTtcbn1cblxuZnVuY3Rpb24gY29tbWl0TXV0YXRpb25FZmZlY3RzT25GaWJlcihmaW5pc2hlZFdvcmssIHJvb3QsIGxhbmVzKSB7XG4gIHZhciBjdXJyZW50ID0gZmluaXNoZWRXb3JrLmFsdGVybmF0ZTtcbiAgdmFyIGZsYWdzID0gZmluaXNoZWRXb3JrLmZsYWdzOyAvLyBUaGUgZWZmZWN0IGZsYWcgc2hvdWxkIGJlIGNoZWNrZWQgKmFmdGVyKiB3ZSByZWZpbmUgdGhlIHR5cGUgb2YgZmliZXIsXG4gIC8vIGJlY2F1c2UgdGhlIGZpYmVyIHRhZyBpcyBtb3JlIHNwZWNpZmljLiBBbiBleGNlcHRpb24gaXMgYW55IGZsYWcgcmVsYXRlZFxuICAvLyB0byByZWNvbmNpbGF0aW9uLCBiZWNhdXNlIHRob3NlIGNhbiBiZSBzZXQgb24gYWxsIGZpYmVyIHR5cGVzLlxuXG4gIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgaWYgKGZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChJbnNlcnRpb24gfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7XG4gICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KEluc2VydGlvbiB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfSAvLyBMYXlvdXQgZWZmZWN0cyBhcmUgZGVzdHJveWVkIGR1cmluZyB0aGUgbXV0YXRpb24gcGhhc2Ugc28gdGhhdCBhbGxcbiAgICAgICAgICAvLyBkZXN0cm95IGZ1bmN0aW9ucyBmb3IgYWxsIGZpYmVycyBhcmUgY2FsbGVkIGJlZm9yZSBhbnkgY3JlYXRlIGZ1bmN0aW9ucy5cbiAgICAgICAgICAvLyBUaGlzIHByZXZlbnRzIHNpYmxpbmcgY29tcG9uZW50IGVmZmVjdHMgZnJvbSBpbnRlcmZlcmluZyB3aXRoIGVhY2ggb3RoZXIsXG4gICAgICAgICAgLy8gZS5nLiBhIGRlc3Ryb3kgZnVuY3Rpb24gaW4gb25lIGNvbXBvbmVudCBzaG91bGQgbmV2ZXIgb3ZlcnJpZGUgYSByZWYgc2V0XG4gICAgICAgICAgLy8gYnkgYSBjcmVhdGUgZnVuY3Rpb24gaW4gYW5vdGhlciBjb21wb25lbnQgZHVyaW5nIHRoZSBzYW1lIGNvbW1pdC5cblxuXG4gICAgICAgICAgaWYgKCBmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChMYXlvdXQgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KExheW91dCB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgaWYgKGZsYWdzICYgUmVmKSB7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHNhZmVseURldGFjaFJlZihjdXJyZW50LCBjdXJyZW50LnJldHVybik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFJlZikge1xuICAgICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzYWZlbHlEZXRhY2hSZWYoY3VycmVudCwgY3VycmVudC5yZXR1cm4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHtcbiAgICAgICAgICAvLyBUT0RPOiBDb250ZW50UmVzZXQgZ2V0cyBjbGVhcmVkIGJ5IHRoZSBjaGlsZHJlbiBkdXJpbmcgdGhlIGNvbW1pdFxuICAgICAgICAgIC8vIHBoYXNlLiBUaGlzIGlzIGEgcmVmYWN0b3IgaGF6YXJkIGJlY2F1c2UgaXQgbWVhbnMgd2UgbXVzdCByZWFkXG4gICAgICAgICAgLy8gZmxhZ3MgdGhlIGZsYWdzIGFmdGVyIGBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHNgIGhhcyBhbHJlYWR5IHJ1bjtcbiAgICAgICAgICAvLyB0aGUgb3JkZXIgbWF0dGVycy4gV2Ugc2hvdWxkIHJlZmFjdG9yIHNvIHRoYXQgQ29udGVudFJlc2V0IGRvZXMgbm90XG4gICAgICAgICAgLy8gcmVseSBvbiBtdXRhdGluZyB0aGUgZmxhZyBkdXJpbmcgY29tbWl0LiBMaWtlIGJ5IHNldHRpbmcgYSBmbGFnXG4gICAgICAgICAgLy8gZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UgaW5zdGVhZC5cbiAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLmZsYWdzICYgQ29udGVudFJlc2V0KSB7XG4gICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICByZXNldFRleHRDb250ZW50KGluc3RhbmNlKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChmbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgICAgdmFyIF9pbnN0YW5jZTQgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgICBpZiAoX2luc3RhbmNlNCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIENvbW1pdCB0aGUgd29yayBwcmVwYXJlZCBlYXJsaWVyLlxuICAgICAgICAgICAgICB2YXIgbmV3UHJvcHMgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wczsgLy8gRm9yIGh5ZHJhdGlvbiB3ZSByZXVzZSB0aGUgdXBkYXRlIHBhdGggYnV0IHdlIHRyZWF0IHRoZSBvbGRQcm9wc1xuICAgICAgICAgICAgICAvLyBhcyB0aGUgbmV3UHJvcHMuIFRoZSB1cGRhdGVQYXlsb2FkIHdpbGwgY29udGFpbiB0aGUgcmVhbCBjaGFuZ2UgaW5cbiAgICAgICAgICAgICAgLy8gdGhpcyBjYXNlLlxuXG4gICAgICAgICAgICAgIHZhciBvbGRQcm9wcyA9IGN1cnJlbnQgIT09IG51bGwgPyBjdXJyZW50Lm1lbW9pemVkUHJvcHMgOiBuZXdQcm9wcztcbiAgICAgICAgICAgICAgdmFyIHR5cGUgPSBmaW5pc2hlZFdvcmsudHlwZTsgLy8gVE9ETzogVHlwZSB0aGUgdXBkYXRlUXVldWUgdG8gYmUgc3BlY2lmaWMgdG8gaG9zdCBjb21wb25lbnRzLlxuXG4gICAgICAgICAgICAgIHZhciB1cGRhdGVQYXlsb2FkID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlO1xuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWUgPSBudWxsO1xuXG4gICAgICAgICAgICAgIGlmICh1cGRhdGVQYXlsb2FkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIGNvbW1pdFVwZGF0ZShfaW5zdGFuY2U0LCB1cGRhdGVQYXlsb2FkLCB0eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgaWYgKGZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKGZpbmlzaGVkV29yay5zdGF0ZU5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIHNob3VsZCBoYXZlIGEgdGV4dCBub2RlIGluaXRpYWxpemVkLiBUaGlzIGVycm9yIGlzIGxpa2VseSAnICsgJ2NhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciB0ZXh0SW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuICAgICAgICAgICAgdmFyIG5ld1RleHQgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wczsgLy8gRm9yIGh5ZHJhdGlvbiB3ZSByZXVzZSB0aGUgdXBkYXRlIHBhdGggYnV0IHdlIHRyZWF0IHRoZSBvbGRQcm9wc1xuICAgICAgICAgICAgLy8gYXMgdGhlIG5ld1Byb3BzLiBUaGUgdXBkYXRlUGF5bG9hZCB3aWxsIGNvbnRhaW4gdGhlIHJlYWwgY2hhbmdlIGluXG4gICAgICAgICAgICAvLyB0aGlzIGNhc2UuXG5cbiAgICAgICAgICAgIHZhciBvbGRUZXh0ID0gY3VycmVudCAhPT0gbnVsbCA/IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyA6IG5ld1RleHQ7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbW1pdFRleHRVcGRhdGUodGV4dEluc3RhbmNlLCBvbGRUZXh0LCBuZXdUZXh0KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgaWYgKGZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdmFyIHByZXZSb290U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgICAgICAgaWYgKHByZXZSb290U3RhdGUuaXNEZWh5ZHJhdGVkKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIGNvbW1pdEh5ZHJhdGVkQ29udGFpbmVyKHJvb3QuY29udGFpbmVySW5mbyk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuICAgICAgICB2YXIgb2Zmc2NyZWVuRmliZXIgPSBmaW5pc2hlZFdvcmsuY2hpbGQ7XG5cbiAgICAgICAgaWYgKG9mZnNjcmVlbkZpYmVyLmZsYWdzICYgVmlzaWJpbGl0eSkge1xuICAgICAgICAgIHZhciBvZmZzY3JlZW5JbnN0YW5jZSA9IG9mZnNjcmVlbkZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICB2YXIgbmV3U3RhdGUgPSBvZmZzY3JlZW5GaWJlci5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgIHZhciBpc0hpZGRlbiA9IG5ld1N0YXRlICE9PSBudWxsOyAvLyBUcmFjayB0aGUgY3VycmVudCBzdGF0ZSBvbiB0aGUgT2Zmc2NyZWVuIGluc3RhbmNlIHNvIHdlIGNhblxuICAgICAgICAgIC8vIHJlYWQgaXQgZHVyaW5nIGFuIGV2ZW50XG5cbiAgICAgICAgICBvZmZzY3JlZW5JbnN0YW5jZS5pc0hpZGRlbiA9IGlzSGlkZGVuO1xuXG4gICAgICAgICAgaWYgKGlzSGlkZGVuKSB7XG4gICAgICAgICAgICB2YXIgd2FzSGlkZGVuID0gb2Zmc2NyZWVuRmliZXIuYWx0ZXJuYXRlICE9PSBudWxsICYmIG9mZnNjcmVlbkZpYmVyLmFsdGVybmF0ZS5tZW1vaXplZFN0YXRlICE9PSBudWxsO1xuXG4gICAgICAgICAgICBpZiAoIXdhc0hpZGRlbikge1xuICAgICAgICAgICAgICAvLyBUT0RPOiBNb3ZlIHRvIHBhc3NpdmUgcGhhc2VcbiAgICAgICAgICAgICAgbWFya0NvbW1pdFRpbWVPZkZhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbW1pdFN1c3BlbnNlQ2FsbGJhY2soZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXR0YWNoU3VzcGVuc2VSZXRyeUxpc3RlbmVycyhmaW5pc2hlZFdvcmspO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBfd2FzSGlkZGVuID0gY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50Lm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgaWYgKCAvLyBUT0RPOiBSZW1vdmUgdGhpcyBkZWFkIGZsYWdcbiAgICAgICAgIGZpbmlzaGVkV29yay5tb2RlICYgQ29uY3VycmVudE1vZGUpIHtcbiAgICAgICAgICAvLyBCZWZvcmUgY29tbWl0dGluZyB0aGUgY2hpbGRyZW4sIHRyYWNrIG9uIHRoZSBzdGFjayB3aGV0aGVyIHRoaXNcbiAgICAgICAgICAvLyBvZmZzY3JlZW4gc3VidHJlZSB3YXMgYWxyZWFkeSBoaWRkZW4sIHNvIHRoYXQgd2UgZG9uJ3QgdW5tb3VudCB0aGVcbiAgICAgICAgICAvLyBlZmZlY3RzIGFnYWluLlxuICAgICAgICAgIHZhciBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47XG4gICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuIHx8IF93YXNIaWRkZW47XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIH1cblxuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpZiAoZmxhZ3MgJiBWaXNpYmlsaXR5KSB7XG4gICAgICAgICAgdmFyIF9vZmZzY3JlZW5JbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgICAgdmFyIF9uZXdTdGF0ZSA9IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlO1xuXG4gICAgICAgICAgdmFyIF9pc0hpZGRlbiA9IF9uZXdTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICAgIHZhciBvZmZzY3JlZW5Cb3VuZGFyeSA9IGZpbmlzaGVkV29yazsgLy8gVHJhY2sgdGhlIGN1cnJlbnQgc3RhdGUgb24gdGhlIE9mZnNjcmVlbiBpbnN0YW5jZSBzbyB3ZSBjYW5cbiAgICAgICAgICAvLyByZWFkIGl0IGR1cmluZyBhbiBldmVudFxuXG4gICAgICAgICAgX29mZnNjcmVlbkluc3RhbmNlLmlzSGlkZGVuID0gX2lzSGlkZGVuO1xuXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKF9pc0hpZGRlbikge1xuICAgICAgICAgICAgICBpZiAoIV93YXNIaWRkZW4pIHtcbiAgICAgICAgICAgICAgICBpZiAoKG9mZnNjcmVlbkJvdW5kYXJ5Lm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgICAgICAgICAgbmV4dEVmZmVjdCA9IG9mZnNjcmVlbkJvdW5kYXJ5O1xuICAgICAgICAgICAgICAgICAgdmFyIG9mZnNjcmVlbkNoaWxkID0gb2Zmc2NyZWVuQm91bmRhcnkuY2hpbGQ7XG5cbiAgICAgICAgICAgICAgICAgIHdoaWxlIChvZmZzY3JlZW5DaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBuZXh0RWZmZWN0ID0gb2Zmc2NyZWVuQ2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIGRpc2FwcGVhckxheW91dEVmZmVjdHNfYmVnaW4ob2Zmc2NyZWVuQ2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICBvZmZzY3JlZW5DaGlsZCA9IG9mZnNjcmVlbkNoaWxkLnNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAge1xuICAgICAgICAgICAgLy8gVE9ETzogVGhpcyBuZWVkcyB0byBydW4gd2hlbmV2ZXIgdGhlcmUncyBhbiBpbnNlcnRpb24gb3IgdXBkYXRlXG4gICAgICAgICAgICAvLyBpbnNpZGUgYSBoaWRkZW4gT2Zmc2NyZWVuIHRyZWUuXG4gICAgICAgICAgICBoaWRlT3JVbmhpZGVBbGxDaGlsZHJlbihvZmZzY3JlZW5Cb3VuZGFyeSwgX2lzSGlkZGVuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpZiAoZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICBhdHRhY2hTdXNwZW5zZVJldHJ5TGlzdGVuZXJzKGZpbmlzaGVkV29yayk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIFNjb3BlQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKSB7XG4gIC8vIFBsYWNlbWVudCBlZmZlY3RzIChpbnNlcnRpb25zLCByZW9yZGVycykgY2FuIGJlIHNjaGVkdWxlZCBvbiBhbnkgZmliZXJcbiAgLy8gdHlwZS4gVGhleSBuZWVkcyB0byBoYXBwZW4gYWZ0ZXIgdGhlIGNoaWxkcmVuIGVmZmVjdHMgaGF2ZSBmaXJlZCwgYnV0XG4gIC8vIGJlZm9yZSB0aGUgZWZmZWN0cyBvbiB0aGlzIGZpYmVyIGhhdmUgZmlyZWQuXG4gIHZhciBmbGFncyA9IGZpbmlzaGVkV29yay5mbGFncztcblxuICBpZiAoZmxhZ3MgJiBQbGFjZW1lbnQpIHtcbiAgICB0cnkge1xuICAgICAgY29tbWl0UGxhY2VtZW50KGZpbmlzaGVkV29yayk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgIH0gLy8gQ2xlYXIgdGhlIFwicGxhY2VtZW50XCIgZnJvbSBlZmZlY3QgdGFnIHNvIHRoYXQgd2Uga25vdyB0aGF0IHRoaXMgaXNcbiAgICAvLyBpbnNlcnRlZCwgYmVmb3JlIGFueSBsaWZlLWN5Y2xlcyBsaWtlIGNvbXBvbmVudERpZE1vdW50IGdldHMgY2FsbGVkLlxuICAgIC8vIFRPRE86IGZpbmRET01Ob2RlIGRvZXNuJ3QgcmVseSBvbiB0aGlzIGFueSBtb3JlIGJ1dCBpc01vdW50ZWQgZG9lc1xuICAgIC8vIGFuZCBpc01vdW50ZWQgaXMgZGVwcmVjYXRlZCBhbnl3YXkgc28gd2Ugc2hvdWxkIGJlIGFibGUgdG8ga2lsbCB0aGlzLlxuXG5cbiAgICBmaW5pc2hlZFdvcmsuZmxhZ3MgJj0gflBsYWNlbWVudDtcbiAgfVxuXG4gIGlmIChmbGFncyAmIEh5ZHJhdGluZykge1xuICAgIGZpbmlzaGVkV29yay5mbGFncyAmPSB+SHlkcmF0aW5nO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdExheW91dEVmZmVjdHMoZmluaXNoZWRXb3JrLCByb290LCBjb21taXR0ZWRMYW5lcykge1xuICBpblByb2dyZXNzTGFuZXMgPSBjb21taXR0ZWRMYW5lcztcbiAgaW5Qcm9ncmVzc1Jvb3QgPSByb290O1xuICBuZXh0RWZmZWN0ID0gZmluaXNoZWRXb3JrO1xuICBjb21taXRMYXlvdXRFZmZlY3RzX2JlZ2luKGZpbmlzaGVkV29yaywgcm9vdCwgY29tbWl0dGVkTGFuZXMpO1xuICBpblByb2dyZXNzTGFuZXMgPSBudWxsO1xuICBpblByb2dyZXNzUm9vdCA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGNvbW1pdExheW91dEVmZmVjdHNfYmVnaW4oc3VidHJlZVJvb3QsIHJvb3QsIGNvbW1pdHRlZExhbmVzKSB7XG4gIC8vIFN1c3BlbnNlIGxheW91dCBlZmZlY3RzIHNlbWFudGljcyBkb24ndCBjaGFuZ2UgZm9yIGxlZ2FjeSByb290cy5cbiAgdmFyIGlzTW9kZXJuUm9vdCA9IChzdWJ0cmVlUm9vdC5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG5cbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuICAgIHZhciBmaXJzdENoaWxkID0gZmliZXIuY2hpbGQ7XG5cbiAgICBpZiAoIGZpYmVyLnRhZyA9PT0gT2Zmc2NyZWVuQ29tcG9uZW50ICYmIGlzTW9kZXJuUm9vdCkge1xuICAgICAgLy8gS2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBPZmZzY3JlZW4gc3RhY2sncyBzdGF0ZS5cbiAgICAgIHZhciBpc0hpZGRlbiA9IGZpYmVyLm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG4gICAgICB2YXIgbmV3T2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuID0gaXNIaWRkZW4gfHwgb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuO1xuXG4gICAgICBpZiAobmV3T2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuKSB7XG4gICAgICAgIC8vIFRoZSBPZmZzY3JlZW4gdHJlZSBpcyBoaWRkZW4uIFNraXAgb3ZlciBpdHMgbGF5b3V0IGVmZmVjdHMuXG4gICAgICAgIGNvbW1pdExheW91dE1vdW50RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRPRE8gKE9mZnNjcmVlbikgQWxzbyBjaGVjazogc3VidHJlZUZsYWdzICYgTGF5b3V0TWFza1xuICAgICAgICB2YXIgY3VycmVudCA9IGZpYmVyLmFsdGVybmF0ZTtcbiAgICAgICAgdmFyIHdhc0hpZGRlbiA9IGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudC5tZW1vaXplZFN0YXRlICE9PSBudWxsO1xuICAgICAgICB2YXIgbmV3T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IHdhc0hpZGRlbiB8fCBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuO1xuICAgICAgICB2YXIgcHJldk9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiA9IG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbjtcbiAgICAgICAgdmFyIHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjsgLy8gVHJhdmVyc2UgdGhlIE9mZnNjcmVlbiBzdWJ0cmVlIHdpdGggdGhlIGN1cnJlbnQgT2Zmc2NyZWVuIGFzIHRoZSByb290LlxuXG4gICAgICAgIG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiA9IG5ld09mZnNjcmVlblN1YnRyZWVJc0hpZGRlbjtcbiAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IG5ld09mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47XG5cbiAgICAgICAgaWYgKG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gJiYgIXByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyB0aGUgcm9vdCBvZiBhIHJlYXBwZWFyaW5nIGJvdW5kYXJ5LiBUdXJuIGl0cyBsYXlvdXQgZWZmZWN0c1xuICAgICAgICAgIC8vIGJhY2sgb24uXG4gICAgICAgICAgbmV4dEVmZmVjdCA9IGZpYmVyO1xuICAgICAgICAgIHJlYXBwZWFyTGF5b3V0RWZmZWN0c19iZWdpbihmaWJlcik7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY2hpbGQgPSBmaXJzdENoaWxkO1xuXG4gICAgICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgIG5leHRFZmZlY3QgPSBjaGlsZDtcbiAgICAgICAgICBjb21taXRMYXlvdXRFZmZlY3RzX2JlZ2luKGNoaWxkLCAvLyBOZXcgcm9vdDsgYnViYmxlIGJhY2sgdXAgdG8gaGVyZSBhbmQgc3RvcC5cbiAgICAgICAgICByb290LCBjb21taXR0ZWRMYW5lcyk7XG4gICAgICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICAgICAgICB9IC8vIFJlc3RvcmUgT2Zmc2NyZWVuIHN0YXRlIGFuZCByZXN1bWUgaW4gb3VyLXByb2dyZXNzIHRyYXZlcnNhbC5cblxuXG4gICAgICAgIG5leHRFZmZlY3QgPSBmaWJlcjtcbiAgICAgICAgb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuID0gcHJldk9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbjtcbiAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuO1xuICAgICAgICBjb21taXRMYXlvdXRNb3VudEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QsIHJvb3QsIGNvbW1pdHRlZExhbmVzKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKChmaWJlci5zdWJ0cmVlRmxhZ3MgJiBMYXlvdXRNYXNrKSAhPT0gTm9GbGFncyAmJiBmaXJzdENoaWxkICE9PSBudWxsKSB7XG4gICAgICBmaXJzdENoaWxkLnJldHVybiA9IGZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IGZpcnN0Q2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbW1pdExheW91dE1vdW50RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRMYXlvdXRNb3VudEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QsIHJvb3QsIGNvbW1pdHRlZExhbmVzKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcblxuICAgIGlmICgoZmliZXIuZmxhZ3MgJiBMYXlvdXRNYXNrKSAhPT0gTm9GbGFncykge1xuICAgICAgdmFyIGN1cnJlbnQgPSBmaWJlci5hbHRlcm5hdGU7XG4gICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb21taXRMYXlvdXRFZmZlY3RPbkZpYmVyKHJvb3QsIGN1cnJlbnQsIGZpYmVyLCBjb21taXR0ZWRMYW5lcyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgICB9XG5cbiAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgfVxuXG4gICAgaWYgKGZpYmVyID09PSBzdWJ0cmVlUm9vdCkge1xuICAgICAgbmV4dEVmZmVjdCA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nO1xuXG4gICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgIHNpYmxpbmcucmV0dXJuID0gZmliZXIucmV0dXJuO1xuICAgICAgbmV4dEVmZmVjdCA9IHNpYmxpbmc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbmV4dEVmZmVjdCA9IGZpYmVyLnJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNhcHBlYXJMYXlvdXRFZmZlY3RzX2JlZ2luKHN1YnRyZWVSb290KSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcbiAgICB2YXIgZmlyc3RDaGlsZCA9IGZpYmVyLmNoaWxkOyAvLyBUT0RPIChPZmZzY3JlZW4pIENoZWNrOiBmbGFncyAmIChSZWZTdGF0aWMgfCBMYXlvdXRTdGF0aWMpXG5cbiAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGlmICggZmliZXIubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChMYXlvdXQsIGZpYmVyLCBmaWJlci5yZXR1cm4pO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZmliZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoTGF5b3V0LCBmaWJlciwgZmliZXIucmV0dXJuKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgLy8gVE9ETyAoT2Zmc2NyZWVuKSBDaGVjazogZmxhZ3MgJiBSZWZTdGF0aWNcbiAgICAgICAgICBzYWZlbHlEZXRhY2hSZWYoZmliZXIsIGZpYmVyLnJldHVybik7XG4gICAgICAgICAgdmFyIGluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVW5tb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgc2FmZWx5Q2FsbENvbXBvbmVudFdpbGxVbm1vdW50KGZpYmVyLCBmaWJlci5yZXR1cm4sIGluc3RhbmNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBzYWZlbHlEZXRhY2hSZWYoZmliZXIsIGZpYmVyLnJldHVybik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGFcbiAgICAgICAgICB2YXIgaXNIaWRkZW4gPSBmaWJlci5tZW1vaXplZFN0YXRlICE9PSBudWxsO1xuXG4gICAgICAgICAgaWYgKGlzSGlkZGVuKSB7XG4gICAgICAgICAgICAvLyBOZXN0ZWQgT2Zmc2NyZWVuIHRyZWUgaXMgYWxyZWFkeSBoaWRkZW4uIERvbid0IGRpc2FwcGVhclxuICAgICAgICAgICAgLy8gaXRzIGVmZmVjdHMuXG4gICAgICAgICAgICBkaXNhcHBlYXJMYXlvdXRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfSAvLyBUT0RPIChPZmZzY3JlZW4pIENoZWNrOiBzdWJ0cmVlRmxhZ3MgJiBMYXlvdXRTdGF0aWNcblxuXG4gICAgaWYgKGZpcnN0Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGZpcnN0Q2hpbGQucmV0dXJuID0gZmliZXI7XG4gICAgICBuZXh0RWZmZWN0ID0gZmlyc3RDaGlsZDtcbiAgICB9IGVsc2Uge1xuICAgICAgZGlzYXBwZWFyTGF5b3V0RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRpc2FwcGVhckxheW91dEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuXG4gICAgaWYgKGZpYmVyID09PSBzdWJ0cmVlUm9vdCkge1xuICAgICAgbmV4dEVmZmVjdCA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nO1xuXG4gICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgIHNpYmxpbmcucmV0dXJuID0gZmliZXIucmV0dXJuO1xuICAgICAgbmV4dEVmZmVjdCA9IHNpYmxpbmc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbmV4dEVmZmVjdCA9IGZpYmVyLnJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWFwcGVhckxheW91dEVmZmVjdHNfYmVnaW4oc3VidHJlZVJvb3QpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuICAgIHZhciBmaXJzdENoaWxkID0gZmliZXIuY2hpbGQ7XG5cbiAgICBpZiAoZmliZXIudGFnID09PSBPZmZzY3JlZW5Db21wb25lbnQpIHtcbiAgICAgIHZhciBpc0hpZGRlbiA9IGZpYmVyLm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG5cbiAgICAgIGlmIChpc0hpZGRlbikge1xuICAgICAgICAvLyBOZXN0ZWQgT2Zmc2NyZWVuIHRyZWUgaXMgc3RpbGwgaGlkZGVuLiBEb24ndCByZS1hcHBlYXIgaXRzIGVmZmVjdHMuXG4gICAgICAgIHJlYXBwZWFyTGF5b3V0RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH0gLy8gVE9ETyAoT2Zmc2NyZWVuKSBDaGVjazogc3VidHJlZUZsYWdzICYgTGF5b3V0U3RhdGljXG5cblxuICAgIGlmIChmaXJzdENoaWxkICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIG5vZGUgbWF5IGhhdmUgYmVlbiByZXVzZWQgZnJvbSBhIHByZXZpb3VzIHJlbmRlciwgc28gd2UgY2FuJ3RcbiAgICAgIC8vIGFzc3VtZSBpdHMgcmV0dXJuIHBvaW50ZXIgaXMgY29ycmVjdC5cbiAgICAgIGZpcnN0Q2hpbGQucmV0dXJuID0gZmliZXI7XG4gICAgICBuZXh0RWZmZWN0ID0gZmlyc3RDaGlsZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVhcHBlYXJMYXlvdXRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhcHBlYXJMYXlvdXRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290KSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDsgLy8gVE9ETyAoT2Zmc2NyZWVuKSBDaGVjazogZmxhZ3MgJiBMYXlvdXRTdGF0aWNcblxuICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG5cbiAgICB0cnkge1xuICAgICAgcmVhcHBlYXJMYXlvdXRFZmZlY3RzT25GaWJlcihmaWJlcik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICB9XG5cbiAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuXG4gICAgaWYgKGZpYmVyID09PSBzdWJ0cmVlUm9vdCkge1xuICAgICAgbmV4dEVmZmVjdCA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nO1xuXG4gICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgbm9kZSBtYXkgaGF2ZSBiZWVuIHJldXNlZCBmcm9tIGEgcHJldmlvdXMgcmVuZGVyLCBzbyB3ZSBjYW4ndFxuICAgICAgLy8gYXNzdW1lIGl0cyByZXR1cm4gcG9pbnRlciBpcyBjb3JyZWN0LlxuICAgICAgc2libGluZy5yZXR1cm4gPSBmaWJlci5yZXR1cm47XG4gICAgICBuZXh0RWZmZWN0ID0gc2libGluZztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0RWZmZWN0ID0gZmliZXIucmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrLCBjb21taXR0ZWRMYW5lcywgY29tbWl0dGVkVHJhbnNpdGlvbnMpIHtcbiAgbmV4dEVmZmVjdCA9IGZpbmlzaGVkV29yaztcbiAgY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0c19iZWdpbihmaW5pc2hlZFdvcmssIHJvb3QsIGNvbW1pdHRlZExhbmVzLCBjb21taXR0ZWRUcmFuc2l0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHNfYmVnaW4oc3VidHJlZVJvb3QsIHJvb3QsIGNvbW1pdHRlZExhbmVzLCBjb21taXR0ZWRUcmFuc2l0aW9ucykge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG4gICAgdmFyIGZpcnN0Q2hpbGQgPSBmaWJlci5jaGlsZDtcblxuICAgIGlmICgoZmliZXIuc3VidHJlZUZsYWdzICYgUGFzc2l2ZU1hc2spICE9PSBOb0ZsYWdzICYmIGZpcnN0Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGZpcnN0Q2hpbGQucmV0dXJuID0gZmliZXI7XG4gICAgICBuZXh0RWZmZWN0ID0gZmlyc3RDaGlsZDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMsIGNvbW1pdHRlZFRyYW5zaXRpb25zKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMsIGNvbW1pdHRlZFRyYW5zaXRpb25zKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcblxuICAgIGlmICgoZmliZXIuZmxhZ3MgJiBQYXNzaXZlKSAhPT0gTm9GbGFncykge1xuICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29tbWl0UGFzc2l2ZU1vdW50T25GaWJlcihyb290LCBmaWJlciwgY29tbWl0dGVkTGFuZXMsIGNvbW1pdHRlZFRyYW5zaXRpb25zKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICAgIH1cblxuICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICB9XG5cbiAgICBpZiAoZmliZXIgPT09IHN1YnRyZWVSb290KSB7XG4gICAgICBuZXh0RWZmZWN0ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2libGluZy5yZXR1cm4gPSBmaWJlci5yZXR1cm47XG4gICAgICBuZXh0RWZmZWN0ID0gc2libGluZztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0RWZmZWN0ID0gZmliZXIucmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVNb3VudE9uRmliZXIoZmluaXNoZWRSb290LCBmaW5pc2hlZFdvcmssIGNvbW1pdHRlZExhbmVzLCBjb21taXR0ZWRUcmFuc2l0aW9ucykge1xuICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICggZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgIHN0YXJ0UGFzc2l2ZUVmZmVjdFRpbWVyKCk7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChQYXNzaXZlJDEgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHJlY29yZFBhc3NpdmVFZmZlY3REdXJhdGlvbihmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KFBhc3NpdmUkMSB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0cyhmaXJzdENoaWxkKSB7XG4gIG5leHRFZmZlY3QgPSBmaXJzdENoaWxkO1xuICBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNfYmVnaW4oKTtcbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzX2JlZ2luKCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG4gICAgdmFyIGNoaWxkID0gZmliZXIuY2hpbGQ7XG5cbiAgICBpZiAoKG5leHRFZmZlY3QuZmxhZ3MgJiBDaGlsZERlbGV0aW9uKSAhPT0gTm9GbGFncykge1xuICAgICAgdmFyIGRlbGV0aW9ucyA9IGZpYmVyLmRlbGV0aW9ucztcblxuICAgICAgaWYgKGRlbGV0aW9ucyAhPT0gbnVsbCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlbGV0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBmaWJlclRvRGVsZXRlID0gZGVsZXRpb25zW2ldO1xuICAgICAgICAgIG5leHRFZmZlY3QgPSBmaWJlclRvRGVsZXRlO1xuICAgICAgICAgIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c0luc2lkZU9mRGVsZXRlZFRyZWVfYmVnaW4oZmliZXJUb0RlbGV0ZSwgZmliZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAge1xuICAgICAgICAgIC8vIEEgZmliZXIgd2FzIGRlbGV0ZWQgZnJvbSB0aGlzIHBhcmVudCBmaWJlciwgYnV0IGl0J3Mgc3RpbGwgcGFydCBvZlxuICAgICAgICAgIC8vIHRoZSBwcmV2aW91cyAoYWx0ZXJuYXRlKSBwYXJlbnQgZmliZXIncyBsaXN0IG9mIGNoaWxkcmVuLiBCZWNhdXNlXG4gICAgICAgICAgLy8gY2hpbGRyZW4gYXJlIGEgbGlua2VkIGxpc3QsIGFuIGVhcmxpZXIgc2libGluZyB0aGF0J3Mgc3RpbGwgYWxpdmVcbiAgICAgICAgICAvLyB3aWxsIGJlIGNvbm5lY3RlZCB0byB0aGUgZGVsZXRlZCBmaWJlciB2aWEgaXRzIGBhbHRlcm5hdGVgOlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gICBsaXZlIGZpYmVyXG4gICAgICAgICAgLy8gICAtLWFsdGVybmF0ZS0tPiBwcmV2aW91cyBsaXZlIGZpYmVyXG4gICAgICAgICAgLy8gICAtLXNpYmxpbmctLT4gZGVsZXRlZCBmaWJlclxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gV2UgY2FuJ3QgZGlzY29ubmVjdCBgYWx0ZXJuYXRlYCBvbiBub2RlcyB0aGF0IGhhdmVuJ3QgYmVlbiBkZWxldGVkXG4gICAgICAgICAgLy8geWV0LCBidXQgd2UgY2FuIGRpc2Nvbm5lY3QgdGhlIGBzaWJsaW5nYCBhbmQgYGNoaWxkYCBwb2ludGVycy5cbiAgICAgICAgICB2YXIgcHJldmlvdXNGaWJlciA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICAgICAgICAgIGlmIChwcmV2aW91c0ZpYmVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgZGV0YWNoZWRDaGlsZCA9IHByZXZpb3VzRmliZXIuY2hpbGQ7XG5cbiAgICAgICAgICAgIGlmIChkZXRhY2hlZENoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHByZXZpb3VzRmliZXIuY2hpbGQgPSBudWxsO1xuXG4gICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICB2YXIgZGV0YWNoZWRTaWJsaW5nID0gZGV0YWNoZWRDaGlsZC5zaWJsaW5nO1xuICAgICAgICAgICAgICAgIGRldGFjaGVkQ2hpbGQuc2libGluZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgZGV0YWNoZWRDaGlsZCA9IGRldGFjaGVkU2libGluZztcbiAgICAgICAgICAgICAgfSB3aGlsZSAoZGV0YWNoZWRDaGlsZCAhPT0gbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbmV4dEVmZmVjdCA9IGZpYmVyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICgoZmliZXIuc3VidHJlZUZsYWdzICYgUGFzc2l2ZU1hc2spICE9PSBOb0ZsYWdzICYmIGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBjaGlsZC5yZXR1cm4gPSBmaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBjaGlsZDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzX2NvbXBsZXRlKCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c19jb21wbGV0ZSgpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuXG4gICAgaWYgKChmaWJlci5mbGFncyAmIFBhc3NpdmUpICE9PSBOb0ZsYWdzKSB7XG4gICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuICAgICAgY29tbWl0UGFzc2l2ZVVubW91bnRPbkZpYmVyKGZpYmVyKTtcbiAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgfVxuXG4gICAgdmFyIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nO1xuXG4gICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgIHNpYmxpbmcucmV0dXJuID0gZmliZXIucmV0dXJuO1xuICAgICAgbmV4dEVmZmVjdCA9IHNpYmxpbmc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbmV4dEVmZmVjdCA9IGZpYmVyLnJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudE9uRmliZXIoZmluaXNoZWRXb3JrKSB7XG4gIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCBmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgc3RhcnRQYXNzaXZlRWZmZWN0VGltZXIoKTtcbiAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoUGFzc2l2ZSQxIHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4pO1xuICAgICAgICAgIHJlY29yZFBhc3NpdmVFZmZlY3REdXJhdGlvbihmaW5pc2hlZFdvcmspO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChQYXNzaXZlJDEgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNJbnNpZGVPZkRlbGV0ZWRUcmVlX2JlZ2luKGRlbGV0ZWRTdWJ0cmVlUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcikge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7IC8vIERlbGV0aW9uIGVmZmVjdHMgZmlyZSBpbiBwYXJlbnQgLT4gY2hpbGQgb3JkZXJcbiAgICAvLyBUT0RPOiBDaGVjayBpZiBmaWJlciBoYXMgYSBQYXNzaXZlU3RhdGljIGZsYWdcblxuICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG4gICAgY29tbWl0UGFzc2l2ZVVubW91bnRJbnNpZGVEZWxldGVkVHJlZU9uRmliZXIoZmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpO1xuICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgdmFyIGNoaWxkID0gZmliZXIuY2hpbGQ7IC8vIFRPRE86IE9ubHkgdHJhdmVyc2Ugc3VidHJlZSBpZiBpdCBoYXMgYSBQYXNzaXZlU3RhdGljIGZsYWcuIChCdXQsIGlmIHdlXG4gICAgLy8gZG8gdGhpcywgc3RpbGwgbmVlZCB0byBoYW5kbGUgYGRlbGV0ZWRUcmVlQ2xlYW5VcExldmVsYCBjb3JyZWN0bHkuKVxuXG4gICAgaWYgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBjaGlsZC5yZXR1cm4gPSBmaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBjaGlsZDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzSW5zaWRlT2ZEZWxldGVkVHJlZV9jb21wbGV0ZShkZWxldGVkU3VidHJlZVJvb3QpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNJbnNpZGVPZkRlbGV0ZWRUcmVlX2NvbXBsZXRlKGRlbGV0ZWRTdWJ0cmVlUm9vdCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG4gICAgdmFyIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nO1xuICAgIHZhciByZXR1cm5GaWJlciA9IGZpYmVyLnJldHVybjtcblxuICAgIHtcbiAgICAgIC8vIFJlY3Vyc2l2ZWx5IHRyYXZlcnNlIHRoZSBlbnRpcmUgZGVsZXRlZCB0cmVlIGFuZCBjbGVhbiB1cCBmaWJlciBmaWVsZHMuXG4gICAgICAvLyBUaGlzIGlzIG1vcmUgYWdncmVzc2l2ZSB0aGFuIGlkZWFsLCBhbmQgdGhlIGxvbmcgdGVybSBnb2FsIGlzIHRvIG9ubHlcbiAgICAgIC8vIGhhdmUgdG8gZGV0YWNoIHRoZSBkZWxldGVkIHRyZWUgYXQgdGhlIHJvb3QuXG4gICAgICBkZXRhY2hGaWJlckFmdGVyRWZmZWN0cyhmaWJlcik7XG5cbiAgICAgIGlmIChmaWJlciA9PT0gZGVsZXRlZFN1YnRyZWVSb290KSB7XG4gICAgICAgIG5leHRFZmZlY3QgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgIHNpYmxpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICBuZXh0RWZmZWN0ID0gc2libGluZztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0RWZmZWN0ID0gcmV0dXJuRmliZXI7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZVVubW91bnRJbnNpZGVEZWxldGVkVHJlZU9uRmliZXIoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcikge1xuICBzd2l0Y2ggKGN1cnJlbnQudGFnKSB7XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoIGN1cnJlbnQubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgc3RhcnRQYXNzaXZlRWZmZWN0VGltZXIoKTtcbiAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoUGFzc2l2ZSQxLCBjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKTtcbiAgICAgICAgICByZWNvcmRQYXNzaXZlRWZmZWN0RHVyYXRpb24oY3VycmVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KFBhc3NpdmUkMSwgY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcik7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxufSAvLyBUT0RPOiBSZXVzZSByZWFwcGVhckxheW91dEVmZmVjdHMgdHJhdmVyc2FsIGhlcmU/XG5cblxuZnVuY3Rpb24gaW52b2tlTGF5b3V0RWZmZWN0TW91bnRJbkRFVihmaWJlcikge1xuICB7XG4gICAgLy8gV2UgZG9uJ3QgbmVlZCB0byByZS1jaGVjayBTdHJpY3RFZmZlY3RzTW9kZSBoZXJlLlxuICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgaWYgdGhhdCBjaGVjayBoYXMgYWxyZWFkeSBwYXNzZWQuXG4gICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChMYXlvdXQgfCBIYXNFZmZlY3QsIGZpYmVyKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQoKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGludm9rZVBhc3NpdmVFZmZlY3RNb3VudEluREVWKGZpYmVyKSB7XG4gIHtcbiAgICAvLyBXZSBkb24ndCBuZWVkIHRvIHJlLWNoZWNrIFN0cmljdEVmZmVjdHNNb2RlIGhlcmUuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBpZiB0aGF0IGNoZWNrIGhhcyBhbHJlYWR5IHBhc3NlZC5cbiAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KFBhc3NpdmUkMSB8IEhhc0VmZmVjdCwgZmliZXIpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW52b2tlTGF5b3V0RWZmZWN0VW5tb3VudEluREVWKGZpYmVyKSB7XG4gIHtcbiAgICAvLyBXZSBkb24ndCBuZWVkIHRvIHJlLWNoZWNrIFN0cmljdEVmZmVjdHNNb2RlIGhlcmUuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBpZiB0aGF0IGNoZWNrIGhhcyBhbHJlYWR5IHBhc3NlZC5cbiAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoTGF5b3V0IHwgSGFzRWZmZWN0LCBmaWJlciwgZmliZXIucmV0dXJuKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVbm1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBzYWZlbHlDYWxsQ29tcG9uZW50V2lsbFVubW91bnQoZmliZXIsIGZpYmVyLnJldHVybiwgaW5zdGFuY2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGludm9rZVBhc3NpdmVFZmZlY3RVbm1vdW50SW5ERVYoZmliZXIpIHtcbiAge1xuICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gcmUtY2hlY2sgU3RyaWN0RWZmZWN0c01vZGUgaGVyZS5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGlmIHRoYXQgY2hlY2sgaGFzIGFscmVhZHkgcGFzc2VkLlxuICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChQYXNzaXZlJDEgfCBIYXNFZmZlY3QsIGZpYmVyLCBmaWJlci5yZXR1cm4pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBDT01QT05FTlRfVFlQRSA9IDA7XG52YXIgSEFTX1BTRVVET19DTEFTU19UWVBFID0gMTtcbnZhciBST0xFX1RZUEUgPSAyO1xudmFyIFRFU1RfTkFNRV9UWVBFID0gMztcbnZhciBURVhUX1RZUEUgPSA0O1xuXG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuZm9yKSB7XG4gIHZhciBzeW1ib2xGb3IgPSBTeW1ib2wuZm9yO1xuICBDT01QT05FTlRfVFlQRSA9IHN5bWJvbEZvcignc2VsZWN0b3IuY29tcG9uZW50Jyk7XG4gIEhBU19QU0VVRE9fQ0xBU1NfVFlQRSA9IHN5bWJvbEZvcignc2VsZWN0b3IuaGFzX3BzZXVkb19jbGFzcycpO1xuICBST0xFX1RZUEUgPSBzeW1ib2xGb3IoJ3NlbGVjdG9yLnJvbGUnKTtcbiAgVEVTVF9OQU1FX1RZUEUgPSBzeW1ib2xGb3IoJ3NlbGVjdG9yLnRlc3RfaWQnKTtcbiAgVEVYVF9UWVBFID0gc3ltYm9sRm9yKCdzZWxlY3Rvci50ZXh0Jyk7XG59XG52YXIgY29tbWl0SG9va3MgPSBbXTtcbmZ1bmN0aW9uIG9uQ29tbWl0Um9vdCQxKCkge1xuICB7XG4gICAgY29tbWl0SG9va3MuZm9yRWFjaChmdW5jdGlvbiAoY29tbWl0SG9vaykge1xuICAgICAgcmV0dXJuIGNvbW1pdEhvb2soKTtcbiAgICB9KTtcbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50QWN0UXVldWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRBY3RRdWV1ZTtcbmZ1bmN0aW9uIGlzTGVnYWN5QWN0RW52aXJvbm1lbnQoZmliZXIpIHtcbiAge1xuICAgIC8vIExlZ2FjeSBtb2RlLiBXZSBwcmVzZXJ2ZSB0aGUgYmVoYXZpb3Igb2YgUmVhY3QgMTcncyBhY3QuIEl0IGFzc3VtZXMgYW5cbiAgICAvLyBhY3QgZW52aXJvbm1lbnQgd2hlbmV2ZXIgYGplc3RgIGlzIGRlZmluZWQsIGJ1dCB5b3UgY2FuIHN0aWxsIHR1cm4gb2ZmXG4gICAgLy8gc3B1cmlvdXMgd2FybmluZ3MgYnkgc2V0dGluZyBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlQgZXhwbGljaXRseVxuICAgIC8vIHRvIGZhbHNlLlxuICAgIHZhciBpc1JlYWN0QWN0RW52aXJvbm1lbnRHbG9iYWwgPSAvLyAkRmxvd0V4cGVjdGVkRXJyb3IgXHUyMDEzIEZsb3cgZG9lc24ndCBrbm93IGFib3V0IElTX1JFQUNUX0FDVF9FTlZJUk9OTUVOVCBnbG9iYWxcbiAgICB0eXBlb2YgSVNfUkVBQ1RfQUNUX0VOVklST05NRU5UICE9PSAndW5kZWZpbmVkJyA/IElTX1JFQUNUX0FDVF9FTlZJUk9OTUVOVCA6IHVuZGVmaW5lZDsgLy8gJEZsb3dFeHBlY3RlZEVycm9yIC0gRmxvdyBkb2Vzbid0IGtub3cgYWJvdXQgamVzdFxuXG4gICAgdmFyIGplc3RJc0RlZmluZWQgPSB0eXBlb2YgamVzdCAhPT0gJ3VuZGVmaW5lZCc7XG4gICAgcmV0dXJuICBqZXN0SXNEZWZpbmVkICYmIGlzUmVhY3RBY3RFbnZpcm9ubWVudEdsb2JhbCAhPT0gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzQ29uY3VycmVudEFjdEVudmlyb25tZW50KCkge1xuICB7XG4gICAgdmFyIGlzUmVhY3RBY3RFbnZpcm9ubWVudEdsb2JhbCA9IC8vICRGbG93RXhwZWN0ZWRFcnJvciBcdTIwMTMgRmxvdyBkb2Vzbid0IGtub3cgYWJvdXQgSVNfUkVBQ1RfQUNUX0VOVklST05NRU5UIGdsb2JhbFxuICAgIHR5cGVvZiBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlQgIT09ICd1bmRlZmluZWQnID8gSVNfUkVBQ1RfQUNUX0VOVklST05NRU5UIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFpc1JlYWN0QWN0RW52aXJvbm1lbnRHbG9iYWwgJiYgUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgLy8gVE9ETzogSW5jbHVkZSBsaW5rIHRvIHJlbGV2YW50IGRvY3VtZW50YXRpb24gcGFnZS5cbiAgICAgIGVycm9yKCdUaGUgY3VycmVudCB0ZXN0aW5nIGVudmlyb25tZW50IGlzIG5vdCBjb25maWd1cmVkIHRvIHN1cHBvcnQgJyArICdhY3QoLi4uKScpO1xuICAgIH1cblxuICAgIHJldHVybiBpc1JlYWN0QWN0RW52aXJvbm1lbnRHbG9iYWw7XG4gIH1cbn1cblxudmFyIGNlaWwgPSBNYXRoLmNlaWw7XG52YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixcbiAgICBSZWFjdEN1cnJlbnRPd25lciQyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50T3duZXIsXG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMyA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLFxuICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRBY3RRdWV1ZTtcbnZhciBOb0NvbnRleHQgPVxuLyogICAgICAgICAgICAgKi9cbjA7XG52YXIgQmF0Y2hlZENvbnRleHQgPVxuLyogICAgICAgICAgICAgICAqL1xuMTtcbnZhciBSZW5kZXJDb250ZXh0ID1cbi8qICAgICAgICAgICAgICAgICovXG4yO1xudmFyIENvbW1pdENvbnRleHQgPVxuLyogICAgICAgICAgICAgICAgKi9cbjQ7XG52YXIgUm9vdEluUHJvZ3Jlc3MgPSAwO1xudmFyIFJvb3RGYXRhbEVycm9yZWQgPSAxO1xudmFyIFJvb3RFcnJvcmVkID0gMjtcbnZhciBSb290U3VzcGVuZGVkID0gMztcbnZhciBSb290U3VzcGVuZGVkV2l0aERlbGF5ID0gNDtcbnZhciBSb290Q29tcGxldGVkID0gNTtcbnZhciBSb290RGlkTm90Q29tcGxldGUgPSA2OyAvLyBEZXNjcmliZXMgd2hlcmUgd2UgYXJlIGluIHRoZSBSZWFjdCBleGVjdXRpb24gc3RhY2tcblxudmFyIGV4ZWN1dGlvbkNvbnRleHQgPSBOb0NvbnRleHQ7IC8vIFRoZSByb290IHdlJ3JlIHdvcmtpbmcgb25cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdCA9IG51bGw7IC8vIFRoZSBmaWJlciB3ZSdyZSB3b3JraW5nIG9uXG5cbnZhciB3b3JrSW5Qcm9ncmVzcyA9IG51bGw7IC8vIFRoZSBsYW5lcyB3ZSdyZSByZW5kZXJpbmdcblxudmFyIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gTm9MYW5lczsgLy8gU3RhY2sgdGhhdCBhbGxvd3MgY29tcG9uZW50cyB0byBjaGFuZ2UgdGhlIHJlbmRlciBsYW5lcyBmb3IgaXRzIHN1YnRyZWVcbi8vIFRoaXMgaXMgYSBzdXBlcnNldCBvZiB0aGUgbGFuZXMgd2Ugc3RhcnRlZCB3b3JraW5nIG9uIGF0IHRoZSByb290LiBUaGUgb25seVxuLy8gY2FzZSB3aGVyZSBpdCdzIGRpZmZlcmVudCBmcm9tIGB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lc2AgaXMgd2hlbiB3ZVxuLy8gZW50ZXIgYSBzdWJ0cmVlIHRoYXQgaXMgaGlkZGVuIGFuZCBuZWVkcyB0byBiZSB1bmhpZGRlbjogU3VzcGVuc2UgYW5kXG4vLyBPZmZzY3JlZW4gY29tcG9uZW50LlxuLy9cbi8vIE1vc3QgdGhpbmdzIGluIHRoZSB3b3JrIGxvb3Agc2hvdWxkIGRlYWwgd2l0aCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcy5cbi8vIE1vc3QgdGhpbmdzIGluIGJlZ2luL2NvbXBsZXRlIHBoYXNlcyBzaG91bGQgZGVhbCB3aXRoIHN1YnRyZWVSZW5kZXJMYW5lcy5cblxudmFyIHN1YnRyZWVSZW5kZXJMYW5lcyA9IE5vTGFuZXM7XG52YXIgc3VidHJlZVJlbmRlckxhbmVzQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKE5vTGFuZXMpOyAvLyBXaGV0aGVyIHRvIHJvb3QgY29tcGxldGVkLCBlcnJvcmVkLCBzdXNwZW5kZWQsIGV0Yy5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290SW5Qcm9ncmVzczsgLy8gQSBmYXRhbCBlcnJvciwgaWYgb25lIGlzIHRocm93blxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvciA9IG51bGw7IC8vIFwiSW5jbHVkZWRcIiBsYW5lcyByZWZlciB0byBsYW5lcyB0aGF0IHdlcmUgd29ya2VkIG9uIGR1cmluZyB0aGlzIHJlbmRlci4gSXQnc1xuLy8gc2xpZ2h0bHkgZGlmZmVyZW50IHRoYW4gYHJlbmRlckxhbmVzYCBiZWNhdXNlIGByZW5kZXJMYW5lc2AgY2FuIGNoYW5nZSBhcyB5b3Vcbi8vIGVudGVyIGFuZCBleGl0IGFuIE9mZnNjcmVlbiB0cmVlLiBUaGlzIHZhbHVlIGlzIHRoZSBjb21iaW5hdGlvbiBvZiBhbGwgcmVuZGVyXG4vLyBsYW5lcyBmb3IgdGhlIGVudGlyZSByZW5kZXIgcGhhc2UuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzID0gTm9MYW5lczsgLy8gVGhlIHdvcmsgbGVmdCBvdmVyIGJ5IGNvbXBvbmVudHMgdGhhdCB3ZXJlIHZpc2l0ZWQgZHVyaW5nIHRoaXMgcmVuZGVyLiBPbmx5XG4vLyBpbmNsdWRlcyB1bnByb2Nlc3NlZCB1cGRhdGVzLCBub3Qgd29yayBpbiBiYWlsZWQgb3V0IGNoaWxkcmVuLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzID0gTm9MYW5lczsgLy8gTGFuZXMgdGhhdCB3ZXJlIHVwZGF0ZWQgKGluIGFuIGludGVybGVhdmVkIGV2ZW50KSBkdXJpbmcgdGhpcyByZW5kZXIuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcyA9IE5vTGFuZXM7IC8vIExhbmVzIHRoYXQgd2VyZSB1cGRhdGVkIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlICgqbm90KiBhbiBpbnRlcmxlYXZlZCBldmVudCkuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcyA9IE5vTGFuZXM7IC8vIEVycm9ycyB0aGF0IGFyZSB0aHJvd24gZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RDb25jdXJyZW50RXJyb3JzID0gbnVsbDsgLy8gVGhlc2UgYXJlIGVycm9ycyB0aGF0IHdlIHJlY292ZXJlZCBmcm9tIHdpdGhvdXQgc3VyZmFjaW5nIHRoZW0gdG8gdGhlIFVJLlxuLy8gV2Ugd2lsbCBsb2cgdGhlbSBvbmNlIHRoZSB0cmVlIGNvbW1pdHMuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycyA9IG51bGw7IC8vIFRoZSBtb3N0IHJlY2VudCB0aW1lIHdlIGNvbW1pdHRlZCBhIGZhbGxiYWNrLiBUaGlzIGxldHMgdXMgZW5zdXJlIGEgdHJhaW5cbi8vIG1vZGVsIHdoZXJlIHdlIGRvbid0IGNvbW1pdCBuZXcgbG9hZGluZyBzdGF0ZXMgaW4gdG9vIHF1aWNrIHN1Y2Nlc3Npb24uXG5cbnZhciBnbG9iYWxNb3N0UmVjZW50RmFsbGJhY2tUaW1lID0gMDtcbnZhciBGQUxMQkFDS19USFJPVFRMRV9NUyA9IDUwMDsgLy8gVGhlIGFic29sdXRlIHRpbWUgZm9yIHdoZW4gd2Ugc2hvdWxkIHN0YXJ0IGdpdmluZyB1cCBvbiByZW5kZXJpbmdcbi8vIG1vcmUgYW5kIHByZWZlciBDUFUgc3VzcGVuc2UgaGV1cmlzdGljcyBpbnN0ZWFkLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyVGFyZ2V0VGltZSA9IEluZmluaXR5OyAvLyBIb3cgbG9uZyBhIHJlbmRlciBpcyBzdXBwb3NlZCB0byB0YWtlIGJlZm9yZSB3ZSBzdGFydCBmb2xsb3dpbmcgQ1BVXG4vLyBzdXNwZW5zZSBoZXVyaXN0aWNzIGFuZCBvcHQgb3V0IG9mIHJlbmRlcmluZyBtb3JlIGNvbnRlbnQuXG5cbnZhciBSRU5ERVJfVElNRU9VVF9NUyA9IDUwMDtcbnZhciB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zID0gbnVsbDtcblxuZnVuY3Rpb24gcmVzZXRSZW5kZXJUaW1lcigpIHtcbiAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyVGFyZ2V0VGltZSA9IG5vdygpICsgUkVOREVSX1RJTUVPVVRfTVM7XG59XG5cbmZ1bmN0aW9uIGdldFJlbmRlclRhcmdldFRpbWUoKSB7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJUYXJnZXRUaW1lO1xufVxudmFyIGhhc1VuY2F1Z2h0RXJyb3IgPSBmYWxzZTtcbnZhciBmaXJzdFVuY2F1Z2h0RXJyb3IgPSBudWxsO1xudmFyIGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkID0gbnVsbDsgLy8gT25seSB1c2VkIHdoZW4gZW5hYmxlUHJvZmlsZXJOZXN0ZWRVcGRhdGVTY2hlZHVsZWRIb29rIGlzIHRydWU7XG52YXIgcm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMgPSBmYWxzZTtcbnZhciByb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cyA9IG51bGw7XG52YXIgcGVuZGluZ1Bhc3NpdmVFZmZlY3RzTGFuZXMgPSBOb0xhbmVzO1xudmFyIHBlbmRpbmdQYXNzaXZlUHJvZmlsZXJFZmZlY3RzID0gW107XG52YXIgcGVuZGluZ1Bhc3NpdmVUcmFuc2l0aW9ucyA9IG51bGw7IC8vIFVzZSB0aGVzZSB0byBwcmV2ZW50IGFuIGluZmluaXRlIGxvb3Agb2YgbmVzdGVkIHVwZGF0ZXNcblxudmFyIE5FU1RFRF9VUERBVEVfTElNSVQgPSA1MDtcbnZhciBuZXN0ZWRVcGRhdGVDb3VudCA9IDA7XG52YXIgcm9vdFdpdGhOZXN0ZWRVcGRhdGVzID0gbnVsbDtcbnZhciBpc0ZsdXNoaW5nUGFzc2l2ZUVmZmVjdHMgPSBmYWxzZTtcbnZhciBkaWRTY2hlZHVsZVVwZGF0ZUR1cmluZ1Bhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG52YXIgTkVTVEVEX1BBU1NJVkVfVVBEQVRFX0xJTUlUID0gNTA7XG52YXIgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMDtcbnZhciByb290V2l0aFBhc3NpdmVOZXN0ZWRVcGRhdGVzID0gbnVsbDsgLy8gSWYgdHdvIHVwZGF0ZXMgYXJlIHNjaGVkdWxlZCB3aXRoaW4gdGhlIHNhbWUgZXZlbnQsIHdlIHNob3VsZCB0cmVhdCB0aGVpclxuLy8gZXZlbnQgdGltZXMgYXMgc2ltdWx0YW5lb3VzLCBldmVuIGlmIHRoZSBhY3R1YWwgY2xvY2sgdGltZSBoYXMgYWR2YW5jZWRcbi8vIGJldHdlZW4gdGhlIGZpcnN0IGFuZCBzZWNvbmQgY2FsbC5cblxudmFyIGN1cnJlbnRFdmVudFRpbWUgPSBOb1RpbWVzdGFtcDtcbnZhciBjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZSA9IE5vTGFuZXM7XG52YXIgaXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0ID0gZmFsc2U7XG5mdW5jdGlvbiBnZXRXb3JrSW5Qcm9ncmVzc1Jvb3QoKSB7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzc1Jvb3Q7XG59XG5mdW5jdGlvbiByZXF1ZXN0RXZlbnRUaW1lKCkge1xuICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KSB7XG4gICAgLy8gV2UncmUgaW5zaWRlIFJlYWN0LCBzbyBpdCdzIGZpbmUgdG8gcmVhZCB0aGUgYWN0dWFsIHRpbWUuXG4gICAgcmV0dXJuIG5vdygpO1xuICB9IC8vIFdlJ3JlIG5vdCBpbnNpZGUgUmVhY3QsIHNvIHdlIG1heSBiZSBpbiB0aGUgbWlkZGxlIG9mIGEgYnJvd3NlciBldmVudC5cblxuXG4gIGlmIChjdXJyZW50RXZlbnRUaW1lICE9PSBOb1RpbWVzdGFtcCkge1xuICAgIC8vIFVzZSB0aGUgc2FtZSBzdGFydCB0aW1lIGZvciBhbGwgdXBkYXRlcyB1bnRpbCB3ZSBlbnRlciBSZWFjdCBhZ2Fpbi5cbiAgICByZXR1cm4gY3VycmVudEV2ZW50VGltZTtcbiAgfSAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUgc2luY2UgUmVhY3QgeWllbGRlZC4gQ29tcHV0ZSBhIG5ldyBzdGFydCB0aW1lLlxuXG5cbiAgY3VycmVudEV2ZW50VGltZSA9IG5vdygpO1xuICByZXR1cm4gY3VycmVudEV2ZW50VGltZTtcbn1cbmZ1bmN0aW9uIHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKSB7XG4gIC8vIFNwZWNpYWwgY2FzZXNcbiAgdmFyIG1vZGUgPSBmaWJlci5tb2RlO1xuXG4gIGlmICgobW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgcmV0dXJuIFN5bmNMYW5lO1xuICB9IGVsc2UgaWYgKCAoZXhlY3V0aW9uQ29udGV4dCAmIFJlbmRlckNvbnRleHQpICE9PSBOb0NvbnRleHQgJiYgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAvLyBUaGlzIGlzIGEgcmVuZGVyIHBoYXNlIHVwZGF0ZS4gVGhlc2UgYXJlIG5vdCBvZmZpY2lhbGx5IHN1cHBvcnRlZC4gVGhlXG4gICAgLy8gb2xkIGJlaGF2aW9yIGlzIHRvIGdpdmUgdGhpcyB0aGUgc2FtZSBcInRocmVhZFwiIChsYW5lcykgYXNcbiAgICAvLyB3aGF0ZXZlciBpcyBjdXJyZW50bHkgcmVuZGVyaW5nLiBTbyBpZiB5b3UgY2FsbCBgc2V0U3RhdGVgIG9uIGEgY29tcG9uZW50XG4gICAgLy8gdGhhdCBoYXBwZW5zIGxhdGVyIGluIHRoZSBzYW1lIHJlbmRlciwgaXQgd2lsbCBmbHVzaC4gSWRlYWxseSwgd2Ugd2FudCB0b1xuICAgIC8vIHJlbW92ZSB0aGUgc3BlY2lhbCBjYXNlIGFuZCB0cmVhdCB0aGVtIGFzIGlmIHRoZXkgY2FtZSBmcm9tIGFuXG4gICAgLy8gaW50ZXJsZWF2ZWQgZXZlbnQuIFJlZ2FyZGxlc3MsIHRoaXMgcGF0dGVybiBpcyBub3Qgb2ZmaWNpYWxseSBzdXBwb3J0ZWQuXG4gICAgLy8gVGhpcyBiZWhhdmlvciBpcyBvbmx5IGEgZmFsbGJhY2suIFRoZSBmbGFnIG9ubHkgZXhpc3RzIHVudGlsIHdlIGNhbiByb2xsXG4gICAgLy8gb3V0IHRoZSBzZXRTdGF0ZSB3YXJuaW5nLCBzaW5jZSBleGlzdGluZyBjb2RlIG1pZ2h0IGFjY2lkZW50YWxseSByZWx5IG9uXG4gICAgLy8gdGhlIGN1cnJlbnQgYmVoYXZpb3IuXG4gICAgcmV0dXJuIHBpY2tBcmJpdHJhcnlMYW5lKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHZhciBpc1RyYW5zaXRpb24gPSByZXF1ZXN0Q3VycmVudFRyYW5zaXRpb24oKSAhPT0gTm9UcmFuc2l0aW9uO1xuXG4gIGlmIChpc1RyYW5zaXRpb24pIHtcbiAgICBpZiAoIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiAhPT0gbnVsbCkge1xuICAgICAgdmFyIHRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb247XG5cbiAgICAgIGlmICghdHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycykge1xuICAgICAgICB0cmFuc2l0aW9uLl91cGRhdGVkRmliZXJzID0gbmV3IFNldCgpO1xuICAgICAgfVxuXG4gICAgICB0cmFuc2l0aW9uLl91cGRhdGVkRmliZXJzLmFkZChmaWJlcik7XG4gICAgfSAvLyBUaGUgYWxnb3JpdGhtIGZvciBhc3NpZ25pbmcgYW4gdXBkYXRlIHRvIGEgbGFuZSBzaG91bGQgYmUgc3RhYmxlIGZvciBhbGxcbiAgICAvLyB1cGRhdGVzIGF0IHRoZSBzYW1lIHByaW9yaXR5IHdpdGhpbiB0aGUgc2FtZSBldmVudC4gVG8gZG8gdGhpcywgdGhlXG4gICAgLy8gaW5wdXRzIHRvIHRoZSBhbGdvcml0aG0gbXVzdCBiZSB0aGUgc2FtZS5cbiAgICAvL1xuICAgIC8vIFRoZSB0cmljayB3ZSB1c2UgaXMgdG8gY2FjaGUgdGhlIGZpcnN0IG9mIGVhY2ggb2YgdGhlc2UgaW5wdXRzIHdpdGhpbiBhblxuICAgIC8vIGV2ZW50LiBUaGVuIHJlc2V0IHRoZSBjYWNoZWQgdmFsdWVzIG9uY2Ugd2UgY2FuIGJlIHN1cmUgdGhlIGV2ZW50IGlzXG4gICAgLy8gb3Zlci4gT3VyIGhldXJpc3RpYyBmb3IgdGhhdCBpcyB3aGVuZXZlciB3ZSBlbnRlciBhIGNvbmN1cnJlbnQgd29yayBsb29wLlxuXG5cbiAgICBpZiAoY3VycmVudEV2ZW50VHJhbnNpdGlvbkxhbmUgPT09IE5vTGFuZSkge1xuICAgICAgLy8gQWxsIHRyYW5zaXRpb25zIHdpdGhpbiB0aGUgc2FtZSBldmVudCBhcmUgYXNzaWduZWQgdGhlIHNhbWUgbGFuZS5cbiAgICAgIGN1cnJlbnRFdmVudFRyYW5zaXRpb25MYW5lID0gY2xhaW1OZXh0VHJhbnNpdGlvbkxhbmUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudEV2ZW50VHJhbnNpdGlvbkxhbmU7XG4gIH0gLy8gVXBkYXRlcyBvcmlnaW5hdGluZyBpbnNpZGUgY2VydGFpbiBSZWFjdCBtZXRob2RzLCBsaWtlIGZsdXNoU3luYywgaGF2ZVxuICAvLyB0aGVpciBwcmlvcml0eSBzZXQgYnkgdHJhY2tpbmcgaXQgd2l0aCBhIGNvbnRleHQgdmFyaWFibGUuXG4gIC8vXG4gIC8vIFRoZSBvcGFxdWUgdHlwZSByZXR1cm5lZCBieSB0aGUgaG9zdCBjb25maWcgaXMgaW50ZXJuYWxseSBhIGxhbmUsIHNvIHdlIGNhblxuICAvLyB1c2UgdGhhdCBkaXJlY3RseS5cbiAgLy8gVE9ETzogTW92ZSB0aGlzIHR5cGUgY29udmVyc2lvbiB0byB0aGUgZXZlbnQgcHJpb3JpdHkgbW9kdWxlLlxuXG5cbiAgdmFyIHVwZGF0ZUxhbmUgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcblxuICBpZiAodXBkYXRlTGFuZSAhPT0gTm9MYW5lKSB7XG4gICAgcmV0dXJuIHVwZGF0ZUxhbmU7XG4gIH0gLy8gVGhpcyB1cGRhdGUgb3JpZ2luYXRlZCBvdXRzaWRlIFJlYWN0LiBBc2sgdGhlIGhvc3QgZW52aXJvbm1lbnQgZm9yIGFuXG4gIC8vIGFwcHJvcHJpYXRlIHByaW9yaXR5LCBiYXNlZCBvbiB0aGUgdHlwZSBvZiBldmVudC5cbiAgLy9cbiAgLy8gVGhlIG9wYXF1ZSB0eXBlIHJldHVybmVkIGJ5IHRoZSBob3N0IGNvbmZpZyBpcyBpbnRlcm5hbGx5IGEgbGFuZSwgc28gd2UgY2FuXG4gIC8vIHVzZSB0aGF0IGRpcmVjdGx5LlxuICAvLyBUT0RPOiBNb3ZlIHRoaXMgdHlwZSBjb252ZXJzaW9uIHRvIHRoZSBldmVudCBwcmlvcml0eSBtb2R1bGUuXG5cblxuICB2YXIgZXZlbnRMYW5lID0gZ2V0Q3VycmVudEV2ZW50UHJpb3JpdHkoKTtcbiAgcmV0dXJuIGV2ZW50TGFuZTtcbn1cblxuZnVuY3Rpb24gcmVxdWVzdFJldHJ5TGFuZShmaWJlcikge1xuICAvLyBUaGlzIGlzIGEgZm9yayBvZiBgcmVxdWVzdFVwZGF0ZUxhbmVgIGRlc2lnbmVkIHNwZWNpZmljYWxseSBmb3IgU3VzcGVuc2VcbiAgLy8gXCJyZXRyaWVzXCIgXHUyMDE0IGEgc3BlY2lhbCB1cGRhdGUgdGhhdCBhdHRlbXB0cyB0byBmbGlwIGEgU3VzcGVuc2UgYm91bmRhcnlcbiAgLy8gZnJvbSBpdHMgcGxhY2Vob2xkZXIgc3RhdGUgdG8gaXRzIHByaW1hcnkvcmVzb2x2ZWQgc3RhdGUuXG4gIC8vIFNwZWNpYWwgY2FzZXNcbiAgdmFyIG1vZGUgPSBmaWJlci5tb2RlO1xuXG4gIGlmICgobW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgcmV0dXJuIFN5bmNMYW5lO1xuICB9XG5cbiAgcmV0dXJuIGNsYWltTmV4dFJldHJ5TGFuZSgpO1xufVxuXG5mdW5jdGlvbiBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSkge1xuICBjaGVja0Zvck5lc3RlZFVwZGF0ZXMoKTtcblxuICB7XG4gICAgaWYgKGlzUnVubmluZ0luc2VydGlvbkVmZmVjdCkge1xuICAgICAgZXJyb3IoJ3VzZUluc2VydGlvbkVmZmVjdCBtdXN0IG5vdCBzY2hlZHVsZSB1cGRhdGVzLicpO1xuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBpZiAoaXNGbHVzaGluZ1Bhc3NpdmVFZmZlY3RzKSB7XG4gICAgICBkaWRTY2hlZHVsZVVwZGF0ZUR1cmluZ1Bhc3NpdmVFZmZlY3RzID0gdHJ1ZTtcbiAgICB9XG4gIH0gLy8gTWFyayB0aGF0IHRoZSByb290IGhhcyBhIHBlbmRpbmcgdXBkYXRlLlxuXG5cbiAgbWFya1Jvb3RVcGRhdGVkKHJvb3QsIGxhbmUsIGV2ZW50VGltZSk7XG5cbiAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vTGFuZXMgJiYgcm9vdCA9PT0gd29ya0luUHJvZ3Jlc3NSb290KSB7XG4gICAgLy8gVGhpcyB1cGRhdGUgd2FzIGRpc3BhdGNoZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UuIFRoaXMgaXMgYSBtaXN0YWtlXG4gICAgLy8gaWYgdGhlIHVwZGF0ZSBvcmlnaW5hdGVzIGZyb20gdXNlciBzcGFjZSAod2l0aCB0aGUgZXhjZXB0aW9uIG9mIGxvY2FsXG4gICAgLy8gaG9vayB1cGRhdGVzLCB3aGljaCBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseSBhbmQgZG9uJ3QgcmVhY2ggdGhpc1xuICAgIC8vIGZ1bmN0aW9uKSwgYnV0IHRoZXJlIGFyZSBzb21lIGludGVybmFsIFJlYWN0IGZlYXR1cmVzIHRoYXQgdXNlIHRoaXMgYXNcbiAgICAvLyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwsIGxpa2Ugc2VsZWN0aXZlIGh5ZHJhdGlvbi5cbiAgICB3YXJuQWJvdXRSZW5kZXJQaGFzZVVwZGF0ZXNJbkRFVihmaWJlcik7IC8vIFRyYWNrIGxhbmVzIHRoYXQgd2VyZSB1cGRhdGVkIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlXG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyBhIG5vcm1hbCB1cGRhdGUsIHNjaGVkdWxlZCBmcm9tIG91dHNpZGUgdGhlIHJlbmRlciBwaGFzZS4gRm9yXG4gICAgLy8gZXhhbXBsZSwgZHVyaW5nIGFuIGlucHV0IGV2ZW50LlxuICAgIHtcbiAgICAgIGlmIChpc0RldlRvb2xzUHJlc2VudCkge1xuICAgICAgICBhZGRGaWJlclRvTGFuZXNNYXAocm9vdCwgZmliZXIsIGxhbmUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHdhcm5JZlVwZGF0ZXNOb3RXcmFwcGVkV2l0aEFjdERFVihmaWJlcik7XG5cbiAgICBpZiAocm9vdCA9PT0gd29ya0luUHJvZ3Jlc3NSb290KSB7XG4gICAgICAvLyBSZWNlaXZlZCBhbiB1cGRhdGUgdG8gYSB0cmVlIHRoYXQncyBpbiB0aGUgbWlkZGxlIG9mIHJlbmRlcmluZy4gTWFya1xuICAgICAgLy8gdGhhdCB0aGVyZSB3YXMgYW4gaW50ZXJsZWF2ZWQgdXBkYXRlIHdvcmsgb24gdGhpcyByb290LiBVbmxlc3MgdGhlXG4gICAgICAvLyBgZGVmZXJSZW5kZXJQaGFzZVVwZGF0ZVRvTmV4dEJhdGNoYCBmbGFnIGlzIG9mZiBhbmQgdGhpcyBpcyBhIHJlbmRlclxuICAgICAgLy8gcGhhc2UgdXBkYXRlLiBJbiB0aGF0IGNhc2UsIHdlIGRvbid0IHRyZWF0IHJlbmRlciBwaGFzZSB1cGRhdGVzIGFzIGlmXG4gICAgICAvLyB0aGV5IHdlcmUgaW50ZXJsZWF2ZWQsIGZvciBiYWNrd2FyZHMgY29tcGF0IHJlYXNvbnMuXG4gICAgICBpZiAoIChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgPT09IE5vQ29udGV4dCkge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcyA9IG1lcmdlTGFuZXMod29ya0luUHJvZ3Jlc3NSb290SW50ZXJsZWF2ZWRVcGRhdGVkTGFuZXMsIGxhbmUpO1xuICAgICAgfVxuXG4gICAgICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdFN1c3BlbmRlZFdpdGhEZWxheSkge1xuICAgICAgICAvLyBUaGUgcm9vdCBhbHJlYWR5IHN1c3BlbmRlZCB3aXRoIGEgZGVsYXksIHdoaWNoIG1lYW5zIHRoaXMgcmVuZGVyXG4gICAgICAgIC8vIGRlZmluaXRlbHkgd29uJ3QgZmluaXNoLiBTaW5jZSB3ZSBoYXZlIGEgbmV3IHVwZGF0ZSwgbGV0J3MgbWFyayBpdCBhc1xuICAgICAgICAvLyBzdXNwZW5kZWQgbm93LCByaWdodCBiZWZvcmUgbWFya2luZyB0aGUgaW5jb21pbmcgdXBkYXRlLiBUaGlzIGhhcyB0aGVcbiAgICAgICAgLy8gZWZmZWN0IG9mIGludGVycnVwdGluZyB0aGUgY3VycmVudCByZW5kZXIgYW5kIHN3aXRjaGluZyB0byB0aGUgdXBkYXRlLlxuICAgICAgICAvLyBUT0RPOiBNYWtlIHN1cmUgdGhpcyBkb2Vzbid0IG92ZXJyaWRlIHBpbmdzIHRoYXQgaGFwcGVuIHdoaWxlIHdlJ3ZlXG4gICAgICAgIC8vIGFscmVhZHkgc3RhcnRlZCByZW5kZXJpbmcuXG4gICAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBldmVudFRpbWUpO1xuXG4gICAgaWYgKGxhbmUgPT09IFN5bmNMYW5lICYmIGV4ZWN1dGlvbkNvbnRleHQgPT09IE5vQ29udGV4dCAmJiAoZmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlICYmIC8vIFRyZWF0IGBhY3RgIGFzIGlmIGl0J3MgaW5zaWRlIGBiYXRjaGVkVXBkYXRlc2AsIGV2ZW4gaW4gbGVnYWN5IG1vZGUuXG4gICAgISggUmVhY3RDdXJyZW50QWN0UXVldWUkMS5pc0JhdGNoaW5nTGVnYWN5KSkge1xuICAgICAgLy8gRmx1c2ggdGhlIHN5bmNocm9ub3VzIHdvcmsgbm93LCB1bmxlc3Mgd2UncmUgYWxyZWFkeSB3b3JraW5nIG9yIGluc2lkZVxuICAgICAgLy8gYSBiYXRjaC4gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGluc2lkZSBzY2hlZHVsZVVwZGF0ZU9uRmliZXIgaW5zdGVhZCBvZlxuICAgICAgLy8gc2NoZWR1bGVDYWxsYmFja0ZvckZpYmVyIHRvIHByZXNlcnZlIHRoZSBhYmlsaXR5IHRvIHNjaGVkdWxlIGEgY2FsbGJhY2tcbiAgICAgIC8vIHdpdGhvdXQgaW1tZWRpYXRlbHkgZmx1c2hpbmcgaXQuIFdlIG9ubHkgZG8gdGhpcyBmb3IgdXNlci1pbml0aWF0ZWRcbiAgICAgIC8vIHVwZGF0ZXMsIHRvIHByZXNlcnZlIGhpc3RvcmljYWwgYmVoYXZpb3Igb2YgbGVnYWN5IG1vZGUuXG4gICAgICByZXNldFJlbmRlclRpbWVyKCk7XG4gICAgICBmbHVzaFN5bmNDYWxsYmFja3NPbmx5SW5MZWdhY3lNb2RlKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBzY2hlZHVsZUluaXRpYWxIeWRyYXRpb25PblJvb3Qocm9vdCwgbGFuZSwgZXZlbnRUaW1lKSB7XG4gIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGZvcmsgb2Ygc2NoZWR1bGVVcGRhdGVPbkZpYmVyIHRoYXQgaXMgb25seSB1c2VkIHRvXG4gIC8vIHNjaGVkdWxlIHRoZSBpbml0aWFsIGh5ZHJhdGlvbiBvZiBhIHJvb3QgdGhhdCBoYXMganVzdCBiZWVuIGNyZWF0ZWQuIE1vc3RcbiAgLy8gb2YgdGhlIHN0dWZmIGluIHNjaGVkdWxlVXBkYXRlT25GaWJlciBjYW4gYmUgc2tpcHBlZC5cbiAgLy9cbiAgLy8gVGhlIG1haW4gcmVhc29uIGZvciB0aGlzIHNlcGFyYXRlIHBhdGgsIHRob3VnaCwgaXMgdG8gZGlzdGluZ3Vpc2ggdGhlXG4gIC8vIGluaXRpYWwgY2hpbGRyZW4gZnJvbSBzdWJzZXF1ZW50IHVwZGF0ZXMuIEluIGZ1bGx5IGNsaWVudC1yZW5kZXJlZCByb290c1xuICAvLyAoY3JlYXRlUm9vdCBpbnN0ZWFkIG9mIGh5ZHJhdGVSb290KSwgYWxsIHRvcC1sZXZlbCByZW5kZXJzIGFyZSBtb2RlbGVkIGFzXG4gIC8vIHVwZGF0ZXMsIGJ1dCBoeWRyYXRpb24gcm9vdHMgYXJlIHNwZWNpYWwgYmVjYXVzZSB0aGUgaW5pdGlhbCByZW5kZXIgbXVzdFxuICAvLyBtYXRjaCB3aGF0IHdhcyByZW5kZXJlZCBvbiB0aGUgc2VydmVyLlxuICB2YXIgY3VycmVudCA9IHJvb3QuY3VycmVudDtcbiAgY3VycmVudC5sYW5lcyA9IGxhbmU7XG4gIG1hcmtSb290VXBkYXRlZChyb290LCBsYW5lLCBldmVudFRpbWUpO1xuICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcbn1cbmZ1bmN0aW9uIGlzVW5zYWZlQ2xhc3NSZW5kZXJQaGFzZVVwZGF0ZShmaWJlcikge1xuICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgcmVuZGVyIHBoYXNlIHVwZGF0ZS4gT25seSBjYWxsZWQgYnkgY2xhc3MgY29tcG9uZW50cyxcbiAgLy8gd2hpY2ggc3BlY2lhbCAoZGVwcmVjYXRlZCkgYmVoYXZpb3IgZm9yIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZSBwcm9wcy5cbiAgcmV0dXJuICgvLyBUT0RPOiBSZW1vdmUgb3V0ZGF0ZWQgZGVmZXJSZW5kZXJQaGFzZVVwZGF0ZVRvTmV4dEJhdGNoIGV4cGVyaW1lbnQuIFdlXG4gICAgLy8gZGVjaWRlZCBub3QgdG8gZW5hYmxlIGl0LlxuICAgICAoZXhlY3V0aW9uQ29udGV4dCAmIFJlbmRlckNvbnRleHQpICE9PSBOb0NvbnRleHRcbiAgKTtcbn0gLy8gVXNlIHRoaXMgZnVuY3Rpb24gdG8gc2NoZWR1bGUgYSB0YXNrIGZvciBhIHJvb3QuIFRoZXJlJ3Mgb25seSBvbmUgdGFzayBwZXJcbi8vIHJvb3Q7IGlmIGEgdGFzayB3YXMgYWxyZWFkeSBzY2hlZHVsZWQsIHdlJ2xsIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgcHJpb3JpdHlcbi8vIG9mIHRoZSBleGlzdGluZyB0YXNrIGlzIHRoZSBzYW1lIGFzIHRoZSBwcmlvcml0eSBvZiB0aGUgbmV4dCBsZXZlbCB0aGF0IHRoZVxuLy8gcm9vdCBoYXMgd29yayBvbi4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb24gZXZlcnkgdXBkYXRlLCBhbmQgcmlnaHQgYmVmb3JlXG4vLyBleGl0aW5nIGEgdGFzay5cblxuZnVuY3Rpb24gZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGN1cnJlbnRUaW1lKSB7XG4gIHZhciBleGlzdGluZ0NhbGxiYWNrTm9kZSA9IHJvb3QuY2FsbGJhY2tOb2RlOyAvLyBDaGVjayBpZiBhbnkgbGFuZXMgYXJlIGJlaW5nIHN0YXJ2ZWQgYnkgb3RoZXIgd29yay4gSWYgc28sIG1hcmsgdGhlbSBhc1xuICAvLyBleHBpcmVkIHNvIHdlIGtub3cgdG8gd29yayBvbiB0aG9zZSBuZXh0LlxuXG4gIG1hcmtTdGFydmVkTGFuZXNBc0V4cGlyZWQocm9vdCwgY3VycmVudFRpbWUpOyAvLyBEZXRlcm1pbmUgdGhlIG5leHQgbGFuZXMgdG8gd29yayBvbiwgYW5kIHRoZWlyIHByaW9yaXR5LlxuXG4gIHZhciBuZXh0TGFuZXMgPSBnZXROZXh0TGFuZXMocm9vdCwgcm9vdCA9PT0gd29ya0luUHJvZ3Jlc3NSb290ID8gd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgOiBOb0xhbmVzKTtcblxuICBpZiAobmV4dExhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgLy8gU3BlY2lhbCBjYXNlOiBUaGVyZSdzIG5vdGhpbmcgdG8gd29yayBvbi5cbiAgICBpZiAoZXhpc3RpbmdDYWxsYmFja05vZGUgIT09IG51bGwpIHtcbiAgICAgIGNhbmNlbENhbGxiYWNrJDEoZXhpc3RpbmdDYWxsYmFja05vZGUpO1xuICAgIH1cblxuICAgIHJvb3QuY2FsbGJhY2tOb2RlID0gbnVsbDtcbiAgICByb290LmNhbGxiYWNrUHJpb3JpdHkgPSBOb0xhbmU7XG4gICAgcmV0dXJuO1xuICB9IC8vIFdlIHVzZSB0aGUgaGlnaGVzdCBwcmlvcml0eSBsYW5lIHRvIHJlcHJlc2VudCB0aGUgcHJpb3JpdHkgb2YgdGhlIGNhbGxiYWNrLlxuXG5cbiAgdmFyIG5ld0NhbGxiYWNrUHJpb3JpdHkgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKG5leHRMYW5lcyk7IC8vIENoZWNrIGlmIHRoZXJlJ3MgYW4gZXhpc3RpbmcgdGFzay4gV2UgbWF5IGJlIGFibGUgdG8gcmV1c2UgaXQuXG5cbiAgdmFyIGV4aXN0aW5nQ2FsbGJhY2tQcmlvcml0eSA9IHJvb3QuY2FsbGJhY2tQcmlvcml0eTtcblxuICBpZiAoZXhpc3RpbmdDYWxsYmFja1ByaW9yaXR5ID09PSBuZXdDYWxsYmFja1ByaW9yaXR5ICYmIC8vIFNwZWNpYWwgY2FzZSByZWxhdGVkIHRvIGBhY3RgLiBJZiB0aGUgY3VycmVudGx5IHNjaGVkdWxlZCB0YXNrIGlzIGFcbiAgLy8gU2NoZWR1bGVyIHRhc2ssIHJhdGhlciB0aGFuIGFuIGBhY3RgIHRhc2ssIGNhbmNlbCBpdCBhbmQgcmUtc2NoZWR1bGVkXG4gIC8vIG9uIHRoZSBgYWN0YCBxdWV1ZS5cbiAgISggUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50ICE9PSBudWxsICYmIGV4aXN0aW5nQ2FsbGJhY2tOb2RlICE9PSBmYWtlQWN0Q2FsbGJhY2tOb2RlKSkge1xuICAgIHtcbiAgICAgIC8vIElmIHdlJ3JlIGdvaW5nIHRvIHJlLXVzZSBhbiBleGlzdGluZyB0YXNrLCBpdCBuZWVkcyB0byBleGlzdC5cbiAgICAgIC8vIEFzc3VtZSB0aGF0IGRpc2NyZXRlIHVwZGF0ZSBtaWNyb3Rhc2tzIGFyZSBub24tY2FuY2VsbGFibGUgYW5kIG51bGwuXG4gICAgICAvLyBUT0RPOiBUZW1wb3JhcnkgdW50aWwgd2UgY29uZmlybSB0aGlzIHdhcm5pbmcgaXMgbm90IGZpcmVkLlxuICAgICAgaWYgKGV4aXN0aW5nQ2FsbGJhY2tOb2RlID09IG51bGwgJiYgZXhpc3RpbmdDYWxsYmFja1ByaW9yaXR5ICE9PSBTeW5jTGFuZSkge1xuICAgICAgICBlcnJvcignRXhwZWN0ZWQgc2NoZWR1bGVkIGNhbGxiYWNrIHRvIGV4aXN0LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgfVxuICAgIH0gLy8gVGhlIHByaW9yaXR5IGhhc24ndCBjaGFuZ2VkLiBXZSBjYW4gcmV1c2UgdGhlIGV4aXN0aW5nIHRhc2suIEV4aXQuXG5cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChleGlzdGluZ0NhbGxiYWNrTm9kZSAhPSBudWxsKSB7XG4gICAgLy8gQ2FuY2VsIHRoZSBleGlzdGluZyBjYWxsYmFjay4gV2UnbGwgc2NoZWR1bGUgYSBuZXcgb25lIGJlbG93LlxuICAgIGNhbmNlbENhbGxiYWNrJDEoZXhpc3RpbmdDYWxsYmFja05vZGUpO1xuICB9IC8vIFNjaGVkdWxlIGEgbmV3IGNhbGxiYWNrLlxuXG5cbiAgdmFyIG5ld0NhbGxiYWNrTm9kZTtcblxuICBpZiAobmV3Q2FsbGJhY2tQcmlvcml0eSA9PT0gU3luY0xhbmUpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2U6IFN5bmMgUmVhY3QgY2FsbGJhY2tzIGFyZSBzY2hlZHVsZWQgb24gYSBzcGVjaWFsXG4gICAgLy8gaW50ZXJuYWwgcXVldWVcbiAgICBpZiAocm9vdC50YWcgPT09IExlZ2FjeVJvb3QpIHtcbiAgICAgIGlmICggUmVhY3RDdXJyZW50QWN0UXVldWUkMS5pc0JhdGNoaW5nTGVnYWN5ICE9PSBudWxsKSB7XG4gICAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuZGlkU2NoZWR1bGVMZWdhY3lVcGRhdGUgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBzY2hlZHVsZUxlZ2FjeVN5bmNDYWxsYmFjayhwZXJmb3JtU3luY1dvcmtPblJvb3QuYmluZChudWxsLCByb290KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjaGVkdWxlU3luY0NhbGxiYWNrKHBlcmZvcm1TeW5jV29ya09uUm9vdC5iaW5kKG51bGwsIHJvb3QpKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICAvLyBGbHVzaCB0aGUgcXVldWUgaW4gYSBtaWNyb3Rhc2suXG4gICAgICBpZiAoIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAvLyBJbnNpZGUgYGFjdGAsIHVzZSBvdXIgaW50ZXJuYWwgYGFjdGAgcXVldWUgc28gdGhhdCB0aGVzZSBnZXQgZmx1c2hlZFxuICAgICAgICAvLyBhdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHNjb3BlIGV2ZW4gd2hlbiB1c2luZyB0aGUgc3luYyB2ZXJzaW9uXG4gICAgICAgIC8vIG9mIGBhY3RgLlxuICAgICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmN1cnJlbnQucHVzaChmbHVzaFN5bmNDYWxsYmFja3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2NoZWR1bGVNaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIEluIFNhZmFyaSwgYXBwZW5kaW5nIGFuIGlmcmFtZSBmb3JjZXMgbWljcm90YXNrcyB0byBydW4uXG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8yMjQ1OVxuICAgICAgICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgcnVubmluZyBjYWxsYmFja3MgaW4gdGhlIG1pZGRsZSBvZiByZW5kZXJcbiAgICAgICAgICAvLyBvciBjb21taXQgc28gd2UgbmVlZCB0byBjaGVjayBhZ2FpbnN0IHRoYXQuXG4gICAgICAgICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgPT09IE5vQ29udGV4dCkge1xuICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgd291bGQgc3RpbGwgcHJlbWF0dXJlbHkgZmx1c2ggdGhlIGNhbGxiYWNrc1xuICAgICAgICAgICAgLy8gaWYgdGhpcyBoYXBwZW5zIG91dHNpZGUgcmVuZGVyIG9yIGNvbW1pdCBwaGFzZSAoZS5nLiBpbiBhbiBldmVudCkuXG4gICAgICAgICAgICBmbHVzaFN5bmNDYWxsYmFja3MoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5ld0NhbGxiYWNrTm9kZSA9IG51bGw7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHNjaGVkdWxlclByaW9yaXR5TGV2ZWw7XG5cbiAgICBzd2l0Y2ggKGxhbmVzVG9FdmVudFByaW9yaXR5KG5leHRMYW5lcykpIHtcbiAgICAgIGNhc2UgRGlzY3JldGVFdmVudFByaW9yaXR5OlxuICAgICAgICBzY2hlZHVsZXJQcmlvcml0eUxldmVsID0gSW1tZWRpYXRlUHJpb3JpdHk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIENvbnRpbnVvdXNFdmVudFByaW9yaXR5OlxuICAgICAgICBzY2hlZHVsZXJQcmlvcml0eUxldmVsID0gVXNlckJsb2NraW5nUHJpb3JpdHk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIERlZmF1bHRFdmVudFByaW9yaXR5OlxuICAgICAgICBzY2hlZHVsZXJQcmlvcml0eUxldmVsID0gTm9ybWFsUHJpb3JpdHk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIElkbGVFdmVudFByaW9yaXR5OlxuICAgICAgICBzY2hlZHVsZXJQcmlvcml0eUxldmVsID0gSWRsZVByaW9yaXR5O1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHlMZXZlbCA9IE5vcm1hbFByaW9yaXR5O1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBuZXdDYWxsYmFja05vZGUgPSBzY2hlZHVsZUNhbGxiYWNrJDEoc2NoZWR1bGVyUHJpb3JpdHlMZXZlbCwgcGVyZm9ybUNvbmN1cnJlbnRXb3JrT25Sb290LmJpbmQobnVsbCwgcm9vdCkpO1xuICB9XG5cbiAgcm9vdC5jYWxsYmFja1ByaW9yaXR5ID0gbmV3Q2FsbGJhY2tQcmlvcml0eTtcbiAgcm9vdC5jYWxsYmFja05vZGUgPSBuZXdDYWxsYmFja05vZGU7XG59IC8vIFRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IGZvciBldmVyeSBjb25jdXJyZW50IHRhc2ssIGkuZS4gYW55dGhpbmcgdGhhdFxuLy8gZ29lcyB0aHJvdWdoIFNjaGVkdWxlci5cblxuXG5mdW5jdGlvbiBwZXJmb3JtQ29uY3VycmVudFdvcmtPblJvb3Qocm9vdCwgZGlkVGltZW91dCkge1xuICB7XG4gICAgcmVzZXROZXN0ZWRVcGRhdGVGbGFnKCk7XG4gIH0gLy8gU2luY2Ugd2Uga25vdyB3ZSdyZSBpbiBhIFJlYWN0IGV2ZW50LCB3ZSBjYW4gY2xlYXIgdGhlIGN1cnJlbnRcbiAgLy8gZXZlbnQgdGltZS4gVGhlIG5leHQgdXBkYXRlIHdpbGwgY29tcHV0ZSBhIG5ldyBldmVudCB0aW1lLlxuXG5cbiAgY3VycmVudEV2ZW50VGltZSA9IE5vVGltZXN0YW1wO1xuICBjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZSA9IE5vTGFuZXM7XG5cbiAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgIT09IE5vQ29udGV4dCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2hvdWxkIG5vdCBhbHJlYWR5IGJlIHdvcmtpbmcuJyk7XG4gIH0gLy8gRmx1c2ggYW55IHBlbmRpbmcgcGFzc2l2ZSBlZmZlY3RzIGJlZm9yZSBkZWNpZGluZyB3aGljaCBsYW5lcyB0byB3b3JrIG9uLFxuICAvLyBpbiBjYXNlIHRoZXkgc2NoZWR1bGUgYWRkaXRpb25hbCB3b3JrLlxuXG5cbiAgdmFyIG9yaWdpbmFsQ2FsbGJhY2tOb2RlID0gcm9vdC5jYWxsYmFja05vZGU7XG4gIHZhciBkaWRGbHVzaFBhc3NpdmVFZmZlY3RzID0gZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuXG4gIGlmIChkaWRGbHVzaFBhc3NpdmVFZmZlY3RzKSB7XG4gICAgLy8gU29tZXRoaW5nIGluIHRoZSBwYXNzaXZlIGVmZmVjdCBwaGFzZSBtYXkgaGF2ZSBjYW5jZWxlZCB0aGUgY3VycmVudCB0YXNrLlxuICAgIC8vIENoZWNrIGlmIHRoZSB0YXNrIG5vZGUgZm9yIHRoaXMgcm9vdCB3YXMgY2hhbmdlZC5cbiAgICBpZiAocm9vdC5jYWxsYmFja05vZGUgIT09IG9yaWdpbmFsQ2FsbGJhY2tOb2RlKSB7XG4gICAgICAvLyBUaGUgY3VycmVudCB0YXNrIHdhcyBjYW5jZWxlZC4gRXhpdC4gV2UgZG9uJ3QgbmVlZCB0byBjYWxsXG4gICAgICAvLyBgZW5zdXJlUm9vdElzU2NoZWR1bGVkYCBiZWNhdXNlIHRoZSBjaGVjayBhYm92ZSBpbXBsaWVzIGVpdGhlciB0aGF0XG4gICAgICAvLyB0aGVyZSdzIGEgbmV3IHRhc2ssIG9yIHRoYXQgdGhlcmUncyBubyByZW1haW5pbmcgd29yayBvbiB0aGlzIHJvb3QuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0gLy8gRGV0ZXJtaW5lIHRoZSBuZXh0IGxhbmVzIHRvIHdvcmsgb24sIHVzaW5nIHRoZSBmaWVsZHMgc3RvcmVkXG4gIC8vIG9uIHRoZSByb290LlxuXG5cbiAgdmFyIGxhbmVzID0gZ2V0TmV4dExhbmVzKHJvb3QsIHJvb3QgPT09IHdvcmtJblByb2dyZXNzUm9vdCA/IHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzIDogTm9MYW5lcyk7XG5cbiAgaWYgKGxhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgLy8gRGVmZW5zaXZlIGNvZGluZy4gVGhpcyBpcyBuZXZlciBleHBlY3RlZCB0byBoYXBwZW4uXG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLy8gV2UgZGlzYWJsZSB0aW1lLXNsaWNpbmcgaW4gc29tZSBjYXNlczogaWYgdGhlIHdvcmsgaGFzIGJlZW4gQ1BVLWJvdW5kXG4gIC8vIGZvciB0b28gbG9uZyAoXCJleHBpcmVkXCIgd29yaywgdG8gcHJldmVudCBzdGFydmF0aW9uKSwgb3Igd2UncmUgaW5cbiAgLy8gc3luYy11cGRhdGVzLWJ5LWRlZmF1bHQgbW9kZS5cbiAgLy8gVE9ETzogV2Ugb25seSBjaGVjayBgZGlkVGltZW91dGAgZGVmZW5zaXZlbHksIHRvIGFjY291bnQgZm9yIGEgU2NoZWR1bGVyXG4gIC8vIGJ1ZyB3ZSdyZSBzdGlsbCBpbnZlc3RpZ2F0aW5nLiBPbmNlIHRoZSBidWcgaW4gU2NoZWR1bGVyIGlzIGZpeGVkLFxuICAvLyB3ZSBjYW4gcmVtb3ZlIHRoaXMsIHNpbmNlIHdlIHRyYWNrIGV4cGlyYXRpb24gb3Vyc2VsdmVzLlxuXG5cbiAgdmFyIHNob3VsZFRpbWVTbGljZSA9ICFpbmNsdWRlc0Jsb2NraW5nTGFuZShyb290LCBsYW5lcykgJiYgIWluY2x1ZGVzRXhwaXJlZExhbmUocm9vdCwgbGFuZXMpICYmICggIWRpZFRpbWVvdXQpO1xuICB2YXIgZXhpdFN0YXR1cyA9IHNob3VsZFRpbWVTbGljZSA/IHJlbmRlclJvb3RDb25jdXJyZW50KHJvb3QsIGxhbmVzKSA6IHJlbmRlclJvb3RTeW5jKHJvb3QsIGxhbmVzKTtcblxuICBpZiAoZXhpdFN0YXR1cyAhPT0gUm9vdEluUHJvZ3Jlc3MpIHtcbiAgICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdEVycm9yZWQpIHtcbiAgICAgIC8vIElmIHNvbWV0aGluZyB0aHJldyBhbiBlcnJvciwgdHJ5IHJlbmRlcmluZyBvbmUgbW9yZSB0aW1lLiBXZSdsbFxuICAgICAgLy8gcmVuZGVyIHN5bmNocm9ub3VzbHkgdG8gYmxvY2sgY29uY3VycmVudCBkYXRhIG11dGF0aW9ucywgYW5kIHdlJ2xsXG4gICAgICAvLyBpbmNsdWRlcyBhbGwgcGVuZGluZyB1cGRhdGVzIGFyZSBpbmNsdWRlZC4gSWYgaXQgc3RpbGwgZmFpbHMgYWZ0ZXJcbiAgICAgIC8vIHRoZSBzZWNvbmQgYXR0ZW1wdCwgd2UnbGwgZ2l2ZSB1cCBhbmQgY29tbWl0IHRoZSByZXN1bHRpbmcgdHJlZS5cbiAgICAgIHZhciBlcnJvclJldHJ5TGFuZXMgPSBnZXRMYW5lc1RvUmV0cnlTeW5jaHJvbm91c2x5T25FcnJvcihyb290KTtcblxuICAgICAgaWYgKGVycm9yUmV0cnlMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgICBsYW5lcyA9IGVycm9yUmV0cnlMYW5lcztcbiAgICAgICAgZXhpdFN0YXR1cyA9IHJlY292ZXJGcm9tQ29uY3VycmVudEVycm9yKHJvb3QsIGVycm9yUmV0cnlMYW5lcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3RGYXRhbEVycm9yZWQpIHtcbiAgICAgIHZhciBmYXRhbEVycm9yID0gd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvcjtcbiAgICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIE5vTGFuZXMpO1xuICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBsYW5lcyk7XG4gICAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuICAgICAgdGhyb3cgZmF0YWxFcnJvcjtcbiAgICB9XG5cbiAgICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdERpZE5vdENvbXBsZXRlKSB7XG4gICAgICAvLyBUaGUgcmVuZGVyIHVud291bmQgd2l0aG91dCBjb21wbGV0aW5nIHRoZSB0cmVlLiBUaGlzIGhhcHBlbnMgaW4gc3BlY2lhbFxuICAgICAgLy8gY2FzZXMgd2hlcmUgbmVlZCB0byBleGl0IHRoZSBjdXJyZW50IHJlbmRlciB3aXRob3V0IHByb2R1Y2luZyBhXG4gICAgICAvLyBjb25zaXN0ZW50IHRyZWUgb3IgY29tbWl0dGluZy5cbiAgICAgIC8vXG4gICAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiBkdXJpbmcgYSBjb25jdXJyZW50IHJlbmRlciwgbm90IGEgZGlzY3JldGUgb3JcbiAgICAgIC8vIHN5bmNocm9ub3VzIHVwZGF0ZS4gV2Ugc2hvdWxkIGhhdmUgYWxyZWFkeSBjaGVja2VkIGZvciB0aGlzIHdoZW4gd2VcbiAgICAgIC8vIHVud291bmQgdGhlIHN0YWNrLlxuICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBsYW5lcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSByZW5kZXIgY29tcGxldGVkLlxuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyByZW5kZXIgbWF5IGhhdmUgeWllbGRlZCB0byBhIGNvbmN1cnJlbnQgZXZlbnQsIGFuZCBpZiBzbyxcbiAgICAgIC8vIGNvbmZpcm0gdGhhdCBhbnkgbmV3bHkgcmVuZGVyZWQgc3RvcmVzIGFyZSBjb25zaXN0ZW50LlxuICAgICAgLy8gVE9ETzogSXQncyBwb3NzaWJsZSB0aGF0IGV2ZW4gYSBjb25jdXJyZW50IHJlbmRlciBtYXkgbmV2ZXIgaGF2ZSB5aWVsZGVkXG4gICAgICAvLyB0byB0aGUgbWFpbiB0aHJlYWQsIGlmIGl0IHdhcyBmYXN0IGVub3VnaCwgb3IgaWYgaXQgZXhwaXJlZC4gV2UgY291bGRcbiAgICAgIC8vIHNraXAgdGhlIGNvbnNpc3RlbmN5IGNoZWNrIGluIHRoYXQgY2FzZSwgdG9vLlxuICAgICAgdmFyIHJlbmRlcldhc0NvbmN1cnJlbnQgPSAhaW5jbHVkZXNCbG9ja2luZ0xhbmUocm9vdCwgbGFuZXMpO1xuICAgICAgdmFyIGZpbmlzaGVkV29yayA9IHJvb3QuY3VycmVudC5hbHRlcm5hdGU7XG5cbiAgICAgIGlmIChyZW5kZXJXYXNDb25jdXJyZW50ICYmICFpc1JlbmRlckNvbnNpc3RlbnRXaXRoRXh0ZXJuYWxTdG9yZXMoZmluaXNoZWRXb3JrKSkge1xuICAgICAgICAvLyBBIHN0b3JlIHdhcyBtdXRhdGVkIGluIGFuIGludGVybGVhdmVkIGV2ZW50LiBSZW5kZXIgYWdhaW4sXG4gICAgICAgIC8vIHN5bmNocm9ub3VzbHksIHRvIGJsb2NrIGZ1cnRoZXIgbXV0YXRpb25zLlxuICAgICAgICBleGl0U3RhdHVzID0gcmVuZGVyUm9vdFN5bmMocm9vdCwgbGFuZXMpOyAvLyBXZSBuZWVkIHRvIGNoZWNrIGFnYWluIGlmIHNvbWV0aGluZyB0aHJld1xuXG4gICAgICAgIGlmIChleGl0U3RhdHVzID09PSBSb290RXJyb3JlZCkge1xuICAgICAgICAgIHZhciBfZXJyb3JSZXRyeUxhbmVzID0gZ2V0TGFuZXNUb1JldHJ5U3luY2hyb25vdXNseU9uRXJyb3Iocm9vdCk7XG5cbiAgICAgICAgICBpZiAoX2Vycm9yUmV0cnlMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgICAgICAgbGFuZXMgPSBfZXJyb3JSZXRyeUxhbmVzO1xuICAgICAgICAgICAgZXhpdFN0YXR1cyA9IHJlY292ZXJGcm9tQ29uY3VycmVudEVycm9yKHJvb3QsIF9lcnJvclJldHJ5TGFuZXMpOyAvLyBXZSBhc3N1bWUgdGhlIHRyZWUgaXMgbm93IGNvbnNpc3RlbnQgYmVjYXVzZSB3ZSBkaWRuJ3QgeWllbGQgdG8gYW55XG4gICAgICAgICAgICAvLyBjb25jdXJyZW50IGV2ZW50cy5cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdEZhdGFsRXJyb3JlZCkge1xuICAgICAgICAgIHZhciBfZmF0YWxFcnJvciA9IHdvcmtJblByb2dyZXNzUm9vdEZhdGFsRXJyb3I7XG4gICAgICAgICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgTm9MYW5lcyk7XG4gICAgICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBsYW5lcyk7XG4gICAgICAgICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcbiAgICAgICAgICB0aHJvdyBfZmF0YWxFcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSAvLyBXZSBub3cgaGF2ZSBhIGNvbnNpc3RlbnQgdHJlZS4gVGhlIG5leHQgc3RlcCBpcyBlaXRoZXIgdG8gY29tbWl0IGl0LFxuICAgICAgLy8gb3IsIGlmIHNvbWV0aGluZyBzdXNwZW5kZWQsIHdhaXQgdG8gY29tbWl0IGl0IGFmdGVyIGEgdGltZW91dC5cblxuXG4gICAgICByb290LmZpbmlzaGVkV29yayA9IGZpbmlzaGVkV29yaztcbiAgICAgIHJvb3QuZmluaXNoZWRMYW5lcyA9IGxhbmVzO1xuICAgICAgZmluaXNoQ29uY3VycmVudFJlbmRlcihyb290LCBleGl0U3RhdHVzLCBsYW5lcyk7XG4gICAgfVxuICB9XG5cbiAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcblxuICBpZiAocm9vdC5jYWxsYmFja05vZGUgPT09IG9yaWdpbmFsQ2FsbGJhY2tOb2RlKSB7XG4gICAgLy8gVGhlIHRhc2sgbm9kZSBzY2hlZHVsZWQgZm9yIHRoaXMgcm9vdCBpcyB0aGUgc2FtZSBvbmUgdGhhdCdzXG4gICAgLy8gY3VycmVudGx5IGV4ZWN1dGVkLiBOZWVkIHRvIHJldHVybiBhIGNvbnRpbnVhdGlvbi5cbiAgICByZXR1cm4gcGVyZm9ybUNvbmN1cnJlbnRXb3JrT25Sb290LmJpbmQobnVsbCwgcm9vdCk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmVjb3ZlckZyb21Db25jdXJyZW50RXJyb3Iocm9vdCwgZXJyb3JSZXRyeUxhbmVzKSB7XG4gIC8vIElmIGFuIGVycm9yIG9jY3VycmVkIGR1cmluZyBoeWRyYXRpb24sIGRpc2NhcmQgc2VydmVyIHJlc3BvbnNlIGFuZCBmYWxsXG4gIC8vIGJhY2sgdG8gY2xpZW50IHNpZGUgcmVuZGVyLlxuICAvLyBCZWZvcmUgcmVuZGVyaW5nIGFnYWluLCBzYXZlIHRoZSBlcnJvcnMgZnJvbSB0aGUgcHJldmlvdXMgYXR0ZW1wdC5cbiAgdmFyIGVycm9yc0Zyb21GaXJzdEF0dGVtcHQgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RDb25jdXJyZW50RXJyb3JzO1xuXG4gIGlmIChpc1Jvb3REZWh5ZHJhdGVkKHJvb3QpKSB7XG4gICAgLy8gVGhlIHNoZWxsIGZhaWxlZCB0byBoeWRyYXRlLiBTZXQgYSBmbGFnIHRvIGZvcmNlIGEgY2xpZW50IHJlbmRlcmluZ1xuICAgIC8vIGR1cmluZyB0aGUgbmV4dCBhdHRlbXB0LiBUbyBkbyB0aGlzLCB3ZSBjYWxsIHByZXBhcmVGcmVzaFN0YWNrIG5vd1xuICAgIC8vIHRvIGNyZWF0ZSB0aGUgcm9vdCB3b3JrLWluLXByb2dyZXNzIGZpYmVyLiBUaGlzIGlzIGEgYml0IHdlaXJkIGluIHRlcm1zXG4gICAgLy8gb2YgZmFjdG9yaW5nLCBiZWNhdXNlIGl0IHJlbGllcyBvbiByZW5kZXJSb290U3luYyBub3QgY2FsbGluZ1xuICAgIC8vIHByZXBhcmVGcmVzaFN0YWNrIGFnYWluIGluIHRoZSBjYWxsIGJlbG93LCB3aGljaCBoYXBwZW5zIGJlY2F1c2UgdGhlXG4gICAgLy8gcm9vdCBhbmQgbGFuZXMgaGF2ZW4ndCBjaGFuZ2VkLlxuICAgIC8vXG4gICAgLy8gVE9ETzogSSB0aGluayB3aGF0IHdlIHNob3VsZCBkbyBpcyBzZXQgRm9yY2VDbGllbnRSZW5kZXIgaW5zaWRlXG4gICAgLy8gdGhyb3dFeGNlcHRpb24sIGxpa2Ugd2UgZG8gZm9yIG5lc3RlZCBTdXNwZW5zZSBib3VuZGFyaWVzLiBUaGUgcmVhc29uXG4gICAgLy8gaXQncyBoZXJlIGluc3RlYWQgaXMgc28gd2UgY2FuIHN3aXRjaCB0byB0aGUgc3luY2hyb25vdXMgd29yayBsb29wLCB0b28uXG4gICAgLy8gU29tZXRoaW5nIHRvIGNvbnNpZGVyIGZvciBhIGZ1dHVyZSByZWZhY3Rvci5cbiAgICB2YXIgcm9vdFdvcmtJblByb2dyZXNzID0gcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgZXJyb3JSZXRyeUxhbmVzKTtcbiAgICByb290V29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRm9yY2VDbGllbnRSZW5kZXI7XG5cbiAgICB7XG4gICAgICBlcnJvckh5ZHJhdGluZ0NvbnRhaW5lcihyb290LmNvbnRhaW5lckluZm8pO1xuICAgIH1cbiAgfVxuXG4gIHZhciBleGl0U3RhdHVzID0gcmVuZGVyUm9vdFN5bmMocm9vdCwgZXJyb3JSZXRyeUxhbmVzKTtcblxuICBpZiAoZXhpdFN0YXR1cyAhPT0gUm9vdEVycm9yZWQpIHtcbiAgICAvLyBTdWNjZXNzZnVsbHkgZmluaXNoZWQgcmVuZGVyaW5nIG9uIHJldHJ5XG4gICAgLy8gVGhlIGVycm9ycyBmcm9tIHRoZSBmYWlsZWQgZmlyc3QgYXR0ZW1wdCBoYXZlIGJlZW4gcmVjb3ZlcmVkLiBBZGRcbiAgICAvLyB0aGVtIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHJlY292ZXJhYmxlIGVycm9ycy4gV2UnbGwgbG9nIHRoZW0gaW4gdGhlXG4gICAgLy8gY29tbWl0IHBoYXNlLlxuICAgIHZhciBlcnJvcnNGcm9tU2Vjb25kQXR0ZW1wdCA9IHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzO1xuICAgIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzID0gZXJyb3JzRnJvbUZpcnN0QXR0ZW1wdDsgLy8gVGhlIGVycm9ycyBmcm9tIHRoZSBzZWNvbmQgYXR0ZW1wdCBzaG91bGQgYmUgcXVldWVkIGFmdGVyIHRoZSBlcnJvcnNcbiAgICAvLyBmcm9tIHRoZSBmaXJzdCBhdHRlbXB0LCB0byBwcmVzZXJ2ZSB0aGUgY2F1c2FsIHNlcXVlbmNlLlxuXG4gICAgaWYgKGVycm9yc0Zyb21TZWNvbmRBdHRlbXB0ICE9PSBudWxsKSB7XG4gICAgICBxdWV1ZVJlY292ZXJhYmxlRXJyb3JzKGVycm9yc0Zyb21TZWNvbmRBdHRlbXB0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhpdFN0YXR1cztcbn1cblxuZnVuY3Rpb24gcXVldWVSZWNvdmVyYWJsZUVycm9ycyhlcnJvcnMpIHtcbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzID09PSBudWxsKSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMgPSBlcnJvcnM7XG4gIH0gZWxzZSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMucHVzaC5hcHBseSh3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgZXJyb3JzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5pc2hDb25jdXJyZW50UmVuZGVyKHJvb3QsIGV4aXRTdGF0dXMsIGxhbmVzKSB7XG4gIHN3aXRjaCAoZXhpdFN0YXR1cykge1xuICAgIGNhc2UgUm9vdEluUHJvZ3Jlc3M6XG4gICAgY2FzZSBSb290RmF0YWxFcnJvcmVkOlxuICAgICAge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jvb3QgZGlkIG5vdCBjb21wbGV0ZS4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH1cbiAgICAvLyBGbG93IGtub3dzIGFib3V0IGludmFyaWFudCwgc28gaXQgY29tcGxhaW5zIGlmIEkgYWRkIGEgYnJlYWtcbiAgICAvLyBzdGF0ZW1lbnQsIGJ1dCBlc2xpbnQgZG9lc24ndCBrbm93IGFib3V0IGludmFyaWFudCwgc28gaXQgY29tcGxhaW5zXG4gICAgLy8gaWYgSSBkby4gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICBjYXNlIFJvb3RFcnJvcmVkOlxuICAgICAge1xuICAgICAgICAvLyBXZSBzaG91bGQgaGF2ZSBhbHJlYWR5IGF0dGVtcHRlZCB0byByZXRyeSB0aGlzIHRyZWUuIElmIHdlIHJlYWNoZWRcbiAgICAgICAgLy8gdGhpcyBwb2ludCwgaXQgZXJyb3JlZCBhZ2Fpbi4gQ29tbWl0IGl0LlxuICAgICAgICBjb21taXRSb290KHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFJvb3RTdXNwZW5kZWQ6XG4gICAgICB7XG4gICAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgbGFuZXMpOyAvLyBXZSBoYXZlIGFuIGFjY2VwdGFibGUgbG9hZGluZyBzdGF0ZS4gV2UgbmVlZCB0byBmaWd1cmUgb3V0IGlmIHdlXG4gICAgICAgIC8vIHNob3VsZCBpbW1lZGlhdGVseSBjb21taXQgaXQgb3Igd2FpdCBhIGJpdC5cblxuICAgICAgICBpZiAoaW5jbHVkZXNPbmx5UmV0cmllcyhsYW5lcykgJiYgLy8gZG8gbm90IGRlbGF5IGlmIHdlJ3JlIGluc2lkZSBhbiBhY3QoKSBzY29wZVxuICAgICAgICAhc2hvdWxkRm9yY2VGbHVzaEZhbGxiYWNrc0luREVWKCkpIHtcbiAgICAgICAgICAvLyBUaGlzIHJlbmRlciBvbmx5IGluY2x1ZGVkIHJldHJpZXMsIG5vIHVwZGF0ZXMuIFRocm90dGxlIGNvbW1pdHRpbmdcbiAgICAgICAgICAvLyByZXRyaWVzIHNvIHRoYXQgd2UgZG9uJ3Qgc2hvdyB0b28gbWFueSBsb2FkaW5nIHN0YXRlcyB0b28gcXVpY2tseS5cbiAgICAgICAgICB2YXIgbXNVbnRpbFRpbWVvdXQgPSBnbG9iYWxNb3N0UmVjZW50RmFsbGJhY2tUaW1lICsgRkFMTEJBQ0tfVEhST1RUTEVfTVMgLSBub3coKTsgLy8gRG9uJ3QgYm90aGVyIHdpdGggYSB2ZXJ5IHNob3J0IHN1c3BlbnNlIHRpbWUuXG5cbiAgICAgICAgICBpZiAobXNVbnRpbFRpbWVvdXQgPiAxMCkge1xuICAgICAgICAgICAgdmFyIG5leHRMYW5lcyA9IGdldE5leHRMYW5lcyhyb290LCBOb0xhbmVzKTtcblxuICAgICAgICAgICAgaWYgKG5leHRMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgICAgICAgICAvLyBUaGVyZSdzIGFkZGl0aW9uYWwgd29yayBvbiB0aGlzIHJvb3QuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgc3VzcGVuZGVkTGFuZXMgPSByb290LnN1c3BlbmRlZExhbmVzO1xuXG4gICAgICAgICAgICBpZiAoIWlzU3Vic2V0T2ZMYW5lcyhzdXNwZW5kZWRMYW5lcywgbGFuZXMpKSB7XG4gICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBwcmVmZXIgdG8gcmVuZGVyIHRoZSBmYWxsYmFjayBvZiBhdCB0aGUgbGFzdFxuICAgICAgICAgICAgICAvLyBzdXNwZW5kZWQgbGV2ZWwuIFBpbmcgdGhlIGxhc3Qgc3VzcGVuZGVkIGxldmVsIHRvIHRyeVxuICAgICAgICAgICAgICAvLyByZW5kZXJpbmcgaXQgYWdhaW4uXG4gICAgICAgICAgICAgIC8vIEZJWE1FOiBXaGF0IGlmIHRoZSBzdXNwZW5kZWQgbGFuZXMgYXJlIElkbGU/IFNob3VsZCBub3QgcmVzdGFydC5cbiAgICAgICAgICAgICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICAgICAgICAgICAgbWFya1Jvb3RQaW5nZWQocm9vdCwgc3VzcGVuZGVkTGFuZXMpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gLy8gVGhlIHJlbmRlciBpcyBzdXNwZW5kZWQsIGl0IGhhc24ndCB0aW1lZCBvdXQsIGFuZCB0aGVyZSdzIG5vXG4gICAgICAgICAgICAvLyBsb3dlciBwcmlvcml0eSB3b3JrIHRvIGRvLiBJbnN0ZWFkIG9mIGNvbW1pdHRpbmcgdGhlIGZhbGxiYWNrXG4gICAgICAgICAgICAvLyBpbW1lZGlhdGVseSwgd2FpdCBmb3IgbW9yZSBkYXRhIHRvIGFycml2ZS5cblxuXG4gICAgICAgICAgICByb290LnRpbWVvdXRIYW5kbGUgPSBzY2hlZHVsZVRpbWVvdXQoY29tbWl0Um9vdC5iaW5kKG51bGwsIHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zKSwgbXNVbnRpbFRpbWVvdXQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIFRoZSB3b3JrIGV4cGlyZWQuIENvbW1pdCBpbW1lZGlhdGVseS5cblxuXG4gICAgICAgIGNvbW1pdFJvb3Qocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgUm9vdFN1c3BlbmRlZFdpdGhEZWxheTpcbiAgICAgIHtcbiAgICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBsYW5lcyk7XG5cbiAgICAgICAgaWYgKGluY2x1ZGVzT25seVRyYW5zaXRpb25zKGxhbmVzKSkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgYSB0cmFuc2l0aW9uLCBzbyB3ZSBzaG91bGQgZXhpdCB3aXRob3V0IGNvbW1pdHRpbmcgYVxuICAgICAgICAgIC8vIHBsYWNlaG9sZGVyIGFuZCB3aXRob3V0IHNjaGVkdWxpbmcgYSB0aW1lb3V0LiBEZWxheSBpbmRlZmluaXRlbHlcbiAgICAgICAgICAvLyB1bnRpbCB3ZSByZWNlaXZlIG1vcmUgZGF0YS5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc2hvdWxkRm9yY2VGbHVzaEZhbGxiYWNrc0luREVWKCkpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIHRyYW5zaXRpb24sIGJ1dCB3ZSBkaWQgdHJpZ2dlciBhbiBhdm9pZGVkIHN0YXRlLlxuICAgICAgICAgIC8vIFNjaGVkdWxlIGEgcGxhY2Vob2xkZXIgdG8gZGlzcGxheSBhZnRlciBhIHNob3J0IGRlbGF5LCB1c2luZyB0aGUgSnVzdFxuICAgICAgICAgIC8vIE5vdGljZWFibGUgRGlmZmVyZW5jZS5cbiAgICAgICAgICAvLyBUT0RPOiBJcyB0aGUgSk5EIG9wdGltaXphdGlvbiB3b3J0aCB0aGUgYWRkZWQgY29tcGxleGl0eT8gSWYgdGhpcyBpc1xuICAgICAgICAgIC8vIHRoZSBvbmx5IHJlYXNvbiB3ZSB0cmFjayB0aGUgZXZlbnQgdGltZSwgdGhlbiBwcm9iYWJseSBub3QuXG4gICAgICAgICAgLy8gQ29uc2lkZXIgcmVtb3ZpbmcuXG4gICAgICAgICAgdmFyIG1vc3RSZWNlbnRFdmVudFRpbWUgPSBnZXRNb3N0UmVjZW50RXZlbnRUaW1lKHJvb3QsIGxhbmVzKTtcbiAgICAgICAgICB2YXIgZXZlbnRUaW1lTXMgPSBtb3N0UmVjZW50RXZlbnRUaW1lO1xuICAgICAgICAgIHZhciB0aW1lRWxhcHNlZE1zID0gbm93KCkgLSBldmVudFRpbWVNcztcblxuICAgICAgICAgIHZhciBfbXNVbnRpbFRpbWVvdXQgPSBqbmQodGltZUVsYXBzZWRNcykgLSB0aW1lRWxhcHNlZE1zOyAvLyBEb24ndCBib3RoZXIgd2l0aCBhIHZlcnkgc2hvcnQgc3VzcGVuc2UgdGltZS5cblxuXG4gICAgICAgICAgaWYgKF9tc1VudGlsVGltZW91dCA+IDEwKSB7XG4gICAgICAgICAgICAvLyBJbnN0ZWFkIG9mIGNvbW1pdHRpbmcgdGhlIGZhbGxiYWNrIGltbWVkaWF0ZWx5LCB3YWl0IGZvciBtb3JlIGRhdGFcbiAgICAgICAgICAgIC8vIHRvIGFycml2ZS5cbiAgICAgICAgICAgIHJvb3QudGltZW91dEhhbmRsZSA9IHNjaGVkdWxlVGltZW91dChjb21taXRSb290LmJpbmQobnVsbCwgcm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpLCBfbXNVbnRpbFRpbWVvdXQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIENvbW1pdCB0aGUgcGxhY2Vob2xkZXIuXG5cblxuICAgICAgICBjb21taXRSb290KHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFJvb3RDb21wbGV0ZWQ6XG4gICAgICB7XG4gICAgICAgIC8vIFRoZSB3b3JrIGNvbXBsZXRlZC4gUmVhZHkgdG8gY29tbWl0LlxuICAgICAgICBjb21taXRSb290KHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gcm9vdCBleGl0IHN0YXR1cy4nKTtcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1JlbmRlckNvbnNpc3RlbnRXaXRoRXh0ZXJuYWxTdG9yZXMoZmluaXNoZWRXb3JrKSB7XG4gIC8vIFNlYXJjaCB0aGUgcmVuZGVyZWQgdHJlZSBmb3IgZXh0ZXJuYWwgc3RvcmUgcmVhZHMsIGFuZCBjaGVjayB3aGV0aGVyIHRoZVxuICAvLyBzdG9yZXMgd2VyZSBtdXRhdGVkIGluIGEgY29uY3VycmVudCBldmVudC4gSW50ZW50aW9uYWxseSB1c2luZyBhbiBpdGVyYXRpdmVcbiAgLy8gbG9vcCBpbnN0ZWFkIG9mIHJlY3Vyc2lvbiBzbyB3ZSBjYW4gZXhpdCBlYXJseS5cbiAgdmFyIG5vZGUgPSBmaW5pc2hlZFdvcms7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAobm9kZS5mbGFncyAmIFN0b3JlQ29uc2lzdGVuY3kpIHtcbiAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IG5vZGUudXBkYXRlUXVldWU7XG5cbiAgICAgIGlmICh1cGRhdGVRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgY2hlY2tzID0gdXBkYXRlUXVldWUuc3RvcmVzO1xuXG4gICAgICAgIGlmIChjaGVja3MgIT09IG51bGwpIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoZWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNoZWNrID0gY2hlY2tzW2ldO1xuICAgICAgICAgICAgdmFyIGdldFNuYXBzaG90ID0gY2hlY2suZ2V0U25hcHNob3Q7XG4gICAgICAgICAgICB2YXIgcmVuZGVyZWRWYWx1ZSA9IGNoZWNrLnZhbHVlO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBpZiAoIW9iamVjdElzKGdldFNuYXBzaG90KCksIHJlbmRlcmVkVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgLy8gRm91bmQgYW4gaW5jb25zaXN0ZW50IHN0b3JlLlxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgLy8gSWYgYGdldFNuYXBzaG90YCB0aHJvd3MsIHJldHVybiBgZmFsc2VgLiBUaGlzIHdpbGwgc2NoZWR1bGVcbiAgICAgICAgICAgICAgLy8gYSByZS1yZW5kZXIsIGFuZCB0aGUgZXJyb3Igd2lsbCBiZSByZXRocm93biBkdXJpbmcgcmVuZGVyLlxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNoaWxkID0gbm9kZS5jaGlsZDtcblxuICAgIGlmIChub2RlLnN1YnRyZWVGbGFncyAmIFN0b3JlQ29uc2lzdGVuY3kgJiYgY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICBub2RlID0gY2hpbGQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZSA9PT0gZmluaXNoZWRXb3JrKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IGZpbmlzaGVkV29yaykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cblxuICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICB9IC8vIEZsb3cgZG9lc24ndCBrbm93IHRoaXMgaXMgdW5yZWFjaGFibGUsIGJ1dCBlc2xpbnQgZG9lc1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5yZWFjaGFibGVcblxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIHN1c3BlbmRlZExhbmVzKSB7XG4gIC8vIFdoZW4gc3VzcGVuZGluZywgd2Ugc2hvdWxkIGFsd2F5cyBleGNsdWRlIGxhbmVzIHRoYXQgd2VyZSBwaW5nZWQgb3IgKG1vcmVcbiAgLy8gcmFyZWx5LCBzaW5jZSB3ZSB0cnkgdG8gYXZvaWQgaXQpIHVwZGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UuXG4gIC8vIFRPRE86IExvbCBtYXliZSB0aGVyZSdzIGEgYmV0dGVyIHdheSB0byBmYWN0b3IgdGhpcyBiZXNpZGVzIHRoaXNcbiAgLy8gb2Jub3hpb3VzbHkgbmFtZWQgZnVuY3Rpb24gOilcbiAgc3VzcGVuZGVkTGFuZXMgPSByZW1vdmVMYW5lcyhzdXNwZW5kZWRMYW5lcywgd29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXMpO1xuICBzdXNwZW5kZWRMYW5lcyA9IHJlbW92ZUxhbmVzKHN1c3BlbmRlZExhbmVzLCB3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcyk7XG4gIG1hcmtSb290U3VzcGVuZGVkKHJvb3QsIHN1c3BlbmRlZExhbmVzKTtcbn0gLy8gVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHN5bmNocm9ub3VzIHRhc2tzIHRoYXQgZG9uJ3QgZ29cbi8vIHRocm91Z2ggU2NoZWR1bGVyXG5cblxuZnVuY3Rpb24gcGVyZm9ybVN5bmNXb3JrT25Sb290KHJvb3QpIHtcbiAge1xuICAgIHN5bmNOZXN0ZWRVcGRhdGVGbGFnKCk7XG4gIH1cblxuICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbm90IGFscmVhZHkgYmUgd29ya2luZy4nKTtcbiAgfVxuXG4gIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgdmFyIGxhbmVzID0gZ2V0TmV4dExhbmVzKHJvb3QsIE5vTGFuZXMpO1xuXG4gIGlmICghaW5jbHVkZXNTb21lTGFuZShsYW5lcywgU3luY0xhbmUpKSB7XG4gICAgLy8gVGhlcmUncyBubyByZW1haW5pbmcgc3luYyB3b3JrIGxlZnQuXG4gICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBleGl0U3RhdHVzID0gcmVuZGVyUm9vdFN5bmMocm9vdCwgbGFuZXMpO1xuXG4gIGlmIChyb290LnRhZyAhPT0gTGVnYWN5Um9vdCAmJiBleGl0U3RhdHVzID09PSBSb290RXJyb3JlZCkge1xuICAgIC8vIElmIHNvbWV0aGluZyB0aHJldyBhbiBlcnJvciwgdHJ5IHJlbmRlcmluZyBvbmUgbW9yZSB0aW1lLiBXZSdsbCByZW5kZXJcbiAgICAvLyBzeW5jaHJvbm91c2x5IHRvIGJsb2NrIGNvbmN1cnJlbnQgZGF0YSBtdXRhdGlvbnMsIGFuZCB3ZSdsbCBpbmNsdWRlc1xuICAgIC8vIGFsbCBwZW5kaW5nIHVwZGF0ZXMgYXJlIGluY2x1ZGVkLiBJZiBpdCBzdGlsbCBmYWlscyBhZnRlciB0aGUgc2Vjb25kXG4gICAgLy8gYXR0ZW1wdCwgd2UnbGwgZ2l2ZSB1cCBhbmQgY29tbWl0IHRoZSByZXN1bHRpbmcgdHJlZS5cbiAgICB2YXIgZXJyb3JSZXRyeUxhbmVzID0gZ2V0TGFuZXNUb1JldHJ5U3luY2hyb25vdXNseU9uRXJyb3Iocm9vdCk7XG5cbiAgICBpZiAoZXJyb3JSZXRyeUxhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICBsYW5lcyA9IGVycm9yUmV0cnlMYW5lcztcbiAgICAgIGV4aXRTdGF0dXMgPSByZWNvdmVyRnJvbUNvbmN1cnJlbnRFcnJvcihyb290LCBlcnJvclJldHJ5TGFuZXMpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChleGl0U3RhdHVzID09PSBSb290RmF0YWxFcnJvcmVkKSB7XG4gICAgdmFyIGZhdGFsRXJyb3IgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RGYXRhbEVycm9yO1xuICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIE5vTGFuZXMpO1xuICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgbGFuZXMpO1xuICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG4gICAgdGhyb3cgZmF0YWxFcnJvcjtcbiAgfVxuXG4gIGlmIChleGl0U3RhdHVzID09PSBSb290RGlkTm90Q29tcGxldGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jvb3QgZGlkIG5vdCBjb21wbGV0ZS4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgfSAvLyBXZSBub3cgaGF2ZSBhIGNvbnNpc3RlbnQgdHJlZS4gQmVjYXVzZSB0aGlzIGlzIGEgc3luYyByZW5kZXIsIHdlXG4gIC8vIHdpbGwgY29tbWl0IGl0IGV2ZW4gaWYgc29tZXRoaW5nIHN1c3BlbmRlZC5cblxuXG4gIHZhciBmaW5pc2hlZFdvcmsgPSByb290LmN1cnJlbnQuYWx0ZXJuYXRlO1xuICByb290LmZpbmlzaGVkV29yayA9IGZpbmlzaGVkV29yaztcbiAgcm9vdC5maW5pc2hlZExhbmVzID0gbGFuZXM7XG4gIGNvbW1pdFJvb3Qocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpOyAvLyBCZWZvcmUgZXhpdGluZywgbWFrZSBzdXJlIHRoZXJlJ3MgYSBjYWxsYmFjayBzY2hlZHVsZWQgZm9yIHRoZSBuZXh0XG4gIC8vIHBlbmRpbmcgbGV2ZWwuXG5cbiAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGZsdXNoUm9vdChyb290LCBsYW5lcykge1xuICBpZiAobGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICBtYXJrUm9vdEVudGFuZ2xlZChyb290LCBtZXJnZUxhbmVzKGxhbmVzLCBTeW5jTGFuZSkpO1xuICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG5cbiAgICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSA9PT0gTm9Db250ZXh0KSB7XG4gICAgICByZXNldFJlbmRlclRpbWVyKCk7XG4gICAgICBmbHVzaFN5bmNDYWxsYmFja3MoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGJhdGNoZWRVcGRhdGVzJDEoZm4sIGEpIHtcbiAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgZXhlY3V0aW9uQ29udGV4dCB8PSBCYXRjaGVkQ29udGV4dDtcblxuICB0cnkge1xuICAgIHJldHVybiBmbihhKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7IC8vIElmIHRoZXJlIHdlcmUgbGVnYWN5IHN5bmMgdXBkYXRlcywgZmx1c2ggdGhlbSBhdCB0aGUgZW5kIG9mIHRoZSBvdXRlclxuICAgIC8vIG1vc3QgYmF0Y2hlZFVwZGF0ZXMtbGlrZSBtZXRob2QuXG5cbiAgICBpZiAoZXhlY3V0aW9uQ29udGV4dCA9PT0gTm9Db250ZXh0ICYmIC8vIFRyZWF0IGBhY3RgIGFzIGlmIGl0J3MgaW5zaWRlIGBiYXRjaGVkVXBkYXRlc2AsIGV2ZW4gaW4gbGVnYWN5IG1vZGUuXG4gICAgISggUmVhY3RDdXJyZW50QWN0UXVldWUkMS5pc0JhdGNoaW5nTGVnYWN5KSkge1xuICAgICAgcmVzZXRSZW5kZXJUaW1lcigpO1xuICAgICAgZmx1c2hTeW5jQ2FsbGJhY2tzT25seUluTGVnYWN5TW9kZSgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZGlzY3JldGVVcGRhdGVzKGZuLCBhLCBiLCBjLCBkKSB7XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbjtcblxuICB0cnkge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IG51bGw7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7XG4gICAgcmV0dXJuIGZuKGEsIGIsIGMsIGQpO1xuICB9IGZpbmFsbHkge1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5KTtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcblxuICAgIGlmIChleGVjdXRpb25Db250ZXh0ID09PSBOb0NvbnRleHQpIHtcbiAgICAgIHJlc2V0UmVuZGVyVGltZXIoKTtcbiAgICB9XG4gIH1cbn0gLy8gT3ZlcmxvYWQgdGhlIGRlZmluaXRpb24gdG8gdGhlIHR3byB2YWxpZCBzaWduYXR1cmVzLlxuLy8gV2FybmluZywgdGhpcyBvcHRzLW91dCBvZiBjaGVja2luZyB0aGUgZnVuY3Rpb24gYm9keS5cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlZGVjbGFyZVxuZnVuY3Rpb24gZmx1c2hTeW5jKGZuKSB7XG4gIC8vIEluIGxlZ2FjeSBtb2RlLCB3ZSBmbHVzaCBwZW5kaW5nIHBhc3NpdmUgZWZmZWN0cyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZVxuICAvLyBuZXh0IGV2ZW50LCBub3QgYXQgdGhlIGVuZCBvZiB0aGUgcHJldmlvdXMgb25lLlxuICBpZiAocm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgIT09IG51bGwgJiYgcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMudGFnID09PSBMZWdhY3lSb290ICYmIChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgPT09IE5vQ29udGV4dCkge1xuICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgfVxuXG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gQmF0Y2hlZENvbnRleHQ7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbjtcbiAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcblxuICB0cnkge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IG51bGw7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7XG5cbiAgICBpZiAoZm4pIHtcbiAgICAgIHJldHVybiBmbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSk7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG4gICAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0OyAvLyBGbHVzaCB0aGUgaW1tZWRpYXRlIGNhbGxiYWNrcyB0aGF0IHdlcmUgc2NoZWR1bGVkIGR1cmluZyB0aGlzIGJhdGNoLlxuICAgIC8vIE5vdGUgdGhhdCB0aGlzIHdpbGwgaGFwcGVuIGV2ZW4gaWYgYmF0Y2hlZFVwZGF0ZXMgaXMgaGlnaGVyIHVwXG4gICAgLy8gdGhlIHN0YWNrLlxuXG4gICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgPT09IE5vQ29udGV4dCkge1xuICAgICAgZmx1c2hTeW5jQ2FsbGJhY2tzKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBpc0FscmVhZHlSZW5kZXJpbmcoKSB7XG4gIC8vIFVzZWQgYnkgdGhlIHJlbmRlcmVyIHRvIHByaW50IGEgd2FybmluZyBpZiBjZXJ0YWluIEFQSXMgYXJlIGNhbGxlZCBmcm9tXG4gIC8vIHRoZSB3cm9uZyBjb250ZXh0LlxuICByZXR1cm4gIChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgIT09IE5vQ29udGV4dDtcbn1cbmZ1bmN0aW9uIHB1c2hSZW5kZXJMYW5lcyhmaWJlciwgbGFuZXMpIHtcbiAgcHVzaChzdWJ0cmVlUmVuZGVyTGFuZXNDdXJzb3IsIHN1YnRyZWVSZW5kZXJMYW5lcywgZmliZXIpO1xuICBzdWJ0cmVlUmVuZGVyTGFuZXMgPSBtZXJnZUxhbmVzKHN1YnRyZWVSZW5kZXJMYW5lcywgbGFuZXMpO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzLCBsYW5lcyk7XG59XG5mdW5jdGlvbiBwb3BSZW5kZXJMYW5lcyhmaWJlcikge1xuICBzdWJ0cmVlUmVuZGVyTGFuZXMgPSBzdWJ0cmVlUmVuZGVyTGFuZXNDdXJzb3IuY3VycmVudDtcbiAgcG9wKHN1YnRyZWVSZW5kZXJMYW5lc0N1cnNvciwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBsYW5lcykge1xuICByb290LmZpbmlzaGVkV29yayA9IG51bGw7XG4gIHJvb3QuZmluaXNoZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHZhciB0aW1lb3V0SGFuZGxlID0gcm9vdC50aW1lb3V0SGFuZGxlO1xuXG4gIGlmICh0aW1lb3V0SGFuZGxlICE9PSBub1RpbWVvdXQpIHtcbiAgICAvLyBUaGUgcm9vdCBwcmV2aW91cyBzdXNwZW5kZWQgYW5kIHNjaGVkdWxlZCBhIHRpbWVvdXQgdG8gY29tbWl0IGEgZmFsbGJhY2tcbiAgICAvLyBzdGF0ZS4gTm93IHRoYXQgd2UgaGF2ZSBhZGRpdGlvbmFsIHdvcmssIGNhbmNlbCB0aGUgdGltZW91dC5cbiAgICByb290LnRpbWVvdXRIYW5kbGUgPSBub1RpbWVvdXQ7IC8vICRGbG93Rml4TWUgQ29tcGxhaW5zIG5vVGltZW91dCBpcyBub3QgYSBUaW1lb3V0SUQsIGRlc3BpdGUgdGhlIGNoZWNrIGFib3ZlXG5cbiAgICBjYW5jZWxUaW1lb3V0KHRpbWVvdXRIYW5kbGUpO1xuICB9XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzICE9PSBudWxsKSB7XG4gICAgdmFyIGludGVycnVwdGVkV29yayA9IHdvcmtJblByb2dyZXNzLnJldHVybjtcblxuICAgIHdoaWxlIChpbnRlcnJ1cHRlZFdvcmsgIT09IG51bGwpIHtcbiAgICAgIHZhciBjdXJyZW50ID0gaW50ZXJydXB0ZWRXb3JrLmFsdGVybmF0ZTtcbiAgICAgIHVud2luZEludGVycnVwdGVkV29yayhjdXJyZW50LCBpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgaW50ZXJydXB0ZWRXb3JrID0gaW50ZXJydXB0ZWRXb3JrLnJldHVybjtcbiAgICB9XG4gIH1cblxuICB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSByb290O1xuICB2YXIgcm9vdFdvcmtJblByb2dyZXNzID0gY3JlYXRlV29ya0luUHJvZ3Jlc3Mocm9vdC5jdXJyZW50LCBudWxsKTtcbiAgd29ya0luUHJvZ3Jlc3MgPSByb290V29ya0luUHJvZ3Jlc3M7XG4gIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gc3VidHJlZVJlbmRlckxhbmVzID0gd29ya0luUHJvZ3Jlc3NSb290SW5jbHVkZWRMYW5lcyA9IGxhbmVzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdEluUHJvZ3Jlc3M7XG4gIHdvcmtJblByb2dyZXNzUm9vdEZhdGFsRXJyb3IgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RTa2lwcGVkTGFuZXMgPSBOb0xhbmVzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHdvcmtJblByb2dyZXNzUm9vdFBpbmdlZExhbmVzID0gTm9MYW5lcztcbiAgd29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9ycyA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzID0gbnVsbDtcbiAgZmluaXNoUXVldWVpbmdDb25jdXJyZW50VXBkYXRlcygpO1xuXG4gIHtcbiAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5kaXNjYXJkUGVuZGluZ1dhcm5pbmdzKCk7XG4gIH1cblxuICByZXR1cm4gcm9vdFdvcmtJblByb2dyZXNzO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVFcnJvcihyb290LCB0aHJvd25WYWx1ZSkge1xuICBkbyB7XG4gICAgdmFyIGVycm9yZWRXb3JrID0gd29ya0luUHJvZ3Jlc3M7XG5cbiAgICB0cnkge1xuICAgICAgLy8gUmVzZXQgbW9kdWxlLWxldmVsIHN0YXRlIHRoYXQgd2FzIHNldCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS5cbiAgICAgIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpO1xuICAgICAgcmVzZXRIb29rc0FmdGVyVGhyb3coKTtcbiAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7IC8vIFRPRE86IEkgZm91bmQgYW5kIGFkZGVkIHRoaXMgbWlzc2luZyBsaW5lIHdoaWxlIGludmVzdGlnYXRpbmcgYVxuICAgICAgLy8gc2VwYXJhdGUgaXNzdWUuIFdyaXRlIGEgcmVncmVzc2lvbiB0ZXN0IHVzaW5nIHN0cmluZyByZWZzLlxuXG4gICAgICBSZWFjdEN1cnJlbnRPd25lciQyLmN1cnJlbnQgPSBudWxsO1xuXG4gICAgICBpZiAoZXJyb3JlZFdvcmsgPT09IG51bGwgfHwgZXJyb3JlZFdvcmsucmV0dXJuID09PSBudWxsKSB7XG4gICAgICAgIC8vIEV4cGVjdGVkIHRvIGJlIHdvcmtpbmcgb24gYSBub24tcm9vdCBmaWJlci4gVGhpcyBpcyBhIGZhdGFsIGVycm9yXG4gICAgICAgIC8vIGJlY2F1c2UgdGhlcmUncyBubyBhbmNlc3RvciB0aGF0IGNhbiBoYW5kbGUgaXQ7IHRoZSByb290IGlzXG4gICAgICAgIC8vIHN1cHBvc2VkIHRvIGNhcHR1cmUgYWxsIGVycm9ycyB0aGF0IHdlcmVuJ3QgY2F1Z2h0IGJ5IGFuIGVycm9yXG4gICAgICAgIC8vIGJvdW5kYXJ5LlxuICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdEZhdGFsRXJyb3JlZDtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvciA9IHRocm93blZhbHVlOyAvLyBTZXQgYHdvcmtJblByb2dyZXNzYCB0byBudWxsLiBUaGlzIHJlcHJlc2VudHMgYWR2YW5jaW5nIHRvIHRoZSBuZXh0XG4gICAgICAgIC8vIHNpYmxpbmcsIG9yIHRoZSBwYXJlbnQgaWYgdGhlcmUgYXJlIG5vIHNpYmxpbmdzLiBCdXQgc2luY2UgdGhlIHJvb3RcbiAgICAgICAgLy8gaGFzIG5vIHNpYmxpbmdzIG5vciBhIHBhcmVudCwgd2Ugc2V0IGl0IHRvIG51bGwuIFVzdWFsbHkgdGhpcyBpc1xuICAgICAgICAvLyBoYW5kbGVkIGJ5IGBjb21wbGV0ZVVuaXRPZldvcmtgIG9yIGB1bndpbmRXb3JrYCwgYnV0IHNpbmNlIHdlJ3JlXG4gICAgICAgIC8vIGludGVudGlvbmFsbHkgbm90IGNhbGxpbmcgdGhvc2UsIHdlIG5lZWQgc2V0IGl0IGhlcmUuXG4gICAgICAgIC8vIFRPRE86IENvbnNpZGVyIGNhbGxpbmcgYHVud2luZFdvcmtgIHRvIHBvcCB0aGUgY29udGV4dHMuXG5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChlbmFibGVQcm9maWxlclRpbWVyICYmIGVycm9yZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAvLyBSZWNvcmQgdGhlIHRpbWUgc3BlbnQgcmVuZGVyaW5nIGJlZm9yZSBhbiBlcnJvciB3YXMgdGhyb3duLiBUaGlzXG4gICAgICAgIC8vIGF2b2lkcyBpbmFjY3VyYXRlIFByb2ZpbGVyIGR1cmF0aW9ucyBpbiB0aGUgY2FzZSBvZiBhXG4gICAgICAgIC8vIHN1c3BlbmRlZCByZW5kZXIuXG4gICAgICAgIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkRGVsdGEoZXJyb3JlZFdvcmssIHRydWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW5hYmxlU2NoZWR1bGluZ1Byb2ZpbGVyKSB7XG4gICAgICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCk7XG5cbiAgICAgICAgaWYgKHRocm93blZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB0aHJvd25WYWx1ZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHRocm93blZhbHVlLnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2YXIgd2FrZWFibGUgPSB0aHJvd25WYWx1ZTtcbiAgICAgICAgICBtYXJrQ29tcG9uZW50U3VzcGVuZGVkKGVycm9yZWRXb3JrLCB3YWtlYWJsZSwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1hcmtDb21wb25lbnRFcnJvcmVkKGVycm9yZWRXb3JrLCB0aHJvd25WYWx1ZSwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRocm93RXhjZXB0aW9uKHJvb3QsIGVycm9yZWRXb3JrLnJldHVybiwgZXJyb3JlZFdvcmssIHRocm93blZhbHVlLCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gICAgICBjb21wbGV0ZVVuaXRPZldvcmsoZXJyb3JlZFdvcmspO1xuICAgIH0gY2F0Y2ggKHlldEFub3RoZXJUaHJvd25WYWx1ZSkge1xuICAgICAgLy8gU29tZXRoaW5nIGluIHRoZSByZXR1cm4gcGF0aCBhbHNvIHRocmV3LlxuICAgICAgdGhyb3duVmFsdWUgPSB5ZXRBbm90aGVyVGhyb3duVmFsdWU7XG5cbiAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcyA9PT0gZXJyb3JlZFdvcmsgJiYgZXJyb3JlZFdvcmsgIT09IG51bGwpIHtcbiAgICAgICAgLy8gSWYgdGhpcyBib3VuZGFyeSBoYXMgYWxyZWFkeSBlcnJvcmVkLCB0aGVuIHdlIGhhZCB0cm91YmxlIHByb2Nlc3NpbmdcbiAgICAgICAgLy8gdGhlIGVycm9yLiBCdWJibGUgaXQgdG8gdGhlIG5leHQgYm91bmRhcnkuXG4gICAgICAgIGVycm9yZWRXb3JrID0gZXJyb3JlZFdvcmsucmV0dXJuO1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IGVycm9yZWRXb3JrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3JlZFdvcmsgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICAgIH1cblxuICAgICAgY29udGludWU7XG4gICAgfSAvLyBSZXR1cm4gdG8gdGhlIG5vcm1hbCB3b3JrIGxvb3AuXG5cblxuICAgIHJldHVybjtcbiAgfSB3aGlsZSAodHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIHB1c2hEaXNwYXRjaGVyKCkge1xuICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDIuY3VycmVudDtcbiAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQyLmN1cnJlbnQgPSBDb250ZXh0T25seURpc3BhdGNoZXI7XG5cbiAgaWYgKHByZXZEaXNwYXRjaGVyID09PSBudWxsKSB7XG4gICAgLy8gVGhlIFJlYWN0IGlzb21vcnBoaWMgcGFja2FnZSBkb2VzIG5vdCBpbmNsdWRlIGEgZGVmYXVsdCBkaXNwYXRjaGVyLlxuICAgIC8vIEluc3RlYWQgdGhlIGZpcnN0IHJlbmRlcmVyIHdpbGwgbGF6aWx5IGF0dGFjaCBvbmUsIGluIG9yZGVyIHRvIGdpdmVcbiAgICAvLyBuaWNlciBlcnJvciBtZXNzYWdlcy5cbiAgICByZXR1cm4gQ29udGV4dE9ubHlEaXNwYXRjaGVyO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBwcmV2RGlzcGF0Y2hlcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBwb3BEaXNwYXRjaGVyKHByZXZEaXNwYXRjaGVyKSB7XG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMi5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG59XG5cbmZ1bmN0aW9uIG1hcmtDb21taXRUaW1lT2ZGYWxsYmFjaygpIHtcbiAgZ2xvYmFsTW9zdFJlY2VudEZhbGxiYWNrVGltZSA9IG5vdygpO1xufVxuZnVuY3Rpb24gbWFya1NraXBwZWRVcGRhdGVMYW5lcyhsYW5lKSB7XG4gIHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcyA9IG1lcmdlTGFuZXMobGFuZSwgd29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzKTtcbn1cbmZ1bmN0aW9uIHJlbmRlckRpZFN1c3BlbmQoKSB7XG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290SW5Qcm9ncmVzcykge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290U3VzcGVuZGVkO1xuICB9XG59XG5mdW5jdGlvbiByZW5kZXJEaWRTdXNwZW5kRGVsYXlJZlBvc3NpYmxlKCkge1xuICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdEluUHJvZ3Jlc3MgfHwgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdFN1c3BlbmRlZCB8fCB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290RXJyb3JlZCkge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290U3VzcGVuZGVkV2l0aERlbGF5O1xuICB9IC8vIENoZWNrIGlmIHRoZXJlIGFyZSB1cGRhdGVzIHRoYXQgd2Ugc2tpcHBlZCB0cmVlIHRoYXQgbWlnaHQgaGF2ZSB1bmJsb2NrZWRcbiAgLy8gdGhpcyByZW5kZXIuXG5cblxuICBpZiAod29ya0luUHJvZ3Jlc3NSb290ICE9PSBudWxsICYmIChpbmNsdWRlc05vbklkbGVXb3JrKHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcykgfHwgaW5jbHVkZXNOb25JZGxlV29yayh3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcykpKSB7XG4gICAgLy8gTWFyayB0aGUgY3VycmVudCByZW5kZXIgYXMgc3VzcGVuZGVkIHNvIHRoYXQgd2Ugc3dpdGNoIHRvIHdvcmtpbmcgb25cbiAgICAvLyB0aGUgdXBkYXRlcyB0aGF0IHdlcmUgc2tpcHBlZC4gVXN1YWxseSB3ZSBvbmx5IHN1c3BlbmQgYXQgdGhlIGVuZCBvZlxuICAgIC8vIHRoZSByZW5kZXIgcGhhc2UuXG4gICAgLy8gVE9ETzogV2Ugc2hvdWxkIHByb2JhYmx5IGFsd2F5cyBtYXJrIHRoZSByb290IGFzIHN1c3BlbmRlZCBpbW1lZGlhdGVseVxuICAgIC8vIChpbnNpZGUgdGhpcyBmdW5jdGlvbiksIHNpbmNlIGJ5IHN1c3BlbmRpbmcgYXQgdGhlIGVuZCBvZiB0aGUgcmVuZGVyXG4gICAgLy8gcGhhc2UgaW50cm9kdWNlcyBhIHBvdGVudGlhbCBtaXN0YWtlIHdoZXJlIHdlIHN1c3BlbmQgbGFuZXMgdGhhdCB3ZXJlXG4gICAgLy8gcGluZ2VkIG9yIHVwZGF0ZWQgd2hpbGUgd2Ugd2VyZSByZW5kZXJpbmcuXG4gICAgbWFya1Jvb3RTdXNwZW5kZWQkMSh3b3JrSW5Qcm9ncmVzc1Jvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTtcbiAgfVxufVxuZnVuY3Rpb24gcmVuZGVyRGlkRXJyb3IoZXJyb3IpIHtcbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgIT09IFJvb3RTdXNwZW5kZWRXaXRoRGVsYXkpIHtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdEVycm9yZWQ7XG4gIH1cblxuICBpZiAod29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9ycyA9PT0gbnVsbCkge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdENvbmN1cnJlbnRFcnJvcnMgPSBbZXJyb3JdO1xuICB9IGVsc2Uge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdENvbmN1cnJlbnRFcnJvcnMucHVzaChlcnJvcik7XG4gIH1cbn0gLy8gQ2FsbGVkIGR1cmluZyByZW5kZXIgdG8gZGV0ZXJtaW5lIGlmIGFueXRoaW5nIGhhcyBzdXNwZW5kZWQuXG4vLyBSZXR1cm5zIGZhbHNlIGlmIHdlJ3JlIG5vdCBzdXJlLlxuXG5mdW5jdGlvbiByZW5kZXJIYXNOb3RTdXNwZW5kZWRZZXQoKSB7XG4gIC8vIElmIHNvbWV0aGluZyBlcnJvcmVkIG9yIGNvbXBsZXRlZCwgd2UgY2FuJ3QgcmVhbGx5IGJlIHN1cmUsXG4gIC8vIHNvIHRob3NlIGFyZSBmYWxzZS5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RJblByb2dyZXNzO1xufVxuXG5mdW5jdGlvbiByZW5kZXJSb290U3luYyhyb290LCBsYW5lcykge1xuICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICBleGVjdXRpb25Db250ZXh0IHw9IFJlbmRlckNvbnRleHQ7XG4gIHZhciBwcmV2RGlzcGF0Y2hlciA9IHB1c2hEaXNwYXRjaGVyKCk7IC8vIElmIHRoZSByb290IG9yIGxhbmVzIGhhdmUgY2hhbmdlZCwgdGhyb3cgb3V0IHRoZSBleGlzdGluZyBzdGFja1xuICAvLyBhbmQgcHJlcGFyZSBhIGZyZXNoIG9uZS4gT3RoZXJ3aXNlIHdlJ2xsIGNvbnRpbnVlIHdoZXJlIHdlIGxlZnQgb2ZmLlxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3QgIT09IHJvb3QgfHwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgIT09IGxhbmVzKSB7XG4gICAge1xuICAgICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICAgIHZhciBtZW1vaXplZFVwZGF0ZXJzID0gcm9vdC5tZW1vaXplZFVwZGF0ZXJzO1xuXG4gICAgICAgIGlmIChtZW1vaXplZFVwZGF0ZXJzLnNpemUgPiAwKSB7XG4gICAgICAgICAgcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgICAgbWVtb2l6ZWRVcGRhdGVycy5jbGVhcigpO1xuICAgICAgICB9IC8vIEF0IHRoaXMgcG9pbnQsIG1vdmUgRmliZXJzIHRoYXQgc2NoZWR1bGVkIHRoZSB1cGNvbWluZyB3b3JrIGZyb20gdGhlIE1hcCB0byB0aGUgU2V0LlxuICAgICAgICAvLyBJZiB3ZSBiYWlsb3V0IG9uIHRoaXMgd29yaywgd2UnbGwgbW92ZSB0aGVtIGJhY2sgKGxpa2UgYWJvdmUpLlxuICAgICAgICAvLyBJdCdzIGltcG9ydGFudCB0byBtb3ZlIHRoZW0gbm93IGluIGNhc2UgdGhlIHdvcmsgc3Bhd25zIG1vcmUgd29yayBhdCB0aGUgc2FtZSBwcmlvcml0eSB3aXRoIGRpZmZlcmVudCB1cGRhdGVycy5cbiAgICAgICAgLy8gVGhhdCB3YXkgd2UgY2FuIGtlZXAgdGhlIGN1cnJlbnQgdXBkYXRlIGFuZCBmdXR1cmUgdXBkYXRlcyBzZXBhcmF0ZS5cblxuXG4gICAgICAgIG1vdmVQZW5kaW5nRmliZXJzVG9NZW1vaXplZChyb290LCBsYW5lcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyA9IGdldFRyYW5zaXRpb25zRm9yTGFuZXMoKTtcbiAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBsYW5lcyk7XG4gIH1cblxuICB7XG4gICAgbWFya1JlbmRlclN0YXJ0ZWQobGFuZXMpO1xuICB9XG5cbiAgZG8ge1xuICAgIHRyeSB7XG4gICAgICB3b3JrTG9vcFN5bmMoKTtcbiAgICAgIGJyZWFrO1xuICAgIH0gY2F0Y2ggKHRocm93blZhbHVlKSB7XG4gICAgICBoYW5kbGVFcnJvcihyb290LCB0aHJvd25WYWx1ZSk7XG4gICAgfVxuICB9IHdoaWxlICh0cnVlKTtcblxuICByZXNldENvbnRleHREZXBlbmRlbmNpZXMoKTtcbiAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0O1xuICBwb3BEaXNwYXRjaGVyKHByZXZEaXNwYXRjaGVyKTtcblxuICBpZiAod29ya0luUHJvZ3Jlc3MgIT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIGEgc3luYyByZW5kZXIsIHNvIHdlIHNob3VsZCBoYXZlIGZpbmlzaGVkIHRoZSB3aG9sZSB0cmVlLlxuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbW1pdCBhbiBpbmNvbXBsZXRlIHJvb3QuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhICcgKyAnYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrUmVuZGVyU3RvcHBlZCgpO1xuICB9IC8vIFNldCB0aGlzIHRvIG51bGwgdG8gaW5kaWNhdGUgdGhlcmUncyBubyBpbi1wcm9ncmVzcyByZW5kZXIuXG5cblxuICB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA9IE5vTGFuZXM7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzO1xufSAvLyBUaGUgd29yayBsb29wIGlzIGFuIGV4dHJlbWVseSBob3QgcGF0aC4gVGVsbCBDbG9zdXJlIG5vdCB0byBpbmxpbmUgaXQuXG5cbi8qKiBAbm9pbmxpbmUgKi9cblxuXG5mdW5jdGlvbiB3b3JrTG9vcFN5bmMoKSB7XG4gIC8vIEFscmVhZHkgdGltZWQgb3V0LCBzbyBwZXJmb3JtIHdvcmsgd2l0aG91dCBjaGVja2luZyBpZiB3ZSBuZWVkIHRvIHlpZWxkLlxuICB3aGlsZSAod29ya0luUHJvZ3Jlc3MgIT09IG51bGwpIHtcbiAgICBwZXJmb3JtVW5pdE9mV29yayh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVuZGVyUm9vdENvbmN1cnJlbnQocm9vdCwgbGFuZXMpIHtcbiAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgZXhlY3V0aW9uQ29udGV4dCB8PSBSZW5kZXJDb250ZXh0O1xuICB2YXIgcHJldkRpc3BhdGNoZXIgPSBwdXNoRGlzcGF0Y2hlcigpOyAvLyBJZiB0aGUgcm9vdCBvciBsYW5lcyBoYXZlIGNoYW5nZWQsIHRocm93IG91dCB0aGUgZXhpc3Rpbmcgc3RhY2tcbiAgLy8gYW5kIHByZXBhcmUgYSBmcmVzaCBvbmUuIE90aGVyd2lzZSB3ZSdsbCBjb250aW51ZSB3aGVyZSB3ZSBsZWZ0IG9mZi5cblxuICBpZiAod29ya0luUHJvZ3Jlc3NSb290ICE9PSByb290IHx8IHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzICE9PSBsYW5lcykge1xuICAgIHtcbiAgICAgIGlmIChpc0RldlRvb2xzUHJlc2VudCkge1xuICAgICAgICB2YXIgbWVtb2l6ZWRVcGRhdGVycyA9IHJvb3QubWVtb2l6ZWRVcGRhdGVycztcblxuICAgICAgICBpZiAobWVtb2l6ZWRVcGRhdGVycy5zaXplID4gMCkge1xuICAgICAgICAgIHJlc3RvcmVQZW5kaW5nVXBkYXRlcnMocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICAgICAgICAgIG1lbW9pemVkVXBkYXRlcnMuY2xlYXIoKTtcbiAgICAgICAgfSAvLyBBdCB0aGlzIHBvaW50LCBtb3ZlIEZpYmVycyB0aGF0IHNjaGVkdWxlZCB0aGUgdXBjb21pbmcgd29yayBmcm9tIHRoZSBNYXAgdG8gdGhlIFNldC5cbiAgICAgICAgLy8gSWYgd2UgYmFpbG91dCBvbiB0aGlzIHdvcmssIHdlJ2xsIG1vdmUgdGhlbSBiYWNrIChsaWtlIGFib3ZlKS5cbiAgICAgICAgLy8gSXQncyBpbXBvcnRhbnQgdG8gbW92ZSB0aGVtIG5vdyBpbiBjYXNlIHRoZSB3b3JrIHNwYXducyBtb3JlIHdvcmsgYXQgdGhlIHNhbWUgcHJpb3JpdHkgd2l0aCBkaWZmZXJlbnQgdXBkYXRlcnMuXG4gICAgICAgIC8vIFRoYXQgd2F5IHdlIGNhbiBrZWVwIHRoZSBjdXJyZW50IHVwZGF0ZSBhbmQgZnV0dXJlIHVwZGF0ZXMgc2VwYXJhdGUuXG5cblxuICAgICAgICBtb3ZlUGVuZGluZ0ZpYmVyc1RvTWVtb2l6ZWQocm9vdCwgbGFuZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMgPSBnZXRUcmFuc2l0aW9uc0ZvckxhbmVzKCk7XG4gICAgcmVzZXRSZW5kZXJUaW1lcigpO1xuICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIGxhbmVzKTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrUmVuZGVyU3RhcnRlZChsYW5lcyk7XG4gIH1cblxuICBkbyB7XG4gICAgdHJ5IHtcbiAgICAgIHdvcmtMb29wQ29uY3VycmVudCgpO1xuICAgICAgYnJlYWs7XG4gICAgfSBjYXRjaCAodGhyb3duVmFsdWUpIHtcbiAgICAgIGhhbmRsZUVycm9yKHJvb3QsIHRocm93blZhbHVlKTtcbiAgICB9XG4gIH0gd2hpbGUgKHRydWUpO1xuXG4gIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpO1xuICBwb3BEaXNwYXRjaGVyKHByZXZEaXNwYXRjaGVyKTtcbiAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0O1xuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzICE9PSBudWxsKSB7XG4gICAgLy8gU3RpbGwgd29yayByZW1haW5pbmcuXG4gICAge1xuICAgICAgbWFya1JlbmRlcllpZWxkZWQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUm9vdEluUHJvZ3Jlc3M7XG4gIH0gZWxzZSB7XG4gICAgLy8gQ29tcGxldGVkIHRoZSB0cmVlLlxuICAgIHtcbiAgICAgIG1hcmtSZW5kZXJTdG9wcGVkKCk7XG4gICAgfSAvLyBTZXQgdGhpcyB0byBudWxsIHRvIGluZGljYXRlIHRoZXJlJ3Mgbm8gaW4tcHJvZ3Jlc3MgcmVuZGVyLlxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gTm9MYW5lczsgLy8gUmV0dXJuIHRoZSBmaW5hbCBleGl0IHN0YXR1cy5cblxuICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzO1xuICB9XG59XG4vKiogQG5vaW5saW5lICovXG5cblxuZnVuY3Rpb24gd29ya0xvb3BDb25jdXJyZW50KCkge1xuICAvLyBQZXJmb3JtIHdvcmsgdW50aWwgU2NoZWR1bGVyIGFza3MgdXMgdG8geWllbGRcbiAgd2hpbGUgKHdvcmtJblByb2dyZXNzICE9PSBudWxsICYmICFzaG91bGRZaWVsZCgpKSB7XG4gICAgcGVyZm9ybVVuaXRPZldvcmsod29ya0luUHJvZ3Jlc3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBlcmZvcm1Vbml0T2ZXb3JrKHVuaXRPZldvcmspIHtcbiAgLy8gVGhlIGN1cnJlbnQsIGZsdXNoZWQsIHN0YXRlIG9mIHRoaXMgZmliZXIgaXMgdGhlIGFsdGVybmF0ZS4gSWRlYWxseVxuICAvLyBub3RoaW5nIHNob3VsZCByZWx5IG9uIHRoaXMsIGJ1dCByZWx5aW5nIG9uIGl0IGhlcmUgbWVhbnMgdGhhdCB3ZSBkb24ndFxuICAvLyBuZWVkIGFuIGFkZGl0aW9uYWwgZmllbGQgb24gdGhlIHdvcmsgaW4gcHJvZ3Jlc3MuXG4gIHZhciBjdXJyZW50ID0gdW5pdE9mV29yay5hbHRlcm5hdGU7XG4gIHNldEN1cnJlbnRGaWJlcih1bml0T2ZXb3JrKTtcbiAgdmFyIG5leHQ7XG5cbiAgaWYgKCAodW5pdE9mV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICBzdGFydFByb2ZpbGVyVGltZXIodW5pdE9mV29yayk7XG4gICAgbmV4dCA9IGJlZ2luV29yayQxKGN1cnJlbnQsIHVuaXRPZldvcmssIHN1YnRyZWVSZW5kZXJMYW5lcyk7XG4gICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREZWx0YSh1bml0T2ZXb3JrLCB0cnVlKTtcbiAgfSBlbHNlIHtcbiAgICBuZXh0ID0gYmVnaW5Xb3JrJDEoY3VycmVudCwgdW5pdE9mV29yaywgc3VidHJlZVJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gIHVuaXRPZldvcmsubWVtb2l6ZWRQcm9wcyA9IHVuaXRPZldvcmsucGVuZGluZ1Byb3BzO1xuXG4gIGlmIChuZXh0ID09PSBudWxsKSB7XG4gICAgLy8gSWYgdGhpcyBkb2Vzbid0IHNwYXduIG5ldyB3b3JrLCBjb21wbGV0ZSB0aGUgY3VycmVudCB3b3JrLlxuICAgIGNvbXBsZXRlVW5pdE9mV29yayh1bml0T2ZXb3JrKTtcbiAgfSBlbHNlIHtcbiAgICB3b3JrSW5Qcm9ncmVzcyA9IG5leHQ7XG4gIH1cblxuICBSZWFjdEN1cnJlbnRPd25lciQyLmN1cnJlbnQgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBjb21wbGV0ZVVuaXRPZldvcmsodW5pdE9mV29yaykge1xuICAvLyBBdHRlbXB0IHRvIGNvbXBsZXRlIHRoZSBjdXJyZW50IHVuaXQgb2Ygd29yaywgdGhlbiBtb3ZlIHRvIHRoZSBuZXh0XG4gIC8vIHNpYmxpbmcuIElmIHRoZXJlIGFyZSBubyBtb3JlIHNpYmxpbmdzLCByZXR1cm4gdG8gdGhlIHBhcmVudCBmaWJlci5cbiAgdmFyIGNvbXBsZXRlZFdvcmsgPSB1bml0T2ZXb3JrO1xuXG4gIGRvIHtcbiAgICAvLyBUaGUgY3VycmVudCwgZmx1c2hlZCwgc3RhdGUgb2YgdGhpcyBmaWJlciBpcyB0aGUgYWx0ZXJuYXRlLiBJZGVhbGx5XG4gICAgLy8gbm90aGluZyBzaG91bGQgcmVseSBvbiB0aGlzLCBidXQgcmVseWluZyBvbiBpdCBoZXJlIG1lYW5zIHRoYXQgd2UgZG9uJ3RcbiAgICAvLyBuZWVkIGFuIGFkZGl0aW9uYWwgZmllbGQgb24gdGhlIHdvcmsgaW4gcHJvZ3Jlc3MuXG4gICAgdmFyIGN1cnJlbnQgPSBjb21wbGV0ZWRXb3JrLmFsdGVybmF0ZTtcbiAgICB2YXIgcmV0dXJuRmliZXIgPSBjb21wbGV0ZWRXb3JrLnJldHVybjsgLy8gQ2hlY2sgaWYgdGhlIHdvcmsgY29tcGxldGVkIG9yIGlmIHNvbWV0aGluZyB0aHJldy5cblxuICAgIGlmICgoY29tcGxldGVkV29yay5mbGFncyAmIEluY29tcGxldGUpID09PSBOb0ZsYWdzKSB7XG4gICAgICBzZXRDdXJyZW50RmliZXIoY29tcGxldGVkV29yayk7XG4gICAgICB2YXIgbmV4dCA9IHZvaWQgMDtcblxuICAgICAgaWYgKCAoY29tcGxldGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpID09PSBOb01vZGUpIHtcbiAgICAgICAgbmV4dCA9IGNvbXBsZXRlV29yayhjdXJyZW50LCBjb21wbGV0ZWRXb3JrLCBzdWJ0cmVlUmVuZGVyTGFuZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhcnRQcm9maWxlclRpbWVyKGNvbXBsZXRlZFdvcmspO1xuICAgICAgICBuZXh0ID0gY29tcGxldGVXb3JrKGN1cnJlbnQsIGNvbXBsZXRlZFdvcmssIHN1YnRyZWVSZW5kZXJMYW5lcyk7IC8vIFVwZGF0ZSByZW5kZXIgZHVyYXRpb24gYXNzdW1pbmcgd2UgZGlkbid0IGVycm9yLlxuXG4gICAgICAgIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkRGVsdGEoY29tcGxldGVkV29yaywgZmFsc2UpO1xuICAgICAgfVxuXG4gICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuXG4gICAgICBpZiAobmV4dCAhPT0gbnVsbCkge1xuICAgICAgICAvLyBDb21wbGV0aW5nIHRoaXMgZmliZXIgc3Bhd25lZCBuZXcgd29yay4gV29yayBvbiB0aGF0IG5leHQuXG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gbmV4dDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGZpYmVyIGRpZCBub3QgY29tcGxldGUgYmVjYXVzZSBzb21ldGhpbmcgdGhyZXcuIFBvcCB2YWx1ZXMgb2ZmXG4gICAgICAvLyB0aGUgc3RhY2sgd2l0aG91dCBlbnRlcmluZyB0aGUgY29tcGxldGUgcGhhc2UuIElmIHRoaXMgaXMgYSBib3VuZGFyeSxcbiAgICAgIC8vIGNhcHR1cmUgdmFsdWVzIGlmIHBvc3NpYmxlLlxuICAgICAgdmFyIF9uZXh0ID0gdW53aW5kV29yayhjdXJyZW50LCBjb21wbGV0ZWRXb3JrKTsgLy8gQmVjYXVzZSB0aGlzIGZpYmVyIGRpZCBub3QgY29tcGxldGUsIGRvbid0IHJlc2V0IGl0cyBsYW5lcy5cblxuXG4gICAgICBpZiAoX25leHQgIT09IG51bGwpIHtcbiAgICAgICAgLy8gSWYgY29tcGxldGluZyB0aGlzIHdvcmsgc3Bhd25lZCBuZXcgd29yaywgZG8gdGhhdCBuZXh0LiBXZSdsbCBjb21lXG4gICAgICAgIC8vIGJhY2sgaGVyZSBhZ2Fpbi5cbiAgICAgICAgLy8gU2luY2Ugd2UncmUgcmVzdGFydGluZywgcmVtb3ZlIGFueXRoaW5nIHRoYXQgaXMgbm90IGEgaG9zdCBlZmZlY3RcbiAgICAgICAgLy8gZnJvbSB0aGUgZWZmZWN0IHRhZy5cbiAgICAgICAgX25leHQuZmxhZ3MgJj0gSG9zdEVmZmVjdE1hc2s7XG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gX25leHQ7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCAoY29tcGxldGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgLy8gUmVjb3JkIHRoZSByZW5kZXIgZHVyYXRpb24gZm9yIHRoZSBmaWJlciB0aGF0IGVycm9yZWQuXG4gICAgICAgIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkRGVsdGEoY29tcGxldGVkV29yaywgZmFsc2UpOyAvLyBJbmNsdWRlIHRoZSB0aW1lIHNwZW50IHdvcmtpbmcgb24gZmFpbGVkIGNoaWxkcmVuIGJlZm9yZSBjb250aW51aW5nLlxuXG4gICAgICAgIHZhciBhY3R1YWxEdXJhdGlvbiA9IGNvbXBsZXRlZFdvcmsuYWN0dWFsRHVyYXRpb247XG4gICAgICAgIHZhciBjaGlsZCA9IGNvbXBsZXRlZFdvcmsuY2hpbGQ7XG5cbiAgICAgICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgYWN0dWFsRHVyYXRpb24gKz0gY2hpbGQuYWN0dWFsRHVyYXRpb247XG4gICAgICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgY29tcGxldGVkV29yay5hY3R1YWxEdXJhdGlvbiA9IGFjdHVhbER1cmF0aW9uO1xuICAgICAgfVxuXG4gICAgICBpZiAocmV0dXJuRmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgLy8gTWFyayB0aGUgcGFyZW50IGZpYmVyIGFzIGluY29tcGxldGUgYW5kIGNsZWFyIGl0cyBzdWJ0cmVlIGZsYWdzLlxuICAgICAgICByZXR1cm5GaWJlci5mbGFncyB8PSBJbmNvbXBsZXRlO1xuICAgICAgICByZXR1cm5GaWJlci5zdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuICAgICAgICByZXR1cm5GaWJlci5kZWxldGlvbnMgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gV2UndmUgdW53b3VuZCBhbGwgdGhlIHdheSB0byB0aGUgcm9vdC5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3REaWROb3RDb21wbGV0ZTtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHNpYmxpbmdGaWJlciA9IGNvbXBsZXRlZFdvcmsuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nRmliZXIgIT09IG51bGwpIHtcbiAgICAgIC8vIElmIHRoZXJlIGlzIG1vcmUgd29yayB0byBkbyBpbiB0aGlzIHJldHVybkZpYmVyLCBkbyB0aGF0IG5leHQuXG4gICAgICB3b3JrSW5Qcm9ncmVzcyA9IHNpYmxpbmdGaWJlcjtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIE90aGVyd2lzZSwgcmV0dXJuIHRvIHRoZSBwYXJlbnRcblxuXG4gICAgY29tcGxldGVkV29yayA9IHJldHVybkZpYmVyOyAvLyBVcGRhdGUgdGhlIG5leHQgdGhpbmcgd2UncmUgd29ya2luZyBvbiBpbiBjYXNlIHNvbWV0aGluZyB0aHJvd3MuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcyA9IGNvbXBsZXRlZFdvcms7XG4gIH0gd2hpbGUgKGNvbXBsZXRlZFdvcmsgIT09IG51bGwpOyAvLyBXZSd2ZSByZWFjaGVkIHRoZSByb290LlxuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RJblByb2dyZXNzKSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RDb21wbGV0ZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0Um9vdChyb290LCByZWNvdmVyYWJsZUVycm9ycywgdHJhbnNpdGlvbnMpIHtcbiAgLy8gVE9ETzogVGhpcyBubyBsb25nZXIgbWFrZXMgYW55IHNlbnNlLiBXZSBhbHJlYWR5IHdyYXAgdGhlIG11dGF0aW9uIGFuZFxuICAvLyBsYXlvdXQgcGhhc2VzLiBTaG91bGQgYmUgYWJsZSB0byByZW1vdmUuXG4gIHZhciBwcmV2aW91c1VwZGF0ZUxhbmVQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb247XG5cbiAgdHJ5IHtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBudWxsO1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShEaXNjcmV0ZUV2ZW50UHJpb3JpdHkpO1xuICAgIGNvbW1pdFJvb3RJbXBsKHJvb3QsIHJlY292ZXJhYmxlRXJyb3JzLCB0cmFuc2l0aW9ucywgcHJldmlvdXNVcGRhdGVMYW5lUHJpb3JpdHkpO1xuICB9IGZpbmFsbHkge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1VwZGF0ZUxhbmVQcmlvcml0eSk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gY29tbWl0Um9vdEltcGwocm9vdCwgcmVjb3ZlcmFibGVFcnJvcnMsIHRyYW5zaXRpb25zLCByZW5kZXJQcmlvcml0eUxldmVsKSB7XG4gIGRvIHtcbiAgICAvLyBgZmx1c2hQYXNzaXZlRWZmZWN0c2Agd2lsbCBjYWxsIGBmbHVzaFN5bmNVcGRhdGVRdWV1ZWAgYXQgdGhlIGVuZCwgd2hpY2hcbiAgICAvLyBtZWFucyBgZmx1c2hQYXNzaXZlRWZmZWN0c2Agd2lsbCBzb21ldGltZXMgcmVzdWx0IGluIGFkZGl0aW9uYWxcbiAgICAvLyBwYXNzaXZlIGVmZmVjdHMuIFNvIHdlIG5lZWQgdG8ga2VlcCBmbHVzaGluZyBpbiBhIGxvb3AgdW50aWwgdGhlcmUgYXJlXG4gICAgLy8gbm8gbW9yZSBwZW5kaW5nIGVmZmVjdHMuXG4gICAgLy8gVE9ETzogTWlnaHQgYmUgYmV0dGVyIGlmIGBmbHVzaFBhc3NpdmVFZmZlY3RzYCBkaWQgbm90IGF1dG9tYXRpY2FsbHlcbiAgICAvLyBmbHVzaCBzeW5jaHJvbm91cyB3b3JrIGF0IHRoZSBlbmQsIHRvIGF2b2lkIGZhY3RvcmluZyBoYXphcmRzIGxpa2UgdGhpcy5cbiAgICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG4gIH0gd2hpbGUgKHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzICE9PSBudWxsKTtcblxuICBmbHVzaFJlbmRlclBoYXNlU3RyaWN0TW9kZVdhcm5pbmdzSW5ERVYoKTtcblxuICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbm90IGFscmVhZHkgYmUgd29ya2luZy4nKTtcbiAgfVxuXG4gIHZhciBmaW5pc2hlZFdvcmsgPSByb290LmZpbmlzaGVkV29yaztcbiAgdmFyIGxhbmVzID0gcm9vdC5maW5pc2hlZExhbmVzO1xuXG4gIHtcbiAgICBtYXJrQ29tbWl0U3RhcnRlZChsYW5lcyk7XG4gIH1cblxuICBpZiAoZmluaXNoZWRXb3JrID09PSBudWxsKSB7XG5cbiAgICB7XG4gICAgICBtYXJrQ29tbWl0U3RvcHBlZCgpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2Uge1xuICAgIHtcbiAgICAgIGlmIChsYW5lcyA9PT0gTm9MYW5lcykge1xuICAgICAgICBlcnJvcigncm9vdC5maW5pc2hlZExhbmVzIHNob3VsZCBub3QgYmUgZW1wdHkgZHVyaW5nIGEgY29tbWl0LiBUaGlzIGlzIGEgJyArICdidWcgaW4gUmVhY3QuJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcm9vdC5maW5pc2hlZFdvcmsgPSBudWxsO1xuICByb290LmZpbmlzaGVkTGFuZXMgPSBOb0xhbmVzO1xuXG4gIGlmIChmaW5pc2hlZFdvcmsgPT09IHJvb3QuY3VycmVudCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbW1pdCB0aGUgc2FtZSB0cmVlIGFzIGJlZm9yZS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5ICcgKyAnYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9IC8vIGNvbW1pdFJvb3QgbmV2ZXIgcmV0dXJucyBhIGNvbnRpbnVhdGlvbjsgaXQgYWx3YXlzIGZpbmlzaGVzIHN5bmNocm9ub3VzbHkuXG4gIC8vIFNvIHdlIGNhbiBjbGVhciB0aGVzZSBub3cgdG8gYWxsb3cgYSBuZXcgY2FsbGJhY2sgdG8gYmUgc2NoZWR1bGVkLlxuXG5cbiAgcm9vdC5jYWxsYmFja05vZGUgPSBudWxsO1xuICByb290LmNhbGxiYWNrUHJpb3JpdHkgPSBOb0xhbmU7IC8vIFVwZGF0ZSB0aGUgZmlyc3QgYW5kIGxhc3QgcGVuZGluZyB0aW1lcyBvbiB0aGlzIHJvb3QuIFRoZSBuZXcgZmlyc3RcbiAgLy8gcGVuZGluZyB0aW1lIGlzIHdoYXRldmVyIGlzIGxlZnQgb24gdGhlIHJvb3QgZmliZXIuXG5cbiAgdmFyIHJlbWFpbmluZ0xhbmVzID0gbWVyZ2VMYW5lcyhmaW5pc2hlZFdvcmsubGFuZXMsIGZpbmlzaGVkV29yay5jaGlsZExhbmVzKTtcbiAgbWFya1Jvb3RGaW5pc2hlZChyb290LCByZW1haW5pbmdMYW5lcyk7XG5cbiAgaWYgKHJvb3QgPT09IHdvcmtJblByb2dyZXNzUm9vdCkge1xuICAgIC8vIFdlIGNhbiByZXNldCB0aGVzZSBub3cgdGhhdCB0aGV5IGFyZSBmaW5pc2hlZC5cbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA9IE5vTGFuZXM7XG4gIH0gLy8gSWYgdGhlcmUgYXJlIHBlbmRpbmcgcGFzc2l2ZSBlZmZlY3RzLCBzY2hlZHVsZSBhIGNhbGxiYWNrIHRvIHByb2Nlc3MgdGhlbS5cbiAgLy8gRG8gdGhpcyBhcyBlYXJseSBhcyBwb3NzaWJsZSwgc28gaXQgaXMgcXVldWVkIGJlZm9yZSBhbnl0aGluZyBlbHNlIHRoYXRcbiAgLy8gbWlnaHQgZ2V0IHNjaGVkdWxlZCBpbiB0aGUgY29tbWl0IHBoYXNlLiAoU2VlICMxNjcxNC4pXG4gIC8vIFRPRE86IERlbGV0ZSBhbGwgb3RoZXIgcGxhY2VzIHRoYXQgc2NoZWR1bGUgdGhlIHBhc3NpdmUgZWZmZWN0IGNhbGxiYWNrXG4gIC8vIFRoZXkncmUgcmVkdW5kYW50LlxuXG5cbiAgaWYgKChmaW5pc2hlZFdvcmsuc3VidHJlZUZsYWdzICYgUGFzc2l2ZU1hc2spICE9PSBOb0ZsYWdzIHx8IChmaW5pc2hlZFdvcmsuZmxhZ3MgJiBQYXNzaXZlTWFzaykgIT09IE5vRmxhZ3MpIHtcbiAgICBpZiAoIXJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzKSB7XG4gICAgICByb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cyA9IHRydWU7XG4gICAgICAvLyB0byBzdG9yZSBpdCBpbiBwZW5kaW5nUGFzc2l2ZVRyYW5zaXRpb25zIHVudGlsIHRoZXkgZ2V0IHByb2Nlc3NlZFxuICAgICAgLy8gV2UgbmVlZCB0byBwYXNzIHRoaXMgdGhyb3VnaCBhcyBhbiBhcmd1bWVudCB0byBjb21taXRSb290XG4gICAgICAvLyBiZWNhdXNlIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMgbWlnaHQgaGF2ZSBjaGFuZ2VkIGJldHdlZW5cbiAgICAgIC8vIHRoZSBwcmV2aW91cyByZW5kZXIgYW5kIGNvbW1pdCBpZiB3ZSB0aHJvdHRsZSB0aGUgY29tbWl0XG4gICAgICAvLyB3aXRoIHNldFRpbWVvdXRcblxuICAgICAgcGVuZGluZ1Bhc3NpdmVUcmFuc2l0aW9ucyA9IHRyYW5zaXRpb25zO1xuICAgICAgc2NoZWR1bGVDYWxsYmFjayQxKE5vcm1hbFByaW9yaXR5LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTsgLy8gVGhpcyByZW5kZXIgdHJpZ2dlcmVkIHBhc3NpdmUgZWZmZWN0czogcmVsZWFzZSB0aGUgcm9vdCBjYWNoZSBwb29sXG4gICAgICAgIC8vICphZnRlciogcGFzc2l2ZSBlZmZlY3RzIGZpcmUgdG8gYXZvaWQgZnJlZWluZyBhIGNhY2hlIHBvb2wgdGhhdCBtYXlcbiAgICAgICAgLy8gYmUgcmVmZXJlbmNlZCBieSBhIG5vZGUgaW4gdGhlIHRyZWUgKEhvc3RSb290LCBDYWNoZSBib3VuZGFyeSBldGMpXG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9KTtcbiAgICB9XG4gIH0gLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBlZmZlY3RzIGluIHRoZSB3aG9sZSB0cmVlLlxuICAvLyBUT0RPOiBUaGlzIGlzIGxlZnQgb3ZlciBmcm9tIHRoZSBlZmZlY3QgbGlzdCBpbXBsZW1lbnRhdGlvbiwgd2hlcmUgd2UgaGFkXG4gIC8vIHRvIGNoZWNrIGZvciB0aGUgZXhpc3RlbmNlIG9mIGBmaXJzdEVmZmVjdGAgdG8gc2F0aXNmeSBGbG93LiBJIHRoaW5rIHRoZVxuICAvLyBvbmx5IG90aGVyIHJlYXNvbiB0aGlzIG9wdGltaXphdGlvbiBleGlzdHMgaXMgYmVjYXVzZSBpdCBhZmZlY3RzIHByb2ZpbGluZy5cbiAgLy8gUmVjb25zaWRlciB3aGV0aGVyIHRoaXMgaXMgbmVjZXNzYXJ5LlxuXG5cbiAgdmFyIHN1YnRyZWVIYXNFZmZlY3RzID0gKGZpbmlzaGVkV29yay5zdWJ0cmVlRmxhZ3MgJiAoQmVmb3JlTXV0YXRpb25NYXNrIHwgTXV0YXRpb25NYXNrIHwgTGF5b3V0TWFzayB8IFBhc3NpdmVNYXNrKSkgIT09IE5vRmxhZ3M7XG4gIHZhciByb290SGFzRWZmZWN0ID0gKGZpbmlzaGVkV29yay5mbGFncyAmIChCZWZvcmVNdXRhdGlvbk1hc2sgfCBNdXRhdGlvbk1hc2sgfCBMYXlvdXRNYXNrIHwgUGFzc2l2ZU1hc2spKSAhPT0gTm9GbGFncztcblxuICBpZiAoc3VidHJlZUhhc0VmZmVjdHMgfHwgcm9vdEhhc0VmZmVjdCkge1xuICAgIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbjtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBudWxsO1xuICAgIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7XG4gICAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgICBleGVjdXRpb25Db250ZXh0IHw9IENvbW1pdENvbnRleHQ7IC8vIFJlc2V0IHRoaXMgdG8gbnVsbCBiZWZvcmUgY2FsbGluZyBsaWZlY3ljbGVzXG5cbiAgICBSZWFjdEN1cnJlbnRPd25lciQyLmN1cnJlbnQgPSBudWxsOyAvLyBUaGUgY29tbWl0IHBoYXNlIGlzIGJyb2tlbiBpbnRvIHNldmVyYWwgc3ViLXBoYXNlcy4gV2UgZG8gYSBzZXBhcmF0ZSBwYXNzXG4gICAgLy8gb2YgdGhlIGVmZmVjdCBsaXN0IGZvciBlYWNoIHBoYXNlOiBhbGwgbXV0YXRpb24gZWZmZWN0cyBjb21lIGJlZm9yZSBhbGxcbiAgICAvLyBsYXlvdXQgZWZmZWN0cywgYW5kIHNvIG9uLlxuICAgIC8vIFRoZSBmaXJzdCBwaGFzZSBhIFwiYmVmb3JlIG11dGF0aW9uXCIgcGhhc2UuIFdlIHVzZSB0aGlzIHBoYXNlIHRvIHJlYWQgdGhlXG4gICAgLy8gc3RhdGUgb2YgdGhlIGhvc3QgdHJlZSByaWdodCBiZWZvcmUgd2UgbXV0YXRlIGl0LiBUaGlzIGlzIHdoZXJlXG4gICAgLy8gZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgaXMgY2FsbGVkLlxuXG4gICAgdmFyIHNob3VsZEZpcmVBZnRlckFjdGl2ZUluc3RhbmNlQmx1ciA9IGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuXG4gICAge1xuICAgICAgLy8gTWFyayB0aGUgY3VycmVudCBjb21taXQgdGltZSB0byBiZSBzaGFyZWQgYnkgYWxsIFByb2ZpbGVycyBpbiB0aGlzXG4gICAgICAvLyBiYXRjaC4gVGhpcyBlbmFibGVzIHRoZW0gdG8gYmUgZ3JvdXBlZCBsYXRlci5cbiAgICAgIHJlY29yZENvbW1pdFRpbWUoKTtcbiAgICB9XG5cblxuICAgIGNvbW1pdE11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmssIGxhbmVzKTtcblxuICAgIHJlc2V0QWZ0ZXJDb21taXQocm9vdC5jb250YWluZXJJbmZvKTsgLy8gVGhlIHdvcmstaW4tcHJvZ3Jlc3MgdHJlZSBpcyBub3cgdGhlIGN1cnJlbnQgdHJlZS4gVGhpcyBtdXN0IGNvbWUgYWZ0ZXJcbiAgICAvLyB0aGUgbXV0YXRpb24gcGhhc2UsIHNvIHRoYXQgdGhlIHByZXZpb3VzIHRyZWUgaXMgc3RpbGwgY3VycmVudCBkdXJpbmdcbiAgICAvLyBjb21wb25lbnRXaWxsVW5tb3VudCwgYnV0IGJlZm9yZSB0aGUgbGF5b3V0IHBoYXNlLCBzbyB0aGF0IHRoZSBmaW5pc2hlZFxuICAgIC8vIHdvcmsgaXMgY3VycmVudCBkdXJpbmcgY29tcG9uZW50RGlkTW91bnQvVXBkYXRlLlxuXG4gICAgcm9vdC5jdXJyZW50ID0gZmluaXNoZWRXb3JrOyAvLyBUaGUgbmV4dCBwaGFzZSBpcyB0aGUgbGF5b3V0IHBoYXNlLCB3aGVyZSB3ZSBjYWxsIGVmZmVjdHMgdGhhdCByZWFkXG5cbiAgICB7XG4gICAgICBtYXJrTGF5b3V0RWZmZWN0c1N0YXJ0ZWQobGFuZXMpO1xuICAgIH1cblxuICAgIGNvbW1pdExheW91dEVmZmVjdHMoZmluaXNoZWRXb3JrLCByb290LCBsYW5lcyk7XG5cbiAgICB7XG4gICAgICBtYXJrTGF5b3V0RWZmZWN0c1N0b3BwZWQoKTtcbiAgICB9XG4gICAgLy8gb3Bwb3J0dW5pdHkgdG8gcGFpbnQuXG5cblxuICAgIHJlcXVlc3RQYWludCgpO1xuICAgIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDsgLy8gUmVzZXQgdGhlIHByaW9yaXR5IHRvIHRoZSBwcmV2aW91cyBub24tc3luYyB2YWx1ZS5cblxuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5KTtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcbiAgfSBlbHNlIHtcbiAgICAvLyBObyBlZmZlY3RzLlxuICAgIHJvb3QuY3VycmVudCA9IGZpbmlzaGVkV29yazsgLy8gTWVhc3VyZSB0aGVzZSBhbnl3YXkgc28gdGhlIGZsYW1lZ3JhcGggZXhwbGljaXRseSBzaG93cyB0aGF0IHRoZXJlIHdlcmVcbiAgICAvLyBubyBlZmZlY3RzLlxuICAgIC8vIFRPRE86IE1heWJlIHRoZXJlJ3MgYSBiZXR0ZXIgd2F5IHRvIHJlcG9ydCB0aGlzLlxuXG4gICAge1xuICAgICAgcmVjb3JkQ29tbWl0VGltZSgpO1xuICAgIH1cbiAgfVxuXG4gIHZhciByb290RGlkSGF2ZVBhc3NpdmVFZmZlY3RzID0gcm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHM7XG5cbiAgaWYgKHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzKSB7XG4gICAgLy8gVGhpcyBjb21taXQgaGFzIHBhc3NpdmUgZWZmZWN0cy4gU3Rhc2ggYSByZWZlcmVuY2UgdG8gdGhlbS4gQnV0IGRvbid0XG4gICAgLy8gc2NoZWR1bGUgYSBjYWxsYmFjayB1bnRpbCBhZnRlciBmbHVzaGluZyBsYXlvdXQgd29yay5cbiAgICByb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xuICAgIHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzID0gcm9vdDtcbiAgICBwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcyA9IGxhbmVzO1xuICB9IGVsc2Uge1xuXG4gICAge1xuICAgICAgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMDtcbiAgICAgIHJvb3RXaXRoUGFzc2l2ZU5lc3RlZFVwZGF0ZXMgPSBudWxsO1xuICAgIH1cbiAgfSAvLyBSZWFkIHRoaXMgYWdhaW4sIHNpbmNlIGFuIGVmZmVjdCBtaWdodCBoYXZlIHVwZGF0ZWQgaXRcblxuXG4gIHJlbWFpbmluZ0xhbmVzID0gcm9vdC5wZW5kaW5nTGFuZXM7IC8vIENoZWNrIGlmIHRoZXJlJ3MgcmVtYWluaW5nIHdvcmsgb24gdGhpcyByb290XG4gIC8vIFRPRE86IFRoaXMgaXMgcGFydCBvZiB0aGUgYGNvbXBvbmVudERpZENhdGNoYCBpbXBsZW1lbnRhdGlvbi4gSXRzIHB1cnBvc2VcbiAgLy8gaXMgdG8gZGV0ZWN0IHdoZXRoZXIgc29tZXRoaW5nIG1pZ2h0IGhhdmUgY2FsbGVkIHNldFN0YXRlIGluc2lkZVxuICAvLyBgY29tcG9uZW50RGlkQ2F0Y2hgLiBUaGUgbWVjaGFuaXNtIGlzIGtub3duIHRvIGJlIGZsYXdlZCBiZWNhdXNlIGBzZXRTdGF0ZWBcbiAgLy8gaW5zaWRlIGBjb21wb25lbnREaWRDYXRjaGAgaXMgaXRzZWxmIGZsYXdlZCBcdTIwMTQgdGhhdCdzIHdoeSB3ZSByZWNvbW1lbmRcbiAgLy8gYGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcmAgaW5zdGVhZC4gSG93ZXZlciwgaXQgY291bGQgYmUgaW1wcm92ZWQgYnlcbiAgLy8gY2hlY2tpbmcgaWYgcmVtYWluaW5nTGFuZXMgaW5jbHVkZXMgU3luYyB3b3JrLCBpbnN0ZWFkIG9mIHdoZXRoZXIgdGhlcmUnc1xuICAvLyBhbnkgd29yayByZW1haW5pbmcgYXQgYWxsICh3aGljaCB3b3VsZCBhbHNvIGluY2x1ZGUgc3R1ZmYgbGlrZSBTdXNwZW5zZVxuICAvLyByZXRyaWVzIG9yIHRyYW5zaXRpb25zKS4gSXQncyBiZWVuIGxpa2UgdGhpcyBmb3IgYSB3aGlsZSwgdGhvdWdoLCBzbyBmaXhpbmdcbiAgLy8gaXQgcHJvYmFibHkgaXNuJ3QgdGhhdCB1cmdlbnQuXG5cbiAgaWYgKHJlbWFpbmluZ0xhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgLy8gSWYgdGhlcmUncyBubyByZW1haW5pbmcgd29yaywgd2UgY2FuIGNsZWFyIHRoZSBzZXQgb2YgYWxyZWFkeSBmYWlsZWRcbiAgICAvLyBlcnJvciBib3VuZGFyaWVzLlxuICAgIGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkID0gbnVsbDtcbiAgfVxuXG4gIHtcbiAgICBpZiAoIXJvb3REaWRIYXZlUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAgIGNvbW1pdERvdWJsZUludm9rZUVmZmVjdHNJbkRFVihyb290LmN1cnJlbnQsIGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBvbkNvbW1pdFJvb3QoZmluaXNoZWRXb3JrLnN0YXRlTm9kZSwgcmVuZGVyUHJpb3JpdHlMZXZlbCk7XG5cbiAge1xuICAgIGlmIChpc0RldlRvb2xzUHJlc2VudCkge1xuICAgICAgcm9vdC5tZW1vaXplZFVwZGF0ZXJzLmNsZWFyKCk7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIG9uQ29tbWl0Um9vdCQxKCk7XG4gIH0gLy8gQWx3YXlzIGNhbGwgdGhpcyBiZWZvcmUgZXhpdGluZyBgY29tbWl0Um9vdGAsIHRvIGVuc3VyZSB0aGF0IGFueVxuICAvLyBhZGRpdGlvbmFsIHdvcmsgb24gdGhpcyByb290IGlzIHNjaGVkdWxlZC5cblxuXG4gIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG5cbiAgaWYgKHJlY292ZXJhYmxlRXJyb3JzICE9PSBudWxsKSB7XG4gICAgLy8gVGhlcmUgd2VyZSBlcnJvcnMgZHVyaW5nIHRoaXMgcmVuZGVyLCBidXQgcmVjb3ZlcmVkIGZyb20gdGhlbSB3aXRob3V0XG4gICAgLy8gbmVlZGluZyB0byBzdXJmYWNlIGl0IHRvIHRoZSBVSS4gV2UgbG9nIHRoZW0gaGVyZS5cbiAgICB2YXIgb25SZWNvdmVyYWJsZUVycm9yID0gcm9vdC5vblJlY292ZXJhYmxlRXJyb3I7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlY292ZXJhYmxlRXJyb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcmVjb3ZlcmFibGVFcnJvciA9IHJlY292ZXJhYmxlRXJyb3JzW2ldO1xuICAgICAgdmFyIGNvbXBvbmVudFN0YWNrID0gcmVjb3ZlcmFibGVFcnJvci5zdGFjaztcbiAgICAgIHZhciBkaWdlc3QgPSByZWNvdmVyYWJsZUVycm9yLmRpZ2VzdDtcbiAgICAgIG9uUmVjb3ZlcmFibGVFcnJvcihyZWNvdmVyYWJsZUVycm9yLnZhbHVlLCB7XG4gICAgICAgIGNvbXBvbmVudFN0YWNrOiBjb21wb25lbnRTdGFjayxcbiAgICAgICAgZGlnZXN0OiBkaWdlc3RcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGlmIChoYXNVbmNhdWdodEVycm9yKSB7XG4gICAgaGFzVW5jYXVnaHRFcnJvciA9IGZhbHNlO1xuICAgIHZhciBlcnJvciQxID0gZmlyc3RVbmNhdWdodEVycm9yO1xuICAgIGZpcnN0VW5jYXVnaHRFcnJvciA9IG51bGw7XG4gICAgdGhyb3cgZXJyb3IkMTtcbiAgfSAvLyBJZiB0aGUgcGFzc2l2ZSBlZmZlY3RzIGFyZSB0aGUgcmVzdWx0IG9mIGEgZGlzY3JldGUgcmVuZGVyLCBmbHVzaCB0aGVtXG4gIC8vIHN5bmNocm9ub3VzbHkgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCB0YXNrIHNvIHRoYXQgdGhlIHJlc3VsdCBpc1xuICAvLyBpbW1lZGlhdGVseSBvYnNlcnZhYmxlLiBPdGhlcndpc2UsIHdlIGFzc3VtZSB0aGF0IHRoZXkgYXJlIG5vdFxuICAvLyBvcmRlci1kZXBlbmRlbnQgYW5kIGRvIG5vdCBuZWVkIHRvIGJlIG9ic2VydmVkIGJ5IGV4dGVybmFsIHN5c3RlbXMsIHNvIHdlXG4gIC8vIGNhbiB3YWl0IHVudGlsIGFmdGVyIHBhaW50LlxuICAvLyBUT0RPOiBXZSBjYW4gb3B0aW1pemUgdGhpcyBieSBub3Qgc2NoZWR1bGluZyB0aGUgY2FsbGJhY2sgZWFybGllci4gU2luY2Ugd2VcbiAgLy8gY3VycmVudGx5IHNjaGVkdWxlIHRoZSBjYWxsYmFjayBpbiBtdWx0aXBsZSBwbGFjZXMsIHdpbGwgd2FpdCB1bnRpbCB0aG9zZVxuICAvLyBhcmUgY29uc29saWRhdGVkLlxuXG5cbiAgaWYgKGluY2x1ZGVzU29tZUxhbmUocGVuZGluZ1Bhc3NpdmVFZmZlY3RzTGFuZXMsIFN5bmNMYW5lKSAmJiByb290LnRhZyAhPT0gTGVnYWN5Um9vdCkge1xuICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgfSAvLyBSZWFkIHRoaXMgYWdhaW4sIHNpbmNlIGEgcGFzc2l2ZSBlZmZlY3QgbWlnaHQgaGF2ZSB1cGRhdGVkIGl0XG5cblxuICByZW1haW5pbmdMYW5lcyA9IHJvb3QucGVuZGluZ0xhbmVzO1xuXG4gIGlmIChpbmNsdWRlc1NvbWVMYW5lKHJlbWFpbmluZ0xhbmVzLCBTeW5jTGFuZSkpIHtcbiAgICB7XG4gICAgICBtYXJrTmVzdGVkVXBkYXRlU2NoZWR1bGVkKCk7XG4gICAgfSAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSByb290IHN5bmNocm9ub3VzbHkgcmUtcmVuZGVycyB3aXRob3V0XG4gICAgLy8gZmluaXNoaW5nLiBJZiB0aGVyZSBhcmUgdG9vIG1hbnksIGl0IGluZGljYXRlcyBhbiBpbmZpbml0ZSB1cGRhdGUgbG9vcC5cblxuXG4gICAgaWYgKHJvb3QgPT09IHJvb3RXaXRoTmVzdGVkVXBkYXRlcykge1xuICAgICAgbmVzdGVkVXBkYXRlQ291bnQrKztcbiAgICB9IGVsc2Uge1xuICAgICAgbmVzdGVkVXBkYXRlQ291bnQgPSAwO1xuICAgICAgcm9vdFdpdGhOZXN0ZWRVcGRhdGVzID0gcm9vdDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbmVzdGVkVXBkYXRlQ291bnQgPSAwO1xuICB9IC8vIElmIGxheW91dCB3b3JrIHdhcyBzY2hlZHVsZWQsIGZsdXNoIGl0IG5vdy5cblxuXG4gIGZsdXNoU3luY0NhbGxiYWNrcygpO1xuXG4gIHtcbiAgICBtYXJrQ29tbWl0U3RvcHBlZCgpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKSB7XG4gIC8vIFJldHVybnMgd2hldGhlciBwYXNzaXZlIGVmZmVjdHMgd2VyZSBmbHVzaGVkLlxuICAvLyBUT0RPOiBDb21iaW5lIHRoaXMgY2hlY2sgd2l0aCB0aGUgb25lIGluIGZsdXNoUGFzc2l2ZUVGZmVjdHNJbXBsLiBXZSBzaG91bGRcbiAgLy8gcHJvYmFibHkganVzdCBjb21iaW5lIHRoZSB0d28gZnVuY3Rpb25zLiBJIGJlbGlldmUgdGhleSB3ZXJlIG9ubHkgc2VwYXJhdGVcbiAgLy8gaW4gdGhlIGZpcnN0IHBsYWNlIGJlY2F1c2Ugd2UgdXNlZCB0byB3cmFwIGl0IHdpdGhcbiAgLy8gYFNjaGVkdWxlci5ydW5XaXRoUHJpb3JpdHlgLCB3aGljaCBhY2NlcHRzIGEgZnVuY3Rpb24uIEJ1dCBub3cgd2UgdHJhY2sgdGhlXG4gIC8vIHByaW9yaXR5IHdpdGhpbiBSZWFjdCBpdHNlbGYsIHNvIHdlIGNhbiBtdXRhdGUgdGhlIHZhcmlhYmxlIGRpcmVjdGx5LlxuICBpZiAocm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgIT09IG51bGwpIHtcbiAgICB2YXIgcmVuZGVyUHJpb3JpdHkgPSBsYW5lc1RvRXZlbnRQcmlvcml0eShwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcyk7XG4gICAgdmFyIHByaW9yaXR5ID0gbG93ZXJFdmVudFByaW9yaXR5KERlZmF1bHRFdmVudFByaW9yaXR5LCByZW5kZXJQcmlvcml0eSk7XG4gICAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uO1xuICAgIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG5cbiAgICB0cnkge1xuICAgICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gbnVsbDtcbiAgICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmlvcml0eSk7XG4gICAgICByZXR1cm4gZmx1c2hQYXNzaXZlRWZmZWN0c0ltcGwoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHkpO1xuICAgICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247IC8vIE9uY2UgcGFzc2l2ZSBlZmZlY3RzIGhhdmUgcnVuIGZvciB0aGUgdHJlZSAtIGdpdmluZyBjb21wb25lbnRzIGFcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBlbnF1ZXVlUGVuZGluZ1Bhc3NpdmVQcm9maWxlckVmZmVjdChmaWJlcikge1xuICB7XG4gICAgcGVuZGluZ1Bhc3NpdmVQcm9maWxlckVmZmVjdHMucHVzaChmaWJlcik7XG5cbiAgICBpZiAoIXJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzKSB7XG4gICAgICByb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cyA9IHRydWU7XG4gICAgICBzY2hlZHVsZUNhbGxiYWNrJDEoTm9ybWFsUHJpb3JpdHksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmbHVzaFBhc3NpdmVFZmZlY3RzSW1wbCgpIHtcbiAgaWYgKHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IC8vIENhY2hlIGFuZCBjbGVhciB0aGUgdHJhbnNpdGlvbnMgZmxhZ1xuXG5cbiAgdmFyIHRyYW5zaXRpb25zID0gcGVuZGluZ1Bhc3NpdmVUcmFuc2l0aW9ucztcbiAgcGVuZGluZ1Bhc3NpdmVUcmFuc2l0aW9ucyA9IG51bGw7XG4gIHZhciByb290ID0gcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHM7XG4gIHZhciBsYW5lcyA9IHBlbmRpbmdQYXNzaXZlRWZmZWN0c0xhbmVzO1xuICByb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cyA9IG51bGw7IC8vIFRPRE86IFRoaXMgaXMgc29tZXRpbWVzIG91dCBvZiBzeW5jIHdpdGggcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMuXG4gIC8vIEZpZ3VyZSBvdXQgd2h5IGFuZCBmaXggaXQuIEl0J3Mgbm90IGNhdXNpbmcgYW55IGtub3duIGlzc3VlcyAocHJvYmFibHlcbiAgLy8gYmVjYXVzZSBpdCdzIG9ubHkgdXNlZCBmb3IgcHJvZmlsaW5nKSwgYnV0IGl0J3MgYSByZWZhY3RvciBoYXphcmQuXG5cbiAgcGVuZGluZ1Bhc3NpdmVFZmZlY3RzTGFuZXMgPSBOb0xhbmVzO1xuXG4gIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpICE9PSBOb0NvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBmbHVzaCBwYXNzaXZlIGVmZmVjdHMgd2hpbGUgYWxyZWFkeSByZW5kZXJpbmcuJyk7XG4gIH1cblxuICB7XG4gICAgaXNGbHVzaGluZ1Bhc3NpdmVFZmZlY3RzID0gdHJ1ZTtcbiAgICBkaWRTY2hlZHVsZVVwZGF0ZUR1cmluZ1Bhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG4gIH1cblxuICB7XG4gICAgbWFya1Bhc3NpdmVFZmZlY3RzU3RhcnRlZChsYW5lcyk7XG4gIH1cblxuICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICBleGVjdXRpb25Db250ZXh0IHw9IENvbW1pdENvbnRleHQ7XG4gIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0cyhyb290LmN1cnJlbnQpO1xuICBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzKHJvb3QsIHJvb3QuY3VycmVudCwgbGFuZXMsIHRyYW5zaXRpb25zKTsgLy8gVE9ETzogTW92ZSB0byBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzXG5cbiAge1xuICAgIHZhciBwcm9maWxlckVmZmVjdHMgPSBwZW5kaW5nUGFzc2l2ZVByb2ZpbGVyRWZmZWN0cztcbiAgICBwZW5kaW5nUGFzc2l2ZVByb2ZpbGVyRWZmZWN0cyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9maWxlckVmZmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBfZmliZXIgPSBwcm9maWxlckVmZmVjdHNbaV07XG4gICAgICBjb21taXRQYXNzaXZlRWZmZWN0RHVyYXRpb25zKHJvb3QsIF9maWJlcik7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIG1hcmtQYXNzaXZlRWZmZWN0c1N0b3BwZWQoKTtcbiAgfVxuXG4gIHtcbiAgICBjb21taXREb3VibGVJbnZva2VFZmZlY3RzSW5ERVYocm9vdC5jdXJyZW50LCB0cnVlKTtcbiAgfVxuXG4gIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDtcbiAgZmx1c2hTeW5jQ2FsbGJhY2tzKCk7XG5cbiAge1xuICAgIC8vIElmIGFkZGl0aW9uYWwgcGFzc2l2ZSBlZmZlY3RzIHdlcmUgc2NoZWR1bGVkLCBpbmNyZW1lbnQgYSBjb3VudGVyLiBJZiB0aGlzXG4gICAgLy8gZXhjZWVkcyB0aGUgbGltaXQsIHdlJ2xsIGZpcmUgYSB3YXJuaW5nLlxuICAgIGlmIChkaWRTY2hlZHVsZVVwZGF0ZUR1cmluZ1Bhc3NpdmVFZmZlY3RzKSB7XG4gICAgICBpZiAocm9vdCA9PT0gcm9vdFdpdGhQYXNzaXZlTmVzdGVkVXBkYXRlcykge1xuICAgICAgICBuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA9IDA7XG4gICAgICAgIHJvb3RXaXRoUGFzc2l2ZU5lc3RlZFVwZGF0ZXMgPSByb290O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQgPSAwO1xuICAgIH1cblxuICAgIGlzRmx1c2hpbmdQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xuICAgIGRpZFNjaGVkdWxlVXBkYXRlRHVyaW5nUGFzc2l2ZUVmZmVjdHMgPSBmYWxzZTtcbiAgfSAvLyBUT0RPOiBNb3ZlIHRvIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHNcblxuXG4gIG9uUG9zdENvbW1pdFJvb3Qocm9vdCk7XG5cbiAge1xuICAgIHZhciBzdGF0ZU5vZGUgPSByb290LmN1cnJlbnQuc3RhdGVOb2RlO1xuICAgIHN0YXRlTm9kZS5lZmZlY3REdXJhdGlvbiA9IDA7XG4gICAgc3RhdGVOb2RlLnBhc3NpdmVFZmZlY3REdXJhdGlvbiA9IDA7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNBbHJlYWR5RmFpbGVkTGVnYWN5RXJyb3JCb3VuZGFyeShpbnN0YW5jZSkge1xuICByZXR1cm4gbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgIT09IG51bGwgJiYgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQuaGFzKGluc3RhbmNlKTtcbn1cbmZ1bmN0aW9uIG1hcmtMZWdhY3lFcnJvckJvdW5kYXJ5QXNGYWlsZWQoaW5zdGFuY2UpIHtcbiAgaWYgKGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkID09PSBudWxsKSB7XG4gICAgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPSBuZXcgU2V0KFtpbnN0YW5jZV0pO1xuICB9IGVsc2Uge1xuICAgIGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkLmFkZChpbnN0YW5jZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJlcGFyZVRvVGhyb3dVbmNhdWdodEVycm9yKGVycm9yKSB7XG4gIGlmICghaGFzVW5jYXVnaHRFcnJvcikge1xuICAgIGhhc1VuY2F1Z2h0RXJyb3IgPSB0cnVlO1xuICAgIGZpcnN0VW5jYXVnaHRFcnJvciA9IGVycm9yO1xuICB9XG59XG5cbnZhciBvblVuY2F1Z2h0RXJyb3IgPSBwcmVwYXJlVG9UaHJvd1VuY2F1Z2h0RXJyb3I7XG5cbmZ1bmN0aW9uIGNhcHR1cmVDb21taXRQaGFzZUVycm9yT25Sb290KHJvb3RGaWJlciwgc291cmNlRmliZXIsIGVycm9yKSB7XG4gIHZhciBlcnJvckluZm8gPSBjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcihlcnJvciwgc291cmNlRmliZXIpO1xuICB2YXIgdXBkYXRlID0gY3JlYXRlUm9vdEVycm9yVXBkYXRlKHJvb3RGaWJlciwgZXJyb3JJbmZvLCBTeW5jTGFuZSk7XG4gIHZhciByb290ID0gZW5xdWV1ZVVwZGF0ZShyb290RmliZXIsIHVwZGF0ZSwgU3luY0xhbmUpO1xuICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuXG4gIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgbWFya1Jvb3RVcGRhdGVkKHJvb3QsIFN5bmNMYW5lLCBldmVudFRpbWUpO1xuICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBldmVudFRpbWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKHNvdXJjZUZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvciQxKSB7XG4gIHtcbiAgICByZXBvcnRVbmNhdWdodEVycm9ySW5ERVYoZXJyb3IkMSk7XG4gICAgc2V0SXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0KGZhbHNlKTtcbiAgfVxuXG4gIGlmIChzb3VyY2VGaWJlci50YWcgPT09IEhvc3RSb290KSB7XG4gICAgLy8gRXJyb3Igd2FzIHRocm93biBhdCB0aGUgcm9vdC4gVGhlcmUgaXMgbm8gcGFyZW50LCBzbyB0aGUgcm9vdFxuICAgIC8vIGl0c2VsZiBzaG91bGQgY2FwdHVyZSBpdC5cbiAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvck9uUm9vdChzb3VyY2VGaWJlciwgc291cmNlRmliZXIsIGVycm9yJDEpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBmaWJlciA9IG51bGw7XG5cbiAge1xuICAgIGZpYmVyID0gbmVhcmVzdE1vdW50ZWRBbmNlc3RvcjtcbiAgfVxuXG4gIHdoaWxlIChmaWJlciAhPT0gbnVsbCkge1xuICAgIGlmIChmaWJlci50YWcgPT09IEhvc3RSb290KSB7XG4gICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvck9uUm9vdChmaWJlciwgc291cmNlRmliZXIsIGVycm9yJDEpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoZmliZXIudGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgdmFyIGN0b3IgPSBmaWJlci50eXBlO1xuICAgICAgdmFyIGluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICBpZiAodHlwZW9mIGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRDYXRjaCA9PT0gJ2Z1bmN0aW9uJyAmJiAhaXNBbHJlYWR5RmFpbGVkTGVnYWN5RXJyb3JCb3VuZGFyeShpbnN0YW5jZSkpIHtcbiAgICAgICAgdmFyIGVycm9ySW5mbyA9IGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKGVycm9yJDEsIHNvdXJjZUZpYmVyKTtcbiAgICAgICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZUNsYXNzRXJyb3JVcGRhdGUoZmliZXIsIGVycm9ySW5mbywgU3luY0xhbmUpO1xuICAgICAgICB2YXIgcm9vdCA9IGVucXVldWVVcGRhdGUoZmliZXIsIHVwZGF0ZSwgU3luY0xhbmUpO1xuICAgICAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuXG4gICAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgICAgbWFya1Jvb3RVcGRhdGVkKHJvb3QsIFN5bmNMYW5lLCBldmVudFRpbWUpO1xuICAgICAgICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBldmVudFRpbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZpYmVyID0gZmliZXIucmV0dXJuO1xuICB9XG5cbiAge1xuICAgIC8vIFRPRE86IFVudGlsIHdlIHJlLWxhbmQgc2tpcFVubW91bnRlZEJvdW5kYXJpZXMgKHNlZSAjMjAxNDcpLCB0aGlzIHdhcm5pbmdcbiAgICAvLyB3aWxsIGZpcmUgZm9yIGVycm9ycyB0aGF0IGFyZSB0aHJvd24gYnkgZGVzdHJveSBmdW5jdGlvbnMgaW5zaWRlIGRlbGV0ZWRcbiAgICAvLyB0cmVlcy4gV2hhdCBpdCBzaG91bGQgaW5zdGVhZCBkbyBpcyBwcm9wYWdhdGUgdGhlIGVycm9yIHRvIHRoZSBwYXJlbnQgb2ZcbiAgICAvLyB0aGUgZGVsZXRlZCB0cmVlLiBJbiB0aGUgbWVhbnRpbWUsIGRvIG5vdCBhZGQgdGhpcyB3YXJuaW5nIHRvIHRoZVxuICAgIC8vIGFsbG93bGlzdDsgdGhpcyBpcyBvbmx5IGZvciBvdXIgaW50ZXJuYWwgdXNlLlxuICAgIGVycm9yKCdJbnRlcm5hbCBSZWFjdCBlcnJvcjogQXR0ZW1wdGVkIHRvIGNhcHR1cmUgYSBjb21taXQgcGhhc2UgZXJyb3IgJyArICdpbnNpZGUgYSBkZXRhY2hlZCB0cmVlLiBUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiBSZWFjdC4gTGlrZWx5ICcgKyAnY2F1c2VzIGluY2x1ZGUgZGVsZXRpbmcgdGhlIHNhbWUgZmliZXIgbW9yZSB0aGFuIG9uY2UsIGNvbW1pdHRpbmcgYW4gJyArICdhbHJlYWR5LWZpbmlzaGVkIHRyZWUsIG9yIGFuIGluY29uc2lzdGVudCByZXR1cm4gcG9pbnRlci5cXG5cXG4nICsgJ0Vycm9yIG1lc3NhZ2U6XFxuXFxuJXMnLCBlcnJvciQxKTtcbiAgfVxufVxuZnVuY3Rpb24gcGluZ1N1c3BlbmRlZFJvb3Qocm9vdCwgd2FrZWFibGUsIHBpbmdlZExhbmVzKSB7XG4gIHZhciBwaW5nQ2FjaGUgPSByb290LnBpbmdDYWNoZTtcblxuICBpZiAocGluZ0NhY2hlICE9PSBudWxsKSB7XG4gICAgLy8gVGhlIHdha2VhYmxlIHJlc29sdmVkLCBzbyB3ZSBubyBsb25nZXIgbmVlZCB0byBtZW1vaXplLCBiZWNhdXNlIGl0IHdpbGxcbiAgICAvLyBuZXZlciBiZSB0aHJvd24gYWdhaW4uXG4gICAgcGluZ0NhY2hlLmRlbGV0ZSh3YWtlYWJsZSk7XG4gIH1cblxuICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICBtYXJrUm9vdFBpbmdlZChyb290LCBwaW5nZWRMYW5lcyk7XG4gIHdhcm5JZlN1c3BlbnNlUmVzb2x1dGlvbk5vdFdyYXBwZWRXaXRoQWN0REVWKHJvb3QpO1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3QgPT09IHJvb3QgJiYgaXNTdWJzZXRPZkxhbmVzKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzLCBwaW5nZWRMYW5lcykpIHtcbiAgICAvLyBSZWNlaXZlZCBhIHBpbmcgYXQgdGhlIHNhbWUgcHJpb3JpdHkgbGV2ZWwgYXQgd2hpY2ggd2UncmUgY3VycmVudGx5XG4gICAgLy8gcmVuZGVyaW5nLiBXZSBtaWdodCB3YW50IHRvIHJlc3RhcnQgdGhpcyByZW5kZXIuIFRoaXMgc2hvdWxkIG1pcnJvclxuICAgIC8vIHRoZSBsb2dpYyBvZiB3aGV0aGVyIG9yIG5vdCBhIHJvb3Qgc3VzcGVuZHMgb25jZSBpdCBjb21wbGV0ZXMuXG4gICAgLy8gVE9ETzogSWYgd2UncmUgcmVuZGVyaW5nIHN5bmMgZWl0aGVyIGR1ZSB0byBTeW5jLCBCYXRjaGVkIG9yIGV4cGlyZWQsXG4gICAgLy8gd2Ugc2hvdWxkIHByb2JhYmx5IG5ldmVyIHJlc3RhcnQuXG4gICAgLy8gSWYgd2UncmUgc3VzcGVuZGVkIHdpdGggZGVsYXksIG9yIGlmIGl0J3MgYSByZXRyeSwgd2UnbGwgYWx3YXlzIHN1c3BlbmRcbiAgICAvLyBzbyB3ZSBjYW4gYWx3YXlzIHJlc3RhcnQuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RTdXNwZW5kZWRXaXRoRGVsYXkgfHwgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdFN1c3BlbmRlZCAmJiBpbmNsdWRlc09ubHlSZXRyaWVzKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKSAmJiBub3coKSAtIGdsb2JhbE1vc3RSZWNlbnRGYWxsYmFja1RpbWUgPCBGQUxMQkFDS19USFJPVFRMRV9NUykge1xuICAgICAgLy8gUmVzdGFydCBmcm9tIHRoZSByb290LlxuICAgICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgTm9MYW5lcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEV2ZW4gdGhvdWdoIHdlIGNhbid0IHJlc3RhcnQgcmlnaHQgbm93LCB3ZSBtaWdodCBnZXQgYW5cbiAgICAgIC8vIG9wcG9ydHVuaXR5IGxhdGVyLiBTbyB3ZSBtYXJrIHRoaXMgcmVuZGVyIGFzIGhhdmluZyBhIHBpbmcuXG4gICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcyA9IG1lcmdlTGFuZXMod29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXMsIHBpbmdlZExhbmVzKTtcbiAgICB9XG4gIH1cblxuICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcbn1cblxuZnVuY3Rpb24gcmV0cnlUaW1lZE91dEJvdW5kYXJ5KGJvdW5kYXJ5RmliZXIsIHJldHJ5TGFuZSkge1xuICAvLyBUaGUgYm91bmRhcnkgZmliZXIgKGEgU3VzcGVuc2UgY29tcG9uZW50IG9yIFN1c3BlbnNlTGlzdCBjb21wb25lbnQpXG4gIC8vIHByZXZpb3VzbHkgd2FzIHJlbmRlcmVkIGluIGl0cyBmYWxsYmFjayBzdGF0ZS4gT25lIG9mIHRoZSBwcm9taXNlcyB0aGF0XG4gIC8vIHN1c3BlbmRlZCBpdCBoYXMgcmVzb2x2ZWQsIHdoaWNoIG1lYW5zIGF0IGxlYXN0IHBhcnQgb2YgdGhlIHRyZWUgd2FzXG4gIC8vIGxpa2VseSB1bmJsb2NrZWQuIFRyeSByZW5kZXJpbmcgYWdhaW4sIGF0IGEgbmV3IGxhbmVzLlxuICBpZiAocmV0cnlMYW5lID09PSBOb0xhbmUpIHtcbiAgICAvLyBUT0RPOiBBc3NpZ24gdGhpcyB0byBgc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmVgPyB0byBhdm9pZFxuICAgIC8vIHVubmVjZXNzYXJ5IGVudGFuZ2xlbWVudD9cbiAgICByZXRyeUxhbmUgPSByZXF1ZXN0UmV0cnlMYW5lKGJvdW5kYXJ5RmliZXIpO1xuICB9IC8vIFRPRE86IFNwZWNpYWwgY2FzZSBpZGxlIHByaW9yaXR5P1xuXG5cbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoYm91bmRhcnlGaWJlciwgcmV0cnlMYW5lKTtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIG1hcmtSb290VXBkYXRlZChyb290LCByZXRyeUxhbmUsIGV2ZW50VGltZSk7XG4gICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmV0cnlEZWh5ZHJhdGVkU3VzcGVuc2VCb3VuZGFyeShib3VuZGFyeUZpYmVyKSB7XG4gIHZhciBzdXNwZW5zZVN0YXRlID0gYm91bmRhcnlGaWJlci5tZW1vaXplZFN0YXRlO1xuICB2YXIgcmV0cnlMYW5lID0gTm9MYW5lO1xuXG4gIGlmIChzdXNwZW5zZVN0YXRlICE9PSBudWxsKSB7XG4gICAgcmV0cnlMYW5lID0gc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmU7XG4gIH1cblxuICByZXRyeVRpbWVkT3V0Qm91bmRhcnkoYm91bmRhcnlGaWJlciwgcmV0cnlMYW5lKTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVSZXRyeVdha2VhYmxlKGJvdW5kYXJ5RmliZXIsIHdha2VhYmxlKSB7XG4gIHZhciByZXRyeUxhbmUgPSBOb0xhbmU7IC8vIERlZmF1bHRcblxuICB2YXIgcmV0cnlDYWNoZTtcblxuICBzd2l0Y2ggKGJvdW5kYXJ5RmliZXIudGFnKSB7XG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHJldHJ5Q2FjaGUgPSBib3VuZGFyeUZpYmVyLnN0YXRlTm9kZTtcbiAgICAgIHZhciBzdXNwZW5zZVN0YXRlID0gYm91bmRhcnlGaWJlci5tZW1vaXplZFN0YXRlO1xuXG4gICAgICBpZiAoc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICByZXRyeUxhbmUgPSBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHJldHJ5Q2FjaGUgPSBib3VuZGFyeUZpYmVyLnN0YXRlTm9kZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGluZ2VkIHVua25vd24gc3VzcGVuc2UgYm91bmRhcnkgdHlwZS4gJyArICdUaGlzIGlzIHByb2JhYmx5IGEgYnVnIGluIFJlYWN0LicpO1xuICB9XG5cbiAgaWYgKHJldHJ5Q2FjaGUgIT09IG51bGwpIHtcbiAgICAvLyBUaGUgd2FrZWFibGUgcmVzb2x2ZWQsIHNvIHdlIG5vIGxvbmdlciBuZWVkIHRvIG1lbW9pemUsIGJlY2F1c2UgaXQgd2lsbFxuICAgIC8vIG5ldmVyIGJlIHRocm93biBhZ2Fpbi5cbiAgICByZXRyeUNhY2hlLmRlbGV0ZSh3YWtlYWJsZSk7XG4gIH1cblxuICByZXRyeVRpbWVkT3V0Qm91bmRhcnkoYm91bmRhcnlGaWJlciwgcmV0cnlMYW5lKTtcbn0gLy8gQ29tcHV0ZXMgdGhlIG5leHQgSnVzdCBOb3RpY2VhYmxlIERpZmZlcmVuY2UgKEpORCkgYm91bmRhcnkuXG4vLyBUaGUgdGhlb3J5IGlzIHRoYXQgYSBwZXJzb24gY2FuJ3QgdGVsbCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHNtYWxsIGRpZmZlcmVuY2VzIGluIHRpbWUuXG4vLyBUaGVyZWZvcmUsIGlmIHdlIHdhaXQgYSBiaXQgbG9uZ2VyIHRoYW4gbmVjZXNzYXJ5IHRoYXQgd29uJ3QgdHJhbnNsYXRlIHRvIGEgbm90aWNlYWJsZVxuLy8gZGlmZmVyZW5jZSBpbiB0aGUgZXhwZXJpZW5jZS4gSG93ZXZlciwgd2FpdGluZyBmb3IgbG9uZ2VyIG1pZ2h0IG1lYW4gdGhhdCB3ZSBjYW4gYXZvaWRcbi8vIHNob3dpbmcgYW4gaW50ZXJtZWRpYXRlIGxvYWRpbmcgc3RhdGUuIFRoZSBsb25nZXIgd2UgaGF2ZSBhbHJlYWR5IHdhaXRlZCwgdGhlIGhhcmRlciBpdFxuLy8gaXMgdG8gdGVsbCBzbWFsbCBkaWZmZXJlbmNlcyBpbiB0aW1lLiBUaGVyZWZvcmUsIHRoZSBsb25nZXIgd2UndmUgYWxyZWFkeSB3YWl0ZWQsXG4vLyB0aGUgbG9uZ2VyIHdlIGNhbiB3YWl0IGFkZGl0aW9uYWxseS4gQXQgc29tZSBwb2ludCB3ZSBoYXZlIHRvIGdpdmUgdXAgdGhvdWdoLlxuLy8gV2UgcGljayBhIHRyYWluIG1vZGVsIHdoZXJlIHRoZSBuZXh0IGJvdW5kYXJ5IGNvbW1pdHMgYXQgYSBjb25zaXN0ZW50IHNjaGVkdWxlLlxuLy8gVGhlc2UgcGFydGljdWxhciBudW1iZXJzIGFyZSB2YWd1ZSBlc3RpbWF0ZXMuIFdlIGV4cGVjdCB0byBhZGp1c3QgdGhlbSBiYXNlZCBvbiByZXNlYXJjaC5cblxuZnVuY3Rpb24gam5kKHRpbWVFbGFwc2VkKSB7XG4gIHJldHVybiB0aW1lRWxhcHNlZCA8IDEyMCA/IDEyMCA6IHRpbWVFbGFwc2VkIDwgNDgwID8gNDgwIDogdGltZUVsYXBzZWQgPCAxMDgwID8gMTA4MCA6IHRpbWVFbGFwc2VkIDwgMTkyMCA/IDE5MjAgOiB0aW1lRWxhcHNlZCA8IDMwMDAgPyAzMDAwIDogdGltZUVsYXBzZWQgPCA0MzIwID8gNDMyMCA6IGNlaWwodGltZUVsYXBzZWQgLyAxOTYwKSAqIDE5NjA7XG59XG5cbmZ1bmN0aW9uIGNoZWNrRm9yTmVzdGVkVXBkYXRlcygpIHtcbiAgaWYgKG5lc3RlZFVwZGF0ZUNvdW50ID4gTkVTVEVEX1VQREFURV9MSU1JVCkge1xuICAgIG5lc3RlZFVwZGF0ZUNvdW50ID0gMDtcbiAgICByb290V2l0aE5lc3RlZFVwZGF0ZXMgPSBudWxsO1xuICAgIHRocm93IG5ldyBFcnJvcignTWF4aW11bSB1cGRhdGUgZGVwdGggZXhjZWVkZWQuIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGEgY29tcG9uZW50ICcgKyAncmVwZWF0ZWRseSBjYWxscyBzZXRTdGF0ZSBpbnNpZGUgY29tcG9uZW50V2lsbFVwZGF0ZSBvciAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZS4gUmVhY3QgbGltaXRzIHRoZSBudW1iZXIgb2YgbmVzdGVkIHVwZGF0ZXMgdG8gJyArICdwcmV2ZW50IGluZmluaXRlIGxvb3BzLicpO1xuICB9XG5cbiAge1xuICAgIGlmIChuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQgPiBORVNURURfUEFTU0lWRV9VUERBVEVfTElNSVQpIHtcbiAgICAgIG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA9IDA7XG4gICAgICByb290V2l0aFBhc3NpdmVOZXN0ZWRVcGRhdGVzID0gbnVsbDtcblxuICAgICAgZXJyb3IoJ01heGltdW0gdXBkYXRlIGRlcHRoIGV4Y2VlZGVkLiBUaGlzIGNhbiBoYXBwZW4gd2hlbiBhIGNvbXBvbmVudCAnICsgXCJjYWxscyBzZXRTdGF0ZSBpbnNpZGUgdXNlRWZmZWN0LCBidXQgdXNlRWZmZWN0IGVpdGhlciBkb2Vzbid0IFwiICsgJ2hhdmUgYSBkZXBlbmRlbmN5IGFycmF5LCBvciBvbmUgb2YgdGhlIGRlcGVuZGVuY2llcyBjaGFuZ2VzIG9uICcgKyAnZXZlcnkgcmVuZGVyLicpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmbHVzaFJlbmRlclBoYXNlU3RyaWN0TW9kZVdhcm5pbmdzSW5ERVYoKSB7XG4gIHtcbiAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5mbHVzaExlZ2FjeUNvbnRleHRXYXJuaW5nKCk7XG5cbiAgICB7XG4gICAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5mbHVzaFBlbmRpbmdVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncygpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXREb3VibGVJbnZva2VFZmZlY3RzSW5ERVYoZmliZXIsIGhhc1Bhc3NpdmVFZmZlY3RzKSB7XG4gIHtcbiAgICAvLyBUT0RPIChTdHJpY3RFZmZlY3RzKSBTaG91bGQgd2Ugc2V0IGEgbWFya2VyIG9uIHRoZSByb290IGlmIGl0IGNvbnRhaW5zIHN0cmljdCBlZmZlY3RzXG4gICAgLy8gc28gd2UgZG9uJ3QgdHJhdmVyc2UgdW5uZWNlc3NhcmlseT8gc2ltaWxhciB0byBzdWJ0cmVlRmxhZ3MgYnV0IGp1c3QgYXQgdGhlIHJvb3QgbGV2ZWwuXG4gICAgLy8gTWF5YmUgbm90IGEgYmlnIGRlYWwgc2luY2UgdGhpcyBpcyBERVYgb25seSBiZWhhdmlvci5cbiAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuICAgIGludm9rZUVmZmVjdHNJbkRldihmaWJlciwgTW91bnRMYXlvdXREZXYsIGludm9rZUxheW91dEVmZmVjdFVubW91bnRJbkRFVik7XG5cbiAgICBpZiAoaGFzUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAgIGludm9rZUVmZmVjdHNJbkRldihmaWJlciwgTW91bnRQYXNzaXZlRGV2LCBpbnZva2VQYXNzaXZlRWZmZWN0VW5tb3VudEluREVWKTtcbiAgICB9XG5cbiAgICBpbnZva2VFZmZlY3RzSW5EZXYoZmliZXIsIE1vdW50TGF5b3V0RGV2LCBpbnZva2VMYXlvdXRFZmZlY3RNb3VudEluREVWKTtcblxuICAgIGlmIChoYXNQYXNzaXZlRWZmZWN0cykge1xuICAgICAgaW52b2tlRWZmZWN0c0luRGV2KGZpYmVyLCBNb3VudFBhc3NpdmVEZXYsIGludm9rZVBhc3NpdmVFZmZlY3RNb3VudEluREVWKTtcbiAgICB9XG5cbiAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGludm9rZUVmZmVjdHNJbkRldihmaXJzdENoaWxkLCBmaWJlckZsYWdzLCBpbnZva2VFZmZlY3RGbikge1xuICB7XG4gICAgLy8gV2UgZG9uJ3QgbmVlZCB0byByZS1jaGVjayBTdHJpY3RFZmZlY3RzTW9kZSBoZXJlLlxuICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgaWYgdGhhdCBjaGVjayBoYXMgYWxyZWFkeSBwYXNzZWQuXG4gICAgdmFyIGN1cnJlbnQgPSBmaXJzdENoaWxkO1xuICAgIHZhciBzdWJ0cmVlUm9vdCA9IG51bGw7XG5cbiAgICB3aGlsZSAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgdmFyIHByaW1hcnlTdWJ0cmVlRmxhZyA9IGN1cnJlbnQuc3VidHJlZUZsYWdzICYgZmliZXJGbGFncztcblxuICAgICAgaWYgKGN1cnJlbnQgIT09IHN1YnRyZWVSb290ICYmIGN1cnJlbnQuY2hpbGQgIT09IG51bGwgJiYgcHJpbWFyeVN1YnRyZWVGbGFnICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmNoaWxkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKChjdXJyZW50LmZsYWdzICYgZmliZXJGbGFncykgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICBpbnZva2VFZmZlY3RGbihjdXJyZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjdXJyZW50LnNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5zaWJsaW5nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN1cnJlbnQgPSBzdWJ0cmVlUm9vdCA9IGN1cnJlbnQucmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBkaWRXYXJuU3RhdGVVcGRhdGVGb3JOb3RZZXRNb3VudGVkQ29tcG9uZW50ID0gbnVsbDtcbmZ1bmN0aW9uIHdhcm5BYm91dFVwZGF0ZU9uTm90WWV0TW91bnRlZEZpYmVySW5ERVYoZmliZXIpIHtcbiAge1xuICAgIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIFJlbmRlckNvbnRleHQpICE9PSBOb0NvbnRleHQpIHtcbiAgICAgIC8vIFdlIGxldCB0aGUgb3RoZXIgd2FybmluZyBhYm91dCByZW5kZXIgcGhhc2UgdXBkYXRlcyBkZWFsIHdpdGggdGhpcyBvbmUuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCEoZmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB0YWcgPSBmaWJlci50YWc7XG5cbiAgICBpZiAodGFnICE9PSBJbmRldGVybWluYXRlQ29tcG9uZW50ICYmIHRhZyAhPT0gSG9zdFJvb3QgJiYgdGFnICE9PSBDbGFzc0NvbXBvbmVudCAmJiB0YWcgIT09IEZ1bmN0aW9uQ29tcG9uZW50ICYmIHRhZyAhPT0gRm9yd2FyZFJlZiAmJiB0YWcgIT09IE1lbW9Db21wb25lbnQgJiYgdGFnICE9PSBTaW1wbGVNZW1vQ29tcG9uZW50KSB7XG4gICAgICAvLyBPbmx5IHdhcm4gZm9yIHVzZXItZGVmaW5lZCBjb21wb25lbnRzLCBub3QgaW50ZXJuYWwgb25lcyBsaWtlIFN1c3BlbnNlLlxuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gV2Ugc2hvdyB0aGUgd2hvbGUgc3RhY2sgYnV0IGRlZHVwZSBvbiB0aGUgdG9wIGNvbXBvbmVudCdzIG5hbWUgYmVjYXVzZVxuICAgIC8vIHRoZSBwcm9ibGVtYXRpYyBjb2RlIGFsbW9zdCBhbHdheXMgbGllcyBpbnNpZGUgdGhhdCBjb21wb25lbnQuXG5cblxuICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ1JlYWN0Q29tcG9uZW50JztcblxuICAgIGlmIChkaWRXYXJuU3RhdGVVcGRhdGVGb3JOb3RZZXRNb3VudGVkQ29tcG9uZW50ICE9PSBudWxsKSB7XG4gICAgICBpZiAoZGlkV2FyblN0YXRlVXBkYXRlRm9yTm90WWV0TW91bnRlZENvbXBvbmVudC5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBkaWRXYXJuU3RhdGVVcGRhdGVGb3JOb3RZZXRNb3VudGVkQ29tcG9uZW50LmFkZChjb21wb25lbnROYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGlkV2FyblN0YXRlVXBkYXRlRm9yTm90WWV0TW91bnRlZENvbXBvbmVudCA9IG5ldyBTZXQoW2NvbXBvbmVudE5hbWVdKTtcbiAgICB9XG5cbiAgICB2YXIgcHJldmlvdXNGaWJlciA9IGN1cnJlbnQ7XG5cbiAgICB0cnkge1xuICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgICAgZXJyb3IoXCJDYW4ndCBwZXJmb3JtIGEgUmVhY3Qgc3RhdGUgdXBkYXRlIG9uIGEgY29tcG9uZW50IHRoYXQgaGFzbid0IG1vdW50ZWQgeWV0LiBcIiArICdUaGlzIGluZGljYXRlcyB0aGF0IHlvdSBoYXZlIGEgc2lkZS1lZmZlY3QgaW4geW91ciByZW5kZXIgZnVuY3Rpb24gdGhhdCAnICsgJ2FzeW5jaHJvbm91c2x5IGxhdGVyIGNhbGxzIHRyaWVzIHRvIHVwZGF0ZSB0aGUgY29tcG9uZW50LiBNb3ZlIHRoaXMgd29yayB0byAnICsgJ3VzZUVmZmVjdCBpbnN0ZWFkLicpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAocHJldmlvdXNGaWJlcikge1xuICAgICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbnZhciBiZWdpbldvcmskMTtcblxue1xuICB2YXIgZHVtbXlGaWJlciA9IG51bGw7XG5cbiAgYmVnaW5Xb3JrJDEgPSBmdW5jdGlvbiAoY3VycmVudCwgdW5pdE9mV29yaywgbGFuZXMpIHtcbiAgICAvLyBJZiBhIGNvbXBvbmVudCB0aHJvd3MgYW4gZXJyb3IsIHdlIHJlcGxheSBpdCBhZ2FpbiBpbiBhIHN5bmNocm9ub3VzbHlcbiAgICAvLyBkaXNwYXRjaGVkIGV2ZW50LCBzbyB0aGF0IHRoZSBkZWJ1Z2dlciB3aWxsIHRyZWF0IGl0IGFzIGFuIHVuY2F1Z2h0XG4gICAgLy8gZXJyb3IgU2VlIFJlYWN0RXJyb3JVdGlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAvLyBCZWZvcmUgZW50ZXJpbmcgdGhlIGJlZ2luIHBoYXNlLCBjb3B5IHRoZSB3b3JrLWluLXByb2dyZXNzIG9udG8gYSBkdW1teVxuICAgIC8vIGZpYmVyLiBJZiBiZWdpbldvcmsgdGhyb3dzLCB3ZSdsbCB1c2UgdGhpcyB0byByZXNldCB0aGUgc3RhdGUuXG4gICAgdmFyIG9yaWdpbmFsV29ya0luUHJvZ3Jlc3NDb3B5ID0gYXNzaWduRmliZXJQcm9wZXJ0aWVzSW5ERVYoZHVtbXlGaWJlciwgdW5pdE9mV29yayk7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGJlZ2luV29yayhjdXJyZW50LCB1bml0T2ZXb3JrLCBsYW5lcyk7XG4gICAgfSBjYXRjaCAob3JpZ2luYWxFcnJvcikge1xuICAgICAgaWYgKGRpZFN1c3BlbmRPckVycm9yV2hpbGVIeWRyYXRpbmdERVYoKSB8fCBvcmlnaW5hbEVycm9yICE9PSBudWxsICYmIHR5cGVvZiBvcmlnaW5hbEVycm9yID09PSAnb2JqZWN0JyAmJiB0eXBlb2Ygb3JpZ2luYWxFcnJvci50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIERvbid0IHJlcGxheSBwcm9taXNlcy5cbiAgICAgICAgLy8gRG9uJ3QgcmVwbGF5IGVycm9ycyBpZiB3ZSBhcmUgaHlkcmF0aW5nIGFuZCBoYXZlIGFscmVhZHkgc3VzcGVuZGVkIG9yIGhhbmRsZWQgYW4gZXJyb3JcbiAgICAgICAgdGhyb3cgb3JpZ2luYWxFcnJvcjtcbiAgICAgIH0gLy8gS2VlcCB0aGlzIGNvZGUgaW4gc3luYyB3aXRoIGhhbmRsZUVycm9yOyBhbnkgY2hhbmdlcyBoZXJlIG11c3QgaGF2ZVxuICAgICAgLy8gY29ycmVzcG9uZGluZyBjaGFuZ2VzIHRoZXJlLlxuXG5cbiAgICAgIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpO1xuICAgICAgcmVzZXRIb29rc0FmdGVyVGhyb3coKTsgLy8gRG9uJ3QgcmVzZXQgY3VycmVudCBkZWJ1ZyBmaWJlciwgc2luY2Ugd2UncmUgYWJvdXQgdG8gd29yayBvbiB0aGVcbiAgICAgIC8vIHNhbWUgZmliZXIgYWdhaW4uXG4gICAgICAvLyBVbndpbmQgdGhlIGZhaWxlZCBzdGFjayBmcmFtZVxuXG4gICAgICB1bndpbmRJbnRlcnJ1cHRlZFdvcmsoY3VycmVudCwgdW5pdE9mV29yayk7IC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHByb3BlcnRpZXMgb2YgdGhlIGZpYmVyLlxuXG4gICAgICBhc3NpZ25GaWJlclByb3BlcnRpZXNJbkRFVih1bml0T2ZXb3JrLCBvcmlnaW5hbFdvcmtJblByb2dyZXNzQ29weSk7XG5cbiAgICAgIGlmICggdW5pdE9mV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgLy8gUmVzZXQgdGhlIHByb2ZpbGVyIHRpbWVyLlxuICAgICAgICBzdGFydFByb2ZpbGVyVGltZXIodW5pdE9mV29yayk7XG4gICAgICB9IC8vIFJ1biBiZWdpbldvcmsgYWdhaW4uXG5cblxuICAgICAgaW52b2tlR3VhcmRlZENhbGxiYWNrKG51bGwsIGJlZ2luV29yaywgbnVsbCwgY3VycmVudCwgdW5pdE9mV29yaywgbGFuZXMpO1xuXG4gICAgICBpZiAoaGFzQ2F1Z2h0RXJyb3IoKSkge1xuICAgICAgICB2YXIgcmVwbGF5RXJyb3IgPSBjbGVhckNhdWdodEVycm9yKCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiByZXBsYXlFcnJvciA9PT0gJ29iamVjdCcgJiYgcmVwbGF5RXJyb3IgIT09IG51bGwgJiYgcmVwbGF5RXJyb3IuX3N1cHByZXNzTG9nZ2luZyAmJiB0eXBlb2Ygb3JpZ2luYWxFcnJvciA9PT0gJ29iamVjdCcgJiYgb3JpZ2luYWxFcnJvciAhPT0gbnVsbCAmJiAhb3JpZ2luYWxFcnJvci5fc3VwcHJlc3NMb2dnaW5nKSB7XG4gICAgICAgICAgLy8gSWYgc3VwcHJlc3NlZCwgbGV0IHRoZSBmbGFnIGNhcnJ5IG92ZXIgdG8gdGhlIG9yaWdpbmFsIGVycm9yIHdoaWNoIGlzIHRoZSBvbmUgd2UnbGwgcmV0aHJvdy5cbiAgICAgICAgICBvcmlnaW5hbEVycm9yLl9zdXBwcmVzc0xvZ2dpbmcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IC8vIFdlIGFsd2F5cyB0aHJvdyB0aGUgb3JpZ2luYWwgZXJyb3IgaW4gY2FzZSB0aGUgc2Vjb25kIHJlbmRlciBwYXNzIGlzIG5vdCBpZGVtcG90ZW50LlxuICAgICAgLy8gVGhpcyBjYW4gaGFwcGVuIGlmIGEgbWVtb2l6ZWQgZnVuY3Rpb24gb3IgQ29tbW9uSlMgbW9kdWxlIGRvZXNuJ3QgdGhyb3cgYWZ0ZXIgZmlyc3QgaW52b2NhdGlvbi5cblxuXG4gICAgICB0aHJvdyBvcmlnaW5hbEVycm9yO1xuICAgIH1cbiAgfTtcbn1cblxudmFyIGRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyID0gZmFsc2U7XG52YXIgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXJGb3JBbm90aGVyQ29tcG9uZW50O1xuXG57XG4gIGRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyRm9yQW5vdGhlckNvbXBvbmVudCA9IG5ldyBTZXQoKTtcbn1cblxuZnVuY3Rpb24gd2FybkFib3V0UmVuZGVyUGhhc2VVcGRhdGVzSW5ERVYoZmliZXIpIHtcbiAge1xuICAgIGlmIChpc1JlbmRlcmluZyAmJiAhZ2V0SXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZUluREVWKCkpIHtcbiAgICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciByZW5kZXJpbmdDb21wb25lbnROYW1lID0gd29ya0luUHJvZ3Jlc3MgJiYgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcih3b3JrSW5Qcm9ncmVzcykgfHwgJ1Vua25vd24nOyAvLyBEZWR1cGUgYnkgdGhlIHJlbmRlcmluZyBjb21wb25lbnQgYmVjYXVzZSBpdCdzIHRoZSBvbmUgdGhhdCBuZWVkcyB0byBiZSBmaXhlZC5cblxuICAgICAgICAgICAgdmFyIGRlZHVwZUtleSA9IHJlbmRlcmluZ0NvbXBvbmVudE5hbWU7XG5cbiAgICAgICAgICAgIGlmICghZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXJGb3JBbm90aGVyQ29tcG9uZW50LmhhcyhkZWR1cGVLZXkpKSB7XG4gICAgICAgICAgICAgIGRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyRm9yQW5vdGhlckNvbXBvbmVudC5hZGQoZGVkdXBlS2V5KTtcbiAgICAgICAgICAgICAgdmFyIHNldFN0YXRlQ29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdVbmtub3duJztcblxuICAgICAgICAgICAgICBlcnJvcignQ2Fubm90IHVwZGF0ZSBhIGNvbXBvbmVudCAoYCVzYCkgd2hpbGUgcmVuZGVyaW5nIGEgJyArICdkaWZmZXJlbnQgY29tcG9uZW50IChgJXNgKS4gVG8gbG9jYXRlIHRoZSBiYWQgc2V0U3RhdGUoKSBjYWxsIGluc2lkZSBgJXNgLCAnICsgJ2ZvbGxvdyB0aGUgc3RhY2sgdHJhY2UgYXMgZGVzY3JpYmVkIGluIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zZXRzdGF0ZS1pbi1yZW5kZXInLCBzZXRTdGF0ZUNvbXBvbmVudE5hbWUsIHJlbmRlcmluZ0NvbXBvbmVudE5hbWUsIHJlbmRlcmluZ0NvbXBvbmVudE5hbWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoIWRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyKSB7XG4gICAgICAgICAgICAgIGVycm9yKCdDYW5ub3QgdXBkYXRlIGR1cmluZyBhbiBleGlzdGluZyBzdGF0ZSB0cmFuc2l0aW9uIChzdWNoIGFzICcgKyAnd2l0aGluIGByZW5kZXJgKS4gUmVuZGVyIG1ldGhvZHMgc2hvdWxkIGJlIGEgcHVyZSAnICsgJ2Z1bmN0aW9uIG9mIHByb3BzIGFuZCBzdGF0ZS4nKTtcblxuICAgICAgICAgICAgICBkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlciA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhyb290LCBsYW5lcykge1xuICB7XG4gICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICB2YXIgbWVtb2l6ZWRVcGRhdGVycyA9IHJvb3QubWVtb2l6ZWRVcGRhdGVycztcbiAgICAgIG1lbW9pemVkVXBkYXRlcnMuZm9yRWFjaChmdW5jdGlvbiAoc2NoZWR1bGluZ0ZpYmVyKSB7XG4gICAgICAgIGFkZEZpYmVyVG9MYW5lc01hcChyb290LCBzY2hlZHVsaW5nRmliZXIsIGxhbmVzKTtcbiAgICAgIH0pOyAvLyBUaGlzIGZ1bmN0aW9uIGludGVudGlvbmFsbHkgZG9lcyBub3QgY2xlYXIgbWVtb2l6ZWQgdXBkYXRlcnMuXG4gICAgICAvLyBUaG9zZSBtYXkgc3RpbGwgYmUgcmVsZXZhbnQgdG8gdGhlIGN1cnJlbnQgY29tbWl0XG4gICAgICAvLyBhbmQgYSBmdXR1cmUgb25lIChlLmcuIFN1c3BlbnNlKS5cbiAgICB9XG4gIH1cbn1cbnZhciBmYWtlQWN0Q2FsbGJhY2tOb2RlID0ge307XG5cbmZ1bmN0aW9uIHNjaGVkdWxlQ2FsbGJhY2skMShwcmlvcml0eUxldmVsLCBjYWxsYmFjaykge1xuICB7XG4gICAgLy8gSWYgd2UncmUgY3VycmVudGx5IGluc2lkZSBhbiBgYWN0YCBzY29wZSwgYnlwYXNzIFNjaGVkdWxlciBhbmQgcHVzaCB0b1xuICAgIC8vIHRoZSBgYWN0YCBxdWV1ZSBpbnN0ZWFkLlxuICAgIHZhciBhY3RRdWV1ZSA9IFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuY3VycmVudDtcblxuICAgIGlmIChhY3RRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgYWN0UXVldWUucHVzaChjYWxsYmFjayk7XG4gICAgICByZXR1cm4gZmFrZUFjdENhbGxiYWNrTm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHNjaGVkdWxlQ2FsbGJhY2socHJpb3JpdHlMZXZlbCwgY2FsbGJhY2spO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjYW5jZWxDYWxsYmFjayQxKGNhbGxiYWNrTm9kZSkge1xuICBpZiAoIGNhbGxiYWNrTm9kZSA9PT0gZmFrZUFjdENhbGxiYWNrTm9kZSkge1xuICAgIHJldHVybjtcbiAgfSAvLyBJbiBwcm9kdWN0aW9uLCBhbHdheXMgY2FsbCBTY2hlZHVsZXIuIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBzdHJpcHBlZCBvdXQuXG5cblxuICByZXR1cm4gY2FuY2VsQ2FsbGJhY2soY2FsbGJhY2tOb2RlKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkRm9yY2VGbHVzaEZhbGxiYWNrc0luREVWKCkge1xuICAvLyBOZXZlciBmb3JjZSBmbHVzaCBpbiBwcm9kdWN0aW9uLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBnZXQgc3RyaXBwZWQgb3V0LlxuICByZXR1cm4gIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuY3VycmVudCAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gd2FybklmVXBkYXRlc05vdFdyYXBwZWRXaXRoQWN0REVWKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoZmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSB7XG4gICAgICBpZiAoIWlzQ29uY3VycmVudEFjdEVudmlyb25tZW50KCkpIHtcbiAgICAgICAgLy8gTm90IGluIGFuIGFjdCBlbnZpcm9ubWVudC4gTm8gbmVlZCB0byB3YXJuLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIExlZ2FjeSBtb2RlIGhhcyBhZGRpdGlvbmFsIGNhc2VzIHdoZXJlIHdlIHN1cHByZXNzIGEgd2FybmluZy5cbiAgICAgIGlmICghaXNMZWdhY3lBY3RFbnZpcm9ubWVudCgpKSB7XG4gICAgICAgIC8vIE5vdCBpbiBhbiBhY3QgZW52aXJvbm1lbnQuIE5vIG5lZWQgdG8gd2Fybi5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXhlY3V0aW9uQ29udGV4dCAhPT0gTm9Db250ZXh0KSB7XG4gICAgICAgIC8vIExlZ2FjeSBtb2RlIGRvZXNuJ3Qgd2FybiBpZiB0aGUgdXBkYXRlIGlzIGJhdGNoZWQsIGkuZS5cbiAgICAgICAgLy8gYmF0Y2hlZFVwZGF0ZXMgb3IgZmx1c2hTeW5jLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChmaWJlci50YWcgIT09IEZ1bmN0aW9uQ29tcG9uZW50ICYmIGZpYmVyLnRhZyAhPT0gRm9yd2FyZFJlZiAmJiBmaWJlci50YWcgIT09IFNpbXBsZU1lbW9Db21wb25lbnQpIHtcbiAgICAgICAgLy8gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggcHJlLWhvb2tzIGNvZGUsIGxlZ2FjeSBtb2RlIG9ubHlcbiAgICAgICAgLy8gd2FybnMgZm9yIHVwZGF0ZXMgdGhhdCBvcmlnaW5hdGUgZnJvbSBhIGhvb2suXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgICB2YXIgcHJldmlvdXNGaWJlciA9IGN1cnJlbnQ7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG5cbiAgICAgICAgZXJyb3IoJ0FuIHVwZGF0ZSB0byAlcyBpbnNpZGUgYSB0ZXN0IHdhcyBub3Qgd3JhcHBlZCBpbiBhY3QoLi4uKS5cXG5cXG4nICsgJ1doZW4gdGVzdGluZywgY29kZSB0aGF0IGNhdXNlcyBSZWFjdCBzdGF0ZSB1cGRhdGVzIHNob3VsZCBiZSAnICsgJ3dyYXBwZWQgaW50byBhY3QoLi4uKTpcXG5cXG4nICsgJ2FjdCgoKSA9PiB7XFxuJyArICcgIC8qIGZpcmUgZXZlbnRzIHRoYXQgdXBkYXRlIHN0YXRlICovXFxuJyArICd9KTtcXG4nICsgJy8qIGFzc2VydCBvbiB0aGUgb3V0cHV0ICovXFxuXFxuJyArIFwiVGhpcyBlbnN1cmVzIHRoYXQgeW91J3JlIHRlc3RpbmcgdGhlIGJlaGF2aW9yIHRoZSB1c2VyIHdvdWxkIHNlZSBcIiArICdpbiB0aGUgYnJvd3Nlci4nICsgJyBMZWFybiBtb3JlIGF0IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay93cmFwLXRlc3RzLXdpdGgtYWN0JywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKHByZXZpb3VzRmliZXIpIHtcbiAgICAgICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gd2FybklmU3VzcGVuc2VSZXNvbHV0aW9uTm90V3JhcHBlZFdpdGhBY3RERVYocm9vdCkge1xuICB7XG4gICAgaWYgKHJvb3QudGFnICE9PSBMZWdhY3lSb290ICYmIGlzQ29uY3VycmVudEFjdEVudmlyb25tZW50KCkgJiYgUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgICBlcnJvcignQSBzdXNwZW5kZWQgcmVzb3VyY2UgZmluaXNoZWQgbG9hZGluZyBpbnNpZGUgYSB0ZXN0LCBidXQgdGhlIGV2ZW50ICcgKyAnd2FzIG5vdCB3cmFwcGVkIGluIGFjdCguLi4pLlxcblxcbicgKyAnV2hlbiB0ZXN0aW5nLCBjb2RlIHRoYXQgcmVzb2x2ZXMgc3VzcGVuZGVkIGRhdGEgc2hvdWxkIGJlIHdyYXBwZWQgJyArICdpbnRvIGFjdCguLi4pOlxcblxcbicgKyAnYWN0KCgpID0+IHtcXG4nICsgJyAgLyogZmluaXNoIGxvYWRpbmcgc3VzcGVuZGVkIGRhdGEgKi9cXG4nICsgJ30pO1xcbicgKyAnLyogYXNzZXJ0IG9uIHRoZSBvdXRwdXQgKi9cXG5cXG4nICsgXCJUaGlzIGVuc3VyZXMgdGhhdCB5b3UncmUgdGVzdGluZyB0aGUgYmVoYXZpb3IgdGhlIHVzZXIgd291bGQgc2VlIFwiICsgJ2luIHRoZSBicm93c2VyLicgKyAnIExlYXJuIG1vcmUgYXQgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3dyYXAtdGVzdHMtd2l0aC1hY3QnKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0SXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0KGlzUnVubmluZykge1xuICB7XG4gICAgaXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0ID0gaXNSdW5uaW5nO1xuICB9XG59XG5cbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXMgKi9cbnZhciByZXNvbHZlRmFtaWx5ID0gbnVsbDsgLy8gJEZsb3dGaXhNZSBGbG93IGdldHMgY29uZnVzZWQgYnkgYSBXZWFrU2V0IGZlYXR1cmUgY2hlY2sgYmVsb3cuXG5cbnZhciBmYWlsZWRCb3VuZGFyaWVzID0gbnVsbDtcbnZhciBzZXRSZWZyZXNoSGFuZGxlciA9IGZ1bmN0aW9uIChoYW5kbGVyKSB7XG4gIHtcbiAgICByZXNvbHZlRmFtaWx5ID0gaGFuZGxlcjtcbiAgfVxufTtcbmZ1bmN0aW9uIHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyh0eXBlKSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cblxuICAgIHZhciBmYW1pbHkgPSByZXNvbHZlRmFtaWx5KHR5cGUpO1xuXG4gICAgaWYgKGZhbWlseSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9IC8vIFVzZSB0aGUgbGF0ZXN0IGtub3duIGltcGxlbWVudGF0aW9uLlxuXG5cbiAgICByZXR1cm4gZmFtaWx5LmN1cnJlbnQ7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc29sdmVDbGFzc0ZvckhvdFJlbG9hZGluZyh0eXBlKSB7XG4gIC8vIE5vIGltcGxlbWVudGF0aW9uIGRpZmZlcmVuY2VzLlxuICByZXR1cm4gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHR5cGUpO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUZvcndhcmRSZWZGb3JIb3RSZWxvYWRpbmcodHlwZSkge1xuICB7XG4gICAgaWYgKHJlc29sdmVGYW1pbHkgPT09IG51bGwpIHtcbiAgICAgIC8vIEhvdCByZWxvYWRpbmcgaXMgZGlzYWJsZWQuXG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG5cbiAgICB2YXIgZmFtaWx5ID0gcmVzb2x2ZUZhbWlseSh0eXBlKTtcblxuICAgIGlmIChmYW1pbHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQ2hlY2sgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEgcmVhbCBmb3J3YXJkUmVmLiBEb24ndCB3YW50IHRvIGNyYXNoIGVhcmx5LlxuICAgICAgaWYgKHR5cGUgIT09IG51bGwgJiYgdHlwZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB0eXBlLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBGb3J3YXJkUmVmIGlzIHNwZWNpYWwgYmVjYXVzZSBpdHMgcmVzb2x2ZWQgLnR5cGUgaXMgYW4gb2JqZWN0LFxuICAgICAgICAvLyBidXQgaXQncyBwb3NzaWJsZSB0aGF0IHdlIG9ubHkgaGF2ZSBpdHMgaW5uZXIgcmVuZGVyIGZ1bmN0aW9uIGluIHRoZSBtYXAuXG4gICAgICAgIC8vIElmIHRoYXQgaW5uZXIgcmVuZGVyIGZ1bmN0aW9uIGlzIGRpZmZlcmVudCwgd2UnbGwgYnVpbGQgYSBuZXcgZm9yd2FyZFJlZiB0eXBlLlxuICAgICAgICB2YXIgY3VycmVudFJlbmRlciA9IHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyh0eXBlLnJlbmRlcik7XG5cbiAgICAgICAgaWYgKHR5cGUucmVuZGVyICE9PSBjdXJyZW50UmVuZGVyKSB7XG4gICAgICAgICAgdmFyIHN5bnRoZXRpY1R5cGUgPSB7XG4gICAgICAgICAgICAkJHR5cGVvZjogUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSxcbiAgICAgICAgICAgIHJlbmRlcjogY3VycmVudFJlbmRlclxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAodHlwZS5kaXNwbGF5TmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBzeW50aGV0aWNUeXBlLmRpc3BsYXlOYW1lID0gdHlwZS5kaXNwbGF5TmFtZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gc3ludGhldGljVHlwZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9IC8vIFVzZSB0aGUgbGF0ZXN0IGtub3duIGltcGxlbWVudGF0aW9uLlxuXG5cbiAgICByZXR1cm4gZmFtaWx5LmN1cnJlbnQ7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzQ29tcGF0aWJsZUZhbWlseUZvckhvdFJlbG9hZGluZyhmaWJlciwgZWxlbWVudCkge1xuICB7XG4gICAgaWYgKHJlc29sdmVGYW1pbHkgPT09IG51bGwpIHtcbiAgICAgIC8vIEhvdCByZWxvYWRpbmcgaXMgZGlzYWJsZWQuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIHByZXZUeXBlID0gZmliZXIuZWxlbWVudFR5cGU7XG4gICAgdmFyIG5leHRUeXBlID0gZWxlbWVudC50eXBlOyAvLyBJZiB3ZSBnb3QgaGVyZSwgd2Uga25vdyB0eXBlcyBhcmVuJ3QgPT09IGVxdWFsLlxuXG4gICAgdmFyIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gZmFsc2U7XG4gICAgdmFyICQkdHlwZW9mTmV4dFR5cGUgPSB0eXBlb2YgbmV4dFR5cGUgPT09ICdvYmplY3QnICYmIG5leHRUeXBlICE9PSBudWxsID8gbmV4dFR5cGUuJCR0eXBlb2YgOiBudWxsO1xuXG4gICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAodHlwZW9mIG5leHRUeXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGlmICh0eXBlb2YgbmV4dFR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCQkdHlwZW9mTmV4dFR5cGUgPT09IFJFQUNUX0xBWllfVFlQRSkge1xuICAgICAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyB0aGUgaW5uZXIgdHlwZSB5ZXQuXG4gICAgICAgICAgICAvLyBXZSdyZSBnb2luZyB0byBhc3N1bWUgdGhhdCB0aGUgbGF6eSBpbm5lciB0eXBlIGlzIHN0YWJsZSxcbiAgICAgICAgICAgIC8vIGFuZCBzbyBpdCBpcyBzdWZmaWNpZW50IHRvIGF2b2lkIHJlY29uY2lsaW5nIGl0IGF3YXkuXG4gICAgICAgICAgICAvLyBXZSdyZSBub3QgZ29pbmcgdG8gdW53cmFwIG9yIGFjdHVhbGx5IHVzZSB0aGUgbmV3IGxhenkgdHlwZS5cbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSkge1xuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKCQkdHlwZW9mTmV4dFR5cGUgPT09IFJFQUNUX01FTU9fVFlQRSkge1xuICAgICAgICAgICAgLy8gVE9ETzogaWYgaXQgd2FzIGJ1dCBjYW4gbm8gbG9uZ2VyIGJlIHNpbXBsZSxcbiAgICAgICAgICAgIC8vIHdlIHNob3VsZG4ndCBzZXQgdGhpcy5cbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCQkdHlwZW9mTmV4dFR5cGUgPT09IFJFQUNUX0xBWllfVFlQRSkge1xuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIENoZWNrIGlmIGJvdGggdHlwZXMgaGF2ZSBhIGZhbWlseSBhbmQgaXQncyB0aGUgc2FtZSBvbmUuXG5cblxuICAgIGlmIChuZWVkc0NvbXBhcmVGYW1pbGllcykge1xuICAgICAgLy8gTm90ZTogbWVtbygpIGFuZCBmb3J3YXJkUmVmKCkgd2UnbGwgY29tcGFyZSBvdXRlciByYXRoZXIgdGhhbiBpbm5lciB0eXBlLlxuICAgICAgLy8gVGhpcyBtZWFucyBib3RoIG9mIHRoZW0gbmVlZCB0byBiZSByZWdpc3RlcmVkIHRvIHByZXNlcnZlIHN0YXRlLlxuICAgICAgLy8gSWYgd2UgdW53cmFwcGVkIGFuZCBjb21wYXJlZCB0aGUgaW5uZXIgdHlwZXMgZm9yIHdyYXBwZXJzIGluc3RlYWQsXG4gICAgICAvLyB0aGVuIHdlIHdvdWxkIHJpc2sgZmFsc2VseSBzYXlpbmcgdHdvIHNlcGFyYXRlIG1lbW8oRm9vKVxuICAgICAgLy8gY2FsbHMgYXJlIGVxdWl2YWxlbnQgYmVjYXVzZSB0aGV5IHdyYXAgdGhlIHNhbWUgRm9vIGZ1bmN0aW9uLlxuICAgICAgdmFyIHByZXZGYW1pbHkgPSByZXNvbHZlRmFtaWx5KHByZXZUeXBlKTtcblxuICAgICAgaWYgKHByZXZGYW1pbHkgIT09IHVuZGVmaW5lZCAmJiBwcmV2RmFtaWx5ID09PSByZXNvbHZlRmFtaWx5KG5leHRUeXBlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtGYWlsZWRFcnJvckJvdW5kYXJ5Rm9ySG90UmVsb2FkaW5nKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIFdlYWtTZXQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZmFpbGVkQm91bmRhcmllcyA9PT0gbnVsbCkge1xuICAgICAgZmFpbGVkQm91bmRhcmllcyA9IG5ldyBXZWFrU2V0KCk7XG4gICAgfVxuXG4gICAgZmFpbGVkQm91bmRhcmllcy5hZGQoZmliZXIpO1xuICB9XG59XG52YXIgc2NoZWR1bGVSZWZyZXNoID0gZnVuY3Rpb24gKHJvb3QsIHVwZGF0ZSkge1xuICB7XG4gICAgaWYgKHJlc29sdmVGYW1pbHkgPT09IG51bGwpIHtcbiAgICAgIC8vIEhvdCByZWxvYWRpbmcgaXMgZGlzYWJsZWQuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHN0YWxlRmFtaWxpZXMgPSB1cGRhdGUuc3RhbGVGYW1pbGllcyxcbiAgICAgICAgdXBkYXRlZEZhbWlsaWVzID0gdXBkYXRlLnVwZGF0ZWRGYW1pbGllcztcbiAgICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG4gICAgZmx1c2hTeW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNjaGVkdWxlRmliZXJzV2l0aEZhbWlsaWVzUmVjdXJzaXZlbHkocm9vdC5jdXJyZW50LCB1cGRhdGVkRmFtaWxpZXMsIHN0YWxlRmFtaWxpZXMpO1xuICAgIH0pO1xuICB9XG59O1xudmFyIHNjaGVkdWxlUm9vdCA9IGZ1bmN0aW9uIChyb290LCBlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAocm9vdC5jb250ZXh0ICE9PSBlbXB0eUNvbnRleHRPYmplY3QpIHtcbiAgICAgIC8vIFN1cGVyIGVkZ2UgY2FzZTogcm9vdCBoYXMgYSBsZWdhY3kgX3JlbmRlclN1YnRyZWUgY29udGV4dFxuICAgICAgLy8gYnV0IHdlIGRvbid0IGtub3cgdGhlIHBhcmVudENvbXBvbmVudCBzbyB3ZSBjYW4ndCBwYXNzIGl0LlxuICAgICAgLy8gSnVzdCBpZ25vcmUuIFdlJ2xsIGRlbGV0ZSB0aGlzIHdpdGggX3JlbmRlclN1YnRyZWUgY29kZSBwYXRoIGxhdGVyLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgdXBkYXRlQ29udGFpbmVyKGVsZW1lbnQsIHJvb3QsIG51bGwsIG51bGwpO1xuICAgIH0pO1xuICB9XG59O1xuXG5mdW5jdGlvbiBzY2hlZHVsZUZpYmVyc1dpdGhGYW1pbGllc1JlY3Vyc2l2ZWx5KGZpYmVyLCB1cGRhdGVkRmFtaWxpZXMsIHN0YWxlRmFtaWxpZXMpIHtcbiAge1xuICAgIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGUsXG4gICAgICAgIGNoaWxkID0gZmliZXIuY2hpbGQsXG4gICAgICAgIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nLFxuICAgICAgICB0YWcgPSBmaWJlci50YWcsXG4gICAgICAgIHR5cGUgPSBmaWJlci50eXBlO1xuICAgIHZhciBjYW5kaWRhdGVUeXBlID0gbnVsbDtcblxuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgY2FuZGlkYXRlVHlwZSA9IHR5cGU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICAgIGNhbmRpZGF0ZVR5cGUgPSB0eXBlLnJlbmRlcjtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHJlc29sdmVGYW1pbHkgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgcmVzb2x2ZUZhbWlseSB0byBiZSBzZXQgZHVyaW5nIGhvdCByZWxvYWQuJyk7XG4gICAgfVxuXG4gICAgdmFyIG5lZWRzUmVuZGVyID0gZmFsc2U7XG4gICAgdmFyIG5lZWRzUmVtb3VudCA9IGZhbHNlO1xuXG4gICAgaWYgKGNhbmRpZGF0ZVR5cGUgIT09IG51bGwpIHtcbiAgICAgIHZhciBmYW1pbHkgPSByZXNvbHZlRmFtaWx5KGNhbmRpZGF0ZVR5cGUpO1xuXG4gICAgICBpZiAoZmFtaWx5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHN0YWxlRmFtaWxpZXMuaGFzKGZhbWlseSkpIHtcbiAgICAgICAgICBuZWVkc1JlbW91bnQgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHVwZGF0ZWRGYW1pbGllcy5oYXMoZmFtaWx5KSkge1xuICAgICAgICAgIGlmICh0YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICAgICAgICBuZWVkc1JlbW91bnQgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZWVkc1JlbmRlciA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGZhaWxlZEJvdW5kYXJpZXMgIT09IG51bGwpIHtcbiAgICAgIGlmIChmYWlsZWRCb3VuZGFyaWVzLmhhcyhmaWJlcikgfHwgYWx0ZXJuYXRlICE9PSBudWxsICYmIGZhaWxlZEJvdW5kYXJpZXMuaGFzKGFsdGVybmF0ZSkpIHtcbiAgICAgICAgbmVlZHNSZW1vdW50ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobmVlZHNSZW1vdW50KSB7XG4gICAgICBmaWJlci5fZGVidWdOZWVkc1JlbW91bnQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChuZWVkc1JlbW91bnQgfHwgbmVlZHNSZW5kZXIpIHtcbiAgICAgIHZhciBfcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgICBpZiAoX3Jvb3QgIT09IG51bGwpIHtcbiAgICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKF9yb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hpbGQgIT09IG51bGwgJiYgIW5lZWRzUmVtb3VudCkge1xuICAgICAgc2NoZWR1bGVGaWJlcnNXaXRoRmFtaWxpZXNSZWN1cnNpdmVseShjaGlsZCwgdXBkYXRlZEZhbWlsaWVzLCBzdGFsZUZhbWlsaWVzKTtcbiAgICB9XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2NoZWR1bGVGaWJlcnNXaXRoRmFtaWxpZXNSZWN1cnNpdmVseShzaWJsaW5nLCB1cGRhdGVkRmFtaWxpZXMsIHN0YWxlRmFtaWxpZXMpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgZmluZEhvc3RJbnN0YW5jZXNGb3JSZWZyZXNoID0gZnVuY3Rpb24gKHJvb3QsIGZhbWlsaWVzKSB7XG4gIHtcbiAgICB2YXIgaG9zdEluc3RhbmNlcyA9IG5ldyBTZXQoKTtcbiAgICB2YXIgdHlwZXMgPSBuZXcgU2V0KGZhbWlsaWVzLm1hcChmdW5jdGlvbiAoZmFtaWx5KSB7XG4gICAgICByZXR1cm4gZmFtaWx5LmN1cnJlbnQ7XG4gICAgfSkpO1xuICAgIGZpbmRIb3N0SW5zdGFuY2VzRm9yTWF0Y2hpbmdGaWJlcnNSZWN1cnNpdmVseShyb290LmN1cnJlbnQsIHR5cGVzLCBob3N0SW5zdGFuY2VzKTtcbiAgICByZXR1cm4gaG9zdEluc3RhbmNlcztcbiAgfVxufTtcblxuZnVuY3Rpb24gZmluZEhvc3RJbnN0YW5jZXNGb3JNYXRjaGluZ0ZpYmVyc1JlY3Vyc2l2ZWx5KGZpYmVyLCB0eXBlcywgaG9zdEluc3RhbmNlcykge1xuICB7XG4gICAgdmFyIGNoaWxkID0gZmliZXIuY2hpbGQsXG4gICAgICAgIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nLFxuICAgICAgICB0YWcgPSBmaWJlci50YWcsXG4gICAgICAgIHR5cGUgPSBmaWJlci50eXBlO1xuICAgIHZhciBjYW5kaWRhdGVUeXBlID0gbnVsbDtcblxuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgY2FuZGlkYXRlVHlwZSA9IHR5cGU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICAgIGNhbmRpZGF0ZVR5cGUgPSB0eXBlLnJlbmRlcjtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIGRpZE1hdGNoID0gZmFsc2U7XG5cbiAgICBpZiAoY2FuZGlkYXRlVHlwZSAhPT0gbnVsbCkge1xuICAgICAgaWYgKHR5cGVzLmhhcyhjYW5kaWRhdGVUeXBlKSkge1xuICAgICAgICBkaWRNYXRjaCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRpZE1hdGNoKSB7XG4gICAgICAvLyBXZSBoYXZlIGEgbWF0Y2guIFRoaXMgb25seSBkcmlsbHMgZG93biB0byB0aGUgY2xvc2VzdCBob3N0IGNvbXBvbmVudHMuXG4gICAgICAvLyBUaGVyZSdzIG5vIG5lZWQgdG8gc2VhcmNoIGRlZXBlciBiZWNhdXNlIGZvciB0aGUgcHVycG9zZSBvZiBnaXZpbmdcbiAgICAgIC8vIHZpc3VhbCBmZWVkYmFjaywgXCJmbGFzaGluZ1wiIG91dGVybW9zdCBwYXJlbnQgcmVjdGFuZ2xlcyBpcyBzdWZmaWNpZW50LlxuICAgICAgZmluZEhvc3RJbnN0YW5jZXNGb3JGaWJlclNoYWxsb3dseShmaWJlciwgaG9zdEluc3RhbmNlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHRoZXJlJ3Mgbm8gbWF0Y2gsIG1heWJlIHRoZXJlIHdpbGwgYmUgb25lIGZ1cnRoZXIgZG93biBpbiB0aGUgY2hpbGQgdHJlZS5cbiAgICAgIGlmIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICBmaW5kSG9zdEluc3RhbmNlc0Zvck1hdGNoaW5nRmliZXJzUmVjdXJzaXZlbHkoY2hpbGQsIHR5cGVzLCBob3N0SW5zdGFuY2VzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgZmluZEhvc3RJbnN0YW5jZXNGb3JNYXRjaGluZ0ZpYmVyc1JlY3Vyc2l2ZWx5KHNpYmxpbmcsIHR5cGVzLCBob3N0SW5zdGFuY2VzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEhvc3RJbnN0YW5jZXNGb3JGaWJlclNoYWxsb3dseShmaWJlciwgaG9zdEluc3RhbmNlcykge1xuICB7XG4gICAgdmFyIGZvdW5kSG9zdEluc3RhbmNlcyA9IGZpbmRDaGlsZEhvc3RJbnN0YW5jZXNGb3JGaWJlclNoYWxsb3dseShmaWJlciwgaG9zdEluc3RhbmNlcyk7XG5cbiAgICBpZiAoZm91bmRIb3N0SW5zdGFuY2VzKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBJZiB3ZSBkaWRuJ3QgZmluZCBhbnkgaG9zdCBjaGlsZHJlbiwgZmFsbGJhY2sgdG8gY2xvc2VzdCBob3N0IHBhcmVudC5cblxuXG4gICAgdmFyIG5vZGUgPSBmaWJlcjtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBzd2l0Y2ggKG5vZGUudGFnKSB7XG4gICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICBob3N0SW5zdGFuY2VzLmFkZChub2RlLnN0YXRlTm9kZSk7XG4gICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgICAgICBob3N0SW5zdGFuY2VzLmFkZChub2RlLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTtcbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICBob3N0SW5zdGFuY2VzLmFkZChub2RlLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIHJlYWNoIHJvb3QgZmlyc3QuJyk7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZENoaWxkSG9zdEluc3RhbmNlc0ZvckZpYmVyU2hhbGxvd2x5KGZpYmVyLCBob3N0SW5zdGFuY2VzKSB7XG4gIHtcbiAgICB2YXIgbm9kZSA9IGZpYmVyO1xuICAgIHZhciBmb3VuZEhvc3RJbnN0YW5jZXMgPSBmYWxzZTtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAobm9kZS50YWcgPT09IEhvc3RDb21wb25lbnQpIHtcbiAgICAgICAgLy8gV2UgZ290IGEgbWF0Y2guXG4gICAgICAgIGZvdW5kSG9zdEluc3RhbmNlcyA9IHRydWU7XG4gICAgICAgIGhvc3RJbnN0YW5jZXMuYWRkKG5vZGUuc3RhdGVOb2RlKTsgLy8gVGhlcmUgbWF5IHN0aWxsIGJlIG1vcmUsIHNvIGtlZXAgc2VhcmNoaW5nLlxuICAgICAgfSBlbHNlIGlmIChub2RlLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZSA9PT0gZmliZXIpIHtcbiAgICAgICAgcmV0dXJuIGZvdW5kSG9zdEluc3RhbmNlcztcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IGZpYmVyKSB7XG4gICAgICAgICAgcmV0dXJuIGZvdW5kSG9zdEluc3RhbmNlcztcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgIH1cblxuICAgICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbnZhciBoYXNCYWRNYXBQb2x5ZmlsbDtcblxue1xuICBoYXNCYWRNYXBQb2x5ZmlsbCA9IGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgdmFyIG5vbkV4dGVuc2libGVPYmplY3QgPSBPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pO1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLW5ldyAqL1xuXG4gICAgbmV3IE1hcChbW25vbkV4dGVuc2libGVPYmplY3QsIG51bGxdXSk7XG4gICAgbmV3IFNldChbbm9uRXh0ZW5zaWJsZU9iamVjdF0pO1xuICAgIC8qIGVzbGludC1lbmFibGUgbm8tbmV3ICovXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBUT0RPOiBDb25zaWRlciB3YXJuaW5nIGFib3V0IGJhZCBwb2x5ZmlsbHNcbiAgICBoYXNCYWRNYXBQb2x5ZmlsbCA9IHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gRmliZXJOb2RlKHRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpIHtcbiAgLy8gSW5zdGFuY2VcbiAgdGhpcy50YWcgPSB0YWc7XG4gIHRoaXMua2V5ID0ga2V5O1xuICB0aGlzLmVsZW1lbnRUeXBlID0gbnVsbDtcbiAgdGhpcy50eXBlID0gbnVsbDtcbiAgdGhpcy5zdGF0ZU5vZGUgPSBudWxsOyAvLyBGaWJlclxuXG4gIHRoaXMucmV0dXJuID0gbnVsbDtcbiAgdGhpcy5jaGlsZCA9IG51bGw7XG4gIHRoaXMuc2libGluZyA9IG51bGw7XG4gIHRoaXMuaW5kZXggPSAwO1xuICB0aGlzLnJlZiA9IG51bGw7XG4gIHRoaXMucGVuZGluZ1Byb3BzID0gcGVuZGluZ1Byb3BzO1xuICB0aGlzLm1lbW9pemVkUHJvcHMgPSBudWxsO1xuICB0aGlzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgdGhpcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgdGhpcy5kZXBlbmRlbmNpZXMgPSBudWxsO1xuICB0aGlzLm1vZGUgPSBtb2RlOyAvLyBFZmZlY3RzXG5cbiAgdGhpcy5mbGFncyA9IE5vRmxhZ3M7XG4gIHRoaXMuc3VidHJlZUZsYWdzID0gTm9GbGFncztcbiAgdGhpcy5kZWxldGlvbnMgPSBudWxsO1xuICB0aGlzLmxhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5jaGlsZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5hbHRlcm5hdGUgPSBudWxsO1xuXG4gIHtcbiAgICAvLyBOb3RlOiBUaGUgZm9sbG93aW5nIGlzIGRvbmUgdG8gYXZvaWQgYSB2OCBwZXJmb3JtYW5jZSBjbGlmZi5cbiAgICAvL1xuICAgIC8vIEluaXRpYWxpemluZyB0aGUgZmllbGRzIGJlbG93IHRvIHNtaXMgYW5kIGxhdGVyIHVwZGF0aW5nIHRoZW0gd2l0aFxuICAgIC8vIGRvdWJsZSB2YWx1ZXMgd2lsbCBjYXVzZSBGaWJlcnMgdG8gZW5kIHVwIGhhdmluZyBzZXBhcmF0ZSBzaGFwZXMuXG4gICAgLy8gVGhpcyBiZWhhdmlvci9idWcgaGFzIHNvbWV0aGluZyB0byBkbyB3aXRoIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9uKCkuXG4gICAgLy8gRm9ydHVuYXRlbHkgdGhpcyBvbmx5IGltcGFjdHMgREVWIGJ1aWxkcy5cbiAgICAvLyBVbmZvcnR1bmF0ZWx5IGl0IG1ha2VzIFJlYWN0IHVudXNhYmx5IHNsb3cgZm9yIHNvbWUgYXBwbGljYXRpb25zLlxuICAgIC8vIFRvIHdvcmsgYXJvdW5kIHRoaXMsIGluaXRpYWxpemUgdGhlIGZpZWxkcyBiZWxvdyB3aXRoIGRvdWJsZXMuXG4gICAgLy9cbiAgICAvLyBMZWFybiBtb3JlIGFib3V0IHRoaXMgaGVyZTpcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE0MzY1XG4gICAgLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9ODUzOFxuICAgIHRoaXMuYWN0dWFsRHVyYXRpb24gPSBOdW1iZXIuTmFOO1xuICAgIHRoaXMuYWN0dWFsU3RhcnRUaW1lID0gTnVtYmVyLk5hTjtcbiAgICB0aGlzLnNlbGZCYXNlRHVyYXRpb24gPSBOdW1iZXIuTmFOO1xuICAgIHRoaXMudHJlZUJhc2VEdXJhdGlvbiA9IE51bWJlci5OYU47IC8vIEl0J3Mgb2theSB0byByZXBsYWNlIHRoZSBpbml0aWFsIGRvdWJsZXMgd2l0aCBzbWlzIGFmdGVyIGluaXRpYWxpemF0aW9uLlxuICAgIC8vIFRoaXMgd29uJ3QgdHJpZ2dlciB0aGUgcGVyZm9ybWFuY2UgY2xpZmYgbWVudGlvbmVkIGFib3ZlLFxuICAgIC8vIGFuZCBpdCBzaW1wbGlmaWVzIG90aGVyIHByb2ZpbGVyIGNvZGUgKGluY2x1ZGluZyBEZXZUb29scykuXG5cbiAgICB0aGlzLmFjdHVhbER1cmF0aW9uID0gMDtcbiAgICB0aGlzLmFjdHVhbFN0YXJ0VGltZSA9IC0xO1xuICAgIHRoaXMuc2VsZkJhc2VEdXJhdGlvbiA9IDA7XG4gICAgdGhpcy50cmVlQmFzZUR1cmF0aW9uID0gMDtcbiAgfVxuXG4gIHtcbiAgICAvLyBUaGlzIGlzbid0IGRpcmVjdGx5IHVzZWQgYnV0IGlzIGhhbmR5IGZvciBkZWJ1Z2dpbmcgaW50ZXJuYWxzOlxuICAgIHRoaXMuX2RlYnVnU291cmNlID0gbnVsbDtcbiAgICB0aGlzLl9kZWJ1Z093bmVyID0gbnVsbDtcbiAgICB0aGlzLl9kZWJ1Z05lZWRzUmVtb3VudCA9IGZhbHNlO1xuICAgIHRoaXMuX2RlYnVnSG9va1R5cGVzID0gbnVsbDtcblxuICAgIGlmICghaGFzQmFkTWFwUG9seWZpbGwgJiYgdHlwZW9mIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHRoaXMpO1xuICAgIH1cbiAgfVxufSAvLyBUaGlzIGlzIGEgY29uc3RydWN0b3IgZnVuY3Rpb24sIHJhdGhlciB0aGFuIGEgUE9KTyBjb25zdHJ1Y3Rvciwgc3RpbGxcbi8vIHBsZWFzZSBlbnN1cmUgd2UgZG8gdGhlIGZvbGxvd2luZzpcbi8vIDEpIE5vYm9keSBzaG91bGQgYWRkIGFueSBpbnN0YW5jZSBtZXRob2RzIG9uIHRoaXMuIEluc3RhbmNlIG1ldGhvZHMgY2FuIGJlXG4vLyAgICBtb3JlIGRpZmZpY3VsdCB0byBwcmVkaWN0IHdoZW4gdGhleSBnZXQgb3B0aW1pemVkIGFuZCB0aGV5IGFyZSBhbG1vc3Rcbi8vICAgIG5ldmVyIGlubGluZWQgcHJvcGVybHkgaW4gc3RhdGljIGNvbXBpbGVycy5cbi8vIDIpIE5vYm9keSBzaG91bGQgcmVseSBvbiBgaW5zdGFuY2VvZiBGaWJlcmAgZm9yIHR5cGUgdGVzdGluZy4gV2Ugc2hvdWxkXG4vLyAgICBhbHdheXMga25vdyB3aGVuIGl0IGlzIGEgZmliZXIuXG4vLyAzKSBXZSBtaWdodCB3YW50IHRvIGV4cGVyaW1lbnQgd2l0aCB1c2luZyBudW1lcmljIGtleXMgc2luY2UgdGhleSBhcmUgZWFzaWVyXG4vLyAgICB0byBvcHRpbWl6ZSBpbiBhIG5vbi1KSVQgZW52aXJvbm1lbnQuXG4vLyA0KSBXZSBjYW4gZWFzaWx5IGdvIGZyb20gYSBjb25zdHJ1Y3RvciB0byBhIGNyZWF0ZUZpYmVyIG9iamVjdCBsaXRlcmFsIGlmIHRoYXRcbi8vICAgIGlzIGZhc3Rlci5cbi8vIDUpIEl0IHNob3VsZCBiZSBlYXN5IHRvIHBvcnQgdGhpcyB0byBhIEMgc3RydWN0IGFuZCBrZWVwIGEgQyBpbXBsZW1lbnRhdGlvblxuLy8gICAgY29tcGF0aWJsZS5cblxuXG52YXIgY3JlYXRlRmliZXIgPSBmdW5jdGlvbiAodGFnLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSkge1xuICAvLyAkRmxvd0ZpeE1lOiB0aGUgc2hhcGVzIGFyZSBleGFjdCBoZXJlIGJ1dCBGbG93IGRvZXNuJ3QgbGlrZSBjb25zdHJ1Y3RvcnNcbiAgcmV0dXJuIG5ldyBGaWJlck5vZGUodGFnLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSk7XG59O1xuXG5mdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QkMShDb21wb25lbnQpIHtcbiAgdmFyIHByb3RvdHlwZSA9IENvbXBvbmVudC5wcm90b3R5cGU7XG4gIHJldHVybiAhIShwcm90b3R5cGUgJiYgcHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQpO1xufVxuXG5mdW5jdGlvbiBpc1NpbXBsZUZ1bmN0aW9uQ29tcG9uZW50KHR5cGUpIHtcbiAgcmV0dXJuIHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nICYmICFzaG91bGRDb25zdHJ1Y3QkMSh0eXBlKSAmJiB0eXBlLmRlZmF1bHRQcm9wcyA9PT0gdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUxhenlDb21wb25lbnRUYWcoQ29tcG9uZW50KSB7XG4gIGlmICh0eXBlb2YgQ29tcG9uZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHNob3VsZENvbnN0cnVjdCQxKENvbXBvbmVudCkgPyBDbGFzc0NvbXBvbmVudCA6IEZ1bmN0aW9uQ29tcG9uZW50O1xuICB9IGVsc2UgaWYgKENvbXBvbmVudCAhPT0gdW5kZWZpbmVkICYmIENvbXBvbmVudCAhPT0gbnVsbCkge1xuICAgIHZhciAkJHR5cGVvZiA9IENvbXBvbmVudC4kJHR5cGVvZjtcblxuICAgIGlmICgkJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSkge1xuICAgICAgcmV0dXJuIEZvcndhcmRSZWY7XG4gICAgfVxuXG4gICAgaWYgKCQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUpIHtcbiAgICAgIHJldHVybiBNZW1vQ29tcG9uZW50O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBJbmRldGVybWluYXRlQ29tcG9uZW50O1xufSAvLyBUaGlzIGlzIHVzZWQgdG8gY3JlYXRlIGFuIGFsdGVybmF0ZSBmaWJlciB0byBkbyB3b3JrIG9uLlxuXG5mdW5jdGlvbiBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50LCBwZW5kaW5nUHJvcHMpIHtcbiAgdmFyIHdvcmtJblByb2dyZXNzID0gY3VycmVudC5hbHRlcm5hdGU7XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzID09PSBudWxsKSB7XG4gICAgLy8gV2UgdXNlIGEgZG91YmxlIGJ1ZmZlcmluZyBwb29saW5nIHRlY2huaXF1ZSBiZWNhdXNlIHdlIGtub3cgdGhhdCB3ZSdsbFxuICAgIC8vIG9ubHkgZXZlciBuZWVkIGF0IG1vc3QgdHdvIHZlcnNpb25zIG9mIGEgdHJlZS4gV2UgcG9vbCB0aGUgXCJvdGhlclwiIHVudXNlZFxuICAgIC8vIG5vZGUgdGhhdCB3ZSdyZSBmcmVlIHRvIHJldXNlLiBUaGlzIGlzIGxhemlseSBjcmVhdGVkIHRvIGF2b2lkIGFsbG9jYXRpbmdcbiAgICAvLyBleHRyYSBvYmplY3RzIGZvciB0aGluZ3MgdGhhdCBhcmUgbmV2ZXIgdXBkYXRlZC4gSXQgYWxzbyBhbGxvdyB1cyB0b1xuICAgIC8vIHJlY2xhaW0gdGhlIGV4dHJhIG1lbW9yeSBpZiBuZWVkZWQuXG4gICAgd29ya0luUHJvZ3Jlc3MgPSBjcmVhdGVGaWJlcihjdXJyZW50LnRhZywgcGVuZGluZ1Byb3BzLCBjdXJyZW50LmtleSwgY3VycmVudC5tb2RlKTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9IGN1cnJlbnQuZWxlbWVudFR5cGU7XG4gICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IGN1cnJlbnQudHlwZTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBjdXJyZW50LnN0YXRlTm9kZTtcblxuICAgIHtcbiAgICAgIC8vIERFVi1vbmx5IGZpZWxkc1xuICAgICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnU291cmNlID0gY3VycmVudC5fZGVidWdTb3VyY2U7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdPd25lciA9IGN1cnJlbnQuX2RlYnVnT3duZXI7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdIb29rVHlwZXMgPSBjdXJyZW50Ll9kZWJ1Z0hvb2tUeXBlcztcbiAgICB9XG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBjdXJyZW50O1xuICAgIGN1cnJlbnQuYWx0ZXJuYXRlID0gd29ya0luUHJvZ3Jlc3M7XG4gIH0gZWxzZSB7XG4gICAgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzID0gcGVuZGluZ1Byb3BzOyAvLyBOZWVkZWQgYmVjYXVzZSBCbG9ja3Mgc3RvcmUgZGF0YSBvbiB0eXBlLlxuXG4gICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IGN1cnJlbnQudHlwZTsgLy8gV2UgYWxyZWFkeSBoYXZlIGFuIGFsdGVybmF0ZS5cbiAgICAvLyBSZXNldCB0aGUgZWZmZWN0IHRhZy5cblxuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID0gTm9GbGFnczsgLy8gVGhlIGVmZmVjdHMgYXJlIG5vIGxvbmdlciB2YWxpZC5cblxuICAgIHdvcmtJblByb2dyZXNzLnN1YnRyZWVGbGFncyA9IE5vRmxhZ3M7XG4gICAgd29ya0luUHJvZ3Jlc3MuZGVsZXRpb25zID0gbnVsbDtcblxuICAgIHtcbiAgICAgIC8vIFdlIGludGVudGlvbmFsbHkgcmVzZXQsIHJhdGhlciB0aGFuIGNvcHksIGFjdHVhbER1cmF0aW9uICYgYWN0dWFsU3RhcnRUaW1lLlxuICAgICAgLy8gVGhpcyBwcmV2ZW50cyB0aW1lIGZyb20gZW5kbGVzc2x5IGFjY3VtdWxhdGluZyBpbiBuZXcgY29tbWl0cy5cbiAgICAgIC8vIFRoaXMgaGFzIHRoZSBkb3duc2lkZSBvZiByZXNldHRpbmcgdmFsdWVzIGZvciBkaWZmZXJlbnQgcHJpb3JpdHkgcmVuZGVycyxcbiAgICAgIC8vIEJ1dCB3b3JrcyBmb3IgeWllbGRpbmcgKHRoZSBjb21tb24gY2FzZSkgYW5kIHNob3VsZCBzdXBwb3J0IHJlc3VtaW5nLlxuICAgICAgd29ya0luUHJvZ3Jlc3MuYWN0dWFsRHVyYXRpb24gPSAwO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuYWN0dWFsU3RhcnRUaW1lID0gLTE7XG4gICAgfVxuICB9IC8vIFJlc2V0IGFsbCBlZmZlY3RzIGV4Y2VwdCBzdGF0aWMgb25lcy5cbiAgLy8gU3RhdGljIGVmZmVjdHMgYXJlIG5vdCBzcGVjaWZpYyB0byBhIHJlbmRlci5cblxuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzID0gY3VycmVudC5mbGFncyAmIFN0YXRpY01hc2s7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMgPSBjdXJyZW50LmNoaWxkTGFuZXM7XG4gIHdvcmtJblByb2dyZXNzLmxhbmVzID0gY3VycmVudC5sYW5lcztcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjdXJyZW50LmNoaWxkO1xuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7IC8vIENsb25lIHRoZSBkZXBlbmRlbmNpZXMgb2JqZWN0LiBUaGlzIGlzIG11dGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UsIHNvXG4gIC8vIGl0IGNhbm5vdCBiZSBzaGFyZWQgd2l0aCB0aGUgY3VycmVudCBmaWJlci5cblxuICB2YXIgY3VycmVudERlcGVuZGVuY2llcyA9IGN1cnJlbnQuZGVwZW5kZW5jaWVzO1xuICB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPSBjdXJyZW50RGVwZW5kZW5jaWVzID09PSBudWxsID8gbnVsbCA6IHtcbiAgICBsYW5lczogY3VycmVudERlcGVuZGVuY2llcy5sYW5lcyxcbiAgICBmaXJzdENvbnRleHQ6IGN1cnJlbnREZXBlbmRlbmNpZXMuZmlyc3RDb250ZXh0XG4gIH07IC8vIFRoZXNlIHdpbGwgYmUgb3ZlcnJpZGRlbiBkdXJpbmcgdGhlIHBhcmVudCdzIHJlY29uY2lsaWF0aW9uXG5cbiAgd29ya0luUHJvZ3Jlc3Muc2libGluZyA9IGN1cnJlbnQuc2libGluZztcbiAgd29ya0luUHJvZ3Jlc3MuaW5kZXggPSBjdXJyZW50LmluZGV4O1xuICB3b3JrSW5Qcm9ncmVzcy5yZWYgPSBjdXJyZW50LnJlZjtcblxuICB7XG4gICAgd29ya0luUHJvZ3Jlc3Muc2VsZkJhc2VEdXJhdGlvbiA9IGN1cnJlbnQuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uID0gY3VycmVudC50cmVlQmFzZUR1cmF0aW9uO1xuICB9XG5cbiAge1xuICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z05lZWRzUmVtb3VudCA9IGN1cnJlbnQuX2RlYnVnTmVlZHNSZW1vdW50O1xuXG4gICAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICAgIGNhc2UgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDpcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcoY3VycmVudC50eXBlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSByZXNvbHZlQ2xhc3NGb3JIb3RSZWxvYWRpbmcoY3VycmVudC50eXBlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IHJlc29sdmVGb3J3YXJkUmVmRm9ySG90UmVsb2FkaW5nKGN1cnJlbnQudHlwZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbn0gLy8gVXNlZCB0byByZXVzZSBhIEZpYmVyIGZvciBhIHNlY29uZCBwYXNzLlxuXG5mdW5jdGlvbiByZXNldFdvcmtJblByb2dyZXNzKHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAvLyBUaGlzIHJlc2V0cyB0aGUgRmliZXIgdG8gd2hhdCBjcmVhdGVGaWJlciBvciBjcmVhdGVXb3JrSW5Qcm9ncmVzcyB3b3VsZFxuICAvLyBoYXZlIHNldCB0aGUgdmFsdWVzIHRvIGJlZm9yZSBkdXJpbmcgdGhlIGZpcnN0IHBhc3MuIElkZWFsbHkgdGhpcyB3b3VsZG4ndFxuICAvLyBiZSBuZWNlc3NhcnkgYnV0IHVuZm9ydHVuYXRlbHkgbWFueSBjb2RlIHBhdGhzIHJlYWRzIGZyb20gdGhlIHdvcmtJblByb2dyZXNzXG4gIC8vIHdoZW4gdGhleSBzaG91bGQgYmUgcmVhZGluZyBmcm9tIGN1cnJlbnQgYW5kIHdyaXRpbmcgdG8gd29ya0luUHJvZ3Jlc3MuXG4gIC8vIFdlIGFzc3VtZSBwZW5kaW5nUHJvcHMsIGluZGV4LCBrZXksIHJlZiwgcmV0dXJuIGFyZSBzdGlsbCB1bnRvdWNoZWQgdG9cbiAgLy8gYXZvaWQgZG9pbmcgYW5vdGhlciByZWNvbmNpbGlhdGlvbi5cbiAgLy8gUmVzZXQgdGhlIGVmZmVjdCBmbGFncyBidXQga2VlcCBhbnkgUGxhY2VtZW50IHRhZ3MsIHNpbmNlIHRoYXQncyBzb21ldGhpbmdcbiAgLy8gdGhhdCBjaGlsZCBmaWJlciBpcyBzZXR0aW5nLCBub3QgdGhlIHJlY29uY2lsaWF0aW9uLlxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSBTdGF0aWNNYXNrIHwgUGxhY2VtZW50OyAvLyBUaGUgZWZmZWN0cyBhcmUgbm8gbG9uZ2VyIHZhbGlkLlxuXG4gIHZhciBjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlO1xuXG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgLy8gUmVzZXQgdG8gY3JlYXRlRmliZXIncyBpbml0aWFsIHZhbHVlcy5cbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzID0gTm9MYW5lcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IHJlbmRlckxhbmVzO1xuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5zdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IG51bGw7XG5cbiAgICB7XG4gICAgICAvLyBOb3RlOiBXZSBkb24ndCByZXNldCB0aGUgYWN0dWFsVGltZSBjb3VudHMuIEl0J3MgdXNlZnVsIHRvIGFjY3VtdWxhdGVcbiAgICAgIC8vIGFjdHVhbCB0aW1lIGFjcm9zcyBtdWx0aXBsZSByZW5kZXIgcGFzc2VzLlxuICAgICAgd29ya0luUHJvZ3Jlc3Muc2VsZkJhc2VEdXJhdGlvbiA9IDA7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uID0gMDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gUmVzZXQgdG8gdGhlIGNsb25lZCB2YWx1ZXMgdGhhdCBjcmVhdGVXb3JrSW5Qcm9ncmVzcyB3b3VsZCd2ZS5cbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzID0gY3VycmVudC5jaGlsZExhbmVzO1xuICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gY3VycmVudC5sYW5lcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGN1cnJlbnQuY2hpbGQ7XG4gICAgd29ya0luUHJvZ3Jlc3Muc3VidHJlZUZsYWdzID0gTm9GbGFncztcbiAgICB3b3JrSW5Qcm9ncmVzcy5kZWxldGlvbnMgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7IC8vIE5lZWRlZCBiZWNhdXNlIEJsb2NrcyBzdG9yZSBkYXRhIG9uIHR5cGUuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gY3VycmVudC50eXBlOyAvLyBDbG9uZSB0aGUgZGVwZW5kZW5jaWVzIG9iamVjdC4gVGhpcyBpcyBtdXRhdGVkIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLCBzb1xuICAgIC8vIGl0IGNhbm5vdCBiZSBzaGFyZWQgd2l0aCB0aGUgY3VycmVudCBmaWJlci5cblxuICAgIHZhciBjdXJyZW50RGVwZW5kZW5jaWVzID0gY3VycmVudC5kZXBlbmRlbmNpZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MuZGVwZW5kZW5jaWVzID0gY3VycmVudERlcGVuZGVuY2llcyA9PT0gbnVsbCA/IG51bGwgOiB7XG4gICAgICBsYW5lczogY3VycmVudERlcGVuZGVuY2llcy5sYW5lcyxcbiAgICAgIGZpcnN0Q29udGV4dDogY3VycmVudERlcGVuZGVuY2llcy5maXJzdENvbnRleHRcbiAgICB9O1xuXG4gICAge1xuICAgICAgLy8gTm90ZTogV2UgZG9uJ3QgcmVzZXQgdGhlIGFjdHVhbFRpbWUgY291bnRzLiBJdCdzIHVzZWZ1bCB0byBhY2N1bXVsYXRlXG4gICAgICAvLyBhY3R1YWwgdGltZSBhY3Jvc3MgbXVsdGlwbGUgcmVuZGVyIHBhc3Nlcy5cbiAgICAgIHdvcmtJblByb2dyZXNzLnNlbGZCYXNlRHVyYXRpb24gPSBjdXJyZW50LnNlbGZCYXNlRHVyYXRpb247XG4gICAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uID0gY3VycmVudC50cmVlQmFzZUR1cmF0aW9uO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbn1cbmZ1bmN0aW9uIGNyZWF0ZUhvc3RSb290RmliZXIodGFnLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUpIHtcbiAgdmFyIG1vZGU7XG5cbiAgaWYgKHRhZyA9PT0gQ29uY3VycmVudFJvb3QpIHtcbiAgICBtb2RlID0gQ29uY3VycmVudE1vZGU7XG5cbiAgICBpZiAoaXNTdHJpY3RNb2RlID09PSB0cnVlKSB7XG4gICAgICBtb2RlIHw9IFN0cmljdExlZ2FjeU1vZGU7XG5cbiAgICAgIHtcbiAgICAgICAgbW9kZSB8PSBTdHJpY3RFZmZlY3RzTW9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbW9kZSA9IE5vTW9kZTtcbiAgfVxuXG4gIGlmICggaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAvLyBBbHdheXMgY29sbGVjdCBwcm9maWxlIHRpbWluZ3Mgd2hlbiBEZXZUb29scyBhcmUgcHJlc2VudC5cbiAgICAvLyBUaGlzIGVuYWJsZXMgRGV2VG9vbHMgdG8gc3RhcnQgY2FwdHVyaW5nIHRpbWluZyBhdCBhbnkgcG9pbnRcdTIwMTNcbiAgICAvLyBXaXRob3V0IHNvbWUgbm9kZXMgaW4gdGhlIHRyZWUgaGF2aW5nIGVtcHR5IGJhc2UgdGltZXMuXG4gICAgbW9kZSB8PSBQcm9maWxlTW9kZTtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVGaWJlcihIb3N0Um9vdCwgbnVsbCwgbnVsbCwgbW9kZSk7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21UeXBlQW5kUHJvcHModHlwZSwgLy8gUmVhY3QkRWxlbWVudFR5cGVcbmtleSwgcGVuZGluZ1Byb3BzLCBvd25lciwgbW9kZSwgbGFuZXMpIHtcbiAgdmFyIGZpYmVyVGFnID0gSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDsgLy8gVGhlIHJlc29sdmVkIHR5cGUgaXMgc2V0IGlmIHdlIGtub3cgd2hhdCB0aGUgZmluYWwgdHlwZSB3aWxsIGJlLiBJLmUuIGl0J3Mgbm90IGxhenkuXG5cbiAgdmFyIHJlc29sdmVkVHlwZSA9IHR5cGU7XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKHNob3VsZENvbnN0cnVjdCQxKHR5cGUpKSB7XG4gICAgICBmaWJlclRhZyA9IENsYXNzQ29tcG9uZW50O1xuXG4gICAgICB7XG4gICAgICAgIHJlc29sdmVkVHlwZSA9IHJlc29sdmVDbGFzc0ZvckhvdFJlbG9hZGluZyhyZXNvbHZlZFR5cGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB7XG4gICAgICAgIHJlc29sdmVkVHlwZSA9IHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyhyZXNvbHZlZFR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICBmaWJlclRhZyA9IEhvc3RDb21wb25lbnQ7XG4gIH0gZWxzZSB7XG4gICAgZ2V0VGFnOiBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KHBlbmRpbmdQcm9wcy5jaGlsZHJlbiwgbW9kZSwgbGFuZXMsIGtleSk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgICAgZmliZXJUYWcgPSBNb2RlO1xuICAgICAgICBtb2RlIHw9IFN0cmljdExlZ2FjeU1vZGU7XG5cbiAgICAgICAgaWYgKCAobW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgLy8gU3RyaWN0IGVmZmVjdHMgc2hvdWxkIG5ldmVyIHJ1biBvbiBsZWdhY3kgcm9vdHNcbiAgICAgICAgICBtb2RlIHw9IFN0cmljdEVmZmVjdHNNb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbVByb2ZpbGVyKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbVN1c3BlbnNlKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tU3VzcGVuc2VMaXN0KHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfT0ZGU0NSRUVOX1RZUEU6XG4gICAgICAgIHJldHVybiBjcmVhdGVGaWJlckZyb21PZmZzY3JlZW4ocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9MRUdBQ1lfSElEREVOX1RZUEU6XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgICBjYXNlIFJFQUNUX1NDT1BFX1RZUEU6XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgICBjYXNlIFJFQUNUX0NBQ0hFX1RZUEU6XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgICBjYXNlIFJFQUNUX1RSQUNJTkdfTUFSS0VSX1RZUEU6XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgICBjYXNlIFJFQUNUX0RFQlVHX1RSQUNJTkdfTU9ERV9UWVBFOlxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAge1xuICAgICAgICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IENvbnRleHRQcm92aWRlcjtcbiAgICAgICAgICAgICAgICBicmVhayBnZXRUYWc7XG5cbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGNvbnN1bWVyXG4gICAgICAgICAgICAgICAgZmliZXJUYWcgPSBDb250ZXh0Q29uc3VtZXI7XG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuXG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IEZvcndhcmRSZWY7XG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICByZXNvbHZlZFR5cGUgPSByZXNvbHZlRm9yd2FyZFJlZkZvckhvdFJlbG9hZGluZyhyZXNvbHZlZFR5cGUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrIGdldFRhZztcblxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IE1lbW9Db21wb25lbnQ7XG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuXG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gTGF6eUNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICByZXNvbHZlZFR5cGUgPSBudWxsO1xuICAgICAgICAgICAgICAgIGJyZWFrIGdldFRhZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgaW5mbyA9ICcnO1xuXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgaW5mbyArPSAnIFlvdSBsaWtlbHkgZm9yZ290IHRvIGV4cG9ydCB5b3VyIGNvbXBvbmVudCBmcm9tIHRoZSBmaWxlICcgKyBcIml0J3MgZGVmaW5lZCBpbiwgb3IgeW91IG1pZ2h0IGhhdmUgbWl4ZWQgdXAgZGVmYXVsdCBhbmQgXCIgKyAnbmFtZWQgaW1wb3J0cy4nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgb3duZXJOYW1lID0gb3duZXIgPyBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKG93bmVyKSA6IG51bGw7XG5cbiAgICAgICAgICAgIGlmIChvd25lck5hbWUpIHtcbiAgICAgICAgICAgICAgaW5mbyArPSAnXFxuXFxuQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBvd25lck5hbWUgKyAnYC4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRWxlbWVudCB0eXBlIGlzIGludmFsaWQ6IGV4cGVjdGVkIGEgc3RyaW5nIChmb3IgYnVpbHQtaW4gJyArICdjb21wb25lbnRzKSBvciBhIGNsYXNzL2Z1bmN0aW9uIChmb3IgY29tcG9zaXRlIGNvbXBvbmVudHMpICcgKyAoXCJidXQgZ290OiBcIiArICh0eXBlID09IG51bGwgPyB0eXBlIDogdHlwZW9mIHR5cGUpICsgXCIuXCIgKyBpbmZvKSk7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihmaWJlclRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpO1xuICBmaWJlci5lbGVtZW50VHlwZSA9IHR5cGU7XG4gIGZpYmVyLnR5cGUgPSByZXNvbHZlZFR5cGU7XG4gIGZpYmVyLmxhbmVzID0gbGFuZXM7XG5cbiAge1xuICAgIGZpYmVyLl9kZWJ1Z093bmVyID0gb3duZXI7XG4gIH1cblxuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21FbGVtZW50KGVsZW1lbnQsIG1vZGUsIGxhbmVzKSB7XG4gIHZhciBvd25lciA9IG51bGw7XG5cbiAge1xuICAgIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gIH1cblxuICB2YXIgdHlwZSA9IGVsZW1lbnQudHlwZTtcbiAgdmFyIGtleSA9IGVsZW1lbnQua2V5O1xuICB2YXIgcGVuZGluZ1Byb3BzID0gZWxlbWVudC5wcm9wcztcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXJGcm9tVHlwZUFuZFByb3BzKHR5cGUsIGtleSwgcGVuZGluZ1Byb3BzLCBvd25lciwgbW9kZSwgbGFuZXMpO1xuXG4gIHtcbiAgICBmaWJlci5fZGVidWdTb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7XG4gICAgZmliZXIuX2RlYnVnT3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgfVxuXG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGVsZW1lbnRzLCBtb2RlLCBsYW5lcywga2V5KSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEZyYWdtZW50LCBlbGVtZW50cywga2V5LCBtb2RlKTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGZpYmVyO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21Qcm9maWxlcihwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgcGVuZGluZ1Byb3BzLmlkICE9PSAnc3RyaW5nJykge1xuICAgICAgZXJyb3IoJ1Byb2ZpbGVyIG11c3Qgc3BlY2lmeSBhbiBcImlkXCIgb2YgdHlwZSBgc3RyaW5nYCBhcyBhIHByb3AuIFJlY2VpdmVkIHRoZSB0eXBlIGAlc2AgaW5zdGVhZC4nLCB0eXBlb2YgcGVuZGluZ1Byb3BzLmlkKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihQcm9maWxlciwgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUgfCBQcm9maWxlTW9kZSk7XG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcblxuICB7XG4gICAgZmliZXIuc3RhdGVOb2RlID0ge1xuICAgICAgZWZmZWN0RHVyYXRpb246IDAsXG4gICAgICBwYXNzaXZlRWZmZWN0RHVyYXRpb246IDBcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGZpYmVyO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21TdXNwZW5zZShwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoU3VzcGVuc2VDb21wb25lbnQsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTtcbiAgZmliZXIuZWxlbWVudFR5cGUgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21TdXNwZW5zZUxpc3QocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKFN1c3BlbnNlTGlzdENvbXBvbmVudCwgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpO1xuICBmaWJlci5lbGVtZW50VHlwZSA9IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tT2Zmc2NyZWVuKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSkge1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihPZmZzY3JlZW5Db21wb25lbnQsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTtcbiAgZmliZXIuZWxlbWVudFR5cGUgPSBSRUFDVF9PRkZTQ1JFRU5fVFlQRTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgdmFyIHByaW1hcnlDaGlsZEluc3RhbmNlID0ge1xuICAgIGlzSGlkZGVuOiBmYWxzZVxuICB9O1xuICBmaWJlci5zdGF0ZU5vZGUgPSBwcmltYXJ5Q2hpbGRJbnN0YW5jZTtcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tVGV4dChjb250ZW50LCBtb2RlLCBsYW5lcykge1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihIb3N0VGV4dCwgY29udGVudCwgbnVsbCwgbW9kZSk7XG4gIGZpYmVyLmxhbmVzID0gbGFuZXM7XG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbUhvc3RJbnN0YW5jZUZvckRlbGV0aW9uKCkge1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihIb3N0Q29tcG9uZW50LCBudWxsLCBudWxsLCBOb01vZGUpO1xuICBmaWJlci5lbGVtZW50VHlwZSA9ICdERUxFVEVEJztcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tRGVoeWRyYXRlZEZyYWdtZW50KGRlaHlkcmF0ZWROb2RlKSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKERlaHlkcmF0ZWRGcmFnbWVudCwgbnVsbCwgbnVsbCwgTm9Nb2RlKTtcbiAgZmliZXIuc3RhdGVOb2RlID0gZGVoeWRyYXRlZE5vZGU7XG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVBvcnRhbChwb3J0YWwsIG1vZGUsIGxhbmVzKSB7XG4gIHZhciBwZW5kaW5nUHJvcHMgPSBwb3J0YWwuY2hpbGRyZW4gIT09IG51bGwgPyBwb3J0YWwuY2hpbGRyZW4gOiBbXTtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoSG9zdFBvcnRhbCwgcGVuZGluZ1Byb3BzLCBwb3J0YWwua2V5LCBtb2RlKTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgZmliZXIuc3RhdGVOb2RlID0ge1xuICAgIGNvbnRhaW5lckluZm86IHBvcnRhbC5jb250YWluZXJJbmZvLFxuICAgIHBlbmRpbmdDaGlsZHJlbjogbnVsbCxcbiAgICAvLyBVc2VkIGJ5IHBlcnNpc3RlbnQgdXBkYXRlc1xuICAgIGltcGxlbWVudGF0aW9uOiBwb3J0YWwuaW1wbGVtZW50YXRpb25cbiAgfTtcbiAgcmV0dXJuIGZpYmVyO1xufSAvLyBVc2VkIGZvciBzdGFzaGluZyBXSVAgcHJvcGVydGllcyB0byByZXBsYXkgZmFpbGVkIHdvcmsgaW4gREVWLlxuXG5mdW5jdGlvbiBhc3NpZ25GaWJlclByb3BlcnRpZXNJbkRFVih0YXJnZXQsIHNvdXJjZSkge1xuICBpZiAodGFyZ2V0ID09PSBudWxsKSB7XG4gICAgLy8gVGhpcyBGaWJlcidzIGluaXRpYWwgcHJvcGVydGllcyB3aWxsIGFsd2F5cyBiZSBvdmVyd3JpdHRlbi5cbiAgICAvLyBXZSBvbmx5IHVzZSBhIEZpYmVyIHRvIGVuc3VyZSB0aGUgc2FtZSBoaWRkZW4gY2xhc3Mgc28gREVWIGlzbid0IHNsb3cuXG4gICAgdGFyZ2V0ID0gY3JlYXRlRmliZXIoSW5kZXRlcm1pbmF0ZUNvbXBvbmVudCwgbnVsbCwgbnVsbCwgTm9Nb2RlKTtcbiAgfSAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgd3JpdHRlbiBhcyBhIGxpc3Qgb2YgYWxsIHByb3BlcnRpZXMuXG4gIC8vIFdlIHRyaWVkIHRvIHVzZSBPYmplY3QuYXNzaWduKCkgaW5zdGVhZCBidXQgdGhpcyBpcyBjYWxsZWQgaW5cbiAgLy8gdGhlIGhvdHRlc3QgcGF0aCwgYW5kIE9iamVjdC5hc3NpZ24oKSB3YXMgdG9vIHNsb3c6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTI1MDJcbiAgLy8gVGhpcyBjb2RlIGlzIERFVi1vbmx5IHNvIHNpemUgaXMgbm90IGEgY29uY2Vybi5cblxuXG4gIHRhcmdldC50YWcgPSBzb3VyY2UudGFnO1xuICB0YXJnZXQua2V5ID0gc291cmNlLmtleTtcbiAgdGFyZ2V0LmVsZW1lbnRUeXBlID0gc291cmNlLmVsZW1lbnRUeXBlO1xuICB0YXJnZXQudHlwZSA9IHNvdXJjZS50eXBlO1xuICB0YXJnZXQuc3RhdGVOb2RlID0gc291cmNlLnN0YXRlTm9kZTtcbiAgdGFyZ2V0LnJldHVybiA9IHNvdXJjZS5yZXR1cm47XG4gIHRhcmdldC5jaGlsZCA9IHNvdXJjZS5jaGlsZDtcbiAgdGFyZ2V0LnNpYmxpbmcgPSBzb3VyY2Uuc2libGluZztcbiAgdGFyZ2V0LmluZGV4ID0gc291cmNlLmluZGV4O1xuICB0YXJnZXQucmVmID0gc291cmNlLnJlZjtcbiAgdGFyZ2V0LnBlbmRpbmdQcm9wcyA9IHNvdXJjZS5wZW5kaW5nUHJvcHM7XG4gIHRhcmdldC5tZW1vaXplZFByb3BzID0gc291cmNlLm1lbW9pemVkUHJvcHM7XG4gIHRhcmdldC51cGRhdGVRdWV1ZSA9IHNvdXJjZS51cGRhdGVRdWV1ZTtcbiAgdGFyZ2V0Lm1lbW9pemVkU3RhdGUgPSBzb3VyY2UubWVtb2l6ZWRTdGF0ZTtcbiAgdGFyZ2V0LmRlcGVuZGVuY2llcyA9IHNvdXJjZS5kZXBlbmRlbmNpZXM7XG4gIHRhcmdldC5tb2RlID0gc291cmNlLm1vZGU7XG4gIHRhcmdldC5mbGFncyA9IHNvdXJjZS5mbGFncztcbiAgdGFyZ2V0LnN1YnRyZWVGbGFncyA9IHNvdXJjZS5zdWJ0cmVlRmxhZ3M7XG4gIHRhcmdldC5kZWxldGlvbnMgPSBzb3VyY2UuZGVsZXRpb25zO1xuICB0YXJnZXQubGFuZXMgPSBzb3VyY2UubGFuZXM7XG4gIHRhcmdldC5jaGlsZExhbmVzID0gc291cmNlLmNoaWxkTGFuZXM7XG4gIHRhcmdldC5hbHRlcm5hdGUgPSBzb3VyY2UuYWx0ZXJuYXRlO1xuXG4gIHtcbiAgICB0YXJnZXQuYWN0dWFsRHVyYXRpb24gPSBzb3VyY2UuYWN0dWFsRHVyYXRpb247XG4gICAgdGFyZ2V0LmFjdHVhbFN0YXJ0VGltZSA9IHNvdXJjZS5hY3R1YWxTdGFydFRpbWU7XG4gICAgdGFyZ2V0LnNlbGZCYXNlRHVyYXRpb24gPSBzb3VyY2Uuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICB0YXJnZXQudHJlZUJhc2VEdXJhdGlvbiA9IHNvdXJjZS50cmVlQmFzZUR1cmF0aW9uO1xuICB9XG5cbiAgdGFyZ2V0Ll9kZWJ1Z1NvdXJjZSA9IHNvdXJjZS5fZGVidWdTb3VyY2U7XG4gIHRhcmdldC5fZGVidWdPd25lciA9IHNvdXJjZS5fZGVidWdPd25lcjtcbiAgdGFyZ2V0Ll9kZWJ1Z05lZWRzUmVtb3VudCA9IHNvdXJjZS5fZGVidWdOZWVkc1JlbW91bnQ7XG4gIHRhcmdldC5fZGVidWdIb29rVHlwZXMgPSBzb3VyY2UuX2RlYnVnSG9va1R5cGVzO1xuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBGaWJlclJvb3ROb2RlKGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0ZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yKSB7XG4gIHRoaXMudGFnID0gdGFnO1xuICB0aGlzLmNvbnRhaW5lckluZm8gPSBjb250YWluZXJJbmZvO1xuICB0aGlzLnBlbmRpbmdDaGlsZHJlbiA9IG51bGw7XG4gIHRoaXMuY3VycmVudCA9IG51bGw7XG4gIHRoaXMucGluZ0NhY2hlID0gbnVsbDtcbiAgdGhpcy5maW5pc2hlZFdvcmsgPSBudWxsO1xuICB0aGlzLnRpbWVvdXRIYW5kbGUgPSBub1RpbWVvdXQ7XG4gIHRoaXMuY29udGV4dCA9IG51bGw7XG4gIHRoaXMucGVuZGluZ0NvbnRleHQgPSBudWxsO1xuICB0aGlzLmNhbGxiYWNrTm9kZSA9IG51bGw7XG4gIHRoaXMuY2FsbGJhY2tQcmlvcml0eSA9IE5vTGFuZTtcbiAgdGhpcy5ldmVudFRpbWVzID0gY3JlYXRlTGFuZU1hcChOb0xhbmVzKTtcbiAgdGhpcy5leHBpcmF0aW9uVGltZXMgPSBjcmVhdGVMYW5lTWFwKE5vVGltZXN0YW1wKTtcbiAgdGhpcy5wZW5kaW5nTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLnN1c3BlbmRlZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5waW5nZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHRoaXMuZXhwaXJlZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5tdXRhYmxlUmVhZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5maW5pc2hlZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5lbnRhbmdsZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHRoaXMuZW50YW5nbGVtZW50cyA9IGNyZWF0ZUxhbmVNYXAoTm9MYW5lcyk7XG4gIHRoaXMuaWRlbnRpZmllclByZWZpeCA9IGlkZW50aWZpZXJQcmVmaXg7XG4gIHRoaXMub25SZWNvdmVyYWJsZUVycm9yID0gb25SZWNvdmVyYWJsZUVycm9yO1xuXG4gIHtcbiAgICB0aGlzLm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGEgPSBudWxsO1xuICB9XG5cbiAge1xuICAgIHRoaXMuZWZmZWN0RHVyYXRpb24gPSAwO1xuICAgIHRoaXMucGFzc2l2ZUVmZmVjdER1cmF0aW9uID0gMDtcbiAgfVxuXG4gIHtcbiAgICB0aGlzLm1lbW9pemVkVXBkYXRlcnMgPSBuZXcgU2V0KCk7XG4gICAgdmFyIHBlbmRpbmdVcGRhdGVyc0xhbmVNYXAgPSB0aGlzLnBlbmRpbmdVcGRhdGVyc0xhbmVNYXAgPSBbXTtcblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBUb3RhbExhbmVzOyBfaSsrKSB7XG4gICAgICBwZW5kaW5nVXBkYXRlcnNMYW5lTWFwLnB1c2gobmV3IFNldCgpKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgQ29uY3VycmVudFJvb3Q6XG4gICAgICAgIHRoaXMuX2RlYnVnUm9vdFR5cGUgPSBoeWRyYXRlID8gJ2h5ZHJhdGVSb290KCknIDogJ2NyZWF0ZVJvb3QoKSc7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIExlZ2FjeVJvb3Q6XG4gICAgICAgIHRoaXMuX2RlYnVnUm9vdFR5cGUgPSBoeWRyYXRlID8gJ2h5ZHJhdGUoKScgOiAncmVuZGVyKCknO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlRmliZXJSb290KGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0ZSwgaW5pdGlhbENoaWxkcmVuLCBoeWRyYXRpb25DYWxsYmFja3MsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSwgLy8gVE9ETzogV2UgaGF2ZSBzZXZlcmFsIG9mIHRoZXNlIGFyZ3VtZW50cyB0aGF0IGFyZSBjb25jZXB0dWFsbHkgcGFydCBvZiB0aGVcbi8vIGhvc3QgY29uZmlnLCBidXQgYmVjYXVzZSB0aGV5IGFyZSBwYXNzZWQgaW4gYXQgcnVudGltZSwgd2UgaGF2ZSB0byB0aHJlYWRcbi8vIHRoZW0gdGhyb3VnaCB0aGUgcm9vdCBjb25zdHJ1Y3Rvci4gUGVyaGFwcyB3ZSBzaG91bGQgcHV0IHRoZW0gYWxsIGludG8gYVxuLy8gc2luZ2xlIHR5cGUsIGxpa2UgYSBEeW5hbWljSG9zdENvbmZpZyB0aGF0IGlzIGRlZmluZWQgYnkgdGhlIHJlbmRlcmVyLlxuaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yLCB0cmFuc2l0aW9uQ2FsbGJhY2tzKSB7XG4gIHZhciByb290ID0gbmV3IEZpYmVyUm9vdE5vZGUoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRlLCBpZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IpO1xuICAvLyBzdGF0ZU5vZGUgaXMgYW55LlxuXG5cbiAgdmFyIHVuaW5pdGlhbGl6ZWRGaWJlciA9IGNyZWF0ZUhvc3RSb290RmliZXIodGFnLCBpc1N0cmljdE1vZGUpO1xuICByb290LmN1cnJlbnQgPSB1bmluaXRpYWxpemVkRmliZXI7XG4gIHVuaW5pdGlhbGl6ZWRGaWJlci5zdGF0ZU5vZGUgPSByb290O1xuXG4gIHtcbiAgICB2YXIgX2luaXRpYWxTdGF0ZSA9IHtcbiAgICAgIGVsZW1lbnQ6IGluaXRpYWxDaGlsZHJlbixcbiAgICAgIGlzRGVoeWRyYXRlZDogaHlkcmF0ZSxcbiAgICAgIGNhY2hlOiBudWxsLFxuICAgICAgLy8gbm90IGVuYWJsZWQgeWV0XG4gICAgICB0cmFuc2l0aW9uczogbnVsbCxcbiAgICAgIHBlbmRpbmdTdXNwZW5zZUJvdW5kYXJpZXM6IG51bGxcbiAgICB9O1xuICAgIHVuaW5pdGlhbGl6ZWRGaWJlci5tZW1vaXplZFN0YXRlID0gX2luaXRpYWxTdGF0ZTtcbiAgfVxuXG4gIGluaXRpYWxpemVVcGRhdGVRdWV1ZSh1bmluaXRpYWxpemVkRmliZXIpO1xuICByZXR1cm4gcm9vdDtcbn1cblxudmFyIFJlYWN0VmVyc2lvbiA9ICcxOC4zLjEnO1xuXG5mdW5jdGlvbiBjcmVhdGVQb3J0YWwoY2hpbGRyZW4sIGNvbnRhaW5lckluZm8sIC8vIFRPRE86IGZpZ3VyZSBvdXQgdGhlIEFQSSBmb3IgY3Jvc3MtcmVuZGVyZXIgaW1wbGVtZW50YXRpb24uXG5pbXBsZW1lbnRhdGlvbikge1xuICB2YXIga2V5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBudWxsO1xuXG4gIHtcbiAgICBjaGVja0tleVN0cmluZ0NvZXJjaW9uKGtleSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC8vIFRoaXMgdGFnIGFsbG93IHVzIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMgYXMgYSBSZWFjdCBQb3J0YWxcbiAgICAkJHR5cGVvZjogUkVBQ1RfUE9SVEFMX1RZUEUsXG4gICAga2V5OiBrZXkgPT0gbnVsbCA/IG51bGwgOiAnJyArIGtleSxcbiAgICBjaGlsZHJlbjogY2hpbGRyZW4sXG4gICAgY29udGFpbmVySW5mbzogY29udGFpbmVySW5mbyxcbiAgICBpbXBsZW1lbnRhdGlvbjogaW1wbGVtZW50YXRpb25cbiAgfTtcbn1cblxudmFyIGRpZFdhcm5BYm91dE5lc3RlZFVwZGF0ZXM7XG52YXIgZGlkV2FybkFib3V0RmluZE5vZGVJblN0cmljdE1vZGU7XG5cbntcbiAgZGlkV2FybkFib3V0TmVzdGVkVXBkYXRlcyA9IGZhbHNlO1xuICBkaWRXYXJuQWJvdXRGaW5kTm9kZUluU3RyaWN0TW9kZSA9IHt9O1xufVxuXG5mdW5jdGlvbiBnZXRDb250ZXh0Rm9yU3VidHJlZShwYXJlbnRDb21wb25lbnQpIHtcbiAgaWYgKCFwYXJlbnRDb21wb25lbnQpIHtcbiAgICByZXR1cm4gZW1wdHlDb250ZXh0T2JqZWN0O1xuICB9XG5cbiAgdmFyIGZpYmVyID0gZ2V0KHBhcmVudENvbXBvbmVudCk7XG4gIHZhciBwYXJlbnRDb250ZXh0ID0gZmluZEN1cnJlbnRVbm1hc2tlZENvbnRleHQoZmliZXIpO1xuXG4gIGlmIChmaWJlci50YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgdmFyIENvbXBvbmVudCA9IGZpYmVyLnR5cGU7XG5cbiAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgcmV0dXJuIHByb2Nlc3NDaGlsZENvbnRleHQoZmliZXIsIENvbXBvbmVudCwgcGFyZW50Q29udGV4dCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBhcmVudENvbnRleHQ7XG59XG5cbmZ1bmN0aW9uIGZpbmRIb3N0SW5zdGFuY2VXaXRoV2FybmluZyhjb21wb25lbnQsIG1ldGhvZE5hbWUpIHtcbiAge1xuICAgIHZhciBmaWJlciA9IGdldChjb21wb25lbnQpO1xuXG4gICAgaWYgKGZpYmVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50LnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIG5vZGUgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoY29tcG9uZW50KS5qb2luKCcsJyk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFyZ3VtZW50IGFwcGVhcnMgdG8gbm90IGJlIGEgUmVhY3RDb21wb25lbnQuIEtleXM6IFwiICsga2V5cyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGhvc3RGaWJlciA9IGZpbmRDdXJyZW50SG9zdEZpYmVyKGZpYmVyKTtcblxuICAgIGlmIChob3N0RmliZXIgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChob3N0RmliZXIubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0RmluZE5vZGVJblN0cmljdE1vZGVbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZGlkV2FybkFib3V0RmluZE5vZGVJblN0cmljdE1vZGVbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgICB2YXIgcHJldmlvdXNGaWJlciA9IGN1cnJlbnQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzZXRDdXJyZW50RmliZXIoaG9zdEZpYmVyKTtcblxuICAgICAgICAgIGlmIChmaWJlci5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgICAgICAgZXJyb3IoJyVzIGlzIGRlcHJlY2F0ZWQgaW4gU3RyaWN0TW9kZS4gJyArICclcyB3YXMgcGFzc2VkIGFuIGluc3RhbmNlIG9mICVzIHdoaWNoIGlzIGluc2lkZSBTdHJpY3RNb2RlLiAnICsgJ0luc3RlYWQsIGFkZCBhIHJlZiBkaXJlY3RseSB0byB0aGUgZWxlbWVudCB5b3Ugd2FudCB0byByZWZlcmVuY2UuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1maW5kLW5vZGUnLCBtZXRob2ROYW1lLCBtZXRob2ROYW1lLCBjb21wb25lbnROYW1lKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXJyb3IoJyVzIGlzIGRlcHJlY2F0ZWQgaW4gU3RyaWN0TW9kZS4gJyArICclcyB3YXMgcGFzc2VkIGFuIGluc3RhbmNlIG9mICVzIHdoaWNoIHJlbmRlcnMgU3RyaWN0TW9kZSBjaGlsZHJlbi4gJyArICdJbnN0ZWFkLCBhZGQgYSByZWYgZGlyZWN0bHkgdG8gdGhlIGVsZW1lbnQgeW91IHdhbnQgdG8gcmVmZXJlbmNlLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtZmluZC1ub2RlJywgbWV0aG9kTmFtZSwgbWV0aG9kTmFtZSwgY29tcG9uZW50TmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIC8vIElkZWFsbHkgdGhpcyBzaG91bGQgcmVzZXQgdG8gcHJldmlvdXMgYnV0IHRoaXMgc2hvdWxkbid0IGJlIGNhbGxlZCBpblxuICAgICAgICAgIC8vIHJlbmRlciBhbmQgdGhlcmUncyBhbm90aGVyIHdhcm5pbmcgZm9yIHRoYXQgYW55d2F5LlxuICAgICAgICAgIGlmIChwcmV2aW91c0ZpYmVyKSB7XG4gICAgICAgICAgICBzZXRDdXJyZW50RmliZXIocHJldmlvdXNGaWJlcik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGhvc3RGaWJlci5zdGF0ZU5vZGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29udGFpbmVyKGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0aW9uQ2FsbGJhY2tzLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvciwgdHJhbnNpdGlvbkNhbGxiYWNrcykge1xuICB2YXIgaHlkcmF0ZSA9IGZhbHNlO1xuICB2YXIgaW5pdGlhbENoaWxkcmVuID0gbnVsbDtcbiAgcmV0dXJuIGNyZWF0ZUZpYmVyUm9vdChjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGUsIGluaXRpYWxDaGlsZHJlbiwgaHlkcmF0aW9uQ2FsbGJhY2tzLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvcik7XG59XG5mdW5jdGlvbiBjcmVhdGVIeWRyYXRpb25Db250YWluZXIoaW5pdGlhbENoaWxkcmVuLCAvLyBUT0RPOiBSZW1vdmUgYGNhbGxiYWNrYCB3aGVuIHdlIGRlbGV0ZSBsZWdhY3kgbW9kZS5cbmNhbGxiYWNrLCBjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGlvbkNhbGxiYWNrcywgaXNTdHJpY3RNb2RlLCBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLCBpZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IsIHRyYW5zaXRpb25DYWxsYmFja3MpIHtcbiAgdmFyIGh5ZHJhdGUgPSB0cnVlO1xuICB2YXIgcm9vdCA9IGNyZWF0ZUZpYmVyUm9vdChjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGUsIGluaXRpYWxDaGlsZHJlbiwgaHlkcmF0aW9uQ2FsbGJhY2tzLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvcik7IC8vIFRPRE86IE1vdmUgdGhpcyB0byBGaWJlclJvb3QgY29uc3RydWN0b3JcblxuICByb290LmNvbnRleHQgPSBnZXRDb250ZXh0Rm9yU3VidHJlZShudWxsKTsgLy8gU2NoZWR1bGUgdGhlIGluaXRpYWwgcmVuZGVyLiBJbiBhIGh5ZHJhdGlvbiByb290LCB0aGlzIGlzIGRpZmZlcmVudCBmcm9tXG4gIC8vIGEgcmVndWxhciB1cGRhdGUgYmVjYXVzZSB0aGUgaW5pdGlhbCByZW5kZXIgbXVzdCBtYXRjaCB3YXMgd2FzIHJlbmRlcmVkXG4gIC8vIG9uIHRoZSBzZXJ2ZXIuXG4gIC8vIE5PVEU6IFRoaXMgdXBkYXRlIGludGVudGlvbmFsbHkgZG9lc24ndCBoYXZlIGEgcGF5bG9hZC4gV2UncmUgb25seSB1c2luZ1xuICAvLyB0aGUgdXBkYXRlIHRvIHNjaGVkdWxlIHdvcmsgb24gdGhlIHJvb3QgZmliZXIgKGFuZCwgZm9yIGxlZ2FjeSByb290cywgdG9cbiAgLy8gZW5xdWV1ZSB0aGUgY2FsbGJhY2sgaWYgb25lIGlzIHByb3ZpZGVkKS5cblxuICB2YXIgY3VycmVudCA9IHJvb3QuY3VycmVudDtcbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShjdXJyZW50KTtcbiAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpO1xuICB1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjayAhPT0gdW5kZWZpbmVkICYmIGNhbGxiYWNrICE9PSBudWxsID8gY2FsbGJhY2sgOiBudWxsO1xuICBlbnF1ZXVlVXBkYXRlKGN1cnJlbnQsIHVwZGF0ZSwgbGFuZSk7XG4gIHNjaGVkdWxlSW5pdGlhbEh5ZHJhdGlvbk9uUm9vdChyb290LCBsYW5lLCBldmVudFRpbWUpO1xuICByZXR1cm4gcm9vdDtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUNvbnRhaW5lcihlbGVtZW50LCBjb250YWluZXIsIHBhcmVudENvbXBvbmVudCwgY2FsbGJhY2spIHtcbiAge1xuICAgIG9uU2NoZWR1bGVSb290KGNvbnRhaW5lciwgZWxlbWVudCk7XG4gIH1cblxuICB2YXIgY3VycmVudCQxID0gY29udGFpbmVyLmN1cnJlbnQ7XG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoY3VycmVudCQxKTtcblxuICB7XG4gICAgbWFya1JlbmRlclNjaGVkdWxlZChsYW5lKTtcbiAgfVxuXG4gIHZhciBjb250ZXh0ID0gZ2V0Q29udGV4dEZvclN1YnRyZWUocGFyZW50Q29tcG9uZW50KTtcblxuICBpZiAoY29udGFpbmVyLmNvbnRleHQgPT09IG51bGwpIHtcbiAgICBjb250YWluZXIuY29udGV4dCA9IGNvbnRleHQ7XG4gIH0gZWxzZSB7XG4gICAgY29udGFpbmVyLnBlbmRpbmdDb250ZXh0ID0gY29udGV4dDtcbiAgfVxuXG4gIHtcbiAgICBpZiAoaXNSZW5kZXJpbmcgJiYgY3VycmVudCAhPT0gbnVsbCAmJiAhZGlkV2FybkFib3V0TmVzdGVkVXBkYXRlcykge1xuICAgICAgZGlkV2FybkFib3V0TmVzdGVkVXBkYXRlcyA9IHRydWU7XG5cbiAgICAgIGVycm9yKCdSZW5kZXIgbWV0aG9kcyBzaG91bGQgYmUgYSBwdXJlIGZ1bmN0aW9uIG9mIHByb3BzIGFuZCBzdGF0ZTsgJyArICd0cmlnZ2VyaW5nIG5lc3RlZCBjb21wb25lbnQgdXBkYXRlcyBmcm9tIHJlbmRlciBpcyBub3QgYWxsb3dlZC4gJyArICdJZiBuZWNlc3NhcnksIHRyaWdnZXIgbmVzdGVkIHVwZGF0ZXMgaW4gY29tcG9uZW50RGlkVXBkYXRlLlxcblxcbicgKyAnQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgJXMuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihjdXJyZW50KSB8fCAnVW5rbm93bicpO1xuICAgIH1cbiAgfVxuXG4gIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKTsgLy8gQ2F1dGlvbjogUmVhY3QgRGV2VG9vbHMgY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcm9wZXJ0eVxuICAvLyBiZWluZyBjYWxsZWQgXCJlbGVtZW50XCIuXG5cbiAgdXBkYXRlLnBheWxvYWQgPSB7XG4gICAgZWxlbWVudDogZWxlbWVudFxuICB9O1xuICBjYWxsYmFjayA9IGNhbGxiYWNrID09PSB1bmRlZmluZWQgPyBudWxsIDogY2FsbGJhY2s7XG5cbiAgaWYgKGNhbGxiYWNrICE9PSBudWxsKSB7XG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBlcnJvcigncmVuZGVyKC4uLik6IEV4cGVjdGVkIHRoZSBsYXN0IG9wdGlvbmFsIGBjYWxsYmFja2AgYXJndW1lbnQgdG8gYmUgYSAnICsgJ2Z1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gIH1cblxuICB2YXIgcm9vdCA9IGVucXVldWVVcGRhdGUoY3VycmVudCQxLCB1cGRhdGUsIGxhbmUpO1xuXG4gIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGN1cnJlbnQkMSwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgICBlbnRhbmdsZVRyYW5zaXRpb25zKHJvb3QsIGN1cnJlbnQkMSwgbGFuZSk7XG4gIH1cblxuICByZXR1cm4gbGFuZTtcbn1cbmZ1bmN0aW9uIGdldFB1YmxpY1Jvb3RJbnN0YW5jZShjb250YWluZXIpIHtcbiAgdmFyIGNvbnRhaW5lckZpYmVyID0gY29udGFpbmVyLmN1cnJlbnQ7XG5cbiAgaWYgKCFjb250YWluZXJGaWJlci5jaGlsZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc3dpdGNoIChjb250YWluZXJGaWJlci5jaGlsZC50YWcpIHtcbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICByZXR1cm4gZ2V0UHVibGljSW5zdGFuY2UoY29udGFpbmVyRmliZXIuY2hpbGQuc3RhdGVOb2RlKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gY29udGFpbmVyRmliZXIuY2hpbGQuc3RhdGVOb2RlO1xuICB9XG59XG5mdW5jdGlvbiBhdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24kMShmaWJlcikge1xuICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHZhciByb290ID0gZmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmIChpc1Jvb3REZWh5ZHJhdGVkKHJvb3QpKSB7XG4gICAgICAgICAgLy8gRmx1c2ggdGhlIGZpcnN0IHNjaGVkdWxlZCBcInVwZGF0ZVwiLlxuICAgICAgICAgIHZhciBsYW5lcyA9IGdldEhpZ2hlc3RQcmlvcml0eVBlbmRpbmdMYW5lcyhyb290KTtcbiAgICAgICAgICBmbHVzaFJvb3Qocm9vdCwgbGFuZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgICAgICAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICAgICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIGV2ZW50VGltZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTsgLy8gSWYgd2UncmUgc3RpbGwgYmxvY2tlZCBhZnRlciB0aGlzLCB3ZSBuZWVkIHRvIGluY3JlYXNlXG4gICAgICAgIC8vIHRoZSBwcmlvcml0eSBvZiBhbnkgcHJvbWlzZXMgcmVzb2x2aW5nIHdpdGhpbiB0aGlzXG4gICAgICAgIC8vIGJvdW5kYXJ5IHNvIHRoYXQgdGhleSBuZXh0IGF0dGVtcHQgYWxzbyBoYXMgaGlnaGVyIHByaS5cblxuICAgICAgICB2YXIgcmV0cnlMYW5lID0gU3luY0xhbmU7XG4gICAgICAgIG1hcmtSZXRyeUxhbmVJZk5vdEh5ZHJhdGVkKGZpYmVyLCByZXRyeUxhbmUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtYXJrUmV0cnlMYW5lSW1wbChmaWJlciwgcmV0cnlMYW5lKSB7XG4gIHZhciBzdXNwZW5zZVN0YXRlID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAoc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCAmJiBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZSA9IGhpZ2hlclByaW9yaXR5TGFuZShzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZSwgcmV0cnlMYW5lKTtcbiAgfVxufSAvLyBJbmNyZWFzZXMgdGhlIHByaW9yaXR5IG9mIHRoZW5hYmxlcyB3aGVuIHRoZXkgcmVzb2x2ZSB3aXRoaW4gdGhpcyBib3VuZGFyeS5cblxuXG5mdW5jdGlvbiBtYXJrUmV0cnlMYW5lSWZOb3RIeWRyYXRlZChmaWJlciwgcmV0cnlMYW5lKSB7XG4gIG1hcmtSZXRyeUxhbmVJbXBsKGZpYmVyLCByZXRyeUxhbmUpO1xuICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gIGlmIChhbHRlcm5hdGUpIHtcbiAgICBtYXJrUmV0cnlMYW5lSW1wbChhbHRlcm5hdGUsIHJldHJ5TGFuZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uJDEoZmliZXIpIHtcbiAgaWYgKGZpYmVyLnRhZyAhPT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICAvLyBXZSBpZ25vcmUgSG9zdFJvb3RzIGhlcmUgYmVjYXVzZSB3ZSBjYW4ndCBpbmNyZWFzZVxuICAgIC8vIHRoZWlyIHByaW9yaXR5IGFuZCB0aGV5IHNob3VsZCBub3Qgc3VzcGVuZCBvbiBJL08sXG4gICAgLy8gc2luY2UgeW91IGhhdmUgdG8gd3JhcCBhbnl0aGluZyB0aGF0IG1pZ2h0IHN1c3BlbmQgaW5cbiAgICAvLyBTdXNwZW5zZS5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgbGFuZSA9IFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmU7XG4gIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBsYW5lKTtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBsYW5lLCBldmVudFRpbWUpO1xuICB9XG5cbiAgbWFya1JldHJ5TGFuZUlmTm90SHlkcmF0ZWQoZmliZXIsIGxhbmUpO1xufVxuZnVuY3Rpb24gYXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5JDEoZmliZXIpIHtcbiAgaWYgKGZpYmVyLnRhZyAhPT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICAvLyBXZSBpZ25vcmUgSG9zdFJvb3RzIGhlcmUgYmVjYXVzZSB3ZSBjYW4ndCBpbmNyZWFzZVxuICAgIC8vIHRoZWlyIHByaW9yaXR5IG90aGVyIHRoYW4gc3luY2hyb25vdXNseSBmbHVzaCBpdC5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIGxhbmUpO1xuXG4gIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gIH1cblxuICBtYXJrUmV0cnlMYW5lSWZOb3RIeWRyYXRlZChmaWJlciwgbGFuZSk7XG59XG5mdW5jdGlvbiBmaW5kSG9zdEluc3RhbmNlV2l0aE5vUG9ydGFscyhmaWJlcikge1xuICB2YXIgaG9zdEZpYmVyID0gZmluZEN1cnJlbnRIb3N0RmliZXJXaXRoTm9Qb3J0YWxzKGZpYmVyKTtcblxuICBpZiAoaG9zdEZpYmVyID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gaG9zdEZpYmVyLnN0YXRlTm9kZTtcbn1cblxudmFyIHNob3VsZEVycm9ySW1wbCA9IGZ1bmN0aW9uIChmaWJlcikge1xuICByZXR1cm4gbnVsbDtcbn07XG5cbmZ1bmN0aW9uIHNob3VsZEVycm9yKGZpYmVyKSB7XG4gIHJldHVybiBzaG91bGRFcnJvckltcGwoZmliZXIpO1xufVxuXG52YXIgc2hvdWxkU3VzcGVuZEltcGwgPSBmdW5jdGlvbiAoZmliZXIpIHtcbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuZnVuY3Rpb24gc2hvdWxkU3VzcGVuZChmaWJlcikge1xuICByZXR1cm4gc2hvdWxkU3VzcGVuZEltcGwoZmliZXIpO1xufVxudmFyIG92ZXJyaWRlSG9va1N0YXRlID0gbnVsbDtcbnZhciBvdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGggPSBudWxsO1xudmFyIG92ZXJyaWRlSG9va1N0YXRlUmVuYW1lUGF0aCA9IG51bGw7XG52YXIgb3ZlcnJpZGVQcm9wcyA9IG51bGw7XG52YXIgb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGggPSBudWxsO1xudmFyIG92ZXJyaWRlUHJvcHNSZW5hbWVQYXRoID0gbnVsbDtcbnZhciBzY2hlZHVsZVVwZGF0ZSA9IG51bGw7XG52YXIgc2V0RXJyb3JIYW5kbGVyID0gbnVsbDtcbnZhciBzZXRTdXNwZW5zZUhhbmRsZXIgPSBudWxsO1xuXG57XG4gIHZhciBjb3B5V2l0aERlbGV0ZUltcGwgPSBmdW5jdGlvbiAob2JqLCBwYXRoLCBpbmRleCkge1xuICAgIHZhciBrZXkgPSBwYXRoW2luZGV4XTtcbiAgICB2YXIgdXBkYXRlZCA9IGlzQXJyYXkob2JqKSA/IG9iai5zbGljZSgpIDogYXNzaWduKHt9LCBvYmopO1xuXG4gICAgaWYgKGluZGV4ICsgMSA9PT0gcGF0aC5sZW5ndGgpIHtcbiAgICAgIGlmIChpc0FycmF5KHVwZGF0ZWQpKSB7XG4gICAgICAgIHVwZGF0ZWQuc3BsaWNlKGtleSwgMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgdXBkYXRlZFtrZXldO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICB9IC8vICRGbG93Rml4TWUgbnVtYmVyIG9yIHN0cmluZyBpcyBmaW5lIGhlcmVcblxuXG4gICAgdXBkYXRlZFtrZXldID0gY29weVdpdGhEZWxldGVJbXBsKG9ialtrZXldLCBwYXRoLCBpbmRleCArIDEpO1xuICAgIHJldHVybiB1cGRhdGVkO1xuICB9O1xuXG4gIHZhciBjb3B5V2l0aERlbGV0ZSA9IGZ1bmN0aW9uIChvYmosIHBhdGgpIHtcbiAgICByZXR1cm4gY29weVdpdGhEZWxldGVJbXBsKG9iaiwgcGF0aCwgMCk7XG4gIH07XG5cbiAgdmFyIGNvcHlXaXRoUmVuYW1lSW1wbCA9IGZ1bmN0aW9uIChvYmosIG9sZFBhdGgsIG5ld1BhdGgsIGluZGV4KSB7XG4gICAgdmFyIG9sZEtleSA9IG9sZFBhdGhbaW5kZXhdO1xuICAgIHZhciB1cGRhdGVkID0gaXNBcnJheShvYmopID8gb2JqLnNsaWNlKCkgOiBhc3NpZ24oe30sIG9iaik7XG5cbiAgICBpZiAoaW5kZXggKyAxID09PSBvbGRQYXRoLmxlbmd0aCkge1xuICAgICAgdmFyIG5ld0tleSA9IG5ld1BhdGhbaW5kZXhdOyAvLyAkRmxvd0ZpeE1lIG51bWJlciBvciBzdHJpbmcgaXMgZmluZSBoZXJlXG5cbiAgICAgIHVwZGF0ZWRbbmV3S2V5XSA9IHVwZGF0ZWRbb2xkS2V5XTtcblxuICAgICAgaWYgKGlzQXJyYXkodXBkYXRlZCkpIHtcbiAgICAgICAgdXBkYXRlZC5zcGxpY2Uob2xkS2V5LCAxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSB1cGRhdGVkW29sZEtleV07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vICRGbG93Rml4TWUgbnVtYmVyIG9yIHN0cmluZyBpcyBmaW5lIGhlcmVcbiAgICAgIHVwZGF0ZWRbb2xkS2V5XSA9IGNvcHlXaXRoUmVuYW1lSW1wbCggLy8gJEZsb3dGaXhNZSBudW1iZXIgb3Igc3RyaW5nIGlzIGZpbmUgaGVyZVxuICAgICAgb2JqW29sZEtleV0sIG9sZFBhdGgsIG5ld1BhdGgsIGluZGV4ICsgMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZWQ7XG4gIH07XG5cbiAgdmFyIGNvcHlXaXRoUmVuYW1lID0gZnVuY3Rpb24gKG9iaiwgb2xkUGF0aCwgbmV3UGF0aCkge1xuICAgIGlmIChvbGRQYXRoLmxlbmd0aCAhPT0gbmV3UGF0aC5sZW5ndGgpIHtcbiAgICAgIHdhcm4oJ2NvcHlXaXRoUmVuYW1lKCkgZXhwZWN0cyBwYXRocyBvZiB0aGUgc2FtZSBsZW5ndGgnKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5ld1BhdGgubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGlmIChvbGRQYXRoW2ldICE9PSBuZXdQYXRoW2ldKSB7XG4gICAgICAgICAgd2FybignY29weVdpdGhSZW5hbWUoKSBleHBlY3RzIHBhdGhzIHRvIGJlIHRoZSBzYW1lIGV4Y2VwdCBmb3IgdGhlIGRlZXBlc3Qga2V5Jyk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29weVdpdGhSZW5hbWVJbXBsKG9iaiwgb2xkUGF0aCwgbmV3UGF0aCwgMCk7XG4gIH07XG5cbiAgdmFyIGNvcHlXaXRoU2V0SW1wbCA9IGZ1bmN0aW9uIChvYmosIHBhdGgsIGluZGV4LCB2YWx1ZSkge1xuICAgIGlmIChpbmRleCA+PSBwYXRoLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHZhciBrZXkgPSBwYXRoW2luZGV4XTtcbiAgICB2YXIgdXBkYXRlZCA9IGlzQXJyYXkob2JqKSA/IG9iai5zbGljZSgpIDogYXNzaWduKHt9LCBvYmopOyAvLyAkRmxvd0ZpeE1lIG51bWJlciBvciBzdHJpbmcgaXMgZmluZSBoZXJlXG5cbiAgICB1cGRhdGVkW2tleV0gPSBjb3B5V2l0aFNldEltcGwob2JqW2tleV0sIHBhdGgsIGluZGV4ICsgMSwgdmFsdWUpO1xuICAgIHJldHVybiB1cGRhdGVkO1xuICB9O1xuXG4gIHZhciBjb3B5V2l0aFNldCA9IGZ1bmN0aW9uIChvYmosIHBhdGgsIHZhbHVlKSB7XG4gICAgcmV0dXJuIGNvcHlXaXRoU2V0SW1wbChvYmosIHBhdGgsIDAsIHZhbHVlKTtcbiAgfTtcblxuICB2YXIgZmluZEhvb2sgPSBmdW5jdGlvbiAoZmliZXIsIGlkKSB7XG4gICAgLy8gRm9yIG5vdywgdGhlIFwiaWRcIiBvZiBzdGF0ZWZ1bCBob29rcyBpcyBqdXN0IHRoZSBzdGF0ZWZ1bCBob29rIGluZGV4LlxuICAgIC8vIFRoaXMgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlIHdpdGggZS5nLiBuZXN0ZWQgaG9va3MuXG4gICAgdmFyIGN1cnJlbnRIb29rID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcblxuICAgIHdoaWxlIChjdXJyZW50SG9vayAhPT0gbnVsbCAmJiBpZCA+IDApIHtcbiAgICAgIGN1cnJlbnRIb29rID0gY3VycmVudEhvb2submV4dDtcbiAgICAgIGlkLS07XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnRIb29rO1xuICB9OyAvLyBTdXBwb3J0IERldlRvb2xzIGVkaXRhYmxlIHZhbHVlcyBmb3IgdXNlU3RhdGUgYW5kIHVzZVJlZHVjZXIuXG5cblxuICBvdmVycmlkZUhvb2tTdGF0ZSA9IGZ1bmN0aW9uIChmaWJlciwgaWQsIHBhdGgsIHZhbHVlKSB7XG4gICAgdmFyIGhvb2sgPSBmaW5kSG9vayhmaWJlciwgaWQpO1xuXG4gICAgaWYgKGhvb2sgIT09IG51bGwpIHtcbiAgICAgIHZhciBuZXdTdGF0ZSA9IGNvcHlXaXRoU2V0KGhvb2subWVtb2l6ZWRTdGF0ZSwgcGF0aCwgdmFsdWUpO1xuICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gICAgICBob29rLmJhc2VTdGF0ZSA9IG5ld1N0YXRlOyAvLyBXZSBhcmVuJ3QgYWN0dWFsbHkgYWRkaW5nIGFuIHVwZGF0ZSB0byB0aGUgcXVldWUsXG4gICAgICAvLyBiZWNhdXNlIHRoZXJlIGlzIG5vIHVwZGF0ZSB3ZSBjYW4gYWRkIGZvciB1c2VSZWR1Y2VyIGhvb2tzIHRoYXQgd29uJ3QgdHJpZ2dlciBhbiBlcnJvci5cbiAgICAgIC8vIChUaGVyZSdzIG5vIGFwcHJvcHJpYXRlIGFjdGlvbiB0eXBlIGZvciBEZXZUb29scyBvdmVycmlkZXMuKVxuICAgICAgLy8gQXMgYSByZXN1bHQgdGhvdWdoLCBSZWFjdCB3aWxsIHNlZSB0aGUgc2NoZWR1bGVkIHVwZGF0ZSBhcyBhIG5vb3AgYW5kIGJhaWxvdXQuXG4gICAgICAvLyBTaGFsbG93IGNsb25pbmcgcHJvcHMgd29ya3MgYXMgYSB3b3JrYXJvdW5kIGZvciBub3cgdG8gYnlwYXNzIHRoZSBiYWlsb3V0IGNoZWNrLlxuXG4gICAgICBmaWJlci5tZW1vaXplZFByb3BzID0gYXNzaWduKHt9LCBmaWJlci5tZW1vaXplZFByb3BzKTtcbiAgICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoID0gZnVuY3Rpb24gKGZpYmVyLCBpZCwgcGF0aCkge1xuICAgIHZhciBob29rID0gZmluZEhvb2soZmliZXIsIGlkKTtcblxuICAgIGlmIChob29rICE9PSBudWxsKSB7XG4gICAgICB2YXIgbmV3U3RhdGUgPSBjb3B5V2l0aERlbGV0ZShob29rLm1lbW9pemVkU3RhdGUsIHBhdGgpO1xuICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gICAgICBob29rLmJhc2VTdGF0ZSA9IG5ld1N0YXRlOyAvLyBXZSBhcmVuJ3QgYWN0dWFsbHkgYWRkaW5nIGFuIHVwZGF0ZSB0byB0aGUgcXVldWUsXG4gICAgICAvLyBiZWNhdXNlIHRoZXJlIGlzIG5vIHVwZGF0ZSB3ZSBjYW4gYWRkIGZvciB1c2VSZWR1Y2VyIGhvb2tzIHRoYXQgd29uJ3QgdHJpZ2dlciBhbiBlcnJvci5cbiAgICAgIC8vIChUaGVyZSdzIG5vIGFwcHJvcHJpYXRlIGFjdGlvbiB0eXBlIGZvciBEZXZUb29scyBvdmVycmlkZXMuKVxuICAgICAgLy8gQXMgYSByZXN1bHQgdGhvdWdoLCBSZWFjdCB3aWxsIHNlZSB0aGUgc2NoZWR1bGVkIHVwZGF0ZSBhcyBhIG5vb3AgYW5kIGJhaWxvdXQuXG4gICAgICAvLyBTaGFsbG93IGNsb25pbmcgcHJvcHMgd29ya3MgYXMgYSB3b3JrYXJvdW5kIGZvciBub3cgdG8gYnlwYXNzIHRoZSBiYWlsb3V0IGNoZWNrLlxuXG4gICAgICBmaWJlci5tZW1vaXplZFByb3BzID0gYXNzaWduKHt9LCBmaWJlci5tZW1vaXplZFByb3BzKTtcbiAgICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoID0gZnVuY3Rpb24gKGZpYmVyLCBpZCwgb2xkUGF0aCwgbmV3UGF0aCkge1xuICAgIHZhciBob29rID0gZmluZEhvb2soZmliZXIsIGlkKTtcblxuICAgIGlmIChob29rICE9PSBudWxsKSB7XG4gICAgICB2YXIgbmV3U3RhdGUgPSBjb3B5V2l0aFJlbmFtZShob29rLm1lbW9pemVkU3RhdGUsIG9sZFBhdGgsIG5ld1BhdGgpO1xuICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gICAgICBob29rLmJhc2VTdGF0ZSA9IG5ld1N0YXRlOyAvLyBXZSBhcmVuJ3QgYWN0dWFsbHkgYWRkaW5nIGFuIHVwZGF0ZSB0byB0aGUgcXVldWUsXG4gICAgICAvLyBiZWNhdXNlIHRoZXJlIGlzIG5vIHVwZGF0ZSB3ZSBjYW4gYWRkIGZvciB1c2VSZWR1Y2VyIGhvb2tzIHRoYXQgd29uJ3QgdHJpZ2dlciBhbiBlcnJvci5cbiAgICAgIC8vIChUaGVyZSdzIG5vIGFwcHJvcHJpYXRlIGFjdGlvbiB0eXBlIGZvciBEZXZUb29scyBvdmVycmlkZXMuKVxuICAgICAgLy8gQXMgYSByZXN1bHQgdGhvdWdoLCBSZWFjdCB3aWxsIHNlZSB0aGUgc2NoZWR1bGVkIHVwZGF0ZSBhcyBhIG5vb3AgYW5kIGJhaWxvdXQuXG4gICAgICAvLyBTaGFsbG93IGNsb25pbmcgcHJvcHMgd29ya3MgYXMgYSB3b3JrYXJvdW5kIGZvciBub3cgdG8gYnlwYXNzIHRoZSBiYWlsb3V0IGNoZWNrLlxuXG4gICAgICBmaWJlci5tZW1vaXplZFByb3BzID0gYXNzaWduKHt9LCBmaWJlci5tZW1vaXplZFByb3BzKTtcbiAgICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICAgIH1cbiAgICB9XG4gIH07IC8vIFN1cHBvcnQgRGV2VG9vbHMgcHJvcHMgZm9yIGZ1bmN0aW9uIGNvbXBvbmVudHMsIGZvcndhcmRSZWYsIG1lbW8sIGhvc3QgY29tcG9uZW50cywgZXRjLlxuXG5cbiAgb3ZlcnJpZGVQcm9wcyA9IGZ1bmN0aW9uIChmaWJlciwgcGF0aCwgdmFsdWUpIHtcbiAgICBmaWJlci5wZW5kaW5nUHJvcHMgPSBjb3B5V2l0aFNldChmaWJlci5tZW1vaXplZFByb3BzLCBwYXRoLCB2YWx1ZSk7XG5cbiAgICBpZiAoZmliZXIuYWx0ZXJuYXRlKSB7XG4gICAgICBmaWJlci5hbHRlcm5hdGUucGVuZGluZ1Byb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgIH1cblxuICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgIH1cbiAgfTtcblxuICBvdmVycmlkZVByb3BzRGVsZXRlUGF0aCA9IGZ1bmN0aW9uIChmaWJlciwgcGF0aCkge1xuICAgIGZpYmVyLnBlbmRpbmdQcm9wcyA9IGNvcHlXaXRoRGVsZXRlKGZpYmVyLm1lbW9pemVkUHJvcHMsIHBhdGgpO1xuXG4gICAgaWYgKGZpYmVyLmFsdGVybmF0ZSkge1xuICAgICAgZmliZXIuYWx0ZXJuYXRlLnBlbmRpbmdQcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICB9XG5cbiAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICB9XG4gIH07XG5cbiAgb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGggPSBmdW5jdGlvbiAoZmliZXIsIG9sZFBhdGgsIG5ld1BhdGgpIHtcbiAgICBmaWJlci5wZW5kaW5nUHJvcHMgPSBjb3B5V2l0aFJlbmFtZShmaWJlci5tZW1vaXplZFByb3BzLCBvbGRQYXRoLCBuZXdQYXRoKTtcblxuICAgIGlmIChmaWJlci5hbHRlcm5hdGUpIHtcbiAgICAgIGZpYmVyLmFsdGVybmF0ZS5wZW5kaW5nUHJvcHMgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgfVxuXG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgfVxuICB9O1xuXG4gIHNjaGVkdWxlVXBkYXRlID0gZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgfVxuICB9O1xuXG4gIHNldEVycm9ySGFuZGxlciA9IGZ1bmN0aW9uIChuZXdTaG91bGRFcnJvckltcGwpIHtcbiAgICBzaG91bGRFcnJvckltcGwgPSBuZXdTaG91bGRFcnJvckltcGw7XG4gIH07XG5cbiAgc2V0U3VzcGVuc2VIYW5kbGVyID0gZnVuY3Rpb24gKG5ld1Nob3VsZFN1c3BlbmRJbXBsKSB7XG4gICAgc2hvdWxkU3VzcGVuZEltcGwgPSBuZXdTaG91bGRTdXNwZW5kSW1wbDtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZmluZEhvc3RJbnN0YW5jZUJ5RmliZXIoZmliZXIpIHtcbiAgdmFyIGhvc3RGaWJlciA9IGZpbmRDdXJyZW50SG9zdEZpYmVyKGZpYmVyKTtcblxuICBpZiAoaG9zdEZpYmVyID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gaG9zdEZpYmVyLnN0YXRlTm9kZTtcbn1cblxuZnVuY3Rpb24gZW1wdHlGaW5kRmliZXJCeUhvc3RJbnN0YW5jZShpbnN0YW5jZSkge1xuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0Q3VycmVudEZpYmVyRm9yRGV2VG9vbHMoKSB7XG4gIHJldHVybiBjdXJyZW50O1xufVxuXG5mdW5jdGlvbiBpbmplY3RJbnRvRGV2VG9vbHMoZGV2VG9vbHNDb25maWcpIHtcbiAgdmFyIGZpbmRGaWJlckJ5SG9zdEluc3RhbmNlID0gZGV2VG9vbHNDb25maWcuZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U7XG4gIHZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjtcbiAgcmV0dXJuIGluamVjdEludGVybmFscyh7XG4gICAgYnVuZGxlVHlwZTogZGV2VG9vbHNDb25maWcuYnVuZGxlVHlwZSxcbiAgICB2ZXJzaW9uOiBkZXZUb29sc0NvbmZpZy52ZXJzaW9uLFxuICAgIHJlbmRlcmVyUGFja2FnZU5hbWU6IGRldlRvb2xzQ29uZmlnLnJlbmRlcmVyUGFja2FnZU5hbWUsXG4gICAgcmVuZGVyZXJDb25maWc6IGRldlRvb2xzQ29uZmlnLnJlbmRlcmVyQ29uZmlnLFxuICAgIG92ZXJyaWRlSG9va1N0YXRlOiBvdmVycmlkZUhvb2tTdGF0ZSxcbiAgICBvdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGg6IG92ZXJyaWRlSG9va1N0YXRlRGVsZXRlUGF0aCxcbiAgICBvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGg6IG92ZXJyaWRlSG9va1N0YXRlUmVuYW1lUGF0aCxcbiAgICBvdmVycmlkZVByb3BzOiBvdmVycmlkZVByb3BzLFxuICAgIG92ZXJyaWRlUHJvcHNEZWxldGVQYXRoOiBvdmVycmlkZVByb3BzRGVsZXRlUGF0aCxcbiAgICBvdmVycmlkZVByb3BzUmVuYW1lUGF0aDogb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGgsXG4gICAgc2V0RXJyb3JIYW5kbGVyOiBzZXRFcnJvckhhbmRsZXIsXG4gICAgc2V0U3VzcGVuc2VIYW5kbGVyOiBzZXRTdXNwZW5zZUhhbmRsZXIsXG4gICAgc2NoZWR1bGVVcGRhdGU6IHNjaGVkdWxlVXBkYXRlLFxuICAgIGN1cnJlbnREaXNwYXRjaGVyUmVmOiBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLFxuICAgIGZpbmRIb3N0SW5zdGFuY2VCeUZpYmVyOiBmaW5kSG9zdEluc3RhbmNlQnlGaWJlcixcbiAgICBmaW5kRmliZXJCeUhvc3RJbnN0YW5jZTogZmluZEZpYmVyQnlIb3N0SW5zdGFuY2UgfHwgZW1wdHlGaW5kRmliZXJCeUhvc3RJbnN0YW5jZSxcbiAgICAvLyBSZWFjdCBSZWZyZXNoXG4gICAgZmluZEhvc3RJbnN0YW5jZXNGb3JSZWZyZXNoOiAgZmluZEhvc3RJbnN0YW5jZXNGb3JSZWZyZXNoICxcbiAgICBzY2hlZHVsZVJlZnJlc2g6ICBzY2hlZHVsZVJlZnJlc2ggLFxuICAgIHNjaGVkdWxlUm9vdDogIHNjaGVkdWxlUm9vdCAsXG4gICAgc2V0UmVmcmVzaEhhbmRsZXI6ICBzZXRSZWZyZXNoSGFuZGxlciAsXG4gICAgLy8gRW5hYmxlcyBEZXZUb29scyB0byBhcHBlbmQgb3duZXIgc3RhY2tzIHRvIGVycm9yIG1lc3NhZ2VzIGluIERFViBtb2RlLlxuICAgIGdldEN1cnJlbnRGaWJlcjogIGdldEN1cnJlbnRGaWJlckZvckRldlRvb2xzICxcbiAgICAvLyBFbmFibGVzIERldlRvb2xzIHRvIGRldGVjdCByZWNvbmNpbGVyIHZlcnNpb24gcmF0aGVyIHRoYW4gcmVuZGVyZXIgdmVyc2lvblxuICAgIC8vIHdoaWNoIG1heSBub3QgbWF0Y2ggZm9yIHRoaXJkIHBhcnR5IHJlbmRlcmVycy5cbiAgICByZWNvbmNpbGVyVmVyc2lvbjogUmVhY3RWZXJzaW9uXG4gIH0pO1xufVxuXG4vKiBnbG9iYWwgcmVwb3J0RXJyb3IgKi9cblxudmFyIGRlZmF1bHRPblJlY292ZXJhYmxlRXJyb3IgPSB0eXBlb2YgcmVwb3J0RXJyb3IgPT09ICdmdW5jdGlvbicgPyAvLyBJbiBtb2Rlcm4gYnJvd3NlcnMsIHJlcG9ydEVycm9yIHdpbGwgZGlzcGF0Y2ggYW4gZXJyb3IgZXZlbnQsXG4vLyBlbXVsYXRpbmcgYW4gdW5jYXVnaHQgSmF2YVNjcmlwdCBlcnJvci5cbnJlcG9ydEVycm9yIDogZnVuY3Rpb24gKGVycm9yKSB7XG4gIC8vIEluIG9sZGVyIGJyb3dzZXJzIGFuZCB0ZXN0IGVudmlyb25tZW50cywgZmFsbGJhY2sgdG8gY29uc29sZS5lcnJvci5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZ1xuICBjb25zb2xlWydlcnJvciddKGVycm9yKTtcbn07XG5cbmZ1bmN0aW9uIFJlYWN0RE9NUm9vdChpbnRlcm5hbFJvb3QpIHtcbiAgdGhpcy5faW50ZXJuYWxSb290ID0gaW50ZXJuYWxSb290O1xufVxuXG5SZWFjdERPTUh5ZHJhdGlvblJvb3QucHJvdG90eXBlLnJlbmRlciA9IFJlYWN0RE9NUm9vdC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKGNoaWxkcmVuKSB7XG4gIHZhciByb290ID0gdGhpcy5faW50ZXJuYWxSb290O1xuXG4gIGlmIChyb290ID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgdXBkYXRlIGFuIHVubW91bnRlZCByb290LicpO1xuICB9XG5cbiAge1xuICAgIGlmICh0eXBlb2YgYXJndW1lbnRzWzFdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcigncmVuZGVyKC4uLik6IGRvZXMgbm90IHN1cHBvcnQgdGhlIHNlY29uZCBjYWxsYmFjayBhcmd1bWVudC4gJyArICdUbyBleGVjdXRlIGEgc2lkZSBlZmZlY3QgYWZ0ZXIgcmVuZGVyaW5nLCBkZWNsYXJlIGl0IGluIGEgY29tcG9uZW50IGJvZHkgd2l0aCB1c2VFZmZlY3QoKS4nKTtcbiAgICB9IGVsc2UgaWYgKGlzVmFsaWRDb250YWluZXIoYXJndW1lbnRzWzFdKSkge1xuICAgICAgZXJyb3IoJ1lvdSBwYXNzZWQgYSBjb250YWluZXIgdG8gdGhlIHNlY29uZCBhcmd1bWVudCBvZiByb290LnJlbmRlciguLi4pLiAnICsgXCJZb3UgZG9uJ3QgbmVlZCB0byBwYXNzIGl0IGFnYWluIHNpbmNlIHlvdSBhbHJlYWR5IHBhc3NlZCBpdCB0byBjcmVhdGUgdGhlIHJvb3QuXCIpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZ3VtZW50c1sxXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGVycm9yKCdZb3UgcGFzc2VkIGEgc2Vjb25kIGFyZ3VtZW50IHRvIHJvb3QucmVuZGVyKC4uLikgYnV0IGl0IG9ubHkgYWNjZXB0cyAnICsgJ29uZSBhcmd1bWVudC4nKTtcbiAgICB9XG5cbiAgICB2YXIgY29udGFpbmVyID0gcm9vdC5jb250YWluZXJJbmZvO1xuXG4gICAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSAhPT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgICB2YXIgaG9zdEluc3RhbmNlID0gZmluZEhvc3RJbnN0YW5jZVdpdGhOb1BvcnRhbHMocm9vdC5jdXJyZW50KTtcblxuICAgICAgaWYgKGhvc3RJbnN0YW5jZSkge1xuICAgICAgICBpZiAoaG9zdEluc3RhbmNlLnBhcmVudE5vZGUgIT09IGNvbnRhaW5lcikge1xuICAgICAgICAgIGVycm9yKCdyZW5kZXIoLi4uKTogSXQgbG9va3MgbGlrZSB0aGUgUmVhY3QtcmVuZGVyZWQgY29udGVudCBvZiB0aGUgJyArICdyb290IGNvbnRhaW5lciB3YXMgcmVtb3ZlZCB3aXRob3V0IHVzaW5nIFJlYWN0LiBUaGlzIGlzIG5vdCAnICsgJ3N1cHBvcnRlZCBhbmQgd2lsbCBjYXVzZSBlcnJvcnMuIEluc3RlYWQsIGNhbGwgJyArIFwicm9vdC51bm1vdW50KCkgdG8gZW1wdHkgYSByb290J3MgY29udGFpbmVyLlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUNvbnRhaW5lcihjaGlsZHJlbiwgcm9vdCwgbnVsbCwgbnVsbCk7XG59O1xuXG5SZWFjdERPTUh5ZHJhdGlvblJvb3QucHJvdG90eXBlLnVubW91bnQgPSBSZWFjdERPTVJvb3QucHJvdG90eXBlLnVubW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1swXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ3VubW91bnQoLi4uKTogZG9lcyBub3Qgc3VwcG9ydCBhIGNhbGxiYWNrIGFyZ3VtZW50LiAnICsgJ1RvIGV4ZWN1dGUgYSBzaWRlIGVmZmVjdCBhZnRlciByZW5kZXJpbmcsIGRlY2xhcmUgaXQgaW4gYSBjb21wb25lbnQgYm9keSB3aXRoIHVzZUVmZmVjdCgpLicpO1xuICAgIH1cbiAgfVxuXG4gIHZhciByb290ID0gdGhpcy5faW50ZXJuYWxSb290O1xuXG4gIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgdGhpcy5faW50ZXJuYWxSb290ID0gbnVsbDtcbiAgICB2YXIgY29udGFpbmVyID0gcm9vdC5jb250YWluZXJJbmZvO1xuXG4gICAge1xuICAgICAgaWYgKGlzQWxyZWFkeVJlbmRlcmluZygpKSB7XG4gICAgICAgIGVycm9yKCdBdHRlbXB0ZWQgdG8gc3luY2hyb25vdXNseSB1bm1vdW50IGEgcm9vdCB3aGlsZSBSZWFjdCB3YXMgYWxyZWFkeSAnICsgJ3JlbmRlcmluZy4gUmVhY3QgY2Fubm90IGZpbmlzaCB1bm1vdW50aW5nIHRoZSByb290IHVudGlsIHRoZSAnICsgJ2N1cnJlbnQgcmVuZGVyIGhhcyBjb21wbGV0ZWQsIHdoaWNoIG1heSBsZWFkIHRvIGEgcmFjZSBjb25kaXRpb24uJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmx1c2hTeW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgIHVwZGF0ZUNvbnRhaW5lcihudWxsLCByb290LCBudWxsLCBudWxsKTtcbiAgICB9KTtcbiAgICB1bm1hcmtDb250YWluZXJBc1Jvb3QoY29udGFpbmVyKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gY3JlYXRlUm9vdChjb250YWluZXIsIG9wdGlvbnMpIHtcbiAgaWYgKCFpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lcikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NyZWF0ZVJvb3QoLi4uKTogVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC4nKTtcbiAgfVxuXG4gIHdhcm5JZlJlYWN0RE9NQ29udGFpbmVySW5ERVYoY29udGFpbmVyKTtcbiAgdmFyIGlzU3RyaWN0TW9kZSA9IGZhbHNlO1xuICB2YXIgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSA9IGZhbHNlO1xuICB2YXIgaWRlbnRpZmllclByZWZpeCA9ICcnO1xuICB2YXIgb25SZWNvdmVyYWJsZUVycm9yID0gZGVmYXVsdE9uUmVjb3ZlcmFibGVFcnJvcjtcbiAgdmFyIHRyYW5zaXRpb25DYWxsYmFja3MgPSBudWxsO1xuXG4gIGlmIChvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgIHtcbiAgICAgIGlmIChvcHRpb25zLmh5ZHJhdGUpIHtcbiAgICAgICAgd2FybignaHlkcmF0ZSB0aHJvdWdoIGNyZWF0ZVJvb3QgaXMgZGVwcmVjYXRlZC4gVXNlIFJlYWN0RE9NQ2xpZW50Lmh5ZHJhdGVSb290KGNvbnRhaW5lciwgPEFwcCAvPikgaW5zdGVhZC4nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucyAhPT0gbnVsbCAmJiBvcHRpb25zLiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEUpIHtcbiAgICAgICAgICBlcnJvcignWW91IHBhc3NlZCBhIEpTWCBlbGVtZW50IHRvIGNyZWF0ZVJvb3QuIFlvdSBwcm9iYWJseSBtZWFudCB0byAnICsgJ2NhbGwgcm9vdC5yZW5kZXIgaW5zdGVhZC4gJyArICdFeGFtcGxlIHVzYWdlOlxcblxcbicgKyAnICBsZXQgcm9vdCA9IGNyZWF0ZVJvb3QoZG9tQ29udGFpbmVyKTtcXG4nICsgJyAgcm9vdC5yZW5kZXIoPEFwcCAvPik7Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy51bnN0YWJsZV9zdHJpY3RNb2RlID09PSB0cnVlKSB7XG4gICAgICBpc1N0cmljdE1vZGUgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmlkZW50aWZpZXJQcmVmaXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWRlbnRpZmllclByZWZpeCA9IG9wdGlvbnMuaWRlbnRpZmllclByZWZpeDtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5vblJlY292ZXJhYmxlRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgb25SZWNvdmVyYWJsZUVycm9yID0gb3B0aW9ucy5vblJlY292ZXJhYmxlRXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMudHJhbnNpdGlvbkNhbGxiYWNrcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0cmFuc2l0aW9uQ2FsbGJhY2tzID0gb3B0aW9ucy50cmFuc2l0aW9uQ2FsbGJhY2tzO1xuICAgIH1cbiAgfVxuXG4gIHZhciByb290ID0gY3JlYXRlQ29udGFpbmVyKGNvbnRhaW5lciwgQ29uY3VycmVudFJvb3QsIG51bGwsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yKTtcbiAgbWFya0NvbnRhaW5lckFzUm9vdChyb290LmN1cnJlbnQsIGNvbnRhaW5lcik7XG4gIHZhciByb290Q29udGFpbmVyRWxlbWVudCA9IGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFID8gY29udGFpbmVyLnBhcmVudE5vZGUgOiBjb250YWluZXI7XG4gIGxpc3RlblRvQWxsU3VwcG9ydGVkRXZlbnRzKHJvb3RDb250YWluZXJFbGVtZW50KTtcbiAgcmV0dXJuIG5ldyBSZWFjdERPTVJvb3Qocm9vdCk7XG59XG5cbmZ1bmN0aW9uIFJlYWN0RE9NSHlkcmF0aW9uUm9vdChpbnRlcm5hbFJvb3QpIHtcbiAgdGhpcy5faW50ZXJuYWxSb290ID0gaW50ZXJuYWxSb290O1xufVxuXG5mdW5jdGlvbiBzY2hlZHVsZUh5ZHJhdGlvbih0YXJnZXQpIHtcbiAgaWYgKHRhcmdldCkge1xuICAgIHF1ZXVlRXhwbGljaXRIeWRyYXRpb25UYXJnZXQodGFyZ2V0KTtcbiAgfVxufVxuXG5SZWFjdERPTUh5ZHJhdGlvblJvb3QucHJvdG90eXBlLnVuc3RhYmxlX3NjaGVkdWxlSHlkcmF0aW9uID0gc2NoZWR1bGVIeWRyYXRpb247XG5mdW5jdGlvbiBoeWRyYXRlUm9vdChjb250YWluZXIsIGluaXRpYWxDaGlsZHJlbiwgb3B0aW9ucykge1xuICBpZiAoIWlzVmFsaWRDb250YWluZXIoY29udGFpbmVyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaHlkcmF0ZVJvb3QoLi4uKTogVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC4nKTtcbiAgfVxuXG4gIHdhcm5JZlJlYWN0RE9NQ29udGFpbmVySW5ERVYoY29udGFpbmVyKTtcblxuICB7XG4gICAgaWYgKGluaXRpYWxDaGlsZHJlbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlcnJvcignTXVzdCBwcm92aWRlIGluaXRpYWwgY2hpbGRyZW4gYXMgc2Vjb25kIGFyZ3VtZW50IHRvIGh5ZHJhdGVSb290LiAnICsgJ0V4YW1wbGUgdXNhZ2U6IGh5ZHJhdGVSb290KGRvbUNvbnRhaW5lciwgPEFwcCAvPiknKTtcbiAgICB9XG4gIH0gLy8gRm9yIG5vdyB3ZSByZXVzZSB0aGUgd2hvbGUgYmFnIG9mIG9wdGlvbnMgc2luY2UgdGhleSBjb250YWluXG4gIC8vIHRoZSBoeWRyYXRpb24gY2FsbGJhY2tzLlxuXG5cbiAgdmFyIGh5ZHJhdGlvbkNhbGxiYWNrcyA9IG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMgOiBudWxsOyAvLyBUT0RPOiBEZWxldGUgdGhpcyBvcHRpb25cblxuICB2YXIgbXV0YWJsZVNvdXJjZXMgPSBvcHRpb25zICE9IG51bGwgJiYgb3B0aW9ucy5oeWRyYXRlZFNvdXJjZXMgfHwgbnVsbDtcbiAgdmFyIGlzU3RyaWN0TW9kZSA9IGZhbHNlO1xuICB2YXIgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSA9IGZhbHNlO1xuICB2YXIgaWRlbnRpZmllclByZWZpeCA9ICcnO1xuICB2YXIgb25SZWNvdmVyYWJsZUVycm9yID0gZGVmYXVsdE9uUmVjb3ZlcmFibGVFcnJvcjtcblxuICBpZiAob3B0aW9ucyAhPT0gbnVsbCAmJiBvcHRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAob3B0aW9ucy51bnN0YWJsZV9zdHJpY3RNb2RlID09PSB0cnVlKSB7XG4gICAgICBpc1N0cmljdE1vZGUgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmlkZW50aWZpZXJQcmVmaXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWRlbnRpZmllclByZWZpeCA9IG9wdGlvbnMuaWRlbnRpZmllclByZWZpeDtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5vblJlY292ZXJhYmxlRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgb25SZWNvdmVyYWJsZUVycm9yID0gb3B0aW9ucy5vblJlY292ZXJhYmxlRXJyb3I7XG4gICAgfVxuICB9XG5cbiAgdmFyIHJvb3QgPSBjcmVhdGVIeWRyYXRpb25Db250YWluZXIoaW5pdGlhbENoaWxkcmVuLCBudWxsLCBjb250YWluZXIsIENvbmN1cnJlbnRSb290LCBoeWRyYXRpb25DYWxsYmFja3MsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yKTtcbiAgbWFya0NvbnRhaW5lckFzUm9vdChyb290LmN1cnJlbnQsIGNvbnRhaW5lcik7IC8vIFRoaXMgY2FuJ3QgYmUgYSBjb21tZW50IG5vZGUgc2luY2UgaHlkcmF0aW9uIGRvZXNuJ3Qgd29yayBvbiBjb21tZW50IG5vZGVzIGFueXdheS5cblxuICBsaXN0ZW5Ub0FsbFN1cHBvcnRlZEV2ZW50cyhjb250YWluZXIpO1xuXG4gIGlmIChtdXRhYmxlU291cmNlcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXV0YWJsZVNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBtdXRhYmxlU291cmNlID0gbXV0YWJsZVNvdXJjZXNbaV07XG4gICAgICByZWdpc3Rlck11dGFibGVTb3VyY2VGb3JIeWRyYXRpb24ocm9vdCwgbXV0YWJsZVNvdXJjZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBSZWFjdERPTUh5ZHJhdGlvblJvb3Qocm9vdCk7XG59XG5mdW5jdGlvbiBpc1ZhbGlkQ29udGFpbmVyKG5vZGUpIHtcbiAgcmV0dXJuICEhKG5vZGUgJiYgKG5vZGUubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSB8fCBub2RlLm5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFIHx8IG5vZGUubm9kZVR5cGUgPT09IERPQ1VNRU5UX0ZSQUdNRU5UX05PREUgfHwgIWRpc2FibGVDb21tZW50c0FzRE9NQ29udGFpbmVycyAgKSk7XG59IC8vIFRPRE86IFJlbW92ZSB0aGlzIGZ1bmN0aW9uIHdoaWNoIGFsc28gaW5jbHVkZXMgY29tbWVudCBub2Rlcy5cbi8vIFdlIG9ubHkgdXNlIGl0IGluIHBsYWNlcyB0aGF0IGFyZSBjdXJyZW50bHkgbW9yZSByZWxheGVkLlxuXG5mdW5jdGlvbiBpc1ZhbGlkQ29udGFpbmVyTGVnYWN5KG5vZGUpIHtcbiAgcmV0dXJuICEhKG5vZGUgJiYgKG5vZGUubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSB8fCBub2RlLm5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFIHx8IG5vZGUubm9kZVR5cGUgPT09IERPQ1VNRU5UX0ZSQUdNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFICYmIG5vZGUubm9kZVZhbHVlID09PSAnIHJlYWN0LW1vdW50LXBvaW50LXVuc3RhYmxlICcpKTtcbn1cblxuZnVuY3Rpb24gd2FybklmUmVhY3RET01Db250YWluZXJJbkRFVihjb250YWluZXIpIHtcbiAge1xuICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSAmJiBjb250YWluZXIudGFnTmFtZSAmJiBjb250YWluZXIudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnQk9EWScpIHtcbiAgICAgIGVycm9yKCdjcmVhdGVSb290KCk6IENyZWF0aW5nIHJvb3RzIGRpcmVjdGx5IHdpdGggZG9jdW1lbnQuYm9keSBpcyAnICsgJ2Rpc2NvdXJhZ2VkLCBzaW5jZSBpdHMgY2hpbGRyZW4gYXJlIG9mdGVuIG1hbmlwdWxhdGVkIGJ5IHRoaXJkLXBhcnR5ICcgKyAnc2NyaXB0cyBhbmQgYnJvd3NlciBleHRlbnNpb25zLiBUaGlzIG1heSBsZWFkIHRvIHN1YnRsZSAnICsgJ3JlY29uY2lsaWF0aW9uIGlzc3Vlcy4gVHJ5IHVzaW5nIGEgY29udGFpbmVyIGVsZW1lbnQgY3JlYXRlZCAnICsgJ2ZvciB5b3VyIGFwcC4nKTtcbiAgICB9XG5cbiAgICBpZiAoaXNDb250YWluZXJNYXJrZWRBc1Jvb3QoY29udGFpbmVyKSkge1xuICAgICAgaWYgKGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyKSB7XG4gICAgICAgIGVycm9yKCdZb3UgYXJlIGNhbGxpbmcgUmVhY3RET01DbGllbnQuY3JlYXRlUm9vdCgpIG9uIGEgY29udGFpbmVyIHRoYXQgd2FzIHByZXZpb3VzbHkgJyArICdwYXNzZWQgdG8gUmVhY3RET00ucmVuZGVyKCkuIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCdZb3UgYXJlIGNhbGxpbmcgUmVhY3RET01DbGllbnQuY3JlYXRlUm9vdCgpIG9uIGEgY29udGFpbmVyIHRoYXQgJyArICdoYXMgYWxyZWFkeSBiZWVuIHBhc3NlZCB0byBjcmVhdGVSb290KCkgYmVmb3JlLiBJbnN0ZWFkLCBjYWxsICcgKyAncm9vdC5yZW5kZXIoKSBvbiB0aGUgZXhpc3Rpbmcgcm9vdCBpbnN0ZWFkIGlmIHlvdSB3YW50IHRvIHVwZGF0ZSBpdC4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudE93bmVyJDMgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRPd25lcjtcbnZhciB0b3BMZXZlbFVwZGF0ZVdhcm5pbmdzO1xuXG57XG4gIHRvcExldmVsVXBkYXRlV2FybmluZ3MgPSBmdW5jdGlvbiAoY29udGFpbmVyKSB7XG4gICAgaWYgKGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyICYmIGNvbnRhaW5lci5ub2RlVHlwZSAhPT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgICB2YXIgaG9zdEluc3RhbmNlID0gZmluZEhvc3RJbnN0YW5jZVdpdGhOb1BvcnRhbHMoY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIuY3VycmVudCk7XG5cbiAgICAgIGlmIChob3N0SW5zdGFuY2UpIHtcbiAgICAgICAgaWYgKGhvc3RJbnN0YW5jZS5wYXJlbnROb2RlICE9PSBjb250YWluZXIpIHtcbiAgICAgICAgICBlcnJvcigncmVuZGVyKC4uLik6IEl0IGxvb2tzIGxpa2UgdGhlIFJlYWN0LXJlbmRlcmVkIGNvbnRlbnQgb2YgdGhpcyAnICsgJ2NvbnRhaW5lciB3YXMgcmVtb3ZlZCB3aXRob3V0IHVzaW5nIFJlYWN0LiBUaGlzIGlzIG5vdCAnICsgJ3N1cHBvcnRlZCBhbmQgd2lsbCBjYXVzZSBlcnJvcnMuIEluc3RlYWQsIGNhbGwgJyArICdSZWFjdERPTS51bm1vdW50Q29tcG9uZW50QXROb2RlIHRvIGVtcHR5IGEgY29udGFpbmVyLicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGlzUm9vdFJlbmRlcmVkQnlTb21lUmVhY3QgPSAhIWNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyO1xuICAgIHZhciByb290RWwgPSBnZXRSZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKTtcbiAgICB2YXIgaGFzTm9uUm9vdFJlYWN0Q2hpbGQgPSAhIShyb290RWwgJiYgZ2V0SW5zdGFuY2VGcm9tTm9kZShyb290RWwpKTtcblxuICAgIGlmIChoYXNOb25Sb290UmVhY3RDaGlsZCAmJiAhaXNSb290UmVuZGVyZWRCeVNvbWVSZWFjdCkge1xuICAgICAgZXJyb3IoJ3JlbmRlciguLi4pOiBSZXBsYWNpbmcgUmVhY3QtcmVuZGVyZWQgY2hpbGRyZW4gd2l0aCBhIG5ldyByb290ICcgKyAnY29tcG9uZW50LiBJZiB5b3UgaW50ZW5kZWQgdG8gdXBkYXRlIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUsICcgKyAneW91IHNob3VsZCBpbnN0ZWFkIGhhdmUgdGhlIGV4aXN0aW5nIGNoaWxkcmVuIHVwZGF0ZSB0aGVpciBzdGF0ZSAnICsgJ2FuZCByZW5kZXIgdGhlIG5ldyBjb21wb25lbnRzIGluc3RlYWQgb2YgY2FsbGluZyBSZWFjdERPTS5yZW5kZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFICYmIGNvbnRhaW5lci50YWdOYW1lICYmIGNvbnRhaW5lci50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdCT0RZJykge1xuICAgICAgZXJyb3IoJ3JlbmRlcigpOiBSZW5kZXJpbmcgY29tcG9uZW50cyBkaXJlY3RseSBpbnRvIGRvY3VtZW50LmJvZHkgaXMgJyArICdkaXNjb3VyYWdlZCwgc2luY2UgaXRzIGNoaWxkcmVuIGFyZSBvZnRlbiBtYW5pcHVsYXRlZCBieSB0aGlyZC1wYXJ0eSAnICsgJ3NjcmlwdHMgYW5kIGJyb3dzZXIgZXh0ZW5zaW9ucy4gVGhpcyBtYXkgbGVhZCB0byBzdWJ0bGUgJyArICdyZWNvbmNpbGlhdGlvbiBpc3N1ZXMuIFRyeSByZW5kZXJpbmcgaW50byBhIGNvbnRhaW5lciBlbGVtZW50IGNyZWF0ZWQgJyArICdmb3IgeW91ciBhcHAuJyk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRSZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKSB7XG4gIGlmICghY29udGFpbmVyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFKSB7XG4gICAgcmV0dXJuIGNvbnRhaW5lci5kb2N1bWVudEVsZW1lbnQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNvbnRhaW5lci5maXJzdENoaWxkO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vb3BPblJlY292ZXJhYmxlRXJyb3IoKSB7Ly8gVGhpcyBpc24ndCByZWFjaGFibGUgYmVjYXVzZSBvblJlY292ZXJhYmxlRXJyb3IgaXNuJ3QgY2FsbGVkIGluIHRoZVxuICAvLyBsZWdhY3kgQVBJLlxufVxuXG5mdW5jdGlvbiBsZWdhY3lDcmVhdGVSb290RnJvbURPTUNvbnRhaW5lcihjb250YWluZXIsIGluaXRpYWxDaGlsZHJlbiwgcGFyZW50Q29tcG9uZW50LCBjYWxsYmFjaywgaXNIeWRyYXRpb25Db250YWluZXIpIHtcbiAgaWYgKGlzSHlkcmF0aW9uQ29udGFpbmVyKSB7XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIG9yaWdpbmFsQ2FsbGJhY2sgPSBjYWxsYmFjaztcblxuICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGdldFB1YmxpY1Jvb3RJbnN0YW5jZShyb290KTtcbiAgICAgICAgb3JpZ2luYWxDYWxsYmFjay5jYWxsKGluc3RhbmNlKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIHJvb3QgPSBjcmVhdGVIeWRyYXRpb25Db250YWluZXIoaW5pdGlhbENoaWxkcmVuLCBjYWxsYmFjaywgY29udGFpbmVyLCBMZWdhY3lSb290LCBudWxsLCAvLyBoeWRyYXRpb25DYWxsYmFja3NcbiAgICBmYWxzZSwgLy8gaXNTdHJpY3RNb2RlXG4gICAgZmFsc2UsIC8vIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsXG4gICAgJycsIC8vIGlkZW50aWZpZXJQcmVmaXhcbiAgICBub29wT25SZWNvdmVyYWJsZUVycm9yKTtcbiAgICBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciA9IHJvb3Q7XG4gICAgbWFya0NvbnRhaW5lckFzUm9vdChyb290LmN1cnJlbnQsIGNvbnRhaW5lcik7XG4gICAgdmFyIHJvb3RDb250YWluZXJFbGVtZW50ID0gY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUgPyBjb250YWluZXIucGFyZW50Tm9kZSA6IGNvbnRhaW5lcjtcbiAgICBsaXN0ZW5Ub0FsbFN1cHBvcnRlZEV2ZW50cyhyb290Q29udGFpbmVyRWxlbWVudCk7XG4gICAgZmx1c2hTeW5jKCk7XG4gICAgcmV0dXJuIHJvb3Q7XG4gIH0gZWxzZSB7XG4gICAgLy8gRmlyc3QgY2xlYXIgYW55IGV4aXN0aW5nIGNvbnRlbnQuXG4gICAgdmFyIHJvb3RTaWJsaW5nO1xuXG4gICAgd2hpbGUgKHJvb3RTaWJsaW5nID0gY29udGFpbmVyLmxhc3RDaGlsZCkge1xuICAgICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKHJvb3RTaWJsaW5nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgX29yaWdpbmFsQ2FsbGJhY2sgPSBjYWxsYmFjaztcblxuICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGdldFB1YmxpY1Jvb3RJbnN0YW5jZShfcm9vdCk7XG5cbiAgICAgICAgX29yaWdpbmFsQ2FsbGJhY2suY2FsbChpbnN0YW5jZSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfcm9vdCA9IGNyZWF0ZUNvbnRhaW5lcihjb250YWluZXIsIExlZ2FjeVJvb3QsIG51bGwsIC8vIGh5ZHJhdGlvbkNhbGxiYWNrc1xuICAgIGZhbHNlLCAvLyBpc1N0cmljdE1vZGVcbiAgICBmYWxzZSwgLy8gY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSxcbiAgICAnJywgLy8gaWRlbnRpZmllclByZWZpeFxuICAgIG5vb3BPblJlY292ZXJhYmxlRXJyb3IpO1xuXG4gICAgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPSBfcm9vdDtcbiAgICBtYXJrQ29udGFpbmVyQXNSb290KF9yb290LmN1cnJlbnQsIGNvbnRhaW5lcik7XG5cbiAgICB2YXIgX3Jvb3RDb250YWluZXJFbGVtZW50ID0gY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUgPyBjb250YWluZXIucGFyZW50Tm9kZSA6IGNvbnRhaW5lcjtcblxuICAgIGxpc3RlblRvQWxsU3VwcG9ydGVkRXZlbnRzKF9yb290Q29udGFpbmVyRWxlbWVudCk7IC8vIEluaXRpYWwgbW91bnQgc2hvdWxkIG5vdCBiZSBiYXRjaGVkLlxuXG4gICAgZmx1c2hTeW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgIHVwZGF0ZUNvbnRhaW5lcihpbml0aWFsQ2hpbGRyZW4sIF9yb290LCBwYXJlbnRDb21wb25lbnQsIGNhbGxiYWNrKTtcbiAgICB9KTtcbiAgICByZXR1cm4gX3Jvb3Q7XG4gIH1cbn1cblxuZnVuY3Rpb24gd2Fybk9uSW52YWxpZENhbGxiYWNrJDEoY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAge1xuICAgIGlmIChjYWxsYmFjayAhPT0gbnVsbCAmJiB0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyguLi4pOiBFeHBlY3RlZCB0aGUgbGFzdCBvcHRpb25hbCBgY2FsbGJhY2tgIGFyZ3VtZW50IHRvIGJlIGEgJyArICdmdW5jdGlvbi4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY2FsbGVyTmFtZSwgY2FsbGJhY2spO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIGNoaWxkcmVuLCBjb250YWluZXIsIGZvcmNlSHlkcmF0ZSwgY2FsbGJhY2spIHtcbiAge1xuICAgIHRvcExldmVsVXBkYXRlV2FybmluZ3MoY29udGFpbmVyKTtcbiAgICB3YXJuT25JbnZhbGlkQ2FsbGJhY2skMShjYWxsYmFjayA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGNhbGxiYWNrLCAncmVuZGVyJyk7XG4gIH1cblxuICB2YXIgbWF5YmVSb290ID0gY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXI7XG4gIHZhciByb290O1xuXG4gIGlmICghbWF5YmVSb290KSB7XG4gICAgLy8gSW5pdGlhbCBtb3VudFxuICAgIHJvb3QgPSBsZWdhY3lDcmVhdGVSb290RnJvbURPTUNvbnRhaW5lcihjb250YWluZXIsIGNoaWxkcmVuLCBwYXJlbnRDb21wb25lbnQsIGNhbGxiYWNrLCBmb3JjZUh5ZHJhdGUpO1xuICB9IGVsc2Uge1xuICAgIHJvb3QgPSBtYXliZVJvb3Q7XG5cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgb3JpZ2luYWxDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG4gICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZ2V0UHVibGljUm9vdEluc3RhbmNlKHJvb3QpO1xuICAgICAgICBvcmlnaW5hbENhbGxiYWNrLmNhbGwoaW5zdGFuY2UpO1xuICAgICAgfTtcbiAgICB9IC8vIFVwZGF0ZVxuXG5cbiAgICB1cGRhdGVDb250YWluZXIoY2hpbGRyZW4sIHJvb3QsIHBhcmVudENvbXBvbmVudCwgY2FsbGJhY2spO1xuICB9XG5cbiAgcmV0dXJuIGdldFB1YmxpY1Jvb3RJbnN0YW5jZShyb290KTtcbn1cblxudmFyIGRpZFdhcm5BYm91dEZpbmRET01Ob2RlID0gZmFsc2U7XG5mdW5jdGlvbiBmaW5kRE9NTm9kZShjb21wb25lbnRPckVsZW1lbnQpIHtcbiAge1xuICAgIGlmICghZGlkV2FybkFib3V0RmluZERPTU5vZGUpIHtcbiAgICAgIGRpZFdhcm5BYm91dEZpbmRET01Ob2RlID0gdHJ1ZTtcblxuICAgICAgZXJyb3IoJ2ZpbmRET01Ob2RlIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciAnICsgJ3JlbGVhc2UuIEluc3RlYWQsIGFkZCBhIHJlZiBkaXJlY3RseSB0byB0aGUgZWxlbWVudCB5b3Ugd2FudCAnICsgJ3RvIHJlZmVyZW5jZS4gTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1maW5kLW5vZGUnKTtcbiAgICB9XG5cbiAgICB2YXIgb3duZXIgPSBSZWFjdEN1cnJlbnRPd25lciQzLmN1cnJlbnQ7XG5cbiAgICBpZiAob3duZXIgIT09IG51bGwgJiYgb3duZXIuc3RhdGVOb2RlICE9PSBudWxsKSB7XG4gICAgICB2YXIgd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIgPSBvd25lci5zdGF0ZU5vZGUuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyO1xuXG4gICAgICBpZiAoIXdhcm5lZEFib3V0UmVmc0luUmVuZGVyKSB7XG4gICAgICAgIGVycm9yKCclcyBpcyBhY2Nlc3NpbmcgZmluZERPTU5vZGUgaW5zaWRlIGl0cyByZW5kZXIoKS4gJyArICdyZW5kZXIoKSBzaG91bGQgYmUgYSBwdXJlIGZ1bmN0aW9uIG9mIHByb3BzIGFuZCBzdGF0ZS4gSXQgc2hvdWxkICcgKyAnbmV2ZXIgYWNjZXNzIHNvbWV0aGluZyB0aGF0IHJlcXVpcmVzIHN0YWxlIGRhdGEgZnJvbSB0aGUgcHJldmlvdXMgJyArICdyZW5kZXIsIHN1Y2ggYXMgcmVmcy4gTW92ZSB0aGlzIGxvZ2ljIHRvIGNvbXBvbmVudERpZE1vdW50IGFuZCAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZSBpbnN0ZWFkLicsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShvd25lci50eXBlKSB8fCAnQSBjb21wb25lbnQnKTtcbiAgICAgIH1cblxuICAgICAgb3duZXIuc3RhdGVOb2RlLl93YXJuZWRBYm91dFJlZnNJblJlbmRlciA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbXBvbmVudE9yRWxlbWVudCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoY29tcG9uZW50T3JFbGVtZW50Lm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICByZXR1cm4gY29tcG9uZW50T3JFbGVtZW50O1xuICB9XG5cbiAge1xuICAgIHJldHVybiBmaW5kSG9zdEluc3RhbmNlV2l0aFdhcm5pbmcoY29tcG9uZW50T3JFbGVtZW50LCAnZmluZERPTU5vZGUnKTtcbiAgfVxufVxuZnVuY3Rpb24gaHlkcmF0ZShlbGVtZW50LCBjb250YWluZXIsIGNhbGxiYWNrKSB7XG4gIHtcbiAgICBlcnJvcignUmVhY3RET00uaHlkcmF0ZSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGluIFJlYWN0IDE4LiBVc2UgaHlkcmF0ZVJvb3QgJyArICdpbnN0ZWFkLiBVbnRpbCB5b3Ugc3dpdGNoIHRvIHRoZSBuZXcgQVBJLCB5b3VyIGFwcCB3aWxsIGJlaGF2ZSBhcyAnICsgXCJpZiBpdCdzIHJ1bm5pbmcgUmVhY3QgMTcuIExlYXJuIFwiICsgJ21vcmU6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zd2l0Y2gtdG8tY3JlYXRlcm9vdCcpO1xuICB9XG5cbiAgaWYgKCFpc1ZhbGlkQ29udGFpbmVyTGVnYWN5KGNvbnRhaW5lcikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJyk7XG4gIH1cblxuICB7XG4gICAgdmFyIGlzTW9kZXJuUm9vdCA9IGlzQ29udGFpbmVyTWFya2VkQXNSb290KGNvbnRhaW5lcikgJiYgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPT09IHVuZGVmaW5lZDtcblxuICAgIGlmIChpc01vZGVyblJvb3QpIHtcbiAgICAgIGVycm9yKCdZb3UgYXJlIGNhbGxpbmcgUmVhY3RET00uaHlkcmF0ZSgpIG9uIGEgY29udGFpbmVyIHRoYXQgd2FzIHByZXZpb3VzbHkgJyArICdwYXNzZWQgdG8gUmVhY3RET01DbGllbnQuY3JlYXRlUm9vdCgpLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnRGlkIHlvdSBtZWFuIHRvIGNhbGwgaHlkcmF0ZVJvb3QoY29udGFpbmVyLCBlbGVtZW50KT8nKTtcbiAgICB9XG4gIH0gLy8gVE9ETzogdGhyb3cgb3Igd2FybiBpZiB3ZSBjb3VsZG4ndCBoeWRyYXRlP1xuXG5cbiAgcmV0dXJuIGxlZ2FjeVJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKG51bGwsIGVsZW1lbnQsIGNvbnRhaW5lciwgdHJ1ZSwgY2FsbGJhY2spO1xufVxuZnVuY3Rpb24gcmVuZGVyKGVsZW1lbnQsIGNvbnRhaW5lciwgY2FsbGJhY2spIHtcbiAge1xuICAgIGVycm9yKCdSZWFjdERPTS5yZW5kZXIgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCBpbiBSZWFjdCAxOC4gVXNlIGNyZWF0ZVJvb3QgJyArICdpbnN0ZWFkLiBVbnRpbCB5b3Ugc3dpdGNoIHRvIHRoZSBuZXcgQVBJLCB5b3VyIGFwcCB3aWxsIGJlaGF2ZSBhcyAnICsgXCJpZiBpdCdzIHJ1bm5pbmcgUmVhY3QgMTcuIExlYXJuIFwiICsgJ21vcmU6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zd2l0Y2gtdG8tY3JlYXRlcm9vdCcpO1xuICB9XG5cbiAgaWYgKCFpc1ZhbGlkQ29udGFpbmVyTGVnYWN5KGNvbnRhaW5lcikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJyk7XG4gIH1cblxuICB7XG4gICAgdmFyIGlzTW9kZXJuUm9vdCA9IGlzQ29udGFpbmVyTWFya2VkQXNSb290KGNvbnRhaW5lcikgJiYgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPT09IHVuZGVmaW5lZDtcblxuICAgIGlmIChpc01vZGVyblJvb3QpIHtcbiAgICAgIGVycm9yKCdZb3UgYXJlIGNhbGxpbmcgUmVhY3RET00ucmVuZGVyKCkgb24gYSBjb250YWluZXIgdGhhdCB3YXMgcHJldmlvdXNseSAnICsgJ3Bhc3NlZCB0byBSZWFjdERPTUNsaWVudC5jcmVhdGVSb290KCkuIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4gJyArICdEaWQgeW91IG1lYW4gdG8gY2FsbCByb290LnJlbmRlcihlbGVtZW50KT8nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbGVnYWN5UmVuZGVyU3VidHJlZUludG9Db250YWluZXIobnVsbCwgZWxlbWVudCwgY29udGFpbmVyLCBmYWxzZSwgY2FsbGJhY2spO1xufVxuZnVuY3Rpb24gdW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIocGFyZW50Q29tcG9uZW50LCBlbGVtZW50LCBjb250YWluZXJOb2RlLCBjYWxsYmFjaykge1xuICB7XG4gICAgZXJyb3IoJ1JlYWN0RE9NLnVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKCkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCAnICsgJ2luIFJlYWN0IDE4LiBDb25zaWRlciB1c2luZyBhIHBvcnRhbCBpbnN0ZWFkLiBVbnRpbCB5b3Ugc3dpdGNoIHRvICcgKyBcInRoZSBjcmVhdGVSb290IEFQSSwgeW91ciBhcHAgd2lsbCBiZWhhdmUgYXMgaWYgaXQncyBydW5uaW5nIFJlYWN0IFwiICsgJzE3LiBMZWFybiBtb3JlOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3dpdGNoLXRvLWNyZWF0ZXJvb3QnKTtcbiAgfVxuXG4gIGlmICghaXNWYWxpZENvbnRhaW5lckxlZ2FjeShjb250YWluZXJOb2RlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC4nKTtcbiAgfVxuXG4gIGlmIChwYXJlbnRDb21wb25lbnQgPT0gbnVsbCB8fCAhaGFzKHBhcmVudENvbXBvbmVudCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3BhcmVudENvbXBvbmVudCBtdXN0IGJlIGEgdmFsaWQgUmVhY3QgQ29tcG9uZW50Jyk7XG4gIH1cblxuICByZXR1cm4gbGVnYWN5UmVuZGVyU3VidHJlZUludG9Db250YWluZXIocGFyZW50Q29tcG9uZW50LCBlbGVtZW50LCBjb250YWluZXJOb2RlLCBmYWxzZSwgY2FsbGJhY2spO1xufVxudmFyIGRpZFdhcm5BYm91dFVubW91bnRDb21wb25lbnRBdE5vZGUgPSBmYWxzZTtcbmZ1bmN0aW9uIHVubW91bnRDb21wb25lbnRBdE5vZGUoY29udGFpbmVyKSB7XG4gIHtcbiAgICBpZiAoIWRpZFdhcm5BYm91dFVubW91bnRDb21wb25lbnRBdE5vZGUpIHtcbiAgICAgIGRpZFdhcm5BYm91dFVubW91bnRDb21wb25lbnRBdE5vZGUgPSB0cnVlO1xuXG4gICAgICBlcnJvcigndW5tb3VudENvbXBvbmVudEF0Tm9kZSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlICcgKyAnbmV4dCBtYWpvciByZWxlYXNlLiBTd2l0Y2ggdG8gdGhlIGNyZWF0ZVJvb3QgQVBJLiBMZWFybiAnICsgJ21vcmU6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zd2l0Y2gtdG8tY3JlYXRlcm9vdCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghaXNWYWxpZENvbnRhaW5lckxlZ2FjeShjb250YWluZXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1bm1vdW50Q29tcG9uZW50QXROb2RlKC4uLik6IFRhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJyk7XG4gIH1cblxuICB7XG4gICAgdmFyIGlzTW9kZXJuUm9vdCA9IGlzQ29udGFpbmVyTWFya2VkQXNSb290KGNvbnRhaW5lcikgJiYgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPT09IHVuZGVmaW5lZDtcblxuICAgIGlmIChpc01vZGVyblJvb3QpIHtcbiAgICAgIGVycm9yKCdZb3UgYXJlIGNhbGxpbmcgUmVhY3RET00udW5tb3VudENvbXBvbmVudEF0Tm9kZSgpIG9uIGEgY29udGFpbmVyIHRoYXQgd2FzIHByZXZpb3VzbHkgJyArICdwYXNzZWQgdG8gUmVhY3RET01DbGllbnQuY3JlYXRlUm9vdCgpLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuIERpZCB5b3UgbWVhbiB0byBjYWxsIHJvb3QudW5tb3VudCgpPycpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lcikge1xuICAgIHtcbiAgICAgIHZhciByb290RWwgPSBnZXRSZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKTtcbiAgICAgIHZhciByZW5kZXJlZEJ5RGlmZmVyZW50UmVhY3QgPSByb290RWwgJiYgIWdldEluc3RhbmNlRnJvbU5vZGUocm9vdEVsKTtcblxuICAgICAgaWYgKHJlbmRlcmVkQnlEaWZmZXJlbnRSZWFjdCkge1xuICAgICAgICBlcnJvcihcInVubW91bnRDb21wb25lbnRBdE5vZGUoKTogVGhlIG5vZGUgeW91J3JlIGF0dGVtcHRpbmcgdG8gdW5tb3VudCBcIiArICd3YXMgcmVuZGVyZWQgYnkgYW5vdGhlciBjb3B5IG9mIFJlYWN0LicpO1xuICAgICAgfVxuICAgIH0gLy8gVW5tb3VudCBzaG91bGQgbm90IGJlIGJhdGNoZWQuXG5cblxuICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihudWxsLCBudWxsLCBjb250YWluZXIsIGZhbHNlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vICRGbG93Rml4TWUgVGhpcyBzaG91bGQgcHJvYmFibHkgdXNlIGBkZWxldGUgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXJgXG4gICAgICAgIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyID0gbnVsbDtcbiAgICAgICAgdW5tYXJrQ29udGFpbmVyQXNSb290KGNvbnRhaW5lcik7XG4gICAgICB9KTtcbiAgICB9KTsgLy8gSWYgeW91IGNhbGwgdW5tb3VudENvbXBvbmVudEF0Tm9kZSB0d2ljZSBpbiBxdWljayBzdWNjZXNzaW9uLCB5b3UnbGxcbiAgICAvLyBnZXQgYHRydWVgIHR3aWNlLiBUaGF0J3MgcHJvYmFibHkgZmluZT9cblxuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHtcbiAgICAgIHZhciBfcm9vdEVsID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcik7XG5cbiAgICAgIHZhciBoYXNOb25Sb290UmVhY3RDaGlsZCA9ICEhKF9yb290RWwgJiYgZ2V0SW5zdGFuY2VGcm9tTm9kZShfcm9vdEVsKSk7IC8vIENoZWNrIGlmIHRoZSBjb250YWluZXIgaXRzZWxmIGlzIGEgUmVhY3Qgcm9vdCBub2RlLlxuXG4gICAgICB2YXIgaXNDb250YWluZXJSZWFjdFJvb3QgPSBjb250YWluZXIubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSAmJiBpc1ZhbGlkQ29udGFpbmVyTGVnYWN5KGNvbnRhaW5lci5wYXJlbnROb2RlKSAmJiAhIWNvbnRhaW5lci5wYXJlbnROb2RlLl9yZWFjdFJvb3RDb250YWluZXI7XG5cbiAgICAgIGlmIChoYXNOb25Sb290UmVhY3RDaGlsZCkge1xuICAgICAgICBlcnJvcihcInVubW91bnRDb21wb25lbnRBdE5vZGUoKTogVGhlIG5vZGUgeW91J3JlIGF0dGVtcHRpbmcgdG8gdW5tb3VudCBcIiArICd3YXMgcmVuZGVyZWQgYnkgUmVhY3QgYW5kIGlzIG5vdCBhIHRvcC1sZXZlbCBjb250YWluZXIuICVzJywgaXNDb250YWluZXJSZWFjdFJvb3QgPyAnWW91IG1heSBoYXZlIGFjY2lkZW50YWxseSBwYXNzZWQgaW4gYSBSZWFjdCByb290IG5vZGUgaW5zdGVhZCAnICsgJ29mIGl0cyBjb250YWluZXIuJyA6ICdJbnN0ZWFkLCBoYXZlIHRoZSBwYXJlbnQgY29tcG9uZW50IHVwZGF0ZSBpdHMgc3RhdGUgYW5kICcgKyAncmVyZW5kZXIgaW4gb3JkZXIgdG8gcmVtb3ZlIHRoaXMgY29tcG9uZW50LicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5zZXRBdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24oYXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uJDEpO1xuc2V0QXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24oYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24kMSk7XG5zZXRBdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkoYXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5JDEpO1xuc2V0R2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSk7XG5zZXRBdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eShydW5XaXRoUHJpb3JpdHkpO1xuXG57XG4gIGlmICh0eXBlb2YgTWFwICE9PSAnZnVuY3Rpb24nIHx8IC8vICRGbG93SXNzdWUgRmxvdyBpbmNvcnJlY3RseSB0aGlua3MgTWFwIGhhcyBubyBwcm90b3R5cGVcbiAgTWFwLnByb3RvdHlwZSA9PSBudWxsIHx8IHR5cGVvZiBNYXAucHJvdG90eXBlLmZvckVhY2ggIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIFNldCAhPT0gJ2Z1bmN0aW9uJyB8fCAvLyAkRmxvd0lzc3VlIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIFNldCBoYXMgbm8gcHJvdG90eXBlXG4gIFNldC5wcm90b3R5cGUgPT0gbnVsbCB8fCB0eXBlb2YgU2V0LnByb3RvdHlwZS5jbGVhciAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgU2V0LnByb3RvdHlwZS5mb3JFYWNoICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgZXJyb3IoJ1JlYWN0IGRlcGVuZHMgb24gTWFwIGFuZCBTZXQgYnVpbHQtaW4gdHlwZXMuIE1ha2Ugc3VyZSB0aGF0IHlvdSBsb2FkIGEgJyArICdwb2x5ZmlsbCBpbiBvbGRlciBicm93c2Vycy4gaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3JlYWN0LXBvbHlmaWxscycpO1xuICB9XG59XG5cbnNldFJlc3RvcmVJbXBsZW1lbnRhdGlvbihyZXN0b3JlQ29udHJvbGxlZFN0YXRlJDMpO1xuc2V0QmF0Y2hpbmdJbXBsZW1lbnRhdGlvbihiYXRjaGVkVXBkYXRlcyQxLCBkaXNjcmV0ZVVwZGF0ZXMsIGZsdXNoU3luYyk7XG5cbmZ1bmN0aW9uIGNyZWF0ZVBvcnRhbCQxKGNoaWxkcmVuLCBjb250YWluZXIpIHtcbiAgdmFyIGtleSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbnVsbDtcblxuICBpZiAoIWlzVmFsaWRDb250YWluZXIoY29udGFpbmVyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC4nKTtcbiAgfSAvLyBUT0RPOiBwYXNzIFJlYWN0RE9NIHBvcnRhbCBpbXBsZW1lbnRhdGlvbiBhcyB0aGlyZCBhcmd1bWVudFxuICAvLyAkRmxvd0ZpeE1lIFRoZSBGbG93IHR5cGUgaXMgb3BhcXVlIGJ1dCB0aGVyZSdzIG5vIHdheSB0byBhY3R1YWxseSBjcmVhdGUgaXQuXG5cblxuICByZXR1cm4gY3JlYXRlUG9ydGFsKGNoaWxkcmVuLCBjb250YWluZXIsIG51bGwsIGtleSk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHBhcmVudENvbXBvbmVudCwgZWxlbWVudCwgY29udGFpbmVyTm9kZSwgY2FsbGJhY2spIHtcbiAgcmV0dXJuIHVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHBhcmVudENvbXBvbmVudCwgZWxlbWVudCwgY29udGFpbmVyTm9kZSwgY2FsbGJhY2spO1xufVxuXG52YXIgSW50ZXJuYWxzID0ge1xuICB1c2luZ0NsaWVudEVudHJ5UG9pbnQ6IGZhbHNlLFxuICAvLyBLZWVwIGluIHN5bmMgd2l0aCBSZWFjdFRlc3RVdGlscy5qcy5cbiAgLy8gVGhpcyBpcyBhbiBhcnJheSBmb3IgYmV0dGVyIG1pbmlmaWNhdGlvbi5cbiAgRXZlbnRzOiBbZ2V0SW5zdGFuY2VGcm9tTm9kZSwgZ2V0Tm9kZUZyb21JbnN0YW5jZSwgZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZSwgZW5xdWV1ZVN0YXRlUmVzdG9yZSwgcmVzdG9yZVN0YXRlSWZOZWVkZWQsIGJhdGNoZWRVcGRhdGVzJDFdXG59O1xuXG5mdW5jdGlvbiBjcmVhdGVSb290JDEoY29udGFpbmVyLCBvcHRpb25zKSB7XG4gIHtcbiAgICBpZiAoIUludGVybmFscy51c2luZ0NsaWVudEVudHJ5UG9pbnQgJiYgIWZhbHNlKSB7XG4gICAgICBlcnJvcignWW91IGFyZSBpbXBvcnRpbmcgY3JlYXRlUm9vdCBmcm9tIFwicmVhY3QtZG9tXCIgd2hpY2ggaXMgbm90IHN1cHBvcnRlZC4gJyArICdZb3Ugc2hvdWxkIGluc3RlYWQgaW1wb3J0IGl0IGZyb20gXCJyZWFjdC1kb20vY2xpZW50XCIuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZVJvb3QoY29udGFpbmVyLCBvcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gaHlkcmF0ZVJvb3QkMShjb250YWluZXIsIGluaXRpYWxDaGlsZHJlbiwgb3B0aW9ucykge1xuICB7XG4gICAgaWYgKCFJbnRlcm5hbHMudXNpbmdDbGllbnRFbnRyeVBvaW50ICYmICFmYWxzZSkge1xuICAgICAgZXJyb3IoJ1lvdSBhcmUgaW1wb3J0aW5nIGh5ZHJhdGVSb290IGZyb20gXCJyZWFjdC1kb21cIiB3aGljaCBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ1lvdSBzaG91bGQgaW5zdGVhZCBpbXBvcnQgaXQgZnJvbSBcInJlYWN0LWRvbS9jbGllbnRcIi4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaHlkcmF0ZVJvb3QoY29udGFpbmVyLCBpbml0aWFsQ2hpbGRyZW4sIG9wdGlvbnMpO1xufSAvLyBPdmVybG9hZCB0aGUgZGVmaW5pdGlvbiB0byB0aGUgdHdvIHZhbGlkIHNpZ25hdHVyZXMuXG4vLyBXYXJuaW5nLCB0aGlzIG9wdHMtb3V0IG9mIGNoZWNraW5nIHRoZSBmdW5jdGlvbiBib2R5LlxuXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZWRlY2xhcmVcbmZ1bmN0aW9uIGZsdXNoU3luYyQxKGZuKSB7XG4gIHtcbiAgICBpZiAoaXNBbHJlYWR5UmVuZGVyaW5nKCkpIHtcbiAgICAgIGVycm9yKCdmbHVzaFN5bmMgd2FzIGNhbGxlZCBmcm9tIGluc2lkZSBhIGxpZmVjeWNsZSBtZXRob2QuIFJlYWN0IGNhbm5vdCAnICsgJ2ZsdXNoIHdoZW4gUmVhY3QgaXMgYWxyZWFkeSByZW5kZXJpbmcuIENvbnNpZGVyIG1vdmluZyB0aGlzIGNhbGwgdG8gJyArICdhIHNjaGVkdWxlciB0YXNrIG9yIG1pY3JvIHRhc2suJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZsdXNoU3luYyhmbik7XG59XG52YXIgZm91bmREZXZUb29scyA9IGluamVjdEludG9EZXZUb29scyh7XG4gIGZpbmRGaWJlckJ5SG9zdEluc3RhbmNlOiBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSxcbiAgYnVuZGxlVHlwZTogIDEgLFxuICB2ZXJzaW9uOiBSZWFjdFZlcnNpb24sXG4gIHJlbmRlcmVyUGFja2FnZU5hbWU6ICdyZWFjdC1kb20nXG59KTtcblxue1xuICBpZiAoIWZvdW5kRGV2VG9vbHMgJiYgY2FuVXNlRE9NICYmIHdpbmRvdy50b3AgPT09IHdpbmRvdy5zZWxmKSB7XG4gICAgLy8gSWYgd2UncmUgaW4gQ2hyb21lIG9yIEZpcmVmb3gsIHByb3ZpZGUgYSBkb3dubG9hZCBsaW5rIGlmIG5vdCBpbnN0YWxsZWQuXG4gICAgaWYgKG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignQ2hyb21lJykgPiAtMSAmJiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0VkZ2UnKSA9PT0gLTEgfHwgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdGaXJlZm94JykgPiAtMSkge1xuICAgICAgdmFyIHByb3RvY29sID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sOyAvLyBEb24ndCB3YXJuIGluIGV4b3RpYyBjYXNlcyBsaWtlIGNocm9tZS1leHRlbnNpb246Ly8uXG5cbiAgICAgIGlmICgvXihodHRwcz98ZmlsZSk6JC8udGVzdChwcm90b2NvbCkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZ1xuICAgICAgICBjb25zb2xlLmluZm8oJyVjRG93bmxvYWQgdGhlIFJlYWN0IERldlRvb2xzICcgKyAnZm9yIGEgYmV0dGVyIGRldmVsb3BtZW50IGV4cGVyaWVuY2U6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3JlYWN0LWRldnRvb2xzJyArIChwcm90b2NvbCA9PT0gJ2ZpbGU6JyA/ICdcXG5Zb3UgbWlnaHQgbmVlZCB0byB1c2UgYSBsb2NhbCBIVFRQIHNlcnZlciAoaW5zdGVhZCBvZiBmaWxlOi8vKTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvcmVhY3QtZGV2dG9vbHMtZmFxJyA6ICcnKSwgJ2ZvbnQtd2VpZ2h0OmJvbGQnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0cy5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRCA9IEludGVybmFscztcbmV4cG9ydHMuY3JlYXRlUG9ydGFsID0gY3JlYXRlUG9ydGFsJDE7XG5leHBvcnRzLmNyZWF0ZVJvb3QgPSBjcmVhdGVSb290JDE7XG5leHBvcnRzLmZpbmRET01Ob2RlID0gZmluZERPTU5vZGU7XG5leHBvcnRzLmZsdXNoU3luYyA9IGZsdXNoU3luYyQxO1xuZXhwb3J0cy5oeWRyYXRlID0gaHlkcmF0ZTtcbmV4cG9ydHMuaHlkcmF0ZVJvb3QgPSBoeWRyYXRlUm9vdCQxO1xuZXhwb3J0cy5yZW5kZXIgPSByZW5kZXI7XG5leHBvcnRzLnVubW91bnRDb21wb25lbnRBdE5vZGUgPSB1bm1vdW50Q29tcG9uZW50QXROb2RlO1xuZXhwb3J0cy51bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyA9IGJhdGNoZWRVcGRhdGVzJDE7XG5leHBvcnRzLnVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyID0gcmVuZGVyU3VidHJlZUludG9Db250YWluZXI7XG5leHBvcnRzLnZlcnNpb24gPSBSZWFjdFZlcnNpb247XG4gICAgICAgICAgLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AobmV3IEVycm9yKCkpO1xufVxuICAgICAgICBcbiAgfSkoKTtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIGNoZWNrRENFKCkge1xuICAvKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG4gIGlmIChcbiAgICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fID09PSAndW5kZWZpbmVkJyB8fFxuICAgIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UgIT09ICdmdW5jdGlvbidcbiAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgLy8gVGhpcyBicmFuY2ggaXMgdW5yZWFjaGFibGUgYmVjYXVzZSB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkXG4gICAgLy8gaW4gcHJvZHVjdGlvbiwgYnV0IHRoZSBjb25kaXRpb24gaXMgdHJ1ZSBvbmx5IGluIGRldmVsb3BtZW50LlxuICAgIC8vIFRoZXJlZm9yZSBpZiB0aGUgYnJhbmNoIGlzIHN0aWxsIGhlcmUsIGRlYWQgY29kZSBlbGltaW5hdGlvbiB3YXNuJ3RcbiAgICAvLyBwcm9wZXJseSBhcHBsaWVkLlxuICAgIC8vIERvbid0IGNoYW5nZSB0aGUgbWVzc2FnZS4gUmVhY3QgRGV2VG9vbHMgcmVsaWVzIG9uIGl0LiBBbHNvIG1ha2Ugc3VyZVxuICAgIC8vIHRoaXMgbWVzc2FnZSBkb2Vzbid0IG9jY3VyIGVsc2V3aGVyZSBpbiB0aGlzIGZ1bmN0aW9uLCBvciBpdCB3aWxsIGNhdXNlXG4gICAgLy8gYSBmYWxzZSBwb3NpdGl2ZS5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ15fXicpO1xuICB9XG4gIHRyeSB7XG4gICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGNvZGUgYWJvdmUgaGFzIGJlZW4gZGVhZCBjb2RlIGVsaW1pbmF0ZWQgKERDRSdkKS5cbiAgICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UoY2hlY2tEQ0UpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBEZXZUb29scyBzaG91bGRuJ3QgY3Jhc2ggUmVhY3QsIG5vIG1hdHRlciB3aGF0LlxuICAgIC8vIFdlIHNob3VsZCBzdGlsbCByZXBvcnQgaW4gY2FzZSB3ZSBicmVhayB0aGlzIGNvZGUuXG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICB9XG59XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIC8vIERDRSBjaGVjayBzaG91bGQgaGFwcGVuIGJlZm9yZSBSZWFjdERPTSBidW5kbGUgZXhlY3V0ZXMgc28gdGhhdFxuICAvLyBEZXZUb29scyBjYW4gcmVwb3J0IGJhZCBtaW5pZmljYXRpb24gZHVyaW5nIGluamVjdGlvbi5cbiAgY2hlY2tEQ0UoKTtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbSA9IHJlcXVpcmUoJ3JlYWN0LWRvbScpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgZXhwb3J0cy5jcmVhdGVSb290ID0gbS5jcmVhdGVSb290O1xuICBleHBvcnRzLmh5ZHJhdGVSb290ID0gbS5oeWRyYXRlUm9vdDtcbn0gZWxzZSB7XG4gIHZhciBpID0gbS5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRDtcbiAgZXhwb3J0cy5jcmVhdGVSb290ID0gZnVuY3Rpb24oYywgbykge1xuICAgIGkudXNpbmdDbGllbnRFbnRyeVBvaW50ID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG0uY3JlYXRlUm9vdChjLCBvKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSBmYWxzZTtcbiAgICB9XG4gIH07XG4gIGV4cG9ydHMuaHlkcmF0ZVJvb3QgPSBmdW5jdGlvbihjLCBoLCBvKSB7XG4gICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbS5oeWRyYXRlUm9vdChjLCBoLCBvKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSBmYWxzZTtcbiAgICB9XG4gIH07XG59XG4iLCAiLyohXG5cdENvcHlyaWdodCAoYykgMjAxOCBKZWQgV2F0c29uLlxuXHRMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgKE1JVCksIHNlZVxuXHRodHRwOi8vamVkd2F0c29uLmdpdGh1Yi5pby9jbGFzc25hbWVzXG4qL1xuLyogZ2xvYmFsIGRlZmluZSAqL1xuXG4oZnVuY3Rpb24gKCkge1xuXHQndXNlIHN0cmljdCc7XG5cblx0dmFyIGhhc093biA9IHt9Lmhhc093blByb3BlcnR5O1xuXG5cdGZ1bmN0aW9uIGNsYXNzTmFtZXMgKCkge1xuXHRcdHZhciBjbGFzc2VzID0gJyc7XG5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGFyZyA9IGFyZ3VtZW50c1tpXTtcblx0XHRcdGlmIChhcmcpIHtcblx0XHRcdFx0Y2xhc3NlcyA9IGFwcGVuZENsYXNzKGNsYXNzZXMsIHBhcnNlVmFsdWUoYXJnKSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNsYXNzZXM7XG5cdH1cblxuXHRmdW5jdGlvbiBwYXJzZVZhbHVlIChhcmcpIHtcblx0XHRpZiAodHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcblx0XHRcdHJldHVybiBhcmc7XG5cdFx0fVxuXG5cdFx0aWYgKHR5cGVvZiBhcmcgIT09ICdvYmplY3QnKSB7XG5cdFx0XHRyZXR1cm4gJyc7XG5cdFx0fVxuXG5cdFx0aWYgKEFycmF5LmlzQXJyYXkoYXJnKSkge1xuXHRcdFx0cmV0dXJuIGNsYXNzTmFtZXMuYXBwbHkobnVsbCwgYXJnKTtcblx0XHR9XG5cblx0XHRpZiAoYXJnLnRvU3RyaW5nICE9PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nICYmICFhcmcudG9TdHJpbmcudG9TdHJpbmcoKS5pbmNsdWRlcygnW25hdGl2ZSBjb2RlXScpKSB7XG5cdFx0XHRyZXR1cm4gYXJnLnRvU3RyaW5nKCk7XG5cdFx0fVxuXG5cdFx0dmFyIGNsYXNzZXMgPSAnJztcblxuXHRcdGZvciAodmFyIGtleSBpbiBhcmcpIHtcblx0XHRcdGlmIChoYXNPd24uY2FsbChhcmcsIGtleSkgJiYgYXJnW2tleV0pIHtcblx0XHRcdFx0Y2xhc3NlcyA9IGFwcGVuZENsYXNzKGNsYXNzZXMsIGtleSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNsYXNzZXM7XG5cdH1cblxuXHRmdW5jdGlvbiBhcHBlbmRDbGFzcyAodmFsdWUsIG5ld0NsYXNzKSB7XG5cdFx0aWYgKCFuZXdDbGFzcykge1xuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH1cblx0XG5cdFx0aWYgKHZhbHVlKSB7XG5cdFx0XHRyZXR1cm4gdmFsdWUgKyAnICcgKyBuZXdDbGFzcztcblx0XHR9XG5cdFxuXHRcdHJldHVybiB2YWx1ZSArIG5ld0NsYXNzO1xuXHR9XG5cblx0aWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG5cdFx0Y2xhc3NOYW1lcy5kZWZhdWx0ID0gY2xhc3NOYW1lcztcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGNsYXNzTmFtZXM7XG5cdH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZGVmaW5lLmFtZCA9PT0gJ29iamVjdCcgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIHJlZ2lzdGVyIGFzICdjbGFzc25hbWVzJywgY29uc2lzdGVudCB3aXRoIG5wbSBwYWNrYWdlIG5hbWVcblx0XHRkZWZpbmUoJ2NsYXNzbmFtZXMnLCBbXSwgZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIGNsYXNzTmFtZXM7XG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0d2luZG93LmNsYXNzTmFtZXMgPSBjbGFzc05hbWVzO1xuXHR9XG59KCkpO1xuIiwgIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHJlYWN0LWlzLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxuLy8gQVRURU5USU9OXG4vLyBXaGVuIGFkZGluZyBuZXcgc3ltYm9scyB0byB0aGlzIGZpbGUsXG4vLyBQbGVhc2UgY29uc2lkZXIgYWxzbyBhZGRpbmcgdG8gJ3JlYWN0LWRldnRvb2xzLXNoYXJlZC9zcmMvYmFja2VuZC9SZWFjdFN5bWJvbHMnXG4vLyBUaGUgU3ltYm9sIHVzZWQgdG8gdGFnIHRoZSBSZWFjdEVsZW1lbnQtbGlrZSB0eXBlcy5cbnZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50Jyk7XG52YXIgUkVBQ1RfUE9SVEFMX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wb3J0YWwnKTtcbnZhciBSRUFDVF9GUkFHTUVOVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZnJhZ21lbnQnKTtcbnZhciBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3RyaWN0X21vZGUnKTtcbnZhciBSRUFDVF9QUk9GSUxFUl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucHJvZmlsZXInKTtcbnZhciBSRUFDVF9QUk9WSURFUl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucHJvdmlkZXInKTtcbnZhciBSRUFDVF9DT05URVhUX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5jb250ZXh0Jyk7XG52YXIgUkVBQ1RfU0VSVkVSX0NPTlRFWFRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnNlcnZlcl9jb250ZXh0Jyk7XG52YXIgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmZvcndhcmRfcmVmJyk7XG52YXIgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlJyk7XG52YXIgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2VfbGlzdCcpO1xudmFyIFJFQUNUX01FTU9fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm1lbW8nKTtcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5sYXp5Jyk7XG52YXIgUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5vZmZzY3JlZW4nKTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudmFyIGVuYWJsZVNjb3BlQVBJID0gZmFsc2U7IC8vIEV4cGVyaW1lbnRhbCBDcmVhdGUgRXZlbnQgSGFuZGxlIEFQSS5cbnZhciBlbmFibGVDYWNoZUVsZW1lbnQgPSBmYWxzZTtcbnZhciBlbmFibGVUcmFuc2l0aW9uVHJhY2luZyA9IGZhbHNlOyAvLyBObyBrbm93biBidWdzLCBidXQgbmVlZHMgcGVyZm9ybWFuY2UgdGVzdGluZ1xuXG52YXIgZW5hYmxlTGVnYWN5SGlkZGVuID0gZmFsc2U7IC8vIEVuYWJsZXMgdW5zdGFibGVfYXZvaWRUaGlzRmFsbGJhY2sgZmVhdHVyZSBpbiBGaWJlclxuLy8gc3R1ZmYuIEludGVuZGVkIHRvIGVuYWJsZSBSZWFjdCBjb3JlIG1lbWJlcnMgdG8gbW9yZSBlYXNpbHkgZGVidWcgc2NoZWR1bGluZ1xuLy8gaXNzdWVzIGluIERFViBidWlsZHMuXG5cbnZhciBlbmFibGVEZWJ1Z1RyYWNpbmcgPSBmYWxzZTsgLy8gVHJhY2sgd2hpY2ggRmliZXIocykgc2NoZWR1bGUgcmVuZGVyIHdvcmsuXG5cbnZhciBSRUFDVF9NT0RVTEVfUkVGRVJFTkNFO1xuXG57XG4gIFJFQUNUX01PRFVMRV9SRUZFUkVOQ0UgPSBTeW1ib2wuZm9yKCdyZWFjdC5tb2R1bGUucmVmZXJlbmNlJyk7XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSB7XG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyBOb3RlOiB0eXBlb2YgbWlnaHQgYmUgb3RoZXIgdGhhbiAnc3ltYm9sJyBvciAnbnVtYmVyJyAoZS5nLiBpZiBpdCdzIGEgcG9seWZpbGwpLlxuXG5cbiAgaWYgKHR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRSB8fCBlbmFibGVEZWJ1Z1RyYWNpbmcgIHx8IHR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgfHwgZW5hYmxlTGVnYWN5SGlkZGVuICB8fCB0eXBlID09PSBSRUFDVF9PRkZTQ1JFRU5fVFlQRSB8fCBlbmFibGVTY29wZUFQSSAgfHwgZW5hYmxlQ2FjaGVFbGVtZW50ICB8fCBlbmFibGVUcmFuc2l0aW9uVHJhY2luZyApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgLy8gVGhpcyBuZWVkcyB0byBpbmNsdWRlIGFsbCBwb3NzaWJsZSBtb2R1bGUgcmVmZXJlbmNlIG9iamVjdFxuICAgIC8vIHR5cGVzIHN1cHBvcnRlZCBieSBhbnkgRmxpZ2h0IGNvbmZpZ3VyYXRpb24gYW55d2hlcmUgc2luY2VcbiAgICAvLyB3ZSBkb24ndCBrbm93IHdoaWNoIEZsaWdodCBidWlsZCB0aGlzIHdpbGwgZW5kIHVwIGJlaW5nIHVzZWRcbiAgICAvLyB3aXRoLlxuICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01PRFVMRV9SRUZFUkVOQ0UgfHwgdHlwZS5nZXRNb2R1bGVJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHR5cGVPZihvYmplY3QpIHtcbiAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCkge1xuICAgIHZhciAkJHR5cGVvZiA9IG9iamVjdC4kJHR5cGVvZjtcblxuICAgIHN3aXRjaCAoJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICB2YXIgdHlwZSA9IG9iamVjdC50eXBlO1xuXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgICAgICAgIHJldHVybiB0eXBlO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHZhciAkJHR5cGVvZlR5cGUgPSB0eXBlICYmIHR5cGUuJCR0eXBlb2Y7XG5cbiAgICAgICAgICAgIHN3aXRjaCAoJCR0eXBlb2ZUeXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfU0VSVkVSX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mVHlwZTtcblxuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAkJHR5cGVvZjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgIHJldHVybiAkJHR5cGVvZjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxudmFyIENvbnRleHRDb25zdW1lciA9IFJFQUNUX0NPTlRFWFRfVFlQRTtcbnZhciBDb250ZXh0UHJvdmlkZXIgPSBSRUFDVF9QUk9WSURFUl9UWVBFO1xudmFyIEVsZW1lbnQgPSBSRUFDVF9FTEVNRU5UX1RZUEU7XG52YXIgRm9yd2FyZFJlZiA9IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU7XG52YXIgRnJhZ21lbnQgPSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xudmFyIExhenkgPSBSRUFDVF9MQVpZX1RZUEU7XG52YXIgTWVtbyA9IFJFQUNUX01FTU9fVFlQRTtcbnZhciBQb3J0YWwgPSBSRUFDVF9QT1JUQUxfVFlQRTtcbnZhciBQcm9maWxlciA9IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG52YXIgU3RyaWN0TW9kZSA9IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG52YXIgU3VzcGVuc2UgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xudmFyIFN1c3BlbnNlTGlzdCA9IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTtcbnZhciBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSA9IGZhbHNlO1xudmFyIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQ29uY3VycmVudE1vZGUgPSBmYWxzZTsgLy8gQXN5bmNNb2RlIHNob3VsZCBiZSBkZXByZWNhdGVkXG5cbmZ1bmN0aW9uIGlzQXN5bmNNb2RlKG9iamVjdCkge1xuICB7XG4gICAgaWYgKCFoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSkge1xuICAgICAgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUgPSB0cnVlOyAvLyBVc2luZyBjb25zb2xlWyd3YXJuJ10gdG8gZXZhZGUgQmFiZWwgYW5kIEVTTGludFxuXG4gICAgICBjb25zb2xlWyd3YXJuJ10oJ1RoZSBSZWFjdElzLmlzQXN5bmNNb2RlKCkgYWxpYXMgaGFzIGJlZW4gZGVwcmVjYXRlZCwgJyArICdhbmQgd2lsbCBiZSByZW1vdmVkIGluIFJlYWN0IDE4Ky4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBpc0NvbmN1cnJlbnRNb2RlKG9iamVjdCkge1xuICB7XG4gICAgaWYgKCFoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0NvbmN1cnJlbnRNb2RlKSB7XG4gICAgICBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0NvbmN1cnJlbnRNb2RlID0gdHJ1ZTsgLy8gVXNpbmcgY29uc29sZVsnd2FybiddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcblxuICAgICAgY29uc29sZVsnd2FybiddKCdUaGUgUmVhY3RJcy5pc0NvbmN1cnJlbnRNb2RlKCkgYWxpYXMgaGFzIGJlZW4gZGVwcmVjYXRlZCwgJyArICdhbmQgd2lsbCBiZSByZW1vdmVkIGluIFJlYWN0IDE4Ky4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBpc0NvbnRleHRDb25zdW1lcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9DT05URVhUX1RZUEU7XG59XG5mdW5jdGlvbiBpc0NvbnRleHRQcm92aWRlcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QUk9WSURFUl9UWVBFO1xufVxuZnVuY3Rpb24gaXNFbGVtZW50KG9iamVjdCkge1xuICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsICYmIG9iamVjdC4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNGb3J3YXJkUmVmKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU7XG59XG5mdW5jdGlvbiBpc0ZyYWdtZW50KG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEU7XG59XG5mdW5jdGlvbiBpc0xhenkob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfTEFaWV9UWVBFO1xufVxuZnVuY3Rpb24gaXNNZW1vKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX01FTU9fVFlQRTtcbn1cbmZ1bmN0aW9uIGlzUG9ydGFsKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BPUlRBTF9UWVBFO1xufVxuZnVuY3Rpb24gaXNQcm9maWxlcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xufVxuZnVuY3Rpb24gaXNTdHJpY3RNb2RlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG59XG5mdW5jdGlvbiBpc1N1c3BlbnNlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG59XG5mdW5jdGlvbiBpc1N1c3BlbnNlTGlzdChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU7XG59XG5cbmV4cG9ydHMuQ29udGV4dENvbnN1bWVyID0gQ29udGV4dENvbnN1bWVyO1xuZXhwb3J0cy5Db250ZXh0UHJvdmlkZXIgPSBDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLkVsZW1lbnQgPSBFbGVtZW50O1xuZXhwb3J0cy5Gb3J3YXJkUmVmID0gRm9yd2FyZFJlZjtcbmV4cG9ydHMuRnJhZ21lbnQgPSBGcmFnbWVudDtcbmV4cG9ydHMuTGF6eSA9IExhenk7XG5leHBvcnRzLk1lbW8gPSBNZW1vO1xuZXhwb3J0cy5Qb3J0YWwgPSBQb3J0YWw7XG5leHBvcnRzLlByb2ZpbGVyID0gUHJvZmlsZXI7XG5leHBvcnRzLlN0cmljdE1vZGUgPSBTdHJpY3RNb2RlO1xuZXhwb3J0cy5TdXNwZW5zZSA9IFN1c3BlbnNlO1xuZXhwb3J0cy5TdXNwZW5zZUxpc3QgPSBTdXNwZW5zZUxpc3Q7XG5leHBvcnRzLmlzQXN5bmNNb2RlID0gaXNBc3luY01vZGU7XG5leHBvcnRzLmlzQ29uY3VycmVudE1vZGUgPSBpc0NvbmN1cnJlbnRNb2RlO1xuZXhwb3J0cy5pc0NvbnRleHRDb25zdW1lciA9IGlzQ29udGV4dENvbnN1bWVyO1xuZXhwb3J0cy5pc0NvbnRleHRQcm92aWRlciA9IGlzQ29udGV4dFByb3ZpZGVyO1xuZXhwb3J0cy5pc0VsZW1lbnQgPSBpc0VsZW1lbnQ7XG5leHBvcnRzLmlzRm9yd2FyZFJlZiA9IGlzRm9yd2FyZFJlZjtcbmV4cG9ydHMuaXNGcmFnbWVudCA9IGlzRnJhZ21lbnQ7XG5leHBvcnRzLmlzTGF6eSA9IGlzTGF6eTtcbmV4cG9ydHMuaXNNZW1vID0gaXNNZW1vO1xuZXhwb3J0cy5pc1BvcnRhbCA9IGlzUG9ydGFsO1xuZXhwb3J0cy5pc1Byb2ZpbGVyID0gaXNQcm9maWxlcjtcbmV4cG9ydHMuaXNTdHJpY3RNb2RlID0gaXNTdHJpY3RNb2RlO1xuZXhwb3J0cy5pc1N1c3BlbnNlID0gaXNTdXNwZW5zZTtcbmV4cG9ydHMuaXNTdXNwZW5zZUxpc3QgPSBpc1N1c3BlbnNlTGlzdDtcbmV4cG9ydHMuaXNWYWxpZEVsZW1lbnRUeXBlID0gaXNWYWxpZEVsZW1lbnRUeXBlO1xuZXhwb3J0cy50eXBlT2YgPSB0eXBlT2Y7XG4gIH0pKCk7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWlzLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWlzLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QtanN4LXJ1bnRpbWUuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG4vLyBBVFRFTlRJT05cbi8vIFdoZW4gYWRkaW5nIG5ldyBzeW1ib2xzIHRvIHRoaXMgZmlsZSxcbi8vIFBsZWFzZSBjb25zaWRlciBhbHNvIGFkZGluZyB0byAncmVhY3QtZGV2dG9vbHMtc2hhcmVkL3NyYy9iYWNrZW5kL1JlYWN0U3ltYm9scydcbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLlxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKTtcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnBvcnRhbCcpO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mcmFnbWVudCcpO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpO1xudmFyIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm9maWxlcicpO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm92aWRlcicpO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbnRleHQnKTtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZm9yd2FyZF9yZWYnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2UnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0Jyk7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubWVtbycpO1xudmFyIFJFQUNUX0xBWllfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmxhenknKTtcbnZhciBSRUFDVF9PRkZTQ1JFRU5fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm9mZnNjcmVlbicpO1xudmFyIE1BWUJFX0lURVJBVE9SX1NZTUJPTCA9IFN5bWJvbC5pdGVyYXRvcjtcbnZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJztcbmZ1bmN0aW9uIGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkge1xuICBpZiAobWF5YmVJdGVyYWJsZSA9PT0gbnVsbCB8fCB0eXBlb2YgbWF5YmVJdGVyYWJsZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBtYXliZUl0ZXJhdG9yID0gTUFZQkVfSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbTUFZQkVfSVRFUkFUT1JfU1lNQk9MXSB8fCBtYXliZUl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXTtcblxuICBpZiAodHlwZW9mIG1heWJlSXRlcmF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbWF5YmVJdGVyYXRvcjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgUmVhY3RTaGFyZWRJbnRlcm5hbHMgPSBSZWFjdC5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRDtcblxuZnVuY3Rpb24gZXJyb3IoZm9ybWF0KSB7XG4gIHtcbiAgICB7XG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBhcmdzW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgfVxuXG4gICAgICBwcmludFdhcm5pbmcoJ2Vycm9yJywgZm9ybWF0LCBhcmdzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRXYXJuaW5nKGxldmVsLCBmb3JtYXQsIGFyZ3MpIHtcbiAgLy8gV2hlbiBjaGFuZ2luZyB0aGlzIGxvZ2ljLCB5b3UgbWlnaHQgd2FudCB0byBhbHNvXG4gIC8vIHVwZGF0ZSBjb25zb2xlV2l0aFN0YWNrRGV2Lnd3dy5qcyBhcyB3ZWxsLlxuICB7XG4gICAgdmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuICAgIHZhciBzdGFjayA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0U3RhY2tBZGRlbmR1bSgpO1xuXG4gICAgaWYgKHN0YWNrICE9PSAnJykge1xuICAgICAgZm9ybWF0ICs9ICclcyc7XG4gICAgICBhcmdzID0gYXJncy5jb25jYXQoW3N0YWNrXSk7XG4gICAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cblxuXG4gICAgdmFyIGFyZ3NXaXRoRm9ybWF0ID0gYXJncy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBTdHJpbmcoaXRlbSk7XG4gICAgfSk7IC8vIENhcmVmdWw6IFJOIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJlZml4XG5cbiAgICBhcmdzV2l0aEZvcm1hdC51bnNoaWZ0KCdXYXJuaW5nOiAnICsgZm9ybWF0KTsgLy8gV2UgaW50ZW50aW9uYWxseSBkb24ndCB1c2Ugc3ByZWFkIChvciAuYXBwbHkpIGRpcmVjdGx5IGJlY2F1c2UgaXRcbiAgICAvLyBicmVha3MgSUU5OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzNjEwXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZ1xuXG4gICAgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoY29uc29sZVtsZXZlbF0sIGNvbnNvbGUsIGFyZ3NXaXRoRm9ybWF0KTtcbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG52YXIgZW5hYmxlU2NvcGVBUEkgPSBmYWxzZTsgLy8gRXhwZXJpbWVudGFsIENyZWF0ZSBFdmVudCBIYW5kbGUgQVBJLlxudmFyIGVuYWJsZUNhY2hlRWxlbWVudCA9IGZhbHNlO1xudmFyIGVuYWJsZVRyYW5zaXRpb25UcmFjaW5nID0gZmFsc2U7IC8vIE5vIGtub3duIGJ1Z3MsIGJ1dCBuZWVkcyBwZXJmb3JtYW5jZSB0ZXN0aW5nXG5cbnZhciBlbmFibGVMZWdhY3lIaWRkZW4gPSBmYWxzZTsgLy8gRW5hYmxlcyB1bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFjayBmZWF0dXJlIGluIEZpYmVyXG4vLyBzdHVmZi4gSW50ZW5kZWQgdG8gZW5hYmxlIFJlYWN0IGNvcmUgbWVtYmVycyB0byBtb3JlIGVhc2lseSBkZWJ1ZyBzY2hlZHVsaW5nXG4vLyBpc3N1ZXMgaW4gREVWIGJ1aWxkcy5cblxudmFyIGVuYWJsZURlYnVnVHJhY2luZyA9IGZhbHNlOyAvLyBUcmFjayB3aGljaCBGaWJlcihzKSBzY2hlZHVsZSByZW5kZXIgd29yay5cblxudmFyIFJFQUNUX01PRFVMRV9SRUZFUkVOQ0U7XG5cbntcbiAgUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm1vZHVsZS5yZWZlcmVuY2UnKTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIE5vdGU6IHR5cGVvZiBtaWdodCBiZSBvdGhlciB0aGFuICdzeW1ib2wnIG9yICdudW1iZXInIChlLmcuIGlmIGl0J3MgYSBwb2x5ZmlsbCkuXG5cblxuICBpZiAodHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFIHx8IGVuYWJsZURlYnVnVHJhY2luZyAgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCBlbmFibGVMZWdhY3lIaWRkZW4gIHx8IHR5cGUgPT09IFJFQUNUX09GRlNDUkVFTl9UWVBFIHx8IGVuYWJsZVNjb3BlQVBJICB8fCBlbmFibGVDYWNoZUVsZW1lbnQgIHx8IGVuYWJsZVRyYW5zaXRpb25UcmFjaW5nICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCAvLyBUaGlzIG5lZWRzIHRvIGluY2x1ZGUgYWxsIHBvc3NpYmxlIG1vZHVsZSByZWZlcmVuY2Ugb2JqZWN0XG4gICAgLy8gdHlwZXMgc3VwcG9ydGVkIGJ5IGFueSBGbGlnaHQgY29uZmlndXJhdGlvbiBhbnl3aGVyZSBzaW5jZVxuICAgIC8vIHdlIGRvbid0IGtub3cgd2hpY2ggRmxpZ2h0IGJ1aWxkIHRoaXMgd2lsbCBlbmQgdXAgYmVpbmcgdXNlZFxuICAgIC8vIHdpdGguXG4gICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRSB8fCB0eXBlLmdldE1vZHVsZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0V3JhcHBlZE5hbWUob3V0ZXJUeXBlLCBpbm5lclR5cGUsIHdyYXBwZXJOYW1lKSB7XG4gIHZhciBkaXNwbGF5TmFtZSA9IG91dGVyVHlwZS5kaXNwbGF5TmFtZTtcblxuICBpZiAoZGlzcGxheU5hbWUpIHtcbiAgICByZXR1cm4gZGlzcGxheU5hbWU7XG4gIH1cblxuICB2YXIgZnVuY3Rpb25OYW1lID0gaW5uZXJUeXBlLmRpc3BsYXlOYW1lIHx8IGlubmVyVHlwZS5uYW1lIHx8ICcnO1xuICByZXR1cm4gZnVuY3Rpb25OYW1lICE9PSAnJyA/IHdyYXBwZXJOYW1lICsgXCIoXCIgKyBmdW5jdGlvbk5hbWUgKyBcIilcIiA6IHdyYXBwZXJOYW1lO1xufSAvLyBLZWVwIGluIHN5bmMgd2l0aCByZWFjdC1yZWNvbmNpbGVyL2dldENvbXBvbmVudE5hbWVGcm9tRmliZXJcblxuXG5mdW5jdGlvbiBnZXRDb250ZXh0TmFtZSh0eXBlKSB7XG4gIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8ICdDb250ZXh0Jztcbn0gLy8gTm90ZSB0aGF0IHRoZSByZWNvbmNpbGVyIHBhY2thZ2Ugc2hvdWxkIGdlbmVyYWxseSBwcmVmZXIgdG8gdXNlIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoKSBpbnN0ZWFkLlxuXG5cbmZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKSB7XG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICAvLyBIb3N0IHJvb3QsIHRleHQgbm9kZSBvciBqdXN0IGludmFsaWQgdHlwZS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHtcbiAgICBpZiAodHlwZW9mIHR5cGUudGFnID09PSAnbnVtYmVyJykge1xuICAgICAgZXJyb3IoJ1JlY2VpdmVkIGFuIHVuZXhwZWN0ZWQgb2JqZWN0IGluIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSgpLiAnICsgJ1RoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgbnVsbDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgIHJldHVybiAnRnJhZ21lbnQnO1xuXG4gICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgIHJldHVybiAnUG9ydGFsJztcblxuICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgIHJldHVybiAnUHJvZmlsZXInO1xuXG4gICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgcmV0dXJuICdTdHJpY3RNb2RlJztcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2UnO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlTGlzdCc7XG5cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuICAgICAgICB2YXIgY29udGV4dCA9IHR5cGU7XG4gICAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZShjb250ZXh0KSArICcuQ29uc3VtZXInO1xuXG4gICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgIHZhciBwcm92aWRlciA9IHR5cGU7XG4gICAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZShwcm92aWRlci5fY29udGV4dCkgKyAnLlByb3ZpZGVyJztcblxuICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZE5hbWUodHlwZSwgdHlwZS5yZW5kZXIsICdGb3J3YXJkUmVmJyk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICB2YXIgb3V0ZXJOYW1lID0gdHlwZS5kaXNwbGF5TmFtZSB8fCBudWxsO1xuXG4gICAgICAgIGlmIChvdXRlck5hbWUgIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gb3V0ZXJOYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlLnR5cGUpIHx8ICdNZW1vJztcblxuICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbGF6eUNvbXBvbmVudCA9IHR5cGU7XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGluaXQocGF5bG9hZCkpO1xuICAgICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxudmFyIGFzc2lnbiA9IE9iamVjdC5hc3NpZ247XG5cbi8vIEhlbHBlcnMgdG8gcGF0Y2ggY29uc29sZS5sb2dzIHRvIGF2b2lkIGxvZ2dpbmcgZHVyaW5nIHNpZGUtZWZmZWN0IGZyZWVcbi8vIHJlcGxheWluZyBvbiByZW5kZXIgZnVuY3Rpb24uIFRoaXMgY3VycmVudGx5IG9ubHkgcGF0Y2hlcyB0aGUgb2JqZWN0XG4vLyBsYXppbHkgd2hpY2ggd29uJ3QgY292ZXIgaWYgdGhlIGxvZyBmdW5jdGlvbiB3YXMgZXh0cmFjdGVkIGVhZ2VybHkuXG4vLyBXZSBjb3VsZCBhbHNvIGVhZ2VybHkgcGF0Y2ggdGhlIG1ldGhvZC5cbnZhciBkaXNhYmxlZERlcHRoID0gMDtcbnZhciBwcmV2TG9nO1xudmFyIHByZXZJbmZvO1xudmFyIHByZXZXYXJuO1xudmFyIHByZXZFcnJvcjtcbnZhciBwcmV2R3JvdXA7XG52YXIgcHJldkdyb3VwQ29sbGFwc2VkO1xudmFyIHByZXZHcm91cEVuZDtcblxuZnVuY3Rpb24gZGlzYWJsZWRMb2coKSB7fVxuXG5kaXNhYmxlZExvZy5fX3JlYWN0RGlzYWJsZWRMb2cgPSB0cnVlO1xuZnVuY3Rpb24gZGlzYWJsZUxvZ3MoKSB7XG4gIHtcbiAgICBpZiAoZGlzYWJsZWREZXB0aCA9PT0gMCkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgICBwcmV2TG9nID0gY29uc29sZS5sb2c7XG4gICAgICBwcmV2SW5mbyA9IGNvbnNvbGUuaW5mbztcbiAgICAgIHByZXZXYXJuID0gY29uc29sZS53YXJuO1xuICAgICAgcHJldkVycm9yID0gY29uc29sZS5lcnJvcjtcbiAgICAgIHByZXZHcm91cCA9IGNvbnNvbGUuZ3JvdXA7XG4gICAgICBwcmV2R3JvdXBDb2xsYXBzZWQgPSBjb25zb2xlLmdyb3VwQ29sbGFwc2VkO1xuICAgICAgcHJldkdyb3VwRW5kID0gY29uc29sZS5ncm91cEVuZDsgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xOTA5OVxuXG4gICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IGRpc2FibGVkTG9nLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBpbmZvOiBwcm9wcyxcbiAgICAgICAgbG9nOiBwcm9wcyxcbiAgICAgICAgd2FybjogcHJvcHMsXG4gICAgICAgIGVycm9yOiBwcm9wcyxcbiAgICAgICAgZ3JvdXA6IHByb3BzLFxuICAgICAgICBncm91cENvbGxhcHNlZDogcHJvcHMsXG4gICAgICAgIGdyb3VwRW5kOiBwcm9wc1xuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGRpc2FibGVkRGVwdGgrKztcbiAgfVxufVxuZnVuY3Rpb24gcmVlbmFibGVMb2dzKCkge1xuICB7XG4gICAgZGlzYWJsZWREZXB0aC0tO1xuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lIEZsb3cgdGhpbmtzIGNvbnNvbGUgaXMgaW1tdXRhYmxlLlxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjb25zb2xlLCB7XG4gICAgICAgIGxvZzogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2TG9nXG4gICAgICAgIH0pLFxuICAgICAgICBpbmZvOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZJbmZvXG4gICAgICAgIH0pLFxuICAgICAgICB3YXJuOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZXYXJuXG4gICAgICAgIH0pLFxuICAgICAgICBlcnJvcjogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2RXJyb3JcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cFxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwQ29sbGFwc2VkXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cEVuZDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBFbmRcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICB9XG5cbiAgICBpZiAoZGlzYWJsZWREZXB0aCA8IDApIHtcbiAgICAgIGVycm9yKCdkaXNhYmxlZERlcHRoIGZlbGwgYmVsb3cgemVyby4gJyArICdUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyO1xudmFyIHByZWZpeDtcbmZ1bmN0aW9uIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUsIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgaWYgKHByZWZpeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBFeHRyYWN0IHRoZSBWTSBzcGVjaWZpYyBwcmVmaXggdXNlZCBieSBlYWNoIGxpbmUuXG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICB2YXIgbWF0Y2ggPSB4LnN0YWNrLnRyaW0oKS5tYXRjaCgvXFxuKCAqKGF0ICk/KS8pO1xuICAgICAgICBwcmVmaXggPSBtYXRjaCAmJiBtYXRjaFsxXSB8fCAnJztcbiAgICAgIH1cbiAgICB9IC8vIFdlIHVzZSB0aGUgcHJlZml4IHRvIGVuc3VyZSBvdXIgc3RhY2tzIGxpbmUgdXAgd2l0aCBuYXRpdmUgc3RhY2sgZnJhbWVzLlxuXG5cbiAgICByZXR1cm4gJ1xcbicgKyBwcmVmaXggKyBuYW1lO1xuICB9XG59XG52YXIgcmVlbnRyeSA9IGZhbHNlO1xudmFyIGNvbXBvbmVudEZyYW1lQ2FjaGU7XG5cbntcbiAgdmFyIFBvc3NpYmx5V2Vha01hcCA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nID8gV2Vha01hcCA6IE1hcDtcbiAgY29tcG9uZW50RnJhbWVDYWNoZSA9IG5ldyBQb3NzaWJseVdlYWtNYXAoKTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShmbiwgY29uc3RydWN0KSB7XG4gIC8vIElmIHNvbWV0aGluZyBhc2tlZCBmb3IgYSBzdGFjayBpbnNpZGUgYSBmYWtlIHJlbmRlciwgaXQgc2hvdWxkIGdldCBpZ25vcmVkLlxuICBpZiAoICFmbiB8fCByZWVudHJ5KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAge1xuICAgIHZhciBmcmFtZSA9IGNvbXBvbmVudEZyYW1lQ2FjaGUuZ2V0KGZuKTtcblxuICAgIGlmIChmcmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZnJhbWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbnRyb2w7XG4gIHJlZW50cnkgPSB0cnVlO1xuICB2YXIgcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZSA9IEVycm9yLnByZXBhcmVTdGFja1RyYWNlOyAvLyAkRmxvd0ZpeE1lIEl0IGRvZXMgYWNjZXB0IHVuZGVmaW5lZC5cblxuICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHVuZGVmaW5lZDtcbiAgdmFyIHByZXZpb3VzRGlzcGF0Y2hlcjtcblxuICB7XG4gICAgcHJldmlvdXNEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50OyAvLyBTZXQgdGhlIGRpc3BhdGNoZXIgaW4gREVWIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBjYWxsIGluIHRoZSByZW5kZXIgZnVuY3Rpb25cbiAgICAvLyBmb3Igd2FybmluZ3MuXG5cbiAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQgPSBudWxsO1xuICAgIGRpc2FibGVMb2dzKCk7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIFRoaXMgc2hvdWxkIHRocm93LlxuICAgIGlmIChjb25zdHJ1Y3QpIHtcbiAgICAgIC8vIFNvbWV0aGluZyBzaG91bGQgYmUgc2V0dGluZyB0aGUgcHJvcHMgaW4gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAgdmFyIEZha2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lXG5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZha2UucHJvdG90eXBlLCAncHJvcHMnLCB7XG4gICAgICAgIHNldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIFdlIHVzZSBhIHRocm93aW5nIHNldHRlciBpbnN0ZWFkIG9mIGZyb3plbiBvciBub24td3JpdGFibGUgcHJvcHNcbiAgICAgICAgICAvLyBiZWNhdXNlIHRoYXQgd29uJ3QgdGhyb3cgaW4gYSBub24tc3RyaWN0IG1vZGUgZnVuY3Rpb24uXG4gICAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgJiYgUmVmbGVjdC5jb25zdHJ1Y3QpIHtcbiAgICAgICAgLy8gV2UgY29uc3RydWN0IGEgZGlmZmVyZW50IGNvbnRyb2wgZm9yIHRoaXMgY2FzZSB0byBpbmNsdWRlIGFueSBleHRyYVxuICAgICAgICAvLyBmcmFtZXMgYWRkZWQgYnkgdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICB0cnkge1xuICAgICAgICAgIFJlZmxlY3QuY29uc3RydWN0KEZha2UsIFtdKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgICB9XG5cbiAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoZm4sIFtdLCBGYWtlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgRmFrZS5jYWxsKCk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZuLmNhbGwoRmFrZS5wcm90b3R5cGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICBjb250cm9sID0geDtcbiAgICAgIH1cblxuICAgICAgZm4oKTtcbiAgICB9XG4gIH0gY2F0Y2ggKHNhbXBsZSkge1xuICAgIC8vIFRoaXMgaXMgaW5saW5lZCBtYW51YWxseSBiZWNhdXNlIGNsb3N1cmUgZG9lc24ndCBkbyBpdCBmb3IgdXMuXG4gICAgaWYgKHNhbXBsZSAmJiBjb250cm9sICYmIHR5cGVvZiBzYW1wbGUuc3RhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBUaGlzIGV4dHJhY3RzIHRoZSBmaXJzdCBmcmFtZSBmcm9tIHRoZSBzYW1wbGUgdGhhdCBpc24ndCBhbHNvIGluIHRoZSBjb250cm9sLlxuICAgICAgLy8gU2tpcHBpbmcgb25lIGZyYW1lIHRoYXQgd2UgYXNzdW1lIGlzIHRoZSBmcmFtZSB0aGF0IGNhbGxzIHRoZSB0d28uXG4gICAgICB2YXIgc2FtcGxlTGluZXMgPSBzYW1wbGUuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIGNvbnRyb2xMaW5lcyA9IGNvbnRyb2wuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIHMgPSBzYW1wbGVMaW5lcy5sZW5ndGggLSAxO1xuICAgICAgdmFyIGMgPSBjb250cm9sTGluZXMubGVuZ3RoIC0gMTtcblxuICAgICAgd2hpbGUgKHMgPj0gMSAmJiBjID49IDAgJiYgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAvLyBXZSBleHBlY3QgYXQgbGVhc3Qgb25lIHN0YWNrIGZyYW1lIHRvIGJlIHNoYXJlZC5cbiAgICAgICAgLy8gVHlwaWNhbGx5IHRoaXMgd2lsbCBiZSB0aGUgcm9vdCBtb3N0IG9uZS4gSG93ZXZlciwgc3RhY2sgZnJhbWVzIG1heSBiZVxuICAgICAgICAvLyBjdXQgb2ZmIGR1ZSB0byBtYXhpbXVtIHN0YWNrIGxpbWl0cy4gSW4gdGhpcyBjYXNlLCBvbmUgbWF5YmUgY3V0IG9mZlxuICAgICAgICAvLyBlYXJsaWVyIHRoYW4gdGhlIG90aGVyLiBXZSBhc3N1bWUgdGhhdCB0aGUgc2FtcGxlIGlzIGxvbmdlciBvciB0aGUgc2FtZVxuICAgICAgICAvLyBhbmQgdGhlcmUgZm9yIGN1dCBvZmYgZWFybGllci4gU28gd2Ugc2hvdWxkIGZpbmQgdGhlIHJvb3QgbW9zdCBmcmFtZSBpblxuICAgICAgICAvLyB0aGUgc2FtcGxlIHNvbWV3aGVyZSBpbiB0aGUgY29udHJvbC5cbiAgICAgICAgYy0tO1xuICAgICAgfVxuXG4gICAgICBmb3IgKDsgcyA+PSAxICYmIGMgPj0gMDsgcy0tLCBjLS0pIHtcbiAgICAgICAgLy8gTmV4dCB3ZSBmaW5kIHRoZSBmaXJzdCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSB3aGljaCBzaG91bGQgYmUgdGhlXG4gICAgICAgIC8vIGZyYW1lIHRoYXQgY2FsbGVkIG91ciBzYW1wbGUgZnVuY3Rpb24gYW5kIHRoZSBjb250cm9sLlxuICAgICAgICBpZiAoc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgIC8vIEluIFY4LCB0aGUgZmlyc3QgbGluZSBpcyBkZXNjcmliaW5nIHRoZSBtZXNzYWdlIGJ1dCBvdGhlciBWTXMgZG9uJ3QuXG4gICAgICAgICAgLy8gSWYgd2UncmUgYWJvdXQgdG8gcmV0dXJuIHRoZSBmaXJzdCBsaW5lLCBhbmQgdGhlIGNvbnRyb2wgaXMgYWxzbyBvbiB0aGUgc2FtZVxuICAgICAgICAgIC8vIGxpbmUsIHRoYXQncyBhIHByZXR0eSBnb29kIGluZGljYXRvciB0aGF0IG91ciBzYW1wbGUgdGhyZXcgYXQgc2FtZSBsaW5lIGFzXG4gICAgICAgICAgLy8gdGhlIGNvbnRyb2wuIEkuZS4gYmVmb3JlIHdlIGVudGVyZWQgdGhlIHNhbXBsZSBmcmFtZS4gU28gd2UgaWdub3JlIHRoaXMgcmVzdWx0LlxuICAgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiB5b3UgcGFzc2VkIGEgY2xhc3MgdG8gZnVuY3Rpb24gY29tcG9uZW50LCBvciBub24tZnVuY3Rpb24uXG4gICAgICAgICAgaWYgKHMgIT09IDEgfHwgYyAhPT0gMSkge1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBzLS07XG4gICAgICAgICAgICAgIGMtLTsgLy8gV2UgbWF5IHN0aWxsIGhhdmUgc2ltaWxhciBpbnRlcm1lZGlhdGUgZnJhbWVzIGZyb20gdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICAgICAgICAvLyBUaGUgbmV4dCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSBzaG91bGQgYmUgb3VyIG1hdGNoIHRob3VnaC5cblxuICAgICAgICAgICAgICBpZiAoYyA8IDAgfHwgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgICAgICAgIC8vIFY4IGFkZHMgYSBcIm5ld1wiIHByZWZpeCBmb3IgbmF0aXZlIGNsYXNzZXMuIExldCdzIHJlbW92ZSBpdCB0byBtYWtlIGl0IHByZXR0aWVyLlxuICAgICAgICAgICAgICAgIHZhciBfZnJhbWUgPSAnXFxuJyArIHNhbXBsZUxpbmVzW3NdLnJlcGxhY2UoJyBhdCBuZXcgJywgJyBhdCAnKTsgLy8gSWYgb3VyIGNvbXBvbmVudCBmcmFtZSBpcyBsYWJlbGVkIFwiPGFub255bW91cz5cIlxuICAgICAgICAgICAgICAgIC8vIGJ1dCB3ZSBoYXZlIGEgdXNlci1wcm92aWRlZCBcImRpc3BsYXlOYW1lXCJcbiAgICAgICAgICAgICAgICAvLyBzcGxpY2UgaXQgaW4gdG8gbWFrZSB0aGUgc3RhY2sgbW9yZSByZWFkYWJsZS5cblxuXG4gICAgICAgICAgICAgICAgaWYgKGZuLmRpc3BsYXlOYW1lICYmIF9mcmFtZS5pbmNsdWRlcygnPGFub255bW91cz4nKSkge1xuICAgICAgICAgICAgICAgICAgX2ZyYW1lID0gX2ZyYW1lLnJlcGxhY2UoJzxhbm9ueW1vdXM+JywgZm4uZGlzcGxheU5hbWUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIF9mcmFtZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSAvLyBSZXR1cm4gdGhlIGxpbmUgd2UgZm91bmQuXG5cblxuICAgICAgICAgICAgICAgIHJldHVybiBfZnJhbWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gd2hpbGUgKHMgPj0gMSAmJiBjID49IDApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHJlZW50cnkgPSBmYWxzZTtcblxuICAgIHtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudCA9IHByZXZpb3VzRGlzcGF0Y2hlcjtcbiAgICAgIHJlZW5hYmxlTG9ncygpO1xuICAgIH1cblxuICAgIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZTtcbiAgfSAvLyBGYWxsYmFjayB0byBqdXN0IHVzaW5nIHRoZSBuYW1lIGlmIHdlIGNvdWxkbid0IG1ha2UgaXQgdGhyb3cuXG5cblxuICB2YXIgbmFtZSA9IGZuID8gZm4uZGlzcGxheU5hbWUgfHwgZm4ubmFtZSA6ICcnO1xuICB2YXIgc3ludGhldGljRnJhbWUgPSBuYW1lID8gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSkgOiAnJztcblxuICB7XG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIHN5bnRoZXRpY0ZyYW1lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3ludGhldGljRnJhbWU7XG59XG5mdW5jdGlvbiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZm4sIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGZhbHNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QoQ29tcG9uZW50KSB7XG4gIHZhciBwcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICByZXR1cm4gISEocHJvdG90eXBlICYmIHByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUsIHNvdXJjZSwgb3duZXJGbikge1xuXG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB7XG4gICAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZSh0eXBlLCBzaG91bGRDb25zdHJ1Y3QodHlwZSkpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUodHlwZSk7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlJyk7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2VMaXN0Jyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUodHlwZS5yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgLy8gTWVtbyBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLnR5cGUsIHNvdXJjZSwgb3duZXJGbik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSB0eXBlO1xuICAgICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gTGF6eSBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgICAgIHJldHVybiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoaW5pdChwYXlsb2FkKSwgc291cmNlLCBvd25lckZuKTtcbiAgICAgICAgICB9IGNhdGNoICh4KSB7fVxuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgbG9nZ2VkVHlwZUZhaWx1cmVzID0ge307XG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG5cbmZ1bmN0aW9uIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgIHZhciBzdGFjayA9IGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihlbGVtZW50LnR5cGUsIGVsZW1lbnQuX3NvdXJjZSwgb3duZXIgPyBvd25lci50eXBlIDogbnVsbCk7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLnNldEV4dHJhU3RhY2tGcmFtZShzdGFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuc2V0RXh0cmFTdGFja0ZyYW1lKG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja1Byb3BUeXBlcyh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24sIGNvbXBvbmVudE5hbWUsIGVsZW1lbnQpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWUgVGhpcyBpcyBva2F5IGJ1dCBGbG93IGRvZXNuJ3Qga25vdyBpdC5cbiAgICB2YXIgaGFzID0gRnVuY3Rpb24uY2FsbC5iaW5kKGhhc093blByb3BlcnR5KTtcblxuICAgIGZvciAodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHtcbiAgICAgIGlmIChoYXModHlwZVNwZWNzLCB0eXBlU3BlY05hbWUpKSB7XG4gICAgICAgIHZhciBlcnJvciQxID0gdm9pZCAwOyAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuXG4gICAgICAgIC8vIEFmdGVyIHRoZXNlIGhhdmUgYmVlbiBjbGVhbmVkIHVwLCB3ZSdsbCBsZXQgdGhlbSB0aHJvdy5cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhbiBpbnZhcmlhbnQgdGhhdCBnZXRzIGNhdWdodC4gSXQncyB0aGUgc2FtZVxuICAgICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS5cbiAgICAgICAgICBpZiAodHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgICAgICAgdmFyIGVyciA9IEVycm9yKChjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycpICsgJzogJyArIGxvY2F0aW9uICsgJyB0eXBlIGAnICsgdHlwZVNwZWNOYW1lICsgJ2AgaXMgaW52YWxpZDsgJyArICdpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UsIGJ1dCByZWNlaXZlZCBgJyArIHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSArICdgLicgKyAnVGhpcyBvZnRlbiBoYXBwZW5zIGJlY2F1c2Ugb2YgdHlwb3Mgc3VjaCBhcyBgUHJvcFR5cGVzLmZ1bmN0aW9uYCBpbnN0ZWFkIG9mIGBQcm9wVHlwZXMuZnVuY2AuJyk7XG4gICAgICAgICAgICBlcnIubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlcnJvciQxID0gdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0odmFsdWVzLCB0eXBlU3BlY05hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBudWxsLCAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnKTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICBlcnJvciQxID0gZXg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IkMSAmJiAhKGVycm9yJDEgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgIGVycm9yKCclczogdHlwZSBzcGVjaWZpY2F0aW9uIG9mICVzJyArICcgYCVzYCBpcyBpbnZhbGlkOyB0aGUgdHlwZSBjaGVja2VyICcgKyAnZnVuY3Rpb24gbXVzdCByZXR1cm4gYG51bGxgIG9yIGFuIGBFcnJvcmAgYnV0IHJldHVybmVkIGEgJXMuICcgKyAnWW91IG1heSBoYXZlIGZvcmdvdHRlbiB0byBwYXNzIGFuIGFyZ3VtZW50IHRvIHRoZSB0eXBlIGNoZWNrZXIgJyArICdjcmVhdG9yIChhcnJheU9mLCBpbnN0YW5jZU9mLCBvYmplY3RPZiwgb25lT2YsIG9uZU9mVHlwZSwgYW5kICcgKyAnc2hhcGUgYWxsIHJlcXVpcmUgYW4gYXJndW1lbnQpLicsIGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJywgbG9jYXRpb24sIHR5cGVTcGVjTmFtZSwgdHlwZW9mIGVycm9yJDEpO1xuXG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IkMSBpbnN0YW5jZW9mIEVycm9yICYmICEoZXJyb3IkMS5tZXNzYWdlIGluIGxvZ2dlZFR5cGVGYWlsdXJlcykpIHtcbiAgICAgICAgICAvLyBPbmx5IG1vbml0b3IgdGhpcyBmYWlsdXJlIG9uY2UgYmVjYXVzZSB0aGVyZSB0ZW5kcyB0byBiZSBhIGxvdCBvZiB0aGVcbiAgICAgICAgICAvLyBzYW1lIGVycm9yLlxuICAgICAgICAgIGxvZ2dlZFR5cGVGYWlsdXJlc1tlcnJvciQxLm1lc3NhZ2VdID0gdHJ1ZTtcbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgIGVycm9yKCdGYWlsZWQgJXMgdHlwZTogJXMnLCBsb2NhdGlvbiwgZXJyb3IkMS5tZXNzYWdlKTtcblxuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBpc0FycmF5SW1wbCA9IEFycmF5LmlzQXJyYXk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZWRlY2xhcmVcblxuZnVuY3Rpb24gaXNBcnJheShhKSB7XG4gIHJldHVybiBpc0FycmF5SW1wbChhKTtcbn1cblxuLypcbiAqIFRoZSBgJycgKyB2YWx1ZWAgcGF0dGVybiAodXNlZCBpbiBpbiBwZXJmLXNlbnNpdGl2ZSBjb2RlKSB0aHJvd3MgZm9yIFN5bWJvbFxuICogYW5kIFRlbXBvcmFsLiogdHlwZXMuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8yMjA2NC5cbiAqXG4gKiBUaGUgZnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlIHdpbGwgdGhyb3cgYW4gZWFzaWVyLXRvLXVuZGVyc3RhbmQsXG4gKiBlYXNpZXItdG8tZGVidWcgZXhjZXB0aW9uIHdpdGggYSBjbGVhciBlcnJvcnMgbWVzc2FnZSBtZXNzYWdlIGV4cGxhaW5pbmcgdGhlXG4gKiBwcm9ibGVtLiAoSW5zdGVhZCBvZiBhIGNvbmZ1c2luZyBleGNlcHRpb24gdGhyb3duIGluc2lkZSB0aGUgaW1wbGVtZW50YXRpb25cbiAqIG9mIHRoZSBgdmFsdWVgIG9iamVjdCkuXG4gKi9cbi8vICRGbG93Rml4TWUgb25seSBjYWxsZWQgaW4gREVWLCBzbyB2b2lkIHJldHVybiBpcyBub3QgcG9zc2libGUuXG5mdW5jdGlvbiB0eXBlTmFtZSh2YWx1ZSkge1xuICB7XG4gICAgLy8gdG9TdHJpbmdUYWcgaXMgbmVlZGVkIGZvciBuYW1lc3BhY2VkIHR5cGVzIGxpa2UgVGVtcG9yYWwuSW5zdGFudFxuICAgIHZhciBoYXNUb1N0cmluZ1RhZyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLnRvU3RyaW5nVGFnO1xuICAgIHZhciB0eXBlID0gaGFzVG9TdHJpbmdUYWcgJiYgdmFsdWVbU3ltYm9sLnRvU3RyaW5nVGFnXSB8fCB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lIHx8ICdPYmplY3QnO1xuICAgIHJldHVybiB0eXBlO1xuICB9XG59IC8vICRGbG93Rml4TWUgb25seSBjYWxsZWQgaW4gREVWLCBzbyB2b2lkIHJldHVybiBpcyBub3QgcG9zc2libGUuXG5cblxuZnVuY3Rpb24gd2lsbENvZXJjaW9uVGhyb3codmFsdWUpIHtcbiAge1xuICAgIHRyeSB7XG4gICAgICB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAgLy8gSWYgeW91IGVuZGVkIHVwIGhlcmUgYnkgZm9sbG93aW5nIGFuIGV4Y2VwdGlvbiBjYWxsIHN0YWNrLCBoZXJlJ3Mgd2hhdCdzXG4gIC8vIGhhcHBlbmVkOiB5b3Ugc3VwcGxpZWQgYW4gb2JqZWN0IG9yIHN5bWJvbCB2YWx1ZSB0byBSZWFjdCAoYXMgYSBwcm9wLCBrZXksXG4gIC8vIERPTSBhdHRyaWJ1dGUsIENTUyBwcm9wZXJ0eSwgc3RyaW5nIHJlZiwgZXRjLikgYW5kIHdoZW4gUmVhY3QgdHJpZWQgdG9cbiAgLy8gY29lcmNlIGl0IHRvIGEgc3RyaW5nIHVzaW5nIGAnJyArIHZhbHVlYCwgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uXG4gIC8vXG4gIC8vIFRoZSBtb3N0IGNvbW1vbiB0eXBlcyB0aGF0IHdpbGwgY2F1c2UgdGhpcyBleGNlcHRpb24gYXJlIGBTeW1ib2xgIGluc3RhbmNlc1xuICAvLyBhbmQgVGVtcG9yYWwgb2JqZWN0cyBsaWtlIGBUZW1wb3JhbC5JbnN0YW50YC4gQnV0IGFueSBvYmplY3QgdGhhdCBoYXMgYVxuICAvLyBgdmFsdWVPZmAgb3IgYFtTeW1ib2wudG9QcmltaXRpdmVdYCBtZXRob2QgdGhhdCB0aHJvd3Mgd2lsbCBhbHNvIGNhdXNlIHRoaXNcbiAgLy8gZXhjZXB0aW9uLiAoTGlicmFyeSBhdXRob3JzIGRvIHRoaXMgdG8gcHJldmVudCB1c2VycyBmcm9tIHVzaW5nIGJ1aWx0LWluXG4gIC8vIG51bWVyaWMgb3BlcmF0b3JzIGxpa2UgYCtgIG9yIGNvbXBhcmlzb24gb3BlcmF0b3JzIGxpa2UgYD49YCBiZWNhdXNlIGN1c3RvbVxuICAvLyBtZXRob2RzIGFyZSBuZWVkZWQgdG8gcGVyZm9ybSBhY2N1cmF0ZSBhcml0aG1ldGljIG9yIGNvbXBhcmlzb24uKVxuICAvL1xuICAvLyBUbyBmaXggdGhlIHByb2JsZW0sIGNvZXJjZSB0aGlzIG9iamVjdCBvciBzeW1ib2wgdmFsdWUgdG8gYSBzdHJpbmcgYmVmb3JlXG4gIC8vIHBhc3NpbmcgaXQgdG8gUmVhY3QuIFRoZSBtb3N0IHJlbGlhYmxlIHdheSBpcyB1c3VhbGx5IGBTdHJpbmcodmFsdWUpYC5cbiAgLy9cbiAgLy8gVG8gZmluZCB3aGljaCB2YWx1ZSBpcyB0aHJvd2luZywgY2hlY2sgdGhlIGJyb3dzZXIgb3IgZGVidWdnZXIgY29uc29sZS5cbiAgLy8gQmVmb3JlIHRoaXMgZXhjZXB0aW9uIHdhcyB0aHJvd24sIHRoZXJlIHNob3VsZCBiZSBgY29uc29sZS5lcnJvcmAgb3V0cHV0XG4gIC8vIHRoYXQgc2hvd3MgdGhlIHR5cGUgKFN5bWJvbCwgVGVtcG9yYWwuUGxhaW5EYXRlLCBldGMuKSB0aGF0IGNhdXNlZCB0aGVcbiAgLy8gcHJvYmxlbSBhbmQgaG93IHRoYXQgdHlwZSB3YXMgdXNlZDoga2V5LCBhdHJyaWJ1dGUsIGlucHV0IHZhbHVlIHByb3AsIGV0Yy5cbiAgLy8gSW4gbW9zdCBjYXNlcywgdGhpcyBjb25zb2xlIG91dHB1dCBhbHNvIHNob3dzIHRoZSBjb21wb25lbnQgYW5kIGl0c1xuICAvLyBhbmNlc3RvciBjb21wb25lbnRzIHdoZXJlIHRoZSBleGNlcHRpb24gaGFwcGVuZWQuXG4gIC8vXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICByZXR1cm4gJycgKyB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAge1xuICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdUaGUgcHJvdmlkZWQga2V5IGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50T3duZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRPd25lcjtcbnZhciBSRVNFUlZFRF9QUk9QUyA9IHtcbiAga2V5OiB0cnVlLFxuICByZWY6IHRydWUsXG4gIF9fc2VsZjogdHJ1ZSxcbiAgX19zb3VyY2U6IHRydWVcbn07XG52YXIgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd247XG52YXIgc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd247XG52YXIgZGlkV2FybkFib3V0U3RyaW5nUmVmcztcblxue1xuICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzID0ge307XG59XG5cbmZ1bmN0aW9uIGhhc1ZhbGlkUmVmKGNvbmZpZykge1xuICB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAncmVmJykpIHtcbiAgICAgIHZhciBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgJ3JlZicpLmdldDtcblxuICAgICAgaWYgKGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb25maWcucmVmICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGhhc1ZhbGlkS2V5KGNvbmZpZykge1xuICB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAna2V5JykpIHtcbiAgICAgIHZhciBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgJ2tleScpLmdldDtcblxuICAgICAgaWYgKGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb25maWcua2V5ICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHdhcm5JZlN0cmluZ1JlZkNhbm5vdEJlQXV0b0NvbnZlcnRlZChjb25maWcsIHNlbGYpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgY29uZmlnLnJlZiA9PT0gJ3N0cmluZycgJiYgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCAmJiBzZWxmICYmIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQuc3RhdGVOb2RlICE9PSBzZWxmKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnR5cGUpO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZXJyb3IoJ0NvbXBvbmVudCBcIiVzXCIgY29udGFpbnMgdGhlIHN0cmluZyByZWYgXCIlc1wiLiAnICsgJ1N1cHBvcnQgZm9yIHN0cmluZyByZWZzIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiAnICsgJ1RoaXMgY2FzZSBjYW5ub3QgYmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gYW4gYXJyb3cgZnVuY3Rpb24uICcgKyAnV2UgYXNrIHlvdSB0byBtYW51YWxseSBmaXggdGhpcyBjYXNlIGJ5IHVzaW5nIHVzZVJlZigpIG9yIGNyZWF0ZVJlZigpIGluc3RlYWQuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1zdHJpbmctcmVmJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQudHlwZSksIGNvbmZpZy5yZWYpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkZWZpbmVLZXlQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpIHtcbiAge1xuICAgIHZhciB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIXNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duKSB7XG4gICAgICAgIHNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignJXM6IGBrZXlgIGlzIG5vdCBhIHByb3AuIFRyeWluZyB0byBhY2Nlc3MgaXQgd2lsbCByZXN1bHQgJyArICdpbiBgdW5kZWZpbmVkYCBiZWluZyByZXR1cm5lZC4gSWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBzYW1lICcgKyAndmFsdWUgd2l0aGluIHRoZSBjaGlsZCBjb21wb25lbnQsIHlvdSBzaG91bGQgcGFzcyBpdCBhcyBhIGRpZmZlcmVudCAnICsgJ3Byb3AuIChodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3BlY2lhbC1wcm9wcyknLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHdhcm5BYm91dEFjY2Vzc2luZ0tleS5pc1JlYWN0V2FybmluZyA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3BzLCAna2V5Jywge1xuICAgICAgZ2V0OiB3YXJuQWJvdXRBY2Nlc3NpbmdLZXksXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZWZpbmVSZWZQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpIHtcbiAge1xuICAgIHZhciB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIXNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duKSB7XG4gICAgICAgIHNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignJXM6IGByZWZgIGlzIG5vdCBhIHByb3AuIFRyeWluZyB0byBhY2Nlc3MgaXQgd2lsbCByZXN1bHQgJyArICdpbiBgdW5kZWZpbmVkYCBiZWluZyByZXR1cm5lZC4gSWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBzYW1lICcgKyAndmFsdWUgd2l0aGluIHRoZSBjaGlsZCBjb21wb25lbnQsIHlvdSBzaG91bGQgcGFzcyBpdCBhcyBhIGRpZmZlcmVudCAnICsgJ3Byb3AuIChodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3BlY2lhbC1wcm9wcyknLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHdhcm5BYm91dEFjY2Vzc2luZ1JlZi5pc1JlYWN0V2FybmluZyA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3BzLCAncmVmJywge1xuICAgICAgZ2V0OiB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgfVxufVxuLyoqXG4gKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgUmVhY3QgZWxlbWVudC4gVGhpcyBubyBsb25nZXIgYWRoZXJlcyB0b1xuICogdGhlIGNsYXNzIHBhdHRlcm4sIHNvIGRvIG5vdCB1c2UgbmV3IHRvIGNhbGwgaXQuIEFsc28sIGluc3RhbmNlb2YgY2hlY2tcbiAqIHdpbGwgbm90IHdvcmsuIEluc3RlYWQgdGVzdCAkJHR5cGVvZiBmaWVsZCBhZ2FpbnN0IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSB0byBjaGVja1xuICogaWYgc29tZXRoaW5nIGlzIGEgUmVhY3QgRWxlbWVudC5cbiAqXG4gKiBAcGFyYW0geyp9IHR5cGVcbiAqIEBwYXJhbSB7Kn0gcHJvcHNcbiAqIEBwYXJhbSB7Kn0ga2V5XG4gKiBAcGFyYW0ge3N0cmluZ3xvYmplY3R9IHJlZlxuICogQHBhcmFtIHsqfSBvd25lclxuICogQHBhcmFtIHsqfSBzZWxmIEEgKnRlbXBvcmFyeSogaGVscGVyIHRvIGRldGVjdCBwbGFjZXMgd2hlcmUgYHRoaXNgIGlzXG4gKiBkaWZmZXJlbnQgZnJvbSB0aGUgYG93bmVyYCB3aGVuIFJlYWN0LmNyZWF0ZUVsZW1lbnQgaXMgY2FsbGVkLCBzbyB0aGF0IHdlXG4gKiBjYW4gd2Fybi4gV2Ugd2FudCB0byBnZXQgcmlkIG9mIG93bmVyIGFuZCByZXBsYWNlIHN0cmluZyBgcmVmYHMgd2l0aCBhcnJvd1xuICogZnVuY3Rpb25zLCBhbmQgYXMgbG9uZyBhcyBgdGhpc2AgYW5kIG93bmVyIGFyZSB0aGUgc2FtZSwgdGhlcmUgd2lsbCBiZSBub1xuICogY2hhbmdlIGluIGJlaGF2aW9yLlxuICogQHBhcmFtIHsqfSBzb3VyY2UgQW4gYW5ub3RhdGlvbiBvYmplY3QgKGFkZGVkIGJ5IGEgdHJhbnNwaWxlciBvciBvdGhlcndpc2UpXG4gKiBpbmRpY2F0aW5nIGZpbGVuYW1lLCBsaW5lIG51bWJlciwgYW5kL29yIG90aGVyIGluZm9ybWF0aW9uLlxuICogQGludGVybmFsXG4gKi9cblxuXG52YXIgUmVhY3RFbGVtZW50ID0gZnVuY3Rpb24gKHR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIG93bmVyLCBwcm9wcykge1xuICB2YXIgZWxlbWVudCA9IHtcbiAgICAvLyBUaGlzIHRhZyBhbGxvd3MgdXMgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcyBhcyBhIFJlYWN0IEVsZW1lbnRcbiAgICAkJHR5cGVvZjogUkVBQ1RfRUxFTUVOVF9UWVBFLFxuICAgIC8vIEJ1aWx0LWluIHByb3BlcnRpZXMgdGhhdCBiZWxvbmcgb24gdGhlIGVsZW1lbnRcbiAgICB0eXBlOiB0eXBlLFxuICAgIGtleToga2V5LFxuICAgIHJlZjogcmVmLFxuICAgIHByb3BzOiBwcm9wcyxcbiAgICAvLyBSZWNvcmQgdGhlIGNvbXBvbmVudCByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhpcyBlbGVtZW50LlxuICAgIF9vd25lcjogb3duZXJcbiAgfTtcblxuICB7XG4gICAgLy8gVGhlIHZhbGlkYXRpb24gZmxhZyBpcyBjdXJyZW50bHkgbXV0YXRpdmUuIFdlIHB1dCBpdCBvblxuICAgIC8vIGFuIGV4dGVybmFsIGJhY2tpbmcgc3RvcmUgc28gdGhhdCB3ZSBjYW4gZnJlZXplIHRoZSB3aG9sZSBvYmplY3QuXG4gICAgLy8gVGhpcyBjYW4gYmUgcmVwbGFjZWQgd2l0aCBhIFdlYWtNYXAgb25jZSB0aGV5IGFyZSBpbXBsZW1lbnRlZCBpblxuICAgIC8vIGNvbW1vbmx5IHVzZWQgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzLlxuICAgIGVsZW1lbnQuX3N0b3JlID0ge307IC8vIFRvIG1ha2UgY29tcGFyaW5nIFJlYWN0RWxlbWVudHMgZWFzaWVyIGZvciB0ZXN0aW5nIHB1cnBvc2VzLCB3ZSBtYWtlXG4gICAgLy8gdGhlIHZhbGlkYXRpb24gZmxhZyBub24tZW51bWVyYWJsZSAod2hlcmUgcG9zc2libGUsIHdoaWNoIHNob3VsZFxuICAgIC8vIGluY2x1ZGUgZXZlcnkgZW52aXJvbm1lbnQgd2UgcnVuIHRlc3RzIGluKSwgc28gdGhlIHRlc3QgZnJhbWV3b3JrXG4gICAgLy8gaWdub3JlcyBpdC5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50Ll9zdG9yZSwgJ3ZhbGlkYXRlZCcsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IGZhbHNlXG4gICAgfSk7IC8vIHNlbGYgYW5kIHNvdXJjZSBhcmUgREVWIG9ubHkgcHJvcGVydGllcy5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnX3NlbGYnLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogc2VsZlxuICAgIH0pOyAvLyBUd28gZWxlbWVudHMgY3JlYXRlZCBpbiB0d28gZGlmZmVyZW50IHBsYWNlcyBzaG91bGQgYmUgY29uc2lkZXJlZFxuICAgIC8vIGVxdWFsIGZvciB0ZXN0aW5nIHB1cnBvc2VzIGFuZCB0aGVyZWZvcmUgd2UgaGlkZSBpdCBmcm9tIGVudW1lcmF0aW9uLlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdfc291cmNlJywge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IHNvdXJjZVxuICAgIH0pO1xuXG4gICAgaWYgKE9iamVjdC5mcmVlemUpIHtcbiAgICAgIE9iamVjdC5mcmVlemUoZWxlbWVudC5wcm9wcyk7XG4gICAgICBPYmplY3QuZnJlZXplKGVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufTtcbi8qKlxuICogaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0anMvcmZjcy9wdWxsLzEwN1xuICogQHBhcmFtIHsqfSB0eXBlXG4gKiBAcGFyYW0ge29iamVjdH0gcHJvcHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqL1xuXG5mdW5jdGlvbiBqc3hERVYodHlwZSwgY29uZmlnLCBtYXliZUtleSwgc291cmNlLCBzZWxmKSB7XG4gIHtcbiAgICB2YXIgcHJvcE5hbWU7IC8vIFJlc2VydmVkIG5hbWVzIGFyZSBleHRyYWN0ZWRcblxuICAgIHZhciBwcm9wcyA9IHt9O1xuICAgIHZhciBrZXkgPSBudWxsO1xuICAgIHZhciByZWYgPSBudWxsOyAvLyBDdXJyZW50bHksIGtleSBjYW4gYmUgc3ByZWFkIGluIGFzIGEgcHJvcC4gVGhpcyBjYXVzZXMgYSBwb3RlbnRpYWxcbiAgICAvLyBpc3N1ZSBpZiBrZXkgaXMgYWxzbyBleHBsaWNpdGx5IGRlY2xhcmVkIChpZS4gPGRpdiB7Li4ucHJvcHN9IGtleT1cIkhpXCIgLz5cbiAgICAvLyBvciA8ZGl2IGtleT1cIkhpXCIgey4uLnByb3BzfSAvPiApLiBXZSB3YW50IHRvIGRlcHJlY2F0ZSBrZXkgc3ByZWFkLFxuICAgIC8vIGJ1dCBhcyBhbiBpbnRlcm1lZGlhcnkgc3RlcCwgd2Ugd2lsbCB1c2UganN4REVWIGZvciBldmVyeXRoaW5nIGV4Y2VwdFxuICAgIC8vIDxkaXYgey4uLnByb3BzfSBrZXk9XCJIaVwiIC8+LCBiZWNhdXNlIHdlIGFyZW4ndCBjdXJyZW50bHkgYWJsZSB0byB0ZWxsIGlmXG4gICAgLy8ga2V5IGlzIGV4cGxpY2l0bHkgZGVjbGFyZWQgdG8gYmUgdW5kZWZpbmVkIG9yIG5vdC5cblxuICAgIGlmIChtYXliZUtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB7XG4gICAgICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24obWF5YmVLZXkpO1xuICAgICAgfVxuXG4gICAgICBrZXkgPSAnJyArIG1heWJlS2V5O1xuICAgIH1cblxuICAgIGlmIChoYXNWYWxpZEtleShjb25maWcpKSB7XG4gICAgICB7XG4gICAgICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24oY29uZmlnLmtleSk7XG4gICAgICB9XG5cbiAgICAgIGtleSA9ICcnICsgY29uZmlnLmtleTtcbiAgICB9XG5cbiAgICBpZiAoaGFzVmFsaWRSZWYoY29uZmlnKSkge1xuICAgICAgcmVmID0gY29uZmlnLnJlZjtcbiAgICAgIHdhcm5JZlN0cmluZ1JlZkNhbm5vdEJlQXV0b0NvbnZlcnRlZChjb25maWcsIHNlbGYpO1xuICAgIH0gLy8gUmVtYWluaW5nIHByb3BlcnRpZXMgYXJlIGFkZGVkIHRvIGEgbmV3IHByb3BzIG9iamVjdFxuXG5cbiAgICBmb3IgKHByb3BOYW1lIGluIGNvbmZpZykge1xuICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCBwcm9wTmFtZSkgJiYgIVJFU0VSVkVEX1BST1BTLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBjb25maWdbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH0gLy8gUmVzb2x2ZSBkZWZhdWx0IHByb3BzXG5cblxuICAgIGlmICh0eXBlICYmIHR5cGUuZGVmYXVsdFByb3BzKSB7XG4gICAgICB2YXIgZGVmYXVsdFByb3BzID0gdHlwZS5kZWZhdWx0UHJvcHM7XG5cbiAgICAgIGZvciAocHJvcE5hbWUgaW4gZGVmYXVsdFByb3BzKSB7XG4gICAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoa2V5IHx8IHJlZikge1xuICAgICAgdmFyIGRpc3BsYXlOYW1lID0gdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgPyB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCAnVW5rbm93bicgOiB0eXBlO1xuXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIGRlZmluZUtleVByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gUmVhY3RFbGVtZW50KHR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQsIHByb3BzKTtcbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50T3duZXIkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyO1xudmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG5cbmZ1bmN0aW9uIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZWxlbWVudCkge1xuICB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSwgZWxlbWVudC5fc291cmNlLCBvd25lciA/IG93bmVyLnR5cGUgOiBudWxsKTtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMS5zZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd247XG5cbntcbiAgcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd24gPSBmYWxzZTtcbn1cbi8qKlxuICogVmVyaWZpZXMgdGhlIG9iamVjdCBpcyBhIFJlYWN0RWxlbWVudC5cbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjaXN2YWxpZGVsZW1lbnRcbiAqIEBwYXJhbSB7P29iamVjdH0gb2JqZWN0XG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGBvYmplY3RgIGlzIGEgUmVhY3RFbGVtZW50LlxuICogQGZpbmFsXG4gKi9cblxuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudChvYmplY3QpIHtcbiAge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwgJiYgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEU7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkge1xuICB7XG4gICAgaWYgKFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCkge1xuICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50LnR5cGUpO1xuXG4gICAgICBpZiAobmFtZSkge1xuICAgICAgICByZXR1cm4gJ1xcblxcbkNoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgbmFtZSArICdgLic7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuICcnO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtKHNvdXJjZSkge1xuICB7XG4gICAgaWYgKHNvdXJjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgZmlsZU5hbWUgPSBzb3VyY2UuZmlsZU5hbWUucmVwbGFjZSgvXi4qW1xcXFxcXC9dLywgJycpO1xuICAgICAgdmFyIGxpbmVOdW1iZXIgPSBzb3VyY2UubGluZU51bWJlcjtcbiAgICAgIHJldHVybiAnXFxuXFxuQ2hlY2sgeW91ciBjb2RlIGF0ICcgKyBmaWxlTmFtZSArICc6JyArIGxpbmVOdW1iZXIgKyAnLic7XG4gICAgfVxuXG4gICAgcmV0dXJuICcnO1xuICB9XG59XG4vKipcbiAqIFdhcm4gaWYgdGhlcmUncyBubyBrZXkgZXhwbGljaXRseSBzZXQgb24gZHluYW1pYyBhcnJheXMgb2YgY2hpbGRyZW4gb3JcbiAqIG9iamVjdCBrZXlzIGFyZSBub3QgdmFsaWQuIFRoaXMgYWxsb3dzIHVzIHRvIGtlZXAgdHJhY2sgb2YgY2hpbGRyZW4gYmV0d2VlblxuICogdXBkYXRlcy5cbiAqL1xuXG5cbnZhciBvd25lckhhc0tleVVzZVdhcm5pbmcgPSB7fTtcblxuZnVuY3Rpb24gZ2V0Q3VycmVudENvbXBvbmVudEVycm9ySW5mbyhwYXJlbnRUeXBlKSB7XG4gIHtcbiAgICB2YXIgaW5mbyA9IGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpO1xuXG4gICAgaWYgKCFpbmZvKSB7XG4gICAgICB2YXIgcGFyZW50TmFtZSA9IHR5cGVvZiBwYXJlbnRUeXBlID09PSAnc3RyaW5nJyA/IHBhcmVudFR5cGUgOiBwYXJlbnRUeXBlLmRpc3BsYXlOYW1lIHx8IHBhcmVudFR5cGUubmFtZTtcblxuICAgICAgaWYgKHBhcmVudE5hbWUpIHtcbiAgICAgICAgaW5mbyA9IFwiXFxuXFxuQ2hlY2sgdGhlIHRvcC1sZXZlbCByZW5kZXIgY2FsbCB1c2luZyA8XCIgKyBwYXJlbnROYW1lICsgXCI+LlwiO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpbmZvO1xuICB9XG59XG4vKipcbiAqIFdhcm4gaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFuIGV4cGxpY2l0IGtleSBhc3NpZ25lZCB0byBpdC5cbiAqIFRoaXMgZWxlbWVudCBpcyBpbiBhbiBhcnJheS4gVGhlIGFycmF5IGNvdWxkIGdyb3cgYW5kIHNocmluayBvciBiZVxuICogcmVvcmRlcmVkLiBBbGwgY2hpbGRyZW4gdGhhdCBoYXZlbid0IGFscmVhZHkgYmVlbiB2YWxpZGF0ZWQgYXJlIHJlcXVpcmVkIHRvXG4gKiBoYXZlIGEgXCJrZXlcIiBwcm9wZXJ0eSBhc3NpZ25lZCB0byBpdC4gRXJyb3Igc3RhdHVzZXMgYXJlIGNhY2hlZCBzbyBhIHdhcm5pbmdcbiAqIHdpbGwgb25seSBiZSBzaG93biBvbmNlLlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnQgRWxlbWVudCB0aGF0IHJlcXVpcmVzIGEga2V5LlxuICogQHBhcmFtIHsqfSBwYXJlbnRUeXBlIGVsZW1lbnQncyBwYXJlbnQncyB0eXBlLlxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVFeHBsaWNpdEtleShlbGVtZW50LCBwYXJlbnRUeXBlKSB7XG4gIHtcbiAgICBpZiAoIWVsZW1lbnQuX3N0b3JlIHx8IGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCB8fCBlbGVtZW50LmtleSAhPSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZWxlbWVudC5fc3RvcmUudmFsaWRhdGVkID0gdHJ1ZTtcbiAgICB2YXIgY3VycmVudENvbXBvbmVudEVycm9ySW5mbyA9IGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSk7XG5cbiAgICBpZiAob3duZXJIYXNLZXlVc2VXYXJuaW5nW2N1cnJlbnRDb21wb25lbnRFcnJvckluZm9dKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb3duZXJIYXNLZXlVc2VXYXJuaW5nW2N1cnJlbnRDb21wb25lbnRFcnJvckluZm9dID0gdHJ1ZTsgLy8gVXN1YWxseSB0aGUgY3VycmVudCBvd25lciBpcyB0aGUgb2ZmZW5kZXIsIGJ1dCBpZiBpdCBhY2NlcHRzIGNoaWxkcmVuIGFzIGFcbiAgICAvLyBwcm9wZXJ0eSwgaXQgbWF5IGJlIHRoZSBjcmVhdG9yIG9mIHRoZSBjaGlsZCB0aGF0J3MgcmVzcG9uc2libGUgZm9yXG4gICAgLy8gYXNzaWduaW5nIGl0IGEga2V5LlxuXG4gICAgdmFyIGNoaWxkT3duZXIgPSAnJztcblxuICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQuX293bmVyICYmIGVsZW1lbnQuX293bmVyICE9PSBSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQpIHtcbiAgICAgIC8vIEdpdmUgdGhlIGNvbXBvbmVudCB0aGF0IG9yaWdpbmFsbHkgY3JlYXRlZCB0aGlzIGNoaWxkLlxuICAgICAgY2hpbGRPd25lciA9IFwiIEl0IHdhcyBwYXNzZWQgYSBjaGlsZCBmcm9tIFwiICsgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGVsZW1lbnQuX293bmVyLnR5cGUpICsgXCIuXCI7XG4gICAgfVxuXG4gICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShlbGVtZW50KTtcblxuICAgIGVycm9yKCdFYWNoIGNoaWxkIGluIGEgbGlzdCBzaG91bGQgaGF2ZSBhIHVuaXF1ZSBcImtleVwiIHByb3AuJyArICclcyVzIFNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvd2FybmluZy1rZXlzIGZvciBtb3JlIGluZm9ybWF0aW9uLicsIGN1cnJlbnRDb21wb25lbnRFcnJvckluZm8sIGNoaWxkT3duZXIpO1xuXG4gICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShudWxsKTtcbiAgfVxufVxuLyoqXG4gKiBFbnN1cmUgdGhhdCBldmVyeSBlbGVtZW50IGVpdGhlciBpcyBwYXNzZWQgaW4gYSBzdGF0aWMgbG9jYXRpb24sIGluIGFuXG4gKiBhcnJheSB3aXRoIGFuIGV4cGxpY2l0IGtleXMgcHJvcGVydHkgZGVmaW5lZCwgb3IgaW4gYW4gb2JqZWN0IGxpdGVyYWxcbiAqIHdpdGggdmFsaWQga2V5IHByb3BlcnR5LlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIHtSZWFjdE5vZGV9IG5vZGUgU3RhdGljYWxseSBwYXNzZWQgY2hpbGQgb2YgYW55IHR5cGUuXG4gKiBAcGFyYW0geyp9IHBhcmVudFR5cGUgbm9kZSdzIHBhcmVudCdzIHR5cGUuXG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZUNoaWxkS2V5cyhub2RlLCBwYXJlbnRUeXBlKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIG5vZGUgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzQXJyYXkobm9kZSkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2hpbGQgPSBub2RlW2ldO1xuXG4gICAgICAgIGlmIChpc1ZhbGlkRWxlbWVudChjaGlsZCkpIHtcbiAgICAgICAgICB2YWxpZGF0ZUV4cGxpY2l0S2V5KGNoaWxkLCBwYXJlbnRUeXBlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNWYWxpZEVsZW1lbnQobm9kZSkpIHtcbiAgICAgIC8vIFRoaXMgZWxlbWVudCB3YXMgcGFzc2VkIGluIGEgdmFsaWQgbG9jYXRpb24uXG4gICAgICBpZiAobm9kZS5fc3RvcmUpIHtcbiAgICAgICAgbm9kZS5fc3RvcmUudmFsaWRhdGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vZGUpIHtcbiAgICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihub2RlKTtcblxuICAgICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIEVudHJ5IGl0ZXJhdG9ycyB1c2VkIHRvIHByb3ZpZGUgaW1wbGljaXQga2V5cyxcbiAgICAgICAgLy8gYnV0IG5vdyB3ZSBwcmludCBhIHNlcGFyYXRlIHdhcm5pbmcgZm9yIHRoZW0gbGF0ZXIuXG4gICAgICAgIGlmIChpdGVyYXRvckZuICE9PSBub2RlLmVudHJpZXMpIHtcbiAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwobm9kZSk7XG4gICAgICAgICAgdmFyIHN0ZXA7XG5cbiAgICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgICBpZiAoaXNWYWxpZEVsZW1lbnQoc3RlcC52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgdmFsaWRhdGVFeHBsaWNpdEtleShzdGVwLnZhbHVlLCBwYXJlbnRUeXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbi8qKlxuICogR2l2ZW4gYW4gZWxlbWVudCwgdmFsaWRhdGUgdGhhdCBpdHMgcHJvcHMgZm9sbG93IHRoZSBwcm9wVHlwZXMgZGVmaW5pdGlvbixcbiAqIHByb3ZpZGVkIGJ5IHRoZSB0eXBlLlxuICpcbiAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBlbGVtZW50XG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BUeXBlcyhlbGVtZW50KSB7XG4gIHtcbiAgICB2YXIgdHlwZSA9IGVsZW1lbnQudHlwZTtcblxuICAgIGlmICh0eXBlID09PSBudWxsIHx8IHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgcHJvcFR5cGVzO1xuXG4gICAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwcm9wVHlwZXMgPSB0eXBlLnByb3BUeXBlcztcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCAvLyBOb3RlOiBNZW1vIG9ubHkgY2hlY2tzIG91dGVyIHByb3BzIGhlcmUuXG4gICAgLy8gSW5uZXIgcHJvcHMgYXJlIGNoZWNrZWQgaW4gdGhlIHJlY29uY2lsZXIuXG4gICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFKSkge1xuICAgICAgcHJvcFR5cGVzID0gdHlwZS5wcm9wVHlwZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocHJvcFR5cGVzKSB7XG4gICAgICAvLyBJbnRlbnRpb25hbGx5IGluc2lkZSB0byBhdm9pZCB0cmlnZ2VyaW5nIGxhenkgaW5pdGlhbGl6ZXJzOlxuICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSk7XG4gICAgICBjaGVja1Byb3BUeXBlcyhwcm9wVHlwZXMsIGVsZW1lbnQucHJvcHMsICdwcm9wJywgbmFtZSwgZWxlbWVudCk7XG4gICAgfSBlbHNlIGlmICh0eXBlLlByb3BUeXBlcyAhPT0gdW5kZWZpbmVkICYmICFwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93bikge1xuICAgICAgcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd24gPSB0cnVlOyAvLyBJbnRlbnRpb25hbGx5IGluc2lkZSB0byBhdm9pZCB0cmlnZ2VyaW5nIGxhenkgaW5pdGlhbGl6ZXJzOlxuXG4gICAgICB2YXIgX25hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSk7XG5cbiAgICAgIGVycm9yKCdDb21wb25lbnQgJXMgZGVjbGFyZWQgYFByb3BUeXBlc2AgaW5zdGVhZCBvZiBgcHJvcFR5cGVzYC4gRGlkIHlvdSBtaXNzcGVsbCB0aGUgcHJvcGVydHkgYXNzaWdubWVudD8nLCBfbmFtZSB8fCAnVW5rbm93bicpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdHlwZS5nZXREZWZhdWx0UHJvcHMgPT09ICdmdW5jdGlvbicgJiYgIXR5cGUuZ2V0RGVmYXVsdFByb3BzLmlzUmVhY3RDbGFzc0FwcHJvdmVkKSB7XG4gICAgICBlcnJvcignZ2V0RGVmYXVsdFByb3BzIGlzIG9ubHkgdXNlZCBvbiBjbGFzc2ljIFJlYWN0LmNyZWF0ZUNsYXNzICcgKyAnZGVmaW5pdGlvbnMuIFVzZSBhIHN0YXRpYyBwcm9wZXJ0eSBuYW1lZCBgZGVmYXVsdFByb3BzYCBpbnN0ZWFkLicpO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBHaXZlbiBhIGZyYWdtZW50LCB2YWxpZGF0ZSB0aGF0IGl0IGNhbiBvbmx5IGJlIHByb3ZpZGVkIHdpdGggZnJhZ21lbnQgcHJvcHNcbiAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBmcmFnbWVudFxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVGcmFnbWVudFByb3BzKGZyYWdtZW50KSB7XG4gIHtcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGZyYWdtZW50LnByb3BzKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG5cbiAgICAgIGlmIChrZXkgIT09ICdjaGlsZHJlbicgJiYga2V5ICE9PSAna2V5Jykge1xuICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGZyYWdtZW50KTtcblxuICAgICAgICBlcnJvcignSW52YWxpZCBwcm9wIGAlc2Agc3VwcGxpZWQgdG8gYFJlYWN0LkZyYWdtZW50YC4gJyArICdSZWFjdC5GcmFnbWVudCBjYW4gb25seSBoYXZlIGBrZXlgIGFuZCBgY2hpbGRyZW5gIHByb3BzLicsIGtleSk7XG5cbiAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShudWxsKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGZyYWdtZW50LnJlZiAhPT0gbnVsbCkge1xuICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShmcmFnbWVudCk7XG5cbiAgICAgIGVycm9yKCdJbnZhbGlkIGF0dHJpYnV0ZSBgcmVmYCBzdXBwbGllZCB0byBgUmVhY3QuRnJhZ21lbnRgLicpO1xuXG4gICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgZGlkV2FybkFib3V0S2V5U3ByZWFkID0ge307XG5mdW5jdGlvbiBqc3hXaXRoVmFsaWRhdGlvbih0eXBlLCBwcm9wcywga2V5LCBpc1N0YXRpY0NoaWxkcmVuLCBzb3VyY2UsIHNlbGYpIHtcbiAge1xuICAgIHZhciB2YWxpZFR5cGUgPSBpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSk7IC8vIFdlIHdhcm4gaW4gdGhpcyBjYXNlIGJ1dCBkb24ndCB0aHJvdy4gV2UgZXhwZWN0IHRoZSBlbGVtZW50IGNyZWF0aW9uIHRvXG4gICAgLy8gc3VjY2VlZCBhbmQgdGhlcmUgd2lsbCBsaWtlbHkgYmUgZXJyb3JzIGluIHJlbmRlci5cblxuICAgIGlmICghdmFsaWRUeXBlKSB7XG4gICAgICB2YXIgaW5mbyA9ICcnO1xuXG4gICAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsICYmIE9iamVjdC5rZXlzKHR5cGUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBpbmZvICs9ICcgWW91IGxpa2VseSBmb3Jnb3QgdG8gZXhwb3J0IHlvdXIgY29tcG9uZW50IGZyb20gdGhlIGZpbGUgJyArIFwiaXQncyBkZWZpbmVkIGluLCBvciB5b3UgbWlnaHQgaGF2ZSBtaXhlZCB1cCBkZWZhdWx0IGFuZCBuYW1lZCBpbXBvcnRzLlwiO1xuICAgICAgfVxuXG4gICAgICB2YXIgc291cmNlSW5mbyA9IGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtKHNvdXJjZSk7XG5cbiAgICAgIGlmIChzb3VyY2VJbmZvKSB7XG4gICAgICAgIGluZm8gKz0gc291cmNlSW5mbztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluZm8gKz0gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCk7XG4gICAgICB9XG5cbiAgICAgIHZhciB0eXBlU3RyaW5nO1xuXG4gICAgICBpZiAodHlwZSA9PT0gbnVsbCkge1xuICAgICAgICB0eXBlU3RyaW5nID0gJ251bGwnO1xuICAgICAgfSBlbHNlIGlmIChpc0FycmF5KHR5cGUpKSB7XG4gICAgICAgIHR5cGVTdHJpbmcgPSAnYXJyYXknO1xuICAgICAgfSBlbHNlIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFKSB7XG4gICAgICAgIHR5cGVTdHJpbmcgPSBcIjxcIiArIChnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZS50eXBlKSB8fCAnVW5rbm93bicpICsgXCIgLz5cIjtcbiAgICAgICAgaW5mbyA9ICcgRGlkIHlvdSBhY2NpZGVudGFsbHkgZXhwb3J0IGEgSlNYIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGNvbXBvbmVudD8nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHlwZVN0cmluZyA9IHR5cGVvZiB0eXBlO1xuICAgICAgfVxuXG4gICAgICBlcnJvcignUmVhY3QuanN4OiB0eXBlIGlzIGludmFsaWQgLS0gZXhwZWN0ZWQgYSBzdHJpbmcgKGZvciAnICsgJ2J1aWx0LWluIGNvbXBvbmVudHMpIG9yIGEgY2xhc3MvZnVuY3Rpb24gKGZvciBjb21wb3NpdGUgJyArICdjb21wb25lbnRzKSBidXQgZ290OiAlcy4lcycsIHR5cGVTdHJpbmcsIGluZm8pO1xuICAgIH1cblxuICAgIHZhciBlbGVtZW50ID0ganN4REVWKHR5cGUsIHByb3BzLCBrZXksIHNvdXJjZSwgc2VsZik7IC8vIFRoZSByZXN1bHQgY2FuIGJlIG51bGxpc2ggaWYgYSBtb2NrIG9yIGEgY3VzdG9tIGZ1bmN0aW9uIGlzIHVzZWQuXG4gICAgLy8gVE9ETzogRHJvcCB0aGlzIHdoZW4gdGhlc2UgYXJlIG5vIGxvbmdlciBhbGxvd2VkIGFzIHRoZSB0eXBlIGFyZ3VtZW50LlxuXG4gICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfSAvLyBTa2lwIGtleSB3YXJuaW5nIGlmIHRoZSB0eXBlIGlzbid0IHZhbGlkIHNpbmNlIG91ciBrZXkgdmFsaWRhdGlvbiBsb2dpY1xuICAgIC8vIGRvZXNuJ3QgZXhwZWN0IGEgbm9uLXN0cmluZy9mdW5jdGlvbiB0eXBlIGFuZCBjYW4gdGhyb3cgY29uZnVzaW5nIGVycm9ycy5cbiAgICAvLyBXZSBkb24ndCB3YW50IGV4Y2VwdGlvbiBiZWhhdmlvciB0byBkaWZmZXIgYmV0d2VlbiBkZXYgYW5kIHByb2QuXG4gICAgLy8gKFJlbmRlcmluZyB3aWxsIHRocm93IHdpdGggYSBoZWxwZnVsIG1lc3NhZ2UgYW5kIGFzIHNvb24gYXMgdGhlIHR5cGUgaXNcbiAgICAvLyBmaXhlZCwgdGhlIGtleSB3YXJuaW5ncyB3aWxsIGFwcGVhci4pXG5cblxuICAgIGlmICh2YWxpZFR5cGUpIHtcbiAgICAgIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuO1xuXG4gICAgICBpZiAoY2hpbGRyZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoaXNTdGF0aWNDaGlsZHJlbikge1xuICAgICAgICAgIGlmIChpc0FycmF5KGNoaWxkcmVuKSkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICB2YWxpZGF0ZUNoaWxkS2V5cyhjaGlsZHJlbltpXSwgdHlwZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChPYmplY3QuZnJlZXplKSB7XG4gICAgICAgICAgICAgIE9iamVjdC5mcmVlemUoY2hpbGRyZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvcignUmVhY3QuanN4OiBTdGF0aWMgY2hpbGRyZW4gc2hvdWxkIGFsd2F5cyBiZSBhbiBhcnJheS4gJyArICdZb3UgYXJlIGxpa2VseSBleHBsaWNpdGx5IGNhbGxpbmcgUmVhY3QuanN4cyBvciBSZWFjdC5qc3hERVYuICcgKyAnVXNlIHRoZSBCYWJlbCB0cmFuc2Zvcm0gaW5zdGVhZC4nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsaWRhdGVDaGlsZEtleXMoY2hpbGRyZW4sIHR5cGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwocHJvcHMsICdrZXknKSkge1xuICAgICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKTtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhwcm9wcykuZmlsdGVyKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgICAgcmV0dXJuIGsgIT09ICdrZXknO1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGJlZm9yZUV4YW1wbGUgPSBrZXlzLmxlbmd0aCA+IDAgPyAne2tleTogc29tZUtleSwgJyArIGtleXMuam9pbignOiAuLi4sICcpICsgJzogLi4ufScgOiAne2tleTogc29tZUtleX0nO1xuXG4gICAgICAgIGlmICghZGlkV2FybkFib3V0S2V5U3ByZWFkW2NvbXBvbmVudE5hbWUgKyBiZWZvcmVFeGFtcGxlXSkge1xuICAgICAgICAgIHZhciBhZnRlckV4YW1wbGUgPSBrZXlzLmxlbmd0aCA+IDAgPyAneycgKyBrZXlzLmpvaW4oJzogLi4uLCAnKSArICc6IC4uLn0nIDogJ3t9JztcblxuICAgICAgICAgIGVycm9yKCdBIHByb3BzIG9iamVjdCBjb250YWluaW5nIGEgXCJrZXlcIiBwcm9wIGlzIGJlaW5nIHNwcmVhZCBpbnRvIEpTWDpcXG4nICsgJyAgbGV0IHByb3BzID0gJXM7XFxuJyArICcgIDwlcyB7Li4ucHJvcHN9IC8+XFxuJyArICdSZWFjdCBrZXlzIG11c3QgYmUgcGFzc2VkIGRpcmVjdGx5IHRvIEpTWCB3aXRob3V0IHVzaW5nIHNwcmVhZDpcXG4nICsgJyAgbGV0IHByb3BzID0gJXM7XFxuJyArICcgIDwlcyBrZXk9e3NvbWVLZXl9IHsuLi5wcm9wc30gLz4nLCBiZWZvcmVFeGFtcGxlLCBjb21wb25lbnROYW1lLCBhZnRlckV4YW1wbGUsIGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgICAgZGlkV2FybkFib3V0S2V5U3ByZWFkW2NvbXBvbmVudE5hbWUgKyBiZWZvcmVFeGFtcGxlXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgICAgdmFsaWRhdGVGcmFnbWVudFByb3BzKGVsZW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWxpZGF0ZVByb3BUeXBlcyhlbGVtZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxufSAvLyBUaGVzZSB0d28gZnVuY3Rpb25zIGV4aXN0IHRvIHN0aWxsIGdldCBjaGlsZCB3YXJuaW5ncyBpbiBkZXZcbi8vIGV2ZW4gd2l0aCB0aGUgcHJvZCB0cmFuc2Zvcm0uIFRoaXMgbWVhbnMgdGhhdCBqc3hERVYgaXMgcHVyZWx5XG4vLyBvcHQtaW4gYmVoYXZpb3IgZm9yIGJldHRlciBtZXNzYWdlcyBidXQgdGhhdCB3ZSB3b24ndCBzdG9wXG4vLyBnaXZpbmcgeW91IHdhcm5pbmdzIGlmIHlvdSB1c2UgcHJvZHVjdGlvbiBhcGlzLlxuXG5mdW5jdGlvbiBqc3hXaXRoVmFsaWRhdGlvblN0YXRpYyh0eXBlLCBwcm9wcywga2V5KSB7XG4gIHtcbiAgICByZXR1cm4ganN4V2l0aFZhbGlkYXRpb24odHlwZSwgcHJvcHMsIGtleSwgdHJ1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGpzeFdpdGhWYWxpZGF0aW9uRHluYW1pYyh0eXBlLCBwcm9wcywga2V5KSB7XG4gIHtcbiAgICByZXR1cm4ganN4V2l0aFZhbGlkYXRpb24odHlwZSwgcHJvcHMsIGtleSwgZmFsc2UpO1xuICB9XG59XG5cbnZhciBqc3ggPSAganN4V2l0aFZhbGlkYXRpb25EeW5hbWljIDsgLy8gd2UgbWF5IHdhbnQgdG8gc3BlY2lhbCBjYXNlIGpzeHMgaW50ZXJuYWxseSB0byB0YWtlIGFkdmFudGFnZSBvZiBzdGF0aWMgY2hpbGRyZW4uXG4vLyBmb3Igbm93IHdlIGNhbiBzaGlwIGlkZW50aWNhbCBwcm9kIGZ1bmN0aW9uc1xuXG52YXIganN4cyA9ICBqc3hXaXRoVmFsaWRhdGlvblN0YXRpYyA7XG5cbmV4cG9ydHMuRnJhZ21lbnQgPSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xuZXhwb3J0cy5qc3ggPSBqc3g7XG5leHBvcnRzLmpzeHMgPSBqc3hzO1xuICB9KSgpO1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1qc3gtcnVudGltZS5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1qc3gtcnVudGltZS5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwgImltcG9ydCBcIm1vY2hhXCI7XG5pbXBvcnQgeyBwYWdlUGhvdG9zaG9wU3RvcmVNYXAsIHBhZ2VTdG9yZSB9IGZyb20gXCIuLi8uLi8uLi9tb2R1bGVzL2NvbWZ5L3Bob3Rvc2hvcE1vZGVscy5tanNcIjtcblxuKGdsb2JhbFRoaXMgYXMgYW55KS5zZHBwcF9kZWJ1Z1BhZ2VTdG9yZSA9IHBhZ2VTdG9yZTtcbihnbG9iYWxUaGlzIGFzIGFueSkuc2RwcHBfZGVidWdQYWdlUGhvdG9zaG9wU3RvcmVNYXAgPSBwYWdlUGhvdG9zaG9wU3RvcmVNYXA7XG5cbm1vY2hhLnNldHVwKHtcbiAgICByZXBvcnRlcjogXCJzcGVjXCIsXG4gICAgdWk6IFwiYmRkXCIsXG59KTtcbm1vY2hhLmNsZWFuUmVmZXJlbmNlc0FmdGVyUnVuKGZhbHNlKTtcblxuXG4oZ2xvYmFsVGhpcyBhcyBhbnkpLnNkcHBwVGVzdCA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAvLyBhd2FpdCBQcm9taXNlLmFsbChbaW1wb3J0KCcuL2NvbWZ5L2Zvcm1pbmcudGVzdC5tanMnKV0pO1xuICAgIG1vY2hhLnJ1bigpO1xufSIsICJpbXBvcnQgeyBQYXRjaEVycm9yLCBfZGVlcENsb25lLCBpc0ludGVnZXIsIHVuZXNjYXBlUGF0aENvbXBvbmVudCwgaGFzVW5kZWZpbmVkIH0gZnJvbSAnLi9oZWxwZXJzLm1qcyc7XG5leHBvcnQgdmFyIEpzb25QYXRjaEVycm9yID0gUGF0Y2hFcnJvcjtcbmV4cG9ydCB2YXIgZGVlcENsb25lID0gX2RlZXBDbG9uZTtcbi8qIFdlIHVzZSBhIEphdmFzY3JpcHQgaGFzaCB0byBzdG9yZSBlYWNoXG4gZnVuY3Rpb24uIEVhY2ggaGFzaCBlbnRyeSAocHJvcGVydHkpIHVzZXNcbiB0aGUgb3BlcmF0aW9uIGlkZW50aWZpZXJzIHNwZWNpZmllZCBpbiByZmM2OTAyLlxuIEluIHRoaXMgd2F5LCB3ZSBjYW4gbWFwIGVhY2ggcGF0Y2ggb3BlcmF0aW9uXG4gdG8gaXRzIGRlZGljYXRlZCBmdW5jdGlvbiBpbiBlZmZpY2llbnQgd2F5LlxuICovXG4vKiBUaGUgb3BlcmF0aW9ucyBhcHBsaWNhYmxlIHRvIGFuIG9iamVjdCAqL1xudmFyIG9iak9wcyA9IHtcbiAgICBhZGQ6IGZ1bmN0aW9uIChvYmosIGtleSwgZG9jdW1lbnQpIHtcbiAgICAgICAgb2JqW2tleV0gPSB0aGlzLnZhbHVlO1xuICAgICAgICByZXR1cm4geyBuZXdEb2N1bWVudDogZG9jdW1lbnQgfTtcbiAgICB9LFxuICAgIHJlbW92ZTogZnVuY3Rpb24gKG9iaiwga2V5LCBkb2N1bWVudCkge1xuICAgICAgICB2YXIgcmVtb3ZlZCA9IG9ialtrZXldO1xuICAgICAgICBkZWxldGUgb2JqW2tleV07XG4gICAgICAgIHJldHVybiB7IG5ld0RvY3VtZW50OiBkb2N1bWVudCwgcmVtb3ZlZDogcmVtb3ZlZCB9O1xuICAgIH0sXG4gICAgcmVwbGFjZTogZnVuY3Rpb24gKG9iaiwga2V5LCBkb2N1bWVudCkge1xuICAgICAgICB2YXIgcmVtb3ZlZCA9IG9ialtrZXldO1xuICAgICAgICBvYmpba2V5XSA9IHRoaXMudmFsdWU7XG4gICAgICAgIHJldHVybiB7IG5ld0RvY3VtZW50OiBkb2N1bWVudCwgcmVtb3ZlZDogcmVtb3ZlZCB9O1xuICAgIH0sXG4gICAgbW92ZTogZnVuY3Rpb24gKG9iaiwga2V5LCBkb2N1bWVudCkge1xuICAgICAgICAvKiBpbiBjYXNlIG1vdmUgdGFyZ2V0IG92ZXJ3cml0ZXMgYW4gZXhpc3RpbmcgdmFsdWUsXG4gICAgICAgIHJldHVybiB0aGUgcmVtb3ZlZCB2YWx1ZSwgdGhpcyBjYW4gYmUgdGF4aW5nIHBlcmZvcm1hbmNlLXdpc2UsXG4gICAgICAgIGFuZCBpcyBwb3RlbnRpYWxseSB1bm5lZWRlZCAqL1xuICAgICAgICB2YXIgcmVtb3ZlZCA9IGdldFZhbHVlQnlQb2ludGVyKGRvY3VtZW50LCB0aGlzLnBhdGgpO1xuICAgICAgICBpZiAocmVtb3ZlZCkge1xuICAgICAgICAgICAgcmVtb3ZlZCA9IF9kZWVwQ2xvbmUocmVtb3ZlZCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG9yaWdpbmFsVmFsdWUgPSBhcHBseU9wZXJhdGlvbihkb2N1bWVudCwgeyBvcDogXCJyZW1vdmVcIiwgcGF0aDogdGhpcy5mcm9tIH0pLnJlbW92ZWQ7XG4gICAgICAgIGFwcGx5T3BlcmF0aW9uKGRvY3VtZW50LCB7IG9wOiBcImFkZFwiLCBwYXRoOiB0aGlzLnBhdGgsIHZhbHVlOiBvcmlnaW5hbFZhbHVlIH0pO1xuICAgICAgICByZXR1cm4geyBuZXdEb2N1bWVudDogZG9jdW1lbnQsIHJlbW92ZWQ6IHJlbW92ZWQgfTtcbiAgICB9LFxuICAgIGNvcHk6IGZ1bmN0aW9uIChvYmosIGtleSwgZG9jdW1lbnQpIHtcbiAgICAgICAgdmFyIHZhbHVlVG9Db3B5ID0gZ2V0VmFsdWVCeVBvaW50ZXIoZG9jdW1lbnQsIHRoaXMuZnJvbSk7XG4gICAgICAgIC8vIGVuZm9yY2UgY29weSBieSB2YWx1ZSBzbyBmdXJ0aGVyIG9wZXJhdGlvbnMgZG9uJ3QgYWZmZWN0IHNvdXJjZSAoc2VlIGlzc3VlICMxNzcpXG4gICAgICAgIGFwcGx5T3BlcmF0aW9uKGRvY3VtZW50LCB7IG9wOiBcImFkZFwiLCBwYXRoOiB0aGlzLnBhdGgsIHZhbHVlOiBfZGVlcENsb25lKHZhbHVlVG9Db3B5KSB9KTtcbiAgICAgICAgcmV0dXJuIHsgbmV3RG9jdW1lbnQ6IGRvY3VtZW50IH07XG4gICAgfSxcbiAgICB0ZXN0OiBmdW5jdGlvbiAob2JqLCBrZXksIGRvY3VtZW50KSB7XG4gICAgICAgIHJldHVybiB7IG5ld0RvY3VtZW50OiBkb2N1bWVudCwgdGVzdDogX2FyZUVxdWFscyhvYmpba2V5XSwgdGhpcy52YWx1ZSkgfTtcbiAgICB9LFxuICAgIF9nZXQ6IGZ1bmN0aW9uIChvYmosIGtleSwgZG9jdW1lbnQpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IG9ialtrZXldO1xuICAgICAgICByZXR1cm4geyBuZXdEb2N1bWVudDogZG9jdW1lbnQgfTtcbiAgICB9XG59O1xuLyogVGhlIG9wZXJhdGlvbnMgYXBwbGljYWJsZSB0byBhbiBhcnJheS4gTWFueSBhcmUgdGhlIHNhbWUgYXMgZm9yIHRoZSBvYmplY3QgKi9cbnZhciBhcnJPcHMgPSB7XG4gICAgYWRkOiBmdW5jdGlvbiAoYXJyLCBpLCBkb2N1bWVudCkge1xuICAgICAgICBpZiAoaXNJbnRlZ2VyKGkpKSB7XG4gICAgICAgICAgICBhcnIuc3BsaWNlKGksIDAsIHRoaXMudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAvLyBhcnJheSBwcm9wc1xuICAgICAgICAgICAgYXJyW2ldID0gdGhpcy52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0aGlzIG1heSBiZSBuZWVkZWQgd2hlbiB1c2luZyAnLScgaW4gYW4gYXJyYXlcbiAgICAgICAgcmV0dXJuIHsgbmV3RG9jdW1lbnQ6IGRvY3VtZW50LCBpbmRleDogaSB9O1xuICAgIH0sXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiAoYXJyLCBpLCBkb2N1bWVudCkge1xuICAgICAgICB2YXIgcmVtb3ZlZExpc3QgPSBhcnIuc3BsaWNlKGksIDEpO1xuICAgICAgICByZXR1cm4geyBuZXdEb2N1bWVudDogZG9jdW1lbnQsIHJlbW92ZWQ6IHJlbW92ZWRMaXN0WzBdIH07XG4gICAgfSxcbiAgICByZXBsYWNlOiBmdW5jdGlvbiAoYXJyLCBpLCBkb2N1bWVudCkge1xuICAgICAgICB2YXIgcmVtb3ZlZCA9IGFycltpXTtcbiAgICAgICAgYXJyW2ldID0gdGhpcy52YWx1ZTtcbiAgICAgICAgcmV0dXJuIHsgbmV3RG9jdW1lbnQ6IGRvY3VtZW50LCByZW1vdmVkOiByZW1vdmVkIH07XG4gICAgfSxcbiAgICBtb3ZlOiBvYmpPcHMubW92ZSxcbiAgICBjb3B5OiBvYmpPcHMuY29weSxcbiAgICB0ZXN0OiBvYmpPcHMudGVzdCxcbiAgICBfZ2V0OiBvYmpPcHMuX2dldFxufTtcbi8qKlxuICogUmV0cmlldmVzIGEgdmFsdWUgZnJvbSBhIEpTT04gZG9jdW1lbnQgYnkgYSBKU09OIHBvaW50ZXIuXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gZG9jdW1lbnQgVGhlIGRvY3VtZW50IHRvIGdldCB0aGUgdmFsdWUgZnJvbVxuICogQHBhcmFtIHBvaW50ZXIgYW4gZXNjYXBlZCBKU09OIHBvaW50ZXJcbiAqIEByZXR1cm4gVGhlIHJldHJpZXZlZCB2YWx1ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsdWVCeVBvaW50ZXIoZG9jdW1lbnQsIHBvaW50ZXIpIHtcbiAgICBpZiAocG9pbnRlciA9PSAnJykge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnQ7XG4gICAgfVxuICAgIHZhciBnZXRPcmlnaW5hbERlc3RpbmF0aW9uID0geyBvcDogXCJfZ2V0XCIsIHBhdGg6IHBvaW50ZXIgfTtcbiAgICBhcHBseU9wZXJhdGlvbihkb2N1bWVudCwgZ2V0T3JpZ2luYWxEZXN0aW5hdGlvbik7XG4gICAgcmV0dXJuIGdldE9yaWdpbmFsRGVzdGluYXRpb24udmFsdWU7XG59XG4vKipcbiAqIEFwcGx5IGEgc2luZ2xlIEpTT04gUGF0Y2ggT3BlcmF0aW9uIG9uIGEgSlNPTiBkb2N1bWVudC5cbiAqIFJldHVybnMgdGhlIHtuZXdEb2N1bWVudCwgcmVzdWx0fSBvZiB0aGUgb3BlcmF0aW9uLlxuICogSXQgbW9kaWZpZXMgdGhlIGBkb2N1bWVudGAgYW5kIGBvcGVyYXRpb25gIG9iamVjdHMgLSBpdCBnZXRzIHRoZSB2YWx1ZXMgYnkgcmVmZXJlbmNlLlxuICogSWYgeW91IHdvdWxkIGxpa2UgdG8gYXZvaWQgdG91Y2hpbmcgeW91ciB2YWx1ZXMsIGNsb25lIHRoZW06XG4gKiBganNvbnBhdGNoLmFwcGx5T3BlcmF0aW9uKGRvY3VtZW50LCBqc29ucGF0Y2guX2RlZXBDbG9uZShvcGVyYXRpb24pKWAuXG4gKlxuICogQHBhcmFtIGRvY3VtZW50IFRoZSBkb2N1bWVudCB0byBwYXRjaFxuICogQHBhcmFtIG9wZXJhdGlvbiBUaGUgb3BlcmF0aW9uIHRvIGFwcGx5XG4gKiBAcGFyYW0gdmFsaWRhdGVPcGVyYXRpb24gYGZhbHNlYCBpcyB3aXRob3V0IHZhbGlkYXRpb24sIGB0cnVlYCB0byB1c2UgZGVmYXVsdCBqc29ucGF0Y2gncyB2YWxpZGF0aW9uLCBvciB5b3UgY2FuIHBhc3MgYSBgdmFsaWRhdGVPcGVyYXRpb25gIGNhbGxiYWNrIHRvIGJlIHVzZWQgZm9yIHZhbGlkYXRpb24uXG4gKiBAcGFyYW0gbXV0YXRlRG9jdW1lbnQgV2hldGhlciB0byBtdXRhdGUgdGhlIG9yaWdpbmFsIGRvY3VtZW50IG9yIGNsb25lIGl0IGJlZm9yZSBhcHBseWluZ1xuICogQHBhcmFtIGJhblByb3RvdHlwZU1vZGlmaWNhdGlvbnMgV2hldGhlciB0byBiYW4gbW9kaWZpY2F0aW9ucyB0byBgX19wcm90b19fYCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICogQHJldHVybiBge25ld0RvY3VtZW50LCByZXN1bHR9YCBhZnRlciB0aGUgb3BlcmF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseU9wZXJhdGlvbihkb2N1bWVudCwgb3BlcmF0aW9uLCB2YWxpZGF0ZU9wZXJhdGlvbiwgbXV0YXRlRG9jdW1lbnQsIGJhblByb3RvdHlwZU1vZGlmaWNhdGlvbnMsIGluZGV4KSB7XG4gICAgaWYgKHZhbGlkYXRlT3BlcmF0aW9uID09PSB2b2lkIDApIHsgdmFsaWRhdGVPcGVyYXRpb24gPSBmYWxzZTsgfVxuICAgIGlmIChtdXRhdGVEb2N1bWVudCA9PT0gdm9pZCAwKSB7IG11dGF0ZURvY3VtZW50ID0gdHJ1ZTsgfVxuICAgIGlmIChiYW5Qcm90b3R5cGVNb2RpZmljYXRpb25zID09PSB2b2lkIDApIHsgYmFuUHJvdG90eXBlTW9kaWZpY2F0aW9ucyA9IHRydWU7IH1cbiAgICBpZiAoaW5kZXggPT09IHZvaWQgMCkgeyBpbmRleCA9IDA7IH1cbiAgICBpZiAodmFsaWRhdGVPcGVyYXRpb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWxpZGF0ZU9wZXJhdGlvbiA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZU9wZXJhdGlvbihvcGVyYXRpb24sIDAsIGRvY3VtZW50LCBvcGVyYXRpb24ucGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YWxpZGF0b3Iob3BlcmF0aW9uLCAwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKiBST09UIE9QRVJBVElPTlMgKi9cbiAgICBpZiAob3BlcmF0aW9uLnBhdGggPT09IFwiXCIpIHtcbiAgICAgICAgdmFyIHJldHVyblZhbHVlID0geyBuZXdEb2N1bWVudDogZG9jdW1lbnQgfTtcbiAgICAgICAgaWYgKG9wZXJhdGlvbi5vcCA9PT0gJ2FkZCcpIHtcbiAgICAgICAgICAgIHJldHVyblZhbHVlLm5ld0RvY3VtZW50ID0gb3BlcmF0aW9uLnZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9wZXJhdGlvbi5vcCA9PT0gJ3JlcGxhY2UnKSB7XG4gICAgICAgICAgICByZXR1cm5WYWx1ZS5uZXdEb2N1bWVudCA9IG9wZXJhdGlvbi52YWx1ZTtcbiAgICAgICAgICAgIHJldHVyblZhbHVlLnJlbW92ZWQgPSBkb2N1bWVudDsgLy9kb2N1bWVudCB3ZSByZW1vdmVkXG4gICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3BlcmF0aW9uLm9wID09PSAnbW92ZScgfHwgb3BlcmF0aW9uLm9wID09PSAnY29weScpIHsgLy8gaXQncyBhIG1vdmUgb3IgY29weSB0byByb290XG4gICAgICAgICAgICByZXR1cm5WYWx1ZS5uZXdEb2N1bWVudCA9IGdldFZhbHVlQnlQb2ludGVyKGRvY3VtZW50LCBvcGVyYXRpb24uZnJvbSk7IC8vIGdldCB0aGUgdmFsdWUgYnkganNvbi1wb2ludGVyIGluIGBmcm9tYCBmaWVsZFxuICAgICAgICAgICAgaWYgKG9wZXJhdGlvbi5vcCA9PT0gJ21vdmUnKSB7IC8vIHJlcG9ydCByZW1vdmVkIGl0ZW1cbiAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5yZW1vdmVkID0gZG9jdW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3BlcmF0aW9uLm9wID09PSAndGVzdCcpIHtcbiAgICAgICAgICAgIHJldHVyblZhbHVlLnRlc3QgPSBfYXJlRXF1YWxzKGRvY3VtZW50LCBvcGVyYXRpb24udmFsdWUpO1xuICAgICAgICAgICAgaWYgKHJldHVyblZhbHVlLnRlc3QgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpzb25QYXRjaEVycm9yKFwiVGVzdCBvcGVyYXRpb24gZmFpbGVkXCIsICdURVNUX09QRVJBVElPTl9GQUlMRUQnLCBpbmRleCwgb3BlcmF0aW9uLCBkb2N1bWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm5WYWx1ZS5uZXdEb2N1bWVudCA9IGRvY3VtZW50O1xuICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9wZXJhdGlvbi5vcCA9PT0gJ3JlbW92ZScpIHsgLy8gYSByZW1vdmUgb24gcm9vdFxuICAgICAgICAgICAgcmV0dXJuVmFsdWUucmVtb3ZlZCA9IGRvY3VtZW50O1xuICAgICAgICAgICAgcmV0dXJuVmFsdWUubmV3RG9jdW1lbnQgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9wZXJhdGlvbi5vcCA9PT0gJ19nZXQnKSB7XG4gICAgICAgICAgICBvcGVyYXRpb24udmFsdWUgPSBkb2N1bWVudDtcbiAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHsgLyogYmFkIG9wZXJhdGlvbiAqL1xuICAgICAgICAgICAgaWYgKHZhbGlkYXRlT3BlcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpzb25QYXRjaEVycm9yKCdPcGVyYXRpb24gYG9wYCBwcm9wZXJ0eSBpcyBub3Qgb25lIG9mIG9wZXJhdGlvbnMgZGVmaW5lZCBpbiBSRkMtNjkwMicsICdPUEVSQVRJT05fT1BfSU5WQUxJRCcsIGluZGV4LCBvcGVyYXRpb24sIGRvY3VtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gLyogRU5EIFJPT1QgT1BFUkFUSU9OUyAqL1xuICAgIGVsc2Uge1xuICAgICAgICBpZiAoIW11dGF0ZURvY3VtZW50KSB7XG4gICAgICAgICAgICBkb2N1bWVudCA9IF9kZWVwQ2xvbmUoZG9jdW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYXRoID0gb3BlcmF0aW9uLnBhdGggfHwgXCJcIjtcbiAgICAgICAgdmFyIGtleXMgPSBwYXRoLnNwbGl0KCcvJyk7XG4gICAgICAgIHZhciBvYmogPSBkb2N1bWVudDtcbiAgICAgICAgdmFyIHQgPSAxOyAvL3NraXAgZW1wdHkgZWxlbWVudCAtIGh0dHA6Ly9qc3BlcmYuY29tL3RvLXNoaWZ0LW9yLW5vdC10by1zaGlmdFxuICAgICAgICB2YXIgbGVuID0ga2V5cy5sZW5ndGg7XG4gICAgICAgIHZhciBleGlzdGluZ1BhdGhGcmFnbWVudCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIGtleSA9IHZvaWQgMDtcbiAgICAgICAgdmFyIHZhbGlkYXRlRnVuY3Rpb24gPSB2b2lkIDA7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsaWRhdGVPcGVyYXRpb24gPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdmFsaWRhdGVGdW5jdGlvbiA9IHZhbGlkYXRlT3BlcmF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFsaWRhdGVGdW5jdGlvbiA9IHZhbGlkYXRvcjtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAga2V5ID0ga2V5c1t0XTtcbiAgICAgICAgICAgIGlmIChrZXkgJiYga2V5LmluZGV4T2YoJ34nKSAhPSAtMSkge1xuICAgICAgICAgICAgICAgIGtleSA9IHVuZXNjYXBlUGF0aENvbXBvbmVudChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJhblByb3RvdHlwZU1vZGlmaWNhdGlvbnMgJiZcbiAgICAgICAgICAgICAgICAoa2V5ID09ICdfX3Byb3RvX18nIHx8XG4gICAgICAgICAgICAgICAgICAgIChrZXkgPT0gJ3Byb3RvdHlwZScgJiYgdCA+IDAgJiYga2V5c1t0IC0gMV0gPT0gJ2NvbnN0cnVjdG9yJykpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSlNPTi1QYXRjaDogbW9kaWZ5aW5nIGBfX3Byb3RvX19gIG9yIGBjb25zdHJ1Y3Rvci9wcm90b3R5cGVgIHByb3AgaXMgYmFubmVkIGZvciBzZWN1cml0eSByZWFzb25zLCBpZiB0aGlzIHdhcyBvbiBwdXJwb3NlLCBwbGVhc2Ugc2V0IGBiYW5Qcm90b3R5cGVNb2RpZmljYXRpb25zYCBmbGFnIGZhbHNlIGFuZCBwYXNzIGl0IHRvIHRoaXMgZnVuY3Rpb24uIE1vcmUgaW5mbyBpbiBmYXN0LWpzb24tcGF0Y2ggUkVBRE1FJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsaWRhdGVPcGVyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdQYXRoRnJhZ21lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAob2JqW2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdQYXRoRnJhZ21lbnQgPSBrZXlzLnNsaWNlKDAsIHQpLmpvaW4oJy8nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ID09IGxlbiAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nUGF0aEZyYWdtZW50ID0gb3BlcmF0aW9uLnBhdGg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nUGF0aEZyYWdtZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlRnVuY3Rpb24ob3BlcmF0aW9uLCAwLCBkb2N1bWVudCwgZXhpc3RpbmdQYXRoRnJhZ21lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdCsrO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICAgICAgICAgIGlmIChrZXkgPT09ICctJykge1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSBvYmoubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlT3BlcmF0aW9uICYmICFpc0ludGVnZXIoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpzb25QYXRjaEVycm9yKFwiRXhwZWN0ZWQgYW4gdW5zaWduZWQgYmFzZS0xMCBpbnRlZ2VyIHZhbHVlLCBtYWtpbmcgdGhlIG5ldyByZWZlcmVuY2VkIHZhbHVlIHRoZSBhcnJheSBlbGVtZW50IHdpdGggdGhlIHplcm8tYmFzZWQgaW5kZXhcIiwgXCJPUEVSQVRJT05fUEFUSF9JTExFR0FMX0FSUkFZX0lOREVYXCIsIGluZGV4LCBvcGVyYXRpb24sIGRvY3VtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfSAvLyBvbmx5IHBhcnNlIGtleSB3aGVuIGl0J3MgYW4gaW50ZWdlciBmb3IgYGFyci5wcm9wYCB0byB3b3JrXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzSW50ZWdlcihrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSB+fmtleTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodCA+PSBsZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlT3BlcmF0aW9uICYmIG9wZXJhdGlvbi5vcCA9PT0gXCJhZGRcIiAmJiBrZXkgPiBvYmoubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSnNvblBhdGNoRXJyb3IoXCJUaGUgc3BlY2lmaWVkIGluZGV4IE1VU1QgTk9UIGJlIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheVwiLCBcIk9QRVJBVElPTl9WQUxVRV9PVVRfT0ZfQk9VTkRTXCIsIGluZGV4LCBvcGVyYXRpb24sIGRvY3VtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgcmV0dXJuVmFsdWUgPSBhcnJPcHNbb3BlcmF0aW9uLm9wXS5jYWxsKG9wZXJhdGlvbiwgb2JqLCBrZXksIGRvY3VtZW50KTsgLy8gQXBwbHkgcGF0Y2hcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJldHVyblZhbHVlLnRlc3QgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSnNvblBhdGNoRXJyb3IoXCJUZXN0IG9wZXJhdGlvbiBmYWlsZWRcIiwgJ1RFU1RfT1BFUkFUSU9OX0ZBSUxFRCcsIGluZGV4LCBvcGVyYXRpb24sIGRvY3VtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHQgPj0gbGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5WYWx1ZSA9IG9iak9wc1tvcGVyYXRpb24ub3BdLmNhbGwob3BlcmF0aW9uLCBvYmosIGtleSwgZG9jdW1lbnQpOyAvLyBBcHBseSBwYXRjaFxuICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuVmFsdWUudGVzdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBKc29uUGF0Y2hFcnJvcihcIlRlc3Qgb3BlcmF0aW9uIGZhaWxlZFwiLCAnVEVTVF9PUEVSQVRJT05fRkFJTEVEJywgaW5kZXgsIG9wZXJhdGlvbiwgZG9jdW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvYmogPSBvYmpba2V5XTtcbiAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgbW9yZSBrZXlzIGluIHRoZSBwYXRoLCBidXQgdGhlIG5leHQgdmFsdWUgaXNuJ3QgYSBub24tbnVsbCBvYmplY3QsXG4gICAgICAgICAgICAvLyB0aHJvdyBhbiBPUEVSQVRJT05fUEFUSF9VTlJFU09MVkFCTEUgZXJyb3IgaW5zdGVhZCBvZiBpdGVyYXRpbmcgYWdhaW4uXG4gICAgICAgICAgICBpZiAodmFsaWRhdGVPcGVyYXRpb24gJiYgdCA8IGxlbiAmJiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBKc29uUGF0Y2hFcnJvcignQ2Fubm90IHBlcmZvcm0gb3BlcmF0aW9uIGF0IHRoZSBkZXNpcmVkIHBhdGgnLCAnT1BFUkFUSU9OX1BBVEhfVU5SRVNPTFZBQkxFJywgaW5kZXgsIG9wZXJhdGlvbiwgZG9jdW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBBcHBseSBhIGZ1bGwgSlNPTiBQYXRjaCBhcnJheSBvbiBhIEpTT04gZG9jdW1lbnQuXG4gKiBSZXR1cm5zIHRoZSB7bmV3RG9jdW1lbnQsIHJlc3VsdH0gb2YgdGhlIHBhdGNoLlxuICogSXQgbW9kaWZpZXMgdGhlIGBkb2N1bWVudGAgb2JqZWN0IGFuZCBgcGF0Y2hgIC0gaXQgZ2V0cyB0aGUgdmFsdWVzIGJ5IHJlZmVyZW5jZS5cbiAqIElmIHlvdSB3b3VsZCBsaWtlIHRvIGF2b2lkIHRvdWNoaW5nIHlvdXIgdmFsdWVzLCBjbG9uZSB0aGVtOlxuICogYGpzb25wYXRjaC5hcHBseVBhdGNoKGRvY3VtZW50LCBqc29ucGF0Y2guX2RlZXBDbG9uZShwYXRjaCkpYC5cbiAqXG4gKiBAcGFyYW0gZG9jdW1lbnQgVGhlIGRvY3VtZW50IHRvIHBhdGNoXG4gKiBAcGFyYW0gcGF0Y2ggVGhlIHBhdGNoIHRvIGFwcGx5XG4gKiBAcGFyYW0gdmFsaWRhdGVPcGVyYXRpb24gYGZhbHNlYCBpcyB3aXRob3V0IHZhbGlkYXRpb24sIGB0cnVlYCB0byB1c2UgZGVmYXVsdCBqc29ucGF0Y2gncyB2YWxpZGF0aW9uLCBvciB5b3UgY2FuIHBhc3MgYSBgdmFsaWRhdGVPcGVyYXRpb25gIGNhbGxiYWNrIHRvIGJlIHVzZWQgZm9yIHZhbGlkYXRpb24uXG4gKiBAcGFyYW0gbXV0YXRlRG9jdW1lbnQgV2hldGhlciB0byBtdXRhdGUgdGhlIG9yaWdpbmFsIGRvY3VtZW50IG9yIGNsb25lIGl0IGJlZm9yZSBhcHBseWluZ1xuICogQHBhcmFtIGJhblByb3RvdHlwZU1vZGlmaWNhdGlvbnMgV2hldGhlciB0byBiYW4gbW9kaWZpY2F0aW9ucyB0byBgX19wcm90b19fYCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICogQHJldHVybiBBbiBhcnJheSBvZiBge25ld0RvY3VtZW50LCByZXN1bHR9YCBhZnRlciB0aGUgcGF0Y2hcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UGF0Y2goZG9jdW1lbnQsIHBhdGNoLCB2YWxpZGF0ZU9wZXJhdGlvbiwgbXV0YXRlRG9jdW1lbnQsIGJhblByb3RvdHlwZU1vZGlmaWNhdGlvbnMpIHtcbiAgICBpZiAobXV0YXRlRG9jdW1lbnQgPT09IHZvaWQgMCkgeyBtdXRhdGVEb2N1bWVudCA9IHRydWU7IH1cbiAgICBpZiAoYmFuUHJvdG90eXBlTW9kaWZpY2F0aW9ucyA9PT0gdm9pZCAwKSB7IGJhblByb3RvdHlwZU1vZGlmaWNhdGlvbnMgPSB0cnVlOyB9XG4gICAgaWYgKHZhbGlkYXRlT3BlcmF0aW9uKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShwYXRjaCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBKc29uUGF0Y2hFcnJvcignUGF0Y2ggc2VxdWVuY2UgbXVzdCBiZSBhbiBhcnJheScsICdTRVFVRU5DRV9OT1RfQU5fQVJSQVknKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoIW11dGF0ZURvY3VtZW50KSB7XG4gICAgICAgIGRvY3VtZW50ID0gX2RlZXBDbG9uZShkb2N1bWVudCk7XG4gICAgfVxuICAgIHZhciByZXN1bHRzID0gbmV3IEFycmF5KHBhdGNoLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aF8xID0gcGF0Y2gubGVuZ3RoOyBpIDwgbGVuZ3RoXzE7IGkrKykge1xuICAgICAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIHBhc3MgbXV0YXRlRG9jdW1lbnQgYXJndW1lbnQgYmVjYXVzZSBpZiBpdCB3YXMgdHJ1ZSwgd2UgYWxyZWFkeSBkZWVwIGNsb25lZCB0aGUgb2JqZWN0LCB3ZSdsbCBqdXN0IHBhc3MgYHRydWVgXG4gICAgICAgIHJlc3VsdHNbaV0gPSBhcHBseU9wZXJhdGlvbihkb2N1bWVudCwgcGF0Y2hbaV0sIHZhbGlkYXRlT3BlcmF0aW9uLCB0cnVlLCBiYW5Qcm90b3R5cGVNb2RpZmljYXRpb25zLCBpKTtcbiAgICAgICAgZG9jdW1lbnQgPSByZXN1bHRzW2ldLm5ld0RvY3VtZW50OyAvLyBpbiBjYXNlIHJvb3Qgd2FzIHJlcGxhY2VkXG4gICAgfVxuICAgIHJlc3VsdHMubmV3RG9jdW1lbnQgPSBkb2N1bWVudDtcbiAgICByZXR1cm4gcmVzdWx0cztcbn1cbi8qKlxuICogQXBwbHkgYSBzaW5nbGUgSlNPTiBQYXRjaCBPcGVyYXRpb24gb24gYSBKU09OIGRvY3VtZW50LlxuICogUmV0dXJucyB0aGUgdXBkYXRlZCBkb2N1bWVudC5cbiAqIFN1aXRhYmxlIGFzIGEgcmVkdWNlci5cbiAqXG4gKiBAcGFyYW0gZG9jdW1lbnQgVGhlIGRvY3VtZW50IHRvIHBhdGNoXG4gKiBAcGFyYW0gb3BlcmF0aW9uIFRoZSBvcGVyYXRpb24gdG8gYXBwbHlcbiAqIEByZXR1cm4gVGhlIHVwZGF0ZWQgZG9jdW1lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UmVkdWNlcihkb2N1bWVudCwgb3BlcmF0aW9uLCBpbmRleCkge1xuICAgIHZhciBvcGVyYXRpb25SZXN1bHQgPSBhcHBseU9wZXJhdGlvbihkb2N1bWVudCwgb3BlcmF0aW9uKTtcbiAgICBpZiAob3BlcmF0aW9uUmVzdWx0LnRlc3QgPT09IGZhbHNlKSB7IC8vIGZhaWxlZCB0ZXN0XG4gICAgICAgIHRocm93IG5ldyBKc29uUGF0Y2hFcnJvcihcIlRlc3Qgb3BlcmF0aW9uIGZhaWxlZFwiLCAnVEVTVF9PUEVSQVRJT05fRkFJTEVEJywgaW5kZXgsIG9wZXJhdGlvbiwgZG9jdW1lbnQpO1xuICAgIH1cbiAgICByZXR1cm4gb3BlcmF0aW9uUmVzdWx0Lm5ld0RvY3VtZW50O1xufVxuLyoqXG4gKiBWYWxpZGF0ZXMgYSBzaW5nbGUgb3BlcmF0aW9uLiBDYWxsZWQgZnJvbSBganNvbnBhdGNoLnZhbGlkYXRlYC4gVGhyb3dzIGBKc29uUGF0Y2hFcnJvcmAgaW4gY2FzZSBvZiBhbiBlcnJvci5cbiAqIEBwYXJhbSB7b2JqZWN0fSBvcGVyYXRpb24gLSBvcGVyYXRpb24gb2JqZWN0IChwYXRjaClcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIGluZGV4IG9mIG9wZXJhdGlvbiBpbiB0aGUgc2VxdWVuY2VcbiAqIEBwYXJhbSB7b2JqZWN0fSBbZG9jdW1lbnRdIC0gb2JqZWN0IHdoZXJlIHRoZSBvcGVyYXRpb24gaXMgc3VwcG9zZWQgdG8gYmUgYXBwbGllZFxuICogQHBhcmFtIHtzdHJpbmd9IFtleGlzdGluZ1BhdGhGcmFnbWVudF0gLSBjb21lcyBhbG9uZyB3aXRoIGBkb2N1bWVudGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRvcihvcGVyYXRpb24sIGluZGV4LCBkb2N1bWVudCwgZXhpc3RpbmdQYXRoRnJhZ21lbnQpIHtcbiAgICBpZiAodHlwZW9mIG9wZXJhdGlvbiAhPT0gJ29iamVjdCcgfHwgb3BlcmF0aW9uID09PSBudWxsIHx8IEFycmF5LmlzQXJyYXkob3BlcmF0aW9uKSkge1xuICAgICAgICB0aHJvdyBuZXcgSnNvblBhdGNoRXJyb3IoJ09wZXJhdGlvbiBpcyBub3QgYW4gb2JqZWN0JywgJ09QRVJBVElPTl9OT1RfQU5fT0JKRUNUJywgaW5kZXgsIG9wZXJhdGlvbiwgZG9jdW1lbnQpO1xuICAgIH1cbiAgICBlbHNlIGlmICghb2JqT3BzW29wZXJhdGlvbi5vcF0pIHtcbiAgICAgICAgdGhyb3cgbmV3IEpzb25QYXRjaEVycm9yKCdPcGVyYXRpb24gYG9wYCBwcm9wZXJ0eSBpcyBub3Qgb25lIG9mIG9wZXJhdGlvbnMgZGVmaW5lZCBpbiBSRkMtNjkwMicsICdPUEVSQVRJT05fT1BfSU5WQUxJRCcsIGluZGV4LCBvcGVyYXRpb24sIGRvY3VtZW50KTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIG9wZXJhdGlvbi5wYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgSnNvblBhdGNoRXJyb3IoJ09wZXJhdGlvbiBgcGF0aGAgcHJvcGVydHkgaXMgbm90IGEgc3RyaW5nJywgJ09QRVJBVElPTl9QQVRIX0lOVkFMSUQnLCBpbmRleCwgb3BlcmF0aW9uLCBkb2N1bWVudCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKG9wZXJhdGlvbi5wYXRoLmluZGV4T2YoJy8nKSAhPT0gMCAmJiBvcGVyYXRpb24ucGF0aC5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIHBhdGhzIHRoYXQgYXJlbid0IGVtcHR5IHN0cmluZyBzaG91bGQgc3RhcnQgd2l0aCBcIi9cIlxuICAgICAgICB0aHJvdyBuZXcgSnNvblBhdGNoRXJyb3IoJ09wZXJhdGlvbiBgcGF0aGAgcHJvcGVydHkgbXVzdCBzdGFydCB3aXRoIFwiL1wiJywgJ09QRVJBVElPTl9QQVRIX0lOVkFMSUQnLCBpbmRleCwgb3BlcmF0aW9uLCBkb2N1bWVudCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKChvcGVyYXRpb24ub3AgPT09ICdtb3ZlJyB8fCBvcGVyYXRpb24ub3AgPT09ICdjb3B5JykgJiYgdHlwZW9mIG9wZXJhdGlvbi5mcm9tICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgSnNvblBhdGNoRXJyb3IoJ09wZXJhdGlvbiBgZnJvbWAgcHJvcGVydHkgaXMgbm90IHByZXNlbnQgKGFwcGxpY2FibGUgaW4gYG1vdmVgIGFuZCBgY29weWAgb3BlcmF0aW9ucyknLCAnT1BFUkFUSU9OX0ZST01fUkVRVUlSRUQnLCBpbmRleCwgb3BlcmF0aW9uLCBkb2N1bWVudCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKChvcGVyYXRpb24ub3AgPT09ICdhZGQnIHx8IG9wZXJhdGlvbi5vcCA9PT0gJ3JlcGxhY2UnIHx8IG9wZXJhdGlvbi5vcCA9PT0gJ3Rlc3QnKSAmJiBvcGVyYXRpb24udmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgSnNvblBhdGNoRXJyb3IoJ09wZXJhdGlvbiBgdmFsdWVgIHByb3BlcnR5IGlzIG5vdCBwcmVzZW50IChhcHBsaWNhYmxlIGluIGBhZGRgLCBgcmVwbGFjZWAgYW5kIGB0ZXN0YCBvcGVyYXRpb25zKScsICdPUEVSQVRJT05fVkFMVUVfUkVRVUlSRUQnLCBpbmRleCwgb3BlcmF0aW9uLCBkb2N1bWVudCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKChvcGVyYXRpb24ub3AgPT09ICdhZGQnIHx8IG9wZXJhdGlvbi5vcCA9PT0gJ3JlcGxhY2UnIHx8IG9wZXJhdGlvbi5vcCA9PT0gJ3Rlc3QnKSAmJiBoYXNVbmRlZmluZWQob3BlcmF0aW9uLnZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgSnNvblBhdGNoRXJyb3IoJ09wZXJhdGlvbiBgdmFsdWVgIHByb3BlcnR5IGlzIG5vdCBwcmVzZW50IChhcHBsaWNhYmxlIGluIGBhZGRgLCBgcmVwbGFjZWAgYW5kIGB0ZXN0YCBvcGVyYXRpb25zKScsICdPUEVSQVRJT05fVkFMVUVfQ0FOTk9UX0NPTlRBSU5fVU5ERUZJTkVEJywgaW5kZXgsIG9wZXJhdGlvbiwgZG9jdW1lbnQpO1xuICAgIH1cbiAgICBlbHNlIGlmIChkb2N1bWVudCkge1xuICAgICAgICBpZiAob3BlcmF0aW9uLm9wID09IFwiYWRkXCIpIHtcbiAgICAgICAgICAgIHZhciBwYXRoTGVuID0gb3BlcmF0aW9uLnBhdGguc3BsaXQoXCIvXCIpLmxlbmd0aDtcbiAgICAgICAgICAgIHZhciBleGlzdGluZ1BhdGhMZW4gPSBleGlzdGluZ1BhdGhGcmFnbWVudC5zcGxpdChcIi9cIikubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKHBhdGhMZW4gIT09IGV4aXN0aW5nUGF0aExlbiArIDEgJiYgcGF0aExlbiAhPT0gZXhpc3RpbmdQYXRoTGVuKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpzb25QYXRjaEVycm9yKCdDYW5ub3QgcGVyZm9ybSBhbiBgYWRkYCBvcGVyYXRpb24gYXQgdGhlIGRlc2lyZWQgcGF0aCcsICdPUEVSQVRJT05fUEFUSF9DQU5OT1RfQUREJywgaW5kZXgsIG9wZXJhdGlvbiwgZG9jdW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9wZXJhdGlvbi5vcCA9PT0gJ3JlcGxhY2UnIHx8IG9wZXJhdGlvbi5vcCA9PT0gJ3JlbW92ZScgfHwgb3BlcmF0aW9uLm9wID09PSAnX2dldCcpIHtcbiAgICAgICAgICAgIGlmIChvcGVyYXRpb24ucGF0aCAhPT0gZXhpc3RpbmdQYXRoRnJhZ21lbnQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSnNvblBhdGNoRXJyb3IoJ0Nhbm5vdCBwZXJmb3JtIHRoZSBvcGVyYXRpb24gYXQgYSBwYXRoIHRoYXQgZG9lcyBub3QgZXhpc3QnLCAnT1BFUkFUSU9OX1BBVEhfVU5SRVNPTFZBQkxFJywgaW5kZXgsIG9wZXJhdGlvbiwgZG9jdW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9wZXJhdGlvbi5vcCA9PT0gJ21vdmUnIHx8IG9wZXJhdGlvbi5vcCA9PT0gJ2NvcHknKSB7XG4gICAgICAgICAgICB2YXIgZXhpc3RpbmdWYWx1ZSA9IHsgb3A6IFwiX2dldFwiLCBwYXRoOiBvcGVyYXRpb24uZnJvbSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xuICAgICAgICAgICAgdmFyIGVycm9yID0gdmFsaWRhdGUoW2V4aXN0aW5nVmFsdWVdLCBkb2N1bWVudCk7XG4gICAgICAgICAgICBpZiAoZXJyb3IgJiYgZXJyb3IubmFtZSA9PT0gJ09QRVJBVElPTl9QQVRIX1VOUkVTT0xWQUJMRScpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSnNvblBhdGNoRXJyb3IoJ0Nhbm5vdCBwZXJmb3JtIHRoZSBvcGVyYXRpb24gZnJvbSBhIHBhdGggdGhhdCBkb2VzIG5vdCBleGlzdCcsICdPUEVSQVRJT05fRlJPTV9VTlJFU09MVkFCTEUnLCBpbmRleCwgb3BlcmF0aW9uLCBkb2N1bWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFZhbGlkYXRlcyBhIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMuIElmIGBkb2N1bWVudGAgcGFyYW1ldGVyIGlzIHByb3ZpZGVkLCB0aGUgc2VxdWVuY2UgaXMgYWRkaXRpb25hbGx5IHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBvYmplY3QgZG9jdW1lbnQuXG4gKiBJZiBlcnJvciBpcyBlbmNvdW50ZXJlZCwgcmV0dXJucyBhIEpzb25QYXRjaEVycm9yIG9iamVjdFxuICogQHBhcmFtIHNlcXVlbmNlXG4gKiBAcGFyYW0gZG9jdW1lbnRcbiAqIEByZXR1cm5zIHtKc29uUGF0Y2hFcnJvcnx1bmRlZmluZWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZShzZXF1ZW5jZSwgZG9jdW1lbnQsIGV4dGVybmFsVmFsaWRhdG9yKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHNlcXVlbmNlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEpzb25QYXRjaEVycm9yKCdQYXRjaCBzZXF1ZW5jZSBtdXN0IGJlIGFuIGFycmF5JywgJ1NFUVVFTkNFX05PVF9BTl9BUlJBWScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkb2N1bWVudCkge1xuICAgICAgICAgICAgLy9jbG9uZSBkb2N1bWVudCBhbmQgc2VxdWVuY2Ugc28gdGhhdCB3ZSBjYW4gc2FmZWx5IHRyeSBhcHBseWluZyBvcGVyYXRpb25zXG4gICAgICAgICAgICBhcHBseVBhdGNoKF9kZWVwQ2xvbmUoZG9jdW1lbnQpLCBfZGVlcENsb25lKHNlcXVlbmNlKSwgZXh0ZXJuYWxWYWxpZGF0b3IgfHwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBleHRlcm5hbFZhbGlkYXRvciA9IGV4dGVybmFsVmFsaWRhdG9yIHx8IHZhbGlkYXRvcjtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VxdWVuY2UubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBleHRlcm5hbFZhbGlkYXRvcihzZXF1ZW5jZVtpXSwgaSwgZG9jdW1lbnQsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBKc29uUGF0Y2hFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8gYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL2Vwb2JlcmV6a2luL2Zhc3QtZGVlcC1lcXVhbFxuLy8gTUlUIExpY2Vuc2Vcbi8vIENvcHlyaWdodCAoYykgMjAxNyBFdmdlbnkgUG9iZXJlemtpblxuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4vLyBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuLy8gU09GVFdBUkUuXG5leHBvcnQgZnVuY3Rpb24gX2FyZUVxdWFscyhhLCBiKSB7XG4gICAgaWYgKGEgPT09IGIpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmIChhICYmIGIgJiYgdHlwZW9mIGEgPT0gJ29iamVjdCcgJiYgdHlwZW9mIGIgPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdmFyIGFyckEgPSBBcnJheS5pc0FycmF5KGEpLCBhcnJCID0gQXJyYXkuaXNBcnJheShiKSwgaSwgbGVuZ3RoLCBrZXk7XG4gICAgICAgIGlmIChhcnJBICYmIGFyckIpIHtcbiAgICAgICAgICAgIGxlbmd0aCA9IGEubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGxlbmd0aCAhPSBiLmxlbmd0aClcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspXG4gICAgICAgICAgICAgICAgaWYgKCFfYXJlRXF1YWxzKGFbaV0sIGJbaV0pKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXJyQSAhPSBhcnJCKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGEpO1xuICAgICAgICBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICAgICAgaWYgKGxlbmd0aCAhPT0gT2JqZWN0LmtleXMoYikubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspXG4gICAgICAgICAgICBpZiAoIWIuaGFzT3duUHJvcGVydHkoa2V5c1tpXSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspIHtcbiAgICAgICAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICAgICAgICBpZiAoIV9hcmVFcXVhbHMoYVtrZXldLCBiW2tleV0pKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGEgIT09IGEgJiYgYiAhPT0gYjtcbn1cbjtcbiIsICIvKiFcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9TdGFyY291bnRlci1KYWNrL0pTT04tUGF0Y2hcbiAqIChjKSAyMDE3LTIwMjIgSm9hY2hpbSBXZXN0ZXJcbiAqIE1JVCBsaWNlbnNlZFxuICovXG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbnZhciBfaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuZXhwb3J0IGZ1bmN0aW9uIGhhc093blByb3BlcnR5KG9iaiwga2V5KSB7XG4gICAgcmV0dXJuIF9oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfb2JqZWN0S2V5cyhvYmopIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgIHZhciBrZXlzXzEgPSBuZXcgQXJyYXkob2JqLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwga2V5c18xLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICBrZXlzXzFba10gPSBcIlwiICsgaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ga2V5c18xO1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LmtleXMpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaik7XG4gICAgfVxuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIgaSBpbiBvYmopIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5KG9iaiwgaSkpIHtcbiAgICAgICAgICAgIGtleXMucHVzaChpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ga2V5cztcbn1cbjtcbi8qKlxuKiBEZWVwbHkgY2xvbmUgdGhlIG9iamVjdC5cbiogaHR0cHM6Ly9qc3BlcmYuY29tL2RlZXAtY29weS12cy1qc29uLXN0cmluZ2lmeS1qc29uLXBhcnNlLzI1IChyZWN1cnNpdmVEZWVwQ29weSlcbiogQHBhcmFtICB7YW55fSBvYmogdmFsdWUgdG8gY2xvbmVcbiogQHJldHVybiB7YW55fSBjbG9uZWQgb2JqXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIF9kZWVwQ2xvbmUob2JqKSB7XG4gICAgc3dpdGNoICh0eXBlb2Ygb2JqKSB7XG4gICAgICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpOyAvL0Zhc3RlciB0aGFuIEVTNSBjbG9uZSAtIGh0dHA6Ly9qc3BlcmYuY29tL2RlZXAtY2xvbmluZy1vZi1vYmplY3RzLzVcbiAgICAgICAgY2FzZSBcInVuZGVmaW5lZFwiOlxuICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vdGhpcyBpcyBob3cgSlNPTi5zdHJpbmdpZnkgYmVoYXZlcyBmb3IgYXJyYXkgaXRlbXNcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBvYmo7IC8vbm8gbmVlZCB0byBjbG9uZSBwcmltaXRpdmVzXG4gICAgfVxufVxuLy8zeCBmYXN0ZXIgdGhhbiBjYWNoZWQgL15cXGQrJC8udGVzdChzdHIpXG5leHBvcnQgZnVuY3Rpb24gaXNJbnRlZ2VyKHN0cikge1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgbGVuID0gc3RyLmxlbmd0aDtcbiAgICB2YXIgY2hhckNvZGU7XG4gICAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICAgICAgY2hhckNvZGUgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgICAgaWYgKGNoYXJDb2RlID49IDQ4ICYmIGNoYXJDb2RlIDw9IDU3KSB7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuLyoqXG4qIEVzY2FwZXMgYSBqc29uIHBvaW50ZXIgcGF0aFxuKiBAcGFyYW0gcGF0aCBUaGUgcmF3IHBvaW50ZXJcbiogQHJldHVybiB0aGUgRXNjYXBlZCBwYXRoXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZVBhdGhDb21wb25lbnQocGF0aCkge1xuICAgIGlmIChwYXRoLmluZGV4T2YoJy8nKSA9PT0gLTEgJiYgcGF0aC5pbmRleE9mKCd+JykgPT09IC0xKVxuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICByZXR1cm4gcGF0aC5yZXBsYWNlKC9+L2csICd+MCcpLnJlcGxhY2UoL1xcLy9nLCAnfjEnKTtcbn1cbi8qKlxuICogVW5lc2NhcGVzIGEganNvbiBwb2ludGVyIHBhdGhcbiAqIEBwYXJhbSBwYXRoIFRoZSBlc2NhcGVkIHBvaW50ZXJcbiAqIEByZXR1cm4gVGhlIHVuZXNjYXBlZCBwYXRoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmVzY2FwZVBhdGhDb21wb25lbnQocGF0aCkge1xuICAgIHJldHVybiBwYXRoLnJlcGxhY2UoL34xL2csICcvJykucmVwbGFjZSgvfjAvZywgJ34nKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfZ2V0UGF0aFJlY3Vyc2l2ZShyb290LCBvYmopIHtcbiAgICB2YXIgZm91bmQ7XG4gICAgZm9yICh2YXIga2V5IGluIHJvb3QpIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5KHJvb3QsIGtleSkpIHtcbiAgICAgICAgICAgIGlmIChyb290W2tleV0gPT09IG9iaikge1xuICAgICAgICAgICAgICAgIHJldHVybiBlc2NhcGVQYXRoQ29tcG9uZW50KGtleSkgKyAnLyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2Ygcm9vdFtrZXldID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIGZvdW5kID0gX2dldFBhdGhSZWN1cnNpdmUocm9vdFtrZXldLCBvYmopO1xuICAgICAgICAgICAgICAgIGlmIChmb3VuZCAhPSAnJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXNjYXBlUGF0aENvbXBvbmVudChrZXkpICsgJy8nICsgZm91bmQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAnJztcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXRoKHJvb3QsIG9iaikge1xuICAgIGlmIChyb290ID09PSBvYmopIHtcbiAgICAgICAgcmV0dXJuICcvJztcbiAgICB9XG4gICAgdmFyIHBhdGggPSBfZ2V0UGF0aFJlY3Vyc2l2ZShyb290LCBvYmopO1xuICAgIGlmIChwYXRoID09PSAnJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJPYmplY3Qgbm90IGZvdW5kIGluIHJvb3RcIik7XG4gICAgfVxuICAgIHJldHVybiBcIi9cIiArIHBhdGg7XG59XG4vKipcbiogUmVjdXJzaXZlbHkgY2hlY2tzIHdoZXRoZXIgYW4gb2JqZWN0IGhhcyBhbnkgdW5kZWZpbmVkIHZhbHVlcyBpbnNpZGUuXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1VuZGVmaW5lZChvYmopIHtcbiAgICBpZiAob2JqID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChvYmopIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICAgICAgZm9yICh2YXIgaV8xID0gMCwgbGVuID0gb2JqLmxlbmd0aDsgaV8xIDwgbGVuOyBpXzErKykge1xuICAgICAgICAgICAgICAgIGlmIChoYXNVbmRlZmluZWQob2JqW2lfMV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICB2YXIgb2JqS2V5cyA9IF9vYmplY3RLZXlzKG9iaik7XG4gICAgICAgICAgICB2YXIgb2JqS2V5c0xlbmd0aCA9IG9iaktleXMubGVuZ3RoO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmpLZXlzTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaGFzVW5kZWZpbmVkKG9ialtvYmpLZXlzW2ldXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHBhdGNoRXJyb3JNZXNzYWdlRm9ybWF0dGVyKG1lc3NhZ2UsIGFyZ3MpIHtcbiAgICB2YXIgbWVzc2FnZVBhcnRzID0gW21lc3NhZ2VdO1xuICAgIGZvciAodmFyIGtleSBpbiBhcmdzKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHR5cGVvZiBhcmdzW2tleV0gPT09ICdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoYXJnc1trZXldLCBudWxsLCAyKSA6IGFyZ3Nba2V5XTsgLy8gcHJldHR5IHByaW50XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBtZXNzYWdlUGFydHMucHVzaChrZXkgKyBcIjogXCIgKyB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1lc3NhZ2VQYXJ0cy5qb2luKCdcXG4nKTtcbn1cbnZhciBQYXRjaEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQYXRjaEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBhdGNoRXJyb3IobWVzc2FnZSwgbmFtZSwgaW5kZXgsIG9wZXJhdGlvbiwgdHJlZSkge1xuICAgICAgICB2YXIgX25ld1RhcmdldCA9IHRoaXMuY29uc3RydWN0b3I7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHBhdGNoRXJyb3JNZXNzYWdlRm9ybWF0dGVyKG1lc3NhZ2UsIHsgbmFtZTogbmFtZSwgaW5kZXg6IGluZGV4LCBvcGVyYXRpb246IG9wZXJhdGlvbiwgdHJlZTogdHJlZSB9KSkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIF90aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIF90aGlzLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjtcbiAgICAgICAgX3RoaXMudHJlZSA9IHRyZWU7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihfdGhpcywgX25ld1RhcmdldC5wcm90b3R5cGUpOyAvLyByZXN0b3JlIHByb3RvdHlwZSBjaGFpbiwgc2VlIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80ODM0MjM1OVxuICAgICAgICBfdGhpcy5tZXNzYWdlID0gcGF0Y2hFcnJvck1lc3NhZ2VGb3JtYXR0ZXIobWVzc2FnZSwgeyBuYW1lOiBuYW1lLCBpbmRleDogaW5kZXgsIG9wZXJhdGlvbjogb3BlcmF0aW9uLCB0cmVlOiB0cmVlIH0pO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBQYXRjaEVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgUGF0Y2hFcnJvciB9O1xuIiwgIi8qIVxuICogaHR0cHM6Ly9naXRodWIuY29tL1N0YXJjb3VudGVyLUphY2svSlNPTi1QYXRjaFxuICogKGMpIDIwMTctMjAyMSBKb2FjaGltIFdlc3RlclxuICogTUlUIGxpY2Vuc2VcbiAqL1xuaW1wb3J0IHsgX2RlZXBDbG9uZSwgX29iamVjdEtleXMsIGVzY2FwZVBhdGhDb21wb25lbnQsIGhhc093blByb3BlcnR5IH0gZnJvbSAnLi9oZWxwZXJzLm1qcyc7XG5pbXBvcnQgeyBhcHBseVBhdGNoIH0gZnJvbSAnLi9jb3JlLm1qcyc7XG52YXIgYmVmb3JlRGljdCA9IG5ldyBXZWFrTWFwKCk7XG52YXIgTWlycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE1pcnJvcihvYmopIHtcbiAgICAgICAgdGhpcy5vYnNlcnZlcnMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMub2JqID0gb2JqO1xuICAgIH1cbiAgICByZXR1cm4gTWlycm9yO1xufSgpKTtcbnZhciBPYnNlcnZlckluZm8gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gT2JzZXJ2ZXJJbmZvKGNhbGxiYWNrLCBvYnNlcnZlcikge1xuICAgICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIgPSBvYnNlcnZlcjtcbiAgICB9XG4gICAgcmV0dXJuIE9ic2VydmVySW5mbztcbn0oKSk7XG5mdW5jdGlvbiBnZXRNaXJyb3Iob2JqKSB7XG4gICAgcmV0dXJuIGJlZm9yZURpY3QuZ2V0KG9iaik7XG59XG5mdW5jdGlvbiBnZXRPYnNlcnZlckZyb21NaXJyb3IobWlycm9yLCBjYWxsYmFjaykge1xuICAgIHJldHVybiBtaXJyb3Iub2JzZXJ2ZXJzLmdldChjYWxsYmFjayk7XG59XG5mdW5jdGlvbiByZW1vdmVPYnNlcnZlckZyb21NaXJyb3IobWlycm9yLCBvYnNlcnZlcikge1xuICAgIG1pcnJvci5vYnNlcnZlcnMuZGVsZXRlKG9ic2VydmVyLmNhbGxiYWNrKTtcbn1cbi8qKlxuICogRGV0YWNoIGFuIG9ic2VydmVyIGZyb20gYW4gb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bm9ic2VydmUocm9vdCwgb2JzZXJ2ZXIpIHtcbiAgICBvYnNlcnZlci51bm9ic2VydmUoKTtcbn1cbi8qKlxuICogT2JzZXJ2ZXMgY2hhbmdlcyBtYWRlIHRvIGFuIG9iamVjdCwgd2hpY2ggY2FuIHRoZW4gYmUgcmV0cmlldmVkIHVzaW5nIGdlbmVyYXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvYnNlcnZlKG9iaiwgY2FsbGJhY2spIHtcbiAgICB2YXIgcGF0Y2hlcyA9IFtdO1xuICAgIHZhciBvYnNlcnZlcjtcbiAgICB2YXIgbWlycm9yID0gZ2V0TWlycm9yKG9iaik7XG4gICAgaWYgKCFtaXJyb3IpIHtcbiAgICAgICAgbWlycm9yID0gbmV3IE1pcnJvcihvYmopO1xuICAgICAgICBiZWZvcmVEaWN0LnNldChvYmosIG1pcnJvcik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YXIgb2JzZXJ2ZXJJbmZvID0gZ2V0T2JzZXJ2ZXJGcm9tTWlycm9yKG1pcnJvciwgY2FsbGJhY2spO1xuICAgICAgICBvYnNlcnZlciA9IG9ic2VydmVySW5mbyAmJiBvYnNlcnZlckluZm8ub2JzZXJ2ZXI7XG4gICAgfVxuICAgIGlmIChvYnNlcnZlcikge1xuICAgICAgICByZXR1cm4gb2JzZXJ2ZXI7XG4gICAgfVxuICAgIG9ic2VydmVyID0ge307XG4gICAgbWlycm9yLnZhbHVlID0gX2RlZXBDbG9uZShvYmopO1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICBvYnNlcnZlci5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICBvYnNlcnZlci5uZXh0ID0gbnVsbDtcbiAgICAgICAgdmFyIGRpcnR5Q2hlY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBnZW5lcmF0ZShvYnNlcnZlcik7XG4gICAgICAgIH07XG4gICAgICAgIHZhciBmYXN0Q2hlY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQob2JzZXJ2ZXIubmV4dCk7XG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0ID0gc2V0VGltZW91dChkaXJ0eUNoZWNrKTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7IC8vbm90IE5vZGVcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgZmFzdENoZWNrKTtcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIGZhc3RDaGVjayk7XG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgZmFzdENoZWNrKTtcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZmFzdENoZWNrKTtcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmYXN0Q2hlY2spO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9ic2VydmVyLnBhdGNoZXMgPSBwYXRjaGVzO1xuICAgIG9ic2VydmVyLm9iamVjdCA9IG9iajtcbiAgICBvYnNlcnZlci51bm9ic2VydmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGdlbmVyYXRlKG9ic2VydmVyKTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KG9ic2VydmVyLm5leHQpO1xuICAgICAgICByZW1vdmVPYnNlcnZlckZyb21NaXJyb3IobWlycm9yLCBvYnNlcnZlcik7XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBmYXN0Q2hlY2spO1xuICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXVwJywgZmFzdENoZWNrKTtcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBmYXN0Q2hlY2spO1xuICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBmYXN0Q2hlY2spO1xuICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZhc3RDaGVjayk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIG1pcnJvci5vYnNlcnZlcnMuc2V0KGNhbGxiYWNrLCBuZXcgT2JzZXJ2ZXJJbmZvKGNhbGxiYWNrLCBvYnNlcnZlcikpO1xuICAgIHJldHVybiBvYnNlcnZlcjtcbn1cbi8qKlxuICogR2VuZXJhdGUgYW4gYXJyYXkgb2YgcGF0Y2hlcyBmcm9tIGFuIG9ic2VydmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZShvYnNlcnZlciwgaW52ZXJ0aWJsZSkge1xuICAgIGlmIChpbnZlcnRpYmxlID09PSB2b2lkIDApIHsgaW52ZXJ0aWJsZSA9IGZhbHNlOyB9XG4gICAgdmFyIG1pcnJvciA9IGJlZm9yZURpY3QuZ2V0KG9ic2VydmVyLm9iamVjdCk7XG4gICAgX2dlbmVyYXRlKG1pcnJvci52YWx1ZSwgb2JzZXJ2ZXIub2JqZWN0LCBvYnNlcnZlci5wYXRjaGVzLCBcIlwiLCBpbnZlcnRpYmxlKTtcbiAgICBpZiAob2JzZXJ2ZXIucGF0Y2hlcy5sZW5ndGgpIHtcbiAgICAgICAgYXBwbHlQYXRjaChtaXJyb3IudmFsdWUsIG9ic2VydmVyLnBhdGNoZXMpO1xuICAgIH1cbiAgICB2YXIgdGVtcCA9IG9ic2VydmVyLnBhdGNoZXM7XG4gICAgaWYgKHRlbXAubGVuZ3RoID4gMCkge1xuICAgICAgICBvYnNlcnZlci5wYXRjaGVzID0gW107XG4gICAgICAgIGlmIChvYnNlcnZlci5jYWxsYmFjaykge1xuICAgICAgICAgICAgb2JzZXJ2ZXIuY2FsbGJhY2sodGVtcCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRlbXA7XG59XG4vLyBEaXJ0eSBjaGVjayBpZiBvYmogaXMgZGlmZmVyZW50IGZyb20gbWlycm9yLCBnZW5lcmF0ZSBwYXRjaGVzIGFuZCB1cGRhdGUgbWlycm9yXG5mdW5jdGlvbiBfZ2VuZXJhdGUobWlycm9yLCBvYmosIHBhdGNoZXMsIHBhdGgsIGludmVydGlibGUpIHtcbiAgICBpZiAob2JqID09PSBtaXJyb3IpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iai50b0pTT04gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBvYmogPSBvYmoudG9KU09OKCk7XG4gICAgfVxuICAgIHZhciBuZXdLZXlzID0gX29iamVjdEtleXMob2JqKTtcbiAgICB2YXIgb2xkS2V5cyA9IF9vYmplY3RLZXlzKG1pcnJvcik7XG4gICAgdmFyIGNoYW5nZWQgPSBmYWxzZTtcbiAgICB2YXIgZGVsZXRlZCA9IGZhbHNlO1xuICAgIC8vaWYgZXZlciBcIm1vdmVcIiBvcGVyYXRpb24gaXMgaW1wbGVtZW50ZWQgaGVyZSwgbWFrZSBzdXJlIHRoaXMgdGVzdCBydW5zIE9LOiBcInNob3VsZCBub3QgZ2VuZXJhdGUgdGhlIHNhbWUgcGF0Y2ggdHdpY2UgKG1vdmUpXCJcbiAgICBmb3IgKHZhciB0ID0gb2xkS2V5cy5sZW5ndGggLSAxOyB0ID49IDA7IHQtLSkge1xuICAgICAgICB2YXIga2V5ID0gb2xkS2V5c1t0XTtcbiAgICAgICAgdmFyIG9sZFZhbCA9IG1pcnJvcltrZXldO1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkob2JqLCBrZXkpICYmICEob2JqW2tleV0gPT09IHVuZGVmaW5lZCAmJiBvbGRWYWwgIT09IHVuZGVmaW5lZCAmJiBBcnJheS5pc0FycmF5KG9iaikgPT09IGZhbHNlKSkge1xuICAgICAgICAgICAgdmFyIG5ld1ZhbCA9IG9ialtrZXldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvbGRWYWwgPT0gXCJvYmplY3RcIiAmJiBvbGRWYWwgIT0gbnVsbCAmJiB0eXBlb2YgbmV3VmFsID09IFwib2JqZWN0XCIgJiYgbmV3VmFsICE9IG51bGwgJiYgQXJyYXkuaXNBcnJheShvbGRWYWwpID09PSBBcnJheS5pc0FycmF5KG5ld1ZhbCkpIHtcbiAgICAgICAgICAgICAgICBfZ2VuZXJhdGUob2xkVmFsLCBuZXdWYWwsIHBhdGNoZXMsIHBhdGggKyBcIi9cIiArIGVzY2FwZVBhdGhDb21wb25lbnQoa2V5KSwgaW52ZXJ0aWJsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAob2xkVmFsICE9PSBuZXdWYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnZlcnRpYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRjaGVzLnB1c2goeyBvcDogXCJ0ZXN0XCIsIHBhdGg6IHBhdGggKyBcIi9cIiArIGVzY2FwZVBhdGhDb21wb25lbnQoa2V5KSwgdmFsdWU6IF9kZWVwQ2xvbmUob2xkVmFsKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwYXRjaGVzLnB1c2goeyBvcDogXCJyZXBsYWNlXCIsIHBhdGg6IHBhdGggKyBcIi9cIiArIGVzY2FwZVBhdGhDb21wb25lbnQoa2V5KSwgdmFsdWU6IF9kZWVwQ2xvbmUobmV3VmFsKSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShtaXJyb3IpID09PSBBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgICAgIGlmIChpbnZlcnRpYmxlKSB7XG4gICAgICAgICAgICAgICAgcGF0Y2hlcy5wdXNoKHsgb3A6IFwidGVzdFwiLCBwYXRoOiBwYXRoICsgXCIvXCIgKyBlc2NhcGVQYXRoQ29tcG9uZW50KGtleSksIHZhbHVlOiBfZGVlcENsb25lKG9sZFZhbCkgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXRjaGVzLnB1c2goeyBvcDogXCJyZW1vdmVcIiwgcGF0aDogcGF0aCArIFwiL1wiICsgZXNjYXBlUGF0aENvbXBvbmVudChrZXkpIH0pO1xuICAgICAgICAgICAgZGVsZXRlZCA9IHRydWU7IC8vIHByb3BlcnR5IGhhcyBiZWVuIGRlbGV0ZWRcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpbnZlcnRpYmxlKSB7XG4gICAgICAgICAgICAgICAgcGF0Y2hlcy5wdXNoKHsgb3A6IFwidGVzdFwiLCBwYXRoOiBwYXRoLCB2YWx1ZTogbWlycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGF0Y2hlcy5wdXNoKHsgb3A6IFwicmVwbGFjZVwiLCBwYXRoOiBwYXRoLCB2YWx1ZTogb2JqIH0pO1xuICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFkZWxldGVkICYmIG5ld0tleXMubGVuZ3RoID09IG9sZEtleXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yICh2YXIgdCA9IDA7IHQgPCBuZXdLZXlzLmxlbmd0aDsgdCsrKSB7XG4gICAgICAgIHZhciBrZXkgPSBuZXdLZXlzW3RdO1xuICAgICAgICBpZiAoIWhhc093blByb3BlcnR5KG1pcnJvciwga2V5KSAmJiBvYmpba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBwYXRjaGVzLnB1c2goeyBvcDogXCJhZGRcIiwgcGF0aDogcGF0aCArIFwiL1wiICsgZXNjYXBlUGF0aENvbXBvbmVudChrZXkpLCB2YWx1ZTogX2RlZXBDbG9uZShvYmpba2V5XSkgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIENyZWF0ZSBhbiBhcnJheSBvZiBwYXRjaGVzIGZyb20gdGhlIGRpZmZlcmVuY2VzIGluIHR3byBvYmplY3RzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wYXJlKHRyZWUxLCB0cmVlMiwgaW52ZXJ0aWJsZSkge1xuICAgIGlmIChpbnZlcnRpYmxlID09PSB2b2lkIDApIHsgaW52ZXJ0aWJsZSA9IGZhbHNlOyB9XG4gICAgdmFyIHBhdGNoZXMgPSBbXTtcbiAgICBfZ2VuZXJhdGUodHJlZTEsIHRyZWUyLCBwYXRjaGVzLCAnJywgaW52ZXJ0aWJsZSk7XG4gICAgcmV0dXJuIHBhdGNoZXM7XG59XG4iLCAiZXhwb3J0ICogZnJvbSAnLi9tb2R1bGUvY29yZS5tanMnO1xuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGUvZHVwbGV4Lm1qcyc7XG5leHBvcnQge1xuICAgIFBhdGNoRXJyb3IgYXMgSnNvblBhdGNoRXJyb3IsXG4gICAgX2RlZXBDbG9uZSBhcyBkZWVwQ2xvbmUsXG4gICAgZXNjYXBlUGF0aENvbXBvbmVudCxcbiAgICB1bmVzY2FwZVBhdGhDb21wb25lbnRcbn0gZnJvbSAnLi9tb2R1bGUvaGVscGVycy5tanMnO1xuXG5cbi8qKlxuICogRGVmYXVsdCBleHBvcnQgZm9yIGJhY2t3YXJkcyBjb21wYXRcbiAqL1xuXG5pbXBvcnQgKiBhcyBjb3JlIGZyb20gJy4vbW9kdWxlL2NvcmUubWpzJztcbmltcG9ydCAqIGFzIGR1cGxleCBmcm9tICcuL21vZHVsZS9kdXBsZXgubWpzJztcbmltcG9ydCB7XG4gICAgUGF0Y2hFcnJvciBhcyBKc29uUGF0Y2hFcnJvcixcbiAgICBfZGVlcENsb25lIGFzIGRlZXBDbG9uZSxcbiAgICBlc2NhcGVQYXRoQ29tcG9uZW50LFxuICAgIHVuZXNjYXBlUGF0aENvbXBvbmVudFxufSBmcm9tICcuL21vZHVsZS9oZWxwZXJzLm1qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IE9iamVjdC5hc3NpZ24oe30sIGNvcmUsIGR1cGxleCwge1xuICAgIEpzb25QYXRjaEVycm9yLFxuICAgIGRlZXBDbG9uZSxcbiAgICBlc2NhcGVQYXRoQ29tcG9uZW50LFxuICAgIHVuZXNjYXBlUGF0aENvbXBvbmVudFxufSk7IiwgImltcG9ydCB7IGFwcGx5UGF0Y2gsIGNvbXBhcmUsIGRlZXBDbG9uZSwgZ2V0VmFsdWVCeVBvaW50ZXIsIE9wZXJhdGlvbiB9IGZyb20gXCJmYXN0LWpzb24tcGF0Y2hcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTdG9yZVN1YnNjcmliZXIge1xuICAgIChjdXI6IGFueSwgcHJldjogYW55KTogYW55XG59XG5jb25zdCBTVE9SRV9NVVRBVElPTlMgPSBTeW1ib2woJ1NUT1JFX01VVEFUSU9OUycpO1xuXG5leHBvcnQgY2xhc3MgU3RvcmU8VCBleHRlbmRzIE9iamVjdD4ge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfZGF0YTogVDtcbiAgICAvLyBwdWJsaWMgZGF0YTogUmVhZG9ubHk8VD47XG4gICAgcHJvdGVjdGVkIF9tdXRhdGlvblJlY29yZHM6IE9wZXJhdGlvbltdID0gW11cbiAgICBwcm90ZWN0ZWQgc3RvcmVkTWluVmVyc2lvbiA9IDA7IC8vIHRoZSB2ZXJzaW9uIG9mIHRoZSBkYXRhIHRoYXQgaGFzIGJlZW4gc2VudCB0byB0aGUgc2VydmVyXG4gICAgcHJvdGVjdGVkIF92ZXJzaW9uID0gMDsgLy8gdGhlIHZlcnNpb24gb2YgdGhlIGRhdGEgdGhhdCBoYXMgYmVlbiBtb2RpZmllZCBidXQgbm90IHNlbnQgdG8gdGhlIHNlcnZlclxuICAgIHB1YmxpYyBnZXQgdmVyc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZlcnNpb247XG4gICAgfVxuICAgIHB1YmxpYyBmbHVzaCgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbnM6IHRoaXMuX211dGF0aW9uUmVjb3Jkcy5zbGljZSgwKSxcbiAgICAgICAgICAgIGZyb21WZXJzaW9uOiB0aGlzLnN0b3JlZE1pblZlcnNpb24sXG4gICAgICAgICAgICB0b1ZlcnNpb246IHRoaXMudmVyc2lvblxuICAgICAgICB9XG4gICAgfSBcbiAgICBwdWJsaWMgZmx1c2hEb25lKHZlcnNpb246IG51bWJlcikge1xuICAgICAgICB0aGlzLl9tdXRhdGlvblJlY29yZHMgPSB0aGlzLl9tdXRhdGlvblJlY29yZHMuc2xpY2UodmVyc2lvbiAtIHRoaXMuc3RvcmVkTWluVmVyc2lvbik7XG4gICAgICAgIHRoaXMuc3RvcmVkTWluVmVyc2lvbiA9IHZlcnNpb247XG4gICAgfVxuICAgIHB1YmxpYyBwYXRjaFZlcnNpb25BY2NlcHRhYmxlKGZyb21WZXJzaW9uOiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZlcnNpb24gIT0gLTEgJiYgZnJvbVZlcnNpb24gPD0gdGhpcy5fdmVyc2lvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGF0Y2hEYXRhKG9wZXJhdGlvbnM6IE9wZXJhdGlvbltdKSB7XG4gICAgICAgIC8vIGlmICh0aGlzLnN0b3JlZE1pblZlcnNpb24gPCB0aGlzLl92ZXJzaW9uKSB7XG4gICAgICAgIC8vICAgICBvcGVyYXRpb25zID0gb3BlcmF0aW9ucy5zbGljZSh0aGlzLnN0b3JlZE1pblZlcnNpb24gLSB0aGlzLl92ZXJzaW9uKTtcbiAgICAgICAgLy8gfVxuICAgICAgICBjb25zdCBvcmlnaW5EYXRhID0gZGVlcENsb25lKHRoaXMuX2RhdGEpO1xuICAgICAgICBhcHBseVBhdGNoKHRoaXMuX2RhdGEsIG9wZXJhdGlvbnMpO1xuICAgICAgICB0aGlzLl92ZXJzaW9uICs9IG9wZXJhdGlvbnMubGVuZ3RoO1xuICAgICAgICB0aGlzLnN0b3JlZE1pblZlcnNpb24gPSB0aGlzLl92ZXJzaW9uO1xuICAgICAgICB0aGlzLmRpc3BhdGNoKG9wZXJhdGlvbnMsIG9yaWdpbkRhdGEpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGF0YSgpOiBUIHtcbiAgICAgICAgcmV0dXJuIGRlZXBDbG9uZSh0aGlzLl9kYXRhKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgW1NUT1JFX01VVEFUSU9OU106IHN0cmluZ1tdID0gW107XG4gICAgY29uc3RydWN0b3IoZGF0YTogVCkge1xuICAgICAgICB0aGlzLl9kYXRhID0gZGVlcENsb25lKGRhdGEpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzeW5jKGRhdGE6IFQsIHZlcnNpb246IG51bWJlcikge1xuICAgICAgICBjb25zdCBvcmlnaW5EYXRhID0gdGhpcy5fZGF0YTtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9ucyA9IGNvbXBhcmUob3JpZ2luRGF0YSwgZGF0YSk7XG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLl9kYXRhLCBkYXRhKTtcbiAgICAgICAgdGhpcy5zdG9yZWRNaW5WZXJzaW9uID0gdGhpcy5fdmVyc2lvbiA9IHZlcnNpb247XG5cbiAgICAgICAgdGhpcy5kaXNwYXRjaChvcGVyYXRpb25zLCBvcmlnaW5EYXRhKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc3Vic2NyaWJlcnM6IFtzdHJpbmcsIFN0b3JlU3Vic2NyaWJlcl1bXSA9IFtdO1xuICAgIHB1YmxpYyBzdWJzY3JpYmUocGF0aDogc3RyaW5nLCBjYWxsYmFjazogU3RvcmVTdWJzY3JpYmVyKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlcnMucHVzaChbcGF0aCwgY2FsbGJhY2tdKTtcbiAgICB9XG4gICAgcHVibGljIHVuc3Vic2NyaWJlKGNhbGxiYWNrOiBTdG9yZVN1YnNjcmliZXIpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVycyA9IHRoaXMuc3Vic2NyaWJlcnMuZmlsdGVyKChbcGF0aCwgY2JdKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gY2IgIT0gY2FsbGJhY2s7XG4gICAgICAgIH0pXG4gICAgfVxuICAgIHByb3RlY3RlZCBkaXNwYXRjaChvcGVyYXRpb25zOiBPcGVyYXRpb25bXSwgb3JpZ2luRGF0YTogYW55KSB7XG4gICAgICAgIC8vIFRyYWNrIGNoYW5nZWQgcGF0aHMgYW5kIHRoZWlyIG9yaWdpbmFsIHZhbHVlc1xuICAgICAgICBjb25zdCBjaGFuZ2VkUGF0aHMgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICAgICAgICBcbiAgICAgICAgLy8gUmVjb3JkIGFsbCBjaGFuZ2VzIGZpcnN0XG4gICAgICAgIG9wZXJhdGlvbnMuZm9yRWFjaChvcCA9PiB7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmliZXJzLmZvckVhY2goKFtwYXRoLCBfXSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChvcC5wYXRoLnN0YXJ0c1dpdGgocGF0aCkgJiYgIWNoYW5nZWRQYXRocy5oYXMocGF0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlZFBhdGhzLnNldChwYXRoLCBKU09OLnN0cmluZ2lmeShwYXRoID09PSBcIi9cIiA/IG9yaWdpbkRhdGEgOiBnZXRWYWx1ZUJ5UG9pbnRlcihvcmlnaW5EYXRhLCBwYXRoKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBUaGVuIHRyaWdnZXIgY2FsbGJhY2tzIGZvciBwYXRocyB0aGF0IGFjdHVhbGx5IGNoYW5nZWRcbiAgICAgICAgY2hhbmdlZFBhdGhzLmZvckVhY2goKG9yaWdpblZhbHVlSlNPTiwgcGF0aCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBwYXRoID09PSBcIi9cIiA/IHRoaXMuX2RhdGEgOiBnZXRWYWx1ZUJ5UG9pbnRlcih0aGlzLl9kYXRhLCBwYXRoKTtcbiAgICAgICAgICAgIC8vIE9ubHkgdHJpZ2dlciBpZiB2YWx1ZXMgYXJlIGRpZmZlcmVudFxuICAgICAgICAgICAgaWYgKG9yaWdpblZhbHVlSlNPTiAhPT0gSlNPTi5zdHJpbmdpZnkobmV3VmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVyc1xuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChbc3ViUGF0aCwgX10pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWJQYXRoID09PSBwYXRoXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKChbXywgY2FsbGJhY2tdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzID0ge31cbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gY2FsbGJhY2sobmV3VmFsdWUsIEpTT04ucGFyc2Uob3JpZ2luVmFsdWVKU09OIHx8IHt9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUuc3RhY2sgfHwgZS5tZXNzYWdlIHx8IGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuY2F0Y2goKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUuc3RhY2sgfHwgZS5tZXNzYWdlIHx8IGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIFN0b3JlTXV0YXRpb24odGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBzdHJpbmcsIG9yaWdpbmFsRGVzY3JpcHRvcjogYW55KSB7XG4gICAgaWYgKCF0YXJnZXQuY29uc3RydWN0b3JbU1RPUkVfTVVUQVRJT05TXSkge1xuICAgICAgICB0YXJnZXQuY29uc3RydWN0b3JbU1RPUkVfTVVUQVRJT05TXSA9IFtdO1xuICAgIH1cbiAgICB0YXJnZXQuY29uc3RydWN0b3JbU1RPUkVfTVVUQVRJT05TXS5wdXNoKHByb3BlcnR5S2V5KTtcbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogZnVuY3Rpb24odGhpczogU3RvcmU8YW55PiwgLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbkRhdGEgPSBkZWVwQ2xvbmUodGhpcy5fZGF0YSk7XG4gICAgICAgICAgICBvcmlnaW5hbERlc2NyaXB0b3IudmFsdWUuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgICAgICBjb25zdCBvcGVyYXRpb25zID0gY29tcGFyZShvcmlnaW5EYXRhLCB0aGlzLl9kYXRhKTtcbiAgICAgICAgICAgIGlmIChvcGVyYXRpb25zLmxlbmd0aCA9PSAwKSByZXR1cm47XG4gICAgICAgICAgICB0aGlzLl9tdXRhdGlvblJlY29yZHMucHVzaCguLi5vcGVyYXRpb25zKTtcbiAgICAgICAgICAgIHRoaXMuX3ZlcnNpb24gKz0gb3BlcmF0aW9ucy5sZW5ndGg7XG5cbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2gob3BlcmF0aW9ucywgb3JpZ2luRGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5pbnRlcmZhY2UgTWFpblN0b3JlRGF0YSB7ICAgXG4gICAgc2lkOiBzdHJpbmdcbiAgICBzc2lkOiBzdHJpbmdcbn1cbmV4cG9ydCBjbGFzcyBNYWluU3RvcmU8VCBleHRlbmRzIE9iamVjdD4gZXh0ZW5kcyBTdG9yZTxUICYgTWFpblN0b3JlRGF0YT4ge1xuICAgIGNvbnN0cnVjdG9yKGRhdGE6IFQpIHtcbiAgICAgICAgc3VwZXIoT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICBzaWQ6ICcnLFxuICAgICAgICAgICAgc3NpZDogJydcbiAgICAgICAgfSwgZGF0YSB8fCB7fSkpO1xuICAgIH1cblxuICAgIEBTdG9yZU11dGF0aW9uXG4gICAgc2V0U0lEKHNpZDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2RhdGEuc2lkID0gc2lkO1xuICAgICAgICB0aGlzLl9kYXRhLnNzaWQgPSBzaWQuc2xpY2UoMCwgNCk7XG4gICAgfVxufSIsICJpbXBvcnQgeyBNYWluU3RvcmUsIFN0b3JlTXV0YXRpb24gfSBmcm9tIFwiLi4vY29tbW9uL3N0b3JlL3N0b3JlLm10c1wiO1xuaW1wb3J0IHsgV2lkZ2V0VGFibGVTdHJ1Y3R1cmUsIFdpZGdldFRhYmxlVmFsdWUgfSBmcm9tIFwiLi4vdHlwZXMvc2RwcHBcIjtcblxuZXhwb3J0IGludGVyZmFjZSBQYWdlU3RvcmVEYXRhIHtcbiAgICB0aXRsZTogc3RyaW5nXG4gICAgd2Vidmlld0Zyb21TaWQ6IHN0cmluZyxcblxuICAgIHByb2dyZXNzOiBudW1iZXJcbiAgICBxdWV1ZVNpemU6IG51bWJlclxuICAgIGxhc3RFcnJvcjogc3RyaW5nXG4gICAgZXhlY3V0aW5nTm9kZVRpdGxlOiBzdHJpbmdcblxuICAgIHdpZGdldFRhYmxlU3RydWN0dXJlOiBXaWRnZXRUYWJsZVN0cnVjdHVyZVxuICAgIHdpZGdldFRhYmxlVmFsdWU6IFdpZGdldFRhYmxlVmFsdWVcbiAgICB3aWRnZXRUYWJsZUVycm9yczogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgICB1c2VTbGlkZXJGb3JOdW1iZXJXaWRnZXQ6IGJvb2xlYW5cbiAgICAvLyBsYXN0T3BlbmVkV29ya2Zsb3c6IHN0cmluZ1xuXG4gICAgaGFzUFNETm9kZXM6IGJvb2xlYW5cbiAgICBjb21meVVzZXJUb2tlbjogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBQYWdlU3RvcmUgZXh0ZW5kcyBNYWluU3RvcmU8UGFnZVN0b3JlRGF0YT4ge1xuXG4gICAgY29uc3RydWN0b3IoZGF0YT86IFBhZ2VTdG9yZURhdGEsIHZlcnNpb24/OiBudW1iZXIpIHtcbiAgICAgICAgc3VwZXIoZGF0YSB8fCB7XG4gICAgICAgICAgICB0aXRsZTogJycsXG4gICAgICAgICAgICB3ZWJ2aWV3RnJvbVNpZDogbG9jYXRpb24uc2VhcmNoLm1hdGNoKC93ZWJ2aWV3X2Zyb21zaWQ9KFteJl0rKS8pPy5bMV0gfHwgJycsXG5cbiAgICAgICAgICAgIHByb2dyZXNzOiAwLFxuICAgICAgICAgICAgbGFzdEVycm9yOiAnJyxcbiAgICAgICAgICAgIHF1ZXVlU2l6ZTogMCxcbiAgICAgICAgICAgIGV4ZWN1dGluZ05vZGVUaXRsZTogXCJcIixcblxuICAgICAgICAgICAgd2lkZ2V0VGFibGVTdHJ1Y3R1cmU6IHtcbiAgICAgICAgICAgICAgICB3aWRnZXRUYWJsZVBhdGg6ICcnLFxuICAgICAgICAgICAgICAgIHdpZGdldFRhYmxlUGVyc2lzdGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB3aWRnZXRUYWJsZUlEOiAnJyxcbiAgICAgICAgICAgICAgICBub2Rlczoge30sXG4gICAgICAgICAgICAgICAgZ3JvdXBzOiB7fSxcbiAgICAgICAgICAgICAgICBub2RlSW5kZXhlczogW10sXG4gICAgICAgICAgICAgICAgZXh0cmFPcHRpb25zOiB7fVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdpZGdldFRhYmxlVmFsdWU6IHt9LFxuICAgICAgICAgICAgd2lkZ2V0VGFibGVFcnJvcnM6IHt9LFxuICAgICAgICAgICAgdXNlU2xpZGVyRm9yTnVtYmVyV2lkZ2V0OiBmYWxzZSxcbiAgICAgICAgICAgIC8vIGxhc3RPcGVuZWRXb3JrZmxvdzogJycsXG5cbiAgICAgICAgICAgIGhhc1BTRE5vZGVzOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbWZ5VXNlclRva2VuOiAnJ1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fdmVyc2lvbiA9IHZlcnNpb24gfHwgMDtcbiAgICB9XG4gICAgQFN0b3JlTXV0YXRpb25cbiAgICBzZXRXZWJ2aWV3RnJvbVNpZCh3ZWJ2aWV3RnJvbVNpZDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2RhdGEud2Vidmlld0Zyb21TaWQgPSB3ZWJ2aWV3RnJvbVNpZDtcbiAgICB9XG4gICAgQFN0b3JlTXV0YXRpb25cbiAgICBzZXRUaXRsZSh0aXRsZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2RhdGEudGl0bGUgPSB0aXRsZTtcbiAgICB9XG4gICAgQFN0b3JlTXV0YXRpb25cbiAgICBzZXRQcm9ncmVzcyhwcm9ncmVzczogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX2RhdGEucHJvZ3Jlc3MgPSBwcm9ncmVzcztcbiAgICB9XG4gICAgQFN0b3JlTXV0YXRpb25cbiAgICBzZXRMYXN0RXJyb3IobGFzdEVycm9yOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fZGF0YS5sYXN0RXJyb3IgPSBsYXN0RXJyb3I7XG4gICAgfVxuICAgIEBTdG9yZU11dGF0aW9uXG4gICAgc2V0UXVldWVTaXplKHF1ZXVlU2l6ZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX2RhdGEucXVldWVTaXplID0gcXVldWVTaXplO1xuICAgIH1cbiAgICBAU3RvcmVNdXRhdGlvblxuICAgIHNldEV4ZWN1dGluZ05vZGVUaXRsZShleGVjdXRpbmdOb2RlVGl0bGU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9kYXRhLmV4ZWN1dGluZ05vZGVUaXRsZSA9IGV4ZWN1dGluZ05vZGVUaXRsZTtcbiAgICB9XG4gICAgQFN0b3JlTXV0YXRpb25cbiAgICBzZXRXaWRnZXRUYWJsZVN0cnVjdHVyZSh3aWRnZXRUYWJsZVN0cnVjdHVyZTogUGFnZVN0b3JlRGF0YVsnd2lkZ2V0VGFibGVTdHJ1Y3R1cmUnXSkge1xuICAgICAgICB0aGlzLl9kYXRhLndpZGdldFRhYmxlU3RydWN0dXJlID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh3aWRnZXRUYWJsZVN0cnVjdHVyZSkpO1xuICAgIH1cbiAgICBAU3RvcmVNdXRhdGlvblxuICAgIHNldFdpZGdldFRhYmxlVmFsdWUod2lkZ2V0VGFibGVWYWx1ZTogUGFnZVN0b3JlRGF0YVsnd2lkZ2V0VGFibGVWYWx1ZSddKSB7XG4gICAgICAgIHRoaXMuX2RhdGEud2lkZ2V0VGFibGVWYWx1ZSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkod2lkZ2V0VGFibGVWYWx1ZSkpO1xuICAgIH1cbiAgICBAU3RvcmVNdXRhdGlvblxuICAgIHNldFdpZGdldFRhYmxlRXJyb3JzKHdpZGdldFRhYmxlRXJyb3JzOiBQYWdlU3RvcmVEYXRhWyd3aWRnZXRUYWJsZUVycm9ycyddKSB7XG4gICAgICAgIHRoaXMuX2RhdGEud2lkZ2V0VGFibGVFcnJvcnMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHdpZGdldFRhYmxlRXJyb3JzKSk7XG4gICAgfVxuICAgIEBTdG9yZU11dGF0aW9uXG4gICAgc2V0SGFzUFNETm9kZXMoaGFzUFNETm9kZXM6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fZGF0YS5oYXNQU0ROb2RlcyA9IGhhc1BTRE5vZGVzO1xuICAgIH1cblxuICAgIEBTdG9yZU11dGF0aW9uXG4gICAgc2V0Q29tZnlVc2VyVG9rZW4oY29tZnlVc2VyVG9rZW46IHN0cmluZykge1xuICAgICAgICB0aGlzLl9kYXRhLmNvbWZ5VXNlclRva2VuID0gY29tZnlVc2VyVG9rZW47XG4gICAgfVxuXG4gICAgQFN0b3JlTXV0YXRpb25cbiAgICBzZXRVc2VTbGlkZXJGb3JOdW1iZXJXaWRnZXQodXNlU2xpZGVyRm9yTnVtYmVyV2lkZ2V0OiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2RhdGEudXNlU2xpZGVyRm9yTnVtYmVyV2lkZ2V0ID0gdXNlU2xpZGVyRm9yTnVtYmVyV2lkZ2V0O1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBNYWluU3RvcmUsIFN0b3JlTXV0YXRpb24gfSBmcm9tIFwiLi4vY29tbW9uL3N0b3JlL3N0b3JlLm10c1wiO1xuZXhwb3J0IHR5cGUgSWRlbnRpZnkgPSBuZXZlcjtcblxuZXhwb3J0IGludGVyZmFjZSBMYXllckRhdGEge1xuICAgIGlkOiBudW1iZXIsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGlkZW50aWZ5OiBJZGVudGlmeSxcbiAgICBsZXZlbDogbnVtYmVyLFxuICAgIGZ1bGxQYXRoOiBzdHJpbmcsXG4gICAgZGlydHlJRDogbnVtYmVyXG59XG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50RGF0YSB7XG4gICAgbmFtZTogc3RyaW5nXG4gICAgaWQ6IG51bWJlclxuICAgIGlkZW50aWZ5OiBJZGVudGlmeVxuICAgIGxheWVyczogTGF5ZXJEYXRhW11cbiAgICBjYW52YXNEaXJ0eUlEOiBudW1iZXJcbiAgICBzZWxlY3Rpb25EaXJ0eUlEOiBudW1iZXJcbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIFBob3Rvc2hvcERhdGFEb2N1bWVudCB7XG4gICAgW2lkOiBudW1iZXJdOiBEb2N1bWVudERhdGFcbn1cbmV4cG9ydCBpbnRlcmZhY2UgUGhvdG9zaG9wU3RvcmVEYXRhIHtcbiAgICB1bmFtZTogc3RyaW5nIC8vIHJhbmRvbSBzdHJpbmcgaW5zdGFuY2UgbmFtZVxuICAgIGNvbWZ5VXNlclRva2VuOiBzdHJpbmdcbiAgICBpc0xvY2FsOiBib29sZWFuXG5cbiAgICBhY3RpdmVEb2N1bWVudElEOiBudW1iZXIgIC8vIGFjdGl2ZSBkb2N1bWVudCBuYW1lXG4gICAgZG9jdW1lbnRzOiBQaG90b3Nob3BEYXRhRG9jdW1lbnRcblxuICAgIGNhbnZhc1N0YXRlSUQ6IG51bWJlciAgLy8gbGFzdCBQUyBoaXN0b3J5IHN0YXRlIGlkIHRoYXQgdHJpZ2dlcmVkIGltYWdlIGNoYW5nZVxuICAgIHNlbGVjdGlvblN0YXRlSUQ6IHN0cmluZyAgLy8gbGFzdCBQUyBoaXN0b3J5IHN0YXRlIGlkIHRoYXQgdHJpZ2dlcmVkIHNlbGVjdGlvbiBjaGFuZ2VcbiAgICBoaXN0b3J5U3RhdGVJRDogbnVtYmVyICAvLyBsYXN0IFBTIGhpc3Rvcnkgc3RhdGUgaWRcbn1cblxuZXhwb3J0IGNsYXNzIFBob3Rvc2hvcFN0b3JlIGV4dGVuZHMgTWFpblN0b3JlPFBob3Rvc2hvcFN0b3JlRGF0YT4ge1xuXG4gICAgY29uc3RydWN0b3IoZGF0YT86IFBob3Rvc2hvcFN0b3JlRGF0YSwgdmVyc2lvbj86IG51bWJlcikge1xuICAgICAgICBzdXBlcihkYXRhIHx8IHtcbiAgICAgICAgICAgIHVuYW1lOiAnJyxcbiAgICAgICAgICAgIGNvbWZ5VXNlclRva2VuOiAnJyxcbiAgICAgICAgICAgIGlzTG9jYWw6IGZhbHNlLFxuXG4gICAgICAgICAgICBhY3RpdmVEb2N1bWVudElEOiAwLFxuICAgICAgICAgICAgZG9jdW1lbnRzOiB7fSxcblxuICAgICAgICAgICAgY2FudmFzU3RhdGVJRDogMCxcbiAgICAgICAgICAgIHNlbGVjdGlvblN0YXRlSUQ6ICcnLFxuICAgICAgICAgICAgaGlzdG9yeVN0YXRlSUQ6IDAsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl92ZXJzaW9uID0gdmVyc2lvbiB8fCAwO1xuICAgIH1cblxuICAgIEBTdG9yZU11dGF0aW9uXG4gICAgc2V0SXNMb2NhbChpc0xvY2FsOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2RhdGEuaXNMb2NhbCA9IGlzTG9jYWw7XG4gICAgfVxuXG4gICAgQFN0b3JlTXV0YXRpb25cbiAgICBzZXRVTmFtZSh1aWQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9kYXRhLnVuYW1lID0gJ1BTXycgKyB1aWQ7XG4gICAgfVxuXG4gICAgQFN0b3JlTXV0YXRpb25cbiAgICBzZXREb2N1bWVudChhY3RpdmVEb2N1bWVudElEOiBudW1iZXIsIGRvY3VtZW50czogUGhvdG9zaG9wRGF0YURvY3VtZW50KSB7XG4gICAgICAgIHRoaXMuX2RhdGEuYWN0aXZlRG9jdW1lbnRJRCA9IGFjdGl2ZURvY3VtZW50SUQ7XG4gICAgICAgIHRoaXMuX2RhdGEuZG9jdW1lbnRzID0gZG9jdW1lbnRzO1xuICAgIH1cblxuICAgIEBTdG9yZU11dGF0aW9uXG4gICAgc2V0Q2FudmFzU3RhdGVJRChoaXN0b3J5U3RhdGVJRDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX2RhdGEuY2FudmFzU3RhdGVJRCA9IGhpc3RvcnlTdGF0ZUlEO1xuICAgIH1cbiAgICBAU3RvcmVNdXRhdGlvblxuICAgIHNldFNlbGVjdGlvblN0YXRlSUQoc2VsZWN0aW9uU3RhdGU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9kYXRhLnNlbGVjdGlvblN0YXRlSUQgPSBzZWxlY3Rpb25TdGF0ZTtcbiAgICB9XG4gICAgQFN0b3JlTXV0YXRpb25cbiAgICBzZXRIaXN0b3J5U3RhdGVJRChoaXN0b3J5U3RhdGVJRDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX2RhdGEuaGlzdG9yeVN0YXRlSUQgPSBoaXN0b3J5U3RhdGVJRDtcbiAgICB9XG4gICAgQFN0b3JlTXV0YXRpb25cbiAgICBzZXRDb21meVVzZXJUb2tlbihjb21meVVzZXJUb2tlbjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2RhdGEuY29tZnlVc2VyVG9rZW4gPSBjb21meVVzZXJUb2tlbjtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgU3RvcmVTdWJzY3JpYmVyIH0gZnJvbSBcIi4vc3RvcmUubWpzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmVNYXBTdWJzY3JpYmVyIHtcbiAgICAoa2V5OiBzdHJpbmcsIGN1cjogYW55LCBwcmV2OiBhbnkpOiBhbnlcbn07XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTdG9yZU1hcDxVPiB7XG4gICAgcHJvdGVjdGVkIHN0b3JlTWFwOiBNYXA8c3RyaW5nLCBVPiA9IG5ldyBNYXA8c3RyaW5nLCBVPigpO1xuXG4gICAgYWJzdHJhY3QgY3JlYXRlU3RvcmUoZGF0YTogYW55LCB2ZXJzaW9uOiBudW1iZXIpOiBVO1xuXG4gICAgcHVibGljIHN0b3JlQ291bnQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmVNYXAuc2l6ZTtcbiAgICB9XG4gICAgcHVibGljIGdldFN0b3JlKGtleTogc3RyaW5nKTogVSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlTWFwLmdldChrZXkpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0QWxsU3RvcmUoKTogUmVjb3JkPHN0cmluZywgVT4ge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKHRoaXMuc3RvcmVNYXAuZW50cmllcygpKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc3Vic2NyaWJlcnM6IFtzdHJpbmcsIFN0b3JlTWFwU3Vic2NyaWJlcl1bXSA9IFtdO1xuICAgIHByb3RlY3RlZCBzdWJzY3JpYmVyc1dpdGhvdXRLZXk6IFdlYWtNYXA8U3RvcmVNYXBTdWJzY3JpYmVyLCB7IFtrZXk6IHN0cmluZ106IFN0b3JlU3Vic2NyaWJlciB9PiA9IG5ldyBXZWFrTWFwKCk7XG4gICAgcHVibGljIHN1YnNjcmliZShwYXRoOiBzdHJpbmcsIGNhbGxiYWNrOiBTdG9yZU1hcFN1YnNjcmliZXIpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVycy5wdXNoKFtwYXRoLCBjYWxsYmFja10pO1xuICAgICAgICBjb25zdCBzdWJzY3JpYmVyc1dpdGhvdXRLZXk6IHsgW2tleTogc3RyaW5nXTogU3RvcmVTdWJzY3JpYmVyIH0gPSB7fTtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVyc1dpdGhvdXRLZXkuc2V0KGNhbGxiYWNrLCBzdWJzY3JpYmVyc1dpdGhvdXRLZXkpO1xuICAgICAgICB0aGlzLnN0b3JlTWFwLmZvckVhY2goKHN0b3JlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIHN1YnNjcmliZXJzV2l0aG91dEtleVtrZXldID0gY2FsbGJhY2suYmluZCh0aGlzLCBrZXkpO1xuICAgICAgICAgICAgKHN0b3JlIGFzIGFueSkuc3Vic2NyaWJlKHBhdGgsIHN1YnNjcmliZXJzV2l0aG91dEtleVtrZXldKTtcbiAgICAgICAgfSlcbiAgICB9XG4gICAgcHVibGljIHVuc3Vic2NyaWJlKGNhbGxiYWNrOiBTdG9yZU1hcFN1YnNjcmliZXIpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVycyA9IHRoaXMuc3Vic2NyaWJlcnMuZmlsdGVyKChbcGF0aCwgY2JdKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gY2IgIT0gY2FsbGJhY2s7XG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IHN1YnNjcmliZXJzV2l0aG91dEtleSA9IHRoaXMuc3Vic2NyaWJlcnNXaXRob3V0S2V5LmdldChjYWxsYmFjayk7XG4gICAgICAgIGlmICghc3Vic2NyaWJlcnNXaXRob3V0S2V5KSByZXR1cm47XG4gICAgICAgIHRoaXMuc3RvcmVNYXAuZm9yRWFjaCgoc3RvcmUsIGtleSkgPT4ge1xuICAgICAgICAgICAgKHN0b3JlIGFzIGFueSkudW5zdWJzY3JpYmUoc3Vic2NyaWJlcnNXaXRob3V0S2V5W2tleV0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkU3RvcmUoa2V5OiBzdHJpbmcsIGRhdGE6IGFueSwgdmVyc2lvbjogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0b3JlID0gdGhpcy5jcmVhdGVTdG9yZShkYXRhLCB2ZXJzaW9uKVxuICAgICAgICB0aGlzLnN0b3JlTWFwLnNldChrZXksIHN0b3JlKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVycy5mb3JFYWNoKChbcGF0aCwgY2FsbGJhY2tdKSA9PiB7XG4gICAgICAgICAgICBsZXQgc3Vic2NyaWJlcnNXaXRob3V0S2V5ID0gdGhpcy5zdWJzY3JpYmVyc1dpdGhvdXRLZXkuZ2V0KGNhbGxiYWNrKTtcbiAgICAgICAgICAgIGlmICghc3Vic2NyaWJlcnNXaXRob3V0S2V5KSB7XG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlcnNXaXRob3V0S2V5ID0ge307XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVyc1dpdGhvdXRLZXkuc2V0KGNhbGxiYWNrLCBzdWJzY3JpYmVyc1dpdGhvdXRLZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3Vic2NyaWJlcnNXaXRob3V0S2V5W2tleV0gPSBjYWxsYmFjay5iaW5kKHRoaXMsIGtleSk7XG4gICAgICAgICAgICAoc3RvcmUgYXMgYW55KS5zdWJzY3JpYmUocGF0aCwgc3Vic2NyaWJlcnNXaXRob3V0S2V5W2tleV0pO1xuXG4gICAgICAgICAgICBpZiAocGF0aCA9PSBcIi9cIikgY2FsbGJhY2soa2V5LCBkYXRhLCBudWxsKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHB1YmxpYyByZW1vdmVTdG9yZShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb25zdCBzdG9yZSA9IHRoaXMuc3RvcmVNYXAuZ2V0KGtleSk7XG4gICAgICAgIGlmICghc3RvcmUpIHJldHVybjtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVycy5mb3JFYWNoKChbcGF0aCwgY2FsbGJhY2tdKSA9PiB7XG4gICAgICAgICAgICBsZXQgc3Vic2NyaWJlcnNXaXRob3V0S2V5ID0gdGhpcy5zdWJzY3JpYmVyc1dpdGhvdXRLZXkuZ2V0KGNhbGxiYWNrKTtcbiAgICAgICAgICAgIGlmICghc3Vic2NyaWJlcnNXaXRob3V0S2V5KSByZXR1cm47XG4gICAgICAgICAgICAoc3RvcmUgYXMgYW55KS51bnN1YnNjcmliZShzdWJzY3JpYmVyc1dpdGhvdXRLZXlba2V5XSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChwYXRoID09IFwiL1wiKSBjYWxsYmFjayhrZXksIG51bGwsIChzdG9yZSBhcyBhbnkpLmRhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zdG9yZU1hcC5kZWxldGUoa2V5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3luYyhwYXlsb2FkOiBzdHJpbmdbXSB8IHsgW2tleTogc3RyaW5nXTogeyBkYXRhOiBhbnksIHZlcnNpb246IG51bWJlciB9IH0pOiB2b2lkIHtcbiAgICAgICAgaWYgKHBheWxvYWQgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEtleXMgPSBBcnJheS5mcm9tKHRoaXMuc3RvcmVNYXAua2V5cygpKTtcbiAgICAgICAgICAgIGNvbnN0IGFkZEtleXMgPSBwYXlsb2FkLmZpbHRlcihrZXkgPT4gIWN1cnJlbnRLZXlzLmluY2x1ZGVzKGtleSkpO1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlS2V5cyA9IGN1cnJlbnRLZXlzLmZpbHRlcihrZXkgPT4gIXBheWxvYWQuaW5jbHVkZXMoa2V5KSk7XG4gICAgICAgICAgICBhZGRLZXlzLmZvckVhY2goa2V5ID0+IHRoaXMuYWRkU3RvcmUoa2V5LCB7fSwgMCkpO1xuICAgICAgICAgICAgcmVtb3ZlS2V5cy5mb3JFYWNoKGtleSA9PiB0aGlzLnJlbW92ZVN0b3JlKGtleSkpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCByZW1vdmVLZXlzID0gQXJyYXkuZnJvbSh0aGlzLnN0b3JlTWFwLmtleXMoKSkuZmlsdGVyKGtleSA9PiAhT2JqZWN0LmtleXMocGF5bG9hZCkuaW5jbHVkZXMoa2V5KSk7XG4gICAgICAgICAgICByZW1vdmVLZXlzLmZvckVhY2goa2V5ID0+IHRoaXMucmVtb3ZlU3RvcmUoa2V5KSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBwYXlsb2FkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhLCB2ZXJzaW9uIH0gPSBwYXlsb2FkW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RvcmVNYXAuaGFzKGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JlTWFwLmdldChrZXkpPy5zeW5jKGRhdGEsIHZlcnNpb24pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkU3RvcmUoa2V5LCBkYXRhLCB2ZXJzaW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgIH1cbn1cbiIsICJcbmNvbnN0IGFwcCA9ICh3aW5kb3cgYXMgYW55KS5jb21meUFQSS5hcHAuYXBwO1xuY29uc3QgJGVsID0gKHdpbmRvdyBhcyBhbnkpLmNvbWZ5QVBJLnVpLiRlbDtcbmNvbnN0IGFwaSA9ICh3aW5kb3cgYXMgYW55KS5jb21meUFQSS5hcGkuYXBpO1xuXG5leHBvcnQge1xuICAgIGFwcCwgJGVsLCBhcGlcbn0iLCAiaW1wb3J0IHsgUGFnZVN0b3JlIH0gZnJvbSBcIi4uLy4uL3NyYy9zdG9yZS9wYWdlLm10c1wiO1xuaW1wb3J0IHsgUGhvdG9zaG9wRGF0YURvY3VtZW50LCBQaG90b3Nob3BTdG9yZSB9IGZyb20gXCIuLi8uLi9zcmMvc3RvcmUvcGhvdG9zaG9wLm10c1wiO1xuaW1wb3J0IHsgU3RvcmVNYXAgfSBmcm9tIFwiLi4vLi4vc3JjL2NvbW1vbi9zdG9yZS9zdG9yZS1tYXAubXRzXCI7XG5pbXBvcnQgeyBhcGkgfSBmcm9tIFwiLi9zcmMvY29tZnktZ2xvYmFscy5tdHNcIjtcblxuY2xhc3MgUGFnZVBob3Rvc2hvcFN0b3JlTWFwIGV4dGVuZHMgU3RvcmVNYXA8UGhvdG9zaG9wU3RvcmU+IHtcbiAgICBjcmVhdGVTdG9yZShkYXRhOiBhbnksIHZlcnNpb246IG51bWJlcik6IFBob3Rvc2hvcFN0b3JlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQaG90b3Nob3BTdG9yZShkYXRhLCB2ZXJzaW9uKTtcbiAgICB9XG5cbiAgICBnZXRTdG9yZUJ5TmFtZShpbnN0YW5jZU5hbWU6IHN0cmluZyk6IFBob3Rvc2hvcFN0b3JlIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgZm9yIChjb25zdCBzdG9yZSBvZiB0aGlzLnN0b3JlTWFwLnZhbHVlcygpKSB7XG4gICAgICAgICAgICBpZiAoc3RvcmUuZGF0YS51bmFtZSA9PT0gaW5zdGFuY2VOYW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0QWxsUGhvdG9zaG9wRG9jdW1lbnREYXRhKCkge1xuICAgICAgICBjb25zdCByZXQ6IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IHtcbiAgICAgICAgICAgICAgICBzaWQ6IHN0cmluZyxcbiAgICAgICAgICAgICAgICBhY3RpdmVEb2N1bWVudElEOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgZG9jdW1lbnRzOiBQaG90b3Nob3BEYXRhRG9jdW1lbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSA9IHt9XG4gICAgICAgIHRoaXMuc3RvcmVNYXAuZm9yRWFjaCgoc3RvcmUpID0+IHtcbiAgICAgICAgICAgIHJldFtzdG9yZS5kYXRhLnVuYW1lXSA9IHtcbiAgICAgICAgICAgICAgICBzaWQ6IHN0b3JlLmRhdGEuc2lkLFxuICAgICAgICAgICAgICAgIGFjdGl2ZURvY3VtZW50SUQ6IHN0b3JlLmRhdGEuYWN0aXZlRG9jdW1lbnRJRCxcbiAgICAgICAgICAgICAgICBkb2N1bWVudHM6IHN0b3JlLmRhdGEuZG9jdW1lbnRzXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBwYWdlUGhvdG9zaG9wU3RvcmVNYXAgPSBuZXcgUGFnZVBob3Rvc2hvcFN0b3JlTWFwKCk7XG5leHBvcnQgY29uc3QgcGFnZVN0b3JlID0gbmV3IFBhZ2VTdG9yZSgpO1xuXG4vLyBpbiB3ZWJ2aWV3XG5pZiAoKHdpbmRvdyBhcyBhbnkpLnV4cEhvc3QpIHtcbiAgICBjb25zdCBjYWxsYmFjayA9IChlOiBNZXNzYWdlRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGUuZGF0YS5hY3Rpb24gIT09IFwid2Vidmlldy1jb25uZWN0XCIgfHwgIWUuZGF0YS5wYXlsb2FkLndlYnZpZXdGcm9tU2lkKSByZXR1cm4gY29uc29sZS5sb2coZSk7XG4gICAgICAgIGUuZGF0YS5wYXlsb2FkLndlYnZpZXdGcm9tU2lkID0gZS5kYXRhLnBheWxvYWQud2Vidmlld0Zyb21TaWQ7XG4gICAgICAgIHBhZ2VTdG9yZS5zZXRXZWJ2aWV3RnJvbVNpZChlLmRhdGEucGF5bG9hZC53ZWJ2aWV3RnJvbVNpZCk7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgY2FsbGJhY2spO1xuICAgIH1cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGNhbGxiYWNrKTtcbiAgICAod2luZG93IGFzIGFueSkudXhwSG9zdC5wb3N0TWVzc2FnZSh7XG4gICAgICAgIGZyb206ICdzZHBwcC13ZWJ2aWV3JyxcbiAgICAgICAgYWN0aW9uOiBcIndlYnZpZXctY29ubmVjdFwiLFxuICAgIH0sICcqJylcbn1cbmZ1bmN0aW9uIHJlZnJlc2hUaXRsZSgpIHtcbiAgICBpZiAoZG9jdW1lbnQudGl0bGUgIT09IHBhZ2VTdG9yZS5kYXRhLnRpdGxlKSB7XG4gICAgICAgIHBhZ2VTdG9yZS5zZXRUaXRsZShkb2N1bWVudC50aXRsZSk7XG4gICAgfVxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShyZWZyZXNoVGl0bGUpO1xufVxucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHJlZnJlc2hUaXRsZSlcblxubGV0IG1vZGVsSW5pdGVkID0gZmFsc2U7XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2FpdE1vZGVsSW5pdGVkKCkge1xuICAgIGlmIChtb2RlbEluaXRlZCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGFwaS51c2VyICYmIHBhZ2VTdG9yZS5zZXRDb21meVVzZXJUb2tlbihhcGkudXNlcik7XG4gICAgY29uc3QgdXNlU2xpZGVyRm9yTnVtYmVyV2lkZ2V0ID0gYXdhaXQgYXBpLmdldFNldHRpbmcoJ3NkcHBwLnVzZVNsaWRlckZvck51bWJlcldpZGdldCcpXG4gICAgaWYgKHVzZVNsaWRlckZvck51bWJlcldpZGdldCkge1xuICAgICAgICBwYWdlU3RvcmUuc2V0VXNlU2xpZGVyRm9yTnVtYmVyV2lkZ2V0KHVzZVNsaWRlckZvck51bWJlcldpZGdldClcbiAgICB9XG4gICAgbW9kZWxJbml0ZWQgPSB0cnVlO1xufSIsICJleHBvcnQgZGVmYXVsdCB7XG4gICAgJ1NEUFBQIEdldCBEb2N1bWVudCc6ICdTRFBQUCBHZXQgRG9jdW1lbnQnLFxuICAgICdTRFBQUCBHZXQgTGF5ZXIgQnkgSUQnOiAnU0RQUFAgR2V0IExheWVyJyxcbiAgICAnU0RQUFAgR2V0IExpbmtlZCBMYXllcnMnOiAnU0RQUFAgR2V0IExpbmtlZCBMYXllcnMnLFxuICAgICdTRFBQUCBHZXQgTGF5ZXJzIEluIEdyb3VwJzogJ1NEUFBQIEdldCBMYXllcnMgSW4gR3JvdXAnLFxuICAgICdTRFBQUCBHZXQgVGV4dCBGcm9tIExheWVyJzogJ1NEUFBQIEdldCBUZXh0IEZyb20gTGF5ZXInLFxuICAgICdTRFBQUCBQYXJzZSBMYXllciBJbmZvJzogJ1NEUFBQIFBhcnNlIExheWVyIEluZm8nLFxuICAgICdTRFBQUCBHZXQgU2VsZWN0aW9uJzogJ1NEUFBQIEdldCBTZWxlY3Rpb24nLCBcbiAgICAnU0RQUFAgR2V0IEltYWdlIEZyb20gUGhvdG9zaG9wJzogJ1NEUFBQIEdldCBJbWFnZSBGcm9tIFBob3Rvc2hvcCcsXG4gICAgJ1NEUFBQIFNlbmQgSW1hZ2VzIFRvIFBob3Rvc2hvcCc6ICdTRFBQUCBTZW5kIEltYWdlcyBUbyBQaG90b3Nob3AnLFxuICAgICdTRFBQUCBTZXR0aW5ncyc6ICdTRFBQUCBTZXR0aW5ncy9NaXNjJyxcbn0iLCAiZXhwb3J0IGRlZmF1bHQge1xuICAgIC8vIHNwZWljaWFsIGRvY3VtZW50LyBsYXllclxuICAgICcjIyMgQWN0aXZlIERvY3VtZW50ICMjIyc6ICcjIyMgXHU1RjUzXHU1MjREXHU2NTg3XHU2ODYzICMjIycsXG4gICAgJyMjIyBUaGUgQ2FudmFzICMjIyc6ICcjIyMgXHU2NTc0XHU0RTJBXHU3NTNCXHU1RTAzICMjIycsXG4gICAgJyMjIyBOZXcgTGF5ZXIgIyMjJzogJyMjIyBcdTY1QjBcdTU2RkVcdTVDNDIgIyMjJyxcbiAgICAnIyMjIFNlbGVjdGVkIExheWVyICMjIyc6ICcjIyMgXHU2MjQwXHU5MDA5XHU1NkZFXHU1QzQyICMjIycsXG4gICAgJyMjIyBLZWVwIFNpemUgb3IgRml0IENhbnZhcyAjIyMnOiAnIyMjIFx1NEZERFx1NjMwMVx1NUMzQVx1NUJGOFx1NjIxNlx1OTAwMlx1NUU5NFx1NzUzQlx1NUUwMyAjIyMnLFxuICAgICdfU0RQUFBfUFNEXyc6ICdfU0RQUFBfUFNEXycsXG5cbiAgICAvLyBBMTExMSBVSVxuICAgICdTYXZlIGFuZCBydW4gaW1tZWRpYXRlbHknOiAnXHU0RkREXHU1QjU4XHU1RTc2XHU3QUNCXHU1MzczXHU2MjY3XHU4ODRDJyxcbiAgICAnQ2xvc2UnOiAnXHU1MTczXHU5NUVEJyxcbiAgICAnU2VsZWN0IGEgezB9JzogYFx1OTAwOVx1NjJFOVx1NEUwMFx1NEUyQSB7MH1gLFxuXG4gICAgLy8gY29tZnl1aSBkaWFsb2dcbiAgICAnSG93IHRvIHVzZSAuY2N4IGZpbGUnOiAnXHU1OTgyXHU0RjU1XHU0RjdGXHU3NTI4IC5jY3ggXHU2NTg3XHU0RUY2JyxcbiAgICAnMS4gSWYgeW91IGhhdmUgaW5zdGFsbGVkIEFkb2JlIENyZWF0aXZlIENsb3VkJzogJzEuIFx1NTk4Mlx1Njc5Q1x1NEY2MFx1NURGMlx1N0VDRlx1NUI4OVx1ODhDNVx1NEU4NiBBZG9iZSBDcmVhdGl2ZSBDbG91ZCcsIFxuICAgICdKdXN0IGRvdWJsZSBjbGljayB0aGUgLmNjeCBmaWxlLCBpdCB3aWxsIGluc3RhbGwgdGhlIHBsdWdpbiBhdXRvbWF0aWNhbGx5JzogJ1x1NTNDQ1x1NTFGQiAuY2N4IFx1NjU4N1x1NEVGNlx1RkYwQ1x1NUI4M1x1NEYxQVx1ODFFQVx1NTJBOFx1NUI4OVx1ODhDNScsXG4gICAgXCIyLiBJZiB5b3UgZG9uJ3QgaGF2ZSBBZG9iZSBDcmVhdGl2ZSBDbG91ZFwiOiAnMi4gXHU1OTgyXHU2NzlDXHU0RjYwXHU2Q0ExXHU2NzA5IEFkb2JlIENyZWF0aXZlIENsb3VkJyxcbiAgICAnUmVuYW1lIC5jY3ggdG8gLnppcCBhbmQgZXh0cmFjdCBpdCBpbnRvICc6ICdcdTVDMDYgLmNjeCBcdTkxQ0RcdTU0N0RcdTU0MERcdTRFM0EgLnppcCBcdTVFNzZcdTg5RTNcdTUzOEJcdTUyMzAnLFxuICAgICdvcic6ICdcdTYyMTYnLFxuICAgICdQaG90b3Nob3AgZGlyZWN0b3J5JzogJ1Bob3Rvc2hvcCBcdTVCODlcdTg4QzVcdTc2RUVcdTVGNTUnLFxuXG4gICAgLy8gY29tZnl1aSBlcnJvclxuICAgICdDYW5ub3QgY29ubmVjdCBtdWx0aXBsZSBkaWZmZXJlbnQgZG9jdW1lbnQgd2lkZ2V0cyB3aXRoIHNhbWUgdmFsdWUnOiAnXHU0RTBEXHU4MEZEXHU4RkRFXHU2M0E1XHU1OTFBXHU0RTJBXHU1MTc3XHU2NzA5XHU3NkY4XHU1NDBDXHU1MDNDXHU3Njg0XHU2NTg3XHU2ODYzXHU1QzBGXHU5MEU4XHU0RUY2JyxcbiAgICAnWW91IGNhbiBvbmx5IGhhdmUgb25lIFNEUFBQIFNldHRpbmdzIG5vZGUgaW4gYSB3b3JrZmxvdyc6ICdcdTRFMDBcdTRFMkFcdTVERTVcdTRGNUNcdTZENDFcdTRFMkRcdTUzRUFcdTgwRkRcdTY3MDlcdTRFMDBcdTRFMkEgU0RQUFAgU2V0dGluZ3MgXHU4MjgyXHU3MEI5JyxcbiAgICAnY29udmVydCB3aWRnZXQgezB9IGZhaWxlZDonOiAnXHU2M0E3XHU0RUY2ezB9XHU4RjZDXHU2MzYyXHU1OTMxXHU4RDI1XHVGRjFBJyxcbiAgICAnaGlkZGVuIHdlYnZpZXcgbG9hZCBmYWlsZWQ6IHswfSwgcGxlYXNlIHNlbGVjdCBhIGJyb3dzZXIgcGFnZSB0byBjb250aW51ZSc6ICdcdTUxODVcdTdGNkUgd2VidmlldyBcdTUyQTBcdThGN0RcdTU5MzFcdThEMjU6IHswfVx1RkYwQ1x1OEJGN1x1OTAwOVx1NjJFOVx1NEUwMFx1NEUyQVx1NkQ0Rlx1ODlDOFx1NTY2OFx1OTg3NVx1OTc2Mlx1N0VFN1x1N0VFRCcsXG4gICAgXG4gICAgLy8gY29tZnkgbm9kZSB0aXRsZVxuICAgICdTRFBQUCBHZXQgRG9jdW1lbnQnOiAnU0RQUFBcdTgzQjdcdTUzRDZcdTY1ODdcdTY4NjMoR2V0RG9jdW1lbnQpJyxcbiAgICAnU0RQUFAgR2V0IExheWVyIEJ5IElEJzogJ1NEUFBQXHU4M0I3XHU1M0Q2XHU1NkZFXHU1QzQyKEdldExheWVyKScsXG4gICAgJ1NEUFBQIEdldCBMaW5rZWQgTGF5ZXJzJzogJ1NEUFBQXHU4M0I3XHU1M0Q2XHU5NEZFXHU2M0E1XHU1NkZFXHU1QzQyKEdldExpbmtlZExheWVycyknLFxuICAgICdTRFBQUCBHZXQgTGF5ZXJzIEluIEdyb3VwJzogJ1NEUFBQXHU4M0I3XHU1M0Q2XHU3RUM0XHU0RTJEXHU1NkZFXHU1QzQyKEdldExheWVyc0luR3JvdXApJyxcbiAgICAnU0RQUFAgR2V0IFRleHQgRnJvbSBMYXllcic6ICdTRFBQUFx1ODNCN1x1NTNENlx1NTZGRVx1NUM0Mlx1NjU4N1x1NjcyQyhHZXRUZXh0RnJvbUxheWVyKScsXG4gICAgJ1NEUFBQIFBhcnNlIExheWVyIEluZm8nOiAnU0RQUFBcdTg5RTNcdTY3OTBcdTU2RkVcdTVDNDJcdTRGRTFcdTYwNkYoUGFyc2VMYXllckluZm8pJyxcbiAgICAnU0RQUFAgR2V0IFNlbGVjdGlvbic6ICdTRFBQUFx1ODNCN1x1NTNENlx1OTAwOVx1NTMzQShHZXRTZWxlY3Rpb24pJywgXG4gICAgJ1NEUFBQIEdldCBJbWFnZSBGcm9tIFBob3Rvc2hvcCc6ICdTRFBQUFx1NEVDRVBTXHU4M0I3XHU1M0Q2XHU1NkZFXHU1MENGKEdldEltYWdlRnJvbVBob3Rvc2hvcCknLFxuICAgICdTRFBQUCBTZW5kIEltYWdlcyBUbyBQaG90b3Nob3AnOiAnU0RQUFBcdTUzRDFcdTkwMDFcdTU2RkVcdTUwQ0ZcdTUyMzBQUyhTZW5kSW1hZ2VzVG9QaG90b3Nob3ApJyxcbiAgICAnU0RQUFAgU2VuZCBUZXh0IFRvIExheWVyJzogJ1NEUFBQXHU1M0QxXHU5MDAxXHU2NTg3XHU2NzJDXHU1MjMwXHU1NkZFXHU1QzQyKFNlbmRUZXh0VG9MYXllciknLFxuICAgICdTRFBQUCBSdW4gUGhvdG9zaG9wIEFjdGlvbic6ICdTRFBQUFx1OEZEMFx1ODg0Q1BTIEFjdGlvbihSdW5QaG90b3Nob3BBY3Rpb24pJyxcblxuLy8gY29tZnkgd2lkZ2V0L2lucHV0XG4gICAgJ2Rvd25sb2FkIFBTIHBsdWdpbiAoLmNjeCknOiAnXHU0RTBCXHU4RjdEIFBob3Rvc2hvcCBcdTYzRDJcdTRFRjYgKC5jY3gpJyxcbiAgICAnY3VycmVudCBDb21meVVJIHBhZ2VpZDogezB9JzogJ1x1NUY1M1x1NTI0RCBDb21meVVJIFx1OTg3NVx1OTc2MklEOiB7MH0nLFxuICAgICdjdXJyZW50IEExMTExIHBhZ2VpZDogezB9JzogJ1x1NUY1M1x1NTI0RCBBMTExMSBcdTk4NzVcdTk3NjJJRDogezB9JyxcbiAgICAnZG9jdW1lbnQgbGlua2VkJzogJ1x1NjU4N1x1Njg2M1x1NTNDMlx1NjU3MFx1NURGMlx1OTRGRVx1NjNBNScsXG4gICAgJ2xheWVyIGxpbmtlZCc6ICdcdTU2RkVcdTVDNDJcdTUzQzJcdTY1NzBcdTVERjJcdTk0RkVcdTYzQTUnLFxuICAgICdib3VuZCBsaW5rZWQnOiAnXHU4MzAzXHU1NkY0XHU1M0MyXHU2NTcwXHU1REYyXHU5NEZFXHU2M0E1JyxcbiAgICAnZG9jdW1lbnQnOiAnXHU2NTg3XHU2ODYzJywgXG4gICAgJ0RvY3VtZW50JzogJ1x1NjU4N1x1Njg2MycsIFxuICAgICdET0NVTUVOVCc6ICdcdTY1ODdcdTY4NjMnLCBcbiAgICAnZG9jdW1lbnRfbmFtZSc6ICdcdTY1ODdcdTY4NjNcdTU0MERcdTVCNTdpZCcsXG4gICAgJ2xheWVyX25hbWVpZCc6ICdcdTU2RkVcdTVDNDJcdTU0MERcdTVCNTdpZCcsXG4gICAgJ2xheWVyX25hbWUnOiAnXHU1NkZFXHU1QzQyXHU1NDBEXHU1QjU3JyxcbiAgICAnbGF5ZXJfaW5mbyc6ICdcdTU2RkVcdTVDNDJcdTRGRTFcdTYwNkYnLFxuICAgICdib3VuZF90b3AnOiAnXHU4MzAzXHU1NkY0XHU0RTBBXHU4RkI5XHU4REREJyxcbiAgICAnYm91bmRfbGVmdCc6ICdcdTgzMDNcdTU2RjRcdTVERTZcdThGQjlcdThEREQnLFxuICAgICdib3VuZF93aWR0aCc6ICdcdTgzMDNcdTU2RjRcdTVCQkRcdTVFQTYnLFxuICAgICdib3VuZF9oZWlnaHQnOiAnXHU4MzAzXHU1NkY0XHU5QUQ4XHU1RUE2JyxcbiAgICAnY2VudGVyX3gnOiAnXHU0RTJEXHU1RkMzXHU3MEI5eCcsXG4gICAgJ2NlbnRlcl95JzogJ1x1NEUyRFx1NUZDM1x1NzBCOXknLFxuICAgICdvcGFjaXR5JzogJ1x1OTAwRlx1NjYwRVx1NUVBNicsXG4gICAgJ2xheWVyJzogJ1x1NTZGRVx1NUM0MicsXG4gICAgJ2xheWVyX29yX2dyb3VwJzogJ1x1NTZGRVx1NUM0MihcdTYyMTZcdTdFQzQpJyxcbiAgICAnTGF5ZXJfb3JfZ3JvdXAnOiAnXHU1NkZFXHU1QzQyKFx1NjIxNlx1N0VDNCknLFxuICAgICdib3VuZCc6ICdcdTgzMDNcdTU2RjQnLFxuICAgICdib3VuZHMnOiAnXHU4MzAzXHU1NkY0JyxcbiAgICAnYm91bmRzIFtvcHRpb25hbF0nOiAnXHU4MzAzXHU1NkY0W1x1NTNFRlx1OTAwOV0nLFxuICAgICdib3VuZGFyeSc6ICdcdTgzMDNcdTU2RjQnLFxuICAgICdCb3VuZGFyeSc6ICdcdTgzMDNcdTU2RjQnLFxuICAgICdjYW52YXNfYm91bmRhcnknOiAnXHU3NTNCXHU1RTAzXHU4MzAzXHU1NkY0JyxcbiAgICAnY2FudmFzX2JvdW5kJzogJ1x1NzUzQlx1NUUwM1x1ODMwM1x1NTZGNCcsXG4gICAgJ2xheWVyX2JvdW5kYXJ5JzogJ1x1NTZGRVx1NUM0Mlx1ODMwM1x1NTZGNCcsXG4gICAgJ2xheWVyX2JvdW5kJzogJ1x1NTZGRVx1NUM0Mlx1ODMwM1x1NTZGNCcsXG4gICAgXCJQaG90b3Nob3AgRGlzY29ubmVjdGVkIVwiIDogXCJQaG90b3Nob3AgXHU2NzJBXHU4RkRFXHU2M0E1XHVGRjAxXCIsXG4gICAgJ3JnYl9vdXQnOiAnUkdCXHU4RjkzXHU1MUZBJyxcbiAgICAnYWxwaGFfb3V0JzogJ0FscGhhXHU4RjkzXHU1MUZBJyxcbiAgICAnaW1hZ2VzJzogJ1x1NTZGRVx1NTBDRicsXG4gICAgJ3RleHQnOiAnXHU2NTg3XHU2NzJDJyxcbiAgICAnSURfbW9kZSc6ICdcdTdDQkVcdTc4NkVJRFx1NkEyMVx1NUYwRicsXG4gICAgJ25hbWVfbW9kZSc6ICdcdTU0MERcdTVCNTdcdTUzMzlcdTkxNERcdTZBMjFcdTVGMEYnLFxuICAgICdzZWxlY3QnOiAnXHU5MDA5XHU2MkU5JyxcbiAgICAnZG9jdW1lbnQgYm91bmRhcnknOiAnXHU2NTg3XHU2ODYzXHU4MzAzXHU1NkY0JyxcbiAgICAnbGF5ZXIgYm91bmRhcnknOiAnXHU1NkZFXHU1QzQyXHU4MzAzXHU1NkY0JyxcbiAgICAnc2VsZWN0aW9uIGJvdW5kYXJ5JzogJ1x1OTAwOVx1NEUyRFx1ODMwM1x1NTZGNCcsXG4gICAgJ3NhdmUgLnBzZCB0byB0aGlzIHdvcmtmbG93JzogJ1x1NEZERFx1NUI1OC5wc2RcdTUyMzBcdThGRDlcdTRFMkFcdTVERTVcdTRGNUNcdTZENDEnLFxuICAgICdleHRyYWN0IHNhdmVkIC5wc2QgdG8gUGhvdG9zaG9wJzogJ1x1NjNEMFx1NTNENlx1NEZERFx1NUI1OFx1NzY4NC5wc2RcdTUyMzBQaG90b3Nob3AnLFxuICAgICdzYW1wbGUgLnBzZCc6ICdcdTc5M0FcdTRGOEIucHNkJyxcbiAgICAnbWFzayc6ICdcdTkwNkVcdTdGNjknLFxuICAgICduYW1lJzogJ1x1NTQwRFx1NzlGMCcsXG4gICAgJ3F1YWxpdHknOiAnXHU1NkZFXHU1MENGXHU4RDI4XHU5MUNGJyxcbiAgICBcbiAgICAvLyBwaG90b3Nob3AgVUlcbiAgICAndGltZW91dCc6ICdcdThEODVcdTY1RjYnLFxuICAgICctLW11bHRpLXVzZXIgYWN0aXZhdGVkLCBOb3QgTG9naW4hJzogJy0tbXVsdGktdXNlclx1NURGMlx1NkZDMFx1NkQzQlx1RkYwQ1x1NEY0Nlx1NjcyQVx1NzY3Qlx1NUY1NVx1RkYwMScsXG4gICAgJ0xvZ291dCc6ICdcdTc2N0JcdTUxRkEnLFxuICAgICdVc2VyOiAnOiAnXHU3NTI4XHU2MjM3OiAnLFxuICAgICdjb25uZWN0JzogJ1x1OEZERVx1NjNBNScsXG4gICAgJ2Nvbm5lY3RlZCc6ICdcdTVERjJcdThGREVcdTYzQTUnLFxuICAgICdkaXNjb25uZWN0JzogJ1x1NjVBRFx1NUYwMCcsXG4gICAgJ2Rpc2Nvbm5lY3RlZCc6ICdcdTVERjJcdTY1QURcdTVGMDBcdThGREVcdTYzQTUnLFxuICAgICdyZWNvbm5lY3RpbmcuLi4nOiAnXHU5MUNEXHU4RkRFXHU0RTJELi4uJywgIFxuICAgICdjb25uZWN0aW5nJzogJ1x1OEZERVx1NjNBNVx1NEUyRCcsICBcbiAgICAnd2VicGFnZXMnOiAnXHU3RjUxXHU5ODc1XHU1MjE3XHU4ODY4JyxcbiAgICAnd29ya2Zsb3dzJzogJ1x1NURFNVx1NEY1Q1x1NkQ0MScsXG4gICAgJ3dvcmtmbG93JzogJ1x1NURFNVx1NEY1Q1x1NkQ0MScsXG4gICAgJ2F1dG8gcnVuIHBhZ2UgW3swfV0gYWZ0ZXIgY2hhbmdlLi4nOiAnXHU2NkY0XHU2NTM5XHU1NDBFXHU4MUVBXHU1MkE4XHU4RkQwXHU4ODRDXHU5ODc1XHU5NzYyIHswfS4uJyxcbiAgICAnYXV0byBydW4gd29ya2Zsb3cgW3swfV0gYWZ0ZXIgY2hhbmdlLi4nOiAnXHU2NkY0XHU2NTM5XHU1NDBFXHU4MUVBXHU1MkE4XHU4RkQwXHU4ODRDXHU1REU1XHU0RjVDXHU2RDQxIHswfS4uJyxcbiAgICAnYXV0byBydW4gd29ya2Zsb3cgYWZ0ZXIgY2hhbmdlLi4nOiAnXHU2NkY0XHU2NTM5XHU1NDBFXHU4MUVBXHU1MkE4XHU4RkQwXHU4ODRDXHU1REU1XHU0RjVDXHU2RDQxLi4nLFxuICAgICdzZWxlY3Rpb25fb25seSc6ICdcdTRFQzVcdTkwMDlcdTUzM0EnLFxuICAgICdRdWV1ZTonOiAnXHU5NjFGXHU1MjE3OicsXG4gICAgJ1NldCBBczonOiAnXHU4QkJFXHU3RjZFXHU0RTNBOicsXG4gICAgJ0Vycm9yIHswfS4uLiBwbGVhc2UgY29udGFjdCBtZSB2aWEgRGlzY29yZC9HaXRodWInOiAnXHU1MUZBXHU3M0IwXHU5NTE5XHU4QkVGIHswfS4uLlx1RkYwQ1x1OEJGN1x1OTAxQVx1OEZDNyBRUS9HaXRodWIgXHU4MDU0XHU3Q0ZCXHU2MjExJyxcbiAgICAnV2VidmlldyBpbml0aWFsaXplIGZhaWxlZC4gUGxlYXNlIHJlcG9ydCB0byBtZSB2aWEgRGlzY29yZC9HaXRodWIgd2l0aCB5b3VyIENvbWZ5VVJMLCBPcGVyYXRlIFN5c3RlbSc6ICdXZWJ2aWV3IFx1NTIxRFx1NTlDQlx1NTMxNlx1NTkzMVx1OEQyNVx1RkYwQ1x1OEJGN1x1OTAxQVx1OEZDNyBRUS9HaXRodWIgXHU4MDU0XHU3Q0ZCXHU2MjExXHU1RTc2XHU5NjQ0XHU0RTBBXHU0RjYwXHU3Njg0Q29tZnlcdTU3MzBcdTU3NDBcdTMwMDFcdTY0Q0RcdTRGNUNcdTdDRkJcdTdFREYnLFxuICAgICdXb3JrZmxvdyBMaXN0IG9mIENvbWZ5VUkgd2l0aCAtLW11bHRpLXVzZXIgaXMgb25seSBhdmFpbGFibGUgZm9yIHNwb25zb3JzJzogJ1x1NUUyNlwiLS1tdWx0aS11c2VyXCJcdTc2ODRDb21meVVJXHU0RUM1XHU1QkY5XHU4RDVFXHU1MkE5XHU4MDA1XHU1RjAwXHU2NTNFJyxcbiAgICAnV29ya2Zsb3cgQWdlbnQgaXMgbG9hZGluZy4uLic6ICdcdThGRDBcdTg4NENcdThGN0RcdTRGNTNcdTVDMUFcdTU3MjhcdTUyQTBcdThGN0QuLi4nLFxuICAgICcoUGFnZSBJRDogezB9KVF1ZXVlOiB7MX0nOiAnKFx1OTg3NVx1OTc2MklEOiB7MH0pIFx1OTYxRlx1NTIxN1x1OTU3Rlx1NUVBNiB7MX0nLFxuICAgICdubyBzdWl0YWJsZSBub2RlIHRvIGNvbnRyb2wgaW4gdGhpcyB3b3JrZmxvdyc6ICdcdThGRDlcdTRFMkFcdTVERTVcdTRGNUNcdTZENDFcdTRFMkRcdTZDQTFcdTY3MDlcdTgwRkRcdTYzQTdcdTUyMzZcdTc2ODRcdTgyODJcdTcwQjknLFxuICAgIFwiU2F2ZVwiOiBcIlx1NEZERFx1NUI1OFwiLFxuICAgIFwiRWRpdFwiOiBcIlx1N0YxNlx1OEY5MVwiLFxuICAgIFwiRWRpdCBpbiBDb21meVVJXCI6IFwiXHU1NzI4IENvbWZ5VUkgXHU0RTJEXHU3RjE2XHU4RjkxXCIsXG4gICAgXCJ1c2luZyBicm93c2VyIHBhZ2UgW3swfV0gZm9yIHdvcmtmbG93IHJ1bm5pbmdcIjogJ1x1NkI2M1x1NjNBNVx1N0JBMVx1N0Y1MVx1OTg3NSBbezB9XSBcdThGRDBcdTg4NENcdTVERTVcdTRGNUNcdTZENDEnLFxuICAgICd3b3JrZmxvdyBydW5uaW5nIGJ5IGhpZGRlbiB3ZWJ2aWV3JzogJ1x1NURFNVx1NEY1Q1x1NkQ0MVx1NTcyOFx1OTY5MFx1ODVDRlx1NzY4NHdlYnZpZXdcdTRFMkRcdThGRDBcdTg4NEMnLFxuICAgICdMb2NrIEltYWdlJzogJ1x1OTUwMVx1NUI5QVx1NTZGRVx1NTBDRicsXG4gICAgJ1VubG9jayBJbWFnZSc6ICdcdTg5RTNcdTk1MDFcdTU2RkVcdTUwQ0YnLFxuICAgICdzZWFyY2guLi4nOiAnXHU2NDFDXHU3RDIyLi4uJyxcbiAgICAnZGlzYWJsZWQgd2hlbiBydW5uaW5nIGluIGJyb3dzZXIgcGFnZSc6ICdcdTYzQTVcdTdCQTFcdTdGNTFcdTk4NzVcdTY1RjZcdTRFMERcdTUzRUZcdTc1MjgnLFxuICAgICdvbmx5IHN1cHBvcnRlZCBpbiBQaG90b3Nob3AnOiAnXHU0RUM1XHU1NzI4IFBob3Rvc2hvcCBcdTRFMkRcdTY1MkZcdTYzMDEnLFxuICAgICdMb2dpbic6ICdcdTc2N0JcdTVGNTUnLFxuICAgICdJbnZpdGF0aW9uIENvZGUnOiAnXHU5MDgwXHU4QkY3XHU3ODAxJyxcbiAgICAnVXNlcm5hbWUnOiAnXHU3NTI4XHU2MjM3XHU1NDBEJyxcbiAgICAnUGFzc3dvcmQnOiAnXHU1QkM2XHU3ODAxJyxcbiAgICAnUGxlYXNlIGlucHV0IGludml0YXRpb24gY29kZSc6ICdcdThCRjdcdThGOTNcdTUxNjVcdTkwODBcdThCRjdcdTc4MDEnLFxuICAgICdQbGVhc2UgaW5wdXQgdXNlcm5hbWUnOiAnXHU4QkY3XHU4RjkzXHU1MTY1XHU3NTI4XHU2MjM3XHU1NDBEJyxcbiAgICAnUGxlYXNlIGlucHV0IHBhc3N3b3JkJzogJ1x1OEJGN1x1OEY5M1x1NTE2NVx1NUJDNlx1NzgwMScsXG5cbiAgICAvLyBwaG90b3Nob3AgY29ubmVjdCBlcnJvclxuICAgICc1MDI6IE1heWJlIHRoZSBzZXJ2ZXIgaXMgbm90IHJ1bm5pbmcnOiAnNTAyOiBcdTY3MERcdTUyQTFcdTU2NjhcdTUzRUZcdTgwRkRcdTY3MkFcdThGRDBcdTg4NEMnLFxuICAgICc0MDQ6IE1heWJlIFNEUFBQIGlzIG5vdCBpbnN0YWxsZWQgb3IgZmFpbGVkIHRvIHJ1biBpbiBDb21meVVJJzogJzQwNDogXHU1M0VGXHU4MEZEXHU1NzI4Q29tZnlVSVx1NEUyRFNEUFBQXHU2NzJBXHU1Qjg5XHU4OEM1XHU2MjE2XHU4RkQwXHU4ODRDXHU1OTMxXHU4RDI1JyxcbiAgICAnezB9LiByZWNvbm5lY3RpbmcuLi4nOiAnezB9LiBcdTkxQ0RcdThGREVcdTRFMkQuLi4nLFxuICAgICdkaXNjb25uZWN0ZWQgdG8gezB9IGZhaWxlZCB7MX0nOiBgXHU2NUFEXHU1RjAwXHU4RkRFXHU2M0E1IHswfSBcdTk1MTlcdThCRUYgezF9YCxcbiAgICAndmVyc2lvbiBtaXNtYXRjaCwgcGxlYXNlIHJlaW5zdGFsbCBQUyBwbHVnaW4nOiAnXHU3MjQ4XHU2NzJDXHU0RTBEXHU1MzM5XHU5MTREXHVGRjBDXHU4QkY3XHU5MUNEXHU2NUIwXHU1Qjg5XHU4OEM1IFBTIFx1NjNEMlx1NEVGNicsXG4gICAgJ2luc3RhbmNlIHR5cGUgbm90IHJlY29nbml6ZWQnOiAnXHU2NzJBXHU4QkM2XHU1MjJCXHU3Njg0XHU4RjZGXHU0RUY2XHU3QzdCXHU1NzhCJyxcbiAgICAnRXJyb3I6IHswfSc6ICdcdTk1MTlcdThCRUY6IHswfScsXG4gICAgJ1ZlcmlmaWNhdGlvbiBFcnJvcic6ICdcdTlBOENcdThCQzFcdTk1MTlcdThCRUYnLFxuXG4gICAgLy8gcGhvdG9zaG9wIGV2ZW50IGVycm9yXG4gICAgJ2RvY3VtZW50IHswfSBub3QgZm91bmQnOiAnXHU2MjdFXHU0RTBEXHU1MjMwXHU2NTg3XHU2ODYzOiB7MH0nLFxuICAgICdvbmx5IGxheWVyIGtpbmQgXCJURVhUXCIgaXMgc3VwcG9ydGVkLCBpbnZhbGlkIGxheWVyOiB7MH0nOiAnXHU0RTBEXHU2NTJGXHU2MzAxXHU5NzVFXHU2NTg3XHU2NzJDXHU1NkZFXHU1QzQyOiB7MH0nLFxuICAgICdjcmVhdGUgbGF5ZXIgZmFpbGVkJzogJ1x1NTIxQlx1NUVGQVx1NTZGRVx1NUM0Mlx1NTkzMVx1OEQyNScsXG4gICAgJ2xheWVyIG5vdCBmb3VuZCB7MH0nOiAnXHU2MjdFXHU0RTBEXHU1MjMwXHU1NkZFXHU1QzQyOiB7MH0nLFxuICAgICdubyBsaW5rZWQgbGF5ZXIgZm9yIHswfSc6ICdcdTZDQTFcdTY3MDlcdTk0RkVcdTYzQTVcdTU2RkVcdTVDNDI6IHswfScsXG4gICAgJ2xheWVyIHswfSBpcyBub3QgYSBncm91cCc6ICdcdTU2RkVcdTVDNDIgezB9IFx1NEUwRFx1NjYyRlx1NEUwMFx1NEUyQVx1N0VDNCcsXG4gICAgJ25vIGxheWVyIGluIGdyb3VwIHswfSc6ICdcdTdFQzQgezB9IFx1NEUyRFx1NkNBMVx1NjcwOVx1NTZGRVx1NUM0MicsXG4gICAgJ2xheWVyIG5vdCBmb3VuZDogezB9JzogJ1x1NjI3RVx1NEUwRFx1NTIzMFx1NTZGRVx1NUM0MjogezB9JyxcbiAgICAnTm8gdXBsb2FkX25hbWUnOiAnXHU0RTBBXHU0RjIwXHU2M0E1XHU1M0UzXHU4RkQ0XHU1NkRFXHU0RTg2XHU1OTMxXHU4RDI1JyxcbiAgICAnZ2V0IHBpeGVsIG9mIHswfSBmYWlsZWQnOiAnXHU4M0I3XHU1M0Q2XHU1MENGXHU3RDIwXHU1OTMxXHU4RDI1OiB7MH0nLFxuICAgICdtZXJnZSBncm91cCBmYWlsZWQnOiAnXHU1NDA4XHU1RTc2XHU3RUM0XHU1OTMxXHU4RDI1JyxcbiAgICAnaW52YWxpZCBuYW1lOiB7MH0nOiAnXHU5NzVFXHU2Q0Q1XHU3Njg0XHU1NDBEXHU3OUYwOiB7MH0nLFxuICAgICdnZXRfbGF5ZXJfaW5mbzogbGF5ZXJfaWRlbnRpZnkgcmVxdWlyZWQnOiAnZ2V0X2xheWVyX2luZm86IFx1OTcwMFx1ODk4MSBsYXllcl9pZGVudGlmeScsXG4gICAgJ2ludmFsaWQgYWN0aW9uOiB7MH0nOiAnXHU2NUUwXHU2NTQ4XHU3Njg0XHU2NENEXHU0RjVDOiB7MH0nLFxuICAgICdjcmVhdGUgZG9jdW1lbnQgZmFpbGVkJzogJ1x1NTIxQlx1NUVGQVx1NjU4N1x1Njg2M1x1NTkzMVx1OEQyNScsXG4gICAgJ2NyZWF0ZSBkb2N1bWVudCBmb3IgcHJldmlldyc6ICdcdTUyMUJcdTVFRkFcdTk4ODRcdTg5QzhcdTY1ODdcdTY4NjMnLFxuICAgICdyZXNpemUgZG9jdW1lbnQgZm9yIHByZXZpZXcnOiAnXHU4QzAzXHU2NTc0XHU5ODg0XHU4OUM4XHU2NTg3XHU2ODYzXHU1QzNBXHU1QkY4JyxcbiAgICAnbm8gZmlyc3QgcmVsYXRlZCBsYXllciBpbiB7MH0nOiAnXHU3RUM0IHswfSBcdTRFMkRcdTZDQTFcdTY3MDlcdTdCMkNcdTRFMDBcdTRFMkFcdTc2RjhcdTUxNzNcdTU2RkVcdTVDNDInLFxuICAgIFwiaW1hZ2VEYXRhRXJyb3I6IGRhdGEgbGVuZ3RoIGlzIG5vdCBtdWx0aXBsZSBvZiB3aWR0aCAqIGhlaWdodFwiOiBcIlx1NTZGRVx1NTBDRlx1NjU3MFx1NjM2RVx1NjcwOVx1OEJFRjogXHU2NTcwXHU2MzZFXHU5NTdGXHU1RUE2XHU0RTBEXHU2NjJGXHU1QkJEXHU1RUE2ICogXHU5QUQ4XHU1RUE2XHU3Njg0XHU1MDBEXHU2NTcwXCIsXG4gICAgXCJpbWFnZURhdGFFcnJvcjogb3JpZ2luQ29tcG9uZW50cyBtdXN0IGJlIDEgb3IgM1wiOiBcIlx1NTZGRVx1NTBDRlx1NjU3MFx1NjM2RVx1NjcwOVx1OEJFRjogb3JpZ2luQ29tcG9uZW50cyBcdTVGQzVcdTk4N0JcdTY2MkYgMSBcdTYyMTYgM1wiLFxuICAgICd1bmV4cGVjdGVkIGNvbm5lY3Rpb24gbG9zdCwgcGxlYXNlIHRyeSB0byByZWNvbm5lY3QnOiAnXHU2MTBGXHU1OTE2XHU2NUFEXHU1RjAwXHU4RkRFXHU2M0E1XHVGRjBDXHU4QkY3XHU1QzFEXHU4QkQ1XHU5MUNEXHU2NUIwXHU4RkRFXHU2M0E1JyxcbiAgICBcIldvcmtmbG93IGxpc3QgaXMgZW1wdHksIHBsZWFzZSBzYXZlIGEgd29ya2Zsb3cgYnkgQ29tZnkncyBsYXN0ZXN0IFVJXCI6ICdcdTVERTVcdTRGNUNcdTZENDFcdTUyMTdcdTg4NjhcdTRFM0FcdTdBN0FcdUZGMENcdThCRjdcdTU3MjhDb21meVx1NzY4NFx1NjVCMFx1NzI0OFVJXHU0RTJEXHU0RkREXHU1QjU4XHU0RTAwXHU0RTJBXHU1REU1XHU0RjVDXHU2RDQxJyxcbiAgICAnTm8gb3BlbmVkIENvbWZ5VUkgcGFnZXMnOiAnXHU2Q0ExXHU2NzA5XHU1REYyXHU2MjUzXHU1RjAwXHU3Njg0Q29tZnlVSVx1OTg3NVx1OTc2MicsXG4gICAgJ2NvbWZ5QVBJIGlzIG5vdCBpbml0aWFsaXplZCwgbWF5YmUgY29tZnlVSSBpcyB0b28gb2xkJzogJ1x1NjVFMFx1NkNENVx1ODNCN1x1NTNENiBDb21meUFQSVx1RkYwQ1x1NTNFRlx1ODBGRCBDb21meVVJIFx1NzI0OFx1NjcyQ1x1NTkyQVx1NjVFNycsXG4gICAgJ3Vuc3VwcG9ydGVkIGNoYW5uZWwgY291bnRzOiB7MH0nOiAnXHU0RTBEXHU2NTJGXHU2MzAxXHU3Njg0XHU5MDFBXHU5MDUzXHU2NTcwOiB7MH0nLFxuICAgICdUaW1lb3V0LCBNYXliZSB0aGUgVVJMIGlzIHdyb25nJzogJ1x1OEQ4NVx1NjVGNlx1RkYwQ1x1NTNFRlx1ODBGRCBjb21meVx1NTczMFx1NTc0MCBcdTU4NkJcdTUxOTlcdTk1MTlcdThCRUYnLFxuICAgICdXb3JrZmxvdyBsaXN0IGxvYWRpbmcgZmFpbGVkOiB7MH0nOiAnXHU1REU1XHU0RjVDXHU2RDQxXHU1MjE3XHU4ODY4XHU1MkEwXHU4RjdEXHU1OTMxXHU4RDI1OiB7MH0nLFxuICAgICdQbGVhc2UgcmVnaXN0ZXIgYSB1c2VyIGluIENvbWZ5VUknOiAnXHU4QkY3XHU1NzI4IENvbWZ5VUkgXHU0RTJEXHU2Q0U4XHU1MThDXHU0RTAwXHU0RTJBXHU3NTI4XHU2MjM3JyxcbiAgICAnR2V0U2VsZWN0aW9uIG5lZWQgUGhvdG9zaG9wIHZlcnNpb24gMjUrJzogJ0dldFNlbGVjdGlvbiBcdTk3MDBcdTg5ODEgUGhvdG9zaG9wIDI1KyBcdTcyNDhcdTY3MkMnLFxuICAgICdBY3Rpb24gezB9IG5vdCBmb3VuZCc6ICdBY3Rpb24gezB9IFx1NjcyQVx1NjI3RVx1NTIzMCcsXG4gICAgJ0FjdGlvbiBzZXQgezB9IG5vdCBmb3VuZCc6ICdBY3Rpb25TZXQgezB9IFx1NjcyQVx1NjI3RVx1NTIzMCcsXG5cbiAgICAvLyBwaG90b3Nob3AgbW9kYWwgc3RhdGVcbiAgICAnY3JlYXRlIGRvY3VtZW50IGZvciBzZW50IGltYWdlcyc6ICdcdTdFRDlcdTUzRDFcdTkwMDFcdTc2ODRcdTU2RkVcdTcyNDdcdTUyMUJcdTVFRkFcdTY1ODdcdTY4NjMnLFxuICAgICdzaG93IHNlbnQgaW1hZ2VzJzogJ1x1NjYzRVx1NzkzQVx1NTNEMVx1OTAwMVx1NzY4NFx1NTZGRVx1NzI0NycsXG4gICAgJ2ZhbGxiYWNrIHNob3cgc2VudCBpbWFnZXMnOiAnXHU1M0Q2XHU2RDg4XHU2NjNFXHU3OTNBXHU1M0QxXHU5MDAxXHU3Njg0XHU1NkZFXHU3MjQ3JyxcbiAgICBcImdldCBjb250ZW50IG9mIGxheWVyIHswfVwiOiBcIlx1ODNCN1x1NTNENlx1NTZGRVx1NUM0MiB7MH0gXHU3Njg0XHU1MTg1XHU1QkI5XCIsXG4gICAgJ2ZhbGxiYWNrIGdldCBjb250ZW50IG9mIGxheWVyIHswfSc6ICdcdTUzRDZcdTZEODhcdTgzQjdcdTUzRDZcdTU2RkVcdTVDNDIgezB9IFx1NzY4NFx1NTE4NVx1NUJCOScsXG4gICAgJ2dldCBsYXllciBpbmZvJzogJ1x1ODNCN1x1NTNENlx1NTZGRVx1NUM0Mlx1NEZFMVx1NjA2RicsXG4gICAgJ3NkcHBwIGV4dHJhY3QgUFNEJzogJ3NkcHBwIFx1NUJGQ1x1NTE2NSBQU0QnLFxuICAgICdzZHBwcCBnZXQgUFNEJzogJ3NkcHBwIFx1ODNCN1x1NTNENiBQU0QnLCBcbiAgICAnc2V0IHRleHQgdG8gbGF5ZXInOiAnXHU4QkJFXHU3RjZFXHU1NkZFXHU1QzQyXHU3Njg0XHU2NTg3XHU2NzJDJyxcbiAgICAncnVuIFBob3Rvc2hvcCBBY3Rpb24nOiAnc2RwcHAgXHU4RkQwXHU4ODRDIFBob3Rvc2hvcCBBY3Rpb24nLFxuICAgICdzZWxlY3QgbGF5ZXInOiAnc2RwcHAgXHU5MDA5XHU0RTJEXHU1NkZFXHU1QzQyJyxcbiAgICBcbiAgICAvLyBwaG90b3Nob3AgZGlhbG9nL3dpZGdldFxuICAgICd7MH0gd2FudHMgdG8gZXh0cmFjdCBhIFBTRCBmaWxlIHRvIFBob3Rvc2hvcCwgYXJlIHlvdSBzdXJlPyc6ICd7MH0gXHU2MEYzXHU4OTgxXHU5MUNBXHU2NTNFXHU0RTAwXHU0RTJBLnBzZFx1NjU4N1x1NEVGNlx1NTIzMFBob3Rvc2hvcFx1RkYwQ1x1Nzg2RVx1NUI5QVx1NTQxN1x1RkYxRicsXG4gICAgJ3Nob3VsZCBzZHBwcCByZWZ1c2UgZXh0cmFjdGluZyBQU0QgdG8gUGhvdG9zaG9wIGluIHRoaXMgc2Vzc2lvbiBhbnltb3JlPyc6ICdcdTY2MkZcdTU0MjZcdTg5ODFcdThCQTkgc2RwcHAgXHU2MkQyXHU3RUREXHU2NzJDXHU2QjIxUFNcdTRGMUFcdThCRERcdTUxOERcdTZCMjFcdTYzQTVcdTUzRDcucHNkXHU5MUNBXHU2NTNFXHU4QkY3XHU2QzQyXHVGRjFGJyxcbiAgICAnV2lkZSBNb2RlJzogJ1x1NUJCRFx1NUM0Rlx1NkEyMVx1NUYwRicsXG4gICAgJ1F1aWNrIFNldCc6ICdcdTVGRUJcdTkwMUZcdThCQkVcdTdGNkUnLFxuICAgICdTZWxlY3RlZCBMYXllcic6ICdcdTkwMDlcdTRFMkRcdTU2RkVcdTVDNDInLFxuICAgICdTZWxlY3RlZCBMYXllciAoaW52ZXJ0KSc6ICdcdTkwMDlcdTRFMkRcdTU2RkVcdTVDNDIoXHU1M0NEXHU1NDExKScsXG4gICAgJ0NhbnZhcyc6ICdcdTc1M0JcdTVFMDMnLFxuICAgICdTZWxlY3Rpb24nOiAnXHU5MDA5XHU1MzNBJyxcbiAgICAnTWFudWFsJzogJ1x1NjI0Qlx1NTJBOFx1NkEyMVx1NUYwRicsXG4gICAgJ0F1dG8nOiAnXHU4MUVBXHU1MkE4XHU2QTIxXHU1RjBGJyxcblxuICAgIC8vIGFib3V0XG4gICAgJ1RoaXMgcGx1Z2luIGlzIGJhc2VkIG9uIHNkLXBwcCc6ICdcdTY3MkNcdTYzRDJcdTRFRjZcdTU3RkFcdTRFOEVzZC1wcHBcdTVGMDBcdTUzRDEnLFxuICAgICdBbmQgZm9sbG93cyBpdHMgb3BlbiBzb3VyY2UgbGljZW5zZTonOiAnXHU1RTc2XHU5MDc1XHU1RkFBXHU1MTc2XHU1RjAwXHU2RTkwXHU1MzRGXHU4QkFFXHVGRjFBJyxcbiAgICBcIkNsb3VkXCI6IFwiXHU0RTkxXHU3QUVGXHU2M0E4XHU4MzUwXCIsXG4gICAgXCJTcG9uc29yc1wiOiBcIlx1OEQ1RVx1NTJBOVwiLFxuICAgIFwid2FpdGluZy4uLlwiOiAnXHU4NjVBXHU0RjREXHU0RUU1XHU1Rjg1JyxcbiAgICAnTGlua3MnOiAnXHU1M0NCXHU2MEM1XHU5NEZFXHU2M0E1JyxcbiAgICAnQ29tbXVuaXR5JzogJ1x1NzkzRVx1NTMzQScsXG4gICAgJ0xJQ0VOU0U6JzogJ1x1OEJCOFx1NTNFRlx1OEJDMVx1RkYxQScsXG4gICAgJ09mZmljaWFsIFNpdGUnOiAnXHU1Qjk4XHU2NUI5XHU3RjUxXHU3QUQ5JyxcblxuICAgIC8vIGNvbWZ5IHBvcHVwXG4gICAgXCJ1cGxvYWRcIjogXCJcdTRFMEFcdTRGMjBcIixcbiAgICBcIlNpbXBsaWZ5IFdvcmtmbG93XCI6IFwiXHU3QjgwXHU1MzE2XHU1REU1XHU0RjVDXHU2RDQxXCIsXG4gICAgXCJQaG90b3Nob3BcIjogXCJQaG90b3Nob3BcIixcbiAgICBcIlBob3Rvc2hvcCBwbHVnaW4gc2V0dGluZ3NcIjogXCJQaG90b3Nob3AgXHU2M0QyXHU0RUY2XHU4QkJFXHU3RjZFXCIsXG4gICAgXCJQaG90b3Nob3AgcGx1Z2luXCI6IFwiUGhvdG9zaG9wIFx1NjNEMlx1NEVGNlwiLFxuICAgIFwiU0RQUFAgU2V0dGluZ3MvTWlzY1wiOiBcIlNEUFBQIFx1OEJCRVx1N0Y2RS9cdTY3NDJcdTk4NzlcIixcbiAgICBcIlNhbXBsZSAuUFNEIGZvciB0aGlzIHdvcmtmbG93OlwiOiBcIlx1NzkzQVx1NEY4Qi5QU0RcIixcbiAgICBcIkRvd25sb2FkIEV4YW1wbGUgLlBTRFwiOiBcIlx1NEUwQlx1OEY3RFx1NzkzQVx1NEY4Qi5QU0RcIixcbiAgICBcIk1heGltdW0gSW1hZ2UgU2l6ZSAocHgpOlwiOiBcIlx1NjcwMFx1NTkyN1x1NTZGRVx1NTBDRlx1NUMzQVx1NUJGOChweClcIixcbiAgICBcIkRvd25sb2FkXCI6IFwiXHU0RTBCXHU4RjdEXCIsXG4gICAgXCJVcGxvYWRcIjogXCJcdTRFMEFcdTRGMjBcIixcbiAgICBcIlJlc2V0XCI6IFwiXHU5MUNEXHU3RjZFXCIsXG4gICAgJ1JlZnJlc2gnOiAnXHU1MjM3XHU2NUIwJyxcbiAgICAnQ29tZnkgVVJMIChZb3UgY2FuIGNvcHkgaXQgdG8gY29ubmVjdCBDb21meVVJIGluIHRoZSBwbHVnaW4pOic6ICdDb21meVx1NTczMFx1NTc0MChcdTRGNjBcdTUzRUZcdTRFRTVcdTU5MERcdTUyMzZcdTVCODNcdTUyMzBcdTYzRDJcdTRFRjZcdTRFMkRcdThGREVcdTYzQTVDb21meVVJKTonLFxuICAgICd1c2Ugc2xpZGVyIGZvciBudW1iZXIgd2lkZ2V0Oic6ICdcdTY1NzBcdTVCNTdcdTYzQTdcdTRFRjZcdTRGN0ZcdTc1MjhcdTZFRDFcdTU3NTcnLFxuICAgICdQaG90b3Nob3AgaXMgbm90IGNvbm5lY3RlZCc6ICdQaG90b3Nob3AgXHU2NzJBXHU4RkRFXHU2M0E1JyxcbiAgICAnc2VsZWN0Li4uJzogJ1x1OEJGN1x1OTAwOVx1NjJFOScsXG4gICAgJ2NsaWNrIHRvIGVkaXQnOiAnXHU3MEI5XHU1MUZCXHU3RjE2XHU4RjkxJyxcblxuICAgIC8vIGNvbWZ5IGNhbGwgZXJyb3JcbiAgICAnQ29tZnlNYW5hZ2VyIG5vdCBmb3VuZCwgY2Fubm90IHJlYm9vdCc6ICdDb21meSBNYW5hZ2VyXHU2NzJBXHU1Qjg5XHU4OEM1XHVGRjBDXHU2NUUwXHU2Q0Q1XHU5MUNEXHU1NDJGJyxcbiAgICAnRmFpbGVkIHRvIHJlYm9vdCBDb21meVVJJzogJ1x1OTFDRFx1NTQyRkNvbWZ5VUlcdTU5MzFcdThEMjUnLFxufVxuIiwgImltcG9ydCBlbiBmcm9tICcuL2VuLm1qcyc7XG5pbXBvcnQgemhjbiBmcm9tICcuL3poLWNuLm1qcyc7XG4vL0B0cy1pZ25vcmVcbmNvbnN0IHJlcXVpcmVfID0gdHlwZW9mIHJlcXVpcmUgIT0gJ3VuZGVmaW5lZCcgPyByZXF1aXJlIDogdW5kZWZpbmVkXG5cbmxldCBsb2NhbGUgPSAnZW4nXG5pZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLmxhbmd1YWdlKSB7XG4gICAgbG9jYWxlID0gbmF2aWdhdG9yLmxhbmd1YWdlID09IFwiemgtQ05cIiA/ICd6aGNuJyA6ICdlbidcbn0gZWxzZSBpZiAocmVxdWlyZV8pIHtcbiAgICBsb2NhbGUgPSByZXF1aXJlXygndXhwJykuaG9zdC51aUxvY2FsZS5zdGFydHNXaXRoKFwiemhcIikgPyAnemhjbicgOiAnZW4nO1xufVxuXG5leHBvcnQgdHlwZSBJMThuS2V5ID0ga2V5b2YgdHlwZW9mIHpoY247XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGkxOG4oa2V5OiBrZXlvZiB0eXBlb2YgemhjbiwgLi4uYXJnczogYW55W10pIHtcbiAgICBjb25zdCBmb3JtYXRTdHI6IHN0cmluZyA9IGxvY2FsZSA9PSAnemhjbicgPyB6aGNuW2tleV0gOiAoa2V5IGluIGVuID8gKGVuIGFzIGFueSlba2V5XSA6IGtleSk7XG4gICAgaWYgKCFmb3JtYXRTdHIpIHRocm93IG5ldyBFcnJvcihgaTE4biBrZXkgbm90IGZvdW5kOiAke2tleX1gKTtcblxuICAgIHJldHVybiBmb3JtYXRTdHIucmVwbGFjZSgveyhcXGQrKX0vZywgZnVuY3Rpb24gKG1hdGNoLCBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBhcmdzW251bWJlcl0gIT0gJ3VuZGVmaW5lZCcgPyBhcmdzW251bWJlcl0gOiBtYXRjaFxuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEkxOG5LZXkoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4ga2V5IGluIHpoY247XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0kxOG5PZihrZXk6IGtleW9mIHR5cGVvZiB6aGNuLCBzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBrZXkgPT0gc3RyIHx8IHpoY25ba2V5XSA9PSBzdHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJMThuTG9jYWxlKCkge1xuICAgIHJldHVybiBsb2NhbGU7XG59XG4iLCAiaW1wb3J0IGkxOG4sIHsgaXNJMThuT2YgfSBmcm9tIFwiLi4vaTE4bi5tanNcIjtcblxuZXhwb3J0IGNsYXNzIFNwZWljaWFsSURNYW5hZ2VyIHtcbiAgICBwcml2YXRlIHN0YXRpYyBTUEVDSUFMX0RPQ1VNRU5UX0NVUlJFTlQgOiAnIyMjIEFjdGl2ZSBEb2N1bWVudCAjIyMnID0gJyMjIyBBY3RpdmUgRG9jdW1lbnQgIyMjJ1xuICAgIHB1YmxpYyBzdGF0aWMgaXNfU1BFQ0lBTF9ET0NVTUVOVF9DVVJSRU5UKHN0cjogc3RyaW5nKSB7IHJldHVybiBpc0kxOG5PZih0aGlzLlNQRUNJQUxfRE9DVU1FTlRfQ1VSUkVOVCwgc3RyKSB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRfU1BFQ0lBTF9ET0NVTUVOVF9DVVJSRU5UKCkgeyByZXR1cm4gaTE4bih0aGlzLlNQRUNJQUxfRE9DVU1FTlRfQ1VSUkVOVCkgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgU1BFQ0lBTF9MQVlFUl9LRUVQX1NJWkUgOiAnIyMjIEtlZXAgU2l6ZSBvciBGaXQgQ2FudmFzICMjIycgPSAnIyMjIEtlZXAgU2l6ZSBvciBGaXQgQ2FudmFzICMjIydcbiAgICBwdWJsaWMgc3RhdGljIGlzX1NQRUNJQUxfTEFZRVJfRklUKHN0cjogc3RyaW5nKSB7IHJldHVybiBpc0kxOG5PZih0aGlzLlNQRUNJQUxfTEFZRVJfS0VFUF9TSVpFLCBzdHIpIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldF9TUEVDSUFMX0xBWUVSX0ZJVCgpIHsgcmV0dXJuIGkxOG4odGhpcy5TUEVDSUFMX0xBWUVSX0tFRVBfU0laRSkgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgU1BFQ0lBTF9MQVlFUl9VU0VfQ0FOVkFTIDogJyMjIyBUaGUgQ2FudmFzICMjIycgPSAnIyMjIFRoZSBDYW52YXMgIyMjJ1xuICAgIHB1YmxpYyBzdGF0aWMgaXNfU1BFQ0lBTF9MQVlFUl9VU0VfQ0FOVkFTKHN0cjogc3RyaW5nKSB7IHJldHVybiBpc0kxOG5PZih0aGlzLlNQRUNJQUxfTEFZRVJfVVNFX0NBTlZBUywgc3RyKSB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRfU1BFQ0lBTF9MQVlFUl9VU0VfQ0FOVkFTKCkgeyByZXR1cm4gaTE4bih0aGlzLlNQRUNJQUxfTEFZRVJfVVNFX0NBTlZBUykgfSBcblxuICAgIHByaXZhdGUgc3RhdGljIFNQRUNJQUxfTEFZRVJfTkVXX0xBWUVSIDogJyMjIyBOZXcgTGF5ZXIgIyMjJyA9ICcjIyMgTmV3IExheWVyICMjIydcbiAgICBwdWJsaWMgc3RhdGljIGlzX1NQRUNJQUxfTEFZRVJfTkVXX0xBWUVSKHN0cjogc3RyaW5nKSB7IHJldHVybiBpc0kxOG5PZih0aGlzLlNQRUNJQUxfTEFZRVJfTkVXX0xBWUVSLCBzdHIpIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldF9TUEVDSUFMX0xBWUVSX05FV19MQVlFUigpIHsgcmV0dXJuIGkxOG4odGhpcy5TUEVDSUFMX0xBWUVSX05FV19MQVlFUikgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgU1BFQ0lBTF9MQVlFUl9TRUxFQ1RFRF9MQVlFUiA6ICcjIyMgU2VsZWN0ZWQgTGF5ZXIgIyMjJyA9ICcjIyMgU2VsZWN0ZWQgTGF5ZXIgIyMjJ1xuICAgIHB1YmxpYyBzdGF0aWMgaXNfU1BFQ0lBTF9MQVlFUl9TRUxFQ1RFRF9MQVlFUihzdHI6IHN0cmluZykgeyByZXR1cm4gaXNJMThuT2YodGhpcy5TUEVDSUFMX0xBWUVSX1NFTEVDVEVEX0xBWUVSLCBzdHIpIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldF9TUEVDSUFMX0xBWUVSX1NFTEVDVEVEX0xBWUVSKCkgeyByZXR1cm4gaTE4bih0aGlzLlNQRUNJQUxfTEFZRVJfU0VMRUNURURfTEFZRVIpIH1cblxuICAgIHByaXZhdGUgc3RhdGljIFNQRUNJQUxfTEFZRVJfUFJFVklFV19ET0NVTUVOVCA6ICdfU0RQUFBfUFNEXycgPSAnX1NEUFBQX1BTRF8nXG4gICAgcHVibGljIHN0YXRpYyBpc19TUEVDSUFMX0xBWUVSX1BSRVZJRVdfRE9DVU1FTlQoc3RyOiBzdHJpbmcpIHsgcmV0dXJuIGlzSTE4bk9mKHRoaXMuU1BFQ0lBTF9MQVlFUl9QUkVWSUVXX0RPQ1VNRU5ULCBzdHIpIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldF9TUEVDSUFMX0xBWUVSX1BSRVZJRVdfRE9DVU1FTlQoKSB7IHJldHVybiBpMThuKHRoaXMuU1BFQ0lBTF9MQVlFUl9QUkVWSUVXX0RPQ1VNRU5UKSB9XG5cbiAgICBzdGF0aWMgZ2V0U3BlY2lhbERvY3VtZW50Q3VycmVudCgpIHtcbiAgICAgICAgcmV0dXJuIGkxOG4oU3BlaWNpYWxJRE1hbmFnZXIuU1BFQ0lBTF9ET0NVTUVOVF9DVVJSRU5UKVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRTcGVjaWFsTGF5ZXJGb3JHZXQoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBpMThuKFNwZWljaWFsSURNYW5hZ2VyLlNQRUNJQUxfTEFZRVJfVVNFX0NBTlZBUyksXG4gICAgICAgICAgICBpMThuKFNwZWljaWFsSURNYW5hZ2VyLlNQRUNJQUxfTEFZRVJfU0VMRUNURURfTEFZRVIpXG4gICAgICAgIF1cbiAgICB9XG4gICAgc3RhdGljIGdldFNwZWNpYWxMYXllckZvclNlbmQoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBpMThuKFNwZWljaWFsSURNYW5hZ2VyLlNQRUNJQUxfTEFZRVJfTkVXX0xBWUVSKSxcbiAgICAgICAgICAgIGkxOG4oU3BlaWNpYWxJRE1hbmFnZXIuU1BFQ0lBTF9MQVlFUl9TRUxFQ1RFRF9MQVlFUilcbiAgICAgICAgXVxuICAgIH1cbiAgICBzdGF0aWMgZ2V0U3BlY2lhbERvY3VtZW50Rm9yUHJldmlldygpIHtcbiAgICAgICAgcmV0dXJuIGkxOG4oU3BlaWNpYWxJRE1hbmFnZXIuU1BFQ0lBTF9MQVlFUl9QUkVWSUVXX0RPQ1VNRU5UKVxuICAgIH1cblxuICAgIHN0YXRpYyBmaXhJMThuKHN0cjogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLmlzX1NQRUNJQUxfRE9DVU1FTlRfQ1VSUkVOVChzdHIpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5TUEVDSUFMX0RPQ1VNRU5UX0NVUlJFTlQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNfU1BFQ0lBTF9MQVlFUl9ORVdfTEFZRVIoc3RyKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuU1BFQ0lBTF9MQVlFUl9ORVdfTEFZRVI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNfU1BFQ0lBTF9MQVlFUl9QUkVWSUVXX0RPQ1VNRU5UKHN0cikpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLlNQRUNJQUxfTEFZRVJfUFJFVklFV19ET0NVTUVOVDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc19TUEVDSUFMX0xBWUVSX1VTRV9DQU5WQVMoc3RyKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuU1BFQ0lBTF9MQVlFUl9VU0VfQ0FOVkFTO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzX1NQRUNJQUxfTEFZRVJfU0VMRUNURURfTEFZRVIoc3RyKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuU1BFQ0lBTF9MQVlFUl9TRUxFQ1RFRF9MQVlFUjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBJZGVudGlmeSB9IGZyb20gXCIuLi8uLi9zdG9yZS9waG90b3Nob3AubXRzXCI7XG5cblxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VMYXllcklkZW50aWZ5KGlkOiBudW1iZXIsIG5hbWU6IHN0cmluZywgbGV2ZWwgPSAwKTogSWRlbnRpZnkge1xuICAgIHJldHVybiAoJy0nLnJlcGVhdChsZXZlbCkgKyBgJHtuYW1lfSAoaWQ6JHtpZH0pYCkgYXMgYW55IGFzIG5ldmVyXG59XG5leHBvcnQgZnVuY3Rpb24gbWFrZURvY3VtZW50SWRlbnRpZnkoaWQ6IG51bWJlciwgbmFtZTogc3RyaW5nKTogSWRlbnRpZnkge1xuICAgIHJldHVybiAoYCR7bmFtZX0gKGlkOiR7aWR9KWApIGFzIGFueSBhcyBuZXZlclxufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGF5ZXJJZGVudGlmeShpZGVudGlmeTogSWRlbnRpZnkgfCBzdHJpbmcpOiB7bmFtZTogc3RyaW5nLCBpZDogbnVtYmVyfSB7XG4gICAgY29uc3Qgc3BsaXR0ZXIgPSAoaWRlbnRpZnkgYXMgc3RyaW5nKS5zcGxpdCgnIChpZDonKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBzcGxpdHRlclswXSxcbiAgICAgICAgaWQ6IHBhcnNlSW50KHNwbGl0dGVyWzFdLnNsaWNlKDAsIC0xKSlcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VEb2N1bWVudElkZW50aWZ5KGlkZW50aWZ5OiBJZGVudGlmeSB8IHN0cmluZyk6IHtuYW1lOiBzdHJpbmcsIGlkOiBudW1iZXJ9IHtcbiAgICByZXR1cm4gcGFyc2VMYXllcklkZW50aWZ5KGlkZW50aWZ5KTtcbn0iLCAiLy8gQHRzLWlnbm9yZVxuZ2xvYmFsVGhpcy5zZHBwcFggPSBnbG9iYWxUaGlzLnNkcHBwWCB8fCB7fTtcbmV4cG9ydCBjb25zdCBzZHBwcFggPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLnNkcHBwWDsiLCAiaW1wb3J0IHsgcGFyc2VEb2N1bWVudElkZW50aWZ5IH0gZnJvbSBcIi4uL2NvbW1vbi9waG90b3Nob3AvaWRlbnRpZnkubWpzXCI7XG5pbXBvcnQgeyBTcGVpY2lhbElETWFuYWdlciB9IGZyb20gXCIuLi9jb21tb24vcGhvdG9zaG9wL3NwZWNpYWxMYXllci5tanNcIjtcbmltcG9ydCB7IERvY3VtZW50RGF0YSwgSWRlbnRpZnksIFBob3Rvc2hvcFN0b3JlIH0gZnJvbSBcIi4vcGhvdG9zaG9wLm1qc1wiO1xuXG5cbmV4cG9ydCBjbGFzcyBQaG90b3Nob3BTdG9yZUhlbHBlciB7XG4gICAgc3RhdGljIG1ha2VEb2N1bWVudERhdGFPcHRpb25zKHBob3Rvc2hvcFN0b3JlOiBQaG90b3Nob3BTdG9yZSk6IElkZW50aWZ5W10ge1xuICAgICAgICBjb25zdCBQaG90b3Nob3BTdG9yZURhdGEgPSBwaG90b3Nob3BTdG9yZS5kYXRhO1xuICAgICAgICBjb25zdCBvcHRpb25zOiBzdHJpbmdbXSA9IFtgJHtTcGVpY2lhbElETWFuYWdlci5nZXRTcGVjaWFsRG9jdW1lbnRDdXJyZW50KCl9YF1cbiAgICAgICAgT2JqZWN0LmtleXMoUGhvdG9zaG9wU3RvcmVEYXRhLmRvY3VtZW50cylcbiAgICAgICAgICAgIC5mb3JFYWNoKGRvY3VtZW50SUQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50ID0gUGhvdG9zaG9wU3RvcmVEYXRhLmRvY3VtZW50c1tkb2N1bWVudElEIGFzIGFueV07XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5wdXNoKGRvY3VtZW50LmlkZW50aWZ5KVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBvcHRpb25zIGFzIElkZW50aWZ5W107XG4gICAgfVxuICAgIHN0YXRpYyBmaW5kRG9jdW1lbnREYXRhKHBob3Rvc2hvcFN0b3JlOiBQaG90b3Nob3BTdG9yZSwgaWRlbnRpZnk6IHN0cmluZykge1xuICAgICAgICBjb25zdCBkb2N1bWVudElEID0gU3BlaWNpYWxJRE1hbmFnZXIuaXNfU1BFQ0lBTF9ET0NVTUVOVF9DVVJSRU5UKGlkZW50aWZ5KSA/XG4gICAgICAgICAgICBwaG90b3Nob3BTdG9yZS5kYXRhLmFjdGl2ZURvY3VtZW50SUQgOlxuICAgICAgICAgICAgcGFyc2VEb2N1bWVudElkZW50aWZ5KGlkZW50aWZ5KS5pZDtcbiAgICAgICAgcmV0dXJuIHBob3Rvc2hvcFN0b3JlLmRhdGEuZG9jdW1lbnRzW2RvY3VtZW50SURdO1xuICAgIH1cbiAgICBzdGF0aWMgbWFrZUxheWVyT3B0aW9ucyhkb2N1bWVudERhdGE6IERvY3VtZW50RGF0YSwgZXh0cmFPcHRpb25zOiBzdHJpbmdbXSkge1xuICAgICAgICBsZXQgb3B0aW9ucyA9IGV4dHJhT3B0aW9ucy5jb25jYXQoXG4gICAgICAgICAgICBkb2N1bWVudERhdGEubGF5ZXJzLm1hcChsYXllciA9PiBsYXllci5pZGVudGlmeSlcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gb3B0aW9uc1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0TGF5ZXJEaXJ0eUlEKGRvY3VtZW50RGF0YTogRG9jdW1lbnREYXRhLCBpZGVudGlmeTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGxheWVyID0gZG9jdW1lbnREYXRhLmxheWVycy5maW5kKGxheWVyID0+IGxheWVyLmlkZW50aWZ5ID09PSBpZGVudGlmeSk7XG4gICAgICAgIHJldHVybiBsYXllcj8uZGlydHlJRCB8fCAwO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Q2FudmFzRGlydHlJRChkb2N1bWVudERhdGE6IERvY3VtZW50RGF0YSkge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnREYXRhLmNhbnZhc0RpcnR5SUQgfHwgMDtcbiAgICB9XG4gICAgc3RhdGljIGdldFNlbGVjdGlvbkRpcnR5SUQoZG9jdW1lbnREYXRhOiBEb2N1bWVudERhdGEpIHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50RGF0YS5zZWxlY3Rpb25EaXJ0eUlEIHx8IDA7XG4gICAgfVxufVxuIiwgImltcG9ydCBpMThuIGZyb20gXCIuLi8uLi8uLi9zcmMvY29tbW9uL2kxOG4ubWpzXCI7XG5pbXBvcnQgeyBwYXJzZURvY3VtZW50SWRlbnRpZnkgfSBmcm9tIFwiLi4vLi4vLi4vc3JjL2NvbW1vbi9waG90b3Nob3AvaWRlbnRpZnkubXRzXCI7XG5pbXBvcnQgeyBTcGVpY2lhbElETWFuYWdlciB9IGZyb20gXCIuLi8uLi8uLi9zcmMvY29tbW9uL3Bob3Rvc2hvcC9zcGVjaWFsTGF5ZXIubXRzXCI7XG5pbXBvcnQgeyBzZHBwcFggfSBmcm9tIFwiLi4vLi4vLi4vc3JjL2NvbW1vbi9zZHBwcFgubXRzXCI7XG5pbXBvcnQgeyBQaG90b3Nob3BTdG9yZUhlbHBlciB9IGZyb20gXCIuLi8uLi8uLi9zcmMvc3RvcmUvaGVscGVycy5tdHNcIjtcbmltcG9ydCB7IElkZW50aWZ5IH0gZnJvbSBcIi4uLy4uLy4uL3NyYy9zdG9yZS9waG90b3Nob3AubXRzXCI7XG5pbXBvcnQgeyBhcGksIGFwcCB9IGZyb20gXCIuL2NvbWZ5LWdsb2JhbHMubXRzXCI7XG5pbXBvcnQgeyBwYWdlUGhvdG9zaG9wU3RvcmVNYXAgfSBmcm9tIFwiLi4vcGhvdG9zaG9wTW9kZWxzLm10c1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gbWFrZURvY3VtZW50RGF0YU9wdGlvbnMoKSB7XG4gICAgY29uc3QgYWxsU3RvcmVzID0gcGFnZVBob3Rvc2hvcFN0b3JlTWFwLmdldEFsbFN0b3JlKCk7XG4gICAgY29uc3Qgb3B0aW9uczogc3RyaW5nW10gPSBbXVxuICAgIE9iamVjdC52YWx1ZXMoYWxsU3RvcmVzKS5mb3JFYWNoKHN0b3JlID0+IHtcbiAgICAgICAgaWYgKGFwaS51c2VyICYmIGFwaS51c2VyICE9IHN0b3JlLmRhdGEuY29tZnlVc2VyVG9rZW4pIHJldHVybjtcblxuICAgICAgICBjb25zdCBzdG9yZU9wdGlvbnMgPSBQaG90b3Nob3BTdG9yZUhlbHBlci5tYWtlRG9jdW1lbnREYXRhT3B0aW9ucyhzdG9yZSlcbiAgICAgICAgICAgIC5tYXAob3B0aW9uID0+IG1ha2VEb2N1bWVudE9wdGlvbihvcHRpb24sIHN0b3JlLmRhdGEudW5hbWUpKTtcbiAgICAgICAgb3B0aW9ucy5wdXNoKC4uLnN0b3JlT3B0aW9ucyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIG9wdGlvbnM7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0TGF5ZXJPcHRpb25zQnlEb2N1bWVudFZhbHVlKGRvY3VtZW50VmFsdWU6IHN0cmluZywgZXh0cmFPcHRpb25zOiBzdHJpbmdbXSkge1xuICAgIGxldCBvcHRpb25zID0gWycnXVxuICAgIGNvbnN0IGRvY3VtZW50T3B0aW9uID0gcGFyc2VEb2N1bWVudE9wdGlvbihkb2N1bWVudFZhbHVlKTtcbiAgICBpZiAoIWRvY3VtZW50T3B0aW9uKSByZXR1cm4gW107XG4gICAgY29uc3Qgc3RvcmVPcHRpb25zID0gUGhvdG9zaG9wU3RvcmVIZWxwZXIubWFrZUxheWVyT3B0aW9ucyhkb2N1bWVudE9wdGlvbi5kb2N1bWVudERhdGEsIGV4dHJhT3B0aW9ucylcbiAgICBvcHRpb25zLnB1c2goLi4uc3RvcmVPcHRpb25zKTtcbiAgICByZXR1cm4gb3B0aW9uc1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzUGhvdG9zaG9wQ29ubmVjdGVkKCkge1xuICAgIGlmIChhcGkudXNlcikge1xuICAgICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhwYWdlUGhvdG9zaG9wU3RvcmVNYXAuZ2V0QWxsU3RvcmUoKSlcbiAgICAgICAgICAgIC5maWx0ZXIoc3RvcmUgPT5cbiAgICAgICAgICAgICAgICBhcGkudXNlciA9PSBzdG9yZS5kYXRhLmNvbWZ5VXNlclRva2VuXG4gICAgICAgICAgICApLmxlbmd0aCA+IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHBhZ2VQaG90b3Nob3BTdG9yZU1hcC5zdG9yZUNvdW50KClcbiAgICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VEb2N1bWVudE9wdGlvbihpZGVudGlmeTogSWRlbnRpZnksIGluc3RhbmNlTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGAke2luc3RhbmNlTmFtZX0vJHtpZGVudGlmeX1gXG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VEb2N1bWVudE9wdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKCF2YWx1ZSB8fCAhdmFsdWUuc3BsaXQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGJhY2tlbmREYXRhcyA9IHBhZ2VQaG90b3Nob3BTdG9yZU1hcC5nZXRBbGxQaG90b3Nob3BEb2N1bWVudERhdGEoKTtcbiAgICBsZXQgW2luc3RhbmNlTmFtZSwgZG9jdW1lbnRJZGVudGlmeV0gPSB2YWx1ZS5zcGxpdCgnLycpO1xuICAgIGlmICghZG9jdW1lbnRJZGVudGlmeSkge1xuICAgICAgICBkb2N1bWVudElkZW50aWZ5ID0gaW5zdGFuY2VOYW1lXG4gICAgICAgIGluc3RhbmNlTmFtZSA9IE9iamVjdC5rZXlzKGJhY2tlbmREYXRhcylbMF07XG4gICAgfTtcbiAgICBpZiAoIWJhY2tlbmREYXRhc1tpbnN0YW5jZU5hbWVdKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBkb2N1bWVudElEID0gU3BlaWNpYWxJRE1hbmFnZXIuaXNfU1BFQ0lBTF9ET0NVTUVOVF9DVVJSRU5UKGRvY3VtZW50SWRlbnRpZnkpID9cbiAgICAgICAgYmFja2VuZERhdGFzW2luc3RhbmNlTmFtZV0uYWN0aXZlRG9jdW1lbnRJRCA6XG4gICAgICAgIHBhcnNlRG9jdW1lbnRJZGVudGlmeShkb2N1bWVudElkZW50aWZ5KS5pZDtcblxuICAgIGlmIChiYWNrZW5kRGF0YXNbaW5zdGFuY2VOYW1lXT8uZG9jdW1lbnRzW2RvY3VtZW50SURdKSB7XG4gICAgICAgIGNvbnN0IGRvY3VtZW50RGF0YSA9IGJhY2tlbmREYXRhc1tpbnN0YW5jZU5hbWVdLmRvY3VtZW50c1tkb2N1bWVudElEXTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGluc3RhbmNlX2lkOiBiYWNrZW5kRGF0YXNbaW5zdGFuY2VOYW1lXS5zaWQsXG4gICAgICAgICAgICBpZGVudGlmeTogZG9jdW1lbnRJZGVudGlmeSxcbiAgICAgICAgICAgIGRvY3VtZW50RGF0YVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuaW50ZXJmYWNlIENvbWZ5R3JhcGhOb2RlIHtcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgaWQ6IG51bWJlcixcbiAgICBpbnB1dHM6IHsgbGluaz86IG51bWJlciB9W10sXG4gICAgd2lkZ2V0czogQ29tZnlHcmFwaFdpZGdldFtdXG59XG5pbnRlcmZhY2UgQ29tZnlHcmFwaFdpZGdldCB7XG4gICAgdmFsdWU6IHN0cmluZ1xuICAgIHNlcmlhbGl6ZVZhbHVlOiAoKSA9PiBQcm9taXNlPHN0cmluZz5cbn1cblxuY29uc3QgZ2V0TGluayA9IGZ1bmN0aW9uIChvcmlnaW5faWQ6IG51bWJlcikge1xuICAgIGNvbnN0IGxpbmtNYXA6IE1hcDxudW1iZXIsIHtcbiAgICAgICAgb3JpZ2luX2lkOiBudW1iZXIsXG4gICAgICAgIHRhcmdldF9pZDogbnVtYmVyXG4gICAgfT4gfCB7XG4gICAgICAgIG9yaWdpbl9pZDogbnVtYmVyLFxuICAgICAgICB0YXJnZXRfaWQ6IG51bWJlclxuICAgIH1bXSA9IGFwcC5ncmFwaC5saW5rcztcbiAgICBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheShsaW5rTWFwKTtcbiAgICBpZiAoaXNBcnJheSkge1xuICAgICAgICByZXR1cm4gbGlua01hcC5maW5kKGxpbmsgPT4gbGluayAmJiBsaW5rLm9yaWdpbl9pZCA9PSBvcmlnaW5faWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBsaW5rTWFwLmdldChvcmlnaW5faWQpO1xuICAgIH1cbn1cblxuLy8gdG9kbyBncm91cG5vZGVcbmV4cG9ydCBmdW5jdGlvbiBmaW5kRG9jdW1lbnROb2RlUmVjdXJzaXZlKF9ub2RlOiBDb21meUdyYXBoTm9kZSk6IENvbWZ5R3JhcGhOb2RlIHwgbnVsbCB7XG4gICAgY29uc3QgYWxsTm9kZXM6IENvbWZ5R3JhcGhOb2RlW10gPSBhcHAuZ3JhcGgubm9kZXM7XG5cbiAgICBjb25zdCBjdXJOb2RlID0gYWxsTm9kZXMuZmluZChub2RlID0+IF9ub2RlLmlkID09IG5vZGUuaWQpO1xuICAgIGlmICghY3VyTm9kZSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgcmVzdWx0OiBDb21meUdyYXBoTm9kZVtdID0gW107XG4gICAgZmluZFJlY3Vyc2l2ZShjdXJOb2RlLCByZXN1bHQpO1xuICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMikge1xuICAgICAgICBjb25zdCBmaXJzdFZhbHVlID0gcmVzdWx0WzBdLndpZGdldHNbMF0udmFsdWU7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICFyZXN1bHRcbiAgICAgICAgICAgICAgICAubWFwKG5vZGUgPT4gbm9kZS53aWRnZXRzWzBdLnZhbHVlKVxuICAgICAgICAgICAgICAgIC5ldmVyeSh2YWx1ZSA9PiB2YWx1ZSA9PSBmaXJzdFZhbHVlKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihpMThuKCdDYW5ub3QgY29ubmVjdCBtdWx0aXBsZSBkaWZmZXJlbnQgZG9jdW1lbnQgd2lkZ2V0cyB3aXRoIHNhbWUgdmFsdWUnKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdD8uWzBdIHx8IG51bGw7XG5cbiAgICBmdW5jdGlvbiBmaW5kUmVjdXJzaXZlKG5vZGU6IENvbWZ5R3JhcGhOb2RlLCByZXN1bHQ6IENvbWZ5R3JhcGhOb2RlW10pOiBDb21meUdyYXBoTm9kZSB8IG51bGwge1xuICAgICAgICBpZiAobm9kZS50eXBlID09ICdTRFBQUCBHZXQgRG9jdW1lbnQnKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChub2RlKTtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmlucHV0cy5sZW5ndGggPT0gMCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGZvciAoY29uc3QgaW5wdXQgb2Ygbm9kZS5pbnB1dHMpIHtcbiAgICAgICAgICAgIGlmIChpbnB1dC5saW5rKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGluayA9IGdldExpbmsoaW5wdXQubGluayk7XG4gICAgICAgICAgICAgICAgaWYgKCFsaW5rKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXROb2RlID0gYWxsTm9kZXMuZmluZChub2RlID0+IG5vZGUuaWQgPT0gbGluay5vcmlnaW5faWQpO1xuICAgICAgICAgICAgICAgIGlmICghdGFyZ2V0Tm9kZSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF5YmVEb2N1bWVudFdpZGdldCA9IGZpbmRSZWN1cnNpdmUodGFyZ2V0Tm9kZSwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICBpZiAobWF5YmVEb2N1bWVudFdpZGdldCkgcmV0dXJuIG1heWJlRG9jdW1lbnRXaWRnZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG5zZHBwcFguZmluZERvY3VtZW50Tm9kZVJlY3Vyc2l2ZSA9IGZpbmREb2N1bWVudE5vZGVSZWN1cnNpdmU7IiwgImV4cG9ydCBjbGFzcyBGbHVzaGVyIHtcbiAgICAvLyB0aGUgYXN5bmMgcXVldWVcbiAgICBwcml2YXRlIGZsdXNoaW5nOiBQcm9taXNlPGFueT4gPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBwcml2YXRlIG5ld0ZsdXNoUGVuZGluZyA9IGZhbHNlO1xuICAgIGNvbnN0cnVjdG9yKGRvRmx1c2g6ICgpID0+IFByb21pc2U8YW55Pikge1xuICAgICAgICB0aGlzLmRvRmx1c2ggPSBkb0ZsdXNoO1xuICAgICAgICB0aGlzLnBhdXNlKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGRvRmx1c2g6ICgpID0+IFByb21pc2U8YW55PjtcblxuICAgIHB1YmxpYyBydW5GbHVzaCgpIHtcbiAgICAgICAgaWYgKHRoaXMubmV3Rmx1c2hQZW5kaW5nKSByZXR1cm47XG4gICAgICAgIHRoaXMubmV3Rmx1c2hQZW5kaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5mbHVzaGluZyA9IHRoaXMuZmx1c2hpbmcudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHJlcXVlc3RBbmltYXRpb25GcmFtZShyZXNvbHZlKSlcbiAgICAgICAgICAgIHRoaXMubmV3Rmx1c2hQZW5kaW5nID0gZmFsc2U7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmRvRmx1c2goKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBwYXVzZSgpIHtcbiAgICAgICAgdGhpcy5mbHVzaGluZyA9IHRoaXMuZmx1c2hpbmcudGhlbigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7IFxuICAgICAgICAgICAgICAgIHRoaXMucmVzdW1lID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVzdW1lID0gKCkgPT4geyB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzdW1lOiAocD86IGFueSkgPT4gdm9pZCA9ICgpID0+IHsgfTtcbn0iLCAiaW1wb3J0IHsgRmx1c2hlciB9IGZyb20gXCIuLi8uLi9mbHVzaGVyLm1qc1wiO1xuaW1wb3J0IHsgTWFpblN0b3JlIH0gZnJvbSBcIi4uLy4uL3N0b3JlL3N0b3JlLm1qc1wiO1xuaW1wb3J0IHsgU29ja2V0LCBTb2NrZXRDb25zdHJ1Y3RvciB9IGZyb20gXCIuLi9Tb2NrZXQubWpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBNYWluU3RvcmVIb2xkZXJTb2NrZXQoc3RvcmU6IE1haW5TdG9yZTxhbnk+LCB0eXBlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKFNvY2tldENsYXNzOiBTb2NrZXRDb25zdHJ1Y3RvcjxTb2NrZXQ+KSB7XG4gICAgICAgIHJldHVybiBjbGFzcyBleHRlbmRzIFNvY2tldENsYXNzIHtcbiAgICAgICAgICAgIGNvbnN0cnVjdG9yKHVybDogc3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgc3VwZXIodXJsKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5vbignc3RvcmVfcmVxdWVzdCcsIChwYXlsb2FkOiBhbnksIGNhbGxiYWNrOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soe1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogc3RvcmUuZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246IHN0b3JlLnZlcnNpb25cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBsZXQgZmx1c2hlciA9IG5ldyBGbHVzaGVyKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBvcGVyYXRpb25zLCBmcm9tVmVyc2lvbiwgdG9WZXJzaW9uIH0gPSBzdG9yZS5mbHVzaCgpXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ3N0YXJ0IGZsdXNoJywgZnJvbVZlcnNpb24sIG9wZXJhdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2FsbGJhY2tlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrZWQpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ2ZsdXNoIHRpbWVvdXQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDUwMDApXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5lbWl0KCdzdG9yZV9mbHVzaCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21WZXJzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcz8uZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignZmx1c2ggZXJyb3InLCByZXMuZXJyb3IpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUuZmx1c2hEb25lKHRvVmVyc2lvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIHN0b3JlLnN1YnNjcmliZSgnLycsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZmx1c2hlci5ydW5GbHVzaCgpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQub24oJ2Rpc2Nvbm5lY3QnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZsdXNoZXIucGF1c2UoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5vbignY29ubmVjdCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmUuc2V0U0lEKHRoaXMuc29ja2V0LmlkIHx8ICcnKVxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQuZW1pdCgnc2RwcHBfaW5pdCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHN0b3JlLmRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogc3RvcmUudmVyc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5vbignc2RwcHBfaW5pdGVkJywgKHBheWxvYWQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmbHVzaGVyLnJlc3VtZSgpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59IiwgImltcG9ydCB7IFN0b3JlTWFwIH0gZnJvbSBcIi4uLy4uL3N0b3JlL3N0b3JlLW1hcC5tanNcIjtcbmltcG9ydCB7IFNvY2tldCwgU29ja2V0Q29uc3RydWN0b3IgfSBmcm9tIFwiLi4vU29ja2V0Lm1qc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gU3RvcmVNYXBIb2xkZXJTb2NrZXQoc3RvcmVNYXA6IFN0b3JlTWFwPGFueT4sIHRhcmdldFR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiBmdW5jdGlvbiAoU29ja2V0Q2xhc3M6IFNvY2tldENvbnN0cnVjdG9yPFNvY2tldD4pIHtcbiAgICAgICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgU29ja2V0Q2xhc3Mge1xuICAgICAgICAgICAgY29uc3RydWN0b3IodXJsOiBzdHJpbmcpIHtcbiAgICAgICAgICAgICAgICBzdXBlcih1cmwpO1xuICAgICAgICAgICAgICAgIHRoaXMuc29ja2V0Lm9uKCdzdG9yZV9mbHVzaCcsIChwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgICAgIHNpZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbnM6IGFueVtdLFxuICAgICAgICAgICAgICAgICAgICBmcm9tVmVyc2lvbjogbnVtYmVyLFxuICAgICAgICAgICAgICAgIH0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBheWxvYWQudHlwZSAhPT0gdGFyZ2V0VHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdwaG90b3Nob3AgZmx1c2gnLCBwYXlsb2FkLnNpZClcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RvcmUgPSBzdG9yZU1hcC5nZXRTdG9yZShwYXlsb2FkLnNpZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc3RvcmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNvY2tldC5lbWl0KCdzdG9yZV9yZXF1ZXN0JywgeyBzaWQ6IHBheWxvYWQuc2lkIH0sIChwYXlsb2FkOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZU1hcC5hZGRTdG9yZShwYXlsb2FkLnNpZCwgcGF5bG9hZC5kYXRhLCBwYXlsb2FkLnZlcnNpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdG9yZS5wYXRjaFZlcnNpb25BY2NlcHRhYmxlKHBheWxvYWQuZnJvbVZlcnNpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUucGF0Y2hEYXRhKHBheWxvYWQub3BlcmF0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdwYXRjaCB2ZXJzaW9uIG5vdCBhY2NlcHRhYmxlIGZyb20nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLmZyb21WZXJzaW9uLCAnY3VycmVudCB2ZXJzaW9uIGlzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUudmVyc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5lbWl0KCdzdG9yZV9yZXF1ZXN0JywgeyB0eXBlOiB0YXJnZXRUeXBlIH0sIChwYXlsb2FkOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVNYXAuc3luYyhwYXlsb2FkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQub24oJ3N0b3JlX3JlbW92ZScsIChwYXlsb2FkOiB7IHNpZDogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmVNYXAucmVtb3ZlU3RvcmUocGF5bG9hZC5zaWQpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQub24oJ3NkcHBwX2luaXRlZCcsIChwYXlsb2FkOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQuZW1pdCgnc3RvcmVfcmVxdWVzdCcsIHsgdHlwZTogdGFyZ2V0VHlwZSB9LCAocGF5bG9hZDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yZU1hcC5zeW5jKHBheWxvYWQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsICJjb25zdCBQQUNLRVRfVFlQRVMgPSBPYmplY3QuY3JlYXRlKG51bGwpOyAvLyBubyBNYXAgPSBubyBwb2x5ZmlsbFxuUEFDS0VUX1RZUEVTW1wib3BlblwiXSA9IFwiMFwiO1xuUEFDS0VUX1RZUEVTW1wiY2xvc2VcIl0gPSBcIjFcIjtcblBBQ0tFVF9UWVBFU1tcInBpbmdcIl0gPSBcIjJcIjtcblBBQ0tFVF9UWVBFU1tcInBvbmdcIl0gPSBcIjNcIjtcblBBQ0tFVF9UWVBFU1tcIm1lc3NhZ2VcIl0gPSBcIjRcIjtcblBBQ0tFVF9UWVBFU1tcInVwZ3JhZGVcIl0gPSBcIjVcIjtcblBBQ0tFVF9UWVBFU1tcIm5vb3BcIl0gPSBcIjZcIjtcbmNvbnN0IFBBQ0tFVF9UWVBFU19SRVZFUlNFID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbk9iamVjdC5rZXlzKFBBQ0tFVF9UWVBFUykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgUEFDS0VUX1RZUEVTX1JFVkVSU0VbUEFDS0VUX1RZUEVTW2tleV1dID0ga2V5O1xufSk7XG5jb25zdCBFUlJPUl9QQUNLRVQgPSB7IHR5cGU6IFwiZXJyb3JcIiwgZGF0YTogXCJwYXJzZXIgZXJyb3JcIiB9O1xuZXhwb3J0IHsgUEFDS0VUX1RZUEVTLCBQQUNLRVRfVFlQRVNfUkVWRVJTRSwgRVJST1JfUEFDS0VUIH07XG4iLCAiaW1wb3J0IHsgUEFDS0VUX1RZUEVTIH0gZnJvbSBcIi4vY29tbW9ucy5qc1wiO1xuY29uc3Qgd2l0aE5hdGl2ZUJsb2IgPSB0eXBlb2YgQmxvYiA9PT0gXCJmdW5jdGlvblwiIHx8XG4gICAgKHR5cGVvZiBCbG9iICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChCbG9iKSA9PT0gXCJbb2JqZWN0IEJsb2JDb25zdHJ1Y3Rvcl1cIik7XG5jb25zdCB3aXRoTmF0aXZlQXJyYXlCdWZmZXIgPSB0eXBlb2YgQXJyYXlCdWZmZXIgPT09IFwiZnVuY3Rpb25cIjtcbi8vIEFycmF5QnVmZmVyLmlzVmlldyBtZXRob2QgaXMgbm90IGRlZmluZWQgaW4gSUUxMFxuY29uc3QgaXNWaWV3ID0gKG9iaikgPT4ge1xuICAgIHJldHVybiB0eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyBBcnJheUJ1ZmZlci5pc1ZpZXcob2JqKVxuICAgICAgICA6IG9iaiAmJiBvYmouYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI7XG59O1xuY29uc3QgZW5jb2RlUGFja2V0ID0gKHsgdHlwZSwgZGF0YSB9LCBzdXBwb3J0c0JpbmFyeSwgY2FsbGJhY2spID0+IHtcbiAgICBpZiAod2l0aE5hdGl2ZUJsb2IgJiYgZGF0YSBpbnN0YW5jZW9mIEJsb2IpIHtcbiAgICAgICAgaWYgKHN1cHBvcnRzQmluYXJ5KSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZW5jb2RlQmxvYkFzQmFzZTY0KGRhdGEsIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICh3aXRoTmF0aXZlQXJyYXlCdWZmZXIgJiZcbiAgICAgICAgKGRhdGEgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciB8fCBpc1ZpZXcoZGF0YSkpKSB7XG4gICAgICAgIGlmIChzdXBwb3J0c0JpbmFyeSkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGVuY29kZUJsb2JBc0Jhc2U2NChuZXcgQmxvYihbZGF0YV0pLCBjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gcGxhaW4gc3RyaW5nXG4gICAgcmV0dXJuIGNhbGxiYWNrKFBBQ0tFVF9UWVBFU1t0eXBlXSArIChkYXRhIHx8IFwiXCIpKTtcbn07XG5jb25zdCBlbmNvZGVCbG9iQXNCYXNlNjQgPSAoZGF0YSwgY2FsbGJhY2spID0+IHtcbiAgICBjb25zdCBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICBmaWxlUmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGZpbGVSZWFkZXIucmVzdWx0LnNwbGl0KFwiLFwiKVsxXTtcbiAgICAgICAgY2FsbGJhY2soXCJiXCIgKyAoY29udGVudCB8fCBcIlwiKSk7XG4gICAgfTtcbiAgICByZXR1cm4gZmlsZVJlYWRlci5yZWFkQXNEYXRhVVJMKGRhdGEpO1xufTtcbmZ1bmN0aW9uIHRvQXJyYXkoZGF0YSkge1xuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShkYXRhKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShkYXRhLmJ1ZmZlciwgZGF0YS5ieXRlT2Zmc2V0LCBkYXRhLmJ5dGVMZW5ndGgpO1xuICAgIH1cbn1cbmxldCBURVhUX0VOQ09ERVI7XG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlUGFja2V0VG9CaW5hcnkocGFja2V0LCBjYWxsYmFjaykge1xuICAgIGlmICh3aXRoTmF0aXZlQmxvYiAmJiBwYWNrZXQuZGF0YSBpbnN0YW5jZW9mIEJsb2IpIHtcbiAgICAgICAgcmV0dXJuIHBhY2tldC5kYXRhLmFycmF5QnVmZmVyKCkudGhlbih0b0FycmF5KS50aGVuKGNhbGxiYWNrKTtcbiAgICB9XG4gICAgZWxzZSBpZiAod2l0aE5hdGl2ZUFycmF5QnVmZmVyICYmXG4gICAgICAgIChwYWNrZXQuZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8IGlzVmlldyhwYWNrZXQuZGF0YSkpKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayh0b0FycmF5KHBhY2tldC5kYXRhKSk7XG4gICAgfVxuICAgIGVuY29kZVBhY2tldChwYWNrZXQsIGZhbHNlLCAoZW5jb2RlZCkgPT4ge1xuICAgICAgICBpZiAoIVRFWFRfRU5DT0RFUikge1xuICAgICAgICAgICAgVEVYVF9FTkNPREVSID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2soVEVYVF9FTkNPREVSLmVuY29kZShlbmNvZGVkKSk7XG4gICAgfSk7XG59XG5leHBvcnQgeyBlbmNvZGVQYWNrZXQgfTtcbiIsICIvLyBpbXBvcnRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9zb2NrZXRpby9iYXNlNjQtYXJyYXlidWZmZXJcbmNvbnN0IGNoYXJzID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nO1xuLy8gVXNlIGEgbG9va3VwIHRhYmxlIHRvIGZpbmQgdGhlIGluZGV4LlxuY29uc3QgbG9va3VwID0gdHlwZW9mIFVpbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gW10gOiBuZXcgVWludDhBcnJheSgyNTYpO1xuZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykge1xuICAgIGxvb2t1cFtjaGFycy5jaGFyQ29kZUF0KGkpXSA9IGk7XG59XG5leHBvcnQgY29uc3QgZW5jb2RlID0gKGFycmF5YnVmZmVyKSA9PiB7XG4gICAgbGV0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlidWZmZXIpLCBpLCBsZW4gPSBieXRlcy5sZW5ndGgsIGJhc2U2NCA9ICcnO1xuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMykge1xuICAgICAgICBiYXNlNjQgKz0gY2hhcnNbYnl0ZXNbaV0gPj4gMl07XG4gICAgICAgIGJhc2U2NCArPSBjaGFyc1soKGJ5dGVzW2ldICYgMykgPDwgNCkgfCAoYnl0ZXNbaSArIDFdID4+IDQpXTtcbiAgICAgICAgYmFzZTY0ICs9IGNoYXJzWygoYnl0ZXNbaSArIDFdICYgMTUpIDw8IDIpIHwgKGJ5dGVzW2kgKyAyXSA+PiA2KV07XG4gICAgICAgIGJhc2U2NCArPSBjaGFyc1tieXRlc1tpICsgMl0gJiA2M107XG4gICAgfVxuICAgIGlmIChsZW4gJSAzID09PSAyKSB7XG4gICAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDEpICsgJz0nO1xuICAgIH1cbiAgICBlbHNlIGlmIChsZW4gJSAzID09PSAxKSB7XG4gICAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDIpICsgJz09JztcbiAgICB9XG4gICAgcmV0dXJuIGJhc2U2NDtcbn07XG5leHBvcnQgY29uc3QgZGVjb2RlID0gKGJhc2U2NCkgPT4ge1xuICAgIGxldCBidWZmZXJMZW5ndGggPSBiYXNlNjQubGVuZ3RoICogMC43NSwgbGVuID0gYmFzZTY0Lmxlbmd0aCwgaSwgcCA9IDAsIGVuY29kZWQxLCBlbmNvZGVkMiwgZW5jb2RlZDMsIGVuY29kZWQ0O1xuICAgIGlmIChiYXNlNjRbYmFzZTY0Lmxlbmd0aCAtIDFdID09PSAnPScpIHtcbiAgICAgICAgYnVmZmVyTGVuZ3RoLS07XG4gICAgICAgIGlmIChiYXNlNjRbYmFzZTY0Lmxlbmd0aCAtIDJdID09PSAnPScpIHtcbiAgICAgICAgICAgIGJ1ZmZlckxlbmd0aC0tO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGFycmF5YnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGJ1ZmZlckxlbmd0aCksIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlidWZmZXIpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgICAgICBlbmNvZGVkMSA9IGxvb2t1cFtiYXNlNjQuY2hhckNvZGVBdChpKV07XG4gICAgICAgIGVuY29kZWQyID0gbG9va3VwW2Jhc2U2NC5jaGFyQ29kZUF0KGkgKyAxKV07XG4gICAgICAgIGVuY29kZWQzID0gbG9va3VwW2Jhc2U2NC5jaGFyQ29kZUF0KGkgKyAyKV07XG4gICAgICAgIGVuY29kZWQ0ID0gbG9va3VwW2Jhc2U2NC5jaGFyQ29kZUF0KGkgKyAzKV07XG4gICAgICAgIGJ5dGVzW3ArK10gPSAoZW5jb2RlZDEgPDwgMikgfCAoZW5jb2RlZDIgPj4gNCk7XG4gICAgICAgIGJ5dGVzW3ArK10gPSAoKGVuY29kZWQyICYgMTUpIDw8IDQpIHwgKGVuY29kZWQzID4+IDIpO1xuICAgICAgICBieXRlc1twKytdID0gKChlbmNvZGVkMyAmIDMpIDw8IDYpIHwgKGVuY29kZWQ0ICYgNjMpO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXlidWZmZXI7XG59O1xuIiwgImltcG9ydCB7IEVSUk9SX1BBQ0tFVCwgUEFDS0VUX1RZUEVTX1JFVkVSU0UsIH0gZnJvbSBcIi4vY29tbW9ucy5qc1wiO1xuaW1wb3J0IHsgZGVjb2RlIH0gZnJvbSBcIi4vY29udHJpYi9iYXNlNjQtYXJyYXlidWZmZXIuanNcIjtcbmNvbnN0IHdpdGhOYXRpdmVBcnJheUJ1ZmZlciA9IHR5cGVvZiBBcnJheUJ1ZmZlciA9PT0gXCJmdW5jdGlvblwiO1xuZXhwb3J0IGNvbnN0IGRlY29kZVBhY2tldCA9IChlbmNvZGVkUGFja2V0LCBiaW5hcnlUeXBlKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGVkUGFja2V0ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBcIm1lc3NhZ2VcIixcbiAgICAgICAgICAgIGRhdGE6IG1hcEJpbmFyeShlbmNvZGVkUGFja2V0LCBiaW5hcnlUeXBlKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgdHlwZSA9IGVuY29kZWRQYWNrZXQuY2hhckF0KDApO1xuICAgIGlmICh0eXBlID09PSBcImJcIikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogXCJtZXNzYWdlXCIsXG4gICAgICAgICAgICBkYXRhOiBkZWNvZGVCYXNlNjRQYWNrZXQoZW5jb2RlZFBhY2tldC5zdWJzdHJpbmcoMSksIGJpbmFyeVR5cGUpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBwYWNrZXRUeXBlID0gUEFDS0VUX1RZUEVTX1JFVkVSU0VbdHlwZV07XG4gICAgaWYgKCFwYWNrZXRUeXBlKSB7XG4gICAgICAgIHJldHVybiBFUlJPUl9QQUNLRVQ7XG4gICAgfVxuICAgIHJldHVybiBlbmNvZGVkUGFja2V0Lmxlbmd0aCA+IDFcbiAgICAgICAgPyB7XG4gICAgICAgICAgICB0eXBlOiBQQUNLRVRfVFlQRVNfUkVWRVJTRVt0eXBlXSxcbiAgICAgICAgICAgIGRhdGE6IGVuY29kZWRQYWNrZXQuc3Vic3RyaW5nKDEpLFxuICAgICAgICB9XG4gICAgICAgIDoge1xuICAgICAgICAgICAgdHlwZTogUEFDS0VUX1RZUEVTX1JFVkVSU0VbdHlwZV0sXG4gICAgICAgIH07XG59O1xuY29uc3QgZGVjb2RlQmFzZTY0UGFja2V0ID0gKGRhdGEsIGJpbmFyeVR5cGUpID0+IHtcbiAgICBpZiAod2l0aE5hdGl2ZUFycmF5QnVmZmVyKSB7XG4gICAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGUoZGF0YSk7XG4gICAgICAgIHJldHVybiBtYXBCaW5hcnkoZGVjb2RlZCwgYmluYXJ5VHlwZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4geyBiYXNlNjQ6IHRydWUsIGRhdGEgfTsgLy8gZmFsbGJhY2sgZm9yIG9sZCBicm93c2Vyc1xuICAgIH1cbn07XG5jb25zdCBtYXBCaW5hcnkgPSAoZGF0YSwgYmluYXJ5VHlwZSkgPT4ge1xuICAgIHN3aXRjaCAoYmluYXJ5VHlwZSkge1xuICAgICAgICBjYXNlIFwiYmxvYlwiOlxuICAgICAgICAgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBCbG9iKSB7XG4gICAgICAgICAgICAgICAgLy8gZnJvbSBXZWJTb2NrZXQgKyBiaW5hcnlUeXBlIFwiYmxvYlwiXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBmcm9tIEhUVFAgbG9uZy1wb2xsaW5nIG9yIFdlYlRyYW5zcG9ydFxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQmxvYihbZGF0YV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICBjYXNlIFwiYXJyYXlidWZmZXJcIjpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgICAgICAvLyBmcm9tIEhUVFAgbG9uZy1wb2xsaW5nIChiYXNlNjQpIG9yIFdlYlNvY2tldCArIGJpbmFyeVR5cGUgXCJhcnJheWJ1ZmZlclwiXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBmcm9tIFdlYlRyYW5zcG9ydCAoVWludDhBcnJheSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5idWZmZXI7XG4gICAgICAgICAgICB9XG4gICAgfVxufTtcbiIsICJpbXBvcnQgeyBlbmNvZGVQYWNrZXQsIGVuY29kZVBhY2tldFRvQmluYXJ5IH0gZnJvbSBcIi4vZW5jb2RlUGFja2V0LmpzXCI7XG5pbXBvcnQgeyBkZWNvZGVQYWNrZXQgfSBmcm9tIFwiLi9kZWNvZGVQYWNrZXQuanNcIjtcbmltcG9ydCB7IEVSUk9SX1BBQ0tFVCwgfSBmcm9tIFwiLi9jb21tb25zLmpzXCI7XG5jb25zdCBTRVBBUkFUT1IgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDMwKTsgLy8gc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0RlbGltaXRlciNBU0NJSV9kZWxpbWl0ZWRfdGV4dFxuY29uc3QgZW5jb2RlUGF5bG9hZCA9IChwYWNrZXRzLCBjYWxsYmFjaykgPT4ge1xuICAgIC8vIHNvbWUgcGFja2V0cyBtYXkgYmUgYWRkZWQgdG8gdGhlIGFycmF5IHdoaWxlIGVuY29kaW5nLCBzbyB0aGUgaW5pdGlhbCBsZW5ndGggbXVzdCBiZSBzYXZlZFxuICAgIGNvbnN0IGxlbmd0aCA9IHBhY2tldHMubGVuZ3RoO1xuICAgIGNvbnN0IGVuY29kZWRQYWNrZXRzID0gbmV3IEFycmF5KGxlbmd0aCk7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBwYWNrZXRzLmZvckVhY2goKHBhY2tldCwgaSkgPT4ge1xuICAgICAgICAvLyBmb3JjZSBiYXNlNjQgZW5jb2RpbmcgZm9yIGJpbmFyeSBwYWNrZXRzXG4gICAgICAgIGVuY29kZVBhY2tldChwYWNrZXQsIGZhbHNlLCAoZW5jb2RlZFBhY2tldCkgPT4ge1xuICAgICAgICAgICAgZW5jb2RlZFBhY2tldHNbaV0gPSBlbmNvZGVkUGFja2V0O1xuICAgICAgICAgICAgaWYgKCsrY291bnQgPT09IGxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVuY29kZWRQYWNrZXRzLmpvaW4oU0VQQVJBVE9SKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcbmNvbnN0IGRlY29kZVBheWxvYWQgPSAoZW5jb2RlZFBheWxvYWQsIGJpbmFyeVR5cGUpID0+IHtcbiAgICBjb25zdCBlbmNvZGVkUGFja2V0cyA9IGVuY29kZWRQYXlsb2FkLnNwbGl0KFNFUEFSQVRPUik7XG4gICAgY29uc3QgcGFja2V0cyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW5jb2RlZFBhY2tldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgZGVjb2RlZFBhY2tldCA9IGRlY29kZVBhY2tldChlbmNvZGVkUGFja2V0c1tpXSwgYmluYXJ5VHlwZSk7XG4gICAgICAgIHBhY2tldHMucHVzaChkZWNvZGVkUGFja2V0KTtcbiAgICAgICAgaWYgKGRlY29kZWRQYWNrZXQudHlwZSA9PT0gXCJlcnJvclwiKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGFja2V0cztcbn07XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGFja2V0RW5jb2RlclN0cmVhbSgpIHtcbiAgICByZXR1cm4gbmV3IFRyYW5zZm9ybVN0cmVhbSh7XG4gICAgICAgIHRyYW5zZm9ybShwYWNrZXQsIGNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgIGVuY29kZVBhY2tldFRvQmluYXJ5KHBhY2tldCwgKGVuY29kZWRQYWNrZXQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXlsb2FkTGVuZ3RoID0gZW5jb2RlZFBhY2tldC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgbGV0IGhlYWRlcjtcbiAgICAgICAgICAgICAgICAvLyBpbnNwaXJlZCBieSB0aGUgV2ViU29ja2V0IGZvcm1hdDogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dlYlNvY2tldHNfQVBJL1dyaXRpbmdfV2ViU29ja2V0X3NlcnZlcnMjZGVjb2RpbmdfcGF5bG9hZF9sZW5ndGhcbiAgICAgICAgICAgICAgICBpZiAocGF5bG9hZExlbmd0aCA8IDEyNikge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBuZXcgVWludDhBcnJheSgxKTtcbiAgICAgICAgICAgICAgICAgICAgbmV3IERhdGFWaWV3KGhlYWRlci5idWZmZXIpLnNldFVpbnQ4KDAsIHBheWxvYWRMZW5ndGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXlsb2FkTGVuZ3RoIDwgNjU1MzYpIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gbmV3IFVpbnQ4QXJyYXkoMyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcoaGVhZGVyLmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIHZpZXcuc2V0VWludDgoMCwgMTI2KTtcbiAgICAgICAgICAgICAgICAgICAgdmlldy5zZXRVaW50MTYoMSwgcGF5bG9hZExlbmd0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBuZXcgVWludDhBcnJheSg5KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmlldyA9IG5ldyBEYXRhVmlldyhoZWFkZXIuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgdmlldy5zZXRVaW50OCgwLCAxMjcpO1xuICAgICAgICAgICAgICAgICAgICB2aWV3LnNldEJpZ1VpbnQ2NCgxLCBCaWdJbnQocGF5bG9hZExlbmd0aCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBmaXJzdCBiaXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHBheWxvYWQgaXMgcGxhaW4gdGV4dCAoMCkgb3IgYmluYXJ5ICgxKVxuICAgICAgICAgICAgICAgIGlmIChwYWNrZXQuZGF0YSAmJiB0eXBlb2YgcGFja2V0LmRhdGEgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyWzBdIHw9IDB4ODA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShoZWFkZXIpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShlbmNvZGVkUGFja2V0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgIH0pO1xufVxubGV0IFRFWFRfREVDT0RFUjtcbmZ1bmN0aW9uIHRvdGFsTGVuZ3RoKGNodW5rcykge1xuICAgIHJldHVybiBjaHVua3MucmVkdWNlKChhY2MsIGNodW5rKSA9PiBhY2MgKyBjaHVuay5sZW5ndGgsIDApO1xufVxuZnVuY3Rpb24gY29uY2F0Q2h1bmtzKGNodW5rcywgc2l6ZSkge1xuICAgIGlmIChjaHVua3NbMF0ubGVuZ3RoID09PSBzaXplKSB7XG4gICAgICAgIHJldHVybiBjaHVua3Muc2hpZnQoKTtcbiAgICB9XG4gICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgbGV0IGogPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgIGJ1ZmZlcltpXSA9IGNodW5rc1swXVtqKytdO1xuICAgICAgICBpZiAoaiA9PT0gY2h1bmtzWzBdLmxlbmd0aCkge1xuICAgICAgICAgICAgY2h1bmtzLnNoaWZ0KCk7XG4gICAgICAgICAgICBqID0gMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2h1bmtzLmxlbmd0aCAmJiBqIDwgY2h1bmtzWzBdLmxlbmd0aCkge1xuICAgICAgICBjaHVua3NbMF0gPSBjaHVua3NbMF0uc2xpY2Uoaik7XG4gICAgfVxuICAgIHJldHVybiBidWZmZXI7XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGFja2V0RGVjb2RlclN0cmVhbShtYXhQYXlsb2FkLCBiaW5hcnlUeXBlKSB7XG4gICAgaWYgKCFURVhUX0RFQ09ERVIpIHtcbiAgICAgICAgVEVYVF9ERUNPREVSID0gbmV3IFRleHREZWNvZGVyKCk7XG4gICAgfVxuICAgIGNvbnN0IGNodW5rcyA9IFtdO1xuICAgIGxldCBzdGF0ZSA9IDAgLyogU3RhdGUuUkVBRF9IRUFERVIgKi87XG4gICAgbGV0IGV4cGVjdGVkTGVuZ3RoID0gLTE7XG4gICAgbGV0IGlzQmluYXJ5ID0gZmFsc2U7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2Zvcm1TdHJlYW0oe1xuICAgICAgICB0cmFuc2Zvcm0oY2h1bmssIGNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgIGNodW5rcy5wdXNoKGNodW5rKTtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlID09PSAwIC8qIFN0YXRlLlJFQURfSEVBREVSICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b3RhbExlbmd0aChjaHVua3MpIDwgMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gY29uY2F0Q2h1bmtzKGNodW5rcywgMSk7XG4gICAgICAgICAgICAgICAgICAgIGlzQmluYXJ5ID0gKGhlYWRlclswXSAmIDB4ODApID09PSAweDgwO1xuICAgICAgICAgICAgICAgICAgICBleHBlY3RlZExlbmd0aCA9IGhlYWRlclswXSAmIDB4N2Y7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleHBlY3RlZExlbmd0aCA8IDEyNikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAzIC8qIFN0YXRlLlJFQURfUEFZTE9BRCAqLztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHBlY3RlZExlbmd0aCA9PT0gMTI2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDEgLyogU3RhdGUuUkVBRF9FWFRFTkRFRF9MRU5HVEhfMTYgKi87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDIgLyogU3RhdGUuUkVBRF9FWFRFTkRFRF9MRU5HVEhfNjQgKi87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUgPT09IDEgLyogU3RhdGUuUkVBRF9FWFRFTkRFRF9MRU5HVEhfMTYgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvdGFsTGVuZ3RoKGNodW5rcykgPCAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJBcnJheSA9IGNvbmNhdENodW5rcyhjaHVua3MsIDIpO1xuICAgICAgICAgICAgICAgICAgICBleHBlY3RlZExlbmd0aCA9IG5ldyBEYXRhVmlldyhoZWFkZXJBcnJheS5idWZmZXIsIGhlYWRlckFycmF5LmJ5dGVPZmZzZXQsIGhlYWRlckFycmF5Lmxlbmd0aCkuZ2V0VWludDE2KDApO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDMgLyogU3RhdGUuUkVBRF9QQVlMT0FEICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGF0ZSA9PT0gMiAvKiBTdGF0ZS5SRUFEX0VYVEVOREVEX0xFTkdUSF82NCAqLykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodG90YWxMZW5ndGgoY2h1bmtzKSA8IDgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlckFycmF5ID0gY29uY2F0Q2h1bmtzKGNodW5rcywgOCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcoaGVhZGVyQXJyYXkuYnVmZmVyLCBoZWFkZXJBcnJheS5ieXRlT2Zmc2V0LCBoZWFkZXJBcnJheS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuID0gdmlldy5nZXRVaW50MzIoMCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuID4gTWF0aC5wb3coMiwgNTMgLSAzMikgLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbWF4aW11bSBzYWZlIGludGVnZXIgaW4gSmF2YVNjcmlwdCBpcyAyXjUzIC0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKEVSUk9SX1BBQ0tFVCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBleHBlY3RlZExlbmd0aCA9IG4gKiBNYXRoLnBvdygyLCAzMikgKyB2aWV3LmdldFVpbnQzMig0KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAzIC8qIFN0YXRlLlJFQURfUEFZTE9BRCAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b3RhbExlbmd0aChjaHVua3MpIDwgZXhwZWN0ZWRMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBjb25jYXRDaHVua3MoY2h1bmtzLCBleHBlY3RlZExlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShkZWNvZGVQYWNrZXQoaXNCaW5hcnkgPyBkYXRhIDogVEVYVF9ERUNPREVSLmRlY29kZShkYXRhKSwgYmluYXJ5VHlwZSkpO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDAgLyogU3RhdGUuUkVBRF9IRUFERVIgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChleHBlY3RlZExlbmd0aCA9PT0gMCB8fCBleHBlY3RlZExlbmd0aCA+IG1heFBheWxvYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKEVSUk9SX1BBQ0tFVCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBwcm90b2NvbCA9IDQ7XG5leHBvcnQgeyBlbmNvZGVQYWNrZXQsIGVuY29kZVBheWxvYWQsIGRlY29kZVBhY2tldCwgZGVjb2RlUGF5bG9hZCwgfTtcbiIsICIvKipcbiAqIEluaXRpYWxpemUgYSBuZXcgYEVtaXR0ZXJgLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIEVtaXR0ZXIob2JqKSB7XG4gIGlmIChvYmopIHJldHVybiBtaXhpbihvYmopO1xufVxuXG4vKipcbiAqIE1peGluIHRoZSBlbWl0dGVyIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHJldHVybiB7T2JqZWN0fVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbWl4aW4ob2JqKSB7XG4gIGZvciAodmFyIGtleSBpbiBFbWl0dGVyLnByb3RvdHlwZSkge1xuICAgIG9ialtrZXldID0gRW1pdHRlci5wcm90b3R5cGVba2V5XTtcbiAgfVxuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIExpc3RlbiBvbiB0aGUgZ2l2ZW4gYGV2ZW50YCB3aXRoIGBmbmAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHJldHVybiB7RW1pdHRlcn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuRW1pdHRlci5wcm90b3R5cGUub24gPVxuRW1pdHRlci5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2ZW50LCBmbil7XG4gIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcyB8fCB7fTtcbiAgKHRoaXMuX2NhbGxiYWNrc1snJCcgKyBldmVudF0gPSB0aGlzLl9jYWxsYmFja3NbJyQnICsgZXZlbnRdIHx8IFtdKVxuICAgIC5wdXNoKGZuKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEFkZHMgYW4gYGV2ZW50YCBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgaW52b2tlZCBhIHNpbmdsZVxuICogdGltZSB0aGVuIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtFbWl0dGVyfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5FbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24oZXZlbnQsIGZuKXtcbiAgZnVuY3Rpb24gb24oKSB7XG4gICAgdGhpcy5vZmYoZXZlbnQsIG9uKTtcbiAgICBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgb24uZm4gPSBmbjtcbiAgdGhpcy5vbihldmVudCwgb24pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBnaXZlbiBjYWxsYmFjayBmb3IgYGV2ZW50YCBvciBhbGxcbiAqIHJlZ2lzdGVyZWQgY2FsbGJhY2tzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbkVtaXR0ZXIucHJvdG90eXBlLm9mZiA9XG5FbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9XG5FbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPVxuRW1pdHRlci5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2ZW50LCBmbil7XG4gIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcyB8fCB7fTtcblxuICAvLyBhbGxcbiAgaWYgKDAgPT0gYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIHRoaXMuX2NhbGxiYWNrcyA9IHt9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gc3BlY2lmaWMgZXZlbnRcbiAgdmFyIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrc1snJCcgKyBldmVudF07XG4gIGlmICghY2FsbGJhY2tzKSByZXR1cm4gdGhpcztcblxuICAvLyByZW1vdmUgYWxsIGhhbmRsZXJzXG4gIGlmICgxID09IGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICBkZWxldGUgdGhpcy5fY2FsbGJhY2tzWyckJyArIGV2ZW50XTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHJlbW92ZSBzcGVjaWZpYyBoYW5kbGVyXG4gIHZhciBjYjtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICBjYiA9IGNhbGxiYWNrc1tpXTtcbiAgICBpZiAoY2IgPT09IGZuIHx8IGNiLmZuID09PSBmbikge1xuICAgICAgY2FsbGJhY2tzLnNwbGljZShpLCAxKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlbW92ZSBldmVudCBzcGVjaWZpYyBhcnJheXMgZm9yIGV2ZW50IHR5cGVzIHRoYXQgbm9cbiAgLy8gb25lIGlzIHN1YnNjcmliZWQgZm9yIHRvIGF2b2lkIG1lbW9yeSBsZWFrLlxuICBpZiAoY2FsbGJhY2tzLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSB0aGlzLl9jYWxsYmFja3NbJyQnICsgZXZlbnRdO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEVtaXQgYGV2ZW50YCB3aXRoIHRoZSBnaXZlbiBhcmdzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHBhcmFtIHtNaXhlZH0gLi4uXG4gKiBAcmV0dXJuIHtFbWl0dGVyfVxuICovXG5cbkVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbihldmVudCl7XG4gIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcyB8fCB7fTtcblxuICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSlcbiAgICAsIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrc1snJCcgKyBldmVudF07XG5cbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgfVxuXG4gIGlmIChjYWxsYmFja3MpIHtcbiAgICBjYWxsYmFja3MgPSBjYWxsYmFja3Muc2xpY2UoMCk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgICAgY2FsbGJhY2tzW2ldLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gYWxpYXMgdXNlZCBmb3IgcmVzZXJ2ZWQgZXZlbnRzIChwcm90ZWN0ZWQgbWV0aG9kKVxuRW1pdHRlci5wcm90b3R5cGUuZW1pdFJlc2VydmVkID0gRW1pdHRlci5wcm90b3R5cGUuZW1pdDtcblxuLyoqXG4gKiBSZXR1cm4gYXJyYXkgb2YgY2FsbGJhY2tzIGZvciBgZXZlbnRgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbkVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uKGV2ZW50KXtcbiAgdGhpcy5fY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzIHx8IHt9O1xuICByZXR1cm4gdGhpcy5fY2FsbGJhY2tzWyckJyArIGV2ZW50XSB8fCBbXTtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhpcyBlbWl0dGVyIGhhcyBgZXZlbnRgIGhhbmRsZXJzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuRW1pdHRlci5wcm90b3R5cGUuaGFzTGlzdGVuZXJzID0gZnVuY3Rpb24oZXZlbnQpe1xuICByZXR1cm4gISEgdGhpcy5saXN0ZW5lcnMoZXZlbnQpLmxlbmd0aDtcbn07XG4iLCAiZXhwb3J0IGNvbnN0IG5leHRUaWNrID0gKCgpID0+IHtcbiAgICBjb25zdCBpc1Byb21pc2VBdmFpbGFibGUgPSB0eXBlb2YgUHJvbWlzZSA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBQcm9taXNlLnJlc29sdmUgPT09IFwiZnVuY3Rpb25cIjtcbiAgICBpZiAoaXNQcm9taXNlQXZhaWxhYmxlKSB7XG4gICAgICAgIHJldHVybiAoY2IpID0+IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oY2IpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIChjYiwgc2V0VGltZW91dEZuKSA9PiBzZXRUaW1lb3V0Rm4oY2IsIDApO1xuICAgIH1cbn0pKCk7XG5leHBvcnQgY29uc3QgZ2xvYmFsVGhpc1NoaW0gPSAoKCkgPT4ge1xuICAgIGlmICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICByZXR1cm4gd2luZG93O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcbiAgICB9XG59KSgpO1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRCaW5hcnlUeXBlID0gXCJhcnJheWJ1ZmZlclwiO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvb2tpZUphcigpIHsgfVxuIiwgImltcG9ydCB7IGdsb2JhbFRoaXNTaGltIGFzIGdsb2JhbFRoaXMgfSBmcm9tIFwiLi9nbG9iYWxzLm5vZGUuanNcIjtcbmV4cG9ydCBmdW5jdGlvbiBwaWNrKG9iaiwgLi4uYXR0cikge1xuICAgIHJldHVybiBhdHRyLnJlZHVjZSgoYWNjLCBrKSA9PiB7XG4gICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaykpIHtcbiAgICAgICAgICAgIGFjY1trXSA9IG9ialtrXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcbn1cbi8vIEtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIHJlYWwgdGltZW91dCBmdW5jdGlvbnMgc28gdGhleSBjYW4gYmUgdXNlZCB3aGVuIG92ZXJyaWRkZW5cbmNvbnN0IE5BVElWRV9TRVRfVElNRU9VVCA9IGdsb2JhbFRoaXMuc2V0VGltZW91dDtcbmNvbnN0IE5BVElWRV9DTEVBUl9USU1FT1VUID0gZ2xvYmFsVGhpcy5jbGVhclRpbWVvdXQ7XG5leHBvcnQgZnVuY3Rpb24gaW5zdGFsbFRpbWVyRnVuY3Rpb25zKG9iaiwgb3B0cykge1xuICAgIGlmIChvcHRzLnVzZU5hdGl2ZVRpbWVycykge1xuICAgICAgICBvYmouc2V0VGltZW91dEZuID0gTkFUSVZFX1NFVF9USU1FT1VULmJpbmQoZ2xvYmFsVGhpcyk7XG4gICAgICAgIG9iai5jbGVhclRpbWVvdXRGbiA9IE5BVElWRV9DTEVBUl9USU1FT1VULmJpbmQoZ2xvYmFsVGhpcyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBvYmouc2V0VGltZW91dEZuID0gZ2xvYmFsVGhpcy5zZXRUaW1lb3V0LmJpbmQoZ2xvYmFsVGhpcyk7XG4gICAgICAgIG9iai5jbGVhclRpbWVvdXRGbiA9IGdsb2JhbFRoaXMuY2xlYXJUaW1lb3V0LmJpbmQoZ2xvYmFsVGhpcyk7XG4gICAgfVxufVxuLy8gYmFzZTY0IGVuY29kZWQgYnVmZmVycyBhcmUgYWJvdXQgMzMlIGJpZ2dlciAoaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmFzZTY0KVxuY29uc3QgQkFTRTY0X09WRVJIRUFEID0gMS4zMztcbi8vIHdlIGNvdWxkIGFsc28gaGF2ZSB1c2VkIGBuZXcgQmxvYihbb2JqXSkuc2l6ZWAsIGJ1dCBpdCBpc24ndCBzdXBwb3J0ZWQgaW4gSUU5XG5leHBvcnQgZnVuY3Rpb24gYnl0ZUxlbmd0aChvYmopIHtcbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4gdXRmOExlbmd0aChvYmopO1xuICAgIH1cbiAgICAvLyBhcnJheWJ1ZmZlciBvciBibG9iXG4gICAgcmV0dXJuIE1hdGguY2VpbCgob2JqLmJ5dGVMZW5ndGggfHwgb2JqLnNpemUpICogQkFTRTY0X09WRVJIRUFEKTtcbn1cbmZ1bmN0aW9uIHV0ZjhMZW5ndGgoc3RyKSB7XG4gICAgbGV0IGMgPSAwLCBsZW5ndGggPSAwO1xuICAgIGZvciAobGV0IGkgPSAwLCBsID0gc3RyLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIGlmIChjIDwgMHg4MCkge1xuICAgICAgICAgICAgbGVuZ3RoICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYyA8IDB4ODAwKSB7XG4gICAgICAgICAgICBsZW5ndGggKz0gMjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjIDwgMHhkODAwIHx8IGMgPj0gMHhlMDAwKSB7XG4gICAgICAgICAgICBsZW5ndGggKz0gMztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIGxlbmd0aCArPSA0O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsZW5ndGg7XG59XG4vKipcbiAqIEdlbmVyYXRlcyBhIHJhbmRvbSA4LWNoYXJhY3RlcnMgc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmFuZG9tU3RyaW5nKCkge1xuICAgIHJldHVybiAoRGF0ZS5ub3coKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDMpICtcbiAgICAgICAgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDUpKTtcbn1cbiIsICIvLyBpbXBvcnRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9nYWxrbi9xdWVyeXN0cmluZ1xuLyoqXG4gKiBDb21waWxlcyBhIHF1ZXJ5c3RyaW5nXG4gKiBSZXR1cm5zIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0XG4gKlxuICogQHBhcmFtIHtPYmplY3R9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZShvYmopIHtcbiAgICBsZXQgc3RyID0gJyc7XG4gICAgZm9yIChsZXQgaSBpbiBvYmopIHtcbiAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgICAgaWYgKHN0ci5sZW5ndGgpXG4gICAgICAgICAgICAgICAgc3RyICs9ICcmJztcbiAgICAgICAgICAgIHN0ciArPSBlbmNvZGVVUklDb21wb25lbnQoaSkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQob2JqW2ldKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RyO1xufVxuLyoqXG4gKiBQYXJzZXMgYSBzaW1wbGUgcXVlcnlzdHJpbmcgaW50byBhbiBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlKHFzKSB7XG4gICAgbGV0IHFyeSA9IHt9O1xuICAgIGxldCBwYWlycyA9IHFzLnNwbGl0KCcmJyk7XG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBwYWlycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgbGV0IHBhaXIgPSBwYWlyc1tpXS5zcGxpdCgnPScpO1xuICAgICAgICBxcnlbZGVjb2RlVVJJQ29tcG9uZW50KHBhaXJbMF0pXSA9IGRlY29kZVVSSUNvbXBvbmVudChwYWlyWzFdKTtcbiAgICB9XG4gICAgcmV0dXJuIHFyeTtcbn1cbiIsICJpbXBvcnQgeyBkZWNvZGVQYWNrZXQgfSBmcm9tIFwiZW5naW5lLmlvLXBhcnNlclwiO1xuaW1wb3J0IHsgRW1pdHRlciB9IGZyb20gXCJAc29ja2V0LmlvL2NvbXBvbmVudC1lbWl0dGVyXCI7XG5pbXBvcnQgeyBpbnN0YWxsVGltZXJGdW5jdGlvbnMgfSBmcm9tIFwiLi91dGlsLmpzXCI7XG5pbXBvcnQgeyBlbmNvZGUgfSBmcm9tIFwiLi9jb250cmliL3BhcnNlcXMuanNcIjtcbmV4cG9ydCBjbGFzcyBUcmFuc3BvcnRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihyZWFzb24sIGRlc2NyaXB0aW9uLCBjb250ZXh0KSB7XG4gICAgICAgIHN1cGVyKHJlYXNvbik7XG4gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy50eXBlID0gXCJUcmFuc3BvcnRFcnJvclwiO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBUcmFuc3BvcnQgZXh0ZW5kcyBFbWl0dGVyIHtcbiAgICAvKipcbiAgICAgKiBUcmFuc3BvcnQgYWJzdHJhY3QgY29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG4gICAgICAgIGluc3RhbGxUaW1lckZ1bmN0aW9ucyh0aGlzLCBvcHRzKTtcbiAgICAgICAgdGhpcy5vcHRzID0gb3B0cztcbiAgICAgICAgdGhpcy5xdWVyeSA9IG9wdHMucXVlcnk7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gb3B0cy5zb2NrZXQ7XG4gICAgICAgIHRoaXMuc3VwcG9ydHNCaW5hcnkgPSAhb3B0cy5mb3JjZUJhc2U2NDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW1pdHMgYW4gZXJyb3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVhc29uXG4gICAgICogQHBhcmFtIGRlc2NyaXB0aW9uXG4gICAgICogQHBhcmFtIGNvbnRleHQgLSB0aGUgZXJyb3IgY29udGV4dFxuICAgICAqIEByZXR1cm4ge1RyYW5zcG9ydH0gZm9yIGNoYWluaW5nXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIG9uRXJyb3IocmVhc29uLCBkZXNjcmlwdGlvbiwgY29udGV4dCkge1xuICAgICAgICBzdXBlci5lbWl0UmVzZXJ2ZWQoXCJlcnJvclwiLCBuZXcgVHJhbnNwb3J0RXJyb3IocmVhc29uLCBkZXNjcmlwdGlvbiwgY29udGV4dCkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogT3BlbnMgdGhlIHRyYW5zcG9ydC5cbiAgICAgKi9cbiAgICBvcGVuKCkge1xuICAgICAgICB0aGlzLnJlYWR5U3RhdGUgPSBcIm9wZW5pbmdcIjtcbiAgICAgICAgdGhpcy5kb09wZW4oKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb3NlcyB0aGUgdHJhbnNwb3J0LlxuICAgICAqL1xuICAgIGNsb3NlKCkge1xuICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09PSBcIm9wZW5pbmdcIiB8fCB0aGlzLnJlYWR5U3RhdGUgPT09IFwib3BlblwiKSB7XG4gICAgICAgICAgICB0aGlzLmRvQ2xvc2UoKTtcbiAgICAgICAgICAgIHRoaXMub25DbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kcyBtdWx0aXBsZSBwYWNrZXRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFja2V0c1xuICAgICAqL1xuICAgIHNlbmQocGFja2V0cykge1xuICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09PSBcIm9wZW5cIikge1xuICAgICAgICAgICAgdGhpcy53cml0ZShwYWNrZXRzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHRoaXMgbWlnaHQgaGFwcGVuIGlmIHRoZSB0cmFuc3BvcnQgd2FzIHNpbGVudGx5IGNsb3NlZCBpbiB0aGUgYmVmb3JldW5sb2FkIGV2ZW50IGhhbmRsZXJcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiBvcGVuXG4gICAgICpcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgb25PcGVuKCkge1xuICAgICAgICB0aGlzLnJlYWR5U3RhdGUgPSBcIm9wZW5cIjtcbiAgICAgICAgdGhpcy53cml0YWJsZSA9IHRydWU7XG4gICAgICAgIHN1cGVyLmVtaXRSZXNlcnZlZChcIm9wZW5cIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aXRoIGRhdGEuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZGF0YVxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBvbkRhdGEoZGF0YSkge1xuICAgICAgICBjb25zdCBwYWNrZXQgPSBkZWNvZGVQYWNrZXQoZGF0YSwgdGhpcy5zb2NrZXQuYmluYXJ5VHlwZSk7XG4gICAgICAgIHRoaXMub25QYWNrZXQocGFja2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdpdGggYSBkZWNvZGVkIHBhY2tldC5cbiAgICAgKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBvblBhY2tldChwYWNrZXQpIHtcbiAgICAgICAgc3VwZXIuZW1pdFJlc2VydmVkKFwicGFja2V0XCIsIHBhY2tldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIGNsb3NlLlxuICAgICAqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIG9uQ2xvc2UoZGV0YWlscykge1xuICAgICAgICB0aGlzLnJlYWR5U3RhdGUgPSBcImNsb3NlZFwiO1xuICAgICAgICBzdXBlci5lbWl0UmVzZXJ2ZWQoXCJjbG9zZVwiLCBkZXRhaWxzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGF1c2VzIHRoZSB0cmFuc3BvcnQsIGluIG9yZGVyIG5vdCB0byBsb3NlIHBhY2tldHMgZHVyaW5nIGFuIHVwZ3JhZGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb25QYXVzZVxuICAgICAqL1xuICAgIHBhdXNlKG9uUGF1c2UpIHsgfVxuICAgIGNyZWF0ZVVyaShzY2hlbWEsIHF1ZXJ5ID0ge30pIHtcbiAgICAgICAgcmV0dXJuIChzY2hlbWEgK1xuICAgICAgICAgICAgXCI6Ly9cIiArXG4gICAgICAgICAgICB0aGlzLl9ob3N0bmFtZSgpICtcbiAgICAgICAgICAgIHRoaXMuX3BvcnQoKSArXG4gICAgICAgICAgICB0aGlzLm9wdHMucGF0aCArXG4gICAgICAgICAgICB0aGlzLl9xdWVyeShxdWVyeSkpO1xuICAgIH1cbiAgICBfaG9zdG5hbWUoKSB7XG4gICAgICAgIGNvbnN0IGhvc3RuYW1lID0gdGhpcy5vcHRzLmhvc3RuYW1lO1xuICAgICAgICByZXR1cm4gaG9zdG5hbWUuaW5kZXhPZihcIjpcIikgPT09IC0xID8gaG9zdG5hbWUgOiBcIltcIiArIGhvc3RuYW1lICsgXCJdXCI7XG4gICAgfVxuICAgIF9wb3J0KCkge1xuICAgICAgICBpZiAodGhpcy5vcHRzLnBvcnQgJiZcbiAgICAgICAgICAgICgodGhpcy5vcHRzLnNlY3VyZSAmJiBOdW1iZXIodGhpcy5vcHRzLnBvcnQgIT09IDQ0MykpIHx8XG4gICAgICAgICAgICAgICAgKCF0aGlzLm9wdHMuc2VjdXJlICYmIE51bWJlcih0aGlzLm9wdHMucG9ydCkgIT09IDgwKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBcIjpcIiArIHRoaXMub3B0cy5wb3J0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX3F1ZXJ5KHF1ZXJ5KSB7XG4gICAgICAgIGNvbnN0IGVuY29kZWRRdWVyeSA9IGVuY29kZShxdWVyeSk7XG4gICAgICAgIHJldHVybiBlbmNvZGVkUXVlcnkubGVuZ3RoID8gXCI/XCIgKyBlbmNvZGVkUXVlcnkgOiBcIlwiO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBUcmFuc3BvcnQgfSBmcm9tIFwiLi4vdHJhbnNwb3J0LmpzXCI7XG5pbXBvcnQgeyByYW5kb21TdHJpbmcgfSBmcm9tIFwiLi4vdXRpbC5qc1wiO1xuaW1wb3J0IHsgZW5jb2RlUGF5bG9hZCwgZGVjb2RlUGF5bG9hZCB9IGZyb20gXCJlbmdpbmUuaW8tcGFyc2VyXCI7XG5leHBvcnQgY2xhc3MgUG9sbGluZyBleHRlbmRzIFRyYW5zcG9ydCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuX3BvbGxpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgZ2V0IG5hbWUoKSB7XG4gICAgICAgIHJldHVybiBcInBvbGxpbmdcIjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogT3BlbnMgdGhlIHNvY2tldCAodHJpZ2dlcnMgcG9sbGluZykuIFdlIHdyaXRlIGEgUElORyBtZXNzYWdlIHRvIGRldGVybWluZVxuICAgICAqIHdoZW4gdGhlIHRyYW5zcG9ydCBpcyBvcGVuLlxuICAgICAqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIGRvT3BlbigpIHtcbiAgICAgICAgdGhpcy5fcG9sbCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXVzZXMgcG9sbGluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uUGF1c2UgLSBjYWxsYmFjayB1cG9uIGJ1ZmZlcnMgYXJlIGZsdXNoZWQgYW5kIHRyYW5zcG9ydCBpcyBwYXVzZWRcbiAgICAgKiBAcGFja2FnZVxuICAgICAqL1xuICAgIHBhdXNlKG9uUGF1c2UpIHtcbiAgICAgICAgdGhpcy5yZWFkeVN0YXRlID0gXCJwYXVzaW5nXCI7XG4gICAgICAgIGNvbnN0IHBhdXNlID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWFkeVN0YXRlID0gXCJwYXVzZWRcIjtcbiAgICAgICAgICAgIG9uUGF1c2UoKTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMuX3BvbGxpbmcgfHwgIXRoaXMud3JpdGFibGUpIHtcbiAgICAgICAgICAgIGxldCB0b3RhbCA9IDA7XG4gICAgICAgICAgICBpZiAodGhpcy5fcG9sbGluZykge1xuICAgICAgICAgICAgICAgIHRvdGFsKys7XG4gICAgICAgICAgICAgICAgdGhpcy5vbmNlKFwicG9sbENvbXBsZXRlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgLS10b3RhbCB8fCBwYXVzZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLndyaXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgdG90YWwrKztcbiAgICAgICAgICAgICAgICB0aGlzLm9uY2UoXCJkcmFpblwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIC0tdG90YWwgfHwgcGF1c2UoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBhdXNlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RhcnRzIHBvbGxpbmcgY3ljbGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9wb2xsKCkge1xuICAgICAgICB0aGlzLl9wb2xsaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kb1BvbGwoKTtcbiAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJwb2xsXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPdmVybG9hZHMgb25EYXRhIHRvIGRldGVjdCBwYXlsb2Fkcy5cbiAgICAgKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBvbkRhdGEoZGF0YSkge1xuICAgICAgICBjb25zdCBjYWxsYmFjayA9IChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIC8vIGlmIGl0cyB0aGUgZmlyc3QgbWVzc2FnZSB3ZSBjb25zaWRlciB0aGUgdHJhbnNwb3J0IG9wZW5cbiAgICAgICAgICAgIGlmIChcIm9wZW5pbmdcIiA9PT0gdGhpcy5yZWFkeVN0YXRlICYmIHBhY2tldC50eXBlID09PSBcIm9wZW5cIikge1xuICAgICAgICAgICAgICAgIHRoaXMub25PcGVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpZiBpdHMgYSBjbG9zZSBwYWNrZXQsIHdlIGNsb3NlIHRoZSBvbmdvaW5nIHJlcXVlc3RzXG4gICAgICAgICAgICBpZiAoXCJjbG9zZVwiID09PSBwYWNrZXQudHlwZSkge1xuICAgICAgICAgICAgICAgIHRoaXMub25DbG9zZSh7IGRlc2NyaXB0aW9uOiBcInRyYW5zcG9ydCBjbG9zZWQgYnkgdGhlIHNlcnZlclwiIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIG90aGVyd2lzZSBieXBhc3Mgb25EYXRhIGFuZCBoYW5kbGUgdGhlIG1lc3NhZ2VcbiAgICAgICAgICAgIHRoaXMub25QYWNrZXQocGFja2V0KTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gZGVjb2RlIHBheWxvYWRcbiAgICAgICAgZGVjb2RlUGF5bG9hZChkYXRhLCB0aGlzLnNvY2tldC5iaW5hcnlUeXBlKS5mb3JFYWNoKGNhbGxiYWNrKTtcbiAgICAgICAgLy8gaWYgYW4gZXZlbnQgZGlkIG5vdCB0cmlnZ2VyIGNsb3NpbmdcbiAgICAgICAgaWYgKFwiY2xvc2VkXCIgIT09IHRoaXMucmVhZHlTdGF0ZSkge1xuICAgICAgICAgICAgLy8gaWYgd2UgZ290IGRhdGEgd2UncmUgbm90IHBvbGxpbmdcbiAgICAgICAgICAgIHRoaXMuX3BvbGxpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwicG9sbENvbXBsZXRlXCIpO1xuICAgICAgICAgICAgaWYgKFwib3BlblwiID09PSB0aGlzLnJlYWR5U3RhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wb2xsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb3IgcG9sbGluZywgc2VuZCBhIGNsb3NlIHBhY2tldC5cbiAgICAgKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBkb0Nsb3NlKCkge1xuICAgICAgICBjb25zdCBjbG9zZSA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMud3JpdGUoW3sgdHlwZTogXCJjbG9zZVwiIH1dKTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKFwib3BlblwiID09PSB0aGlzLnJlYWR5U3RhdGUpIHtcbiAgICAgICAgICAgIGNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBpbiBjYXNlIHdlJ3JlIHRyeWluZyB0byBjbG9zZSB3aGlsZVxuICAgICAgICAgICAgLy8gaGFuZHNoYWtpbmcgaXMgaW4gcHJvZ3Jlc3MgKEdILTE2NClcbiAgICAgICAgICAgIHRoaXMub25jZShcIm9wZW5cIiwgY2xvc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhIHBhY2tldHMgcGF5bG9hZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhY2tldHMgLSBkYXRhIHBhY2tldHNcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgd3JpdGUocGFja2V0cykge1xuICAgICAgICB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG4gICAgICAgIGVuY29kZVBheWxvYWQocGFja2V0cywgKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZG9Xcml0ZShkYXRhLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy53cml0YWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJkcmFpblwiKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIHVyaSBmb3IgY29ubmVjdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdXJpKCkge1xuICAgICAgICBjb25zdCBzY2hlbWEgPSB0aGlzLm9wdHMuc2VjdXJlID8gXCJodHRwc1wiIDogXCJodHRwXCI7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5xdWVyeSB8fCB7fTtcbiAgICAgICAgLy8gY2FjaGUgYnVzdGluZyBpcyBmb3JjZWRcbiAgICAgICAgaWYgKGZhbHNlICE9PSB0aGlzLm9wdHMudGltZXN0YW1wUmVxdWVzdHMpIHtcbiAgICAgICAgICAgIHF1ZXJ5W3RoaXMub3B0cy50aW1lc3RhbXBQYXJhbV0gPSByYW5kb21TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuc3VwcG9ydHNCaW5hcnkgJiYgIXF1ZXJ5LnNpZCkge1xuICAgICAgICAgICAgcXVlcnkuYjY0ID0gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVVcmkoc2NoZW1hLCBxdWVyeSk7XG4gICAgfVxufVxuIiwgIi8vIGltcG9ydGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvbmVudC9oYXMtY29yc1xubGV0IHZhbHVlID0gZmFsc2U7XG50cnkge1xuICAgIHZhbHVlID0gdHlwZW9mIFhNTEh0dHBSZXF1ZXN0ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAnd2l0aENyZWRlbnRpYWxzJyBpbiBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbn1cbmNhdGNoIChlcnIpIHtcbiAgICAvLyBpZiBYTUxIdHRwIHN1cHBvcnQgaXMgZGlzYWJsZWQgaW4gSUUgdGhlbiBpdCB3aWxsIHRocm93XG4gICAgLy8gd2hlbiB0cnlpbmcgdG8gY3JlYXRlXG59XG5leHBvcnQgY29uc3QgaGFzQ09SUyA9IHZhbHVlO1xuIiwgImltcG9ydCB7IFBvbGxpbmcgfSBmcm9tIFwiLi9wb2xsaW5nLmpzXCI7XG5pbXBvcnQgeyBFbWl0dGVyIH0gZnJvbSBcIkBzb2NrZXQuaW8vY29tcG9uZW50LWVtaXR0ZXJcIjtcbmltcG9ydCB7IGluc3RhbGxUaW1lckZ1bmN0aW9ucywgcGljayB9IGZyb20gXCIuLi91dGlsLmpzXCI7XG5pbXBvcnQgeyBnbG9iYWxUaGlzU2hpbSBhcyBnbG9iYWxUaGlzIH0gZnJvbSBcIi4uL2dsb2JhbHMubm9kZS5qc1wiO1xuaW1wb3J0IHsgaGFzQ09SUyB9IGZyb20gXCIuLi9jb250cmliL2hhcy1jb3JzLmpzXCI7XG5mdW5jdGlvbiBlbXB0eSgpIHsgfVxuZXhwb3J0IGNsYXNzIEJhc2VYSFIgZXh0ZW5kcyBQb2xsaW5nIHtcbiAgICAvKipcbiAgICAgKiBYSFIgUG9sbGluZyBjb25zdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzXG4gICAgICogQHBhY2thZ2VcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuICAgICAgICBpZiAodHlwZW9mIGxvY2F0aW9uICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICBjb25zdCBpc1NTTCA9IFwiaHR0cHM6XCIgPT09IGxvY2F0aW9uLnByb3RvY29sO1xuICAgICAgICAgICAgbGV0IHBvcnQgPSBsb2NhdGlvbi5wb3J0O1xuICAgICAgICAgICAgLy8gc29tZSB1c2VyIGFnZW50cyBoYXZlIGVtcHR5IGBsb2NhdGlvbi5wb3J0YFxuICAgICAgICAgICAgaWYgKCFwb3J0KSB7XG4gICAgICAgICAgICAgICAgcG9ydCA9IGlzU1NMID8gXCI0NDNcIiA6IFwiODBcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMueGQgPVxuICAgICAgICAgICAgICAgICh0eXBlb2YgbG9jYXRpb24gIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgb3B0cy5ob3N0bmFtZSAhPT0gbG9jYXRpb24uaG9zdG5hbWUpIHx8XG4gICAgICAgICAgICAgICAgICAgIHBvcnQgIT09IG9wdHMucG9ydDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kcyBkYXRhLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGRhdGEgdG8gc2VuZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsZWQgdXBvbiBmbHVzaC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGRvV3JpdGUoZGF0YSwgZm4pIHtcbiAgICAgICAgY29uc3QgcmVxID0gdGhpcy5yZXF1ZXN0KHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICB9KTtcbiAgICAgICAgcmVxLm9uKFwic3VjY2Vzc1wiLCBmbik7XG4gICAgICAgIHJlcS5vbihcImVycm9yXCIsICh4aHJTdGF0dXMsIGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25FcnJvcihcInhociBwb3N0IGVycm9yXCIsIHhoclN0YXR1cywgY29udGV4dCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdGFydHMgYSBwb2xsIGN5Y2xlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBkb1BvbGwoKSB7XG4gICAgICAgIGNvbnN0IHJlcSA9IHRoaXMucmVxdWVzdCgpO1xuICAgICAgICByZXEub24oXCJkYXRhXCIsIHRoaXMub25EYXRhLmJpbmQodGhpcykpO1xuICAgICAgICByZXEub24oXCJlcnJvclwiLCAoeGhyU3RhdHVzLCBjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uRXJyb3IoXCJ4aHIgcG9sbCBlcnJvclwiLCB4aHJTdGF0dXMsIGNvbnRleHQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wb2xsWGhyID0gcmVxO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBSZXF1ZXN0IGV4dGVuZHMgRW1pdHRlciB7XG4gICAgLyoqXG4gICAgICogUmVxdWVzdCBjb25zdHJ1Y3RvclxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcGFja2FnZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNyZWF0ZVJlcXVlc3QsIHVyaSwgb3B0cykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNyZWF0ZVJlcXVlc3QgPSBjcmVhdGVSZXF1ZXN0O1xuICAgICAgICBpbnN0YWxsVGltZXJGdW5jdGlvbnModGhpcywgb3B0cyk7XG4gICAgICAgIHRoaXMuX29wdHMgPSBvcHRzO1xuICAgICAgICB0aGlzLl9tZXRob2QgPSBvcHRzLm1ldGhvZCB8fCBcIkdFVFwiO1xuICAgICAgICB0aGlzLl91cmkgPSB1cmk7XG4gICAgICAgIHRoaXMuX2RhdGEgPSB1bmRlZmluZWQgIT09IG9wdHMuZGF0YSA/IG9wdHMuZGF0YSA6IG51bGw7XG4gICAgICAgIHRoaXMuX2NyZWF0ZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBYSFIgb2JqZWN0IGFuZCBzZW5kcyB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2NyZWF0ZSgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBvcHRzID0gcGljayh0aGlzLl9vcHRzLCBcImFnZW50XCIsIFwicGZ4XCIsIFwia2V5XCIsIFwicGFzc3BocmFzZVwiLCBcImNlcnRcIiwgXCJjYVwiLCBcImNpcGhlcnNcIiwgXCJyZWplY3RVbmF1dGhvcml6ZWRcIiwgXCJhdXRvVW5yZWZcIik7XG4gICAgICAgIG9wdHMueGRvbWFpbiA9ICEhdGhpcy5fb3B0cy54ZDtcbiAgICAgICAgY29uc3QgeGhyID0gKHRoaXMuX3hociA9IHRoaXMuY3JlYXRlUmVxdWVzdChvcHRzKSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB4aHIub3Blbih0aGlzLl9tZXRob2QsIHRoaXMuX3VyaSwgdHJ1ZSk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRzLmV4dHJhSGVhZGVycykge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIHhoci5zZXREaXNhYmxlSGVhZGVyQ2hlY2sgJiYgeGhyLnNldERpc2FibGVIZWFkZXJDaGVjayh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSBpbiB0aGlzLl9vcHRzLmV4dHJhSGVhZGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX29wdHMuZXh0cmFIZWFkZXJzLmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaSwgdGhpcy5fb3B0cy5leHRyYUhlYWRlcnNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHsgfVxuICAgICAgICAgICAgaWYgKFwiUE9TVFwiID09PSB0aGlzLl9tZXRob2QpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtdHlwZVwiLCBcInRleHQvcGxhaW47Y2hhcnNldD1VVEYtOFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkFjY2VwdFwiLCBcIiovKlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7IH1cbiAgICAgICAgICAgIChfYSA9IHRoaXMuX29wdHMuY29va2llSmFyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYWRkQ29va2llcyh4aHIpO1xuICAgICAgICAgICAgLy8gaWU2IGNoZWNrXG4gICAgICAgICAgICBpZiAoXCJ3aXRoQ3JlZGVudGlhbHNcIiBpbiB4aHIpIHtcbiAgICAgICAgICAgICAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gdGhpcy5fb3B0cy53aXRoQ3JlZGVudGlhbHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fb3B0cy5yZXF1ZXN0VGltZW91dCkge1xuICAgICAgICAgICAgICAgIHhoci50aW1lb3V0ID0gdGhpcy5fb3B0cy5yZXF1ZXN0VGltZW91dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gMykge1xuICAgICAgICAgICAgICAgICAgICAoX2EgPSB0aGlzLl9vcHRzLmNvb2tpZUphcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnBhcnNlQ29va2llcyhcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoXCJzZXQtY29va2llXCIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKDQgIT09IHhoci5yZWFkeVN0YXRlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgaWYgKDIwMCA9PT0geGhyLnN0YXR1cyB8fCAxMjIzID09PSB4aHIuc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uTG9hZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBgZXJyb3JgIGV2ZW50IGhhbmRsZXIgdGhhdCdzIHVzZXItc2V0XG4gICAgICAgICAgICAgICAgICAgIC8vIGRvZXMgbm90IHRocm93IGluIHRoZSBzYW1lIHRpY2sgYW5kIGdldHMgY2F1Z2h0IGhlcmVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRUaW1lb3V0Rm4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25FcnJvcih0eXBlb2YgeGhyLnN0YXR1cyA9PT0gXCJudW1iZXJcIiA/IHhoci5zdGF0dXMgOiAwKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHhoci5zZW5kKHRoaXMuX2RhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBOZWVkIHRvIGRlZmVyIHNpbmNlIC5jcmVhdGUoKSBpcyBjYWxsZWQgZGlyZWN0bHkgZnJvbSB0aGUgY29uc3RydWN0b3JcbiAgICAgICAgICAgIC8vIGFuZCB0aHVzIHRoZSAnZXJyb3InIGV2ZW50IGNhbiBvbmx5IGJlIG9ubHkgYm91bmQgKmFmdGVyKiB0aGlzIGV4Y2VwdGlvblxuICAgICAgICAgICAgLy8gb2NjdXJzLiAgVGhlcmVmb3JlLCBhbHNvLCB3ZSBjYW5ub3QgdGhyb3cgaGVyZSBhdCBhbGwuXG4gICAgICAgICAgICB0aGlzLnNldFRpbWVvdXRGbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25FcnJvcihlKTtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRoaXMuX2luZGV4ID0gUmVxdWVzdC5yZXF1ZXN0c0NvdW50Kys7XG4gICAgICAgICAgICBSZXF1ZXN0LnJlcXVlc3RzW3RoaXMuX2luZGV4XSA9IHRoaXM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHVwb24gZXJyb3IuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9vbkVycm9yKGVycikge1xuICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImVycm9yXCIsIGVyciwgdGhpcy5feGhyKTtcbiAgICAgICAgdGhpcy5fY2xlYW51cCh0cnVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYW5zIHVwIGhvdXNlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfY2xlYW51cChmcm9tRXJyb3IpIHtcbiAgICAgICAgaWYgKFwidW5kZWZpbmVkXCIgPT09IHR5cGVvZiB0aGlzLl94aHIgfHwgbnVsbCA9PT0gdGhpcy5feGhyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5feGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGVtcHR5O1xuICAgICAgICBpZiAoZnJvbUVycm9yKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3hoci5hYm9ydCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHsgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBSZXF1ZXN0LnJlcXVlc3RzW3RoaXMuX2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl94aHIgPSBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiBsb2FkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfb25Mb2FkKCkge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5feGhyLnJlc3BvbnNlVGV4dDtcbiAgICAgICAgaWYgKGRhdGEgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwiZGF0YVwiLCBkYXRhKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwic3VjY2Vzc1wiKTtcbiAgICAgICAgICAgIHRoaXMuX2NsZWFudXAoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBYm9ydHMgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcGFja2FnZVxuICAgICAqL1xuICAgIGFib3J0KCkge1xuICAgICAgICB0aGlzLl9jbGVhbnVwKCk7XG4gICAgfVxufVxuUmVxdWVzdC5yZXF1ZXN0c0NvdW50ID0gMDtcblJlcXVlc3QucmVxdWVzdHMgPSB7fTtcbi8qKlxuICogQWJvcnRzIHBlbmRpbmcgcmVxdWVzdHMgd2hlbiB1bmxvYWRpbmcgdGhlIHdpbmRvdy4gVGhpcyBpcyBuZWVkZWQgdG8gcHJldmVudFxuICogbWVtb3J5IGxlYWtzIChlLmcuIHdoZW4gdXNpbmcgSUUpIGFuZCB0byBlbnN1cmUgdGhhdCBubyBzcHVyaW91cyBlcnJvciBpc1xuICogZW1pdHRlZC5cbiAqL1xuaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAodHlwZW9mIGF0dGFjaEV2ZW50ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBhdHRhY2hFdmVudChcIm9udW5sb2FkXCIsIHVubG9hZEhhbmRsZXIpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgYWRkRXZlbnRMaXN0ZW5lciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGNvbnN0IHRlcm1pbmF0aW9uRXZlbnQgPSBcIm9ucGFnZWhpZGVcIiBpbiBnbG9iYWxUaGlzID8gXCJwYWdlaGlkZVwiIDogXCJ1bmxvYWRcIjtcbiAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcih0ZXJtaW5hdGlvbkV2ZW50LCB1bmxvYWRIYW5kbGVyLCBmYWxzZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gdW5sb2FkSGFuZGxlcigpIHtcbiAgICBmb3IgKGxldCBpIGluIFJlcXVlc3QucmVxdWVzdHMpIHtcbiAgICAgICAgaWYgKFJlcXVlc3QucmVxdWVzdHMuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgIFJlcXVlc3QucmVxdWVzdHNbaV0uYWJvcnQoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmNvbnN0IGhhc1hIUjIgPSAoZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHhociA9IG5ld1JlcXVlc3Qoe1xuICAgICAgICB4ZG9tYWluOiBmYWxzZSxcbiAgICB9KTtcbiAgICByZXR1cm4geGhyICYmIHhoci5yZXNwb25zZVR5cGUgIT09IG51bGw7XG59KSgpO1xuLyoqXG4gKiBIVFRQIGxvbmctcG9sbGluZyBiYXNlZCBvbiB0aGUgYnVpbHQtaW4gYFhNTEh0dHBSZXF1ZXN0YCBvYmplY3QuXG4gKlxuICogVXNhZ2U6IGJyb3dzZXJcbiAqXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9YTUxIdHRwUmVxdWVzdFxuICovXG5leHBvcnQgY2xhc3MgWEhSIGV4dGVuZHMgQmFzZVhIUiB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgY29uc3QgZm9yY2VCYXNlNjQgPSBvcHRzICYmIG9wdHMuZm9yY2VCYXNlNjQ7XG4gICAgICAgIHRoaXMuc3VwcG9ydHNCaW5hcnkgPSBoYXNYSFIyICYmICFmb3JjZUJhc2U2NDtcbiAgICB9XG4gICAgcmVxdWVzdChvcHRzID0ge30pIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihvcHRzLCB7IHhkOiB0aGlzLnhkIH0sIHRoaXMub3B0cyk7XG4gICAgICAgIHJldHVybiBuZXcgUmVxdWVzdChuZXdSZXF1ZXN0LCB0aGlzLnVyaSgpLCBvcHRzKTtcbiAgICB9XG59XG5mdW5jdGlvbiBuZXdSZXF1ZXN0KG9wdHMpIHtcbiAgICBjb25zdCB4ZG9tYWluID0gb3B0cy54ZG9tYWluO1xuICAgIC8vIFhNTEh0dHBSZXF1ZXN0IGNhbiBiZSBkaXNhYmxlZCBvbiBJRVxuICAgIHRyeSB7XG4gICAgICAgIGlmIChcInVuZGVmaW5lZFwiICE9PSB0eXBlb2YgWE1MSHR0cFJlcXVlc3QgJiYgKCF4ZG9tYWluIHx8IGhhc0NPUlMpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGUpIHsgfVxuICAgIGlmICgheGRvbWFpbikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBnbG9iYWxUaGlzW1tcIkFjdGl2ZVwiXS5jb25jYXQoXCJPYmplY3RcIikuam9pbihcIlhcIildKFwiTWljcm9zb2Z0LlhNTEhUVFBcIik7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHsgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBUcmFuc3BvcnQgfSBmcm9tIFwiLi4vdHJhbnNwb3J0LmpzXCI7XG5pbXBvcnQgeyBwaWNrLCByYW5kb21TdHJpbmcgfSBmcm9tIFwiLi4vdXRpbC5qc1wiO1xuaW1wb3J0IHsgZW5jb2RlUGFja2V0IH0gZnJvbSBcImVuZ2luZS5pby1wYXJzZXJcIjtcbmltcG9ydCB7IGdsb2JhbFRoaXNTaGltIGFzIGdsb2JhbFRoaXMsIG5leHRUaWNrIH0gZnJvbSBcIi4uL2dsb2JhbHMubm9kZS5qc1wiO1xuLy8gZGV0ZWN0IFJlYWN0TmF0aXZlIGVudmlyb25tZW50XG5jb25zdCBpc1JlYWN0TmF0aXZlID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgIHR5cGVvZiBuYXZpZ2F0b3IucHJvZHVjdCA9PT0gXCJzdHJpbmdcIiAmJlxuICAgIG5hdmlnYXRvci5wcm9kdWN0LnRvTG93ZXJDYXNlKCkgPT09IFwicmVhY3RuYXRpdmVcIjtcbmV4cG9ydCBjbGFzcyBCYXNlV1MgZXh0ZW5kcyBUcmFuc3BvcnQge1xuICAgIGdldCBuYW1lKCkge1xuICAgICAgICByZXR1cm4gXCJ3ZWJzb2NrZXRcIjtcbiAgICB9XG4gICAgZG9PcGVuKCkge1xuICAgICAgICBjb25zdCB1cmkgPSB0aGlzLnVyaSgpO1xuICAgICAgICBjb25zdCBwcm90b2NvbHMgPSB0aGlzLm9wdHMucHJvdG9jb2xzO1xuICAgICAgICAvLyBSZWFjdCBOYXRpdmUgb25seSBzdXBwb3J0cyB0aGUgJ2hlYWRlcnMnIG9wdGlvbiwgYW5kIHdpbGwgcHJpbnQgYSB3YXJuaW5nIGlmIGFueXRoaW5nIGVsc2UgaXMgcGFzc2VkXG4gICAgICAgIGNvbnN0IG9wdHMgPSBpc1JlYWN0TmF0aXZlXG4gICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICA6IHBpY2sodGhpcy5vcHRzLCBcImFnZW50XCIsIFwicGVyTWVzc2FnZURlZmxhdGVcIiwgXCJwZnhcIiwgXCJrZXlcIiwgXCJwYXNzcGhyYXNlXCIsIFwiY2VydFwiLCBcImNhXCIsIFwiY2lwaGVyc1wiLCBcInJlamVjdFVuYXV0aG9yaXplZFwiLCBcImxvY2FsQWRkcmVzc1wiLCBcInByb3RvY29sVmVyc2lvblwiLCBcIm9yaWdpblwiLCBcIm1heFBheWxvYWRcIiwgXCJmYW1pbHlcIiwgXCJjaGVja1NlcnZlcklkZW50aXR5XCIpO1xuICAgICAgICBpZiAodGhpcy5vcHRzLmV4dHJhSGVhZGVycykge1xuICAgICAgICAgICAgb3B0cy5oZWFkZXJzID0gdGhpcy5vcHRzLmV4dHJhSGVhZGVycztcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy53cyA9IHRoaXMuY3JlYXRlU29ja2V0KHVyaSwgcHJvdG9jb2xzLCBvcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbWl0UmVzZXJ2ZWQoXCJlcnJvclwiLCBlcnIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMud3MuYmluYXJ5VHlwZSA9IHRoaXMuc29ja2V0LmJpbmFyeVR5cGU7XG4gICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBldmVudCBsaXN0ZW5lcnMgdG8gdGhlIHNvY2tldFxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBhZGRFdmVudExpc3RlbmVycygpIHtcbiAgICAgICAgdGhpcy53cy5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRzLmF1dG9VbnJlZikge1xuICAgICAgICAgICAgICAgIHRoaXMud3MuX3NvY2tldC51bnJlZigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vbk9wZW4oKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy53cy5vbmNsb3NlID0gKGNsb3NlRXZlbnQpID0+IHRoaXMub25DbG9zZSh7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJ3ZWJzb2NrZXQgY29ubmVjdGlvbiBjbG9zZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IGNsb3NlRXZlbnQsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLndzLm9ubWVzc2FnZSA9IChldikgPT4gdGhpcy5vbkRhdGEoZXYuZGF0YSk7XG4gICAgICAgIHRoaXMud3Mub25lcnJvciA9IChlKSA9PiB0aGlzLm9uRXJyb3IoXCJ3ZWJzb2NrZXQgZXJyb3JcIiwgZSk7XG4gICAgfVxuICAgIHdyaXRlKHBhY2tldHMpIHtcbiAgICAgICAgdGhpcy53cml0YWJsZSA9IGZhbHNlO1xuICAgICAgICAvLyBlbmNvZGVQYWNrZXQgZWZmaWNpZW50IGFzIGl0IHVzZXMgV1MgZnJhbWluZ1xuICAgICAgICAvLyBubyBuZWVkIGZvciBlbmNvZGVQYXlsb2FkXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFja2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgcGFja2V0ID0gcGFja2V0c1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RQYWNrZXQgPSBpID09PSBwYWNrZXRzLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICBlbmNvZGVQYWNrZXQocGFja2V0LCB0aGlzLnN1cHBvcnRzQmluYXJ5LCAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFNvbWV0aW1lcyB0aGUgd2Vic29ja2V0IGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkIGJ1dCB0aGUgYnJvd3NlciBkaWRuJ3RcbiAgICAgICAgICAgICAgICAvLyBoYXZlIGEgY2hhbmNlIG9mIGluZm9ybWluZyB1cyBhYm91dCBpdCB5ZXQsIGluIHRoYXQgY2FzZSBzZW5kIHdpbGxcbiAgICAgICAgICAgICAgICAvLyB0aHJvdyBhbiBlcnJvclxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9Xcml0ZShwYWNrZXQsIGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobGFzdFBhY2tldCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBmYWtlIGRyYWluXG4gICAgICAgICAgICAgICAgICAgIC8vIGRlZmVyIHRvIG5leHQgdGljayB0byBhbGxvdyBTb2NrZXQgdG8gY2xlYXIgd3JpdGVCdWZmZXJcbiAgICAgICAgICAgICAgICAgICAgbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0YWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImRyYWluXCIpO1xuICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLnNldFRpbWVvdXRGbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZG9DbG9zZSgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLndzICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB0aGlzLndzLm9uZXJyb3IgPSAoKSA9PiB7IH07XG4gICAgICAgICAgICB0aGlzLndzLmNsb3NlKCk7XG4gICAgICAgICAgICB0aGlzLndzID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgdXJpIGZvciBjb25uZWN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB1cmkoKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMub3B0cy5zZWN1cmUgPyBcIndzc1wiIDogXCJ3c1wiO1xuICAgICAgICBjb25zdCBxdWVyeSA9IHRoaXMucXVlcnkgfHwge307XG4gICAgICAgIC8vIGFwcGVuZCB0aW1lc3RhbXAgdG8gVVJJXG4gICAgICAgIGlmICh0aGlzLm9wdHMudGltZXN0YW1wUmVxdWVzdHMpIHtcbiAgICAgICAgICAgIHF1ZXJ5W3RoaXMub3B0cy50aW1lc3RhbXBQYXJhbV0gPSByYW5kb21TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBjb21tdW5pY2F0ZSBiaW5hcnkgc3VwcG9ydCBjYXBhYmlsaXRpZXNcbiAgICAgICAgaWYgKCF0aGlzLnN1cHBvcnRzQmluYXJ5KSB7XG4gICAgICAgICAgICBxdWVyeS5iNjQgPSAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVVyaShzY2hlbWEsIHF1ZXJ5KTtcbiAgICB9XG59XG5jb25zdCBXZWJTb2NrZXRDdG9yID0gZ2xvYmFsVGhpcy5XZWJTb2NrZXQgfHwgZ2xvYmFsVGhpcy5Nb3pXZWJTb2NrZXQ7XG4vKipcbiAqIFdlYlNvY2tldCB0cmFuc3BvcnQgYmFzZWQgb24gdGhlIGJ1aWx0LWluIGBXZWJTb2NrZXRgIG9iamVjdC5cbiAqXG4gKiBVc2FnZTogYnJvd3NlciwgTm9kZS5qcyAoc2luY2UgdjIxKSwgRGVubywgQnVuXG4gKlxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2ViU29ja2V0XG4gKiBAc2VlIGh0dHBzOi8vY2FuaXVzZS5jb20vbWRuLWFwaV93ZWJzb2NrZXRcbiAqIEBzZWUgaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9nbG9iYWxzLmh0bWwjd2Vic29ja2V0XG4gKi9cbmV4cG9ydCBjbGFzcyBXUyBleHRlbmRzIEJhc2VXUyB7XG4gICAgY3JlYXRlU29ja2V0KHVyaSwgcHJvdG9jb2xzLCBvcHRzKSB7XG4gICAgICAgIHJldHVybiAhaXNSZWFjdE5hdGl2ZVxuICAgICAgICAgICAgPyBwcm90b2NvbHNcbiAgICAgICAgICAgICAgICA/IG5ldyBXZWJTb2NrZXRDdG9yKHVyaSwgcHJvdG9jb2xzKVxuICAgICAgICAgICAgICAgIDogbmV3IFdlYlNvY2tldEN0b3IodXJpKVxuICAgICAgICAgICAgOiBuZXcgV2ViU29ja2V0Q3Rvcih1cmksIHByb3RvY29scywgb3B0cyk7XG4gICAgfVxuICAgIGRvV3JpdGUoX3BhY2tldCwgZGF0YSkge1xuICAgICAgICB0aGlzLndzLnNlbmQoZGF0YSk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IFRyYW5zcG9ydCB9IGZyb20gXCIuLi90cmFuc3BvcnQuanNcIjtcbmltcG9ydCB7IG5leHRUaWNrIH0gZnJvbSBcIi4uL2dsb2JhbHMubm9kZS5qc1wiO1xuaW1wb3J0IHsgY3JlYXRlUGFja2V0RGVjb2RlclN0cmVhbSwgY3JlYXRlUGFja2V0RW5jb2RlclN0cmVhbSwgfSBmcm9tIFwiZW5naW5lLmlvLXBhcnNlclwiO1xuLyoqXG4gKiBXZWJUcmFuc3BvcnQgdHJhbnNwb3J0IGJhc2VkIG9uIHRoZSBidWlsdC1pbiBgV2ViVHJhbnNwb3J0YCBvYmplY3QuXG4gKlxuICogVXNhZ2U6IGJyb3dzZXIsIE5vZGUuanMgKHdpdGggdGhlIGBAZmFpbHMtY29tcG9uZW50cy93ZWJ0cmFuc3BvcnRgIHBhY2thZ2UpXG4gKlxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2ViVHJhbnNwb3J0XG4gKiBAc2VlIGh0dHBzOi8vY2FuaXVzZS5jb20vd2VidHJhbnNwb3J0XG4gKi9cbmV4cG9ydCBjbGFzcyBXVCBleHRlbmRzIFRyYW5zcG9ydCB7XG4gICAgZ2V0IG5hbWUoKSB7XG4gICAgICAgIHJldHVybiBcIndlYnRyYW5zcG9ydFwiO1xuICAgIH1cbiAgICBkb09wZW4oKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB0aGlzLl90cmFuc3BvcnQgPSBuZXcgV2ViVHJhbnNwb3J0KHRoaXMuY3JlYXRlVXJpKFwiaHR0cHNcIiksIHRoaXMub3B0cy50cmFuc3BvcnRPcHRpb25zW3RoaXMubmFtZV0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVtaXRSZXNlcnZlZChcImVycm9yXCIsIGVycik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdHJhbnNwb3J0LmNsb3NlZFxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkNsb3NlKCk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkVycm9yKFwid2VidHJhbnNwb3J0IGVycm9yXCIsIGVycik7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBub3RlOiB3ZSBjb3VsZCBoYXZlIHVzZWQgYXN5bmMvYXdhaXQsIGJ1dCB0aGF0IHdvdWxkIHJlcXVpcmUgc29tZSBhZGRpdGlvbmFsIHBvbHlmaWxsc1xuICAgICAgICB0aGlzLl90cmFuc3BvcnQucmVhZHkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl90cmFuc3BvcnQuY3JlYXRlQmlkaXJlY3Rpb25hbFN0cmVhbSgpLnRoZW4oKHN0cmVhbSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlY29kZXJTdHJlYW0gPSBjcmVhdGVQYWNrZXREZWNvZGVyU3RyZWFtKE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLCB0aGlzLnNvY2tldC5iaW5hcnlUeXBlKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWFkZXIgPSBzdHJlYW0ucmVhZGFibGUucGlwZVRocm91Z2goZGVjb2RlclN0cmVhbSkuZ2V0UmVhZGVyKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5jb2RlclN0cmVhbSA9IGNyZWF0ZVBhY2tldEVuY29kZXJTdHJlYW0oKTtcbiAgICAgICAgICAgICAgICBlbmNvZGVyU3RyZWFtLnJlYWRhYmxlLnBpcGVUbyhzdHJlYW0ud3JpdGFibGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3dyaXRlciA9IGVuY29kZXJTdHJlYW0ud3JpdGFibGUuZ2V0V3JpdGVyKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVhZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVhZCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoeyBkb25lLCB2YWx1ZSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25QYWNrZXQodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCgpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZWFkKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFja2V0ID0geyB0eXBlOiBcIm9wZW5cIiB9O1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnF1ZXJ5LnNpZCkge1xuICAgICAgICAgICAgICAgICAgICBwYWNrZXQuZGF0YSA9IGB7XCJzaWRcIjpcIiR7dGhpcy5xdWVyeS5zaWR9XCJ9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fd3JpdGVyLndyaXRlKHBhY2tldCkudGhlbigoKSA9PiB0aGlzLm9uT3BlbigpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgd3JpdGUocGFja2V0cykge1xuICAgICAgICB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFja2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgcGFja2V0ID0gcGFja2V0c1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RQYWNrZXQgPSBpID09PSBwYWNrZXRzLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICB0aGlzLl93cml0ZXIud3JpdGUocGFja2V0KS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobGFzdFBhY2tldCkge1xuICAgICAgICAgICAgICAgICAgICBuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwiZHJhaW5cIik7XG4gICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuc2V0VGltZW91dEZuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkb0Nsb3NlKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IHRoaXMuX3RyYW5zcG9ydCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNsb3NlKCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IFhIUiB9IGZyb20gXCIuL3BvbGxpbmcteGhyLm5vZGUuanNcIjtcbmltcG9ydCB7IFdTIH0gZnJvbSBcIi4vd2Vic29ja2V0Lm5vZGUuanNcIjtcbmltcG9ydCB7IFdUIH0gZnJvbSBcIi4vd2VidHJhbnNwb3J0LmpzXCI7XG5leHBvcnQgY29uc3QgdHJhbnNwb3J0cyA9IHtcbiAgICB3ZWJzb2NrZXQ6IFdTLFxuICAgIHdlYnRyYW5zcG9ydDogV1QsXG4gICAgcG9sbGluZzogWEhSLFxufTtcbiIsICIvLyBpbXBvcnRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9nYWxrbi9wYXJzZXVyaVxuLyoqXG4gKiBQYXJzZXMgYSBVUklcbiAqXG4gKiBOb3RlOiB3ZSBjb3VsZCBhbHNvIGhhdmUgdXNlZCB0aGUgYnVpbHQtaW4gVVJMIG9iamVjdCwgYnV0IGl0IGlzbid0IHN1cHBvcnRlZCBvbiBhbGwgcGxhdGZvcm1zLlxuICpcbiAqIFNlZTpcbiAqIC0gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1VSTFxuICogLSBodHRwczovL2Nhbml1c2UuY29tL3VybFxuICogLSBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjMzk4NiNhcHBlbmRpeC1CXG4gKlxuICogSGlzdG9yeSBvZiB0aGUgcGFyc2UoKSBtZXRob2Q6XG4gKiAtIGZpcnN0IGNvbW1pdDogaHR0cHM6Ly9naXRodWIuY29tL3NvY2tldGlvL3NvY2tldC5pby1jbGllbnQvY29tbWl0LzRlZTFkNWQ5NGIzOTA2YTljMDUyYjQ1OWYxYTgxOGIxNWYzOGY5MWNcbiAqIC0gZXhwb3J0IGludG8gaXRzIG93biBtb2R1bGU6IGh0dHBzOi8vZ2l0aHViLmNvbS9zb2NrZXRpby9lbmdpbmUuaW8tY2xpZW50L2NvbW1pdC9kZTJjNTYxZTQ1NjRlZmViNzhmMWJkYjFiYTM5ZWY4MWIyODIyY2IzXG4gKiAtIHJlaW1wb3J0OiBodHRwczovL2dpdGh1Yi5jb20vc29ja2V0aW8vZW5naW5lLmlvLWNsaWVudC9jb21taXQvZGYzMjI3N2MzZjZkNjIyZWVjNWVkMDlmNDkzY2FlM2YzMzkxZDI0MlxuICpcbiAqIEBhdXRob3IgU3RldmVuIExldml0aGFuIDxzdGV2ZW5sZXZpdGhhbi5jb20+IChNSVQgbGljZW5zZSlcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5jb25zdCByZSA9IC9eKD86KD8hW146QFxcLz8jXSs6W146QFxcL10qQCkoaHR0cHxodHRwc3x3c3x3c3MpOlxcL1xcLyk/KCg/OigoW146QFxcLz8jXSopKD86OihbXjpAXFwvPyNdKikpPyk/QCk/KCg/OlthLWYwLTldezAsNH06KXsyLDd9W2EtZjAtOV17MCw0fXxbXjpcXC8/I10qKSg/OjooXFxkKikpPykoKChcXC8oPzpbXj8jXSg/IVtePyNcXC9dKlxcLltePyNcXC8uXSsoPzpbPyNdfCQpKSkqXFwvPyk/KFtePyNcXC9dKikpKD86XFw/KFteI10qKSk/KD86IyguKikpPykvO1xuY29uc3QgcGFydHMgPSBbXG4gICAgJ3NvdXJjZScsICdwcm90b2NvbCcsICdhdXRob3JpdHknLCAndXNlckluZm8nLCAndXNlcicsICdwYXNzd29yZCcsICdob3N0JywgJ3BvcnQnLCAncmVsYXRpdmUnLCAncGF0aCcsICdkaXJlY3RvcnknLCAnZmlsZScsICdxdWVyeScsICdhbmNob3InXG5dO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlKHN0cikge1xuICAgIGlmIChzdHIubGVuZ3RoID4gODAwMCkge1xuICAgICAgICB0aHJvdyBcIlVSSSB0b28gbG9uZ1wiO1xuICAgIH1cbiAgICBjb25zdCBzcmMgPSBzdHIsIGIgPSBzdHIuaW5kZXhPZignWycpLCBlID0gc3RyLmluZGV4T2YoJ10nKTtcbiAgICBpZiAoYiAhPSAtMSAmJiBlICE9IC0xKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHJpbmcoMCwgYikgKyBzdHIuc3Vic3RyaW5nKGIsIGUpLnJlcGxhY2UoLzovZywgJzsnKSArIHN0ci5zdWJzdHJpbmcoZSwgc3RyLmxlbmd0aCk7XG4gICAgfVxuICAgIGxldCBtID0gcmUuZXhlYyhzdHIgfHwgJycpLCB1cmkgPSB7fSwgaSA9IDE0O1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgdXJpW3BhcnRzW2ldXSA9IG1baV0gfHwgJyc7XG4gICAgfVxuICAgIGlmIChiICE9IC0xICYmIGUgIT0gLTEpIHtcbiAgICAgICAgdXJpLnNvdXJjZSA9IHNyYztcbiAgICAgICAgdXJpLmhvc3QgPSB1cmkuaG9zdC5zdWJzdHJpbmcoMSwgdXJpLmhvc3QubGVuZ3RoIC0gMSkucmVwbGFjZSgvOy9nLCAnOicpO1xuICAgICAgICB1cmkuYXV0aG9yaXR5ID0gdXJpLmF1dGhvcml0eS5yZXBsYWNlKCdbJywgJycpLnJlcGxhY2UoJ10nLCAnJykucmVwbGFjZSgvOy9nLCAnOicpO1xuICAgICAgICB1cmkuaXB2NnVyaSA9IHRydWU7XG4gICAgfVxuICAgIHVyaS5wYXRoTmFtZXMgPSBwYXRoTmFtZXModXJpLCB1cmlbJ3BhdGgnXSk7XG4gICAgdXJpLnF1ZXJ5S2V5ID0gcXVlcnlLZXkodXJpLCB1cmlbJ3F1ZXJ5J10pO1xuICAgIHJldHVybiB1cmk7XG59XG5mdW5jdGlvbiBwYXRoTmFtZXMob2JqLCBwYXRoKSB7XG4gICAgY29uc3QgcmVneCA9IC9cXC97Miw5fS9nLCBuYW1lcyA9IHBhdGgucmVwbGFjZShyZWd4LCBcIi9cIikuc3BsaXQoXCIvXCIpO1xuICAgIGlmIChwYXRoLnNsaWNlKDAsIDEpID09ICcvJyB8fCBwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBuYW1lcy5zcGxpY2UoMCwgMSk7XG4gICAgfVxuICAgIGlmIChwYXRoLnNsaWNlKC0xKSA9PSAnLycpIHtcbiAgICAgICAgbmFtZXMuc3BsaWNlKG5hbWVzLmxlbmd0aCAtIDEsIDEpO1xuICAgIH1cbiAgICByZXR1cm4gbmFtZXM7XG59XG5mdW5jdGlvbiBxdWVyeUtleSh1cmksIHF1ZXJ5KSB7XG4gICAgY29uc3QgZGF0YSA9IHt9O1xuICAgIHF1ZXJ5LnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLCBmdW5jdGlvbiAoJDAsICQxLCAkMikge1xuICAgICAgICBpZiAoJDEpIHtcbiAgICAgICAgICAgIGRhdGFbJDFdID0gJDI7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZGF0YTtcbn1cbiIsICJpbXBvcnQgeyB0cmFuc3BvcnRzIGFzIERFRkFVTFRfVFJBTlNQT1JUUyB9IGZyb20gXCIuL3RyYW5zcG9ydHMvaW5kZXguanNcIjtcbmltcG9ydCB7IGluc3RhbGxUaW1lckZ1bmN0aW9ucywgYnl0ZUxlbmd0aCB9IGZyb20gXCIuL3V0aWwuanNcIjtcbmltcG9ydCB7IGRlY29kZSB9IGZyb20gXCIuL2NvbnRyaWIvcGFyc2Vxcy5qc1wiO1xuaW1wb3J0IHsgcGFyc2UgfSBmcm9tIFwiLi9jb250cmliL3BhcnNldXJpLmpzXCI7XG5pbXBvcnQgeyBFbWl0dGVyIH0gZnJvbSBcIkBzb2NrZXQuaW8vY29tcG9uZW50LWVtaXR0ZXJcIjtcbmltcG9ydCB7IHByb3RvY29sIH0gZnJvbSBcImVuZ2luZS5pby1wYXJzZXJcIjtcbmltcG9ydCB7IGNyZWF0ZUNvb2tpZUphciwgZGVmYXVsdEJpbmFyeVR5cGUsIG5leHRUaWNrLCB9IGZyb20gXCIuL2dsb2JhbHMubm9kZS5qc1wiO1xuY29uc3Qgd2l0aEV2ZW50TGlzdGVuZXJzID0gdHlwZW9mIGFkZEV2ZW50TGlzdGVuZXIgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgIHR5cGVvZiByZW1vdmVFdmVudExpc3RlbmVyID09PSBcImZ1bmN0aW9uXCI7XG5jb25zdCBPRkZMSU5FX0VWRU5UX0xJU1RFTkVSUyA9IFtdO1xuaWYgKHdpdGhFdmVudExpc3RlbmVycykge1xuICAgIC8vIHdpdGhpbiBhIFNlcnZpY2VXb3JrZXIsIGFueSBldmVudCBoYW5kbGVyIGZvciB0aGUgJ29mZmxpbmUnIGV2ZW50IG11c3QgYmUgYWRkZWQgb24gdGhlIGluaXRpYWwgZXZhbHVhdGlvbiBvZiB0aGVcbiAgICAvLyBzY3JpcHQsIHNvIHdlIGNyZWF0ZSBvbmUgc2luZ2xlIGV2ZW50IGxpc3RlbmVyIGhlcmUgd2hpY2ggd2lsbCBmb3J3YXJkIHRoZSBldmVudCB0byB0aGUgc29ja2V0IGluc3RhbmNlc1xuICAgIGFkZEV2ZW50TGlzdGVuZXIoXCJvZmZsaW5lXCIsICgpID0+IHtcbiAgICAgICAgT0ZGTElORV9FVkVOVF9MSVNURU5FUlMuZm9yRWFjaCgobGlzdGVuZXIpID0+IGxpc3RlbmVyKCkpO1xuICAgIH0sIGZhbHNlKTtcbn1cbi8qKlxuICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIFdlYlNvY2tldC1saWtlIGludGVyZmFjZSB0byBjb25uZWN0IHRvIGFuIEVuZ2luZS5JTyBzZXJ2ZXIuIFRoZSBjb25uZWN0aW9uIHdpbGwgYmUgZXN0YWJsaXNoZWRcbiAqIHdpdGggb25lIG9mIHRoZSBhdmFpbGFibGUgbG93LWxldmVsIHRyYW5zcG9ydHMsIGxpa2UgSFRUUCBsb25nLXBvbGxpbmcsIFdlYlNvY2tldCBvciBXZWJUcmFuc3BvcnQuXG4gKlxuICogVGhpcyBjbGFzcyBjb21lcyB3aXRob3V0IHVwZ3JhZGUgbWVjaGFuaXNtLCB3aGljaCBtZWFucyB0aGF0IGl0IHdpbGwga2VlcCB0aGUgZmlyc3QgbG93LWxldmVsIHRyYW5zcG9ydCB0aGF0XG4gKiBzdWNjZXNzZnVsbHkgZXN0YWJsaXNoZXMgdGhlIGNvbm5lY3Rpb24uXG4gKlxuICogSW4gb3JkZXIgdG8gYWxsb3cgdHJlZS1zaGFraW5nLCB0aGVyZSBhcmUgbm8gdHJhbnNwb3J0cyBpbmNsdWRlZCwgdGhhdCdzIHdoeSB0aGUgYHRyYW5zcG9ydHNgIG9wdGlvbiBpcyBtYW5kYXRvcnkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IFNvY2tldFdpdGhvdXRVcGdyYWRlLCBXZWJTb2NrZXQgfSBmcm9tIFwiZW5naW5lLmlvLWNsaWVudFwiO1xuICpcbiAqIGNvbnN0IHNvY2tldCA9IG5ldyBTb2NrZXRXaXRob3V0VXBncmFkZSh7XG4gKiAgIHRyYW5zcG9ydHM6IFtXZWJTb2NrZXRdXG4gKiB9KTtcbiAqXG4gKiBzb2NrZXQub24oXCJvcGVuXCIsICgpID0+IHtcbiAqICAgc29ja2V0LnNlbmQoXCJoZWxsb1wiKTtcbiAqIH0pO1xuICpcbiAqIEBzZWUgU29ja2V0V2l0aFVwZ3JhZGVcbiAqIEBzZWUgU29ja2V0XG4gKi9cbmV4cG9ydCBjbGFzcyBTb2NrZXRXaXRob3V0VXBncmFkZSBleHRlbmRzIEVtaXR0ZXIge1xuICAgIC8qKlxuICAgICAqIFNvY2tldCBjb25zdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gdXJpIC0gdXJpIG9yIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih1cmksIG9wdHMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5iaW5hcnlUeXBlID0gZGVmYXVsdEJpbmFyeVR5cGU7XG4gICAgICAgIHRoaXMud3JpdGVCdWZmZXIgPSBbXTtcbiAgICAgICAgdGhpcy5fcHJldkJ1ZmZlckxlbiA9IDA7XG4gICAgICAgIHRoaXMuX3BpbmdJbnRlcnZhbCA9IC0xO1xuICAgICAgICB0aGlzLl9waW5nVGltZW91dCA9IC0xO1xuICAgICAgICB0aGlzLl9tYXhQYXlsb2FkID0gLTE7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZXhwaXJhdGlvbiB0aW1lc3RhbXAgb2YgdGhlIHtAbGluayBfcGluZ1RpbWVvdXRUaW1lcn0gb2JqZWN0IGlzIHRyYWNrZWQsIGluIGNhc2UgdGhlIHRpbWVyIGlzIHRocm90dGxlZCBhbmQgdGhlXG4gICAgICAgICAqIGNhbGxiYWNrIGlzIG5vdCBmaXJlZCBvbiB0aW1lLiBUaGlzIGNhbiBoYXBwZW4gZm9yIGV4YW1wbGUgd2hlbiBhIGxhcHRvcCBpcyBzdXNwZW5kZWQgb3Igd2hlbiBhIHBob25lIGlzIGxvY2tlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX3BpbmdUaW1lb3V0VGltZSA9IEluZmluaXR5O1xuICAgICAgICBpZiAodXJpICYmIFwib2JqZWN0XCIgPT09IHR5cGVvZiB1cmkpIHtcbiAgICAgICAgICAgIG9wdHMgPSB1cmk7XG4gICAgICAgICAgICB1cmkgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cmkpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZFVyaSA9IHBhcnNlKHVyaSk7XG4gICAgICAgICAgICBvcHRzLmhvc3RuYW1lID0gcGFyc2VkVXJpLmhvc3Q7XG4gICAgICAgICAgICBvcHRzLnNlY3VyZSA9XG4gICAgICAgICAgICAgICAgcGFyc2VkVXJpLnByb3RvY29sID09PSBcImh0dHBzXCIgfHwgcGFyc2VkVXJpLnByb3RvY29sID09PSBcIndzc1wiO1xuICAgICAgICAgICAgb3B0cy5wb3J0ID0gcGFyc2VkVXJpLnBvcnQ7XG4gICAgICAgICAgICBpZiAocGFyc2VkVXJpLnF1ZXJ5KVxuICAgICAgICAgICAgICAgIG9wdHMucXVlcnkgPSBwYXJzZWRVcmkucXVlcnk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3B0cy5ob3N0KSB7XG4gICAgICAgICAgICBvcHRzLmhvc3RuYW1lID0gcGFyc2Uob3B0cy5ob3N0KS5ob3N0O1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbGxUaW1lckZ1bmN0aW9ucyh0aGlzLCBvcHRzKTtcbiAgICAgICAgdGhpcy5zZWN1cmUgPVxuICAgICAgICAgICAgbnVsbCAhPSBvcHRzLnNlY3VyZVxuICAgICAgICAgICAgICAgID8gb3B0cy5zZWN1cmVcbiAgICAgICAgICAgICAgICA6IHR5cGVvZiBsb2NhdGlvbiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBcImh0dHBzOlwiID09PSBsb2NhdGlvbi5wcm90b2NvbDtcbiAgICAgICAgaWYgKG9wdHMuaG9zdG5hbWUgJiYgIW9wdHMucG9ydCkge1xuICAgICAgICAgICAgLy8gaWYgbm8gcG9ydCBpcyBzcGVjaWZpZWQgbWFudWFsbHksIHVzZSB0aGUgcHJvdG9jb2wgZGVmYXVsdFxuICAgICAgICAgICAgb3B0cy5wb3J0ID0gdGhpcy5zZWN1cmUgPyBcIjQ0M1wiIDogXCI4MFwiO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaG9zdG5hbWUgPVxuICAgICAgICAgICAgb3B0cy5ob3N0bmFtZSB8fFxuICAgICAgICAgICAgICAgICh0eXBlb2YgbG9jYXRpb24gIT09IFwidW5kZWZpbmVkXCIgPyBsb2NhdGlvbi5ob3N0bmFtZSA6IFwibG9jYWxob3N0XCIpO1xuICAgICAgICB0aGlzLnBvcnQgPVxuICAgICAgICAgICAgb3B0cy5wb3J0IHx8XG4gICAgICAgICAgICAgICAgKHR5cGVvZiBsb2NhdGlvbiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBsb2NhdGlvbi5wb3J0XG4gICAgICAgICAgICAgICAgICAgID8gbG9jYXRpb24ucG9ydFxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuc2VjdXJlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFwiNDQzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogXCI4MFwiKTtcbiAgICAgICAgdGhpcy50cmFuc3BvcnRzID0gW107XG4gICAgICAgIHRoaXMuX3RyYW5zcG9ydHNCeU5hbWUgPSB7fTtcbiAgICAgICAgb3B0cy50cmFuc3BvcnRzLmZvckVhY2goKHQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zcG9ydE5hbWUgPSB0LnByb3RvdHlwZS5uYW1lO1xuICAgICAgICAgICAgdGhpcy50cmFuc3BvcnRzLnB1c2godHJhbnNwb3J0TmFtZSk7XG4gICAgICAgICAgICB0aGlzLl90cmFuc3BvcnRzQnlOYW1lW3RyYW5zcG9ydE5hbWVdID0gdDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub3B0cyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgcGF0aDogXCIvZW5naW5lLmlvXCIsXG4gICAgICAgICAgICBhZ2VudDogZmFsc2UsXG4gICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IGZhbHNlLFxuICAgICAgICAgICAgdXBncmFkZTogdHJ1ZSxcbiAgICAgICAgICAgIHRpbWVzdGFtcFBhcmFtOiBcInRcIixcbiAgICAgICAgICAgIHJlbWVtYmVyVXBncmFkZTogZmFsc2UsXG4gICAgICAgICAgICBhZGRUcmFpbGluZ1NsYXNoOiB0cnVlLFxuICAgICAgICAgICAgcmVqZWN0VW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgICAgICAgcGVyTWVzc2FnZURlZmxhdGU6IHtcbiAgICAgICAgICAgICAgICB0aHJlc2hvbGQ6IDEwMjQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHJhbnNwb3J0T3B0aW9uczoge30sXG4gICAgICAgICAgICBjbG9zZU9uQmVmb3JldW5sb2FkOiBmYWxzZSxcbiAgICAgICAgfSwgb3B0cyk7XG4gICAgICAgIHRoaXMub3B0cy5wYXRoID1cbiAgICAgICAgICAgIHRoaXMub3B0cy5wYXRoLnJlcGxhY2UoL1xcLyQvLCBcIlwiKSArXG4gICAgICAgICAgICAgICAgKHRoaXMub3B0cy5hZGRUcmFpbGluZ1NsYXNoID8gXCIvXCIgOiBcIlwiKTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdHMucXVlcnkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHRoaXMub3B0cy5xdWVyeSA9IGRlY29kZSh0aGlzLm9wdHMucXVlcnkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh3aXRoRXZlbnRMaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdHMuY2xvc2VPbkJlZm9yZXVubG9hZCkge1xuICAgICAgICAgICAgICAgIC8vIEZpcmVmb3ggY2xvc2VzIHRoZSBjb25uZWN0aW9uIHdoZW4gdGhlIFwiYmVmb3JldW5sb2FkXCIgZXZlbnQgaXMgZW1pdHRlZCBidXQgbm90IENocm9tZS4gVGhpcyBldmVudCBsaXN0ZW5lclxuICAgICAgICAgICAgICAgIC8vIGVuc3VyZXMgZXZlcnkgYnJvd3NlciBiZWhhdmVzIHRoZSBzYW1lIChubyBcImRpc2Nvbm5lY3RcIiBldmVudCBhdCB0aGUgU29ja2V0LklPIGxldmVsIHdoZW4gdGhlIHBhZ2UgaXNcbiAgICAgICAgICAgICAgICAvLyBjbG9zZWQvcmVsb2FkZWQpXG4gICAgICAgICAgICAgICAgdGhpcy5fYmVmb3JldW5sb2FkRXZlbnRMaXN0ZW5lciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudHJhbnNwb3J0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzaWxlbnRseSBjbG9zZSB0aGUgdHJhbnNwb3J0XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zcG9ydC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGFkZEV2ZW50TGlzdGVuZXIoXCJiZWZvcmV1bmxvYWRcIiwgdGhpcy5fYmVmb3JldW5sb2FkRXZlbnRMaXN0ZW5lciwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuaG9zdG5hbWUgIT09IFwibG9jYWxob3N0XCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vZmZsaW5lRXZlbnRMaXN0ZW5lciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25DbG9zZShcInRyYW5zcG9ydCBjbG9zZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJuZXR3b3JrIGNvbm5lY3Rpb24gbG9zdFwiLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE9GRkxJTkVfRVZFTlRfTElTVEVORVJTLnB1c2godGhpcy5fb2ZmbGluZUV2ZW50TGlzdGVuZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdHMud2l0aENyZWRlbnRpYWxzKSB7XG4gICAgICAgICAgICB0aGlzLl9jb29raWVKYXIgPSBjcmVhdGVDb29raWVKYXIoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9vcGVuKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdHJhbnNwb3J0IG9mIHRoZSBnaXZlbiB0eXBlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgLSB0cmFuc3BvcnQgbmFtZVxuICAgICAqIEByZXR1cm4ge1RyYW5zcG9ydH1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNyZWF0ZVRyYW5zcG9ydChuYW1lKSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRzLnF1ZXJ5KTtcbiAgICAgICAgLy8gYXBwZW5kIGVuZ2luZS5pbyBwcm90b2NvbCBpZGVudGlmaWVyXG4gICAgICAgIHF1ZXJ5LkVJTyA9IHByb3RvY29sO1xuICAgICAgICAvLyB0cmFuc3BvcnQgbmFtZVxuICAgICAgICBxdWVyeS50cmFuc3BvcnQgPSBuYW1lO1xuICAgICAgICAvLyBzZXNzaW9uIGlkIGlmIHdlIGFscmVhZHkgaGF2ZSBvbmVcbiAgICAgICAgaWYgKHRoaXMuaWQpXG4gICAgICAgICAgICBxdWVyeS5zaWQgPSB0aGlzLmlkO1xuICAgICAgICBjb25zdCBvcHRzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRzLCB7XG4gICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgIHNvY2tldDogdGhpcyxcbiAgICAgICAgICAgIGhvc3RuYW1lOiB0aGlzLmhvc3RuYW1lLFxuICAgICAgICAgICAgc2VjdXJlOiB0aGlzLnNlY3VyZSxcbiAgICAgICAgICAgIHBvcnQ6IHRoaXMucG9ydCxcbiAgICAgICAgfSwgdGhpcy5vcHRzLnRyYW5zcG9ydE9wdGlvbnNbbmFtZV0pO1xuICAgICAgICByZXR1cm4gbmV3IHRoaXMuX3RyYW5zcG9ydHNCeU5hbWVbbmFtZV0ob3B0cyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIHRyYW5zcG9ydCB0byB1c2UgYW5kIHN0YXJ0cyBwcm9iZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX29wZW4oKSB7XG4gICAgICAgIGlmICh0aGlzLnRyYW5zcG9ydHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBFbWl0IGVycm9yIG9uIG5leHQgdGljayBzbyBpdCBjYW4gYmUgbGlzdGVuZWQgdG9cbiAgICAgICAgICAgIHRoaXMuc2V0VGltZW91dEZuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImVycm9yXCIsIFwiTm8gdHJhbnNwb3J0cyBhdmFpbGFibGVcIik7XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmFuc3BvcnROYW1lID0gdGhpcy5vcHRzLnJlbWVtYmVyVXBncmFkZSAmJlxuICAgICAgICAgICAgU29ja2V0V2l0aG91dFVwZ3JhZGUucHJpb3JXZWJzb2NrZXRTdWNjZXNzICYmXG4gICAgICAgICAgICB0aGlzLnRyYW5zcG9ydHMuaW5kZXhPZihcIndlYnNvY2tldFwiKSAhPT0gLTFcbiAgICAgICAgICAgID8gXCJ3ZWJzb2NrZXRcIlxuICAgICAgICAgICAgOiB0aGlzLnRyYW5zcG9ydHNbMF07XG4gICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IFwib3BlbmluZ1wiO1xuICAgICAgICBjb25zdCB0cmFuc3BvcnQgPSB0aGlzLmNyZWF0ZVRyYW5zcG9ydCh0cmFuc3BvcnROYW1lKTtcbiAgICAgICAgdHJhbnNwb3J0Lm9wZW4oKTtcbiAgICAgICAgdGhpcy5zZXRUcmFuc3BvcnQodHJhbnNwb3J0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgY3VycmVudCB0cmFuc3BvcnQuIERpc2FibGVzIHRoZSBleGlzdGluZyBvbmUgKGlmIGFueSkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHNldFRyYW5zcG9ydCh0cmFuc3BvcnQpIHtcbiAgICAgICAgaWYgKHRoaXMudHJhbnNwb3J0KSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zcG9ydC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzZXQgdXAgdHJhbnNwb3J0XG4gICAgICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0O1xuICAgICAgICAvLyBzZXQgdXAgdHJhbnNwb3J0IGxpc3RlbmVyc1xuICAgICAgICB0cmFuc3BvcnRcbiAgICAgICAgICAgIC5vbihcImRyYWluXCIsIHRoaXMuX29uRHJhaW4uYmluZCh0aGlzKSlcbiAgICAgICAgICAgIC5vbihcInBhY2tldFwiLCB0aGlzLl9vblBhY2tldC5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgLm9uKFwiZXJyb3JcIiwgdGhpcy5fb25FcnJvci5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgLm9uKFwiY2xvc2VcIiwgKHJlYXNvbikgPT4gdGhpcy5fb25DbG9zZShcInRyYW5zcG9ydCBjbG9zZVwiLCByZWFzb24pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gY29ubmVjdGlvbiBpcyBkZWVtZWQgb3Blbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25PcGVuKCkge1xuICAgICAgICB0aGlzLnJlYWR5U3RhdGUgPSBcIm9wZW5cIjtcbiAgICAgICAgU29ja2V0V2l0aG91dFVwZ3JhZGUucHJpb3JXZWJzb2NrZXRTdWNjZXNzID1cbiAgICAgICAgICAgIFwid2Vic29ja2V0XCIgPT09IHRoaXMudHJhbnNwb3J0Lm5hbWU7XG4gICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwib3BlblwiKTtcbiAgICAgICAgdGhpcy5mbHVzaCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIGEgcGFja2V0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfb25QYWNrZXQocGFja2V0KSB7XG4gICAgICAgIGlmIChcIm9wZW5pbmdcIiA9PT0gdGhpcy5yZWFkeVN0YXRlIHx8XG4gICAgICAgICAgICBcIm9wZW5cIiA9PT0gdGhpcy5yZWFkeVN0YXRlIHx8XG4gICAgICAgICAgICBcImNsb3NpbmdcIiA9PT0gdGhpcy5yZWFkeVN0YXRlKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcInBhY2tldFwiLCBwYWNrZXQpO1xuICAgICAgICAgICAgLy8gU29ja2V0IGlzIGxpdmUgLSBhbnkgcGFja2V0IGNvdW50c1xuICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJoZWFydGJlYXRcIik7XG4gICAgICAgICAgICBzd2l0Y2ggKHBhY2tldC50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm9wZW5cIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkhhbmRzaGFrZShKU09OLnBhcnNlKHBhY2tldC5kYXRhKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJwaW5nXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbmRQYWNrZXQoXCJwb25nXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcInBpbmdcIik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwicG9uZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVzZXRQaW5nVGltZW91dCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZXJyb3JcIjpcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKFwic2VydmVyIGVycm9yXCIpO1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGVyci5jb2RlID0gcGFja2V0LmRhdGE7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uRXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJkYXRhXCIsIHBhY2tldC5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJtZXNzYWdlXCIsIHBhY2tldC5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHVwb24gaGFuZHNoYWtlIGNvbXBsZXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIGhhbmRzaGFrZSBvYmpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG9uSGFuZHNoYWtlKGRhdGEpIHtcbiAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJoYW5kc2hha2VcIiwgZGF0YSk7XG4gICAgICAgIHRoaXMuaWQgPSBkYXRhLnNpZDtcbiAgICAgICAgdGhpcy50cmFuc3BvcnQucXVlcnkuc2lkID0gZGF0YS5zaWQ7XG4gICAgICAgIHRoaXMuX3BpbmdJbnRlcnZhbCA9IGRhdGEucGluZ0ludGVydmFsO1xuICAgICAgICB0aGlzLl9waW5nVGltZW91dCA9IGRhdGEucGluZ1RpbWVvdXQ7XG4gICAgICAgIHRoaXMuX21heFBheWxvYWQgPSBkYXRhLm1heFBheWxvYWQ7XG4gICAgICAgIHRoaXMub25PcGVuKCk7XG4gICAgICAgIC8vIEluIGNhc2Ugb3BlbiBoYW5kbGVyIGNsb3NlcyBzb2NrZXRcbiAgICAgICAgaWYgKFwiY2xvc2VkXCIgPT09IHRoaXMucmVhZHlTdGF0ZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5fcmVzZXRQaW5nVGltZW91dCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGFuZCByZXNldHMgcGluZyB0aW1lb3V0IHRpbWVyIGJhc2VkIG9uIHNlcnZlciBwaW5ncy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3Jlc2V0UGluZ1RpbWVvdXQoKSB7XG4gICAgICAgIHRoaXMuY2xlYXJUaW1lb3V0Rm4odGhpcy5fcGluZ1RpbWVvdXRUaW1lcik7XG4gICAgICAgIGNvbnN0IGRlbGF5ID0gdGhpcy5fcGluZ0ludGVydmFsICsgdGhpcy5fcGluZ1RpbWVvdXQ7XG4gICAgICAgIHRoaXMuX3BpbmdUaW1lb3V0VGltZSA9IERhdGUubm93KCkgKyBkZWxheTtcbiAgICAgICAgdGhpcy5fcGluZ1RpbWVvdXRUaW1lciA9IHRoaXMuc2V0VGltZW91dEZuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX29uQ2xvc2UoXCJwaW5nIHRpbWVvdXRcIik7XG4gICAgICAgIH0sIGRlbGF5KTtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5hdXRvVW5yZWYpIHtcbiAgICAgICAgICAgIHRoaXMuX3BpbmdUaW1lb3V0VGltZXIudW5yZWYoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgb24gYGRyYWluYCBldmVudFxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfb25EcmFpbigpIHtcbiAgICAgICAgdGhpcy53cml0ZUJ1ZmZlci5zcGxpY2UoMCwgdGhpcy5fcHJldkJ1ZmZlckxlbik7XG4gICAgICAgIC8vIHNldHRpbmcgcHJldkJ1ZmZlckxlbiA9IDAgaXMgdmVyeSBpbXBvcnRhbnRcbiAgICAgICAgLy8gZm9yIGV4YW1wbGUsIHdoZW4gdXBncmFkaW5nLCB1cGdyYWRlIHBhY2tldCBpcyBzZW50IG92ZXIsXG4gICAgICAgIC8vIGFuZCBhIG5vbnplcm8gcHJldkJ1ZmZlckxlbiBjb3VsZCBjYXVzZSBwcm9ibGVtcyBvbiBgZHJhaW5gXG4gICAgICAgIHRoaXMuX3ByZXZCdWZmZXJMZW4gPSAwO1xuICAgICAgICBpZiAoMCA9PT0gdGhpcy53cml0ZUJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwiZHJhaW5cIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZsdXNoKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRmx1c2ggd3JpdGUgYnVmZmVycy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZmx1c2goKSB7XG4gICAgICAgIGlmIChcImNsb3NlZFwiICE9PSB0aGlzLnJlYWR5U3RhdGUgJiZcbiAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0LndyaXRhYmxlICYmXG4gICAgICAgICAgICAhdGhpcy51cGdyYWRpbmcgJiZcbiAgICAgICAgICAgIHRoaXMud3JpdGVCdWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBwYWNrZXRzID0gdGhpcy5fZ2V0V3JpdGFibGVQYWNrZXRzKCk7XG4gICAgICAgICAgICB0aGlzLnRyYW5zcG9ydC5zZW5kKHBhY2tldHMpO1xuICAgICAgICAgICAgLy8ga2VlcCB0cmFjayBvZiBjdXJyZW50IGxlbmd0aCBvZiB3cml0ZUJ1ZmZlclxuICAgICAgICAgICAgLy8gc3BsaWNlIHdyaXRlQnVmZmVyIGFuZCBjYWxsYmFja0J1ZmZlciBvbiBgZHJhaW5gXG4gICAgICAgICAgICB0aGlzLl9wcmV2QnVmZmVyTGVuID0gcGFja2V0cy5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImZsdXNoXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVuc3VyZSB0aGUgZW5jb2RlZCBzaXplIG9mIHRoZSB3cml0ZUJ1ZmZlciBpcyBiZWxvdyB0aGUgbWF4UGF5bG9hZCB2YWx1ZSBzZW50IGJ5IHRoZSBzZXJ2ZXIgKG9ubHkgZm9yIEhUVFBcbiAgICAgKiBsb25nLXBvbGxpbmcpXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9nZXRXcml0YWJsZVBhY2tldHMoKSB7XG4gICAgICAgIGNvbnN0IHNob3VsZENoZWNrUGF5bG9hZFNpemUgPSB0aGlzLl9tYXhQYXlsb2FkICYmXG4gICAgICAgICAgICB0aGlzLnRyYW5zcG9ydC5uYW1lID09PSBcInBvbGxpbmdcIiAmJlxuICAgICAgICAgICAgdGhpcy53cml0ZUJ1ZmZlci5sZW5ndGggPiAxO1xuICAgICAgICBpZiAoIXNob3VsZENoZWNrUGF5bG9hZFNpemUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLndyaXRlQnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwYXlsb2FkU2l6ZSA9IDE7IC8vIGZpcnN0IHBhY2tldCB0eXBlXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy53cml0ZUJ1ZmZlci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMud3JpdGVCdWZmZXJbaV0uZGF0YTtcbiAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZFNpemUgKz0gYnl0ZUxlbmd0aChkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpID4gMCAmJiBwYXlsb2FkU2l6ZSA+IHRoaXMuX21heFBheWxvYWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy53cml0ZUJ1ZmZlci5zbGljZSgwLCBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBheWxvYWRTaXplICs9IDI7IC8vIHNlcGFyYXRvciArIHBhY2tldCB0eXBlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMud3JpdGVCdWZmZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBoZWFydGJlYXQgdGltZXIgaGFzIGV4cGlyZWQgYnV0IHRoZSBzb2NrZXQgaGFzIG5vdCB5ZXQgYmVlbiBub3RpZmllZC5cbiAgICAgKlxuICAgICAqIE5vdGU6IHRoaXMgbWV0aG9kIGlzIHByaXZhdGUgZm9yIG5vdyBiZWNhdXNlIGl0IGRvZXMgbm90IHJlYWxseSBmaXQgdGhlIFdlYlNvY2tldCBBUEksIGJ1dCBpZiB3ZSBwdXQgaXQgaW4gdGhlXG4gICAgICogYHdyaXRlKClgIG1ldGhvZCB0aGVuIHRoZSBtZXNzYWdlIHdvdWxkIG5vdCBiZSBidWZmZXJlZCBieSB0aGUgU29ja2V0LklPIGNsaWVudC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICAvKiBwcml2YXRlICovIF9oYXNQaW5nRXhwaXJlZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9waW5nVGltZW91dFRpbWUpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY29uc3QgaGFzRXhwaXJlZCA9IERhdGUubm93KCkgPiB0aGlzLl9waW5nVGltZW91dFRpbWU7XG4gICAgICAgIGlmIChoYXNFeHBpcmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9waW5nVGltZW91dFRpbWUgPSAwO1xuICAgICAgICAgICAgbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX29uQ2xvc2UoXCJwaW5nIHRpbWVvdXRcIik7XG4gICAgICAgICAgICB9LCB0aGlzLnNldFRpbWVvdXRGbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhc0V4cGlyZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIGEgbWVzc2FnZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgLSBtZXNzYWdlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAgICogQHJldHVybiB7U29ja2V0fSBmb3IgY2hhaW5pbmcuXG4gICAgICovXG4gICAgd3JpdGUobXNnLCBvcHRpb25zLCBmbikge1xuICAgICAgICB0aGlzLl9zZW5kUGFja2V0KFwibWVzc2FnZVwiLCBtc2csIG9wdGlvbnMsIGZuKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIGEgbWVzc2FnZS4gQWxpYXMgb2Yge0BsaW5rIFNvY2tldCN3cml0ZX0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbXNnIC0gbWVzc2FnZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm4ge1NvY2tldH0gZm9yIGNoYWluaW5nLlxuICAgICAqL1xuICAgIHNlbmQobXNnLCBvcHRpb25zLCBmbikge1xuICAgICAgICB0aGlzLl9zZW5kUGFja2V0KFwibWVzc2FnZVwiLCBtc2csIG9wdGlvbnMsIGZuKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIGEgcGFja2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGU6IHBhY2tldCB0eXBlLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBkYXRhLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfc2VuZFBhY2tldCh0eXBlLCBkYXRhLCBvcHRpb25zLCBmbikge1xuICAgICAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgZGF0YSkge1xuICAgICAgICAgICAgZm4gPSBkYXRhO1xuICAgICAgICAgICAgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2Ygb3B0aW9ucykge1xuICAgICAgICAgICAgZm4gPSBvcHRpb25zO1xuICAgICAgICAgICAgb3B0aW9ucyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFwiY2xvc2luZ1wiID09PSB0aGlzLnJlYWR5U3RhdGUgfHwgXCJjbG9zZWRcIiA9PT0gdGhpcy5yZWFkeVN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIG9wdGlvbnMuY29tcHJlc3MgPSBmYWxzZSAhPT0gb3B0aW9ucy5jb21wcmVzcztcbiAgICAgICAgY29uc3QgcGFja2V0ID0ge1xuICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcInBhY2tldENyZWF0ZVwiLCBwYWNrZXQpO1xuICAgICAgICB0aGlzLndyaXRlQnVmZmVyLnB1c2gocGFja2V0KTtcbiAgICAgICAgaWYgKGZuKVxuICAgICAgICAgICAgdGhpcy5vbmNlKFwiZmx1c2hcIiwgZm4pO1xuICAgICAgICB0aGlzLmZsdXNoKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb3NlcyB0aGUgY29ubmVjdGlvbi5cbiAgICAgKi9cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgY29uc3QgY2xvc2UgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9vbkNsb3NlKFwiZm9yY2VkIGNsb3NlXCIpO1xuICAgICAgICAgICAgdGhpcy50cmFuc3BvcnQuY2xvc2UoKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgY2xlYW51cEFuZENsb3NlID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vZmYoXCJ1cGdyYWRlXCIsIGNsZWFudXBBbmRDbG9zZSk7XG4gICAgICAgICAgICB0aGlzLm9mZihcInVwZ3JhZGVFcnJvclwiLCBjbGVhbnVwQW5kQ2xvc2UpO1xuICAgICAgICAgICAgY2xvc2UoKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgd2FpdEZvclVwZ3JhZGUgPSAoKSA9PiB7XG4gICAgICAgICAgICAvLyB3YWl0IGZvciB1cGdyYWRlIHRvIGZpbmlzaCBzaW5jZSB3ZSBjYW4ndCBzZW5kIHBhY2tldHMgd2hpbGUgcGF1c2luZyBhIHRyYW5zcG9ydFxuICAgICAgICAgICAgdGhpcy5vbmNlKFwidXBncmFkZVwiLCBjbGVhbnVwQW5kQ2xvc2UpO1xuICAgICAgICAgICAgdGhpcy5vbmNlKFwidXBncmFkZUVycm9yXCIsIGNsZWFudXBBbmRDbG9zZSk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChcIm9wZW5pbmdcIiA9PT0gdGhpcy5yZWFkeVN0YXRlIHx8IFwib3BlblwiID09PSB0aGlzLnJlYWR5U3RhdGUpIHtcbiAgICAgICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IFwiY2xvc2luZ1wiO1xuICAgICAgICAgICAgaWYgKHRoaXMud3JpdGVCdWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbmNlKFwiZHJhaW5cIiwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy51cGdyYWRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRGb3JVcGdyYWRlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnVwZ3JhZGluZykge1xuICAgICAgICAgICAgICAgIHdhaXRGb3JVcGdyYWRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjbG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiB0cmFuc3BvcnQgZXJyb3JcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX29uRXJyb3IoZXJyKSB7XG4gICAgICAgIFNvY2tldFdpdGhvdXRVcGdyYWRlLnByaW9yV2Vic29ja2V0U3VjY2VzcyA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5vcHRzLnRyeUFsbFRyYW5zcG9ydHMgJiZcbiAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0cy5sZW5ndGggPiAxICYmXG4gICAgICAgICAgICB0aGlzLnJlYWR5U3RhdGUgPT09IFwib3BlbmluZ1wiKSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zcG9ydHMuc2hpZnQoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9vcGVuKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJlcnJvclwiLCBlcnIpO1xuICAgICAgICB0aGlzLl9vbkNsb3NlKFwidHJhbnNwb3J0IGVycm9yXCIsIGVycik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIHRyYW5zcG9ydCBjbG9zZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX29uQ2xvc2UocmVhc29uLCBkZXNjcmlwdGlvbikge1xuICAgICAgICBpZiAoXCJvcGVuaW5nXCIgPT09IHRoaXMucmVhZHlTdGF0ZSB8fFxuICAgICAgICAgICAgXCJvcGVuXCIgPT09IHRoaXMucmVhZHlTdGF0ZSB8fFxuICAgICAgICAgICAgXCJjbG9zaW5nXCIgPT09IHRoaXMucmVhZHlTdGF0ZSkge1xuICAgICAgICAgICAgLy8gY2xlYXIgdGltZXJzXG4gICAgICAgICAgICB0aGlzLmNsZWFyVGltZW91dEZuKHRoaXMuX3BpbmdUaW1lb3V0VGltZXIpO1xuICAgICAgICAgICAgLy8gc3RvcCBldmVudCBmcm9tIGZpcmluZyBhZ2FpbiBmb3IgdHJhbnNwb3J0XG4gICAgICAgICAgICB0aGlzLnRyYW5zcG9ydC5yZW1vdmVBbGxMaXN0ZW5lcnMoXCJjbG9zZVwiKTtcbiAgICAgICAgICAgIC8vIGVuc3VyZSB0cmFuc3BvcnQgd29uJ3Qgc3RheSBvcGVuXG4gICAgICAgICAgICB0aGlzLnRyYW5zcG9ydC5jbG9zZSgpO1xuICAgICAgICAgICAgLy8gaWdub3JlIGZ1cnRoZXIgdHJhbnNwb3J0IGNvbW11bmljYXRpb25cbiAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICAgICAgaWYgKHdpdGhFdmVudExpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9iZWZvcmV1bmxvYWRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoXCJiZWZvcmV1bmxvYWRcIiwgdGhpcy5fYmVmb3JldW5sb2FkRXZlbnRMaXN0ZW5lciwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fb2ZmbGluZUV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IE9GRkxJTkVfRVZFTlRfTElTVEVORVJTLmluZGV4T2YodGhpcy5fb2ZmbGluZUV2ZW50TGlzdGVuZXIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIE9GRkxJTkVfRVZFTlRfTElTVEVORVJTLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHNldCByZWFkeSBzdGF0ZVxuICAgICAgICAgICAgdGhpcy5yZWFkeVN0YXRlID0gXCJjbG9zZWRcIjtcbiAgICAgICAgICAgIC8vIGNsZWFyIHNlc3Npb24gaWRcbiAgICAgICAgICAgIHRoaXMuaWQgPSBudWxsO1xuICAgICAgICAgICAgLy8gZW1pdCBjbG9zZSBldmVudFxuICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJjbG9zZVwiLCByZWFzb24sIGRlc2NyaXB0aW9uKTtcbiAgICAgICAgICAgIC8vIGNsZWFuIGJ1ZmZlcnMgYWZ0ZXIsIHNvIHVzZXJzIGNhbiBzdGlsbFxuICAgICAgICAgICAgLy8gZ3JhYiB0aGUgYnVmZmVycyBvbiBgY2xvc2VgIGV2ZW50XG4gICAgICAgICAgICB0aGlzLndyaXRlQnVmZmVyID0gW107XG4gICAgICAgICAgICB0aGlzLl9wcmV2QnVmZmVyTGVuID0gMDtcbiAgICAgICAgfVxuICAgIH1cbn1cblNvY2tldFdpdGhvdXRVcGdyYWRlLnByb3RvY29sID0gcHJvdG9jb2w7XG4vKipcbiAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBXZWJTb2NrZXQtbGlrZSBpbnRlcmZhY2UgdG8gY29ubmVjdCB0byBhbiBFbmdpbmUuSU8gc2VydmVyLiBUaGUgY29ubmVjdGlvbiB3aWxsIGJlIGVzdGFibGlzaGVkXG4gKiB3aXRoIG9uZSBvZiB0aGUgYXZhaWxhYmxlIGxvdy1sZXZlbCB0cmFuc3BvcnRzLCBsaWtlIEhUVFAgbG9uZy1wb2xsaW5nLCBXZWJTb2NrZXQgb3IgV2ViVHJhbnNwb3J0LlxuICpcbiAqIFRoaXMgY2xhc3MgY29tZXMgd2l0aCBhbiB1cGdyYWRlIG1lY2hhbmlzbSwgd2hpY2ggbWVhbnMgdGhhdCBvbmNlIHRoZSBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkIHdpdGggdGhlIGZpcnN0XG4gKiBsb3ctbGV2ZWwgdHJhbnNwb3J0LCBpdCB3aWxsIHRyeSB0byB1cGdyYWRlIHRvIGEgYmV0dGVyIHRyYW5zcG9ydC5cbiAqXG4gKiBJbiBvcmRlciB0byBhbGxvdyB0cmVlLXNoYWtpbmcsIHRoZXJlIGFyZSBubyB0cmFuc3BvcnRzIGluY2x1ZGVkLCB0aGF0J3Mgd2h5IHRoZSBgdHJhbnNwb3J0c2Agb3B0aW9uIGlzIG1hbmRhdG9yeS5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgU29ja2V0V2l0aFVwZ3JhZGUsIFdlYlNvY2tldCB9IGZyb20gXCJlbmdpbmUuaW8tY2xpZW50XCI7XG4gKlxuICogY29uc3Qgc29ja2V0ID0gbmV3IFNvY2tldFdpdGhVcGdyYWRlKHtcbiAqICAgdHJhbnNwb3J0czogW1dlYlNvY2tldF1cbiAqIH0pO1xuICpcbiAqIHNvY2tldC5vbihcIm9wZW5cIiwgKCkgPT4ge1xuICogICBzb2NrZXQuc2VuZChcImhlbGxvXCIpO1xuICogfSk7XG4gKlxuICogQHNlZSBTb2NrZXRXaXRob3V0VXBncmFkZVxuICogQHNlZSBTb2NrZXRcbiAqL1xuZXhwb3J0IGNsYXNzIFNvY2tldFdpdGhVcGdyYWRlIGV4dGVuZHMgU29ja2V0V2l0aG91dFVwZ3JhZGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLl91cGdyYWRlcyA9IFtdO1xuICAgIH1cbiAgICBvbk9wZW4oKSB7XG4gICAgICAgIHN1cGVyLm9uT3BlbigpO1xuICAgICAgICBpZiAoXCJvcGVuXCIgPT09IHRoaXMucmVhZHlTdGF0ZSAmJiB0aGlzLm9wdHMudXBncmFkZSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl91cGdyYWRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Byb2JlKHRoaXMuX3VwZ3JhZGVzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm9iZXMgYSB0cmFuc3BvcnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSAtIHRyYW5zcG9ydCBuYW1lXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfcHJvYmUobmFtZSkge1xuICAgICAgICBsZXQgdHJhbnNwb3J0ID0gdGhpcy5jcmVhdGVUcmFuc3BvcnQobmFtZSk7XG4gICAgICAgIGxldCBmYWlsZWQgPSBmYWxzZTtcbiAgICAgICAgU29ja2V0V2l0aG91dFVwZ3JhZGUucHJpb3JXZWJzb2NrZXRTdWNjZXNzID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IG9uVHJhbnNwb3J0T3BlbiA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChmYWlsZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdHJhbnNwb3J0LnNlbmQoW3sgdHlwZTogXCJwaW5nXCIsIGRhdGE6IFwicHJvYmVcIiB9XSk7XG4gICAgICAgICAgICB0cmFuc3BvcnQub25jZShcInBhY2tldFwiLCAobXNnKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGZhaWxlZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlmIChcInBvbmdcIiA9PT0gbXNnLnR5cGUgJiYgXCJwcm9iZVwiID09PSBtc2cuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZ3JhZGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwidXBncmFkaW5nXCIsIHRyYW5zcG9ydCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdHJhbnNwb3J0KVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBTb2NrZXRXaXRob3V0VXBncmFkZS5wcmlvcldlYnNvY2tldFN1Y2Nlc3MgPVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ3ZWJzb2NrZXRcIiA9PT0gdHJhbnNwb3J0Lm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0LnBhdXNlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWlsZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFwiY2xvc2VkXCIgPT09IHRoaXMucmVhZHlTdGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFRyYW5zcG9ydCh0cmFuc3BvcnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LnNlbmQoW3sgdHlwZTogXCJ1cGdyYWRlXCIgfV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJ1cGdyYWRlXCIsIHRyYW5zcG9ydCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGdyYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmx1c2goKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoXCJwcm9iZSBlcnJvclwiKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBlcnIudHJhbnNwb3J0ID0gdHJhbnNwb3J0Lm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwidXBncmFkZUVycm9yXCIsIGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGZ1bmN0aW9uIGZyZWV6ZVRyYW5zcG9ydCgpIHtcbiAgICAgICAgICAgIGlmIChmYWlsZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy8gQW55IGNhbGxiYWNrIGNhbGxlZCBieSB0cmFuc3BvcnQgc2hvdWxkIGJlIGlnbm9yZWQgc2luY2Ugbm93XG4gICAgICAgICAgICBmYWlsZWQgPSB0cnVlO1xuICAgICAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICAgICAgdHJhbnNwb3J0LmNsb3NlKCk7XG4gICAgICAgICAgICB0cmFuc3BvcnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIEhhbmRsZSBhbnkgZXJyb3IgdGhhdCBoYXBwZW5zIHdoaWxlIHByb2JpbmdcbiAgICAgICAgY29uc3Qgb25lcnJvciA9IChlcnIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKFwicHJvYmUgZXJyb3I6IFwiICsgZXJyKTtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGVycm9yLnRyYW5zcG9ydCA9IHRyYW5zcG9ydC5uYW1lO1xuICAgICAgICAgICAgZnJlZXplVHJhbnNwb3J0KCk7XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcInVwZ3JhZGVFcnJvclwiLCBlcnJvcik7XG4gICAgICAgIH07XG4gICAgICAgIGZ1bmN0aW9uIG9uVHJhbnNwb3J0Q2xvc2UoKSB7XG4gICAgICAgICAgICBvbmVycm9yKFwidHJhbnNwb3J0IGNsb3NlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXaGVuIHRoZSBzb2NrZXQgaXMgY2xvc2VkIHdoaWxlIHdlJ3JlIHByb2JpbmdcbiAgICAgICAgZnVuY3Rpb24gb25jbG9zZSgpIHtcbiAgICAgICAgICAgIG9uZXJyb3IoXCJzb2NrZXQgY2xvc2VkXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdoZW4gdGhlIHNvY2tldCBpcyB1cGdyYWRlZCB3aGlsZSB3ZSdyZSBwcm9iaW5nXG4gICAgICAgIGZ1bmN0aW9uIG9udXBncmFkZSh0bykge1xuICAgICAgICAgICAgaWYgKHRyYW5zcG9ydCAmJiB0by5uYW1lICE9PSB0cmFuc3BvcnQubmFtZSkge1xuICAgICAgICAgICAgICAgIGZyZWV6ZVRyYW5zcG9ydCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFJlbW92ZSBhbGwgbGlzdGVuZXJzIG9uIHRoZSB0cmFuc3BvcnQgYW5kIG9uIHNlbGZcbiAgICAgICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgICAgIHRyYW5zcG9ydC5yZW1vdmVMaXN0ZW5lcihcIm9wZW5cIiwgb25UcmFuc3BvcnRPcGVuKTtcbiAgICAgICAgICAgIHRyYW5zcG9ydC5yZW1vdmVMaXN0ZW5lcihcImVycm9yXCIsIG9uZXJyb3IpO1xuICAgICAgICAgICAgdHJhbnNwb3J0LnJlbW92ZUxpc3RlbmVyKFwiY2xvc2VcIiwgb25UcmFuc3BvcnRDbG9zZSk7XG4gICAgICAgICAgICB0aGlzLm9mZihcImNsb3NlXCIsIG9uY2xvc2UpO1xuICAgICAgICAgICAgdGhpcy5vZmYoXCJ1cGdyYWRpbmdcIiwgb251cGdyYWRlKTtcbiAgICAgICAgfTtcbiAgICAgICAgdHJhbnNwb3J0Lm9uY2UoXCJvcGVuXCIsIG9uVHJhbnNwb3J0T3Blbik7XG4gICAgICAgIHRyYW5zcG9ydC5vbmNlKFwiZXJyb3JcIiwgb25lcnJvcik7XG4gICAgICAgIHRyYW5zcG9ydC5vbmNlKFwiY2xvc2VcIiwgb25UcmFuc3BvcnRDbG9zZSk7XG4gICAgICAgIHRoaXMub25jZShcImNsb3NlXCIsIG9uY2xvc2UpO1xuICAgICAgICB0aGlzLm9uY2UoXCJ1cGdyYWRpbmdcIiwgb251cGdyYWRlKTtcbiAgICAgICAgaWYgKHRoaXMuX3VwZ3JhZGVzLmluZGV4T2YoXCJ3ZWJ0cmFuc3BvcnRcIikgIT09IC0xICYmXG4gICAgICAgICAgICBuYW1lICE9PSBcIndlYnRyYW5zcG9ydFwiKSB7XG4gICAgICAgICAgICAvLyBmYXZvciBXZWJUcmFuc3BvcnRcbiAgICAgICAgICAgIHRoaXMuc2V0VGltZW91dEZuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWZhaWxlZCkge1xuICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQub3BlbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIDIwMCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0cmFuc3BvcnQub3BlbigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9uSGFuZHNoYWtlKGRhdGEpIHtcbiAgICAgICAgdGhpcy5fdXBncmFkZXMgPSB0aGlzLl9maWx0ZXJVcGdyYWRlcyhkYXRhLnVwZ3JhZGVzKTtcbiAgICAgICAgc3VwZXIub25IYW5kc2hha2UoZGF0YSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZpbHRlcnMgdXBncmFkZXMsIHJldHVybmluZyBvbmx5IHRob3NlIG1hdGNoaW5nIGNsaWVudCB0cmFuc3BvcnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheX0gdXBncmFkZXMgLSBzZXJ2ZXIgdXBncmFkZXNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9maWx0ZXJVcGdyYWRlcyh1cGdyYWRlcykge1xuICAgICAgICBjb25zdCBmaWx0ZXJlZFVwZ3JhZGVzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdXBncmFkZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh+dGhpcy50cmFuc3BvcnRzLmluZGV4T2YodXBncmFkZXNbaV0pKVxuICAgICAgICAgICAgICAgIGZpbHRlcmVkVXBncmFkZXMucHVzaCh1cGdyYWRlc1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbHRlcmVkVXBncmFkZXM7XG4gICAgfVxufVxuLyoqXG4gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgV2ViU29ja2V0LWxpa2UgaW50ZXJmYWNlIHRvIGNvbm5lY3QgdG8gYW4gRW5naW5lLklPIHNlcnZlci4gVGhlIGNvbm5lY3Rpb24gd2lsbCBiZSBlc3RhYmxpc2hlZFxuICogd2l0aCBvbmUgb2YgdGhlIGF2YWlsYWJsZSBsb3ctbGV2ZWwgdHJhbnNwb3J0cywgbGlrZSBIVFRQIGxvbmctcG9sbGluZywgV2ViU29ja2V0IG9yIFdlYlRyYW5zcG9ydC5cbiAqXG4gKiBUaGlzIGNsYXNzIGNvbWVzIHdpdGggYW4gdXBncmFkZSBtZWNoYW5pc20sIHdoaWNoIG1lYW5zIHRoYXQgb25jZSB0aGUgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCB3aXRoIHRoZSBmaXJzdFxuICogbG93LWxldmVsIHRyYW5zcG9ydCwgaXQgd2lsbCB0cnkgdG8gdXBncmFkZSB0byBhIGJldHRlciB0cmFuc3BvcnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IFNvY2tldCB9IGZyb20gXCJlbmdpbmUuaW8tY2xpZW50XCI7XG4gKlxuICogY29uc3Qgc29ja2V0ID0gbmV3IFNvY2tldCgpO1xuICpcbiAqIHNvY2tldC5vbihcIm9wZW5cIiwgKCkgPT4ge1xuICogICBzb2NrZXQuc2VuZChcImhlbGxvXCIpO1xuICogfSk7XG4gKlxuICogQHNlZSBTb2NrZXRXaXRob3V0VXBncmFkZVxuICogQHNlZSBTb2NrZXRXaXRoVXBncmFkZVxuICovXG5leHBvcnQgY2xhc3MgU29ja2V0IGV4dGVuZHMgU29ja2V0V2l0aFVwZ3JhZGUge1xuICAgIGNvbnN0cnVjdG9yKHVyaSwgb3B0cyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IG8gPSB0eXBlb2YgdXJpID09PSBcIm9iamVjdFwiID8gdXJpIDogb3B0cztcbiAgICAgICAgaWYgKCFvLnRyYW5zcG9ydHMgfHxcbiAgICAgICAgICAgIChvLnRyYW5zcG9ydHMgJiYgdHlwZW9mIG8udHJhbnNwb3J0c1swXSA9PT0gXCJzdHJpbmdcIikpIHtcbiAgICAgICAgICAgIG8udHJhbnNwb3J0cyA9IChvLnRyYW5zcG9ydHMgfHwgW1wicG9sbGluZ1wiLCBcIndlYnNvY2tldFwiLCBcIndlYnRyYW5zcG9ydFwiXSlcbiAgICAgICAgICAgICAgICAubWFwKCh0cmFuc3BvcnROYW1lKSA9PiBERUZBVUxUX1RSQU5TUE9SVFNbdHJhbnNwb3J0TmFtZV0pXG4gICAgICAgICAgICAgICAgLmZpbHRlcigodCkgPT4gISF0KTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlcih1cmksIG8pO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBTb2NrZXQgfSBmcm9tIFwiLi9zb2NrZXQuanNcIjtcbmV4cG9ydCB7IFNvY2tldCB9O1xuZXhwb3J0IHsgU29ja2V0V2l0aG91dFVwZ3JhZGUsIFNvY2tldFdpdGhVcGdyYWRlLCB9IGZyb20gXCIuL3NvY2tldC5qc1wiO1xuZXhwb3J0IGNvbnN0IHByb3RvY29sID0gU29ja2V0LnByb3RvY29sO1xuZXhwb3J0IHsgVHJhbnNwb3J0LCBUcmFuc3BvcnRFcnJvciB9IGZyb20gXCIuL3RyYW5zcG9ydC5qc1wiO1xuZXhwb3J0IHsgdHJhbnNwb3J0cyB9IGZyb20gXCIuL3RyYW5zcG9ydHMvaW5kZXguanNcIjtcbmV4cG9ydCB7IGluc3RhbGxUaW1lckZ1bmN0aW9ucyB9IGZyb20gXCIuL3V0aWwuanNcIjtcbmV4cG9ydCB7IHBhcnNlIH0gZnJvbSBcIi4vY29udHJpYi9wYXJzZXVyaS5qc1wiO1xuZXhwb3J0IHsgbmV4dFRpY2sgfSBmcm9tIFwiLi9nbG9iYWxzLm5vZGUuanNcIjtcbmV4cG9ydCB7IEZldGNoIH0gZnJvbSBcIi4vdHJhbnNwb3J0cy9wb2xsaW5nLWZldGNoLmpzXCI7XG5leHBvcnQgeyBYSFIgYXMgTm9kZVhIUiB9IGZyb20gXCIuL3RyYW5zcG9ydHMvcG9sbGluZy14aHIubm9kZS5qc1wiO1xuZXhwb3J0IHsgWEhSIH0gZnJvbSBcIi4vdHJhbnNwb3J0cy9wb2xsaW5nLXhoci5qc1wiO1xuZXhwb3J0IHsgV1MgYXMgTm9kZVdlYlNvY2tldCB9IGZyb20gXCIuL3RyYW5zcG9ydHMvd2Vic29ja2V0Lm5vZGUuanNcIjtcbmV4cG9ydCB7IFdTIGFzIFdlYlNvY2tldCB9IGZyb20gXCIuL3RyYW5zcG9ydHMvd2Vic29ja2V0LmpzXCI7XG5leHBvcnQgeyBXVCBhcyBXZWJUcmFuc3BvcnQgfSBmcm9tIFwiLi90cmFuc3BvcnRzL3dlYnRyYW5zcG9ydC5qc1wiO1xuIiwgImltcG9ydCB7IHBhcnNlIH0gZnJvbSBcImVuZ2luZS5pby1jbGllbnRcIjtcbi8qKlxuICogVVJMIHBhcnNlci5cbiAqXG4gKiBAcGFyYW0gdXJpIC0gdXJsXG4gKiBAcGFyYW0gcGF0aCAtIHRoZSByZXF1ZXN0IHBhdGggb2YgdGhlIGNvbm5lY3Rpb25cbiAqIEBwYXJhbSBsb2MgLSBBbiBvYmplY3QgbWVhbnQgdG8gbWltaWMgd2luZG93LmxvY2F0aW9uLlxuICogICAgICAgIERlZmF1bHRzIHRvIHdpbmRvdy5sb2NhdGlvbi5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVybCh1cmksIHBhdGggPSBcIlwiLCBsb2MpIHtcbiAgICBsZXQgb2JqID0gdXJpO1xuICAgIC8vIGRlZmF1bHQgdG8gd2luZG93LmxvY2F0aW9uXG4gICAgbG9jID0gbG9jIHx8ICh0eXBlb2YgbG9jYXRpb24gIT09IFwidW5kZWZpbmVkXCIgJiYgbG9jYXRpb24pO1xuICAgIGlmIChudWxsID09IHVyaSlcbiAgICAgICAgdXJpID0gbG9jLnByb3RvY29sICsgXCIvL1wiICsgbG9jLmhvc3Q7XG4gICAgLy8gcmVsYXRpdmUgcGF0aCBzdXBwb3J0XG4gICAgaWYgKHR5cGVvZiB1cmkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgaWYgKFwiL1wiID09PSB1cmkuY2hhckF0KDApKSB7XG4gICAgICAgICAgICBpZiAoXCIvXCIgPT09IHVyaS5jaGFyQXQoMSkpIHtcbiAgICAgICAgICAgICAgICB1cmkgPSBsb2MucHJvdG9jb2wgKyB1cmk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB1cmkgPSBsb2MuaG9zdCArIHVyaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIS9eKGh0dHBzP3x3c3M/KTpcXC9cXC8vLnRlc3QodXJpKSkge1xuICAgICAgICAgICAgaWYgKFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiBsb2MpIHtcbiAgICAgICAgICAgICAgICB1cmkgPSBsb2MucHJvdG9jb2wgKyBcIi8vXCIgKyB1cmk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB1cmkgPSBcImh0dHBzOi8vXCIgKyB1cmk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gcGFyc2VcbiAgICAgICAgb2JqID0gcGFyc2UodXJpKTtcbiAgICB9XG4gICAgLy8gbWFrZSBzdXJlIHdlIHRyZWF0IGBsb2NhbGhvc3Q6ODBgIGFuZCBgbG9jYWxob3N0YCBlcXVhbGx5XG4gICAgaWYgKCFvYmoucG9ydCkge1xuICAgICAgICBpZiAoL14oaHR0cHx3cykkLy50ZXN0KG9iai5wcm90b2NvbCkpIHtcbiAgICAgICAgICAgIG9iai5wb3J0ID0gXCI4MFwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKC9eKGh0dHB8d3MpcyQvLnRlc3Qob2JqLnByb3RvY29sKSkge1xuICAgICAgICAgICAgb2JqLnBvcnQgPSBcIjQ0M1wiO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9iai5wYXRoID0gb2JqLnBhdGggfHwgXCIvXCI7XG4gICAgY29uc3QgaXB2NiA9IG9iai5ob3N0LmluZGV4T2YoXCI6XCIpICE9PSAtMTtcbiAgICBjb25zdCBob3N0ID0gaXB2NiA/IFwiW1wiICsgb2JqLmhvc3QgKyBcIl1cIiA6IG9iai5ob3N0O1xuICAgIC8vIGRlZmluZSB1bmlxdWUgaWRcbiAgICBvYmouaWQgPSBvYmoucHJvdG9jb2wgKyBcIjovL1wiICsgaG9zdCArIFwiOlwiICsgb2JqLnBvcnQgKyBwYXRoO1xuICAgIC8vIGRlZmluZSBocmVmXG4gICAgb2JqLmhyZWYgPVxuICAgICAgICBvYmoucHJvdG9jb2wgK1xuICAgICAgICAgICAgXCI6Ly9cIiArXG4gICAgICAgICAgICBob3N0ICtcbiAgICAgICAgICAgIChsb2MgJiYgbG9jLnBvcnQgPT09IG9iai5wb3J0ID8gXCJcIiA6IFwiOlwiICsgb2JqLnBvcnQpO1xuICAgIHJldHVybiBvYmo7XG59XG4iLCAiaW1wb3J0IHsgRW1pdHRlciB9IGZyb20gXCJAc29ja2V0LmlvL2NvbXBvbmVudC1lbWl0dGVyXCI7XG5pbXBvcnQgeyBkZWNvbnN0cnVjdFBhY2tldCwgcmVjb25zdHJ1Y3RQYWNrZXQgfSBmcm9tIFwiLi9iaW5hcnkuanNcIjtcbmltcG9ydCB7IGlzQmluYXJ5LCBoYXNCaW5hcnkgfSBmcm9tIFwiLi9pcy1iaW5hcnkuanNcIjtcbi8qKlxuICogVGhlc2Ugc3RyaW5ncyBtdXN0IG5vdCBiZSB1c2VkIGFzIGV2ZW50IG5hbWVzLCBhcyB0aGV5IGhhdmUgYSBzcGVjaWFsIG1lYW5pbmcuXG4gKi9cbmNvbnN0IFJFU0VSVkVEX0VWRU5UUyA9IFtcbiAgICBcImNvbm5lY3RcIixcbiAgICBcImNvbm5lY3RfZXJyb3JcIixcbiAgICBcImRpc2Nvbm5lY3RcIixcbiAgICBcImRpc2Nvbm5lY3RpbmdcIixcbiAgICBcIm5ld0xpc3RlbmVyXCIsXG4gICAgXCJyZW1vdmVMaXN0ZW5lclwiLCAvLyB1c2VkIGJ5IHRoZSBOb2RlLmpzIEV2ZW50RW1pdHRlclxuXTtcbi8qKlxuICogUHJvdG9jb2wgdmVyc2lvbi5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBwcm90b2NvbCA9IDU7XG5leHBvcnQgdmFyIFBhY2tldFR5cGU7XG4oZnVuY3Rpb24gKFBhY2tldFR5cGUpIHtcbiAgICBQYWNrZXRUeXBlW1BhY2tldFR5cGVbXCJDT05ORUNUXCJdID0gMF0gPSBcIkNPTk5FQ1RcIjtcbiAgICBQYWNrZXRUeXBlW1BhY2tldFR5cGVbXCJESVNDT05ORUNUXCJdID0gMV0gPSBcIkRJU0NPTk5FQ1RcIjtcbiAgICBQYWNrZXRUeXBlW1BhY2tldFR5cGVbXCJFVkVOVFwiXSA9IDJdID0gXCJFVkVOVFwiO1xuICAgIFBhY2tldFR5cGVbUGFja2V0VHlwZVtcIkFDS1wiXSA9IDNdID0gXCJBQ0tcIjtcbiAgICBQYWNrZXRUeXBlW1BhY2tldFR5cGVbXCJDT05ORUNUX0VSUk9SXCJdID0gNF0gPSBcIkNPTk5FQ1RfRVJST1JcIjtcbiAgICBQYWNrZXRUeXBlW1BhY2tldFR5cGVbXCJCSU5BUllfRVZFTlRcIl0gPSA1XSA9IFwiQklOQVJZX0VWRU5UXCI7XG4gICAgUGFja2V0VHlwZVtQYWNrZXRUeXBlW1wiQklOQVJZX0FDS1wiXSA9IDZdID0gXCJCSU5BUllfQUNLXCI7XG59KShQYWNrZXRUeXBlIHx8IChQYWNrZXRUeXBlID0ge30pKTtcbi8qKlxuICogQSBzb2NrZXQuaW8gRW5jb2RlciBpbnN0YW5jZVxuICovXG5leHBvcnQgY2xhc3MgRW5jb2RlciB7XG4gICAgLyoqXG4gICAgICogRW5jb2RlciBjb25zdHJ1Y3RvclxuICAgICAqXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gcmVwbGFjZXIgLSBjdXN0b20gcmVwbGFjZXIgdG8gcGFzcyBkb3duIHRvIEpTT04ucGFyc2VcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihyZXBsYWNlcikge1xuICAgICAgICB0aGlzLnJlcGxhY2VyID0gcmVwbGFjZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVuY29kZSBhIHBhY2tldCBhcyBhIHNpbmdsZSBzdHJpbmcgaWYgbm9uLWJpbmFyeSwgb3IgYXMgYVxuICAgICAqIGJ1ZmZlciBzZXF1ZW5jZSwgZGVwZW5kaW5nIG9uIHBhY2tldCB0eXBlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iaiAtIHBhY2tldCBvYmplY3RcbiAgICAgKi9cbiAgICBlbmNvZGUob2JqKSB7XG4gICAgICAgIGlmIChvYmoudHlwZSA9PT0gUGFja2V0VHlwZS5FVkVOVCB8fCBvYmoudHlwZSA9PT0gUGFja2V0VHlwZS5BQ0spIHtcbiAgICAgICAgICAgIGlmIChoYXNCaW5hcnkob2JqKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVuY29kZUFzQmluYXJ5KHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogb2JqLnR5cGUgPT09IFBhY2tldFR5cGUuRVZFTlRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gUGFja2V0VHlwZS5CSU5BUllfRVZFTlRcbiAgICAgICAgICAgICAgICAgICAgICAgIDogUGFja2V0VHlwZS5CSU5BUllfQUNLLFxuICAgICAgICAgICAgICAgICAgICBuc3A6IG9iai5uc3AsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IG9iai5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBpZDogb2JqLmlkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbdGhpcy5lbmNvZGVBc1N0cmluZyhvYmopXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5jb2RlIHBhY2tldCBhcyBzdHJpbmcuXG4gICAgICovXG4gICAgZW5jb2RlQXNTdHJpbmcob2JqKSB7XG4gICAgICAgIC8vIGZpcnN0IGlzIHR5cGVcbiAgICAgICAgbGV0IHN0ciA9IFwiXCIgKyBvYmoudHlwZTtcbiAgICAgICAgLy8gYXR0YWNobWVudHMgaWYgd2UgaGF2ZSB0aGVtXG4gICAgICAgIGlmIChvYmoudHlwZSA9PT0gUGFja2V0VHlwZS5CSU5BUllfRVZFTlQgfHxcbiAgICAgICAgICAgIG9iai50eXBlID09PSBQYWNrZXRUeXBlLkJJTkFSWV9BQ0spIHtcbiAgICAgICAgICAgIHN0ciArPSBvYmouYXR0YWNobWVudHMgKyBcIi1cIjtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgbmFtZXNwYWNlIG90aGVyIHRoYW4gYC9gXG4gICAgICAgIC8vIHdlIGFwcGVuZCBpdCBmb2xsb3dlZCBieSBhIGNvbW1hIGAsYFxuICAgICAgICBpZiAob2JqLm5zcCAmJiBcIi9cIiAhPT0gb2JqLm5zcCkge1xuICAgICAgICAgICAgc3RyICs9IG9iai5uc3AgKyBcIixcIjtcbiAgICAgICAgfVxuICAgICAgICAvLyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSB0aGUgaWRcbiAgICAgICAgaWYgKG51bGwgIT0gb2JqLmlkKSB7XG4gICAgICAgICAgICBzdHIgKz0gb2JqLmlkO1xuICAgICAgICB9XG4gICAgICAgIC8vIGpzb24gZGF0YVxuICAgICAgICBpZiAobnVsbCAhPSBvYmouZGF0YSkge1xuICAgICAgICAgICAgc3RyICs9IEpTT04uc3RyaW5naWZ5KG9iai5kYXRhLCB0aGlzLnJlcGxhY2VyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbmNvZGUgcGFja2V0IGFzICdidWZmZXIgc2VxdWVuY2UnIGJ5IHJlbW92aW5nIGJsb2JzLCBhbmRcbiAgICAgKiBkZWNvbnN0cnVjdGluZyBwYWNrZXQgaW50byBvYmplY3Qgd2l0aCBwbGFjZWhvbGRlcnMgYW5kXG4gICAgICogYSBsaXN0IG9mIGJ1ZmZlcnMuXG4gICAgICovXG4gICAgZW5jb2RlQXNCaW5hcnkob2JqKSB7XG4gICAgICAgIGNvbnN0IGRlY29uc3RydWN0aW9uID0gZGVjb25zdHJ1Y3RQYWNrZXQob2JqKTtcbiAgICAgICAgY29uc3QgcGFjayA9IHRoaXMuZW5jb2RlQXNTdHJpbmcoZGVjb25zdHJ1Y3Rpb24ucGFja2V0KTtcbiAgICAgICAgY29uc3QgYnVmZmVycyA9IGRlY29uc3RydWN0aW9uLmJ1ZmZlcnM7XG4gICAgICAgIGJ1ZmZlcnMudW5zaGlmdChwYWNrKTsgLy8gYWRkIHBhY2tldCBpbmZvIHRvIGJlZ2lubmluZyBvZiBkYXRhIGxpc3RcbiAgICAgICAgcmV0dXJuIGJ1ZmZlcnM7IC8vIHdyaXRlIGFsbCB0aGUgYnVmZmVyc1xuICAgIH1cbn1cbi8vIHNlZSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy84NTExMjgxL2NoZWNrLWlmLWEtdmFsdWUtaXMtYW4tb2JqZWN0LWluLWphdmFzY3JpcHRcbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09IFwiW29iamVjdCBPYmplY3RdXCI7XG59XG4vKipcbiAqIEEgc29ja2V0LmlvIERlY29kZXIgaW5zdGFuY2VcbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9IGRlY29kZXJcbiAqL1xuZXhwb3J0IGNsYXNzIERlY29kZXIgZXh0ZW5kcyBFbWl0dGVyIHtcbiAgICAvKipcbiAgICAgKiBEZWNvZGVyIGNvbnN0cnVjdG9yXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSByZXZpdmVyIC0gY3VzdG9tIHJldml2ZXIgdG8gcGFzcyBkb3duIHRvIEpTT04uc3RyaW5naWZ5XG4gICAgICovXG4gICAgY29uc3RydWN0b3IocmV2aXZlcikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnJldml2ZXIgPSByZXZpdmVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWNvZGVzIGFuIGVuY29kZWQgcGFja2V0IHN0cmluZyBpbnRvIHBhY2tldCBKU09OLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG9iaiAtIGVuY29kZWQgcGFja2V0XG4gICAgICovXG4gICAgYWRkKG9iaikge1xuICAgICAgICBsZXQgcGFja2V0O1xuICAgICAgICBpZiAodHlwZW9mIG9iaiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVjb25zdHJ1Y3Rvcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImdvdCBwbGFpbnRleHQgZGF0YSB3aGVuIHJlY29uc3RydWN0aW5nIGEgcGFja2V0XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFja2V0ID0gdGhpcy5kZWNvZGVTdHJpbmcob2JqKTtcbiAgICAgICAgICAgIGNvbnN0IGlzQmluYXJ5RXZlbnQgPSBwYWNrZXQudHlwZSA9PT0gUGFja2V0VHlwZS5CSU5BUllfRVZFTlQ7XG4gICAgICAgICAgICBpZiAoaXNCaW5hcnlFdmVudCB8fCBwYWNrZXQudHlwZSA9PT0gUGFja2V0VHlwZS5CSU5BUllfQUNLKSB7XG4gICAgICAgICAgICAgICAgcGFja2V0LnR5cGUgPSBpc0JpbmFyeUV2ZW50ID8gUGFja2V0VHlwZS5FVkVOVCA6IFBhY2tldFR5cGUuQUNLO1xuICAgICAgICAgICAgICAgIC8vIGJpbmFyeSBwYWNrZXQncyBqc29uXG4gICAgICAgICAgICAgICAgdGhpcy5yZWNvbnN0cnVjdG9yID0gbmV3IEJpbmFyeVJlY29uc3RydWN0b3IocGFja2V0KTtcbiAgICAgICAgICAgICAgICAvLyBubyBhdHRhY2htZW50cywgbGFiZWxlZCBiaW5hcnkgYnV0IG5vIGJpbmFyeSBkYXRhIHRvIGZvbGxvd1xuICAgICAgICAgICAgICAgIGlmIChwYWNrZXQuYXR0YWNobWVudHMgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgc3VwZXIuZW1pdFJlc2VydmVkKFwiZGVjb2RlZFwiLCBwYWNrZXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIG5vbi1iaW5hcnkgZnVsbCBwYWNrZXRcbiAgICAgICAgICAgICAgICBzdXBlci5lbWl0UmVzZXJ2ZWQoXCJkZWNvZGVkXCIsIHBhY2tldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNCaW5hcnkob2JqKSB8fCBvYmouYmFzZTY0KSB7XG4gICAgICAgICAgICAvLyByYXcgYmluYXJ5IGRhdGFcbiAgICAgICAgICAgIGlmICghdGhpcy5yZWNvbnN0cnVjdG9yKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZ290IGJpbmFyeSBkYXRhIHdoZW4gbm90IHJlY29uc3RydWN0aW5nIGEgcGFja2V0XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFja2V0ID0gdGhpcy5yZWNvbnN0cnVjdG9yLnRha2VCaW5hcnlEYXRhKG9iaik7XG4gICAgICAgICAgICAgICAgaWYgKHBhY2tldCkge1xuICAgICAgICAgICAgICAgICAgICAvLyByZWNlaXZlZCBmaW5hbCBidWZmZXJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWNvbnN0cnVjdG9yID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgc3VwZXIuZW1pdFJlc2VydmVkKFwiZGVjb2RlZFwiLCBwYWNrZXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gdHlwZTogXCIgKyBvYmopO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlY29kZSBhIHBhY2tldCBTdHJpbmcgKEpTT04gZGF0YSlcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHBhY2tldFxuICAgICAqL1xuICAgIGRlY29kZVN0cmluZyhzdHIpIHtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAvLyBsb29rIHVwIHR5cGVcbiAgICAgICAgY29uc3QgcCA9IHtcbiAgICAgICAgICAgIHR5cGU6IE51bWJlcihzdHIuY2hhckF0KDApKSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKFBhY2tldFR5cGVbcC50eXBlXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIHBhY2tldCB0eXBlIFwiICsgcC50eXBlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBsb29rIHVwIGF0dGFjaG1lbnRzIGlmIHR5cGUgYmluYXJ5XG4gICAgICAgIGlmIChwLnR5cGUgPT09IFBhY2tldFR5cGUuQklOQVJZX0VWRU5UIHx8XG4gICAgICAgICAgICBwLnR5cGUgPT09IFBhY2tldFR5cGUuQklOQVJZX0FDSykge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBpICsgMTtcbiAgICAgICAgICAgIHdoaWxlIChzdHIuY2hhckF0KCsraSkgIT09IFwiLVwiICYmIGkgIT0gc3RyLmxlbmd0aCkgeyB9XG4gICAgICAgICAgICBjb25zdCBidWYgPSBzdHIuc3Vic3RyaW5nKHN0YXJ0LCBpKTtcbiAgICAgICAgICAgIGlmIChidWYgIT0gTnVtYmVyKGJ1ZikgfHwgc3RyLmNoYXJBdChpKSAhPT0gXCItXCIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbGxlZ2FsIGF0dGFjaG1lbnRzXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcC5hdHRhY2htZW50cyA9IE51bWJlcihidWYpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGxvb2sgdXAgbmFtZXNwYWNlIChpZiBhbnkpXG4gICAgICAgIGlmIChcIi9cIiA9PT0gc3RyLmNoYXJBdChpICsgMSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gaSArIDE7XG4gICAgICAgICAgICB3aGlsZSAoKytpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYyA9IHN0ci5jaGFyQXQoaSk7XG4gICAgICAgICAgICAgICAgaWYgKFwiLFwiID09PSBjKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gc3RyLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwLm5zcCA9IHN0ci5zdWJzdHJpbmcoc3RhcnQsIGkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcC5uc3AgPSBcIi9cIjtcbiAgICAgICAgfVxuICAgICAgICAvLyBsb29rIHVwIGlkXG4gICAgICAgIGNvbnN0IG5leHQgPSBzdHIuY2hhckF0KGkgKyAxKTtcbiAgICAgICAgaWYgKFwiXCIgIT09IG5leHQgJiYgTnVtYmVyKG5leHQpID09IG5leHQpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gaSArIDE7XG4gICAgICAgICAgICB3aGlsZSAoKytpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYyA9IHN0ci5jaGFyQXQoaSk7XG4gICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gYyB8fCBOdW1iZXIoYykgIT0gYykge1xuICAgICAgICAgICAgICAgICAgICAtLWk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gc3RyLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwLmlkID0gTnVtYmVyKHN0ci5zdWJzdHJpbmcoc3RhcnQsIGkgKyAxKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbG9vayB1cCBqc29uIGRhdGFcbiAgICAgICAgaWYgKHN0ci5jaGFyQXQoKytpKSkge1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMudHJ5UGFyc2Uoc3RyLnN1YnN0cihpKSk7XG4gICAgICAgICAgICBpZiAoRGVjb2Rlci5pc1BheWxvYWRWYWxpZChwLnR5cGUsIHBheWxvYWQpKSB7XG4gICAgICAgICAgICAgICAgcC5kYXRhID0gcGF5bG9hZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgcGF5bG9hZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcDtcbiAgICB9XG4gICAgdHJ5UGFyc2Uoc3RyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShzdHIsIHRoaXMucmV2aXZlcik7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgaXNQYXlsb2FkVmFsaWQodHlwZSwgcGF5bG9hZCkge1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgUGFja2V0VHlwZS5DT05ORUNUOlxuICAgICAgICAgICAgICAgIHJldHVybiBpc09iamVjdChwYXlsb2FkKTtcbiAgICAgICAgICAgIGNhc2UgUGFja2V0VHlwZS5ESVNDT05ORUNUOlxuICAgICAgICAgICAgICAgIHJldHVybiBwYXlsb2FkID09PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjYXNlIFBhY2tldFR5cGUuQ09OTkVDVF9FUlJPUjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIHBheWxvYWQgPT09IFwic3RyaW5nXCIgfHwgaXNPYmplY3QocGF5bG9hZCk7XG4gICAgICAgICAgICBjYXNlIFBhY2tldFR5cGUuRVZFTlQ6XG4gICAgICAgICAgICBjYXNlIFBhY2tldFR5cGUuQklOQVJZX0VWRU5UOlxuICAgICAgICAgICAgICAgIHJldHVybiAoQXJyYXkuaXNBcnJheShwYXlsb2FkKSAmJlxuICAgICAgICAgICAgICAgICAgICAodHlwZW9mIHBheWxvYWRbMF0gPT09IFwibnVtYmVyXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlb2YgcGF5bG9hZFswXSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFU0VSVkVEX0VWRU5UUy5pbmRleE9mKHBheWxvYWRbMF0pID09PSAtMSkpKTtcbiAgICAgICAgICAgIGNhc2UgUGFja2V0VHlwZS5BQ0s6XG4gICAgICAgICAgICBjYXNlIFBhY2tldFR5cGUuQklOQVJZX0FDSzpcbiAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShwYXlsb2FkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWFsbG9jYXRlcyBhIHBhcnNlcidzIHJlc291cmNlc1xuICAgICAqL1xuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLnJlY29uc3RydWN0b3IpIHtcbiAgICAgICAgICAgIHRoaXMucmVjb25zdHJ1Y3Rvci5maW5pc2hlZFJlY29uc3RydWN0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLnJlY29uc3RydWN0b3IgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBBIG1hbmFnZXIgb2YgYSBiaW5hcnkgZXZlbnQncyAnYnVmZmVyIHNlcXVlbmNlJy4gU2hvdWxkXG4gKiBiZSBjb25zdHJ1Y3RlZCB3aGVuZXZlciBhIHBhY2tldCBvZiB0eXBlIEJJTkFSWV9FVkVOVCBpc1xuICogZGVjb2RlZC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFja2V0XG4gKiBAcmV0dXJuIHtCaW5hcnlSZWNvbnN0cnVjdG9yfSBpbml0aWFsaXplZCByZWNvbnN0cnVjdG9yXG4gKi9cbmNsYXNzIEJpbmFyeVJlY29uc3RydWN0b3Ige1xuICAgIGNvbnN0cnVjdG9yKHBhY2tldCkge1xuICAgICAgICB0aGlzLnBhY2tldCA9IHBhY2tldDtcbiAgICAgICAgdGhpcy5idWZmZXJzID0gW107XG4gICAgICAgIHRoaXMucmVjb25QYWNrID0gcGFja2V0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNZXRob2QgdG8gYmUgY2FsbGVkIHdoZW4gYmluYXJ5IGRhdGEgcmVjZWl2ZWQgZnJvbSBjb25uZWN0aW9uXG4gICAgICogYWZ0ZXIgYSBCSU5BUllfRVZFTlQgcGFja2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtCdWZmZXIgfCBBcnJheUJ1ZmZlcn0gYmluRGF0YSAtIHRoZSByYXcgYmluYXJ5IGRhdGEgcmVjZWl2ZWRcbiAgICAgKiBAcmV0dXJuIHtudWxsIHwgT2JqZWN0fSByZXR1cm5zIG51bGwgaWYgbW9yZSBiaW5hcnkgZGF0YSBpcyBleHBlY3RlZCBvclxuICAgICAqICAgYSByZWNvbnN0cnVjdGVkIHBhY2tldCBvYmplY3QgaWYgYWxsIGJ1ZmZlcnMgaGF2ZSBiZWVuIHJlY2VpdmVkLlxuICAgICAqL1xuICAgIHRha2VCaW5hcnlEYXRhKGJpbkRhdGEpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzLnB1c2goYmluRGF0YSk7XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlcnMubGVuZ3RoID09PSB0aGlzLnJlY29uUGFjay5hdHRhY2htZW50cykge1xuICAgICAgICAgICAgLy8gZG9uZSB3aXRoIGJ1ZmZlciBsaXN0XG4gICAgICAgICAgICBjb25zdCBwYWNrZXQgPSByZWNvbnN0cnVjdFBhY2tldCh0aGlzLnJlY29uUGFjaywgdGhpcy5idWZmZXJzKTtcbiAgICAgICAgICAgIHRoaXMuZmluaXNoZWRSZWNvbnN0cnVjdGlvbigpO1xuICAgICAgICAgICAgcmV0dXJuIHBhY2tldDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYW5zIHVwIGJpbmFyeSBwYWNrZXQgcmVjb25zdHJ1Y3Rpb24gdmFyaWFibGVzLlxuICAgICAqL1xuICAgIGZpbmlzaGVkUmVjb25zdHJ1Y3Rpb24oKSB7XG4gICAgICAgIHRoaXMucmVjb25QYWNrID0gbnVsbDtcbiAgICAgICAgdGhpcy5idWZmZXJzID0gW107XG4gICAgfVxufVxuIiwgImNvbnN0IHdpdGhOYXRpdmVBcnJheUJ1ZmZlciA9IHR5cGVvZiBBcnJheUJ1ZmZlciA9PT0gXCJmdW5jdGlvblwiO1xuY29uc3QgaXNWaWV3ID0gKG9iaikgPT4ge1xuICAgIHJldHVybiB0eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyBBcnJheUJ1ZmZlci5pc1ZpZXcob2JqKVxuICAgICAgICA6IG9iai5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcjtcbn07XG5jb25zdCB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5jb25zdCB3aXRoTmF0aXZlQmxvYiA9IHR5cGVvZiBCbG9iID09PSBcImZ1bmN0aW9uXCIgfHxcbiAgICAodHlwZW9mIEJsb2IgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdG9TdHJpbmcuY2FsbChCbG9iKSA9PT0gXCJbb2JqZWN0IEJsb2JDb25zdHJ1Y3Rvcl1cIik7XG5jb25zdCB3aXRoTmF0aXZlRmlsZSA9IHR5cGVvZiBGaWxlID09PSBcImZ1bmN0aW9uXCIgfHxcbiAgICAodHlwZW9mIEZpbGUgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdG9TdHJpbmcuY2FsbChGaWxlKSA9PT0gXCJbb2JqZWN0IEZpbGVDb25zdHJ1Y3Rvcl1cIik7XG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBvYmogaXMgYSBCdWZmZXIsIGFuIEFycmF5QnVmZmVyLCBhIEJsb2Igb3IgYSBGaWxlLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0JpbmFyeShvYmopIHtcbiAgICByZXR1cm4gKCh3aXRoTmF0aXZlQXJyYXlCdWZmZXIgJiYgKG9iaiBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8IGlzVmlldyhvYmopKSkgfHxcbiAgICAgICAgKHdpdGhOYXRpdmVCbG9iICYmIG9iaiBpbnN0YW5jZW9mIEJsb2IpIHx8XG4gICAgICAgICh3aXRoTmF0aXZlRmlsZSAmJiBvYmogaW5zdGFuY2VvZiBGaWxlKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaGFzQmluYXJ5KG9iaiwgdG9KU09OKSB7XG4gICAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBvYmoubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaGFzQmluYXJ5KG9ialtpXSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChpc0JpbmFyeShvYmopKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAob2JqLnRvSlNPTiAmJlxuICAgICAgICB0eXBlb2Ygb2JqLnRvSlNPTiA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgIGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGhhc0JpbmFyeShvYmoudG9KU09OKCksIHRydWUpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkgJiYgaGFzQmluYXJ5KG9ialtrZXldKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuIiwgImltcG9ydCB7IGlzQmluYXJ5IH0gZnJvbSBcIi4vaXMtYmluYXJ5LmpzXCI7XG4vKipcbiAqIFJlcGxhY2VzIGV2ZXJ5IEJ1ZmZlciB8IEFycmF5QnVmZmVyIHwgQmxvYiB8IEZpbGUgaW4gcGFja2V0IHdpdGggYSBudW1iZXJlZCBwbGFjZWhvbGRlci5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFja2V0IC0gc29ja2V0LmlvIGV2ZW50IHBhY2tldFxuICogQHJldHVybiB7T2JqZWN0fSB3aXRoIGRlY29uc3RydWN0ZWQgcGFja2V0IGFuZCBsaXN0IG9mIGJ1ZmZlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29uc3RydWN0UGFja2V0KHBhY2tldCkge1xuICAgIGNvbnN0IGJ1ZmZlcnMgPSBbXTtcbiAgICBjb25zdCBwYWNrZXREYXRhID0gcGFja2V0LmRhdGE7XG4gICAgY29uc3QgcGFjayA9IHBhY2tldDtcbiAgICBwYWNrLmRhdGEgPSBfZGVjb25zdHJ1Y3RQYWNrZXQocGFja2V0RGF0YSwgYnVmZmVycyk7XG4gICAgcGFjay5hdHRhY2htZW50cyA9IGJ1ZmZlcnMubGVuZ3RoOyAvLyBudW1iZXIgb2YgYmluYXJ5ICdhdHRhY2htZW50cydcbiAgICByZXR1cm4geyBwYWNrZXQ6IHBhY2ssIGJ1ZmZlcnM6IGJ1ZmZlcnMgfTtcbn1cbmZ1bmN0aW9uIF9kZWNvbnN0cnVjdFBhY2tldChkYXRhLCBidWZmZXJzKSB7XG4gICAgaWYgKCFkYXRhKVxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICBpZiAoaXNCaW5hcnkoZGF0YSkpIHtcbiAgICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSB7IF9wbGFjZWhvbGRlcjogdHJ1ZSwgbnVtOiBidWZmZXJzLmxlbmd0aCB9O1xuICAgICAgICBidWZmZXJzLnB1c2goZGF0YSk7XG4gICAgICAgIHJldHVybiBwbGFjZWhvbGRlcjtcbiAgICB9XG4gICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICBjb25zdCBuZXdEYXRhID0gbmV3IEFycmF5KGRhdGEubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBuZXdEYXRhW2ldID0gX2RlY29uc3RydWN0UGFja2V0KGRhdGFbaV0sIGJ1ZmZlcnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdEYXRhO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgZGF0YSA9PT0gXCJvYmplY3RcIiAmJiAhKGRhdGEgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgICBjb25zdCBuZXdEYXRhID0ge307XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSkge1xuICAgICAgICAgICAgICAgIG5ld0RhdGFba2V5XSA9IF9kZWNvbnN0cnVjdFBhY2tldChkYXRhW2tleV0sIGJ1ZmZlcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdEYXRhO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbn1cbi8qKlxuICogUmVjb25zdHJ1Y3RzIGEgYmluYXJ5IHBhY2tldCBmcm9tIGl0cyBwbGFjZWhvbGRlciBwYWNrZXQgYW5kIGJ1ZmZlcnNcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFja2V0IC0gZXZlbnQgcGFja2V0IHdpdGggcGxhY2Vob2xkZXJzXG4gKiBAcGFyYW0ge0FycmF5fSBidWZmZXJzIC0gYmluYXJ5IGJ1ZmZlcnMgdG8gcHV0IGluIHBsYWNlaG9sZGVyIHBvc2l0aW9uc1xuICogQHJldHVybiB7T2JqZWN0fSByZWNvbnN0cnVjdGVkIHBhY2tldFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb25zdHJ1Y3RQYWNrZXQocGFja2V0LCBidWZmZXJzKSB7XG4gICAgcGFja2V0LmRhdGEgPSBfcmVjb25zdHJ1Y3RQYWNrZXQocGFja2V0LmRhdGEsIGJ1ZmZlcnMpO1xuICAgIGRlbGV0ZSBwYWNrZXQuYXR0YWNobWVudHM7IC8vIG5vIGxvbmdlciB1c2VmdWxcbiAgICByZXR1cm4gcGFja2V0O1xufVxuZnVuY3Rpb24gX3JlY29uc3RydWN0UGFja2V0KGRhdGEsIGJ1ZmZlcnMpIHtcbiAgICBpZiAoIWRhdGEpXG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIGlmIChkYXRhICYmIGRhdGEuX3BsYWNlaG9sZGVyID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IGlzSW5kZXhWYWxpZCA9IHR5cGVvZiBkYXRhLm51bSA9PT0gXCJudW1iZXJcIiAmJlxuICAgICAgICAgICAgZGF0YS5udW0gPj0gMCAmJlxuICAgICAgICAgICAgZGF0YS5udW0gPCBidWZmZXJzLmxlbmd0aDtcbiAgICAgICAgaWYgKGlzSW5kZXhWYWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcnNbZGF0YS5udW1dOyAvLyBhcHByb3ByaWF0ZSBidWZmZXIgKHNob3VsZCBiZSBuYXR1cmFsIG9yZGVyIGFueXdheSlcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgYXR0YWNobWVudHNcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGRhdGFbaV0gPSBfcmVjb25zdHJ1Y3RQYWNrZXQoZGF0YVtpXSwgYnVmZmVycyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgZGF0YVtrZXldID0gX3JlY29uc3RydWN0UGFja2V0KGRhdGFba2V5XSwgYnVmZmVycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIG9uKG9iaiwgZXYsIGZuKSB7XG4gICAgb2JqLm9uKGV2LCBmbik7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHN1YkRlc3Ryb3koKSB7XG4gICAgICAgIG9iai5vZmYoZXYsIGZuKTtcbiAgICB9O1xufVxuIiwgImltcG9ydCB7IFBhY2tldFR5cGUgfSBmcm9tIFwic29ja2V0LmlvLXBhcnNlclwiO1xuaW1wb3J0IHsgb24gfSBmcm9tIFwiLi9vbi5qc1wiO1xuaW1wb3J0IHsgRW1pdHRlciwgfSBmcm9tIFwiQHNvY2tldC5pby9jb21wb25lbnQtZW1pdHRlclwiO1xuLyoqXG4gKiBJbnRlcm5hbCBldmVudHMuXG4gKiBUaGVzZSBldmVudHMgY2FuJ3QgYmUgZW1pdHRlZCBieSB0aGUgdXNlci5cbiAqL1xuY29uc3QgUkVTRVJWRURfRVZFTlRTID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgY29ubmVjdDogMSxcbiAgICBjb25uZWN0X2Vycm9yOiAxLFxuICAgIGRpc2Nvbm5lY3Q6IDEsXG4gICAgZGlzY29ubmVjdGluZzogMSxcbiAgICAvLyBFdmVudEVtaXR0ZXIgcmVzZXJ2ZWQgZXZlbnRzOiBodHRwczovL25vZGVqcy5vcmcvYXBpL2V2ZW50cy5odG1sI2V2ZW50c19ldmVudF9uZXdsaXN0ZW5lclxuICAgIG5ld0xpc3RlbmVyOiAxLFxuICAgIHJlbW92ZUxpc3RlbmVyOiAxLFxufSk7XG4vKipcbiAqIEEgU29ja2V0IGlzIHRoZSBmdW5kYW1lbnRhbCBjbGFzcyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgc2VydmVyLlxuICpcbiAqIEEgU29ja2V0IGJlbG9uZ3MgdG8gYSBjZXJ0YWluIE5hbWVzcGFjZSAoYnkgZGVmYXVsdCAvKSBhbmQgdXNlcyBhbiB1bmRlcmx5aW5nIHtAbGluayBNYW5hZ2VyfSB0byBjb21tdW5pY2F0ZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgc29ja2V0ID0gaW8oKTtcbiAqXG4gKiBzb2NrZXQub24oXCJjb25uZWN0XCIsICgpID0+IHtcbiAqICAgY29uc29sZS5sb2coXCJjb25uZWN0ZWRcIik7XG4gKiB9KTtcbiAqXG4gKiAvLyBzZW5kIGFuIGV2ZW50IHRvIHRoZSBzZXJ2ZXJcbiAqIHNvY2tldC5lbWl0KFwiZm9vXCIsIFwiYmFyXCIpO1xuICpcbiAqIHNvY2tldC5vbihcImZvb2JhclwiLCAoKSA9PiB7XG4gKiAgIC8vIGFuIGV2ZW50IHdhcyByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXJcbiAqIH0pO1xuICpcbiAqIC8vIHVwb24gZGlzY29ubmVjdGlvblxuICogc29ja2V0Lm9uKFwiZGlzY29ubmVjdFwiLCAocmVhc29uKSA9PiB7XG4gKiAgIGNvbnNvbGUubG9nKGBkaXNjb25uZWN0ZWQgZHVlIHRvICR7cmVhc29ufWApO1xuICogfSk7XG4gKi9cbmV4cG9ydCBjbGFzcyBTb2NrZXQgZXh0ZW5kcyBFbWl0dGVyIHtcbiAgICAvKipcbiAgICAgKiBgU29ja2V0YCBjb25zdHJ1Y3Rvci5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihpbywgbnNwLCBvcHRzKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGV0aGVyIHRoZSBzb2NrZXQgaXMgY3VycmVudGx5IGNvbm5lY3RlZCB0byB0aGUgc2VydmVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKiBjb25zdCBzb2NrZXQgPSBpbygpO1xuICAgICAgICAgKlxuICAgICAgICAgKiBzb2NrZXQub24oXCJjb25uZWN0XCIsICgpID0+IHtcbiAgICAgICAgICogICBjb25zb2xlLmxvZyhzb2NrZXQuY29ubmVjdGVkKTsgLy8gdHJ1ZVxuICAgICAgICAgKiB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogc29ja2V0Lm9uKFwiZGlzY29ubmVjdFwiLCAoKSA9PiB7XG4gICAgICAgICAqICAgY29uc29sZS5sb2coc29ja2V0LmNvbm5lY3RlZCk7IC8vIGZhbHNlXG4gICAgICAgICAqIH0pO1xuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gc3RhdGUgd2FzIHJlY292ZXJlZCBhZnRlciBhIHRlbXBvcmFyeSBkaXNjb25uZWN0aW9uLiBJbiB0aGF0IGNhc2UsIGFueSBtaXNzZWQgcGFja2V0cyB3aWxsXG4gICAgICAgICAqIGJlIHRyYW5zbWl0dGVkIGJ5IHRoZSBzZXJ2ZXIuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlY292ZXJlZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogQnVmZmVyIGZvciBwYWNrZXRzIHJlY2VpdmVkIGJlZm9yZSB0aGUgQ09OTkVDVCBwYWNrZXRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmVjZWl2ZUJ1ZmZlciA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogQnVmZmVyIGZvciBwYWNrZXRzIHRoYXQgd2lsbCBiZSBzZW50IG9uY2UgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc2VuZEJ1ZmZlciA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHF1ZXVlIG9mIHBhY2tldHMgdG8gYmUgc2VudCB3aXRoIHJldHJ5IGluIGNhc2Ugb2YgZmFpbHVyZS5cbiAgICAgICAgICpcbiAgICAgICAgICogUGFja2V0cyBhcmUgc2VudCBvbmUgYnkgb25lLCBlYWNoIHdhaXRpbmcgZm9yIHRoZSBzZXJ2ZXIgYWNrbm93bGVkZ2VtZW50LCBpbiBvcmRlciB0byBndWFyYW50ZWUgdGhlIGRlbGl2ZXJ5IG9yZGVyLlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fcXVldWUgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgc2VxdWVuY2UgdG8gZ2VuZXJhdGUgdGhlIElEIG9mIHRoZSB7QGxpbmsgUXVldWVkUGFja2V0fS5cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX3F1ZXVlU2VxID0gMDtcbiAgICAgICAgdGhpcy5pZHMgPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgICogQSBtYXAgY29udGFpbmluZyBhY2tub3dsZWRnZW1lbnQgaGFuZGxlcnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBgd2l0aEVycm9yYCBhdHRyaWJ1dGUgaXMgdXNlZCB0byBkaWZmZXJlbnRpYXRlIGhhbmRsZXJzIHRoYXQgYWNjZXB0IGFuIGVycm9yIGFzIGZpcnN0IGFyZ3VtZW50OlxuICAgICAgICAgKlxuICAgICAgICAgKiAtIGBzb2NrZXQuZW1pdChcInRlc3RcIiwgKGVyciwgdmFsdWUpID0+IHsgLi4uIH0pYCB3aXRoIGBhY2tUaW1lb3V0YCBvcHRpb25cbiAgICAgICAgICogLSBgc29ja2V0LnRpbWVvdXQoNTAwMCkuZW1pdChcInRlc3RcIiwgKGVyciwgdmFsdWUpID0+IHsgLi4uIH0pYFxuICAgICAgICAgKiAtIGBjb25zdCB2YWx1ZSA9IGF3YWl0IHNvY2tldC5lbWl0V2l0aEFjayhcInRlc3RcIilgXG4gICAgICAgICAqXG4gICAgICAgICAqIEZyb20gdGhvc2UgdGhhdCBkb24ndDpcbiAgICAgICAgICpcbiAgICAgICAgICogLSBgc29ja2V0LmVtaXQoXCJ0ZXN0XCIsICh2YWx1ZSkgPT4geyAuLi4gfSk7YFxuICAgICAgICAgKlxuICAgICAgICAgKiBJbiB0aGUgZmlyc3QgY2FzZSwgdGhlIGhhbmRsZXJzIHdpbGwgYmUgY2FsbGVkIHdpdGggYW4gZXJyb3Igd2hlbjpcbiAgICAgICAgICpcbiAgICAgICAgICogLSB0aGUgdGltZW91dCBpcyByZWFjaGVkXG4gICAgICAgICAqIC0gdGhlIHNvY2tldCBnZXRzIGRpc2Nvbm5lY3RlZFxuICAgICAgICAgKlxuICAgICAgICAgKiBJbiB0aGUgc2Vjb25kIGNhc2UsIHRoZSBoYW5kbGVycyB3aWxsIGJlIHNpbXBseSBkaXNjYXJkZWQgdXBvbiBkaXNjb25uZWN0aW9uLCBzaW5jZSB0aGUgY2xpZW50IHdpbGwgbmV2ZXIgcmVjZWl2ZVxuICAgICAgICAgKiBhbiBhY2tub3dsZWRnZW1lbnQgZnJvbSB0aGUgc2VydmVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hY2tzID0ge307XG4gICAgICAgIHRoaXMuZmxhZ3MgPSB7fTtcbiAgICAgICAgdGhpcy5pbyA9IGlvO1xuICAgICAgICB0aGlzLm5zcCA9IG5zcDtcbiAgICAgICAgaWYgKG9wdHMgJiYgb3B0cy5hdXRoKSB7XG4gICAgICAgICAgICB0aGlzLmF1dGggPSBvcHRzLmF1dGg7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fb3B0cyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdHMpO1xuICAgICAgICBpZiAodGhpcy5pby5fYXV0b0Nvbm5lY3QpXG4gICAgICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgc29ja2V0IGlzIGN1cnJlbnRseSBkaXNjb25uZWN0ZWRcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3Qgc29ja2V0ID0gaW8oKTtcbiAgICAgKlxuICAgICAqIHNvY2tldC5vbihcImNvbm5lY3RcIiwgKCkgPT4ge1xuICAgICAqICAgY29uc29sZS5sb2coc29ja2V0LmRpc2Nvbm5lY3RlZCk7IC8vIGZhbHNlXG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBzb2NrZXQub24oXCJkaXNjb25uZWN0XCIsICgpID0+IHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKHNvY2tldC5kaXNjb25uZWN0ZWQpOyAvLyB0cnVlXG4gICAgICogfSk7XG4gICAgICovXG4gICAgZ2V0IGRpc2Nvbm5lY3RlZCgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmNvbm5lY3RlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3Vic2NyaWJlIHRvIG9wZW4sIGNsb3NlIGFuZCBwYWNrZXQgZXZlbnRzXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHN1YkV2ZW50cygpIHtcbiAgICAgICAgaWYgKHRoaXMuc3VicylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY29uc3QgaW8gPSB0aGlzLmlvO1xuICAgICAgICB0aGlzLnN1YnMgPSBbXG4gICAgICAgICAgICBvbihpbywgXCJvcGVuXCIsIHRoaXMub25vcGVuLmJpbmQodGhpcykpLFxuICAgICAgICAgICAgb24oaW8sIFwicGFja2V0XCIsIHRoaXMub25wYWNrZXQuYmluZCh0aGlzKSksXG4gICAgICAgICAgICBvbihpbywgXCJlcnJvclwiLCB0aGlzLm9uZXJyb3IuYmluZCh0aGlzKSksXG4gICAgICAgICAgICBvbihpbywgXCJjbG9zZVwiLCB0aGlzLm9uY2xvc2UuYmluZCh0aGlzKSksXG4gICAgICAgIF07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIFNvY2tldCB3aWxsIHRyeSB0byByZWNvbm5lY3Qgd2hlbiBpdHMgTWFuYWdlciBjb25uZWN0cyBvciByZWNvbm5lY3RzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBzb2NrZXQgPSBpbygpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coc29ja2V0LmFjdGl2ZSk7IC8vIHRydWVcbiAgICAgKlxuICAgICAqIHNvY2tldC5vbihcImRpc2Nvbm5lY3RcIiwgKHJlYXNvbikgPT4ge1xuICAgICAqICAgaWYgKHJlYXNvbiA9PT0gXCJpbyBzZXJ2ZXIgZGlzY29ubmVjdFwiKSB7XG4gICAgICogICAgIC8vIHRoZSBkaXNjb25uZWN0aW9uIHdhcyBpbml0aWF0ZWQgYnkgdGhlIHNlcnZlciwgeW91IG5lZWQgdG8gbWFudWFsbHkgcmVjb25uZWN0XG4gICAgICogICAgIGNvbnNvbGUubG9nKHNvY2tldC5hY3RpdmUpOyAvLyBmYWxzZVxuICAgICAqICAgfVxuICAgICAqICAgLy8gZWxzZSB0aGUgc29ja2V0IHdpbGwgYXV0b21hdGljYWxseSB0cnkgdG8gcmVjb25uZWN0XG4gICAgICogICBjb25zb2xlLmxvZyhzb2NrZXQuYWN0aXZlKTsgLy8gdHJ1ZVxuICAgICAqIH0pO1xuICAgICAqL1xuICAgIGdldCBhY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuc3VicztcbiAgICB9XG4gICAgLyoqXG4gICAgICogXCJPcGVuc1wiIHRoZSBzb2NrZXQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IHNvY2tldCA9IGlvKHtcbiAgICAgKiAgIGF1dG9Db25uZWN0OiBmYWxzZVxuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogc29ja2V0LmNvbm5lY3QoKTtcbiAgICAgKi9cbiAgICBjb25uZWN0KCkge1xuICAgICAgICBpZiAodGhpcy5jb25uZWN0ZWQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgdGhpcy5zdWJFdmVudHMoKTtcbiAgICAgICAgaWYgKCF0aGlzLmlvW1wiX3JlY29ubmVjdGluZ1wiXSlcbiAgICAgICAgICAgIHRoaXMuaW8ub3BlbigpOyAvLyBlbnN1cmUgb3BlblxuICAgICAgICBpZiAoXCJvcGVuXCIgPT09IHRoaXMuaW8uX3JlYWR5U3RhdGUpXG4gICAgICAgICAgICB0aGlzLm9ub3BlbigpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWxpYXMgZm9yIHtAbGluayBjb25uZWN0KCl9LlxuICAgICAqL1xuICAgIG9wZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3QoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZHMgYSBgbWVzc2FnZWAgZXZlbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBtaW1pY3MgdGhlIFdlYlNvY2tldC5zZW5kKCkgbWV0aG9kLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2ViU29ja2V0L3NlbmRcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogc29ja2V0LnNlbmQoXCJoZWxsb1wiKTtcbiAgICAgKlxuICAgICAqIC8vIHRoaXMgaXMgZXF1aXZhbGVudCB0b1xuICAgICAqIHNvY2tldC5lbWl0KFwibWVzc2FnZVwiLCBcImhlbGxvXCIpO1xuICAgICAqXG4gICAgICogQHJldHVybiBzZWxmXG4gICAgICovXG4gICAgc2VuZCguLi5hcmdzKSB7XG4gICAgICAgIGFyZ3MudW5zaGlmdChcIm1lc3NhZ2VcIik7XG4gICAgICAgIHRoaXMuZW1pdC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIGBlbWl0YC5cbiAgICAgKiBJZiB0aGUgZXZlbnQgaXMgaW4gYGV2ZW50c2AsIGl0J3MgZW1pdHRlZCBub3JtYWxseS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogc29ja2V0LmVtaXQoXCJoZWxsb1wiLCBcIndvcmxkXCIpO1xuICAgICAqXG4gICAgICogLy8gYWxsIHNlcmlhbGl6YWJsZSBkYXRhc3RydWN0dXJlcyBhcmUgc3VwcG9ydGVkIChubyBuZWVkIHRvIGNhbGwgSlNPTi5zdHJpbmdpZnkpXG4gICAgICogc29ja2V0LmVtaXQoXCJoZWxsb1wiLCAxLCBcIjJcIiwgeyAzOiBbXCI0XCJdLCA1OiBVaW50OEFycmF5LmZyb20oWzZdKSB9KTtcbiAgICAgKlxuICAgICAqIC8vIHdpdGggYW4gYWNrbm93bGVkZ2VtZW50IGZyb20gdGhlIHNlcnZlclxuICAgICAqIHNvY2tldC5lbWl0KFwiaGVsbG9cIiwgXCJ3b3JsZFwiLCAodmFsKSA9PiB7XG4gICAgICogICAvLyAuLi5cbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIEByZXR1cm4gc2VsZlxuICAgICAqL1xuICAgIGVtaXQoZXYsIC4uLmFyZ3MpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIGlmIChSRVNFUlZFRF9FVkVOVFMuaGFzT3duUHJvcGVydHkoZXYpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGV2LnRvU3RyaW5nKCkgKyAnXCIgaXMgYSByZXNlcnZlZCBldmVudCBuYW1lJyk7XG4gICAgICAgIH1cbiAgICAgICAgYXJncy51bnNoaWZ0KGV2KTtcbiAgICAgICAgaWYgKHRoaXMuX29wdHMucmV0cmllcyAmJiAhdGhpcy5mbGFncy5mcm9tUXVldWUgJiYgIXRoaXMuZmxhZ3Mudm9sYXRpbGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2FkZFRvUXVldWUoYXJncyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYWNrZXQgPSB7XG4gICAgICAgICAgICB0eXBlOiBQYWNrZXRUeXBlLkVWRU5ULFxuICAgICAgICAgICAgZGF0YTogYXJncyxcbiAgICAgICAgfTtcbiAgICAgICAgcGFja2V0Lm9wdGlvbnMgPSB7fTtcbiAgICAgICAgcGFja2V0Lm9wdGlvbnMuY29tcHJlc3MgPSB0aGlzLmZsYWdzLmNvbXByZXNzICE9PSBmYWxzZTtcbiAgICAgICAgLy8gZXZlbnQgYWNrIGNhbGxiYWNrXG4gICAgICAgIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0pIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gdGhpcy5pZHMrKztcbiAgICAgICAgICAgIGNvbnN0IGFjayA9IGFyZ3MucG9wKCk7XG4gICAgICAgICAgICB0aGlzLl9yZWdpc3RlckFja0NhbGxiYWNrKGlkLCBhY2spO1xuICAgICAgICAgICAgcGFja2V0LmlkID0gaWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNUcmFuc3BvcnRXcml0YWJsZSA9IChfYiA9IChfYSA9IHRoaXMuaW8uZW5naW5lKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudHJhbnNwb3J0KSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Iud3JpdGFibGU7XG4gICAgICAgIGNvbnN0IGlzQ29ubmVjdGVkID0gdGhpcy5jb25uZWN0ZWQgJiYgISgoX2MgPSB0aGlzLmlvLmVuZ2luZSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLl9oYXNQaW5nRXhwaXJlZCgpKTtcbiAgICAgICAgY29uc3QgZGlzY2FyZFBhY2tldCA9IHRoaXMuZmxhZ3Mudm9sYXRpbGUgJiYgIWlzVHJhbnNwb3J0V3JpdGFibGU7XG4gICAgICAgIGlmIChkaXNjYXJkUGFja2V0KSB7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5T3V0Z29pbmdMaXN0ZW5lcnMocGFja2V0KTtcbiAgICAgICAgICAgIHRoaXMucGFja2V0KHBhY2tldCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlbmRCdWZmZXIucHVzaChwYWNrZXQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmxhZ3MgPSB7fTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3JlZ2lzdGVyQWNrQ2FsbGJhY2soaWQsIGFjaykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSAoX2EgPSB0aGlzLmZsYWdzLnRpbWVvdXQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMuX29wdHMuYWNrVGltZW91dDtcbiAgICAgICAgaWYgKHRpbWVvdXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5hY2tzW2lkXSA9IGFjaztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGNvbnN0IHRpbWVyID0gdGhpcy5pby5zZXRUaW1lb3V0Rm4oKCkgPT4ge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuYWNrc1tpZF07XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VuZEJ1ZmZlci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbmRCdWZmZXJbaV0uaWQgPT09IGlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VuZEJ1ZmZlci5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWNrLmNhbGwodGhpcywgbmV3IEVycm9yKFwib3BlcmF0aW9uIGhhcyB0aW1lZCBvdXRcIikpO1xuICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgY29uc3QgZm4gPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgdGhpcy5pby5jbGVhclRpbWVvdXRGbih0aW1lcik7XG4gICAgICAgICAgICBhY2suYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIH07XG4gICAgICAgIGZuLndpdGhFcnJvciA9IHRydWU7XG4gICAgICAgIHRoaXMuYWNrc1tpZF0gPSBmbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW1pdHMgYW4gZXZlbnQgYW5kIHdhaXRzIGZvciBhbiBhY2tub3dsZWRnZW1lbnRcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gd2l0aG91dCB0aW1lb3V0XG4gICAgICogY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzb2NrZXQuZW1pdFdpdGhBY2soXCJoZWxsb1wiLCBcIndvcmxkXCIpO1xuICAgICAqXG4gICAgICogLy8gd2l0aCBhIHNwZWNpZmljIHRpbWVvdXRcbiAgICAgKiB0cnkge1xuICAgICAqICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzb2NrZXQudGltZW91dCgxMDAwKS5lbWl0V2l0aEFjayhcImhlbGxvXCIsIFwid29ybGRcIik7XG4gICAgICogfSBjYXRjaCAoZXJyKSB7XG4gICAgICogICAvLyB0aGUgc2VydmVyIGRpZCBub3QgYWNrbm93bGVkZ2UgdGhlIGV2ZW50IGluIHRoZSBnaXZlbiBkZWxheVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEByZXR1cm4gYSBQcm9taXNlIHRoYXQgd2lsbCBiZSBmdWxmaWxsZWQgd2hlbiB0aGUgc2VydmVyIGFja25vd2xlZGdlcyB0aGUgZXZlbnRcbiAgICAgKi9cbiAgICBlbWl0V2l0aEFjayhldiwgLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZm4gPSAoYXJnMSwgYXJnMikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBhcmcxID8gcmVqZWN0KGFyZzEpIDogcmVzb2x2ZShhcmcyKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmbi53aXRoRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgYXJncy5wdXNoKGZuKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdChldiwgLi4uYXJncyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGQgdGhlIHBhY2tldCB0byB0aGUgcXVldWUuXG4gICAgICogQHBhcmFtIGFyZ3NcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9hZGRUb1F1ZXVlKGFyZ3MpIHtcbiAgICAgICAgbGV0IGFjaztcbiAgICAgICAgaWYgKHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgYWNrID0gYXJncy5wb3AoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYWNrZXQgPSB7XG4gICAgICAgICAgICBpZDogdGhpcy5fcXVldWVTZXErKyxcbiAgICAgICAgICAgIHRyeUNvdW50OiAwLFxuICAgICAgICAgICAgcGVuZGluZzogZmFsc2UsXG4gICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgZmxhZ3M6IE9iamVjdC5hc3NpZ24oeyBmcm9tUXVldWU6IHRydWUgfSwgdGhpcy5mbGFncyksXG4gICAgICAgIH07XG4gICAgICAgIGFyZ3MucHVzaCgoZXJyLCAuLi5yZXNwb25zZUFyZ3MpID0+IHtcbiAgICAgICAgICAgIGlmIChwYWNrZXQgIT09IHRoaXMuX3F1ZXVlWzBdKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhlIHBhY2tldCBoYXMgYWxyZWFkeSBiZWVuIGFja25vd2xlZGdlZFxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGhhc0Vycm9yID0gZXJyICE9PSBudWxsO1xuICAgICAgICAgICAgaWYgKGhhc0Vycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhY2tldC50cnlDb3VudCA+IHRoaXMuX29wdHMucmV0cmllcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9xdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY2soZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3F1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgaWYgKGFjaykge1xuICAgICAgICAgICAgICAgICAgICBhY2sobnVsbCwgLi4ucmVzcG9uc2VBcmdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYWNrZXQucGVuZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RyYWluUXVldWUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3F1ZXVlLnB1c2gocGFja2V0KTtcbiAgICAgICAgdGhpcy5fZHJhaW5RdWV1ZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIHRoZSBmaXJzdCBwYWNrZXQgb2YgdGhlIHF1ZXVlLCBhbmQgd2FpdCBmb3IgYW4gYWNrbm93bGVkZ2VtZW50IGZyb20gdGhlIHNlcnZlci5cbiAgICAgKiBAcGFyYW0gZm9yY2UgLSB3aGV0aGVyIHRvIHJlc2VuZCBhIHBhY2tldCB0aGF0IGhhcyBub3QgYmVlbiBhY2tub3dsZWRnZWQgeWV0XG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9kcmFpblF1ZXVlKGZvcmNlID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbm5lY3RlZCB8fCB0aGlzLl9xdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYWNrZXQgPSB0aGlzLl9xdWV1ZVswXTtcbiAgICAgICAgaWYgKHBhY2tldC5wZW5kaW5nICYmICFmb3JjZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHBhY2tldC5wZW5kaW5nID0gdHJ1ZTtcbiAgICAgICAgcGFja2V0LnRyeUNvdW50Kys7XG4gICAgICAgIHRoaXMuZmxhZ3MgPSBwYWNrZXQuZmxhZ3M7XG4gICAgICAgIHRoaXMuZW1pdC5hcHBseSh0aGlzLCBwYWNrZXQuYXJncyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIGEgcGFja2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhY2tldFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcGFja2V0KHBhY2tldCkge1xuICAgICAgICBwYWNrZXQubnNwID0gdGhpcy5uc3A7XG4gICAgICAgIHRoaXMuaW8uX3BhY2tldChwYWNrZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiBlbmdpbmUgYG9wZW5gLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBvbm9wZW4oKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5hdXRoID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGhpcy5hdXRoKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2VuZENvbm5lY3RQYWNrZXQoZGF0YSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbmRDb25uZWN0UGFja2V0KHRoaXMuYXV0aCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZHMgYSBDT05ORUNUIHBhY2tldCB0byBpbml0aWF0ZSB0aGUgU29ja2V0LklPIHNlc3Npb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGF0YVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3NlbmRDb25uZWN0UGFja2V0KGRhdGEpIHtcbiAgICAgICAgdGhpcy5wYWNrZXQoe1xuICAgICAgICAgICAgdHlwZTogUGFja2V0VHlwZS5DT05ORUNULFxuICAgICAgICAgICAgZGF0YTogdGhpcy5fcGlkXG4gICAgICAgICAgICAgICAgPyBPYmplY3QuYXNzaWduKHsgcGlkOiB0aGlzLl9waWQsIG9mZnNldDogdGhpcy5fbGFzdE9mZnNldCB9LCBkYXRhKVxuICAgICAgICAgICAgICAgIDogZGF0YSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIGVuZ2luZSBvciBtYW5hZ2VyIGBlcnJvcmAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXJyXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBvbmVycm9yKGVycikge1xuICAgICAgICBpZiAoIXRoaXMuY29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImNvbm5lY3RfZXJyb3JcIiwgZXJyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiBlbmdpbmUgYGNsb3NlYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZWFzb25cbiAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb25cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG9uY2xvc2UocmVhc29uLCBkZXNjcmlwdGlvbikge1xuICAgICAgICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuICAgICAgICBkZWxldGUgdGhpcy5pZDtcbiAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJkaXNjb25uZWN0XCIsIHJlYXNvbiwgZGVzY3JpcHRpb24pO1xuICAgICAgICB0aGlzLl9jbGVhckFja3MoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYXJzIHRoZSBhY2tub3dsZWRnZW1lbnQgaGFuZGxlcnMgdXBvbiBkaXNjb25uZWN0aW9uLCBzaW5jZSB0aGUgY2xpZW50IHdpbGwgbmV2ZXIgcmVjZWl2ZSBhbiBhY2tub3dsZWRnZW1lbnQgZnJvbVxuICAgICAqIHRoZSBzZXJ2ZXIuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9jbGVhckFja3MoKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuYWNrcykuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlzQnVmZmVyZWQgPSB0aGlzLnNlbmRCdWZmZXIuc29tZSgocGFja2V0KSA9PiBTdHJpbmcocGFja2V0LmlkKSA9PT0gaWQpO1xuICAgICAgICAgICAgaWYgKCFpc0J1ZmZlcmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gbm90ZTogaGFuZGxlcnMgdGhhdCBkbyBub3QgYWNjZXB0IGFuIGVycm9yIGFzIGZpcnN0IGFyZ3VtZW50IGFyZSBpZ25vcmVkIGhlcmVcbiAgICAgICAgICAgICAgICBjb25zdCBhY2sgPSB0aGlzLmFja3NbaWRdO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmFja3NbaWRdO1xuICAgICAgICAgICAgICAgIGlmIChhY2sud2l0aEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjay5jYWxsKHRoaXMsIG5ldyBFcnJvcihcInNvY2tldCBoYXMgYmVlbiBkaXNjb25uZWN0ZWRcIikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aXRoIHNvY2tldCBwYWNrZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFja2V0XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBvbnBhY2tldChwYWNrZXQpIHtcbiAgICAgICAgY29uc3Qgc2FtZU5hbWVzcGFjZSA9IHBhY2tldC5uc3AgPT09IHRoaXMubnNwO1xuICAgICAgICBpZiAoIXNhbWVOYW1lc3BhY2UpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHN3aXRjaCAocGFja2V0LnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgUGFja2V0VHlwZS5DT05ORUNUOlxuICAgICAgICAgICAgICAgIGlmIChwYWNrZXQuZGF0YSAmJiBwYWNrZXQuZGF0YS5zaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbmNvbm5lY3QocGFja2V0LmRhdGEuc2lkLCBwYWNrZXQuZGF0YS5waWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJjb25uZWN0X2Vycm9yXCIsIG5ldyBFcnJvcihcIkl0IHNlZW1zIHlvdSBhcmUgdHJ5aW5nIHRvIHJlYWNoIGEgU29ja2V0LklPIHNlcnZlciBpbiB2Mi54IHdpdGggYSB2My54IGNsaWVudCwgYnV0IHRoZXkgYXJlIG5vdCBjb21wYXRpYmxlIChtb3JlIGluZm9ybWF0aW9uIGhlcmU6IGh0dHBzOi8vc29ja2V0LmlvL2RvY3MvdjMvbWlncmF0aW5nLWZyb20tMi14LXRvLTMtMC8pXCIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBhY2tldFR5cGUuRVZFTlQ6XG4gICAgICAgICAgICBjYXNlIFBhY2tldFR5cGUuQklOQVJZX0VWRU5UOlxuICAgICAgICAgICAgICAgIHRoaXMub25ldmVudChwYWNrZXQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQYWNrZXRUeXBlLkFDSzpcbiAgICAgICAgICAgIGNhc2UgUGFja2V0VHlwZS5CSU5BUllfQUNLOlxuICAgICAgICAgICAgICAgIHRoaXMub25hY2socGFja2V0KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUGFja2V0VHlwZS5ESVNDT05ORUNUOlxuICAgICAgICAgICAgICAgIHRoaXMub25kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBhY2tldFR5cGUuQ09OTkVDVF9FUlJPUjpcbiAgICAgICAgICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IocGFja2V0LmRhdGEubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIGVyci5kYXRhID0gcGFja2V0LmRhdGEuZGF0YTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImNvbm5lY3RfZXJyb3JcIiwgZXJyKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiBhIHNlcnZlciBldmVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYWNrZXRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG9uZXZlbnQocGFja2V0KSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBwYWNrZXQuZGF0YSB8fCBbXTtcbiAgICAgICAgaWYgKG51bGwgIT0gcGFja2V0LmlkKSB7XG4gICAgICAgICAgICBhcmdzLnB1c2godGhpcy5hY2socGFja2V0LmlkKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXRFdmVudChhcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVjZWl2ZUJ1ZmZlci5wdXNoKE9iamVjdC5mcmVlemUoYXJncykpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVtaXRFdmVudChhcmdzKSB7XG4gICAgICAgIGlmICh0aGlzLl9hbnlMaXN0ZW5lcnMgJiYgdGhpcy5fYW55TGlzdGVuZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fYW55TGlzdGVuZXJzLnNsaWNlKCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIGxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN1cGVyLmVtaXQuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIGlmICh0aGlzLl9waWQgJiYgYXJncy5sZW5ndGggJiYgdHlwZW9mIGFyZ3NbYXJncy5sZW5ndGggLSAxXSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgdGhpcy5fbGFzdE9mZnNldCA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm9kdWNlcyBhbiBhY2sgY2FsbGJhY2sgdG8gZW1pdCB3aXRoIGFuIGV2ZW50LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBhY2soaWQpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGxldCBzZW50ID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICAgICAgLy8gcHJldmVudCBkb3VibGUgY2FsbGJhY2tzXG4gICAgICAgICAgICBpZiAoc2VudClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBzZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgIHNlbGYucGFja2V0KHtcbiAgICAgICAgICAgICAgICB0eXBlOiBQYWNrZXRUeXBlLkFDSyxcbiAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgZGF0YTogYXJncyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiBhIHNlcnZlciBhY2tub3dsZWRnZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFja2V0XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBvbmFjayhwYWNrZXQpIHtcbiAgICAgICAgY29uc3QgYWNrID0gdGhpcy5hY2tzW3BhY2tldC5pZF07XG4gICAgICAgIGlmICh0eXBlb2YgYWNrICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgdGhpcy5hY2tzW3BhY2tldC5pZF07XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRklYTUUgYWNrIGlzIGluY29ycmVjdGx5IGluZmVycmVkIGFzICduZXZlcidcbiAgICAgICAgaWYgKGFjay53aXRoRXJyb3IpIHtcbiAgICAgICAgICAgIHBhY2tldC5kYXRhLnVuc2hpZnQobnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBhY2suYXBwbHkodGhpcywgcGFja2V0LmRhdGEpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiBzZXJ2ZXIgY29ubmVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25jb25uZWN0KGlkLCBwaWQpIHtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLnJlY292ZXJlZCA9IHBpZCAmJiB0aGlzLl9waWQgPT09IHBpZDtcbiAgICAgICAgdGhpcy5fcGlkID0gcGlkOyAvLyBkZWZpbmVkIG9ubHkgaWYgY29ubmVjdGlvbiBzdGF0ZSByZWNvdmVyeSBpcyBlbmFibGVkXG4gICAgICAgIHRoaXMuY29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5lbWl0QnVmZmVyZWQoKTtcbiAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJjb25uZWN0XCIpO1xuICAgICAgICB0aGlzLl9kcmFpblF1ZXVlKHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbWl0IGJ1ZmZlcmVkIGV2ZW50cyAocmVjZWl2ZWQgYW5kIGVtaXR0ZWQpLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBlbWl0QnVmZmVyZWQoKSB7XG4gICAgICAgIHRoaXMucmVjZWl2ZUJ1ZmZlci5mb3JFYWNoKChhcmdzKSA9PiB0aGlzLmVtaXRFdmVudChhcmdzKSk7XG4gICAgICAgIHRoaXMucmVjZWl2ZUJ1ZmZlciA9IFtdO1xuICAgICAgICB0aGlzLnNlbmRCdWZmZXIuZm9yRWFjaCgocGFja2V0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeU91dGdvaW5nTGlzdGVuZXJzKHBhY2tldCk7XG4gICAgICAgICAgICB0aGlzLnBhY2tldChwYWNrZXQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zZW5kQnVmZmVyID0gW107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIHNlcnZlciBkaXNjb25uZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBvbmRpc2Nvbm5lY3QoKSB7XG4gICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLm9uY2xvc2UoXCJpbyBzZXJ2ZXIgZGlzY29ubmVjdFwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHVwb24gZm9yY2VkIGNsaWVudC9zZXJ2ZXIgc2lkZSBkaXNjb25uZWN0aW9ucyxcbiAgICAgKiB0aGlzIG1ldGhvZCBlbnN1cmVzIHRoZSBtYW5hZ2VyIHN0b3BzIHRyYWNraW5nIHVzIGFuZFxuICAgICAqIHRoYXQgcmVjb25uZWN0aW9ucyBkb24ndCBnZXQgdHJpZ2dlcmVkIGZvciB0aGlzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5zdWJzKSB7XG4gICAgICAgICAgICAvLyBjbGVhbiBzdWJzY3JpcHRpb25zIHRvIGF2b2lkIHJlY29ubmVjdGlvbnNcbiAgICAgICAgICAgIHRoaXMuc3Vicy5mb3JFYWNoKChzdWJEZXN0cm95KSA9PiBzdWJEZXN0cm95KCkpO1xuICAgICAgICAgICAgdGhpcy5zdWJzID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW9bXCJfZGVzdHJveVwiXSh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGlzY29ubmVjdHMgdGhlIHNvY2tldCBtYW51YWxseS4gSW4gdGhhdCBjYXNlLCB0aGUgc29ja2V0IHdpbGwgbm90IHRyeSB0byByZWNvbm5lY3QuXG4gICAgICpcbiAgICAgKiBJZiB0aGlzIGlzIHRoZSBsYXN0IGFjdGl2ZSBTb2NrZXQgaW5zdGFuY2Ugb2YgdGhlIHtAbGluayBNYW5hZ2VyfSwgdGhlIGxvdy1sZXZlbCBjb25uZWN0aW9uIHdpbGwgYmUgY2xvc2VkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBzb2NrZXQgPSBpbygpO1xuICAgICAqXG4gICAgICogc29ja2V0Lm9uKFwiZGlzY29ubmVjdFwiLCAocmVhc29uKSA9PiB7XG4gICAgICogICAvLyBjb25zb2xlLmxvZyhyZWFzb24pOyBwcmludHMgXCJpbyBjbGllbnQgZGlzY29ubmVjdFwiXG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBzb2NrZXQuZGlzY29ubmVjdCgpO1xuICAgICAqXG4gICAgICogQHJldHVybiBzZWxmXG4gICAgICovXG4gICAgZGlzY29ubmVjdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnBhY2tldCh7IHR5cGU6IFBhY2tldFR5cGUuRElTQ09OTkVDVCB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyByZW1vdmUgc29ja2V0IGZyb20gcG9vbFxuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGVkKSB7XG4gICAgICAgICAgICAvLyBmaXJlIGV2ZW50c1xuICAgICAgICAgICAgdGhpcy5vbmNsb3NlKFwiaW8gY2xpZW50IGRpc2Nvbm5lY3RcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFsaWFzIGZvciB7QGxpbmsgZGlzY29ubmVjdCgpfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gc2VsZlxuICAgICAqL1xuICAgIGNsb3NlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGNvbXByZXNzIGZsYWcuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHNvY2tldC5jb21wcmVzcyhmYWxzZSkuZW1pdChcImhlbGxvXCIpO1xuICAgICAqXG4gICAgICogQHBhcmFtIGNvbXByZXNzIC0gaWYgYHRydWVgLCBjb21wcmVzc2VzIHRoZSBzZW5kaW5nIGRhdGFcbiAgICAgKiBAcmV0dXJuIHNlbGZcbiAgICAgKi9cbiAgICBjb21wcmVzcyhjb21wcmVzcykge1xuICAgICAgICB0aGlzLmZsYWdzLmNvbXByZXNzID0gY29tcHJlc3M7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgbW9kaWZpZXIgZm9yIGEgc3Vic2VxdWVudCBldmVudCBlbWlzc2lvbiB0aGF0IHRoZSBldmVudCBtZXNzYWdlIHdpbGwgYmUgZHJvcHBlZCB3aGVuIHRoaXMgc29ja2V0IGlzIG5vdFxuICAgICAqIHJlYWR5IHRvIHNlbmQgbWVzc2FnZXMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHNvY2tldC52b2xhdGlsZS5lbWl0KFwiaGVsbG9cIik7IC8vIHRoZSBzZXJ2ZXIgbWF5IG9yIG1heSBub3QgcmVjZWl2ZSBpdFxuICAgICAqXG4gICAgICogQHJldHVybnMgc2VsZlxuICAgICAqL1xuICAgIGdldCB2b2xhdGlsZSgpIHtcbiAgICAgICAgdGhpcy5mbGFncy52b2xhdGlsZSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgbW9kaWZpZXIgZm9yIGEgc3Vic2VxdWVudCBldmVudCBlbWlzc2lvbiB0aGF0IHRoZSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCB3aXRoIGFuIGVycm9yIHdoZW4gdGhlXG4gICAgICogZ2l2ZW4gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBoYXZlIGVsYXBzZWQgd2l0aG91dCBhbiBhY2tub3dsZWRnZW1lbnQgZnJvbSB0aGUgc2VydmVyOlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBzb2NrZXQudGltZW91dCg1MDAwKS5lbWl0KFwibXktZXZlbnRcIiwgKGVycikgPT4ge1xuICAgICAqICAgaWYgKGVycikge1xuICAgICAqICAgICAvLyB0aGUgc2VydmVyIGRpZCBub3QgYWNrbm93bGVkZ2UgdGhlIGV2ZW50IGluIHRoZSBnaXZlbiBkZWxheVxuICAgICAqICAgfVxuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogQHJldHVybnMgc2VsZlxuICAgICAqL1xuICAgIHRpbWVvdXQodGltZW91dCkge1xuICAgICAgICB0aGlzLmZsYWdzLnRpbWVvdXQgPSB0aW1lb3V0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBmaXJlZCB3aGVuIGFueSBldmVudCBpcyBlbWl0dGVkLiBUaGUgZXZlbnQgbmFtZSBpcyBwYXNzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZVxuICAgICAqIGNhbGxiYWNrLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBzb2NrZXQub25BbnkoKGV2ZW50LCAuLi5hcmdzKSA9PiB7XG4gICAgICogICBjb25zb2xlLmxvZyhgZ290ICR7ZXZlbnR9YCk7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGlzdGVuZXJcbiAgICAgKi9cbiAgICBvbkFueShsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl9hbnlMaXN0ZW5lcnMgPSB0aGlzLl9hbnlMaXN0ZW5lcnMgfHwgW107XG4gICAgICAgIHRoaXMuX2FueUxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgZmlyZWQgd2hlbiBhbnkgZXZlbnQgaXMgZW1pdHRlZC4gVGhlIGV2ZW50IG5hbWUgaXMgcGFzc2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGVcbiAgICAgKiBjYWxsYmFjay4gVGhlIGxpc3RlbmVyIGlzIGFkZGVkIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3RlbmVycyBhcnJheS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogc29ja2V0LnByZXBlbmRBbnkoKGV2ZW50LCAuLi5hcmdzKSA9PiB7XG4gICAgICogICBjb25zb2xlLmxvZyhgZ290IGV2ZW50ICR7ZXZlbnR9YCk7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGlzdGVuZXJcbiAgICAgKi9cbiAgICBwcmVwZW5kQW55KGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX2FueUxpc3RlbmVycyA9IHRoaXMuX2FueUxpc3RlbmVycyB8fCBbXTtcbiAgICAgICAgdGhpcy5fYW55TGlzdGVuZXJzLnVuc2hpZnQobGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIGZpcmVkIHdoZW4gYW55IGV2ZW50IGlzIGVtaXR0ZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGNhdGNoQWxsTGlzdGVuZXIgPSAoZXZlbnQsIC4uLmFyZ3MpID0+IHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBnb3QgZXZlbnQgJHtldmVudH1gKTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBzb2NrZXQub25BbnkoY2F0Y2hBbGxMaXN0ZW5lcik7XG4gICAgICpcbiAgICAgKiAvLyByZW1vdmUgYSBzcGVjaWZpYyBsaXN0ZW5lclxuICAgICAqIHNvY2tldC5vZmZBbnkoY2F0Y2hBbGxMaXN0ZW5lcik7XG4gICAgICpcbiAgICAgKiAvLyBvciByZW1vdmUgYWxsIGxpc3RlbmVyc1xuICAgICAqIHNvY2tldC5vZmZBbnkoKTtcbiAgICAgKlxuICAgICAqIEBwYXJhbSBsaXN0ZW5lclxuICAgICAqL1xuICAgIG9mZkFueShsaXN0ZW5lcikge1xuICAgICAgICBpZiAoIXRoaXMuX2FueUxpc3RlbmVycykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLl9hbnlMaXN0ZW5lcnM7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lciA9PT0gbGlzdGVuZXJzW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2FueUxpc3RlbmVycyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGxpc3RlbmVycyB0aGF0IGFyZSBsaXN0ZW5pbmcgZm9yIGFueSBldmVudCB0aGF0IGlzIHNwZWNpZmllZC4gVGhpcyBhcnJheSBjYW4gYmUgbWFuaXB1bGF0ZWQsXG4gICAgICogZS5nLiB0byByZW1vdmUgbGlzdGVuZXJzLlxuICAgICAqL1xuICAgIGxpc3RlbmVyc0FueSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FueUxpc3RlbmVycyB8fCBbXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBmaXJlZCB3aGVuIGFueSBldmVudCBpcyBlbWl0dGVkLiBUaGUgZXZlbnQgbmFtZSBpcyBwYXNzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZVxuICAgICAqIGNhbGxiYWNrLlxuICAgICAqXG4gICAgICogTm90ZTogYWNrbm93bGVkZ2VtZW50cyBzZW50IHRvIHRoZSBzZXJ2ZXIgYXJlIG5vdCBpbmNsdWRlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogc29ja2V0Lm9uQW55T3V0Z29pbmcoKGV2ZW50LCAuLi5hcmdzKSA9PiB7XG4gICAgICogICBjb25zb2xlLmxvZyhgc2VudCBldmVudCAke2V2ZW50fWApO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogQHBhcmFtIGxpc3RlbmVyXG4gICAgICovXG4gICAgb25BbnlPdXRnb2luZyhsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl9hbnlPdXRnb2luZ0xpc3RlbmVycyA9IHRoaXMuX2FueU91dGdvaW5nTGlzdGVuZXJzIHx8IFtdO1xuICAgICAgICB0aGlzLl9hbnlPdXRnb2luZ0xpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgZmlyZWQgd2hlbiBhbnkgZXZlbnQgaXMgZW1pdHRlZC4gVGhlIGV2ZW50IG5hbWUgaXMgcGFzc2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGVcbiAgICAgKiBjYWxsYmFjay4gVGhlIGxpc3RlbmVyIGlzIGFkZGVkIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3RlbmVycyBhcnJheS5cbiAgICAgKlxuICAgICAqIE5vdGU6IGFja25vd2xlZGdlbWVudHMgc2VudCB0byB0aGUgc2VydmVyIGFyZSBub3QgaW5jbHVkZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHNvY2tldC5wcmVwZW5kQW55T3V0Z29pbmcoKGV2ZW50LCAuLi5hcmdzKSA9PiB7XG4gICAgICogICBjb25zb2xlLmxvZyhgc2VudCBldmVudCAke2V2ZW50fWApO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogQHBhcmFtIGxpc3RlbmVyXG4gICAgICovXG4gICAgcHJlcGVuZEFueU91dGdvaW5nKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX2FueU91dGdvaW5nTGlzdGVuZXJzID0gdGhpcy5fYW55T3V0Z29pbmdMaXN0ZW5lcnMgfHwgW107XG4gICAgICAgIHRoaXMuX2FueU91dGdvaW5nTGlzdGVuZXJzLnVuc2hpZnQobGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIGZpcmVkIHdoZW4gYW55IGV2ZW50IGlzIGVtaXR0ZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGNhdGNoQWxsTGlzdGVuZXIgPSAoZXZlbnQsIC4uLmFyZ3MpID0+IHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBzZW50IGV2ZW50ICR7ZXZlbnR9YCk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogc29ja2V0Lm9uQW55T3V0Z29pbmcoY2F0Y2hBbGxMaXN0ZW5lcik7XG4gICAgICpcbiAgICAgKiAvLyByZW1vdmUgYSBzcGVjaWZpYyBsaXN0ZW5lclxuICAgICAqIHNvY2tldC5vZmZBbnlPdXRnb2luZyhjYXRjaEFsbExpc3RlbmVyKTtcbiAgICAgKlxuICAgICAqIC8vIG9yIHJlbW92ZSBhbGwgbGlzdGVuZXJzXG4gICAgICogc29ja2V0Lm9mZkFueU91dGdvaW5nKCk7XG4gICAgICpcbiAgICAgKiBAcGFyYW0gW2xpc3RlbmVyXSAtIHRoZSBjYXRjaC1hbGwgbGlzdGVuZXIgKG9wdGlvbmFsKVxuICAgICAqL1xuICAgIG9mZkFueU91dGdvaW5nKGxpc3RlbmVyKSB7XG4gICAgICAgIGlmICghdGhpcy5fYW55T3V0Z29pbmdMaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaXN0ZW5lcikge1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fYW55T3V0Z29pbmdMaXN0ZW5lcnM7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lciA9PT0gbGlzdGVuZXJzW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2FueU91dGdvaW5nTGlzdGVuZXJzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgbGlzdGVuZXJzIHRoYXQgYXJlIGxpc3RlbmluZyBmb3IgYW55IGV2ZW50IHRoYXQgaXMgc3BlY2lmaWVkLiBUaGlzIGFycmF5IGNhbiBiZSBtYW5pcHVsYXRlZCxcbiAgICAgKiBlLmcuIHRvIHJlbW92ZSBsaXN0ZW5lcnMuXG4gICAgICovXG4gICAgbGlzdGVuZXJzQW55T3V0Z29pbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hbnlPdXRnb2luZ0xpc3RlbmVycyB8fCBbXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTm90aWZ5IHRoZSBsaXN0ZW5lcnMgZm9yIGVhY2ggcGFja2V0IHNlbnRcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYWNrZXRcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgbm90aWZ5T3V0Z29pbmdMaXN0ZW5lcnMocGFja2V0KSB7XG4gICAgICAgIGlmICh0aGlzLl9hbnlPdXRnb2luZ0xpc3RlbmVycyAmJiB0aGlzLl9hbnlPdXRnb2luZ0xpc3RlbmVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2FueU91dGdvaW5nTGlzdGVuZXJzLnNsaWNlKCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIGxpc3RlbmVyLmFwcGx5KHRoaXMsIHBhY2tldC5kYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICIvKipcbiAqIEluaXRpYWxpemUgYmFja29mZiB0aW1lciB3aXRoIGBvcHRzYC5cbiAqXG4gKiAtIGBtaW5gIGluaXRpYWwgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgWzEwMF1cbiAqIC0gYG1heGAgbWF4IHRpbWVvdXQgWzEwMDAwXVxuICogLSBgaml0dGVyYCBbMF1cbiAqIC0gYGZhY3RvcmAgWzJdXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHNcbiAqIEBhcGkgcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBCYWNrb2ZmKG9wdHMpIHtcbiAgICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgICB0aGlzLm1zID0gb3B0cy5taW4gfHwgMTAwO1xuICAgIHRoaXMubWF4ID0gb3B0cy5tYXggfHwgMTAwMDA7XG4gICAgdGhpcy5mYWN0b3IgPSBvcHRzLmZhY3RvciB8fCAyO1xuICAgIHRoaXMuaml0dGVyID0gb3B0cy5qaXR0ZXIgPiAwICYmIG9wdHMuaml0dGVyIDw9IDEgPyBvcHRzLmppdHRlciA6IDA7XG4gICAgdGhpcy5hdHRlbXB0cyA9IDA7XG59XG4vKipcbiAqIFJldHVybiB0aGUgYmFja29mZiBkdXJhdGlvbi5cbiAqXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5CYWNrb2ZmLnByb3RvdHlwZS5kdXJhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbXMgPSB0aGlzLm1zICogTWF0aC5wb3codGhpcy5mYWN0b3IsIHRoaXMuYXR0ZW1wdHMrKyk7XG4gICAgaWYgKHRoaXMuaml0dGVyKSB7XG4gICAgICAgIHZhciByYW5kID0gTWF0aC5yYW5kb20oKTtcbiAgICAgICAgdmFyIGRldmlhdGlvbiA9IE1hdGguZmxvb3IocmFuZCAqIHRoaXMuaml0dGVyICogbXMpO1xuICAgICAgICBtcyA9IChNYXRoLmZsb29yKHJhbmQgKiAxMCkgJiAxKSA9PSAwID8gbXMgLSBkZXZpYXRpb24gOiBtcyArIGRldmlhdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIE1hdGgubWluKG1zLCB0aGlzLm1heCkgfCAwO1xufTtcbi8qKlxuICogUmVzZXQgdGhlIG51bWJlciBvZiBhdHRlbXB0cy5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5CYWNrb2ZmLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmF0dGVtcHRzID0gMDtcbn07XG4vKipcbiAqIFNldCB0aGUgbWluaW11bSBkdXJhdGlvblxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cbkJhY2tvZmYucHJvdG90eXBlLnNldE1pbiA9IGZ1bmN0aW9uIChtaW4pIHtcbiAgICB0aGlzLm1zID0gbWluO1xufTtcbi8qKlxuICogU2V0IHRoZSBtYXhpbXVtIGR1cmF0aW9uXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuQmFja29mZi5wcm90b3R5cGUuc2V0TWF4ID0gZnVuY3Rpb24gKG1heCkge1xuICAgIHRoaXMubWF4ID0gbWF4O1xufTtcbi8qKlxuICogU2V0IHRoZSBqaXR0ZXJcbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5CYWNrb2ZmLnByb3RvdHlwZS5zZXRKaXR0ZXIgPSBmdW5jdGlvbiAoaml0dGVyKSB7XG4gICAgdGhpcy5qaXR0ZXIgPSBqaXR0ZXI7XG59O1xuIiwgImltcG9ydCB7IFNvY2tldCBhcyBFbmdpbmUsIGluc3RhbGxUaW1lckZ1bmN0aW9ucywgbmV4dFRpY2ssIH0gZnJvbSBcImVuZ2luZS5pby1jbGllbnRcIjtcbmltcG9ydCB7IFNvY2tldCB9IGZyb20gXCIuL3NvY2tldC5qc1wiO1xuaW1wb3J0ICogYXMgcGFyc2VyIGZyb20gXCJzb2NrZXQuaW8tcGFyc2VyXCI7XG5pbXBvcnQgeyBvbiB9IGZyb20gXCIuL29uLmpzXCI7XG5pbXBvcnQgeyBCYWNrb2ZmIH0gZnJvbSBcIi4vY29udHJpYi9iYWNrbzIuanNcIjtcbmltcG9ydCB7IEVtaXR0ZXIsIH0gZnJvbSBcIkBzb2NrZXQuaW8vY29tcG9uZW50LWVtaXR0ZXJcIjtcbmV4cG9ydCBjbGFzcyBNYW5hZ2VyIGV4dGVuZHMgRW1pdHRlciB7XG4gICAgY29uc3RydWN0b3IodXJpLCBvcHRzKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5uc3BzID0ge307XG4gICAgICAgIHRoaXMuc3VicyA9IFtdO1xuICAgICAgICBpZiAodXJpICYmIFwib2JqZWN0XCIgPT09IHR5cGVvZiB1cmkpIHtcbiAgICAgICAgICAgIG9wdHMgPSB1cmk7XG4gICAgICAgICAgICB1cmkgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge307XG4gICAgICAgIG9wdHMucGF0aCA9IG9wdHMucGF0aCB8fCBcIi9zb2NrZXQuaW9cIjtcbiAgICAgICAgdGhpcy5vcHRzID0gb3B0cztcbiAgICAgICAgaW5zdGFsbFRpbWVyRnVuY3Rpb25zKHRoaXMsIG9wdHMpO1xuICAgICAgICB0aGlzLnJlY29ubmVjdGlvbihvcHRzLnJlY29ubmVjdGlvbiAhPT0gZmFsc2UpO1xuICAgICAgICB0aGlzLnJlY29ubmVjdGlvbkF0dGVtcHRzKG9wdHMucmVjb25uZWN0aW9uQXR0ZW1wdHMgfHwgSW5maW5pdHkpO1xuICAgICAgICB0aGlzLnJlY29ubmVjdGlvbkRlbGF5KG9wdHMucmVjb25uZWN0aW9uRGVsYXkgfHwgMTAwMCk7XG4gICAgICAgIHRoaXMucmVjb25uZWN0aW9uRGVsYXlNYXgob3B0cy5yZWNvbm5lY3Rpb25EZWxheU1heCB8fCA1MDAwKTtcbiAgICAgICAgdGhpcy5yYW5kb21pemF0aW9uRmFjdG9yKChfYSA9IG9wdHMucmFuZG9taXphdGlvbkZhY3RvcikgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMC41KTtcbiAgICAgICAgdGhpcy5iYWNrb2ZmID0gbmV3IEJhY2tvZmYoe1xuICAgICAgICAgICAgbWluOiB0aGlzLnJlY29ubmVjdGlvbkRlbGF5KCksXG4gICAgICAgICAgICBtYXg6IHRoaXMucmVjb25uZWN0aW9uRGVsYXlNYXgoKSxcbiAgICAgICAgICAgIGppdHRlcjogdGhpcy5yYW5kb21pemF0aW9uRmFjdG9yKCksXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRpbWVvdXQobnVsbCA9PSBvcHRzLnRpbWVvdXQgPyAyMDAwMCA6IG9wdHMudGltZW91dCk7XG4gICAgICAgIHRoaXMuX3JlYWR5U3RhdGUgPSBcImNsb3NlZFwiO1xuICAgICAgICB0aGlzLnVyaSA9IHVyaTtcbiAgICAgICAgY29uc3QgX3BhcnNlciA9IG9wdHMucGFyc2VyIHx8IHBhcnNlcjtcbiAgICAgICAgdGhpcy5lbmNvZGVyID0gbmV3IF9wYXJzZXIuRW5jb2RlcigpO1xuICAgICAgICB0aGlzLmRlY29kZXIgPSBuZXcgX3BhcnNlci5EZWNvZGVyKCk7XG4gICAgICAgIHRoaXMuX2F1dG9Db25uZWN0ID0gb3B0cy5hdXRvQ29ubmVjdCAhPT0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLl9hdXRvQ29ubmVjdClcbiAgICAgICAgICAgIHRoaXMub3BlbigpO1xuICAgIH1cbiAgICByZWNvbm5lY3Rpb24odikge1xuICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVjb25uZWN0aW9uO1xuICAgICAgICB0aGlzLl9yZWNvbm5lY3Rpb24gPSAhIXY7XG4gICAgICAgIGlmICghdikge1xuICAgICAgICAgICAgdGhpcy5za2lwUmVjb25uZWN0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmVjb25uZWN0aW9uQXR0ZW1wdHModikge1xuICAgICAgICBpZiAodiA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlY29ubmVjdGlvbkF0dGVtcHRzO1xuICAgICAgICB0aGlzLl9yZWNvbm5lY3Rpb25BdHRlbXB0cyA9IHY7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZWNvbm5lY3Rpb25EZWxheSh2KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZWNvbm5lY3Rpb25EZWxheTtcbiAgICAgICAgdGhpcy5fcmVjb25uZWN0aW9uRGVsYXkgPSB2O1xuICAgICAgICAoX2EgPSB0aGlzLmJhY2tvZmYpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zZXRNaW4odik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByYW5kb21pemF0aW9uRmFjdG9yKHYpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAodiA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JhbmRvbWl6YXRpb25GYWN0b3I7XG4gICAgICAgIHRoaXMuX3JhbmRvbWl6YXRpb25GYWN0b3IgPSB2O1xuICAgICAgICAoX2EgPSB0aGlzLmJhY2tvZmYpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zZXRKaXR0ZXIodik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZWNvbm5lY3Rpb25EZWxheU1heCh2KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZWNvbm5lY3Rpb25EZWxheU1heDtcbiAgICAgICAgdGhpcy5fcmVjb25uZWN0aW9uRGVsYXlNYXggPSB2O1xuICAgICAgICAoX2EgPSB0aGlzLmJhY2tvZmYpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zZXRNYXgodik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0aW1lb3V0KHYpIHtcbiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RpbWVvdXQ7XG4gICAgICAgIHRoaXMuX3RpbWVvdXQgPSB2O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RhcnRzIHRyeWluZyB0byByZWNvbm5lY3QgaWYgcmVjb25uZWN0aW9uIGlzIGVuYWJsZWQgYW5kIHdlIGhhdmUgbm90XG4gICAgICogc3RhcnRlZCByZWNvbm5lY3RpbmcgeWV0XG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG1heWJlUmVjb25uZWN0T25PcGVuKCkge1xuICAgICAgICAvLyBPbmx5IHRyeSB0byByZWNvbm5lY3QgaWYgaXQncyB0aGUgZmlyc3QgdGltZSB3ZSdyZSBjb25uZWN0aW5nXG4gICAgICAgIGlmICghdGhpcy5fcmVjb25uZWN0aW5nICYmXG4gICAgICAgICAgICB0aGlzLl9yZWNvbm5lY3Rpb24gJiZcbiAgICAgICAgICAgIHRoaXMuYmFja29mZi5hdHRlbXB0cyA9PT0gMCkge1xuICAgICAgICAgICAgLy8ga2VlcHMgcmVjb25uZWN0aW9uIGZyb20gZmlyaW5nIHR3aWNlIGZvciB0aGUgc2FtZSByZWNvbm5lY3Rpb24gbG9vcFxuICAgICAgICAgICAgdGhpcy5yZWNvbm5lY3QoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHRyYW5zcG9ydCBgc29ja2V0YC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gb3B0aW9uYWwsIGNhbGxiYWNrXG4gICAgICogQHJldHVybiBzZWxmXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIG9wZW4oZm4pIHtcbiAgICAgICAgaWYgKH50aGlzLl9yZWFkeVN0YXRlLmluZGV4T2YoXCJvcGVuXCIpKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIHRoaXMuZW5naW5lID0gbmV3IEVuZ2luZSh0aGlzLnVyaSwgdGhpcy5vcHRzKTtcbiAgICAgICAgY29uc3Qgc29ja2V0ID0gdGhpcy5lbmdpbmU7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICB0aGlzLl9yZWFkeVN0YXRlID0gXCJvcGVuaW5nXCI7XG4gICAgICAgIHRoaXMuc2tpcFJlY29ubmVjdCA9IGZhbHNlO1xuICAgICAgICAvLyBlbWl0IGBvcGVuYFxuICAgICAgICBjb25zdCBvcGVuU3ViRGVzdHJveSA9IG9uKHNvY2tldCwgXCJvcGVuXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHNlbGYub25vcGVuKCk7XG4gICAgICAgICAgICBmbiAmJiBmbigpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgb25FcnJvciA9IChlcnIpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cCgpO1xuICAgICAgICAgICAgdGhpcy5fcmVhZHlTdGF0ZSA9IFwiY2xvc2VkXCI7XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImVycm9yXCIsIGVycik7XG4gICAgICAgICAgICBpZiAoZm4pIHtcbiAgICAgICAgICAgICAgICBmbihlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gT25seSBkbyB0aGlzIGlmIHRoZXJlIGlzIG5vIGZuIHRvIGhhbmRsZSB0aGUgZXJyb3JcbiAgICAgICAgICAgICAgICB0aGlzLm1heWJlUmVjb25uZWN0T25PcGVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8vIGVtaXQgYGVycm9yYFxuICAgICAgICBjb25zdCBlcnJvclN1YiA9IG9uKHNvY2tldCwgXCJlcnJvclwiLCBvbkVycm9yKTtcbiAgICAgICAgaWYgKGZhbHNlICE9PSB0aGlzLl90aW1lb3V0KSB7XG4gICAgICAgICAgICBjb25zdCB0aW1lb3V0ID0gdGhpcy5fdGltZW91dDtcbiAgICAgICAgICAgIC8vIHNldCB0aW1lclxuICAgICAgICAgICAgY29uc3QgdGltZXIgPSB0aGlzLnNldFRpbWVvdXRGbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgb3BlblN1YkRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICBvbkVycm9yKG5ldyBFcnJvcihcInRpbWVvdXRcIikpO1xuICAgICAgICAgICAgICAgIHNvY2tldC5jbG9zZSgpO1xuICAgICAgICAgICAgfSwgdGltZW91dCk7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRzLmF1dG9VbnJlZikge1xuICAgICAgICAgICAgICAgIHRpbWVyLnVucmVmKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnN1YnMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhclRpbWVvdXRGbih0aW1lcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN1YnMucHVzaChvcGVuU3ViRGVzdHJveSk7XG4gICAgICAgIHRoaXMuc3Vicy5wdXNoKGVycm9yU3ViKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFsaWFzIGZvciBvcGVuKClcbiAgICAgKlxuICAgICAqIEByZXR1cm4gc2VsZlxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBjb25uZWN0KGZuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wZW4oZm4pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiB0cmFuc3BvcnQgb3Blbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25vcGVuKCkge1xuICAgICAgICAvLyBjbGVhciBvbGQgc3Vic1xuICAgICAgICB0aGlzLmNsZWFudXAoKTtcbiAgICAgICAgLy8gbWFyayBhcyBvcGVuXG4gICAgICAgIHRoaXMuX3JlYWR5U3RhdGUgPSBcIm9wZW5cIjtcbiAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJvcGVuXCIpO1xuICAgICAgICAvLyBhZGQgbmV3IHN1YnNcbiAgICAgICAgY29uc3Qgc29ja2V0ID0gdGhpcy5lbmdpbmU7XG4gICAgICAgIHRoaXMuc3Vicy5wdXNoKG9uKHNvY2tldCwgXCJwaW5nXCIsIHRoaXMub25waW5nLmJpbmQodGhpcykpLCBvbihzb2NrZXQsIFwiZGF0YVwiLCB0aGlzLm9uZGF0YS5iaW5kKHRoaXMpKSwgb24oc29ja2V0LCBcImVycm9yXCIsIHRoaXMub25lcnJvci5iaW5kKHRoaXMpKSwgb24oc29ja2V0LCBcImNsb3NlXCIsIHRoaXMub25jbG9zZS5iaW5kKHRoaXMpKSwgXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgb24odGhpcy5kZWNvZGVyLCBcImRlY29kZWRcIiwgdGhpcy5vbmRlY29kZWQuYmluZCh0aGlzKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiBhIHBpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG9ucGluZygpIHtcbiAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJwaW5nXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2l0aCBkYXRhLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBvbmRhdGEoZGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5kZWNvZGVyLmFkZChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5vbmNsb3NlKFwicGFyc2UgZXJyb3JcIiwgZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gcGFyc2VyIGZ1bGx5IGRlY29kZXMgYSBwYWNrZXQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG9uZGVjb2RlZChwYWNrZXQpIHtcbiAgICAgICAgLy8gdGhlIG5leHRUaWNrIGNhbGwgcHJldmVudHMgYW4gZXhjZXB0aW9uIGluIGEgdXNlci1wcm92aWRlZCBldmVudCBsaXN0ZW5lciBmcm9tIHRyaWdnZXJpbmcgYSBkaXNjb25uZWN0aW9uIGR1ZSB0byBhIFwicGFyc2UgZXJyb3JcIlxuICAgICAgICBuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcInBhY2tldFwiLCBwYWNrZXQpO1xuICAgICAgICB9LCB0aGlzLnNldFRpbWVvdXRGbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIHNvY2tldCBlcnJvci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25lcnJvcihlcnIpIHtcbiAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJlcnJvclwiLCBlcnIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHNvY2tldCBmb3IgdGhlIGdpdmVuIGBuc3BgLlxuICAgICAqXG4gICAgICogQHJldHVybiB7U29ja2V0fVxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBzb2NrZXQobnNwLCBvcHRzKSB7XG4gICAgICAgIGxldCBzb2NrZXQgPSB0aGlzLm5zcHNbbnNwXTtcbiAgICAgICAgaWYgKCFzb2NrZXQpIHtcbiAgICAgICAgICAgIHNvY2tldCA9IG5ldyBTb2NrZXQodGhpcywgbnNwLCBvcHRzKTtcbiAgICAgICAgICAgIHRoaXMubnNwc1tuc3BdID0gc29ja2V0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX2F1dG9Db25uZWN0ICYmICFzb2NrZXQuYWN0aXZlKSB7XG4gICAgICAgICAgICBzb2NrZXQuY29ubmVjdCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzb2NrZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIGEgc29ja2V0IGNsb3NlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNvY2tldFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2Rlc3Ryb3koc29ja2V0KSB7XG4gICAgICAgIGNvbnN0IG5zcHMgPSBPYmplY3Qua2V5cyh0aGlzLm5zcHMpO1xuICAgICAgICBmb3IgKGNvbnN0IG5zcCBvZiBuc3BzKSB7XG4gICAgICAgICAgICBjb25zdCBzb2NrZXQgPSB0aGlzLm5zcHNbbnNwXTtcbiAgICAgICAgICAgIGlmIChzb2NrZXQuYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2Nsb3NlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhIHBhY2tldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYWNrZXRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9wYWNrZXQocGFja2V0KSB7XG4gICAgICAgIGNvbnN0IGVuY29kZWRQYWNrZXRzID0gdGhpcy5lbmNvZGVyLmVuY29kZShwYWNrZXQpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVuY29kZWRQYWNrZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmVuZ2luZS53cml0ZShlbmNvZGVkUGFja2V0c1tpXSwgcGFja2V0Lm9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsZWFuIHVwIHRyYW5zcG9ydCBzdWJzY3JpcHRpb25zIGFuZCBwYWNrZXQgYnVmZmVyLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjbGVhbnVwKCkge1xuICAgICAgICB0aGlzLnN1YnMuZm9yRWFjaCgoc3ViRGVzdHJveSkgPT4gc3ViRGVzdHJveSgpKTtcbiAgICAgICAgdGhpcy5zdWJzLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuZGVjb2Rlci5kZXN0cm95KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb3NlIHRoZSBjdXJyZW50IHNvY2tldC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2Nsb3NlKCkge1xuICAgICAgICB0aGlzLnNraXBSZWNvbm5lY3QgPSB0cnVlO1xuICAgICAgICB0aGlzLl9yZWNvbm5lY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5vbmNsb3NlKFwiZm9yY2VkIGNsb3NlXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3IgY2xvc2UoKVxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBkaXNjb25uZWN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2xvc2UoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW46XG4gICAgICpcbiAgICAgKiAtIHRoZSBsb3ctbGV2ZWwgZW5naW5lIGlzIGNsb3NlZFxuICAgICAqIC0gdGhlIHBhcnNlciBlbmNvdW50ZXJlZCBhIGJhZGx5IGZvcm1hdHRlZCBwYWNrZXRcbiAgICAgKiAtIGFsbCBzb2NrZXRzIGFyZSBkaXNjb25uZWN0ZWRcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25jbG9zZShyZWFzb24sIGRlc2NyaXB0aW9uKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgICAgIChfYSA9IHRoaXMuZW5naW5lKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2xvc2UoKTtcbiAgICAgICAgdGhpcy5iYWNrb2ZmLnJlc2V0KCk7XG4gICAgICAgIHRoaXMuX3JlYWR5U3RhdGUgPSBcImNsb3NlZFwiO1xuICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImNsb3NlXCIsIHJlYXNvbiwgZGVzY3JpcHRpb24pO1xuICAgICAgICBpZiAodGhpcy5fcmVjb25uZWN0aW9uICYmICF0aGlzLnNraXBSZWNvbm5lY3QpIHtcbiAgICAgICAgICAgIHRoaXMucmVjb25uZWN0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQXR0ZW1wdCBhIHJlY29ubmVjdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcmVjb25uZWN0KCkge1xuICAgICAgICBpZiAodGhpcy5fcmVjb25uZWN0aW5nIHx8IHRoaXMuc2tpcFJlY29ubmVjdClcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgaWYgKHRoaXMuYmFja29mZi5hdHRlbXB0cyA+PSB0aGlzLl9yZWNvbm5lY3Rpb25BdHRlbXB0cykge1xuICAgICAgICAgICAgdGhpcy5iYWNrb2ZmLnJlc2V0KCk7XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcInJlY29ubmVjdF9mYWlsZWRcIik7XG4gICAgICAgICAgICB0aGlzLl9yZWNvbm5lY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGRlbGF5ID0gdGhpcy5iYWNrb2ZmLmR1cmF0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLl9yZWNvbm5lY3RpbmcgPSB0cnVlO1xuICAgICAgICAgICAgY29uc3QgdGltZXIgPSB0aGlzLnNldFRpbWVvdXRGbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGYuc2tpcFJlY29ubmVjdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwicmVjb25uZWN0X2F0dGVtcHRcIiwgc2VsZi5iYWNrb2ZmLmF0dGVtcHRzKTtcbiAgICAgICAgICAgICAgICAvLyBjaGVjayBhZ2FpbiBmb3IgdGhlIGNhc2Ugc29ja2V0IGNsb3NlZCBpbiBhYm92ZSBldmVudHNcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5za2lwUmVjb25uZWN0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgc2VsZi5vcGVuKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmVjb25uZWN0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlY29ubmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJyZWNvbm5lY3RfZXJyb3JcIiwgZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25yZWNvbm5lY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSwgZGVsYXkpO1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0cy5hdXRvVW5yZWYpIHtcbiAgICAgICAgICAgICAgICB0aW1lci51bnJlZigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zdWJzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJUaW1lb3V0Rm4odGltZXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHVwb24gc3VjY2Vzc2Z1bCByZWNvbm5lY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG9ucmVjb25uZWN0KCkge1xuICAgICAgICBjb25zdCBhdHRlbXB0ID0gdGhpcy5iYWNrb2ZmLmF0dGVtcHRzO1xuICAgICAgICB0aGlzLl9yZWNvbm5lY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5iYWNrb2ZmLnJlc2V0KCk7XG4gICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwicmVjb25uZWN0XCIsIGF0dGVtcHQpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyB1cmwgfSBmcm9tIFwiLi91cmwuanNcIjtcbmltcG9ydCB7IE1hbmFnZXIgfSBmcm9tIFwiLi9tYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBTb2NrZXQgfSBmcm9tIFwiLi9zb2NrZXQuanNcIjtcbi8qKlxuICogTWFuYWdlcnMgY2FjaGUuXG4gKi9cbmNvbnN0IGNhY2hlID0ge307XG5mdW5jdGlvbiBsb29rdXAodXJpLCBvcHRzKSB7XG4gICAgaWYgKHR5cGVvZiB1cmkgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgb3B0cyA9IHVyaTtcbiAgICAgICAgdXJpID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgICBjb25zdCBwYXJzZWQgPSB1cmwodXJpLCBvcHRzLnBhdGggfHwgXCIvc29ja2V0LmlvXCIpO1xuICAgIGNvbnN0IHNvdXJjZSA9IHBhcnNlZC5zb3VyY2U7XG4gICAgY29uc3QgaWQgPSBwYXJzZWQuaWQ7XG4gICAgY29uc3QgcGF0aCA9IHBhcnNlZC5wYXRoO1xuICAgIGNvbnN0IHNhbWVOYW1lc3BhY2UgPSBjYWNoZVtpZF0gJiYgcGF0aCBpbiBjYWNoZVtpZF1bXCJuc3BzXCJdO1xuICAgIGNvbnN0IG5ld0Nvbm5lY3Rpb24gPSBvcHRzLmZvcmNlTmV3IHx8XG4gICAgICAgIG9wdHNbXCJmb3JjZSBuZXcgY29ubmVjdGlvblwiXSB8fFxuICAgICAgICBmYWxzZSA9PT0gb3B0cy5tdWx0aXBsZXggfHxcbiAgICAgICAgc2FtZU5hbWVzcGFjZTtcbiAgICBsZXQgaW87XG4gICAgaWYgKG5ld0Nvbm5lY3Rpb24pIHtcbiAgICAgICAgaW8gPSBuZXcgTWFuYWdlcihzb3VyY2UsIG9wdHMpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKCFjYWNoZVtpZF0pIHtcbiAgICAgICAgICAgIGNhY2hlW2lkXSA9IG5ldyBNYW5hZ2VyKHNvdXJjZSwgb3B0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaW8gPSBjYWNoZVtpZF07XG4gICAgfVxuICAgIGlmIChwYXJzZWQucXVlcnkgJiYgIW9wdHMucXVlcnkpIHtcbiAgICAgICAgb3B0cy5xdWVyeSA9IHBhcnNlZC5xdWVyeUtleTtcbiAgICB9XG4gICAgcmV0dXJuIGlvLnNvY2tldChwYXJzZWQucGF0aCwgb3B0cyk7XG59XG4vLyBzbyB0aGF0IFwibG9va3VwXCIgY2FuIGJlIHVzZWQgYm90aCBhcyBhIGZ1bmN0aW9uIChlLmcuIGBpbyguLi4pYCkgYW5kIGFzIGFcbi8vIG5hbWVzcGFjZSAoZS5nLiBgaW8uY29ubmVjdCguLi4pYCksIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG5PYmplY3QuYXNzaWduKGxvb2t1cCwge1xuICAgIE1hbmFnZXIsXG4gICAgU29ja2V0LFxuICAgIGlvOiBsb29rdXAsXG4gICAgY29ubmVjdDogbG9va3VwLFxufSk7XG4vKipcbiAqIFByb3RvY29sIHZlcnNpb24uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgeyBwcm90b2NvbCB9IGZyb20gXCJzb2NrZXQuaW8tcGFyc2VyXCI7XG4vKipcbiAqIEV4cG9zZSBjb25zdHJ1Y3RvcnMgZm9yIHN0YW5kYWxvbmUgYnVpbGQuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgeyBNYW5hZ2VyLCBTb2NrZXQsIGxvb2t1cCBhcyBpbywgbG9va3VwIGFzIGNvbm5lY3QsIGxvb2t1cCBhcyBkZWZhdWx0LCB9O1xuZXhwb3J0IHsgRmV0Y2gsIE5vZGVYSFIsIFhIUiwgTm9kZVdlYlNvY2tldCwgV2ViU29ja2V0LCBXZWJUcmFuc3BvcnQsIH0gZnJvbSBcImVuZ2luZS5pby1jbGllbnRcIjtcbiIsICI1MDRcbiIsICIvL0B0cy1pZ25vcmVcbmltcG9ydCB2ZXJzaW9uVGV4dCBmcm9tIFwiLi4vLi4vLi4vc2RwcHBfcHl0aG9uL3ZlcnNpb24udHh0XCI7XG5cbmV4cG9ydCBjb25zdCBfX0dMT0JBTF9BUElfTEVWRUxfXyA9IHZlcnNpb25UZXh0LnRyaW0oKTtcbiIsICJpbXBvcnQgeyBpbyB9IGZyb20gJ3NvY2tldC5pby1jbGllbnQnO1xuaW1wb3J0IHsgX19HTE9CQUxfQVBJX0xFVkVMX18gfSBmcm9tICcuLi92ZXJzaW9uLm1qcyc7XG5pbXBvcnQgeyBTb2NrZXQgYXMgU29ja2V0SU9DbGllbnQgfSBmcm9tICdzb2NrZXQuaW8tY2xpZW50JztcblxuZXhwb3J0IGNsYXNzIFNvY2tldCB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHNvY2tldDogU29ja2V0SU9DbGllbnQ7XG4gICAgY29uc3RydWN0b3IodXJsOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9ICcvJyArIFt1cmwuc3BsaXQoJy8nKS5zbGljZSgzKS5maWx0ZXIocCA9PiBwKS5qb2luKCcvJyksICdzZC1wcHAvJ10uZmlsdGVyKHAgPT4gcCkuam9pbignLycpO1xuICAgICAgICB1cmwgPSB1cmwuc3BsaXQoJy8nKS5zbGljZSgwLCAzKS5qb2luKCcvJyk7XG5cbiAgICAgICAgdGhpcy5zb2NrZXQgPSBpbyh1cmwsIHtcbiAgICAgICAgICAgIC8vIG9yaWdpbixcbiAgICAgICAgICAgIHRyYW5zcG9ydHM6IFtcIndlYnNvY2tldFwiXSxcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgICAgIGFwaV9sZXZlbDogX19HTE9CQUxfQVBJX0xFVkVMX19cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgYXV0b0Nvbm5lY3Q6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNvY2tldC5vbignY29ubmVjdCcsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LmlvLmVuZ2luZS5iaW5hcnlUeXBlID0gXCJibG9iXCI7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvY2tldC5pZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29ubmVjdCgpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuY29ubmVjdCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbG9zZSgpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIFNvY2tldENvbnN0cnVjdG9yPFQ+ID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcblxuZXhwb3J0IGZ1bmN0aW9uIFNvY2tldE1peGluPFQ+KFxuICAgIC4uLm1peGluczogKChTb2NrZXRDbGFzczogU29ja2V0Q29uc3RydWN0b3I8U29ja2V0PikgPT4gU29ja2V0Q29uc3RydWN0b3I8U29ja2V0PilbXVxuKTogbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gU29ja2V0ICYgVCB7XG4gICAgcmV0dXJuIG1peGlucy5yZWR1Y2UoKFNvY2tldENsYXNzLCBtaXhpbikgPT4gbWl4aW4oU29ja2V0Q2xhc3MpLCBTb2NrZXQpIGFzIG5ldyAoLi4uYXJnczogYW55W10pID0+IFNvY2tldCAmIFQ7XG59XG4iLCAiaW1wb3J0IHsgU29ja2V0LCBTb2NrZXRDb25zdHJ1Y3RvciB9IGZyb20gXCIuLi9jb21tb24vc29ja2V0L1NvY2tldC5tanNcIjtcbmltcG9ydCB7IGFwcCB9IGZyb20gXCIuLi8uLi9tb2R1bGVzL2NvbWZ5L3NyYy9jb21meS1nbG9iYWxzLm10c1wiO1xuaW1wb3J0IHsgUGhvdG9zaG9wQ2FsbGVyIH0gZnJvbSBcIi4vUGhvdG9zaG9wQ2FsbGVySW50ZXJmYWNlLm10c1wiO1xuaW1wb3J0IHsgUGhvdG9zaG9wQ2FsbGVlQWN0aW9ucyB9IGZyb20gXCIuL1Bob3Rvc2hvcENhbGxlZUludGVyZmFjZS5tdHNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIFBob3Rvc2hvcENhbGxlclNvY2tldChTb2NrZXRDbGFzczogU29ja2V0Q29uc3RydWN0b3I8U29ja2V0Pikge1xuXG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgU29ja2V0Q2xhc3MgaW1wbGVtZW50cyBQaG90b3Nob3BDYWxsZXIge1xuICAgICAgICBjb25zdHJ1Y3Rvcih1cmw6IHN0cmluZykge1xuICAgICAgICAgICAgc3VwZXIodXJsKTtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0Lm9uKCdGX3Bob3Rvc2hvcCcsIChwYXlsb2FkOiBhbnksIGNhbGxiYWNrOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGF5bG9hZC5hY3Rpb24gPT0gJ2V4dHJhY3RQU0QnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHAuZ3JhcGgubm9kZXMuZm9yRWFjaCgobm9kZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUudHlwZSA9PSAnU0RQUFAgR2V0IERvY3VtZW50Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4dHJhY3RQU0Qobm9kZSwgcGF5bG9hZC5wYXJhbXMuZnJvbV9zaWQsICcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh7fSlcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh7IGVycm9yOiBlcnJvci5tZXNzYWdlIH0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBhc3luYyBpbXBvcnRQU0REYXRhVVJMRnJvbVBob3Rvc2hvcChzaWQ6IHN0cmluZywgZG9jdW1lbnRfaWRlbnRpZnk6IHN0cmluZywgZnJvbVNTSUQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgICAgICBjb25zdCBibG9iOiBCbG9iID0gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc29ja2V0LmVtaXQoJ0JfcGhvdG9zaG9wJywge1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdwc2QnLFxuICAgICAgICAgICAgICAgICAgICBzaWQ6IHNpZCxcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdnZXQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZnJvbVNTSUQsXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudF9pZGVudGlmeVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgKHBheWxvYWQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHBheWxvYWQuZGF0YSBhcyBhbnkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGJsb2IpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgICAgIHJlYWRlci5vbmxvYWRlbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkYXRhVVJMID0gcmVhZGVyLnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhVVJMIGFzIHN0cmluZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBhc3luYyBleHBvcnRQU0REYXRhVVJMVG9QaG90b3Nob3Aoc2lkOiBzdHJpbmcsIGRvY3VtZW50X2lkZW50aWZ5OiBzdHJpbmcsIGRhdGFVUkw6IHN0cmluZywgZnJvbVNTSUQ6IHN0cmluZykge1xuICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgZmV0Y2goZGF0YVVSTCkudGhlbihyZXMgPT4gcmVzLmFycmF5QnVmZmVyKCkpO1xuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc29ja2V0LmVtaXQoJ0JfcGhvdG9zaG9wJywge1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdwc2QnLFxuICAgICAgICAgICAgICAgICAgICBzaWQ6IHNpZCxcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdleHRyYWN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyb21TU0lELFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRfaWRlbnRpZnksXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBidWZmZXJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIChwYXlsb2FkOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShwYXlsb2FkIGFzIGFueSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHB1YmxpYyBhc3luYyBnZXRJbWFnZShzaWQ6IHN0cmluZywgcGF5bG9hZDogUGhvdG9zaG9wQ2FsbGVlQWN0aW9uc1snZ2V0SW1hZ2UnXVsncGFyYW1zJ10pIHtcbiAgICAgICAgLy8gICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIC8vICAgICAgICAgdGhpcy5zb2NrZXQuZW1pdCgnQl9waG90b3Nob3AnLCB7XG4gICAgICAgIC8vICAgICAgICAgICAgIGFjdGlvbjogJ2dldEltYWdlJyxcbiAgICAgICAgLy8gICAgICAgICAgICAgc2lkOiBzaWQsXG4gICAgICAgIC8vICAgICAgICAgICAgIHBhcmFtczogcGF5bG9hZFxuICAgICAgICAvLyAgICAgICAgIH0sIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgLy8gICAgICAgICAgICAgZGF0YSAmJiBkYXRhLmVycm9yID8gcmVqZWN0KG5ldyBFcnJvcihkYXRhLmVycm9yKSkgOiByZXNvbHZlKGRhdGEpO1xuICAgICAgICAvLyAgICAgICAgIH0pO1xuICAgICAgICAvLyAgICAgfSk7XG4gICAgICAgIC8vIH1cblxuICAgICAgICBwdWJsaWMgYXN5bmMgc2VuZEltYWdlKHNpZDogc3RyaW5nLCBwYXlsb2FkOiBQaG90b3Nob3BDYWxsZWVBY3Rpb25zWydzZW5kSW1hZ2VzJ11bJ3BhcmFtcyddKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc29ja2V0LmVtaXQoJ0JfcGhvdG9zaG9wJywge1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdzZW5kSW1hZ2VzJyxcbiAgICAgICAgICAgICAgICAgICAgc2lkOiBzaWQsXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtczogcGF5bG9hZFxuICAgICAgICAgICAgICAgIH0sIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YSAmJiBkYXRhLmVycm9yID8gcmVqZWN0KG5ldyBFcnJvcihkYXRhLmVycm9yKSkgOiByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgYXN5bmMgZ2V0U3BlY2lhbElkZW50aWZpZXJWYWx1ZShzaWQ6IHN0cmluZywgcGF5bG9hZDogUGhvdG9zaG9wQ2FsbGVlQWN0aW9uc1snZ2V0U3BlY2lhbElkZW50aWZpZXJWYWx1ZSddWydwYXJhbXMnXSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5lbWl0KCdCX3Bob3Rvc2hvcCcsIHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnZ2V0U3BlY2lhbElkZW50aWZpZXJWYWx1ZScsXG4gICAgICAgICAgICAgICAgICAgIHNpZDogc2lkLFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHBheWxvYWRcbiAgICAgICAgICAgICAgICB9LCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgJiYgZGF0YS5lcnJvciA/IHJlamVjdChuZXcgRXJyb3IoZGF0YS5lcnJvcikpIDogcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2FtZSBhcyB0aGUgb25lIGluIFNEUFBQRG9jdW1lbnQgbm9kZS5cbiAgICAgICAgcHJpdmF0ZSBhc3luYyBleHRyYWN0UFNEKG5vZGU6IGFueSwgc2lkOiBzdHJpbmcsIGRvY3VtZW50SWRlbnRpZnk6IHN0cmluZykge1xuICAgICAgICAgICAgaWYgKG5vZGUucHJvcGVydGllcy5wc2QpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmV4cG9ydFBTRERhdGFVUkxUb1Bob3Rvc2hvcChzaWQsIGRvY3VtZW50SWRlbnRpZnksIG5vZGUucHJvcGVydGllc1sncHNkJ10sIHRoaXMuc29ja2V0LmlkIHx8IFwiPz9cIilcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDMwMCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgKGdsb2JhbFRoaXMgYXMgYW55KS5hcHAuY2FudmFzLmRyYXcodHJ1ZSwgdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGNvbnNvbGUuZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsICJleHBvcnQgY29uc3QgYmxhbmtHcmFwaCA9IHtcbiAgICBsYXN0X25vZGVfaWQ6IDAsXG4gICAgbGFzdF9saW5rX2lkOiAwLFxuICAgIG5vZGVzOiBbXSxcbiAgICBsaW5rczogW10sXG4gICAgZ3JvdXBzOiBbXSxcbiAgICBjb25maWc6IHt9LFxuICAgIGV4dHJhOiB7fSxcbiAgICB2ZXJzaW9uOiAwLjRcbn1cbiIsICJpbXBvcnQgeyBwYWdlU3RvcmUgfSBmcm9tIFwicGhvdG9zaG9wTW9kZWxzLm1qc1wiO1xuaW1wb3J0IGkxOG4gZnJvbSBcIi4uLy4uLy4uL3NyYy9jb21tb24vaTE4bi5tdHNcIjtcbmltcG9ydCB7IHNkcHBwWCB9IGZyb20gXCIuLi8uLi8uLi9zcmMvY29tbW9uL3NkcHBwWC5tdHNcIjtcbmltcG9ydCB7IFdpZGdldFRhYmxlU3RydWN0dXJlLCBXaWRnZXRUYWJsZVN0cnVjdHVyZU5vZGUsIFdpZGdldFRhYmxlVmFsdWUgfSBmcm9tIFwiLi4vLi4vLi4vc3JjL3R5cGVzL3NkcHBwXCI7XG5pbXBvcnQgeyBhcHAgfSBmcm9tIFwiLi9jb21meS1nbG9iYWxzLm10c1wiO1xuXG4vLyBEZWZpbmUgYSB0eXBlIGZvciB0aGUgY29udmVydGVyIGZ1bmN0aW9uXG50eXBlIE5vZGVDb252ZXJ0ZXIgPSAobm9kZTogYW55KSA9PiBXaWRnZXRUYWJsZVN0cnVjdHVyZU5vZGUgfCBudWxsO1xudHlwZSBXaWRnZXRWYWx1ZVNldHRlciA9IChub2RlOiBhbnksIHdpZGdldEluZGV4OiBhbnksIHZhbHVlOiBhbnkpID0+IGJvb2xlYW47XG5cbmNvbnN0IGN1c3RvbU5vZGVDb252ZXJ0ZXJzQnlXaWxkY2FyZDogW3N0cmluZywge1xuICAgIGZvcm1hdHRlcjogTm9kZUNvbnZlcnRlcixcbiAgICBzZXR0ZXI6IFdpZGdldFZhbHVlU2V0dGVyIHwgbnVsbFxufV1bXSA9IFtdO1xuXG5zZHBwcFgud2lkZ2V0YWJsZSA9IHNkcHBwWC53aWRnZXRhYmxlIHx8IHt9O1xuc2RwcHBYLndpZGdldGFibGUuYWRkID0gZnVuY3Rpb24gKG5hbWU6IHN0cmluZywgZm46IE5vZGVDb252ZXJ0ZXIgfCB7XG4gICAgZm9ybWF0dGVyOiBOb2RlQ29udmVydGVyLFxuICAgIHNldHRlcjogV2lkZ2V0VmFsdWVTZXR0ZXJcbn0pIHtcbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGN1c3RvbU5vZGVDb252ZXJ0ZXJzQnlXaWxkY2FyZC5wdXNoKFtuYW1lLCB7XG4gICAgICAgICAgICBmb3JtYXR0ZXI6IGZuLFxuICAgICAgICAgICAgc2V0dGVyOiBudWxsXG4gICAgICAgIH1dKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjdXN0b21Ob2RlQ29udmVydGVyc0J5V2lsZGNhcmQucHVzaChbbmFtZSwgZm5dKTtcbiAgICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHNldFdpZGdldFZhbHVlKG5vZGU6IGFueSwgd2lkZ2V0SW5kZXg6IGFueSwgdmFsdWU6IGFueSkge1xuICAgIGNvbnN0IGRlZmF1bHRDb252ZXJ0ZXIgPSBjdXN0b21Ob2RlQ29udmVydGVyc0J5V2lsZGNhcmQuZmluZCgoW3dpbGRjYXJkXSkgPT4ge1xuICAgICAgICByZXR1cm4gd2lsZGNhcmQgPT0gJ19fREVGQVVMVF9fJ1xuICAgIH0pXG4gICAgY29uc3QgY29udmVydGVyID0gY3VzdG9tTm9kZUNvbnZlcnRlcnNCeVdpbGRjYXJkLmZpbmQoKFt3aWxkY2FyZF0pID0+IHtcbiAgICAgICAgcmV0dXJuIHdpbGRjYXJkTWF0Y2god2lsZGNhcmQsIG5vZGUudHlwZSk7XG4gICAgfSkgfHwgZGVmYXVsdENvbnZlcnRlcjtcbiAgICBsZXQgc2V0dGVkID0gZmFsc2U7XG4gICAgaWYgKGNvbnZlcnRlcikge1xuICAgICAgICBjb25zdCBzZXR0ZXIgPSBjb252ZXJ0ZXJbMV0uc2V0dGVyO1xuICAgICAgICBpZiAoc2V0dGVyKSB7XG4gICAgICAgICAgICBzZXR0ZWQgPSAhIXNldHRlcihub2RlLCB3aWRnZXRJbmRleCwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghc2V0dGVkKSB7XG4gICAgICAgIG5vZGUud2lkZ2V0c1t3aWRnZXRJbmRleF0udmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgbm9kZS53aWRnZXRzW3dpZGdldEluZGV4XS5jYWxsYmFjaz8uKHZhbHVlKVxuICAgIH1cbiAgICBjb25zdCB3b3JrZmxvd01hbmFnZXIgPSBhcHAud29ya2Zsb3dNYW5hZ2VyIHx8IGFwcC5leHRlbnNpb25NYW5hZ2VyLndvcmtmbG93XG4gICAgd29ya2Zsb3dNYW5hZ2VyLmFjdGl2ZVdvcmtmbG93Py5jaGFuZ2VUcmFja2VyLmNoZWNrU3RhdGUoKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2lkZ2V0VGFibGVWYWx1ZShncmFwaDogYW55KTogV2lkZ2V0VGFibGVWYWx1ZSB7XG4gICAgY29uc3QgcmV0OiBXaWRnZXRUYWJsZVZhbHVlID0ge307XG4gICAgY29uc3QgZGVmYXVsdENvbnZlcnRlciA9IGN1c3RvbU5vZGVDb252ZXJ0ZXJzQnlXaWxkY2FyZC5maW5kKChbd2lsZGNhcmRdKSA9PiB7XG4gICAgICAgIHJldHVybiB3aWxkY2FyZCA9PSAnX19ERUZBVUxUX18nXG4gICAgfSlcblxuICAgIGdyYXBoXG4gICAgICAgIC5ub2Rlc1xuICAgICAgICAuZm9yRWFjaCgobm9kZTogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoIW5vZGUud2lkZ2V0cyB8fCBub2RlLndpZGdldHMubGVuZ3RoID09IDApIHJldHVybjsgLy8gbm8gd2lkZ2V0c1xuICAgICAgICAgICAgY29uc3QgY29udmVydGVyID0gY3VzdG9tTm9kZUNvbnZlcnRlcnNCeVdpbGRjYXJkLmZpbmQoKFt3aWxkY2FyZF0pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gd2lsZGNhcmRNYXRjaCh3aWxkY2FyZCwgbm9kZS50eXBlKTtcbiAgICAgICAgICAgIH0pIHx8IGRlZmF1bHRDb252ZXJ0ZXI7XG4gICAgICAgICAgICBpZiAoY29udmVydGVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udmVydGVkID0gY29udmVydGVyWzFdLmZvcm1hdHRlcihub2RlKTtcbiAgICAgICAgICAgICAgICBpZiAoY29udmVydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFtub2RlLmlkXSA9IGNvbnZlcnRlZC53aWRnZXRzLm1hcCgod2lkZ2V0OiBhbnkpID0+IHdpZGdldC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICByZXR1cm4gcmV0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFrZVdpZGdldFRhYmxlU3RydWN0dXJlKGdyYXBoOiBhbnksIGFjdGl2ZVdvcmtmbG93OiBhbnkpOiBXaWRnZXRUYWJsZVN0cnVjdHVyZSB7XG4gICAgaWYgKCFncmFwaCkgcmV0dXJuIHtcbiAgICAgICAgd2lkZ2V0VGFibGVJRDogJycsXG4gICAgICAgIHdpZGdldFRhYmxlUGF0aDogJycsXG4gICAgICAgIHdpZGdldFRhYmxlUGVyc2lzdGVkOiBmYWxzZSxcbiAgICAgICAgZ3JvdXBzOiB7fSxcbiAgICAgICAgbm9kZXM6IHt9LFxuICAgICAgICBub2RlSW5kZXhlczogW10sXG4gICAgICAgIGV4dHJhT3B0aW9uczoge1xuICAgICAgICAgICAgdXNlU2xpZGVyRm9yTnVtYmVyV2lkZ2V0OiBwYWdlU3RvcmUuZGF0YS51c2VTbGlkZXJGb3JOdW1iZXJXaWRnZXRcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgZ3JvdXBzOiBXaWRnZXRUYWJsZVN0cnVjdHVyZVsnZ3JvdXBzJ10gPSBncmFwaFxuICAgICAgICAuZ3JvdXBzXG4gICAgICAgIC5tYXAoKGdyb3VwOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGdyb3VwLnJlY29tcHV0ZUluc2lkZU5vZGVzKCk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGlkOiBncm91cC5pZCxcbiAgICAgICAgICAgICAgICBuYW1lOiBncm91cC50aXRsZSxcbiAgICAgICAgICAgICAgICBjb2xvcjogZ3JvdXAuY29sb3IsXG4gICAgICAgICAgICAgICAgbm9kZUlEczogZ3JvdXAubm9kZXMubWFwKChub2RlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUuaWQ7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgY29uc3Qgbm9kZXM6IFdpZGdldFRhYmxlU3RydWN0dXJlTm9kZVtdID0gZ3JhcGhcbiAgICAgICAgLm5vZGVzXG4gICAgICAgIC5tYXAoKG5vZGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKG5vZGUubW9kZSAhPSAwKSByZXR1cm47IC8vIG11dGVkIG9yIGJ5IHBhc3NlZFxuICAgICAgICAgICAgY29uc3QgdGl0bGUgPSBnZXRUaXRsZShub2RlKTtcbiAgICAgICAgICAgIGlmICghdGl0bGUgfHwgdGl0bGUuc3RhcnRzV2l0aChcIi5cIikpIHJldHVybjsgLy8gaGlkZGVuXG4gICAgICAgICAgICBpZiAoIW5vZGUud2lkZ2V0cyB8fCBub2RlLndpZGdldHMubGVuZ3RoID09IDApIHJldHVybjsgLy8gbm8gd2lkZ2V0c1xuXG4gICAgICAgICAgICBjb25zdCBjb252ZXJ0ZXIgPSBjdXN0b21Ob2RlQ29udmVydGVyc0J5V2lsZGNhcmQuZmluZCgoW3dpbGRjYXJkXSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB3aWxkY2FyZE1hdGNoKHdpbGRjYXJkLCBub2RlLnR5cGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoY29udmVydGVyKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udmVydGVkID0gY29udmVydGVyWzFdLmZvcm1hdHRlcihub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnZlcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydGVkLmlkID0gbm9kZS5pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZC51aVdlaWdodFN1bSA9IGNvbnZlcnRlZC53aWRnZXRzLnJlZHVjZSgoc3VtOiBudW1iZXIsIHdpZGdldDogYW55KSA9PiBzdW0gKyAod2lkZ2V0LnVpV2VpZ2h0IHx8IDEyKSwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogbm9kZS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVpV2VpZ2h0U3VtOiAxMixcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZGdldHM6IFt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogaTE4bignY29udmVydCB3aWRnZXQgezB9IGZhaWxlZDonLCBjb252ZXJ0ZXJbMF0pICsgKGUubWVzc2FnZSB8fCBlIHx8ICcnKSArIChlPy5zdGFjayB8fCAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGdlbmVyaWMgbm9kZSBcbiAgICAgICAgICAgIC8vb25seSB1c2UgdGhlIG5vZGVzIHN0YXJ0cyB3aXRoICNcbiAgICAgICAgICAgIGlmICghdGl0bGUuc3RhcnRzV2l0aChcIiNcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHdpZGdldHMgPSBub2RlLndpZGdldHM7XG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0Q29udmVydGVyID0gY3VzdG9tTm9kZUNvbnZlcnRlcnNCeVdpbGRjYXJkLmZpbmQoKFt3aWxkY2FyZF0pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gd2lsZGNhcmQgPT0gJ19fREVGQVVMVF9fJ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGlmIChkZWZhdWx0Q29udmVydGVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udmVydGVkID0gZGVmYXVsdENvbnZlcnRlclsxXS5mb3JtYXR0ZXIobm9kZSk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnZlcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihjb252ZXJ0ZWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVpV2VpZ2h0U3VtOiBjb252ZXJ0ZWQud2lkZ2V0cy5yZWR1Y2UoKHN1bTogbnVtYmVyLCB3aWRnZXQ6IGFueSkgPT4gc3VtICsgKHdpZGdldC51aVdlaWdodCB8fCAxMiksIDApLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjb252ZXJ0ZWQgPSB7XG4gICAgICAgICAgICAgICAgaWQ6IG5vZGUuaWQsXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxuICAgICAgICAgICAgICAgIHdpZGdldHM6IHdpZGdldHMubWFwKCh3aWRnZXQ6IGFueSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogd2lkZ2V0LmxhYmVsIHx8IHdpZGdldC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRUeXBlOiB3aWRnZXQudHlwZSB8fCBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogd2lkZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB3aWRnZXQub3B0aW9uc1xuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGNvbnZlcnRlZCwge1xuICAgICAgICAgICAgICAgIHVpV2VpZ2h0U3VtOiBjb252ZXJ0ZWQud2lkZ2V0cy5yZWR1Y2UoKHN1bTogbnVtYmVyLCB3aWRnZXQ6IGFueSkgPT4gc3VtICsgKHdpZGdldC51aVdlaWdodCB8fCAxMiksIDApLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgLnNvcnQoKGE6IFdpZGdldFRhYmxlU3RydWN0dXJlTm9kZSwgYjogV2lkZ2V0VGFibGVTdHJ1Y3R1cmVOb2RlKSA9PiB7XG4gICAgICAgICAgICBsZXQgdGl0bGVBID0gZ2V0VGl0bGUoYSk7XG4gICAgICAgICAgICBsZXQgdGl0bGVCID0gZ2V0VGl0bGUoYik7XG4gICAgICAgICAgICB0aXRsZUEgPSB0aXRsZUEuc3RhcnRzV2l0aChcIiNcIikgPyB0aXRsZUEuc2xpY2UoMSkudHJpbSgpIDogdGl0bGVBLnRyaW0oKTtcbiAgICAgICAgICAgIHRpdGxlQiA9IHRpdGxlQi5zdGFydHNXaXRoKFwiI1wiKSA/IHRpdGxlQi5zbGljZSgxKS50cmltKCkgOiB0aXRsZUIudHJpbSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRpdGxlQS5sb2NhbGVDb21wYXJlKHRpdGxlQik7XG4gICAgICAgIH0pXG5cbiAgICByZXR1cm4ge1xuICAgICAgICB3aWRnZXRUYWJsZVBhdGg6IGFjdGl2ZVdvcmtmbG93LnBhdGgsXG4gICAgICAgIHdpZGdldFRhYmxlUGVyc2lzdGVkOiBhY3RpdmVXb3JrZmxvdy5pc1BlcnNpc3RlZCxcbiAgICAgICAgd2lkZ2V0VGFibGVJRDogYWN0aXZlV29ya2Zsb3cuYWN0aXZlU3RhdGUuaWQsXG4gICAgICAgIGdyb3VwcyxcbiAgICAgICAgbm9kZXM6IG5vZGVzLnJlZHVjZSgoYWNjOiBSZWNvcmQ8bnVtYmVyLCBXaWRnZXRUYWJsZVN0cnVjdHVyZU5vZGU+LCBub2RlOiBXaWRnZXRUYWJsZVN0cnVjdHVyZU5vZGUpID0+IHtcbiAgICAgICAgICAgIGFjY1tub2RlLmlkXSA9IG5vZGU7XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LCB7fSksXG4gICAgICAgIG5vZGVJbmRleGVzOiBub2Rlcy5tYXAoKG5vZGU6IFdpZGdldFRhYmxlU3RydWN0dXJlTm9kZSkgPT4gbm9kZS5pZCksXG4gICAgICAgIGV4dHJhT3B0aW9uczoge1xuICAgICAgICAgICAgdXNlU2xpZGVyRm9yTnVtYmVyV2lkZ2V0OiBwYWdlU3RvcmUuZGF0YS51c2VTbGlkZXJGb3JOdW1iZXJXaWRnZXRcbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG5mdW5jdGlvbiB3aWxkY2FyZE1hdGNoKHBhdHRlcm46IHN0cmluZywgdGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gQ29udmVydCB3aWxkY2FyZCBwYXR0ZXJuIHRvIHJlZ2V4IHBhdHRlcm5cbiAgICBjb25zdCByZWdleFBhdHRlcm4gPSBwYXR0ZXJuXG4gICAgICAgIC5yZXBsYWNlKC9bLiteJHt9KCl8W1xcXVxcXFxdL2csICdcXFxcJCYnKSAvLyBFc2NhcGUgcmVnZXggc3BlY2lhbCBjaGFycyBleGNlcHQgKiBhbmQgP1xuICAgICAgICAucmVwbGFjZSgvXFwqL2csICcuKicpICAgICAgICAgICAgICAgICAgLy8gKiBtYXRjaGVzIGFueSBzZXF1ZW5jZVxuICAgICAgICAucmVwbGFjZSgvXFw/L2csICcuJyk7ICAgICAgICAgICAgICAgICAgLy8gPyBtYXRjaGVzIGFueSBzaW5nbGUgY2hhcmFjdGVyXG5cbiAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYF4ke3JlZ2V4UGF0dGVybn0kYCk7XG4gICAgcmV0dXJuIHJlZ2V4LnRlc3QodGV4dCk7XG59XG5cbi8qKlxuICogZ2V0IHRoZSB0aXRsZSBvZiB0aGUgbm9kZSwgd2l0aCBwcmlvcml0eSB0byBhdm9pZCBjb25mbGljdHMgd2l0aCB0aGUgaGlkZGVuIHByb3BlcnR5IHNkcHBwX3dpZGdldGFibGVfdGl0bGVcbiAqIFx1ODNCN1x1NTNENlx1ODI4Mlx1NzBCOVx1NzY4NFx1NjgwN1x1OTg5OCwgXHU0RjE4XHU1MTQ4XHU3NTI4XHU0RThFXHU4OUM0XHU5MDdGXHU1MUIyXHU3QTgxXHU3Njg0XHU5NjkwXHU4NUNGXHU1QzVFXHU2MDI3c2RwcHBfd2lkZ2V0YWJsZV90aXRsZVxuICogXG4gKiBAcGFyYW0geyp9IG5vZGUgXG4gKiBAcmV0dXJucyBcbiAqL1xuZnVuY3Rpb24gZ2V0VGl0bGUobm9kZTogYW55LCBkZWZhdWx0VGl0bGU6IHN0cmluZyA9ICcnKSB7XG4gICAgbGV0IHJldFRpdGxlID0gZGVmYXVsdFRpdGxlIHx8IG5vZGUudGl0bGUgfHwgJyc7XG4gICAgaWYgKG5vZGUuc2V0UHJvcGVydHkgJiYgKHJldFRpdGxlLnN0YXJ0c1dpdGgoXCIjXCIpIHx8IHJldFRpdGxlLnN0YXJ0c1dpdGgoXCIuXCIpKSkge1xuICAgICAgICBub2RlLnNldFByb3BlcnR5KCdzZHBwcF93aWRnZXRhYmxlX3RpdGxlJywgcmV0VGl0bGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldFRpdGxlID0gbm9kZS5wcm9wZXJ0aWVzPy5bJ3NkcHBwX3dpZGdldGFibGVfdGl0bGUnXSB8fCByZXRUaXRsZTtcbiAgICB9XG4gICAgcmV0dXJuIHJldFRpdGxlO1xufVxuc2RwcHBYLmdldE5vZGVUaXRsZSA9IGdldFRpdGxlOyIsICJjb25zdCBwcm9tcHRzRnJvbVNEUFBQQmFja2VuZCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5leHBvcnQgZGVmYXVsdCBwcm9tcHRzRnJvbVNEUFBQQmFja2VuZFxuIiwgImltcG9ydCB7IFdvcmtmbG93Q2FsbGVlQWN0aW9ucyB9IGZyb20gXCIuLi8uLi8uLi8uLi9zcmMvc29ja2V0L1dvcmtmbG93Q2FsbGVlSW50ZXJmYWNlLm10c1wiO1xuaW1wb3J0IHsgU29ja2V0LCBTb2NrZXRDb25zdHJ1Y3RvciB9IGZyb20gXCIuLi8uLi8uLi8uLi9zcmMvY29tbW9uL3NvY2tldC9Tb2NrZXQubXRzXCI7XG5pbXBvcnQgeyBXb3JrZmxvd0NhbGxlckFjdGlvbnMgfSBmcm9tIFwiLi4vLi4vLi4vLi4vc3JjL3NvY2tldC9Xb3JrZmxvd0NhbGxlckludGVyZmFjZS5tdHNcIjtcbmltcG9ydCB7IHBhZ2VTdG9yZSB9IGZyb20gXCIuLi8uLi9waG90b3Nob3BNb2RlbHMubXRzXCI7XG5pbXBvcnQgeyBhcGksIGFwcCB9IGZyb20gXCIuLi9jb21meS1nbG9iYWxzLm10c1wiO1xuaW1wb3J0IHsgYmxhbmtHcmFwaCB9IGZyb20gXCIuLi9kZWZhdWx0R3JhcGgubXRzXCI7XG5pbXBvcnQgeyBtYWtlV2lkZ2V0VGFibGVTdHJ1Y3R1cmUsIHNldFdpZGdldFZhbHVlIH0gZnJvbSBcIi4uL2dyYXBoLXRvLWZvcm0ubXRzXCI7XG5pbXBvcnQgUHJldmlld1NlbmRlciBmcm9tIFwiLi4vUHJldmlld1NlbmRlci5tdHNcIjtcbmltcG9ydCBpMThuIGZyb20gXCIuLi8uLi8uLi8uLi9zcmMvY29tbW9uL2kxOG4ubXRzXCI7XG5cbmludGVyZmFjZSBXb3JrZmxvd0NhbGxlZVBheWxvYWQge1xuICAgIGFjdGlvbjoga2V5b2YgV29ya2Zsb3dDYWxsZWVBY3Rpb25zLFxuICAgIHNpZDogc3RyaW5nLFxuICAgIHBhcmFtczogV29ya2Zsb3dDYWxsZWVBY3Rpb25zW2tleW9mIFdvcmtmbG93Q2FsbGVlQWN0aW9uc11bJ3BhcmFtcyddXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBXb3JrZmxvd0NhbGxlZVNvY2tldChTb2NrZXRDbGFzczogU29ja2V0Q29uc3RydWN0b3I8U29ja2V0Pikge1xuXG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgU29ja2V0Q2xhc3Mge1xuICAgICAgICBwcml2YXRlIHdvcmtmbG93TWFuYWdlcjogYW55XG5cbiAgICAgICAgY29uc3RydWN0b3IodXJsOiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHN1cGVyKHVybCk7XG4gICAgICAgICAgICB0aGlzLndvcmtmbG93TWFuYWdlciA9IGFwcC53b3JrZmxvd01hbmFnZXIgfHwgYXBwLmV4dGVuc2lvbk1hbmFnZXIud29ya2Zsb3dcblxuICAgICAgICAgICAgdGhpcy5zb2NrZXQub24oJ0Zfd29ya2Zsb3cnLCBhc3luYyAocGF5bG9hZDogV29ya2Zsb3dDYWxsZWVQYXlsb2FkLCBjYWxsYmFjazogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLmFjdGlvbiA9PSAnb3BlbicgfHxcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC5hY3Rpb24gPT0gJ3NhdmUnIHx8XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQuYWN0aW9uID09ICdsaXN0JyB8fFxuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLmFjdGlvbiA9PSAnc2V0V2lkZ2V0VmFsdWUnIHx8XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQuYWN0aW9uID09ICdydW4nIHx8XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQuYWN0aW9uID09ICdzZXROb2RlVGl0bGUnIHx8XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQuYWN0aW9uID09ICdsb2dvdXQnIHx8XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQuYWN0aW9uID09ICdpbnRlcnJ1cHQnIHx8XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQuYWN0aW9uID09ICdjbGVhclF1ZXVlJyB8fFxuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLmFjdGlvbiA9PSAncmVib290J1xuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXNbcGF5bG9hZC5hY3Rpb25dKHBheWxvYWQucGFyYW1zKSBhcyBhbnlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHJlcyB8fCB7fSlcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGUuc3RhY2sgfHwgZS5tZXNzYWdlIHx8IGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogJ0ludmFsaWQgYWN0aW9uJ1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHByaXZhdGUgYXN5bmMgbG9nb3V0KCkge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBpLXNpZ24tb3V0JykucGFyZW50RWxlbWVudC5jbGljaygpXG4gICAgICAgIH1cblxuICAgICAgICBwcml2YXRlIGFzeW5jIHJ1bihwYXJhbXM6IFdvcmtmbG93Q2FsbGVlQWN0aW9uc1sncnVuJ11bJ3BhcmFtcyddKSB7XG4gICAgICAgICAgICBpZiAoIWhpamFja2VkUXVldWVQcm9tcHQpIHtcbiAgICAgICAgICAgICAgICBoaWphY2tRdWV1ZVByb21wdCgpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGJhdGNoQ291bnQgPSBwYXJhbXMuc2l6ZTtcblxuICAgICAgICAgICAgbGV0IGhhc0FueUVycm9yID0gZmFsc2VcbiAgICAgICAgICAgIGxldCBnZW5lcmFsRXJyb3IgPSAnJ1xuICAgICAgICAgICAgbGV0IG5vZGVFcnJvcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgYXBwLnF1ZXVlUHJvbXB0KDEsIGJhdGNoQ291bnQpXG4gICAgICAgICAgICAgICAgaWYgKCFzdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc0FueUVycm9yID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICBub2RlRXJyb3JzID0gZm9ybWF0Tm9kZUVycm9ycyhhcHAubGFzdE5vZGVFcnJvcnMpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGhhc0FueUVycm9yID0gdHJ1ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaGFzQW55RXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAoZ2VuZXJhbEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2VTdG9yZS5zZXRMYXN0RXJyb3IoZ2VuZXJhbEVycm9yKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2VTdG9yZS5zZXRXaWRnZXRUYWJsZUVycm9ycyhub2RlRXJyb3JzKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHByb21wdElkID0gbGFzdFF1ZXVlUHJvbXB0UmVzLnByb21wdF9pZFxuICAgICAgICAgICAgUHJldmlld1NlbmRlci5zZXQocHJvbXB0SWQsIHBhcmFtcy5mcm9tX3NpZClcbiAgICAgICAgICAgIGZ1bmN0aW9uIGZvcm1hdE5vZGVFcnJvcnMoZXJyb3JzOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhlcnJvcnMpLmZvckVhY2goKG5vZGVJRCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXRbbm9kZUlELnNwbGl0KFwiOlwiKVswXV0gPSBlcnJvcnNbbm9kZUlEXS5lcnJvcnMubWFwKEpTT04uc3RyaW5naWZ5KS5qb2luKCdcXG4nKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHB1YmxpYyBhc3luYyBsaXN0KCkge1xuICAgICAgICAgICAgY29uc3Qgd29ya2Zsb3dzID0gdGhpcy53b3JrZmxvd01hbmFnZXIud29ya2Zsb3dzXG4gICAgICAgICAgICBsZXQgd29ya2Zsb3dQYXRocyA9IHdvcmtmbG93cy5tYXAoKHc6IGFueSkgPT4gdy5wYXRoLnJlcGxhY2UoJ3dvcmtmbG93cy8nLCAnJykpO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycygpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHVzZXJ0b2tlbnMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnQ29tZnkudXNlcklkJylcbiAgICAgICAgICAgICAgICB1c2VydG9rZW5zICYmIGhlYWRlcnMuc2V0KCdjb21meS11c2VyJywgdXNlcnRva2Vucyk7XG4gICAgICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBmZXRjaCBhbmQgYXBwbHkgZmF2b3JpdGVzXG4gICAgICAgICAgICAgICAgY29uc3QgZmF2b3JpdGVzUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICAgICAgICAgICAgJy4vYXBpL3VzZXJkYXRhL3dvcmtmbG93cyUyRi5pbmRleC5qc29uJywge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGZhdm9yaXRlc1Jlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZhdm9yaXRlc0RhdGEgPSBhd2FpdCBmYXZvcml0ZXNSZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZhdm9yaXRlcyA9IGZhdm9yaXRlc0RhdGEuZmF2b3JpdGVzLm1hcCgoZmF2OiBzdHJpbmcpID0+IGZhdi5yZXBsYWNlKCd3b3JrZmxvd3MvJywgJycpKTtcblxuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1BhdGhzLnNvcnQoKGE6IHN0cmluZywgYjogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhSXNGYXZvcml0ZSA9IGZhdm9yaXRlcy5pbmNsdWRlcyhhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJJc0Zhdm9yaXRlID0gZmF2b3JpdGVzLmluY2x1ZGVzKGIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFJc0Zhdm9yaXRlICYmICFiSXNGYXZvcml0ZSkgcmV0dXJuIC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhSXNGYXZvcml0ZSAmJiBiSXNGYXZvcml0ZSkgcmV0dXJuIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ0Vycm9yIGZldGNoaW5nIGZhdm9yaXRlcywgcmV0dXJuaW5nIHVuc29ydGVkIHdvcmtmbG93czonLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gd29ya2Zsb3dQYXRocztcbiAgICAgICAgfVxuICAgICAgICBwcml2YXRlIHNldFdpZGdldFZhbHVlKHBhcmFtczogV29ya2Zsb3dDYWxsZWVBY3Rpb25zWydzZXRXaWRnZXRWYWx1ZSddWydwYXJhbXMnXSkge1xuICAgICAgICAgICAgcGFyYW1zLnZhbHVlcy5mb3JFYWNoKCh7IG5vZGVJRCwgd2lkZ2V0SW5kZXgsIHZhbHVlIH0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gYXBwLmdyYXBoLm5vZGVzLmZpbmQoKG46IGFueSkgPT4gbi5pZCA9PSBub2RlSUQpO1xuICAgICAgICAgICAgICAgIGlmICghbm9kZSB8fCB2YWx1ZSA9PSBub2RlLndpZGdldHNbd2lkZ2V0SW5kZXhdLnZhbHVlKSByZXR1cm47XG4gICAgICAgICAgICAgICAgc2V0V2lkZ2V0VmFsdWUobm9kZSwgd2lkZ2V0SW5kZXgsIHZhbHVlKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcHJpdmF0ZSBhc3luYyBvcGVuKHBhcmFtczogV29ya2Zsb3dDYWxsZWVBY3Rpb25zWydvcGVuJ11bJ3BhcmFtcyddKSB7XG4gICAgICAgICAgICBjb25zdCB7IHdvcmtmbG93X3BhdGggfSA9IHBhcmFtcztcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKHdvcmtmbG93X3BhdGguc3RhcnRzV2l0aCgnc2RwcHA6Ly8nKSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9wZW5TRFBQUFdvcmtmbG93KHBhcmFtcylcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9wZW5Db21meVdvcmtmbG93KHBhcmFtcylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcHJpdmF0ZSBhc3luYyBvcGVuU0RQUFBXb3JrZmxvdyhwYXJhbXM6IFdvcmtmbG93Q2FsbGVlQWN0aW9uc1snb3BlbiddWydwYXJhbXMnXSkge1xuICAgICAgICAgICAgY29uc3Qgd29ya2Zsb3dfcGF0aCA9IHBhcmFtcy53b3JrZmxvd19wYXRoLnJlcGxhY2UoJ3NkcHBwOi8vJywgJycpXG5cbiAgICAgICAgICAgIGNvbnN0IHdvcmtmbG93Q29udGVudCA9IGF3YWl0IGZldGNoKFwiL3NkLXBwcC1zdGF0aWMvc2RwcHAtd29ya2Zsb3dzL1wiICsgd29ya2Zsb3dfcGF0aCkudGhlbihyZXMgPT4gcmVzLmpzb24oKSlcblxuICAgICAgICAgICAgYXdhaXQgYXBwLmxvYWRHcmFwaERhdGEod29ya2Zsb3dDb250ZW50KVxuXG4gICAgICAgICAgICAvLyB0ZW1wIHdvcmtmbG93IG1heSBub3QgaGF2ZSBhbnkgc3RvcmVcbiAgICAgICAgfVxuICAgICAgICBwcml2YXRlIGFzeW5jIG9wZW5Db21meVdvcmtmbG93KHBhcmFtczogV29ya2Zsb3dDYWxsZWVBY3Rpb25zWydvcGVuJ11bJ3BhcmFtcyddKSB7XG4gICAgICAgICAgICBjb25zdCB7IHdvcmtmbG93X3BhdGgsIGZyb21fc2lkLCByZXNldCB9ID0gcGFyYW1zO1xuICAgICAgICAgICAgY29uc3Qgd29ya2Zsb3cgPSB0aGlzLndvcmtmbG93TWFuYWdlci53b3JrZmxvd3MuZmluZCgodzogYW55KSA9PlxuICAgICAgICAgICAgICAgIHcuZnVsbEZpbGVuYW1lID09PSB3b3JrZmxvd19wYXRoIHx8XG4gICAgICAgICAgICAgICAgdy5wYXRoID09PSB3b3JrZmxvd19wYXRoIHx8XG4gICAgICAgICAgICAgICAgdy5wYXRoID09PSAnd29ya2Zsb3dzLycgKyB3b3JrZmxvd19wYXRoXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBpZiAoKHdvcmtmbG93LmlzT3BlbiB8fCB0aGlzLndvcmtmbG93TWFuYWdlci5pc09wZW4/Lih3b3JrZmxvdykpICYmICFyZXNldCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBpZiAodGhpcy53b3JrZmxvd01hbmFnZXIub3BlbldvcmtmbG93cy5sZW5ndGggPT09IDEpIGF3YWl0IGFwcC5sb2FkR3JhcGhEYXRhKGJsYW5rR3JhcGgpXG4gICAgICAgICAgICBlbHNlIGF3YWl0IG9wZW5Xb3JrZmxvdyh0aGlzLndvcmtmbG93TWFuYWdlcixcbiAgICAgICAgICAgICAgICB0aGlzLndvcmtmbG93TWFuYWdlci5vcGVuV29ya2Zsb3dzWzBdID09IHdvcmtmbG93ID9cbiAgICAgICAgICAgICAgICAgICAgdGhpcy53b3JrZmxvd01hbmFnZXIub3BlbldvcmtmbG93c1sxXSA6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMud29ya2Zsb3dNYW5hZ2VyLm9wZW5Xb3JrZmxvd3NbMF1cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMud29ya2Zsb3dNYW5hZ2VyLmNsb3NlV29ya2Zsb3cod29ya2Zsb3csIGZhbHNlKVxuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVzb2x2ZSkpO1xuICAgICAgICAgICAgYXdhaXQgb3BlbldvcmtmbG93KHRoaXMud29ya2Zsb3dNYW5hZ2VyLCB3b3JrZmxvdyk7XG5cbiAgICAgICAgICAgIC8vIHdhaXQgZm9yIHNvbWUgdGhpcmQgcGFydHkgbm9kZXMgdG8gdXBkYXRlXG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgNTAwKSk7XG5cbiAgICAgICAgICAgIGlmICghcGFnZVN0b3JlLmRhdGEud2lkZ2V0VGFibGVTdHJ1Y3R1cmUpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc29ja2V0LmVtaXQoJ0Jfd29ya2Zsb3cnLCB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnZ2V0U3RvcmVkV2lkZ2V0VmFsdWUnLFxuICAgICAgICAgICAgICAgIHNpZDogZnJvbV9zaWQsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgIHdpZGdldFRhYmxlSUQ6IHBhZ2VTdG9yZS5kYXRhLndpZGdldFRhYmxlU3RydWN0dXJlLndpZGdldFRhYmxlSUQsXG4gICAgICAgICAgICAgICAgICAgIHdpZGdldFRhYmxlUGF0aDogcGFnZVN0b3JlLmRhdGEud2lkZ2V0VGFibGVTdHJ1Y3R1cmUud2lkZ2V0VGFibGVQYXRoLFxuICAgICAgICAgICAgICAgICAgICB3aWRnZXRUYWJsZVBlcnNpc3RlZDogcGFnZVN0b3JlLmRhdGEud2lkZ2V0VGFibGVTdHJ1Y3R1cmUud2lkZ2V0VGFibGVQZXJzaXN0ZWQsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgKHJlc3VsdDogV29ya2Zsb3dDYWxsZXJBY3Rpb25zWydnZXRTdG9yZWRXaWRnZXRWYWx1ZSddWydyZXN1bHQnXSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0V2lkZ2V0VmFsdWUocmVzdWx0KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBwcml2YXRlIGFzeW5jIHNhdmUocGFyYW1zOiBXb3JrZmxvd0NhbGxlZUFjdGlvbnNbJ3NhdmUnXVsncGFyYW1zJ10pIHtcbiAgICAgICAgICAgIGNvbnN0IHsgd29ya2Zsb3dfcGF0aCwgZnJvbV9zaWQgfSA9IHBhcmFtcztcbiAgICAgICAgICAgIGNvbnN0IHdvcmtmbG93ID0gdGhpcy53b3JrZmxvd01hbmFnZXIud29ya2Zsb3dzLmZpbmQoKHc6IGFueSkgPT5cbiAgICAgICAgICAgICAgICB3LmZ1bGxGaWxlbmFtZSA9PT0gd29ya2Zsb3dfcGF0aCB8fFxuICAgICAgICAgICAgICAgIHcucGF0aCA9PT0gd29ya2Zsb3dfcGF0aCB8fFxuICAgICAgICAgICAgICAgIHcucGF0aCA9PT0gJ3dvcmtmbG93cy8nICsgd29ya2Zsb3dfcGF0aFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgaWYgKCF3b3JrZmxvdykgdGhyb3cgbmV3IEVycm9yKCdXb3JrZmxvdyBub3QgZm91bmQnKTtcbiAgICAgICAgICAgIGlmICh0aGlzLndvcmtmbG93TWFuYWdlci5hY3RpdmVXb3JrZmxvdz8uaWQgIT0gd29ya2Zsb3cuaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW4oeyB3b3JrZmxvd19wYXRoLCBmcm9tX3NpZCwgcmVzZXQ6IGZhbHNlIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3b3JrZmxvdy5jaGFuZ2VUcmFja2VyLmNoZWNrU3RhdGUoKVxuICAgICAgICAgICAgYXdhaXQgdGhpcy53b3JrZmxvd01hbmFnZXIuc2F2ZVdvcmtmbG93KHdvcmtmbG93KTtcbiAgICAgICAgfVxuICAgICAgICBwdWJsaWMgc2V0Tm9kZVRpdGxlKHBhcmFtczogV29ya2Zsb3dDYWxsZWVBY3Rpb25zWydzZXROb2RlVGl0bGUnXVsncGFyYW1zJ10pIHtcbiAgICAgICAgICAgIGNvbnN0IHsgbm9kZV9pZCwgdGl0bGUgfSA9IHBhcmFtcztcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBhcHAuZ3JhcGgubm9kZXMuZmluZCgobjogYW55KSA9PiBuLmlkID09IG5vZGVfaWQpO1xuICAgICAgICAgICAgaWYgKCFub2RlKSB0aHJvdyBuZXcgRXJyb3IoJ05vZGUgbm90IGZvdW5kJyk7XG4gICAgICAgICAgICBub2RlLnRpdGxlID0gdGl0bGU7XG4gICAgICAgICAgICBub2RlLnNldFByb3BlcnR5KCdzZHBwcF93aWRnZXRhYmxlX3RpdGxlJywgdGl0bGUpO1xuICAgICAgICB9XG4gICAgICAgIHB1YmxpYyBhc3luYyBpbnRlcnJ1cHQocGFyYW1zOiBXb3JrZmxvd0NhbGxlZUFjdGlvbnNbJ2ludGVycnVwdCddWydwYXJhbXMnXSkge1xuICAgICAgICAgICAgYXdhaXQgYXBwLmFwaS5pbnRlcnJ1cHQoKTtcbiAgICAgICAgfVxuICAgICAgICBwdWJsaWMgYXN5bmMgY2xlYXJRdWV1ZShwYXJhbXM6IFdvcmtmbG93Q2FsbGVlQWN0aW9uc1snY2xlYXJRdWV1ZSddWydwYXJhbXMnXSkge1xuICAgICAgICAgICAgYXdhaXQgYXBwLmFwaS5jbGVhckl0ZW1zKCdxdWV1ZScpXG5cbiAgICAgICAgfVxuICAgICAgICBwdWJsaWMgYXN5bmMgcmVib290KHBhcmFtczogV29ya2Zsb3dDYWxsZWVBY3Rpb25zWydyZWJvb3QnXVsncGFyYW1zJ10pIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy4vYXBpL21hbmFnZXIvcmVib290JylcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gNDA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGkxOG4oJ0NvbWZ5TWFuYWdlciBub3QgZm91bmQsIGNhbm5vdCByZWJvb3QnKSxcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSAyMDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBlcnJvcjogaTE4bignRmFpbGVkIHRvIHJlYm9vdCBDb21meVVJJykgKyByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG5cblxuYXN5bmMgZnVuY3Rpb24gb3BlbldvcmtmbG93KHdvcmtmbG93TWFuYWdlcjogYW55LCB3b3JrZmxvdzogYW55KSB7XG4gICAgaWYgKGFwcC53b3JrZmxvd01hbmFnZXIgPT0gd29ya2Zsb3dNYW5hZ2VyKSB7XG4gICAgICAgIGF3YWl0IHdvcmtmbG93LmxvYWQoKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHdvcmtmbG93TWFuYWdlci5vcGVuV29ya2Zsb3cod29ya2Zsb3cpO1xuICAgICAgICBhd2FpdCBhcHAubG9hZEdyYXBoRGF0YShcbiAgICAgICAgICAgIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkod29ya2Zsb3cuYWN0aXZlU3RhdGUpKSxcbiAgICAgICAgLyogY2xlYW49Ki8gdHJ1ZSxcbiAgICAgICAgLyogcmVzdG9yZV92aWV3PSovIHRydWUsXG4gICAgICAgICAgICB3b3JrZmxvdyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgIH1cbn1cbmxldCBoaWphY2tlZFF1ZXVlUHJvbXB0ID0gZmFsc2VcbmxldCBsYXN0UXVldWVQcm9tcHRSZXM6IGFueSA9IG51bGw7XG5mdW5jdGlvbiBoaWphY2tRdWV1ZVByb21wdCgpIHtcbiAgICBpZiAoaGlqYWNrZWRRdWV1ZVByb21wdCkgcmV0dXJuO1xuICAgIGNvbnN0IG9yaWdpbmFsUXVldWVQcm9tcHQgPSBhcGkucXVldWVQcm9tcHQ7XG4gICAgYXBpLnF1ZXVlUHJvbXB0ID0gYXN5bmMgKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICAgIGxhc3RRdWV1ZVByb21wdFJlcyA9IGF3YWl0IG9yaWdpbmFsUXVldWVQcm9tcHQoLi4uYXJncylcbiAgICAgICAgcmV0dXJuIGxhc3RRdWV1ZVByb21wdFJlc1xuICAgIH1cbiAgICBoaWphY2tlZFF1ZXVlUHJvbXB0ID0gdHJ1ZVxufSIsICJpbXBvcnQgeyBNYWluU3RvcmVIb2xkZXJTb2NrZXQgfSBmcm9tIFwiLi4vLi4vLi4vLi4vc3JjL2NvbW1vbi9zb2NrZXQvbWl4aW5zL01haW5TdG9yZUhvbGRlci5tdHNcIjtcbmltcG9ydCB7IFN0b3JlTWFwSG9sZGVyU29ja2V0IH0gZnJvbSBcIi4uLy4uLy4uLy4uL3NyYy9jb21tb24vc29ja2V0L21peGlucy9TdG9yZU1hcEhvbGRlci5tdHNcIjtcbmltcG9ydCB7IFNvY2tldCwgU29ja2V0Q29uc3RydWN0b3IsIFNvY2tldE1peGluIH0gZnJvbSBcIi4uLy4uLy4uLy4uL3NyYy9jb21tb24vc29ja2V0L1NvY2tldC5tdHNcIjtcbmltcG9ydCB7IHBhZ2VQaG90b3Nob3BTdG9yZU1hcCwgcGFnZVN0b3JlIH0gZnJvbSBcIi4uLy4uL3Bob3Rvc2hvcE1vZGVscy5tdHNcIjtcbmltcG9ydCB7IFBob3Rvc2hvcENhbGxlclNvY2tldCB9IGZyb20gXCIuLi8uLi8uLi8uLi9zcmMvc29ja2V0L1Bob3Rvc2hvcENhbGxlci5tdHNcIjtcbmltcG9ydCB7IFdvcmtmbG93Q2FsbGVlU29ja2V0IH0gZnJvbSBcIi4vV29ya2Zsb3dDYWxsZWUubXRzXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93Q2FsbGVlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL3NvY2tldC9Xb3JrZmxvd0NhbGxlZUludGVyZmFjZS5tdHMnO1xuaW1wb3J0IHR5cGUgeyBQaG90b3Nob3BDYWxsZXIgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvc29ja2V0L1Bob3Rvc2hvcENhbGxlckludGVyZmFjZS5tdHMnO1xuXG5leHBvcnQgY2xhc3MgQ29tZnlTb2NrZXQgZXh0ZW5kcyAoU29ja2V0TWl4aW4oXG4gICAgTWFpblN0b3JlSG9sZGVyU29ja2V0KHBhZ2VTdG9yZSwgJ2NvbWZ5JyksXG4gICAgU3RvcmVNYXBIb2xkZXJTb2NrZXQocGFnZVBob3Rvc2hvcFN0b3JlTWFwLCAncGhvdG9zaG9wJyksXG4gICAgUGhvdG9zaG9wQ2FsbGVyU29ja2V0LFxuICAgIFdvcmtmbG93Q2FsbGVlU29ja2V0XG4pIGFzIFNvY2tldENvbnN0cnVjdG9yPFNvY2tldCAmIFBob3Rvc2hvcENhbGxlciAmIFdvcmtmbG93Q2FsbGVlPikge1xuICAgIHN0YXRpYyBpbnN0YW5jZTogQ29tZnlTb2NrZXQ7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKGxvY2F0aW9uLmhyZWYuc3BsaXQoJz8nKVswXS5zcGxpdCgnIycpWzBdKTtcbiAgICAgICAgQ29tZnlTb2NrZXQuaW5zdGFuY2UgPSB0aGlzO1xuICAgIH1cbn0gIiwgImV4cG9ydCBmdW5jdGlvbiBzaW1wbGlmeVdvcmtmbG93UGF0aChwYXRoOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gcGF0aC5yZXBsYWNlKC9ed29ya2Zsb3dzXFwvLywgJycpLnJlcGxhY2UoL1xcLmpzb24kLywgJycpO1xufSIsICJpbXBvcnQgaTE4biwgeyBJMThuS2V5IH0gZnJvbSBcIi4uLy4uLy4uLy4uL3NyYy9jb21tb24vaTE4bi5tdHNcIjtcbmltcG9ydCB7IFNwZWljaWFsSURNYW5hZ2VyIH0gZnJvbSBcIi4uLy4uLy4uLy4uL3NyYy9jb21tb24vcGhvdG9zaG9wL3NwZWNpYWxMYXllci5tdHNcIjtcbmltcG9ydCB7IExheWVyRGF0YSB9IGZyb20gXCIuLi8uLi8uLi8uLi9zcmMvc3RvcmUvcGhvdG9zaG9wLm10c1wiO1xuaW1wb3J0IHsgcGFnZVBob3Rvc2hvcFN0b3JlTWFwLCBwYWdlU3RvcmUgfSBmcm9tIFwiLi4vLi4vcGhvdG9zaG9wTW9kZWxzLm10c1wiO1xuaW1wb3J0IHsgZmluZERvY3VtZW50Tm9kZVJlY3Vyc2l2ZSwgZ2V0TGF5ZXJPcHRpb25zQnlEb2N1bWVudFZhbHVlLCBtYWtlRG9jdW1lbnREYXRhT3B0aW9ucywgbWFrZURvY3VtZW50T3B0aW9uLCBwYXJzZURvY3VtZW50T3B0aW9uIH0gZnJvbSBcIi4uL3V0aWwubXRzXCI7XG5pbXBvcnQgeyBDb21meVNvY2tldCB9IGZyb20gXCIuLi9zb2NrZXQvQ29tZnlTb2NrZXQubXRzXCI7XG5pbXBvcnQgeyBzaW1wbGlmeVdvcmtmbG93UGF0aCB9IGZyb20gXCIuLi8uLi8uLi8uLi9zcmMvY29tbW9uL3N0cmluZy11dGlsLm10c1wiO1xuaW1wb3J0IHsgUGhvdG9zaG9wU3RvcmVIZWxwZXIgfSBmcm9tIFwiLi4vLi4vLi4vLi4vc3JjL3N0b3JlL2hlbHBlcnMubXRzXCI7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTRFBQUFdpZGdldCB7XG4gICAgd2lkZ2V0OiBhbnlcbiAgICBub2RlOiBhbnlcbiAgICBwcm90ZWN0ZWQgb3JpZ2luTGFiZWw6IHN0cmluZyA9ICcnXG4gICAgcHJvdGVjdGVkIGluZGV4SW5Ob2RlOiBudW1iZXIgPSAwXG4gICAgY29uc3RydWN0b3Iobm9kZTogYW55LCB3aWRnZXQ6IGFueSkge1xuICAgICAgICB0aGlzLndpZGdldCA9IHdpZGdldDtcbiAgICAgICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICAgICAgdGhpcy5pbmRleEluTm9kZSA9IG5vZGUud2lkZ2V0cy5pbmRleE9mKHdpZGdldCk7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzXG4gICAgICAgIHdpZGdldC5jYWxsYmFjayA9IGZ1bmN0aW9uICguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICAgICAgaWYgKHNlbGYud2lkZ2V0ICE9IHRoaXMpIHtcbiAgICAgICAgICAgICAgICAvLyAwMjIyIHRlbXAgZml4LCBDb21meVVJIHNpZGUgd2lsbCBjcmVhdGUgbmV3IFdpZGdldCB3aGVuIHR5cGUgY2hhbmdlZC4gXG4gICAgICAgICAgICAgICAgLy8gQnV0IGRpZCBub3QgYXNzaWduIHRoZSBuZXcgb25lIHRvIG5vZGUud2lkZ2V0c1tdXG4gICAgICAgICAgICAgICAgc2VsZi53aWRnZXQgPSBzZWxmLm5vZGUud2lkZ2V0c1tzZWxmLmluZGV4SW5Ob2RlXSA9IHRoaXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlbGYuX2NhbGxiYWNrcy5mb3JFYWNoKGNhbGxiYWNrID0+IGNhbGxiYWNrKC4uLmFyZ3MpKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMub3JpZ2luTGFiZWwgPSB3aWRnZXQubGFiZWxcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jYWxsYmFja3M6ICgoLi4uYXJnczogYW55W10pID0+IGFueSlbXSA9IFtdO1xuICAgIHB1YmxpYyBvbkNoYW5nZShjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpIHtcbiAgICAgICAgdGhpcy5fY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgIH1cbiAgICBwdWJsaWMgcmVtb3ZlT25DaGFuZ2UoY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55KSB7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrcy5zcGxpY2UodGhpcy5fY2FsbGJhY2tzLmluZGV4T2YoY2FsbGJhY2spLCAxKTtcbiAgICB9XG4gICAgcHVibGljIGFic3RyYWN0IHVwZGF0ZSgpOiB2b2lkO1xufVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNEUFBQQ29tYm9XaWRnZXQgZXh0ZW5kcyBTRFBQUFdpZGdldCB7XG4gICAgcHVibGljIGxvY2tNb2RlKGlzTG9jazogYm9vbGVhbiwgbG9ja0xhYmVsOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGlzTG9jaykge1xuICAgICAgICAgICAgaWYgKHRoaXMud2lkZ2V0LnR5cGUgPT0gJ2J1dHRvbicpIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMud2lkZ2V0LnR5cGUgPSAnYnV0dG9uJ1xuICAgICAgICAgICAgdGhpcy53aWRnZXQudmFsdWUgPSAnJztcbiAgICAgICAgICAgIHRoaXMud2lkZ2V0LmxhYmVsID0gbG9ja0xhYmVsO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy53aWRnZXQudHlwZSA9PSAnY29tYm8nKSByZXR1cm47XG4gICAgICAgICAgICB0aGlzLndpZGdldC50eXBlID0gJ2NvbWJvJ1xuICAgICAgICAgICAgdGhpcy53aWRnZXQudmFsdWUgPSAnJztcbiAgICAgICAgICAgIHRoaXMud2lkZ2V0LmxhYmVsID0gdGhpcy5vcmlnaW5MYWJlbDtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBEb2N1bWVudFdpZGdldCBleHRlbmRzIFNEUFBQQ29tYm9XaWRnZXQge1xuICAgIHN0YXRpYyBjcmVhdGUobm9kZTogYW55LCBuYW1lOiBJMThuS2V5KSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnM6IHN0cmluZ1tdID0gbWFrZURvY3VtZW50RGF0YU9wdGlvbnMoKTtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IG5vZGUuc2l6ZS5zbGljZSgwKTtcbiAgICAgICAgY29uc3QgZG9jdW1lbnRXaWRnZXQgPSBub2RlLmFkZFdpZGdldCgnY29tYm8nLCBuYW1lLCBvcHRpb25zWzBdIHx8ICcnLCAoKSA9PiB7IH0sIHsgZm9yY2VJbnB1dDogdHJ1ZSwgdmFsdWVzOiBtYWtlRG9jdW1lbnREYXRhT3B0aW9ucyB9KVxuICAgICAgICBkb2N1bWVudFdpZGdldC5zZXJpYWxpemVWYWx1ZSA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBwYXJzZURvY3VtZW50T3B0aW9uKGRvY3VtZW50V2lkZ2V0LnZhbHVlKTtcbiAgICAgICAgICAgIGlmICghZGF0YSkgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZV9pZDogaTE4bignZG9jdW1lbnQgezB9IG5vdCBmb3VuZCcsIGRvY3VtZW50V2lkZ2V0LnZhbHVlKSxcbiAgICAgICAgICAgICAgICBpZGVudGlmeTogJycsXG4gICAgICAgICAgICAgICAgZGlydHlJRDogMFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsZXQgaWRlbnRpZnkgPSBkYXRhLmlkZW50aWZ5O1xuICAgICAgICAgICAgaWYgKFNwZWljaWFsSURNYW5hZ2VyLmlzX1NQRUNJQUxfRE9DVU1FTlRfQ1VSUkVOVChpZGVudGlmeSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXQgPSBhd2FpdCBDb21meVNvY2tldC5pbnN0YW5jZS5nZXRTcGVjaWFsSWRlbnRpZmllclZhbHVlKGRhdGEuaW5zdGFuY2VfaWQsIHtcbiAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcjogaWRlbnRpZnlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIGlkZW50aWZ5ID0gcmV0LnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZV9pZDogZGF0YS5pbnN0YW5jZV9pZCxcbiAgICAgICAgICAgICAgICBpZGVudGlmeTogaWRlbnRpZnksXG4gICAgICAgICAgICAgICAgY2FudmFzRGlydHlJRDogZGF0YS5kb2N1bWVudERhdGEuY2FudmFzRGlydHlJRCxcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25EaXJ0eUlEOiBkYXRhLmRvY3VtZW50RGF0YS5zZWxlY3Rpb25EaXJ0eUlEXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBub2RlLnNpemUgPSBbc2l6ZVswXSwgTWF0aC5tYXgoc2l6ZVsxXSwgbm9kZS5zaXplWzFdKV07XG4gICAgICAgIHJldHVybiBuZXcgRG9jdW1lbnRXaWRnZXQobm9kZSwgZG9jdW1lbnRXaWRnZXQpO1xuICAgIH1cbiAgICBzdGF0aWMgbGluayhub2RlOiBhbnksIHdpZGdldDogYW55KSB7XG4gICAgICAgIGlmICh3aWRnZXQudHlwZSA9PSBcImNvbWJvXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRG9jdW1lbnRXaWRnZXQobm9kZSwgd2lkZ2V0KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkV2lkZ2V0ID0gRG9jdW1lbnRXaWRnZXQuY3JlYXRlKG5vZGUsIHdpZGdldC5uYW1lKTtcbiAgICAgICAgY29uc3Qgb2xkV2lkZ2V0SW5kZXggPSBub2RlLndpZGdldHMuaW5kZXhPZih3aWRnZXQpO1xuICAgICAgICBub2RlLndpZGdldHNbb2xkV2lkZ2V0SW5kZXhdID0gbm9kZS53aWRnZXRzLnBvcCgpO1xuICAgICAgICByZXR1cm4gZFdpZGdldDtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihub2RlOiBhbnksIHdpZGdldDogYW55KSB7XG4gICAgICAgIHN1cGVyKG5vZGUsIHdpZGdldCk7XG4gICAgICAgIHRoaXMub25DaGFuZ2UoKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmICghaXNOYU4oK3ZhbHVlKSkgeyAvLyBpcyBudW1iZXJcbiAgICAgICAgICAgICAgICB3aWRnZXQudmFsdWUgPSBPYmplY3Qua2V5cyh3aWRnZXQub3B0aW9ucy52YWx1ZXMpWyt2YWx1ZV07XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnKSB7IC8vIGlzIHN0cmluZ1xuICAgICAgICAgICAgICAgIGNvbnN0IHNwbGl0ID0gdmFsdWUuc3BsaXQoJy8nKTtcbiAgICAgICAgICAgICAgICBpZiAoU3BlaWNpYWxJRE1hbmFnZXIuaXNfU1BFQ0lBTF9ET0NVTUVOVF9DVVJSRU5UKHNwbGl0WzFdKSkge1xuICAgICAgICAgICAgICAgICAgICB3aWRnZXQudmFsdWUgPSBzcGxpdFswXSArICcvJyArIFNwZWljaWFsSURNYW5hZ2VyLmdldFNwZWNpYWxEb2N1bWVudEN1cnJlbnQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGUoKSB7XG4gICAgICAgIHdpZGdldENoZWNrQ29udGFpbk9yUmVzZXQodGhpcy53aWRnZXQsIHRoaXMud2lkZ2V0Lm9wdGlvbnMudmFsdWVzLCB0cnVlKVxuICAgIH1cblxuICAgIHB1YmxpYyBzZWxlY3RDb25jcmV0ZURvY3VtZW50KCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBTcGVpY2lhbElETWFuYWdlci5pc19TUEVDSUFMX0RPQ1VNRU5UX0NVUlJFTlQodGhpcy53aWRnZXQudmFsdWUpXG4gICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgW2luc3RhbmNlS2V5LF0gPSB0aGlzLndpZGdldC52YWx1ZS5zcGxpdCgnLycpO1xuICAgICAgICAgICAgY29uc3Qgc3RvcmUgPSBwYWdlUGhvdG9zaG9wU3RvcmVNYXAuZ2V0U3RvcmVCeU5hbWUoaW5zdGFuY2VLZXkpO1xuICAgICAgICAgICAgaWYgKCFzdG9yZSkgcmV0dXJuIGNvbnNvbGUud2Fybihgc3RvcmUgJHtpbnN0YW5jZUtleX0gbm90IGZvdW5kYCk7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB0aGlzLndpZGdldC52YWx1ZSA9IG1ha2VEb2N1bWVudE9wdGlvbihzdG9yZS5kYXRhLmRvY3VtZW50c1tzdG9yZS5kYXRhLmFjdGl2ZURvY3VtZW50SURdLmlkZW50aWZ5LCBpbnN0YW5jZUtleSlcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgTGF5ZXJXaWRnZXRDdG9yT3B0aW9ucyB7XG4gICAgZXh0cmFPcHRpb25zOiBzdHJpbmdbXVxufVxuaW50ZXJmYWNlIExheWVyV2lkZ2V0V2l0aERvY3VtZW50U2VsZWN0aW9uQ3Rvck9wdGlvbnMgZXh0ZW5kcyBMYXllcldpZGdldEN0b3JPcHRpb25zIHtcbiAgICBkb2N1bWVudFdpZGdldEluTm9kZTogRG9jdW1lbnRXaWRnZXQgfCBudWxsLFxufVxuZXhwb3J0IGNsYXNzIExheWVyV2lkZ2V0IGV4dGVuZHMgU0RQUFBDb21ib1dpZGdldCB7XG4gICAgcHJvdGVjdGVkIGRvY3VtZW50V2lkZ2V0QnlMaW5rZWQ6IERvY3VtZW50V2lkZ2V0IHwgbnVsbCA9IG51bGw7XG4gICAgcHJvdGVjdGVkIGV4dHJhT3B0aW9uczogc3RyaW5nW107XG4gICAgY29uc3RydWN0b3Iobm9kZTogYW55LCBsYXllcldpZGdldDogYW55LCBvcHRpb25zOiBMYXllcldpZGdldEN0b3JPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG5vZGUsIGxheWVyV2lkZ2V0KTtcbiAgICAgICAgdGhpcy5leHRyYU9wdGlvbnMgPSBvcHRpb25zLmV4dHJhT3B0aW9ucztcbiAgICAgICAgdGhpcy51cGRhdGUgPSB0aGlzLnVwZGF0ZS5iaW5kKHRoaXMpO1xuXG4gICAgICAgIHRoaXMub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm5vZGUuc2V0UHJvcGVydHkoJ2xheWVyV2lkZ2V0RGV0YWlsJyArIHRoaXMuaW5kZXhJbk5vZGUsIHRoaXMuY3VycmVudE9wdGlvbnNEZXRhaWxbT2JqZWN0LnZhbHVlcyh0aGlzLmN1cnJlbnRPcHRpb25zKS5pbmRleE9mKHRoaXMud2lkZ2V0LnZhbHVlKV0pO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnKSB7IC8vIGlzIHN0cmluZ1xuICAgICAgICAgICAgICAgIHZhbHVlID0gU3BlaWNpYWxJRE1hbmFnZXIuZml4STE4bih2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIGxheWVyV2lkZ2V0LnNlcmlhbGl6ZVZhbHVlID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZG9jdW1lbnRXaWRnZXQgPSB0aGlzLmRvY3VtZW50V2lkZ2V0QnlMaW5rZWQ7XG4gICAgICAgICAgICBpZiAoIWRvY3VtZW50V2lkZ2V0KSByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIGlkZW50aWZ5OiBsYXllcldpZGdldC52YWx1ZSxcbiAgICAgICAgICAgICAgICBkaXJ0eUlEOiAwXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgZG9jdW1lbnQgPSBwYXJzZURvY3VtZW50T3B0aW9uKGRvY3VtZW50V2lkZ2V0LndpZGdldC52YWx1ZSk7XG4gICAgICAgICAgICBpZiAoIWRvY3VtZW50KSByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIGlkZW50aWZ5OiBsYXllcldpZGdldC52YWx1ZSxcbiAgICAgICAgICAgICAgICBkaXJ0eUlEOiAwXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbGV0IGlkZW50aWZ5ID0gbGF5ZXJXaWRnZXQudmFsdWU7XG4gICAgICAgICAgICBpZiAoU3BlaWNpYWxJRE1hbmFnZXIuaXNfU1BFQ0lBTF9MQVlFUl9TRUxFQ1RFRF9MQVlFUihpZGVudGlmeSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXQgPSBhd2FpdCBDb21meVNvY2tldC5pbnN0YW5jZS5nZXRTcGVjaWFsSWRlbnRpZmllclZhbHVlKGRvY3VtZW50Lmluc3RhbmNlX2lkLCB7XG4gICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXI6IGlkZW50aWZ5XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBpZGVudGlmeSA9IHJldC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBkaXJ0eUlEID0gMFxuICAgICAgICAgICAgaWYgKFNwZWljaWFsSURNYW5hZ2VyLmlzX1NQRUNJQUxfTEFZRVJfTkVXX0xBWUVSKGlkZW50aWZ5KSB8fCBTcGVpY2lhbElETWFuYWdlci5pc19TUEVDSUFMX0xBWUVSX1VTRV9DQU5WQVMoaWRlbnRpZnkpKSB7XG4gICAgICAgICAgICAgICAgZGlydHlJRCA9IFBob3Rvc2hvcFN0b3JlSGVscGVyLmdldENhbnZhc0RpcnR5SUQoZG9jdW1lbnQuZG9jdW1lbnREYXRhKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGlydHlJRCA9IFBob3Rvc2hvcFN0b3JlSGVscGVyLmdldExheWVyRGlydHlJRChkb2N1bWVudC5kb2N1bWVudERhdGEsIGlkZW50aWZ5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgaWRlbnRpZnksXG4gICAgICAgICAgICAgICAgZGlydHlJRFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgbGluayhub2RlOiBhbnksIHdpZGdldDogYW55LCBvcHRpb25zOiBMYXllcldpZGdldEN0b3JPcHRpb25zKSB7XG4gICAgICAgIGlmICh3aWRnZXQudHlwZSA9PSBcImNvbWJvXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTGF5ZXJXaWRnZXQobm9kZSwgd2lkZ2V0LCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsV2lkZ2V0ID0gTGF5ZXJXaWRnZXQuY3JlYXRlKG5vZGUsIHdpZGdldC5uYW1lLCBvcHRpb25zKTtcbiAgICAgICAgY29uc3Qgb2xkV2lkZ2V0SW5kZXggPSBub2RlLndpZGdldHMuaW5kZXhPZih3aWRnZXQpO1xuICAgICAgICBub2RlLndpZGdldHNbb2xkV2lkZ2V0SW5kZXhdID0gbm9kZS53aWRnZXRzLnBvcCgpO1xuICAgICAgICByZXR1cm4gbFdpZGdldDtcbiAgICB9XG5cbiAgICBwdWJsaWMgbGlua0RvY3VtZW50V2lkZ2V0KGRvY3VtZW50V2lkZ2V0OiBEb2N1bWVudFdpZGdldCB8IG51bGwpIHtcbiAgICAgICAgaWYgKHRoaXMuZG9jdW1lbnRXaWRnZXRCeUxpbmtlZCkge1xuICAgICAgICAgICAgZG9jdW1lbnRXaWRnZXQ/LnJlbW92ZU9uQ2hhbmdlKHRoaXMudXBkYXRlKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZG9jdW1lbnRXaWRnZXRCeUxpbmtlZCA9IGRvY3VtZW50V2lkZ2V0O1xuICAgICAgICBpZiAodGhpcy5kb2N1bWVudFdpZGdldEJ5TGlua2VkKSB7XG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50V2lkZ2V0QnlMaW5rZWQub25DaGFuZ2UodGhpcy51cGRhdGUpXG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIHVwZGF0ZSgpIHtcbiAgICAgICAgY29uc3QgZG9jdW1lbnRXaWRnZXQgPSB0aGlzLmRvY3VtZW50V2lkZ2V0QnlMaW5rZWQ7XG4gICAgICAgIHRoaXMudXBkYXRlT3B0aW9ucyhkb2N1bWVudFdpZGdldCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGN1cnJlbnRPcHRpb25zOiBzdHJpbmdbXSA9IFtdXG4gICAgcHJvdGVjdGVkIGN1cnJlbnRPcHRpb25zRGV0YWlsOiBMYXllckRhdGFbXSA9IFtdXG5cbiAgICBwcm90ZWN0ZWQgdXBkYXRlT3B0aW9ucyhkb2N1bWVudFdpZGdldDogRG9jdW1lbnRXaWRnZXQgfCBudWxsKSB7XG4gICAgICAgIHRoaXMuY3VycmVudE9wdGlvbnMgPSB0aGlzLmV4dHJhT3B0aW9ucy5zbGljZSgwKVxuICAgICAgICB0aGlzLmN1cnJlbnRPcHRpb25zRGV0YWlsID0gbmV3IEFycmF5KHRoaXMuY3VycmVudE9wdGlvbnMubGVuZ3RoKS5maWxsKHsgaWQ6IDAsIG5hbWU6ICcnLCBpZGVudGlmeTogJycsIGxldmVsOiAwLCBmdWxsUGF0aDogJycgfSk7XG5cbiAgICAgICAgaWYgKGRvY3VtZW50V2lkZ2V0ICYmIGRvY3VtZW50V2lkZ2V0LndpZGdldC52YWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgZG9jdW1lbnQgPSBwYXJzZURvY3VtZW50T3B0aW9uKGRvY3VtZW50V2lkZ2V0LndpZGdldC52YWx1ZSk7XG4gICAgICAgICAgICBpZiAoIWRvY3VtZW50KSByZXR1cm47XG4gICAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudERhdGEubGF5ZXJzLm1hcCgobGF5ZXI6IExheWVyRGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE9wdGlvbnMucHVzaChsYXllci5pZGVudGlmeSlcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRPcHRpb25zRGV0YWlsLnB1c2gobGF5ZXIpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndpZGdldC5vcHRpb25zLnZhbHVlcyA9IHRoaXMuY3VycmVudE9wdGlvbnM7XG4gICAgICAgIGlmIChPYmplY3QudmFsdWVzKHRoaXMuY3VycmVudE9wdGlvbnMpLmluZGV4T2YodGhpcy53aWRnZXQudmFsdWUpID09IC0xKSB7XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5EZXRhaWw6IExheWVyRGF0YSB8IG51bGwgPSB0aGlzLm5vZGUucHJvcGVydGllc1snbGF5ZXJXaWRnZXREZXRhaWwnICsgdGhpcy5pbmRleEluTm9kZV1cbiAgICAgICAgICAgIGlmIChvcmlnaW5EZXRhaWwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaW5kSW5kZXggPSB0aGlzLmN1cnJlbnRPcHRpb25zRGV0YWlsLmZpbmRJbmRleChpdGVtID0+IGl0ZW0uZnVsbFBhdGggPT0gb3JpZ2luRGV0YWlsLmZ1bGxQYXRoKVxuICAgICAgICAgICAgICAgIGlmIChmaW5kSW5kZXggIT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53aWRnZXQudmFsdWUgPSB0aGlzLmN1cnJlbnRPcHRpb25zW2ZpbmRJbmRleF1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIG9yIHNldCB0aGUgbm9kZSB0byByZWRcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBjcmVhdGUobm9kZTogYW55LCBuYW1lOiBJMThuS2V5LCBvcHRpb25zOiBMYXllcldpZGdldEN0b3JPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHNpemUgPSBub2RlLnNpemUuc2xpY2UoMCk7XG4gICAgICAgIGNvbnN0IGxheWVyV2lkZ2V0ID0gbm9kZS5hZGRXaWRnZXQoJ2NvbWJvJywgbmFtZSwgb3B0aW9ucy5leHRyYU9wdGlvbnNbMF0gfHwgJycsICgpID0+IHsgfSwgeyBmb3JjZUlucHV0OiB0cnVlLCB2YWx1ZXM6IG9wdGlvbnMuZXh0cmFPcHRpb25zIH0pXG5cbiAgICAgICAgbm9kZS5zaXplID0gW3NpemVbMF0sIE1hdGgubWF4KHNpemVbMV0sIG5vZGUuc2l6ZVsxXSldO1xuICAgICAgICByZXR1cm4gbmV3IExheWVyV2lkZ2V0KG5vZGUsIGxheWVyV2lkZ2V0LCB7XG4gICAgICAgICAgICBleHRyYU9wdGlvbnM6IG9wdGlvbnMuZXh0cmFPcHRpb25zXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmNvbnN0IGRlZmF1bHRMYXllcldpZGdldFdpdGhEb2N1bWVudFNlbGVjdGlvbk9wdGlvbnM6IExheWVyV2lkZ2V0V2l0aERvY3VtZW50U2VsZWN0aW9uQ3Rvck9wdGlvbnMgPSB7XG4gICAgZXh0cmFPcHRpb25zOiBbXSxcbiAgICBkb2N1bWVudFdpZGdldEluTm9kZTogbnVsbFxufVxuZXhwb3J0IGNsYXNzIExheWVyV2lkZ2V0V2l0aERvY3VtZW50U2VsZWN0aW9uIGV4dGVuZHMgTGF5ZXJXaWRnZXQge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZG9jdW1lbnRXaWRnZXRJbk5vZGU6IERvY3VtZW50V2lkZ2V0IHwgbnVsbDtcblxuICAgIGNvbnN0cnVjdG9yKG5vZGU6IGFueSwgbGF5ZXJXaWRnZXQ/OiBhbnksIG9wdGlvbnM6IExheWVyV2lkZ2V0V2l0aERvY3VtZW50U2VsZWN0aW9uQ3Rvck9wdGlvbnMgPSBkZWZhdWx0TGF5ZXJXaWRnZXRXaXRoRG9jdW1lbnRTZWxlY3Rpb25PcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG5vZGUsIGxheWVyV2lkZ2V0LCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5kb2N1bWVudFdpZGdldEluTm9kZSA9IG9wdGlvbnMuZG9jdW1lbnRXaWRnZXRJbk5vZGU7XG4gICAgICAgIHRoaXMub25DaGFuZ2UoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZG9jdW1lbnRXaWRnZXQgPSB0aGlzLmRvY3VtZW50V2lkZ2V0SW5Ob2RlIHx8IHRoaXMuZG9jdW1lbnRXaWRnZXRCeUxpbmtlZDtcbiAgICAgICAgICAgIGRvY3VtZW50V2lkZ2V0Py5zZWxlY3RDb25jcmV0ZURvY3VtZW50KCk7XG4gICAgICAgIH0pXG4gICAgICAgIGxheWVyV2lkZ2V0LnNlcmlhbGl6ZVZhbHVlID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZG9jdW1lbnRXaWRnZXQgPSB0aGlzLmRvY3VtZW50V2lkZ2V0SW5Ob2RlIHx8IHRoaXMuZG9jdW1lbnRXaWRnZXRCeUxpbmtlZDtcbiAgICAgICAgICAgIGlmICghZG9jdW1lbnRXaWRnZXQpIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgaWRlbnRpZnk6IGxheWVyV2lkZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICAgIGRpcnR5SUQ6IDBcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBkb2N1bWVudCA9IHBhcnNlRG9jdW1lbnRPcHRpb24oZG9jdW1lbnRXaWRnZXQud2lkZ2V0LnZhbHVlKTtcbiAgICAgICAgICAgIGlmICghZG9jdW1lbnQpIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgaWRlbnRpZnk6IGxheWVyV2lkZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICAgIGRpcnR5SUQ6IDBcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBsZXQgaWRlbnRpZnkgPSBsYXllcldpZGdldC52YWx1ZTtcbiAgICAgICAgICAgIGlmIChTcGVpY2lhbElETWFuYWdlci5pc19TUEVDSUFMX0xBWUVSX1NFTEVDVEVEX0xBWUVSKGlkZW50aWZ5KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJldCA9IGF3YWl0IENvbWZ5U29ja2V0Lmluc3RhbmNlLmdldFNwZWNpYWxJZGVudGlmaWVyVmFsdWUoZG9jdW1lbnQuaW5zdGFuY2VfaWQsIHtcbiAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcjogaWRlbnRpZnlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIGlkZW50aWZ5ID0gcmV0LnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGRpcnR5SUQgPSAwIFxuICAgICAgICAgICAgaWYgKFNwZWljaWFsSURNYW5hZ2VyLmlzX1NQRUNJQUxfTEFZRVJfTkVXX0xBWUVSKGlkZW50aWZ5KSB8fCBTcGVpY2lhbElETWFuYWdlci5pc19TUEVDSUFMX0xBWUVSX1VTRV9DQU5WQVMoaWRlbnRpZnkpKSB7XG4gICAgICAgICAgICAgICAgZGlydHlJRCA9IFBob3Rvc2hvcFN0b3JlSGVscGVyLmdldENhbnZhc0RpcnR5SUQoZG9jdW1lbnQuZG9jdW1lbnREYXRhKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGlydHlJRCA9IFBob3Rvc2hvcFN0b3JlSGVscGVyLmdldExheWVyRGlydHlJRChkb2N1bWVudC5kb2N1bWVudERhdGEsIGlkZW50aWZ5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgaWRlbnRpZnksXG4gICAgICAgICAgICAgICAgZGlydHlJRFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kb2N1bWVudFdpZGdldEluTm9kZT8ub25DaGFuZ2UodGhpcy51cGRhdGUpXG4gICAgfVxuICAgIHB1YmxpYyBvdmVycmlkZSB1cGRhdGUoKSB7XG4gICAgICAgIGNvbnN0IGRvY3VtZW50V2lkZ2V0ID0gdGhpcy5kb2N1bWVudFdpZGdldEluTm9kZSB8fCB0aGlzLmRvY3VtZW50V2lkZ2V0QnlMaW5rZWQ7XG4gICAgICAgIGlmIChkb2N1bWVudFdpZGdldD8ud2lkZ2V0LnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLndpZGdldC5vcHRpb25zLnZhbHVlcyA9IGdldExheWVyT3B0aW9uc0J5RG9jdW1lbnRWYWx1ZShkb2N1bWVudFdpZGdldC53aWRnZXQudmFsdWUsIHRoaXMuZXh0cmFPcHRpb25zKVxuICAgICAgICAgICAgd2lkZ2V0Q2hlY2tDb250YWluT3JSZXNldCh0aGlzLndpZGdldCwgdGhpcy53aWRnZXQub3B0aW9ucy52YWx1ZXMpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgY3JlYXRlKG5vZGU6IGFueSwgbmFtZTogSTE4bktleSwgb3B0aW9uczogTGF5ZXJXaWRnZXRXaXRoRG9jdW1lbnRTZWxlY3Rpb25DdG9yT3B0aW9ucykge1xuICAgICAgICBjb25zdCBzaXplID0gbm9kZS5zaXplLnNsaWNlKDApO1xuICAgICAgICBjb25zdCBsYXllcldpZGdldCA9IG5vZGUuYWRkV2lkZ2V0KCdjb21ibycsIG5hbWUsIG9wdGlvbnMuZXh0cmFPcHRpb25zWzBdIHx8ICcnLCAoKSA9PiB7IH0sIHsgZm9yY2VJbnB1dDogdHJ1ZSwgdmFsdWVzOiBvcHRpb25zLmV4dHJhT3B0aW9ucyB9KVxuICAgICAgICAvLyBsYXllcldpZGdldC5zZXJpYWxpemVWYWx1ZSA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gICAgIHRoaXMuZG9jdW1lbnRXaWRnZXRCeUxpbmtlZFxuICAgICAgICAvLyB9XG5cbiAgICAgICAgbm9kZS5zaXplID0gW3NpemVbMF0sIE1hdGgubWF4KHNpemVbMV0sIG5vZGUuc2l6ZVsxXSldO1xuICAgICAgICByZXR1cm4gbmV3IExheWVyV2lkZ2V0V2l0aERvY3VtZW50U2VsZWN0aW9uKG5vZGUsIGxheWVyV2lkZ2V0LCB7XG4gICAgICAgICAgICBkb2N1bWVudFdpZGdldEluTm9kZTogb3B0aW9ucy5kb2N1bWVudFdpZGdldEluTm9kZSxcbiAgICAgICAgICAgIGV4dHJhT3B0aW9uczogb3B0aW9ucy5leHRyYU9wdGlvbnNcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBCb3VuZGFyeVdpZGdldEN0b3JPcHRpb25zIHtcbiAgICBleHRyYU9wdGlvbnM6IHN0cmluZ1tdXG59XG5cbmxldCBsYXN0RG93bmxvYWRUaW1lID0gMDtcbmRlY2xhcmUgY29uc3QgYXBwOiBhbnk7XG5leHBvcnQgY2xhc3MgRG93bmxvYWRXaWRnZXQgZXh0ZW5kcyBTRFBQUFdpZGdldCB7XG4gICAgY29uc3RydWN0b3Iobm9kZTogYW55LCB3aWRnZXQ/OiBhbnkpIHtcbiAgICAgICAgaWYgKCF3aWRnZXQpIHtcbiAgICAgICAgICAgIGNvbnN0IHNpemUgPSBub2RlLnNpemUuc2xpY2UoMCk7XG4gICAgICAgICAgICB3aWRnZXQgPSBub2RlLmFkZFdpZGdldCgnYnV0dG9uJywgJ3NkcHBwJywgJycsICgpID0+IHsgfSlcbiAgICAgICAgICAgIG5vZGUuc2l6ZSA9IFtcbiAgICAgICAgICAgICAgICBzaXplWzBdLFxuICAgICAgICAgICAgICAgIE1hdGgubWF4KHNpemVbMV0sIG5vZGUuc2l6ZVsxXSlcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICB3aWRnZXQuc2VyaWFsaXplVmFsdWUgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmV0OiBhbnkgPSB7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RPcGVuZWRXb3JrZmxvdzogc2ltcGxpZnlXb3JrZmxvd1BhdGgocGFnZVN0b3JlLmRhdGEud2lkZ2V0VGFibGVTdHJ1Y3R1cmUud2lkZ2V0VGFibGVQYXRoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBkb2N1bWVudE5vZGUgPSBmaW5kRG9jdW1lbnROb2RlUmVjdXJzaXZlKG5vZGUpO1xuICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudE5vZGU/LndpZGdldHNbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gYXdhaXQgZG9jdW1lbnROb2RlLndpZGdldHNbMF0uc2VyaWFsaXplVmFsdWUoKTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldC5kb2N1bWVudCA9IEpTT04ucGFyc2UodmFsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldC5pc0xvY2FsID0gcGFnZVBob3Rvc2hvcFN0b3JlTWFwLmdldFN0b3JlKHJldC5kb2N1bWVudC5pbnN0YW5jZV9pZCk/LmRhdGEuaXNMb2NhbCB8fCBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShyZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN1cGVyKG5vZGUsIHdpZGdldCk7XG4gICAgICAgIHRoaXMub25DaGFuZ2UoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHBhZ2VQaG90b3Nob3BTdG9yZU1hcC5zdG9yZUNvdW50KCkgPT0gMCAmJiBEYXRlLm5vdygpIC0gbGFzdERvd25sb2FkVGltZSA+IDMwMDApIHtcbiAgICAgICAgICAgICAgICBsYXN0RG93bmxvYWRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICBsb2NhdGlvbi5ocmVmID0gXCIvc2QtcHBwLXN0YXRpYy9zZC1wcHBfUFMuY2N4P189XCIgKyBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgIC8vIGNvbWZ5IGFwcFxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhcHAudWkuZGlhbG9nLnNob3coYDxoMiBcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiY29sb3I6IHZhcigtLWZnLWNvbG9yKTtcIj4ke2kxOG4oJ0hvdyB0byB1c2UgLmNjeCBmaWxlJyl9PC9oMj48aDQgXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImNvbG9yOiB2YXIoLS1mZy1jb2xvcik7XCI+JHtpMThuKCcxLiBJZiB5b3UgaGF2ZSBpbnN0YWxsZWQgQWRvYmUgQ3JlYXRpdmUgQ2xvdWQnKX08L2g0PjxwIFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJjb2xvcjogdmFyKC0tZmctY29sb3IpO1wiPiR7aTE4bignSnVzdCBkb3VibGUgY2xpY2sgdGhlIC5jY3ggZmlsZSwgaXQgd2lsbCBpbnN0YWxsIHRoZSBwbHVnaW4gYXV0b21hdGljYWxseScpfTwvcD48aDQgXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImNvbG9yOiB2YXIoLS1mZy1jb2xvcik7XCI+JHtpMThuKFwiMi4gSWYgeW91IGRvbid0IGhhdmUgQWRvYmUgQ3JlYXRpdmUgQ2xvdWRcIil9PC9oND48cCBcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiY29sb3I6IHZhcigtLWZnLWNvbG9yKTtcIj4ke2kxOG4oJ1JlbmFtZSAuY2N4IHRvIC56aXAgYW5kIGV4dHJhY3QgaXQgaW50byAnKX08aT5bJHtpMThuKCdQaG90b3Nob3AgZGlyZWN0b3J5Jyl9XS9QbHVnLWluczwvaT4gJHtpMThuKCdvcicpfSA8aT5bJHtpMThuKCdQaG90b3Nob3AgZGlyZWN0b3J5Jyl9XS9QbHVnLWlucy9HZW5lcmF0b3I8L2k+PC9wPjxpbWcgXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD00MDAgc3JjPVwiL3NkLXBwcC1zdGF0aWMvY2N4LWhlbHAucG5nXCIvPlxuICAgICAgICAgICAgICAgICAgICBgKVxuICAgICAgICAgICAgICAgIH0sIDMwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgdXBkYXRlKCkge1xuICAgICAgICB0aGlzLndpZGdldC5sYWJlbCA9IHBhZ2VQaG90b3Nob3BTdG9yZU1hcC5zdG9yZUNvdW50KCkgPiAwICYmIENvbWZ5U29ja2V0Lmluc3RhbmNlLmlkID9cbiAgICAgICAgICAgIGkxOG4oJ2N1cnJlbnQgQ29tZnlVSSBwYWdlaWQ6IHswfScsIENvbWZ5U29ja2V0Lmluc3RhbmNlLmlkLnNsaWNlKDAsIDQpKSA6XG4gICAgICAgICAgICBpMThuKCdkb3dubG9hZCBQUyBwbHVnaW4gKC5jY3gpJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkb2N1bWVudFdpZGdldEJ5TGlua2VkOiBEb2N1bWVudFdpZGdldCB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyBsaW5rRG9jdW1lbnRXaWRnZXQoZG9jdW1lbnRXaWRnZXQ6IERvY3VtZW50V2lkZ2V0IHwgbnVsbCkge1xuICAgICAgICB0aGlzLmRvY3VtZW50V2lkZ2V0QnlMaW5rZWQgPSBkb2N1bWVudFdpZGdldDtcbiAgICB9XG59XG5cblxuXG5leHBvcnQgZnVuY3Rpb24gd2lkZ2V0Q2hlY2tDb250YWluT3JSZXNldCh3aWRnZXQ6IGFueSwgb3B0aW9uczogc3RyaW5nW10gfCAoKCkgPT4gc3RyaW5nW10pLCByZXNldElmTm90Q29udGFpbjogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBGdW5jdGlvbikgb3B0aW9ucyA9IG9wdGlvbnMoKTtcbiAgICBpZiAoIXdpZGdldC52YWx1ZSkgd2lkZ2V0LnZhbHVlID0gb3B0aW9uc1swXTtcbiAgICBpZiAob3B0aW9ucy5pbmRleE9mKHdpZGdldC52YWx1ZSkgPT0gLTEpIHtcbiAgICAgICAgaWYgKHJlc2V0SWZOb3RDb250YWluKSB3aWRnZXQudmFsdWUgPSBvcHRpb25zWzBdO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBfX0dMT0JBTF9BUElfTEVWRUxfXyB9IGZyb20gXCIuLi8uLi8uLi8uLi9zcmMvY29tbW9uL3ZlcnNpb24ubXRzXCI7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTRFBQUE5vZGUge1xuICAgIHN0YXRpYyBub2RlTWFwOiBXZWFrTWFwPGFueSwgU0RQUFBOb2RlPiA9IG5ldyBXZWFrTWFwKCk7XG4gICAgc3RhdGljIHJlZ2lzdGVyTm9kZVR5cGUobm9kZVR5cGU6IGFueSwgbm9kZURhdGE6IGFueSwgU0RQUFBOb2RlQ2xhc3M6IG5ldyAobm9kZTogYW55KSA9PiBTRFBQUE5vZGUpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAoU0RQUFBOb2RlQ2xhc3MucHJlaGFuZGxlTm9kZVR5cGUpIFNEUFBQTm9kZUNsYXNzLnByZWhhbmRsZU5vZGVUeXBlKG5vZGVUeXBlLm5vZGVEYXRhIHx8IG5vZGVEYXRhKTtcbiAgICAgICAgY29uc3Qgb25BZGRlZCA9IG5vZGVUeXBlLnByb3RvdHlwZS5vbkFkZGVkO1xuICAgICAgICBjb25zdCBvblJlbW92ZWQgPSBub2RlVHlwZS5wcm90b3R5cGUub25SZW1vdmVkO1xuXG4gICAgICAgIG5vZGVUeXBlLnByb3RvdHlwZS5vbkFkZGVkID0gYXN5bmMgZnVuY3Rpb24gKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICAgICAgICBpZiAob25BZGRlZCkgYXdhaXQgb25BZGRlZC5jYWxsKHRoaXMsIC4uLmFyZ3MpO1xuICAgICAgICAgICAgY29uc3Qgc2RwcHBOb2RlID0gbmV3IFNEUFBQTm9kZUNsYXNzKHRoaXMpO1xuICAgICAgICAgICAgU0RQUFBOb2RlLm5vZGVNYXAuc2V0KHRoaXMsIHNkcHBwTm9kZSk7XG4gICAgICAgICAgICBhd2FpdCBzZHBwcE5vZGUudXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZVR5cGUucHJvdG90eXBlLm9uUmVtb3ZlZCA9IGFzeW5jIGZ1bmN0aW9uICguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICAgICAgaWYgKG9uUmVtb3ZlZCkgYXdhaXQgb25SZW1vdmVkLmNhbGwodGhpcywgLi4uYXJncyk7XG4gICAgICAgICAgICBjb25zdCBzZHBwcE5vZGUgPSBTRFBQUE5vZGUubm9kZU1hcC5nZXQodGhpcyk7XG4gICAgICAgICAgICBTRFBQUE5vZGUubm9kZU1hcC5kZWxldGUodGhpcyk7XG4gICAgICAgICAgICBzZHBwcE5vZGU/Lm9uRGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIG5vZGVUeXBlLnByb3RvdHlwZS5vbkRyYXdGb3JlZ3JvdW5kID0gYXN5bmMgZnVuY3Rpb24gKGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKSB7XG4gICAgICAgICAgICBjb25zdCBzZHBwcE5vZGUgPSBTRFBQUE5vZGUubm9kZU1hcC5nZXQodGhpcyk7XG4gICAgICAgICAgICBzZHBwcE5vZGU/Lm9uRHJhd0ZvcmVncm91bmQoY3R4KTtcbiAgICAgICAgICAgIGF3YWl0IHNkcHBwTm9kZT8udXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZVR5cGUucHJvdG90eXBlLm9uQ29uZmlndXJlID0gYXN5bmMgZnVuY3Rpb24gKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICAgICAgICBjb25zdCBzZHBwcE5vZGUgPSBTRFBQUE5vZGUubm9kZU1hcC5nZXQodGhpcyk7XG4gICAgICAgICAgICBzZHBwcE5vZGU/Lm9uQ29uZmlndXJlKGFyZ3NbMF0pO1xuICAgICAgICAgICAgYXdhaXQgc2RwcHBOb2RlPy51cGRhdGUoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvbkNvbm5lY3Rpb25zQ2hhbmdlID0gbm9kZVR5cGUucHJvdG90eXBlLm9uQ29ubmVjdGlvbnNDaGFuZ2U7XG4gICAgICAgIG5vZGVUeXBlLnByb3RvdHlwZS5vbkNvbm5lY3Rpb25zQ2hhbmdlID0gYXN5bmMgZnVuY3Rpb24gKHR5cGU6IG51bWJlciwgaW5kZXg6IG51bWJlciwgY29ubmVjdGVkOiBib29sZWFuLCBsaW5rSW5mbzogYW55KSB7XG4gICAgICAgICAgICBjb25zdCBzZHBwcE5vZGUgPSBTRFBQUE5vZGUubm9kZU1hcC5nZXQodGhpcyk7XG4gICAgICAgICAgICBpZiAodHlwZSA9PSAxKSB7XG4gICAgICAgICAgICAgICAgc2RwcHBOb2RlPy5pbnB1dENvbm5lY3Rpb25DaGFuZ2UoaW5kZXgsIGNvbm5lY3RlZCAmJiBsaW5rSW5mbyk7XG4gICAgICAgICAgICAgICAgYXdhaXQgc2RwcHBOb2RlPy51cGRhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlID09IDIpIHtcbiAgICAgICAgICAgICAgICBzZHBwcE5vZGU/Lm91dHB1dENvbm5lY3Rpb25DaGFuZ2UoaW5kZXgsIGNvbm5lY3RlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb25Db25uZWN0aW9uc0NoYW5nZT8uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBub2RlOiBhbnk7XG4gICAgY29uc3RydWN0b3Iobm9kZTogYW55KSB7IHRoaXMubm9kZSA9IG5vZGU7IH1cbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgdXBkYXRlKCk6IFByb21pc2U8dm9pZD47XG4gICAgcHJvdGVjdGVkIGlucHV0Q29ubmVjdGlvbkNoYW5nZShpbmRleDogbnVtYmVyLCBjb25uZWN0ZWQ6IGJvb2xlYW4pIHsgfVxuICAgIHByb3RlY3RlZCBvdXRwdXRDb25uZWN0aW9uQ2hhbmdlKGluZGV4OiBudW1iZXIsIGNvbm5lY3RlZDogYm9vbGVhbikgeyB9XG4gICAgcHJvdGVjdGVkIG9uRHJhd0ZvcmVncm91bmQoY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQpIHsgfVxuICAgIHByb3RlY3RlZCBvbkRlc3Ryb3koKSB7IH1cbiAgICBwcm90ZWN0ZWQgb25Db25maWd1cmUobm9kZURhdGE6IGFueSkge1xuICAgICAgICB0aGlzLm5vZGUuc2V0UHJvcGVydHkoJ3NkcHBwLXZlcnNpb24nLCBfX0dMT0JBTF9BUElfTEVWRUxfXyk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IGlzUGhvdG9zaG9wQ29ubmVjdGVkIH0gZnJvbSBcIi4uL3V0aWwubXRzXCI7XG5pbXBvcnQgeyBEb3dubG9hZFdpZGdldCB9IGZyb20gXCIuLi9saXRlZ3JhcGgvZmUtd2lkZ2V0cy5tanNcIjtcbmltcG9ydCB7IFNEUFBQTm9kZSB9IGZyb20gXCIuL1NEUFBQTm9kZS5tanNcIjtcbmltcG9ydCBpMThuIGZyb20gXCIuLi8uLi8uLi8uLi9zcmMvY29tbW9uL2kxOG4ubXRzXCI7XG5cbmV4cG9ydCBjbGFzcyBTRFBQUERvd25sb2FkYWJsZU5vZGUgZXh0ZW5kcyBTRFBQUE5vZGUge1xuXG4gICAgcHJvdGVjdGVkIGRvd25sb2FkV2lkZ2V0OiBhbnk7XG4gICAgY29uc3RydWN0b3Iobm9kZTogYW55KSB7XG4gICAgICAgIHN1cGVyKG5vZGUpO1xuICAgICAgICBpZiAoIXRoaXMuZG93bmxvYWRXaWRnZXQpXG4gICAgICAgICAgICB0aGlzLmRvd25sb2FkV2lkZ2V0ID0gbmV3IERvd25sb2FkV2lkZ2V0KHRoaXMubm9kZSk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBvbkNvbmZpZ3VyZShub2RlRGF0YTogYW55KTogdm9pZCB7XG4gICAgICAgIHN1cGVyLm9uQ29uZmlndXJlKG5vZGVEYXRhKTtcbiAgICB9XG4gICAgb25EcmF3Rm9yZWdyb3VuZChjdHg6IGFueSkge1xuICAgICAgICBpZiAodGhpcy5ub2RlLmZsYWdzLmNvbGxhcHNlZCkgcmV0dXJuO1xuXG4gICAgICAgIGlmICghaXNQaG90b3Nob3BDb25uZWN0ZWQoKSkge1xuICAgICAgICAgICAgY3R4LnNhdmUoKTtcbiAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBcInJnYmEoMjU1LCAwLCAwLCAwLjIpXCI7XG4gICAgICAgICAgICBjdHguZmlsbFJlY3QoMCwgMCwgdGhpcy5ub2RlLnNpemVbMF0sIHRoaXMubm9kZS5zaXplWzFdKTtcbiAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBcIndoaXRlXCI7XG4gICAgICAgICAgICBjdHgudGV4dEFsaWduID0gXCJjZW50ZXJcIlxuICAgICAgICAgICAgY3R4LmZpbGxUZXh0KGkxOG4oXCJQaG90b3Nob3AgRGlzY29ubmVjdGVkIVwiKSwgdGhpcy5ub2RlLnNpemVbMF0gLyAyLCA1KTtcbiAgICAgICAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgdXBkYXRlKCkge1xuICAgICAgICB0aGlzLmRvd25sb2FkV2lkZ2V0Py51cGRhdGUoKTtcbiAgICB9XG59IiwgImltcG9ydCB7IERvY3VtZW50V2lkZ2V0IH0gZnJvbSBcIi4uL2xpdGVncmFwaC9mZS13aWRnZXRzLm1qc1wiO1xuaW1wb3J0IHsgU0RQUFBOb2RlIH0gZnJvbSBcIi4vU0RQUFBOb2RlLm1qc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5vZGVXaXRoRG9jdW1lbnRPdXRwdXQge1xuICAgIGRvY3VtZW50V2lkZ2V0OiBEb2N1bWVudFdpZGdldCB8IG51bGw7XG59XG5leHBvcnQgaW50ZXJmYWNlIE5vZGVXaXRoTGF5ZXJPdXRwdXQgZXh0ZW5kcyBOb2RlV2l0aERvY3VtZW50T3V0cHV0IHtcbn1cbmV4cG9ydCBjbGFzcyBTRFBQUElucHV0IHtcbiAgICBwcm90ZWN0ZWQgbm9kZTogYW55XG4gICAgcHJvdGVjdGVkIGlucHV0SW5kZXg6IG51bWJlclxuICAgIHB1YmxpYyBnZXQgaW5kZXgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlucHV0SW5kZXhcbiAgICB9XG4gICAgY29uc3RydWN0b3Iobm9kZTogYW55LCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMubm9kZSA9IG5vZGU7XG4gICAgICAgIHRoaXMuaW5wdXRJbmRleCA9IGluZGV4O1xuICAgIH1cbiAgICBwdWJsaWMgdXBkYXRlKCkge1xuICAgICAgICAvLyB0aGlzLm5vZGUuaW5wdXRzW3RoaXMuaW5wdXRJbmRleF0ubGFiZWwgPSBpMThuKHRoaXMubm9kZS5pbnB1dHNbdGhpcy5pbnB1dEluZGV4XS5uYW1lKVxuICAgIH1cblxuICAgIHB1YmxpYyBjb25uZWN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbn1cbmV4cG9ydCBjbGFzcyBEb2N1bWVudElucHV0IGV4dGVuZHMgU0RQUFBJbnB1dCB7XG4gICAgZ2V0IGRvY3VtZW50V2lkZ2V0KCkge1xuICAgICAgICBjb25zdCBub2RlV2l0aERvY3VtZW50T3V0cHV0ID0gZmluZFNvdXJjZU5vZGVCeUlucHV0PE5vZGVXaXRoRG9jdW1lbnRPdXRwdXQ+KHRoaXMubm9kZSwgdGhpcy5ub2RlLmlucHV0c1t0aGlzLmlucHV0SW5kZXhdKVxuICAgICAgICByZXR1cm4gbm9kZVdpdGhEb2N1bWVudE91dHB1dD8uZG9jdW1lbnRXaWRnZXQgfHwgbnVsbDtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgTGF5ZXJJbnB1dCBleHRlbmRzIFNEUFBQSW5wdXQge1xuICAgIGdldCBkb2N1bWVudFdpZGdldCgpIHtcbiAgICAgICAgY29uc3Qgbm9kZVdpdGhMYXllck91dHB1dCA9IGZpbmRTb3VyY2VOb2RlQnlJbnB1dDxOb2RlV2l0aExheWVyT3V0cHV0Pih0aGlzLm5vZGUsIHRoaXMubm9kZS5pbnB1dHNbdGhpcy5pbnB1dEluZGV4XSlcbiAgICAgICAgcmV0dXJuIG5vZGVXaXRoTGF5ZXJPdXRwdXQ/LmRvY3VtZW50V2lkZ2V0IHx8IG51bGw7XG4gICAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kU291cmNlTm9kZUJ5SW5wdXQ8VD4obm9kZTogYW55LCBpbnB1dDogYW55KTogVCB8IG51bGwge1xuICAgIGlmICghbm9kZS5ncmFwaC5saW5rc1tpbnB1dC5saW5rXSkgcmV0dXJuIG51bGw7XG4gICAgbGV0IGZyb21Ob2RlSUQgPSBub2RlLmdyYXBoLmxpbmtzW2lucHV0LmxpbmtdLm9yaWdpbl9pZDtcbiAgICBsZXQgZnJvbU5vZGUgPSBub2RlLmdyYXBoLmdldE5vZGVCeUlkKGZyb21Ob2RlSUQpO1xuICAgIHdoaWxlIChmcm9tTm9kZS50eXBlID09ICdSZXJvdXRlJykge1xuICAgICAgICBmcm9tTm9kZUlEID0gbm9kZS5ncmFwaC5saW5rc1tmcm9tTm9kZS5pbnB1dHNbMF0ubGlua10ub3JpZ2luX2lkO1xuICAgICAgICBmcm9tTm9kZSA9IG5vZGUuZ3JhcGguZ2V0Tm9kZUJ5SWQoZnJvbU5vZGVJRCk7XG4gICAgfVxuICAgIHJldHVybiBTRFBQUE5vZGUubm9kZU1hcC5nZXQoZnJvbU5vZGUpIGFzIFRcbn1cbiIsICJpbXBvcnQgaTE4biBmcm9tIFwiLi4vLi4vLi4vLi4vc3JjL2NvbW1vbi9pMThuLm10c1wiO1xuaW1wb3J0IHsgU3BlaWNpYWxJRE1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vLi4vLi4vc3JjL2NvbW1vbi9waG90b3Nob3Avc3BlY2lhbExheWVyLm10c1wiO1xuaW1wb3J0IHsgRG9jdW1lbnRXaWRnZXQsIERvd25sb2FkV2lkZ2V0LCBMYXllcldpZGdldCwgU0RQUFBXaWRnZXQgfSBmcm9tIFwiLi4vbGl0ZWdyYXBoL2ZlLXdpZGdldHMubWpzXCI7XG5pbXBvcnQgeyBEb2N1bWVudElucHV0LCBMYXllcklucHV0LCBTRFBQUElucHV0IH0gZnJvbSBcIi4vSW5wdXRzLm1qc1wiO1xuaW1wb3J0IHsgU0RQUFBEb3dubG9hZGFibGVOb2RlIH0gZnJvbSBcIi4vU0RQUFBEb3dubG9hZGFibGVOb2RlLm1qc1wiO1xuXG5leHBvcnQgY2xhc3MgU0RQUFBOb2RlV2l0aElucHV0IGV4dGVuZHMgU0RQUFBEb3dubG9hZGFibGVOb2RlIHtcbiAgICBnZXQgZG9jdW1lbnRXaWRnZXQoKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0Q29ubmVjdGVkSW5wdXQgPSB0aGlzLmlucHV0cy5maW5kKGlucHV0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dC5jb25uZWN0ZWQgJiYgKFxuICAgICAgICAgICAgICAgIGlucHV0IGluc3RhbmNlb2YgRG9jdW1lbnRJbnB1dCB8fFxuICAgICAgICAgICAgICAgIGlucHV0IGluc3RhbmNlb2YgTGF5ZXJJbnB1dFxuICAgICAgICAgICAgKVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGZpcnN0Q29ubmVjdGVkSW5wdXQpIHJldHVybiAoZmlyc3RDb25uZWN0ZWRJbnB1dCBhcyBhbnkpLmRvY3VtZW50V2lkZ2V0O1xuICAgICAgICByZXR1cm4gdGhpcy5zZHBwcFdpZGdldHMuZmluZCh3aWRnZXQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHdpZGdldCBpbnN0YW5jZW9mIERvY3VtZW50V2lkZ2V0XG4gICAgICAgIH0pIGFzIERvY3VtZW50V2lkZ2V0O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpbnB1dHM6IFNEUFBQSW5wdXRbXSA9IFtdO1xuICAgIHByb3RlY3RlZCBzZHBwcFdpZGdldHM6IFNEUFBQV2lkZ2V0W10gPSBbXTtcbiAgICBjb25zdHJ1Y3Rvcihub2RlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIobm9kZSk7XG4gICAgICAgIGxldCBmaXJzdERvY3VtZW50V2lkZ2V0OiBEb2N1bWVudFdpZGdldCB8IG51bGwgPSBudWxsO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubm9kZS53aWRnZXRzPy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMubm9kZS53aWRnZXRzW2ldLm5hbWVcbiAgICAgICAgICAgIGlmICghbmFtZSB8fCBuYW1lID09IFwic2RwcHBcIikgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCBpbnB1dERhdGEgPSB0aGlzLm5vZGUuY29uc3RydWN0b3Iubm9kZURhdGEuaW5wdXQucmVxdWlyZWRbbmFtZV0gfHwgdGhpcy5ub2RlLmNvbnN0cnVjdG9yLm5vZGVEYXRhLmlucHV0Lm9wdGlvbmFsW25hbWVdO1xuICAgICAgICAgICAgaWYgKCFpbnB1dERhdGEpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGlucHV0RGF0YVsxXS5zZHBwcF90eXBlID09ICdET0NVTUVOVF9uYW1laWQnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZFdpZGdldCA9IERvY3VtZW50V2lkZ2V0Lmxpbmsobm9kZSwgdGhpcy5ub2RlLndpZGdldHNbaV0pXG4gICAgICAgICAgICAgICAgZmlyc3REb2N1bWVudFdpZGdldCA9IGZpcnN0RG9jdW1lbnRXaWRnZXQgfHwgZFdpZGdldFxuICAgICAgICAgICAgICAgIHRoaXMuc2RwcHBXaWRnZXRzLnB1c2goZFdpZGdldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5wdXREYXRhWzFdLnNkcHBwX3R5cGUgPT0gJ0xBWUVSX3NlbGVjdCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsV2lkZ2V0ID0gTGF5ZXJXaWRnZXQubGluayhub2RlLCB0aGlzLm5vZGUud2lkZ2V0c1tpXSwge1xuICAgICAgICAgICAgICAgICAgICBleHRyYU9wdGlvbnM6IFNwZWljaWFsSURNYW5hZ2VyLmdldFNwZWNpYWxMYXllckZvckdldCgpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB0aGlzLnNkcHBwV2lkZ2V0cy5wdXNoKGxXaWRnZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ub2RlLmlucHV0cz8ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLm5vZGUuaW5wdXRzW2ldLm5hbWVcbiAgICAgICAgICAgIGNvbnN0IGlucHV0RGF0YSA9IHRoaXMubm9kZS5jb25zdHJ1Y3Rvci5ub2RlRGF0YS5pbnB1dC5yZXF1aXJlZFtuYW1lXSB8fCB0aGlzLm5vZGUuY29uc3RydWN0b3Iubm9kZURhdGEuaW5wdXQub3B0aW9uYWxbbmFtZV07XG4gICAgICAgICAgICBpZiAoaW5wdXREYXRhWzFdLnNkcHBwX3R5cGUgPT0gJ0RPQ1VNRU5UJykge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRzLnB1c2gobmV3IERvY3VtZW50SW5wdXQobm9kZSwgaSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlucHV0RGF0YVsxXS5zZHBwcF90eXBlID09ICdMQVlFUicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0cy5wdXNoKG5ldyBMYXllcklucHV0KG5vZGUsIGkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyB1cGRhdGUoKSB7XG4gICAgICAgIHRoaXMubm9kZS53aWRnZXRzPy5mb3JFYWNoKCh3aWRnZXQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHdpZGdldC5sYWJlbCkgcmV0dXJuO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB3aWRnZXQubGFiZWwgPSBpMThuKHdpZGdldC5uYW1lKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB3aWRnZXQubGFiZWwgPSB3aWRnZXQubmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2RwcHBXaWRnZXRzPy5mb3JFYWNoKHdpZGdldCA9PiB7XG4gICAgICAgICAgICB3aWRnZXQudXBkYXRlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmlucHV0cz8uZm9yRWFjaChpbnB1dCA9PiB7XG4gICAgICAgICAgICBpbnB1dC51cGRhdGUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN1cGVyLnVwZGF0ZSgpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgaW5wdXRDb25uZWN0aW9uQ2hhbmdlKGluZGV4OiBudW1iZXIsIGNvbm5lY3RlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBzdXBlci5pbnB1dENvbm5lY3Rpb25DaGFuZ2UoaW5kZXgsIGNvbm5lY3RlZCk7XG4gICAgICAgIHRoaXMuaW5wdXRzLmZvckVhY2goc2RwcHBJbnB1dCA9PiB7XG4gICAgICAgICAgICBpZiAoc2RwcHBJbnB1dC5pbmRleCA9PSBpbmRleCkge1xuICAgICAgICAgICAgICAgIHNkcHBwSW5wdXQuY29ubmVjdGVkID0gY29ubmVjdGVkO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0RvY3VtZW50V2lkZ2V0ID0gdGhpcy5kb2N1bWVudFdpZGdldDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kb3dubG9hZFdpZGdldCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvd25sb2FkV2lkZ2V0LmxpbmtEb2N1bWVudFdpZGdldChuZXdEb2N1bWVudFdpZGdldCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc2RwcHBXaWRnZXRzLmZvckVhY2god2lkZ2V0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdpZGdldCBpbnN0YW5jZW9mIExheWVyV2lkZ2V0IHx8IHdpZGdldCBpbnN0YW5jZW9mIERvd25sb2FkV2lkZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aWRnZXQubGlua0RvY3VtZW50V2lkZ2V0KG5ld0RvY3VtZW50V2lkZ2V0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBDb21meVNvY2tldCB9IGZyb20gXCIuLi9zb2NrZXQvQ29tZnlTb2NrZXQubWpzXCI7XG5pbXBvcnQgeyBEb2N1bWVudFdpZGdldCwgTGF5ZXJXaWRnZXQgfSBmcm9tIFwiLi4vbGl0ZWdyYXBoL2ZlLXdpZGdldHMubWpzXCI7XG5pbXBvcnQgeyBEb2N1bWVudElucHV0LCBOb2RlV2l0aERvY3VtZW50T3V0cHV0LCBOb2RlV2l0aExheWVyT3V0cHV0IH0gZnJvbSBcIi4vSW5wdXRzLm1qc1wiO1xuaW1wb3J0IHsgU0RQUFBEb3dubG9hZGFibGVOb2RlIH0gZnJvbSBcIi4vU0RQUFBEb3dubG9hZGFibGVOb2RlLm1qc1wiO1xuaW1wb3J0IHsgU0RQUFBOb2RlV2l0aElucHV0IH0gZnJvbSBcIi4vU0RQUFBOb2RlV2l0aElucHV0Lm1qc1wiO1xuaW1wb3J0IGkxOG4gZnJvbSBcIi4uLy4uLy4uLy4uL3NyYy9jb21tb24vaTE4bi5tdHNcIjtcbmltcG9ydCB7IHBhZ2VQaG90b3Nob3BTdG9yZU1hcCwgcGFnZVN0b3JlIH0gZnJvbSBcInBob3Rvc2hvcE1vZGVscy5tanNcIjtcblxuZXhwb3J0IGNsYXNzIEdldExheWVyTm9kZSBleHRlbmRzIFNEUFBQTm9kZVdpdGhJbnB1dCBpbXBsZW1lbnRzIE5vZGVXaXRoTGF5ZXJPdXRwdXQge1xuICAgIGdldCBkb2N1bWVudFdpZGdldCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmlucHV0c1swXSBhcyBEb2N1bWVudElucHV0KT8uZG9jdW1lbnRXaWRnZXQ7XG4gICAgfVxuXG4gICAgYXN5bmMgdXBkYXRlKCkge1xuICAgICAgICBzdXBlci51cGRhdGUoKTtcbiAgICAgICAgdGhpcy5ub2RlLmlucHV0cy5mb3JFYWNoKChpOiBhbnkpID0+IGkubGFiZWwgPSBpMThuKGkubmFtZSkpO1xuICAgICAgICB0aGlzLm5vZGUub3V0cHV0cy5mb3JFYWNoKChpOiBhbnkpID0+IGkubGFiZWwgPSBpMThuKGkubmFtZSkpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBHZXRTZWxlY3Rpb25Ob2RlIGV4dGVuZHMgU0RQUFBOb2RlV2l0aElucHV0IHtcbiAgICBhc3luYyB1cGRhdGUoKSB7XG4gICAgICAgIHN1cGVyLnVwZGF0ZSgpO1xuICAgICAgICB0aGlzLm5vZGUuaW5wdXRzLmZvckVhY2goKGk6IGFueSkgPT4gaS5sYWJlbCA9IGkxOG4oaS5uYW1lKSk7XG4gICAgICAgIHRoaXMubm9kZS5vdXRwdXRzLmZvckVhY2goKGk6IGFueSkgPT4gaS5sYWJlbCA9IGkxOG4oaS5uYW1lKSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFBhcnNlTGF5ZXJJbmZvTm9kZSBleHRlbmRzIFNEUFBQTm9kZVdpdGhJbnB1dCB7XG4gICAgYXN5bmMgdXBkYXRlKCkge1xuICAgICAgICBzdXBlci51cGRhdGUoKTtcbiAgICAgICAgdGhpcy5ub2RlLmlucHV0cy5mb3JFYWNoKChpOiBhbnkpID0+IGkubGFiZWwgPSBpMThuKGkubmFtZSkpO1xuICAgICAgICB0aGlzLm5vZGUub3V0cHV0cy5mb3JFYWNoKChpOiBhbnkpID0+IGkubGFiZWwgPSBpMThuKGkubmFtZSkpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBHZXRMYXllcnNJbkdyb3VwTm9kZSBleHRlbmRzIFNEUFBQTm9kZVdpdGhJbnB1dCBpbXBsZW1lbnRzIE5vZGVXaXRoTGF5ZXJPdXRwdXQge1xuICAgIGdldCBkb2N1bWVudFdpZGdldCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmlucHV0c1swXSBhcyBEb2N1bWVudElucHV0KT8uZG9jdW1lbnRXaWRnZXQ7XG4gICAgfVxuICAgIGFzeW5jIHVwZGF0ZSgpIHtcbiAgICAgICAgc3VwZXIudXBkYXRlKCk7XG4gICAgICAgIHRoaXMubm9kZS5pbnB1dHMuZm9yRWFjaCgoaTogYW55KSA9PiBpLmxhYmVsID0gaTE4bihpLm5hbWUpKTtcbiAgICAgICAgdGhpcy5ub2RlLm91dHB1dHMuZm9yRWFjaCgoaTogYW55KSA9PiBpLmxhYmVsID0gaTE4bihpLm5hbWUpKTtcbiAgICAgICAgdGhpcy5ub2RlLndpZGdldHNbMF0ubGFiZWwgPSBpMThuKHRoaXMubm9kZS53aWRnZXRzWzBdLm5hbWUpXG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEdldExpbmtlZExheWVyc05vZGUgZXh0ZW5kcyBTRFBQUE5vZGVXaXRoSW5wdXQgaW1wbGVtZW50cyBOb2RlV2l0aExheWVyT3V0cHV0IHtcbiAgICBnZXQgZG9jdW1lbnRXaWRnZXQoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5pbnB1dHNbMF0gYXMgRG9jdW1lbnRJbnB1dCk/LmRvY3VtZW50V2lkZ2V0O1xuICAgIH1cbiAgICBhc3luYyB1cGRhdGUoKSB7XG4gICAgICAgIHN1cGVyLnVwZGF0ZSgpO1xuICAgICAgICB0aGlzLm5vZGUuaW5wdXRzLmZvckVhY2goKGk6IGFueSkgPT4gaS5sYWJlbCA9IGkxOG4oaS5uYW1lKSk7XG4gICAgICAgIHRoaXMubm9kZS5vdXRwdXRzLmZvckVhY2goKGk6IGFueSkgPT4gaS5sYWJlbCA9IGkxOG4oaS5uYW1lKSk7XG4gICAgICAgIHRoaXMubm9kZS53aWRnZXRzWzBdLmxhYmVsID0gaTE4bih0aGlzLm5vZGUud2lkZ2V0c1swXS5uYW1lKVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNlbmRUZXh0VG9MYXllck5vZGUgZXh0ZW5kcyBTRFBQUERvd25sb2FkYWJsZU5vZGUge1xuICAgIHByb3RlY3RlZCBhc3luYyB1cGRhdGUoKSB7XG4gICAgICAgIHN1cGVyLnVwZGF0ZSgpO1xuICAgICAgICB0aGlzLm5vZGUuaW5wdXRzWzBdLmxhYmVsID0gaTE4bih0aGlzLm5vZGUuaW5wdXRzWzBdLm5hbWUpXG4gICAgICAgIHRoaXMubm9kZS5pbnB1dHNbMV0ubGFiZWwgPSBpMThuKHRoaXMubm9kZS5pbnB1dHNbMV0ubmFtZSlcbiAgICAgICAgdGhpcy5ub2RlLm91dHB1dHNbMF0gJiYgKHRoaXMubm9kZS5vdXRwdXRzWzBdLmxhYmVsID0gaTE4bih0aGlzLm5vZGUub3V0cHV0c1swXS5uYW1lKSlcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgR2V0VGV4dEZyb21MYXllck5vZGUgZXh0ZW5kcyBTRFBQUERvd25sb2FkYWJsZU5vZGUge1xuICAgIHN0YXRpYyBwcmVoYW5kbGVOb2RlVHlwZShub2RlRGF0YTogYW55KSB7XG4gICAgICAgIGlmIChub2RlRGF0YS5pbnB1dC5vcHRpb25hbFsnZG9jdW1lbnQnXSkge1xuICAgICAgICAgICAgZGVsZXRlIG5vZGVEYXRhLmlucHV0Lm9wdGlvbmFsWydkb2N1bWVudCddO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKG5vZGU6IGFueSkge1xuICAgICAgICBzdXBlcihub2RlKTtcbiAgICB9XG4gICAgYXN5bmMgdXBkYXRlKCkge1xuICAgICAgICBzdXBlci51cGRhdGUoKTtcbiAgICAgICAgdGhpcy5ub2RlLmlucHV0c1swXS5sYWJlbCA9IGkxOG4odGhpcy5ub2RlLmlucHV0c1swXS5uYW1lKVxuICAgICAgICB0aGlzLm5vZGUub3V0cHV0c1swXSAmJiAodGhpcy5ub2RlLm91dHB1dHNbMF0ubGFiZWwgPSBpMThuKHRoaXMubm9kZS5vdXRwdXRzWzBdLm5hbWUpKVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdldERvY3VtZW50Tm9kZSBleHRlbmRzIFNEUFBQTm9kZVdpdGhJbnB1dCBpbXBsZW1lbnRzIE5vZGVXaXRoRG9jdW1lbnRPdXRwdXQge1xuICAgIGdldCBkb2N1bWVudFdpZGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2RwcHBXaWRnZXRzWzBdIGFzIERvY3VtZW50V2lkZ2V0O1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgcHNkV2lkZ2V0OiBhbnlcblxuICAgIHB1YmxpYyBleHRyYWN0UFNEKHNpZDogc3RyaW5nLCBkb2N1bWVudElkZW50aWZ5OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMubm9kZS5wcm9wZXJ0aWVzLnBzZCkge1xuICAgICAgICAgICAgQ29tZnlTb2NrZXQuaW5zdGFuY2VcbiAgICAgICAgICAgICAgICAuZXhwb3J0UFNERGF0YVVSTFRvUGhvdG9zaG9wKHNpZCwgZG9jdW1lbnRJZGVudGlmeSwgdGhpcy5ub2RlLnByb3BlcnRpZXNbJ3BzZCddLCBwYWdlU3RvcmUuZGF0YS5zc2lkKVxuICAgICAgICAgICAgICAgIC50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDMwMCkpO1xuICAgICAgICAgICAgICAgICAgICAoZ2xvYmFsVGhpcyBhcyBhbnkpLmFwcC5jYW52YXMuZHJhdyh0cnVlLCB0cnVlKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKGNvbnNvbGUuZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Iobm9kZTogYW55KSB7XG4gICAgICAgIHN1cGVyKG5vZGUpO1xuICAgICAgICB0aGlzLnBzZFdpZGdldCA9IG5vZGUuYWRkV2lkZ2V0KCdidXR0b24nLCAnJywgJycsICgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5kb2N1bWVudFdpZGdldC53aWRnZXQudmFsdWUpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IGJhY2tlbmREYXRhcyA9IHBhZ2VQaG90b3Nob3BTdG9yZU1hcC5nZXRBbGxQaG90b3Nob3BEb2N1bWVudERhdGEoKTtcbiAgICAgICAgICAgIGxldCBbaW5zdGFuY2VOYW1lLCBkb2N1bWVudElkZW50aWZ5XSA9IHRoaXMuZG9jdW1lbnRXaWRnZXQud2lkZ2V0LnZhbHVlLnNwbGl0KCcvJyk7XG4gICAgICAgICAgICBpZiAodGhpcy5ub2RlLnByb3BlcnRpZXMucHNkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leHRyYWN0UFNEKGJhY2tlbmREYXRhc1tpbnN0YW5jZU5hbWVdLnNpZCwgZG9jdW1lbnRJZGVudGlmeSk7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgQ29tZnlTb2NrZXQuaW5zdGFuY2VcbiAgICAgICAgICAgICAgICAgICAgLmltcG9ydFBTRERhdGFVUkxGcm9tUGhvdG9zaG9wKGJhY2tlbmREYXRhc1tpbnN0YW5jZU5hbWVdLnNpZCwgZG9jdW1lbnRJZGVudGlmeSwgcGFnZVN0b3JlLmRhdGEuc3NpZClcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4ocHNkQmFzZTY0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZS5zZXRQcm9wZXJ0eSgncHNkJywgcHNkQmFzZTY0KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHt9KVxuICAgIH1cblxuICAgIGFzeW5jIHVwZGF0ZSgpIHtcbiAgICAgICAgc3VwZXIudXBkYXRlKCk7XG4gICAgICAgIHRoaXMubm9kZS5vdXRwdXRzLmZvckVhY2goKGk6IGFueSkgPT4gaS5sYWJlbCA9IGkxOG4oaS5uYW1lKSk7XG4gICAgICAgIGlmICh0aGlzLm5vZGUucHJvcGVydGllcy5wc2QpIHtcbiAgICAgICAgICAgIHBhZ2VTdG9yZS5zZXRIYXNQU0ROb2Rlcyh0cnVlKVxuICAgICAgICAgICAgdGhpcy5wc2RXaWRnZXQubGFiZWwgPSBpMThuKCdleHRyYWN0IHNhdmVkIC5wc2QgdG8gUGhvdG9zaG9wJylcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFnZVN0b3JlLnNldEhhc1BTRE5vZGVzKGZhbHNlKVxuICAgICAgICAgICAgdGhpcy5wc2RXaWRnZXQubGFiZWwgPSBpMThuKCdzYXZlIC5wc2QgdG8gdGhpcyB3b3JrZmxvdycpXG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSdW5QaG90b3Nob3BBY3Rpb25Ob2RlIGV4dGVuZHMgU0RQUFBOb2RlV2l0aElucHV0IHtcbiAgICBhc3luYyB1cGRhdGUoKSB7XG4gICAgICAgIHN1cGVyLnVwZGF0ZSgpO1xuICAgICAgICB0aGlzLm5vZGUuaW5wdXRzLmZvckVhY2goKGk6IGFueSkgPT4gaS5sYWJlbCA9IGkxOG4oaS5uYW1lKSk7XG4gICAgICAgIHRoaXMubm9kZS5vdXRwdXRzLmZvckVhY2goKGk6IGFueSkgPT4gaS5sYWJlbCA9IGkxOG4oaS5uYW1lKSk7XG4gICAgfVxufVxuIiwgImltcG9ydCBpMThuIGZyb20gXCIuLi8uLi8uLi8uLi9zcmMvY29tbW9uL2kxOG4ubXRzXCI7XG5pbXBvcnQgeyBTcGVpY2lhbElETWFuYWdlciB9IGZyb20gXCIuLi8uLi8uLi8uLi9zcmMvY29tbW9uL3Bob3Rvc2hvcC9zcGVjaWFsTGF5ZXIubXRzXCI7XG5pbXBvcnQgeyBEb2N1bWVudFdpZGdldCwgTGF5ZXJXaWRnZXQsIExheWVyV2lkZ2V0V2l0aERvY3VtZW50U2VsZWN0aW9uIH0gZnJvbSBcIi4uL2xpdGVncmFwaC9mZS13aWRnZXRzLm1qc1wiO1xuaW1wb3J0IHsgQ29tZnlOb2RlRGVmTGlzdCB9IGZyb20gXCIuLi9saXRlZ3JhcGgvbm9kZS13cmFwcGVyLm1qc1wiO1xuaW1wb3J0IHsgR2V0U2VsZWN0aW9uTm9kZSB9IGZyb20gXCIuL25vZGVzLm1qc1wiO1xuaW1wb3J0IHsgU0RQUFBEb3dubG9hZGFibGVOb2RlIH0gZnJvbSBcIi4vU0RQUFBEb3dubG9hZGFibGVOb2RlLm1qc1wiO1xuZGVjbGFyZSBjb25zdCBjb21meUFQSTogYW55O1xuXG5leHBvcnQgY2xhc3MgR2V0SW1hZ2VGcm9tTGF5ZXJOb2RlIGV4dGVuZHMgU0RQUFBEb3dubG9hZGFibGVOb2RlIHtcbiAgICBzdGF0aWMgcHJlaGFuZGxlTm9kZVR5cGUobm9kZURhdGE6IGFueSkge1xuICAgICAgICBpZiAobm9kZURhdGEuaW5wdXQub3B0aW9uYWxbJ2RvY3VtZW50J10pIHtcbiAgICAgICAgICAgIGRlbGV0ZSBub2RlRGF0YS5pbnB1dC5vcHRpb25hbFsnZG9jdW1lbnQnXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIGRvY3VtZW50V2lkZ2V0OiBEb2N1bWVudFdpZGdldDtcbiAgICBwcml2YXRlIGxheWVyV2lkZ2V0OiBMYXllcldpZGdldDtcbiAgICBjb25zdHJ1Y3Rvcihub2RlOiBhbnkpIHtcbiAgICAgICAgY29uc3QgZG9jdW1lbnRXaWRnZXQgPSBEb2N1bWVudFdpZGdldC5jcmVhdGUobm9kZSwgJ2RvY3VtZW50JylcbiAgICAgICAgY29uc3QgbGF5ZXJXaWRnZXQgPSBMYXllcldpZGdldFdpdGhEb2N1bWVudFNlbGVjdGlvbi5jcmVhdGUobm9kZSwgJ2xheWVyX29yX2dyb3VwJywge1xuICAgICAgICAgICAgZG9jdW1lbnRXaWRnZXRJbk5vZGU6IGRvY3VtZW50V2lkZ2V0LFxuICAgICAgICAgICAgZXh0cmFPcHRpb25zOiBTcGVpY2lhbElETWFuYWdlci5nZXRTcGVjaWFsTGF5ZXJGb3JHZXQoKVxuICAgICAgICB9KTtcblxuICAgICAgICBzdXBlcihub2RlKTtcbiAgICAgICAgdGhpcy5kb2N1bWVudFdpZGdldCA9IGRvY3VtZW50V2lkZ2V0XG4gICAgICAgIHRoaXMubGF5ZXJXaWRnZXQgPSBsYXllcldpZGdldFxuXG4gICAgICAgIGlmICh0aGlzLm5vZGUud2lkZ2V0c1swXS5uYW1lID09ICdxdWFsaXR5Jykge1xuICAgICAgICAgICAgdGhpcy5ub2RlLndpZGdldHNbMV0gPSBkb2N1bWVudFdpZGdldC53aWRnZXRcbiAgICAgICAgICAgIHRoaXMubm9kZS53aWRnZXRzWzJdID0gbGF5ZXJXaWRnZXQud2lkZ2V0XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm5vZGUud2lkZ2V0c1swXSA9IGRvY3VtZW50V2lkZ2V0LndpZGdldFxuICAgICAgICAgICAgdGhpcy5ub2RlLndpZGdldHNbMV0gPSBsYXllcldpZGdldC53aWRnZXRcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcm90ZWN0ZWQgb25Db25maWd1cmUobm9kZURhdGE6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAoIW5vZGVEYXRhLnByb3BlcnRpZXNbJ3NkcHBwLXZlcnNpb24nXSkge1xuXG4gICAgICAgIH0gZWxzZSBpZiAoK25vZGVEYXRhLnByb3BlcnRpZXNbJ3NkcHBwLXZlcnNpb24nXSA8PSA0MTApIHtcblxuICAgICAgICAgICAgaWYgKHRoaXMubm9kZS53aWRnZXRzWzBdLnZhbHVlID09PSB0cnVlIHx8IHRoaXMubm9kZS53aWRnZXRzWzBdLnZhbHVlID09PSBcInRydWVcIikge1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZ2V0U2VsZWN0aW9uTm9kZSA9IGNvbWZ5QVBJLmFwcC5hcHAuYWRkTm9kZU9uR3JhcGgoQ29tZnlOb2RlRGVmTGlzdFsnU0RQUFAgR2V0IFNlbGVjdGlvbiddLCB7XG4gICAgICAgICAgICAgICAgICAgIHBvczogdGhpcy5ub2RlLnBvcyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBuZXcgR2V0U2VsZWN0aW9uTm9kZShnZXRTZWxlY3Rpb25Ob2RlKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGUub3V0cHV0c1swXS5saW5rcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbWZ5QVBJLmFwcC5hcHAuYWRkTm9kZU9uR3JhcGgoQ29tZnlOb2RlRGVmTGlzdFsnSm9pbkltYWdlV2l0aEFscGhhJ10sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvczogW3RoaXMubm9kZS5wb3NbMF0gKyBnZXRTZWxlY3Rpb25Ob2RlLnNpemVbMF0gKyAxMCwgdGhpcy5ub2RlLnBvc1sxXSAtIDIwXSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBnZXRTZWxlY3Rpb25Ob2RlLnNpemUgPSB0aGlzLm5vZGUuc2l6ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICA7IChjb21meUFQSSBhcyBhbnkpLmFwcC5hcHAuZ3JhcGgucmVtb3ZlKHRoaXMubm9kZSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5ub2RlLndpZGdldHNbMF0udmFsdWUgPSBub2RlRGF0YS53aWRnZXRzX3ZhbHVlc1sxXTtcbiAgICAgICAgICAgIHRoaXMubm9kZS53aWRnZXRzWzFdLnZhbHVlID0gbm9kZURhdGEud2lkZ2V0c192YWx1ZXNbMl07XG4gICAgICAgIH0gZWxzZSBpZiAoK25vZGVEYXRhLnByb3BlcnRpZXNbJ3NkcHBwLXZlcnNpb24nXSA8IDUwNCkge1xuICAgICAgICAgICAgaWYgKHRoaXMubm9kZS53aWRnZXRzWzBdLm5hbWUgPT0gJ3F1YWxpdHknKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlLndpZGdldHNbMF0udmFsdWUgPSAxMDA7XG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlLndpZGdldHNbMV0udmFsdWUgPSBub2RlRGF0YS53aWRnZXRzX3ZhbHVlc1swXTtcbiAgICAgICAgICAgICAgICB0aGlzLm5vZGUud2lkZ2V0c1syXS52YWx1ZSA9IG5vZGVEYXRhLndpZGdldHNfdmFsdWVzWzFdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN1cGVyLm9uQ29uZmlndXJlKG5vZGVEYXRhKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgdXBkYXRlKCkge1xuICAgICAgICB0aGlzLmRvY3VtZW50V2lkZ2V0LmxvY2tNb2RlKHRoaXMubGF5ZXJMaW5rZWQsIGkxOG4oJ2RvY3VtZW50IGxpbmtlZCcpKVxuICAgICAgICB0aGlzLmxheWVyV2lkZ2V0LmxvY2tNb2RlKHRoaXMubGF5ZXJMaW5rZWQsIGkxOG4oJ2xheWVyIGxpbmtlZCcpKVxuXG4gICAgICAgIHRoaXMuZG9jdW1lbnRXaWRnZXQudXBkYXRlKCk7XG4gICAgICAgIHRoaXMubGF5ZXJXaWRnZXQudXBkYXRlKCk7XG4gICAgICAgIHN1cGVyLnVwZGF0ZSgpO1xuICAgICAgICB0aGlzLm5vZGUud2lkZ2V0cy5mb3JFYWNoKChpOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChpLmxhYmVsKSByZXR1cm5cbiAgICAgICAgICAgIHRyeSB7IGkubGFiZWwgPSBpMThuKGkubmFtZSkgfSBjYXRjaCAoZSkgeyB9XG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMubm9kZS5pbnB1dHMuZm9yRWFjaCgoaTogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoaS5sYWJlbCkgcmV0dXJuXG4gICAgICAgICAgICB0cnkgeyBpLmxhYmVsID0gaTE4bihpLm5hbWUpIH0gY2F0Y2ggKGUpIHsgfVxuICAgICAgICB9KVxuICAgICAgICB0aGlzLm5vZGUub3V0cHV0cy5mb3JFYWNoKChpOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChpLmxhYmVsKSByZXR1cm5cbiAgICAgICAgICAgIHRyeSB7IGkubGFiZWwgPSBpMThuKGkubmFtZSkgfSBjYXRjaCAoZSkgeyB9XG4gICAgICAgIH0pXG4gICAgfVxuICAgIHByaXZhdGUgbGF5ZXJMaW5rZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgaW5wdXRDb25uZWN0aW9uQ2hhbmdlKGluZGV4OiBudW1iZXIsIGNvbm5lY3RlZDogYm9vbGVhbikge1xuICAgICAgICBzdXBlci5pbnB1dENvbm5lY3Rpb25DaGFuZ2UoaW5kZXgsIGNvbm5lY3RlZCk7XG4gICAgICAgIGlmIChpbmRleCA9PSAwKSB0aGlzLmxheWVyTGlua2VkID0gY29ubmVjdGVkO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBTZW5kSW1hZ2VUb0xheWVyTm9kZSBleHRlbmRzIFNEUFBQRG93bmxvYWRhYmxlTm9kZSB7XG4gICAgc3RhdGljIHByZWhhbmRsZU5vZGVUeXBlKG5vZGVEYXRhOiBhbnkpIHtcbiAgICAgICAgaWYgKG5vZGVEYXRhLmlucHV0Lm9wdGlvbmFsWydkb2N1bWVudCddKSB7XG4gICAgICAgICAgICBkZWxldGUgbm9kZURhdGEuaW5wdXQub3B0aW9uYWxbJ2RvY3VtZW50J107XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBkb2N1bWVudFdpZGdldDogRG9jdW1lbnRXaWRnZXQ7XG4gICAgcHJpdmF0ZSBsYXllcldpZGdldDogTGF5ZXJXaWRnZXQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihub2RlOiBhbnkpIHtcbiAgICAgICAgY29uc3QgZG9jdW1lbnRXaWRnZXQgPSBEb2N1bWVudFdpZGdldC5jcmVhdGUobm9kZSwgJ2RvY3VtZW50JylcbiAgICAgICAgY29uc3QgbGF5ZXJXaWRnZXQgPSBMYXllcldpZGdldFdpdGhEb2N1bWVudFNlbGVjdGlvbi5jcmVhdGUobm9kZSwgJ2xheWVyX29yX2dyb3VwJywge1xuICAgICAgICAgICAgZG9jdW1lbnRXaWRnZXRJbk5vZGU6IGRvY3VtZW50V2lkZ2V0LFxuICAgICAgICAgICAgZXh0cmFPcHRpb25zOiBTcGVpY2lhbElETWFuYWdlci5nZXRTcGVjaWFsTGF5ZXJGb3JTZW5kKClcbiAgICAgICAgfSk7XG4gICAgICAgIHN1cGVyKG5vZGUpO1xuICAgICAgICB0aGlzLmRvY3VtZW50V2lkZ2V0ID0gZG9jdW1lbnRXaWRnZXRcbiAgICAgICAgdGhpcy5sYXllcldpZGdldCA9IGxheWVyV2lkZ2V0XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyB1cGRhdGUoKSB7XG4gICAgICAgIHRoaXMuZG9jdW1lbnRXaWRnZXQ/LmxvY2tNb2RlKHRoaXMubGF5ZXJMaW5rZWQsIGkxOG4oJ2RvY3VtZW50IGxpbmtlZCcpKVxuICAgICAgICB0aGlzLmxheWVyV2lkZ2V0Py5sb2NrTW9kZSh0aGlzLmxheWVyTGlua2VkLCBpMThuKCdsYXllciBsaW5rZWQnKSlcblxuICAgICAgICB0aGlzLmRvY3VtZW50V2lkZ2V0LnVwZGF0ZSgpO1xuICAgICAgICB0aGlzLmxheWVyV2lkZ2V0LnVwZGF0ZSgpO1xuICAgICAgICBzdXBlci51cGRhdGUoKTtcbiAgICAgICAgaWYgKCF0aGlzLm5vZGUud2lkZ2V0c1swXS5sYWJlbClcbiAgICAgICAgICAgIHRoaXMubm9kZS53aWRnZXRzWzBdLmxhYmVsID0gaTE4bih0aGlzLm5vZGUud2lkZ2V0c1swXS5uYW1lKVxuICAgICAgICBpZiAoIXRoaXMubm9kZS53aWRnZXRzWzFdLmxhYmVsKVxuICAgICAgICAgICAgdGhpcy5ub2RlLndpZGdldHNbMV0ubGFiZWwgPSBpMThuKHRoaXMubm9kZS53aWRnZXRzWzFdLm5hbWUpXG4gICAgICAgIHRoaXMubm9kZS5pbnB1dHNbMF0ubGFiZWwgPSBpMThuKHRoaXMubm9kZS5pbnB1dHNbMF0ubmFtZSlcbiAgICAgICAgdGhpcy5ub2RlLmlucHV0c1sxXS5sYWJlbCA9IGkxOG4odGhpcy5ub2RlLmlucHV0c1sxXS5uYW1lKVxuICAgICAgICB0aGlzLm5vZGUuaW5wdXRzWzJdLmxhYmVsID0gaTE4bih0aGlzLm5vZGUuaW5wdXRzWzJdLm5hbWUpXG4gICAgICAgIHRoaXMubm9kZS5vdXRwdXRzWzBdLmxhYmVsID0gaTE4bih0aGlzLm5vZGUub3V0cHV0c1swXS5uYW1lKVxuICAgIH1cbiAgICBwcml2YXRlIGxheWVyTGlua2VkOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIGlucHV0Q29ubmVjdGlvbkNoYW5nZShpbmRleDogbnVtYmVyLCBjb25uZWN0ZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgc3VwZXIuaW5wdXRDb25uZWN0aW9uQ2hhbmdlKGluZGV4LCBjb25uZWN0ZWQpO1xuICAgICAgICBpZiAoaW5kZXggPT0gMSkgdGhpcy5sYXllckxpbmtlZCA9IGNvbm5lY3RlZDtcbiAgICB9XG59IiwgImltcG9ydCBpMThuIGZyb20gXCIuLi8uLi8uLi8uLi9zcmMvY29tbW9uL2kxOG4ubXRzXCI7XG5pbXBvcnQgeyBHZXRJbWFnZUZyb21MYXllck5vZGUsIFNlbmRJbWFnZVRvTGF5ZXJOb2RlIH0gZnJvbSBcIi4uL2NvbWZ5LW5vZGVzL2xlZ2FjeS1ub2Rlcy5tanNcIjtcbmltcG9ydCB7IEdldERvY3VtZW50Tm9kZSwgR2V0TGF5ZXJOb2RlLCBHZXRMYXllcnNJbkdyb3VwTm9kZSwgR2V0TGlua2VkTGF5ZXJzTm9kZSwgR2V0U2VsZWN0aW9uTm9kZSwgR2V0VGV4dEZyb21MYXllck5vZGUsIFBhcnNlTGF5ZXJJbmZvTm9kZSwgUnVuUGhvdG9zaG9wQWN0aW9uTm9kZSwgU2VuZFRleHRUb0xheWVyTm9kZSB9IGZyb20gXCIuLi9jb21meS1ub2Rlcy9ub2Rlcy5tanNcIjtcbmltcG9ydCB7IFNEUFBQTm9kZSB9IGZyb20gXCIuLi9jb21meS1ub2Rlcy9TRFBQUE5vZGUubWpzXCI7XG5pbXBvcnQgeyBTRFBQUE5vZGVXaXRoSW5wdXQgfSBmcm9tIFwiLi4vY29tZnktbm9kZXMvU0RQUFBOb2RlV2l0aElucHV0Lm1qc1wiO1xuZGVjbGFyZSBjb25zdCBjb21meUFQSTogYW55O1xuXG5jb25zdCBTRFBQUE5vZGVMaXN0ID0ge1xuICAgICdHZXQgSW1hZ2UgRnJvbSBQaG90b3Nob3AgTGF5ZXInOiBHZXRJbWFnZUZyb21MYXllck5vZGUsXG4gICAgJ1NlbmQgSW1hZ2VzIFRvIFBob3Rvc2hvcCc6IFNlbmRJbWFnZVRvTGF5ZXJOb2RlLFxuICAgICdTRFBQUCBTZW5kIFRleHQgVG8gTGF5ZXInOiBTZW5kVGV4dFRvTGF5ZXJOb2RlLFxuICAgICdTRFBQUCBHZXQgVGV4dCBGcm9tIExheWVyJzogR2V0VGV4dEZyb21MYXllck5vZGUsXG4gICAgJ1NEUFBQIFBhcnNlIExheWVyIEluZm8nOiBQYXJzZUxheWVySW5mb05vZGUsXG4gICAgJ1NEUFBQIEdldCBMaW5rZWQgTGF5ZXJzJzogR2V0TGlua2VkTGF5ZXJzTm9kZSxcbiAgICAnU0RQUFAgR2V0IExheWVycyBJbiBHcm91cCc6IEdldExheWVyc0luR3JvdXBOb2RlLFxuICAgICdTRFBQUCBHZXQgTGF5ZXIgQnkgSUQnOiBHZXRMYXllck5vZGUsXG4gICAgJ1NEUFBQIEdldCBEb2N1bWVudCc6IEdldERvY3VtZW50Tm9kZSxcbiAgICAnU0RQUFAgR2V0IFNlbGVjdGlvbic6IEdldFNlbGVjdGlvbk5vZGUsXG4gICAgJ1NEUFBQIFJ1biBQaG90b3Nob3AgQWN0aW9uJzogUnVuUGhvdG9zaG9wQWN0aW9uTm9kZSxcbiAgICAvLyAnU0RQUFAgU2V0dGluZ3MnOiBTRFBQUFNldHRpbmdzTm9kZSxcbn1cbmV4cG9ydCBjb25zdCBDb21meU5vZGVEZWZMaXN0OiBSZWNvcmQ8YW55LCBhbnk+ID0ge30gYXMgYW55XG5cbmV4cG9ydCBmdW5jdGlvbiB3cmFwTm9kZShub2RlVHlwZTogYW55LCBub2RlRGVmOiBhbnkpIHtcbiAgICBjb25zdCBjb21meUNsYXNzID0gbm9kZVR5cGUuY29tZnlDbGFzcyB8fCBub2RlRGVmLm5hbWU7XG4gICAgQ29tZnlOb2RlRGVmTGlzdFtjb21meUNsYXNzXSA9IG5vZGVEZWY7XG4gICAgXG4gICAgaWYgKGNvbWZ5Q2xhc3MgaW4gU0RQUFBOb2RlTGlzdCkge1xuICAgICAgICBub2RlVHlwZS50aXRsZSA9IGkxOG4obm9kZURlZi5kaXNwbGF5X25hbWUpO1xuICAgICAgICBub2RlRGVmLmRpc3BsYXlfbmFtZSA9IGkxOG4obm9kZURlZi5kaXNwbGF5X25hbWUpO1xuICAgICAgICBTRFBQUE5vZGUucmVnaXN0ZXJOb2RlVHlwZShub2RlVHlwZSwgbm9kZURlZiwgU0RQUFBOb2RlTGlzdFtjb21meUNsYXNzIGFzIGtleW9mIHR5cGVvZiBTRFBQUE5vZGVMaXN0XSlcblxuICAgIH0gZWxzZSBpZiAoY29tZnlDbGFzcy5zdGFydHNXaXRoKCd3b3JrZmxvdycpICYmIGNvbWZ5QVBJLmdyb3VwTm9kZS5Hcm91cE5vZGVIYW5kbGVyLmdldEdyb3VwRGF0YShub2RlVHlwZSkpIHtcbiAgICAgICAgY29uc3QgZ3JvdXBEYXRhID0gY29tZnlBUEkuZ3JvdXBOb2RlLkdyb3VwTm9kZUhhbmRsZXIuZ2V0R3JvdXBEYXRhKG5vZGVUeXBlKVxuICAgICAgICBsZXQgY29udGFpbnNTRFBQUE5vZGUgPSBmYWxzZTtcbiAgICAgICAgZ3JvdXBEYXRhLm5vZGVEYXRhLm5vZGVzLmZvckVhY2goKG5vZGU6IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgLy8gbWlnaHQgYmUgYW5vdGhlciBncm91cE5vZGVcbiAgICAgICAgICAgIGlmIChub2RlLnR5cGUgaW4gU0RQUFBOb2RlTGlzdCkgY29udGFpbnNTRFBQUE5vZGUgPSB0cnVlO1xuICAgICAgICB9KVxuICAgICAgICBcbiAgICAgICAgaWYgKGNvbnRhaW5zU0RQUFBOb2RlKVxuICAgICAgICAgICAgU0RQUFBOb2RlLnJlZ2lzdGVyTm9kZVR5cGUobm9kZVR5cGUsIG5vZGVEZWYsIFNEUFBQTm9kZVdpdGhJbnB1dClcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgY3JlYXRlUm9vdCB9IGZyb20gXCJyZWFjdC1kb20vY2xpZW50XCI7XG5pbXBvcnQgeyBjcmVhdGVFbGVtZW50IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgQ29tZnlQb3B1cCBmcm9tIFwiLi90c3gvQ29tZnlQb3B1cFwiO1xuaW1wb3J0IENvbWZ5U2lkZWJhciBmcm9tIFwiLi90c3gvQ29tZnlTaWRlYmFyXCI7XG5cbmxldCBzZHBwcENhbnZhc1JlbmRlcmVkOiBhbnkgPSBudWxsXG5sZXQgc2RwcHBTaWRlQmFyUmVuZGVyZWQ6IGFueSA9IG51bGxcbmxldCBwb3B1cEpTWEVsZW1lbnQ6IGFueSA9IG51bGxcbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIGluaXRQb3B1cChhcHA6IGFueSkge1xuICAgIGlmICghc2RwcHBDYW52YXNSZW5kZXJlZCkge1xuICAgICAgICBjb25zdCBzZHBwcENhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBzZHBwcENhbnZhcy5pZCA9IFwic2RwcHAtcG9wdXAtcm9vdFwiO1xuICAgICAgICBzZHBwcENhbnZhcy5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZ3JhcGgtY2FudmFzLWNvbnRhaW5lclwiKT8ucHJlcGVuZChzZHBwcENhbnZhcyk7XG5cbiAgICAgICAgYXBwLmV4dGVuc2lvbk1hbmFnZXIucmVnaXN0ZXJTaWRlYmFyVGFiKHtcblxuICAgICAgICAgICAgaWQ6IFwic2RwcHBcIixcbiAgICAgICAgICAgIHRpdGxlOiBcIlNELVBQUFwiLFxuICAgICAgICAgICAgdG9vbHRpcDogXCJTRC1QUFAgV29ya2Zsb3cgVUlcIixcbiAgICAgICAgICAgIGljb246IFwic2RwcHAtc2lkZS1pY29uXCIsXG4gICAgICAgICAgICB0eXBlOiBcImN1c3RvbVwiLFxuICAgICAgICAgICAgcmVuZGVyOiAoY29udGFpbmVyOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghc2RwcHBTaWRlQmFyUmVuZGVyZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLndpZHRoID0gXCIxMDAlXCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSBcImF1dG9cIjtcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLnBhZGRpbmcgPSBcIjhweFwiO1xuICAgICAgICAgICAgICAgICAgICBjcmVhdGVSb290KGNvbnRhaW5lcikucmVuZGVyKGNyZWF0ZUVsZW1lbnQoQ29tZnlTaWRlYmFyLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvbk1heGltaXplOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1BvcHVwKFwiMVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uUGhvdG9zaG9wOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1BvcHVwKFwiMlwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2RwcHBDYW52YXMuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHNob3dQb3B1cCh0YWI6IHN0cmluZykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXNkcHBwQ2FudmFzUmVuZGVyZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvcHVwSlNYRWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoQ29tZnlQb3B1cCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xvc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2RwcHBDYW52YXMuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVJvb3Qoc2RwcHBDYW52YXMpLnJlbmRlcihwb3B1cEpTWEVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb3B1cEpTWEVsZW1lbnQucHJvcHMudGFiID0gdGFiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc2RwcHBDYW52YXMuc3R5bGUuZGlzcGxheSA9IFwiZmxleFwiO1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLnNkcHBwLXNpZGUtaWNvblwiKT8ucGFyZW50RWxlbWVudD8uY2xpY2soKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgfVxufVxuXG4iLCAiI3NkcHBwLXBvcHVwLXJvb3Qge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgcGFkZGluZzogMTZweDtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iZy1jb2xvcik7XG4gICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XG4gICAganVzdGlmeS1jb250ZW50OiBzdHJldGNoO1xufSBcbi5zZHBwcC1tZW51LWNvbnRhaW5lciB7XG4gICAgYm94LXNpemluZzogY29udGVudC1ib3g7XG4gICAgb3ZlcmZsb3cteTogaGlkZGVuO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBhbGlnbi1pdGVtczogc3RyZXRjaDtcbiAgICBtaW4td2lkdGg6IDA7XG4gICAgZmxleDogMTtcbn1cbi5zZHBwcC1tZW51LWhlYWRlciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGdhcDogMTBweDtcbiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IpO1xuICAgIHBhZGRpbmctYm90dG9tOiA1cHg7XG4gICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHJnYmEoMTI3LCAxMjcsIDEyNywgLjQpO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xufSAgIFxuXG4uc2RwcHAtbWVudS1oZWFkZXIgYnV0dG9uIHtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktaW5wdXQtYmcpO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBib3gtc2hhZG93OiBub25lO1xufVxuLnNkcHBwLW1lbnUtaGVhZGVyIGJ1dHRvbjpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYm9yZGVyLWNvbG9yKTtcbn1cbi5zZHBwcC1tZW51LWhlYWRlciBidXR0b24uYWN0aXZlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wcmltYXJ5LWJnKTtcbn1cbi5zZHBwcC1tZW51LWhlYWRlciBidXR0b24uYWN0aXZlOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wcmltYXJ5LWhvdmVyLWJnKTtcbn1cblxuLnNkcHBwLW1lbnUtY29udGVudCB7XG4gICAgZ2FwOiAxMHB4O1xuICAgIGZsZXg6IDE7XG4gICAgbWluLWhlaWdodDogMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBtaW4td2lkdGg6IDA7XG4gICAgb3ZlcmZsb3cteDogaGlkZGVuO1xufVxuXG5cbi5zZHBwcC1jbG9zZS1idXR0b24ge1xuICAgIGhlaWdodDogMzBweDtcbiAgICB3aWR0aDogMzBweDtcbiAgICB0b3A6IDEwcHg7XG4gICAgcmlnaHQ6IDEwcHg7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi5zZXR0aW5ncy1jb250YWluZXIge1xuICAgIHBhZGRpbmc6IDEwcHg7XG4gICAgY29sb3I6IHdoaXRlO1xufVxuXG4uc2V0dGluZ3Mtc2VjdGlvbiB7XG4gICAgZGlzcGxheTogZ3JpZDtcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7XG4gICAgZ2FwOiAxMHB4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgbWFyZ2luLWJvdHRvbTogMTVweDtcbn1cblxuLnNldHRpbmdzLXNlY3Rpb24gbGFiZWwge1xuICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgcGFkZGluZy1yaWdodDogMTBweDtcbn1cblxuLnNldHRpbmdzLXNlY3Rpb24gaW5wdXRbdHlwZT1cIm51bWJlclwiXSB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgcGFkZGluZzogNXB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjNjY2O1xuICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LWlucHV0LWJnKTtcbiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IpO1xufVxuXG4uc2V0dGluZ3Mtc2VjdGlvbiAuZG93bmxvYWQtYnV0dG9uIHtcbiAgICB3aWR0aDogYXV0bztcbiAgICBwYWRkaW5nOiA1cHggMTBweDtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgIzY2NjtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1pbnB1dC1iZyk7XG4gICAgY29sb3I6IHZhcigtLWZnLWNvbG9yKTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgbWFyZ2luLXJpZ2h0OiA1cHg7XG59XG5cbi5zZXR0aW5ncy1zZWN0aW9uIC5kb3dubG9hZC1idXR0b246bGFzdC1jaGlsZCB7XG4gICAgbWFyZ2luLXJpZ2h0OiAwO1xufVxuXG4uc2V0dGluZ3Mtc2VjdGlvbiBkaXY6aGFzKC5kb3dubG9hZC1idXR0b24pIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcbiAgICBnYXA6IDVweDtcbn1cblxuLnNldHRpbmdzLXNlY3Rpb24gcCB7XG4gICAgZ3JpZC1jb2x1bW46IDEgLyAtMTtcbiAgICBtYXJnaW46IDA7XG59XG5cbi5zZXR0aW5ncy1jb250YWluZXIgaDIge1xuICAgIG1hcmdpbi10b3A6IDA7XG4gICAgbWFyZ2luLWJvdHRvbTogMjBweDtcbn1cblxuLnNldHRpbmdzLWNvbnRyb2wge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZ2FwOiA1cHg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuLnNldHRpbmdzLWNvbnRyb2wgaW5wdXRbdHlwZT1cIm51bWJlclwiXSB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgbWluLXdpZHRoOiA4MHB4O1xufVxuXG4uc2V0dGluZ3MtbGFiZWwge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuLnNkcHBwLW1lbnUtd29ya2Zsb3ctZWRpdC13cmFwIHtcbiAgICBmb250LXNpemU6IDEycHg7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xufVxuXG4uc2RwcHAtbWVudS13b3JrZmxvdy1lZGl0LXdyYXAgcCB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgY29sb3I6IHZhcigtLWRlc2NyaXAtdGV4dClcbn1cblxuLndvcmtmbG93LWVkaXQtY29udGVudCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGdhcDogMTBweDtcbn1cbi53b3JrZmxvdy1lZGl0LWZpZWxkIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgd2lkdGg6IDEwMCU7XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA2MzlweCkge1xuICAgIC53b3JrZmxvdy1lZGl0LWNvbnRlbnQge1xuICAgICAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgb3ZlcmZsb3cteTogaGlkZGVuO1xuICAgICAgICBvdmVyZmxvdy14OiBzY3JvbGw7XG4gICAgfVxuICAgIC53b3JrZmxvdy1lZGl0LWZpZWxkIHtcbiAgICAgICAgbWF4LXdpZHRoOiAzMjBweDtcbiAgICB9XG59XG5cbi53b3JrZmxvdy1lZGl0LWZpZWxkLXRpdGxlIHtcbiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IpO1xuICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICBib3JkZXItbGVmdDogNHB4IHNvbGlkIHJnYmEoMTI3LCAxMjcsIDEyNywgLjQpO1xuICAgIHBhZGRpbmc6IDJweCAycHggMnB4IDVweDtcbiAgICBtYXJnaW46IDNweCAwO1xuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xufVxuXG4ud29ya2Zsb3ctZWRpdC1maWVsZCB7XG4gICAgY29sb3I6IHZhcigtLWZnLWNvbG9yKTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgZmxleC13cmFwOiB3cmFwO1xuICAgIGdhcDogNXB4O1xufVxuXG4uc2RwcHAtc2lkZS1pY29uIHtcbiAgICB3aWR0aDogNjRweDtcbiAgICBoZWlnaHQ6IDY0cHg7XG4gICAgbWFzay1pbWFnZTogdXJsKFwiLi9zZC1wcHAtc3RhdGljL3NkcHBwLWljb24uc3ZnXCIpO1xuICAgIG1hc2stc2l6ZTogMzZweDtcbiAgICBtYXNrLXBvc2l0aW9uOiBjZW50ZXI7XG4gICAgbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjdXJyZW50Q29sb3I7XG59XG4uc2RwcHAtc2lkZS1jb250YWluZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHBhZGRpbmctdG9wOiAzMnB4O1xufVxuLnNkcHBwLXNpZGUtY29udGFpbmVyIC5zZHBwcC1zaWRlLWhlYWRlciB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgZ2FwOiAxMHB4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbn1cbi5zZHBwcC1zaWRlLWNvbnRhaW5lciAuc2RwcHAtc2lkZS1oZWFkZXIgYnV0dG9uIHtcbiAgICB3aWR0aDogMzJweDtcbiAgICBoZWlnaHQ6IDMycHg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yKTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG59XG4uc2RwcHAtcGhvdG9zaG9wLWljb24ge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChcImh0dHBzOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvYS9hZi9BZG9iZV9QaG90b3Nob3BfQ0NfaWNvbi5zdmdcIik7XG59XG4uc2RwcHAtcHJlbWllcmUtaWNvbiB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiaHR0cHM6Ly91cGxvYWQud2lraW1lZGlhLm9yZy93aWtpcGVkaWEvY29tbW9ucy80LzQwL0Fkb2JlX1ByZW1pZXJlX1Byb19DQ19pY29uLnN2Z1wiKTtcbn1cbiIsICIvLyBAdHMtaWdub3JlXG5pbXBvcnQgY3NzVGV4dCBmcm9tIFwiLi4vQ29tZnlQb3B1cC5jc3NcIlxuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFNldHRpbmdzIGZyb20gXCIuL1NldHRpbmdzXCI7XG5pbXBvcnQgeyBXb3JrZmxvd0VkaXRXcmFwIH0gZnJvbSBcIi4vV29ya2Zsb3dFZGl0V2ViXCI7XG5pbXBvcnQgeyBDb25maWdQcm92aWRlciB9IGZyb20gJ2FudGQnO1xuaW1wb3J0IHsgQ2xvc2VPdXRsaW5lZCB9IGZyb20gXCJAYW50LWRlc2lnbi9pY29uc1wiO1xuaW1wb3J0IGkxOG4gZnJvbSBcIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21tb24vaTE4bi5tdHNcIjtcbnZhciBkb2NTdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG5kb2NTdHlsZS5pbm5lckhUTUwgPSBjc3NUZXh0O1xuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChkb2NTdHlsZSk7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIENvbWZ5UG9wdXAoeyBvbkNsb3NlLCB0YWIgfTogeyBvbkNsb3NlOiAoKSA9PiB2b2lkLCB0YWI6IHN0cmluZyB9KSB7XG4gICAgY29uc3QgW190YWIsIHNldFRhYl0gPSB1c2VTdGF0ZSgnMScpO1xuICAgIGNvbnN0IFtzaWRlYmFyV2lkdGgsIHNldFNpZGViYXJXaWR0aF0gPSB1c2VTdGF0ZSgwKTtcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBzZXRUYWIodGFiKTtcbiAgICB9LCBbdGFiXSk7XG4gICAgXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgY29uc3QgJGNhbnZhcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdncmFwaC1jYW52YXMnKTtcbiAgICAgICAgbGV0IGZyYW1lQ291bnQgPSAwO1xuICAgICAgICBsZXQgYW5pbWF0aW9uRnJhbWVJZDogbnVtYmVyO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgdXBkYXRlRGltZW5zaW9ucyA9ICgpID0+IHtcbiAgICAgICAgICAgIGZyYW1lQ291bnQrKztcbiAgICAgICAgICAgIGlmIChmcmFtZUNvdW50ICUgMyA9PT0gMCAmJiAkY2FudmFzKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2lkZUJhciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zaWRlLWJhci1wYW5lbCcpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChzaWRlQmFyICYmIHNpZGVCYXIuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldFNpZGViYXJXaWR0aChzaWRlQmFyLmNsaWVudFdpZHRoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzZXRTaWRlYmFyV2lkdGgoMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYW5pbWF0aW9uRnJhbWVJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh1cGRhdGVEaW1lbnNpb25zKTtcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIGFuaW1hdGlvbkZyYW1lSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodXBkYXRlRGltZW5zaW9ucyk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoYW5pbWF0aW9uRnJhbWVJZCk7XG4gICAgICAgIH07XG4gICAgfSwgW10pO1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPENvbmZpZ1Byb3ZpZGVyXG4gICAgICAgICAgICB0aGVtZT17e1xuICAgICAgICAgICAgICAgIHRva2VuOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbG9yVGV4dDogJ3ZhcigtLWZnLWNvbG9yKScsXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yQmdDb250YWluZXI6ICd2YXIoLS1jb21meS1pbnB1dC1iZyknLFxuICAgICAgICAgICAgICAgICAgICBjb2xvckJnRWxldmF0ZWQ6ICd2YXIoLS1jb21meS1pbnB1dC1iZyknLFxuICAgICAgICAgICAgICAgICAgICBjb2xvckZpbGxTZWNvbmRhcnk6ICd2YXIoLS1jb21meS1pbnB1dC1iZyknLFxuICAgICAgICAgICAgICAgICAgICBjb250cm9sSXRlbUJnSG92ZXI6ICd2YXIoLS1jb21meS1pbnB1dC1iZyknLFxuICAgICAgICAgICAgICAgICAgICBjb2xvckJnVGV4dEhvdmVyOiAndmFyKC0tY29tZnktaW5wdXQtYmcpJyxcbiAgICAgICAgICAgICAgICAgICAgY29sb3JCb3JkZXI6ICd2YXIoLS1wLWlucHV0dGV4dC1ib3JkZXItY29sb3IpJyxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNkcHBwLW1lbnUtY29udGFpbmVyXCIgc3R5bGU9e3sgXG4gICAgICAgICAgICAgICAgcGFkZGluZ0xlZnQ6IHNpZGViYXJXaWR0aFxuICAgICAgICAgICAgfX0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzZHBwcC1tZW51LWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNkcHBwLW1lbnUtaGVhZGVyLWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gb25DbGljaz17KCkgPT4gc2V0VGFiKCcxJyl9IGNsYXNzTmFtZT17X3RhYiA9PT0gJzEnID8gJ2FjdGl2ZScgOiAnJ30+e2kxOG4oXCJTaW1wbGlmeSBXb3JrZmxvd1wiKX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gb25DbGljaz17KCkgPT4gc2V0VGFiKCcyJyl9IGNsYXNzTmFtZT17X3RhYiA9PT0gJzInID8gJ2FjdGl2ZScgOiAnJ30+e2kxOG4oXCJQaG90b3Nob3BcIil9PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5Qb3dlcmVkIGJ5IFNEUFBQPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT1cInNkcHBwLW1lbnUtY2xvc2UtYnV0dG9uXCIgb25DbGljaz17b25DbG9zZX0+PENsb3NlT3V0bGluZWQgLz48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNkcHBwLW1lbnUtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNkcHBwLW1lbnUtd29ya2Zsb3ctZWRpdC13cmFwXCIgc3R5bGU9e3sgZGlzcGxheTogX3RhYiA9PT0gJzEnID8gJ2Jsb2NrJyA6ICdub25lJyB9fT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxXb3JrZmxvd0VkaXRXcmFwIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNkcHBwLW1lbnUtc2V0dGluZ3Mtd3JhcFwiIHN0eWxlPXt7IGRpc3BsYXk6IF90YWIgPT09ICcyJyA/ICdibG9jaycgOiAnbm9uZScgfX0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8U2V0dGluZ3MgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9Db25maWdQcm92aWRlcj5cbiAgICApO1xufSIsICJpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHBhZ2VTdG9yZSB9IGZyb20gXCIuLi8uLi8uLi9waG90b3Nob3BNb2RlbHMubXRzXCI7XG5pbXBvcnQgaTE4biBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbW1vbi9pMThuLm10c1wiO1xuaW1wb3J0IHsgYXBpIH0gZnJvbSBcIi4uLy4uL2NvbWZ5LWdsb2JhbHMubXRzXCI7XG5pbXBvcnQgeyBDaGVja2JveCB9IGZyb20gXCJhbnRkXCI7XG5cbmNvbnN0IFNldHRpbmdzOiBSZWFjdC5GQyA9ICgpID0+IHtcbiAgICBjb25zdCBbdXNlU2xpZGVyRm9yTnVtYmVyV2lkZ2V0LCBzZXRVc2VTbGlkZXJGb3JOdW1iZXJXaWRnZXRdID0gdXNlU3RhdGUocGFnZVN0b3JlLmRhdGEudXNlU2xpZGVyRm9yTnVtYmVyV2lkZ2V0KTtcbiAgICBjb25zdCBoYW5kbGVEb3dubG9hZFBsdWdpbiA9ICgpID0+IHtcbiAgICAgICAgbG9jYXRpb24uaHJlZiA9IFwiL3NkLXBwcC1zdGF0aWMvc2QtcHBwX1BTLmNjeD9fPVwiICsgRGF0ZS5ub3coKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzZXR0aW5ncy1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxoMj57aTE4bihcIlNEUFBQIFNldHRpbmdzL01pc2NcIil9PC9oMj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzZXR0aW5ncy1zZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzZXR0aW5ncy1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e2kxOG4oXCJDb21meSBVUkwgKFlvdSBjYW4gY29weSBpdCB0byBjb25uZWN0IENvbWZ5VUkgaW4gdGhlIHBsdWdpbik6XCIpfTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzZXR0aW5ncy1jb250cm9sXCI+XG4gICAgICAgICAgICAgICAgICAgIHtsb2NhdGlvbi5ocmVmLnNwbGl0KFwiP1wiKVswXS5zcGxpdChcIiNcIilbMF19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzZXR0aW5ncy1zZWN0aW9uIHNldHRpbmdzLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic2V0dGluZ3MtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPntpMThuKFwiUGhvdG9zaG9wIHBsdWdpblwiKX08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic2V0dGluZ3MtY29udHJvbFwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG9uQ2xpY2s9e2hhbmRsZURvd25sb2FkUGx1Z2lufSBjbGFzc05hbWU9XCJkb3dubG9hZC1idXR0b25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtpMThuKFwiRG93bmxvYWRcIil9XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic2V0dGluZ3Mtc2VjdGlvbiBzZXR0aW5ncy1yb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNldHRpbmdzLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBodG1sRm9yPVwibWF4SW1hZ2VTaXplXCI+e2kxOG4oXCJ1c2Ugc2xpZGVyIGZvciBudW1iZXIgd2lkZ2V0OlwiKX08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic2V0dGluZ3MtY29udHJvbFwiPlxuICAgICAgICAgICAgICAgICAgICA8Q2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwidXNlU2xpZGVyRm9yTnVtYmVyV2lkZ2V0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e3VzZVNsaWRlckZvck51bWJlcldpZGdldH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRVc2VTbGlkZXJGb3JOdW1iZXJXaWRnZXQoZXZlbnQudGFyZ2V0LmNoZWNrZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VTdG9yZS5zZXRVc2VTbGlkZXJGb3JOdW1iZXJXaWRnZXQoZXZlbnQudGFyZ2V0LmNoZWNrZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaS5zdG9yZVNldHRpbmcoJ3NkcHBwLnVzZVNsaWRlckZvck51bWJlcldpZGdldCcsIGV2ZW50LnRhcmdldC5jaGVja2VkKVxuICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgU2V0dGluZ3M7IiwgImZ1bmN0aW9uIF9leHRlbmRzKCkge1xuICByZXR1cm4gX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAobikge1xuICAgIGZvciAodmFyIGUgPSAxOyBlIDwgYXJndW1lbnRzLmxlbmd0aDsgZSsrKSB7XG4gICAgICB2YXIgdCA9IGFyZ3VtZW50c1tlXTtcbiAgICAgIGZvciAodmFyIHIgaW4gdCkgKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIHIpICYmIChuW3JdID0gdFtyXSk7XG4gICAgfVxuICAgIHJldHVybiBuO1xuICB9LCBfZXh0ZW5kcy5hcHBseShudWxsLCBhcmd1bWVudHMpO1xufVxuZXhwb3J0IHsgX2V4dGVuZHMgYXMgZGVmYXVsdCB9OyIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0b0FycmF5IGZyb20gXCJyYy11dGlsL2VzL0NoaWxkcmVuL3RvQXJyYXlcIjtcbmltcG9ydCB7IHdhcm5pbmcgfSBmcm9tIFwicmMtdXRpbC9lcy93YXJuaW5nXCI7XG5pbXBvcnQgU2luZ2xlT2JzZXJ2ZXIgZnJvbSBcIi4vU2luZ2xlT2JzZXJ2ZXJcIjtcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tIFwiLi9Db2xsZWN0aW9uXCI7XG52YXIgSU5URVJOQUxfUFJFRklYX0tFWSA9ICdyYy1vYnNlcnZlci1rZXknO1xuaW1wb3J0IHsgX3JzIH0gZnJvbSBcIi4vdXRpbHMvb2JzZXJ2ZXJVdGlsXCI7XG5leHBvcnQgeyAvKiogQHByaXZhdGUgVGVzdCBvbmx5IGZvciBtb2NrIHRyaWdnZXIgcmVzaXplIGV2ZW50ICovXG5fcnMgfTtcbmZ1bmN0aW9uIFJlc2l6ZU9ic2VydmVyKHByb3BzLCByZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW47XG4gIHZhciBjaGlsZE5vZGVzID0gdHlwZW9mIGNoaWxkcmVuID09PSAnZnVuY3Rpb24nID8gW2NoaWxkcmVuXSA6IHRvQXJyYXkoY2hpbGRyZW4pO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmIChjaGlsZE5vZGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHdhcm5pbmcoZmFsc2UsICdGaW5kIG1vcmUgdGhhbiBvbmUgY2hpbGQgbm9kZSB3aXRoIGBjaGlsZHJlbmAgaW4gUmVzaXplT2JzZXJ2ZXIuIFBsZWFzZSB1c2UgUmVzaXplT2JzZXJ2ZXIuQ29sbGVjdGlvbiBpbnN0ZWFkLicpO1xuICAgIH0gZWxzZSBpZiAoY2hpbGROb2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHdhcm5pbmcoZmFsc2UsICdgY2hpbGRyZW5gIG9mIFJlc2l6ZU9ic2VydmVyIGlzIGVtcHR5LiBOb3RoaW5nIGlzIGluIG9ic2VydmUuJyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBjaGlsZE5vZGVzLm1hcChmdW5jdGlvbiAoY2hpbGQsIGluZGV4KSB7XG4gICAgdmFyIGtleSA9IChjaGlsZCA9PT0gbnVsbCB8fCBjaGlsZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2hpbGQua2V5KSB8fCBcIlwiLmNvbmNhdChJTlRFUk5BTF9QUkVGSVhfS0VZLCBcIi1cIikuY29uY2F0KGluZGV4KTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU2luZ2xlT2JzZXJ2ZXIsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgICAga2V5OiBrZXksXG4gICAgICByZWY6IGluZGV4ID09PSAwID8gcmVmIDogdW5kZWZpbmVkXG4gICAgfSksIGNoaWxkKTtcbiAgfSk7XG59XG52YXIgUmVmUmVzaXplT2JzZXJ2ZXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihSZXNpemVPYnNlcnZlcik7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBSZWZSZXNpemVPYnNlcnZlci5kaXNwbGF5TmFtZSA9ICdSZXNpemVPYnNlcnZlcic7XG59XG5SZWZSZXNpemVPYnNlcnZlci5Db2xsZWN0aW9uID0gQ29sbGVjdGlvbjtcbmV4cG9ydCBkZWZhdWx0IFJlZlJlc2l6ZU9ic2VydmVyOyIsICJmdW5jdGlvbiBfdHlwZW9mKG8pIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG8pIHtcbiAgICByZXR1cm4gdHlwZW9mIG87XG4gIH0gOiBmdW5jdGlvbiAobykge1xuICAgIHJldHVybiBvICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG8uY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvO1xuICB9LCBfdHlwZW9mKG8pO1xufVxuZXhwb3J0IHsgX3R5cGVvZiBhcyBkZWZhdWx0IH07IiwgImltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbnZhciBSRUFDVF9FTEVNRU5UX1RZUEVfMTggPSBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50Jyk7XG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFXzE5ID0gU3ltYm9sLmZvcigncmVhY3QudHJhbnNpdGlvbmFsLmVsZW1lbnQnKTtcbnZhciBSRUFDVF9GUkFHTUVOVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZnJhZ21lbnQnKTtcblxuLyoqXG4gKiBDb21wYXRpYmxlIHdpdGggUmVhY3QgMTggb3IgMTkgdG8gY2hlY2sgaWYgbm9kZSBpcyBhIEZyYWdtZW50LlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0ZyYWdtZW50KG9iamVjdCkge1xuICByZXR1cm4gKFxuICAgIC8vIEJhc2Ugb2JqZWN0IHR5cGVcbiAgICBvYmplY3QgJiYgX3R5cGVvZihvYmplY3QpID09PSAnb2JqZWN0JyAmJiAoXG4gICAgLy8gUmVhY3QgRWxlbWVudCB0eXBlXG4gICAgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEVfMTggfHwgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEVfMTkpICYmXG4gICAgLy8gUmVhY3QgRnJhZ21lbnQgdHlwZVxuICAgIG9iamVjdC50eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFXG4gICk7XG59IiwgImltcG9ydCBpc0ZyYWdtZW50IGZyb20gXCIuLi9SZWFjdC9pc0ZyYWdtZW50XCI7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdG9BcnJheShjaGlsZHJlbikge1xuICB2YXIgb3B0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgdmFyIHJldCA9IFtdO1xuICBSZWFjdC5DaGlsZHJlbi5mb3JFYWNoKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICBpZiAoKGNoaWxkID09PSB1bmRlZmluZWQgfHwgY2hpbGQgPT09IG51bGwpICYmICFvcHRpb24ua2VlcEVtcHR5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkKSkge1xuICAgICAgcmV0ID0gcmV0LmNvbmNhdCh0b0FycmF5KGNoaWxkKSk7XG4gICAgfSBlbHNlIGlmIChpc0ZyYWdtZW50KGNoaWxkKSAmJiBjaGlsZC5wcm9wcykge1xuICAgICAgcmV0ID0gcmV0LmNvbmNhdCh0b0FycmF5KGNoaWxkLnByb3BzLmNoaWxkcmVuLCBvcHRpb24pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0LnB1c2goY2hpbGQpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXQ7XG59IiwgIi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbnZhciB3YXJuZWQgPSB7fTtcbnZhciBwcmVXYXJuaW5nRm5zID0gW107XG5cbi8qKlxuICogUHJlIHdhcm5pbmcgZW5hYmxlIHlvdSB0byBwYXJzZSBjb250ZW50IGJlZm9yZSBjb25zb2xlLmVycm9yLlxuICogTW9kaWZ5IHRvIG51bGwgd2lsbCBwcmV2ZW50IHdhcm5pbmcuXG4gKi9cbmV4cG9ydCB2YXIgcHJlTWVzc2FnZSA9IGZ1bmN0aW9uIHByZU1lc3NhZ2UoZm4pIHtcbiAgcHJlV2FybmluZ0Zucy5wdXNoKGZuKTtcbn07XG5cbi8qKlxuICogV2FybmluZyBpZiBjb25kaXRpb24gbm90IG1hdGNoLlxuICogQHBhcmFtIHZhbGlkIENvbmRpdGlvblxuICogQHBhcmFtIG1lc3NhZ2UgV2FybmluZyBtZXNzYWdlXG4gKiBAZXhhbXBsZVxuICogYGBganNcbiAqIHdhcm5pbmcoZmFsc2UsICdzb21lIGVycm9yJyk7IC8vIHByaW50IHNvbWUgZXJyb3JcbiAqIHdhcm5pbmcodHJ1ZSwgJ3NvbWUgZXJyb3InKTsgLy8gcHJpbnQgbm90aGluZ1xuICogd2FybmluZygxID09PSAyLCAnc29tZSBlcnJvcicpOyAvLyBwcmludCBzb21lIGVycm9yXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdhcm5pbmcodmFsaWQsIG1lc3NhZ2UpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIXZhbGlkICYmIGNvbnNvbGUgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBmaW5hbE1lc3NhZ2UgPSBwcmVXYXJuaW5nRm5zLnJlZHVjZShmdW5jdGlvbiAobXNnLCBwcmVNZXNzYWdlRm4pIHtcbiAgICAgIHJldHVybiBwcmVNZXNzYWdlRm4obXNnICE9PSBudWxsICYmIG1zZyAhPT0gdm9pZCAwID8gbXNnIDogJycsICd3YXJuaW5nJyk7XG4gICAgfSwgbWVzc2FnZSk7XG4gICAgaWYgKGZpbmFsTWVzc2FnZSkge1xuICAgICAgY29uc29sZS5lcnJvcihcIldhcm5pbmc6IFwiLmNvbmNhdChmaW5hbE1lc3NhZ2UpKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIEBzZWUgU2ltaWxhciB0byB7QGxpbmsgd2FybmluZ30gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3RlKHZhbGlkLCBtZXNzYWdlKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICF2YWxpZCAmJiBjb25zb2xlICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgZmluYWxNZXNzYWdlID0gcHJlV2FybmluZ0Zucy5yZWR1Y2UoZnVuY3Rpb24gKG1zZywgcHJlTWVzc2FnZUZuKSB7XG4gICAgICByZXR1cm4gcHJlTWVzc2FnZUZuKG1zZyAhPT0gbnVsbCAmJiBtc2cgIT09IHZvaWQgMCA/IG1zZyA6ICcnLCAnbm90ZScpO1xuICAgIH0sIG1lc3NhZ2UpO1xuICAgIGlmIChmaW5hbE1lc3NhZ2UpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIk5vdGU6IFwiLmNvbmNhdChmaW5hbE1lc3NhZ2UpKTtcbiAgICB9XG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiByZXNldFdhcm5lZCgpIHtcbiAgd2FybmVkID0ge307XG59XG5leHBvcnQgZnVuY3Rpb24gY2FsbChtZXRob2QsIHZhbGlkLCBtZXNzYWdlKSB7XG4gIGlmICghdmFsaWQgJiYgIXdhcm5lZFttZXNzYWdlXSkge1xuICAgIG1ldGhvZChmYWxzZSwgbWVzc2FnZSk7XG4gICAgd2FybmVkW21lc3NhZ2VdID0gdHJ1ZTtcbiAgfVxufVxuXG4vKiogQHNlZSBTYW1lIGFzIHtAbGluayB3YXJuaW5nfSwgYnV0IG9ubHkgd2FybiBvbmNlIGZvciB0aGUgc2FtZSBtZXNzYWdlICovXG5leHBvcnQgZnVuY3Rpb24gd2FybmluZ09uY2UodmFsaWQsIG1lc3NhZ2UpIHtcbiAgY2FsbCh3YXJuaW5nLCB2YWxpZCwgbWVzc2FnZSk7XG59XG5cbi8qKiBAc2VlIFNhbWUgYXMge0BsaW5rIHdhcm5pbmd9LCBidXQgb25seSB3YXJuIG9uY2UgZm9yIHRoZSBzYW1lIG1lc3NhZ2UgKi9cbmV4cG9ydCBmdW5jdGlvbiBub3RlT25jZSh2YWxpZCwgbWVzc2FnZSkge1xuICBjYWxsKG5vdGUsIHZhbGlkLCBtZXNzYWdlKTtcbn1cbndhcm5pbmdPbmNlLnByZU1lc3NhZ2UgPSBwcmVNZXNzYWdlO1xud2FybmluZ09uY2UucmVzZXRXYXJuZWQgPSByZXNldFdhcm5lZDtcbndhcm5pbmdPbmNlLm5vdGVPbmNlID0gbm90ZU9uY2U7XG5leHBvcnQgZGVmYXVsdCB3YXJuaW5nT25jZTsiLCAiaW1wb3J0IF90eXBlb2YgZnJvbSBcIi4vdHlwZW9mLmpzXCI7XG5mdW5jdGlvbiB0b1ByaW1pdGl2ZSh0LCByKSB7XG4gIGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YodCkgfHwgIXQpIHJldHVybiB0O1xuICB2YXIgZSA9IHRbU3ltYm9sLnRvUHJpbWl0aXZlXTtcbiAgaWYgKHZvaWQgMCAhPT0gZSkge1xuICAgIHZhciBpID0gZS5jYWxsKHQsIHIgfHwgXCJkZWZhdWx0XCIpO1xuICAgIGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YoaSkpIHJldHVybiBpO1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTtcbiAgfVxuICByZXR1cm4gKFwic3RyaW5nXCIgPT09IHIgPyBTdHJpbmcgOiBOdW1iZXIpKHQpO1xufVxuZXhwb3J0IHsgdG9QcmltaXRpdmUgYXMgZGVmYXVsdCB9OyIsICJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiLi90eXBlb2YuanNcIjtcbmltcG9ydCB0b1ByaW1pdGl2ZSBmcm9tIFwiLi90b1ByaW1pdGl2ZS5qc1wiO1xuZnVuY3Rpb24gdG9Qcm9wZXJ0eUtleSh0KSB7XG4gIHZhciBpID0gdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7XG4gIHJldHVybiBcInN5bWJvbFwiID09IF90eXBlb2YoaSkgPyBpIDogaSArIFwiXCI7XG59XG5leHBvcnQgeyB0b1Byb3BlcnR5S2V5IGFzIGRlZmF1bHQgfTsiLCAiaW1wb3J0IHRvUHJvcGVydHlLZXkgZnJvbSBcIi4vdG9Qcm9wZXJ0eUtleS5qc1wiO1xuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KGUsIHIsIHQpIHtcbiAgcmV0dXJuIChyID0gdG9Qcm9wZXJ0eUtleShyKSkgaW4gZSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCByLCB7XG4gICAgdmFsdWU6IHQsXG4gICAgZW51bWVyYWJsZTogITAsXG4gICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICB3cml0YWJsZTogITBcbiAgfSkgOiBlW3JdID0gdCwgZTtcbn1cbmV4cG9ydCB7IF9kZWZpbmVQcm9wZXJ0eSBhcyBkZWZhdWx0IH07IiwgImltcG9ydCBkZWZpbmVQcm9wZXJ0eSBmcm9tIFwiLi9kZWZpbmVQcm9wZXJ0eS5qc1wiO1xuZnVuY3Rpb24gb3duS2V5cyhlLCByKSB7XG4gIHZhciB0ID0gT2JqZWN0LmtleXMoZSk7XG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIG8gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO1xuICAgIHIgJiYgKG8gPSBvLmZpbHRlcihmdW5jdGlvbiAocikge1xuICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgcikuZW51bWVyYWJsZTtcbiAgICB9KSksIHQucHVzaC5hcHBseSh0LCBvKTtcbiAgfVxuICByZXR1cm4gdDtcbn1cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQyKGUpIHtcbiAgZm9yICh2YXIgciA9IDE7IHIgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspIHtcbiAgICB2YXIgdCA9IG51bGwgIT0gYXJndW1lbnRzW3JdID8gYXJndW1lbnRzW3JdIDoge307XG4gICAgciAlIDIgPyBvd25LZXlzKE9iamVjdCh0KSwgITApLmZvckVhY2goZnVuY3Rpb24gKHIpIHtcbiAgICAgIGRlZmluZVByb3BlcnR5KGUsIHIsIHRbcl0pO1xuICAgIH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSkgOiBvd25LZXlzKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbiAocikge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgcikpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBlO1xufVxuZXhwb3J0IHsgX29iamVjdFNwcmVhZDIgYXMgZGVmYXVsdCB9OyIsICJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5leHBvcnQgZnVuY3Rpb24gaXNET00obm9kZSkge1xuICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudFxuICAvLyBTaW5jZSBYVUxFbGVtZW50IGlzIGFsc28gc3ViY2xhc3Mgb2YgRWxlbWVudCwgd2Ugb25seSBuZWVkIEhUTUxFbGVtZW50IGFuZCBTVkdFbGVtZW50XG4gIHJldHVybiBub2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQ7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIGEgRE9NIG5vZGUgdmlhIGEgcmVmLCBhbmQgZG9lcyBub3QgaW52b2tlIGBmaW5kRE9NTm9kZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRET00obm9kZSkge1xuICBpZiAobm9kZSAmJiBfdHlwZW9mKG5vZGUpID09PSAnb2JqZWN0JyAmJiBpc0RPTShub2RlLm5hdGl2ZUVsZW1lbnQpKSB7XG4gICAgcmV0dXJuIG5vZGUubmF0aXZlRWxlbWVudDtcbiAgfVxuICBpZiAoaXNET00obm9kZSkpIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBSZXR1cm4gaWYgYSBub2RlIGlzIGEgRE9NIG5vZGUuIEVsc2Ugd2lsbCByZXR1cm4gYnkgYGZpbmRET01Ob2RlYFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBmaW5kRE9NTm9kZShub2RlKSB7XG4gIHZhciBkb21Ob2RlID0gZ2V0RE9NKG5vZGUpO1xuICBpZiAoZG9tTm9kZSkge1xuICAgIHJldHVybiBkb21Ob2RlO1xuICB9XG4gIGlmIChub2RlIGluc3RhbmNlb2YgUmVhY3QuQ29tcG9uZW50KSB7XG4gICAgdmFyIF9SZWFjdERPTSRmaW5kRE9NTm9kZTtcbiAgICByZXR1cm4gKF9SZWFjdERPTSRmaW5kRE9NTm9kZSA9IFJlYWN0RE9NLmZpbmRET01Ob2RlKSA9PT0gbnVsbCB8fCBfUmVhY3RET00kZmluZERPTU5vZGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9SZWFjdERPTSRmaW5kRE9NTm9kZS5jYWxsKFJlYWN0RE9NLCBub2RlKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn0iLCAiaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IHsgaXNWYWxpZEVsZW1lbnQsIHZlcnNpb24gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBGb3J3YXJkUmVmLCBpc01lbW8gfSBmcm9tICdyZWFjdC1pcyc7XG5pbXBvcnQgdXNlTWVtbyBmcm9tIFwiLi9ob29rcy91c2VNZW1vXCI7XG5pbXBvcnQgaXNGcmFnbWVudCBmcm9tIFwiLi9SZWFjdC9pc0ZyYWdtZW50XCI7XG52YXIgUmVhY3RNYWpvclZlcnNpb24gPSBOdW1iZXIodmVyc2lvbi5zcGxpdCgnLicpWzBdKTtcbmV4cG9ydCB2YXIgZmlsbFJlZiA9IGZ1bmN0aW9uIGZpbGxSZWYocmVmLCBub2RlKSB7XG4gIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmVmKG5vZGUpO1xuICB9IGVsc2UgaWYgKF90eXBlb2YocmVmKSA9PT0gJ29iamVjdCcgJiYgcmVmICYmICdjdXJyZW50JyBpbiByZWYpIHtcbiAgICByZWYuY3VycmVudCA9IG5vZGU7XG4gIH1cbn07XG5cbi8qKlxuICogTWVyZ2UgcmVmcyBpbnRvIG9uZSByZWYgZnVuY3Rpb24gdG8gc3VwcG9ydCByZWYgcGFzc2luZy5cbiAqL1xuZXhwb3J0IHZhciBjb21wb3NlUmVmID0gZnVuY3Rpb24gY29tcG9zZVJlZigpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHJlZnMgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgcmVmc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuICB2YXIgcmVmTGlzdCA9IHJlZnMuZmlsdGVyKEJvb2xlYW4pO1xuICBpZiAocmVmTGlzdC5sZW5ndGggPD0gMSkge1xuICAgIHJldHVybiByZWZMaXN0WzBdO1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiAobm9kZSkge1xuICAgIHJlZnMuZm9yRWFjaChmdW5jdGlvbiAocmVmKSB7XG4gICAgICBmaWxsUmVmKHJlZiwgbm9kZSk7XG4gICAgfSk7XG4gIH07XG59O1xuZXhwb3J0IHZhciB1c2VDb21wb3NlUmVmID0gZnVuY3Rpb24gdXNlQ29tcG9zZVJlZigpIHtcbiAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCByZWZzID0gbmV3IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgcmVmc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICB9XG4gIHJldHVybiB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gY29tcG9zZVJlZi5hcHBseSh2b2lkIDAsIHJlZnMpO1xuICB9LCByZWZzLCBmdW5jdGlvbiAocHJldiwgbmV4dCkge1xuICAgIHJldHVybiBwcmV2Lmxlbmd0aCAhPT0gbmV4dC5sZW5ndGggfHwgcHJldi5ldmVyeShmdW5jdGlvbiAocmVmLCBpKSB7XG4gICAgICByZXR1cm4gcmVmICE9PSBuZXh0W2ldO1xuICAgIH0pO1xuICB9KTtcbn07XG5leHBvcnQgdmFyIHN1cHBvcnRSZWYgPSBmdW5jdGlvbiBzdXBwb3J0UmVmKG5vZGVPckNvbXBvbmVudCkge1xuICB2YXIgX3R5cGUkcHJvdG90eXBlLCBfbm9kZU9yQ29tcG9uZW50JHByb3Q7XG4gIGlmICghbm9kZU9yQ29tcG9uZW50KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gUmVhY3QgMTkgbm8gbmVlZCBgZm9yd2FyZFJlZmAgYW55bW9yZS4gU28ganVzdCBwYXNzIGlmIGlzIGEgUmVhY3QgZWxlbWVudC5cbiAgaWYgKGlzUmVhY3RFbGVtZW50KG5vZGVPckNvbXBvbmVudCkgJiYgUmVhY3RNYWpvclZlcnNpb24gPj0gMTkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgdHlwZSA9IGlzTWVtbyhub2RlT3JDb21wb25lbnQpID8gbm9kZU9yQ29tcG9uZW50LnR5cGUudHlwZSA6IG5vZGVPckNvbXBvbmVudC50eXBlO1xuXG4gIC8vIEZ1bmN0aW9uIGNvbXBvbmVudCBub2RlXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyAmJiAhKChfdHlwZSRwcm90b3R5cGUgPSB0eXBlLnByb3RvdHlwZSkgIT09IG51bGwgJiYgX3R5cGUkcHJvdG90eXBlICE9PSB2b2lkIDAgJiYgX3R5cGUkcHJvdG90eXBlLnJlbmRlcikgJiYgdHlwZS4kJHR5cGVvZiAhPT0gRm9yd2FyZFJlZikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIENsYXNzIGNvbXBvbmVudFxuICBpZiAodHlwZW9mIG5vZGVPckNvbXBvbmVudCA9PT0gJ2Z1bmN0aW9uJyAmJiAhKChfbm9kZU9yQ29tcG9uZW50JHByb3QgPSBub2RlT3JDb21wb25lbnQucHJvdG90eXBlKSAhPT0gbnVsbCAmJiBfbm9kZU9yQ29tcG9uZW50JHByb3QgIT09IHZvaWQgMCAmJiBfbm9kZU9yQ29tcG9uZW50JHByb3QucmVuZGVyKSAmJiBub2RlT3JDb21wb25lbnQuJCR0eXBlb2YgIT09IEZvcndhcmRSZWYpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xuZnVuY3Rpb24gaXNSZWFjdEVsZW1lbnQobm9kZSkge1xuICByZXR1cm4gLyojX19QVVJFX18qL2lzVmFsaWRFbGVtZW50KG5vZGUpICYmICFpc0ZyYWdtZW50KG5vZGUpO1xufVxuZXhwb3J0IHZhciBzdXBwb3J0Tm9kZVJlZiA9IGZ1bmN0aW9uIHN1cHBvcnROb2RlUmVmKG5vZGUpIHtcbiAgcmV0dXJuIGlzUmVhY3RFbGVtZW50KG5vZGUpICYmIHN1cHBvcnRSZWYobm9kZSk7XG59O1xuXG4vKipcbiAqIEluIFJlYWN0IDE5LiBgcmVmYCBpcyBub3QgYSBwcm9wZXJ0eSBmcm9tIG5vZGUuXG4gKiBCdXQgYSBwcm9wZXJ0eSBmcm9tIGBwcm9wcy5yZWZgLlxuICogVG8gY2hlY2sgaWYgYHByb3BzLnJlZmAgZXhpc3Qgb3IgZmFsbGJhY2sgdG8gYHJlZmAuXG4gKi9cbmV4cG9ydCB2YXIgZ2V0Tm9kZVJlZiA9IGZ1bmN0aW9uIGdldE5vZGVSZWYobm9kZSkge1xuICBpZiAobm9kZSAmJiBpc1JlYWN0RWxlbWVudChub2RlKSkge1xuICAgIHZhciBlbGUgPSBub2RlO1xuXG4gICAgLy8gU291cmNlIGZyb206XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL211aS9tYXRlcmlhbC11aS9ibG9iL21hc3Rlci9wYWNrYWdlcy9tdWktdXRpbHMvc3JjL2dldFJlYWN0Tm9kZVJlZi9nZXRSZWFjdE5vZGVSZWYudHNcbiAgICByZXR1cm4gZWxlLnByb3BzLnByb3BlcnR5SXNFbnVtZXJhYmxlKCdyZWYnKSA/IGVsZS5wcm9wcy5yZWYgOiBlbGUucmVmO1xuICB9XG4gIHJldHVybiBudWxsO1xufTsiLCAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlTWVtbyhnZXRWYWx1ZSwgY29uZGl0aW9uLCBzaG91bGRVcGRhdGUpIHtcbiAgdmFyIGNhY2hlUmVmID0gUmVhY3QudXNlUmVmKHt9KTtcbiAgaWYgKCEoJ3ZhbHVlJyBpbiBjYWNoZVJlZi5jdXJyZW50KSB8fCBzaG91bGRVcGRhdGUoY2FjaGVSZWYuY3VycmVudC5jb25kaXRpb24sIGNvbmRpdGlvbikpIHtcbiAgICBjYWNoZVJlZi5jdXJyZW50LnZhbHVlID0gZ2V0VmFsdWUoKTtcbiAgICBjYWNoZVJlZi5jdXJyZW50LmNvbmRpdGlvbiA9IGNvbmRpdGlvbjtcbiAgfVxuICByZXR1cm4gY2FjaGVSZWYuY3VycmVudC52YWx1ZTtcbn0iLCAiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCBmaW5kRE9NTm9kZSBmcm9tIFwicmMtdXRpbC9lcy9Eb20vZmluZERPTU5vZGVcIjtcbmltcG9ydCB7IHN1cHBvcnRSZWYsIHVzZUNvbXBvc2VSZWYsIGdldE5vZGVSZWYgfSBmcm9tIFwicmMtdXRpbC9lcy9yZWZcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbGxlY3Rpb25Db250ZXh0IH0gZnJvbSBcIi4uL0NvbGxlY3Rpb25cIjtcbmltcG9ydCB7IG9ic2VydmUsIHVub2JzZXJ2ZSB9IGZyb20gXCIuLi91dGlscy9vYnNlcnZlclV0aWxcIjtcbmltcG9ydCBEb21XcmFwcGVyIGZyb20gXCIuL0RvbVdyYXBwZXJcIjtcbmZ1bmN0aW9uIFNpbmdsZU9ic2VydmVyKHByb3BzLCByZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZDtcbiAgdmFyIGVsZW1lbnRSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHZhciB3cmFwcGVyUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICB2YXIgb25Db2xsZWN0aW9uUmVzaXplID0gUmVhY3QudXNlQ29udGV4dChDb2xsZWN0aW9uQ29udGV4dCk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IENoaWxkcmVuID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgaXNSZW5kZXJQcm9wcyA9IHR5cGVvZiBjaGlsZHJlbiA9PT0gJ2Z1bmN0aW9uJztcbiAgdmFyIG1lcmdlZENoaWxkcmVuID0gaXNSZW5kZXJQcm9wcyA/IGNoaWxkcmVuKGVsZW1lbnRSZWYpIDogY2hpbGRyZW47XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU2l6ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgc2l6ZVJlZiA9IFJlYWN0LnVzZVJlZih7XG4gICAgd2lkdGg6IC0xLFxuICAgIGhlaWdodDogLTEsXG4gICAgb2Zmc2V0V2lkdGg6IC0xLFxuICAgIG9mZnNldEhlaWdodDogLTFcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVmID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgY2FuUmVmID0gIWlzUmVuZGVyUHJvcHMgJiYgLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KG1lcmdlZENoaWxkcmVuKSAmJiBzdXBwb3J0UmVmKG1lcmdlZENoaWxkcmVuKTtcbiAgdmFyIG9yaWdpblJlZiA9IGNhblJlZiA/IGdldE5vZGVSZWYobWVyZ2VkQ2hpbGRyZW4pIDogbnVsbDtcbiAgdmFyIG1lcmdlZFJlZiA9IHVzZUNvbXBvc2VSZWYob3JpZ2luUmVmLCBlbGVtZW50UmVmKTtcbiAgdmFyIGdldERvbSA9IGZ1bmN0aW9uIGdldERvbSgpIHtcbiAgICB2YXIgX2VsZW1lbnRSZWYkY3VycmVudDtcbiAgICByZXR1cm4gZmluZERPTU5vZGUoZWxlbWVudFJlZi5jdXJyZW50KSB8fCAoXG4gICAgLy8gU3VwcG9ydCBgbmF0aXZlRWxlbWVudGAgZm9ybWF0XG4gICAgZWxlbWVudFJlZi5jdXJyZW50ICYmIF90eXBlb2YoZWxlbWVudFJlZi5jdXJyZW50KSA9PT0gJ29iamVjdCcgPyBmaW5kRE9NTm9kZSgoX2VsZW1lbnRSZWYkY3VycmVudCA9IGVsZW1lbnRSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2VsZW1lbnRSZWYkY3VycmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2VsZW1lbnRSZWYkY3VycmVudC5uYXRpdmVFbGVtZW50KSA6IG51bGwpIHx8IGZpbmRET01Ob2RlKHdyYXBwZXJSZWYuY3VycmVudCk7XG4gIH07XG4gIFJlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGdldERvbSgpO1xuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gT2JzZXJ2ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBwcm9wc1JlZiA9IFJlYWN0LnVzZVJlZihwcm9wcyk7XG4gIHByb3BzUmVmLmN1cnJlbnQgPSBwcm9wcztcblxuICAvLyBIYW5kbGVyXG4gIHZhciBvbkludGVybmFsUmVzaXplID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIHZhciBfcHJvcHNSZWYkY3VycmVudCA9IHByb3BzUmVmLmN1cnJlbnQsXG4gICAgICBvblJlc2l6ZSA9IF9wcm9wc1JlZiRjdXJyZW50Lm9uUmVzaXplLFxuICAgICAgZGF0YSA9IF9wcm9wc1JlZiRjdXJyZW50LmRhdGE7XG4gICAgdmFyIF90YXJnZXQkZ2V0Qm91bmRpbmdDbCA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgIHdpZHRoID0gX3RhcmdldCRnZXRCb3VuZGluZ0NsLndpZHRoLFxuICAgICAgaGVpZ2h0ID0gX3RhcmdldCRnZXRCb3VuZGluZ0NsLmhlaWdodDtcbiAgICB2YXIgb2Zmc2V0V2lkdGggPSB0YXJnZXQub2Zmc2V0V2lkdGgsXG4gICAgICBvZmZzZXRIZWlnaHQgPSB0YXJnZXQub2Zmc2V0SGVpZ2h0O1xuXG4gICAgLyoqXG4gICAgICogUmVzaXplIG9ic2VydmVyIHRyaWdnZXIgd2hlbiBjb250ZW50IHNpemUgY2hhbmdlZC5cbiAgICAgKiBJbiBtb3N0IGNhc2Ugd2UganVzdCBjYXJlIGFib3V0IGVsZW1lbnQgc2l6ZSxcbiAgICAgKiBsZXQncyB1c2UgYGJvdW5kYXJ5YCBpbnN0ZWFkIG9mIGBjb250ZW50UmVjdGAgaGVyZSB0byBhdm9pZCBzaGFraW5nLlxuICAgICAqL1xuICAgIHZhciBmaXhlZFdpZHRoID0gTWF0aC5mbG9vcih3aWR0aCk7XG4gICAgdmFyIGZpeGVkSGVpZ2h0ID0gTWF0aC5mbG9vcihoZWlnaHQpO1xuICAgIGlmIChzaXplUmVmLmN1cnJlbnQud2lkdGggIT09IGZpeGVkV2lkdGggfHwgc2l6ZVJlZi5jdXJyZW50LmhlaWdodCAhPT0gZml4ZWRIZWlnaHQgfHwgc2l6ZVJlZi5jdXJyZW50Lm9mZnNldFdpZHRoICE9PSBvZmZzZXRXaWR0aCB8fCBzaXplUmVmLmN1cnJlbnQub2Zmc2V0SGVpZ2h0ICE9PSBvZmZzZXRIZWlnaHQpIHtcbiAgICAgIHZhciBzaXplID0ge1xuICAgICAgICB3aWR0aDogZml4ZWRXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiBmaXhlZEhlaWdodCxcbiAgICAgICAgb2Zmc2V0V2lkdGg6IG9mZnNldFdpZHRoLFxuICAgICAgICBvZmZzZXRIZWlnaHQ6IG9mZnNldEhlaWdodFxuICAgICAgfTtcbiAgICAgIHNpemVSZWYuY3VycmVudCA9IHNpemU7XG5cbiAgICAgIC8vIElFIGlzIHN0cmFuZ2UsIHJpZ2h0P1xuICAgICAgdmFyIG1lcmdlZE9mZnNldFdpZHRoID0gb2Zmc2V0V2lkdGggPT09IE1hdGgucm91bmQod2lkdGgpID8gd2lkdGggOiBvZmZzZXRXaWR0aDtcbiAgICAgIHZhciBtZXJnZWRPZmZzZXRIZWlnaHQgPSBvZmZzZXRIZWlnaHQgPT09IE1hdGgucm91bmQoaGVpZ2h0KSA/IGhlaWdodCA6IG9mZnNldEhlaWdodDtcbiAgICAgIHZhciBzaXplSW5mbyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc2l6ZSksIHt9LCB7XG4gICAgICAgIG9mZnNldFdpZHRoOiBtZXJnZWRPZmZzZXRXaWR0aCxcbiAgICAgICAgb2Zmc2V0SGVpZ2h0OiBtZXJnZWRPZmZzZXRIZWlnaHRcbiAgICAgIH0pO1xuXG4gICAgICAvLyBMZXQgY29sbGVjdGlvbiBrbm93IHdoYXQgaGFwcGVuZWRcbiAgICAgIG9uQ29sbGVjdGlvblJlc2l6ZSA9PT0gbnVsbCB8fCBvbkNvbGxlY3Rpb25SZXNpemUgPT09IHZvaWQgMCB8fCBvbkNvbGxlY3Rpb25SZXNpemUoc2l6ZUluZm8sIHRhcmdldCwgZGF0YSk7XG4gICAgICBpZiAob25SZXNpemUpIHtcbiAgICAgICAgLy8gZGVmZXIgdGhlIGNhbGxiYWNrIGJ1dCBub3QgZGVmZXIgdG8gbmV4dCBmcmFtZVxuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBvblJlc2l6ZShzaXplSW5mbywgdGFyZ2V0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LCBbXSk7XG5cbiAgLy8gRHluYW1pYyBvYnNlcnZlXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGN1cnJlbnRFbGVtZW50ID0gZ2V0RG9tKCk7XG4gICAgaWYgKGN1cnJlbnRFbGVtZW50ICYmICFkaXNhYmxlZCkge1xuICAgICAgb2JzZXJ2ZShjdXJyZW50RWxlbWVudCwgb25JbnRlcm5hbFJlc2l6ZSk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdW5vYnNlcnZlKGN1cnJlbnRFbGVtZW50LCBvbkludGVybmFsUmVzaXplKTtcbiAgICB9O1xuICB9LCBbZWxlbWVudFJlZi5jdXJyZW50LCBkaXNhYmxlZF0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERvbVdyYXBwZXIsIHtcbiAgICByZWY6IHdyYXBwZXJSZWZcbiAgfSwgY2FuUmVmID8gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChtZXJnZWRDaGlsZHJlbiwge1xuICAgIHJlZjogbWVyZ2VkUmVmXG4gIH0pIDogbWVyZ2VkQ2hpbGRyZW4pO1xufVxudmFyIFJlZlNpbmdsZU9ic2VydmVyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoU2luZ2xlT2JzZXJ2ZXIpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgUmVmU2luZ2xlT2JzZXJ2ZXIuZGlzcGxheU5hbWUgPSAnU2luZ2xlT2JzZXJ2ZXInO1xufVxuZXhwb3J0IGRlZmF1bHQgUmVmU2luZ2xlT2JzZXJ2ZXI7IiwgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCB2YXIgQ29sbGVjdGlvbkNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbi8qKlxuICogQ29sbGVjdCBhbGwgdGhlIHJlc2l6ZSBldmVudCBmcm9tIGNoaWxkcmVuIFJlc2l6ZU9ic2VydmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2xsZWN0aW9uKF9yZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICBvbkJhdGNoUmVzaXplID0gX3JlZi5vbkJhdGNoUmVzaXplO1xuICB2YXIgcmVzaXplSWRSZWYgPSBSZWFjdC51c2VSZWYoMCk7XG4gIHZhciByZXNpemVJbmZvc1JlZiA9IFJlYWN0LnVzZVJlZihbXSk7XG4gIHZhciBvbkNvbGxlY3Rpb25SZXNpemUgPSBSZWFjdC51c2VDb250ZXh0KENvbGxlY3Rpb25Db250ZXh0KTtcbiAgdmFyIG9uUmVzaXplID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKHNpemUsIGVsZW1lbnQsIGRhdGEpIHtcbiAgICByZXNpemVJZFJlZi5jdXJyZW50ICs9IDE7XG4gICAgdmFyIGN1cnJlbnRJZCA9IHJlc2l6ZUlkUmVmLmN1cnJlbnQ7XG4gICAgcmVzaXplSW5mb3NSZWYuY3VycmVudC5wdXNoKHtcbiAgICAgIHNpemU6IHNpemUsXG4gICAgICBlbGVtZW50OiBlbGVtZW50LFxuICAgICAgZGF0YTogZGF0YVxuICAgIH0pO1xuICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGN1cnJlbnRJZCA9PT0gcmVzaXplSWRSZWYuY3VycmVudCkge1xuICAgICAgICBvbkJhdGNoUmVzaXplID09PSBudWxsIHx8IG9uQmF0Y2hSZXNpemUgPT09IHZvaWQgMCB8fCBvbkJhdGNoUmVzaXplKHJlc2l6ZUluZm9zUmVmLmN1cnJlbnQpO1xuICAgICAgICByZXNpemVJbmZvc1JlZi5jdXJyZW50ID0gW107XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBDb250aW51ZSBidWJibGluZyBpZiBwYXJlbnQgZXhpc3RcbiAgICBvbkNvbGxlY3Rpb25SZXNpemUgPT09IG51bGwgfHwgb25Db2xsZWN0aW9uUmVzaXplID09PSB2b2lkIDAgfHwgb25Db2xsZWN0aW9uUmVzaXplKHNpemUsIGVsZW1lbnQsIGRhdGEpO1xuICB9LCBbb25CYXRjaFJlc2l6ZSwgb25Db2xsZWN0aW9uUmVzaXplXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb2xsZWN0aW9uQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBvblJlc2l6ZVxuICB9LCBjaGlsZHJlbik7XG59IiwgIi8qKlxyXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2hpbXMgdGhhdCBwcm92aWRlIG1pbmltYWwgZnVuY3Rpb25hbGl0eSBvZiB0aGUgRVM2IGNvbGxlY3Rpb25zLlxyXG4gKlxyXG4gKiBUaGVzZSBpbXBsZW1lbnRhdGlvbnMgYXJlIG5vdCBtZWFudCB0byBiZSB1c2VkIG91dHNpZGUgb2YgdGhlIFJlc2l6ZU9ic2VydmVyXHJcbiAqIG1vZHVsZXMgYXMgdGhleSBjb3ZlciBvbmx5IGEgbGltaXRlZCByYW5nZSBvZiB1c2UgY2FzZXMuXHJcbiAqL1xyXG4vKiBlc2xpbnQtZGlzYWJsZSByZXF1aXJlLWpzZG9jLCB2YWxpZC1qc2RvYyAqL1xyXG52YXIgTWFwU2hpbSA9IChmdW5jdGlvbiAoKSB7XHJcbiAgICBpZiAodHlwZW9mIE1hcCAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICByZXR1cm4gTWFwO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGluZGV4IGluIHByb3ZpZGVkIGFycmF5IHRoYXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIGtleS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5PEFycmF5Pn0gYXJyXHJcbiAgICAgKiBAcGFyYW0geyp9IGtleVxyXG4gICAgICogQHJldHVybnMge251bWJlcn1cclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gZ2V0SW5kZXgoYXJyLCBrZXkpIHtcclxuICAgICAgICB2YXIgcmVzdWx0ID0gLTE7XHJcbiAgICAgICAgYXJyLnNvbWUoZnVuY3Rpb24gKGVudHJ5LCBpbmRleCkge1xyXG4gICAgICAgICAgICBpZiAoZW50cnlbMF0gPT09IGtleSkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gaW5kZXg7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuICAgIHJldHVybiAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgZnVuY3Rpb24gY2xhc3NfMSgpIHtcclxuICAgICAgICAgICAgdGhpcy5fX2VudHJpZXNfXyA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2xhc3NfMS5wcm90b3R5cGUsIFwic2l6ZVwiLCB7XHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX19lbnRyaWVzX18ubGVuZ3RoO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgICAgICB9KTtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcGFyYW0geyp9IGtleVxyXG4gICAgICAgICAqIEByZXR1cm5zIHsqfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNsYXNzXzEucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXkpIHtcclxuICAgICAgICAgICAgdmFyIGluZGV4ID0gZ2V0SW5kZXgodGhpcy5fX2VudHJpZXNfXywga2V5KTtcclxuICAgICAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy5fX2VudHJpZXNfX1tpbmRleF07XHJcbiAgICAgICAgICAgIHJldHVybiBlbnRyeSAmJiBlbnRyeVsxXTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwYXJhbSB7Kn0ga2V5XHJcbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZVxyXG4gICAgICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNsYXNzXzEucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHZhciBpbmRleCA9IGdldEluZGV4KHRoaXMuX19lbnRyaWVzX18sIGtleSk7XHJcbiAgICAgICAgICAgIGlmICh+aW5kZXgpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX19lbnRyaWVzX19baW5kZXhdWzFdID0gdmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9fZW50cmllc19fLnB1c2goW2tleSwgdmFsdWVdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHBhcmFtIHsqfSBrZXlcclxuICAgICAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAgICAgKi9cclxuICAgICAgICBjbGFzc18xLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAoa2V5KSB7XHJcbiAgICAgICAgICAgIHZhciBlbnRyaWVzID0gdGhpcy5fX2VudHJpZXNfXztcclxuICAgICAgICAgICAgdmFyIGluZGV4ID0gZ2V0SW5kZXgoZW50cmllcywga2V5KTtcclxuICAgICAgICAgICAgaWYgKH5pbmRleCkge1xyXG4gICAgICAgICAgICAgICAgZW50cmllcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcGFyYW0geyp9IGtleVxyXG4gICAgICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNsYXNzXzEucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIChrZXkpIHtcclxuICAgICAgICAgICAgcmV0dXJuICEhfmdldEluZGV4KHRoaXMuX19lbnRyaWVzX18sIGtleSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAgICAgKi9cclxuICAgICAgICBjbGFzc18xLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5fX2VudHJpZXNfXy5zcGxpY2UoMCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xyXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW2N0eD1udWxsXVxyXG4gICAgICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNsYXNzXzEucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiAoY2FsbGJhY2ssIGN0eCkge1xyXG4gICAgICAgICAgICBpZiAoY3R4ID09PSB2b2lkIDApIHsgY3R4ID0gbnVsbDsgfVxyXG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gdGhpcy5fX2VudHJpZXNfXzsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBlbnRyeSA9IF9hW19pXTtcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwoY3R4LCBlbnRyeVsxXSwgZW50cnlbMF0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gY2xhc3NfMTtcclxuICAgIH0oKSk7XHJcbn0pKCk7XG5cbi8qKlxyXG4gKiBEZXRlY3RzIHdoZXRoZXIgd2luZG93IGFuZCBkb2N1bWVudCBvYmplY3RzIGFyZSBhdmFpbGFibGUgaW4gY3VycmVudCBlbnZpcm9ubWVudC5cclxuICovXHJcbnZhciBpc0Jyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kb2N1bWVudCA9PT0gZG9jdW1lbnQ7XG5cbi8vIFJldHVybnMgZ2xvYmFsIG9iamVjdCBvZiBhIGN1cnJlbnQgZW52aXJvbm1lbnQuXHJcbnZhciBnbG9iYWwkMSA9IChmdW5jdGlvbiAoKSB7XHJcbiAgICBpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2xvYmFsLk1hdGggPT09IE1hdGgpIHtcclxuICAgICAgICByZXR1cm4gZ2xvYmFsO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJiBzZWxmLk1hdGggPT09IE1hdGgpIHtcclxuICAgICAgICByZXR1cm4gc2VsZjtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuTWF0aCA9PT0gTWF0aCkge1xyXG4gICAgICAgIHJldHVybiB3aW5kb3c7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcclxuICAgIHJldHVybiBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xyXG59KSgpO1xuXG4vKipcclxuICogQSBzaGltIGZvciB0aGUgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIHdoaWNoIGZhbGxzIGJhY2sgdG8gdGhlIHNldFRpbWVvdXQgaWZcclxuICogZmlyc3Qgb25lIGlzIG5vdCBzdXBwb3J0ZWQuXHJcbiAqXHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJlcXVlc3RzJyBpZGVudGlmaWVyLlxyXG4gKi9cclxudmFyIHJlcXVlc3RBbmltYXRpb25GcmFtZSQxID0gKGZ1bmN0aW9uICgpIHtcclxuICAgIGlmICh0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgLy8gSXQncyByZXF1aXJlZCB0byB1c2UgYSBib3VuZGVkIGZ1bmN0aW9uIGJlY2F1c2UgSUUgc29tZXRpbWVzIHRocm93c1xyXG4gICAgICAgIC8vIGFuIFwiSW52YWxpZCBjYWxsaW5nIG9iamVjdFwiIGVycm9yIGlmIHJBRiBpcyBpbnZva2VkIHdpdGhvdXQgdGhlIGdsb2JhbFxyXG4gICAgICAgIC8vIG9iamVjdCBvbiB0aGUgbGVmdCBoYW5kIHNpZGUuXHJcbiAgICAgICAgcmV0dXJuIHJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKGdsb2JhbCQxKTtcclxuICAgIH1cclxuICAgIHJldHVybiBmdW5jdGlvbiAoY2FsbGJhY2spIHsgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXR1cm4gY2FsbGJhY2soRGF0ZS5ub3coKSk7IH0sIDEwMDAgLyA2MCk7IH07XHJcbn0pKCk7XG5cbi8vIERlZmluZXMgbWluaW11bSB0aW1lb3V0IGJlZm9yZSBhZGRpbmcgYSB0cmFpbGluZyBjYWxsLlxyXG52YXIgdHJhaWxpbmdUaW1lb3V0ID0gMjtcclxuLyoqXHJcbiAqIENyZWF0ZXMgYSB3cmFwcGVyIGZ1bmN0aW9uIHdoaWNoIGVuc3VyZXMgdGhhdCBwcm92aWRlZCBjYWxsYmFjayB3aWxsIGJlXHJcbiAqIGludm9rZWQgb25seSBvbmNlIGR1cmluZyB0aGUgc3BlY2lmaWVkIGRlbGF5IHBlcmlvZC5cclxuICpcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBiZSBpbnZva2VkIGFmdGVyIHRoZSBkZWxheSBwZXJpb2QuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBkZWxheSAtIERlbGF5IGFmdGVyIHdoaWNoIHRvIGludm9rZSBjYWxsYmFjay5cclxuICogQHJldHVybnMge0Z1bmN0aW9ufVxyXG4gKi9cclxuZnVuY3Rpb24gdGhyb3R0bGUgKGNhbGxiYWNrLCBkZWxheSkge1xyXG4gICAgdmFyIGxlYWRpbmdDYWxsID0gZmFsc2UsIHRyYWlsaW5nQ2FsbCA9IGZhbHNlLCBsYXN0Q2FsbFRpbWUgPSAwO1xyXG4gICAgLyoqXHJcbiAgICAgKiBJbnZva2VzIHRoZSBvcmlnaW5hbCBjYWxsYmFjayBmdW5jdGlvbiBhbmQgc2NoZWR1bGVzIG5ldyBpbnZvY2F0aW9uIGlmXHJcbiAgICAgKiB0aGUgXCJwcm94eVwiIHdhcyBjYWxsZWQgZHVyaW5nIGN1cnJlbnQgcmVxdWVzdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gcmVzb2x2ZVBlbmRpbmcoKSB7XHJcbiAgICAgICAgaWYgKGxlYWRpbmdDYWxsKSB7XHJcbiAgICAgICAgICAgIGxlYWRpbmdDYWxsID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0cmFpbGluZ0NhbGwpIHtcclxuICAgICAgICAgICAgcHJveHkoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENhbGxiYWNrIGludm9rZWQgYWZ0ZXIgdGhlIHNwZWNpZmllZCBkZWxheS4gSXQgd2lsbCBmdXJ0aGVyIHBvc3Rwb25lXHJcbiAgICAgKiBpbnZvY2F0aW9uIG9mIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiBkZWxlZ2F0aW5nIGl0IHRvIHRoZVxyXG4gICAgICogcmVxdWVzdEFuaW1hdGlvbkZyYW1lLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiB0aW1lb3V0Q2FsbGJhY2soKSB7XHJcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lJDEocmVzb2x2ZVBlbmRpbmcpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTY2hlZHVsZXMgaW52b2NhdGlvbiBvZiB0aGUgb3JpZ2luYWwgZnVuY3Rpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIHByb3h5KCkge1xyXG4gICAgICAgIHZhciB0aW1lU3RhbXAgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgIGlmIChsZWFkaW5nQ2FsbCkge1xyXG4gICAgICAgICAgICAvLyBSZWplY3QgaW1tZWRpYXRlbHkgZm9sbG93aW5nIGNhbGxzLlxyXG4gICAgICAgICAgICBpZiAodGltZVN0YW1wIC0gbGFzdENhbGxUaW1lIDwgdHJhaWxpbmdUaW1lb3V0KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gU2NoZWR1bGUgbmV3IGNhbGwgdG8gYmUgaW4gaW52b2tlZCB3aGVuIHRoZSBwZW5kaW5nIG9uZSBpcyByZXNvbHZlZC5cclxuICAgICAgICAgICAgLy8gVGhpcyBpcyBpbXBvcnRhbnQgZm9yIFwidHJhbnNpdGlvbnNcIiB3aGljaCBuZXZlciBhY3R1YWxseSBzdGFydFxyXG4gICAgICAgICAgICAvLyBpbW1lZGlhdGVseSBzbyB0aGVyZSBpcyBhIGNoYW5jZSB0aGF0IHdlIG1pZ2h0IG1pc3Mgb25lIGlmIGNoYW5nZVxyXG4gICAgICAgICAgICAvLyBoYXBwZW5zIGFtaWRzIHRoZSBwZW5kaW5nIGludm9jYXRpb24uXHJcbiAgICAgICAgICAgIHRyYWlsaW5nQ2FsbCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsZWFkaW5nQ2FsbCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRyYWlsaW5nQ2FsbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KHRpbWVvdXRDYWxsYmFjaywgZGVsYXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsYXN0Q2FsbFRpbWUgPSB0aW1lU3RhbXA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcHJveHk7XHJcbn1cblxuLy8gTWluaW11bSBkZWxheSBiZWZvcmUgaW52b2tpbmcgdGhlIHVwZGF0ZSBvZiBvYnNlcnZlcnMuXHJcbnZhciBSRUZSRVNIX0RFTEFZID0gMjA7XHJcbi8vIEEgbGlzdCBvZiBzdWJzdHJpbmdzIG9mIENTUyBwcm9wZXJ0aWVzIHVzZWQgdG8gZmluZCB0cmFuc2l0aW9uIGV2ZW50cyB0aGF0XHJcbi8vIG1pZ2h0IGFmZmVjdCBkaW1lbnNpb25zIG9mIG9ic2VydmVkIGVsZW1lbnRzLlxyXG52YXIgdHJhbnNpdGlvbktleXMgPSBbJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCAnbGVmdCcsICd3aWR0aCcsICdoZWlnaHQnLCAnc2l6ZScsICd3ZWlnaHQnXTtcclxuLy8gQ2hlY2sgaWYgTXV0YXRpb25PYnNlcnZlciBpcyBhdmFpbGFibGUuXHJcbnZhciBtdXRhdGlvbk9ic2VydmVyU3VwcG9ydGVkID0gdHlwZW9mIE11dGF0aW9uT2JzZXJ2ZXIgIT09ICd1bmRlZmluZWQnO1xyXG4vKipcclxuICogU2luZ2xldG9uIGNvbnRyb2xsZXIgY2xhc3Mgd2hpY2ggaGFuZGxlcyB1cGRhdGVzIG9mIFJlc2l6ZU9ic2VydmVyIGluc3RhbmNlcy5cclxuICovXHJcbnZhciBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyLlxyXG4gICAgICpcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlcigpIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBET00gbGlzdGVuZXJzIGhhdmUgYmVlbiBhZGRlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBwcml2YXRlIHtib29sZWFufVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY29ubmVjdGVkXyA9IGZhbHNlO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRlbGxzIHRoYXQgY29udHJvbGxlciBoYXMgc3Vic2NyaWJlZCBmb3IgTXV0YXRpb24gRXZlbnRzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQHByaXZhdGUge2Jvb2xlYW59XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5tdXRhdGlvbkV2ZW50c0FkZGVkXyA9IGZhbHNlO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEtlZXBzIHJlZmVyZW5jZSB0byB0aGUgaW5zdGFuY2Ugb2YgTXV0YXRpb25PYnNlcnZlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBwcml2YXRlIHtNdXRhdGlvbk9ic2VydmVyfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubXV0YXRpb25zT2JzZXJ2ZXJfID0gbnVsbDtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIGxpc3Qgb2YgY29ubmVjdGVkIG9ic2VydmVycy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBwcml2YXRlIHtBcnJheTxSZXNpemVPYnNlcnZlclNQST59XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5vYnNlcnZlcnNfID0gW107XHJcbiAgICAgICAgdGhpcy5vblRyYW5zaXRpb25FbmRfID0gdGhpcy5vblRyYW5zaXRpb25FbmRfLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoID0gdGhyb3R0bGUodGhpcy5yZWZyZXNoLmJpbmQodGhpcyksIFJFRlJFU0hfREVMQVkpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIG9ic2VydmVyIHRvIG9ic2VydmVycyBsaXN0LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UmVzaXplT2JzZXJ2ZXJTUEl9IG9ic2VydmVyIC0gT2JzZXJ2ZXIgdG8gYmUgYWRkZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAqL1xyXG4gICAgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyLnByb3RvdHlwZS5hZGRPYnNlcnZlciA9IGZ1bmN0aW9uIChvYnNlcnZlcikge1xyXG4gICAgICAgIGlmICghfnRoaXMub2JzZXJ2ZXJzXy5pbmRleE9mKG9ic2VydmVyKSkge1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyc18ucHVzaChvYnNlcnZlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEFkZCBsaXN0ZW5lcnMgaWYgdGhleSBoYXZlbid0IGJlZW4gYWRkZWQgeWV0LlxyXG4gICAgICAgIGlmICghdGhpcy5jb25uZWN0ZWRfKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdF8oKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIG9ic2VydmVyIGZyb20gb2JzZXJ2ZXJzIGxpc3QuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtSZXNpemVPYnNlcnZlclNQSX0gb2JzZXJ2ZXIgLSBPYnNlcnZlciB0byBiZSByZW1vdmVkLlxyXG4gICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgKi9cclxuICAgIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlci5wcm90b3R5cGUucmVtb3ZlT2JzZXJ2ZXIgPSBmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcclxuICAgICAgICB2YXIgb2JzZXJ2ZXJzID0gdGhpcy5vYnNlcnZlcnNfO1xyXG4gICAgICAgIHZhciBpbmRleCA9IG9ic2VydmVycy5pbmRleE9mKG9ic2VydmVyKTtcclxuICAgICAgICAvLyBSZW1vdmUgb2JzZXJ2ZXIgaWYgaXQncyBwcmVzZW50IGluIHJlZ2lzdHJ5LlxyXG4gICAgICAgIGlmICh+aW5kZXgpIHtcclxuICAgICAgICAgICAgb2JzZXJ2ZXJzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFJlbW92ZSBsaXN0ZW5lcnMgaWYgY29udHJvbGxlciBoYXMgbm8gY29ubmVjdGVkIG9ic2VydmVycy5cclxuICAgICAgICBpZiAoIW9ic2VydmVycy5sZW5ndGggJiYgdGhpcy5jb25uZWN0ZWRfKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzY29ubmVjdF8oKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBJbnZva2VzIHRoZSB1cGRhdGUgb2Ygb2JzZXJ2ZXJzLiBJdCB3aWxsIGNvbnRpbnVlIHJ1bm5pbmcgdXBkYXRlcyBpbnNvZmFyXHJcbiAgICAgKiBpdCBkZXRlY3RzIGNoYW5nZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgKi9cclxuICAgIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlci5wcm90b3R5cGUucmVmcmVzaCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgY2hhbmdlc0RldGVjdGVkID0gdGhpcy51cGRhdGVPYnNlcnZlcnNfKCk7XHJcbiAgICAgICAgLy8gQ29udGludWUgcnVubmluZyB1cGRhdGVzIGlmIGNoYW5nZXMgaGF2ZSBiZWVuIGRldGVjdGVkIGFzIHRoZXJlIG1pZ2h0XHJcbiAgICAgICAgLy8gYmUgZnV0dXJlIG9uZXMgY2F1c2VkIGJ5IENTUyB0cmFuc2l0aW9ucy5cclxuICAgICAgICBpZiAoY2hhbmdlc0RldGVjdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaCgpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgZXZlcnkgb2JzZXJ2ZXIgZnJvbSBvYnNlcnZlcnMgbGlzdCBhbmQgbm90aWZpZXMgdGhlbSBvZiBxdWV1ZWRcclxuICAgICAqIGVudHJpZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIFwidHJ1ZVwiIGlmIGFueSBvYnNlcnZlciBoYXMgZGV0ZWN0ZWQgY2hhbmdlcyBpblxyXG4gICAgICogICAgICBkaW1lbnNpb25zIG9mIGl0J3MgZWxlbWVudHMuXHJcbiAgICAgKi9cclxuICAgIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlci5wcm90b3R5cGUudXBkYXRlT2JzZXJ2ZXJzXyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAvLyBDb2xsZWN0IG9ic2VydmVycyB0aGF0IGhhdmUgYWN0aXZlIG9ic2VydmF0aW9ucy5cclxuICAgICAgICB2YXIgYWN0aXZlT2JzZXJ2ZXJzID0gdGhpcy5vYnNlcnZlcnNfLmZpbHRlcihmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9ic2VydmVyLmdhdGhlckFjdGl2ZSgpLCBvYnNlcnZlci5oYXNBY3RpdmUoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBEZWxpdmVyIG5vdGlmaWNhdGlvbnMgaW4gYSBzZXBhcmF0ZSBjeWNsZSBpbiBvcmRlciB0byBhdm9pZCBhbnlcclxuICAgICAgICAvLyBjb2xsaXNpb25zIGJldHdlZW4gb2JzZXJ2ZXJzLCBlLmcuIHdoZW4gbXVsdGlwbGUgaW5zdGFuY2VzIG9mXHJcbiAgICAgICAgLy8gUmVzaXplT2JzZXJ2ZXIgYXJlIHRyYWNraW5nIHRoZSBzYW1lIGVsZW1lbnQgYW5kIHRoZSBjYWxsYmFjayBvZiBvbmVcclxuICAgICAgICAvLyBvZiB0aGVtIGNoYW5nZXMgY29udGVudCBkaW1lbnNpb25zIG9mIHRoZSBvYnNlcnZlZCB0YXJnZXQuIFNvbWV0aW1lc1xyXG4gICAgICAgIC8vIHRoaXMgbWF5IHJlc3VsdCBpbiBub3RpZmljYXRpb25zIGJlaW5nIGJsb2NrZWQgZm9yIHRoZSByZXN0IG9mIG9ic2VydmVycy5cclxuICAgICAgICBhY3RpdmVPYnNlcnZlcnMuZm9yRWFjaChmdW5jdGlvbiAob2JzZXJ2ZXIpIHsgcmV0dXJuIG9ic2VydmVyLmJyb2FkY2FzdEFjdGl2ZSgpOyB9KTtcclxuICAgICAgICByZXR1cm4gYWN0aXZlT2JzZXJ2ZXJzLmxlbmd0aCA+IDA7XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBJbml0aWFsaXplcyBET00gbGlzdGVuZXJzLlxyXG4gICAgICpcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAqL1xyXG4gICAgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyLnByb3RvdHlwZS5jb25uZWN0XyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAvLyBEbyBub3RoaW5nIGlmIHJ1bm5pbmcgaW4gYSBub24tYnJvd3NlciBlbnZpcm9ubWVudCBvciBpZiBsaXN0ZW5lcnNcclxuICAgICAgICAvLyBoYXZlIGJlZW4gYWxyZWFkeSBhZGRlZC5cclxuICAgICAgICBpZiAoIWlzQnJvd3NlciB8fCB0aGlzLmNvbm5lY3RlZF8pIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBTdWJzY3JpcHRpb24gdG8gdGhlIFwiVHJhbnNpdGlvbmVuZFwiIGV2ZW50IGlzIHVzZWQgYXMgYSB3b3JrYXJvdW5kIGZvclxyXG4gICAgICAgIC8vIGRlbGF5ZWQgdHJhbnNpdGlvbnMuIFRoaXMgd2F5IGl0J3MgcG9zc2libGUgdG8gY2FwdHVyZSBhdCBsZWFzdCB0aGVcclxuICAgICAgICAvLyBmaW5hbCBzdGF0ZSBvZiBhbiBlbGVtZW50LlxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCB0aGlzLm9uVHJhbnNpdGlvbkVuZF8pO1xyXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLnJlZnJlc2gpO1xyXG4gICAgICAgIGlmIChtdXRhdGlvbk9ic2VydmVyU3VwcG9ydGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubXV0YXRpb25zT2JzZXJ2ZXJfID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIodGhpcy5yZWZyZXNoKTtcclxuICAgICAgICAgICAgdGhpcy5tdXRhdGlvbnNPYnNlcnZlcl8ub2JzZXJ2ZShkb2N1bWVudCwge1xyXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGNoYXJhY3RlckRhdGE6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBzdWJ0cmVlOiB0cnVlXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NU3VidHJlZU1vZGlmaWVkJywgdGhpcy5yZWZyZXNoKTtcclxuICAgICAgICAgICAgdGhpcy5tdXRhdGlvbkV2ZW50c0FkZGVkXyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY29ubmVjdGVkXyA9IHRydWU7XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIERPTSBsaXN0ZW5lcnMuXHJcbiAgICAgKlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICovXHJcbiAgICBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIucHJvdG90eXBlLmRpc2Nvbm5lY3RfID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIC8vIERvIG5vdGhpbmcgaWYgcnVubmluZyBpbiBhIG5vbi1icm93c2VyIGVudmlyb25tZW50IG9yIGlmIGxpc3RlbmVyc1xyXG4gICAgICAgIC8vIGhhdmUgYmVlbiBhbHJlYWR5IHJlbW92ZWQuXHJcbiAgICAgICAgaWYgKCFpc0Jyb3dzZXIgfHwgIXRoaXMuY29ubmVjdGVkXykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCB0aGlzLm9uVHJhbnNpdGlvbkVuZF8pO1xyXG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLnJlZnJlc2gpO1xyXG4gICAgICAgIGlmICh0aGlzLm11dGF0aW9uc09ic2VydmVyXykge1xyXG4gICAgICAgICAgICB0aGlzLm11dGF0aW9uc09ic2VydmVyXy5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm11dGF0aW9uRXZlbnRzQWRkZWRfKSB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ0RPTVN1YnRyZWVNb2RpZmllZCcsIHRoaXMucmVmcmVzaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubXV0YXRpb25zT2JzZXJ2ZXJfID0gbnVsbDtcclxuICAgICAgICB0aGlzLm11dGF0aW9uRXZlbnRzQWRkZWRfID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jb25uZWN0ZWRfID0gZmFsc2U7XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBcIlRyYW5zaXRpb25lbmRcIiBldmVudCBoYW5kbGVyLlxyXG4gICAgICpcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAcGFyYW0ge1RyYW5zaXRpb25FdmVudH0gZXZlbnRcclxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICovXHJcbiAgICBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIucHJvdG90eXBlLm9uVHJhbnNpdGlvbkVuZF8gPSBmdW5jdGlvbiAoX2EpIHtcclxuICAgICAgICB2YXIgX2IgPSBfYS5wcm9wZXJ0eU5hbWUsIHByb3BlcnR5TmFtZSA9IF9iID09PSB2b2lkIDAgPyAnJyA6IF9iO1xyXG4gICAgICAgIC8vIERldGVjdCB3aGV0aGVyIHRyYW5zaXRpb24gbWF5IGFmZmVjdCBkaW1lbnNpb25zIG9mIGFuIGVsZW1lbnQuXHJcbiAgICAgICAgdmFyIGlzUmVmbG93UHJvcGVydHkgPSB0cmFuc2l0aW9uS2V5cy5zb21lKGZ1bmN0aW9uIChrZXkpIHtcclxuICAgICAgICAgICAgcmV0dXJuICEhfnByb3BlcnR5TmFtZS5pbmRleE9mKGtleSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGlzUmVmbG93UHJvcGVydHkpIHtcclxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBpbnN0YW5jZSBvZiB0aGUgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHtSZXNpemVPYnNlcnZlckNvbnRyb2xsZXJ9XHJcbiAgICAgKi9cclxuICAgIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlci5nZXRJbnN0YW5jZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaW5zdGFuY2VfKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2VfID0gbmV3IFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZV87XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBIb2xkcyByZWZlcmVuY2UgdG8gdGhlIGNvbnRyb2xsZXIncyBpbnN0YW5jZS5cclxuICAgICAqXHJcbiAgICAgKiBAcHJpdmF0ZSB7UmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyfVxyXG4gICAgICovXHJcbiAgICBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIuaW5zdGFuY2VfID0gbnVsbDtcclxuICAgIHJldHVybiBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXI7XHJcbn0oKSk7XG5cbi8qKlxyXG4gKiBEZWZpbmVzIG5vbi13cml0YWJsZS9lbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgdGhlIHByb3ZpZGVkIHRhcmdldCBvYmplY3QuXHJcbiAqXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXQgLSBPYmplY3QgZm9yIHdoaWNoIHRvIGRlZmluZSBwcm9wZXJ0aWVzLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgLSBQcm9wZXJ0aWVzIHRvIGJlIGRlZmluZWQuXHJcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRhcmdldCBvYmplY3QuXHJcbiAqL1xyXG52YXIgZGVmaW5lQ29uZmlndXJhYmxlID0gKGZ1bmN0aW9uICh0YXJnZXQsIHByb3BzKSB7XHJcbiAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gT2JqZWN0LmtleXMocHJvcHMpOyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgIHZhciBrZXkgPSBfYVtfaV07XHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCB7XHJcbiAgICAgICAgICAgIHZhbHVlOiBwcm9wc1trZXldLFxyXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiB0YXJnZXQ7XHJcbn0pO1xuXG4vKipcclxuICogUmV0dXJucyB0aGUgZ2xvYmFsIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggcHJvdmlkZWQgZWxlbWVudC5cclxuICpcclxuICogQHBhcmFtIHtPYmplY3R9IHRhcmdldFxyXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxyXG4gKi9cclxudmFyIGdldFdpbmRvd09mID0gKGZ1bmN0aW9uICh0YXJnZXQpIHtcclxuICAgIC8vIEFzc3VtZSB0aGF0IHRoZSBlbGVtZW50IGlzIGFuIGluc3RhbmNlIG9mIE5vZGUsIHdoaWNoIG1lYW5zIHRoYXQgaXRcclxuICAgIC8vIGhhcyB0aGUgXCJvd25lckRvY3VtZW50XCIgcHJvcGVydHkgZnJvbSB3aGljaCB3ZSBjYW4gcmV0cmlldmUgYVxyXG4gICAgLy8gY29ycmVzcG9uZGluZyBnbG9iYWwgb2JqZWN0LlxyXG4gICAgdmFyIG93bmVyR2xvYmFsID0gdGFyZ2V0ICYmIHRhcmdldC5vd25lckRvY3VtZW50ICYmIHRhcmdldC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xyXG4gICAgLy8gUmV0dXJuIHRoZSBsb2NhbCBnbG9iYWwgb2JqZWN0IGlmIGl0J3Mgbm90IHBvc3NpYmxlIGV4dHJhY3Qgb25lIGZyb21cclxuICAgIC8vIHByb3ZpZGVkIGVsZW1lbnQuXHJcbiAgICByZXR1cm4gb3duZXJHbG9iYWwgfHwgZ2xvYmFsJDE7XHJcbn0pO1xuXG4vLyBQbGFjZWhvbGRlciBvZiBhbiBlbXB0eSBjb250ZW50IHJlY3RhbmdsZS5cclxudmFyIGVtcHR5UmVjdCA9IGNyZWF0ZVJlY3RJbml0KDAsIDAsIDAsIDApO1xyXG4vKipcclxuICogQ29udmVydHMgcHJvdmlkZWQgc3RyaW5nIHRvIGEgbnVtYmVyLlxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IHZhbHVlXHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9XHJcbiAqL1xyXG5mdW5jdGlvbiB0b0Zsb2F0KHZhbHVlKSB7XHJcbiAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWx1ZSkgfHwgMDtcclxufVxyXG4vKipcclxuICogRXh0cmFjdHMgYm9yZGVycyBzaXplIGZyb20gcHJvdmlkZWQgc3R5bGVzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge0NTU1N0eWxlRGVjbGFyYXRpb259IHN0eWxlc1xyXG4gKiBAcGFyYW0gey4uLnN0cmluZ30gcG9zaXRpb25zIC0gQm9yZGVycyBwb3NpdGlvbnMgKHRvcCwgcmlnaHQsIC4uLilcclxuICogQHJldHVybnMge251bWJlcn1cclxuICovXHJcbmZ1bmN0aW9uIGdldEJvcmRlcnNTaXplKHN0eWxlcykge1xyXG4gICAgdmFyIHBvc2l0aW9ucyA9IFtdO1xyXG4gICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICBwb3NpdGlvbnNbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcG9zaXRpb25zLnJlZHVjZShmdW5jdGlvbiAoc2l6ZSwgcG9zaXRpb24pIHtcclxuICAgICAgICB2YXIgdmFsdWUgPSBzdHlsZXNbJ2JvcmRlci0nICsgcG9zaXRpb24gKyAnLXdpZHRoJ107XHJcbiAgICAgICAgcmV0dXJuIHNpemUgKyB0b0Zsb2F0KHZhbHVlKTtcclxuICAgIH0sIDApO1xyXG59XHJcbi8qKlxyXG4gKiBFeHRyYWN0cyBwYWRkaW5ncyBzaXplcyBmcm9tIHByb3ZpZGVkIHN0eWxlcy5cclxuICpcclxuICogQHBhcmFtIHtDU1NTdHlsZURlY2xhcmF0aW9ufSBzdHlsZXNcclxuICogQHJldHVybnMge09iamVjdH0gUGFkZGluZ3MgYm94LlxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0UGFkZGluZ3Moc3R5bGVzKSB7XHJcbiAgICB2YXIgcG9zaXRpb25zID0gWyd0b3AnLCAncmlnaHQnLCAnYm90dG9tJywgJ2xlZnQnXTtcclxuICAgIHZhciBwYWRkaW5ncyA9IHt9O1xyXG4gICAgZm9yICh2YXIgX2kgPSAwLCBwb3NpdGlvbnNfMSA9IHBvc2l0aW9uczsgX2kgPCBwb3NpdGlvbnNfMS5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICB2YXIgcG9zaXRpb24gPSBwb3NpdGlvbnNfMVtfaV07XHJcbiAgICAgICAgdmFyIHZhbHVlID0gc3R5bGVzWydwYWRkaW5nLScgKyBwb3NpdGlvbl07XHJcbiAgICAgICAgcGFkZGluZ3NbcG9zaXRpb25dID0gdG9GbG9hdCh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGFkZGluZ3M7XHJcbn1cclxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgY29udGVudCByZWN0YW5nbGUgb2YgcHJvdmlkZWQgU1ZHIGVsZW1lbnQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7U1ZHR3JhcGhpY3NFbGVtZW50fSB0YXJnZXQgLSBFbGVtZW50IGNvbnRlbnQgcmVjdGFuZ2xlIG9mIHdoaWNoIG5lZWRzXHJcbiAqICAgICAgdG8gYmUgY2FsY3VsYXRlZC5cclxuICogQHJldHVybnMge0RPTVJlY3RJbml0fVxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0U1ZHQ29udGVudFJlY3QodGFyZ2V0KSB7XHJcbiAgICB2YXIgYmJveCA9IHRhcmdldC5nZXRCQm94KCk7XHJcbiAgICByZXR1cm4gY3JlYXRlUmVjdEluaXQoMCwgMCwgYmJveC53aWR0aCwgYmJveC5oZWlnaHQpO1xyXG59XHJcbi8qKlxyXG4gKiBDYWxjdWxhdGVzIGNvbnRlbnQgcmVjdGFuZ2xlIG9mIHByb3ZpZGVkIEhUTUxFbGVtZW50LlxyXG4gKlxyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSB0YXJnZXQgLSBFbGVtZW50IGZvciB3aGljaCB0byBjYWxjdWxhdGUgdGhlIGNvbnRlbnQgcmVjdGFuZ2xlLlxyXG4gKiBAcmV0dXJucyB7RE9NUmVjdEluaXR9XHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRIVE1MRWxlbWVudENvbnRlbnRSZWN0KHRhcmdldCkge1xyXG4gICAgLy8gQ2xpZW50IHdpZHRoICYgaGVpZ2h0IHByb3BlcnRpZXMgY2FuJ3QgYmVcclxuICAgIC8vIHVzZWQgZXhjbHVzaXZlbHkgYXMgdGhleSBwcm92aWRlIHJvdW5kZWQgdmFsdWVzLlxyXG4gICAgdmFyIGNsaWVudFdpZHRoID0gdGFyZ2V0LmNsaWVudFdpZHRoLCBjbGllbnRIZWlnaHQgPSB0YXJnZXQuY2xpZW50SGVpZ2h0O1xyXG4gICAgLy8gQnkgdGhpcyBjb25kaXRpb24gd2UgY2FuIGNhdGNoIGFsbCBub24tcmVwbGFjZWQgaW5saW5lLCBoaWRkZW4gYW5kXHJcbiAgICAvLyBkZXRhY2hlZCBlbGVtZW50cy4gVGhvdWdoIGVsZW1lbnRzIHdpdGggd2lkdGggJiBoZWlnaHQgcHJvcGVydGllcyBsZXNzXHJcbiAgICAvLyB0aGFuIDAuNSB3aWxsIGJlIGRpc2NhcmRlZCBhcyB3ZWxsLlxyXG4gICAgLy9cclxuICAgIC8vIFdpdGhvdXQgaXQgd2Ugd291bGQgbmVlZCB0byBpbXBsZW1lbnQgc2VwYXJhdGUgbWV0aG9kcyBmb3IgZWFjaCBvZlxyXG4gICAgLy8gdGhvc2UgY2FzZXMgYW5kIGl0J3Mgbm90IHBvc3NpYmxlIHRvIHBlcmZvcm0gYSBwcmVjaXNlIGFuZCBwZXJmb3JtYW5jZVxyXG4gICAgLy8gZWZmZWN0aXZlIHRlc3QgZm9yIGhpZGRlbiBlbGVtZW50cy4gRS5nLiBldmVuIGpRdWVyeSdzICc6dmlzaWJsZScgZmlsdGVyXHJcbiAgICAvLyBnaXZlcyB3cm9uZyByZXN1bHRzIGZvciBlbGVtZW50cyB3aXRoIHdpZHRoICYgaGVpZ2h0IGxlc3MgdGhhbiAwLjUuXHJcbiAgICBpZiAoIWNsaWVudFdpZHRoICYmICFjbGllbnRIZWlnaHQpIHtcclxuICAgICAgICByZXR1cm4gZW1wdHlSZWN0O1xyXG4gICAgfVxyXG4gICAgdmFyIHN0eWxlcyA9IGdldFdpbmRvd09mKHRhcmdldCkuZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpO1xyXG4gICAgdmFyIHBhZGRpbmdzID0gZ2V0UGFkZGluZ3Moc3R5bGVzKTtcclxuICAgIHZhciBob3JpelBhZCA9IHBhZGRpbmdzLmxlZnQgKyBwYWRkaW5ncy5yaWdodDtcclxuICAgIHZhciB2ZXJ0UGFkID0gcGFkZGluZ3MudG9wICsgcGFkZGluZ3MuYm90dG9tO1xyXG4gICAgLy8gQ29tcHV0ZWQgc3R5bGVzIG9mIHdpZHRoICYgaGVpZ2h0IGFyZSBiZWluZyB1c2VkIGJlY2F1c2UgdGhleSBhcmUgdGhlXHJcbiAgICAvLyBvbmx5IGRpbWVuc2lvbnMgYXZhaWxhYmxlIHRvIEpTIHRoYXQgY29udGFpbiBub24tcm91bmRlZCB2YWx1ZXMuIEl0IGNvdWxkXHJcbiAgICAvLyBiZSBwb3NzaWJsZSB0byB1dGlsaXplIHRoZSBnZXRCb3VuZGluZ0NsaWVudFJlY3QgaWYgb25seSBpdCdzIGRhdGEgd2Fzbid0XHJcbiAgICAvLyBhZmZlY3RlZCBieSBDU1MgdHJhbnNmb3JtYXRpb25zIGxldCBhbG9uZSBwYWRkaW5ncywgYm9yZGVycyBhbmQgc2Nyb2xsIGJhcnMuXHJcbiAgICB2YXIgd2lkdGggPSB0b0Zsb2F0KHN0eWxlcy53aWR0aCksIGhlaWdodCA9IHRvRmxvYXQoc3R5bGVzLmhlaWdodCk7XHJcbiAgICAvLyBXaWR0aCAmIGhlaWdodCBpbmNsdWRlIHBhZGRpbmdzIGFuZCBib3JkZXJzIHdoZW4gdGhlICdib3JkZXItYm94JyBib3hcclxuICAgIC8vIG1vZGVsIGlzIGFwcGxpZWQgKGV4Y2VwdCBmb3IgSUUpLlxyXG4gICAgaWYgKHN0eWxlcy5ib3hTaXppbmcgPT09ICdib3JkZXItYm94Jykge1xyXG4gICAgICAgIC8vIEZvbGxvd2luZyBjb25kaXRpb25zIGFyZSByZXF1aXJlZCB0byBoYW5kbGUgSW50ZXJuZXQgRXhwbG9yZXIgd2hpY2hcclxuICAgICAgICAvLyBkb2Vzbid0IGluY2x1ZGUgcGFkZGluZ3MgYW5kIGJvcmRlcnMgdG8gY29tcHV0ZWQgQ1NTIGRpbWVuc2lvbnMuXHJcbiAgICAgICAgLy9cclxuICAgICAgICAvLyBXZSBjYW4gc2F5IHRoYXQgaWYgQ1NTIGRpbWVuc2lvbnMgKyBwYWRkaW5ncyBhcmUgZXF1YWwgdG8gdGhlIFwiY2xpZW50XCJcclxuICAgICAgICAvLyBwcm9wZXJ0aWVzIHRoZW4gaXQncyBlaXRoZXIgSUUsIGFuZCB0aHVzIHdlIGRvbid0IG5lZWQgdG8gc3VidHJhY3RcclxuICAgICAgICAvLyBhbnl0aGluZywgb3IgYW4gZWxlbWVudCBtZXJlbHkgZG9lc24ndCBoYXZlIHBhZGRpbmdzL2JvcmRlcnMgc3R5bGVzLlxyXG4gICAgICAgIGlmIChNYXRoLnJvdW5kKHdpZHRoICsgaG9yaXpQYWQpICE9PSBjbGllbnRXaWR0aCkge1xyXG4gICAgICAgICAgICB3aWR0aCAtPSBnZXRCb3JkZXJzU2l6ZShzdHlsZXMsICdsZWZ0JywgJ3JpZ2h0JykgKyBob3JpelBhZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKE1hdGgucm91bmQoaGVpZ2h0ICsgdmVydFBhZCkgIT09IGNsaWVudEhlaWdodCkge1xyXG4gICAgICAgICAgICBoZWlnaHQgLT0gZ2V0Qm9yZGVyc1NpemUoc3R5bGVzLCAndG9wJywgJ2JvdHRvbScpICsgdmVydFBhZDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBGb2xsb3dpbmcgc3RlcHMgY2FuJ3QgYmUgYXBwbGllZCB0byB0aGUgZG9jdW1lbnQncyByb290IGVsZW1lbnQgYXMgaXRzXHJcbiAgICAvLyBjbGllbnRbV2lkdGgvSGVpZ2h0XSBwcm9wZXJ0aWVzIHJlcHJlc2VudCB2aWV3cG9ydCBhcmVhIG9mIHRoZSB3aW5kb3cuXHJcbiAgICAvLyBCZXNpZGVzLCBpdCdzIGFzIHdlbGwgbm90IG5lY2Vzc2FyeSBhcyB0aGUgPGh0bWw+IGl0c2VsZiBuZWl0aGVyIGhhc1xyXG4gICAgLy8gcmVuZGVyZWQgc2Nyb2xsIGJhcnMgbm9yIGl0IGNhbiBiZSBjbGlwcGVkLlxyXG4gICAgaWYgKCFpc0RvY3VtZW50RWxlbWVudCh0YXJnZXQpKSB7XHJcbiAgICAgICAgLy8gSW4gc29tZSBicm93c2VycyAob25seSBpbiBGaXJlZm94LCBhY3R1YWxseSkgQ1NTIHdpZHRoICYgaGVpZ2h0XHJcbiAgICAgICAgLy8gaW5jbHVkZSBzY3JvbGwgYmFycyBzaXplIHdoaWNoIGNhbiBiZSByZW1vdmVkIGF0IHRoaXMgc3RlcCBhcyBzY3JvbGxcclxuICAgICAgICAvLyBiYXJzIGFyZSB0aGUgb25seSBkaWZmZXJlbmNlIGJldHdlZW4gcm91bmRlZCBkaW1lbnNpb25zICsgcGFkZGluZ3NcclxuICAgICAgICAvLyBhbmQgXCJjbGllbnRcIiBwcm9wZXJ0aWVzLCB0aG91Z2ggdGhhdCBpcyBub3QgYWx3YXlzIHRydWUgaW4gQ2hyb21lLlxyXG4gICAgICAgIHZhciB2ZXJ0U2Nyb2xsYmFyID0gTWF0aC5yb3VuZCh3aWR0aCArIGhvcml6UGFkKSAtIGNsaWVudFdpZHRoO1xyXG4gICAgICAgIHZhciBob3JpelNjcm9sbGJhciA9IE1hdGgucm91bmQoaGVpZ2h0ICsgdmVydFBhZCkgLSBjbGllbnRIZWlnaHQ7XHJcbiAgICAgICAgLy8gQ2hyb21lIGhhcyBhIHJhdGhlciB3ZWlyZCByb3VuZGluZyBvZiBcImNsaWVudFwiIHByb3BlcnRpZXMuXHJcbiAgICAgICAgLy8gRS5nLiBmb3IgYW4gZWxlbWVudCB3aXRoIGNvbnRlbnQgd2lkdGggb2YgMzE0LjJweCBpdCBzb21ldGltZXMgZ2l2ZXNcclxuICAgICAgICAvLyB0aGUgY2xpZW50IHdpZHRoIG9mIDMxNXB4IGFuZCBmb3IgdGhlIHdpZHRoIG9mIDMxNC43cHggaXQgbWF5IGdpdmVcclxuICAgICAgICAvLyAzMTRweC4gQW5kIGl0IGRvZXNuJ3QgaGFwcGVuIGFsbCB0aGUgdGltZS4gU28ganVzdCBpZ25vcmUgdGhpcyBkZWx0YVxyXG4gICAgICAgIC8vIGFzIGEgbm9uLXJlbGV2YW50LlxyXG4gICAgICAgIGlmIChNYXRoLmFicyh2ZXJ0U2Nyb2xsYmFyKSAhPT0gMSkge1xyXG4gICAgICAgICAgICB3aWR0aCAtPSB2ZXJ0U2Nyb2xsYmFyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoTWF0aC5hYnMoaG9yaXpTY3JvbGxiYXIpICE9PSAxKSB7XHJcbiAgICAgICAgICAgIGhlaWdodCAtPSBob3JpelNjcm9sbGJhcjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3JlYXRlUmVjdEluaXQocGFkZGluZ3MubGVmdCwgcGFkZGluZ3MudG9wLCB3aWR0aCwgaGVpZ2h0KTtcclxufVxyXG4vKipcclxuICogQ2hlY2tzIHdoZXRoZXIgcHJvdmlkZWQgZWxlbWVudCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgU1ZHR3JhcGhpY3NFbGVtZW50LlxyXG4gKlxyXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCAtIEVsZW1lbnQgdG8gYmUgY2hlY2tlZC5cclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG52YXIgaXNTVkdHcmFwaGljc0VsZW1lbnQgPSAoZnVuY3Rpb24gKCkge1xyXG4gICAgLy8gU29tZSBicm93c2VycywgbmFtZWx5IElFIGFuZCBFZGdlLCBkb24ndCBoYXZlIHRoZSBTVkdHcmFwaGljc0VsZW1lbnRcclxuICAgIC8vIGludGVyZmFjZS5cclxuICAgIGlmICh0eXBlb2YgU1ZHR3JhcGhpY3NFbGVtZW50ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0KSB7IHJldHVybiB0YXJnZXQgaW5zdGFuY2VvZiBnZXRXaW5kb3dPZih0YXJnZXQpLlNWR0dyYXBoaWNzRWxlbWVudDsgfTtcclxuICAgIH1cclxuICAgIC8vIElmIGl0J3Mgc28sIHRoZW4gY2hlY2sgdGhhdCBlbGVtZW50IGlzIGF0IGxlYXN0IGFuIGluc3RhbmNlIG9mIHRoZVxyXG4gICAgLy8gU1ZHRWxlbWVudCBhbmQgdGhhdCBpdCBoYXMgdGhlIFwiZ2V0QkJveFwiIG1ldGhvZC5cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1leHRyYS1wYXJlbnNcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0KSB7IHJldHVybiAodGFyZ2V0IGluc3RhbmNlb2YgZ2V0V2luZG93T2YodGFyZ2V0KS5TVkdFbGVtZW50ICYmXHJcbiAgICAgICAgdHlwZW9mIHRhcmdldC5nZXRCQm94ID09PSAnZnVuY3Rpb24nKTsgfTtcclxufSkoKTtcclxuLyoqXHJcbiAqIENoZWNrcyB3aGV0aGVyIHByb3ZpZGVkIGVsZW1lbnQgaXMgYSBkb2N1bWVudCBlbGVtZW50ICg8aHRtbD4pLlxyXG4gKlxyXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCAtIEVsZW1lbnQgdG8gYmUgY2hlY2tlZC5cclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5mdW5jdGlvbiBpc0RvY3VtZW50RWxlbWVudCh0YXJnZXQpIHtcclxuICAgIHJldHVybiB0YXJnZXQgPT09IGdldFdpbmRvd09mKHRhcmdldCkuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xyXG59XHJcbi8qKlxyXG4gKiBDYWxjdWxhdGVzIGFuIGFwcHJvcHJpYXRlIGNvbnRlbnQgcmVjdGFuZ2xlIGZvciBwcm92aWRlZCBodG1sIG9yIHN2ZyBlbGVtZW50LlxyXG4gKlxyXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCAtIEVsZW1lbnQgY29udGVudCByZWN0YW5nbGUgb2Ygd2hpY2ggbmVlZHMgdG8gYmUgY2FsY3VsYXRlZC5cclxuICogQHJldHVybnMge0RPTVJlY3RJbml0fVxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0Q29udGVudFJlY3QodGFyZ2V0KSB7XHJcbiAgICBpZiAoIWlzQnJvd3Nlcikge1xyXG4gICAgICAgIHJldHVybiBlbXB0eVJlY3Q7XHJcbiAgICB9XHJcbiAgICBpZiAoaXNTVkdHcmFwaGljc0VsZW1lbnQodGFyZ2V0KSkge1xyXG4gICAgICAgIHJldHVybiBnZXRTVkdDb250ZW50UmVjdCh0YXJnZXQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdldEhUTUxFbGVtZW50Q29udGVudFJlY3QodGFyZ2V0KTtcclxufVxyXG4vKipcclxuICogQ3JlYXRlcyByZWN0YW5nbGUgd2l0aCBhbiBpbnRlcmZhY2Ugb2YgdGhlIERPTVJlY3RSZWFkT25seS5cclxuICogU3BlYzogaHR0cHM6Ly9kcmFmdHMuZnh0Zi5vcmcvZ2VvbWV0cnkvI2RvbXJlY3RyZWFkb25seVxyXG4gKlxyXG4gKiBAcGFyYW0ge0RPTVJlY3RJbml0fSByZWN0SW5pdCAtIE9iamVjdCB3aXRoIHJlY3RhbmdsZSdzIHgveSBjb29yZGluYXRlcyBhbmQgZGltZW5zaW9ucy5cclxuICogQHJldHVybnMge0RPTVJlY3RSZWFkT25seX1cclxuICovXHJcbmZ1bmN0aW9uIGNyZWF0ZVJlYWRPbmx5UmVjdChfYSkge1xyXG4gICAgdmFyIHggPSBfYS54LCB5ID0gX2EueSwgd2lkdGggPSBfYS53aWR0aCwgaGVpZ2h0ID0gX2EuaGVpZ2h0O1xyXG4gICAgLy8gSWYgRE9NUmVjdFJlYWRPbmx5IGlzIGF2YWlsYWJsZSB1c2UgaXQgYXMgYSBwcm90b3R5cGUgZm9yIHRoZSByZWN0YW5nbGUuXHJcbiAgICB2YXIgQ29uc3RyID0gdHlwZW9mIERPTVJlY3RSZWFkT25seSAhPT0gJ3VuZGVmaW5lZCcgPyBET01SZWN0UmVhZE9ubHkgOiBPYmplY3Q7XHJcbiAgICB2YXIgcmVjdCA9IE9iamVjdC5jcmVhdGUoQ29uc3RyLnByb3RvdHlwZSk7XHJcbiAgICAvLyBSZWN0YW5nbGUncyBwcm9wZXJ0aWVzIGFyZSBub3Qgd3JpdGFibGUgYW5kIG5vbi1lbnVtZXJhYmxlLlxyXG4gICAgZGVmaW5lQ29uZmlndXJhYmxlKHJlY3QsIHtcclxuICAgICAgICB4OiB4LCB5OiB5LCB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0LFxyXG4gICAgICAgIHRvcDogeSxcclxuICAgICAgICByaWdodDogeCArIHdpZHRoLFxyXG4gICAgICAgIGJvdHRvbTogaGVpZ2h0ICsgeSxcclxuICAgICAgICBsZWZ0OiB4XHJcbiAgICB9KTtcclxuICAgIHJldHVybiByZWN0O1xyXG59XHJcbi8qKlxyXG4gKiBDcmVhdGVzIERPTVJlY3RJbml0IG9iamVjdCBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgZGltZW5zaW9ucyBhbmQgdGhlIHgveSBjb29yZGluYXRlcy5cclxuICogU3BlYzogaHR0cHM6Ly9kcmFmdHMuZnh0Zi5vcmcvZ2VvbWV0cnkvI2RpY3RkZWYtZG9tcmVjdGluaXRcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBYIGNvb3JkaW5hdGUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gWSBjb29yZGluYXRlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBSZWN0YW5nbGUncyB3aWR0aC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFJlY3RhbmdsZSdzIGhlaWdodC5cclxuICogQHJldHVybnMge0RPTVJlY3RJbml0fVxyXG4gKi9cclxuZnVuY3Rpb24gY3JlYXRlUmVjdEluaXQoeCwgeSwgd2lkdGgsIGhlaWdodCkge1xyXG4gICAgcmV0dXJuIHsgeDogeCwgeTogeSwgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9O1xyXG59XG5cbi8qKlxyXG4gKiBDbGFzcyB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciBjb21wdXRhdGlvbnMgb2YgdGhlIGNvbnRlbnQgcmVjdGFuZ2xlIG9mXHJcbiAqIHByb3ZpZGVkIERPTSBlbGVtZW50IGFuZCBmb3Iga2VlcGluZyB0cmFjayBvZiBpdCdzIGNoYW5nZXMuXHJcbiAqL1xyXG52YXIgUmVzaXplT2JzZXJ2YXRpb24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgUmVzaXplT2JzZXJ2YXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXQgLSBFbGVtZW50IHRvIGJlIG9ic2VydmVkLlxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBSZXNpemVPYnNlcnZhdGlvbih0YXJnZXQpIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBCcm9hZGNhc3RlZCB3aWR0aCBvZiBjb250ZW50IHJlY3RhbmdsZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5icm9hZGNhc3RXaWR0aCA9IDA7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQnJvYWRjYXN0ZWQgaGVpZ2h0IG9mIGNvbnRlbnQgcmVjdGFuZ2xlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmJyb2FkY2FzdEhlaWdodCA9IDA7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogUmVmZXJlbmNlIHRvIHRoZSBsYXN0IG9ic2VydmVkIGNvbnRlbnQgcmVjdGFuZ2xlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQHByaXZhdGUge0RPTVJlY3RJbml0fVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY29udGVudFJlY3RfID0gY3JlYXRlUmVjdEluaXQoMCwgMCwgMCwgMCk7XHJcbiAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgY29udGVudCByZWN0YW5nbGUgYW5kIHRlbGxzIHdoZXRoZXIgaXQncyB3aWR0aCBvciBoZWlnaHQgcHJvcGVydGllc1xyXG4gICAgICogaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IGJyb2FkY2FzdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgUmVzaXplT2JzZXJ2YXRpb24ucHJvdG90eXBlLmlzQWN0aXZlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciByZWN0ID0gZ2V0Q29udGVudFJlY3QodGhpcy50YXJnZXQpO1xyXG4gICAgICAgIHRoaXMuY29udGVudFJlY3RfID0gcmVjdDtcclxuICAgICAgICByZXR1cm4gKHJlY3Qud2lkdGggIT09IHRoaXMuYnJvYWRjYXN0V2lkdGggfHxcclxuICAgICAgICAgICAgcmVjdC5oZWlnaHQgIT09IHRoaXMuYnJvYWRjYXN0SGVpZ2h0KTtcclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgJ2Jyb2FkY2FzdFdpZHRoJyBhbmQgJ2Jyb2FkY2FzdEhlaWdodCcgcHJvcGVydGllcyB3aXRoIGEgZGF0YVxyXG4gICAgICogZnJvbSB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0aWVzIG9mIHRoZSBsYXN0IG9ic2VydmVkIGNvbnRlbnQgcmVjdGFuZ2xlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHtET01SZWN0SW5pdH0gTGFzdCBvYnNlcnZlZCBjb250ZW50IHJlY3RhbmdsZS5cclxuICAgICAqL1xyXG4gICAgUmVzaXplT2JzZXJ2YXRpb24ucHJvdG90eXBlLmJyb2FkY2FzdFJlY3QgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIHJlY3QgPSB0aGlzLmNvbnRlbnRSZWN0XztcclxuICAgICAgICB0aGlzLmJyb2FkY2FzdFdpZHRoID0gcmVjdC53aWR0aDtcclxuICAgICAgICB0aGlzLmJyb2FkY2FzdEhlaWdodCA9IHJlY3QuaGVpZ2h0O1xyXG4gICAgICAgIHJldHVybiByZWN0O1xyXG4gICAgfTtcclxuICAgIHJldHVybiBSZXNpemVPYnNlcnZhdGlvbjtcclxufSgpKTtcblxudmFyIFJlc2l6ZU9ic2VydmVyRW50cnkgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgUmVzaXplT2JzZXJ2ZXJFbnRyeS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCAtIEVsZW1lbnQgdGhhdCBpcyBiZWluZyBvYnNlcnZlZC5cclxuICAgICAqIEBwYXJhbSB7RE9NUmVjdEluaXR9IHJlY3RJbml0IC0gRGF0YSBvZiB0aGUgZWxlbWVudCdzIGNvbnRlbnQgcmVjdGFuZ2xlLlxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBSZXNpemVPYnNlcnZlckVudHJ5KHRhcmdldCwgcmVjdEluaXQpIHtcclxuICAgICAgICB2YXIgY29udGVudFJlY3QgPSBjcmVhdGVSZWFkT25seVJlY3QocmVjdEluaXQpO1xyXG4gICAgICAgIC8vIEFjY29yZGluZyB0byB0aGUgc3BlY2lmaWNhdGlvbiBmb2xsb3dpbmcgcHJvcGVydGllcyBhcmUgbm90IHdyaXRhYmxlXHJcbiAgICAgICAgLy8gYW5kIGFyZSBhbHNvIG5vdCBlbnVtZXJhYmxlIGluIHRoZSBuYXRpdmUgaW1wbGVtZW50YXRpb24uXHJcbiAgICAgICAgLy9cclxuICAgICAgICAvLyBQcm9wZXJ0eSBhY2Nlc3NvcnMgYXJlIG5vdCBiZWluZyB1c2VkIGFzIHRoZXknZCByZXF1aXJlIHRvIGRlZmluZSBhXHJcbiAgICAgICAgLy8gcHJpdmF0ZSBXZWFrTWFwIHN0b3JhZ2Ugd2hpY2ggbWF5IGNhdXNlIG1lbW9yeSBsZWFrcyBpbiBicm93c2VycyB0aGF0XHJcbiAgICAgICAgLy8gZG9uJ3Qgc3VwcG9ydCB0aGlzIHR5cGUgb2YgY29sbGVjdGlvbnMuXHJcbiAgICAgICAgZGVmaW5lQ29uZmlndXJhYmxlKHRoaXMsIHsgdGFyZ2V0OiB0YXJnZXQsIGNvbnRlbnRSZWN0OiBjb250ZW50UmVjdCB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBSZXNpemVPYnNlcnZlckVudHJ5O1xyXG59KCkpO1xuXG52YXIgUmVzaXplT2JzZXJ2ZXJTUEkgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgUmVzaXplT2JzZXJ2ZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtSZXNpemVPYnNlcnZlckNhbGxiYWNrfSBjYWxsYmFjayAtIENhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgaW52b2tlZFxyXG4gICAgICogICAgICB3aGVuIG9uZSBvZiB0aGUgb2JzZXJ2ZWQgZWxlbWVudHMgY2hhbmdlcyBpdCdzIGNvbnRlbnQgZGltZW5zaW9ucy5cclxuICAgICAqIEBwYXJhbSB7UmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyfSBjb250cm9sbGVyIC0gQ29udHJvbGxlciBpbnN0YW5jZSB3aGljaFxyXG4gICAgICogICAgICBpcyByZXNwb25zaWJsZSBmb3IgdGhlIHVwZGF0ZXMgb2Ygb2JzZXJ2ZXIuXHJcbiAgICAgKiBAcGFyYW0ge1Jlc2l6ZU9ic2VydmVyfSBjYWxsYmFja0N0eCAtIFJlZmVyZW5jZSB0byB0aGUgcHVibGljXHJcbiAgICAgKiAgICAgIFJlc2l6ZU9ic2VydmVyIGluc3RhbmNlIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIGNhbGxiYWNrIGZ1bmN0aW9uLlxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBSZXNpemVPYnNlcnZlclNQSShjYWxsYmFjaywgY29udHJvbGxlciwgY2FsbGJhY2tDdHgpIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBDb2xsZWN0aW9uIG9mIHJlc2l6ZSBvYnNlcnZhdGlvbnMgdGhhdCBoYXZlIGRldGVjdGVkIGNoYW5nZXMgaW4gZGltZW5zaW9uc1xyXG4gICAgICAgICAqIG9mIGVsZW1lbnRzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQHByaXZhdGUge0FycmF5PFJlc2l6ZU9ic2VydmF0aW9uPn1cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmFjdGl2ZU9ic2VydmF0aW9uc18gPSBbXTtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBSZWdpc3RyeSBvZiB0aGUgUmVzaXplT2JzZXJ2YXRpb24gaW5zdGFuY2VzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQHByaXZhdGUge01hcDxFbGVtZW50LCBSZXNpemVPYnNlcnZhdGlvbj59XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5vYnNlcnZhdGlvbnNfID0gbmV3IE1hcFNoaW0oKTtcclxuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBjYWxsYmFjayBwcm92aWRlZCBhcyBwYXJhbWV0ZXIgMSBpcyBub3QgYSBmdW5jdGlvbi4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jYWxsYmFja18gPSBjYWxsYmFjaztcclxuICAgICAgICB0aGlzLmNvbnRyb2xsZXJfID0gY29udHJvbGxlcjtcclxuICAgICAgICB0aGlzLmNhbGxiYWNrQ3R4XyA9IGNhbGxiYWNrQ3R4O1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTdGFydHMgb2JzZXJ2aW5nIHByb3ZpZGVkIGVsZW1lbnQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXQgLSBFbGVtZW50IHRvIGJlIG9ic2VydmVkLlxyXG4gICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgKi9cclxuICAgIFJlc2l6ZU9ic2VydmVyU1BJLnByb3RvdHlwZS5vYnNlcnZlID0gZnVuY3Rpb24gKHRhcmdldCkge1xyXG4gICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCcxIGFyZ3VtZW50IHJlcXVpcmVkLCBidXQgb25seSAwIHByZXNlbnQuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIERvIG5vdGhpbmcgaWYgY3VycmVudCBlbnZpcm9ubWVudCBkb2Vzbid0IGhhdmUgdGhlIEVsZW1lbnQgaW50ZXJmYWNlLlxyXG4gICAgICAgIGlmICh0eXBlb2YgRWxlbWVudCA9PT0gJ3VuZGVmaW5lZCcgfHwgIShFbGVtZW50IGluc3RhbmNlb2YgT2JqZWN0KSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIGdldFdpbmRvd09mKHRhcmdldCkuRWxlbWVudCkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncGFyYW1ldGVyIDEgaXMgbm90IG9mIHR5cGUgXCJFbGVtZW50XCIuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBvYnNlcnZhdGlvbnMgPSB0aGlzLm9ic2VydmF0aW9uc187XHJcbiAgICAgICAgLy8gRG8gbm90aGluZyBpZiBlbGVtZW50IGlzIGFscmVhZHkgYmVpbmcgb2JzZXJ2ZWQuXHJcbiAgICAgICAgaWYgKG9ic2VydmF0aW9ucy5oYXModGFyZ2V0KSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9ic2VydmF0aW9ucy5zZXQodGFyZ2V0LCBuZXcgUmVzaXplT2JzZXJ2YXRpb24odGFyZ2V0KSk7XHJcbiAgICAgICAgdGhpcy5jb250cm9sbGVyXy5hZGRPYnNlcnZlcih0aGlzKTtcclxuICAgICAgICAvLyBGb3JjZSB0aGUgdXBkYXRlIG9mIG9ic2VydmF0aW9ucy5cclxuICAgICAgICB0aGlzLmNvbnRyb2xsZXJfLnJlZnJlc2goKTtcclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIFN0b3BzIG9ic2VydmluZyBwcm92aWRlZCBlbGVtZW50LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0IC0gRWxlbWVudCB0byBzdG9wIG9ic2VydmluZy5cclxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICovXHJcbiAgICBSZXNpemVPYnNlcnZlclNQSS5wcm90b3R5cGUudW5vYnNlcnZlID0gZnVuY3Rpb24gKHRhcmdldCkge1xyXG4gICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCcxIGFyZ3VtZW50IHJlcXVpcmVkLCBidXQgb25seSAwIHByZXNlbnQuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIERvIG5vdGhpbmcgaWYgY3VycmVudCBlbnZpcm9ubWVudCBkb2Vzbid0IGhhdmUgdGhlIEVsZW1lbnQgaW50ZXJmYWNlLlxyXG4gICAgICAgIGlmICh0eXBlb2YgRWxlbWVudCA9PT0gJ3VuZGVmaW5lZCcgfHwgIShFbGVtZW50IGluc3RhbmNlb2YgT2JqZWN0KSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIGdldFdpbmRvd09mKHRhcmdldCkuRWxlbWVudCkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncGFyYW1ldGVyIDEgaXMgbm90IG9mIHR5cGUgXCJFbGVtZW50XCIuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBvYnNlcnZhdGlvbnMgPSB0aGlzLm9ic2VydmF0aW9uc187XHJcbiAgICAgICAgLy8gRG8gbm90aGluZyBpZiBlbGVtZW50IGlzIG5vdCBiZWluZyBvYnNlcnZlZC5cclxuICAgICAgICBpZiAoIW9ic2VydmF0aW9ucy5oYXModGFyZ2V0KSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9ic2VydmF0aW9ucy5kZWxldGUodGFyZ2V0KTtcclxuICAgICAgICBpZiAoIW9ic2VydmF0aW9ucy5zaXplKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlcl8ucmVtb3ZlT2JzZXJ2ZXIodGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIC8qKlxyXG4gICAgICogU3RvcHMgb2JzZXJ2aW5nIGFsbCBlbGVtZW50cy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAqL1xyXG4gICAgUmVzaXplT2JzZXJ2ZXJTUEkucHJvdG90eXBlLmRpc2Nvbm5lY3QgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5jbGVhckFjdGl2ZSgpO1xyXG4gICAgICAgIHRoaXMub2JzZXJ2YXRpb25zXy5jbGVhcigpO1xyXG4gICAgICAgIHRoaXMuY29udHJvbGxlcl8ucmVtb3ZlT2JzZXJ2ZXIodGhpcyk7XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBDb2xsZWN0cyBvYnNlcnZhdGlvbiBpbnN0YW5jZXMgdGhlIGFzc29jaWF0ZWQgZWxlbWVudCBvZiB3aGljaCBoYXMgY2hhbmdlZFxyXG4gICAgICogaXQncyBjb250ZW50IHJlY3RhbmdsZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAqL1xyXG4gICAgUmVzaXplT2JzZXJ2ZXJTUEkucHJvdG90eXBlLmdhdGhlckFjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIHRoaXMuY2xlYXJBY3RpdmUoKTtcclxuICAgICAgICB0aGlzLm9ic2VydmF0aW9uc18uZm9yRWFjaChmdW5jdGlvbiAob2JzZXJ2YXRpb24pIHtcclxuICAgICAgICAgICAgaWYgKG9ic2VydmF0aW9uLmlzQWN0aXZlKCkpIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLmFjdGl2ZU9ic2VydmF0aW9uc18ucHVzaChvYnNlcnZhdGlvbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIEludm9rZXMgaW5pdGlhbCBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIGEgbGlzdCBvZiBSZXNpemVPYnNlcnZlckVudHJ5XHJcbiAgICAgKiBpbnN0YW5jZXMgY29sbGVjdGVkIGZyb20gYWN0aXZlIHJlc2l6ZSBvYnNlcnZhdGlvbnMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgKi9cclxuICAgIFJlc2l6ZU9ic2VydmVyU1BJLnByb3RvdHlwZS5icm9hZGNhc3RBY3RpdmUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLy8gRG8gbm90aGluZyBpZiBvYnNlcnZlciBkb2Vzbid0IGhhdmUgYWN0aXZlIG9ic2VydmF0aW9ucy5cclxuICAgICAgICBpZiAoIXRoaXMuaGFzQWN0aXZlKCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgY3R4ID0gdGhpcy5jYWxsYmFja0N0eF87XHJcbiAgICAgICAgLy8gQ3JlYXRlIFJlc2l6ZU9ic2VydmVyRW50cnkgaW5zdGFuY2UgZm9yIGV2ZXJ5IGFjdGl2ZSBvYnNlcnZhdGlvbi5cclxuICAgICAgICB2YXIgZW50cmllcyA9IHRoaXMuYWN0aXZlT2JzZXJ2YXRpb25zXy5tYXAoZnVuY3Rpb24gKG9ic2VydmF0aW9uKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVzaXplT2JzZXJ2ZXJFbnRyeShvYnNlcnZhdGlvbi50YXJnZXQsIG9ic2VydmF0aW9uLmJyb2FkY2FzdFJlY3QoKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5jYWxsYmFja18uY2FsbChjdHgsIGVudHJpZXMsIGN0eCk7XHJcbiAgICAgICAgdGhpcy5jbGVhckFjdGl2ZSgpO1xyXG4gICAgfTtcclxuICAgIC8qKlxyXG4gICAgICogQ2xlYXJzIHRoZSBjb2xsZWN0aW9uIG9mIGFjdGl2ZSBvYnNlcnZhdGlvbnMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgKi9cclxuICAgIFJlc2l6ZU9ic2VydmVyU1BJLnByb3RvdHlwZS5jbGVhckFjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLmFjdGl2ZU9ic2VydmF0aW9uc18uc3BsaWNlKDApO1xyXG4gICAgfTtcclxuICAgIC8qKlxyXG4gICAgICogVGVsbHMgd2hldGhlciBvYnNlcnZlciBoYXMgYWN0aXZlIG9ic2VydmF0aW9ucy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgUmVzaXplT2JzZXJ2ZXJTUEkucHJvdG90eXBlLmhhc0FjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVPYnNlcnZhdGlvbnNfLmxlbmd0aCA+IDA7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIFJlc2l6ZU9ic2VydmVyU1BJO1xyXG59KCkpO1xuXG4vLyBSZWdpc3RyeSBvZiBpbnRlcm5hbCBvYnNlcnZlcnMuIElmIFdlYWtNYXAgaXMgbm90IGF2YWlsYWJsZSB1c2UgY3VycmVudCBzaGltXHJcbi8vIGZvciB0aGUgTWFwIGNvbGxlY3Rpb24gYXMgaXQgaGFzIGFsbCByZXF1aXJlZCBtZXRob2RzIGFuZCBiZWNhdXNlIFdlYWtNYXBcclxuLy8gY2FuJ3QgYmUgZnVsbHkgcG9seWZpbGxlZCBhbnl3YXkuXHJcbnZhciBvYnNlcnZlcnMgPSB0eXBlb2YgV2Vha01hcCAhPT0gJ3VuZGVmaW5lZCcgPyBuZXcgV2Vha01hcCgpIDogbmV3IE1hcFNoaW0oKTtcclxuLyoqXHJcbiAqIFJlc2l6ZU9ic2VydmVyIEFQSS4gRW5jYXBzdWxhdGVzIHRoZSBSZXNpemVPYnNlcnZlciBTUEkgaW1wbGVtZW50YXRpb25cclxuICogZXhwb3Npbmcgb25seSB0aG9zZSBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIHRoYXQgYXJlIGRlZmluZWQgaW4gdGhlIHNwZWMuXHJcbiAqL1xyXG52YXIgUmVzaXplT2JzZXJ2ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgUmVzaXplT2JzZXJ2ZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtSZXNpemVPYnNlcnZlckNhbGxiYWNrfSBjYWxsYmFjayAtIENhbGxiYWNrIHRoYXQgaXMgaW52b2tlZCB3aGVuXHJcbiAgICAgKiAgICAgIGRpbWVuc2lvbnMgb2YgdGhlIG9ic2VydmVkIGVsZW1lbnRzIGNoYW5nZS5cclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gUmVzaXplT2JzZXJ2ZXIoY2FsbGJhY2spIHtcclxuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVzaXplT2JzZXJ2ZXIpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbi4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJzEgYXJndW1lbnQgcmVxdWlyZWQsIGJ1dCBvbmx5IDAgcHJlc2VudC4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGNvbnRyb2xsZXIgPSBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKTtcclxuICAgICAgICB2YXIgb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXJTUEkoY2FsbGJhY2ssIGNvbnRyb2xsZXIsIHRoaXMpO1xyXG4gICAgICAgIG9ic2VydmVycy5zZXQodGhpcywgb2JzZXJ2ZXIpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFJlc2l6ZU9ic2VydmVyO1xyXG59KCkpO1xyXG4vLyBFeHBvc2UgcHVibGljIG1ldGhvZHMgb2YgUmVzaXplT2JzZXJ2ZXIuXHJcbltcclxuICAgICdvYnNlcnZlJyxcclxuICAgICd1bm9ic2VydmUnLFxyXG4gICAgJ2Rpc2Nvbm5lY3QnXHJcbl0uZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kKSB7XHJcbiAgICBSZXNpemVPYnNlcnZlci5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgcmV0dXJuIChfYSA9IG9ic2VydmVycy5nZXQodGhpcykpW21ldGhvZF0uYXBwbHkoX2EsIGFyZ3VtZW50cyk7XHJcbiAgICB9O1xyXG59KTtcblxudmFyIGluZGV4ID0gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8vIEV4cG9ydCBleGlzdGluZyBpbXBsZW1lbnRhdGlvbiBpZiBhdmFpbGFibGUuXHJcbiAgICBpZiAodHlwZW9mIGdsb2JhbCQxLlJlc2l6ZU9ic2VydmVyICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHJldHVybiBnbG9iYWwkMS5SZXNpemVPYnNlcnZlcjtcclxuICAgIH1cclxuICAgIHJldHVybiBSZXNpemVPYnNlcnZlcjtcclxufSkoKTtcblxuZXhwb3J0IGRlZmF1bHQgaW5kZXg7XG4iLCAiaW1wb3J0IFJlc2l6ZU9ic2VydmVyIGZyb20gJ3Jlc2l6ZS1vYnNlcnZlci1wb2x5ZmlsbCc7XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IENvbnN0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbnZhciBlbGVtZW50TGlzdGVuZXJzID0gbmV3IE1hcCgpO1xuZnVuY3Rpb24gb25SZXNpemUoZW50aXRpZXMpIHtcbiAgZW50aXRpZXMuZm9yRWFjaChmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgdmFyIF9lbGVtZW50TGlzdGVuZXJzJGdldDtcbiAgICB2YXIgdGFyZ2V0ID0gZW50aXR5LnRhcmdldDtcbiAgICAoX2VsZW1lbnRMaXN0ZW5lcnMkZ2V0ID0gZWxlbWVudExpc3RlbmVycy5nZXQodGFyZ2V0KSkgPT09IG51bGwgfHwgX2VsZW1lbnRMaXN0ZW5lcnMkZ2V0ID09PSB2b2lkIDAgfHwgX2VsZW1lbnRMaXN0ZW5lcnMkZ2V0LmZvckVhY2goZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gbGlzdGVuZXIodGFyZ2V0KTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8vIE5vdGU6IFJlc2l6ZU9ic2VydmVyIHBvbHlmaWxsIG5vdCBzdXBwb3J0IG9wdGlvbiB0byBtZWFzdXJlIGJvcmRlci1ib3ggcmVzaXplXG52YXIgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIob25SZXNpemUpO1xuXG4vLyBEZXYgZW52IG9ubHlcbmV4cG9ydCB2YXIgX2VsID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGVsZW1lbnRMaXN0ZW5lcnMgOiBudWxsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG5leHBvcnQgdmFyIF9ycyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBvblJlc2l6ZSA6IG51bGw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IE9ic2VydmUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgZnVuY3Rpb24gb2JzZXJ2ZShlbGVtZW50LCBjYWxsYmFjaykge1xuICBpZiAoIWVsZW1lbnRMaXN0ZW5lcnMuaGFzKGVsZW1lbnQpKSB7XG4gICAgZWxlbWVudExpc3RlbmVycy5zZXQoZWxlbWVudCwgbmV3IFNldCgpKTtcbiAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGVsZW1lbnQpO1xuICB9XG4gIGVsZW1lbnRMaXN0ZW5lcnMuZ2V0KGVsZW1lbnQpLmFkZChjYWxsYmFjayk7XG59XG5leHBvcnQgZnVuY3Rpb24gdW5vYnNlcnZlKGVsZW1lbnQsIGNhbGxiYWNrKSB7XG4gIGlmIChlbGVtZW50TGlzdGVuZXJzLmhhcyhlbGVtZW50KSkge1xuICAgIGVsZW1lbnRMaXN0ZW5lcnMuZ2V0KGVsZW1lbnQpLmRlbGV0ZShjYWxsYmFjayk7XG4gICAgaWYgKCFlbGVtZW50TGlzdGVuZXJzLmdldChlbGVtZW50KS5zaXplKSB7XG4gICAgICByZXNpemVPYnNlcnZlci51bm9ic2VydmUoZWxlbWVudCk7XG4gICAgICBlbGVtZW50TGlzdGVuZXJzLmRlbGV0ZShlbGVtZW50KTtcbiAgICB9XG4gIH1cbn0iLCAiZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGEsIG4pIHtcbiAgaWYgKCEoYSBpbnN0YW5jZW9mIG4pKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xufVxuZXhwb3J0IHsgX2NsYXNzQ2FsbENoZWNrIGFzIGRlZmF1bHQgfTsiLCAiaW1wb3J0IHRvUHJvcGVydHlLZXkgZnJvbSBcIi4vdG9Qcm9wZXJ0eUtleS5qc1wiO1xuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXMoZSwgcikge1xuICBmb3IgKHZhciB0ID0gMDsgdCA8IHIubGVuZ3RoOyB0KyspIHtcbiAgICB2YXIgbyA9IHJbdF07XG4gICAgby5lbnVtZXJhYmxlID0gby5lbnVtZXJhYmxlIHx8ICExLCBvLmNvbmZpZ3VyYWJsZSA9ICEwLCBcInZhbHVlXCIgaW4gbyAmJiAoby53cml0YWJsZSA9ICEwKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHRvUHJvcGVydHlLZXkoby5rZXkpLCBvKTtcbiAgfVxufVxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKGUsIHIsIHQpIHtcbiAgcmV0dXJuIHIgJiYgX2RlZmluZVByb3BlcnRpZXMoZS5wcm90b3R5cGUsIHIpLCB0ICYmIF9kZWZpbmVQcm9wZXJ0aWVzKGUsIHQpLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJwcm90b3R5cGVcIiwge1xuICAgIHdyaXRhYmxlOiAhMVxuICB9KSwgZTtcbn1cbmV4cG9ydCB7IF9jcmVhdGVDbGFzcyBhcyBkZWZhdWx0IH07IiwgImZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZih0LCBlKSB7XG4gIHJldHVybiBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gKHQsIGUpIHtcbiAgICByZXR1cm4gdC5fX3Byb3RvX18gPSBlLCB0O1xuICB9LCBfc2V0UHJvdG90eXBlT2YodCwgZSk7XG59XG5leHBvcnQgeyBfc2V0UHJvdG90eXBlT2YgYXMgZGVmYXVsdCB9OyIsICJpbXBvcnQgc2V0UHJvdG90eXBlT2YgZnJvbSBcIi4vc2V0UHJvdG90eXBlT2YuanNcIjtcbmZ1bmN0aW9uIF9pbmhlcml0cyh0LCBlKSB7XG4gIGlmIChcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIGUgJiYgbnVsbCAhPT0gZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO1xuICB0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoZSAmJiBlLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogdCxcbiAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICB9XG4gIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJwcm90b3R5cGVcIiwge1xuICAgIHdyaXRhYmxlOiAhMVxuICB9KSwgZSAmJiBzZXRQcm90b3R5cGVPZih0LCBlKTtcbn1cbmV4cG9ydCB7IF9pbmhlcml0cyBhcyBkZWZhdWx0IH07IiwgImZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZih0KSB7XG4gIHJldHVybiBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdC5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKHQpO1xuICB9LCBfZ2V0UHJvdG90eXBlT2YodCk7XG59XG5leHBvcnQgeyBfZ2V0UHJvdG90eXBlT2YgYXMgZGVmYXVsdCB9OyIsICJmdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkge1xuICB0cnkge1xuICAgIHZhciB0ID0gIUJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTtcbiAgfSBjYXRjaCAodCkge31cbiAgcmV0dXJuIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHtcbiAgICByZXR1cm4gISF0O1xuICB9KSgpO1xufVxuZXhwb3J0IHsgX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCBhcyBkZWZhdWx0IH07IiwgImZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoZSkge1xuICBpZiAodm9pZCAwID09PSBlKSB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7XG4gIHJldHVybiBlO1xufVxuZXhwb3J0IHsgX2Fzc2VydFRoaXNJbml0aWFsaXplZCBhcyBkZWZhdWx0IH07IiwgImltcG9ydCBfdHlwZW9mIGZyb20gXCIuL3R5cGVvZi5qc1wiO1xuaW1wb3J0IGFzc2VydFRoaXNJbml0aWFsaXplZCBmcm9tIFwiLi9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQuanNcIjtcbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHQsIGUpIHtcbiAgaWYgKGUgJiYgKFwib2JqZWN0XCIgPT0gX3R5cGVvZihlKSB8fCBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIGUpKSByZXR1cm4gZTtcbiAgaWYgKHZvaWQgMCAhPT0gZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkRlcml2ZWQgY29uc3RydWN0b3JzIG1heSBvbmx5IHJldHVybiBvYmplY3Qgb3IgdW5kZWZpbmVkXCIpO1xuICByZXR1cm4gYXNzZXJ0VGhpc0luaXRpYWxpemVkKHQpO1xufVxuZXhwb3J0IHsgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4gYXMgZGVmYXVsdCB9OyIsICJpbXBvcnQgZ2V0UHJvdG90eXBlT2YgZnJvbSBcIi4vZ2V0UHJvdG90eXBlT2YuanNcIjtcbmltcG9ydCBpc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgZnJvbSBcIi4vaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0LmpzXCI7XG5pbXBvcnQgcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiBmcm9tIFwiLi9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuLmpzXCI7XG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIodCkge1xuICB2YXIgciA9IGlzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBlLFxuICAgICAgbyA9IGdldFByb3RvdHlwZU9mKHQpO1xuICAgIGlmIChyKSB7XG4gICAgICB2YXIgcyA9IGdldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yO1xuICAgICAgZSA9IFJlZmxlY3QuY29uc3RydWN0KG8sIGFyZ3VtZW50cywgcyk7XG4gICAgfSBlbHNlIGUgPSBvLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZSk7XG4gIH07XG59XG5leHBvcnQgeyBfY3JlYXRlU3VwZXIgYXMgZGVmYXVsdCB9OyIsICJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzXCI7XG5pbXBvcnQgX2NyZWF0ZVN1cGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVTdXBlclwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuLyoqXG4gKiBGYWxsYmFjayB0byBmaW5kRE9NTm9kZSBpZiBvcmlnaW4gcmVmIGRvIG5vdCBwcm92aWRlIGFueSBkb20gZWxlbWVudFxuICovXG52YXIgRG9tV3JhcHBlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoRG9tV3JhcHBlciwgX1JlYWN0JENvbXBvbmVudCk7XG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoRG9tV3JhcHBlcik7XG4gIGZ1bmN0aW9uIERvbVdyYXBwZXIoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERvbVdyYXBwZXIpO1xuICAgIHJldHVybiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuICBfY3JlYXRlQ2xhc3MoRG9tV3JhcHBlciwgW3tcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLmNoaWxkcmVuO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gRG9tV3JhcHBlcjtcbn0oUmVhY3QuQ29tcG9uZW50KTtcbmV4cG9ydCB7IERvbVdyYXBwZXIgYXMgZGVmYXVsdCB9OyIsICJmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShyLCBhKSB7XG4gIChudWxsID09IGEgfHwgYSA+IHIubGVuZ3RoKSAmJiAoYSA9IHIubGVuZ3RoKTtcbiAgZm9yICh2YXIgZSA9IDAsIG4gPSBBcnJheShhKTsgZSA8IGE7IGUrKykgbltlXSA9IHJbZV07XG4gIHJldHVybiBuO1xufVxuZXhwb3J0IHsgX2FycmF5TGlrZVRvQXJyYXkgYXMgZGVmYXVsdCB9OyIsICJpbXBvcnQgYXJyYXlMaWtlVG9BcnJheSBmcm9tIFwiLi9hcnJheUxpa2VUb0FycmF5LmpzXCI7XG5mdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMocikge1xuICBpZiAoQXJyYXkuaXNBcnJheShyKSkgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXkocik7XG59XG5leHBvcnQgeyBfYXJyYXlXaXRob3V0SG9sZXMgYXMgZGVmYXVsdCB9OyIsICJmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KHIpIHtcbiAgaWYgKFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIFN5bWJvbCAmJiBudWxsICE9IHJbU3ltYm9sLml0ZXJhdG9yXSB8fCBudWxsICE9IHJbXCJAQGl0ZXJhdG9yXCJdKSByZXR1cm4gQXJyYXkuZnJvbShyKTtcbn1cbmV4cG9ydCB7IF9pdGVyYWJsZVRvQXJyYXkgYXMgZGVmYXVsdCB9OyIsICJpbXBvcnQgYXJyYXlMaWtlVG9BcnJheSBmcm9tIFwiLi9hcnJheUxpa2VUb0FycmF5LmpzXCI7XG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkociwgYSkge1xuICBpZiAocikge1xuICAgIGlmIChcInN0cmluZ1wiID09IHR5cGVvZiByKSByZXR1cm4gYXJyYXlMaWtlVG9BcnJheShyLCBhKTtcbiAgICB2YXIgdCA9IHt9LnRvU3RyaW5nLmNhbGwocikuc2xpY2UoOCwgLTEpO1xuICAgIHJldHVybiBcIk9iamVjdFwiID09PSB0ICYmIHIuY29uc3RydWN0b3IgJiYgKHQgPSByLmNvbnN0cnVjdG9yLm5hbWUpLCBcIk1hcFwiID09PSB0IHx8IFwiU2V0XCIgPT09IHQgPyBBcnJheS5mcm9tKHIpIDogXCJBcmd1bWVudHNcIiA9PT0gdCB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdCh0KSA/IGFycmF5TGlrZVRvQXJyYXkociwgYSkgOiB2b2lkIDA7XG4gIH1cbn1cbmV4cG9ydCB7IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSBhcyBkZWZhdWx0IH07IiwgImZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59XG5leHBvcnQgeyBfbm9uSXRlcmFibGVTcHJlYWQgYXMgZGVmYXVsdCB9OyIsICJpbXBvcnQgYXJyYXlXaXRob3V0SG9sZXMgZnJvbSBcIi4vYXJyYXlXaXRob3V0SG9sZXMuanNcIjtcbmltcG9ydCBpdGVyYWJsZVRvQXJyYXkgZnJvbSBcIi4vaXRlcmFibGVUb0FycmF5LmpzXCI7XG5pbXBvcnQgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkgZnJvbSBcIi4vdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkuanNcIjtcbmltcG9ydCBub25JdGVyYWJsZVNwcmVhZCBmcm9tIFwiLi9ub25JdGVyYWJsZVNwcmVhZC5qc1wiO1xuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KHIpIHtcbiAgcmV0dXJuIGFycmF5V2l0aG91dEhvbGVzKHIpIHx8IGl0ZXJhYmxlVG9BcnJheShyKSB8fCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShyKSB8fCBub25JdGVyYWJsZVNwcmVhZCgpO1xufVxuZXhwb3J0IHsgX3RvQ29uc3VtYWJsZUFycmF5IGFzIGRlZmF1bHQgfTsiLCAidmFyIHJhZiA9IGZ1bmN0aW9uIHJhZihjYWxsYmFjaykge1xuICByZXR1cm4gK3NldFRpbWVvdXQoY2FsbGJhY2ssIDE2KTtcbn07XG52YXIgY2FmID0gZnVuY3Rpb24gY2FmKG51bSkge1xuICByZXR1cm4gY2xlYXJUaW1lb3V0KG51bSk7XG59O1xuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmICdyZXF1ZXN0QW5pbWF0aW9uRnJhbWUnIGluIHdpbmRvdykge1xuICByYWYgPSBmdW5jdGlvbiByYWYoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShjYWxsYmFjayk7XG4gIH07XG4gIGNhZiA9IGZ1bmN0aW9uIGNhZihoYW5kbGUpIHtcbiAgICByZXR1cm4gd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKGhhbmRsZSk7XG4gIH07XG59XG52YXIgcmFmVVVJRCA9IDA7XG52YXIgcmFmSWRzID0gbmV3IE1hcCgpO1xuZnVuY3Rpb24gY2xlYW51cChpZCkge1xuICByYWZJZHMuZGVsZXRlKGlkKTtcbn1cbnZhciB3cmFwcGVyUmFmID0gZnVuY3Rpb24gd3JhcHBlclJhZihjYWxsYmFjaykge1xuICB2YXIgdGltZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDE7XG4gIHJhZlVVSUQgKz0gMTtcbiAgdmFyIGlkID0gcmFmVVVJRDtcbiAgZnVuY3Rpb24gY2FsbFJlZihsZWZ0VGltZXMpIHtcbiAgICBpZiAobGVmdFRpbWVzID09PSAwKSB7XG4gICAgICAvLyBDbGVhbiB1cFxuICAgICAgY2xlYW51cChpZCk7XG5cbiAgICAgIC8vIFRyaWdnZXJcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5leHQgcmFmXG4gICAgICB2YXIgcmVhbElkID0gcmFmKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2FsbFJlZihsZWZ0VGltZXMgLSAxKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBCaW5kIHJlYWwgcmFmIGlkXG4gICAgICByYWZJZHMuc2V0KGlkLCByZWFsSWQpO1xuICAgIH1cbiAgfVxuICBjYWxsUmVmKHRpbWVzKTtcbiAgcmV0dXJuIGlkO1xufTtcbndyYXBwZXJSYWYuY2FuY2VsID0gZnVuY3Rpb24gKGlkKSB7XG4gIHZhciByZWFsSWQgPSByYWZJZHMuZ2V0KGlkKTtcbiAgY2xlYW51cChpZCk7XG4gIHJldHVybiBjYWYocmVhbElkKTtcbn07XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB3cmFwcGVyUmFmLmlkcyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcmFmSWRzO1xuICB9O1xufVxuZXhwb3J0IGRlZmF1bHQgd3JhcHBlclJhZjsiLCAiXCJ1c2UgY2xpZW50XCI7XG5cbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjcmVhdGVUaGVtZSwgU3R5bGVDb250ZXh0IGFzIENzc0luSnNTdHlsZUNvbnRleHQgfSBmcm9tICdAYW50LWRlc2lnbi9jc3NpbmpzJztcbmltcG9ydCBJY29uQ29udGV4dCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvY29tcG9uZW50cy9Db250ZXh0XCI7XG5pbXBvcnQgdXNlTWVtbyBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VNZW1vXCI7XG5pbXBvcnQgeyBtZXJnZSB9IGZyb20gXCJyYy11dGlsL2VzL3V0aWxzL3NldFwiO1xuaW1wb3J0IHdhcm5pbmcsIHsgZGV2VXNlV2FybmluZywgV2FybmluZ0NvbnRleHQgfSBmcm9tICcuLi9fdXRpbC93YXJuaW5nJztcbmltcG9ydCBWYWxpZGF0ZU1lc3NhZ2VzQ29udGV4dCBmcm9tICcuLi9mb3JtL3ZhbGlkYXRlTWVzc2FnZXNDb250ZXh0JztcbmltcG9ydCBMb2NhbGVQcm92aWRlciwgeyBBTlRfTUFSSyB9IGZyb20gJy4uL2xvY2FsZSc7XG5pbXBvcnQgTG9jYWxlQ29udGV4dCBmcm9tICcuLi9sb2NhbGUvY29udGV4dCc7XG5pbXBvcnQgZGVmYXVsdExvY2FsZSBmcm9tICcuLi9sb2NhbGUvZW5fVVMnO1xuaW1wb3J0IHsgZGVmYXVsdFRoZW1lLCBEZXNpZ25Ub2tlbkNvbnRleHQgfSBmcm9tICcuLi90aGVtZS9jb250ZXh0JztcbmltcG9ydCBkZWZhdWx0U2VlZFRva2VuIGZyb20gJy4uL3RoZW1lL3RoZW1lcy9zZWVkJztcbmltcG9ydCB7IENvbmZpZ0NvbnN1bWVyLCBDb25maWdDb250ZXh0LCBkZWZhdWx0SWNvblByZWZpeENscywgZGVmYXVsdFByZWZpeENscywgVmFyaWFudHMgfSBmcm9tICcuL2NvbnRleHQnO1xuaW1wb3J0IHsgcmVnaXN0ZXJUaGVtZSB9IGZyb20gJy4vY3NzVmFyaWFibGVzJztcbmltcG9ydCB7IERpc2FibGVkQ29udGV4dFByb3ZpZGVyIH0gZnJvbSAnLi9EaXNhYmxlZENvbnRleHQnO1xuaW1wb3J0IHVzZUNvbmZpZyBmcm9tICcuL2hvb2tzL3VzZUNvbmZpZyc7XG5pbXBvcnQgdXNlVGhlbWUgZnJvbSAnLi9ob29rcy91c2VUaGVtZSc7XG5pbXBvcnQgTW90aW9uV3JhcHBlciBmcm9tICcuL01vdGlvbldyYXBwZXInO1xuaW1wb3J0IFByb3BXYXJuaW5nIGZyb20gJy4vUHJvcFdhcm5pbmcnO1xuaW1wb3J0IFNpemVDb250ZXh0LCB7IFNpemVDb250ZXh0UHJvdmlkZXIgfSBmcm9tICcuL1NpemVDb250ZXh0JztcbmltcG9ydCB1c2VTdHlsZSBmcm9tICcuL3N0eWxlJztcbmV4cG9ydCB7IFZhcmlhbnRzIH07XG4vKipcbiAqIFNpbmNlIHRvbyBtYW55IGZlZWRiYWNrIHVzaW5nIHN0YXRpYyBtZXRob2QgbGlrZSBgTW9kYWwuY29uZmlybWAgbm90IGdldHRpbmcgdGhlbWUsIHdlIHJlY29yZCB0aGVcbiAqIHRoZW1lIHJlZ2lzdGVyIGluZm8gaGVyZSB0byBoZWxwIGRldmVsb3BlciBnZXQgd2FybmluZyBpbmZvLlxuICovXG5sZXQgZXhpc3RUaGVtZUNvbmZpZyA9IGZhbHNlO1xuZXhwb3J0IGNvbnN0IHdhcm5Db250ZXh0ID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGNvbXBvbmVudE5hbWUgPT4ge1xuICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCFleGlzdFRoZW1lQ29uZmlnLCBjb21wb25lbnROYW1lLCBgU3RhdGljIGZ1bmN0aW9uIGNhbiBub3QgY29uc3VtZSBjb250ZXh0IGxpa2UgZHluYW1pYyB0aGVtZS4gUGxlYXNlIHVzZSAnQXBwJyBjb21wb25lbnQgaW5zdGVhZC5gKSA6IHZvaWQgMDtcbn0gOiAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xubnVsbDtcbmV4cG9ydCB7IENvbmZpZ0NvbnN1bWVyLCBDb25maWdDb250ZXh0LCBkZWZhdWx0UHJlZml4Q2xzLCBkZWZhdWx0SWNvblByZWZpeENscyB9O1xuZXhwb3J0IGNvbnN0IGNvbmZpZ0NvbnN1bWVyUHJvcHMgPSBbJ2dldFRhcmdldENvbnRhaW5lcicsICdnZXRQb3B1cENvbnRhaW5lcicsICdyb290UHJlZml4Q2xzJywgJ2dldFByZWZpeENscycsICdyZW5kZXJFbXB0eScsICdjc3AnLCAnYXV0b0luc2VydFNwYWNlSW5CdXR0b24nLCAnbG9jYWxlJ107XG4vLyBUaGVzZSBwcm9wcyBpcyB1c2VkIGJ5IGB1c2VDb250ZXh0YCBkaXJlY3RseSBpbiBzdWIgY29tcG9uZW50XG5jb25zdCBQQVNTRURfUFJPUFMgPSBbJ2dldFRhcmdldENvbnRhaW5lcicsICdnZXRQb3B1cENvbnRhaW5lcicsICdyZW5kZXJFbXB0eScsICdpbnB1dCcsICdwYWdpbmF0aW9uJywgJ2Zvcm0nLCAnc2VsZWN0JywgJ2J1dHRvbiddO1xubGV0IGdsb2JhbFByZWZpeENscztcbmxldCBnbG9iYWxJY29uUHJlZml4Q2xzO1xubGV0IGdsb2JhbFRoZW1lO1xubGV0IGdsb2JhbEhvbGRlclJlbmRlcjtcbmZ1bmN0aW9uIGdldEdsb2JhbFByZWZpeENscygpIHtcbiAgcmV0dXJuIGdsb2JhbFByZWZpeENscyB8fCBkZWZhdWx0UHJlZml4Q2xzO1xufVxuZnVuY3Rpb24gZ2V0R2xvYmFsSWNvblByZWZpeENscygpIHtcbiAgcmV0dXJuIGdsb2JhbEljb25QcmVmaXhDbHMgfHwgZGVmYXVsdEljb25QcmVmaXhDbHM7XG59XG5mdW5jdGlvbiBpc0xlZ2FjeVRoZW1lKHRoZW1lKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyh0aGVtZSkuc29tZShrZXkgPT4ga2V5LmVuZHNXaXRoKCdDb2xvcicpKTtcbn1cbmNvbnN0IHNldEdsb2JhbENvbmZpZyA9IHByb3BzID0+IHtcbiAgY29uc3Qge1xuICAgIHByZWZpeENscyxcbiAgICBpY29uUHJlZml4Q2xzLFxuICAgIHRoZW1lLFxuICAgIGhvbGRlclJlbmRlclxuICB9ID0gcHJvcHM7XG4gIGlmIChwcmVmaXhDbHMgIT09IHVuZGVmaW5lZCkge1xuICAgIGdsb2JhbFByZWZpeENscyA9IHByZWZpeENscztcbiAgfVxuICBpZiAoaWNvblByZWZpeENscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZ2xvYmFsSWNvblByZWZpeENscyA9IGljb25QcmVmaXhDbHM7XG4gIH1cbiAgaWYgKCdob2xkZXJSZW5kZXInIGluIHByb3BzKSB7XG4gICAgZ2xvYmFsSG9sZGVyUmVuZGVyID0gaG9sZGVyUmVuZGVyO1xuICB9XG4gIGlmICh0aGVtZSkge1xuICAgIGlmIChpc0xlZ2FjeVRoZW1lKHRoZW1lKSkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhmYWxzZSwgJ0NvbmZpZ1Byb3ZpZGVyJywgJ2Bjb25maWdgIG9mIGNzcyB2YXJpYWJsZSB0aGVtZSBpcyBub3Qgd29yayBpbiB2NS4gUGxlYXNlIHVzZSBuZXcgYHRoZW1lYCBjb25maWcgaW5zdGVhZC4nKSA6IHZvaWQgMDtcbiAgICAgIHJlZ2lzdGVyVGhlbWUoZ2V0R2xvYmFsUHJlZml4Q2xzKCksIHRoZW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2xvYmFsVGhlbWUgPSB0aGVtZTtcbiAgICB9XG4gIH1cbn07XG5leHBvcnQgY29uc3QgZ2xvYmFsQ29uZmlnID0gKCkgPT4gKHtcbiAgZ2V0UHJlZml4Q2xzOiAoc3VmZml4Q2xzLCBjdXN0b21pemVQcmVmaXhDbHMpID0+IHtcbiAgICBpZiAoY3VzdG9taXplUHJlZml4Q2xzKSB7XG4gICAgICByZXR1cm4gY3VzdG9taXplUHJlZml4Q2xzO1xuICAgIH1cbiAgICByZXR1cm4gc3VmZml4Q2xzID8gYCR7Z2V0R2xvYmFsUHJlZml4Q2xzKCl9LSR7c3VmZml4Q2xzfWAgOiBnZXRHbG9iYWxQcmVmaXhDbHMoKTtcbiAgfSxcbiAgZ2V0SWNvblByZWZpeENsczogZ2V0R2xvYmFsSWNvblByZWZpeENscyxcbiAgZ2V0Um9vdFByZWZpeENsczogKCkgPT4ge1xuICAgIC8vIElmIEdsb2JhbCBwcmVmaXhDbHMgcHJvdmlkZWQsIHVzZSB0aGlzXG4gICAgaWYgKGdsb2JhbFByZWZpeENscykge1xuICAgICAgcmV0dXJuIGdsb2JhbFByZWZpeENscztcbiAgICB9XG4gICAgLy8gRmFsbGJhY2sgdG8gZGVmYXVsdCBwcmVmaXhDbHNcbiAgICByZXR1cm4gZ2V0R2xvYmFsUHJlZml4Q2xzKCk7XG4gIH0sXG4gIGdldFRoZW1lOiAoKSA9PiBnbG9iYWxUaGVtZSxcbiAgaG9sZGVyUmVuZGVyOiBnbG9iYWxIb2xkZXJSZW5kZXJcbn0pO1xuY29uc3QgUHJvdmlkZXJDaGlsZHJlbiA9IHByb3BzID0+IHtcbiAgY29uc3Qge1xuICAgIGNoaWxkcmVuLFxuICAgIGNzcDogY3VzdG9tQ3NwLFxuICAgIGF1dG9JbnNlcnRTcGFjZUluQnV0dG9uLFxuICAgIGFsZXJ0LFxuICAgIGFuY2hvcixcbiAgICBmb3JtLFxuICAgIGxvY2FsZSxcbiAgICBjb21wb25lbnRTaXplLFxuICAgIGRpcmVjdGlvbixcbiAgICBzcGFjZSxcbiAgICBzcGxpdHRlcixcbiAgICB2aXJ0dWFsLFxuICAgIGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCxcbiAgICBwb3B1cE1hdGNoU2VsZWN0V2lkdGgsXG4gICAgcG9wdXBPdmVyZmxvdyxcbiAgICBsZWdhY3lMb2NhbGUsXG4gICAgcGFyZW50Q29udGV4dCxcbiAgICBpY29uUHJlZml4Q2xzOiBjdXN0b21JY29uUHJlZml4Q2xzLFxuICAgIHRoZW1lLFxuICAgIGNvbXBvbmVudERpc2FibGVkLFxuICAgIHNlZ21lbnRlZCxcbiAgICBzdGF0aXN0aWMsXG4gICAgc3BpbixcbiAgICBjYWxlbmRhcixcbiAgICBjYXJvdXNlbCxcbiAgICBjYXNjYWRlcixcbiAgICBjb2xsYXBzZSxcbiAgICB0eXBvZ3JhcGh5LFxuICAgIGNoZWNrYm94LFxuICAgIGRlc2NyaXB0aW9ucyxcbiAgICBkaXZpZGVyLFxuICAgIGRyYXdlcixcbiAgICBza2VsZXRvbixcbiAgICBzdGVwcyxcbiAgICBpbWFnZSxcbiAgICBsYXlvdXQsXG4gICAgbGlzdCxcbiAgICBtZW50aW9ucyxcbiAgICBtb2RhbCxcbiAgICBwcm9ncmVzcyxcbiAgICByZXN1bHQsXG4gICAgc2xpZGVyLFxuICAgIGJyZWFkY3J1bWIsXG4gICAgbWVudSxcbiAgICBwYWdpbmF0aW9uLFxuICAgIGlucHV0LFxuICAgIHRleHRBcmVhLFxuICAgIGVtcHR5LFxuICAgIGJhZGdlLFxuICAgIHJhZGlvLFxuICAgIHJhdGUsXG4gICAgc3dpdGNoOiBTV0lUQ0gsXG4gICAgdHJhbnNmZXIsXG4gICAgYXZhdGFyLFxuICAgIG1lc3NhZ2UsXG4gICAgdGFnLFxuICAgIHRhYmxlLFxuICAgIGNhcmQsXG4gICAgdGFicyxcbiAgICB0aW1lbGluZSxcbiAgICB0aW1lUGlja2VyLFxuICAgIHVwbG9hZCxcbiAgICBub3RpZmljYXRpb24sXG4gICAgdHJlZSxcbiAgICBjb2xvclBpY2tlcixcbiAgICBkYXRlUGlja2VyLFxuICAgIHJhbmdlUGlja2VyLFxuICAgIGZsZXgsXG4gICAgd2F2ZSxcbiAgICBkcm9wZG93bixcbiAgICB3YXJuaW5nOiB3YXJuaW5nQ29uZmlnLFxuICAgIHRvdXIsXG4gICAgdG9vbHRpcCxcbiAgICBwb3BvdmVyLFxuICAgIHBvcGNvbmZpcm0sXG4gICAgZmxvYXRCdXR0b25Hcm91cCxcbiAgICB2YXJpYW50LFxuICAgIGlucHV0TnVtYmVyLFxuICAgIHRyZWVTZWxlY3RcbiAgfSA9IHByb3BzO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDb250ZXh0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IGdldFByZWZpeENscyA9IFJlYWN0LnVzZUNhbGxiYWNrKChzdWZmaXhDbHMsIGN1c3RvbWl6ZVByZWZpeENscykgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHByZWZpeENsc1xuICAgIH0gPSBwcm9wcztcbiAgICBpZiAoY3VzdG9taXplUHJlZml4Q2xzKSB7XG4gICAgICByZXR1cm4gY3VzdG9taXplUHJlZml4Q2xzO1xuICAgIH1cbiAgICBjb25zdCBtZXJnZWRQcmVmaXhDbHMgPSBwcmVmaXhDbHMgfHwgcGFyZW50Q29udGV4dC5nZXRQcmVmaXhDbHMoJycpO1xuICAgIHJldHVybiBzdWZmaXhDbHMgPyBgJHttZXJnZWRQcmVmaXhDbHN9LSR7c3VmZml4Q2xzfWAgOiBtZXJnZWRQcmVmaXhDbHM7XG4gIH0sIFtwYXJlbnRDb250ZXh0LmdldFByZWZpeENscywgcHJvcHMucHJlZml4Q2xzXSk7XG4gIGNvbnN0IGljb25QcmVmaXhDbHMgPSBjdXN0b21JY29uUHJlZml4Q2xzIHx8IHBhcmVudENvbnRleHQuaWNvblByZWZpeENscyB8fCBkZWZhdWx0SWNvblByZWZpeENscztcbiAgY29uc3QgY3NwID0gY3VzdG9tQ3NwIHx8IHBhcmVudENvbnRleHQuY3NwO1xuICB1c2VTdHlsZShpY29uUHJlZml4Q2xzLCBjc3ApO1xuICBjb25zdCBtZXJnZWRUaGVtZSA9IHVzZVRoZW1lKHRoZW1lLCBwYXJlbnRDb250ZXh0LnRoZW1lLCB7XG4gICAgcHJlZml4Q2xzOiBnZXRQcmVmaXhDbHMoJycpXG4gIH0pO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGV4aXN0VGhlbWVDb25maWcgPSBleGlzdFRoZW1lQ29uZmlnIHx8ICEhbWVyZ2VkVGhlbWU7XG4gIH1cbiAgY29uc3QgYmFzZUNvbmZpZyA9IHtcbiAgICBjc3AsXG4gICAgYXV0b0luc2VydFNwYWNlSW5CdXR0b24sXG4gICAgYWxlcnQsXG4gICAgYW5jaG9yLFxuICAgIGxvY2FsZTogbG9jYWxlIHx8IGxlZ2FjeUxvY2FsZSxcbiAgICBkaXJlY3Rpb24sXG4gICAgc3BhY2UsXG4gICAgc3BsaXR0ZXIsXG4gICAgdmlydHVhbCxcbiAgICBwb3B1cE1hdGNoU2VsZWN0V2lkdGg6IHBvcHVwTWF0Y2hTZWxlY3RXaWR0aCAhPT0gbnVsbCAmJiBwb3B1cE1hdGNoU2VsZWN0V2lkdGggIT09IHZvaWQgMCA/IHBvcHVwTWF0Y2hTZWxlY3RXaWR0aCA6IGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCxcbiAgICBwb3B1cE92ZXJmbG93LFxuICAgIGdldFByZWZpeENscyxcbiAgICBpY29uUHJlZml4Q2xzLFxuICAgIHRoZW1lOiBtZXJnZWRUaGVtZSxcbiAgICBzZWdtZW50ZWQsXG4gICAgc3RhdGlzdGljLFxuICAgIHNwaW4sXG4gICAgY2FsZW5kYXIsXG4gICAgY2Fyb3VzZWwsXG4gICAgY2FzY2FkZXIsXG4gICAgY29sbGFwc2UsXG4gICAgdHlwb2dyYXBoeSxcbiAgICBjaGVja2JveCxcbiAgICBkZXNjcmlwdGlvbnMsXG4gICAgZGl2aWRlcixcbiAgICBkcmF3ZXIsXG4gICAgc2tlbGV0b24sXG4gICAgc3RlcHMsXG4gICAgaW1hZ2UsXG4gICAgaW5wdXQsXG4gICAgdGV4dEFyZWEsXG4gICAgbGF5b3V0LFxuICAgIGxpc3QsXG4gICAgbWVudGlvbnMsXG4gICAgbW9kYWwsXG4gICAgcHJvZ3Jlc3MsXG4gICAgcmVzdWx0LFxuICAgIHNsaWRlcixcbiAgICBicmVhZGNydW1iLFxuICAgIG1lbnUsXG4gICAgcGFnaW5hdGlvbixcbiAgICBlbXB0eSxcbiAgICBiYWRnZSxcbiAgICByYWRpbyxcbiAgICByYXRlLFxuICAgIHN3aXRjaDogU1dJVENILFxuICAgIHRyYW5zZmVyLFxuICAgIGF2YXRhcixcbiAgICBtZXNzYWdlLFxuICAgIHRhZyxcbiAgICB0YWJsZSxcbiAgICBjYXJkLFxuICAgIHRhYnMsXG4gICAgdGltZWxpbmUsXG4gICAgdGltZVBpY2tlcixcbiAgICB1cGxvYWQsXG4gICAgbm90aWZpY2F0aW9uLFxuICAgIHRyZWUsXG4gICAgY29sb3JQaWNrZXIsXG4gICAgZGF0ZVBpY2tlcixcbiAgICByYW5nZVBpY2tlcixcbiAgICBmbGV4LFxuICAgIHdhdmUsXG4gICAgZHJvcGRvd24sXG4gICAgd2FybmluZzogd2FybmluZ0NvbmZpZyxcbiAgICB0b3VyLFxuICAgIHRvb2x0aXAsXG4gICAgcG9wb3ZlcixcbiAgICBwb3Bjb25maXJtLFxuICAgIGZsb2F0QnV0dG9uR3JvdXAsXG4gICAgdmFyaWFudCxcbiAgICBpbnB1dE51bWJlcixcbiAgICB0cmVlU2VsZWN0XG4gIH07XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgY29uc3Qgd2FybmluZ0ZuID0gZGV2VXNlV2FybmluZygnQ29uZmlnUHJvdmlkZXInKTtcbiAgICB3YXJuaW5nRm4oISgnYXV0b0luc2VydFNwYWNlSW5CdXR0b24nIGluIHByb3BzKSwgJ2RlcHJlY2F0ZWQnLCAnYGF1dG9JbnNlcnRTcGFjZUluQnV0dG9uYCBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIGB7IGJ1dHRvbjogeyBhdXRvSW5zZXJ0U3BhY2U6IGJvb2xlYW4gfX1gIGluc3RlYWQuJyk7XG4gIH1cbiAgY29uc3QgY29uZmlnID0gT2JqZWN0LmFzc2lnbih7fSwgcGFyZW50Q29udGV4dCk7XG4gIE9iamVjdC5rZXlzKGJhc2VDb25maWcpLmZvckVhY2goa2V5ID0+IHtcbiAgICBpZiAoYmFzZUNvbmZpZ1trZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZ1trZXldID0gYmFzZUNvbmZpZ1trZXldO1xuICAgIH1cbiAgfSk7XG4gIC8vIFBhc3MgdGhlIHByb3BzIHVzZWQgYnkgYHVzZUNvbnRleHRgIGRpcmVjdGx5IHdpdGggY2hpbGQgY29tcG9uZW50LlxuICAvLyBUaGVzZSBwcm9wcyBzaG91bGQgbWVyZ2VkIGludG8gYGNvbmZpZ2AuXG4gIFBBU1NFRF9QUk9QUy5mb3JFYWNoKHByb3BOYW1lID0+IHtcbiAgICBjb25zdCBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgaWYgKHByb3BWYWx1ZSkge1xuICAgICAgY29uZmlnW3Byb3BOYW1lXSA9IHByb3BWYWx1ZTtcbiAgICB9XG4gIH0pO1xuICBpZiAodHlwZW9mIGF1dG9JbnNlcnRTcGFjZUluQnV0dG9uICE9PSAndW5kZWZpbmVkJykge1xuICAgIC8vIG1lcmdlIGRlcHJlY2F0ZWQgYXBpXG4gICAgY29uZmlnLmJ1dHRvbiA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgYXV0b0luc2VydFNwYWNlOiBhdXRvSW5zZXJ0U3BhY2VJbkJ1dHRvblxuICAgIH0sIGNvbmZpZy5idXR0b24pO1xuICB9XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzI3NjE3XG4gIGNvbnN0IG1lbW9lZENvbmZpZyA9IHVzZU1lbW8oKCkgPT4gY29uZmlnLCBjb25maWcsIChwcmV2Q29uZmlnLCBjdXJyZW50Q29uZmlnKSA9PiB7XG4gICAgY29uc3QgcHJldktleXMgPSBPYmplY3Qua2V5cyhwcmV2Q29uZmlnKTtcbiAgICBjb25zdCBjdXJyZW50S2V5cyA9IE9iamVjdC5rZXlzKGN1cnJlbnRDb25maWcpO1xuICAgIHJldHVybiBwcmV2S2V5cy5sZW5ndGggIT09IGN1cnJlbnRLZXlzLmxlbmd0aCB8fCBwcmV2S2V5cy5zb21lKGtleSA9PiBwcmV2Q29uZmlnW2tleV0gIT09IGN1cnJlbnRDb25maWdba2V5XSk7XG4gIH0pO1xuICBjb25zdCB7XG4gICAgbGF5ZXJcbiAgfSA9IFJlYWN0LnVzZUNvbnRleHQoQ3NzSW5Kc1N0eWxlQ29udGV4dCk7XG4gIGNvbnN0IG1lbW9JY29uQ29udGV4dFZhbHVlID0gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIHByZWZpeENsczogaWNvblByZWZpeENscyxcbiAgICBjc3AsXG4gICAgbGF5ZXI6IGxheWVyID8gJ2FudGQnIDogdW5kZWZpbmVkXG4gIH0pLCBbaWNvblByZWZpeENscywgY3NwLCBsYXllcl0pO1xuICBsZXQgY2hpbGROb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFByb3BXYXJuaW5nLCB7XG4gICAgZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoOiBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGhcbiAgfSksIGNoaWxkcmVuKTtcbiAgY29uc3QgdmFsaWRhdGVNZXNzYWdlcyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICByZXR1cm4gbWVyZ2UoKChfYSA9IGRlZmF1bHRMb2NhbGUuRm9ybSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmRlZmF1bHRWYWxpZGF0ZU1lc3NhZ2VzKSB8fCB7fSwgKChfYyA9IChfYiA9IG1lbW9lZENvbmZpZy5sb2NhbGUpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5Gb3JtKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuZGVmYXVsdFZhbGlkYXRlTWVzc2FnZXMpIHx8IHt9LCAoKF9kID0gbWVtb2VkQ29uZmlnLmZvcm0pID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC52YWxpZGF0ZU1lc3NhZ2VzKSB8fCB7fSwgKGZvcm0gPT09IG51bGwgfHwgZm9ybSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZm9ybS52YWxpZGF0ZU1lc3NhZ2VzKSB8fCB7fSk7XG4gIH0sIFttZW1vZWRDb25maWcsIGZvcm0gPT09IG51bGwgfHwgZm9ybSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZm9ybS52YWxpZGF0ZU1lc3NhZ2VzXSk7XG4gIGlmIChPYmplY3Qua2V5cyh2YWxpZGF0ZU1lc3NhZ2VzKS5sZW5ndGggPiAwKSB7XG4gICAgY2hpbGROb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVmFsaWRhdGVNZXNzYWdlc0NvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgIHZhbHVlOiB2YWxpZGF0ZU1lc3NhZ2VzXG4gICAgfSwgY2hpbGROb2RlKTtcbiAgfVxuICBpZiAobG9jYWxlKSB7XG4gICAgY2hpbGROb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTG9jYWxlUHJvdmlkZXIsIHtcbiAgICAgIGxvY2FsZTogbG9jYWxlLFxuICAgICAgX0FOVF9NQVJLX186IEFOVF9NQVJLXG4gICAgfSwgY2hpbGROb2RlKTtcbiAgfVxuICBpZiAoaWNvblByZWZpeENscyB8fCBjc3ApIHtcbiAgICBjaGlsZE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJY29uQ29udGV4dC5Qcm92aWRlciwge1xuICAgICAgdmFsdWU6IG1lbW9JY29uQ29udGV4dFZhbHVlXG4gICAgfSwgY2hpbGROb2RlKTtcbiAgfVxuICBpZiAoY29tcG9uZW50U2l6ZSkge1xuICAgIGNoaWxkTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNpemVDb250ZXh0UHJvdmlkZXIsIHtcbiAgICAgIHNpemU6IGNvbXBvbmVudFNpemVcbiAgICB9LCBjaGlsZE5vZGUpO1xuICB9XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IE1vdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjaGlsZE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChNb3Rpb25XcmFwcGVyLCBudWxsLCBjaGlsZE5vZGUpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBEeW5hbWljIHRoZW1lID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IG1lbW9UaGVtZSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IF9hID0gbWVyZ2VkVGhlbWUgfHwge30sXG4gICAgICB7XG4gICAgICAgIGFsZ29yaXRobSxcbiAgICAgICAgdG9rZW4sXG4gICAgICAgIGNvbXBvbmVudHMsXG4gICAgICAgIGNzc1ZhclxuICAgICAgfSA9IF9hLFxuICAgICAgcmVzdCA9IF9fcmVzdChfYSwgW1wiYWxnb3JpdGhtXCIsIFwidG9rZW5cIiwgXCJjb21wb25lbnRzXCIsIFwiY3NzVmFyXCJdKTtcbiAgICBjb25zdCB0aGVtZU9iaiA9IGFsZ29yaXRobSAmJiAoIUFycmF5LmlzQXJyYXkoYWxnb3JpdGhtKSB8fCBhbGdvcml0aG0ubGVuZ3RoID4gMCkgPyBjcmVhdGVUaGVtZShhbGdvcml0aG0pIDogZGVmYXVsdFRoZW1lO1xuICAgIGNvbnN0IHBhcnNlZENvbXBvbmVudHMgPSB7fTtcbiAgICBPYmplY3QuZW50cmllcyhjb21wb25lbnRzIHx8IHt9KS5mb3JFYWNoKF9yZWYgPT4ge1xuICAgICAgbGV0IFtjb21wb25lbnROYW1lLCBjb21wb25lbnRUb2tlbl0gPSBfcmVmO1xuICAgICAgY29uc3QgcGFyc2VkVG9rZW4gPSBPYmplY3QuYXNzaWduKHt9LCBjb21wb25lbnRUb2tlbik7XG4gICAgICBpZiAoJ2FsZ29yaXRobScgaW4gcGFyc2VkVG9rZW4pIHtcbiAgICAgICAgaWYgKHBhcnNlZFRva2VuLmFsZ29yaXRobSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHBhcnNlZFRva2VuLnRoZW1lID0gdGhlbWVPYmo7XG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShwYXJzZWRUb2tlbi5hbGdvcml0aG0pIHx8IHR5cGVvZiBwYXJzZWRUb2tlbi5hbGdvcml0aG0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBwYXJzZWRUb2tlbi50aGVtZSA9IGNyZWF0ZVRoZW1lKHBhcnNlZFRva2VuLmFsZ29yaXRobSk7XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIHBhcnNlZFRva2VuLmFsZ29yaXRobTtcbiAgICAgIH1cbiAgICAgIHBhcnNlZENvbXBvbmVudHNbY29tcG9uZW50TmFtZV0gPSBwYXJzZWRUb2tlbjtcbiAgICB9KTtcbiAgICBjb25zdCBtZXJnZWRUb2tlbiA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFNlZWRUb2tlbiksIHRva2VuKTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXN0KSwge1xuICAgICAgdGhlbWU6IHRoZW1lT2JqLFxuICAgICAgdG9rZW46IG1lcmdlZFRva2VuLFxuICAgICAgY29tcG9uZW50czogcGFyc2VkQ29tcG9uZW50cyxcbiAgICAgIG92ZXJyaWRlOiBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgb3ZlcnJpZGU6IG1lcmdlZFRva2VuXG4gICAgICB9LCBwYXJzZWRDb21wb25lbnRzKSxcbiAgICAgIGNzc1ZhcjogY3NzVmFyXG4gICAgfSk7XG4gIH0sIFttZXJnZWRUaGVtZV0pO1xuICBpZiAodGhlbWUpIHtcbiAgICBjaGlsZE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEZXNpZ25Ub2tlbkNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgIHZhbHVlOiBtZW1vVGhlbWVcbiAgICB9LCBjaGlsZE5vZGUpO1xuICB9XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gV2FybmluZyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBpZiAobWVtb2VkQ29uZmlnLndhcm5pbmcpIHtcbiAgICBjaGlsZE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChXYXJuaW5nQ29udGV4dC5Qcm92aWRlciwge1xuICAgICAgdmFsdWU6IG1lbW9lZENvbmZpZy53YXJuaW5nXG4gICAgfSwgY2hpbGROb2RlKTtcbiAgfVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgaWYgKGNvbXBvbmVudERpc2FibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjaGlsZE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEaXNhYmxlZENvbnRleHRQcm92aWRlciwge1xuICAgICAgZGlzYWJsZWQ6IGNvbXBvbmVudERpc2FibGVkXG4gICAgfSwgY2hpbGROb2RlKTtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29uZmlnQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBtZW1vZWRDb25maWdcbiAgfSwgY2hpbGROb2RlKTtcbn07XG5jb25zdCBDb25maWdQcm92aWRlciA9IHByb3BzID0+IHtcbiAgY29uc3QgY29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCk7XG4gIGNvbnN0IGFudExvY2FsZSA9IFJlYWN0LnVzZUNvbnRleHQoTG9jYWxlQ29udGV4dCk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQcm92aWRlckNoaWxkcmVuLCBPYmplY3QuYXNzaWduKHtcbiAgICBwYXJlbnRDb250ZXh0OiBjb250ZXh0LFxuICAgIGxlZ2FjeUxvY2FsZTogYW50TG9jYWxlXG4gIH0sIHByb3BzKSk7XG59O1xuQ29uZmlnUHJvdmlkZXIuQ29uZmlnQ29udGV4dCA9IENvbmZpZ0NvbnRleHQ7XG5Db25maWdQcm92aWRlci5TaXplQ29udGV4dCA9IFNpemVDb250ZXh0O1xuQ29uZmlnUHJvdmlkZXIuY29uZmlnID0gc2V0R2xvYmFsQ29uZmlnO1xuQ29uZmlnUHJvdmlkZXIudXNlQ29uZmlnID0gdXNlQ29uZmlnO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbmZpZ1Byb3ZpZGVyLCAnU2l6ZUNvbnRleHQnLCB7XG4gIGdldDogKCkgPT4ge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoZmFsc2UsICdDb25maWdQcm92aWRlcicsICdDb25maWdQcm92aWRlci5TaXplQ29udGV4dCBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIGBDb25maWdQcm92aWRlci51c2VDb25maWcoKS5jb21wb25lbnRTaXplYCBpbnN0ZWFkLicpIDogdm9pZCAwO1xuICAgIHJldHVybiBTaXplQ29udGV4dDtcbiAgfVxufSk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBDb25maWdQcm92aWRlci5kaXNwbGF5TmFtZSA9ICdDb25maWdQcm92aWRlcic7XG59XG5leHBvcnQgZGVmYXVsdCBDb25maWdQcm92aWRlcjsiLCAiZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKHIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkocikpIHJldHVybiByO1xufVxuZXhwb3J0IHsgX2FycmF5V2l0aEhvbGVzIGFzIGRlZmF1bHQgfTsiLCAiZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KHIsIGwpIHtcbiAgdmFyIHQgPSBudWxsID09IHIgPyBudWxsIDogXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgU3ltYm9sICYmIHJbU3ltYm9sLml0ZXJhdG9yXSB8fCByW1wiQEBpdGVyYXRvclwiXTtcbiAgaWYgKG51bGwgIT0gdCkge1xuICAgIHZhciBlLFxuICAgICAgbixcbiAgICAgIGksXG4gICAgICB1LFxuICAgICAgYSA9IFtdLFxuICAgICAgZiA9ICEwLFxuICAgICAgbyA9ICExO1xuICAgIHRyeSB7XG4gICAgICBpZiAoaSA9ICh0ID0gdC5jYWxsKHIpKS5uZXh0LCAwID09PSBsKSB7XG4gICAgICAgIGlmIChPYmplY3QodCkgIT09IHQpIHJldHVybjtcbiAgICAgICAgZiA9ICExO1xuICAgICAgfSBlbHNlIGZvciAoOyAhKGYgPSAoZSA9IGkuY2FsbCh0KSkuZG9uZSkgJiYgKGEucHVzaChlLnZhbHVlKSwgYS5sZW5ndGggIT09IGwpOyBmID0gITApO1xuICAgIH0gY2F0Y2ggKHIpIHtcbiAgICAgIG8gPSAhMCwgbiA9IHI7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghZiAmJiBudWxsICE9IHRbXCJyZXR1cm5cIl0gJiYgKHUgPSB0W1wicmV0dXJuXCJdKCksIE9iamVjdCh1KSAhPT0gdSkpIHJldHVybjtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChvKSB0aHJvdyBuO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYTtcbiAgfVxufVxuZXhwb3J0IHsgX2l0ZXJhYmxlVG9BcnJheUxpbWl0IGFzIGRlZmF1bHQgfTsiLCAiZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbn1cbmV4cG9ydCB7IF9ub25JdGVyYWJsZVJlc3QgYXMgZGVmYXVsdCB9OyIsICJpbXBvcnQgYXJyYXlXaXRoSG9sZXMgZnJvbSBcIi4vYXJyYXlXaXRoSG9sZXMuanNcIjtcbmltcG9ydCBpdGVyYWJsZVRvQXJyYXlMaW1pdCBmcm9tIFwiLi9pdGVyYWJsZVRvQXJyYXlMaW1pdC5qc1wiO1xuaW1wb3J0IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IGZyb20gXCIuL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5LmpzXCI7XG5pbXBvcnQgbm9uSXRlcmFibGVSZXN0IGZyb20gXCIuL25vbkl0ZXJhYmxlUmVzdC5qc1wiO1xuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkociwgZSkge1xuICByZXR1cm4gYXJyYXlXaXRoSG9sZXMocikgfHwgaXRlcmFibGVUb0FycmF5TGltaXQociwgZSkgfHwgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkociwgZSkgfHwgbm9uSXRlcmFibGVSZXN0KCk7XG59XG5leHBvcnQgeyBfc2xpY2VkVG9BcnJheSBhcyBkZWZhdWx0IH07IiwgIi8qIGVzbGludC1kaXNhYmxlICovXG4vLyBJbnNwaXJlZCBieSBodHRwczovL2dpdGh1Yi5jb20vZ2FyeWNvdXJ0L211cm11cmhhc2gtanNcbi8vIFBvcnRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9hYXBwbGVieS9zbWhhc2hlci9ibG9iLzYxYTA1MzBmMjgyNzdmMmU4NTBiZmMzOTYwMGNlNjFkMDJiNTE4ZGUvc3JjL011cm11ckhhc2gyLmNwcCNMMzctTDg2XG5mdW5jdGlvbiBtdXJtdXIyKHN0cikge1xuICAvLyAnbScgYW5kICdyJyBhcmUgbWl4aW5nIGNvbnN0YW50cyBnZW5lcmF0ZWQgb2ZmbGluZS5cbiAgLy8gVGhleSdyZSBub3QgcmVhbGx5ICdtYWdpYycsIHRoZXkganVzdCBoYXBwZW4gdG8gd29yayB3ZWxsLlxuICAvLyBjb25zdCBtID0gMHg1YmQxZTk5NTtcbiAgLy8gY29uc3QgciA9IDI0O1xuICAvLyBJbml0aWFsaXplIHRoZSBoYXNoXG4gIHZhciBoID0gMDsgLy8gTWl4IDQgYnl0ZXMgYXQgYSB0aW1lIGludG8gdGhlIGhhc2hcblxuICB2YXIgayxcbiAgICAgIGkgPSAwLFxuICAgICAgbGVuID0gc3RyLmxlbmd0aDtcblxuICBmb3IgKDsgbGVuID49IDQ7ICsraSwgbGVuIC09IDQpIHtcbiAgICBrID0gc3RyLmNoYXJDb2RlQXQoaSkgJiAweGZmIHwgKHN0ci5jaGFyQ29kZUF0KCsraSkgJiAweGZmKSA8PCA4IHwgKHN0ci5jaGFyQ29kZUF0KCsraSkgJiAweGZmKSA8PCAxNiB8IChzdHIuY2hhckNvZGVBdCgrK2kpICYgMHhmZikgPDwgMjQ7XG4gICAgayA9XG4gICAgLyogTWF0aC5pbXVsKGssIG0pOiAqL1xuICAgIChrICYgMHhmZmZmKSAqIDB4NWJkMWU5OTUgKyAoKGsgPj4+IDE2KSAqIDB4ZTk5NSA8PCAxNik7XG4gICAgayBePVxuICAgIC8qIGsgPj4+IHI6ICovXG4gICAgayA+Pj4gMjQ7XG4gICAgaCA9XG4gICAgLyogTWF0aC5pbXVsKGssIG0pOiAqL1xuICAgIChrICYgMHhmZmZmKSAqIDB4NWJkMWU5OTUgKyAoKGsgPj4+IDE2KSAqIDB4ZTk5NSA8PCAxNikgXlxuICAgIC8qIE1hdGguaW11bChoLCBtKTogKi9cbiAgICAoaCAmIDB4ZmZmZikgKiAweDViZDFlOTk1ICsgKChoID4+PiAxNikgKiAweGU5OTUgPDwgMTYpO1xuICB9IC8vIEhhbmRsZSB0aGUgbGFzdCBmZXcgYnl0ZXMgb2YgdGhlIGlucHV0IGFycmF5XG5cblxuICBzd2l0Y2ggKGxlbikge1xuICAgIGNhc2UgMzpcbiAgICAgIGggXj0gKHN0ci5jaGFyQ29kZUF0KGkgKyAyKSAmIDB4ZmYpIDw8IDE2O1xuXG4gICAgY2FzZSAyOlxuICAgICAgaCBePSAoc3RyLmNoYXJDb2RlQXQoaSArIDEpICYgMHhmZikgPDwgODtcblxuICAgIGNhc2UgMTpcbiAgICAgIGggXj0gc3RyLmNoYXJDb2RlQXQoaSkgJiAweGZmO1xuICAgICAgaCA9XG4gICAgICAvKiBNYXRoLmltdWwoaCwgbSk6ICovXG4gICAgICAoaCAmIDB4ZmZmZikgKiAweDViZDFlOTk1ICsgKChoID4+PiAxNikgKiAweGU5OTUgPDwgMTYpO1xuICB9IC8vIERvIGEgZmV3IGZpbmFsIG1peGVzIG9mIHRoZSBoYXNoIHRvIGVuc3VyZSB0aGUgbGFzdCBmZXdcbiAgLy8gYnl0ZXMgYXJlIHdlbGwtaW5jb3Jwb3JhdGVkLlxuXG5cbiAgaCBePSBoID4+PiAxMztcbiAgaCA9XG4gIC8qIE1hdGguaW11bChoLCBtKTogKi9cbiAgKGggJiAweGZmZmYpICogMHg1YmQxZTk5NSArICgoaCA+Pj4gMTYpICogMHhlOTk1IDw8IDE2KTtcbiAgcmV0dXJuICgoaCBeIGggPj4+IDE1KSA+Pj4gMCkudG9TdHJpbmcoMzYpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBtdXJtdXIyO1xuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNhblVzZURvbSgpIHtcbiAgcmV0dXJuICEhKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kb2N1bWVudCAmJiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG59IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbnRhaW5zKHJvb3QsIG4pIHtcbiAgaWYgKCFyb290KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gVXNlIG5hdGl2ZSBpZiBzdXBwb3J0XG4gIGlmIChyb290LmNvbnRhaW5zKSB7XG4gICAgcmV0dXJuIHJvb3QuY29udGFpbnMobik7XG4gIH1cblxuICAvLyBgZG9jdW1lbnQuY29udGFpbnNgIG5vdCBzdXBwb3J0IHdpdGggSUUxMVxuICB2YXIgbm9kZSA9IG47XG4gIHdoaWxlIChub2RlKSB7XG4gICAgaWYgKG5vZGUgPT09IHJvb3QpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn0iLCAiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBjYW5Vc2VEb20gZnJvbSBcIi4vY2FuVXNlRG9tXCI7XG5pbXBvcnQgY29udGFpbnMgZnJvbSBcIi4vY29udGFpbnNcIjtcbnZhciBBUFBFTkRfT1JERVIgPSAnZGF0YS1yYy1vcmRlcic7XG52YXIgQVBQRU5EX1BSSU9SSVRZID0gJ2RhdGEtcmMtcHJpb3JpdHknO1xudmFyIE1BUktfS0VZID0gXCJyYy11dGlsLWtleVwiO1xudmFyIGNvbnRhaW5lckNhY2hlID0gbmV3IE1hcCgpO1xuZnVuY3Rpb24gZ2V0TWFyaygpIHtcbiAgdmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9LFxuICAgIG1hcmsgPSBfcmVmLm1hcms7XG4gIGlmIChtYXJrKSB7XG4gICAgcmV0dXJuIG1hcmsuc3RhcnRzV2l0aCgnZGF0YS0nKSA/IG1hcmsgOiBcImRhdGEtXCIuY29uY2F0KG1hcmspO1xuICB9XG4gIHJldHVybiBNQVJLX0tFWTtcbn1cbmZ1bmN0aW9uIGdldENvbnRhaW5lcihvcHRpb24pIHtcbiAgaWYgKG9wdGlvbi5hdHRhY2hUbykge1xuICAgIHJldHVybiBvcHRpb24uYXR0YWNoVG87XG4gIH1cbiAgdmFyIGhlYWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdoZWFkJyk7XG4gIHJldHVybiBoZWFkIHx8IGRvY3VtZW50LmJvZHk7XG59XG5mdW5jdGlvbiBnZXRPcmRlcihwcmVwZW5kKSB7XG4gIGlmIChwcmVwZW5kID09PSAncXVldWUnKSB7XG4gICAgcmV0dXJuICdwcmVwZW5kUXVldWUnO1xuICB9XG4gIHJldHVybiBwcmVwZW5kID8gJ3ByZXBlbmQnIDogJ2FwcGVuZCc7XG59XG5cbi8qKlxuICogRmluZCBzdHlsZSB3aGljaCBpbmplY3QgYnkgcmMtdXRpbFxuICovXG5mdW5jdGlvbiBmaW5kU3R5bGVzKGNvbnRhaW5lcikge1xuICByZXR1cm4gQXJyYXkuZnJvbSgoY29udGFpbmVyQ2FjaGUuZ2V0KGNvbnRhaW5lcikgfHwgY29udGFpbmVyKS5jaGlsZHJlbikuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUudGFnTmFtZSA9PT0gJ1NUWUxFJztcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0Q1NTKGNzcykge1xuICB2YXIgb3B0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgaWYgKCFjYW5Vc2VEb20oKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBjc3AgPSBvcHRpb24uY3NwLFxuICAgIHByZXBlbmQgPSBvcHRpb24ucHJlcGVuZCxcbiAgICBfb3B0aW9uJHByaW9yaXR5ID0gb3B0aW9uLnByaW9yaXR5LFxuICAgIHByaW9yaXR5ID0gX29wdGlvbiRwcmlvcml0eSA9PT0gdm9pZCAwID8gMCA6IF9vcHRpb24kcHJpb3JpdHk7XG4gIHZhciBtZXJnZWRPcmRlciA9IGdldE9yZGVyKHByZXBlbmQpO1xuICB2YXIgaXNQcmVwZW5kUXVldWUgPSBtZXJnZWRPcmRlciA9PT0gJ3ByZXBlbmRRdWV1ZSc7XG4gIHZhciBzdHlsZU5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICBzdHlsZU5vZGUuc2V0QXR0cmlidXRlKEFQUEVORF9PUkRFUiwgbWVyZ2VkT3JkZXIpO1xuICBpZiAoaXNQcmVwZW5kUXVldWUgJiYgcHJpb3JpdHkpIHtcbiAgICBzdHlsZU5vZGUuc2V0QXR0cmlidXRlKEFQUEVORF9QUklPUklUWSwgXCJcIi5jb25jYXQocHJpb3JpdHkpKTtcbiAgfVxuICBpZiAoY3NwICE9PSBudWxsICYmIGNzcCAhPT0gdm9pZCAwICYmIGNzcC5ub25jZSkge1xuICAgIHN0eWxlTm9kZS5ub25jZSA9IGNzcCA9PT0gbnVsbCB8fCBjc3AgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNzcC5ub25jZTtcbiAgfVxuICBzdHlsZU5vZGUuaW5uZXJIVE1MID0gY3NzO1xuICB2YXIgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKG9wdGlvbik7XG4gIHZhciBmaXJzdENoaWxkID0gY29udGFpbmVyLmZpcnN0Q2hpbGQ7XG4gIGlmIChwcmVwZW5kKSB7XG4gICAgLy8gSWYgaXMgcXVldWUgYHByZXBlbmRgLCBpdCB3aWxsIHByZXBlbmQgZmlyc3Qgc3R5bGUgYW5kIHRoZW4gYXBwZW5kIHJlc3Qgc3R5bGVcbiAgICBpZiAoaXNQcmVwZW5kUXVldWUpIHtcbiAgICAgIHZhciBleGlzdFN0eWxlID0gKG9wdGlvbi5zdHlsZXMgfHwgZmluZFN0eWxlcyhjb250YWluZXIpKS5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgLy8gSWdub3JlIHN0eWxlIHdoaWNoIG5vdCBpbmplY3RlZCBieSByYy11dGlsIHdpdGggcHJlcGVuZFxuICAgICAgICBpZiAoIVsncHJlcGVuZCcsICdwcmVwZW5kUXVldWUnXS5pbmNsdWRlcyhub2RlLmdldEF0dHJpYnV0ZShBUFBFTkRfT1JERVIpKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElnbm9yZSBzdHlsZSB3aGljaCBwcmlvcml0eSBsZXNzIHRoZW4gbmV3IHN0eWxlXG4gICAgICAgIHZhciBub2RlUHJpb3JpdHkgPSBOdW1iZXIobm9kZS5nZXRBdHRyaWJ1dGUoQVBQRU5EX1BSSU9SSVRZKSB8fCAwKTtcbiAgICAgICAgcmV0dXJuIHByaW9yaXR5ID49IG5vZGVQcmlvcml0eTtcbiAgICAgIH0pO1xuICAgICAgaWYgKGV4aXN0U3R5bGUubGVuZ3RoKSB7XG4gICAgICAgIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUoc3R5bGVOb2RlLCBleGlzdFN0eWxlW2V4aXN0U3R5bGUubGVuZ3RoIC0gMV0ubmV4dFNpYmxpbmcpO1xuICAgICAgICByZXR1cm4gc3R5bGVOb2RlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVzZSBgaW5zZXJ0QmVmb3JlYCBhcyBgcHJlcGVuZGBcbiAgICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKHN0eWxlTm9kZSwgZmlyc3RDaGlsZCk7XG4gIH0gZWxzZSB7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHN0eWxlTm9kZSk7XG4gIH1cbiAgcmV0dXJuIHN0eWxlTm9kZTtcbn1cbmZ1bmN0aW9uIGZpbmRFeGlzdE5vZGUoa2V5KSB7XG4gIHZhciBvcHRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICB2YXIgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKG9wdGlvbik7XG4gIHJldHVybiAob3B0aW9uLnN0eWxlcyB8fCBmaW5kU3R5bGVzKGNvbnRhaW5lcikpLmZpbmQoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5nZXRBdHRyaWJ1dGUoZ2V0TWFyayhvcHRpb24pKSA9PT0ga2V5O1xuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVDU1Moa2V5KSB7XG4gIHZhciBvcHRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICB2YXIgZXhpc3ROb2RlID0gZmluZEV4aXN0Tm9kZShrZXksIG9wdGlvbik7XG4gIGlmIChleGlzdE5vZGUpIHtcbiAgICB2YXIgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKG9wdGlvbik7XG4gICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKGV4aXN0Tm9kZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBxaWFua3VuIHdpbGwgaW5qZWN0IGBhcHBlbmRDaGlsZGAgdG8gaW5zZXJ0IGludG8gb3RoZXJcbiAqL1xuZnVuY3Rpb24gc3luY1JlYWxDb250YWluZXIoY29udGFpbmVyLCBvcHRpb24pIHtcbiAgdmFyIGNhY2hlZFJlYWxDb250YWluZXIgPSBjb250YWluZXJDYWNoZS5nZXQoY29udGFpbmVyKTtcblxuICAvLyBGaW5kIHJlYWwgY29udGFpbmVyIHdoZW4gbm90IGNhY2hlZCBvciBjYWNoZWQgY29udGFpbmVyIHJlbW92ZWRcbiAgaWYgKCFjYWNoZWRSZWFsQ29udGFpbmVyIHx8ICFjb250YWlucyhkb2N1bWVudCwgY2FjaGVkUmVhbENvbnRhaW5lcikpIHtcbiAgICB2YXIgcGxhY2Vob2xkZXJTdHlsZSA9IGluamVjdENTUygnJywgb3B0aW9uKTtcbiAgICB2YXIgcGFyZW50Tm9kZSA9IHBsYWNlaG9sZGVyU3R5bGUucGFyZW50Tm9kZTtcbiAgICBjb250YWluZXJDYWNoZS5zZXQoY29udGFpbmVyLCBwYXJlbnROb2RlKTtcbiAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQocGxhY2Vob2xkZXJTdHlsZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBtYW51YWxseSBjbGVhciBjb250YWluZXIgY2FjaGUgdG8gYXZvaWQgZ2xvYmFsIGNhY2hlIGluIHVuaXQgdGVzdGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckNvbnRhaW5lckNhY2hlKCkge1xuICBjb250YWluZXJDYWNoZS5jbGVhcigpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUNTUyhjc3MsIGtleSkge1xuICB2YXIgb3JpZ2luT3B0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgdmFyIGNvbnRhaW5lciA9IGdldENvbnRhaW5lcihvcmlnaW5PcHRpb24pO1xuICB2YXIgc3R5bGVzID0gZmluZFN0eWxlcyhjb250YWluZXIpO1xuICB2YXIgb3B0aW9uID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBvcmlnaW5PcHRpb24pLCB7fSwge1xuICAgIHN0eWxlczogc3R5bGVzXG4gIH0pO1xuXG4gIC8vIFN5bmMgcmVhbCBwYXJlbnRcbiAgc3luY1JlYWxDb250YWluZXIoY29udGFpbmVyLCBvcHRpb24pO1xuICB2YXIgZXhpc3ROb2RlID0gZmluZEV4aXN0Tm9kZShrZXksIG9wdGlvbik7XG4gIGlmIChleGlzdE5vZGUpIHtcbiAgICB2YXIgX29wdGlvbiRjc3AsIF9vcHRpb24kY3NwMjtcbiAgICBpZiAoKF9vcHRpb24kY3NwID0gb3B0aW9uLmNzcCkgIT09IG51bGwgJiYgX29wdGlvbiRjc3AgIT09IHZvaWQgMCAmJiBfb3B0aW9uJGNzcC5ub25jZSAmJiBleGlzdE5vZGUubm9uY2UgIT09ICgoX29wdGlvbiRjc3AyID0gb3B0aW9uLmNzcCkgPT09IG51bGwgfHwgX29wdGlvbiRjc3AyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9uJGNzcDIubm9uY2UpKSB7XG4gICAgICB2YXIgX29wdGlvbiRjc3AzO1xuICAgICAgZXhpc3ROb2RlLm5vbmNlID0gKF9vcHRpb24kY3NwMyA9IG9wdGlvbi5jc3ApID09PSBudWxsIHx8IF9vcHRpb24kY3NwMyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29wdGlvbiRjc3AzLm5vbmNlO1xuICAgIH1cbiAgICBpZiAoZXhpc3ROb2RlLmlubmVySFRNTCAhPT0gY3NzKSB7XG4gICAgICBleGlzdE5vZGUuaW5uZXJIVE1MID0gY3NzO1xuICAgIH1cbiAgICByZXR1cm4gZXhpc3ROb2RlO1xuICB9XG4gIHZhciBuZXdOb2RlID0gaW5qZWN0Q1NTKGNzcywgb3B0aW9uKTtcbiAgbmV3Tm9kZS5zZXRBdHRyaWJ1dGUoZ2V0TWFyayhvcHRpb24pLCBrZXkpO1xuICByZXR1cm4gbmV3Tm9kZTtcbn0iLCAiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBoYXNoIGZyb20gJ0BlbW90aW9uL2hhc2gnO1xuaW1wb3J0IHsgdXBkYXRlQ1NTIH0gZnJvbSBcInJjLXV0aWwvZXMvRG9tL2R5bmFtaWNDU1NcIjtcbmltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgU3R5bGVDb250ZXh0LCB7IEFUVFJfTUFSSywgQVRUUl9UT0tFTiwgQ1NTX0lOX0pTX0lOU1RBTkNFIH0gZnJvbSBcIi4uL1N0eWxlQ29udGV4dFwiO1xuaW1wb3J0IHsgZmxhdHRlblRva2VuLCBtZW1vUmVzdWx0LCB0b2tlbjJrZXksIHRvU3R5bGVTdHIgfSBmcm9tIFwiLi4vdXRpbFwiO1xuaW1wb3J0IHsgdHJhbnNmb3JtVG9rZW4gfSBmcm9tIFwiLi4vdXRpbC9jc3MtdmFyaWFibGVzXCI7XG5pbXBvcnQgdXNlR2xvYmFsQ2FjaGUgZnJvbSBcIi4vdXNlR2xvYmFsQ2FjaGVcIjtcbnZhciBFTVBUWV9PVkVSUklERSA9IHt9O1xuXG4vLyBHZW5lcmF0ZSBkaWZmZXJlbnQgcHJlZml4IHRvIG1ha2UgdXNlciBzZWxlY3RvciBicmVhayBpbiBwcm9kdWN0aW9uIGVudi5cbi8vIFRoaXMgaGVscHMgZGV2ZWxvcGVyIG5vdCB0byBkbyBzdHlsZSBvdmVycmlkZSBkaXJlY3RseSBvbiB0aGUgaGFzaCBpZC5cbnZhciBoYXNoUHJlZml4ID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/ICdjc3MtZGV2LW9ubHktZG8tbm90LW92ZXJyaWRlJyA6ICdjc3MnO1xudmFyIHRva2VuS2V5cyA9IG5ldyBNYXAoKTtcbmZ1bmN0aW9uIHJlY29yZENsZWFuVG9rZW4odG9rZW5LZXkpIHtcbiAgdG9rZW5LZXlzLnNldCh0b2tlbktleSwgKHRva2VuS2V5cy5nZXQodG9rZW5LZXkpIHx8IDApICsgMSk7XG59XG5mdW5jdGlvbiByZW1vdmVTdHlsZVRhZ3Moa2V5LCBpbnN0YW5jZUlkKSB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgdmFyIHN0eWxlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJzdHlsZVtcIi5jb25jYXQoQVRUUl9UT0tFTiwgXCI9XFxcIlwiKS5jb25jYXQoa2V5LCBcIlxcXCJdXCIpKTtcbiAgICBzdHlsZXMuZm9yRWFjaChmdW5jdGlvbiAoc3R5bGUpIHtcbiAgICAgIGlmIChzdHlsZVtDU1NfSU5fSlNfSU5TVEFOQ0VdID09PSBpbnN0YW5jZUlkKSB7XG4gICAgICAgIHZhciBfc3R5bGUkcGFyZW50Tm9kZTtcbiAgICAgICAgKF9zdHlsZSRwYXJlbnROb2RlID0gc3R5bGUucGFyZW50Tm9kZSkgPT09IG51bGwgfHwgX3N0eWxlJHBhcmVudE5vZGUgPT09IHZvaWQgMCB8fCBfc3R5bGUkcGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzdHlsZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbnZhciBUT0tFTl9USFJFU0hPTEQgPSAwO1xuXG4vLyBSZW1vdmUgd2lsbCBjaGVjayBjdXJyZW50IGtleXMgZmlyc3RcbmZ1bmN0aW9uIGNsZWFuVG9rZW5TdHlsZSh0b2tlbktleSwgaW5zdGFuY2VJZCkge1xuICB0b2tlbktleXMuc2V0KHRva2VuS2V5LCAodG9rZW5LZXlzLmdldCh0b2tlbktleSkgfHwgMCkgLSAxKTtcbiAgdmFyIHRva2VuS2V5TGlzdCA9IEFycmF5LmZyb20odG9rZW5LZXlzLmtleXMoKSk7XG4gIHZhciBjbGVhbmFibGVLZXlMaXN0ID0gdG9rZW5LZXlMaXN0LmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIGNvdW50ID0gdG9rZW5LZXlzLmdldChrZXkpIHx8IDA7XG4gICAgcmV0dXJuIGNvdW50IDw9IDA7XG4gIH0pO1xuXG4gIC8vIFNob3VsZCBrZWVwIHRva2VucyB1bmRlciB0aHJlc2hvbGQgZm9yIG5vdCB0byBpbnNlcnQgc3R5bGUgdG9vIG9mdGVuXG4gIGlmICh0b2tlbktleUxpc3QubGVuZ3RoIC0gY2xlYW5hYmxlS2V5TGlzdC5sZW5ndGggPiBUT0tFTl9USFJFU0hPTEQpIHtcbiAgICBjbGVhbmFibGVLZXlMaXN0LmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgcmVtb3ZlU3R5bGVUYWdzKGtleSwgaW5zdGFuY2VJZCk7XG4gICAgICB0b2tlbktleXMuZGVsZXRlKGtleSk7XG4gICAgfSk7XG4gIH1cbn1cbmV4cG9ydCB2YXIgZ2V0Q29tcHV0ZWRUb2tlbiA9IGZ1bmN0aW9uIGdldENvbXB1dGVkVG9rZW4ob3JpZ2luVG9rZW4sIG92ZXJyaWRlVG9rZW4sIHRoZW1lLCBmb3JtYXQpIHtcbiAgdmFyIGRlcml2YXRpdmVUb2tlbiA9IHRoZW1lLmdldERlcml2YXRpdmVUb2tlbihvcmlnaW5Ub2tlbik7XG5cbiAgLy8gTWVyZ2Ugd2l0aCBvdmVycmlkZVxuICB2YXIgbWVyZ2VkRGVyaXZhdGl2ZVRva2VuID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBkZXJpdmF0aXZlVG9rZW4pLCBvdmVycmlkZVRva2VuKTtcblxuICAvLyBGb3JtYXQgaWYgbmVlZGVkXG4gIGlmIChmb3JtYXQpIHtcbiAgICBtZXJnZWREZXJpdmF0aXZlVG9rZW4gPSBmb3JtYXQobWVyZ2VkRGVyaXZhdGl2ZVRva2VuKTtcbiAgfVxuICByZXR1cm4gbWVyZ2VkRGVyaXZhdGl2ZVRva2VuO1xufTtcbmV4cG9ydCB2YXIgVE9LRU5fUFJFRklYID0gJ3Rva2VuJztcbi8qKlxuICogQ2FjaGUgdGhlbWUgZGVyaXZhdGl2ZSB0b2tlbiBhcyBnbG9iYWwgc2hhcmVkIG9uZVxuICogQHBhcmFtIHRoZW1lIFRoZW1lIGVudGl0eVxuICogQHBhcmFtIHRva2VucyBMaXN0IG9mIHRva2VucywgdXNlZCBmb3IgY2FjaGUuIFBsZWFzZSBkbyBub3QgZHluYW1pYyBnZW5lcmF0ZSBvYmplY3QgZGlyZWN0bHlcbiAqIEBwYXJhbSBvcHRpb24gQWRkaXRpb25hbCBjb25maWdcbiAqIEByZXR1cm5zIENhbGwgVGhlbWUuZ2V0RGVyaXZhdGl2ZVRva2VuKHRva2VuT2JqZWN0KSB0byBnZXQgdG9rZW5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlQ2FjaGVUb2tlbih0aGVtZSwgdG9rZW5zKSB7XG4gIHZhciBvcHRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICB2YXIgX3VzZUNvbnRleHQgPSB1c2VDb250ZXh0KFN0eWxlQ29udGV4dCksXG4gICAgaW5zdGFuY2VJZCA9IF91c2VDb250ZXh0LmNhY2hlLmluc3RhbmNlSWQsXG4gICAgY29udGFpbmVyID0gX3VzZUNvbnRleHQuY29udGFpbmVyO1xuICB2YXIgX29wdGlvbiRzYWx0ID0gb3B0aW9uLnNhbHQsXG4gICAgc2FsdCA9IF9vcHRpb24kc2FsdCA9PT0gdm9pZCAwID8gJycgOiBfb3B0aW9uJHNhbHQsXG4gICAgX29wdGlvbiRvdmVycmlkZSA9IG9wdGlvbi5vdmVycmlkZSxcbiAgICBvdmVycmlkZSA9IF9vcHRpb24kb3ZlcnJpZGUgPT09IHZvaWQgMCA/IEVNUFRZX09WRVJSSURFIDogX29wdGlvbiRvdmVycmlkZSxcbiAgICBmb3JtYXRUb2tlbiA9IG9wdGlvbi5mb3JtYXRUb2tlbixcbiAgICBjb21wdXRlID0gb3B0aW9uLmdldENvbXB1dGVkVG9rZW4sXG4gICAgY3NzVmFyID0gb3B0aW9uLmNzc1ZhcjtcblxuICAvLyBCYXNpYyAtIFdlIGRvIGJhc2ljIGNhY2hlIGhlcmVcbiAgdmFyIG1lcmdlZFRva2VuID0gbWVtb1Jlc3VsdChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24uYXBwbHkoT2JqZWN0LCBbe31dLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkodG9rZW5zKSkpO1xuICB9LCB0b2tlbnMpO1xuICB2YXIgdG9rZW5TdHIgPSBmbGF0dGVuVG9rZW4obWVyZ2VkVG9rZW4pO1xuICB2YXIgb3ZlcnJpZGVUb2tlblN0ciA9IGZsYXR0ZW5Ub2tlbihvdmVycmlkZSk7XG4gIHZhciBjc3NWYXJTdHIgPSBjc3NWYXIgPyBmbGF0dGVuVG9rZW4oY3NzVmFyKSA6ICcnO1xuICB2YXIgY2FjaGVkVG9rZW4gPSB1c2VHbG9iYWxDYWNoZShUT0tFTl9QUkVGSVgsIFtzYWx0LCB0aGVtZS5pZCwgdG9rZW5TdHIsIG92ZXJyaWRlVG9rZW5TdHIsIGNzc1ZhclN0cl0sIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX2Nzc1ZhciRrZXk7XG4gICAgdmFyIG1lcmdlZERlcml2YXRpdmVUb2tlbiA9IGNvbXB1dGUgPyBjb21wdXRlKG1lcmdlZFRva2VuLCBvdmVycmlkZSwgdGhlbWUpIDogZ2V0Q29tcHV0ZWRUb2tlbihtZXJnZWRUb2tlbiwgb3ZlcnJpZGUsIHRoZW1lLCBmb3JtYXRUb2tlbik7XG5cbiAgICAvLyBSZXBsYWNlIHRva2VuIHZhbHVlIHdpdGggY3NzIHZhcmlhYmxlc1xuICAgIHZhciBhY3R1YWxUb2tlbiA9IF9vYmplY3RTcHJlYWQoe30sIG1lcmdlZERlcml2YXRpdmVUb2tlbik7XG4gICAgdmFyIGNzc1ZhcnNTdHIgPSAnJztcbiAgICBpZiAoISFjc3NWYXIpIHtcbiAgICAgIHZhciBfdHJhbnNmb3JtVG9rZW4gPSB0cmFuc2Zvcm1Ub2tlbihtZXJnZWREZXJpdmF0aXZlVG9rZW4sIGNzc1Zhci5rZXksIHtcbiAgICAgICAgcHJlZml4OiBjc3NWYXIucHJlZml4LFxuICAgICAgICBpZ25vcmU6IGNzc1Zhci5pZ25vcmUsXG4gICAgICAgIHVuaXRsZXNzOiBjc3NWYXIudW5pdGxlc3MsXG4gICAgICAgIHByZXNlcnZlOiBjc3NWYXIucHJlc2VydmVcbiAgICAgIH0pO1xuICAgICAgdmFyIF90cmFuc2Zvcm1Ub2tlbjIgPSBfc2xpY2VkVG9BcnJheShfdHJhbnNmb3JtVG9rZW4sIDIpO1xuICAgICAgbWVyZ2VkRGVyaXZhdGl2ZVRva2VuID0gX3RyYW5zZm9ybVRva2VuMlswXTtcbiAgICAgIGNzc1ZhcnNTdHIgPSBfdHJhbnNmb3JtVG9rZW4yWzFdO1xuICAgIH1cblxuICAgIC8vIE9wdGltaXplIGZvciBgdXNlU3R5bGVSZWdpc3RlcmAgcGVyZm9ybWFuY2VcbiAgICB2YXIgdG9rZW5LZXkgPSB0b2tlbjJrZXkobWVyZ2VkRGVyaXZhdGl2ZVRva2VuLCBzYWx0KTtcbiAgICBtZXJnZWREZXJpdmF0aXZlVG9rZW4uX3Rva2VuS2V5ID0gdG9rZW5LZXk7XG4gICAgYWN0dWFsVG9rZW4uX3Rva2VuS2V5ID0gdG9rZW4ya2V5KGFjdHVhbFRva2VuLCBzYWx0KTtcbiAgICB2YXIgdGhlbWVLZXkgPSAoX2Nzc1ZhciRrZXkgPSBjc3NWYXIgPT09IG51bGwgfHwgY3NzVmFyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjc3NWYXIua2V5KSAhPT0gbnVsbCAmJiBfY3NzVmFyJGtleSAhPT0gdm9pZCAwID8gX2Nzc1ZhciRrZXkgOiB0b2tlbktleTtcbiAgICBtZXJnZWREZXJpdmF0aXZlVG9rZW4uX3RoZW1lS2V5ID0gdGhlbWVLZXk7XG4gICAgcmVjb3JkQ2xlYW5Ub2tlbih0aGVtZUtleSk7XG4gICAgdmFyIGhhc2hJZCA9IFwiXCIuY29uY2F0KGhhc2hQcmVmaXgsIFwiLVwiKS5jb25jYXQoaGFzaCh0b2tlbktleSkpO1xuICAgIG1lcmdlZERlcml2YXRpdmVUb2tlbi5faGFzaElkID0gaGFzaElkOyAvLyBOb3QgdXNlZFxuXG4gICAgcmV0dXJuIFttZXJnZWREZXJpdmF0aXZlVG9rZW4sIGhhc2hJZCwgYWN0dWFsVG9rZW4sIGNzc1ZhcnNTdHIsIChjc3NWYXIgPT09IG51bGwgfHwgY3NzVmFyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjc3NWYXIua2V5KSB8fCAnJ107XG4gIH0sIGZ1bmN0aW9uIChjYWNoZSkge1xuICAgIC8vIFJlbW92ZSB0b2tlbiB3aWxsIHJlbW92ZSBhbGwgcmVsYXRlZCBzdHlsZVxuICAgIGNsZWFuVG9rZW5TdHlsZShjYWNoZVswXS5fdGhlbWVLZXksIGluc3RhbmNlSWQpO1xuICB9LCBmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBfcmVmMiA9IF9zbGljZWRUb0FycmF5KF9yZWYsIDQpLFxuICAgICAgdG9rZW4gPSBfcmVmMlswXSxcbiAgICAgIGNzc1ZhcnNTdHIgPSBfcmVmMlszXTtcbiAgICBpZiAoY3NzVmFyICYmIGNzc1ZhcnNTdHIpIHtcbiAgICAgIHZhciBzdHlsZSA9IHVwZGF0ZUNTUyhjc3NWYXJzU3RyLCBoYXNoKFwiY3NzLXZhcmlhYmxlcy1cIi5jb25jYXQodG9rZW4uX3RoZW1lS2V5KSksIHtcbiAgICAgICAgbWFyazogQVRUUl9NQVJLLFxuICAgICAgICBwcmVwZW5kOiAncXVldWUnLFxuICAgICAgICBhdHRhY2hUbzogY29udGFpbmVyLFxuICAgICAgICBwcmlvcml0eTogLTk5OVxuICAgICAgfSk7XG4gICAgICBzdHlsZVtDU1NfSU5fSlNfSU5TVEFOQ0VdID0gaW5zdGFuY2VJZDtcblxuICAgICAgLy8gVXNlZCBmb3IgYHVzZUNhY2hlVG9rZW5gIHRvIHJlbW92ZSBvbiBiYXRjaCB3aGVuIHRva2VuIHJlbW92ZWRcbiAgICAgIHN0eWxlLnNldEF0dHJpYnV0ZShBVFRSX1RPS0VOLCB0b2tlbi5fdGhlbWVLZXkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBjYWNoZWRUb2tlbjtcbn1cbmV4cG9ydCB2YXIgZXh0cmFjdCA9IGZ1bmN0aW9uIGV4dHJhY3QoY2FjaGUsIGVmZmVjdFN0eWxlcywgb3B0aW9ucykge1xuICB2YXIgX2NhY2hlID0gX3NsaWNlZFRvQXJyYXkoY2FjaGUsIDUpLFxuICAgIHJlYWxUb2tlbiA9IF9jYWNoZVsyXSxcbiAgICBzdHlsZVN0ciA9IF9jYWNoZVszXSxcbiAgICBjc3NWYXJLZXkgPSBfY2FjaGVbNF07XG4gIHZhciBfcmVmMyA9IG9wdGlvbnMgfHwge30sXG4gICAgcGxhaW4gPSBfcmVmMy5wbGFpbjtcbiAgaWYgKCFzdHlsZVN0cikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBzdHlsZUlkID0gcmVhbFRva2VuLl90b2tlbktleTtcbiAgdmFyIG9yZGVyID0gLTk5OTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09IFN0eWxlID09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVXNlZCBmb3IgcmMtdXRpbFxuICB2YXIgc2hhcmVkQXR0cnMgPSB7XG4gICAgJ2RhdGEtcmMtb3JkZXInOiAncHJlcGVuZFF1ZXVlJyxcbiAgICAnZGF0YS1yYy1wcmlvcml0eSc6IFwiXCIuY29uY2F0KG9yZGVyKVxuICB9O1xuICB2YXIgc3R5bGVUZXh0ID0gdG9TdHlsZVN0cihzdHlsZVN0ciwgY3NzVmFyS2V5LCBzdHlsZUlkLCBzaGFyZWRBdHRycywgcGxhaW4pO1xuICByZXR1cm4gW29yZGVyLCBzdHlsZUlkLCBzdHlsZVRleHRdO1xufTsiLCAiZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UociwgZSkge1xuICBpZiAobnVsbCA9PSByKSByZXR1cm4ge307XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIG4gaW4gcikgaWYgKHt9Lmhhc093blByb3BlcnR5LmNhbGwociwgbikpIHtcbiAgICBpZiAoLTEgIT09IGUuaW5kZXhPZihuKSkgY29udGludWU7XG4gICAgdFtuXSA9IHJbbl07XG4gIH1cbiAgcmV0dXJuIHQ7XG59XG5leHBvcnQgeyBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSBhcyBkZWZhdWx0IH07IiwgImltcG9ydCBvYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlIGZyb20gXCIuL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UuanNcIjtcbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhlLCB0KSB7XG4gIGlmIChudWxsID09IGUpIHJldHVybiB7fTtcbiAgdmFyIG8sXG4gICAgcixcbiAgICBpID0gb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShlLCB0KTtcbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgbiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7XG4gICAgZm9yIChyID0gMDsgciA8IG4ubGVuZ3RoOyByKyspIG8gPSBuW3JdLCAtMSA9PT0gdC5pbmRleE9mKG8pICYmIHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgbykgJiYgKGlbb10gPSBlW29dKTtcbiAgfVxuICByZXR1cm4gaTtcbn1cbmV4cG9ydCB7IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBhcyBkZWZhdWx0IH07IiwgImltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCB3YXJuaW5nIGZyb20gXCIuL3dhcm5pbmdcIjtcblxuLyoqXG4gKiBEZWVwbHkgY29tcGFyZXMgdHdvIG9iamVjdCBsaXRlcmFscy5cbiAqIEBwYXJhbSBvYmoxIG9iamVjdCAxXG4gKiBAcGFyYW0gb2JqMiBvYmplY3QgMlxuICogQHBhcmFtIHNoYWxsb3cgc2hhbGxvdyBjb21wYXJlXG4gKiBAcmV0dXJuc1xuICovXG5mdW5jdGlvbiBpc0VxdWFsKG9iajEsIG9iajIpIHtcbiAgdmFyIHNoYWxsb3cgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZhbHNlO1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9wdWxsLzU5NzkvZmlsZXMjZGlmZi1mZGU3MTQ1MDUwYzQ3Y2MzYTMwNjg1NmVmZDVmOWMzMDE2ZTg2ZTg1OWRlOWFmYmQwMmM4NzliZTUwNjdlNThmXG4gIHZhciByZWZTZXQgPSBuZXcgU2V0KCk7XG4gIGZ1bmN0aW9uIGRlZXBFcXVhbChhLCBiKSB7XG4gICAgdmFyIGxldmVsID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAxO1xuICAgIHZhciBjaXJjdWxhciA9IHJlZlNldC5oYXMoYSk7XG4gICAgd2FybmluZyghY2lyY3VsYXIsICdXYXJuaW5nOiBUaGVyZSBtYXkgYmUgY2lyY3VsYXIgcmVmZXJlbmNlcycpO1xuICAgIGlmIChjaXJjdWxhcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoYSA9PT0gYikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChzaGFsbG93ICYmIGxldmVsID4gMSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZWZTZXQuYWRkKGEpO1xuICAgIHZhciBuZXdMZXZlbCA9IGxldmVsICsgMTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGIpIHx8IGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCFkZWVwRXF1YWwoYVtpXSwgYltpXSwgbmV3TGV2ZWwpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGEgJiYgYiAmJiBfdHlwZW9mKGEpID09PSAnb2JqZWN0JyAmJiBfdHlwZW9mKGIpID09PSAnb2JqZWN0Jykge1xuICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhhKTtcbiAgICAgIGlmIChrZXlzLmxlbmd0aCAhPT0gT2JqZWN0LmtleXMoYikubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBrZXlzLmV2ZXJ5KGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIGRlZXBFcXVhbChhW2tleV0sIGJba2V5XSwgbmV3TGV2ZWwpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIG90aGVyXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBkZWVwRXF1YWwob2JqMSwgb2JqMik7XG59XG5leHBvcnQgZGVmYXVsdCBpc0VxdWFsOyIsICJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJjaGlsZHJlblwiXTtcbmltcG9ydCB1c2VNZW1vIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZU1lbW9cIjtcbmltcG9ydCBpc0VxdWFsIGZyb20gXCJyYy11dGlsL2VzL2lzRXF1YWxcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBDYWNoZUVudGl0eSBmcm9tIFwiLi9DYWNoZVwiO1xuZXhwb3J0IHZhciBBVFRSX1RPS0VOID0gJ2RhdGEtdG9rZW4taGFzaCc7XG5leHBvcnQgdmFyIEFUVFJfTUFSSyA9ICdkYXRhLWNzcy1oYXNoJztcbmV4cG9ydCB2YXIgQVRUUl9DQUNIRV9QQVRIID0gJ2RhdGEtY2FjaGUtcGF0aCc7XG5cbi8vIE1hcmsgY3NzLWluLWpzIGluc3RhbmNlIGluIHN0eWxlIGVsZW1lbnRcbmV4cG9ydCB2YXIgQ1NTX0lOX0pTX0lOU1RBTkNFID0gJ19fY3NzaW5qc19pbnN0YW5jZV9fJztcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDYWNoZSgpIHtcbiAgdmFyIGNzc2luanNJbnN0YW5jZUlkID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygxMikuc2xpY2UoMik7XG5cbiAgLy8gVHJpY2t5IFNTUjogTW92ZSBhbGwgaW5saW5lIHN0eWxlIHRvIHRoZSBoZWFkLlxuICAvLyBQUzogV2UgZG8gbm90IHJlY29tbWVuZCB0cmlja3kgbW9kZS5cbiAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQuaGVhZCAmJiBkb2N1bWVudC5ib2R5KSB7XG4gICAgdmFyIHN0eWxlcyA9IGRvY3VtZW50LmJvZHkucXVlcnlTZWxlY3RvckFsbChcInN0eWxlW1wiLmNvbmNhdChBVFRSX01BUkssIFwiXVwiKSkgfHwgW107XG4gICAgdmFyIGZpcnN0Q2hpbGQgPSBkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ7XG4gICAgQXJyYXkuZnJvbShzdHlsZXMpLmZvckVhY2goZnVuY3Rpb24gKHN0eWxlKSB7XG4gICAgICBzdHlsZVtDU1NfSU5fSlNfSU5TVEFOQ0VdID0gc3R5bGVbQ1NTX0lOX0pTX0lOU1RBTkNFXSB8fCBjc3NpbmpzSW5zdGFuY2VJZDtcblxuICAgICAgLy8gTm90IGZvcmNlIG1vdmUgaWYgbm8gaGVhZFxuICAgICAgaWYgKHN0eWxlW0NTU19JTl9KU19JTlNUQU5DRV0gPT09IGNzc2luanNJbnN0YW5jZUlkKSB7XG4gICAgICAgIGRvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKHN0eWxlLCBmaXJzdENoaWxkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIERlZHVwbGljYXRlIG9mIG1vdmVkIHN0eWxlc1xuICAgIHZhciBzdHlsZUhhc2ggPSB7fTtcbiAgICBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJzdHlsZVtcIi5jb25jYXQoQVRUUl9NQVJLLCBcIl1cIikpKS5mb3JFYWNoKGZ1bmN0aW9uIChzdHlsZSkge1xuICAgICAgdmFyIGhhc2ggPSBzdHlsZS5nZXRBdHRyaWJ1dGUoQVRUUl9NQVJLKTtcbiAgICAgIGlmIChzdHlsZUhhc2hbaGFzaF0pIHtcbiAgICAgICAgaWYgKHN0eWxlW0NTU19JTl9KU19JTlNUQU5DRV0gPT09IGNzc2luanNJbnN0YW5jZUlkKSB7XG4gICAgICAgICAgdmFyIF9zdHlsZSRwYXJlbnROb2RlO1xuICAgICAgICAgIChfc3R5bGUkcGFyZW50Tm9kZSA9IHN0eWxlLnBhcmVudE5vZGUpID09PSBudWxsIHx8IF9zdHlsZSRwYXJlbnROb2RlID09PSB2b2lkIDAgfHwgX3N0eWxlJHBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3R5bGUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHlsZUhhc2hbaGFzaF0gPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiBuZXcgQ2FjaGVFbnRpdHkoY3NzaW5qc0luc3RhbmNlSWQpO1xufVxudmFyIFN0eWxlQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHtcbiAgaGFzaFByaW9yaXR5OiAnbG93JyxcbiAgY2FjaGU6IGNyZWF0ZUNhY2hlKCksXG4gIGRlZmF1bHRDYWNoZTogdHJ1ZVxufSk7XG5leHBvcnQgdmFyIFN0eWxlUHJvdmlkZXIgPSBmdW5jdGlvbiBTdHlsZVByb3ZpZGVyKHByb3BzKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgX2V4Y2x1ZGVkKTtcbiAgdmFyIHBhcmVudENvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KFN0eWxlQ29udGV4dCk7XG4gIHZhciBjb250ZXh0ID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG1lcmdlZENvbnRleHQgPSBfb2JqZWN0U3ByZWFkKHt9LCBwYXJlbnRDb250ZXh0KTtcbiAgICBPYmplY3Qua2V5cyhyZXN0UHJvcHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgdmFyIHZhbHVlID0gcmVzdFByb3BzW2tleV07XG4gICAgICBpZiAocmVzdFByb3BzW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBtZXJnZWRDb250ZXh0W2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB2YXIgY2FjaGUgPSByZXN0UHJvcHMuY2FjaGU7XG4gICAgbWVyZ2VkQ29udGV4dC5jYWNoZSA9IG1lcmdlZENvbnRleHQuY2FjaGUgfHwgY3JlYXRlQ2FjaGUoKTtcbiAgICBtZXJnZWRDb250ZXh0LmRlZmF1bHRDYWNoZSA9ICFjYWNoZSAmJiBwYXJlbnRDb250ZXh0LmRlZmF1bHRDYWNoZTtcbiAgICByZXR1cm4gbWVyZ2VkQ29udGV4dDtcbiAgfSwgW3BhcmVudENvbnRleHQsIHJlc3RQcm9wc10sIGZ1bmN0aW9uIChwcmV2LCBuZXh0KSB7XG4gICAgcmV0dXJuICFpc0VxdWFsKHByZXZbMF0sIG5leHRbMF0sIHRydWUpIHx8ICFpc0VxdWFsKHByZXZbMV0sIG5leHRbMV0sIHRydWUpO1xuICB9KTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFN0eWxlQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBjb250ZXh0XG4gIH0sIGNoaWxkcmVuKTtcbn07XG5leHBvcnQgZGVmYXVsdCBTdHlsZUNvbnRleHQ7IiwgImltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbi8vIFt0aW1lcywgcmVhbFZhbHVlXVxuXG52YXIgU1BMSVQgPSAnJSc7XG5cbi8qKiBDb25uZWN0IGtleSB3aXRoIGBTUExJVGAgKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXRoS2V5KGtleXMpIHtcbiAgcmV0dXJuIGtleXMuam9pbihTUExJVCk7XG59XG52YXIgRW50aXR5ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRW50aXR5KGluc3RhbmNlSWQpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRW50aXR5KTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJpbnN0YW5jZUlkXCIsIHZvaWQgMCk7XG4gICAgLyoqIEBwcml2YXRlIEludGVybmFsIGNhY2hlIG1hcC4gRG8gbm90IGFjY2VzcyB0aGlzIGRpcmVjdGx5ICovXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiY2FjaGVcIiwgbmV3IE1hcCgpKTtcbiAgICB0aGlzLmluc3RhbmNlSWQgPSBpbnN0YW5jZUlkO1xuICB9XG4gIF9jcmVhdGVDbGFzcyhFbnRpdHksIFt7XG4gICAga2V5OiBcImdldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXQoa2V5cykge1xuICAgICAgcmV0dXJuIHRoaXMub3BHZXQocGF0aEtleShrZXlzKSk7XG4gICAgfVxuXG4gICAgLyoqIEEgZmFzdCBnZXQgY2FjaGUgd2l0aCBgZ2V0YCBjb25jYXQuICovXG4gIH0sIHtcbiAgICBrZXk6IFwib3BHZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb3BHZXQoa2V5UGF0aFN0cikge1xuICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KGtleVBhdGhTdHIpIHx8IG51bGw7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGUoa2V5cywgdmFsdWVGbikge1xuICAgICAgcmV0dXJuIHRoaXMub3BVcGRhdGUocGF0aEtleShrZXlzKSwgdmFsdWVGbik7XG4gICAgfVxuXG4gICAgLyoqIEEgZmFzdCBnZXQgY2FjaGUgd2l0aCBgZ2V0YCBjb25jYXQuICovXG4gIH0sIHtcbiAgICBrZXk6IFwib3BVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb3BVcGRhdGUoa2V5UGF0aFN0ciwgdmFsdWVGbikge1xuICAgICAgdmFyIHByZXZWYWx1ZSA9IHRoaXMuY2FjaGUuZ2V0KGtleVBhdGhTdHIpO1xuICAgICAgdmFyIG5leHRWYWx1ZSA9IHZhbHVlRm4ocHJldlZhbHVlKTtcbiAgICAgIGlmIChuZXh0VmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5jYWNoZS5kZWxldGUoa2V5UGF0aFN0cik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNhY2hlLnNldChrZXlQYXRoU3RyLCBuZXh0VmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gRW50aXR5O1xufSgpO1xuZXhwb3J0IGRlZmF1bHQgRW50aXR5OyIsICJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3NlcnRUaGlzSW5pdGlhbGl6ZWRcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzXCI7XG5pbXBvcnQgX2NyZWF0ZVN1cGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVTdXBlclwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBBYnN0cmFjdENhbGN1bGF0b3IgZnJvbSBcIi4vY2FsY3VsYXRvclwiO1xudmFyIENBTENfVU5JVCA9ICdDQUxDX1VOSVQnO1xudmFyIHJlZ2V4cCA9IG5ldyBSZWdFeHAoQ0FMQ19VTklULCAnZycpO1xuZnVuY3Rpb24gdW5pdCh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBcIlwiLmNvbmNhdCh2YWx1ZSkuY29uY2F0KENBTENfVU5JVCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxudmFyIENTU0NhbGN1bGF0b3IgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9BYnN0cmFjdENhbGN1bGF0b3IpIHtcbiAgX2luaGVyaXRzKENTU0NhbGN1bGF0b3IsIF9BYnN0cmFjdENhbGN1bGF0b3IpO1xuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKENTU0NhbGN1bGF0b3IpO1xuICBmdW5jdGlvbiBDU1NDYWxjdWxhdG9yKG51bSwgdW5pdGxlc3NDc3NWYXIpIHtcbiAgICB2YXIgX3RoaXM7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENTU0NhbGN1bGF0b3IpO1xuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInJlc3VsdFwiLCAnJyk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInVuaXRsZXNzQ3NzVmFyXCIsIHZvaWQgMCk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImxvd1ByaW9yaXR5XCIsIHZvaWQgMCk7XG4gICAgdmFyIG51bVR5cGUgPSBfdHlwZW9mKG51bSk7XG4gICAgX3RoaXMudW5pdGxlc3NDc3NWYXIgPSB1bml0bGVzc0Nzc1ZhcjtcbiAgICBpZiAobnVtIGluc3RhbmNlb2YgQ1NTQ2FsY3VsYXRvcikge1xuICAgICAgX3RoaXMucmVzdWx0ID0gXCIoXCIuY29uY2F0KG51bS5yZXN1bHQsIFwiKVwiKTtcbiAgICB9IGVsc2UgaWYgKG51bVR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICBfdGhpcy5yZXN1bHQgPSB1bml0KG51bSk7XG4gICAgfSBlbHNlIGlmIChudW1UeXBlID09PSAnc3RyaW5nJykge1xuICAgICAgX3RoaXMucmVzdWx0ID0gbnVtO1xuICAgIH1cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgX2NyZWF0ZUNsYXNzKENTU0NhbGN1bGF0b3IsIFt7XG4gICAga2V5OiBcImFkZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGQobnVtKSB7XG4gICAgICBpZiAobnVtIGluc3RhbmNlb2YgQ1NTQ2FsY3VsYXRvcikge1xuICAgICAgICB0aGlzLnJlc3VsdCA9IFwiXCIuY29uY2F0KHRoaXMucmVzdWx0LCBcIiArIFwiKS5jb25jYXQobnVtLmdldFJlc3VsdCgpKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG51bSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIG51bSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5yZXN1bHQgPSBcIlwiLmNvbmNhdCh0aGlzLnJlc3VsdCwgXCIgKyBcIikuY29uY2F0KHVuaXQobnVtKSk7XG4gICAgICB9XG4gICAgICB0aGlzLmxvd1ByaW9yaXR5ID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzdWJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3ViKG51bSkge1xuICAgICAgaWYgKG51bSBpbnN0YW5jZW9mIENTU0NhbGN1bGF0b3IpIHtcbiAgICAgICAgdGhpcy5yZXN1bHQgPSBcIlwiLmNvbmNhdCh0aGlzLnJlc3VsdCwgXCIgLSBcIikuY29uY2F0KG51bS5nZXRSZXN1bHQoKSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBudW0gPT09ICdudW1iZXInIHx8IHR5cGVvZiBudW0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMucmVzdWx0ID0gXCJcIi5jb25jYXQodGhpcy5yZXN1bHQsIFwiIC0gXCIpLmNvbmNhdCh1bml0KG51bSkpO1xuICAgICAgfVxuICAgICAgdGhpcy5sb3dQcmlvcml0eSA9IHRydWU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibXVsXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG11bChudW0pIHtcbiAgICAgIGlmICh0aGlzLmxvd1ByaW9yaXR5KSB7XG4gICAgICAgIHRoaXMucmVzdWx0ID0gXCIoXCIuY29uY2F0KHRoaXMucmVzdWx0LCBcIilcIik7XG4gICAgICB9XG4gICAgICBpZiAobnVtIGluc3RhbmNlb2YgQ1NTQ2FsY3VsYXRvcikge1xuICAgICAgICB0aGlzLnJlc3VsdCA9IFwiXCIuY29uY2F0KHRoaXMucmVzdWx0LCBcIiAqIFwiKS5jb25jYXQobnVtLmdldFJlc3VsdCh0cnVlKSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBudW0gPT09ICdudW1iZXInIHx8IHR5cGVvZiBudW0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMucmVzdWx0ID0gXCJcIi5jb25jYXQodGhpcy5yZXN1bHQsIFwiICogXCIpLmNvbmNhdChudW0pO1xuICAgICAgfVxuICAgICAgdGhpcy5sb3dQcmlvcml0eSA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRpdlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkaXYobnVtKSB7XG4gICAgICBpZiAodGhpcy5sb3dQcmlvcml0eSkge1xuICAgICAgICB0aGlzLnJlc3VsdCA9IFwiKFwiLmNvbmNhdCh0aGlzLnJlc3VsdCwgXCIpXCIpO1xuICAgICAgfVxuICAgICAgaWYgKG51bSBpbnN0YW5jZW9mIENTU0NhbGN1bGF0b3IpIHtcbiAgICAgICAgdGhpcy5yZXN1bHQgPSBcIlwiLmNvbmNhdCh0aGlzLnJlc3VsdCwgXCIgLyBcIikuY29uY2F0KG51bS5nZXRSZXN1bHQodHJ1ZSkpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbnVtID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgbnVtID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLnJlc3VsdCA9IFwiXCIuY29uY2F0KHRoaXMucmVzdWx0LCBcIiAvIFwiKS5jb25jYXQobnVtKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubG93UHJpb3JpdHkgPSBmYWxzZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRSZXN1bHRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UmVzdWx0KGZvcmNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5sb3dQcmlvcml0eSB8fCBmb3JjZSA/IFwiKFwiLmNvbmNhdCh0aGlzLnJlc3VsdCwgXCIpXCIpIDogdGhpcy5yZXN1bHQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVxdWFsXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVxdWFsKG9wdGlvbnMpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuICAgICAgdmFyIF9yZWYgPSBvcHRpb25zIHx8IHt9LFxuICAgICAgICBjc3NVbml0ID0gX3JlZi51bml0O1xuICAgICAgdmFyIG1lcmdlZFVuaXQgPSB0cnVlO1xuICAgICAgaWYgKHR5cGVvZiBjc3NVbml0ID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgbWVyZ2VkVW5pdCA9IGNzc1VuaXQ7XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmZyb20odGhpcy51bml0bGVzc0Nzc1Zhcikuc29tZShmdW5jdGlvbiAoY3NzVmFyKSB7XG4gICAgICAgIHJldHVybiBfdGhpczIucmVzdWx0LmluY2x1ZGVzKGNzc1Zhcik7XG4gICAgICB9KSkge1xuICAgICAgICBtZXJnZWRVbml0ID0gZmFsc2U7XG4gICAgICB9XG4gICAgICB0aGlzLnJlc3VsdCA9IHRoaXMucmVzdWx0LnJlcGxhY2UocmVnZXhwLCBtZXJnZWRVbml0ID8gJ3B4JyA6ICcnKTtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5sb3dQcmlvcml0eSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIFwiY2FsYyhcIi5jb25jYXQodGhpcy5yZXN1bHQsIFwiKVwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnJlc3VsdDtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIENTU0NhbGN1bGF0b3I7XG59KEFic3RyYWN0Q2FsY3VsYXRvcik7XG5leHBvcnQgeyBDU1NDYWxjdWxhdG9yIGFzIGRlZmF1bHQgfTsiLCAiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IENhY2hlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGZ1bmN0aW9uIHNhbWVEZXJpdmF0aXZlT3B0aW9uKGxlZnQsIHJpZ2h0KSB7XG4gIGlmIChsZWZ0Lmxlbmd0aCAhPT0gcmlnaHQubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVmdC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChsZWZ0W2ldICE9PSByaWdodFtpXSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbnZhciBUaGVtZUNhY2hlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gVGhlbWVDYWNoZSgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVGhlbWVDYWNoZSk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiY2FjaGVcIiwgdm9pZCAwKTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJrZXlzXCIsIHZvaWQgMCk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiY2FjaGVDYWxsVGltZXNcIiwgdm9pZCAwKTtcbiAgICB0aGlzLmNhY2hlID0gbmV3IE1hcCgpO1xuICAgIHRoaXMua2V5cyA9IFtdO1xuICAgIHRoaXMuY2FjaGVDYWxsVGltZXMgPSAwO1xuICB9XG4gIF9jcmVhdGVDbGFzcyhUaGVtZUNhY2hlLCBbe1xuICAgIGtleTogXCJzaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNpemUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5rZXlzLmxlbmd0aDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW50ZXJuYWxHZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW50ZXJuYWxHZXQoZGVyaXZhdGl2ZU9wdGlvbikge1xuICAgICAgdmFyIF9jYWNoZTIsIF9jYWNoZTM7XG4gICAgICB2YXIgdXBkYXRlQ2FsbFRpbWVzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcbiAgICAgIHZhciBjYWNoZSA9IHtcbiAgICAgICAgbWFwOiB0aGlzLmNhY2hlXG4gICAgICB9O1xuICAgICAgZGVyaXZhdGl2ZU9wdGlvbi5mb3JFYWNoKGZ1bmN0aW9uIChkZXJpdmF0aXZlKSB7XG4gICAgICAgIGlmICghY2FjaGUpIHtcbiAgICAgICAgICBjYWNoZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgX2NhY2hlO1xuICAgICAgICAgIGNhY2hlID0gKF9jYWNoZSA9IGNhY2hlKSA9PT0gbnVsbCB8fCBfY2FjaGUgPT09IHZvaWQgMCB8fCAoX2NhY2hlID0gX2NhY2hlLm1hcCkgPT09IG51bGwgfHwgX2NhY2hlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfY2FjaGUuZ2V0KGRlcml2YXRpdmUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmICgoX2NhY2hlMiA9IGNhY2hlKSAhPT0gbnVsbCAmJiBfY2FjaGUyICE9PSB2b2lkIDAgJiYgX2NhY2hlMi52YWx1ZSAmJiB1cGRhdGVDYWxsVGltZXMpIHtcbiAgICAgICAgY2FjaGUudmFsdWVbMV0gPSB0aGlzLmNhY2hlQ2FsbFRpbWVzKys7XG4gICAgICB9XG4gICAgICByZXR1cm4gKF9jYWNoZTMgPSBjYWNoZSkgPT09IG51bGwgfHwgX2NhY2hlMyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2NhY2hlMy52YWx1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldChkZXJpdmF0aXZlT3B0aW9uKSB7XG4gICAgICB2YXIgX3RoaXMkaW50ZXJuYWxHZXQ7XG4gICAgICByZXR1cm4gKF90aGlzJGludGVybmFsR2V0ID0gdGhpcy5pbnRlcm5hbEdldChkZXJpdmF0aXZlT3B0aW9uLCB0cnVlKSkgPT09IG51bGwgfHwgX3RoaXMkaW50ZXJuYWxHZXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJGludGVybmFsR2V0WzBdO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJoYXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFzKGRlcml2YXRpdmVPcHRpb24pIHtcbiAgICAgIHJldHVybiAhIXRoaXMuaW50ZXJuYWxHZXQoZGVyaXZhdGl2ZU9wdGlvbik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQoZGVyaXZhdGl2ZU9wdGlvbiwgdmFsdWUpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAvLyBOZXcgY2FjaGVcbiAgICAgIGlmICghdGhpcy5oYXMoZGVyaXZhdGl2ZU9wdGlvbikpIHtcbiAgICAgICAgaWYgKHRoaXMuc2l6ZSgpICsgMSA+IFRoZW1lQ2FjaGUuTUFYX0NBQ0hFX1NJWkUgKyBUaGVtZUNhY2hlLk1BWF9DQUNIRV9PRkZTRVQpIHtcbiAgICAgICAgICB2YXIgX3RoaXMka2V5cyRyZWR1Y2UgPSB0aGlzLmtleXMucmVkdWNlKGZ1bmN0aW9uIChyZXN1bHQsIGtleSkge1xuICAgICAgICAgICAgICB2YXIgX3Jlc3VsdCA9IF9zbGljZWRUb0FycmF5KHJlc3VsdCwgMiksXG4gICAgICAgICAgICAgICAgY2FsbFRpbWVzID0gX3Jlc3VsdFsxXTtcbiAgICAgICAgICAgICAgaWYgKF90aGlzLmludGVybmFsR2V0KGtleSlbMV0gPCBjYWxsVGltZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW2tleSwgX3RoaXMuaW50ZXJuYWxHZXQoa2V5KVsxXV07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0sIFt0aGlzLmtleXNbMF0sIHRoaXMuY2FjaGVDYWxsVGltZXNdKSxcbiAgICAgICAgICAgIF90aGlzJGtleXMkcmVkdWNlMiA9IF9zbGljZWRUb0FycmF5KF90aGlzJGtleXMkcmVkdWNlLCAxKSxcbiAgICAgICAgICAgIHRhcmdldEtleSA9IF90aGlzJGtleXMkcmVkdWNlMlswXTtcbiAgICAgICAgICB0aGlzLmRlbGV0ZSh0YXJnZXRLZXkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMua2V5cy5wdXNoKGRlcml2YXRpdmVPcHRpb24pO1xuICAgICAgfVxuICAgICAgdmFyIGNhY2hlID0gdGhpcy5jYWNoZTtcbiAgICAgIGRlcml2YXRpdmVPcHRpb24uZm9yRWFjaChmdW5jdGlvbiAoZGVyaXZhdGl2ZSwgaW5kZXgpIHtcbiAgICAgICAgaWYgKGluZGV4ID09PSBkZXJpdmF0aXZlT3B0aW9uLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBjYWNoZS5zZXQoZGVyaXZhdGl2ZSwge1xuICAgICAgICAgICAgdmFsdWU6IFt2YWx1ZSwgX3RoaXMuY2FjaGVDYWxsVGltZXMrK11cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgY2FjaGVWYWx1ZSA9IGNhY2hlLmdldChkZXJpdmF0aXZlKTtcbiAgICAgICAgICBpZiAoIWNhY2hlVmFsdWUpIHtcbiAgICAgICAgICAgIGNhY2hlLnNldChkZXJpdmF0aXZlLCB7XG4gICAgICAgICAgICAgIG1hcDogbmV3IE1hcCgpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFjYWNoZVZhbHVlLm1hcCkge1xuICAgICAgICAgICAgY2FjaGVWYWx1ZS5tYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhY2hlID0gY2FjaGUuZ2V0KGRlcml2YXRpdmUpLm1hcDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRlbGV0ZUJ5UGF0aFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZWxldGVCeVBhdGgoY3VycmVudENhY2hlLCBkZXJpdmF0aXZlcykge1xuICAgICAgdmFyIGNhY2hlID0gY3VycmVudENhY2hlLmdldChkZXJpdmF0aXZlc1swXSk7XG4gICAgICBpZiAoZGVyaXZhdGl2ZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHZhciBfY2FjaGUkdmFsdWU7XG4gICAgICAgIGlmICghY2FjaGUubWFwKSB7XG4gICAgICAgICAgY3VycmVudENhY2hlLmRlbGV0ZShkZXJpdmF0aXZlc1swXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3VycmVudENhY2hlLnNldChkZXJpdmF0aXZlc1swXSwge1xuICAgICAgICAgICAgbWFwOiBjYWNoZS5tYXBcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKF9jYWNoZSR2YWx1ZSA9IGNhY2hlLnZhbHVlKSA9PT0gbnVsbCB8fCBfY2FjaGUkdmFsdWUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jYWNoZSR2YWx1ZVswXTtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSB0aGlzLmRlbGV0ZUJ5UGF0aChjYWNoZS5tYXAsIGRlcml2YXRpdmVzLnNsaWNlKDEpKTtcbiAgICAgIGlmICgoIWNhY2hlLm1hcCB8fCBjYWNoZS5tYXAuc2l6ZSA9PT0gMCkgJiYgIWNhY2hlLnZhbHVlKSB7XG4gICAgICAgIGN1cnJlbnRDYWNoZS5kZWxldGUoZGVyaXZhdGl2ZXNbMF0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGVsZXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9kZWxldGUoZGVyaXZhdGl2ZU9wdGlvbikge1xuICAgICAgLy8gSWYgY2FjaGUgZXhpc3RzXG4gICAgICBpZiAodGhpcy5oYXMoZGVyaXZhdGl2ZU9wdGlvbikpIHtcbiAgICAgICAgdGhpcy5rZXlzID0gdGhpcy5rZXlzLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgIHJldHVybiAhc2FtZURlcml2YXRpdmVPcHRpb24oaXRlbSwgZGVyaXZhdGl2ZU9wdGlvbik7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5kZWxldGVCeVBhdGgodGhpcy5jYWNoZSwgZGVyaXZhdGl2ZU9wdGlvbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gVGhlbWVDYWNoZTtcbn0oKTtcbl9kZWZpbmVQcm9wZXJ0eShUaGVtZUNhY2hlLCBcIk1BWF9DQUNIRV9TSVpFXCIsIDIwKTtcbl9kZWZpbmVQcm9wZXJ0eShUaGVtZUNhY2hlLCBcIk1BWF9DQUNIRV9PRkZTRVRcIiwgNSk7XG5leHBvcnQgeyBUaGVtZUNhY2hlIGFzIGRlZmF1bHQgfTsiLCAiaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IHsgd2FybmluZyB9IGZyb20gXCJyYy11dGlsL2VzL3dhcm5pbmdcIjtcbnZhciB1dWlkID0gMDtcblxuLyoqXG4gKiBUaGVtZSB3aXRoIGFsZ29yaXRobXMgdG8gZGVyaXZlIHRva2VucyBmcm9tIGRlc2lnbiB0b2tlbnMuXG4gKiBVc2UgYGNyZWF0ZVRoZW1lYCBmaXJzdCB3aGljaCB3aWxsIGhlbHAgdG8gbWFuYWdlIHRoZSB0aGVtZSBpbnN0YW5jZSBjYWNoZS5cbiAqL1xudmFyIFRoZW1lID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gVGhlbWUoZGVyaXZhdGl2ZXMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVGhlbWUpO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImRlcml2YXRpdmVzXCIsIHZvaWQgMCk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiaWRcIiwgdm9pZCAwKTtcbiAgICB0aGlzLmRlcml2YXRpdmVzID0gQXJyYXkuaXNBcnJheShkZXJpdmF0aXZlcykgPyBkZXJpdmF0aXZlcyA6IFtkZXJpdmF0aXZlc107XG4gICAgdGhpcy5pZCA9IHV1aWQ7XG4gICAgaWYgKGRlcml2YXRpdmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgd2FybmluZyhkZXJpdmF0aXZlcy5sZW5ndGggPiAwLCAnW0FudCBEZXNpZ24gQ1NTLWluLUpTXSBUaGVtZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCBvbmUgZGVyaXZhdGl2ZSBmdW5jdGlvbi4nKTtcbiAgICB9XG4gICAgdXVpZCArPSAxO1xuICB9XG4gIF9jcmVhdGVDbGFzcyhUaGVtZSwgW3tcbiAgICBrZXk6IFwiZ2V0RGVyaXZhdGl2ZVRva2VuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldERlcml2YXRpdmVUb2tlbih0b2tlbikge1xuICAgICAgcmV0dXJuIHRoaXMuZGVyaXZhdGl2ZXMucmVkdWNlKGZ1bmN0aW9uIChyZXN1bHQsIGRlcml2YXRpdmUpIHtcbiAgICAgICAgcmV0dXJuIGRlcml2YXRpdmUodG9rZW4sIHJlc3VsdCk7XG4gICAgICB9LCB1bmRlZmluZWQpO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gVGhlbWU7XG59KCk7XG5leHBvcnQgeyBUaGVtZSBhcyBkZWZhdWx0IH07IiwgImltcG9ydCBUaGVtZUNhY2hlIGZyb20gXCIuL1RoZW1lQ2FjaGVcIjtcbmltcG9ydCBUaGVtZSBmcm9tIFwiLi9UaGVtZVwiO1xudmFyIGNhY2hlVGhlbWVzID0gbmV3IFRoZW1lQ2FjaGUoKTtcblxuLyoqXG4gKiBTYW1lIGFzIG5ldyBUaGVtZSwgYnV0IHdpbGwgYWx3YXlzIHJldHVybiBzYW1lIG9uZSBpZiBgZGVyaXZhdGl2ZWAgbm90IGNoYW5nZWQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZVRoZW1lKGRlcml2YXRpdmVzKSB7XG4gIHZhciBkZXJpdmF0aXZlQXJyID0gQXJyYXkuaXNBcnJheShkZXJpdmF0aXZlcykgPyBkZXJpdmF0aXZlcyA6IFtkZXJpdmF0aXZlc107XG4gIC8vIENyZWF0ZSBuZXcgdGhlbWUgaWYgbm90IGV4aXN0XG4gIGlmICghY2FjaGVUaGVtZXMuaGFzKGRlcml2YXRpdmVBcnIpKSB7XG4gICAgY2FjaGVUaGVtZXMuc2V0KGRlcml2YXRpdmVBcnIsIG5ldyBUaGVtZShkZXJpdmF0aXZlQXJyKSk7XG4gIH1cblxuICAvLyBHZXQgdGhlbWUgZnJvbSBjYWNoZSBhbmQgcmV0dXJuXG4gIHJldHVybiBjYWNoZVRoZW1lcy5nZXQoZGVyaXZhdGl2ZUFycik7XG59IiwgImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IGhhc2ggZnJvbSAnQGVtb3Rpb24vaGFzaCc7XG5pbXBvcnQgY2FuVXNlRG9tIGZyb20gXCJyYy11dGlsL2VzL0RvbS9jYW5Vc2VEb21cIjtcbmltcG9ydCB7IHJlbW92ZUNTUywgdXBkYXRlQ1NTIH0gZnJvbSBcInJjLXV0aWwvZXMvRG9tL2R5bmFtaWNDU1NcIjtcbmltcG9ydCB7IEFUVFJfTUFSSywgQVRUUl9UT0tFTiB9IGZyb20gXCIuLi9TdHlsZUNvbnRleHRcIjtcbmltcG9ydCB7IFRoZW1lIH0gZnJvbSBcIi4uL3RoZW1lXCI7XG5cbi8vIENyZWF0ZSBhIGNhY2hlIGZvciBtZW1vIGNvbmNhdFxuXG52YXIgcmVzdWx0Q2FjaGUgPSBuZXcgV2Vha01hcCgpO1xudmFyIFJFU1VMVF9WQUxVRSA9IHt9O1xuZXhwb3J0IGZ1bmN0aW9uIG1lbW9SZXN1bHQoY2FsbGJhY2ssIGRlcHMpIHtcbiAgdmFyIGN1cnJlbnQgPSByZXN1bHRDYWNoZTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZXBzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgdmFyIGRlcCA9IGRlcHNbaV07XG4gICAgaWYgKCFjdXJyZW50LmhhcyhkZXApKSB7XG4gICAgICBjdXJyZW50LnNldChkZXAsIG5ldyBXZWFrTWFwKCkpO1xuICAgIH1cbiAgICBjdXJyZW50ID0gY3VycmVudC5nZXQoZGVwKTtcbiAgfVxuICBpZiAoIWN1cnJlbnQuaGFzKFJFU1VMVF9WQUxVRSkpIHtcbiAgICBjdXJyZW50LnNldChSRVNVTFRfVkFMVUUsIGNhbGxiYWNrKCkpO1xuICB9XG4gIHJldHVybiBjdXJyZW50LmdldChSRVNVTFRfVkFMVUUpO1xufVxuXG4vLyBDcmVhdGUgYSBjYWNoZSBoZXJlIHRvIGF2b2lkIGFsd2F5cyBsb29wIGdlbmVyYXRlXG52YXIgZmxhdHRlblRva2VuQ2FjaGUgPSBuZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEZsYXR0ZW4gdG9rZW4gdG8gc3RyaW5nLCB0aGlzIHdpbGwgYXV0byBjYWNoZSB0aGUgcmVzdWx0IHdoZW4gdG9rZW4gbm90IGNoYW5nZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZmxhdHRlblRva2VuKHRva2VuKSB7XG4gIHZhciBzdHIgPSBmbGF0dGVuVG9rZW5DYWNoZS5nZXQodG9rZW4pIHx8ICcnO1xuICBpZiAoIXN0cikge1xuICAgIE9iamVjdC5rZXlzKHRva2VuKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciB2YWx1ZSA9IHRva2VuW2tleV07XG4gICAgICBzdHIgKz0ga2V5O1xuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVGhlbWUpIHtcbiAgICAgICAgc3RyICs9IHZhbHVlLmlkO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZSAmJiBfdHlwZW9mKHZhbHVlKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgc3RyICs9IGZsYXR0ZW5Ub2tlbih2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHIgKz0gdmFsdWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy80ODM4NlxuICAgIC8vIFNob3VsZCBoYXNoIHRoZSBzdHJpbmcgdG8gYXZvaWQgc3R5bGUgdGFnIG5hbWUgdG9vIGxvbmdcbiAgICBzdHIgPSBoYXNoKHN0cik7XG5cbiAgICAvLyBQdXQgaW4gY2FjaGVcbiAgICBmbGF0dGVuVG9rZW5DYWNoZS5zZXQodG9rZW4sIHN0cik7XG4gIH1cbiAgcmV0dXJuIHN0cjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGRlcml2YXRpdmUgdG9rZW4gdG8ga2V5IHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gdG9rZW4ya2V5KHRva2VuLCBzYWx0KSB7XG4gIHJldHVybiBoYXNoKFwiXCIuY29uY2F0KHNhbHQsIFwiX1wiKS5jb25jYXQoZmxhdHRlblRva2VuKHRva2VuKSkpO1xufVxudmFyIHJhbmRvbVNlbGVjdG9yS2V5ID0gXCJyYW5kb20tXCIuY29uY2F0KERhdGUubm93KCksIFwiLVwiKS5jb25jYXQoTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXFwuL2csICcnKTtcblxuLy8gTWFnaWMgYGNvbnRlbnRgIGZvciBkZXRlY3Qgc2VsZWN0b3Igc3VwcG9ydFxudmFyIGNoZWNrQ29udGVudCA9ICdfYkFtQm9PXyc7XG5mdW5jdGlvbiBzdXBwb3J0U2VsZWN0b3Ioc3R5bGVTdHIsIGhhbmRsZUVsZW1lbnQsIHN1cHBvcnRDaGVjaykge1xuICBpZiAoY2FuVXNlRG9tKCkpIHtcbiAgICB2YXIgX2dldENvbXB1dGVkU3R5bGUkY29uLCBfZWxlJHBhcmVudE5vZGU7XG4gICAgdXBkYXRlQ1NTKHN0eWxlU3RyLCByYW5kb21TZWxlY3RvcktleSk7XG4gICAgdmFyIF9lbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBfZWxlLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcbiAgICBfZWxlLnN0eWxlLmxlZnQgPSAnMCc7XG4gICAgX2VsZS5zdHlsZS50b3AgPSAnMCc7XG4gICAgaGFuZGxlRWxlbWVudCA9PT0gbnVsbCB8fCBoYW5kbGVFbGVtZW50ID09PSB2b2lkIDAgfHwgaGFuZGxlRWxlbWVudChfZWxlKTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKF9lbGUpO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBfZWxlLmlubmVySFRNTCA9ICdUZXN0JztcbiAgICAgIF9lbGUuc3R5bGUuekluZGV4ID0gJzk5OTk5OTknO1xuICAgIH1cbiAgICB2YXIgc3VwcG9ydCA9IHN1cHBvcnRDaGVjayA/IHN1cHBvcnRDaGVjayhfZWxlKSA6IChfZ2V0Q29tcHV0ZWRTdHlsZSRjb24gPSBnZXRDb21wdXRlZFN0eWxlKF9lbGUpLmNvbnRlbnQpID09PSBudWxsIHx8IF9nZXRDb21wdXRlZFN0eWxlJGNvbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2dldENvbXB1dGVkU3R5bGUkY29uLmluY2x1ZGVzKGNoZWNrQ29udGVudCk7XG4gICAgKF9lbGUkcGFyZW50Tm9kZSA9IF9lbGUucGFyZW50Tm9kZSkgPT09IG51bGwgfHwgX2VsZSRwYXJlbnROb2RlID09PSB2b2lkIDAgfHwgX2VsZSRwYXJlbnROb2RlLnJlbW92ZUNoaWxkKF9lbGUpO1xuICAgIHJlbW92ZUNTUyhyYW5kb21TZWxlY3RvcktleSk7XG4gICAgcmV0dXJuIHN1cHBvcnQ7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxudmFyIGNhbkxheWVyID0gdW5kZWZpbmVkO1xuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRMYXllcigpIHtcbiAgaWYgKGNhbkxheWVyID09PSB1bmRlZmluZWQpIHtcbiAgICBjYW5MYXllciA9IHN1cHBvcnRTZWxlY3RvcihcIkBsYXllciBcIi5jb25jYXQocmFuZG9tU2VsZWN0b3JLZXksIFwiIHsgLlwiKS5jb25jYXQocmFuZG9tU2VsZWN0b3JLZXksIFwiIHsgY29udGVudDogXFxcIlwiKS5jb25jYXQoY2hlY2tDb250ZW50LCBcIlxcXCIhaW1wb3J0YW50OyB9IH1cIiksIGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIGVsZS5jbGFzc05hbWUgPSByYW5kb21TZWxlY3RvcktleTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gY2FuTGF5ZXI7XG59XG52YXIgY2FuV2hlcmUgPSB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydFdoZXJlKCkge1xuICBpZiAoY2FuV2hlcmUgPT09IHVuZGVmaW5lZCkge1xuICAgIGNhbldoZXJlID0gc3VwcG9ydFNlbGVjdG9yKFwiOndoZXJlKC5cIi5jb25jYXQocmFuZG9tU2VsZWN0b3JLZXksIFwiKSB7IGNvbnRlbnQ6IFxcXCJcIikuY29uY2F0KGNoZWNrQ29udGVudCwgXCJcXFwiIWltcG9ydGFudDsgfVwiKSwgZnVuY3Rpb24gKGVsZSkge1xuICAgICAgZWxlLmNsYXNzTmFtZSA9IHJhbmRvbVNlbGVjdG9yS2V5O1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBjYW5XaGVyZTtcbn1cbnZhciBjYW5Mb2dpYyA9IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0TG9naWNQcm9wcygpIHtcbiAgaWYgKGNhbkxvZ2ljID09PSB1bmRlZmluZWQpIHtcbiAgICBjYW5Mb2dpYyA9IHN1cHBvcnRTZWxlY3RvcihcIi5cIi5jb25jYXQocmFuZG9tU2VsZWN0b3JLZXksIFwiIHsgaW5zZXQtYmxvY2s6IDkzcHggIWltcG9ydGFudDsgfVwiKSwgZnVuY3Rpb24gKGVsZSkge1xuICAgICAgZWxlLmNsYXNzTmFtZSA9IHJhbmRvbVNlbGVjdG9yS2V5O1xuICAgIH0sIGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBnZXRDb21wdXRlZFN0eWxlKGVsZSkuYm90dG9tID09PSAnOTNweCc7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGNhbkxvZ2ljO1xufVxuZXhwb3J0IHZhciBpc0NsaWVudFNpZGUgPSBjYW5Vc2VEb20oKTtcbmV4cG9ydCBmdW5jdGlvbiB1bml0KG51bSkge1xuICBpZiAodHlwZW9mIG51bSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gXCJcIi5jb25jYXQobnVtLCBcInB4XCIpO1xuICB9XG4gIHJldHVybiBudW07XG59XG5leHBvcnQgZnVuY3Rpb24gdG9TdHlsZVN0cihzdHlsZSwgdG9rZW5LZXksIHN0eWxlSWQpIHtcbiAgdmFyIF9vYmplY3RTcHJlYWQyO1xuICB2YXIgY3VzdG9taXplQXR0cnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHt9O1xuICB2YXIgcGxhaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IGZhbHNlO1xuICBpZiAocGxhaW4pIHtcbiAgICByZXR1cm4gc3R5bGU7XG4gIH1cbiAgdmFyIGF0dHJzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBjdXN0b21pemVBdHRycyksIHt9LCAoX29iamVjdFNwcmVhZDIgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9vYmplY3RTcHJlYWQyLCBBVFRSX1RPS0VOLCB0b2tlbktleSksIF9kZWZpbmVQcm9wZXJ0eShfb2JqZWN0U3ByZWFkMiwgQVRUUl9NQVJLLCBzdHlsZUlkKSwgX29iamVjdFNwcmVhZDIpKTtcbiAgdmFyIGF0dHJTdHIgPSBPYmplY3Qua2V5cyhhdHRycykubWFwKGZ1bmN0aW9uIChhdHRyKSB7XG4gICAgdmFyIHZhbCA9IGF0dHJzW2F0dHJdO1xuICAgIHJldHVybiB2YWwgPyBcIlwiLmNvbmNhdChhdHRyLCBcIj1cXFwiXCIpLmNvbmNhdCh2YWwsIFwiXFxcIlwiKSA6IG51bGw7XG4gIH0pLmZpbHRlcihmdW5jdGlvbiAodikge1xuICAgIHJldHVybiB2O1xuICB9KS5qb2luKCcgJyk7XG4gIHJldHVybiBcIjxzdHlsZSBcIi5jb25jYXQoYXR0clN0ciwgXCI+XCIpLmNvbmNhdChzdHlsZSwgXCI8L3N0eWxlPlwiKTtcbn0iLCAiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5leHBvcnQgdmFyIHRva2VuMkNTU1ZhciA9IGZ1bmN0aW9uIHRva2VuMkNTU1Zhcih0b2tlbikge1xuICB2YXIgcHJlZml4ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAnJztcbiAgcmV0dXJuIFwiLS1cIi5jb25jYXQocHJlZml4ID8gXCJcIi5jb25jYXQocHJlZml4LCBcIi1cIikgOiAnJykuY29uY2F0KHRva2VuKS5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCAnJDEtJDInKS5yZXBsYWNlKC8oW0EtWl0rKShbQS1aXVthLXowLTldKykvZywgJyQxLSQyJykucmVwbGFjZSgvKFthLXpdKShbQS1aMC05XSkvZywgJyQxLSQyJykudG9Mb3dlckNhc2UoKTtcbn07XG5leHBvcnQgdmFyIHNlcmlhbGl6ZUNTU1ZhciA9IGZ1bmN0aW9uIHNlcmlhbGl6ZUNTU1Zhcihjc3NWYXJzLCBoYXNoSWQsIG9wdGlvbnMpIHtcbiAgaWYgKCFPYmplY3Qua2V5cyhjc3NWYXJzKS5sZW5ndGgpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgcmV0dXJuIFwiLlwiLmNvbmNhdChoYXNoSWQpLmNvbmNhdChvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHZvaWQgMCAmJiBvcHRpb25zLnNjb3BlID8gXCIuXCIuY29uY2F0KG9wdGlvbnMuc2NvcGUpIDogJycsIFwie1wiKS5jb25jYXQoT2JqZWN0LmVudHJpZXMoY3NzVmFycykubWFwKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgdmFyIF9yZWYyID0gX3NsaWNlZFRvQXJyYXkoX3JlZiwgMiksXG4gICAgICBrZXkgPSBfcmVmMlswXSxcbiAgICAgIHZhbHVlID0gX3JlZjJbMV07XG4gICAgcmV0dXJuIFwiXCIuY29uY2F0KGtleSwgXCI6XCIpLmNvbmNhdCh2YWx1ZSwgXCI7XCIpO1xuICB9KS5qb2luKCcnKSwgXCJ9XCIpO1xufTtcbmV4cG9ydCB2YXIgdHJhbnNmb3JtVG9rZW4gPSBmdW5jdGlvbiB0cmFuc2Zvcm1Ub2tlbih0b2tlbiwgdGhlbWVLZXksIGNvbmZpZykge1xuICB2YXIgY3NzVmFycyA9IHt9O1xuICB2YXIgcmVzdWx0ID0ge307XG4gIE9iamVjdC5lbnRyaWVzKHRva2VuKS5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmMykge1xuICAgIHZhciBfY29uZmlnJHByZXNlcnZlLCBfY29uZmlnJGlnbm9yZTtcbiAgICB2YXIgX3JlZjQgPSBfc2xpY2VkVG9BcnJheShfcmVmMywgMiksXG4gICAgICBrZXkgPSBfcmVmNFswXSxcbiAgICAgIHZhbHVlID0gX3JlZjRbMV07XG4gICAgaWYgKGNvbmZpZyAhPT0gbnVsbCAmJiBjb25maWcgIT09IHZvaWQgMCAmJiAoX2NvbmZpZyRwcmVzZXJ2ZSA9IGNvbmZpZy5wcmVzZXJ2ZSkgIT09IG51bGwgJiYgX2NvbmZpZyRwcmVzZXJ2ZSAhPT0gdm9pZCAwICYmIF9jb25maWckcHJlc2VydmVba2V5XSkge1xuICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICB9IGVsc2UgaWYgKCh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpICYmICEoY29uZmlnICE9PSBudWxsICYmIGNvbmZpZyAhPT0gdm9pZCAwICYmIChfY29uZmlnJGlnbm9yZSA9IGNvbmZpZy5pZ25vcmUpICE9PSBudWxsICYmIF9jb25maWckaWdub3JlICE9PSB2b2lkIDAgJiYgX2NvbmZpZyRpZ25vcmVba2V5XSkpIHtcbiAgICAgIHZhciBfY29uZmlnJHVuaXRsZXNzO1xuICAgICAgdmFyIGNzc1ZhciA9IHRva2VuMkNTU1ZhcihrZXksIGNvbmZpZyA9PT0gbnVsbCB8fCBjb25maWcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmZpZy5wcmVmaXgpO1xuICAgICAgY3NzVmFyc1tjc3NWYXJdID0gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiAhKGNvbmZpZyAhPT0gbnVsbCAmJiBjb25maWcgIT09IHZvaWQgMCAmJiAoX2NvbmZpZyR1bml0bGVzcyA9IGNvbmZpZy51bml0bGVzcykgIT09IG51bGwgJiYgX2NvbmZpZyR1bml0bGVzcyAhPT0gdm9pZCAwICYmIF9jb25maWckdW5pdGxlc3Nba2V5XSkgPyBcIlwiLmNvbmNhdCh2YWx1ZSwgXCJweFwiKSA6IFN0cmluZyh2YWx1ZSk7XG4gICAgICByZXN1bHRba2V5XSA9IFwidmFyKFwiLmNvbmNhdChjc3NWYXIsIFwiKVwiKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gW3Jlc3VsdCwgc2VyaWFsaXplQ1NTVmFyKGNzc1ZhcnMsIHRoZW1lS2V5LCB7XG4gICAgc2NvcGU6IGNvbmZpZyA9PT0gbnVsbCB8fCBjb25maWcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmZpZy5zY29wZVxuICB9KV07XG59OyIsICJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBwYXRoS2V5IH0gZnJvbSBcIi4uL0NhY2hlXCI7XG5pbXBvcnQgU3R5bGVDb250ZXh0IGZyb20gXCIuLi9TdHlsZUNvbnRleHRcIjtcbmltcG9ydCB1c2VDb21wYXRpYmxlSW5zZXJ0aW9uRWZmZWN0IGZyb20gXCIuL3VzZUNvbXBhdGlibGVJbnNlcnRpb25FZmZlY3RcIjtcbmltcG9ydCB1c2VFZmZlY3RDbGVhbnVwUmVnaXN0ZXIgZnJvbSBcIi4vdXNlRWZmZWN0Q2xlYW51cFJlZ2lzdGVyXCI7XG5pbXBvcnQgdXNlSE1SIGZyb20gXCIuL3VzZUhNUlwiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlR2xvYmFsQ2FjaGUocHJlZml4LCBrZXlQYXRoLCBjYWNoZUZuLCBvbkNhY2hlUmVtb3ZlLFxuLy8gQWRkIGFkZGl0aW9uYWwgZWZmZWN0IHRyaWdnZXIgYnkgYHVzZUluc2VydGlvbkVmZmVjdGBcbm9uQ2FjaGVFZmZlY3QpIHtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChTdHlsZUNvbnRleHQpLFxuICAgIGdsb2JhbENhY2hlID0gX1JlYWN0JHVzZUNvbnRleHQuY2FjaGU7XG4gIHZhciBmdWxsUGF0aCA9IFtwcmVmaXhdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoa2V5UGF0aCkpO1xuICB2YXIgZnVsbFBhdGhTdHIgPSBwYXRoS2V5KGZ1bGxQYXRoKTtcbiAgdmFyIHJlZ2lzdGVyID0gdXNlRWZmZWN0Q2xlYW51cFJlZ2lzdGVyKFtmdWxsUGF0aFN0cl0pO1xuICB2YXIgSE1SVXBkYXRlID0gdXNlSE1SKCk7XG4gIHZhciBidWlsZENhY2hlID0gZnVuY3Rpb24gYnVpbGRDYWNoZSh1cGRhdGVyKSB7XG4gICAgZ2xvYmFsQ2FjaGUub3BVcGRhdGUoZnVsbFBhdGhTdHIsIGZ1bmN0aW9uIChwcmV2Q2FjaGUpIHtcbiAgICAgIHZhciBfcmVmID0gcHJldkNhY2hlIHx8IFt1bmRlZmluZWQsIHVuZGVmaW5lZF0sXG4gICAgICAgIF9yZWYyID0gX3NsaWNlZFRvQXJyYXkoX3JlZiwgMiksXG4gICAgICAgIF9yZWYyJCA9IF9yZWYyWzBdLFxuICAgICAgICB0aW1lcyA9IF9yZWYyJCA9PT0gdm9pZCAwID8gMCA6IF9yZWYyJCxcbiAgICAgICAgY2FjaGUgPSBfcmVmMlsxXTtcblxuICAgICAgLy8gSE1SIHNob3VsZCBhbHdheXMgaWdub3JlIGNhY2hlIHNpbmNlIGRldmVsb3BlciBtYXkgY2hhbmdlIGl0XG4gICAgICB2YXIgdG1wQ2FjaGUgPSBjYWNoZTtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGNhY2hlICYmIEhNUlVwZGF0ZSkge1xuICAgICAgICBvbkNhY2hlUmVtb3ZlID09PSBudWxsIHx8IG9uQ2FjaGVSZW1vdmUgPT09IHZvaWQgMCB8fCBvbkNhY2hlUmVtb3ZlKHRtcENhY2hlLCBITVJVcGRhdGUpO1xuICAgICAgICB0bXBDYWNoZSA9IG51bGw7XG4gICAgICB9XG4gICAgICB2YXIgbWVyZ2VkQ2FjaGUgPSB0bXBDYWNoZSB8fCBjYWNoZUZuKCk7XG4gICAgICB2YXIgZGF0YSA9IFt0aW1lcywgbWVyZ2VkQ2FjaGVdO1xuXG4gICAgICAvLyBDYWxsIHVwZGF0ZXIgaWYgbmVlZCBhZGRpdGlvbmFsIGxvZ2ljXG4gICAgICByZXR1cm4gdXBkYXRlciA/IHVwZGF0ZXIoZGF0YSkgOiBkYXRhO1xuICAgIH0pO1xuICB9O1xuXG4gIC8vIENyZWF0ZSBjYWNoZVxuICBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBidWlsZENhY2hlKCk7XG4gIH0sIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwcyAqL1xuICBbZnVsbFBhdGhTdHJdXG4gIC8qIGVzbGludC1lbmFibGUgKi8pO1xuXG4gIHZhciBjYWNoZUVudGl0eSA9IGdsb2JhbENhY2hlLm9wR2V0KGZ1bGxQYXRoU3RyKTtcblxuICAvLyBITVIgY2xlYW4gdGhlIGNhY2hlIGJ1dCBub3QgdHJpZ2dlciBgdXNlTWVtb2AgYWdhaW5cbiAgLy8gTGV0J3MgZmFsbGJhY2sgb2YgdGhpc1xuICAvLyByZWYgaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vY3NzaW5qcy9pc3N1ZXMvMTI3XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICFjYWNoZUVudGl0eSkge1xuICAgIGJ1aWxkQ2FjaGUoKTtcbiAgICBjYWNoZUVudGl0eSA9IGdsb2JhbENhY2hlLm9wR2V0KGZ1bGxQYXRoU3RyKTtcbiAgfVxuICB2YXIgY2FjaGVDb250ZW50ID0gY2FjaGVFbnRpdHlbMV07XG5cbiAgLy8gUmVtb3ZlIGlmIG5vIG5lZWQgYW55bW9yZVxuICB1c2VDb21wYXRpYmxlSW5zZXJ0aW9uRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBvbkNhY2hlRWZmZWN0ID09PSBudWxsIHx8IG9uQ2FjaGVFZmZlY3QgPT09IHZvaWQgMCB8fCBvbkNhY2hlRWZmZWN0KGNhY2hlQ29udGVudCk7XG4gIH0sIGZ1bmN0aW9uIChwb2x5ZmlsbCkge1xuICAgIC8vIEl0J3MgYmFkIHRvIGNhbGwgYnVpbGQgYWdhaW4gaW4gZWZmZWN0LlxuICAgIC8vIEJ1dCB3ZSBoYXZlIHRvIGRvIHRoaXMgc2luY2UgU3RyaWN0TW9kZSB3aWxsIGNhbGwgZWZmZWN0IHR3aWNlXG4gICAgLy8gd2hpY2ggd2lsbCBjbGVhciBjYWNoZSBvbiB0aGUgZmlyc3QgdGltZS5cbiAgICBidWlsZENhY2hlKGZ1bmN0aW9uIChfcmVmMykge1xuICAgICAgdmFyIF9yZWY0ID0gX3NsaWNlZFRvQXJyYXkoX3JlZjMsIDIpLFxuICAgICAgICB0aW1lcyA9IF9yZWY0WzBdLFxuICAgICAgICBjYWNoZSA9IF9yZWY0WzFdO1xuICAgICAgaWYgKHBvbHlmaWxsICYmIHRpbWVzID09PSAwKSB7XG4gICAgICAgIG9uQ2FjaGVFZmZlY3QgPT09IG51bGwgfHwgb25DYWNoZUVmZmVjdCA9PT0gdm9pZCAwIHx8IG9uQ2FjaGVFZmZlY3QoY2FjaGVDb250ZW50KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbdGltZXMgKyAxLCBjYWNoZV07XG4gICAgfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGdsb2JhbENhY2hlLm9wVXBkYXRlKGZ1bGxQYXRoU3RyLCBmdW5jdGlvbiAocHJldkNhY2hlKSB7XG4gICAgICAgIHZhciBfcmVmNSA9IHByZXZDYWNoZSB8fCBbXSxcbiAgICAgICAgICBfcmVmNiA9IF9zbGljZWRUb0FycmF5KF9yZWY1LCAyKSxcbiAgICAgICAgICBfcmVmNiQgPSBfcmVmNlswXSxcbiAgICAgICAgICB0aW1lcyA9IF9yZWY2JCA9PT0gdm9pZCAwID8gMCA6IF9yZWY2JCxcbiAgICAgICAgICBjYWNoZSA9IF9yZWY2WzFdO1xuICAgICAgICB2YXIgbmV4dENvdW50ID0gdGltZXMgLSAxO1xuICAgICAgICBpZiAobmV4dENvdW50ID09PSAwKSB7XG4gICAgICAgICAgLy8gQWx3YXlzIHJlbW92ZSBzdHlsZXMgaW4gdXNlRWZmZWN0IGNhbGxiYWNrXG4gICAgICAgICAgcmVnaXN0ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy8gV2l0aCBwb2x5ZmlsbCwgcmVnaXN0ZXJlZCBjYWxsYmFjayB3aWxsIGFsd2F5cyBiZSBjYWxsZWQgc3luY2hyb25vdXNseVxuICAgICAgICAgICAgLy8gQnV0IHdpdGhvdXQgcG9seWZpbGwsIGl0IHdpbGwgYmUgY2FsbGVkIGluIGVmZmVjdCBjbGVhbiB1cCxcbiAgICAgICAgICAgIC8vIEFuZCBieSB0aGF0IHRpbWUgdGhpcyBjYWNoZSBpcyBjbGVhbmVkIHVwLlxuICAgICAgICAgICAgaWYgKHBvbHlmaWxsIHx8ICFnbG9iYWxDYWNoZS5vcEdldChmdWxsUGF0aFN0cikpIHtcbiAgICAgICAgICAgICAgb25DYWNoZVJlbW92ZSA9PT0gbnVsbCB8fCBvbkNhY2hlUmVtb3ZlID09PSB2b2lkIDAgfHwgb25DYWNoZVJlbW92ZShjYWNoZSwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbdGltZXMgLSAxLCBjYWNoZV07XG4gICAgICB9KTtcbiAgICB9O1xuICB9LCBbZnVsbFBhdGhTdHJdKTtcbiAgcmV0dXJuIGNhY2hlQ29udGVudDtcbn0iLCAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNhblVzZURvbSBmcm9tIFwiLi4vRG9tL2NhblVzZURvbVwiO1xuXG4vKipcbiAqIFdyYXAgYFJlYWN0LnVzZUxheW91dEVmZmVjdGAgd2hpY2ggd2lsbCBub3QgdGhyb3cgd2FybmluZyBtZXNzYWdlIGluIHRlc3QgZW52XG4gKi9cbnZhciB1c2VJbnRlcm5hbExheW91dEVmZmVjdCA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAndGVzdCcgJiYgY2FuVXNlRG9tKCkgPyBSZWFjdC51c2VMYXlvdXRFZmZlY3QgOiBSZWFjdC51c2VFZmZlY3Q7XG52YXIgdXNlTGF5b3V0RWZmZWN0ID0gZnVuY3Rpb24gdXNlTGF5b3V0RWZmZWN0KGNhbGxiYWNrLCBkZXBzKSB7XG4gIHZhciBmaXJzdE1vdW50UmVmID0gUmVhY3QudXNlUmVmKHRydWUpO1xuICB1c2VJbnRlcm5hbExheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKGZpcnN0TW91bnRSZWYuY3VycmVudCk7XG4gIH0sIGRlcHMpO1xuXG4gIC8vIFdlIHRlbGwgcmVhY3QgdGhhdCBmaXJzdCBtb3VudCBoYXMgcGFzc2VkXG4gIHVzZUludGVybmFsTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBmaXJzdE1vdW50UmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgZmlyc3RNb3VudFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICB9O1xuICB9LCBbXSk7XG59O1xuZXhwb3J0IHZhciB1c2VMYXlvdXRVcGRhdGVFZmZlY3QgPSBmdW5jdGlvbiB1c2VMYXlvdXRVcGRhdGVFZmZlY3QoY2FsbGJhY2ssIGRlcHMpIHtcbiAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uIChmaXJzdE1vdW50KSB7XG4gICAgaWYgKCFmaXJzdE1vdW50KSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG4gIH0sIGRlcHMpO1xufTtcbmV4cG9ydCBkZWZhdWx0IHVzZUxheW91dEVmZmVjdDsiLCAiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbi8vIGltcG9ydCBjYW5Vc2VEb20gZnJvbSAncmMtdXRpbC9saWIvRG9tL2NhblVzZURvbSc7XG5pbXBvcnQgdXNlTGF5b3V0RWZmZWN0IGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZUxheW91dEVmZmVjdFwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG4vLyBXZSBuZWVkIGZ1bGx5IGNsb25lIFJlYWN0IGZ1bmN0aW9uIGhlcmVcbi8vIHRvIGF2b2lkIHdlYnBhY2sgd2FybmluZyBSZWFjdCAxNyBkbyBub3QgZXhwb3J0IGB1c2VJZGBcbnZhciBmdWxsQ2xvbmUgPSBfb2JqZWN0U3ByZWFkKHt9LCBSZWFjdCk7XG52YXIgdXNlSW5zZXJ0aW9uRWZmZWN0ID0gZnVsbENsb25lLnVzZUluc2VydGlvbkVmZmVjdDtcbi8qKlxuICogUG9seWZpbGwgYHVzZUluc2VydGlvbkVmZmVjdGAgZm9yIFJlYWN0IDwgMThcbiAqIEBwYXJhbSByZW5kZXJFZmZlY3Qgd2lsbCBiZSBleGVjdXRlZCBpbiBgdXNlTWVtb2AsIGFuZCBkbyBub3QgaGF2ZSBjYWxsYmFja1xuICogQHBhcmFtIGVmZmVjdCB3aWxsIGJlIGV4ZWN1dGVkIGluIGB1c2VMYXlvdXRFZmZlY3RgXG4gKiBAcGFyYW0gZGVwc1xuICovXG52YXIgdXNlSW5zZXJ0aW9uRWZmZWN0UG9seWZpbGwgPSBmdW5jdGlvbiB1c2VJbnNlcnRpb25FZmZlY3RQb2x5ZmlsbChyZW5kZXJFZmZlY3QsIGVmZmVjdCwgZGVwcykge1xuICBSZWFjdC51c2VNZW1vKHJlbmRlckVmZmVjdCwgZGVwcyk7XG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGVmZmVjdCh0cnVlKTtcbiAgfSwgZGVwcyk7XG59O1xuXG4vKipcbiAqIENvbXBhdGlibGUgYHVzZUluc2VydGlvbkVmZmVjdGBcbiAqIHdpbGwgdXNlIGB1c2VJbnNlcnRpb25FZmZlY3RgIGlmIFJlYWN0IHZlcnNpb24gPj0gMTgsXG4gKiBvdGhlcndpc2UgdXNlIGB1c2VJbnNlcnRpb25FZmZlY3RQb2x5ZmlsbGAuXG4gKi9cbnZhciB1c2VDb21wYXRpYmxlSW5zZXJ0aW9uRWZmZWN0ID0gdXNlSW5zZXJ0aW9uRWZmZWN0ID8gZnVuY3Rpb24gKHJlbmRlckVmZmVjdCwgZWZmZWN0LCBkZXBzKSB7XG4gIHJldHVybiB1c2VJbnNlcnRpb25FZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJlbmRlckVmZmVjdCgpO1xuICAgIHJldHVybiBlZmZlY3QoKTtcbiAgfSwgZGVwcyk7XG59IDogdXNlSW5zZXJ0aW9uRWZmZWN0UG9seWZpbGw7XG5leHBvcnQgZGVmYXVsdCB1c2VDb21wYXRpYmxlSW5zZXJ0aW9uRWZmZWN0OyIsICJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IHsgd2FybmluZyB9IGZyb20gXCJyYy11dGlsL2VzL3dhcm5pbmdcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbnZhciBmdWxsQ2xvbmUgPSBfb2JqZWN0U3ByZWFkKHt9LCBSZWFjdCk7XG52YXIgdXNlSW5zZXJ0aW9uRWZmZWN0ID0gZnVsbENsb25lLnVzZUluc2VydGlvbkVmZmVjdDtcblxuLy8gRE8gTk9UIHJlZ2lzdGVyIGZ1bmN0aW9ucyBpbiB1c2VFZmZlY3QgY2xlYW51cCBmdW5jdGlvbiwgb3IgZnVuY3Rpb25zIHRoYXQgcmVnaXN0ZXJlZCB3aWxsIG5ldmVyIGJlIGNhbGxlZC5cbnZhciB1c2VDbGVhbnVwUmVnaXN0ZXIgPSBmdW5jdGlvbiB1c2VDbGVhbnVwUmVnaXN0ZXIoZGVwcykge1xuICB2YXIgZWZmZWN0Q2xlYW51cHMgPSBbXTtcbiAgdmFyIGNsZWFudXBGbGFnID0gZmFsc2U7XG4gIGZ1bmN0aW9uIHJlZ2lzdGVyKGZuKSB7XG4gICAgaWYgKGNsZWFudXBGbGFnKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICB3YXJuaW5nKGZhbHNlLCAnW0FudCBEZXNpZ24gQ1NTLWluLUpTXSBZb3UgYXJlIHJlZ2lzdGVyaW5nIGEgY2xlYW51cCBmdW5jdGlvbiBhZnRlciB1bm1vdW50LCB3aGljaCB3aWxsIG5vdCBoYXZlIGFueSBlZmZlY3QuJyk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVmZmVjdENsZWFudXBzLnB1c2goZm4pO1xuICB9XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgLy8gQ29tcGF0aWJsZSB3aXRoIHN0cmljdCBtb2RlXG4gICAgY2xlYW51cEZsYWcgPSBmYWxzZTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgY2xlYW51cEZsYWcgPSB0cnVlO1xuICAgICAgaWYgKGVmZmVjdENsZWFudXBzLmxlbmd0aCkge1xuICAgICAgICBlZmZlY3RDbGVhbnVwcy5mb3JFYWNoKGZ1bmN0aW9uIChmbikge1xuICAgICAgICAgIHJldHVybiBmbigpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuICB9LCBkZXBzKTtcbiAgcmV0dXJuIHJlZ2lzdGVyO1xufTtcbnZhciB1c2VSdW4gPSBmdW5jdGlvbiB1c2VSdW4oKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoZm4pIHtcbiAgICBmbigpO1xuICB9O1xufTtcblxuLy8gT25seSBlbmFibGUgcmVnaXN0ZXIgaW4gUmVhY3QgMThcbnZhciB1c2VFZmZlY3RDbGVhbnVwUmVnaXN0ZXIgPSB0eXBlb2YgdXNlSW5zZXJ0aW9uRWZmZWN0ICE9PSAndW5kZWZpbmVkJyA/IHVzZUNsZWFudXBSZWdpc3RlciA6IHVzZVJ1bjtcbmV4cG9ydCBkZWZhdWx0IHVzZUVmZmVjdENsZWFudXBSZWdpc3RlcjsiLCAiZnVuY3Rpb24gdXNlUHJvZEhNUigpIHtcbiAgcmV0dXJuIGZhbHNlO1xufVxudmFyIHdlYnBhY2tITVIgPSBmYWxzZTtcbmZ1bmN0aW9uIHVzZURldkhNUigpIHtcbiAgcmV0dXJuIHdlYnBhY2tITVI7XG59XG5leHBvcnQgZGVmYXVsdCBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nID8gdXNlUHJvZEhNUiA6IHVzZURldkhNUjtcblxuLy8gV2VicGFjayBgbW9kdWxlLmhvdC5hY2NlcHRgIGRvIG5vdCBzdXBwb3J0IGFueSBkZXBzIHVwZGF0ZSB0cmlnZ2VyXG4vLyBXZSBoYXZlIHRvIGhhY2sgaGFuZGxlciB0byBmb3JjZSBtYXJrIGFzIEhSTVxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlICYmIG1vZHVsZS5ob3QgJiYgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgLy8gVXNlIGBnbG9iYWxUaGlzYCBmaXJzdCwgYW5kIGB3aW5kb3dgIGZvciBvbGRlciBicm93c2Vyc1xuICAvLyBjb25zdCB3aW4gPSBnbG9iYWxUaGlzIGFzIGFueTtcbiAgdmFyIHdpbiA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IG51bGw7XG4gIGlmICh3aW4gJiYgdHlwZW9mIHdpbi53ZWJwYWNrSG90VXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIG9yaWdpbldlYnBhY2tIb3RVcGRhdGUgPSB3aW4ud2VicGFja0hvdFVwZGF0ZTtcbiAgICB3aW4ud2VicGFja0hvdFVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHdlYnBhY2tITVIgPSB0cnVlO1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdlYnBhY2tITVIgPSBmYWxzZTtcbiAgICAgIH0sIDApO1xuICAgICAgcmV0dXJuIG9yaWdpbldlYnBhY2tIb3RVcGRhdGUuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH1cbn0iLCAiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IHsgcmVtb3ZlQ1NTLCB1cGRhdGVDU1MgfSBmcm9tIFwicmMtdXRpbC9lcy9Eb20vZHluYW1pY0NTU1wiO1xuaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBTdHlsZUNvbnRleHQsIHsgQVRUUl9NQVJLLCBBVFRSX1RPS0VOLCBDU1NfSU5fSlNfSU5TVEFOQ0UgfSBmcm9tIFwiLi4vU3R5bGVDb250ZXh0XCI7XG5pbXBvcnQgeyBpc0NsaWVudFNpZGUsIHRvU3R5bGVTdHIgfSBmcm9tIFwiLi4vdXRpbFwiO1xuaW1wb3J0IHsgdHJhbnNmb3JtVG9rZW4gfSBmcm9tIFwiLi4vdXRpbC9jc3MtdmFyaWFibGVzXCI7XG5pbXBvcnQgdXNlR2xvYmFsQ2FjaGUgZnJvbSBcIi4vdXNlR2xvYmFsQ2FjaGVcIjtcbmltcG9ydCB7IHVuaXF1ZUhhc2ggfSBmcm9tIFwiLi91c2VTdHlsZVJlZ2lzdGVyXCI7XG5leHBvcnQgdmFyIENTU19WQVJfUFJFRklYID0gJ2Nzc1Zhcic7XG52YXIgdXNlQ1NTVmFyUmVnaXN0ZXIgPSBmdW5jdGlvbiB1c2VDU1NWYXJSZWdpc3Rlcihjb25maWcsIGZuKSB7XG4gIHZhciBrZXkgPSBjb25maWcua2V5LFxuICAgIHByZWZpeCA9IGNvbmZpZy5wcmVmaXgsXG4gICAgdW5pdGxlc3MgPSBjb25maWcudW5pdGxlc3MsXG4gICAgaWdub3JlID0gY29uZmlnLmlnbm9yZSxcbiAgICB0b2tlbiA9IGNvbmZpZy50b2tlbixcbiAgICBfY29uZmlnJHNjb3BlID0gY29uZmlnLnNjb3BlLFxuICAgIHNjb3BlID0gX2NvbmZpZyRzY29wZSA9PT0gdm9pZCAwID8gJycgOiBfY29uZmlnJHNjb3BlO1xuICB2YXIgX3VzZUNvbnRleHQgPSB1c2VDb250ZXh0KFN0eWxlQ29udGV4dCksXG4gICAgaW5zdGFuY2VJZCA9IF91c2VDb250ZXh0LmNhY2hlLmluc3RhbmNlSWQsXG4gICAgY29udGFpbmVyID0gX3VzZUNvbnRleHQuY29udGFpbmVyO1xuICB2YXIgdG9rZW5LZXkgPSB0b2tlbi5fdG9rZW5LZXk7XG4gIHZhciBzdHlsZVBhdGggPSBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGNvbmZpZy5wYXRoKSwgW2tleSwgc2NvcGUsIHRva2VuS2V5XSk7XG4gIHZhciBjYWNoZSA9IHVzZUdsb2JhbENhY2hlKENTU19WQVJfUFJFRklYLCBzdHlsZVBhdGgsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgb3JpZ2luVG9rZW4gPSBmbigpO1xuICAgIHZhciBfdHJhbnNmb3JtVG9rZW4gPSB0cmFuc2Zvcm1Ub2tlbihvcmlnaW5Ub2tlbiwga2V5LCB7XG4gICAgICAgIHByZWZpeDogcHJlZml4LFxuICAgICAgICB1bml0bGVzczogdW5pdGxlc3MsXG4gICAgICAgIGlnbm9yZTogaWdub3JlLFxuICAgICAgICBzY29wZTogc2NvcGVcbiAgICAgIH0pLFxuICAgICAgX3RyYW5zZm9ybVRva2VuMiA9IF9zbGljZWRUb0FycmF5KF90cmFuc2Zvcm1Ub2tlbiwgMiksXG4gICAgICBtZXJnZWRUb2tlbiA9IF90cmFuc2Zvcm1Ub2tlbjJbMF0sXG4gICAgICBjc3NWYXJzU3RyID0gX3RyYW5zZm9ybVRva2VuMlsxXTtcbiAgICB2YXIgc3R5bGVJZCA9IHVuaXF1ZUhhc2goc3R5bGVQYXRoLCBjc3NWYXJzU3RyKTtcbiAgICByZXR1cm4gW21lcmdlZFRva2VuLCBjc3NWYXJzU3RyLCBzdHlsZUlkLCBrZXldO1xuICB9LCBmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBfcmVmMiA9IF9zbGljZWRUb0FycmF5KF9yZWYsIDMpLFxuICAgICAgc3R5bGVJZCA9IF9yZWYyWzJdO1xuICAgIGlmIChpc0NsaWVudFNpZGUpIHtcbiAgICAgIHJlbW92ZUNTUyhzdHlsZUlkLCB7XG4gICAgICAgIG1hcms6IEFUVFJfTUFSS1xuICAgICAgfSk7XG4gICAgfVxuICB9LCBmdW5jdGlvbiAoX3JlZjMpIHtcbiAgICB2YXIgX3JlZjQgPSBfc2xpY2VkVG9BcnJheShfcmVmMywgMyksXG4gICAgICBjc3NWYXJzU3RyID0gX3JlZjRbMV0sXG4gICAgICBzdHlsZUlkID0gX3JlZjRbMl07XG4gICAgaWYgKCFjc3NWYXJzU3RyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBzdHlsZSA9IHVwZGF0ZUNTUyhjc3NWYXJzU3RyLCBzdHlsZUlkLCB7XG4gICAgICBtYXJrOiBBVFRSX01BUkssXG4gICAgICBwcmVwZW5kOiAncXVldWUnLFxuICAgICAgYXR0YWNoVG86IGNvbnRhaW5lcixcbiAgICAgIHByaW9yaXR5OiAtOTk5XG4gICAgfSk7XG4gICAgc3R5bGVbQ1NTX0lOX0pTX0lOU1RBTkNFXSA9IGluc3RhbmNlSWQ7XG5cbiAgICAvLyBVc2VkIGZvciBgdXNlQ2FjaGVUb2tlbmAgdG8gcmVtb3ZlIG9uIGJhdGNoIHdoZW4gdG9rZW4gcmVtb3ZlZFxuICAgIHN0eWxlLnNldEF0dHJpYnV0ZShBVFRSX1RPS0VOLCBrZXkpO1xuICB9KTtcbiAgcmV0dXJuIGNhY2hlO1xufTtcbmV4cG9ydCB2YXIgZXh0cmFjdCA9IGZ1bmN0aW9uIGV4dHJhY3QoY2FjaGUsIGVmZmVjdFN0eWxlcywgb3B0aW9ucykge1xuICB2YXIgX2NhY2hlID0gX3NsaWNlZFRvQXJyYXkoY2FjaGUsIDQpLFxuICAgIHN0eWxlU3RyID0gX2NhY2hlWzFdLFxuICAgIHN0eWxlSWQgPSBfY2FjaGVbMl0sXG4gICAgY3NzVmFyS2V5ID0gX2NhY2hlWzNdO1xuICB2YXIgX3JlZjUgPSBvcHRpb25zIHx8IHt9LFxuICAgIHBsYWluID0gX3JlZjUucGxhaW47XG4gIGlmICghc3R5bGVTdHIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2YXIgb3JkZXIgPSAtOTk5O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT0gU3R5bGUgPT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBVc2VkIGZvciByYy11dGlsXG4gIHZhciBzaGFyZWRBdHRycyA9IHtcbiAgICAnZGF0YS1yYy1vcmRlcic6ICdwcmVwZW5kUXVldWUnLFxuICAgICdkYXRhLXJjLXByaW9yaXR5JzogXCJcIi5jb25jYXQob3JkZXIpXG4gIH07XG4gIHZhciBzdHlsZVRleHQgPSB0b1N0eWxlU3RyKHN0eWxlU3RyLCBjc3NWYXJLZXksIHN0eWxlSWQsIHNoYXJlZEF0dHJzLCBwbGFpbik7XG4gIHJldHVybiBbb3JkZXIsIHN0eWxlSWQsIHN0eWxlVGV4dF07XG59O1xuZXhwb3J0IGRlZmF1bHQgdXNlQ1NTVmFyUmVnaXN0ZXI7IiwgImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgaGFzaCBmcm9tICdAZW1vdGlvbi9oYXNoJztcbmltcG9ydCB7IHJlbW92ZUNTUywgdXBkYXRlQ1NTIH0gZnJvbSBcInJjLXV0aWwvZXMvRG9tL2R5bmFtaWNDU1NcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB1bml0bGVzcyBmcm9tICdAZW1vdGlvbi91bml0bGVzcyc7XG5pbXBvcnQgeyBjb21waWxlLCBzZXJpYWxpemUsIHN0cmluZ2lmeSB9IGZyb20gJ3N0eWxpcyc7XG5pbXBvcnQgeyBjb250ZW50UXVvdGVzTGludGVyLCBoYXNoZWRBbmltYXRpb25MaW50ZXIgfSBmcm9tIFwiLi4vbGludGVyc1wiO1xuaW1wb3J0IFN0eWxlQ29udGV4dCwgeyBBVFRSX0NBQ0hFX1BBVEgsIEFUVFJfTUFSSywgQVRUUl9UT0tFTiwgQ1NTX0lOX0pTX0lOU1RBTkNFIH0gZnJvbSBcIi4uL1N0eWxlQ29udGV4dFwiO1xuaW1wb3J0IHsgaXNDbGllbnRTaWRlLCB0b1N0eWxlU3RyIH0gZnJvbSBcIi4uL3V0aWxcIjtcbmltcG9ydCB7IENTU19GSUxFX1NUWUxFLCBleGlzdFBhdGgsIGdldFN0eWxlQW5kSGFzaCB9IGZyb20gXCIuLi91dGlsL2NhY2hlTWFwVXRpbFwiO1xuaW1wb3J0IHVzZUdsb2JhbENhY2hlIGZyb20gXCIuL3VzZUdsb2JhbENhY2hlXCI7XG52YXIgU0tJUF9DSEVDSyA9ICdfc2tpcF9jaGVja18nO1xudmFyIE1VTFRJX1ZBTFVFID0gJ19tdWx0aV92YWx1ZV8nO1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gPT0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUHJlcHJvY2Vzc29yIHN0eWxlIGNvbnRlbnQgdG8gYnJvd3NlciBzdXBwb3J0IG9uZVxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVN0eWxlKHN0eWxlU3RyKSB7XG4gIHZhciBzZXJpYWxpemVkID0gc2VyaWFsaXplKGNvbXBpbGUoc3R5bGVTdHIpLCBzdHJpbmdpZnkpO1xuICByZXR1cm4gc2VyaWFsaXplZC5yZXBsYWNlKC9cXHslJSVcXDpbXjtdO30vZywgJzsnKTtcbn1cbmZ1bmN0aW9uIGlzQ29tcG91bmRDU1NQcm9wZXJ0eSh2YWx1ZSkge1xuICByZXR1cm4gX3R5cGVvZih2YWx1ZSkgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIChTS0lQX0NIRUNLIGluIHZhbHVlIHx8IE1VTFRJX1ZBTFVFIGluIHZhbHVlKTtcbn1cblxuLy8gXHU2Q0U4XHU1MTY1IGhhc2ggXHU1MDNDXG5mdW5jdGlvbiBpbmplY3RTZWxlY3Rvckhhc2goa2V5LCBoYXNoSWQsIGhhc2hQcmlvcml0eSkge1xuICBpZiAoIWhhc2hJZCkge1xuICAgIHJldHVybiBrZXk7XG4gIH1cbiAgdmFyIGhhc2hDbGFzc05hbWUgPSBcIi5cIi5jb25jYXQoaGFzaElkKTtcbiAgdmFyIGhhc2hTZWxlY3RvciA9IGhhc2hQcmlvcml0eSA9PT0gJ2xvdycgPyBcIjp3aGVyZShcIi5jb25jYXQoaGFzaENsYXNzTmFtZSwgXCIpXCIpIDogaGFzaENsYXNzTmFtZTtcblxuICAvLyBcdTZDRThcdTUxNjUgaGFzaElkXG4gIHZhciBrZXlzID0ga2V5LnNwbGl0KCcsJykubWFwKGZ1bmN0aW9uIChrKSB7XG4gICAgdmFyIF9maXJzdFBhdGgkbWF0Y2g7XG4gICAgdmFyIGZ1bGxQYXRoID0gay50cmltKCkuc3BsaXQoL1xccysvKTtcblxuICAgIC8vIFx1NTk4Mlx1Njc5QyBTZWxlY3RvciBcdTdCMkNcdTRFMDBcdTRFMkFcdTY2MkYgSFRNTCBFbGVtZW50XHVGRjBDXHU5MEEzXHU2MjExXHU0RUVDXHU1QzMxXHU2M0QyXHU1MjMwXHU1QjgzXHU3Njg0XHU1NDBFXHU5NzYyXHUzMDAyXHU1M0NEXHU0RTRCXHVGRjBDXHU1QzMxXHU2M0QyXHU1MjMwXHU2NzAwXHU1MjREXHU5NzYyXHUzMDAyXG4gICAgdmFyIGZpcnN0UGF0aCA9IGZ1bGxQYXRoWzBdIHx8ICcnO1xuICAgIHZhciBodG1sRWxlbWVudCA9ICgoX2ZpcnN0UGF0aCRtYXRjaCA9IGZpcnN0UGF0aC5tYXRjaCgvXlxcdysvKSkgPT09IG51bGwgfHwgX2ZpcnN0UGF0aCRtYXRjaCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2ZpcnN0UGF0aCRtYXRjaFswXSkgfHwgJyc7XG4gICAgZmlyc3RQYXRoID0gXCJcIi5jb25jYXQoaHRtbEVsZW1lbnQpLmNvbmNhdChoYXNoU2VsZWN0b3IpLmNvbmNhdChmaXJzdFBhdGguc2xpY2UoaHRtbEVsZW1lbnQubGVuZ3RoKSk7XG4gICAgcmV0dXJuIFtmaXJzdFBhdGhdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoZnVsbFBhdGguc2xpY2UoMSkpKS5qb2luKCcgJyk7XG4gIH0pO1xuICByZXR1cm4ga2V5cy5qb2luKCcsJyk7XG59XG4vLyBQYXJzZSBDU1NPYmplY3QgdG8gc3R5bGUgY29udGVudFxuZXhwb3J0IHZhciBwYXJzZVN0eWxlID0gZnVuY3Rpb24gcGFyc2VTdHlsZShpbnRlcnBvbGF0aW9uKSB7XG4gIHZhciBjb25maWcgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICB2YXIgX3JlZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge1xuICAgICAgcm9vdDogdHJ1ZSxcbiAgICAgIHBhcmVudFNlbGVjdG9yczogW11cbiAgICB9LFxuICAgIHJvb3QgPSBfcmVmLnJvb3QsXG4gICAgaW5qZWN0SGFzaCA9IF9yZWYuaW5qZWN0SGFzaCxcbiAgICBwYXJlbnRTZWxlY3RvcnMgPSBfcmVmLnBhcmVudFNlbGVjdG9ycztcbiAgdmFyIGhhc2hJZCA9IGNvbmZpZy5oYXNoSWQsXG4gICAgbGF5ZXIgPSBjb25maWcubGF5ZXIsXG4gICAgcGF0aCA9IGNvbmZpZy5wYXRoLFxuICAgIGhhc2hQcmlvcml0eSA9IGNvbmZpZy5oYXNoUHJpb3JpdHksXG4gICAgX2NvbmZpZyR0cmFuc2Zvcm1lcnMgPSBjb25maWcudHJhbnNmb3JtZXJzLFxuICAgIHRyYW5zZm9ybWVycyA9IF9jb25maWckdHJhbnNmb3JtZXJzID09PSB2b2lkIDAgPyBbXSA6IF9jb25maWckdHJhbnNmb3JtZXJzLFxuICAgIF9jb25maWckbGludGVycyA9IGNvbmZpZy5saW50ZXJzLFxuICAgIGxpbnRlcnMgPSBfY29uZmlnJGxpbnRlcnMgPT09IHZvaWQgMCA/IFtdIDogX2NvbmZpZyRsaW50ZXJzO1xuICB2YXIgc3R5bGVTdHIgPSAnJztcbiAgdmFyIGVmZmVjdFN0eWxlID0ge307XG4gIGZ1bmN0aW9uIHBhcnNlS2V5ZnJhbWVzKGtleWZyYW1lcykge1xuICAgIHZhciBhbmltYXRpb25OYW1lID0ga2V5ZnJhbWVzLmdldE5hbWUoaGFzaElkKTtcbiAgICBpZiAoIWVmZmVjdFN0eWxlW2FuaW1hdGlvbk5hbWVdKSB7XG4gICAgICB2YXIgX3BhcnNlU3R5bGUgPSBwYXJzZVN0eWxlKGtleWZyYW1lcy5zdHlsZSwgY29uZmlnLCB7XG4gICAgICAgICAgcm9vdDogZmFsc2UsXG4gICAgICAgICAgcGFyZW50U2VsZWN0b3JzOiBwYXJlbnRTZWxlY3RvcnNcbiAgICAgICAgfSksXG4gICAgICAgIF9wYXJzZVN0eWxlMiA9IF9zbGljZWRUb0FycmF5KF9wYXJzZVN0eWxlLCAxKSxcbiAgICAgICAgX3BhcnNlZFN0ciA9IF9wYXJzZVN0eWxlMlswXTtcbiAgICAgIGVmZmVjdFN0eWxlW2FuaW1hdGlvbk5hbWVdID0gXCJAa2V5ZnJhbWVzIFwiLmNvbmNhdChrZXlmcmFtZXMuZ2V0TmFtZShoYXNoSWQpKS5jb25jYXQoX3BhcnNlZFN0cik7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGZsYXR0ZW5MaXN0KGxpc3QpIHtcbiAgICB2YXIgZnVsbExpc3QgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IFtdO1xuICAgIGxpc3QuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbSkpIHtcbiAgICAgICAgZmxhdHRlbkxpc3QoaXRlbSwgZnVsbExpc3QpO1xuICAgICAgfSBlbHNlIGlmIChpdGVtKSB7XG4gICAgICAgIGZ1bGxMaXN0LnB1c2goaXRlbSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGZ1bGxMaXN0O1xuICB9XG4gIHZhciBmbGF0dGVuU3R5bGVMaXN0ID0gZmxhdHRlbkxpc3QoQXJyYXkuaXNBcnJheShpbnRlcnBvbGF0aW9uKSA/IGludGVycG9sYXRpb24gOiBbaW50ZXJwb2xhdGlvbl0pO1xuICBmbGF0dGVuU3R5bGVMaXN0LmZvckVhY2goZnVuY3Rpb24gKG9yaWdpblN0eWxlKSB7XG4gICAgLy8gT25seSByb290IGxldmVsIGNhbiB1c2UgcmF3IHN0cmluZ1xuICAgIHZhciBzdHlsZSA9IHR5cGVvZiBvcmlnaW5TdHlsZSA9PT0gJ3N0cmluZycgJiYgIXJvb3QgPyB7fSA6IG9yaWdpblN0eWxlO1xuICAgIGlmICh0eXBlb2Ygc3R5bGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBzdHlsZVN0ciArPSBcIlwiLmNvbmNhdChzdHlsZSwgXCJcXG5cIik7XG4gICAgfSBlbHNlIGlmIChzdHlsZS5fa2V5ZnJhbWUpIHtcbiAgICAgIC8vIEtleWZyYW1lXG4gICAgICBwYXJzZUtleWZyYW1lcyhzdHlsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBtZXJnZWRTdHlsZSA9IHRyYW5zZm9ybWVycy5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIHRyYW5zKSB7XG4gICAgICAgIHZhciBfdHJhbnMkdmlzaXQ7XG4gICAgICAgIHJldHVybiAodHJhbnMgPT09IG51bGwgfHwgdHJhbnMgPT09IHZvaWQgMCB8fCAoX3RyYW5zJHZpc2l0ID0gdHJhbnMudmlzaXQpID09PSBudWxsIHx8IF90cmFucyR2aXNpdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RyYW5zJHZpc2l0LmNhbGwodHJhbnMsIHByZXYpKSB8fCBwcmV2O1xuICAgICAgfSwgc3R5bGUpO1xuXG4gICAgICAvLyBOb3JtYWwgQ1NTT2JqZWN0XG4gICAgICBPYmplY3Qua2V5cyhtZXJnZWRTdHlsZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IG1lcmdlZFN0eWxlW2tleV07XG4gICAgICAgIGlmIChfdHlwZW9mKHZhbHVlKSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgKGtleSAhPT0gJ2FuaW1hdGlvbk5hbWUnIHx8ICF2YWx1ZS5fa2V5ZnJhbWUpICYmICFpc0NvbXBvdW5kQ1NTUHJvcGVydHkodmFsdWUpKSB7XG4gICAgICAgICAgdmFyIHN1YkluamVjdEhhc2ggPSBmYWxzZTtcblxuICAgICAgICAgIC8vIFx1NUY1M1x1NjIxMFx1NUQ0Q1x1NTk1N1x1NUJGOVx1OEM2MVx1Njc2NVx1NTkwNFx1NzQwNlxuICAgICAgICAgIHZhciBtZXJnZWRLZXkgPSBrZXkudHJpbSgpO1xuICAgICAgICAgIC8vIFdoZXRoZXIgdHJlYXQgY2hpbGQgYXMgcm9vdC4gSW4gbW9zdCBjYXNlIGl0IGlzIGZhbHNlLlxuICAgICAgICAgIHZhciBuZXh0Um9vdCA9IGZhbHNlO1xuXG4gICAgICAgICAgLy8gXHU2MkM2XHU1MjA2XHU1OTFBXHU0RTJBXHU5MDA5XHU2MkU5XHU1NjY4XG4gICAgICAgICAgaWYgKChyb290IHx8IGluamVjdEhhc2gpICYmIGhhc2hJZCkge1xuICAgICAgICAgICAgaWYgKG1lcmdlZEtleS5zdGFydHNXaXRoKCdAJykpIHtcbiAgICAgICAgICAgICAgLy8gXHU3NTY1XHU4RkM3XHU1QTkyXHU0RjUzXHU2N0U1XHU4QkUyXHVGRjBDXHU0RUE0XHU3RUQ5XHU1QjUwXHU4MjgyXHU3MEI5XHU3RUU3XHU3RUVEXHU2M0QyXHU1MTY1IGhhc2hJZFxuICAgICAgICAgICAgICBzdWJJbmplY3RIYXNoID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyZ2VkS2V5ID09PSAnJicpIHtcbiAgICAgICAgICAgICAgLy8gXHU2MkI5XHU2Mzg5IHJvb3Qgc2VsZWN0b3IgXHU0RTBBXHU3Njg0XHU1MzU1XHU0RTJBICZcbiAgICAgICAgICAgICAgbWVyZ2VkS2V5ID0gaW5qZWN0U2VsZWN0b3JIYXNoKCcnLCBoYXNoSWQsIGhhc2hQcmlvcml0eSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBcdTZDRThcdTUxNjUgaGFzaElkXG4gICAgICAgICAgICAgIG1lcmdlZEtleSA9IGluamVjdFNlbGVjdG9ySGFzaChrZXksIGhhc2hJZCwgaGFzaFByaW9yaXR5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHJvb3QgJiYgIWhhc2hJZCAmJiAobWVyZ2VkS2V5ID09PSAnJicgfHwgbWVyZ2VkS2V5ID09PSAnJykpIHtcbiAgICAgICAgICAgIC8vIEluIGNhc2Ugb2YgYHsgJyYnOiB7IGE6IHsgY29sb3I6ICdyZWQnIH0gfSB9YCBvciBgeyAnJzogeyBhOiB7IGNvbG9yOiAncmVkJyB9IH0gfWAgd2l0aG91dCBoYXNoSWQsXG4gICAgICAgICAgICAvLyB3ZSB3aWxsIGdldCBgJnthOntjb2xvcjpyZWQ7fX1gIG9yIGB7YTp7Y29sb3I6cmVkO319YCBzdHJpbmcgZm9yIHN0eWxpcyB0byBjb21waWxlLlxuICAgICAgICAgICAgLy8gQnV0IGl0IGRvZXMgbm90IGNvbmZvcm0gdG8gc3R5bGlzIHN5bnRheCxcbiAgICAgICAgICAgIC8vIGFuZCBmaW5hbGx5IHdlIHdpbGwgZ2V0IGB7Y29sb3I6cmVkO31gIGFzIGNzcywgd2hpY2ggaXMgd3JvbmcuXG4gICAgICAgICAgICAvLyBTbyB3ZSBuZWVkIHRvIHJlbW92ZSBrZXkgaW4gcm9vdCwgYW5kIHRyZWF0IGNoaWxkIGB7IGE6IHsgY29sb3I6ICdyZWQnIH0gfWAgYXMgcm9vdC5cbiAgICAgICAgICAgIG1lcmdlZEtleSA9ICcnO1xuICAgICAgICAgICAgbmV4dFJvb3QgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgX3BhcnNlU3R5bGUzID0gcGFyc2VTdHlsZSh2YWx1ZSwgY29uZmlnLCB7XG4gICAgICAgICAgICAgIHJvb3Q6IG5leHRSb290LFxuICAgICAgICAgICAgICBpbmplY3RIYXNoOiBzdWJJbmplY3RIYXNoLFxuICAgICAgICAgICAgICBwYXJlbnRTZWxlY3RvcnM6IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkocGFyZW50U2VsZWN0b3JzKSwgW21lcmdlZEtleV0pXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIF9wYXJzZVN0eWxlNCA9IF9zbGljZWRUb0FycmF5KF9wYXJzZVN0eWxlMywgMiksXG4gICAgICAgICAgICBfcGFyc2VkU3RyMiA9IF9wYXJzZVN0eWxlNFswXSxcbiAgICAgICAgICAgIGNoaWxkRWZmZWN0U3R5bGUgPSBfcGFyc2VTdHlsZTRbMV07XG4gICAgICAgICAgZWZmZWN0U3R5bGUgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGVmZmVjdFN0eWxlKSwgY2hpbGRFZmZlY3RTdHlsZSk7XG4gICAgICAgICAgc3R5bGVTdHIgKz0gXCJcIi5jb25jYXQobWVyZ2VkS2V5KS5jb25jYXQoX3BhcnNlZFN0cjIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBfdmFsdWU7XG4gICAgICAgICAgZnVuY3Rpb24gYXBwZW5kU3R5bGUoY3NzS2V5LCBjc3NWYWx1ZSkge1xuICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgKF90eXBlb2YodmFsdWUpICE9PSAnb2JqZWN0JyB8fCAhKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDAgJiYgdmFsdWVbU0tJUF9DSEVDS10pKSkge1xuICAgICAgICAgICAgICBbY29udGVudFF1b3Rlc0xpbnRlciwgaGFzaGVkQW5pbWF0aW9uTGludGVyXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGxpbnRlcnMpKS5mb3JFYWNoKGZ1bmN0aW9uIChsaW50ZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGludGVyKGNzc0tleSwgY3NzVmFsdWUsIHtcbiAgICAgICAgICAgICAgICAgIHBhdGg6IHBhdGgsXG4gICAgICAgICAgICAgICAgICBoYXNoSWQ6IGhhc2hJZCxcbiAgICAgICAgICAgICAgICAgIHBhcmVudFNlbGVjdG9yczogcGFyZW50U2VsZWN0b3JzXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBcdTU5ODJcdTY3OUNcdTY2MkZcdTY4MzdcdTVGMEZcdTUyMTlcdTc2RjRcdTYzQTVcdTYzRDJcdTUxNjVcbiAgICAgICAgICAgIHZhciBzdHlsZU5hbWUgPSBjc3NLZXkucmVwbGFjZSgvW0EtWl0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBcIi1cIi5jb25jYXQobWF0Y2gudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gQXV0byBzdWZmaXggd2l0aCBweFxuICAgICAgICAgICAgdmFyIGZvcm1hdFZhbHVlID0gY3NzVmFsdWU7XG4gICAgICAgICAgICBpZiAoIXVuaXRsZXNzW2Nzc0tleV0gJiYgdHlwZW9mIGZvcm1hdFZhbHVlID09PSAnbnVtYmVyJyAmJiBmb3JtYXRWYWx1ZSAhPT0gMCkge1xuICAgICAgICAgICAgICBmb3JtYXRWYWx1ZSA9IFwiXCIuY29uY2F0KGZvcm1hdFZhbHVlLCBcInB4XCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBoYW5kbGUgYW5pbWF0aW9uTmFtZSAmIEtleWZyYW1lIHZhbHVlXG4gICAgICAgICAgICBpZiAoY3NzS2V5ID09PSAnYW5pbWF0aW9uTmFtZScgJiYgY3NzVmFsdWUgIT09IG51bGwgJiYgY3NzVmFsdWUgIT09IHZvaWQgMCAmJiBjc3NWYWx1ZS5fa2V5ZnJhbWUpIHtcbiAgICAgICAgICAgICAgcGFyc2VLZXlmcmFtZXMoY3NzVmFsdWUpO1xuICAgICAgICAgICAgICBmb3JtYXRWYWx1ZSA9IGNzc1ZhbHVlLmdldE5hbWUoaGFzaElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0eWxlU3RyICs9IFwiXCIuY29uY2F0KHN0eWxlTmFtZSwgXCI6XCIpLmNvbmNhdChmb3JtYXRWYWx1ZSwgXCI7XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgYWN0dWFsVmFsdWUgPSAoX3ZhbHVlID0gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHZhbHVlLnZhbHVlKSAhPT0gbnVsbCAmJiBfdmFsdWUgIT09IHZvaWQgMCA/IF92YWx1ZSA6IHZhbHVlO1xuICAgICAgICAgIGlmIChfdHlwZW9mKHZhbHVlKSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCAmJiB2YWx1ZVtNVUxUSV9WQUxVRV0gJiYgQXJyYXkuaXNBcnJheShhY3R1YWxWYWx1ZSkpIHtcbiAgICAgICAgICAgIGFjdHVhbFZhbHVlLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgICAgYXBwZW5kU3R5bGUoa2V5LCBpdGVtKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhcHBlbmRTdHlsZShrZXksIGFjdHVhbFZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIGlmICghcm9vdCkge1xuICAgIHN0eWxlU3RyID0gXCJ7XCIuY29uY2F0KHN0eWxlU3RyLCBcIn1cIik7XG4gIH0gZWxzZSBpZiAobGF5ZXIpIHtcbiAgICAvLyBmaXhtZTogaHR0cHM6Ly9naXRodWIuY29tL3RoeXN1bHRhbi9zdHlsaXMvcHVsbC8zMzlcbiAgICBpZiAoc3R5bGVTdHIpIHtcbiAgICAgIHN0eWxlU3RyID0gXCJAbGF5ZXIgXCIuY29uY2F0KGxheWVyLm5hbWUsIFwiIHtcIikuY29uY2F0KHN0eWxlU3RyLCBcIn1cIik7XG4gICAgfVxuICAgIGlmIChsYXllci5kZXBlbmRlbmNpZXMpIHtcbiAgICAgIGVmZmVjdFN0eWxlW1wiQGxheWVyIFwiLmNvbmNhdChsYXllci5uYW1lKV0gPSBsYXllci5kZXBlbmRlbmNpZXMubWFwKGZ1bmN0aW9uIChkZXBzKSB7XG4gICAgICAgIHJldHVybiBcIkBsYXllciBcIi5jb25jYXQoZGVwcywgXCIsIFwiKS5jb25jYXQobGF5ZXIubmFtZSwgXCI7XCIpO1xuICAgICAgfSkuam9pbignXFxuJyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbc3R5bGVTdHIsIGVmZmVjdFN0eWxlXTtcbn07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vID09ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT1cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmV4cG9ydCBmdW5jdGlvbiB1bmlxdWVIYXNoKHBhdGgsIHN0eWxlU3RyKSB7XG4gIHJldHVybiBoYXNoKFwiXCIuY29uY2F0KHBhdGguam9pbignJScpKS5jb25jYXQoc3R5bGVTdHIpKTtcbn1cbmZ1bmN0aW9uIEVtcHR5KCkge1xuICByZXR1cm4gbnVsbDtcbn1cbmV4cG9ydCB2YXIgU1RZTEVfUFJFRklYID0gJ3N0eWxlJztcbi8qKlxuICogUmVnaXN0ZXIgYSBzdHlsZSB0byB0aGUgZ2xvYmFsIHN0eWxlIHNoZWV0LlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VTdHlsZVJlZ2lzdGVyKGluZm8sIHN0eWxlRm4pIHtcbiAgdmFyIHRva2VuID0gaW5mby50b2tlbixcbiAgICBwYXRoID0gaW5mby5wYXRoLFxuICAgIGhhc2hJZCA9IGluZm8uaGFzaElkLFxuICAgIGxheWVyID0gaW5mby5sYXllcixcbiAgICBub25jZSA9IGluZm8ubm9uY2UsXG4gICAgY2xpZW50T25seSA9IGluZm8uY2xpZW50T25seSxcbiAgICBfaW5mbyRvcmRlciA9IGluZm8ub3JkZXIsXG4gICAgb3JkZXIgPSBfaW5mbyRvcmRlciA9PT0gdm9pZCAwID8gMCA6IF9pbmZvJG9yZGVyO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KFN0eWxlQ29udGV4dCksXG4gICAgYXV0b0NsZWFyID0gX1JlYWN0JHVzZUNvbnRleHQuYXV0b0NsZWFyLFxuICAgIG1vY2sgPSBfUmVhY3QkdXNlQ29udGV4dC5tb2NrLFxuICAgIGRlZmF1bHRDYWNoZSA9IF9SZWFjdCR1c2VDb250ZXh0LmRlZmF1bHRDYWNoZSxcbiAgICBoYXNoUHJpb3JpdHkgPSBfUmVhY3QkdXNlQ29udGV4dC5oYXNoUHJpb3JpdHksXG4gICAgY29udGFpbmVyID0gX1JlYWN0JHVzZUNvbnRleHQuY29udGFpbmVyLFxuICAgIHNzcklubGluZSA9IF9SZWFjdCR1c2VDb250ZXh0LnNzcklubGluZSxcbiAgICB0cmFuc2Zvcm1lcnMgPSBfUmVhY3QkdXNlQ29udGV4dC50cmFuc2Zvcm1lcnMsXG4gICAgbGludGVycyA9IF9SZWFjdCR1c2VDb250ZXh0LmxpbnRlcnMsXG4gICAgY2FjaGUgPSBfUmVhY3QkdXNlQ29udGV4dC5jYWNoZSxcbiAgICBlbmFibGVMYXllciA9IF9SZWFjdCR1c2VDb250ZXh0LmxheWVyO1xuICB2YXIgdG9rZW5LZXkgPSB0b2tlbi5fdG9rZW5LZXk7XG4gIHZhciBmdWxsUGF0aCA9IFt0b2tlbktleV07XG4gIGlmIChlbmFibGVMYXllcikge1xuICAgIGZ1bGxQYXRoLnB1c2goJ2xheWVyJyk7XG4gIH1cbiAgZnVsbFBhdGgucHVzaC5hcHBseShmdWxsUGF0aCwgX3RvQ29uc3VtYWJsZUFycmF5KHBhdGgpKTtcblxuICAvLyBDaGVjayBpZiBuZWVkIGluc2VydCBzdHlsZVxuICB2YXIgaXNNZXJnZWRDbGllbnRTaWRlID0gaXNDbGllbnRTaWRlO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBtb2NrICE9PSB1bmRlZmluZWQpIHtcbiAgICBpc01lcmdlZENsaWVudFNpZGUgPSBtb2NrID09PSAnY2xpZW50JztcbiAgfVxuICB2YXIgX3VzZUdsb2JhbENhY2hlID0gdXNlR2xvYmFsQ2FjaGUoU1RZTEVfUFJFRklYLCBmdWxsUGF0aCxcbiAgICAvLyBDcmVhdGUgY2FjaGUgaWYgbmVlZGVkXG4gICAgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGNhY2hlUGF0aCA9IGZ1bGxQYXRoLmpvaW4oJ3wnKTtcblxuICAgICAgLy8gR2V0IHN0eWxlIGZyb20gU1NSIGlubGluZSBzdHlsZSBkaXJlY3RseVxuICAgICAgaWYgKGV4aXN0UGF0aChjYWNoZVBhdGgpKSB7XG4gICAgICAgIHZhciBfZ2V0U3R5bGVBbmRIYXNoID0gZ2V0U3R5bGVBbmRIYXNoKGNhY2hlUGF0aCksXG4gICAgICAgICAgX2dldFN0eWxlQW5kSGFzaDIgPSBfc2xpY2VkVG9BcnJheShfZ2V0U3R5bGVBbmRIYXNoLCAyKSxcbiAgICAgICAgICBpbmxpbmVDYWNoZVN0eWxlU3RyID0gX2dldFN0eWxlQW5kSGFzaDJbMF0sXG4gICAgICAgICAgc3R5bGVIYXNoID0gX2dldFN0eWxlQW5kSGFzaDJbMV07XG4gICAgICAgIGlmIChpbmxpbmVDYWNoZVN0eWxlU3RyKSB7XG4gICAgICAgICAgcmV0dXJuIFtpbmxpbmVDYWNoZVN0eWxlU3RyLCB0b2tlbktleSwgc3R5bGVIYXNoLCB7fSwgY2xpZW50T25seSwgb3JkZXJdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEdlbmVyYXRlIHN0eWxlXG4gICAgICB2YXIgc3R5bGVPYmogPSBzdHlsZUZuKCk7XG4gICAgICB2YXIgX3BhcnNlU3R5bGU1ID0gcGFyc2VTdHlsZShzdHlsZU9iaiwge1xuICAgICAgICAgIGhhc2hJZDogaGFzaElkLFxuICAgICAgICAgIGhhc2hQcmlvcml0eTogaGFzaFByaW9yaXR5LFxuICAgICAgICAgIGxheWVyOiBlbmFibGVMYXllciA/IGxheWVyIDogdW5kZWZpbmVkLFxuICAgICAgICAgIHBhdGg6IHBhdGguam9pbignLScpLFxuICAgICAgICAgIHRyYW5zZm9ybWVyczogdHJhbnNmb3JtZXJzLFxuICAgICAgICAgIGxpbnRlcnM6IGxpbnRlcnNcbiAgICAgICAgfSksXG4gICAgICAgIF9wYXJzZVN0eWxlNiA9IF9zbGljZWRUb0FycmF5KF9wYXJzZVN0eWxlNSwgMiksXG4gICAgICAgIHBhcnNlZFN0eWxlID0gX3BhcnNlU3R5bGU2WzBdLFxuICAgICAgICBlZmZlY3RTdHlsZSA9IF9wYXJzZVN0eWxlNlsxXTtcbiAgICAgIHZhciBzdHlsZVN0ciA9IG5vcm1hbGl6ZVN0eWxlKHBhcnNlZFN0eWxlKTtcbiAgICAgIHZhciBzdHlsZUlkID0gdW5pcXVlSGFzaChmdWxsUGF0aCwgc3R5bGVTdHIpO1xuICAgICAgcmV0dXJuIFtzdHlsZVN0ciwgdG9rZW5LZXksIHN0eWxlSWQsIGVmZmVjdFN0eWxlLCBjbGllbnRPbmx5LCBvcmRlcl07XG4gICAgfSxcbiAgICAvLyBSZW1vdmUgY2FjaGUgaWYgbm8gbmVlZFxuICAgIGZ1bmN0aW9uIChfcmVmMiwgZnJvbUhNUikge1xuICAgICAgdmFyIF9yZWYzID0gX3NsaWNlZFRvQXJyYXkoX3JlZjIsIDMpLFxuICAgICAgICBzdHlsZUlkID0gX3JlZjNbMl07XG4gICAgICBpZiAoKGZyb21ITVIgfHwgYXV0b0NsZWFyKSAmJiBpc0NsaWVudFNpZGUpIHtcbiAgICAgICAgcmVtb3ZlQ1NTKHN0eWxlSWQsIHtcbiAgICAgICAgICBtYXJrOiBBVFRSX01BUktcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICAvLyBFZmZlY3Q6IEluamVjdCBzdHlsZSBoZXJlXG4gICAgZnVuY3Rpb24gKF9yZWY0KSB7XG4gICAgICB2YXIgX3JlZjUgPSBfc2xpY2VkVG9BcnJheShfcmVmNCwgNCksXG4gICAgICAgIHN0eWxlU3RyID0gX3JlZjVbMF0sXG4gICAgICAgIF8gPSBfcmVmNVsxXSxcbiAgICAgICAgc3R5bGVJZCA9IF9yZWY1WzJdLFxuICAgICAgICBlZmZlY3RTdHlsZSA9IF9yZWY1WzNdO1xuICAgICAgaWYgKGlzTWVyZ2VkQ2xpZW50U2lkZSAmJiBzdHlsZVN0ciAhPT0gQ1NTX0ZJTEVfU1RZTEUpIHtcbiAgICAgICAgdmFyIG1lcmdlZENTU0NvbmZpZyA9IHtcbiAgICAgICAgICBtYXJrOiBBVFRSX01BUkssXG4gICAgICAgICAgcHJlcGVuZDogZW5hYmxlTGF5ZXIgPyBmYWxzZSA6ICdxdWV1ZScsXG4gICAgICAgICAgYXR0YWNoVG86IGNvbnRhaW5lcixcbiAgICAgICAgICBwcmlvcml0eTogb3JkZXJcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIG5vbmNlU3RyID0gdHlwZW9mIG5vbmNlID09PSAnZnVuY3Rpb24nID8gbm9uY2UoKSA6IG5vbmNlO1xuICAgICAgICBpZiAobm9uY2VTdHIpIHtcbiAgICAgICAgICBtZXJnZWRDU1NDb25maWcuY3NwID0ge1xuICAgICAgICAgICAgbm9uY2U6IG5vbmNlU3RyXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09IFNwbGl0IEVmZmVjdCBTdHlsZSA9PT09PT09PT09PT09PT09PVxuICAgICAgICAvLyBXZSB3aWxsIHNwbGl0IGVmZmVjdFN0eWxlIGhlcmUgc2luY2UgQGxheWVyIHNob3VsZCBiZSBhdCB0aGUgdG9wIGxldmVsXG4gICAgICAgIHZhciBlZmZlY3RMYXllcktleXMgPSBbXTtcbiAgICAgICAgdmFyIGVmZmVjdFJlc3RLZXlzID0gW107XG4gICAgICAgIE9iamVjdC5rZXlzKGVmZmVjdFN0eWxlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoJ0BsYXllcicpKSB7XG4gICAgICAgICAgICBlZmZlY3RMYXllcktleXMucHVzaChrZXkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlZmZlY3RSZXN0S2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyA9PT09PT09PT09PT09PT09PSBJbmplY3QgTGF5ZXIgU3R5bGUgPT09PT09PT09PT09PT09PT1cbiAgICAgICAgLy8gSW5qZWN0IGxheWVyIHN0eWxlXG4gICAgICAgIGVmZmVjdExheWVyS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChlZmZlY3RLZXkpIHtcbiAgICAgICAgICB1cGRhdGVDU1Mobm9ybWFsaXplU3R5bGUoZWZmZWN0U3R5bGVbZWZmZWN0S2V5XSksIFwiX2xheWVyLVwiLmNvbmNhdChlZmZlY3RLZXkpLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG1lcmdlZENTU0NvbmZpZyksIHt9LCB7XG4gICAgICAgICAgICBwcmVwZW5kOiB0cnVlXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PSBJbmplY3QgU3R5bGUgPT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgLy8gSW5qZWN0IHN0eWxlXG4gICAgICAgIHZhciBzdHlsZSA9IHVwZGF0ZUNTUyhzdHlsZVN0ciwgc3R5bGVJZCwgbWVyZ2VkQ1NTQ29uZmlnKTtcbiAgICAgICAgc3R5bGVbQ1NTX0lOX0pTX0lOU1RBTkNFXSA9IGNhY2hlLmluc3RhbmNlSWQ7XG5cbiAgICAgICAgLy8gVXNlZCBmb3IgYHVzZUNhY2hlVG9rZW5gIHRvIHJlbW92ZSBvbiBiYXRjaCB3aGVuIHRva2VuIHJlbW92ZWRcbiAgICAgICAgc3R5bGUuc2V0QXR0cmlidXRlKEFUVFJfVE9LRU4sIHRva2VuS2V5KTtcblxuICAgICAgICAvLyBEZWJ1ZyB1c2FnZS4gRGV2IG9ubHlcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICBzdHlsZS5zZXRBdHRyaWJ1dGUoQVRUUl9DQUNIRV9QQVRILCBmdWxsUGF0aC5qb2luKCd8JykpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PSBJbmplY3QgRWZmZWN0IFN0eWxlID09PT09PT09PT09PT09PT09XG4gICAgICAgIC8vIEluamVjdCBjbGllbnQgc2lkZSBlZmZlY3Qgc3R5bGVcbiAgICAgICAgZWZmZWN0UmVzdEtleXMuZm9yRWFjaChmdW5jdGlvbiAoZWZmZWN0S2V5KSB7XG4gICAgICAgICAgdXBkYXRlQ1NTKG5vcm1hbGl6ZVN0eWxlKGVmZmVjdFN0eWxlW2VmZmVjdEtleV0pLCBcIl9lZmZlY3QtXCIuY29uY2F0KGVmZmVjdEtleSksIG1lcmdlZENTU0NvbmZpZyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pLFxuICAgIF91c2VHbG9iYWxDYWNoZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlR2xvYmFsQ2FjaGUsIDMpLFxuICAgIGNhY2hlZFN0eWxlU3RyID0gX3VzZUdsb2JhbENhY2hlMlswXSxcbiAgICBjYWNoZWRUb2tlbktleSA9IF91c2VHbG9iYWxDYWNoZTJbMV0sXG4gICAgY2FjaGVkU3R5bGVJZCA9IF91c2VHbG9iYWxDYWNoZTJbMl07XG4gIHJldHVybiBmdW5jdGlvbiAobm9kZSkge1xuICAgIHZhciBzdHlsZU5vZGU7XG4gICAgaWYgKCFzc3JJbmxpbmUgfHwgaXNNZXJnZWRDbGllbnRTaWRlIHx8ICFkZWZhdWx0Q2FjaGUpIHtcbiAgICAgIHN0eWxlTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVtcHR5LCBudWxsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIF9yZWY2O1xuICAgICAgc3R5bGVOb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiLCBfZXh0ZW5kcyh7fSwgKF9yZWY2ID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfcmVmNiwgQVRUUl9UT0tFTiwgY2FjaGVkVG9rZW5LZXkpLCBfZGVmaW5lUHJvcGVydHkoX3JlZjYsIEFUVFJfTUFSSywgY2FjaGVkU3R5bGVJZCksIF9yZWY2KSwge1xuICAgICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xuICAgICAgICAgIF9faHRtbDogY2FjaGVkU3R5bGVTdHJcbiAgICAgICAgfVxuICAgICAgfSkpO1xuICAgIH1cbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIHN0eWxlTm9kZSwgbm9kZSk7XG4gIH07XG59XG5leHBvcnQgdmFyIGV4dHJhY3QgPSBmdW5jdGlvbiBleHRyYWN0KGNhY2hlLCBlZmZlY3RTdHlsZXMsIG9wdGlvbnMpIHtcbiAgdmFyIF9jYWNoZSA9IF9zbGljZWRUb0FycmF5KGNhY2hlLCA2KSxcbiAgICBzdHlsZVN0ciA9IF9jYWNoZVswXSxcbiAgICB0b2tlbktleSA9IF9jYWNoZVsxXSxcbiAgICBzdHlsZUlkID0gX2NhY2hlWzJdLFxuICAgIGVmZmVjdFN0eWxlID0gX2NhY2hlWzNdLFxuICAgIGNsaWVudE9ubHkgPSBfY2FjaGVbNF0sXG4gICAgb3JkZXIgPSBfY2FjaGVbNV07XG4gIHZhciBfcmVmNyA9IG9wdGlvbnMgfHwge30sXG4gICAgcGxhaW4gPSBfcmVmNy5wbGFpbjtcblxuICAvLyBTa2lwIGNsaWVudCBvbmx5IHN0eWxlXG4gIGlmIChjbGllbnRPbmx5KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIGtleVN0eWxlVGV4dCA9IHN0eWxlU3RyO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT0gU2hhcmUgPT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBVc2VkIGZvciByYy11dGlsXG4gIHZhciBzaGFyZWRBdHRycyA9IHtcbiAgICAnZGF0YS1yYy1vcmRlcic6ICdwcmVwZW5kUXVldWUnLFxuICAgICdkYXRhLXJjLXByaW9yaXR5JzogXCJcIi5jb25jYXQob3JkZXIpXG4gIH07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PSBTdHlsZSA9PT09PT09PT09PT09PT09PT09PT09XG4gIGtleVN0eWxlVGV4dCA9IHRvU3R5bGVTdHIoc3R5bGVTdHIsIHRva2VuS2V5LCBzdHlsZUlkLCBzaGFyZWRBdHRycywgcGxhaW4pO1xuXG4gIC8vID09PT09PT09PT09PT09PSBDcmVhdGUgZWZmZWN0IHN0eWxlID09PT09PT09PT09PT09PVxuICBpZiAoZWZmZWN0U3R5bGUpIHtcbiAgICBPYmplY3Qua2V5cyhlZmZlY3RTdHlsZSkuZm9yRWFjaChmdW5jdGlvbiAoZWZmZWN0S2V5KSB7XG4gICAgICAvLyBFZmZlY3Qgc3R5bGUgY2FuIGJlIHJldXNlZFxuICAgICAgaWYgKCFlZmZlY3RTdHlsZXNbZWZmZWN0S2V5XSkge1xuICAgICAgICBlZmZlY3RTdHlsZXNbZWZmZWN0S2V5XSA9IHRydWU7XG4gICAgICAgIHZhciBlZmZlY3RTdHlsZVN0ciA9IG5vcm1hbGl6ZVN0eWxlKGVmZmVjdFN0eWxlW2VmZmVjdEtleV0pO1xuICAgICAgICB2YXIgZWZmZWN0U3R5bGVIVE1MID0gdG9TdHlsZVN0cihlZmZlY3RTdHlsZVN0ciwgdG9rZW5LZXksIFwiX2VmZmVjdC1cIi5jb25jYXQoZWZmZWN0S2V5KSwgc2hhcmVkQXR0cnMsIHBsYWluKTtcbiAgICAgICAgaWYgKGVmZmVjdEtleS5zdGFydHNXaXRoKCdAbGF5ZXInKSkge1xuICAgICAgICAgIGtleVN0eWxlVGV4dCA9IGVmZmVjdFN0eWxlSFRNTCArIGtleVN0eWxlVGV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBrZXlTdHlsZVRleHQgKz0gZWZmZWN0U3R5bGVIVE1MO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIFtvcmRlciwgc3R5bGVJZCwga2V5U3R5bGVUZXh0XTtcbn07IiwgInZhciB1bml0bGVzc0tleXMgPSB7XG4gIGFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiAxLFxuICBib3JkZXJJbWFnZU91dHNldDogMSxcbiAgYm9yZGVySW1hZ2VTbGljZTogMSxcbiAgYm9yZGVySW1hZ2VXaWR0aDogMSxcbiAgYm94RmxleDogMSxcbiAgYm94RmxleEdyb3VwOiAxLFxuICBib3hPcmRpbmFsR3JvdXA6IDEsXG4gIGNvbHVtbkNvdW50OiAxLFxuICBjb2x1bW5zOiAxLFxuICBmbGV4OiAxLFxuICBmbGV4R3JvdzogMSxcbiAgZmxleFBvc2l0aXZlOiAxLFxuICBmbGV4U2hyaW5rOiAxLFxuICBmbGV4TmVnYXRpdmU6IDEsXG4gIGZsZXhPcmRlcjogMSxcbiAgZ3JpZFJvdzogMSxcbiAgZ3JpZFJvd0VuZDogMSxcbiAgZ3JpZFJvd1NwYW46IDEsXG4gIGdyaWRSb3dTdGFydDogMSxcbiAgZ3JpZENvbHVtbjogMSxcbiAgZ3JpZENvbHVtbkVuZDogMSxcbiAgZ3JpZENvbHVtblNwYW46IDEsXG4gIGdyaWRDb2x1bW5TdGFydDogMSxcbiAgbXNHcmlkUm93OiAxLFxuICBtc0dyaWRSb3dTcGFuOiAxLFxuICBtc0dyaWRDb2x1bW46IDEsXG4gIG1zR3JpZENvbHVtblNwYW46IDEsXG4gIGZvbnRXZWlnaHQ6IDEsXG4gIGxpbmVIZWlnaHQ6IDEsXG4gIG9wYWNpdHk6IDEsXG4gIG9yZGVyOiAxLFxuICBvcnBoYW5zOiAxLFxuICB0YWJTaXplOiAxLFxuICB3aWRvd3M6IDEsXG4gIHpJbmRleDogMSxcbiAgem9vbTogMSxcbiAgV2Via2l0TGluZUNsYW1wOiAxLFxuICAvLyBTVkctcmVsYXRlZCBwcm9wZXJ0aWVzXG4gIGZpbGxPcGFjaXR5OiAxLFxuICBmbG9vZE9wYWNpdHk6IDEsXG4gIHN0b3BPcGFjaXR5OiAxLFxuICBzdHJva2VEYXNoYXJyYXk6IDEsXG4gIHN0cm9rZURhc2hvZmZzZXQ6IDEsXG4gIHN0cm9rZU1pdGVybGltaXQ6IDEsXG4gIHN0cm9rZU9wYWNpdHk6IDEsXG4gIHN0cm9rZVdpZHRoOiAxXG59O1xuXG5leHBvcnQgZGVmYXVsdCB1bml0bGVzc0tleXM7XG4iLCAiZXhwb3J0IHZhciBNUyA9ICctbXMtJ1xuZXhwb3J0IHZhciBNT1ogPSAnLW1vei0nXG5leHBvcnQgdmFyIFdFQktJVCA9ICctd2Via2l0LSdcblxuZXhwb3J0IHZhciBDT01NRU5UID0gJ2NvbW0nXG5leHBvcnQgdmFyIFJVTEVTRVQgPSAncnVsZSdcbmV4cG9ydCB2YXIgREVDTEFSQVRJT04gPSAnZGVjbCdcblxuZXhwb3J0IHZhciBQQUdFID0gJ0BwYWdlJ1xuZXhwb3J0IHZhciBNRURJQSA9ICdAbWVkaWEnXG5leHBvcnQgdmFyIElNUE9SVCA9ICdAaW1wb3J0J1xuZXhwb3J0IHZhciBDSEFSU0VUID0gJ0BjaGFyc2V0J1xuZXhwb3J0IHZhciBWSUVXUE9SVCA9ICdAdmlld3BvcnQnXG5leHBvcnQgdmFyIFNVUFBPUlRTID0gJ0BzdXBwb3J0cydcbmV4cG9ydCB2YXIgRE9DVU1FTlQgPSAnQGRvY3VtZW50J1xuZXhwb3J0IHZhciBOQU1FU1BBQ0UgPSAnQG5hbWVzcGFjZSdcbmV4cG9ydCB2YXIgS0VZRlJBTUVTID0gJ0BrZXlmcmFtZXMnXG5leHBvcnQgdmFyIEZPTlRfRkFDRSA9ICdAZm9udC1mYWNlJ1xuZXhwb3J0IHZhciBDT1VOVEVSX1NUWUxFID0gJ0Bjb3VudGVyLXN0eWxlJ1xuZXhwb3J0IHZhciBGT05UX0ZFQVRVUkVfVkFMVUVTID0gJ0Bmb250LWZlYXR1cmUtdmFsdWVzJ1xuZXhwb3J0IHZhciBMQVlFUiA9ICdAbGF5ZXInXG5leHBvcnQgdmFyIFNDT1BFID0gJ0BzY29wZSdcbiIsICIvKipcbiAqIEBwYXJhbSB7bnVtYmVyfVxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5leHBvcnQgdmFyIGFicyA9IE1hdGguYWJzXG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCB2YXIgZnJvbSA9IFN0cmluZy5mcm9tQ2hhckNvZGVcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH1cbiAqIEByZXR1cm4ge29iamVjdH1cbiAqL1xuZXhwb3J0IHZhciBhc3NpZ24gPSBPYmplY3QuYXNzaWduXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNoICh2YWx1ZSwgbGVuZ3RoKSB7XG5cdHJldHVybiBjaGFyYXQodmFsdWUsIDApIF4gNDUgPyAoKCgoKCgobGVuZ3RoIDw8IDIpIF4gY2hhcmF0KHZhbHVlLCAwKSkgPDwgMikgXiBjaGFyYXQodmFsdWUsIDEpKSA8PCAyKSBeIGNoYXJhdCh2YWx1ZSwgMikpIDw8IDIpIF4gY2hhcmF0KHZhbHVlLCAzKSA6IDBcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaW0gKHZhbHVlKSB7XG5cdHJldHVybiB2YWx1ZS50cmltKClcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7UmVnRXhwfSBwYXR0ZXJuXG4gKiBAcmV0dXJuIHtzdHJpbmc/fVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2ggKHZhbHVlLCBwYXR0ZXJuKSB7XG5cdHJldHVybiAodmFsdWUgPSBwYXR0ZXJuLmV4ZWModmFsdWUpKSA/IHZhbHVlWzBdIDogdmFsdWVcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7KHN0cmluZ3xSZWdFeHApfSBwYXR0ZXJuXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVwbGFjZW1lbnRcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2UgKHZhbHVlLCBwYXR0ZXJuLCByZXBsYWNlbWVudCkge1xuXHRyZXR1cm4gdmFsdWUucmVwbGFjZShwYXR0ZXJuLCByZXBsYWNlbWVudClcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZWFyY2hcbiAqIEBwYXJhbSB7bnVtYmVyfSBwb3NpdGlvblxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5kZXhvZiAodmFsdWUsIHNlYXJjaCwgcG9zaXRpb24pIHtcblx0cmV0dXJuIHZhbHVlLmluZGV4T2Yoc2VhcmNoLCBwb3NpdGlvbilcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhcmF0ICh2YWx1ZSwgaW5kZXgpIHtcblx0cmV0dXJuIHZhbHVlLmNoYXJDb2RlQXQoaW5kZXgpIHwgMFxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHBhcmFtIHtudW1iZXJ9IGJlZ2luXG4gKiBAcGFyYW0ge251bWJlcn0gZW5kXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWJzdHIgKHZhbHVlLCBiZWdpbiwgZW5kKSB7XG5cdHJldHVybiB2YWx1ZS5zbGljZShiZWdpbiwgZW5kKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RybGVuICh2YWx1ZSkge1xuXHRyZXR1cm4gdmFsdWUubGVuZ3RoXG59XG5cbi8qKlxuICogQHBhcmFtIHthbnlbXX0gdmFsdWVcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpemVvZiAodmFsdWUpIHtcblx0cmV0dXJuIHZhbHVlLmxlbmd0aFxufVxuXG4vKipcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHBhcmFtIHthbnlbXX0gYXJyYXlcbiAqIEByZXR1cm4ge2FueX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGVuZCAodmFsdWUsIGFycmF5KSB7XG5cdHJldHVybiBhcnJheS5wdXNoKHZhbHVlKSwgdmFsdWVcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBhcnJheVxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbWJpbmUgKGFycmF5LCBjYWxsYmFjaykge1xuXHRyZXR1cm4gYXJyYXkubWFwKGNhbGxiYWNrKS5qb2luKCcnKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nW119IGFycmF5XG4gKiBAcGFyYW0ge1JlZ0V4cH0gcGF0dGVyblxuICogQHJldHVybiB7c3RyaW5nW119XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXIgKGFycmF5LCBwYXR0ZXJuKSB7XG5cdHJldHVybiBhcnJheS5maWx0ZXIoZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiAhbWF0Y2godmFsdWUsIHBhdHRlcm4pIH0pXG59XG4iLCAiaW1wb3J0IHtmcm9tLCB0cmltLCBjaGFyYXQsIHN0cmxlbiwgc3Vic3RyLCBhcHBlbmQsIGFzc2lnbn0gZnJvbSAnLi9VdGlsaXR5LmpzJ1xuXG5leHBvcnQgdmFyIGxpbmUgPSAxXG5leHBvcnQgdmFyIGNvbHVtbiA9IDFcbmV4cG9ydCB2YXIgbGVuZ3RoID0gMFxuZXhwb3J0IHZhciBwb3NpdGlvbiA9IDBcbmV4cG9ydCB2YXIgY2hhcmFjdGVyID0gMFxuZXhwb3J0IHZhciBjaGFyYWN0ZXJzID0gJydcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7b2JqZWN0IHwgbnVsbH0gcm9vdFxuICogQHBhcmFtIHtvYmplY3QgfCBudWxsfSBwYXJlbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0ge3N0cmluZ1tdIHwgc3RyaW5nfSBwcm9wc1xuICogQHBhcmFtIHtvYmplY3RbXSB8IHN0cmluZ30gY2hpbGRyZW5cbiAqIEBwYXJhbSB7b2JqZWN0W119IHNpYmxpbmdzXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub2RlICh2YWx1ZSwgcm9vdCwgcGFyZW50LCB0eXBlLCBwcm9wcywgY2hpbGRyZW4sIGxlbmd0aCwgc2libGluZ3MpIHtcblx0cmV0dXJuIHt2YWx1ZTogdmFsdWUsIHJvb3Q6IHJvb3QsIHBhcmVudDogcGFyZW50LCB0eXBlOiB0eXBlLCBwcm9wczogcHJvcHMsIGNoaWxkcmVuOiBjaGlsZHJlbiwgbGluZTogbGluZSwgY29sdW1uOiBjb2x1bW4sIGxlbmd0aDogbGVuZ3RoLCByZXR1cm46ICcnLCBzaWJsaW5nczogc2libGluZ3N9XG59XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IHJvb3RcbiAqIEBwYXJhbSB7b2JqZWN0fSBwcm9wc1xuICogQHJldHVybiB7b2JqZWN0fVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29weSAocm9vdCwgcHJvcHMpIHtcblx0cmV0dXJuIGFzc2lnbihub2RlKCcnLCBudWxsLCBudWxsLCAnJywgbnVsbCwgbnVsbCwgMCwgcm9vdC5zaWJsaW5ncyksIHJvb3QsIHtsZW5ndGg6IC1yb290Lmxlbmd0aH0sIHByb3BzKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSByb290XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaWZ0IChyb290KSB7XG5cdHdoaWxlIChyb290LnJvb3QpXG5cdFx0cm9vdCA9IGNvcHkocm9vdC5yb290LCB7Y2hpbGRyZW46IFtyb290XX0pXG5cblx0YXBwZW5kKHJvb3QsIHJvb3Quc2libGluZ3MpXG59XG5cbi8qKlxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhciAoKSB7XG5cdHJldHVybiBjaGFyYWN0ZXJcbn1cblxuLyoqXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmV2ICgpIHtcblx0Y2hhcmFjdGVyID0gcG9zaXRpb24gPiAwID8gY2hhcmF0KGNoYXJhY3RlcnMsIC0tcG9zaXRpb24pIDogMFxuXG5cdGlmIChjb2x1bW4tLSwgY2hhcmFjdGVyID09PSAxMClcblx0XHRjb2x1bW4gPSAxLCBsaW5lLS1cblxuXHRyZXR1cm4gY2hhcmFjdGVyXG59XG5cbi8qKlxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gbmV4dCAoKSB7XG5cdGNoYXJhY3RlciA9IHBvc2l0aW9uIDwgbGVuZ3RoID8gY2hhcmF0KGNoYXJhY3RlcnMsIHBvc2l0aW9uKyspIDogMFxuXG5cdGlmIChjb2x1bW4rKywgY2hhcmFjdGVyID09PSAxMClcblx0XHRjb2x1bW4gPSAxLCBsaW5lKytcblxuXHRyZXR1cm4gY2hhcmFjdGVyXG59XG5cbi8qKlxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcGVlayAoKSB7XG5cdHJldHVybiBjaGFyYXQoY2hhcmFjdGVycywgcG9zaXRpb24pXG59XG5cbi8qKlxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FyZXQgKCkge1xuXHRyZXR1cm4gcG9zaXRpb25cbn1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gYmVnaW5cbiAqIEBwYXJhbSB7bnVtYmVyfSBlbmRcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNsaWNlIChiZWdpbiwgZW5kKSB7XG5cdHJldHVybiBzdWJzdHIoY2hhcmFjdGVycywgYmVnaW4sIGVuZClcbn1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdHlwZVxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9rZW4gKHR5cGUpIHtcblx0c3dpdGNoICh0eXBlKSB7XG5cdFx0Ly8gXFwwIFxcdCBcXG4gXFxyIFxccyB3aGl0ZXNwYWNlIHRva2VuXG5cdFx0Y2FzZSAwOiBjYXNlIDk6IGNhc2UgMTA6IGNhc2UgMTM6IGNhc2UgMzI6XG5cdFx0XHRyZXR1cm4gNVxuXHRcdC8vICEgKyAsIC8gPiBAIH4gaXNvbGF0ZSB0b2tlblxuXHRcdGNhc2UgMzM6IGNhc2UgNDM6IGNhc2UgNDQ6IGNhc2UgNDc6IGNhc2UgNjI6IGNhc2UgNjQ6IGNhc2UgMTI2OlxuXHRcdC8vIDsgeyB9IGJyZWFrcG9pbnQgdG9rZW5cblx0XHRjYXNlIDU5OiBjYXNlIDEyMzogY2FzZSAxMjU6XG5cdFx0XHRyZXR1cm4gNFxuXHRcdC8vIDogYWNjb21wYW5pZWQgdG9rZW5cblx0XHRjYXNlIDU4OlxuXHRcdFx0cmV0dXJuIDNcblx0XHQvLyBcIiAnICggWyBvcGVuaW5nIGRlbGltaXQgdG9rZW5cblx0XHRjYXNlIDM0OiBjYXNlIDM5OiBjYXNlIDQwOiBjYXNlIDkxOlxuXHRcdFx0cmV0dXJuIDJcblx0XHQvLyApIF0gY2xvc2luZyBkZWxpbWl0IHRva2VuXG5cdFx0Y2FzZSA0MTogY2FzZSA5Mzpcblx0XHRcdHJldHVybiAxXG5cdH1cblxuXHRyZXR1cm4gMFxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7YW55W119XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbGxvYyAodmFsdWUpIHtcblx0cmV0dXJuIGxpbmUgPSBjb2x1bW4gPSAxLCBsZW5ndGggPSBzdHJsZW4oY2hhcmFjdGVycyA9IHZhbHVlKSwgcG9zaXRpb24gPSAwLCBbXVxufVxuXG4vKipcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHJldHVybiB7YW55fVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVhbGxvYyAodmFsdWUpIHtcblx0cmV0dXJuIGNoYXJhY3RlcnMgPSAnJywgdmFsdWVcbn1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdHlwZVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVsaW1pdCAodHlwZSkge1xuXHRyZXR1cm4gdHJpbShzbGljZShwb3NpdGlvbiAtIDEsIGRlbGltaXRlcih0eXBlID09PSA5MSA/IHR5cGUgKyAyIDogdHlwZSA9PT0gNDAgPyB0eXBlICsgMSA6IHR5cGUpKSlcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm4ge3N0cmluZ1tdfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9rZW5pemUgKHZhbHVlKSB7XG5cdHJldHVybiBkZWFsbG9jKHRva2VuaXplcihhbGxvYyh2YWx1ZSkpKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSB0eXBlXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aGl0ZXNwYWNlICh0eXBlKSB7XG5cdHdoaWxlIChjaGFyYWN0ZXIgPSBwZWVrKCkpXG5cdFx0aWYgKGNoYXJhY3RlciA8IDMzKVxuXHRcdFx0bmV4dCgpXG5cdFx0ZWxzZVxuXHRcdFx0YnJlYWtcblxuXHRyZXR1cm4gdG9rZW4odHlwZSkgPiAyIHx8IHRva2VuKGNoYXJhY3RlcikgPiAzID8gJycgOiAnICdcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBjaGlsZHJlblxuICogQHJldHVybiB7c3RyaW5nW119XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b2tlbml6ZXIgKGNoaWxkcmVuKSB7XG5cdHdoaWxlIChuZXh0KCkpXG5cdFx0c3dpdGNoICh0b2tlbihjaGFyYWN0ZXIpKSB7XG5cdFx0XHRjYXNlIDA6IGFwcGVuZChpZGVudGlmaWVyKHBvc2l0aW9uIC0gMSksIGNoaWxkcmVuKVxuXHRcdFx0XHRicmVha1xuXHRcdFx0Y2FzZSAyOiBhcHBlbmQoZGVsaW1pdChjaGFyYWN0ZXIpLCBjaGlsZHJlbilcblx0XHRcdFx0YnJlYWtcblx0XHRcdGRlZmF1bHQ6IGFwcGVuZChmcm9tKGNoYXJhY3RlciksIGNoaWxkcmVuKVxuXHRcdH1cblxuXHRyZXR1cm4gY2hpbGRyZW5cbn1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudFxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBpbmcgKGluZGV4LCBjb3VudCkge1xuXHR3aGlsZSAoLS1jb3VudCAmJiBuZXh0KCkpXG5cdFx0Ly8gbm90IDAtOSBBLUYgYS1mXG5cdFx0aWYgKGNoYXJhY3RlciA8IDQ4IHx8IGNoYXJhY3RlciA+IDEwMiB8fCAoY2hhcmFjdGVyID4gNTcgJiYgY2hhcmFjdGVyIDwgNjUpIHx8IChjaGFyYWN0ZXIgPiA3MCAmJiBjaGFyYWN0ZXIgPCA5NykpXG5cdFx0XHRicmVha1xuXG5cdHJldHVybiBzbGljZShpbmRleCwgY2FyZXQoKSArIChjb3VudCA8IDYgJiYgcGVlaygpID09IDMyICYmIG5leHQoKSA9PSAzMikpXG59XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHR5cGVcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlbGltaXRlciAodHlwZSkge1xuXHR3aGlsZSAobmV4dCgpKVxuXHRcdHN3aXRjaCAoY2hhcmFjdGVyKSB7XG5cdFx0XHQvLyBdICkgXCIgJ1xuXHRcdFx0Y2FzZSB0eXBlOlxuXHRcdFx0XHRyZXR1cm4gcG9zaXRpb25cblx0XHRcdC8vIFwiICdcblx0XHRcdGNhc2UgMzQ6IGNhc2UgMzk6XG5cdFx0XHRcdGlmICh0eXBlICE9PSAzNCAmJiB0eXBlICE9PSAzOSlcblx0XHRcdFx0XHRkZWxpbWl0ZXIoY2hhcmFjdGVyKVxuXHRcdFx0XHRicmVha1xuXHRcdFx0Ly8gKFxuXHRcdFx0Y2FzZSA0MDpcblx0XHRcdFx0aWYgKHR5cGUgPT09IDQxKVxuXHRcdFx0XHRcdGRlbGltaXRlcih0eXBlKVxuXHRcdFx0XHRicmVha1xuXHRcdFx0Ly8gXFxcblx0XHRcdGNhc2UgOTI6XG5cdFx0XHRcdG5leHQoKVxuXHRcdFx0XHRicmVha1xuXHRcdH1cblxuXHRyZXR1cm4gcG9zaXRpb25cbn1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdHlwZVxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21tZW50ZXIgKHR5cGUsIGluZGV4KSB7XG5cdHdoaWxlIChuZXh0KCkpXG5cdFx0Ly8gLy9cblx0XHRpZiAodHlwZSArIGNoYXJhY3RlciA9PT0gNDcgKyAxMClcblx0XHRcdGJyZWFrXG5cdFx0Ly8gLypcblx0XHRlbHNlIGlmICh0eXBlICsgY2hhcmFjdGVyID09PSA0MiArIDQyICYmIHBlZWsoKSA9PT0gNDcpXG5cdFx0XHRicmVha1xuXG5cdHJldHVybiAnLyonICsgc2xpY2UoaW5kZXgsIHBvc2l0aW9uIC0gMSkgKyAnKicgKyBmcm9tKHR5cGUgPT09IDQ3ID8gdHlwZSA6IG5leHQoKSlcbn1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aWZpZXIgKGluZGV4KSB7XG5cdHdoaWxlICghdG9rZW4ocGVlaygpKSlcblx0XHRuZXh0KClcblxuXHRyZXR1cm4gc2xpY2UoaW5kZXgsIHBvc2l0aW9uKVxufVxuIiwgImltcG9ydCB7Q09NTUVOVCwgUlVMRVNFVCwgREVDTEFSQVRJT059IGZyb20gJy4vRW51bS5qcydcbmltcG9ydCB7YWJzLCBjaGFyYXQsIHRyaW0sIGZyb20sIHNpemVvZiwgc3RybGVuLCBzdWJzdHIsIGFwcGVuZCwgcmVwbGFjZSwgaW5kZXhvZn0gZnJvbSAnLi9VdGlsaXR5LmpzJ1xuaW1wb3J0IHtub2RlLCBjaGFyLCBwcmV2LCBuZXh0LCBwZWVrLCB0b2tlbiwgY2FyZXQsIGFsbG9jLCBkZWFsbG9jLCBkZWxpbWl0LCB3aGl0ZXNwYWNlLCBlc2NhcGluZywgaWRlbnRpZmllciwgY29tbWVudGVyfSBmcm9tICcuL1Rva2VuaXplci5qcydcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm4ge29iamVjdFtdfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcGlsZSAodmFsdWUpIHtcblx0cmV0dXJuIGRlYWxsb2MocGFyc2UoJycsIG51bGwsIG51bGwsIG51bGwsIFsnJ10sIHZhbHVlID0gYWxsb2ModmFsdWUpLCAwLCBbMF0sIHZhbHVlKSlcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7b2JqZWN0fSByb290XG4gKiBAcGFyYW0ge29iamVjdD99IHBhcmVudFxuICogQHBhcmFtIHtzdHJpbmdbXX0gcnVsZVxuICogQHBhcmFtIHtzdHJpbmdbXX0gcnVsZXNcbiAqIEBwYXJhbSB7c3RyaW5nW119IHJ1bGVzZXRzXG4gKiBAcGFyYW0ge251bWJlcltdfSBwc2V1ZG9cbiAqIEBwYXJhbSB7bnVtYmVyW119IHBvaW50c1xuICogQHBhcmFtIHtzdHJpbmdbXX0gZGVjbGFyYXRpb25zXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZSAodmFsdWUsIHJvb3QsIHBhcmVudCwgcnVsZSwgcnVsZXMsIHJ1bGVzZXRzLCBwc2V1ZG8sIHBvaW50cywgZGVjbGFyYXRpb25zKSB7XG5cdHZhciBpbmRleCA9IDBcblx0dmFyIG9mZnNldCA9IDBcblx0dmFyIGxlbmd0aCA9IHBzZXVkb1xuXHR2YXIgYXRydWxlID0gMFxuXHR2YXIgcHJvcGVydHkgPSAwXG5cdHZhciBwcmV2aW91cyA9IDBcblx0dmFyIHZhcmlhYmxlID0gMVxuXHR2YXIgc2Nhbm5pbmcgPSAxXG5cdHZhciBhbXBlcnNhbmQgPSAxXG5cdHZhciBjaGFyYWN0ZXIgPSAwXG5cdHZhciB0eXBlID0gJydcblx0dmFyIHByb3BzID0gcnVsZXNcblx0dmFyIGNoaWxkcmVuID0gcnVsZXNldHNcblx0dmFyIHJlZmVyZW5jZSA9IHJ1bGVcblx0dmFyIGNoYXJhY3RlcnMgPSB0eXBlXG5cblx0d2hpbGUgKHNjYW5uaW5nKVxuXHRcdHN3aXRjaCAocHJldmlvdXMgPSBjaGFyYWN0ZXIsIGNoYXJhY3RlciA9IG5leHQoKSkge1xuXHRcdFx0Ly8gKFxuXHRcdFx0Y2FzZSA0MDpcblx0XHRcdFx0aWYgKHByZXZpb3VzICE9IDEwOCAmJiBjaGFyYXQoY2hhcmFjdGVycywgbGVuZ3RoIC0gMSkgPT0gNTgpIHtcblx0XHRcdFx0XHRpZiAoaW5kZXhvZihjaGFyYWN0ZXJzICs9IHJlcGxhY2UoZGVsaW1pdChjaGFyYWN0ZXIpLCAnJicsICcmXFxmJyksICcmXFxmJywgYWJzKGluZGV4ID8gcG9pbnRzW2luZGV4IC0gMV0gOiAwKSkgIT0gLTEpXG5cdFx0XHRcdFx0XHRhbXBlcnNhbmQgPSAtMVxuXHRcdFx0XHRcdGJyZWFrXG5cdFx0XHRcdH1cblx0XHRcdC8vIFwiICcgW1xuXHRcdFx0Y2FzZSAzNDogY2FzZSAzOTogY2FzZSA5MTpcblx0XHRcdFx0Y2hhcmFjdGVycyArPSBkZWxpbWl0KGNoYXJhY3Rlcilcblx0XHRcdFx0YnJlYWtcblx0XHRcdC8vIFxcdCBcXG4gXFxyIFxcc1xuXHRcdFx0Y2FzZSA5OiBjYXNlIDEwOiBjYXNlIDEzOiBjYXNlIDMyOlxuXHRcdFx0XHRjaGFyYWN0ZXJzICs9IHdoaXRlc3BhY2UocHJldmlvdXMpXG5cdFx0XHRcdGJyZWFrXG5cdFx0XHQvLyBcXFxuXHRcdFx0Y2FzZSA5Mjpcblx0XHRcdFx0Y2hhcmFjdGVycyArPSBlc2NhcGluZyhjYXJldCgpIC0gMSwgNylcblx0XHRcdFx0Y29udGludWVcblx0XHRcdC8vIC9cblx0XHRcdGNhc2UgNDc6XG5cdFx0XHRcdHN3aXRjaCAocGVlaygpKSB7XG5cdFx0XHRcdFx0Y2FzZSA0MjogY2FzZSA0Nzpcblx0XHRcdFx0XHRcdGFwcGVuZChjb21tZW50KGNvbW1lbnRlcihuZXh0KCksIGNhcmV0KCkpLCByb290LCBwYXJlbnQsIGRlY2xhcmF0aW9ucyksIGRlY2xhcmF0aW9ucylcblx0XHRcdFx0XHRcdGlmICgodG9rZW4ocHJldmlvdXMgfHwgMSkgPT0gNSB8fCB0b2tlbihwZWVrKCkgfHwgMSkgPT0gNSkgJiYgc3RybGVuKGNoYXJhY3RlcnMpICYmIHN1YnN0cihjaGFyYWN0ZXJzLCAtMSwgdm9pZCAwKSAhPT0gJyAnKSBjaGFyYWN0ZXJzICs9ICcgJ1xuXHRcdFx0XHRcdFx0YnJlYWtcblx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0Y2hhcmFjdGVycyArPSAnLydcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVha1xuXHRcdFx0Ly8ge1xuXHRcdFx0Y2FzZSAxMjMgKiB2YXJpYWJsZTpcblx0XHRcdFx0cG9pbnRzW2luZGV4KytdID0gc3RybGVuKGNoYXJhY3RlcnMpICogYW1wZXJzYW5kXG5cdFx0XHQvLyB9IDsgXFwwXG5cdFx0XHRjYXNlIDEyNSAqIHZhcmlhYmxlOiBjYXNlIDU5OiBjYXNlIDA6XG5cdFx0XHRcdHN3aXRjaCAoY2hhcmFjdGVyKSB7XG5cdFx0XHRcdFx0Ly8gXFwwIH1cblx0XHRcdFx0XHRjYXNlIDA6IGNhc2UgMTI1OiBzY2FubmluZyA9IDBcblx0XHRcdFx0XHQvLyA7XG5cdFx0XHRcdFx0Y2FzZSA1OSArIG9mZnNldDogaWYgKGFtcGVyc2FuZCA9PSAtMSkgY2hhcmFjdGVycyA9IHJlcGxhY2UoY2hhcmFjdGVycywgL1xcZi9nLCAnJylcblx0XHRcdFx0XHRcdGlmIChwcm9wZXJ0eSA+IDAgJiYgKHN0cmxlbihjaGFyYWN0ZXJzKSAtIGxlbmd0aCB8fCAodmFyaWFibGUgPT09IDAgJiYgcHJldmlvdXMgPT09IDQ3KSkpXG5cdFx0XHRcdFx0XHRcdGFwcGVuZChwcm9wZXJ0eSA+IDMyID8gZGVjbGFyYXRpb24oY2hhcmFjdGVycyArICc7JywgcnVsZSwgcGFyZW50LCBsZW5ndGggLSAxLCBkZWNsYXJhdGlvbnMpIDogZGVjbGFyYXRpb24ocmVwbGFjZShjaGFyYWN0ZXJzLCAnICcsICcnKSArICc7JywgcnVsZSwgcGFyZW50LCBsZW5ndGggLSAyLCBkZWNsYXJhdGlvbnMpLCBkZWNsYXJhdGlvbnMpXG5cdFx0XHRcdFx0XHRicmVha1xuXHRcdFx0XHRcdC8vIEAgO1xuXHRcdFx0XHRcdGNhc2UgNTk6IGNoYXJhY3RlcnMgKz0gJzsnXG5cdFx0XHRcdFx0Ly8geyBydWxlL2F0LXJ1bGVcblx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0YXBwZW5kKHJlZmVyZW5jZSA9IHJ1bGVzZXQoY2hhcmFjdGVycywgcm9vdCwgcGFyZW50LCBpbmRleCwgb2Zmc2V0LCBydWxlcywgcG9pbnRzLCB0eXBlLCBwcm9wcyA9IFtdLCBjaGlsZHJlbiA9IFtdLCBsZW5ndGgsIHJ1bGVzZXRzKSwgcnVsZXNldHMpXG5cblx0XHRcdFx0XHRcdGlmIChjaGFyYWN0ZXIgPT09IDEyMylcblx0XHRcdFx0XHRcdFx0aWYgKG9mZnNldCA9PT0gMClcblx0XHRcdFx0XHRcdFx0XHRwYXJzZShjaGFyYWN0ZXJzLCByb290LCByZWZlcmVuY2UsIHJlZmVyZW5jZSwgcHJvcHMsIHJ1bGVzZXRzLCBsZW5ndGgsIHBvaW50cywgY2hpbGRyZW4pXG5cdFx0XHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHN3aXRjaCAoYXRydWxlKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBjKG9udGFpbmVyKVxuXHRcdFx0XHRcdFx0XHRcdFx0Y2FzZSA5OTpcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGNoYXJhdChjaGFyYWN0ZXJzLCAzKSA9PT0gMTEwKSBicmVha1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gbChheWVyKVxuXHRcdFx0XHRcdFx0XHRcdFx0Y2FzZSAxMDg6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChjaGFyYXQoY2hhcmFjdGVycywgMikgPT09IDk3KSBicmVha1xuXHRcdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0XHRcdFx0b2Zmc2V0ID0gMFxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gZChvY3VtZW50KSBtKGVkaWEpIHModXBwb3J0cylcblx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgMTAwOiBjYXNlIDEwOTogY2FzZSAxMTU6XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGlmIChvZmZzZXQpIHBhcnNlKHZhbHVlLCByZWZlcmVuY2UsIHJlZmVyZW5jZSwgcnVsZSAmJiBhcHBlbmQocnVsZXNldCh2YWx1ZSwgcmVmZXJlbmNlLCByZWZlcmVuY2UsIDAsIDAsIHJ1bGVzLCBwb2ludHMsIHR5cGUsIHJ1bGVzLCBwcm9wcyA9IFtdLCBsZW5ndGgsIGNoaWxkcmVuKSwgY2hpbGRyZW4pLCBydWxlcywgY2hpbGRyZW4sIGxlbmd0aCwgcG9pbnRzLCBydWxlID8gcHJvcHMgOiBjaGlsZHJlbilcblx0XHRcdFx0XHRcdFx0XHRlbHNlIHBhcnNlKGNoYXJhY3RlcnMsIHJlZmVyZW5jZSwgcmVmZXJlbmNlLCByZWZlcmVuY2UsIFsnJ10sIGNoaWxkcmVuLCAwLCBwb2ludHMsIGNoaWxkcmVuKVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpbmRleCA9IG9mZnNldCA9IHByb3BlcnR5ID0gMCwgdmFyaWFibGUgPSBhbXBlcnNhbmQgPSAxLCB0eXBlID0gY2hhcmFjdGVycyA9ICcnLCBsZW5ndGggPSBwc2V1ZG9cblx0XHRcdFx0YnJlYWtcblx0XHRcdC8vIDpcblx0XHRcdGNhc2UgNTg6XG5cdFx0XHRcdGxlbmd0aCA9IDEgKyBzdHJsZW4oY2hhcmFjdGVycyksIHByb3BlcnR5ID0gcHJldmlvdXNcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGlmICh2YXJpYWJsZSA8IDEpXG5cdFx0XHRcdFx0aWYgKGNoYXJhY3RlciA9PSAxMjMpXG5cdFx0XHRcdFx0XHQtLXZhcmlhYmxlXG5cdFx0XHRcdFx0ZWxzZSBpZiAoY2hhcmFjdGVyID09IDEyNSAmJiB2YXJpYWJsZSsrID09IDAgJiYgcHJldigpID09IDEyNSlcblx0XHRcdFx0XHRcdGNvbnRpbnVlXG5cblx0XHRcdFx0c3dpdGNoIChjaGFyYWN0ZXJzICs9IGZyb20oY2hhcmFjdGVyKSwgY2hhcmFjdGVyICogdmFyaWFibGUpIHtcblx0XHRcdFx0XHQvLyAmXG5cdFx0XHRcdFx0Y2FzZSAzODpcblx0XHRcdFx0XHRcdGFtcGVyc2FuZCA9IG9mZnNldCA+IDAgPyAxIDogKGNoYXJhY3RlcnMgKz0gJ1xcZicsIC0xKVxuXHRcdFx0XHRcdFx0YnJlYWtcblx0XHRcdFx0XHQvLyAsXG5cdFx0XHRcdFx0Y2FzZSA0NDpcblx0XHRcdFx0XHRcdHBvaW50c1tpbmRleCsrXSA9IChzdHJsZW4oY2hhcmFjdGVycykgLSAxKSAqIGFtcGVyc2FuZCwgYW1wZXJzYW5kID0gMVxuXHRcdFx0XHRcdFx0YnJlYWtcblx0XHRcdFx0XHQvLyBAXG5cdFx0XHRcdFx0Y2FzZSA2NDpcblx0XHRcdFx0XHRcdC8vIC1cblx0XHRcdFx0XHRcdGlmIChwZWVrKCkgPT09IDQ1KVxuXHRcdFx0XHRcdFx0XHRjaGFyYWN0ZXJzICs9IGRlbGltaXQobmV4dCgpKVxuXG5cdFx0XHRcdFx0XHRhdHJ1bGUgPSBwZWVrKCksIG9mZnNldCA9IGxlbmd0aCA9IHN0cmxlbih0eXBlID0gY2hhcmFjdGVycyArPSBpZGVudGlmaWVyKGNhcmV0KCkpKSwgY2hhcmFjdGVyKytcblx0XHRcdFx0XHRcdGJyZWFrXG5cdFx0XHRcdFx0Ly8gLVxuXHRcdFx0XHRcdGNhc2UgNDU6XG5cdFx0XHRcdFx0XHRpZiAocHJldmlvdXMgPT09IDQ1ICYmIHN0cmxlbihjaGFyYWN0ZXJzKSA9PSAyKVxuXHRcdFx0XHRcdFx0XHR2YXJpYWJsZSA9IDBcblx0XHRcdFx0fVxuXHRcdH1cblxuXHRyZXR1cm4gcnVsZXNldHNcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7b2JqZWN0fSByb290XG4gKiBAcGFyYW0ge29iamVjdD99IHBhcmVudFxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0XG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBydWxlc1xuICogQHBhcmFtIHtudW1iZXJbXX0gcG9pbnRzXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICogQHBhcmFtIHtzdHJpbmdbXX0gcHJvcHNcbiAqIEBwYXJhbSB7c3RyaW5nW119IGNoaWxkcmVuXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoXG4gKiBAcGFyYW0ge29iamVjdFtdfSBzaWJsaW5nc1xuICogQHJldHVybiB7b2JqZWN0fVxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVsZXNldCAodmFsdWUsIHJvb3QsIHBhcmVudCwgaW5kZXgsIG9mZnNldCwgcnVsZXMsIHBvaW50cywgdHlwZSwgcHJvcHMsIGNoaWxkcmVuLCBsZW5ndGgsIHNpYmxpbmdzKSB7XG5cdHZhciBwb3N0ID0gb2Zmc2V0IC0gMVxuXHR2YXIgcnVsZSA9IG9mZnNldCA9PT0gMCA/IHJ1bGVzIDogWycnXVxuXHR2YXIgc2l6ZSA9IHNpemVvZihydWxlKVxuXG5cdGZvciAodmFyIGkgPSAwLCBqID0gMCwgayA9IDA7IGkgPCBpbmRleDsgKytpKVxuXHRcdGZvciAodmFyIHggPSAwLCB5ID0gc3Vic3RyKHZhbHVlLCBwb3N0ICsgMSwgcG9zdCA9IGFicyhqID0gcG9pbnRzW2ldKSksIHogPSB2YWx1ZTsgeCA8IHNpemU7ICsreClcblx0XHRcdGlmICh6ID0gdHJpbShqID4gMCA/IHJ1bGVbeF0gKyAnICcgKyB5IDogcmVwbGFjZSh5LCAvJlxcZi9nLCBydWxlW3hdKSkpXG5cdFx0XHRcdHByb3BzW2srK10gPSB6XG5cblx0cmV0dXJuIG5vZGUodmFsdWUsIHJvb3QsIHBhcmVudCwgb2Zmc2V0ID09PSAwID8gUlVMRVNFVCA6IHR5cGUsIHByb3BzLCBjaGlsZHJlbiwgbGVuZ3RoLCBzaWJsaW5ncylcbn1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEBwYXJhbSB7b2JqZWN0fSByb290XG4gKiBAcGFyYW0ge29iamVjdD99IHBhcmVudFxuICogQHBhcmFtIHtvYmplY3RbXX0gc2libGluZ3NcbiAqIEByZXR1cm4ge29iamVjdH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbW1lbnQgKHZhbHVlLCByb290LCBwYXJlbnQsIHNpYmxpbmdzKSB7XG5cdHJldHVybiBub2RlKHZhbHVlLCByb290LCBwYXJlbnQsIENPTU1FTlQsIGZyb20oY2hhcigpKSwgc3Vic3RyKHZhbHVlLCAyLCAtMiksIDAsIHNpYmxpbmdzKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHBhcmFtIHtvYmplY3R9IHJvb3RcbiAqIEBwYXJhbSB7b2JqZWN0P30gcGFyZW50XG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoXG4gKiBAcGFyYW0ge29iamVjdFtdfSBzaWJsaW5nc1xuICogQHJldHVybiB7b2JqZWN0fVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjbGFyYXRpb24gKHZhbHVlLCByb290LCBwYXJlbnQsIGxlbmd0aCwgc2libGluZ3MpIHtcblx0cmV0dXJuIG5vZGUodmFsdWUsIHJvb3QsIHBhcmVudCwgREVDTEFSQVRJT04sIHN1YnN0cih2YWx1ZSwgMCwgbGVuZ3RoKSwgc3Vic3RyKHZhbHVlLCBsZW5ndGggKyAxLCAtMSksIGxlbmd0aCwgc2libGluZ3MpXG59XG4iLCAiaW1wb3J0IHtJTVBPUlQsIExBWUVSLCBDT01NRU5ULCBSVUxFU0VULCBERUNMQVJBVElPTiwgS0VZRlJBTUVTLCBOQU1FU1BBQ0V9IGZyb20gJy4vRW51bS5qcydcbmltcG9ydCB7c3RybGVufSBmcm9tICcuL1V0aWxpdHkuanMnXG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3RbXX0gY2hpbGRyZW5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemUgKGNoaWxkcmVuLCBjYWxsYmFjaykge1xuXHR2YXIgb3V0cHV0ID0gJydcblxuXHRmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKVxuXHRcdG91dHB1dCArPSBjYWxsYmFjayhjaGlsZHJlbltpXSwgaSwgY2hpbGRyZW4sIGNhbGxiYWNrKSB8fCAnJ1xuXG5cdHJldHVybiBvdXRwdXRcbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gZWxlbWVudFxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKiBAcGFyYW0ge29iamVjdFtdfSBjaGlsZHJlblxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeSAoZWxlbWVudCwgaW5kZXgsIGNoaWxkcmVuLCBjYWxsYmFjaykge1xuXHRzd2l0Y2ggKGVsZW1lbnQudHlwZSkge1xuXHRcdGNhc2UgTEFZRVI6IGlmIChlbGVtZW50LmNoaWxkcmVuLmxlbmd0aCkgYnJlYWtcblx0XHRjYXNlIElNUE9SVDogY2FzZSBOQU1FU1BBQ0U6IGNhc2UgREVDTEFSQVRJT046IHJldHVybiBlbGVtZW50LnJldHVybiA9IGVsZW1lbnQucmV0dXJuIHx8IGVsZW1lbnQudmFsdWVcblx0XHRjYXNlIENPTU1FTlQ6IHJldHVybiAnJ1xuXHRcdGNhc2UgS0VZRlJBTUVTOiByZXR1cm4gZWxlbWVudC5yZXR1cm4gPSBlbGVtZW50LnZhbHVlICsgJ3snICsgc2VyaWFsaXplKGVsZW1lbnQuY2hpbGRyZW4sIGNhbGxiYWNrKSArICd9J1xuXHRcdGNhc2UgUlVMRVNFVDogaWYgKCFzdHJsZW4oZWxlbWVudC52YWx1ZSA9IGVsZW1lbnQucHJvcHMuam9pbignLCcpKSkgcmV0dXJuICcnXG5cdH1cblxuXHRyZXR1cm4gc3RybGVuKGNoaWxkcmVuID0gc2VyaWFsaXplKGVsZW1lbnQuY2hpbGRyZW4sIGNhbGxiYWNrKSkgPyBlbGVtZW50LnJldHVybiA9IGVsZW1lbnQudmFsdWUgKyAneycgKyBjaGlsZHJlbiArICd9JyA6ICcnXG59XG4iLCAiaW1wb3J0IGRldldhcm5pbmcgZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuZXhwb3J0IGZ1bmN0aW9uIGxpbnRXYXJuaW5nKG1lc3NhZ2UsIGluZm8pIHtcbiAgdmFyIHBhdGggPSBpbmZvLnBhdGgsXG4gICAgcGFyZW50U2VsZWN0b3JzID0gaW5mby5wYXJlbnRTZWxlY3RvcnM7XG4gIGRldldhcm5pbmcoZmFsc2UsIFwiW0FudCBEZXNpZ24gQ1NTLWluLUpTXSBcIi5jb25jYXQocGF0aCA/IFwiRXJyb3IgaW4gXCIuY29uY2F0KHBhdGgsIFwiOiBcIikgOiAnJykuY29uY2F0KG1lc3NhZ2UpLmNvbmNhdChwYXJlbnRTZWxlY3RvcnMubGVuZ3RoID8gXCIgU2VsZWN0b3I6IFwiLmNvbmNhdChwYXJlbnRTZWxlY3RvcnMuam9pbignIHwgJykpIDogJycpKTtcbn0iLCAiaW1wb3J0IHsgbGludFdhcm5pbmcgfSBmcm9tIFwiLi91dGlsc1wiO1xudmFyIGxpbnRlciA9IGZ1bmN0aW9uIGxpbnRlcihrZXksIHZhbHVlLCBpbmZvKSB7XG4gIGlmIChrZXkgPT09ICdjb250ZW50Jykge1xuICAgIC8vIEZyb20gZW1vdGlvbjogaHR0cHM6Ly9naXRodWIuY29tL2Vtb3Rpb24tanMvZW1vdGlvbi9ibG9iL21haW4vcGFja2FnZXMvc2VyaWFsaXplL3NyYy9pbmRleC5qcyNMNjNcbiAgICB2YXIgY29udGVudFZhbHVlUGF0dGVybiA9IC8oYXR0cnxjb3VudGVycz98dXJsfCgoKHJlcGVhdGluZy0pPyhsaW5lYXJ8cmFkaWFsKSl8Y29uaWMpLWdyYWRpZW50KVxcKHwobm8tKT8ob3BlbnxjbG9zZSktcXVvdGUvO1xuICAgIHZhciBjb250ZW50VmFsdWVzID0gWydub3JtYWwnLCAnbm9uZScsICdpbml0aWFsJywgJ2luaGVyaXQnLCAndW5zZXQnXTtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyB8fCBjb250ZW50VmFsdWVzLmluZGV4T2YodmFsdWUpID09PSAtMSAmJiAhY29udGVudFZhbHVlUGF0dGVybi50ZXN0KHZhbHVlKSAmJiAodmFsdWUuY2hhckF0KDApICE9PSB2YWx1ZS5jaGFyQXQodmFsdWUubGVuZ3RoIC0gMSkgfHwgdmFsdWUuY2hhckF0KDApICE9PSAnXCInICYmIHZhbHVlLmNoYXJBdCgwKSAhPT0gXCInXCIpKSB7XG4gICAgICBsaW50V2FybmluZyhcIllvdSBzZWVtIHRvIGJlIHVzaW5nIGEgdmFsdWUgZm9yICdjb250ZW50JyB3aXRob3V0IHF1b3RlcywgdHJ5IHJlcGxhY2luZyBpdCB3aXRoIGBjb250ZW50OiAnXFxcIlwiLmNvbmNhdCh2YWx1ZSwgXCJcXFwiJ2AuXCIpLCBpbmZvKTtcbiAgICB9XG4gIH1cbn07XG5leHBvcnQgZGVmYXVsdCBsaW50ZXI7IiwgImltcG9ydCB7IGxpbnRXYXJuaW5nIH0gZnJvbSBcIi4vdXRpbHNcIjtcbnZhciBsaW50ZXIgPSBmdW5jdGlvbiBsaW50ZXIoa2V5LCB2YWx1ZSwgaW5mbykge1xuICBpZiAoa2V5ID09PSAnYW5pbWF0aW9uJykge1xuICAgIGlmIChpbmZvLmhhc2hJZCAmJiB2YWx1ZSAhPT0gJ25vbmUnKSB7XG4gICAgICBsaW50V2FybmluZyhcIllvdSBzZWVtIHRvIGJlIHVzaW5nIGhhc2hlZCBhbmltYXRpb24gJ1wiLmNvbmNhdCh2YWx1ZSwgXCInLCBpbiB3aGljaCBjYXNlICdhbmltYXRpb25OYW1lJyB3aXRoIEtleWZyYW1lIGFzIHZhbHVlIGlzIHJlY29tbWVuZGVkLlwiKSwgaW5mbyk7XG4gICAgfVxuICB9XG59O1xuZXhwb3J0IGRlZmF1bHQgbGludGVyOyIsICJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBjYW5Vc2VEb20gZnJvbSBcInJjLXV0aWwvZXMvRG9tL2NhblVzZURvbVwiO1xuaW1wb3J0IHsgQVRUUl9NQVJLIH0gZnJvbSBcIi4uL1N0eWxlQ29udGV4dFwiO1xuZXhwb3J0IHZhciBBVFRSX0NBQ0hFX01BUCA9ICdkYXRhLWFudC1jc3NpbmpzLWNhY2hlLXBhdGgnO1xuXG4vKipcbiAqIFRoaXMgbWFya3Mgc3R5bGUgZnJvbSB0aGUgY3NzIGZpbGUuXG4gKiBXaGljaCBtZWFucyBub3QgZXhpc3QgaW4gYDxzdHlsZSAvPmAgdGFnLlxuICovXG5leHBvcnQgdmFyIENTU19GSUxFX1NUWUxFID0gJ19GSUxFX1NUWUxFX18nO1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZShjYWNoZVBhdGhNYXApIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKGNhY2hlUGF0aE1hcCkubWFwKGZ1bmN0aW9uIChwYXRoKSB7XG4gICAgdmFyIGhhc2ggPSBjYWNoZVBhdGhNYXBbcGF0aF07XG4gICAgcmV0dXJuIFwiXCIuY29uY2F0KHBhdGgsIFwiOlwiKS5jb25jYXQoaGFzaCk7XG4gIH0pLmpvaW4oJzsnKTtcbn1cbnZhciBjYWNoZVBhdGhNYXA7XG52YXIgZnJvbUNTU0ZpbGUgPSB0cnVlO1xuXG4vKipcbiAqIEBwcml2YXRlIFRlc3QgdXNhZ2Ugb25seS4gQ2FuIHNhdmUgcmVtb3ZlIGlmIG5vIG5lZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNldChtb2NrQ2FjaGUpIHtcbiAgdmFyIGZyb21GaWxlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB0cnVlO1xuICBjYWNoZVBhdGhNYXAgPSBtb2NrQ2FjaGU7XG4gIGZyb21DU1NGaWxlID0gZnJvbUZpbGU7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZSgpIHtcbiAgaWYgKCFjYWNoZVBhdGhNYXApIHtcbiAgICBjYWNoZVBhdGhNYXAgPSB7fTtcbiAgICBpZiAoY2FuVXNlRG9tKCkpIHtcbiAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGRpdi5jbGFzc05hbWUgPSBBVFRSX0NBQ0hFX01BUDtcbiAgICAgIGRpdi5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7XG4gICAgICBkaXYuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgZGl2LnN0eWxlLnRvcCA9ICctOTk5OXB4JztcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgICAgIHZhciBjb250ZW50ID0gZ2V0Q29tcHV0ZWRTdHlsZShkaXYpLmNvbnRlbnQgfHwgJyc7XG4gICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKC9eXCIvLCAnJykucmVwbGFjZSgvXCIkLywgJycpO1xuXG4gICAgICAvLyBGaWxsIGRhdGFcbiAgICAgIGNvbnRlbnQuc3BsaXQoJzsnKS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHZhciBfaXRlbSRzcGxpdCA9IGl0ZW0uc3BsaXQoJzonKSxcbiAgICAgICAgICBfaXRlbSRzcGxpdDIgPSBfc2xpY2VkVG9BcnJheShfaXRlbSRzcGxpdCwgMiksXG4gICAgICAgICAgcGF0aCA9IF9pdGVtJHNwbGl0MlswXSxcbiAgICAgICAgICBoYXNoID0gX2l0ZW0kc3BsaXQyWzFdO1xuICAgICAgICBjYWNoZVBhdGhNYXBbcGF0aF0gPSBoYXNoO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFJlbW92ZSBpbmxpbmUgcmVjb3JkIHN0eWxlXG4gICAgICB2YXIgaW5saW5lTWFwU3R5bGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwic3R5bGVbXCIuY29uY2F0KEFUVFJfQ0FDSEVfTUFQLCBcIl1cIikpO1xuICAgICAgaWYgKGlubGluZU1hcFN0eWxlKSB7XG4gICAgICAgIHZhciBfaW5saW5lTWFwU3R5bGUkcGFyZW47XG4gICAgICAgIGZyb21DU1NGaWxlID0gZmFsc2U7XG4gICAgICAgIChfaW5saW5lTWFwU3R5bGUkcGFyZW4gPSBpbmxpbmVNYXBTdHlsZS5wYXJlbnROb2RlKSA9PT0gbnVsbCB8fCBfaW5saW5lTWFwU3R5bGUkcGFyZW4gPT09IHZvaWQgMCB8fCBfaW5saW5lTWFwU3R5bGUkcGFyZW4ucmVtb3ZlQ2hpbGQoaW5saW5lTWFwU3R5bGUpO1xuICAgICAgfVxuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChkaXYpO1xuICAgIH1cbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGV4aXN0UGF0aChwYXRoKSB7XG4gIHByZXBhcmUoKTtcbiAgcmV0dXJuICEhY2FjaGVQYXRoTWFwW3BhdGhdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0eWxlQW5kSGFzaChwYXRoKSB7XG4gIHZhciBoYXNoID0gY2FjaGVQYXRoTWFwW3BhdGhdO1xuICB2YXIgc3R5bGVTdHIgPSBudWxsO1xuICBpZiAoaGFzaCAmJiBjYW5Vc2VEb20oKSkge1xuICAgIGlmIChmcm9tQ1NTRmlsZSkge1xuICAgICAgc3R5bGVTdHIgPSBDU1NfRklMRV9TVFlMRTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIF9zdHlsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJzdHlsZVtcIi5jb25jYXQoQVRUUl9NQVJLLCBcIj1cXFwiXCIpLmNvbmNhdChjYWNoZVBhdGhNYXBbcGF0aF0sIFwiXFxcIl1cIikpO1xuICAgICAgaWYgKF9zdHlsZSkge1xuICAgICAgICBzdHlsZVN0ciA9IF9zdHlsZS5pbm5lckhUTUw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDbGVhbiB1cCBzaW5jZSBub3QgZXhpc3QgYW55bW9yZVxuICAgICAgICBkZWxldGUgY2FjaGVQYXRoTWFwW3BhdGhdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gW3N0eWxlU3RyLCBoYXNoXTtcbn0iLCAiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xudmFyIF9FeHRyYWN0U3R5bGVGbnM7XG5pbXBvcnQgeyBleHRyYWN0IGFzIHRva2VuRXh0cmFjdFN0eWxlLCBUT0tFTl9QUkVGSVggfSBmcm9tIFwiLi9ob29rcy91c2VDYWNoZVRva2VuXCI7XG5pbXBvcnQgeyBDU1NfVkFSX1BSRUZJWCwgZXh0cmFjdCBhcyBjc3NWYXJFeHRyYWN0U3R5bGUgfSBmcm9tIFwiLi9ob29rcy91c2VDU1NWYXJSZWdpc3RlclwiO1xuaW1wb3J0IHsgZXh0cmFjdCBhcyBzdHlsZUV4dHJhY3RTdHlsZSwgU1RZTEVfUFJFRklYIH0gZnJvbSBcIi4vaG9va3MvdXNlU3R5bGVSZWdpc3RlclwiO1xuaW1wb3J0IHsgdG9TdHlsZVN0ciB9IGZyb20gXCIuL3V0aWxcIjtcbmltcG9ydCB7IEFUVFJfQ0FDSEVfTUFQLCBzZXJpYWxpemUgYXMgc2VyaWFsaXplQ2FjaGVNYXAgfSBmcm9tIFwiLi91dGlsL2NhY2hlTWFwVXRpbFwiO1xudmFyIEV4dHJhY3RTdHlsZUZucyA9IChfRXh0cmFjdFN0eWxlRm5zID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfRXh0cmFjdFN0eWxlRm5zLCBTVFlMRV9QUkVGSVgsIHN0eWxlRXh0cmFjdFN0eWxlKSwgX2RlZmluZVByb3BlcnR5KF9FeHRyYWN0U3R5bGVGbnMsIFRPS0VOX1BSRUZJWCwgdG9rZW5FeHRyYWN0U3R5bGUpLCBfZGVmaW5lUHJvcGVydHkoX0V4dHJhY3RTdHlsZUZucywgQ1NTX1ZBUl9QUkVGSVgsIGNzc1ZhckV4dHJhY3RTdHlsZSksIF9FeHRyYWN0U3R5bGVGbnMpO1xuZnVuY3Rpb24gaXNOb3ROdWxsKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbDtcbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGV4dHJhY3RTdHlsZShjYWNoZSwgb3B0aW9ucykge1xuICB2YXIgX3JlZiA9IHR5cGVvZiBvcHRpb25zID09PSAnYm9vbGVhbicgPyB7XG4gICAgICBwbGFpbjogb3B0aW9uc1xuICAgIH0gOiBvcHRpb25zIHx8IHt9LFxuICAgIF9yZWYkcGxhaW4gPSBfcmVmLnBsYWluLFxuICAgIHBsYWluID0gX3JlZiRwbGFpbiA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmJHBsYWluLFxuICAgIF9yZWYkdHlwZXMgPSBfcmVmLnR5cGVzLFxuICAgIHR5cGVzID0gX3JlZiR0eXBlcyA9PT0gdm9pZCAwID8gWydzdHlsZScsICd0b2tlbicsICdjc3NWYXInXSA6IF9yZWYkdHlwZXM7XG4gIHZhciBtYXRjaFByZWZpeFJlZ2V4cCA9IG5ldyBSZWdFeHAoXCJeKFwiLmNvbmNhdCgodHlwZW9mIHR5cGVzID09PSAnc3RyaW5nJyA/IFt0eXBlc10gOiB0eXBlcykuam9pbignfCcpLCBcIiklXCIpKTtcblxuICAvLyBwcmVmaXggd2l0aCBgc3R5bGVgIGlzIHVzZWQgZm9yIGB1c2VTdHlsZVJlZ2lzdGVyYCB0byBjYWNoZSBzdHlsZSBjb250ZXh0XG4gIHZhciBzdHlsZUtleXMgPSBBcnJheS5mcm9tKGNhY2hlLmNhY2hlLmtleXMoKSkuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gbWF0Y2hQcmVmaXhSZWdleHAudGVzdChrZXkpO1xuICB9KTtcblxuICAvLyBDb21tb24gZWZmZWN0IHN0eWxlcyBsaWtlIGFuaW1hdGlvblxuICB2YXIgZWZmZWN0U3R5bGVzID0ge307XG5cbiAgLy8gTWFwcGluZyBvZiBjYWNoZVBhdGggdG8gc3R5bGUgaGFzaFxuICB2YXIgY2FjaGVQYXRoTWFwID0ge307XG4gIHZhciBzdHlsZVRleHQgPSAnJztcbiAgc3R5bGVLZXlzLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIGNhY2hlUGF0aCA9IGtleS5yZXBsYWNlKG1hdGNoUHJlZml4UmVnZXhwLCAnJykucmVwbGFjZSgvJS9nLCAnfCcpO1xuICAgIHZhciBfa2V5JHNwbGl0ID0ga2V5LnNwbGl0KCclJyksXG4gICAgICBfa2V5JHNwbGl0MiA9IF9zbGljZWRUb0FycmF5KF9rZXkkc3BsaXQsIDEpLFxuICAgICAgcHJlZml4ID0gX2tleSRzcGxpdDJbMF07XG4gICAgdmFyIGV4dHJhY3RGbiA9IEV4dHJhY3RTdHlsZUZuc1twcmVmaXhdO1xuICAgIHZhciBleHRyYWN0ZWRTdHlsZSA9IGV4dHJhY3RGbihjYWNoZS5jYWNoZS5nZXQoa2V5KVsxXSwgZWZmZWN0U3R5bGVzLCB7XG4gICAgICBwbGFpbjogcGxhaW5cbiAgICB9KTtcbiAgICBpZiAoIWV4dHJhY3RlZFN0eWxlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIF9leHRyYWN0ZWRTdHlsZSA9IF9zbGljZWRUb0FycmF5KGV4dHJhY3RlZFN0eWxlLCAzKSxcbiAgICAgIG9yZGVyID0gX2V4dHJhY3RlZFN0eWxlWzBdLFxuICAgICAgc3R5bGVJZCA9IF9leHRyYWN0ZWRTdHlsZVsxXSxcbiAgICAgIHN0eWxlU3RyID0gX2V4dHJhY3RlZFN0eWxlWzJdO1xuICAgIGlmIChrZXkuc3RhcnRzV2l0aCgnc3R5bGUnKSkge1xuICAgICAgY2FjaGVQYXRoTWFwW2NhY2hlUGF0aF0gPSBzdHlsZUlkO1xuICAgIH1cbiAgICByZXR1cm4gW29yZGVyLCBzdHlsZVN0cl07XG4gIH0pLmZpbHRlcihpc05vdE51bGwpLnNvcnQoZnVuY3Rpb24gKF9yZWYyLCBfcmVmMykge1xuICAgIHZhciBfcmVmNCA9IF9zbGljZWRUb0FycmF5KF9yZWYyLCAxKSxcbiAgICAgIG8xID0gX3JlZjRbMF07XG4gICAgdmFyIF9yZWY1ID0gX3NsaWNlZFRvQXJyYXkoX3JlZjMsIDEpLFxuICAgICAgbzIgPSBfcmVmNVswXTtcbiAgICByZXR1cm4gbzEgLSBvMjtcbiAgfSkuZm9yRWFjaChmdW5jdGlvbiAoX3JlZjYpIHtcbiAgICB2YXIgX3JlZjcgPSBfc2xpY2VkVG9BcnJheShfcmVmNiwgMiksXG4gICAgICBzdHlsZSA9IF9yZWY3WzFdO1xuICAgIHN0eWxlVGV4dCArPSBzdHlsZTtcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gRmlsbCBDYWNoZSBQYXRoID09PT09PT09PT09PT09PT09PT09XG4gIHN0eWxlVGV4dCArPSB0b1N0eWxlU3RyKFwiLlwiLmNvbmNhdChBVFRSX0NBQ0hFX01BUCwgXCJ7Y29udGVudDpcXFwiXCIpLmNvbmNhdChzZXJpYWxpemVDYWNoZU1hcChjYWNoZVBhdGhNYXApLCBcIlxcXCI7fVwiKSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIF9kZWZpbmVQcm9wZXJ0eSh7fSwgQVRUUl9DQUNIRV9NQVAsIEFUVFJfQ0FDSEVfTUFQKSwgcGxhaW4pO1xuICByZXR1cm4gc3R5bGVUZXh0O1xufSIsICJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG52YXIgS2V5ZnJhbWUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBLZXlmcmFtZShuYW1lLCBzdHlsZSkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBLZXlmcmFtZSk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwibmFtZVwiLCB2b2lkIDApO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInN0eWxlXCIsIHZvaWQgMCk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiX2tleWZyYW1lXCIsIHRydWUpO1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5zdHlsZSA9IHN0eWxlO1xuICB9XG4gIF9jcmVhdGVDbGFzcyhLZXlmcmFtZSwgW3tcbiAgICBrZXk6IFwiZ2V0TmFtZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXROYW1lKCkge1xuICAgICAgdmFyIGhhc2hJZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJyc7XG4gICAgICByZXR1cm4gaGFzaElkID8gXCJcIi5jb25jYXQoaGFzaElkLCBcIi1cIikuY29uY2F0KHRoaXMubmFtZSkgOiB0aGlzLm5hbWU7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBLZXlmcmFtZTtcbn0oKTtcbmV4cG9ydCBkZWZhdWx0IEtleWZyYW1lOyIsICJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmZ1bmN0aW9uIHNwbGl0VmFsdWVzKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIFtbdmFsdWVdLCBmYWxzZV07XG4gIH1cbiAgdmFyIHJhd1N0eWxlID0gU3RyaW5nKHZhbHVlKS50cmltKCk7XG4gIHZhciBpbXBvcnRhbnRDZWxscyA9IHJhd1N0eWxlLm1hdGNoKC8oLiopKCFpbXBvcnRhbnQpLyk7XG4gIHZhciBzcGxpdFN0eWxlID0gKGltcG9ydGFudENlbGxzID8gaW1wb3J0YW50Q2VsbHNbMV0gOiByYXdTdHlsZSkudHJpbSgpLnNwbGl0KC9cXHMrLyk7XG5cbiAgLy8gQ29tYmluZSBzdHlsZXMgc3BsaXQgaW4gYnJhY2tldHMsIGxpa2UgYGNhbGMoMXB4ICsgMnB4KWBcbiAgdmFyIHRlbXAgPSBbXTtcbiAgdmFyIGJyYWNrZXRzID0gMDtcbiAgcmV0dXJuIFtzcGxpdFN0eWxlLnJlZHVjZShmdW5jdGlvbiAobGlzdCwgaXRlbSkge1xuICAgIGlmIChpdGVtLmluY2x1ZGVzKCcoJykgfHwgaXRlbS5pbmNsdWRlcygnKScpKSB7XG4gICAgICB2YXIgbGVmdCA9IGl0ZW0uc3BsaXQoJygnKS5sZW5ndGggLSAxO1xuICAgICAgdmFyIHJpZ2h0ID0gaXRlbS5zcGxpdCgnKScpLmxlbmd0aCAtIDE7XG4gICAgICBicmFja2V0cyArPSBsZWZ0IC0gcmlnaHQ7XG4gICAgfVxuICAgIGlmIChicmFja2V0cyA+PSAwKSB0ZW1wLnB1c2goaXRlbSk7XG4gICAgaWYgKGJyYWNrZXRzID09PSAwKSB7XG4gICAgICBsaXN0LnB1c2godGVtcC5qb2luKCcgJykpO1xuICAgICAgdGVtcCA9IFtdO1xuICAgIH1cbiAgICByZXR1cm4gbGlzdDtcbiAgfSwgW10pLCAhIWltcG9ydGFudENlbGxzXTtcbn1cbmZ1bmN0aW9uIG5vU3BsaXQobGlzdCkge1xuICBsaXN0Lm5vdFNwbGl0ID0gdHJ1ZTtcbiAgcmV0dXJuIGxpc3Q7XG59XG52YXIga2V5TWFwID0ge1xuICAvLyBJbnNldFxuICBpbnNldDogWyd0b3AnLCAncmlnaHQnLCAnYm90dG9tJywgJ2xlZnQnXSxcbiAgaW5zZXRCbG9jazogWyd0b3AnLCAnYm90dG9tJ10sXG4gIGluc2V0QmxvY2tTdGFydDogWyd0b3AnXSxcbiAgaW5zZXRCbG9ja0VuZDogWydib3R0b20nXSxcbiAgaW5zZXRJbmxpbmU6IFsnbGVmdCcsICdyaWdodCddLFxuICBpbnNldElubGluZVN0YXJ0OiBbJ2xlZnQnXSxcbiAgaW5zZXRJbmxpbmVFbmQ6IFsncmlnaHQnXSxcbiAgLy8gTWFyZ2luXG4gIG1hcmdpbkJsb2NrOiBbJ21hcmdpblRvcCcsICdtYXJnaW5Cb3R0b20nXSxcbiAgbWFyZ2luQmxvY2tTdGFydDogWydtYXJnaW5Ub3AnXSxcbiAgbWFyZ2luQmxvY2tFbmQ6IFsnbWFyZ2luQm90dG9tJ10sXG4gIG1hcmdpbklubGluZTogWydtYXJnaW5MZWZ0JywgJ21hcmdpblJpZ2h0J10sXG4gIG1hcmdpbklubGluZVN0YXJ0OiBbJ21hcmdpbkxlZnQnXSxcbiAgbWFyZ2luSW5saW5lRW5kOiBbJ21hcmdpblJpZ2h0J10sXG4gIC8vIFBhZGRpbmdcbiAgcGFkZGluZ0Jsb2NrOiBbJ3BhZGRpbmdUb3AnLCAncGFkZGluZ0JvdHRvbSddLFxuICBwYWRkaW5nQmxvY2tTdGFydDogWydwYWRkaW5nVG9wJ10sXG4gIHBhZGRpbmdCbG9ja0VuZDogWydwYWRkaW5nQm90dG9tJ10sXG4gIHBhZGRpbmdJbmxpbmU6IFsncGFkZGluZ0xlZnQnLCAncGFkZGluZ1JpZ2h0J10sXG4gIHBhZGRpbmdJbmxpbmVTdGFydDogWydwYWRkaW5nTGVmdCddLFxuICBwYWRkaW5nSW5saW5lRW5kOiBbJ3BhZGRpbmdSaWdodCddLFxuICAvLyBCb3JkZXJcbiAgYm9yZGVyQmxvY2s6IG5vU3BsaXQoWydib3JkZXJUb3AnLCAnYm9yZGVyQm90dG9tJ10pLFxuICBib3JkZXJCbG9ja1N0YXJ0OiBub1NwbGl0KFsnYm9yZGVyVG9wJ10pLFxuICBib3JkZXJCbG9ja0VuZDogbm9TcGxpdChbJ2JvcmRlckJvdHRvbSddKSxcbiAgYm9yZGVySW5saW5lOiBub1NwbGl0KFsnYm9yZGVyTGVmdCcsICdib3JkZXJSaWdodCddKSxcbiAgYm9yZGVySW5saW5lU3RhcnQ6IG5vU3BsaXQoWydib3JkZXJMZWZ0J10pLFxuICBib3JkZXJJbmxpbmVFbmQ6IG5vU3BsaXQoWydib3JkZXJSaWdodCddKSxcbiAgLy8gQm9yZGVyIHdpZHRoXG4gIGJvcmRlckJsb2NrV2lkdGg6IFsnYm9yZGVyVG9wV2lkdGgnLCAnYm9yZGVyQm90dG9tV2lkdGgnXSxcbiAgYm9yZGVyQmxvY2tTdGFydFdpZHRoOiBbJ2JvcmRlclRvcFdpZHRoJ10sXG4gIGJvcmRlckJsb2NrRW5kV2lkdGg6IFsnYm9yZGVyQm90dG9tV2lkdGgnXSxcbiAgYm9yZGVySW5saW5lV2lkdGg6IFsnYm9yZGVyTGVmdFdpZHRoJywgJ2JvcmRlclJpZ2h0V2lkdGgnXSxcbiAgYm9yZGVySW5saW5lU3RhcnRXaWR0aDogWydib3JkZXJMZWZ0V2lkdGgnXSxcbiAgYm9yZGVySW5saW5lRW5kV2lkdGg6IFsnYm9yZGVyUmlnaHRXaWR0aCddLFxuICAvLyBCb3JkZXIgc3R5bGVcbiAgYm9yZGVyQmxvY2tTdHlsZTogWydib3JkZXJUb3BTdHlsZScsICdib3JkZXJCb3R0b21TdHlsZSddLFxuICBib3JkZXJCbG9ja1N0YXJ0U3R5bGU6IFsnYm9yZGVyVG9wU3R5bGUnXSxcbiAgYm9yZGVyQmxvY2tFbmRTdHlsZTogWydib3JkZXJCb3R0b21TdHlsZSddLFxuICBib3JkZXJJbmxpbmVTdHlsZTogWydib3JkZXJMZWZ0U3R5bGUnLCAnYm9yZGVyUmlnaHRTdHlsZSddLFxuICBib3JkZXJJbmxpbmVTdGFydFN0eWxlOiBbJ2JvcmRlckxlZnRTdHlsZSddLFxuICBib3JkZXJJbmxpbmVFbmRTdHlsZTogWydib3JkZXJSaWdodFN0eWxlJ10sXG4gIC8vIEJvcmRlciBjb2xvclxuICBib3JkZXJCbG9ja0NvbG9yOiBbJ2JvcmRlclRvcENvbG9yJywgJ2JvcmRlckJvdHRvbUNvbG9yJ10sXG4gIGJvcmRlckJsb2NrU3RhcnRDb2xvcjogWydib3JkZXJUb3BDb2xvciddLFxuICBib3JkZXJCbG9ja0VuZENvbG9yOiBbJ2JvcmRlckJvdHRvbUNvbG9yJ10sXG4gIGJvcmRlcklubGluZUNvbG9yOiBbJ2JvcmRlckxlZnRDb2xvcicsICdib3JkZXJSaWdodENvbG9yJ10sXG4gIGJvcmRlcklubGluZVN0YXJ0Q29sb3I6IFsnYm9yZGVyTGVmdENvbG9yJ10sXG4gIGJvcmRlcklubGluZUVuZENvbG9yOiBbJ2JvcmRlclJpZ2h0Q29sb3InXSxcbiAgLy8gQm9yZGVyIHJhZGl1c1xuICBib3JkZXJTdGFydFN0YXJ0UmFkaXVzOiBbJ2JvcmRlclRvcExlZnRSYWRpdXMnXSxcbiAgYm9yZGVyU3RhcnRFbmRSYWRpdXM6IFsnYm9yZGVyVG9wUmlnaHRSYWRpdXMnXSxcbiAgYm9yZGVyRW5kU3RhcnRSYWRpdXM6IFsnYm9yZGVyQm90dG9tTGVmdFJhZGl1cyddLFxuICBib3JkZXJFbmRFbmRSYWRpdXM6IFsnYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMnXVxufTtcbmZ1bmN0aW9uIHdyYXBJbXBvcnRhbnRBbmRTa2lwQ2hlY2sodmFsdWUsIGltcG9ydGFudCkge1xuICB2YXIgcGFyc2VkVmFsdWUgPSB2YWx1ZTtcbiAgaWYgKGltcG9ydGFudCkge1xuICAgIHBhcnNlZFZhbHVlID0gXCJcIi5jb25jYXQocGFyc2VkVmFsdWUsIFwiICFpbXBvcnRhbnRcIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBfc2tpcF9jaGVja186IHRydWUsXG4gICAgdmFsdWU6IHBhcnNlZFZhbHVlXG4gIH07XG59XG5cbi8qKlxuICogQ29udmVydCBjc3MgbG9naWNhbCBwcm9wZXJ0aWVzIHRvIGxlZ2FjeSBwcm9wZXJ0aWVzLlxuICogU3VjaCBhczogYG1hcmdpbi1ibG9jay1zdGFydGAgdG8gYG1hcmdpbi10b3BgLlxuICogVHJhbnNmb3JtIGxpc3Q6XG4gKiAtIGluc2V0XG4gKiAtIG1hcmdpblxuICogLSBwYWRkaW5nXG4gKiAtIGJvcmRlclxuICovXG52YXIgdHJhbnNmb3JtID0ge1xuICB2aXNpdDogZnVuY3Rpb24gdmlzaXQoY3NzT2JqKSB7XG4gICAgdmFyIGNsb25lID0ge307XG4gICAgT2JqZWN0LmtleXMoY3NzT2JqKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGNzc09ialtrZXldO1xuICAgICAgdmFyIG1hdGNoVmFsdWUgPSBrZXlNYXBba2V5XTtcbiAgICAgIGlmIChtYXRjaFZhbHVlICYmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpKSB7XG4gICAgICAgIHZhciBfc3BsaXRWYWx1ZXMgPSBzcGxpdFZhbHVlcyh2YWx1ZSksXG4gICAgICAgICAgX3NwbGl0VmFsdWVzMiA9IF9zbGljZWRUb0FycmF5KF9zcGxpdFZhbHVlcywgMiksXG4gICAgICAgICAgX3ZhbHVlcyA9IF9zcGxpdFZhbHVlczJbMF0sXG4gICAgICAgICAgX2ltcG9ydGFudCA9IF9zcGxpdFZhbHVlczJbMV07XG4gICAgICAgIGlmIChtYXRjaFZhbHVlLmxlbmd0aCAmJiBtYXRjaFZhbHVlLm5vdFNwbGl0KSB7XG4gICAgICAgICAgLy8gbm90IHNwbGl0IG1lYW5zIGFsd2F5cyBnaXZlIHNhbWUgdmFsdWUgbGlrZSBib3JkZXJcbiAgICAgICAgICBtYXRjaFZhbHVlLmZvckVhY2goZnVuY3Rpb24gKG1hdGNoS2V5KSB7XG4gICAgICAgICAgICBjbG9uZVttYXRjaEtleV0gPSB3cmFwSW1wb3J0YW50QW5kU2tpcENoZWNrKHZhbHVlLCBfaW1wb3J0YW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChtYXRjaFZhbHVlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIC8vIEhhbmRsZSBsaWtlIGBtYXJnaW5CbG9ja1N0YXJ0YCA9PiBgbWFyZ2luVG9wYFxuICAgICAgICAgIGNsb25lW21hdGNoVmFsdWVbMF1dID0gd3JhcEltcG9ydGFudEFuZFNraXBDaGVjayhfdmFsdWVzWzBdLCBfaW1wb3J0YW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChtYXRjaFZhbHVlLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgIC8vIEhhbmRsZSBsaWtlIGBtYXJnaW5CbG9ja2AgPT4gYG1hcmdpblRvcGAgJiBgbWFyZ2luQm90dG9tYFxuICAgICAgICAgIG1hdGNoVmFsdWUuZm9yRWFjaChmdW5jdGlvbiAobWF0Y2hLZXksIGluZGV4KSB7XG4gICAgICAgICAgICB2YXIgX3ZhbHVlcyRpbmRleDtcbiAgICAgICAgICAgIGNsb25lW21hdGNoS2V5XSA9IHdyYXBJbXBvcnRhbnRBbmRTa2lwQ2hlY2soKF92YWx1ZXMkaW5kZXggPSBfdmFsdWVzW2luZGV4XSkgIT09IG51bGwgJiYgX3ZhbHVlcyRpbmRleCAhPT0gdm9pZCAwID8gX3ZhbHVlcyRpbmRleCA6IF92YWx1ZXNbMF0sIF9pbXBvcnRhbnQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKG1hdGNoVmFsdWUubGVuZ3RoID09PSA0KSB7XG4gICAgICAgICAgLy8gSGFuZGxlIGxpa2UgYGluc2V0YCA9PiBgdG9wYCAmIGByaWdodGAgJiBgYm90dG9tYCAmIGBsZWZ0YFxuICAgICAgICAgIG1hdGNoVmFsdWUuZm9yRWFjaChmdW5jdGlvbiAobWF0Y2hLZXksIGluZGV4KSB7XG4gICAgICAgICAgICB2YXIgX3JlZiwgX3ZhbHVlcyRpbmRleDI7XG4gICAgICAgICAgICBjbG9uZVttYXRjaEtleV0gPSB3cmFwSW1wb3J0YW50QW5kU2tpcENoZWNrKChfcmVmID0gKF92YWx1ZXMkaW5kZXgyID0gX3ZhbHVlc1tpbmRleF0pICE9PSBudWxsICYmIF92YWx1ZXMkaW5kZXgyICE9PSB2b2lkIDAgPyBfdmFsdWVzJGluZGV4MiA6IF92YWx1ZXNbaW5kZXggLSAyXSkgIT09IG51bGwgJiYgX3JlZiAhPT0gdm9pZCAwID8gX3JlZiA6IF92YWx1ZXNbMF0sIF9pbXBvcnRhbnQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNsb25lW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2xvbmVba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjbG9uZTtcbiAgfVxufTtcbmV4cG9ydCBkZWZhdWx0IHRyYW5zZm9ybTsiLCAiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbnZhciBJY29uQ29udGV4dCA9IC8qI19fUFVSRV9fKi9jcmVhdGVDb250ZXh0KHt9KTtcbmV4cG9ydCBkZWZhdWx0IEljb25Db250ZXh0OyIsICJpbXBvcnQgYXJyYXlXaXRoSG9sZXMgZnJvbSBcIi4vYXJyYXlXaXRoSG9sZXMuanNcIjtcbmltcG9ydCBpdGVyYWJsZVRvQXJyYXkgZnJvbSBcIi4vaXRlcmFibGVUb0FycmF5LmpzXCI7XG5pbXBvcnQgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkgZnJvbSBcIi4vdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkuanNcIjtcbmltcG9ydCBub25JdGVyYWJsZVJlc3QgZnJvbSBcIi4vbm9uSXRlcmFibGVSZXN0LmpzXCI7XG5mdW5jdGlvbiBfdG9BcnJheShyKSB7XG4gIHJldHVybiBhcnJheVdpdGhIb2xlcyhyKSB8fCBpdGVyYWJsZVRvQXJyYXkocikgfHwgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkocikgfHwgbm9uSXRlcmFibGVSZXN0KCk7XG59XG5leHBvcnQgeyBfdG9BcnJheSBhcyBkZWZhdWx0IH07IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldChlbnRpdHksIHBhdGgpIHtcbiAgdmFyIGN1cnJlbnQgPSBlbnRpdHk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY3VycmVudCA9IGN1cnJlbnRbcGF0aFtpXV07XG4gIH1cbiAgcmV0dXJuIGN1cnJlbnQ7XG59IiwgImltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF90b0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0FycmF5XCI7XG5pbXBvcnQgZ2V0IGZyb20gXCIuL2dldFwiO1xuZnVuY3Rpb24gaW50ZXJuYWxTZXQoZW50aXR5LCBwYXRocywgdmFsdWUsIHJlbW92ZUlmVW5kZWZpbmVkKSB7XG4gIGlmICghcGF0aHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHZhciBfcGF0aHMgPSBfdG9BcnJheShwYXRocyksXG4gICAgcGF0aCA9IF9wYXRoc1swXSxcbiAgICByZXN0UGF0aCA9IF9wYXRocy5zbGljZSgxKTtcbiAgdmFyIGNsb25lO1xuICBpZiAoIWVudGl0eSAmJiB0eXBlb2YgcGF0aCA9PT0gJ251bWJlcicpIHtcbiAgICBjbG9uZSA9IFtdO1xuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZW50aXR5KSkge1xuICAgIGNsb25lID0gX3RvQ29uc3VtYWJsZUFycmF5KGVudGl0eSk7XG4gIH0gZWxzZSB7XG4gICAgY2xvbmUgPSBfb2JqZWN0U3ByZWFkKHt9LCBlbnRpdHkpO1xuICB9XG5cbiAgLy8gRGVsZXRlIHByb3AgaWYgYHJlbW92ZUlmVW5kZWZpbmVkYCBhbmQgdmFsdWUgaXMgdW5kZWZpbmVkXG4gIGlmIChyZW1vdmVJZlVuZGVmaW5lZCAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIHJlc3RQYXRoLmxlbmd0aCA9PT0gMSkge1xuICAgIGRlbGV0ZSBjbG9uZVtwYXRoXVtyZXN0UGF0aFswXV07XG4gIH0gZWxzZSB7XG4gICAgY2xvbmVbcGF0aF0gPSBpbnRlcm5hbFNldChjbG9uZVtwYXRoXSwgcmVzdFBhdGgsIHZhbHVlLCByZW1vdmVJZlVuZGVmaW5lZCk7XG4gIH1cbiAgcmV0dXJuIGNsb25lO1xufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2V0KGVudGl0eSwgcGF0aHMsIHZhbHVlKSB7XG4gIHZhciByZW1vdmVJZlVuZGVmaW5lZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogZmFsc2U7XG4gIC8vIERvIG5vdGhpbmcgaWYgYHJlbW92ZUlmVW5kZWZpbmVkYCBhbmQgcGFyZW50IG9iamVjdCBub3QgZXhpc3RcbiAgaWYgKHBhdGhzLmxlbmd0aCAmJiByZW1vdmVJZlVuZGVmaW5lZCAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICFnZXQoZW50aXR5LCBwYXRocy5zbGljZSgwLCAtMSkpKSB7XG4gICAgcmV0dXJuIGVudGl0eTtcbiAgfVxuICByZXR1cm4gaW50ZXJuYWxTZXQoZW50aXR5LCBwYXRocywgdmFsdWUsIHJlbW92ZUlmVW5kZWZpbmVkKTtcbn1cbmZ1bmN0aW9uIGlzT2JqZWN0KG9iaikge1xuICByZXR1cm4gX3R5cGVvZihvYmopID09PSAnb2JqZWN0JyAmJiBvYmogIT09IG51bGwgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikgPT09IE9iamVjdC5wcm90b3R5cGU7XG59XG5mdW5jdGlvbiBjcmVhdGVFbXB0eShzb3VyY2UpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoc291cmNlKSA/IFtdIDoge307XG59XG52YXIga2V5cyA9IHR5cGVvZiBSZWZsZWN0ID09PSAndW5kZWZpbmVkJyA/IE9iamVjdC5rZXlzIDogUmVmbGVjdC5vd25LZXlzO1xuXG4vKipcbiAqIE1lcmdlIG9iamVjdHMgd2hpY2ggd2lsbCBjcmVhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgc291cmNlcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBzb3VyY2VzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG4gIHZhciBjbG9uZSA9IGNyZWF0ZUVtcHR5KHNvdXJjZXNbMF0pO1xuICBzb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNyYykge1xuICAgIGZ1bmN0aW9uIGludGVybmFsTWVyZ2UocGF0aCwgcGFyZW50TG9vcFNldCkge1xuICAgICAgdmFyIGxvb3BTZXQgPSBuZXcgU2V0KHBhcmVudExvb3BTZXQpO1xuICAgICAgdmFyIHZhbHVlID0gZ2V0KHNyYywgcGF0aCk7XG4gICAgICB2YXIgaXNBcnIgPSBBcnJheS5pc0FycmF5KHZhbHVlKTtcbiAgICAgIGlmIChpc0FyciB8fCBpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgLy8gT25seSBhZGQgbm90IGxvb3Agb2JqXG4gICAgICAgIGlmICghbG9vcFNldC5oYXModmFsdWUpKSB7XG4gICAgICAgICAgbG9vcFNldC5hZGQodmFsdWUpO1xuICAgICAgICAgIHZhciBvcmlnaW5WYWx1ZSA9IGdldChjbG9uZSwgcGF0aCk7XG4gICAgICAgICAgaWYgKGlzQXJyKSB7XG4gICAgICAgICAgICAvLyBBcnJheSB3aWxsIGFsd2F5cyBiZSBvdmVycmlkZVxuICAgICAgICAgICAgY2xvbmUgPSBzZXQoY2xvbmUsIHBhdGgsIFtdKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFvcmlnaW5WYWx1ZSB8fCBfdHlwZW9mKG9yaWdpblZhbHVlKSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIC8vIEluaXQgY29udGFpbmVyIGlmIG5vdCBleGlzdFxuICAgICAgICAgICAgY2xvbmUgPSBzZXQoY2xvbmUsIHBhdGgsIGNyZWF0ZUVtcHR5KHZhbHVlKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGtleXModmFsdWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgaW50ZXJuYWxNZXJnZShbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHBhdGgpLCBba2V5XSksIGxvb3BTZXQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbG9uZSA9IHNldChjbG9uZSwgcGF0aCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpbnRlcm5hbE1lcmdlKFtdKTtcbiAgfSk7XG4gIHJldHVybiBjbG9uZTtcbn0iLCAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHJjV2FybmluZywgeyByZXNldFdhcm5lZCBhcyByY1Jlc2V0V2FybmVkIH0gZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuZXhwb3J0IGZ1bmN0aW9uIG5vb3AoKSB7fVxubGV0IGRlcHJlY2F0ZWRXYXJuTGlzdCA9IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gcmVzZXRXYXJuZWQoKSB7XG4gIGRlcHJlY2F0ZWRXYXJuTGlzdCA9IG51bGw7XG4gIHJjUmVzZXRXYXJuZWQoKTtcbn1cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tbXV0YWJsZS1leHBvcnRzXG5sZXQgd2FybmluZyA9IG5vb3A7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB3YXJuaW5nID0gKHZhbGlkLCBjb21wb25lbnQsIG1lc3NhZ2UpID0+IHtcbiAgICByY1dhcm5pbmcodmFsaWQsIGBbYW50ZDogJHtjb21wb25lbnR9XSAke21lc3NhZ2V9YCk7XG4gICAgLy8gU3RyaWN0TW9kZSB3aWxsIGluamVjdCBjb25zb2xlIHdoaWNoIHdpbGwgbm90IHRocm93IHdhcm5pbmcgaW4gUmVhY3QgMTcuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAndGVzdCcpIHtcbiAgICAgIHJlc2V0V2FybmVkKCk7XG4gICAgfVxuICB9O1xufVxuZXhwb3J0IGNvbnN0IFdhcm5pbmdDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQoe30pO1xuLyoqXG4gKiBUaGlzIGlzIGEgaG9vayBidXQgd2Ugbm90IG5hbWVkIGFzIGB1c2VXYXJuaW5nYFxuICogc2luY2UgdGhpcyBpcyBvbmx5IHVzZWQgaW4gZGV2ZWxvcG1lbnQuXG4gKiBXZSBzaG91bGQgYWx3YXlzIHdyYXAgdGhpcyBpbiBgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpYCBjb25kaXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IGRldlVzZVdhcm5pbmcgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gY29tcG9uZW50ID0+IHtcbiAgY29uc3Qge1xuICAgIHN0cmljdFxuICB9ID0gUmVhY3QudXNlQ29udGV4dChXYXJuaW5nQ29udGV4dCk7XG4gIGNvbnN0IHR5cGVXYXJuaW5nID0gKHZhbGlkLCB0eXBlLCBtZXNzYWdlKSA9PiB7XG4gICAgaWYgKCF2YWxpZCkge1xuICAgICAgaWYgKHN0cmljdCA9PT0gZmFsc2UgJiYgdHlwZSA9PT0gJ2RlcHJlY2F0ZWQnKSB7XG4gICAgICAgIGNvbnN0IGV4aXN0V2FybmluZyA9IGRlcHJlY2F0ZWRXYXJuTGlzdDtcbiAgICAgICAgaWYgKCFkZXByZWNhdGVkV2Fybkxpc3QpIHtcbiAgICAgICAgICBkZXByZWNhdGVkV2Fybkxpc3QgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBkZXByZWNhdGVkV2Fybkxpc3RbY29tcG9uZW50XSA9IGRlcHJlY2F0ZWRXYXJuTGlzdFtjb21wb25lbnRdIHx8IFtdO1xuICAgICAgICBpZiAoIWRlcHJlY2F0ZWRXYXJuTGlzdFtjb21wb25lbnRdLmluY2x1ZGVzKG1lc3NhZ2UgfHwgJycpKSB7XG4gICAgICAgICAgZGVwcmVjYXRlZFdhcm5MaXN0W2NvbXBvbmVudF0ucHVzaChtZXNzYWdlIHx8ICcnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXYXJuaW5nIGZvciB0aGUgZmlyc3QgdGltZVxuICAgICAgICBpZiAoIWV4aXN0V2FybmluZykge1xuICAgICAgICAgIGNvbnNvbGUud2FybignW2FudGRdIFRoZXJlIGV4aXN0cyBkZXByZWNhdGVkIHVzYWdlIGluIHlvdXIgY29kZTonLCBkZXByZWNhdGVkV2Fybkxpc3QpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKHZhbGlkLCBjb21wb25lbnQsIG1lc3NhZ2UpIDogdm9pZCAwO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgdHlwZVdhcm5pbmcuZGVwcmVjYXRlZCA9ICh2YWxpZCwgb2xkUHJvcCwgbmV3UHJvcCwgbWVzc2FnZSkgPT4ge1xuICAgIHR5cGVXYXJuaW5nKHZhbGlkLCAnZGVwcmVjYXRlZCcsIGBcXGAke29sZFByb3B9XFxgIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgXFxgJHtuZXdQcm9wfVxcYCBpbnN0ZWFkLiR7bWVzc2FnZSA/IGAgJHttZXNzYWdlfWAgOiAnJ31gKTtcbiAgfTtcbiAgcmV0dXJuIHR5cGVXYXJuaW5nO1xufSA6ICgpID0+IHtcbiAgY29uc3Qgbm9vcFdhcm5pbmcgPSAoKSA9PiB7fTtcbiAgbm9vcFdhcm5pbmcuZGVwcmVjYXRlZCA9IG5vb3A7XG4gIHJldHVybiBub29wV2FybmluZztcbn07XG5leHBvcnQgZGVmYXVsdCB3YXJuaW5nOyIsICJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ3JlYWN0Jztcbi8vIFpvbWJpZUo6IFdlIGV4cG9ydCBzaW5nbGUgZmlsZSBoZXJlIHNpbmNlXG4vLyBDb25maWdQcm92aWRlciB1c2UgdGhpcyB3aGljaCB3aWxsIG1ha2UgbG9vcCBkZXBzXG4vLyB0byBpbXBvcnQgd2hvbGUgYHJjLWZpZWxkLWZvcm1gXG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovY3JlYXRlQ29udGV4dCh1bmRlZmluZWQpOyIsICJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZGV2VXNlV2FybmluZyB9IGZyb20gJy4uL191dGlsL3dhcm5pbmcnO1xuaW1wb3J0IHsgY2hhbmdlQ29uZmlybUxvY2FsZSB9IGZyb20gJy4uL21vZGFsL2xvY2FsZSc7XG5pbXBvcnQgTG9jYWxlQ29udGV4dCBmcm9tICcuL2NvbnRleHQnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB1c2VMb2NhbGUgfSBmcm9tICcuL3VzZUxvY2FsZSc7XG5leHBvcnQgY29uc3QgQU5UX01BUksgPSAnaW50ZXJuYWxNYXJrJztcbmNvbnN0IExvY2FsZVByb3ZpZGVyID0gcHJvcHMgPT4ge1xuICBjb25zdCB7XG4gICAgbG9jYWxlID0ge30sXG4gICAgY2hpbGRyZW4sXG4gICAgX0FOVF9NQVJLX19cbiAgfSA9IHByb3BzO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGNvbnN0IHdhcm5pbmcgPSBkZXZVc2VXYXJuaW5nKCdMb2NhbGVQcm92aWRlcicpO1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoX0FOVF9NQVJLX18gPT09IEFOVF9NQVJLLCAnZGVwcmVjYXRlZCcsICdgTG9jYWxlUHJvdmlkZXJgIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgYGxvY2FsZWAgd2l0aCBgQ29uZmlnUHJvdmlkZXJgIGluc3RlYWQ6IGh0dHA6Ly91LmFudC5kZXNpZ24vbG9jYWxlJykgOiB2b2lkIDA7XG4gIH1cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBjbGVhckxvY2FsZSA9IGNoYW5nZUNvbmZpcm1Mb2NhbGUobG9jYWxlID09PSBudWxsIHx8IGxvY2FsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbG9jYWxlLk1vZGFsKTtcbiAgICByZXR1cm4gY2xlYXJMb2NhbGU7XG4gIH0sIFtsb2NhbGVdKTtcbiAgY29uc3QgZ2V0TWVtb2l6ZWRDb250ZXh0VmFsdWUgPSBSZWFjdC51c2VNZW1vKCgpID0+IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgbG9jYWxlKSwge1xuICAgIGV4aXN0OiB0cnVlXG4gIH0pLCBbbG9jYWxlXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMb2NhbGVDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IGdldE1lbW9pemVkQ29udGV4dFZhbHVlXG4gIH0sIGNoaWxkcmVuKTtcbn07XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBMb2NhbGVQcm92aWRlci5kaXNwbGF5TmFtZSA9ICdMb2NhbGVQcm92aWRlcic7XG59XG5leHBvcnQgZGVmYXVsdCBMb2NhbGVQcm92aWRlcjsiLCAidmFyIGxvY2FsZSA9IHtcbiAgLy8gT3B0aW9uc1xuICBpdGVtc19wZXJfcGFnZTogJy8gcGFnZScsXG4gIGp1bXBfdG86ICdHbyB0bycsXG4gIGp1bXBfdG9fY29uZmlybTogJ2NvbmZpcm0nLFxuICBwYWdlOiAnUGFnZScsXG4gIC8vIFBhZ2luYXRpb25cbiAgcHJldl9wYWdlOiAnUHJldmlvdXMgUGFnZScsXG4gIG5leHRfcGFnZTogJ05leHQgUGFnZScsXG4gIHByZXZfNTogJ1ByZXZpb3VzIDUgUGFnZXMnLFxuICBuZXh0XzU6ICdOZXh0IDUgUGFnZXMnLFxuICBwcmV2XzM6ICdQcmV2aW91cyAzIFBhZ2VzJyxcbiAgbmV4dF8zOiAnTmV4dCAzIFBhZ2VzJyxcbiAgcGFnZV9zaXplOiAnUGFnZSBTaXplJ1xufTtcbmV4cG9ydCBkZWZhdWx0IGxvY2FsZTsiLCAiZXhwb3J0IHZhciBjb21tb25Mb2NhbGUgPSB7XG4gIHllYXJGb3JtYXQ6ICdZWVlZJyxcbiAgZGF5Rm9ybWF0OiAnRCcsXG4gIGNlbGxNZXJpZGllbUZvcm1hdDogJ0EnLFxuICBtb250aEJlZm9yZVllYXI6IHRydWVcbn07IiwgImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgeyBjb21tb25Mb2NhbGUgfSBmcm9tIFwiLi9jb21tb25cIjtcbnZhciBsb2NhbGUgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGNvbW1vbkxvY2FsZSksIHt9LCB7XG4gIGxvY2FsZTogJ2VuX1VTJyxcbiAgdG9kYXk6ICdUb2RheScsXG4gIG5vdzogJ05vdycsXG4gIGJhY2tUb1RvZGF5OiAnQmFjayB0byB0b2RheScsXG4gIG9rOiAnT0snLFxuICBjbGVhcjogJ0NsZWFyJyxcbiAgd2VlazogJ1dlZWsnLFxuICBtb250aDogJ01vbnRoJyxcbiAgeWVhcjogJ1llYXInLFxuICB0aW1lU2VsZWN0OiAnc2VsZWN0IHRpbWUnLFxuICBkYXRlU2VsZWN0OiAnc2VsZWN0IGRhdGUnLFxuICB3ZWVrU2VsZWN0OiAnQ2hvb3NlIGEgd2VlaycsXG4gIG1vbnRoU2VsZWN0OiAnQ2hvb3NlIGEgbW9udGgnLFxuICB5ZWFyU2VsZWN0OiAnQ2hvb3NlIGEgeWVhcicsXG4gIGRlY2FkZVNlbGVjdDogJ0Nob29zZSBhIGRlY2FkZScsXG4gIGRhdGVGb3JtYXQ6ICdNL0QvWVlZWScsXG4gIGRhdGVUaW1lRm9ybWF0OiAnTS9EL1lZWVkgSEg6bW06c3MnLFxuICBwcmV2aW91c01vbnRoOiAnUHJldmlvdXMgbW9udGggKFBhZ2VVcCknLFxuICBuZXh0TW9udGg6ICdOZXh0IG1vbnRoIChQYWdlRG93biknLFxuICBwcmV2aW91c1llYXI6ICdMYXN0IHllYXIgKENvbnRyb2wgKyBsZWZ0KScsXG4gIG5leHRZZWFyOiAnTmV4dCB5ZWFyIChDb250cm9sICsgcmlnaHQpJyxcbiAgcHJldmlvdXNEZWNhZGU6ICdMYXN0IGRlY2FkZScsXG4gIG5leHREZWNhZGU6ICdOZXh0IGRlY2FkZScsXG4gIHByZXZpb3VzQ2VudHVyeTogJ0xhc3QgY2VudHVyeScsXG4gIG5leHRDZW50dXJ5OiAnTmV4dCBjZW50dXJ5J1xufSk7XG5leHBvcnQgZGVmYXVsdCBsb2NhbGU7IiwgImNvbnN0IGxvY2FsZSA9IHtcbiAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgdGltZScsXG4gIHJhbmdlUGxhY2Vob2xkZXI6IFsnU3RhcnQgdGltZScsICdFbmQgdGltZSddXG59O1xuZXhwb3J0IGRlZmF1bHQgbG9jYWxlOyIsICJpbXBvcnQgQ2FsZW5kYXJMb2NhbGUgZnJvbSBcInJjLXBpY2tlci9lcy9sb2NhbGUvZW5fVVNcIjtcbmltcG9ydCBUaW1lUGlja2VyTG9jYWxlIGZyb20gJy4uLy4uL3RpbWUtcGlja2VyL2xvY2FsZS9lbl9VUyc7XG4vLyBNZXJnZSBpbnRvIGEgbG9jYWxlIG9iamVjdFxuY29uc3QgbG9jYWxlID0ge1xuICBsYW5nOiBPYmplY3QuYXNzaWduKHtcbiAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBkYXRlJyxcbiAgICB5ZWFyUGxhY2Vob2xkZXI6ICdTZWxlY3QgeWVhcicsXG4gICAgcXVhcnRlclBsYWNlaG9sZGVyOiAnU2VsZWN0IHF1YXJ0ZXInLFxuICAgIG1vbnRoUGxhY2Vob2xkZXI6ICdTZWxlY3QgbW9udGgnLFxuICAgIHdlZWtQbGFjZWhvbGRlcjogJ1NlbGVjdCB3ZWVrJyxcbiAgICByYW5nZVBsYWNlaG9sZGVyOiBbJ1N0YXJ0IGRhdGUnLCAnRW5kIGRhdGUnXSxcbiAgICByYW5nZVllYXJQbGFjZWhvbGRlcjogWydTdGFydCB5ZWFyJywgJ0VuZCB5ZWFyJ10sXG4gICAgcmFuZ2VRdWFydGVyUGxhY2Vob2xkZXI6IFsnU3RhcnQgcXVhcnRlcicsICdFbmQgcXVhcnRlciddLFxuICAgIHJhbmdlTW9udGhQbGFjZWhvbGRlcjogWydTdGFydCBtb250aCcsICdFbmQgbW9udGgnXSxcbiAgICByYW5nZVdlZWtQbGFjZWhvbGRlcjogWydTdGFydCB3ZWVrJywgJ0VuZCB3ZWVrJ11cbiAgfSwgQ2FsZW5kYXJMb2NhbGUpLFxuICB0aW1lUGlja2VyTG9jYWxlOiBPYmplY3QuYXNzaWduKHt9LCBUaW1lUGlja2VyTG9jYWxlKVxufTtcbi8vIEFsbCBzZXR0aW5ncyBhdDpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vYmxvYi9tYXN0ZXIvY29tcG9uZW50cy9kYXRlLXBpY2tlci9sb2NhbGUvZXhhbXBsZS5qc29uXG5leHBvcnQgZGVmYXVsdCBsb2NhbGU7IiwgImltcG9ydCBlblVTIGZyb20gJy4uLy4uL2RhdGUtcGlja2VyL2xvY2FsZS9lbl9VUyc7XG5leHBvcnQgZGVmYXVsdCBlblVTOyIsICJpbXBvcnQgUGFnaW5hdGlvbiBmcm9tIFwicmMtcGFnaW5hdGlvbi9lcy9sb2NhbGUvZW5fVVNcIjtcbmltcG9ydCBDYWxlbmRhciBmcm9tICcuLi9jYWxlbmRhci9sb2NhbGUvZW5fVVMnO1xuaW1wb3J0IERhdGVQaWNrZXIgZnJvbSAnLi4vZGF0ZS1waWNrZXIvbG9jYWxlL2VuX1VTJztcbmltcG9ydCBUaW1lUGlja2VyIGZyb20gJy4uL3RpbWUtcGlja2VyL2xvY2FsZS9lbl9VUyc7XG5jb25zdCB0eXBlVGVtcGxhdGUgPSAnJHtsYWJlbH0gaXMgbm90IGEgdmFsaWQgJHt0eXBlfSc7XG5jb25zdCBsb2NhbGVWYWx1ZXMgPSB7XG4gIGxvY2FsZTogJ2VuJyxcbiAgUGFnaW5hdGlvbixcbiAgRGF0ZVBpY2tlcixcbiAgVGltZVBpY2tlcixcbiAgQ2FsZW5kYXIsXG4gIGdsb2JhbDoge1xuICAgIHBsYWNlaG9sZGVyOiAnUGxlYXNlIHNlbGVjdCcsXG4gICAgY2xvc2U6ICdDbG9zZSdcbiAgfSxcbiAgVGFibGU6IHtcbiAgICBmaWx0ZXJUaXRsZTogJ0ZpbHRlciBtZW51JyxcbiAgICBmaWx0ZXJDb25maXJtOiAnT0snLFxuICAgIGZpbHRlclJlc2V0OiAnUmVzZXQnLFxuICAgIGZpbHRlckVtcHR5VGV4dDogJ05vIGZpbHRlcnMnLFxuICAgIGZpbHRlckNoZWNrQWxsOiAnU2VsZWN0IGFsbCBpdGVtcycsXG4gICAgZmlsdGVyU2VhcmNoUGxhY2Vob2xkZXI6ICdTZWFyY2ggaW4gZmlsdGVycycsXG4gICAgZW1wdHlUZXh0OiAnTm8gZGF0YScsXG4gICAgc2VsZWN0QWxsOiAnU2VsZWN0IGN1cnJlbnQgcGFnZScsXG4gICAgc2VsZWN0SW52ZXJ0OiAnSW52ZXJ0IGN1cnJlbnQgcGFnZScsXG4gICAgc2VsZWN0Tm9uZTogJ0NsZWFyIGFsbCBkYXRhJyxcbiAgICBzZWxlY3Rpb25BbGw6ICdTZWxlY3QgYWxsIGRhdGEnLFxuICAgIHNvcnRUaXRsZTogJ1NvcnQnLFxuICAgIGV4cGFuZDogJ0V4cGFuZCByb3cnLFxuICAgIGNvbGxhcHNlOiAnQ29sbGFwc2Ugcm93JyxcbiAgICB0cmlnZ2VyRGVzYzogJ0NsaWNrIHRvIHNvcnQgZGVzY2VuZGluZycsXG4gICAgdHJpZ2dlckFzYzogJ0NsaWNrIHRvIHNvcnQgYXNjZW5kaW5nJyxcbiAgICBjYW5jZWxTb3J0OiAnQ2xpY2sgdG8gY2FuY2VsIHNvcnRpbmcnXG4gIH0sXG4gIFRvdXI6IHtcbiAgICBOZXh0OiAnTmV4dCcsXG4gICAgUHJldmlvdXM6ICdQcmV2aW91cycsXG4gICAgRmluaXNoOiAnRmluaXNoJ1xuICB9LFxuICBNb2RhbDoge1xuICAgIG9rVGV4dDogJ09LJyxcbiAgICBjYW5jZWxUZXh0OiAnQ2FuY2VsJyxcbiAgICBqdXN0T2tUZXh0OiAnT0snXG4gIH0sXG4gIFBvcGNvbmZpcm06IHtcbiAgICBva1RleHQ6ICdPSycsXG4gICAgY2FuY2VsVGV4dDogJ0NhbmNlbCdcbiAgfSxcbiAgVHJhbnNmZXI6IHtcbiAgICB0aXRsZXM6IFsnJywgJyddLFxuICAgIHNlYXJjaFBsYWNlaG9sZGVyOiAnU2VhcmNoIGhlcmUnLFxuICAgIGl0ZW1Vbml0OiAnaXRlbScsXG4gICAgaXRlbXNVbml0OiAnaXRlbXMnLFxuICAgIHJlbW92ZTogJ1JlbW92ZScsXG4gICAgc2VsZWN0Q3VycmVudDogJ1NlbGVjdCBjdXJyZW50IHBhZ2UnLFxuICAgIHJlbW92ZUN1cnJlbnQ6ICdSZW1vdmUgY3VycmVudCBwYWdlJyxcbiAgICBzZWxlY3RBbGw6ICdTZWxlY3QgYWxsIGRhdGEnLFxuICAgIGRlc2VsZWN0QWxsOiAnRGVzZWxlY3QgYWxsIGRhdGEnLFxuICAgIHJlbW92ZUFsbDogJ1JlbW92ZSBhbGwgZGF0YScsXG4gICAgc2VsZWN0SW52ZXJ0OiAnSW52ZXJ0IGN1cnJlbnQgcGFnZSdcbiAgfSxcbiAgVXBsb2FkOiB7XG4gICAgdXBsb2FkaW5nOiAnVXBsb2FkaW5nLi4uJyxcbiAgICByZW1vdmVGaWxlOiAnUmVtb3ZlIGZpbGUnLFxuICAgIHVwbG9hZEVycm9yOiAnVXBsb2FkIGVycm9yJyxcbiAgICBwcmV2aWV3RmlsZTogJ1ByZXZpZXcgZmlsZScsXG4gICAgZG93bmxvYWRGaWxlOiAnRG93bmxvYWQgZmlsZSdcbiAgfSxcbiAgRW1wdHk6IHtcbiAgICBkZXNjcmlwdGlvbjogJ05vIGRhdGEnXG4gIH0sXG4gIEljb246IHtcbiAgICBpY29uOiAnaWNvbidcbiAgfSxcbiAgVGV4dDoge1xuICAgIGVkaXQ6ICdFZGl0JyxcbiAgICBjb3B5OiAnQ29weScsXG4gICAgY29waWVkOiAnQ29waWVkJyxcbiAgICBleHBhbmQ6ICdFeHBhbmQnLFxuICAgIGNvbGxhcHNlOiAnQ29sbGFwc2UnXG4gIH0sXG4gIEZvcm06IHtcbiAgICBvcHRpb25hbDogJyhvcHRpb25hbCknLFxuICAgIGRlZmF1bHRWYWxpZGF0ZU1lc3NhZ2VzOiB7XG4gICAgICBkZWZhdWx0OiAnRmllbGQgdmFsaWRhdGlvbiBlcnJvciBmb3IgJHtsYWJlbH0nLFxuICAgICAgcmVxdWlyZWQ6ICdQbGVhc2UgZW50ZXIgJHtsYWJlbH0nLFxuICAgICAgZW51bTogJyR7bGFiZWx9IG11c3QgYmUgb25lIG9mIFske2VudW19XScsXG4gICAgICB3aGl0ZXNwYWNlOiAnJHtsYWJlbH0gY2Fubm90IGJlIGEgYmxhbmsgY2hhcmFjdGVyJyxcbiAgICAgIGRhdGU6IHtcbiAgICAgICAgZm9ybWF0OiAnJHtsYWJlbH0gZGF0ZSBmb3JtYXQgaXMgaW52YWxpZCcsXG4gICAgICAgIHBhcnNlOiAnJHtsYWJlbH0gY2Fubm90IGJlIGNvbnZlcnRlZCB0byBhIGRhdGUnLFxuICAgICAgICBpbnZhbGlkOiAnJHtsYWJlbH0gaXMgYW4gaW52YWxpZCBkYXRlJ1xuICAgICAgfSxcbiAgICAgIHR5cGVzOiB7XG4gICAgICAgIHN0cmluZzogdHlwZVRlbXBsYXRlLFxuICAgICAgICBtZXRob2Q6IHR5cGVUZW1wbGF0ZSxcbiAgICAgICAgYXJyYXk6IHR5cGVUZW1wbGF0ZSxcbiAgICAgICAgb2JqZWN0OiB0eXBlVGVtcGxhdGUsXG4gICAgICAgIG51bWJlcjogdHlwZVRlbXBsYXRlLFxuICAgICAgICBkYXRlOiB0eXBlVGVtcGxhdGUsXG4gICAgICAgIGJvb2xlYW46IHR5cGVUZW1wbGF0ZSxcbiAgICAgICAgaW50ZWdlcjogdHlwZVRlbXBsYXRlLFxuICAgICAgICBmbG9hdDogdHlwZVRlbXBsYXRlLFxuICAgICAgICByZWdleHA6IHR5cGVUZW1wbGF0ZSxcbiAgICAgICAgZW1haWw6IHR5cGVUZW1wbGF0ZSxcbiAgICAgICAgdXJsOiB0eXBlVGVtcGxhdGUsXG4gICAgICAgIGhleDogdHlwZVRlbXBsYXRlXG4gICAgICB9LFxuICAgICAgc3RyaW5nOiB7XG4gICAgICAgIGxlbjogJyR7bGFiZWx9IG11c3QgYmUgJHtsZW59IGNoYXJhY3RlcnMnLFxuICAgICAgICBtaW46ICcke2xhYmVsfSBtdXN0IGJlIGF0IGxlYXN0ICR7bWlufSBjaGFyYWN0ZXJzJyxcbiAgICAgICAgbWF4OiAnJHtsYWJlbH0gbXVzdCBiZSB1cCB0byAke21heH0gY2hhcmFjdGVycycsXG4gICAgICAgIHJhbmdlOiAnJHtsYWJlbH0gbXVzdCBiZSBiZXR3ZWVuICR7bWlufS0ke21heH0gY2hhcmFjdGVycydcbiAgICAgIH0sXG4gICAgICBudW1iZXI6IHtcbiAgICAgICAgbGVuOiAnJHtsYWJlbH0gbXVzdCBiZSBlcXVhbCB0byAke2xlbn0nLFxuICAgICAgICBtaW46ICcke2xhYmVsfSBtdXN0IGJlIG1pbmltdW0gJHttaW59JyxcbiAgICAgICAgbWF4OiAnJHtsYWJlbH0gbXVzdCBiZSBtYXhpbXVtICR7bWF4fScsXG4gICAgICAgIHJhbmdlOiAnJHtsYWJlbH0gbXVzdCBiZSBiZXR3ZWVuICR7bWlufS0ke21heH0nXG4gICAgICB9LFxuICAgICAgYXJyYXk6IHtcbiAgICAgICAgbGVuOiAnTXVzdCBiZSAke2xlbn0gJHtsYWJlbH0nLFxuICAgICAgICBtaW46ICdBdCBsZWFzdCAke21pbn0gJHtsYWJlbH0nLFxuICAgICAgICBtYXg6ICdBdCBtb3N0ICR7bWF4fSAke2xhYmVsfScsXG4gICAgICAgIHJhbmdlOiAnVGhlIGFtb3VudCBvZiAke2xhYmVsfSBtdXN0IGJlIGJldHdlZW4gJHttaW59LSR7bWF4fSdcbiAgICAgIH0sXG4gICAgICBwYXR0ZXJuOiB7XG4gICAgICAgIG1pc21hdGNoOiAnJHtsYWJlbH0gZG9lcyBub3QgbWF0Y2ggdGhlIHBhdHRlcm4gJHtwYXR0ZXJufSdcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIEltYWdlOiB7XG4gICAgcHJldmlldzogJ1ByZXZpZXcnXG4gIH0sXG4gIFFSQ29kZToge1xuICAgIGV4cGlyZWQ6ICdRUiBjb2RlIGV4cGlyZWQnLFxuICAgIHJlZnJlc2g6ICdSZWZyZXNoJyxcbiAgICBzY2FubmVkOiAnU2Nhbm5lZCdcbiAgfSxcbiAgQ29sb3JQaWNrZXI6IHtcbiAgICBwcmVzZXRFbXB0eTogJ0VtcHR5JyxcbiAgICB0cmFuc3BhcmVudDogJ1RyYW5zcGFyZW50JyxcbiAgICBzaW5nbGVDb2xvcjogJ1NpbmdsZScsXG4gICAgZ3JhZGllbnRDb2xvcjogJ0dyYWRpZW50J1xuICB9XG59O1xuZXhwb3J0IGRlZmF1bHQgbG9jYWxlVmFsdWVzOyIsICJpbXBvcnQgZGVmYXVsdExvY2FsZSBmcm9tICcuLi9sb2NhbGUvZW5fVVMnO1xubGV0IHJ1bnRpbWVMb2NhbGUgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0TG9jYWxlLk1vZGFsKTtcbmxldCBsb2NhbGVMaXN0ID0gW107XG5jb25zdCBnZW5lcmF0ZUxvY2FsZSA9ICgpID0+IGxvY2FsZUxpc3QucmVkdWNlKChtZXJnZWQsIGxvY2FsZSkgPT4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBtZXJnZWQpLCBsb2NhbGUpLCBkZWZhdWx0TG9jYWxlLk1vZGFsKTtcbmV4cG9ydCBmdW5jdGlvbiBjaGFuZ2VDb25maXJtTG9jYWxlKG5ld0xvY2FsZSkge1xuICBpZiAobmV3TG9jYWxlKSB7XG4gICAgY29uc3QgY2xvbmVMb2NhbGUgPSBPYmplY3QuYXNzaWduKHt9LCBuZXdMb2NhbGUpO1xuICAgIGxvY2FsZUxpc3QucHVzaChjbG9uZUxvY2FsZSk7XG4gICAgcnVudGltZUxvY2FsZSA9IGdlbmVyYXRlTG9jYWxlKCk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGxvY2FsZUxpc3QgPSBsb2NhbGVMaXN0LmZpbHRlcihsb2NhbGUgPT4gbG9jYWxlICE9PSBjbG9uZUxvY2FsZSk7XG4gICAgICBydW50aW1lTG9jYWxlID0gZ2VuZXJhdGVMb2NhbGUoKTtcbiAgICB9O1xuICB9XG4gIHJ1bnRpbWVMb2NhbGUgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0TG9jYWxlLk1vZGFsKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25maXJtTG9jYWxlKCkge1xuICByZXR1cm4gcnVudGltZUxvY2FsZTtcbn0iLCAiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmNvbnN0IExvY2FsZUNvbnRleHQgPSAvKiNfX1BVUkVfXyovY3JlYXRlQ29udGV4dCh1bmRlZmluZWQpO1xuZXhwb3J0IGRlZmF1bHQgTG9jYWxlQ29udGV4dDsiLCAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IExvY2FsZUNvbnRleHQgZnJvbSAnLi9jb250ZXh0JztcbmltcG9ydCBkZWZhdWx0TG9jYWxlRGF0YSBmcm9tICcuL2VuX1VTJztcbmNvbnN0IHVzZUxvY2FsZSA9IChjb21wb25lbnROYW1lLCBkZWZhdWx0TG9jYWxlKSA9PiB7XG4gIGNvbnN0IGZ1bGxMb2NhbGUgPSBSZWFjdC51c2VDb250ZXh0KExvY2FsZUNvbnRleHQpO1xuICBjb25zdCBnZXRMb2NhbGUgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3QgbG9jYWxlID0gZGVmYXVsdExvY2FsZSB8fCBkZWZhdWx0TG9jYWxlRGF0YVtjb21wb25lbnROYW1lXTtcbiAgICBjb25zdCBsb2NhbGVGcm9tQ29udGV4dCA9IChfYSA9IGZ1bGxMb2NhbGUgPT09IG51bGwgfHwgZnVsbExvY2FsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZnVsbExvY2FsZVtjb21wb25lbnROYW1lXSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDoge307XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdHlwZW9mIGxvY2FsZSA9PT0gJ2Z1bmN0aW9uJyA/IGxvY2FsZSgpIDogbG9jYWxlKSwgbG9jYWxlRnJvbUNvbnRleHQgfHwge30pO1xuICB9LCBbY29tcG9uZW50TmFtZSwgZGVmYXVsdExvY2FsZSwgZnVsbExvY2FsZV0pO1xuICBjb25zdCBnZXRMb2NhbGVDb2RlID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgbG9jYWxlQ29kZSA9IGZ1bGxMb2NhbGUgPT09IG51bGwgfHwgZnVsbExvY2FsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZnVsbExvY2FsZS5sb2NhbGU7XG4gICAgLy8gSGFkIHVzZSBMb2NhbGVQcm92aWRlIGJ1dCBkaWRuJ3Qgc2V0IGxvY2FsZVxuICAgIGlmICgoZnVsbExvY2FsZSA9PT0gbnVsbCB8fCBmdWxsTG9jYWxlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmdWxsTG9jYWxlLmV4aXN0KSAmJiAhbG9jYWxlQ29kZSkge1xuICAgICAgcmV0dXJuIGRlZmF1bHRMb2NhbGVEYXRhLmxvY2FsZTtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2FsZUNvZGU7XG4gIH0sIFtmdWxsTG9jYWxlXSk7XG4gIHJldHVybiBbZ2V0TG9jYWxlLCBnZXRMb2NhbGVDb2RlXTtcbn07XG5leHBvcnQgZGVmYXVsdCB1c2VMb2NhbGU7IiwgImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgZGVmYXVsdFNlZWRUb2tlbiBmcm9tICcuL3RoZW1lcy9zZWVkJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZGVmYXVsdFRoZW1lIH0gZnJvbSAnLi90aGVtZXMvZGVmYXVsdC90aGVtZSc7XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDb250ZXh0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVG8gZW5zdXJlIHNuYXBzaG90IHN0YWJsZS4gV2UgZGlzYWJsZSBoYXNoZWQgaW4gdGVzdCBlbnYuXG5leHBvcnQgY29uc3QgZGVmYXVsdENvbmZpZyA9IHtcbiAgdG9rZW46IGRlZmF1bHRTZWVkVG9rZW4sXG4gIG92ZXJyaWRlOiB7XG4gICAgb3ZlcnJpZGU6IGRlZmF1bHRTZWVkVG9rZW5cbiAgfSxcbiAgaGFzaGVkOiB0cnVlXG59O1xuZXhwb3J0IGNvbnN0IERlc2lnblRva2VuQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KGRlZmF1bHRDb25maWcpOyIsICJleHBvcnQgY29uc3QgZGVmYXVsdFByZXNldENvbG9ycyA9IHtcbiAgYmx1ZTogJyMxNjc3RkYnLFxuICBwdXJwbGU6ICcjNzIyRUQxJyxcbiAgY3lhbjogJyMxM0MyQzInLFxuICBncmVlbjogJyM1MkM0MUEnLFxuICBtYWdlbnRhOiAnI0VCMkY5NicsXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgbWFnZW50YSBpbnN0ZWFkXG4gICAqL1xuICBwaW5rOiAnI0VCMkY5NicsXG4gIHJlZDogJyNGNTIyMkQnLFxuICBvcmFuZ2U6ICcjRkE4QzE2JyxcbiAgeWVsbG93OiAnI0ZBREIxNCcsXG4gIHZvbGNhbm86ICcjRkE1NDFDJyxcbiAgZ2Vla2JsdWU6ICcjMkY1NEVCJyxcbiAgZ29sZDogJyNGQUFEMTQnLFxuICBsaW1lOiAnI0EwRDkxMSdcbn07XG5jb25zdCBzZWVkVG9rZW4gPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRQcmVzZXRDb2xvcnMpLCB7XG4gIC8vIENvbG9yXG4gIGNvbG9yUHJpbWFyeTogJyMxNjc3ZmYnLFxuICBjb2xvclN1Y2Nlc3M6ICcjNTJjNDFhJyxcbiAgY29sb3JXYXJuaW5nOiAnI2ZhYWQxNCcsXG4gIGNvbG9yRXJyb3I6ICcjZmY0ZDRmJyxcbiAgY29sb3JJbmZvOiAnIzE2NzdmZicsXG4gIGNvbG9yTGluazogJycsXG4gIGNvbG9yVGV4dEJhc2U6ICcnLFxuICBjb2xvckJnQmFzZTogJycsXG4gIC8vIEZvbnRcbiAgZm9udEZhbWlseTogYC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgUm9ib3RvLCAnSGVsdmV0aWNhIE5ldWUnLCBBcmlhbCxcbidOb3RvIFNhbnMnLCBzYW5zLXNlcmlmLCAnQXBwbGUgQ29sb3IgRW1vamknLCAnU2Vnb2UgVUkgRW1vamknLCAnU2Vnb2UgVUkgU3ltYm9sJyxcbidOb3RvIENvbG9yIEVtb2ppJ2AsXG4gIGZvbnRGYW1pbHlDb2RlOiBgJ1NGTW9uby1SZWd1bGFyJywgQ29uc29sYXMsICdMaWJlcmF0aW9uIE1vbm8nLCBNZW5sbywgQ291cmllciwgbW9ub3NwYWNlYCxcbiAgZm9udFNpemU6IDE0LFxuICAvLyBMaW5lXG4gIGxpbmVXaWR0aDogMSxcbiAgbGluZVR5cGU6ICdzb2xpZCcsXG4gIC8vIE1vdGlvblxuICBtb3Rpb25Vbml0OiAwLjEsXG4gIG1vdGlvbkJhc2U6IDAsXG4gIG1vdGlvbkVhc2VPdXRDaXJjOiAnY3ViaWMtYmV6aWVyKDAuMDgsIDAuODIsIDAuMTcsIDEpJyxcbiAgbW90aW9uRWFzZUluT3V0Q2lyYzogJ2N1YmljLWJlemllcigwLjc4LCAwLjE0LCAwLjE1LCAwLjg2KScsXG4gIG1vdGlvbkVhc2VPdXQ6ICdjdWJpYy1iZXppZXIoMC4yMTUsIDAuNjEsIDAuMzU1LCAxKScsXG4gIG1vdGlvbkVhc2VJbk91dDogJ2N1YmljLWJlemllcigwLjY0NSwgMC4wNDUsIDAuMzU1LCAxKScsXG4gIG1vdGlvbkVhc2VPdXRCYWNrOiAnY3ViaWMtYmV6aWVyKDAuMTIsIDAuNCwgMC4yOSwgMS40NiknLFxuICBtb3Rpb25FYXNlSW5CYWNrOiAnY3ViaWMtYmV6aWVyKDAuNzEsIC0wLjQ2LCAwLjg4LCAwLjYpJyxcbiAgbW90aW9uRWFzZUluUXVpbnQ6ICdjdWJpYy1iZXppZXIoMC43NTUsIDAuMDUsIDAuODU1LCAwLjA2KScsXG4gIG1vdGlvbkVhc2VPdXRRdWludDogJ2N1YmljLWJlemllcigwLjIzLCAxLCAwLjMyLCAxKScsXG4gIC8vIFJhZGl1c1xuICBib3JkZXJSYWRpdXM6IDYsXG4gIC8vIFNpemVcbiAgc2l6ZVVuaXQ6IDQsXG4gIHNpemVTdGVwOiA0LFxuICBzaXplUG9wdXBBcnJvdzogMTYsXG4gIC8vIENvbnRyb2wgQmFzZVxuICBjb250cm9sSGVpZ2h0OiAzMixcbiAgLy8gekluZGV4XG4gIHpJbmRleEJhc2U6IDAsXG4gIHpJbmRleFBvcHVwQmFzZTogMTAwMCxcbiAgLy8gSW1hZ2VcbiAgb3BhY2l0eUltYWdlOiAxLFxuICAvLyBXaXJlZnJhbWVcbiAgd2lyZWZyYW1lOiBmYWxzZSxcbiAgLy8gTW90aW9uXG4gIG1vdGlvbjogdHJ1ZVxufSk7XG5leHBvcnQgZGVmYXVsdCBzZWVkVG9rZW47IiwgImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5jb25zdCByb3VuZCA9IE1hdGgucm91bmQ7XG5cbi8qKlxuICogU3VwcG9ydCBmb3JtYXQsIGFscGhhIHVuaXQgd2lsbCBjaGVjayB0aGUgJSBtYXJrOlxuICogLSByZ2JhKDEwMiwgMjA0LCAyNTUsIC41KSAgICAgIC0+IFsxMDIsIDIwNCwgMjU1LCAwLjVdXG4gKiAtIHJnYigxMDIgMjA0IDI1NSAvIC41KSAgICAgICAgLT4gWzEwMiwgMjA0LCAyNTUsIDAuNV1cbiAqIC0gcmdiKDEwMCUsIDUwJSwgMCUgLyA1MCUpICAgICAtPiBbMjU1LCAxMjgsIDAsIDAuNV1cbiAqIC0gaHNsKDI3MCwgNjAsIDQwLCAuNSkgICAgICAgICAtPiBbMjcwLCA2MCwgNDAsIDAuNV1cbiAqIC0gaHNsKDI3MGRlZyA2MCUgNDAlIC8gNTAlKSAgIC0+IFsyNzAsIDYwLCA0MCwgMC41XVxuICpcbiAqIFdoZW4gYGJhc2VgIGlzIHByb3ZpZGVkLCB0aGUgcGVyY2VudGFnZSB2YWx1ZSB3aWxsIGJlIGRpdmlkZWQgYnkgYGJhc2VgLlxuICovXG5mdW5jdGlvbiBzcGxpdENvbG9yU3RyKHN0ciwgcGFyc2VOdW0pIHtcbiAgY29uc3QgbWF0Y2ggPSBzdHJcbiAgLy8gUmVtb3ZlIHN0ciBiZWZvcmUgYChgXG4gIC5yZXBsYWNlKC9eW14oXSpcXCgoLiopLywgJyQxJylcbiAgLy8gUmVtb3ZlIHN0ciBhZnRlciBgKWBcbiAgLnJlcGxhY2UoL1xcKS4qLywgJycpLm1hdGNoKC9cXGQqXFwuP1xcZCslPy9nKSB8fCBbXTtcbiAgY29uc3QgbnVtTGlzdCA9IG1hdGNoLm1hcChpdGVtID0+IHBhcnNlRmxvYXQoaXRlbSkpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IDM7IGkgKz0gMSkge1xuICAgIG51bUxpc3RbaV0gPSBwYXJzZU51bShudW1MaXN0W2ldIHx8IDAsIG1hdGNoW2ldIHx8ICcnLCBpKTtcbiAgfVxuXG4gIC8vIEZvciBhbHBoYS4gNTAlIHNob3VsZCBiZSAwLjVcbiAgaWYgKG1hdGNoWzNdKSB7XG4gICAgbnVtTGlzdFszXSA9IG1hdGNoWzNdLmluY2x1ZGVzKCclJykgPyBudW1MaXN0WzNdIC8gMTAwIDogbnVtTGlzdFszXTtcbiAgfSBlbHNlIHtcbiAgICAvLyBCeSBkZWZhdWx0LCBhbHBoYSBpcyAxXG4gICAgbnVtTGlzdFszXSA9IDE7XG4gIH1cbiAgcmV0dXJuIG51bUxpc3Q7XG59XG5jb25zdCBwYXJzZUhTVm9ySFNMID0gKG51bSwgXywgaW5kZXgpID0+IGluZGV4ID09PSAwID8gbnVtIDogbnVtIC8gMTAwO1xuXG4vKiogcm91bmQgYW5kIGxpbWl0IG51bWJlciB0byBpbnRlZ2VyIGJldHdlZW4gMC0yNTUgKi9cbmZ1bmN0aW9uIGxpbWl0UmFuZ2UodmFsdWUsIG1heCkge1xuICBjb25zdCBtZXJnZWRNYXggPSBtYXggfHwgMjU1O1xuICBpZiAodmFsdWUgPiBtZXJnZWRNYXgpIHtcbiAgICByZXR1cm4gbWVyZ2VkTWF4O1xuICB9XG4gIGlmICh2YWx1ZSA8IDApIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5leHBvcnQgY2xhc3MgRmFzdENvbG9yIHtcbiAgY29uc3RydWN0b3IoaW5wdXQpIHtcbiAgICAvKipcbiAgICAgKiBBbGwgRmFzdENvbG9yIG9iamVjdHMgYXJlIHZhbGlkLiBTbyBpc1ZhbGlkIGlzIGFsd2F5cyB0cnVlLiBUaGlzIHByb3BlcnR5IGlzIGtlcHQgdG8gYmUgY29tcGF0aWJsZSB3aXRoIFRpbnlDb2xvci5cbiAgICAgKi9cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJpc1ZhbGlkXCIsIHRydWUpO1xuICAgIC8qKlxuICAgICAqIFJlZCwgUiBpbiBSR0JcbiAgICAgKi9cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJyXCIsIDApO1xuICAgIC8qKlxuICAgICAqIEdyZWVuLCBHIGluIFJHQlxuICAgICAqL1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImdcIiwgMCk7XG4gICAgLyoqXG4gICAgICogQmx1ZSwgQiBpbiBSR0JcbiAgICAgKi9cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJiXCIsIDApO1xuICAgIC8qKlxuICAgICAqIEFscGhhL09wYWNpdHksIEEgaW4gUkdCQS9IU0xBXG4gICAgICovXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiYVwiLCAxKTtcbiAgICAvLyBIU1YgcHJpdmF0ZXNcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJfaFwiLCB2b2lkIDApO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIl9zXCIsIHZvaWQgMCk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiX2xcIiwgdm9pZCAwKTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJfdlwiLCB2b2lkIDApO1xuICAgIC8vIGludGVybWVkaWF0ZSB2YXJpYWJsZXMgdG8gY2FsY3VsYXRlIEhTTC9IU1ZcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJfbWF4XCIsIHZvaWQgMCk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiX21pblwiLCB2b2lkIDApO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIl9icmlnaHRuZXNzXCIsIHZvaWQgMCk7XG4gICAgLyoqXG4gICAgICogQWx3YXlzIGNoZWNrIDMgY2hhciBpbiB0aGUgb2JqZWN0IHRvIGRldGVybWluZSB0aGUgZm9ybWF0LlxuICAgICAqIFdlIG5vdCB1c2UgZnVuY3Rpb24gaW4gY2hlY2sgdG8gc2F2ZSBidW5kbGUgc2l6ZS5cbiAgICAgKiBlLmcuICdyZ2InIC0+IHsgcjogMCwgZzogMCwgYjogMCB9LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hdGNoRm9ybWF0KHN0cikge1xuICAgICAgcmV0dXJuIHN0clswXSBpbiBpbnB1dCAmJiBzdHJbMV0gaW4gaW5wdXQgJiYgc3RyWzJdIGluIGlucHV0O1xuICAgIH1cbiAgICBpZiAoIWlucHV0KSB7XG4gICAgICAvLyBEbyBub3RoaW5nIHNpbmNlIGFscmVhZHkgaW5pdGlhbGl6ZWRcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IHRyaW1TdHIgPSBpbnB1dC50cmltKCk7XG4gICAgICBmdW5jdGlvbiBtYXRjaFByZWZpeChwcmVmaXgpIHtcbiAgICAgICAgcmV0dXJuIHRyaW1TdHIuc3RhcnRzV2l0aChwcmVmaXgpO1xuICAgICAgfVxuICAgICAgaWYgKC9eIz9bQS1GXFxkXXszLDh9JC9pLnRlc3QodHJpbVN0cikpIHtcbiAgICAgICAgdGhpcy5mcm9tSGV4U3RyaW5nKHRyaW1TdHIpO1xuICAgICAgfSBlbHNlIGlmIChtYXRjaFByZWZpeCgncmdiJykpIHtcbiAgICAgICAgdGhpcy5mcm9tUmdiU3RyaW5nKHRyaW1TdHIpO1xuICAgICAgfSBlbHNlIGlmIChtYXRjaFByZWZpeCgnaHNsJykpIHtcbiAgICAgICAgdGhpcy5mcm9tSHNsU3RyaW5nKHRyaW1TdHIpO1xuICAgICAgfSBlbHNlIGlmIChtYXRjaFByZWZpeCgnaHN2JykgfHwgbWF0Y2hQcmVmaXgoJ2hzYicpKSB7XG4gICAgICAgIHRoaXMuZnJvbUhzdlN0cmluZyh0cmltU3RyKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgRmFzdENvbG9yKSB7XG4gICAgICB0aGlzLnIgPSBpbnB1dC5yO1xuICAgICAgdGhpcy5nID0gaW5wdXQuZztcbiAgICAgIHRoaXMuYiA9IGlucHV0LmI7XG4gICAgICB0aGlzLmEgPSBpbnB1dC5hO1xuICAgICAgdGhpcy5faCA9IGlucHV0Ll9oO1xuICAgICAgdGhpcy5fcyA9IGlucHV0Ll9zO1xuICAgICAgdGhpcy5fbCA9IGlucHV0Ll9sO1xuICAgICAgdGhpcy5fdiA9IGlucHV0Ll92O1xuICAgIH0gZWxzZSBpZiAobWF0Y2hGb3JtYXQoJ3JnYicpKSB7XG4gICAgICB0aGlzLnIgPSBsaW1pdFJhbmdlKGlucHV0LnIpO1xuICAgICAgdGhpcy5nID0gbGltaXRSYW5nZShpbnB1dC5nKTtcbiAgICAgIHRoaXMuYiA9IGxpbWl0UmFuZ2UoaW5wdXQuYik7XG4gICAgICB0aGlzLmEgPSB0eXBlb2YgaW5wdXQuYSA9PT0gJ251bWJlcicgPyBsaW1pdFJhbmdlKGlucHV0LmEsIDEpIDogMTtcbiAgICB9IGVsc2UgaWYgKG1hdGNoRm9ybWF0KCdoc2wnKSkge1xuICAgICAgdGhpcy5mcm9tSHNsKGlucHV0KTtcbiAgICB9IGVsc2UgaWYgKG1hdGNoRm9ybWF0KCdoc3YnKSkge1xuICAgICAgdGhpcy5mcm9tSHN2KGlucHV0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdAYW50LWRlc2lnbi9mYXN0LWNvbG9yOiB1bnN1cHBvcnRlZCBpbnB1dCAnICsgSlNPTi5zdHJpbmdpZnkoaW5wdXQpKTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBTZXR0ZXIgPT09PT09PT09PT09PT09PT09PT09PT1cblxuICBzZXRSKHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NjKCdyJywgdmFsdWUpO1xuICB9XG4gIHNldEcodmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5fc2MoJ2cnLCB2YWx1ZSk7XG4gIH1cbiAgc2V0Qih2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLl9zYygnYicsIHZhbHVlKTtcbiAgfVxuICBzZXRBKHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NjKCdhJywgdmFsdWUsIDEpO1xuICB9XG4gIHNldEh1ZSh2YWx1ZSkge1xuICAgIGNvbnN0IGhzdiA9IHRoaXMudG9Ic3YoKTtcbiAgICBoc3YuaCA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzLl9jKGhzdik7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBHZXR0ZXIgPT09PT09PT09PT09PT09PT09PT09PT1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHBlcmNlaXZlZCBsdW1pbmFuY2Ugb2YgYSBjb2xvciwgZnJvbSAwLTEuXG4gICAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvMjAwOC9SRUMtV0NBRzIwLTIwMDgxMjExLyNyZWxhdGl2ZWx1bWluYW5jZWRlZlxuICAgKi9cbiAgZ2V0THVtaW5hbmNlKCkge1xuICAgIGZ1bmN0aW9uIGFkanVzdEdhbW1hKHJhdykge1xuICAgICAgY29uc3QgdmFsID0gcmF3IC8gMjU1O1xuICAgICAgcmV0dXJuIHZhbCA8PSAwLjAzOTI4ID8gdmFsIC8gMTIuOTIgOiBNYXRoLnBvdygodmFsICsgMC4wNTUpIC8gMS4wNTUsIDIuNCk7XG4gICAgfVxuICAgIGNvbnN0IFIgPSBhZGp1c3RHYW1tYSh0aGlzLnIpO1xuICAgIGNvbnN0IEcgPSBhZGp1c3RHYW1tYSh0aGlzLmcpO1xuICAgIGNvbnN0IEIgPSBhZGp1c3RHYW1tYSh0aGlzLmIpO1xuICAgIHJldHVybiAwLjIxMjYgKiBSICsgMC43MTUyICogRyArIDAuMDcyMiAqIEI7XG4gIH1cbiAgZ2V0SHVlKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5faCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnN0IGRlbHRhID0gdGhpcy5nZXRNYXgoKSAtIHRoaXMuZ2V0TWluKCk7XG4gICAgICBpZiAoZGVsdGEgPT09IDApIHtcbiAgICAgICAgdGhpcy5faCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9oID0gcm91bmQoNjAgKiAodGhpcy5yID09PSB0aGlzLmdldE1heCgpID8gKHRoaXMuZyAtIHRoaXMuYikgLyBkZWx0YSArICh0aGlzLmcgPCB0aGlzLmIgPyA2IDogMCkgOiB0aGlzLmcgPT09IHRoaXMuZ2V0TWF4KCkgPyAodGhpcy5iIC0gdGhpcy5yKSAvIGRlbHRhICsgMiA6ICh0aGlzLnIgLSB0aGlzLmcpIC8gZGVsdGEgKyA0KSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9oO1xuICB9XG4gIGdldFNhdHVyYXRpb24oKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl9zID09PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc3QgZGVsdGEgPSB0aGlzLmdldE1heCgpIC0gdGhpcy5nZXRNaW4oKTtcbiAgICAgIGlmIChkZWx0YSA9PT0gMCkge1xuICAgICAgICB0aGlzLl9zID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3MgPSBkZWx0YSAvIHRoaXMuZ2V0TWF4KCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zO1xuICB9XG4gIGdldExpZ2h0bmVzcygpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX2wgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLl9sID0gKHRoaXMuZ2V0TWF4KCkgKyB0aGlzLmdldE1pbigpKSAvIDUxMDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2w7XG4gIH1cbiAgZ2V0VmFsdWUoKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl92ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5fdiA9IHRoaXMuZ2V0TWF4KCkgLyAyNTU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl92O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHBlcmNlaXZlZCBicmlnaHRuZXNzIG9mIHRoZSBjb2xvciwgZnJvbSAwLTI1NS5cbiAgICogTm90ZTogdGhpcyBpcyBub3QgdGhlIGIgb2YgSFNCXG4gICAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvQUVSVCNjb2xvci1jb250cmFzdFxuICAgKi9cbiAgZ2V0QnJpZ2h0bmVzcygpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX2JyaWdodG5lc3MgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLl9icmlnaHRuZXNzID0gKHRoaXMuciAqIDI5OSArIHRoaXMuZyAqIDU4NyArIHRoaXMuYiAqIDExNCkgLyAxMDAwO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYnJpZ2h0bmVzcztcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBGdW5jID09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGRhcmtlbihhbW91bnQgPSAxMCkge1xuICAgIGNvbnN0IGggPSB0aGlzLmdldEh1ZSgpO1xuICAgIGNvbnN0IHMgPSB0aGlzLmdldFNhdHVyYXRpb24oKTtcbiAgICBsZXQgbCA9IHRoaXMuZ2V0TGlnaHRuZXNzKCkgLSBhbW91bnQgLyAxMDA7XG4gICAgaWYgKGwgPCAwKSB7XG4gICAgICBsID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2Moe1xuICAgICAgaCxcbiAgICAgIHMsXG4gICAgICBsLFxuICAgICAgYTogdGhpcy5hXG4gICAgfSk7XG4gIH1cbiAgbGlnaHRlbihhbW91bnQgPSAxMCkge1xuICAgIGNvbnN0IGggPSB0aGlzLmdldEh1ZSgpO1xuICAgIGNvbnN0IHMgPSB0aGlzLmdldFNhdHVyYXRpb24oKTtcbiAgICBsZXQgbCA9IHRoaXMuZ2V0TGlnaHRuZXNzKCkgKyBhbW91bnQgLyAxMDA7XG4gICAgaWYgKGwgPiAxKSB7XG4gICAgICBsID0gMTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2Moe1xuICAgICAgaCxcbiAgICAgIHMsXG4gICAgICBsLFxuICAgICAgYTogdGhpcy5hXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWl4IHRoZSBjdXJyZW50IGNvbG9yIGEgZ2l2ZW4gYW1vdW50IHdpdGggYW5vdGhlciBjb2xvciwgZnJvbSAwIHRvIDEwMC5cbiAgICogMCBtZWFucyBubyBtaXhpbmcgKHJldHVybiBjdXJyZW50IGNvbG9yKS5cbiAgICovXG4gIG1peChpbnB1dCwgYW1vdW50ID0gNTApIHtcbiAgICBjb25zdCBjb2xvciA9IHRoaXMuX2MoaW5wdXQpO1xuICAgIGNvbnN0IHAgPSBhbW91bnQgLyAxMDA7XG4gICAgY29uc3QgY2FsYyA9IGtleSA9PiAoY29sb3Jba2V5XSAtIHRoaXNba2V5XSkgKiBwICsgdGhpc1trZXldO1xuICAgIGNvbnN0IHJnYmEgPSB7XG4gICAgICByOiByb3VuZChjYWxjKCdyJykpLFxuICAgICAgZzogcm91bmQoY2FsYygnZycpKSxcbiAgICAgIGI6IHJvdW5kKGNhbGMoJ2InKSksXG4gICAgICBhOiByb3VuZChjYWxjKCdhJykgKiAxMDApIC8gMTAwXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5fYyhyZ2JhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNaXggdGhlIGNvbG9yIHdpdGggcHVyZSB3aGl0ZSwgZnJvbSAwIHRvIDEwMC5cbiAgICogUHJvdmlkaW5nIDAgd2lsbCBkbyBub3RoaW5nLCBwcm92aWRpbmcgMTAwIHdpbGwgYWx3YXlzIHJldHVybiB3aGl0ZS5cbiAgICovXG4gIHRpbnQoYW1vdW50ID0gMTApIHtcbiAgICByZXR1cm4gdGhpcy5taXgoe1xuICAgICAgcjogMjU1LFxuICAgICAgZzogMjU1LFxuICAgICAgYjogMjU1LFxuICAgICAgYTogMVxuICAgIH0sIGFtb3VudCk7XG4gIH1cblxuICAvKipcbiAgICogTWl4IHRoZSBjb2xvciB3aXRoIHB1cmUgYmxhY2ssIGZyb20gMCB0byAxMDAuXG4gICAqIFByb3ZpZGluZyAwIHdpbGwgZG8gbm90aGluZywgcHJvdmlkaW5nIDEwMCB3aWxsIGFsd2F5cyByZXR1cm4gYmxhY2suXG4gICAqL1xuICBzaGFkZShhbW91bnQgPSAxMCkge1xuICAgIHJldHVybiB0aGlzLm1peCh7XG4gICAgICByOiAwLFxuICAgICAgZzogMCxcbiAgICAgIGI6IDAsXG4gICAgICBhOiAxXG4gICAgfSwgYW1vdW50KTtcbiAgfVxuICBvbkJhY2tncm91bmQoYmFja2dyb3VuZCkge1xuICAgIGNvbnN0IGJnID0gdGhpcy5fYyhiYWNrZ3JvdW5kKTtcbiAgICBjb25zdCBhbHBoYSA9IHRoaXMuYSArIGJnLmEgKiAoMSAtIHRoaXMuYSk7XG4gICAgY29uc3QgY2FsYyA9IGtleSA9PiB7XG4gICAgICByZXR1cm4gcm91bmQoKHRoaXNba2V5XSAqIHRoaXMuYSArIGJnW2tleV0gKiBiZy5hICogKDEgLSB0aGlzLmEpKSAvIGFscGhhKTtcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLl9jKHtcbiAgICAgIHI6IGNhbGMoJ3InKSxcbiAgICAgIGc6IGNhbGMoJ2cnKSxcbiAgICAgIGI6IGNhbGMoJ2InKSxcbiAgICAgIGE6IGFscGhhXG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBTdGF0dXMgPT09PT09PT09PT09PT09PT09PT09PT1cbiAgaXNEYXJrKCkge1xuICAgIHJldHVybiB0aGlzLmdldEJyaWdodG5lc3MoKSA8IDEyODtcbiAgfVxuICBpc0xpZ2h0KCkge1xuICAgIHJldHVybiB0aGlzLmdldEJyaWdodG5lc3MoKSA+PSAxMjg7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gTUlTQyA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgZXF1YWxzKG90aGVyKSB7XG4gICAgcmV0dXJuIHRoaXMuciA9PT0gb3RoZXIuciAmJiB0aGlzLmcgPT09IG90aGVyLmcgJiYgdGhpcy5iID09PSBvdGhlci5iICYmIHRoaXMuYSA9PT0gb3RoZXIuYTtcbiAgfVxuICBjbG9uZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fYyh0aGlzKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09IEZvcm1hdCA9PT09PT09PT09PT09PT09PT09PT09PVxuICB0b0hleFN0cmluZygpIHtcbiAgICBsZXQgaGV4ID0gJyMnO1xuICAgIGNvbnN0IHJIZXggPSAodGhpcy5yIHx8IDApLnRvU3RyaW5nKDE2KTtcbiAgICBoZXggKz0gckhleC5sZW5ndGggPT09IDIgPyBySGV4IDogJzAnICsgckhleDtcbiAgICBjb25zdCBnSGV4ID0gKHRoaXMuZyB8fCAwKS50b1N0cmluZygxNik7XG4gICAgaGV4ICs9IGdIZXgubGVuZ3RoID09PSAyID8gZ0hleCA6ICcwJyArIGdIZXg7XG4gICAgY29uc3QgYkhleCA9ICh0aGlzLmIgfHwgMCkudG9TdHJpbmcoMTYpO1xuICAgIGhleCArPSBiSGV4Lmxlbmd0aCA9PT0gMiA/IGJIZXggOiAnMCcgKyBiSGV4O1xuICAgIGlmICh0eXBlb2YgdGhpcy5hID09PSAnbnVtYmVyJyAmJiB0aGlzLmEgPj0gMCAmJiB0aGlzLmEgPCAxKSB7XG4gICAgICBjb25zdCBhSGV4ID0gcm91bmQodGhpcy5hICogMjU1KS50b1N0cmluZygxNik7XG4gICAgICBoZXggKz0gYUhleC5sZW5ndGggPT09IDIgPyBhSGV4IDogJzAnICsgYUhleDtcbiAgICB9XG4gICAgcmV0dXJuIGhleDtcbiAgfVxuXG4gIC8qKiBDU1Mgc3VwcG9ydCBjb2xvciBwYXR0ZXJuICovXG4gIHRvSHNsKCkge1xuICAgIHJldHVybiB7XG4gICAgICBoOiB0aGlzLmdldEh1ZSgpLFxuICAgICAgczogdGhpcy5nZXRTYXR1cmF0aW9uKCksXG4gICAgICBsOiB0aGlzLmdldExpZ2h0bmVzcygpLFxuICAgICAgYTogdGhpcy5hXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBDU1Mgc3VwcG9ydCBjb2xvciBwYXR0ZXJuICovXG4gIHRvSHNsU3RyaW5nKCkge1xuICAgIGNvbnN0IGggPSB0aGlzLmdldEh1ZSgpO1xuICAgIGNvbnN0IHMgPSByb3VuZCh0aGlzLmdldFNhdHVyYXRpb24oKSAqIDEwMCk7XG4gICAgY29uc3QgbCA9IHJvdW5kKHRoaXMuZ2V0TGlnaHRuZXNzKCkgKiAxMDApO1xuICAgIHJldHVybiB0aGlzLmEgIT09IDEgPyBgaHNsYSgke2h9LCR7c30lLCR7bH0lLCR7dGhpcy5hfSlgIDogYGhzbCgke2h9LCR7c30lLCR7bH0lKWA7XG4gIH1cblxuICAvKiogU2FtZSBhcyB0b0hzYiAqL1xuICB0b0hzdigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaDogdGhpcy5nZXRIdWUoKSxcbiAgICAgIHM6IHRoaXMuZ2V0U2F0dXJhdGlvbigpLFxuICAgICAgdjogdGhpcy5nZXRWYWx1ZSgpLFxuICAgICAgYTogdGhpcy5hXG4gICAgfTtcbiAgfVxuICB0b1JnYigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcjogdGhpcy5yLFxuICAgICAgZzogdGhpcy5nLFxuICAgICAgYjogdGhpcy5iLFxuICAgICAgYTogdGhpcy5hXG4gICAgfTtcbiAgfVxuICB0b1JnYlN0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5hICE9PSAxID8gYHJnYmEoJHt0aGlzLnJ9LCR7dGhpcy5nfSwke3RoaXMuYn0sJHt0aGlzLmF9KWAgOiBgcmdiKCR7dGhpcy5yfSwke3RoaXMuZ30sJHt0aGlzLmJ9KWA7XG4gIH1cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9SZ2JTdHJpbmcoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT0gUHJpdmF0ZXMgPT09PT09PT09PT09PT09PT09PT09PVxuICAvKiogUmV0dXJuIGEgbmV3IEZhc3RDb2xvciBvYmplY3Qgd2l0aCBvbmUgY2hhbm5lbCBjaGFuZ2VkICovXG4gIF9zYyhyZ2IsIHZhbHVlLCBtYXgpIHtcbiAgICBjb25zdCBjbG9uZSA9IHRoaXMuY2xvbmUoKTtcbiAgICBjbG9uZVtyZ2JdID0gbGltaXRSYW5nZSh2YWx1ZSwgbWF4KTtcbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cbiAgX2MoaW5wdXQpIHtcbiAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoaW5wdXQpO1xuICB9XG4gIGdldE1heCgpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX21heCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMuX21heCA9IE1hdGgubWF4KHRoaXMuciwgdGhpcy5nLCB0aGlzLmIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbWF4O1xuICB9XG4gIGdldE1pbigpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX21pbiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMuX21pbiA9IE1hdGgubWluKHRoaXMuciwgdGhpcy5nLCB0aGlzLmIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbWluO1xuICB9XG4gIGZyb21IZXhTdHJpbmcodHJpbVN0cikge1xuICAgIGNvbnN0IHdpdGhvdXRQcmVmaXggPSB0cmltU3RyLnJlcGxhY2UoJyMnLCAnJyk7XG4gICAgZnVuY3Rpb24gY29ubmVjdE51bShpbmRleDEsIGluZGV4Mikge1xuICAgICAgcmV0dXJuIHBhcnNlSW50KHdpdGhvdXRQcmVmaXhbaW5kZXgxXSArIHdpdGhvdXRQcmVmaXhbaW5kZXgyIHx8IGluZGV4MV0sIDE2KTtcbiAgICB9XG4gICAgaWYgKHdpdGhvdXRQcmVmaXgubGVuZ3RoIDwgNikge1xuICAgICAgLy8gI3JnYiBvciAjcmdiYVxuICAgICAgdGhpcy5yID0gY29ubmVjdE51bSgwKTtcbiAgICAgIHRoaXMuZyA9IGNvbm5lY3ROdW0oMSk7XG4gICAgICB0aGlzLmIgPSBjb25uZWN0TnVtKDIpO1xuICAgICAgdGhpcy5hID0gd2l0aG91dFByZWZpeFszXSA/IGNvbm5lY3ROdW0oMykgLyAyNTUgOiAxO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyAjcnJnZ2JiIG9yICNycmdnYmJhYVxuICAgICAgdGhpcy5yID0gY29ubmVjdE51bSgwLCAxKTtcbiAgICAgIHRoaXMuZyA9IGNvbm5lY3ROdW0oMiwgMyk7XG4gICAgICB0aGlzLmIgPSBjb25uZWN0TnVtKDQsIDUpO1xuICAgICAgdGhpcy5hID0gd2l0aG91dFByZWZpeFs2XSA/IGNvbm5lY3ROdW0oNiwgNykgLyAyNTUgOiAxO1xuICAgIH1cbiAgfVxuICBmcm9tSHNsKHtcbiAgICBoLFxuICAgIHMsXG4gICAgbCxcbiAgICBhXG4gIH0pIHtcbiAgICB0aGlzLl9oID0gaCAlIDM2MDtcbiAgICB0aGlzLl9zID0gcztcbiAgICB0aGlzLl9sID0gbDtcbiAgICB0aGlzLmEgPSB0eXBlb2YgYSA9PT0gJ251bWJlcicgPyBhIDogMTtcbiAgICBpZiAocyA8PSAwKSB7XG4gICAgICBjb25zdCByZ2IgPSByb3VuZChsICogMjU1KTtcbiAgICAgIHRoaXMuciA9IHJnYjtcbiAgICAgIHRoaXMuZyA9IHJnYjtcbiAgICAgIHRoaXMuYiA9IHJnYjtcbiAgICB9XG4gICAgbGV0IHIgPSAwLFxuICAgICAgZyA9IDAsXG4gICAgICBiID0gMDtcbiAgICBjb25zdCBodWVQcmltZSA9IGggLyA2MDtcbiAgICBjb25zdCBjaHJvbWEgPSAoMSAtIE1hdGguYWJzKDIgKiBsIC0gMSkpICogcztcbiAgICBjb25zdCBzZWNvbmRDb21wb25lbnQgPSBjaHJvbWEgKiAoMSAtIE1hdGguYWJzKGh1ZVByaW1lICUgMiAtIDEpKTtcbiAgICBpZiAoaHVlUHJpbWUgPj0gMCAmJiBodWVQcmltZSA8IDEpIHtcbiAgICAgIHIgPSBjaHJvbWE7XG4gICAgICBnID0gc2Vjb25kQ29tcG9uZW50O1xuICAgIH0gZWxzZSBpZiAoaHVlUHJpbWUgPj0gMSAmJiBodWVQcmltZSA8IDIpIHtcbiAgICAgIHIgPSBzZWNvbmRDb21wb25lbnQ7XG4gICAgICBnID0gY2hyb21hO1xuICAgIH0gZWxzZSBpZiAoaHVlUHJpbWUgPj0gMiAmJiBodWVQcmltZSA8IDMpIHtcbiAgICAgIGcgPSBjaHJvbWE7XG4gICAgICBiID0gc2Vjb25kQ29tcG9uZW50O1xuICAgIH0gZWxzZSBpZiAoaHVlUHJpbWUgPj0gMyAmJiBodWVQcmltZSA8IDQpIHtcbiAgICAgIGcgPSBzZWNvbmRDb21wb25lbnQ7XG4gICAgICBiID0gY2hyb21hO1xuICAgIH0gZWxzZSBpZiAoaHVlUHJpbWUgPj0gNCAmJiBodWVQcmltZSA8IDUpIHtcbiAgICAgIHIgPSBzZWNvbmRDb21wb25lbnQ7XG4gICAgICBiID0gY2hyb21hO1xuICAgIH0gZWxzZSBpZiAoaHVlUHJpbWUgPj0gNSAmJiBodWVQcmltZSA8IDYpIHtcbiAgICAgIHIgPSBjaHJvbWE7XG4gICAgICBiID0gc2Vjb25kQ29tcG9uZW50O1xuICAgIH1cbiAgICBjb25zdCBsaWdodG5lc3NNb2RpZmljYXRpb24gPSBsIC0gY2hyb21hIC8gMjtcbiAgICB0aGlzLnIgPSByb3VuZCgociArIGxpZ2h0bmVzc01vZGlmaWNhdGlvbikgKiAyNTUpO1xuICAgIHRoaXMuZyA9IHJvdW5kKChnICsgbGlnaHRuZXNzTW9kaWZpY2F0aW9uKSAqIDI1NSk7XG4gICAgdGhpcy5iID0gcm91bmQoKGIgKyBsaWdodG5lc3NNb2RpZmljYXRpb24pICogMjU1KTtcbiAgfVxuICBmcm9tSHN2KHtcbiAgICBoLFxuICAgIHMsXG4gICAgdixcbiAgICBhXG4gIH0pIHtcbiAgICB0aGlzLl9oID0gaCAlIDM2MDtcbiAgICB0aGlzLl9zID0gcztcbiAgICB0aGlzLl92ID0gdjtcbiAgICB0aGlzLmEgPSB0eXBlb2YgYSA9PT0gJ251bWJlcicgPyBhIDogMTtcbiAgICBjb25zdCB2diA9IHJvdW5kKHYgKiAyNTUpO1xuICAgIHRoaXMuciA9IHZ2O1xuICAgIHRoaXMuZyA9IHZ2O1xuICAgIHRoaXMuYiA9IHZ2O1xuICAgIGlmIChzIDw9IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaGggPSBoIC8gNjA7XG4gICAgY29uc3QgaSA9IE1hdGguZmxvb3IoaGgpO1xuICAgIGNvbnN0IGZmID0gaGggLSBpO1xuICAgIGNvbnN0IHAgPSByb3VuZCh2ICogKDEuMCAtIHMpICogMjU1KTtcbiAgICBjb25zdCBxID0gcm91bmQodiAqICgxLjAgLSBzICogZmYpICogMjU1KTtcbiAgICBjb25zdCB0ID0gcm91bmQodiAqICgxLjAgLSBzICogKDEuMCAtIGZmKSkgKiAyNTUpO1xuICAgIHN3aXRjaCAoaSkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICB0aGlzLmcgPSB0O1xuICAgICAgICB0aGlzLmIgPSBwO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgdGhpcy5yID0gcTtcbiAgICAgICAgdGhpcy5iID0gcDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHRoaXMuciA9IHA7XG4gICAgICAgIHRoaXMuYiA9IHQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgICB0aGlzLnIgPSBwO1xuICAgICAgICB0aGlzLmcgPSBxO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNDpcbiAgICAgICAgdGhpcy5yID0gdDtcbiAgICAgICAgdGhpcy5nID0gcDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDU6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLmcgPSBwO1xuICAgICAgICB0aGlzLmIgPSBxO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgZnJvbUhzdlN0cmluZyh0cmltU3RyKSB7XG4gICAgY29uc3QgY2VsbHMgPSBzcGxpdENvbG9yU3RyKHRyaW1TdHIsIHBhcnNlSFNWb3JIU0wpO1xuICAgIHRoaXMuZnJvbUhzdih7XG4gICAgICBoOiBjZWxsc1swXSxcbiAgICAgIHM6IGNlbGxzWzFdLFxuICAgICAgdjogY2VsbHNbMl0sXG4gICAgICBhOiBjZWxsc1szXVxuICAgIH0pO1xuICB9XG4gIGZyb21Ic2xTdHJpbmcodHJpbVN0cikge1xuICAgIGNvbnN0IGNlbGxzID0gc3BsaXRDb2xvclN0cih0cmltU3RyLCBwYXJzZUhTVm9ySFNMKTtcbiAgICB0aGlzLmZyb21Ic2woe1xuICAgICAgaDogY2VsbHNbMF0sXG4gICAgICBzOiBjZWxsc1sxXSxcbiAgICAgIGw6IGNlbGxzWzJdLFxuICAgICAgYTogY2VsbHNbM11cbiAgICB9KTtcbiAgfVxuICBmcm9tUmdiU3RyaW5nKHRyaW1TdHIpIHtcbiAgICBjb25zdCBjZWxscyA9IHNwbGl0Q29sb3JTdHIodHJpbVN0ciwgKG51bSwgdHh0KSA9PlxuICAgIC8vIENvbnZlcnQgcGVyY2VudGFnZSB0byBudW1iZXIuIGUuZy4gNTAlIC0+IDEyOFxuICAgIHR4dC5pbmNsdWRlcygnJScpID8gcm91bmQobnVtIC8gMTAwICogMjU1KSA6IG51bSk7XG4gICAgdGhpcy5yID0gY2VsbHNbMF07XG4gICAgdGhpcy5nID0gY2VsbHNbMV07XG4gICAgdGhpcy5iID0gY2VsbHNbMl07XG4gICAgdGhpcy5hID0gY2VsbHNbM107XG4gIH1cbn0iLCAiaW1wb3J0IHsgRmFzdENvbG9yIH0gZnJvbSAnQGFudC1kZXNpZ24vZmFzdC1jb2xvcic7XG52YXIgaHVlU3RlcCA9IDI7IC8vIFx1ODI3Mlx1NzZGOFx1OTYzNlx1NjhBRlxudmFyIHNhdHVyYXRpb25TdGVwID0gMC4xNjsgLy8gXHU5OTcxXHU1NDhDXHU1RUE2XHU5NjM2XHU2OEFGXHVGRjBDXHU2RDQ1XHU4MjcyXHU5MEU4XHU1MjA2XG52YXIgc2F0dXJhdGlvblN0ZXAyID0gMC4wNTsgLy8gXHU5OTcxXHU1NDhDXHU1RUE2XHU5NjM2XHU2OEFGXHVGRjBDXHU2REYxXHU4MjcyXHU5MEU4XHU1MjA2XG52YXIgYnJpZ2h0bmVzc1N0ZXAxID0gMC4wNTsgLy8gXHU0RUFFXHU1RUE2XHU5NjM2XHU2OEFGXHVGRjBDXHU2RDQ1XHU4MjcyXHU5MEU4XHU1MjA2XG52YXIgYnJpZ2h0bmVzc1N0ZXAyID0gMC4xNTsgLy8gXHU0RUFFXHU1RUE2XHU5NjM2XHU2OEFGXHVGRjBDXHU2REYxXHU4MjcyXHU5MEU4XHU1MjA2XG52YXIgbGlnaHRDb2xvckNvdW50ID0gNTsgLy8gXHU2RDQ1XHU4MjcyXHU2NTcwXHU5MUNGXHVGRjBDXHU0RTNCXHU4MjcyXHU0RTBBXG52YXIgZGFya0NvbG9yQ291bnQgPSA0OyAvLyBcdTZERjFcdTgyNzJcdTY1NzBcdTkxQ0ZcdUZGMENcdTRFM0JcdTgyNzJcdTRFMEJcblxuLy8gXHU2Njk3XHU4MjcyXHU0RTNCXHU5ODk4XHU5ODlDXHU4MjcyXHU2NjIwXHU1QzA0XHU1MTczXHU3Q0ZCXHU4ODY4XG52YXIgZGFya0NvbG9yTWFwID0gW3tcbiAgaW5kZXg6IDcsXG4gIGFtb3VudDogMTVcbn0sIHtcbiAgaW5kZXg6IDYsXG4gIGFtb3VudDogMjVcbn0sIHtcbiAgaW5kZXg6IDUsXG4gIGFtb3VudDogMzBcbn0sIHtcbiAgaW5kZXg6IDUsXG4gIGFtb3VudDogNDVcbn0sIHtcbiAgaW5kZXg6IDUsXG4gIGFtb3VudDogNjVcbn0sIHtcbiAgaW5kZXg6IDUsXG4gIGFtb3VudDogODVcbn0sIHtcbiAgaW5kZXg6IDQsXG4gIGFtb3VudDogOTBcbn0sIHtcbiAgaW5kZXg6IDMsXG4gIGFtb3VudDogOTVcbn0sIHtcbiAgaW5kZXg6IDIsXG4gIGFtb3VudDogOTdcbn0sIHtcbiAgaW5kZXg6IDEsXG4gIGFtb3VudDogOThcbn1dO1xuZnVuY3Rpb24gZ2V0SHVlKGhzdiwgaSwgbGlnaHQpIHtcbiAgdmFyIGh1ZTtcbiAgLy8gXHU2ODM5XHU2MzZFXHU4MjcyXHU3NkY4XHU0RTBEXHU1NDBDXHVGRjBDXHU4MjcyXHU3NkY4XHU4RjZDXHU1NDExXHU0RTBEXHU1NDBDXG4gIGlmIChNYXRoLnJvdW5kKGhzdi5oKSA+PSA2MCAmJiBNYXRoLnJvdW5kKGhzdi5oKSA8PSAyNDApIHtcbiAgICBodWUgPSBsaWdodCA/IE1hdGgucm91bmQoaHN2LmgpIC0gaHVlU3RlcCAqIGkgOiBNYXRoLnJvdW5kKGhzdi5oKSArIGh1ZVN0ZXAgKiBpO1xuICB9IGVsc2Uge1xuICAgIGh1ZSA9IGxpZ2h0ID8gTWF0aC5yb3VuZChoc3YuaCkgKyBodWVTdGVwICogaSA6IE1hdGgucm91bmQoaHN2LmgpIC0gaHVlU3RlcCAqIGk7XG4gIH1cbiAgaWYgKGh1ZSA8IDApIHtcbiAgICBodWUgKz0gMzYwO1xuICB9IGVsc2UgaWYgKGh1ZSA+PSAzNjApIHtcbiAgICBodWUgLT0gMzYwO1xuICB9XG4gIHJldHVybiBodWU7XG59XG5mdW5jdGlvbiBnZXRTYXR1cmF0aW9uKGhzdiwgaSwgbGlnaHQpIHtcbiAgLy8gZ3JleSBjb2xvciBkb24ndCBjaGFuZ2Ugc2F0dXJhdGlvblxuICBpZiAoaHN2LmggPT09IDAgJiYgaHN2LnMgPT09IDApIHtcbiAgICByZXR1cm4gaHN2LnM7XG4gIH1cbiAgdmFyIHNhdHVyYXRpb247XG4gIGlmIChsaWdodCkge1xuICAgIHNhdHVyYXRpb24gPSBoc3YucyAtIHNhdHVyYXRpb25TdGVwICogaTtcbiAgfSBlbHNlIGlmIChpID09PSBkYXJrQ29sb3JDb3VudCkge1xuICAgIHNhdHVyYXRpb24gPSBoc3YucyArIHNhdHVyYXRpb25TdGVwO1xuICB9IGVsc2Uge1xuICAgIHNhdHVyYXRpb24gPSBoc3YucyArIHNhdHVyYXRpb25TdGVwMiAqIGk7XG4gIH1cbiAgLy8gXHU4RkI5XHU3NTRDXHU1MDNDXHU0RkVFXHU2QjYzXG4gIGlmIChzYXR1cmF0aW9uID4gMSkge1xuICAgIHNhdHVyYXRpb24gPSAxO1xuICB9XG4gIC8vIFx1N0IyQ1x1NEUwMFx1NjgzQ1x1NzY4NCBzIFx1OTY1MFx1NTIzNlx1NTcyOCAwLjA2LTAuMSBcdTRFNEJcdTk1RjRcbiAgaWYgKGxpZ2h0ICYmIGkgPT09IGxpZ2h0Q29sb3JDb3VudCAmJiBzYXR1cmF0aW9uID4gMC4xKSB7XG4gICAgc2F0dXJhdGlvbiA9IDAuMTtcbiAgfVxuICBpZiAoc2F0dXJhdGlvbiA8IDAuMDYpIHtcbiAgICBzYXR1cmF0aW9uID0gMC4wNjtcbiAgfVxuICByZXR1cm4gTWF0aC5yb3VuZChzYXR1cmF0aW9uICogMTAwKSAvIDEwMDtcbn1cbmZ1bmN0aW9uIGdldFZhbHVlKGhzdiwgaSwgbGlnaHQpIHtcbiAgdmFyIHZhbHVlO1xuICBpZiAobGlnaHQpIHtcbiAgICB2YWx1ZSA9IGhzdi52ICsgYnJpZ2h0bmVzc1N0ZXAxICogaTtcbiAgfSBlbHNlIHtcbiAgICB2YWx1ZSA9IGhzdi52IC0gYnJpZ2h0bmVzc1N0ZXAyICogaTtcbiAgfVxuICAvLyBDbGFtcCB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDFcbiAgdmFsdWUgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCB2YWx1ZSkpO1xuICByZXR1cm4gTWF0aC5yb3VuZCh2YWx1ZSAqIDEwMCkgLyAxMDA7XG59XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZW5lcmF0ZShjb2xvcikge1xuICB2YXIgb3B0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gIHZhciBwYXR0ZXJucyA9IFtdO1xuICB2YXIgcENvbG9yID0gbmV3IEZhc3RDb2xvcihjb2xvcik7XG4gIHZhciBoc3YgPSBwQ29sb3IudG9Ic3YoKTtcbiAgZm9yICh2YXIgaSA9IGxpZ2h0Q29sb3JDb3VudDsgaSA+IDA7IGkgLT0gMSkge1xuICAgIHZhciBjID0gbmV3IEZhc3RDb2xvcih7XG4gICAgICBoOiBnZXRIdWUoaHN2LCBpLCB0cnVlKSxcbiAgICAgIHM6IGdldFNhdHVyYXRpb24oaHN2LCBpLCB0cnVlKSxcbiAgICAgIHY6IGdldFZhbHVlKGhzdiwgaSwgdHJ1ZSlcbiAgICB9KTtcbiAgICBwYXR0ZXJucy5wdXNoKGMpO1xuICB9XG4gIHBhdHRlcm5zLnB1c2gocENvbG9yKTtcbiAgZm9yICh2YXIgX2kgPSAxOyBfaSA8PSBkYXJrQ29sb3JDb3VudDsgX2kgKz0gMSkge1xuICAgIHZhciBfYyA9IG5ldyBGYXN0Q29sb3Ioe1xuICAgICAgaDogZ2V0SHVlKGhzdiwgX2kpLFxuICAgICAgczogZ2V0U2F0dXJhdGlvbihoc3YsIF9pKSxcbiAgICAgIHY6IGdldFZhbHVlKGhzdiwgX2kpXG4gICAgfSk7XG4gICAgcGF0dGVybnMucHVzaChfYyk7XG4gIH1cblxuICAvLyBkYXJrIHRoZW1lIHBhdHRlcm5zXG4gIGlmIChvcHRzLnRoZW1lID09PSAnZGFyaycpIHtcbiAgICByZXR1cm4gZGFya0NvbG9yTWFwLm1hcChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgdmFyIGluZGV4ID0gX3JlZi5pbmRleCxcbiAgICAgICAgYW1vdW50ID0gX3JlZi5hbW91bnQ7XG4gICAgICByZXR1cm4gbmV3IEZhc3RDb2xvcihvcHRzLmJhY2tncm91bmRDb2xvciB8fCAnIzE0MTQxNCcpLm1peChwYXR0ZXJuc1tpbmRleF0sIGFtb3VudCkudG9IZXhTdHJpbmcoKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcGF0dGVybnMubWFwKGZ1bmN0aW9uIChjKSB7XG4gICAgcmV0dXJuIGMudG9IZXhTdHJpbmcoKTtcbiAgfSk7XG59IiwgIi8vIEdlbmVyYXRlZCBieSBzY3JpcHQuIERvIE5PVCBtb2RpZnkhXG5cbmV4cG9ydCB2YXIgcHJlc2V0UHJpbWFyeUNvbG9ycyA9IHtcbiAgXCJyZWRcIjogXCIjRjUyMjJEXCIsXG4gIFwidm9sY2Fub1wiOiBcIiNGQTU0MUNcIixcbiAgXCJvcmFuZ2VcIjogXCIjRkE4QzE2XCIsXG4gIFwiZ29sZFwiOiBcIiNGQUFEMTRcIixcbiAgXCJ5ZWxsb3dcIjogXCIjRkFEQjE0XCIsXG4gIFwibGltZVwiOiBcIiNBMEQ5MTFcIixcbiAgXCJncmVlblwiOiBcIiM1MkM0MUFcIixcbiAgXCJjeWFuXCI6IFwiIzEzQzJDMlwiLFxuICBcImJsdWVcIjogXCIjMTY3N0ZGXCIsXG4gIFwiZ2Vla2JsdWVcIjogXCIjMkY1NEVCXCIsXG4gIFwicHVycGxlXCI6IFwiIzcyMkVEMVwiLFxuICBcIm1hZ2VudGFcIjogXCIjRUIyRjk2XCIsXG4gIFwiZ3JleVwiOiBcIiM2NjY2NjZcIlxufTtcbmV4cG9ydCB2YXIgcmVkID0gW1wiI2ZmZjFmMFwiLCBcIiNmZmNjYzdcIiwgXCIjZmZhMzllXCIsIFwiI2ZmNzg3NVwiLCBcIiNmZjRkNGZcIiwgXCIjZjUyMjJkXCIsIFwiI2NmMTMyMlwiLCBcIiNhODA3MWFcIiwgXCIjODIwMDE0XCIsIFwiIzVjMDAxMVwiXTtcbnJlZC5wcmltYXJ5ID0gcmVkWzVdO1xuZXhwb3J0IHZhciB2b2xjYW5vID0gW1wiI2ZmZjJlOFwiLCBcIiNmZmQ4YmZcIiwgXCIjZmZiYjk2XCIsIFwiI2ZmOWM2ZVwiLCBcIiNmZjdhNDVcIiwgXCIjZmE1NDFjXCIsIFwiI2Q0MzgwZFwiLCBcIiNhZDIxMDJcIiwgXCIjODcxNDAwXCIsIFwiIzYxMGIwMFwiXTtcbnZvbGNhbm8ucHJpbWFyeSA9IHZvbGNhbm9bNV07XG5leHBvcnQgdmFyIG9yYW5nZSA9IFtcIiNmZmY3ZTZcIiwgXCIjZmZlN2JhXCIsIFwiI2ZmZDU5MVwiLCBcIiNmZmMwNjlcIiwgXCIjZmZhOTQwXCIsIFwiI2ZhOGMxNlwiLCBcIiNkNDZiMDhcIiwgXCIjYWQ0ZTAwXCIsIFwiIzg3MzgwMFwiLCBcIiM2MTI1MDBcIl07XG5vcmFuZ2UucHJpbWFyeSA9IG9yYW5nZVs1XTtcbmV4cG9ydCB2YXIgZ29sZCA9IFtcIiNmZmZiZTZcIiwgXCIjZmZmMWI4XCIsIFwiI2ZmZTU4ZlwiLCBcIiNmZmQ2NjZcIiwgXCIjZmZjNTNkXCIsIFwiI2ZhYWQxNFwiLCBcIiNkNDg4MDZcIiwgXCIjYWQ2ODAwXCIsIFwiIzg3NGQwMFwiLCBcIiM2MTM0MDBcIl07XG5nb2xkLnByaW1hcnkgPSBnb2xkWzVdO1xuZXhwb3J0IHZhciB5ZWxsb3cgPSBbXCIjZmVmZmU2XCIsIFwiI2ZmZmZiOFwiLCBcIiNmZmZiOGZcIiwgXCIjZmZmNTY2XCIsIFwiI2ZmZWMzZFwiLCBcIiNmYWRiMTRcIiwgXCIjZDRiMTA2XCIsIFwiI2FkOGIwMFwiLCBcIiM4NzY4MDBcIiwgXCIjNjE0NzAwXCJdO1xueWVsbG93LnByaW1hcnkgPSB5ZWxsb3dbNV07XG5leHBvcnQgdmFyIGxpbWUgPSBbXCIjZmNmZmU2XCIsIFwiI2Y0ZmZiOFwiLCBcIiNlYWZmOGZcIiwgXCIjZDNmMjYxXCIsIFwiI2JhZTYzN1wiLCBcIiNhMGQ5MTFcIiwgXCIjN2NiMzA1XCIsIFwiIzViOGMwMFwiLCBcIiMzZjY2MDBcIiwgXCIjMjU0MDAwXCJdO1xubGltZS5wcmltYXJ5ID0gbGltZVs1XTtcbmV4cG9ydCB2YXIgZ3JlZW4gPSBbXCIjZjZmZmVkXCIsIFwiI2Q5ZjdiZVwiLCBcIiNiN2ViOGZcIiwgXCIjOTVkZTY0XCIsIFwiIzczZDEzZFwiLCBcIiM1MmM0MWFcIiwgXCIjMzg5ZTBkXCIsIFwiIzIzNzgwNFwiLCBcIiMxMzUyMDBcIiwgXCIjMDkyYjAwXCJdO1xuZ3JlZW4ucHJpbWFyeSA9IGdyZWVuWzVdO1xuZXhwb3J0IHZhciBjeWFuID0gW1wiI2U2ZmZmYlwiLCBcIiNiNWY1ZWNcIiwgXCIjODdlOGRlXCIsIFwiIzVjZGJkM1wiLCBcIiMzNmNmYzlcIiwgXCIjMTNjMmMyXCIsIFwiIzA4OTc5Y1wiLCBcIiMwMDZkNzVcIiwgXCIjMDA0NzRmXCIsIFwiIzAwMjMyOVwiXTtcbmN5YW4ucHJpbWFyeSA9IGN5YW5bNV07XG5leHBvcnQgdmFyIGJsdWUgPSBbXCIjZTZmNGZmXCIsIFwiI2JhZTBmZlwiLCBcIiM5MWNhZmZcIiwgXCIjNjliMWZmXCIsIFwiIzQwOTZmZlwiLCBcIiMxNjc3ZmZcIiwgXCIjMDk1OGQ5XCIsIFwiIzAwM2ViM1wiLCBcIiMwMDJjOGNcIiwgXCIjMDAxZDY2XCJdO1xuYmx1ZS5wcmltYXJ5ID0gYmx1ZVs1XTtcbmV4cG9ydCB2YXIgZ2Vla2JsdWUgPSBbXCIjZjBmNWZmXCIsIFwiI2Q2ZTRmZlwiLCBcIiNhZGM2ZmZcIiwgXCIjODVhNWZmXCIsIFwiIzU5N2VmN1wiLCBcIiMyZjU0ZWJcIiwgXCIjMWQzOWM0XCIsIFwiIzEwMjM5ZVwiLCBcIiMwNjExNzhcIiwgXCIjMDMwODUyXCJdO1xuZ2Vla2JsdWUucHJpbWFyeSA9IGdlZWtibHVlWzVdO1xuZXhwb3J0IHZhciBwdXJwbGUgPSBbXCIjZjlmMGZmXCIsIFwiI2VmZGJmZlwiLCBcIiNkM2FkZjdcIiwgXCIjYjM3ZmViXCIsIFwiIzkyNTRkZVwiLCBcIiM3MjJlZDFcIiwgXCIjNTMxZGFiXCIsIFwiIzM5MTA4NVwiLCBcIiMyMjA3NWVcIiwgXCIjMTIwMzM4XCJdO1xucHVycGxlLnByaW1hcnkgPSBwdXJwbGVbNV07XG5leHBvcnQgdmFyIG1hZ2VudGEgPSBbXCIjZmZmMGY2XCIsIFwiI2ZmZDZlN1wiLCBcIiNmZmFkZDJcIiwgXCIjZmY4NWMwXCIsIFwiI2Y3NTlhYlwiLCBcIiNlYjJmOTZcIiwgXCIjYzQxZDdmXCIsIFwiIzllMTA2OFwiLCBcIiM3ODA2NTBcIiwgXCIjNTIwMzM5XCJdO1xubWFnZW50YS5wcmltYXJ5ID0gbWFnZW50YVs1XTtcbmV4cG9ydCB2YXIgZ3JleSA9IFtcIiNhNmE2YTZcIiwgXCIjOTk5OTk5XCIsIFwiIzhjOGM4Y1wiLCBcIiM4MDgwODBcIiwgXCIjNzM3MzczXCIsIFwiIzY2NjY2NlwiLCBcIiM0MDQwNDBcIiwgXCIjMWExYTFhXCIsIFwiIzAwMDAwMFwiLCBcIiMwMDAwMDBcIl07XG5ncmV5LnByaW1hcnkgPSBncmV5WzVdO1xuZXhwb3J0IHZhciBncmF5ID0gZ3JleTtcbmV4cG9ydCB2YXIgcHJlc2V0UGFsZXR0ZXMgPSB7XG4gIHJlZDogcmVkLFxuICB2b2xjYW5vOiB2b2xjYW5vLFxuICBvcmFuZ2U6IG9yYW5nZSxcbiAgZ29sZDogZ29sZCxcbiAgeWVsbG93OiB5ZWxsb3csXG4gIGxpbWU6IGxpbWUsXG4gIGdyZWVuOiBncmVlbixcbiAgY3lhbjogY3lhbixcbiAgYmx1ZTogYmx1ZSxcbiAgZ2Vla2JsdWU6IGdlZWtibHVlLFxuICBwdXJwbGU6IHB1cnBsZSxcbiAgbWFnZW50YTogbWFnZW50YSxcbiAgZ3JleTogZ3JleVxufTtcbmV4cG9ydCB2YXIgcmVkRGFyayA9IFtcIiMyYTEyMTVcIiwgXCIjNDMxNDE4XCIsIFwiIzU4MTgxY1wiLCBcIiM3OTFhMWZcIiwgXCIjYTYxZDI0XCIsIFwiI2QzMjAyOVwiLCBcIiNlODQ3NDlcIiwgXCIjZjM3MzcwXCIsIFwiI2Y4OWY5YVwiLCBcIiNmYWM4YzNcIl07XG5yZWREYXJrLnByaW1hcnkgPSByZWREYXJrWzVdO1xuZXhwb3J0IHZhciB2b2xjYW5vRGFyayA9IFtcIiMyYjE2MTFcIiwgXCIjNDQxZDEyXCIsIFwiIzU5MjcxNlwiLCBcIiM3YzMxMThcIiwgXCIjYWEzZTE5XCIsIFwiI2Q4NGExYlwiLCBcIiNlODcwNDBcIiwgXCIjZjM5NTZhXCIsIFwiI2Y4YjY5MlwiLCBcIiNmYWQ0YmNcIl07XG52b2xjYW5vRGFyay5wcmltYXJ5ID0gdm9sY2Fub0RhcmtbNV07XG5leHBvcnQgdmFyIG9yYW5nZURhcmsgPSBbXCIjMmIxZDExXCIsIFwiIzQ0MmExMVwiLCBcIiM1OTM4MTVcIiwgXCIjN2M0YTE1XCIsIFwiI2FhNjIxNVwiLCBcIiNkODdhMTZcIiwgXCIjZTg5YTNjXCIsIFwiI2YzYjc2NVwiLCBcIiNmOGNmOGRcIiwgXCIjZmFlM2I3XCJdO1xub3JhbmdlRGFyay5wcmltYXJ5ID0gb3JhbmdlRGFya1s1XTtcbmV4cG9ydCB2YXIgZ29sZERhcmsgPSBbXCIjMmIyMTExXCIsIFwiIzQ0MzExMVwiLCBcIiM1OTQyMTRcIiwgXCIjN2M1OTE0XCIsIFwiI2FhNzcxNFwiLCBcIiNkODk2MTRcIiwgXCIjZThiMzM5XCIsIFwiI2YzY2M2MlwiLCBcIiNmOGRmOGJcIiwgXCIjZmFlZGI1XCJdO1xuZ29sZERhcmsucHJpbWFyeSA9IGdvbGREYXJrWzVdO1xuZXhwb3J0IHZhciB5ZWxsb3dEYXJrID0gW1wiIzJiMjYxMVwiLCBcIiM0NDNiMTFcIiwgXCIjNTk1MDE0XCIsIFwiIzdjNmUxNFwiLCBcIiNhYTk1MTRcIiwgXCIjZDhiZDE0XCIsIFwiI2U4ZDYzOVwiLCBcIiNmM2VhNjJcIiwgXCIjZjhmNDhiXCIsIFwiI2ZhZmFiNVwiXTtcbnllbGxvd0RhcmsucHJpbWFyeSA9IHllbGxvd0RhcmtbNV07XG5leHBvcnQgdmFyIGxpbWVEYXJrID0gW1wiIzFmMjYxMVwiLCBcIiMyZTNjMTBcIiwgXCIjM2U0ZjEzXCIsIFwiIzUzNmQxM1wiLCBcIiM2Zjk0MTJcIiwgXCIjOGJiYjExXCIsIFwiI2E5ZDEzNFwiLCBcIiNjOWU3NWRcIiwgXCIjZTRmODhiXCIsIFwiI2YwZmFiNVwiXTtcbmxpbWVEYXJrLnByaW1hcnkgPSBsaW1lRGFya1s1XTtcbmV4cG9ydCB2YXIgZ3JlZW5EYXJrID0gW1wiIzE2MjMxMlwiLCBcIiMxZDM3MTJcIiwgXCIjMjc0OTE2XCIsIFwiIzMwNjMxN1wiLCBcIiMzYzg2MThcIiwgXCIjNDlhYTE5XCIsIFwiIzZhYmUzOVwiLCBcIiM4ZmQ0NjBcIiwgXCIjYjJlNThiXCIsIFwiI2Q1ZjJiYlwiXTtcbmdyZWVuRGFyay5wcmltYXJ5ID0gZ3JlZW5EYXJrWzVdO1xuZXhwb3J0IHZhciBjeWFuRGFyayA9IFtcIiMxMTIxMjNcIiwgXCIjMTEzNTM2XCIsIFwiIzE0NDg0OFwiLCBcIiMxNDYyNjJcIiwgXCIjMTM4NTg1XCIsIFwiIzEzYThhOFwiLCBcIiMzM2JjYjdcIiwgXCIjNThkMWM5XCIsIFwiIzg0ZTJkOFwiLCBcIiNiMmYxZThcIl07XG5jeWFuRGFyay5wcmltYXJ5ID0gY3lhbkRhcmtbNV07XG5leHBvcnQgdmFyIGJsdWVEYXJrID0gW1wiIzExMWEyY1wiLCBcIiMxMTI1NDVcIiwgXCIjMTUzMjViXCIsIFwiIzE1NDE3ZVwiLCBcIiMxNTU0YWRcIiwgXCIjMTY2OGRjXCIsIFwiIzNjODllOFwiLCBcIiM2NWE5ZjNcIiwgXCIjOGRjNWY4XCIsIFwiI2I3ZGNmYVwiXTtcbmJsdWVEYXJrLnByaW1hcnkgPSBibHVlRGFya1s1XTtcbmV4cG9ydCB2YXIgZ2Vla2JsdWVEYXJrID0gW1wiIzEzMTYyOVwiLCBcIiMxNjFkNDBcIiwgXCIjMWMyNzU1XCIsIFwiIzIwMzE3NVwiLCBcIiMyNjNlYTBcIiwgXCIjMmI0YWNiXCIsIFwiIzUyNzNlMFwiLCBcIiM3ZjllZjNcIiwgXCIjYThjMWY4XCIsIFwiI2QyZTBmYVwiXTtcbmdlZWtibHVlRGFyay5wcmltYXJ5ID0gZ2Vla2JsdWVEYXJrWzVdO1xuZXhwb3J0IHZhciBwdXJwbGVEYXJrID0gW1wiIzFhMTMyNVwiLCBcIiMyNDE2M2FcIiwgXCIjMzAxYzRkXCIsIFwiIzNlMjA2OVwiLCBcIiM1MTI1OGZcIiwgXCIjNjQyYWI1XCIsIFwiIzg1NGVjYVwiLCBcIiNhYjdhZTBcIiwgXCIjY2RhOGYwXCIsIFwiI2ViZDdmYVwiXTtcbnB1cnBsZURhcmsucHJpbWFyeSA9IHB1cnBsZURhcmtbNV07XG5leHBvcnQgdmFyIG1hZ2VudGFEYXJrID0gW1wiIzI5MTMyMVwiLCBcIiM0MDE2MmZcIiwgXCIjNTUxYzNiXCIsIFwiIzc1MjA0ZlwiLCBcIiNhMDI2NjlcIiwgXCIjY2IyYjgzXCIsIFwiI2UwNTI5Y1wiLCBcIiNmMzdmYjdcIiwgXCIjZjhhOGNjXCIsIFwiI2ZhZDJlM1wiXTtcbm1hZ2VudGFEYXJrLnByaW1hcnkgPSBtYWdlbnRhRGFya1s1XTtcbmV4cG9ydCB2YXIgZ3JleURhcmsgPSBbXCIjMTUxNTE1XCIsIFwiIzFmMWYxZlwiLCBcIiMyZDJkMmRcIiwgXCIjMzkzOTM5XCIsIFwiIzQ5NDk0OVwiLCBcIiM1YTVhNWFcIiwgXCIjNmE2YTZhXCIsIFwiIzdiN2I3YlwiLCBcIiM4ODg4ODhcIiwgXCIjOTY5Njk2XCJdO1xuZ3JleURhcmsucHJpbWFyeSA9IGdyZXlEYXJrWzVdO1xuZXhwb3J0IHZhciBwcmVzZXREYXJrUGFsZXR0ZXMgPSB7XG4gIHJlZDogcmVkRGFyayxcbiAgdm9sY2Fubzogdm9sY2Fub0RhcmssXG4gIG9yYW5nZTogb3JhbmdlRGFyayxcbiAgZ29sZDogZ29sZERhcmssXG4gIHllbGxvdzogeWVsbG93RGFyayxcbiAgbGltZTogbGltZURhcmssXG4gIGdyZWVuOiBncmVlbkRhcmssXG4gIGN5YW46IGN5YW5EYXJrLFxuICBibHVlOiBibHVlRGFyayxcbiAgZ2Vla2JsdWU6IGdlZWtibHVlRGFyayxcbiAgcHVycGxlOiBwdXJwbGVEYXJrLFxuICBtYWdlbnRhOiBtYWdlbnRhRGFyayxcbiAgZ3JleTogZ3JleURhcmtcbn07IiwgImltcG9ydCB7IEZhc3RDb2xvciB9IGZyb20gJ0BhbnQtZGVzaWduL2Zhc3QtY29sb3InO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2VuQ29sb3JNYXBUb2tlbihzZWVkLCBfcmVmKSB7XG4gIGxldCB7XG4gICAgZ2VuZXJhdGVDb2xvclBhbGV0dGVzLFxuICAgIGdlbmVyYXRlTmV1dHJhbENvbG9yUGFsZXR0ZXNcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IHtcbiAgICBjb2xvclN1Y2Nlc3M6IGNvbG9yU3VjY2Vzc0Jhc2UsXG4gICAgY29sb3JXYXJuaW5nOiBjb2xvcldhcm5pbmdCYXNlLFxuICAgIGNvbG9yRXJyb3I6IGNvbG9yRXJyb3JCYXNlLFxuICAgIGNvbG9ySW5mbzogY29sb3JJbmZvQmFzZSxcbiAgICBjb2xvclByaW1hcnk6IGNvbG9yUHJpbWFyeUJhc2UsXG4gICAgY29sb3JCZ0Jhc2UsXG4gICAgY29sb3JUZXh0QmFzZVxuICB9ID0gc2VlZDtcbiAgY29uc3QgcHJpbWFyeUNvbG9ycyA9IGdlbmVyYXRlQ29sb3JQYWxldHRlcyhjb2xvclByaW1hcnlCYXNlKTtcbiAgY29uc3Qgc3VjY2Vzc0NvbG9ycyA9IGdlbmVyYXRlQ29sb3JQYWxldHRlcyhjb2xvclN1Y2Nlc3NCYXNlKTtcbiAgY29uc3Qgd2FybmluZ0NvbG9ycyA9IGdlbmVyYXRlQ29sb3JQYWxldHRlcyhjb2xvcldhcm5pbmdCYXNlKTtcbiAgY29uc3QgZXJyb3JDb2xvcnMgPSBnZW5lcmF0ZUNvbG9yUGFsZXR0ZXMoY29sb3JFcnJvckJhc2UpO1xuICBjb25zdCBpbmZvQ29sb3JzID0gZ2VuZXJhdGVDb2xvclBhbGV0dGVzKGNvbG9ySW5mb0Jhc2UpO1xuICBjb25zdCBuZXV0cmFsQ29sb3JzID0gZ2VuZXJhdGVOZXV0cmFsQ29sb3JQYWxldHRlcyhjb2xvckJnQmFzZSwgY29sb3JUZXh0QmFzZSk7XG4gIC8vIENvbG9yIExpbmtcbiAgY29uc3QgY29sb3JMaW5rID0gc2VlZC5jb2xvckxpbmsgfHwgc2VlZC5jb2xvckluZm87XG4gIGNvbnN0IGxpbmtDb2xvcnMgPSBnZW5lcmF0ZUNvbG9yUGFsZXR0ZXMoY29sb3JMaW5rKTtcbiAgY29uc3QgY29sb3JFcnJvckJnRmlsbGVkSG92ZXIgPSBuZXcgRmFzdENvbG9yKGVycm9yQ29sb3JzWzFdKS5taXgobmV3IEZhc3RDb2xvcihlcnJvckNvbG9yc1szXSksIDUwKS50b0hleFN0cmluZygpO1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBuZXV0cmFsQ29sb3JzKSwge1xuICAgIGNvbG9yUHJpbWFyeUJnOiBwcmltYXJ5Q29sb3JzWzFdLFxuICAgIGNvbG9yUHJpbWFyeUJnSG92ZXI6IHByaW1hcnlDb2xvcnNbMl0sXG4gICAgY29sb3JQcmltYXJ5Qm9yZGVyOiBwcmltYXJ5Q29sb3JzWzNdLFxuICAgIGNvbG9yUHJpbWFyeUJvcmRlckhvdmVyOiBwcmltYXJ5Q29sb3JzWzRdLFxuICAgIGNvbG9yUHJpbWFyeUhvdmVyOiBwcmltYXJ5Q29sb3JzWzVdLFxuICAgIGNvbG9yUHJpbWFyeTogcHJpbWFyeUNvbG9yc1s2XSxcbiAgICBjb2xvclByaW1hcnlBY3RpdmU6IHByaW1hcnlDb2xvcnNbN10sXG4gICAgY29sb3JQcmltYXJ5VGV4dEhvdmVyOiBwcmltYXJ5Q29sb3JzWzhdLFxuICAgIGNvbG9yUHJpbWFyeVRleHQ6IHByaW1hcnlDb2xvcnNbOV0sXG4gICAgY29sb3JQcmltYXJ5VGV4dEFjdGl2ZTogcHJpbWFyeUNvbG9yc1sxMF0sXG4gICAgY29sb3JTdWNjZXNzQmc6IHN1Y2Nlc3NDb2xvcnNbMV0sXG4gICAgY29sb3JTdWNjZXNzQmdIb3Zlcjogc3VjY2Vzc0NvbG9yc1syXSxcbiAgICBjb2xvclN1Y2Nlc3NCb3JkZXI6IHN1Y2Nlc3NDb2xvcnNbM10sXG4gICAgY29sb3JTdWNjZXNzQm9yZGVySG92ZXI6IHN1Y2Nlc3NDb2xvcnNbNF0sXG4gICAgY29sb3JTdWNjZXNzSG92ZXI6IHN1Y2Nlc3NDb2xvcnNbNF0sXG4gICAgY29sb3JTdWNjZXNzOiBzdWNjZXNzQ29sb3JzWzZdLFxuICAgIGNvbG9yU3VjY2Vzc0FjdGl2ZTogc3VjY2Vzc0NvbG9yc1s3XSxcbiAgICBjb2xvclN1Y2Nlc3NUZXh0SG92ZXI6IHN1Y2Nlc3NDb2xvcnNbOF0sXG4gICAgY29sb3JTdWNjZXNzVGV4dDogc3VjY2Vzc0NvbG9yc1s5XSxcbiAgICBjb2xvclN1Y2Nlc3NUZXh0QWN0aXZlOiBzdWNjZXNzQ29sb3JzWzEwXSxcbiAgICBjb2xvckVycm9yQmc6IGVycm9yQ29sb3JzWzFdLFxuICAgIGNvbG9yRXJyb3JCZ0hvdmVyOiBlcnJvckNvbG9yc1syXSxcbiAgICBjb2xvckVycm9yQmdGaWxsZWRIb3ZlcixcbiAgICBjb2xvckVycm9yQmdBY3RpdmU6IGVycm9yQ29sb3JzWzNdLFxuICAgIGNvbG9yRXJyb3JCb3JkZXI6IGVycm9yQ29sb3JzWzNdLFxuICAgIGNvbG9yRXJyb3JCb3JkZXJIb3ZlcjogZXJyb3JDb2xvcnNbNF0sXG4gICAgY29sb3JFcnJvckhvdmVyOiBlcnJvckNvbG9yc1s1XSxcbiAgICBjb2xvckVycm9yOiBlcnJvckNvbG9yc1s2XSxcbiAgICBjb2xvckVycm9yQWN0aXZlOiBlcnJvckNvbG9yc1s3XSxcbiAgICBjb2xvckVycm9yVGV4dEhvdmVyOiBlcnJvckNvbG9yc1s4XSxcbiAgICBjb2xvckVycm9yVGV4dDogZXJyb3JDb2xvcnNbOV0sXG4gICAgY29sb3JFcnJvclRleHRBY3RpdmU6IGVycm9yQ29sb3JzWzEwXSxcbiAgICBjb2xvcldhcm5pbmdCZzogd2FybmluZ0NvbG9yc1sxXSxcbiAgICBjb2xvcldhcm5pbmdCZ0hvdmVyOiB3YXJuaW5nQ29sb3JzWzJdLFxuICAgIGNvbG9yV2FybmluZ0JvcmRlcjogd2FybmluZ0NvbG9yc1szXSxcbiAgICBjb2xvcldhcm5pbmdCb3JkZXJIb3Zlcjogd2FybmluZ0NvbG9yc1s0XSxcbiAgICBjb2xvcldhcm5pbmdIb3Zlcjogd2FybmluZ0NvbG9yc1s0XSxcbiAgICBjb2xvcldhcm5pbmc6IHdhcm5pbmdDb2xvcnNbNl0sXG4gICAgY29sb3JXYXJuaW5nQWN0aXZlOiB3YXJuaW5nQ29sb3JzWzddLFxuICAgIGNvbG9yV2FybmluZ1RleHRIb3Zlcjogd2FybmluZ0NvbG9yc1s4XSxcbiAgICBjb2xvcldhcm5pbmdUZXh0OiB3YXJuaW5nQ29sb3JzWzldLFxuICAgIGNvbG9yV2FybmluZ1RleHRBY3RpdmU6IHdhcm5pbmdDb2xvcnNbMTBdLFxuICAgIGNvbG9ySW5mb0JnOiBpbmZvQ29sb3JzWzFdLFxuICAgIGNvbG9ySW5mb0JnSG92ZXI6IGluZm9Db2xvcnNbMl0sXG4gICAgY29sb3JJbmZvQm9yZGVyOiBpbmZvQ29sb3JzWzNdLFxuICAgIGNvbG9ySW5mb0JvcmRlckhvdmVyOiBpbmZvQ29sb3JzWzRdLFxuICAgIGNvbG9ySW5mb0hvdmVyOiBpbmZvQ29sb3JzWzRdLFxuICAgIGNvbG9ySW5mbzogaW5mb0NvbG9yc1s2XSxcbiAgICBjb2xvckluZm9BY3RpdmU6IGluZm9Db2xvcnNbN10sXG4gICAgY29sb3JJbmZvVGV4dEhvdmVyOiBpbmZvQ29sb3JzWzhdLFxuICAgIGNvbG9ySW5mb1RleHQ6IGluZm9Db2xvcnNbOV0sXG4gICAgY29sb3JJbmZvVGV4dEFjdGl2ZTogaW5mb0NvbG9yc1sxMF0sXG4gICAgY29sb3JMaW5rSG92ZXI6IGxpbmtDb2xvcnNbNF0sXG4gICAgY29sb3JMaW5rOiBsaW5rQ29sb3JzWzZdLFxuICAgIGNvbG9yTGlua0FjdGl2ZTogbGlua0NvbG9yc1s3XSxcbiAgICBjb2xvckJnTWFzazogbmV3IEZhc3RDb2xvcignIzAwMCcpLnNldEEoMC40NSkudG9SZ2JTdHJpbmcoKSxcbiAgICBjb2xvcldoaXRlOiAnI2ZmZidcbiAgfSk7XG59IiwgImNvbnN0IGdlblJhZGl1cyA9IHJhZGl1c0Jhc2UgPT4ge1xuICBsZXQgcmFkaXVzTEcgPSByYWRpdXNCYXNlO1xuICBsZXQgcmFkaXVzU00gPSByYWRpdXNCYXNlO1xuICBsZXQgcmFkaXVzWFMgPSByYWRpdXNCYXNlO1xuICBsZXQgcmFkaXVzT3V0ZXIgPSByYWRpdXNCYXNlO1xuICAvLyByYWRpdXNMR1xuICBpZiAocmFkaXVzQmFzZSA8IDYgJiYgcmFkaXVzQmFzZSA+PSA1KSB7XG4gICAgcmFkaXVzTEcgPSByYWRpdXNCYXNlICsgMTtcbiAgfSBlbHNlIGlmIChyYWRpdXNCYXNlIDwgMTYgJiYgcmFkaXVzQmFzZSA+PSA2KSB7XG4gICAgcmFkaXVzTEcgPSByYWRpdXNCYXNlICsgMjtcbiAgfSBlbHNlIGlmIChyYWRpdXNCYXNlID49IDE2KSB7XG4gICAgcmFkaXVzTEcgPSAxNjtcbiAgfVxuICAvLyByYWRpdXNTTVxuICBpZiAocmFkaXVzQmFzZSA8IDcgJiYgcmFkaXVzQmFzZSA+PSA1KSB7XG4gICAgcmFkaXVzU00gPSA0O1xuICB9IGVsc2UgaWYgKHJhZGl1c0Jhc2UgPCA4ICYmIHJhZGl1c0Jhc2UgPj0gNykge1xuICAgIHJhZGl1c1NNID0gNTtcbiAgfSBlbHNlIGlmIChyYWRpdXNCYXNlIDwgMTQgJiYgcmFkaXVzQmFzZSA+PSA4KSB7XG4gICAgcmFkaXVzU00gPSA2O1xuICB9IGVsc2UgaWYgKHJhZGl1c0Jhc2UgPCAxNiAmJiByYWRpdXNCYXNlID49IDE0KSB7XG4gICAgcmFkaXVzU00gPSA3O1xuICB9IGVsc2UgaWYgKHJhZGl1c0Jhc2UgPj0gMTYpIHtcbiAgICByYWRpdXNTTSA9IDg7XG4gIH1cbiAgLy8gcmFkaXVzWFNcbiAgaWYgKHJhZGl1c0Jhc2UgPCA2ICYmIHJhZGl1c0Jhc2UgPj0gMikge1xuICAgIHJhZGl1c1hTID0gMTtcbiAgfSBlbHNlIGlmIChyYWRpdXNCYXNlID49IDYpIHtcbiAgICByYWRpdXNYUyA9IDI7XG4gIH1cbiAgLy8gcmFkaXVzT3V0ZXJcbiAgaWYgKHJhZGl1c0Jhc2UgPiA0ICYmIHJhZGl1c0Jhc2UgPCA4KSB7XG4gICAgcmFkaXVzT3V0ZXIgPSA0O1xuICB9IGVsc2UgaWYgKHJhZGl1c0Jhc2UgPj0gOCkge1xuICAgIHJhZGl1c091dGVyID0gNjtcbiAgfVxuICByZXR1cm4ge1xuICAgIGJvcmRlclJhZGl1czogcmFkaXVzQmFzZSxcbiAgICBib3JkZXJSYWRpdXNYUzogcmFkaXVzWFMsXG4gICAgYm9yZGVyUmFkaXVzU006IHJhZGl1c1NNLFxuICAgIGJvcmRlclJhZGl1c0xHOiByYWRpdXNMRyxcbiAgICBib3JkZXJSYWRpdXNPdXRlcjogcmFkaXVzT3V0ZXJcbiAgfTtcbn07XG5leHBvcnQgZGVmYXVsdCBnZW5SYWRpdXM7IiwgImltcG9ydCBnZW5SYWRpdXMgZnJvbSAnLi9nZW5SYWRpdXMnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2VuQ29tbW9uTWFwVG9rZW4odG9rZW4pIHtcbiAgY29uc3Qge1xuICAgIG1vdGlvblVuaXQsXG4gICAgbW90aW9uQmFzZSxcbiAgICBib3JkZXJSYWRpdXMsXG4gICAgbGluZVdpZHRoXG4gIH0gPSB0b2tlbjtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe1xuICAgIC8vIG1vdGlvblxuICAgIG1vdGlvbkR1cmF0aW9uRmFzdDogYCR7KG1vdGlvbkJhc2UgKyBtb3Rpb25Vbml0KS50b0ZpeGVkKDEpfXNgLFxuICAgIG1vdGlvbkR1cmF0aW9uTWlkOiBgJHsobW90aW9uQmFzZSArIG1vdGlvblVuaXQgKiAyKS50b0ZpeGVkKDEpfXNgLFxuICAgIG1vdGlvbkR1cmF0aW9uU2xvdzogYCR7KG1vdGlvbkJhc2UgKyBtb3Rpb25Vbml0ICogMykudG9GaXhlZCgxKX1zYCxcbiAgICAvLyBsaW5lXG4gICAgbGluZVdpZHRoQm9sZDogbGluZVdpZHRoICsgMVxuICB9LCBnZW5SYWRpdXMoYm9yZGVyUmFkaXVzKSk7XG59IiwgImNvbnN0IGdlbkNvbnRyb2xIZWlnaHQgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb250cm9sSGVpZ2h0XG4gIH0gPSB0b2tlbjtcbiAgcmV0dXJuIHtcbiAgICBjb250cm9sSGVpZ2h0U006IGNvbnRyb2xIZWlnaHQgKiAwLjc1LFxuICAgIGNvbnRyb2xIZWlnaHRYUzogY29udHJvbEhlaWdodCAqIDAuNSxcbiAgICBjb250cm9sSGVpZ2h0TEc6IGNvbnRyb2xIZWlnaHQgKiAxLjI1XG4gIH07XG59O1xuZXhwb3J0IGRlZmF1bHQgZ2VuQ29udHJvbEhlaWdodDsiLCAiZXhwb3J0IGZ1bmN0aW9uIGdldExpbmVIZWlnaHQoZm9udFNpemUpIHtcbiAgcmV0dXJuIChmb250U2l6ZSArIDgpIC8gZm9udFNpemU7XG59XG4vLyBodHRwczovL3podWFubGFuLnpoaWh1LmNvbS9wLzMyNzQ2ODEwXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRGb250U2l6ZXMoYmFzZSkge1xuICBjb25zdCBmb250U2l6ZXMgPSBBcnJheS5mcm9tKHtcbiAgICBsZW5ndGg6IDEwXG4gIH0pLm1hcCgoXywgaW5kZXgpID0+IHtcbiAgICBjb25zdCBpID0gaW5kZXggLSAxO1xuICAgIGNvbnN0IGJhc2VTaXplID0gYmFzZSAqIE1hdGgucG93KE1hdGguRSwgaSAvIDUpO1xuICAgIGNvbnN0IGludFNpemUgPSBpbmRleCA+IDEgPyBNYXRoLmZsb29yKGJhc2VTaXplKSA6IE1hdGguY2VpbChiYXNlU2l6ZSk7XG4gICAgLy8gQ29udmVydCB0byBldmVuXG4gICAgcmV0dXJuIE1hdGguZmxvb3IoaW50U2l6ZSAvIDIpICogMjtcbiAgfSk7XG4gIGZvbnRTaXplc1sxXSA9IGJhc2U7XG4gIHJldHVybiBmb250U2l6ZXMubWFwKHNpemUgPT4gKHtcbiAgICBzaXplLFxuICAgIGxpbmVIZWlnaHQ6IGdldExpbmVIZWlnaHQoc2l6ZSlcbiAgfSkpO1xufSIsICJpbXBvcnQgZ2VuRm9udFNpemVzIGZyb20gJy4vZ2VuRm9udFNpemVzJztcbmNvbnN0IGdlbkZvbnRNYXBUb2tlbiA9IGZvbnRTaXplID0+IHtcbiAgY29uc3QgZm9udFNpemVQYWlycyA9IGdlbkZvbnRTaXplcyhmb250U2l6ZSk7XG4gIGNvbnN0IGZvbnRTaXplcyA9IGZvbnRTaXplUGFpcnMubWFwKHBhaXIgPT4gcGFpci5zaXplKTtcbiAgY29uc3QgbGluZUhlaWdodHMgPSBmb250U2l6ZVBhaXJzLm1hcChwYWlyID0+IHBhaXIubGluZUhlaWdodCk7XG4gIGNvbnN0IGZvbnRTaXplTUQgPSBmb250U2l6ZXNbMV07XG4gIGNvbnN0IGZvbnRTaXplU00gPSBmb250U2l6ZXNbMF07XG4gIGNvbnN0IGZvbnRTaXplTEcgPSBmb250U2l6ZXNbMl07XG4gIGNvbnN0IGxpbmVIZWlnaHQgPSBsaW5lSGVpZ2h0c1sxXTtcbiAgY29uc3QgbGluZUhlaWdodFNNID0gbGluZUhlaWdodHNbMF07XG4gIGNvbnN0IGxpbmVIZWlnaHRMRyA9IGxpbmVIZWlnaHRzWzJdO1xuICByZXR1cm4ge1xuICAgIGZvbnRTaXplU00sXG4gICAgZm9udFNpemU6IGZvbnRTaXplTUQsXG4gICAgZm9udFNpemVMRyxcbiAgICBmb250U2l6ZVhMOiBmb250U2l6ZXNbM10sXG4gICAgZm9udFNpemVIZWFkaW5nMTogZm9udFNpemVzWzZdLFxuICAgIGZvbnRTaXplSGVhZGluZzI6IGZvbnRTaXplc1s1XSxcbiAgICBmb250U2l6ZUhlYWRpbmczOiBmb250U2l6ZXNbNF0sXG4gICAgZm9udFNpemVIZWFkaW5nNDogZm9udFNpemVzWzNdLFxuICAgIGZvbnRTaXplSGVhZGluZzU6IGZvbnRTaXplc1syXSxcbiAgICBsaW5lSGVpZ2h0LFxuICAgIGxpbmVIZWlnaHRMRyxcbiAgICBsaW5lSGVpZ2h0U00sXG4gICAgZm9udEhlaWdodDogTWF0aC5yb3VuZChsaW5lSGVpZ2h0ICogZm9udFNpemVNRCksXG4gICAgZm9udEhlaWdodExHOiBNYXRoLnJvdW5kKGxpbmVIZWlnaHRMRyAqIGZvbnRTaXplTEcpLFxuICAgIGZvbnRIZWlnaHRTTTogTWF0aC5yb3VuZChsaW5lSGVpZ2h0U00gKiBmb250U2l6ZVNNKSxcbiAgICBsaW5lSGVpZ2h0SGVhZGluZzE6IGxpbmVIZWlnaHRzWzZdLFxuICAgIGxpbmVIZWlnaHRIZWFkaW5nMjogbGluZUhlaWdodHNbNV0sXG4gICAgbGluZUhlaWdodEhlYWRpbmczOiBsaW5lSGVpZ2h0c1s0XSxcbiAgICBsaW5lSGVpZ2h0SGVhZGluZzQ6IGxpbmVIZWlnaHRzWzNdLFxuICAgIGxpbmVIZWlnaHRIZWFkaW5nNTogbGluZUhlaWdodHNbMl1cbiAgfTtcbn07XG5leHBvcnQgZGVmYXVsdCBnZW5Gb250TWFwVG9rZW47IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdlblNpemVNYXBUb2tlbih0b2tlbikge1xuICBjb25zdCB7XG4gICAgc2l6ZVVuaXQsXG4gICAgc2l6ZVN0ZXBcbiAgfSA9IHRva2VuO1xuICByZXR1cm4ge1xuICAgIHNpemVYWEw6IHNpemVVbml0ICogKHNpemVTdGVwICsgOCksXG4gICAgLy8gNDhcbiAgICBzaXplWEw6IHNpemVVbml0ICogKHNpemVTdGVwICsgNCksXG4gICAgLy8gMzJcbiAgICBzaXplTEc6IHNpemVVbml0ICogKHNpemVTdGVwICsgMiksXG4gICAgLy8gMjRcbiAgICBzaXplTUQ6IHNpemVVbml0ICogKHNpemVTdGVwICsgMSksXG4gICAgLy8gMjBcbiAgICBzaXplTVM6IHNpemVVbml0ICogc2l6ZVN0ZXAsXG4gICAgLy8gMTZcbiAgICBzaXplOiBzaXplVW5pdCAqIHNpemVTdGVwLFxuICAgIC8vIDE2XG4gICAgc2l6ZVNNOiBzaXplVW5pdCAqIChzaXplU3RlcCAtIDEpLFxuICAgIC8vIDEyXG4gICAgc2l6ZVhTOiBzaXplVW5pdCAqIChzaXplU3RlcCAtIDIpLFxuICAgIC8vIDhcbiAgICBzaXplWFhTOiBzaXplVW5pdCAqIChzaXplU3RlcCAtIDMpIC8vIDRcbiAgfTtcbn0iLCAiaW1wb3J0IHsgRmFzdENvbG9yIH0gZnJvbSAnQGFudC1kZXNpZ24vZmFzdC1jb2xvcic7XG5leHBvcnQgY29uc3QgZ2V0QWxwaGFDb2xvciA9IChiYXNlQ29sb3IsIGFscGhhKSA9PiBuZXcgRmFzdENvbG9yKGJhc2VDb2xvcikuc2V0QShhbHBoYSkudG9SZ2JTdHJpbmcoKTtcbmV4cG9ydCBjb25zdCBnZXRTb2xpZENvbG9yID0gKGJhc2VDb2xvciwgYnJpZ2h0bmVzcykgPT4ge1xuICBjb25zdCBpbnN0YW5jZSA9IG5ldyBGYXN0Q29sb3IoYmFzZUNvbG9yKTtcbiAgcmV0dXJuIGluc3RhbmNlLmRhcmtlbihicmlnaHRuZXNzKS50b0hleFN0cmluZygpO1xufTsiLCAiaW1wb3J0IHsgZ2VuZXJhdGUgfSBmcm9tICdAYW50LWRlc2lnbi9jb2xvcnMnO1xuaW1wb3J0IHsgZ2V0QWxwaGFDb2xvciwgZ2V0U29saWRDb2xvciB9IGZyb20gJy4vY29sb3JBbGdvcml0aG0nO1xuZXhwb3J0IGNvbnN0IGdlbmVyYXRlQ29sb3JQYWxldHRlcyA9IGJhc2VDb2xvciA9PiB7XG4gIGNvbnN0IGNvbG9ycyA9IGdlbmVyYXRlKGJhc2VDb2xvcik7XG4gIHJldHVybiB7XG4gICAgMTogY29sb3JzWzBdLFxuICAgIDI6IGNvbG9yc1sxXSxcbiAgICAzOiBjb2xvcnNbMl0sXG4gICAgNDogY29sb3JzWzNdLFxuICAgIDU6IGNvbG9yc1s0XSxcbiAgICA2OiBjb2xvcnNbNV0sXG4gICAgNzogY29sb3JzWzZdLFxuICAgIDg6IGNvbG9yc1s0XSxcbiAgICA5OiBjb2xvcnNbNV0sXG4gICAgMTA6IGNvbG9yc1s2XVxuICAgIC8vIDg6IGNvbG9yc1s3XSxcbiAgICAvLyA5OiBjb2xvcnNbOF0sXG4gICAgLy8gMTA6IGNvbG9yc1s5XSxcbiAgfTtcbn07XG5leHBvcnQgY29uc3QgZ2VuZXJhdGVOZXV0cmFsQ29sb3JQYWxldHRlcyA9IChiZ0Jhc2VDb2xvciwgdGV4dEJhc2VDb2xvcikgPT4ge1xuICBjb25zdCBjb2xvckJnQmFzZSA9IGJnQmFzZUNvbG9yIHx8ICcjZmZmJztcbiAgY29uc3QgY29sb3JUZXh0QmFzZSA9IHRleHRCYXNlQ29sb3IgfHwgJyMwMDAnO1xuICByZXR1cm4ge1xuICAgIGNvbG9yQmdCYXNlLFxuICAgIGNvbG9yVGV4dEJhc2UsXG4gICAgY29sb3JUZXh0OiBnZXRBbHBoYUNvbG9yKGNvbG9yVGV4dEJhc2UsIDAuODgpLFxuICAgIGNvbG9yVGV4dFNlY29uZGFyeTogZ2V0QWxwaGFDb2xvcihjb2xvclRleHRCYXNlLCAwLjY1KSxcbiAgICBjb2xvclRleHRUZXJ0aWFyeTogZ2V0QWxwaGFDb2xvcihjb2xvclRleHRCYXNlLCAwLjQ1KSxcbiAgICBjb2xvclRleHRRdWF0ZXJuYXJ5OiBnZXRBbHBoYUNvbG9yKGNvbG9yVGV4dEJhc2UsIDAuMjUpLFxuICAgIGNvbG9yRmlsbDogZ2V0QWxwaGFDb2xvcihjb2xvclRleHRCYXNlLCAwLjE1KSxcbiAgICBjb2xvckZpbGxTZWNvbmRhcnk6IGdldEFscGhhQ29sb3IoY29sb3JUZXh0QmFzZSwgMC4wNiksXG4gICAgY29sb3JGaWxsVGVydGlhcnk6IGdldEFscGhhQ29sb3IoY29sb3JUZXh0QmFzZSwgMC4wNCksXG4gICAgY29sb3JGaWxsUXVhdGVybmFyeTogZ2V0QWxwaGFDb2xvcihjb2xvclRleHRCYXNlLCAwLjAyKSxcbiAgICBjb2xvckJnU29saWQ6IGdldEFscGhhQ29sb3IoY29sb3JUZXh0QmFzZSwgMSksXG4gICAgY29sb3JCZ1NvbGlkSG92ZXI6IGdldEFscGhhQ29sb3IoY29sb3JUZXh0QmFzZSwgMC43NSksXG4gICAgY29sb3JCZ1NvbGlkQWN0aXZlOiBnZXRBbHBoYUNvbG9yKGNvbG9yVGV4dEJhc2UsIDAuOTUpLFxuICAgIGNvbG9yQmdMYXlvdXQ6IGdldFNvbGlkQ29sb3IoY29sb3JCZ0Jhc2UsIDQpLFxuICAgIGNvbG9yQmdDb250YWluZXI6IGdldFNvbGlkQ29sb3IoY29sb3JCZ0Jhc2UsIDApLFxuICAgIGNvbG9yQmdFbGV2YXRlZDogZ2V0U29saWRDb2xvcihjb2xvckJnQmFzZSwgMCksXG4gICAgY29sb3JCZ1Nwb3RsaWdodDogZ2V0QWxwaGFDb2xvcihjb2xvclRleHRCYXNlLCAwLjg1KSxcbiAgICBjb2xvckJnQmx1cjogJ3RyYW5zcGFyZW50JyxcbiAgICBjb2xvckJvcmRlcjogZ2V0U29saWRDb2xvcihjb2xvckJnQmFzZSwgMTUpLFxuICAgIGNvbG9yQm9yZGVyU2Vjb25kYXJ5OiBnZXRTb2xpZENvbG9yKGNvbG9yQmdCYXNlLCA2KVxuICB9O1xufTsiLCAiaW1wb3J0IHsgZ2VuZXJhdGUsIHByZXNldFBhbGV0dGVzLCBwcmVzZXRQcmltYXJ5Q29sb3JzIH0gZnJvbSAnQGFudC1kZXNpZ24vY29sb3JzJztcbmltcG9ydCB7IGRlZmF1bHRQcmVzZXRDb2xvcnMgfSBmcm9tICcuLi9zZWVkJztcbmltcG9ydCBnZW5Db2xvck1hcFRva2VuIGZyb20gJy4uL3NoYXJlZC9nZW5Db2xvck1hcFRva2VuJztcbmltcG9ydCBnZW5Db21tb25NYXBUb2tlbiBmcm9tICcuLi9zaGFyZWQvZ2VuQ29tbW9uTWFwVG9rZW4nO1xuaW1wb3J0IGdlbkNvbnRyb2xIZWlnaHQgZnJvbSAnLi4vc2hhcmVkL2dlbkNvbnRyb2xIZWlnaHQnO1xuaW1wb3J0IGdlbkZvbnRNYXBUb2tlbiBmcm9tICcuLi9zaGFyZWQvZ2VuRm9udE1hcFRva2VuJztcbmltcG9ydCBnZW5TaXplTWFwVG9rZW4gZnJvbSAnLi4vc2hhcmVkL2dlblNpemVNYXBUb2tlbic7XG5pbXBvcnQgeyBnZW5lcmF0ZUNvbG9yUGFsZXR0ZXMsIGdlbmVyYXRlTmV1dHJhbENvbG9yUGFsZXR0ZXMgfSBmcm9tICcuL2NvbG9ycyc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZXJpdmF0aXZlKHRva2VuKSB7XG4gIC8vIHBpbmsgaXMgZGVwcmVjYXRlZCBuYW1lIG9mIG1hZ2VudGEsIGtlZXAgdGhpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgcHJlc2V0UHJpbWFyeUNvbG9ycy5waW5rID0gcHJlc2V0UHJpbWFyeUNvbG9ycy5tYWdlbnRhO1xuICBwcmVzZXRQYWxldHRlcy5waW5rID0gcHJlc2V0UGFsZXR0ZXMubWFnZW50YTtcbiAgY29uc3QgY29sb3JQYWxldHRlcyA9IE9iamVjdC5rZXlzKGRlZmF1bHRQcmVzZXRDb2xvcnMpLm1hcChjb2xvcktleSA9PiB7XG4gICAgY29uc3QgY29sb3JzID0gdG9rZW5bY29sb3JLZXldID09PSBwcmVzZXRQcmltYXJ5Q29sb3JzW2NvbG9yS2V5XSA/IHByZXNldFBhbGV0dGVzW2NvbG9yS2V5XSA6IGdlbmVyYXRlKHRva2VuW2NvbG9yS2V5XSk7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oe1xuICAgICAgbGVuZ3RoOiAxMFxuICAgIH0sICgpID0+IDEpLnJlZHVjZSgocHJldiwgXywgaSkgPT4ge1xuICAgICAgcHJldltgJHtjb2xvcktleX0tJHtpICsgMX1gXSA9IGNvbG9yc1tpXTtcbiAgICAgIHByZXZbYCR7Y29sb3JLZXl9JHtpICsgMX1gXSA9IGNvbG9yc1tpXTtcbiAgICAgIHJldHVybiBwcmV2O1xuICAgIH0sIHt9KTtcbiAgfSkucmVkdWNlKChwcmV2LCBjdXIpID0+IHtcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS9ub1BhcmFtZXRlckFzc2lnbjogaXQgaXMgYSByZWR1Y2VcbiAgICBwcmV2ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgY3VyKTtcbiAgICByZXR1cm4gcHJldjtcbiAgfSwge30pO1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdG9rZW4pLCBjb2xvclBhbGV0dGVzKSwgZ2VuQ29sb3JNYXBUb2tlbih0b2tlbiwge1xuICAgIGdlbmVyYXRlQ29sb3JQYWxldHRlcyxcbiAgICBnZW5lcmF0ZU5ldXRyYWxDb2xvclBhbGV0dGVzXG4gIH0pKSwgZ2VuRm9udE1hcFRva2VuKHRva2VuLmZvbnRTaXplKSksIGdlblNpemVNYXBUb2tlbih0b2tlbikpLCBnZW5Db250cm9sSGVpZ2h0KHRva2VuKSksIGdlbkNvbW1vbk1hcFRva2VuKHRva2VuKSk7XG59IiwgImltcG9ydCB7IGNyZWF0ZVRoZW1lIH0gZnJvbSAnQGFudC1kZXNpZ24vY3NzaW5qcyc7XG5pbXBvcnQgZGVmYXVsdERlcml2YXRpdmUgZnJvbSAnLi9pbmRleCc7XG5jb25zdCBkZWZhdWx0VGhlbWUgPSBjcmVhdGVUaGVtZShkZWZhdWx0RGVyaXZhdGl2ZSk7XG5leHBvcnQgZGVmYXVsdCBkZWZhdWx0VGhlbWU7IiwgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCBjb25zdCBkZWZhdWx0UHJlZml4Q2xzID0gJ2FudCc7XG5leHBvcnQgY29uc3QgZGVmYXVsdEljb25QcmVmaXhDbHMgPSAnYW50aWNvbic7XG5leHBvcnQgY29uc3QgVmFyaWFudHMgPSBbJ291dGxpbmVkJywgJ2JvcmRlcmxlc3MnLCAnZmlsbGVkJywgJ3VuZGVybGluZWQnXTtcbmNvbnN0IGRlZmF1bHRHZXRQcmVmaXhDbHMgPSAoc3VmZml4Q2xzLCBjdXN0b21pemVQcmVmaXhDbHMpID0+IHtcbiAgaWYgKGN1c3RvbWl6ZVByZWZpeENscykge1xuICAgIHJldHVybiBjdXN0b21pemVQcmVmaXhDbHM7XG4gIH1cbiAgcmV0dXJuIHN1ZmZpeENscyA/IGAke2RlZmF1bHRQcmVmaXhDbHN9LSR7c3VmZml4Q2xzfWAgOiBkZWZhdWx0UHJlZml4Q2xzO1xufTtcbi8vIHpvbWJpZUo6IFx1RDgzRFx1REVBOCBEbyBub3QgcGFzcyBgZGVmYXVsdFJlbmRlckVtcHR5YCBoZXJlIHNpbmNlIGl0IHdpbGwgY2F1c2UgY2lyY3VsYXIgZGVwZW5kZW5jeS5cbmV4cG9ydCBjb25zdCBDb25maWdDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQoe1xuICAvLyBXZSBwcm92aWRlIGEgZGVmYXVsdCBmdW5jdGlvbiBmb3IgQ29udGV4dCB3aXRob3V0IHByb3ZpZGVyXG4gIGdldFByZWZpeENsczogZGVmYXVsdEdldFByZWZpeENscyxcbiAgaWNvblByZWZpeENsczogZGVmYXVsdEljb25QcmVmaXhDbHNcbn0pO1xuZXhwb3J0IGNvbnN0IHtcbiAgQ29uc3VtZXI6IENvbmZpZ0NvbnN1bWVyXG59ID0gQ29uZmlnQ29udGV4dDtcbmNvbnN0IEVNUFRZX09CSkVDVCA9IHt9O1xuLyoqXG4gKiBHZXQgQ29uZmlnUHJvdmlkZXIgY29uZmlndXJlZCBjb21wb25lbnQgcHJvcHMuXG4gKiBUaGlzIGhlbHAgdG8gcmVkdWNlIGJ1bmRsZSBzaXplIGZvciBzYXZpbmcgYD8uYCBvcGVyYXRvci5cbiAqIERvIG5vdCB1c2UgYXMgYHVzZU1lbW9gIGRlcHMgc2luY2Ugd2UgZG8gbm90IGNhY2hlIHRoZSBvYmplY3QgaGVyZS5cbiAqXG4gKiBOT1RFOiBub3QgcmVmYWN0b3IgdGhpcyB3aXRoIGB1c2VNZW1vYCBzaW5jZSBtZW1vIHdpbGwgY29zdCBhbm90aGVyIG1lbW9yeSBzcGFjZSxcbiAqIHdoaWNoIHdpbGwgd2FzdGUgYm90aCBjb21wYXJlIGNhbGN1bGF0aW9uICYgbWVtb3J5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQ29tcG9uZW50Q29uZmlnKHByb3BOYW1lKSB7XG4gIGNvbnN0IGNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpO1xuICBjb25zdCB7XG4gICAgZ2V0UHJlZml4Q2xzLFxuICAgIGRpcmVjdGlvbixcbiAgICBnZXRQb3B1cENvbnRhaW5lclxuICB9ID0gY29udGV4dDtcbiAgY29uc3QgcHJvcFZhbHVlID0gY29udGV4dFtwcm9wTmFtZV07XG4gIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe1xuICAgIGNsYXNzTmFtZXM6IEVNUFRZX09CSkVDVCxcbiAgICBzdHlsZXM6IEVNUFRZX09CSkVDVFxuICB9LCBwcm9wVmFsdWUpLCB7XG4gICAgZ2V0UHJlZml4Q2xzLFxuICAgIGRpcmVjdGlvbixcbiAgICBnZXRQb3B1cENvbnRhaW5lclxuICB9KTtcbn0iLCAiaW1wb3J0IHsgZ2VuZXJhdGUgfSBmcm9tICdAYW50LWRlc2lnbi9jb2xvcnMnO1xuaW1wb3J0IHsgRmFzdENvbG9yIH0gZnJvbSAnQGFudC1kZXNpZ24vZmFzdC1jb2xvcic7XG5pbXBvcnQgY2FuVXNlRG9tIGZyb20gXCJyYy11dGlsL2VzL0RvbS9jYW5Vc2VEb21cIjtcbmltcG9ydCB7IHVwZGF0ZUNTUyB9IGZyb20gXCJyYy11dGlsL2VzL0RvbS9keW5hbWljQ1NTXCI7XG5pbXBvcnQgd2FybmluZyBmcm9tICcuLi9fdXRpbC93YXJuaW5nJztcbmNvbnN0IGR5bmFtaWNTdHlsZU1hcmsgPSBgLWFudC0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKX1gO1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0eWxlKGdsb2JhbFByZWZpeENscywgdGhlbWUpIHtcbiAgY29uc3QgdmFyaWFibGVzID0ge307XG4gIGNvbnN0IGZvcm1hdENvbG9yID0gKGNvbG9yLCB1cGRhdGVyKSA9PiB7XG4gICAgbGV0IGNsb25lID0gY29sb3IuY2xvbmUoKTtcbiAgICBjbG9uZSA9ICh1cGRhdGVyID09PSBudWxsIHx8IHVwZGF0ZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHVwZGF0ZXIoY2xvbmUpKSB8fCBjbG9uZTtcbiAgICByZXR1cm4gY2xvbmUudG9SZ2JTdHJpbmcoKTtcbiAgfTtcbiAgY29uc3QgZmlsbENvbG9yID0gKGNvbG9yVmFsLCB0eXBlKSA9PiB7XG4gICAgY29uc3QgYmFzZUNvbG9yID0gbmV3IEZhc3RDb2xvcihjb2xvclZhbCk7XG4gICAgY29uc3QgY29sb3JQYWxldHRlcyA9IGdlbmVyYXRlKGJhc2VDb2xvci50b1JnYlN0cmluZygpKTtcbiAgICB2YXJpYWJsZXNbYCR7dHlwZX0tY29sb3JgXSA9IGZvcm1hdENvbG9yKGJhc2VDb2xvcik7XG4gICAgdmFyaWFibGVzW2Ake3R5cGV9LWNvbG9yLWRpc2FibGVkYF0gPSBjb2xvclBhbGV0dGVzWzFdO1xuICAgIHZhcmlhYmxlc1tgJHt0eXBlfS1jb2xvci1ob3ZlcmBdID0gY29sb3JQYWxldHRlc1s0XTtcbiAgICB2YXJpYWJsZXNbYCR7dHlwZX0tY29sb3ItYWN0aXZlYF0gPSBjb2xvclBhbGV0dGVzWzZdO1xuICAgIHZhcmlhYmxlc1tgJHt0eXBlfS1jb2xvci1vdXRsaW5lYF0gPSBiYXNlQ29sb3IuY2xvbmUoKS5zZXRBKDAuMikudG9SZ2JTdHJpbmcoKTtcbiAgICB2YXJpYWJsZXNbYCR7dHlwZX0tY29sb3ItZGVwcmVjYXRlZC1iZ2BdID0gY29sb3JQYWxldHRlc1swXTtcbiAgICB2YXJpYWJsZXNbYCR7dHlwZX0tY29sb3ItZGVwcmVjYXRlZC1ib3JkZXJgXSA9IGNvbG9yUGFsZXR0ZXNbMl07XG4gIH07XG4gIC8vID09PT09PT09PT09PT09PT0gUHJpbWFyeSBDb2xvciA9PT09PT09PT09PT09PT09XG4gIGlmICh0aGVtZS5wcmltYXJ5Q29sb3IpIHtcbiAgICBmaWxsQ29sb3IodGhlbWUucHJpbWFyeUNvbG9yLCAncHJpbWFyeScpO1xuICAgIGNvbnN0IHByaW1hcnlDb2xvciA9IG5ldyBGYXN0Q29sb3IodGhlbWUucHJpbWFyeUNvbG9yKTtcbiAgICBjb25zdCBwcmltYXJ5Q29sb3JzID0gZ2VuZXJhdGUocHJpbWFyeUNvbG9yLnRvUmdiU3RyaW5nKCkpO1xuICAgIC8vIExlZ2FjeSAtIFdlIHNob3VsZCB1c2Ugc2VtYW50aWMgbmFtaW5nIHN0YW5kYXJkXG4gICAgcHJpbWFyeUNvbG9ycy5mb3JFYWNoKChjb2xvciwgaW5kZXgpID0+IHtcbiAgICAgIHZhcmlhYmxlc1tgcHJpbWFyeS0ke2luZGV4ICsgMX1gXSA9IGNvbG9yO1xuICAgIH0pO1xuICAgIC8vIERlcHJlY2F0ZWRcbiAgICB2YXJpYWJsZXNbJ3ByaW1hcnktY29sb3ItZGVwcmVjYXRlZC1sLTM1J10gPSBmb3JtYXRDb2xvcihwcmltYXJ5Q29sb3IsIGMgPT4gYy5saWdodGVuKDM1KSk7XG4gICAgdmFyaWFibGVzWydwcmltYXJ5LWNvbG9yLWRlcHJlY2F0ZWQtbC0yMCddID0gZm9ybWF0Q29sb3IocHJpbWFyeUNvbG9yLCBjID0+IGMubGlnaHRlbigyMCkpO1xuICAgIHZhcmlhYmxlc1sncHJpbWFyeS1jb2xvci1kZXByZWNhdGVkLXQtMjAnXSA9IGZvcm1hdENvbG9yKHByaW1hcnlDb2xvciwgYyA9PiBjLnRpbnQoMjApKTtcbiAgICB2YXJpYWJsZXNbJ3ByaW1hcnktY29sb3ItZGVwcmVjYXRlZC10LTUwJ10gPSBmb3JtYXRDb2xvcihwcmltYXJ5Q29sb3IsIGMgPT4gYy50aW50KDUwKSk7XG4gICAgdmFyaWFibGVzWydwcmltYXJ5LWNvbG9yLWRlcHJlY2F0ZWQtZi0xMiddID0gZm9ybWF0Q29sb3IocHJpbWFyeUNvbG9yLCBjID0+IGMuc2V0QShjLmEgKiAwLjEyKSk7XG4gICAgY29uc3QgcHJpbWFyeUFjdGl2ZUNvbG9yID0gbmV3IEZhc3RDb2xvcihwcmltYXJ5Q29sb3JzWzBdKTtcbiAgICB2YXJpYWJsZXNbJ3ByaW1hcnktY29sb3ItYWN0aXZlLWRlcHJlY2F0ZWQtZi0zMCddID0gZm9ybWF0Q29sb3IocHJpbWFyeUFjdGl2ZUNvbG9yLCBjID0+IGMuc2V0QShjLmEgKiAwLjMpKTtcbiAgICB2YXJpYWJsZXNbJ3ByaW1hcnktY29sb3ItYWN0aXZlLWRlcHJlY2F0ZWQtZC0wMiddID0gZm9ybWF0Q29sb3IocHJpbWFyeUFjdGl2ZUNvbG9yLCBjID0+IGMuZGFya2VuKDIpKTtcbiAgfVxuICAvLyA9PT09PT09PT09PT09PT09IFN1Y2Nlc3MgQ29sb3IgPT09PT09PT09PT09PT09PVxuICBpZiAodGhlbWUuc3VjY2Vzc0NvbG9yKSB7XG4gICAgZmlsbENvbG9yKHRoZW1lLnN1Y2Nlc3NDb2xvciwgJ3N1Y2Nlc3MnKTtcbiAgfVxuICAvLyA9PT09PT09PT09PT09PT09IFdhcm5pbmcgQ29sb3IgPT09PT09PT09PT09PT09PVxuICBpZiAodGhlbWUud2FybmluZ0NvbG9yKSB7XG4gICAgZmlsbENvbG9yKHRoZW1lLndhcm5pbmdDb2xvciwgJ3dhcm5pbmcnKTtcbiAgfVxuICAvLyA9PT09PT09PT09PT09PT09PSBFcnJvciBDb2xvciA9PT09PT09PT09PT09PT09PVxuICBpZiAodGhlbWUuZXJyb3JDb2xvcikge1xuICAgIGZpbGxDb2xvcih0aGVtZS5lcnJvckNvbG9yLCAnZXJyb3InKTtcbiAgfVxuICAvLyA9PT09PT09PT09PT09PT09PSBJbmZvIENvbG9yID09PT09PT09PT09PT09PT09PVxuICBpZiAodGhlbWUuaW5mb0NvbG9yKSB7XG4gICAgZmlsbENvbG9yKHRoZW1lLmluZm9Db2xvciwgJ2luZm8nKTtcbiAgfVxuICAvLyBDb252ZXJ0IHRvIGNzcyB2YXJpYWJsZXNcbiAgY29uc3QgY3NzTGlzdCA9IE9iamVjdC5rZXlzKHZhcmlhYmxlcykubWFwKGtleSA9PiBgLS0ke2dsb2JhbFByZWZpeENsc30tJHtrZXl9OiAke3ZhcmlhYmxlc1trZXldfTtgKTtcbiAgcmV0dXJuIGBcbiAgOnJvb3Qge1xuICAgICR7Y3NzTGlzdC5qb2luKCdcXG4nKX1cbiAgfVxuICBgLnRyaW0oKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclRoZW1lKGdsb2JhbFByZWZpeENscywgdGhlbWUpIHtcbiAgY29uc3Qgc3R5bGUgPSBnZXRTdHlsZShnbG9iYWxQcmVmaXhDbHMsIHRoZW1lKTtcbiAgaWYgKGNhblVzZURvbSgpKSB7XG4gICAgdXBkYXRlQ1NTKHN0eWxlLCBgJHtkeW5hbWljU3R5bGVNYXJrfS1keW5hbWljLXRoZW1lYCk7XG4gIH0gZWxzZSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhmYWxzZSwgJ0NvbmZpZ1Byb3ZpZGVyJywgJ1NTUiBkbyBub3Qgc3VwcG9ydCBkeW5hbWljIHRoZW1lIHdpdGggY3NzIHZhcmlhYmxlcy4nKSA6IHZvaWQgMDtcbiAgfVxufSIsICJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuY29uc3QgRGlzYWJsZWRDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQoZmFsc2UpO1xuZXhwb3J0IGNvbnN0IERpc2FibGVkQ29udGV4dFByb3ZpZGVyID0gX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgY2hpbGRyZW4sXG4gICAgZGlzYWJsZWRcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IG9yaWdpbkRpc2FibGVkID0gUmVhY3QudXNlQ29udGV4dChEaXNhYmxlZENvbnRleHQpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRGlzYWJsZWRDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IGRpc2FibGVkICE9PSBudWxsICYmIGRpc2FibGVkICE9PSB2b2lkIDAgPyBkaXNhYmxlZCA6IG9yaWdpbkRpc2FibGVkXG4gIH0sIGNoaWxkcmVuKTtcbn07XG5leHBvcnQgZGVmYXVsdCBEaXNhYmxlZENvbnRleHQ7IiwgImltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRGlzYWJsZWRDb250ZXh0IGZyb20gJy4uL0Rpc2FibGVkQ29udGV4dCc7XG5pbXBvcnQgU2l6ZUNvbnRleHQgZnJvbSAnLi4vU2l6ZUNvbnRleHQnO1xuZnVuY3Rpb24gdXNlQ29uZmlnKCkge1xuICBjb25zdCBjb21wb25lbnREaXNhYmxlZCA9IHVzZUNvbnRleHQoRGlzYWJsZWRDb250ZXh0KTtcbiAgY29uc3QgY29tcG9uZW50U2l6ZSA9IHVzZUNvbnRleHQoU2l6ZUNvbnRleHQpO1xuICByZXR1cm4ge1xuICAgIGNvbXBvbmVudERpc2FibGVkLFxuICAgIGNvbXBvbmVudFNpemVcbiAgfTtcbn1cbmV4cG9ydCBkZWZhdWx0IHVzZUNvbmZpZzsiLCAiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmNvbnN0IFNpemVDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQodW5kZWZpbmVkKTtcbmV4cG9ydCBjb25zdCBTaXplQ29udGV4dFByb3ZpZGVyID0gX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgY2hpbGRyZW4sXG4gICAgc2l6ZVxuICB9ID0gX3JlZjtcbiAgY29uc3Qgb3JpZ2luU2l6ZSA9IFJlYWN0LnVzZUNvbnRleHQoU2l6ZUNvbnRleHQpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU2l6ZUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogc2l6ZSB8fCBvcmlnaW5TaXplXG4gIH0sIGNoaWxkcmVuKTtcbn07XG5leHBvcnQgZGVmYXVsdCBTaXplQ29udGV4dDsiLCAiaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB0b2tlbjJDU1NWYXIsIHVzZUNTU1ZhclJlZ2lzdGVyLCB1c2VTdHlsZVJlZ2lzdGVyIH0gZnJvbSAnQGFudC1kZXNpZ24vY3NzaW5qcyc7XG5pbXBvcnQgZ2VuQ2FsYyBmcm9tIFwiLi9jYWxjXCI7XG5pbXBvcnQgZ2V0Q29tcFZhclByZWZpeCBmcm9tIFwiLi9nZXRDb21wVmFyUHJlZml4XCI7XG5pbXBvcnQgZ2V0Q29tcG9uZW50VG9rZW4gZnJvbSBcIi4vZ2V0Q29tcG9uZW50VG9rZW5cIjtcbmltcG9ydCBnZXREZWZhdWx0Q29tcG9uZW50VG9rZW4gZnJvbSBcIi4vZ2V0RGVmYXVsdENvbXBvbmVudFRva2VuXCI7XG5pbXBvcnQgZ2VuTWF4TWluIGZyb20gXCIuL21heG1pblwiO1xuaW1wb3J0IHN0YXRpc3RpY1Rva2VuLCB7IG1lcmdlIGFzIG1lcmdlVG9rZW4gfSBmcm9tIFwiLi9zdGF0aXN0aWNcIjtcbmltcG9ydCB1c2VVbmlxdWVNZW1vIGZyb20gXCIuLi9fdXRpbC9ob29rcy91c2VVbmlxdWVNZW1vXCI7XG5pbXBvcnQgdXNlRGVmYXVsdENTUCBmcm9tIFwiLi4vaG9va3MvdXNlQ1NQXCI7XG5mdW5jdGlvbiBnZW5TdHlsZVV0aWxzKGNvbmZpZykge1xuICAvLyBEZXBlbmRlbmN5IGludmVyc2lvbiBmb3IgcHJlcGFyaW5nIGJhc2ljIGNvbmZpZy5cbiAgdmFyIF9jb25maWckdXNlQ1NQID0gY29uZmlnLnVzZUNTUCxcbiAgICB1c2VDU1AgPSBfY29uZmlnJHVzZUNTUCA9PT0gdm9pZCAwID8gdXNlRGVmYXVsdENTUCA6IF9jb25maWckdXNlQ1NQLFxuICAgIHVzZVRva2VuID0gY29uZmlnLnVzZVRva2VuLFxuICAgIHVzZVByZWZpeCA9IGNvbmZpZy51c2VQcmVmaXgsXG4gICAgZ2V0UmVzZXRTdHlsZXMgPSBjb25maWcuZ2V0UmVzZXRTdHlsZXMsXG4gICAgZ2V0Q29tbW9uU3R5bGUgPSBjb25maWcuZ2V0Q29tbW9uU3R5bGUsXG4gICAgZ2V0Q29tcFVuaXRsZXNzID0gY29uZmlnLmdldENvbXBVbml0bGVzcztcbiAgZnVuY3Rpb24gZ2VuU3R5bGVIb29rcyhjb21wb25lbnQsIHN0eWxlRm4sIGdldERlZmF1bHRUb2tlbiwgb3B0aW9ucykge1xuICAgIHZhciBjb21wb25lbnROYW1lID0gQXJyYXkuaXNBcnJheShjb21wb25lbnQpID8gY29tcG9uZW50WzBdIDogY29tcG9uZW50O1xuICAgIGZ1bmN0aW9uIHByZWZpeFRva2VuKGtleSkge1xuICAgICAgcmV0dXJuIFwiXCIuY29uY2F0KFN0cmluZyhjb21wb25lbnROYW1lKSkuY29uY2F0KGtleS5zbGljZSgwLCAxKS50b1VwcGVyQ2FzZSgpKS5jb25jYXQoa2V5LnNsaWNlKDEpKTtcbiAgICB9XG5cbiAgICAvLyBGaWxsIHVuaXRsZXNzXG4gICAgdmFyIG9yaWdpblVuaXRsZXNzID0gKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy51bml0bGVzcykgfHwge307XG4gICAgdmFyIG9yaWdpbkNvbXBVbml0bGVzcyA9IHR5cGVvZiBnZXRDb21wVW5pdGxlc3MgPT09ICdmdW5jdGlvbicgPyBnZXRDb21wVW5pdGxlc3MoY29tcG9uZW50KSA6IHt9O1xuICAgIHZhciBjb21wVW5pdGxlc3MgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG9yaWdpbkNvbXBVbml0bGVzcyksIHt9LCBfZGVmaW5lUHJvcGVydHkoe30sIHByZWZpeFRva2VuKCd6SW5kZXhQb3B1cCcpLCB0cnVlKSk7XG4gICAgT2JqZWN0LmtleXMob3JpZ2luVW5pdGxlc3MpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgY29tcFVuaXRsZXNzW3ByZWZpeFRva2VuKGtleSldID0gb3JpZ2luVW5pdGxlc3Nba2V5XTtcbiAgICB9KTtcblxuICAgIC8vIE9wdGlvbnNcbiAgICB2YXIgbWVyZ2VkT3B0aW9ucyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgb3B0aW9ucyksIHt9LCB7XG4gICAgICB1bml0bGVzczogY29tcFVuaXRsZXNzLFxuICAgICAgcHJlZml4VG9rZW46IHByZWZpeFRva2VuXG4gICAgfSk7XG5cbiAgICAvLyBIb29rc1xuICAgIHZhciB1c2VTdHlsZSA9IGdlbkNvbXBvbmVudFN0eWxlSG9vayhjb21wb25lbnQsIHN0eWxlRm4sIGdldERlZmF1bHRUb2tlbiwgbWVyZ2VkT3B0aW9ucyk7XG4gICAgdmFyIHVzZUNTU1ZhciA9IGdlbkNTU1ZhclJlZ2lzdGVyKGNvbXBvbmVudE5hbWUsIGdldERlZmF1bHRUb2tlbiwgbWVyZ2VkT3B0aW9ucyk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChwcmVmaXhDbHMpIHtcbiAgICAgIHZhciByb290Q2xzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBwcmVmaXhDbHM7XG4gICAgICB2YXIgX3VzZVN0eWxlID0gdXNlU3R5bGUocHJlZml4Q2xzLCByb290Q2xzKSxcbiAgICAgICAgX3VzZVN0eWxlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdHlsZSwgMiksXG4gICAgICAgIGhhc2hJZCA9IF91c2VTdHlsZTJbMV07XG4gICAgICB2YXIgX3VzZUNTU1ZhciA9IHVzZUNTU1Zhcihyb290Q2xzKSxcbiAgICAgICAgX3VzZUNTU1ZhcjIgPSBfc2xpY2VkVG9BcnJheShfdXNlQ1NTVmFyLCAyKSxcbiAgICAgICAgd3JhcENTU1ZhciA9IF91c2VDU1NWYXIyWzBdLFxuICAgICAgICBjc3NWYXJDbHMgPSBfdXNlQ1NTVmFyMlsxXTtcbiAgICAgIHJldHVybiBbd3JhcENTU1ZhciwgaGFzaElkLCBjc3NWYXJDbHNdO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gZ2VuQ1NTVmFyUmVnaXN0ZXIoY29tcG9uZW50LCBnZXREZWZhdWx0VG9rZW4sIG9wdGlvbnMpIHtcbiAgICB2YXIgY29tcFVuaXRsZXNzID0gb3B0aW9ucy51bml0bGVzcyxcbiAgICAgIF9vcHRpb25zJGluamVjdFN0eWxlID0gb3B0aW9ucy5pbmplY3RTdHlsZSxcbiAgICAgIGluamVjdFN0eWxlID0gX29wdGlvbnMkaW5qZWN0U3R5bGUgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRpbmplY3RTdHlsZSxcbiAgICAgIHByZWZpeFRva2VuID0gb3B0aW9ucy5wcmVmaXhUb2tlbixcbiAgICAgIGlnbm9yZSA9IG9wdGlvbnMuaWdub3JlO1xuICAgIHZhciBDU1NWYXJSZWdpc3RlciA9IGZ1bmN0aW9uIENTU1ZhclJlZ2lzdGVyKF9yZWYpIHtcbiAgICAgIHZhciByb290Q2xzID0gX3JlZi5yb290Q2xzLFxuICAgICAgICBfcmVmJGNzc1ZhciA9IF9yZWYuY3NzVmFyLFxuICAgICAgICBjc3NWYXIgPSBfcmVmJGNzc1ZhciA9PT0gdm9pZCAwID8ge30gOiBfcmVmJGNzc1ZhcjtcbiAgICAgIHZhciBfdXNlVG9rZW4gPSB1c2VUb2tlbigpLFxuICAgICAgICByZWFsVG9rZW4gPSBfdXNlVG9rZW4ucmVhbFRva2VuO1xuICAgICAgdXNlQ1NTVmFyUmVnaXN0ZXIoe1xuICAgICAgICBwYXRoOiBbY29tcG9uZW50XSxcbiAgICAgICAgcHJlZml4OiBjc3NWYXIucHJlZml4LFxuICAgICAgICBrZXk6IGNzc1Zhci5rZXksXG4gICAgICAgIHVuaXRsZXNzOiBjb21wVW5pdGxlc3MsXG4gICAgICAgIGlnbm9yZTogaWdub3JlLFxuICAgICAgICB0b2tlbjogcmVhbFRva2VuLFxuICAgICAgICBzY29wZTogcm9vdENsc1xuICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGVmYXVsdFRva2VuID0gZ2V0RGVmYXVsdENvbXBvbmVudFRva2VuKGNvbXBvbmVudCwgcmVhbFRva2VuLCBnZXREZWZhdWx0VG9rZW4pO1xuICAgICAgICB2YXIgY29tcG9uZW50VG9rZW4gPSBnZXRDb21wb25lbnRUb2tlbihjb21wb25lbnQsIHJlYWxUb2tlbiwgZGVmYXVsdFRva2VuLCB7XG4gICAgICAgICAgZGVwcmVjYXRlZFRva2Vuczogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmRlcHJlY2F0ZWRUb2tlbnNcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5rZXlzKGRlZmF1bHRUb2tlbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgY29tcG9uZW50VG9rZW5bcHJlZml4VG9rZW4oa2V5KV0gPSBjb21wb25lbnRUb2tlbltrZXldO1xuICAgICAgICAgIGRlbGV0ZSBjb21wb25lbnRUb2tlbltrZXldO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudFRva2VuO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIHZhciB1c2VDU1NWYXIgPSBmdW5jdGlvbiB1c2VDU1NWYXIocm9vdENscykge1xuICAgICAgdmFyIF91c2VUb2tlbjIgPSB1c2VUb2tlbigpLFxuICAgICAgICBjc3NWYXIgPSBfdXNlVG9rZW4yLmNzc1ZhcjtcbiAgICAgIHJldHVybiBbZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGluamVjdFN0eWxlICYmIGNzc1ZhciA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDU1NWYXJSZWdpc3Rlciwge1xuICAgICAgICAgIHJvb3RDbHM6IHJvb3RDbHMsXG4gICAgICAgICAgY3NzVmFyOiBjc3NWYXIsXG4gICAgICAgICAgY29tcG9uZW50OiBjb21wb25lbnRcbiAgICAgICAgfSksIG5vZGUpIDogbm9kZTtcbiAgICAgIH0sIGNzc1ZhciA9PT0gbnVsbCB8fCBjc3NWYXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNzc1Zhci5rZXldO1xuICAgIH07XG4gICAgcmV0dXJuIHVzZUNTU1ZhcjtcbiAgfVxuICBmdW5jdGlvbiBnZW5Db21wb25lbnRTdHlsZUhvb2soY29tcG9uZW50TmFtZSwgc3R5bGVGbiwgZ2V0RGVmYXVsdFRva2VuKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHt9O1xuICAgIHZhciBjZWxscyA9IEFycmF5LmlzQXJyYXkoY29tcG9uZW50TmFtZSkgPyBjb21wb25lbnROYW1lIDogW2NvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWVdO1xuICAgIHZhciBfY2VsbHMgPSBfc2xpY2VkVG9BcnJheShjZWxscywgMSksXG4gICAgICBjb21wb25lbnQgPSBfY2VsbHNbMF07XG4gICAgdmFyIGNvbmNhdENvbXBvbmVudCA9IGNlbGxzLmpvaW4oJy0nKTtcbiAgICB2YXIgbWVyZ2VkTGF5ZXIgPSBjb25maWcubGF5ZXIgfHwge1xuICAgICAgbmFtZTogJ2FudGQnXG4gICAgfTtcblxuICAgIC8vIFJldHVybiBuZXcgc3R5bGUgaG9va1xuICAgIHJldHVybiBmdW5jdGlvbiAocHJlZml4Q2xzKSB7XG4gICAgICB2YXIgcm9vdENscyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogcHJlZml4Q2xzO1xuICAgICAgdmFyIF91c2VUb2tlbjMgPSB1c2VUb2tlbigpLFxuICAgICAgICB0aGVtZSA9IF91c2VUb2tlbjMudGhlbWUsXG4gICAgICAgIHJlYWxUb2tlbiA9IF91c2VUb2tlbjMucmVhbFRva2VuLFxuICAgICAgICBoYXNoSWQgPSBfdXNlVG9rZW4zLmhhc2hJZCxcbiAgICAgICAgdG9rZW4gPSBfdXNlVG9rZW4zLnRva2VuLFxuICAgICAgICBjc3NWYXIgPSBfdXNlVG9rZW4zLmNzc1ZhcjtcbiAgICAgIHZhciBfdXNlUHJlZml4ID0gdXNlUHJlZml4KCksXG4gICAgICAgIHJvb3RQcmVmaXhDbHMgPSBfdXNlUHJlZml4LnJvb3RQcmVmaXhDbHMsXG4gICAgICAgIGljb25QcmVmaXhDbHMgPSBfdXNlUHJlZml4Lmljb25QcmVmaXhDbHM7XG4gICAgICB2YXIgY3NwID0gdXNlQ1NQKCk7XG4gICAgICB2YXIgdHlwZSA9IGNzc1ZhciA/ICdjc3MnIDogJ2pzJztcblxuICAgICAgLy8gVXNlIHVuaXF1ZSBtZW1vIHRvIHNoYXJlIHRoZSByZXN1bHQgYWNyb3NzIGFsbCBpbnN0YW5jZXNcbiAgICAgIHZhciBjYWxjID0gdXNlVW5pcXVlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB1bml0bGVzc0Nzc1ZhciA9IG5ldyBTZXQoKTtcbiAgICAgICAgaWYgKGNzc1Zhcikge1xuICAgICAgICAgIE9iamVjdC5rZXlzKG9wdGlvbnMudW5pdGxlc3MgfHwge30pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgLy8gU29tZSBjb21wb25lbnQgcHJveHkgdGhlIEFsaWFzVG9rZW4gKGUuZy4gSW1hZ2UpIGFuZCBzb21lIG5vdCAoZS5nLiBNb2RhbClcbiAgICAgICAgICAgIC8vIFdlIHNob3VsZCBib3RoIHBhc3MgaW4gYHVuaXRsZXNzQ3NzVmFyYCB0byBtYWtlIHN1cmUgdGhlIENTU1ZhciBjYW4gYmUgdW5pdGxlc3MuXG4gICAgICAgICAgICB1bml0bGVzc0Nzc1Zhci5hZGQodG9rZW4yQ1NTVmFyKGtleSwgY3NzVmFyLnByZWZpeCkpO1xuICAgICAgICAgICAgdW5pdGxlc3NDc3NWYXIuYWRkKHRva2VuMkNTU1ZhcihrZXksIGdldENvbXBWYXJQcmVmaXgoY29tcG9uZW50LCBjc3NWYXIucHJlZml4KSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnZW5DYWxjKHR5cGUsIHVuaXRsZXNzQ3NzVmFyKTtcbiAgICAgIH0sIFt0eXBlLCBjb21wb25lbnQsIGNzc1ZhciA9PT0gbnVsbCB8fCBjc3NWYXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNzc1Zhci5wcmVmaXhdKTtcbiAgICAgIHZhciBfZ2VuTWF4TWluID0gZ2VuTWF4TWluKHR5cGUpLFxuICAgICAgICBtYXggPSBfZ2VuTWF4TWluLm1heCxcbiAgICAgICAgbWluID0gX2dlbk1heE1pbi5taW47XG5cbiAgICAgIC8vIFNoYXJlZCBjb25maWdcbiAgICAgIHZhciBzaGFyZWRDb25maWcgPSB7XG4gICAgICAgIHRoZW1lOiB0aGVtZSxcbiAgICAgICAgdG9rZW46IHRva2VuLFxuICAgICAgICBoYXNoSWQ6IGhhc2hJZCxcbiAgICAgICAgbm9uY2U6IGZ1bmN0aW9uIG5vbmNlKCkge1xuICAgICAgICAgIHJldHVybiBjc3Aubm9uY2U7XG4gICAgICAgIH0sXG4gICAgICAgIGNsaWVudE9ubHk6IG9wdGlvbnMuY2xpZW50T25seSxcbiAgICAgICAgbGF5ZXI6IG1lcmdlZExheWVyLFxuICAgICAgICAvLyBhbnRkIGlzIGFsd2F5cyBhdCB0b3Agb2Ygc3R5bGVzXG4gICAgICAgIG9yZGVyOiBvcHRpb25zLm9yZGVyIHx8IC05OTlcbiAgICAgIH07XG5cbiAgICAgIC8vIFRoaXMgaWYgc3RhdGVtZW50IGlzIHNhZmUsIGFzIGl0IHdpbGwgb25seSBiZSB1c2VkIGlmIHRoZSBnZW5lcmF0b3IgaGFzIHRoZSBmdW5jdGlvbi4gSXQncyBub3QgZHluYW1pYy5cbiAgICAgIGlmICh0eXBlb2YgZ2V0UmVzZXRTdHlsZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gR2VuZXJhdGUgc3R5bGUgZm9yIGFsbCBuZWVkIHJlc2V0IHRhZ3MuXG4gICAgICAgIHVzZVN0eWxlUmVnaXN0ZXIoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzaGFyZWRDb25maWcpLCB7fSwge1xuICAgICAgICAgIGNsaWVudE9ubHk6IGZhbHNlLFxuICAgICAgICAgIHBhdGg6IFsnU2hhcmVkJywgcm9vdFByZWZpeENsc11cbiAgICAgICAgfSksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gZ2V0UmVzZXRTdHlsZXModG9rZW4sIHtcbiAgICAgICAgICAgIHByZWZpeDoge1xuICAgICAgICAgICAgICByb290UHJlZml4Q2xzOiByb290UHJlZml4Q2xzLFxuICAgICAgICAgICAgICBpY29uUHJlZml4Q2xzOiBpY29uUHJlZml4Q2xzXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY3NwOiBjc3BcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB2YXIgd3JhcFNTUiA9IHVzZVN0eWxlUmVnaXN0ZXIoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzaGFyZWRDb25maWcpLCB7fSwge1xuICAgICAgICBwYXRoOiBbY29uY2F0Q29tcG9uZW50LCBwcmVmaXhDbHMsIGljb25QcmVmaXhDbHNdXG4gICAgICB9KSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAob3B0aW9ucy5pbmplY3RTdHlsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgdmFyIF9zdGF0aXN0aWNUb2tlbiA9IHN0YXRpc3RpY1Rva2VuKHRva2VuKSxcbiAgICAgICAgICBwcm94eVRva2VuID0gX3N0YXRpc3RpY1Rva2VuLnRva2VuLFxuICAgICAgICAgIGZsdXNoID0gX3N0YXRpc3RpY1Rva2VuLmZsdXNoO1xuICAgICAgICB2YXIgZGVmYXVsdENvbXBvbmVudFRva2VuID0gZ2V0RGVmYXVsdENvbXBvbmVudFRva2VuKGNvbXBvbmVudCwgcmVhbFRva2VuLCBnZXREZWZhdWx0VG9rZW4pO1xuICAgICAgICB2YXIgY29tcG9uZW50Q2xzID0gXCIuXCIuY29uY2F0KHByZWZpeENscyk7XG4gICAgICAgIHZhciBjb21wb25lbnRUb2tlbiA9IGdldENvbXBvbmVudFRva2VuKGNvbXBvbmVudCwgcmVhbFRva2VuLCBkZWZhdWx0Q29tcG9uZW50VG9rZW4sIHtcbiAgICAgICAgICBkZXByZWNhdGVkVG9rZW5zOiBvcHRpb25zLmRlcHJlY2F0ZWRUb2tlbnNcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChjc3NWYXIgJiYgZGVmYXVsdENvbXBvbmVudFRva2VuICYmIF90eXBlb2YoZGVmYXVsdENvbXBvbmVudFRva2VuKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBPYmplY3Qua2V5cyhkZWZhdWx0Q29tcG9uZW50VG9rZW4pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgZGVmYXVsdENvbXBvbmVudFRva2VuW2tleV0gPSBcInZhcihcIi5jb25jYXQodG9rZW4yQ1NTVmFyKGtleSwgZ2V0Q29tcFZhclByZWZpeChjb21wb25lbnQsIGNzc1Zhci5wcmVmaXgpKSwgXCIpXCIpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHZhciBtZXJnZWRUb2tlbiA9IG1lcmdlVG9rZW4ocHJveHlUb2tlbiwge1xuICAgICAgICAgIGNvbXBvbmVudENsczogY29tcG9uZW50Q2xzLFxuICAgICAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgICAgIGljb25DbHM6IFwiLlwiLmNvbmNhdChpY29uUHJlZml4Q2xzKSxcbiAgICAgICAgICBhbnRDbHM6IFwiLlwiLmNvbmNhdChyb290UHJlZml4Q2xzKSxcbiAgICAgICAgICBjYWxjOiBjYWxjLFxuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBtYXg6IG1heCxcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgbWluOiBtaW5cbiAgICAgICAgfSwgY3NzVmFyID8gZGVmYXVsdENvbXBvbmVudFRva2VuIDogY29tcG9uZW50VG9rZW4pO1xuICAgICAgICB2YXIgc3R5bGVJbnRlcnBvbGF0aW9uID0gc3R5bGVGbihtZXJnZWRUb2tlbiwge1xuICAgICAgICAgIGhhc2hJZDogaGFzaElkLFxuICAgICAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgICAgIHJvb3RQcmVmaXhDbHM6IHJvb3RQcmVmaXhDbHMsXG4gICAgICAgICAgaWNvblByZWZpeENsczogaWNvblByZWZpeENsc1xuICAgICAgICB9KTtcbiAgICAgICAgZmx1c2goY29tcG9uZW50LCBjb21wb25lbnRUb2tlbik7XG4gICAgICAgIHZhciBjb21tb25TdHlsZSA9IHR5cGVvZiBnZXRDb21tb25TdHlsZSA9PT0gJ2Z1bmN0aW9uJyA/IGdldENvbW1vblN0eWxlKG1lcmdlZFRva2VuLCBwcmVmaXhDbHMsIHJvb3RDbHMsIG9wdGlvbnMucmVzZXRGb250KSA6IG51bGw7XG4gICAgICAgIHJldHVybiBbb3B0aW9ucy5yZXNldFN0eWxlID09PSBmYWxzZSA/IG51bGwgOiBjb21tb25TdHlsZSwgc3R5bGVJbnRlcnBvbGF0aW9uXTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFt3cmFwU1NSLCBoYXNoSWRdO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gZ2VuU3ViU3R5bGVDb21wb25lbnQoY29tcG9uZW50TmFtZSwgc3R5bGVGbiwgZ2V0RGVmYXVsdFRva2VuKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHt9O1xuICAgIHZhciB1c2VTdHlsZSA9IGdlbkNvbXBvbmVudFN0eWxlSG9vayhjb21wb25lbnROYW1lLCBzdHlsZUZuLCBnZXREZWZhdWx0VG9rZW4sIF9vYmplY3RTcHJlYWQoe1xuICAgICAgcmVzZXRTdHlsZTogZmFsc2UsXG4gICAgICAvLyBTdWIgU3R5bGUgc2hvdWxkIGRlZmF1bHQgYWZ0ZXIgcm9vdCBvbmVcbiAgICAgIG9yZGVyOiAtOTk4XG4gICAgfSwgb3B0aW9ucykpO1xuICAgIHZhciBTdHlsZWRDb21wb25lbnQgPSBmdW5jdGlvbiBTdHlsZWRDb21wb25lbnQoX3JlZjIpIHtcbiAgICAgIHZhciBwcmVmaXhDbHMgPSBfcmVmMi5wcmVmaXhDbHMsXG4gICAgICAgIF9yZWYyJHJvb3RDbHMgPSBfcmVmMi5yb290Q2xzLFxuICAgICAgICByb290Q2xzID0gX3JlZjIkcm9vdENscyA9PT0gdm9pZCAwID8gcHJlZml4Q2xzIDogX3JlZjIkcm9vdENscztcbiAgICAgIHVzZVN0eWxlKHByZWZpeENscywgcm9vdENscyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBTdHlsZWRDb21wb25lbnQuZGlzcGxheU5hbWUgPSBcIlN1YlN0eWxlX1wiLmNvbmNhdChTdHJpbmcoQXJyYXkuaXNBcnJheShjb21wb25lbnROYW1lKSA/IGNvbXBvbmVudE5hbWUuam9pbignLicpIDogY29tcG9uZW50TmFtZSkpO1xuICAgIH1cbiAgICByZXR1cm4gU3R5bGVkQ29tcG9uZW50O1xuICB9XG4gIHJldHVybiB7XG4gICAgZ2VuU3R5bGVIb29rczogZ2VuU3R5bGVIb29rcyxcbiAgICBnZW5TdWJTdHlsZUNvbXBvbmVudDogZ2VuU3ViU3R5bGVDb21wb25lbnQsXG4gICAgZ2VuQ29tcG9uZW50U3R5bGVIb29rOiBnZW5Db21wb25lbnRTdHlsZUhvb2tcbiAgfTtcbn1cbmV4cG9ydCBkZWZhdWx0IGdlblN0eWxlVXRpbHM7IiwgImltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xudmFyIEFic3RyYWN0Q2FsY3VsYXRvciA9IC8qI19fUFVSRV9fKi9fY3JlYXRlQ2xhc3MoZnVuY3Rpb24gQWJzdHJhY3RDYWxjdWxhdG9yKCkge1xuICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQWJzdHJhY3RDYWxjdWxhdG9yKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgQWJzdHJhY3RDYWxjdWxhdG9yOyIsICJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3NlcnRUaGlzSW5pdGlhbGl6ZWRcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzXCI7XG5pbXBvcnQgX2NyZWF0ZVN1cGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVTdXBlclwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBBYnN0cmFjdENhbGN1bGF0b3IgZnJvbSBcIi4vY2FsY3VsYXRvclwiO1xudmFyIENBTENfVU5JVCA9ICdDQUxDX1VOSVQnO1xudmFyIHJlZ2V4cCA9IG5ldyBSZWdFeHAoQ0FMQ19VTklULCAnZycpO1xuZnVuY3Rpb24gdW5pdCh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBcIlwiLmNvbmNhdCh2YWx1ZSkuY29uY2F0KENBTENfVU5JVCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxudmFyIENTU0NhbGN1bGF0b3IgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9BYnN0cmFjdENhbGN1bGF0b3IpIHtcbiAgX2luaGVyaXRzKENTU0NhbGN1bGF0b3IsIF9BYnN0cmFjdENhbGN1bGF0b3IpO1xuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKENTU0NhbGN1bGF0b3IpO1xuICBmdW5jdGlvbiBDU1NDYWxjdWxhdG9yKG51bSwgdW5pdGxlc3NDc3NWYXIpIHtcbiAgICB2YXIgX3RoaXM7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENTU0NhbGN1bGF0b3IpO1xuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInJlc3VsdFwiLCAnJyk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInVuaXRsZXNzQ3NzVmFyXCIsIHZvaWQgMCk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImxvd1ByaW9yaXR5XCIsIHZvaWQgMCk7XG4gICAgdmFyIG51bVR5cGUgPSBfdHlwZW9mKG51bSk7XG4gICAgX3RoaXMudW5pdGxlc3NDc3NWYXIgPSB1bml0bGVzc0Nzc1ZhcjtcbiAgICBpZiAobnVtIGluc3RhbmNlb2YgQ1NTQ2FsY3VsYXRvcikge1xuICAgICAgX3RoaXMucmVzdWx0ID0gXCIoXCIuY29uY2F0KG51bS5yZXN1bHQsIFwiKVwiKTtcbiAgICB9IGVsc2UgaWYgKG51bVR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICBfdGhpcy5yZXN1bHQgPSB1bml0KG51bSk7XG4gICAgfSBlbHNlIGlmIChudW1UeXBlID09PSAnc3RyaW5nJykge1xuICAgICAgX3RoaXMucmVzdWx0ID0gbnVtO1xuICAgIH1cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgX2NyZWF0ZUNsYXNzKENTU0NhbGN1bGF0b3IsIFt7XG4gICAga2V5OiBcImFkZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGQobnVtKSB7XG4gICAgICBpZiAobnVtIGluc3RhbmNlb2YgQ1NTQ2FsY3VsYXRvcikge1xuICAgICAgICB0aGlzLnJlc3VsdCA9IFwiXCIuY29uY2F0KHRoaXMucmVzdWx0LCBcIiArIFwiKS5jb25jYXQobnVtLmdldFJlc3VsdCgpKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG51bSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIG51bSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5yZXN1bHQgPSBcIlwiLmNvbmNhdCh0aGlzLnJlc3VsdCwgXCIgKyBcIikuY29uY2F0KHVuaXQobnVtKSk7XG4gICAgICB9XG4gICAgICB0aGlzLmxvd1ByaW9yaXR5ID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzdWJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3ViKG51bSkge1xuICAgICAgaWYgKG51bSBpbnN0YW5jZW9mIENTU0NhbGN1bGF0b3IpIHtcbiAgICAgICAgdGhpcy5yZXN1bHQgPSBcIlwiLmNvbmNhdCh0aGlzLnJlc3VsdCwgXCIgLSBcIikuY29uY2F0KG51bS5nZXRSZXN1bHQoKSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBudW0gPT09ICdudW1iZXInIHx8IHR5cGVvZiBudW0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMucmVzdWx0ID0gXCJcIi5jb25jYXQodGhpcy5yZXN1bHQsIFwiIC0gXCIpLmNvbmNhdCh1bml0KG51bSkpO1xuICAgICAgfVxuICAgICAgdGhpcy5sb3dQcmlvcml0eSA9IHRydWU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibXVsXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG11bChudW0pIHtcbiAgICAgIGlmICh0aGlzLmxvd1ByaW9yaXR5KSB7XG4gICAgICAgIHRoaXMucmVzdWx0ID0gXCIoXCIuY29uY2F0KHRoaXMucmVzdWx0LCBcIilcIik7XG4gICAgICB9XG4gICAgICBpZiAobnVtIGluc3RhbmNlb2YgQ1NTQ2FsY3VsYXRvcikge1xuICAgICAgICB0aGlzLnJlc3VsdCA9IFwiXCIuY29uY2F0KHRoaXMucmVzdWx0LCBcIiAqIFwiKS5jb25jYXQobnVtLmdldFJlc3VsdCh0cnVlKSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBudW0gPT09ICdudW1iZXInIHx8IHR5cGVvZiBudW0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMucmVzdWx0ID0gXCJcIi5jb25jYXQodGhpcy5yZXN1bHQsIFwiICogXCIpLmNvbmNhdChudW0pO1xuICAgICAgfVxuICAgICAgdGhpcy5sb3dQcmlvcml0eSA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRpdlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkaXYobnVtKSB7XG4gICAgICBpZiAodGhpcy5sb3dQcmlvcml0eSkge1xuICAgICAgICB0aGlzLnJlc3VsdCA9IFwiKFwiLmNvbmNhdCh0aGlzLnJlc3VsdCwgXCIpXCIpO1xuICAgICAgfVxuICAgICAgaWYgKG51bSBpbnN0YW5jZW9mIENTU0NhbGN1bGF0b3IpIHtcbiAgICAgICAgdGhpcy5yZXN1bHQgPSBcIlwiLmNvbmNhdCh0aGlzLnJlc3VsdCwgXCIgLyBcIikuY29uY2F0KG51bS5nZXRSZXN1bHQodHJ1ZSkpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbnVtID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgbnVtID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLnJlc3VsdCA9IFwiXCIuY29uY2F0KHRoaXMucmVzdWx0LCBcIiAvIFwiKS5jb25jYXQobnVtKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubG93UHJpb3JpdHkgPSBmYWxzZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRSZXN1bHRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UmVzdWx0KGZvcmNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5sb3dQcmlvcml0eSB8fCBmb3JjZSA/IFwiKFwiLmNvbmNhdCh0aGlzLnJlc3VsdCwgXCIpXCIpIDogdGhpcy5yZXN1bHQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVxdWFsXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVxdWFsKG9wdGlvbnMpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuICAgICAgdmFyIF9yZWYgPSBvcHRpb25zIHx8IHt9LFxuICAgICAgICBjc3NVbml0ID0gX3JlZi51bml0O1xuICAgICAgdmFyIG1lcmdlZFVuaXQgPSB0cnVlO1xuICAgICAgaWYgKHR5cGVvZiBjc3NVbml0ID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgbWVyZ2VkVW5pdCA9IGNzc1VuaXQ7XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmZyb20odGhpcy51bml0bGVzc0Nzc1Zhcikuc29tZShmdW5jdGlvbiAoY3NzVmFyKSB7XG4gICAgICAgIHJldHVybiBfdGhpczIucmVzdWx0LmluY2x1ZGVzKGNzc1Zhcik7XG4gICAgICB9KSkge1xuICAgICAgICBtZXJnZWRVbml0ID0gZmFsc2U7XG4gICAgICB9XG4gICAgICB0aGlzLnJlc3VsdCA9IHRoaXMucmVzdWx0LnJlcGxhY2UocmVnZXhwLCBtZXJnZWRVbml0ID8gJ3B4JyA6ICcnKTtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5sb3dQcmlvcml0eSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIFwiY2FsYyhcIi5jb25jYXQodGhpcy5yZXN1bHQsIFwiKVwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnJlc3VsdDtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIENTU0NhbGN1bGF0b3I7XG59KEFic3RyYWN0Q2FsY3VsYXRvcik7XG5leHBvcnQgeyBDU1NDYWxjdWxhdG9yIGFzIGRlZmF1bHQgfTsiLCAiaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2Fzc2VydFRoaXNJbml0aWFsaXplZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXNzZXJ0VGhpc0luaXRpYWxpemVkXCI7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c1wiO1xuaW1wb3J0IF9jcmVhdGVTdXBlciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlU3VwZXJcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgQWJzdHJhY3RDYWxjdWxhdG9yIGZyb20gXCIuL2NhbGN1bGF0b3JcIjtcbnZhciBOdW1DYWxjdWxhdG9yID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQWJzdHJhY3RDYWxjdWxhdG9yKSB7XG4gIF9pbmhlcml0cyhOdW1DYWxjdWxhdG9yLCBfQWJzdHJhY3RDYWxjdWxhdG9yKTtcbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihOdW1DYWxjdWxhdG9yKTtcbiAgZnVuY3Rpb24gTnVtQ2FsY3VsYXRvcihudW0pIHtcbiAgICB2YXIgX3RoaXM7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE51bUNhbGN1bGF0b3IpO1xuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInJlc3VsdFwiLCAwKTtcbiAgICBpZiAobnVtIGluc3RhbmNlb2YgTnVtQ2FsY3VsYXRvcikge1xuICAgICAgX3RoaXMucmVzdWx0ID0gbnVtLnJlc3VsdDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBudW0gPT09ICdudW1iZXInKSB7XG4gICAgICBfdGhpcy5yZXN1bHQgPSBudW07XG4gICAgfVxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICBfY3JlYXRlQ2xhc3MoTnVtQ2FsY3VsYXRvciwgW3tcbiAgICBrZXk6IFwiYWRkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZChudW0pIHtcbiAgICAgIGlmIChudW0gaW5zdGFuY2VvZiBOdW1DYWxjdWxhdG9yKSB7XG4gICAgICAgIHRoaXMucmVzdWx0ICs9IG51bS5yZXN1bHQ7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBudW0gPT09ICdudW1iZXInKSB7XG4gICAgICAgIHRoaXMucmVzdWx0ICs9IG51bTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzdWJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3ViKG51bSkge1xuICAgICAgaWYgKG51bSBpbnN0YW5jZW9mIE51bUNhbGN1bGF0b3IpIHtcbiAgICAgICAgdGhpcy5yZXN1bHQgLT0gbnVtLnJlc3VsdDtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG51bSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdGhpcy5yZXN1bHQgLT0gbnVtO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm11bFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtdWwobnVtKSB7XG4gICAgICBpZiAobnVtIGluc3RhbmNlb2YgTnVtQ2FsY3VsYXRvcikge1xuICAgICAgICB0aGlzLnJlc3VsdCAqPSBudW0ucmVzdWx0O1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbnVtID09PSAnbnVtYmVyJykge1xuICAgICAgICB0aGlzLnJlc3VsdCAqPSBudW07XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGl2XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRpdihudW0pIHtcbiAgICAgIGlmIChudW0gaW5zdGFuY2VvZiBOdW1DYWxjdWxhdG9yKSB7XG4gICAgICAgIHRoaXMucmVzdWx0IC89IG51bS5yZXN1bHQ7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBudW0gPT09ICdudW1iZXInKSB7XG4gICAgICAgIHRoaXMucmVzdWx0IC89IG51bTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJlcXVhbFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlcXVhbCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc3VsdDtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIE51bUNhbGN1bGF0b3I7XG59KEFic3RyYWN0Q2FsY3VsYXRvcik7XG5leHBvcnQgZGVmYXVsdCBOdW1DYWxjdWxhdG9yOyIsICJpbXBvcnQgQ1NTQ2FsY3VsYXRvciBmcm9tIFwiLi9DU1NDYWxjdWxhdG9yXCI7XG5pbXBvcnQgTnVtQ2FsY3VsYXRvciBmcm9tIFwiLi9OdW1DYWxjdWxhdG9yXCI7XG52YXIgZ2VuQ2FsYyA9IGZ1bmN0aW9uIGdlbkNhbGModHlwZSwgdW5pdGxlc3NDc3NWYXIpIHtcbiAgdmFyIENhbGN1bGF0b3IgPSB0eXBlID09PSAnY3NzJyA/IENTU0NhbGN1bGF0b3IgOiBOdW1DYWxjdWxhdG9yO1xuICByZXR1cm4gZnVuY3Rpb24gKG51bSkge1xuICAgIHJldHVybiBuZXcgQ2FsY3VsYXRvcihudW0sIHVuaXRsZXNzQ3NzVmFyKTtcbiAgfTtcbn07XG5leHBvcnQgZGVmYXVsdCBnZW5DYWxjOyIsICJ2YXIgZ2V0Q29tcFZhclByZWZpeCA9IGZ1bmN0aW9uIGdldENvbXBWYXJQcmVmaXgoY29tcG9uZW50LCBwcmVmaXgpIHtcbiAgcmV0dXJuIFwiXCIuY29uY2F0KFtwcmVmaXgsIGNvbXBvbmVudC5yZXBsYWNlKC8oW0EtWl0rKShbQS1aXVthLXpdKykvZywgJyQxLSQyJykucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgJyQxLSQyJyldLmZpbHRlcihCb29sZWFuKS5qb2luKCctJykpO1xufTtcbmV4cG9ydCBkZWZhdWx0IGdldENvbXBWYXJQcmVmaXg7IiwgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUV2ZW50KGNhbGxiYWNrKSB7XG4gIHZhciBmblJlZiA9IFJlYWN0LnVzZVJlZigpO1xuICBmblJlZi5jdXJyZW50ID0gY2FsbGJhY2s7XG4gIHZhciBtZW1vRm4gPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9mblJlZiRjdXJyZW50O1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIChfZm5SZWYkY3VycmVudCA9IGZuUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9mblJlZiRjdXJyZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZm5SZWYkY3VycmVudC5jYWxsLmFwcGx5KF9mblJlZiRjdXJyZW50LCBbZm5SZWZdLmNvbmNhdChhcmdzKSk7XG4gIH0sIFtdKTtcbiAgcmV0dXJuIG1lbW9Gbjtcbn0iLCAiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG4vKipcbiAqIFNhbWUgYXMgUmVhY3QudXNlU3RhdGUgYnV0IGBzZXRTdGF0ZWAgYWNjZXB0IGBpZ25vcmVEZXN0cm95YCBwYXJhbSB0byBub3QgdG8gc2V0U3RhdGUgYWZ0ZXIgZGVzdHJveWVkLlxuICogV2UgZG8gbm90IG1ha2UgdGhpcyBhdXRvIGlzIHRvIGF2b2lkIHJlYWwgbWVtb3J5IGxlYWsuXG4gKiBEZXZlbG9wZXIgc2hvdWxkIGNvbmZpcm0gaXQncyBzYWZlIHRvIGlnbm9yZSB0aGVtc2VsdmVzLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VTYWZlU3RhdGUoZGVmYXVsdFZhbHVlKSB7XG4gIHZhciBkZXN0cm95UmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGRlZmF1bHRWYWx1ZSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgdmFsdWUgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldFZhbHVlID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBkZXN0cm95UmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgZGVzdHJveVJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIGZ1bmN0aW9uIHNhZmVTZXRTdGF0ZSh1cGRhdGVyLCBpZ25vcmVEZXN0cm95KSB7XG4gICAgaWYgKGlnbm9yZURlc3Ryb3kgJiYgZGVzdHJveVJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNldFZhbHVlKHVwZGF0ZXIpO1xuICB9XG4gIHJldHVybiBbdmFsdWUsIHNhZmVTZXRTdGF0ZV07XG59IiwgImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IHVzZUV2ZW50IGZyb20gXCIuL3VzZUV2ZW50XCI7XG5pbXBvcnQgeyB1c2VMYXlvdXRVcGRhdGVFZmZlY3QgfSBmcm9tIFwiLi91c2VMYXlvdXRFZmZlY3RcIjtcbmltcG9ydCB1c2VTdGF0ZSBmcm9tIFwiLi91c2VTdGF0ZVwiO1xuLyoqIFdlIG9ubHkgdGhpbmsgYHVuZGVmaW5lZGAgaXMgZW1wdHkgKi9cbmZ1bmN0aW9uIGhhc1ZhbHVlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFNpbWlsYXIgdG8gYHVzZVN0YXRlYCBidXQgd2lsbCB1c2UgcHJvcHMgdmFsdWUgaWYgcHJvdmlkZWQuXG4gKiBOb3RlIHRoYXQgaW50ZXJuYWwgdXNlIHJjLXV0aWwgYHVzZVN0YXRlYCBob29rLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VNZXJnZWRTdGF0ZShkZWZhdWx0U3RhdGVWYWx1ZSwgb3B0aW9uKSB7XG4gIHZhciBfcmVmID0gb3B0aW9uIHx8IHt9LFxuICAgIGRlZmF1bHRWYWx1ZSA9IF9yZWYuZGVmYXVsdFZhbHVlLFxuICAgIHZhbHVlID0gX3JlZi52YWx1ZSxcbiAgICBvbkNoYW5nZSA9IF9yZWYub25DaGFuZ2UsXG4gICAgcG9zdFN0YXRlID0gX3JlZi5wb3N0U3RhdGU7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT0gSW5pdCA9PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGhhc1ZhbHVlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKGhhc1ZhbHVlKGRlZmF1bHRWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBkZWZhdWx0VmFsdWUgPT09ICdmdW5jdGlvbicgPyBkZWZhdWx0VmFsdWUoKSA6IGRlZmF1bHRWYWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgZGVmYXVsdFN0YXRlVmFsdWUgPT09ICdmdW5jdGlvbicgPyBkZWZhdWx0U3RhdGVWYWx1ZSgpIDogZGVmYXVsdFN0YXRlVmFsdWU7XG4gICAgICB9XG4gICAgfSksXG4gICAgX3VzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZSwgMiksXG4gICAgaW5uZXJWYWx1ZSA9IF91c2VTdGF0ZTJbMF0sXG4gICAgc2V0SW5uZXJWYWx1ZSA9IF91c2VTdGF0ZTJbMV07XG4gIHZhciBtZXJnZWRWYWx1ZSA9IHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IGlubmVyVmFsdWU7XG4gIHZhciBwb3N0TWVyZ2VkVmFsdWUgPSBwb3N0U3RhdGUgPyBwb3N0U3RhdGUobWVyZ2VkVmFsdWUpIDogbWVyZ2VkVmFsdWU7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PSBDaGFuZ2UgPT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgb25DaGFuZ2VGbiA9IHVzZUV2ZW50KG9uQ2hhbmdlKTtcbiAgdmFyIF91c2VTdGF0ZTMgPSB1c2VTdGF0ZShbbWVyZ2VkVmFsdWVdKSxcbiAgICBfdXNlU3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlMywgMiksXG4gICAgcHJldlZhbHVlID0gX3VzZVN0YXRlNFswXSxcbiAgICBzZXRQcmV2VmFsdWUgPSBfdXNlU3RhdGU0WzFdO1xuICB1c2VMYXlvdXRVcGRhdGVFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcmV2ID0gcHJldlZhbHVlWzBdO1xuICAgIGlmIChpbm5lclZhbHVlICE9PSBwcmV2KSB7XG4gICAgICBvbkNoYW5nZUZuKGlubmVyVmFsdWUsIHByZXYpO1xuICAgIH1cbiAgfSwgW3ByZXZWYWx1ZV0pO1xuXG4gIC8vIFN5bmMgdmFsdWUgYmFjayB0byBgdW5kZWZpbmVkYCB3aGVuIGl0IGZyb20gY29udHJvbCB0byB1bi1jb250cm9sXG4gIHVzZUxheW91dFVwZGF0ZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFoYXNWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgIHNldElubmVyVmFsdWUodmFsdWUpO1xuICAgIH1cbiAgfSwgW3ZhbHVlXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PSBVcGRhdGUgPT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgdHJpZ2dlckNoYW5nZSA9IHVzZUV2ZW50KGZ1bmN0aW9uICh1cGRhdGVyLCBpZ25vcmVEZXN0cm95KSB7XG4gICAgc2V0SW5uZXJWYWx1ZSh1cGRhdGVyLCBpZ25vcmVEZXN0cm95KTtcbiAgICBzZXRQcmV2VmFsdWUoW21lcmdlZFZhbHVlXSwgaWdub3JlRGVzdHJveSk7XG4gIH0pO1xuICByZXR1cm4gW3Bvc3RNZXJnZWRWYWx1ZSwgdHJpZ2dlckNoYW5nZV07XG59IiwgImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCB7IHdhcm5pbmcgfSBmcm9tICdyYy11dGlsJztcbmZ1bmN0aW9uIGdldENvbXBvbmVudFRva2VuKGNvbXBvbmVudCwgdG9rZW4sIGRlZmF1bHRUb2tlbiwgb3B0aW9ucykge1xuICB2YXIgY3VzdG9tVG9rZW4gPSBfb2JqZWN0U3ByZWFkKHt9LCB0b2tlbltjb21wb25lbnRdKTtcbiAgaWYgKG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdm9pZCAwICYmIG9wdGlvbnMuZGVwcmVjYXRlZFRva2Vucykge1xuICAgIHZhciBkZXByZWNhdGVkVG9rZW5zID0gb3B0aW9ucy5kZXByZWNhdGVkVG9rZW5zO1xuICAgIGRlcHJlY2F0ZWRUb2tlbnMuZm9yRWFjaChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgdmFyIF9yZWYyID0gX3NsaWNlZFRvQXJyYXkoX3JlZiwgMiksXG4gICAgICAgIG9sZFRva2VuS2V5ID0gX3JlZjJbMF0sXG4gICAgICAgIG5ld1Rva2VuS2V5ID0gX3JlZjJbMV07XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICB3YXJuaW5nKCEoY3VzdG9tVG9rZW4gIT09IG51bGwgJiYgY3VzdG9tVG9rZW4gIT09IHZvaWQgMCAmJiBjdXN0b21Ub2tlbltvbGRUb2tlbktleV0pLCBcIkNvbXBvbmVudCBUb2tlbiBgXCIuY29uY2F0KFN0cmluZyhvbGRUb2tlbktleSksIFwiYCBvZiBcIikuY29uY2F0KFN0cmluZyhjb21wb25lbnQpLCBcIiBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIGBcIikuY29uY2F0KFN0cmluZyhuZXdUb2tlbktleSksIFwiYCBpbnN0ZWFkLlwiKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNob3VsZCB3cmFwIHdpdGggYGlmYCBjbGF1c2UsIG9yIHRoZXJlIHdpbGwgYmUgYHVuZGVmaW5lZGAgaW4gb2JqZWN0LlxuICAgICAgaWYgKGN1c3RvbVRva2VuICE9PSBudWxsICYmIGN1c3RvbVRva2VuICE9PSB2b2lkIDAgJiYgY3VzdG9tVG9rZW5bb2xkVG9rZW5LZXldIHx8IGN1c3RvbVRva2VuICE9PSBudWxsICYmIGN1c3RvbVRva2VuICE9PSB2b2lkIDAgJiYgY3VzdG9tVG9rZW5bbmV3VG9rZW5LZXldKSB7XG4gICAgICAgIHZhciBfY3VzdG9tVG9rZW4kbmV3VG9rZW47XG4gICAgICAgIChfY3VzdG9tVG9rZW4kbmV3VG9rZW4gPSBjdXN0b21Ub2tlbltuZXdUb2tlbktleV0pICE9PSBudWxsICYmIF9jdXN0b21Ub2tlbiRuZXdUb2tlbiAhPT0gdm9pZCAwID8gX2N1c3RvbVRva2VuJG5ld1Rva2VuIDogY3VzdG9tVG9rZW5bbmV3VG9rZW5LZXldID0gY3VzdG9tVG9rZW4gPT09IG51bGwgfHwgY3VzdG9tVG9rZW4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGN1c3RvbVRva2VuW29sZFRva2VuS2V5XTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICB2YXIgbWVyZ2VkVG9rZW4gPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGRlZmF1bHRUb2tlbiksIGN1c3RvbVRva2VuKTtcblxuICAvLyBSZW1vdmUgc2FtZSB2YWx1ZSBhcyBnbG9iYWwgdG9rZW4gdG8gbWluaW1pemUgc2l6ZVxuICBPYmplY3Qua2V5cyhtZXJnZWRUb2tlbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKG1lcmdlZFRva2VuW2tleV0gPT09IHRva2VuW2tleV0pIHtcbiAgICAgIGRlbGV0ZSBtZXJnZWRUb2tlbltrZXldO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBtZXJnZWRUb2tlbjtcbn1cbmV4cG9ydCBkZWZhdWx0IGdldENvbXBvbmVudFRva2VuOyIsICJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xudmFyIGVuYWJsZVN0YXRpc3RpYyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgfHwgdHlwZW9mIENTU0lOSlNfU1RBVElTVElDICE9PSAndW5kZWZpbmVkJztcbnZhciByZWNvcmRpbmcgPSB0cnVlO1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkbyBhcyBgT2JqZWN0LmFzc2lnbmAgaW4gcHJvZHVjdGlvbi4gQnV0IHdpbGwgdXNlIE9iamVjdC5kZWZpbmVQcm9wZXJ0eTpnZXQgdG9cbiAqIHBhc3MgYWxsIHZhbHVlIGFjY2VzcyBpbiBkZXZlbG9wbWVudC4gVG8gc3VwcG9ydCBzdGF0aXN0aWMgZmllbGQgdXNhZ2Ugd2l0aCBhbGlhcyB0b2tlbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgb2JqcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBvYmpzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGlmICghZW5hYmxlU3RhdGlzdGljKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24uYXBwbHkoT2JqZWN0LCBbe31dLmNvbmNhdChvYmpzKSk7XG4gIH1cbiAgcmVjb3JkaW5nID0gZmFsc2U7XG4gIHZhciByZXQgPSB7fTtcbiAgb2Jqcy5mb3JFYWNoKGZ1bmN0aW9uIChvYmopIHtcbiAgICBpZiAoX3R5cGVvZihvYmopICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXQsIGtleSwge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIHJldHVybiBvYmpba2V5XTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuICByZWNvcmRpbmcgPSB0cnVlO1xuICByZXR1cm4gcmV0O1xufVxuXG4vKiogQGludGVybmFsIEludGVybmFsIFVzYWdlLiBOb3QgdXNlIGluIHlvdXIgcHJvZHVjdGlvbi4gKi9cbmV4cG9ydCB2YXIgc3RhdGlzdGljID0ge307XG5cbi8qKiBAaW50ZXJuYWwgSW50ZXJuYWwgVXNhZ2UuIE5vdCB1c2UgaW4geW91ciBwcm9kdWN0aW9uLiAqL1xuZXhwb3J0IHZhciBfc3RhdGlzdGljX2J1aWxkXyA9IHt9O1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbi8qKiBTdGF0aXN0aWMgdG9rZW4gdXNhZ2UgY2FzZS4gU2hvdWxkIHVzZSBgbWVyZ2VgIGZ1bmN0aW9uIGlmIHlvdSBkbyBub3Qgd2FudCBzcHJlYWQgcmVjb3JkLiAqL1xudmFyIHN0YXRpc3RpY1Rva2VuID0gZnVuY3Rpb24gc3RhdGlzdGljVG9rZW4odG9rZW4pIHtcbiAgdmFyIHRva2VuS2V5cztcbiAgdmFyIHByb3h5ID0gdG9rZW47XG4gIHZhciBmbHVzaCA9IG5vb3A7XG4gIGlmIChlbmFibGVTdGF0aXN0aWMgJiYgdHlwZW9mIFByb3h5ICE9PSAndW5kZWZpbmVkJykge1xuICAgIHRva2VuS2V5cyA9IG5ldyBTZXQoKTtcbiAgICBwcm94eSA9IG5ldyBQcm94eSh0b2tlbiwge1xuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQob2JqLCBwcm9wKSB7XG4gICAgICAgIGlmIChyZWNvcmRpbmcpIHtcbiAgICAgICAgICB2YXIgX3Rva2VuS2V5cztcbiAgICAgICAgICAoX3Rva2VuS2V5cyA9IHRva2VuS2V5cykgPT09IG51bGwgfHwgX3Rva2VuS2V5cyA9PT0gdm9pZCAwIHx8IF90b2tlbktleXMuYWRkKHByb3ApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmpbcHJvcF07XG4gICAgICB9XG4gICAgfSk7XG4gICAgZmx1c2ggPSBmdW5jdGlvbiBmbHVzaChjb21wb25lbnROYW1lLCBjb21wb25lbnRUb2tlbikge1xuICAgICAgdmFyIF9zdGF0aXN0aWMkY29tcG9uZW50TjtcbiAgICAgIHN0YXRpc3RpY1tjb21wb25lbnROYW1lXSA9IHtcbiAgICAgICAgZ2xvYmFsOiBBcnJheS5mcm9tKHRva2VuS2V5cyksXG4gICAgICAgIGNvbXBvbmVudDogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCAoX3N0YXRpc3RpYyRjb21wb25lbnROID0gc3RhdGlzdGljW2NvbXBvbmVudE5hbWVdKSA9PT0gbnVsbCB8fCBfc3RhdGlzdGljJGNvbXBvbmVudE4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9zdGF0aXN0aWMkY29tcG9uZW50Ti5jb21wb25lbnQpLCBjb21wb25lbnRUb2tlbilcbiAgICAgIH07XG4gICAgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHRva2VuOiBwcm94eSxcbiAgICBrZXlzOiB0b2tlbktleXMsXG4gICAgZmx1c2g6IGZsdXNoXG4gIH07XG59O1xuZXhwb3J0IGRlZmF1bHQgc3RhdGlzdGljVG9rZW47IiwgImltcG9ydCB7IG1lcmdlIGFzIG1lcmdlVG9rZW4gfSBmcm9tIFwiLi9zdGF0aXN0aWNcIjtcbmZ1bmN0aW9uIGdldERlZmF1bHRDb21wb25lbnRUb2tlbihjb21wb25lbnQsIHRva2VuLCBnZXREZWZhdWx0VG9rZW4pIHtcbiAgaWYgKHR5cGVvZiBnZXREZWZhdWx0VG9rZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgX3Rva2VuJGNvbXBvbmVudDtcbiAgICByZXR1cm4gZ2V0RGVmYXVsdFRva2VuKG1lcmdlVG9rZW4odG9rZW4sIChfdG9rZW4kY29tcG9uZW50ID0gdG9rZW5bY29tcG9uZW50XSkgIT09IG51bGwgJiYgX3Rva2VuJGNvbXBvbmVudCAhPT0gdm9pZCAwID8gX3Rva2VuJGNvbXBvbmVudCA6IHt9KSk7XG4gIH1cbiAgcmV0dXJuIGdldERlZmF1bHRUb2tlbiAhPT0gbnVsbCAmJiBnZXREZWZhdWx0VG9rZW4gIT09IHZvaWQgMCA/IGdldERlZmF1bHRUb2tlbiA6IHt9O1xufVxuZXhwb3J0IGRlZmF1bHQgZ2V0RGVmYXVsdENvbXBvbmVudFRva2VuOyIsICJpbXBvcnQgeyB1bml0IH0gZnJvbSAnQGFudC1kZXNpZ24vY3NzaW5qcyc7XG5mdW5jdGlvbiBnZW5NYXhNaW4odHlwZSkge1xuICBpZiAodHlwZSA9PT0gJ2pzJykge1xuICAgIHJldHVybiB7XG4gICAgICBtYXg6IE1hdGgubWF4LFxuICAgICAgbWluOiBNYXRoLm1pblxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBtYXg6IGZ1bmN0aW9uIG1heCgpIHtcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFwibWF4KFwiLmNvbmNhdChhcmdzLm1hcChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHVuaXQodmFsdWUpO1xuICAgICAgfSkuam9pbignLCcpLCBcIilcIik7XG4gICAgfSxcbiAgICBtaW46IGZ1bmN0aW9uIG1pbigpIHtcbiAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICB9XG4gICAgICByZXR1cm4gXCJtaW4oXCIuY29uY2F0KGFyZ3MubWFwKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdW5pdCh2YWx1ZSk7XG4gICAgICB9KS5qb2luKCcsJyksIFwiKVwiKTtcbiAgICB9XG4gIH07XG59XG5leHBvcnQgZGVmYXVsdCBnZW5NYXhNaW47IiwgImltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG52YXIgQkVBVF9MSU1JVCA9IDEwMDAgKiA2MCAqIDEwO1xuXG4vKipcbiAqIEEgaGVscGVyIGNsYXNzIHRvIG1hcCBrZXlzIHRvIHZhbHVlcy5cbiAqIEl0IHN1cHBvcnRzIGJvdGggcHJpbWl0aXZlIGtleXMgYW5kIG9iamVjdCBrZXlzLlxuICovXG52YXIgQXJyYXlLZXlNYXAgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBBcnJheUtleU1hcCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQXJyYXlLZXlNYXApO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm1hcFwiLCBuZXcgTWFwKCkpO1xuICAgIC8vIFVzZSBXZWFrTWFwIHRvIGF2b2lkIG1lbW9yeSBsZWFrXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwib2JqZWN0SURNYXBcIiwgbmV3IFdlYWtNYXAoKSk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwibmV4dElEXCIsIDApO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImxhc3RBY2Nlc3NCZWF0XCIsIG5ldyBNYXAoKSk7XG4gICAgLy8gV2Ugd2lsbCBjbGVhbiB1cCB0aGUgY2FjaGUgd2hlbiByZWFjaCB0aGUgbGltaXRcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJhY2Nlc3NCZWF0XCIsIDApO1xuICB9XG4gIF9jcmVhdGVDbGFzcyhBcnJheUtleU1hcCwgW3tcbiAgICBrZXk6IFwic2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldChrZXlzLCB2YWx1ZSkge1xuICAgICAgLy8gTmV3IHNldCB3aWxsIHRyaWdnZXIgY2xlYXJcbiAgICAgIHRoaXMuY2xlYXIoKTtcblxuICAgICAgLy8gU2V0IGxvZ2ljXG4gICAgICB2YXIgY29tcG9zaXRlS2V5ID0gdGhpcy5nZXRDb21wb3NpdGVLZXkoa2V5cyk7XG4gICAgICB0aGlzLm1hcC5zZXQoY29tcG9zaXRlS2V5LCB2YWx1ZSk7XG4gICAgICB0aGlzLmxhc3RBY2Nlc3NCZWF0LnNldChjb21wb3NpdGVLZXksIERhdGUubm93KCkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0KGtleXMpIHtcbiAgICAgIHZhciBjb21wb3NpdGVLZXkgPSB0aGlzLmdldENvbXBvc2l0ZUtleShrZXlzKTtcbiAgICAgIHZhciBjYWNoZSA9IHRoaXMubWFwLmdldChjb21wb3NpdGVLZXkpO1xuICAgICAgdGhpcy5sYXN0QWNjZXNzQmVhdC5zZXQoY29tcG9zaXRlS2V5LCBEYXRlLm5vdygpKTtcbiAgICAgIHRoaXMuYWNjZXNzQmVhdCArPSAxO1xuICAgICAgcmV0dXJuIGNhY2hlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRDb21wb3NpdGVLZXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q29tcG9zaXRlS2V5KGtleXMpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICB2YXIgaWRzID0ga2V5cy5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBpZiAoa2V5ICYmIF90eXBlb2Yoa2V5KSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICByZXR1cm4gXCJvYmpfXCIuY29uY2F0KF90aGlzLmdldE9iamVjdElEKGtleSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIlwiLmNvbmNhdChfdHlwZW9mKGtleSksIFwiX1wiKS5jb25jYXQoa2V5KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGlkcy5qb2luKCd8Jyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldE9iamVjdElEXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldE9iamVjdElEKG9iaikge1xuICAgICAgaWYgKHRoaXMub2JqZWN0SURNYXAuaGFzKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2JqZWN0SURNYXAuZ2V0KG9iaik7XG4gICAgICB9XG4gICAgICB2YXIgaWQgPSB0aGlzLm5leHRJRDtcbiAgICAgIHRoaXMub2JqZWN0SURNYXAuc2V0KG9iaiwgaWQpO1xuICAgICAgdGhpcy5uZXh0SUQgKz0gMTtcbiAgICAgIHJldHVybiBpZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY2xlYXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcbiAgICAgIGlmICh0aGlzLmFjY2Vzc0JlYXQgPiAxMDAwMCkge1xuICAgICAgICB2YXIgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdGhpcy5sYXN0QWNjZXNzQmVhdC5mb3JFYWNoKGZ1bmN0aW9uIChiZWF0LCBrZXkpIHtcbiAgICAgICAgICBpZiAobm93IC0gYmVhdCA+IEJFQVRfTElNSVQpIHtcbiAgICAgICAgICAgIF90aGlzMi5tYXAuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICBfdGhpczIubGFzdEFjY2Vzc0JlYXQuZGVsZXRlKGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hY2Nlc3NCZWF0ID0gMDtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIEFycmF5S2V5TWFwO1xufSgpO1xudmFyIHVuaXF1ZU1hcCA9IG5ldyBBcnJheUtleU1hcCgpO1xuXG4vKipcbiAqIExpa2UgYHVzZU1lbW9gLCBidXQgdGhpcyBob29rIHJlc3VsdCB3aWxsIGJlIHNoYXJlZCBhY3Jvc3MgYWxsIGluc3RhbmNlcy5cbiAqL1xuZnVuY3Rpb24gdXNlVW5pcXVlTWVtbyhtZW1vRm4sIGRlcHMpIHtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBjYWNoZWRWYWx1ZSA9IHVuaXF1ZU1hcC5nZXQoZGVwcyk7XG4gICAgaWYgKGNhY2hlZFZhbHVlKSB7XG4gICAgICByZXR1cm4gY2FjaGVkVmFsdWU7XG4gICAgfVxuICAgIHZhciBuZXdWYWx1ZSA9IG1lbW9GbigpO1xuICAgIHVuaXF1ZU1hcC5zZXQoZGVwcywgbmV3VmFsdWUpO1xuICAgIHJldHVybiBuZXdWYWx1ZTtcbiAgfSwgZGVwcyk7XG59XG5leHBvcnQgZGVmYXVsdCB1c2VVbmlxdWVNZW1vOyIsICIvKipcbiAqIFByb3ZpZGUgYSBkZWZhdWx0IGhvb2sgc2luY2Ugbm90IGV2ZXJ5b25lIG5lZWRzIHRvIGNvbmZpZyB0aGlzLlxuICovXG52YXIgdXNlRGVmYXVsdENTUCA9IGZ1bmN0aW9uIHVzZURlZmF1bHRDU1AoKSB7XG4gIHJldHVybiB7fTtcbn07XG5leHBvcnQgZGVmYXVsdCB1c2VEZWZhdWx0Q1NQOyIsICJleHBvcnQgY29uc3QgUHJlc2V0Q29sb3JzID0gWydibHVlJywgJ3B1cnBsZScsICdjeWFuJywgJ2dyZWVuJywgJ21hZ2VudGEnLCAncGluaycsICdyZWQnLCAnb3JhbmdlJywgJ3llbGxvdycsICd2b2xjYW5vJywgJ2dlZWtibHVlJywgJ2xpbWUnLCAnZ29sZCddOyIsICJ2YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNhY2hlVG9rZW4gfSBmcm9tICdAYW50LWRlc2lnbi9jc3NpbmpzJztcbmltcG9ydCB2ZXJzaW9uIGZyb20gJy4uL3ZlcnNpb24nO1xuaW1wb3J0IHsgZGVmYXVsdFRoZW1lLCBEZXNpZ25Ub2tlbkNvbnRleHQgfSBmcm9tICcuL2NvbnRleHQnO1xuaW1wb3J0IGRlZmF1bHRTZWVkVG9rZW4gZnJvbSAnLi90aGVtZXMvc2VlZCc7XG5pbXBvcnQgZm9ybWF0VG9rZW4gZnJvbSAnLi91dGlsL2FsaWFzJztcbmV4cG9ydCBjb25zdCB1bml0bGVzcyA9IHtcbiAgbGluZUhlaWdodDogdHJ1ZSxcbiAgbGluZUhlaWdodFNNOiB0cnVlLFxuICBsaW5lSGVpZ2h0TEc6IHRydWUsXG4gIGxpbmVIZWlnaHRIZWFkaW5nMTogdHJ1ZSxcbiAgbGluZUhlaWdodEhlYWRpbmcyOiB0cnVlLFxuICBsaW5lSGVpZ2h0SGVhZGluZzM6IHRydWUsXG4gIGxpbmVIZWlnaHRIZWFkaW5nNDogdHJ1ZSxcbiAgbGluZUhlaWdodEhlYWRpbmc1OiB0cnVlLFxuICBvcGFjaXR5TG9hZGluZzogdHJ1ZSxcbiAgZm9udFdlaWdodFN0cm9uZzogdHJ1ZSxcbiAgekluZGV4UG9wdXBCYXNlOiB0cnVlLFxuICB6SW5kZXhCYXNlOiB0cnVlLFxuICBvcGFjaXR5SW1hZ2U6IHRydWVcbn07XG5leHBvcnQgY29uc3QgaWdub3JlID0ge1xuICBzaXplOiB0cnVlLFxuICBzaXplU006IHRydWUsXG4gIHNpemVMRzogdHJ1ZSxcbiAgc2l6ZU1EOiB0cnVlLFxuICBzaXplWFM6IHRydWUsXG4gIHNpemVYWFM6IHRydWUsXG4gIHNpemVNUzogdHJ1ZSxcbiAgc2l6ZVhMOiB0cnVlLFxuICBzaXplWFhMOiB0cnVlLFxuICBzaXplVW5pdDogdHJ1ZSxcbiAgc2l6ZVN0ZXA6IHRydWUsXG4gIG1vdGlvbkJhc2U6IHRydWUsXG4gIG1vdGlvblVuaXQ6IHRydWVcbn07XG5jb25zdCBwcmVzZXJ2ZSA9IHtcbiAgc2NyZWVuWFM6IHRydWUsXG4gIHNjcmVlblhTTWluOiB0cnVlLFxuICBzY3JlZW5YU01heDogdHJ1ZSxcbiAgc2NyZWVuU006IHRydWUsXG4gIHNjcmVlblNNTWluOiB0cnVlLFxuICBzY3JlZW5TTU1heDogdHJ1ZSxcbiAgc2NyZWVuTUQ6IHRydWUsXG4gIHNjcmVlbk1ETWluOiB0cnVlLFxuICBzY3JlZW5NRE1heDogdHJ1ZSxcbiAgc2NyZWVuTEc6IHRydWUsXG4gIHNjcmVlbkxHTWluOiB0cnVlLFxuICBzY3JlZW5MR01heDogdHJ1ZSxcbiAgc2NyZWVuWEw6IHRydWUsXG4gIHNjcmVlblhMTWluOiB0cnVlLFxuICBzY3JlZW5YTE1heDogdHJ1ZSxcbiAgc2NyZWVuWFhMOiB0cnVlLFxuICBzY3JlZW5YWExNaW46IHRydWVcbn07XG5leHBvcnQgY29uc3QgZ2V0Q29tcHV0ZWRUb2tlbiA9IChvcmlnaW5Ub2tlbiwgb3ZlcnJpZGVUb2tlbiwgdGhlbWUpID0+IHtcbiAgY29uc3QgZGVyaXZhdGl2ZVRva2VuID0gdGhlbWUuZ2V0RGVyaXZhdGl2ZVRva2VuKG9yaWdpblRva2VuKTtcbiAgY29uc3Qge1xuICAgICAgb3ZlcnJpZGVcbiAgICB9ID0gb3ZlcnJpZGVUb2tlbixcbiAgICBjb21wb25lbnRzID0gX19yZXN0KG92ZXJyaWRlVG9rZW4sIFtcIm92ZXJyaWRlXCJdKTtcbiAgLy8gTWVyZ2Ugd2l0aCBvdmVycmlkZVxuICBsZXQgbWVyZ2VkRGVyaXZhdGl2ZVRva2VuID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkZXJpdmF0aXZlVG9rZW4pLCB7XG4gICAgb3ZlcnJpZGVcbiAgfSk7XG4gIC8vIEZvcm1hdCBpZiBuZWVkZWRcbiAgbWVyZ2VkRGVyaXZhdGl2ZVRva2VuID0gZm9ybWF0VG9rZW4obWVyZ2VkRGVyaXZhdGl2ZVRva2VuKTtcbiAgaWYgKGNvbXBvbmVudHMpIHtcbiAgICBPYmplY3QuZW50cmllcyhjb21wb25lbnRzKS5mb3JFYWNoKF9yZWYgPT4ge1xuICAgICAgbGV0IFtrZXksIHZhbHVlXSA9IF9yZWY7XG4gICAgICBjb25zdCB7XG4gICAgICAgICAgdGhlbWU6IGNvbXBvbmVudFRoZW1lXG4gICAgICAgIH0gPSB2YWx1ZSxcbiAgICAgICAgY29tcG9uZW50VG9rZW5zID0gX19yZXN0KHZhbHVlLCBbXCJ0aGVtZVwiXSk7XG4gICAgICBsZXQgbWVyZ2VkQ29tcG9uZW50VG9rZW4gPSBjb21wb25lbnRUb2tlbnM7XG4gICAgICBpZiAoY29tcG9uZW50VGhlbWUpIHtcbiAgICAgICAgbWVyZ2VkQ29tcG9uZW50VG9rZW4gPSBnZXRDb21wdXRlZFRva2VuKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgbWVyZ2VkRGVyaXZhdGl2ZVRva2VuKSwgY29tcG9uZW50VG9rZW5zKSwge1xuICAgICAgICAgIG92ZXJyaWRlOiBjb21wb25lbnRUb2tlbnNcbiAgICAgICAgfSwgY29tcG9uZW50VGhlbWUpO1xuICAgICAgfVxuICAgICAgbWVyZ2VkRGVyaXZhdGl2ZVRva2VuW2tleV0gPSBtZXJnZWRDb21wb25lbnRUb2tlbjtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gbWVyZ2VkRGVyaXZhdGl2ZVRva2VuO1xufTtcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSG9vayA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VUb2tlbigpIHtcbiAgY29uc3Qge1xuICAgIHRva2VuOiByb290RGVzaWduVG9rZW4sXG4gICAgaGFzaGVkLFxuICAgIHRoZW1lLFxuICAgIG92ZXJyaWRlLFxuICAgIGNzc1ZhclxuICB9ID0gUmVhY3QudXNlQ29udGV4dChEZXNpZ25Ub2tlbkNvbnRleHQpO1xuICBjb25zdCBzYWx0ID0gYCR7dmVyc2lvbn0tJHtoYXNoZWQgfHwgJyd9YDtcbiAgY29uc3QgbWVyZ2VkVGhlbWUgPSB0aGVtZSB8fCBkZWZhdWx0VGhlbWU7XG4gIGNvbnN0IFt0b2tlbiwgaGFzaElkLCByZWFsVG9rZW5dID0gdXNlQ2FjaGVUb2tlbihtZXJnZWRUaGVtZSwgW2RlZmF1bHRTZWVkVG9rZW4sIHJvb3REZXNpZ25Ub2tlbl0sIHtcbiAgICBzYWx0LFxuICAgIG92ZXJyaWRlLFxuICAgIGdldENvbXB1dGVkVG9rZW4sXG4gICAgLy8gZm9ybWF0VG9rZW4gd2lsbCBub3QgYmUgY29uc3VtZWQgYWZ0ZXIgMS4xNS4wIHdpdGggZ2V0Q29tcHV0ZWRUb2tlbi5cbiAgICAvLyBCdXQgdG9rZW4gd2lsbCBicmVhayBpZiBAYW50LWRlc2lnbi9jc3NpbmpzIGlzIHVuZGVyIDEuMTUuMCB3aXRob3V0IGl0XG4gICAgZm9ybWF0VG9rZW4sXG4gICAgY3NzVmFyOiBjc3NWYXIgJiYge1xuICAgICAgcHJlZml4OiBjc3NWYXIucHJlZml4LFxuICAgICAga2V5OiBjc3NWYXIua2V5LFxuICAgICAgdW5pdGxlc3MsXG4gICAgICBpZ25vcmUsXG4gICAgICBwcmVzZXJ2ZVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiBbbWVyZ2VkVGhlbWUsIHJlYWxUb2tlbiwgaGFzaGVkID8gaGFzaElkIDogJycsIHRva2VuLCBjc3NWYXJdO1xufSIsICJleHBvcnQgZGVmYXVsdCAnNS4yNS4xJzsiLCAiXCJ1c2UgY2xpZW50XCI7XG5cbi8qIGVzbGludCBpbXBvcnQvbm8tdW5yZXNvbHZlZDogMCAqL1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHZlcnNpb24gZnJvbSAnLi92ZXJzaW9uJztcbmV4cG9ydCBkZWZhdWx0IHZlcnNpb247IiwgImltcG9ydCB7IEZhc3RDb2xvciB9IGZyb20gJ0BhbnQtZGVzaWduL2Zhc3QtY29sb3InO1xuZnVuY3Rpb24gaXNTdGFibGVDb2xvcihjb2xvcikge1xuICByZXR1cm4gY29sb3IgPj0gMCAmJiBjb2xvciA8PSAyNTU7XG59XG5mdW5jdGlvbiBnZXRBbHBoYUNvbG9yKGZyb250Q29sb3IsIGJhY2tncm91bmRDb2xvcikge1xuICBjb25zdCB7XG4gICAgcjogZlIsXG4gICAgZzogZkcsXG4gICAgYjogZkIsXG4gICAgYTogb3JpZ2luQWxwaGFcbiAgfSA9IG5ldyBGYXN0Q29sb3IoZnJvbnRDb2xvcikudG9SZ2IoKTtcbiAgaWYgKG9yaWdpbkFscGhhIDwgMSkge1xuICAgIHJldHVybiBmcm9udENvbG9yO1xuICB9XG4gIGNvbnN0IHtcbiAgICByOiBiUixcbiAgICBnOiBiRyxcbiAgICBiOiBiQlxuICB9ID0gbmV3IEZhc3RDb2xvcihiYWNrZ3JvdW5kQ29sb3IpLnRvUmdiKCk7XG4gIGZvciAobGV0IGZBID0gMC4wMTsgZkEgPD0gMTsgZkEgKz0gMC4wMSkge1xuICAgIGNvbnN0IHIgPSBNYXRoLnJvdW5kKChmUiAtIGJSICogKDEgLSBmQSkpIC8gZkEpO1xuICAgIGNvbnN0IGcgPSBNYXRoLnJvdW5kKChmRyAtIGJHICogKDEgLSBmQSkpIC8gZkEpO1xuICAgIGNvbnN0IGIgPSBNYXRoLnJvdW5kKChmQiAtIGJCICogKDEgLSBmQSkpIC8gZkEpO1xuICAgIGlmIChpc1N0YWJsZUNvbG9yKHIpICYmIGlzU3RhYmxlQ29sb3IoZykgJiYgaXNTdGFibGVDb2xvcihiKSkge1xuICAgICAgcmV0dXJuIG5ldyBGYXN0Q29sb3Ioe1xuICAgICAgICByLFxuICAgICAgICBnLFxuICAgICAgICBiLFxuICAgICAgICBhOiBNYXRoLnJvdW5kKGZBICogMTAwKSAvIDEwMFxuICAgICAgfSkudG9SZ2JTdHJpbmcoKTtcbiAgICB9XG4gIH1cbiAgLy8gZmFsbGJhY2tcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgcmV0dXJuIG5ldyBGYXN0Q29sb3Ioe1xuICAgIHI6IGZSLFxuICAgIGc6IGZHLFxuICAgIGI6IGZCLFxuICAgIGE6IDFcbiAgfSkudG9SZ2JTdHJpbmcoKTtcbn1cbmV4cG9ydCBkZWZhdWx0IGdldEFscGhhQ29sb3I7IiwgInZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgeyBGYXN0Q29sb3IgfSBmcm9tICdAYW50LWRlc2lnbi9mYXN0LWNvbG9yJztcbmltcG9ydCBzZWVkVG9rZW4gZnJvbSAnLi4vdGhlbWVzL3NlZWQnO1xuaW1wb3J0IGdldEFscGhhQ29sb3IgZnJvbSAnLi9nZXRBbHBoYUNvbG9yJztcbi8qKlxuICogU2VlZCAoZGVzaWduZXIpID4gRGVyaXZhdGl2ZSAoZGVzaWduZXIpID4gQWxpYXMgKGRldmVsb3BlcikuXG4gKlxuICogTWVyZ2Ugc2VlZCAmIGRlcml2YXRpdmUgJiBvdmVycmlkZSB0b2tlbiBhbmQgZ2VuZXJhdGUgYWxpYXMgdG9rZW4gZm9yIGRldmVsb3Blci5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZm9ybWF0VG9rZW4oZGVyaXZhdGl2ZVRva2VuKSB7XG4gIGNvbnN0IHtcbiAgICAgIG92ZXJyaWRlXG4gICAgfSA9IGRlcml2YXRpdmVUb2tlbixcbiAgICByZXN0VG9rZW4gPSBfX3Jlc3QoZGVyaXZhdGl2ZVRva2VuLCBbXCJvdmVycmlkZVwiXSk7XG4gIGNvbnN0IG92ZXJyaWRlVG9rZW5zID0gT2JqZWN0LmFzc2lnbih7fSwgb3ZlcnJpZGUpO1xuICBPYmplY3Qua2V5cyhzZWVkVG9rZW4pLmZvckVhY2godG9rZW4gPT4ge1xuICAgIGRlbGV0ZSBvdmVycmlkZVRva2Vuc1t0b2tlbl07XG4gIH0pO1xuICBjb25zdCBtZXJnZWRUb2tlbiA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVzdFRva2VuKSwgb3ZlcnJpZGVUb2tlbnMpO1xuICBjb25zdCBzY3JlZW5YUyA9IDQ4MDtcbiAgY29uc3Qgc2NyZWVuU00gPSA1NzY7XG4gIGNvbnN0IHNjcmVlbk1EID0gNzY4O1xuICBjb25zdCBzY3JlZW5MRyA9IDk5MjtcbiAgY29uc3Qgc2NyZWVuWEwgPSAxMjAwO1xuICBjb25zdCBzY3JlZW5YWEwgPSAxNjAwO1xuICAvLyBNb3Rpb25cbiAgaWYgKG1lcmdlZFRva2VuLm1vdGlvbiA9PT0gZmFsc2UpIHtcbiAgICBjb25zdCBmYXN0RHVyYXRpb24gPSAnMHMnO1xuICAgIG1lcmdlZFRva2VuLm1vdGlvbkR1cmF0aW9uRmFzdCA9IGZhc3REdXJhdGlvbjtcbiAgICBtZXJnZWRUb2tlbi5tb3Rpb25EdXJhdGlvbk1pZCA9IGZhc3REdXJhdGlvbjtcbiAgICBtZXJnZWRUb2tlbi5tb3Rpb25EdXJhdGlvblNsb3cgPSBmYXN0RHVyYXRpb247XG4gIH1cbiAgLy8gR2VuZXJhdGUgYWxpYXMgdG9rZW5cbiAgY29uc3QgYWxpYXNUb2tlbiA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBtZXJnZWRUb2tlbiksIHtcbiAgICAvLyA9PT09PT09PT09PT09PSBCYWNrZ3JvdW5kID09PT09PT09PT09PT09IC8vXG4gICAgY29sb3JGaWxsQ29udGVudDogbWVyZ2VkVG9rZW4uY29sb3JGaWxsU2Vjb25kYXJ5LFxuICAgIGNvbG9yRmlsbENvbnRlbnRIb3ZlcjogbWVyZ2VkVG9rZW4uY29sb3JGaWxsLFxuICAgIGNvbG9yRmlsbEFsdGVyOiBtZXJnZWRUb2tlbi5jb2xvckZpbGxRdWF0ZXJuYXJ5LFxuICAgIGNvbG9yQmdDb250YWluZXJEaXNhYmxlZDogbWVyZ2VkVG9rZW4uY29sb3JGaWxsVGVydGlhcnksXG4gICAgLy8gPT09PT09PT09PT09PT0gU3BsaXQgPT09PT09PT09PT09PT0gLy9cbiAgICBjb2xvckJvcmRlckJnOiBtZXJnZWRUb2tlbi5jb2xvckJnQ29udGFpbmVyLFxuICAgIGNvbG9yU3BsaXQ6IGdldEFscGhhQ29sb3IobWVyZ2VkVG9rZW4uY29sb3JCb3JkZXJTZWNvbmRhcnksIG1lcmdlZFRva2VuLmNvbG9yQmdDb250YWluZXIpLFxuICAgIC8vID09PT09PT09PT09PT09IFRleHQgPT09PT09PT09PT09PT0gLy9cbiAgICBjb2xvclRleHRQbGFjZWhvbGRlcjogbWVyZ2VkVG9rZW4uY29sb3JUZXh0UXVhdGVybmFyeSxcbiAgICBjb2xvclRleHREaXNhYmxlZDogbWVyZ2VkVG9rZW4uY29sb3JUZXh0UXVhdGVybmFyeSxcbiAgICBjb2xvclRleHRIZWFkaW5nOiBtZXJnZWRUb2tlbi5jb2xvclRleHQsXG4gICAgY29sb3JUZXh0TGFiZWw6IG1lcmdlZFRva2VuLmNvbG9yVGV4dFNlY29uZGFyeSxcbiAgICBjb2xvclRleHREZXNjcmlwdGlvbjogbWVyZ2VkVG9rZW4uY29sb3JUZXh0VGVydGlhcnksXG4gICAgY29sb3JUZXh0TGlnaHRTb2xpZDogbWVyZ2VkVG9rZW4uY29sb3JXaGl0ZSxcbiAgICBjb2xvckhpZ2hsaWdodDogbWVyZ2VkVG9rZW4uY29sb3JFcnJvcixcbiAgICBjb2xvckJnVGV4dEhvdmVyOiBtZXJnZWRUb2tlbi5jb2xvckZpbGxTZWNvbmRhcnksXG4gICAgY29sb3JCZ1RleHRBY3RpdmU6IG1lcmdlZFRva2VuLmNvbG9yRmlsbCxcbiAgICBjb2xvckljb246IG1lcmdlZFRva2VuLmNvbG9yVGV4dFRlcnRpYXJ5LFxuICAgIGNvbG9ySWNvbkhvdmVyOiBtZXJnZWRUb2tlbi5jb2xvclRleHQsXG4gICAgY29sb3JFcnJvck91dGxpbmU6IGdldEFscGhhQ29sb3IobWVyZ2VkVG9rZW4uY29sb3JFcnJvckJnLCBtZXJnZWRUb2tlbi5jb2xvckJnQ29udGFpbmVyKSxcbiAgICBjb2xvcldhcm5pbmdPdXRsaW5lOiBnZXRBbHBoYUNvbG9yKG1lcmdlZFRva2VuLmNvbG9yV2FybmluZ0JnLCBtZXJnZWRUb2tlbi5jb2xvckJnQ29udGFpbmVyKSxcbiAgICAvLyBGb250XG4gICAgZm9udFNpemVJY29uOiBtZXJnZWRUb2tlbi5mb250U2l6ZVNNLFxuICAgIC8vIExpbmVcbiAgICBsaW5lV2lkdGhGb2N1czogbWVyZ2VkVG9rZW4ubGluZVdpZHRoICogMyxcbiAgICAvLyBDb250cm9sXG4gICAgbGluZVdpZHRoOiBtZXJnZWRUb2tlbi5saW5lV2lkdGgsXG4gICAgY29udHJvbE91dGxpbmVXaWR0aDogbWVyZ2VkVG9rZW4ubGluZVdpZHRoICogMixcbiAgICAvLyBDaGVja2JveCBzaXplIGFuZCBleHBhbmQgaWNvbiBzaXplXG4gICAgY29udHJvbEludGVyYWN0aXZlU2l6ZTogbWVyZ2VkVG9rZW4uY29udHJvbEhlaWdodCAvIDIsXG4gICAgY29udHJvbEl0ZW1CZ0hvdmVyOiBtZXJnZWRUb2tlbi5jb2xvckZpbGxUZXJ0aWFyeSxcbiAgICBjb250cm9sSXRlbUJnQWN0aXZlOiBtZXJnZWRUb2tlbi5jb2xvclByaW1hcnlCZyxcbiAgICBjb250cm9sSXRlbUJnQWN0aXZlSG92ZXI6IG1lcmdlZFRva2VuLmNvbG9yUHJpbWFyeUJnSG92ZXIsXG4gICAgY29udHJvbEl0ZW1CZ0FjdGl2ZURpc2FibGVkOiBtZXJnZWRUb2tlbi5jb2xvckZpbGwsXG4gICAgY29udHJvbFRtcE91dGxpbmU6IG1lcmdlZFRva2VuLmNvbG9yRmlsbFF1YXRlcm5hcnksXG4gICAgY29udHJvbE91dGxpbmU6IGdldEFscGhhQ29sb3IobWVyZ2VkVG9rZW4uY29sb3JQcmltYXJ5QmcsIG1lcmdlZFRva2VuLmNvbG9yQmdDb250YWluZXIpLFxuICAgIGxpbmVUeXBlOiBtZXJnZWRUb2tlbi5saW5lVHlwZSxcbiAgICBib3JkZXJSYWRpdXM6IG1lcmdlZFRva2VuLmJvcmRlclJhZGl1cyxcbiAgICBib3JkZXJSYWRpdXNYUzogbWVyZ2VkVG9rZW4uYm9yZGVyUmFkaXVzWFMsXG4gICAgYm9yZGVyUmFkaXVzU006IG1lcmdlZFRva2VuLmJvcmRlclJhZGl1c1NNLFxuICAgIGJvcmRlclJhZGl1c0xHOiBtZXJnZWRUb2tlbi5ib3JkZXJSYWRpdXNMRyxcbiAgICBmb250V2VpZ2h0U3Ryb25nOiA2MDAsXG4gICAgb3BhY2l0eUxvYWRpbmc6IDAuNjUsXG4gICAgbGlua0RlY29yYXRpb246ICdub25lJyxcbiAgICBsaW5rSG92ZXJEZWNvcmF0aW9uOiAnbm9uZScsXG4gICAgbGlua0ZvY3VzRGVjb3JhdGlvbjogJ25vbmUnLFxuICAgIGNvbnRyb2xQYWRkaW5nSG9yaXpvbnRhbDogMTIsXG4gICAgY29udHJvbFBhZGRpbmdIb3Jpem9udGFsU006IDgsXG4gICAgcGFkZGluZ1hYUzogbWVyZ2VkVG9rZW4uc2l6ZVhYUyxcbiAgICBwYWRkaW5nWFM6IG1lcmdlZFRva2VuLnNpemVYUyxcbiAgICBwYWRkaW5nU006IG1lcmdlZFRva2VuLnNpemVTTSxcbiAgICBwYWRkaW5nOiBtZXJnZWRUb2tlbi5zaXplLFxuICAgIHBhZGRpbmdNRDogbWVyZ2VkVG9rZW4uc2l6ZU1ELFxuICAgIHBhZGRpbmdMRzogbWVyZ2VkVG9rZW4uc2l6ZUxHLFxuICAgIHBhZGRpbmdYTDogbWVyZ2VkVG9rZW4uc2l6ZVhMLFxuICAgIHBhZGRpbmdDb250ZW50SG9yaXpvbnRhbExHOiBtZXJnZWRUb2tlbi5zaXplTEcsXG4gICAgcGFkZGluZ0NvbnRlbnRWZXJ0aWNhbExHOiBtZXJnZWRUb2tlbi5zaXplTVMsXG4gICAgcGFkZGluZ0NvbnRlbnRIb3Jpem9udGFsOiBtZXJnZWRUb2tlbi5zaXplTVMsXG4gICAgcGFkZGluZ0NvbnRlbnRWZXJ0aWNhbDogbWVyZ2VkVG9rZW4uc2l6ZVNNLFxuICAgIHBhZGRpbmdDb250ZW50SG9yaXpvbnRhbFNNOiBtZXJnZWRUb2tlbi5zaXplLFxuICAgIHBhZGRpbmdDb250ZW50VmVydGljYWxTTTogbWVyZ2VkVG9rZW4uc2l6ZVhTLFxuICAgIG1hcmdpblhYUzogbWVyZ2VkVG9rZW4uc2l6ZVhYUyxcbiAgICBtYXJnaW5YUzogbWVyZ2VkVG9rZW4uc2l6ZVhTLFxuICAgIG1hcmdpblNNOiBtZXJnZWRUb2tlbi5zaXplU00sXG4gICAgbWFyZ2luOiBtZXJnZWRUb2tlbi5zaXplLFxuICAgIG1hcmdpbk1EOiBtZXJnZWRUb2tlbi5zaXplTUQsXG4gICAgbWFyZ2luTEc6IG1lcmdlZFRva2VuLnNpemVMRyxcbiAgICBtYXJnaW5YTDogbWVyZ2VkVG9rZW4uc2l6ZVhMLFxuICAgIG1hcmdpblhYTDogbWVyZ2VkVG9rZW4uc2l6ZVhYTCxcbiAgICBib3hTaGFkb3c6IGBcbiAgICAgIDAgNnB4IDE2cHggMCByZ2JhKDAsIDAsIDAsIDAuMDgpLFxuICAgICAgMCAzcHggNnB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjEyKSxcbiAgICAgIDAgOXB4IDI4cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4wNSlcbiAgICBgLFxuICAgIGJveFNoYWRvd1NlY29uZGFyeTogYFxuICAgICAgMCA2cHggMTZweCAwIHJnYmEoMCwgMCwgMCwgMC4wOCksXG4gICAgICAwIDNweCA2cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMTIpLFxuICAgICAgMCA5cHggMjhweCA4cHggcmdiYSgwLCAwLCAwLCAwLjA1KVxuICAgIGAsXG4gICAgYm94U2hhZG93VGVydGlhcnk6IGBcbiAgICAgIDAgMXB4IDJweCAwIHJnYmEoMCwgMCwgMCwgMC4wMyksXG4gICAgICAwIDFweCA2cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMDIpLFxuICAgICAgMCAycHggNHB4IDAgcmdiYSgwLCAwLCAwLCAwLjAyKVxuICAgIGAsXG4gICAgc2NyZWVuWFMsXG4gICAgc2NyZWVuWFNNaW46IHNjcmVlblhTLFxuICAgIHNjcmVlblhTTWF4OiBzY3JlZW5TTSAtIDEsXG4gICAgc2NyZWVuU00sXG4gICAgc2NyZWVuU01NaW46IHNjcmVlblNNLFxuICAgIHNjcmVlblNNTWF4OiBzY3JlZW5NRCAtIDEsXG4gICAgc2NyZWVuTUQsXG4gICAgc2NyZWVuTURNaW46IHNjcmVlbk1ELFxuICAgIHNjcmVlbk1ETWF4OiBzY3JlZW5MRyAtIDEsXG4gICAgc2NyZWVuTEcsXG4gICAgc2NyZWVuTEdNaW46IHNjcmVlbkxHLFxuICAgIHNjcmVlbkxHTWF4OiBzY3JlZW5YTCAtIDEsXG4gICAgc2NyZWVuWEwsXG4gICAgc2NyZWVuWExNaW46IHNjcmVlblhMLFxuICAgIHNjcmVlblhMTWF4OiBzY3JlZW5YWEwgLSAxLFxuICAgIHNjcmVlblhYTCxcbiAgICBzY3JlZW5YWExNaW46IHNjcmVlblhYTCxcbiAgICBib3hTaGFkb3dQb3BvdmVyQXJyb3c6ICcycHggMnB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMDUpJyxcbiAgICBib3hTaGFkb3dDYXJkOiBgXG4gICAgICAwIDFweCAycHggLTJweCAke25ldyBGYXN0Q29sb3IoJ3JnYmEoMCwgMCwgMCwgMC4xNiknKS50b1JnYlN0cmluZygpfSxcbiAgICAgIDAgM3B4IDZweCAwICR7bmV3IEZhc3RDb2xvcigncmdiYSgwLCAwLCAwLCAwLjEyKScpLnRvUmdiU3RyaW5nKCl9LFxuICAgICAgMCA1cHggMTJweCA0cHggJHtuZXcgRmFzdENvbG9yKCdyZ2JhKDAsIDAsIDAsIDAuMDkpJykudG9SZ2JTdHJpbmcoKX1cbiAgICBgLFxuICAgIGJveFNoYWRvd0RyYXdlclJpZ2h0OiBgXG4gICAgICAtNnB4IDAgMTZweCAwIHJnYmEoMCwgMCwgMCwgMC4wOCksXG4gICAgICAtM3B4IDAgNnB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjEyKSxcbiAgICAgIC05cHggMCAyOHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMDUpXG4gICAgYCxcbiAgICBib3hTaGFkb3dEcmF3ZXJMZWZ0OiBgXG4gICAgICA2cHggMCAxNnB4IDAgcmdiYSgwLCAwLCAwLCAwLjA4KSxcbiAgICAgIDNweCAwIDZweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4xMiksXG4gICAgICA5cHggMCAyOHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMDUpXG4gICAgYCxcbiAgICBib3hTaGFkb3dEcmF3ZXJVcDogYFxuICAgICAgMCA2cHggMTZweCAwIHJnYmEoMCwgMCwgMCwgMC4wOCksXG4gICAgICAwIDNweCA2cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMTIpLFxuICAgICAgMCA5cHggMjhweCA4cHggcmdiYSgwLCAwLCAwLCAwLjA1KVxuICAgIGAsXG4gICAgYm94U2hhZG93RHJhd2VyRG93bjogYFxuICAgICAgMCAtNnB4IDE2cHggMCByZ2JhKDAsIDAsIDAsIDAuMDgpLFxuICAgICAgMCAtM3B4IDZweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4xMiksXG4gICAgICAwIC05cHggMjhweCA4cHggcmdiYSgwLCAwLCAwLCAwLjA1KVxuICAgIGAsXG4gICAgYm94U2hhZG93VGFic092ZXJmbG93TGVmdDogJ2luc2V0IDEwcHggMCA4cHggLThweCByZ2JhKDAsIDAsIDAsIDAuMDgpJyxcbiAgICBib3hTaGFkb3dUYWJzT3ZlcmZsb3dSaWdodDogJ2luc2V0IC0xMHB4IDAgOHB4IC04cHggcmdiYSgwLCAwLCAwLCAwLjA4KScsXG4gICAgYm94U2hhZG93VGFic092ZXJmbG93VG9wOiAnaW5zZXQgMCAxMHB4IDhweCAtOHB4IHJnYmEoMCwgMCwgMCwgMC4wOCknLFxuICAgIGJveFNoYWRvd1RhYnNPdmVyZmxvd0JvdHRvbTogJ2luc2V0IDAgLTEwcHggOHB4IC04cHggcmdiYSgwLCAwLCAwLCAwLjA4KSdcbiAgfSksIG92ZXJyaWRlVG9rZW5zKTtcbiAgcmV0dXJuIGFsaWFzVG9rZW47XG59IiwgImltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBnZW5TdHlsZVV0aWxzIH0gZnJvbSAnQGFudC1kZXNpZ24vY3NzaW5qcy11dGlscyc7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0LCBkZWZhdWx0SWNvblByZWZpeENscyB9IGZyb20gJy4uLy4uL2NvbmZpZy1wcm92aWRlci9jb250ZXh0JztcbmltcG9ydCB7IGdlbkNvbW1vblN0eWxlLCBnZW5JY29uU3R5bGUsIGdlbkxpbmtTdHlsZSB9IGZyb20gJy4uLy4uL3N0eWxlJztcbmltcG9ydCB1c2VMb2NhbFRva2VuLCB7IHVuaXRsZXNzIH0gZnJvbSAnLi4vdXNlVG9rZW4nO1xuZXhwb3J0IGNvbnN0IHtcbiAgZ2VuU3R5bGVIb29rcyxcbiAgZ2VuQ29tcG9uZW50U3R5bGVIb29rLFxuICBnZW5TdWJTdHlsZUNvbXBvbmVudFxufSA9IGdlblN0eWxlVXRpbHMoe1xuICB1c2VQcmVmaXg6ICgpID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBnZXRQcmVmaXhDbHMsXG4gICAgICBpY29uUHJlZml4Q2xzXG4gICAgfSA9IHVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCk7XG4gICAgY29uc3Qgcm9vdFByZWZpeENscyA9IGdldFByZWZpeENscygpO1xuICAgIHJldHVybiB7XG4gICAgICByb290UHJlZml4Q2xzLFxuICAgICAgaWNvblByZWZpeENsc1xuICAgIH07XG4gIH0sXG4gIHVzZVRva2VuOiAoKSA9PiB7XG4gICAgY29uc3QgW3RoZW1lLCByZWFsVG9rZW4sIGhhc2hJZCwgdG9rZW4sIGNzc1Zhcl0gPSB1c2VMb2NhbFRva2VuKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRoZW1lLFxuICAgICAgcmVhbFRva2VuLFxuICAgICAgaGFzaElkLFxuICAgICAgdG9rZW4sXG4gICAgICBjc3NWYXJcbiAgICB9O1xuICB9LFxuICB1c2VDU1A6ICgpID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBjc3BcbiAgICB9ID0gdXNlQ29udGV4dChDb25maWdDb250ZXh0KTtcbiAgICByZXR1cm4gY3NwICE9PSBudWxsICYmIGNzcCAhPT0gdm9pZCAwID8gY3NwIDoge307XG4gIH0sXG4gIGdldFJlc2V0U3R5bGVzOiAodG9rZW4sIGNvbmZpZykgPT4ge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBsaW5rU3R5bGUgPSBnZW5MaW5rU3R5bGUodG9rZW4pO1xuICAgIHJldHVybiBbbGlua1N0eWxlLCB7XG4gICAgICAnJic6IGxpbmtTdHlsZVxuICAgIH0sIGdlbkljb25TdHlsZSgoX2EgPSBjb25maWcgPT09IG51bGwgfHwgY29uZmlnID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25maWcucHJlZml4Lmljb25QcmVmaXhDbHMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGRlZmF1bHRJY29uUHJlZml4Q2xzKV07XG4gIH0sXG4gIGdldENvbW1vblN0eWxlOiBnZW5Db21tb25TdHlsZSxcbiAgZ2V0Q29tcFVuaXRsZXNzOiAoKSA9PiB1bml0bGVzc1xufSk7IiwgIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgeyB1bml0IH0gZnJvbSAnQGFudC1kZXNpZ24vY3NzaW5qcyc7XG5leHBvcnQgY29uc3QgdGV4dEVsbGlwc2lzID0ge1xuICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gIHdoaXRlU3BhY2U6ICdub3dyYXAnLFxuICB0ZXh0T3ZlcmZsb3c6ICdlbGxpcHNpcydcbn07XG5leHBvcnQgY29uc3QgcmVzZXRDb21wb25lbnQgPSBmdW5jdGlvbiAodG9rZW4pIHtcbiAgbGV0IG5lZWRJbmhlcml0Rm9udEZhbWlseSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG4gIHJldHVybiB7XG4gICAgYm94U2l6aW5nOiAnYm9yZGVyLWJveCcsXG4gICAgbWFyZ2luOiAwLFxuICAgIHBhZGRpbmc6IDAsXG4gICAgY29sb3I6IHRva2VuLmNvbG9yVGV4dCxcbiAgICBmb250U2l6ZTogdG9rZW4uZm9udFNpemUsXG4gICAgLy8gZm9udC12YXJpYW50OiBAZm9udC12YXJpYW50LWJhc2U7XG4gICAgbGluZUhlaWdodDogdG9rZW4ubGluZUhlaWdodCxcbiAgICBsaXN0U3R5bGU6ICdub25lJyxcbiAgICAvLyBmb250LWZlYXR1cmUtc2V0dGluZ3M6IEBmb250LWZlYXR1cmUtc2V0dGluZ3MtYmFzZTtcbiAgICBmb250RmFtaWx5OiBuZWVkSW5oZXJpdEZvbnRGYW1pbHkgPyAnaW5oZXJpdCcgOiB0b2tlbi5mb250RmFtaWx5XG4gIH07XG59O1xuZXhwb3J0IGNvbnN0IHJlc2V0SWNvbiA9ICgpID0+ICh7XG4gIGRpc3BsYXk6ICdpbmxpbmUtZmxleCcsXG4gIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICBjb2xvcjogJ2luaGVyaXQnLFxuICBmb250U3R5bGU6ICdub3JtYWwnLFxuICBsaW5lSGVpZ2h0OiAwLFxuICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICB0ZXh0VHJhbnNmb3JtOiAnbm9uZScsXG4gIC8vIGZvciBTVkcgaWNvbiwgc2VlIGh0dHBzOi8vYmxvZy5wcm90b3R5cHIuaW8vYWxpZ24tc3ZnLWljb25zLXRvLXRleHQtYW5kLXNheS1nb29kYnllLXRvLWZvbnQtaWNvbnMtZDQ0YjNkN2IyNmI0XG4gIHZlcnRpY2FsQWxpZ246ICctMC4xMjVlbScsXG4gIHRleHRSZW5kZXJpbmc6ICdvcHRpbWl6ZUxlZ2liaWxpdHknLFxuICAnLXdlYmtpdC1mb250LXNtb290aGluZyc6ICdhbnRpYWxpYXNlZCcsXG4gICctbW96LW9zeC1mb250LXNtb290aGluZyc6ICdncmF5c2NhbGUnLFxuICAnPiAqJzoge1xuICAgIGxpbmVIZWlnaHQ6IDFcbiAgfSxcbiAgc3ZnOiB7XG4gICAgZGlzcGxheTogJ2lubGluZS1ibG9jaydcbiAgfVxufSk7XG5leHBvcnQgY29uc3QgY2xlYXJGaXggPSAoKSA9PiAoe1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8yMTMwMSNpc3N1ZWNvbW1lbnQtNTgzOTU1MjI5XG4gICcmOjpiZWZvcmUnOiB7XG4gICAgZGlzcGxheTogJ3RhYmxlJyxcbiAgICBjb250ZW50OiAnXCJcIidcbiAgfSxcbiAgJyY6OmFmdGVyJzoge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzIxODY0XG4gICAgZGlzcGxheTogJ3RhYmxlJyxcbiAgICBjbGVhcjogJ2JvdGgnLFxuICAgIGNvbnRlbnQ6ICdcIlwiJ1xuICB9XG59KTtcbmV4cG9ydCBjb25zdCBnZW5MaW5rU3R5bGUgPSB0b2tlbiA9PiAoe1xuICBhOiB7XG4gICAgY29sb3I6IHRva2VuLmNvbG9yTGluayxcbiAgICB0ZXh0RGVjb3JhdGlvbjogdG9rZW4ubGlua0RlY29yYXRpb24sXG4gICAgYmFja2dyb3VuZENvbG9yOiAndHJhbnNwYXJlbnQnLFxuICAgIC8vIHJlbW92ZSB0aGUgZ3JheSBiYWNrZ3JvdW5kIG9uIGFjdGl2ZSBsaW5rcyBpbiBJRSAxMC5cbiAgICBvdXRsaW5lOiAnbm9uZScsXG4gICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgdHJhbnNpdGlvbjogYGNvbG9yICR7dG9rZW4ubW90aW9uRHVyYXRpb25TbG93fWAsXG4gICAgJy13ZWJraXQtdGV4dC1kZWNvcmF0aW9uLXNraXAnOiAnb2JqZWN0cycsXG4gICAgLy8gcmVtb3ZlIGdhcHMgaW4gbGlua3MgdW5kZXJsaW5lIGluIGlPUyA4KyBhbmQgU2FmYXJpIDgrLlxuICAgICcmOmhvdmVyJzoge1xuICAgICAgY29sb3I6IHRva2VuLmNvbG9yTGlua0hvdmVyXG4gICAgfSxcbiAgICAnJjphY3RpdmUnOiB7XG4gICAgICBjb2xvcjogdG9rZW4uY29sb3JMaW5rQWN0aXZlXG4gICAgfSxcbiAgICAnJjphY3RpdmUsICY6aG92ZXInOiB7XG4gICAgICB0ZXh0RGVjb3JhdGlvbjogdG9rZW4ubGlua0hvdmVyRGVjb3JhdGlvbixcbiAgICAgIG91dGxpbmU6IDBcbiAgICB9LFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzIyNTAzXG4gICAgJyY6Zm9jdXMnOiB7XG4gICAgICB0ZXh0RGVjb3JhdGlvbjogdG9rZW4ubGlua0ZvY3VzRGVjb3JhdGlvbixcbiAgICAgIG91dGxpbmU6IDBcbiAgICB9LFxuICAgICcmW2Rpc2FibGVkXSc6IHtcbiAgICAgIGNvbG9yOiB0b2tlbi5jb2xvclRleHREaXNhYmxlZCxcbiAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkJ1xuICAgIH1cbiAgfVxufSk7XG5leHBvcnQgY29uc3QgZ2VuQ29tbW9uU3R5bGUgPSAodG9rZW4sIGNvbXBvbmVudFByZWZpeENscywgcm9vdENscywgcmVzZXRGb250KSA9PiB7XG4gIGNvbnN0IHByZWZpeFNlbGVjdG9yID0gYFtjbGFzc149XCIke2NvbXBvbmVudFByZWZpeENsc31cIl0sIFtjbGFzcyo9XCIgJHtjb21wb25lbnRQcmVmaXhDbHN9XCJdYDtcbiAgY29uc3Qgcm9vdFByZWZpeFNlbGVjdG9yID0gcm9vdENscyA/IGAuJHtyb290Q2xzfWAgOiBwcmVmaXhTZWxlY3RvcjtcbiAgY29uc3QgcmVzZXRTdHlsZSA9IHtcbiAgICBib3hTaXppbmc6ICdib3JkZXItYm94JyxcbiAgICAnJjo6YmVmb3JlLCAmOjphZnRlcic6IHtcbiAgICAgIGJveFNpemluZzogJ2JvcmRlci1ib3gnXG4gICAgfVxuICB9O1xuICBsZXQgcmVzZXRGb250U3R5bGUgPSB7fTtcbiAgaWYgKHJlc2V0Rm9udCAhPT0gZmFsc2UpIHtcbiAgICByZXNldEZvbnRTdHlsZSA9IHtcbiAgICAgIGZvbnRGYW1pbHk6IHRva2VuLmZvbnRGYW1pbHksXG4gICAgICBmb250U2l6ZTogdG9rZW4uZm9udFNpemVcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgW3Jvb3RQcmVmaXhTZWxlY3Rvcl06IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXNldEZvbnRTdHlsZSksIHJlc2V0U3R5bGUpLCB7XG4gICAgICBbcHJlZml4U2VsZWN0b3JdOiByZXNldFN0eWxlXG4gICAgfSlcbiAgfTtcbn07XG5leHBvcnQgY29uc3QgZ2VuRm9jdXNPdXRsaW5lID0gKHRva2VuLCBvZmZzZXQpID0+ICh7XG4gIG91dGxpbmU6IGAke3VuaXQodG9rZW4ubGluZVdpZHRoRm9jdXMpfSBzb2xpZCAke3Rva2VuLmNvbG9yUHJpbWFyeUJvcmRlcn1gLFxuICBvdXRsaW5lT2Zmc2V0OiBvZmZzZXQgIT09IG51bGwgJiYgb2Zmc2V0ICE9PSB2b2lkIDAgPyBvZmZzZXQgOiAxLFxuICB0cmFuc2l0aW9uOiAnb3V0bGluZS1vZmZzZXQgMHMsIG91dGxpbmUgMHMnXG59KTtcbmV4cG9ydCBjb25zdCBnZW5Gb2N1c1N0eWxlID0gKHRva2VuLCBvZmZzZXQpID0+ICh7XG4gICcmOmZvY3VzLXZpc2libGUnOiBPYmplY3QuYXNzaWduKHt9LCBnZW5Gb2N1c091dGxpbmUodG9rZW4sIG9mZnNldCkpXG59KTtcbmV4cG9ydCBjb25zdCBnZW5JY29uU3R5bGUgPSBpY29uUHJlZml4Q2xzID0+ICh7XG4gIFtgLiR7aWNvblByZWZpeENsc31gXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXNldEljb24oKSksIHtcbiAgICBbYC4ke2ljb25QcmVmaXhDbHN9IC4ke2ljb25QcmVmaXhDbHN9LWljb25gXToge1xuICAgICAgZGlzcGxheTogJ2Jsb2NrJ1xuICAgIH1cbiAgfSlcbn0pO1xuZXhwb3J0IGNvbnN0IG9wZXJhdGlvblVuaXQgPSB0b2tlbiA9PiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe1xuICAvLyBGSVhNRTogVGhpcyB1c2UgbGluayBidXQgaXMgYSBvcGVyYXRpb24gdW5pdC4gU2VlbXMgc2hvdWxkIGJlIGEgY29sb3JQcmltYXJ5LlxuICAvLyBBbmQgVHlwb2dyYXBoeSB1c2UgdGhpcyB0byBnZW5lcmF0ZSBsaW5rIHN0eWxlIHdoaWNoIHNob3VsZCBub3QgZG8gdGhpcy5cbiAgY29sb3I6IHRva2VuLmNvbG9yTGluayxcbiAgdGV4dERlY29yYXRpb246IHRva2VuLmxpbmtEZWNvcmF0aW9uLFxuICBvdXRsaW5lOiAnbm9uZScsXG4gIGN1cnNvcjogJ3BvaW50ZXInLFxuICB0cmFuc2l0aW9uOiBgYWxsICR7dG9rZW4ubW90aW9uRHVyYXRpb25TbG93fWAsXG4gIGJvcmRlcjogMCxcbiAgcGFkZGluZzogMCxcbiAgYmFja2dyb3VuZDogJ25vbmUnLFxuICB1c2VyU2VsZWN0OiAnbm9uZSdcbn0sIGdlbkZvY3VzU3R5bGUodG9rZW4pKSwge1xuICAnJjpmb2N1cywgJjpob3Zlcic6IHtcbiAgICBjb2xvcjogdG9rZW4uY29sb3JMaW5rSG92ZXJcbiAgfSxcbiAgJyY6YWN0aXZlJzoge1xuICAgIGNvbG9yOiB0b2tlbi5jb2xvckxpbmtBY3RpdmVcbiAgfVxufSk7IiwgImltcG9ydCB7IFByZXNldENvbG9ycyB9IGZyb20gJy4uL2ludGVyZmFjZSc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZW5QcmVzZXRDb2xvcih0b2tlbiwgZ2VuQ3NzKSB7XG4gIHJldHVybiBQcmVzZXRDb2xvcnMucmVkdWNlKChwcmV2LCBjb2xvcktleSkgPT4ge1xuICAgIGNvbnN0IGxpZ2h0Q29sb3IgPSB0b2tlbltgJHtjb2xvcktleX0xYF07XG4gICAgY29uc3QgbGlnaHRCb3JkZXJDb2xvciA9IHRva2VuW2Ake2NvbG9yS2V5fTNgXTtcbiAgICBjb25zdCBkYXJrQ29sb3IgPSB0b2tlbltgJHtjb2xvcktleX02YF07XG4gICAgY29uc3QgdGV4dENvbG9yID0gdG9rZW5bYCR7Y29sb3JLZXl9N2BdO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZXYpLCBnZW5Dc3MoY29sb3JLZXksIHtcbiAgICAgIGxpZ2h0Q29sb3IsXG4gICAgICBsaWdodEJvcmRlckNvbG9yLFxuICAgICAgZGFya0NvbG9yLFxuICAgICAgdGV4dENvbG9yXG4gICAgfSkpO1xuICB9LCB7fSk7XG59IiwgImltcG9ydCB7IHVzZVN0eWxlUmVnaXN0ZXIgfSBmcm9tICdAYW50LWRlc2lnbi9jc3NpbmpzJztcbmltcG9ydCB7IGdlbkljb25TdHlsZSB9IGZyb20gJy4uLy4uL3N0eWxlJztcbmltcG9ydCB1c2VUb2tlbiBmcm9tICcuLi91c2VUb2tlbic7XG5jb25zdCB1c2VSZXNldEljb25TdHlsZSA9IChpY29uUHJlZml4Q2xzLCBjc3ApID0+IHtcbiAgY29uc3QgW3RoZW1lLCB0b2tlbl0gPSB1c2VUb2tlbigpO1xuICAvLyBHZW5lcmF0ZSBzdHlsZSBmb3IgaWNvbnNcbiAgcmV0dXJuIHVzZVN0eWxlUmVnaXN0ZXIoe1xuICAgIHRoZW1lLFxuICAgIHRva2VuLFxuICAgIGhhc2hJZDogJycsXG4gICAgcGF0aDogWydhbnQtZGVzaWduLWljb25zJywgaWNvblByZWZpeENsc10sXG4gICAgbm9uY2U6ICgpID0+IGNzcCA9PT0gbnVsbCB8fCBjc3AgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNzcC5ub25jZSxcbiAgICBsYXllcjoge1xuICAgICAgbmFtZTogJ2FudGQnXG4gICAgfVxuICB9LCAoKSA9PiBbZ2VuSWNvblN0eWxlKGljb25QcmVmaXhDbHMpXSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgdXNlUmVzZXRJY29uU3R5bGU7IiwgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmNvbnN0IGZ1bGxDbG9uZSA9IE9iamVjdC5hc3NpZ24oe30sIFJlYWN0KTtcbmNvbnN0IHtcbiAgdXNlSWRcbn0gPSBmdWxsQ2xvbmU7XG5jb25zdCB1c2VFbXB0eUlkID0gKCkgPT4gJyc7XG5jb25zdCB1c2VUaGVtZUtleSA9IHR5cGVvZiB1c2VJZCA9PT0gJ3VuZGVmaW5lZCcgPyB1c2VFbXB0eUlkIDogdXNlSWQ7XG5leHBvcnQgZGVmYXVsdCB1c2VUaGVtZUtleTsiLCAiaW1wb3J0IHVzZU1lbW8gZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlTWVtb1wiO1xuaW1wb3J0IGlzRXF1YWwgZnJvbSBcInJjLXV0aWwvZXMvaXNFcXVhbFwiO1xuaW1wb3J0IHsgZGV2VXNlV2FybmluZyB9IGZyb20gJy4uLy4uL191dGlsL3dhcm5pbmcnO1xuaW1wb3J0IHsgZGVmYXVsdENvbmZpZyB9IGZyb20gJy4uLy4uL3RoZW1lL2ludGVybmFsJztcbmltcG9ydCB1c2VUaGVtZUtleSBmcm9tICcuL3VzZVRoZW1lS2V5JztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVRoZW1lKHRoZW1lLCBwYXJlbnRUaGVtZSwgY29uZmlnKSB7XG4gIHZhciBfYSwgX2I7XG4gIGNvbnN0IHdhcm5pbmcgPSBkZXZVc2VXYXJuaW5nKCdDb25maWdQcm92aWRlcicpO1xuICBjb25zdCB0aGVtZUNvbmZpZyA9IHRoZW1lIHx8IHt9O1xuICBjb25zdCBwYXJlbnRUaGVtZUNvbmZpZyA9IHRoZW1lQ29uZmlnLmluaGVyaXQgPT09IGZhbHNlIHx8ICFwYXJlbnRUaGVtZSA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdENvbmZpZyksIHtcbiAgICBoYXNoZWQ6IChfYSA9IHBhcmVudFRoZW1lID09PSBudWxsIHx8IHBhcmVudFRoZW1lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJlbnRUaGVtZS5oYXNoZWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGRlZmF1bHRDb25maWcuaGFzaGVkLFxuICAgIGNzc1ZhcjogcGFyZW50VGhlbWUgPT09IG51bGwgfHwgcGFyZW50VGhlbWUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmVudFRoZW1lLmNzc1ZhclxuICB9KSA6IHBhcmVudFRoZW1lO1xuICBjb25zdCB0aGVtZUtleSA9IHVzZVRoZW1lS2V5KCk7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgY29uc3QgY3NzVmFyRW5hYmxlZCA9IHRoZW1lQ29uZmlnLmNzc1ZhciB8fCBwYXJlbnRUaGVtZUNvbmZpZy5jc3NWYXI7XG4gICAgY29uc3QgdmFsaWRLZXkgPSAhISh0eXBlb2YgdGhlbWVDb25maWcuY3NzVmFyID09PSAnb2JqZWN0JyAmJiAoKF9iID0gdGhlbWVDb25maWcuY3NzVmFyKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Iua2V5KSB8fCB0aGVtZUtleSk7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyghY3NzVmFyRW5hYmxlZCB8fCB2YWxpZEtleSwgJ2JyZWFraW5nJywgJ01pc3Npbmcga2V5IGluIGBjc3NWYXJgIGNvbmZpZy4gUGxlYXNlIHVwZ3JhZGUgdG8gUmVhY3QgMTggb3Igc2V0IGBjc3NWYXIua2V5YCBtYW51YWxseSBpbiBlYWNoIENvbmZpZ1Byb3ZpZGVyIGluc2lkZSBgY3NzVmFyYCBlbmFibGVkIENvbmZpZ1Byb3ZpZGVyLicpIDogdm9pZCAwO1xuICB9XG4gIHJldHVybiB1c2VNZW1vKCgpID0+IHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIGlmICghdGhlbWUpIHtcbiAgICAgIHJldHVybiBwYXJlbnRUaGVtZTtcbiAgICB9XG4gICAgLy8gT3ZlcnJpZGVcbiAgICBjb25zdCBtZXJnZWRDb21wb25lbnRzID0gT2JqZWN0LmFzc2lnbih7fSwgcGFyZW50VGhlbWVDb25maWcuY29tcG9uZW50cyk7XG4gICAgT2JqZWN0LmtleXModGhlbWUuY29tcG9uZW50cyB8fCB7fSkuZm9yRWFjaChjb21wb25lbnROYW1lID0+IHtcbiAgICAgIG1lcmdlZENvbXBvbmVudHNbY29tcG9uZW50TmFtZV0gPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG1lcmdlZENvbXBvbmVudHNbY29tcG9uZW50TmFtZV0pLCB0aGVtZS5jb21wb25lbnRzW2NvbXBvbmVudE5hbWVdKTtcbiAgICB9KTtcbiAgICBjb25zdCBjc3NWYXJLZXkgPSBgY3NzLXZhci0ke3RoZW1lS2V5LnJlcGxhY2UoLzovZywgJycpfWA7XG4gICAgY29uc3QgbWVyZ2VkQ3NzVmFyID0gKChfYSA9IHRoZW1lQ29uZmlnLmNzc1ZhcikgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogcGFyZW50VGhlbWVDb25maWcuY3NzVmFyKSAmJiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7XG4gICAgICBwcmVmaXg6IGNvbmZpZyA9PT0gbnVsbCB8fCBjb25maWcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmZpZy5wcmVmaXhDbHNcbiAgICB9LCB0eXBlb2YgcGFyZW50VGhlbWVDb25maWcuY3NzVmFyID09PSAnb2JqZWN0JyA/IHBhcmVudFRoZW1lQ29uZmlnLmNzc1ZhciA6IHt9KSwgdHlwZW9mIHRoZW1lQ29uZmlnLmNzc1ZhciA9PT0gJ29iamVjdCcgPyB0aGVtZUNvbmZpZy5jc3NWYXIgOiB7fSksIHtcbiAgICAgIGtleTogdHlwZW9mIHRoZW1lQ29uZmlnLmNzc1ZhciA9PT0gJ29iamVjdCcgJiYgKChfYiA9IHRoZW1lQ29uZmlnLmNzc1ZhcikgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmtleSkgfHwgY3NzVmFyS2V5XG4gICAgfSk7XG4gICAgLy8gQmFzZSB0b2tlblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcGFyZW50VGhlbWVDb25maWcpLCB0aGVtZUNvbmZpZyksIHtcbiAgICAgIHRva2VuOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHBhcmVudFRoZW1lQ29uZmlnLnRva2VuKSwgdGhlbWVDb25maWcudG9rZW4pLFxuICAgICAgY29tcG9uZW50czogbWVyZ2VkQ29tcG9uZW50cyxcbiAgICAgIGNzc1ZhcjogbWVyZ2VkQ3NzVmFyXG4gICAgfSk7XG4gIH0sIFt0aGVtZUNvbmZpZywgcGFyZW50VGhlbWVDb25maWddLCAocHJldiwgbmV4dCkgPT4gcHJldi5zb21lKChwcmV2VGhlbWUsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgbmV4dFRoZW1lID0gbmV4dFtpbmRleF07XG4gICAgcmV0dXJuICFpc0VxdWFsKHByZXZUaGVtZSwgbmV4dFRoZW1lLCB0cnVlKTtcbiAgfSkpO1xufSIsICJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgUHJvdmlkZXIgYXMgTW90aW9uUHJvdmlkZXIgfSBmcm9tICdyYy1tb3Rpb24nO1xuaW1wb3J0IHsgdXNlVG9rZW4gfSBmcm9tICcuLi90aGVtZS9pbnRlcm5hbCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNb3Rpb25XcmFwcGVyKHByb3BzKSB7XG4gIGNvbnN0IHtcbiAgICBjaGlsZHJlblxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IFssIHRva2VuXSA9IHVzZVRva2VuKCk7XG4gIGNvbnN0IHtcbiAgICBtb3Rpb25cbiAgfSA9IHRva2VuO1xuICBjb25zdCBuZWVkV3JhcE1vdGlvblByb3ZpZGVyUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgbmVlZFdyYXBNb3Rpb25Qcm92aWRlclJlZi5jdXJyZW50ID0gbmVlZFdyYXBNb3Rpb25Qcm92aWRlclJlZi5jdXJyZW50IHx8IG1vdGlvbiA9PT0gZmFsc2U7XG4gIGlmIChuZWVkV3JhcE1vdGlvblByb3ZpZGVyUmVmLmN1cnJlbnQpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTW90aW9uUHJvdmlkZXIsIHtcbiAgICAgIG1vdGlvbjogbW90aW9uXG4gICAgfSwgY2hpbGRyZW4pO1xuICB9XG4gIHJldHVybiBjaGlsZHJlbjtcbn0iLCAiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0L2RlZmF1bHQtcHJvcHMtbWF0Y2gtcHJvcC10eXBlcywgcmVhY3Qvbm8tbXVsdGktY29tcCwgcmVhY3QvcHJvcC10eXBlcyAqL1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgZmluZERPTU5vZGUgZnJvbSBcInJjLXV0aWwvZXMvRG9tL2ZpbmRET01Ob2RlXCI7XG5pbXBvcnQgeyBmaWxsUmVmLCBnZXROb2RlUmVmLCBzdXBwb3J0UmVmIH0gZnJvbSBcInJjLXV0aWwvZXMvcmVmXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIi4vY29udGV4dFwiO1xuaW1wb3J0IERvbVdyYXBwZXIgZnJvbSBcIi4vRG9tV3JhcHBlclwiO1xuaW1wb3J0IHVzZVN0YXR1cyBmcm9tIFwiLi9ob29rcy91c2VTdGF0dXNcIjtcbmltcG9ydCB7IGlzQWN0aXZlIH0gZnJvbSBcIi4vaG9va3MvdXNlU3RlcFF1ZXVlXCI7XG5pbXBvcnQgeyBTVEFUVVNfTk9ORSwgU1RFUF9QUkVQQVJFLCBTVEVQX1NUQVJUIH0gZnJvbSBcIi4vaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBnZXRUcmFuc2l0aW9uTmFtZSwgc3VwcG9ydFRyYW5zaXRpb24gfSBmcm9tIFwiLi91dGlsL21vdGlvblwiO1xuLyoqXG4gKiBgdHJhbnNpdGlvblN1cHBvcnRgIGlzIHVzZWQgZm9yIG5vbmUgdHJhbnNpdGlvbiB0ZXN0IGNhc2UuXG4gKiBEZWZhdWx0IHdlIHVzZSBicm93c2VyIHRyYW5zaXRpb24gZXZlbnQgc3VwcG9ydCBjaGVjay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbkNTU01vdGlvbihjb25maWcpIHtcbiAgdmFyIHRyYW5zaXRpb25TdXBwb3J0ID0gY29uZmlnO1xuICBpZiAoX3R5cGVvZihjb25maWcpID09PSAnb2JqZWN0Jykge1xuICAgIHRyYW5zaXRpb25TdXBwb3J0ID0gY29uZmlnLnRyYW5zaXRpb25TdXBwb3J0O1xuICB9XG4gIGZ1bmN0aW9uIGlzU3VwcG9ydFRyYW5zaXRpb24ocHJvcHMsIGNvbnRleHRNb3Rpb24pIHtcbiAgICByZXR1cm4gISEocHJvcHMubW90aW9uTmFtZSAmJiB0cmFuc2l0aW9uU3VwcG9ydCAmJiBjb250ZXh0TW90aW9uICE9PSBmYWxzZSk7XG4gIH1cbiAgdmFyIENTU01vdGlvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gICAgdmFyIF9wcm9wcyR2aXNpYmxlID0gcHJvcHMudmlzaWJsZSxcbiAgICAgIHZpc2libGUgPSBfcHJvcHMkdmlzaWJsZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyR2aXNpYmxlLFxuICAgICAgX3Byb3BzJHJlbW92ZU9uTGVhdmUgPSBwcm9wcy5yZW1vdmVPbkxlYXZlLFxuICAgICAgcmVtb3ZlT25MZWF2ZSA9IF9wcm9wcyRyZW1vdmVPbkxlYXZlID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJHJlbW92ZU9uTGVhdmUsXG4gICAgICBmb3JjZVJlbmRlciA9IHByb3BzLmZvcmNlUmVuZGVyLFxuICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIG1vdGlvbk5hbWUgPSBwcm9wcy5tb3Rpb25OYW1lLFxuICAgICAgbGVhdmVkQ2xhc3NOYW1lID0gcHJvcHMubGVhdmVkQ2xhc3NOYW1lLFxuICAgICAgZXZlbnRQcm9wcyA9IHByb3BzLmV2ZW50UHJvcHM7XG4gICAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb250ZXh0KSxcbiAgICAgIGNvbnRleHRNb3Rpb24gPSBfUmVhY3QkdXNlQ29udGV4dC5tb3Rpb247XG4gICAgdmFyIHN1cHBvcnRNb3Rpb24gPSBpc1N1cHBvcnRUcmFuc2l0aW9uKHByb3BzLCBjb250ZXh0TW90aW9uKTtcblxuICAgIC8vIFJlZiB0byB0aGUgcmVhY3Qgbm9kZSwgaXQgbWF5IGJlIGEgSFRNTEVsZW1lbnRcbiAgICB2YXIgbm9kZVJlZiA9IHVzZVJlZigpO1xuICAgIC8vIFJlZiB0byB0aGUgZG9tIHdyYXBwZXIgaW4gY2FzZSByZWYgY2FuIG5vdCBwYXNzIHRvIEhUTUxFbGVtZW50XG4gICAgdmFyIHdyYXBwZXJOb2RlUmVmID0gdXNlUmVmKCk7XG4gICAgZnVuY3Rpb24gZ2V0RG9tRWxlbWVudCgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEhlcmUgd2UncmUgYXZvaWRpbmcgY2FsbCBmb3IgZmluZERPTU5vZGUgc2luY2UgaXQncyBkZXByZWNhdGVkXG4gICAgICAgIC8vIGluIHN0cmljdCBtb2RlLiBXZSdyZSBjYWxsaW5nIGl0IG9ubHkgd2hlbiBub2RlIHJlZiBpcyBub3RcbiAgICAgICAgLy8gYW4gaW5zdGFuY2Ugb2YgRE9NIEhUTUxFbGVtZW50LiBPdGhlcndpc2UgdXNlXG4gICAgICAgIC8vIGZpbmRET01Ob2RlIGFzIGEgZmluYWwgcmVzb3J0XG4gICAgICAgIHJldHVybiBub2RlUmVmLmN1cnJlbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/IG5vZGVSZWYuY3VycmVudCA6IGZpbmRET01Ob2RlKHdyYXBwZXJOb2RlUmVmLmN1cnJlbnQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBPbmx5IGhhcHBlbiB3aGVuIGBtb3Rpb25EZWFkbGluZWAgdHJpZ2dlciBidXQgZWxlbWVudCByZW1vdmVkLlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIF91c2VTdGF0dXMgPSB1c2VTdGF0dXMoc3VwcG9ydE1vdGlvbiwgdmlzaWJsZSwgZ2V0RG9tRWxlbWVudCwgcHJvcHMpLFxuICAgICAgX3VzZVN0YXR1czIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdHVzLCA0KSxcbiAgICAgIHN0YXR1cyA9IF91c2VTdGF0dXMyWzBdLFxuICAgICAgc3RhdHVzU3RlcCA9IF91c2VTdGF0dXMyWzFdLFxuICAgICAgc3RhdHVzU3R5bGUgPSBfdXNlU3RhdHVzMlsyXSxcbiAgICAgIG1lcmdlZFZpc2libGUgPSBfdXNlU3RhdHVzMlszXTtcblxuICAgIC8vIFJlY29yZCB3aGV0aGVyIGNvbnRlbnQgaGFzIHJlbmRlcmVkXG4gICAgLy8gV2lsbCByZXR1cm4gbnVsbCBmb3IgdW4tcmVuZGVyZWQgZXZlbiB3aGVuIGByZW1vdmVPbkxlYXZlPXtmYWxzZX1gXG4gICAgdmFyIHJlbmRlcmVkUmVmID0gUmVhY3QudXNlUmVmKG1lcmdlZFZpc2libGUpO1xuICAgIGlmIChtZXJnZWRWaXNpYmxlKSB7XG4gICAgICByZW5kZXJlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09IFJlZnMgPT09PT09PT09PT09PT09PT09PT09PVxuICAgIHZhciBzZXROb2RlUmVmID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIG5vZGVSZWYuY3VycmVudCA9IG5vZGU7XG4gICAgICBmaWxsUmVmKHJlZiwgbm9kZSk7XG4gICAgfSwgW3JlZl0pO1xuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT1cbiAgICB2YXIgbW90aW9uQ2hpbGRyZW47XG4gICAgdmFyIG1lcmdlZFByb3BzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBldmVudFByb3BzKSwge30sIHtcbiAgICAgIHZpc2libGU6IHZpc2libGVcbiAgICB9KTtcbiAgICBpZiAoIWNoaWxkcmVuKSB7XG4gICAgICAvLyBObyBjaGlsZHJlblxuICAgICAgbW90aW9uQ2hpbGRyZW4gPSBudWxsO1xuICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSBTVEFUVVNfTk9ORSkge1xuICAgICAgLy8gU3RhYmxlIGNoaWxkcmVuXG4gICAgICBpZiAobWVyZ2VkVmlzaWJsZSkge1xuICAgICAgICBtb3Rpb25DaGlsZHJlbiA9IGNoaWxkcmVuKF9vYmplY3RTcHJlYWQoe30sIG1lcmdlZFByb3BzKSwgc2V0Tm9kZVJlZik7XG4gICAgICB9IGVsc2UgaWYgKCFyZW1vdmVPbkxlYXZlICYmIHJlbmRlcmVkUmVmLmN1cnJlbnQgJiYgbGVhdmVkQ2xhc3NOYW1lKSB7XG4gICAgICAgIG1vdGlvbkNoaWxkcmVuID0gY2hpbGRyZW4oX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBtZXJnZWRQcm9wcyksIHt9LCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBsZWF2ZWRDbGFzc05hbWVcbiAgICAgICAgfSksIHNldE5vZGVSZWYpO1xuICAgICAgfSBlbHNlIGlmIChmb3JjZVJlbmRlciB8fCAhcmVtb3ZlT25MZWF2ZSAmJiAhbGVhdmVkQ2xhc3NOYW1lKSB7XG4gICAgICAgIG1vdGlvbkNoaWxkcmVuID0gY2hpbGRyZW4oX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBtZXJnZWRQcm9wcyksIHt9LCB7XG4gICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIGRpc3BsYXk6ICdub25lJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSksIHNldE5vZGVSZWYpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbW90aW9uQ2hpbGRyZW4gPSBudWxsO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJbiBtb3Rpb25cbiAgICAgIHZhciBzdGF0dXNTdWZmaXg7XG4gICAgICBpZiAoc3RhdHVzU3RlcCA9PT0gU1RFUF9QUkVQQVJFKSB7XG4gICAgICAgIHN0YXR1c1N1ZmZpeCA9ICdwcmVwYXJlJztcbiAgICAgIH0gZWxzZSBpZiAoaXNBY3RpdmUoc3RhdHVzU3RlcCkpIHtcbiAgICAgICAgc3RhdHVzU3VmZml4ID0gJ2FjdGl2ZSc7XG4gICAgICB9IGVsc2UgaWYgKHN0YXR1c1N0ZXAgPT09IFNURVBfU1RBUlQpIHtcbiAgICAgICAgc3RhdHVzU3VmZml4ID0gJ3N0YXJ0JztcbiAgICAgIH1cbiAgICAgIHZhciBtb3Rpb25DbHMgPSBnZXRUcmFuc2l0aW9uTmFtZShtb3Rpb25OYW1lLCBcIlwiLmNvbmNhdChzdGF0dXMsIFwiLVwiKS5jb25jYXQoc3RhdHVzU3VmZml4KSk7XG4gICAgICBtb3Rpb25DaGlsZHJlbiA9IGNoaWxkcmVuKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgbWVyZ2VkUHJvcHMpLCB7fSwge1xuICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoZ2V0VHJhbnNpdGlvbk5hbWUobW90aW9uTmFtZSwgc3RhdHVzKSwgX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eSh7fSwgbW90aW9uQ2xzLCBtb3Rpb25DbHMgJiYgc3RhdHVzU3VmZml4KSwgbW90aW9uTmFtZSwgdHlwZW9mIG1vdGlvbk5hbWUgPT09ICdzdHJpbmcnKSksXG4gICAgICAgIHN0eWxlOiBzdGF0dXNTdHlsZVxuICAgICAgfSksIHNldE5vZGVSZWYpO1xuICAgIH1cblxuICAgIC8vIEF1dG8gaW5qZWN0IHJlZiBpZiBjaGlsZCBub2RlIG5vdCBoYXZlIGByZWZgIHByb3BzXG4gICAgaWYgKCAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQobW90aW9uQ2hpbGRyZW4pICYmIHN1cHBvcnRSZWYobW90aW9uQ2hpbGRyZW4pKSB7XG4gICAgICB2YXIgb3JpZ2luTm9kZVJlZiA9IGdldE5vZGVSZWYobW90aW9uQ2hpbGRyZW4pO1xuICAgICAgaWYgKCFvcmlnaW5Ob2RlUmVmKSB7XG4gICAgICAgIG1vdGlvbkNoaWxkcmVuID0gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChtb3Rpb25DaGlsZHJlbiwge1xuICAgICAgICAgIHJlZjogc2V0Tm9kZVJlZlxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERvbVdyYXBwZXIsIHtcbiAgICAgIHJlZjogd3JhcHBlck5vZGVSZWZcbiAgICB9LCBtb3Rpb25DaGlsZHJlbik7XG4gIH0pO1xuICBDU1NNb3Rpb24uZGlzcGxheU5hbWUgPSAnQ1NTTW90aW9uJztcbiAgcmV0dXJuIENTU01vdGlvbjtcbn1cbmV4cG9ydCBkZWZhdWx0IGdlbkNTU01vdGlvbihzdXBwb3J0VHJhbnNpdGlvbik7IiwgImltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiY2hpbGRyZW5cIl07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5leHBvcnQgdmFyIENvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh7fSk7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNb3Rpb25Qcm92aWRlcihfcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZiwgX2V4Y2x1ZGVkKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogcHJvcHNcbiAgfSwgY2hpbGRyZW4pO1xufSIsICJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzXCI7XG5pbXBvcnQgX2NyZWF0ZVN1cGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVTdXBlclwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xudmFyIERvbVdyYXBwZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKERvbVdyYXBwZXIsIF9SZWFjdCRDb21wb25lbnQpO1xuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKERvbVdyYXBwZXIpO1xuICBmdW5jdGlvbiBEb21XcmFwcGVyKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBEb21XcmFwcGVyKTtcbiAgICByZXR1cm4gX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cbiAgX2NyZWF0ZUNsYXNzKERvbVdyYXBwZXIsIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbjtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIERvbVdyYXBwZXI7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5leHBvcnQgZGVmYXVsdCBEb21XcmFwcGVyOyIsICJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VFdmVudCBmcm9tIFwiLi91c2VFdmVudFwiO1xuLyoqXG4gKiBTYW1lIGFzIFJlYWN0LnVzZVN0YXRlIGJ1dCB3aWxsIGFsd2F5cyBnZXQgbGF0ZXN0IHN0YXRlLlxuICogVGhpcyBpcyB1c2VmdWwgd2hlbiBSZWFjdCBtZXJnZSBtdWx0aXBsZSBzdGF0ZSB1cGRhdGVzIGludG8gb25lLlxuICogZS5nLiBvblRyYW5zaXRpb25FbmQgdHJpZ2dlciBtdWx0aXBsZSBldmVudCBhdCBvbmNlIHdpbGwgYmUgbWVyZ2VkIHN0YXRlIHVwZGF0ZSBpbiBSZWFjdC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlU3luY1N0YXRlKGRlZmF1bHRWYWx1ZSkge1xuICB2YXIgX1JlYWN0JHVzZVJlZHVjZXIgPSBSZWFjdC51c2VSZWR1Y2VyKGZ1bmN0aW9uICh4KSB7XG4gICAgICByZXR1cm4geCArIDE7XG4gICAgfSwgMCksXG4gICAgX1JlYWN0JHVzZVJlZHVjZXIyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVJlZHVjZXIsIDIpLFxuICAgIGZvcmNlVXBkYXRlID0gX1JlYWN0JHVzZVJlZHVjZXIyWzFdO1xuICB2YXIgY3VycmVudFZhbHVlUmVmID0gUmVhY3QudXNlUmVmKGRlZmF1bHRWYWx1ZSk7XG4gIHZhciBnZXRWYWx1ZSA9IHVzZUV2ZW50KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gY3VycmVudFZhbHVlUmVmLmN1cnJlbnQ7XG4gIH0pO1xuICB2YXIgc2V0VmFsdWUgPSB1c2VFdmVudChmdW5jdGlvbiAodXBkYXRlcikge1xuICAgIGN1cnJlbnRWYWx1ZVJlZi5jdXJyZW50ID0gdHlwZW9mIHVwZGF0ZXIgPT09ICdmdW5jdGlvbicgPyB1cGRhdGVyKGN1cnJlbnRWYWx1ZVJlZi5jdXJyZW50KSA6IHVwZGF0ZXI7XG4gICAgZm9yY2VVcGRhdGUoKTtcbiAgfSk7XG4gIHJldHVybiBbZ2V0VmFsdWUsIHNldFZhbHVlXTtcbn0iLCAiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCB7IHVzZUV2ZW50IH0gZnJvbSAncmMtdXRpbCc7XG5pbXBvcnQgdXNlU3RhdGUgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlU3RhdGVcIjtcbmltcG9ydCB1c2VTeW5jU3RhdGUgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlU3luY1N0YXRlXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFNUQVRVU19BUFBFQVIsIFNUQVRVU19FTlRFUiwgU1RBVFVTX0xFQVZFLCBTVEFUVVNfTk9ORSwgU1RFUF9BQ1RJVkUsIFNURVBfUFJFUEFSRSwgU1RFUF9QUkVQQVJFRCwgU1RFUF9TVEFSVCB9IGZyb20gXCIuLi9pbnRlcmZhY2VcIjtcbmltcG9ydCB1c2VEb21Nb3Rpb25FdmVudHMgZnJvbSBcIi4vdXNlRG9tTW90aW9uRXZlbnRzXCI7XG5pbXBvcnQgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCBmcm9tIFwiLi91c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0XCI7XG5pbXBvcnQgdXNlU3RlcFF1ZXVlLCB7IERvU3RlcCwgaXNBY3RpdmUsIFNraXBTdGVwIH0gZnJvbSBcIi4vdXNlU3RlcFF1ZXVlXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VTdGF0dXMoc3VwcG9ydE1vdGlvbiwgdmlzaWJsZSwgZ2V0RWxlbWVudCwgX3JlZikge1xuICB2YXIgX3JlZiRtb3Rpb25FbnRlciA9IF9yZWYubW90aW9uRW50ZXIsXG4gICAgbW90aW9uRW50ZXIgPSBfcmVmJG1vdGlvbkVudGVyID09PSB2b2lkIDAgPyB0cnVlIDogX3JlZiRtb3Rpb25FbnRlcixcbiAgICBfcmVmJG1vdGlvbkFwcGVhciA9IF9yZWYubW90aW9uQXBwZWFyLFxuICAgIG1vdGlvbkFwcGVhciA9IF9yZWYkbW90aW9uQXBwZWFyID09PSB2b2lkIDAgPyB0cnVlIDogX3JlZiRtb3Rpb25BcHBlYXIsXG4gICAgX3JlZiRtb3Rpb25MZWF2ZSA9IF9yZWYubW90aW9uTGVhdmUsXG4gICAgbW90aW9uTGVhdmUgPSBfcmVmJG1vdGlvbkxlYXZlID09PSB2b2lkIDAgPyB0cnVlIDogX3JlZiRtb3Rpb25MZWF2ZSxcbiAgICBtb3Rpb25EZWFkbGluZSA9IF9yZWYubW90aW9uRGVhZGxpbmUsXG4gICAgbW90aW9uTGVhdmVJbW1lZGlhdGVseSA9IF9yZWYubW90aW9uTGVhdmVJbW1lZGlhdGVseSxcbiAgICBvbkFwcGVhclByZXBhcmUgPSBfcmVmLm9uQXBwZWFyUHJlcGFyZSxcbiAgICBvbkVudGVyUHJlcGFyZSA9IF9yZWYub25FbnRlclByZXBhcmUsXG4gICAgb25MZWF2ZVByZXBhcmUgPSBfcmVmLm9uTGVhdmVQcmVwYXJlLFxuICAgIG9uQXBwZWFyU3RhcnQgPSBfcmVmLm9uQXBwZWFyU3RhcnQsXG4gICAgb25FbnRlclN0YXJ0ID0gX3JlZi5vbkVudGVyU3RhcnQsXG4gICAgb25MZWF2ZVN0YXJ0ID0gX3JlZi5vbkxlYXZlU3RhcnQsXG4gICAgb25BcHBlYXJBY3RpdmUgPSBfcmVmLm9uQXBwZWFyQWN0aXZlLFxuICAgIG9uRW50ZXJBY3RpdmUgPSBfcmVmLm9uRW50ZXJBY3RpdmUsXG4gICAgb25MZWF2ZUFjdGl2ZSA9IF9yZWYub25MZWF2ZUFjdGl2ZSxcbiAgICBvbkFwcGVhckVuZCA9IF9yZWYub25BcHBlYXJFbmQsXG4gICAgb25FbnRlckVuZCA9IF9yZWYub25FbnRlckVuZCxcbiAgICBvbkxlYXZlRW5kID0gX3JlZi5vbkxlYXZlRW5kLFxuICAgIG9uVmlzaWJsZUNoYW5nZWQgPSBfcmVmLm9uVmlzaWJsZUNoYW5nZWQ7XG4gIC8vIFVzZWQgZm9yIG91dGVyIHJlbmRlciB1c2FnZSB0byBhdm9pZCBgdmlzaWJsZTogZmFsc2UgJiBzdGF0dXM6IG5vbmVgIHRvIHJlbmRlciBub3RoaW5nXG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZSgpLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIGFzeW5jVmlzaWJsZSA9IF91c2VTdGF0ZTJbMF0sXG4gICAgc2V0QXN5bmNWaXNpYmxlID0gX3VzZVN0YXRlMlsxXTtcbiAgdmFyIF91c2VTeW5jU3RhdGUgPSB1c2VTeW5jU3RhdGUoU1RBVFVTX05PTkUpLFxuICAgIF91c2VTeW5jU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN5bmNTdGF0ZSwgMiksXG4gICAgZ2V0U3RhdHVzID0gX3VzZVN5bmNTdGF0ZTJbMF0sXG4gICAgc2V0U3RhdHVzID0gX3VzZVN5bmNTdGF0ZTJbMV07XG4gIHZhciBfdXNlU3RhdGUzID0gdXNlU3RhdGUobnVsbCksXG4gICAgX3VzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZTMsIDIpLFxuICAgIHN0eWxlID0gX3VzZVN0YXRlNFswXSxcbiAgICBzZXRTdHlsZSA9IF91c2VTdGF0ZTRbMV07XG4gIHZhciBjdXJyZW50U3RhdHVzID0gZ2V0U3RhdHVzKCk7XG4gIHZhciBtb3VudGVkUmVmID0gdXNlUmVmKGZhbHNlKTtcbiAgdmFyIGRlYWRsaW5lUmVmID0gdXNlUmVmKG51bGwpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBEb20gTm9kZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgZnVuY3Rpb24gZ2V0RG9tRWxlbWVudCgpIHtcbiAgICByZXR1cm4gZ2V0RWxlbWVudCgpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gTW90aW9uIEVuZCA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgYWN0aXZlUmVmID0gdXNlUmVmKGZhbHNlKTtcblxuICAvKipcbiAgICogQ2xlYW4gdXAgc3RhdHVzICYgc3R5bGVcbiAgICovXG4gIGZ1bmN0aW9uIHVwZGF0ZU1vdGlvbkVuZFN0YXR1cygpIHtcbiAgICBzZXRTdGF0dXMoU1RBVFVTX05PTkUpO1xuICAgIHNldFN0eWxlKG51bGwsIHRydWUpO1xuICB9XG4gIHZhciBvbkludGVybmFsTW90aW9uRW5kID0gdXNlRXZlbnQoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgdmFyIHN0YXR1cyA9IGdldFN0YXR1cygpO1xuICAgIC8vIERvIG5vdGhpbmcgc2luY2Ugbm90IGluIGFueSB0cmFuc2l0aW9uIHN0YXR1cy5cbiAgICAvLyBUaGlzIG1heSBoYXBwZW4gd2hlbiBgbW90aW9uRGVhZGxpbmVgIHRyaWdnZXIuXG4gICAgaWYgKHN0YXR1cyA9PT0gU1RBVFVTX05PTkUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGVsZW1lbnQgPSBnZXREb21FbGVtZW50KCk7XG4gICAgaWYgKGV2ZW50ICYmICFldmVudC5kZWFkbGluZSAmJiBldmVudC50YXJnZXQgIT09IGVsZW1lbnQpIHtcbiAgICAgIC8vIGV2ZW50IGV4aXN0c1xuICAgICAgLy8gbm90IGluaXRpYXRlZCBieSBkZWFkbGluZVxuICAgICAgLy8gdHJhbnNpdGlvbkVuZCBub3QgZmlyZWQgYnkgaW5uZXIgZWxlbWVudHNcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGN1cnJlbnRBY3RpdmUgPSBhY3RpdmVSZWYuY3VycmVudDtcbiAgICB2YXIgY2FuRW5kO1xuICAgIGlmIChzdGF0dXMgPT09IFNUQVRVU19BUFBFQVIgJiYgY3VycmVudEFjdGl2ZSkge1xuICAgICAgY2FuRW5kID0gb25BcHBlYXJFbmQgPT09IG51bGwgfHwgb25BcHBlYXJFbmQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQXBwZWFyRW5kKGVsZW1lbnQsIGV2ZW50KTtcbiAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gU1RBVFVTX0VOVEVSICYmIGN1cnJlbnRBY3RpdmUpIHtcbiAgICAgIGNhbkVuZCA9IG9uRW50ZXJFbmQgPT09IG51bGwgfHwgb25FbnRlckVuZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FbnRlckVuZChlbGVtZW50LCBldmVudCk7XG4gICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IFNUQVRVU19MRUFWRSAmJiBjdXJyZW50QWN0aXZlKSB7XG4gICAgICBjYW5FbmQgPSBvbkxlYXZlRW5kID09PSBudWxsIHx8IG9uTGVhdmVFbmQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uTGVhdmVFbmQoZWxlbWVudCwgZXZlbnQpO1xuICAgIH1cblxuICAgIC8vIE9ubHkgdXBkYXRlIHN0YXR1cyB3aGVuIGBjYW5FbmRgIGFuZCBub3QgZGVzdHJveWVkXG4gICAgaWYgKGN1cnJlbnRBY3RpdmUgJiYgY2FuRW5kICE9PSBmYWxzZSkge1xuICAgICAgdXBkYXRlTW90aW9uRW5kU3RhdHVzKCk7XG4gICAgfVxuICB9KTtcbiAgdmFyIF91c2VEb21Nb3Rpb25FdmVudHMgPSB1c2VEb21Nb3Rpb25FdmVudHMob25JbnRlcm5hbE1vdGlvbkVuZCksXG4gICAgX3VzZURvbU1vdGlvbkV2ZW50czIgPSBfc2xpY2VkVG9BcnJheShfdXNlRG9tTW90aW9uRXZlbnRzLCAxKSxcbiAgICBwYXRjaE1vdGlvbkV2ZW50cyA9IF91c2VEb21Nb3Rpb25FdmVudHMyWzBdO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFN0ZXAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGdldEV2ZW50SGFuZGxlcnMgPSBmdW5jdGlvbiBnZXRFdmVudEhhbmRsZXJzKHRhcmdldFN0YXR1cykge1xuICAgIHN3aXRjaCAodGFyZ2V0U3RhdHVzKSB7XG4gICAgICBjYXNlIFNUQVRVU19BUFBFQVI6XG4gICAgICAgIHJldHVybiBfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eSh7fSwgU1RFUF9QUkVQQVJFLCBvbkFwcGVhclByZXBhcmUpLCBTVEVQX1NUQVJULCBvbkFwcGVhclN0YXJ0KSwgU1RFUF9BQ1RJVkUsIG9uQXBwZWFyQWN0aXZlKTtcbiAgICAgIGNhc2UgU1RBVFVTX0VOVEVSOlxuICAgICAgICByZXR1cm4gX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoe30sIFNURVBfUFJFUEFSRSwgb25FbnRlclByZXBhcmUpLCBTVEVQX1NUQVJULCBvbkVudGVyU3RhcnQpLCBTVEVQX0FDVElWRSwgb25FbnRlckFjdGl2ZSk7XG4gICAgICBjYXNlIFNUQVRVU19MRUFWRTpcbiAgICAgICAgcmV0dXJuIF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KHt9LCBTVEVQX1BSRVBBUkUsIG9uTGVhdmVQcmVwYXJlKSwgU1RFUF9TVEFSVCwgb25MZWF2ZVN0YXJ0KSwgU1RFUF9BQ1RJVkUsIG9uTGVhdmVBY3RpdmUpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgfTtcbiAgdmFyIGV2ZW50SGFuZGxlcnMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZ2V0RXZlbnRIYW5kbGVycyhjdXJyZW50U3RhdHVzKTtcbiAgfSwgW2N1cnJlbnRTdGF0dXNdKTtcbiAgdmFyIF91c2VTdGVwUXVldWUgPSB1c2VTdGVwUXVldWUoY3VycmVudFN0YXR1cywgIXN1cHBvcnRNb3Rpb24sIGZ1bmN0aW9uIChuZXdTdGVwKSB7XG4gICAgICAvLyBPbmx5IHByZXBhcmUgc3RlcCBjYW4gYmUgc2tpcFxuICAgICAgaWYgKG5ld1N0ZXAgPT09IFNURVBfUFJFUEFSRSkge1xuICAgICAgICB2YXIgb25QcmVwYXJlID0gZXZlbnRIYW5kbGVyc1tTVEVQX1BSRVBBUkVdO1xuICAgICAgICBpZiAoIW9uUHJlcGFyZSkge1xuICAgICAgICAgIHJldHVybiBTa2lwU3RlcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb25QcmVwYXJlKGdldERvbUVsZW1lbnQoKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlc3Qgc3RlcCBpcyBzeW5jIHVwZGF0ZVxuICAgICAgaWYgKHN0ZXAgaW4gZXZlbnRIYW5kbGVycykge1xuICAgICAgICB2YXIgX2V2ZW50SGFuZGxlcnMkc3RlcDtcbiAgICAgICAgc2V0U3R5bGUoKChfZXZlbnRIYW5kbGVycyRzdGVwID0gZXZlbnRIYW5kbGVyc1tzdGVwXSkgPT09IG51bGwgfHwgX2V2ZW50SGFuZGxlcnMkc3RlcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2V2ZW50SGFuZGxlcnMkc3RlcC5jYWxsKGV2ZW50SGFuZGxlcnMsIGdldERvbUVsZW1lbnQoKSwgbnVsbCkpIHx8IG51bGwpO1xuICAgICAgfVxuICAgICAgaWYgKHN0ZXAgPT09IFNURVBfQUNUSVZFICYmIGN1cnJlbnRTdGF0dXMgIT09IFNUQVRVU19OT05FKSB7XG4gICAgICAgIC8vIFBhdGNoIGV2ZW50cyB3aGVuIG1vdGlvbiBuZWVkZWRcbiAgICAgICAgcGF0Y2hNb3Rpb25FdmVudHMoZ2V0RG9tRWxlbWVudCgpKTtcbiAgICAgICAgaWYgKG1vdGlvbkRlYWRsaW5lID4gMCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dChkZWFkbGluZVJlZi5jdXJyZW50KTtcbiAgICAgICAgICBkZWFkbGluZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBvbkludGVybmFsTW90aW9uRW5kKHtcbiAgICAgICAgICAgICAgZGVhZGxpbmU6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sIG1vdGlvbkRlYWRsaW5lKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHN0ZXAgPT09IFNURVBfUFJFUEFSRUQpIHtcbiAgICAgICAgdXBkYXRlTW90aW9uRW5kU3RhdHVzKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gRG9TdGVwO1xuICAgIH0pLFxuICAgIF91c2VTdGVwUXVldWUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0ZXBRdWV1ZSwgMiksXG4gICAgc3RhcnRTdGVwID0gX3VzZVN0ZXBRdWV1ZTJbMF0sXG4gICAgc3RlcCA9IF91c2VTdGVwUXVldWUyWzFdO1xuICB2YXIgYWN0aXZlID0gaXNBY3RpdmUoc3RlcCk7XG4gIGFjdGl2ZVJlZi5jdXJyZW50ID0gYWN0aXZlO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU3RhdHVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHZpc2libGVSZWYgPSB1c2VSZWYobnVsbCk7XG5cbiAgLy8gVXBkYXRlIHdpdGggbmV3IHN0YXR1c1xuICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAvLyBXaGVuIHVzZSBTdXNwZW5zZSwgdGhlIGB2aXNpYmxlYCB3aWxsIHJlcGVhdCB0cmlnZ2VyLFxuICAgIC8vIEJ1dCBub3QgcmVhbCBjaGFuZ2Ugb2YgdGhlIGB2aXNpYmxlYCwgd2UgbmVlZCB0byBza2lwIGl0LlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzQ0Mzc5XG4gICAgaWYgKG1vdW50ZWRSZWYuY3VycmVudCAmJiB2aXNpYmxlUmVmLmN1cnJlbnQgPT09IHZpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2V0QXN5bmNWaXNpYmxlKHZpc2libGUpO1xuICAgIHZhciBpc01vdW50ZWQgPSBtb3VudGVkUmVmLmN1cnJlbnQ7XG4gICAgbW91bnRlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcblxuICAgIC8vIGlmICghc3VwcG9ydE1vdGlvbikge1xuICAgIC8vICAgcmV0dXJuO1xuICAgIC8vIH1cblxuICAgIHZhciBuZXh0U3RhdHVzO1xuXG4gICAgLy8gQXBwZWFyXG4gICAgaWYgKCFpc01vdW50ZWQgJiYgdmlzaWJsZSAmJiBtb3Rpb25BcHBlYXIpIHtcbiAgICAgIG5leHRTdGF0dXMgPSBTVEFUVVNfQVBQRUFSO1xuICAgIH1cblxuICAgIC8vIEVudGVyXG4gICAgaWYgKGlzTW91bnRlZCAmJiB2aXNpYmxlICYmIG1vdGlvbkVudGVyKSB7XG4gICAgICBuZXh0U3RhdHVzID0gU1RBVFVTX0VOVEVSO1xuICAgIH1cblxuICAgIC8vIExlYXZlXG4gICAgaWYgKGlzTW91bnRlZCAmJiAhdmlzaWJsZSAmJiBtb3Rpb25MZWF2ZSB8fCAhaXNNb3VudGVkICYmIG1vdGlvbkxlYXZlSW1tZWRpYXRlbHkgJiYgIXZpc2libGUgJiYgbW90aW9uTGVhdmUpIHtcbiAgICAgIG5leHRTdGF0dXMgPSBTVEFUVVNfTEVBVkU7XG4gICAgfVxuICAgIHZhciBuZXh0RXZlbnRIYW5kbGVycyA9IGdldEV2ZW50SGFuZGxlcnMobmV4dFN0YXR1cyk7XG5cbiAgICAvLyBVcGRhdGUgdG8gbmV4dCBzdGF0dXNcbiAgICBpZiAobmV4dFN0YXR1cyAmJiAoc3VwcG9ydE1vdGlvbiB8fCBuZXh0RXZlbnRIYW5kbGVyc1tTVEVQX1BSRVBBUkVdKSkge1xuICAgICAgc2V0U3RhdHVzKG5leHRTdGF0dXMpO1xuICAgICAgc3RhcnRTdGVwKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNldCBiYWNrIGluIGNhc2Ugbm8gbW90aW9uIGJ1dCBwcmV2IHN0YXR1cyBoYXMgcHJlcGFyZSBzdGVwXG4gICAgICBzZXRTdGF0dXMoU1RBVFVTX05PTkUpO1xuICAgIH1cbiAgICB2aXNpYmxlUmVmLmN1cnJlbnQgPSB2aXNpYmxlO1xuICB9LCBbdmlzaWJsZV0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRWZmZWN0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUmVzZXQgd2hlbiBtb3Rpb24gY2hhbmdlZFxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChcbiAgICAvLyBDYW5jZWwgYXBwZWFyXG4gICAgY3VycmVudFN0YXR1cyA9PT0gU1RBVFVTX0FQUEVBUiAmJiAhbW90aW9uQXBwZWFyIHx8XG4gICAgLy8gQ2FuY2VsIGVudGVyXG4gICAgY3VycmVudFN0YXR1cyA9PT0gU1RBVFVTX0VOVEVSICYmICFtb3Rpb25FbnRlciB8fFxuICAgIC8vIENhbmNlbCBsZWF2ZVxuICAgIGN1cnJlbnRTdGF0dXMgPT09IFNUQVRVU19MRUFWRSAmJiAhbW90aW9uTGVhdmUpIHtcbiAgICAgIHNldFN0YXR1cyhTVEFUVVNfTk9ORSk7XG4gICAgfVxuICB9LCBbbW90aW9uQXBwZWFyLCBtb3Rpb25FbnRlciwgbW90aW9uTGVhdmVdKTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgbW91bnRlZFJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICBjbGVhclRpbWVvdXQoZGVhZGxpbmVSZWYuY3VycmVudCk7XG4gICAgfTtcbiAgfSwgW10pO1xuXG4gIC8vIFRyaWdnZXIgYG9uVmlzaWJsZUNoYW5nZWRgXG4gIHZhciBmaXJzdE1vdW50Q2hhbmdlUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAvLyBbdmlzaWJsZSAmIG1vdGlvbiBub3QgZW5kXSA9PiBbIXZpc2libGUgJiBtb3Rpb24gZW5kXSBzdGlsbCBuZWVkIHRyaWdnZXIgb25WaXNpYmxlQ2hhbmdlZFxuICAgIGlmIChhc3luY1Zpc2libGUpIHtcbiAgICAgIGZpcnN0TW91bnRDaGFuZ2VSZWYuY3VycmVudCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChhc3luY1Zpc2libGUgIT09IHVuZGVmaW5lZCAmJiBjdXJyZW50U3RhdHVzID09PSBTVEFUVVNfTk9ORSkge1xuICAgICAgLy8gU2tpcCBmaXJzdCByZW5kZXIgaXMgaW52aXNpYmxlIHNpbmNlIGl0J3Mgbm90aGluZyBjaGFuZ2VkXG4gICAgICBpZiAoZmlyc3RNb3VudENoYW5nZVJlZi5jdXJyZW50IHx8IGFzeW5jVmlzaWJsZSkge1xuICAgICAgICBvblZpc2libGVDaGFuZ2VkID09PSBudWxsIHx8IG9uVmlzaWJsZUNoYW5nZWQgPT09IHZvaWQgMCB8fCBvblZpc2libGVDaGFuZ2VkKGFzeW5jVmlzaWJsZSk7XG4gICAgICB9XG4gICAgICBmaXJzdE1vdW50Q2hhbmdlUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgIH1cbiAgfSwgW2FzeW5jVmlzaWJsZSwgY3VycmVudFN0YXR1c10pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU3R5bGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG1lcmdlZFN0eWxlID0gc3R5bGU7XG4gIGlmIChldmVudEhhbmRsZXJzW1NURVBfUFJFUEFSRV0gJiYgc3RlcCA9PT0gU1RFUF9TVEFSVCkge1xuICAgIG1lcmdlZFN0eWxlID0gX29iamVjdFNwcmVhZCh7XG4gICAgICB0cmFuc2l0aW9uOiAnbm9uZSdcbiAgICB9LCBtZXJnZWRTdHlsZSk7XG4gIH1cbiAgcmV0dXJuIFtjdXJyZW50U3RhdHVzLCBzdGVwLCBtZXJnZWRTdHlsZSwgYXN5bmNWaXNpYmxlICE9PSBudWxsICYmIGFzeW5jVmlzaWJsZSAhPT0gdm9pZCAwID8gYXN5bmNWaXNpYmxlIDogdmlzaWJsZV07XG59IiwgImV4cG9ydCB2YXIgU1RBVFVTX05PTkUgPSAnbm9uZSc7XG5leHBvcnQgdmFyIFNUQVRVU19BUFBFQVIgPSAnYXBwZWFyJztcbmV4cG9ydCB2YXIgU1RBVFVTX0VOVEVSID0gJ2VudGVyJztcbmV4cG9ydCB2YXIgU1RBVFVTX0xFQVZFID0gJ2xlYXZlJztcbmV4cG9ydCB2YXIgU1RFUF9OT05FID0gJ25vbmUnO1xuZXhwb3J0IHZhciBTVEVQX1BSRVBBUkUgPSAncHJlcGFyZSc7XG5leHBvcnQgdmFyIFNURVBfU1RBUlQgPSAnc3RhcnQnO1xuZXhwb3J0IHZhciBTVEVQX0FDVElWRSA9ICdhY3RpdmUnO1xuZXhwb3J0IHZhciBTVEVQX0FDVElWQVRFRCA9ICdlbmQnO1xuLyoqXG4gKiBVc2VkIGZvciBkaXNhYmxlZCBtb3Rpb24gY2FzZS5cbiAqIFByZXBhcmUgc3RhZ2Ugd2lsbCBzdGlsbCB3b3JrIGJ1dCBzdGFydCAmIGFjdGl2ZSB3aWxsIGJlIHNraXBwZWQuXG4gKi9cbmV4cG9ydCB2YXIgU1RFUF9QUkVQQVJFRCA9ICdwcmVwYXJlZCc7IiwgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGFuaW1hdGlvbkVuZE5hbWUsIHRyYW5zaXRpb25FbmROYW1lIH0gZnJvbSBcIi4uL3V0aWwvbW90aW9uXCI7XG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gKG9uSW50ZXJuYWxNb3Rpb25FbmQpIHtcbiAgdmFyIGNhY2hlRWxlbWVudFJlZiA9IHVzZVJlZigpO1xuXG4gIC8vIFJlbW92ZSBldmVudHNcbiAgZnVuY3Rpb24gcmVtb3ZlTW90aW9uRXZlbnRzKGVsZW1lbnQpIHtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHRyYW5zaXRpb25FbmROYW1lLCBvbkludGVybmFsTW90aW9uRW5kKTtcbiAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihhbmltYXRpb25FbmROYW1lLCBvbkludGVybmFsTW90aW9uRW5kKTtcbiAgICB9XG4gIH1cblxuICAvLyBQYXRjaCBldmVudHNcbiAgZnVuY3Rpb24gcGF0Y2hNb3Rpb25FdmVudHMoZWxlbWVudCkge1xuICAgIGlmIChjYWNoZUVsZW1lbnRSZWYuY3VycmVudCAmJiBjYWNoZUVsZW1lbnRSZWYuY3VycmVudCAhPT0gZWxlbWVudCkge1xuICAgICAgcmVtb3ZlTW90aW9uRXZlbnRzKGNhY2hlRWxlbWVudFJlZi5jdXJyZW50KTtcbiAgICB9XG4gICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudCAhPT0gY2FjaGVFbGVtZW50UmVmLmN1cnJlbnQpIHtcbiAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0cmFuc2l0aW9uRW5kTmFtZSwgb25JbnRlcm5hbE1vdGlvbkVuZCk7XG4gICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoYW5pbWF0aW9uRW5kTmFtZSwgb25JbnRlcm5hbE1vdGlvbkVuZCk7XG5cbiAgICAgIC8vIFNhdmUgYXMgY2FjaGUgaW4gY2FzZSBkb20gcmVtb3ZlZCB0cmlnZ2VyIGJ5IGBtb3Rpb25EZWFkbGluZWBcbiAgICAgIGNhY2hlRWxlbWVudFJlZi5jdXJyZW50ID0gZWxlbWVudDtcbiAgICB9XG4gIH1cblxuICAvLyBDbGVhbiB1cCB3aGVuIHJlbW92ZWRcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmVtb3ZlTW90aW9uRXZlbnRzKGNhY2hlRWxlbWVudFJlZi5jdXJyZW50KTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIHJldHVybiBbcGF0Y2hNb3Rpb25FdmVudHMsIHJlbW92ZU1vdGlvbkV2ZW50c107XG59KTsiLCAiaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IGNhblVzZURPTSBmcm9tIFwicmMtdXRpbC9lcy9Eb20vY2FuVXNlRG9tXCI7XG4vLyA9PT09PT09PT09PT09PT09PSBUcmFuc2l0aW9uID09PT09PT09PT09PT09PT09XG4vLyBFdmVudCB3cmFwcGVyLiBDb3B5IGZyb20gcmVhY3Qgc291cmNlIGNvZGVcbmZ1bmN0aW9uIG1ha2VQcmVmaXhNYXAoc3R5bGVQcm9wLCBldmVudE5hbWUpIHtcbiAgdmFyIHByZWZpeGVzID0ge307XG4gIHByZWZpeGVzW3N0eWxlUHJvcC50b0xvd2VyQ2FzZSgpXSA9IGV2ZW50TmFtZS50b0xvd2VyQ2FzZSgpO1xuICBwcmVmaXhlc1tcIldlYmtpdFwiLmNvbmNhdChzdHlsZVByb3ApXSA9IFwid2Via2l0XCIuY29uY2F0KGV2ZW50TmFtZSk7XG4gIHByZWZpeGVzW1wiTW96XCIuY29uY2F0KHN0eWxlUHJvcCldID0gXCJtb3pcIi5jb25jYXQoZXZlbnROYW1lKTtcbiAgcHJlZml4ZXNbXCJtc1wiLmNvbmNhdChzdHlsZVByb3ApXSA9IFwiTVNcIi5jb25jYXQoZXZlbnROYW1lKTtcbiAgcHJlZml4ZXNbXCJPXCIuY29uY2F0KHN0eWxlUHJvcCldID0gXCJvXCIuY29uY2F0KGV2ZW50TmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgcmV0dXJuIHByZWZpeGVzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFZlbmRvclByZWZpeGVzKGRvbVN1cHBvcnQsIHdpbikge1xuICB2YXIgcHJlZml4ZXMgPSB7XG4gICAgYW5pbWF0aW9uZW5kOiBtYWtlUHJlZml4TWFwKCdBbmltYXRpb24nLCAnQW5pbWF0aW9uRW5kJyksXG4gICAgdHJhbnNpdGlvbmVuZDogbWFrZVByZWZpeE1hcCgnVHJhbnNpdGlvbicsICdUcmFuc2l0aW9uRW5kJylcbiAgfTtcbiAgaWYgKGRvbVN1cHBvcnQpIHtcbiAgICBpZiAoISgnQW5pbWF0aW9uRXZlbnQnIGluIHdpbikpIHtcbiAgICAgIGRlbGV0ZSBwcmVmaXhlcy5hbmltYXRpb25lbmQuYW5pbWF0aW9uO1xuICAgIH1cbiAgICBpZiAoISgnVHJhbnNpdGlvbkV2ZW50JyBpbiB3aW4pKSB7XG4gICAgICBkZWxldGUgcHJlZml4ZXMudHJhbnNpdGlvbmVuZC50cmFuc2l0aW9uO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcHJlZml4ZXM7XG59XG52YXIgdmVuZG9yUHJlZml4ZXMgPSBnZXRWZW5kb3JQcmVmaXhlcyhjYW5Vc2VET00oKSwgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB7fSk7XG52YXIgc3R5bGUgPSB7fTtcbmlmIChjYW5Vc2VET00oKSkge1xuICB2YXIgX2RvY3VtZW50JGNyZWF0ZUVsZW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHN0eWxlID0gX2RvY3VtZW50JGNyZWF0ZUVsZW1lLnN0eWxlO1xufVxudmFyIHByZWZpeGVkRXZlbnROYW1lcyA9IHt9O1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKGV2ZW50TmFtZSkge1xuICBpZiAocHJlZml4ZWRFdmVudE5hbWVzW2V2ZW50TmFtZV0pIHtcbiAgICByZXR1cm4gcHJlZml4ZWRFdmVudE5hbWVzW2V2ZW50TmFtZV07XG4gIH1cbiAgdmFyIHByZWZpeE1hcCA9IHZlbmRvclByZWZpeGVzW2V2ZW50TmFtZV07XG4gIGlmIChwcmVmaXhNYXApIHtcbiAgICB2YXIgc3R5bGVQcm9wTGlzdCA9IE9iamVjdC5rZXlzKHByZWZpeE1hcCk7XG4gICAgdmFyIGxlbiA9IHN0eWxlUHJvcExpc3QubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgIHZhciBzdHlsZVByb3AgPSBzdHlsZVByb3BMaXN0W2ldO1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwcmVmaXhNYXAsIHN0eWxlUHJvcCkgJiYgc3R5bGVQcm9wIGluIHN0eWxlKSB7XG4gICAgICAgIHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdID0gcHJlZml4TWFwW3N0eWxlUHJvcF07XG4gICAgICAgIHJldHVybiBwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuICcnO1xufVxudmFyIGludGVybmFsQW5pbWF0aW9uRW5kTmFtZSA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCdhbmltYXRpb25lbmQnKTtcbnZhciBpbnRlcm5hbFRyYW5zaXRpb25FbmROYW1lID0gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoJ3RyYW5zaXRpb25lbmQnKTtcbmV4cG9ydCB2YXIgc3VwcG9ydFRyYW5zaXRpb24gPSAhIShpbnRlcm5hbEFuaW1hdGlvbkVuZE5hbWUgJiYgaW50ZXJuYWxUcmFuc2l0aW9uRW5kTmFtZSk7XG5leHBvcnQgdmFyIGFuaW1hdGlvbkVuZE5hbWUgPSBpbnRlcm5hbEFuaW1hdGlvbkVuZE5hbWUgfHwgJ2FuaW1hdGlvbmVuZCc7XG5leHBvcnQgdmFyIHRyYW5zaXRpb25FbmROYW1lID0gaW50ZXJuYWxUcmFuc2l0aW9uRW5kTmFtZSB8fCAndHJhbnNpdGlvbmVuZCc7XG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJhbnNpdGlvbk5hbWUodHJhbnNpdGlvbk5hbWUsIHRyYW5zaXRpb25UeXBlKSB7XG4gIGlmICghdHJhbnNpdGlvbk5hbWUpIHJldHVybiBudWxsO1xuICBpZiAoX3R5cGVvZih0cmFuc2l0aW9uTmFtZSkgPT09ICdvYmplY3QnKSB7XG4gICAgdmFyIHR5cGUgPSB0cmFuc2l0aW9uVHlwZS5yZXBsYWNlKC8tXFx3L2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgcmV0dXJuIG1hdGNoWzFdLnRvVXBwZXJDYXNlKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRyYW5zaXRpb25OYW1lW3R5cGVdO1xuICB9XG4gIHJldHVybiBcIlwiLmNvbmNhdCh0cmFuc2l0aW9uTmFtZSwgXCItXCIpLmNvbmNhdCh0cmFuc2l0aW9uVHlwZSk7XG59IiwgImltcG9ydCBjYW5Vc2VEb20gZnJvbSBcInJjLXV0aWwvZXMvRG9tL2NhblVzZURvbVwiO1xuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VMYXlvdXRFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5cbi8vIEl0J3Mgc2FmZSB0byB1c2UgYHVzZUxheW91dEVmZmVjdGAgYnV0IHRoZSB3YXJuaW5nIGlzIGFubm95aW5nXG52YXIgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCA9IGNhblVzZURvbSgpID8gdXNlTGF5b3V0RWZmZWN0IDogdXNlRWZmZWN0O1xuZXhwb3J0IGRlZmF1bHQgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdDsiLCAiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgdXNlU3RhdGUgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlU3RhdGVcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFNURVBfQUNUSVZBVEVELCBTVEVQX0FDVElWRSwgU1RFUF9OT05FLCBTVEVQX1BSRVBBUkUsIFNURVBfUFJFUEFSRUQsIFNURVBfU1RBUlQgfSBmcm9tIFwiLi4vaW50ZXJmYWNlXCI7XG5pbXBvcnQgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCBmcm9tIFwiLi91c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0XCI7XG5pbXBvcnQgdXNlTmV4dEZyYW1lIGZyb20gXCIuL3VzZU5leHRGcmFtZVwiO1xudmFyIEZVTExfU1RFUF9RVUVVRSA9IFtTVEVQX1BSRVBBUkUsIFNURVBfU1RBUlQsIFNURVBfQUNUSVZFLCBTVEVQX0FDVElWQVRFRF07XG52YXIgU0lNUExFX1NURVBfUVVFVUUgPSBbU1RFUF9QUkVQQVJFLCBTVEVQX1BSRVBBUkVEXTtcblxuLyoqIFNraXAgY3VycmVudCBzdGVwICovXG5leHBvcnQgdmFyIFNraXBTdGVwID0gZmFsc2U7XG4vKiogQ3VycmVudCBzdGVwIHNob3VsZCBiZSB1cGRhdGUgaW4gKi9cbmV4cG9ydCB2YXIgRG9TdGVwID0gdHJ1ZTtcbmV4cG9ydCBmdW5jdGlvbiBpc0FjdGl2ZShzdGVwKSB7XG4gIHJldHVybiBzdGVwID09PSBTVEVQX0FDVElWRSB8fCBzdGVwID09PSBTVEVQX0FDVElWQVRFRDtcbn1cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAoc3RhdHVzLCBwcmVwYXJlT25seSwgY2FsbGJhY2spIHtcbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKFNURVBfTk9ORSksXG4gICAgX3VzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZSwgMiksXG4gICAgc3RlcCA9IF91c2VTdGF0ZTJbMF0sXG4gICAgc2V0U3RlcCA9IF91c2VTdGF0ZTJbMV07XG4gIHZhciBfdXNlTmV4dEZyYW1lID0gdXNlTmV4dEZyYW1lKCksXG4gICAgX3VzZU5leHRGcmFtZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlTmV4dEZyYW1lLCAyKSxcbiAgICBuZXh0RnJhbWUgPSBfdXNlTmV4dEZyYW1lMlswXSxcbiAgICBjYW5jZWxOZXh0RnJhbWUgPSBfdXNlTmV4dEZyYW1lMlsxXTtcbiAgZnVuY3Rpb24gc3RhcnRRdWV1ZSgpIHtcbiAgICBzZXRTdGVwKFNURVBfUFJFUEFSRSwgdHJ1ZSk7XG4gIH1cbiAgdmFyIFNURVBfUVVFVUUgPSBwcmVwYXJlT25seSA/IFNJTVBMRV9TVEVQX1FVRVVFIDogRlVMTF9TVEVQX1FVRVVFO1xuICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoc3RlcCAhPT0gU1RFUF9OT05FICYmIHN0ZXAgIT09IFNURVBfQUNUSVZBVEVEKSB7XG4gICAgICB2YXIgaW5kZXggPSBTVEVQX1FVRVVFLmluZGV4T2Yoc3RlcCk7XG4gICAgICB2YXIgbmV4dFN0ZXAgPSBTVEVQX1FVRVVFW2luZGV4ICsgMV07XG4gICAgICB2YXIgcmVzdWx0ID0gY2FsbGJhY2soc3RlcCk7XG4gICAgICBpZiAocmVzdWx0ID09PSBTa2lwU3RlcCkge1xuICAgICAgICAvLyBTa2lwIHdoZW4gbm8gbmVlZGVkXG4gICAgICAgIHNldFN0ZXAobmV4dFN0ZXAsIHRydWUpO1xuICAgICAgfSBlbHNlIGlmIChuZXh0U3RlcCkge1xuICAgICAgICAvLyBEbyBhcyBmcmFtZSBmb3Igc3RlcCB1cGRhdGVcbiAgICAgICAgbmV4dEZyYW1lKGZ1bmN0aW9uIChpbmZvKSB7XG4gICAgICAgICAgZnVuY3Rpb24gZG9OZXh0KCkge1xuICAgICAgICAgICAgLy8gU2tpcCBzaW5jZSBjdXJyZW50IHF1ZXVlIGlzIG9vZFxuICAgICAgICAgICAgaWYgKGluZm8uaXNDYW5jZWxlZCgpKSByZXR1cm47XG4gICAgICAgICAgICBzZXRTdGVwKG5leHRTdGVwLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgZG9OZXh0KCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE9ubHkgcHJvbWlzZSBzaG91bGQgYmUgYXN5bmNcbiAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4oZG9OZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSwgW3N0YXR1cywgc3RlcF0pO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBjYW5jZWxOZXh0RnJhbWUoKTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIHJldHVybiBbc3RhcnRRdWV1ZSwgc3RlcF07XG59KTsiLCAiaW1wb3J0IHJhZiBmcm9tIFwicmMtdXRpbC9lcy9yYWZcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAoKSB7XG4gIHZhciBuZXh0RnJhbWVSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIGZ1bmN0aW9uIGNhbmNlbE5leHRGcmFtZSgpIHtcbiAgICByYWYuY2FuY2VsKG5leHRGcmFtZVJlZi5jdXJyZW50KTtcbiAgfVxuICBmdW5jdGlvbiBuZXh0RnJhbWUoY2FsbGJhY2spIHtcbiAgICB2YXIgZGVsYXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDI7XG4gICAgY2FuY2VsTmV4dEZyYW1lKCk7XG4gICAgdmFyIG5leHRGcmFtZUlkID0gcmFmKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChkZWxheSA8PSAxKSB7XG4gICAgICAgIGNhbGxiYWNrKHtcbiAgICAgICAgICBpc0NhbmNlbGVkOiBmdW5jdGlvbiBpc0NhbmNlbGVkKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5leHRGcmFtZUlkICE9PSBuZXh0RnJhbWVSZWYuY3VycmVudDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dEZyYW1lKGNhbGxiYWNrLCBkZWxheSAtIDEpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIG5leHRGcmFtZVJlZi5jdXJyZW50ID0gbmV4dEZyYW1lSWQ7XG4gIH1cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgY2FuY2VsTmV4dEZyYW1lKCk7XG4gICAgfTtcbiAgfSwgW10pO1xuICByZXR1cm4gW25leHRGcmFtZSwgY2FuY2VsTmV4dEZyYW1lXTtcbn0pOyIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2Fzc2VydFRoaXNJbml0aWFsaXplZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXNzZXJ0VGhpc0luaXRpYWxpemVkXCI7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c1wiO1xuaW1wb3J0IF9jcmVhdGVTdXBlciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlU3VwZXJcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiY29tcG9uZW50XCIsIFwiY2hpbGRyZW5cIiwgXCJvblZpc2libGVDaGFuZ2VkXCIsIFwib25BbGxSZW1vdmVkXCJdLFxuICBfZXhjbHVkZWQyID0gW1wic3RhdHVzXCJdO1xuLyogZXNsaW50IHJlYWN0L3Byb3AtdHlwZXM6IDAgKi9cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBPcmlnaW5DU1NNb3Rpb24gZnJvbSBcIi4vQ1NTTW90aW9uXCI7XG5pbXBvcnQgeyBkaWZmS2V5cywgcGFyc2VLZXlzLCBTVEFUVVNfQURELCBTVEFUVVNfS0VFUCwgU1RBVFVTX1JFTU9WRSwgU1RBVFVTX1JFTU9WRUQgfSBmcm9tIFwiLi91dGlsL2RpZmZcIjtcbmltcG9ydCB7IHN1cHBvcnRUcmFuc2l0aW9uIH0gZnJvbSBcIi4vdXRpbC9tb3Rpb25cIjtcbnZhciBNT1RJT05fUFJPUF9OQU1FUyA9IFsnZXZlbnRQcm9wcycsICd2aXNpYmxlJywgJ2NoaWxkcmVuJywgJ21vdGlvbk5hbWUnLCAnbW90aW9uQXBwZWFyJywgJ21vdGlvbkVudGVyJywgJ21vdGlvbkxlYXZlJywgJ21vdGlvbkxlYXZlSW1tZWRpYXRlbHknLCAnbW90aW9uRGVhZGxpbmUnLCAncmVtb3ZlT25MZWF2ZScsICdsZWF2ZWRDbGFzc05hbWUnLCAnb25BcHBlYXJQcmVwYXJlJywgJ29uQXBwZWFyU3RhcnQnLCAnb25BcHBlYXJBY3RpdmUnLCAnb25BcHBlYXJFbmQnLCAnb25FbnRlclN0YXJ0JywgJ29uRW50ZXJBY3RpdmUnLCAnb25FbnRlckVuZCcsICdvbkxlYXZlU3RhcnQnLCAnb25MZWF2ZUFjdGl2ZScsICdvbkxlYXZlRW5kJ107XG4vKipcbiAqIEdlbmVyYXRlIGEgQ1NTTW90aW9uTGlzdCBjb21wb25lbnQgd2l0aCBjb25maWdcbiAqIEBwYXJhbSB0cmFuc2l0aW9uU3VwcG9ydCBObyBuZWVkIHNpbmNlIENTU01vdGlvbkxpc3Qgbm8gbG9uZ2VyIGRlcGVuZHMgb24gdHJhbnNpdGlvbiBzdXBwb3J0XG4gKiBAcGFyYW0gQ1NTTW90aW9uIENTU01vdGlvbiBjb21wb25lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbkNTU01vdGlvbkxpc3QodHJhbnNpdGlvblN1cHBvcnQpIHtcbiAgdmFyIENTU01vdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogT3JpZ2luQ1NTTW90aW9uO1xuICB2YXIgQ1NTTW90aW9uTGlzdCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAgIF9pbmhlcml0cyhDU1NNb3Rpb25MaXN0LCBfUmVhY3QkQ29tcG9uZW50KTtcbiAgICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKENTU01vdGlvbkxpc3QpO1xuICAgIGZ1bmN0aW9uIENTU01vdGlvbkxpc3QoKSB7XG4gICAgICB2YXIgX3RoaXM7XG4gICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ1NTTW90aW9uTGlzdCk7XG4gICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgIH1cbiAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwuYXBwbHkoX3N1cGVyLCBbdGhpc10uY29uY2F0KGFyZ3MpKTtcbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJzdGF0ZVwiLCB7XG4gICAgICAgIGtleUVudGl0aWVzOiBbXVxuICAgICAgfSk7XG4gICAgICAvLyBab21iaWVKOiBSZXR1cm4gdGhlIGNvdW50IG9mIHJlc3Qga2V5cy4gSXQncyBzYWZlIHRvIHJlZmFjdG9yIGlmIG5lZWQgbW9yZSBpbmZvLlxuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInJlbW92ZUtleVwiLCBmdW5jdGlvbiAocmVtb3ZlS2V5KSB7XG4gICAgICAgIF90aGlzLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgICB2YXIgbmV4dEtleUVudGl0aWVzID0gcHJldlN0YXRlLmtleUVudGl0aWVzLm1hcChmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgICAgICAgICBpZiAoZW50aXR5LmtleSAhPT0gcmVtb3ZlS2V5KSByZXR1cm4gZW50aXR5O1xuICAgICAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZW50aXR5KSwge30sIHtcbiAgICAgICAgICAgICAgc3RhdHVzOiBTVEFUVVNfUkVNT1ZFRFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtleUVudGl0aWVzOiBuZXh0S2V5RW50aXRpZXNcbiAgICAgICAgICB9O1xuICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIGtleUVudGl0aWVzID0gX3RoaXMuc3RhdGUua2V5RW50aXRpZXM7XG4gICAgICAgICAgdmFyIHJlc3RLZXlzQ291bnQgPSBrZXlFbnRpdGllcy5maWx0ZXIoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgICAgIHZhciBzdGF0dXMgPSBfcmVmLnN0YXR1cztcbiAgICAgICAgICAgIHJldHVybiBzdGF0dXMgIT09IFNUQVRVU19SRU1PVkVEO1xuICAgICAgICAgIH0pLmxlbmd0aDtcbiAgICAgICAgICBpZiAocmVzdEtleXNDb3VudCA9PT0gMCAmJiBfdGhpcy5wcm9wcy5vbkFsbFJlbW92ZWQpIHtcbiAgICAgICAgICAgIF90aGlzLnByb3BzLm9uQWxsUmVtb3ZlZCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgX2NyZWF0ZUNsYXNzKENTU01vdGlvbkxpc3QsIFt7XG4gICAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgICB2YXIgX3RoaXMyID0gdGhpcztcbiAgICAgICAgdmFyIGtleUVudGl0aWVzID0gdGhpcy5zdGF0ZS5rZXlFbnRpdGllcztcbiAgICAgICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBjb21wb25lbnQgPSBfdGhpcyRwcm9wcy5jb21wb25lbnQsXG4gICAgICAgICAgY2hpbGRyZW4gPSBfdGhpcyRwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgICBfb25WaXNpYmxlQ2hhbmdlZCA9IF90aGlzJHByb3BzLm9uVmlzaWJsZUNoYW5nZWQsXG4gICAgICAgICAgb25BbGxSZW1vdmVkID0gX3RoaXMkcHJvcHMub25BbGxSZW1vdmVkLFxuICAgICAgICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfdGhpcyRwcm9wcywgX2V4Y2x1ZGVkKTtcbiAgICAgICAgdmFyIENvbXBvbmVudCA9IGNvbXBvbmVudCB8fCBSZWFjdC5GcmFnbWVudDtcbiAgICAgICAgdmFyIG1vdGlvblByb3BzID0ge307XG4gICAgICAgIE1PVElPTl9QUk9QX05BTUVTLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgICBtb3Rpb25Qcm9wc1twcm9wXSA9IHJlc3RQcm9wc1twcm9wXTtcbiAgICAgICAgICBkZWxldGUgcmVzdFByb3BzW3Byb3BdO1xuICAgICAgICB9KTtcbiAgICAgICAgZGVsZXRlIHJlc3RQcm9wcy5rZXlzO1xuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCByZXN0UHJvcHMsIGtleUVudGl0aWVzLm1hcChmdW5jdGlvbiAoX3JlZjIsIGluZGV4KSB7XG4gICAgICAgICAgdmFyIHN0YXR1cyA9IF9yZWYyLnN0YXR1cyxcbiAgICAgICAgICAgIGV2ZW50UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZjIsIF9leGNsdWRlZDIpO1xuICAgICAgICAgIHZhciB2aXNpYmxlID0gc3RhdHVzID09PSBTVEFUVVNfQUREIHx8IHN0YXR1cyA9PT0gU1RBVFVTX0tFRVA7XG4gICAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENTU01vdGlvbiwgX2V4dGVuZHMoe30sIG1vdGlvblByb3BzLCB7XG4gICAgICAgICAgICBrZXk6IGV2ZW50UHJvcHMua2V5LFxuICAgICAgICAgICAgdmlzaWJsZTogdmlzaWJsZSxcbiAgICAgICAgICAgIGV2ZW50UHJvcHM6IGV2ZW50UHJvcHMsXG4gICAgICAgICAgICBvblZpc2libGVDaGFuZ2VkOiBmdW5jdGlvbiBvblZpc2libGVDaGFuZ2VkKGNoYW5nZWRWaXNpYmxlKSB7XG4gICAgICAgICAgICAgIF9vblZpc2libGVDaGFuZ2VkID09PSBudWxsIHx8IF9vblZpc2libGVDaGFuZ2VkID09PSB2b2lkIDAgfHwgX29uVmlzaWJsZUNoYW5nZWQoY2hhbmdlZFZpc2libGUsIHtcbiAgICAgICAgICAgICAgICBrZXk6IGV2ZW50UHJvcHMua2V5XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBpZiAoIWNoYW5nZWRWaXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMyLnJlbW92ZUtleShldmVudFByb3BzLmtleSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSwgZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbihfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICAgICAgICAgICAgaW5kZXg6IGluZGV4XG4gICAgICAgICAgICB9KSwgcmVmKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH1dLCBbe1xuICAgICAga2V5OiBcImdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc1wiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhfcmVmMywgX3JlZjQpIHtcbiAgICAgICAgdmFyIGtleXMgPSBfcmVmMy5rZXlzO1xuICAgICAgICB2YXIga2V5RW50aXRpZXMgPSBfcmVmNC5rZXlFbnRpdGllcztcbiAgICAgICAgdmFyIHBhcnNlZEtleU9iamVjdHMgPSBwYXJzZUtleXMoa2V5cyk7XG4gICAgICAgIHZhciBtaXhlZEtleUVudGl0aWVzID0gZGlmZktleXMoa2V5RW50aXRpZXMsIHBhcnNlZEtleU9iamVjdHMpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGtleUVudGl0aWVzOiBtaXhlZEtleUVudGl0aWVzLmZpbHRlcihmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgICAgICAgICB2YXIgcHJldkVudGl0eSA9IGtleUVudGl0aWVzLmZpbmQoZnVuY3Rpb24gKF9yZWY1KSB7XG4gICAgICAgICAgICAgIHZhciBrZXkgPSBfcmVmNS5rZXk7XG4gICAgICAgICAgICAgIHJldHVybiBlbnRpdHkua2V5ID09PSBrZXk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gUmVtb3ZlIGlmIGFscmVhZHkgbWFyayBhcyByZW1vdmVkXG4gICAgICAgICAgICBpZiAocHJldkVudGl0eSAmJiBwcmV2RW50aXR5LnN0YXR1cyA9PT0gU1RBVFVTX1JFTU9WRUQgJiYgZW50aXR5LnN0YXR1cyA9PT0gU1RBVFVTX1JFTU9WRSkge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1dKTtcbiAgICByZXR1cm4gQ1NTTW90aW9uTGlzdDtcbiAgfShSZWFjdC5Db21wb25lbnQpO1xuICBfZGVmaW5lUHJvcGVydHkoQ1NTTW90aW9uTGlzdCwgXCJkZWZhdWx0UHJvcHNcIiwge1xuICAgIGNvbXBvbmVudDogJ2RpdidcbiAgfSk7XG4gIHJldHVybiBDU1NNb3Rpb25MaXN0O1xufVxuZXhwb3J0IGRlZmF1bHQgZ2VuQ1NTTW90aW9uTGlzdChzdXBwb3J0VHJhbnNpdGlvbik7IiwgImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5leHBvcnQgdmFyIFNUQVRVU19BREQgPSAnYWRkJztcbmV4cG9ydCB2YXIgU1RBVFVTX0tFRVAgPSAna2VlcCc7XG5leHBvcnQgdmFyIFNUQVRVU19SRU1PVkUgPSAncmVtb3ZlJztcbmV4cG9ydCB2YXIgU1RBVFVTX1JFTU9WRUQgPSAncmVtb3ZlZCc7XG5leHBvcnQgZnVuY3Rpb24gd3JhcEtleVRvT2JqZWN0KGtleSkge1xuICB2YXIga2V5T2JqO1xuICBpZiAoa2V5ICYmIF90eXBlb2Yoa2V5KSA9PT0gJ29iamVjdCcgJiYgJ2tleScgaW4ga2V5KSB7XG4gICAga2V5T2JqID0ga2V5O1xuICB9IGVsc2Uge1xuICAgIGtleU9iaiA9IHtcbiAgICAgIGtleToga2V5XG4gICAgfTtcbiAgfVxuICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBrZXlPYmopLCB7fSwge1xuICAgIGtleTogU3RyaW5nKGtleU9iai5rZXkpXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlS2V5cygpIHtcbiAgdmFyIGtleXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFtdO1xuICByZXR1cm4ga2V5cy5tYXAod3JhcEtleVRvT2JqZWN0KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkaWZmS2V5cygpIHtcbiAgdmFyIHByZXZLZXlzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbXTtcbiAgdmFyIGN1cnJlbnRLZXlzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBbXTtcbiAgdmFyIGxpc3QgPSBbXTtcbiAgdmFyIGN1cnJlbnRJbmRleCA9IDA7XG4gIHZhciBjdXJyZW50TGVuID0gY3VycmVudEtleXMubGVuZ3RoO1xuICB2YXIgcHJldktleU9iamVjdHMgPSBwYXJzZUtleXMocHJldktleXMpO1xuICB2YXIgY3VycmVudEtleU9iamVjdHMgPSBwYXJzZUtleXMoY3VycmVudEtleXMpO1xuXG4gIC8vIENoZWNrIHByZXYga2V5cyB0byBpbnNlcnQgb3Iga2VlcFxuICBwcmV2S2V5T2JqZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXlPYmopIHtcbiAgICB2YXIgaGl0ID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IGN1cnJlbnRJbmRleDsgaSA8IGN1cnJlbnRMZW47IGkgKz0gMSkge1xuICAgICAgdmFyIGN1cnJlbnRLZXlPYmogPSBjdXJyZW50S2V5T2JqZWN0c1tpXTtcbiAgICAgIGlmIChjdXJyZW50S2V5T2JqLmtleSA9PT0ga2V5T2JqLmtleSkge1xuICAgICAgICAvLyBOZXcgYWRkZWQga2V5cyBzaG91bGQgYWRkIGJlZm9yZSBjdXJyZW50IGtleVxuICAgICAgICBpZiAoY3VycmVudEluZGV4IDwgaSkge1xuICAgICAgICAgIGxpc3QgPSBsaXN0LmNvbmNhdChjdXJyZW50S2V5T2JqZWN0cy5zbGljZShjdXJyZW50SW5kZXgsIGkpLm1hcChmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBvYmopLCB7fSwge1xuICAgICAgICAgICAgICBzdGF0dXM6IFNUQVRVU19BRERcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgICBjdXJyZW50SW5kZXggPSBpO1xuICAgICAgICB9XG4gICAgICAgIGxpc3QucHVzaChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGN1cnJlbnRLZXlPYmopLCB7fSwge1xuICAgICAgICAgIHN0YXR1czogU1RBVFVTX0tFRVBcbiAgICAgICAgfSkpO1xuICAgICAgICBjdXJyZW50SW5kZXggKz0gMTtcbiAgICAgICAgaGl0ID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgbm90IGhpdCwgaXQgbWVhbnMga2V5IGlzIHJlbW92ZWRcbiAgICBpZiAoIWhpdCkge1xuICAgICAgbGlzdC5wdXNoKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwga2V5T2JqKSwge30sIHtcbiAgICAgICAgc3RhdHVzOiBTVEFUVVNfUkVNT1ZFXG4gICAgICB9KSk7XG4gICAgfVxuICB9KTtcblxuICAvLyBBZGQgcmVzdCB0byB0aGUgbGlzdFxuICBpZiAoY3VycmVudEluZGV4IDwgY3VycmVudExlbikge1xuICAgIGxpc3QgPSBsaXN0LmNvbmNhdChjdXJyZW50S2V5T2JqZWN0cy5zbGljZShjdXJyZW50SW5kZXgpLm1hcChmdW5jdGlvbiAob2JqKSB7XG4gICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBvYmopLCB7fSwge1xuICAgICAgICBzdGF0dXM6IFNUQVRVU19BRERcbiAgICAgIH0pO1xuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXJnZSBzYW1lIGtleSB3aGVuIGl0IHJlbW92ZSBhbmQgYWRkIGFnYWluOlxuICAgKiAgICBbMSAtIGFkZCwgMiAtIGtlZXAsIDEgLSByZW1vdmVdIC0+IFsxIC0ga2VlcCwgMiAtIGtlZXBdXG4gICAqL1xuICB2YXIga2V5cyA9IHt9O1xuICBsaXN0LmZvckVhY2goZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIga2V5ID0gX3JlZi5rZXk7XG4gICAga2V5c1trZXldID0gKGtleXNba2V5XSB8fCAwKSArIDE7XG4gIH0pO1xuICB2YXIgZHVwbGljYXRlZEtleXMgPSBPYmplY3Qua2V5cyhrZXlzKS5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBrZXlzW2tleV0gPiAxO1xuICB9KTtcbiAgZHVwbGljYXRlZEtleXMuZm9yRWFjaChmdW5jdGlvbiAobWF0Y2hLZXkpIHtcbiAgICAvLyBSZW1vdmUgYFNUQVRVU19SRU1PVkVgIG5vZGUuXG4gICAgbGlzdCA9IGxpc3QuZmlsdGVyKGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgdmFyIGtleSA9IF9yZWYyLmtleSxcbiAgICAgICAgc3RhdHVzID0gX3JlZjIuc3RhdHVzO1xuICAgICAgcmV0dXJuIGtleSAhPT0gbWF0Y2hLZXkgfHwgc3RhdHVzICE9PSBTVEFUVVNfUkVNT1ZFO1xuICAgIH0pO1xuXG4gICAgLy8gVXBkYXRlIGBTVEFUVVNfQUREYCB0byBgU1RBVFVTX0tFRVBgXG4gICAgbGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICBpZiAobm9kZS5rZXkgPT09IG1hdGNoS2V5KSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICBub2RlLnN0YXR1cyA9IFNUQVRVU19LRUVQO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIGxpc3Q7XG59IiwgImltcG9ydCBDU1NNb3Rpb24gZnJvbSBcIi4vQ1NTTW90aW9uXCI7XG5pbXBvcnQgQ1NTTW90aW9uTGlzdCBmcm9tIFwiLi9DU1NNb3Rpb25MaXN0XCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFByb3ZpZGVyIH0gZnJvbSBcIi4vY29udGV4dFwiO1xuZXhwb3J0IHsgQ1NTTW90aW9uTGlzdCB9O1xuZXhwb3J0IGRlZmF1bHQgQ1NTTW90aW9uOyIsICJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZGV2VXNlV2FybmluZyB9IGZyb20gJy4uL191dGlsL3dhcm5pbmcnO1xuLyoqXG4gKiBXYXJuaW5nIGZvciBDb25maWdQcm92aWRlclByb3BzLlxuICogVGhpcyB3aWxsIGJlIGVtcHR5IGZ1bmN0aW9uIGluIHByb2R1Y3Rpb24uXG4gKi9cbmNvbnN0IFByb3BXYXJuaW5nID0gLyojX19QVVJFX18qL1JlYWN0Lm1lbW8oX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoXG4gIH0gPSBfcmVmO1xuICBjb25zdCB3YXJuaW5nID0gZGV2VXNlV2FybmluZygnQ29uZmlnUHJvdmlkZXInKTtcbiAgd2FybmluZy5kZXByZWNhdGVkKGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCA9PT0gdW5kZWZpbmVkLCAnZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoJywgJ3BvcHVwTWF0Y2hTZWxlY3RXaWR0aCcpO1xuICByZXR1cm4gbnVsbDtcbn0pO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgUHJvcFdhcm5pbmcuZGlzcGxheU5hbWUgPSAnUHJvcFdhcm5pbmcnO1xufVxuZXhwb3J0IGRlZmF1bHQgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IFByb3BXYXJuaW5nIDogKCkgPT4gbnVsbDsiLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQ2hlY2tDaXJjbGVGaWxsZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vQ2hlY2tDaXJjbGVGaWxsZWRcIjtcbmltcG9ydCBBbnRkSWNvbiBmcm9tIFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiO1xudmFyIENoZWNrQ2lyY2xlRmlsbGVkID0gZnVuY3Rpb24gQ2hlY2tDaXJjbGVGaWxsZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IENoZWNrQ2lyY2xlRmlsbGVkU3ZnXG4gIH0pKTtcbn07XG5cbi8qKiFbY2hlY2stY2lyY2xlXShkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUIzYVdSMGFEMGlOVEFpSUdobGFXZG9kRDBpTlRBaUlHWnBiR3c5SWlOallXTmhZMkVpSUhacFpYZENiM2c5SWpZMElEWTBJRGc1TmlBNE9UWWlJR1p2WTNWellXSnNaVDBpWm1Gc2MyVWlJSGh0Ykc1elBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5SStQSEJoZEdnZ1pEMGlUVFV4TWlBMk5FTXlOalF1TmlBMk5DQTJOQ0F5TmpRdU5pQTJOQ0ExTVRKek1qQXdMallnTkRRNElEUTBPQ0EwTkRnZ05EUTRMVEl3TUM0MklEUTBPQzAwTkRoVE56VTVMalFnTmpRZ05URXlJRFkwZW0weE9UTXVOU0F6TURFdU4yd3RNakV3TGpZZ01qa3lZVE14TGpnZ016RXVPQ0F3SURBeExUVXhMamNnTUV3ek1UZ3VOU0EwT0RRdU9XTXRNeTQ0TFRVdU15QXdMVEV5TGpjZ05pNDFMVEV5TGpkb05EWXVPV014TUM0eUlEQWdNVGt1T1NBMExqa2dNalV1T1NBeE15NHpiRGN4TGpJZ09UZ3VPQ0F4TlRjdU1pMHlNVGhqTmkwNExqTWdNVFV1TmkweE15NHpJREkxTGprdE1UTXVNMGcyT1Rsak5pNDFJREFnTVRBdU15QTNMalFnTmk0MUlERXlMamQ2SWlBdlBqd3ZjM1puUGc9PSkgKi9cbnZhciBSZWZJY29uID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoQ2hlY2tDaXJjbGVGaWxsZWQpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgUmVmSWNvbi5kaXNwbGF5TmFtZSA9ICdDaGVja0NpcmNsZUZpbGxlZCc7XG59XG5leHBvcnQgZGVmYXVsdCBSZWZJY29uOyIsICIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBDaGVja0NpcmNsZUZpbGxlZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNTEyIDY0QzI2NC42IDY0IDY0IDI2NC42IDY0IDUxMnMyMDAuNiA0NDggNDQ4IDQ0OCA0NDgtMjAwLjYgNDQ4LTQ0OFM3NTkuNCA2NCA1MTIgNjR6bTE5My41IDMwMS43bC0yMTAuNiAyOTJhMzEuOCAzMS44IDAgMDEtNTEuNyAwTDMxOC41IDQ4NC45Yy0zLjgtNS4zIDAtMTIuNyA2LjUtMTIuN2g0Ni45YzEwLjIgMCAxOS45IDQuOSAyNS45IDEzLjNsNzEuMiA5OC44IDE1Ny4yLTIxOGM2LTguMyAxNS42LTEzLjMgMjUuOS0xMy4zSDY5OWM2LjUgMCAxMC4zIDcuNCA2LjUgMTIuN3pcIiB9IH1dIH0sIFwibmFtZVwiOiBcImNoZWNrLWNpcmNsZVwiLCBcInRoZW1lXCI6IFwiZmlsbGVkXCIgfTtcbmV4cG9ydCBkZWZhdWx0IENoZWNrQ2lyY2xlRmlsbGVkO1xuIiwgIid1c2UgY2xpZW50JztcblxuaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcImNsYXNzTmFtZVwiLCBcImljb25cIiwgXCJzcGluXCIsIFwicm90YXRlXCIsIFwidGFiSW5kZXhcIiwgXCJvbkNsaWNrXCIsIFwidHdvVG9uZUNvbG9yXCJdO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyBibHVlIH0gZnJvbSAnQGFudC1kZXNpZ24vY29sb3JzJztcbmltcG9ydCBDb250ZXh0IGZyb20gXCIuL0NvbnRleHRcIjtcbmltcG9ydCBSZWFjdEljb24gZnJvbSBcIi4vSWNvbkJhc2VcIjtcbmltcG9ydCB7IGdldFR3b1RvbmVDb2xvciwgc2V0VHdvVG9uZUNvbG9yIH0gZnJvbSBcIi4vdHdvVG9uZVByaW1hcnlDb2xvclwiO1xuaW1wb3J0IHsgbm9ybWFsaXplVHdvVG9uZUNvbG9ycyB9IGZyb20gXCIuLi91dGlsc1wiO1xuLy8gSW5pdGlhbCBzZXR0aW5nXG4vLyBzaG91bGQgbW92ZSBpdCB0byBhbnRkIG1haW4gcmVwbz9cbnNldFR3b1RvbmVDb2xvcihibHVlLnByaW1hcnkpO1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vRGVmaW5pdGVseVR5cGVkL0RlZmluaXRlbHlUeXBlZC9pc3N1ZXMvMzQ3NTcjaXNzdWVjb21tZW50LTQ4ODg0ODcyMFxuXG52YXIgSWNvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgaWNvbiA9IHByb3BzLmljb24sXG4gICAgc3BpbiA9IHByb3BzLnNwaW4sXG4gICAgcm90YXRlID0gcHJvcHMucm90YXRlLFxuICAgIHRhYkluZGV4ID0gcHJvcHMudGFiSW5kZXgsXG4gICAgb25DbGljayA9IHByb3BzLm9uQ2xpY2ssXG4gICAgdHdvVG9uZUNvbG9yID0gcHJvcHMudHdvVG9uZUNvbG9yLFxuICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgX2V4Y2x1ZGVkKTtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb250ZXh0KSxcbiAgICBfUmVhY3QkdXNlQ29udGV4dCRwcmUgPSBfUmVhY3QkdXNlQ29udGV4dC5wcmVmaXhDbHMsXG4gICAgcHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQkcHJlID09PSB2b2lkIDAgPyAnYW50aWNvbicgOiBfUmVhY3QkdXNlQ29udGV4dCRwcmUsXG4gICAgcm9vdENsYXNzTmFtZSA9IF9SZWFjdCR1c2VDb250ZXh0LnJvb3RDbGFzc05hbWU7XG4gIHZhciBjbGFzc1N0cmluZyA9IGNsYXNzTmFtZXMocm9vdENsYXNzTmFtZSwgcHJlZml4Q2xzLCBfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQoaWNvbi5uYW1lKSwgISFpY29uLm5hbWUpLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNwaW5cIiksICEhc3BpbiB8fCBpY29uLm5hbWUgPT09ICdsb2FkaW5nJyksIGNsYXNzTmFtZSk7XG4gIHZhciBpY29uVGFiSW5kZXggPSB0YWJJbmRleDtcbiAgaWYgKGljb25UYWJJbmRleCA9PT0gdW5kZWZpbmVkICYmIG9uQ2xpY2spIHtcbiAgICBpY29uVGFiSW5kZXggPSAtMTtcbiAgfVxuICB2YXIgc3ZnU3R5bGUgPSByb3RhdGUgPyB7XG4gICAgbXNUcmFuc2Zvcm06IFwicm90YXRlKFwiLmNvbmNhdChyb3RhdGUsIFwiZGVnKVwiKSxcbiAgICB0cmFuc2Zvcm06IFwicm90YXRlKFwiLmNvbmNhdChyb3RhdGUsIFwiZGVnKVwiKVxuICB9IDogdW5kZWZpbmVkO1xuICB2YXIgX25vcm1hbGl6ZVR3b1RvbmVDb2xvID0gbm9ybWFsaXplVHdvVG9uZUNvbG9ycyh0d29Ub25lQ29sb3IpLFxuICAgIF9ub3JtYWxpemVUd29Ub25lQ29sbzIgPSBfc2xpY2VkVG9BcnJheShfbm9ybWFsaXplVHdvVG9uZUNvbG8sIDIpLFxuICAgIHByaW1hcnlDb2xvciA9IF9ub3JtYWxpemVUd29Ub25lQ29sbzJbMF0sXG4gICAgc2Vjb25kYXJ5Q29sb3IgPSBfbm9ybWFsaXplVHdvVG9uZUNvbG8yWzFdO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIF9leHRlbmRzKHtcbiAgICByb2xlOiBcImltZ1wiLFxuICAgIFwiYXJpYS1sYWJlbFwiOiBpY29uLm5hbWVcbiAgfSwgcmVzdFByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgdGFiSW5kZXg6IGljb25UYWJJbmRleCxcbiAgICBvbkNsaWNrOiBvbkNsaWNrLFxuICAgIGNsYXNzTmFtZTogY2xhc3NTdHJpbmdcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0SWNvbiwge1xuICAgIGljb246IGljb24sXG4gICAgcHJpbWFyeUNvbG9yOiBwcmltYXJ5Q29sb3IsXG4gICAgc2Vjb25kYXJ5Q29sb3I6IHNlY29uZGFyeUNvbG9yLFxuICAgIHN0eWxlOiBzdmdTdHlsZVxuICB9KSk7XG59KTtcbkljb24uZGlzcGxheU5hbWUgPSAnQW50ZEljb24nO1xuSWNvbi5nZXRUd29Ub25lQ29sb3IgPSBnZXRUd29Ub25lQ29sb3I7XG5JY29uLnNldFR3b1RvbmVDb2xvciA9IHNldFR3b1RvbmVDb2xvcjtcbmV4cG9ydCBkZWZhdWx0IEljb247IiwgImltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xudmFyIF9leGNsdWRlZCA9IFtcImljb25cIiwgXCJjbGFzc05hbWVcIiwgXCJvbkNsaWNrXCIsIFwic3R5bGVcIiwgXCJwcmltYXJ5Q29sb3JcIiwgXCJzZWNvbmRhcnlDb2xvclwiXTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGdlbmVyYXRlLCBnZXRTZWNvbmRhcnlDb2xvciwgaXNJY29uRGVmaW5pdGlvbiwgd2FybmluZywgdXNlSW5zZXJ0U3R5bGVzIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG52YXIgdHdvVG9uZUNvbG9yUGFsZXR0ZSA9IHtcbiAgcHJpbWFyeUNvbG9yOiAnIzMzMycsXG4gIHNlY29uZGFyeUNvbG9yOiAnI0U2RTZFNicsXG4gIGNhbGN1bGF0ZWQ6IGZhbHNlXG59O1xuZnVuY3Rpb24gc2V0VHdvVG9uZUNvbG9ycyhfcmVmKSB7XG4gIHZhciBwcmltYXJ5Q29sb3IgPSBfcmVmLnByaW1hcnlDb2xvcixcbiAgICBzZWNvbmRhcnlDb2xvciA9IF9yZWYuc2Vjb25kYXJ5Q29sb3I7XG4gIHR3b1RvbmVDb2xvclBhbGV0dGUucHJpbWFyeUNvbG9yID0gcHJpbWFyeUNvbG9yO1xuICB0d29Ub25lQ29sb3JQYWxldHRlLnNlY29uZGFyeUNvbG9yID0gc2Vjb25kYXJ5Q29sb3IgfHwgZ2V0U2Vjb25kYXJ5Q29sb3IocHJpbWFyeUNvbG9yKTtcbiAgdHdvVG9uZUNvbG9yUGFsZXR0ZS5jYWxjdWxhdGVkID0gISFzZWNvbmRhcnlDb2xvcjtcbn1cbmZ1bmN0aW9uIGdldFR3b1RvbmVDb2xvcnMoKSB7XG4gIHJldHVybiBfb2JqZWN0U3ByZWFkKHt9LCB0d29Ub25lQ29sb3JQYWxldHRlKTtcbn1cbnZhciBJY29uQmFzZSA9IGZ1bmN0aW9uIEljb25CYXNlKHByb3BzKSB7XG4gIHZhciBpY29uID0gcHJvcHMuaWNvbixcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgb25DbGljayA9IHByb3BzLm9uQ2xpY2ssXG4gICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICBwcmltYXJ5Q29sb3IgPSBwcm9wcy5wcmltYXJ5Q29sb3IsXG4gICAgc2Vjb25kYXJ5Q29sb3IgPSBwcm9wcy5zZWNvbmRhcnlDb2xvcixcbiAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIF9leGNsdWRlZCk7XG4gIHZhciBzdmdSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgdmFyIGNvbG9ycyA9IHR3b1RvbmVDb2xvclBhbGV0dGU7XG4gIGlmIChwcmltYXJ5Q29sb3IpIHtcbiAgICBjb2xvcnMgPSB7XG4gICAgICBwcmltYXJ5Q29sb3I6IHByaW1hcnlDb2xvcixcbiAgICAgIHNlY29uZGFyeUNvbG9yOiBzZWNvbmRhcnlDb2xvciB8fCBnZXRTZWNvbmRhcnlDb2xvcihwcmltYXJ5Q29sb3IpXG4gICAgfTtcbiAgfVxuICB1c2VJbnNlcnRTdHlsZXMoc3ZnUmVmKTtcbiAgd2FybmluZyhpc0ljb25EZWZpbml0aW9uKGljb24pLCBcImljb24gc2hvdWxkIGJlIGljb24gZGVmaW5pdG9uLCBidXQgZ290IFwiLmNvbmNhdChpY29uKSk7XG4gIGlmICghaXNJY29uRGVmaW5pdGlvbihpY29uKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciB0YXJnZXQgPSBpY29uO1xuICBpZiAodGFyZ2V0ICYmIHR5cGVvZiB0YXJnZXQuaWNvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRhcmdldCA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdGFyZ2V0KSwge30sIHtcbiAgICAgIGljb246IHRhcmdldC5pY29uKGNvbG9ycy5wcmltYXJ5Q29sb3IsIGNvbG9ycy5zZWNvbmRhcnlDb2xvcilcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gZ2VuZXJhdGUodGFyZ2V0Lmljb24sIFwic3ZnLVwiLmNvbmNhdCh0YXJnZXQubmFtZSksIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgb25DbGljazogb25DbGljayxcbiAgICBzdHlsZTogc3R5bGUsXG4gICAgJ2RhdGEtaWNvbic6IHRhcmdldC5uYW1lLFxuICAgIHdpZHRoOiAnMWVtJyxcbiAgICBoZWlnaHQ6ICcxZW0nLFxuICAgIGZpbGw6ICdjdXJyZW50Q29sb3InLFxuICAgICdhcmlhLWhpZGRlbic6ICd0cnVlJ1xuICB9LCByZXN0UHJvcHMpLCB7fSwge1xuICAgIHJlZjogc3ZnUmVmXG4gIH0pKTtcbn07XG5JY29uQmFzZS5kaXNwbGF5TmFtZSA9ICdJY29uUmVhY3QnO1xuSWNvbkJhc2UuZ2V0VHdvVG9uZUNvbG9ycyA9IGdldFR3b1RvbmVDb2xvcnM7XG5JY29uQmFzZS5zZXRUd29Ub25lQ29sb3JzID0gc2V0VHdvVG9uZUNvbG9ycztcbmV4cG9ydCBkZWZhdWx0IEljb25CYXNlOyIsICJmdW5jdGlvbiBnZXRSb290KGVsZSkge1xuICB2YXIgX2VsZSRnZXRSb290Tm9kZTtcbiAgcmV0dXJuIGVsZSA9PT0gbnVsbCB8fCBlbGUgPT09IHZvaWQgMCB8fCAoX2VsZSRnZXRSb290Tm9kZSA9IGVsZS5nZXRSb290Tm9kZSkgPT09IG51bGwgfHwgX2VsZSRnZXRSb290Tm9kZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2VsZSRnZXRSb290Tm9kZS5jYWxsKGVsZSk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgaXMgaW4gc2hhZG93Um9vdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5TaGFkb3coZWxlKSB7XG4gIHJldHVybiBnZXRSb290KGVsZSkgaW5zdGFuY2VvZiBTaGFkb3dSb290O1xufVxuXG4vKipcbiAqIFJldHVybiBzaGFkb3dSb290IGlmIHBvc3NpYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTaGFkb3dSb290KGVsZSkge1xuICByZXR1cm4gaW5TaGFkb3coZWxlKSA/IGdldFJvb3QoZWxlKSA6IG51bGw7XG59IiwgImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZSBhcyBnZW5lcmF0ZUNvbG9yIH0gZnJvbSAnQGFudC1kZXNpZ24vY29sb3JzJztcbmltcG9ydCB7IHVwZGF0ZUNTUyB9IGZyb20gXCJyYy11dGlsL2VzL0RvbS9keW5hbWljQ1NTXCI7XG5pbXBvcnQgeyBnZXRTaGFkb3dSb290IH0gZnJvbSBcInJjLXV0aWwvZXMvRG9tL3NoYWRvd1wiO1xuaW1wb3J0IHdhcm4gZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuaW1wb3J0IFJlYWN0LCB7IHVzZUNvbnRleHQsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBJY29uQ29udGV4dCBmcm9tIFwiLi9jb21wb25lbnRzL0NvbnRleHRcIjtcbmZ1bmN0aW9uIGNhbWVsQ2FzZShpbnB1dCkge1xuICByZXR1cm4gaW5wdXQucmVwbGFjZSgvLSguKS9nLCBmdW5jdGlvbiAobWF0Y2gsIGcpIHtcbiAgICByZXR1cm4gZy50b1VwcGVyQ2FzZSgpO1xuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3YXJuaW5nKHZhbGlkLCBtZXNzYWdlKSB7XG4gIHdhcm4odmFsaWQsIFwiW0BhbnQtZGVzaWduL2ljb25zXSBcIi5jb25jYXQobWVzc2FnZSkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSWNvbkRlZmluaXRpb24odGFyZ2V0KSB7XG4gIHJldHVybiBfdHlwZW9mKHRhcmdldCkgPT09ICdvYmplY3QnICYmIHR5cGVvZiB0YXJnZXQubmFtZSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIHRhcmdldC50aGVtZSA9PT0gJ3N0cmluZycgJiYgKF90eXBlb2YodGFyZ2V0Lmljb24pID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgdGFyZ2V0Lmljb24gPT09ICdmdW5jdGlvbicpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUF0dHJzKCkge1xuICB2YXIgYXR0cnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICByZXR1cm4gT2JqZWN0LmtleXMoYXR0cnMpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBrZXkpIHtcbiAgICB2YXIgdmFsID0gYXR0cnNba2V5XTtcbiAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgY2FzZSAnY2xhc3MnOlxuICAgICAgICBhY2MuY2xhc3NOYW1lID0gdmFsO1xuICAgICAgICBkZWxldGUgYWNjLmNsYXNzO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGRlbGV0ZSBhY2Nba2V5XTtcbiAgICAgICAgYWNjW2NhbWVsQ2FzZShrZXkpXSA9IHZhbDtcbiAgICB9XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlKG5vZGUsIGtleSwgcm9vdFByb3BzKSB7XG4gIGlmICghcm9vdFByb3BzKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KG5vZGUudGFnLCBfb2JqZWN0U3ByZWFkKHtcbiAgICAgIGtleToga2V5XG4gICAgfSwgbm9ybWFsaXplQXR0cnMobm9kZS5hdHRycykpLCAobm9kZS5jaGlsZHJlbiB8fCBbXSkubWFwKGZ1bmN0aW9uIChjaGlsZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiBnZW5lcmF0ZShjaGlsZCwgXCJcIi5jb25jYXQoa2V5LCBcIi1cIikuY29uY2F0KG5vZGUudGFnLCBcIi1cIikuY29uY2F0KGluZGV4KSk7XG4gICAgfSkpO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChub2RlLnRhZywgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHtcbiAgICBrZXk6IGtleVxuICB9LCBub3JtYWxpemVBdHRycyhub2RlLmF0dHJzKSksIHJvb3RQcm9wcyksIChub2RlLmNoaWxkcmVuIHx8IFtdKS5tYXAoZnVuY3Rpb24gKGNoaWxkLCBpbmRleCkge1xuICAgIHJldHVybiBnZW5lcmF0ZShjaGlsZCwgXCJcIi5jb25jYXQoa2V5LCBcIi1cIikuY29uY2F0KG5vZGUudGFnLCBcIi1cIikuY29uY2F0KGluZGV4KSk7XG4gIH0pKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWNvbmRhcnlDb2xvcihwcmltYXJ5Q29sb3IpIHtcbiAgLy8gY2hvb3NlIHRoZSBzZWNvbmQgY29sb3JcbiAgcmV0dXJuIGdlbmVyYXRlQ29sb3IocHJpbWFyeUNvbG9yKVswXTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVUd29Ub25lQ29sb3JzKHR3b1RvbmVDb2xvcikge1xuICBpZiAoIXR3b1RvbmVDb2xvcikge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICByZXR1cm4gQXJyYXkuaXNBcnJheSh0d29Ub25lQ29sb3IpID8gdHdvVG9uZUNvbG9yIDogW3R3b1RvbmVDb2xvcl07XG59XG5cbi8vIFRoZXNlIHByb3BzIG1ha2Ugc3VyZSB0aGF0IHRoZSBTVkcgYmVoYXZpb3VycyBsaWtlIGdlbmVyYWwgdGV4dC5cbi8vIFJlZmVyZW5jZTogaHR0cHM6Ly9ibG9nLnByb3RvdHlwci5pby9hbGlnbi1zdmctaWNvbnMtdG8tdGV4dC1hbmQtc2F5LWdvb2RieWUtdG8tZm9udC1pY29ucy1kNDRiM2Q3YjI2YjRcbmV4cG9ydCB2YXIgc3ZnQmFzZVByb3BzID0ge1xuICB3aWR0aDogJzFlbScsXG4gIGhlaWdodDogJzFlbScsXG4gIGZpbGw6ICdjdXJyZW50Q29sb3InLFxuICAnYXJpYS1oaWRkZW4nOiAndHJ1ZScsXG4gIGZvY3VzYWJsZTogJ2ZhbHNlJ1xufTtcbmV4cG9ydCB2YXIgaWNvblN0eWxlcyA9IFwiXFxuLmFudGljb24ge1xcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgY29sb3I6IGluaGVyaXQ7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsaW5lLWhlaWdodDogMDtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcbiAgdmVydGljYWwtYWxpZ246IC0wLjEyNWVtO1xcbiAgdGV4dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJpbGl0eTtcXG4gIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkO1xcbiAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTtcXG59XFxuXFxuLmFudGljb24gPiAqIHtcXG4gIGxpbmUtaGVpZ2h0OiAxO1xcbn1cXG5cXG4uYW50aWNvbiBzdmcge1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG5cXG4uYW50aWNvbjo6YmVmb3JlIHtcXG4gIGRpc3BsYXk6IG5vbmU7XFxufVxcblxcbi5hbnRpY29uIC5hbnRpY29uLWljb24ge1xcbiAgZGlzcGxheTogYmxvY2s7XFxufVxcblxcbi5hbnRpY29uW3RhYmluZGV4XSB7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcblxcbi5hbnRpY29uLXNwaW46OmJlZm9yZSxcXG4uYW50aWNvbi1zcGluIHtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIC13ZWJraXQtYW5pbWF0aW9uOiBsb2FkaW5nQ2lyY2xlIDFzIGluZmluaXRlIGxpbmVhcjtcXG4gIGFuaW1hdGlvbjogbG9hZGluZ0NpcmNsZSAxcyBpbmZpbml0ZSBsaW5lYXI7XFxufVxcblxcbkAtd2Via2l0LWtleWZyYW1lcyBsb2FkaW5nQ2lyY2xlIHtcXG4gIDEwMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XFxuICB9XFxufVxcblxcbkBrZXlmcmFtZXMgbG9hZGluZ0NpcmNsZSB7XFxuICAxMDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xcbiAgfVxcbn1cXG5cIjtcbmV4cG9ydCB2YXIgdXNlSW5zZXJ0U3R5bGVzID0gZnVuY3Rpb24gdXNlSW5zZXJ0U3R5bGVzKGVsZVJlZikge1xuICB2YXIgX3VzZUNvbnRleHQgPSB1c2VDb250ZXh0KEljb25Db250ZXh0KSxcbiAgICBjc3AgPSBfdXNlQ29udGV4dC5jc3AsXG4gICAgcHJlZml4Q2xzID0gX3VzZUNvbnRleHQucHJlZml4Q2xzLFxuICAgIGxheWVyID0gX3VzZUNvbnRleHQubGF5ZXI7XG4gIHZhciBtZXJnZWRTdHlsZVN0ciA9IGljb25TdHlsZXM7XG4gIGlmIChwcmVmaXhDbHMpIHtcbiAgICBtZXJnZWRTdHlsZVN0ciA9IG1lcmdlZFN0eWxlU3RyLnJlcGxhY2UoL2FudGljb24vZywgcHJlZml4Q2xzKTtcbiAgfVxuICBpZiAobGF5ZXIpIHtcbiAgICBtZXJnZWRTdHlsZVN0ciA9IFwiQGxheWVyIFwiLmNvbmNhdChsYXllciwgXCIge1xcblwiKS5jb25jYXQobWVyZ2VkU3R5bGVTdHIsIFwiXFxufVwiKTtcbiAgfVxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBlbGUgPSBlbGVSZWYuY3VycmVudDtcbiAgICB2YXIgc2hhZG93Um9vdCA9IGdldFNoYWRvd1Jvb3QoZWxlKTtcbiAgICB1cGRhdGVDU1MobWVyZ2VkU3R5bGVTdHIsICdAYW50LWRlc2lnbi1pY29ucycsIHtcbiAgICAgIHByZXBlbmQ6ICFsYXllcixcbiAgICAgIGNzcDogY3NwLFxuICAgICAgYXR0YWNoVG86IHNoYWRvd1Jvb3RcbiAgICB9KTtcbiAgfSwgW10pO1xufTsiLCAiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgUmVhY3RJY29uIGZyb20gXCIuL0ljb25CYXNlXCI7XG5pbXBvcnQgeyBub3JtYWxpemVUd29Ub25lQ29sb3JzIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5leHBvcnQgZnVuY3Rpb24gc2V0VHdvVG9uZUNvbG9yKHR3b1RvbmVDb2xvcikge1xuICB2YXIgX25vcm1hbGl6ZVR3b1RvbmVDb2xvID0gbm9ybWFsaXplVHdvVG9uZUNvbG9ycyh0d29Ub25lQ29sb3IpLFxuICAgIF9ub3JtYWxpemVUd29Ub25lQ29sbzIgPSBfc2xpY2VkVG9BcnJheShfbm9ybWFsaXplVHdvVG9uZUNvbG8sIDIpLFxuICAgIHByaW1hcnlDb2xvciA9IF9ub3JtYWxpemVUd29Ub25lQ29sbzJbMF0sXG4gICAgc2Vjb25kYXJ5Q29sb3IgPSBfbm9ybWFsaXplVHdvVG9uZUNvbG8yWzFdO1xuICByZXR1cm4gUmVhY3RJY29uLnNldFR3b1RvbmVDb2xvcnMoe1xuICAgIHByaW1hcnlDb2xvcjogcHJpbWFyeUNvbG9yLFxuICAgIHNlY29uZGFyeUNvbG9yOiBzZWNvbmRhcnlDb2xvclxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRUd29Ub25lQ29sb3IoKSB7XG4gIHZhciBjb2xvcnMgPSBSZWFjdEljb24uZ2V0VHdvVG9uZUNvbG9ycygpO1xuICBpZiAoIWNvbG9ycy5jYWxjdWxhdGVkKSB7XG4gICAgcmV0dXJuIGNvbG9ycy5wcmltYXJ5Q29sb3I7XG4gIH1cbiAgcmV0dXJuIFtjb2xvcnMucHJpbWFyeUNvbG9yLCBjb2xvcnMuc2Vjb25kYXJ5Q29sb3JdO1xufSIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBDbG9zZUNpcmNsZUZpbGxlZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9DbG9zZUNpcmNsZUZpbGxlZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gXCIuLi9jb21wb25lbnRzL0FudGRJY29uXCI7XG52YXIgQ2xvc2VDaXJjbGVGaWxsZWQgPSBmdW5jdGlvbiBDbG9zZUNpcmNsZUZpbGxlZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbnRkSWNvbiwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogQ2xvc2VDaXJjbGVGaWxsZWRTdmdcbiAgfSkpO1xufTtcblxuLyoqIVtjbG9zZS1jaXJjbGVdKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjNhV1IwYUQwaU5UQWlJR2hsYVdkb2REMGlOVEFpSUdacGJHdzlJaU5qWVdOaFkyRWlJR1pwYkd3dGNuVnNaVDBpWlhabGJtOWtaQ0lnZG1sbGQwSnZlRDBpTmpRZ05qUWdPRGsySURnNU5pSWdabTlqZFhOaFlteGxQU0ptWVd4elpTSWdlRzFzYm5NOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6SXdNREF2YzNabklqNDhjR0YwYUNCa1BTSk5OVEV5SURZMFl6STBOeTQwSURBZ05EUTRJREl3TUM0MklEUTBPQ0EwTkRoVE56VTVMalFnT1RZd0lEVXhNaUE1TmpBZ05qUWdOelU1TGpRZ05qUWdOVEV5SURJMk5DNDJJRFkwSURVeE1pQTJOSHB0TVRJM0xqazRJREkzTkM0NE1tZ3RMakEwYkMwdU1EZ3VNRFpNTlRFeUlEUTJOaTQzTlNBek9EUXVNVFFnTXpNNExqZzRZeTB1TURRdExqQTFMUzR3TmkwdU1EWXRMakE0TFM0d05tRXVNVEl1TVRJZ01DQXdNQzB1TURjZ01HTXRMakF6SURBdExqQTFMakF4TFM0d09TNHdOV3d0TkRVdU1ESWdORFV1TURKaExqSXVNaUF3SURBd0xTNHdOUzR3T1M0eE1pNHhNaUF3SURBd01DQXVNRGQyTGpBeVlTNHlOeTR5TnlBd0lEQXdMakEyTGpBMlREUTJOaTQzTlNBMU1USWdNek00TGpnNElEWXpPUzQ0Tm1NdExqQTFMakEwTFM0d05pNHdOaTB1TURZdU1EaGhMakV5TGpFeUlEQWdNREF3SUM0d04yTXdJQzR3TXk0d01TNHdOUzR3TlM0d09XdzBOUzR3TWlBME5TNHdNbUV1TWk0eUlEQWdNREF1TURrdU1EVXVNVEl1TVRJZ01DQXdNQzR3TnlBd1l5NHdNaUF3SUM0d05DMHVNREV1TURndExqQTFURFV4TWlBMU5UY3VNalZzTVRJM0xqZzJJREV5Tnk0NE4yTXVNRFF1TURRdU1EWXVNRFV1TURndU1EVmhMakV5TGpFeUlEQWdNREF1TURjZ01HTXVNRE1nTUNBdU1EVXRMakF4TGpBNUxTNHdOV3cwTlM0d01pMDBOUzR3TW1FdU1pNHlJREFnTURBdU1EVXRMakE1TGpFeUxqRXlJREFnTURBd0xTNHdOM1l0TGpBeVlTNHlOeTR5TnlBd0lEQXdMUzR3TlMwdU1EWk1OVFUzTGpJMUlEVXhNbXd4TWpjdU9EY3RNVEkzTGpnMll5NHdOQzB1TURRdU1EVXRMakEyTGpBMUxTNHdPR0V1TVRJdU1USWdNQ0F3TURBdExqQTNZekF0TGpBekxTNHdNUzB1TURVdExqQTFMUzR3T1d3dE5EVXVNREl0TkRVdU1ESmhMakl1TWlBd0lEQXdMUzR3T1MwdU1EVXVNVEl1TVRJZ01DQXdNQzB1TURjZ01Ib2lJQzgrUEM5emRtYyspICovXG52YXIgUmVmSWNvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKENsb3NlQ2lyY2xlRmlsbGVkKTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFJlZkljb24uZGlzcGxheU5hbWUgPSAnQ2xvc2VDaXJjbGVGaWxsZWQnO1xufVxuZXhwb3J0IGRlZmF1bHQgUmVmSWNvbjsiLCAiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgQ2xvc2VDaXJjbGVGaWxsZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcImZpbGwtcnVsZVwiOiBcImV2ZW5vZGRcIiwgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk01MTIgNjRjMjQ3LjQgMCA0NDggMjAwLjYgNDQ4IDQ0OFM3NTkuNCA5NjAgNTEyIDk2MCA2NCA3NTkuNCA2NCA1MTIgMjY0LjYgNjQgNTEyIDY0em0xMjcuOTggMjc0LjgyaC0uMDRsLS4wOC4wNkw1MTIgNDY2Ljc1IDM4NC4xNCAzMzguODhjLS4wNC0uMDUtLjA2LS4wNi0uMDgtLjA2YS4xMi4xMiAwIDAwLS4wNyAwYy0uMDMgMC0uMDUuMDEtLjA5LjA1bC00NS4wMiA0NS4wMmEuMi4yIDAgMDAtLjA1LjA5LjEyLjEyIDAgMDAwIC4wN3YuMDJhLjI3LjI3IDAgMDAuMDYuMDZMNDY2Ljc1IDUxMiAzMzguODggNjM5Ljg2Yy0uMDUuMDQtLjA2LjA2LS4wNi4wOGEuMTIuMTIgMCAwMDAgLjA3YzAgLjAzLjAxLjA1LjA1LjA5bDQ1LjAyIDQ1LjAyYS4yLjIgMCAwMC4wOS4wNS4xMi4xMiAwIDAwLjA3IDBjLjAyIDAgLjA0LS4wMS4wOC0uMDVMNTEyIDU1Ny4yNWwxMjcuODYgMTI3Ljg3Yy4wNC4wNC4wNi4wNS4wOC4wNWEuMTIuMTIgMCAwMC4wNyAwYy4wMyAwIC4wNS0uMDEuMDktLjA1bDQ1LjAyLTQ1LjAyYS4yLjIgMCAwMC4wNS0uMDkuMTIuMTIgMCAwMDAtLjA3di0uMDJhLjI3LjI3IDAgMDAtLjA1LS4wNkw1NTcuMjUgNTEybDEyNy44Ny0xMjcuODZjLjA0LS4wNC4wNS0uMDYuMDUtLjA4YS4xMi4xMiAwIDAwMC0uMDdjMC0uMDMtLjAxLS4wNS0uMDUtLjA5bC00NS4wMi00NS4wMmEuMi4yIDAgMDAtLjA5LS4wNS4xMi4xMiAwIDAwLS4wNyAwelwiIH0gfV0gfSwgXCJuYW1lXCI6IFwiY2xvc2UtY2lyY2xlXCIsIFwidGhlbWVcIjogXCJmaWxsZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgQ2xvc2VDaXJjbGVGaWxsZWQ7XG4iLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQ2xvc2VPdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9DbG9zZU91dGxpbmVkXCI7XG5pbXBvcnQgQW50ZEljb24gZnJvbSBcIi4uL2NvbXBvbmVudHMvQW50ZEljb25cIjtcbnZhciBDbG9zZU91dGxpbmVkID0gZnVuY3Rpb24gQ2xvc2VPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbnRkSWNvbiwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogQ2xvc2VPdXRsaW5lZFN2Z1xuICB9KSk7XG59O1xuXG4vKiohW2Nsb3NlXShkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUIzYVdSMGFEMGlOVEFpSUdobGFXZG9kRDBpTlRBaUlHWnBiR3c5SWlOallXTmhZMkVpSUdacGJHd3RjblZzWlQwaVpYWmxibTlrWkNJZ2RtbGxkMEp2ZUQwaU5qUWdOalFnT0RrMklEZzVOaUlnWm05amRYTmhZbXhsUFNKbVlXeHpaU0lnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JajQ4Y0dGMGFDQmtQU0pOTnprNUxqZzJJREUyTmk0ek1XTXVNRElnTUNBdU1EUXVNREl1TURndU1EWnNOVGN1TmprZ05UY3VOMk11TURRdU1ETXVNRFV1TURVdU1EWXVNRGhoTGpFeUxqRXlJREFnTURFd0lDNHdObU13SUM0d015MHVNREl1TURVdExqQTJMakE1VERVMk9TNDVNeUExTVRKc01qZzNMamNnTWpnM0xqZGpMakEwTGpBMExqQTFMakEyTGpBMkxqQTVZUzR4TWk0eE1pQXdJREF4TUNBdU1EZGpNQ0F1TURJdExqQXlMakEwTFM0d05pNHdPR3d0TlRjdU55QTFOeTQyT1dNdExqQXpMakEwTFM0d05TNHdOUzB1TURjdU1EWmhMakV5TGpFeUlEQWdNREV0TGpBM0lEQmpMUzR3TXlBd0xTNHdOUzB1TURJdExqQTVMUzR3Tmt3MU1USWdOVFk1TGpremJDMHlPRGN1TnlBeU9EY3VOMk10TGpBMExqQTBMUzR3Tmk0d05TMHVNRGt1TURaaExqRXlMakV5SURBZ01ERXRMakEzSURCakxTNHdNaUF3TFM0d05DMHVNREl0TGpBNExTNHdObXd0TlRjdU5qa3ROVGN1TjJNdExqQTBMUzR3TXkwdU1EVXRMakExTFM0d05pMHVNRGRoTGpFeUxqRXlJREFnTURFd0xTNHdOMk13TFM0d015NHdNaTB1TURVdU1EWXRMakE1VERRMU5DNHdOeUExTVRKc0xUSTROeTQzTFRJNE55NDNZeTB1TURRdExqQTBMUzR3TlMwdU1EWXRMakEyTFM0d09XRXVNVEl1TVRJZ01DQXdNVEF0TGpBM1l6QXRMakF5TGpBeUxTNHdOQzR3TmkwdU1EaHNOVGN1TnkwMU55NDJPV011TURNdExqQTBMakExTFM0d05TNHdOeTB1TURaaExqRXlMakV5SURBZ01ERXVNRGNnTUdNdU1ETWdNQ0F1TURVdU1ESXVNRGt1TURaTU5URXlJRFExTkM0d04yd3lPRGN1TnkweU9EY3VOMk11TURRdExqQTBMakEyTFM0d05TNHdPUzB1TURaaExqRXlMakV5SURBZ01ERXVNRGNnTUhvaUlDOCtQQzl6ZG1jKykgKi9cbnZhciBSZWZJY29uID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoQ2xvc2VPdXRsaW5lZCk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBSZWZJY29uLmRpc3BsYXlOYW1lID0gJ0Nsb3NlT3V0bGluZWQnO1xufVxuZXhwb3J0IGRlZmF1bHQgUmVmSWNvbjsiLCAiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgQ2xvc2VPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwiZmlsbC1ydWxlXCI6IFwiZXZlbm9kZFwiLCBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTc5OS44NiAxNjYuMzFjLjAyIDAgLjA0LjAyLjA4LjA2bDU3LjY5IDU3LjdjLjA0LjAzLjA1LjA1LjA2LjA4YS4xMi4xMiAwIDAxMCAuMDZjMCAuMDMtLjAyLjA1LS4wNi4wOUw1NjkuOTMgNTEybDI4Ny43IDI4Ny43Yy4wNC4wNC4wNS4wNi4wNi4wOWEuMTIuMTIgMCAwMTAgLjA3YzAgLjAyLS4wMi4wNC0uMDYuMDhsLTU3LjcgNTcuNjljLS4wMy4wNC0uMDUuMDUtLjA3LjA2YS4xMi4xMiAwIDAxLS4wNyAwYy0uMDMgMC0uMDUtLjAyLS4wOS0uMDZMNTEyIDU2OS45M2wtMjg3LjcgMjg3LjdjLS4wNC4wNC0uMDYuMDUtLjA5LjA2YS4xMi4xMiAwIDAxLS4wNyAwYy0uMDIgMC0uMDQtLjAyLS4wOC0uMDZsLTU3LjY5LTU3LjdjLS4wNC0uMDMtLjA1LS4wNS0uMDYtLjA3YS4xMi4xMiAwIDAxMC0uMDdjMC0uMDMuMDItLjA1LjA2LS4wOUw0NTQuMDcgNTEybC0yODcuNy0yODcuN2MtLjA0LS4wNC0uMDUtLjA2LS4wNi0uMDlhLjEyLjEyIDAgMDEwLS4wN2MwLS4wMi4wMi0uMDQuMDYtLjA4bDU3LjctNTcuNjljLjAzLS4wNC4wNS0uMDUuMDctLjA2YS4xMi4xMiAwIDAxLjA3IDBjLjAzIDAgLjA1LjAyLjA5LjA2TDUxMiA0NTQuMDdsMjg3LjctMjg3LjdjLjA0LS4wNC4wNi0uMDUuMDktLjA2YS4xMi4xMiAwIDAxLjA3IDB6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJjbG9zZVwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgQ2xvc2VPdXRsaW5lZDtcbiIsICJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xudmFyIGF0dHJpYnV0ZXMgPSBcImFjY2VwdCBhY2NlcHRDaGFyc2V0IGFjY2Vzc0tleSBhY3Rpb24gYWxsb3dGdWxsU2NyZWVuIGFsbG93VHJhbnNwYXJlbmN5XFxuICAgIGFsdCBhc3luYyBhdXRvQ29tcGxldGUgYXV0b0ZvY3VzIGF1dG9QbGF5IGNhcHR1cmUgY2VsbFBhZGRpbmcgY2VsbFNwYWNpbmcgY2hhbGxlbmdlXFxuICAgIGNoYXJTZXQgY2hlY2tlZCBjbGFzc0lEIGNsYXNzTmFtZSBjb2xTcGFuIGNvbHMgY29udGVudCBjb250ZW50RWRpdGFibGUgY29udGV4dE1lbnVcXG4gICAgY29udHJvbHMgY29vcmRzIGNyb3NzT3JpZ2luIGRhdGEgZGF0ZVRpbWUgZGVmYXVsdCBkZWZlciBkaXIgZGlzYWJsZWQgZG93bmxvYWQgZHJhZ2dhYmxlXFxuICAgIGVuY1R5cGUgZm9ybSBmb3JtQWN0aW9uIGZvcm1FbmNUeXBlIGZvcm1NZXRob2QgZm9ybU5vVmFsaWRhdGUgZm9ybVRhcmdldCBmcmFtZUJvcmRlclxcbiAgICBoZWFkZXJzIGhlaWdodCBoaWRkZW4gaGlnaCBocmVmIGhyZWZMYW5nIGh0bWxGb3IgaHR0cEVxdWl2IGljb24gaWQgaW5wdXRNb2RlIGludGVncml0eVxcbiAgICBpcyBrZXlQYXJhbXMga2V5VHlwZSBraW5kIGxhYmVsIGxhbmcgbGlzdCBsb29wIGxvdyBtYW5pZmVzdCBtYXJnaW5IZWlnaHQgbWFyZ2luV2lkdGggbWF4IG1heExlbmd0aCBtZWRpYVxcbiAgICBtZWRpYUdyb3VwIG1ldGhvZCBtaW4gbWluTGVuZ3RoIG11bHRpcGxlIG11dGVkIG5hbWUgbm9WYWxpZGF0ZSBub25jZSBvcGVuXFxuICAgIG9wdGltdW0gcGF0dGVybiBwbGFjZWhvbGRlciBwb3N0ZXIgcHJlbG9hZCByYWRpb0dyb3VwIHJlYWRPbmx5IHJlbCByZXF1aXJlZFxcbiAgICByZXZlcnNlZCByb2xlIHJvd1NwYW4gcm93cyBzYW5kYm94IHNjb3BlIHNjb3BlZCBzY3JvbGxpbmcgc2VhbWxlc3Mgc2VsZWN0ZWRcXG4gICAgc2hhcGUgc2l6ZSBzaXplcyBzcGFuIHNwZWxsQ2hlY2sgc3JjIHNyY0RvYyBzcmNMYW5nIHNyY1NldCBzdGFydCBzdGVwIHN0eWxlXFxuICAgIHN1bW1hcnkgdGFiSW5kZXggdGFyZ2V0IHRpdGxlIHR5cGUgdXNlTWFwIHZhbHVlIHdpZHRoIHdtb2RlIHdyYXBcIjtcbnZhciBldmVudHNOYW1lID0gXCJvbkNvcHkgb25DdXQgb25QYXN0ZSBvbkNvbXBvc2l0aW9uRW5kIG9uQ29tcG9zaXRpb25TdGFydCBvbkNvbXBvc2l0aW9uVXBkYXRlIG9uS2V5RG93blxcbiAgICBvbktleVByZXNzIG9uS2V5VXAgb25Gb2N1cyBvbkJsdXIgb25DaGFuZ2Ugb25JbnB1dCBvblN1Ym1pdCBvbkNsaWNrIG9uQ29udGV4dE1lbnUgb25Eb3VibGVDbGlja1xcbiAgICBvbkRyYWcgb25EcmFnRW5kIG9uRHJhZ0VudGVyIG9uRHJhZ0V4aXQgb25EcmFnTGVhdmUgb25EcmFnT3ZlciBvbkRyYWdTdGFydCBvbkRyb3Agb25Nb3VzZURvd25cXG4gICAgb25Nb3VzZUVudGVyIG9uTW91c2VMZWF2ZSBvbk1vdXNlTW92ZSBvbk1vdXNlT3V0IG9uTW91c2VPdmVyIG9uTW91c2VVcCBvblNlbGVjdCBvblRvdWNoQ2FuY2VsXFxuICAgIG9uVG91Y2hFbmQgb25Ub3VjaE1vdmUgb25Ub3VjaFN0YXJ0IG9uU2Nyb2xsIG9uV2hlZWwgb25BYm9ydCBvbkNhblBsYXkgb25DYW5QbGF5VGhyb3VnaFxcbiAgICBvbkR1cmF0aW9uQ2hhbmdlIG9uRW1wdGllZCBvbkVuY3J5cHRlZCBvbkVuZGVkIG9uRXJyb3Igb25Mb2FkZWREYXRhIG9uTG9hZGVkTWV0YWRhdGFcXG4gICAgb25Mb2FkU3RhcnQgb25QYXVzZSBvblBsYXkgb25QbGF5aW5nIG9uUHJvZ3Jlc3Mgb25SYXRlQ2hhbmdlIG9uU2Vla2VkIG9uU2Vla2luZyBvblN0YWxsZWQgb25TdXNwZW5kIG9uVGltZVVwZGF0ZSBvblZvbHVtZUNoYW5nZSBvbldhaXRpbmcgb25Mb2FkIG9uRXJyb3JcIjtcbnZhciBwcm9wTGlzdCA9IFwiXCIuY29uY2F0KGF0dHJpYnV0ZXMsIFwiIFwiKS5jb25jYXQoZXZlbnRzTmFtZSkuc3BsaXQoL1tcXHNcXG5dKy8pO1xuXG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4gKi9cbnZhciBhcmlhUHJlZml4ID0gJ2FyaWEtJztcbnZhciBkYXRhUHJlZml4ID0gJ2RhdGEtJztcbmZ1bmN0aW9uIG1hdGNoKGtleSwgcHJlZml4KSB7XG4gIHJldHVybiBrZXkuaW5kZXhPZihwcmVmaXgpID09PSAwO1xufVxuLyoqXG4gKiBQaWNrZXIgcHJvcHMgZnJvbSBleGlzdCBwcm9wcyB3aXRoIGZpbHRlclxuICogQHBhcmFtIHByb3BzIFBhc3NlZCBwcm9wc1xuICogQHBhcmFtIGFyaWFPbmx5IGJvb2xlYW4gfCB7IGFyaWE/OiBib29sZWFuOyBkYXRhPzogYm9vbGVhbjsgYXR0cj86IGJvb2xlYW47IH0gZmlsdGVyIGNvbmZpZ1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwaWNrQXR0cnMocHJvcHMpIHtcbiAgdmFyIGFyaWFPbmx5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcbiAgdmFyIG1lcmdlZENvbmZpZztcbiAgaWYgKGFyaWFPbmx5ID09PSBmYWxzZSkge1xuICAgIG1lcmdlZENvbmZpZyA9IHtcbiAgICAgIGFyaWE6IHRydWUsXG4gICAgICBkYXRhOiB0cnVlLFxuICAgICAgYXR0cjogdHJ1ZVxuICAgIH07XG4gIH0gZWxzZSBpZiAoYXJpYU9ubHkgPT09IHRydWUpIHtcbiAgICBtZXJnZWRDb25maWcgPSB7XG4gICAgICBhcmlhOiB0cnVlXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBtZXJnZWRDb25maWcgPSBfb2JqZWN0U3ByZWFkKHt9LCBhcmlhT25seSk7XG4gIH1cbiAgdmFyIGF0dHJzID0ge307XG4gIE9iamVjdC5rZXlzKHByb3BzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoXG4gICAgLy8gQXJpYVxuICAgIG1lcmdlZENvbmZpZy5hcmlhICYmIChrZXkgPT09ICdyb2xlJyB8fCBtYXRjaChrZXksIGFyaWFQcmVmaXgpKSB8fFxuICAgIC8vIERhdGFcbiAgICBtZXJnZWRDb25maWcuZGF0YSAmJiBtYXRjaChrZXksIGRhdGFQcmVmaXgpIHx8XG4gICAgLy8gQXR0clxuICAgIG1lcmdlZENvbmZpZy5hdHRyICYmIHByb3BMaXN0LmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIGF0dHJzW2tleV0gPSBwcm9wc1trZXldO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBhdHRycztcbn0iLCAiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCBmdW5jdGlvbiBpc0ZyYWdtZW50KGNoaWxkKSB7XG4gIHJldHVybiBjaGlsZCAmJiAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoY2hpbGQpICYmIGNoaWxkLnR5cGUgPT09IFJlYWN0LkZyYWdtZW50O1xufVxuZXhwb3J0IGNvbnN0IHJlcGxhY2VFbGVtZW50ID0gKGVsZW1lbnQsIHJlcGxhY2VtZW50LCBwcm9wcykgPT4ge1xuICBpZiAoISAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICByZXR1cm4gcmVwbGFjZW1lbnQ7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoZWxlbWVudCwgdHlwZW9mIHByb3BzID09PSAnZnVuY3Rpb24nID8gcHJvcHMoZWxlbWVudC5wcm9wcyB8fCB7fSkgOiBwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIGNsb25lRWxlbWVudChlbGVtZW50LCBwcm9wcykge1xuICByZXR1cm4gcmVwbGFjZUVsZW1lbnQoZWxlbWVudCwgZWxlbWVudCwgcHJvcHMpO1xufSIsICJpbXBvcnQgeyB1c2VUb2tlbiB9IGZyb20gJy4uLy4uL3RoZW1lL2ludGVybmFsJztcbi8qKlxuICogVGhpcyBob29rIGlzIG9ubHkgZm9yIGNzc1ZhciB0byBhZGQgcm9vdCBjbGFzc05hbWUgZm9yIGNvbXBvbmVudHMuXG4gKiBJZiByb290IENsYXNzTmFtZSBpcyBuZWVkZWQsIHRoaXMgaG9vayBjb3VsZCBiZSByZWZhY3RvcmVkIHdpdGggYC1yb290YFxuICogQHBhcmFtIHByZWZpeENsc1xuICovXG5jb25zdCB1c2VDU1NWYXJDbHMgPSBwcmVmaXhDbHMgPT4ge1xuICBjb25zdCBbLCwsLCBjc3NWYXJdID0gdXNlVG9rZW4oKTtcbiAgcmV0dXJuIGNzc1ZhciA/IGAke3ByZWZpeENsc30tY3NzLXZhcmAgOiAnJztcbn07XG5leHBvcnQgZGVmYXVsdCB1c2VDU1NWYXJDbHM7IiwgIi8qKlxuICogQGlnbm9yZVxuICogc29tZSBrZXktY29kZXMgZGVmaW5pdGlvbiBhbmQgdXRpbHMgZnJvbSBjbG9zdXJlLWxpYnJhcnlcbiAqIEBhdXRob3IgeWltaW5naGVAZ21haWwuY29tXG4gKi9cblxudmFyIEtleUNvZGUgPSB7XG4gIC8qKlxuICAgKiBNQUNfRU5URVJcbiAgICovXG4gIE1BQ19FTlRFUjogMyxcbiAgLyoqXG4gICAqIEJBQ0tTUEFDRVxuICAgKi9cbiAgQkFDS1NQQUNFOiA4LFxuICAvKipcbiAgICogVEFCXG4gICAqL1xuICBUQUI6IDksXG4gIC8qKlxuICAgKiBOVU1MT0NLIG9uIEZGL1NhZmFyaSBNYWNcbiAgICovXG4gIE5VTV9DRU5URVI6IDEyLFxuICAvLyBOVU1MT0NLIG9uIEZGL1NhZmFyaSBNYWNcbiAgLyoqXG4gICAqIEVOVEVSXG4gICAqL1xuICBFTlRFUjogMTMsXG4gIC8qKlxuICAgKiBTSElGVFxuICAgKi9cbiAgU0hJRlQ6IDE2LFxuICAvKipcbiAgICogQ1RSTFxuICAgKi9cbiAgQ1RSTDogMTcsXG4gIC8qKlxuICAgKiBBTFRcbiAgICovXG4gIEFMVDogMTgsXG4gIC8qKlxuICAgKiBQQVVTRVxuICAgKi9cbiAgUEFVU0U6IDE5LFxuICAvKipcbiAgICogQ0FQU19MT0NLXG4gICAqL1xuICBDQVBTX0xPQ0s6IDIwLFxuICAvKipcbiAgICogRVNDXG4gICAqL1xuICBFU0M6IDI3LFxuICAvKipcbiAgICogU1BBQ0VcbiAgICovXG4gIFNQQUNFOiAzMixcbiAgLyoqXG4gICAqIFBBR0VfVVBcbiAgICovXG4gIFBBR0VfVVA6IDMzLFxuICAvLyBhbHNvIE5VTV9OT1JUSF9FQVNUXG4gIC8qKlxuICAgKiBQQUdFX0RPV05cbiAgICovXG4gIFBBR0VfRE9XTjogMzQsXG4gIC8vIGFsc28gTlVNX1NPVVRIX0VBU1RcbiAgLyoqXG4gICAqIEVORFxuICAgKi9cbiAgRU5EOiAzNSxcbiAgLy8gYWxzbyBOVU1fU09VVEhfV0VTVFxuICAvKipcbiAgICogSE9NRVxuICAgKi9cbiAgSE9NRTogMzYsXG4gIC8vIGFsc28gTlVNX05PUlRIX1dFU1RcbiAgLyoqXG4gICAqIExFRlRcbiAgICovXG4gIExFRlQ6IDM3LFxuICAvLyBhbHNvIE5VTV9XRVNUXG4gIC8qKlxuICAgKiBVUFxuICAgKi9cbiAgVVA6IDM4LFxuICAvLyBhbHNvIE5VTV9OT1JUSFxuICAvKipcbiAgICogUklHSFRcbiAgICovXG4gIFJJR0hUOiAzOSxcbiAgLy8gYWxzbyBOVU1fRUFTVFxuICAvKipcbiAgICogRE9XTlxuICAgKi9cbiAgRE9XTjogNDAsXG4gIC8vIGFsc28gTlVNX1NPVVRIXG4gIC8qKlxuICAgKiBQUklOVF9TQ1JFRU5cbiAgICovXG4gIFBSSU5UX1NDUkVFTjogNDQsXG4gIC8qKlxuICAgKiBJTlNFUlRcbiAgICovXG4gIElOU0VSVDogNDUsXG4gIC8vIGFsc28gTlVNX0lOU0VSVFxuICAvKipcbiAgICogREVMRVRFXG4gICAqL1xuICBERUxFVEU6IDQ2LFxuICAvLyBhbHNvIE5VTV9ERUxFVEVcbiAgLyoqXG4gICAqIFpFUk9cbiAgICovXG4gIFpFUk86IDQ4LFxuICAvKipcbiAgICogT05FXG4gICAqL1xuICBPTkU6IDQ5LFxuICAvKipcbiAgICogVFdPXG4gICAqL1xuICBUV086IDUwLFxuICAvKipcbiAgICogVEhSRUVcbiAgICovXG4gIFRIUkVFOiA1MSxcbiAgLyoqXG4gICAqIEZPVVJcbiAgICovXG4gIEZPVVI6IDUyLFxuICAvKipcbiAgICogRklWRVxuICAgKi9cbiAgRklWRTogNTMsXG4gIC8qKlxuICAgKiBTSVhcbiAgICovXG4gIFNJWDogNTQsXG4gIC8qKlxuICAgKiBTRVZFTlxuICAgKi9cbiAgU0VWRU46IDU1LFxuICAvKipcbiAgICogRUlHSFRcbiAgICovXG4gIEVJR0hUOiA1NixcbiAgLyoqXG4gICAqIE5JTkVcbiAgICovXG4gIE5JTkU6IDU3LFxuICAvKipcbiAgICogUVVFU1RJT05fTUFSS1xuICAgKi9cbiAgUVVFU1RJT05fTUFSSzogNjMsXG4gIC8vIG5lZWRzIGxvY2FsaXphdGlvblxuICAvKipcbiAgICogQVxuICAgKi9cbiAgQTogNjUsXG4gIC8qKlxuICAgKiBCXG4gICAqL1xuICBCOiA2NixcbiAgLyoqXG4gICAqIENcbiAgICovXG4gIEM6IDY3LFxuICAvKipcbiAgICogRFxuICAgKi9cbiAgRDogNjgsXG4gIC8qKlxuICAgKiBFXG4gICAqL1xuICBFOiA2OSxcbiAgLyoqXG4gICAqIEZcbiAgICovXG4gIEY6IDcwLFxuICAvKipcbiAgICogR1xuICAgKi9cbiAgRzogNzEsXG4gIC8qKlxuICAgKiBIXG4gICAqL1xuICBIOiA3MixcbiAgLyoqXG4gICAqIElcbiAgICovXG4gIEk6IDczLFxuICAvKipcbiAgICogSlxuICAgKi9cbiAgSjogNzQsXG4gIC8qKlxuICAgKiBLXG4gICAqL1xuICBLOiA3NSxcbiAgLyoqXG4gICAqIExcbiAgICovXG4gIEw6IDc2LFxuICAvKipcbiAgICogTVxuICAgKi9cbiAgTTogNzcsXG4gIC8qKlxuICAgKiBOXG4gICAqL1xuICBOOiA3OCxcbiAgLyoqXG4gICAqIE9cbiAgICovXG4gIE86IDc5LFxuICAvKipcbiAgICogUFxuICAgKi9cbiAgUDogODAsXG4gIC8qKlxuICAgKiBRXG4gICAqL1xuICBROiA4MSxcbiAgLyoqXG4gICAqIFJcbiAgICovXG4gIFI6IDgyLFxuICAvKipcbiAgICogU1xuICAgKi9cbiAgUzogODMsXG4gIC8qKlxuICAgKiBUXG4gICAqL1xuICBUOiA4NCxcbiAgLyoqXG4gICAqIFVcbiAgICovXG4gIFU6IDg1LFxuICAvKipcbiAgICogVlxuICAgKi9cbiAgVjogODYsXG4gIC8qKlxuICAgKiBXXG4gICAqL1xuICBXOiA4NyxcbiAgLyoqXG4gICAqIFhcbiAgICovXG4gIFg6IDg4LFxuICAvKipcbiAgICogWVxuICAgKi9cbiAgWTogODksXG4gIC8qKlxuICAgKiBaXG4gICAqL1xuICBaOiA5MCxcbiAgLyoqXG4gICAqIE1FVEFcbiAgICovXG4gIE1FVEE6IDkxLFxuICAvLyBXSU5fS0VZX0xFRlRcbiAgLyoqXG4gICAqIFdJTl9LRVlfUklHSFRcbiAgICovXG4gIFdJTl9LRVlfUklHSFQ6IDkyLFxuICAvKipcbiAgICogQ09OVEVYVF9NRU5VXG4gICAqL1xuICBDT05URVhUX01FTlU6IDkzLFxuICAvKipcbiAgICogTlVNX1pFUk9cbiAgICovXG4gIE5VTV9aRVJPOiA5NixcbiAgLyoqXG4gICAqIE5VTV9PTkVcbiAgICovXG4gIE5VTV9PTkU6IDk3LFxuICAvKipcbiAgICogTlVNX1RXT1xuICAgKi9cbiAgTlVNX1RXTzogOTgsXG4gIC8qKlxuICAgKiBOVU1fVEhSRUVcbiAgICovXG4gIE5VTV9USFJFRTogOTksXG4gIC8qKlxuICAgKiBOVU1fRk9VUlxuICAgKi9cbiAgTlVNX0ZPVVI6IDEwMCxcbiAgLyoqXG4gICAqIE5VTV9GSVZFXG4gICAqL1xuICBOVU1fRklWRTogMTAxLFxuICAvKipcbiAgICogTlVNX1NJWFxuICAgKi9cbiAgTlVNX1NJWDogMTAyLFxuICAvKipcbiAgICogTlVNX1NFVkVOXG4gICAqL1xuICBOVU1fU0VWRU46IDEwMyxcbiAgLyoqXG4gICAqIE5VTV9FSUdIVFxuICAgKi9cbiAgTlVNX0VJR0hUOiAxMDQsXG4gIC8qKlxuICAgKiBOVU1fTklORVxuICAgKi9cbiAgTlVNX05JTkU6IDEwNSxcbiAgLyoqXG4gICAqIE5VTV9NVUxUSVBMWVxuICAgKi9cbiAgTlVNX01VTFRJUExZOiAxMDYsXG4gIC8qKlxuICAgKiBOVU1fUExVU1xuICAgKi9cbiAgTlVNX1BMVVM6IDEwNyxcbiAgLyoqXG4gICAqIE5VTV9NSU5VU1xuICAgKi9cbiAgTlVNX01JTlVTOiAxMDksXG4gIC8qKlxuICAgKiBOVU1fUEVSSU9EXG4gICAqL1xuICBOVU1fUEVSSU9EOiAxMTAsXG4gIC8qKlxuICAgKiBOVU1fRElWSVNJT05cbiAgICovXG4gIE5VTV9ESVZJU0lPTjogMTExLFxuICAvKipcbiAgICogRjFcbiAgICovXG4gIEYxOiAxMTIsXG4gIC8qKlxuICAgKiBGMlxuICAgKi9cbiAgRjI6IDExMyxcbiAgLyoqXG4gICAqIEYzXG4gICAqL1xuICBGMzogMTE0LFxuICAvKipcbiAgICogRjRcbiAgICovXG4gIEY0OiAxMTUsXG4gIC8qKlxuICAgKiBGNVxuICAgKi9cbiAgRjU6IDExNixcbiAgLyoqXG4gICAqIEY2XG4gICAqL1xuICBGNjogMTE3LFxuICAvKipcbiAgICogRjdcbiAgICovXG4gIEY3OiAxMTgsXG4gIC8qKlxuICAgKiBGOFxuICAgKi9cbiAgRjg6IDExOSxcbiAgLyoqXG4gICAqIEY5XG4gICAqL1xuICBGOTogMTIwLFxuICAvKipcbiAgICogRjEwXG4gICAqL1xuICBGMTA6IDEyMSxcbiAgLyoqXG4gICAqIEYxMVxuICAgKi9cbiAgRjExOiAxMjIsXG4gIC8qKlxuICAgKiBGMTJcbiAgICovXG4gIEYxMjogMTIzLFxuICAvKipcbiAgICogTlVNTE9DS1xuICAgKi9cbiAgTlVNTE9DSzogMTQ0LFxuICAvKipcbiAgICogU0VNSUNPTE9OXG4gICAqL1xuICBTRU1JQ09MT046IDE4NixcbiAgLy8gbmVlZHMgbG9jYWxpemF0aW9uXG4gIC8qKlxuICAgKiBEQVNIXG4gICAqL1xuICBEQVNIOiAxODksXG4gIC8vIG5lZWRzIGxvY2FsaXphdGlvblxuICAvKipcbiAgICogRVFVQUxTXG4gICAqL1xuICBFUVVBTFM6IDE4NyxcbiAgLy8gbmVlZHMgbG9jYWxpemF0aW9uXG4gIC8qKlxuICAgKiBDT01NQVxuICAgKi9cbiAgQ09NTUE6IDE4OCxcbiAgLy8gbmVlZHMgbG9jYWxpemF0aW9uXG4gIC8qKlxuICAgKiBQRVJJT0RcbiAgICovXG4gIFBFUklPRDogMTkwLFxuICAvLyBuZWVkcyBsb2NhbGl6YXRpb25cbiAgLyoqXG4gICAqIFNMQVNIXG4gICAqL1xuICBTTEFTSDogMTkxLFxuICAvLyBuZWVkcyBsb2NhbGl6YXRpb25cbiAgLyoqXG4gICAqIEFQT1NUUk9QSEVcbiAgICovXG4gIEFQT1NUUk9QSEU6IDE5MixcbiAgLy8gbmVlZHMgbG9jYWxpemF0aW9uXG4gIC8qKlxuICAgKiBTSU5HTEVfUVVPVEVcbiAgICovXG4gIFNJTkdMRV9RVU9URTogMjIyLFxuICAvLyBuZWVkcyBsb2NhbGl6YXRpb25cbiAgLyoqXG4gICAqIE9QRU5fU1FVQVJFX0JSQUNLRVRcbiAgICovXG4gIE9QRU5fU1FVQVJFX0JSQUNLRVQ6IDIxOSxcbiAgLy8gbmVlZHMgbG9jYWxpemF0aW9uXG4gIC8qKlxuICAgKiBCQUNLU0xBU0hcbiAgICovXG4gIEJBQ0tTTEFTSDogMjIwLFxuICAvLyBuZWVkcyBsb2NhbGl6YXRpb25cbiAgLyoqXG4gICAqIENMT1NFX1NRVUFSRV9CUkFDS0VUXG4gICAqL1xuICBDTE9TRV9TUVVBUkVfQlJBQ0tFVDogMjIxLFxuICAvLyBuZWVkcyBsb2NhbGl6YXRpb25cbiAgLyoqXG4gICAqIFdJTl9LRVlcbiAgICovXG4gIFdJTl9LRVk6IDIyNCxcbiAgLyoqXG4gICAqIE1BQ19GRl9NRVRBXG4gICAqL1xuICBNQUNfRkZfTUVUQTogMjI0LFxuICAvLyBGaXJlZm94IChHZWNrbykgZmlyZXMgdGhpcyBmb3IgdGhlIG1ldGEga2V5IGluc3RlYWQgb2YgOTFcbiAgLyoqXG4gICAqIFdJTl9JTUVcbiAgICovXG4gIFdJTl9JTUU6IDIyOSxcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IEZ1bmN0aW9uID09PT09PT09PT09PT09PT09PT09PT09PVxuICAvKipcbiAgICogd2hldGhlciB0ZXh0IGFuZCBtb2RpZmllZCBrZXkgaXMgZW50ZXJlZCBhdCB0aGUgc2FtZSB0aW1lLlxuICAgKi9cbiAgaXNUZXh0TW9kaWZ5aW5nS2V5RXZlbnQ6IGZ1bmN0aW9uIGlzVGV4dE1vZGlmeWluZ0tleUV2ZW50KGUpIHtcbiAgICB2YXIga2V5Q29kZSA9IGUua2V5Q29kZTtcbiAgICBpZiAoZS5hbHRLZXkgJiYgIWUuY3RybEtleSB8fCBlLm1ldGFLZXkgfHxcbiAgICAvLyBGdW5jdGlvbiBrZXlzIGRvbid0IGdlbmVyYXRlIHRleHRcbiAgICBrZXlDb2RlID49IEtleUNvZGUuRjEgJiYga2V5Q29kZSA8PSBLZXlDb2RlLkYxMikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFRoZSBmb2xsb3dpbmcga2V5cyBhcmUgcXVpdGUgaGFybWxlc3MsIGV2ZW4gaW4gY29tYmluYXRpb24gd2l0aFxuICAgIC8vIENUUkwsIEFMVCBvciBTSElGVC5cbiAgICBzd2l0Y2ggKGtleUNvZGUpIHtcbiAgICAgIGNhc2UgS2V5Q29kZS5BTFQ6XG4gICAgICBjYXNlIEtleUNvZGUuQ0FQU19MT0NLOlxuICAgICAgY2FzZSBLZXlDb2RlLkNPTlRFWFRfTUVOVTpcbiAgICAgIGNhc2UgS2V5Q29kZS5DVFJMOlxuICAgICAgY2FzZSBLZXlDb2RlLkRPV046XG4gICAgICBjYXNlIEtleUNvZGUuRU5EOlxuICAgICAgY2FzZSBLZXlDb2RlLkVTQzpcbiAgICAgIGNhc2UgS2V5Q29kZS5IT01FOlxuICAgICAgY2FzZSBLZXlDb2RlLklOU0VSVDpcbiAgICAgIGNhc2UgS2V5Q29kZS5MRUZUOlxuICAgICAgY2FzZSBLZXlDb2RlLk1BQ19GRl9NRVRBOlxuICAgICAgY2FzZSBLZXlDb2RlLk1FVEE6XG4gICAgICBjYXNlIEtleUNvZGUuTlVNTE9DSzpcbiAgICAgIGNhc2UgS2V5Q29kZS5OVU1fQ0VOVEVSOlxuICAgICAgY2FzZSBLZXlDb2RlLlBBR0VfRE9XTjpcbiAgICAgIGNhc2UgS2V5Q29kZS5QQUdFX1VQOlxuICAgICAgY2FzZSBLZXlDb2RlLlBBVVNFOlxuICAgICAgY2FzZSBLZXlDb2RlLlBSSU5UX1NDUkVFTjpcbiAgICAgIGNhc2UgS2V5Q29kZS5SSUdIVDpcbiAgICAgIGNhc2UgS2V5Q29kZS5TSElGVDpcbiAgICAgIGNhc2UgS2V5Q29kZS5VUDpcbiAgICAgIGNhc2UgS2V5Q29kZS5XSU5fS0VZOlxuICAgICAgY2FzZSBLZXlDb2RlLldJTl9LRVlfUklHSFQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIHdoZXRoZXIgY2hhcmFjdGVyIGlzIGVudGVyZWQuXG4gICAqL1xuICBpc0NoYXJhY3RlcktleTogZnVuY3Rpb24gaXNDaGFyYWN0ZXJLZXkoa2V5Q29kZSkge1xuICAgIGlmIChrZXlDb2RlID49IEtleUNvZGUuWkVSTyAmJiBrZXlDb2RlIDw9IEtleUNvZGUuTklORSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChrZXlDb2RlID49IEtleUNvZGUuTlVNX1pFUk8gJiYga2V5Q29kZSA8PSBLZXlDb2RlLk5VTV9NVUxUSVBMWSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChrZXlDb2RlID49IEtleUNvZGUuQSAmJiBrZXlDb2RlIDw9IEtleUNvZGUuWikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gU2FmYXJpIHNlbmRzIHplcm8ga2V5IGNvZGUgZm9yIG5vbi1sYXRpbiBjaGFyYWN0ZXJzLlxuICAgIGlmICh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdXZWJLaXQnKSAhPT0gLTEgJiYga2V5Q29kZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHN3aXRjaCAoa2V5Q29kZSkge1xuICAgICAgY2FzZSBLZXlDb2RlLlNQQUNFOlxuICAgICAgY2FzZSBLZXlDb2RlLlFVRVNUSU9OX01BUks6XG4gICAgICBjYXNlIEtleUNvZGUuTlVNX1BMVVM6XG4gICAgICBjYXNlIEtleUNvZGUuTlVNX01JTlVTOlxuICAgICAgY2FzZSBLZXlDb2RlLk5VTV9QRVJJT0Q6XG4gICAgICBjYXNlIEtleUNvZGUuTlVNX0RJVklTSU9OOlxuICAgICAgY2FzZSBLZXlDb2RlLlNFTUlDT0xPTjpcbiAgICAgIGNhc2UgS2V5Q29kZS5EQVNIOlxuICAgICAgY2FzZSBLZXlDb2RlLkVRVUFMUzpcbiAgICAgIGNhc2UgS2V5Q29kZS5DT01NQTpcbiAgICAgIGNhc2UgS2V5Q29kZS5QRVJJT0Q6XG4gICAgICBjYXNlIEtleUNvZGUuU0xBU0g6XG4gICAgICBjYXNlIEtleUNvZGUuQVBPU1RST1BIRTpcbiAgICAgIGNhc2UgS2V5Q29kZS5TSU5HTEVfUVVPVEU6XG4gICAgICBjYXNlIEtleUNvZGUuT1BFTl9TUVVBUkVfQlJBQ0tFVDpcbiAgICAgIGNhc2UgS2V5Q29kZS5CQUNLU0xBU0g6XG4gICAgICBjYXNlIEtleUNvZGUuQ0xPU0VfU1FVQVJFX0JSQUNLRVQ6XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufTtcbmV4cG9ydCBkZWZhdWx0IEtleUNvZGU7IiwgImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IExvYWRpbmdPdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9Mb2FkaW5nT3V0bGluZWRcIjtcbmltcG9ydCBBbnRkSWNvbiBmcm9tIFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiO1xudmFyIExvYWRpbmdPdXRsaW5lZCA9IGZ1bmN0aW9uIExvYWRpbmdPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbnRkSWNvbiwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogTG9hZGluZ091dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5cbi8qKiFbbG9hZGluZ10oZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTlRBaUlHaGxhV2RvZEQwaU5UQWlJR1pwYkd3OUlpTmpZV05oWTJFaUlIWnBaWGRDYjNnOUlqQWdNQ0F4TURJMElERXdNalFpSUdadlkzVnpZV0pzWlQwaVptRnNjMlVpSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUkrUEhCaGRHZ2daRDBpVFRrNE9DQTFORGhqTFRFNUxqa2dNQzB6TmkweE5pNHhMVE0yTFRNMklEQXROVGt1TkMweE1TNDJMVEV4Tnkwek5DNDJMVEUzTVM0ellUUTBNQzQwTlNBME5EQXVORFVnTUNBd01DMDVOQzR6TFRFek9TNDVJRFF6Tnk0M01TQTBNemN1TnpFZ01DQXdNQzB4TXprdU9TMDVOQzR6UXpZeU9TQTRNeTQySURVM01TNDBJRGN5SURVeE1pQTNNbU10TVRrdU9TQXdMVE0yTFRFMkxqRXRNell0TXpaek1UWXVNUzB6TmlBek5pMHpObU0yT1M0eElEQWdNVE0yTGpJZ01UTXVOU0F4T1RrdU15QTBNQzR6UXpjM01pNHpJRFkySURneU55QXhNRE1nT0RjMElERTFNR00wTnlBME55QTRNeTQ1SURFd01TNDRJREV3T1M0M0lERTJNaTQzSURJMkxqY2dOak11TVNBME1DNHlJREV6TUM0eUlEUXdMaklnTVRrNUxqTXVNU0F4T1M0NUxURTJJRE0yTFRNMUxqa2dNelo2SWlBdlBqd3ZjM1puUGc9PSkgKi9cbnZhciBSZWZJY29uID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoTG9hZGluZ091dGxpbmVkKTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFJlZkljb24uZGlzcGxheU5hbWUgPSAnTG9hZGluZ091dGxpbmVkJztcbn1cbmV4cG9ydCBkZWZhdWx0IFJlZkljb247IiwgIi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxudmFyIExvYWRpbmdPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjAgMCAxMDI0IDEwMjRcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNOTg4IDU0OGMtMTkuOSAwLTM2LTE2LjEtMzYtMzYgMC01OS40LTExLjYtMTE3LTM0LjYtMTcxLjNhNDQwLjQ1IDQ0MC40NSAwIDAwLTk0LjMtMTM5LjkgNDM3LjcxIDQzNy43MSAwIDAwLTEzOS45LTk0LjNDNjI5IDgzLjYgNTcxLjQgNzIgNTEyIDcyYy0xOS45IDAtMzYtMTYuMS0zNi0zNnMxNi4xLTM2IDM2LTM2YzY5LjEgMCAxMzYuMiAxMy41IDE5OS4zIDQwLjNDNzcyLjMgNjYgODI3IDEwMyA4NzQgMTUwYzQ3IDQ3IDgzLjkgMTAxLjggMTA5LjcgMTYyLjcgMjYuNyA2My4xIDQwLjIgMTMwLjIgNDAuMiAxOTkuMy4xIDE5LjktMTYgMzYtMzUuOSAzNnpcIiB9IH1dIH0sIFwibmFtZVwiOiBcImxvYWRpbmdcIiwgXCJ0aGVtZVwiOiBcIm91dGxpbmVkXCIgfTtcbmV4cG9ydCBkZWZhdWx0IExvYWRpbmdPdXRsaW5lZDtcbiIsICJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZVRva2VuIGZyb20gJy4uLy4uL3RoZW1lL3VzZVRva2VuJztcbmltcG9ydCB7IGRldlVzZVdhcm5pbmcgfSBmcm9tICcuLi93YXJuaW5nJztcbmltcG9ydCB6SW5kZXhDb250ZXh0IGZyb20gJy4uL3ppbmRleENvbnRleHQnO1xuLy8gWi1JbmRleCBjb250cm9sIHJhbmdlXG4vLyBDb250YWluZXI6IDEwMDAgKyBvZmZzZXQgMTAwIChtYXggYmFzZSArIDEwICogb2Zmc2V0ID0gMjAwMClcbi8vIFBvcG92ZXI6IG9mZnNldCA1MFxuLy8gTm90aWZpY2F0aW9uOiBDb250YWluZXIgTWF4IHpJbmRleCArIGNvbXBvbmVudE9mZnNldFxuY29uc3QgQ09OVEFJTkVSX09GRlNFVCA9IDEwMDtcbmNvbnN0IENPTlRBSU5FUl9PRkZTRVRfTUFYX0NPVU5UID0gMTA7XG5leHBvcnQgY29uc3QgQ09OVEFJTkVSX01BWF9PRkZTRVQgPSBDT05UQUlORVJfT0ZGU0VUICogQ09OVEFJTkVSX09GRlNFVF9NQVhfQ09VTlQ7XG4vKipcbiAqIFN0YXRpYyBmdW5jdGlvbiB3aWxsIGRlZmF1bHQgYmUgdGhlIGBDT05UQUlORVJfTUFYX09GRlNFVGAuXG4gKiBCdXQgaXQgc3RpbGwgbWF5IGhhdmUgY2hpbGRyZW4gY29tcG9uZW50IGxpa2UgU2VsZWN0LCBEcm9wZG93bi5cbiAqIFNvIHRoZSB3YXJuaW5nIHpJbmRleCBzaG91bGQgZXhjZWVkIHRoZSBgQ09OVEFJTkVSX01BWF9PRkZTRVRgLlxuICovXG5jb25zdCBDT05UQUlORVJfTUFYX09GRlNFVF9XSVRIX0NISUxEUkVOID0gQ09OVEFJTkVSX01BWF9PRkZTRVQgKyBDT05UQUlORVJfT0ZGU0VUO1xuZXhwb3J0IGNvbnN0IGNvbnRhaW5lckJhc2VaSW5kZXhPZmZzZXQgPSB7XG4gIE1vZGFsOiBDT05UQUlORVJfT0ZGU0VULFxuICBEcmF3ZXI6IENPTlRBSU5FUl9PRkZTRVQsXG4gIFBvcG92ZXI6IENPTlRBSU5FUl9PRkZTRVQsXG4gIFBvcGNvbmZpcm06IENPTlRBSU5FUl9PRkZTRVQsXG4gIFRvb2x0aXA6IENPTlRBSU5FUl9PRkZTRVQsXG4gIFRvdXI6IENPTlRBSU5FUl9PRkZTRVQsXG4gIEZsb2F0QnV0dG9uOiBDT05UQUlORVJfT0ZGU0VUXG59O1xuZXhwb3J0IGNvbnN0IGNvbnN1bWVyQmFzZVpJbmRleE9mZnNldCA9IHtcbiAgU2VsZWN0TGlrZTogNTAsXG4gIERyb3Bkb3duOiA1MCxcbiAgRGF0ZVBpY2tlcjogNTAsXG4gIE1lbnU6IDUwLFxuICBJbWFnZVByZXZpZXc6IDFcbn07XG5mdW5jdGlvbiBpc0NvbnRhaW5lclR5cGUodHlwZSkge1xuICByZXR1cm4gdHlwZSBpbiBjb250YWluZXJCYXNlWkluZGV4T2Zmc2V0O1xufVxuZXhwb3J0IGNvbnN0IHVzZVpJbmRleCA9IChjb21wb25lbnRUeXBlLCBjdXN0b21aSW5kZXgpID0+IHtcbiAgY29uc3QgWywgdG9rZW5dID0gdXNlVG9rZW4oKTtcbiAgY29uc3QgcGFyZW50WkluZGV4ID0gUmVhY3QudXNlQ29udGV4dCh6SW5kZXhDb250ZXh0KTtcbiAgY29uc3QgaXNDb250YWluZXIgPSBpc0NvbnRhaW5lclR5cGUoY29tcG9uZW50VHlwZSk7XG4gIGxldCByZXN1bHQ7XG4gIGlmIChjdXN0b21aSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgIHJlc3VsdCA9IFtjdXN0b21aSW5kZXgsIGN1c3RvbVpJbmRleF07XG4gIH0gZWxzZSB7XG4gICAgbGV0IHpJbmRleCA9IHBhcmVudFpJbmRleCAhPT0gbnVsbCAmJiBwYXJlbnRaSW5kZXggIT09IHZvaWQgMCA/IHBhcmVudFpJbmRleCA6IDA7XG4gICAgaWYgKGlzQ29udGFpbmVyKSB7XG4gICAgICB6SW5kZXggKz1cbiAgICAgIC8vIFVzZSBwcmVzZXQgdG9rZW4gekluZGV4IGJ5IGRlZmF1bHQgYnV0IG5vdCBzdGFjayB3aGVuIGhhcyBwYXJlbnQgY29udGFpbmVyXG4gICAgICAocGFyZW50WkluZGV4ID8gMCA6IHRva2VuLnpJbmRleFBvcHVwQmFzZSkgK1xuICAgICAgLy8gQ29udGFpbmVyIG9mZnNldFxuICAgICAgY29udGFpbmVyQmFzZVpJbmRleE9mZnNldFtjb21wb25lbnRUeXBlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgekluZGV4ICs9IGNvbnN1bWVyQmFzZVpJbmRleE9mZnNldFtjb21wb25lbnRUeXBlXTtcbiAgICB9XG4gICAgcmVzdWx0ID0gW3BhcmVudFpJbmRleCA9PT0gdW5kZWZpbmVkID8gY3VzdG9tWkluZGV4IDogekluZGV4LCB6SW5kZXhdO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgY29uc3Qgd2FybmluZyA9IGRldlVzZVdhcm5pbmcoY29tcG9uZW50VHlwZSk7XG4gICAgY29uc3QgbWF4WkluZGV4ID0gdG9rZW4uekluZGV4UG9wdXBCYXNlICsgQ09OVEFJTkVSX01BWF9PRkZTRVRfV0lUSF9DSElMRFJFTjtcbiAgICBjb25zdCBjdXJyZW50WkluZGV4ID0gcmVzdWx0WzBdIHx8IDA7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhjdXN0b21aSW5kZXggIT09IHVuZGVmaW5lZCB8fCBjdXJyZW50WkluZGV4IDw9IG1heFpJbmRleCwgJ3VzYWdlJywgJ2B6SW5kZXhgIGlzIG92ZXIgZGVzaWduIHRva2VuIGB6SW5kZXhQb3B1cEJhc2VgIHRvbyBtdWNoLiBJdCBtYXkgY2F1c2UgdW5leHBlY3RlZCBvdmVycmlkZS4nKSA6IHZvaWQgMDtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTsiLCAiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmNvbnN0IHpJbmRleENvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh1bmRlZmluZWQpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgekluZGV4Q29udGV4dC5kaXNwbGF5TmFtZSA9ICd6SW5kZXhDb250ZXh0Jztcbn1cbmV4cG9ydCBkZWZhdWx0IHpJbmRleENvbnRleHQ7IiwgIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgKiBhcyBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IHsgcmVuZGVyLCB1bm1vdW50IH0gZnJvbSBcInJjLXV0aWwvZXMvUmVhY3QvcmVuZGVyXCI7XG5pbXBvcnQgd2FybmluZyBmcm9tICcuLi9fdXRpbC93YXJuaW5nJztcbmNvbnN0IGRlZmF1bHRSZWFjdFJlbmRlciA9IChub2RlLCBjb250YWluZXIpID0+IHtcbiAgLy8gVE9ETzogUmVtb3ZlIGluIHY2XG4gIC8vIFdhcm5pbmcgZm9yIFJlYWN0IDE5XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgY29uc3QgbWFqb3JWZXJzaW9uID0gcGFyc2VJbnQoUmVhY3QudmVyc2lvbi5zcGxpdCgnLicpWzBdLCAxMCk7XG4gICAgY29uc3QgZnVsbEtleXMgPSBPYmplY3Qua2V5cyhSZWFjdERPTSk7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhtYWpvclZlcnNpb24gPCAxOSB8fCBmdWxsS2V5cy5pbmNsdWRlcygnY3JlYXRlUm9vdCcpLCAnY29tcGF0aWJsZScsICdhbnRkIHY1IHN1cHBvcnQgUmVhY3QgaXMgMTYgfiAxOC4gc2VlIGh0dHBzOi8vdS5hbnQuZGVzaWduL3Y1LWZvci0xOSBmb3IgY29tcGF0aWJsZS4nKSA6IHZvaWQgMDtcbiAgfVxuICByZW5kZXIobm9kZSwgY29udGFpbmVyKTtcbiAgcmV0dXJuICgpID0+IHtcbiAgICByZXR1cm4gdW5tb3VudChjb250YWluZXIpO1xuICB9O1xufTtcbmxldCB1bnN0YWJsZVJlbmRlciA9IGRlZmF1bHRSZWFjdFJlbmRlcjtcbi8qKlxuICogQGRlcHJlY2F0ZWQgU2V0IFJlYWN0IHJlbmRlciBmdW5jdGlvbiBmb3IgY29tcGF0aWJsZSB1c2FnZS5cbiAqIFRoaXMgaXMgaW50ZXJuYWwgdXNhZ2Ugb25seSBjb21wYXRpYmxlIHdpdGggUmVhY3QgMTkuXG4gKiBBbmQgd2lsbCBiZSByZW1vdmVkIGluIG5leHQgbWFqb3IgdmVyc2lvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuc3RhYmxlU2V0UmVuZGVyKHJlbmRlcikge1xuICBpZiAocmVuZGVyKSB7XG4gICAgdW5zdGFibGVSZW5kZXIgPSByZW5kZXI7XG4gIH1cbiAgcmV0dXJuIHVuc3RhYmxlUmVuZGVyO1xufSIsICJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiLi90eXBlb2YuanNcIjtcbmZ1bmN0aW9uIF9yZWdlbmVyYXRvclJ1bnRpbWUoKSB7XG4gIFwidXNlIHN0cmljdFwiOyAvKiEgcmVnZW5lcmF0b3ItcnVudGltZSAtLSBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4gLS0gbGljZW5zZSAoTUlUKTogaHR0cHM6Ly9naXRodWIuY29tL2JhYmVsL2JhYmVsL2Jsb2IvbWFpbi9wYWNrYWdlcy9iYWJlbC1oZWxwZXJzL0xJQ0VOU0UgKi9cbiAgX3JlZ2VuZXJhdG9yUnVudGltZSA9IGZ1bmN0aW9uIF9yZWdlbmVyYXRvclJ1bnRpbWUoKSB7XG4gICAgcmV0dXJuIHI7XG4gIH07XG4gIHZhciB0LFxuICAgIHIgPSB7fSxcbiAgICBlID0gT2JqZWN0LnByb3RvdHlwZSxcbiAgICBuID0gZS5oYXNPd25Qcm9wZXJ0eSxcbiAgICBvID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgPyBTeW1ib2wgOiB7fSxcbiAgICBpID0gby5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIixcbiAgICBhID0gby5hc3luY0l0ZXJhdG9yIHx8IFwiQEBhc3luY0l0ZXJhdG9yXCIsXG4gICAgdSA9IG8udG9TdHJpbmdUYWcgfHwgXCJAQHRvU3RyaW5nVGFnXCI7XG4gIGZ1bmN0aW9uIGModCwgciwgZSwgbikge1xuICAgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgciwge1xuICAgICAgdmFsdWU6IGUsXG4gICAgICBlbnVtZXJhYmxlOiAhbixcbiAgICAgIGNvbmZpZ3VyYWJsZTogIW4sXG4gICAgICB3cml0YWJsZTogIW5cbiAgICB9KTtcbiAgfVxuICB0cnkge1xuICAgIGMoe30sIFwiXCIpO1xuICB9IGNhdGNoICh0KSB7XG4gICAgYyA9IGZ1bmN0aW9uIGModCwgciwgZSkge1xuICAgICAgcmV0dXJuIHRbcl0gPSBlO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gaChyLCBlLCBuLCBvKSB7XG4gICAgdmFyIGkgPSBlICYmIGUucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yID8gZSA6IEdlbmVyYXRvcixcbiAgICAgIGEgPSBPYmplY3QuY3JlYXRlKGkucHJvdG90eXBlKTtcbiAgICByZXR1cm4gYyhhLCBcIl9pbnZva2VcIiwgZnVuY3Rpb24gKHIsIGUsIG4pIHtcbiAgICAgIHZhciBvID0gMTtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoaSwgYSkge1xuICAgICAgICBpZiAoMyA9PT0gbykgdGhyb3cgRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nXCIpO1xuICAgICAgICBpZiAoNCA9PT0gbykge1xuICAgICAgICAgIGlmIChcInRocm93XCIgPT09IGkpIHRocm93IGE7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiB0LFxuICAgICAgICAgICAgZG9uZTogITBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGZvciAobi5tZXRob2QgPSBpLCBuLmFyZyA9IGE7Oykge1xuICAgICAgICAgIHZhciB1ID0gbi5kZWxlZ2F0ZTtcbiAgICAgICAgICBpZiAodSkge1xuICAgICAgICAgICAgdmFyIGMgPSBkKHUsIG4pO1xuICAgICAgICAgICAgaWYgKGMpIHtcbiAgICAgICAgICAgICAgaWYgKGMgPT09IGYpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICByZXR1cm4gYztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFwibmV4dFwiID09PSBuLm1ldGhvZCkgbi5zZW50ID0gbi5fc2VudCA9IG4uYXJnO2Vsc2UgaWYgKFwidGhyb3dcIiA9PT0gbi5tZXRob2QpIHtcbiAgICAgICAgICAgIGlmICgxID09PSBvKSB0aHJvdyBvID0gNCwgbi5hcmc7XG4gICAgICAgICAgICBuLmRpc3BhdGNoRXhjZXB0aW9uKG4uYXJnKTtcbiAgICAgICAgICB9IGVsc2UgXCJyZXR1cm5cIiA9PT0gbi5tZXRob2QgJiYgbi5hYnJ1cHQoXCJyZXR1cm5cIiwgbi5hcmcpO1xuICAgICAgICAgIG8gPSAzO1xuICAgICAgICAgIHZhciBoID0gcyhyLCBlLCBuKTtcbiAgICAgICAgICBpZiAoXCJub3JtYWxcIiA9PT0gaC50eXBlKSB7XG4gICAgICAgICAgICBpZiAobyA9IG4uZG9uZSA/IDQgOiAyLCBoLmFyZyA9PT0gZikgY29udGludWU7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB2YWx1ZTogaC5hcmcsXG4gICAgICAgICAgICAgIGRvbmU6IG4uZG9uZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXCJ0aHJvd1wiID09PSBoLnR5cGUgJiYgKG8gPSA0LCBuLm1ldGhvZCA9IFwidGhyb3dcIiwgbi5hcmcgPSBoLmFyZyk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfShyLCBuLCBuZXcgQ29udGV4dChvIHx8IFtdKSksICEwKSwgYTtcbiAgfVxuICBmdW5jdGlvbiBzKHQsIHIsIGUpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJub3JtYWxcIixcbiAgICAgICAgYXJnOiB0LmNhbGwociwgZSlcbiAgICAgIH07XG4gICAgfSBjYXRjaCAodCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJ0aHJvd1wiLFxuICAgICAgICBhcmc6IHRcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIHIud3JhcCA9IGg7XG4gIHZhciBmID0ge307XG4gIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fVxuICB2YXIgbCA9IHt9O1xuICBjKGwsIGksIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSk7XG4gIHZhciBwID0gT2JqZWN0LmdldFByb3RvdHlwZU9mLFxuICAgIHkgPSBwICYmIHAocCh4KFtdKSkpO1xuICB5ICYmIHkgIT09IGUgJiYgbi5jYWxsKHksIGkpICYmIChsID0geSk7XG4gIHZhciB2ID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID0gR2VuZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUobCk7XG4gIGZ1bmN0aW9uIGcodCkge1xuICAgIFtcIm5leHRcIiwgXCJ0aHJvd1wiLCBcInJldHVyblwiXS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7XG4gICAgICBjKHQsIHIsIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UociwgdCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBBc3luY0l0ZXJhdG9yKHQsIHIpIHtcbiAgICBmdW5jdGlvbiBlKG8sIGksIGEsIHUpIHtcbiAgICAgIHZhciBjID0gcyh0W29dLCB0LCBpKTtcbiAgICAgIGlmIChcInRocm93XCIgIT09IGMudHlwZSkge1xuICAgICAgICB2YXIgaCA9IGMuYXJnLFxuICAgICAgICAgIGYgPSBoLnZhbHVlO1xuICAgICAgICByZXR1cm4gZiAmJiBcIm9iamVjdFwiID09IF90eXBlb2YoZikgJiYgbi5jYWxsKGYsIFwiX19hd2FpdFwiKSA/IHIucmVzb2x2ZShmLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICBlKFwibmV4dFwiLCB0LCBhLCB1KTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICBlKFwidGhyb3dcIiwgdCwgYSwgdSk7XG4gICAgICAgIH0pIDogci5yZXNvbHZlKGYpLnRoZW4oZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICBoLnZhbHVlID0gdCwgYShoKTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICByZXR1cm4gZShcInRocm93XCIsIHQsIGEsIHUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHUoYy5hcmcpO1xuICAgIH1cbiAgICB2YXIgbztcbiAgICBjKHRoaXMsIFwiX2ludm9rZVwiLCBmdW5jdGlvbiAodCwgbikge1xuICAgICAgZnVuY3Rpb24gaSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyByKGZ1bmN0aW9uIChyLCBvKSB7XG4gICAgICAgICAgZSh0LCBuLCByLCBvKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbyA9IG8gPyBvLnRoZW4oaSwgaSkgOiBpKCk7XG4gICAgfSwgITApO1xuICB9XG4gIGZ1bmN0aW9uIGQociwgZSkge1xuICAgIHZhciBuID0gZS5tZXRob2QsXG4gICAgICBvID0gci5pW25dO1xuICAgIGlmIChvID09PSB0KSByZXR1cm4gZS5kZWxlZ2F0ZSA9IG51bGwsIFwidGhyb3dcIiA9PT0gbiAmJiByLmlbXCJyZXR1cm5cIl0gJiYgKGUubWV0aG9kID0gXCJyZXR1cm5cIiwgZS5hcmcgPSB0LCBkKHIsIGUpLCBcInRocm93XCIgPT09IGUubWV0aG9kKSB8fCBcInJldHVyblwiICE9PSBuICYmIChlLm1ldGhvZCA9IFwidGhyb3dcIiwgZS5hcmcgPSBuZXcgVHlwZUVycm9yKFwiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAnXCIgKyBuICsgXCInIG1ldGhvZFwiKSksIGY7XG4gICAgdmFyIGkgPSBzKG8sIHIuaSwgZS5hcmcpO1xuICAgIGlmIChcInRocm93XCIgPT09IGkudHlwZSkgcmV0dXJuIGUubWV0aG9kID0gXCJ0aHJvd1wiLCBlLmFyZyA9IGkuYXJnLCBlLmRlbGVnYXRlID0gbnVsbCwgZjtcbiAgICB2YXIgYSA9IGkuYXJnO1xuICAgIHJldHVybiBhID8gYS5kb25lID8gKGVbci5yXSA9IGEudmFsdWUsIGUubmV4dCA9IHIubiwgXCJyZXR1cm5cIiAhPT0gZS5tZXRob2QgJiYgKGUubWV0aG9kID0gXCJuZXh0XCIsIGUuYXJnID0gdCksIGUuZGVsZWdhdGUgPSBudWxsLCBmKSA6IGEgOiAoZS5tZXRob2QgPSBcInRocm93XCIsIGUuYXJnID0gbmV3IFR5cGVFcnJvcihcIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0XCIpLCBlLmRlbGVnYXRlID0gbnVsbCwgZik7XG4gIH1cbiAgZnVuY3Rpb24gdyh0KSB7XG4gICAgdGhpcy50cnlFbnRyaWVzLnB1c2godCk7XG4gIH1cbiAgZnVuY3Rpb24gbShyKSB7XG4gICAgdmFyIGUgPSByWzRdIHx8IHt9O1xuICAgIGUudHlwZSA9IFwibm9ybWFsXCIsIGUuYXJnID0gdCwgcls0XSA9IGU7XG4gIH1cbiAgZnVuY3Rpb24gQ29udGV4dCh0KSB7XG4gICAgdGhpcy50cnlFbnRyaWVzID0gW1stMV1dLCB0LmZvckVhY2godywgdGhpcyksIHRoaXMucmVzZXQoITApO1xuICB9XG4gIGZ1bmN0aW9uIHgocikge1xuICAgIGlmIChudWxsICE9IHIpIHtcbiAgICAgIHZhciBlID0gcltpXTtcbiAgICAgIGlmIChlKSByZXR1cm4gZS5jYWxsKHIpO1xuICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PSB0eXBlb2Ygci5uZXh0KSByZXR1cm4gcjtcbiAgICAgIGlmICghaXNOYU4oci5sZW5ndGgpKSB7XG4gICAgICAgIHZhciBvID0gLTEsXG4gICAgICAgICAgYSA9IGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgICAgICBmb3IgKDsgKytvIDwgci5sZW5ndGg7KSBpZiAobi5jYWxsKHIsIG8pKSByZXR1cm4gZS52YWx1ZSA9IHJbb10sIGUuZG9uZSA9ICExLCBlO1xuICAgICAgICAgICAgcmV0dXJuIGUudmFsdWUgPSB0LCBlLmRvbmUgPSAhMCwgZTtcbiAgICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYS5uZXh0ID0gYTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihfdHlwZW9mKHIpICsgXCIgaXMgbm90IGl0ZXJhYmxlXCIpO1xuICB9XG4gIHJldHVybiBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgYyh2LCBcImNvbnN0cnVjdG9yXCIsIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKSwgYyhHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgXCJjb25zdHJ1Y3RvclwiLCBHZW5lcmF0b3JGdW5jdGlvbiksIEdlbmVyYXRvckZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gYyhHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgdSwgXCJHZW5lcmF0b3JGdW5jdGlvblwiKSwgci5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24gKHQpIHtcbiAgICB2YXIgciA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgdCAmJiB0LmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiAhIXIgJiYgKHIgPT09IEdlbmVyYXRvckZ1bmN0aW9uIHx8IFwiR2VuZXJhdG9yRnVuY3Rpb25cIiA9PT0gKHIuZGlzcGxheU5hbWUgfHwgci5uYW1lKSk7XG4gIH0sIHIubWFyayA9IGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZih0LCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSkgOiAodC5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgYyh0LCB1LCBcIkdlbmVyYXRvckZ1bmN0aW9uXCIpKSwgdC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHYpLCB0O1xuICB9LCByLmF3cmFwID0gZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgX19hd2FpdDogdFxuICAgIH07XG4gIH0sIGcoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpLCBjKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlLCBhLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0pLCByLkFzeW5jSXRlcmF0b3IgPSBBc3luY0l0ZXJhdG9yLCByLmFzeW5jID0gZnVuY3Rpb24gKHQsIGUsIG4sIG8sIGkpIHtcbiAgICB2b2lkIDAgPT09IGkgJiYgKGkgPSBQcm9taXNlKTtcbiAgICB2YXIgYSA9IG5ldyBBc3luY0l0ZXJhdG9yKGgodCwgZSwgbiwgbyksIGkpO1xuICAgIHJldHVybiByLmlzR2VuZXJhdG9yRnVuY3Rpb24oZSkgPyBhIDogYS5uZXh0KCkudGhlbihmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHQuZG9uZSA/IHQudmFsdWUgOiBhLm5leHQoKTtcbiAgICB9KTtcbiAgfSwgZyh2KSwgYyh2LCB1LCBcIkdlbmVyYXRvclwiKSwgYyh2LCBpLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0pLCBjKHYsIFwidG9TdHJpbmdcIiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBcIltvYmplY3QgR2VuZXJhdG9yXVwiO1xuICB9KSwgci5rZXlzID0gZnVuY3Rpb24gKHQpIHtcbiAgICB2YXIgciA9IE9iamVjdCh0KSxcbiAgICAgIGUgPSBbXTtcbiAgICBmb3IgKHZhciBuIGluIHIpIGUudW5zaGlmdChuKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gdCgpIHtcbiAgICAgIGZvciAoOyBlLmxlbmd0aDspIGlmICgobiA9IGUucG9wKCkpIGluIHIpIHJldHVybiB0LnZhbHVlID0gbiwgdC5kb25lID0gITEsIHQ7XG4gICAgICByZXR1cm4gdC5kb25lID0gITAsIHQ7XG4gICAgfTtcbiAgfSwgci52YWx1ZXMgPSB4LCBDb250ZXh0LnByb3RvdHlwZSA9IHtcbiAgICBjb25zdHJ1Y3RvcjogQ29udGV4dCxcbiAgICByZXNldDogZnVuY3Rpb24gcmVzZXQocikge1xuICAgICAgaWYgKHRoaXMucHJldiA9IHRoaXMubmV4dCA9IDAsIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB0LCB0aGlzLmRvbmUgPSAhMSwgdGhpcy5kZWxlZ2F0ZSA9IG51bGwsIHRoaXMubWV0aG9kID0gXCJuZXh0XCIsIHRoaXMuYXJnID0gdCwgdGhpcy50cnlFbnRyaWVzLmZvckVhY2gobSksICFyKSBmb3IgKHZhciBlIGluIHRoaXMpIFwidFwiID09PSBlLmNoYXJBdCgwKSAmJiBuLmNhbGwodGhpcywgZSkgJiYgIWlzTmFOKCtlLnNsaWNlKDEpKSAmJiAodGhpc1tlXSA9IHQpO1xuICAgIH0sXG4gICAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHtcbiAgICAgIHRoaXMuZG9uZSA9ICEwO1xuICAgICAgdmFyIHQgPSB0aGlzLnRyeUVudHJpZXNbMF1bNF07XG4gICAgICBpZiAoXCJ0aHJvd1wiID09PSB0LnR5cGUpIHRocm93IHQuYXJnO1xuICAgICAgcmV0dXJuIHRoaXMucnZhbDtcbiAgICB9LFxuICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbiBkaXNwYXRjaEV4Y2VwdGlvbihyKSB7XG4gICAgICBpZiAodGhpcy5kb25lKSB0aHJvdyByO1xuICAgICAgdmFyIGUgPSB0aGlzO1xuICAgICAgZnVuY3Rpb24gbih0KSB7XG4gICAgICAgIGEudHlwZSA9IFwidGhyb3dcIiwgYS5hcmcgPSByLCBlLm5leHQgPSB0O1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgbyA9IGUudHJ5RW50cmllcy5sZW5ndGggLSAxOyBvID49IDA7IC0tbykge1xuICAgICAgICB2YXIgaSA9IHRoaXMudHJ5RW50cmllc1tvXSxcbiAgICAgICAgICBhID0gaVs0XSxcbiAgICAgICAgICB1ID0gdGhpcy5wcmV2LFxuICAgICAgICAgIGMgPSBpWzFdLFxuICAgICAgICAgIGggPSBpWzJdO1xuICAgICAgICBpZiAoLTEgPT09IGlbMF0pIHJldHVybiBuKFwiZW5kXCIpLCAhMTtcbiAgICAgICAgaWYgKCFjICYmICFoKSB0aHJvdyBFcnJvcihcInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5XCIpO1xuICAgICAgICBpZiAobnVsbCAhPSBpWzBdICYmIGlbMF0gPD0gdSkge1xuICAgICAgICAgIGlmICh1IDwgYykgcmV0dXJuIHRoaXMubWV0aG9kID0gXCJuZXh0XCIsIHRoaXMuYXJnID0gdCwgbihjKSwgITA7XG4gICAgICAgICAgaWYgKHUgPCBoKSByZXR1cm4gbihoKSwgITE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGFicnVwdDogZnVuY3Rpb24gYWJydXB0KHQsIHIpIHtcbiAgICAgIGZvciAodmFyIGUgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgZSA+PSAwOyAtLWUpIHtcbiAgICAgICAgdmFyIG4gPSB0aGlzLnRyeUVudHJpZXNbZV07XG4gICAgICAgIGlmIChuWzBdID4gLTEgJiYgblswXSA8PSB0aGlzLnByZXYgJiYgdGhpcy5wcmV2IDwgblsyXSkge1xuICAgICAgICAgIHZhciBvID0gbjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbyAmJiAoXCJicmVha1wiID09PSB0IHx8IFwiY29udGludWVcIiA9PT0gdCkgJiYgb1swXSA8PSByICYmIHIgPD0gb1syXSAmJiAobyA9IG51bGwpO1xuICAgICAgdmFyIGkgPSBvID8gb1s0XSA6IHt9O1xuICAgICAgcmV0dXJuIGkudHlwZSA9IHQsIGkuYXJnID0gciwgbyA/ICh0aGlzLm1ldGhvZCA9IFwibmV4dFwiLCB0aGlzLm5leHQgPSBvWzJdLCBmKSA6IHRoaXMuY29tcGxldGUoaSk7XG4gICAgfSxcbiAgICBjb21wbGV0ZTogZnVuY3Rpb24gY29tcGxldGUodCwgcikge1xuICAgICAgaWYgKFwidGhyb3dcIiA9PT0gdC50eXBlKSB0aHJvdyB0LmFyZztcbiAgICAgIHJldHVybiBcImJyZWFrXCIgPT09IHQudHlwZSB8fCBcImNvbnRpbnVlXCIgPT09IHQudHlwZSA/IHRoaXMubmV4dCA9IHQuYXJnIDogXCJyZXR1cm5cIiA9PT0gdC50eXBlID8gKHRoaXMucnZhbCA9IHRoaXMuYXJnID0gdC5hcmcsIHRoaXMubWV0aG9kID0gXCJyZXR1cm5cIiwgdGhpcy5uZXh0ID0gXCJlbmRcIikgOiBcIm5vcm1hbFwiID09PSB0LnR5cGUgJiYgciAmJiAodGhpcy5uZXh0ID0gciksIGY7XG4gICAgfSxcbiAgICBmaW5pc2g6IGZ1bmN0aW9uIGZpbmlzaCh0KSB7XG4gICAgICBmb3IgKHZhciByID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IHIgPj0gMDsgLS1yKSB7XG4gICAgICAgIHZhciBlID0gdGhpcy50cnlFbnRyaWVzW3JdO1xuICAgICAgICBpZiAoZVsyXSA9PT0gdCkgcmV0dXJuIHRoaXMuY29tcGxldGUoZVs0XSwgZVszXSksIG0oZSksIGY7XG4gICAgICB9XG4gICAgfSxcbiAgICBcImNhdGNoXCI6IGZ1bmN0aW9uIF9jYXRjaCh0KSB7XG4gICAgICBmb3IgKHZhciByID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IHIgPj0gMDsgLS1yKSB7XG4gICAgICAgIHZhciBlID0gdGhpcy50cnlFbnRyaWVzW3JdO1xuICAgICAgICBpZiAoZVswXSA9PT0gdCkge1xuICAgICAgICAgIHZhciBuID0gZVs0XTtcbiAgICAgICAgICBpZiAoXCJ0aHJvd1wiID09PSBuLnR5cGUpIHtcbiAgICAgICAgICAgIHZhciBvID0gbi5hcmc7XG4gICAgICAgICAgICBtKGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhyb3cgRXJyb3IoXCJpbGxlZ2FsIGNhdGNoIGF0dGVtcHRcIik7XG4gICAgfSxcbiAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbiBkZWxlZ2F0ZVlpZWxkKHIsIGUsIG4pIHtcbiAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlID0ge1xuICAgICAgICBpOiB4KHIpLFxuICAgICAgICByOiBlLFxuICAgICAgICBuOiBuXG4gICAgICB9LCBcIm5leHRcIiA9PT0gdGhpcy5tZXRob2QgJiYgKHRoaXMuYXJnID0gdCksIGY7XG4gICAgfVxuICB9LCByO1xufVxuZXhwb3J0IHsgX3JlZ2VuZXJhdG9yUnVudGltZSBhcyBkZWZhdWx0IH07IiwgImZ1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcChuLCB0LCBlLCByLCBvLCBhLCBjKSB7XG4gIHRyeSB7XG4gICAgdmFyIGkgPSBuW2FdKGMpLFxuICAgICAgdSA9IGkudmFsdWU7XG4gIH0gY2F0Y2ggKG4pIHtcbiAgICByZXR1cm4gdm9pZCBlKG4pO1xuICB9XG4gIGkuZG9uZSA/IHQodSkgOiBQcm9taXNlLnJlc29sdmUodSkudGhlbihyLCBvKTtcbn1cbmZ1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKG4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdCA9IHRoaXMsXG4gICAgICBlID0gYXJndW1lbnRzO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAociwgbykge1xuICAgICAgdmFyIGEgPSBuLmFwcGx5KHQsIGUpO1xuICAgICAgZnVuY3Rpb24gX25leHQobikge1xuICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoYSwgciwgbywgX25leHQsIF90aHJvdywgXCJuZXh0XCIsIG4pO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX3Rocm93KG4pIHtcbiAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGEsIHIsIG8sIF9uZXh0LCBfdGhyb3csIFwidGhyb3dcIiwgbik7XG4gICAgICB9XG4gICAgICBfbmV4dCh2b2lkIDApO1xuICAgIH0pO1xuICB9O1xufVxuZXhwb3J0IHsgX2FzeW5jVG9HZW5lcmF0b3IgYXMgZGVmYXVsdCB9OyIsICJpbXBvcnQgX3JlZ2VuZXJhdG9yUnVudGltZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vcmVnZW5lcmF0b3JSdW50aW1lXCI7XG5pbXBvcnQgX2FzeW5jVG9HZW5lcmF0b3IgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2FzeW5jVG9HZW5lcmF0b3JcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgKiBhcyBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuLy8gTGV0IGNvbXBpbGVyIG5vdCB0byBzZWFyY2ggbW9kdWxlIHVzYWdlXG52YXIgZnVsbENsb25lID0gX29iamVjdFNwcmVhZCh7fSwgUmVhY3RET00pO1xudmFyIHZlcnNpb24gPSBmdWxsQ2xvbmUudmVyc2lvbixcbiAgcmVhY3RSZW5kZXIgPSBmdWxsQ2xvbmUucmVuZGVyLFxuICB1bm1vdW50Q29tcG9uZW50QXROb2RlID0gZnVsbENsb25lLnVubW91bnRDb21wb25lbnRBdE5vZGU7XG52YXIgY3JlYXRlUm9vdDtcbnRyeSB7XG4gIHZhciBtYWluVmVyc2lvbiA9IE51bWJlcigodmVyc2lvbiB8fCAnJykuc3BsaXQoJy4nKVswXSk7XG4gIGlmIChtYWluVmVyc2lvbiA+PSAxOCkge1xuICAgIGNyZWF0ZVJvb3QgPSBmdWxsQ2xvbmUuY3JlYXRlUm9vdDtcbiAgfVxufSBjYXRjaCAoZSkge1xuICAvLyBEbyBub3RoaW5nO1xufVxuZnVuY3Rpb24gdG9nZ2xlV2FybmluZyhza2lwKSB7XG4gIHZhciBfX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRCA9IGZ1bGxDbG9uZS5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRDtcbiAgaWYgKF9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEICYmIF90eXBlb2YoX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQpID09PSAnb2JqZWN0Jykge1xuICAgIF9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVELnVzaW5nQ2xpZW50RW50cnlQb2ludCA9IHNraXA7XG4gIH1cbn1cbnZhciBNQVJLID0gJ19fcmNfcmVhY3Rfcm9vdF9fJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIG1vZGVyblJlbmRlcihub2RlLCBjb250YWluZXIpIHtcbiAgdG9nZ2xlV2FybmluZyh0cnVlKTtcbiAgdmFyIHJvb3QgPSBjb250YWluZXJbTUFSS10gfHwgY3JlYXRlUm9vdChjb250YWluZXIpO1xuICB0b2dnbGVXYXJuaW5nKGZhbHNlKTtcbiAgcm9vdC5yZW5kZXIobm9kZSk7XG4gIGNvbnRhaW5lcltNQVJLXSA9IHJvb3Q7XG59XG5mdW5jdGlvbiBsZWdhY3lSZW5kZXIobm9kZSwgY29udGFpbmVyKSB7XG4gIHJlYWN0UmVuZGVyID09PSBudWxsIHx8IHJlYWN0UmVuZGVyID09PSB2b2lkIDAgfHwgcmVhY3RSZW5kZXIobm9kZSwgY29udGFpbmVyKTtcbn1cblxuLyoqIEBwcml2YXRlIFRlc3QgdXNhZ2UuIE5vdCB3b3JrIGluIHByb2QgKi9cbmV4cG9ydCBmdW5jdGlvbiBfcihub2RlLCBjb250YWluZXIpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICByZXR1cm4gbGVnYWN5UmVuZGVyKG5vZGUsIGNvbnRhaW5lcik7XG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXIobm9kZSwgY29udGFpbmVyKSB7XG4gIGlmIChjcmVhdGVSb290KSB7XG4gICAgbW9kZXJuUmVuZGVyKG5vZGUsIGNvbnRhaW5lcik7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxlZ2FjeVJlbmRlcihub2RlLCBjb250YWluZXIpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09IFVubW91bnQgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbmZ1bmN0aW9uIG1vZGVyblVubW91bnQoX3gpIHtcbiAgcmV0dXJuIF9tb2Rlcm5Vbm1vdW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5mdW5jdGlvbiBfbW9kZXJuVW5tb3VudCgpIHtcbiAgX21vZGVyblVubW91bnQgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoY29udGFpbmVyKSB7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdChcInJldHVyblwiLCBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfY29udGFpbmVyJE1BUks7XG4gICAgICAgICAgICAoX2NvbnRhaW5lciRNQVJLID0gY29udGFpbmVyW01BUktdKSA9PT0gbnVsbCB8fCBfY29udGFpbmVyJE1BUksgPT09IHZvaWQgMCB8fCBfY29udGFpbmVyJE1BUksudW5tb3VudCgpO1xuICAgICAgICAgICAgZGVsZXRlIGNvbnRhaW5lcltNQVJLXTtcbiAgICAgICAgICB9KSk7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZSk7XG4gIH0pKTtcbiAgcmV0dXJuIF9tb2Rlcm5Vbm1vdW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5mdW5jdGlvbiBsZWdhY3lVbm1vdW50KGNvbnRhaW5lcikge1xuICB1bm1vdW50Q29tcG9uZW50QXROb2RlKGNvbnRhaW5lcik7XG59XG5cbi8qKiBAcHJpdmF0ZSBUZXN0IHVzYWdlLiBOb3Qgd29yayBpbiBwcm9kICovXG5leHBvcnQgZnVuY3Rpb24gX3UoY29udGFpbmVyKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgcmV0dXJuIGxlZ2FjeVVubW91bnQoY29udGFpbmVyKTtcbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHVubW91bnQoX3gyKSB7XG4gIHJldHVybiBfdW5tb3VudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuZnVuY3Rpb24gX3VubW91bnQoKSB7XG4gIF91bm1vdW50ID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lKCkubWFyayhmdW5jdGlvbiBfY2FsbGVlMihjb250YWluZXIpIHtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZSgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0Mikge1xuICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgaWYgKCEoY3JlYXRlUm9vdCAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KFwicmV0dXJuXCIsIG1vZGVyblVubW91bnQoY29udGFpbmVyKSk7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBsZWdhY3lVbm1vdW50KGNvbnRhaW5lcik7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dDIuc3RvcCgpO1xuICAgICAgfVxuICAgIH0sIF9jYWxsZWUyKTtcbiAgfSkpO1xuICByZXR1cm4gX3VubW91bnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn0iLCAiaW1wb3J0IHsgZGVmYXVsdFByZWZpeENscyB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG4vLyA9PT09PT09PT09PT09PT09PT0gQ29sbGFwc2UgTW90aW9uID09PT09PT09PT09PT09PT09PVxuY29uc3QgZ2V0Q29sbGFwc2VkSGVpZ2h0ID0gKCkgPT4gKHtcbiAgaGVpZ2h0OiAwLFxuICBvcGFjaXR5OiAwXG59KTtcbmNvbnN0IGdldFJlYWxIZWlnaHQgPSBub2RlID0+IHtcbiAgY29uc3Qge1xuICAgIHNjcm9sbEhlaWdodFxuICB9ID0gbm9kZTtcbiAgcmV0dXJuIHtcbiAgICBoZWlnaHQ6IHNjcm9sbEhlaWdodCxcbiAgICBvcGFjaXR5OiAxXG4gIH07XG59O1xuY29uc3QgZ2V0Q3VycmVudEhlaWdodCA9IG5vZGUgPT4gKHtcbiAgaGVpZ2h0OiBub2RlID8gbm9kZS5vZmZzZXRIZWlnaHQgOiAwXG59KTtcbmNvbnN0IHNraXBPcGFjaXR5VHJhbnNpdGlvbiA9IChfLCBldmVudCkgPT4gKGV2ZW50ID09PSBudWxsIHx8IGV2ZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBldmVudC5kZWFkbGluZSkgPT09IHRydWUgfHwgZXZlbnQucHJvcGVydHlOYW1lID09PSAnaGVpZ2h0JztcbmNvbnN0IGluaXRDb2xsYXBzZU1vdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgbGV0IHJvb3RDbHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGRlZmF1bHRQcmVmaXhDbHM7XG4gIHJldHVybiB7XG4gICAgbW90aW9uTmFtZTogYCR7cm9vdENsc30tbW90aW9uLWNvbGxhcHNlYCxcbiAgICBvbkFwcGVhclN0YXJ0OiBnZXRDb2xsYXBzZWRIZWlnaHQsXG4gICAgb25FbnRlclN0YXJ0OiBnZXRDb2xsYXBzZWRIZWlnaHQsXG4gICAgb25BcHBlYXJBY3RpdmU6IGdldFJlYWxIZWlnaHQsXG4gICAgb25FbnRlckFjdGl2ZTogZ2V0UmVhbEhlaWdodCxcbiAgICBvbkxlYXZlU3RhcnQ6IGdldEN1cnJlbnRIZWlnaHQsXG4gICAgb25MZWF2ZUFjdGl2ZTogZ2V0Q29sbGFwc2VkSGVpZ2h0LFxuICAgIG9uQXBwZWFyRW5kOiBza2lwT3BhY2l0eVRyYW5zaXRpb24sXG4gICAgb25FbnRlckVuZDogc2tpcE9wYWNpdHlUcmFuc2l0aW9uLFxuICAgIG9uTGVhdmVFbmQ6IHNraXBPcGFjaXR5VHJhbnNpdGlvbixcbiAgICBtb3Rpb25EZWFkbGluZTogNTAwXG4gIH07XG59O1xuY29uc3QgX1NlbGVjdFBsYWNlbWVudHMgPSBbJ2JvdHRvbUxlZnQnLCAnYm90dG9tUmlnaHQnLCAndG9wTGVmdCcsICd0b3BSaWdodCddO1xuY29uc3QgZ2V0VHJhbnNpdGlvbk5hbWUgPSAocm9vdFByZWZpeENscywgbW90aW9uLCB0cmFuc2l0aW9uTmFtZSkgPT4ge1xuICBpZiAodHJhbnNpdGlvbk5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB0cmFuc2l0aW9uTmFtZTtcbiAgfVxuICByZXR1cm4gYCR7cm9vdFByZWZpeENsc30tJHttb3Rpb259YDtcbn07XG5leHBvcnQgeyBnZXRUcmFuc2l0aW9uTmFtZSB9O1xuZXhwb3J0IGRlZmF1bHQgaW5pdENvbGxhcHNlTW90aW9uOyIsICJcInVzZSBjbGllbnRcIjtcblxudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBSZWFjdCwgeyBDaGlsZHJlbiwgdXNlQ29udGV4dCwgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgb21pdCBmcm9tIFwicmMtdXRpbC9lcy9vbWl0XCI7XG5pbXBvcnQgeyB1c2VDb21wb3NlUmVmIH0gZnJvbSBcInJjLXV0aWwvZXMvcmVmXCI7XG5pbXBvcnQgeyBkZXZVc2VXYXJuaW5nIH0gZnJvbSAnLi4vX3V0aWwvd2FybmluZyc7XG5pbXBvcnQgV2F2ZSBmcm9tICcuLi9fdXRpbC93YXZlJztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQsIHVzZUNvbXBvbmVudENvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlci9jb250ZXh0JztcbmltcG9ydCBEaXNhYmxlZENvbnRleHQgZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL0Rpc2FibGVkQ29udGV4dCc7XG5pbXBvcnQgdXNlU2l6ZSBmcm9tICcuLi9jb25maWctcHJvdmlkZXIvaG9va3MvdXNlU2l6ZSc7XG5pbXBvcnQgeyB1c2VDb21wYWN0SXRlbUNvbnRleHQgfSBmcm9tICcuLi9zcGFjZS9Db21wYWN0JztcbmltcG9ydCBHcm91cCwgeyBHcm91cFNpemVDb250ZXh0IH0gZnJvbSAnLi9idXR0b24tZ3JvdXAnO1xuaW1wb3J0IHsgaXNUd29DTkNoYXIsIGlzVW5Cb3JkZXJlZEJ1dHRvblZhcmlhbnQsIHNwYWNlQ2hpbGRyZW4gfSBmcm9tICcuL2J1dHRvbkhlbHBlcnMnO1xuaW1wb3J0IERlZmF1bHRMb2FkaW5nSWNvbiBmcm9tICcuL0RlZmF1bHRMb2FkaW5nSWNvbic7XG5pbXBvcnQgSWNvbldyYXBwZXIgZnJvbSAnLi9JY29uV3JhcHBlcic7XG5pbXBvcnQgdXNlU3R5bGUgZnJvbSAnLi9zdHlsZSc7XG5pbXBvcnQgQ29tcGFjdCBmcm9tICcuL3N0eWxlL2NvbXBhY3QnO1xuZnVuY3Rpb24gZ2V0TG9hZGluZ0NvbmZpZyhsb2FkaW5nKSB7XG4gIGlmICh0eXBlb2YgbG9hZGluZyA9PT0gJ29iamVjdCcgJiYgbG9hZGluZykge1xuICAgIGxldCBkZWxheSA9IGxvYWRpbmcgPT09IG51bGwgfHwgbG9hZGluZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogbG9hZGluZy5kZWxheTtcbiAgICBkZWxheSA9ICFOdW1iZXIuaXNOYU4oZGVsYXkpICYmIHR5cGVvZiBkZWxheSA9PT0gJ251bWJlcicgPyBkZWxheSA6IDA7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxvYWRpbmc6IGRlbGF5IDw9IDAsXG4gICAgICBkZWxheVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBsb2FkaW5nOiAhIWxvYWRpbmcsXG4gICAgZGVsYXk6IDBcbiAgfTtcbn1cbmNvbnN0IEJ1dHRvblR5cGVNYXAgPSB7XG4gIGRlZmF1bHQ6IFsnZGVmYXVsdCcsICdvdXRsaW5lZCddLFxuICBwcmltYXJ5OiBbJ3ByaW1hcnknLCAnc29saWQnXSxcbiAgZGFzaGVkOiBbJ2RlZmF1bHQnLCAnZGFzaGVkJ10sXG4gIC8vIGBsaW5rYCBpcyBub3QgYSByZWFsIGNvbG9yIGJ1dCB3ZSBzaG91bGQgY29tcGF0aWJsZSB3aXRoIGl0XG4gIGxpbms6IFsnbGluaycsICdsaW5rJ10sXG4gIHRleHQ6IFsnZGVmYXVsdCcsICd0ZXh0J11cbn07XG5jb25zdCBJbnRlcm5hbENvbXBvdW5kZWRCdXR0b24gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIHJlZikgPT4ge1xuICB2YXIgX2EsIF9iO1xuICBjb25zdCB7XG4gICAgICBsb2FkaW5nID0gZmFsc2UsXG4gICAgICBwcmVmaXhDbHM6IGN1c3RvbWl6ZVByZWZpeENscyxcbiAgICAgIGNvbG9yLFxuICAgICAgdmFyaWFudCxcbiAgICAgIHR5cGUsXG4gICAgICBkYW5nZXIgPSBmYWxzZSxcbiAgICAgIHNoYXBlID0gJ2RlZmF1bHQnLFxuICAgICAgc2l6ZTogY3VzdG9taXplU2l6ZSxcbiAgICAgIHN0eWxlcyxcbiAgICAgIGRpc2FibGVkOiBjdXN0b21EaXNhYmxlZCxcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIHJvb3RDbGFzc05hbWUsXG4gICAgICBjaGlsZHJlbixcbiAgICAgIGljb24sXG4gICAgICBpY29uUG9zaXRpb24gPSAnc3RhcnQnLFxuICAgICAgZ2hvc3QgPSBmYWxzZSxcbiAgICAgIGJsb2NrID0gZmFsc2UsXG4gICAgICAvLyBSZWFjdCBkb2VzIG5vdCByZWNvZ25pemUgdGhlIGBodG1sVHlwZWAgcHJvcCBvbiBhIERPTSBlbGVtZW50LiBIZXJlIHdlIHBpY2sgaXQgb3V0IG9mIGByZXN0YC5cbiAgICAgIGh0bWxUeXBlID0gJ2J1dHRvbicsXG4gICAgICBjbGFzc05hbWVzOiBjdXN0b21DbGFzc05hbWVzLFxuICAgICAgc3R5bGU6IGN1c3RvbVN0eWxlID0ge30sXG4gICAgICBhdXRvSW5zZXJ0U3BhY2UsXG4gICAgICBhdXRvRm9jdXNcbiAgICB9ID0gcHJvcHMsXG4gICAgcmVzdCA9IF9fcmVzdChwcm9wcywgW1wibG9hZGluZ1wiLCBcInByZWZpeENsc1wiLCBcImNvbG9yXCIsIFwidmFyaWFudFwiLCBcInR5cGVcIiwgXCJkYW5nZXJcIiwgXCJzaGFwZVwiLCBcInNpemVcIiwgXCJzdHlsZXNcIiwgXCJkaXNhYmxlZFwiLCBcImNsYXNzTmFtZVwiLCBcInJvb3RDbGFzc05hbWVcIiwgXCJjaGlsZHJlblwiLCBcImljb25cIiwgXCJpY29uUG9zaXRpb25cIiwgXCJnaG9zdFwiLCBcImJsb2NrXCIsIFwiaHRtbFR5cGVcIiwgXCJjbGFzc05hbWVzXCIsIFwic3R5bGVcIiwgXCJhdXRvSW5zZXJ0U3BhY2VcIiwgXCJhdXRvRm9jdXNcIl0pO1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy80NzYwNVxuICAvLyBDb21wYXRpYmxlIHdpdGggb3JpZ2luYWwgYHR5cGVgIGJlaGF2aW9yXG4gIGNvbnN0IG1lcmdlZFR5cGUgPSB0eXBlIHx8ICdkZWZhdWx0JztcbiAgY29uc3Qge1xuICAgIGJ1dHRvblxuICB9ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KTtcbiAgY29uc3QgW21lcmdlZENvbG9yLCBtZXJnZWRWYXJpYW50XSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIC8vID4+Pj4+IExvY2FsXG4gICAgLy8gQ29sb3IgJiBWYXJpYW50XG4gICAgaWYgKGNvbG9yICYmIHZhcmlhbnQpIHtcbiAgICAgIHJldHVybiBbY29sb3IsIHZhcmlhbnRdO1xuICAgIH1cbiAgICAvLyBTdWdhciBzeW50YXhcbiAgICBpZiAodHlwZSB8fCBkYW5nZXIpIHtcbiAgICAgIGNvbnN0IGNvbG9yVmFyaWFudFBhaXIgPSBCdXR0b25UeXBlTWFwW21lcmdlZFR5cGVdIHx8IFtdO1xuICAgICAgaWYgKGRhbmdlcikge1xuICAgICAgICByZXR1cm4gWydkYW5nZXInLCBjb2xvclZhcmlhbnRQYWlyWzFdXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb2xvclZhcmlhbnRQYWlyO1xuICAgIH1cbiAgICAvLyA+Pj4gQ29udGV4dCBmYWxsYmFja1xuICAgIGlmICgoYnV0dG9uID09PSBudWxsIHx8IGJ1dHRvbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogYnV0dG9uLmNvbG9yKSAmJiAoYnV0dG9uID09PSBudWxsIHx8IGJ1dHRvbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogYnV0dG9uLnZhcmlhbnQpKSB7XG4gICAgICByZXR1cm4gW2J1dHRvbi5jb2xvciwgYnV0dG9uLnZhcmlhbnRdO1xuICAgIH1cbiAgICByZXR1cm4gWydkZWZhdWx0JywgJ291dGxpbmVkJ107XG4gIH0sIFt0eXBlLCBjb2xvciwgdmFyaWFudCwgZGFuZ2VyLCBidXR0b24gPT09IG51bGwgfHwgYnV0dG9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBidXR0b24udmFyaWFudCwgYnV0dG9uID09PSBudWxsIHx8IGJ1dHRvbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogYnV0dG9uLmNvbG9yXSk7XG4gIGNvbnN0IGlzRGFuZ2VyID0gbWVyZ2VkQ29sb3IgPT09ICdkYW5nZXInO1xuICBjb25zdCBtZXJnZWRDb2xvclRleHQgPSBpc0RhbmdlciA/ICdkYW5nZXJvdXMnIDogbWVyZ2VkQ29sb3I7XG4gIGNvbnN0IHtcbiAgICBnZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uLFxuICAgIGF1dG9JbnNlcnRTcGFjZTogY29udGV4dEF1dG9JbnNlcnRTcGFjZSxcbiAgICBjbGFzc05hbWU6IGNvbnRleHRDbGFzc05hbWUsXG4gICAgc3R5bGU6IGNvbnRleHRTdHlsZSxcbiAgICBjbGFzc05hbWVzOiBjb250ZXh0Q2xhc3NOYW1lcyxcbiAgICBzdHlsZXM6IGNvbnRleHRTdHlsZXNcbiAgfSA9IHVzZUNvbXBvbmVudENvbmZpZygnYnV0dG9uJyk7XG4gIGNvbnN0IG1lcmdlZEluc2VydFNwYWNlID0gKF9hID0gYXV0b0luc2VydFNwYWNlICE9PSBudWxsICYmIGF1dG9JbnNlcnRTcGFjZSAhPT0gdm9pZCAwID8gYXV0b0luc2VydFNwYWNlIDogY29udGV4dEF1dG9JbnNlcnRTcGFjZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdHJ1ZTtcbiAgY29uc3QgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdidG4nLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICBjb25zdCBbd3JhcENTU1ZhciwgaGFzaElkLCBjc3NWYXJDbHNdID0gdXNlU3R5bGUocHJlZml4Q2xzKTtcbiAgY29uc3QgZGlzYWJsZWQgPSB1c2VDb250ZXh0KERpc2FibGVkQ29udGV4dCk7XG4gIGNvbnN0IG1lcmdlZERpc2FibGVkID0gY3VzdG9tRGlzYWJsZWQgIT09IG51bGwgJiYgY3VzdG9tRGlzYWJsZWQgIT09IHZvaWQgMCA/IGN1c3RvbURpc2FibGVkIDogZGlzYWJsZWQ7XG4gIGNvbnN0IGdyb3VwU2l6ZSA9IHVzZUNvbnRleHQoR3JvdXBTaXplQ29udGV4dCk7XG4gIGNvbnN0IGxvYWRpbmdPckRlbGF5ID0gdXNlTWVtbygoKSA9PiBnZXRMb2FkaW5nQ29uZmlnKGxvYWRpbmcpLCBbbG9hZGluZ10pO1xuICBjb25zdCBbaW5uZXJMb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlKGxvYWRpbmdPckRlbGF5LmxvYWRpbmcpO1xuICBjb25zdCBbaGFzVHdvQ05DaGFyLCBzZXRIYXNUd29DTkNoYXJdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBidXR0b25SZWYgPSB1c2VSZWYobnVsbCk7XG4gIGNvbnN0IG1lcmdlZFJlZiA9IHVzZUNvbXBvc2VSZWYocmVmLCBidXR0b25SZWYpO1xuICBjb25zdCBuZWVkSW5zZXJ0ZWQgPSBDaGlsZHJlbi5jb3VudChjaGlsZHJlbikgPT09IDEgJiYgIWljb24gJiYgIWlzVW5Cb3JkZXJlZEJ1dHRvblZhcmlhbnQobWVyZ2VkVmFyaWFudCk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gTW91bnQgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUmVjb3JkIGZvciBtb3VudCBzdGF0dXMuXG4gIC8vIFRoaXMgd2lsbCBoZWxwIHRvIG5vIHRvIHNob3cgdGhlIGFuaW1hdGlvbiBvZiBsb2FkaW5nIG9uIHRoZSBmaXJzdCBtb3VudC5cbiAgY29uc3QgaXNNb3VudFJlZiA9IHVzZVJlZih0cnVlKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpc01vdW50UmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaXNNb3VudFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gRWZmZWN0ID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTG9hZGluZ1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGxldCBkZWxheVRpbWVyID0gbnVsbDtcbiAgICBpZiAobG9hZGluZ09yRGVsYXkuZGVsYXkgPiAwKSB7XG4gICAgICBkZWxheVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGRlbGF5VGltZXIgPSBudWxsO1xuICAgICAgICBzZXRMb2FkaW5nKHRydWUpO1xuICAgICAgfSwgbG9hZGluZ09yRGVsYXkuZGVsYXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRMb2FkaW5nKGxvYWRpbmdPckRlbGF5LmxvYWRpbmcpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjbGVhbnVwVGltZXIoKSB7XG4gICAgICBpZiAoZGVsYXlUaW1lcikge1xuICAgICAgICBjbGVhclRpbWVvdXQoZGVsYXlUaW1lcik7XG4gICAgICAgIGRlbGF5VGltZXIgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2xlYW51cFRpbWVyO1xuICB9LCBbbG9hZGluZ09yRGVsYXldKTtcbiAgLy8gVHdvIGNoaW5lc2UgY2hhcmFjdGVycyBjaGVja1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIEZJWE1FOiBmb3IgSE9DIHVzYWdlIGxpa2UgPEZvcm1hdE1lc3NhZ2UgLz5cbiAgICBpZiAoIWJ1dHRvblJlZi5jdXJyZW50IHx8ICFtZXJnZWRJbnNlcnRTcGFjZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBidXR0b25UZXh0ID0gYnV0dG9uUmVmLmN1cnJlbnQudGV4dENvbnRlbnQgfHwgJyc7XG4gICAgaWYgKG5lZWRJbnNlcnRlZCAmJiBpc1R3b0NOQ2hhcihidXR0b25UZXh0KSkge1xuICAgICAgaWYgKCFoYXNUd29DTkNoYXIpIHtcbiAgICAgICAgc2V0SGFzVHdvQ05DaGFyKHRydWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaGFzVHdvQ05DaGFyKSB7XG4gICAgICBzZXRIYXNUd29DTkNoYXIoZmFsc2UpO1xuICAgIH1cbiAgfSk7XG4gIC8vIEF1dG8gZm9jdXNcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoYXV0b0ZvY3VzICYmIGJ1dHRvblJlZi5jdXJyZW50KSB7XG4gICAgICBidXR0b25SZWYuY3VycmVudC5mb2N1cygpO1xuICAgIH1cbiAgfSwgW10pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IEV2ZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IGhhbmRsZUNsaWNrID0gUmVhY3QudXNlQ2FsbGJhY2soZSA9PiB7XG4gICAgdmFyIF9hO1xuICAgIC8vIEZJWE1FOiBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8zMDIwN1xuICAgIGlmIChpbm5lckxvYWRpbmcgfHwgbWVyZ2VkRGlzYWJsZWQpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgKF9hID0gcHJvcHMub25DbGljaykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwocHJvcHMsICdocmVmJyBpbiBwcm9wcyA/IGUgOiBlKTtcbiAgfSwgW3Byb3BzLm9uQ2xpY2ssIGlubmVyTG9hZGluZywgbWVyZ2VkRGlzYWJsZWRdKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gV2FybiA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGNvbnN0IHdhcm5pbmcgPSBkZXZVc2VXYXJuaW5nKCdCdXR0b24nKTtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCEodHlwZW9mIGljb24gPT09ICdzdHJpbmcnICYmIGljb24ubGVuZ3RoID4gMiksICdicmVha2luZycsIGBcXGBpY29uXFxgIGlzIHVzaW5nIFJlYWN0Tm9kZSBpbnN0ZWFkIG9mIHN0cmluZyBuYW1pbmcgaW4gdjQuIFBsZWFzZSBjaGVjayBcXGAke2ljb259XFxgIGF0IGh0dHBzOi8vYW50LmRlc2lnbi9jb21wb25lbnRzL2ljb25gKSA6IHZvaWQgMDtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCEoZ2hvc3QgJiYgaXNVbkJvcmRlcmVkQnV0dG9uVmFyaWFudChtZXJnZWRWYXJpYW50KSksICd1c2FnZScsIFwiYGxpbmtgIG9yIGB0ZXh0YCBidXR0b24gY2FuJ3QgYmUgYSBgZ2hvc3RgIGJ1dHRvbi5cIikgOiB2b2lkIDA7XG4gIH1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gU2l6ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCB7XG4gICAgY29tcGFjdFNpemUsXG4gICAgY29tcGFjdEl0ZW1DbGFzc25hbWVzXG4gIH0gPSB1c2VDb21wYWN0SXRlbUNvbnRleHQocHJlZml4Q2xzLCBkaXJlY3Rpb24pO1xuICBjb25zdCBzaXplQ2xhc3NOYW1lTWFwID0ge1xuICAgIGxhcmdlOiAnbGcnLFxuICAgIHNtYWxsOiAnc20nLFxuICAgIG1pZGRsZTogdW5kZWZpbmVkXG4gIH07XG4gIGNvbnN0IHNpemVGdWxsTmFtZSA9IHVzZVNpemUoY3R4U2l6ZSA9PiB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gKF9iID0gKF9hID0gY3VzdG9taXplU2l6ZSAhPT0gbnVsbCAmJiBjdXN0b21pemVTaXplICE9PSB2b2lkIDAgPyBjdXN0b21pemVTaXplIDogY29tcGFjdFNpemUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGdyb3VwU2l6ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogY3R4U2l6ZTtcbiAgfSk7XG4gIGNvbnN0IHNpemVDbHMgPSBzaXplRnVsbE5hbWUgPyAoX2IgPSBzaXplQ2xhc3NOYW1lTWFwW3NpemVGdWxsTmFtZV0pICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnIDogJyc7XG4gIGNvbnN0IGljb25UeXBlID0gaW5uZXJMb2FkaW5nID8gJ2xvYWRpbmcnIDogaWNvbjtcbiAgY29uc3QgbGlua0J1dHRvblJlc3RQcm9wcyA9IG9taXQocmVzdCwgWyduYXZpZ2F0ZSddKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBjbGFzc2VzID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIGhhc2hJZCwgY3NzVmFyQ2xzLCB7XG4gICAgW2Ake3ByZWZpeENsc30tJHtzaGFwZX1gXTogc2hhcGUgIT09ICdkZWZhdWx0JyAmJiBzaGFwZSxcbiAgICAvLyBDb21wYXRpYmxlIHdpdGggdmVyc2lvbnMgZWFybGllciB0aGFuIDUuMjEuMFxuICAgIFtgJHtwcmVmaXhDbHN9LSR7bWVyZ2VkVHlwZX1gXTogbWVyZ2VkVHlwZSxcbiAgICBbYCR7cHJlZml4Q2xzfS1kYW5nZXJvdXNgXTogZGFuZ2VyLFxuICAgIFtgJHtwcmVmaXhDbHN9LWNvbG9yLSR7bWVyZ2VkQ29sb3JUZXh0fWBdOiBtZXJnZWRDb2xvclRleHQsXG4gICAgW2Ake3ByZWZpeENsc30tdmFyaWFudC0ke21lcmdlZFZhcmlhbnR9YF06IG1lcmdlZFZhcmlhbnQsXG4gICAgW2Ake3ByZWZpeENsc30tJHtzaXplQ2xzfWBdOiBzaXplQ2xzLFxuICAgIFtgJHtwcmVmaXhDbHN9LWljb24tb25seWBdOiAhY2hpbGRyZW4gJiYgY2hpbGRyZW4gIT09IDAgJiYgISFpY29uVHlwZSxcbiAgICBbYCR7cHJlZml4Q2xzfS1iYWNrZ3JvdW5kLWdob3N0YF06IGdob3N0ICYmICFpc1VuQm9yZGVyZWRCdXR0b25WYXJpYW50KG1lcmdlZFZhcmlhbnQpLFxuICAgIFtgJHtwcmVmaXhDbHN9LWxvYWRpbmdgXTogaW5uZXJMb2FkaW5nLFxuICAgIFtgJHtwcmVmaXhDbHN9LXR3by1jaGluZXNlLWNoYXJzYF06IGhhc1R3b0NOQ2hhciAmJiBtZXJnZWRJbnNlcnRTcGFjZSAmJiAhaW5uZXJMb2FkaW5nLFxuICAgIFtgJHtwcmVmaXhDbHN9LWJsb2NrYF06IGJsb2NrLFxuICAgIFtgJHtwcmVmaXhDbHN9LXJ0bGBdOiBkaXJlY3Rpb24gPT09ICdydGwnLFxuICAgIFtgJHtwcmVmaXhDbHN9LWljb24tZW5kYF06IGljb25Qb3NpdGlvbiA9PT0gJ2VuZCdcbiAgfSwgY29tcGFjdEl0ZW1DbGFzc25hbWVzLCBjbGFzc05hbWUsIHJvb3RDbGFzc05hbWUsIGNvbnRleHRDbGFzc05hbWUpO1xuICBjb25zdCBmdWxsU3R5bGUgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGNvbnRleHRTdHlsZSksIGN1c3RvbVN0eWxlKTtcbiAgY29uc3QgaWNvbkNsYXNzZXMgPSBjbGFzc05hbWVzKGN1c3RvbUNsYXNzTmFtZXMgPT09IG51bGwgfHwgY3VzdG9tQ2xhc3NOYW1lcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY3VzdG9tQ2xhc3NOYW1lcy5pY29uLCBjb250ZXh0Q2xhc3NOYW1lcy5pY29uKTtcbiAgY29uc3QgaWNvblN0eWxlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCAoc3R5bGVzID09PSBudWxsIHx8IHN0eWxlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3R5bGVzLmljb24pIHx8IHt9KSwgY29udGV4dFN0eWxlcy5pY29uIHx8IHt9KTtcbiAgY29uc3QgaWNvbk5vZGUgPSBpY29uICYmICFpbm5lckxvYWRpbmcgPyAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSWNvbldyYXBwZXIsIHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBjbGFzc05hbWU6IGljb25DbGFzc2VzLFxuICAgIHN0eWxlOiBpY29uU3R5bGVcbiAgfSwgaWNvbikpIDogbG9hZGluZyAmJiB0eXBlb2YgbG9hZGluZyA9PT0gJ29iamVjdCcgJiYgbG9hZGluZy5pY29uID8gKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEljb25XcmFwcGVyLCB7XG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgY2xhc3NOYW1lOiBpY29uQ2xhc3NlcyxcbiAgICBzdHlsZTogaWNvblN0eWxlXG4gIH0sIGxvYWRpbmcuaWNvbikpIDogKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERlZmF1bHRMb2FkaW5nSWNvbiwge1xuICAgIGV4aXN0SWNvbjogISFpY29uLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGxvYWRpbmc6IGlubmVyTG9hZGluZyxcbiAgICBtb3VudDogaXNNb3VudFJlZi5jdXJyZW50XG4gIH0pKTtcbiAgY29uc3Qga2lkcyA9IGNoaWxkcmVuIHx8IGNoaWxkcmVuID09PSAwID8gc3BhY2VDaGlsZHJlbihjaGlsZHJlbiwgbmVlZEluc2VydGVkICYmIG1lcmdlZEluc2VydFNwYWNlKSA6IG51bGw7XG4gIGlmIChsaW5rQnV0dG9uUmVzdFByb3BzLmhyZWYgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB3cmFwQ1NTVmFyKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiYVwiLCBPYmplY3QuYXNzaWduKHt9LCBsaW5rQnV0dG9uUmVzdFByb3BzLCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3Nlcywge1xuICAgICAgICBbYCR7cHJlZml4Q2xzfS1kaXNhYmxlZGBdOiBtZXJnZWREaXNhYmxlZFxuICAgICAgfSksXG4gICAgICBocmVmOiBtZXJnZWREaXNhYmxlZCA/IHVuZGVmaW5lZCA6IGxpbmtCdXR0b25SZXN0UHJvcHMuaHJlZixcbiAgICAgIHN0eWxlOiBmdWxsU3R5bGUsXG4gICAgICBvbkNsaWNrOiBoYW5kbGVDbGljayxcbiAgICAgIHJlZjogbWVyZ2VkUmVmLFxuICAgICAgdGFiSW5kZXg6IG1lcmdlZERpc2FibGVkID8gLTEgOiAwXG4gICAgfSksIGljb25Ob2RlLCBraWRzKSk7XG4gIH1cbiAgbGV0IGJ1dHRvbk5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCBPYmplY3QuYXNzaWduKHt9LCByZXN0LCB7XG4gICAgdHlwZTogaHRtbFR5cGUsXG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzLFxuICAgIHN0eWxlOiBmdWxsU3R5bGUsXG4gICAgb25DbGljazogaGFuZGxlQ2xpY2ssXG4gICAgZGlzYWJsZWQ6IG1lcmdlZERpc2FibGVkLFxuICAgIHJlZjogbWVyZ2VkUmVmXG4gIH0pLCBpY29uTm9kZSwga2lkcywgY29tcGFjdEl0ZW1DbGFzc25hbWVzICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbXBhY3QsIHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENsc1xuICB9KSk7XG4gIGlmICghaXNVbkJvcmRlcmVkQnV0dG9uVmFyaWFudChtZXJnZWRWYXJpYW50KSkge1xuICAgIGJ1dHRvbk5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChXYXZlLCB7XG4gICAgICBjb21wb25lbnQ6IFwiQnV0dG9uXCIsXG4gICAgICBkaXNhYmxlZDogaW5uZXJMb2FkaW5nXG4gICAgfSwgYnV0dG9uTm9kZSk7XG4gIH1cbiAgcmV0dXJuIHdyYXBDU1NWYXIoYnV0dG9uTm9kZSk7XG59KTtcbmNvbnN0IEJ1dHRvbiA9IEludGVybmFsQ29tcG91bmRlZEJ1dHRvbjtcbkJ1dHRvbi5Hcm91cCA9IEdyb3VwO1xuQnV0dG9uLl9fQU5UX0JVVFRPTiA9IHRydWU7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBCdXR0b24uZGlzcGxheU5hbWUgPSAnQnV0dG9uJztcbn1cbmV4cG9ydCBkZWZhdWx0IEJ1dHRvbjsiLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gb21pdChvYmosIGZpZWxkcykge1xuICB2YXIgY2xvbmUgPSBPYmplY3QuYXNzaWduKHt9LCBvYmopO1xuICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZHMpKSB7XG4gICAgZmllbGRzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgZGVsZXRlIGNsb25lW2tleV07XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGNsb25lO1xufSIsICJpbXBvcnQgUmVhY3QsIHsgdXNlQ29udGV4dCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgaXNWaXNpYmxlIGZyb20gXCJyYy11dGlsL2VzL0RvbS9pc1Zpc2libGVcIjtcbmltcG9ydCB7IGNvbXBvc2VSZWYsIGdldE5vZGVSZWYsIHN1cHBvcnRSZWYgfSBmcm9tIFwicmMtdXRpbC9lcy9yZWZcIjtcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi8uLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHsgY2xvbmVFbGVtZW50IH0gZnJvbSAnLi4vcmVhY3ROb2RlJztcbmltcG9ydCB1c2VTdHlsZSBmcm9tICcuL3N0eWxlJztcbmltcG9ydCB1c2VXYXZlIGZyb20gJy4vdXNlV2F2ZSc7XG5jb25zdCBXYXZlID0gcHJvcHMgPT4ge1xuICBjb25zdCB7XG4gICAgY2hpbGRyZW4sXG4gICAgZGlzYWJsZWQsXG4gICAgY29tcG9uZW50XG4gIH0gPSBwcm9wcztcbiAgY29uc3Qge1xuICAgIGdldFByZWZpeENsc1xuICB9ID0gdXNlQ29udGV4dChDb25maWdDb250ZXh0KTtcbiAgY29uc3QgY29udGFpbmVyUmVmID0gdXNlUmVmKG51bGwpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU3R5bGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ3dhdmUnKTtcbiAgY29uc3QgWywgaGFzaElkXSA9IHVzZVN0eWxlKHByZWZpeENscyk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gV2F2ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IHNob3dXYXZlID0gdXNlV2F2ZShjb250YWluZXJSZWYsIGNsYXNzTmFtZXMocHJlZml4Q2xzLCBoYXNoSWQpLCBjb21wb25lbnQpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRWZmZWN0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG5vZGUgPSBjb250YWluZXJSZWYuY3VycmVudDtcbiAgICBpZiAoIW5vZGUgfHwgbm9kZS5ub2RlVHlwZSAhPT0gMSB8fCBkaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBDbGljayBoYW5kbGVyXG4gICAgY29uc3Qgb25DbGljayA9IGUgPT4ge1xuICAgICAgLy8gRml4IHJhZGlvIGJ1dHRvbiBjbGljayB0d2ljZVxuICAgICAgaWYgKCFpc1Zpc2libGUoZS50YXJnZXQpIHx8XG4gICAgICAvLyBObyBuZWVkIHdhdmVcbiAgICAgICFub2RlLmdldEF0dHJpYnV0ZSB8fCBub2RlLmdldEF0dHJpYnV0ZSgnZGlzYWJsZWQnKSB8fCBub2RlLmRpc2FibGVkIHx8IG5vZGUuY2xhc3NOYW1lLmluY2x1ZGVzKCdkaXNhYmxlZCcpIHx8IG5vZGUuY2xhc3NOYW1lLmluY2x1ZGVzKCctbGVhdmUnKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzaG93V2F2ZShlKTtcbiAgICB9O1xuICAgIC8vIEJpbmQgZXZlbnRzXG4gICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9uQ2xpY2ssIHRydWUpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb25DbGljaywgdHJ1ZSk7XG4gICAgfTtcbiAgfSwgW2Rpc2FibGVkXSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGlmICghIC8qI19fUFVSRV9fKi9SZWFjdC5pc1ZhbGlkRWxlbWVudChjaGlsZHJlbikpIHtcbiAgICByZXR1cm4gY2hpbGRyZW4gIT09IG51bGwgJiYgY2hpbGRyZW4gIT09IHZvaWQgMCA/IGNoaWxkcmVuIDogbnVsbDtcbiAgfVxuICBjb25zdCByZWYgPSBzdXBwb3J0UmVmKGNoaWxkcmVuKSA/IGNvbXBvc2VSZWYoZ2V0Tm9kZVJlZihjaGlsZHJlbiksIGNvbnRhaW5lclJlZikgOiBjb250YWluZXJSZWY7XG4gIHJldHVybiBjbG9uZUVsZW1lbnQoY2hpbGRyZW4sIHtcbiAgICByZWZcbiAgfSk7XG59O1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgV2F2ZS5kaXNwbGF5TmFtZSA9ICdXYXZlJztcbn1cbmV4cG9ydCBkZWZhdWx0IFdhdmU7IiwgImV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAoZWxlbWVudCkge1xuICBpZiAoIWVsZW1lbnQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgaWYgKGVsZW1lbnQub2Zmc2V0UGFyZW50KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGVsZW1lbnQuZ2V0QkJveCkge1xuICAgICAgdmFyIF9nZXRCQm94ID0gZWxlbWVudC5nZXRCQm94KCksXG4gICAgICAgIHdpZHRoID0gX2dldEJCb3gud2lkdGgsXG4gICAgICAgIGhlaWdodCA9IF9nZXRCQm94LmhlaWdodDtcbiAgICAgIGlmICh3aWR0aCB8fCBoZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCkge1xuICAgICAgdmFyIF9lbGVtZW50JGdldEJvdW5kaW5nQyA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgIF93aWR0aCA9IF9lbGVtZW50JGdldEJvdW5kaW5nQy53aWR0aCxcbiAgICAgICAgX2hlaWdodCA9IF9lbGVtZW50JGdldEJvdW5kaW5nQy5oZWlnaHQ7XG4gICAgICBpZiAoX3dpZHRoIHx8IF9oZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn0pOyIsICJpbXBvcnQgeyBnZW5Db21wb25lbnRTdHlsZUhvb2sgfSBmcm9tICcuLi8uLi90aGVtZS9pbnRlcm5hbCc7XG5jb25zdCBnZW5XYXZlU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHMsXG4gICAgY29sb3JQcmltYXJ5XG4gIH0gPSB0b2tlbjtcbiAgcmV0dXJuIHtcbiAgICBbY29tcG9uZW50Q2xzXToge1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnLFxuICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgICAgYm94U2l6aW5nOiAnYm9yZGVyLWJveCcsXG4gICAgICBjb2xvcjogYHZhcigtLXdhdmUtY29sb3IsICR7Y29sb3JQcmltYXJ5fSlgLFxuICAgICAgYm94U2hhZG93OiBgMCAwIDAgMCBjdXJyZW50Y29sb3JgLFxuICAgICAgb3BhY2l0eTogMC4yLFxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PSBNb3Rpb24gPT09PT09PT09PT09PT09PT09PVxuICAgICAgJyYud2F2ZS1tb3Rpb24tYXBwZWFyJzoge1xuICAgICAgICB0cmFuc2l0aW9uOiBbYGJveC1zaGFkb3cgMC40cyAke3Rva2VuLm1vdGlvbkVhc2VPdXRDaXJjfWAsIGBvcGFjaXR5IDJzICR7dG9rZW4ubW90aW9uRWFzZU91dENpcmN9YF0uam9pbignLCcpLFxuICAgICAgICAnJi1hY3RpdmUnOiB7XG4gICAgICAgICAgYm94U2hhZG93OiBgMCAwIDAgNnB4IGN1cnJlbnRjb2xvcmAsXG4gICAgICAgICAgb3BhY2l0eTogMFxuICAgICAgICB9LFxuICAgICAgICAnJi53YXZlLXF1aWNrJzoge1xuICAgICAgICAgIHRyYW5zaXRpb246IFtgYm94LXNoYWRvdyAke3Rva2VuLm1vdGlvbkR1cmF0aW9uU2xvd30gJHt0b2tlbi5tb3Rpb25FYXNlSW5PdXR9YCwgYG9wYWNpdHkgJHt0b2tlbi5tb3Rpb25EdXJhdGlvblNsb3d9ICR7dG9rZW4ubW90aW9uRWFzZUluT3V0fWBdLmpvaW4oJywnKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbmV4cG9ydCBkZWZhdWx0IGdlbkNvbXBvbmVudFN0eWxlSG9vaygnV2F2ZScsIHRva2VuID0+IFtnZW5XYXZlU3R5bGUodG9rZW4pXSk7IiwgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VFdmVudCBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VFdmVudFwiO1xuaW1wb3J0IHJhZiBmcm9tIFwicmMtdXRpbC9lcy9yYWZcIjtcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi8uLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHVzZVRva2VuIGZyb20gJy4uLy4uL3RoZW1lL3VzZVRva2VuJztcbmltcG9ydCB7IFRBUkdFVF9DTFMgfSBmcm9tICcuL2ludGVyZmFjZSc7XG5pbXBvcnQgc2hvd1dhdmVFZmZlY3QgZnJvbSAnLi9XYXZlRWZmZWN0JztcbmNvbnN0IHVzZVdhdmUgPSAobm9kZVJlZiwgY2xhc3NOYW1lLCBjb21wb25lbnQpID0+IHtcbiAgY29uc3Qge1xuICAgIHdhdmVcbiAgfSA9IFJlYWN0LnVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCk7XG4gIGNvbnN0IFssIHRva2VuLCBoYXNoSWRdID0gdXNlVG9rZW4oKTtcbiAgY29uc3Qgc2hvd1dhdmUgPSB1c2VFdmVudChldmVudCA9PiB7XG4gICAgY29uc3Qgbm9kZSA9IG5vZGVSZWYuY3VycmVudDtcbiAgICBpZiAoKHdhdmUgPT09IG51bGwgfHwgd2F2ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogd2F2ZS5kaXNhYmxlZCkgfHwgIW5vZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0Tm9kZSA9IG5vZGUucXVlcnlTZWxlY3RvcihgLiR7VEFSR0VUX0NMU31gKSB8fCBub2RlO1xuICAgIGNvbnN0IHtcbiAgICAgIHNob3dFZmZlY3RcbiAgICB9ID0gd2F2ZSB8fCB7fTtcbiAgICAvLyBDdXN0b21pemUgd2F2ZSBlZmZlY3RcbiAgICAoc2hvd0VmZmVjdCB8fCBzaG93V2F2ZUVmZmVjdCkodGFyZ2V0Tm9kZSwge1xuICAgICAgY2xhc3NOYW1lLFxuICAgICAgdG9rZW4sXG4gICAgICBjb21wb25lbnQsXG4gICAgICBldmVudCxcbiAgICAgIGhhc2hJZFxuICAgIH0pO1xuICB9KTtcbiAgY29uc3QgcmFmSWQgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIC8vIE1lcmdlIHRyaWdnZXIgZXZlbnQgaW50byBvbmUgZm9yIGVhY2ggZnJhbWVcbiAgY29uc3Qgc2hvd0RlYm91bmNlV2F2ZSA9IGV2ZW50ID0+IHtcbiAgICByYWYuY2FuY2VsKHJhZklkLmN1cnJlbnQpO1xuICAgIHJhZklkLmN1cnJlbnQgPSByYWYoKCkgPT4ge1xuICAgICAgc2hvd1dhdmUoZXZlbnQpO1xuICAgIH0pO1xuICB9O1xuICByZXR1cm4gc2hvd0RlYm91bmNlV2F2ZTtcbn07XG5leHBvcnQgZGVmYXVsdCB1c2VXYXZlOyIsICJpbXBvcnQgeyBkZWZhdWx0UHJlZml4Q2xzIH0gZnJvbSAnLi4vLi4vY29uZmlnLXByb3ZpZGVyJztcbmV4cG9ydCBjb25zdCBUQVJHRVRfQ0xTID0gYCR7ZGVmYXVsdFByZWZpeENsc30td2F2ZS10YXJnZXRgOyIsICJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgQ1NTTW90aW9uIGZyb20gJ3JjLW1vdGlvbic7XG5pbXBvcnQgcmFmIGZyb20gXCJyYy11dGlsL2VzL3JhZlwiO1xuaW1wb3J0IHsgY29tcG9zZVJlZiB9IGZyb20gXCJyYy11dGlsL2VzL3JlZlwiO1xuaW1wb3J0IHsgdW5zdGFibGVTZXRSZW5kZXIgfSBmcm9tICcuLi8uLi9jb25maWctcHJvdmlkZXIvVW5zdGFibGVDb250ZXh0JztcbmltcG9ydCB7IFRBUkdFVF9DTFMgfSBmcm9tICcuL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBnZXRUYXJnZXRXYXZlQ29sb3IgfSBmcm9tICcuL3V0aWwnO1xuZnVuY3Rpb24gdmFsaWRhdGVOdW0odmFsdWUpIHtcbiAgcmV0dXJuIE51bWJlci5pc05hTih2YWx1ZSkgPyAwIDogdmFsdWU7XG59XG5jb25zdCBXYXZlRWZmZWN0ID0gcHJvcHMgPT4ge1xuICBjb25zdCB7XG4gICAgY2xhc3NOYW1lLFxuICAgIHRhcmdldCxcbiAgICBjb21wb25lbnQsXG4gICAgcmVnaXN0ZXJVbm1vdW50XG4gIH0gPSBwcm9wcztcbiAgY29uc3QgZGl2UmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09IFJlZnMgPT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCB1bm1vdW50UmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIHVubW91bnRSZWYuY3VycmVudCA9IHJlZ2lzdGVyVW5tb3VudCgpO1xuICB9LCBbXSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PSBFZmZlY3QgPT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IFtjb2xvciwgc2V0V2F2ZUNvbG9yXSA9IFJlYWN0LnVzZVN0YXRlKG51bGwpO1xuICBjb25zdCBbYm9yZGVyUmFkaXVzLCBzZXRCb3JkZXJSYWRpdXNdID0gUmVhY3QudXNlU3RhdGUoW10pO1xuICBjb25zdCBbbGVmdCwgc2V0TGVmdF0gPSBSZWFjdC51c2VTdGF0ZSgwKTtcbiAgY29uc3QgW3RvcCwgc2V0VG9wXSA9IFJlYWN0LnVzZVN0YXRlKDApO1xuICBjb25zdCBbd2lkdGgsIHNldFdpZHRoXSA9IFJlYWN0LnVzZVN0YXRlKDApO1xuICBjb25zdCBbaGVpZ2h0LCBzZXRIZWlnaHRdID0gUmVhY3QudXNlU3RhdGUoMCk7XG4gIGNvbnN0IFtlbmFibGVkLCBzZXRFbmFibGVkXSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3Qgd2F2ZVN0eWxlID0ge1xuICAgIGxlZnQsXG4gICAgdG9wLFxuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBib3JkZXJSYWRpdXM6IGJvcmRlclJhZGl1cy5tYXAocmFkaXVzID0+IGAke3JhZGl1c31weGApLmpvaW4oJyAnKVxuICB9O1xuICBpZiAoY29sb3IpIHtcbiAgICB3YXZlU3R5bGVbJy0td2F2ZS1jb2xvciddID0gY29sb3I7XG4gIH1cbiAgZnVuY3Rpb24gc3luY1BvcygpIHtcbiAgICBjb25zdCBub2RlU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKHRhcmdldCk7XG4gICAgLy8gR2V0IHdhdmUgY29sb3IgZnJvbSB0YXJnZXRcbiAgICBzZXRXYXZlQ29sb3IoZ2V0VGFyZ2V0V2F2ZUNvbG9yKHRhcmdldCkpO1xuICAgIGNvbnN0IGlzU3RhdGljID0gbm9kZVN0eWxlLnBvc2l0aW9uID09PSAnc3RhdGljJztcbiAgICAvLyBSZWN0XG4gICAgY29uc3Qge1xuICAgICAgYm9yZGVyTGVmdFdpZHRoLFxuICAgICAgYm9yZGVyVG9wV2lkdGhcbiAgICB9ID0gbm9kZVN0eWxlO1xuICAgIHNldExlZnQoaXNTdGF0aWMgPyB0YXJnZXQub2Zmc2V0TGVmdCA6IHZhbGlkYXRlTnVtKC1wYXJzZUZsb2F0KGJvcmRlckxlZnRXaWR0aCkpKTtcbiAgICBzZXRUb3AoaXNTdGF0aWMgPyB0YXJnZXQub2Zmc2V0VG9wIDogdmFsaWRhdGVOdW0oLXBhcnNlRmxvYXQoYm9yZGVyVG9wV2lkdGgpKSk7XG4gICAgc2V0V2lkdGgodGFyZ2V0Lm9mZnNldFdpZHRoKTtcbiAgICBzZXRIZWlnaHQodGFyZ2V0Lm9mZnNldEhlaWdodCk7XG4gICAgLy8gR2V0IGJvcmRlciByYWRpdXNcbiAgICBjb25zdCB7XG4gICAgICBib3JkZXJUb3BMZWZ0UmFkaXVzLFxuICAgICAgYm9yZGVyVG9wUmlnaHRSYWRpdXMsXG4gICAgICBib3JkZXJCb3R0b21MZWZ0UmFkaXVzLFxuICAgICAgYm9yZGVyQm90dG9tUmlnaHRSYWRpdXNcbiAgICB9ID0gbm9kZVN0eWxlO1xuICAgIHNldEJvcmRlclJhZGl1cyhbYm9yZGVyVG9wTGVmdFJhZGl1cywgYm9yZGVyVG9wUmlnaHRSYWRpdXMsIGJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzLCBib3JkZXJCb3R0b21MZWZ0UmFkaXVzXS5tYXAocmFkaXVzID0+IHZhbGlkYXRlTnVtKHBhcnNlRmxvYXQocmFkaXVzKSkpKTtcbiAgfVxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh0YXJnZXQpIHtcbiAgICAgIC8vIFdlIG5lZWQgZGVsYXkgdG8gY2hlY2sgcG9zaXRpb24gaGVyZVxuICAgICAgLy8gc2luY2UgVUkgbWF5IGNoYW5nZSBhZnRlciBjbGlja1xuICAgICAgY29uc3QgaWQgPSByYWYoKCkgPT4ge1xuICAgICAgICBzeW5jUG9zKCk7XG4gICAgICAgIHNldEVuYWJsZWQodHJ1ZSk7XG4gICAgICB9KTtcbiAgICAgIC8vIEFkZCByZXNpemUgb2JzZXJ2ZXIgdG8gZm9sbG93IHNpemVcbiAgICAgIGxldCByZXNpemVPYnNlcnZlcjtcbiAgICAgIGlmICh0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKHN5bmNQb3MpO1xuICAgICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKHRhcmdldCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICByYWYuY2FuY2VsKGlkKTtcbiAgICAgICAgcmVzaXplT2JzZXJ2ZXIgPT09IG51bGwgfHwgcmVzaXplT2JzZXJ2ZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgIH07XG4gICAgfVxuICB9LCBbXSk7XG4gIGlmICghZW5hYmxlZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IGlzU21hbGxDb21wb25lbnQgPSAoY29tcG9uZW50ID09PSAnQ2hlY2tib3gnIHx8IGNvbXBvbmVudCA9PT0gJ1JhZGlvJykgJiYgKHRhcmdldCA9PT0gbnVsbCB8fCB0YXJnZXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoVEFSR0VUX0NMUykpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ1NTTW90aW9uLCB7XG4gICAgdmlzaWJsZTogdHJ1ZSxcbiAgICBtb3Rpb25BcHBlYXI6IHRydWUsXG4gICAgbW90aW9uTmFtZTogXCJ3YXZlLW1vdGlvblwiLFxuICAgIG1vdGlvbkRlYWRsaW5lOiA1MDAwLFxuICAgIG9uQXBwZWFyRW5kOiAoXywgZXZlbnQpID0+IHtcbiAgICAgIHZhciBfYSwgX2I7XG4gICAgICBpZiAoZXZlbnQuZGVhZGxpbmUgfHwgZXZlbnQucHJvcGVydHlOYW1lID09PSAnb3BhY2l0eScpIHtcbiAgICAgICAgY29uc3QgaG9sZGVyID0gKF9hID0gZGl2UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wYXJlbnRFbGVtZW50O1xuICAgICAgICAoX2IgPSB1bm1vdW50UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKHVubW91bnRSZWYpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIGhvbGRlciA9PT0gbnVsbCB8fCBob2xkZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGhvbGRlci5yZW1vdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LCAoX3JlZiwgcmVmKSA9PiB7XG4gICAgbGV0IHtcbiAgICAgIGNsYXNzTmFtZTogbW90aW9uQ2xhc3NOYW1lXG4gICAgfSA9IF9yZWY7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIHJlZjogY29tcG9zZVJlZihkaXZSZWYsIHJlZiksXG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBtb3Rpb25DbGFzc05hbWUsIHtcbiAgICAgICAgJ3dhdmUtcXVpY2snOiBpc1NtYWxsQ29tcG9uZW50XG4gICAgICB9KSxcbiAgICAgIHN0eWxlOiB3YXZlU3R5bGVcbiAgICB9KTtcbiAgfSk7XG59O1xuY29uc3Qgc2hvd1dhdmVFZmZlY3QgPSAodGFyZ2V0LCBpbmZvKSA9PiB7XG4gIHZhciBfYTtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudFxuICB9ID0gaW5mbztcbiAgLy8gU2tpcCBmb3IgdW5jaGVja2VkIGNoZWNrYm94XG4gIGlmIChjb21wb25lbnQgPT09ICdDaGVja2JveCcgJiYgISgoX2EgPSB0YXJnZXQucXVlcnlTZWxlY3RvcignaW5wdXQnKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNoZWNrZWQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIENyZWF0ZSBob2xkZXJcbiAgY29uc3QgaG9sZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGhvbGRlci5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gIGhvbGRlci5zdHlsZS5sZWZ0ID0gJzBweCc7XG4gIGhvbGRlci5zdHlsZS50b3AgPSAnMHB4JztcbiAgdGFyZ2V0ID09PSBudWxsIHx8IHRhcmdldCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGFyZ2V0Lmluc2VydEJlZm9yZShob2xkZXIsIHRhcmdldCA9PT0gbnVsbCB8fCB0YXJnZXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRhcmdldC5maXJzdENoaWxkKTtcbiAgY29uc3QgcmVhY3RSZW5kZXIgPSB1bnN0YWJsZVNldFJlbmRlcigpO1xuICBsZXQgdW5tb3VudENhbGxiYWNrID0gbnVsbDtcbiAgZnVuY3Rpb24gcmVnaXN0ZXJVbm1vdW50KCkge1xuICAgIHJldHVybiB1bm1vdW50Q2FsbGJhY2s7XG4gIH1cbiAgdW5tb3VudENhbGxiYWNrID0gcmVhY3RSZW5kZXIoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoV2F2ZUVmZmVjdCwgT2JqZWN0LmFzc2lnbih7fSwgaW5mbywge1xuICAgIHRhcmdldDogdGFyZ2V0LFxuICAgIHJlZ2lzdGVyVW5tb3VudDogcmVnaXN0ZXJVbm1vdW50XG4gIH0pKSwgaG9sZGVyKTtcbn07XG5leHBvcnQgZGVmYXVsdCBzaG93V2F2ZUVmZmVjdDsiLCAiZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRXYXZlQ29sb3IoY29sb3IpIHtcbiAgcmV0dXJuIGNvbG9yICYmIGNvbG9yICE9PSAnI2ZmZicgJiYgY29sb3IgIT09ICcjZmZmZmZmJyAmJiBjb2xvciAhPT0gJ3JnYigyNTUsIDI1NSwgMjU1KScgJiYgY29sb3IgIT09ICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDEpJyAmJiAhL3JnYmFcXCgoPzpcXGQqLCApezN9MFxcKS8udGVzdChjb2xvcikgJiZcbiAgLy8gYW55IHRyYW5zcGFyZW50IHJnYmEgY29sb3JcbiAgY29sb3IgIT09ICd0cmFuc3BhcmVudCc7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFyZ2V0V2F2ZUNvbG9yKG5vZGUpIHtcbiAgY29uc3Qge1xuICAgIGJvcmRlclRvcENvbG9yLFxuICAgIGJvcmRlckNvbG9yLFxuICAgIGJhY2tncm91bmRDb2xvclxuICB9ID0gZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTtcbiAgaWYgKGlzVmFsaWRXYXZlQ29sb3IoYm9yZGVyVG9wQ29sb3IpKSB7XG4gICAgcmV0dXJuIGJvcmRlclRvcENvbG9yO1xuICB9XG4gIGlmIChpc1ZhbGlkV2F2ZUNvbG9yKGJvcmRlckNvbG9yKSkge1xuICAgIHJldHVybiBib3JkZXJDb2xvcjtcbiAgfVxuICBpZiAoaXNWYWxpZFdhdmVDb2xvcihiYWNrZ3JvdW5kQ29sb3IpKSB7XG4gICAgcmV0dXJuIGJhY2tncm91bmRDb2xvcjtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn0iLCAiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBTaXplQ29udGV4dCBmcm9tICcuLi9TaXplQ29udGV4dCc7XG5jb25zdCB1c2VTaXplID0gY3VzdG9tU2l6ZSA9PiB7XG4gIGNvbnN0IHNpemUgPSBSZWFjdC51c2VDb250ZXh0KFNpemVDb250ZXh0KTtcbiAgY29uc3QgbWVyZ2VkU2l6ZSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICghY3VzdG9tU2l6ZSkge1xuICAgICAgcmV0dXJuIHNpemU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY3VzdG9tU2l6ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBjdXN0b21TaXplICE9PSBudWxsICYmIGN1c3RvbVNpemUgIT09IHZvaWQgMCA/IGN1c3RvbVNpemUgOiBzaXplO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGN1c3RvbVNpemUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBjdXN0b21TaXplKHNpemUpO1xuICAgIH1cbiAgICByZXR1cm4gc2l6ZTtcbiAgfSwgW2N1c3RvbVNpemUsIHNpemVdKTtcbiAgcmV0dXJuIG1lcmdlZFNpemU7XG59O1xuZXhwb3J0IGRlZmF1bHQgdXNlU2l6ZTsiLCAiXCJ1c2UgY2xpZW50XCI7XG5cbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB0b0FycmF5IGZyb20gXCJyYy11dGlsL2VzL0NoaWxkcmVuL3RvQXJyYXlcIjtcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHVzZVNpemUgZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL2hvb2tzL3VzZVNpemUnO1xuaW1wb3J0IHVzZVN0eWxlIGZyb20gJy4vc3R5bGUnO1xuZXhwb3J0IGNvbnN0IFNwYWNlQ29tcGFjdEl0ZW1Db250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQobnVsbCk7XG5leHBvcnQgY29uc3QgdXNlQ29tcGFjdEl0ZW1Db250ZXh0ID0gKHByZWZpeENscywgZGlyZWN0aW9uKSA9PiB7XG4gIGNvbnN0IGNvbXBhY3RJdGVtQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoU3BhY2VDb21wYWN0SXRlbUNvbnRleHQpO1xuICBjb25zdCBjb21wYWN0SXRlbUNsYXNzbmFtZXMgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoIWNvbXBhY3RJdGVtQ29udGV4dCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBjb21wYWN0RGlyZWN0aW9uLFxuICAgICAgaXNGaXJzdEl0ZW0sXG4gICAgICBpc0xhc3RJdGVtXG4gICAgfSA9IGNvbXBhY3RJdGVtQ29udGV4dDtcbiAgICBjb25zdCBzZXBhcmF0b3IgPSBjb21wYWN0RGlyZWN0aW9uID09PSAndmVydGljYWwnID8gJy12ZXJ0aWNhbC0nIDogJy0nO1xuICAgIHJldHVybiBjbGFzc05hbWVzKGAke3ByZWZpeENsc30tY29tcGFjdCR7c2VwYXJhdG9yfWl0ZW1gLCB7XG4gICAgICBbYCR7cHJlZml4Q2xzfS1jb21wYWN0JHtzZXBhcmF0b3J9Zmlyc3QtaXRlbWBdOiBpc0ZpcnN0SXRlbSxcbiAgICAgIFtgJHtwcmVmaXhDbHN9LWNvbXBhY3Qke3NlcGFyYXRvcn1sYXN0LWl0ZW1gXTogaXNMYXN0SXRlbSxcbiAgICAgIFtgJHtwcmVmaXhDbHN9LWNvbXBhY3Qke3NlcGFyYXRvcn1pdGVtLXJ0bGBdOiBkaXJlY3Rpb24gPT09ICdydGwnXG4gICAgfSk7XG4gIH0sIFtwcmVmaXhDbHMsIGRpcmVjdGlvbiwgY29tcGFjdEl0ZW1Db250ZXh0XSk7XG4gIHJldHVybiB7XG4gICAgY29tcGFjdFNpemU6IGNvbXBhY3RJdGVtQ29udGV4dCA9PT0gbnVsbCB8fCBjb21wYWN0SXRlbUNvbnRleHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbXBhY3RJdGVtQ29udGV4dC5jb21wYWN0U2l6ZSxcbiAgICBjb21wYWN0RGlyZWN0aW9uOiBjb21wYWN0SXRlbUNvbnRleHQgPT09IG51bGwgfHwgY29tcGFjdEl0ZW1Db250ZXh0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb21wYWN0SXRlbUNvbnRleHQuY29tcGFjdERpcmVjdGlvbixcbiAgICBjb21wYWN0SXRlbUNsYXNzbmFtZXNcbiAgfTtcbn07XG5leHBvcnQgY29uc3QgTm9Db21wYWN0U3R5bGUgPSBwcm9wcyA9PiB7XG4gIGNvbnN0IHtcbiAgICBjaGlsZHJlblxuICB9ID0gcHJvcHM7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTcGFjZUNvbXBhY3RJdGVtQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBudWxsXG4gIH0sIGNoaWxkcmVuKTtcbn07XG5jb25zdCBDb21wYWN0SXRlbSA9IHByb3BzID0+IHtcbiAgY29uc3Qge1xuICAgICAgY2hpbGRyZW5cbiAgICB9ID0gcHJvcHMsXG4gICAgb3RoZXJzID0gX19yZXN0KHByb3BzLCBbXCJjaGlsZHJlblwiXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTcGFjZUNvbXBhY3RJdGVtQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBSZWFjdC51c2VNZW1vKCgpID0+IG90aGVycywgW290aGVyc10pXG4gIH0sIGNoaWxkcmVuKTtcbn07XG5jb25zdCBDb21wYWN0ID0gcHJvcHMgPT4ge1xuICBjb25zdCB7XG4gICAgZ2V0UHJlZml4Q2xzLFxuICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uQ29uZmlnXG4gIH0gPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpO1xuICBjb25zdCB7XG4gICAgICBzaXplLFxuICAgICAgZGlyZWN0aW9uLFxuICAgICAgYmxvY2ssXG4gICAgICBwcmVmaXhDbHM6IGN1c3RvbWl6ZVByZWZpeENscyxcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIHJvb3RDbGFzc05hbWUsXG4gICAgICBjaGlsZHJlblxuICAgIH0gPSBwcm9wcyxcbiAgICByZXN0UHJvcHMgPSBfX3Jlc3QocHJvcHMsIFtcInNpemVcIiwgXCJkaXJlY3Rpb25cIiwgXCJibG9ja1wiLCBcInByZWZpeENsc1wiLCBcImNsYXNzTmFtZVwiLCBcInJvb3RDbGFzc05hbWVcIiwgXCJjaGlsZHJlblwiXSk7XG4gIGNvbnN0IG1lcmdlZFNpemUgPSB1c2VTaXplKGN0eCA9PiBzaXplICE9PSBudWxsICYmIHNpemUgIT09IHZvaWQgMCA/IHNpemUgOiBjdHgpO1xuICBjb25zdCBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ3NwYWNlLWNvbXBhY3QnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICBjb25zdCBbd3JhcENTU1ZhciwgaGFzaElkXSA9IHVzZVN0eWxlKHByZWZpeENscyk7XG4gIGNvbnN0IGNseCA9IGNsYXNzTmFtZXMocHJlZml4Q2xzLCBoYXNoSWQsIHtcbiAgICBbYCR7cHJlZml4Q2xzfS1ydGxgXTogZGlyZWN0aW9uQ29uZmlnID09PSAncnRsJyxcbiAgICBbYCR7cHJlZml4Q2xzfS1ibG9ja2BdOiBibG9jayxcbiAgICBbYCR7cHJlZml4Q2xzfS12ZXJ0aWNhbGBdOiBkaXJlY3Rpb24gPT09ICd2ZXJ0aWNhbCdcbiAgfSwgY2xhc3NOYW1lLCByb290Q2xhc3NOYW1lKTtcbiAgY29uc3QgY29tcGFjdEl0ZW1Db250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChTcGFjZUNvbXBhY3RJdGVtQ29udGV4dCk7XG4gIGNvbnN0IGNoaWxkTm9kZXMgPSB0b0FycmF5KGNoaWxkcmVuKTtcbiAgY29uc3Qgbm9kZXMgPSBSZWFjdC51c2VNZW1vKCgpID0+IGNoaWxkTm9kZXMubWFwKChjaGlsZCwgaSkgPT4ge1xuICAgIGNvbnN0IGtleSA9IChjaGlsZCA9PT0gbnVsbCB8fCBjaGlsZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2hpbGQua2V5KSB8fCBgJHtwcmVmaXhDbHN9LWl0ZW0tJHtpfWA7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbXBhY3RJdGVtLCB7XG4gICAgICBrZXk6IGtleSxcbiAgICAgIGNvbXBhY3RTaXplOiBtZXJnZWRTaXplLFxuICAgICAgY29tcGFjdERpcmVjdGlvbjogZGlyZWN0aW9uLFxuICAgICAgaXNGaXJzdEl0ZW06IGkgPT09IDAgJiYgKCFjb21wYWN0SXRlbUNvbnRleHQgfHwgKGNvbXBhY3RJdGVtQ29udGV4dCA9PT0gbnVsbCB8fCBjb21wYWN0SXRlbUNvbnRleHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbXBhY3RJdGVtQ29udGV4dC5pc0ZpcnN0SXRlbSkpLFxuICAgICAgaXNMYXN0SXRlbTogaSA9PT0gY2hpbGROb2Rlcy5sZW5ndGggLSAxICYmICghY29tcGFjdEl0ZW1Db250ZXh0IHx8IChjb21wYWN0SXRlbUNvbnRleHQgPT09IG51bGwgfHwgY29tcGFjdEl0ZW1Db250ZXh0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb21wYWN0SXRlbUNvbnRleHQuaXNMYXN0SXRlbSkpXG4gICAgfSwgY2hpbGQpO1xuICB9KSwgW3NpemUsIGNoaWxkTm9kZXMsIGNvbXBhY3RJdGVtQ29udGV4dF0pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBpZiAoY2hpbGROb2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gd3JhcENTU1ZhcigvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBPYmplY3QuYXNzaWduKHtcbiAgICBjbGFzc05hbWU6IGNseFxuICB9LCByZXN0UHJvcHMpLCBub2RlcykpO1xufTtcbmV4cG9ydCBkZWZhdWx0IENvbXBhY3Q7IiwgIlwidXNlIGNsaWVudFwiO1xuXG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyBkZXZVc2VXYXJuaW5nIH0gZnJvbSAnLi4vX3V0aWwvd2FybmluZyc7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCB7IHVzZVRva2VuIH0gZnJvbSAnLi4vdGhlbWUvaW50ZXJuYWwnO1xuZXhwb3J0IGNvbnN0IEdyb3VwU2l6ZUNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh1bmRlZmluZWQpO1xuY29uc3QgQnV0dG9uR3JvdXAgPSBwcm9wcyA9PiB7XG4gIGNvbnN0IHtcbiAgICBnZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uXG4gIH0gPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpO1xuICBjb25zdCB7XG4gICAgICBwcmVmaXhDbHM6IGN1c3RvbWl6ZVByZWZpeENscyxcbiAgICAgIHNpemUsXG4gICAgICBjbGFzc05hbWVcbiAgICB9ID0gcHJvcHMsXG4gICAgb3RoZXJzID0gX19yZXN0KHByb3BzLCBbXCJwcmVmaXhDbHNcIiwgXCJzaXplXCIsIFwiY2xhc3NOYW1lXCJdKTtcbiAgY29uc3QgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdidG4tZ3JvdXAnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICBjb25zdCBbLCwgaGFzaElkXSA9IHVzZVRva2VuKCk7XG4gIGNvbnN0IHNpemVDbHMgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBzd2l0Y2ggKHNpemUpIHtcbiAgICAgIGNhc2UgJ2xhcmdlJzpcbiAgICAgICAgcmV0dXJuICdsZyc7XG4gICAgICBjYXNlICdzbWFsbCc6XG4gICAgICAgIHJldHVybiAnc20nO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfSwgW3NpemVdKTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBjb25zdCB3YXJuaW5nID0gZGV2VXNlV2FybmluZygnQnV0dG9uLkdyb3VwJyk7XG4gICAgd2FybmluZy5kZXByZWNhdGVkKGZhbHNlLCAnQnV0dG9uLkdyb3VwJywgJ1NwYWNlLkNvbXBhY3QnKTtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCFzaXplIHx8IFsnbGFyZ2UnLCAnc21hbGwnLCAnbWlkZGxlJ10uaW5jbHVkZXMoc2l6ZSksICd1c2FnZScsICdJbnZhbGlkIHByb3AgYHNpemVgLicpIDogdm9pZCAwO1xuICB9XG4gIGNvbnN0IGNsYXNzZXMgPSBjbGFzc05hbWVzKHByZWZpeENscywge1xuICAgIFtgJHtwcmVmaXhDbHN9LSR7c2l6ZUNsc31gXTogc2l6ZUNscyxcbiAgICBbYCR7cHJlZml4Q2xzfS1ydGxgXTogZGlyZWN0aW9uID09PSAncnRsJ1xuICB9LCBjbGFzc05hbWUsIGhhc2hJZCk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChHcm91cFNpemVDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IHNpemVcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgT2JqZWN0LmFzc2lnbih7fSwgb3RoZXJzLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gIH0pKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgQnV0dG9uR3JvdXA7IiwgIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNsb25lRWxlbWVudCwgaXNGcmFnbWVudCB9IGZyb20gJy4uL191dGlsL3JlYWN0Tm9kZSc7XG5pbXBvcnQgeyBQcmVzZXRDb2xvcnMgfSBmcm9tICcuLi90aGVtZS9pbnRlcmZhY2UnO1xuY29uc3QgcnhUd29DTkNoYXIgPSAvXltcXHU0RTAwLVxcdTlGQTVdezJ9JC87XG5leHBvcnQgY29uc3QgaXNUd29DTkNoYXIgPSByeFR3b0NOQ2hhci50ZXN0LmJpbmQocnhUd29DTkNoYXIpO1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRMZWdhY3lQcm9wcyh0eXBlKSB7XG4gIGlmICh0eXBlID09PSAnZGFuZ2VyJykge1xuICAgIHJldHVybiB7XG4gICAgICBkYW5nZXI6IHRydWVcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgdHlwZVxuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nKHN0cikge1xuICByZXR1cm4gdHlwZW9mIHN0ciA9PT0gJ3N0cmluZyc7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNVbkJvcmRlcmVkQnV0dG9uVmFyaWFudCh0eXBlKSB7XG4gIHJldHVybiB0eXBlID09PSAndGV4dCcgfHwgdHlwZSA9PT0gJ2xpbmsnO1xufVxuZnVuY3Rpb24gc3BsaXRDTkNoYXJzQnlTcGFjZShjaGlsZCwgbmVlZEluc2VydGVkKSB7XG4gIGlmIChjaGlsZCA9PT0gbnVsbCB8fCBjaGlsZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IFNQQUNFID0gbmVlZEluc2VydGVkID8gJyAnIDogJyc7XG4gIGlmICh0eXBlb2YgY2hpbGQgIT09ICdzdHJpbmcnICYmIHR5cGVvZiBjaGlsZCAhPT0gJ251bWJlcicgJiYgaXNTdHJpbmcoY2hpbGQudHlwZSkgJiYgaXNUd29DTkNoYXIoY2hpbGQucHJvcHMuY2hpbGRyZW4pKSB7XG4gICAgcmV0dXJuIGNsb25lRWxlbWVudChjaGlsZCwge1xuICAgICAgY2hpbGRyZW46IGNoaWxkLnByb3BzLmNoaWxkcmVuLnNwbGl0KCcnKS5qb2luKFNQQUNFKVxuICAgIH0pO1xuICB9XG4gIGlmIChpc1N0cmluZyhjaGlsZCkpIHtcbiAgICByZXR1cm4gaXNUd29DTkNoYXIoY2hpbGQpID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIGNoaWxkLnNwbGl0KCcnKS5qb2luKFNQQUNFKSkgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgY2hpbGQpO1xuICB9XG4gIGlmIChpc0ZyYWdtZW50KGNoaWxkKSkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgY2hpbGQpO1xuICB9XG4gIHJldHVybiBjaGlsZDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzcGFjZUNoaWxkcmVuKGNoaWxkcmVuLCBuZWVkSW5zZXJ0ZWQpIHtcbiAgbGV0IGlzUHJldkNoaWxkUHVyZSA9IGZhbHNlO1xuICBjb25zdCBjaGlsZExpc3QgPSBbXTtcbiAgUmVhY3QuQ2hpbGRyZW4uZm9yRWFjaChjaGlsZHJlbiwgY2hpbGQgPT4ge1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgY2hpbGQ7XG4gICAgY29uc3QgaXNDdXJyZW50Q2hpbGRQdXJlID0gdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZSA9PT0gJ251bWJlcic7XG4gICAgaWYgKGlzUHJldkNoaWxkUHVyZSAmJiBpc0N1cnJlbnRDaGlsZFB1cmUpIHtcbiAgICAgIGNvbnN0IGxhc3RJbmRleCA9IGNoaWxkTGlzdC5sZW5ndGggLSAxO1xuICAgICAgY29uc3QgbGFzdENoaWxkID0gY2hpbGRMaXN0W2xhc3RJbmRleF07XG4gICAgICBjaGlsZExpc3RbbGFzdEluZGV4XSA9IGAke2xhc3RDaGlsZH0ke2NoaWxkfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoaWxkTGlzdC5wdXNoKGNoaWxkKTtcbiAgICB9XG4gICAgaXNQcmV2Q2hpbGRQdXJlID0gaXNDdXJyZW50Q2hpbGRQdXJlO1xuICB9KTtcbiAgcmV0dXJuIFJlYWN0LkNoaWxkcmVuLm1hcChjaGlsZExpc3QsIGNoaWxkID0+IHNwbGl0Q05DaGFyc0J5U3BhY2UoY2hpbGQsIG5lZWRJbnNlcnRlZCkpO1xufVxuY29uc3QgX0J1dHRvblR5cGVzID0gWydkZWZhdWx0JywgJ3ByaW1hcnknLCAnZGFzaGVkJywgJ2xpbmsnLCAndGV4dCddO1xuY29uc3QgX0J1dHRvblNoYXBlcyA9IFsnZGVmYXVsdCcsICdjaXJjbGUnLCAncm91bmQnXTtcbmNvbnN0IF9CdXR0b25IVE1MVHlwZXMgPSBbJ3N1Ym1pdCcsICdidXR0b24nLCAncmVzZXQnXTtcbmV4cG9ydCBjb25zdCBfQnV0dG9uVmFyaWFudFR5cGVzID0gWydvdXRsaW5lZCcsICdkYXNoZWQnLCAnc29saWQnLCAnZmlsbGVkJywgJ3RleHQnLCAnbGluayddO1xuZXhwb3J0IGNvbnN0IF9CdXR0b25Db2xvclR5cGVzID0gWydkZWZhdWx0JywgJ3ByaW1hcnknLCAnZGFuZ2VyJ10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShQcmVzZXRDb2xvcnMpKTsiLCAiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCBSZWFjdCwgeyBmb3J3YXJkUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IExvYWRpbmdPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvTG9hZGluZ091dGxpbmVkXCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBDU1NNb3Rpb24gZnJvbSAncmMtbW90aW9uJztcbmltcG9ydCBJY29uV3JhcHBlciBmcm9tICcuL0ljb25XcmFwcGVyJztcbmNvbnN0IElubmVyTG9hZGluZ0ljb24gPSAvKiNfX1BVUkVfXyovZm9yd2FyZFJlZigocHJvcHMsIHJlZikgPT4ge1xuICBjb25zdCB7XG4gICAgcHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZSxcbiAgICBzdHlsZSxcbiAgICBpY29uQ2xhc3NOYW1lXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgbWVyZ2VkSWNvbkNscyA9IGNsYXNzTmFtZXMoYCR7cHJlZml4Q2xzfS1sb2FkaW5nLWljb25gLCBjbGFzc05hbWUpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSWNvbldyYXBwZXIsIHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBjbGFzc05hbWU6IG1lcmdlZEljb25DbHMsXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIHJlZjogcmVmXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExvYWRpbmdPdXRsaW5lZCwge1xuICAgIGNsYXNzTmFtZTogaWNvbkNsYXNzTmFtZVxuICB9KSk7XG59KTtcbmNvbnN0IGdldENvbGxhcHNlZFdpZHRoID0gKCkgPT4gKHtcbiAgd2lkdGg6IDAsXG4gIG9wYWNpdHk6IDAsXG4gIHRyYW5zZm9ybTogJ3NjYWxlKDApJ1xufSk7XG5jb25zdCBnZXRSZWFsV2lkdGggPSBub2RlID0+ICh7XG4gIHdpZHRoOiBub2RlLnNjcm9sbFdpZHRoLFxuICBvcGFjaXR5OiAxLFxuICB0cmFuc2Zvcm06ICdzY2FsZSgxKSdcbn0pO1xuY29uc3QgRGVmYXVsdExvYWRpbmdJY29uID0gcHJvcHMgPT4ge1xuICBjb25zdCB7XG4gICAgcHJlZml4Q2xzLFxuICAgIGxvYWRpbmcsXG4gICAgZXhpc3RJY29uLFxuICAgIGNsYXNzTmFtZSxcbiAgICBzdHlsZSxcbiAgICBtb3VudFxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IHZpc2libGUgPSAhIWxvYWRpbmc7XG4gIGlmIChleGlzdEljb24pIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSW5uZXJMb2FkaW5nSWNvbiwge1xuICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICAgIHN0eWxlOiBzdHlsZVxuICAgIH0pO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDU1NNb3Rpb24sIHtcbiAgICB2aXNpYmxlOiB2aXNpYmxlLFxuICAgIC8vIFVzZWQgZm9yIG1pbnVzIGZsZXggZ2FwIHN0eWxlIG9ubHlcbiAgICBtb3Rpb25OYW1lOiBgJHtwcmVmaXhDbHN9LWxvYWRpbmctaWNvbi1tb3Rpb25gLFxuICAgIG1vdGlvbkFwcGVhcjogIW1vdW50LFxuICAgIG1vdGlvbkVudGVyOiAhbW91bnQsXG4gICAgbW90aW9uTGVhdmU6ICFtb3VudCxcbiAgICByZW1vdmVPbkxlYXZlOiB0cnVlLFxuICAgIG9uQXBwZWFyU3RhcnQ6IGdldENvbGxhcHNlZFdpZHRoLFxuICAgIG9uQXBwZWFyQWN0aXZlOiBnZXRSZWFsV2lkdGgsXG4gICAgb25FbnRlclN0YXJ0OiBnZXRDb2xsYXBzZWRXaWR0aCxcbiAgICBvbkVudGVyQWN0aXZlOiBnZXRSZWFsV2lkdGgsXG4gICAgb25MZWF2ZVN0YXJ0OiBnZXRSZWFsV2lkdGgsXG4gICAgb25MZWF2ZUFjdGl2ZTogZ2V0Q29sbGFwc2VkV2lkdGhcbiAgfSwgKF9yZWYsIHJlZikgPT4ge1xuICAgIGxldCB7XG4gICAgICBjbGFzc05hbWU6IG1vdGlvbkNscyxcbiAgICAgIHN0eWxlOiBtb3Rpb25TdHlsZVxuICAgIH0gPSBfcmVmO1xuICAgIGNvbnN0IG1lcmdlZFN0eWxlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdHlsZSksIG1vdGlvblN0eWxlKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSW5uZXJMb2FkaW5nSWNvbiwge1xuICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBtb3Rpb25DbHMpLFxuICAgICAgc3R5bGU6IG1lcmdlZFN0eWxlLFxuICAgICAgcmVmOiByZWZcbiAgICB9KTtcbiAgfSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgRGVmYXVsdExvYWRpbmdJY29uOyIsICJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0IFJlYWN0LCB7IGZvcndhcmRSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmNvbnN0IEljb25XcmFwcGVyID0gLyojX19QVVJFX18qL2ZvcndhcmRSZWYoKHByb3BzLCByZWYpID0+IHtcbiAgY29uc3Qge1xuICAgIGNsYXNzTmFtZSxcbiAgICBzdHlsZSxcbiAgICBjaGlsZHJlbixcbiAgICBwcmVmaXhDbHNcbiAgfSA9IHByb3BzO1xuICBjb25zdCBpY29uV3JhcHBlckNscyA9IGNsYXNzTmFtZXMoYCR7cHJlZml4Q2xzfS1pY29uYCwgY2xhc3NOYW1lKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgcmVmOiByZWYsXG4gICAgY2xhc3NOYW1lOiBpY29uV3JhcHBlckNscyxcbiAgICBzdHlsZTogc3R5bGVcbiAgfSwgY2hpbGRyZW4pO1xufSk7XG5leHBvcnQgZGVmYXVsdCBJY29uV3JhcHBlcjsiLCAiY29uc3QgZ2VuQnV0dG9uQm9yZGVyU3R5bGUgPSAoYnV0dG9uVHlwZUNscywgYm9yZGVyQ29sb3IpID0+ICh7XG4gIC8vIEJvcmRlclxuICBbYD4gc3BhbiwgPiAke2J1dHRvblR5cGVDbHN9YF06IHtcbiAgICAnJjpub3QoOmxhc3QtY2hpbGQpJzoge1xuICAgICAgW2AmLCAmID4gJHtidXR0b25UeXBlQ2xzfWBdOiB7XG4gICAgICAgICcmOm5vdCg6ZGlzYWJsZWQpJzoge1xuICAgICAgICAgIGJvcmRlcklubGluZUVuZENvbG9yOiBib3JkZXJDb2xvclxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICAnJjpub3QoOmZpcnN0LWNoaWxkKSc6IHtcbiAgICAgIFtgJiwgJiA+ICR7YnV0dG9uVHlwZUNsc31gXToge1xuICAgICAgICAnJjpub3QoOmRpc2FibGVkKSc6IHtcbiAgICAgICAgICBib3JkZXJJbmxpbmVTdGFydENvbG9yOiBib3JkZXJDb2xvclxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59KTtcbmNvbnN0IGdlbkdyb3VwU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHMsXG4gICAgZm9udFNpemUsXG4gICAgbGluZVdpZHRoLFxuICAgIGdyb3VwQm9yZGVyQ29sb3IsXG4gICAgY29sb3JFcnJvckhvdmVyXG4gIH0gPSB0b2tlbjtcbiAgcmV0dXJuIHtcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS1ncm91cGBdOiBbe1xuICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICBkaXNwbGF5OiAnaW5saW5lLWZsZXgnLFxuICAgICAgLy8gQm9yZGVyXG4gICAgICBbYD4gc3BhbiwgPiAke2NvbXBvbmVudENsc31gXToge1xuICAgICAgICAnJjpub3QoOmxhc3QtY2hpbGQpJzoge1xuICAgICAgICAgIFtgJiwgJiA+ICR7Y29tcG9uZW50Q2xzfWBdOiB7XG4gICAgICAgICAgICBib3JkZXJTdGFydEVuZFJhZGl1czogMCxcbiAgICAgICAgICAgIGJvcmRlckVuZEVuZFJhZGl1czogMFxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgJyY6bm90KDpmaXJzdC1jaGlsZCknOiB7XG4gICAgICAgICAgbWFyZ2luSW5saW5lU3RhcnQ6IHRva2VuLmNhbGMobGluZVdpZHRoKS5tdWwoLTEpLmVxdWFsKCksXG4gICAgICAgICAgW2AmLCAmID4gJHtjb21wb25lbnRDbHN9YF06IHtcbiAgICAgICAgICAgIGJvcmRlclN0YXJ0U3RhcnRSYWRpdXM6IDAsXG4gICAgICAgICAgICBib3JkZXJFbmRTdGFydFJhZGl1czogMFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtjb21wb25lbnRDbHNdOiB7XG4gICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgICB6SW5kZXg6IDEsXG4gICAgICAgICcmOmhvdmVyLCAmOmZvY3VzLCAmOmFjdGl2ZSc6IHtcbiAgICAgICAgICB6SW5kZXg6IDJcbiAgICAgICAgfSxcbiAgICAgICAgJyZbZGlzYWJsZWRdJzoge1xuICAgICAgICAgIHpJbmRleDogMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30taWNvbi1vbmx5YF06IHtcbiAgICAgICAgZm9udFNpemVcbiAgICAgIH1cbiAgICB9LFxuICAgIC8vIEJvcmRlciBDb2xvclxuICAgIGdlbkJ1dHRvbkJvcmRlclN0eWxlKGAke2NvbXBvbmVudENsc30tcHJpbWFyeWAsIGdyb3VwQm9yZGVyQ29sb3IpLCBnZW5CdXR0b25Cb3JkZXJTdHlsZShgJHtjb21wb25lbnRDbHN9LWRhbmdlcmAsIGNvbG9yRXJyb3JIb3ZlcildXG4gIH07XG59O1xuZXhwb3J0IGRlZmF1bHQgZ2VuR3JvdXBTdHlsZTsiLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgUmVhY3QsIHsgZm9yd2FyZFJlZiwgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbG9yUGlja2VyUHJlZml4Q2xzLCBkZWZhdWx0Q29sb3IgfSBmcm9tIFwiLi91dGlsXCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IENvbG9yIH0gZnJvbSBcIi4vY29sb3JcIjtcbmltcG9ydCBDb2xvckJsb2NrIGZyb20gXCIuL2NvbXBvbmVudHMvQ29sb3JCbG9ja1wiO1xuaW1wb3J0IFBpY2tlciBmcm9tIFwiLi9jb21wb25lbnRzL1BpY2tlclwiO1xuaW1wb3J0IHVzZUNvbG9yU3RhdGUgZnJvbSBcIi4vaG9va3MvdXNlQ29sb3JTdGF0ZVwiO1xuaW1wb3J0IHVzZUNvbXBvbmVudCBmcm9tIFwiLi9ob29rcy91c2VDb21wb25lbnRcIjtcbnZhciBIVUVfQ09MT1JTID0gW3tcbiAgY29sb3I6ICdyZ2IoMjU1LCAwLCAwKScsXG4gIHBlcmNlbnQ6IDBcbn0sIHtcbiAgY29sb3I6ICdyZ2IoMjU1LCAyNTUsIDApJyxcbiAgcGVyY2VudDogMTdcbn0sIHtcbiAgY29sb3I6ICdyZ2IoMCwgMjU1LCAwKScsXG4gIHBlcmNlbnQ6IDMzXG59LCB7XG4gIGNvbG9yOiAncmdiKDAsIDI1NSwgMjU1KScsXG4gIHBlcmNlbnQ6IDUwXG59LCB7XG4gIGNvbG9yOiAncmdiKDAsIDAsIDI1NSknLFxuICBwZXJjZW50OiA2N1xufSwge1xuICBjb2xvcjogJ3JnYigyNTUsIDAsIDI1NSknLFxuICBwZXJjZW50OiA4M1xufSwge1xuICBjb2xvcjogJ3JnYigyNTUsIDAsIDApJyxcbiAgcGVyY2VudDogMTAwXG59XTtcbnZhciBDb2xvclBpY2tlciA9IC8qI19fUFVSRV9fKi9mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciB2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgIGRlZmF1bHRWYWx1ZSA9IHByb3BzLmRlZmF1bHRWYWx1ZSxcbiAgICBfcHJvcHMkcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIHByZWZpeENscyA9IF9wcm9wcyRwcmVmaXhDbHMgPT09IHZvaWQgMCA/IENvbG9yUGlja2VyUHJlZml4Q2xzIDogX3Byb3BzJHByZWZpeENscyxcbiAgICBvbkNoYW5nZSA9IHByb3BzLm9uQ2hhbmdlLFxuICAgIG9uQ2hhbmdlQ29tcGxldGUgPSBwcm9wcy5vbkNoYW5nZUNvbXBsZXRlLFxuICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgIHBhbmVsUmVuZGVyID0gcHJvcHMucGFuZWxSZW5kZXIsXG4gICAgX3Byb3BzJGRpc2FibGVkQWxwaGEgPSBwcm9wcy5kaXNhYmxlZEFscGhhLFxuICAgIGRpc2FibGVkQWxwaGEgPSBfcHJvcHMkZGlzYWJsZWRBbHBoYSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkZGlzYWJsZWRBbHBoYSxcbiAgICBfcHJvcHMkZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICBkaXNhYmxlZCA9IF9wcm9wcyRkaXNhYmxlZCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkZGlzYWJsZWQsXG4gICAgY29tcG9uZW50cyA9IHByb3BzLmNvbXBvbmVudHM7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gQ29tcG9uZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX3VzZUNvbXBvbmVudCA9IHVzZUNvbXBvbmVudChjb21wb25lbnRzKSxcbiAgICBfdXNlQ29tcG9uZW50MiA9IF9zbGljZWRUb0FycmF5KF91c2VDb21wb25lbnQsIDEpLFxuICAgIFNsaWRlciA9IF91c2VDb21wb25lbnQyWzBdO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQ29sb3IgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF91c2VDb2xvclN0YXRlID0gdXNlQ29sb3JTdGF0ZShkZWZhdWx0VmFsdWUgfHwgZGVmYXVsdENvbG9yLCB2YWx1ZSksXG4gICAgX3VzZUNvbG9yU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZUNvbG9yU3RhdGUsIDIpLFxuICAgIGNvbG9yVmFsdWUgPSBfdXNlQ29sb3JTdGF0ZTJbMF0sXG4gICAgc2V0Q29sb3JWYWx1ZSA9IF91c2VDb2xvclN0YXRlMlsxXTtcbiAgdmFyIGFscGhhQ29sb3IgPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gY29sb3JWYWx1ZS5zZXRBKDEpLnRvUmdiU3RyaW5nKCk7XG4gIH0sIFtjb2xvclZhbHVlXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFdmVudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgaGFuZGxlQ2hhbmdlID0gZnVuY3Rpb24gaGFuZGxlQ2hhbmdlKGRhdGEsIHR5cGUpIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICBzZXRDb2xvclZhbHVlKGRhdGEpO1xuICAgIH1cbiAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwIHx8IG9uQ2hhbmdlKGRhdGEsIHR5cGUpO1xuICB9O1xuXG4gIC8vIENvbnZlcnRcbiAgdmFyIGdldEh1ZUNvbG9yID0gZnVuY3Rpb24gZ2V0SHVlQ29sb3IoaHVlKSB7XG4gICAgcmV0dXJuIG5ldyBDb2xvcihjb2xvclZhbHVlLnNldEh1ZShodWUpKTtcbiAgfTtcbiAgdmFyIGdldEFscGhhQ29sb3IgPSBmdW5jdGlvbiBnZXRBbHBoYUNvbG9yKGFscGhhKSB7XG4gICAgcmV0dXJuIG5ldyBDb2xvcihjb2xvclZhbHVlLnNldEEoYWxwaGEgLyAxMDApKTtcbiAgfTtcblxuICAvLyBTbGlkZXIgY2hhbmdlXG4gIHZhciBvbkh1ZUNoYW5nZSA9IGZ1bmN0aW9uIG9uSHVlQ2hhbmdlKGh1ZSkge1xuICAgIGhhbmRsZUNoYW5nZShnZXRIdWVDb2xvcihodWUpLCB7XG4gICAgICB0eXBlOiAnaHVlJyxcbiAgICAgIHZhbHVlOiBodWVcbiAgICB9KTtcbiAgfTtcbiAgdmFyIG9uQWxwaGFDaGFuZ2UgPSBmdW5jdGlvbiBvbkFscGhhQ2hhbmdlKGFscGhhKSB7XG4gICAgaGFuZGxlQ2hhbmdlKGdldEFscGhhQ29sb3IoYWxwaGEpLCB7XG4gICAgICB0eXBlOiAnYWxwaGEnLFxuICAgICAgdmFsdWU6IGFscGhhXG4gICAgfSk7XG4gIH07XG5cbiAgLy8gQ29tcGxldGVcbiAgdmFyIG9uSHVlQ2hhbmdlQ29tcGxldGUgPSBmdW5jdGlvbiBvbkh1ZUNoYW5nZUNvbXBsZXRlKGh1ZSkge1xuICAgIGlmIChvbkNoYW5nZUNvbXBsZXRlKSB7XG4gICAgICBvbkNoYW5nZUNvbXBsZXRlKGdldEh1ZUNvbG9yKGh1ZSkpO1xuICAgIH1cbiAgfTtcbiAgdmFyIG9uQWxwaGFDaGFuZ2VDb21wbGV0ZSA9IGZ1bmN0aW9uIG9uQWxwaGFDaGFuZ2VDb21wbGV0ZShhbHBoYSkge1xuICAgIGlmIChvbkNoYW5nZUNvbXBsZXRlKSB7XG4gICAgICBvbkNoYW5nZUNvbXBsZXRlKGdldEFscGhhQ29sb3IoYWxwaGEpKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgbWVyZ2VDbHMgPSBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcGFuZWxcIiksIGNsYXNzTmFtZSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXBhbmVsLWRpc2FibGVkXCIpLCBkaXNhYmxlZCkpO1xuICB2YXIgc2hhcmVkU2xpZGVyUHJvcHMgPSB7XG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgIGNvbG9yOiBjb2xvclZhbHVlXG4gIH07XG4gIHZhciBkZWZhdWx0UGFuZWwgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUGlja2VyLCBfZXh0ZW5kcyh7XG4gICAgb25DaGFuZ2U6IGhhbmRsZUNoYW5nZVxuICB9LCBzaGFyZWRTbGlkZXJQcm9wcywge1xuICAgIG9uQ2hhbmdlQ29tcGxldGU6IG9uQ2hhbmdlQ29tcGxldGVcbiAgfSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNsaWRlci1jb250YWluZXJcIilcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNsaWRlci1ncm91cFwiKSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNsaWRlci1ncm91cC1kaXNhYmxlZC1hbHBoYVwiKSwgZGlzYWJsZWRBbHBoYSkpXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNsaWRlciwgX2V4dGVuZHMoe30sIHNoYXJlZFNsaWRlclByb3BzLCB7XG4gICAgdHlwZTogXCJodWVcIixcbiAgICBjb2xvcnM6IEhVRV9DT0xPUlMsXG4gICAgbWluOiAwLFxuICAgIG1heDogMzU5LFxuICAgIHZhbHVlOiBjb2xvclZhbHVlLmdldEh1ZSgpLFxuICAgIG9uQ2hhbmdlOiBvbkh1ZUNoYW5nZSxcbiAgICBvbkNoYW5nZUNvbXBsZXRlOiBvbkh1ZUNoYW5nZUNvbXBsZXRlXG4gIH0pKSwgIWRpc2FibGVkQWxwaGEgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU2xpZGVyLCBfZXh0ZW5kcyh7fSwgc2hhcmVkU2xpZGVyUHJvcHMsIHtcbiAgICB0eXBlOiBcImFscGhhXCIsXG4gICAgY29sb3JzOiBbe1xuICAgICAgcGVyY2VudDogMCxcbiAgICAgIGNvbG9yOiAncmdiYSgyNTUsIDAsIDQsIDApJ1xuICAgIH0sIHtcbiAgICAgIHBlcmNlbnQ6IDEwMCxcbiAgICAgIGNvbG9yOiBhbHBoYUNvbG9yXG4gICAgfV0sXG4gICAgbWluOiAwLFxuICAgIG1heDogMTAwLFxuICAgIHZhbHVlOiBjb2xvclZhbHVlLmEgKiAxMDAsXG4gICAgb25DaGFuZ2U6IG9uQWxwaGFDaGFuZ2UsXG4gICAgb25DaGFuZ2VDb21wbGV0ZTogb25BbHBoYUNoYW5nZUNvbXBsZXRlXG4gIH0pKSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbG9yQmxvY2ssIHtcbiAgICBjb2xvcjogY29sb3JWYWx1ZS50b1JnYlN0cmluZygpLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzXG4gIH0pKSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBtZXJnZUNscyxcbiAgICBzdHlsZTogc3R5bGUsXG4gICAgcmVmOiByZWZcbiAgfSwgdHlwZW9mIHBhbmVsUmVuZGVyID09PSAnZnVuY3Rpb24nID8gcGFuZWxSZW5kZXIoZGVmYXVsdFBhbmVsKSA6IGRlZmF1bHRQYW5lbCk7XG59KTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIENvbG9yUGlja2VyLmRpc3BsYXlOYW1lID0gJ0NvbG9yUGlja2VyJztcbn1cbmV4cG9ydCBkZWZhdWx0IENvbG9yUGlja2VyOyIsICJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzXCI7XG5pbXBvcnQgX2NyZWF0ZVN1cGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVTdXBlclwiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiYlwiXSxcbiAgX2V4Y2x1ZGVkMiA9IFtcInZcIl07XG5pbXBvcnQgeyBGYXN0Q29sb3IgfSBmcm9tICdAYW50LWRlc2lnbi9mYXN0LWNvbG9yJztcbmV4cG9ydCB2YXIgZ2V0Um91bmROdW1iZXIgPSBmdW5jdGlvbiBnZXRSb3VuZE51bWJlcih2YWx1ZSkge1xuICByZXR1cm4gTWF0aC5yb3VuZChOdW1iZXIodmFsdWUgfHwgMCkpO1xufTtcbnZhciBjb252ZXJ0SHNiMkhzdiA9IGZ1bmN0aW9uIGNvbnZlcnRIc2IySHN2KGNvbG9yKSB7XG4gIGlmIChjb2xvciBpbnN0YW5jZW9mIEZhc3RDb2xvcikge1xuICAgIHJldHVybiBjb2xvcjtcbiAgfVxuICBpZiAoY29sb3IgJiYgX3R5cGVvZihjb2xvcikgPT09ICdvYmplY3QnICYmICdoJyBpbiBjb2xvciAmJiAnYicgaW4gY29sb3IpIHtcbiAgICB2YXIgX3JlZiA9IGNvbG9yLFxuICAgICAgYiA9IF9yZWYuYixcbiAgICAgIHJlc2V0cyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBfZXhjbHVkZWQpO1xuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHJlc2V0cyksIHt9LCB7XG4gICAgICB2OiBiXG4gICAgfSk7XG4gIH1cbiAgaWYgKHR5cGVvZiBjb2xvciA9PT0gJ3N0cmluZycgJiYgL2hzYi8udGVzdChjb2xvcikpIHtcbiAgICByZXR1cm4gY29sb3IucmVwbGFjZSgvaHNiLywgJ2hzdicpO1xuICB9XG4gIHJldHVybiBjb2xvcjtcbn07XG5leHBvcnQgdmFyIENvbG9yID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfRmFzdENvbG9yKSB7XG4gIF9pbmhlcml0cyhDb2xvciwgX0Zhc3RDb2xvcik7XG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoQ29sb3IpO1xuICBmdW5jdGlvbiBDb2xvcihjb2xvcikge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDb2xvcik7XG4gICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIGNvbnZlcnRIc2IySHN2KGNvbG9yKSk7XG4gIH1cbiAgX2NyZWF0ZUNsYXNzKENvbG9yLCBbe1xuICAgIGtleTogXCJ0b0hzYlN0cmluZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b0hzYlN0cmluZygpIHtcbiAgICAgIHZhciBoc2IgPSB0aGlzLnRvSHNiKCk7XG4gICAgICB2YXIgc2F0dXJhdGlvbiA9IGdldFJvdW5kTnVtYmVyKGhzYi5zICogMTAwKTtcbiAgICAgIHZhciBsaWdodG5lc3MgPSBnZXRSb3VuZE51bWJlcihoc2IuYiAqIDEwMCk7XG4gICAgICB2YXIgaHVlID0gZ2V0Um91bmROdW1iZXIoaHNiLmgpO1xuICAgICAgdmFyIGFscGhhID0gaHNiLmE7XG4gICAgICB2YXIgaHNiU3RyaW5nID0gXCJoc2IoXCIuY29uY2F0KGh1ZSwgXCIsIFwiKS5jb25jYXQoc2F0dXJhdGlvbiwgXCIlLCBcIikuY29uY2F0KGxpZ2h0bmVzcywgXCIlKVwiKTtcbiAgICAgIHZhciBoc2JhU3RyaW5nID0gXCJoc2JhKFwiLmNvbmNhdChodWUsIFwiLCBcIikuY29uY2F0KHNhdHVyYXRpb24sIFwiJSwgXCIpLmNvbmNhdChsaWdodG5lc3MsIFwiJSwgXCIpLmNvbmNhdChhbHBoYS50b0ZpeGVkKGFscGhhID09PSAwID8gMCA6IDIpLCBcIilcIik7XG4gICAgICByZXR1cm4gYWxwaGEgPT09IDEgPyBoc2JTdHJpbmcgOiBoc2JhU3RyaW5nO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0b0hzYlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b0hzYigpIHtcbiAgICAgIHZhciBfdGhpcyR0b0hzdiA9IHRoaXMudG9Ic3YoKSxcbiAgICAgICAgdiA9IF90aGlzJHRvSHN2LnYsXG4gICAgICAgIHJlc2V0cyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfdGhpcyR0b0hzdiwgX2V4Y2x1ZGVkMik7XG4gICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCByZXNldHMpLCB7fSwge1xuICAgICAgICBiOiB2LFxuICAgICAgICBhOiB0aGlzLmFcbiAgICAgIH0pO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gQ29sb3I7XG59KEZhc3RDb2xvcik7IiwgImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgeyBDb2xvciB9IGZyb20gXCIuL2NvbG9yXCI7XG5leHBvcnQgdmFyIENvbG9yUGlja2VyUHJlZml4Q2xzID0gJ3JjLWNvbG9yLXBpY2tlcic7XG5leHBvcnQgdmFyIGdlbmVyYXRlQ29sb3IgPSBmdW5jdGlvbiBnZW5lcmF0ZUNvbG9yKGNvbG9yKSB7XG4gIGlmIChjb2xvciBpbnN0YW5jZW9mIENvbG9yKSB7XG4gICAgcmV0dXJuIGNvbG9yO1xuICB9XG4gIHJldHVybiBuZXcgQ29sb3IoY29sb3IpO1xufTtcbmV4cG9ydCB2YXIgZGVmYXVsdENvbG9yID0gZ2VuZXJhdGVDb2xvcignIzE2NzdmZicpO1xuZXhwb3J0IHZhciBjYWxjdWxhdGVDb2xvciA9IGZ1bmN0aW9uIGNhbGN1bGF0ZUNvbG9yKHByb3BzKSB7XG4gIHZhciBvZmZzZXQgPSBwcm9wcy5vZmZzZXQsXG4gICAgdGFyZ2V0UmVmID0gcHJvcHMudGFyZ2V0UmVmLFxuICAgIGNvbnRhaW5lclJlZiA9IHByb3BzLmNvbnRhaW5lclJlZixcbiAgICBjb2xvciA9IHByb3BzLmNvbG9yLFxuICAgIHR5cGUgPSBwcm9wcy50eXBlO1xuICB2YXIgX2NvbnRhaW5lclJlZiRjdXJyZW50ID0gY29udGFpbmVyUmVmLmN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgd2lkdGggPSBfY29udGFpbmVyUmVmJGN1cnJlbnQud2lkdGgsXG4gICAgaGVpZ2h0ID0gX2NvbnRhaW5lclJlZiRjdXJyZW50LmhlaWdodDtcbiAgdmFyIF90YXJnZXRSZWYkY3VycmVudCRnZSA9IHRhcmdldFJlZi5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgIHRhcmdldFdpZHRoID0gX3RhcmdldFJlZiRjdXJyZW50JGdlLndpZHRoLFxuICAgIHRhcmdldEhlaWdodCA9IF90YXJnZXRSZWYkY3VycmVudCRnZS5oZWlnaHQ7XG4gIHZhciBjZW50ZXJPZmZzZXRYID0gdGFyZ2V0V2lkdGggLyAyO1xuICB2YXIgY2VudGVyT2Zmc2V0WSA9IHRhcmdldEhlaWdodCAvIDI7XG4gIHZhciBzYXR1cmF0aW9uID0gKG9mZnNldC54ICsgY2VudGVyT2Zmc2V0WCkgLyB3aWR0aDtcbiAgdmFyIGJyaWdodCA9IDEgLSAob2Zmc2V0LnkgKyBjZW50ZXJPZmZzZXRZKSAvIGhlaWdodDtcbiAgdmFyIGhzYiA9IGNvbG9yLnRvSHNiKCk7XG4gIHZhciBhbHBoYU9mZnNldCA9IHNhdHVyYXRpb247XG4gIHZhciBodWVPZmZzZXQgPSAob2Zmc2V0LnggKyBjZW50ZXJPZmZzZXRYKSAvIHdpZHRoICogMzYwO1xuICBpZiAodHlwZSkge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnaHVlJzpcbiAgICAgICAgcmV0dXJuIGdlbmVyYXRlQ29sb3IoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBoc2IpLCB7fSwge1xuICAgICAgICAgIGg6IGh1ZU9mZnNldCA8PSAwID8gMCA6IGh1ZU9mZnNldFxuICAgICAgICB9KSk7XG4gICAgICBjYXNlICdhbHBoYSc6XG4gICAgICAgIHJldHVybiBnZW5lcmF0ZUNvbG9yKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgaHNiKSwge30sIHtcbiAgICAgICAgICBhOiBhbHBoYU9mZnNldCA8PSAwID8gMCA6IGFscGhhT2Zmc2V0XG4gICAgICAgIH0pKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGdlbmVyYXRlQ29sb3Ioe1xuICAgIGg6IGhzYi5oLFxuICAgIHM6IHNhdHVyYXRpb24gPD0gMCA/IDAgOiBzYXR1cmF0aW9uLFxuICAgIGI6IGJyaWdodCA+PSAxID8gMSA6IGJyaWdodCxcbiAgICBhOiBoc2IuYVxuICB9KTtcbn07XG5leHBvcnQgdmFyIGNhbGNPZmZzZXQgPSBmdW5jdGlvbiBjYWxjT2Zmc2V0KGNvbG9yLCB0eXBlKSB7XG4gIHZhciBoc2IgPSBjb2xvci50b0hzYigpO1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdodWUnOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogaHNiLmggLyAzNjAgKiAxMDAsXG4gICAgICAgIHk6IDUwXG4gICAgICB9O1xuICAgIGNhc2UgJ2FscGhhJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IGNvbG9yLmEgKiAxMDAsXG4gICAgICAgIHk6IDUwXG4gICAgICB9O1xuXG4gICAgLy8gUGlja2VyIHBhbmVsXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IGhzYi5zICogMTAwLFxuICAgICAgICB5OiAoMSAtIGhzYi5iKSAqIDEwMFxuICAgICAgfTtcbiAgfVxufTsiLCAiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xudmFyIENvbG9yQmxvY2sgPSBmdW5jdGlvbiBDb2xvckJsb2NrKF9yZWYpIHtcbiAgdmFyIGNvbG9yID0gX3JlZi5jb2xvcixcbiAgICBwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscyxcbiAgICBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICBzdHlsZSA9IF9yZWYuc3R5bGUsXG4gICAgb25DbGljayA9IF9yZWYub25DbGljaztcbiAgdmFyIGNvbG9yQmxvY2tDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNvbG9yLWJsb2NrXCIpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjb2xvckJsb2NrQ2xzLCBjbGFzc05hbWUpLFxuICAgIHN0eWxlOiBzdHlsZSxcbiAgICBvbkNsaWNrOiBvbkNsaWNrXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KGNvbG9yQmxvY2tDbHMsIFwiLWlubmVyXCIpLFxuICAgIHN0eWxlOiB7XG4gICAgICBiYWNrZ3JvdW5kOiBjb2xvclxuICAgIH1cbiAgfSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IENvbG9yQmxvY2s7IiwgImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IFJlYWN0LCB7IHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VDb2xvckRyYWcgZnJvbSBcIi4uL2hvb2tzL3VzZUNvbG9yRHJhZ1wiO1xuaW1wb3J0IHsgY2FsY09mZnNldCwgY2FsY3VsYXRlQ29sb3IgfSBmcm9tIFwiLi4vdXRpbFwiO1xuaW1wb3J0IHsgdXNlRXZlbnQgfSBmcm9tICdyYy11dGlsJztcbmltcG9ydCBIYW5kbGVyIGZyb20gXCIuL0hhbmRsZXJcIjtcbmltcG9ydCBQYWxldHRlIGZyb20gXCIuL1BhbGV0dGVcIjtcbmltcG9ydCBUcmFuc2Zvcm0gZnJvbSBcIi4vVHJhbnNmb3JtXCI7XG52YXIgUGlja2VyID0gZnVuY3Rpb24gUGlja2VyKF9yZWYpIHtcbiAgdmFyIGNvbG9yID0gX3JlZi5jb2xvcixcbiAgICBvbkNoYW5nZSA9IF9yZWYub25DaGFuZ2UsXG4gICAgcHJlZml4Q2xzID0gX3JlZi5wcmVmaXhDbHMsXG4gICAgb25DaGFuZ2VDb21wbGV0ZSA9IF9yZWYub25DaGFuZ2VDb21wbGV0ZSxcbiAgICBkaXNhYmxlZCA9IF9yZWYuZGlzYWJsZWQ7XG4gIHZhciBwaWNrZXJSZWYgPSB1c2VSZWYoKTtcbiAgdmFyIHRyYW5zZm9ybVJlZiA9IHVzZVJlZigpO1xuICB2YXIgY29sb3JSZWYgPSB1c2VSZWYoY29sb3IpO1xuICB2YXIgb25EcmFnQ2hhbmdlID0gdXNlRXZlbnQoZnVuY3Rpb24gKG9mZnNldFZhbHVlKSB7XG4gICAgdmFyIGNhbGNDb2xvciA9IGNhbGN1bGF0ZUNvbG9yKHtcbiAgICAgIG9mZnNldDogb2Zmc2V0VmFsdWUsXG4gICAgICB0YXJnZXRSZWY6IHRyYW5zZm9ybVJlZixcbiAgICAgIGNvbnRhaW5lclJlZjogcGlja2VyUmVmLFxuICAgICAgY29sb3I6IGNvbG9yXG4gICAgfSk7XG4gICAgY29sb3JSZWYuY3VycmVudCA9IGNhbGNDb2xvcjtcbiAgICBvbkNoYW5nZShjYWxjQ29sb3IpO1xuICB9KTtcbiAgdmFyIF91c2VDb2xvckRyYWcgPSB1c2VDb2xvckRyYWcoe1xuICAgICAgY29sb3I6IGNvbG9yLFxuICAgICAgY29udGFpbmVyUmVmOiBwaWNrZXJSZWYsXG4gICAgICB0YXJnZXRSZWY6IHRyYW5zZm9ybVJlZixcbiAgICAgIGNhbGN1bGF0ZTogZnVuY3Rpb24gY2FsY3VsYXRlKCkge1xuICAgICAgICByZXR1cm4gY2FsY09mZnNldChjb2xvcik7XG4gICAgICB9LFxuICAgICAgb25EcmFnQ2hhbmdlOiBvbkRyYWdDaGFuZ2UsXG4gICAgICBvbkRyYWdDaGFuZ2VDb21wbGV0ZTogZnVuY3Rpb24gb25EcmFnQ2hhbmdlQ29tcGxldGUoKSB7XG4gICAgICAgIHJldHVybiBvbkNoYW5nZUNvbXBsZXRlID09PSBudWxsIHx8IG9uQ2hhbmdlQ29tcGxldGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlQ29tcGxldGUoY29sb3JSZWYuY3VycmVudCk7XG4gICAgICB9LFxuICAgICAgZGlzYWJsZWREcmFnOiBkaXNhYmxlZFxuICAgIH0pLFxuICAgIF91c2VDb2xvckRyYWcyID0gX3NsaWNlZFRvQXJyYXkoX3VzZUNvbG9yRHJhZywgMiksXG4gICAgb2Zmc2V0ID0gX3VzZUNvbG9yRHJhZzJbMF0sXG4gICAgZHJhZ1N0YXJ0SGFuZGxlID0gX3VzZUNvbG9yRHJhZzJbMV07XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgcmVmOiBwaWNrZXJSZWYsXG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNlbGVjdFwiKSxcbiAgICBvbk1vdXNlRG93bjogZHJhZ1N0YXJ0SGFuZGxlLFxuICAgIG9uVG91Y2hTdGFydDogZHJhZ1N0YXJ0SGFuZGxlXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBhbGV0dGUsIHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENsc1xuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUcmFuc2Zvcm0sIHtcbiAgICB4OiBvZmZzZXQueCxcbiAgICB5OiBvZmZzZXQueSxcbiAgICByZWY6IHRyYW5zZm9ybVJlZlxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChIYW5kbGVyLCB7XG4gICAgY29sb3I6IGNvbG9yLnRvUmdiU3RyaW5nKCksXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHNcbiAgfSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNhdHVyYXRpb25cIiksXG4gICAgc3R5bGU6IHtcbiAgICAgIGJhY2tncm91bmRDb2xvcjogXCJoc2woXCIuY29uY2F0KGNvbG9yLnRvSHNiKCkuaCwgXCIsMTAwJSwgNTAlKVwiKSxcbiAgICAgIGJhY2tncm91bmRJbWFnZTogJ2xpbmVhci1ncmFkaWVudCgwZGVnLCAjMDAwLCB0cmFuc3BhcmVudCksbGluZWFyLWdyYWRpZW50KDkwZGVnLCAjZmZmLCBoc2xhKDAsIDAlLCAxMDAlLCAwKSknXG4gICAgfVxuICB9KSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFBpY2tlcjsiLCAiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5mdW5jdGlvbiBnZXRQb3NpdGlvbihlKSB7XG4gIHZhciBvYmogPSAndG91Y2hlcycgaW4gZSA/IGUudG91Y2hlc1swXSA6IGU7XG4gIHZhciBzY3JvbGxYT2Zmc2V0ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0IHx8IHdpbmRvdy5wYWdlWE9mZnNldDtcbiAgdmFyIHNjcm9sbFlPZmZzZXQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wIHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wIHx8IHdpbmRvdy5wYWdlWU9mZnNldDtcbiAgcmV0dXJuIHtcbiAgICBwYWdlWDogb2JqLnBhZ2VYIC0gc2Nyb2xsWE9mZnNldCxcbiAgICBwYWdlWTogb2JqLnBhZ2VZIC0gc2Nyb2xsWU9mZnNldFxuICB9O1xufVxuZnVuY3Rpb24gdXNlQ29sb3JEcmFnKHByb3BzKSB7XG4gIHZhciB0YXJnZXRSZWYgPSBwcm9wcy50YXJnZXRSZWYsXG4gICAgY29udGFpbmVyUmVmID0gcHJvcHMuY29udGFpbmVyUmVmLFxuICAgIGRpcmVjdGlvbiA9IHByb3BzLmRpcmVjdGlvbixcbiAgICBvbkRyYWdDaGFuZ2UgPSBwcm9wcy5vbkRyYWdDaGFuZ2UsXG4gICAgb25EcmFnQ2hhbmdlQ29tcGxldGUgPSBwcm9wcy5vbkRyYWdDaGFuZ2VDb21wbGV0ZSxcbiAgICBjYWxjdWxhdGUgPSBwcm9wcy5jYWxjdWxhdGUsXG4gICAgY29sb3IgPSBwcm9wcy5jb2xvcixcbiAgICBkaXNhYmxlZERyYWcgPSBwcm9wcy5kaXNhYmxlZERyYWc7XG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZSh7XG4gICAgICB4OiAwLFxuICAgICAgeTogMFxuICAgIH0pLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIG9mZnNldFZhbHVlID0gX3VzZVN0YXRlMlswXSxcbiAgICBzZXRPZmZzZXRWYWx1ZSA9IF91c2VTdGF0ZTJbMV07XG4gIHZhciBtb3VzZU1vdmVSZWYgPSB1c2VSZWYobnVsbCk7XG4gIHZhciBtb3VzZVVwUmVmID0gdXNlUmVmKG51bGwpO1xuXG4gIC8vIEFsd2F5cyBnZXQgcG9zaXRpb24gZnJvbSBgY29sb3JgXG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgc2V0T2Zmc2V0VmFsdWUoY2FsY3VsYXRlKCkpO1xuICB9LCBbY29sb3JdKTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgbW91c2VNb3ZlUmVmLmN1cnJlbnQpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG1vdXNlVXBSZWYuY3VycmVudCk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBtb3VzZU1vdmVSZWYuY3VycmVudCk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIG1vdXNlVXBSZWYuY3VycmVudCk7XG4gICAgICBtb3VzZU1vdmVSZWYuY3VycmVudCA9IG51bGw7XG4gICAgICBtb3VzZVVwUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgdmFyIHVwZGF0ZU9mZnNldCA9IGZ1bmN0aW9uIHVwZGF0ZU9mZnNldChlKSB7XG4gICAgdmFyIF9nZXRQb3NpdGlvbiA9IGdldFBvc2l0aW9uKGUpLFxuICAgICAgcGFnZVggPSBfZ2V0UG9zaXRpb24ucGFnZVgsXG4gICAgICBwYWdlWSA9IF9nZXRQb3NpdGlvbi5wYWdlWTtcbiAgICB2YXIgX2NvbnRhaW5lclJlZiRjdXJyZW50ID0gY29udGFpbmVyUmVmLmN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICByZWN0WCA9IF9jb250YWluZXJSZWYkY3VycmVudC54LFxuICAgICAgcmVjdFkgPSBfY29udGFpbmVyUmVmJGN1cnJlbnQueSxcbiAgICAgIHdpZHRoID0gX2NvbnRhaW5lclJlZiRjdXJyZW50LndpZHRoLFxuICAgICAgaGVpZ2h0ID0gX2NvbnRhaW5lclJlZiRjdXJyZW50LmhlaWdodDtcbiAgICB2YXIgX3RhcmdldFJlZiRjdXJyZW50JGdlID0gdGFyZ2V0UmVmLmN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICB0YXJnZXRXaWR0aCA9IF90YXJnZXRSZWYkY3VycmVudCRnZS53aWR0aCxcbiAgICAgIHRhcmdldEhlaWdodCA9IF90YXJnZXRSZWYkY3VycmVudCRnZS5oZWlnaHQ7XG4gICAgdmFyIGNlbnRlck9mZnNldFggPSB0YXJnZXRXaWR0aCAvIDI7XG4gICAgdmFyIGNlbnRlck9mZnNldFkgPSB0YXJnZXRIZWlnaHQgLyAyO1xuICAgIHZhciBvZmZzZXRYID0gTWF0aC5tYXgoMCwgTWF0aC5taW4ocGFnZVggLSByZWN0WCwgd2lkdGgpKSAtIGNlbnRlck9mZnNldFg7XG4gICAgdmFyIG9mZnNldFkgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihwYWdlWSAtIHJlY3RZLCBoZWlnaHQpKSAtIGNlbnRlck9mZnNldFk7XG4gICAgdmFyIGNhbGNPZmZzZXQgPSB7XG4gICAgICB4OiBvZmZzZXRYLFxuICAgICAgeTogZGlyZWN0aW9uID09PSAneCcgPyBvZmZzZXRWYWx1ZS55IDogb2Zmc2V0WVxuICAgIH07XG5cbiAgICAvLyBFeGNsdXNpb24gb2YgYm91bmRhcnkgY2FzZXNcbiAgICBpZiAodGFyZ2V0V2lkdGggPT09IDAgJiYgdGFyZ2V0SGVpZ2h0ID09PSAwIHx8IHRhcmdldFdpZHRoICE9PSB0YXJnZXRIZWlnaHQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgb25EcmFnQ2hhbmdlID09PSBudWxsIHx8IG9uRHJhZ0NoYW5nZSA9PT0gdm9pZCAwIHx8IG9uRHJhZ0NoYW5nZShjYWxjT2Zmc2V0KTtcbiAgfTtcbiAgdmFyIG9uRHJhZ01vdmUgPSBmdW5jdGlvbiBvbkRyYWdNb3ZlKGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgdXBkYXRlT2Zmc2V0KGUpO1xuICB9O1xuICB2YXIgb25EcmFnU3RvcCA9IGZ1bmN0aW9uIG9uRHJhZ1N0b3AoZSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBtb3VzZU1vdmVSZWYuY3VycmVudCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG1vdXNlVXBSZWYuY3VycmVudCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgbW91c2VNb3ZlUmVmLmN1cnJlbnQpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgbW91c2VVcFJlZi5jdXJyZW50KTtcbiAgICBtb3VzZU1vdmVSZWYuY3VycmVudCA9IG51bGw7XG4gICAgbW91c2VVcFJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICBvbkRyYWdDaGFuZ2VDb21wbGV0ZSA9PT0gbnVsbCB8fCBvbkRyYWdDaGFuZ2VDb21wbGV0ZSA9PT0gdm9pZCAwIHx8IG9uRHJhZ0NoYW5nZUNvbXBsZXRlKCk7XG4gIH07XG4gIHZhciBvbkRyYWdTdGFydCA9IGZ1bmN0aW9uIG9uRHJhZ1N0YXJ0KGUpIHtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy80MzUyOVxuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG1vdXNlTW92ZVJlZi5jdXJyZW50KTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgbW91c2VVcFJlZi5jdXJyZW50KTtcbiAgICBpZiAoZGlzYWJsZWREcmFnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHVwZGF0ZU9mZnNldChlKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbkRyYWdNb3ZlKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25EcmFnU3RvcCk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgb25EcmFnTW92ZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBvbkRyYWdTdG9wKTtcbiAgICBtb3VzZU1vdmVSZWYuY3VycmVudCA9IG9uRHJhZ01vdmU7XG4gICAgbW91c2VVcFJlZi5jdXJyZW50ID0gb25EcmFnU3RvcDtcbiAgfTtcbiAgcmV0dXJuIFtvZmZzZXRWYWx1ZSwgb25EcmFnU3RhcnRdO1xufVxuZXhwb3J0IGRlZmF1bHQgdXNlQ29sb3JEcmFnOyIsICJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xudmFyIEhhbmRsZXIgPSBmdW5jdGlvbiBIYW5kbGVyKF9yZWYpIHtcbiAgdmFyIF9yZWYkc2l6ZSA9IF9yZWYuc2l6ZSxcbiAgICBzaXplID0gX3JlZiRzaXplID09PSB2b2lkIDAgPyAnZGVmYXVsdCcgOiBfcmVmJHNpemUsXG4gICAgY29sb3IgPSBfcmVmLmNvbG9yLFxuICAgIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhhbmRsZXJcIiksIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oYW5kbGVyLXNtXCIpLCBzaXplID09PSAnc21hbGwnKSksXG4gICAgc3R5bGU6IHtcbiAgICAgIGJhY2tncm91bmRDb2xvcjogY29sb3JcbiAgICB9XG4gIH0pO1xufTtcbmV4cG9ydCBkZWZhdWx0IEhhbmRsZXI7IiwgImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xudmFyIFBhbGV0dGUgPSBmdW5jdGlvbiBQYWxldHRlKF9yZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICBzdHlsZSA9IF9yZWYuc3R5bGUsXG4gICAgcHJlZml4Q2xzID0gX3JlZi5wcmVmaXhDbHM7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXBhbGV0dGVcIiksXG4gICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoe1xuICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZSdcbiAgICB9LCBzdHlsZSlcbiAgfSwgY2hpbGRyZW4pO1xufTtcbmV4cG9ydCBkZWZhdWx0IFBhbGV0dGU7IiwgImltcG9ydCBSZWFjdCwgeyBmb3J3YXJkUmVmIH0gZnJvbSAncmVhY3QnO1xudmFyIFRyYW5zZm9ybSA9IC8qI19fUFVSRV9fKi9mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgIHggPSBwcm9wcy54LFxuICAgIHkgPSBwcm9wcy55O1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHJlZjogcmVmLFxuICAgIHN0eWxlOiB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIGxlZnQ6IFwiXCIuY29uY2F0KHgsIFwiJVwiKSxcbiAgICAgIHRvcDogXCJcIi5jb25jYXQoeSwgXCIlXCIpLFxuICAgICAgekluZGV4OiAxLFxuICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlKC01MCUsIC01MCUpJ1xuICAgIH1cbiAgfSwgY2hpbGRyZW4pO1xufSk7XG5leHBvcnQgZGVmYXVsdCBUcmFuc2Zvcm07IiwgImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IHsgdXNlTWVyZ2VkU3RhdGUgfSBmcm9tICdyYy11dGlsJztcbmltcG9ydCB7IHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBnZW5lcmF0ZUNvbG9yIH0gZnJvbSBcIi4uL3V0aWxcIjtcbnZhciB1c2VDb2xvclN0YXRlID0gZnVuY3Rpb24gdXNlQ29sb3JTdGF0ZShkZWZhdWx0VmFsdWUsIHZhbHVlKSB7XG4gIHZhciBfdXNlTWVyZ2VkU3RhdGUgPSB1c2VNZXJnZWRTdGF0ZShkZWZhdWx0VmFsdWUsIHtcbiAgICAgIHZhbHVlOiB2YWx1ZVxuICAgIH0pLFxuICAgIF91c2VNZXJnZWRTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlTWVyZ2VkU3RhdGUsIDIpLFxuICAgIG1lcmdlZFZhbHVlID0gX3VzZU1lcmdlZFN0YXRlMlswXSxcbiAgICBzZXRWYWx1ZSA9IF91c2VNZXJnZWRTdGF0ZTJbMV07XG4gIHZhciBjb2xvciA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBnZW5lcmF0ZUNvbG9yKG1lcmdlZFZhbHVlKTtcbiAgfSwgW21lcmdlZFZhbHVlXSk7XG4gIHJldHVybiBbY29sb3IsIHNldFZhbHVlXTtcbn07XG5leHBvcnQgZGVmYXVsdCB1c2VDb2xvclN0YXRlOyIsICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgU2xpZGVyIGZyb20gXCIuLi9jb21wb25lbnRzL1NsaWRlclwiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlQ29tcG9uZW50KGNvbXBvbmVudHMpIHtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBfcmVmID0gY29tcG9uZW50cyB8fCB7fSxcbiAgICAgIHNsaWRlciA9IF9yZWYuc2xpZGVyO1xuICAgIHJldHVybiBbc2xpZGVyIHx8IFNsaWRlcl07XG4gIH0sIFtjb21wb25lbnRzXSk7XG59IiwgImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IFJlYWN0LCB7IHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VDb2xvckRyYWcgZnJvbSBcIi4uL2hvb2tzL3VzZUNvbG9yRHJhZ1wiO1xuaW1wb3J0IFBhbGV0dGUgZnJvbSBcIi4vUGFsZXR0ZVwiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyB1c2VFdmVudCB9IGZyb20gJ3JjLXV0aWwnO1xuaW1wb3J0IHsgQ29sb3IgfSBmcm9tIFwiLi4vY29sb3JcIjtcbmltcG9ydCB7IGNhbGNPZmZzZXQsIGNhbGN1bGF0ZUNvbG9yIH0gZnJvbSBcIi4uL3V0aWxcIjtcbmltcG9ydCBHcmFkaWVudCBmcm9tIFwiLi9HcmFkaWVudFwiO1xuaW1wb3J0IEhhbmRsZXIgZnJvbSBcIi4vSGFuZGxlclwiO1xuaW1wb3J0IFRyYW5zZm9ybSBmcm9tIFwiLi9UcmFuc2Zvcm1cIjtcbnZhciBTbGlkZXIgPSBmdW5jdGlvbiBTbGlkZXIocHJvcHMpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBjb2xvcnMgPSBwcm9wcy5jb2xvcnMsXG4gICAgZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICBvbkNoYW5nZSA9IHByb3BzLm9uQ2hhbmdlLFxuICAgIG9uQ2hhbmdlQ29tcGxldGUgPSBwcm9wcy5vbkNoYW5nZUNvbXBsZXRlLFxuICAgIGNvbG9yID0gcHJvcHMuY29sb3IsXG4gICAgdHlwZSA9IHByb3BzLnR5cGU7XG4gIHZhciBzbGlkZXJSZWYgPSB1c2VSZWYoKTtcbiAgdmFyIHRyYW5zZm9ybVJlZiA9IHVzZVJlZigpO1xuICB2YXIgY29sb3JSZWYgPSB1c2VSZWYoY29sb3IpO1xuICB2YXIgZ2V0VmFsdWUgPSBmdW5jdGlvbiBnZXRWYWx1ZShjKSB7XG4gICAgcmV0dXJuIHR5cGUgPT09ICdodWUnID8gYy5nZXRIdWUoKSA6IGMuYSAqIDEwMDtcbiAgfTtcbiAgdmFyIG9uRHJhZ0NoYW5nZSA9IHVzZUV2ZW50KGZ1bmN0aW9uIChvZmZzZXRWYWx1ZSkge1xuICAgIHZhciBjYWxjQ29sb3IgPSBjYWxjdWxhdGVDb2xvcih7XG4gICAgICBvZmZzZXQ6IG9mZnNldFZhbHVlLFxuICAgICAgdGFyZ2V0UmVmOiB0cmFuc2Zvcm1SZWYsXG4gICAgICBjb250YWluZXJSZWY6IHNsaWRlclJlZixcbiAgICAgIGNvbG9yOiBjb2xvcixcbiAgICAgIHR5cGU6IHR5cGVcbiAgICB9KTtcbiAgICBjb2xvclJlZi5jdXJyZW50ID0gY2FsY0NvbG9yO1xuICAgIG9uQ2hhbmdlKGdldFZhbHVlKGNhbGNDb2xvcikpO1xuICB9KTtcbiAgdmFyIF91c2VDb2xvckRyYWcgPSB1c2VDb2xvckRyYWcoe1xuICAgICAgY29sb3I6IGNvbG9yLFxuICAgICAgdGFyZ2V0UmVmOiB0cmFuc2Zvcm1SZWYsXG4gICAgICBjb250YWluZXJSZWY6IHNsaWRlclJlZixcbiAgICAgIGNhbGN1bGF0ZTogZnVuY3Rpb24gY2FsY3VsYXRlKCkge1xuICAgICAgICByZXR1cm4gY2FsY09mZnNldChjb2xvciwgdHlwZSk7XG4gICAgICB9LFxuICAgICAgb25EcmFnQ2hhbmdlOiBvbkRyYWdDaGFuZ2UsXG4gICAgICBvbkRyYWdDaGFuZ2VDb21wbGV0ZTogZnVuY3Rpb24gb25EcmFnQ2hhbmdlQ29tcGxldGUoKSB7XG4gICAgICAgIG9uQ2hhbmdlQ29tcGxldGUoZ2V0VmFsdWUoY29sb3JSZWYuY3VycmVudCkpO1xuICAgICAgfSxcbiAgICAgIGRpcmVjdGlvbjogJ3gnLFxuICAgICAgZGlzYWJsZWREcmFnOiBkaXNhYmxlZFxuICAgIH0pLFxuICAgIF91c2VDb2xvckRyYWcyID0gX3NsaWNlZFRvQXJyYXkoX3VzZUNvbG9yRHJhZywgMiksXG4gICAgb2Zmc2V0ID0gX3VzZUNvbG9yRHJhZzJbMF0sXG4gICAgZHJhZ1N0YXJ0SGFuZGxlID0gX3VzZUNvbG9yRHJhZzJbMV07XG4gIHZhciBoYW5kbGVDb2xvciA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGlmICh0eXBlID09PSAnaHVlJykge1xuICAgICAgdmFyIGhzYiA9IGNvbG9yLnRvSHNiKCk7XG4gICAgICBoc2IucyA9IDE7XG4gICAgICBoc2IuYiA9IDE7XG4gICAgICBoc2IuYSA9IDE7XG4gICAgICB2YXIgbGlnaHRDb2xvciA9IG5ldyBDb2xvcihoc2IpO1xuICAgICAgcmV0dXJuIGxpZ2h0Q29sb3I7XG4gICAgfVxuICAgIHJldHVybiBjb2xvcjtcbiAgfSwgW2NvbG9yLCB0eXBlXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBHcmFkaWVudCA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBncmFkaWVudExpc3QgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gY29sb3JzLm1hcChmdW5jdGlvbiAoaW5mbykge1xuICAgICAgcmV0dXJuIFwiXCIuY29uY2F0KGluZm8uY29sb3IsIFwiIFwiKS5jb25jYXQoaW5mby5wZXJjZW50LCBcIiVcIik7XG4gICAgfSk7XG4gIH0sIFtjb2xvcnNdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICByZWY6IHNsaWRlclJlZixcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zbGlkZXJcIiksIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2xpZGVyLVwiKS5jb25jYXQodHlwZSkpLFxuICAgIG9uTW91c2VEb3duOiBkcmFnU3RhcnRIYW5kbGUsXG4gICAgb25Ub3VjaFN0YXJ0OiBkcmFnU3RhcnRIYW5kbGVcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUGFsZXR0ZSwge1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRyYW5zZm9ybSwge1xuICAgIHg6IG9mZnNldC54LFxuICAgIHk6IG9mZnNldC55LFxuICAgIHJlZjogdHJhbnNmb3JtUmVmXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEhhbmRsZXIsIHtcbiAgICBzaXplOiBcInNtYWxsXCIsXG4gICAgY29sb3I6IGhhbmRsZUNvbG9yLnRvSGV4U3RyaW5nKCksXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHNcbiAgfSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChHcmFkaWVudCwge1xuICAgIGNvbG9yczogZ3JhZGllbnRMaXN0LFxuICAgIHR5cGU6IHR5cGUsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHNcbiAgfSkpKTtcbn07XG5leHBvcnQgZGVmYXVsdCBTbGlkZXI7IiwgImltcG9ydCBSZWFjdCwgeyB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29sb3IgfSBmcm9tIFwiLi4vY29sb3JcIjtcbmltcG9ydCB7IGdlbmVyYXRlQ29sb3IgfSBmcm9tIFwiLi4vdXRpbFwiO1xudmFyIEdyYWRpZW50ID0gZnVuY3Rpb24gR3JhZGllbnQoX3JlZikge1xuICB2YXIgY29sb3JzID0gX3JlZi5jb2xvcnMsXG4gICAgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuLFxuICAgIF9yZWYkZGlyZWN0aW9uID0gX3JlZi5kaXJlY3Rpb24sXG4gICAgZGlyZWN0aW9uID0gX3JlZiRkaXJlY3Rpb24gPT09IHZvaWQgMCA/ICd0byByaWdodCcgOiBfcmVmJGRpcmVjdGlvbixcbiAgICB0eXBlID0gX3JlZi50eXBlLFxuICAgIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzO1xuICB2YXIgZ3JhZGllbnRDb2xvcnMgPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gY29sb3JzLm1hcChmdW5jdGlvbiAoY29sb3IsIGlkeCkge1xuICAgICAgdmFyIHJlc3VsdCA9IGdlbmVyYXRlQ29sb3IoY29sb3IpO1xuICAgICAgaWYgKHR5cGUgPT09ICdhbHBoYScgJiYgaWR4ID09PSBjb2xvcnMubGVuZ3RoIC0gMSkge1xuICAgICAgICByZXN1bHQgPSBuZXcgQ29sb3IocmVzdWx0LnNldEEoMSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdC50b1JnYlN0cmluZygpO1xuICAgIH0pLmpvaW4oJywnKTtcbiAgfSwgW2NvbG9ycywgdHlwZV0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ncmFkaWVudFwiKSxcbiAgICBzdHlsZToge1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBpbnNldDogMCxcbiAgICAgIGJhY2tncm91bmQ6IFwibGluZWFyLWdyYWRpZW50KFwiLmNvbmNhdChkaXJlY3Rpb24sIFwiLCBcIikuY29uY2F0KGdyYWRpZW50Q29sb3JzLCBcIilcIilcbiAgICB9XG4gIH0sIGNoaWxkcmVuKTtcbn07XG5leHBvcnQgZGVmYXVsdCBHcmFkaWVudDsiLCAiaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgeyBDb2xvciBhcyBSY0NvbG9yIH0gZnJvbSAnQHJjLWNvbXBvbmVudC9jb2xvci1waWNrZXInO1xuZXhwb3J0IGNvbnN0IHRvSGV4Rm9ybWF0ID0gKHZhbHVlLCBhbHBoYSkgPT4gKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB2b2lkIDAgPyB2b2lkIDAgOiB2YWx1ZS5yZXBsYWNlKC9bXlxcdy9dL2csICcnKS5zbGljZSgwLCBhbHBoYSA/IDggOiA2KSkgfHwgJyc7XG5leHBvcnQgY29uc3QgZ2V0SGV4ID0gKHZhbHVlLCBhbHBoYSkgPT4gdmFsdWUgPyB0b0hleEZvcm1hdCh2YWx1ZSwgYWxwaGEpIDogJyc7XG5leHBvcnQgbGV0IEFnZ3JlZ2F0aW9uQ29sb3IgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBBZ2dyZWdhdGlvbkNvbG9yKGNvbG9yKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEFnZ3JlZ2F0aW9uQ29sb3IpO1xuICAgIHZhciBfYTtcbiAgICB0aGlzLmNsZWFyZWQgPSBmYWxzZTtcbiAgICAvLyBDbG9uZSBmcm9tIGFub3RoZXIgQWdncmVnYXRpb25Db2xvclxuICAgIGlmIChjb2xvciBpbnN0YW5jZW9mIEFnZ3JlZ2F0aW9uQ29sb3IpIHtcbiAgICAgIHRoaXMubWV0YUNvbG9yID0gY29sb3IubWV0YUNvbG9yLmNsb25lKCk7XG4gICAgICB0aGlzLmNvbG9ycyA9IChfYSA9IGNvbG9yLmNvbG9ycykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm1hcChpbmZvID0+ICh7XG4gICAgICAgIGNvbG9yOiBuZXcgQWdncmVnYXRpb25Db2xvcihpbmZvLmNvbG9yKSxcbiAgICAgICAgcGVyY2VudDogaW5mby5wZXJjZW50XG4gICAgICB9KSk7XG4gICAgICB0aGlzLmNsZWFyZWQgPSBjb2xvci5jbGVhcmVkO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheShjb2xvcik7XG4gICAgaWYgKGlzQXJyYXkgJiYgY29sb3IubGVuZ3RoKSB7XG4gICAgICB0aGlzLmNvbG9ycyA9IGNvbG9yLm1hcChfcmVmID0+IHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBjb2xvcjogYyxcbiAgICAgICAgICBwZXJjZW50XG4gICAgICAgIH0gPSBfcmVmO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbG9yOiBuZXcgQWdncmVnYXRpb25Db2xvcihjKSxcbiAgICAgICAgICBwZXJjZW50XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIHRoaXMubWV0YUNvbG9yID0gbmV3IFJjQ29sb3IodGhpcy5jb2xvcnNbMF0uY29sb3IubWV0YUNvbG9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tZXRhQ29sb3IgPSBuZXcgUmNDb2xvcihpc0FycmF5ID8gJycgOiBjb2xvcik7XG4gICAgfVxuICAgIGlmICghY29sb3IgfHwgaXNBcnJheSAmJiAhdGhpcy5jb2xvcnMpIHtcbiAgICAgIHRoaXMubWV0YUNvbG9yID0gdGhpcy5tZXRhQ29sb3Iuc2V0QSgwKTtcbiAgICAgIHRoaXMuY2xlYXJlZCA9IHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBfY3JlYXRlQ2xhc3MoQWdncmVnYXRpb25Db2xvciwgW3tcbiAgICBrZXk6IFwidG9Ic2JcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9Ic2IoKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZXRhQ29sb3IudG9Ic2IoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidG9Ic2JTdHJpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9Ic2JTdHJpbmcoKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZXRhQ29sb3IudG9Ic2JTdHJpbmcoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidG9IZXhcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9IZXgoKSB7XG4gICAgICByZXR1cm4gZ2V0SGV4KHRoaXMudG9IZXhTdHJpbmcoKSwgdGhpcy5tZXRhQ29sb3IuYSA8IDEpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0b0hleFN0cmluZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b0hleFN0cmluZygpIHtcbiAgICAgIHJldHVybiB0aGlzLm1ldGFDb2xvci50b0hleFN0cmluZygpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0b1JnYlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b1JnYigpIHtcbiAgICAgIHJldHVybiB0aGlzLm1ldGFDb2xvci50b1JnYigpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0b1JnYlN0cmluZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b1JnYlN0cmluZygpIHtcbiAgICAgIHJldHVybiB0aGlzLm1ldGFDb2xvci50b1JnYlN0cmluZygpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc0dyYWRpZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzR3JhZGllbnQoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLmNvbG9ycyAmJiAhdGhpcy5jbGVhcmVkO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRDb2xvcnNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q29sb3JzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29sb3JzIHx8IFt7XG4gICAgICAgIGNvbG9yOiB0aGlzLFxuICAgICAgICBwZXJjZW50OiAwXG4gICAgICB9XTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidG9Dc3NTdHJpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9Dc3NTdHJpbmcoKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGNvbG9yc1xuICAgICAgfSA9IHRoaXM7XG4gICAgICAvLyBDU1MgbGluZS1ncmFkaWVudFxuICAgICAgaWYgKGNvbG9ycykge1xuICAgICAgICBjb25zdCBjb2xvcnNTdHIgPSBjb2xvcnMubWFwKGMgPT4gYCR7Yy5jb2xvci50b1JnYlN0cmluZygpfSAke2MucGVyY2VudH0lYCkuam9pbignLCAnKTtcbiAgICAgICAgcmV0dXJuIGBsaW5lYXItZ3JhZGllbnQoOTBkZWcsICR7Y29sb3JzU3RyfSlgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMubWV0YUNvbG9yLnRvUmdiU3RyaW5nKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVxdWFsc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlcXVhbHMoY29sb3IpIHtcbiAgICAgIGlmICghY29sb3IgfHwgdGhpcy5pc0dyYWRpZW50KCkgIT09IGNvbG9yLmlzR3JhZGllbnQoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuaXNHcmFkaWVudCgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvSGV4U3RyaW5nKCkgPT09IGNvbG9yLnRvSGV4U3RyaW5nKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5jb2xvcnMubGVuZ3RoID09PSBjb2xvci5jb2xvcnMubGVuZ3RoICYmIHRoaXMuY29sb3JzLmV2ZXJ5KChjLCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGNvbG9yLmNvbG9yc1tpXTtcbiAgICAgICAgcmV0dXJuIGMucGVyY2VudCA9PT0gdGFyZ2V0LnBlcmNlbnQgJiYgYy5jb2xvci5lcXVhbHModGFyZ2V0LmNvbG9yKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfV0pO1xufSgpOyIsICJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0IFJlYWN0LCB7IHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb2xvckJsb2NrLCBDb2xvciBhcyBSY0NvbG9yIH0gZnJvbSAnQHJjLWNvbXBvbmVudC9jb2xvci1waWNrZXInO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgdXNlTWVyZ2VkU3RhdGUgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlTWVyZ2VkU3RhdGVcIjtcbmltcG9ydCBDb2xsYXBzZSBmcm9tICcuLi8uLi9jb2xsYXBzZSc7XG5pbXBvcnQgeyB1c2VMb2NhbGUgfSBmcm9tICcuLi8uLi9sb2NhbGUnO1xuaW1wb3J0IHsgdXNlVG9rZW4gfSBmcm9tICcuLi8uLi90aGVtZS9pbnRlcm5hbCc7XG5pbXBvcnQgeyBnZW5lcmF0ZUNvbG9yIH0gZnJvbSAnLi4vdXRpbCc7XG5jb25zdCBnZW5QcmVzZXRDb2xvciA9IGxpc3QgPT4gbGlzdC5tYXAodmFsdWUgPT4ge1xuICB2YWx1ZS5jb2xvcnMgPSB2YWx1ZS5jb2xvcnMubWFwKGdlbmVyYXRlQ29sb3IpO1xuICByZXR1cm4gdmFsdWU7XG59KTtcbmV4cG9ydCBjb25zdCBpc0JyaWdodCA9ICh2YWx1ZSwgYmdDb2xvclRva2VuKSA9PiB7XG4gIGNvbnN0IHtcbiAgICByLFxuICAgIGcsXG4gICAgYixcbiAgICBhXG4gIH0gPSB2YWx1ZS50b1JnYigpO1xuICBjb25zdCBoc3YgPSBuZXcgUmNDb2xvcih2YWx1ZS50b1JnYlN0cmluZygpKS5vbkJhY2tncm91bmQoYmdDb2xvclRva2VuKS50b0hzdigpO1xuICBpZiAoYSA8PSAwLjUpIHtcbiAgICAvLyBBZGFwdGVkIHRvIGRhcmsgbW9kZVxuICAgIHJldHVybiBoc3YudiA+IDAuNTtcbiAgfVxuICByZXR1cm4gciAqIDAuMjk5ICsgZyAqIDAuNTg3ICsgYiAqIDAuMTE0ID4gMTkyO1xufTtcbmNvbnN0IGdlbkNvbGxhcHNlUGFuZWxLZXkgPSAocHJlc2V0LCBpbmRleCkgPT4ge1xuICB2YXIgX2E7XG4gIGNvbnN0IG1lcmdlZEtleSA9IChfYSA9IHByZXNldC5rZXkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGluZGV4O1xuICByZXR1cm4gYHBhbmVsLSR7bWVyZ2VkS2V5fWA7XG59O1xuY29uc3QgQ29sb3JQcmVzZXRzID0gX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgcHJlZml4Q2xzLFxuICAgIHByZXNldHMsXG4gICAgdmFsdWU6IGNvbG9yLFxuICAgIG9uQ2hhbmdlXG4gIH0gPSBfcmVmO1xuICBjb25zdCBbbG9jYWxlXSA9IHVzZUxvY2FsZSgnQ29sb3JQaWNrZXInKTtcbiAgY29uc3QgWywgdG9rZW5dID0gdXNlVG9rZW4oKTtcbiAgY29uc3QgW3ByZXNldHNWYWx1ZV0gPSB1c2VNZXJnZWRTdGF0ZShnZW5QcmVzZXRDb2xvcihwcmVzZXRzKSwge1xuICAgIHZhbHVlOiBnZW5QcmVzZXRDb2xvcihwcmVzZXRzKSxcbiAgICBwb3N0U3RhdGU6IGdlblByZXNldENvbG9yXG4gIH0pO1xuICBjb25zdCBjb2xvclByZXNldHNQcmVmaXhDbHMgPSBgJHtwcmVmaXhDbHN9LXByZXNldHNgO1xuICBjb25zdCBhY3RpdmVLZXlzID0gdXNlTWVtbygoKSA9PiBwcmVzZXRzVmFsdWUucmVkdWNlKChhY2MsIHByZXNldCwgaW5kZXgpID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBkZWZhdWx0T3BlbiA9IHRydWVcbiAgICB9ID0gcHJlc2V0O1xuICAgIGlmIChkZWZhdWx0T3Blbikge1xuICAgICAgYWNjLnB1c2goZ2VuQ29sbGFwc2VQYW5lbEtleShwcmVzZXQsIGluZGV4KSk7XG4gICAgfVxuICAgIHJldHVybiBhY2M7XG4gIH0sIFtdKSwgW3ByZXNldHNWYWx1ZV0pO1xuICBjb25zdCBoYW5kbGVDbGljayA9IGNvbG9yVmFsdWUgPT4ge1xuICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShjb2xvclZhbHVlKTtcbiAgfTtcbiAgY29uc3QgaXRlbXMgPSBwcmVzZXRzVmFsdWUubWFwKChwcmVzZXQsIGluZGV4KSA9PiB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiB7XG4gICAgICBrZXk6IGdlbkNvbGxhcHNlUGFuZWxLZXkocHJlc2V0LCBpbmRleCksXG4gICAgICBsYWJlbDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IGAke2NvbG9yUHJlc2V0c1ByZWZpeENsc30tbGFiZWxgXG4gICAgICB9LCBwcmVzZXQgPT09IG51bGwgfHwgcHJlc2V0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwcmVzZXQubGFiZWwpLFxuICAgICAgY2hpbGRyZW46ICgvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogYCR7Y29sb3JQcmVzZXRzUHJlZml4Q2xzfS1pdGVtc2BcbiAgICAgIH0sIEFycmF5LmlzQXJyYXkocHJlc2V0ID09PSBudWxsIHx8IHByZXNldCA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHJlc2V0LmNvbG9ycykgJiYgKChfYSA9IHByZXNldC5jb2xvcnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sZW5ndGgpID4gMCA/IHByZXNldC5jb2xvcnMubWFwKChwcmVzZXRDb2xvciwgaW5kZXgpID0+ICgvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb2xvckJsb2NrXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3Qvbm8tYXJyYXktaW5kZXgta2V5XG4gICAgICAsIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L25vLWFycmF5LWluZGV4LWtleVxuICAgICAgICBrZXk6IGBwcmVzZXQtJHtpbmRleH0tJHtwcmVzZXRDb2xvci50b0hleFN0cmluZygpfWAsXG4gICAgICAgIGNvbG9yOiBnZW5lcmF0ZUNvbG9yKHByZXNldENvbG9yKS50b1JnYlN0cmluZygpLFxuICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGAke2NvbG9yUHJlc2V0c1ByZWZpeENsc30tY29sb3JgLCB7XG4gICAgICAgICAgW2Ake2NvbG9yUHJlc2V0c1ByZWZpeENsc30tY29sb3ItY2hlY2tlZGBdOiBwcmVzZXRDb2xvci50b0hleFN0cmluZygpID09PSAoY29sb3IgPT09IG51bGwgfHwgY29sb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbG9yLnRvSGV4U3RyaW5nKCkpLFxuICAgICAgICAgIFtgJHtjb2xvclByZXNldHNQcmVmaXhDbHN9LWNvbG9yLWJyaWdodGBdOiBpc0JyaWdodChwcmVzZXRDb2xvciwgdG9rZW4uY29sb3JCZ0VsZXZhdGVkKVxuICAgICAgICB9KSxcbiAgICAgICAgb25DbGljazogKCkgPT4gaGFuZGxlQ2xpY2socHJlc2V0Q29sb3IpXG4gICAgICB9KSkpIDogKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogYCR7Y29sb3JQcmVzZXRzUHJlZml4Q2xzfS1lbXB0eWBcbiAgICAgIH0sIGxvY2FsZS5wcmVzZXRFbXB0eSkpKSlcbiAgICB9O1xuICB9KTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNvbG9yUHJlc2V0c1ByZWZpeENsc1xuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb2xsYXBzZSwge1xuICAgIGRlZmF1bHRBY3RpdmVLZXk6IGFjdGl2ZUtleXMsXG4gICAgZ2hvc3Q6IHRydWUsXG4gICAgaXRlbXM6IGl0ZW1zXG4gIH0pKTtcbn07XG5leHBvcnQgZGVmYXVsdCBDb2xvclByZXNldHM7IiwgImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJpZ2h0T3V0bGluZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vUmlnaHRPdXRsaW5lZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gXCIuLi9jb21wb25lbnRzL0FudGRJY29uXCI7XG52YXIgUmlnaHRPdXRsaW5lZCA9IGZ1bmN0aW9uIFJpZ2h0T3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IFJpZ2h0T3V0bGluZWRTdmdcbiAgfSkpO1xufTtcblxuLyoqIVtyaWdodF0oZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTlRBaUlHaGxhV2RvZEQwaU5UQWlJR1pwYkd3OUlpTmpZV05oWTJFaUlIWnBaWGRDYjNnOUlqWTBJRFkwSURnNU5pQTRPVFlpSUdadlkzVnpZV0pzWlQwaVptRnNjMlVpSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUkrUEhCaGRHZ2daRDBpVFRjMk5TNDNJRFE0Tmk0NFRETXhOQzQ1SURFek5DNDNRVGN1T1RjZ055NDVOeUF3SURBd016QXlJREUwTVhZM055NHpZekFnTkM0NUlESXVNeUE1TGpZZ05pNHhJREV5TGpac016WXdJREk0TVM0eExUTTJNQ0F5T0RFdU1XTXRNeTQ1SURNdE5pNHhJRGN1TnkwMkxqRWdNVEl1TmxZNE9ETmpNQ0EyTGpjZ055NDNJREV3TGpRZ01USXVPU0EyTGpOc05EVXdMamd0TXpVeUxqRmhNekV1T1RZZ016RXVPVFlnTUNBd01EQXROVEF1TkhvaUlDOCtQQzl6ZG1jKykgKi9cbnZhciBSZWZJY29uID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoUmlnaHRPdXRsaW5lZCk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBSZWZJY29uLmRpc3BsYXlOYW1lID0gJ1JpZ2h0T3V0bGluZWQnO1xufVxuZXhwb3J0IGRlZmF1bHQgUmVmSWNvbjsiLCAiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgUmlnaHRPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNzY1LjcgNDg2LjhMMzE0LjkgMTM0LjdBNy45NyA3Ljk3IDAgMDAzMDIgMTQxdjc3LjNjMCA0LjkgMi4zIDkuNiA2LjEgMTIuNmwzNjAgMjgxLjEtMzYwIDI4MS4xYy0zLjkgMy02LjEgNy43LTYuMSAxMi42Vjg4M2MwIDYuNyA3LjcgMTAuNCAxMi45IDYuM2w0NTAuOC0zNTIuMWEzMS45NiAzMS45NiAwIDAwMC01MC40elwiIH0gfV0gfSwgXCJuYW1lXCI6IFwicmlnaHRcIiwgXCJ0aGVtZVwiOiBcIm91dGxpbmVkXCIgfTtcbmV4cG9ydCBkZWZhdWx0IFJpZ2h0T3V0bGluZWQ7XG4iLCAiY29uc3QgZ2VuQ29sbGFwc2VNb3Rpb24gPSB0b2tlbiA9PiAoe1xuICBbdG9rZW4uY29tcG9uZW50Q2xzXToge1xuICAgIC8vIEZvciBjb21tb24vb3BlbkFuaW1hdGlvblxuICAgIFtgJHt0b2tlbi5hbnRDbHN9LW1vdGlvbi1jb2xsYXBzZS1sZWdhY3lgXToge1xuICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgJyYtYWN0aXZlJzoge1xuICAgICAgICB0cmFuc2l0aW9uOiBgaGVpZ2h0ICR7dG9rZW4ubW90aW9uRHVyYXRpb25NaWR9ICR7dG9rZW4ubW90aW9uRWFzZUluT3V0fSxcbiAgICAgICAgb3BhY2l0eSAke3Rva2VuLm1vdGlvbkR1cmF0aW9uTWlkfSAke3Rva2VuLm1vdGlvbkVhc2VJbk91dH0gIWltcG9ydGFudGBcbiAgICAgIH1cbiAgICB9LFxuICAgIFtgJHt0b2tlbi5hbnRDbHN9LW1vdGlvbi1jb2xsYXBzZWBdOiB7XG4gICAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgICB0cmFuc2l0aW9uOiBgaGVpZ2h0ICR7dG9rZW4ubW90aW9uRHVyYXRpb25NaWR9ICR7dG9rZW4ubW90aW9uRWFzZUluT3V0fSxcbiAgICAgICAgb3BhY2l0eSAke3Rva2VuLm1vdGlvbkR1cmF0aW9uTWlkfSAke3Rva2VuLm1vdGlvbkVhc2VJbk91dH0gIWltcG9ydGFudGBcbiAgICB9XG4gIH1cbn0pO1xuZXhwb3J0IGRlZmF1bHQgZ2VuQ29sbGFwc2VNb3Rpb247IiwgImNvbnN0IGluaXRNb3Rpb25Db21tb24gPSBkdXJhdGlvbiA9PiAoe1xuICBhbmltYXRpb25EdXJhdGlvbjogZHVyYXRpb24sXG4gIGFuaW1hdGlvbkZpbGxNb2RlOiAnYm90aCdcbn0pO1xuLy8gRklYTUU6IG9yaWdpbiBsZXNzIGNvZGUgc2VlbXMgc2FtZSBhcyBpbml0TW90aW9uQ29tbW9uLiBNYXliZSB3ZSBjYW4gc2FmZSByZW1vdmVcbmNvbnN0IGluaXRNb3Rpb25Db21tb25MZWF2ZSA9IGR1cmF0aW9uID0+ICh7XG4gIGFuaW1hdGlvbkR1cmF0aW9uOiBkdXJhdGlvbixcbiAgYW5pbWF0aW9uRmlsbE1vZGU6ICdib3RoJ1xufSk7XG5leHBvcnQgY29uc3QgaW5pdE1vdGlvbiA9IGZ1bmN0aW9uIChtb3Rpb25DbHMsIGluS2V5ZnJhbWVzLCBvdXRLZXlmcmFtZXMsIGR1cmF0aW9uKSB7XG4gIGxldCBzYW1lTGV2ZWwgPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IGZhbHNlO1xuICBjb25zdCBzYW1lTGV2ZWxQcmVmaXggPSBzYW1lTGV2ZWwgPyAnJicgOiAnJztcbiAgcmV0dXJuIHtcbiAgICBbYFxuICAgICAgJHtzYW1lTGV2ZWxQcmVmaXh9JHttb3Rpb25DbHN9LWVudGVyLFxuICAgICAgJHtzYW1lTGV2ZWxQcmVmaXh9JHttb3Rpb25DbHN9LWFwcGVhclxuICAgIGBdOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGluaXRNb3Rpb25Db21tb24oZHVyYXRpb24pKSwge1xuICAgICAgYW5pbWF0aW9uUGxheVN0YXRlOiAncGF1c2VkJ1xuICAgIH0pLFxuICAgIFtgJHtzYW1lTGV2ZWxQcmVmaXh9JHttb3Rpb25DbHN9LWxlYXZlYF06IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgaW5pdE1vdGlvbkNvbW1vbkxlYXZlKGR1cmF0aW9uKSksIHtcbiAgICAgIGFuaW1hdGlvblBsYXlTdGF0ZTogJ3BhdXNlZCdcbiAgICB9KSxcbiAgICBbYFxuICAgICAgJHtzYW1lTGV2ZWxQcmVmaXh9JHttb3Rpb25DbHN9LWVudGVyJHttb3Rpb25DbHN9LWVudGVyLWFjdGl2ZSxcbiAgICAgICR7c2FtZUxldmVsUHJlZml4fSR7bW90aW9uQ2xzfS1hcHBlYXIke21vdGlvbkNsc30tYXBwZWFyLWFjdGl2ZVxuICAgIGBdOiB7XG4gICAgICBhbmltYXRpb25OYW1lOiBpbktleWZyYW1lcyxcbiAgICAgIGFuaW1hdGlvblBsYXlTdGF0ZTogJ3J1bm5pbmcnXG4gICAgfSxcbiAgICBbYCR7c2FtZUxldmVsUHJlZml4fSR7bW90aW9uQ2xzfS1sZWF2ZSR7bW90aW9uQ2xzfS1sZWF2ZS1hY3RpdmVgXToge1xuICAgICAgYW5pbWF0aW9uTmFtZTogb3V0S2V5ZnJhbWVzLFxuICAgICAgYW5pbWF0aW9uUGxheVN0YXRlOiAncnVubmluZycsXG4gICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZSdcbiAgICB9XG4gIH07XG59OyIsICJpbXBvcnQgeyBLZXlmcmFtZXMgfSBmcm9tICdAYW50LWRlc2lnbi9jc3NpbmpzJztcbmltcG9ydCB7IGluaXRNb3Rpb24gfSBmcm9tICcuL21vdGlvbic7XG5leHBvcnQgY29uc3QgZmFkZUluID0gbmV3IEtleWZyYW1lcygnYW50RmFkZUluJywge1xuICAnMCUnOiB7XG4gICAgb3BhY2l0eTogMFxuICB9LFxuICAnMTAwJSc6IHtcbiAgICBvcGFjaXR5OiAxXG4gIH1cbn0pO1xuZXhwb3J0IGNvbnN0IGZhZGVPdXQgPSBuZXcgS2V5ZnJhbWVzKCdhbnRGYWRlT3V0Jywge1xuICAnMCUnOiB7XG4gICAgb3BhY2l0eTogMVxuICB9LFxuICAnMTAwJSc6IHtcbiAgICBvcGFjaXR5OiAwXG4gIH1cbn0pO1xuZXhwb3J0IGNvbnN0IGluaXRGYWRlTW90aW9uID0gZnVuY3Rpb24gKHRva2VuKSB7XG4gIGxldCBzYW1lTGV2ZWwgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuICBjb25zdCB7XG4gICAgYW50Q2xzXG4gIH0gPSB0b2tlbjtcbiAgY29uc3QgbW90aW9uQ2xzID0gYCR7YW50Q2xzfS1mYWRlYDtcbiAgY29uc3Qgc2FtZUxldmVsUHJlZml4ID0gc2FtZUxldmVsID8gJyYnIDogJyc7XG4gIHJldHVybiBbaW5pdE1vdGlvbihtb3Rpb25DbHMsIGZhZGVJbiwgZmFkZU91dCwgdG9rZW4ubW90aW9uRHVyYXRpb25NaWQsIHNhbWVMZXZlbCksIHtcbiAgICBbYFxuICAgICAgICAke3NhbWVMZXZlbFByZWZpeH0ke21vdGlvbkNsc30tZW50ZXIsXG4gICAgICAgICR7c2FtZUxldmVsUHJlZml4fSR7bW90aW9uQ2xzfS1hcHBlYXJcbiAgICAgIGBdOiB7XG4gICAgICBvcGFjaXR5OiAwLFxuICAgICAgYW5pbWF0aW9uVGltaW5nRnVuY3Rpb246ICdsaW5lYXInXG4gICAgfSxcbiAgICBbYCR7c2FtZUxldmVsUHJlZml4fSR7bW90aW9uQ2xzfS1sZWF2ZWBdOiB7XG4gICAgICBhbmltYXRpb25UaW1pbmdGdW5jdGlvbjogJ2xpbmVhcidcbiAgICB9XG4gIH1dO1xufTsiLCAiaW1wb3J0IHsgS2V5ZnJhbWVzIH0gZnJvbSAnQGFudC1kZXNpZ24vY3NzaW5qcyc7XG5pbXBvcnQgeyBpbml0TW90aW9uIH0gZnJvbSAnLi9tb3Rpb24nO1xuZXhwb3J0IGNvbnN0IG1vdmVEb3duSW4gPSBuZXcgS2V5ZnJhbWVzKCdhbnRNb3ZlRG93bkluJywge1xuICAnMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMTAwJSwgMCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzAgMCcsXG4gICAgb3BhY2l0eTogMFxuICB9LFxuICAnMTAwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCAwJyxcbiAgICBvcGFjaXR5OiAxXG4gIH1cbn0pO1xuZXhwb3J0IGNvbnN0IG1vdmVEb3duT3V0ID0gbmV3IEtleWZyYW1lcygnYW50TW92ZURvd25PdXQnLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCAwJyxcbiAgICBvcGFjaXR5OiAxXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDEwMCUsIDApJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcwIDAnLFxuICAgIG9wYWNpdHk6IDBcbiAgfVxufSk7XG5leHBvcnQgY29uc3QgbW92ZUxlZnRJbiA9IG5ldyBLZXlmcmFtZXMoJ2FudE1vdmVMZWZ0SW4nLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgtMTAwJSwgMCwgMCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzAgMCcsXG4gICAgb3BhY2l0eTogMFxuICB9LFxuICAnMTAwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCAwJyxcbiAgICBvcGFjaXR5OiAxXG4gIH1cbn0pO1xuZXhwb3J0IGNvbnN0IG1vdmVMZWZ0T3V0ID0gbmV3IEtleWZyYW1lcygnYW50TW92ZUxlZnRPdXQnLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCAwJyxcbiAgICBvcGFjaXR5OiAxXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKC0xMDAlLCAwLCAwKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCAwJyxcbiAgICBvcGFjaXR5OiAwXG4gIH1cbn0pO1xuZXhwb3J0IGNvbnN0IG1vdmVSaWdodEluID0gbmV3IEtleWZyYW1lcygnYW50TW92ZVJpZ2h0SW4nLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgxMDAlLCAwLCAwKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCAwJyxcbiAgICBvcGFjaXR5OiAwXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcwIDAnLFxuICAgIG9wYWNpdHk6IDFcbiAgfVxufSk7XG5leHBvcnQgY29uc3QgbW92ZVJpZ2h0T3V0ID0gbmV3IEtleWZyYW1lcygnYW50TW92ZVJpZ2h0T3V0Jywge1xuICAnMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzAgMCcsXG4gICAgb3BhY2l0eTogMVxuICB9LFxuICAnMTAwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgxMDAlLCAwLCAwKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCAwJyxcbiAgICBvcGFjaXR5OiAwXG4gIH1cbn0pO1xuZXhwb3J0IGNvbnN0IG1vdmVVcEluID0gbmV3IEtleWZyYW1lcygnYW50TW92ZVVwSW4nLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAtMTAwJSwgMCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzAgMCcsXG4gICAgb3BhY2l0eTogMFxuICB9LFxuICAnMTAwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCAwJyxcbiAgICBvcGFjaXR5OiAxXG4gIH1cbn0pO1xuZXhwb3J0IGNvbnN0IG1vdmVVcE91dCA9IG5ldyBLZXlmcmFtZXMoJ2FudE1vdmVVcE91dCcsIHtcbiAgJzAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcwIDAnLFxuICAgIG9wYWNpdHk6IDFcbiAgfSxcbiAgJzEwMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgLTEwMCUsIDApJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcwIDAnLFxuICAgIG9wYWNpdHk6IDBcbiAgfVxufSk7XG5jb25zdCBtb3ZlTW90aW9uID0ge1xuICAnbW92ZS11cCc6IHtcbiAgICBpbktleWZyYW1lczogbW92ZVVwSW4sXG4gICAgb3V0S2V5ZnJhbWVzOiBtb3ZlVXBPdXRcbiAgfSxcbiAgJ21vdmUtZG93bic6IHtcbiAgICBpbktleWZyYW1lczogbW92ZURvd25JbixcbiAgICBvdXRLZXlmcmFtZXM6IG1vdmVEb3duT3V0XG4gIH0sXG4gICdtb3ZlLWxlZnQnOiB7XG4gICAgaW5LZXlmcmFtZXM6IG1vdmVMZWZ0SW4sXG4gICAgb3V0S2V5ZnJhbWVzOiBtb3ZlTGVmdE91dFxuICB9LFxuICAnbW92ZS1yaWdodCc6IHtcbiAgICBpbktleWZyYW1lczogbW92ZVJpZ2h0SW4sXG4gICAgb3V0S2V5ZnJhbWVzOiBtb3ZlUmlnaHRPdXRcbiAgfVxufTtcbmV4cG9ydCBjb25zdCBpbml0TW92ZU1vdGlvbiA9ICh0b2tlbiwgbW90aW9uTmFtZSkgPT4ge1xuICBjb25zdCB7XG4gICAgYW50Q2xzXG4gIH0gPSB0b2tlbjtcbiAgY29uc3QgbW90aW9uQ2xzID0gYCR7YW50Q2xzfS0ke21vdGlvbk5hbWV9YDtcbiAgY29uc3Qge1xuICAgIGluS2V5ZnJhbWVzLFxuICAgIG91dEtleWZyYW1lc1xuICB9ID0gbW92ZU1vdGlvblttb3Rpb25OYW1lXTtcbiAgcmV0dXJuIFtpbml0TW90aW9uKG1vdGlvbkNscywgaW5LZXlmcmFtZXMsIG91dEtleWZyYW1lcywgdG9rZW4ubW90aW9uRHVyYXRpb25NaWQpLCB7XG4gICAgW2BcbiAgICAgICAgJHttb3Rpb25DbHN9LWVudGVyLFxuICAgICAgICAke21vdGlvbkNsc30tYXBwZWFyXG4gICAgICBgXToge1xuICAgICAgb3BhY2l0eTogMCxcbiAgICAgIGFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uOiB0b2tlbi5tb3Rpb25FYXNlT3V0Q2lyY1xuICAgIH0sXG4gICAgW2Ake21vdGlvbkNsc30tbGVhdmVgXToge1xuICAgICAgYW5pbWF0aW9uVGltaW5nRnVuY3Rpb246IHRva2VuLm1vdGlvbkVhc2VJbk91dENpcmNcbiAgICB9XG4gIH1dO1xufTsiLCAiaW1wb3J0IHsgS2V5ZnJhbWVzIH0gZnJvbSAnQGFudC1kZXNpZ24vY3NzaW5qcyc7XG5pbXBvcnQgeyBpbml0TW90aW9uIH0gZnJvbSAnLi9tb3Rpb24nO1xuZXhwb3J0IGNvbnN0IHNsaWRlVXBJbiA9IG5ldyBLZXlmcmFtZXMoJ2FudFNsaWRlVXBJbicsIHtcbiAgJzAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlWSgwLjgpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcwJSAwJScsXG4gICAgb3BhY2l0eTogMFxuICB9LFxuICAnMTAwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZVkoMSknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzAlIDAlJyxcbiAgICBvcGFjaXR5OiAxXG4gIH1cbn0pO1xuZXhwb3J0IGNvbnN0IHNsaWRlVXBPdXQgPSBuZXcgS2V5ZnJhbWVzKCdhbnRTbGlkZVVwT3V0Jywge1xuICAnMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGVZKDEpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcwJSAwJScsXG4gICAgb3BhY2l0eTogMVxuICB9LFxuICAnMTAwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZVkoMC44KScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCUgMCUnLFxuICAgIG9wYWNpdHk6IDBcbiAgfVxufSk7XG5leHBvcnQgY29uc3Qgc2xpZGVEb3duSW4gPSBuZXcgS2V5ZnJhbWVzKCdhbnRTbGlkZURvd25JbicsIHtcbiAgJzAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlWSgwLjgpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcxMDAlIDEwMCUnLFxuICAgIG9wYWNpdHk6IDBcbiAgfSxcbiAgJzEwMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGVZKDEpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcxMDAlIDEwMCUnLFxuICAgIG9wYWNpdHk6IDFcbiAgfVxufSk7XG5leHBvcnQgY29uc3Qgc2xpZGVEb3duT3V0ID0gbmV3IEtleWZyYW1lcygnYW50U2xpZGVEb3duT3V0Jywge1xuICAnMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGVZKDEpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcxMDAlIDEwMCUnLFxuICAgIG9wYWNpdHk6IDFcbiAgfSxcbiAgJzEwMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGVZKDAuOCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzEwMCUgMTAwJScsXG4gICAgb3BhY2l0eTogMFxuICB9XG59KTtcbmV4cG9ydCBjb25zdCBzbGlkZUxlZnRJbiA9IG5ldyBLZXlmcmFtZXMoJ2FudFNsaWRlTGVmdEluJywge1xuICAnMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGVYKDAuOCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzAlIDAlJyxcbiAgICBvcGFjaXR5OiAwXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlWCgxKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCUgMCUnLFxuICAgIG9wYWNpdHk6IDFcbiAgfVxufSk7XG5leHBvcnQgY29uc3Qgc2xpZGVMZWZ0T3V0ID0gbmV3IEtleWZyYW1lcygnYW50U2xpZGVMZWZ0T3V0Jywge1xuICAnMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGVYKDEpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcwJSAwJScsXG4gICAgb3BhY2l0eTogMVxuICB9LFxuICAnMTAwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZVgoMC44KScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCUgMCUnLFxuICAgIG9wYWNpdHk6IDBcbiAgfVxufSk7XG5leHBvcnQgY29uc3Qgc2xpZGVSaWdodEluID0gbmV3IEtleWZyYW1lcygnYW50U2xpZGVSaWdodEluJywge1xuICAnMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGVYKDAuOCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzEwMCUgMCUnLFxuICAgIG9wYWNpdHk6IDBcbiAgfSxcbiAgJzEwMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGVYKDEpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcxMDAlIDAlJyxcbiAgICBvcGFjaXR5OiAxXG4gIH1cbn0pO1xuZXhwb3J0IGNvbnN0IHNsaWRlUmlnaHRPdXQgPSBuZXcgS2V5ZnJhbWVzKCdhbnRTbGlkZVJpZ2h0T3V0Jywge1xuICAnMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGVYKDEpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcxMDAlIDAlJyxcbiAgICBvcGFjaXR5OiAxXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlWCgwLjgpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcxMDAlIDAlJyxcbiAgICBvcGFjaXR5OiAwXG4gIH1cbn0pO1xuY29uc3Qgc2xpZGVNb3Rpb24gPSB7XG4gICdzbGlkZS11cCc6IHtcbiAgICBpbktleWZyYW1lczogc2xpZGVVcEluLFxuICAgIG91dEtleWZyYW1lczogc2xpZGVVcE91dFxuICB9LFxuICAnc2xpZGUtZG93bic6IHtcbiAgICBpbktleWZyYW1lczogc2xpZGVEb3duSW4sXG4gICAgb3V0S2V5ZnJhbWVzOiBzbGlkZURvd25PdXRcbiAgfSxcbiAgJ3NsaWRlLWxlZnQnOiB7XG4gICAgaW5LZXlmcmFtZXM6IHNsaWRlTGVmdEluLFxuICAgIG91dEtleWZyYW1lczogc2xpZGVMZWZ0T3V0XG4gIH0sXG4gICdzbGlkZS1yaWdodCc6IHtcbiAgICBpbktleWZyYW1lczogc2xpZGVSaWdodEluLFxuICAgIG91dEtleWZyYW1lczogc2xpZGVSaWdodE91dFxuICB9XG59O1xuZXhwb3J0IGNvbnN0IGluaXRTbGlkZU1vdGlvbiA9ICh0b2tlbiwgbW90aW9uTmFtZSkgPT4ge1xuICBjb25zdCB7XG4gICAgYW50Q2xzXG4gIH0gPSB0b2tlbjtcbiAgY29uc3QgbW90aW9uQ2xzID0gYCR7YW50Q2xzfS0ke21vdGlvbk5hbWV9YDtcbiAgY29uc3Qge1xuICAgIGluS2V5ZnJhbWVzLFxuICAgIG91dEtleWZyYW1lc1xuICB9ID0gc2xpZGVNb3Rpb25bbW90aW9uTmFtZV07XG4gIHJldHVybiBbaW5pdE1vdGlvbihtb3Rpb25DbHMsIGluS2V5ZnJhbWVzLCBvdXRLZXlmcmFtZXMsIHRva2VuLm1vdGlvbkR1cmF0aW9uTWlkKSwge1xuICAgIFtgXG4gICAgICAke21vdGlvbkNsc30tZW50ZXIsXG4gICAgICAke21vdGlvbkNsc30tYXBwZWFyXG4gICAgYF06IHtcbiAgICAgIHRyYW5zZm9ybTogJ3NjYWxlKDApJyxcbiAgICAgIHRyYW5zZm9ybU9yaWdpbjogJzAlIDAlJyxcbiAgICAgIG9wYWNpdHk6IDAsXG4gICAgICBhbmltYXRpb25UaW1pbmdGdW5jdGlvbjogdG9rZW4ubW90aW9uRWFzZU91dFF1aW50LFxuICAgICAgJyYtcHJlcGFyZSc6IHtcbiAgICAgICAgdHJhbnNmb3JtOiAnc2NhbGUoMSknXG4gICAgICB9XG4gICAgfSxcbiAgICBbYCR7bW90aW9uQ2xzfS1sZWF2ZWBdOiB7XG4gICAgICBhbmltYXRpb25UaW1pbmdGdW5jdGlvbjogdG9rZW4ubW90aW9uRWFzZUluUXVpbnRcbiAgICB9XG4gIH1dO1xufTsiLCAiaW1wb3J0IHsgS2V5ZnJhbWVzIH0gZnJvbSAnQGFudC1kZXNpZ24vY3NzaW5qcyc7XG5pbXBvcnQgeyBpbml0TW90aW9uIH0gZnJvbSAnLi9tb3Rpb24nO1xuZXhwb3J0IGNvbnN0IHpvb21JbiA9IG5ldyBLZXlmcmFtZXMoJ2FudFpvb21JbicsIHtcbiAgJzAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDAuMiknLFxuICAgIG9wYWNpdHk6IDBcbiAgfSxcbiAgJzEwMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGUoMSknLFxuICAgIG9wYWNpdHk6IDFcbiAgfVxufSk7XG5leHBvcnQgY29uc3Qgem9vbU91dCA9IG5ldyBLZXlmcmFtZXMoJ2FudFpvb21PdXQnLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgxKSdcbiAgfSxcbiAgJzEwMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGUoMC4yKScsXG4gICAgb3BhY2l0eTogMFxuICB9XG59KTtcbmV4cG9ydCBjb25zdCB6b29tQmlnSW4gPSBuZXcgS2V5ZnJhbWVzKCdhbnRab29tQmlnSW4nLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgwLjgpJyxcbiAgICBvcGFjaXR5OiAwXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDEpJyxcbiAgICBvcGFjaXR5OiAxXG4gIH1cbn0pO1xuZXhwb3J0IGNvbnN0IHpvb21CaWdPdXQgPSBuZXcgS2V5ZnJhbWVzKCdhbnRab29tQmlnT3V0Jywge1xuICAnMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGUoMSknXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDAuOCknLFxuICAgIG9wYWNpdHk6IDBcbiAgfVxufSk7XG5leHBvcnQgY29uc3Qgem9vbVVwSW4gPSBuZXcgS2V5ZnJhbWVzKCdhbnRab29tVXBJbicsIHtcbiAgJzAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDAuOCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzUwJSAwJScsXG4gICAgb3BhY2l0eTogMFxuICB9LFxuICAnMTAwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgxKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnNTAlIDAlJ1xuICB9XG59KTtcbmV4cG9ydCBjb25zdCB6b29tVXBPdXQgPSBuZXcgS2V5ZnJhbWVzKCdhbnRab29tVXBPdXQnLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgxKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnNTAlIDAlJ1xuICB9LFxuICAnMTAwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgwLjgpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICc1MCUgMCUnLFxuICAgIG9wYWNpdHk6IDBcbiAgfVxufSk7XG5leHBvcnQgY29uc3Qgem9vbUxlZnRJbiA9IG5ldyBLZXlmcmFtZXMoJ2FudFpvb21MZWZ0SW4nLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgwLjgpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcwJSA1MCUnLFxuICAgIG9wYWNpdHk6IDBcbiAgfSxcbiAgJzEwMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGUoMSknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzAlIDUwJSdcbiAgfVxufSk7XG5leHBvcnQgY29uc3Qgem9vbUxlZnRPdXQgPSBuZXcgS2V5ZnJhbWVzKCdhbnRab29tTGVmdE91dCcsIHtcbiAgJzAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDEpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcwJSA1MCUnXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDAuOCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzAlIDUwJScsXG4gICAgb3BhY2l0eTogMFxuICB9XG59KTtcbmV4cG9ydCBjb25zdCB6b29tUmlnaHRJbiA9IG5ldyBLZXlmcmFtZXMoJ2FudFpvb21SaWdodEluJywge1xuICAnMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGUoMC44KScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMTAwJSA1MCUnLFxuICAgIG9wYWNpdHk6IDBcbiAgfSxcbiAgJzEwMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGUoMSknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzEwMCUgNTAlJ1xuICB9XG59KTtcbmV4cG9ydCBjb25zdCB6b29tUmlnaHRPdXQgPSBuZXcgS2V5ZnJhbWVzKCdhbnRab29tUmlnaHRPdXQnLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgxKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMTAwJSA1MCUnXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDAuOCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzEwMCUgNTAlJyxcbiAgICBvcGFjaXR5OiAwXG4gIH1cbn0pO1xuZXhwb3J0IGNvbnN0IHpvb21Eb3duSW4gPSBuZXcgS2V5ZnJhbWVzKCdhbnRab29tRG93bkluJywge1xuICAnMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGUoMC44KScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnNTAlIDEwMCUnLFxuICAgIG9wYWNpdHk6IDBcbiAgfSxcbiAgJzEwMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGUoMSknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzUwJSAxMDAlJ1xuICB9XG59KTtcbmV4cG9ydCBjb25zdCB6b29tRG93bk91dCA9IG5ldyBLZXlmcmFtZXMoJ2FudFpvb21Eb3duT3V0Jywge1xuICAnMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGUoMSknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzUwJSAxMDAlJ1xuICB9LFxuICAnMTAwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgwLjgpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICc1MCUgMTAwJScsXG4gICAgb3BhY2l0eTogMFxuICB9XG59KTtcbmNvbnN0IHpvb21Nb3Rpb24gPSB7XG4gIHpvb206IHtcbiAgICBpbktleWZyYW1lczogem9vbUluLFxuICAgIG91dEtleWZyYW1lczogem9vbU91dFxuICB9LFxuICAnem9vbS1iaWcnOiB7XG4gICAgaW5LZXlmcmFtZXM6IHpvb21CaWdJbixcbiAgICBvdXRLZXlmcmFtZXM6IHpvb21CaWdPdXRcbiAgfSxcbiAgJ3pvb20tYmlnLWZhc3QnOiB7XG4gICAgaW5LZXlmcmFtZXM6IHpvb21CaWdJbixcbiAgICBvdXRLZXlmcmFtZXM6IHpvb21CaWdPdXRcbiAgfSxcbiAgJ3pvb20tbGVmdCc6IHtcbiAgICBpbktleWZyYW1lczogem9vbUxlZnRJbixcbiAgICBvdXRLZXlmcmFtZXM6IHpvb21MZWZ0T3V0XG4gIH0sXG4gICd6b29tLXJpZ2h0Jzoge1xuICAgIGluS2V5ZnJhbWVzOiB6b29tUmlnaHRJbixcbiAgICBvdXRLZXlmcmFtZXM6IHpvb21SaWdodE91dFxuICB9LFxuICAnem9vbS11cCc6IHtcbiAgICBpbktleWZyYW1lczogem9vbVVwSW4sXG4gICAgb3V0S2V5ZnJhbWVzOiB6b29tVXBPdXRcbiAgfSxcbiAgJ3pvb20tZG93bic6IHtcbiAgICBpbktleWZyYW1lczogem9vbURvd25JbixcbiAgICBvdXRLZXlmcmFtZXM6IHpvb21Eb3duT3V0XG4gIH1cbn07XG5leHBvcnQgY29uc3QgaW5pdFpvb21Nb3Rpb24gPSAodG9rZW4sIG1vdGlvbk5hbWUpID0+IHtcbiAgY29uc3Qge1xuICAgIGFudENsc1xuICB9ID0gdG9rZW47XG4gIGNvbnN0IG1vdGlvbkNscyA9IGAke2FudENsc30tJHttb3Rpb25OYW1lfWA7XG4gIGNvbnN0IHtcbiAgICBpbktleWZyYW1lcyxcbiAgICBvdXRLZXlmcmFtZXNcbiAgfSA9IHpvb21Nb3Rpb25bbW90aW9uTmFtZV07XG4gIHJldHVybiBbaW5pdE1vdGlvbihtb3Rpb25DbHMsIGluS2V5ZnJhbWVzLCBvdXRLZXlmcmFtZXMsIG1vdGlvbk5hbWUgPT09ICd6b29tLWJpZy1mYXN0JyA/IHRva2VuLm1vdGlvbkR1cmF0aW9uRmFzdCA6IHRva2VuLm1vdGlvbkR1cmF0aW9uTWlkKSwge1xuICAgIFtgXG4gICAgICAgICR7bW90aW9uQ2xzfS1lbnRlcixcbiAgICAgICAgJHttb3Rpb25DbHN9LWFwcGVhclxuICAgICAgYF06IHtcbiAgICAgIHRyYW5zZm9ybTogJ3NjYWxlKDApJyxcbiAgICAgIG9wYWNpdHk6IDAsXG4gICAgICBhbmltYXRpb25UaW1pbmdGdW5jdGlvbjogdG9rZW4ubW90aW9uRWFzZU91dENpcmMsXG4gICAgICAnJi1wcmVwYXJlJzoge1xuICAgICAgICB0cmFuc2Zvcm06ICdub25lJ1xuICAgICAgfVxuICAgIH0sXG4gICAgW2Ake21vdGlvbkNsc30tbGVhdmVgXToge1xuICAgICAgYW5pbWF0aW9uVGltaW5nRnVuY3Rpb246IHRva2VuLm1vdGlvbkVhc2VJbk91dENpcmNcbiAgICB9XG4gIH1dO1xufTsiLCAiaW1wb3J0IHsgdW5pdCB9IGZyb20gJ0BhbnQtZGVzaWduL2Nzc2luanMnO1xuaW1wb3J0IHsgQWdncmVnYXRpb25Db2xvciB9IGZyb20gJy4uLy4uL2NvbG9yLXBpY2tlci9jb2xvcic7XG5pbXBvcnQgeyBpc0JyaWdodCB9IGZyb20gJy4uLy4uL2NvbG9yLXBpY2tlci9jb21wb25lbnRzL0NvbG9yUHJlc2V0cyc7XG5pbXBvcnQgeyBnZXRMaW5lSGVpZ2h0LCBtZXJnZVRva2VuIH0gZnJvbSAnLi4vLi4vdGhlbWUvaW50ZXJuYWwnO1xuaW1wb3J0IHsgUHJlc2V0Q29sb3JzIH0gZnJvbSAnLi4vLi4vdGhlbWUvaW50ZXJmYWNlJztcbmltcG9ydCBnZXRBbHBoYUNvbG9yIGZyb20gJy4uLy4uL3RoZW1lL3V0aWwvZ2V0QWxwaGFDb2xvcic7XG5leHBvcnQgY29uc3QgcHJlcGFyZVRva2VuID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgcGFkZGluZ0lubGluZSxcbiAgICBvbmx5SWNvblNpemVcbiAgfSA9IHRva2VuO1xuICBjb25zdCBidXR0b25Ub2tlbiA9IG1lcmdlVG9rZW4odG9rZW4sIHtcbiAgICBidXR0b25QYWRkaW5nSG9yaXpvbnRhbDogcGFkZGluZ0lubGluZSxcbiAgICBidXR0b25QYWRkaW5nVmVydGljYWw6IDAsXG4gICAgYnV0dG9uSWNvbk9ubHlGb250U2l6ZTogb25seUljb25TaXplXG4gIH0pO1xuICByZXR1cm4gYnV0dG9uVG9rZW47XG59O1xuZXhwb3J0IGNvbnN0IHByZXBhcmVDb21wb25lbnRUb2tlbiA9IHRva2VuID0+IHtcbiAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2Y7XG4gIGNvbnN0IGNvbnRlbnRGb250U2l6ZSA9IChfYSA9IHRva2VuLmNvbnRlbnRGb250U2l6ZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdG9rZW4uZm9udFNpemU7XG4gIGNvbnN0IGNvbnRlbnRGb250U2l6ZVNNID0gKF9iID0gdG9rZW4uY29udGVudEZvbnRTaXplU00pICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHRva2VuLmZvbnRTaXplO1xuICBjb25zdCBjb250ZW50Rm9udFNpemVMRyA9IChfYyA9IHRva2VuLmNvbnRlbnRGb250U2l6ZUxHKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiB0b2tlbi5mb250U2l6ZUxHO1xuICBjb25zdCBjb250ZW50TGluZUhlaWdodCA9IChfZCA9IHRva2VuLmNvbnRlbnRMaW5lSGVpZ2h0KSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBnZXRMaW5lSGVpZ2h0KGNvbnRlbnRGb250U2l6ZSk7XG4gIGNvbnN0IGNvbnRlbnRMaW5lSGVpZ2h0U00gPSAoX2UgPSB0b2tlbi5jb250ZW50TGluZUhlaWdodFNNKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiBnZXRMaW5lSGVpZ2h0KGNvbnRlbnRGb250U2l6ZVNNKTtcbiAgY29uc3QgY29udGVudExpbmVIZWlnaHRMRyA9IChfZiA9IHRva2VuLmNvbnRlbnRMaW5lSGVpZ2h0TEcpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IGdldExpbmVIZWlnaHQoY29udGVudEZvbnRTaXplTEcpO1xuICBjb25zdCBzb2xpZFRleHRDb2xvciA9IGlzQnJpZ2h0KG5ldyBBZ2dyZWdhdGlvbkNvbG9yKHRva2VuLmNvbG9yQmdTb2xpZCksICcjZmZmJykgPyAnIzAwMCcgOiAnI2ZmZic7XG4gIGNvbnN0IHNoYWRvd0NvbG9yVG9rZW5zID0gUHJlc2V0Q29sb3JzLnJlZHVjZSgocHJldiwgY29sb3JLZXkpID0+IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHtcbiAgICBbYCR7Y29sb3JLZXl9U2hhZG93Q29sb3JgXTogYDAgJHt1bml0KHRva2VuLmNvbnRyb2xPdXRsaW5lV2lkdGgpfSAwICR7Z2V0QWxwaGFDb2xvcih0b2tlbltgJHtjb2xvcktleX0xYF0sIHRva2VuLmNvbG9yQmdDb250YWluZXIpfWBcbiAgfSksIHt9KTtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc2hhZG93Q29sb3JUb2tlbnMpLCB7XG4gICAgZm9udFdlaWdodDogNDAwLFxuICAgIGRlZmF1bHRTaGFkb3c6IGAwICR7dG9rZW4uY29udHJvbE91dGxpbmVXaWR0aH1weCAwICR7dG9rZW4uY29udHJvbFRtcE91dGxpbmV9YCxcbiAgICBwcmltYXJ5U2hhZG93OiBgMCAke3Rva2VuLmNvbnRyb2xPdXRsaW5lV2lkdGh9cHggMCAke3Rva2VuLmNvbnRyb2xPdXRsaW5lfWAsXG4gICAgZGFuZ2VyU2hhZG93OiBgMCAke3Rva2VuLmNvbnRyb2xPdXRsaW5lV2lkdGh9cHggMCAke3Rva2VuLmNvbG9yRXJyb3JPdXRsaW5lfWAsXG4gICAgcHJpbWFyeUNvbG9yOiB0b2tlbi5jb2xvclRleHRMaWdodFNvbGlkLFxuICAgIGRhbmdlckNvbG9yOiB0b2tlbi5jb2xvclRleHRMaWdodFNvbGlkLFxuICAgIGJvcmRlckNvbG9yRGlzYWJsZWQ6IHRva2VuLmNvbG9yQm9yZGVyLFxuICAgIGRlZmF1bHRHaG9zdENvbG9yOiB0b2tlbi5jb2xvckJnQ29udGFpbmVyLFxuICAgIGdob3N0Qmc6ICd0cmFuc3BhcmVudCcsXG4gICAgZGVmYXVsdEdob3N0Qm9yZGVyQ29sb3I6IHRva2VuLmNvbG9yQmdDb250YWluZXIsXG4gICAgcGFkZGluZ0lubGluZTogdG9rZW4ucGFkZGluZ0NvbnRlbnRIb3Jpem9udGFsIC0gdG9rZW4ubGluZVdpZHRoLFxuICAgIHBhZGRpbmdJbmxpbmVMRzogdG9rZW4ucGFkZGluZ0NvbnRlbnRIb3Jpem9udGFsIC0gdG9rZW4ubGluZVdpZHRoLFxuICAgIHBhZGRpbmdJbmxpbmVTTTogOCAtIHRva2VuLmxpbmVXaWR0aCxcbiAgICBvbmx5SWNvblNpemU6ICdpbmhlcml0JyxcbiAgICBvbmx5SWNvblNpemVTTTogJ2luaGVyaXQnLFxuICAgIG9ubHlJY29uU2l6ZUxHOiAnaW5oZXJpdCcsXG4gICAgZ3JvdXBCb3JkZXJDb2xvcjogdG9rZW4uY29sb3JQcmltYXJ5SG92ZXIsXG4gICAgbGlua0hvdmVyQmc6ICd0cmFuc3BhcmVudCcsXG4gICAgdGV4dFRleHRDb2xvcjogdG9rZW4uY29sb3JUZXh0LFxuICAgIHRleHRUZXh0SG92ZXJDb2xvcjogdG9rZW4uY29sb3JUZXh0LFxuICAgIHRleHRUZXh0QWN0aXZlQ29sb3I6IHRva2VuLmNvbG9yVGV4dCxcbiAgICB0ZXh0SG92ZXJCZzogdG9rZW4uY29sb3JGaWxsVGVydGlhcnksXG4gICAgZGVmYXVsdENvbG9yOiB0b2tlbi5jb2xvclRleHQsXG4gICAgZGVmYXVsdEJnOiB0b2tlbi5jb2xvckJnQ29udGFpbmVyLFxuICAgIGRlZmF1bHRCb3JkZXJDb2xvcjogdG9rZW4uY29sb3JCb3JkZXIsXG4gICAgZGVmYXVsdEJvcmRlckNvbG9yRGlzYWJsZWQ6IHRva2VuLmNvbG9yQm9yZGVyLFxuICAgIGRlZmF1bHRIb3ZlckJnOiB0b2tlbi5jb2xvckJnQ29udGFpbmVyLFxuICAgIGRlZmF1bHRIb3ZlckNvbG9yOiB0b2tlbi5jb2xvclByaW1hcnlIb3ZlcixcbiAgICBkZWZhdWx0SG92ZXJCb3JkZXJDb2xvcjogdG9rZW4uY29sb3JQcmltYXJ5SG92ZXIsXG4gICAgZGVmYXVsdEFjdGl2ZUJnOiB0b2tlbi5jb2xvckJnQ29udGFpbmVyLFxuICAgIGRlZmF1bHRBY3RpdmVDb2xvcjogdG9rZW4uY29sb3JQcmltYXJ5QWN0aXZlLFxuICAgIGRlZmF1bHRBY3RpdmVCb3JkZXJDb2xvcjogdG9rZW4uY29sb3JQcmltYXJ5QWN0aXZlLFxuICAgIHNvbGlkVGV4dENvbG9yLFxuICAgIGNvbnRlbnRGb250U2l6ZSxcbiAgICBjb250ZW50Rm9udFNpemVTTSxcbiAgICBjb250ZW50Rm9udFNpemVMRyxcbiAgICBjb250ZW50TGluZUhlaWdodCxcbiAgICBjb250ZW50TGluZUhlaWdodFNNLFxuICAgIGNvbnRlbnRMaW5lSGVpZ2h0TEcsXG4gICAgcGFkZGluZ0Jsb2NrOiBNYXRoLm1heCgodG9rZW4uY29udHJvbEhlaWdodCAtIGNvbnRlbnRGb250U2l6ZSAqIGNvbnRlbnRMaW5lSGVpZ2h0KSAvIDIgLSB0b2tlbi5saW5lV2lkdGgsIDApLFxuICAgIHBhZGRpbmdCbG9ja1NNOiBNYXRoLm1heCgodG9rZW4uY29udHJvbEhlaWdodFNNIC0gY29udGVudEZvbnRTaXplU00gKiBjb250ZW50TGluZUhlaWdodFNNKSAvIDIgLSB0b2tlbi5saW5lV2lkdGgsIDApLFxuICAgIHBhZGRpbmdCbG9ja0xHOiBNYXRoLm1heCgodG9rZW4uY29udHJvbEhlaWdodExHIC0gY29udGVudEZvbnRTaXplTEcgKiBjb250ZW50TGluZUhlaWdodExHKSAvIDIgLSB0b2tlbi5saW5lV2lkdGgsIDApXG4gIH0pO1xufTsiLCAiaW1wb3J0IHsgdW5pdCB9IGZyb20gJ0BhbnQtZGVzaWduL2Nzc2luanMnO1xuaW1wb3J0IHsgZ2VuRm9jdXNTdHlsZSwgcmVzZXRJY29uIH0gZnJvbSAnLi4vLi4vc3R5bGUnO1xuaW1wb3J0IHsgUHJlc2V0Q29sb3JzIH0gZnJvbSAnLi4vLi4vdGhlbWUvaW50ZXJmYWNlJztcbmltcG9ydCB7IGdlblN0eWxlSG9va3MsIG1lcmdlVG9rZW4gfSBmcm9tICcuLi8uLi90aGVtZS9pbnRlcm5hbCc7XG5pbXBvcnQgZ2VuR3JvdXBTdHlsZSBmcm9tICcuL2dyb3VwJztcbmltcG9ydCB7IHByZXBhcmVDb21wb25lbnRUb2tlbiwgcHJlcGFyZVRva2VuIH0gZnJvbSAnLi90b2tlbic7XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU2hhcmVkID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuY29uc3QgZ2VuU2hhcmVkQnV0dG9uU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHMsXG4gICAgaWNvbkNscyxcbiAgICBmb250V2VpZ2h0LFxuICAgIG9wYWNpdHlMb2FkaW5nLFxuICAgIG1vdGlvbkR1cmF0aW9uU2xvdyxcbiAgICBtb3Rpb25FYXNlSW5PdXQsXG4gICAgbWFyZ2luWFMsXG4gICAgY2FsY1xuICB9ID0gdG9rZW47XG4gIHJldHVybiB7XG4gICAgW2NvbXBvbmVudENsc106IHtcbiAgICAgIG91dGxpbmU6ICdub25lJyxcbiAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgZGlzcGxheTogJ2lubGluZS1mbGV4JyxcbiAgICAgIGdhcDogdG9rZW4ubWFyZ2luWFMsXG4gICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJyxcbiAgICAgIGZvbnRXZWlnaHQsXG4gICAgICB3aGl0ZVNwYWNlOiAnbm93cmFwJyxcbiAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICBiYWNrZ3JvdW5kSW1hZ2U6ICdub25lJyxcbiAgICAgIGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCcsXG4gICAgICBib3JkZXI6IGAke3VuaXQodG9rZW4ubGluZVdpZHRoKX0gJHt0b2tlbi5saW5lVHlwZX0gdHJhbnNwYXJlbnRgLFxuICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgICB0cmFuc2l0aW9uOiBgYWxsICR7dG9rZW4ubW90aW9uRHVyYXRpb25NaWR9ICR7dG9rZW4ubW90aW9uRWFzZUluT3V0fWAsXG4gICAgICB1c2VyU2VsZWN0OiAnbm9uZScsXG4gICAgICB0b3VjaEFjdGlvbjogJ21hbmlwdWxhdGlvbicsXG4gICAgICBjb2xvcjogdG9rZW4uY29sb3JUZXh0LFxuICAgICAgJyY6ZGlzYWJsZWQgPiAqJzoge1xuICAgICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZSdcbiAgICAgIH0sXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy81MTM4MFxuICAgICAgW2Ake2NvbXBvbmVudENsc30taWNvbiA+IHN2Z2BdOiByZXNldEljb24oKSxcbiAgICAgICc+IGEnOiB7XG4gICAgICAgIGNvbG9yOiAnY3VycmVudENvbG9yJ1xuICAgICAgfSxcbiAgICAgICcmOm5vdCg6ZGlzYWJsZWQpJzogZ2VuRm9jdXNTdHlsZSh0b2tlbiksXG4gICAgICBbYCYke2NvbXBvbmVudENsc30tdHdvLWNoaW5lc2UtY2hhcnM6OmZpcnN0LWxldHRlcmBdOiB7XG4gICAgICAgIGxldHRlclNwYWNpbmc6ICcwLjM0ZW0nXG4gICAgICB9LFxuICAgICAgW2AmJHtjb21wb25lbnRDbHN9LXR3by1jaGluZXNlLWNoYXJzID4gKjpub3QoJHtpY29uQ2xzfSlgXToge1xuICAgICAgICBtYXJnaW5JbmxpbmVFbmQ6ICctMC4zNGVtJyxcbiAgICAgICAgbGV0dGVyU3BhY2luZzogJzAuMzRlbSdcbiAgICAgIH0sXG4gICAgICBbYCYke2NvbXBvbmVudENsc30taWNvbi1vbmx5YF06IHtcbiAgICAgICAgcGFkZGluZ0lubGluZTogMCxcbiAgICAgICAgLy8gbWFrZSBgYnRuLWljb24tb25seWAgbm90IHRvbyBuYXJyb3dcbiAgICAgICAgW2AmJHtjb21wb25lbnRDbHN9LWNvbXBhY3QtaXRlbWBdOiB7XG4gICAgICAgICAgZmxleDogJ25vbmUnXG4gICAgICAgIH0sXG4gICAgICAgIFtgJiR7Y29tcG9uZW50Q2xzfS1yb3VuZGBdOiB7XG4gICAgICAgICAgd2lkdGg6ICdhdXRvJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gTG9hZGluZ1xuICAgICAgW2AmJHtjb21wb25lbnRDbHN9LWxvYWRpbmdgXToge1xuICAgICAgICBvcGFjaXR5OiBvcGFjaXR5TG9hZGluZyxcbiAgICAgICAgY3Vyc29yOiAnZGVmYXVsdCdcbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1sb2FkaW5nLWljb25gXToge1xuICAgICAgICB0cmFuc2l0aW9uOiBbJ3dpZHRoJywgJ29wYWNpdHknLCAnbWFyZ2luJ10ubWFwKHRyYW5zaXRpb24gPT4gYCR7dHJhbnNpdGlvbn0gJHttb3Rpb25EdXJhdGlvblNsb3d9ICR7bW90aW9uRWFzZUluT3V0fWApLmpvaW4oJywnKVxuICAgICAgfSxcbiAgICAgIC8vIGljb25Qb3NpdGlvblxuICAgICAgW2AmOm5vdCgke2NvbXBvbmVudENsc30taWNvbi1lbmQpYF06IHtcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30tbG9hZGluZy1pY29uLW1vdGlvbmBdOiB7XG4gICAgICAgICAgJyYtYXBwZWFyLXN0YXJ0LCAmLWVudGVyLXN0YXJ0Jzoge1xuICAgICAgICAgICAgbWFyZ2luSW5saW5lRW5kOiBjYWxjKG1hcmdpblhTKS5tdWwoLTEpLmVxdWFsKClcbiAgICAgICAgICB9LFxuICAgICAgICAgICcmLWFwcGVhci1hY3RpdmUsICYtZW50ZXItYWN0aXZlJzoge1xuICAgICAgICAgICAgbWFyZ2luSW5saW5lRW5kOiAwXG4gICAgICAgICAgfSxcbiAgICAgICAgICAnJi1sZWF2ZS1zdGFydCc6IHtcbiAgICAgICAgICAgIG1hcmdpbklubGluZUVuZDogMFxuICAgICAgICAgIH0sXG4gICAgICAgICAgJyYtbGVhdmUtYWN0aXZlJzoge1xuICAgICAgICAgICAgbWFyZ2luSW5saW5lRW5kOiBjYWxjKG1hcmdpblhTKS5tdWwoLTEpLmVxdWFsKClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAnJi1pY29uLWVuZCc6IHtcbiAgICAgICAgZmxleERpcmVjdGlvbjogJ3Jvdy1yZXZlcnNlJyxcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30tbG9hZGluZy1pY29uLW1vdGlvbmBdOiB7XG4gICAgICAgICAgJyYtYXBwZWFyLXN0YXJ0LCAmLWVudGVyLXN0YXJ0Jzoge1xuICAgICAgICAgICAgbWFyZ2luSW5saW5lU3RhcnQ6IGNhbGMobWFyZ2luWFMpLm11bCgtMSkuZXF1YWwoKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgJyYtYXBwZWFyLWFjdGl2ZSwgJi1lbnRlci1hY3RpdmUnOiB7XG4gICAgICAgICAgICBtYXJnaW5JbmxpbmVTdGFydDogMFxuICAgICAgICAgIH0sXG4gICAgICAgICAgJyYtbGVhdmUtc3RhcnQnOiB7XG4gICAgICAgICAgICBtYXJnaW5JbmxpbmVTdGFydDogMFxuICAgICAgICAgIH0sXG4gICAgICAgICAgJyYtbGVhdmUtYWN0aXZlJzoge1xuICAgICAgICAgICAgbWFyZ2luSW5saW5lU3RhcnQ6IGNhbGMobWFyZ2luWFMpLm11bCgtMSkuZXF1YWwoKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG5jb25zdCBnZW5Ib3ZlckFjdGl2ZUJ1dHRvblN0eWxlID0gKGJ0bkNscywgaG92ZXJTdHlsZSwgYWN0aXZlU3R5bGUpID0+ICh7XG4gIFtgJjpub3QoOmRpc2FibGVkKTpub3QoJHtidG5DbHN9LWRpc2FibGVkKWBdOiB7XG4gICAgJyY6aG92ZXInOiBob3ZlclN0eWxlLFxuICAgICcmOmFjdGl2ZSc6IGFjdGl2ZVN0eWxlXG4gIH1cbn0pO1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNoYXBlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmNvbnN0IGdlbkNpcmNsZUJ1dHRvblN0eWxlID0gdG9rZW4gPT4gKHtcbiAgbWluV2lkdGg6IHRva2VuLmNvbnRyb2xIZWlnaHQsXG4gIHBhZGRpbmdJbmxpbmVTdGFydDogMCxcbiAgcGFkZGluZ0lubGluZUVuZDogMCxcbiAgYm9yZGVyUmFkaXVzOiAnNTAlJ1xufSk7XG5jb25zdCBnZW5Sb3VuZEJ1dHRvblN0eWxlID0gdG9rZW4gPT4gKHtcbiAgYm9yZGVyUmFkaXVzOiB0b2tlbi5jb250cm9sSGVpZ2h0LFxuICBwYWRkaW5nSW5saW5lU3RhcnQ6IHRva2VuLmNhbGModG9rZW4uY29udHJvbEhlaWdodCkuZGl2KDIpLmVxdWFsKCksXG4gIHBhZGRpbmdJbmxpbmVFbmQ6IHRva2VuLmNhbGModG9rZW4uY29udHJvbEhlaWdodCkuZGl2KDIpLmVxdWFsKClcbn0pO1xuY29uc3QgZ2VuRGlzYWJsZWRTdHlsZSA9IHRva2VuID0+ICh7XG4gIGN1cnNvcjogJ25vdC1hbGxvd2VkJyxcbiAgYm9yZGVyQ29sb3I6IHRva2VuLmJvcmRlckNvbG9yRGlzYWJsZWQsXG4gIGNvbG9yOiB0b2tlbi5jb2xvclRleHREaXNhYmxlZCxcbiAgYmFja2dyb3VuZDogdG9rZW4uY29sb3JCZ0NvbnRhaW5lckRpc2FibGVkLFxuICBib3hTaGFkb3c6ICdub25lJ1xufSk7XG5jb25zdCBnZW5HaG9zdEJ1dHRvblN0eWxlID0gKGJ0bkNscywgYmFja2dyb3VuZCwgdGV4dENvbG9yLCBib3JkZXJDb2xvciwgdGV4dENvbG9yRGlzYWJsZWQsIGJvcmRlckNvbG9yRGlzYWJsZWQsIGhvdmVyU3R5bGUsIGFjdGl2ZVN0eWxlKSA9PiAoe1xuICBbYCYke2J0bkNsc30tYmFja2dyb3VuZC1naG9zdGBdOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe1xuICAgIGNvbG9yOiB0ZXh0Q29sb3IgfHwgdW5kZWZpbmVkLFxuICAgIGJhY2tncm91bmQsXG4gICAgYm9yZGVyQ29sb3I6IGJvcmRlckNvbG9yIHx8IHVuZGVmaW5lZCxcbiAgICBib3hTaGFkb3c6ICdub25lJ1xuICB9LCBnZW5Ib3ZlckFjdGl2ZUJ1dHRvblN0eWxlKGJ0bkNscywgT2JqZWN0LmFzc2lnbih7XG4gICAgYmFja2dyb3VuZFxuICB9LCBob3ZlclN0eWxlKSwgT2JqZWN0LmFzc2lnbih7XG4gICAgYmFja2dyb3VuZFxuICB9LCBhY3RpdmVTdHlsZSkpKSwge1xuICAgICcmOmRpc2FibGVkJzoge1xuICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQnLFxuICAgICAgY29sb3I6IHRleHRDb2xvckRpc2FibGVkIHx8IHVuZGVmaW5lZCxcbiAgICAgIGJvcmRlckNvbG9yOiBib3JkZXJDb2xvckRpc2FibGVkIHx8IHVuZGVmaW5lZFxuICAgIH1cbiAgfSlcbn0pO1xuY29uc3QgZ2VuU29saWREaXNhYmxlZEJ1dHRvblN0eWxlID0gdG9rZW4gPT4gKHtcbiAgW2AmOmRpc2FibGVkLCAmJHt0b2tlbi5jb21wb25lbnRDbHN9LWRpc2FibGVkYF06IE9iamVjdC5hc3NpZ24oe30sIGdlbkRpc2FibGVkU3R5bGUodG9rZW4pKVxufSk7XG5jb25zdCBnZW5QdXJlRGlzYWJsZWRCdXR0b25TdHlsZSA9IHRva2VuID0+ICh7XG4gIFtgJjpkaXNhYmxlZCwgJiR7dG9rZW4uY29tcG9uZW50Q2xzfS1kaXNhYmxlZGBdOiB7XG4gICAgY3Vyc29yOiAnbm90LWFsbG93ZWQnLFxuICAgIGNvbG9yOiB0b2tlbi5jb2xvclRleHREaXNhYmxlZFxuICB9XG59KTtcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBWYXJpYW50ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5jb25zdCBnZW5WYXJpYW50QnV0dG9uU3R5bGUgPSAodG9rZW4sIGhvdmVyU3R5bGUsIGFjdGl2ZVN0eWxlLCB2YXJpYW50KSA9PiB7XG4gIGNvbnN0IGlzUHVyZURpc2FibGVkID0gdmFyaWFudCAmJiBbJ2xpbmsnLCAndGV4dCddLmluY2x1ZGVzKHZhcmlhbnQpO1xuICBjb25zdCBnZW5EaXNhYmxlZEJ1dHRvblN0eWxlID0gaXNQdXJlRGlzYWJsZWQgPyBnZW5QdXJlRGlzYWJsZWRCdXR0b25TdHlsZSA6IGdlblNvbGlkRGlzYWJsZWRCdXR0b25TdHlsZTtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZ2VuRGlzYWJsZWRCdXR0b25TdHlsZSh0b2tlbikpLCBnZW5Ib3ZlckFjdGl2ZUJ1dHRvblN0eWxlKHRva2VuLmNvbXBvbmVudENscywgaG92ZXJTdHlsZSwgYWN0aXZlU3R5bGUpKTtcbn07XG5jb25zdCBnZW5Tb2xpZEJ1dHRvblN0eWxlID0gKHRva2VuLCB0ZXh0Q29sb3IsIGJhY2tncm91bmQsIGhvdmVyU3R5bGUsIGFjdGl2ZVN0eWxlKSA9PiAoe1xuICBbYCYke3Rva2VuLmNvbXBvbmVudENsc30tdmFyaWFudC1zb2xpZGBdOiBPYmplY3QuYXNzaWduKHtcbiAgICBjb2xvcjogdGV4dENvbG9yLFxuICAgIGJhY2tncm91bmRcbiAgfSwgZ2VuVmFyaWFudEJ1dHRvblN0eWxlKHRva2VuLCBob3ZlclN0eWxlLCBhY3RpdmVTdHlsZSkpXG59KTtcbmNvbnN0IGdlbk91dGxpbmVkRGFzaGVkQnV0dG9uU3R5bGUgPSAodG9rZW4sIGJvcmRlckNvbG9yLCBiYWNrZ3JvdW5kLCBob3ZlclN0eWxlLCBhY3RpdmVTdHlsZSkgPT4gKHtcbiAgW2AmJHt0b2tlbi5jb21wb25lbnRDbHN9LXZhcmlhbnQtb3V0bGluZWQsICYke3Rva2VuLmNvbXBvbmVudENsc30tdmFyaWFudC1kYXNoZWRgXTogT2JqZWN0LmFzc2lnbih7XG4gICAgYm9yZGVyQ29sb3IsXG4gICAgYmFja2dyb3VuZFxuICB9LCBnZW5WYXJpYW50QnV0dG9uU3R5bGUodG9rZW4sIGhvdmVyU3R5bGUsIGFjdGl2ZVN0eWxlKSlcbn0pO1xuY29uc3QgZ2VuRGFzaGVkQnV0dG9uU3R5bGUgPSB0b2tlbiA9PiAoe1xuICBbYCYke3Rva2VuLmNvbXBvbmVudENsc30tdmFyaWFudC1kYXNoZWRgXToge1xuICAgIGJvcmRlclN0eWxlOiAnZGFzaGVkJ1xuICB9XG59KTtcbmNvbnN0IGdlbkZpbGxlZEJ1dHRvblN0eWxlID0gKHRva2VuLCBiYWNrZ3JvdW5kLCBob3ZlclN0eWxlLCBhY3RpdmVTdHlsZSkgPT4gKHtcbiAgW2AmJHt0b2tlbi5jb21wb25lbnRDbHN9LXZhcmlhbnQtZmlsbGVkYF06IE9iamVjdC5hc3NpZ24oe1xuICAgIGJveFNoYWRvdzogJ25vbmUnLFxuICAgIGJhY2tncm91bmRcbiAgfSwgZ2VuVmFyaWFudEJ1dHRvblN0eWxlKHRva2VuLCBob3ZlclN0eWxlLCBhY3RpdmVTdHlsZSkpXG59KTtcbmNvbnN0IGdlblRleHRMaW5rQnV0dG9uU3R5bGUgPSAodG9rZW4sIHRleHRDb2xvciwgdmFyaWFudCwgaG92ZXJTdHlsZSwgYWN0aXZlU3R5bGUpID0+ICh7XG4gIFtgJiR7dG9rZW4uY29tcG9uZW50Q2xzfS12YXJpYW50LSR7dmFyaWFudH1gXTogT2JqZWN0LmFzc2lnbih7XG4gICAgY29sb3I6IHRleHRDb2xvcixcbiAgICBib3hTaGFkb3c6ICdub25lJ1xuICB9LCBnZW5WYXJpYW50QnV0dG9uU3R5bGUodG9rZW4sIGhvdmVyU3R5bGUsIGFjdGl2ZVN0eWxlLCB2YXJpYW50KSlcbn0pO1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDb2xvciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmNvbnN0IGdlblByZXNldENvbG9yU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHNcbiAgfSA9IHRva2VuO1xuICByZXR1cm4gUHJlc2V0Q29sb3JzLnJlZHVjZSgocHJldiwgY29sb3JLZXkpID0+IHtcbiAgICBjb25zdCBkYXJrQ29sb3IgPSB0b2tlbltgJHtjb2xvcktleX02YF07XG4gICAgY29uc3QgbGlnaHRDb2xvciA9IHRva2VuW2Ake2NvbG9yS2V5fTFgXTtcbiAgICBjb25zdCBob3ZlckNvbG9yID0gdG9rZW5bYCR7Y29sb3JLZXl9NWBdO1xuICAgIGNvbnN0IGxpZ2h0SG92ZXJDb2xvciA9IHRva2VuW2Ake2NvbG9yS2V5fTJgXTtcbiAgICBjb25zdCBsaWdodEJvcmRlckNvbG9yID0gdG9rZW5bYCR7Y29sb3JLZXl9M2BdO1xuICAgIGNvbnN0IGFjdGl2ZUNvbG9yID0gdG9rZW5bYCR7Y29sb3JLZXl9N2BdO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZXYpLCB7XG4gICAgICBbYCYke2NvbXBvbmVudENsc30tY29sb3ItJHtjb2xvcktleX1gXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe1xuICAgICAgICBjb2xvcjogZGFya0NvbG9yLFxuICAgICAgICBib3hTaGFkb3c6IHRva2VuW2Ake2NvbG9yS2V5fVNoYWRvd0NvbG9yYF1cbiAgICAgIH0sIGdlblNvbGlkQnV0dG9uU3R5bGUodG9rZW4sIHRva2VuLmNvbG9yVGV4dExpZ2h0U29saWQsIGRhcmtDb2xvciwge1xuICAgICAgICBiYWNrZ3JvdW5kOiBob3ZlckNvbG9yXG4gICAgICB9LCB7XG4gICAgICAgIGJhY2tncm91bmQ6IGFjdGl2ZUNvbG9yXG4gICAgICB9KSksIGdlbk91dGxpbmVkRGFzaGVkQnV0dG9uU3R5bGUodG9rZW4sIGRhcmtDb2xvciwgdG9rZW4uY29sb3JCZ0NvbnRhaW5lciwge1xuICAgICAgICBjb2xvcjogaG92ZXJDb2xvcixcbiAgICAgICAgYm9yZGVyQ29sb3I6IGhvdmVyQ29sb3IsXG4gICAgICAgIGJhY2tncm91bmQ6IHRva2VuLmNvbG9yQmdDb250YWluZXJcbiAgICAgIH0sIHtcbiAgICAgICAgY29sb3I6IGFjdGl2ZUNvbG9yLFxuICAgICAgICBib3JkZXJDb2xvcjogYWN0aXZlQ29sb3IsXG4gICAgICAgIGJhY2tncm91bmQ6IHRva2VuLmNvbG9yQmdDb250YWluZXJcbiAgICAgIH0pKSwgZ2VuRGFzaGVkQnV0dG9uU3R5bGUodG9rZW4pKSwgZ2VuRmlsbGVkQnV0dG9uU3R5bGUodG9rZW4sIGxpZ2h0Q29sb3IsIHtcbiAgICAgICAgYmFja2dyb3VuZDogbGlnaHRIb3ZlckNvbG9yXG4gICAgICB9LCB7XG4gICAgICAgIGJhY2tncm91bmQ6IGxpZ2h0Qm9yZGVyQ29sb3JcbiAgICAgIH0pKSwgZ2VuVGV4dExpbmtCdXR0b25TdHlsZSh0b2tlbiwgZGFya0NvbG9yLCAnbGluaycsIHtcbiAgICAgICAgY29sb3I6IGhvdmVyQ29sb3JcbiAgICAgIH0sIHtcbiAgICAgICAgY29sb3I6IGFjdGl2ZUNvbG9yXG4gICAgICB9KSksIGdlblRleHRMaW5rQnV0dG9uU3R5bGUodG9rZW4sIGRhcmtDb2xvciwgJ3RleHQnLCB7XG4gICAgICAgIGNvbG9yOiBob3ZlckNvbG9yLFxuICAgICAgICBiYWNrZ3JvdW5kOiBsaWdodENvbG9yXG4gICAgICB9LCB7XG4gICAgICAgIGNvbG9yOiBhY3RpdmVDb2xvcixcbiAgICAgICAgYmFja2dyb3VuZDogbGlnaHRCb3JkZXJDb2xvclxuICAgICAgfSkpXG4gICAgfSk7XG4gIH0sIHt9KTtcbn07XG5jb25zdCBnZW5EZWZhdWx0QnV0dG9uU3R5bGUgPSB0b2tlbiA9PiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe1xuICBjb2xvcjogdG9rZW4uZGVmYXVsdENvbG9yLFxuICBib3hTaGFkb3c6IHRva2VuLmRlZmF1bHRTaGFkb3dcbn0sIGdlblNvbGlkQnV0dG9uU3R5bGUodG9rZW4sIHRva2VuLnNvbGlkVGV4dENvbG9yLCB0b2tlbi5jb2xvckJnU29saWQsIHtcbiAgY29sb3I6IHRva2VuLnNvbGlkVGV4dENvbG9yLFxuICBiYWNrZ3JvdW5kOiB0b2tlbi5jb2xvckJnU29saWRIb3ZlclxufSwge1xuICBjb2xvcjogdG9rZW4uc29saWRUZXh0Q29sb3IsXG4gIGJhY2tncm91bmQ6IHRva2VuLmNvbG9yQmdTb2xpZEFjdGl2ZVxufSkpLCBnZW5EYXNoZWRCdXR0b25TdHlsZSh0b2tlbikpLCBnZW5GaWxsZWRCdXR0b25TdHlsZSh0b2tlbiwgdG9rZW4uY29sb3JGaWxsVGVydGlhcnksIHtcbiAgYmFja2dyb3VuZDogdG9rZW4uY29sb3JGaWxsU2Vjb25kYXJ5XG59LCB7XG4gIGJhY2tncm91bmQ6IHRva2VuLmNvbG9yRmlsbFxufSkpLCBnZW5HaG9zdEJ1dHRvblN0eWxlKHRva2VuLmNvbXBvbmVudENscywgdG9rZW4uZ2hvc3RCZywgdG9rZW4uZGVmYXVsdEdob3N0Q29sb3IsIHRva2VuLmRlZmF1bHRHaG9zdEJvcmRlckNvbG9yLCB0b2tlbi5jb2xvclRleHREaXNhYmxlZCwgdG9rZW4uY29sb3JCb3JkZXIpKSwgZ2VuVGV4dExpbmtCdXR0b25TdHlsZSh0b2tlbiwgdG9rZW4udGV4dFRleHRDb2xvciwgJ2xpbmsnLCB7XG4gIGNvbG9yOiB0b2tlbi5jb2xvckxpbmtIb3ZlcixcbiAgYmFja2dyb3VuZDogdG9rZW4ubGlua0hvdmVyQmdcbn0sIHtcbiAgY29sb3I6IHRva2VuLmNvbG9yTGlua0FjdGl2ZVxufSkpO1xuY29uc3QgZ2VuUHJpbWFyeUJ1dHRvblN0eWxlID0gdG9rZW4gPT4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe1xuICBjb2xvcjogdG9rZW4uY29sb3JQcmltYXJ5LFxuICBib3hTaGFkb3c6IHRva2VuLnByaW1hcnlTaGFkb3dcbn0sIGdlbk91dGxpbmVkRGFzaGVkQnV0dG9uU3R5bGUodG9rZW4sIHRva2VuLmNvbG9yUHJpbWFyeSwgdG9rZW4uY29sb3JCZ0NvbnRhaW5lciwge1xuICBjb2xvcjogdG9rZW4uY29sb3JQcmltYXJ5VGV4dEhvdmVyLFxuICBib3JkZXJDb2xvcjogdG9rZW4uY29sb3JQcmltYXJ5SG92ZXIsXG4gIGJhY2tncm91bmQ6IHRva2VuLmNvbG9yQmdDb250YWluZXJcbn0sIHtcbiAgY29sb3I6IHRva2VuLmNvbG9yUHJpbWFyeVRleHRBY3RpdmUsXG4gIGJvcmRlckNvbG9yOiB0b2tlbi5jb2xvclByaW1hcnlBY3RpdmUsXG4gIGJhY2tncm91bmQ6IHRva2VuLmNvbG9yQmdDb250YWluZXJcbn0pKSwgZ2VuRGFzaGVkQnV0dG9uU3R5bGUodG9rZW4pKSwgZ2VuRmlsbGVkQnV0dG9uU3R5bGUodG9rZW4sIHRva2VuLmNvbG9yUHJpbWFyeUJnLCB7XG4gIGJhY2tncm91bmQ6IHRva2VuLmNvbG9yUHJpbWFyeUJnSG92ZXJcbn0sIHtcbiAgYmFja2dyb3VuZDogdG9rZW4uY29sb3JQcmltYXJ5Qm9yZGVyXG59KSksIGdlblRleHRMaW5rQnV0dG9uU3R5bGUodG9rZW4sIHRva2VuLmNvbG9yUHJpbWFyeVRleHQsICd0ZXh0Jywge1xuICBjb2xvcjogdG9rZW4uY29sb3JQcmltYXJ5VGV4dEhvdmVyLFxuICBiYWNrZ3JvdW5kOiB0b2tlbi5jb2xvclByaW1hcnlCZ1xufSwge1xuICBjb2xvcjogdG9rZW4uY29sb3JQcmltYXJ5VGV4dEFjdGl2ZSxcbiAgYmFja2dyb3VuZDogdG9rZW4uY29sb3JQcmltYXJ5Qm9yZGVyXG59KSksIGdlblRleHRMaW5rQnV0dG9uU3R5bGUodG9rZW4sIHRva2VuLmNvbG9yUHJpbWFyeVRleHQsICdsaW5rJywge1xuICBjb2xvcjogdG9rZW4uY29sb3JQcmltYXJ5VGV4dEhvdmVyLFxuICBiYWNrZ3JvdW5kOiB0b2tlbi5saW5rSG92ZXJCZ1xufSwge1xuICBjb2xvcjogdG9rZW4uY29sb3JQcmltYXJ5VGV4dEFjdGl2ZVxufSkpLCBnZW5HaG9zdEJ1dHRvblN0eWxlKHRva2VuLmNvbXBvbmVudENscywgdG9rZW4uZ2hvc3RCZywgdG9rZW4uY29sb3JQcmltYXJ5LCB0b2tlbi5jb2xvclByaW1hcnksIHRva2VuLmNvbG9yVGV4dERpc2FibGVkLCB0b2tlbi5jb2xvckJvcmRlciwge1xuICBjb2xvcjogdG9rZW4uY29sb3JQcmltYXJ5SG92ZXIsXG4gIGJvcmRlckNvbG9yOiB0b2tlbi5jb2xvclByaW1hcnlIb3ZlclxufSwge1xuICBjb2xvcjogdG9rZW4uY29sb3JQcmltYXJ5QWN0aXZlLFxuICBib3JkZXJDb2xvcjogdG9rZW4uY29sb3JQcmltYXJ5QWN0aXZlXG59KSk7XG5jb25zdCBnZW5EYW5nZXJvdXNTdHlsZSA9IHRva2VuID0+IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe1xuICBjb2xvcjogdG9rZW4uY29sb3JFcnJvcixcbiAgYm94U2hhZG93OiB0b2tlbi5kYW5nZXJTaGFkb3dcbn0sIGdlblNvbGlkQnV0dG9uU3R5bGUodG9rZW4sIHRva2VuLmRhbmdlckNvbG9yLCB0b2tlbi5jb2xvckVycm9yLCB7XG4gIGJhY2tncm91bmQ6IHRva2VuLmNvbG9yRXJyb3JIb3ZlclxufSwge1xuICBiYWNrZ3JvdW5kOiB0b2tlbi5jb2xvckVycm9yQWN0aXZlXG59KSksIGdlbk91dGxpbmVkRGFzaGVkQnV0dG9uU3R5bGUodG9rZW4sIHRva2VuLmNvbG9yRXJyb3IsIHRva2VuLmNvbG9yQmdDb250YWluZXIsIHtcbiAgY29sb3I6IHRva2VuLmNvbG9yRXJyb3JIb3ZlcixcbiAgYm9yZGVyQ29sb3I6IHRva2VuLmNvbG9yRXJyb3JCb3JkZXJIb3ZlclxufSwge1xuICBjb2xvcjogdG9rZW4uY29sb3JFcnJvckFjdGl2ZSxcbiAgYm9yZGVyQ29sb3I6IHRva2VuLmNvbG9yRXJyb3JBY3RpdmVcbn0pKSwgZ2VuRGFzaGVkQnV0dG9uU3R5bGUodG9rZW4pKSwgZ2VuRmlsbGVkQnV0dG9uU3R5bGUodG9rZW4sIHRva2VuLmNvbG9yRXJyb3JCZywge1xuICBiYWNrZ3JvdW5kOiB0b2tlbi5jb2xvckVycm9yQmdGaWxsZWRIb3ZlclxufSwge1xuICBiYWNrZ3JvdW5kOiB0b2tlbi5jb2xvckVycm9yQmdBY3RpdmVcbn0pKSwgZ2VuVGV4dExpbmtCdXR0b25TdHlsZSh0b2tlbiwgdG9rZW4uY29sb3JFcnJvciwgJ3RleHQnLCB7XG4gIGNvbG9yOiB0b2tlbi5jb2xvckVycm9ySG92ZXIsXG4gIGJhY2tncm91bmQ6IHRva2VuLmNvbG9yRXJyb3JCZ1xufSwge1xuICBjb2xvcjogdG9rZW4uY29sb3JFcnJvckhvdmVyLFxuICBiYWNrZ3JvdW5kOiB0b2tlbi5jb2xvckVycm9yQmdBY3RpdmVcbn0pKSwgZ2VuVGV4dExpbmtCdXR0b25TdHlsZSh0b2tlbiwgdG9rZW4uY29sb3JFcnJvciwgJ2xpbmsnLCB7XG4gIGNvbG9yOiB0b2tlbi5jb2xvckVycm9ySG92ZXJcbn0sIHtcbiAgY29sb3I6IHRva2VuLmNvbG9yRXJyb3JBY3RpdmVcbn0pKSwgZ2VuR2hvc3RCdXR0b25TdHlsZSh0b2tlbi5jb21wb25lbnRDbHMsIHRva2VuLmdob3N0QmcsIHRva2VuLmNvbG9yRXJyb3IsIHRva2VuLmNvbG9yRXJyb3IsIHRva2VuLmNvbG9yVGV4dERpc2FibGVkLCB0b2tlbi5jb2xvckJvcmRlciwge1xuICBjb2xvcjogdG9rZW4uY29sb3JFcnJvckhvdmVyLFxuICBib3JkZXJDb2xvcjogdG9rZW4uY29sb3JFcnJvckhvdmVyXG59LCB7XG4gIGNvbG9yOiB0b2tlbi5jb2xvckVycm9yQWN0aXZlLFxuICBib3JkZXJDb2xvcjogdG9rZW4uY29sb3JFcnJvckFjdGl2ZVxufSkpO1xuY29uc3QgZ2VuTGlua1N0eWxlID0gdG9rZW4gPT4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBnZW5UZXh0TGlua0J1dHRvblN0eWxlKHRva2VuLCB0b2tlbi5jb2xvckxpbmssICdsaW5rJywge1xuICBjb2xvcjogdG9rZW4uY29sb3JMaW5rSG92ZXJcbn0sIHtcbiAgY29sb3I6IHRva2VuLmNvbG9yTGlua0FjdGl2ZVxufSkpLCBnZW5HaG9zdEJ1dHRvblN0eWxlKHRva2VuLmNvbXBvbmVudENscywgdG9rZW4uZ2hvc3RCZywgdG9rZW4uY29sb3JJbmZvLCB0b2tlbi5jb2xvckluZm8sIHRva2VuLmNvbG9yVGV4dERpc2FibGVkLCB0b2tlbi5jb2xvckJvcmRlciwge1xuICBjb2xvcjogdG9rZW4uY29sb3JJbmZvSG92ZXIsXG4gIGJvcmRlckNvbG9yOiB0b2tlbi5jb2xvckluZm9Ib3ZlclxufSwge1xuICBjb2xvcjogdG9rZW4uY29sb3JJbmZvQWN0aXZlLFxuICBib3JkZXJDb2xvcjogdG9rZW4uY29sb3JJbmZvQWN0aXZlXG59KSk7XG5jb25zdCBnZW5Db2xvckJ1dHRvblN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzXG4gIH0gPSB0b2tlbjtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe1xuICAgIFtgJHtjb21wb25lbnRDbHN9LWNvbG9yLWRlZmF1bHRgXTogZ2VuRGVmYXVsdEJ1dHRvblN0eWxlKHRva2VuKSxcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS1jb2xvci1wcmltYXJ5YF06IGdlblByaW1hcnlCdXR0b25TdHlsZSh0b2tlbiksXG4gICAgW2Ake2NvbXBvbmVudENsc30tY29sb3ItZGFuZ2Vyb3VzYF06IGdlbkRhbmdlcm91c1N0eWxlKHRva2VuKSxcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS1jb2xvci1saW5rYF06IGdlbkxpbmtTdHlsZSh0b2tlbilcbiAgfSwgZ2VuUHJlc2V0Q29sb3JTdHlsZSh0b2tlbikpO1xufTtcbi8vID09PT09PT09PT09IENvbXBhdGlibGUgd2l0aCB2ZXJzaW9ucyBlYXJsaWVyIHRoYW4gNS4yMS4wID09PT09PT09PT09XG5jb25zdCBnZW5Db21wYXRpYmxlQnV0dG9uU3R5bGUgPSB0b2tlbiA9PiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBnZW5PdXRsaW5lZERhc2hlZEJ1dHRvblN0eWxlKHRva2VuLCB0b2tlbi5kZWZhdWx0Qm9yZGVyQ29sb3IsIHRva2VuLmRlZmF1bHRCZywge1xuICBjb2xvcjogdG9rZW4uZGVmYXVsdEhvdmVyQ29sb3IsXG4gIGJvcmRlckNvbG9yOiB0b2tlbi5kZWZhdWx0SG92ZXJCb3JkZXJDb2xvcixcbiAgYmFja2dyb3VuZDogdG9rZW4uZGVmYXVsdEhvdmVyQmdcbn0sIHtcbiAgY29sb3I6IHRva2VuLmRlZmF1bHRBY3RpdmVDb2xvcixcbiAgYm9yZGVyQ29sb3I6IHRva2VuLmRlZmF1bHRBY3RpdmVCb3JkZXJDb2xvcixcbiAgYmFja2dyb3VuZDogdG9rZW4uZGVmYXVsdEFjdGl2ZUJnXG59KSksIGdlblRleHRMaW5rQnV0dG9uU3R5bGUodG9rZW4sIHRva2VuLnRleHRUZXh0Q29sb3IsICd0ZXh0Jywge1xuICBjb2xvcjogdG9rZW4udGV4dFRleHRIb3ZlckNvbG9yLFxuICBiYWNrZ3JvdW5kOiB0b2tlbi50ZXh0SG92ZXJCZ1xufSwge1xuICBjb2xvcjogdG9rZW4udGV4dFRleHRBY3RpdmVDb2xvcixcbiAgYmFja2dyb3VuZDogdG9rZW4uY29sb3JCZ1RleHRBY3RpdmVcbn0pKSwgZ2VuU29saWRCdXR0b25TdHlsZSh0b2tlbiwgdG9rZW4ucHJpbWFyeUNvbG9yLCB0b2tlbi5jb2xvclByaW1hcnksIHtcbiAgYmFja2dyb3VuZDogdG9rZW4uY29sb3JQcmltYXJ5SG92ZXIsXG4gIGNvbG9yOiB0b2tlbi5wcmltYXJ5Q29sb3Jcbn0sIHtcbiAgYmFja2dyb3VuZDogdG9rZW4uY29sb3JQcmltYXJ5QWN0aXZlLFxuICBjb2xvcjogdG9rZW4ucHJpbWFyeUNvbG9yXG59KSksIGdlblRleHRMaW5rQnV0dG9uU3R5bGUodG9rZW4sIHRva2VuLmNvbG9yTGluaywgJ2xpbmsnLCB7XG4gIGNvbG9yOiB0b2tlbi5jb2xvckxpbmtIb3ZlcixcbiAgYmFja2dyb3VuZDogdG9rZW4ubGlua0hvdmVyQmdcbn0sIHtcbiAgY29sb3I6IHRva2VuLmNvbG9yTGlua0FjdGl2ZVxufSkpO1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTaXplID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmNvbnN0IGdlbkJ1dHRvblN0eWxlID0gZnVuY3Rpb24gKHRva2VuKSB7XG4gIGxldCBwcmVmaXhDbHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6ICcnO1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzLFxuICAgIGNvbnRyb2xIZWlnaHQsXG4gICAgZm9udFNpemUsXG4gICAgYm9yZGVyUmFkaXVzLFxuICAgIGJ1dHRvblBhZGRpbmdIb3Jpem9udGFsLFxuICAgIGljb25DbHMsXG4gICAgYnV0dG9uUGFkZGluZ1ZlcnRpY2FsLFxuICAgIGJ1dHRvbkljb25Pbmx5Rm9udFNpemVcbiAgfSA9IHRva2VuO1xuICByZXR1cm4gW3tcbiAgICBbcHJlZml4Q2xzXToge1xuICAgICAgZm9udFNpemUsXG4gICAgICBoZWlnaHQ6IGNvbnRyb2xIZWlnaHQsXG4gICAgICBwYWRkaW5nOiBgJHt1bml0KGJ1dHRvblBhZGRpbmdWZXJ0aWNhbCl9ICR7dW5pdChidXR0b25QYWRkaW5nSG9yaXpvbnRhbCl9YCxcbiAgICAgIGJvcmRlclJhZGl1cyxcbiAgICAgIFtgJiR7Y29tcG9uZW50Q2xzfS1pY29uLW9ubHlgXToge1xuICAgICAgICB3aWR0aDogY29udHJvbEhlaWdodCxcbiAgICAgICAgW2ljb25DbHNdOiB7XG4gICAgICAgICAgZm9udFNpemU6IGJ1dHRvbkljb25Pbmx5Rm9udFNpemVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgLy8gU2hhcGUgLSBwYXRjaCBwcmVmaXhDbHMgYWdhaW4gdG8gb3ZlcnJpZGUgc29saWQgYm9yZGVyIHJhZGl1cyBzdHlsZVxuICB7XG4gICAgW2Ake2NvbXBvbmVudENsc30ke2NvbXBvbmVudENsc30tY2lyY2xlJHtwcmVmaXhDbHN9YF06IGdlbkNpcmNsZUJ1dHRvblN0eWxlKHRva2VuKVxuICB9LCB7XG4gICAgW2Ake2NvbXBvbmVudENsc30ke2NvbXBvbmVudENsc30tcm91bmQke3ByZWZpeENsc31gXTogZ2VuUm91bmRCdXR0b25TdHlsZSh0b2tlbilcbiAgfV07XG59O1xuY29uc3QgZ2VuU2l6ZUJhc2VCdXR0b25TdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3QgYmFzZVRva2VuID0gbWVyZ2VUb2tlbih0b2tlbiwge1xuICAgIGZvbnRTaXplOiB0b2tlbi5jb250ZW50Rm9udFNpemVcbiAgfSk7XG4gIHJldHVybiBnZW5CdXR0b25TdHlsZShiYXNlVG9rZW4sIHRva2VuLmNvbXBvbmVudENscyk7XG59O1xuY29uc3QgZ2VuU2l6ZVNtYWxsQnV0dG9uU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHNtYWxsVG9rZW4gPSBtZXJnZVRva2VuKHRva2VuLCB7XG4gICAgY29udHJvbEhlaWdodDogdG9rZW4uY29udHJvbEhlaWdodFNNLFxuICAgIGZvbnRTaXplOiB0b2tlbi5jb250ZW50Rm9udFNpemVTTSxcbiAgICBwYWRkaW5nOiB0b2tlbi5wYWRkaW5nWFMsXG4gICAgYnV0dG9uUGFkZGluZ0hvcml6b250YWw6IHRva2VuLnBhZGRpbmdJbmxpbmVTTSxcbiAgICBidXR0b25QYWRkaW5nVmVydGljYWw6IDAsXG4gICAgYm9yZGVyUmFkaXVzOiB0b2tlbi5ib3JkZXJSYWRpdXNTTSxcbiAgICBidXR0b25JY29uT25seUZvbnRTaXplOiB0b2tlbi5vbmx5SWNvblNpemVTTVxuICB9KTtcbiAgcmV0dXJuIGdlbkJ1dHRvblN0eWxlKHNtYWxsVG9rZW4sIGAke3Rva2VuLmNvbXBvbmVudENsc30tc21gKTtcbn07XG5jb25zdCBnZW5TaXplTGFyZ2VCdXR0b25TdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3QgbGFyZ2VUb2tlbiA9IG1lcmdlVG9rZW4odG9rZW4sIHtcbiAgICBjb250cm9sSGVpZ2h0OiB0b2tlbi5jb250cm9sSGVpZ2h0TEcsXG4gICAgZm9udFNpemU6IHRva2VuLmNvbnRlbnRGb250U2l6ZUxHLFxuICAgIGJ1dHRvblBhZGRpbmdIb3Jpem9udGFsOiB0b2tlbi5wYWRkaW5nSW5saW5lTEcsXG4gICAgYnV0dG9uUGFkZGluZ1ZlcnRpY2FsOiAwLFxuICAgIGJvcmRlclJhZGl1czogdG9rZW4uYm9yZGVyUmFkaXVzTEcsXG4gICAgYnV0dG9uSWNvbk9ubHlGb250U2l6ZTogdG9rZW4ub25seUljb25TaXplTEdcbiAgfSk7XG4gIHJldHVybiBnZW5CdXR0b25TdHlsZShsYXJnZVRva2VuLCBgJHt0b2tlbi5jb21wb25lbnRDbHN9LWxnYCk7XG59O1xuY29uc3QgZ2VuQmxvY2tCdXR0b25TdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENsc1xuICB9ID0gdG9rZW47XG4gIHJldHVybiB7XG4gICAgW2NvbXBvbmVudENsc106IHtcbiAgICAgIFtgJiR7Y29tcG9uZW50Q2xzfS1ibG9ja2BdOiB7XG4gICAgICAgIHdpZHRoOiAnMTAwJSdcbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEV4cG9ydCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmV4cG9ydCBkZWZhdWx0IGdlblN0eWxlSG9va3MoJ0J1dHRvbicsIHRva2VuID0+IHtcbiAgY29uc3QgYnV0dG9uVG9rZW4gPSBwcmVwYXJlVG9rZW4odG9rZW4pO1xuICByZXR1cm4gW1xuICAvLyBTaGFyZWRcbiAgZ2VuU2hhcmVkQnV0dG9uU3R5bGUoYnV0dG9uVG9rZW4pLFxuICAvLyBTaXplXG4gIGdlblNpemVCYXNlQnV0dG9uU3R5bGUoYnV0dG9uVG9rZW4pLCBnZW5TaXplU21hbGxCdXR0b25TdHlsZShidXR0b25Ub2tlbiksIGdlblNpemVMYXJnZUJ1dHRvblN0eWxlKGJ1dHRvblRva2VuKSxcbiAgLy8gQmxvY2tcbiAgZ2VuQmxvY2tCdXR0b25TdHlsZShidXR0b25Ub2tlbiksXG4gIC8vIENvbG9yXG4gIGdlbkNvbG9yQnV0dG9uU3R5bGUoYnV0dG9uVG9rZW4pLFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy81MDk2OVxuICBnZW5Db21wYXRpYmxlQnV0dG9uU3R5bGUoYnV0dG9uVG9rZW4pLFxuICAvLyBCdXR0b24gR3JvdXBcbiAgZ2VuR3JvdXBTdHlsZShidXR0b25Ub2tlbildO1xufSwgcHJlcGFyZUNvbXBvbmVudFRva2VuLCB7XG4gIHVuaXRsZXNzOiB7XG4gICAgZm9udFdlaWdodDogdHJ1ZSxcbiAgICBjb250ZW50TGluZUhlaWdodDogdHJ1ZSxcbiAgICBjb250ZW50TGluZUhlaWdodFNNOiB0cnVlLFxuICAgIGNvbnRlbnRMaW5lSGVpZ2h0TEc6IHRydWVcbiAgfVxufSk7IiwgIi8vIGhhbmRsZSBib3JkZXIgY29sbGFwc2VcbmZ1bmN0aW9uIGNvbXBhY3RJdGVtQm9yZGVyKHRva2VuLCBwYXJlbnRDbHMsIG9wdGlvbnMpIHtcbiAgY29uc3Qge1xuICAgIGZvY3VzRWxDbHMsXG4gICAgZm9jdXMsXG4gICAgYm9yZGVyRWxDbHNcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGNoaWxkQ29tYmluYXRvciA9IGJvcmRlckVsQ2xzID8gJz4gKicgOiAnJztcbiAgY29uc3QgaG92ZXJFZmZlY3RzID0gWydob3ZlcicsIGZvY3VzID8gJ2ZvY3VzJyA6IG51bGwsICdhY3RpdmUnXS5maWx0ZXIoQm9vbGVhbikubWFwKG4gPT4gYCY6JHtufSAke2NoaWxkQ29tYmluYXRvcn1gKS5qb2luKCcsJyk7XG4gIHJldHVybiB7XG4gICAgW2AmLWl0ZW06bm90KCR7cGFyZW50Q2xzfS1sYXN0LWl0ZW0pYF06IHtcbiAgICAgIG1hcmdpbklubGluZUVuZDogdG9rZW4uY2FsYyh0b2tlbi5saW5lV2lkdGgpLm11bCgtMSkuZXF1YWwoKVxuICAgIH0sXG4gICAgJyYtaXRlbSc6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7XG4gICAgICBbaG92ZXJFZmZlY3RzXToge1xuICAgICAgICB6SW5kZXg6IDJcbiAgICAgIH1cbiAgICB9LCBmb2N1c0VsQ2xzID8ge1xuICAgICAgW2AmJHtmb2N1c0VsQ2xzfWBdOiB7XG4gICAgICAgIHpJbmRleDogMlxuICAgICAgfVxuICAgIH0gOiB7fSksIHtcbiAgICAgIFtgJltkaXNhYmxlZF0gJHtjaGlsZENvbWJpbmF0b3J9YF06IHtcbiAgICAgICAgekluZGV4OiAwXG4gICAgICB9XG4gICAgfSlcbiAgfTtcbn1cbi8vIGhhbmRsZSBib3JkZXItcmFkaXVzXG5mdW5jdGlvbiBjb21wYWN0SXRlbUJvcmRlclJhZGl1cyhwcmVmaXhDbHMsIHBhcmVudENscywgb3B0aW9ucykge1xuICBjb25zdCB7XG4gICAgYm9yZGVyRWxDbHNcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGNoaWxkQ29tYmluYXRvciA9IGJvcmRlckVsQ2xzID8gYD4gJHtib3JkZXJFbENsc31gIDogJyc7XG4gIHJldHVybiB7XG4gICAgW2AmLWl0ZW06bm90KCR7cGFyZW50Q2xzfS1maXJzdC1pdGVtKTpub3QoJHtwYXJlbnRDbHN9LWxhc3QtaXRlbSkgJHtjaGlsZENvbWJpbmF0b3J9YF06IHtcbiAgICAgIGJvcmRlclJhZGl1czogMFxuICAgIH0sXG4gICAgW2AmLWl0ZW06bm90KCR7cGFyZW50Q2xzfS1sYXN0LWl0ZW0pJHtwYXJlbnRDbHN9LWZpcnN0LWl0ZW1gXToge1xuICAgICAgW2AmICR7Y2hpbGRDb21iaW5hdG9yfSwgJiR7cHJlZml4Q2xzfS1zbSAke2NoaWxkQ29tYmluYXRvcn0sICYke3ByZWZpeENsc30tbGcgJHtjaGlsZENvbWJpbmF0b3J9YF06IHtcbiAgICAgICAgYm9yZGVyU3RhcnRFbmRSYWRpdXM6IDAsXG4gICAgICAgIGJvcmRlckVuZEVuZFJhZGl1czogMFxuICAgICAgfVxuICAgIH0sXG4gICAgW2AmLWl0ZW06bm90KCR7cGFyZW50Q2xzfS1maXJzdC1pdGVtKSR7cGFyZW50Q2xzfS1sYXN0LWl0ZW1gXToge1xuICAgICAgW2AmICR7Y2hpbGRDb21iaW5hdG9yfSwgJiR7cHJlZml4Q2xzfS1zbSAke2NoaWxkQ29tYmluYXRvcn0sICYke3ByZWZpeENsc30tbGcgJHtjaGlsZENvbWJpbmF0b3J9YF06IHtcbiAgICAgICAgYm9yZGVyU3RhcnRTdGFydFJhZGl1czogMCxcbiAgICAgICAgYm9yZGVyRW5kU3RhcnRSYWRpdXM6IDBcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2VuQ29tcGFjdEl0ZW1TdHlsZSh0b2tlbikge1xuICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge1xuICAgIGZvY3VzOiB0cnVlXG4gIH07XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHNcbiAgfSA9IHRva2VuO1xuICBjb25zdCBjb21wYWN0Q2xzID0gYCR7Y29tcG9uZW50Q2xzfS1jb21wYWN0YDtcbiAgcmV0dXJuIHtcbiAgICBbY29tcGFjdENsc106IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY29tcGFjdEl0ZW1Cb3JkZXIodG9rZW4sIGNvbXBhY3RDbHMsIG9wdGlvbnMpKSwgY29tcGFjdEl0ZW1Cb3JkZXJSYWRpdXMoY29tcG9uZW50Q2xzLCBjb21wYWN0Q2xzLCBvcHRpb25zKSlcbiAgfTtcbn0iLCAiZnVuY3Rpb24gY29tcGFjdEl0ZW1WZXJ0aWNhbEJvcmRlcih0b2tlbiwgcGFyZW50Q2xzKSB7XG4gIHJldHVybiB7XG4gICAgLy8gYm9yZGVyIGNvbGxhcHNlXG4gICAgW2AmLWl0ZW06bm90KCR7cGFyZW50Q2xzfS1sYXN0LWl0ZW0pYF06IHtcbiAgICAgIG1hcmdpbkJvdHRvbTogdG9rZW4uY2FsYyh0b2tlbi5saW5lV2lkdGgpLm11bCgtMSkuZXF1YWwoKVxuICAgIH0sXG4gICAgJyYtaXRlbSc6IHtcbiAgICAgICcmOmhvdmVyLCY6Zm9jdXMsJjphY3RpdmUnOiB7XG4gICAgICAgIHpJbmRleDogMlxuICAgICAgfSxcbiAgICAgICcmW2Rpc2FibGVkXSc6IHtcbiAgICAgICAgekluZGV4OiAwXG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gY29tcGFjdEl0ZW1Cb3JkZXJWZXJ0aWNhbFJhZGl1cyhwcmVmaXhDbHMsIHBhcmVudENscykge1xuICByZXR1cm4ge1xuICAgIFtgJi1pdGVtOm5vdCgke3BhcmVudENsc30tZmlyc3QtaXRlbSk6bm90KCR7cGFyZW50Q2xzfS1sYXN0LWl0ZW0pYF06IHtcbiAgICAgIGJvcmRlclJhZGl1czogMFxuICAgIH0sXG4gICAgW2AmLWl0ZW0ke3BhcmVudENsc30tZmlyc3QtaXRlbTpub3QoJHtwYXJlbnRDbHN9LWxhc3QtaXRlbSlgXToge1xuICAgICAgW2AmLCAmJHtwcmVmaXhDbHN9LXNtLCAmJHtwcmVmaXhDbHN9LWxnYF06IHtcbiAgICAgICAgYm9yZGVyRW5kRW5kUmFkaXVzOiAwLFxuICAgICAgICBib3JkZXJFbmRTdGFydFJhZGl1czogMFxuICAgICAgfVxuICAgIH0sXG4gICAgW2AmLWl0ZW0ke3BhcmVudENsc30tbGFzdC1pdGVtOm5vdCgke3BhcmVudENsc30tZmlyc3QtaXRlbSlgXToge1xuICAgICAgW2AmLCAmJHtwcmVmaXhDbHN9LXNtLCAmJHtwcmVmaXhDbHN9LWxnYF06IHtcbiAgICAgICAgYm9yZGVyU3RhcnRTdGFydFJhZGl1czogMCxcbiAgICAgICAgYm9yZGVyU3RhcnRFbmRSYWRpdXM6IDBcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2VuQ29tcGFjdEl0ZW1WZXJ0aWNhbFN0eWxlKHRva2VuKSB7XG4gIGNvbnN0IGNvbXBhY3RDbHMgPSBgJHt0b2tlbi5jb21wb25lbnRDbHN9LWNvbXBhY3QtdmVydGljYWxgO1xuICByZXR1cm4ge1xuICAgIFtjb21wYWN0Q2xzXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjb21wYWN0SXRlbVZlcnRpY2FsQm9yZGVyKHRva2VuLCBjb21wYWN0Q2xzKSksIGNvbXBhY3RJdGVtQm9yZGVyVmVydGljYWxSYWRpdXModG9rZW4uY29tcG9uZW50Q2xzLCBjb21wYWN0Q2xzKSlcbiAgfTtcbn0iLCAiaW1wb3J0IHsgZ2VuQ29tcGFjdEl0ZW1TdHlsZSB9IGZyb20gJy4uLy4uL3N0eWxlL2NvbXBhY3QtaXRlbSc7XG5pbXBvcnQgeyBnZW5Db21wYWN0SXRlbVZlcnRpY2FsU3R5bGUgfSBmcm9tICcuLi8uLi9zdHlsZS9jb21wYWN0LWl0ZW0tdmVydGljYWwnO1xuaW1wb3J0IHsgZ2VuU3ViU3R5bGVDb21wb25lbnQgfSBmcm9tICcuLi8uLi90aGVtZS9pbnRlcm5hbCc7XG5pbXBvcnQgeyBwcmVwYXJlQ29tcG9uZW50VG9rZW4sIHByZXBhcmVUb2tlbiB9IGZyb20gJy4vdG9rZW4nO1xuY29uc3QgZ2VuQnV0dG9uQ29tcGFjdFN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzLFxuICAgIGNvbG9yUHJpbWFyeUhvdmVyLFxuICAgIGxpbmVXaWR0aCxcbiAgICBjYWxjXG4gIH0gPSB0b2tlbjtcbiAgY29uc3QgaW5zZXRPZmZzZXQgPSBjYWxjKGxpbmVXaWR0aCkubXVsKC0xKS5lcXVhbCgpO1xuICBjb25zdCBnZXRDb21wYWN0Qm9yZGVyU3R5bGUgPSB2ZXJ0aWNhbCA9PiB7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBgJHtjb21wb25lbnRDbHN9LWNvbXBhY3Qke3ZlcnRpY2FsID8gJy12ZXJ0aWNhbCcgOiAnJ30taXRlbSR7Y29tcG9uZW50Q2xzfS1wcmltYXJ5Om5vdChbZGlzYWJsZWRdKWA7XG4gICAgcmV0dXJuIHtcbiAgICAgIFtgJHtzZWxlY3Rvcn0gKyAke3NlbGVjdG9yfTo6YmVmb3JlYF06IHtcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgIHRvcDogdmVydGljYWwgPyBpbnNldE9mZnNldCA6IDAsXG4gICAgICAgIGluc2V0SW5saW5lU3RhcnQ6IHZlcnRpY2FsID8gMCA6IGluc2V0T2Zmc2V0LFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGNvbG9yUHJpbWFyeUhvdmVyLFxuICAgICAgICBjb250ZW50OiAnXCJcIicsXG4gICAgICAgIHdpZHRoOiB2ZXJ0aWNhbCA/ICcxMDAlJyA6IGxpbmVXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiB2ZXJ0aWNhbCA/IGxpbmVXaWR0aCA6ICcxMDAlJ1xuICAgICAgfVxuICAgIH07XG4gIH07XG4gIC8vIFNwZWNpYWwgc3R5bGVzIGZvciBQcmltYXJ5IEJ1dHRvblxuICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBnZXRDb21wYWN0Qm9yZGVyU3R5bGUoKSksIGdldENvbXBhY3RCb3JkZXJTdHlsZSh0cnVlKSk7XG59O1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEV4cG9ydCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmV4cG9ydCBkZWZhdWx0IGdlblN1YlN0eWxlQ29tcG9uZW50KFsnQnV0dG9uJywgJ2NvbXBhY3QnXSwgdG9rZW4gPT4ge1xuICBjb25zdCBidXR0b25Ub2tlbiA9IHByZXBhcmVUb2tlbih0b2tlbik7XG4gIHJldHVybiBbXG4gIC8vIFNwYWNlIENvbXBhY3RcbiAgZ2VuQ29tcGFjdEl0ZW1TdHlsZShidXR0b25Ub2tlbiksIGdlbkNvbXBhY3RJdGVtVmVydGljYWxTdHlsZShidXR0b25Ub2tlbiksIGdlbkJ1dHRvbkNvbXBhY3RTdHlsZShidXR0b25Ub2tlbildO1xufSwgcHJlcGFyZUNvbXBvbmVudFRva2VuKTsiLCAiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCBCdXR0b24gZnJvbSAnLi9idXR0b24nO1xuZXhwb3J0ICogZnJvbSAnLi9idXR0b25IZWxwZXJzJztcbmV4cG9ydCBkZWZhdWx0IEJ1dHRvbjsiLCAiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjcmVhdGVQb3J0YWwgfSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IGNhblVzZURvbSBmcm9tIFwicmMtdXRpbC9lcy9Eb20vY2FuVXNlRG9tXCI7XG5pbXBvcnQgd2FybmluZyBmcm9tIFwicmMtdXRpbC9lcy93YXJuaW5nXCI7XG5pbXBvcnQgeyBzdXBwb3J0UmVmLCB1c2VDb21wb3NlUmVmIH0gZnJvbSBcInJjLXV0aWwvZXMvcmVmXCI7XG5pbXBvcnQgT3JkZXJDb250ZXh0IGZyb20gXCIuL0NvbnRleHRcIjtcbmltcG9ydCB1c2VEb20gZnJvbSBcIi4vdXNlRG9tXCI7XG5pbXBvcnQgdXNlU2Nyb2xsTG9ja2VyIGZyb20gXCIuL3VzZVNjcm9sbExvY2tlclwiO1xuaW1wb3J0IHsgaW5saW5lTW9jayB9IGZyb20gXCIuL21vY2tcIjtcbnZhciBnZXRQb3J0YWxDb250YWluZXIgPSBmdW5jdGlvbiBnZXRQb3J0YWxDb250YWluZXIoZ2V0Q29udGFpbmVyKSB7XG4gIGlmIChnZXRDb250YWluZXIgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICghY2FuVXNlRG9tKCkgfHwgIWdldENvbnRhaW5lcikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmICh0eXBlb2YgZ2V0Q29udGFpbmVyID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGdldENvbnRhaW5lcik7XG4gIH1cbiAgaWYgKHR5cGVvZiBnZXRDb250YWluZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZ2V0Q29udGFpbmVyKCk7XG4gIH1cbiAgcmV0dXJuIGdldENvbnRhaW5lcjtcbn07XG52YXIgUG9ydGFsID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIG9wZW4gPSBwcm9wcy5vcGVuLFxuICAgIGF1dG9Mb2NrID0gcHJvcHMuYXV0b0xvY2ssXG4gICAgZ2V0Q29udGFpbmVyID0gcHJvcHMuZ2V0Q29udGFpbmVyLFxuICAgIGRlYnVnID0gcHJvcHMuZGVidWcsXG4gICAgX3Byb3BzJGF1dG9EZXN0cm95ID0gcHJvcHMuYXV0b0Rlc3Ryb3ksXG4gICAgYXV0b0Rlc3Ryb3kgPSBfcHJvcHMkYXV0b0Rlc3Ryb3kgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkYXV0b0Rlc3Ryb3ksXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbjtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKG9wZW4pLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIHNob3VsZFJlbmRlciA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0U2hvdWxkUmVuZGVyID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIG1lcmdlZFJlbmRlciA9IHNob3VsZFJlbmRlciB8fCBvcGVuO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gV2FybmluZyA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgd2FybmluZyhjYW5Vc2VEb20oKSB8fCAhb3BlbiwgXCJQb3J0YWwgb25seSB3b3JrIGluIGNsaWVudCBzaWRlLiBQbGVhc2UgY2FsbCAndXNlRWZmZWN0JyB0byBzaG93IFBvcnRhbCBpbnN0ZWFkIGRlZmF1bHQgcmVuZGVyIGluIFNTUi5cIik7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09IFNob3VsZCBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PVxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChhdXRvRGVzdHJveSB8fCBvcGVuKSB7XG4gICAgICBzZXRTaG91bGRSZW5kZXIob3Blbik7XG4gICAgfVxuICB9LCBbb3BlbiwgYXV0b0Rlc3Ryb3ldKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gQ29udGFpbmVyID09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX1JlYWN0JHVzZVN0YXRlMyA9IFJlYWN0LnVzZVN0YXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBnZXRQb3J0YWxDb250YWluZXIoZ2V0Q29udGFpbmVyKTtcbiAgICB9KSxcbiAgICBfUmVhY3QkdXNlU3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlMywgMiksXG4gICAgaW5uZXJDb250YWluZXIgPSBfUmVhY3QkdXNlU3RhdGU0WzBdLFxuICAgIHNldElubmVyQ29udGFpbmVyID0gX1JlYWN0JHVzZVN0YXRlNFsxXTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY3VzdG9taXplQ29udGFpbmVyID0gZ2V0UG9ydGFsQ29udGFpbmVyKGdldENvbnRhaW5lcik7XG5cbiAgICAvLyBUZWxsIGNvbXBvbmVudCB0aGF0IHdlIGNoZWNrIHRoaXMgaW4gZWZmZWN0IHdoaWNoIGlzIHNhZmUgdG8gYmUgYG51bGxgXG4gICAgc2V0SW5uZXJDb250YWluZXIoY3VzdG9taXplQ29udGFpbmVyICE9PSBudWxsICYmIGN1c3RvbWl6ZUNvbnRhaW5lciAhPT0gdm9pZCAwID8gY3VzdG9taXplQ29udGFpbmVyIDogbnVsbCk7XG4gIH0pO1xuICB2YXIgX3VzZURvbSA9IHVzZURvbShtZXJnZWRSZW5kZXIgJiYgIWlubmVyQ29udGFpbmVyLCBkZWJ1ZyksXG4gICAgX3VzZURvbTIgPSBfc2xpY2VkVG9BcnJheShfdXNlRG9tLCAyKSxcbiAgICBkZWZhdWx0Q29udGFpbmVyID0gX3VzZURvbTJbMF0sXG4gICAgcXVldWVDcmVhdGUgPSBfdXNlRG9tMlsxXTtcbiAgdmFyIG1lcmdlZENvbnRhaW5lciA9IGlubmVyQ29udGFpbmVyICE9PSBudWxsICYmIGlubmVyQ29udGFpbmVyICE9PSB2b2lkIDAgPyBpbm5lckNvbnRhaW5lciA6IGRlZmF1bHRDb250YWluZXI7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBMb2NrZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdXNlU2Nyb2xsTG9ja2VyKGF1dG9Mb2NrICYmIG9wZW4gJiYgY2FuVXNlRG9tKCkgJiYgKG1lcmdlZENvbnRhaW5lciA9PT0gZGVmYXVsdENvbnRhaW5lciB8fCBtZXJnZWRDb250YWluZXIgPT09IGRvY3VtZW50LmJvZHkpKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVmID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgY2hpbGRSZWYgPSBudWxsO1xuICBpZiAoY2hpbGRyZW4gJiYgc3VwcG9ydFJlZihjaGlsZHJlbikgJiYgcmVmKSB7XG4gICAgdmFyIF9yZWYgPSBjaGlsZHJlbjtcbiAgICBjaGlsZFJlZiA9IF9yZWYucmVmO1xuICB9XG4gIHZhciBtZXJnZWRSZWYgPSB1c2VDb21wb3NlUmVmKGNoaWxkUmVmLCByZWYpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIERvIG5vdCByZW5kZXIgd2hlbiBub3RoaW5nIG5lZWQgcmVuZGVyXG4gIC8vIFdoZW4gaW5uZXJDb250YWluZXIgaXMgYHVuZGVmaW5lZGAsIGl0IG1heSBub3QgcmVhZHkgc2luY2UgdXNlciB1c2UgcmVmIGluIHRoZSBzYW1lIHJlbmRlclxuICBpZiAoIW1lcmdlZFJlbmRlciB8fCAhY2FuVXNlRG9tKCkgfHwgaW5uZXJDb250YWluZXIgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gUmVuZGVyIGlubGluZVxuICB2YXIgcmVuZGVySW5saW5lID0gbWVyZ2VkQ29udGFpbmVyID09PSBmYWxzZSB8fCBpbmxpbmVNb2NrKCk7XG4gIHZhciByZWZmZWRDaGlsZHJlbiA9IGNoaWxkcmVuO1xuICBpZiAocmVmKSB7XG4gICAgcmVmZmVkQ2hpbGRyZW4gPSAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkcmVuLCB7XG4gICAgICByZWY6IG1lcmdlZFJlZlxuICAgIH0pO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChPcmRlckNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogcXVldWVDcmVhdGVcbiAgfSwgcmVuZGVySW5saW5lID8gcmVmZmVkQ2hpbGRyZW4gOiAvKiNfX1BVUkVfXyovY3JlYXRlUG9ydGFsKHJlZmZlZENoaWxkcmVuLCBtZXJnZWRDb250YWluZXIpKTtcbn0pO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgUG9ydGFsLmRpc3BsYXlOYW1lID0gJ1BvcnRhbCc7XG59XG5leHBvcnQgZGVmYXVsdCBQb3J0YWw7IiwgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbnZhciBPcmRlckNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmV4cG9ydCBkZWZhdWx0IE9yZGVyQ29udGV4dDsiLCAiaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZUxheW91dEVmZmVjdCBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VMYXlvdXRFZmZlY3RcIjtcbmltcG9ydCBjYW5Vc2VEb20gZnJvbSBcInJjLXV0aWwvZXMvRG9tL2NhblVzZURvbVwiO1xuaW1wb3J0IE9yZGVyQ29udGV4dCBmcm9tIFwiLi9Db250ZXh0XCI7XG52YXIgRU1QVFlfTElTVCA9IFtdO1xuXG4vKipcbiAqIFdpbGwgYWRkIGBkaXZgIHRvIGRvY3VtZW50LiBOZXN0IGNhbGwgd2lsbCBrZWVwIG9yZGVyXG4gKiBAcGFyYW0gcmVuZGVyIFJlbmRlciBET00gaW4gZG9jdW1lbnRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlRG9tKHJlbmRlciwgZGVidWcpIHtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghY2FuVXNlRG9tKCkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICB2YXIgZGVmYXVsdEVsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgZGVidWcpIHtcbiAgICAgICAgZGVmYXVsdEVsZS5zZXRBdHRyaWJ1dGUoJ2RhdGEtZGVidWcnLCBkZWJ1Zyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVmYXVsdEVsZTtcbiAgICB9KSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAxKSxcbiAgICBlbGUgPSBfUmVhY3QkdXNlU3RhdGUyWzBdO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IE9yZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBhcHBlbmRlZFJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIHZhciBxdWV1ZUNyZWF0ZSA9IFJlYWN0LnVzZUNvbnRleHQoT3JkZXJDb250ZXh0KTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTMgPSBSZWFjdC51c2VTdGF0ZShFTVBUWV9MSVNUKSxcbiAgICBfUmVhY3QkdXNlU3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlMywgMiksXG4gICAgcXVldWUgPSBfUmVhY3QkdXNlU3RhdGU0WzBdLFxuICAgIHNldFF1ZXVlID0gX1JlYWN0JHVzZVN0YXRlNFsxXTtcbiAgdmFyIG1lcmdlZFF1ZXVlQ3JlYXRlID0gcXVldWVDcmVhdGUgfHwgKGFwcGVuZGVkUmVmLmN1cnJlbnQgPyB1bmRlZmluZWQgOiBmdW5jdGlvbiAoYXBwZW5kRm4pIHtcbiAgICBzZXRRdWV1ZShmdW5jdGlvbiAob3JpZ2luKSB7XG4gICAgICB2YXIgbmV3UXVldWUgPSBbYXBwZW5kRm5dLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkob3JpZ2luKSk7XG4gICAgICByZXR1cm4gbmV3UXVldWU7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBET00gPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGZ1bmN0aW9uIGFwcGVuZCgpIHtcbiAgICBpZiAoIWVsZS5wYXJlbnRFbGVtZW50KSB7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGVsZSk7XG4gICAgfVxuICAgIGFwcGVuZGVkUmVmLmN1cnJlbnQgPSB0cnVlO1xuICB9XG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgdmFyIF9lbGUkcGFyZW50RWxlbWVudDtcbiAgICAoX2VsZSRwYXJlbnRFbGVtZW50ID0gZWxlLnBhcmVudEVsZW1lbnQpID09PSBudWxsIHx8IF9lbGUkcGFyZW50RWxlbWVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2VsZSRwYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGVsZSk7XG4gICAgYXBwZW5kZWRSZWYuY3VycmVudCA9IGZhbHNlO1xuICB9XG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHJlbmRlcikge1xuICAgICAgaWYgKHF1ZXVlQ3JlYXRlKSB7XG4gICAgICAgIHF1ZXVlQ3JlYXRlKGFwcGVuZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcHBlbmQoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY2xlYW51cCgpO1xuICAgIH1cbiAgICByZXR1cm4gY2xlYW51cDtcbiAgfSwgW3JlbmRlcl0pO1xuICB1c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgIHF1ZXVlLmZvckVhY2goZnVuY3Rpb24gKGFwcGVuZEZuKSB7XG4gICAgICAgIHJldHVybiBhcHBlbmRGbigpO1xuICAgICAgfSk7XG4gICAgICBzZXRRdWV1ZShFTVBUWV9MSVNUKTtcbiAgICB9XG4gIH0sIFtxdWV1ZV0pO1xuICByZXR1cm4gW2VsZSwgbWVyZ2VkUXVldWVDcmVhdGVdO1xufSIsICJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVwZGF0ZUNTUywgcmVtb3ZlQ1NTIH0gZnJvbSBcInJjLXV0aWwvZXMvRG9tL2R5bmFtaWNDU1NcIjtcbmltcG9ydCB1c2VMYXlvdXRFZmZlY3QgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlTGF5b3V0RWZmZWN0XCI7XG5pbXBvcnQgeyBnZXRUYXJnZXRTY3JvbGxCYXJTaXplIH0gZnJvbSBcInJjLXV0aWwvZXMvZ2V0U2Nyb2xsQmFyU2l6ZVwiO1xuaW1wb3J0IHsgaXNCb2R5T3ZlcmZsb3dpbmcgfSBmcm9tIFwiLi91dGlsXCI7XG52YXIgVU5JUVVFX0lEID0gXCJyYy11dGlsLWxvY2tlci1cIi5jb25jYXQoRGF0ZS5ub3coKSk7XG52YXIgdXVpZCA9IDA7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VTY3JvbGxMb2NrZXIobG9jaykge1xuICB2YXIgbWVyZ2VkTG9jayA9ICEhbG9jaztcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgIHV1aWQgKz0gMTtcbiAgICAgIHJldHVybiBcIlwiLmNvbmNhdChVTklRVUVfSUQsIFwiX1wiKS5jb25jYXQodXVpZCk7XG4gICAgfSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMSksXG4gICAgaWQgPSBfUmVhY3QkdXNlU3RhdGUyWzBdO1xuICB1c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChtZXJnZWRMb2NrKSB7XG4gICAgICB2YXIgc2Nyb2xsYmFyU2l6ZSA9IGdldFRhcmdldFNjcm9sbEJhclNpemUoZG9jdW1lbnQuYm9keSkud2lkdGg7XG4gICAgICB2YXIgaXNPdmVyZmxvdyA9IGlzQm9keU92ZXJmbG93aW5nKCk7XG4gICAgICB1cGRhdGVDU1MoXCJcXG5odG1sIGJvZHkge1xcbiAgb3ZlcmZsb3cteTogaGlkZGVuO1xcbiAgXCIuY29uY2F0KGlzT3ZlcmZsb3cgPyBcIndpZHRoOiBjYWxjKDEwMCUgLSBcIi5jb25jYXQoc2Nyb2xsYmFyU2l6ZSwgXCJweCk7XCIpIDogJycsIFwiXFxufVwiKSwgaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZW1vdmVDU1MoaWQpO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmVtb3ZlQ1NTKGlkKTtcbiAgICB9O1xuICB9LCBbbWVyZ2VkTG9jaywgaWRdKTtcbn0iLCAiLyogZXNsaW50LWRpc2FibGUgbm8tcGFyYW0tcmVhc3NpZ24gKi9cbmltcG9ydCB7IHJlbW92ZUNTUywgdXBkYXRlQ1NTIH0gZnJvbSBcIi4vRG9tL2R5bmFtaWNDU1NcIjtcbnZhciBjYWNoZWQ7XG5mdW5jdGlvbiBtZWFzdXJlU2Nyb2xsYmFyU2l6ZShlbGUpIHtcbiAgdmFyIHJhbmRvbUlkID0gXCJyYy1zY3JvbGxiYXItbWVhc3VyZS1cIi5jb25jYXQoTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDcpKTtcbiAgdmFyIG1lYXN1cmVFbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgbWVhc3VyZUVsZS5pZCA9IHJhbmRvbUlkO1xuXG4gIC8vIENyZWF0ZSBTdHlsZVxuICB2YXIgbWVhc3VyZVN0eWxlID0gbWVhc3VyZUVsZS5zdHlsZTtcbiAgbWVhc3VyZVN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgbWVhc3VyZVN0eWxlLmxlZnQgPSAnMCc7XG4gIG1lYXN1cmVTdHlsZS50b3AgPSAnMCc7XG4gIG1lYXN1cmVTdHlsZS53aWR0aCA9ICcxMDBweCc7XG4gIG1lYXN1cmVTdHlsZS5oZWlnaHQgPSAnMTAwcHgnO1xuICBtZWFzdXJlU3R5bGUub3ZlcmZsb3cgPSAnc2Nyb2xsJztcblxuICAvLyBDbG9uZSBTdHlsZSBpZiBuZWVkZWRcbiAgdmFyIGZhbGxiYWNrV2lkdGg7XG4gIHZhciBmYWxsYmFja0hlaWdodDtcbiAgaWYgKGVsZSkge1xuICAgIHZhciB0YXJnZXRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoZWxlKTtcbiAgICBtZWFzdXJlU3R5bGUuc2Nyb2xsYmFyQ29sb3IgPSB0YXJnZXRTdHlsZS5zY3JvbGxiYXJDb2xvcjtcbiAgICBtZWFzdXJlU3R5bGUuc2Nyb2xsYmFyV2lkdGggPSB0YXJnZXRTdHlsZS5zY3JvbGxiYXJXaWR0aDtcblxuICAgIC8vIFNldCBXZWJraXQgc3R5bGVcbiAgICB2YXIgd2Via2l0U2Nyb2xsYmFyU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGVsZSwgJzo6LXdlYmtpdC1zY3JvbGxiYXInKTtcbiAgICB2YXIgd2lkdGggPSBwYXJzZUludCh3ZWJraXRTY3JvbGxiYXJTdHlsZS53aWR0aCwgMTApO1xuICAgIHZhciBoZWlnaHQgPSBwYXJzZUludCh3ZWJraXRTY3JvbGxiYXJTdHlsZS5oZWlnaHQsIDEwKTtcblxuICAgIC8vIFRyeSB3cmFwIHRvIGhhbmRsZSBDU1AgY2FzZVxuICAgIHRyeSB7XG4gICAgICB2YXIgd2lkdGhTdHlsZSA9IHdpZHRoID8gXCJ3aWR0aDogXCIuY29uY2F0KHdlYmtpdFNjcm9sbGJhclN0eWxlLndpZHRoLCBcIjtcIikgOiAnJztcbiAgICAgIHZhciBoZWlnaHRTdHlsZSA9IGhlaWdodCA/IFwiaGVpZ2h0OiBcIi5jb25jYXQod2Via2l0U2Nyb2xsYmFyU3R5bGUuaGVpZ2h0LCBcIjtcIikgOiAnJztcbiAgICAgIHVwZGF0ZUNTUyhcIlxcbiNcIi5jb25jYXQocmFuZG9tSWQsIFwiOjotd2Via2l0LXNjcm9sbGJhciB7XFxuXCIpLmNvbmNhdCh3aWR0aFN0eWxlLCBcIlxcblwiKS5jb25jYXQoaGVpZ2h0U3R5bGUsIFwiXFxufVwiKSwgcmFuZG9tSWQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIENhbid0IHdyYXAsIGp1c3QgbG9nIGVycm9yXG4gICAgICBjb25zb2xlLmVycm9yKGUpO1xuXG4gICAgICAvLyBHZXQgZnJvbSBzdHlsZSBkaXJlY3RseVxuICAgICAgZmFsbGJhY2tXaWR0aCA9IHdpZHRoO1xuICAgICAgZmFsbGJhY2tIZWlnaHQgPSBoZWlnaHQ7XG4gICAgfVxuICB9XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobWVhc3VyZUVsZSk7XG5cbiAgLy8gTWVhc3VyZS4gR2V0IGZhbGxiYWNrIHN0eWxlIGlmIHByb3ZpZGVkXG4gIHZhciBzY3JvbGxXaWR0aCA9IGVsZSAmJiBmYWxsYmFja1dpZHRoICYmICFpc05hTihmYWxsYmFja1dpZHRoKSA/IGZhbGxiYWNrV2lkdGggOiBtZWFzdXJlRWxlLm9mZnNldFdpZHRoIC0gbWVhc3VyZUVsZS5jbGllbnRXaWR0aDtcbiAgdmFyIHNjcm9sbEhlaWdodCA9IGVsZSAmJiBmYWxsYmFja0hlaWdodCAmJiAhaXNOYU4oZmFsbGJhY2tIZWlnaHQpID8gZmFsbGJhY2tIZWlnaHQgOiBtZWFzdXJlRWxlLm9mZnNldEhlaWdodCAtIG1lYXN1cmVFbGUuY2xpZW50SGVpZ2h0O1xuXG4gIC8vIENsZWFuIHVwXG4gIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobWVhc3VyZUVsZSk7XG4gIHJlbW92ZUNTUyhyYW5kb21JZCk7XG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHNjcm9sbFdpZHRoLFxuICAgIGhlaWdodDogc2Nyb2xsSGVpZ2h0XG4gIH07XG59XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRTY3JvbGxCYXJTaXplKGZyZXNoKSB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgaWYgKGZyZXNoIHx8IGNhY2hlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY2FjaGVkID0gbWVhc3VyZVNjcm9sbGJhclNpemUoKTtcbiAgfVxuICByZXR1cm4gY2FjaGVkLndpZHRoO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFRhcmdldFNjcm9sbEJhclNpemUodGFyZ2V0KSB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnIHx8ICF0YXJnZXQgfHwgISh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50KSkge1xuICAgIHJldHVybiB7XG4gICAgICB3aWR0aDogMCxcbiAgICAgIGhlaWdodDogMFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIG1lYXN1cmVTY3JvbGxiYXJTaXplKHRhcmdldCk7XG59IiwgIi8qKlxuICogVGVzdCB1c2FnZSBleHBvcnQuIERvIG5vdCB1c2UgaW4geW91ciBwcm9kdWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0JvZHlPdmVyZmxvd2luZygpIHtcbiAgcmV0dXJuIGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0ID4gKHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSAmJiB3aW5kb3cuaW5uZXJXaWR0aCA+IGRvY3VtZW50LmJvZHkub2Zmc2V0V2lkdGg7XG59IiwgImV4cG9ydCB2YXIgaW5saW5lID0gZmFsc2U7XG5leHBvcnQgZnVuY3Rpb24gaW5saW5lTW9jayhuZXh0SW5saW5lKSB7XG4gIGlmICh0eXBlb2YgbmV4dElubGluZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgaW5saW5lID0gbmV4dElubGluZTtcbiAgfVxuICByZXR1cm4gaW5saW5lO1xufSIsICJpbXBvcnQgUG9ydGFsIGZyb20gXCIuL1BvcnRhbFwiO1xuaW1wb3J0IHsgaW5saW5lTW9jayB9IGZyb20gXCIuL21vY2tcIjtcbmV4cG9ydCB7IGlubGluZU1vY2sgfTtcbmV4cG9ydCBkZWZhdWx0IFBvcnRhbDsiLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBQb3J0YWwgZnJvbSAnQHJjLWNvbXBvbmVudC9wb3J0YWwnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgUmVmQ29udGV4dCB9IGZyb20gXCIuL2NvbnRleHRcIjtcbmltcG9ydCBEaWFsb2cgZnJvbSBcIi4vRGlhbG9nXCI7XG4vLyBmaXggaXNzdWUgIzEwNjU2XG4vKlxuICogZ2V0Q29udGFpbmVyIHJlbWFya3NcbiAqIEN1c3RvbSBjb250YWluZXIgc2hvdWxkIG5vdCBiZSByZXR1cm4sIGJlY2F1c2UgaW4gdGhlIFBvcnRhbCBjb21wb25lbnQsIGl0IHdpbGwgcmVtb3ZlIHRoZVxuICogcmV0dXJuIGNvbnRhaW5lciBlbGVtZW50IGhlcmUsIGlmIHRoZSBjdXN0b20gY29udGFpbmVyIGlzIHRoZSBvbmx5IGNoaWxkIG9mIGl0J3MgY29tcG9uZW50LFxuICogbGlrZSBpc3N1ZSAjMTA2NTYsIEl0IHdpbGwgaGFzIGEgY29uZmxpY3Qgd2l0aCByZW1vdmVDaGlsZCBtZXRob2QgaW4gcmVhY3QtZG9tLlxuICogU28gaGVyZSBzaG91bGQgYWRkIGEgY2hpbGQgKGRpdiBlbGVtZW50KSB0byBjdXN0b20gY29udGFpbmVyLlxuICogKi9cblxudmFyIERpYWxvZ1dyYXAgPSBmdW5jdGlvbiBEaWFsb2dXcmFwKHByb3BzKSB7XG4gIHZhciB2aXNpYmxlID0gcHJvcHMudmlzaWJsZSxcbiAgICBnZXRDb250YWluZXIgPSBwcm9wcy5nZXRDb250YWluZXIsXG4gICAgZm9yY2VSZW5kZXIgPSBwcm9wcy5mb3JjZVJlbmRlcixcbiAgICBfcHJvcHMkZGVzdHJveU9uQ2xvc2UgPSBwcm9wcy5kZXN0cm95T25DbG9zZSxcbiAgICBkZXN0cm95T25DbG9zZSA9IF9wcm9wcyRkZXN0cm95T25DbG9zZSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkZGVzdHJveU9uQ2xvc2UsXG4gICAgX2FmdGVyQ2xvc2UgPSBwcm9wcy5hZnRlckNsb3NlLFxuICAgIHBhbmVsUmVmID0gcHJvcHMucGFuZWxSZWY7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZSh2aXNpYmxlKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBhbmltYXRlZFZpc2libGUgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldEFuaW1hdGVkVmlzaWJsZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciByZWZDb250ZXh0ID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhbmVsOiBwYW5lbFJlZlxuICAgIH07XG4gIH0sIFtwYW5lbFJlZl0pO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICh2aXNpYmxlKSB7XG4gICAgICBzZXRBbmltYXRlZFZpc2libGUodHJ1ZSk7XG4gICAgfVxuICB9LCBbdmlzaWJsZV0pO1xuXG4gIC8vIERlc3Ryb3kgb24gY2xvc2Ugd2lsbCByZW1vdmUgd3JhcHBlZCBkaXZcbiAgaWYgKCFmb3JjZVJlbmRlciAmJiBkZXN0cm95T25DbG9zZSAmJiAhYW5pbWF0ZWRWaXNpYmxlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlZkNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogcmVmQ29udGV4dFxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQb3J0YWwsIHtcbiAgICBvcGVuOiB2aXNpYmxlIHx8IGZvcmNlUmVuZGVyIHx8IGFuaW1hdGVkVmlzaWJsZSxcbiAgICBhdXRvRGVzdHJveTogZmFsc2UsXG4gICAgZ2V0Q29udGFpbmVyOiBnZXRDb250YWluZXIsXG4gICAgYXV0b0xvY2s6IHZpc2libGUgfHwgYW5pbWF0ZWRWaXNpYmxlXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERpYWxvZywgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgZGVzdHJveU9uQ2xvc2U6IGRlc3Ryb3lPbkNsb3NlLFxuICAgIGFmdGVyQ2xvc2U6IGZ1bmN0aW9uIGFmdGVyQ2xvc2UoKSB7XG4gICAgICBfYWZ0ZXJDbG9zZSA9PT0gbnVsbCB8fCBfYWZ0ZXJDbG9zZSA9PT0gdm9pZCAwIHx8IF9hZnRlckNsb3NlKCk7XG4gICAgICBzZXRBbmltYXRlZFZpc2libGUoZmFsc2UpO1xuICAgIH1cbiAgfSkpKSk7XG59O1xuRGlhbG9nV3JhcC5kaXNwbGF5TmFtZSA9ICdEaWFsb2cnO1xuZXhwb3J0IGRlZmF1bHQgRGlhbG9nV3JhcDsiLCAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuZXhwb3J0IHZhciBSZWZDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQoe30pOyIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IGNvbnRhaW5zIGZyb20gXCJyYy11dGlsL2VzL0RvbS9jb250YWluc1wiO1xuaW1wb3J0IHVzZUlkIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZUlkXCI7XG5pbXBvcnQgS2V5Q29kZSBmcm9tIFwicmMtdXRpbC9lcy9LZXlDb2RlXCI7XG5pbXBvcnQgcGlja0F0dHJzIGZyb20gXCJyYy11dGlsL2VzL3BpY2tBdHRyc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBnZXRNb3Rpb25OYW1lIH0gZnJvbSBcIi4uL3V0aWxcIjtcbmltcG9ydCBDb250ZW50IGZyb20gXCIuL0NvbnRlbnRcIjtcbmltcG9ydCBNYXNrIGZyb20gXCIuL01hc2tcIjtcbmltcG9ydCB7IHdhcm5pbmcgfSBmcm9tIFwicmMtdXRpbC9lcy93YXJuaW5nXCI7XG52YXIgRGlhbG9nID0gZnVuY3Rpb24gRGlhbG9nKHByb3BzKSB7XG4gIHZhciBfcHJvcHMkcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIHByZWZpeENscyA9IF9wcm9wcyRwcmVmaXhDbHMgPT09IHZvaWQgMCA/ICdyYy1kaWFsb2cnIDogX3Byb3BzJHByZWZpeENscyxcbiAgICB6SW5kZXggPSBwcm9wcy56SW5kZXgsXG4gICAgX3Byb3BzJHZpc2libGUgPSBwcm9wcy52aXNpYmxlLFxuICAgIHZpc2libGUgPSBfcHJvcHMkdmlzaWJsZSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkdmlzaWJsZSxcbiAgICBfcHJvcHMka2V5Ym9hcmQgPSBwcm9wcy5rZXlib2FyZCxcbiAgICBrZXlib2FyZCA9IF9wcm9wcyRrZXlib2FyZCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyRrZXlib2FyZCxcbiAgICBfcHJvcHMkZm9jdXNUcmlnZ2VyQWYgPSBwcm9wcy5mb2N1c1RyaWdnZXJBZnRlckNsb3NlLFxuICAgIGZvY3VzVHJpZ2dlckFmdGVyQ2xvc2UgPSBfcHJvcHMkZm9jdXNUcmlnZ2VyQWYgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkZm9jdXNUcmlnZ2VyQWYsXG4gICAgd3JhcFN0eWxlID0gcHJvcHMud3JhcFN0eWxlLFxuICAgIHdyYXBDbGFzc05hbWUgPSBwcm9wcy53cmFwQ2xhc3NOYW1lLFxuICAgIHdyYXBQcm9wcyA9IHByb3BzLndyYXBQcm9wcyxcbiAgICBvbkNsb3NlID0gcHJvcHMub25DbG9zZSxcbiAgICBhZnRlck9wZW5DaGFuZ2UgPSBwcm9wcy5hZnRlck9wZW5DaGFuZ2UsXG4gICAgYWZ0ZXJDbG9zZSA9IHByb3BzLmFmdGVyQ2xvc2UsXG4gICAgdHJhbnNpdGlvbk5hbWUgPSBwcm9wcy50cmFuc2l0aW9uTmFtZSxcbiAgICBhbmltYXRpb24gPSBwcm9wcy5hbmltYXRpb24sXG4gICAgX3Byb3BzJGNsb3NhYmxlID0gcHJvcHMuY2xvc2FibGUsXG4gICAgY2xvc2FibGUgPSBfcHJvcHMkY2xvc2FibGUgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkY2xvc2FibGUsXG4gICAgX3Byb3BzJG1hc2sgPSBwcm9wcy5tYXNrLFxuICAgIG1hc2sgPSBfcHJvcHMkbWFzayA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyRtYXNrLFxuICAgIG1hc2tUcmFuc2l0aW9uTmFtZSA9IHByb3BzLm1hc2tUcmFuc2l0aW9uTmFtZSxcbiAgICBtYXNrQW5pbWF0aW9uID0gcHJvcHMubWFza0FuaW1hdGlvbixcbiAgICBfcHJvcHMkbWFza0Nsb3NhYmxlID0gcHJvcHMubWFza0Nsb3NhYmxlLFxuICAgIG1hc2tDbG9zYWJsZSA9IF9wcm9wcyRtYXNrQ2xvc2FibGUgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkbWFza0Nsb3NhYmxlLFxuICAgIG1hc2tTdHlsZSA9IHByb3BzLm1hc2tTdHlsZSxcbiAgICBtYXNrUHJvcHMgPSBwcm9wcy5tYXNrUHJvcHMsXG4gICAgcm9vdENsYXNzTmFtZSA9IHByb3BzLnJvb3RDbGFzc05hbWUsXG4gICAgbW9kYWxDbGFzc05hbWVzID0gcHJvcHMuY2xhc3NOYW1lcyxcbiAgICBtb2RhbFN0eWxlcyA9IHByb3BzLnN0eWxlcztcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBbJ3dyYXBTdHlsZScsICdib2R5U3R5bGUnLCAnbWFza1N0eWxlJ10uZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgLy8gKHByb3AgaW4gcHJvcHMpICYmIGNvbnNvbGUuZXJyb3IoYFdhcm5pbmc6ICR7cHJvcH0gaXMgZGVwcmVjYXRlZCwgcGxlYXNlIHVzZSBzdHlsZXMgaW5zdGVhZC5gKVxuICAgICAgd2FybmluZyghKHByb3AgaW4gcHJvcHMpLCBcIlwiLmNvbmNhdChwcm9wLCBcIiBpcyBkZXByZWNhdGVkLCBwbGVhc2UgdXNlIHN0eWxlcyBpbnN0ZWFkLlwiKSk7XG4gICAgfSk7XG4gICAgaWYgKCd3cmFwQ2xhc3NOYW1lJyBpbiBwcm9wcykge1xuICAgICAgd2FybmluZyhmYWxzZSwgXCJ3cmFwQ2xhc3NOYW1lIGlzIGRlcHJlY2F0ZWQsIHBsZWFzZSB1c2UgY2xhc3NOYW1lcyBpbnN0ZWFkLlwiKTtcbiAgICB9XG4gIH1cbiAgdmFyIGxhc3RPdXRTaWRlQWN0aXZlRWxlbWVudFJlZiA9IHVzZVJlZigpO1xuICB2YXIgd3JhcHBlclJlZiA9IHVzZVJlZigpO1xuICB2YXIgY29udGVudFJlZiA9IHVzZVJlZigpO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUodmlzaWJsZSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgYW5pbWF0ZWRWaXNpYmxlID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXRBbmltYXRlZFZpc2libGUgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IEluaXQgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGFyaWFJZCA9IHVzZUlkKCk7XG4gIGZ1bmN0aW9uIHNhdmVMYXN0T3V0U2lkZUFjdGl2ZUVsZW1lbnRSZWYoKSB7XG4gICAgaWYgKCFjb250YWlucyh3cmFwcGVyUmVmLmN1cnJlbnQsIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICBsYXN0T3V0U2lkZUFjdGl2ZUVsZW1lbnRSZWYuY3VycmVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGZvY3VzRGlhbG9nQ29udGVudCgpIHtcbiAgICBpZiAoIWNvbnRhaW5zKHdyYXBwZXJSZWYuY3VycmVudCwgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpIHtcbiAgICAgIHZhciBfY29udGVudFJlZiRjdXJyZW50O1xuICAgICAgKF9jb250ZW50UmVmJGN1cnJlbnQgPSBjb250ZW50UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9jb250ZW50UmVmJGN1cnJlbnQgPT09IHZvaWQgMCB8fCBfY29udGVudFJlZiRjdXJyZW50LmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBFdmVudHMgPT09PT09PT09PT09PT09PT09PT09PT09PVxuICBmdW5jdGlvbiBvbkRpYWxvZ1Zpc2libGVDaGFuZ2VkKG5ld1Zpc2libGUpIHtcbiAgICAvLyBUcnkgdG8gZm9jdXNcbiAgICBpZiAobmV3VmlzaWJsZSkge1xuICAgICAgZm9jdXNEaWFsb2dDb250ZW50KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENsZWFuIHVwIHNjcm9sbCBiYXIgJiBmb2N1cyBiYWNrXG4gICAgICBzZXRBbmltYXRlZFZpc2libGUoZmFsc2UpO1xuICAgICAgaWYgKG1hc2sgJiYgbGFzdE91dFNpZGVBY3RpdmVFbGVtZW50UmVmLmN1cnJlbnQgJiYgZm9jdXNUcmlnZ2VyQWZ0ZXJDbG9zZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxhc3RPdXRTaWRlQWN0aXZlRWxlbWVudFJlZi5jdXJyZW50LmZvY3VzKHtcbiAgICAgICAgICAgIHByZXZlbnRTY3JvbGw6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIERvIG5vdGhpbmdcbiAgICAgICAgfVxuICAgICAgICBsYXN0T3V0U2lkZUFjdGl2ZUVsZW1lbnRSZWYuY3VycmVudCA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIFRyaWdnZXIgYWZ0ZXJDbG9zZSBvbmx5IHdoZW4gY2hhbmdlIHZpc2libGUgZnJvbSB0cnVlIHRvIGZhbHNlXG4gICAgICBpZiAoYW5pbWF0ZWRWaXNpYmxlKSB7XG4gICAgICAgIGFmdGVyQ2xvc2UgPT09IG51bGwgfHwgYWZ0ZXJDbG9zZSA9PT0gdm9pZCAwIHx8IGFmdGVyQ2xvc2UoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYWZ0ZXJPcGVuQ2hhbmdlID09PSBudWxsIHx8IGFmdGVyT3BlbkNoYW5nZSA9PT0gdm9pZCAwIHx8IGFmdGVyT3BlbkNoYW5nZShuZXdWaXNpYmxlKTtcbiAgfVxuICBmdW5jdGlvbiBvbkludGVybmFsQ2xvc2UoZSkge1xuICAgIG9uQ2xvc2UgPT09IG51bGwgfHwgb25DbG9zZSA9PT0gdm9pZCAwIHx8IG9uQ2xvc2UoZSk7XG4gIH1cblxuICAvLyA+Pj4gQ29udGVudFxuICB2YXIgY29udGVudENsaWNrUmVmID0gdXNlUmVmKGZhbHNlKTtcbiAgdmFyIGNvbnRlbnRUaW1lb3V0UmVmID0gdXNlUmVmKCk7XG5cbiAgLy8gV2UgbmVlZCByZWNvcmQgY29udGVudCBjbGljayBpbmNhc2UgY29udGVudCBwb3B1cCBvdXQgb2YgZGlhbG9nXG4gIHZhciBvbkNvbnRlbnRNb3VzZURvd24gPSBmdW5jdGlvbiBvbkNvbnRlbnRNb3VzZURvd24oKSB7XG4gICAgY2xlYXJUaW1lb3V0KGNvbnRlbnRUaW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgIGNvbnRlbnRDbGlja1JlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgfTtcbiAgdmFyIG9uQ29udGVudE1vdXNlVXAgPSBmdW5jdGlvbiBvbkNvbnRlbnRNb3VzZVVwKCkge1xuICAgIGNvbnRlbnRUaW1lb3V0UmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnRlbnRDbGlja1JlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgfSk7XG4gIH07XG5cbiAgLy8gPj4+IFdyYXBwZXJcbiAgLy8gQ2xvc2Ugb25seSB3aGVuIGVsZW1lbnQgbm90IG9uIGRpYWxvZ1xuICB2YXIgb25XcmFwcGVyQ2xpY2sgPSBudWxsO1xuICBpZiAobWFza0Nsb3NhYmxlKSB7XG4gICAgb25XcmFwcGVyQ2xpY2sgPSBmdW5jdGlvbiBvbldyYXBwZXJDbGljayhlKSB7XG4gICAgICBpZiAoY29udGVudENsaWNrUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgY29udGVudENsaWNrUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAod3JhcHBlclJlZi5jdXJyZW50ID09PSBlLnRhcmdldCkge1xuICAgICAgICBvbkludGVybmFsQ2xvc2UoZSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBvbldyYXBwZXJLZXlEb3duKGUpIHtcbiAgICBpZiAoa2V5Ym9hcmQgJiYgZS5rZXlDb2RlID09PSBLZXlDb2RlLkVTQykge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIG9uSW50ZXJuYWxDbG9zZShlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBrZWVwIGZvY3VzIGluc2lkZSBkaWFsb2dcbiAgICBpZiAodmlzaWJsZSAmJiBlLmtleUNvZGUgPT09IEtleUNvZGUuVEFCKSB7XG4gICAgICBjb250ZW50UmVmLmN1cnJlbnQuY2hhbmdlQWN0aXZlKCFlLnNoaWZ0S2V5KTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IEVmZmVjdCA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHZpc2libGUpIHtcbiAgICAgIHNldEFuaW1hdGVkVmlzaWJsZSh0cnVlKTtcbiAgICAgIHNhdmVMYXN0T3V0U2lkZUFjdGl2ZUVsZW1lbnRSZWYoKTtcbiAgICB9XG4gIH0sIFt2aXNpYmxlXSk7XG5cbiAgLy8gUmVtb3ZlIGRpcmVjdCBzaG91bGQgYWxzbyBjaGVjayB0aGUgc2Nyb2xsIGJhciB1cGRhdGVcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgY2xlYXJUaW1lb3V0KGNvbnRlbnRUaW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgdmFyIG1lcmdlZFN0eWxlID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe1xuICAgIHpJbmRleDogekluZGV4XG4gIH0sIHdyYXBTdHlsZSksIG1vZGFsU3R5bGVzID09PSBudWxsIHx8IG1vZGFsU3R5bGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtb2RhbFN0eWxlcy53cmFwcGVyKSwge30sIHtcbiAgICBkaXNwbGF5OiAhYW5pbWF0ZWRWaXNpYmxlID8gJ25vbmUnIDogbnVsbFxuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcm9vdFwiKSwgcm9vdENsYXNzTmFtZSlcbiAgfSwgcGlja0F0dHJzKHByb3BzLCB7XG4gICAgZGF0YTogdHJ1ZVxuICB9KSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE1hc2ssIHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICB2aXNpYmxlOiBtYXNrICYmIHZpc2libGUsXG4gICAgbW90aW9uTmFtZTogZ2V0TW90aW9uTmFtZShwcmVmaXhDbHMsIG1hc2tUcmFuc2l0aW9uTmFtZSwgbWFza0FuaW1hdGlvbiksXG4gICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7XG4gICAgICB6SW5kZXg6IHpJbmRleFxuICAgIH0sIG1hc2tTdHlsZSksIG1vZGFsU3R5bGVzID09PSBudWxsIHx8IG1vZGFsU3R5bGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtb2RhbFN0eWxlcy5tYXNrKSxcbiAgICBtYXNrUHJvcHM6IG1hc2tQcm9wcyxcbiAgICBjbGFzc05hbWU6IG1vZGFsQ2xhc3NOYW1lcyA9PT0gbnVsbCB8fCBtb2RhbENsYXNzTmFtZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1vZGFsQ2xhc3NOYW1lcy5tYXNrXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgdGFiSW5kZXg6IC0xLFxuICAgIG9uS2V5RG93bjogb25XcmFwcGVyS2V5RG93bixcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi13cmFwXCIpLCB3cmFwQ2xhc3NOYW1lLCBtb2RhbENsYXNzTmFtZXMgPT09IG51bGwgfHwgbW9kYWxDbGFzc05hbWVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtb2RhbENsYXNzTmFtZXMud3JhcHBlciksXG4gICAgcmVmOiB3cmFwcGVyUmVmLFxuICAgIG9uQ2xpY2s6IG9uV3JhcHBlckNsaWNrLFxuICAgIHN0eWxlOiBtZXJnZWRTdHlsZVxuICB9LCB3cmFwUHJvcHMpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb250ZW50LCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICBvbk1vdXNlRG93bjogb25Db250ZW50TW91c2VEb3duLFxuICAgIG9uTW91c2VVcDogb25Db250ZW50TW91c2VVcCxcbiAgICByZWY6IGNvbnRlbnRSZWYsXG4gICAgY2xvc2FibGU6IGNsb3NhYmxlLFxuICAgIGFyaWFJZDogYXJpYUlkLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIHZpc2libGU6IHZpc2libGUgJiYgYW5pbWF0ZWRWaXNpYmxlLFxuICAgIG9uQ2xvc2U6IG9uSW50ZXJuYWxDbG9zZSxcbiAgICBvblZpc2libGVDaGFuZ2VkOiBvbkRpYWxvZ1Zpc2libGVDaGFuZ2VkLFxuICAgIG1vdGlvbk5hbWU6IGdldE1vdGlvbk5hbWUocHJlZml4Q2xzLCB0cmFuc2l0aW9uTmFtZSwgYW5pbWF0aW9uKVxuICB9KSkpKTtcbn07XG5leHBvcnQgZGVmYXVsdCBEaWFsb2c7IiwgImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmZ1bmN0aW9uIGdldFVzZUlkKCkge1xuICAvLyBXZSBuZWVkIGZ1bGx5IGNsb25lIFJlYWN0IGZ1bmN0aW9uIGhlcmUgdG8gYXZvaWQgd2VicGFjayB3YXJuaW5nIFJlYWN0IDE3IGRvIG5vdCBleHBvcnQgYHVzZUlkYFxuICB2YXIgZnVsbENsb25lID0gX29iamVjdFNwcmVhZCh7fSwgUmVhY3QpO1xuICByZXR1cm4gZnVsbENsb25lLnVzZUlkO1xufVxudmFyIHV1aWQgPSAwO1xuXG4vKiogQHByaXZhdGUgTm90ZSBvbmx5IHdvcmtlZCBpbiBkZXZlbG9wIGVudi4gTm90IHdvcmsgaW4gcHJvZHVjdGlvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNldFV1aWQoKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdXVpZCA9IDA7XG4gIH1cbn1cbnZhciB1c2VPcmlnaW5JZCA9IGdldFVzZUlkKCk7XG5leHBvcnQgZGVmYXVsdCB1c2VPcmlnaW5JZCA/XG4vLyBVc2UgUmVhY3QgYHVzZUlkYFxuZnVuY3Rpb24gdXNlSWQoaWQpIHtcbiAgdmFyIHJlYWN0SWQgPSB1c2VPcmlnaW5JZCgpO1xuXG4gIC8vIERldmVsb3BlciBwYXNzZWQgaWQgaXMgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aFxuICBpZiAoaWQpIHtcbiAgICByZXR1cm4gaWQ7XG4gIH1cblxuICAvLyBUZXN0IGVudiBhbHdheXMgcmV0dXJuIG1vY2sgaWRcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAndGVzdCcpIHtcbiAgICByZXR1cm4gJ3Rlc3QtaWQnO1xuICB9XG4gIHJldHVybiByZWFjdElkO1xufSA6XG4vLyBVc2UgY29tcGF0aWJsZSBvZiBgdXNlSWRgXG5mdW5jdGlvbiB1c2VDb21wYXRJZChpZCkge1xuICAvLyBJbm5lciBpZCBmb3IgYWNjZXNzaWJpbGl0eSB1c2FnZS4gT25seSB3b3JrIGluIGNsaWVudCBzaWRlXG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZSgnc3NyLWlkJyksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgaW5uZXJJZCA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0SW5uZXJJZCA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG5leHRJZCA9IHV1aWQ7XG4gICAgdXVpZCArPSAxO1xuICAgIHNldElubmVySWQoXCJyY191bmlxdWVfXCIuY29uY2F0KG5leHRJZCkpO1xuICB9LCBbXSk7XG5cbiAgLy8gRGV2ZWxvcGVyIHBhc3NlZCBpZCBpcyBzaW5nbGUgc291cmNlIG9mIHRydXRoXG4gIGlmIChpZCkge1xuICAgIHJldHVybiBpZDtcbiAgfVxuXG4gIC8vIFRlc3QgZW52IGFsd2F5cyByZXR1cm4gbW9jayBpZFxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICd0ZXN0Jykge1xuICAgIHJldHVybiAndGVzdC1pZCc7XG4gIH1cblxuICAvLyBSZXR1cm4gcmVhY3QgbmF0aXZlIGlkIG9yIGlubmVyIGlkXG4gIHJldHVybiBpbm5lcklkO1xufTsiLCAiLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBNb3Rpb24gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuZXhwb3J0IGZ1bmN0aW9uIGdldE1vdGlvbk5hbWUocHJlZml4Q2xzLCB0cmFuc2l0aW9uTmFtZSwgYW5pbWF0aW9uTmFtZSkge1xuICB2YXIgbW90aW9uTmFtZSA9IHRyYW5zaXRpb25OYW1lO1xuICBpZiAoIW1vdGlvbk5hbWUgJiYgYW5pbWF0aW9uTmFtZSkge1xuICAgIG1vdGlvbk5hbWUgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQoYW5pbWF0aW9uTmFtZSk7XG4gIH1cbiAgcmV0dXJuIG1vdGlvbk5hbWU7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gT2Zmc2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmZ1bmN0aW9uIGdldFNjcm9sbCh3LCB0b3ApIHtcbiAgdmFyIHJldCA9IHdbXCJwYWdlXCIuY29uY2F0KHRvcCA/ICdZJyA6ICdYJywgXCJPZmZzZXRcIildO1xuICB2YXIgbWV0aG9kID0gXCJzY3JvbGxcIi5jb25jYXQodG9wID8gJ1RvcCcgOiAnTGVmdCcpO1xuICBpZiAodHlwZW9mIHJldCAhPT0gJ251bWJlcicpIHtcbiAgICB2YXIgZCA9IHcuZG9jdW1lbnQ7XG4gICAgcmV0ID0gZC5kb2N1bWVudEVsZW1lbnRbbWV0aG9kXTtcbiAgICBpZiAodHlwZW9mIHJldCAhPT0gJ251bWJlcicpIHtcbiAgICAgIHJldCA9IGQuYm9keVttZXRob2RdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmV0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIG9mZnNldChlbCkge1xuICB2YXIgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB2YXIgcG9zID0ge1xuICAgIGxlZnQ6IHJlY3QubGVmdCxcbiAgICB0b3A6IHJlY3QudG9wXG4gIH07XG4gIHZhciBkb2MgPSBlbC5vd25lckRvY3VtZW50O1xuICB2YXIgdyA9IGRvYy5kZWZhdWx0VmlldyB8fCBkb2MucGFyZW50V2luZG93O1xuICBwb3MubGVmdCArPSBnZXRTY3JvbGwodyk7XG4gIHBvcy50b3AgKz0gZ2V0U2Nyb2xsKHcsIHRydWUpO1xuICByZXR1cm4gcG9zO1xufSIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IENTU01vdGlvbiBmcm9tICdyYy1tb3Rpb24nO1xuaW1wb3J0IHsgb2Zmc2V0IH0gZnJvbSBcIi4uLy4uL3V0aWxcIjtcbmltcG9ydCBQYW5lbCBmcm9tIFwiLi9QYW5lbFwiO1xudmFyIENvbnRlbnQgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIHRpdGxlID0gcHJvcHMudGl0bGUsXG4gICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgdmlzaWJsZSA9IHByb3BzLnZpc2libGUsXG4gICAgZm9yY2VSZW5kZXIgPSBwcm9wcy5mb3JjZVJlbmRlcixcbiAgICBkZXN0cm95T25DbG9zZSA9IHByb3BzLmRlc3Ryb3lPbkNsb3NlLFxuICAgIG1vdGlvbk5hbWUgPSBwcm9wcy5tb3Rpb25OYW1lLFxuICAgIGFyaWFJZCA9IHByb3BzLmFyaWFJZCxcbiAgICBvblZpc2libGVDaGFuZ2VkID0gcHJvcHMub25WaXNpYmxlQ2hhbmdlZCxcbiAgICBtb3VzZVBvc2l0aW9uID0gcHJvcHMubW91c2VQb3NpdGlvbjtcbiAgdmFyIGRpYWxvZ1JlZiA9IHVzZVJlZigpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFN0eWxlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICB0cmFuc2Zvcm1PcmlnaW4gPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldFRyYW5zZm9ybU9yaWdpbiA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciBjb250ZW50U3R5bGUgPSB7fTtcbiAgaWYgKHRyYW5zZm9ybU9yaWdpbikge1xuICAgIGNvbnRlbnRTdHlsZS50cmFuc2Zvcm1PcmlnaW4gPSB0cmFuc2Zvcm1PcmlnaW47XG4gIH1cbiAgZnVuY3Rpb24gb25QcmVwYXJlKCkge1xuICAgIHZhciBlbGVtZW50T2Zmc2V0ID0gb2Zmc2V0KGRpYWxvZ1JlZi5jdXJyZW50KTtcbiAgICBzZXRUcmFuc2Zvcm1PcmlnaW4obW91c2VQb3NpdGlvbiAmJiAobW91c2VQb3NpdGlvbi54IHx8IG1vdXNlUG9zaXRpb24ueSkgPyBcIlwiLmNvbmNhdChtb3VzZVBvc2l0aW9uLnggLSBlbGVtZW50T2Zmc2V0LmxlZnQsIFwicHggXCIpLmNvbmNhdChtb3VzZVBvc2l0aW9uLnkgLSBlbGVtZW50T2Zmc2V0LnRvcCwgXCJweFwiKSA6ICcnKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ1NTTW90aW9uLCB7XG4gICAgdmlzaWJsZTogdmlzaWJsZSxcbiAgICBvblZpc2libGVDaGFuZ2VkOiBvblZpc2libGVDaGFuZ2VkLFxuICAgIG9uQXBwZWFyUHJlcGFyZTogb25QcmVwYXJlLFxuICAgIG9uRW50ZXJQcmVwYXJlOiBvblByZXBhcmUsXG4gICAgZm9yY2VSZW5kZXI6IGZvcmNlUmVuZGVyLFxuICAgIG1vdGlvbk5hbWU6IG1vdGlvbk5hbWUsXG4gICAgcmVtb3ZlT25MZWF2ZTogZGVzdHJveU9uQ2xvc2UsXG4gICAgcmVmOiBkaWFsb2dSZWZcbiAgfSwgZnVuY3Rpb24gKF9yZWYsIG1vdGlvblJlZikge1xuICAgIHZhciBtb3Rpb25DbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICAgIG1vdGlvblN0eWxlID0gX3JlZi5zdHlsZTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUGFuZWwsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgICAgcmVmOiByZWYsXG4gICAgICB0aXRsZTogdGl0bGUsXG4gICAgICBhcmlhSWQ6IGFyaWFJZCxcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgaG9sZGVyUmVmOiBtb3Rpb25SZWYsXG4gICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG1vdGlvblN0eWxlKSwgc3R5bGUpLCBjb250ZW50U3R5bGUpLFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgbW90aW9uQ2xhc3NOYW1lKVxuICAgIH0pKTtcbiAgfSk7XG59KTtcbkNvbnRlbnQuZGlzcGxheU5hbWUgPSAnQ29udGVudCc7XG5leHBvcnQgZGVmYXVsdCBDb250ZW50OyIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IHVzZUNvbXBvc2VSZWYgfSBmcm9tIFwicmMtdXRpbC9lcy9yZWZcIjtcbmltcG9ydCBSZWFjdCwgeyB1c2VNZW1vLCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBSZWZDb250ZXh0IH0gZnJvbSBcIi4uLy4uL2NvbnRleHRcIjtcbmltcG9ydCBNZW1vQ2hpbGRyZW4gZnJvbSBcIi4vTWVtb0NoaWxkcmVuXCI7XG5pbXBvcnQgcGlja0F0dHJzIGZyb20gXCJyYy11dGlsL2VzL3BpY2tBdHRyc1wiO1xudmFyIHNlbnRpbmVsU3R5bGUgPSB7XG4gIHdpZHRoOiAwLFxuICBoZWlnaHQ6IDAsXG4gIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgb3V0bGluZTogJ25vbmUnXG59O1xudmFyIGVudGl0eVN0eWxlID0ge1xuICBvdXRsaW5lOiAnbm9uZSdcbn07XG52YXIgUGFuZWwgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgIHRpdGxlID0gcHJvcHMudGl0bGUsXG4gICAgYXJpYUlkID0gcHJvcHMuYXJpYUlkLFxuICAgIGZvb3RlciA9IHByb3BzLmZvb3RlcixcbiAgICBjbG9zYWJsZSA9IHByb3BzLmNsb3NhYmxlLFxuICAgIGNsb3NlSWNvbiA9IHByb3BzLmNsb3NlSWNvbixcbiAgICBvbkNsb3NlID0gcHJvcHMub25DbG9zZSxcbiAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgIGJvZHlTdHlsZSA9IHByb3BzLmJvZHlTdHlsZSxcbiAgICBib2R5UHJvcHMgPSBwcm9wcy5ib2R5UHJvcHMsXG4gICAgbW9kYWxSZW5kZXIgPSBwcm9wcy5tb2RhbFJlbmRlcixcbiAgICBvbk1vdXNlRG93biA9IHByb3BzLm9uTW91c2VEb3duLFxuICAgIG9uTW91c2VVcCA9IHByb3BzLm9uTW91c2VVcCxcbiAgICBob2xkZXJSZWYgPSBwcm9wcy5ob2xkZXJSZWYsXG4gICAgdmlzaWJsZSA9IHByb3BzLnZpc2libGUsXG4gICAgZm9yY2VSZW5kZXIgPSBwcm9wcy5mb3JjZVJlbmRlcixcbiAgICB3aWR0aCA9IHByb3BzLndpZHRoLFxuICAgIGhlaWdodCA9IHByb3BzLmhlaWdodCxcbiAgICBtb2RhbENsYXNzTmFtZXMgPSBwcm9wcy5jbGFzc05hbWVzLFxuICAgIG1vZGFsU3R5bGVzID0gcHJvcHMuc3R5bGVzO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZWZzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KFJlZkNvbnRleHQpLFxuICAgIHBhbmVsUmVmID0gX1JlYWN0JHVzZUNvbnRleHQucGFuZWw7XG4gIHZhciBtZXJnZWRSZWYgPSB1c2VDb21wb3NlUmVmKGhvbGRlclJlZiwgcGFuZWxSZWYpO1xuICB2YXIgc2VudGluZWxTdGFydFJlZiA9IHVzZVJlZigpO1xuICB2YXIgc2VudGluZWxFbmRSZWYgPSB1c2VSZWYoKTtcbiAgUmVhY3QudXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZm9jdXM6IGZ1bmN0aW9uIGZvY3VzKCkge1xuICAgICAgICB2YXIgX3NlbnRpbmVsU3RhcnRSZWYkY3VyO1xuICAgICAgICAoX3NlbnRpbmVsU3RhcnRSZWYkY3VyID0gc2VudGluZWxTdGFydFJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfc2VudGluZWxTdGFydFJlZiRjdXIgPT09IHZvaWQgMCB8fCBfc2VudGluZWxTdGFydFJlZiRjdXIuZm9jdXMoe1xuICAgICAgICAgIHByZXZlbnRTY3JvbGw6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgY2hhbmdlQWN0aXZlOiBmdW5jdGlvbiBjaGFuZ2VBY3RpdmUobmV4dCkge1xuICAgICAgICB2YXIgX2RvY3VtZW50ID0gZG9jdW1lbnQsXG4gICAgICAgICAgYWN0aXZlRWxlbWVudCA9IF9kb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgICBpZiAobmV4dCAmJiBhY3RpdmVFbGVtZW50ID09PSBzZW50aW5lbEVuZFJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgc2VudGluZWxTdGFydFJlZi5jdXJyZW50LmZvY3VzKHtcbiAgICAgICAgICAgIHByZXZlbnRTY3JvbGw6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICghbmV4dCAmJiBhY3RpdmVFbGVtZW50ID09PSBzZW50aW5lbFN0YXJ0UmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBzZW50aW5lbEVuZFJlZi5jdXJyZW50LmZvY3VzKHtcbiAgICAgICAgICAgIHByZXZlbnRTY3JvbGw6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFN0eWxlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgY29udGVudFN0eWxlID0ge307XG4gIGlmICh3aWR0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29udGVudFN0eWxlLndpZHRoID0gd2lkdGg7XG4gIH1cbiAgaWYgKGhlaWdodCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29udGVudFN0eWxlLmhlaWdodCA9IGhlaWdodDtcbiAgfVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGZvb3Rlck5vZGUgPSBmb290ZXIgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZm9vdGVyXCIpLCBtb2RhbENsYXNzTmFtZXMgPT09IG51bGwgfHwgbW9kYWxDbGFzc05hbWVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtb2RhbENsYXNzTmFtZXMuZm9vdGVyKSxcbiAgICBzdHlsZTogX29iamVjdFNwcmVhZCh7fSwgbW9kYWxTdHlsZXMgPT09IG51bGwgfHwgbW9kYWxTdHlsZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1vZGFsU3R5bGVzLmZvb3RlcilcbiAgfSwgZm9vdGVyKSA6IG51bGw7XG4gIHZhciBoZWFkZXJOb2RlID0gdGl0bGUgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaGVhZGVyXCIpLCBtb2RhbENsYXNzTmFtZXMgPT09IG51bGwgfHwgbW9kYWxDbGFzc05hbWVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtb2RhbENsYXNzTmFtZXMuaGVhZGVyKSxcbiAgICBzdHlsZTogX29iamVjdFNwcmVhZCh7fSwgbW9kYWxTdHlsZXMgPT09IG51bGwgfHwgbW9kYWxTdHlsZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1vZGFsU3R5bGVzLmhlYWRlcilcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10aXRsZVwiKSxcbiAgICBpZDogYXJpYUlkXG4gIH0sIHRpdGxlKSkgOiBudWxsO1xuICB2YXIgY2xvc2FibGVPYmogPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoX3R5cGVvZihjbG9zYWJsZSkgPT09ICdvYmplY3QnICYmIGNsb3NhYmxlICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gY2xvc2FibGU7XG4gICAgfVxuICAgIGlmIChjbG9zYWJsZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2xvc2VJY29uOiBjbG9zZUljb24gIT09IG51bGwgJiYgY2xvc2VJY29uICE9PSB2b2lkIDAgPyBjbG9zZUljb24gOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jbG9zZS14XCIpXG4gICAgICAgIH0pXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge307XG4gIH0sIFtjbG9zYWJsZSwgY2xvc2VJY29uLCBwcmVmaXhDbHNdKTtcbiAgdmFyIGFyaWFQcm9wcyA9IHBpY2tBdHRycyhjbG9zYWJsZU9iaiwgdHJ1ZSk7XG4gIHZhciBjbG9zZUJ0bklzRGlzYWJsZWQgPSBfdHlwZW9mKGNsb3NhYmxlKSA9PT0gJ29iamVjdCcgJiYgY2xvc2FibGUuZGlzYWJsZWQ7XG4gIHZhciBjbG9zZXJOb2RlID0gY2xvc2FibGUgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCBfZXh0ZW5kcyh7XG4gICAgdHlwZTogXCJidXR0b25cIixcbiAgICBvbkNsaWNrOiBvbkNsb3NlLFxuICAgIFwiYXJpYS1sYWJlbFwiOiBcIkNsb3NlXCJcbiAgfSwgYXJpYVByb3BzLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNsb3NlXCIpLFxuICAgIGRpc2FibGVkOiBjbG9zZUJ0bklzRGlzYWJsZWRcbiAgfSksIGNsb3NhYmxlT2JqLmNsb3NlSWNvbikgOiBudWxsO1xuICB2YXIgY29udGVudCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb250ZW50XCIpLCBtb2RhbENsYXNzTmFtZXMgPT09IG51bGwgfHwgbW9kYWxDbGFzc05hbWVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtb2RhbENsYXNzTmFtZXMuY29udGVudCksXG4gICAgc3R5bGU6IG1vZGFsU3R5bGVzID09PSBudWxsIHx8IG1vZGFsU3R5bGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtb2RhbFN0eWxlcy5jb250ZW50XG4gIH0sIGNsb3Nlck5vZGUsIGhlYWRlck5vZGUsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ib2R5XCIpLCBtb2RhbENsYXNzTmFtZXMgPT09IG51bGwgfHwgbW9kYWxDbGFzc05hbWVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtb2RhbENsYXNzTmFtZXMuYm9keSksXG4gICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgYm9keVN0eWxlKSwgbW9kYWxTdHlsZXMgPT09IG51bGwgfHwgbW9kYWxTdHlsZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1vZGFsU3R5bGVzLmJvZHkpXG4gIH0sIGJvZHlQcm9wcyksIGNoaWxkcmVuKSwgZm9vdGVyTm9kZSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAga2V5OiBcImRpYWxvZy1lbGVtZW50XCIsXG4gICAgcm9sZTogXCJkaWFsb2dcIixcbiAgICBcImFyaWEtbGFiZWxsZWRieVwiOiB0aXRsZSA/IGFyaWFJZCA6IG51bGwsXG4gICAgXCJhcmlhLW1vZGFsXCI6IFwidHJ1ZVwiLFxuICAgIHJlZjogbWVyZ2VkUmVmLFxuICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN0eWxlKSwgY29udGVudFN0eWxlKSxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMocHJlZml4Q2xzLCBjbGFzc05hbWUpLFxuICAgIG9uTW91c2VEb3duOiBvbk1vdXNlRG93bixcbiAgICBvbk1vdXNlVXA6IG9uTW91c2VVcFxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgcmVmOiBzZW50aW5lbFN0YXJ0UmVmLFxuICAgIHRhYkluZGV4OiAwLFxuICAgIHN0eWxlOiBlbnRpdHlTdHlsZVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChNZW1vQ2hpbGRyZW4sIHtcbiAgICBzaG91bGRVcGRhdGU6IHZpc2libGUgfHwgZm9yY2VSZW5kZXJcbiAgfSwgbW9kYWxSZW5kZXIgPyBtb2RhbFJlbmRlcihjb250ZW50KSA6IGNvbnRlbnQpKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHRhYkluZGV4OiAwLFxuICAgIHJlZjogc2VudGluZWxFbmRSZWYsXG4gICAgc3R5bGU6IHNlbnRpbmVsU3R5bGVcbiAgfSkpO1xufSk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBQYW5lbC5kaXNwbGF5TmFtZSA9ICdQYW5lbCc7XG59XG5leHBvcnQgZGVmYXVsdCBQYW5lbDsiLCAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL1JlYWN0Lm1lbW8oZnVuY3Rpb24gKF9yZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbjtcbiAgcmV0dXJuIGNoaWxkcmVuO1xufSwgZnVuY3Rpb24gKF8sIF9yZWYyKSB7XG4gIHZhciBzaG91bGRVcGRhdGUgPSBfcmVmMi5zaG91bGRVcGRhdGU7XG4gIHJldHVybiAhc2hvdWxkVXBkYXRlO1xufSk7IiwgImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IENTU01vdGlvbiBmcm9tICdyYy1tb3Rpb24nO1xudmFyIE1hc2sgPSBmdW5jdGlvbiBNYXNrKHByb3BzKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICB2aXNpYmxlID0gcHJvcHMudmlzaWJsZSxcbiAgICBtYXNrUHJvcHMgPSBwcm9wcy5tYXNrUHJvcHMsXG4gICAgbW90aW9uTmFtZSA9IHByb3BzLm1vdGlvbk5hbWUsXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ1NTTW90aW9uLCB7XG4gICAga2V5OiBcIm1hc2tcIixcbiAgICB2aXNpYmxlOiB2aXNpYmxlLFxuICAgIG1vdGlvbk5hbWU6IG1vdGlvbk5hbWUsXG4gICAgbGVhdmVkQ2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW1hc2staGlkZGVuXCIpXG4gIH0sIGZ1bmN0aW9uIChfcmVmLCByZWYpIHtcbiAgICB2YXIgbW90aW9uQ2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsXG4gICAgICBtb3Rpb25TdHlsZSA9IF9yZWYuc3R5bGU7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHtcbiAgICAgIHJlZjogcmVmLFxuICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgbW90aW9uU3R5bGUpLCBzdHlsZSksXG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1tYXNrXCIpLCBtb3Rpb25DbGFzc05hbWUsIGNsYXNzTmFtZSlcbiAgICB9LCBtYXNrUHJvcHMpKTtcbiAgfSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgTWFzazsiLCAiaW1wb3J0IERpYWxvZ1dyYXAgZnJvbSBcIi4vRGlhbG9nV3JhcFwiO1xuaW1wb3J0IFBhbmVsIGZyb20gXCIuL0RpYWxvZy9Db250ZW50L1BhbmVsXCI7XG5leHBvcnQgeyBQYW5lbCB9O1xuZXhwb3J0IGRlZmF1bHQgRGlhbG9nV3JhcDsiLCAiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBOb0Zvcm1TdHlsZSB9IGZyb20gJy4uL2Zvcm0vY29udGV4dCc7XG5pbXBvcnQgeyBOb0NvbXBhY3RTdHlsZSB9IGZyb20gJy4uL3NwYWNlL0NvbXBhY3QnO1xuY29uc3QgQ29udGV4dElzb2xhdG9yID0gcHJvcHMgPT4ge1xuICBjb25zdCB7XG4gICAgc3BhY2UsXG4gICAgZm9ybSxcbiAgICBjaGlsZHJlblxuICB9ID0gcHJvcHM7XG4gIGlmIChjaGlsZHJlbiA9PT0gdW5kZWZpbmVkIHx8IGNoaWxkcmVuID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgbGV0IHJlc3VsdCA9IGNoaWxkcmVuO1xuICBpZiAoZm9ybSkge1xuICAgIHJlc3VsdCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE5vRm9ybVN0eWxlLCB7XG4gICAgICBvdmVycmlkZTogdHJ1ZSxcbiAgICAgIHN0YXR1czogdHJ1ZVxuICAgIH0sIHJlc3VsdCk7XG4gIH1cbiAgaWYgKHNwYWNlKSB7XG4gICAgcmVzdWx0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTm9Db21wYWN0U3R5bGUsIG51bGwsIHJlc3VsdCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5leHBvcnQgZGVmYXVsdCBDb250ZXh0SXNvbGF0b3I7IiwgIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBGb3JtUHJvdmlkZXIgYXMgUmNGb3JtUHJvdmlkZXIgfSBmcm9tICdyYy1maWVsZC1mb3JtJztcbmltcG9ydCBvbWl0IGZyb20gXCJyYy11dGlsL2VzL29taXRcIjtcbmV4cG9ydCBjb25zdCBGb3JtQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHtcbiAgbGFiZWxBbGlnbjogJ3JpZ2h0JyxcbiAgdmVydGljYWw6IGZhbHNlLFxuICBpdGVtUmVmOiAoKSA9PiB7fVxufSk7XG5leHBvcnQgY29uc3QgTm9TdHlsZUl0ZW1Db250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQobnVsbCk7XG5leHBvcnQgY29uc3QgRm9ybVByb3ZpZGVyID0gcHJvcHMgPT4ge1xuICBjb25zdCBwcm92aWRlclByb3BzID0gb21pdChwcm9wcywgWydwcmVmaXhDbHMnXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSY0Zvcm1Qcm92aWRlciwgT2JqZWN0LmFzc2lnbih7fSwgcHJvdmlkZXJQcm9wcykpO1xufTtcbmV4cG9ydCBjb25zdCBGb3JtSXRlbVByZWZpeENvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh7XG4gIHByZWZpeENsczogJydcbn0pO1xuZXhwb3J0IGNvbnN0IEZvcm1JdGVtSW5wdXRDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQoe30pO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgRm9ybUl0ZW1JbnB1dENvbnRleHQuZGlzcGxheU5hbWUgPSAnRm9ybUl0ZW1JbnB1dENvbnRleHQnO1xufVxuZXhwb3J0IGNvbnN0IE5vRm9ybVN0eWxlID0gX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgY2hpbGRyZW4sXG4gICAgc3RhdHVzLFxuICAgIG92ZXJyaWRlXG4gIH0gPSBfcmVmO1xuICBjb25zdCBmb3JtSXRlbUlucHV0Q29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoRm9ybUl0ZW1JbnB1dENvbnRleHQpO1xuICBjb25zdCBuZXdGb3JtSXRlbUlucHV0Q29udGV4dCA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IG5ld0NvbnRleHQgPSBPYmplY3QuYXNzaWduKHt9LCBmb3JtSXRlbUlucHV0Q29udGV4dCk7XG4gICAgaWYgKG92ZXJyaWRlKSB7XG4gICAgICBkZWxldGUgbmV3Q29udGV4dC5pc0Zvcm1JdGVtSW5wdXQ7XG4gICAgfVxuICAgIGlmIChzdGF0dXMpIHtcbiAgICAgIGRlbGV0ZSBuZXdDb250ZXh0LnN0YXR1cztcbiAgICAgIGRlbGV0ZSBuZXdDb250ZXh0Lmhhc0ZlZWRiYWNrO1xuICAgICAgZGVsZXRlIG5ld0NvbnRleHQuZmVlZGJhY2tJY29uO1xuICAgIH1cbiAgICByZXR1cm4gbmV3Q29udGV4dDtcbiAgfSwgW3N0YXR1cywgb3ZlcnJpZGUsIGZvcm1JdGVtSW5wdXRDb250ZXh0XSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGb3JtSXRlbUlucHV0Q29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBuZXdGb3JtSXRlbUlucHV0Q29udGV4dFxuICB9LCBjaGlsZHJlbik7XG59O1xuZXhwb3J0IGNvbnN0IFZhcmlhbnRDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQodW5kZWZpbmVkKTsiLCAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEZpZWxkIGZyb20gXCIuL0ZpZWxkXCI7XG5pbXBvcnQgTGlzdCBmcm9tIFwiLi9MaXN0XCI7XG5pbXBvcnQgdXNlRm9ybSBmcm9tIFwiLi91c2VGb3JtXCI7XG5pbXBvcnQgRmllbGRGb3JtIGZyb20gXCIuL0Zvcm1cIjtcbmltcG9ydCB7IEZvcm1Qcm92aWRlciB9IGZyb20gXCIuL0Zvcm1Db250ZXh0XCI7XG5pbXBvcnQgRmllbGRDb250ZXh0IGZyb20gXCIuL0ZpZWxkQ29udGV4dFwiO1xuaW1wb3J0IExpc3RDb250ZXh0IGZyb20gXCIuL0xpc3RDb250ZXh0XCI7XG5pbXBvcnQgdXNlV2F0Y2ggZnJvbSBcIi4vdXNlV2F0Y2hcIjtcbnZhciBJbnRlcm5hbEZvcm0gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihGaWVsZEZvcm0pO1xudmFyIFJlZkZvcm0gPSBJbnRlcm5hbEZvcm07XG5SZWZGb3JtLkZvcm1Qcm92aWRlciA9IEZvcm1Qcm92aWRlcjtcblJlZkZvcm0uRmllbGQgPSBGaWVsZDtcblJlZkZvcm0uTGlzdCA9IExpc3Q7XG5SZWZGb3JtLnVzZUZvcm0gPSB1c2VGb3JtO1xuUmVmRm9ybS51c2VXYXRjaCA9IHVzZVdhdGNoO1xuZXhwb3J0IHsgRmllbGQsIExpc3QsIHVzZUZvcm0sIEZvcm1Qcm92aWRlciwgRmllbGRDb250ZXh0LCBMaXN0Q29udGV4dCwgdXNlV2F0Y2ggfTtcbmV4cG9ydCBkZWZhdWx0IFJlZkZvcm07IiwgImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbmltcG9ydCBfcmVnZW5lcmF0b3JSdW50aW1lIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9yZWdlbmVyYXRvclJ1bnRpbWVcIjtcbmltcG9ydCBfYXN5bmNUb0dlbmVyYXRvciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXN5bmNUb0dlbmVyYXRvclwiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3NlcnRUaGlzSW5pdGlhbGl6ZWRcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzXCI7XG5pbXBvcnQgX2NyZWF0ZVN1cGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVTdXBlclwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJuYW1lXCJdO1xuaW1wb3J0IHRvQ2hpbGRyZW5BcnJheSBmcm9tIFwicmMtdXRpbC9lcy9DaGlsZHJlbi90b0FycmF5XCI7XG5pbXBvcnQgaXNFcXVhbCBmcm9tIFwicmMtdXRpbC9lcy9pc0VxdWFsXCI7XG5pbXBvcnQgd2FybmluZyBmcm9tIFwicmMtdXRpbC9lcy93YXJuaW5nXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRmllbGRDb250ZXh0LCB7IEhPT0tfTUFSSyB9IGZyb20gXCIuL0ZpZWxkQ29udGV4dFwiO1xuaW1wb3J0IExpc3RDb250ZXh0IGZyb20gXCIuL0xpc3RDb250ZXh0XCI7XG5pbXBvcnQgeyB0b0FycmF5IH0gZnJvbSBcIi4vdXRpbHMvdHlwZVV0aWxcIjtcbmltcG9ydCB7IHZhbGlkYXRlUnVsZXMgfSBmcm9tIFwiLi91dGlscy92YWxpZGF0ZVV0aWxcIjtcbmltcG9ydCB7IGNvbnRhaW5zTmFtZVBhdGgsIGRlZmF1bHRHZXRWYWx1ZUZyb21FdmVudCwgZ2V0TmFtZVBhdGgsIGdldFZhbHVlIH0gZnJvbSBcIi4vdXRpbHMvdmFsdWVVdGlsXCI7XG52YXIgRU1QVFlfRVJST1JTID0gW107XG5mdW5jdGlvbiByZXF1aXJlVXBkYXRlKHNob3VsZFVwZGF0ZSwgcHJldiwgbmV4dCwgcHJldlZhbHVlLCBuZXh0VmFsdWUsIGluZm8pIHtcbiAgaWYgKHR5cGVvZiBzaG91bGRVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gc2hvdWxkVXBkYXRlKHByZXYsIG5leHQsICdzb3VyY2UnIGluIGluZm8gPyB7XG4gICAgICBzb3VyY2U6IGluZm8uc291cmNlXG4gICAgfSA6IHt9KTtcbiAgfVxuICByZXR1cm4gcHJldlZhbHVlICE9PSBuZXh0VmFsdWU7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvY29uc2lzdGVudC1pbmRleGVkLW9iamVjdC1zdHlsZVxuLy8gV2UgdXNlIENsYXNzIGluc3RlYWQgb2YgSG9va3MgaGVyZSBzaW5jZSBpdCB3aWxsIGNvc3QgbXVjaCBjb2RlIGJ5IHVzaW5nIEhvb2tzLlxudmFyIEZpZWxkID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhGaWVsZCwgX1JlYWN0JENvbXBvbmVudCk7XG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoRmllbGQpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU3Vic2NyaXB0aW9ucyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgZnVuY3Rpb24gRmllbGQocHJvcHMpIHtcbiAgICB2YXIgX3RoaXM7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEZpZWxkKTtcbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHByb3BzKTtcblxuICAgIC8vIFJlZ2lzdGVyIG9uIGluaXRcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwic3RhdGVcIiwge1xuICAgICAgcmVzZXRDb3VudDogMFxuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJjYW5jZWxSZWdpc3RlckZ1bmNcIiwgbnVsbCk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm1vdW50ZWRcIiwgZmFsc2UpO1xuICAgIC8qKlxuICAgICAqIEZvbGxvdyBzdGF0ZSBzaG91bGQgbm90IG1hbmFnZW1lbnQgaW4gU3RhdGUgc2luY2UgaXQgd2lsbCBhc3luYyB1cGRhdGUgYnkgUmVhY3QuXG4gICAgICogVGhpcyBtYWtlcyBmaXJzdCByZW5kZXIgb2YgZm9ybSBjYW4gbm90IGdldCBjb3JyZWN0IHN0YXRlIHZhbHVlLlxuICAgICAqL1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJ0b3VjaGVkXCIsIGZhbHNlKTtcbiAgICAvKipcbiAgICAgKiBNYXJrIHdoZW4gdG91Y2hlZCAmIHZhbGlkYXRlZC4gQ3VycmVudGx5IG9ubHkgdXNlZCBmb3IgYGRlcGVuZGVuY2llc2AuXG4gICAgICogTm90ZSB0aGF0IHdlIGRvIG5vdCB0aGluayBmaWVsZCB3aXRoIGBpbml0aWFsVmFsdWVgIGlzIGRpcnR5XG4gICAgICogYnV0IHRoaXMgd2lsbCBiZSBieSBgaXNGaWVsZERpcnR5YCBmdW5jLlxuICAgICAqL1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJkaXJ0eVwiLCBmYWxzZSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInZhbGlkYXRlUHJvbWlzZVwiLCB2b2lkIDApO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJwcmV2VmFsaWRhdGluZ1wiLCB2b2lkIDApO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJlcnJvcnNcIiwgRU1QVFlfRVJST1JTKTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwid2FybmluZ3NcIiwgRU1QVFlfRVJST1JTKTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiY2FuY2VsUmVnaXN0ZXJcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMsXG4gICAgICAgIHByZXNlcnZlID0gX3RoaXMkcHJvcHMucHJlc2VydmUsXG4gICAgICAgIGlzTGlzdEZpZWxkID0gX3RoaXMkcHJvcHMuaXNMaXN0RmllbGQsXG4gICAgICAgIG5hbWUgPSBfdGhpcyRwcm9wcy5uYW1lO1xuICAgICAgaWYgKF90aGlzLmNhbmNlbFJlZ2lzdGVyRnVuYykge1xuICAgICAgICBfdGhpcy5jYW5jZWxSZWdpc3RlckZ1bmMoaXNMaXN0RmllbGQsIHByZXNlcnZlLCBnZXROYW1lUGF0aChuYW1lKSk7XG4gICAgICB9XG4gICAgICBfdGhpcy5jYW5jZWxSZWdpc3RlckZ1bmMgPSBudWxsO1xuICAgIH0pO1xuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gVXRpbHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJnZXROYW1lUGF0aFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gX3RoaXMucHJvcHMsXG4gICAgICAgIG5hbWUgPSBfdGhpcyRwcm9wczIubmFtZSxcbiAgICAgICAgZmllbGRDb250ZXh0ID0gX3RoaXMkcHJvcHMyLmZpZWxkQ29udGV4dDtcbiAgICAgIHZhciBfZmllbGRDb250ZXh0JHByZWZpeE4gPSBmaWVsZENvbnRleHQucHJlZml4TmFtZSxcbiAgICAgICAgcHJlZml4TmFtZSA9IF9maWVsZENvbnRleHQkcHJlZml4TiA9PT0gdm9pZCAwID8gW10gOiBfZmllbGRDb250ZXh0JHByZWZpeE47XG4gICAgICByZXR1cm4gbmFtZSAhPT0gdW5kZWZpbmVkID8gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShwcmVmaXhOYW1lKSwgX3RvQ29uc3VtYWJsZUFycmF5KG5hbWUpKSA6IFtdO1xuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJnZXRSdWxlc1wiLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMzID0gX3RoaXMucHJvcHMsXG4gICAgICAgIF90aGlzJHByb3BzMyRydWxlcyA9IF90aGlzJHByb3BzMy5ydWxlcyxcbiAgICAgICAgcnVsZXMgPSBfdGhpcyRwcm9wczMkcnVsZXMgPT09IHZvaWQgMCA/IFtdIDogX3RoaXMkcHJvcHMzJHJ1bGVzLFxuICAgICAgICBmaWVsZENvbnRleHQgPSBfdGhpcyRwcm9wczMuZmllbGRDb250ZXh0O1xuICAgICAgcmV0dXJuIHJ1bGVzLm1hcChmdW5jdGlvbiAocnVsZSkge1xuICAgICAgICBpZiAodHlwZW9mIHJ1bGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gcnVsZShmaWVsZENvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBydWxlO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInJlZnJlc2hcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFfdGhpcy5tb3VudGVkKSByZXR1cm47XG5cbiAgICAgIC8qKlxuICAgICAgICogQ2xlYW4gdXAgY3VycmVudCBub2RlLlxuICAgICAgICovXG4gICAgICBfdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICB2YXIgcmVzZXRDb3VudCA9IF9yZWYucmVzZXRDb3VudDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZXNldENvdW50OiByZXNldENvdW50ICsgMVxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgLy8gRXZlbnQgc2hvdWxkIG9ubHkgdHJpZ2dlciB3aGVuIG1ldGEgY2hhbmdlZFxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJtZXRhQ2FjaGVcIiwgbnVsbCk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInRyaWdnZXJNZXRhRXZlbnRcIiwgZnVuY3Rpb24gKGRlc3Ryb3kpIHtcbiAgICAgIHZhciBvbk1ldGFDaGFuZ2UgPSBfdGhpcy5wcm9wcy5vbk1ldGFDaGFuZ2U7XG4gICAgICBpZiAob25NZXRhQ2hhbmdlKSB7XG4gICAgICAgIHZhciBfbWV0YSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX3RoaXMuZ2V0TWV0YSgpKSwge30sIHtcbiAgICAgICAgICBkZXN0cm95OiBkZXN0cm95XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWlzRXF1YWwoX3RoaXMubWV0YUNhY2hlLCBfbWV0YSkpIHtcbiAgICAgICAgICBvbk1ldGFDaGFuZ2UoX21ldGEpO1xuICAgICAgICB9XG4gICAgICAgIF90aGlzLm1ldGFDYWNoZSA9IF9tZXRhO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3RoaXMubWV0YUNhY2hlID0gbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IEZpZWxkIEVudGl0eSBJbnRlcmZhY2VzID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBUcmlnZ2VyIGJ5IHN0b3JlIHVwZGF0ZS4gQ2hlY2sgaWYgbmVlZCB1cGRhdGUgdGhlIGNvbXBvbmVudFxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvblN0b3JlQ2hhbmdlXCIsIGZ1bmN0aW9uIChwcmV2U3RvcmUsIG5hbWVQYXRoTGlzdCwgaW5mbykge1xuICAgICAgdmFyIF90aGlzJHByb3BzNCA9IF90aGlzLnByb3BzLFxuICAgICAgICBzaG91bGRVcGRhdGUgPSBfdGhpcyRwcm9wczQuc2hvdWxkVXBkYXRlLFxuICAgICAgICBfdGhpcyRwcm9wczQkZGVwZW5kZW4gPSBfdGhpcyRwcm9wczQuZGVwZW5kZW5jaWVzLFxuICAgICAgICBkZXBlbmRlbmNpZXMgPSBfdGhpcyRwcm9wczQkZGVwZW5kZW4gPT09IHZvaWQgMCA/IFtdIDogX3RoaXMkcHJvcHM0JGRlcGVuZGVuLFxuICAgICAgICBvblJlc2V0ID0gX3RoaXMkcHJvcHM0Lm9uUmVzZXQ7XG4gICAgICB2YXIgc3RvcmUgPSBpbmZvLnN0b3JlO1xuICAgICAgdmFyIG5hbWVQYXRoID0gX3RoaXMuZ2V0TmFtZVBhdGgoKTtcbiAgICAgIHZhciBwcmV2VmFsdWUgPSBfdGhpcy5nZXRWYWx1ZShwcmV2U3RvcmUpO1xuICAgICAgdmFyIGN1clZhbHVlID0gX3RoaXMuZ2V0VmFsdWUoc3RvcmUpO1xuICAgICAgdmFyIG5hbWVQYXRoTWF0Y2ggPSBuYW1lUGF0aExpc3QgJiYgY29udGFpbnNOYW1lUGF0aChuYW1lUGF0aExpc3QsIG5hbWVQYXRoKTtcblxuICAgICAgLy8gYHNldEZpZWxkc1ZhbHVlYCBpcyBhIHF1aWNrIGFjY2VzcyB0byB1cGRhdGUgcmVsYXRlZCBzdGF0dXNcbiAgICAgIGlmIChpbmZvLnR5cGUgPT09ICd2YWx1ZVVwZGF0ZScgJiYgaW5mby5zb3VyY2UgPT09ICdleHRlcm5hbCcgJiYgIWlzRXF1YWwocHJldlZhbHVlLCBjdXJWYWx1ZSkpIHtcbiAgICAgICAgX3RoaXMudG91Y2hlZCA9IHRydWU7XG4gICAgICAgIF90aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgX3RoaXMudmFsaWRhdGVQcm9taXNlID0gbnVsbDtcbiAgICAgICAgX3RoaXMuZXJyb3JzID0gRU1QVFlfRVJST1JTO1xuICAgICAgICBfdGhpcy53YXJuaW5ncyA9IEVNUFRZX0VSUk9SUztcbiAgICAgICAgX3RoaXMudHJpZ2dlck1ldGFFdmVudCgpO1xuICAgICAgfVxuICAgICAgc3dpdGNoIChpbmZvLnR5cGUpIHtcbiAgICAgICAgY2FzZSAncmVzZXQnOlxuICAgICAgICAgIGlmICghbmFtZVBhdGhMaXN0IHx8IG5hbWVQYXRoTWF0Y2gpIHtcbiAgICAgICAgICAgIC8vIENsZWFuIHVwIHN0YXRlXG4gICAgICAgICAgICBfdGhpcy50b3VjaGVkID0gZmFsc2U7XG4gICAgICAgICAgICBfdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgICAgICAgICAgX3RoaXMudmFsaWRhdGVQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgX3RoaXMuZXJyb3JzID0gRU1QVFlfRVJST1JTO1xuICAgICAgICAgICAgX3RoaXMud2FybmluZ3MgPSBFTVBUWV9FUlJPUlM7XG4gICAgICAgICAgICBfdGhpcy50cmlnZ2VyTWV0YUV2ZW50KCk7XG4gICAgICAgICAgICBvblJlc2V0ID09PSBudWxsIHx8IG9uUmVzZXQgPT09IHZvaWQgMCB8fCBvblJlc2V0KCk7XG4gICAgICAgICAgICBfdGhpcy5yZWZyZXNoKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbiBjYXNlIGZpZWxkIHdpdGggYHByZXNlcnZlID0gZmFsc2VgIG5lc3QgZGVwcyBsaWtlOlxuICAgICAgICAgKiAtIEEgPSAxID0+IHNob3cgQlxuICAgICAgICAgKiAtIEIgPSAxID0+IHNob3cgQ1xuICAgICAgICAgKiAtIFJlc2V0IEEsIG5lZWQgY2xlYW4gQiwgQ1xuICAgICAgICAgKi9cbiAgICAgICAgY2FzZSAncmVtb3ZlJzpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoc2hvdWxkVXBkYXRlICYmIHJlcXVpcmVVcGRhdGUoc2hvdWxkVXBkYXRlLCBwcmV2U3RvcmUsIHN0b3JlLCBwcmV2VmFsdWUsIGN1clZhbHVlLCBpbmZvKSkge1xuICAgICAgICAgICAgICBfdGhpcy5yZVJlbmRlcigpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3NldEZpZWxkJzpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgZGF0YSA9IGluZm8uZGF0YTtcbiAgICAgICAgICAgIGlmIChuYW1lUGF0aE1hdGNoKSB7XG4gICAgICAgICAgICAgIGlmICgndG91Y2hlZCcgaW4gZGF0YSkge1xuICAgICAgICAgICAgICAgIF90aGlzLnRvdWNoZWQgPSBkYXRhLnRvdWNoZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKCd2YWxpZGF0aW5nJyBpbiBkYXRhICYmICEoJ29yaWdpblJDRmllbGQnIGluIGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMudmFsaWRhdGVQcm9taXNlID0gZGF0YS52YWxpZGF0aW5nID8gUHJvbWlzZS5yZXNvbHZlKFtdKSA6IG51bGw7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKCdlcnJvcnMnIGluIGRhdGEpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5lcnJvcnMgPSBkYXRhLmVycm9ycyB8fCBFTVBUWV9FUlJPUlM7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKCd3YXJuaW5ncycgaW4gZGF0YSkge1xuICAgICAgICAgICAgICAgIF90aGlzLndhcm5pbmdzID0gZGF0YS53YXJuaW5ncyB8fCBFTVBUWV9FUlJPUlM7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgX3RoaXMuZGlydHkgPSB0cnVlO1xuICAgICAgICAgICAgICBfdGhpcy50cmlnZ2VyTWV0YUV2ZW50KCk7XG4gICAgICAgICAgICAgIF90aGlzLnJlUmVuZGVyKCk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoJ3ZhbHVlJyBpbiBkYXRhICYmIGNvbnRhaW5zTmFtZVBhdGgobmFtZVBhdGhMaXN0LCBuYW1lUGF0aCwgdHJ1ZSkpIHtcbiAgICAgICAgICAgICAgLy8gQ29udGFpbnMgcGF0aCB3aXRoIHZhbHVlIHNob3VsZCBhbHNvIGNoZWNrXG4gICAgICAgICAgICAgIF90aGlzLnJlUmVuZGVyKCk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSGFuZGxlIHVwZGF0ZSBieSBgc2V0RmllbGRgIHdpdGggYHNob3VsZFVwZGF0ZWBcbiAgICAgICAgICAgIGlmIChzaG91bGRVcGRhdGUgJiYgIW5hbWVQYXRoLmxlbmd0aCAmJiByZXF1aXJlVXBkYXRlKHNob3VsZFVwZGF0ZSwgcHJldlN0b3JlLCBzdG9yZSwgcHJldlZhbHVlLCBjdXJWYWx1ZSwgaW5mbykpIHtcbiAgICAgICAgICAgICAgX3RoaXMucmVSZW5kZXIoKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICBjYXNlICdkZXBlbmRlbmNpZXNVcGRhdGUnOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogVHJpZ2dlciB3aGVuIG1hcmtlZCBgZGVwZW5kZW5jaWVzYCB1cGRhdGVkLiBSZWxhdGVkIGZpZWxkcyB3aWxsIGFsbCB1cGRhdGVcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgdmFyIGRlcGVuZGVuY3lMaXN0ID0gZGVwZW5kZW5jaWVzLm1hcChnZXROYW1lUGF0aCk7XG4gICAgICAgICAgICAvLyBObyBuZWVkIGZvciBgbmFtZVBhdGhNYXRoYCBjaGVjayBhbmQgYHNob3VsZFVwZGF0ZWAgY2hlY2ssIHNpbmNlIGB2YWx1ZVVwZGF0ZWAgd2lsbCBiZVxuICAgICAgICAgICAgLy8gZW1pdHRlZCBlYXJsaWVyIGFuZCB0aGV5IHdpbGwgd29yayB0aGVyZVxuICAgICAgICAgICAgLy8gSWYgc2V0IGl0IG1heSBjYXVzZSB1bm5lY2Vzc2FyeSB0d2ljZSByZXJlbmRlcmluZ1xuICAgICAgICAgICAgaWYgKGRlcGVuZGVuY3lMaXN0LnNvbWUoZnVuY3Rpb24gKGRlcGVuZGVuY3kpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zTmFtZVBhdGgoaW5mby5yZWxhdGVkRmllbGRzLCBkZXBlbmRlbmN5KTtcbiAgICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICAgIF90aGlzLnJlUmVuZGVyKCk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyAxLiBJZiBgbmFtZVBhdGhgIGV4aXN0cyBpbiBgbmFtZVBhdGhMaXN0YCwgbWVhbnMgaXQncyByZWxhdGVkIHZhbHVlIGFuZCBzaG91bGQgdXBkYXRlXG4gICAgICAgICAgLy8gICAgICBGb3IgZXhhbXBsZSA8TGlzdCBuYW1lPVwibGlzdFwiPjxGaWVsZCBuYW1lPXtbJ2xpc3QnLCAwXX0+PC9MaXN0PlxuICAgICAgICAgIC8vICAgICAgSWYgYG5hbWVQYXRoTGlzdGAgaXMgW1snbGlzdCddXSAoTGlzdCB2YWx1ZSB1cGRhdGUpLCBGaWVsZCBzaG91bGQgYmUgdXBkYXRlZFxuICAgICAgICAgIC8vICAgICAgSWYgYG5hbWVQYXRoTGlzdGAgaXMgW1snbGlzdCcsIDBdXSAoRmllbGQgdmFsdWUgdXBkYXRlKSwgTGlzdCBzaG91bGRuJ3QgYmUgdXBkYXRlZFxuICAgICAgICAgIC8vIDIuXG4gICAgICAgICAgLy8gICAyLjEgSWYgYGRlcGVuZGVuY2llc2AgaXMgc2V0LCBgbmFtZWAgaXMgbm90IHNldCBhbmQgYHNob3VsZFVwZGF0ZWAgaXMgbm90IHNldCxcbiAgICAgICAgICAvLyAgICAgICBkb24ndCB1c2UgYHNob3VsZFVwZGF0ZWAuIGBkZXBlbmRlbmNpZXNgIGlzIHZpZXcgYXMgYSBzaG9ydGN1dCBpZiBgc2hvdWxkVXBkYXRlYFxuICAgICAgICAgIC8vICAgICAgIGlzIG5vdCBwcm92aWRlZFxuICAgICAgICAgIC8vICAgMi4yIElmIGBzaG91bGRVcGRhdGVgIHByb3ZpZGVkLCB1c2UgY3VzdG9taXplIGxvZ2ljIHRvIHVwZGF0ZSB0aGUgZmllbGRcbiAgICAgICAgICAvLyAgICAgICBlbHNlIHRvIGNoZWNrIGlmIHZhbHVlIGNoYW5nZWRcbiAgICAgICAgICBpZiAobmFtZVBhdGhNYXRjaCB8fCAoIWRlcGVuZGVuY2llcy5sZW5ndGggfHwgbmFtZVBhdGgubGVuZ3RoIHx8IHNob3VsZFVwZGF0ZSkgJiYgcmVxdWlyZVVwZGF0ZShzaG91bGRVcGRhdGUsIHByZXZTdG9yZSwgc3RvcmUsIHByZXZWYWx1ZSwgY3VyVmFsdWUsIGluZm8pKSB7XG4gICAgICAgICAgICBfdGhpcy5yZVJlbmRlcigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRVcGRhdGUgPT09IHRydWUpIHtcbiAgICAgICAgX3RoaXMucmVSZW5kZXIoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwidmFsaWRhdGVSdWxlc1wiLCBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgLy8gV2Ugc2hvdWxkIGZpeGVkIG5hbWVQYXRoICYgdmFsdWUgdG8gYXZvaWQgZGV2ZWxvcGVyIGNoYW5nZSB0aGVuIGJ5IGZvcm0gZnVuY3Rpb25cbiAgICAgIHZhciBuYW1lUGF0aCA9IF90aGlzLmdldE5hbWVQYXRoKCk7XG4gICAgICB2YXIgY3VycmVudFZhbHVlID0gX3RoaXMuZ2V0VmFsdWUoKTtcbiAgICAgIHZhciBfcmVmMiA9IG9wdGlvbnMgfHwge30sXG4gICAgICAgIHRyaWdnZXJOYW1lID0gX3JlZjIudHJpZ2dlck5hbWUsXG4gICAgICAgIF9yZWYyJHZhbGlkYXRlT25seSA9IF9yZWYyLnZhbGlkYXRlT25seSxcbiAgICAgICAgdmFsaWRhdGVPbmx5ID0gX3JlZjIkdmFsaWRhdGVPbmx5ID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYyJHZhbGlkYXRlT25seTtcblxuICAgICAgLy8gRm9yY2UgY2hhbmdlIHRvIGFzeW5jIHRvIGF2b2lkIHJ1bGUgT09EIHVuZGVyIHJlbmRlclByb3BzIGZpZWxkXG4gICAgICB2YXIgcm9vdFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKS50aGVuKCAvKiNfX1BVUkVfXyovX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lKCkubWFyayhmdW5jdGlvbiBfY2FsbGVlKCkge1xuICAgICAgICB2YXIgX3RoaXMkcHJvcHM1LCBfdGhpcyRwcm9wczUkdmFsaWRhdGUsIHZhbGlkYXRlRmlyc3QsIG1lc3NhZ2VWYXJpYWJsZXMsIHZhbGlkYXRlRGVib3VuY2UsIGZpbHRlcmVkUnVsZXMsIHByb21pc2U7XG4gICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lKCkud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIGlmIChfdGhpcy5tb3VudGVkKSB7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdChcInJldHVyblwiLCBbXSk7XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgIF90aGlzJHByb3BzNSA9IF90aGlzLnByb3BzLCBfdGhpcyRwcm9wczUkdmFsaWRhdGUgPSBfdGhpcyRwcm9wczUudmFsaWRhdGVGaXJzdCwgdmFsaWRhdGVGaXJzdCA9IF90aGlzJHByb3BzNSR2YWxpZGF0ZSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfdGhpcyRwcm9wczUkdmFsaWRhdGUsIG1lc3NhZ2VWYXJpYWJsZXMgPSBfdGhpcyRwcm9wczUubWVzc2FnZVZhcmlhYmxlcywgdmFsaWRhdGVEZWJvdW5jZSA9IF90aGlzJHByb3BzNS52YWxpZGF0ZURlYm91bmNlOyAvLyBTdGFydCB2YWxpZGF0ZVxuICAgICAgICAgICAgICBmaWx0ZXJlZFJ1bGVzID0gX3RoaXMuZ2V0UnVsZXMoKTtcbiAgICAgICAgICAgICAgaWYgKHRyaWdnZXJOYW1lKSB7XG4gICAgICAgICAgICAgICAgZmlsdGVyZWRSdWxlcyA9IGZpbHRlcmVkUnVsZXMuZmlsdGVyKGZ1bmN0aW9uIChydWxlKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gcnVsZTtcbiAgICAgICAgICAgICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKHJ1bGUpIHtcbiAgICAgICAgICAgICAgICAgIHZhciB2YWxpZGF0ZVRyaWdnZXIgPSBydWxlLnZhbGlkYXRlVHJpZ2dlcjtcbiAgICAgICAgICAgICAgICAgIGlmICghdmFsaWRhdGVUcmlnZ2VyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgdmFyIHRyaWdnZXJMaXN0ID0gdG9BcnJheSh2YWxpZGF0ZVRyaWdnZXIpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyaWdnZXJMaXN0LmluY2x1ZGVzKHRyaWdnZXJOYW1lKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIFdhaXQgZm9yIGRlYm91bmNlLiBTa2lwIGlmIG5vIGB0cmlnZ2VyTmFtZWAgc2luY2UgaXRzIGZyb20gYHZhbGlkYXRlRmllbGRzIC8gc3VibWl0YFxuICAgICAgICAgICAgICBpZiAoISh2YWxpZGF0ZURlYm91bmNlICYmIHRyaWdnZXJOYW1lKSkge1xuICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gODtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCB2YWxpZGF0ZURlYm91bmNlKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgIGlmICghKF90aGlzLnZhbGlkYXRlUHJvbWlzZSAhPT0gcm9vdFByb21pc2UpKSB7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEwO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgW10pO1xuICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgcHJvbWlzZSA9IHZhbGlkYXRlUnVsZXMobmFtZVBhdGgsIGN1cnJlbnRWYWx1ZSwgZmlsdGVyZWRSdWxlcywgb3B0aW9ucywgdmFsaWRhdGVGaXJzdCwgbWVzc2FnZVZhcmlhYmxlcyk7XG4gICAgICAgICAgICAgIHByb21pc2UuY2F0Y2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJ1bGVFcnJvcnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IEVNUFRZX0VSUk9SUztcbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMudmFsaWRhdGVQcm9taXNlID09PSByb290UHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgdmFyIF9ydWxlRXJyb3JzJGZvckVhY2g7XG4gICAgICAgICAgICAgICAgICBfdGhpcy52YWxpZGF0ZVByb21pc2UgPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAvLyBHZXQgZXJyb3JzICYgd2FybmluZ3NcbiAgICAgICAgICAgICAgICAgIHZhciBuZXh0RXJyb3JzID0gW107XG4gICAgICAgICAgICAgICAgICB2YXIgbmV4dFdhcm5pbmdzID0gW107XG4gICAgICAgICAgICAgICAgICAoX3J1bGVFcnJvcnMkZm9yRWFjaCA9IHJ1bGVFcnJvcnMuZm9yRWFjaCkgPT09IG51bGwgfHwgX3J1bGVFcnJvcnMkZm9yRWFjaCA9PT0gdm9pZCAwIHx8IF9ydWxlRXJyb3JzJGZvckVhY2guY2FsbChydWxlRXJyb3JzLCBmdW5jdGlvbiAoX3JlZjQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHdhcm5pbmdPbmx5ID0gX3JlZjQucnVsZS53YXJuaW5nT25seSxcbiAgICAgICAgICAgICAgICAgICAgICBfcmVmNCRlcnJvcnMgPSBfcmVmNC5lcnJvcnMsXG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3JzID0gX3JlZjQkZXJyb3JzID09PSB2b2lkIDAgPyBFTVBUWV9FUlJPUlMgOiBfcmVmNCRlcnJvcnM7XG4gICAgICAgICAgICAgICAgICAgIGlmICh3YXJuaW5nT25seSkge1xuICAgICAgICAgICAgICAgICAgICAgIG5leHRXYXJuaW5ncy5wdXNoLmFwcGx5KG5leHRXYXJuaW5ncywgX3RvQ29uc3VtYWJsZUFycmF5KGVycm9ycykpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIG5leHRFcnJvcnMucHVzaC5hcHBseShuZXh0RXJyb3JzLCBfdG9Db25zdW1hYmxlQXJyYXkoZXJyb3JzKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgX3RoaXMuZXJyb3JzID0gbmV4dEVycm9ycztcbiAgICAgICAgICAgICAgICAgIF90aGlzLndhcm5pbmdzID0gbmV4dFdhcm5pbmdzO1xuICAgICAgICAgICAgICAgICAgX3RoaXMudHJpZ2dlck1ldGFFdmVudCgpO1xuICAgICAgICAgICAgICAgICAgX3RoaXMucmVSZW5kZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIHByb21pc2UpO1xuICAgICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWUpO1xuICAgICAgfSkpKTtcbiAgICAgIGlmICh2YWxpZGF0ZU9ubHkpIHtcbiAgICAgICAgcmV0dXJuIHJvb3RQcm9taXNlO1xuICAgICAgfVxuICAgICAgX3RoaXMudmFsaWRhdGVQcm9taXNlID0gcm9vdFByb21pc2U7XG4gICAgICBfdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgICBfdGhpcy5lcnJvcnMgPSBFTVBUWV9FUlJPUlM7XG4gICAgICBfdGhpcy53YXJuaW5ncyA9IEVNUFRZX0VSUk9SUztcbiAgICAgIF90aGlzLnRyaWdnZXJNZXRhRXZlbnQoKTtcblxuICAgICAgLy8gRm9yY2UgdHJpZ2dlciByZS1yZW5kZXIgc2luY2Ugd2UgbmVlZCBzeW5jIHJlbmRlclByb3BzIHdpdGggbmV3IG1ldGFcbiAgICAgIF90aGlzLnJlUmVuZGVyKCk7XG4gICAgICByZXR1cm4gcm9vdFByb21pc2U7XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImlzRmllbGRWYWxpZGF0aW5nXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhIV90aGlzLnZhbGlkYXRlUHJvbWlzZTtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiaXNGaWVsZFRvdWNoZWRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLnRvdWNoZWQ7XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImlzRmllbGREaXJ0eVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBUb3VjaGVkIG9yIHZhbGlkYXRlIG9yIGhhcyBpbml0aWFsVmFsdWVcbiAgICAgIGlmIChfdGhpcy5kaXJ0eSB8fCBfdGhpcy5wcm9wcy5pbml0aWFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gRm9ybSBzZXQgaW5pdGlhbFZhbHVlXG4gICAgICB2YXIgZmllbGRDb250ZXh0ID0gX3RoaXMucHJvcHMuZmllbGRDb250ZXh0O1xuICAgICAgdmFyIF9maWVsZENvbnRleHQkZ2V0SW50ZSA9IGZpZWxkQ29udGV4dC5nZXRJbnRlcm5hbEhvb2tzKEhPT0tfTUFSSyksXG4gICAgICAgIGdldEluaXRpYWxWYWx1ZSA9IF9maWVsZENvbnRleHQkZ2V0SW50ZS5nZXRJbml0aWFsVmFsdWU7XG4gICAgICBpZiAoZ2V0SW5pdGlhbFZhbHVlKF90aGlzLmdldE5hbWVQYXRoKCkpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImdldEVycm9yc1wiLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMuZXJyb3JzO1xuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJnZXRXYXJuaW5nc1wiLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMud2FybmluZ3M7XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImlzTGlzdEZpZWxkXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy5wcm9wcy5pc0xpc3RGaWVsZDtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiaXNMaXN0XCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy5wcm9wcy5pc0xpc3Q7XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImlzUHJlc2VydmVcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLnByb3BzLnByZXNlcnZlO1xuICAgIH0pO1xuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IENoaWxkIENvbXBvbmVudCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJnZXRNZXRhXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIE1ha2UgZXJyb3IgJiB2YWxpZGF0aW5nIGluIGNhY2hlIHRvIHNhdmUgcGVyZlxuICAgICAgX3RoaXMucHJldlZhbGlkYXRpbmcgPSBfdGhpcy5pc0ZpZWxkVmFsaWRhdGluZygpO1xuICAgICAgdmFyIG1ldGEgPSB7XG4gICAgICAgIHRvdWNoZWQ6IF90aGlzLmlzRmllbGRUb3VjaGVkKCksXG4gICAgICAgIHZhbGlkYXRpbmc6IF90aGlzLnByZXZWYWxpZGF0aW5nLFxuICAgICAgICBlcnJvcnM6IF90aGlzLmVycm9ycyxcbiAgICAgICAgd2FybmluZ3M6IF90aGlzLndhcm5pbmdzLFxuICAgICAgICBuYW1lOiBfdGhpcy5nZXROYW1lUGF0aCgpLFxuICAgICAgICB2YWxpZGF0ZWQ6IF90aGlzLnZhbGlkYXRlUHJvbWlzZSA9PT0gbnVsbFxuICAgICAgfTtcbiAgICAgIHJldHVybiBtZXRhO1xuICAgIH0pO1xuICAgIC8vIE9ubHkgcmV0dXJuIHZhbGlkYXRlIGNoaWxkIG5vZGUuIElmIGludmFsaWRhdGUsIHdpbGwgZG8gbm90aGluZyBhYm91dCBmaWVsZC5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiZ2V0T25seUNoaWxkXCIsIGZ1bmN0aW9uIChjaGlsZHJlbikge1xuICAgICAgLy8gU3VwcG9ydCByZW5kZXIgcHJvcHNcbiAgICAgIGlmICh0eXBlb2YgY2hpbGRyZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFyIF9tZXRhMiA9IF90aGlzLmdldE1ldGEoKTtcbiAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX3RoaXMuZ2V0T25seUNoaWxkKGNoaWxkcmVuKF90aGlzLmdldENvbnRyb2xsZWQoKSwgX21ldGEyLCBfdGhpcy5wcm9wcy5maWVsZENvbnRleHQpKSksIHt9LCB7XG4gICAgICAgICAgaXNGdW5jdGlvbjogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gRmlsZWQgZWxlbWVudCBvbmx5XG4gICAgICB2YXIgY2hpbGRMaXN0ID0gdG9DaGlsZHJlbkFycmF5KGNoaWxkcmVuKTtcbiAgICAgIGlmIChjaGlsZExpc3QubGVuZ3RoICE9PSAxIHx8ICEgLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KGNoaWxkTGlzdFswXSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjaGlsZDogY2hpbGRMaXN0LFxuICAgICAgICAgIGlzRnVuY3Rpb246IGZhbHNlXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjaGlsZDogY2hpbGRMaXN0WzBdLFxuICAgICAgICBpc0Z1bmN0aW9uOiBmYWxzZVxuICAgICAgfTtcbiAgICB9KTtcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRmllbGQgQ29udHJvbCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiZ2V0VmFsdWVcIiwgZnVuY3Rpb24gKHN0b3JlKSB7XG4gICAgICB2YXIgZ2V0RmllbGRzVmFsdWUgPSBfdGhpcy5wcm9wcy5maWVsZENvbnRleHQuZ2V0RmllbGRzVmFsdWU7XG4gICAgICB2YXIgbmFtZVBhdGggPSBfdGhpcy5nZXROYW1lUGF0aCgpO1xuICAgICAgcmV0dXJuIGdldFZhbHVlKHN0b3JlIHx8IGdldEZpZWxkc1ZhbHVlKHRydWUpLCBuYW1lUGF0aCk7XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImdldENvbnRyb2xsZWRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGNoaWxkUHJvcHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgdmFyIF90aGlzJHByb3BzNiA9IF90aGlzLnByb3BzLFxuICAgICAgICBuYW1lID0gX3RoaXMkcHJvcHM2Lm5hbWUsXG4gICAgICAgIHRyaWdnZXIgPSBfdGhpcyRwcm9wczYudHJpZ2dlcixcbiAgICAgICAgdmFsaWRhdGVUcmlnZ2VyID0gX3RoaXMkcHJvcHM2LnZhbGlkYXRlVHJpZ2dlcixcbiAgICAgICAgZ2V0VmFsdWVGcm9tRXZlbnQgPSBfdGhpcyRwcm9wczYuZ2V0VmFsdWVGcm9tRXZlbnQsXG4gICAgICAgIG5vcm1hbGl6ZSA9IF90aGlzJHByb3BzNi5ub3JtYWxpemUsXG4gICAgICAgIHZhbHVlUHJvcE5hbWUgPSBfdGhpcyRwcm9wczYudmFsdWVQcm9wTmFtZSxcbiAgICAgICAgZ2V0VmFsdWVQcm9wcyA9IF90aGlzJHByb3BzNi5nZXRWYWx1ZVByb3BzLFxuICAgICAgICBmaWVsZENvbnRleHQgPSBfdGhpcyRwcm9wczYuZmllbGRDb250ZXh0O1xuICAgICAgdmFyIG1lcmdlZFZhbGlkYXRlVHJpZ2dlciA9IHZhbGlkYXRlVHJpZ2dlciAhPT0gdW5kZWZpbmVkID8gdmFsaWRhdGVUcmlnZ2VyIDogZmllbGRDb250ZXh0LnZhbGlkYXRlVHJpZ2dlcjtcbiAgICAgIHZhciBuYW1lUGF0aCA9IF90aGlzLmdldE5hbWVQYXRoKCk7XG4gICAgICB2YXIgZ2V0SW50ZXJuYWxIb29rcyA9IGZpZWxkQ29udGV4dC5nZXRJbnRlcm5hbEhvb2tzLFxuICAgICAgICBnZXRGaWVsZHNWYWx1ZSA9IGZpZWxkQ29udGV4dC5nZXRGaWVsZHNWYWx1ZTtcbiAgICAgIHZhciBfZ2V0SW50ZXJuYWxIb29rcyA9IGdldEludGVybmFsSG9va3MoSE9PS19NQVJLKSxcbiAgICAgICAgZGlzcGF0Y2ggPSBfZ2V0SW50ZXJuYWxIb29rcy5kaXNwYXRjaDtcbiAgICAgIHZhciB2YWx1ZSA9IF90aGlzLmdldFZhbHVlKCk7XG4gICAgICB2YXIgbWVyZ2VkR2V0VmFsdWVQcm9wcyA9IGdldFZhbHVlUHJvcHMgfHwgZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICByZXR1cm4gX2RlZmluZVByb3BlcnR5KHt9LCB2YWx1ZVByb3BOYW1lLCB2YWwpO1xuICAgICAgfTtcbiAgICAgIHZhciBvcmlnaW5UcmlnZ2VyRnVuYyA9IGNoaWxkUHJvcHNbdHJpZ2dlcl07XG4gICAgICB2YXIgdmFsdWVQcm9wcyA9IG5hbWUgIT09IHVuZGVmaW5lZCA/IG1lcmdlZEdldFZhbHVlUHJvcHModmFsdWUpIDoge307XG5cbiAgICAgIC8vIHdhcm5pbmcgd2hlbiBwcm9wIHZhbHVlIGlzIGZ1bmN0aW9uXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB2YWx1ZVByb3BzKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKHZhbHVlUHJvcHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgIHdhcm5pbmcodHlwZW9mIHZhbHVlUHJvcHNba2V5XSAhPT0gJ2Z1bmN0aW9uJywgXCJJdCdzIG5vdCByZWNvbW1lbmRlZCB0byBnZW5lcmF0ZSBkeW5hbWljIGZ1bmN0aW9uIHByb3AgYnkgYGdldFZhbHVlUHJvcHNgLiBQbGVhc2UgcGFzcyBpdCB0byBjaGlsZCBjb21wb25lbnQgZGlyZWN0bHkgKHByb3A6IFwiLmNvbmNhdChrZXksIFwiKVwiKSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdmFyIGNvbnRyb2wgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGNoaWxkUHJvcHMpLCB2YWx1ZVByb3BzKTtcblxuICAgICAgLy8gQWRkIHRyaWdnZXJcbiAgICAgIGNvbnRyb2xbdHJpZ2dlcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIE1hcmsgYXMgdG91Y2hlZFxuICAgICAgICBfdGhpcy50b3VjaGVkID0gdHJ1ZTtcbiAgICAgICAgX3RoaXMuZGlydHkgPSB0cnVlO1xuICAgICAgICBfdGhpcy50cmlnZ2VyTWV0YUV2ZW50KCk7XG4gICAgICAgIHZhciBuZXdWYWx1ZTtcbiAgICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ2V0VmFsdWVGcm9tRXZlbnQpIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IGdldFZhbHVlRnJvbUV2ZW50LmFwcGx5KHZvaWQgMCwgYXJncyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSBkZWZhdWx0R2V0VmFsdWVGcm9tRXZlbnQuYXBwbHkodm9pZCAwLCBbdmFsdWVQcm9wTmFtZV0uY29uY2F0KGFyZ3MpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9ybWFsaXplKSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSBub3JtYWxpemUobmV3VmFsdWUsIHZhbHVlLCBnZXRGaWVsZHNWYWx1ZSh0cnVlKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5ld1ZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICAgIHR5cGU6ICd1cGRhdGVWYWx1ZScsXG4gICAgICAgICAgICBuYW1lUGF0aDogbmFtZVBhdGgsXG4gICAgICAgICAgICB2YWx1ZTogbmV3VmFsdWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3JpZ2luVHJpZ2dlckZ1bmMpIHtcbiAgICAgICAgICBvcmlnaW5UcmlnZ2VyRnVuYy5hcHBseSh2b2lkIDAsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvLyBBZGQgdmFsaWRhdGVUcmlnZ2VyXG4gICAgICB2YXIgdmFsaWRhdGVUcmlnZ2VyTGlzdCA9IHRvQXJyYXkobWVyZ2VkVmFsaWRhdGVUcmlnZ2VyIHx8IFtdKTtcbiAgICAgIHZhbGlkYXRlVHJpZ2dlckxpc3QuZm9yRWFjaChmdW5jdGlvbiAodHJpZ2dlck5hbWUpIHtcbiAgICAgICAgLy8gV3JhcCBhZGRpdGlvbmFsIGZ1bmN0aW9uIG9mIGNvbXBvbmVudCwgc28gdGhhdCB3ZSBjYW4gZ2V0IGxhdGVzdCB2YWx1ZSBmcm9tIHN0b3JlXG4gICAgICAgIHZhciBvcmlnaW5UcmlnZ2VyID0gY29udHJvbFt0cmlnZ2VyTmFtZV07XG4gICAgICAgIGNvbnRyb2xbdHJpZ2dlck5hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChvcmlnaW5UcmlnZ2VyKSB7XG4gICAgICAgICAgICBvcmlnaW5UcmlnZ2VyLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBBbHdheXMgdXNlIGxhdGVzdCBydWxlc1xuICAgICAgICAgIHZhciBydWxlcyA9IF90aGlzLnByb3BzLnJ1bGVzO1xuICAgICAgICAgIGlmIChydWxlcyAmJiBydWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIFdlIGRpc3BhdGNoIHZhbGlkYXRlIHRvIHJvb3QsXG4gICAgICAgICAgICAvLyBzaW5jZSBpdCB3aWxsIHVwZGF0ZSByZWxhdGVkIGRhdGEgd2l0aCBvdGhlciBmaWVsZCB3aXRoIHNhbWUgbmFtZVxuICAgICAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgICAgICB0eXBlOiAndmFsaWRhdGVGaWVsZCcsXG4gICAgICAgICAgICAgIG5hbWVQYXRoOiBuYW1lUGF0aCxcbiAgICAgICAgICAgICAgdHJpZ2dlck5hbWU6IHRyaWdnZXJOYW1lXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBjb250cm9sO1xuICAgIH0pO1xuICAgIGlmIChwcm9wcy5maWVsZENvbnRleHQpIHtcbiAgICAgIHZhciBnZXRJbnRlcm5hbEhvb2tzID0gcHJvcHMuZmllbGRDb250ZXh0LmdldEludGVybmFsSG9va3M7XG4gICAgICB2YXIgX2dldEludGVybmFsSG9va3MyID0gZ2V0SW50ZXJuYWxIb29rcyhIT09LX01BUkspLFxuICAgICAgICBpbml0RW50aXR5VmFsdWUgPSBfZ2V0SW50ZXJuYWxIb29rczIuaW5pdEVudGl0eVZhbHVlO1xuICAgICAgaW5pdEVudGl0eVZhbHVlKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKTtcbiAgICB9XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIF9jcmVhdGVDbGFzcyhGaWVsZCwgW3tcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkTW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM3ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgc2hvdWxkVXBkYXRlID0gX3RoaXMkcHJvcHM3LnNob3VsZFVwZGF0ZSxcbiAgICAgICAgZmllbGRDb250ZXh0ID0gX3RoaXMkcHJvcHM3LmZpZWxkQ29udGV4dDtcbiAgICAgIHRoaXMubW91bnRlZCA9IHRydWU7XG5cbiAgICAgIC8vIFJlZ2lzdGVyIG9uIGluaXRcbiAgICAgIGlmIChmaWVsZENvbnRleHQpIHtcbiAgICAgICAgdmFyIGdldEludGVybmFsSG9va3MgPSBmaWVsZENvbnRleHQuZ2V0SW50ZXJuYWxIb29rcztcbiAgICAgICAgdmFyIF9nZXRJbnRlcm5hbEhvb2tzMyA9IGdldEludGVybmFsSG9va3MoSE9PS19NQVJLKSxcbiAgICAgICAgICByZWdpc3RlckZpZWxkID0gX2dldEludGVybmFsSG9va3MzLnJlZ2lzdGVyRmllbGQ7XG4gICAgICAgIHRoaXMuY2FuY2VsUmVnaXN0ZXJGdW5jID0gcmVnaXN0ZXJGaWVsZCh0aGlzKTtcbiAgICAgIH1cblxuICAgICAgLy8gT25lIG1vcmUgcmVuZGVyIGZvciBjb21wb25lbnQgaW4gY2FzZSBmaWVsZHMgbm90IHJlYWR5XG4gICAgICBpZiAoc2hvdWxkVXBkYXRlID09PSB0cnVlKSB7XG4gICAgICAgIHRoaXMucmVSZW5kZXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50V2lsbFVubW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICB0aGlzLmNhbmNlbFJlZ2lzdGVyKCk7XG4gICAgICB0aGlzLnRyaWdnZXJNZXRhRXZlbnQodHJ1ZSk7XG4gICAgICB0aGlzLm1vdW50ZWQgPSBmYWxzZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVSZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVSZW5kZXIoKSB7XG4gICAgICBpZiAoIXRoaXMubW91bnRlZCkgcmV0dXJuO1xuICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIHJlc2V0Q291bnQgPSB0aGlzLnN0YXRlLnJlc2V0Q291bnQ7XG4gICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLnByb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIF90aGlzJGdldE9ubHlDaGlsZCA9IHRoaXMuZ2V0T25seUNoaWxkKGNoaWxkcmVuKSxcbiAgICAgICAgY2hpbGQgPSBfdGhpcyRnZXRPbmx5Q2hpbGQuY2hpbGQsXG4gICAgICAgIGlzRnVuY3Rpb24gPSBfdGhpcyRnZXRPbmx5Q2hpbGQuaXNGdW5jdGlvbjtcblxuICAgICAgLy8gTm90IG5lZWQgdG8gYGNsb25lRWxlbWVudGAgc2luY2UgdXNlciBjYW4gaGFuZGxlIHRoaXMgaW4gcmVuZGVyIGZ1bmN0aW9uIHNlbGZcbiAgICAgIHZhciByZXR1cm5DaGlsZE5vZGU7XG4gICAgICBpZiAoaXNGdW5jdGlvbikge1xuICAgICAgICByZXR1cm5DaGlsZE5vZGUgPSBjaGlsZDtcbiAgICAgIH0gZWxzZSBpZiAoIC8qI19fUFVSRV9fKi9SZWFjdC5pc1ZhbGlkRWxlbWVudChjaGlsZCkpIHtcbiAgICAgICAgcmV0dXJuQ2hpbGROb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChjaGlsZCwgdGhpcy5nZXRDb250cm9sbGVkKGNoaWxkLnByb3BzKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuaW5nKCFjaGlsZCwgJ2BjaGlsZHJlbmAgb2YgRmllbGQgaXMgbm90IHZhbGlkYXRlIFJlYWN0RWxlbWVudC4nKTtcbiAgICAgICAgcmV0dXJuQ2hpbGROb2RlID0gY2hpbGQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIHtcbiAgICAgICAga2V5OiByZXNldENvdW50XG4gICAgICB9LCByZXR1cm5DaGlsZE5vZGUpO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gRmllbGQ7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5fZGVmaW5lUHJvcGVydHkoRmllbGQsIFwiY29udGV4dFR5cGVcIiwgRmllbGRDb250ZXh0KTtcbl9kZWZpbmVQcm9wZXJ0eShGaWVsZCwgXCJkZWZhdWx0UHJvcHNcIiwge1xuICB0cmlnZ2VyOiAnb25DaGFuZ2UnLFxuICB2YWx1ZVByb3BOYW1lOiAndmFsdWUnXG59KTtcbmZ1bmN0aW9uIFdyYXBwZXJGaWVsZChfcmVmNikge1xuICB2YXIgX3Jlc3RQcm9wcyRpc0xpc3RGaWVsO1xuICB2YXIgbmFtZSA9IF9yZWY2Lm5hbWUsXG4gICAgcmVzdFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWY2LCBfZXhjbHVkZWQpO1xuICB2YXIgZmllbGRDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChGaWVsZENvbnRleHQpO1xuICB2YXIgbGlzdENvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KExpc3RDb250ZXh0KTtcbiAgdmFyIG5hbWVQYXRoID0gbmFtZSAhPT0gdW5kZWZpbmVkID8gZ2V0TmFtZVBhdGgobmFtZSkgOiB1bmRlZmluZWQ7XG4gIHZhciBpc01lcmdlZExpc3RGaWVsZCA9IChfcmVzdFByb3BzJGlzTGlzdEZpZWwgPSByZXN0UHJvcHMuaXNMaXN0RmllbGQpICE9PSBudWxsICYmIF9yZXN0UHJvcHMkaXNMaXN0RmllbCAhPT0gdm9pZCAwID8gX3Jlc3RQcm9wcyRpc0xpc3RGaWVsIDogISFsaXN0Q29udGV4dDtcbiAgdmFyIGtleSA9ICdrZWVwJztcbiAgaWYgKCFpc01lcmdlZExpc3RGaWVsZCkge1xuICAgIGtleSA9IFwiX1wiLmNvbmNhdCgobmFtZVBhdGggfHwgW10pLmpvaW4oJ18nKSk7XG4gIH1cblxuICAvLyBXYXJuaW5nIGlmIGl0J3MgYSBkaXJlY3RseSBsaXN0IGZpZWxkLlxuICAvLyBXZSBjYW4gc3RpbGwgc3VwcG9ydCBtdWx0aXBsZSBsZXZlbCBmaWVsZCBwcmVzZXJ2ZS5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgcmVzdFByb3BzLnByZXNlcnZlID09PSBmYWxzZSAmJiBpc01lcmdlZExpc3RGaWVsZCAmJiBuYW1lUGF0aC5sZW5ndGggPD0gMSkge1xuICAgIHdhcm5pbmcoZmFsc2UsICdgcHJlc2VydmVgIHNob3VsZCBub3QgYXBwbHkgb24gRm9ybS5MaXN0IGZpZWxkcy4nKTtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRmllbGQsIF9leHRlbmRzKHtcbiAgICBrZXk6IGtleSxcbiAgICBuYW1lOiBuYW1lUGF0aCxcbiAgICBpc0xpc3RGaWVsZDogaXNNZXJnZWRMaXN0RmllbGRcbiAgfSwgcmVzdFByb3BzLCB7XG4gICAgZmllbGRDb250ZXh0OiBmaWVsZENvbnRleHRcbiAgfSkpO1xufVxuZXhwb3J0IGRlZmF1bHQgV3JhcHBlckZpZWxkOyIsICJpbXBvcnQgd2FybmluZyBmcm9tIFwicmMtdXRpbC9lcy93YXJuaW5nXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5leHBvcnQgdmFyIEhPT0tfTUFSSyA9ICdSQ19GT1JNX0lOVEVSTkFMX0hPT0tTJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbnZhciB3YXJuaW5nRnVuYyA9IGZ1bmN0aW9uIHdhcm5pbmdGdW5jKCkge1xuICB3YXJuaW5nKGZhbHNlLCAnQ2FuIG5vdCBmaW5kIEZvcm1Db250ZXh0LiBQbGVhc2UgbWFrZSBzdXJlIHlvdSB3cmFwIEZpZWxkIHVuZGVyIEZvcm0uJyk7XG59O1xudmFyIENvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh7XG4gIGdldEZpZWxkVmFsdWU6IHdhcm5pbmdGdW5jLFxuICBnZXRGaWVsZHNWYWx1ZTogd2FybmluZ0Z1bmMsXG4gIGdldEZpZWxkRXJyb3I6IHdhcm5pbmdGdW5jLFxuICBnZXRGaWVsZFdhcm5pbmc6IHdhcm5pbmdGdW5jLFxuICBnZXRGaWVsZHNFcnJvcjogd2FybmluZ0Z1bmMsXG4gIGlzRmllbGRzVG91Y2hlZDogd2FybmluZ0Z1bmMsXG4gIGlzRmllbGRUb3VjaGVkOiB3YXJuaW5nRnVuYyxcbiAgaXNGaWVsZFZhbGlkYXRpbmc6IHdhcm5pbmdGdW5jLFxuICBpc0ZpZWxkc1ZhbGlkYXRpbmc6IHdhcm5pbmdGdW5jLFxuICByZXNldEZpZWxkczogd2FybmluZ0Z1bmMsXG4gIHNldEZpZWxkczogd2FybmluZ0Z1bmMsXG4gIHNldEZpZWxkVmFsdWU6IHdhcm5pbmdGdW5jLFxuICBzZXRGaWVsZHNWYWx1ZTogd2FybmluZ0Z1bmMsXG4gIHZhbGlkYXRlRmllbGRzOiB3YXJuaW5nRnVuYyxcbiAgc3VibWl0OiB3YXJuaW5nRnVuYyxcbiAgZ2V0SW50ZXJuYWxIb29rczogZnVuY3Rpb24gZ2V0SW50ZXJuYWxIb29rcygpIHtcbiAgICB3YXJuaW5nRnVuYygpO1xuICAgIHJldHVybiB7XG4gICAgICBkaXNwYXRjaDogd2FybmluZ0Z1bmMsXG4gICAgICBpbml0RW50aXR5VmFsdWU6IHdhcm5pbmdGdW5jLFxuICAgICAgcmVnaXN0ZXJGaWVsZDogd2FybmluZ0Z1bmMsXG4gICAgICB1c2VTdWJzY3JpYmU6IHdhcm5pbmdGdW5jLFxuICAgICAgc2V0SW5pdGlhbFZhbHVlczogd2FybmluZ0Z1bmMsXG4gICAgICBkZXN0cm95Rm9ybTogd2FybmluZ0Z1bmMsXG4gICAgICBzZXRDYWxsYmFja3M6IHdhcm5pbmdGdW5jLFxuICAgICAgcmVnaXN0ZXJXYXRjaDogd2FybmluZ0Z1bmMsXG4gICAgICBnZXRGaWVsZHM6IHdhcm5pbmdGdW5jLFxuICAgICAgc2V0VmFsaWRhdGVNZXNzYWdlczogd2FybmluZ0Z1bmMsXG4gICAgICBzZXRQcmVzZXJ2ZTogd2FybmluZ0Z1bmMsXG4gICAgICBnZXRJbml0aWFsVmFsdWU6IHdhcm5pbmdGdW5jXG4gICAgfTtcbiAgfVxufSk7XG5leHBvcnQgZGVmYXVsdCBDb250ZXh0OyIsICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG52YXIgTGlzdENvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmV4cG9ydCBkZWZhdWx0IExpc3RDb250ZXh0OyIsICJleHBvcnQgZnVuY3Rpb24gdG9BcnJheSh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG59XG5leHBvcnQgZnVuY3Rpb24gaXNGb3JtSW5zdGFuY2UoZm9ybSkge1xuICByZXR1cm4gZm9ybSAmJiAhIWZvcm0uX2luaXQ7XG59IiwgImV4cG9ydCBmdW5jdGlvbiBuZXdNZXNzYWdlcygpIHtcbiAgcmV0dXJuIHtcbiAgICBkZWZhdWx0OiAnVmFsaWRhdGlvbiBlcnJvciBvbiBmaWVsZCAlcycsXG4gICAgcmVxdWlyZWQ6ICclcyBpcyByZXF1aXJlZCcsXG4gICAgZW51bTogJyVzIG11c3QgYmUgb25lIG9mICVzJyxcbiAgICB3aGl0ZXNwYWNlOiAnJXMgY2Fubm90IGJlIGVtcHR5JyxcbiAgICBkYXRlOiB7XG4gICAgICBmb3JtYXQ6ICclcyBkYXRlICVzIGlzIGludmFsaWQgZm9yIGZvcm1hdCAlcycsXG4gICAgICBwYXJzZTogJyVzIGRhdGUgY291bGQgbm90IGJlIHBhcnNlZCwgJXMgaXMgaW52YWxpZCAnLFxuICAgICAgaW52YWxpZDogJyVzIGRhdGUgJXMgaXMgaW52YWxpZCdcbiAgICB9LFxuICAgIHR5cGVzOiB7XG4gICAgICBzdHJpbmc6ICclcyBpcyBub3QgYSAlcycsXG4gICAgICBtZXRob2Q6ICclcyBpcyBub3QgYSAlcyAoZnVuY3Rpb24pJyxcbiAgICAgIGFycmF5OiAnJXMgaXMgbm90IGFuICVzJyxcbiAgICAgIG9iamVjdDogJyVzIGlzIG5vdCBhbiAlcycsXG4gICAgICBudW1iZXI6ICclcyBpcyBub3QgYSAlcycsXG4gICAgICBkYXRlOiAnJXMgaXMgbm90IGEgJXMnLFxuICAgICAgYm9vbGVhbjogJyVzIGlzIG5vdCBhICVzJyxcbiAgICAgIGludGVnZXI6ICclcyBpcyBub3QgYW4gJXMnLFxuICAgICAgZmxvYXQ6ICclcyBpcyBub3QgYSAlcycsXG4gICAgICByZWdleHA6ICclcyBpcyBub3QgYSB2YWxpZCAlcycsXG4gICAgICBlbWFpbDogJyVzIGlzIG5vdCBhIHZhbGlkICVzJyxcbiAgICAgIHVybDogJyVzIGlzIG5vdCBhIHZhbGlkICVzJyxcbiAgICAgIGhleDogJyVzIGlzIG5vdCBhIHZhbGlkICVzJ1xuICAgIH0sXG4gICAgc3RyaW5nOiB7XG4gICAgICBsZW46ICclcyBtdXN0IGJlIGV4YWN0bHkgJXMgY2hhcmFjdGVycycsXG4gICAgICBtaW46ICclcyBtdXN0IGJlIGF0IGxlYXN0ICVzIGNoYXJhY3RlcnMnLFxuICAgICAgbWF4OiAnJXMgY2Fubm90IGJlIGxvbmdlciB0aGFuICVzIGNoYXJhY3RlcnMnLFxuICAgICAgcmFuZ2U6ICclcyBtdXN0IGJlIGJldHdlZW4gJXMgYW5kICVzIGNoYXJhY3RlcnMnXG4gICAgfSxcbiAgICBudW1iZXI6IHtcbiAgICAgIGxlbjogJyVzIG11c3QgZXF1YWwgJXMnLFxuICAgICAgbWluOiAnJXMgY2Fubm90IGJlIGxlc3MgdGhhbiAlcycsXG4gICAgICBtYXg6ICclcyBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuICVzJyxcbiAgICAgIHJhbmdlOiAnJXMgbXVzdCBiZSBiZXR3ZWVuICVzIGFuZCAlcydcbiAgICB9LFxuICAgIGFycmF5OiB7XG4gICAgICBsZW46ICclcyBtdXN0IGJlIGV4YWN0bHkgJXMgaW4gbGVuZ3RoJyxcbiAgICAgIG1pbjogJyVzIGNhbm5vdCBiZSBsZXNzIHRoYW4gJXMgaW4gbGVuZ3RoJyxcbiAgICAgIG1heDogJyVzIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gJXMgaW4gbGVuZ3RoJyxcbiAgICAgIHJhbmdlOiAnJXMgbXVzdCBiZSBiZXR3ZWVuICVzIGFuZCAlcyBpbiBsZW5ndGgnXG4gICAgfSxcbiAgICBwYXR0ZXJuOiB7XG4gICAgICBtaXNtYXRjaDogJyVzIHZhbHVlICVzIGRvZXMgbm90IG1hdGNoIHBhdHRlcm4gJXMnXG4gICAgfSxcbiAgICBjbG9uZTogZnVuY3Rpb24gY2xvbmUoKSB7XG4gICAgICB2YXIgY2xvbmVkID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzKSk7XG4gICAgICBjbG9uZWQuY2xvbmUgPSB0aGlzLmNsb25lO1xuICAgICAgcmV0dXJuIGNsb25lZDtcbiAgICB9XG4gIH07XG59XG5leHBvcnQgdmFyIG1lc3NhZ2VzID0gbmV3TWVzc2FnZXMoKTsiLCAiZnVuY3Rpb24gX2lzTmF0aXZlRnVuY3Rpb24odCkge1xuICB0cnkge1xuICAgIHJldHVybiAtMSAhPT0gRnVuY3Rpb24udG9TdHJpbmcuY2FsbCh0KS5pbmRleE9mKFwiW25hdGl2ZSBjb2RlXVwiKTtcbiAgfSBjYXRjaCAobikge1xuICAgIHJldHVybiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIHQ7XG4gIH1cbn1cbmV4cG9ydCB7IF9pc05hdGl2ZUZ1bmN0aW9uIGFzIGRlZmF1bHQgfTsiLCAiaW1wb3J0IGlzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCBmcm9tIFwiLi9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QuanNcIjtcbmltcG9ydCBzZXRQcm90b3R5cGVPZiBmcm9tIFwiLi9zZXRQcm90b3R5cGVPZi5qc1wiO1xuZnVuY3Rpb24gX2NvbnN0cnVjdCh0LCBlLCByKSB7XG4gIGlmIChpc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSkgcmV0dXJuIFJlZmxlY3QuY29uc3RydWN0LmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gIHZhciBvID0gW251bGxdO1xuICBvLnB1c2guYXBwbHkobywgZSk7XG4gIHZhciBwID0gbmV3ICh0LmJpbmQuYXBwbHkodCwgbykpKCk7XG4gIHJldHVybiByICYmIHNldFByb3RvdHlwZU9mKHAsIHIucHJvdG90eXBlKSwgcDtcbn1cbmV4cG9ydCB7IF9jb25zdHJ1Y3QgYXMgZGVmYXVsdCB9OyIsICJpbXBvcnQgZ2V0UHJvdG90eXBlT2YgZnJvbSBcIi4vZ2V0UHJvdG90eXBlT2YuanNcIjtcbmltcG9ydCBzZXRQcm90b3R5cGVPZiBmcm9tIFwiLi9zZXRQcm90b3R5cGVPZi5qc1wiO1xuaW1wb3J0IGlzTmF0aXZlRnVuY3Rpb24gZnJvbSBcIi4vaXNOYXRpdmVGdW5jdGlvbi5qc1wiO1xuaW1wb3J0IGNvbnN0cnVjdCBmcm9tIFwiLi9jb25zdHJ1Y3QuanNcIjtcbmZ1bmN0aW9uIF93cmFwTmF0aXZlU3VwZXIodCkge1xuICB2YXIgciA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgTWFwID8gbmV3IE1hcCgpIDogdm9pZCAwO1xuICByZXR1cm4gX3dyYXBOYXRpdmVTdXBlciA9IGZ1bmN0aW9uIF93cmFwTmF0aXZlU3VwZXIodCkge1xuICAgIGlmIChudWxsID09PSB0IHx8ICFpc05hdGl2ZUZ1bmN0aW9uKHQpKSByZXR1cm4gdDtcbiAgICBpZiAoXCJmdW5jdGlvblwiICE9IHR5cGVvZiB0KSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7XG4gICAgaWYgKHZvaWQgMCAhPT0gcikge1xuICAgICAgaWYgKHIuaGFzKHQpKSByZXR1cm4gci5nZXQodCk7XG4gICAgICByLnNldCh0LCBXcmFwcGVyKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gV3JhcHBlcigpIHtcbiAgICAgIHJldHVybiBjb25zdHJ1Y3QodCwgYXJndW1lbnRzLCBnZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3Rvcik7XG4gICAgfVxuICAgIHJldHVybiBXcmFwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUsIHtcbiAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgIHZhbHVlOiBXcmFwcGVyLFxuICAgICAgICBlbnVtZXJhYmxlOiAhMSxcbiAgICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICB9XG4gICAgfSksIHNldFByb3RvdHlwZU9mKFdyYXBwZXIsIHQpO1xuICB9LCBfd3JhcE5hdGl2ZVN1cGVyKHQpO1xufVxuZXhwb3J0IHsgX3dyYXBOYXRpdmVTdXBlciBhcyBkZWZhdWx0IH07IiwgImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3NlcnRUaGlzSW5pdGlhbGl6ZWRcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzXCI7XG5pbXBvcnQgX2NyZWF0ZVN1cGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVTdXBlclwiO1xuaW1wb3J0IF93cmFwTmF0aXZlU3VwZXIgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3dyYXBOYXRpdmVTdXBlclwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG4vKiBlc2xpbnQgbm8tY29uc29sZTowICovXG5cbnZhciBmb3JtYXRSZWdFeHAgPSAvJVtzZGolXS9nO1xuZXhwb3J0IHZhciB3YXJuaW5nID0gZnVuY3Rpb24gd2FybmluZygpIHt9O1xuXG4vLyBkb24ndCBwcmludCB3YXJuaW5nIG1lc3NhZ2Ugd2hlbiBpbiBwcm9kdWN0aW9uIGVudiBvciBub2RlIHJ1bnRpbWVcbmlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy5lbnYgJiYgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gIHdhcm5pbmcgPSBmdW5jdGlvbiB3YXJuaW5nKHR5cGUsIGVycm9ycykge1xuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgY29uc29sZS53YXJuICYmIHR5cGVvZiBBU1lOQ19WQUxJREFUT1JfTk9fV0FSTklORyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmIChlcnJvcnMuZXZlcnkoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBlID09PSAnc3RyaW5nJztcbiAgICAgIH0pKSB7XG4gICAgICAgIGNvbnNvbGUud2Fybih0eXBlLCBlcnJvcnMpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0RmllbGRzRXJyb3IoZXJyb3JzKSB7XG4gIGlmICghZXJyb3JzIHx8ICFlcnJvcnMubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgdmFyIGZpZWxkcyA9IHt9O1xuICBlcnJvcnMuZm9yRWFjaChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICB2YXIgZmllbGQgPSBlcnJvci5maWVsZDtcbiAgICBmaWVsZHNbZmllbGRdID0gZmllbGRzW2ZpZWxkXSB8fCBbXTtcbiAgICBmaWVsZHNbZmllbGRdLnB1c2goZXJyb3IpO1xuICB9KTtcbiAgcmV0dXJuIGZpZWxkcztcbn1cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXQodGVtcGxhdGUpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICB9XG4gIHZhciBpID0gMDtcbiAgdmFyIGxlbiA9IGFyZ3MubGVuZ3RoO1xuICBpZiAodHlwZW9mIHRlbXBsYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1zcHJlYWRcbiAgICByZXR1cm4gdGVtcGxhdGUuYXBwbHkobnVsbCwgYXJncyk7XG4gIH1cbiAgaWYgKHR5cGVvZiB0ZW1wbGF0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgc3RyID0gdGVtcGxhdGUucmVwbGFjZShmb3JtYXRSZWdFeHAsIGZ1bmN0aW9uICh4KSB7XG4gICAgICBpZiAoeCA9PT0gJyUlJykge1xuICAgICAgICByZXR1cm4gJyUnO1xuICAgICAgfVxuICAgICAgaWYgKGkgPj0gbGVuKSB7XG4gICAgICAgIHJldHVybiB4O1xuICAgICAgfVxuICAgICAgc3dpdGNoICh4KSB7XG4gICAgICAgIGNhc2UgJyVzJzpcbiAgICAgICAgICByZXR1cm4gU3RyaW5nKGFyZ3NbaSsrXSk7XG4gICAgICAgIGNhc2UgJyVkJzpcbiAgICAgICAgICByZXR1cm4gTnVtYmVyKGFyZ3NbaSsrXSk7XG4gICAgICAgIGNhc2UgJyVqJzpcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFyZ3NbaSsrXSk7XG4gICAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHg7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuICByZXR1cm4gdGVtcGxhdGU7XG59XG5mdW5jdGlvbiBpc05hdGl2ZVN0cmluZ1R5cGUodHlwZSkge1xuICByZXR1cm4gdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZSA9PT0gJ3VybCcgfHwgdHlwZSA9PT0gJ2hleCcgfHwgdHlwZSA9PT0gJ2VtYWlsJyB8fCB0eXBlID09PSAnZGF0ZScgfHwgdHlwZSA9PT0gJ3BhdHRlcm4nO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRW1wdHlWYWx1ZSh2YWx1ZSwgdHlwZSkge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICh0eXBlID09PSAnYXJyYXknICYmIEFycmF5LmlzQXJyYXkodmFsdWUpICYmICF2YWx1ZS5sZW5ndGgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoaXNOYXRpdmVTdHJpbmdUeXBlKHR5cGUpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgIXZhbHVlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRW1wdHlPYmplY3Qob2JqKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA9PT0gMDtcbn1cbmZ1bmN0aW9uIGFzeW5jUGFyYWxsZWxBcnJheShhcnIsIGZ1bmMsIGNhbGxiYWNrKSB7XG4gIHZhciByZXN1bHRzID0gW107XG4gIHZhciB0b3RhbCA9IDA7XG4gIHZhciBhcnJMZW5ndGggPSBhcnIubGVuZ3RoO1xuICBmdW5jdGlvbiBjb3VudChlcnJvcnMpIHtcbiAgICByZXN1bHRzLnB1c2guYXBwbHkocmVzdWx0cywgX3RvQ29uc3VtYWJsZUFycmF5KGVycm9ycyB8fCBbXSkpO1xuICAgIHRvdGFsKys7XG4gICAgaWYgKHRvdGFsID09PSBhcnJMZW5ndGgpIHtcbiAgICAgIGNhbGxiYWNrKHJlc3VsdHMpO1xuICAgIH1cbiAgfVxuICBhcnIuZm9yRWFjaChmdW5jdGlvbiAoYSkge1xuICAgIGZ1bmMoYSwgY291bnQpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIGFzeW5jU2VyaWFsQXJyYXkoYXJyLCBmdW5jLCBjYWxsYmFjaykge1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgYXJyTGVuZ3RoID0gYXJyLmxlbmd0aDtcbiAgZnVuY3Rpb24gbmV4dChlcnJvcnMpIHtcbiAgICBpZiAoZXJyb3JzICYmIGVycm9ycy5sZW5ndGgpIHtcbiAgICAgIGNhbGxiYWNrKGVycm9ycyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBvcmlnaW5hbCA9IGluZGV4O1xuICAgIGluZGV4ID0gaW5kZXggKyAxO1xuICAgIGlmIChvcmlnaW5hbCA8IGFyckxlbmd0aCkge1xuICAgICAgZnVuYyhhcnJbb3JpZ2luYWxdLCBuZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FsbGJhY2soW10pO1xuICAgIH1cbiAgfVxuICBuZXh0KFtdKTtcbn1cbmZ1bmN0aW9uIGZsYXR0ZW5PYmpBcnIob2JqQXJyKSB7XG4gIHZhciByZXQgPSBbXTtcbiAgT2JqZWN0LmtleXMob2JqQXJyKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgcmV0LnB1c2guYXBwbHkocmV0LCBfdG9Db25zdW1hYmxlQXJyYXkob2JqQXJyW2tdIHx8IFtdKSk7XG4gIH0pO1xuICByZXR1cm4gcmV0O1xufVxuZXhwb3J0IHZhciBBc3luY1ZhbGlkYXRpb25FcnJvciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0Vycm9yKSB7XG4gIF9pbmhlcml0cyhBc3luY1ZhbGlkYXRpb25FcnJvciwgX0Vycm9yKTtcbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihBc3luY1ZhbGlkYXRpb25FcnJvcik7XG4gIGZ1bmN0aW9uIEFzeW5jVmFsaWRhdGlvbkVycm9yKGVycm9ycywgZmllbGRzKSB7XG4gICAgdmFyIF90aGlzO1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBc3luY1ZhbGlkYXRpb25FcnJvcik7XG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCAnQXN5bmMgVmFsaWRhdGlvbiBFcnJvcicpO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJlcnJvcnNcIiwgdm9pZCAwKTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiZmllbGRzXCIsIHZvaWQgMCk7XG4gICAgX3RoaXMuZXJyb3JzID0gZXJyb3JzO1xuICAgIF90aGlzLmZpZWxkcyA9IGZpZWxkcztcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgcmV0dXJuIF9jcmVhdGVDbGFzcyhBc3luY1ZhbGlkYXRpb25FcnJvcik7XG59KCAvKiNfX1BVUkVfXyovX3dyYXBOYXRpdmVTdXBlcihFcnJvcikpO1xuZXhwb3J0IGZ1bmN0aW9uIGFzeW5jTWFwKG9iakFyciwgb3B0aW9uLCBmdW5jLCBjYWxsYmFjaywgc291cmNlKSB7XG4gIGlmIChvcHRpb24uZmlyc3QpIHtcbiAgICB2YXIgX3BlbmRpbmcgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgbmV4dCA9IGZ1bmN0aW9uIG5leHQoZXJyb3JzKSB7XG4gICAgICAgIGNhbGxiYWNrKGVycm9ycyk7XG4gICAgICAgIHJldHVybiBlcnJvcnMubGVuZ3RoID8gcmVqZWN0KG5ldyBBc3luY1ZhbGlkYXRpb25FcnJvcihlcnJvcnMsIGNvbnZlcnRGaWVsZHNFcnJvcihlcnJvcnMpKSkgOiByZXNvbHZlKHNvdXJjZSk7XG4gICAgICB9O1xuICAgICAgdmFyIGZsYXR0ZW5BcnIgPSBmbGF0dGVuT2JqQXJyKG9iakFycik7XG4gICAgICBhc3luY1NlcmlhbEFycmF5KGZsYXR0ZW5BcnIsIGZ1bmMsIG5leHQpO1xuICAgIH0pO1xuICAgIF9wZW5kaW5nLmNhdGNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gZTtcbiAgICB9KTtcbiAgICByZXR1cm4gX3BlbmRpbmc7XG4gIH1cbiAgdmFyIGZpcnN0RmllbGRzID0gb3B0aW9uLmZpcnN0RmllbGRzID09PSB0cnVlID8gT2JqZWN0LmtleXMob2JqQXJyKSA6IG9wdGlvbi5maXJzdEZpZWxkcyB8fCBbXTtcbiAgdmFyIG9iakFycktleXMgPSBPYmplY3Qua2V5cyhvYmpBcnIpO1xuICB2YXIgb2JqQXJyTGVuZ3RoID0gb2JqQXJyS2V5cy5sZW5ndGg7XG4gIHZhciB0b3RhbCA9IDA7XG4gIHZhciByZXN1bHRzID0gW107XG4gIHZhciBwZW5kaW5nID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHZhciBuZXh0ID0gZnVuY3Rpb24gbmV4dChlcnJvcnMpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItc3ByZWFkXG4gICAgICByZXN1bHRzLnB1c2guYXBwbHkocmVzdWx0cywgZXJyb3JzKTtcbiAgICAgIHRvdGFsKys7XG4gICAgICBpZiAodG90YWwgPT09IG9iakFyckxlbmd0aCkge1xuICAgICAgICBjYWxsYmFjayhyZXN1bHRzKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdHMubGVuZ3RoID8gcmVqZWN0KG5ldyBBc3luY1ZhbGlkYXRpb25FcnJvcihyZXN1bHRzLCBjb252ZXJ0RmllbGRzRXJyb3IocmVzdWx0cykpKSA6IHJlc29sdmUoc291cmNlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmICghb2JqQXJyS2V5cy5sZW5ndGgpIHtcbiAgICAgIGNhbGxiYWNrKHJlc3VsdHMpO1xuICAgICAgcmVzb2x2ZShzb3VyY2UpO1xuICAgIH1cbiAgICBvYmpBcnJLZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgdmFyIGFyciA9IG9iakFycltrZXldO1xuICAgICAgaWYgKGZpcnN0RmllbGRzLmluZGV4T2Yoa2V5KSAhPT0gLTEpIHtcbiAgICAgICAgYXN5bmNTZXJpYWxBcnJheShhcnIsIGZ1bmMsIG5leHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXN5bmNQYXJhbGxlbEFycmF5KGFyciwgZnVuYywgbmV4dCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuICBwZW5kaW5nLmNhdGNoKGZ1bmN0aW9uIChlKSB7XG4gICAgcmV0dXJuIGU7XG4gIH0pO1xuICByZXR1cm4gcGVuZGluZztcbn1cbmZ1bmN0aW9uIGlzRXJyb3JPYmoob2JqKSB7XG4gIHJldHVybiAhIShvYmogJiYgb2JqLm1lc3NhZ2UgIT09IHVuZGVmaW5lZCk7XG59XG5mdW5jdGlvbiBnZXRWYWx1ZSh2YWx1ZSwgcGF0aCkge1xuICB2YXIgdiA9IHZhbHVlO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAodiA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB2O1xuICAgIH1cbiAgICB2ID0gdltwYXRoW2ldXTtcbiAgfVxuICByZXR1cm4gdjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb21wbGVtZW50RXJyb3IocnVsZSwgc291cmNlKSB7XG4gIHJldHVybiBmdW5jdGlvbiAob2UpIHtcbiAgICB2YXIgZmllbGRWYWx1ZTtcbiAgICBpZiAocnVsZS5mdWxsRmllbGRzKSB7XG4gICAgICBmaWVsZFZhbHVlID0gZ2V0VmFsdWUoc291cmNlLCBydWxlLmZ1bGxGaWVsZHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmaWVsZFZhbHVlID0gc291cmNlW29lLmZpZWxkIHx8IHJ1bGUuZnVsbEZpZWxkXTtcbiAgICB9XG4gICAgaWYgKGlzRXJyb3JPYmoob2UpKSB7XG4gICAgICBvZS5maWVsZCA9IG9lLmZpZWxkIHx8IHJ1bGUuZnVsbEZpZWxkO1xuICAgICAgb2UuZmllbGRWYWx1ZSA9IGZpZWxkVmFsdWU7XG4gICAgICByZXR1cm4gb2U7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBtZXNzYWdlOiB0eXBlb2Ygb2UgPT09ICdmdW5jdGlvbicgPyBvZSgpIDogb2UsXG4gICAgICBmaWVsZFZhbHVlOiBmaWVsZFZhbHVlLFxuICAgICAgZmllbGQ6IG9lLmZpZWxkIHx8IHJ1bGUuZnVsbEZpZWxkXG4gICAgfTtcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWVwTWVyZ2UodGFyZ2V0LCBzb3VyY2UpIHtcbiAgaWYgKHNvdXJjZSkge1xuICAgIGZvciAodmFyIHMgaW4gc291cmNlKSB7XG4gICAgICBpZiAoc291cmNlLmhhc093blByb3BlcnR5KHMpKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHNvdXJjZVtzXTtcbiAgICAgICAgaWYgKF90eXBlb2YodmFsdWUpID09PSAnb2JqZWN0JyAmJiBfdHlwZW9mKHRhcmdldFtzXSkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgdGFyZ2V0W3NdID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB0YXJnZXRbc10pLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFyZ2V0W3NdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhcmdldDtcbn0iLCAiaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSBcIi4uL3V0aWxcIjtcbnZhciBFTlVNID0gJ2VudW0nO1xudmFyIGVudW1lcmFibGUgPSBmdW5jdGlvbiBlbnVtZXJhYmxlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucykge1xuICBydWxlW0VOVU1dID0gQXJyYXkuaXNBcnJheShydWxlW0VOVU1dKSA/IHJ1bGVbRU5VTV0gOiBbXTtcbiAgaWYgKHJ1bGVbRU5VTV0uaW5kZXhPZih2YWx1ZSkgPT09IC0xKSB7XG4gICAgZXJyb3JzLnB1c2goZm9ybWF0KG9wdGlvbnMubWVzc2FnZXNbRU5VTV0sIHJ1bGUuZnVsbEZpZWxkLCBydWxlW0VOVU1dLmpvaW4oJywgJykpKTtcbiAgfVxufTtcbmV4cG9ydCBkZWZhdWx0IGVudW1lcmFibGU7IiwgImltcG9ydCB7IGZvcm1hdCB9IGZyb20gXCIuLi91dGlsXCI7XG52YXIgcGF0dGVybiA9IGZ1bmN0aW9uIHBhdHRlcm4ocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKSB7XG4gIGlmIChydWxlLnBhdHRlcm4pIHtcbiAgICBpZiAocnVsZS5wYXR0ZXJuIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAvLyBpZiBhIFJlZ0V4cCBpbnN0YW5jZSBpcyBwYXNzZWQsIHJlc2V0IGBsYXN0SW5kZXhgIGluIGNhc2UgaXRzIGBnbG9iYWxgXG4gICAgICAvLyBmbGFnIGlzIGFjY2lkZW50YWxseSBzZXQgdG8gYHRydWVgLCB3aGljaCBpbiBhIHZhbGlkYXRpb24gc2NlbmFyaW9cbiAgICAgIC8vIGlzIG5vdCBuZWNlc3NhcnkgYW5kIHRoZSByZXN1bHQgbWlnaHQgYmUgbWlzbGVhZGluZ1xuICAgICAgcnVsZS5wYXR0ZXJuLmxhc3RJbmRleCA9IDA7XG4gICAgICBpZiAoIXJ1bGUucGF0dGVybi50ZXN0KHZhbHVlKSkge1xuICAgICAgICBlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlcy5wYXR0ZXJuLm1pc21hdGNoLCBydWxlLmZ1bGxGaWVsZCwgdmFsdWUsIHJ1bGUucGF0dGVybikpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJ1bGUucGF0dGVybiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHZhciBfcGF0dGVybiA9IG5ldyBSZWdFeHAocnVsZS5wYXR0ZXJuKTtcbiAgICAgIGlmICghX3BhdHRlcm4udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goZm9ybWF0KG9wdGlvbnMubWVzc2FnZXMucGF0dGVybi5taXNtYXRjaCwgcnVsZS5mdWxsRmllbGQsIHZhbHVlLCBydWxlLnBhdHRlcm4pKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5leHBvcnQgZGVmYXVsdCBwYXR0ZXJuOyIsICJpbXBvcnQgeyBmb3JtYXQgfSBmcm9tIFwiLi4vdXRpbFwiO1xudmFyIHJhbmdlID0gZnVuY3Rpb24gcmFuZ2UocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKSB7XG4gIHZhciBsZW4gPSB0eXBlb2YgcnVsZS5sZW4gPT09ICdudW1iZXInO1xuICB2YXIgbWluID0gdHlwZW9mIHJ1bGUubWluID09PSAnbnVtYmVyJztcbiAgdmFyIG1heCA9IHR5cGVvZiBydWxlLm1heCA9PT0gJ251bWJlcic7XG4gIC8vIFx1NkI2M1x1NTIxOVx1NTMzOVx1OTE0RFx1NzgwMVx1NzBCOVx1ODMwM1x1NTZGNFx1NEVDRVUrMDEwMDAwXHU0RTAwXHU3NkY0XHU1MjMwVSsxMEZGRkZcdTc2ODRcdTY1ODdcdTVCNTdcdUZGMDhcdTg4NjVcdTUxNDVcdTVFNzNcdTk3NjJTdXBwbGVtZW50YXJ5IFBsYW5lXHVGRjA5XG4gIHZhciBzcFJlZ2V4cCA9IC9bXFx1RDgwMC1cXHVEQkZGXVtcXHVEQzAwLVxcdURGRkZdL2c7XG4gIHZhciB2YWwgPSB2YWx1ZTtcbiAgdmFyIGtleSA9IG51bGw7XG4gIHZhciBudW0gPSB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInO1xuICB2YXIgc3RyID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcbiAgdmFyIGFyciA9IEFycmF5LmlzQXJyYXkodmFsdWUpO1xuICBpZiAobnVtKSB7XG4gICAga2V5ID0gJ251bWJlcic7XG4gIH0gZWxzZSBpZiAoc3RyKSB7XG4gICAga2V5ID0gJ3N0cmluZyc7XG4gIH0gZWxzZSBpZiAoYXJyKSB7XG4gICAga2V5ID0gJ2FycmF5JztcbiAgfVxuICAvLyBpZiB0aGUgdmFsdWUgaXMgbm90IG9mIGEgc3VwcG9ydGVkIHR5cGUgZm9yIHJhbmdlIHZhbGlkYXRpb25cbiAgLy8gdGhlIHZhbGlkYXRpb24gcnVsZSBydWxlIHNob3VsZCB1c2UgdGhlXG4gIC8vIHR5cGUgcHJvcGVydHkgdG8gYWxzbyB0ZXN0IGZvciBhIHBhcnRpY3VsYXIgdHlwZVxuICBpZiAoIWtleSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoYXJyKSB7XG4gICAgdmFsID0gdmFsdWUubGVuZ3RoO1xuICB9XG4gIGlmIChzdHIpIHtcbiAgICAvLyBcdTU5MDRcdTc0MDZcdTc4MDFcdTcwQjlcdTU5MjdcdTRFOEVVKzAxMDAwMFx1NzY4NFx1NjU4N1x1NUI1N2xlbmd0aFx1NUM1RVx1NjAyN1x1NEUwRFx1NTFDNlx1Nzg2RVx1NzY4NGJ1Z1x1RkYwQ1x1NTk4MlwiXHVEODQyXHVERkI3XHVEODQyXHVERkI3XHVEODQyXHVERkI3XCIubGVuZ3RoICE9PSAzXG4gICAgdmFsID0gdmFsdWUucmVwbGFjZShzcFJlZ2V4cCwgJ18nKS5sZW5ndGg7XG4gIH1cbiAgaWYgKGxlbikge1xuICAgIGlmICh2YWwgIT09IHJ1bGUubGVuKSB7XG4gICAgICBlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlc1trZXldLmxlbiwgcnVsZS5mdWxsRmllbGQsIHJ1bGUubGVuKSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKG1pbiAmJiAhbWF4ICYmIHZhbCA8IHJ1bGUubWluKSB7XG4gICAgZXJyb3JzLnB1c2goZm9ybWF0KG9wdGlvbnMubWVzc2FnZXNba2V5XS5taW4sIHJ1bGUuZnVsbEZpZWxkLCBydWxlLm1pbikpO1xuICB9IGVsc2UgaWYgKG1heCAmJiAhbWluICYmIHZhbCA+IHJ1bGUubWF4KSB7XG4gICAgZXJyb3JzLnB1c2goZm9ybWF0KG9wdGlvbnMubWVzc2FnZXNba2V5XS5tYXgsIHJ1bGUuZnVsbEZpZWxkLCBydWxlLm1heCkpO1xuICB9IGVsc2UgaWYgKG1pbiAmJiBtYXggJiYgKHZhbCA8IHJ1bGUubWluIHx8IHZhbCA+IHJ1bGUubWF4KSkge1xuICAgIGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzW2tleV0ucmFuZ2UsIHJ1bGUuZnVsbEZpZWxkLCBydWxlLm1pbiwgcnVsZS5tYXgpKTtcbiAgfVxufTtcbmV4cG9ydCBkZWZhdWx0IHJhbmdlOyIsICJpbXBvcnQgeyBmb3JtYXQsIGlzRW1wdHlWYWx1ZSB9IGZyb20gXCIuLi91dGlsXCI7XG52YXIgcmVxdWlyZWQgPSBmdW5jdGlvbiByZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMsIHR5cGUpIHtcbiAgaWYgKHJ1bGUucmVxdWlyZWQgJiYgKCFzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCkgfHwgaXNFbXB0eVZhbHVlKHZhbHVlLCB0eXBlIHx8IHJ1bGUudHlwZSkpKSB7XG4gICAgZXJyb3JzLnB1c2goZm9ybWF0KG9wdGlvbnMubWVzc2FnZXMucmVxdWlyZWQsIHJ1bGUuZnVsbEZpZWxkKSk7XG4gIH1cbn07XG5leHBvcnQgZGVmYXVsdCByZXF1aXJlZDsiLCAiLy8gaHR0cHM6Ly9naXRodWIuY29tL2tldnZhL3VybC1yZWdleC9ibG9iL21hc3Rlci9pbmRleC5qc1xudmFyIHVybFJlZztcbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAoKSB7XG4gIGlmICh1cmxSZWcpIHtcbiAgICByZXR1cm4gdXJsUmVnO1xuICB9XG4gIHZhciB3b3JkID0gJ1thLWZBLUZcXFxcZDpdJztcbiAgdmFyIGIgPSBmdW5jdGlvbiBiKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gb3B0aW9ucyAmJiBvcHRpb25zLmluY2x1ZGVCb3VuZGFyaWVzID8gXCIoPzooPzw9XFxcXHN8XikoPz1cIi5jb25jYXQod29yZCwgXCIpfCg/PD1cIikuY29uY2F0KHdvcmQsIFwiKSg/PVxcXFxzfCQpKVwiKSA6ICcnO1xuICB9O1xuICB2YXIgdjQgPSAnKD86MjVbMC01XXwyWzAtNF1cXFxcZHwxXFxcXGRcXFxcZHxbMS05XVxcXFxkfFxcXFxkKSg/OlxcXFwuKD86MjVbMC01XXwyWzAtNF1cXFxcZHwxXFxcXGRcXFxcZHxbMS05XVxcXFxkfFxcXFxkKSl7M30nO1xuICB2YXIgdjZzZWcgPSAnW2EtZkEtRlxcXFxkXXsxLDR9JztcbiAgdmFyIHY2TGlzdCA9IFtcIig/OlwiLmNvbmNhdCh2NnNlZywgXCI6KXs3fSg/OlwiKS5jb25jYXQodjZzZWcsIFwifDopXCIpLCAvLyAxOjI6Mzo0OjU6Njo3OjogIDE6MjozOjQ6NTo2Ojc6OFxuICBcIig/OlwiLmNvbmNhdCh2NnNlZywgXCI6KXs2fSg/OlwiKS5jb25jYXQodjQsIFwifDpcIikuY29uY2F0KHY2c2VnLCBcInw6KVwiKSwgLy8gMToyOjM6NDo1OjY6OiAgICAxOjI6Mzo0OjU6Njo6OCAgIDE6MjozOjQ6NTo2Ojo4ICAxOjI6Mzo0OjU6Njo6XG4gIFwiKD86XCIuY29uY2F0KHY2c2VnLCBcIjopezV9KD86OlwiKS5jb25jYXQodjQsIFwifCg/OjpcIikuY29uY2F0KHY2c2VnLCBcIil7MSwyfXw6KVwiKSwgLy8gMToyOjM6NDo1OjogICAgICAxOjI6Mzo0OjU6Ojc6OCAgIDE6MjozOjQ6NTo6OCAgICAxOjI6Mzo0OjU6OlxuICBcIig/OlwiLmNvbmNhdCh2NnNlZywgXCI6KXs0fSg/Oig/OjpcIikuY29uY2F0KHY2c2VnLCBcIil7MCwxfTpcIikuY29uY2F0KHY0LCBcInwoPzo6XCIpLmNvbmNhdCh2NnNlZywgXCIpezEsM318OilcIiksIC8vIDE6MjozOjQ6OiAgICAgICAgMToyOjM6NDo6Njo3OjggICAxOjI6Mzo0Ojo4ICAgICAgMToyOjM6NDo6XG4gIFwiKD86XCIuY29uY2F0KHY2c2VnLCBcIjopezN9KD86KD86OlwiKS5jb25jYXQodjZzZWcsIFwiKXswLDJ9OlwiKS5jb25jYXQodjQsIFwifCg/OjpcIikuY29uY2F0KHY2c2VnLCBcIil7MSw0fXw6KVwiKSwgLy8gMToyOjM6OiAgICAgICAgICAxOjI6Mzo6NTo2Ojc6OCAgIDE6MjozOjo4ICAgICAgICAxOjI6Mzo6XG4gIFwiKD86XCIuY29uY2F0KHY2c2VnLCBcIjopezJ9KD86KD86OlwiKS5jb25jYXQodjZzZWcsIFwiKXswLDN9OlwiKS5jb25jYXQodjQsIFwifCg/OjpcIikuY29uY2F0KHY2c2VnLCBcIil7MSw1fXw6KVwiKSwgLy8gMToyOjogICAgICAgICAgICAxOjI6OjQ6NTo2Ojc6OCAgIDE6Mjo6OCAgICAgICAgICAxOjI6OlxuICBcIig/OlwiLmNvbmNhdCh2NnNlZywgXCI6KXsxfSg/Oig/OjpcIikuY29uY2F0KHY2c2VnLCBcIil7MCw0fTpcIikuY29uY2F0KHY0LCBcInwoPzo6XCIpLmNvbmNhdCh2NnNlZywgXCIpezEsNn18OilcIiksIC8vIDE6OiAgICAgICAgICAgICAgMTo6Mzo0OjU6Njo3OjggICAxOjo4ICAgICAgICAgICAgMTo6XG4gIFwiKD86Oig/Oig/OjpcIi5jb25jYXQodjZzZWcsIFwiKXswLDV9OlwiKS5jb25jYXQodjQsIFwifCg/OjpcIikuY29uY2F0KHY2c2VnLCBcIil7MSw3fXw6KSlcIikgLy8gOjoyOjM6NDo1OjY6Nzo4ICA6OjI6Mzo0OjU6Njo3OjggIDo6OCAgICAgICAgICAgICA6OlxuICBdO1xuICB2YXIgdjZFdGgwID0gXCIoPzolWzAtOWEtekEtWl17MSx9KT9cIjsgLy8gJWV0aDAgICAgICAgICAgICAlMVxuXG4gIHZhciB2NiA9IFwiKD86XCIuY29uY2F0KHY2TGlzdC5qb2luKCd8JyksIFwiKVwiKS5jb25jYXQodjZFdGgwKTtcblxuICAvLyBQcmUtY29tcGlsZSBvbmx5IHRoZSBleGFjdCByZWdleGVzIGJlY2F1c2UgYWRkaW5nIGEgZ2xvYmFsIGZsYWcgbWFrZSByZWdleGVzIHN0YXRlZnVsXG4gIHZhciB2NDZFeGFjdCA9IG5ldyBSZWdFeHAoXCIoPzpeXCIuY29uY2F0KHY0LCBcIiQpfCg/Ol5cIikuY29uY2F0KHY2LCBcIiQpXCIpKTtcbiAgdmFyIHY0ZXhhY3QgPSBuZXcgUmVnRXhwKFwiXlwiLmNvbmNhdCh2NCwgXCIkXCIpKTtcbiAgdmFyIHY2ZXhhY3QgPSBuZXcgUmVnRXhwKFwiXlwiLmNvbmNhdCh2NiwgXCIkXCIpKTtcbiAgdmFyIGlwID0gZnVuY3Rpb24gaXAob3B0aW9ucykge1xuICAgIHJldHVybiBvcHRpb25zICYmIG9wdGlvbnMuZXhhY3QgPyB2NDZFeGFjdCA6IG5ldyBSZWdFeHAoXCIoPzpcIi5jb25jYXQoYihvcHRpb25zKSkuY29uY2F0KHY0KS5jb25jYXQoYihvcHRpb25zKSwgXCIpfCg/OlwiKS5jb25jYXQoYihvcHRpb25zKSkuY29uY2F0KHY2KS5jb25jYXQoYihvcHRpb25zKSwgXCIpXCIpLCAnZycpO1xuICB9O1xuICBpcC52NCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMgJiYgb3B0aW9ucy5leGFjdCA/IHY0ZXhhY3QgOiBuZXcgUmVnRXhwKFwiXCIuY29uY2F0KGIob3B0aW9ucykpLmNvbmNhdCh2NCkuY29uY2F0KGIob3B0aW9ucykpLCAnZycpO1xuICB9O1xuICBpcC52NiA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMgJiYgb3B0aW9ucy5leGFjdCA/IHY2ZXhhY3QgOiBuZXcgUmVnRXhwKFwiXCIuY29uY2F0KGIob3B0aW9ucykpLmNvbmNhdCh2NikuY29uY2F0KGIob3B0aW9ucykpLCAnZycpO1xuICB9O1xuICB2YXIgcHJvdG9jb2wgPSBcIig/Oig/OlthLXpdKzopPy8vKVwiO1xuICB2YXIgYXV0aCA9ICcoPzpcXFxcUysoPzo6XFxcXFMqKT9AKT8nO1xuICB2YXIgaXB2NCA9IGlwLnY0KCkuc291cmNlO1xuICB2YXIgaXB2NiA9IGlwLnY2KCkuc291cmNlO1xuICB2YXIgaG9zdCA9IFwiKD86KD86W2EtelxcXFx1MDBhMS1cXFxcdWZmZmYwLTldWy1fXSopKlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmMC05XSspXCI7XG4gIHZhciBkb21haW4gPSBcIig/OlxcXFwuKD86W2EtelxcXFx1MDBhMS1cXFxcdWZmZmYwLTldLSopKlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmMC05XSspKlwiO1xuICB2YXIgdGxkID0gXCIoPzpcXFxcLig/OlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmXXsyLH0pKVwiO1xuICB2YXIgcG9ydCA9ICcoPzo6XFxcXGR7Miw1fSk/JztcbiAgdmFyIHBhdGggPSAnKD86Wy8/I11bXlxcXFxzXCJdKik/JztcbiAgdmFyIHJlZ2V4ID0gXCIoPzpcIi5jb25jYXQocHJvdG9jb2wsIFwifHd3d1xcXFwuKVwiKS5jb25jYXQoYXV0aCwgXCIoPzpsb2NhbGhvc3R8XCIpLmNvbmNhdChpcHY0LCBcInxcIikuY29uY2F0KGlwdjYsIFwifFwiKS5jb25jYXQoaG9zdCkuY29uY2F0KGRvbWFpbikuY29uY2F0KHRsZCwgXCIpXCIpLmNvbmNhdChwb3J0KS5jb25jYXQocGF0aCk7XG4gIHVybFJlZyA9IG5ldyBSZWdFeHAoXCIoPzpeXCIuY29uY2F0KHJlZ2V4LCBcIiQpXCIpLCAnaScpO1xuICByZXR1cm4gdXJsUmVnO1xufSk7IiwgImltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCB7IGZvcm1hdCB9IGZyb20gXCIuLi91dGlsXCI7XG5pbXBvcnQgcmVxdWlyZWQgZnJvbSBcIi4vcmVxdWlyZWRcIjtcbmltcG9ydCBnZXRVcmxSZWdleCBmcm9tIFwiLi91cmxcIjtcbi8qIGVzbGludCBtYXgtbGVuOjAgKi9cblxudmFyIHBhdHRlcm4gPSB7XG4gIC8vIGh0dHA6Ly9lbWFpbHJlZ2V4LmNvbS9cbiAgZW1haWw6IC9eKChbXjw+KClcXFtcXF1cXFxcLiw7Olxcc0BcIl0rKFxcLltePD4oKVxcW1xcXVxcXFwuLDs6XFxzQFwiXSspKil8KFwiLitcIikpQCgoXFxbWzAtOV17MSwzfVxcLlswLTldezEsM31cXC5bMC05XXsxLDN9XFwuWzAtOV17MSwzfV0pfCgoW2EtekEtWlxcLTAtOVxcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0rXFwuKStbYS16QS1aXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXXsyLH0pKSQvLFxuICAvLyB1cmw6IG5ldyBSZWdFeHAoXG4gIC8vICAgJ14oPyFtYWlsdG86KSg/Oig/Omh0dHB8aHR0cHN8ZnRwKTovL3wvLykoPzpcXFxcUysoPzo6XFxcXFMqKT9AKT8oPzooPzooPzpbMS05XVxcXFxkP3wxXFxcXGRcXFxcZHwyWzAxXVxcXFxkfDIyWzAtM10pKD86XFxcXC4oPzoxP1xcXFxkezEsMn18MlswLTRdXFxcXGR8MjVbMC01XSkpezJ9KD86XFxcXC4oPzpbMC05XVxcXFxkP3wxXFxcXGRcXFxcZHwyWzAtNF1cXFxcZHwyNVswLTRdKSl8KD86KD86W2EtelxcXFx1MDBhMS1cXFxcdWZmZmYwLTldKy0qKSpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZjAtOV0rKSg/OlxcXFwuKD86W2EtelxcXFx1MDBhMS1cXFxcdWZmZmYwLTldKy0qKSpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZjAtOV0rKSooPzpcXFxcLig/OlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmXXsyLH0pKSl8bG9jYWxob3N0KSg/OjpcXFxcZHsyLDV9KT8oPzooL3xcXFxcP3wjKVteXFxcXHNdKik/JCcsXG4gIC8vICAgJ2knLFxuICAvLyApLFxuICBoZXg6IC9eIz8oW2EtZjAtOV17Nn18W2EtZjAtOV17M30pJC9pXG59O1xudmFyIHR5cGVzID0ge1xuICBpbnRlZ2VyOiBmdW5jdGlvbiBpbnRlZ2VyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVzLm51bWJlcih2YWx1ZSkgJiYgcGFyc2VJbnQodmFsdWUsIDEwKSA9PT0gdmFsdWU7XG4gIH0sXG4gIGZsb2F0OiBmdW5jdGlvbiBmbG9hdCh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlcy5udW1iZXIodmFsdWUpICYmICF0eXBlcy5pbnRlZ2VyKHZhbHVlKTtcbiAgfSxcbiAgYXJyYXk6IGZ1bmN0aW9uIGFycmF5KHZhbHVlKSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpO1xuICB9LFxuICByZWdleHA6IGZ1bmN0aW9uIHJlZ2V4cCh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISFuZXcgUmVnRXhwKHZhbHVlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxuICBkYXRlOiBmdW5jdGlvbiBkYXRlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZS5nZXRUaW1lID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZS5nZXRNb250aCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsdWUuZ2V0WWVhciA9PT0gJ2Z1bmN0aW9uJyAmJiAhaXNOYU4odmFsdWUuZ2V0VGltZSgpKTtcbiAgfSxcbiAgbnVtYmVyOiBmdW5jdGlvbiBudW1iZXIodmFsdWUpIHtcbiAgICBpZiAoaXNOYU4odmFsdWUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInO1xuICB9LFxuICBvYmplY3Q6IGZ1bmN0aW9uIG9iamVjdCh2YWx1ZSkge1xuICAgIHJldHVybiBfdHlwZW9mKHZhbHVlKSA9PT0gJ29iamVjdCcgJiYgIXR5cGVzLmFycmF5KHZhbHVlKTtcbiAgfSxcbiAgbWV0aG9kOiBmdW5jdGlvbiBtZXRob2QodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xuICB9LFxuICBlbWFpbDogZnVuY3Rpb24gZW1haWwodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPD0gMzIwICYmICEhdmFsdWUubWF0Y2gocGF0dGVybi5lbWFpbCk7XG4gIH0sXG4gIHVybDogZnVuY3Rpb24gdXJsKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUubGVuZ3RoIDw9IDIwNDggJiYgISF2YWx1ZS5tYXRjaChnZXRVcmxSZWdleCgpKTtcbiAgfSxcbiAgaGV4OiBmdW5jdGlvbiBoZXgodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAhIXZhbHVlLm1hdGNoKHBhdHRlcm4uaGV4KTtcbiAgfVxufTtcbnZhciB0eXBlID0gZnVuY3Rpb24gdHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpIHtcbiAgaWYgKHJ1bGUucmVxdWlyZWQgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBjdXN0b20gPSBbJ2ludGVnZXInLCAnZmxvYXQnLCAnYXJyYXknLCAncmVnZXhwJywgJ29iamVjdCcsICdtZXRob2QnLCAnZW1haWwnLCAnbnVtYmVyJywgJ2RhdGUnLCAndXJsJywgJ2hleCddO1xuICB2YXIgcnVsZVR5cGUgPSBydWxlLnR5cGU7XG4gIGlmIChjdXN0b20uaW5kZXhPZihydWxlVHlwZSkgPiAtMSkge1xuICAgIGlmICghdHlwZXNbcnVsZVR5cGVdKHZhbHVlKSkge1xuICAgICAgZXJyb3JzLnB1c2goZm9ybWF0KG9wdGlvbnMubWVzc2FnZXMudHlwZXNbcnVsZVR5cGVdLCBydWxlLmZ1bGxGaWVsZCwgcnVsZS50eXBlKSk7XG4gICAgfVxuICAgIC8vIHN0cmFpZ2h0IHR5cGVvZiBjaGVja1xuICB9IGVsc2UgaWYgKHJ1bGVUeXBlICYmIF90eXBlb2YodmFsdWUpICE9PSBydWxlLnR5cGUpIHtcbiAgICBlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlcy50eXBlc1tydWxlVHlwZV0sIHJ1bGUuZnVsbEZpZWxkLCBydWxlLnR5cGUpKTtcbiAgfVxufTtcbmV4cG9ydCBkZWZhdWx0IHR5cGU7IiwgImltcG9ydCB7IGZvcm1hdCB9IGZyb20gXCIuLi91dGlsXCI7XG5cbi8qKlxuICogIFJ1bGUgZm9yIHZhbGlkYXRpbmcgd2hpdGVzcGFjZS5cbiAqXG4gKiAgQHBhcmFtIHJ1bGUgVGhlIHZhbGlkYXRpb24gcnVsZS5cbiAqICBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvbiB0aGUgc291cmNlIG9iamVjdC5cbiAqICBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0IGJlaW5nIHZhbGlkYXRlZC5cbiAqICBAcGFyYW0gZXJyb3JzIEFuIGFycmF5IG9mIGVycm9ycyB0aGF0IHRoaXMgcnVsZSBtYXkgYWRkXG4gKiAgdmFsaWRhdGlvbiBlcnJvcnMgdG8uXG4gKiAgQHBhcmFtIG9wdGlvbnMgVGhlIHZhbGlkYXRpb24gb3B0aW9ucy5cbiAqICBAcGFyYW0gb3B0aW9ucy5tZXNzYWdlcyBUaGUgdmFsaWRhdGlvbiBtZXNzYWdlcy5cbiAqL1xudmFyIHdoaXRlc3BhY2UgPSBmdW5jdGlvbiB3aGl0ZXNwYWNlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucykge1xuICBpZiAoL15cXHMrJC8udGVzdCh2YWx1ZSkgfHwgdmFsdWUgPT09ICcnKSB7XG4gICAgZXJyb3JzLnB1c2goZm9ybWF0KG9wdGlvbnMubWVzc2FnZXMud2hpdGVzcGFjZSwgcnVsZS5mdWxsRmllbGQpKTtcbiAgfVxufTtcbmV4cG9ydCBkZWZhdWx0IHdoaXRlc3BhY2U7IiwgImltcG9ydCBlbnVtUnVsZSBmcm9tIFwiLi9lbnVtXCI7XG5pbXBvcnQgcGF0dGVybiBmcm9tIFwiLi9wYXR0ZXJuXCI7XG5pbXBvcnQgcmFuZ2UgZnJvbSBcIi4vcmFuZ2VcIjtcbmltcG9ydCByZXF1aXJlZCBmcm9tIFwiLi9yZXF1aXJlZFwiO1xuaW1wb3J0IHR5cGUgZnJvbSBcIi4vdHlwZVwiO1xuaW1wb3J0IHdoaXRlc3BhY2UgZnJvbSBcIi4vd2hpdGVzcGFjZVwiO1xuZXhwb3J0IGRlZmF1bHQge1xuICByZXF1aXJlZDogcmVxdWlyZWQsXG4gIHdoaXRlc3BhY2U6IHdoaXRlc3BhY2UsXG4gIHR5cGU6IHR5cGUsXG4gIHJhbmdlOiByYW5nZSxcbiAgZW51bTogZW51bVJ1bGUsXG4gIHBhdHRlcm46IHBhdHRlcm5cbn07IiwgImltcG9ydCBydWxlcyBmcm9tIFwiLi4vcnVsZVwiO1xuaW1wb3J0IHsgaXNFbXB0eVZhbHVlIH0gZnJvbSBcIi4uL3V0aWxcIjtcbnZhciBhbnkgPSBmdW5jdGlvbiBhbnkocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcbiAgaWYgKHZhbGlkYXRlKSB7XG4gICAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cbiAgICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICB9XG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuZXhwb3J0IGRlZmF1bHQgYW55OyIsICJpbXBvcnQgcnVsZXMgZnJvbSBcIi4uL3J1bGUvaW5kZXhcIjtcbnZhciBhcnJheSA9IGZ1bmN0aW9uIGFycmF5KHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmICgodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cbiAgICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMsICdhcnJheScpO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICBydWxlcy50eXBlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgICBydWxlcy5yYW5nZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcbmV4cG9ydCBkZWZhdWx0IGFycmF5OyIsICJpbXBvcnQgcnVsZXMgZnJvbSBcIi4uL3J1bGVcIjtcbmltcG9ydCB7IGlzRW1wdHlWYWx1ZSB9IGZyb20gXCIuLi91dGlsXCI7XG52YXIgYm9vbGVhbiA9IGZ1bmN0aW9uIGJvb2xlYW4ocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcbiAgaWYgKHZhbGlkYXRlKSB7XG4gICAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cbiAgICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBydWxlcy50eXBlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgfVxuICB9XG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuZXhwb3J0IGRlZmF1bHQgYm9vbGVhbjsiLCAiaW1wb3J0IHJ1bGVzIGZyb20gXCIuLi9ydWxlXCI7XG5pbXBvcnQgeyBpc0VtcHR5VmFsdWUgfSBmcm9tIFwiLi4vdXRpbFwiO1xudmFyIGRhdGUgPSBmdW5jdGlvbiBkYXRlKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIC8vIGNvbnNvbGUubG9nKCdpbnRlZ2VyIHJ1bGUgY2FsbGVkICVqJywgcnVsZSk7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XG4gIC8vIGNvbnNvbGUubG9nKCd2YWxpZGF0ZSBvbiAlcyB2YWx1ZScsIHZhbHVlKTtcbiAgaWYgKHZhbGlkYXRlKSB7XG4gICAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSwgJ2RhdGUnKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgaWYgKCFpc0VtcHR5VmFsdWUodmFsdWUsICdkYXRlJykpIHtcbiAgICAgIHZhciBkYXRlT2JqZWN0O1xuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICBkYXRlT2JqZWN0ID0gdmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkYXRlT2JqZWN0ID0gbmV3IERhdGUodmFsdWUpO1xuICAgICAgfVxuICAgICAgcnVsZXMudHlwZShydWxlLCBkYXRlT2JqZWN0LCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgICBpZiAoZGF0ZU9iamVjdCkge1xuICAgICAgICBydWxlcy5yYW5nZShydWxlLCBkYXRlT2JqZWN0LmdldFRpbWUoKSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcbmV4cG9ydCBkZWZhdWx0IGRhdGU7IiwgImltcG9ydCBydWxlcyBmcm9tIFwiLi4vcnVsZVwiO1xuaW1wb3J0IHsgaXNFbXB0eVZhbHVlIH0gZnJvbSBcIi4uL3V0aWxcIjtcbnZhciBFTlVNID0gJ2VudW0nO1xudmFyIGVudW1lcmFibGUgPSBmdW5jdGlvbiBlbnVtZXJhYmxlKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmIChpc0VtcHR5VmFsdWUodmFsdWUpICYmICFydWxlLnJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcnVsZXNbRU5VTV0ocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cbiAgY2FsbGJhY2soZXJyb3JzKTtcbn07XG5leHBvcnQgZGVmYXVsdCBlbnVtZXJhYmxlOyIsICJpbXBvcnQgcnVsZXMgZnJvbSBcIi4uL3J1bGVcIjtcbmltcG9ydCB7IGlzRW1wdHlWYWx1ZSB9IGZyb20gXCIuLi91dGlsXCI7XG52YXIgZmxvYXRGbiA9IGZ1bmN0aW9uIGZsb2F0Rm4ocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcbiAgaWYgKHZhbGlkYXRlKSB7XG4gICAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cbiAgICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBydWxlcy50eXBlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgICBydWxlcy5yYW5nZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcbmV4cG9ydCBkZWZhdWx0IGZsb2F0Rm47IiwgImltcG9ydCBydWxlcyBmcm9tIFwiLi4vcnVsZVwiO1xuaW1wb3J0IHsgaXNFbXB0eVZhbHVlIH0gZnJvbSBcIi4uL3V0aWxcIjtcbnZhciBpbnRlZ2VyID0gZnVuY3Rpb24gaW50ZWdlcihydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJ1bGVzLnR5cGUocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICAgIHJ1bGVzLnJhbmdlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgfVxuICB9XG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuZXhwb3J0IGRlZmF1bHQgaW50ZWdlcjsiLCAiaW1wb3J0IHJ1bGVzIGZyb20gXCIuLi9ydWxlXCI7XG5pbXBvcnQgeyBpc0VtcHR5VmFsdWUgfSBmcm9tIFwiLi4vdXRpbFwiO1xudmFyIG1ldGhvZCA9IGZ1bmN0aW9uIG1ldGhvZChydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJ1bGVzLnR5cGUocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cbiAgY2FsbGJhY2soZXJyb3JzKTtcbn07XG5leHBvcnQgZGVmYXVsdCBtZXRob2Q7IiwgImltcG9ydCBydWxlcyBmcm9tIFwiLi4vcnVsZVwiO1xuaW1wb3J0IHsgaXNFbXB0eVZhbHVlIH0gZnJvbSBcIi4uL3V0aWxcIjtcbnZhciBudW1iZXIgPSBmdW5jdGlvbiBudW1iZXIocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcbiAgaWYgKHZhbGlkYXRlKSB7XG4gICAgaWYgKHZhbHVlID09PSAnJykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICB2YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cbiAgICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBydWxlcy50eXBlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgICBydWxlcy5yYW5nZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcbmV4cG9ydCBkZWZhdWx0IG51bWJlcjsiLCAiaW1wb3J0IHJ1bGVzIGZyb20gXCIuLi9ydWxlXCI7XG5pbXBvcnQgeyBpc0VtcHR5VmFsdWUgfSBmcm9tIFwiLi4vdXRpbFwiO1xudmFyIG9iamVjdCA9IGZ1bmN0aW9uIG9iamVjdChydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJ1bGVzLnR5cGUocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cbiAgY2FsbGJhY2soZXJyb3JzKTtcbn07XG5leHBvcnQgZGVmYXVsdCBvYmplY3Q7IiwgImltcG9ydCBydWxlcyBmcm9tIFwiLi4vcnVsZVwiO1xuaW1wb3J0IHsgaXNFbXB0eVZhbHVlIH0gZnJvbSBcIi4uL3V0aWxcIjtcbnZhciBwYXR0ZXJuID0gZnVuY3Rpb24gcGF0dGVybihydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlLCAnc3RyaW5nJykgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cbiAgICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIGlmICghaXNFbXB0eVZhbHVlKHZhbHVlLCAnc3RyaW5nJykpIHtcbiAgICAgIHJ1bGVzLnBhdHRlcm4ocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cbiAgY2FsbGJhY2soZXJyb3JzKTtcbn07XG5leHBvcnQgZGVmYXVsdCBwYXR0ZXJuOyIsICJpbXBvcnQgcnVsZXMgZnJvbSBcIi4uL3J1bGVcIjtcbmltcG9ydCB7IGlzRW1wdHlWYWx1ZSB9IGZyb20gXCIuLi91dGlsXCI7XG52YXIgcmVnZXhwID0gZnVuY3Rpb24gcmVnZXhwKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmIChpc0VtcHR5VmFsdWUodmFsdWUpICYmICFydWxlLnJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICBpZiAoIWlzRW1wdHlWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgIHJ1bGVzLnR5cGUocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cbiAgY2FsbGJhY2soZXJyb3JzKTtcbn07XG5leHBvcnQgZGVmYXVsdCByZWdleHA7IiwgImltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCBydWxlcyBmcm9tIFwiLi4vcnVsZVwiO1xudmFyIHJlcXVpcmVkID0gZnVuY3Rpb24gcmVxdWlyZWQocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdHlwZSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gJ2FycmF5JyA6IF90eXBlb2YodmFsdWUpO1xuICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMsIHR5cGUpO1xuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcbmV4cG9ydCBkZWZhdWx0IHJlcXVpcmVkOyIsICJpbXBvcnQgcnVsZXMgZnJvbSBcIi4uL3J1bGVcIjtcbmltcG9ydCB7IGlzRW1wdHlWYWx1ZSB9IGZyb20gXCIuLi91dGlsXCI7XG52YXIgc3RyaW5nID0gZnVuY3Rpb24gc3RyaW5nKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmIChpc0VtcHR5VmFsdWUodmFsdWUsICdzdHJpbmcnKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucywgJ3N0cmluZycpO1xuICAgIGlmICghaXNFbXB0eVZhbHVlKHZhbHVlLCAnc3RyaW5nJykpIHtcbiAgICAgIHJ1bGVzLnR5cGUocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICAgIHJ1bGVzLnJhbmdlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgICBydWxlcy5wYXR0ZXJuKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgICBpZiAocnVsZS53aGl0ZXNwYWNlID09PSB0cnVlKSB7XG4gICAgICAgIHJ1bGVzLndoaXRlc3BhY2UocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY2FsbGJhY2soZXJyb3JzKTtcbn07XG5leHBvcnQgZGVmYXVsdCBzdHJpbmc7IiwgImltcG9ydCBydWxlcyBmcm9tIFwiLi4vcnVsZVwiO1xuaW1wb3J0IHsgaXNFbXB0eVZhbHVlIH0gZnJvbSBcIi4uL3V0aWxcIjtcbnZhciB0eXBlID0gZnVuY3Rpb24gdHlwZShydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgcnVsZVR5cGUgPSBydWxlLnR5cGU7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmIChpc0VtcHR5VmFsdWUodmFsdWUsIHJ1bGVUeXBlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucywgcnVsZVR5cGUpO1xuICAgIGlmICghaXNFbXB0eVZhbHVlKHZhbHVlLCBydWxlVHlwZSkpIHtcbiAgICAgIHJ1bGVzLnR5cGUocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cbiAgY2FsbGJhY2soZXJyb3JzKTtcbn07XG5leHBvcnQgZGVmYXVsdCB0eXBlOyIsICJpbXBvcnQgYW55IGZyb20gXCIuL2FueVwiO1xuaW1wb3J0IGFycmF5IGZyb20gXCIuL2FycmF5XCI7XG5pbXBvcnQgYm9vbGVhbiBmcm9tIFwiLi9ib29sZWFuXCI7XG5pbXBvcnQgZGF0ZSBmcm9tIFwiLi9kYXRlXCI7XG5pbXBvcnQgZW51bVZhbGlkYXRvciBmcm9tIFwiLi9lbnVtXCI7XG5pbXBvcnQgZmxvYXQgZnJvbSBcIi4vZmxvYXRcIjtcbmltcG9ydCBpbnRlZ2VyIGZyb20gXCIuL2ludGVnZXJcIjtcbmltcG9ydCBtZXRob2QgZnJvbSBcIi4vbWV0aG9kXCI7XG5pbXBvcnQgbnVtYmVyIGZyb20gXCIuL251bWJlclwiO1xuaW1wb3J0IG9iamVjdCBmcm9tIFwiLi9vYmplY3RcIjtcbmltcG9ydCBwYXR0ZXJuIGZyb20gXCIuL3BhdHRlcm5cIjtcbmltcG9ydCByZWdleHAgZnJvbSBcIi4vcmVnZXhwXCI7XG5pbXBvcnQgcmVxdWlyZWQgZnJvbSBcIi4vcmVxdWlyZWRcIjtcbmltcG9ydCBzdHJpbmcgZnJvbSBcIi4vc3RyaW5nXCI7XG5pbXBvcnQgdHlwZSBmcm9tIFwiLi90eXBlXCI7XG5leHBvcnQgZGVmYXVsdCB7XG4gIHN0cmluZzogc3RyaW5nLFxuICBtZXRob2Q6IG1ldGhvZCxcbiAgbnVtYmVyOiBudW1iZXIsXG4gIGJvb2xlYW46IGJvb2xlYW4sXG4gIHJlZ2V4cDogcmVnZXhwLFxuICBpbnRlZ2VyOiBpbnRlZ2VyLFxuICBmbG9hdDogZmxvYXQsXG4gIGFycmF5OiBhcnJheSxcbiAgb2JqZWN0OiBvYmplY3QsXG4gIGVudW06IGVudW1WYWxpZGF0b3IsXG4gIHBhdHRlcm46IHBhdHRlcm4sXG4gIGRhdGU6IGRhdGUsXG4gIHVybDogdHlwZSxcbiAgaGV4OiB0eXBlLFxuICBlbWFpbDogdHlwZSxcbiAgcmVxdWlyZWQ6IHJlcXVpcmVkLFxuICBhbnk6IGFueVxufTsiLCAiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgeyBtZXNzYWdlcyBhcyBkZWZhdWx0TWVzc2FnZXMsIG5ld01lc3NhZ2VzIH0gZnJvbSBcIi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7IGFzeW5jTWFwLCBjb21wbGVtZW50RXJyb3IsIGNvbnZlcnRGaWVsZHNFcnJvciwgZGVlcE1lcmdlLCBmb3JtYXQsIHdhcm5pbmcgfSBmcm9tIFwiLi91dGlsXCI7XG5pbXBvcnQgdmFsaWRhdG9ycyBmcm9tIFwiLi92YWxpZGF0b3IvaW5kZXhcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ludGVyZmFjZVwiO1xuXG4vKipcbiAqICBFbmNhcHN1bGF0ZXMgYSB2YWxpZGF0aW9uIHNjaGVtYS5cbiAqXG4gKiAgQHBhcmFtIGRlc2NyaXB0b3IgQW4gb2JqZWN0IGRlY2xhcmluZyB2YWxpZGF0aW9uIHJ1bGVzXG4gKiAgZm9yIHRoaXMgc2NoZW1hLlxuICovXG52YXIgU2NoZW1hID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU2NoZW1hKGRlc2NyaXB0b3IpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU2NoZW1hKTtcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gSW5zdGFuY2UgPT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwicnVsZXNcIiwgbnVsbCk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiX21lc3NhZ2VzXCIsIGRlZmF1bHRNZXNzYWdlcyk7XG4gICAgdGhpcy5kZWZpbmUoZGVzY3JpcHRvcik7XG4gIH1cbiAgX2NyZWF0ZUNsYXNzKFNjaGVtYSwgW3tcbiAgICBrZXk6IFwiZGVmaW5lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlZmluZShydWxlcykge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgIGlmICghcnVsZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29uZmlndXJlIGEgc2NoZW1hIHdpdGggbm8gcnVsZXMnKTtcbiAgICAgIH1cbiAgICAgIGlmIChfdHlwZW9mKHJ1bGVzKSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShydWxlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSdWxlcyBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgICAgfVxuICAgICAgdGhpcy5ydWxlcyA9IHt9O1xuICAgICAgT2JqZWN0LmtleXMocnVsZXMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBydWxlc1tuYW1lXTtcbiAgICAgICAgX3RoaXMucnVsZXNbbmFtZV0gPSBBcnJheS5pc0FycmF5KGl0ZW0pID8gaXRlbSA6IFtpdGVtXTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJtZXNzYWdlc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtZXNzYWdlcyhfbWVzc2FnZXMpIHtcbiAgICAgIGlmIChfbWVzc2FnZXMpIHtcbiAgICAgICAgdGhpcy5fbWVzc2FnZXMgPSBkZWVwTWVyZ2UobmV3TWVzc2FnZXMoKSwgX21lc3NhZ2VzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLl9tZXNzYWdlcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidmFsaWRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdmFsaWRhdGUoc291cmNlXykge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG4gICAgICB2YXIgbyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgICB2YXIgb2MgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZ1bmN0aW9uICgpIHt9O1xuICAgICAgdmFyIHNvdXJjZSA9IHNvdXJjZV87XG4gICAgICB2YXIgb3B0aW9ucyA9IG87XG4gICAgICB2YXIgY2FsbGJhY2sgPSBvYztcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5ydWxlcyB8fCBPYmplY3Qua2V5cyh0aGlzLnJ1bGVzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgY2FsbGJhY2sobnVsbCwgc291cmNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHNvdXJjZSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBjb21wbGV0ZShyZXN1bHRzKSB7XG4gICAgICAgIHZhciBlcnJvcnMgPSBbXTtcbiAgICAgICAgdmFyIGZpZWxkcyA9IHt9O1xuICAgICAgICBmdW5jdGlvbiBhZGQoZSkge1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGUpKSB7XG4gICAgICAgICAgICB2YXIgX2Vycm9ycztcbiAgICAgICAgICAgIGVycm9ycyA9IChfZXJyb3JzID0gZXJyb3JzKS5jb25jYXQuYXBwbHkoX2Vycm9ycywgX3RvQ29uc3VtYWJsZUFycmF5KGUpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2goZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGFkZChyZXN1bHRzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICBjYWxsYmFjayhudWxsLCBzb3VyY2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpZWxkcyA9IGNvbnZlcnRGaWVsZHNFcnJvcihlcnJvcnMpO1xuICAgICAgICAgIGNhbGxiYWNrKGVycm9ycywgZmllbGRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMubWVzc2FnZXMpIHtcbiAgICAgICAgdmFyIG1lc3NhZ2VzID0gdGhpcy5tZXNzYWdlcygpO1xuICAgICAgICBpZiAobWVzc2FnZXMgPT09IGRlZmF1bHRNZXNzYWdlcykge1xuICAgICAgICAgIG1lc3NhZ2VzID0gbmV3TWVzc2FnZXMoKTtcbiAgICAgICAgfVxuICAgICAgICBkZWVwTWVyZ2UobWVzc2FnZXMsIG9wdGlvbnMubWVzc2FnZXMpO1xuICAgICAgICBvcHRpb25zLm1lc3NhZ2VzID0gbWVzc2FnZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHRpb25zLm1lc3NhZ2VzID0gdGhpcy5tZXNzYWdlcygpO1xuICAgICAgfVxuICAgICAgdmFyIHNlcmllcyA9IHt9O1xuICAgICAgdmFyIGtleXMgPSBvcHRpb25zLmtleXMgfHwgT2JqZWN0LmtleXModGhpcy5ydWxlcyk7XG4gICAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKHopIHtcbiAgICAgICAgdmFyIGFyciA9IF90aGlzMi5ydWxlc1t6XTtcbiAgICAgICAgdmFyIHZhbHVlID0gc291cmNlW3pdO1xuICAgICAgICBhcnIuZm9yRWFjaChmdW5jdGlvbiAocikge1xuICAgICAgICAgIHZhciBydWxlID0gcjtcbiAgICAgICAgICBpZiAodHlwZW9mIHJ1bGUudHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBpZiAoc291cmNlID09PSBzb3VyY2VfKSB7XG4gICAgICAgICAgICAgIHNvdXJjZSA9IF9vYmplY3RTcHJlYWQoe30sIHNvdXJjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YWx1ZSA9IHNvdXJjZVt6XSA9IHJ1bGUudHJhbnNmb3JtKHZhbHVlKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHJ1bGUudHlwZSA9IHJ1bGUudHlwZSB8fCAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyAnYXJyYXknIDogX3R5cGVvZih2YWx1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHlwZW9mIHJ1bGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJ1bGUgPSB7XG4gICAgICAgICAgICAgIHZhbGlkYXRvcjogcnVsZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcnVsZSA9IF9vYmplY3RTcHJlYWQoe30sIHJ1bGUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEZpbGwgdmFsaWRhdG9yLiBTa2lwIGlmIG5vdGhpbmcgbmVlZCB0byB2YWxpZGF0ZVxuICAgICAgICAgIHJ1bGUudmFsaWRhdG9yID0gX3RoaXMyLmdldFZhbGlkYXRpb25NZXRob2QocnVsZSk7XG4gICAgICAgICAgaWYgKCFydWxlLnZhbGlkYXRvcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBydWxlLmZpZWxkID0gejtcbiAgICAgICAgICBydWxlLmZ1bGxGaWVsZCA9IHJ1bGUuZnVsbEZpZWxkIHx8IHo7XG4gICAgICAgICAgcnVsZS50eXBlID0gX3RoaXMyLmdldFR5cGUocnVsZSk7XG4gICAgICAgICAgc2VyaWVzW3pdID0gc2VyaWVzW3pdIHx8IFtdO1xuICAgICAgICAgIHNlcmllc1t6XS5wdXNoKHtcbiAgICAgICAgICAgIHJ1bGU6IHJ1bGUsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgICAgIGZpZWxkOiB6XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICB2YXIgZXJyb3JGaWVsZHMgPSB7fTtcbiAgICAgIHJldHVybiBhc3luY01hcChzZXJpZXMsIG9wdGlvbnMsIGZ1bmN0aW9uIChkYXRhLCBkb0l0KSB7XG4gICAgICAgIHZhciBydWxlID0gZGF0YS5ydWxlO1xuICAgICAgICB2YXIgZGVlcCA9IChydWxlLnR5cGUgPT09ICdvYmplY3QnIHx8IHJ1bGUudHlwZSA9PT0gJ2FycmF5JykgJiYgKF90eXBlb2YocnVsZS5maWVsZHMpID09PSAnb2JqZWN0JyB8fCBfdHlwZW9mKHJ1bGUuZGVmYXVsdEZpZWxkKSA9PT0gJ29iamVjdCcpO1xuICAgICAgICBkZWVwID0gZGVlcCAmJiAocnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBkYXRhLnZhbHVlKTtcbiAgICAgICAgcnVsZS5maWVsZCA9IGRhdGEuZmllbGQ7XG4gICAgICAgIGZ1bmN0aW9uIGFkZEZ1bGxGaWVsZChrZXksIHNjaGVtYSkge1xuICAgICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHNjaGVtYSksIHt9LCB7XG4gICAgICAgICAgICBmdWxsRmllbGQ6IFwiXCIuY29uY2F0KHJ1bGUuZnVsbEZpZWxkLCBcIi5cIikuY29uY2F0KGtleSksXG4gICAgICAgICAgICBmdWxsRmllbGRzOiBydWxlLmZ1bGxGaWVsZHMgPyBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHJ1bGUuZnVsbEZpZWxkcyksIFtrZXldKSA6IFtrZXldXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gY2IoKSB7XG4gICAgICAgICAgdmFyIGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFtdO1xuICAgICAgICAgIHZhciBlcnJvckxpc3QgPSBBcnJheS5pc0FycmF5KGUpID8gZSA6IFtlXTtcbiAgICAgICAgICBpZiAoIW9wdGlvbnMuc3VwcHJlc3NXYXJuaW5nICYmIGVycm9yTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIFNjaGVtYS53YXJuaW5nKCdhc3luYy12YWxpZGF0b3I6JywgZXJyb3JMaXN0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGVycm9yTGlzdC5sZW5ndGggJiYgcnVsZS5tZXNzYWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVycm9yTGlzdCA9IFtdLmNvbmNhdChydWxlLm1lc3NhZ2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEZpbGwgZXJyb3IgaW5mb1xuICAgICAgICAgIHZhciBmaWxsZWRFcnJvcnMgPSBlcnJvckxpc3QubWFwKGNvbXBsZW1lbnRFcnJvcihydWxlLCBzb3VyY2UpKTtcbiAgICAgICAgICBpZiAob3B0aW9ucy5maXJzdCAmJiBmaWxsZWRFcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBlcnJvckZpZWxkc1tydWxlLmZpZWxkXSA9IDE7XG4gICAgICAgICAgICByZXR1cm4gZG9JdChmaWxsZWRFcnJvcnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWRlZXApIHtcbiAgICAgICAgICAgIGRvSXQoZmlsbGVkRXJyb3JzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaWYgcnVsZSBpcyByZXF1aXJlZCBidXQgdGhlIHRhcmdldCBvYmplY3RcbiAgICAgICAgICAgIC8vIGRvZXMgbm90IGV4aXN0IGZhaWwgYXQgdGhlIHJ1bGUgbGV2ZWwgYW5kIGRvbid0XG4gICAgICAgICAgICAvLyBnbyBkZWVwZXJcbiAgICAgICAgICAgIGlmIChydWxlLnJlcXVpcmVkICYmICFkYXRhLnZhbHVlKSB7XG4gICAgICAgICAgICAgIGlmIChydWxlLm1lc3NhZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZpbGxlZEVycm9ycyA9IFtdLmNvbmNhdChydWxlLm1lc3NhZ2UpLm1hcChjb21wbGVtZW50RXJyb3IocnVsZSwgc291cmNlKSk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5lcnJvcikge1xuICAgICAgICAgICAgICAgIGZpbGxlZEVycm9ycyA9IFtvcHRpb25zLmVycm9yKHJ1bGUsIGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzLnJlcXVpcmVkLCBydWxlLmZpZWxkKSldO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBkb0l0KGZpbGxlZEVycm9ycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZmllbGRzU2NoZW1hID0ge307XG4gICAgICAgICAgICBpZiAocnVsZS5kZWZhdWx0RmllbGQpIHtcbiAgICAgICAgICAgICAgT2JqZWN0LmtleXMoZGF0YS52YWx1ZSkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICBmaWVsZHNTY2hlbWFba2V5XSA9IHJ1bGUuZGVmYXVsdEZpZWxkO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpZWxkc1NjaGVtYSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZmllbGRzU2NoZW1hKSwgZGF0YS5ydWxlLmZpZWxkcyk7XG4gICAgICAgICAgICB2YXIgcGFyZWRGaWVsZHNTY2hlbWEgPSB7fTtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGZpZWxkc1NjaGVtYSkuZm9yRWFjaChmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgICAgICAgICAgdmFyIGZpZWxkU2NoZW1hID0gZmllbGRzU2NoZW1hW2ZpZWxkXTtcbiAgICAgICAgICAgICAgdmFyIGZpZWxkU2NoZW1hTGlzdCA9IEFycmF5LmlzQXJyYXkoZmllbGRTY2hlbWEpID8gZmllbGRTY2hlbWEgOiBbZmllbGRTY2hlbWFdO1xuICAgICAgICAgICAgICBwYXJlZEZpZWxkc1NjaGVtYVtmaWVsZF0gPSBmaWVsZFNjaGVtYUxpc3QubWFwKGFkZEZ1bGxGaWVsZC5iaW5kKG51bGwsIGZpZWxkKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHZhciBzY2hlbWEgPSBuZXcgU2NoZW1hKHBhcmVkRmllbGRzU2NoZW1hKTtcbiAgICAgICAgICAgIHNjaGVtYS5tZXNzYWdlcyhvcHRpb25zLm1lc3NhZ2VzKTtcbiAgICAgICAgICAgIGlmIChkYXRhLnJ1bGUub3B0aW9ucykge1xuICAgICAgICAgICAgICBkYXRhLnJ1bGUub3B0aW9ucy5tZXNzYWdlcyA9IG9wdGlvbnMubWVzc2FnZXM7XG4gICAgICAgICAgICAgIGRhdGEucnVsZS5vcHRpb25zLmVycm9yID0gb3B0aW9ucy5lcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjaGVtYS52YWxpZGF0ZShkYXRhLnZhbHVlLCBkYXRhLnJ1bGUub3B0aW9ucyB8fCBvcHRpb25zLCBmdW5jdGlvbiAoZXJycykge1xuICAgICAgICAgICAgICB2YXIgZmluYWxFcnJvcnMgPSBbXTtcbiAgICAgICAgICAgICAgaWYgKGZpbGxlZEVycm9ycyAmJiBmaWxsZWRFcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZmluYWxFcnJvcnMucHVzaC5hcHBseShmaW5hbEVycm9ycywgX3RvQ29uc3VtYWJsZUFycmF5KGZpbGxlZEVycm9ycykpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChlcnJzICYmIGVycnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZmluYWxFcnJvcnMucHVzaC5hcHBseShmaW5hbEVycm9ycywgX3RvQ29uc3VtYWJsZUFycmF5KGVycnMpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBkb0l0KGZpbmFsRXJyb3JzLmxlbmd0aCA/IGZpbmFsRXJyb3JzIDogbnVsbCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlcztcbiAgICAgICAgaWYgKHJ1bGUuYXN5bmNWYWxpZGF0b3IpIHtcbiAgICAgICAgICByZXMgPSBydWxlLmFzeW5jVmFsaWRhdG9yKHJ1bGUsIGRhdGEudmFsdWUsIGNiLCBkYXRhLnNvdXJjZSwgb3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSBpZiAocnVsZS52YWxpZGF0b3IpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzID0gcnVsZS52YWxpZGF0b3IocnVsZSwgZGF0YS52YWx1ZSwgY2IsIGRhdGEuc291cmNlLCBvcHRpb25zKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdmFyIF9jb25zb2xlJGVycm9yLCBfY29uc29sZTtcbiAgICAgICAgICAgIChfY29uc29sZSRlcnJvciA9IChfY29uc29sZSA9IGNvbnNvbGUpLmVycm9yKSA9PT0gbnVsbCB8fCBfY29uc29sZSRlcnJvciA9PT0gdm9pZCAwIHx8IF9jb25zb2xlJGVycm9yLmNhbGwoX2NvbnNvbGUsIGVycm9yKTtcbiAgICAgICAgICAgIC8vIHJldGhyb3cgdG8gcmVwb3J0IGVycm9yXG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuc3VwcHJlc3NWYWxpZGF0b3JFcnJvcikge1xuICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYihlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlcyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgY2IoKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGNiKHR5cGVvZiBydWxlLm1lc3NhZ2UgPT09ICdmdW5jdGlvbicgPyBydWxlLm1lc3NhZ2UocnVsZS5mdWxsRmllbGQgfHwgcnVsZS5maWVsZCkgOiBydWxlLm1lc3NhZ2UgfHwgXCJcIi5jb25jYXQocnVsZS5mdWxsRmllbGQgfHwgcnVsZS5maWVsZCwgXCIgZmFpbHNcIikpO1xuICAgICAgICAgIH0gZWxzZSBpZiAocmVzIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgIGNiKHJlcyk7XG4gICAgICAgICAgfSBlbHNlIGlmIChyZXMgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgY2IocmVzLm1lc3NhZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzICYmIHJlcy50aGVuKSB7XG4gICAgICAgICAgcmVzLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIGNiKCk7XG4gICAgICAgICAgfSwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBjYihlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSwgZnVuY3Rpb24gKHJlc3VsdHMpIHtcbiAgICAgICAgY29tcGxldGUocmVzdWx0cyk7XG4gICAgICB9LCBzb3VyY2UpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRUeXBlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFR5cGUocnVsZSkge1xuICAgICAgaWYgKHJ1bGUudHlwZSA9PT0gdW5kZWZpbmVkICYmIHJ1bGUucGF0dGVybiBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICBydWxlLnR5cGUgPSAncGF0dGVybic7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHJ1bGUudmFsaWRhdG9yICE9PSAnZnVuY3Rpb24nICYmIHJ1bGUudHlwZSAmJiAhdmFsaWRhdG9ycy5oYXNPd25Qcm9wZXJ0eShydWxlLnR5cGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihmb3JtYXQoJ1Vua25vd24gcnVsZSB0eXBlICVzJywgcnVsZS50eXBlKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcnVsZS50eXBlIHx8ICdzdHJpbmcnO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRWYWxpZGF0aW9uTWV0aG9kXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFZhbGlkYXRpb25NZXRob2QocnVsZSkge1xuICAgICAgaWYgKHR5cGVvZiBydWxlLnZhbGlkYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gcnVsZS52YWxpZGF0b3I7XG4gICAgICB9XG4gICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHJ1bGUpO1xuICAgICAgdmFyIG1lc3NhZ2VJbmRleCA9IGtleXMuaW5kZXhPZignbWVzc2FnZScpO1xuICAgICAgaWYgKG1lc3NhZ2VJbmRleCAhPT0gLTEpIHtcbiAgICAgICAga2V5cy5zcGxpY2UobWVzc2FnZUluZGV4LCAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMSAmJiBrZXlzWzBdID09PSAncmVxdWlyZWQnKSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0b3JzLnJlcXVpcmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbGlkYXRvcnNbdGhpcy5nZXRUeXBlKHJ1bGUpXSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBTY2hlbWE7XG59KCk7XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09IFN0YXRpYyA9PT09PT09PT09PT09PT09PT09PT09PT09XG5fZGVmaW5lUHJvcGVydHkoU2NoZW1hLCBcInJlZ2lzdGVyXCIsIGZ1bmN0aW9uIHJlZ2lzdGVyKHR5cGUsIHZhbGlkYXRvcikge1xuICBpZiAodHlwZW9mIHZhbGlkYXRvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlZ2lzdGVyIGEgdmFsaWRhdG9yIGJ5IHR5cGUsIHZhbGlkYXRvciBpcyBub3QgYSBmdW5jdGlvbicpO1xuICB9XG4gIHZhbGlkYXRvcnNbdHlwZV0gPSB2YWxpZGF0b3I7XG59KTtcbl9kZWZpbmVQcm9wZXJ0eShTY2hlbWEsIFwid2FybmluZ1wiLCB3YXJuaW5nKTtcbl9kZWZpbmVQcm9wZXJ0eShTY2hlbWEsIFwibWVzc2FnZXNcIiwgZGVmYXVsdE1lc3NhZ2VzKTtcbl9kZWZpbmVQcm9wZXJ0eShTY2hlbWEsIFwidmFsaWRhdG9yc1wiLCB2YWxpZGF0b3JzKTtcbmV4cG9ydCBkZWZhdWx0IFNjaGVtYTsiLCAiaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX3JlZ2VuZXJhdG9yUnVudGltZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vcmVnZW5lcmF0b3JSdW50aW1lXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9hc3luY1RvR2VuZXJhdG9yIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3luY1RvR2VuZXJhdG9yXCI7XG5pbXBvcnQgUmF3QXN5bmNWYWxpZGF0b3IgZnJvbSAnQHJjLWNvbXBvbmVudC9hc3luYy12YWxpZGF0b3InO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuaW1wb3J0IHsgZGVmYXVsdFZhbGlkYXRlTWVzc2FnZXMgfSBmcm9tIFwiLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHsgbWVyZ2UgfSBmcm9tIFwicmMtdXRpbC9lcy91dGlscy9zZXRcIjtcblxuLy8gUmVtb3ZlIGluY29ycmVjdCBvcmlnaW5hbCB0cyBkZWZpbmVcbnZhciBBc3luY1ZhbGlkYXRvciA9IFJhd0FzeW5jVmFsaWRhdG9yO1xuXG4vKipcbiAqIFJlcGxhY2Ugd2l0aCB0ZW1wbGF0ZS5cbiAqICAgYEknbSAke25hbWV9YCArIHsgbmFtZTogJ2JhbWJvbycgfSA9IEknbSBiYW1ib29cbiAqL1xuZnVuY3Rpb24gcmVwbGFjZU1lc3NhZ2UodGVtcGxhdGUsIGt2KSB7XG4gIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlKC9cXFxcP1xcJFxce1xcdytcXH0vZywgZnVuY3Rpb24gKHN0cikge1xuICAgIGlmIChzdHIuc3RhcnRzV2l0aCgnXFxcXCcpKSB7XG4gICAgICByZXR1cm4gc3RyLnNsaWNlKDEpO1xuICAgIH1cbiAgICB2YXIga2V5ID0gc3RyLnNsaWNlKDIsIC0xKTtcbiAgICByZXR1cm4ga3Zba2V5XTtcbiAgfSk7XG59XG52YXIgQ09ERV9MT0dJQ19FUlJPUiA9ICdDT0RFX0xPR0lDX0VSUk9SJztcbmZ1bmN0aW9uIHZhbGlkYXRlUnVsZShfeCwgX3gyLCBfeDMsIF94NCwgX3g1KSB7XG4gIHJldHVybiBfdmFsaWRhdGVSdWxlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG4vKipcbiAqIFdlIHVzZSBgYXN5bmMtdmFsaWRhdG9yYCB0byB2YWxpZGF0ZSB0aGUgdmFsdWUuXG4gKiBCdXQgb25seSBjaGVjayBvbmUgdmFsdWUgaW4gYSB0aW1lIHRvIGF2b2lkIG5hbWVQYXRoIHZhbGlkYXRlIGlzc3VlLlxuICovXG5mdW5jdGlvbiBfdmFsaWRhdGVSdWxlKCkge1xuICBfdmFsaWRhdGVSdWxlID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lKCkubWFyayhmdW5jdGlvbiBfY2FsbGVlMihuYW1lLCB2YWx1ZSwgcnVsZSwgb3B0aW9ucywgbWVzc2FnZVZhcmlhYmxlcykge1xuICAgIHZhciBjbG9uZVJ1bGUsIG9yaWdpblZhbGlkYXRvciwgc3ViUnVsZUZpZWxkLCB2YWxpZGF0b3IsIG1lc3NhZ2VzLCByZXN1bHQsIHN1YlJlc3VsdHMsIGt2LCBmaWxsVmFyaWFibGVSZXN1bHQ7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHtcbiAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGNsb25lUnVsZSA9IF9vYmplY3RTcHJlYWQoe30sIHJ1bGUpOyAvLyBCdWcgb2YgYGFzeW5jLXZhbGlkYXRvcmBcbiAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vcmVhY3QtY29tcG9uZW50L2ZpZWxkLWZvcm0vaXNzdWVzLzMxNlxuICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1jb21wb25lbnQvZmllbGQtZm9ybS9pc3N1ZXMvMzEzXG4gICAgICAgICAgZGVsZXRlIGNsb25lUnVsZS5ydWxlSW5kZXg7XG5cbiAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy80MDQ5NyNpc3N1ZWNvbW1lbnQtMTQyMjI4MjM3OFxuICAgICAgICAgIEFzeW5jVmFsaWRhdG9yLndhcm5pbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGNsb25lUnVsZS52YWxpZGF0b3IpIHtcbiAgICAgICAgICAgIG9yaWdpblZhbGlkYXRvciA9IGNsb25lUnVsZS52YWxpZGF0b3I7XG4gICAgICAgICAgICBjbG9uZVJ1bGUudmFsaWRhdG9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5WYWxpZGF0b3IuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChDT0RFX0xPR0lDX0VSUk9SKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBXZSBzaG91bGQgc3BlY2lhbCBoYW5kbGUgYXJyYXkgdmFsaWRhdGVcbiAgICAgICAgICBzdWJSdWxlRmllbGQgPSBudWxsO1xuICAgICAgICAgIGlmIChjbG9uZVJ1bGUgJiYgY2xvbmVSdWxlLnR5cGUgPT09ICdhcnJheScgJiYgY2xvbmVSdWxlLmRlZmF1bHRGaWVsZCkge1xuICAgICAgICAgICAgc3ViUnVsZUZpZWxkID0gY2xvbmVSdWxlLmRlZmF1bHRGaWVsZDtcbiAgICAgICAgICAgIGRlbGV0ZSBjbG9uZVJ1bGUuZGVmYXVsdEZpZWxkO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YWxpZGF0b3IgPSBuZXcgQXN5bmNWYWxpZGF0b3IoX2RlZmluZVByb3BlcnR5KHt9LCBuYW1lLCBbY2xvbmVSdWxlXSkpO1xuICAgICAgICAgIG1lc3NhZ2VzID0gbWVyZ2UoZGVmYXVsdFZhbGlkYXRlTWVzc2FnZXMsIG9wdGlvbnMudmFsaWRhdGVNZXNzYWdlcyk7XG4gICAgICAgICAgdmFsaWRhdG9yLm1lc3NhZ2VzKG1lc3NhZ2VzKTtcbiAgICAgICAgICByZXN1bHQgPSBbXTtcbiAgICAgICAgICBfY29udGV4dDIucHJldiA9IDEwO1xuICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTM7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWxpZGF0b3IudmFsaWRhdGUoX2RlZmluZVByb3BlcnR5KHt9LCBuYW1lLCB2YWx1ZSksIF9vYmplY3RTcHJlYWQoe30sIG9wdGlvbnMpKSk7XG4gICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxODtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICBfY29udGV4dDIucHJldiA9IDE1O1xuICAgICAgICAgIF9jb250ZXh0Mi50MCA9IF9jb250ZXh0MltcImNhdGNoXCJdKDEwKTtcbiAgICAgICAgICBpZiAoX2NvbnRleHQyLnQwLmVycm9ycykge1xuICAgICAgICAgICAgcmVzdWx0ID0gX2NvbnRleHQyLnQwLmVycm9ycy5tYXAoZnVuY3Rpb24gKF9yZWY0LCBpbmRleCkge1xuICAgICAgICAgICAgICB2YXIgbWVzc2FnZSA9IF9yZWY0Lm1lc3NhZ2U7XG4gICAgICAgICAgICAgIHZhciBtZXJnZWRNZXNzYWdlID0gbWVzc2FnZSA9PT0gQ09ERV9MT0dJQ19FUlJPUiA/IG1lc3NhZ2VzLmRlZmF1bHQgOiBtZXNzYWdlO1xuICAgICAgICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KG1lcmdlZE1lc3NhZ2UpID9cbiAgICAgICAgICAgICAgLyojX19QVVJFX18qL1xuICAgICAgICAgICAgICAvLyBXcmFwIFJlYWN0Tm9kZSB3aXRoIGBrZXlgXG4gICAgICAgICAgICAgIFJlYWN0LmNsb25lRWxlbWVudChtZXJnZWRNZXNzYWdlLCB7XG4gICAgICAgICAgICAgICAga2V5OiBcImVycm9yX1wiLmNvbmNhdChpbmRleClcbiAgICAgICAgICAgICAgfSkgOiBtZXJnZWRNZXNzYWdlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICBjYXNlIDE4OlxuICAgICAgICAgIGlmICghKCFyZXN1bHQubGVuZ3RoICYmIHN1YlJ1bGVGaWVsZCkpIHtcbiAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjM7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyMTtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwodmFsdWUubWFwKGZ1bmN0aW9uIChzdWJWYWx1ZSwgaSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlUnVsZShcIlwiLmNvbmNhdChuYW1lLCBcIi5cIikuY29uY2F0KGkpLCBzdWJWYWx1ZSwgc3ViUnVsZUZpZWxkLCBvcHRpb25zLCBtZXNzYWdlVmFyaWFibGVzKTtcbiAgICAgICAgICB9KSk7XG4gICAgICAgIGNhc2UgMjE6XG4gICAgICAgICAgc3ViUmVzdWx0cyA9IF9jb250ZXh0Mi5zZW50O1xuICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KFwicmV0dXJuXCIsIHN1YlJlc3VsdHMucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCBlcnJvcnMpIHtcbiAgICAgICAgICAgIHJldHVybiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHByZXYpLCBfdG9Db25zdW1hYmxlQXJyYXkoZXJyb3JzKSk7XG4gICAgICAgICAgfSwgW10pKTtcbiAgICAgICAgY2FzZSAyMzpcbiAgICAgICAgICAvLyBSZXBsYWNlIG1lc3NhZ2Ugd2l0aCB2YXJpYWJsZXNcbiAgICAgICAgICBrdiA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcnVsZSksIHt9LCB7XG4gICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgZW51bTogKHJ1bGUuZW51bSB8fCBbXSkuam9pbignLCAnKVxuICAgICAgICAgIH0sIG1lc3NhZ2VWYXJpYWJsZXMpO1xuICAgICAgICAgIGZpbGxWYXJpYWJsZVJlc3VsdCA9IHJlc3VsdC5tYXAoZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGVycm9yID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICByZXR1cm4gcmVwbGFjZU1lc3NhZ2UoZXJyb3IsIGt2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdChcInJldHVyblwiLCBmaWxsVmFyaWFibGVSZXN1bHQpO1xuICAgICAgICBjYXNlIDI2OlxuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTIsIG51bGwsIFtbMTAsIDE1XV0pO1xuICB9KSk7XG4gIHJldHVybiBfdmFsaWRhdGVSdWxlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVSdWxlcyhuYW1lUGF0aCwgdmFsdWUsIHJ1bGVzLCBvcHRpb25zLCB2YWxpZGF0ZUZpcnN0LCBtZXNzYWdlVmFyaWFibGVzKSB7XG4gIHZhciBuYW1lID0gbmFtZVBhdGguam9pbignLicpO1xuXG4gIC8vIEZpbGwgcnVsZSB3aXRoIGNvbnRleHRcbiAgdmFyIGZpbGxlZFJ1bGVzID0gcnVsZXMubWFwKGZ1bmN0aW9uIChjdXJyZW50UnVsZSwgcnVsZUluZGV4KSB7XG4gICAgdmFyIG9yaWdpblZhbGlkYXRvckZ1bmMgPSBjdXJyZW50UnVsZS52YWxpZGF0b3I7XG4gICAgdmFyIGNsb25lUnVsZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgY3VycmVudFJ1bGUpLCB7fSwge1xuICAgICAgcnVsZUluZGV4OiBydWxlSW5kZXhcbiAgICB9KTtcblxuICAgIC8vIFJlcGxhY2UgdmFsaWRhdG9yIGlmIG5lZWRlZFxuICAgIGlmIChvcmlnaW5WYWxpZGF0b3JGdW5jKSB7XG4gICAgICBjbG9uZVJ1bGUudmFsaWRhdG9yID0gZnVuY3Rpb24gKHJ1bGUsIHZhbCwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGhhc1Byb21pc2UgPSBmYWxzZTtcblxuICAgICAgICAvLyBXcmFwIGNhbGxiYWNrIG9ubHkgYWNjZXB0IHdoZW4gcHJvbWlzZSBub3QgcHJvdmlkZWRcbiAgICAgICAgdmFyIHdyYXBwZWRDYWxsYmFjayA9IGZ1bmN0aW9uIHdyYXBwZWRDYWxsYmFjaygpIHtcbiAgICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFdhaXQgYSB0aWNrIHRvIG1ha2Ugc3VyZSByZXR1cm4gdHlwZSBpcyBhIHByb21pc2VcbiAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHdhcm5pbmcoIWhhc1Byb21pc2UsICdZb3VyIHZhbGlkYXRvciBmdW5jdGlvbiBoYXMgYWxyZWFkeSByZXR1cm4gYSBwcm9taXNlLiBgY2FsbGJhY2tgIHdpbGwgYmUgaWdub3JlZC4nKTtcbiAgICAgICAgICAgIGlmICghaGFzUHJvbWlzZSkge1xuICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseSh2b2lkIDAsIGFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIEdldCBwcm9taXNlXG4gICAgICAgIHZhciBwcm9taXNlID0gb3JpZ2luVmFsaWRhdG9yRnVuYyhydWxlLCB2YWwsIHdyYXBwZWRDYWxsYmFjayk7XG4gICAgICAgIGhhc1Byb21pc2UgPSBwcm9taXNlICYmIHR5cGVvZiBwcm9taXNlLnRoZW4gPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHByb21pc2UuY2F0Y2ggPT09ICdmdW5jdGlvbic7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIDEuIFVzZSBwcm9taXNlIGFzIHRoZSBmaXJzdCBwcmlvcml0eS5cbiAgICAgICAgICogMi4gSWYgcHJvbWlzZSBub3QgZXhpc3QsIHVzZSBjYWxsYmFjayB3aXRoIHdhcm5pbmcgaW5zdGVhZFxuICAgICAgICAgKi9cbiAgICAgICAgd2FybmluZyhoYXNQcm9taXNlLCAnYGNhbGxiYWNrYCBpcyBkZXByZWNhdGVkLiBQbGVhc2UgcmV0dXJuIGEgcHJvbWlzZSBpbnN0ZWFkLicpO1xuICAgICAgICBpZiAoaGFzUHJvbWlzZSkge1xuICAgICAgICAgIHByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGVyciB8fCAnICcpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gY2xvbmVSdWxlO1xuICB9KS5zb3J0KGZ1bmN0aW9uIChfcmVmLCBfcmVmMikge1xuICAgIHZhciB3MSA9IF9yZWYud2FybmluZ09ubHksXG4gICAgICBpMSA9IF9yZWYucnVsZUluZGV4O1xuICAgIHZhciB3MiA9IF9yZWYyLndhcm5pbmdPbmx5LFxuICAgICAgaTIgPSBfcmVmMi5ydWxlSW5kZXg7XG4gICAgaWYgKCEhdzEgPT09ICEhdzIpIHtcbiAgICAgIC8vIExldCBrZWVwIG9yaWdpbiBvcmRlclxuICAgICAgcmV0dXJuIGkxIC0gaTI7XG4gICAgfVxuICAgIGlmICh3MSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfSk7XG5cbiAgLy8gRG8gdmFsaWRhdGUgcnVsZXNcbiAgdmFyIHN1bW1hcnlQcm9taXNlO1xuICBpZiAodmFsaWRhdGVGaXJzdCA9PT0gdHJ1ZSkge1xuICAgIC8vID4+Pj4+IFZhbGlkYXRlIGJ5IHNlcmlhbGl6YXRpb25cbiAgICBzdW1tYXJ5UHJvbWlzZSA9IG5ldyBQcm9taXNlKCAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9yZWYzID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lKCkubWFyayhmdW5jdGlvbiBfY2FsbGVlKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgaSwgcnVsZSwgZXJyb3JzO1xuICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZSgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICBpID0gMDtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgaWYgKCEoaSA8IGZpbGxlZFJ1bGVzLmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcnVsZSA9IGZpbGxlZFJ1bGVzW2ldO1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNTtcbiAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlUnVsZShuYW1lLCB2YWx1ZSwgcnVsZSwgb3B0aW9ucywgbWVzc2FnZVZhcmlhYmxlcyk7XG4gICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgIGVycm9ycyA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgICAgIGlmICghZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA5O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJlamVjdChbe1xuICAgICAgICAgICAgICAgIGVycm9yczogZXJyb3JzLFxuICAgICAgICAgICAgICAgIHJ1bGU6IHJ1bGVcbiAgICAgICAgICAgICAgfV0pO1xuICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIpO1xuICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgKi9cblxuICAgICAgICAgICAgICByZXNvbHZlKFtdKTtcbiAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBfY2FsbGVlKTtcbiAgICAgIH0pKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoX3g2LCBfeDcpIHtcbiAgICAgICAgcmV0dXJuIF9yZWYzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgIH0oKSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gPj4+Pj4gVmFsaWRhdGUgYnkgcGFyYWxsZWxcbiAgICB2YXIgcnVsZVByb21pc2VzID0gZmlsbGVkUnVsZXMubWFwKGZ1bmN0aW9uIChydWxlKSB7XG4gICAgICByZXR1cm4gdmFsaWRhdGVSdWxlKG5hbWUsIHZhbHVlLCBydWxlLCBvcHRpb25zLCBtZXNzYWdlVmFyaWFibGVzKS50aGVuKGZ1bmN0aW9uIChlcnJvcnMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcnM6IGVycm9ycyxcbiAgICAgICAgICBydWxlOiBydWxlXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBzdW1tYXJ5UHJvbWlzZSA9ICh2YWxpZGF0ZUZpcnN0ID8gZmluaXNoT25GaXJzdEZhaWxlZChydWxlUHJvbWlzZXMpIDogZmluaXNoT25BbGxGYWlsZWQocnVsZVByb21pc2VzKSkudGhlbihmdW5jdGlvbiAoZXJyb3JzKSB7XG4gICAgICAvLyBBbHdheXMgY2hhbmdlIHRvIHJlamVjdGlvbiBmb3IgRmllbGQgdG8gY2F0Y2hcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcnMpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gSW50ZXJuYWwgY2F0Y2ggZXJyb3IgdG8gYXZvaWQgY29uc29sZSBlcnJvciBsb2cuXG4gIHN1bW1hcnlQcm9taXNlLmNhdGNoKGZ1bmN0aW9uIChlKSB7XG4gICAgcmV0dXJuIGU7XG4gIH0pO1xuICByZXR1cm4gc3VtbWFyeVByb21pc2U7XG59XG5mdW5jdGlvbiBmaW5pc2hPbkFsbEZhaWxlZChfeDgpIHtcbiAgcmV0dXJuIF9maW5pc2hPbkFsbEZhaWxlZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuZnVuY3Rpb24gX2ZpbmlzaE9uQWxsRmFpbGVkKCkge1xuICBfZmluaXNoT25BbGxGYWlsZWQgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUzKHJ1bGVQcm9taXNlcykge1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lKCkud3JhcChmdW5jdGlvbiBfY2FsbGVlMyQoX2NvbnRleHQzKSB7XG4gICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDMucHJldiA9IF9jb250ZXh0My5uZXh0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLmFicnVwdChcInJldHVyblwiLCBQcm9taXNlLmFsbChydWxlUHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24gKGVycm9yc0xpc3QpIHtcbiAgICAgICAgICAgIHZhciBfcmVmNTtcbiAgICAgICAgICAgIHZhciBlcnJvcnMgPSAoX3JlZjUgPSBbXSkuY29uY2F0LmFwcGx5KF9yZWY1LCBfdG9Db25zdW1hYmxlQXJyYXkoZXJyb3JzTGlzdCkpO1xuICAgICAgICAgICAgcmV0dXJuIGVycm9ycztcbiAgICAgICAgICB9KSk7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dDMuc3RvcCgpO1xuICAgICAgfVxuICAgIH0sIF9jYWxsZWUzKTtcbiAgfSkpO1xuICByZXR1cm4gX2ZpbmlzaE9uQWxsRmFpbGVkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5mdW5jdGlvbiBmaW5pc2hPbkZpcnN0RmFpbGVkKF94OSkge1xuICByZXR1cm4gX2ZpbmlzaE9uRmlyc3RGYWlsZWQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmZ1bmN0aW9uIF9maW5pc2hPbkZpcnN0RmFpbGVkKCkge1xuICBfZmluaXNoT25GaXJzdEZhaWxlZCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZSgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTQocnVsZVByb21pc2VzKSB7XG4gICAgdmFyIGNvdW50O1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lKCkud3JhcChmdW5jdGlvbiBfY2FsbGVlNCQoX2NvbnRleHQ0KSB7XG4gICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDQucHJldiA9IF9jb250ZXh0NC5uZXh0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBjb3VudCA9IDA7XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5hYnJ1cHQoXCJyZXR1cm5cIiwgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgIHJ1bGVQcm9taXNlcy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgICAgICAgIHByb21pc2UudGhlbihmdW5jdGlvbiAocnVsZUVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJ1bGVFcnJvci5lcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICByZXNvbHZlKFtydWxlRXJyb3JdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY291bnQgKz0gMTtcbiAgICAgICAgICAgICAgICBpZiAoY291bnQgPT09IHJ1bGVQcm9taXNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgIHJlc29sdmUoW10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KSk7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dDQuc3RvcCgpO1xuICAgICAgfVxuICAgIH0sIF9jYWxsZWU0KTtcbiAgfSkpO1xuICByZXR1cm4gX2ZpbmlzaE9uRmlyc3RGYWlsZWQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn0iLCAidmFyIHR5cGVUZW1wbGF0ZSA9IFwiJyR7bmFtZX0nIGlzIG5vdCBhIHZhbGlkICR7dHlwZX1cIjtcbmV4cG9ydCB2YXIgZGVmYXVsdFZhbGlkYXRlTWVzc2FnZXMgPSB7XG4gIGRlZmF1bHQ6IFwiVmFsaWRhdGlvbiBlcnJvciBvbiBmaWVsZCAnJHtuYW1lfSdcIixcbiAgcmVxdWlyZWQ6IFwiJyR7bmFtZX0nIGlzIHJlcXVpcmVkXCIsXG4gIGVudW06IFwiJyR7bmFtZX0nIG11c3QgYmUgb25lIG9mIFske2VudW19XVwiLFxuICB3aGl0ZXNwYWNlOiBcIicke25hbWV9JyBjYW5ub3QgYmUgZW1wdHlcIixcbiAgZGF0ZToge1xuICAgIGZvcm1hdDogXCInJHtuYW1lfScgaXMgaW52YWxpZCBmb3IgZm9ybWF0IGRhdGVcIixcbiAgICBwYXJzZTogXCInJHtuYW1lfScgY291bGQgbm90IGJlIHBhcnNlZCBhcyBkYXRlXCIsXG4gICAgaW52YWxpZDogXCInJHtuYW1lfScgaXMgaW52YWxpZCBkYXRlXCJcbiAgfSxcbiAgdHlwZXM6IHtcbiAgICBzdHJpbmc6IHR5cGVUZW1wbGF0ZSxcbiAgICBtZXRob2Q6IHR5cGVUZW1wbGF0ZSxcbiAgICBhcnJheTogdHlwZVRlbXBsYXRlLFxuICAgIG9iamVjdDogdHlwZVRlbXBsYXRlLFxuICAgIG51bWJlcjogdHlwZVRlbXBsYXRlLFxuICAgIGRhdGU6IHR5cGVUZW1wbGF0ZSxcbiAgICBib29sZWFuOiB0eXBlVGVtcGxhdGUsXG4gICAgaW50ZWdlcjogdHlwZVRlbXBsYXRlLFxuICAgIGZsb2F0OiB0eXBlVGVtcGxhdGUsXG4gICAgcmVnZXhwOiB0eXBlVGVtcGxhdGUsXG4gICAgZW1haWw6IHR5cGVUZW1wbGF0ZSxcbiAgICB1cmw6IHR5cGVUZW1wbGF0ZSxcbiAgICBoZXg6IHR5cGVUZW1wbGF0ZVxuICB9LFxuICBzdHJpbmc6IHtcbiAgICBsZW46IFwiJyR7bmFtZX0nIG11c3QgYmUgZXhhY3RseSAke2xlbn0gY2hhcmFjdGVyc1wiLFxuICAgIG1pbjogXCInJHtuYW1lfScgbXVzdCBiZSBhdCBsZWFzdCAke21pbn0gY2hhcmFjdGVyc1wiLFxuICAgIG1heDogXCInJHtuYW1lfScgY2Fubm90IGJlIGxvbmdlciB0aGFuICR7bWF4fSBjaGFyYWN0ZXJzXCIsXG4gICAgcmFuZ2U6IFwiJyR7bmFtZX0nIG11c3QgYmUgYmV0d2VlbiAke21pbn0gYW5kICR7bWF4fSBjaGFyYWN0ZXJzXCJcbiAgfSxcbiAgbnVtYmVyOiB7XG4gICAgbGVuOiBcIicke25hbWV9JyBtdXN0IGVxdWFsICR7bGVufVwiLFxuICAgIG1pbjogXCInJHtuYW1lfScgY2Fubm90IGJlIGxlc3MgdGhhbiAke21pbn1cIixcbiAgICBtYXg6IFwiJyR7bmFtZX0nIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gJHttYXh9XCIsXG4gICAgcmFuZ2U6IFwiJyR7bmFtZX0nIG11c3QgYmUgYmV0d2VlbiAke21pbn0gYW5kICR7bWF4fVwiXG4gIH0sXG4gIGFycmF5OiB7XG4gICAgbGVuOiBcIicke25hbWV9JyBtdXN0IGJlIGV4YWN0bHkgJHtsZW59IGluIGxlbmd0aFwiLFxuICAgIG1pbjogXCInJHtuYW1lfScgY2Fubm90IGJlIGxlc3MgdGhhbiAke21pbn0gaW4gbGVuZ3RoXCIsXG4gICAgbWF4OiBcIicke25hbWV9JyBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuICR7bWF4fSBpbiBsZW5ndGhcIixcbiAgICByYW5nZTogXCInJHtuYW1lfScgbXVzdCBiZSBiZXR3ZWVuICR7bWlufSBhbmQgJHttYXh9IGluIGxlbmd0aFwiXG4gIH0sXG4gIHBhdHRlcm46IHtcbiAgICBtaXNtYXRjaDogXCInJHtuYW1lfScgZG9lcyBub3QgbWF0Y2ggcGF0dGVybiAke3BhdHRlcm59XCJcbiAgfVxufTsiLCAiaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCBnZXRWYWx1ZSBmcm9tIFwicmMtdXRpbC9lcy91dGlscy9nZXRcIjtcbmltcG9ydCBzZXRWYWx1ZSBmcm9tIFwicmMtdXRpbC9lcy91dGlscy9zZXRcIjtcbmltcG9ydCB7IHRvQXJyYXkgfSBmcm9tIFwiLi90eXBlVXRpbFwiO1xuZXhwb3J0IHsgZ2V0VmFsdWUsIHNldFZhbHVlIH07XG5cbi8qKlxuICogQ29udmVydCBuYW1lIHRvIGludGVybmFsIHN1cHBvcnRlZCBmb3JtYXQuXG4gKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBrZWVwIHNpbmNlIHdlIHN0aWxsIHRoaW5raW5nIGlmIG5lZWQgc3VwcG9ydCBsaWtlIGBhLmIuY2AgZm9ybWF0LlxuICogJ2EnID0+IFsnYSddXG4gKiAxMjMgPT4gWzEyM11cbiAqIFsnYScsIDEyM10gPT4gWydhJywgMTIzXVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZVBhdGgocGF0aCkge1xuICByZXR1cm4gdG9BcnJheShwYXRoKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZUJ5TmFtZVBhdGhMaXN0KHN0b3JlLCBuYW1lUGF0aExpc3QpIHtcbiAgdmFyIG5ld1N0b3JlID0ge307XG4gIG5hbWVQYXRoTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lUGF0aCkge1xuICAgIHZhciB2YWx1ZSA9IGdldFZhbHVlKHN0b3JlLCBuYW1lUGF0aCk7XG4gICAgbmV3U3RvcmUgPSBzZXRWYWx1ZShuZXdTdG9yZSwgbmFtZVBhdGgsIHZhbHVlKTtcbiAgfSk7XG4gIHJldHVybiBuZXdTdG9yZTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBgbmFtZVBhdGhMaXN0YCBpbmNsdWRlcyBgbmFtZVBhdGhgLlxuICogQHBhcmFtIG5hbWVQYXRoTGlzdCBBIGxpc3Qgb2YgYEludGVybmFsTmFtZVBhdGhbXWBcbiAqIEBwYXJhbSBuYW1lUGF0aCBDb21wYXJlIGBJbnRlcm5hbE5hbWVQYXRoYFxuICogQHBhcmFtIHBhcnRpYWxNYXRjaCBUcnVlIHdpbGwgbWFrZSBgW2EsIGJdYCBtYXRjaCBgW2EsIGIsIGNdYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udGFpbnNOYW1lUGF0aChuYW1lUGF0aExpc3QsIG5hbWVQYXRoKSB7XG4gIHZhciBwYXJ0aWFsTWF0Y2ggPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZhbHNlO1xuICByZXR1cm4gbmFtZVBhdGhMaXN0ICYmIG5hbWVQYXRoTGlzdC5zb21lKGZ1bmN0aW9uIChwYXRoKSB7XG4gICAgcmV0dXJuIG1hdGNoTmFtZVBhdGgobmFtZVBhdGgsIHBhdGgsIHBhcnRpYWxNYXRjaCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGBuYW1lUGF0aGAgaXMgc3VwZXIgc2V0IG9yIGVxdWFsIG9mIGBzdWJOYW1lUGF0aGAuXG4gKiBAcGFyYW0gbmFtZVBhdGggQSBsaXN0IG9mIGBJbnRlcm5hbE5hbWVQYXRoW11gXG4gKiBAcGFyYW0gc3ViTmFtZVBhdGggQ29tcGFyZSBgSW50ZXJuYWxOYW1lUGF0aGBcbiAqIEBwYXJhbSBwYXJ0aWFsTWF0Y2ggVHJ1ZSB3aWxsIG1ha2UgYFthLCBiXWAgbWF0Y2ggYFthLCBiLCBjXWBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoTmFtZVBhdGgobmFtZVBhdGgsIHN1Yk5hbWVQYXRoKSB7XG4gIHZhciBwYXJ0aWFsTWF0Y2ggPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZhbHNlO1xuICBpZiAoIW5hbWVQYXRoIHx8ICFzdWJOYW1lUGF0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoIXBhcnRpYWxNYXRjaCAmJiBuYW1lUGF0aC5sZW5ndGggIT09IHN1Yk5hbWVQYXRoLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gc3ViTmFtZVBhdGguZXZlcnkoZnVuY3Rpb24gKG5hbWVVbml0LCBpKSB7XG4gICAgcmV0dXJuIG5hbWVQYXRoW2ldID09PSBuYW1lVW5pdDtcbiAgfSk7XG59XG5cbi8vIExpa2UgYHNoYWxsb3dFcXVhbGAsIGJ1dCB3ZSBub3QgY2hlY2sgdGhlIGRhdGEgd2hpY2ggbWF5IGNhdXNlIHJlLXJlbmRlclxuXG5leHBvcnQgZnVuY3Rpb24gaXNTaW1pbGFyKHNvdXJjZSwgdGFyZ2V0KSB7XG4gIGlmIChzb3VyY2UgPT09IHRhcmdldCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICghc291cmNlICYmIHRhcmdldCB8fCBzb3VyY2UgJiYgIXRhcmdldCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoIXNvdXJjZSB8fCAhdGFyZ2V0IHx8IF90eXBlb2Yoc291cmNlKSAhPT0gJ29iamVjdCcgfHwgX3R5cGVvZih0YXJnZXQpICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG4gIHZhciB0YXJnZXRLZXlzID0gT2JqZWN0LmtleXModGFyZ2V0KTtcbiAgdmFyIGtleXMgPSBuZXcgU2V0KFtdLmNvbmNhdChzb3VyY2VLZXlzLCB0YXJnZXRLZXlzKSk7XG4gIHJldHVybiBfdG9Db25zdW1hYmxlQXJyYXkoa2V5cykuZXZlcnkoZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciBzb3VyY2VWYWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgIHZhciB0YXJnZXRWYWx1ZSA9IHRhcmdldFtrZXldO1xuICAgIGlmICh0eXBlb2Ygc291cmNlVmFsdWUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHRhcmdldFZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHNvdXJjZVZhbHVlID09PSB0YXJnZXRWYWx1ZTtcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdEdldFZhbHVlRnJvbUV2ZW50KHZhbHVlUHJvcE5hbWUpIHtcbiAgdmFyIGV2ZW50ID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxID8gdW5kZWZpbmVkIDogYXJndW1lbnRzWzFdO1xuICBpZiAoZXZlbnQgJiYgZXZlbnQudGFyZ2V0ICYmIF90eXBlb2YoZXZlbnQudGFyZ2V0KSA9PT0gJ29iamVjdCcgJiYgdmFsdWVQcm9wTmFtZSBpbiBldmVudC50YXJnZXQpIHtcbiAgICByZXR1cm4gZXZlbnQudGFyZ2V0W3ZhbHVlUHJvcE5hbWVdO1xuICB9XG4gIHJldHVybiBldmVudDtcbn1cblxuLyoqXG4gKiBNb3ZlcyBhbiBhcnJheSBpdGVtIGZyb20gb25lIHBvc2l0aW9uIGluIGFuIGFycmF5IHRvIGFub3RoZXIuXG4gKlxuICogTm90ZTogVGhpcyBpcyBhIHB1cmUgZnVuY3Rpb24gc28gYSBuZXcgYXJyYXkgd2lsbCBiZSByZXR1cm5lZCwgaW5zdGVhZFxuICogb2YgYWx0ZXJpbmcgdGhlIGFycmF5IGFyZ3VtZW50LlxuICpcbiAqIEBwYXJhbSBhcnJheSAgICAgICAgIEFycmF5IGluIHdoaWNoIHRvIG1vdmUgYW4gaXRlbS4gICAgICAgICAocmVxdWlyZWQpXG4gKiBAcGFyYW0gbW92ZUluZGV4ICAgICBUaGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gbW92ZS4gICAgICAgICAgKHJlcXVpcmVkKVxuICogQHBhcmFtIHRvSW5kZXggICAgICAgVGhlIGluZGV4IHRvIG1vdmUgaXRlbSBhdCBtb3ZlSW5kZXggdG8uIChyZXF1aXJlZClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vdmUoYXJyYXksIG1vdmVJbmRleCwgdG9JbmRleCkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICBpZiAobW92ZUluZGV4IDwgMCB8fCBtb3ZlSW5kZXggPj0gbGVuZ3RoIHx8IHRvSW5kZXggPCAwIHx8IHRvSW5kZXggPj0gbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG4gIHZhciBpdGVtID0gYXJyYXlbbW92ZUluZGV4XTtcbiAgdmFyIGRpZmYgPSBtb3ZlSW5kZXggLSB0b0luZGV4O1xuICBpZiAoZGlmZiA+IDApIHtcbiAgICAvLyBtb3ZlIGxlZnRcbiAgICByZXR1cm4gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShhcnJheS5zbGljZSgwLCB0b0luZGV4KSksIFtpdGVtXSwgX3RvQ29uc3VtYWJsZUFycmF5KGFycmF5LnNsaWNlKHRvSW5kZXgsIG1vdmVJbmRleCkpLCBfdG9Db25zdW1hYmxlQXJyYXkoYXJyYXkuc2xpY2UobW92ZUluZGV4ICsgMSwgbGVuZ3RoKSkpO1xuICB9XG4gIGlmIChkaWZmIDwgMCkge1xuICAgIC8vIG1vdmUgcmlnaHRcbiAgICByZXR1cm4gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShhcnJheS5zbGljZSgwLCBtb3ZlSW5kZXgpKSwgX3RvQ29uc3VtYWJsZUFycmF5KGFycmF5LnNsaWNlKG1vdmVJbmRleCArIDEsIHRvSW5kZXggKyAxKSksIFtpdGVtXSwgX3RvQ29uc3VtYWJsZUFycmF5KGFycmF5LnNsaWNlKHRvSW5kZXggKyAxLCBsZW5ndGgpKSk7XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufSIsICJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB3YXJuaW5nIGZyb20gXCJyYy11dGlsL2VzL3dhcm5pbmdcIjtcbmltcG9ydCBGaWVsZENvbnRleHQgZnJvbSBcIi4vRmllbGRDb250ZXh0XCI7XG5pbXBvcnQgRmllbGQgZnJvbSBcIi4vRmllbGRcIjtcbmltcG9ydCB7IG1vdmUgYXMgX21vdmUsIGdldE5hbWVQYXRoIH0gZnJvbSBcIi4vdXRpbHMvdmFsdWVVdGlsXCI7XG5pbXBvcnQgTGlzdENvbnRleHQgZnJvbSBcIi4vTGlzdENvbnRleHRcIjtcbmZ1bmN0aW9uIExpc3QoX3JlZikge1xuICB2YXIgbmFtZSA9IF9yZWYubmFtZSxcbiAgICBpbml0aWFsVmFsdWUgPSBfcmVmLmluaXRpYWxWYWx1ZSxcbiAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgcnVsZXMgPSBfcmVmLnJ1bGVzLFxuICAgIHZhbGlkYXRlVHJpZ2dlciA9IF9yZWYudmFsaWRhdGVUcmlnZ2VyLFxuICAgIGlzTGlzdEZpZWxkID0gX3JlZi5pc0xpc3RGaWVsZDtcbiAgdmFyIGNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KEZpZWxkQ29udGV4dCk7XG4gIHZhciB3cmFwcGVyTGlzdENvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KExpc3RDb250ZXh0KTtcbiAgdmFyIGtleVJlZiA9IFJlYWN0LnVzZVJlZih7XG4gICAga2V5czogW10sXG4gICAgaWQ6IDBcbiAgfSk7XG4gIHZhciBrZXlNYW5hZ2VyID0ga2V5UmVmLmN1cnJlbnQ7XG4gIHZhciBwcmVmaXhOYW1lID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHBhcmVudFByZWZpeE5hbWUgPSBnZXROYW1lUGF0aChjb250ZXh0LnByZWZpeE5hbWUpIHx8IFtdO1xuICAgIHJldHVybiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHBhcmVudFByZWZpeE5hbWUpLCBfdG9Db25zdW1hYmxlQXJyYXkoZ2V0TmFtZVBhdGgobmFtZSkpKTtcbiAgfSwgW2NvbnRleHQucHJlZml4TmFtZSwgbmFtZV0pO1xuICB2YXIgZmllbGRDb250ZXh0ID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgY29udGV4dCksIHt9LCB7XG4gICAgICBwcmVmaXhOYW1lOiBwcmVmaXhOYW1lXG4gICAgfSk7XG4gIH0sIFtjb250ZXh0LCBwcmVmaXhOYW1lXSk7XG5cbiAgLy8gTGlzdCBjb250ZXh0XG4gIHZhciBsaXN0Q29udGV4dCA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBnZXRLZXk6IGZ1bmN0aW9uIGdldEtleShuYW1lUGF0aCkge1xuICAgICAgICB2YXIgbGVuID0gcHJlZml4TmFtZS5sZW5ndGg7XG4gICAgICAgIHZhciBwYXRoTmFtZSA9IG5hbWVQYXRoW2xlbl07XG4gICAgICAgIHJldHVybiBba2V5TWFuYWdlci5rZXlzW3BhdGhOYW1lXSwgbmFtZVBhdGguc2xpY2UobGVuICsgMSldO1xuICAgICAgfVxuICAgIH07XG4gIH0sIFtwcmVmaXhOYW1lXSk7XG5cbiAgLy8gVXNlciBzaG91bGQgbm90IHBhc3MgYGNoaWxkcmVuYCBhcyBvdGhlciB0eXBlLlxuICBpZiAodHlwZW9mIGNoaWxkcmVuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgd2FybmluZyhmYWxzZSwgJ0Zvcm0uTGlzdCBvbmx5IGFjY2VwdHMgZnVuY3Rpb24gYXMgY2hpbGRyZW4uJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIHNob3VsZFVwZGF0ZSA9IGZ1bmN0aW9uIHNob3VsZFVwZGF0ZShwcmV2VmFsdWUsIG5leHRWYWx1ZSwgX3JlZjIpIHtcbiAgICB2YXIgc291cmNlID0gX3JlZjIuc291cmNlO1xuICAgIGlmIChzb3VyY2UgPT09ICdpbnRlcm5hbCcpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHByZXZWYWx1ZSAhPT0gbmV4dFZhbHVlO1xuICB9O1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTGlzdENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogbGlzdENvbnRleHRcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRmllbGRDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IGZpZWxkQ29udGV4dFxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGaWVsZCwge1xuICAgIG5hbWU6IFtdLFxuICAgIHNob3VsZFVwZGF0ZTogc2hvdWxkVXBkYXRlLFxuICAgIHJ1bGVzOiBydWxlcyxcbiAgICB2YWxpZGF0ZVRyaWdnZXI6IHZhbGlkYXRlVHJpZ2dlcixcbiAgICBpbml0aWFsVmFsdWU6IGluaXRpYWxWYWx1ZSxcbiAgICBpc0xpc3Q6IHRydWUsXG4gICAgaXNMaXN0RmllbGQ6IGlzTGlzdEZpZWxkICE9PSBudWxsICYmIGlzTGlzdEZpZWxkICE9PSB2b2lkIDAgPyBpc0xpc3RGaWVsZCA6ICEhd3JhcHBlckxpc3RDb250ZXh0XG4gIH0sIGZ1bmN0aW9uIChfcmVmMywgbWV0YSkge1xuICAgIHZhciBfcmVmMyR2YWx1ZSA9IF9yZWYzLnZhbHVlLFxuICAgICAgdmFsdWUgPSBfcmVmMyR2YWx1ZSA9PT0gdm9pZCAwID8gW10gOiBfcmVmMyR2YWx1ZSxcbiAgICAgIG9uQ2hhbmdlID0gX3JlZjMub25DaGFuZ2U7XG4gICAgdmFyIGdldEZpZWxkVmFsdWUgPSBjb250ZXh0LmdldEZpZWxkVmFsdWU7XG4gICAgdmFyIGdldE5ld1ZhbHVlID0gZnVuY3Rpb24gZ2V0TmV3VmFsdWUoKSB7XG4gICAgICB2YXIgdmFsdWVzID0gZ2V0RmllbGRWYWx1ZShwcmVmaXhOYW1lIHx8IFtdKTtcbiAgICAgIHJldHVybiB2YWx1ZXMgfHwgW107XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBbHdheXMgZ2V0IGxhdGVzdCB2YWx1ZSBpbiBjYXNlIHVzZXIgdXBkYXRlIGZpZWxkcyBieSBgZm9ybWAgYXBpLlxuICAgICAqL1xuICAgIHZhciBvcGVyYXRpb25zID0ge1xuICAgICAgYWRkOiBmdW5jdGlvbiBhZGQoZGVmYXVsdFZhbHVlLCBpbmRleCkge1xuICAgICAgICAvLyBNYXBwaW5nIGtleXNcbiAgICAgICAgdmFyIG5ld1ZhbHVlID0gZ2V0TmV3VmFsdWUoKTtcbiAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPD0gbmV3VmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAga2V5TWFuYWdlci5rZXlzID0gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShrZXlNYW5hZ2VyLmtleXMuc2xpY2UoMCwgaW5kZXgpKSwgW2tleU1hbmFnZXIuaWRdLCBfdG9Db25zdW1hYmxlQXJyYXkoa2V5TWFuYWdlci5rZXlzLnNsaWNlKGluZGV4KSkpO1xuICAgICAgICAgIG9uQ2hhbmdlKFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkobmV3VmFsdWUuc2xpY2UoMCwgaW5kZXgpKSwgW2RlZmF1bHRWYWx1ZV0sIF90b0NvbnN1bWFibGVBcnJheShuZXdWYWx1ZS5zbGljZShpbmRleCkpKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgKGluZGV4IDwgMCB8fCBpbmRleCA+IG5ld1ZhbHVlLmxlbmd0aCkpIHtcbiAgICAgICAgICAgIHdhcm5pbmcoZmFsc2UsICdUaGUgc2Vjb25kIHBhcmFtZXRlciBvZiB0aGUgYWRkIGZ1bmN0aW9uIHNob3VsZCBiZSBhIHZhbGlkIHBvc2l0aXZlIG51bWJlci4nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAga2V5TWFuYWdlci5rZXlzID0gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShrZXlNYW5hZ2VyLmtleXMpLCBba2V5TWFuYWdlci5pZF0pO1xuICAgICAgICAgIG9uQ2hhbmdlKFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkobmV3VmFsdWUpLCBbZGVmYXVsdFZhbHVlXSkpO1xuICAgICAgICB9XG4gICAgICAgIGtleU1hbmFnZXIuaWQgKz0gMTtcbiAgICAgIH0sXG4gICAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZShpbmRleCkge1xuICAgICAgICB2YXIgbmV3VmFsdWUgPSBnZXROZXdWYWx1ZSgpO1xuICAgICAgICB2YXIgaW5kZXhTZXQgPSBuZXcgU2V0KEFycmF5LmlzQXJyYXkoaW5kZXgpID8gaW5kZXggOiBbaW5kZXhdKTtcbiAgICAgICAgaWYgKGluZGV4U2V0LnNpemUgPD0gMCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBrZXlNYW5hZ2VyLmtleXMgPSBrZXlNYW5hZ2VyLmtleXMuZmlsdGVyKGZ1bmN0aW9uIChfLCBrZXlzSW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4gIWluZGV4U2V0LmhhcyhrZXlzSW5kZXgpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBUcmlnZ2VyIHN0b3JlIGNoYW5nZVxuICAgICAgICBvbkNoYW5nZShuZXdWYWx1ZS5maWx0ZXIoZnVuY3Rpb24gKF8sIHZhbHVlSW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4gIWluZGV4U2V0Lmhhcyh2YWx1ZUluZGV4KTtcbiAgICAgICAgfSkpO1xuICAgICAgfSxcbiAgICAgIG1vdmU6IGZ1bmN0aW9uIG1vdmUoZnJvbSwgdG8pIHtcbiAgICAgICAgaWYgKGZyb20gPT09IHRvKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBuZXdWYWx1ZSA9IGdldE5ld1ZhbHVlKCk7XG5cbiAgICAgICAgLy8gRG8gbm90IGhhbmRsZSBvdXQgb2YgcmFuZ2VcbiAgICAgICAgaWYgKGZyb20gPCAwIHx8IGZyb20gPj0gbmV3VmFsdWUubGVuZ3RoIHx8IHRvIDwgMCB8fCB0byA+PSBuZXdWYWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAga2V5TWFuYWdlci5rZXlzID0gX21vdmUoa2V5TWFuYWdlci5rZXlzLCBmcm9tLCB0byk7XG5cbiAgICAgICAgLy8gVHJpZ2dlciBzdG9yZSBjaGFuZ2VcbiAgICAgICAgb25DaGFuZ2UoX21vdmUobmV3VmFsdWUsIGZyb20sIHRvKSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgbGlzdFZhbHVlID0gdmFsdWUgfHwgW107XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGxpc3RWYWx1ZSkpIHtcbiAgICAgIGxpc3RWYWx1ZSA9IFtdO1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgd2FybmluZyhmYWxzZSwgXCJDdXJyZW50IHZhbHVlIG9mICdcIi5jb25jYXQocHJlZml4TmFtZS5qb2luKCcgPiAnKSwgXCInIGlzIG5vdCBhbiBhcnJheSB0eXBlLlwiKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjaGlsZHJlbihsaXN0VmFsdWUubWFwKGZ1bmN0aW9uIChfXywgaW5kZXgpIHtcbiAgICAgIHZhciBrZXkgPSBrZXlNYW5hZ2VyLmtleXNbaW5kZXhdO1xuICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGtleU1hbmFnZXIua2V5c1tpbmRleF0gPSBrZXlNYW5hZ2VyLmlkO1xuICAgICAgICBrZXkgPSBrZXlNYW5hZ2VyLmtleXNbaW5kZXhdO1xuICAgICAgICBrZXlNYW5hZ2VyLmlkICs9IDE7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBpbmRleCxcbiAgICAgICAga2V5OiBrZXksXG4gICAgICAgIGlzTGlzdEZpZWxkOiB0cnVlXG4gICAgICB9O1xuICAgIH0pLCBvcGVyYXRpb25zLCBtZXRhKTtcbiAgfSkpKTtcbn1cbmV4cG9ydCBkZWZhdWx0IExpc3Q7IiwgImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xudmFyIF9leGNsdWRlZCA9IFtcIm5hbWVcIl07XG5pbXBvcnQgeyBtZXJnZSB9IGZyb20gXCJyYy11dGlsL2VzL3V0aWxzL3NldFwiO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgSE9PS19NQVJLIH0gZnJvbSBcIi4vRmllbGRDb250ZXh0XCI7XG5pbXBvcnQgeyBhbGxQcm9taXNlRmluaXNoIH0gZnJvbSBcIi4vdXRpbHMvYXN5bmNVdGlsXCI7XG5pbXBvcnQgeyBkZWZhdWx0VmFsaWRhdGVNZXNzYWdlcyB9IGZyb20gXCIuL3V0aWxzL21lc3NhZ2VzXCI7XG5pbXBvcnQgTmFtZU1hcCBmcm9tIFwiLi91dGlscy9OYW1lTWFwXCI7XG5pbXBvcnQgeyBjbG9uZUJ5TmFtZVBhdGhMaXN0LCBjb250YWluc05hbWVQYXRoLCBnZXROYW1lUGF0aCwgZ2V0VmFsdWUsIG1hdGNoTmFtZVBhdGgsIHNldFZhbHVlIH0gZnJvbSBcIi4vdXRpbHMvdmFsdWVVdGlsXCI7XG5leHBvcnQgdmFyIEZvcm1TdG9yZSA9IC8qI19fUFVSRV9fKi9fY3JlYXRlQ2xhc3MoZnVuY3Rpb24gRm9ybVN0b3JlKGZvcmNlUm9vdFVwZGF0ZSkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRm9ybVN0b3JlKTtcbiAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiZm9ybUhvb2tlZFwiLCBmYWxzZSk7XG4gIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImZvcmNlUm9vdFVwZGF0ZVwiLCB2b2lkIDApO1xuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJzdWJzY3JpYmFibGVcIiwgdHJ1ZSk7XG4gIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInN0b3JlXCIsIHt9KTtcbiAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiZmllbGRFbnRpdGllc1wiLCBbXSk7XG4gIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImluaXRpYWxWYWx1ZXNcIiwge30pO1xuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJjYWxsYmFja3NcIiwge30pO1xuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJ2YWxpZGF0ZU1lc3NhZ2VzXCIsIG51bGwpO1xuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJwcmVzZXJ2ZVwiLCBudWxsKTtcbiAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwibGFzdFZhbGlkYXRlUHJvbWlzZVwiLCBudWxsKTtcbiAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiZ2V0Rm9ybVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdldEZpZWxkVmFsdWU6IF90aGlzLmdldEZpZWxkVmFsdWUsXG4gICAgICBnZXRGaWVsZHNWYWx1ZTogX3RoaXMuZ2V0RmllbGRzVmFsdWUsXG4gICAgICBnZXRGaWVsZEVycm9yOiBfdGhpcy5nZXRGaWVsZEVycm9yLFxuICAgICAgZ2V0RmllbGRXYXJuaW5nOiBfdGhpcy5nZXRGaWVsZFdhcm5pbmcsXG4gICAgICBnZXRGaWVsZHNFcnJvcjogX3RoaXMuZ2V0RmllbGRzRXJyb3IsXG4gICAgICBpc0ZpZWxkc1RvdWNoZWQ6IF90aGlzLmlzRmllbGRzVG91Y2hlZCxcbiAgICAgIGlzRmllbGRUb3VjaGVkOiBfdGhpcy5pc0ZpZWxkVG91Y2hlZCxcbiAgICAgIGlzRmllbGRWYWxpZGF0aW5nOiBfdGhpcy5pc0ZpZWxkVmFsaWRhdGluZyxcbiAgICAgIGlzRmllbGRzVmFsaWRhdGluZzogX3RoaXMuaXNGaWVsZHNWYWxpZGF0aW5nLFxuICAgICAgcmVzZXRGaWVsZHM6IF90aGlzLnJlc2V0RmllbGRzLFxuICAgICAgc2V0RmllbGRzOiBfdGhpcy5zZXRGaWVsZHMsXG4gICAgICBzZXRGaWVsZFZhbHVlOiBfdGhpcy5zZXRGaWVsZFZhbHVlLFxuICAgICAgc2V0RmllbGRzVmFsdWU6IF90aGlzLnNldEZpZWxkc1ZhbHVlLFxuICAgICAgdmFsaWRhdGVGaWVsZHM6IF90aGlzLnZhbGlkYXRlRmllbGRzLFxuICAgICAgc3VibWl0OiBfdGhpcy5zdWJtaXQsXG4gICAgICBfaW5pdDogdHJ1ZSxcbiAgICAgIGdldEludGVybmFsSG9va3M6IF90aGlzLmdldEludGVybmFsSG9va3NcbiAgICB9O1xuICB9KTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IEludGVybmFsIEhvb2tzID09PT09PT09PT09PT09PT09PT09PT09PVxuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJnZXRJbnRlcm5hbEhvb2tzXCIsIGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoa2V5ID09PSBIT09LX01BUkspIHtcbiAgICAgIF90aGlzLmZvcm1Ib29rZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGlzcGF0Y2g6IF90aGlzLmRpc3BhdGNoLFxuICAgICAgICBpbml0RW50aXR5VmFsdWU6IF90aGlzLmluaXRFbnRpdHlWYWx1ZSxcbiAgICAgICAgcmVnaXN0ZXJGaWVsZDogX3RoaXMucmVnaXN0ZXJGaWVsZCxcbiAgICAgICAgdXNlU3Vic2NyaWJlOiBfdGhpcy51c2VTdWJzY3JpYmUsXG4gICAgICAgIHNldEluaXRpYWxWYWx1ZXM6IF90aGlzLnNldEluaXRpYWxWYWx1ZXMsXG4gICAgICAgIGRlc3Ryb3lGb3JtOiBfdGhpcy5kZXN0cm95Rm9ybSxcbiAgICAgICAgc2V0Q2FsbGJhY2tzOiBfdGhpcy5zZXRDYWxsYmFja3MsXG4gICAgICAgIHNldFZhbGlkYXRlTWVzc2FnZXM6IF90aGlzLnNldFZhbGlkYXRlTWVzc2FnZXMsXG4gICAgICAgIGdldEZpZWxkczogX3RoaXMuZ2V0RmllbGRzLFxuICAgICAgICBzZXRQcmVzZXJ2ZTogX3RoaXMuc2V0UHJlc2VydmUsXG4gICAgICAgIGdldEluaXRpYWxWYWx1ZTogX3RoaXMuZ2V0SW5pdGlhbFZhbHVlLFxuICAgICAgICByZWdpc3RlcldhdGNoOiBfdGhpcy5yZWdpc3RlcldhdGNoXG4gICAgICB9O1xuICAgIH1cbiAgICB3YXJuaW5nKGZhbHNlLCAnYGdldEludGVybmFsSG9va3NgIGlzIGludGVybmFsIHVzYWdlLiBTaG91bGQgbm90IGNhbGwgZGlyZWN0bHkuJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0pO1xuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJ1c2VTdWJzY3JpYmVcIiwgZnVuY3Rpb24gKHN1YnNjcmliYWJsZSkge1xuICAgIF90aGlzLnN1YnNjcmliYWJsZSA9IHN1YnNjcmliYWJsZTtcbiAgfSk7XG4gIC8qKlxuICAgKiBSZWNvcmQgcHJldiBGb3JtIHVubW91bnQgZmllbGRFbnRpdGllcyB3aGljaCBjb25maWcgcHJlc2VydmUgZmFsc2UuXG4gICAqIFRoaXMgbmVlZCB0byBiZSByZWZpbGwgd2l0aCBpbml0aWFsVmFsdWVzIGluc3RlYWQgb2Ygc3RvcmUgdmFsdWUuXG4gICAqL1xuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJwcmV2V2l0aG91dFByZXNlcnZlc1wiLCBudWxsKTtcbiAgLyoqXG4gICAqIEZpcnN0IHRpbWUgYHNldEluaXRpYWxWYWx1ZXNgIHNob3VsZCB1cGRhdGUgc3RvcmUgd2l0aCBpbml0aWFsIHZhbHVlXG4gICAqL1xuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJzZXRJbml0aWFsVmFsdWVzXCIsIGZ1bmN0aW9uIChpbml0aWFsVmFsdWVzLCBpbml0KSB7XG4gICAgX3RoaXMuaW5pdGlhbFZhbHVlcyA9IGluaXRpYWxWYWx1ZXMgfHwge307XG4gICAgaWYgKGluaXQpIHtcbiAgICAgIHZhciBfdGhpcyRwcmV2V2l0aG91dFByZXM7XG4gICAgICB2YXIgbmV4dFN0b3JlID0gbWVyZ2UoaW5pdGlhbFZhbHVlcywgX3RoaXMuc3RvcmUpO1xuXG4gICAgICAvLyBXZSB3aWxsIHRha2UgY29uc2lkZXIgcHJldiBmb3JtIHVubW91bnQgZmllbGRzLlxuICAgICAgLy8gV2hlbiB0aGUgZmllbGQgaXMgbm90IGBwcmVzZXJ2ZWAsIHdlIG5lZWQgZmlsbCB0aGlzIHdpdGggaW5pdGlhbFZhbHVlcyBpbnN0ZWFkIG9mIHN0b3JlLlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGFycmF5LWNhbGxiYWNrLXJldHVyblxuICAgICAgKF90aGlzJHByZXZXaXRob3V0UHJlcyA9IF90aGlzLnByZXZXaXRob3V0UHJlc2VydmVzKSA9PT0gbnVsbCB8fCBfdGhpcyRwcmV2V2l0aG91dFByZXMgPT09IHZvaWQgMCB8fCBfdGhpcyRwcmV2V2l0aG91dFByZXMubWFwKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICAgIHZhciBuYW1lUGF0aCA9IF9yZWYua2V5O1xuICAgICAgICBuZXh0U3RvcmUgPSBzZXRWYWx1ZShuZXh0U3RvcmUsIG5hbWVQYXRoLCBnZXRWYWx1ZShpbml0aWFsVmFsdWVzLCBuYW1lUGF0aCkpO1xuICAgICAgfSk7XG4gICAgICBfdGhpcy5wcmV2V2l0aG91dFByZXNlcnZlcyA9IG51bGw7XG4gICAgICBfdGhpcy51cGRhdGVTdG9yZShuZXh0U3RvcmUpO1xuICAgIH1cbiAgfSk7XG4gIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImRlc3Ryb3lGb3JtXCIsIGZ1bmN0aW9uIChjbGVhck9uRGVzdHJveSkge1xuICAgIGlmIChjbGVhck9uRGVzdHJveSkge1xuICAgICAgLy8gZGVzdHJveSBmb3JtIHJlc2V0IHN0b3JlXG4gICAgICBfdGhpcy51cGRhdGVTdG9yZSh7fSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZpbGwgcHJlc2VydmUgZmllbGRzXG4gICAgICB2YXIgcHJldldpdGhvdXRQcmVzZXJ2ZXMgPSBuZXcgTmFtZU1hcCgpO1xuICAgICAgX3RoaXMuZ2V0RmllbGRFbnRpdGllcyh0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgICAgaWYgKCFfdGhpcy5pc01lcmdlZFByZXNlcnZlKGVudGl0eS5pc1ByZXNlcnZlKCkpKSB7XG4gICAgICAgICAgcHJldldpdGhvdXRQcmVzZXJ2ZXMuc2V0KGVudGl0eS5nZXROYW1lUGF0aCgpLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBfdGhpcy5wcmV2V2l0aG91dFByZXNlcnZlcyA9IHByZXZXaXRob3V0UHJlc2VydmVzO1xuICAgIH1cbiAgfSk7XG4gIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImdldEluaXRpYWxWYWx1ZVwiLCBmdW5jdGlvbiAobmFtZVBhdGgpIHtcbiAgICB2YXIgaW5pdFZhbHVlID0gZ2V0VmFsdWUoX3RoaXMuaW5pdGlhbFZhbHVlcywgbmFtZVBhdGgpO1xuXG4gICAgLy8gTm90IGNsb25lRGVlcCB3aGVuIHdpdGhvdXQgYG5hbWVQYXRoYFxuICAgIHJldHVybiBuYW1lUGF0aC5sZW5ndGggPyBtZXJnZShpbml0VmFsdWUpIDogaW5pdFZhbHVlO1xuICB9KTtcbiAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwic2V0Q2FsbGJhY2tzXCIsIGZ1bmN0aW9uIChjYWxsYmFja3MpIHtcbiAgICBfdGhpcy5jYWxsYmFja3MgPSBjYWxsYmFja3M7XG4gIH0pO1xuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJzZXRWYWxpZGF0ZU1lc3NhZ2VzXCIsIGZ1bmN0aW9uICh2YWxpZGF0ZU1lc3NhZ2VzKSB7XG4gICAgX3RoaXMudmFsaWRhdGVNZXNzYWdlcyA9IHZhbGlkYXRlTWVzc2FnZXM7XG4gIH0pO1xuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJzZXRQcmVzZXJ2ZVwiLCBmdW5jdGlvbiAocHJlc2VydmUpIHtcbiAgICBfdGhpcy5wcmVzZXJ2ZSA9IHByZXNlcnZlO1xuICB9KTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gV2F0Y2ggPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJ3YXRjaExpc3RcIiwgW10pO1xuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJyZWdpc3RlcldhdGNoXCIsIGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgIF90aGlzLndhdGNoTGlzdC5wdXNoKGNhbGxiYWNrKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMud2F0Y2hMaXN0ID0gX3RoaXMud2F0Y2hMaXN0LmZpbHRlcihmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgcmV0dXJuIGZuICE9PSBjYWxsYmFjaztcbiAgICAgIH0pO1xuICAgIH07XG4gIH0pO1xuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJub3RpZnlXYXRjaFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG5hbWVQYXRoID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbXTtcbiAgICAvLyBObyBuZWVkIHRvIGNvc3QgcGVyZiB3aGVuIG5vdGhpbmcgbmVlZCB0byB3YXRjaFxuICAgIGlmIChfdGhpcy53YXRjaExpc3QubGVuZ3RoKSB7XG4gICAgICB2YXIgdmFsdWVzID0gX3RoaXMuZ2V0RmllbGRzVmFsdWUoKTtcbiAgICAgIHZhciBhbGxWYWx1ZXMgPSBfdGhpcy5nZXRGaWVsZHNWYWx1ZSh0cnVlKTtcbiAgICAgIF90aGlzLndhdGNoTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICBjYWxsYmFjayh2YWx1ZXMsIGFsbFZhbHVlcywgbmFtZVBhdGgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gRGV2IFdhcm5pbmcgPT09PT09PT09PT09PT09PT09PT09PT09PVxuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJ0aW1lb3V0SWRcIiwgbnVsbCk7XG4gIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIndhcm5pbmdVbmhvb2tlZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIV90aGlzLnRpbWVvdXRJZCAmJiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgX3RoaXMudGltZW91dElkID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzLnRpbWVvdXRJZCA9IG51bGw7XG4gICAgICAgIGlmICghX3RoaXMuZm9ybUhvb2tlZCkge1xuICAgICAgICAgIHdhcm5pbmcoZmFsc2UsICdJbnN0YW5jZSBjcmVhdGVkIGJ5IGB1c2VGb3JtYCBpcyBub3QgY29ubmVjdGVkIHRvIGFueSBGb3JtIGVsZW1lbnQuIEZvcmdldCB0byBwYXNzIGBmb3JtYCBwcm9wPycpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFN0b3JlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInVwZGF0ZVN0b3JlXCIsIGZ1bmN0aW9uIChuZXh0U3RvcmUpIHtcbiAgICBfdGhpcy5zdG9yZSA9IG5leHRTdG9yZTtcbiAgfSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRmllbGRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLyoqXG4gICAqIEdldCByZWdpc3RlcmVkIGZpZWxkIGVudGl0aWVzLlxuICAgKiBAcGFyYW0gcHVyZSBPbmx5IHJldHVybiBmaWVsZCB3aGljaCBoYXMgYSBgbmFtZWAuIERlZmF1bHQ6IGZhbHNlXG4gICAqL1xuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJnZXRGaWVsZEVudGl0aWVzXCIsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcHVyZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZmFsc2U7XG4gICAgaWYgKCFwdXJlKSB7XG4gICAgICByZXR1cm4gX3RoaXMuZmllbGRFbnRpdGllcztcbiAgICB9XG4gICAgcmV0dXJuIF90aGlzLmZpZWxkRW50aXRpZXMuZmlsdGVyKGZ1bmN0aW9uIChmaWVsZCkge1xuICAgICAgcmV0dXJuIGZpZWxkLmdldE5hbWVQYXRoKCkubGVuZ3RoO1xuICAgIH0pO1xuICB9KTtcbiAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiZ2V0RmllbGRzTWFwXCIsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcHVyZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZmFsc2U7XG4gICAgdmFyIGNhY2hlID0gbmV3IE5hbWVNYXAoKTtcbiAgICBfdGhpcy5nZXRGaWVsZEVudGl0aWVzKHB1cmUpLmZvckVhY2goZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICB2YXIgbmFtZVBhdGggPSBmaWVsZC5nZXROYW1lUGF0aCgpO1xuICAgICAgY2FjaGUuc2V0KG5hbWVQYXRoLCBmaWVsZCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNhY2hlO1xuICB9KTtcbiAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiZ2V0RmllbGRFbnRpdGllc0Zvck5hbWVQYXRoTGlzdFwiLCBmdW5jdGlvbiAobmFtZUxpc3QpIHtcbiAgICBpZiAoIW5hbWVMaXN0KSB7XG4gICAgICByZXR1cm4gX3RoaXMuZ2V0RmllbGRFbnRpdGllcyh0cnVlKTtcbiAgICB9XG4gICAgdmFyIGNhY2hlID0gX3RoaXMuZ2V0RmllbGRzTWFwKHRydWUpO1xuICAgIHJldHVybiBuYW1lTGlzdC5tYXAoZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHZhciBuYW1lUGF0aCA9IGdldE5hbWVQYXRoKG5hbWUpO1xuICAgICAgcmV0dXJuIGNhY2hlLmdldChuYW1lUGF0aCkgfHwge1xuICAgICAgICBJTlZBTElEQVRFX05BTUVfUEFUSDogZ2V0TmFtZVBhdGgobmFtZSlcbiAgICAgIH07XG4gICAgfSk7XG4gIH0pO1xuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJnZXRGaWVsZHNWYWx1ZVwiLCBmdW5jdGlvbiAobmFtZUxpc3QsIGZpbHRlckZ1bmMpIHtcbiAgICBfdGhpcy53YXJuaW5nVW5ob29rZWQoKTtcblxuICAgIC8vIEZpbGwgYXJnc1xuICAgIHZhciBtZXJnZWROYW1lTGlzdDtcbiAgICB2YXIgbWVyZ2VkRmlsdGVyRnVuYztcbiAgICB2YXIgbWVyZ2VkU3RyaWN0O1xuICAgIGlmIChuYW1lTGlzdCA9PT0gdHJ1ZSB8fCBBcnJheS5pc0FycmF5KG5hbWVMaXN0KSkge1xuICAgICAgbWVyZ2VkTmFtZUxpc3QgPSBuYW1lTGlzdDtcbiAgICAgIG1lcmdlZEZpbHRlckZ1bmMgPSBmaWx0ZXJGdW5jO1xuICAgIH0gZWxzZSBpZiAobmFtZUxpc3QgJiYgX3R5cGVvZihuYW1lTGlzdCkgPT09ICdvYmplY3QnKSB7XG4gICAgICBtZXJnZWRTdHJpY3QgPSBuYW1lTGlzdC5zdHJpY3Q7XG4gICAgICBtZXJnZWRGaWx0ZXJGdW5jID0gbmFtZUxpc3QuZmlsdGVyO1xuICAgIH1cbiAgICBpZiAobWVyZ2VkTmFtZUxpc3QgPT09IHRydWUgJiYgIW1lcmdlZEZpbHRlckZ1bmMpIHtcbiAgICAgIHJldHVybiBfdGhpcy5zdG9yZTtcbiAgICB9XG4gICAgdmFyIGZpZWxkRW50aXRpZXMgPSBfdGhpcy5nZXRGaWVsZEVudGl0aWVzRm9yTmFtZVBhdGhMaXN0KEFycmF5LmlzQXJyYXkobWVyZ2VkTmFtZUxpc3QpID8gbWVyZ2VkTmFtZUxpc3QgOiBudWxsKTtcbiAgICB2YXIgZmlsdGVyZWROYW1lTGlzdCA9IFtdO1xuICAgIGZpZWxkRW50aXRpZXMuZm9yRWFjaChmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgICB2YXIgX2lzTGlzdEZpZWxkLCBfcmVmMztcbiAgICAgIHZhciBuYW1lUGF0aCA9ICdJTlZBTElEQVRFX05BTUVfUEFUSCcgaW4gZW50aXR5ID8gZW50aXR5LklOVkFMSURBVEVfTkFNRV9QQVRIIDogZW50aXR5LmdldE5hbWVQYXRoKCk7XG5cbiAgICAgIC8vIElnbm9yZSB3aGVuIGl0J3MgYSBsaXN0IGl0ZW0gYW5kIG5vdCBzcGVjaWZpYyB0aGUgbmFtZVBhdGgsXG4gICAgICAvLyBzaW5jZSBwYXJlbnQgZmllbGQgaXMgYWxyZWFkeSB0YWtlIGluIGNvdW50XG4gICAgICBpZiAobWVyZ2VkU3RyaWN0KSB7XG4gICAgICAgIHZhciBfaXNMaXN0LCBfcmVmMjtcbiAgICAgICAgaWYgKChfaXNMaXN0ID0gKF9yZWYyID0gZW50aXR5KS5pc0xpc3QpICE9PSBudWxsICYmIF9pc0xpc3QgIT09IHZvaWQgMCAmJiBfaXNMaXN0LmNhbGwoX3JlZjIpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFtZXJnZWROYW1lTGlzdCAmJiAoX2lzTGlzdEZpZWxkID0gKF9yZWYzID0gZW50aXR5KS5pc0xpc3RGaWVsZCkgIT09IG51bGwgJiYgX2lzTGlzdEZpZWxkICE9PSB2b2lkIDAgJiYgX2lzTGlzdEZpZWxkLmNhbGwoX3JlZjMpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghbWVyZ2VkRmlsdGVyRnVuYykge1xuICAgICAgICBmaWx0ZXJlZE5hbWVMaXN0LnB1c2gobmFtZVBhdGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG1ldGEgPSAnZ2V0TWV0YScgaW4gZW50aXR5ID8gZW50aXR5LmdldE1ldGEoKSA6IG51bGw7XG4gICAgICAgIGlmIChtZXJnZWRGaWx0ZXJGdW5jKG1ldGEpKSB7XG4gICAgICAgICAgZmlsdGVyZWROYW1lTGlzdC5wdXNoKG5hbWVQYXRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjbG9uZUJ5TmFtZVBhdGhMaXN0KF90aGlzLnN0b3JlLCBmaWx0ZXJlZE5hbWVMaXN0Lm1hcChnZXROYW1lUGF0aCkpO1xuICB9KTtcbiAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiZ2V0RmllbGRWYWx1ZVwiLCBmdW5jdGlvbiAobmFtZSkge1xuICAgIF90aGlzLndhcm5pbmdVbmhvb2tlZCgpO1xuICAgIHZhciBuYW1lUGF0aCA9IGdldE5hbWVQYXRoKG5hbWUpO1xuICAgIHJldHVybiBnZXRWYWx1ZShfdGhpcy5zdG9yZSwgbmFtZVBhdGgpO1xuICB9KTtcbiAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiZ2V0RmllbGRzRXJyb3JcIiwgZnVuY3Rpb24gKG5hbWVMaXN0KSB7XG4gICAgX3RoaXMud2FybmluZ1VuaG9va2VkKCk7XG4gICAgdmFyIGZpZWxkRW50aXRpZXMgPSBfdGhpcy5nZXRGaWVsZEVudGl0aWVzRm9yTmFtZVBhdGhMaXN0KG5hbWVMaXN0KTtcbiAgICByZXR1cm4gZmllbGRFbnRpdGllcy5tYXAoZnVuY3Rpb24gKGVudGl0eSwgaW5kZXgpIHtcbiAgICAgIGlmIChlbnRpdHkgJiYgISgnSU5WQUxJREFURV9OQU1FX1BBVEgnIGluIGVudGl0eSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiBlbnRpdHkuZ2V0TmFtZVBhdGgoKSxcbiAgICAgICAgICBlcnJvcnM6IGVudGl0eS5nZXRFcnJvcnMoKSxcbiAgICAgICAgICB3YXJuaW5nczogZW50aXR5LmdldFdhcm5pbmdzKClcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IGdldE5hbWVQYXRoKG5hbWVMaXN0W2luZGV4XSksXG4gICAgICAgIGVycm9yczogW10sXG4gICAgICAgIHdhcm5pbmdzOiBbXVxuICAgICAgfTtcbiAgICB9KTtcbiAgfSk7XG4gIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImdldEZpZWxkRXJyb3JcIiwgZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBfdGhpcy53YXJuaW5nVW5ob29rZWQoKTtcbiAgICB2YXIgbmFtZVBhdGggPSBnZXROYW1lUGF0aChuYW1lKTtcbiAgICB2YXIgZmllbGRFcnJvciA9IF90aGlzLmdldEZpZWxkc0Vycm9yKFtuYW1lUGF0aF0pWzBdO1xuICAgIHJldHVybiBmaWVsZEVycm9yLmVycm9ycztcbiAgfSk7XG4gIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImdldEZpZWxkV2FybmluZ1wiLCBmdW5jdGlvbiAobmFtZSkge1xuICAgIF90aGlzLndhcm5pbmdVbmhvb2tlZCgpO1xuICAgIHZhciBuYW1lUGF0aCA9IGdldE5hbWVQYXRoKG5hbWUpO1xuICAgIHZhciBmaWVsZEVycm9yID0gX3RoaXMuZ2V0RmllbGRzRXJyb3IoW25hbWVQYXRoXSlbMF07XG4gICAgcmV0dXJuIGZpZWxkRXJyb3Iud2FybmluZ3M7XG4gIH0pO1xuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJpc0ZpZWxkc1RvdWNoZWRcIiwgZnVuY3Rpb24gKCkge1xuICAgIF90aGlzLndhcm5pbmdVbmhvb2tlZCgpO1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG4gICAgdmFyIGFyZzAgPSBhcmdzWzBdLFxuICAgICAgYXJnMSA9IGFyZ3NbMV07XG4gICAgdmFyIG5hbWVQYXRoTGlzdDtcbiAgICB2YXIgaXNBbGxGaWVsZHNUb3VjaGVkID0gZmFsc2U7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBuYW1lUGF0aExpc3QgPSBudWxsO1xuICAgIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGFyZzApKSB7XG4gICAgICAgIG5hbWVQYXRoTGlzdCA9IGFyZzAubWFwKGdldE5hbWVQYXRoKTtcbiAgICAgICAgaXNBbGxGaWVsZHNUb3VjaGVkID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuYW1lUGF0aExpc3QgPSBudWxsO1xuICAgICAgICBpc0FsbEZpZWxkc1RvdWNoZWQgPSBhcmcwO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuYW1lUGF0aExpc3QgPSBhcmcwLm1hcChnZXROYW1lUGF0aCk7XG4gICAgICBpc0FsbEZpZWxkc1RvdWNoZWQgPSBhcmcxO1xuICAgIH1cbiAgICB2YXIgZmllbGRFbnRpdGllcyA9IF90aGlzLmdldEZpZWxkRW50aXRpZXModHJ1ZSk7XG4gICAgdmFyIGlzRmllbGRUb3VjaGVkID0gZnVuY3Rpb24gaXNGaWVsZFRvdWNoZWQoZmllbGQpIHtcbiAgICAgIHJldHVybiBmaWVsZC5pc0ZpZWxkVG91Y2hlZCgpO1xuICAgIH07XG5cbiAgICAvLyA9PT09PSBXaWxsIGdldCBmdWxseSBjb21wYXJlIHdoZW4gbm90IGNvbmZpZyBuYW1lUGF0aExpc3QgPT09PT1cbiAgICBpZiAoIW5hbWVQYXRoTGlzdCkge1xuICAgICAgcmV0dXJuIGlzQWxsRmllbGRzVG91Y2hlZCA/IGZpZWxkRW50aXRpZXMuZXZlcnkoZnVuY3Rpb24gKGVudGl0eSkge1xuICAgICAgICByZXR1cm4gaXNGaWVsZFRvdWNoZWQoZW50aXR5KSB8fCBlbnRpdHkuaXNMaXN0KCk7XG4gICAgICB9KSA6IGZpZWxkRW50aXRpZXMuc29tZShpc0ZpZWxkVG91Y2hlZCk7XG4gICAgfVxuXG4gICAgLy8gR2VuZXJhdGUgYSBuZXN0IHRyZWUgZm9yIHZhbGlkYXRlXG4gICAgdmFyIG1hcCA9IG5ldyBOYW1lTWFwKCk7XG4gICAgbmFtZVBhdGhMaXN0LmZvckVhY2goZnVuY3Rpb24gKHNob3J0TmFtZVBhdGgpIHtcbiAgICAgIG1hcC5zZXQoc2hvcnROYW1lUGF0aCwgW10pO1xuICAgIH0pO1xuICAgIGZpZWxkRW50aXRpZXMuZm9yRWFjaChmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgIHZhciBmaWVsZE5hbWVQYXRoID0gZmllbGQuZ2V0TmFtZVBhdGgoKTtcblxuICAgICAgLy8gRmluZCBtYXRjaGVkIGVudGl0eSBhbmQgcHV0IGludG8gbGlzdFxuICAgICAgbmFtZVBhdGhMaXN0LmZvckVhY2goZnVuY3Rpb24gKHNob3J0TmFtZVBhdGgpIHtcbiAgICAgICAgaWYgKHNob3J0TmFtZVBhdGguZXZlcnkoZnVuY3Rpb24gKG5hbWVVbml0LCBpKSB7XG4gICAgICAgICAgcmV0dXJuIGZpZWxkTmFtZVBhdGhbaV0gPT09IG5hbWVVbml0O1xuICAgICAgICB9KSkge1xuICAgICAgICAgIG1hcC51cGRhdGUoc2hvcnROYW1lUGF0aCwgZnVuY3Rpb24gKGxpc3QpIHtcbiAgICAgICAgICAgIHJldHVybiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGxpc3QpLCBbZmllbGRdKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBDaGVjayBpZiBOYW1lTWFwIHZhbHVlIGlzIHRvdWNoZWRcbiAgICB2YXIgaXNOYW1lUGF0aExpc3RUb3VjaGVkID0gZnVuY3Rpb24gaXNOYW1lUGF0aExpc3RUb3VjaGVkKGVudGl0aWVzKSB7XG4gICAgICByZXR1cm4gZW50aXRpZXMuc29tZShpc0ZpZWxkVG91Y2hlZCk7XG4gICAgfTtcbiAgICB2YXIgbmFtZVBhdGhMaXN0RW50aXRpZXMgPSBtYXAubWFwKGZ1bmN0aW9uIChfcmVmNCkge1xuICAgICAgdmFyIHZhbHVlID0gX3JlZjQudmFsdWU7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIGlzQWxsRmllbGRzVG91Y2hlZCA/IG5hbWVQYXRoTGlzdEVudGl0aWVzLmV2ZXJ5KGlzTmFtZVBhdGhMaXN0VG91Y2hlZCkgOiBuYW1lUGF0aExpc3RFbnRpdGllcy5zb21lKGlzTmFtZVBhdGhMaXN0VG91Y2hlZCk7XG4gIH0pO1xuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJpc0ZpZWxkVG91Y2hlZFwiLCBmdW5jdGlvbiAobmFtZSkge1xuICAgIF90aGlzLndhcm5pbmdVbmhvb2tlZCgpO1xuICAgIHJldHVybiBfdGhpcy5pc0ZpZWxkc1RvdWNoZWQoW25hbWVdKTtcbiAgfSk7XG4gIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImlzRmllbGRzVmFsaWRhdGluZ1wiLCBmdW5jdGlvbiAobmFtZUxpc3QpIHtcbiAgICBfdGhpcy53YXJuaW5nVW5ob29rZWQoKTtcbiAgICB2YXIgZmllbGRFbnRpdGllcyA9IF90aGlzLmdldEZpZWxkRW50aXRpZXMoKTtcbiAgICBpZiAoIW5hbWVMaXN0KSB7XG4gICAgICByZXR1cm4gZmllbGRFbnRpdGllcy5zb21lKGZ1bmN0aW9uICh0ZXN0RmllbGQpIHtcbiAgICAgICAgcmV0dXJuIHRlc3RGaWVsZC5pc0ZpZWxkVmFsaWRhdGluZygpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHZhciBuYW1lUGF0aExpc3QgPSBuYW1lTGlzdC5tYXAoZ2V0TmFtZVBhdGgpO1xuICAgIHJldHVybiBmaWVsZEVudGl0aWVzLnNvbWUoZnVuY3Rpb24gKHRlc3RGaWVsZCkge1xuICAgICAgdmFyIGZpZWxkTmFtZVBhdGggPSB0ZXN0RmllbGQuZ2V0TmFtZVBhdGgoKTtcbiAgICAgIHJldHVybiBjb250YWluc05hbWVQYXRoKG5hbWVQYXRoTGlzdCwgZmllbGROYW1lUGF0aCkgJiYgdGVzdEZpZWxkLmlzRmllbGRWYWxpZGF0aW5nKCk7XG4gICAgfSk7XG4gIH0pO1xuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJpc0ZpZWxkVmFsaWRhdGluZ1wiLCBmdW5jdGlvbiAobmFtZSkge1xuICAgIF90aGlzLndhcm5pbmdVbmhvb2tlZCgpO1xuICAgIHJldHVybiBfdGhpcy5pc0ZpZWxkc1ZhbGlkYXRpbmcoW25hbWVdKTtcbiAgfSk7XG4gIC8qKlxuICAgKiBSZXNldCBGaWVsZCB3aXRoIGZpZWxkIGBpbml0aWFsVmFsdWVgIHByb3AuXG4gICAqIENhbiBwYXNzIGBlbnRpdGllc2Agb3IgYG5hbWVQYXRoTGlzdGAgb3IganVzdCBub3RoaW5nLlxuICAgKi9cbiAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwicmVzZXRXaXRoRmllbGRJbml0aWFsVmFsdWVcIiwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBpbmZvID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAvLyBDcmVhdGUgY2FjaGVcbiAgICB2YXIgY2FjaGUgPSBuZXcgTmFtZU1hcCgpO1xuICAgIHZhciBmaWVsZEVudGl0aWVzID0gX3RoaXMuZ2V0RmllbGRFbnRpdGllcyh0cnVlKTtcbiAgICBmaWVsZEVudGl0aWVzLmZvckVhY2goZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICB2YXIgaW5pdGlhbFZhbHVlID0gZmllbGQucHJvcHMuaW5pdGlhbFZhbHVlO1xuICAgICAgdmFyIG5hbWVQYXRoID0gZmllbGQuZ2V0TmFtZVBhdGgoKTtcblxuICAgICAgLy8gUmVjb3JkIG9ubHkgaWYgaGFzIGBpbml0aWFsVmFsdWVgXG4gICAgICBpZiAoaW5pdGlhbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFyIHJlY29yZHMgPSBjYWNoZS5nZXQobmFtZVBhdGgpIHx8IG5ldyBTZXQoKTtcbiAgICAgICAgcmVjb3Jkcy5hZGQoe1xuICAgICAgICAgIGVudGl0eTogZmllbGQsXG4gICAgICAgICAgdmFsdWU6IGluaXRpYWxWYWx1ZVxuICAgICAgICB9KTtcbiAgICAgICAgY2FjaGUuc2V0KG5hbWVQYXRoLCByZWNvcmRzKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFJlc2V0XG4gICAgdmFyIHJlc2V0V2l0aEZpZWxkcyA9IGZ1bmN0aW9uIHJlc2V0V2l0aEZpZWxkcyhlbnRpdGllcykge1xuICAgICAgZW50aXRpZXMuZm9yRWFjaChmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgICAgdmFyIGluaXRpYWxWYWx1ZSA9IGZpZWxkLnByb3BzLmluaXRpYWxWYWx1ZTtcbiAgICAgICAgaWYgKGluaXRpYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdmFyIG5hbWVQYXRoID0gZmllbGQuZ2V0TmFtZVBhdGgoKTtcbiAgICAgICAgICB2YXIgZm9ybUluaXRpYWxWYWx1ZSA9IF90aGlzLmdldEluaXRpYWxWYWx1ZShuYW1lUGF0aCk7XG4gICAgICAgICAgaWYgKGZvcm1Jbml0aWFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gV2FybmluZyBpZiBjb25mbGljdCB3aXRoIGZvcm0gaW5pdGlhbFZhbHVlcyBhbmQgZG8gbm90IG1vZGlmeSB2YWx1ZVxuICAgICAgICAgICAgd2FybmluZyhmYWxzZSwgXCJGb3JtIGFscmVhZHkgc2V0ICdpbml0aWFsVmFsdWVzJyB3aXRoIHBhdGggJ1wiLmNvbmNhdChuYW1lUGF0aC5qb2luKCcuJyksIFwiJy4gRmllbGQgY2FuIG5vdCBvdmVyd3JpdGUgaXQuXCIpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHJlY29yZHMgPSBjYWNoZS5nZXQobmFtZVBhdGgpO1xuICAgICAgICAgICAgaWYgKHJlY29yZHMgJiYgcmVjb3Jkcy5zaXplID4gMSkge1xuICAgICAgICAgICAgICAvLyBXYXJuaW5nIGlmIG11bHRpcGxlIGZpZWxkIHNldCBgaW5pdGlhbFZhbHVlYGFuZCBkbyBub3QgbW9kaWZ5IHZhbHVlXG4gICAgICAgICAgICAgIHdhcm5pbmcoZmFsc2UsIFwiTXVsdGlwbGUgRmllbGQgd2l0aCBwYXRoICdcIi5jb25jYXQobmFtZVBhdGguam9pbignLicpLCBcIicgc2V0ICdpbml0aWFsVmFsdWUnLiBDYW4gbm90IGRlY2lkZSB3aGljaCBvbmUgdG8gcGljay5cIikpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChyZWNvcmRzKSB7XG4gICAgICAgICAgICAgIHZhciBvcmlnaW5WYWx1ZSA9IF90aGlzLmdldEZpZWxkVmFsdWUobmFtZVBhdGgpO1xuICAgICAgICAgICAgICB2YXIgaXNMaXN0RmllbGQgPSBmaWVsZC5pc0xpc3RGaWVsZCgpO1xuXG4gICAgICAgICAgICAgIC8vIFNldCBgaW5pdGlhbFZhbHVlYFxuICAgICAgICAgICAgICBpZiAoIWlzTGlzdEZpZWxkICYmICghaW5mby5za2lwRXhpc3QgfHwgb3JpZ2luVmFsdWUgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy51cGRhdGVTdG9yZShzZXRWYWx1ZShfdGhpcy5zdG9yZSwgbmFtZVBhdGgsIF90b0NvbnN1bWFibGVBcnJheShyZWNvcmRzKVswXS52YWx1ZSkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuICAgIHZhciByZXF1aXJlZEZpZWxkRW50aXRpZXM7XG4gICAgaWYgKGluZm8uZW50aXRpZXMpIHtcbiAgICAgIHJlcXVpcmVkRmllbGRFbnRpdGllcyA9IGluZm8uZW50aXRpZXM7XG4gICAgfSBlbHNlIGlmIChpbmZvLm5hbWVQYXRoTGlzdCkge1xuICAgICAgcmVxdWlyZWRGaWVsZEVudGl0aWVzID0gW107XG4gICAgICBpbmZvLm5hbWVQYXRoTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lUGF0aCkge1xuICAgICAgICB2YXIgcmVjb3JkcyA9IGNhY2hlLmdldChuYW1lUGF0aCk7XG4gICAgICAgIGlmIChyZWNvcmRzKSB7XG4gICAgICAgICAgdmFyIF9yZXF1aXJlZEZpZWxkRW50aXRpZTtcbiAgICAgICAgICAoX3JlcXVpcmVkRmllbGRFbnRpdGllID0gcmVxdWlyZWRGaWVsZEVudGl0aWVzKS5wdXNoLmFwcGx5KF9yZXF1aXJlZEZpZWxkRW50aXRpZSwgX3RvQ29uc3VtYWJsZUFycmF5KF90b0NvbnN1bWFibGVBcnJheShyZWNvcmRzKS5tYXAoZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgICAgIHJldHVybiByLmVudGl0eTtcbiAgICAgICAgICB9KSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVxdWlyZWRGaWVsZEVudGl0aWVzID0gZmllbGRFbnRpdGllcztcbiAgICB9XG4gICAgcmVzZXRXaXRoRmllbGRzKHJlcXVpcmVkRmllbGRFbnRpdGllcyk7XG4gIH0pO1xuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJyZXNldEZpZWxkc1wiLCBmdW5jdGlvbiAobmFtZUxpc3QpIHtcbiAgICBfdGhpcy53YXJuaW5nVW5ob29rZWQoKTtcbiAgICB2YXIgcHJldlN0b3JlID0gX3RoaXMuc3RvcmU7XG4gICAgaWYgKCFuYW1lTGlzdCkge1xuICAgICAgX3RoaXMudXBkYXRlU3RvcmUobWVyZ2UoX3RoaXMuaW5pdGlhbFZhbHVlcykpO1xuICAgICAgX3RoaXMucmVzZXRXaXRoRmllbGRJbml0aWFsVmFsdWUoKTtcbiAgICAgIF90aGlzLm5vdGlmeU9ic2VydmVycyhwcmV2U3RvcmUsIG51bGwsIHtcbiAgICAgICAgdHlwZTogJ3Jlc2V0J1xuICAgICAgfSk7XG4gICAgICBfdGhpcy5ub3RpZnlXYXRjaCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IGJ5IGBuYW1lTGlzdGBcbiAgICB2YXIgbmFtZVBhdGhMaXN0ID0gbmFtZUxpc3QubWFwKGdldE5hbWVQYXRoKTtcbiAgICBuYW1lUGF0aExpc3QuZm9yRWFjaChmdW5jdGlvbiAobmFtZVBhdGgpIHtcbiAgICAgIHZhciBpbml0aWFsVmFsdWUgPSBfdGhpcy5nZXRJbml0aWFsVmFsdWUobmFtZVBhdGgpO1xuICAgICAgX3RoaXMudXBkYXRlU3RvcmUoc2V0VmFsdWUoX3RoaXMuc3RvcmUsIG5hbWVQYXRoLCBpbml0aWFsVmFsdWUpKTtcbiAgICB9KTtcbiAgICBfdGhpcy5yZXNldFdpdGhGaWVsZEluaXRpYWxWYWx1ZSh7XG4gICAgICBuYW1lUGF0aExpc3Q6IG5hbWVQYXRoTGlzdFxuICAgIH0pO1xuICAgIF90aGlzLm5vdGlmeU9ic2VydmVycyhwcmV2U3RvcmUsIG5hbWVQYXRoTGlzdCwge1xuICAgICAgdHlwZTogJ3Jlc2V0J1xuICAgIH0pO1xuICAgIF90aGlzLm5vdGlmeVdhdGNoKG5hbWVQYXRoTGlzdCk7XG4gIH0pO1xuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJzZXRGaWVsZHNcIiwgZnVuY3Rpb24gKGZpZWxkcykge1xuICAgIF90aGlzLndhcm5pbmdVbmhvb2tlZCgpO1xuICAgIHZhciBwcmV2U3RvcmUgPSBfdGhpcy5zdG9yZTtcbiAgICB2YXIgbmFtZVBhdGhMaXN0ID0gW107XG4gICAgZmllbGRzLmZvckVhY2goZnVuY3Rpb24gKGZpZWxkRGF0YSkge1xuICAgICAgdmFyIG5hbWUgPSBmaWVsZERhdGEubmFtZSxcbiAgICAgICAgZGF0YSA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhmaWVsZERhdGEsIF9leGNsdWRlZCk7XG4gICAgICB2YXIgbmFtZVBhdGggPSBnZXROYW1lUGF0aChuYW1lKTtcbiAgICAgIG5hbWVQYXRoTGlzdC5wdXNoKG5hbWVQYXRoKTtcblxuICAgICAgLy8gVmFsdWVcbiAgICAgIGlmICgndmFsdWUnIGluIGRhdGEpIHtcbiAgICAgICAgX3RoaXMudXBkYXRlU3RvcmUoc2V0VmFsdWUoX3RoaXMuc3RvcmUsIG5hbWVQYXRoLCBkYXRhLnZhbHVlKSk7XG4gICAgICB9XG4gICAgICBfdGhpcy5ub3RpZnlPYnNlcnZlcnMocHJldlN0b3JlLCBbbmFtZVBhdGhdLCB7XG4gICAgICAgIHR5cGU6ICdzZXRGaWVsZCcsXG4gICAgICAgIGRhdGE6IGZpZWxkRGF0YVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgX3RoaXMubm90aWZ5V2F0Y2gobmFtZVBhdGhMaXN0KTtcbiAgfSk7XG4gIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImdldEZpZWxkc1wiLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGVudGl0aWVzID0gX3RoaXMuZ2V0RmllbGRFbnRpdGllcyh0cnVlKTtcbiAgICB2YXIgZmllbGRzID0gZW50aXRpZXMubWFwKGZ1bmN0aW9uIChmaWVsZCkge1xuICAgICAgdmFyIG5hbWVQYXRoID0gZmllbGQuZ2V0TmFtZVBhdGgoKTtcbiAgICAgIHZhciBtZXRhID0gZmllbGQuZ2V0TWV0YSgpO1xuICAgICAgdmFyIGZpZWxkRGF0YSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgbWV0YSksIHt9LCB7XG4gICAgICAgIG5hbWU6IG5hbWVQYXRoLFxuICAgICAgICB2YWx1ZTogX3RoaXMuZ2V0RmllbGRWYWx1ZShuYW1lUGF0aClcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZpZWxkRGF0YSwgJ29yaWdpblJDRmllbGQnLCB7XG4gICAgICAgIHZhbHVlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmaWVsZERhdGE7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZpZWxkcztcbiAgfSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBPYnNlcnZlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLyoqXG4gICAqIFRoaXMgb25seSB0cmlnZ2VyIHdoZW4gYSBmaWVsZCBpcyBvbiBjb25zdHJ1Y3RvciB0byBhdm9pZCB3ZSBnZXQgaW5pdGlhbFZhbHVlIHRvbyBsYXRlXG4gICAqL1xuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJpbml0RW50aXR5VmFsdWVcIiwgZnVuY3Rpb24gKGVudGl0eSkge1xuICAgIHZhciBpbml0aWFsVmFsdWUgPSBlbnRpdHkucHJvcHMuaW5pdGlhbFZhbHVlO1xuICAgIGlmIChpbml0aWFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIG5hbWVQYXRoID0gZW50aXR5LmdldE5hbWVQYXRoKCk7XG4gICAgICB2YXIgcHJldlZhbHVlID0gZ2V0VmFsdWUoX3RoaXMuc3RvcmUsIG5hbWVQYXRoKTtcbiAgICAgIGlmIChwcmV2VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBfdGhpcy51cGRhdGVTdG9yZShzZXRWYWx1ZShfdGhpcy5zdG9yZSwgbmFtZVBhdGgsIGluaXRpYWxWYWx1ZSkpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImlzTWVyZ2VkUHJlc2VydmVcIiwgZnVuY3Rpb24gKGZpZWxkUHJlc2VydmUpIHtcbiAgICB2YXIgbWVyZ2VkUHJlc2VydmUgPSBmaWVsZFByZXNlcnZlICE9PSB1bmRlZmluZWQgPyBmaWVsZFByZXNlcnZlIDogX3RoaXMucHJlc2VydmU7XG4gICAgcmV0dXJuIG1lcmdlZFByZXNlcnZlICE9PSBudWxsICYmIG1lcmdlZFByZXNlcnZlICE9PSB2b2lkIDAgPyBtZXJnZWRQcmVzZXJ2ZSA6IHRydWU7XG4gIH0pO1xuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJyZWdpc3RlckZpZWxkXCIsIGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICBfdGhpcy5maWVsZEVudGl0aWVzLnB1c2goZW50aXR5KTtcbiAgICB2YXIgbmFtZVBhdGggPSBlbnRpdHkuZ2V0TmFtZVBhdGgoKTtcbiAgICBfdGhpcy5ub3RpZnlXYXRjaChbbmFtZVBhdGhdKTtcblxuICAgIC8vIFNldCBpbml0aWFsIHZhbHVlc1xuICAgIGlmIChlbnRpdHkucHJvcHMuaW5pdGlhbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBwcmV2U3RvcmUgPSBfdGhpcy5zdG9yZTtcbiAgICAgIF90aGlzLnJlc2V0V2l0aEZpZWxkSW5pdGlhbFZhbHVlKHtcbiAgICAgICAgZW50aXRpZXM6IFtlbnRpdHldLFxuICAgICAgICBza2lwRXhpc3Q6IHRydWVcbiAgICAgIH0pO1xuICAgICAgX3RoaXMubm90aWZ5T2JzZXJ2ZXJzKHByZXZTdG9yZSwgW2VudGl0eS5nZXROYW1lUGF0aCgpXSwge1xuICAgICAgICB0eXBlOiAndmFsdWVVcGRhdGUnLFxuICAgICAgICBzb3VyY2U6ICdpbnRlcm5hbCdcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIHVuLXJlZ2lzdGVyIGZpZWxkIGNhbGxiYWNrXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChpc0xpc3RGaWVsZCwgcHJlc2VydmUpIHtcbiAgICAgIHZhciBzdWJOYW1lUGF0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogW107XG4gICAgICBfdGhpcy5maWVsZEVudGl0aWVzID0gX3RoaXMuZmllbGRFbnRpdGllcy5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0gIT09IGVudGl0eTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBDbGVhbiB1cCBzdG9yZSB2YWx1ZSBpZiBub3QgcHJlc2VydmVcbiAgICAgIGlmICghX3RoaXMuaXNNZXJnZWRQcmVzZXJ2ZShwcmVzZXJ2ZSkgJiYgKCFpc0xpc3RGaWVsZCB8fCBzdWJOYW1lUGF0aC5sZW5ndGggPiAxKSkge1xuICAgICAgICB2YXIgZGVmYXVsdFZhbHVlID0gaXNMaXN0RmllbGQgPyB1bmRlZmluZWQgOiBfdGhpcy5nZXRJbml0aWFsVmFsdWUobmFtZVBhdGgpO1xuICAgICAgICBpZiAobmFtZVBhdGgubGVuZ3RoICYmIF90aGlzLmdldEZpZWxkVmFsdWUobmFtZVBhdGgpICE9PSBkZWZhdWx0VmFsdWUgJiYgX3RoaXMuZmllbGRFbnRpdGllcy5ldmVyeShmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgLy8gT25seSByZXNldCB3aGVuIG5vIG5hbWVQYXRoIGV4aXN0XG4gICAgICAgICAgICAhbWF0Y2hOYW1lUGF0aChmaWVsZC5nZXROYW1lUGF0aCgpLCBuYW1lUGF0aClcbiAgICAgICAgICApO1xuICAgICAgICB9KSkge1xuICAgICAgICAgIHZhciBfcHJldlN0b3JlID0gX3RoaXMuc3RvcmU7XG4gICAgICAgICAgX3RoaXMudXBkYXRlU3RvcmUoc2V0VmFsdWUoX3ByZXZTdG9yZSwgbmFtZVBhdGgsIGRlZmF1bHRWYWx1ZSwgdHJ1ZSkpO1xuXG4gICAgICAgICAgLy8gTm90aWZ5IHRoYXQgZmllbGQgaXMgdW5tb3VudFxuICAgICAgICAgIF90aGlzLm5vdGlmeU9ic2VydmVycyhfcHJldlN0b3JlLCBbbmFtZVBhdGhdLCB7XG4gICAgICAgICAgICB0eXBlOiAncmVtb3ZlJ1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gRGVwZW5kZW5jaWVzIHVwZGF0ZVxuICAgICAgICAgIF90aGlzLnRyaWdnZXJEZXBlbmRlbmNpZXNVcGRhdGUoX3ByZXZTdG9yZSwgbmFtZVBhdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBfdGhpcy5ub3RpZnlXYXRjaChbbmFtZVBhdGhdKTtcbiAgICB9O1xuICB9KTtcbiAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiZGlzcGF0Y2hcIiwgZnVuY3Rpb24gKGFjdGlvbikge1xuICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgIGNhc2UgJ3VwZGF0ZVZhbHVlJzpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBuYW1lUGF0aCA9IGFjdGlvbi5uYW1lUGF0aCxcbiAgICAgICAgICAgIHZhbHVlID0gYWN0aW9uLnZhbHVlO1xuICAgICAgICAgIF90aGlzLnVwZGF0ZVZhbHVlKG5hbWVQYXRoLCB2YWx1ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJ3ZhbGlkYXRlRmllbGQnOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9uYW1lUGF0aCA9IGFjdGlvbi5uYW1lUGF0aCxcbiAgICAgICAgICAgIHRyaWdnZXJOYW1lID0gYWN0aW9uLnRyaWdnZXJOYW1lO1xuICAgICAgICAgIF90aGlzLnZhbGlkYXRlRmllbGRzKFtfbmFtZVBhdGhdLCB7XG4gICAgICAgICAgICB0cmlnZ2VyTmFtZTogdHJpZ2dlck5hbWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgIC8vIEN1cnJlbnRseSB3ZSBkb24ndCBoYXZlIG90aGVyIGFjdGlvbi4gRG8gbm90aGluZy5cbiAgICB9XG4gIH0pO1xuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJub3RpZnlPYnNlcnZlcnNcIiwgZnVuY3Rpb24gKHByZXZTdG9yZSwgbmFtZVBhdGhMaXN0LCBpbmZvKSB7XG4gICAgaWYgKF90aGlzLnN1YnNjcmliYWJsZSkge1xuICAgICAgdmFyIG1lcmdlZEluZm8gPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGluZm8pLCB7fSwge1xuICAgICAgICBzdG9yZTogX3RoaXMuZ2V0RmllbGRzVmFsdWUodHJ1ZSlcbiAgICAgIH0pO1xuICAgICAgX3RoaXMuZ2V0RmllbGRFbnRpdGllcygpLmZvckVhY2goZnVuY3Rpb24gKF9yZWY1KSB7XG4gICAgICAgIHZhciBvblN0b3JlQ2hhbmdlID0gX3JlZjUub25TdG9yZUNoYW5nZTtcbiAgICAgICAgb25TdG9yZUNoYW5nZShwcmV2U3RvcmUsIG5hbWVQYXRoTGlzdCwgbWVyZ2VkSW5mbyk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgX3RoaXMuZm9yY2VSb290VXBkYXRlKCk7XG4gICAgfVxuICB9KTtcbiAgLyoqXG4gICAqIE5vdGlmeSBkZXBlbmRlbmNpZXMgY2hpbGRyZW4gd2l0aCBwYXJlbnQgdXBkYXRlXG4gICAqIFdlIG5lZWQgZGVsYXkgdG8gdHJpZ2dlciB2YWxpZGF0ZSBpbiBjYXNlIEZpZWxkIGlzIHVuZGVyIHJlbmRlciBwcm9wc1xuICAgKi9cbiAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwidHJpZ2dlckRlcGVuZGVuY2llc1VwZGF0ZVwiLCBmdW5jdGlvbiAocHJldlN0b3JlLCBuYW1lUGF0aCkge1xuICAgIHZhciBjaGlsZHJlbkZpZWxkcyA9IF90aGlzLmdldERlcGVuZGVuY3lDaGlsZHJlbkZpZWxkcyhuYW1lUGF0aCk7XG4gICAgaWYgKGNoaWxkcmVuRmllbGRzLmxlbmd0aCkge1xuICAgICAgX3RoaXMudmFsaWRhdGVGaWVsZHMoY2hpbGRyZW5GaWVsZHMpO1xuICAgIH1cbiAgICBfdGhpcy5ub3RpZnlPYnNlcnZlcnMocHJldlN0b3JlLCBjaGlsZHJlbkZpZWxkcywge1xuICAgICAgdHlwZTogJ2RlcGVuZGVuY2llc1VwZGF0ZScsXG4gICAgICByZWxhdGVkRmllbGRzOiBbbmFtZVBhdGhdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoY2hpbGRyZW5GaWVsZHMpKVxuICAgIH0pO1xuICAgIHJldHVybiBjaGlsZHJlbkZpZWxkcztcbiAgfSk7XG4gIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInVwZGF0ZVZhbHVlXCIsIGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIHZhciBuYW1lUGF0aCA9IGdldE5hbWVQYXRoKG5hbWUpO1xuICAgIHZhciBwcmV2U3RvcmUgPSBfdGhpcy5zdG9yZTtcbiAgICBfdGhpcy51cGRhdGVTdG9yZShzZXRWYWx1ZShfdGhpcy5zdG9yZSwgbmFtZVBhdGgsIHZhbHVlKSk7XG4gICAgX3RoaXMubm90aWZ5T2JzZXJ2ZXJzKHByZXZTdG9yZSwgW25hbWVQYXRoXSwge1xuICAgICAgdHlwZTogJ3ZhbHVlVXBkYXRlJyxcbiAgICAgIHNvdXJjZTogJ2ludGVybmFsJ1xuICAgIH0pO1xuICAgIF90aGlzLm5vdGlmeVdhdGNoKFtuYW1lUGF0aF0pO1xuXG4gICAgLy8gRGVwZW5kZW5jaWVzIHVwZGF0ZVxuICAgIHZhciBjaGlsZHJlbkZpZWxkcyA9IF90aGlzLnRyaWdnZXJEZXBlbmRlbmNpZXNVcGRhdGUocHJldlN0b3JlLCBuYW1lUGF0aCk7XG5cbiAgICAvLyB0cmlnZ2VyIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAgdmFyIG9uVmFsdWVzQ2hhbmdlID0gX3RoaXMuY2FsbGJhY2tzLm9uVmFsdWVzQ2hhbmdlO1xuICAgIGlmIChvblZhbHVlc0NoYW5nZSkge1xuICAgICAgdmFyIGNoYW5nZWRWYWx1ZXMgPSBjbG9uZUJ5TmFtZVBhdGhMaXN0KF90aGlzLnN0b3JlLCBbbmFtZVBhdGhdKTtcbiAgICAgIG9uVmFsdWVzQ2hhbmdlKGNoYW5nZWRWYWx1ZXMsIF90aGlzLmdldEZpZWxkc1ZhbHVlKCkpO1xuICAgIH1cbiAgICBfdGhpcy50cmlnZ2VyT25GaWVsZHNDaGFuZ2UoW25hbWVQYXRoXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGNoaWxkcmVuRmllbGRzKSkpO1xuICB9KTtcbiAgLy8gTGV0IGFsbCBjaGlsZCBGaWVsZCBnZXQgdXBkYXRlLlxuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJzZXRGaWVsZHNWYWx1ZVwiLCBmdW5jdGlvbiAoc3RvcmUpIHtcbiAgICBfdGhpcy53YXJuaW5nVW5ob29rZWQoKTtcbiAgICB2YXIgcHJldlN0b3JlID0gX3RoaXMuc3RvcmU7XG4gICAgaWYgKHN0b3JlKSB7XG4gICAgICB2YXIgbmV4dFN0b3JlID0gbWVyZ2UoX3RoaXMuc3RvcmUsIHN0b3JlKTtcbiAgICAgIF90aGlzLnVwZGF0ZVN0b3JlKG5leHRTdG9yZSk7XG4gICAgfVxuICAgIF90aGlzLm5vdGlmeU9ic2VydmVycyhwcmV2U3RvcmUsIG51bGwsIHtcbiAgICAgIHR5cGU6ICd2YWx1ZVVwZGF0ZScsXG4gICAgICBzb3VyY2U6ICdleHRlcm5hbCdcbiAgICB9KTtcbiAgICBfdGhpcy5ub3RpZnlXYXRjaCgpO1xuICB9KTtcbiAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwic2V0RmllbGRWYWx1ZVwiLCBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICBfdGhpcy5zZXRGaWVsZHMoW3tcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlcnJvcnM6IFtdLFxuICAgICAgd2FybmluZ3M6IFtdXG4gICAgfV0pO1xuICB9KTtcbiAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiZ2V0RGVwZW5kZW5jeUNoaWxkcmVuRmllbGRzXCIsIGZ1bmN0aW9uIChyb290TmFtZVBhdGgpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBuZXcgU2V0KCk7XG4gICAgdmFyIGNoaWxkcmVuRmllbGRzID0gW107XG4gICAgdmFyIGRlcGVuZGVuY2llczJmaWVsZHMgPSBuZXcgTmFtZU1hcCgpO1xuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgbWFwc1xuICAgICAqIENhbiB1c2UgY2FjaGUgdG8gc2F2ZSBwZXJmIGlmIHVzZXIgcmVwb3J0IHBlcmZvcm1hbmNlIGlzc3VlIHdpdGggdGhpc1xuICAgICAqL1xuICAgIF90aGlzLmdldEZpZWxkRW50aXRpZXMoKS5mb3JFYWNoKGZ1bmN0aW9uIChmaWVsZCkge1xuICAgICAgdmFyIGRlcGVuZGVuY2llcyA9IGZpZWxkLnByb3BzLmRlcGVuZGVuY2llcztcbiAgICAgIChkZXBlbmRlbmNpZXMgfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKGRlcGVuZGVuY3kpIHtcbiAgICAgICAgdmFyIGRlcGVuZGVuY3lOYW1lUGF0aCA9IGdldE5hbWVQYXRoKGRlcGVuZGVuY3kpO1xuICAgICAgICBkZXBlbmRlbmNpZXMyZmllbGRzLnVwZGF0ZShkZXBlbmRlbmN5TmFtZVBhdGgsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgZmllbGRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBuZXcgU2V0KCk7XG4gICAgICAgICAgZmllbGRzLmFkZChmaWVsZCk7XG4gICAgICAgICAgcmV0dXJuIGZpZWxkcztcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB2YXIgZmlsbENoaWxkcmVuID0gZnVuY3Rpb24gZmlsbENoaWxkcmVuKG5hbWVQYXRoKSB7XG4gICAgICB2YXIgZmllbGRzID0gZGVwZW5kZW5jaWVzMmZpZWxkcy5nZXQobmFtZVBhdGgpIHx8IG5ldyBTZXQoKTtcbiAgICAgIGZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChmaWVsZCkge1xuICAgICAgICBpZiAoIWNoaWxkcmVuLmhhcyhmaWVsZCkpIHtcbiAgICAgICAgICBjaGlsZHJlbi5hZGQoZmllbGQpO1xuICAgICAgICAgIHZhciBmaWVsZE5hbWVQYXRoID0gZmllbGQuZ2V0TmFtZVBhdGgoKTtcbiAgICAgICAgICBpZiAoZmllbGQuaXNGaWVsZERpcnR5KCkgJiYgZmllbGROYW1lUGF0aC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNoaWxkcmVuRmllbGRzLnB1c2goZmllbGROYW1lUGF0aCk7XG4gICAgICAgICAgICBmaWxsQ2hpbGRyZW4oZmllbGROYW1lUGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuICAgIGZpbGxDaGlsZHJlbihyb290TmFtZVBhdGgpO1xuICAgIHJldHVybiBjaGlsZHJlbkZpZWxkcztcbiAgfSk7XG4gIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInRyaWdnZXJPbkZpZWxkc0NoYW5nZVwiLCBmdW5jdGlvbiAobmFtZVBhdGhMaXN0LCBmaWxlZEVycm9ycykge1xuICAgIHZhciBvbkZpZWxkc0NoYW5nZSA9IF90aGlzLmNhbGxiYWNrcy5vbkZpZWxkc0NoYW5nZTtcbiAgICBpZiAob25GaWVsZHNDaGFuZ2UpIHtcbiAgICAgIHZhciBmaWVsZHMgPSBfdGhpcy5nZXRGaWVsZHMoKTtcblxuICAgICAgLyoqXG4gICAgICAgKiBGaWxsIGVycm9ycyBzaW5jZSBgZmllbGRzYCBtYXkgYmUgcmVwbGFjZWQgYnkgY29udHJvbGxlZCBmaWVsZHNcbiAgICAgICAqL1xuICAgICAgaWYgKGZpbGVkRXJyb3JzKSB7XG4gICAgICAgIHZhciBjYWNoZSA9IG5ldyBOYW1lTWFwKCk7XG4gICAgICAgIGZpbGVkRXJyb3JzLmZvckVhY2goZnVuY3Rpb24gKF9yZWY2KSB7XG4gICAgICAgICAgdmFyIG5hbWUgPSBfcmVmNi5uYW1lLFxuICAgICAgICAgICAgZXJyb3JzID0gX3JlZjYuZXJyb3JzO1xuICAgICAgICAgIGNhY2hlLnNldChuYW1lLCBlcnJvcnMpO1xuICAgICAgICB9KTtcbiAgICAgICAgZmllbGRzLmZvckVhY2goZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgZmllbGQuZXJyb3JzID0gY2FjaGUuZ2V0KGZpZWxkLm5hbWUpIHx8IGZpZWxkLmVycm9ycztcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB2YXIgY2hhbmdlZEZpZWxkcyA9IGZpZWxkcy5maWx0ZXIoZnVuY3Rpb24gKF9yZWY3KSB7XG4gICAgICAgIHZhciBmaWVsZE5hbWUgPSBfcmVmNy5uYW1lO1xuICAgICAgICByZXR1cm4gY29udGFpbnNOYW1lUGF0aChuYW1lUGF0aExpc3QsIGZpZWxkTmFtZSk7XG4gICAgICB9KTtcbiAgICAgIGlmIChjaGFuZ2VkRmllbGRzLmxlbmd0aCkge1xuICAgICAgICBvbkZpZWxkc0NoYW5nZShjaGFuZ2VkRmllbGRzLCBmaWVsZHMpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBWYWxpZGF0ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwidmFsaWRhdGVGaWVsZHNcIiwgZnVuY3Rpb24gKGFyZzEsIGFyZzIpIHtcbiAgICBfdGhpcy53YXJuaW5nVW5ob29rZWQoKTtcbiAgICB2YXIgbmFtZUxpc3Q7XG4gICAgdmFyIG9wdGlvbnM7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJnMSkgfHwgdHlwZW9mIGFyZzEgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBhcmcyID09PSAnc3RyaW5nJykge1xuICAgICAgbmFtZUxpc3QgPSBhcmcxO1xuICAgICAgb3B0aW9ucyA9IGFyZzI7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbnMgPSBhcmcxO1xuICAgIH1cbiAgICB2YXIgcHJvdmlkZU5hbWVMaXN0ID0gISFuYW1lTGlzdDtcbiAgICB2YXIgbmFtZVBhdGhMaXN0ID0gcHJvdmlkZU5hbWVMaXN0ID8gbmFtZUxpc3QubWFwKGdldE5hbWVQYXRoKSA6IFtdO1xuXG4gICAgLy8gQ29sbGVjdCByZXN1bHQgaW4gcHJvbWlzZSBsaXN0XG4gICAgdmFyIHByb21pc2VMaXN0ID0gW107XG5cbiAgICAvLyBXZSB0ZW1wIHNhdmUgdGhlIHBhdGggd2hpY2ggbmVlZCB0cmlnZ2VyIGZvciBgb25GaWVsZHNDaGFuZ2VgXG4gICAgdmFyIFRNUF9TUExJVCA9IFN0cmluZyhEYXRlLm5vdygpKTtcbiAgICB2YXIgdmFsaWRhdGVOYW1lUGF0aExpc3QgPSBuZXcgU2V0KCk7XG4gICAgdmFyIF9yZWY4ID0gb3B0aW9ucyB8fCB7fSxcbiAgICAgIHJlY3Vyc2l2ZSA9IF9yZWY4LnJlY3Vyc2l2ZSxcbiAgICAgIGRpcnR5ID0gX3JlZjguZGlydHk7XG4gICAgX3RoaXMuZ2V0RmllbGRFbnRpdGllcyh0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChmaWVsZCkge1xuICAgICAgLy8gQWRkIGZpZWxkIGlmIG5vdCBwcm92aWRlIGBuYW1lTGlzdGBcbiAgICAgIGlmICghcHJvdmlkZU5hbWVMaXN0KSB7XG4gICAgICAgIG5hbWVQYXRoTGlzdC5wdXNoKGZpZWxkLmdldE5hbWVQYXRoKCkpO1xuICAgICAgfVxuXG4gICAgICAvLyBTa2lwIGlmIHdpdGhvdXQgcnVsZVxuICAgICAgaWYgKCFmaWVsZC5wcm9wcy5ydWxlcyB8fCAhZmllbGQucHJvcHMucnVsZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gU2tpcCBpZiBvbmx5IHZhbGlkYXRlIGRpcnR5IGZpZWxkXG4gICAgICBpZiAoZGlydHkgJiYgIWZpZWxkLmlzRmllbGREaXJ0eSgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBmaWVsZE5hbWVQYXRoID0gZmllbGQuZ2V0TmFtZVBhdGgoKTtcbiAgICAgIHZhbGlkYXRlTmFtZVBhdGhMaXN0LmFkZChmaWVsZE5hbWVQYXRoLmpvaW4oVE1QX1NQTElUKSk7XG5cbiAgICAgIC8vIEFkZCBmaWVsZCB2YWxpZGF0ZSBydWxlIGluIHRvIHByb21pc2UgbGlzdFxuICAgICAgaWYgKCFwcm92aWRlTmFtZUxpc3QgfHwgY29udGFpbnNOYW1lUGF0aChuYW1lUGF0aExpc3QsIGZpZWxkTmFtZVBhdGgsIHJlY3Vyc2l2ZSkpIHtcbiAgICAgICAgdmFyIHByb21pc2UgPSBmaWVsZC52YWxpZGF0ZVJ1bGVzKF9vYmplY3RTcHJlYWQoe1xuICAgICAgICAgIHZhbGlkYXRlTWVzc2FnZXM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZGVmYXVsdFZhbGlkYXRlTWVzc2FnZXMpLCBfdGhpcy52YWxpZGF0ZU1lc3NhZ2VzKVxuICAgICAgICB9LCBvcHRpb25zKSk7XG5cbiAgICAgICAgLy8gV3JhcCBwcm9taXNlIHdpdGggZmllbGRcbiAgICAgICAgcHJvbWlzZUxpc3QucHVzaChwcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiBmaWVsZE5hbWVQYXRoLFxuICAgICAgICAgICAgZXJyb3JzOiBbXSxcbiAgICAgICAgICAgIHdhcm5pbmdzOiBbXVxuICAgICAgICAgIH07XG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChydWxlRXJyb3JzKSB7XG4gICAgICAgICAgdmFyIF9ydWxlRXJyb3JzJGZvckVhY2g7XG4gICAgICAgICAgdmFyIG1lcmdlZEVycm9ycyA9IFtdO1xuICAgICAgICAgIHZhciBtZXJnZWRXYXJuaW5ncyA9IFtdO1xuICAgICAgICAgIChfcnVsZUVycm9ycyRmb3JFYWNoID0gcnVsZUVycm9ycy5mb3JFYWNoKSA9PT0gbnVsbCB8fCBfcnVsZUVycm9ycyRmb3JFYWNoID09PSB2b2lkIDAgfHwgX3J1bGVFcnJvcnMkZm9yRWFjaC5jYWxsKHJ1bGVFcnJvcnMsIGZ1bmN0aW9uIChfcmVmOSkge1xuICAgICAgICAgICAgdmFyIHdhcm5pbmdPbmx5ID0gX3JlZjkucnVsZS53YXJuaW5nT25seSxcbiAgICAgICAgICAgICAgZXJyb3JzID0gX3JlZjkuZXJyb3JzO1xuICAgICAgICAgICAgaWYgKHdhcm5pbmdPbmx5KSB7XG4gICAgICAgICAgICAgIG1lcmdlZFdhcm5pbmdzLnB1c2guYXBwbHkobWVyZ2VkV2FybmluZ3MsIF90b0NvbnN1bWFibGVBcnJheShlcnJvcnMpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG1lcmdlZEVycm9ycy5wdXNoLmFwcGx5KG1lcmdlZEVycm9ycywgX3RvQ29uc3VtYWJsZUFycmF5KGVycm9ycykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChtZXJnZWRFcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3Qoe1xuICAgICAgICAgICAgICBuYW1lOiBmaWVsZE5hbWVQYXRoLFxuICAgICAgICAgICAgICBlcnJvcnM6IG1lcmdlZEVycm9ycyxcbiAgICAgICAgICAgICAgd2FybmluZ3M6IG1lcmdlZFdhcm5pbmdzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IGZpZWxkTmFtZVBhdGgsXG4gICAgICAgICAgICBlcnJvcnM6IG1lcmdlZEVycm9ycyxcbiAgICAgICAgICAgIHdhcm5pbmdzOiBtZXJnZWRXYXJuaW5nc1xuICAgICAgICAgIH07XG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB2YXIgc3VtbWFyeVByb21pc2UgPSBhbGxQcm9taXNlRmluaXNoKHByb21pc2VMaXN0KTtcbiAgICBfdGhpcy5sYXN0VmFsaWRhdGVQcm9taXNlID0gc3VtbWFyeVByb21pc2U7XG5cbiAgICAvLyBOb3RpZnkgZmllbGRzIHdpdGggcnVsZSB0aGF0IHZhbGlkYXRlIGhhcyBmaW5pc2hlZCBhbmQgbmVlZCB1cGRhdGVcbiAgICBzdW1tYXJ5UHJvbWlzZS5jYXRjaChmdW5jdGlvbiAocmVzdWx0cykge1xuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfSkudGhlbihmdW5jdGlvbiAocmVzdWx0cykge1xuICAgICAgdmFyIHJlc3VsdE5hbWVQYXRoTGlzdCA9IHJlc3VsdHMubWFwKGZ1bmN0aW9uIChfcmVmMTApIHtcbiAgICAgICAgdmFyIG5hbWUgPSBfcmVmMTAubmFtZTtcbiAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgICB9KTtcbiAgICAgIF90aGlzLm5vdGlmeU9ic2VydmVycyhfdGhpcy5zdG9yZSwgcmVzdWx0TmFtZVBhdGhMaXN0LCB7XG4gICAgICAgIHR5cGU6ICd2YWxpZGF0ZUZpbmlzaCdcbiAgICAgIH0pO1xuICAgICAgX3RoaXMudHJpZ2dlck9uRmllbGRzQ2hhbmdlKHJlc3VsdE5hbWVQYXRoTGlzdCwgcmVzdWx0cyk7XG4gICAgfSk7XG4gICAgdmFyIHJldHVyblByb21pc2UgPSBzdW1tYXJ5UHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChfdGhpcy5sYXN0VmFsaWRhdGVQcm9taXNlID09PSBzdW1tYXJ5UHJvbWlzZSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKF90aGlzLmdldEZpZWxkc1ZhbHVlKG5hbWVQYXRoTGlzdCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFtdKTtcbiAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVzdWx0cykge1xuICAgICAgdmFyIGVycm9yTGlzdCA9IHJlc3VsdHMuZmlsdGVyKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAmJiByZXN1bHQuZXJyb3JzLmxlbmd0aDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHtcbiAgICAgICAgdmFsdWVzOiBfdGhpcy5nZXRGaWVsZHNWYWx1ZShuYW1lUGF0aExpc3QpLFxuICAgICAgICBlcnJvckZpZWxkczogZXJyb3JMaXN0LFxuICAgICAgICBvdXRPZkRhdGU6IF90aGlzLmxhc3RWYWxpZGF0ZVByb21pc2UgIT09IHN1bW1hcnlQcm9taXNlXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIERvIG5vdCB0aHJvdyBpbiBjb25zb2xlXG4gICAgcmV0dXJuUHJvbWlzZS5jYXRjaChmdW5jdGlvbiAoZSkge1xuICAgICAgcmV0dXJuIGU7XG4gICAgfSk7XG5cbiAgICAvLyBgdmFsaWRhdGluZ2AgY2hhbmdlZC4gVHJpZ2dlciBgb25GaWVsZHNDaGFuZ2VgXG4gICAgdmFyIHRyaWdnZXJOYW1lUGF0aExpc3QgPSBuYW1lUGF0aExpc3QuZmlsdGVyKGZ1bmN0aW9uIChuYW1lUGF0aCkge1xuICAgICAgcmV0dXJuIHZhbGlkYXRlTmFtZVBhdGhMaXN0LmhhcyhuYW1lUGF0aC5qb2luKFRNUF9TUExJVCkpO1xuICAgIH0pO1xuICAgIF90aGlzLnRyaWdnZXJPbkZpZWxkc0NoYW5nZSh0cmlnZ2VyTmFtZVBhdGhMaXN0KTtcbiAgICByZXR1cm4gcmV0dXJuUHJvbWlzZTtcbiAgfSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU3VibWl0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwic3VibWl0XCIsIGZ1bmN0aW9uICgpIHtcbiAgICBfdGhpcy53YXJuaW5nVW5ob29rZWQoKTtcbiAgICBfdGhpcy52YWxpZGF0ZUZpZWxkcygpLnRoZW4oZnVuY3Rpb24gKHZhbHVlcykge1xuICAgICAgdmFyIG9uRmluaXNoID0gX3RoaXMuY2FsbGJhY2tzLm9uRmluaXNoO1xuICAgICAgaWYgKG9uRmluaXNoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgb25GaW5pc2godmFsdWVzKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgLy8gU2hvdWxkIHByaW50IGVycm9yIGlmIHVzZXIgYG9uRmluaXNoYCBjYWxsYmFjayBmYWlsZWRcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIG9uRmluaXNoRmFpbGVkID0gX3RoaXMuY2FsbGJhY2tzLm9uRmluaXNoRmFpbGVkO1xuICAgICAgaWYgKG9uRmluaXNoRmFpbGVkKSB7XG4gICAgICAgIG9uRmluaXNoRmFpbGVkKGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgdGhpcy5mb3JjZVJvb3RVcGRhdGUgPSBmb3JjZVJvb3RVcGRhdGU7XG59KTtcbmZ1bmN0aW9uIHVzZUZvcm0oZm9ybSkge1xuICB2YXIgZm9ybVJlZiA9IFJlYWN0LnVzZVJlZigpO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoe30pLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIGZvcmNlVXBkYXRlID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgaWYgKCFmb3JtUmVmLmN1cnJlbnQpIHtcbiAgICBpZiAoZm9ybSkge1xuICAgICAgZm9ybVJlZi5jdXJyZW50ID0gZm9ybTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3JlYXRlIGEgbmV3IEZvcm1TdG9yZSBpZiBub3QgcHJvdmlkZWRcbiAgICAgIHZhciBmb3JjZVJlUmVuZGVyID0gZnVuY3Rpb24gZm9yY2VSZVJlbmRlcigpIHtcbiAgICAgICAgZm9yY2VVcGRhdGUoe30pO1xuICAgICAgfTtcbiAgICAgIHZhciBmb3JtU3RvcmUgPSBuZXcgRm9ybVN0b3JlKGZvcmNlUmVSZW5kZXIpO1xuICAgICAgZm9ybVJlZi5jdXJyZW50ID0gZm9ybVN0b3JlLmdldEZvcm0oKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtmb3JtUmVmLmN1cnJlbnRdO1xufVxuZXhwb3J0IGRlZmF1bHQgdXNlRm9ybTsiLCAiZXhwb3J0IGZ1bmN0aW9uIGFsbFByb21pc2VGaW5pc2gocHJvbWlzZUxpc3QpIHtcbiAgdmFyIGhhc0Vycm9yID0gZmFsc2U7XG4gIHZhciBjb3VudCA9IHByb21pc2VMaXN0Lmxlbmd0aDtcbiAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgaWYgKCFwcm9taXNlTGlzdC5sZW5ndGgpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKTtcbiAgfVxuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHByb21pc2VMaXN0LmZvckVhY2goZnVuY3Rpb24gKHByb21pc2UsIGluZGV4KSB7XG4gICAgICBwcm9taXNlLmNhdGNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgY291bnQgLT0gMTtcbiAgICAgICAgcmVzdWx0c1tpbmRleF0gPSByZXN1bHQ7XG4gICAgICAgIGlmIChjb3VudCA+IDApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc0Vycm9yKSB7XG4gICAgICAgICAgcmVqZWN0KHJlc3VsdHMpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUocmVzdWx0cyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59IiwgImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbnZhciBTUExJVCA9ICdfX0BmaWVsZF9zcGxpdF9fJztcblxuLyoqXG4gKiBDb252ZXJ0IG5hbWUgcGF0aCBpbnRvIHN0cmluZyB0byBmYXN0IHRoZSBmZXRjaCBzcGVlZCBvZiBNYXAuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZShuYW1lUGF0aCkge1xuICByZXR1cm4gbmFtZVBhdGgubWFwKGZ1bmN0aW9uIChjZWxsKSB7XG4gICAgcmV0dXJuIFwiXCIuY29uY2F0KF90eXBlb2YoY2VsbCksIFwiOlwiKS5jb25jYXQoY2VsbCk7XG4gIH0pXG4gIC8vIE1hZ2ljIHNwbGl0XG4gIC5qb2luKFNQTElUKTtcbn1cblxuLyoqXG4gKiBOYW1lTWFwIGxpa2UgYSBgTWFwYCBidXQgYWNjZXB0cyBgc3RyaW5nW11gIGFzIGtleS5cbiAqL1xudmFyIE5hbWVNYXAgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBOYW1lTWFwKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBOYW1lTWFwKTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJrdnNcIiwgbmV3IE1hcCgpKTtcbiAgfVxuICBfY3JlYXRlQ2xhc3MoTmFtZU1hcCwgW3tcbiAgICBrZXk6IFwic2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICB0aGlzLmt2cy5zZXQobm9ybWFsaXplKGtleSksIHZhbHVlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLmt2cy5nZXQobm9ybWFsaXplKGtleSkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1cGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlKGtleSwgdXBkYXRlcikge1xuICAgICAgdmFyIG9yaWdpbiA9IHRoaXMuZ2V0KGtleSk7XG4gICAgICB2YXIgbmV4dCA9IHVwZGF0ZXIob3JpZ2luKTtcbiAgICAgIGlmICghbmV4dCkge1xuICAgICAgICB0aGlzLmRlbGV0ZShrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXQoa2V5LCBuZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGVsZXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9kZWxldGUoa2V5KSB7XG4gICAgICB0aGlzLmt2cy5kZWxldGUobm9ybWFsaXplKGtleSkpO1xuICAgIH1cblxuICAgIC8vIFNpbmNlIHdlIG9ubHkgdXNlIHRoaXMgaW4gdGVzdCwgbGV0IHNpbXBseSByZWFsaXplIHRoaXNcbiAgfSwge1xuICAgIGtleTogXCJtYXBcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWFwKGNhbGxiYWNrKSB7XG4gICAgICByZXR1cm4gX3RvQ29uc3VtYWJsZUFycmF5KHRoaXMua3ZzLmVudHJpZXMoKSkubWFwKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICAgIHZhciBfcmVmMiA9IF9zbGljZWRUb0FycmF5KF9yZWYsIDIpLFxuICAgICAgICAgIGtleSA9IF9yZWYyWzBdLFxuICAgICAgICAgIHZhbHVlID0gX3JlZjJbMV07XG4gICAgICAgIHZhciBjZWxscyA9IGtleS5zcGxpdChTUExJVCk7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayh7XG4gICAgICAgICAga2V5OiBjZWxscy5tYXAoZnVuY3Rpb24gKGNlbGwpIHtcbiAgICAgICAgICAgIHZhciBfY2VsbCRtYXRjaCA9IGNlbGwubWF0Y2goL14oW146XSopOiguKikkLyksXG4gICAgICAgICAgICAgIF9jZWxsJG1hdGNoMiA9IF9zbGljZWRUb0FycmF5KF9jZWxsJG1hdGNoLCAzKSxcbiAgICAgICAgICAgICAgdHlwZSA9IF9jZWxsJG1hdGNoMlsxXSxcbiAgICAgICAgICAgICAgdW5pdCA9IF9jZWxsJG1hdGNoMlsyXTtcbiAgICAgICAgICAgIHJldHVybiB0eXBlID09PSAnbnVtYmVyJyA/IE51bWJlcih1bml0KSA6IHVuaXQ7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRvSlNPTlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b0pTT04oKSB7XG4gICAgICB2YXIganNvbiA9IHt9O1xuICAgICAgdGhpcy5tYXAoZnVuY3Rpb24gKF9yZWYzKSB7XG4gICAgICAgIHZhciBrZXkgPSBfcmVmMy5rZXksXG4gICAgICAgICAgdmFsdWUgPSBfcmVmMy52YWx1ZTtcbiAgICAgICAganNvbltrZXkuam9pbignLicpXSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGpzb247XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBOYW1lTWFwO1xufSgpO1xuZXhwb3J0IGRlZmF1bHQgTmFtZU1hcDsiLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcIm5hbWVcIiwgXCJpbml0aWFsVmFsdWVzXCIsIFwiZmllbGRzXCIsIFwiZm9ybVwiLCBcInByZXNlcnZlXCIsIFwiY2hpbGRyZW5cIiwgXCJjb21wb25lbnRcIiwgXCJ2YWxpZGF0ZU1lc3NhZ2VzXCIsIFwidmFsaWRhdGVUcmlnZ2VyXCIsIFwib25WYWx1ZXNDaGFuZ2VcIiwgXCJvbkZpZWxkc0NoYW5nZVwiLCBcIm9uRmluaXNoXCIsIFwib25GaW5pc2hGYWlsZWRcIiwgXCJjbGVhck9uRGVzdHJveVwiXTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VGb3JtIGZyb20gXCIuL3VzZUZvcm1cIjtcbmltcG9ydCBGaWVsZENvbnRleHQsIHsgSE9PS19NQVJLIH0gZnJvbSBcIi4vRmllbGRDb250ZXh0XCI7XG5pbXBvcnQgRm9ybUNvbnRleHQgZnJvbSBcIi4vRm9ybUNvbnRleHRcIjtcbmltcG9ydCB7IGlzU2ltaWxhciB9IGZyb20gXCIuL3V0aWxzL3ZhbHVlVXRpbFwiO1xuaW1wb3J0IExpc3RDb250ZXh0IGZyb20gXCIuL0xpc3RDb250ZXh0XCI7XG52YXIgRm9ybSA9IGZ1bmN0aW9uIEZvcm0oX3JlZiwgcmVmKSB7XG4gIHZhciBuYW1lID0gX3JlZi5uYW1lLFxuICAgIGluaXRpYWxWYWx1ZXMgPSBfcmVmLmluaXRpYWxWYWx1ZXMsXG4gICAgZmllbGRzID0gX3JlZi5maWVsZHMsXG4gICAgZm9ybSA9IF9yZWYuZm9ybSxcbiAgICBwcmVzZXJ2ZSA9IF9yZWYucHJlc2VydmUsXG4gICAgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuLFxuICAgIF9yZWYkY29tcG9uZW50ID0gX3JlZi5jb21wb25lbnQsXG4gICAgQ29tcG9uZW50ID0gX3JlZiRjb21wb25lbnQgPT09IHZvaWQgMCA/ICdmb3JtJyA6IF9yZWYkY29tcG9uZW50LFxuICAgIHZhbGlkYXRlTWVzc2FnZXMgPSBfcmVmLnZhbGlkYXRlTWVzc2FnZXMsXG4gICAgX3JlZiR2YWxpZGF0ZVRyaWdnZXIgPSBfcmVmLnZhbGlkYXRlVHJpZ2dlcixcbiAgICB2YWxpZGF0ZVRyaWdnZXIgPSBfcmVmJHZhbGlkYXRlVHJpZ2dlciA9PT0gdm9pZCAwID8gJ29uQ2hhbmdlJyA6IF9yZWYkdmFsaWRhdGVUcmlnZ2VyLFxuICAgIG9uVmFsdWVzQ2hhbmdlID0gX3JlZi5vblZhbHVlc0NoYW5nZSxcbiAgICBfb25GaWVsZHNDaGFuZ2UgPSBfcmVmLm9uRmllbGRzQ2hhbmdlLFxuICAgIF9vbkZpbmlzaCA9IF9yZWYub25GaW5pc2gsXG4gICAgb25GaW5pc2hGYWlsZWQgPSBfcmVmLm9uRmluaXNoRmFpbGVkLFxuICAgIGNsZWFyT25EZXN0cm95ID0gX3JlZi5jbGVhck9uRGVzdHJveSxcbiAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZiwgX2V4Y2x1ZGVkKTtcbiAgdmFyIG5hdGl2ZUVsZW1lbnRSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHZhciBmb3JtQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoRm9ybUNvbnRleHQpO1xuXG4gIC8vIFdlIGN1c3RvbWl6ZSBoYW5kbGUgZXZlbnQgc2luY2UgQ29udGV4dCB3aWxsIG1ha2VzIGFsbCB0aGUgY29uc3VtZXIgcmUtcmVuZGVyOlxuICAvLyBodHRwczovL3JlYWN0anMub3JnL2RvY3MvY29udGV4dC5odG1sI2NvbnRleHRwcm92aWRlclxuICB2YXIgX3VzZUZvcm0gPSB1c2VGb3JtKGZvcm0pLFxuICAgIF91c2VGb3JtMiA9IF9zbGljZWRUb0FycmF5KF91c2VGb3JtLCAxKSxcbiAgICBmb3JtSW5zdGFuY2UgPSBfdXNlRm9ybTJbMF07XG4gIHZhciBfZ2V0SW50ZXJuYWxIb29rcyA9IGZvcm1JbnN0YW5jZS5nZXRJbnRlcm5hbEhvb2tzKEhPT0tfTUFSSyksXG4gICAgdXNlU3Vic2NyaWJlID0gX2dldEludGVybmFsSG9va3MudXNlU3Vic2NyaWJlLFxuICAgIHNldEluaXRpYWxWYWx1ZXMgPSBfZ2V0SW50ZXJuYWxIb29rcy5zZXRJbml0aWFsVmFsdWVzLFxuICAgIHNldENhbGxiYWNrcyA9IF9nZXRJbnRlcm5hbEhvb2tzLnNldENhbGxiYWNrcyxcbiAgICBzZXRWYWxpZGF0ZU1lc3NhZ2VzID0gX2dldEludGVybmFsSG9va3Muc2V0VmFsaWRhdGVNZXNzYWdlcyxcbiAgICBzZXRQcmVzZXJ2ZSA9IF9nZXRJbnRlcm5hbEhvb2tzLnNldFByZXNlcnZlLFxuICAgIGRlc3Ryb3lGb3JtID0gX2dldEludGVybmFsSG9va3MuZGVzdHJveUZvcm07XG5cbiAgLy8gUGFzcyByZWYgd2l0aCBmb3JtIGluc3RhbmNlXG4gIFJlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZm9ybUluc3RhbmNlKSwge30sIHtcbiAgICAgIG5hdGl2ZUVsZW1lbnQ6IG5hdGl2ZUVsZW1lbnRSZWYuY3VycmVudFxuICAgIH0pO1xuICB9KTtcblxuICAvLyBSZWdpc3RlciBmb3JtIGludG8gQ29udGV4dFxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGZvcm1Db250ZXh0LnJlZ2lzdGVyRm9ybShuYW1lLCBmb3JtSW5zdGFuY2UpO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3JtQ29udGV4dC51bnJlZ2lzdGVyRm9ybShuYW1lKTtcbiAgICB9O1xuICB9LCBbZm9ybUNvbnRleHQsIGZvcm1JbnN0YW5jZSwgbmFtZV0pO1xuXG4gIC8vIFBhc3MgcHJvcHMgdG8gc3RvcmVcbiAgc2V0VmFsaWRhdGVNZXNzYWdlcyhfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGZvcm1Db250ZXh0LnZhbGlkYXRlTWVzc2FnZXMpLCB2YWxpZGF0ZU1lc3NhZ2VzKSk7XG4gIHNldENhbGxiYWNrcyh7XG4gICAgb25WYWx1ZXNDaGFuZ2U6IG9uVmFsdWVzQ2hhbmdlLFxuICAgIG9uRmllbGRzQ2hhbmdlOiBmdW5jdGlvbiBvbkZpZWxkc0NoYW5nZShjaGFuZ2VkRmllbGRzKSB7XG4gICAgICBmb3JtQ29udGV4dC50cmlnZ2VyRm9ybUNoYW5nZShuYW1lLCBjaGFuZ2VkRmllbGRzKTtcbiAgICAgIGlmIChfb25GaWVsZHNDaGFuZ2UpIHtcbiAgICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHJlc3QgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICAgIHJlc3RbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgICB9XG4gICAgICAgIF9vbkZpZWxkc0NoYW5nZS5hcHBseSh2b2lkIDAsIFtjaGFuZ2VkRmllbGRzXS5jb25jYXQocmVzdCkpO1xuICAgICAgfVxuICAgIH0sXG4gICAgb25GaW5pc2g6IGZ1bmN0aW9uIG9uRmluaXNoKHZhbHVlcykge1xuICAgICAgZm9ybUNvbnRleHQudHJpZ2dlckZvcm1GaW5pc2gobmFtZSwgdmFsdWVzKTtcbiAgICAgIGlmIChfb25GaW5pc2gpIHtcbiAgICAgICAgX29uRmluaXNoKHZhbHVlcyk7XG4gICAgICB9XG4gICAgfSxcbiAgICBvbkZpbmlzaEZhaWxlZDogb25GaW5pc2hGYWlsZWRcbiAgfSk7XG4gIHNldFByZXNlcnZlKHByZXNlcnZlKTtcblxuICAvLyBTZXQgaW5pdGlhbCB2YWx1ZSwgaW5pdCBzdG9yZSB2YWx1ZSB3aGVuIGZpcnN0IG1vdW50XG4gIHZhciBtb3VudFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgc2V0SW5pdGlhbFZhbHVlcyhpbml0aWFsVmFsdWVzLCAhbW91bnRSZWYuY3VycmVudCk7XG4gIGlmICghbW91bnRSZWYuY3VycmVudCkge1xuICAgIG1vdW50UmVmLmN1cnJlbnQgPSB0cnVlO1xuICB9XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBkZXN0cm95Rm9ybShjbGVhck9uRGVzdHJveSk7XG4gICAgfTtcbiAgfSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICBbXSk7XG5cbiAgLy8gUHJlcGFyZSBjaGlsZHJlbiBieSBgY2hpbGRyZW5gIHR5cGVcbiAgdmFyIGNoaWxkcmVuTm9kZTtcbiAgdmFyIGNoaWxkcmVuUmVuZGVyUHJvcHMgPSB0eXBlb2YgY2hpbGRyZW4gPT09ICdmdW5jdGlvbic7XG4gIGlmIChjaGlsZHJlblJlbmRlclByb3BzKSB7XG4gICAgdmFyIF92YWx1ZXMgPSBmb3JtSW5zdGFuY2UuZ2V0RmllbGRzVmFsdWUodHJ1ZSk7XG4gICAgY2hpbGRyZW5Ob2RlID0gY2hpbGRyZW4oX3ZhbHVlcywgZm9ybUluc3RhbmNlKTtcbiAgfSBlbHNlIHtcbiAgICBjaGlsZHJlbk5vZGUgPSBjaGlsZHJlbjtcbiAgfVxuXG4gIC8vIE5vdCB1c2Ugc3Vic2NyaWJlIHdoZW4gdXNpbmcgcmVuZGVyIHByb3BzXG4gIHVzZVN1YnNjcmliZSghY2hpbGRyZW5SZW5kZXJQcm9wcyk7XG5cbiAgLy8gTGlzdGVuIGlmIGZpZWxkcyBwcm92aWRlZC4gV2UgdXNlIHJlZiB0byBzYXZlIHByZXYgZGF0YSBoZXJlIHRvIGF2b2lkIGFkZGl0aW9uYWwgcmVuZGVyXG4gIHZhciBwcmV2RmllbGRzUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFpc1NpbWlsYXIocHJldkZpZWxkc1JlZi5jdXJyZW50IHx8IFtdLCBmaWVsZHMgfHwgW10pKSB7XG4gICAgICBmb3JtSW5zdGFuY2Uuc2V0RmllbGRzKGZpZWxkcyB8fCBbXSk7XG4gICAgfVxuICAgIHByZXZGaWVsZHNSZWYuY3VycmVudCA9IGZpZWxkcztcbiAgfSwgW2ZpZWxkcywgZm9ybUluc3RhbmNlXSk7XG4gIHZhciBmb3JtQ29udGV4dFZhbHVlID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZm9ybUluc3RhbmNlKSwge30sIHtcbiAgICAgIHZhbGlkYXRlVHJpZ2dlcjogdmFsaWRhdGVUcmlnZ2VyXG4gICAgfSk7XG4gIH0sIFtmb3JtSW5zdGFuY2UsIHZhbGlkYXRlVHJpZ2dlcl0pO1xuICB2YXIgd3JhcHBlck5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMaXN0Q29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBudWxsXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZpZWxkQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBmb3JtQ29udGV4dFZhbHVlXG4gIH0sIGNoaWxkcmVuTm9kZSkpO1xuICBpZiAoQ29tcG9uZW50ID09PSBmYWxzZSkge1xuICAgIHJldHVybiB3cmFwcGVyTm9kZTtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCBfZXh0ZW5kcyh7fSwgcmVzdFByb3BzLCB7XG4gICAgcmVmOiBuYXRpdmVFbGVtZW50UmVmLFxuICAgIG9uU3VibWl0OiBmdW5jdGlvbiBvblN1Ym1pdChldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZm9ybUluc3RhbmNlLnN1Ym1pdCgpO1xuICAgIH0sXG4gICAgb25SZXNldDogZnVuY3Rpb24gb25SZXNldChldmVudCkge1xuICAgICAgdmFyIF9yZXN0UHJvcHMkb25SZXNldDtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBmb3JtSW5zdGFuY2UucmVzZXRGaWVsZHMoKTtcbiAgICAgIChfcmVzdFByb3BzJG9uUmVzZXQgPSByZXN0UHJvcHMub25SZXNldCkgPT09IG51bGwgfHwgX3Jlc3RQcm9wcyRvblJlc2V0ID09PSB2b2lkIDAgfHwgX3Jlc3RQcm9wcyRvblJlc2V0LmNhbGwocmVzdFByb3BzLCBldmVudCk7XG4gICAgfVxuICB9KSwgd3JhcHBlck5vZGUpO1xufTtcbmV4cG9ydCBkZWZhdWx0IEZvcm07IiwgImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xudmFyIEZvcm1Db250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQoe1xuICB0cmlnZ2VyRm9ybUNoYW5nZTogZnVuY3Rpb24gdHJpZ2dlckZvcm1DaGFuZ2UoKSB7fSxcbiAgdHJpZ2dlckZvcm1GaW5pc2g6IGZ1bmN0aW9uIHRyaWdnZXJGb3JtRmluaXNoKCkge30sXG4gIHJlZ2lzdGVyRm9ybTogZnVuY3Rpb24gcmVnaXN0ZXJGb3JtKCkge30sXG4gIHVucmVnaXN0ZXJGb3JtOiBmdW5jdGlvbiB1bnJlZ2lzdGVyRm9ybSgpIHt9XG59KTtcbnZhciBGb3JtUHJvdmlkZXIgPSBmdW5jdGlvbiBGb3JtUHJvdmlkZXIoX3JlZikge1xuICB2YXIgdmFsaWRhdGVNZXNzYWdlcyA9IF9yZWYudmFsaWRhdGVNZXNzYWdlcyxcbiAgICBvbkZvcm1DaGFuZ2UgPSBfcmVmLm9uRm9ybUNoYW5nZSxcbiAgICBvbkZvcm1GaW5pc2ggPSBfcmVmLm9uRm9ybUZpbmlzaCxcbiAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW47XG4gIHZhciBmb3JtQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoRm9ybUNvbnRleHQpO1xuICB2YXIgZm9ybXNSZWYgPSBSZWFjdC51c2VSZWYoe30pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRm9ybUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBmb3JtQ29udGV4dCksIHt9LCB7XG4gICAgICB2YWxpZGF0ZU1lc3NhZ2VzOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGZvcm1Db250ZXh0LnZhbGlkYXRlTWVzc2FnZXMpLCB2YWxpZGF0ZU1lc3NhZ2VzKSxcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgLy8gPSAgICAgICAgICAgICAgICAgIEdsb2JhbCBGb3JtIENvbnRyb2wgICAgICAgICAgICAgICAgICA9XG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIHRyaWdnZXJGb3JtQ2hhbmdlOiBmdW5jdGlvbiB0cmlnZ2VyRm9ybUNoYW5nZShuYW1lLCBjaGFuZ2VkRmllbGRzKSB7XG4gICAgICAgIGlmIChvbkZvcm1DaGFuZ2UpIHtcbiAgICAgICAgICBvbkZvcm1DaGFuZ2UobmFtZSwge1xuICAgICAgICAgICAgY2hhbmdlZEZpZWxkczogY2hhbmdlZEZpZWxkcyxcbiAgICAgICAgICAgIGZvcm1zOiBmb3Jtc1JlZi5jdXJyZW50XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9ybUNvbnRleHQudHJpZ2dlckZvcm1DaGFuZ2UobmFtZSwgY2hhbmdlZEZpZWxkcyk7XG4gICAgICB9LFxuICAgICAgdHJpZ2dlckZvcm1GaW5pc2g6IGZ1bmN0aW9uIHRyaWdnZXJGb3JtRmluaXNoKG5hbWUsIHZhbHVlcykge1xuICAgICAgICBpZiAob25Gb3JtRmluaXNoKSB7XG4gICAgICAgICAgb25Gb3JtRmluaXNoKG5hbWUsIHtcbiAgICAgICAgICAgIHZhbHVlczogdmFsdWVzLFxuICAgICAgICAgICAgZm9ybXM6IGZvcm1zUmVmLmN1cnJlbnRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmb3JtQ29udGV4dC50cmlnZ2VyRm9ybUZpbmlzaChuYW1lLCB2YWx1ZXMpO1xuICAgICAgfSxcbiAgICAgIHJlZ2lzdGVyRm9ybTogZnVuY3Rpb24gcmVnaXN0ZXJGb3JtKG5hbWUsIGZvcm0pIHtcbiAgICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgICBmb3Jtc1JlZi5jdXJyZW50ID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBmb3Jtc1JlZi5jdXJyZW50KSwge30sIF9kZWZpbmVQcm9wZXJ0eSh7fSwgbmFtZSwgZm9ybSkpO1xuICAgICAgICB9XG4gICAgICAgIGZvcm1Db250ZXh0LnJlZ2lzdGVyRm9ybShuYW1lLCBmb3JtKTtcbiAgICAgIH0sXG4gICAgICB1bnJlZ2lzdGVyRm9ybTogZnVuY3Rpb24gdW5yZWdpc3RlckZvcm0obmFtZSkge1xuICAgICAgICB2YXIgbmV3Rm9ybXMgPSBfb2JqZWN0U3ByZWFkKHt9LCBmb3Jtc1JlZi5jdXJyZW50KTtcbiAgICAgICAgZGVsZXRlIG5ld0Zvcm1zW25hbWVdO1xuICAgICAgICBmb3Jtc1JlZi5jdXJyZW50ID0gbmV3Rm9ybXM7XG4gICAgICAgIGZvcm1Db250ZXh0LnVucmVnaXN0ZXJGb3JtKG5hbWUpO1xuICAgICAgfVxuICAgIH0pXG4gIH0sIGNoaWxkcmVuKTtcbn07XG5leHBvcnQgeyBGb3JtUHJvdmlkZXIgfTtcbmV4cG9ydCBkZWZhdWx0IEZvcm1Db250ZXh0OyIsICJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCB3YXJuaW5nIGZyb20gXCJyYy11dGlsL2VzL3dhcm5pbmdcIjtcbmltcG9ydCB7IHVzZUNvbnRleHQsIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBGaWVsZENvbnRleHQsIHsgSE9PS19NQVJLIH0gZnJvbSBcIi4vRmllbGRDb250ZXh0XCI7XG5pbXBvcnQgeyBpc0Zvcm1JbnN0YW5jZSB9IGZyb20gXCIuL3V0aWxzL3R5cGVVdGlsXCI7XG5pbXBvcnQgeyBnZXROYW1lUGF0aCwgZ2V0VmFsdWUgfSBmcm9tIFwiLi91dGlscy92YWx1ZVV0aWxcIjtcbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdpZnkodmFsdWUpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gTWF0aC5yYW5kb20oKTtcbiAgfVxufVxudmFyIHVzZVdhdGNoV2FybmluZyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBmdW5jdGlvbiAobmFtZVBhdGgpIHtcbiAgdmFyIGZ1bGx5U3RyID0gbmFtZVBhdGguam9pbignX19SQ19GSUVMRF9GT1JNX1NQTElUX18nKTtcbiAgdmFyIG5hbWVTdHJSZWYgPSB1c2VSZWYoZnVsbHlTdHIpO1xuICB3YXJuaW5nKG5hbWVTdHJSZWYuY3VycmVudCA9PT0gZnVsbHlTdHIsICdgdXNlV2F0Y2hgIGlzIG5vdCBzdXBwb3J0IGR5bmFtaWMgYG5hbWVQYXRoYC4gUGxlYXNlIHByb3ZpZGUgc3RhdGljIGluc3RlYWQuJyk7XG59IDogZnVuY3Rpb24gKCkge307XG5cbi8vIC0tLS0tLS0gc2VsZWN0b3IgdHlwZSAtLS0tLS0tXG5cbi8vIC0tLS0tLS0gc2VsZWN0b3IgdHlwZSBlbmQgLS0tLS0tLVxuXG5mdW5jdGlvbiB1c2VXYXRjaCgpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuICB2YXIgZGVwZW5kZW5jaWVzID0gYXJnc1swXSxcbiAgICBfYXJncyQgPSBhcmdzWzFdLFxuICAgIF9mb3JtID0gX2FyZ3MkID09PSB2b2lkIDAgPyB7fSA6IF9hcmdzJDtcbiAgdmFyIG9wdGlvbnMgPSBpc0Zvcm1JbnN0YW5jZShfZm9ybSkgPyB7XG4gICAgZm9ybTogX2Zvcm1cbiAgfSA6IF9mb3JtO1xuICB2YXIgZm9ybSA9IG9wdGlvbnMuZm9ybTtcbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKCksXG4gICAgX3VzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZSwgMiksXG4gICAgdmFsdWUgPSBfdXNlU3RhdGUyWzBdLFxuICAgIHNldFZhbHVlID0gX3VzZVN0YXRlMlsxXTtcbiAgdmFyIHZhbHVlU3RyID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHN0cmluZ2lmeSh2YWx1ZSk7XG4gIH0sIFt2YWx1ZV0pO1xuICB2YXIgdmFsdWVTdHJSZWYgPSB1c2VSZWYodmFsdWVTdHIpO1xuICB2YWx1ZVN0clJlZi5jdXJyZW50ID0gdmFsdWVTdHI7XG4gIHZhciBmaWVsZENvbnRleHQgPSB1c2VDb250ZXh0KEZpZWxkQ29udGV4dCk7XG4gIHZhciBmb3JtSW5zdGFuY2UgPSBmb3JtIHx8IGZpZWxkQ29udGV4dDtcbiAgdmFyIGlzVmFsaWRGb3JtID0gZm9ybUluc3RhbmNlICYmIGZvcm1JbnN0YW5jZS5faW5pdDtcblxuICAvLyBXYXJuaW5nIGlmIG5vdCBleGlzdCBmb3JtIGluc3RhbmNlXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgd2FybmluZyhhcmdzLmxlbmd0aCA9PT0gMiA/IGZvcm0gPyBpc1ZhbGlkRm9ybSA6IHRydWUgOiBpc1ZhbGlkRm9ybSwgJ3VzZVdhdGNoIHJlcXVpcmVzIGEgZm9ybSBpbnN0YW5jZSBzaW5jZSBpdCBjYW4gbm90IGF1dG8gZGV0ZWN0IGZyb20gY29udGV4dC4nKTtcbiAgfVxuICB2YXIgbmFtZVBhdGggPSBnZXROYW1lUGF0aChkZXBlbmRlbmNpZXMpO1xuICB2YXIgbmFtZVBhdGhSZWYgPSB1c2VSZWYobmFtZVBhdGgpO1xuICBuYW1lUGF0aFJlZi5jdXJyZW50ID0gbmFtZVBhdGg7XG4gIHVzZVdhdGNoV2FybmluZyhuYW1lUGF0aCk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgLy8gU2tpcCBpZiBub3QgZXhpc3QgZm9ybSBpbnN0YW5jZVxuICAgIGlmICghaXNWYWxpZEZvcm0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGdldEZpZWxkc1ZhbHVlID0gZm9ybUluc3RhbmNlLmdldEZpZWxkc1ZhbHVlLFxuICAgICAgZ2V0SW50ZXJuYWxIb29rcyA9IGZvcm1JbnN0YW5jZS5nZXRJbnRlcm5hbEhvb2tzO1xuICAgIHZhciBfZ2V0SW50ZXJuYWxIb29rcyA9IGdldEludGVybmFsSG9va3MoSE9PS19NQVJLKSxcbiAgICAgIHJlZ2lzdGVyV2F0Y2ggPSBfZ2V0SW50ZXJuYWxIb29rcy5yZWdpc3RlcldhdGNoO1xuICAgIHZhciBnZXRXYXRjaFZhbHVlID0gZnVuY3Rpb24gZ2V0V2F0Y2hWYWx1ZSh2YWx1ZXMsIGFsbFZhbHVlcykge1xuICAgICAgdmFyIHdhdGNoVmFsdWUgPSBvcHRpb25zLnByZXNlcnZlID8gYWxsVmFsdWVzIDogdmFsdWVzO1xuICAgICAgcmV0dXJuIHR5cGVvZiBkZXBlbmRlbmNpZXMgPT09ICdmdW5jdGlvbicgPyBkZXBlbmRlbmNpZXMod2F0Y2hWYWx1ZSkgOiBnZXRWYWx1ZSh3YXRjaFZhbHVlLCBuYW1lUGF0aFJlZi5jdXJyZW50KTtcbiAgICB9O1xuICAgIHZhciBjYW5jZWxSZWdpc3RlciA9IHJlZ2lzdGVyV2F0Y2goZnVuY3Rpb24gKHZhbHVlcywgYWxsVmFsdWVzKSB7XG4gICAgICB2YXIgbmV3VmFsdWUgPSBnZXRXYXRjaFZhbHVlKHZhbHVlcywgYWxsVmFsdWVzKTtcbiAgICAgIHZhciBuZXh0VmFsdWVTdHIgPSBzdHJpbmdpZnkobmV3VmFsdWUpO1xuXG4gICAgICAvLyBDb21wYXJlIHN0cmluZ2lmeSBpbiBjYXNlIGl0J3MgbmVzdCBvYmplY3RcbiAgICAgIGlmICh2YWx1ZVN0clJlZi5jdXJyZW50ICE9PSBuZXh0VmFsdWVTdHIpIHtcbiAgICAgICAgdmFsdWVTdHJSZWYuY3VycmVudCA9IG5leHRWYWx1ZVN0cjtcbiAgICAgICAgc2V0VmFsdWUobmV3VmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gVE9ETzogV2UgY2FuIGltcHJvdmUgdGhpcyBwZXJmIGluIGZ1dHVyZVxuICAgIHZhciBpbml0aWFsVmFsdWUgPSBnZXRXYXRjaFZhbHVlKGdldEZpZWxkc1ZhbHVlKCksIGdldEZpZWxkc1ZhbHVlKHRydWUpKTtcblxuICAgIC8vIFJlYWN0IDE4IGhhcyB0aGUgYnVnIHRoYXQgd2lsbCBxdWV1ZSB1cGRhdGUgdHdpY2UgZXZlbiB0aGUgdmFsdWUgaXMgbm90IGNoYW5nZWRcbiAgICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMjcyMTNcbiAgICBpZiAodmFsdWUgIT09IGluaXRpYWxWYWx1ZSkge1xuICAgICAgc2V0VmFsdWUoaW5pdGlhbFZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIGNhbmNlbFJlZ2lzdGVyO1xuICB9LFxuICAvLyBXZSBkbyBub3QgbmVlZCByZS1yZWdpc3RlciBzaW5jZSBuYW1lUGF0aCBjb250ZW50IGlzIHRoZSBzYW1lXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgW2lzVmFsaWRGb3JtXSk7XG4gIHJldHVybiB2YWx1ZTtcbn1cbmV4cG9ydCBkZWZhdWx0IHVzZVdhdGNoOyIsICJpbXBvcnQgeyB1bml0IH0gZnJvbSAnQGFudC1kZXNpZ24vY3NzaW5qcyc7XG5pbXBvcnQgeyBnZW5TdHlsZUhvb2tzLCBtZXJnZVRva2VuIH0gZnJvbSAnLi4vLi4vdGhlbWUvaW50ZXJuYWwnO1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJvdy1TaGFyZWQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5jb25zdCBnZW5HcmlkUm93U3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHNcbiAgfSA9IHRva2VuO1xuICByZXR1cm4ge1xuICAgIC8vIEdyaWQgc3lzdGVtXG4gICAgW2NvbXBvbmVudENsc106IHtcbiAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgIGZsZXhGbG93OiAncm93IHdyYXAnLFxuICAgICAgbWluV2lkdGg6IDAsXG4gICAgICAnJjo6YmVmb3JlLCAmOjphZnRlcic6IHtcbiAgICAgICAgZGlzcGxheTogJ2ZsZXgnXG4gICAgICB9LFxuICAgICAgJyYtbm8td3JhcCc6IHtcbiAgICAgICAgZmxleFdyYXA6ICdub3dyYXAnXG4gICAgICB9LFxuICAgICAgLy8gVGhlIG9yaWdpbiBvZiB0aGUgWC1heGlzXG4gICAgICAnJi1zdGFydCc6IHtcbiAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdmbGV4LXN0YXJ0J1xuICAgICAgfSxcbiAgICAgIC8vIFRoZSBjZW50ZXIgb2YgdGhlIFgtYXhpc1xuICAgICAgJyYtY2VudGVyJzoge1xuICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcidcbiAgICAgIH0sXG4gICAgICAvLyBUaGUgb3Bwb3NpdGUgb2YgdGhlIFgtYXhpc1xuICAgICAgJyYtZW5kJzoge1xuICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2ZsZXgtZW5kJ1xuICAgICAgfSxcbiAgICAgICcmLXNwYWNlLWJldHdlZW4nOiB7XG4gICAgICAgIGp1c3RpZnlDb250ZW50OiAnc3BhY2UtYmV0d2VlbidcbiAgICAgIH0sXG4gICAgICAnJi1zcGFjZS1hcm91bmQnOiB7XG4gICAgICAgIGp1c3RpZnlDb250ZW50OiAnc3BhY2UtYXJvdW5kJ1xuICAgICAgfSxcbiAgICAgICcmLXNwYWNlLWV2ZW5seSc6IHtcbiAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdzcGFjZS1ldmVubHknXG4gICAgICB9LFxuICAgICAgLy8gQWxpZ24gYXQgdGhlIHRvcFxuICAgICAgJyYtdG9wJzoge1xuICAgICAgICBhbGlnbkl0ZW1zOiAnZmxleC1zdGFydCdcbiAgICAgIH0sXG4gICAgICAvLyBBbGlnbiBhdCB0aGUgY2VudGVyXG4gICAgICAnJi1taWRkbGUnOiB7XG4gICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInXG4gICAgICB9LFxuICAgICAgJyYtYm90dG9tJzoge1xuICAgICAgICBhbGlnbkl0ZW1zOiAnZmxleC1lbmQnXG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDb2wtU2hhcmVkID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuY29uc3QgZ2VuR3JpZENvbFN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzXG4gIH0gPSB0b2tlbjtcbiAgcmV0dXJuIHtcbiAgICAvLyBHcmlkIHN5c3RlbVxuICAgIFtjb21wb25lbnRDbHNdOiB7XG4gICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgIG1heFdpZHRoOiAnMTAwJScsXG4gICAgICAvLyBQcmV2ZW50IGNvbHVtbnMgZnJvbSBjb2xsYXBzaW5nIHdoZW4gZW1wdHlcbiAgICAgIG1pbkhlaWdodDogMVxuICAgIH1cbiAgfTtcbn07XG5jb25zdCBnZW5Mb29wR3JpZENvbHVtbnNTdHlsZSA9ICh0b2tlbiwgc2l6ZUNscykgPT4ge1xuICBjb25zdCB7XG4gICAgcHJlZml4Q2xzLFxuICAgIGNvbXBvbmVudENscyxcbiAgICBncmlkQ29sdW1uc1xuICB9ID0gdG9rZW47XG4gIGNvbnN0IGdyaWRDb2x1bW5zU3R5bGUgPSB7fTtcbiAgZm9yIChsZXQgaSA9IGdyaWRDb2x1bW5zOyBpID49IDA7IGktLSkge1xuICAgIGlmIChpID09PSAwKSB7XG4gICAgICBncmlkQ29sdW1uc1N0eWxlW2Ake2NvbXBvbmVudENsc30ke3NpemVDbHN9LSR7aX1gXSA9IHtcbiAgICAgICAgZGlzcGxheTogJ25vbmUnXG4gICAgICB9O1xuICAgICAgZ3JpZENvbHVtbnNTdHlsZVtgJHtjb21wb25lbnRDbHN9LXB1c2gtJHtpfWBdID0ge1xuICAgICAgICBpbnNldElubGluZVN0YXJ0OiAnYXV0bydcbiAgICAgIH07XG4gICAgICBncmlkQ29sdW1uc1N0eWxlW2Ake2NvbXBvbmVudENsc30tcHVsbC0ke2l9YF0gPSB7XG4gICAgICAgIGluc2V0SW5saW5lRW5kOiAnYXV0bydcbiAgICAgIH07XG4gICAgICBncmlkQ29sdW1uc1N0eWxlW2Ake2NvbXBvbmVudENsc30ke3NpemVDbHN9LXB1c2gtJHtpfWBdID0ge1xuICAgICAgICBpbnNldElubGluZVN0YXJ0OiAnYXV0bydcbiAgICAgIH07XG4gICAgICBncmlkQ29sdW1uc1N0eWxlW2Ake2NvbXBvbmVudENsc30ke3NpemVDbHN9LXB1bGwtJHtpfWBdID0ge1xuICAgICAgICBpbnNldElubGluZUVuZDogJ2F1dG8nXG4gICAgICB9O1xuICAgICAgZ3JpZENvbHVtbnNTdHlsZVtgJHtjb21wb25lbnRDbHN9JHtzaXplQ2xzfS1vZmZzZXQtJHtpfWBdID0ge1xuICAgICAgICBtYXJnaW5JbmxpbmVTdGFydDogMFxuICAgICAgfTtcbiAgICAgIGdyaWRDb2x1bW5zU3R5bGVbYCR7Y29tcG9uZW50Q2xzfSR7c2l6ZUNsc30tb3JkZXItJHtpfWBdID0ge1xuICAgICAgICBvcmRlcjogMFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ3JpZENvbHVtbnNTdHlsZVtgJHtjb21wb25lbnRDbHN9JHtzaXplQ2xzfS0ke2l9YF0gPSBbXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy80NDQ1NlxuICAgICAgLy8gRm9ybSBzZXQgYGRpc3BsYXk6IGZsZXhgIG9uIENvbCB3aGljaCB3aWxsIG92ZXJyaWRlIGBkaXNwbGF5OiBibG9ja2AuXG4gICAgICAvLyBMZXQncyBnZXQgaXQgZnJvbSBjc3MgdmFyaWFibGUgdG8gc3VwcG9ydCBvdmVycmlkZS5cbiAgICAgIHtcbiAgICAgICAgWyctLWFudC1kaXNwbGF5J106ICdibG9jaycsXG4gICAgICAgIC8vIEZhbGxiYWNrIHRvIGRpc3BsYXkgaWYgdmFyaWFibGUgbm90IHN1cHBvcnRcbiAgICAgICAgZGlzcGxheTogJ2Jsb2NrJ1xuICAgICAgfSwge1xuICAgICAgICBkaXNwbGF5OiAndmFyKC0tYW50LWRpc3BsYXkpJyxcbiAgICAgICAgZmxleDogYDAgMCAke2kgLyBncmlkQ29sdW1ucyAqIDEwMH0lYCxcbiAgICAgICAgbWF4V2lkdGg6IGAke2kgLyBncmlkQ29sdW1ucyAqIDEwMH0lYFxuICAgICAgfV07XG4gICAgICBncmlkQ29sdW1uc1N0eWxlW2Ake2NvbXBvbmVudENsc30ke3NpemVDbHN9LXB1c2gtJHtpfWBdID0ge1xuICAgICAgICBpbnNldElubGluZVN0YXJ0OiBgJHtpIC8gZ3JpZENvbHVtbnMgKiAxMDB9JWBcbiAgICAgIH07XG4gICAgICBncmlkQ29sdW1uc1N0eWxlW2Ake2NvbXBvbmVudENsc30ke3NpemVDbHN9LXB1bGwtJHtpfWBdID0ge1xuICAgICAgICBpbnNldElubGluZUVuZDogYCR7aSAvIGdyaWRDb2x1bW5zICogMTAwfSVgXG4gICAgICB9O1xuICAgICAgZ3JpZENvbHVtbnNTdHlsZVtgJHtjb21wb25lbnRDbHN9JHtzaXplQ2xzfS1vZmZzZXQtJHtpfWBdID0ge1xuICAgICAgICBtYXJnaW5JbmxpbmVTdGFydDogYCR7aSAvIGdyaWRDb2x1bW5zICogMTAwfSVgXG4gICAgICB9O1xuICAgICAgZ3JpZENvbHVtbnNTdHlsZVtgJHtjb21wb25lbnRDbHN9JHtzaXplQ2xzfS1vcmRlci0ke2l9YF0gPSB7XG4gICAgICAgIG9yZGVyOiBpXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICAvLyBGbGV4IENTUyBWYXJcbiAgZ3JpZENvbHVtbnNTdHlsZVtgJHtjb21wb25lbnRDbHN9JHtzaXplQ2xzfS1mbGV4YF0gPSB7XG4gICAgZmxleDogYHZhcigtLSR7cHJlZml4Q2xzfSR7c2l6ZUNsc30tZmxleClgXG4gIH07XG4gIHJldHVybiBncmlkQ29sdW1uc1N0eWxlO1xufTtcbmNvbnN0IGdlbkdyaWRTdHlsZSA9ICh0b2tlbiwgc2l6ZUNscykgPT4gZ2VuTG9vcEdyaWRDb2x1bW5zU3R5bGUodG9rZW4sIHNpemVDbHMpO1xuY29uc3QgZ2VuR3JpZE1lZGlhU3R5bGUgPSAodG9rZW4sIHNjcmVlblNpemUsIHNpemVDbHMpID0+ICh7XG4gIFtgQG1lZGlhIChtaW4td2lkdGg6ICR7dW5pdChzY3JlZW5TaXplKX0pYF06IE9iamVjdC5hc3NpZ24oe30sIGdlbkdyaWRTdHlsZSh0b2tlbiwgc2l6ZUNscykpXG59KTtcbmV4cG9ydCBjb25zdCBwcmVwYXJlUm93Q29tcG9uZW50VG9rZW4gPSAoKSA9PiAoe30pO1xuZXhwb3J0IGNvbnN0IHByZXBhcmVDb2xDb21wb25lbnRUb2tlbiA9ICgpID0+ICh7fSk7XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRXhwb3J0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuZXhwb3J0IGNvbnN0IHVzZVJvd1N0eWxlID0gZ2VuU3R5bGVIb29rcygnR3JpZCcsIGdlbkdyaWRSb3dTdHlsZSwgcHJlcGFyZVJvd0NvbXBvbmVudFRva2VuKTtcbmV4cG9ydCBjb25zdCBnZXRNZWRpYVNpemUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IG1lZGlhU2l6ZXNNYXAgPSB7XG4gICAgeHM6IHRva2VuLnNjcmVlblhTTWluLFxuICAgIHNtOiB0b2tlbi5zY3JlZW5TTU1pbixcbiAgICBtZDogdG9rZW4uc2NyZWVuTURNaW4sXG4gICAgbGc6IHRva2VuLnNjcmVlbkxHTWluLFxuICAgIHhsOiB0b2tlbi5zY3JlZW5YTE1pbixcbiAgICB4eGw6IHRva2VuLnNjcmVlblhYTE1pblxuICB9O1xuICByZXR1cm4gbWVkaWFTaXplc01hcDtcbn07XG5leHBvcnQgY29uc3QgdXNlQ29sU3R5bGUgPSBnZW5TdHlsZUhvb2tzKCdHcmlkJywgdG9rZW4gPT4ge1xuICBjb25zdCBncmlkVG9rZW4gPSBtZXJnZVRva2VuKHRva2VuLCB7XG4gICAgZ3JpZENvbHVtbnM6IDI0IC8vIFJvdyBpcyBkaXZpZGVkIGludG8gMjQgcGFydHMgaW4gR3JpZFxuICB9KTtcbiAgY29uc3QgZ3JpZE1lZGlhU2l6ZXNNYXAgPSBnZXRNZWRpYVNpemUoZ3JpZFRva2VuKTtcbiAgZGVsZXRlIGdyaWRNZWRpYVNpemVzTWFwLnhzO1xuICByZXR1cm4gW2dlbkdyaWRDb2xTdHlsZShncmlkVG9rZW4pLCBnZW5HcmlkU3R5bGUoZ3JpZFRva2VuLCAnJyksIGdlbkdyaWRTdHlsZShncmlkVG9rZW4sICcteHMnKSwgT2JqZWN0LmtleXMoZ3JpZE1lZGlhU2l6ZXNNYXApLm1hcChrZXkgPT4gZ2VuR3JpZE1lZGlhU3R5bGUoZ3JpZFRva2VuLCBncmlkTWVkaWFTaXplc01hcFtrZXldLCBgLSR7a2V5fWApKS5yZWR1Y2UoKHByZSwgY3VyKSA9PiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZSksIGN1ciksIHt9KV07XG59LCBwcmVwYXJlQ29sQ29tcG9uZW50VG9rZW4pOyIsICJpbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IHsgdW5pdCB9IGZyb20gJ0BhbnQtZGVzaWduL2Nzc2luanMnO1xuaW1wb3J0IHsgZ2V0TWVkaWFTaXplIH0gZnJvbSAnLi4vLi4vZ3JpZC9zdHlsZSc7XG5pbXBvcnQgeyBnZW5Gb2N1c1N0eWxlLCByZXNldENvbXBvbmVudCB9IGZyb20gJy4uLy4uL3N0eWxlJztcbmltcG9ydCB7IGluaXRGYWRlTW90aW9uLCBpbml0Wm9vbU1vdGlvbiB9IGZyb20gJy4uLy4uL3N0eWxlL21vdGlvbic7XG5pbXBvcnQgeyBnZW5TdHlsZUhvb2tzLCBtZXJnZVRva2VuIH0gZnJvbSAnLi4vLi4vdGhlbWUvaW50ZXJuYWwnO1xuZnVuY3Rpb24gYm94KHBvc2l0aW9uKSB7XG4gIHJldHVybiB7XG4gICAgcG9zaXRpb24sXG4gICAgaW5zZXQ6IDBcbiAgfTtcbn1cbmV4cG9ydCBjb25zdCBnZW5Nb2RhbE1hc2tTdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENscyxcbiAgICBhbnRDbHNcbiAgfSA9IHRva2VuO1xuICByZXR1cm4gW3tcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS1yb290YF06IHtcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9JHthbnRDbHN9LXpvb20tZW50ZXIsICR7Y29tcG9uZW50Q2xzfSR7YW50Q2xzfS16b29tLWFwcGVhcmBdOiB7XG4gICAgICAgIC8vIHJlc2V0IHNjYWxlIGF2b2lkIG1vdXNlUG9zaXRpb24gYnVnXG4gICAgICAgIHRyYW5zZm9ybTogJ25vbmUnLFxuICAgICAgICBvcGFjaXR5OiAwLFxuICAgICAgICBhbmltYXRpb25EdXJhdGlvbjogdG9rZW4ubW90aW9uRHVyYXRpb25TbG93LFxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8xMTc3N1xuICAgICAgICB1c2VyU2VsZWN0OiAnbm9uZSdcbiAgICAgIH0sXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8zNzMyOVxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvNDAyNzJcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9JHthbnRDbHN9LXpvb20tbGVhdmUgJHtjb21wb25lbnRDbHN9LWNvbnRlbnRgXToge1xuICAgICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZSdcbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1tYXNrYF06IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYm94KCdmaXhlZCcpKSwge1xuICAgICAgICB6SW5kZXg6IHRva2VuLnpJbmRleFBvcHVwQmFzZSxcbiAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogdG9rZW4uY29sb3JCZ01hc2ssXG4gICAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30taGlkZGVuYF06IHtcbiAgICAgICAgICBkaXNwbGF5OiAnbm9uZSdcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS13cmFwYF06IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYm94KCdmaXhlZCcpKSwge1xuICAgICAgICB6SW5kZXg6IHRva2VuLnpJbmRleFBvcHVwQmFzZSxcbiAgICAgICAgb3ZlcmZsb3c6ICdhdXRvJyxcbiAgICAgICAgb3V0bGluZTogMCxcbiAgICAgICAgV2Via2l0T3ZlcmZsb3dTY3JvbGxpbmc6ICd0b3VjaCdcbiAgICAgIH0pXG4gICAgfVxuICB9LCB7XG4gICAgW2Ake2NvbXBvbmVudENsc30tcm9vdGBdOiBpbml0RmFkZU1vdGlvbih0b2tlbilcbiAgfV07XG59O1xuY29uc3QgZ2VuTW9kYWxTdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENsc1xuICB9ID0gdG9rZW47XG4gIHJldHVybiBbXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBSb290ID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAge1xuICAgIFtgJHtjb21wb25lbnRDbHN9LXJvb3RgXToge1xuICAgICAgW2Ake2NvbXBvbmVudENsc30td3JhcC1ydGxgXToge1xuICAgICAgICBkaXJlY3Rpb246ICdydGwnXG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tY2VudGVyZWRgXToge1xuICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgICAnJjo6YmVmb3JlJzoge1xuICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgICAgIHdpZHRoOiAwLFxuICAgICAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgICAgIHZlcnRpY2FsQWxpZ246ICdtaWRkbGUnLFxuICAgICAgICAgIGNvbnRlbnQ6ICdcIlwiJ1xuICAgICAgICB9LFxuICAgICAgICBbY29tcG9uZW50Q2xzXToge1xuICAgICAgICAgIHRvcDogMCxcbiAgICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJyxcbiAgICAgICAgICBwYWRkaW5nQm90dG9tOiAwLFxuICAgICAgICAgIHRleHRBbGlnbjogJ3N0YXJ0JyxcbiAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiAnbWlkZGxlJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2BAbWVkaWEgKG1heC13aWR0aDogJHt0b2tlbi5zY3JlZW5TTU1heH1weClgXToge1xuICAgICAgICBbY29tcG9uZW50Q2xzXToge1xuICAgICAgICAgIG1heFdpZHRoOiAnY2FsYygxMDB2dyAtIDE2cHgpJyxcbiAgICAgICAgICBtYXJnaW46IGAke3VuaXQodG9rZW4ubWFyZ2luWFMpfSBhdXRvYFxuICAgICAgICB9LFxuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1jZW50ZXJlZGBdOiB7XG4gICAgICAgICAgW2NvbXBvbmVudENsc106IHtcbiAgICAgICAgICAgIGZsZXg6IDFcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBNb2RhbCA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAge1xuICAgIFtjb21wb25lbnRDbHNdOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlc2V0Q29tcG9uZW50KHRva2VuKSksIHtcbiAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgdG9wOiAxMDAsXG4gICAgICB3aWR0aDogJ2F1dG8nLFxuICAgICAgbWF4V2lkdGg6IGBjYWxjKDEwMHZ3IC0gJHt1bml0KHRva2VuLmNhbGModG9rZW4ubWFyZ2luKS5tdWwoMikuZXF1YWwoKSl9KWAsXG4gICAgICBtYXJnaW46ICcwIGF1dG8nLFxuICAgICAgcGFkZGluZ0JvdHRvbTogdG9rZW4ucGFkZGluZ0xHLFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tdGl0bGVgXToge1xuICAgICAgICBtYXJnaW46IDAsXG4gICAgICAgIGNvbG9yOiB0b2tlbi50aXRsZUNvbG9yLFxuICAgICAgICBmb250V2VpZ2h0OiB0b2tlbi5mb250V2VpZ2h0U3Ryb25nLFxuICAgICAgICBmb250U2l6ZTogdG9rZW4udGl0bGVGb250U2l6ZSxcbiAgICAgICAgbGluZUhlaWdodDogdG9rZW4udGl0bGVMaW5lSGVpZ2h0LFxuICAgICAgICB3b3JkV3JhcDogJ2JyZWFrLXdvcmQnXG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tY29udGVudGBdOiB7XG4gICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRva2VuLmNvbnRlbnRCZyxcbiAgICAgICAgYmFja2dyb3VuZENsaXA6ICdwYWRkaW5nLWJveCcsXG4gICAgICAgIGJvcmRlcjogMCxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiB0b2tlbi5ib3JkZXJSYWRpdXNMRyxcbiAgICAgICAgYm94U2hhZG93OiB0b2tlbi5ib3hTaGFkb3csXG4gICAgICAgIHBvaW50ZXJFdmVudHM6ICdhdXRvJyxcbiAgICAgICAgcGFkZGluZzogdG9rZW4uY29udGVudFBhZGRpbmdcbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1jbG9zZWBdOiBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgIHRvcDogdG9rZW4uY2FsYyh0b2tlbi5tb2RhbEhlYWRlckhlaWdodCkuc3ViKHRva2VuLm1vZGFsQ2xvc2VCdG5TaXplKS5kaXYoMikuZXF1YWwoKSxcbiAgICAgICAgaW5zZXRJbmxpbmVFbmQ6IHRva2VuLmNhbGModG9rZW4ubW9kYWxIZWFkZXJIZWlnaHQpLnN1Yih0b2tlbi5tb2RhbENsb3NlQnRuU2l6ZSkuZGl2KDIpLmVxdWFsKCksXG4gICAgICAgIHpJbmRleDogdG9rZW4uY2FsYyh0b2tlbi56SW5kZXhQb3B1cEJhc2UpLmFkZCgxMCkuZXF1YWwoKSxcbiAgICAgICAgcGFkZGluZzogMCxcbiAgICAgICAgY29sb3I6IHRva2VuLm1vZGFsQ2xvc2VJY29uQ29sb3IsXG4gICAgICAgIGZvbnRXZWlnaHQ6IHRva2VuLmZvbnRXZWlnaHRTdHJvbmcsXG4gICAgICAgIGxpbmVIZWlnaHQ6IDEsXG4gICAgICAgIHRleHREZWNvcmF0aW9uOiAnbm9uZScsXG4gICAgICAgIGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgIGJvcmRlclJhZGl1czogdG9rZW4uYm9yZGVyUmFkaXVzU00sXG4gICAgICAgIHdpZHRoOiB0b2tlbi5tb2RhbENsb3NlQnRuU2l6ZSxcbiAgICAgICAgaGVpZ2h0OiB0b2tlbi5tb2RhbENsb3NlQnRuU2l6ZSxcbiAgICAgICAgYm9yZGVyOiAwLFxuICAgICAgICBvdXRsaW5lOiAwLFxuICAgICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgICAgdHJhbnNpdGlvbjogYGNvbG9yICR7dG9rZW4ubW90aW9uRHVyYXRpb25NaWR9LCBiYWNrZ3JvdW5kLWNvbG9yICR7dG9rZW4ubW90aW9uRHVyYXRpb25NaWR9YCxcbiAgICAgICAgJyYteCc6IHtcbiAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgZm9udFNpemU6IHRva2VuLmZvbnRTaXplTEcsXG4gICAgICAgICAgZm9udFN0eWxlOiAnbm9ybWFsJyxcbiAgICAgICAgICBsaW5lSGVpZ2h0OiB1bml0KHRva2VuLm1vZGFsQ2xvc2VCdG5TaXplKSxcbiAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsXG4gICAgICAgICAgdGV4dFRyYW5zZm9ybTogJ25vbmUnLFxuICAgICAgICAgIHRleHRSZW5kZXJpbmc6ICdhdXRvJ1xuICAgICAgICB9LFxuICAgICAgICAnJjpkaXNhYmxlZCc6IHtcbiAgICAgICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZSdcbiAgICAgICAgfSxcbiAgICAgICAgJyY6aG92ZXInOiB7XG4gICAgICAgICAgY29sb3I6IHRva2VuLm1vZGFsQ2xvc2VJY29uSG92ZXJDb2xvcixcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRva2VuLmNvbG9yQmdUZXh0SG92ZXIsXG4gICAgICAgICAgdGV4dERlY29yYXRpb246ICdub25lJ1xuICAgICAgICB9LFxuICAgICAgICAnJjphY3RpdmUnOiB7XG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0b2tlbi5jb2xvckJnVGV4dEFjdGl2ZVxuICAgICAgICB9XG4gICAgICB9LCBnZW5Gb2N1c1N0eWxlKHRva2VuKSksXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1oZWFkZXJgXToge1xuICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JUZXh0LFxuICAgICAgICBiYWNrZ3JvdW5kOiB0b2tlbi5oZWFkZXJCZyxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiBgJHt1bml0KHRva2VuLmJvcmRlclJhZGl1c0xHKX0gJHt1bml0KHRva2VuLmJvcmRlclJhZGl1c0xHKX0gMCAwYCxcbiAgICAgICAgbWFyZ2luQm90dG9tOiB0b2tlbi5oZWFkZXJNYXJnaW5Cb3R0b20sXG4gICAgICAgIHBhZGRpbmc6IHRva2VuLmhlYWRlclBhZGRpbmcsXG4gICAgICAgIGJvcmRlckJvdHRvbTogdG9rZW4uaGVhZGVyQm9yZGVyQm90dG9tXG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tYm9keWBdOiB7XG4gICAgICAgIGZvbnRTaXplOiB0b2tlbi5mb250U2l6ZSxcbiAgICAgICAgbGluZUhlaWdodDogdG9rZW4ubGluZUhlaWdodCxcbiAgICAgICAgd29yZFdyYXA6ICdicmVhay13b3JkJyxcbiAgICAgICAgcGFkZGluZzogdG9rZW4uYm9keVBhZGRpbmcsXG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LWJvZHktc2tlbGV0b25gXToge1xuICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJyxcbiAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICBtYXJnaW46IGAke3VuaXQodG9rZW4ubWFyZ2luKX0gYXV0b2BcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWZvb3RlcmBdOiB7XG4gICAgICAgIHRleHRBbGlnbjogJ2VuZCcsXG4gICAgICAgIGJhY2tncm91bmQ6IHRva2VuLmZvb3RlckJnLFxuICAgICAgICBtYXJnaW5Ub3A6IHRva2VuLmZvb3Rlck1hcmdpblRvcCxcbiAgICAgICAgcGFkZGluZzogdG9rZW4uZm9vdGVyUGFkZGluZyxcbiAgICAgICAgYm9yZGVyVG9wOiB0b2tlbi5mb290ZXJCb3JkZXJUb3AsXG4gICAgICAgIGJvcmRlclJhZGl1czogdG9rZW4uZm9vdGVyQm9yZGVyUmFkaXVzLFxuICAgICAgICBbYD4gJHt0b2tlbi5hbnRDbHN9LWJ0biArICR7dG9rZW4uYW50Q2xzfS1idG5gXToge1xuICAgICAgICAgIG1hcmdpbklubGluZVN0YXJ0OiB0b2tlbi5tYXJnaW5YU1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tb3BlbmBdOiB7XG4gICAgICAgIG92ZXJmbG93OiAnaGlkZGVuJ1xuICAgICAgfVxuICAgIH0pXG4gIH0sXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBQdXJlID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAge1xuICAgIFtgJHtjb21wb25lbnRDbHN9LXB1cmUtcGFuZWxgXToge1xuICAgICAgdG9wOiAnYXV0bycsXG4gICAgICBwYWRkaW5nOiAwLFxuICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1jb250ZW50LFxuICAgICAgICAgICR7Y29tcG9uZW50Q2xzfS1ib2R5LFxuICAgICAgICAgICR7Y29tcG9uZW50Q2xzfS1jb25maXJtLWJvZHktd3JhcHBlcmBdOiB7XG4gICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsXG4gICAgICAgIGZsZXg6ICdhdXRvJ1xuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWNvbmZpcm0tYm9keWBdOiB7XG4gICAgICAgIG1hcmdpbkJvdHRvbTogJ2F1dG8nXG4gICAgICB9XG4gICAgfVxuICB9XTtcbn07XG5jb25zdCBnZW5SVExTdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENsc1xuICB9ID0gdG9rZW47XG4gIHJldHVybiB7XG4gICAgW2Ake2NvbXBvbmVudENsc30tcm9vdGBdOiB7XG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS13cmFwLXJ0bGBdOiB7XG4gICAgICAgIGRpcmVjdGlvbjogJ3J0bCcsXG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LWNvbmZpcm0tYm9keWBdOiB7XG4gICAgICAgICAgZGlyZWN0aW9uOiAncnRsJ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbmNvbnN0IGdlblJlc3BvbnNpdmVXaWR0aFN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzXG4gIH0gPSB0b2tlbjtcbiAgY29uc3QgZ3JpZE1lZGlhU2l6ZXNNYXAgPSBnZXRNZWRpYVNpemUodG9rZW4pO1xuICBkZWxldGUgZ3JpZE1lZGlhU2l6ZXNNYXAueHM7XG4gIGNvbnN0IHJlc3BvbnNpdmVTdHlsZXMgPSBPYmplY3Qua2V5cyhncmlkTWVkaWFTaXplc01hcCkubWFwKGtleSA9PiAoe1xuICAgIFtgQG1lZGlhIChtaW4td2lkdGg6ICR7dW5pdChncmlkTWVkaWFTaXplc01hcFtrZXldKX0pYF06IHtcbiAgICAgIHdpZHRoOiBgdmFyKC0tJHtjb21wb25lbnRDbHMucmVwbGFjZSgnLicsICcnKX0tJHtrZXl9LXdpZHRoKWBcbiAgICB9XG4gIH0pKTtcbiAgcmV0dXJuIHtcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS1yb290YF06IHtcbiAgICAgIFtjb21wb25lbnRDbHNdOiBbe1xuICAgICAgICB3aWR0aDogYHZhcigtLSR7Y29tcG9uZW50Q2xzLnJlcGxhY2UoJy4nLCAnJyl9LXhzLXdpZHRoKWBcbiAgICAgIH1dLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkocmVzcG9uc2l2ZVN0eWxlcykpXG4gICAgfVxuICB9O1xufTtcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFeHBvcnQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgY29uc3QgcHJlcGFyZVRva2VuID0gdG9rZW4gPT4ge1xuICBjb25zdCBoZWFkZXJQYWRkaW5nVmVydGljYWwgPSB0b2tlbi5wYWRkaW5nO1xuICBjb25zdCBoZWFkZXJGb250U2l6ZSA9IHRva2VuLmZvbnRTaXplSGVhZGluZzU7XG4gIGNvbnN0IGhlYWRlckxpbmVIZWlnaHQgPSB0b2tlbi5saW5lSGVpZ2h0SGVhZGluZzU7XG4gIGNvbnN0IG1vZGFsVG9rZW4gPSBtZXJnZVRva2VuKHRva2VuLCB7XG4gICAgbW9kYWxIZWFkZXJIZWlnaHQ6IHRva2VuLmNhbGModG9rZW4uY2FsYyhoZWFkZXJMaW5lSGVpZ2h0KS5tdWwoaGVhZGVyRm9udFNpemUpLmVxdWFsKCkpLmFkZCh0b2tlbi5jYWxjKGhlYWRlclBhZGRpbmdWZXJ0aWNhbCkubXVsKDIpLmVxdWFsKCkpLmVxdWFsKCksXG4gICAgbW9kYWxGb290ZXJCb3JkZXJDb2xvclNwbGl0OiB0b2tlbi5jb2xvclNwbGl0LFxuICAgIG1vZGFsRm9vdGVyQm9yZGVyU3R5bGU6IHRva2VuLmxpbmVUeXBlLFxuICAgIG1vZGFsRm9vdGVyQm9yZGVyV2lkdGg6IHRva2VuLmxpbmVXaWR0aCxcbiAgICBtb2RhbENsb3NlSWNvbkNvbG9yOiB0b2tlbi5jb2xvckljb24sXG4gICAgbW9kYWxDbG9zZUljb25Ib3ZlckNvbG9yOiB0b2tlbi5jb2xvckljb25Ib3ZlcixcbiAgICBtb2RhbENsb3NlQnRuU2l6ZTogdG9rZW4uY29udHJvbEhlaWdodCxcbiAgICBtb2RhbENvbmZpcm1JY29uU2l6ZTogdG9rZW4uZm9udEhlaWdodCxcbiAgICBtb2RhbFRpdGxlSGVpZ2h0OiB0b2tlbi5jYWxjKHRva2VuLnRpdGxlRm9udFNpemUpLm11bCh0b2tlbi50aXRsZUxpbmVIZWlnaHQpLmVxdWFsKClcbiAgfSk7XG4gIHJldHVybiBtb2RhbFRva2VuO1xufTtcbmV4cG9ydCBjb25zdCBwcmVwYXJlQ29tcG9uZW50VG9rZW4gPSB0b2tlbiA9PiAoe1xuICBmb290ZXJCZzogJ3RyYW5zcGFyZW50JyxcbiAgaGVhZGVyQmc6IHRva2VuLmNvbG9yQmdFbGV2YXRlZCxcbiAgdGl0bGVMaW5lSGVpZ2h0OiB0b2tlbi5saW5lSGVpZ2h0SGVhZGluZzUsXG4gIHRpdGxlRm9udFNpemU6IHRva2VuLmZvbnRTaXplSGVhZGluZzUsXG4gIGNvbnRlbnRCZzogdG9rZW4uY29sb3JCZ0VsZXZhdGVkLFxuICB0aXRsZUNvbG9yOiB0b2tlbi5jb2xvclRleHRIZWFkaW5nLFxuICAvLyBpbnRlcm5hbFxuICBjb250ZW50UGFkZGluZzogdG9rZW4ud2lyZWZyYW1lID8gMCA6IGAke3VuaXQodG9rZW4ucGFkZGluZ01EKX0gJHt1bml0KHRva2VuLnBhZGRpbmdDb250ZW50SG9yaXpvbnRhbExHKX1gLFxuICBoZWFkZXJQYWRkaW5nOiB0b2tlbi53aXJlZnJhbWUgPyBgJHt1bml0KHRva2VuLnBhZGRpbmcpfSAke3VuaXQodG9rZW4ucGFkZGluZ0xHKX1gIDogMCxcbiAgaGVhZGVyQm9yZGVyQm90dG9tOiB0b2tlbi53aXJlZnJhbWUgPyBgJHt1bml0KHRva2VuLmxpbmVXaWR0aCl9ICR7dG9rZW4ubGluZVR5cGV9ICR7dG9rZW4uY29sb3JTcGxpdH1gIDogJ25vbmUnLFxuICBoZWFkZXJNYXJnaW5Cb3R0b206IHRva2VuLndpcmVmcmFtZSA/IDAgOiB0b2tlbi5tYXJnaW5YUyxcbiAgYm9keVBhZGRpbmc6IHRva2VuLndpcmVmcmFtZSA/IHRva2VuLnBhZGRpbmdMRyA6IDAsXG4gIGZvb3RlclBhZGRpbmc6IHRva2VuLndpcmVmcmFtZSA/IGAke3VuaXQodG9rZW4ucGFkZGluZ1hTKX0gJHt1bml0KHRva2VuLnBhZGRpbmcpfWAgOiAwLFxuICBmb290ZXJCb3JkZXJUb3A6IHRva2VuLndpcmVmcmFtZSA/IGAke3VuaXQodG9rZW4ubGluZVdpZHRoKX0gJHt0b2tlbi5saW5lVHlwZX0gJHt0b2tlbi5jb2xvclNwbGl0fWAgOiAnbm9uZScsXG4gIGZvb3RlckJvcmRlclJhZGl1czogdG9rZW4ud2lyZWZyYW1lID8gYDAgMCAke3VuaXQodG9rZW4uYm9yZGVyUmFkaXVzTEcpfSAke3VuaXQodG9rZW4uYm9yZGVyUmFkaXVzTEcpfWAgOiAwLFxuICBmb290ZXJNYXJnaW5Ub3A6IHRva2VuLndpcmVmcmFtZSA/IDAgOiB0b2tlbi5tYXJnaW5TTSxcbiAgY29uZmlybUJvZHlQYWRkaW5nOiB0b2tlbi53aXJlZnJhbWUgPyBgJHt1bml0KHRva2VuLnBhZGRpbmcgKiAyKX0gJHt1bml0KHRva2VuLnBhZGRpbmcgKiAyKX0gJHt1bml0KHRva2VuLnBhZGRpbmdMRyl9YCA6IDAsXG4gIGNvbmZpcm1JY29uTWFyZ2luSW5saW5lRW5kOiB0b2tlbi53aXJlZnJhbWUgPyB0b2tlbi5tYXJnaW4gOiB0b2tlbi5tYXJnaW5TTSxcbiAgY29uZmlybUJ0bnNNYXJnaW5Ub3A6IHRva2VuLndpcmVmcmFtZSA/IHRva2VuLm1hcmdpbkxHIDogdG9rZW4ubWFyZ2luU01cbn0pO1xuZXhwb3J0IGRlZmF1bHQgZ2VuU3R5bGVIb29rcygnTW9kYWwnLCB0b2tlbiA9PiB7XG4gIGNvbnN0IG1vZGFsVG9rZW4gPSBwcmVwYXJlVG9rZW4odG9rZW4pO1xuICByZXR1cm4gW2dlbk1vZGFsU3R5bGUobW9kYWxUb2tlbiksIGdlblJUTFN0eWxlKG1vZGFsVG9rZW4pLCBnZW5Nb2RhbE1hc2tTdHlsZShtb2RhbFRva2VuKSwgaW5pdFpvb21Nb3Rpb24obW9kYWxUb2tlbiwgJ3pvb20nKSwgZ2VuUmVzcG9uc2l2ZVdpZHRoU3R5bGUobW9kYWxUb2tlbildO1xufSwgcHJlcGFyZUNvbXBvbmVudFRva2VuLCB7XG4gIHVuaXRsZXNzOiB7XG4gICAgdGl0bGVMaW5lSGVpZ2h0OiB0cnVlXG4gIH1cbn0pOyIsICJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZU1lcmdlZFN0YXRlIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZU1lcmdlZFN0YXRlXCI7XG5pbXBvcnQgQ29uZmlnUHJvdmlkZXIsIHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG5leHBvcnQgZnVuY3Rpb24gd2l0aFB1cmVSZW5kZXJUaGVtZShDb21wb25lbnQpIHtcbiAgcmV0dXJuIHByb3BzID0+ICgvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb25maWdQcm92aWRlciwge1xuICAgIHRoZW1lOiB7XG4gICAgICB0b2tlbjoge1xuICAgICAgICBtb3Rpb246IGZhbHNlLFxuICAgICAgICB6SW5kZXhQb3B1cEJhc2U6IDBcbiAgICAgIH1cbiAgICB9XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMpKSkpO1xufVxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmNvbnN0IGdlblB1cmVQYW5lbCA9IChDb21wb25lbnQsIGFsaWduUHJvcE5hbWUsIHBvc3RQcm9wcywgZGVmYXVsdFByZWZpeENscywgZ2V0RHJvcGRvd25DbHMpID0+IHtcbiAgY29uc3QgUHVyZVBhbmVsID0gcHJvcHMgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHByZWZpeENsczogY3VzdG9taXplUHJlZml4Q2xzLFxuICAgICAgc3R5bGVcbiAgICB9ID0gcHJvcHM7XG4gICAgY29uc3QgaG9sZGVyUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IFtwb3B1cEhlaWdodCwgc2V0UG9wdXBIZWlnaHRdID0gUmVhY3QudXNlU3RhdGUoMCk7XG4gICAgY29uc3QgW3BvcHVwV2lkdGgsIHNldFBvcHVwV2lkdGhdID0gUmVhY3QudXNlU3RhdGUoMCk7XG4gICAgY29uc3QgW29wZW4sIHNldE9wZW5dID0gdXNlTWVyZ2VkU3RhdGUoZmFsc2UsIHtcbiAgICAgIHZhbHVlOiBwcm9wcy5vcGVuXG4gICAgfSk7XG4gICAgY29uc3Qge1xuICAgICAgZ2V0UHJlZml4Q2xzXG4gICAgfSA9IFJlYWN0LnVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCk7XG4gICAgY29uc3QgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKGRlZmF1bHRQcmVmaXhDbHMgfHwgJ3NlbGVjdCcsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gICAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIC8vIFdlIGRvIG5vdCBjYXJlIGFib3V0IHNzclxuICAgICAgc2V0T3Blbih0cnVlKTtcbiAgICAgIGlmICh0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKGVudHJpZXMgPT4ge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBlbnRyaWVzWzBdLnRhcmdldDtcbiAgICAgICAgICBzZXRQb3B1cEhlaWdodChlbGVtZW50Lm9mZnNldEhlaWdodCArIDgpO1xuICAgICAgICAgIHNldFBvcHVwV2lkdGgoZWxlbWVudC5vZmZzZXRXaWR0aCk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBpbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgY29uc3QgZHJvcGRvd25DbHMgPSBnZXREcm9wZG93bkNscyA/IGAuJHtnZXREcm9wZG93bkNscyhwcmVmaXhDbHMpfWAgOiBgLiR7cHJlZml4Q2xzfS1kcm9wZG93bmA7XG4gICAgICAgICAgY29uc3QgcG9wdXAgPSAoX2EgPSBob2xkZXJSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnF1ZXJ5U2VsZWN0b3IoZHJvcGRvd25DbHMpO1xuICAgICAgICAgIGlmIChwb3B1cCkge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKHBvcHVwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDEwKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsKTtcbiAgICAgICAgICByZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSwgW10pO1xuICAgIGxldCBtZXJnZWRQcm9wcyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMpLCB7XG4gICAgICBzdHlsZTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdHlsZSksIHtcbiAgICAgICAgbWFyZ2luOiAwXG4gICAgICB9KSxcbiAgICAgIG9wZW4sXG4gICAgICB2aXNpYmxlOiBvcGVuLFxuICAgICAgZ2V0UG9wdXBDb250YWluZXI6ICgpID0+IGhvbGRlclJlZi5jdXJyZW50XG4gICAgfSk7XG4gICAgaWYgKHBvc3RQcm9wcykge1xuICAgICAgbWVyZ2VkUHJvcHMgPSBwb3N0UHJvcHMobWVyZ2VkUHJvcHMpO1xuICAgIH1cbiAgICBpZiAoYWxpZ25Qcm9wTmFtZSkge1xuICAgICAgT2JqZWN0LmFzc2lnbihtZXJnZWRQcm9wcywge1xuICAgICAgICBbYWxpZ25Qcm9wTmFtZV06IHtcbiAgICAgICAgICBvdmVyZmxvdzoge1xuICAgICAgICAgICAgYWRqdXN0WDogZmFsc2UsXG4gICAgICAgICAgICBhZGp1c3RZOiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IG1lcmdlZFN0eWxlID0ge1xuICAgICAgcGFkZGluZ0JvdHRvbTogcG9wdXBIZWlnaHQsXG4gICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgIG1pbldpZHRoOiBwb3B1cFdpZHRoXG4gICAgfTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgcmVmOiBob2xkZXJSZWYsXG4gICAgICBzdHlsZTogbWVyZ2VkU3R5bGVcbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb25lbnQsIE9iamVjdC5hc3NpZ24oe30sIG1lcmdlZFByb3BzKSkpO1xuICB9O1xuICByZXR1cm4gd2l0aFB1cmVSZW5kZXJUaGVtZShQdXJlUGFuZWwpO1xufTtcbmV4cG9ydCBkZWZhdWx0IGdlblB1cmVQYW5lbDsiLCAiXCJ1c2UgY2xpZW50XCI7XG5cbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG4vLyBUT0RPOiA0LjAgLSBjb2RlbW9kIHNob3VsZCBoZWxwIHRvIGNoYW5nZSBgZmlsdGVyT3B0aW9uYCB0byBzdXBwb3J0IG5vZGUgcHJvcHMuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFJjU2VsZWN0LCB7IE9wdEdyb3VwLCBPcHRpb24gfSBmcm9tICdyYy1zZWxlY3QnO1xuaW1wb3J0IG9taXQgZnJvbSBcInJjLXV0aWwvZXMvb21pdFwiO1xuaW1wb3J0IHsgdXNlWkluZGV4IH0gZnJvbSAnLi4vX3V0aWwvaG9va3MvdXNlWkluZGV4JztcbmltcG9ydCB7IGdldFRyYW5zaXRpb25OYW1lIH0gZnJvbSAnLi4vX3V0aWwvbW90aW9uJztcbmltcG9ydCBnZW5QdXJlUGFuZWwgZnJvbSAnLi4vX3V0aWwvUHVyZVBhbmVsJztcbmltcG9ydCB7IGdldE1lcmdlZFN0YXR1cywgZ2V0U3RhdHVzQ2xhc3NOYW1lcyB9IGZyb20gJy4uL191dGlsL3N0YXR1c1V0aWxzJztcbmltcG9ydCB7IGRldlVzZVdhcm5pbmcgfSBmcm9tICcuLi9fdXRpbC93YXJuaW5nJztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHsgdXNlQ29tcG9uZW50Q29uZmlnIH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL2NvbnRleHQnO1xuaW1wb3J0IERlZmF1bHRSZW5kZXJFbXB0eSBmcm9tICcuLi9jb25maWctcHJvdmlkZXIvZGVmYXVsdFJlbmRlckVtcHR5JztcbmltcG9ydCBEaXNhYmxlZENvbnRleHQgZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL0Rpc2FibGVkQ29udGV4dCc7XG5pbXBvcnQgdXNlQ1NTVmFyQ2xzIGZyb20gJy4uL2NvbmZpZy1wcm92aWRlci9ob29rcy91c2VDU1NWYXJDbHMnO1xuaW1wb3J0IHVzZVNpemUgZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL2hvb2tzL3VzZVNpemUnO1xuaW1wb3J0IHsgRm9ybUl0ZW1JbnB1dENvbnRleHQgfSBmcm9tICcuLi9mb3JtL2NvbnRleHQnO1xuaW1wb3J0IHVzZVZhcmlhbnRzIGZyb20gJy4uL2Zvcm0vaG9va3MvdXNlVmFyaWFudHMnO1xuaW1wb3J0IHsgdXNlQ29tcGFjdEl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vc3BhY2UvQ29tcGFjdCc7XG5pbXBvcnQgeyB1c2VUb2tlbiB9IGZyb20gJy4uL3RoZW1lL2ludGVybmFsJztcbmltcG9ydCBtZXJnZWRCdWlsdGluUGxhY2VtZW50cyBmcm9tICcuL21lcmdlZEJ1aWx0aW5QbGFjZW1lbnRzJztcbmltcG9ydCB1c2VTdHlsZSBmcm9tICcuL3N0eWxlJztcbmltcG9ydCB1c2VJY29ucyBmcm9tICcuL3VzZUljb25zJztcbmltcG9ydCB1c2VTaG93QXJyb3cgZnJvbSAnLi91c2VTaG93QXJyb3cnO1xuY29uc3QgU0VDUkVUX0NPTUJPQk9YX01PREVfRE9fTk9UX1VTRSA9ICdTRUNSRVRfQ09NQk9CT1hfTU9ERV9ET19OT1RfVVNFJztcbmNvbnN0IEludGVybmFsU2VsZWN0ID0gKHByb3BzLCByZWYpID0+IHtcbiAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZTtcbiAgY29uc3Qge1xuICAgICAgcHJlZml4Q2xzOiBjdXN0b21pemVQcmVmaXhDbHMsXG4gICAgICBib3JkZXJlZCxcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIHJvb3RDbGFzc05hbWUsXG4gICAgICBnZXRQb3B1cENvbnRhaW5lcixcbiAgICAgIHBvcHVwQ2xhc3NOYW1lLFxuICAgICAgZHJvcGRvd25DbGFzc05hbWUsXG4gICAgICBsaXN0SGVpZ2h0ID0gMjU2LFxuICAgICAgcGxhY2VtZW50LFxuICAgICAgbGlzdEl0ZW1IZWlnaHQ6IGN1c3RvbUxpc3RJdGVtSGVpZ2h0LFxuICAgICAgc2l6ZTogY3VzdG9taXplU2l6ZSxcbiAgICAgIGRpc2FibGVkOiBjdXN0b21EaXNhYmxlZCxcbiAgICAgIG5vdEZvdW5kQ29udGVudCxcbiAgICAgIHN0YXR1czogY3VzdG9tU3RhdHVzLFxuICAgICAgYnVpbHRpblBsYWNlbWVudHMsXG4gICAgICBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGgsXG4gICAgICBwb3B1cE1hdGNoU2VsZWN0V2lkdGgsXG4gICAgICBkaXJlY3Rpb246IHByb3BEaXJlY3Rpb24sXG4gICAgICBzdHlsZSxcbiAgICAgIGFsbG93Q2xlYXIsXG4gICAgICB2YXJpYW50OiBjdXN0b21pemVWYXJpYW50LFxuICAgICAgZHJvcGRvd25TdHlsZSxcbiAgICAgIHRyYW5zaXRpb25OYW1lLFxuICAgICAgdGFnUmVuZGVyLFxuICAgICAgbWF4Q291bnQsXG4gICAgICBwcmVmaXgsXG4gICAgICBkcm9wZG93blJlbmRlcixcbiAgICAgIHBvcHVwUmVuZGVyLFxuICAgICAgb25Ecm9wZG93blZpc2libGVDaGFuZ2UsXG4gICAgICBvbk9wZW5DaGFuZ2UsXG4gICAgICBzdHlsZXMsXG4gICAgICBjbGFzc05hbWVzXG4gICAgfSA9IHByb3BzLFxuICAgIHJlc3QgPSBfX3Jlc3QocHJvcHMsIFtcInByZWZpeENsc1wiLCBcImJvcmRlcmVkXCIsIFwiY2xhc3NOYW1lXCIsIFwicm9vdENsYXNzTmFtZVwiLCBcImdldFBvcHVwQ29udGFpbmVyXCIsIFwicG9wdXBDbGFzc05hbWVcIiwgXCJkcm9wZG93bkNsYXNzTmFtZVwiLCBcImxpc3RIZWlnaHRcIiwgXCJwbGFjZW1lbnRcIiwgXCJsaXN0SXRlbUhlaWdodFwiLCBcInNpemVcIiwgXCJkaXNhYmxlZFwiLCBcIm5vdEZvdW5kQ29udGVudFwiLCBcInN0YXR1c1wiLCBcImJ1aWx0aW5QbGFjZW1lbnRzXCIsIFwiZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoXCIsIFwicG9wdXBNYXRjaFNlbGVjdFdpZHRoXCIsIFwiZGlyZWN0aW9uXCIsIFwic3R5bGVcIiwgXCJhbGxvd0NsZWFyXCIsIFwidmFyaWFudFwiLCBcImRyb3Bkb3duU3R5bGVcIiwgXCJ0cmFuc2l0aW9uTmFtZVwiLCBcInRhZ1JlbmRlclwiLCBcIm1heENvdW50XCIsIFwicHJlZml4XCIsIFwiZHJvcGRvd25SZW5kZXJcIiwgXCJwb3B1cFJlbmRlclwiLCBcIm9uRHJvcGRvd25WaXNpYmxlQ2hhbmdlXCIsIFwib25PcGVuQ2hhbmdlXCIsIFwic3R5bGVzXCIsIFwiY2xhc3NOYW1lc1wiXSk7XG4gIGNvbnN0IHtcbiAgICBnZXRQb3B1cENvbnRhaW5lcjogZ2V0Q29udGV4dFBvcHVwQ29udGFpbmVyLFxuICAgIGdldFByZWZpeENscyxcbiAgICByZW5kZXJFbXB0eSxcbiAgICBkaXJlY3Rpb246IGNvbnRleHREaXJlY3Rpb24sXG4gICAgdmlydHVhbCxcbiAgICBwb3B1cE1hdGNoU2VsZWN0V2lkdGg6IGNvbnRleHRQb3B1cE1hdGNoU2VsZWN0V2lkdGgsXG4gICAgcG9wdXBPdmVyZmxvd1xuICB9ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KTtcbiAgY29uc3Qge1xuICAgIHNob3dTZWFyY2gsXG4gICAgc3R5bGU6IGNvbnRleHRTdHlsZSxcbiAgICBzdHlsZXM6IGNvbnRleHRTdHlsZXMsXG4gICAgY2xhc3NOYW1lOiBjb250ZXh0Q2xhc3NOYW1lLFxuICAgIGNsYXNzTmFtZXM6IGNvbnRleHRDbGFzc05hbWVzXG4gIH0gPSB1c2VDb21wb25lbnRDb25maWcoJ3NlbGVjdCcpO1xuICBjb25zdCBbLCB0b2tlbl0gPSB1c2VUb2tlbigpO1xuICBjb25zdCBsaXN0SXRlbUhlaWdodCA9IGN1c3RvbUxpc3RJdGVtSGVpZ2h0ICE9PSBudWxsICYmIGN1c3RvbUxpc3RJdGVtSGVpZ2h0ICE9PSB2b2lkIDAgPyBjdXN0b21MaXN0SXRlbUhlaWdodCA6IHRva2VuID09PSBudWxsIHx8IHRva2VuID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0b2tlbi5jb250cm9sSGVpZ2h0O1xuICBjb25zdCBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ3NlbGVjdCcsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIGNvbnN0IHJvb3RQcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoKTtcbiAgY29uc3QgZGlyZWN0aW9uID0gcHJvcERpcmVjdGlvbiAhPT0gbnVsbCAmJiBwcm9wRGlyZWN0aW9uICE9PSB2b2lkIDAgPyBwcm9wRGlyZWN0aW9uIDogY29udGV4dERpcmVjdGlvbjtcbiAgY29uc3Qge1xuICAgIGNvbXBhY3RTaXplLFxuICAgIGNvbXBhY3RJdGVtQ2xhc3NuYW1lc1xuICB9ID0gdXNlQ29tcGFjdEl0ZW1Db250ZXh0KHByZWZpeENscywgZGlyZWN0aW9uKTtcbiAgY29uc3QgW3ZhcmlhbnQsIGVuYWJsZVZhcmlhbnRDbHNdID0gdXNlVmFyaWFudHMoJ3NlbGVjdCcsIGN1c3RvbWl6ZVZhcmlhbnQsIGJvcmRlcmVkKTtcbiAgY29uc3Qgcm9vdENscyA9IHVzZUNTU1ZhckNscyhwcmVmaXhDbHMpO1xuICBjb25zdCBbd3JhcENTU1ZhciwgaGFzaElkLCBjc3NWYXJDbHNdID0gdXNlU3R5bGUocHJlZml4Q2xzLCByb290Q2xzKTtcbiAgY29uc3QgbW9kZSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIG1vZGU6IG1cbiAgICB9ID0gcHJvcHM7XG4gICAgaWYgKG0gPT09ICdjb21ib2JveCcpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChtID09PSBTRUNSRVRfQ09NQk9CT1hfTU9ERV9ET19OT1RfVVNFKSB7XG4gICAgICByZXR1cm4gJ2NvbWJvYm94JztcbiAgICB9XG4gICAgcmV0dXJuIG07XG4gIH0sIFtwcm9wcy5tb2RlXSk7XG4gIGNvbnN0IGlzTXVsdGlwbGUgPSBtb2RlID09PSAnbXVsdGlwbGUnIHx8IG1vZGUgPT09ICd0YWdzJztcbiAgY29uc3Qgc2hvd1N1ZmZpeEljb24gPSB1c2VTaG93QXJyb3cocHJvcHMuc3VmZml4SWNvbiwgcHJvcHMuc2hvd0Fycm93KTtcbiAgY29uc3QgbWVyZ2VkUG9wdXBNYXRjaFNlbGVjdFdpZHRoID0gKF9hID0gcG9wdXBNYXRjaFNlbGVjdFdpZHRoICE9PSBudWxsICYmIHBvcHVwTWF0Y2hTZWxlY3RXaWR0aCAhPT0gdm9pZCAwID8gcG9wdXBNYXRjaFNlbGVjdFdpZHRoIDogZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBjb250ZXh0UG9wdXBNYXRjaFNlbGVjdFdpZHRoO1xuICBjb25zdCBtZXJnZWRQb3B1cFN0eWxlID0gKChfYiA9IHN0eWxlcyA9PT0gbnVsbCB8fCBzdHlsZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0eWxlcy5wb3B1cCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnJvb3QpIHx8ICgoX2MgPSBjb250ZXh0U3R5bGVzLnBvcHVwKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Mucm9vdCkgfHwgZHJvcGRvd25TdHlsZTtcbiAgY29uc3QgbWVyZ2VkUG9wdXBSZW5kZXIgPSBwb3B1cFJlbmRlciB8fCBkcm9wZG93blJlbmRlcjtcbiAgY29uc3QgbWVyZ2VkT25PcGVuQ2hhbmdlID0gb25PcGVuQ2hhbmdlIHx8IG9uRHJvcGRvd25WaXNpYmxlQ2hhbmdlO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gRm9ybSBTdGF0dXMgPT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IHtcbiAgICBzdGF0dXM6IGNvbnRleHRTdGF0dXMsXG4gICAgaGFzRmVlZGJhY2ssXG4gICAgaXNGb3JtSXRlbUlucHV0LFxuICAgIGZlZWRiYWNrSWNvblxuICB9ID0gUmVhY3QudXNlQ29udGV4dChGb3JtSXRlbUlucHV0Q29udGV4dCk7XG4gIGNvbnN0IG1lcmdlZFN0YXR1cyA9IGdldE1lcmdlZFN0YXR1cyhjb250ZXh0U3RhdHVzLCBjdXN0b21TdGF0dXMpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gRW1wdHkgPT09PT09PT09PT09PT09PT09PT09XG4gIGxldCBtZXJnZWROb3RGb3VuZDtcbiAgaWYgKG5vdEZvdW5kQ29udGVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbWVyZ2VkTm90Rm91bmQgPSBub3RGb3VuZENvbnRlbnQ7XG4gIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2NvbWJvYm94Jykge1xuICAgIG1lcmdlZE5vdEZvdW5kID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICBtZXJnZWROb3RGb3VuZCA9IChyZW5kZXJFbXB0eSA9PT0gbnVsbCB8fCByZW5kZXJFbXB0eSA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVuZGVyRW1wdHkoJ1NlbGVjdCcpKSB8fCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEZWZhdWx0UmVuZGVyRW1wdHksIHtcbiAgICAgIGNvbXBvbmVudE5hbWU6IFwiU2VsZWN0XCJcbiAgICB9KTtcbiAgfVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gSWNvbnMgPT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IHtcbiAgICBzdWZmaXhJY29uLFxuICAgIGl0ZW1JY29uLFxuICAgIHJlbW92ZUljb24sXG4gICAgY2xlYXJJY29uXG4gIH0gPSB1c2VJY29ucyhPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlc3QpLCB7XG4gICAgbXVsdGlwbGU6IGlzTXVsdGlwbGUsXG4gICAgaGFzRmVlZGJhY2ssXG4gICAgZmVlZGJhY2tJY29uLFxuICAgIHNob3dTdWZmaXhJY29uLFxuICAgIHByZWZpeENscyxcbiAgICBjb21wb25lbnROYW1lOiAnU2VsZWN0J1xuICB9KSk7XG4gIGNvbnN0IG1lcmdlZEFsbG93Q2xlYXIgPSBhbGxvd0NsZWFyID09PSB0cnVlID8ge1xuICAgIGNsZWFySWNvblxuICB9IDogYWxsb3dDbGVhcjtcbiAgY29uc3Qgc2VsZWN0UHJvcHMgPSBvbWl0KHJlc3QsIFsnc3VmZml4SWNvbicsICdpdGVtSWNvbiddKTtcbiAgY29uc3QgbWVyZ2VkUG9wdXBDbGFzc05hbWUgPSBjbHMoKChfZCA9IGNsYXNzTmFtZXMgPT09IG51bGwgfHwgY2xhc3NOYW1lcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2xhc3NOYW1lcy5wb3B1cCkgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLnJvb3QpIHx8ICgoX2UgPSBjb250ZXh0Q2xhc3NOYW1lcyA9PT0gbnVsbCB8fCBjb250ZXh0Q2xhc3NOYW1lcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29udGV4dENsYXNzTmFtZXMucG9wdXApID09PSBudWxsIHx8IF9lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZS5yb290KSB8fCBwb3B1cENsYXNzTmFtZSB8fCBkcm9wZG93bkNsYXNzTmFtZSwge1xuICAgIFtgJHtwcmVmaXhDbHN9LWRyb3Bkb3duLSR7ZGlyZWN0aW9ufWBdOiBkaXJlY3Rpb24gPT09ICdydGwnXG4gIH0sIHJvb3RDbGFzc05hbWUsIGNvbnRleHRDbGFzc05hbWVzLnJvb3QsIGNsYXNzTmFtZXMgPT09IG51bGwgfHwgY2xhc3NOYW1lcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2xhc3NOYW1lcy5yb290LCBjc3NWYXJDbHMsIHJvb3RDbHMsIGhhc2hJZCk7XG4gIGNvbnN0IG1lcmdlZFNpemUgPSB1c2VTaXplKGN0eCA9PiB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiAoX2EgPSBjdXN0b21pemVTaXplICE9PSBudWxsICYmIGN1c3RvbWl6ZVNpemUgIT09IHZvaWQgMCA/IGN1c3RvbWl6ZVNpemUgOiBjb21wYWN0U2l6ZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogY3R4O1xuICB9KTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09IERpc2FibGVkID09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBkaXNhYmxlZCA9IFJlYWN0LnVzZUNvbnRleHQoRGlzYWJsZWRDb250ZXh0KTtcbiAgY29uc3QgbWVyZ2VkRGlzYWJsZWQgPSBjdXN0b21EaXNhYmxlZCAhPT0gbnVsbCAmJiBjdXN0b21EaXNhYmxlZCAhPT0gdm9pZCAwID8gY3VzdG9tRGlzYWJsZWQgOiBkaXNhYmxlZDtcbiAgY29uc3QgbWVyZ2VkQ2xhc3NOYW1lID0gY2xzKHtcbiAgICBbYCR7cHJlZml4Q2xzfS1sZ2BdOiBtZXJnZWRTaXplID09PSAnbGFyZ2UnLFxuICAgIFtgJHtwcmVmaXhDbHN9LXNtYF06IG1lcmdlZFNpemUgPT09ICdzbWFsbCcsXG4gICAgW2Ake3ByZWZpeENsc30tcnRsYF06IGRpcmVjdGlvbiA9PT0gJ3J0bCcsXG4gICAgW2Ake3ByZWZpeENsc30tJHt2YXJpYW50fWBdOiBlbmFibGVWYXJpYW50Q2xzLFxuICAgIFtgJHtwcmVmaXhDbHN9LWluLWZvcm0taXRlbWBdOiBpc0Zvcm1JdGVtSW5wdXRcbiAgfSwgZ2V0U3RhdHVzQ2xhc3NOYW1lcyhwcmVmaXhDbHMsIG1lcmdlZFN0YXR1cywgaGFzRmVlZGJhY2spLCBjb21wYWN0SXRlbUNsYXNzbmFtZXMsIGNvbnRleHRDbGFzc05hbWUsIGNsYXNzTmFtZSwgY29udGV4dENsYXNzTmFtZXMucm9vdCwgY2xhc3NOYW1lcyA9PT0gbnVsbCB8fCBjbGFzc05hbWVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjbGFzc05hbWVzLnJvb3QsIHJvb3RDbGFzc05hbWUsIGNzc1ZhckNscywgcm9vdENscywgaGFzaElkKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09IFBsYWNlbWVudCA9PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3QgbWVtb1BsYWNlbWVudCA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGlmIChwbGFjZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHBsYWNlbWVudDtcbiAgICB9XG4gICAgcmV0dXJuIGRpcmVjdGlvbiA9PT0gJ3J0bCcgPyAnYm90dG9tUmlnaHQnIDogJ2JvdHRvbUxlZnQnO1xuICB9LCBbcGxhY2VtZW50LCBkaXJlY3Rpb25dKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PSBXYXJuaW5nID09PT09PT09PT09PT09PT09PT09PT1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBjb25zdCB3YXJuaW5nID0gZGV2VXNlV2FybmluZygnU2VsZWN0Jyk7XG4gICAgY29uc3QgZGVwcmVjYXRlZFByb3BzID0ge1xuICAgICAgZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoOiAncG9wdXBNYXRjaFNlbGVjdFdpZHRoJyxcbiAgICAgIGRyb3Bkb3duU3R5bGU6ICdzdHlsZXMucG9wdXAucm9vdCcsXG4gICAgICBkcm9wZG93bkNsYXNzTmFtZTogJ2NsYXNzTmFtZXMucG9wdXAucm9vdCcsXG4gICAgICBwb3B1cENsYXNzTmFtZTogJ2NsYXNzTmFtZXMucG9wdXAucm9vdCcsXG4gICAgICBkcm9wZG93blJlbmRlcjogJ3BvcHVwUmVuZGVyJyxcbiAgICAgIG9uRHJvcGRvd25WaXNpYmxlQ2hhbmdlOiAnb25PcGVuQ2hhbmdlJyxcbiAgICAgIGJvcmRlcmVkOiAndmFyaWFudCdcbiAgICB9O1xuICAgIE9iamVjdC5lbnRyaWVzKGRlcHJlY2F0ZWRQcm9wcykuZm9yRWFjaChfcmVmID0+IHtcbiAgICAgIGxldCBbb2xkUHJvcCwgbmV3UHJvcF0gPSBfcmVmO1xuICAgICAgd2FybmluZy5kZXByZWNhdGVkKCEob2xkUHJvcCBpbiBwcm9wcyksIG9sZFByb3AsIG5ld1Byb3ApO1xuICAgIH0pO1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoISgnc2hvd0Fycm93JyBpbiBwcm9wcyksICdkZXByZWNhdGVkJywgJ2BzaG93QXJyb3dgIGlzIGRlcHJlY2F0ZWQgd2hpY2ggd2lsbCBiZSByZW1vdmVkIGluIG5leHQgbWFqb3IgdmVyc2lvbi4gSXQgd2lsbCBiZSBhIGRlZmF1bHQgYmVoYXZpb3IsIHlvdSBjYW4gaGlkZSBpdCBieSBzZXR0aW5nIGBzdWZmaXhJY29uYCB0byBudWxsLicpIDogdm9pZCAwO1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoISh0eXBlb2YgbWF4Q291bnQgIT09ICd1bmRlZmluZWQnICYmICFpc011bHRpcGxlKSwgJ3VzYWdlJywgJ2BtYXhDb3VudGAgb25seSB3b3JrcyB3aXRoIG1vZGUgYG11bHRpcGxlYCBvciBgdGFnc2AnKSA6IHZvaWQgMDtcbiAgfVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09IHpJbmRleCA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IFt6SW5kZXhdID0gdXNlWkluZGV4KCdTZWxlY3RMaWtlJywgbWVyZ2VkUG9wdXBTdHlsZSA9PT0gbnVsbCB8fCBtZXJnZWRQb3B1cFN0eWxlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtZXJnZWRQb3B1cFN0eWxlLnpJbmRleCk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09XG4gIHJldHVybiB3cmFwQ1NTVmFyKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJjU2VsZWN0LCBPYmplY3QuYXNzaWduKHtcbiAgICByZWY6IHJlZixcbiAgICB2aXJ0dWFsOiB2aXJ0dWFsLFxuICAgIHNob3dTZWFyY2g6IHNob3dTZWFyY2hcbiAgfSwgc2VsZWN0UHJvcHMsIHtcbiAgICBzdHlsZTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY29udGV4dFN0eWxlcy5yb290KSwgc3R5bGVzID09PSBudWxsIHx8IHN0eWxlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3R5bGVzLnJvb3QpLCBjb250ZXh0U3R5bGUpLCBzdHlsZSksXG4gICAgZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoOiBtZXJnZWRQb3B1cE1hdGNoU2VsZWN0V2lkdGgsXG4gICAgdHJhbnNpdGlvbk5hbWU6IGdldFRyYW5zaXRpb25OYW1lKHJvb3RQcmVmaXhDbHMsICdzbGlkZS11cCcsIHRyYW5zaXRpb25OYW1lKSxcbiAgICBidWlsdGluUGxhY2VtZW50czogbWVyZ2VkQnVpbHRpblBsYWNlbWVudHMoYnVpbHRpblBsYWNlbWVudHMsIHBvcHVwT3ZlcmZsb3cpLFxuICAgIGxpc3RIZWlnaHQ6IGxpc3RIZWlnaHQsXG4gICAgbGlzdEl0ZW1IZWlnaHQ6IGxpc3RJdGVtSGVpZ2h0LFxuICAgIG1vZGU6IG1vZGUsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgcGxhY2VtZW50OiBtZW1vUGxhY2VtZW50LFxuICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uLFxuICAgIHByZWZpeDogcHJlZml4LFxuICAgIHN1ZmZpeEljb246IHN1ZmZpeEljb24sXG4gICAgbWVudUl0ZW1TZWxlY3RlZEljb246IGl0ZW1JY29uLFxuICAgIHJlbW92ZUljb246IHJlbW92ZUljb24sXG4gICAgYWxsb3dDbGVhcjogbWVyZ2VkQWxsb3dDbGVhcixcbiAgICBub3RGb3VuZENvbnRlbnQ6IG1lcmdlZE5vdEZvdW5kLFxuICAgIGNsYXNzTmFtZTogbWVyZ2VkQ2xhc3NOYW1lLFxuICAgIGdldFBvcHVwQ29udGFpbmVyOiBnZXRQb3B1cENvbnRhaW5lciB8fCBnZXRDb250ZXh0UG9wdXBDb250YWluZXIsXG4gICAgZHJvcGRvd25DbGFzc05hbWU6IG1lcmdlZFBvcHVwQ2xhc3NOYW1lLFxuICAgIGRpc2FibGVkOiBtZXJnZWREaXNhYmxlZCxcbiAgICBkcm9wZG93blN0eWxlOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG1lcmdlZFBvcHVwU3R5bGUpLCB7XG4gICAgICB6SW5kZXhcbiAgICB9KSxcbiAgICBtYXhDb3VudDogaXNNdWx0aXBsZSA/IG1heENvdW50IDogdW5kZWZpbmVkLFxuICAgIHRhZ1JlbmRlcjogaXNNdWx0aXBsZSA/IHRhZ1JlbmRlciA6IHVuZGVmaW5lZCxcbiAgICBkcm9wZG93blJlbmRlcjogbWVyZ2VkUG9wdXBSZW5kZXIsXG4gICAgb25Ecm9wZG93blZpc2libGVDaGFuZ2U6IG1lcmdlZE9uT3BlbkNoYW5nZVxuICB9KSkpO1xufTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIEludGVybmFsU2VsZWN0LmRpc3BsYXlOYW1lID0gJ1NlbGVjdCc7XG59XG5jb25zdCBTZWxlY3QgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihJbnRlcm5hbFNlbGVjdCk7XG4vLyBXZSBkb24ndCBjYXJlIGRlYnVnIHBhbmVsXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuY29uc3QgUHVyZVBhbmVsID0gZ2VuUHVyZVBhbmVsKFNlbGVjdCwgJ2Ryb3Bkb3duQWxpZ24nKTtcblNlbGVjdC5TRUNSRVRfQ09NQk9CT1hfTU9ERV9ET19OT1RfVVNFID0gU0VDUkVUX0NPTUJPQk9YX01PREVfRE9fTk9UX1VTRTtcblNlbGVjdC5PcHRpb24gPSBPcHRpb247XG5TZWxlY3QuT3B0R3JvdXAgPSBPcHRHcm91cDtcblNlbGVjdC5fSW50ZXJuYWxQYW5lbERvTm90VXNlT3JZb3VXaWxsQmVGaXJlZCA9IFB1cmVQYW5lbDtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFNlbGVjdC5kaXNwbGF5TmFtZSA9ICdTZWxlY3QnO1xufVxuZXhwb3J0IGRlZmF1bHQgU2VsZWN0OyIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJpZFwiLCBcIm1vZGVcIiwgXCJwcmVmaXhDbHNcIiwgXCJiYWNrZmlsbFwiLCBcImZpZWxkTmFtZXNcIiwgXCJpbnB1dFZhbHVlXCIsIFwic2VhcmNoVmFsdWVcIiwgXCJvblNlYXJjaFwiLCBcImF1dG9DbGVhclNlYXJjaFZhbHVlXCIsIFwib25TZWxlY3RcIiwgXCJvbkRlc2VsZWN0XCIsIFwiZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoXCIsIFwiZmlsdGVyT3B0aW9uXCIsIFwiZmlsdGVyU29ydFwiLCBcIm9wdGlvbkZpbHRlclByb3BcIiwgXCJvcHRpb25MYWJlbFByb3BcIiwgXCJvcHRpb25zXCIsIFwib3B0aW9uUmVuZGVyXCIsIFwiY2hpbGRyZW5cIiwgXCJkZWZhdWx0QWN0aXZlRmlyc3RPcHRpb25cIiwgXCJtZW51SXRlbVNlbGVjdGVkSWNvblwiLCBcInZpcnR1YWxcIiwgXCJkaXJlY3Rpb25cIiwgXCJsaXN0SGVpZ2h0XCIsIFwibGlzdEl0ZW1IZWlnaHRcIiwgXCJsYWJlbFJlbmRlclwiLCBcInZhbHVlXCIsIFwiZGVmYXVsdFZhbHVlXCIsIFwibGFiZWxJblZhbHVlXCIsIFwib25DaGFuZ2VcIiwgXCJtYXhDb3VudFwiXTtcbi8qKlxuICogVG8gbWF0Y2ggYWNjZXNzaWJpbGl0eSByZXF1aXJlbWVudCwgd2UgYWx3YXlzIHByb3ZpZGUgYW4gaW5wdXQgaW4gdGhlIGNvbXBvbmVudC5cbiAqIE90aGVyIGVsZW1lbnQgd2lsbCBub3Qgc2V0IGB0YWJJbmRleGAgdG8gYXZvaWQgYG9uQmx1cmAgc2VxdWVuY2UgcHJvYmxlbS5cbiAqIEZvciBmb2N1c2VkIHNlbGVjdCwgd2Ugc2V0IGBhcmlhLWxpdmU9XCJwb2xpdGVcImAgdG8gdXBkYXRlIHRoZSBhY2Nlc3NpYmlsaXR5IGNvbnRlbnQuXG4gKlxuICogcmVmOlxuICogLSBrZXlib2FyZDogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQWNjZXNzaWJpbGl0eS9BUklBL1JvbGVzL2xpc3Rib3hfcm9sZSNLZXlib2FyZF9pbnRlcmFjdGlvbnNcbiAqXG4gKiBOZXcgYXBpOlxuICogLSBsaXN0SGVpZ2h0XG4gKiAtIGxpc3RJdGVtSGVpZ2h0XG4gKiAtIGNvbXBvbmVudFxuICpcbiAqIFJlbW92ZSBkZXByZWNhdGVkIGFwaTpcbiAqIC0gbXVsdGlwbGVcbiAqIC0gdGFnc1xuICogLSBjb21ib2JveFxuICogLSBmaXJzdEFjdGl2ZVZhbHVlXG4gKiAtIGRyb3Bkb3duTWVudVN0eWxlXG4gKiAtIG9wZW5DbGFzc05hbWUgKE5vdCBsaXN0IGluIGFwaSlcbiAqXG4gKiBVcGRhdGU6XG4gKiAtIGBiYWNrZmlsbGAgb25seSBzdXBwb3J0IGBjb21ib2JveGAgbW9kZVxuICogLSBgY29tYm9ib3hgIG1vZGUgbm90IHN1cHBvcnQgYGxhYmVsSW5WYWx1ZWAgc2luY2UgaXQncyBtZWFuaW5nbGVzc1xuICogLSBgZ2V0SW5wdXRFbGVtZW50YCBvbmx5IHN1cHBvcnQgYGNvbWJvYm94YCBtb2RlXG4gKiAtIGBvbkNoYW5nZWAgcmV0dXJuIE9wdGlvbkRhdGEgaW5zdGVhZCBvZiBSZWFjdE5vZGVcbiAqIC0gYGZpbHRlck9wdGlvbmAgYG9uQ2hhbmdlYCBgb25TZWxlY3RgIGFjY2VwdCBPcHRpb25EYXRhIGluc3RlYWQgb2YgUmVhY3ROb2RlXG4gKiAtIGBjb21ib2JveGAgbW9kZSB0cmlnZ2VyIGBvbkNoYW5nZWAgd2lsbCBnZXQgYHVuZGVmaW5lZGAgaWYgbm8gYHZhbHVlYCBtYXRjaCBpbiBPcHRpb25cbiAqIC0gYGNvbWJvYm94YCBtb2RlIG5vdCBzdXBwb3J0IGBvcHRpb25MYWJlbFByb3BgXG4gKi9cblxuaW1wb3J0IHVzZU1lcmdlZFN0YXRlIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZU1lcmdlZFN0YXRlXCI7XG5pbXBvcnQgd2FybmluZyBmcm9tIFwicmMtdXRpbC9lcy93YXJuaW5nXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQmFzZVNlbGVjdCwgeyBpc011bHRpcGxlIH0gZnJvbSBcIi4vQmFzZVNlbGVjdFwiO1xuaW1wb3J0IE9wdEdyb3VwIGZyb20gXCIuL09wdEdyb3VwXCI7XG5pbXBvcnQgT3B0aW9uIGZyb20gXCIuL09wdGlvblwiO1xuaW1wb3J0IE9wdGlvbkxpc3QgZnJvbSBcIi4vT3B0aW9uTGlzdFwiO1xuaW1wb3J0IFNlbGVjdENvbnRleHQgZnJvbSBcIi4vU2VsZWN0Q29udGV4dFwiO1xuaW1wb3J0IHVzZUNhY2hlIGZyb20gXCIuL2hvb2tzL3VzZUNhY2hlXCI7XG5pbXBvcnQgdXNlRmlsdGVyT3B0aW9ucyBmcm9tIFwiLi9ob29rcy91c2VGaWx0ZXJPcHRpb25zXCI7XG5pbXBvcnQgdXNlSWQgZnJvbSBcIi4vaG9va3MvdXNlSWRcIjtcbmltcG9ydCB1c2VPcHRpb25zIGZyb20gXCIuL2hvb2tzL3VzZU9wdGlvbnNcIjtcbmltcG9ydCB1c2VSZWZGdW5jIGZyb20gXCIuL2hvb2tzL3VzZVJlZkZ1bmNcIjtcbmltcG9ydCB7IGhhc1ZhbHVlLCBpc0NvbWJvTm9WYWx1ZSwgdG9BcnJheSB9IGZyb20gXCIuL3V0aWxzL2NvbW1vblV0aWxcIjtcbmltcG9ydCB7IGZpbGxGaWVsZE5hbWVzLCBmbGF0dGVuT3B0aW9ucywgaW5qZWN0UHJvcHNXaXRoT3B0aW9uIH0gZnJvbSBcIi4vdXRpbHMvdmFsdWVVdGlsXCI7XG5pbXBvcnQgd2FybmluZ1Byb3BzLCB7IHdhcm5pbmdOdWxsT3B0aW9ucyB9IGZyb20gXCIuL3V0aWxzL3dhcm5pbmdQcm9wc1V0aWxcIjtcbnZhciBPTUlUX0RPTV9QUk9QUyA9IFsnaW5wdXRWYWx1ZSddO1xuZnVuY3Rpb24gaXNSYXdWYWx1ZSh2YWx1ZSkge1xuICByZXR1cm4gIXZhbHVlIHx8IF90eXBlb2YodmFsdWUpICE9PSAnb2JqZWN0Jztcbn1cbnZhciBTZWxlY3QgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICB2YXIgaWQgPSBwcm9wcy5pZCxcbiAgICBtb2RlID0gcHJvcHMubW9kZSxcbiAgICBfcHJvcHMkcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIHByZWZpeENscyA9IF9wcm9wcyRwcmVmaXhDbHMgPT09IHZvaWQgMCA/ICdyYy1zZWxlY3QnIDogX3Byb3BzJHByZWZpeENscyxcbiAgICBiYWNrZmlsbCA9IHByb3BzLmJhY2tmaWxsLFxuICAgIGZpZWxkTmFtZXMgPSBwcm9wcy5maWVsZE5hbWVzLFxuICAgIGlucHV0VmFsdWUgPSBwcm9wcy5pbnB1dFZhbHVlLFxuICAgIHNlYXJjaFZhbHVlID0gcHJvcHMuc2VhcmNoVmFsdWUsXG4gICAgb25TZWFyY2ggPSBwcm9wcy5vblNlYXJjaCxcbiAgICBfcHJvcHMkYXV0b0NsZWFyU2VhcmMgPSBwcm9wcy5hdXRvQ2xlYXJTZWFyY2hWYWx1ZSxcbiAgICBhdXRvQ2xlYXJTZWFyY2hWYWx1ZSA9IF9wcm9wcyRhdXRvQ2xlYXJTZWFyYyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyRhdXRvQ2xlYXJTZWFyYyxcbiAgICBvblNlbGVjdCA9IHByb3BzLm9uU2VsZWN0LFxuICAgIG9uRGVzZWxlY3QgPSBwcm9wcy5vbkRlc2VsZWN0LFxuICAgIF9wcm9wcyRkcm9wZG93bk1hdGNoUyA9IHByb3BzLmRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCxcbiAgICBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGggPSBfcHJvcHMkZHJvcGRvd25NYXRjaFMgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkZHJvcGRvd25NYXRjaFMsXG4gICAgZmlsdGVyT3B0aW9uID0gcHJvcHMuZmlsdGVyT3B0aW9uLFxuICAgIGZpbHRlclNvcnQgPSBwcm9wcy5maWx0ZXJTb3J0LFxuICAgIG9wdGlvbkZpbHRlclByb3AgPSBwcm9wcy5vcHRpb25GaWx0ZXJQcm9wLFxuICAgIG9wdGlvbkxhYmVsUHJvcCA9IHByb3BzLm9wdGlvbkxhYmVsUHJvcCxcbiAgICBvcHRpb25zID0gcHJvcHMub3B0aW9ucyxcbiAgICBvcHRpb25SZW5kZXIgPSBwcm9wcy5vcHRpb25SZW5kZXIsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBkZWZhdWx0QWN0aXZlRmlyc3RPcHRpb24gPSBwcm9wcy5kZWZhdWx0QWN0aXZlRmlyc3RPcHRpb24sXG4gICAgbWVudUl0ZW1TZWxlY3RlZEljb24gPSBwcm9wcy5tZW51SXRlbVNlbGVjdGVkSWNvbixcbiAgICB2aXJ0dWFsID0gcHJvcHMudmlydHVhbCxcbiAgICBkaXJlY3Rpb24gPSBwcm9wcy5kaXJlY3Rpb24sXG4gICAgX3Byb3BzJGxpc3RIZWlnaHQgPSBwcm9wcy5saXN0SGVpZ2h0LFxuICAgIGxpc3RIZWlnaHQgPSBfcHJvcHMkbGlzdEhlaWdodCA9PT0gdm9pZCAwID8gMjAwIDogX3Byb3BzJGxpc3RIZWlnaHQsXG4gICAgX3Byb3BzJGxpc3RJdGVtSGVpZ2h0ID0gcHJvcHMubGlzdEl0ZW1IZWlnaHQsXG4gICAgbGlzdEl0ZW1IZWlnaHQgPSBfcHJvcHMkbGlzdEl0ZW1IZWlnaHQgPT09IHZvaWQgMCA/IDIwIDogX3Byb3BzJGxpc3RJdGVtSGVpZ2h0LFxuICAgIGxhYmVsUmVuZGVyID0gcHJvcHMubGFiZWxSZW5kZXIsXG4gICAgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICBkZWZhdWx0VmFsdWUgPSBwcm9wcy5kZWZhdWx0VmFsdWUsXG4gICAgbGFiZWxJblZhbHVlID0gcHJvcHMubGFiZWxJblZhbHVlLFxuICAgIG9uQ2hhbmdlID0gcHJvcHMub25DaGFuZ2UsXG4gICAgbWF4Q291bnQgPSBwcm9wcy5tYXhDb3VudCxcbiAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIF9leGNsdWRlZCk7XG4gIHZhciBtZXJnZWRJZCA9IHVzZUlkKGlkKTtcbiAgdmFyIG11bHRpcGxlID0gaXNNdWx0aXBsZShtb2RlKTtcbiAgdmFyIGNoaWxkcmVuQXNEYXRhID0gISEoIW9wdGlvbnMgJiYgY2hpbGRyZW4pO1xuICB2YXIgbWVyZ2VkRmlsdGVyT3B0aW9uID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGZpbHRlck9wdGlvbiA9PT0gdW5kZWZpbmVkICYmIG1vZGUgPT09ICdjb21ib2JveCcpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbHRlck9wdGlvbjtcbiAgfSwgW2ZpbHRlck9wdGlvbiwgbW9kZV0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gRmllbGROYW1lcyA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBtZXJnZWRGaWVsZE5hbWVzID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZpbGxGaWVsZE5hbWVzKGZpZWxkTmFtZXMsIGNoaWxkcmVuQXNEYXRhKTtcbiAgfSwgLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzICovXG4gIFtcbiAgLy8gV2Ugc3RyaW5naWZ5IGZpZWxkTmFtZXMgdG8gYXZvaWQgdW5uZWNlc3NhcnkgcmUtcmVuZGVycy5cbiAgSlNPTi5zdHJpbmdpZnkoZmllbGROYW1lcyksIGNoaWxkcmVuQXNEYXRhXVxuICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwcyAqLyk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IFNlYXJjaCA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF91c2VNZXJnZWRTdGF0ZSA9IHVzZU1lcmdlZFN0YXRlKCcnLCB7XG4gICAgICB2YWx1ZTogc2VhcmNoVmFsdWUgIT09IHVuZGVmaW5lZCA/IHNlYXJjaFZhbHVlIDogaW5wdXRWYWx1ZSxcbiAgICAgIHBvc3RTdGF0ZTogZnVuY3Rpb24gcG9zdFN0YXRlKHNlYXJjaCkge1xuICAgICAgICByZXR1cm4gc2VhcmNoIHx8ICcnO1xuICAgICAgfVxuICAgIH0pLFxuICAgIF91c2VNZXJnZWRTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlTWVyZ2VkU3RhdGUsIDIpLFxuICAgIG1lcmdlZFNlYXJjaFZhbHVlID0gX3VzZU1lcmdlZFN0YXRlMlswXSxcbiAgICBzZXRTZWFyY2hWYWx1ZSA9IF91c2VNZXJnZWRTdGF0ZTJbMV07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IE9wdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHBhcnNlZE9wdGlvbnMgPSB1c2VPcHRpb25zKG9wdGlvbnMsIGNoaWxkcmVuLCBtZXJnZWRGaWVsZE5hbWVzLCBvcHRpb25GaWx0ZXJQcm9wLCBvcHRpb25MYWJlbFByb3ApO1xuICB2YXIgdmFsdWVPcHRpb25zID0gcGFyc2VkT3B0aW9ucy52YWx1ZU9wdGlvbnMsXG4gICAgbGFiZWxPcHRpb25zID0gcGFyc2VkT3B0aW9ucy5sYWJlbE9wdGlvbnMsXG4gICAgbWVyZ2VkT3B0aW9ucyA9IHBhcnNlZE9wdGlvbnMub3B0aW9ucztcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IFdyYXAgVmFsdWUgPT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgY29udmVydDJMYWJlbFZhbHVlcyA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChkcmFmdFZhbHVlcykge1xuICAgIC8vIENvbnZlcnQgdG8gYXJyYXlcbiAgICB2YXIgdmFsdWVMaXN0ID0gdG9BcnJheShkcmFmdFZhbHVlcyk7XG5cbiAgICAvLyBDb252ZXJ0IHRvIGxhYmVsSW5WYWx1ZSB0eXBlXG4gICAgcmV0dXJuIHZhbHVlTGlzdC5tYXAoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgdmFyIHJhd1ZhbHVlO1xuICAgICAgdmFyIHJhd0xhYmVsO1xuICAgICAgdmFyIHJhd0tleTtcbiAgICAgIHZhciByYXdEaXNhYmxlZDtcbiAgICAgIHZhciByYXdUaXRsZTtcblxuICAgICAgLy8gRmlsbCBsYWJlbCAmIHZhbHVlXG4gICAgICBpZiAoaXNSYXdWYWx1ZSh2YWwpKSB7XG4gICAgICAgIHJhd1ZhbHVlID0gdmFsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIF92YWwkdmFsdWU7XG4gICAgICAgIHJhd0tleSA9IHZhbC5rZXk7XG4gICAgICAgIHJhd0xhYmVsID0gdmFsLmxhYmVsO1xuICAgICAgICByYXdWYWx1ZSA9IChfdmFsJHZhbHVlID0gdmFsLnZhbHVlKSAhPT0gbnVsbCAmJiBfdmFsJHZhbHVlICE9PSB2b2lkIDAgPyBfdmFsJHZhbHVlIDogcmF3S2V5O1xuICAgICAgfVxuICAgICAgdmFyIG9wdGlvbiA9IHZhbHVlT3B0aW9ucy5nZXQocmF3VmFsdWUpO1xuICAgICAgaWYgKG9wdGlvbikge1xuICAgICAgICB2YXIgX29wdGlvbiRrZXk7XG4gICAgICAgIC8vIEZpbGwgbWlzc2luZyBwcm9wc1xuICAgICAgICBpZiAocmF3TGFiZWwgPT09IHVuZGVmaW5lZCkgcmF3TGFiZWwgPSBvcHRpb24gPT09IG51bGwgfHwgb3B0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25bb3B0aW9uTGFiZWxQcm9wIHx8IG1lcmdlZEZpZWxkTmFtZXMubGFiZWxdO1xuICAgICAgICBpZiAocmF3S2V5ID09PSB1bmRlZmluZWQpIHJhd0tleSA9IChfb3B0aW9uJGtleSA9IG9wdGlvbiA9PT0gbnVsbCB8fCBvcHRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbi5rZXkpICE9PSBudWxsICYmIF9vcHRpb24ka2V5ICE9PSB2b2lkIDAgPyBfb3B0aW9uJGtleSA6IHJhd1ZhbHVlO1xuICAgICAgICByYXdEaXNhYmxlZCA9IG9wdGlvbiA9PT0gbnVsbCB8fCBvcHRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbi5kaXNhYmxlZDtcbiAgICAgICAgcmF3VGl0bGUgPSBvcHRpb24gPT09IG51bGwgfHwgb3B0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb24udGl0bGU7XG5cbiAgICAgICAgLy8gV2FybmluZyBpZiBsYWJlbCBub3Qgc2FtZSBhcyBwcm92aWRlZFxuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAhb3B0aW9uTGFiZWxQcm9wKSB7XG4gICAgICAgICAgdmFyIG9wdGlvbkxhYmVsID0gb3B0aW9uID09PSBudWxsIHx8IG9wdGlvbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9uW21lcmdlZEZpZWxkTmFtZXMubGFiZWxdO1xuICAgICAgICAgIGlmIChvcHRpb25MYWJlbCAhPT0gdW5kZWZpbmVkICYmICEgLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KG9wdGlvbkxhYmVsKSAmJiAhIC8qI19fUFVSRV9fKi9SZWFjdC5pc1ZhbGlkRWxlbWVudChyYXdMYWJlbCkgJiYgb3B0aW9uTGFiZWwgIT09IHJhd0xhYmVsKSB7XG4gICAgICAgICAgICB3YXJuaW5nKGZhbHNlLCAnYGxhYmVsYCBvZiBgdmFsdWVgIGlzIG5vdCBzYW1lIGFzIGBsYWJlbGAgaW4gU2VsZWN0IG9wdGlvbnMuJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsYWJlbDogcmF3TGFiZWwsXG4gICAgICAgIHZhbHVlOiByYXdWYWx1ZSxcbiAgICAgICAga2V5OiByYXdLZXksXG4gICAgICAgIGRpc2FibGVkOiByYXdEaXNhYmxlZCxcbiAgICAgICAgdGl0bGU6IHJhd1RpdGxlXG4gICAgICB9O1xuICAgIH0pO1xuICB9LCBbbWVyZ2VkRmllbGROYW1lcywgb3B0aW9uTGFiZWxQcm9wLCB2YWx1ZU9wdGlvbnNdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gVmFsdWVzID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX3VzZU1lcmdlZFN0YXRlMyA9IHVzZU1lcmdlZFN0YXRlKGRlZmF1bHRWYWx1ZSwge1xuICAgICAgdmFsdWU6IHZhbHVlXG4gICAgfSksXG4gICAgX3VzZU1lcmdlZFN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF91c2VNZXJnZWRTdGF0ZTMsIDIpLFxuICAgIGludGVybmFsVmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGU0WzBdLFxuICAgIHNldEludGVybmFsVmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGU0WzFdO1xuXG4gIC8vIE1lcmdlZCB2YWx1ZSB3aXRoIExhYmVsVmFsdWVUeXBlXG4gIHZhciByYXdMYWJlbGVkVmFsdWVzID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF92YWx1ZXMkO1xuICAgIHZhciBuZXdJbnRlcm5hbFZhbHVlID0gbXVsdGlwbGUgJiYgaW50ZXJuYWxWYWx1ZSA9PT0gbnVsbCA/IFtdIDogaW50ZXJuYWxWYWx1ZTtcbiAgICB2YXIgdmFsdWVzID0gY29udmVydDJMYWJlbFZhbHVlcyhuZXdJbnRlcm5hbFZhbHVlKTtcblxuICAgIC8vIGNvbWJvYm94IG5vIG5lZWQgc2F2ZSB2YWx1ZSB3aGVuIGl0J3Mgbm8gdmFsdWUgKGV4Y2x1ZGUgdmFsdWUgZXF1YWwgMClcbiAgICBpZiAobW9kZSA9PT0gJ2NvbWJvYm94JyAmJiBpc0NvbWJvTm9WYWx1ZSgoX3ZhbHVlcyQgPSB2YWx1ZXNbMF0pID09PSBudWxsIHx8IF92YWx1ZXMkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdmFsdWVzJC52YWx1ZSkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfSwgW2ludGVybmFsVmFsdWUsIGNvbnZlcnQyTGFiZWxWYWx1ZXMsIG1vZGUsIG11bHRpcGxlXSk7XG5cbiAgLy8gRmlsbCBsYWJlbCB3aXRoIGNhY2hlIHRvIGF2b2lkIG9wdGlvbiByZW1vdmVcbiAgdmFyIF91c2VDYWNoZSA9IHVzZUNhY2hlKHJhd0xhYmVsZWRWYWx1ZXMsIHZhbHVlT3B0aW9ucyksXG4gICAgX3VzZUNhY2hlMiA9IF9zbGljZWRUb0FycmF5KF91c2VDYWNoZSwgMiksXG4gICAgbWVyZ2VkVmFsdWVzID0gX3VzZUNhY2hlMlswXSxcbiAgICBnZXRNaXhlZE9wdGlvbiA9IF91c2VDYWNoZTJbMV07XG4gIHZhciBkaXNwbGF5VmFsdWVzID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgLy8gYG51bGxgIG5lZWQgc2hvdyBhcyBwbGFjZWhvbGRlciBpbnN0ZWFkXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMjUwNTdcbiAgICBpZiAoIW1vZGUgJiYgbWVyZ2VkVmFsdWVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdmFyIGZpcnN0VmFsdWUgPSBtZXJnZWRWYWx1ZXNbMF07XG4gICAgICBpZiAoZmlyc3RWYWx1ZS52YWx1ZSA9PT0gbnVsbCAmJiAoZmlyc3RWYWx1ZS5sYWJlbCA9PT0gbnVsbCB8fCBmaXJzdFZhbHVlLmxhYmVsID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZFZhbHVlcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHZhciBfcmVmO1xuICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgaXRlbSksIHt9LCB7XG4gICAgICAgIGxhYmVsOiAoX3JlZiA9IHR5cGVvZiBsYWJlbFJlbmRlciA9PT0gJ2Z1bmN0aW9uJyA/IGxhYmVsUmVuZGVyKGl0ZW0pIDogaXRlbS5sYWJlbCkgIT09IG51bGwgJiYgX3JlZiAhPT0gdm9pZCAwID8gX3JlZiA6IGl0ZW0udmFsdWVcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9LCBbbW9kZSwgbWVyZ2VkVmFsdWVzLCBsYWJlbFJlbmRlcl0pO1xuXG4gIC8qKiBDb252ZXJ0IGBkaXNwbGF5VmFsdWVzYCB0byByYXcgdmFsdWUgdHlwZSBzZXQgKi9cbiAgdmFyIHJhd1ZhbHVlcyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgU2V0KG1lcmdlZFZhbHVlcy5tYXAoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgcmV0dXJuIHZhbC52YWx1ZTtcbiAgICB9KSk7XG4gIH0sIFttZXJnZWRWYWx1ZXNdKTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAobW9kZSA9PT0gJ2NvbWJvYm94Jykge1xuICAgICAgdmFyIF9tZXJnZWRWYWx1ZXMkO1xuICAgICAgdmFyIHN0clZhbHVlID0gKF9tZXJnZWRWYWx1ZXMkID0gbWVyZ2VkVmFsdWVzWzBdKSA9PT0gbnVsbCB8fCBfbWVyZ2VkVmFsdWVzJCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX21lcmdlZFZhbHVlcyQudmFsdWU7XG4gICAgICBzZXRTZWFyY2hWYWx1ZShoYXNWYWx1ZShzdHJWYWx1ZSkgPyBTdHJpbmcoc3RyVmFsdWUpIDogJycpO1xuICAgIH1cbiAgfSwgW21lcmdlZFZhbHVlc10pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09IERpc3BsYXkgT3B0aW9uID09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENyZWF0ZSBhIHBsYWNlaG9sZGVyIGl0ZW0gaWYgbm90IGV4aXN0IGluIGBvcHRpb25zYFxuICB2YXIgY3JlYXRlVGFnT3B0aW9uID0gdXNlUmVmRnVuYyhmdW5jdGlvbiAodmFsLCBsYWJlbCkge1xuICAgIHZhciBtZXJnZWRMYWJlbCA9IGxhYmVsICE9PSBudWxsICYmIGxhYmVsICE9PSB2b2lkIDAgPyBsYWJlbCA6IHZhbDtcbiAgICByZXR1cm4gX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eSh7fSwgbWVyZ2VkRmllbGROYW1lcy52YWx1ZSwgdmFsKSwgbWVyZ2VkRmllbGROYW1lcy5sYWJlbCwgbWVyZ2VkTGFiZWwpO1xuICB9KTtcblxuICAvLyBGaWxsIHRhZyBhcyBvcHRpb24gaWYgbW9kZSBpcyBgdGFnc2BcbiAgdmFyIGZpbGxlZFRhZ09wdGlvbnMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAobW9kZSAhPT0gJ3RhZ3MnKSB7XG4gICAgICByZXR1cm4gbWVyZ2VkT3B0aW9ucztcbiAgICB9XG5cbiAgICAvLyA+Pj4gVGFnIG1vZGVcbiAgICB2YXIgY2xvbmVPcHRpb25zID0gX3RvQ29uc3VtYWJsZUFycmF5KG1lcmdlZE9wdGlvbnMpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdmFsdWUgZXhpc3QgaW4gb3B0aW9ucyAoaW5jbHVkZSBuZXcgcGF0Y2ggaXRlbSlcbiAgICB2YXIgZXhpc3RPcHRpb25zID0gZnVuY3Rpb24gZXhpc3RPcHRpb25zKHZhbCkge1xuICAgICAgcmV0dXJuIHZhbHVlT3B0aW9ucy5oYXModmFsKTtcbiAgICB9O1xuXG4gICAgLy8gRmlsbCBjdXJyZW50IHZhbHVlIGFzIG9wdGlvblxuICAgIF90b0NvbnN1bWFibGVBcnJheShtZXJnZWRWYWx1ZXMpLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBhLnZhbHVlIDwgYi52YWx1ZSA/IC0xIDogMTtcbiAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICB2YXIgdmFsID0gaXRlbS52YWx1ZTtcbiAgICAgIGlmICghZXhpc3RPcHRpb25zKHZhbCkpIHtcbiAgICAgICAgY2xvbmVPcHRpb25zLnB1c2goY3JlYXRlVGFnT3B0aW9uKHZhbCwgaXRlbS5sYWJlbCkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjbG9uZU9wdGlvbnM7XG4gIH0sIFtjcmVhdGVUYWdPcHRpb24sIG1lcmdlZE9wdGlvbnMsIHZhbHVlT3B0aW9ucywgbWVyZ2VkVmFsdWVzLCBtb2RlXSk7XG4gIHZhciBmaWx0ZXJlZE9wdGlvbnMgPSB1c2VGaWx0ZXJPcHRpb25zKGZpbGxlZFRhZ09wdGlvbnMsIG1lcmdlZEZpZWxkTmFtZXMsIG1lcmdlZFNlYXJjaFZhbHVlLCBtZXJnZWRGaWx0ZXJPcHRpb24sIG9wdGlvbkZpbHRlclByb3ApO1xuXG4gIC8vIEZpbGwgb3B0aW9ucyB3aXRoIHNlYXJjaCB2YWx1ZSBpZiBuZWVkZWRcbiAgdmFyIGZpbGxlZFNlYXJjaE9wdGlvbnMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAobW9kZSAhPT0gJ3RhZ3MnIHx8ICFtZXJnZWRTZWFyY2hWYWx1ZSB8fCBmaWx0ZXJlZE9wdGlvbnMuc29tZShmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIGl0ZW1bb3B0aW9uRmlsdGVyUHJvcCB8fCAndmFsdWUnXSA9PT0gbWVyZ2VkU2VhcmNoVmFsdWU7XG4gICAgfSkpIHtcbiAgICAgIHJldHVybiBmaWx0ZXJlZE9wdGlvbnM7XG4gICAgfVxuICAgIC8vIGlnbm9yZSB3aGVuIHNlYXJjaCB2YWx1ZSBlcXVhbCBzZWxlY3QgaW5wdXQgdmFsdWVcbiAgICBpZiAoZmlsdGVyZWRPcHRpb25zLnNvbWUoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBpdGVtW21lcmdlZEZpZWxkTmFtZXMudmFsdWVdID09PSBtZXJnZWRTZWFyY2hWYWx1ZTtcbiAgICB9KSkge1xuICAgICAgcmV0dXJuIGZpbHRlcmVkT3B0aW9ucztcbiAgICB9XG4gICAgLy8gRmlsbCBzZWFyY2ggdmFsdWUgYXMgb3B0aW9uXG4gICAgcmV0dXJuIFtjcmVhdGVUYWdPcHRpb24obWVyZ2VkU2VhcmNoVmFsdWUpXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGZpbHRlcmVkT3B0aW9ucykpO1xuICB9LCBbY3JlYXRlVGFnT3B0aW9uLCBvcHRpb25GaWx0ZXJQcm9wLCBtb2RlLCBmaWx0ZXJlZE9wdGlvbnMsIG1lcmdlZFNlYXJjaFZhbHVlLCBtZXJnZWRGaWVsZE5hbWVzXSk7XG4gIHZhciBzb3J0ZXIgPSBmdW5jdGlvbiBzb3J0ZXIoaW5wdXRPcHRpb25zKSB7XG4gICAgdmFyIHNvcnRlZE9wdGlvbnMgPSBfdG9Db25zdW1hYmxlQXJyYXkoaW5wdXRPcHRpb25zKS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gZmlsdGVyU29ydChhLCBiLCB7XG4gICAgICAgIHNlYXJjaFZhbHVlOiBtZXJnZWRTZWFyY2hWYWx1ZVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHNvcnRlZE9wdGlvbnMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtLm9wdGlvbnMpKSB7XG4gICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGl0ZW0pLCB7fSwge1xuICAgICAgICAgIG9wdGlvbnM6IGl0ZW0ub3B0aW9ucy5sZW5ndGggPiAwID8gc29ydGVyKGl0ZW0ub3B0aW9ucykgOiBpdGVtLm9wdGlvbnNcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9KTtcbiAgfTtcbiAgdmFyIG9yZGVyZWRGaWx0ZXJlZE9wdGlvbnMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWZpbHRlclNvcnQpIHtcbiAgICAgIHJldHVybiBmaWxsZWRTZWFyY2hPcHRpb25zO1xuICAgIH1cbiAgICByZXR1cm4gc29ydGVyKGZpbGxlZFNlYXJjaE9wdGlvbnMpO1xuICB9LCBbZmlsbGVkU2VhcmNoT3B0aW9ucywgZmlsdGVyU29ydCwgbWVyZ2VkU2VhcmNoVmFsdWVdKTtcbiAgdmFyIGRpc3BsYXlPcHRpb25zID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZsYXR0ZW5PcHRpb25zKG9yZGVyZWRGaWx0ZXJlZE9wdGlvbnMsIHtcbiAgICAgIGZpZWxkTmFtZXM6IG1lcmdlZEZpZWxkTmFtZXMsXG4gICAgICBjaGlsZHJlbkFzRGF0YTogY2hpbGRyZW5Bc0RhdGFcbiAgICB9KTtcbiAgfSwgW29yZGVyZWRGaWx0ZXJlZE9wdGlvbnMsIG1lcmdlZEZpZWxkTmFtZXMsIGNoaWxkcmVuQXNEYXRhXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IENoYW5nZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHRyaWdnZXJDaGFuZ2UgPSBmdW5jdGlvbiB0cmlnZ2VyQ2hhbmdlKHZhbHVlcykge1xuICAgIHZhciBsYWJlbGVkVmFsdWVzID0gY29udmVydDJMYWJlbFZhbHVlcyh2YWx1ZXMpO1xuICAgIHNldEludGVybmFsVmFsdWUobGFiZWxlZFZhbHVlcyk7XG4gICAgaWYgKG9uQ2hhbmdlICYmIChcbiAgICAvLyBUcmlnZ2VyIGV2ZW50IG9ubHkgd2hlbiB2YWx1ZSBjaGFuZ2VkXG4gICAgbGFiZWxlZFZhbHVlcy5sZW5ndGggIT09IG1lcmdlZFZhbHVlcy5sZW5ndGggfHwgbGFiZWxlZFZhbHVlcy5zb21lKGZ1bmN0aW9uIChuZXdWYWwsIGluZGV4KSB7XG4gICAgICB2YXIgX21lcmdlZFZhbHVlcyRpbmRleDtcbiAgICAgIHJldHVybiAoKF9tZXJnZWRWYWx1ZXMkaW5kZXggPSBtZXJnZWRWYWx1ZXNbaW5kZXhdKSA9PT0gbnVsbCB8fCBfbWVyZ2VkVmFsdWVzJGluZGV4ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfbWVyZ2VkVmFsdWVzJGluZGV4LnZhbHVlKSAhPT0gKG5ld1ZhbCA9PT0gbnVsbCB8fCBuZXdWYWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG5ld1ZhbC52YWx1ZSk7XG4gICAgfSkpKSB7XG4gICAgICB2YXIgcmV0dXJuVmFsdWVzID0gbGFiZWxJblZhbHVlID8gbGFiZWxlZFZhbHVlcyA6IGxhYmVsZWRWYWx1ZXMubWFwKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgIHJldHVybiB2LnZhbHVlO1xuICAgICAgfSk7XG4gICAgICB2YXIgcmV0dXJuT3B0aW9ucyA9IGxhYmVsZWRWYWx1ZXMubWFwKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgIHJldHVybiBpbmplY3RQcm9wc1dpdGhPcHRpb24oZ2V0TWl4ZWRPcHRpb24odi52YWx1ZSkpO1xuICAgICAgfSk7XG4gICAgICBvbkNoYW5nZShcbiAgICAgIC8vIFZhbHVlXG4gICAgICBtdWx0aXBsZSA/IHJldHVyblZhbHVlcyA6IHJldHVyblZhbHVlc1swXSxcbiAgICAgIC8vIE9wdGlvblxuICAgICAgbXVsdGlwbGUgPyByZXR1cm5PcHRpb25zIDogcmV0dXJuT3B0aW9uc1swXSk7XG4gICAgfVxuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09IEFjY2Vzc2liaWxpdHkgPT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShudWxsKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBhY3RpdmVWYWx1ZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0QWN0aXZlVmFsdWUgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlMyA9IFJlYWN0LnVzZVN0YXRlKDApLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUzLCAyKSxcbiAgICBhY2Nlc3NpYmlsaXR5SW5kZXggPSBfUmVhY3QkdXNlU3RhdGU0WzBdLFxuICAgIHNldEFjY2Vzc2liaWxpdHlJbmRleCA9IF9SZWFjdCR1c2VTdGF0ZTRbMV07XG4gIHZhciBtZXJnZWREZWZhdWx0QWN0aXZlRmlyc3RPcHRpb24gPSBkZWZhdWx0QWN0aXZlRmlyc3RPcHRpb24gIT09IHVuZGVmaW5lZCA/IGRlZmF1bHRBY3RpdmVGaXJzdE9wdGlvbiA6IG1vZGUgIT09ICdjb21ib2JveCc7XG4gIHZhciBvbkFjdGl2ZVZhbHVlID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGFjdGl2ZSwgaW5kZXgpIHtcbiAgICB2YXIgX3JlZjMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9LFxuICAgICAgX3JlZjMkc291cmNlID0gX3JlZjMuc291cmNlLFxuICAgICAgc291cmNlID0gX3JlZjMkc291cmNlID09PSB2b2lkIDAgPyAna2V5Ym9hcmQnIDogX3JlZjMkc291cmNlO1xuICAgIHNldEFjY2Vzc2liaWxpdHlJbmRleChpbmRleCk7XG4gICAgaWYgKGJhY2tmaWxsICYmIG1vZGUgPT09ICdjb21ib2JveCcgJiYgYWN0aXZlICE9PSBudWxsICYmIHNvdXJjZSA9PT0gJ2tleWJvYXJkJykge1xuICAgICAgc2V0QWN0aXZlVmFsdWUoU3RyaW5nKGFjdGl2ZSkpO1xuICAgIH1cbiAgfSwgW2JhY2tmaWxsLCBtb2RlXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBPcHRpb25MaXN0ID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHRyaWdnZXJTZWxlY3QgPSBmdW5jdGlvbiB0cmlnZ2VyU2VsZWN0KHZhbCwgc2VsZWN0ZWQsIHR5cGUpIHtcbiAgICB2YXIgZ2V0U2VsZWN0RW50ID0gZnVuY3Rpb24gZ2V0U2VsZWN0RW50KCkge1xuICAgICAgdmFyIF9vcHRpb24ka2V5MjtcbiAgICAgIHZhciBvcHRpb24gPSBnZXRNaXhlZE9wdGlvbih2YWwpO1xuICAgICAgcmV0dXJuIFtsYWJlbEluVmFsdWUgPyB7XG4gICAgICAgIGxhYmVsOiBvcHRpb24gPT09IG51bGwgfHwgb3B0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25bbWVyZ2VkRmllbGROYW1lcy5sYWJlbF0sXG4gICAgICAgIHZhbHVlOiB2YWwsXG4gICAgICAgIGtleTogKF9vcHRpb24ka2V5MiA9IG9wdGlvbiA9PT0gbnVsbCB8fCBvcHRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbi5rZXkpICE9PSBudWxsICYmIF9vcHRpb24ka2V5MiAhPT0gdm9pZCAwID8gX29wdGlvbiRrZXkyIDogdmFsXG4gICAgICB9IDogdmFsLCBpbmplY3RQcm9wc1dpdGhPcHRpb24ob3B0aW9uKV07XG4gICAgfTtcbiAgICBpZiAoc2VsZWN0ZWQgJiYgb25TZWxlY3QpIHtcbiAgICAgIHZhciBfZ2V0U2VsZWN0RW50ID0gZ2V0U2VsZWN0RW50KCksXG4gICAgICAgIF9nZXRTZWxlY3RFbnQyID0gX3NsaWNlZFRvQXJyYXkoX2dldFNlbGVjdEVudCwgMiksXG4gICAgICAgIHdyYXBwZWRWYWx1ZSA9IF9nZXRTZWxlY3RFbnQyWzBdLFxuICAgICAgICBfb3B0aW9uID0gX2dldFNlbGVjdEVudDJbMV07XG4gICAgICBvblNlbGVjdCh3cmFwcGVkVmFsdWUsIF9vcHRpb24pO1xuICAgIH0gZWxzZSBpZiAoIXNlbGVjdGVkICYmIG9uRGVzZWxlY3QgJiYgdHlwZSAhPT0gJ2NsZWFyJykge1xuICAgICAgdmFyIF9nZXRTZWxlY3RFbnQzID0gZ2V0U2VsZWN0RW50KCksXG4gICAgICAgIF9nZXRTZWxlY3RFbnQ0ID0gX3NsaWNlZFRvQXJyYXkoX2dldFNlbGVjdEVudDMsIDIpLFxuICAgICAgICBfd3JhcHBlZFZhbHVlID0gX2dldFNlbGVjdEVudDRbMF0sXG4gICAgICAgIF9vcHRpb24yID0gX2dldFNlbGVjdEVudDRbMV07XG4gICAgICBvbkRlc2VsZWN0KF93cmFwcGVkVmFsdWUsIF9vcHRpb24yKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gVXNlZCBmb3IgT3B0aW9uTGlzdCBzZWxlY3Rpb25cbiAgdmFyIG9uSW50ZXJuYWxTZWxlY3QgPSB1c2VSZWZGdW5jKGZ1bmN0aW9uICh2YWwsIGluZm8pIHtcbiAgICB2YXIgY2xvbmVWYWx1ZXM7XG5cbiAgICAvLyBTaW5nbGUgbW9kZSBhbHdheXMgdHJpZ2dlciBzZWxlY3Qgb25seSB3aXRoIG9wdGlvbiBsaXN0XG4gICAgdmFyIG1lcmdlZFNlbGVjdCA9IG11bHRpcGxlID8gaW5mby5zZWxlY3RlZCA6IHRydWU7XG4gICAgaWYgKG1lcmdlZFNlbGVjdCkge1xuICAgICAgY2xvbmVWYWx1ZXMgPSBtdWx0aXBsZSA/IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkobWVyZ2VkVmFsdWVzKSwgW3ZhbF0pIDogW3ZhbF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNsb25lVmFsdWVzID0gbWVyZ2VkVmFsdWVzLmZpbHRlcihmdW5jdGlvbiAodikge1xuICAgICAgICByZXR1cm4gdi52YWx1ZSAhPT0gdmFsO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRyaWdnZXJDaGFuZ2UoY2xvbmVWYWx1ZXMpO1xuICAgIHRyaWdnZXJTZWxlY3QodmFsLCBtZXJnZWRTZWxlY3QpO1xuXG4gICAgLy8gQ2xlYW4gc2VhcmNoIHZhbHVlIGlmIHNpbmdsZSBvciBjb25maWd1cmVkXG4gICAgaWYgKG1vZGUgPT09ICdjb21ib2JveCcpIHtcbiAgICAgIC8vIHNldFNlYXJjaFZhbHVlKFN0cmluZyh2YWwpKTtcbiAgICAgIHNldEFjdGl2ZVZhbHVlKCcnKTtcbiAgICB9IGVsc2UgaWYgKCFpc011bHRpcGxlIHx8IGF1dG9DbGVhclNlYXJjaFZhbHVlKSB7XG4gICAgICBzZXRTZWFyY2hWYWx1ZSgnJyk7XG4gICAgICBzZXRBY3RpdmVWYWx1ZSgnJyk7XG4gICAgfVxuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBEaXNwbGF5IENoYW5nZSA9PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBCYXNlU2VsZWN0IGRpc3BsYXkgdmFsdWVzIGNoYW5nZVxuICB2YXIgb25EaXNwbGF5VmFsdWVzQ2hhbmdlID0gZnVuY3Rpb24gb25EaXNwbGF5VmFsdWVzQ2hhbmdlKG5leHRWYWx1ZXMsIGluZm8pIHtcbiAgICB0cmlnZ2VyQ2hhbmdlKG5leHRWYWx1ZXMpO1xuICAgIHZhciB0eXBlID0gaW5mby50eXBlLFxuICAgICAgdmFsdWVzID0gaW5mby52YWx1ZXM7XG4gICAgaWYgKHR5cGUgPT09ICdyZW1vdmUnIHx8IHR5cGUgPT09ICdjbGVhcicpIHtcbiAgICAgIHZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHRyaWdnZXJTZWxlY3QoaXRlbS52YWx1ZSwgZmFsc2UsIHR5cGUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBTZWFyY2ggPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBvbkludGVybmFsU2VhcmNoID0gZnVuY3Rpb24gb25JbnRlcm5hbFNlYXJjaChzZWFyY2hUZXh0LCBpbmZvKSB7XG4gICAgc2V0U2VhcmNoVmFsdWUoc2VhcmNoVGV4dCk7XG4gICAgc2V0QWN0aXZlVmFsdWUobnVsbCk7XG5cbiAgICAvLyBbU3VibWl0XSBUYWcgbW9kZSBzaG91bGQgZmx1c2ggaW5wdXRcbiAgICBpZiAoaW5mby5zb3VyY2UgPT09ICdzdWJtaXQnKSB7XG4gICAgICB2YXIgZm9ybWF0dGVkID0gKHNlYXJjaFRleHQgfHwgJycpLnRyaW0oKTtcbiAgICAgIC8vIHByZXZlbnQgZW1wdHkgdGFncyBmcm9tIGFwcGVhcmluZyB3aGVuIHlvdSBjbGljayB0aGUgRW50ZXIgYnV0dG9uXG4gICAgICBpZiAoZm9ybWF0dGVkKSB7XG4gICAgICAgIHZhciBuZXdSYXdWYWx1ZXMgPSBBcnJheS5mcm9tKG5ldyBTZXQoW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShyYXdWYWx1ZXMpLCBbZm9ybWF0dGVkXSkpKTtcbiAgICAgICAgdHJpZ2dlckNoYW5nZShuZXdSYXdWYWx1ZXMpO1xuICAgICAgICB0cmlnZ2VyU2VsZWN0KGZvcm1hdHRlZCwgdHJ1ZSk7XG4gICAgICAgIHNldFNlYXJjaFZhbHVlKCcnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGluZm8uc291cmNlICE9PSAnYmx1cicpIHtcbiAgICAgIGlmIChtb2RlID09PSAnY29tYm9ib3gnKSB7XG4gICAgICAgIHRyaWdnZXJDaGFuZ2Uoc2VhcmNoVGV4dCk7XG4gICAgICB9XG4gICAgICBvblNlYXJjaCA9PT0gbnVsbCB8fCBvblNlYXJjaCA9PT0gdm9pZCAwIHx8IG9uU2VhcmNoKHNlYXJjaFRleHQpO1xuICAgIH1cbiAgfTtcbiAgdmFyIG9uSW50ZXJuYWxTZWFyY2hTcGxpdCA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxTZWFyY2hTcGxpdCh3b3Jkcykge1xuICAgIHZhciBwYXRjaFZhbHVlcyA9IHdvcmRzO1xuICAgIGlmIChtb2RlICE9PSAndGFncycpIHtcbiAgICAgIHBhdGNoVmFsdWVzID0gd29yZHMubWFwKGZ1bmN0aW9uICh3b3JkKSB7XG4gICAgICAgIHZhciBvcHQgPSBsYWJlbE9wdGlvbnMuZ2V0KHdvcmQpO1xuICAgICAgICByZXR1cm4gb3B0ID09PSBudWxsIHx8IG9wdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0LnZhbHVlO1xuICAgICAgfSkuZmlsdGVyKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgcmV0dXJuIHZhbCAhPT0gdW5kZWZpbmVkO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHZhciBuZXdSYXdWYWx1ZXMgPSBBcnJheS5mcm9tKG5ldyBTZXQoW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShyYXdWYWx1ZXMpLCBfdG9Db25zdW1hYmxlQXJyYXkocGF0Y2hWYWx1ZXMpKSkpO1xuICAgIHRyaWdnZXJDaGFuZ2UobmV3UmF3VmFsdWVzKTtcbiAgICBuZXdSYXdWYWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAobmV3UmF3VmFsdWUpIHtcbiAgICAgIHRyaWdnZXJTZWxlY3QobmV3UmF3VmFsdWUsIHRydWUpO1xuICAgIH0pO1xuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IENvbnRleHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBzZWxlY3RDb250ZXh0ID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJlYWxWaXJ0dWFsID0gdmlydHVhbCAhPT0gZmFsc2UgJiYgZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoICE9PSBmYWxzZTtcbiAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwYXJzZWRPcHRpb25zKSwge30sIHtcbiAgICAgIGZsYXR0ZW5PcHRpb25zOiBkaXNwbGF5T3B0aW9ucyxcbiAgICAgIG9uQWN0aXZlVmFsdWU6IG9uQWN0aXZlVmFsdWUsXG4gICAgICBkZWZhdWx0QWN0aXZlRmlyc3RPcHRpb246IG1lcmdlZERlZmF1bHRBY3RpdmVGaXJzdE9wdGlvbixcbiAgICAgIG9uU2VsZWN0OiBvbkludGVybmFsU2VsZWN0LFxuICAgICAgbWVudUl0ZW1TZWxlY3RlZEljb246IG1lbnVJdGVtU2VsZWN0ZWRJY29uLFxuICAgICAgcmF3VmFsdWVzOiByYXdWYWx1ZXMsXG4gICAgICBmaWVsZE5hbWVzOiBtZXJnZWRGaWVsZE5hbWVzLFxuICAgICAgdmlydHVhbDogcmVhbFZpcnR1YWwsXG4gICAgICBkaXJlY3Rpb246IGRpcmVjdGlvbixcbiAgICAgIGxpc3RIZWlnaHQ6IGxpc3RIZWlnaHQsXG4gICAgICBsaXN0SXRlbUhlaWdodDogbGlzdEl0ZW1IZWlnaHQsXG4gICAgICBjaGlsZHJlbkFzRGF0YTogY2hpbGRyZW5Bc0RhdGEsXG4gICAgICBtYXhDb3VudDogbWF4Q291bnQsXG4gICAgICBvcHRpb25SZW5kZXI6IG9wdGlvblJlbmRlclxuICAgIH0pO1xuICB9LCBbbWF4Q291bnQsIHBhcnNlZE9wdGlvbnMsIGRpc3BsYXlPcHRpb25zLCBvbkFjdGl2ZVZhbHVlLCBtZXJnZWREZWZhdWx0QWN0aXZlRmlyc3RPcHRpb24sIG9uSW50ZXJuYWxTZWxlY3QsIG1lbnVJdGVtU2VsZWN0ZWRJY29uLCByYXdWYWx1ZXMsIG1lcmdlZEZpZWxkTmFtZXMsIHZpcnR1YWwsIGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCwgZGlyZWN0aW9uLCBsaXN0SGVpZ2h0LCBsaXN0SXRlbUhlaWdodCwgY2hpbGRyZW5Bc0RhdGEsIG9wdGlvblJlbmRlcl0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IFdhcm5pbmcgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgd2FybmluZ1Byb3BzKHByb3BzKTtcbiAgICB3YXJuaW5nTnVsbE9wdGlvbnMobWVyZ2VkT3B0aW9ucywgbWVyZ2VkRmllbGROYW1lcyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyA9PSAgICAgICAgICAgICAgICAgICAgICAgICAgUmVuZGVyICAgICAgICAgICAgICAgICAgICAgICAgICA9PVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU2VsZWN0Q29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBzZWxlY3RDb250ZXh0XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEJhc2VTZWxlY3QsIF9leHRlbmRzKHt9LCByZXN0UHJvcHMsIHtcbiAgICAvLyA+Pj4gTUlTQ1xuICAgIGlkOiBtZXJnZWRJZCxcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICByZWY6IHJlZixcbiAgICBvbWl0RG9tUHJvcHM6IE9NSVRfRE9NX1BST1BTLFxuICAgIG1vZGU6IG1vZGVcbiAgICAvLyA+Pj4gVmFsdWVzXG4gICAgLFxuICAgIGRpc3BsYXlWYWx1ZXM6IGRpc3BsYXlWYWx1ZXMsXG4gICAgb25EaXNwbGF5VmFsdWVzQ2hhbmdlOiBvbkRpc3BsYXlWYWx1ZXNDaGFuZ2VcbiAgICAvLyA+Pj4gVHJpZ2dlclxuICAgICxcbiAgICBkaXJlY3Rpb246IGRpcmVjdGlvblxuICAgIC8vID4+PiBTZWFyY2hcbiAgICAsXG4gICAgc2VhcmNoVmFsdWU6IG1lcmdlZFNlYXJjaFZhbHVlLFxuICAgIG9uU2VhcmNoOiBvbkludGVybmFsU2VhcmNoLFxuICAgIGF1dG9DbGVhclNlYXJjaFZhbHVlOiBhdXRvQ2xlYXJTZWFyY2hWYWx1ZSxcbiAgICBvblNlYXJjaFNwbGl0OiBvbkludGVybmFsU2VhcmNoU3BsaXQsXG4gICAgZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoOiBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGhcbiAgICAvLyA+Pj4gT3B0aW9uTGlzdFxuICAgICxcbiAgICBPcHRpb25MaXN0OiBPcHRpb25MaXN0LFxuICAgIGVtcHR5T3B0aW9uczogIWRpc3BsYXlPcHRpb25zLmxlbmd0aFxuICAgIC8vID4+PiBBY2Nlc3NpYmlsaXR5XG4gICAgLFxuICAgIGFjdGl2ZVZhbHVlOiBhY3RpdmVWYWx1ZSxcbiAgICBhY3RpdmVEZXNjZW5kYW50SWQ6IFwiXCIuY29uY2F0KG1lcmdlZElkLCBcIl9saXN0X1wiKS5jb25jYXQoYWNjZXNzaWJpbGl0eUluZGV4KVxuICB9KSkpO1xufSk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBTZWxlY3QuZGlzcGxheU5hbWUgPSAnU2VsZWN0Jztcbn1cbnZhciBUeXBlZFNlbGVjdCA9IFNlbGVjdDtcblR5cGVkU2VsZWN0Lk9wdGlvbiA9IE9wdGlvbjtcblR5cGVkU2VsZWN0Lk9wdEdyb3VwID0gT3B0R3JvdXA7XG5leHBvcnQgZGVmYXVsdCBUeXBlZFNlbGVjdDsiLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiaWRcIiwgXCJwcmVmaXhDbHNcIiwgXCJjbGFzc05hbWVcIiwgXCJzaG93U2VhcmNoXCIsIFwidGFnUmVuZGVyXCIsIFwiZGlyZWN0aW9uXCIsIFwib21pdERvbVByb3BzXCIsIFwiZGlzcGxheVZhbHVlc1wiLCBcIm9uRGlzcGxheVZhbHVlc0NoYW5nZVwiLCBcImVtcHR5T3B0aW9uc1wiLCBcIm5vdEZvdW5kQ29udGVudFwiLCBcIm9uQ2xlYXJcIiwgXCJtb2RlXCIsIFwiZGlzYWJsZWRcIiwgXCJsb2FkaW5nXCIsIFwiZ2V0SW5wdXRFbGVtZW50XCIsIFwiZ2V0UmF3SW5wdXRFbGVtZW50XCIsIFwib3BlblwiLCBcImRlZmF1bHRPcGVuXCIsIFwib25Ecm9wZG93blZpc2libGVDaGFuZ2VcIiwgXCJhY3RpdmVWYWx1ZVwiLCBcIm9uQWN0aXZlVmFsdWVDaGFuZ2VcIiwgXCJhY3RpdmVEZXNjZW5kYW50SWRcIiwgXCJzZWFyY2hWYWx1ZVwiLCBcImF1dG9DbGVhclNlYXJjaFZhbHVlXCIsIFwib25TZWFyY2hcIiwgXCJvblNlYXJjaFNwbGl0XCIsIFwidG9rZW5TZXBhcmF0b3JzXCIsIFwiYWxsb3dDbGVhclwiLCBcInByZWZpeFwiLCBcInN1ZmZpeEljb25cIiwgXCJjbGVhckljb25cIiwgXCJPcHRpb25MaXN0XCIsIFwiYW5pbWF0aW9uXCIsIFwidHJhbnNpdGlvbk5hbWVcIiwgXCJkcm9wZG93blN0eWxlXCIsIFwiZHJvcGRvd25DbGFzc05hbWVcIiwgXCJkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGhcIiwgXCJkcm9wZG93blJlbmRlclwiLCBcImRyb3Bkb3duQWxpZ25cIiwgXCJwbGFjZW1lbnRcIiwgXCJidWlsdGluUGxhY2VtZW50c1wiLCBcImdldFBvcHVwQ29udGFpbmVyXCIsIFwic2hvd0FjdGlvblwiLCBcIm9uRm9jdXNcIiwgXCJvbkJsdXJcIiwgXCJvbktleVVwXCIsIFwib25LZXlEb3duXCIsIFwib25Nb3VzZURvd25cIl07XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB1c2VMYXlvdXRFZmZlY3QgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlTGF5b3V0RWZmZWN0XCI7XG5pbXBvcnQgdXNlTWVyZ2VkU3RhdGUgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlTWVyZ2VkU3RhdGVcIjtcbmltcG9ydCBpc01vYmlsZSBmcm9tIFwicmMtdXRpbC9lcy9pc01vYmlsZVwiO1xuaW1wb3J0IHsgdXNlQ29tcG9zZVJlZiB9IGZyb20gXCJyYy11dGlsL2VzL3JlZlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQWxsb3dDbGVhciB9IGZyb20gXCIuLi9ob29rcy91c2VBbGxvd0NsZWFyXCI7XG5pbXBvcnQgeyBCYXNlU2VsZWN0Q29udGV4dCB9IGZyb20gXCIuLi9ob29rcy91c2VCYXNlUHJvcHNcIjtcbmltcG9ydCB1c2VEZWxheVJlc2V0IGZyb20gXCIuLi9ob29rcy91c2VEZWxheVJlc2V0XCI7XG5pbXBvcnQgdXNlTG9jayBmcm9tIFwiLi4vaG9va3MvdXNlTG9ja1wiO1xuaW1wb3J0IHVzZVNlbGVjdFRyaWdnZXJDb250cm9sIGZyb20gXCIuLi9ob29rcy91c2VTZWxlY3RUcmlnZ2VyQ29udHJvbFwiO1xuaW1wb3J0IFNlbGVjdG9yIGZyb20gXCIuLi9TZWxlY3RvclwiO1xuaW1wb3J0IFNlbGVjdFRyaWdnZXIgZnJvbSBcIi4uL1NlbGVjdFRyaWdnZXJcIjtcbmltcG9ydCBUcmFuc0J0biBmcm9tIFwiLi4vVHJhbnNCdG5cIjtcbmltcG9ydCB7IGdldFNlcGFyYXRlZENvbnRlbnQsIGlzVmFsaWRDb3VudCB9IGZyb20gXCIuLi91dGlscy92YWx1ZVV0aWxcIjtcbmltcG9ydCBTZWxlY3RDb250ZXh0IGZyb20gXCIuLi9TZWxlY3RDb250ZXh0XCI7XG5pbXBvcnQgUG9saXRlIGZyb20gXCIuL1BvbGl0ZVwiO1xudmFyIERFRkFVTFRfT01JVF9QUk9QUyA9IFsndmFsdWUnLCAnb25DaGFuZ2UnLCAncmVtb3ZlSWNvbicsICdwbGFjZWhvbGRlcicsICdhdXRvRm9jdXMnLCAnbWF4VGFnQ291bnQnLCAnbWF4VGFnVGV4dExlbmd0aCcsICdtYXhUYWdQbGFjZWhvbGRlcicsICdjaG9pY2VUcmFuc2l0aW9uTmFtZScsICdvbklucHV0S2V5RG93bicsICdvblBvcHVwU2Nyb2xsJywgJ3RhYkluZGV4J107XG5leHBvcnQgdmFyIGlzTXVsdGlwbGUgPSBmdW5jdGlvbiBpc011bHRpcGxlKG1vZGUpIHtcbiAgcmV0dXJuIG1vZGUgPT09ICd0YWdzJyB8fCBtb2RlID09PSAnbXVsdGlwbGUnO1xufTtcbnZhciBCYXNlU2VsZWN0ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIF9jdXN0b21pemVSYXdJbnB1dEVsZTtcbiAgdmFyIGlkID0gcHJvcHMuaWQsXG4gICAgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBzaG93U2VhcmNoID0gcHJvcHMuc2hvd1NlYXJjaCxcbiAgICB0YWdSZW5kZXIgPSBwcm9wcy50YWdSZW5kZXIsXG4gICAgZGlyZWN0aW9uID0gcHJvcHMuZGlyZWN0aW9uLFxuICAgIG9taXREb21Qcm9wcyA9IHByb3BzLm9taXREb21Qcm9wcyxcbiAgICBkaXNwbGF5VmFsdWVzID0gcHJvcHMuZGlzcGxheVZhbHVlcyxcbiAgICBvbkRpc3BsYXlWYWx1ZXNDaGFuZ2UgPSBwcm9wcy5vbkRpc3BsYXlWYWx1ZXNDaGFuZ2UsXG4gICAgZW1wdHlPcHRpb25zID0gcHJvcHMuZW1wdHlPcHRpb25zLFxuICAgIF9wcm9wcyRub3RGb3VuZENvbnRlbiA9IHByb3BzLm5vdEZvdW5kQ29udGVudCxcbiAgICBub3RGb3VuZENvbnRlbnQgPSBfcHJvcHMkbm90Rm91bmRDb250ZW4gPT09IHZvaWQgMCA/ICdOb3QgRm91bmQnIDogX3Byb3BzJG5vdEZvdW5kQ29udGVuLFxuICAgIG9uQ2xlYXIgPSBwcm9wcy5vbkNsZWFyLFxuICAgIG1vZGUgPSBwcm9wcy5tb2RlLFxuICAgIGRpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgbG9hZGluZyA9IHByb3BzLmxvYWRpbmcsXG4gICAgZ2V0SW5wdXRFbGVtZW50ID0gcHJvcHMuZ2V0SW5wdXRFbGVtZW50LFxuICAgIGdldFJhd0lucHV0RWxlbWVudCA9IHByb3BzLmdldFJhd0lucHV0RWxlbWVudCxcbiAgICBvcGVuID0gcHJvcHMub3BlbixcbiAgICBkZWZhdWx0T3BlbiA9IHByb3BzLmRlZmF1bHRPcGVuLFxuICAgIG9uRHJvcGRvd25WaXNpYmxlQ2hhbmdlID0gcHJvcHMub25Ecm9wZG93blZpc2libGVDaGFuZ2UsXG4gICAgYWN0aXZlVmFsdWUgPSBwcm9wcy5hY3RpdmVWYWx1ZSxcbiAgICBvbkFjdGl2ZVZhbHVlQ2hhbmdlID0gcHJvcHMub25BY3RpdmVWYWx1ZUNoYW5nZSxcbiAgICBhY3RpdmVEZXNjZW5kYW50SWQgPSBwcm9wcy5hY3RpdmVEZXNjZW5kYW50SWQsXG4gICAgc2VhcmNoVmFsdWUgPSBwcm9wcy5zZWFyY2hWYWx1ZSxcbiAgICBhdXRvQ2xlYXJTZWFyY2hWYWx1ZSA9IHByb3BzLmF1dG9DbGVhclNlYXJjaFZhbHVlLFxuICAgIG9uU2VhcmNoID0gcHJvcHMub25TZWFyY2gsXG4gICAgb25TZWFyY2hTcGxpdCA9IHByb3BzLm9uU2VhcmNoU3BsaXQsXG4gICAgdG9rZW5TZXBhcmF0b3JzID0gcHJvcHMudG9rZW5TZXBhcmF0b3JzLFxuICAgIGFsbG93Q2xlYXIgPSBwcm9wcy5hbGxvd0NsZWFyLFxuICAgIHByZWZpeCA9IHByb3BzLnByZWZpeCxcbiAgICBzdWZmaXhJY29uID0gcHJvcHMuc3VmZml4SWNvbixcbiAgICBjbGVhckljb24gPSBwcm9wcy5jbGVhckljb24sXG4gICAgT3B0aW9uTGlzdCA9IHByb3BzLk9wdGlvbkxpc3QsXG4gICAgYW5pbWF0aW9uID0gcHJvcHMuYW5pbWF0aW9uLFxuICAgIHRyYW5zaXRpb25OYW1lID0gcHJvcHMudHJhbnNpdGlvbk5hbWUsXG4gICAgZHJvcGRvd25TdHlsZSA9IHByb3BzLmRyb3Bkb3duU3R5bGUsXG4gICAgZHJvcGRvd25DbGFzc05hbWUgPSBwcm9wcy5kcm9wZG93bkNsYXNzTmFtZSxcbiAgICBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGggPSBwcm9wcy5kcm9wZG93bk1hdGNoU2VsZWN0V2lkdGgsXG4gICAgZHJvcGRvd25SZW5kZXIgPSBwcm9wcy5kcm9wZG93blJlbmRlcixcbiAgICBkcm9wZG93bkFsaWduID0gcHJvcHMuZHJvcGRvd25BbGlnbixcbiAgICBwbGFjZW1lbnQgPSBwcm9wcy5wbGFjZW1lbnQsXG4gICAgYnVpbHRpblBsYWNlbWVudHMgPSBwcm9wcy5idWlsdGluUGxhY2VtZW50cyxcbiAgICBnZXRQb3B1cENvbnRhaW5lciA9IHByb3BzLmdldFBvcHVwQ29udGFpbmVyLFxuICAgIF9wcm9wcyRzaG93QWN0aW9uID0gcHJvcHMuc2hvd0FjdGlvbixcbiAgICBzaG93QWN0aW9uID0gX3Byb3BzJHNob3dBY3Rpb24gPT09IHZvaWQgMCA/IFtdIDogX3Byb3BzJHNob3dBY3Rpb24sXG4gICAgb25Gb2N1cyA9IHByb3BzLm9uRm9jdXMsXG4gICAgb25CbHVyID0gcHJvcHMub25CbHVyLFxuICAgIG9uS2V5VXAgPSBwcm9wcy5vbktleVVwLFxuICAgIG9uS2V5RG93biA9IHByb3BzLm9uS2V5RG93bixcbiAgICBvbk1vdXNlRG93biA9IHByb3BzLm9uTW91c2VEb3duLFxuICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgX2V4Y2x1ZGVkKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gTUlTQyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG11bHRpcGxlID0gaXNNdWx0aXBsZShtb2RlKTtcbiAgdmFyIG1lcmdlZFNob3dTZWFyY2ggPSAoc2hvd1NlYXJjaCAhPT0gdW5kZWZpbmVkID8gc2hvd1NlYXJjaCA6IG11bHRpcGxlKSB8fCBtb2RlID09PSAnY29tYm9ib3gnO1xuICB2YXIgZG9tUHJvcHMgPSBfb2JqZWN0U3ByZWFkKHt9LCByZXN0UHJvcHMpO1xuICBERUZBVUxUX09NSVRfUFJPUFMuZm9yRWFjaChmdW5jdGlvbiAocHJvcE5hbWUpIHtcbiAgICBkZWxldGUgZG9tUHJvcHNbcHJvcE5hbWVdO1xuICB9KTtcbiAgb21pdERvbVByb3BzID09PSBudWxsIHx8IG9taXREb21Qcm9wcyA9PT0gdm9pZCAwIHx8IG9taXREb21Qcm9wcy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wTmFtZSkge1xuICAgIGRlbGV0ZSBkb21Qcm9wc1twcm9wTmFtZV07XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IE1vYmlsZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIG1vYmlsZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0TW9iaWxlID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAvLyBPbmx5IHVwZGF0ZSBvbiB0aGUgY2xpZW50IHNpZGVcbiAgICBzZXRNb2JpbGUoaXNNb2JpbGUoKSk7XG4gIH0sIFtdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVmcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGNvbnRhaW5lclJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIHNlbGVjdG9yRG9tUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICB2YXIgdHJpZ2dlclJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIHNlbGVjdG9yUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICB2YXIgbGlzdFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIGJsdXJSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuXG4gIC8qKiBVc2VkIGZvciBjb21wb25lbnQgZm9jdXNlZCBtYW5hZ2VtZW50ICovXG4gIHZhciBfdXNlRGVsYXlSZXNldCA9IHVzZURlbGF5UmVzZXQoKSxcbiAgICBfdXNlRGVsYXlSZXNldDIgPSBfc2xpY2VkVG9BcnJheShfdXNlRGVsYXlSZXNldCwgMyksXG4gICAgbW9ja0ZvY3VzZWQgPSBfdXNlRGVsYXlSZXNldDJbMF0sXG4gICAgc2V0TW9ja0ZvY3VzZWQgPSBfdXNlRGVsYXlSZXNldDJbMV0sXG4gICAgY2FuY2VsU2V0TW9ja0ZvY3VzZWQgPSBfdXNlRGVsYXlSZXNldDJbMl07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IEltcGVyYXRpdmUgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIFJlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9zZWxlY3RvclJlZiRjdXJyZW50LCBfc2VsZWN0b3JSZWYkY3VycmVudDI7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZvY3VzOiAoX3NlbGVjdG9yUmVmJGN1cnJlbnQgPSBzZWxlY3RvclJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfc2VsZWN0b3JSZWYkY3VycmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3NlbGVjdG9yUmVmJGN1cnJlbnQuZm9jdXMsXG4gICAgICBibHVyOiAoX3NlbGVjdG9yUmVmJGN1cnJlbnQyID0gc2VsZWN0b3JSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX3NlbGVjdG9yUmVmJGN1cnJlbnQyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfc2VsZWN0b3JSZWYkY3VycmVudDIuYmx1cixcbiAgICAgIHNjcm9sbFRvOiBmdW5jdGlvbiBzY3JvbGxUbyhhcmcpIHtcbiAgICAgICAgdmFyIF9saXN0UmVmJGN1cnJlbnQ7XG4gICAgICAgIHJldHVybiAoX2xpc3RSZWYkY3VycmVudCA9IGxpc3RSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2xpc3RSZWYkY3VycmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2xpc3RSZWYkY3VycmVudC5zY3JvbGxUbyhhcmcpO1xuICAgICAgfSxcbiAgICAgIG5hdGl2ZUVsZW1lbnQ6IGNvbnRhaW5lclJlZi5jdXJyZW50IHx8IHNlbGVjdG9yRG9tUmVmLmN1cnJlbnRcbiAgICB9O1xuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBTZWFyY2ggVmFsdWUgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG1lcmdlZFNlYXJjaFZhbHVlID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9kaXNwbGF5VmFsdWVzJDtcbiAgICBpZiAobW9kZSAhPT0gJ2NvbWJvYm94Jykge1xuICAgICAgcmV0dXJuIHNlYXJjaFZhbHVlO1xuICAgIH1cbiAgICB2YXIgdmFsID0gKF9kaXNwbGF5VmFsdWVzJCA9IGRpc3BsYXlWYWx1ZXNbMF0pID09PSBudWxsIHx8IF9kaXNwbGF5VmFsdWVzJCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Rpc3BsYXlWYWx1ZXMkLnZhbHVlO1xuICAgIHJldHVybiB0eXBlb2YgdmFsID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsID09PSAnbnVtYmVyJyA/IFN0cmluZyh2YWwpIDogJyc7XG4gIH0sIFtzZWFyY2hWYWx1ZSwgbW9kZSwgZGlzcGxheVZhbHVlc10pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IEN1c3RvbSBJbnB1dCA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBPbmx5IHdvcmtzIGluIGBjb21ib2JveGBcbiAgdmFyIGN1c3RvbWl6ZUlucHV0RWxlbWVudCA9IG1vZGUgPT09ICdjb21ib2JveCcgJiYgdHlwZW9mIGdldElucHV0RWxlbWVudCA9PT0gJ2Z1bmN0aW9uJyAmJiBnZXRJbnB1dEVsZW1lbnQoKSB8fCBudWxsO1xuXG4gIC8vIFVzZWQgZm9yIGN1c3RvbWl6ZSByZXBsYWNlbWVudCBmb3IgYHJjLWNhc2NhZGVyYFxuICB2YXIgY3VzdG9taXplUmF3SW5wdXRFbGVtZW50ID0gdHlwZW9mIGdldFJhd0lucHV0RWxlbWVudCA9PT0gJ2Z1bmN0aW9uJyAmJiBnZXRSYXdJbnB1dEVsZW1lbnQoKTtcbiAgdmFyIGN1c3RvbWl6ZVJhd0lucHV0UmVmID0gdXNlQ29tcG9zZVJlZihzZWxlY3RvckRvbVJlZiwgY3VzdG9taXplUmF3SW5wdXRFbGVtZW50ID09PSBudWxsIHx8IGN1c3RvbWl6ZVJhd0lucHV0RWxlbWVudCA9PT0gdm9pZCAwIHx8IChfY3VzdG9taXplUmF3SW5wdXRFbGUgPSBjdXN0b21pemVSYXdJbnB1dEVsZW1lbnQucHJvcHMpID09PSBudWxsIHx8IF9jdXN0b21pemVSYXdJbnB1dEVsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2N1c3RvbWl6ZVJhd0lucHV0RWxlLnJlZik7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IE9wZW4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFNTUiBub3Qgc3VwcG9ydCBQb3J0YWwgd2hpY2ggbWVhbnMgd2UgbmVlZCBkZWxheSBgb3BlbmAgZm9yIHRoZSBmaXJzdCB0aW1lIHJlbmRlclxuICB2YXIgX1JlYWN0JHVzZVN0YXRlMyA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKSxcbiAgICBfUmVhY3QkdXNlU3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlMywgMiksXG4gICAgcmVuZGVyZWQgPSBfUmVhY3QkdXNlU3RhdGU0WzBdLFxuICAgIHNldFJlbmRlcmVkID0gX1JlYWN0JHVzZVN0YXRlNFsxXTtcbiAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBzZXRSZW5kZXJlZCh0cnVlKTtcbiAgfSwgW10pO1xuICB2YXIgX3VzZU1lcmdlZFN0YXRlID0gdXNlTWVyZ2VkU3RhdGUoZmFsc2UsIHtcbiAgICAgIGRlZmF1bHRWYWx1ZTogZGVmYXVsdE9wZW4sXG4gICAgICB2YWx1ZTogb3BlblxuICAgIH0pLFxuICAgIF91c2VNZXJnZWRTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlTWVyZ2VkU3RhdGUsIDIpLFxuICAgIGlubmVyT3BlbiA9IF91c2VNZXJnZWRTdGF0ZTJbMF0sXG4gICAgc2V0SW5uZXJPcGVuID0gX3VzZU1lcmdlZFN0YXRlMlsxXTtcbiAgdmFyIG1lcmdlZE9wZW4gPSByZW5kZXJlZCA/IGlubmVyT3BlbiA6IGZhbHNlO1xuXG4gIC8vIE5vdCB0cmlnZ2VyIGBvcGVuYCBpbiBgY29tYm9ib3hgIHdoZW4gYG5vdEZvdW5kQ29udGVudGAgaXMgZW1wdHlcbiAgdmFyIGVtcHR5TGlzdENvbnRlbnQgPSAhbm90Rm91bmRDb250ZW50ICYmIGVtcHR5T3B0aW9ucztcbiAgaWYgKGRpc2FibGVkIHx8IGVtcHR5TGlzdENvbnRlbnQgJiYgbWVyZ2VkT3BlbiAmJiBtb2RlID09PSAnY29tYm9ib3gnKSB7XG4gICAgbWVyZ2VkT3BlbiA9IGZhbHNlO1xuICB9XG4gIHZhciB0cmlnZ2VyT3BlbiA9IGVtcHR5TGlzdENvbnRlbnQgPyBmYWxzZSA6IG1lcmdlZE9wZW47XG4gIHZhciBvblRvZ2dsZU9wZW4gPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAobmV3T3Blbikge1xuICAgIHZhciBuZXh0T3BlbiA9IG5ld09wZW4gIT09IHVuZGVmaW5lZCA/IG5ld09wZW4gOiAhbWVyZ2VkT3BlbjtcbiAgICBpZiAoIWRpc2FibGVkKSB7XG4gICAgICBzZXRJbm5lck9wZW4obmV4dE9wZW4pO1xuICAgICAgaWYgKG1lcmdlZE9wZW4gIT09IG5leHRPcGVuKSB7XG4gICAgICAgIG9uRHJvcGRvd25WaXNpYmxlQ2hhbmdlID09PSBudWxsIHx8IG9uRHJvcGRvd25WaXNpYmxlQ2hhbmdlID09PSB2b2lkIDAgfHwgb25Ecm9wZG93blZpc2libGVDaGFuZ2UobmV4dE9wZW4pO1xuICAgICAgfVxuICAgIH1cbiAgfSwgW2Rpc2FibGVkLCBtZXJnZWRPcGVuLCBzZXRJbm5lck9wZW4sIG9uRHJvcGRvd25WaXNpYmxlQ2hhbmdlXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU2VhcmNoID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciB0b2tlbldpdGhFbnRlciA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAodG9rZW5TZXBhcmF0b3JzIHx8IFtdKS5zb21lKGZ1bmN0aW9uICh0b2tlblNlcGFyYXRvcikge1xuICAgICAgcmV0dXJuIFsnXFxuJywgJ1xcclxcbiddLmluY2x1ZGVzKHRva2VuU2VwYXJhdG9yKTtcbiAgICB9KTtcbiAgfSwgW3Rva2VuU2VwYXJhdG9yc10pO1xuICB2YXIgX3JlZiA9IFJlYWN0LnVzZUNvbnRleHQoU2VsZWN0Q29udGV4dCkgfHwge30sXG4gICAgbWF4Q291bnQgPSBfcmVmLm1heENvdW50LFxuICAgIHJhd1ZhbHVlcyA9IF9yZWYucmF3VmFsdWVzO1xuICB2YXIgb25JbnRlcm5hbFNlYXJjaCA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxTZWFyY2goc2VhcmNoVGV4dCwgZnJvbVR5cGluZywgaXNDb21wb3NpdGluZykge1xuICAgIGlmIChtdWx0aXBsZSAmJiBpc1ZhbGlkQ291bnQobWF4Q291bnQpICYmIChyYXdWYWx1ZXMgPT09IG51bGwgfHwgcmF3VmFsdWVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiByYXdWYWx1ZXMuc2l6ZSkgPj0gbWF4Q291bnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHJldCA9IHRydWU7XG4gICAgdmFyIG5ld1NlYXJjaFRleHQgPSBzZWFyY2hUZXh0O1xuICAgIG9uQWN0aXZlVmFsdWVDaGFuZ2UgPT09IG51bGwgfHwgb25BY3RpdmVWYWx1ZUNoYW5nZSA9PT0gdm9pZCAwIHx8IG9uQWN0aXZlVmFsdWVDaGFuZ2UobnVsbCk7XG4gICAgdmFyIHNlcGFyYXRlZExpc3QgPSBnZXRTZXBhcmF0ZWRDb250ZW50KHNlYXJjaFRleHQsIHRva2VuU2VwYXJhdG9ycywgaXNWYWxpZENvdW50KG1heENvdW50KSA/IG1heENvdW50IC0gcmF3VmFsdWVzLnNpemUgOiB1bmRlZmluZWQpO1xuXG4gICAgLy8gQ2hlY2sgaWYgbWF0Y2ggdGhlIGB0b2tlblNlcGFyYXRvcnNgXG4gICAgdmFyIHBhdGNoTGFiZWxzID0gaXNDb21wb3NpdGluZyA/IG51bGwgOiBzZXBhcmF0ZWRMaXN0O1xuXG4gICAgLy8gSWdub3JlIGNvbWJvYm94IHNpbmNlIGl0J3Mgbm90IHNwbGl0LWFibGVcbiAgICBpZiAobW9kZSAhPT0gJ2NvbWJvYm94JyAmJiBwYXRjaExhYmVscykge1xuICAgICAgbmV3U2VhcmNoVGV4dCA9ICcnO1xuICAgICAgb25TZWFyY2hTcGxpdCA9PT0gbnVsbCB8fCBvblNlYXJjaFNwbGl0ID09PSB2b2lkIDAgfHwgb25TZWFyY2hTcGxpdChwYXRjaExhYmVscyk7XG5cbiAgICAgIC8vIFNob3VsZCBjbG9zZSB3aGVuIHBhc3RlIGZpbmlzaFxuICAgICAgb25Ub2dnbGVPcGVuKGZhbHNlKTtcblxuICAgICAgLy8gVGVsbCBTZWxlY3RvciB0aGF0IGJyZWFrIG5leHQgYWN0aW9uc1xuICAgICAgcmV0ID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChvblNlYXJjaCAmJiBtZXJnZWRTZWFyY2hWYWx1ZSAhPT0gbmV3U2VhcmNoVGV4dCkge1xuICAgICAgb25TZWFyY2gobmV3U2VhcmNoVGV4dCwge1xuICAgICAgICBzb3VyY2U6IGZyb21UeXBpbmcgPyAndHlwaW5nJyA6ICdlZmZlY3QnXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfTtcblxuICAvLyBPbmx5IHRyaWdnZXJlZCB3aGVuIG1lbnUgaXMgY2xvc2VkICYgbW9kZSBpcyB0YWdzXG4gIC8vIElmIG1lbnUgaXMgb3BlbiwgT3B0aW9uTGlzdCB3aWxsIHRha2UgY2hhcmdlXG4gIC8vIElmIG1vZGUgaXNuJ3QgdGFncywgcHJlc3MgZW50ZXIgaXMgbm90IG1lYW5pbmdmdWwgd2hlbiB5b3UgY2FuJ3Qgc2VlIGFueSBvcHRpb25cbiAgdmFyIG9uSW50ZXJuYWxTZWFyY2hTdWJtaXQgPSBmdW5jdGlvbiBvbkludGVybmFsU2VhcmNoU3VibWl0KHNlYXJjaFRleHQpIHtcbiAgICAvLyBwcmV2ZW50IGVtcHR5IHRhZ3MgZnJvbSBhcHBlYXJpbmcgd2hlbiB5b3UgY2xpY2sgdGhlIEVudGVyIGJ1dHRvblxuICAgIGlmICghc2VhcmNoVGV4dCB8fCAhc2VhcmNoVGV4dC50cmltKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgb25TZWFyY2goc2VhcmNoVGV4dCwge1xuICAgICAgc291cmNlOiAnc3VibWl0J1xuICAgIH0pO1xuICB9O1xuXG4gIC8vIENsb3NlIHdpbGwgY2xlYW4gdXAgc2luZ2xlIG1vZGUgc2VhcmNoIHRleHRcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIW1lcmdlZE9wZW4gJiYgIW11bHRpcGxlICYmIG1vZGUgIT09ICdjb21ib2JveCcpIHtcbiAgICAgIG9uSW50ZXJuYWxTZWFyY2goJycsIGZhbHNlLCBmYWxzZSk7XG4gICAgfVxuICB9LCBbbWVyZ2VkT3Blbl0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRGlzYWJsZWQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDbG9zZSBkcm9wZG93biAmIHJlbW92ZSBmb2N1cyBzdGF0ZSB3aGVuIGRpc2FibGVkIGNoYW5nZVxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChpbm5lck9wZW4gJiYgZGlzYWJsZWQpIHtcbiAgICAgIHNldElubmVyT3BlbihmYWxzZSk7XG4gICAgfVxuXG4gICAgLy8gQWZ0ZXIgb25CbHVyIGlzIHRyaWdnZXJlZCwgdGhlIGZvY3VzZWQgZG9lcyBub3QgbmVlZCB0byBiZSByZXNldFxuICAgIGlmIChkaXNhYmxlZCAmJiAhYmx1clJlZi5jdXJyZW50KSB7XG4gICAgICBzZXRNb2NrRm9jdXNlZChmYWxzZSk7XG4gICAgfVxuICB9LCBbZGlzYWJsZWRdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IEtleWJvYXJkID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLyoqXG4gICAqIFdlIHJlY29yZCBpbnB1dCB2YWx1ZSBoZXJlIHRvIGNoZWNrIGlmIGNhbiBwcmVzcyB0byBjbGVhbiB1cCBieSBiYWNrc3BhY2VcbiAgICogLSBudWxsOiBLZXkgaXMgbm90IGRvd24sIHRoaXMgaXMgcmVzZXQgYnkga2V5IHVwXG4gICAqIC0gdHJ1ZTogU2VhcmNoIHRleHQgaXMgZW1wdHkgd2hlbiBmaXJzdCB0aW1lIGJhY2tzcGFjZSBkb3duXG4gICAqIC0gZmFsc2U6IFNlYXJjaCB0ZXh0IGlzIG5vdCBlbXB0eSB3aGVuIGZpcnN0IHRpbWUgYmFja3NwYWNlIGRvd25cbiAgICovXG4gIHZhciBfdXNlTG9jayA9IHVzZUxvY2soKSxcbiAgICBfdXNlTG9jazIgPSBfc2xpY2VkVG9BcnJheShfdXNlTG9jaywgMiksXG4gICAgZ2V0Q2xlYXJMb2NrID0gX3VzZUxvY2syWzBdLFxuICAgIHNldENsZWFyTG9jayA9IF91c2VMb2NrMlsxXTtcbiAgdmFyIGtleUxvY2tSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuXG4gIC8vIEtleURvd25cbiAgdmFyIG9uSW50ZXJuYWxLZXlEb3duID0gZnVuY3Rpb24gb25JbnRlcm5hbEtleURvd24oZXZlbnQpIHtcbiAgICB2YXIgY2xlYXJMb2NrID0gZ2V0Q2xlYXJMb2NrKCk7XG4gICAgdmFyIGtleSA9IGV2ZW50LmtleTtcbiAgICB2YXIgaXNFbnRlcktleSA9IGtleSA9PT0gJ0VudGVyJztcbiAgICBpZiAoaXNFbnRlcktleSkge1xuICAgICAgLy8gRG8gbm90IHN1Ym1pdCBmb3JtIHdoZW4gdHlwZSBpbiB0aGUgaW5wdXRcbiAgICAgIGlmIChtb2RlICE9PSAnY29tYm9ib3gnKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFdlIG9ubHkgbWFuYWdlIG9wZW4gc3RhdGUgaGVyZSwgY2xvc2UgbG9naWMgc2hvdWxkIGhhbmRsZSBieSBsaXN0IGNvbXBvbmVudFxuICAgICAgaWYgKCFtZXJnZWRPcGVuKSB7XG4gICAgICAgIG9uVG9nZ2xlT3Blbih0cnVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc2V0Q2xlYXJMb2NrKCEhbWVyZ2VkU2VhcmNoVmFsdWUpO1xuXG4gICAgLy8gUmVtb3ZlIHZhbHVlIGJ5IGBiYWNrc3BhY2VgXG4gICAgaWYgKGtleSA9PT0gJ0JhY2tzcGFjZScgJiYgIWNsZWFyTG9jayAmJiBtdWx0aXBsZSAmJiAhbWVyZ2VkU2VhcmNoVmFsdWUgJiYgZGlzcGxheVZhbHVlcy5sZW5ndGgpIHtcbiAgICAgIHZhciBjbG9uZURpc3BsYXlWYWx1ZXMgPSBfdG9Db25zdW1hYmxlQXJyYXkoZGlzcGxheVZhbHVlcyk7XG4gICAgICB2YXIgcmVtb3ZlZERpc3BsYXlWYWx1ZSA9IG51bGw7XG4gICAgICBmb3IgKHZhciBpID0gY2xvbmVEaXNwbGF5VmFsdWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtPSAxKSB7XG4gICAgICAgIHZhciBjdXJyZW50ID0gY2xvbmVEaXNwbGF5VmFsdWVzW2ldO1xuICAgICAgICBpZiAoIWN1cnJlbnQuZGlzYWJsZWQpIHtcbiAgICAgICAgICBjbG9uZURpc3BsYXlWYWx1ZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIHJlbW92ZWREaXNwbGF5VmFsdWUgPSBjdXJyZW50O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocmVtb3ZlZERpc3BsYXlWYWx1ZSkge1xuICAgICAgICBvbkRpc3BsYXlWYWx1ZXNDaGFuZ2UoY2xvbmVEaXNwbGF5VmFsdWVzLCB7XG4gICAgICAgICAgdHlwZTogJ3JlbW92ZScsXG4gICAgICAgICAgdmFsdWVzOiBbcmVtb3ZlZERpc3BsYXlWYWx1ZV1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCByZXN0ID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIHJlc3RbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cbiAgICBpZiAobWVyZ2VkT3BlbiAmJiAoIWlzRW50ZXJLZXkgfHwgIWtleUxvY2tSZWYuY3VycmVudCkpIHtcbiAgICAgIHZhciBfbGlzdFJlZiRjdXJyZW50MjtcbiAgICAgIC8vIExvY2sgdGhlIEVudGVyIGtleSBhZnRlciBpdCBpcyBwcmVzc2VkIHRvIGF2b2lkIHJlcGVhdGVkIHRyaWdnZXJpbmcgb2YgdGhlIG9uQ2hhbmdlIGV2ZW50LlxuICAgICAgaWYgKGlzRW50ZXJLZXkpIHtcbiAgICAgICAga2V5TG9ja1JlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIChfbGlzdFJlZiRjdXJyZW50MiA9IGxpc3RSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2xpc3RSZWYkY3VycmVudDIgPT09IHZvaWQgMCB8fCBfbGlzdFJlZiRjdXJyZW50Mi5vbktleURvd24uYXBwbHkoX2xpc3RSZWYkY3VycmVudDIsIFtldmVudF0uY29uY2F0KHJlc3QpKTtcbiAgICB9XG4gICAgb25LZXlEb3duID09PSBudWxsIHx8IG9uS2V5RG93biA9PT0gdm9pZCAwIHx8IG9uS2V5RG93bi5hcHBseSh2b2lkIDAsIFtldmVudF0uY29uY2F0KHJlc3QpKTtcbiAgfTtcblxuICAvLyBLZXlVcFxuICB2YXIgb25JbnRlcm5hbEtleVVwID0gZnVuY3Rpb24gb25JbnRlcm5hbEtleVVwKGV2ZW50KSB7XG4gICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCByZXN0ID0gbmV3IEFycmF5KF9sZW4yID4gMSA/IF9sZW4yIC0gMSA6IDApLCBfa2V5MiA9IDE7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgIHJlc3RbX2tleTIgLSAxXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgfVxuICAgIGlmIChtZXJnZWRPcGVuKSB7XG4gICAgICB2YXIgX2xpc3RSZWYkY3VycmVudDM7XG4gICAgICAoX2xpc3RSZWYkY3VycmVudDMgPSBsaXN0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9saXN0UmVmJGN1cnJlbnQzID09PSB2b2lkIDAgfHwgX2xpc3RSZWYkY3VycmVudDMub25LZXlVcC5hcHBseShfbGlzdFJlZiRjdXJyZW50MywgW2V2ZW50XS5jb25jYXQocmVzdCkpO1xuICAgIH1cbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICBrZXlMb2NrUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9XG4gICAgb25LZXlVcCA9PT0gbnVsbCB8fCBvbktleVVwID09PSB2b2lkIDAgfHwgb25LZXlVcC5hcHBseSh2b2lkIDAsIFtldmVudF0uY29uY2F0KHJlc3QpKTtcbiAgfTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNlbGVjdG9yID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG9uU2VsZWN0b3JSZW1vdmUgPSBmdW5jdGlvbiBvblNlbGVjdG9yUmVtb3ZlKHZhbCkge1xuICAgIHZhciBuZXdWYWx1ZXMgPSBkaXNwbGF5VmFsdWVzLmZpbHRlcihmdW5jdGlvbiAoaSkge1xuICAgICAgcmV0dXJuIGkgIT09IHZhbDtcbiAgICB9KTtcbiAgICBvbkRpc3BsYXlWYWx1ZXNDaGFuZ2UobmV3VmFsdWVzLCB7XG4gICAgICB0eXBlOiAncmVtb3ZlJyxcbiAgICAgIHZhbHVlczogW3ZhbF1cbiAgICB9KTtcbiAgfTtcbiAgdmFyIG9uSW5wdXRCbHVyID0gZnVuY3Rpb24gb25JbnB1dEJsdXIoKSB7XG4gICAgLy8gVW5sb2NrIHRoZSBFbnRlciBrZXkgYWZ0ZXIgdGhlIGlucHV0IGJsdXI7IG90aGVyd2lzZSwgdGhlIEVudGVyIGtleSBuZWVkcyB0byBiZSBwcmVzc2VkIHR3aWNlIHRvIHRyaWdnZXIgdGhlIGNvcnJlY3QgZWZmZWN0LlxuICAgIGtleUxvY2tSZWYuY3VycmVudCA9IGZhbHNlO1xuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IEZvY3VzIC8gQmx1ciA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvKiogUmVjb3JkIHJlYWwgZm9jdXMgc3RhdHVzICovXG4gIHZhciBmb2N1c1JlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIHZhciBvbkNvbnRhaW5lckZvY3VzID0gZnVuY3Rpb24gb25Db250YWluZXJGb2N1cygpIHtcbiAgICBzZXRNb2NrRm9jdXNlZCh0cnVlKTtcbiAgICBpZiAoIWRpc2FibGVkKSB7XG4gICAgICBpZiAob25Gb2N1cyAmJiAhZm9jdXNSZWYuY3VycmVudCkge1xuICAgICAgICBvbkZvY3VzLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgLy8gYHNob3dBY3Rpb25gIHNob3VsZCBoYW5kbGUgYGZvY3VzYCBpZiBzZXRcbiAgICAgIGlmIChzaG93QWN0aW9uLmluY2x1ZGVzKCdmb2N1cycpKSB7XG4gICAgICAgIG9uVG9nZ2xlT3Blbih0cnVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9jdXNSZWYuY3VycmVudCA9IHRydWU7XG4gIH07XG4gIHZhciBvbkNvbnRhaW5lckJsdXIgPSBmdW5jdGlvbiBvbkNvbnRhaW5lckJsdXIoKSB7XG4gICAgYmx1clJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICBzZXRNb2NrRm9jdXNlZChmYWxzZSwgZnVuY3Rpb24gKCkge1xuICAgICAgZm9jdXNSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgYmx1clJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICBvblRvZ2dsZU9wZW4oZmFsc2UpO1xuICAgIH0pO1xuICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobWVyZ2VkU2VhcmNoVmFsdWUpIHtcbiAgICAgIC8vIGB0YWdzYCBtb2RlIHNob3VsZCBtb3ZlIGBzZWFyY2hWYWx1ZWAgaW50byB2YWx1ZXNcbiAgICAgIGlmIChtb2RlID09PSAndGFncycpIHtcbiAgICAgICAgb25TZWFyY2gobWVyZ2VkU2VhcmNoVmFsdWUsIHtcbiAgICAgICAgICBzb3VyY2U6ICdzdWJtaXQnXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChtb2RlID09PSAnbXVsdGlwbGUnKSB7XG4gICAgICAgIC8vIGBtdWx0aXBsZWAgbW9kZSBvbmx5IGNsZWFuIHRoZSBzZWFyY2ggdmFsdWUgYnV0IG5vdCB0cmlnZ2VyIGV2ZW50XG4gICAgICAgIG9uU2VhcmNoKCcnLCB7XG4gICAgICAgICAgc291cmNlOiAnYmx1cidcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvbkJsdXIpIHtcbiAgICAgIG9uQmx1ci5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9O1xuXG4gIC8vIEdpdmUgZm9jdXMgYmFjayBvZiBTZWxlY3RcbiAgdmFyIGFjdGl2ZVRpbWVvdXRJZHMgPSBbXTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgYWN0aXZlVGltZW91dElkcy5mb3JFYWNoKGZ1bmN0aW9uICh0aW1lb3V0SWQpIHtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgfSk7XG4gICAgICBhY3RpdmVUaW1lb3V0SWRzLnNwbGljZSgwLCBhY3RpdmVUaW1lb3V0SWRzLmxlbmd0aCk7XG4gICAgfTtcbiAgfSwgW10pO1xuICB2YXIgb25JbnRlcm5hbE1vdXNlRG93biA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxNb3VzZURvd24oZXZlbnQpIHtcbiAgICB2YXIgX3RyaWdnZXJSZWYkY3VycmVudDtcbiAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgIHZhciBwb3B1cEVsZW1lbnQgPSAoX3RyaWdnZXJSZWYkY3VycmVudCA9IHRyaWdnZXJSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX3RyaWdnZXJSZWYkY3VycmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RyaWdnZXJSZWYkY3VycmVudC5nZXRQb3B1cEVsZW1lbnQoKTtcblxuICAgIC8vIFdlIHNob3VsZCBnaXZlIGZvY3VzIGJhY2sgdG8gc2VsZWN0b3IgaWYgY2xpY2tlZCBpdGVtIGlzIG5vdCBmb2N1c2FibGVcbiAgICBpZiAocG9wdXBFbGVtZW50ICYmIHBvcHVwRWxlbWVudC5jb250YWlucyh0YXJnZXQpKSB7XG4gICAgICB2YXIgdGltZW91dElkID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGFjdGl2ZVRpbWVvdXRJZHMuaW5kZXhPZih0aW1lb3V0SWQpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgYWN0aXZlVGltZW91dElkcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICAgIGNhbmNlbFNldE1vY2tGb2N1c2VkKCk7XG4gICAgICAgIGlmICghbW9iaWxlICYmICFwb3B1cEVsZW1lbnQuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgICB2YXIgX3NlbGVjdG9yUmVmJGN1cnJlbnQzO1xuICAgICAgICAgIChfc2VsZWN0b3JSZWYkY3VycmVudDMgPSBzZWxlY3RvclJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfc2VsZWN0b3JSZWYkY3VycmVudDMgPT09IHZvaWQgMCB8fCBfc2VsZWN0b3JSZWYkY3VycmVudDMuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBhY3RpdmVUaW1lb3V0SWRzLnB1c2godGltZW91dElkKTtcbiAgICB9XG4gICAgZm9yICh2YXIgX2xlbjMgPSBhcmd1bWVudHMubGVuZ3RoLCByZXN0QXJncyA9IG5ldyBBcnJheShfbGVuMyA+IDEgPyBfbGVuMyAtIDEgOiAwKSwgX2tleTMgPSAxOyBfa2V5MyA8IF9sZW4zOyBfa2V5MysrKSB7XG4gICAgICByZXN0QXJnc1tfa2V5MyAtIDFdID0gYXJndW1lbnRzW19rZXkzXTtcbiAgICB9XG4gICAgb25Nb3VzZURvd24gPT09IG51bGwgfHwgb25Nb3VzZURvd24gPT09IHZvaWQgMCB8fCBvbk1vdXNlRG93bi5hcHBseSh2b2lkIDAsIFtldmVudF0uY29uY2F0KHJlc3RBcmdzKSk7XG4gIH07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBEcm9wZG93biA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfUmVhY3QkdXNlU3RhdGU1ID0gUmVhY3QudXNlU3RhdGUoe30pLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTYgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGU1LCAyKSxcbiAgICBmb3JjZVVwZGF0ZSA9IF9SZWFjdCR1c2VTdGF0ZTZbMV07XG4gIC8vIFdlIG5lZWQgZm9yY2UgdXBkYXRlIGhlcmUgc2luY2UgcG9wdXAgZG9tIGlzIHJlbmRlciBhc3luY1xuICBmdW5jdGlvbiBvblBvcHVwTW91c2VFbnRlcigpIHtcbiAgICBmb3JjZVVwZGF0ZSh7fSk7XG4gIH1cblxuICAvLyBVc2VkIGZvciByYXcgY3VzdG9tIGlucHV0IHRyaWdnZXJcbiAgdmFyIG9uVHJpZ2dlclZpc2libGVDaGFuZ2U7XG4gIGlmIChjdXN0b21pemVSYXdJbnB1dEVsZW1lbnQpIHtcbiAgICBvblRyaWdnZXJWaXNpYmxlQ2hhbmdlID0gZnVuY3Rpb24gb25UcmlnZ2VyVmlzaWJsZUNoYW5nZShuZXdPcGVuKSB7XG4gICAgICBvblRvZ2dsZU9wZW4obmV3T3Blbik7XG4gICAgfTtcbiAgfVxuXG4gIC8vIENsb3NlIHdoZW4gY2xpY2sgb24gbm9uLXNlbGVjdCBlbGVtZW50XG4gIHVzZVNlbGVjdFRyaWdnZXJDb250cm9sKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX3RyaWdnZXJSZWYkY3VycmVudDI7XG4gICAgcmV0dXJuIFtjb250YWluZXJSZWYuY3VycmVudCwgKF90cmlnZ2VyUmVmJGN1cnJlbnQyID0gdHJpZ2dlclJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfdHJpZ2dlclJlZiRjdXJyZW50MiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RyaWdnZXJSZWYkY3VycmVudDIuZ2V0UG9wdXBFbGVtZW50KCldO1xuICB9LCB0cmlnZ2VyT3Blbiwgb25Ub2dnbGVPcGVuLCAhIWN1c3RvbWl6ZVJhd0lucHV0RWxlbWVudCk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDb250ZXh0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBiYXNlU2VsZWN0Q29udGV4dCA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICAgIG5vdEZvdW5kQ29udGVudDogbm90Rm91bmRDb250ZW50LFxuICAgICAgb3BlbjogbWVyZ2VkT3BlbixcbiAgICAgIHRyaWdnZXJPcGVuOiB0cmlnZ2VyT3BlbixcbiAgICAgIGlkOiBpZCxcbiAgICAgIHNob3dTZWFyY2g6IG1lcmdlZFNob3dTZWFyY2gsXG4gICAgICBtdWx0aXBsZTogbXVsdGlwbGUsXG4gICAgICB0b2dnbGVPcGVuOiBvblRvZ2dsZU9wZW5cbiAgICB9KTtcbiAgfSwgW3Byb3BzLCBub3RGb3VuZENvbnRlbnQsIHRyaWdnZXJPcGVuLCBtZXJnZWRPcGVuLCBpZCwgbWVyZ2VkU2hvd1NlYXJjaCwgbXVsdGlwbGUsIG9uVG9nZ2xlT3Blbl0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyA9PSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQXJyb3cgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBzaG93U3VmZml4SWNvbiA9ICEhc3VmZml4SWNvbiB8fCBsb2FkaW5nO1xuICB2YXIgYXJyb3dOb2RlO1xuICBpZiAoc2hvd1N1ZmZpeEljb24pIHtcbiAgICBhcnJvd05vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUcmFuc0J0biwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYXJyb3dcIiksIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hcnJvdy1sb2FkaW5nXCIpLCBsb2FkaW5nKSksXG4gICAgICBjdXN0b21pemVJY29uOiBzdWZmaXhJY29uLFxuICAgICAgY3VzdG9taXplSWNvblByb3BzOiB7XG4gICAgICAgIGxvYWRpbmc6IGxvYWRpbmcsXG4gICAgICAgIHNlYXJjaFZhbHVlOiBtZXJnZWRTZWFyY2hWYWx1ZSxcbiAgICAgICAgb3BlbjogbWVyZ2VkT3BlbixcbiAgICAgICAgZm9jdXNlZDogbW9ja0ZvY3VzZWQsXG4gICAgICAgIHNob3dTZWFyY2g6IG1lcmdlZFNob3dTZWFyY2hcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IENsZWFyID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgb25DbGVhck1vdXNlRG93biA9IGZ1bmN0aW9uIG9uQ2xlYXJNb3VzZURvd24oKSB7XG4gICAgdmFyIF9zZWxlY3RvclJlZiRjdXJyZW50NDtcbiAgICBvbkNsZWFyID09PSBudWxsIHx8IG9uQ2xlYXIgPT09IHZvaWQgMCB8fCBvbkNsZWFyKCk7XG4gICAgKF9zZWxlY3RvclJlZiRjdXJyZW50NCA9IHNlbGVjdG9yUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9zZWxlY3RvclJlZiRjdXJyZW50NCA9PT0gdm9pZCAwIHx8IF9zZWxlY3RvclJlZiRjdXJyZW50NC5mb2N1cygpO1xuICAgIG9uRGlzcGxheVZhbHVlc0NoYW5nZShbXSwge1xuICAgICAgdHlwZTogJ2NsZWFyJyxcbiAgICAgIHZhbHVlczogZGlzcGxheVZhbHVlc1xuICAgIH0pO1xuICAgIG9uSW50ZXJuYWxTZWFyY2goJycsIGZhbHNlLCBmYWxzZSk7XG4gIH07XG4gIHZhciBfdXNlQWxsb3dDbGVhciA9IHVzZUFsbG93Q2xlYXIocHJlZml4Q2xzLCBvbkNsZWFyTW91c2VEb3duLCBkaXNwbGF5VmFsdWVzLCBhbGxvd0NsZWFyLCBjbGVhckljb24sIGRpc2FibGVkLCBtZXJnZWRTZWFyY2hWYWx1ZSwgbW9kZSksXG4gICAgbWVyZ2VkQWxsb3dDbGVhciA9IF91c2VBbGxvd0NsZWFyLmFsbG93Q2xlYXIsXG4gICAgY2xlYXJOb2RlID0gX3VzZUFsbG93Q2xlYXIuY2xlYXJJY29uO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBPcHRpb25MaXN0ID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgb3B0aW9uTGlzdCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE9wdGlvbkxpc3QsIHtcbiAgICByZWY6IGxpc3RSZWZcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU2VsZWN0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBtZXJnZWRDbGFzc05hbWUgPSBjbGFzc05hbWVzKHByZWZpeENscywgY2xhc3NOYW1lLCBfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZm9jdXNlZFwiKSwgbW9ja0ZvY3VzZWQpLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW11bHRpcGxlXCIpLCBtdWx0aXBsZSksIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2luZ2xlXCIpLCAhbXVsdGlwbGUpLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWFsbG93LWNsZWFyXCIpLCBhbGxvd0NsZWFyKSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zaG93LWFycm93XCIpLCBzaG93U3VmZml4SWNvbiksIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZGlzYWJsZWRcIiksIGRpc2FibGVkKSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1sb2FkaW5nXCIpLCBsb2FkaW5nKSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1vcGVuXCIpLCBtZXJnZWRPcGVuKSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jdXN0b21pemUtaW5wdXRcIiksIGN1c3RvbWl6ZUlucHV0RWxlbWVudCksIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2hvdy1zZWFyY2hcIiksIG1lcmdlZFNob3dTZWFyY2gpKTtcblxuICAvLyA+Pj4gU2VsZWN0b3JcbiAgdmFyIHNlbGVjdG9yTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNlbGVjdFRyaWdnZXIsIHtcbiAgICByZWY6IHRyaWdnZXJSZWYsXG4gICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIHZpc2libGU6IHRyaWdnZXJPcGVuLFxuICAgIHBvcHVwRWxlbWVudDogb3B0aW9uTGlzdCxcbiAgICBhbmltYXRpb246IGFuaW1hdGlvbixcbiAgICB0cmFuc2l0aW9uTmFtZTogdHJhbnNpdGlvbk5hbWUsXG4gICAgZHJvcGRvd25TdHlsZTogZHJvcGRvd25TdHlsZSxcbiAgICBkcm9wZG93bkNsYXNzTmFtZTogZHJvcGRvd25DbGFzc05hbWUsXG4gICAgZGlyZWN0aW9uOiBkaXJlY3Rpb24sXG4gICAgZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoOiBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGgsXG4gICAgZHJvcGRvd25SZW5kZXI6IGRyb3Bkb3duUmVuZGVyLFxuICAgIGRyb3Bkb3duQWxpZ246IGRyb3Bkb3duQWxpZ24sXG4gICAgcGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgYnVpbHRpblBsYWNlbWVudHM6IGJ1aWx0aW5QbGFjZW1lbnRzLFxuICAgIGdldFBvcHVwQ29udGFpbmVyOiBnZXRQb3B1cENvbnRhaW5lcixcbiAgICBlbXB0eTogZW1wdHlPcHRpb25zLFxuICAgIGdldFRyaWdnZXJET01Ob2RlOiBmdW5jdGlvbiBnZXRUcmlnZ2VyRE9NTm9kZShub2RlKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAvLyBUT0RPOiBUaGlzIGlzIHdvcmthcm91bmQgYW5kIHNob3VsZCBiZSByZW1vdmVkIGluIGByYy1zZWxlY3RgXG4gICAgICAgIC8vIEFuZCB1c2UgbmV3IHN0YW5kYXJkIGBuYXRpdmVFbGVtZW50YCBmb3IgcmVmLlxuICAgICAgICAvLyBCdXQgd2Ugc2hvdWxkIHVwZGF0ZSBgcmMtcmVzaXplLW9ic2VydmVyYCBmaXJzdC5cbiAgICAgICAgc2VsZWN0b3JEb21SZWYuY3VycmVudCB8fCBub2RlXG4gICAgICApO1xuICAgIH0sXG4gICAgb25Qb3B1cFZpc2libGVDaGFuZ2U6IG9uVHJpZ2dlclZpc2libGVDaGFuZ2UsXG4gICAgb25Qb3B1cE1vdXNlRW50ZXI6IG9uUG9wdXBNb3VzZUVudGVyXG4gIH0sIGN1c3RvbWl6ZVJhd0lucHV0RWxlbWVudCA/ICggLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChjdXN0b21pemVSYXdJbnB1dEVsZW1lbnQsIHtcbiAgICByZWY6IGN1c3RvbWl6ZVJhd0lucHV0UmVmXG4gIH0pKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNlbGVjdG9yLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICBkb21SZWY6IHNlbGVjdG9yRG9tUmVmLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGlucHV0RWxlbWVudDogY3VzdG9taXplSW5wdXRFbGVtZW50LFxuICAgIHJlZjogc2VsZWN0b3JSZWYsXG4gICAgaWQ6IGlkLFxuICAgIHByZWZpeDogcHJlZml4LFxuICAgIHNob3dTZWFyY2g6IG1lcmdlZFNob3dTZWFyY2gsXG4gICAgYXV0b0NsZWFyU2VhcmNoVmFsdWU6IGF1dG9DbGVhclNlYXJjaFZhbHVlLFxuICAgIG1vZGU6IG1vZGUsXG4gICAgYWN0aXZlRGVzY2VuZGFudElkOiBhY3RpdmVEZXNjZW5kYW50SWQsXG4gICAgdGFnUmVuZGVyOiB0YWdSZW5kZXIsXG4gICAgdmFsdWVzOiBkaXNwbGF5VmFsdWVzLFxuICAgIG9wZW46IG1lcmdlZE9wZW4sXG4gICAgb25Ub2dnbGVPcGVuOiBvblRvZ2dsZU9wZW4sXG4gICAgYWN0aXZlVmFsdWU6IGFjdGl2ZVZhbHVlLFxuICAgIHNlYXJjaFZhbHVlOiBtZXJnZWRTZWFyY2hWYWx1ZSxcbiAgICBvblNlYXJjaDogb25JbnRlcm5hbFNlYXJjaCxcbiAgICBvblNlYXJjaFN1Ym1pdDogb25JbnRlcm5hbFNlYXJjaFN1Ym1pdCxcbiAgICBvblJlbW92ZTogb25TZWxlY3RvclJlbW92ZSxcbiAgICB0b2tlbldpdGhFbnRlcjogdG9rZW5XaXRoRW50ZXIsXG4gICAgb25JbnB1dEJsdXI6IG9uSW5wdXRCbHVyXG4gIH0pKSk7XG5cbiAgLy8gPj4+IFJlbmRlclxuICB2YXIgcmVuZGVyTm9kZTtcblxuICAvLyBSZW5kZXIgcmF3XG4gIGlmIChjdXN0b21pemVSYXdJbnB1dEVsZW1lbnQpIHtcbiAgICByZW5kZXJOb2RlID0gc2VsZWN0b3JOb2RlO1xuICB9IGVsc2Uge1xuICAgIHJlbmRlck5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgICBjbGFzc05hbWU6IG1lcmdlZENsYXNzTmFtZVxuICAgIH0sIGRvbVByb3BzLCB7XG4gICAgICByZWY6IGNvbnRhaW5lclJlZixcbiAgICAgIG9uTW91c2VEb3duOiBvbkludGVybmFsTW91c2VEb3duLFxuICAgICAgb25LZXlEb3duOiBvbkludGVybmFsS2V5RG93bixcbiAgICAgIG9uS2V5VXA6IG9uSW50ZXJuYWxLZXlVcCxcbiAgICAgIG9uRm9jdXM6IG9uQ29udGFpbmVyRm9jdXMsXG4gICAgICBvbkJsdXI6IG9uQ29udGFpbmVyQmx1clxuICAgIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQb2xpdGUsIHtcbiAgICAgIHZpc2libGU6IG1vY2tGb2N1c2VkICYmICFtZXJnZWRPcGVuLFxuICAgICAgdmFsdWVzOiBkaXNwbGF5VmFsdWVzXG4gICAgfSksIHNlbGVjdG9yTm9kZSwgYXJyb3dOb2RlLCBtZXJnZWRBbGxvd0NsZWFyICYmIGNsZWFyTm9kZSk7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEJhc2VTZWxlY3RDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IGJhc2VTZWxlY3RDb250ZXh0XG4gIH0sIHJlbmRlck5vZGUpO1xufSk7XG5cbi8vIFNldCBkaXNwbGF5IG5hbWUgZm9yIGRldlxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgQmFzZVNlbGVjdC5kaXNwbGF5TmFtZSA9ICdCYXNlU2VsZWN0Jztcbn1cbmV4cG9ydCBkZWZhdWx0IEJhc2VTZWxlY3Q7IiwgImV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAoKSB7XG4gIGlmICh0eXBlb2YgbmF2aWdhdG9yID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgYWdlbnQgPSBuYXZpZ2F0b3IudXNlckFnZW50IHx8IG5hdmlnYXRvci52ZW5kb3IgfHwgd2luZG93Lm9wZXJhO1xuICByZXR1cm4gLyhhbmRyb2lkfGJiXFxkK3xtZWVnbykuK21vYmlsZXxhdmFudGdvfGJhZGFcXC98YmxhY2tiZXJyeXxibGF6ZXJ8Y29tcGFsfGVsYWluZXxmZW5uZWN8aGlwdG9wfGllbW9iaWxlfGlwKGhvbmV8b2QpfGlyaXN8a2luZGxlfGxnZSB8bWFlbW98bWlkcHxtbXB8bW9iaWxlLitmaXJlZm94fG5ldGZyb250fG9wZXJhIG0ob2J8aW4paXxwYWxtKCBvcyk/fHBob25lfHAoaXhpfHJlKVxcL3xwbHVja2VyfHBvY2tldHxwc3B8c2VyaWVzKDR8NikwfHN5bWJpYW58dHJlb3x1cFxcLihicm93c2VyfGxpbmspfHZvZGFmb25lfHdhcHx3aW5kb3dzIGNlfHhkYXx4aWlub3xhbmRyb2lkfGlwYWR8cGxheWJvb2t8c2lsay9pLnRlc3QoYWdlbnQpIHx8IC8xMjA3fDYzMTB8NjU5MHwzZ3NvfDR0aHB8NTBbMS02XWl8Nzcwc3w4MDJzfGEgd2F8YWJhY3xhYyhlcnxvb3xzLSl8YWkoa298cm4pfGFsKGF2fGNhfGNvKXxhbW9pfGFuKGV4fG55fHl3KXxhcHR1fGFyKGNofGdvKXxhcyh0ZXx1cyl8YXR0d3xhdShkaXwtbXxyIHxzICl8YXZhbnxiZShja3xsbHxucSl8YmkobGJ8cmQpfGJsKGFjfGF6KXxicihlfHYpd3xidW1ifGJ3LShufHUpfGM1NVxcL3xjYXBpfGNjd2F8Y2RtLXxjZWxsfGNodG18Y2xkY3xjbWQtfGNvKG1wfG5kKXxjcmF3fGRhKGl0fGxsfG5nKXxkYnRlfGRjLXN8ZGV2aXxkaWNhfGRtb2J8ZG8oY3xwKW98ZHMoMTJ8LWQpfGVsKDQ5fGFpKXxlbShsMnx1bCl8ZXIoaWN8azApfGVzbDh8ZXooWzQtN10wfG9zfHdhfHplKXxmZXRjfGZseSgtfF8pfGcxIHV8ZzU2MHxnZW5lfGdmLTV8Zy1tb3xnbyhcXC53fG9kKXxncihhZHx1bil8aGFpZXxoY2l0fGhkLShtfHB8dCl8aGVpLXxoaShwdHx0YSl8aHAoIGl8aXApfGhzLWN8aHQoYygtfCB8X3xhfGd8cHxzfHQpfHRwKXxodShhd3x0Yyl8aS0oMjB8Z298bWEpfGkyMzB8aWFjKCB8LXxcXC8pfGlicm98aWRlYXxpZzAxfGlrb218aW0xa3xpbm5vfGlwYXF8aXJpc3xqYSh0fHYpYXxqYnJvfGplbXV8amlnc3xrZGRpfGtlaml8a2d0KCB8XFwvKXxrbG9ufGtwdCB8a3djLXxreW8oY3xrKXxsZShub3x4aSl8bGcoIGd8XFwvKGt8bHx1KXw1MHw1NHwtW2Etd10pfGxpYnd8bHlueHxtMS13fG0zZ2F8bTUwXFwvfG1hKHRlfHVpfHhvKXxtYygwMXwyMXxjYSl8bS1jcnxtZShyY3xyaSl8bWkobzh8b2F8dHMpfG1tZWZ8bW8oMDF8MDJ8Yml8ZGV8ZG98dCgtfCB8b3x2KXx6eil8bXQoNTB8cDF8diApfG13YnB8bXl3YXxuMTBbMC0yXXxuMjBbMi0zXXxuMzAoMHwyKXxuNTAoMHwyfDUpfG43KDAoMHwxKXwxMCl8bmUoKGN8bSktfG9ufHRmfHdmfHdnfHd0KXxub2soNnxpKXxuenBofG8yaW18b3AodGl8d3YpfG9yYW58b3dnMXxwODAwfHBhbihhfGR8dCl8cGR4Z3xwZygxM3wtKFsxLThdfGMpKXxwaGlsfHBpcmV8cGwoYXl8dWMpfHBuLTJ8cG8oY2t8cnR8c2UpfHByb3h8cHNpb3xwdC1nfHFhLWF8cWMoMDd8MTJ8MjF8MzJ8NjB8LVsyLTddfGktKXxxdGVrfHIzODB8cjYwMHxyYWtzfHJpbTl8cm8odmV8em8pfHM1NVxcL3xzYShnZXxtYXxtbXxtc3xueXx2YSl8c2MoMDF8aC18b298cC0pfHNka1xcL3xzZShjKC18MHwxKXw0N3xtY3xuZHxyaSl8c2doLXxzaGFyfHNpZSgtfG0pfHNrLTB8c2woNDV8aWQpfHNtKGFsfGFyfGIzfGl0fHQ1KXxzbyhmdHxueSl8c3AoMDF8aC18di18diApfHN5KDAxfG1iKXx0MigxOHw1MCl8dDYoMDB8MTB8MTgpfHRhKGd0fGxrKXx0Y2wtfHRkZy18dGVsKGl8bSl8dGltLXx0LW1vfHRvKHBsfHNoKXx0cyg3MHxtLXxtM3xtNSl8dHgtOXx1cChcXC5ifGcxfHNpKXx1dHN0fHY0MDB8djc1MHx2ZXJpfHZpKHJnfHRlKXx2ayg0MHw1WzAtM118LXYpfHZtNDB8dm9kYXx2dWxjfHZ4KDUyfDUzfDYwfDYxfDcwfDgwfDgxfDgzfDg1fDk4KXx3M2MoLXwgKXx3ZWJjfHdoaXR8d2koZyB8bmN8bncpfHdtbGJ8d29udXx4NzAwfHlhcy18eW91cnx6ZXRvfHp0ZS0vaS50ZXN0KGFnZW50ID09PSBudWxsIHx8IGFnZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhZ2VudC5zdWJzdHIoMCwgNCkpO1xufSk7IiwgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xudmFyIFRyYW5zQnRuID0gZnVuY3Rpb24gVHJhbnNCdG4ocHJvcHMpIHtcbiAgdmFyIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBjdXN0b21pemVJY29uID0gcHJvcHMuY3VzdG9taXplSWNvbixcbiAgICBjdXN0b21pemVJY29uUHJvcHMgPSBwcm9wcy5jdXN0b21pemVJY29uUHJvcHMsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBfb25Nb3VzZURvd24gPSBwcm9wcy5vbk1vdXNlRG93bixcbiAgICBvbkNsaWNrID0gcHJvcHMub25DbGljaztcbiAgdmFyIGljb24gPSB0eXBlb2YgY3VzdG9taXplSWNvbiA9PT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZUljb24oY3VzdG9taXplSWNvblByb3BzKSA6IGN1c3RvbWl6ZUljb247XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgIG9uTW91c2VEb3duOiBmdW5jdGlvbiBvbk1vdXNlRG93bihldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIF9vbk1vdXNlRG93biA9PT0gbnVsbCB8fCBfb25Nb3VzZURvd24gPT09IHZvaWQgMCB8fCBfb25Nb3VzZURvd24oZXZlbnQpO1xuICAgIH0sXG4gICAgc3R5bGU6IHtcbiAgICAgIHVzZXJTZWxlY3Q6ICdub25lJyxcbiAgICAgIFdlYmtpdFVzZXJTZWxlY3Q6ICdub25lJ1xuICAgIH0sXG4gICAgdW5zZWxlY3RhYmxlOiBcIm9uXCIsXG4gICAgb25DbGljazogb25DbGljayxcbiAgICBcImFyaWEtaGlkZGVuXCI6IHRydWVcbiAgfSwgaWNvbiAhPT0gdW5kZWZpbmVkID8gaWNvbiA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZS5zcGxpdCgvXFxzKy8pLm1hcChmdW5jdGlvbiAoY2xzKSB7XG4gICAgICByZXR1cm4gXCJcIi5jb25jYXQoY2xzLCBcIi1pY29uXCIpO1xuICAgIH0pKVxuICB9LCBjaGlsZHJlbikpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFRyYW5zQnRuOyIsICJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgVHJhbnNCdG4gZnJvbSBcIi4uL1RyYW5zQnRuXCI7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuZXhwb3J0IHZhciB1c2VBbGxvd0NsZWFyID0gZnVuY3Rpb24gdXNlQWxsb3dDbGVhcihwcmVmaXhDbHMsIG9uQ2xlYXJNb3VzZURvd24sIGRpc3BsYXlWYWx1ZXMsIGFsbG93Q2xlYXIsIGNsZWFySWNvbikge1xuICB2YXIgZGlzYWJsZWQgPSBhcmd1bWVudHMubGVuZ3RoID4gNSAmJiBhcmd1bWVudHNbNV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s1XSA6IGZhbHNlO1xuICB2YXIgbWVyZ2VkU2VhcmNoVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gNiA/IGFyZ3VtZW50c1s2XSA6IHVuZGVmaW5lZDtcbiAgdmFyIG1vZGUgPSBhcmd1bWVudHMubGVuZ3RoID4gNyA/IGFyZ3VtZW50c1s3XSA6IHVuZGVmaW5lZDtcbiAgdmFyIG1lcmdlZENsZWFySWNvbiA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGlmIChfdHlwZW9mKGFsbG93Q2xlYXIpID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIGFsbG93Q2xlYXIuY2xlYXJJY29uO1xuICAgIH1cbiAgICBpZiAoY2xlYXJJY29uKSB7XG4gICAgICByZXR1cm4gY2xlYXJJY29uO1xuICAgIH1cbiAgfSwgW2FsbG93Q2xlYXIsIGNsZWFySWNvbl0pO1xuICB2YXIgbWVyZ2VkQWxsb3dDbGVhciA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGlmICghZGlzYWJsZWQgJiYgISFhbGxvd0NsZWFyICYmIChkaXNwbGF5VmFsdWVzLmxlbmd0aCB8fCBtZXJnZWRTZWFyY2hWYWx1ZSkgJiYgIShtb2RlID09PSAnY29tYm9ib3gnICYmIG1lcmdlZFNlYXJjaFZhbHVlID09PSAnJykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sIFthbGxvd0NsZWFyLCBkaXNhYmxlZCwgZGlzcGxheVZhbHVlcy5sZW5ndGgsIG1lcmdlZFNlYXJjaFZhbHVlLCBtb2RlXSk7XG4gIHJldHVybiB7XG4gICAgYWxsb3dDbGVhcjogbWVyZ2VkQWxsb3dDbGVhcixcbiAgICBjbGVhckljb246IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRyYW5zQnRuLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2xlYXJcIiksXG4gICAgICBvbk1vdXNlRG93bjogb25DbGVhck1vdXNlRG93bixcbiAgICAgIGN1c3RvbWl6ZUljb246IG1lcmdlZENsZWFySWNvblxuICAgIH0sIFwiXFx4RDdcIilcbiAgfTtcbn07IiwgIi8qKlxuICogQmFzZVNlbGVjdCBwcm92aWRlIHNvbWUgcGFyc2VkIGRhdGEgaW50byBjb250ZXh0LlxuICogWW91IGNhbiB1c2UgdGhpcyBob29rcyB0byBnZXQgdGhlbS5cbiAqL1xuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5leHBvcnQgdmFyIEJhc2VTZWxlY3RDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQobnVsbCk7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VCYXNlUHJvcHMoKSB7XG4gIHJldHVybiBSZWFjdC51c2VDb250ZXh0KEJhc2VTZWxlY3RDb250ZXh0KTtcbn0iLCAiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbi8qKlxuICogU2ltaWxhciB3aXRoIGB1c2VMb2NrYCwgYnV0IHRoaXMgaG9vayB3aWxsIGFsd2F5cyBleGVjdXRlIGxhc3QgdmFsdWUuXG4gKiBXaGVuIHNldCB0byBgdHJ1ZWAsIGl0IHdpbGwga2VlcCBgdHJ1ZWAgZm9yIGEgc2hvcnQgdGltZSBldmVuIGlmIGBmYWxzZWAgaXMgc2V0LlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VEZWxheVJlc2V0KCkge1xuICB2YXIgdGltZW91dCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogMTA7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShmYWxzZSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgYm9vbCA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0Qm9vbCA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciBkZWxheVJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIGNhbmNlbExhdGVzdCA9IGZ1bmN0aW9uIGNhbmNlbExhdGVzdCgpIHtcbiAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGRlbGF5UmVmLmN1cnJlbnQpO1xuICB9O1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjYW5jZWxMYXRlc3Q7XG4gIH0sIFtdKTtcbiAgdmFyIGRlbGF5U2V0Qm9vbCA9IGZ1bmN0aW9uIGRlbGF5U2V0Qm9vbCh2YWx1ZSwgY2FsbGJhY2spIHtcbiAgICBjYW5jZWxMYXRlc3QoKTtcbiAgICBkZWxheVJlZi5jdXJyZW50ID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgc2V0Qm9vbCh2YWx1ZSk7XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9LCB0aW1lb3V0KTtcbiAgfTtcbiAgcmV0dXJuIFtib29sLCBkZWxheVNldEJvb2wsIGNhbmNlbExhdGVzdF07XG59IiwgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcblxuLyoqXG4gKiBMb2NrZXIgcmV0dXJuIGNhY2hlZCBtYXJrLlxuICogSWYgc2V0IHRvIGB0cnVlYCwgd2lsbCByZXR1cm4gYHRydWVgIGluIGEgc2hvcnQgdGltZSBldmVuIGlmIHNldCBgZmFsc2VgLlxuICogSWYgc2V0IHRvIGBmYWxzZWAgYW5kIHRoZW4gc2V0IHRvIGB0cnVlYCwgd2lsbCBjaGFuZ2UgdG8gYHRydWVgLlxuICogQW5kIGFmdGVyIHRpbWUgZHVyYXRpb24sIGl0IHdpbGwgYmFjayB0byBgbnVsbGAgYXV0b21hdGljYWxseS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlTG9jaygpIHtcbiAgdmFyIGR1cmF0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAyNTA7XG4gIHZhciBsb2NrUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICB2YXIgdGltZW91dFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcblxuICAvLyBDbGVhbiB1cFxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRpbWVvdXRSZWYuY3VycmVudCk7XG4gICAgfTtcbiAgfSwgW10pO1xuICBmdW5jdGlvbiBkb0xvY2sobG9ja2VkKSB7XG4gICAgaWYgKGxvY2tlZCB8fCBsb2NrUmVmLmN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIGxvY2tSZWYuY3VycmVudCA9IGxvY2tlZDtcbiAgICB9XG4gICAgd2luZG93LmNsZWFyVGltZW91dCh0aW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgIHRpbWVvdXRSZWYuY3VycmVudCA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGxvY2tSZWYuY3VycmVudCA9IG51bGw7XG4gICAgfSwgZHVyYXRpb24pO1xuICB9XG4gIHJldHVybiBbZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBsb2NrUmVmLmN1cnJlbnQ7XG4gIH0sIGRvTG9ja107XG59IiwgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVNlbGVjdFRyaWdnZXJDb250cm9sKGVsZW1lbnRzLCBvcGVuLCB0cmlnZ2VyT3BlbiwgY3VzdG9taXplZFRyaWdnZXIpIHtcbiAgdmFyIHByb3BzUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBwcm9wc1JlZi5jdXJyZW50ID0ge1xuICAgIG9wZW46IG9wZW4sXG4gICAgdHJpZ2dlck9wZW46IHRyaWdnZXJPcGVuLFxuICAgIGN1c3RvbWl6ZWRUcmlnZ2VyOiBjdXN0b21pemVkVHJpZ2dlclxuICB9O1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIG9uR2xvYmFsTW91c2VEb3duKGV2ZW50KSB7XG4gICAgICB2YXIgX3Byb3BzUmVmJGN1cnJlbnQ7XG4gICAgICAvLyBJZiB0cmlnZ2VyIGlzIGN1c3RvbWl6ZWQsIFRyaWdnZXIgd2lsbCB0YWtlIGNvbnRyb2wgb2YgcG9wdXBWaXNpYmxlXG4gICAgICBpZiAoKF9wcm9wc1JlZiRjdXJyZW50ID0gcHJvcHNSZWYuY3VycmVudCkgIT09IG51bGwgJiYgX3Byb3BzUmVmJGN1cnJlbnQgIT09IHZvaWQgMCAmJiBfcHJvcHNSZWYkY3VycmVudC5jdXN0b21pemVkVHJpZ2dlcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgaWYgKHRhcmdldC5zaGFkb3dSb290ICYmIGV2ZW50LmNvbXBvc2VkKSB7XG4gICAgICAgIHRhcmdldCA9IGV2ZW50LmNvbXBvc2VkUGF0aCgpWzBdIHx8IHRhcmdldDtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wc1JlZi5jdXJyZW50Lm9wZW4gJiYgZWxlbWVudHMoKS5maWx0ZXIoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICB9KS5ldmVyeShmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gIWVsZW1lbnQuY29udGFpbnModGFyZ2V0KSAmJiBlbGVtZW50ICE9PSB0YXJnZXQ7XG4gICAgICB9KSkge1xuICAgICAgICAvLyBTaG91bGQgdHJpZ2dlciBjbG9zZVxuICAgICAgICBwcm9wc1JlZi5jdXJyZW50LnRyaWdnZXJPcGVuKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIG9uR2xvYmFsTW91c2VEb3duKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbkdsb2JhbE1vdXNlRG93bik7XG4gICAgfTtcbiAgfSwgW10pO1xufSIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuLyoqXG4gKiBDdXJzb3IgcnVsZTpcbiAqIDEuIE9ubHkgYHNob3dTZWFyY2hgIGVuYWJsZWRcbiAqIDIuIE9ubHkgYG9wZW5gIGlzIGB0cnVlYFxuICogMy4gV2hlbiB0eXBpbmcsIHNldCBgb3BlbmAgdG8gYHRydWVgIHdoaWNoIGhpdCBydWxlIG9mIDJcbiAqXG4gKiBBY2Nlc3NpYmlsaXR5OlxuICogLSBodHRwczovL3d3dy53My5vcmcvVFIvd2FpLWFyaWEtcHJhY3RpY2VzL2V4YW1wbGVzL2NvbWJvYm94L2FyaWExLjFwYXR0ZXJuL2xpc3Rib3gtY29tYm8uaHRtbFxuICovXG5cbmltcG9ydCBLZXlDb2RlIGZyb20gXCJyYy11dGlsL2VzL0tleUNvZGVcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VMb2NrIGZyb20gXCIuLi9ob29rcy91c2VMb2NrXCI7XG5pbXBvcnQgeyBpc1ZhbGlkYXRlT3BlbktleSB9IGZyb20gXCIuLi91dGlscy9rZXlVdGlsXCI7XG5pbXBvcnQgTXVsdGlwbGVTZWxlY3RvciBmcm9tIFwiLi9NdWx0aXBsZVNlbGVjdG9yXCI7XG5pbXBvcnQgU2luZ2xlU2VsZWN0b3IgZnJvbSBcIi4vU2luZ2xlU2VsZWN0b3JcIjtcbnZhciBTZWxlY3RvciA9IGZ1bmN0aW9uIFNlbGVjdG9yKHByb3BzLCByZWYpIHtcbiAgdmFyIGlucHV0UmVmID0gdXNlUmVmKG51bGwpO1xuICB2YXIgY29tcG9zaXRpb25TdGF0dXNSZWYgPSB1c2VSZWYoZmFsc2UpO1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIG9wZW4gPSBwcm9wcy5vcGVuLFxuICAgIG1vZGUgPSBwcm9wcy5tb2RlLFxuICAgIHNob3dTZWFyY2ggPSBwcm9wcy5zaG93U2VhcmNoLFxuICAgIHRva2VuV2l0aEVudGVyID0gcHJvcHMudG9rZW5XaXRoRW50ZXIsXG4gICAgZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICBwcmVmaXggPSBwcm9wcy5wcmVmaXgsXG4gICAgYXV0b0NsZWFyU2VhcmNoVmFsdWUgPSBwcm9wcy5hdXRvQ2xlYXJTZWFyY2hWYWx1ZSxcbiAgICBvblNlYXJjaCA9IHByb3BzLm9uU2VhcmNoLFxuICAgIG9uU2VhcmNoU3VibWl0ID0gcHJvcHMub25TZWFyY2hTdWJtaXQsXG4gICAgb25Ub2dnbGVPcGVuID0gcHJvcHMub25Ub2dnbGVPcGVuLFxuICAgIG9uSW5wdXRLZXlEb3duID0gcHJvcHMub25JbnB1dEtleURvd24sXG4gICAgb25JbnB1dEJsdXIgPSBwcm9wcy5vbklucHV0Qmx1cixcbiAgICBkb21SZWYgPSBwcm9wcy5kb21SZWY7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT0gUmVmID09PT09PT09PT09PT09PT09PT09PT09XG4gIFJlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZvY3VzOiBmdW5jdGlvbiBmb2N1cyhvcHRpb25zKSB7XG4gICAgICAgIGlucHV0UmVmLmN1cnJlbnQuZm9jdXMob3B0aW9ucyk7XG4gICAgICB9LFxuICAgICAgYmx1cjogZnVuY3Rpb24gYmx1cigpIHtcbiAgICAgICAgaW5wdXRSZWYuY3VycmVudC5ibHVyKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PSBJbnB1dCA9PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfdXNlTG9jayA9IHVzZUxvY2soMCksXG4gICAgX3VzZUxvY2syID0gX3NsaWNlZFRvQXJyYXkoX3VzZUxvY2ssIDIpLFxuICAgIGdldElucHV0TW91c2VEb3duID0gX3VzZUxvY2syWzBdLFxuICAgIHNldElucHV0TW91c2VEb3duID0gX3VzZUxvY2syWzFdO1xuICB2YXIgb25JbnRlcm5hbElucHV0S2V5RG93biA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxJbnB1dEtleURvd24oZXZlbnQpIHtcbiAgICB2YXIgd2hpY2ggPSBldmVudC53aGljaDtcblxuICAgIC8vIENvbXBhdGlibGUgd2l0aCBtdWx0aXBsZSBsaW5lcyBpbiBUZXh0QXJlYVxuICAgIHZhciBpc1RleHRBcmVhRWxlbWVudCA9IGlucHV0UmVmLmN1cnJlbnQgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50O1xuICAgIGlmICghaXNUZXh0QXJlYUVsZW1lbnQgJiYgb3BlbiAmJiAod2hpY2ggPT09IEtleUNvZGUuVVAgfHwgd2hpY2ggPT09IEtleUNvZGUuRE9XTikpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIGlmIChvbklucHV0S2V5RG93bikge1xuICAgICAgb25JbnB1dEtleURvd24oZXZlbnQpO1xuICAgIH1cbiAgICBpZiAod2hpY2ggPT09IEtleUNvZGUuRU5URVIgJiYgbW9kZSA9PT0gJ3RhZ3MnICYmICFjb21wb3NpdGlvblN0YXR1c1JlZi5jdXJyZW50ICYmICFvcGVuKSB7XG4gICAgICAvLyBXaGVuIG1lbnUgaXNuJ3Qgb3BlbiwgT3B0aW9uTGlzdCB3b24ndCB0cmlnZ2VyIGEgdmFsdWUgY2hhbmdlXG4gICAgICAvLyBTbyB3aGVuIGVudGVyIGlzIHByZXNzZWQsIHRoZSB0YWcncyBpbnB1dCB2YWx1ZSBzaG91bGQgYmUgZW1pdHRlZCBoZXJlIHRvIGxldCBzZWxlY3RvciBrbm93XG4gICAgICBvblNlYXJjaFN1Ym1pdCA9PT0gbnVsbCB8fCBvblNlYXJjaFN1Ym1pdCA9PT0gdm9pZCAwIHx8IG9uU2VhcmNoU3VibWl0KGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgfVxuICAgIC8vIE1vdmUgd2l0aGluIHRoZSB0ZXh0IGJveFxuICAgIGlmIChpc1RleHRBcmVhRWxlbWVudCAmJiAhb3BlbiAmJiB+W0tleUNvZGUuVVAsIEtleUNvZGUuRE9XTiwgS2V5Q29kZS5MRUZULCBLZXlDb2RlLlJJR0hUXS5pbmRleE9mKHdoaWNoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXNWYWxpZGF0ZU9wZW5LZXkod2hpY2gpKSB7XG4gICAgICBvblRvZ2dsZU9wZW4odHJ1ZSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBXZSBjYW4gbm90IHVzZSBgZmluZERPTU5vZGVgIHNpbmUgaXQgd2lsbCBnZXQgd2FybmluZyxcbiAgICogaGF2ZSB0byB1c2UgdGltZXIgdG8gY2hlY2sgaWYgaXMgaW5wdXQgZWxlbWVudC5cbiAgICovXG4gIHZhciBvbkludGVybmFsSW5wdXRNb3VzZURvd24gPSBmdW5jdGlvbiBvbkludGVybmFsSW5wdXRNb3VzZURvd24oKSB7XG4gICAgc2V0SW5wdXRNb3VzZURvd24odHJ1ZSk7XG4gIH07XG5cbiAgLy8gV2hlbiBwYXN0ZSBjb21lLCBpZ25vcmUgbmV4dCBvbkNoYW5nZVxuICB2YXIgcGFzdGVkVGV4dFJlZiA9IHVzZVJlZihudWxsKTtcbiAgdmFyIHRyaWdnZXJPblNlYXJjaCA9IGZ1bmN0aW9uIHRyaWdnZXJPblNlYXJjaCh2YWx1ZSkge1xuICAgIGlmIChvblNlYXJjaCh2YWx1ZSwgdHJ1ZSwgY29tcG9zaXRpb25TdGF0dXNSZWYuY3VycmVudCkgIT09IGZhbHNlKSB7XG4gICAgICBvblRvZ2dsZU9wZW4odHJ1ZSk7XG4gICAgfVxuICB9O1xuICB2YXIgb25JbnB1dENvbXBvc2l0aW9uU3RhcnQgPSBmdW5jdGlvbiBvbklucHV0Q29tcG9zaXRpb25TdGFydCgpIHtcbiAgICBjb21wb3NpdGlvblN0YXR1c1JlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgfTtcbiAgdmFyIG9uSW5wdXRDb21wb3NpdGlvbkVuZCA9IGZ1bmN0aW9uIG9uSW5wdXRDb21wb3NpdGlvbkVuZChlKSB7XG4gICAgY29tcG9zaXRpb25TdGF0dXNSZWYuY3VycmVudCA9IGZhbHNlO1xuXG4gICAgLy8gVHJpZ2dlciBzZWFyY2ggYWdhaW4gdG8gc3VwcG9ydCBgdG9rZW5TZXBhcmF0b3JzYCB3aXRoIHR5cGV3cml0aW5nXG4gICAgaWYgKG1vZGUgIT09ICdjb21ib2JveCcpIHtcbiAgICAgIHRyaWdnZXJPblNlYXJjaChlLnRhcmdldC52YWx1ZSk7XG4gICAgfVxuICB9O1xuICB2YXIgb25JbnB1dENoYW5nZSA9IGZ1bmN0aW9uIG9uSW5wdXRDaGFuZ2UoZXZlbnQpIHtcbiAgICB2YXIgdmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XG5cbiAgICAvLyBQYXN0ZWQgdGV4dCBzaG91bGQgcmVwbGFjZSBiYWNrIHRvIG9yaWdpbiBjb250ZW50XG4gICAgaWYgKHRva2VuV2l0aEVudGVyICYmIHBhc3RlZFRleHRSZWYuY3VycmVudCAmJiAvW1xcclxcbl0vLnRlc3QocGFzdGVkVGV4dFJlZi5jdXJyZW50KSkge1xuICAgICAgLy8gQ1JMRiB3aWxsIGJlIHRyZWF0ZWQgYXMgYSBzaW5nbGUgc3BhY2UgZm9yIGlucHV0IGVsZW1lbnRcbiAgICAgIHZhciByZXBsYWNlZFRleHQgPSBwYXN0ZWRUZXh0UmVmLmN1cnJlbnQucmVwbGFjZSgvW1xcclxcbl0rJC8sICcnKS5yZXBsYWNlKC9cXHJcXG4vZywgJyAnKS5yZXBsYWNlKC9bXFxyXFxuXS9nLCAnICcpO1xuICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKHJlcGxhY2VkVGV4dCwgcGFzdGVkVGV4dFJlZi5jdXJyZW50KTtcbiAgICB9XG4gICAgcGFzdGVkVGV4dFJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICB0cmlnZ2VyT25TZWFyY2godmFsdWUpO1xuICB9O1xuICB2YXIgb25JbnB1dFBhc3RlID0gZnVuY3Rpb24gb25JbnB1dFBhc3RlKGUpIHtcbiAgICB2YXIgY2xpcGJvYXJkRGF0YSA9IGUuY2xpcGJvYXJkRGF0YTtcbiAgICB2YXIgdmFsdWUgPSBjbGlwYm9hcmREYXRhID09PSBudWxsIHx8IGNsaXBib2FyZERhdGEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dCcpO1xuICAgIHBhc3RlZFRleHRSZWYuY3VycmVudCA9IHZhbHVlIHx8ICcnO1xuICB9O1xuICB2YXIgb25DbGljayA9IGZ1bmN0aW9uIG9uQ2xpY2soX3JlZikge1xuICAgIHZhciB0YXJnZXQgPSBfcmVmLnRhcmdldDtcbiAgICBpZiAodGFyZ2V0ICE9PSBpbnB1dFJlZi5jdXJyZW50KSB7XG4gICAgICAvLyBTaG91bGQgZm9jdXMgaW5wdXQgaWYgY2xpY2sgdGhlIHNlbGVjdG9yXG4gICAgICB2YXIgaXNJRSA9IGRvY3VtZW50LmJvZHkuc3R5bGUubXNUb3VjaEFjdGlvbiAhPT0gdW5kZWZpbmVkO1xuICAgICAgaWYgKGlzSUUpIHtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaW5wdXRSZWYuY3VycmVudC5mb2N1cygpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlucHV0UmVmLmN1cnJlbnQuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHZhciBvbk1vdXNlRG93biA9IGZ1bmN0aW9uIG9uTW91c2VEb3duKGV2ZW50KSB7XG4gICAgdmFyIGlucHV0TW91c2VEb3duID0gZ2V0SW5wdXRNb3VzZURvd24oKTtcblxuICAgIC8vIHdoZW4gbW9kZSBpcyBjb21ib2JveCBhbmQgaXQgaXMgZGlzYWJsZWQsIGRvbid0IHByZXZlbnQgZGVmYXVsdCBiZWhhdmlvclxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzM3MzIwXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvNDgyODFcbiAgICBpZiAoZXZlbnQudGFyZ2V0ICE9PSBpbnB1dFJlZi5jdXJyZW50ICYmICFpbnB1dE1vdXNlRG93biAmJiAhKG1vZGUgPT09ICdjb21ib2JveCcgJiYgZGlzYWJsZWQpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBpZiAobW9kZSAhPT0gJ2NvbWJvYm94JyAmJiAoIXNob3dTZWFyY2ggfHwgIWlucHV0TW91c2VEb3duKSB8fCAhb3Blbikge1xuICAgICAgaWYgKG9wZW4gJiYgYXV0b0NsZWFyU2VhcmNoVmFsdWUgIT09IGZhbHNlKSB7XG4gICAgICAgIG9uU2VhcmNoKCcnLCB0cnVlLCBmYWxzZSk7XG4gICAgICB9XG4gICAgICBvblRvZ2dsZU9wZW4oKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT0gSW5uZXIgU2VsZWN0b3IgPT09PT09PT09PT09PT09PT09XG4gIHZhciBzaGFyZWRQcm9wcyA9IHtcbiAgICBpbnB1dFJlZjogaW5wdXRSZWYsXG4gICAgb25JbnB1dEtleURvd246IG9uSW50ZXJuYWxJbnB1dEtleURvd24sXG4gICAgb25JbnB1dE1vdXNlRG93bjogb25JbnRlcm5hbElucHV0TW91c2VEb3duLFxuICAgIG9uSW5wdXRDaGFuZ2U6IG9uSW5wdXRDaGFuZ2UsXG4gICAgb25JbnB1dFBhc3RlOiBvbklucHV0UGFzdGUsXG4gICAgb25JbnB1dENvbXBvc2l0aW9uU3RhcnQ6IG9uSW5wdXRDb21wb3NpdGlvblN0YXJ0LFxuICAgIG9uSW5wdXRDb21wb3NpdGlvbkVuZDogb25JbnB1dENvbXBvc2l0aW9uRW5kLFxuICAgIG9uSW5wdXRCbHVyOiBvbklucHV0Qmx1clxuICB9O1xuICB2YXIgc2VsZWN0Tm9kZSA9IG1vZGUgPT09ICdtdWx0aXBsZScgfHwgbW9kZSA9PT0gJ3RhZ3MnID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTXVsdGlwbGVTZWxlY3RvciwgX2V4dGVuZHMoe30sIHByb3BzLCBzaGFyZWRQcm9wcykpIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU2luZ2xlU2VsZWN0b3IsIF9leHRlbmRzKHt9LCBwcm9wcywgc2hhcmVkUHJvcHMpKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICByZWY6IGRvbVJlZixcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2VsZWN0b3JcIiksXG4gICAgb25DbGljazogb25DbGljayxcbiAgICBvbk1vdXNlRG93bjogb25Nb3VzZURvd25cbiAgfSwgcHJlZml4ICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcHJlZml4XCIpXG4gIH0sIHByZWZpeCksIHNlbGVjdE5vZGUpO1xufTtcbnZhciBGb3J3YXJkU2VsZWN0b3IgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihTZWxlY3Rvcik7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBGb3J3YXJkU2VsZWN0b3IuZGlzcGxheU5hbWUgPSAnU2VsZWN0b3InO1xufVxuZXhwb3J0IGRlZmF1bHQgRm9yd2FyZFNlbGVjdG9yOyIsICJpbXBvcnQgS2V5Q29kZSBmcm9tIFwicmMtdXRpbC9lcy9LZXlDb2RlXCI7XG5cbi8qKiBrZXlDb2RlIEp1ZGdtZW50IGZ1bmN0aW9uICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZGF0ZU9wZW5LZXkoY3VycmVudEtleUNvZGUpIHtcbiAgcmV0dXJuIChcbiAgICAvLyBVbmRlZmluZWQgZm9yIEVkZ2UgYnVnOlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzUxMjkyXG4gICAgY3VycmVudEtleUNvZGUgJiZcbiAgICAvLyBPdGhlciBrZXlzXG4gICAgIVtcbiAgICAvLyBTeXN0ZW0gZnVuY3Rpb24gYnV0dG9uXG4gICAgS2V5Q29kZS5FU0MsIEtleUNvZGUuU0hJRlQsIEtleUNvZGUuQkFDS1NQQUNFLCBLZXlDb2RlLlRBQiwgS2V5Q29kZS5XSU5fS0VZLCBLZXlDb2RlLkFMVCwgS2V5Q29kZS5NRVRBLCBLZXlDb2RlLldJTl9LRVlfUklHSFQsIEtleUNvZGUuQ1RSTCwgS2V5Q29kZS5TRU1JQ09MT04sIEtleUNvZGUuRVFVQUxTLCBLZXlDb2RlLkNBUFNfTE9DSywgS2V5Q29kZS5DT05URVhUX01FTlUsXG4gICAgLy8gRjEtRjEyXG4gICAgS2V5Q29kZS5GMSwgS2V5Q29kZS5GMiwgS2V5Q29kZS5GMywgS2V5Q29kZS5GNCwgS2V5Q29kZS5GNSwgS2V5Q29kZS5GNiwgS2V5Q29kZS5GNywgS2V5Q29kZS5GOCwgS2V5Q29kZS5GOSwgS2V5Q29kZS5GMTAsIEtleUNvZGUuRjExLCBLZXlDb2RlLkYxMl0uaW5jbHVkZXMoY3VycmVudEtleUNvZGUpXG4gICk7XG59IiwgImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgcGlja0F0dHJzIGZyb20gXCJyYy11dGlsL2VzL3BpY2tBdHRyc1wiO1xuaW1wb3J0IE92ZXJmbG93IGZyb20gJ3JjLW92ZXJmbG93JztcbmltcG9ydCBUcmFuc0J0biBmcm9tIFwiLi4vVHJhbnNCdG5cIjtcbmltcG9ydCBJbnB1dCBmcm9tIFwiLi9JbnB1dFwiO1xuaW1wb3J0IHVzZUxheW91dEVmZmVjdCBmcm9tIFwiLi4vaG9va3MvdXNlTGF5b3V0RWZmZWN0XCI7XG5pbXBvcnQgeyBnZXRUaXRsZSB9IGZyb20gXCIuLi91dGlscy9jb21tb25VdGlsXCI7XG5mdW5jdGlvbiBpdGVtS2V5KHZhbHVlKSB7XG4gIHZhciBfdmFsdWUka2V5O1xuICByZXR1cm4gKF92YWx1ZSRrZXkgPSB2YWx1ZS5rZXkpICE9PSBudWxsICYmIF92YWx1ZSRrZXkgIT09IHZvaWQgMCA/IF92YWx1ZSRrZXkgOiB2YWx1ZS52YWx1ZTtcbn1cbnZhciBvblByZXZlbnRNb3VzZURvd24gPSBmdW5jdGlvbiBvblByZXZlbnRNb3VzZURvd24oZXZlbnQpIHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG59O1xudmFyIFNlbGVjdFNlbGVjdG9yID0gZnVuY3Rpb24gU2VsZWN0U2VsZWN0b3IocHJvcHMpIHtcbiAgdmFyIGlkID0gcHJvcHMuaWQsXG4gICAgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIHZhbHVlcyA9IHByb3BzLnZhbHVlcyxcbiAgICBvcGVuID0gcHJvcHMub3BlbixcbiAgICBzZWFyY2hWYWx1ZSA9IHByb3BzLnNlYXJjaFZhbHVlLFxuICAgIGF1dG9DbGVhclNlYXJjaFZhbHVlID0gcHJvcHMuYXV0b0NsZWFyU2VhcmNoVmFsdWUsXG4gICAgaW5wdXRSZWYgPSBwcm9wcy5pbnB1dFJlZixcbiAgICBwbGFjZWhvbGRlciA9IHByb3BzLnBsYWNlaG9sZGVyLFxuICAgIGRpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgbW9kZSA9IHByb3BzLm1vZGUsXG4gICAgc2hvd1NlYXJjaCA9IHByb3BzLnNob3dTZWFyY2gsXG4gICAgYXV0b0ZvY3VzID0gcHJvcHMuYXV0b0ZvY3VzLFxuICAgIGF1dG9Db21wbGV0ZSA9IHByb3BzLmF1dG9Db21wbGV0ZSxcbiAgICBhY3RpdmVEZXNjZW5kYW50SWQgPSBwcm9wcy5hY3RpdmVEZXNjZW5kYW50SWQsXG4gICAgdGFiSW5kZXggPSBwcm9wcy50YWJJbmRleCxcbiAgICByZW1vdmVJY29uID0gcHJvcHMucmVtb3ZlSWNvbixcbiAgICBtYXhUYWdDb3VudCA9IHByb3BzLm1heFRhZ0NvdW50LFxuICAgIG1heFRhZ1RleHRMZW5ndGggPSBwcm9wcy5tYXhUYWdUZXh0TGVuZ3RoLFxuICAgIF9wcm9wcyRtYXhUYWdQbGFjZWhvbCA9IHByb3BzLm1heFRhZ1BsYWNlaG9sZGVyLFxuICAgIG1heFRhZ1BsYWNlaG9sZGVyID0gX3Byb3BzJG1heFRhZ1BsYWNlaG9sID09PSB2b2lkIDAgPyBmdW5jdGlvbiAob21pdHRlZFZhbHVlcykge1xuICAgICAgcmV0dXJuIFwiKyBcIi5jb25jYXQob21pdHRlZFZhbHVlcy5sZW5ndGgsIFwiIC4uLlwiKTtcbiAgICB9IDogX3Byb3BzJG1heFRhZ1BsYWNlaG9sLFxuICAgIHRhZ1JlbmRlciA9IHByb3BzLnRhZ1JlbmRlcixcbiAgICBvblRvZ2dsZU9wZW4gPSBwcm9wcy5vblRvZ2dsZU9wZW4sXG4gICAgb25SZW1vdmUgPSBwcm9wcy5vblJlbW92ZSxcbiAgICBvbklucHV0Q2hhbmdlID0gcHJvcHMub25JbnB1dENoYW5nZSxcbiAgICBvbklucHV0UGFzdGUgPSBwcm9wcy5vbklucHV0UGFzdGUsXG4gICAgb25JbnB1dEtleURvd24gPSBwcm9wcy5vbklucHV0S2V5RG93bixcbiAgICBvbklucHV0TW91c2VEb3duID0gcHJvcHMub25JbnB1dE1vdXNlRG93bixcbiAgICBvbklucHV0Q29tcG9zaXRpb25TdGFydCA9IHByb3BzLm9uSW5wdXRDb21wb3NpdGlvblN0YXJ0LFxuICAgIG9uSW5wdXRDb21wb3NpdGlvbkVuZCA9IHByb3BzLm9uSW5wdXRDb21wb3NpdGlvbkVuZCxcbiAgICBvbklucHV0Qmx1ciA9IHByb3BzLm9uSW5wdXRCbHVyO1xuICB2YXIgbWVhc3VyZVJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKDApLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIGlucHV0V2lkdGggPSBfdXNlU3RhdGUyWzBdLFxuICAgIHNldElucHV0V2lkdGggPSBfdXNlU3RhdGUyWzFdO1xuICB2YXIgX3VzZVN0YXRlMyA9IHVzZVN0YXRlKGZhbHNlKSxcbiAgICBfdXNlU3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlMywgMiksXG4gICAgZm9jdXNlZCA9IF91c2VTdGF0ZTRbMF0sXG4gICAgc2V0Rm9jdXNlZCA9IF91c2VTdGF0ZTRbMV07XG4gIHZhciBzZWxlY3Rpb25QcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNlbGVjdGlvblwiKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gU2VhcmNoID09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGlucHV0VmFsdWUgPSBvcGVuIHx8IG1vZGUgPT09ICdtdWx0aXBsZScgJiYgYXV0b0NsZWFyU2VhcmNoVmFsdWUgPT09IGZhbHNlIHx8IG1vZGUgPT09ICd0YWdzJyA/IHNlYXJjaFZhbHVlIDogJyc7XG4gIHZhciBpbnB1dEVkaXRhYmxlID0gbW9kZSA9PT0gJ3RhZ3MnIHx8IG1vZGUgPT09ICdtdWx0aXBsZScgJiYgYXV0b0NsZWFyU2VhcmNoVmFsdWUgPT09IGZhbHNlIHx8IHNob3dTZWFyY2ggJiYgKG9wZW4gfHwgZm9jdXNlZCk7XG5cbiAgLy8gV2UgbWVhc3VyZSB3aWR0aCBhbmQgc2V0IHRvIHRoZSBpbnB1dCBpbW1lZGlhdGVseVxuICB1c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHNldElucHV0V2lkdGgobWVhc3VyZVJlZi5jdXJyZW50LnNjcm9sbFdpZHRoKTtcbiAgfSwgW2lucHV0VmFsdWVdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gPj4+IFJlbmRlciBTZWxlY3RvciBOb2RlLiBJbmNsdWRlcyBJdGVtICYgUmVzdFxuICB2YXIgZGVmYXVsdFJlbmRlclNlbGVjdG9yID0gZnVuY3Rpb24gZGVmYXVsdFJlbmRlclNlbGVjdG9yKGl0ZW0sIGNvbnRlbnQsIGl0ZW1EaXNhYmxlZCwgY2xvc2FibGUsIG9uQ2xvc2UpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIHRpdGxlOiBnZXRUaXRsZShpdGVtKSxcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChzZWxlY3Rpb25QcmVmaXhDbHMsIFwiLWl0ZW1cIiksIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQoc2VsZWN0aW9uUHJlZml4Q2xzLCBcIi1pdGVtLWRpc2FibGVkXCIpLCBpdGVtRGlzYWJsZWQpKVxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHNlbGVjdGlvblByZWZpeENscywgXCItaXRlbS1jb250ZW50XCIpXG4gICAgfSwgY29udGVudCksIGNsb3NhYmxlICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRyYW5zQnRuLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHNlbGVjdGlvblByZWZpeENscywgXCItaXRlbS1yZW1vdmVcIiksXG4gICAgICBvbk1vdXNlRG93bjogb25QcmV2ZW50TW91c2VEb3duLFxuICAgICAgb25DbGljazogb25DbG9zZSxcbiAgICAgIGN1c3RvbWl6ZUljb246IHJlbW92ZUljb25cbiAgICB9LCBcIlxceEQ3XCIpKTtcbiAgfTtcbiAgdmFyIGN1c3RvbWl6ZVJlbmRlclNlbGVjdG9yID0gZnVuY3Rpb24gY3VzdG9taXplUmVuZGVyU2VsZWN0b3IodmFsdWUsIGNvbnRlbnQsIGl0ZW1EaXNhYmxlZCwgY2xvc2FibGUsIG9uQ2xvc2UsIGlzTWF4VGFnKSB7XG4gICAgdmFyIG9uTW91c2VEb3duID0gZnVuY3Rpb24gb25Nb3VzZURvd24oZSkge1xuICAgICAgb25QcmV2ZW50TW91c2VEb3duKGUpO1xuICAgICAgb25Ub2dnbGVPcGVuKCFvcGVuKTtcbiAgICB9O1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgb25Nb3VzZURvd246IG9uTW91c2VEb3duXG4gICAgfSwgdGFnUmVuZGVyKHtcbiAgICAgIGxhYmVsOiBjb250ZW50LFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZGlzYWJsZWQ6IGl0ZW1EaXNhYmxlZCxcbiAgICAgIGNsb3NhYmxlOiBjbG9zYWJsZSxcbiAgICAgIG9uQ2xvc2U6IG9uQ2xvc2UsXG4gICAgICBpc01heFRhZzogISFpc01heFRhZ1xuICAgIH0pKTtcbiAgfTtcbiAgdmFyIHJlbmRlckl0ZW0gPSBmdW5jdGlvbiByZW5kZXJJdGVtKHZhbHVlSXRlbSkge1xuICAgIHZhciBpdGVtRGlzYWJsZWQgPSB2YWx1ZUl0ZW0uZGlzYWJsZWQsXG4gICAgICBsYWJlbCA9IHZhbHVlSXRlbS5sYWJlbCxcbiAgICAgIHZhbHVlID0gdmFsdWVJdGVtLnZhbHVlO1xuICAgIHZhciBjbG9zYWJsZSA9ICFkaXNhYmxlZCAmJiAhaXRlbURpc2FibGVkO1xuICAgIHZhciBkaXNwbGF5TGFiZWwgPSBsYWJlbDtcbiAgICBpZiAodHlwZW9mIG1heFRhZ1RleHRMZW5ndGggPT09ICdudW1iZXInKSB7XG4gICAgICBpZiAodHlwZW9mIGxhYmVsID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgbGFiZWwgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHZhciBzdHJMYWJlbCA9IFN0cmluZyhkaXNwbGF5TGFiZWwpO1xuICAgICAgICBpZiAoc3RyTGFiZWwubGVuZ3RoID4gbWF4VGFnVGV4dExlbmd0aCkge1xuICAgICAgICAgIGRpc3BsYXlMYWJlbCA9IFwiXCIuY29uY2F0KHN0ckxhYmVsLnNsaWNlKDAsIG1heFRhZ1RleHRMZW5ndGgpLCBcIi4uLlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB2YXIgb25DbG9zZSA9IGZ1bmN0aW9uIG9uQ2xvc2UoZXZlbnQpIHtcbiAgICAgIGlmIChldmVudCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cbiAgICAgIG9uUmVtb3ZlKHZhbHVlSXRlbSk7XG4gICAgfTtcbiAgICByZXR1cm4gdHlwZW9mIHRhZ1JlbmRlciA9PT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZVJlbmRlclNlbGVjdG9yKHZhbHVlLCBkaXNwbGF5TGFiZWwsIGl0ZW1EaXNhYmxlZCwgY2xvc2FibGUsIG9uQ2xvc2UpIDogZGVmYXVsdFJlbmRlclNlbGVjdG9yKHZhbHVlSXRlbSwgZGlzcGxheUxhYmVsLCBpdGVtRGlzYWJsZWQsIGNsb3NhYmxlLCBvbkNsb3NlKTtcbiAgfTtcbiAgdmFyIHJlbmRlclJlc3QgPSBmdW5jdGlvbiByZW5kZXJSZXN0KG9taXR0ZWRWYWx1ZXMpIHtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy80ODkzMFxuICAgIGlmICghdmFsdWVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBjb250ZW50ID0gdHlwZW9mIG1heFRhZ1BsYWNlaG9sZGVyID09PSAnZnVuY3Rpb24nID8gbWF4VGFnUGxhY2Vob2xkZXIob21pdHRlZFZhbHVlcykgOiBtYXhUYWdQbGFjZWhvbGRlcjtcbiAgICByZXR1cm4gdHlwZW9mIHRhZ1JlbmRlciA9PT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZVJlbmRlclNlbGVjdG9yKHVuZGVmaW5lZCwgY29udGVudCwgZmFsc2UsIGZhbHNlLCB1bmRlZmluZWQsIHRydWUpIDogZGVmYXVsdFJlbmRlclNlbGVjdG9yKHtcbiAgICAgIHRpdGxlOiBjb250ZW50XG4gICAgfSwgY29udGVudCwgZmFsc2UpO1xuICB9O1xuXG4gIC8vID4+PiBJbnB1dCBOb2RlXG4gIHZhciBpbnB1dE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChzZWxlY3Rpb25QcmVmaXhDbHMsIFwiLXNlYXJjaFwiKSxcbiAgICBzdHlsZToge1xuICAgICAgd2lkdGg6IGlucHV0V2lkdGhcbiAgICB9LFxuICAgIG9uRm9jdXM6IGZ1bmN0aW9uIG9uRm9jdXMoKSB7XG4gICAgICBzZXRGb2N1c2VkKHRydWUpO1xuICAgIH0sXG4gICAgb25CbHVyOiBmdW5jdGlvbiBvbkJsdXIoKSB7XG4gICAgICBzZXRGb2N1c2VkKGZhbHNlKTtcbiAgICB9XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KElucHV0LCB7XG4gICAgcmVmOiBpbnB1dFJlZixcbiAgICBvcGVuOiBvcGVuLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGlkOiBpZCxcbiAgICBpbnB1dEVsZW1lbnQ6IG51bGwsXG4gICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgIGF1dG9Gb2N1czogYXV0b0ZvY3VzLFxuICAgIGF1dG9Db21wbGV0ZTogYXV0b0NvbXBsZXRlLFxuICAgIGVkaXRhYmxlOiBpbnB1dEVkaXRhYmxlLFxuICAgIGFjdGl2ZURlc2NlbmRhbnRJZDogYWN0aXZlRGVzY2VuZGFudElkLFxuICAgIHZhbHVlOiBpbnB1dFZhbHVlLFxuICAgIG9uS2V5RG93bjogb25JbnB1dEtleURvd24sXG4gICAgb25Nb3VzZURvd246IG9uSW5wdXRNb3VzZURvd24sXG4gICAgb25DaGFuZ2U6IG9uSW5wdXRDaGFuZ2UsXG4gICAgb25QYXN0ZTogb25JbnB1dFBhc3RlLFxuICAgIG9uQ29tcG9zaXRpb25TdGFydDogb25JbnB1dENvbXBvc2l0aW9uU3RhcnQsXG4gICAgb25Db21wb3NpdGlvbkVuZDogb25JbnB1dENvbXBvc2l0aW9uRW5kLFxuICAgIG9uQmx1cjogb25JbnB1dEJsdXIsXG4gICAgdGFiSW5kZXg6IHRhYkluZGV4LFxuICAgIGF0dHJzOiBwaWNrQXR0cnMocHJvcHMsIHRydWUpXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIHJlZjogbWVhc3VyZVJlZixcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHNlbGVjdGlvblByZWZpeENscywgXCItc2VhcmNoLW1pcnJvclwiKSxcbiAgICBcImFyaWEtaGlkZGVuXCI6IHRydWVcbiAgfSwgaW5wdXRWYWx1ZSwgXCJcXHhBMFwiKSk7XG5cbiAgLy8gPj4+IFNlbGVjdGlvbnNcbiAgdmFyIHNlbGVjdGlvbk5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChPdmVyZmxvdywge1xuICAgIHByZWZpeENsczogXCJcIi5jb25jYXQoc2VsZWN0aW9uUHJlZml4Q2xzLCBcIi1vdmVyZmxvd1wiKSxcbiAgICBkYXRhOiB2YWx1ZXMsXG4gICAgcmVuZGVySXRlbTogcmVuZGVySXRlbSxcbiAgICByZW5kZXJSZXN0OiByZW5kZXJSZXN0LFxuICAgIHN1ZmZpeDogaW5wdXROb2RlLFxuICAgIGl0ZW1LZXk6IGl0ZW1LZXksXG4gICAgbWF4Q291bnQ6IG1heFRhZ0NvdW50XG4gIH0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHNlbGVjdGlvblByZWZpeENscywgXCItd3JhcFwiKVxuICB9LCBzZWxlY3Rpb25Ob2RlLCAhdmFsdWVzLmxlbmd0aCAmJiAhaW5wdXRWYWx1ZSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQoc2VsZWN0aW9uUHJlZml4Q2xzLCBcIi1wbGFjZWhvbGRlclwiKVxuICB9LCBwbGFjZWhvbGRlcikpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFNlbGVjdFNlbGVjdG9yOyIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wicHJlZml4Q2xzXCIsIFwiZGF0YVwiLCBcInJlbmRlckl0ZW1cIiwgXCJyZW5kZXJSYXdJdGVtXCIsIFwiaXRlbUtleVwiLCBcIml0ZW1XaWR0aFwiLCBcInNzclwiLCBcInN0eWxlXCIsIFwiY2xhc3NOYW1lXCIsIFwibWF4Q291bnRcIiwgXCJyZW5kZXJSZXN0XCIsIFwicmVuZGVyUmF3UmVzdFwiLCBcInN1ZmZpeFwiLCBcImNvbXBvbmVudFwiLCBcIml0ZW1Db21wb25lbnRcIiwgXCJvblZpc2libGVDaGFuZ2VcIl07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VTdGF0ZSwgdXNlTWVtbywgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBSZXNpemVPYnNlcnZlciBmcm9tICdyYy1yZXNpemUtb2JzZXJ2ZXInO1xuaW1wb3J0IHVzZUxheW91dEVmZmVjdCBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VMYXlvdXRFZmZlY3RcIjtcbmltcG9ydCBJdGVtIGZyb20gXCIuL0l0ZW1cIjtcbmltcG9ydCB1c2VFZmZlY3RTdGF0ZSwgeyB1c2VCYXRjaGVyIH0gZnJvbSBcIi4vaG9va3MvdXNlRWZmZWN0U3RhdGVcIjtcbmltcG9ydCBSYXdJdGVtIGZyb20gXCIuL1Jhd0l0ZW1cIjtcbmltcG9ydCB7IE92ZXJmbG93Q29udGV4dCB9IGZyb20gXCIuL2NvbnRleHRcIjtcbnZhciBSRVNQT05TSVZFID0gJ3Jlc3BvbnNpdmUnO1xudmFyIElOVkFMSURBVEUgPSAnaW52YWxpZGF0ZSc7XG5leHBvcnQgeyBPdmVyZmxvd0NvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0XCI7XG5mdW5jdGlvbiBkZWZhdWx0UmVuZGVyUmVzdChvbWl0dGVkSXRlbXMpIHtcbiAgcmV0dXJuIFwiKyBcIi5jb25jYXQob21pdHRlZEl0ZW1zLmxlbmd0aCwgXCIgLi4uXCIpO1xufVxuZnVuY3Rpb24gT3ZlcmZsb3cocHJvcHMsIHJlZikge1xuICB2YXIgX3Byb3BzJHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBwcmVmaXhDbHMgPSBfcHJvcHMkcHJlZml4Q2xzID09PSB2b2lkIDAgPyAncmMtb3ZlcmZsb3cnIDogX3Byb3BzJHByZWZpeENscyxcbiAgICBfcHJvcHMkZGF0YSA9IHByb3BzLmRhdGEsXG4gICAgZGF0YSA9IF9wcm9wcyRkYXRhID09PSB2b2lkIDAgPyBbXSA6IF9wcm9wcyRkYXRhLFxuICAgIHJlbmRlckl0ZW0gPSBwcm9wcy5yZW5kZXJJdGVtLFxuICAgIHJlbmRlclJhd0l0ZW0gPSBwcm9wcy5yZW5kZXJSYXdJdGVtLFxuICAgIGl0ZW1LZXkgPSBwcm9wcy5pdGVtS2V5LFxuICAgIF9wcm9wcyRpdGVtV2lkdGggPSBwcm9wcy5pdGVtV2lkdGgsXG4gICAgaXRlbVdpZHRoID0gX3Byb3BzJGl0ZW1XaWR0aCA9PT0gdm9pZCAwID8gMTAgOiBfcHJvcHMkaXRlbVdpZHRoLFxuICAgIHNzciA9IHByb3BzLnNzcixcbiAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBtYXhDb3VudCA9IHByb3BzLm1heENvdW50LFxuICAgIHJlbmRlclJlc3QgPSBwcm9wcy5yZW5kZXJSZXN0LFxuICAgIHJlbmRlclJhd1Jlc3QgPSBwcm9wcy5yZW5kZXJSYXdSZXN0LFxuICAgIHN1ZmZpeCA9IHByb3BzLnN1ZmZpeCxcbiAgICBfcHJvcHMkY29tcG9uZW50ID0gcHJvcHMuY29tcG9uZW50LFxuICAgIENvbXBvbmVudCA9IF9wcm9wcyRjb21wb25lbnQgPT09IHZvaWQgMCA/ICdkaXYnIDogX3Byb3BzJGNvbXBvbmVudCxcbiAgICBpdGVtQ29tcG9uZW50ID0gcHJvcHMuaXRlbUNvbXBvbmVudCxcbiAgICBvblZpc2libGVDaGFuZ2UgPSBwcm9wcy5vblZpc2libGVDaGFuZ2UsXG4gICAgcmVzdFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBfZXhjbHVkZWQpO1xuICB2YXIgZnVsbHlTU1IgPSBzc3IgPT09ICdmdWxsJztcbiAgdmFyIG5vdGlmeUVmZmVjdFVwZGF0ZSA9IHVzZUJhdGNoZXIoKTtcbiAgdmFyIF91c2VFZmZlY3RTdGF0ZSA9IHVzZUVmZmVjdFN0YXRlKG5vdGlmeUVmZmVjdFVwZGF0ZSwgbnVsbCksXG4gICAgX3VzZUVmZmVjdFN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VFZmZlY3RTdGF0ZSwgMiksXG4gICAgY29udGFpbmVyV2lkdGggPSBfdXNlRWZmZWN0U3RhdGUyWzBdLFxuICAgIHNldENvbnRhaW5lcldpZHRoID0gX3VzZUVmZmVjdFN0YXRlMlsxXTtcbiAgdmFyIG1lcmdlZENvbnRhaW5lcldpZHRoID0gY29udGFpbmVyV2lkdGggfHwgMDtcbiAgdmFyIF91c2VFZmZlY3RTdGF0ZTMgPSB1c2VFZmZlY3RTdGF0ZShub3RpZnlFZmZlY3RVcGRhdGUsIG5ldyBNYXAoKSksXG4gICAgX3VzZUVmZmVjdFN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF91c2VFZmZlY3RTdGF0ZTMsIDIpLFxuICAgIGl0ZW1XaWR0aHMgPSBfdXNlRWZmZWN0U3RhdGU0WzBdLFxuICAgIHNldEl0ZW1XaWR0aHMgPSBfdXNlRWZmZWN0U3RhdGU0WzFdO1xuICB2YXIgX3VzZUVmZmVjdFN0YXRlNSA9IHVzZUVmZmVjdFN0YXRlKG5vdGlmeUVmZmVjdFVwZGF0ZSwgMCksXG4gICAgX3VzZUVmZmVjdFN0YXRlNiA9IF9zbGljZWRUb0FycmF5KF91c2VFZmZlY3RTdGF0ZTUsIDIpLFxuICAgIHByZXZSZXN0V2lkdGggPSBfdXNlRWZmZWN0U3RhdGU2WzBdLFxuICAgIHNldFByZXZSZXN0V2lkdGggPSBfdXNlRWZmZWN0U3RhdGU2WzFdO1xuICB2YXIgX3VzZUVmZmVjdFN0YXRlNyA9IHVzZUVmZmVjdFN0YXRlKG5vdGlmeUVmZmVjdFVwZGF0ZSwgMCksXG4gICAgX3VzZUVmZmVjdFN0YXRlOCA9IF9zbGljZWRUb0FycmF5KF91c2VFZmZlY3RTdGF0ZTcsIDIpLFxuICAgIHJlc3RXaWR0aCA9IF91c2VFZmZlY3RTdGF0ZThbMF0sXG4gICAgc2V0UmVzdFdpZHRoID0gX3VzZUVmZmVjdFN0YXRlOFsxXTtcbiAgdmFyIF91c2VFZmZlY3RTdGF0ZTkgPSB1c2VFZmZlY3RTdGF0ZShub3RpZnlFZmZlY3RVcGRhdGUsIDApLFxuICAgIF91c2VFZmZlY3RTdGF0ZTEwID0gX3NsaWNlZFRvQXJyYXkoX3VzZUVmZmVjdFN0YXRlOSwgMiksXG4gICAgc3VmZml4V2lkdGggPSBfdXNlRWZmZWN0U3RhdGUxMFswXSxcbiAgICBzZXRTdWZmaXhXaWR0aCA9IF91c2VFZmZlY3RTdGF0ZTEwWzFdO1xuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUobnVsbCksXG4gICAgX3VzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZSwgMiksXG4gICAgc3VmZml4Rml4ZWRTdGFydCA9IF91c2VTdGF0ZTJbMF0sXG4gICAgc2V0U3VmZml4Rml4ZWRTdGFydCA9IF91c2VTdGF0ZTJbMV07XG4gIHZhciBfdXNlU3RhdGUzID0gdXNlU3RhdGUobnVsbCksXG4gICAgX3VzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZTMsIDIpLFxuICAgIGRpc3BsYXlDb3VudCA9IF91c2VTdGF0ZTRbMF0sXG4gICAgc2V0RGlzcGxheUNvdW50ID0gX3VzZVN0YXRlNFsxXTtcbiAgdmFyIG1lcmdlZERpc3BsYXlDb3VudCA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGlmIChkaXNwbGF5Q291bnQgPT09IG51bGwgJiYgZnVsbHlTU1IpIHtcbiAgICAgIHJldHVybiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgICB9XG4gICAgcmV0dXJuIGRpc3BsYXlDb3VudCB8fCAwO1xuICB9LCBbZGlzcGxheUNvdW50LCBjb250YWluZXJXaWR0aF0pO1xuICB2YXIgX3VzZVN0YXRlNSA9IHVzZVN0YXRlKGZhbHNlKSxcbiAgICBfdXNlU3RhdGU2ID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlNSwgMiksXG4gICAgcmVzdFJlYWR5ID0gX3VzZVN0YXRlNlswXSxcbiAgICBzZXRSZXN0UmVhZHkgPSBfdXNlU3RhdGU2WzFdO1xuICB2YXIgaXRlbVByZWZpeENscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaXRlbVwiKTtcblxuICAvLyBBbHdheXMgdXNlIHRoZSBtYXggd2lkdGggdG8gYXZvaWQgYmxpbmtcbiAgdmFyIG1lcmdlZFJlc3RXaWR0aCA9IE1hdGgubWF4KHByZXZSZXN0V2lkdGgsIHJlc3RXaWR0aCk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IERhdGEgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBpc1Jlc3BvbnNpdmUgPSBtYXhDb3VudCA9PT0gUkVTUE9OU0lWRTtcbiAgdmFyIHNob3VsZFJlc3BvbnNpdmUgPSBkYXRhLmxlbmd0aCAmJiBpc1Jlc3BvbnNpdmU7XG4gIHZhciBpbnZhbGlkYXRlID0gbWF4Q291bnQgPT09IElOVkFMSURBVEU7XG5cbiAgLyoqXG4gICAqIFdoZW4gaXMgYHJlc3BvbnNpdmVgLCB3ZSB3aWxsIGFsd2F5cyByZW5kZXIgcmVzdCBub2RlIHRvIGdldCB0aGUgcmVhbCB3aWR0aCBvZiBpdCBmb3IgY2FsY3VsYXRpb25cbiAgICovXG4gIHZhciBzaG93UmVzdCA9IHNob3VsZFJlc3BvbnNpdmUgfHwgdHlwZW9mIG1heENvdW50ID09PSAnbnVtYmVyJyAmJiBkYXRhLmxlbmd0aCA+IG1heENvdW50O1xuICB2YXIgbWVyZ2VkRGF0YSA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBpdGVtcyA9IGRhdGE7XG4gICAgaWYgKHNob3VsZFJlc3BvbnNpdmUpIHtcbiAgICAgIGlmIChjb250YWluZXJXaWR0aCA9PT0gbnVsbCAmJiBmdWxseVNTUikge1xuICAgICAgICBpdGVtcyA9IGRhdGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpdGVtcyA9IGRhdGEuc2xpY2UoMCwgTWF0aC5taW4oZGF0YS5sZW5ndGgsIG1lcmdlZENvbnRhaW5lcldpZHRoIC8gaXRlbVdpZHRoKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbWF4Q291bnQgPT09ICdudW1iZXInKSB7XG4gICAgICBpdGVtcyA9IGRhdGEuc2xpY2UoMCwgbWF4Q291bnQpO1xuICAgIH1cbiAgICByZXR1cm4gaXRlbXM7XG4gIH0sIFtkYXRhLCBpdGVtV2lkdGgsIGNvbnRhaW5lcldpZHRoLCBtYXhDb3VudCwgc2hvdWxkUmVzcG9uc2l2ZV0pO1xuICB2YXIgb21pdHRlZEl0ZW1zID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHNob3VsZFJlc3BvbnNpdmUpIHtcbiAgICAgIHJldHVybiBkYXRhLnNsaWNlKG1lcmdlZERpc3BsYXlDb3VudCArIDEpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YS5zbGljZShtZXJnZWREYXRhLmxlbmd0aCk7XG4gIH0sIFtkYXRhLCBtZXJnZWREYXRhLCBzaG91bGRSZXNwb25zaXZlLCBtZXJnZWREaXNwbGF5Q291bnRdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSXRlbSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGdldEtleSA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uIChpdGVtLCBpbmRleCkge1xuICAgIHZhciBfcmVmO1xuICAgIGlmICh0eXBlb2YgaXRlbUtleSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGl0ZW1LZXkoaXRlbSk7XG4gICAgfVxuICAgIHJldHVybiAoX3JlZiA9IGl0ZW1LZXkgJiYgKGl0ZW0gPT09IG51bGwgfHwgaXRlbSA9PT0gdm9pZCAwID8gdm9pZCAwIDogaXRlbVtpdGVtS2V5XSkpICE9PSBudWxsICYmIF9yZWYgIT09IHZvaWQgMCA/IF9yZWYgOiBpbmRleDtcbiAgfSwgW2l0ZW1LZXldKTtcbiAgdmFyIG1lcmdlZFJlbmRlckl0ZW0gPSB1c2VDYWxsYmFjayhyZW5kZXJJdGVtIHx8IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgcmV0dXJuIGl0ZW07XG4gIH0sIFtyZW5kZXJJdGVtXSk7XG4gIGZ1bmN0aW9uIHVwZGF0ZURpc3BsYXlDb3VudChjb3VudCwgc3VmZml4Rml4ZWRTdGFydFZhbCwgbm90UmVhZHkpIHtcbiAgICAvLyBSZWFjdCAxOCB3aWxsIHN5bmMgcmVuZGVyIGV2ZW4gd2hlbiB0aGUgdmFsdWUgaXMgc2FtZSBpbiBzb21lIGNhc2UuXG4gICAgLy8gV2UgdGFrZSBgbWVyZ2VkRGF0YWAgYXMgZGVwcyB3aGljaCBtYXkgY2F1c2UgZGVhZCBsb29wIGlmIGl0J3MgZHluYW1pYyBnZW5lcmF0ZS5cbiAgICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzM2NTU5XG4gICAgaWYgKGRpc3BsYXlDb3VudCA9PT0gY291bnQgJiYgKHN1ZmZpeEZpeGVkU3RhcnRWYWwgPT09IHVuZGVmaW5lZCB8fCBzdWZmaXhGaXhlZFN0YXJ0VmFsID09PSBzdWZmaXhGaXhlZFN0YXJ0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZXREaXNwbGF5Q291bnQoY291bnQpO1xuICAgIGlmICghbm90UmVhZHkpIHtcbiAgICAgIHNldFJlc3RSZWFkeShjb3VudCA8IGRhdGEubGVuZ3RoIC0gMSk7XG4gICAgICBvblZpc2libGVDaGFuZ2UgPT09IG51bGwgfHwgb25WaXNpYmxlQ2hhbmdlID09PSB2b2lkIDAgfHwgb25WaXNpYmxlQ2hhbmdlKGNvdW50KTtcbiAgICB9XG4gICAgaWYgKHN1ZmZpeEZpeGVkU3RhcnRWYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2V0U3VmZml4Rml4ZWRTdGFydChzdWZmaXhGaXhlZFN0YXJ0VmFsKTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU2l6ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgZnVuY3Rpb24gb25PdmVyZmxvd1Jlc2l6ZShfLCBlbGVtZW50KSB7XG4gICAgc2V0Q29udGFpbmVyV2lkdGgoZWxlbWVudC5jbGllbnRXaWR0aCk7XG4gIH1cbiAgZnVuY3Rpb24gcmVnaXN0ZXJTaXplKGtleSwgd2lkdGgpIHtcbiAgICBzZXRJdGVtV2lkdGhzKGZ1bmN0aW9uIChvcmlnaW4pIHtcbiAgICAgIHZhciBjbG9uZSA9IG5ldyBNYXAob3JpZ2luKTtcbiAgICAgIGlmICh3aWR0aCA9PT0gbnVsbCkge1xuICAgICAgICBjbG9uZS5kZWxldGUoa2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNsb25lLnNldChrZXksIHdpZHRoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiByZWdpc3Rlck92ZXJmbG93U2l6ZShfLCB3aWR0aCkge1xuICAgIHNldFJlc3RXaWR0aCh3aWR0aCk7XG4gICAgc2V0UHJldlJlc3RXaWR0aChyZXN0V2lkdGgpO1xuICB9XG4gIGZ1bmN0aW9uIHJlZ2lzdGVyU3VmZml4U2l6ZShfLCB3aWR0aCkge1xuICAgIHNldFN1ZmZpeFdpZHRoKHdpZHRoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEVmZmVjdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBmdW5jdGlvbiBnZXRJdGVtV2lkdGgoaW5kZXgpIHtcbiAgICByZXR1cm4gaXRlbVdpZHRocy5nZXQoZ2V0S2V5KG1lcmdlZERhdGFbaW5kZXhdLCBpbmRleCkpO1xuICB9XG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKG1lcmdlZENvbnRhaW5lcldpZHRoICYmIHR5cGVvZiBtZXJnZWRSZXN0V2lkdGggPT09ICdudW1iZXInICYmIG1lcmdlZERhdGEpIHtcbiAgICAgIHZhciB0b3RhbFdpZHRoID0gc3VmZml4V2lkdGg7XG4gICAgICB2YXIgbGVuID0gbWVyZ2VkRGF0YS5sZW5ndGg7XG4gICAgICB2YXIgbGFzdEluZGV4ID0gbGVuIC0gMTtcblxuICAgICAgLy8gV2hlbiBkYXRhIGNvdW50IGNoYW5nZSB0byAwLCByZXNldCB0aGlzIHNpbmNlIG5vdCBsb29wIHdpbGwgcmVhY2hcbiAgICAgIGlmICghbGVuKSB7XG4gICAgICAgIHVwZGF0ZURpc3BsYXlDb3VudCgwLCBudWxsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICB2YXIgY3VycmVudEl0ZW1XaWR0aCA9IGdldEl0ZW1XaWR0aChpKTtcblxuICAgICAgICAvLyBGdWxseSB3aWxsIGFsd2F5cyByZW5kZXJcbiAgICAgICAgaWYgKGZ1bGx5U1NSKSB7XG4gICAgICAgICAgY3VycmVudEl0ZW1XaWR0aCA9IGN1cnJlbnRJdGVtV2lkdGggfHwgMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJyZWFrIHNpbmNlIGRhdGEgbm90IHJlYWR5XG4gICAgICAgIGlmIChjdXJyZW50SXRlbVdpZHRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB1cGRhdGVEaXNwbGF5Q291bnQoaSAtIDEsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGaW5kIGJlc3QgbWF0Y2hcbiAgICAgICAgdG90YWxXaWR0aCArPSBjdXJyZW50SXRlbVdpZHRoO1xuICAgICAgICBpZiAoXG4gICAgICAgIC8vIE9ubHkgb25lIG1lYW5zIGB0b3RhbFdpZHRoYCBpcyB0aGUgZmluYWwgd2lkdGhcbiAgICAgICAgbGFzdEluZGV4ID09PSAwICYmIHRvdGFsV2lkdGggPD0gbWVyZ2VkQ29udGFpbmVyV2lkdGggfHxcbiAgICAgICAgLy8gTGFzdCB0d28gd2lkdGggd2lsbCBiZSB0aGUgZmluYWwgd2lkdGhcbiAgICAgICAgaSA9PT0gbGFzdEluZGV4IC0gMSAmJiB0b3RhbFdpZHRoICsgZ2V0SXRlbVdpZHRoKGxhc3RJbmRleCkgPD0gbWVyZ2VkQ29udGFpbmVyV2lkdGgpIHtcbiAgICAgICAgICAvLyBBZGRpdGlvbmFsIGNoZWNrIGlmIG1hdGNoIHRoZSBlbmRcbiAgICAgICAgICB1cGRhdGVEaXNwbGF5Q291bnQobGFzdEluZGV4LCBudWxsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIGlmICh0b3RhbFdpZHRoICsgbWVyZ2VkUmVzdFdpZHRoID4gbWVyZ2VkQ29udGFpbmVyV2lkdGgpIHtcbiAgICAgICAgICAvLyBDYW4gbm90IGhvbGQgYWxsIHRoZSBjb250ZW50IHRvIHNob3cgcmVzdFxuICAgICAgICAgIHVwZGF0ZURpc3BsYXlDb3VudChpIC0gMSwgdG90YWxXaWR0aCAtIGN1cnJlbnRJdGVtV2lkdGggLSBzdWZmaXhXaWR0aCArIHJlc3RXaWR0aCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzdWZmaXggJiYgZ2V0SXRlbVdpZHRoKDApICsgc3VmZml4V2lkdGggPiBtZXJnZWRDb250YWluZXJXaWR0aCkge1xuICAgICAgICBzZXRTdWZmaXhGaXhlZFN0YXJ0KG51bGwpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgW21lcmdlZENvbnRhaW5lcldpZHRoLCBpdGVtV2lkdGhzLCByZXN0V2lkdGgsIHN1ZmZpeFdpZHRoLCBnZXRLZXksIG1lcmdlZERhdGFdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGRpc3BsYXlSZXN0ID0gcmVzdFJlYWR5ICYmICEhb21pdHRlZEl0ZW1zLmxlbmd0aDtcbiAgdmFyIHN1ZmZpeFN0eWxlID0ge307XG4gIGlmIChzdWZmaXhGaXhlZFN0YXJ0ICE9PSBudWxsICYmIHNob3VsZFJlc3BvbnNpdmUpIHtcbiAgICBzdWZmaXhTdHlsZSA9IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgbGVmdDogc3VmZml4Rml4ZWRTdGFydCxcbiAgICAgIHRvcDogMFxuICAgIH07XG4gIH1cbiAgdmFyIGl0ZW1TaGFyZWRQcm9wcyA9IHtcbiAgICBwcmVmaXhDbHM6IGl0ZW1QcmVmaXhDbHMsXG4gICAgcmVzcG9uc2l2ZTogc2hvdWxkUmVzcG9uc2l2ZSxcbiAgICBjb21wb25lbnQ6IGl0ZW1Db21wb25lbnQsXG4gICAgaW52YWxpZGF0ZTogaW52YWxpZGF0ZVxuICB9O1xuXG4gIC8vID4+Pj4+IENob2ljZSByZW5kZXIgZnVuIGJ5IGByZW5kZXJSYXdJdGVtYFxuICB2YXIgaW50ZXJuYWxSZW5kZXJJdGVtTm9kZSA9IHJlbmRlclJhd0l0ZW0gPyBmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHtcbiAgICB2YXIga2V5ID0gZ2V0S2V5KGl0ZW0sIGluZGV4KTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoT3ZlcmZsb3dDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgICBrZXk6IGtleSxcbiAgICAgIHZhbHVlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGl0ZW1TaGFyZWRQcm9wcyksIHt9LCB7XG4gICAgICAgIG9yZGVyOiBpbmRleCxcbiAgICAgICAgaXRlbTogaXRlbSxcbiAgICAgICAgaXRlbUtleToga2V5LFxuICAgICAgICByZWdpc3RlclNpemU6IHJlZ2lzdGVyU2l6ZSxcbiAgICAgICAgZGlzcGxheTogaW5kZXggPD0gbWVyZ2VkRGlzcGxheUNvdW50XG4gICAgICB9KVxuICAgIH0sIHJlbmRlclJhd0l0ZW0oaXRlbSwgaW5kZXgpKTtcbiAgfSA6IGZ1bmN0aW9uIChpdGVtLCBpbmRleCkge1xuICAgIHZhciBrZXkgPSBnZXRLZXkoaXRlbSwgaW5kZXgpO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJdGVtLCBfZXh0ZW5kcyh7fSwgaXRlbVNoYXJlZFByb3BzLCB7XG4gICAgICBvcmRlcjogaW5kZXgsXG4gICAgICBrZXk6IGtleSxcbiAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICByZW5kZXJJdGVtOiBtZXJnZWRSZW5kZXJJdGVtLFxuICAgICAgaXRlbUtleToga2V5LFxuICAgICAgcmVnaXN0ZXJTaXplOiByZWdpc3RlclNpemUsXG4gICAgICBkaXNwbGF5OiBpbmRleCA8PSBtZXJnZWREaXNwbGF5Q291bnRcbiAgICB9KSk7XG4gIH07XG5cbiAgLy8gPj4+Pj4gUmVzdCBub2RlXG4gIHZhciByZXN0Q29udGV4dFByb3BzID0ge1xuICAgIG9yZGVyOiBkaXNwbGF5UmVzdCA/IG1lcmdlZERpc3BsYXlDb3VudCA6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQoaXRlbVByZWZpeENscywgXCItcmVzdFwiKSxcbiAgICByZWdpc3RlclNpemU6IHJlZ2lzdGVyT3ZlcmZsb3dTaXplLFxuICAgIGRpc3BsYXk6IGRpc3BsYXlSZXN0XG4gIH07XG4gIHZhciBtZXJnZWRSZW5kZXJSZXN0ID0gcmVuZGVyUmVzdCB8fCBkZWZhdWx0UmVuZGVyUmVzdDtcbiAgdmFyIHJlc3ROb2RlID0gcmVuZGVyUmF3UmVzdCA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE92ZXJmbG93Q29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGl0ZW1TaGFyZWRQcm9wcyksIHJlc3RDb250ZXh0UHJvcHMpXG4gIH0sIHJlbmRlclJhd1Jlc3Qob21pdHRlZEl0ZW1zKSkgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJdGVtLCBfZXh0ZW5kcyh7fSwgaXRlbVNoYXJlZFByb3BzLCByZXN0Q29udGV4dFByb3BzKSwgdHlwZW9mIG1lcmdlZFJlbmRlclJlc3QgPT09ICdmdW5jdGlvbicgPyBtZXJnZWRSZW5kZXJSZXN0KG9taXR0ZWRJdGVtcykgOiBtZXJnZWRSZW5kZXJSZXN0KTtcbiAgdmFyIG92ZXJmbG93Tm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyghaW52YWxpZGF0ZSAmJiBwcmVmaXhDbHMsIGNsYXNzTmFtZSksXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIHJlZjogcmVmXG4gIH0sIHJlc3RQcm9wcyksIG1lcmdlZERhdGEubWFwKGludGVybmFsUmVuZGVySXRlbU5vZGUpLCBzaG93UmVzdCA/IHJlc3ROb2RlIDogbnVsbCwgc3VmZml4ICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEl0ZW0sIF9leHRlbmRzKHt9LCBpdGVtU2hhcmVkUHJvcHMsIHtcbiAgICByZXNwb25zaXZlOiBpc1Jlc3BvbnNpdmUsXG4gICAgcmVzcG9uc2l2ZURpc2FibGVkOiAhc2hvdWxkUmVzcG9uc2l2ZSxcbiAgICBvcmRlcjogbWVyZ2VkRGlzcGxheUNvdW50LFxuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQoaXRlbVByZWZpeENscywgXCItc3VmZml4XCIpLFxuICAgIHJlZ2lzdGVyU2l6ZTogcmVnaXN0ZXJTdWZmaXhTaXplLFxuICAgIGRpc3BsYXk6IHRydWUsXG4gICAgc3R5bGU6IHN1ZmZpeFN0eWxlXG4gIH0pLCBzdWZmaXgpKTtcbiAgcmV0dXJuIGlzUmVzcG9uc2l2ZSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlc2l6ZU9ic2VydmVyLCB7XG4gICAgb25SZXNpemU6IG9uT3ZlcmZsb3dSZXNpemUsXG4gICAgZGlzYWJsZWQ6ICFzaG91bGRSZXNwb25zaXZlXG4gIH0sIG92ZXJmbG93Tm9kZSkgOiBvdmVyZmxvd05vZGU7XG59XG52YXIgRm9yd2FyZE92ZXJmbG93ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoT3ZlcmZsb3cpO1xuRm9yd2FyZE92ZXJmbG93LmRpc3BsYXlOYW1lID0gJ092ZXJmbG93JztcbkZvcndhcmRPdmVyZmxvdy5JdGVtID0gUmF3SXRlbTtcbkZvcndhcmRPdmVyZmxvdy5SRVNQT05TSVZFID0gUkVTUE9OU0lWRTtcbkZvcndhcmRPdmVyZmxvdy5JTlZBTElEQVRFID0gSU5WQUxJREFURTtcblxuLy8gQ29udmVydCB0byBnZW5lcmljIHR5cGVcbmV4cG9ydCBkZWZhdWx0IEZvcndhcmRPdmVyZmxvdzsiLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJwcmVmaXhDbHNcIiwgXCJpbnZhbGlkYXRlXCIsIFwiaXRlbVwiLCBcInJlbmRlckl0ZW1cIiwgXCJyZXNwb25zaXZlXCIsIFwicmVzcG9uc2l2ZURpc2FibGVkXCIsIFwicmVnaXN0ZXJTaXplXCIsIFwiaXRlbUtleVwiLCBcImNsYXNzTmFtZVwiLCBcInN0eWxlXCIsIFwiY2hpbGRyZW5cIiwgXCJkaXNwbGF5XCIsIFwib3JkZXJcIiwgXCJjb21wb25lbnRcIl07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBSZXNpemVPYnNlcnZlciBmcm9tICdyYy1yZXNpemUtb2JzZXJ2ZXInO1xuLy8gVXNlIHNoYXJlZCB2YXJpYWJsZSB0byBzYXZlIGJ1bmRsZSBzaXplXG52YXIgVU5ERUZJTkVEID0gdW5kZWZpbmVkO1xuZnVuY3Rpb24gSW50ZXJuYWxJdGVtKHByb3BzLCByZWYpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBpbnZhbGlkYXRlID0gcHJvcHMuaW52YWxpZGF0ZSxcbiAgICBpdGVtID0gcHJvcHMuaXRlbSxcbiAgICByZW5kZXJJdGVtID0gcHJvcHMucmVuZGVySXRlbSxcbiAgICByZXNwb25zaXZlID0gcHJvcHMucmVzcG9uc2l2ZSxcbiAgICByZXNwb25zaXZlRGlzYWJsZWQgPSBwcm9wcy5yZXNwb25zaXZlRGlzYWJsZWQsXG4gICAgcmVnaXN0ZXJTaXplID0gcHJvcHMucmVnaXN0ZXJTaXplLFxuICAgIGl0ZW1LZXkgPSBwcm9wcy5pdGVtS2V5LFxuICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgZGlzcGxheSA9IHByb3BzLmRpc3BsYXksXG4gICAgb3JkZXIgPSBwcm9wcy5vcmRlcixcbiAgICBfcHJvcHMkY29tcG9uZW50ID0gcHJvcHMuY29tcG9uZW50LFxuICAgIENvbXBvbmVudCA9IF9wcm9wcyRjb21wb25lbnQgPT09IHZvaWQgMCA/ICdkaXYnIDogX3Byb3BzJGNvbXBvbmVudCxcbiAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIF9leGNsdWRlZCk7XG4gIHZhciBtZXJnZWRIaWRkZW4gPSByZXNwb25zaXZlICYmICFkaXNwbGF5O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEVmZmVjdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBmdW5jdGlvbiBpbnRlcm5hbFJlZ2lzdGVyU2l6ZSh3aWR0aCkge1xuICAgIHJlZ2lzdGVyU2l6ZShpdGVtS2V5LCB3aWR0aCk7XG4gIH1cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgaW50ZXJuYWxSZWdpc3RlclNpemUobnVsbCk7XG4gICAgfTtcbiAgfSwgW10pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgY2hpbGROb2RlID0gcmVuZGVySXRlbSAmJiBpdGVtICE9PSBVTkRFRklORUQgPyByZW5kZXJJdGVtKGl0ZW0sIHtcbiAgICBpbmRleDogb3JkZXJcbiAgfSkgOiBjaGlsZHJlbjtcbiAgdmFyIG92ZXJmbG93U3R5bGU7XG4gIGlmICghaW52YWxpZGF0ZSkge1xuICAgIG92ZXJmbG93U3R5bGUgPSB7XG4gICAgICBvcGFjaXR5OiBtZXJnZWRIaWRkZW4gPyAwIDogMSxcbiAgICAgIGhlaWdodDogbWVyZ2VkSGlkZGVuID8gMCA6IFVOREVGSU5FRCxcbiAgICAgIG92ZXJmbG93WTogbWVyZ2VkSGlkZGVuID8gJ2hpZGRlbicgOiBVTkRFRklORUQsXG4gICAgICBvcmRlcjogcmVzcG9uc2l2ZSA/IG9yZGVyIDogVU5ERUZJTkVELFxuICAgICAgcG9pbnRlckV2ZW50czogbWVyZ2VkSGlkZGVuID8gJ25vbmUnIDogVU5ERUZJTkVELFxuICAgICAgcG9zaXRpb246IG1lcmdlZEhpZGRlbiA/ICdhYnNvbHV0ZScgOiBVTkRFRklORURcbiAgICB9O1xuICB9XG4gIHZhciBvdmVyZmxvd1Byb3BzID0ge307XG4gIGlmIChtZXJnZWRIaWRkZW4pIHtcbiAgICBvdmVyZmxvd1Byb3BzWydhcmlhLWhpZGRlbiddID0gdHJ1ZTtcbiAgfVxuICB2YXIgaXRlbU5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb25lbnQsIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoIWludmFsaWRhdGUgJiYgcHJlZml4Q2xzLCBjbGFzc05hbWUpLFxuICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG92ZXJmbG93U3R5bGUpLCBzdHlsZSlcbiAgfSwgb3ZlcmZsb3dQcm9wcywgcmVzdFByb3BzLCB7XG4gICAgcmVmOiByZWZcbiAgfSksIGNoaWxkTm9kZSk7XG4gIGlmIChyZXNwb25zaXZlKSB7XG4gICAgaXRlbU5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZXNpemVPYnNlcnZlciwge1xuICAgICAgb25SZXNpemU6IGZ1bmN0aW9uIG9uUmVzaXplKF9yZWYpIHtcbiAgICAgICAgdmFyIG9mZnNldFdpZHRoID0gX3JlZi5vZmZzZXRXaWR0aDtcbiAgICAgICAgaW50ZXJuYWxSZWdpc3RlclNpemUob2Zmc2V0V2lkdGgpO1xuICAgICAgfSxcbiAgICAgIGRpc2FibGVkOiByZXNwb25zaXZlRGlzYWJsZWRcbiAgICB9LCBpdGVtTm9kZSk7XG4gIH1cbiAgcmV0dXJuIGl0ZW1Ob2RlO1xufVxudmFyIEl0ZW0gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihJbnRlcm5hbEl0ZW0pO1xuSXRlbS5kaXNwbGF5TmFtZSA9ICdJdGVtJztcbmV4cG9ydCBkZWZhdWx0IEl0ZW07IiwgImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IHVzZUV2ZW50IGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZUV2ZW50XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyB9IGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgY2hhbm5lbFVwZGF0ZSBmcm9tIFwiLi9jaGFubmVsVXBkYXRlXCI7XG4vKipcbiAqIEJhdGNoZXIgZm9yIHJlY29yZCBhbnkgYHVzZUVmZmVjdFN0YXRlYCBuZWVkIHVwZGF0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUJhdGNoZXIoKSB7XG4gIC8vIFVwZGF0ZXIgVHJpZ2dlclxuICB2YXIgdXBkYXRlRnVuY1JlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcblxuICAvLyBOb3RpZnkgdXBkYXRlXG4gIHZhciBub3RpZnlFZmZlY3RVcGRhdGUgPSBmdW5jdGlvbiBub3RpZnlFZmZlY3RVcGRhdGUoY2FsbGJhY2spIHtcbiAgICBpZiAoIXVwZGF0ZUZ1bmNSZWYuY3VycmVudCkge1xuICAgICAgdXBkYXRlRnVuY1JlZi5jdXJyZW50ID0gW107XG4gICAgICBjaGFubmVsVXBkYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHVwZGF0ZUZ1bmNSZWYuY3VycmVudC5mb3JFYWNoKGZ1bmN0aW9uIChmbikge1xuICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB1cGRhdGVGdW5jUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB1cGRhdGVGdW5jUmVmLmN1cnJlbnQucHVzaChjYWxsYmFjayk7XG4gIH07XG4gIHJldHVybiBub3RpZnlFZmZlY3RVcGRhdGU7XG59XG5cbi8qKlxuICogVHJpZ2dlciBzdGF0ZSB1cGRhdGUgYnkgYHVzZUxheW91dEVmZmVjdGAgdG8gc2F2ZSBwZXJmLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VFZmZlY3RTdGF0ZShub3RpZnlFZmZlY3RVcGRhdGUsIGRlZmF1bHRWYWx1ZSkge1xuICAvLyBWYWx1ZVxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZGVmYXVsdFZhbHVlKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBzdGF0ZVZhbHVlID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXRTdGF0ZVZhbHVlID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcblxuICAvLyBTZXQgU3RhdGVcbiAgdmFyIHNldEVmZmVjdFZhbCA9IHVzZUV2ZW50KGZ1bmN0aW9uIChuZXh0VmFsdWUpIHtcbiAgICBub3RpZnlFZmZlY3RVcGRhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgc2V0U3RhdGVWYWx1ZShuZXh0VmFsdWUpO1xuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIFtzdGF0ZVZhbHVlLCBzZXRFZmZlY3RWYWxdO1xufSIsICJpbXBvcnQgcmFmIGZyb20gXCJyYy11dGlsL2VzL3JhZlwiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY2hhbm5lbFVwZGF0ZShjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIE1lc3NhZ2VDaGFubmVsID09PSAndW5kZWZpbmVkJykge1xuICAgIHJhZihjYWxsYmFjayk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH07XG4gICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZSh1bmRlZmluZWQpO1xuICB9XG59IiwgImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJjb21wb25lbnRcIl0sXG4gIF9leGNsdWRlZDIgPSBbXCJjbGFzc05hbWVcIl0sXG4gIF9leGNsdWRlZDMgPSBbXCJjbGFzc05hbWVcIl07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBJdGVtIGZyb20gXCIuL0l0ZW1cIjtcbmltcG9ydCB7IE92ZXJmbG93Q29udGV4dCB9IGZyb20gXCIuL2NvbnRleHRcIjtcbnZhciBJbnRlcm5hbFJhd0l0ZW0gPSBmdW5jdGlvbiBJbnRlcm5hbFJhd0l0ZW0ocHJvcHMsIHJlZikge1xuICB2YXIgY29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoT3ZlcmZsb3dDb250ZXh0KTtcblxuICAvLyBSZW5kZXIgZGlyZWN0bHkgd2hlbiBjb250ZXh0IG5vdCBwcm92aWRlZFxuICBpZiAoIWNvbnRleHQpIHtcbiAgICB2YXIgX3Byb3BzJGNvbXBvbmVudCA9IHByb3BzLmNvbXBvbmVudCxcbiAgICAgIENvbXBvbmVudCA9IF9wcm9wcyRjb21wb25lbnQgPT09IHZvaWQgMCA/ICdkaXYnIDogX3Byb3BzJGNvbXBvbmVudCxcbiAgICAgIF9yZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIF9leGNsdWRlZCk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgX2V4dGVuZHMoe30sIF9yZXN0UHJvcHMsIHtcbiAgICAgIHJlZjogcmVmXG4gICAgfSkpO1xuICB9XG4gIHZhciBjb250ZXh0Q2xhc3NOYW1lID0gY29udGV4dC5jbGFzc05hbWUsXG4gICAgcmVzdENvbnRleHQgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoY29udGV4dCwgX2V4Y2x1ZGVkMik7XG4gIHZhciBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgcmVzdFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBfZXhjbHVkZWQzKTtcblxuICAvLyBEbyBub3QgcGFzcyBjb250ZXh0IHRvIHN1YiBpdGVtIHRvIGF2b2lkIG11bHRpcGxlIG1lYXN1cmVcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE92ZXJmbG93Q29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBudWxsXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEl0ZW0sIF9leHRlbmRzKHtcbiAgICByZWY6IHJlZixcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY29udGV4dENsYXNzTmFtZSwgY2xhc3NOYW1lKVxuICB9LCByZXN0Q29udGV4dCwgcmVzdFByb3BzKSkpO1xufTtcbnZhciBSYXdJdGVtID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoSW50ZXJuYWxSYXdJdGVtKTtcblJhd0l0ZW0uZGlzcGxheU5hbWUgPSAnUmF3SXRlbSc7XG5leHBvcnQgZGVmYXVsdCBSYXdJdGVtOyIsICJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuZXhwb3J0IHZhciBPdmVyZmxvd0NvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTsiLCAiaW1wb3J0IE92ZXJmbG93IGZyb20gXCIuL092ZXJmbG93XCI7XG5leHBvcnQgZGVmYXVsdCBPdmVyZmxvdzsiLCAiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgY29tcG9zZVJlZiB9IGZyb20gXCJyYy11dGlsL2VzL3JlZlwiO1xuaW1wb3J0IHsgd2FybmluZyB9IGZyb20gXCJyYy11dGlsL2VzL3dhcm5pbmdcIjtcbnZhciBJbnB1dCA9IGZ1bmN0aW9uIElucHV0KHByb3BzLCByZWYpIHtcbiAgdmFyIF9pbnB1dE5vZGUyO1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIGlkID0gcHJvcHMuaWQsXG4gICAgaW5wdXRFbGVtZW50ID0gcHJvcHMuaW5wdXRFbGVtZW50LFxuICAgIGRpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgdGFiSW5kZXggPSBwcm9wcy50YWJJbmRleCxcbiAgICBhdXRvRm9jdXMgPSBwcm9wcy5hdXRvRm9jdXMsXG4gICAgYXV0b0NvbXBsZXRlID0gcHJvcHMuYXV0b0NvbXBsZXRlLFxuICAgIGVkaXRhYmxlID0gcHJvcHMuZWRpdGFibGUsXG4gICAgYWN0aXZlRGVzY2VuZGFudElkID0gcHJvcHMuYWN0aXZlRGVzY2VuZGFudElkLFxuICAgIHZhbHVlID0gcHJvcHMudmFsdWUsXG4gICAgbWF4TGVuZ3RoID0gcHJvcHMubWF4TGVuZ3RoLFxuICAgIF9vbktleURvd24gPSBwcm9wcy5vbktleURvd24sXG4gICAgX29uTW91c2VEb3duID0gcHJvcHMub25Nb3VzZURvd24sXG4gICAgX29uQ2hhbmdlID0gcHJvcHMub25DaGFuZ2UsXG4gICAgb25QYXN0ZSA9IHByb3BzLm9uUGFzdGUsXG4gICAgX29uQ29tcG9zaXRpb25TdGFydCA9IHByb3BzLm9uQ29tcG9zaXRpb25TdGFydCxcbiAgICBfb25Db21wb3NpdGlvbkVuZCA9IHByb3BzLm9uQ29tcG9zaXRpb25FbmQsXG4gICAgX29uQmx1ciA9IHByb3BzLm9uQmx1cixcbiAgICBvcGVuID0gcHJvcHMub3BlbixcbiAgICBhdHRycyA9IHByb3BzLmF0dHJzO1xuICB2YXIgaW5wdXROb2RlID0gaW5wdXRFbGVtZW50IHx8IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwgbnVsbCk7XG4gIHZhciBfaW5wdXROb2RlID0gaW5wdXROb2RlLFxuICAgIG9yaWdpblJlZiA9IF9pbnB1dE5vZGUucmVmLFxuICAgIG9yaWdpblByb3BzID0gX2lucHV0Tm9kZS5wcm9wcztcbiAgdmFyIG9uT3JpZ2luS2V5RG93biA9IG9yaWdpblByb3BzLm9uS2V5RG93bixcbiAgICBvbk9yaWdpbkNoYW5nZSA9IG9yaWdpblByb3BzLm9uQ2hhbmdlLFxuICAgIG9uT3JpZ2luTW91c2VEb3duID0gb3JpZ2luUHJvcHMub25Nb3VzZURvd24sXG4gICAgb25PcmlnaW5Db21wb3NpdGlvblN0YXJ0ID0gb3JpZ2luUHJvcHMub25Db21wb3NpdGlvblN0YXJ0LFxuICAgIG9uT3JpZ2luQ29tcG9zaXRpb25FbmQgPSBvcmlnaW5Qcm9wcy5vbkNvbXBvc2l0aW9uRW5kLFxuICAgIG9uT3JpZ2luQmx1ciA9IG9yaWdpblByb3BzLm9uQmx1cixcbiAgICBzdHlsZSA9IG9yaWdpblByb3BzLnN0eWxlO1xuICB3YXJuaW5nKCEoJ21heExlbmd0aCcgaW4gaW5wdXROb2RlLnByb3BzKSwgXCJQYXNzaW5nICdtYXhMZW5ndGgnIHRvIGlucHV0IGVsZW1lbnQgZGlyZWN0bHkgbWF5IG5vdCB3b3JrIGJlY2F1c2UgaW5wdXQgaW4gQmFzZVNlbGVjdCBpcyBjb250cm9sbGVkLlwiKTtcbiAgaW5wdXROb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChpbnB1dE5vZGUsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHtcbiAgICB0eXBlOiAnc2VhcmNoJ1xuICB9LCBvcmlnaW5Qcm9wcyksIHt9LCB7XG4gICAgLy8gT3ZlcnJpZGUgb3ZlciBvcmlnaW4gcHJvcHNcbiAgICBpZDogaWQsXG4gICAgcmVmOiBjb21wb3NlUmVmKHJlZiwgb3JpZ2luUmVmKSxcbiAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgdGFiSW5kZXg6IHRhYkluZGV4LFxuICAgIGF1dG9Db21wbGV0ZTogYXV0b0NvbXBsZXRlIHx8ICdvZmYnLFxuICAgIGF1dG9Gb2N1czogYXV0b0ZvY3VzLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNlbGVjdGlvbi1zZWFyY2gtaW5wdXRcIiksIChfaW5wdXROb2RlMiA9IGlucHV0Tm9kZSkgPT09IG51bGwgfHwgX2lucHV0Tm9kZTIgPT09IHZvaWQgMCB8fCAoX2lucHV0Tm9kZTIgPSBfaW5wdXROb2RlMi5wcm9wcykgPT09IG51bGwgfHwgX2lucHV0Tm9kZTIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9pbnB1dE5vZGUyLmNsYXNzTmFtZSksXG4gICAgcm9sZTogJ2NvbWJvYm94JyxcbiAgICAnYXJpYS1leHBhbmRlZCc6IG9wZW4gfHwgZmFsc2UsXG4gICAgJ2FyaWEtaGFzcG9wdXAnOiAnbGlzdGJveCcsXG4gICAgJ2FyaWEtb3ducyc6IFwiXCIuY29uY2F0KGlkLCBcIl9saXN0XCIpLFxuICAgICdhcmlhLWF1dG9jb21wbGV0ZSc6ICdsaXN0JyxcbiAgICAnYXJpYS1jb250cm9scyc6IFwiXCIuY29uY2F0KGlkLCBcIl9saXN0XCIpLFxuICAgICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnOiBvcGVuID8gYWN0aXZlRGVzY2VuZGFudElkIDogdW5kZWZpbmVkXG4gIH0sIGF0dHJzKSwge30sIHtcbiAgICB2YWx1ZTogZWRpdGFibGUgPyB2YWx1ZSA6ICcnLFxuICAgIG1heExlbmd0aDogbWF4TGVuZ3RoLFxuICAgIHJlYWRPbmx5OiAhZWRpdGFibGUsXG4gICAgdW5zZWxlY3RhYmxlOiAhZWRpdGFibGUgPyAnb24nIDogbnVsbCxcbiAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICBvcGFjaXR5OiBlZGl0YWJsZSA/IG51bGwgOiAwXG4gICAgfSksXG4gICAgb25LZXlEb3duOiBmdW5jdGlvbiBvbktleURvd24oZXZlbnQpIHtcbiAgICAgIF9vbktleURvd24oZXZlbnQpO1xuICAgICAgaWYgKG9uT3JpZ2luS2V5RG93bikge1xuICAgICAgICBvbk9yaWdpbktleURvd24oZXZlbnQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgb25Nb3VzZURvd246IGZ1bmN0aW9uIG9uTW91c2VEb3duKGV2ZW50KSB7XG4gICAgICBfb25Nb3VzZURvd24oZXZlbnQpO1xuICAgICAgaWYgKG9uT3JpZ2luTW91c2VEb3duKSB7XG4gICAgICAgIG9uT3JpZ2luTW91c2VEb3duKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9uQ2hhbmdlOiBmdW5jdGlvbiBvbkNoYW5nZShldmVudCkge1xuICAgICAgX29uQ2hhbmdlKGV2ZW50KTtcbiAgICAgIGlmIChvbk9yaWdpbkNoYW5nZSkge1xuICAgICAgICBvbk9yaWdpbkNoYW5nZShldmVudCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBvbkNvbXBvc2l0aW9uU3RhcnQ6IGZ1bmN0aW9uIG9uQ29tcG9zaXRpb25TdGFydChldmVudCkge1xuICAgICAgX29uQ29tcG9zaXRpb25TdGFydChldmVudCk7XG4gICAgICBpZiAob25PcmlnaW5Db21wb3NpdGlvblN0YXJ0KSB7XG4gICAgICAgIG9uT3JpZ2luQ29tcG9zaXRpb25TdGFydChldmVudCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBvbkNvbXBvc2l0aW9uRW5kOiBmdW5jdGlvbiBvbkNvbXBvc2l0aW9uRW5kKGV2ZW50KSB7XG4gICAgICBfb25Db21wb3NpdGlvbkVuZChldmVudCk7XG4gICAgICBpZiAob25PcmlnaW5Db21wb3NpdGlvbkVuZCkge1xuICAgICAgICBvbk9yaWdpbkNvbXBvc2l0aW9uRW5kKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9uUGFzdGU6IG9uUGFzdGUsXG4gICAgb25CbHVyOiBmdW5jdGlvbiBvbkJsdXIoZXZlbnQpIHtcbiAgICAgIF9vbkJsdXIoZXZlbnQpO1xuICAgICAgaWYgKG9uT3JpZ2luQmx1cikge1xuICAgICAgICBvbk9yaWdpbkJsdXIoZXZlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfSkpO1xuICByZXR1cm4gaW5wdXROb2RlO1xufTtcbnZhciBSZWZJbnB1dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKElucHV0KTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFJlZklucHV0LmRpc3BsYXlOYW1lID0gJ0lucHV0Jztcbn1cbmV4cG9ydCBkZWZhdWx0IFJlZklucHV0OyIsICIvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1ob29rcy9ydWxlcy1vZi1ob29rcyAqL1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgaXNCcm93c2VyQ2xpZW50IH0gZnJvbSBcIi4uL3V0aWxzL2NvbW1vblV0aWxcIjtcblxuLyoqXG4gKiBXcmFwIGBSZWFjdC51c2VMYXlvdXRFZmZlY3RgIHdoaWNoIHdpbGwgbm90IHRocm93IHdhcm5pbmcgbWVzc2FnZSBpbiB0ZXN0IGVudlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VMYXlvdXRFZmZlY3QoZWZmZWN0LCBkZXBzKSB7XG4gIC8vIE5ldmVyIGhhcHBlbiBpbiB0ZXN0IGVudlxuICBpZiAoaXNCcm93c2VyQ2xpZW50KSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBSZWFjdC51c2VMYXlvdXRFZmZlY3QoZWZmZWN0LCBkZXBzKTtcbiAgfSBlbHNlIHtcbiAgICBSZWFjdC51c2VFZmZlY3QoZWZmZWN0LCBkZXBzKTtcbiAgfVxufVxuLyogZXNsaW50LWVuYWJsZSAqLyIsICJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5leHBvcnQgZnVuY3Rpb24gdG9BcnJheSh2YWx1ZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgPyBbdmFsdWVdIDogW107XG59XG5leHBvcnQgdmFyIGlzQ2xpZW50ID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRvY3VtZW50ICYmIHdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cbi8qKiBJcyBjbGllbnQgc2lkZSBhbmQgbm90IGpzZG9tICovXG5leHBvcnQgdmFyIGlzQnJvd3NlckNsaWVudCA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAndGVzdCcgJiYgaXNDbGllbnQ7XG5leHBvcnQgZnVuY3Rpb24gaGFzVmFsdWUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGw7XG59XG5cbi8qKiBjb21ibyBtb2RlIG5vIHZhbHVlIGp1ZGdtZW50IGZ1bmN0aW9uICovXG5leHBvcnQgZnVuY3Rpb24gaXNDb21ib05vVmFsdWUodmFsdWUpIHtcbiAgcmV0dXJuICF2YWx1ZSAmJiB2YWx1ZSAhPT0gMDtcbn1cbmZ1bmN0aW9uIGlzVGl0bGVUeXBlKHRpdGxlKSB7XG4gIHJldHVybiBbJ3N0cmluZycsICdudW1iZXInXS5pbmNsdWRlcyhfdHlwZW9mKHRpdGxlKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VGl0bGUoaXRlbSkge1xuICB2YXIgdGl0bGUgPSB1bmRlZmluZWQ7XG4gIGlmIChpdGVtKSB7XG4gICAgaWYgKGlzVGl0bGVUeXBlKGl0ZW0udGl0bGUpKSB7XG4gICAgICB0aXRsZSA9IGl0ZW0udGl0bGUudG9TdHJpbmcoKTtcbiAgICB9IGVsc2UgaWYgKGlzVGl0bGVUeXBlKGl0ZW0ubGFiZWwpKSB7XG4gICAgICB0aXRsZSA9IGl0ZW0ubGFiZWwudG9TdHJpbmcoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRpdGxlO1xufSIsICJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBwaWNrQXR0cnMgZnJvbSBcInJjLXV0aWwvZXMvcGlja0F0dHJzXCI7XG5pbXBvcnQgSW5wdXQgZnJvbSBcIi4vSW5wdXRcIjtcbmltcG9ydCB7IGdldFRpdGxlIH0gZnJvbSBcIi4uL3V0aWxzL2NvbW1vblV0aWxcIjtcbnZhciBTaW5nbGVTZWxlY3RvciA9IGZ1bmN0aW9uIFNpbmdsZVNlbGVjdG9yKHByb3BzKSB7XG4gIHZhciBpbnB1dEVsZW1lbnQgPSBwcm9wcy5pbnB1dEVsZW1lbnQsXG4gICAgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIGlkID0gcHJvcHMuaWQsXG4gICAgaW5wdXRSZWYgPSBwcm9wcy5pbnB1dFJlZixcbiAgICBkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkLFxuICAgIGF1dG9Gb2N1cyA9IHByb3BzLmF1dG9Gb2N1cyxcbiAgICBhdXRvQ29tcGxldGUgPSBwcm9wcy5hdXRvQ29tcGxldGUsXG4gICAgYWN0aXZlRGVzY2VuZGFudElkID0gcHJvcHMuYWN0aXZlRGVzY2VuZGFudElkLFxuICAgIG1vZGUgPSBwcm9wcy5tb2RlLFxuICAgIG9wZW4gPSBwcm9wcy5vcGVuLFxuICAgIHZhbHVlcyA9IHByb3BzLnZhbHVlcyxcbiAgICBwbGFjZWhvbGRlciA9IHByb3BzLnBsYWNlaG9sZGVyLFxuICAgIHRhYkluZGV4ID0gcHJvcHMudGFiSW5kZXgsXG4gICAgc2hvd1NlYXJjaCA9IHByb3BzLnNob3dTZWFyY2gsXG4gICAgc2VhcmNoVmFsdWUgPSBwcm9wcy5zZWFyY2hWYWx1ZSxcbiAgICBhY3RpdmVWYWx1ZSA9IHByb3BzLmFjdGl2ZVZhbHVlLFxuICAgIG1heExlbmd0aCA9IHByb3BzLm1heExlbmd0aCxcbiAgICBvbklucHV0S2V5RG93biA9IHByb3BzLm9uSW5wdXRLZXlEb3duLFxuICAgIG9uSW5wdXRNb3VzZURvd24gPSBwcm9wcy5vbklucHV0TW91c2VEb3duLFxuICAgIG9uSW5wdXRDaGFuZ2UgPSBwcm9wcy5vbklucHV0Q2hhbmdlLFxuICAgIG9uSW5wdXRQYXN0ZSA9IHByb3BzLm9uSW5wdXRQYXN0ZSxcbiAgICBvbklucHV0Q29tcG9zaXRpb25TdGFydCA9IHByb3BzLm9uSW5wdXRDb21wb3NpdGlvblN0YXJ0LFxuICAgIG9uSW5wdXRDb21wb3NpdGlvbkVuZCA9IHByb3BzLm9uSW5wdXRDb21wb3NpdGlvbkVuZCxcbiAgICBvbklucHV0Qmx1ciA9IHByb3BzLm9uSW5wdXRCbHVyLFxuICAgIHRpdGxlID0gcHJvcHMudGl0bGU7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShmYWxzZSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgaW5wdXRDaGFuZ2VkID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXRJbnB1dENoYW5nZWQgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICB2YXIgY29tYm9ib3ggPSBtb2RlID09PSAnY29tYm9ib3gnO1xuICB2YXIgaW5wdXRFZGl0YWJsZSA9IGNvbWJvYm94IHx8IHNob3dTZWFyY2g7XG4gIHZhciBpdGVtID0gdmFsdWVzWzBdO1xuICB2YXIgaW5wdXRWYWx1ZSA9IHNlYXJjaFZhbHVlIHx8ICcnO1xuICBpZiAoY29tYm9ib3ggJiYgYWN0aXZlVmFsdWUgJiYgIWlucHV0Q2hhbmdlZCkge1xuICAgIGlucHV0VmFsdWUgPSBhY3RpdmVWYWx1ZTtcbiAgfVxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChjb21ib2JveCkge1xuICAgICAgc2V0SW5wdXRDaGFuZ2VkKGZhbHNlKTtcbiAgICB9XG4gIH0sIFtjb21ib2JveCwgYWN0aXZlVmFsdWVdKTtcblxuICAvLyBOb3Qgc2hvdyB0ZXh0IHdoZW4gY2xvc2VkIGV4cGVjdCBjb21ib2JveCBtb2RlXG4gIHZhciBoYXNUZXh0SW5wdXQgPSBtb2RlICE9PSAnY29tYm9ib3gnICYmICFvcGVuICYmICFzaG93U2VhcmNoID8gZmFsc2UgOiAhIWlucHV0VmFsdWU7XG5cbiAgLy8gR2V0IHRpdGxlIG9mIHNlbGVjdGlvbiBpdGVtXG4gIHZhciBzZWxlY3Rpb25UaXRsZSA9IHRpdGxlID09PSB1bmRlZmluZWQgPyBnZXRUaXRsZShpdGVtKSA6IHRpdGxlO1xuICB2YXIgcGxhY2Vob2xkZXJOb2RlID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGl0ZW0pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zZWxlY3Rpb24tcGxhY2Vob2xkZXJcIiksXG4gICAgICBzdHlsZTogaGFzVGV4dElucHV0ID8ge1xuICAgICAgICB2aXNpYmlsaXR5OiAnaGlkZGVuJ1xuICAgICAgfSA6IHVuZGVmaW5lZFxuICAgIH0sIHBsYWNlaG9sZGVyKTtcbiAgfSwgW2l0ZW0sIGhhc1RleHRJbnB1dCwgcGxhY2Vob2xkZXIsIHByZWZpeENsc10pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2VsZWN0aW9uLXdyYXBcIilcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2VsZWN0aW9uLXNlYXJjaFwiKVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJbnB1dCwge1xuICAgIHJlZjogaW5wdXRSZWYsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgaWQ6IGlkLFxuICAgIG9wZW46IG9wZW4sXG4gICAgaW5wdXRFbGVtZW50OiBpbnB1dEVsZW1lbnQsXG4gICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgIGF1dG9Gb2N1czogYXV0b0ZvY3VzLFxuICAgIGF1dG9Db21wbGV0ZTogYXV0b0NvbXBsZXRlLFxuICAgIGVkaXRhYmxlOiBpbnB1dEVkaXRhYmxlLFxuICAgIGFjdGl2ZURlc2NlbmRhbnRJZDogYWN0aXZlRGVzY2VuZGFudElkLFxuICAgIHZhbHVlOiBpbnB1dFZhbHVlLFxuICAgIG9uS2V5RG93bjogb25JbnB1dEtleURvd24sXG4gICAgb25Nb3VzZURvd246IG9uSW5wdXRNb3VzZURvd24sXG4gICAgb25DaGFuZ2U6IGZ1bmN0aW9uIG9uQ2hhbmdlKGUpIHtcbiAgICAgIHNldElucHV0Q2hhbmdlZCh0cnVlKTtcbiAgICAgIG9uSW5wdXRDaGFuZ2UoZSk7XG4gICAgfSxcbiAgICBvblBhc3RlOiBvbklucHV0UGFzdGUsXG4gICAgb25Db21wb3NpdGlvblN0YXJ0OiBvbklucHV0Q29tcG9zaXRpb25TdGFydCxcbiAgICBvbkNvbXBvc2l0aW9uRW5kOiBvbklucHV0Q29tcG9zaXRpb25FbmQsXG4gICAgb25CbHVyOiBvbklucHV0Qmx1cixcbiAgICB0YWJJbmRleDogdGFiSW5kZXgsXG4gICAgYXR0cnM6IHBpY2tBdHRycyhwcm9wcywgdHJ1ZSksXG4gICAgbWF4TGVuZ3RoOiBjb21ib2JveCA/IG1heExlbmd0aCA6IHVuZGVmaW5lZFxuICB9KSksICFjb21ib2JveCAmJiBpdGVtID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2VsZWN0aW9uLWl0ZW1cIiksXG4gICAgdGl0bGU6IHNlbGVjdGlvblRpdGxlXG4gICAgLy8gXHU1RjUzIFNlbGVjdCBcdTVERjJcdTdFQ0ZcdTkwMDlcdTRFMkRcdTkwMDlcdTk4NzlcdTY1RjZcdUZGMENcdThGRDhcdTk3MDAgc2VsZWN0aW9uIFx1OTY5MFx1ODVDRlx1NEY0Nlx1NzU1OVx1NTcyOFx1NTM5Rlx1NTczMFx1NTM2MFx1NEY0RFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzI3Njg4XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvNDE1MzBcbiAgICAsXG4gICAgc3R5bGU6IGhhc1RleHRJbnB1dCA/IHtcbiAgICAgIHZpc2liaWxpdHk6ICdoaWRkZW4nXG4gICAgfSA6IHVuZGVmaW5lZFxuICB9LCBpdGVtLmxhYmVsKSA6IG51bGwsIHBsYWNlaG9sZGVyTm9kZSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgU2luZ2xlU2VsZWN0b3I7IiwgImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wicHJlZml4Q2xzXCIsIFwiY2hpbGRyZW5cIiwgXCJhY3Rpb25cIiwgXCJzaG93QWN0aW9uXCIsIFwiaGlkZUFjdGlvblwiLCBcInBvcHVwVmlzaWJsZVwiLCBcImRlZmF1bHRQb3B1cFZpc2libGVcIiwgXCJvblBvcHVwVmlzaWJsZUNoYW5nZVwiLCBcImFmdGVyUG9wdXBWaXNpYmxlQ2hhbmdlXCIsIFwibW91c2VFbnRlckRlbGF5XCIsIFwibW91c2VMZWF2ZURlbGF5XCIsIFwiZm9jdXNEZWxheVwiLCBcImJsdXJEZWxheVwiLCBcIm1hc2tcIiwgXCJtYXNrQ2xvc2FibGVcIiwgXCJnZXRQb3B1cENvbnRhaW5lclwiLCBcImZvcmNlUmVuZGVyXCIsIFwiYXV0b0Rlc3Ryb3lcIiwgXCJkZXN0cm95UG9wdXBPbkhpZGVcIiwgXCJwb3B1cFwiLCBcInBvcHVwQ2xhc3NOYW1lXCIsIFwicG9wdXBTdHlsZVwiLCBcInBvcHVwUGxhY2VtZW50XCIsIFwiYnVpbHRpblBsYWNlbWVudHNcIiwgXCJwb3B1cEFsaWduXCIsIFwiekluZGV4XCIsIFwic3RyZXRjaFwiLCBcImdldFBvcHVwQ2xhc3NOYW1lRnJvbUFsaWduXCIsIFwiZnJlc2hcIiwgXCJhbGlnblBvaW50XCIsIFwib25Qb3B1cENsaWNrXCIsIFwib25Qb3B1cEFsaWduXCIsIFwiYXJyb3dcIiwgXCJwb3B1cE1vdGlvblwiLCBcIm1hc2tNb3Rpb25cIiwgXCJwb3B1cFRyYW5zaXRpb25OYW1lXCIsIFwicG9wdXBBbmltYXRpb25cIiwgXCJtYXNrVHJhbnNpdGlvbk5hbWVcIiwgXCJtYXNrQW5pbWF0aW9uXCIsIFwiY2xhc3NOYW1lXCIsIFwiZ2V0VHJpZ2dlckRPTU5vZGVcIl07XG5pbXBvcnQgUG9ydGFsIGZyb20gJ0ByYy1jb21wb25lbnQvcG9ydGFsJztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFJlc2l6ZU9ic2VydmVyIGZyb20gJ3JjLXJlc2l6ZS1vYnNlcnZlcic7XG5pbXBvcnQgeyBpc0RPTSB9IGZyb20gXCJyYy11dGlsL2VzL0RvbS9maW5kRE9NTm9kZVwiO1xuaW1wb3J0IHsgZ2V0U2hhZG93Um9vdCB9IGZyb20gXCJyYy11dGlsL2VzL0RvbS9zaGFkb3dcIjtcbmltcG9ydCB1c2VFdmVudCBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VFdmVudFwiO1xuaW1wb3J0IHVzZUlkIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZUlkXCI7XG5pbXBvcnQgdXNlTGF5b3V0RWZmZWN0IGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZUxheW91dEVmZmVjdFwiO1xuaW1wb3J0IGlzTW9iaWxlIGZyb20gXCJyYy11dGlsL2VzL2lzTW9iaWxlXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUG9wdXAgZnJvbSBcIi4vUG9wdXBcIjtcbmltcG9ydCBUcmlnZ2VyV3JhcHBlciBmcm9tIFwiLi9UcmlnZ2VyV3JhcHBlclwiO1xuaW1wb3J0IFRyaWdnZXJDb250ZXh0IGZyb20gXCIuL2NvbnRleHRcIjtcbmltcG9ydCB1c2VBY3Rpb24gZnJvbSBcIi4vaG9va3MvdXNlQWN0aW9uXCI7XG5pbXBvcnQgdXNlQWxpZ24gZnJvbSBcIi4vaG9va3MvdXNlQWxpZ25cIjtcbmltcG9ydCB1c2VXYXRjaCBmcm9tIFwiLi9ob29rcy91c2VXYXRjaFwiO1xuaW1wb3J0IHVzZVdpbkNsaWNrIGZyb20gXCIuL2hvb2tzL3VzZVdpbkNsaWNrXCI7XG5pbXBvcnQgeyBnZXRBbGlnblBvcHVwQ2xhc3NOYW1lLCBnZXRNb3Rpb24gfSBmcm9tIFwiLi91dGlsXCI7XG5cbi8vIFJlbW92ZWQgUHJvcHMgTGlzdFxuLy8gU2VlbXMgdGhpcyBjYW4gYmUgYXV0b1xuLy8gZ2V0RG9jdW1lbnQ/OiAoZWxlbWVudD86IEhUTUxFbGVtZW50KSA9PiBEb2N1bWVudDtcblxuLy8gTmV3IHZlcnNpb24gd2lsbCBub3Qgd3JhcCBwb3B1cCB3aXRoIGByYy10cmlnZ2VyLXBvcHVwLWNvbnRlbnRgIHdoZW4gbXVsdGlwbGUgY2hpbGRyZW5cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlVHJpZ2dlcigpIHtcbiAgdmFyIFBvcnRhbENvbXBvbmVudCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogUG9ydGFsO1xuICB2YXIgVHJpZ2dlciA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gICAgdmFyIF9wcm9wcyRwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICBwcmVmaXhDbHMgPSBfcHJvcHMkcHJlZml4Q2xzID09PSB2b2lkIDAgPyAncmMtdHJpZ2dlci1wb3B1cCcgOiBfcHJvcHMkcHJlZml4Q2xzLFxuICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIF9wcm9wcyRhY3Rpb24gPSBwcm9wcy5hY3Rpb24sXG4gICAgICBhY3Rpb24gPSBfcHJvcHMkYWN0aW9uID09PSB2b2lkIDAgPyAnaG92ZXInIDogX3Byb3BzJGFjdGlvbixcbiAgICAgIHNob3dBY3Rpb24gPSBwcm9wcy5zaG93QWN0aW9uLFxuICAgICAgaGlkZUFjdGlvbiA9IHByb3BzLmhpZGVBY3Rpb24sXG4gICAgICBwb3B1cFZpc2libGUgPSBwcm9wcy5wb3B1cFZpc2libGUsXG4gICAgICBkZWZhdWx0UG9wdXBWaXNpYmxlID0gcHJvcHMuZGVmYXVsdFBvcHVwVmlzaWJsZSxcbiAgICAgIG9uUG9wdXBWaXNpYmxlQ2hhbmdlID0gcHJvcHMub25Qb3B1cFZpc2libGVDaGFuZ2UsXG4gICAgICBhZnRlclBvcHVwVmlzaWJsZUNoYW5nZSA9IHByb3BzLmFmdGVyUG9wdXBWaXNpYmxlQ2hhbmdlLFxuICAgICAgbW91c2VFbnRlckRlbGF5ID0gcHJvcHMubW91c2VFbnRlckRlbGF5LFxuICAgICAgX3Byb3BzJG1vdXNlTGVhdmVEZWxhID0gcHJvcHMubW91c2VMZWF2ZURlbGF5LFxuICAgICAgbW91c2VMZWF2ZURlbGF5ID0gX3Byb3BzJG1vdXNlTGVhdmVEZWxhID09PSB2b2lkIDAgPyAwLjEgOiBfcHJvcHMkbW91c2VMZWF2ZURlbGEsXG4gICAgICBmb2N1c0RlbGF5ID0gcHJvcHMuZm9jdXNEZWxheSxcbiAgICAgIGJsdXJEZWxheSA9IHByb3BzLmJsdXJEZWxheSxcbiAgICAgIG1hc2sgPSBwcm9wcy5tYXNrLFxuICAgICAgX3Byb3BzJG1hc2tDbG9zYWJsZSA9IHByb3BzLm1hc2tDbG9zYWJsZSxcbiAgICAgIG1hc2tDbG9zYWJsZSA9IF9wcm9wcyRtYXNrQ2xvc2FibGUgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkbWFza0Nsb3NhYmxlLFxuICAgICAgZ2V0UG9wdXBDb250YWluZXIgPSBwcm9wcy5nZXRQb3B1cENvbnRhaW5lcixcbiAgICAgIGZvcmNlUmVuZGVyID0gcHJvcHMuZm9yY2VSZW5kZXIsXG4gICAgICBhdXRvRGVzdHJveSA9IHByb3BzLmF1dG9EZXN0cm95LFxuICAgICAgZGVzdHJveVBvcHVwT25IaWRlID0gcHJvcHMuZGVzdHJveVBvcHVwT25IaWRlLFxuICAgICAgcG9wdXAgPSBwcm9wcy5wb3B1cCxcbiAgICAgIHBvcHVwQ2xhc3NOYW1lID0gcHJvcHMucG9wdXBDbGFzc05hbWUsXG4gICAgICBwb3B1cFN0eWxlID0gcHJvcHMucG9wdXBTdHlsZSxcbiAgICAgIHBvcHVwUGxhY2VtZW50ID0gcHJvcHMucG9wdXBQbGFjZW1lbnQsXG4gICAgICBfcHJvcHMkYnVpbHRpblBsYWNlbWUgPSBwcm9wcy5idWlsdGluUGxhY2VtZW50cyxcbiAgICAgIGJ1aWx0aW5QbGFjZW1lbnRzID0gX3Byb3BzJGJ1aWx0aW5QbGFjZW1lID09PSB2b2lkIDAgPyB7fSA6IF9wcm9wcyRidWlsdGluUGxhY2VtZSxcbiAgICAgIHBvcHVwQWxpZ24gPSBwcm9wcy5wb3B1cEFsaWduLFxuICAgICAgekluZGV4ID0gcHJvcHMuekluZGV4LFxuICAgICAgc3RyZXRjaCA9IHByb3BzLnN0cmV0Y2gsXG4gICAgICBnZXRQb3B1cENsYXNzTmFtZUZyb21BbGlnbiA9IHByb3BzLmdldFBvcHVwQ2xhc3NOYW1lRnJvbUFsaWduLFxuICAgICAgZnJlc2ggPSBwcm9wcy5mcmVzaCxcbiAgICAgIGFsaWduUG9pbnQgPSBwcm9wcy5hbGlnblBvaW50LFxuICAgICAgb25Qb3B1cENsaWNrID0gcHJvcHMub25Qb3B1cENsaWNrLFxuICAgICAgb25Qb3B1cEFsaWduID0gcHJvcHMub25Qb3B1cEFsaWduLFxuICAgICAgYXJyb3cgPSBwcm9wcy5hcnJvdyxcbiAgICAgIHBvcHVwTW90aW9uID0gcHJvcHMucG9wdXBNb3Rpb24sXG4gICAgICBtYXNrTW90aW9uID0gcHJvcHMubWFza01vdGlvbixcbiAgICAgIHBvcHVwVHJhbnNpdGlvbk5hbWUgPSBwcm9wcy5wb3B1cFRyYW5zaXRpb25OYW1lLFxuICAgICAgcG9wdXBBbmltYXRpb24gPSBwcm9wcy5wb3B1cEFuaW1hdGlvbixcbiAgICAgIG1hc2tUcmFuc2l0aW9uTmFtZSA9IHByb3BzLm1hc2tUcmFuc2l0aW9uTmFtZSxcbiAgICAgIG1hc2tBbmltYXRpb24gPSBwcm9wcy5tYXNrQW5pbWF0aW9uLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgZ2V0VHJpZ2dlckRPTU5vZGUgPSBwcm9wcy5nZXRUcmlnZ2VyRE9NTm9kZSxcbiAgICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgX2V4Y2x1ZGVkKTtcbiAgICB2YXIgbWVyZ2VkQXV0b0Rlc3Ryb3kgPSBhdXRvRGVzdHJveSB8fCBkZXN0cm95UG9wdXBPbkhpZGUgfHwgZmFsc2U7XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gTW9iaWxlID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShmYWxzZSksXG4gICAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICAgIG1vYmlsZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRNb2JpbGUgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICAgIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICBzZXRNb2JpbGUoaXNNb2JpbGUoKSk7XG4gICAgfSwgW10pO1xuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gQ29udGV4dCA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICB2YXIgc3ViUG9wdXBFbGVtZW50cyA9IFJlYWN0LnVzZVJlZih7fSk7XG4gICAgdmFyIHBhcmVudENvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KFRyaWdnZXJDb250ZXh0KTtcbiAgICB2YXIgY29udGV4dCA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVnaXN0ZXJTdWJQb3B1cDogZnVuY3Rpb24gcmVnaXN0ZXJTdWJQb3B1cChpZCwgc3ViUG9wdXBFbGUpIHtcbiAgICAgICAgICBzdWJQb3B1cEVsZW1lbnRzLmN1cnJlbnRbaWRdID0gc3ViUG9wdXBFbGU7XG4gICAgICAgICAgcGFyZW50Q29udGV4dCA9PT0gbnVsbCB8fCBwYXJlbnRDb250ZXh0ID09PSB2b2lkIDAgfHwgcGFyZW50Q29udGV4dC5yZWdpc3RlclN1YlBvcHVwKGlkLCBzdWJQb3B1cEVsZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSwgW3BhcmVudENvbnRleHRdKTtcblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBQb3B1cCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgdmFyIGlkID0gdXNlSWQoKTtcbiAgICB2YXIgX1JlYWN0JHVzZVN0YXRlMyA9IFJlYWN0LnVzZVN0YXRlKG51bGwpLFxuICAgICAgX1JlYWN0JHVzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTMsIDIpLFxuICAgICAgcG9wdXBFbGUgPSBfUmVhY3QkdXNlU3RhdGU0WzBdLFxuICAgICAgc2V0UG9wdXBFbGUgPSBfUmVhY3QkdXNlU3RhdGU0WzFdO1xuXG4gICAgLy8gVXNlZCBmb3IgZm9yd2FyZFJlZiBwb3B1cC4gTm90IHVzZSBpbnRlcm5hbFxuICAgIHZhciBleHRlcm5hbFBvcHVwUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICAgIHZhciBzZXRQb3B1cFJlZiA9IHVzZUV2ZW50KGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICBleHRlcm5hbFBvcHVwUmVmLmN1cnJlbnQgPSBub2RlO1xuICAgICAgaWYgKGlzRE9NKG5vZGUpICYmIHBvcHVwRWxlICE9PSBub2RlKSB7XG4gICAgICAgIHNldFBvcHVwRWxlKG5vZGUpO1xuICAgICAgfVxuICAgICAgcGFyZW50Q29udGV4dCA9PT0gbnVsbCB8fCBwYXJlbnRDb250ZXh0ID09PSB2b2lkIDAgfHwgcGFyZW50Q29udGV4dC5yZWdpc3RlclN1YlBvcHVwKGlkLCBub2RlKTtcbiAgICB9KTtcblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBUYXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gVXNlIHN0YXRlIHRvIGNvbnRyb2wgaGVyZSBzaW5jZSBgdXNlUmVmYCB1cGRhdGUgbm90IHRyaWdnZXIgcmVuZGVyXG4gICAgdmFyIF9SZWFjdCR1c2VTdGF0ZTUgPSBSZWFjdC51c2VTdGF0ZShudWxsKSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTYgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGU1LCAyKSxcbiAgICAgIHRhcmdldEVsZSA9IF9SZWFjdCR1c2VTdGF0ZTZbMF0sXG4gICAgICBzZXRUYXJnZXRFbGUgPSBfUmVhY3QkdXNlU3RhdGU2WzFdO1xuXG4gICAgLy8gVXNlZCBmb3IgZm9yd2FyZFJlZiB0YXJnZXQuIE5vdCB1c2UgaW50ZXJuYWxcbiAgICB2YXIgZXh0ZXJuYWxGb3J3YXJkUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICAgIHZhciBzZXRUYXJnZXRSZWYgPSB1c2VFdmVudChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgaWYgKGlzRE9NKG5vZGUpICYmIHRhcmdldEVsZSAhPT0gbm9kZSkge1xuICAgICAgICBzZXRUYXJnZXRFbGUobm9kZSk7XG4gICAgICAgIGV4dGVybmFsRm9yd2FyZFJlZi5jdXJyZW50ID0gbm9kZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IENoaWxkcmVuID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgdmFyIGNoaWxkID0gUmVhY3QuQ2hpbGRyZW4ub25seShjaGlsZHJlbik7XG4gICAgdmFyIG9yaWdpbkNoaWxkUHJvcHMgPSAoY2hpbGQgPT09IG51bGwgfHwgY2hpbGQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNoaWxkLnByb3BzKSB8fCB7fTtcbiAgICB2YXIgY2xvbmVQcm9wcyA9IHt9O1xuICAgIHZhciBpblBvcHVwT3JDaGlsZCA9IHVzZUV2ZW50KGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHZhciBfZ2V0U2hhZG93Um9vdCwgX2dldFNoYWRvd1Jvb3QyO1xuICAgICAgdmFyIGNoaWxkRE9NID0gdGFyZ2V0RWxlO1xuICAgICAgcmV0dXJuIChjaGlsZERPTSA9PT0gbnVsbCB8fCBjaGlsZERPTSA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2hpbGRET00uY29udGFpbnMoZWxlKSkgfHwgKChfZ2V0U2hhZG93Um9vdCA9IGdldFNoYWRvd1Jvb3QoY2hpbGRET00pKSA9PT0gbnVsbCB8fCBfZ2V0U2hhZG93Um9vdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2dldFNoYWRvd1Jvb3QuaG9zdCkgPT09IGVsZSB8fCBlbGUgPT09IGNoaWxkRE9NIHx8IChwb3B1cEVsZSA9PT0gbnVsbCB8fCBwb3B1cEVsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogcG9wdXBFbGUuY29udGFpbnMoZWxlKSkgfHwgKChfZ2V0U2hhZG93Um9vdDIgPSBnZXRTaGFkb3dSb290KHBvcHVwRWxlKSkgPT09IG51bGwgfHwgX2dldFNoYWRvd1Jvb3QyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZ2V0U2hhZG93Um9vdDIuaG9zdCkgPT09IGVsZSB8fCBlbGUgPT09IHBvcHVwRWxlIHx8IE9iamVjdC52YWx1ZXMoc3ViUG9wdXBFbGVtZW50cy5jdXJyZW50KS5zb21lKGZ1bmN0aW9uIChzdWJQb3B1cEVsZSkge1xuICAgICAgICByZXR1cm4gKHN1YlBvcHVwRWxlID09PSBudWxsIHx8IHN1YlBvcHVwRWxlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdWJQb3B1cEVsZS5jb250YWlucyhlbGUpKSB8fCBlbGUgPT09IHN1YlBvcHVwRWxlO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gTW90aW9uID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIHZhciBtZXJnZVBvcHVwTW90aW9uID0gZ2V0TW90aW9uKHByZWZpeENscywgcG9wdXBNb3Rpb24sIHBvcHVwQW5pbWF0aW9uLCBwb3B1cFRyYW5zaXRpb25OYW1lKTtcbiAgICB2YXIgbWVyZ2VNYXNrTW90aW9uID0gZ2V0TW90aW9uKHByZWZpeENscywgbWFza01vdGlvbiwgbWFza0FuaW1hdGlvbiwgbWFza1RyYW5zaXRpb25OYW1lKTtcblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gT3BlbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgdmFyIF9SZWFjdCR1c2VTdGF0ZTcgPSBSZWFjdC51c2VTdGF0ZShkZWZhdWx0UG9wdXBWaXNpYmxlIHx8IGZhbHNlKSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTggPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGU3LCAyKSxcbiAgICAgIGludGVybmFsT3BlbiA9IF9SZWFjdCR1c2VTdGF0ZThbMF0sXG4gICAgICBzZXRJbnRlcm5hbE9wZW4gPSBfUmVhY3QkdXNlU3RhdGU4WzFdO1xuXG4gICAgLy8gUmVuZGVyIHN0aWxsIHVzZSBwcm9wcyBhcyBmaXJzdCBwcmlvcml0eVxuICAgIHZhciBtZXJnZWRPcGVuID0gcG9wdXBWaXNpYmxlICE9PSBudWxsICYmIHBvcHVwVmlzaWJsZSAhPT0gdm9pZCAwID8gcG9wdXBWaXNpYmxlIDogaW50ZXJuYWxPcGVuO1xuXG4gICAgLy8gV2UgdXNlIGVmZmVjdCBzeW5jIGhlcmUgaW4gY2FzZSBgcG9wdXBWaXNpYmxlYCBiYWNrIHRvIGB1bmRlZmluZWRgXG4gICAgdmFyIHNldE1lcmdlZE9wZW4gPSB1c2VFdmVudChmdW5jdGlvbiAobmV4dE9wZW4pIHtcbiAgICAgIGlmIChwb3B1cFZpc2libGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzZXRJbnRlcm5hbE9wZW4obmV4dE9wZW4pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICBzZXRJbnRlcm5hbE9wZW4ocG9wdXBWaXNpYmxlIHx8IGZhbHNlKTtcbiAgICB9LCBbcG9wdXBWaXNpYmxlXSk7XG4gICAgdmFyIG9wZW5SZWYgPSBSZWFjdC51c2VSZWYobWVyZ2VkT3Blbik7XG4gICAgb3BlblJlZi5jdXJyZW50ID0gbWVyZ2VkT3BlbjtcbiAgICB2YXIgbGFzdFRyaWdnZXJSZWYgPSBSZWFjdC51c2VSZWYoW10pO1xuICAgIGxhc3RUcmlnZ2VyUmVmLmN1cnJlbnQgPSBbXTtcbiAgICB2YXIgaW50ZXJuYWxUcmlnZ2VyT3BlbiA9IHVzZUV2ZW50KGZ1bmN0aW9uIChuZXh0T3Blbikge1xuICAgICAgdmFyIF9sYXN0VHJpZ2dlclJlZiRjdXJyZTtcbiAgICAgIHNldE1lcmdlZE9wZW4obmV4dE9wZW4pO1xuXG4gICAgICAvLyBFbnRlciBvciBQb2ludGVyIHdpbGwgYm90aCB0cmlnZ2VyIG9wZW4gc3RhdGUgY2hhbmdlXG4gICAgICAvLyBXZSBvbmx5IG5lZWQgdGFrZSBvbmUgdG8gYXZvaWQgZHVwbGljYXRlZCBjaGFuZ2UgZXZlbnQgdHJpZ2dlclxuICAgICAgLy8gVXNlIGBsYXN0VHJpZ2dlclJlZmAgdG8gcmVjb3JkIGxhc3Qgb3BlbiB0eXBlXG4gICAgICBpZiAoKChfbGFzdFRyaWdnZXJSZWYkY3VycmUgPSBsYXN0VHJpZ2dlclJlZi5jdXJyZW50W2xhc3RUcmlnZ2VyUmVmLmN1cnJlbnQubGVuZ3RoIC0gMV0pICE9PSBudWxsICYmIF9sYXN0VHJpZ2dlclJlZiRjdXJyZSAhPT0gdm9pZCAwID8gX2xhc3RUcmlnZ2VyUmVmJGN1cnJlIDogbWVyZ2VkT3BlbikgIT09IG5leHRPcGVuKSB7XG4gICAgICAgIGxhc3RUcmlnZ2VyUmVmLmN1cnJlbnQucHVzaChuZXh0T3Blbik7XG4gICAgICAgIG9uUG9wdXBWaXNpYmxlQ2hhbmdlID09PSBudWxsIHx8IG9uUG9wdXBWaXNpYmxlQ2hhbmdlID09PSB2b2lkIDAgfHwgb25Qb3B1cFZpc2libGVDaGFuZ2UobmV4dE9wZW4pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gVHJpZ2dlciBmb3IgZGVsYXlcbiAgICB2YXIgZGVsYXlSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgICB2YXIgY2xlYXJEZWxheSA9IGZ1bmN0aW9uIGNsZWFyRGVsYXkoKSB7XG4gICAgICBjbGVhclRpbWVvdXQoZGVsYXlSZWYuY3VycmVudCk7XG4gICAgfTtcbiAgICB2YXIgdHJpZ2dlck9wZW4gPSBmdW5jdGlvbiB0cmlnZ2VyT3BlbihuZXh0T3Blbikge1xuICAgICAgdmFyIGRlbGF5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwO1xuICAgICAgY2xlYXJEZWxheSgpO1xuICAgICAgaWYgKGRlbGF5ID09PSAwKSB7XG4gICAgICAgIGludGVybmFsVHJpZ2dlck9wZW4obmV4dE9wZW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsYXlSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGludGVybmFsVHJpZ2dlck9wZW4obmV4dE9wZW4pO1xuICAgICAgICB9LCBkZWxheSAqIDEwMDApO1xuICAgICAgfVxuICAgIH07XG4gICAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBjbGVhckRlbGF5O1xuICAgIH0sIFtdKTtcblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IE1vdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgdmFyIF9SZWFjdCR1c2VTdGF0ZTkgPSBSZWFjdC51c2VTdGF0ZShmYWxzZSksXG4gICAgICBfUmVhY3QkdXNlU3RhdGUxMCA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTksIDIpLFxuICAgICAgaW5Nb3Rpb24gPSBfUmVhY3QkdXNlU3RhdGUxMFswXSxcbiAgICAgIHNldEluTW90aW9uID0gX1JlYWN0JHVzZVN0YXRlMTBbMV07XG4gICAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uIChmaXJzdE1vdW50KSB7XG4gICAgICBpZiAoIWZpcnN0TW91bnQgfHwgbWVyZ2VkT3Blbikge1xuICAgICAgICBzZXRJbk1vdGlvbih0cnVlKTtcbiAgICAgIH1cbiAgICB9LCBbbWVyZ2VkT3Blbl0pO1xuICAgIHZhciBfUmVhY3QkdXNlU3RhdGUxMSA9IFJlYWN0LnVzZVN0YXRlKG51bGwpLFxuICAgICAgX1JlYWN0JHVzZVN0YXRlMTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUxMSwgMiksXG4gICAgICBtb3Rpb25QcmVwYXJlUmVzb2x2ZSA9IF9SZWFjdCR1c2VTdGF0ZTEyWzBdLFxuICAgICAgc2V0TW90aW9uUHJlcGFyZVJlc29sdmUgPSBfUmVhY3QkdXNlU3RhdGUxMlsxXTtcblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBBbGlnbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgdmFyIF9SZWFjdCR1c2VTdGF0ZTEzID0gUmVhY3QudXNlU3RhdGUobnVsbCksXG4gICAgICBfUmVhY3QkdXNlU3RhdGUxNCA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTEzLCAyKSxcbiAgICAgIG1vdXNlUG9zID0gX1JlYWN0JHVzZVN0YXRlMTRbMF0sXG4gICAgICBzZXRNb3VzZVBvcyA9IF9SZWFjdCR1c2VTdGF0ZTE0WzFdO1xuICAgIHZhciBzZXRNb3VzZVBvc0J5RXZlbnQgPSBmdW5jdGlvbiBzZXRNb3VzZVBvc0J5RXZlbnQoZXZlbnQpIHtcbiAgICAgIHNldE1vdXNlUG9zKFtldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZXSk7XG4gICAgfTtcbiAgICB2YXIgX3VzZUFsaWduID0gdXNlQWxpZ24obWVyZ2VkT3BlbiwgcG9wdXBFbGUsIGFsaWduUG9pbnQgJiYgbW91c2VQb3MgIT09IG51bGwgPyBtb3VzZVBvcyA6IHRhcmdldEVsZSwgcG9wdXBQbGFjZW1lbnQsIGJ1aWx0aW5QbGFjZW1lbnRzLCBwb3B1cEFsaWduLCBvblBvcHVwQWxpZ24pLFxuICAgICAgX3VzZUFsaWduMiA9IF9zbGljZWRUb0FycmF5KF91c2VBbGlnbiwgMTEpLFxuICAgICAgcmVhZHkgPSBfdXNlQWxpZ24yWzBdLFxuICAgICAgb2Zmc2V0WCA9IF91c2VBbGlnbjJbMV0sXG4gICAgICBvZmZzZXRZID0gX3VzZUFsaWduMlsyXSxcbiAgICAgIG9mZnNldFIgPSBfdXNlQWxpZ24yWzNdLFxuICAgICAgb2Zmc2V0QiA9IF91c2VBbGlnbjJbNF0sXG4gICAgICBhcnJvd1ggPSBfdXNlQWxpZ24yWzVdLFxuICAgICAgYXJyb3dZID0gX3VzZUFsaWduMls2XSxcbiAgICAgIHNjYWxlWCA9IF91c2VBbGlnbjJbN10sXG4gICAgICBzY2FsZVkgPSBfdXNlQWxpZ24yWzhdLFxuICAgICAgYWxpZ25JbmZvID0gX3VzZUFsaWduMls5XSxcbiAgICAgIG9uQWxpZ24gPSBfdXNlQWxpZ24yWzEwXTtcbiAgICB2YXIgX3VzZUFjdGlvbiA9IHVzZUFjdGlvbihtb2JpbGUsIGFjdGlvbiwgc2hvd0FjdGlvbiwgaGlkZUFjdGlvbiksXG4gICAgICBfdXNlQWN0aW9uMiA9IF9zbGljZWRUb0FycmF5KF91c2VBY3Rpb24sIDIpLFxuICAgICAgc2hvd0FjdGlvbnMgPSBfdXNlQWN0aW9uMlswXSxcbiAgICAgIGhpZGVBY3Rpb25zID0gX3VzZUFjdGlvbjJbMV07XG4gICAgdmFyIGNsaWNrVG9TaG93ID0gc2hvd0FjdGlvbnMuaGFzKCdjbGljaycpO1xuICAgIHZhciBjbGlja1RvSGlkZSA9IGhpZGVBY3Rpb25zLmhhcygnY2xpY2snKSB8fCBoaWRlQWN0aW9ucy5oYXMoJ2NvbnRleHRNZW51Jyk7XG4gICAgdmFyIHRyaWdnZXJBbGlnbiA9IHVzZUV2ZW50KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghaW5Nb3Rpb24pIHtcbiAgICAgICAgb25BbGlnbigpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHZhciBvblNjcm9sbCA9IGZ1bmN0aW9uIG9uU2Nyb2xsKCkge1xuICAgICAgaWYgKG9wZW5SZWYuY3VycmVudCAmJiBhbGlnblBvaW50ICYmIGNsaWNrVG9IaWRlKSB7XG4gICAgICAgIHRyaWdnZXJPcGVuKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHVzZVdhdGNoKG1lcmdlZE9wZW4sIHRhcmdldEVsZSwgcG9wdXBFbGUsIHRyaWdnZXJBbGlnbiwgb25TY3JvbGwpO1xuICAgIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICB0cmlnZ2VyQWxpZ24oKTtcbiAgICB9LCBbbW91c2VQb3MsIHBvcHVwUGxhY2VtZW50XSk7XG5cbiAgICAvLyBXaGVuIG5vIGJ1aWx0aW5QbGFjZW1lbnRzIGFuZCBwb3B1cEFsaWduIGNoYW5nZWRcbiAgICB1c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKG1lcmdlZE9wZW4gJiYgIShidWlsdGluUGxhY2VtZW50cyAhPT0gbnVsbCAmJiBidWlsdGluUGxhY2VtZW50cyAhPT0gdm9pZCAwICYmIGJ1aWx0aW5QbGFjZW1lbnRzW3BvcHVwUGxhY2VtZW50XSkpIHtcbiAgICAgICAgdHJpZ2dlckFsaWduKCk7XG4gICAgICB9XG4gICAgfSwgW0pTT04uc3RyaW5naWZ5KHBvcHVwQWxpZ24pXSk7XG4gICAgdmFyIGFsaWduZWRDbGFzc05hbWUgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBiYXNlQ2xhc3NOYW1lID0gZ2V0QWxpZ25Qb3B1cENsYXNzTmFtZShidWlsdGluUGxhY2VtZW50cywgcHJlZml4Q2xzLCBhbGlnbkluZm8sIGFsaWduUG9pbnQpO1xuICAgICAgcmV0dXJuIGNsYXNzTmFtZXMoYmFzZUNsYXNzTmFtZSwgZ2V0UG9wdXBDbGFzc05hbWVGcm9tQWxpZ24gPT09IG51bGwgfHwgZ2V0UG9wdXBDbGFzc05hbWVGcm9tQWxpZ24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGdldFBvcHVwQ2xhc3NOYW1lRnJvbUFsaWduKGFsaWduSW5mbykpO1xuICAgIH0sIFthbGlnbkluZm8sIGdldFBvcHVwQ2xhc3NOYW1lRnJvbUFsaWduLCBidWlsdGluUGxhY2VtZW50cywgcHJlZml4Q2xzLCBhbGlnblBvaW50XSk7XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlZnMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIFJlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYXRpdmVFbGVtZW50OiBleHRlcm5hbEZvcndhcmRSZWYuY3VycmVudCxcbiAgICAgICAgcG9wdXBFbGVtZW50OiBleHRlcm5hbFBvcHVwUmVmLmN1cnJlbnQsXG4gICAgICAgIGZvcmNlQWxpZ246IHRyaWdnZXJBbGlnblxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IFN0cmV0Y2ggPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgdmFyIF9SZWFjdCR1c2VTdGF0ZTE1ID0gUmVhY3QudXNlU3RhdGUoMCksXG4gICAgICBfUmVhY3QkdXNlU3RhdGUxNiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTE1LCAyKSxcbiAgICAgIHRhcmdldFdpZHRoID0gX1JlYWN0JHVzZVN0YXRlMTZbMF0sXG4gICAgICBzZXRUYXJnZXRXaWR0aCA9IF9SZWFjdCR1c2VTdGF0ZTE2WzFdO1xuICAgIHZhciBfUmVhY3QkdXNlU3RhdGUxNyA9IFJlYWN0LnVzZVN0YXRlKDApLFxuICAgICAgX1JlYWN0JHVzZVN0YXRlMTggPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUxNywgMiksXG4gICAgICB0YXJnZXRIZWlnaHQgPSBfUmVhY3QkdXNlU3RhdGUxOFswXSxcbiAgICAgIHNldFRhcmdldEhlaWdodCA9IF9SZWFjdCR1c2VTdGF0ZTE4WzFdO1xuICAgIHZhciBzeW5jVGFyZ2V0U2l6ZSA9IGZ1bmN0aW9uIHN5bmNUYXJnZXRTaXplKCkge1xuICAgICAgaWYgKHN0cmV0Y2ggJiYgdGFyZ2V0RWxlKSB7XG4gICAgICAgIHZhciByZWN0ID0gdGFyZ2V0RWxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBzZXRUYXJnZXRXaWR0aChyZWN0LndpZHRoKTtcbiAgICAgICAgc2V0VGFyZ2V0SGVpZ2h0KHJlY3QuaGVpZ2h0KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciBvblRhcmdldFJlc2l6ZSA9IGZ1bmN0aW9uIG9uVGFyZ2V0UmVzaXplKCkge1xuICAgICAgc3luY1RhcmdldFNpemUoKTtcbiAgICAgIHRyaWdnZXJBbGlnbigpO1xuICAgIH07XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBNb3Rpb24gPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIHZhciBvblZpc2libGVDaGFuZ2VkID0gZnVuY3Rpb24gb25WaXNpYmxlQ2hhbmdlZCh2aXNpYmxlKSB7XG4gICAgICBzZXRJbk1vdGlvbihmYWxzZSk7XG4gICAgICBvbkFsaWduKCk7XG4gICAgICBhZnRlclBvcHVwVmlzaWJsZUNoYW5nZSA9PT0gbnVsbCB8fCBhZnRlclBvcHVwVmlzaWJsZUNoYW5nZSA9PT0gdm9pZCAwIHx8IGFmdGVyUG9wdXBWaXNpYmxlQ2hhbmdlKHZpc2libGUpO1xuICAgIH07XG5cbiAgICAvLyBXZSB3aWxsIHRyaWdnZXIgYWxpZ24gd2hlbiBtb3Rpb24gaXMgaW4gcHJlcGFyZVxuICAgIHZhciBvblByZXBhcmUgPSBmdW5jdGlvbiBvblByZXBhcmUoKSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgc3luY1RhcmdldFNpemUoKTtcbiAgICAgICAgc2V0TW90aW9uUHJlcGFyZVJlc29sdmUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChtb3Rpb25QcmVwYXJlUmVzb2x2ZSkge1xuICAgICAgICBvbkFsaWduKCk7XG4gICAgICAgIG1vdGlvblByZXBhcmVSZXNvbHZlKCk7XG4gICAgICAgIHNldE1vdGlvblByZXBhcmVSZXNvbHZlKG51bGwpO1xuICAgICAgfVxuICAgIH0sIFttb3Rpb25QcmVwYXJlUmVzb2x2ZV0pO1xuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IEFjdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvKipcbiAgICAgKiBVdGlsIHdyYXBwZXIgZm9yIHRyaWdnZXIgYWN0aW9uXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlckFjdGlvbihldmVudE5hbWUsIG5leHRPcGVuLCBkZWxheSwgcHJlRXZlbnQpIHtcbiAgICAgIGNsb25lUHJvcHNbZXZlbnROYW1lXSA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICB2YXIgX29yaWdpbkNoaWxkUHJvcHMkZXZlO1xuICAgICAgICBwcmVFdmVudCA9PT0gbnVsbCB8fCBwcmVFdmVudCA9PT0gdm9pZCAwIHx8IHByZUV2ZW50KGV2ZW50KTtcbiAgICAgICAgdHJpZ2dlck9wZW4obmV4dE9wZW4sIGRlbGF5KTtcblxuICAgICAgICAvLyBQYXNzIHRvIG9yaWdpblxuICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICAgIH1cbiAgICAgICAgKF9vcmlnaW5DaGlsZFByb3BzJGV2ZSA9IG9yaWdpbkNoaWxkUHJvcHNbZXZlbnROYW1lXSkgPT09IG51bGwgfHwgX29yaWdpbkNoaWxkUHJvcHMkZXZlID09PSB2b2lkIDAgfHwgX29yaWdpbkNoaWxkUHJvcHMkZXZlLmNhbGwuYXBwbHkoX29yaWdpbkNoaWxkUHJvcHMkZXZlLCBbb3JpZ2luQ2hpbGRQcm9wcywgZXZlbnRdLmNvbmNhdChhcmdzKSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09IEFjdGlvbjogQ2xpY2sgPT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgaWYgKGNsaWNrVG9TaG93IHx8IGNsaWNrVG9IaWRlKSB7XG4gICAgICBjbG9uZVByb3BzLm9uQ2xpY2sgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdmFyIF9vcmlnaW5DaGlsZFByb3BzJG9uQztcbiAgICAgICAgaWYgKG9wZW5SZWYuY3VycmVudCAmJiBjbGlja1RvSGlkZSkge1xuICAgICAgICAgIHRyaWdnZXJPcGVuKGZhbHNlKTtcbiAgICAgICAgfSBlbHNlIGlmICghb3BlblJlZi5jdXJyZW50ICYmIGNsaWNrVG9TaG93KSB7XG4gICAgICAgICAgc2V0TW91c2VQb3NCeUV2ZW50KGV2ZW50KTtcbiAgICAgICAgICB0cmlnZ2VyT3Blbih0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBhc3MgdG8gb3JpZ2luXG4gICAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgICAgYXJnc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgICAgfVxuICAgICAgICAoX29yaWdpbkNoaWxkUHJvcHMkb25DID0gb3JpZ2luQ2hpbGRQcm9wcy5vbkNsaWNrKSA9PT0gbnVsbCB8fCBfb3JpZ2luQ2hpbGRQcm9wcyRvbkMgPT09IHZvaWQgMCB8fCBfb3JpZ2luQ2hpbGRQcm9wcyRvbkMuY2FsbC5hcHBseShfb3JpZ2luQ2hpbGRQcm9wcyRvbkMsIFtvcmlnaW5DaGlsZFByb3BzLCBldmVudF0uY29uY2F0KGFyZ3MpKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ2xpY2sgdG8gaGlkZSBpcyBzcGVjaWFsIGFjdGlvbiBzaW5jZSBjbGljayBwb3B1cCBlbGVtZW50IHNob3VsZCBub3QgaGlkZVxuICAgIHZhciBvblBvcHVwUG9pbnRlckRvd24gPSB1c2VXaW5DbGljayhtZXJnZWRPcGVuLCBjbGlja1RvSGlkZSwgdGFyZ2V0RWxlLCBwb3B1cEVsZSwgbWFzaywgbWFza0Nsb3NhYmxlLCBpblBvcHVwT3JDaGlsZCwgdHJpZ2dlck9wZW4pO1xuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT0gQWN0aW9uOiBIb3ZlciA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICB2YXIgaG92ZXJUb1Nob3cgPSBzaG93QWN0aW9ucy5oYXMoJ2hvdmVyJyk7XG4gICAgdmFyIGhvdmVyVG9IaWRlID0gaGlkZUFjdGlvbnMuaGFzKCdob3ZlcicpO1xuICAgIHZhciBvblBvcHVwTW91c2VFbnRlcjtcbiAgICB2YXIgb25Qb3B1cE1vdXNlTGVhdmU7XG4gICAgaWYgKGhvdmVyVG9TaG93KSB7XG4gICAgICAvLyBDb21wYXRpYmxlIHdpdGggb2xkIGJyb3dzZXIgd2hpY2ggbm90IHN1cHBvcnQgcG9pbnRlciBldmVudFxuICAgICAgd3JhcHBlckFjdGlvbignb25Nb3VzZUVudGVyJywgdHJ1ZSwgbW91c2VFbnRlckRlbGF5LCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgc2V0TW91c2VQb3NCeUV2ZW50KGV2ZW50KTtcbiAgICAgIH0pO1xuICAgICAgd3JhcHBlckFjdGlvbignb25Qb2ludGVyRW50ZXInLCB0cnVlLCBtb3VzZUVudGVyRGVsYXksIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBzZXRNb3VzZVBvc0J5RXZlbnQoZXZlbnQpO1xuICAgICAgfSk7XG4gICAgICBvblBvcHVwTW91c2VFbnRlciA9IGZ1bmN0aW9uIG9uUG9wdXBNb3VzZUVudGVyKGV2ZW50KSB7XG4gICAgICAgIC8vIE9ubHkgdHJpZ2dlciByZS1vcGVuIHdoZW4gcG9wdXAgaXMgdmlzaWJsZVxuICAgICAgICBpZiAoKG1lcmdlZE9wZW4gfHwgaW5Nb3Rpb24pICYmIHBvcHVwRWxlICE9PSBudWxsICYmIHBvcHVwRWxlICE9PSB2b2lkIDAgJiYgcG9wdXBFbGUuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgICAgIHRyaWdnZXJPcGVuKHRydWUsIG1vdXNlRW50ZXJEZWxheSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIC8vIEFsaWduIFBvaW50XG4gICAgICBpZiAoYWxpZ25Qb2ludCkge1xuICAgICAgICBjbG9uZVByb3BzLm9uTW91c2VNb3ZlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgdmFyIF9vcmlnaW5DaGlsZFByb3BzJG9uTTtcbiAgICAgICAgICAvLyBzZXRNb3VzZVBvc0J5RXZlbnQoZXZlbnQpO1xuICAgICAgICAgIChfb3JpZ2luQ2hpbGRQcm9wcyRvbk0gPSBvcmlnaW5DaGlsZFByb3BzLm9uTW91c2VNb3ZlKSA9PT0gbnVsbCB8fCBfb3JpZ2luQ2hpbGRQcm9wcyRvbk0gPT09IHZvaWQgMCB8fCBfb3JpZ2luQ2hpbGRQcm9wcyRvbk0uY2FsbChvcmlnaW5DaGlsZFByb3BzLCBldmVudCk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChob3ZlclRvSGlkZSkge1xuICAgICAgd3JhcHBlckFjdGlvbignb25Nb3VzZUxlYXZlJywgZmFsc2UsIG1vdXNlTGVhdmVEZWxheSk7XG4gICAgICB3cmFwcGVyQWN0aW9uKCdvblBvaW50ZXJMZWF2ZScsIGZhbHNlLCBtb3VzZUxlYXZlRGVsYXkpO1xuICAgICAgb25Qb3B1cE1vdXNlTGVhdmUgPSBmdW5jdGlvbiBvblBvcHVwTW91c2VMZWF2ZSgpIHtcbiAgICAgICAgdHJpZ2dlck9wZW4oZmFsc2UsIG1vdXNlTGVhdmVEZWxheSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09IEFjdGlvbjogRm9jdXMgPT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgaWYgKHNob3dBY3Rpb25zLmhhcygnZm9jdXMnKSkge1xuICAgICAgd3JhcHBlckFjdGlvbignb25Gb2N1cycsIHRydWUsIGZvY3VzRGVsYXkpO1xuICAgIH1cbiAgICBpZiAoaGlkZUFjdGlvbnMuaGFzKCdmb2N1cycpKSB7XG4gICAgICB3cmFwcGVyQWN0aW9uKCdvbkJsdXInLCBmYWxzZSwgYmx1ckRlbGF5KTtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PSBBY3Rpb246IENvbnRleHRNZW51ID09PT09PT09PT09PT09PT09PT09PVxuICAgIGlmIChzaG93QWN0aW9ucy5oYXMoJ2NvbnRleHRNZW51JykpIHtcbiAgICAgIGNsb25lUHJvcHMub25Db250ZXh0TWVudSA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICB2YXIgX29yaWdpbkNoaWxkUHJvcHMkb25DMjtcbiAgICAgICAgaWYgKG9wZW5SZWYuY3VycmVudCAmJiBoaWRlQWN0aW9ucy5oYXMoJ2NvbnRleHRNZW51JykpIHtcbiAgICAgICAgICB0cmlnZ2VyT3BlbihmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0TW91c2VQb3NCeUV2ZW50KGV2ZW50KTtcbiAgICAgICAgICB0cmlnZ2VyT3Blbih0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIC8vIFBhc3MgdG8gb3JpZ2luXG4gICAgICAgIGZvciAodmFyIF9sZW4zID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMyA+IDEgPyBfbGVuMyAtIDEgOiAwKSwgX2tleTMgPSAxOyBfa2V5MyA8IF9sZW4zOyBfa2V5MysrKSB7XG4gICAgICAgICAgYXJnc1tfa2V5MyAtIDFdID0gYXJndW1lbnRzW19rZXkzXTtcbiAgICAgICAgfVxuICAgICAgICAoX29yaWdpbkNoaWxkUHJvcHMkb25DMiA9IG9yaWdpbkNoaWxkUHJvcHMub25Db250ZXh0TWVudSkgPT09IG51bGwgfHwgX29yaWdpbkNoaWxkUHJvcHMkb25DMiA9PT0gdm9pZCAwIHx8IF9vcmlnaW5DaGlsZFByb3BzJG9uQzIuY2FsbC5hcHBseShfb3JpZ2luQ2hpbGRQcm9wcyRvbkMyLCBbb3JpZ2luQ2hpbGRQcm9wcywgZXZlbnRdLmNvbmNhdChhcmdzKSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gQ2xhc3NOYW1lID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgaWYgKGNsYXNzTmFtZSkge1xuICAgICAgY2xvbmVQcm9wcy5jbGFzc05hbWUgPSBjbGFzc05hbWVzKG9yaWdpbkNoaWxkUHJvcHMuY2xhc3NOYW1lLCBjbGFzc05hbWUpO1xuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgdmFyIG1lcmdlZENoaWxkcmVuUHJvcHMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG9yaWdpbkNoaWxkUHJvcHMpLCBjbG9uZVByb3BzKTtcblxuICAgIC8vIFBhc3MgcHJvcHMgaW50byBjbG9uZVByb3BzIGZvciBuZXN0IHVzYWdlXG4gICAgdmFyIHBhc3NlZFByb3BzID0ge307XG4gICAgdmFyIHBhc3NlZEV2ZW50TGlzdCA9IFsnb25Db250ZXh0TWVudScsICdvbkNsaWNrJywgJ29uTW91c2VEb3duJywgJ29uVG91Y2hTdGFydCcsICdvbk1vdXNlRW50ZXInLCAnb25Nb3VzZUxlYXZlJywgJ29uRm9jdXMnLCAnb25CbHVyJ107XG4gICAgcGFzc2VkRXZlbnRMaXN0LmZvckVhY2goZnVuY3Rpb24gKGV2ZW50TmFtZSkge1xuICAgICAgaWYgKHJlc3RQcm9wc1tldmVudE5hbWVdKSB7XG4gICAgICAgIHBhc3NlZFByb3BzW2V2ZW50TmFtZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIF9tZXJnZWRDaGlsZHJlblByb3BzJDtcbiAgICAgICAgICBmb3IgKHZhciBfbGVuNCA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjQpLCBfa2V5NCA9IDA7IF9rZXk0IDwgX2xlbjQ7IF9rZXk0KyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2tleTRdID0gYXJndW1lbnRzW19rZXk0XTtcbiAgICAgICAgICB9XG4gICAgICAgICAgKF9tZXJnZWRDaGlsZHJlblByb3BzJCA9IG1lcmdlZENoaWxkcmVuUHJvcHNbZXZlbnROYW1lXSkgPT09IG51bGwgfHwgX21lcmdlZENoaWxkcmVuUHJvcHMkID09PSB2b2lkIDAgfHwgX21lcmdlZENoaWxkcmVuUHJvcHMkLmNhbGwuYXBwbHkoX21lcmdlZENoaWxkcmVuUHJvcHMkLCBbbWVyZ2VkQ2hpbGRyZW5Qcm9wc10uY29uY2F0KGFyZ3MpKTtcbiAgICAgICAgICByZXN0UHJvcHNbZXZlbnROYW1lXS5hcHBseShyZXN0UHJvcHMsIGFyZ3MpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQ2hpbGQgTm9kZVxuICAgIHZhciB0cmlnZ2VyTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGQsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgbWVyZ2VkQ2hpbGRyZW5Qcm9wcyksIHBhc3NlZFByb3BzKSk7XG4gICAgdmFyIGFycm93UG9zID0ge1xuICAgICAgeDogYXJyb3dYLFxuICAgICAgeTogYXJyb3dZXG4gICAgfTtcbiAgICB2YXIgaW5uZXJBcnJvdyA9IGFycm93ID8gX29iamVjdFNwcmVhZCh7fSwgYXJyb3cgIT09IHRydWUgPyBhcnJvdyA6IHt9KSA6IG51bGw7XG5cbiAgICAvLyBSZW5kZXJcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlc2l6ZU9ic2VydmVyLCB7XG4gICAgICBkaXNhYmxlZDogIW1lcmdlZE9wZW4sXG4gICAgICByZWY6IHNldFRhcmdldFJlZixcbiAgICAgIG9uUmVzaXplOiBvblRhcmdldFJlc2l6ZVxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRyaWdnZXJXcmFwcGVyLCB7XG4gICAgICBnZXRUcmlnZ2VyRE9NTm9kZTogZ2V0VHJpZ2dlckRPTU5vZGVcbiAgICB9LCB0cmlnZ2VyTm9kZSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUcmlnZ2VyQ29udGV4dC5Qcm92aWRlciwge1xuICAgICAgdmFsdWU6IGNvbnRleHRcbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQb3B1cCwge1xuICAgICAgcG9ydGFsOiBQb3J0YWxDb21wb25lbnQsXG4gICAgICByZWY6IHNldFBvcHVwUmVmLFxuICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICBwb3B1cDogcG9wdXAsXG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMocG9wdXBDbGFzc05hbWUsIGFsaWduZWRDbGFzc05hbWUpLFxuICAgICAgc3R5bGU6IHBvcHVwU3R5bGUsXG4gICAgICB0YXJnZXQ6IHRhcmdldEVsZSxcbiAgICAgIG9uTW91c2VFbnRlcjogb25Qb3B1cE1vdXNlRW50ZXIsXG4gICAgICBvbk1vdXNlTGVhdmU6IG9uUG9wdXBNb3VzZUxlYXZlXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy80MzkyNFxuICAgICAgLFxuICAgICAgb25Qb2ludGVyRW50ZXI6IG9uUG9wdXBNb3VzZUVudGVyLFxuICAgICAgekluZGV4OiB6SW5kZXhcbiAgICAgIC8vIE9wZW5cbiAgICAgICxcbiAgICAgIG9wZW46IG1lcmdlZE9wZW4sXG4gICAgICBrZWVwRG9tOiBpbk1vdGlvbixcbiAgICAgIGZyZXNoOiBmcmVzaFxuICAgICAgLy8gQ2xpY2tcbiAgICAgICxcbiAgICAgIG9uQ2xpY2s6IG9uUG9wdXBDbGljayxcbiAgICAgIG9uUG9pbnRlckRvd25DYXB0dXJlOiBvblBvcHVwUG9pbnRlckRvd25cbiAgICAgIC8vIE1hc2tcbiAgICAgICxcbiAgICAgIG1hc2s6IG1hc2tcbiAgICAgIC8vIE1vdGlvblxuICAgICAgLFxuICAgICAgbW90aW9uOiBtZXJnZVBvcHVwTW90aW9uLFxuICAgICAgbWFza01vdGlvbjogbWVyZ2VNYXNrTW90aW9uLFxuICAgICAgb25WaXNpYmxlQ2hhbmdlZDogb25WaXNpYmxlQ2hhbmdlZCxcbiAgICAgIG9uUHJlcGFyZTogb25QcmVwYXJlXG4gICAgICAvLyBQb3J0YWxcbiAgICAgICxcbiAgICAgIGZvcmNlUmVuZGVyOiBmb3JjZVJlbmRlcixcbiAgICAgIGF1dG9EZXN0cm95OiBtZXJnZWRBdXRvRGVzdHJveSxcbiAgICAgIGdldFBvcHVwQ29udGFpbmVyOiBnZXRQb3B1cENvbnRhaW5lclxuICAgICAgLy8gQXJyb3dcbiAgICAgICxcbiAgICAgIGFsaWduOiBhbGlnbkluZm8sXG4gICAgICBhcnJvdzogaW5uZXJBcnJvdyxcbiAgICAgIGFycm93UG9zOiBhcnJvd1Bvc1xuICAgICAgLy8gQWxpZ25cbiAgICAgICxcbiAgICAgIHJlYWR5OiByZWFkeSxcbiAgICAgIG9mZnNldFg6IG9mZnNldFgsXG4gICAgICBvZmZzZXRZOiBvZmZzZXRZLFxuICAgICAgb2Zmc2V0Ujogb2Zmc2V0UixcbiAgICAgIG9mZnNldEI6IG9mZnNldEIsXG4gICAgICBvbkFsaWduOiB0cmlnZ2VyQWxpZ25cbiAgICAgIC8vIFN0cmV0Y2hcbiAgICAgICxcbiAgICAgIHN0cmV0Y2g6IHN0cmV0Y2gsXG4gICAgICB0YXJnZXRXaWR0aDogdGFyZ2V0V2lkdGggLyBzY2FsZVgsXG4gICAgICB0YXJnZXRIZWlnaHQ6IHRhcmdldEhlaWdodCAvIHNjYWxlWVxuICAgIH0pKSk7XG4gIH0pO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIFRyaWdnZXIuZGlzcGxheU5hbWUgPSAnVHJpZ2dlcic7XG4gIH1cbiAgcmV0dXJuIFRyaWdnZXI7XG59XG5leHBvcnQgZGVmYXVsdCBnZW5lcmF0ZVRyaWdnZXIoUG9ydGFsKTsiLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBDU1NNb3Rpb24gZnJvbSAncmMtbW90aW9uJztcbmltcG9ydCBSZXNpemVPYnNlcnZlciBmcm9tICdyYy1yZXNpemUtb2JzZXJ2ZXInO1xuaW1wb3J0IHVzZUxheW91dEVmZmVjdCBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VMYXlvdXRFZmZlY3RcIjtcbmltcG9ydCB7IGNvbXBvc2VSZWYgfSBmcm9tIFwicmMtdXRpbC9lcy9yZWZcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBBcnJvdyBmcm9tIFwiLi9BcnJvd1wiO1xuaW1wb3J0IE1hc2sgZnJvbSBcIi4vTWFza1wiO1xuaW1wb3J0IFBvcHVwQ29udGVudCBmcm9tIFwiLi9Qb3B1cENvbnRlbnRcIjtcbnZhciBQb3B1cCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBwb3B1cCA9IHByb3BzLnBvcHVwLFxuICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICB0YXJnZXQgPSBwcm9wcy50YXJnZXQsXG4gICAgX29uVmlzaWJsZUNoYW5nZWQgPSBwcm9wcy5vblZpc2libGVDaGFuZ2VkLFxuICAgIG9wZW4gPSBwcm9wcy5vcGVuLFxuICAgIGtlZXBEb20gPSBwcm9wcy5rZWVwRG9tLFxuICAgIGZyZXNoID0gcHJvcHMuZnJlc2gsXG4gICAgb25DbGljayA9IHByb3BzLm9uQ2xpY2ssXG4gICAgbWFzayA9IHByb3BzLm1hc2ssXG4gICAgYXJyb3cgPSBwcm9wcy5hcnJvdyxcbiAgICBhcnJvd1BvcyA9IHByb3BzLmFycm93UG9zLFxuICAgIGFsaWduID0gcHJvcHMuYWxpZ24sXG4gICAgbW90aW9uID0gcHJvcHMubW90aW9uLFxuICAgIG1hc2tNb3Rpb24gPSBwcm9wcy5tYXNrTW90aW9uLFxuICAgIGZvcmNlUmVuZGVyID0gcHJvcHMuZm9yY2VSZW5kZXIsXG4gICAgZ2V0UG9wdXBDb250YWluZXIgPSBwcm9wcy5nZXRQb3B1cENvbnRhaW5lcixcbiAgICBhdXRvRGVzdHJveSA9IHByb3BzLmF1dG9EZXN0cm95LFxuICAgIFBvcnRhbCA9IHByb3BzLnBvcnRhbCxcbiAgICB6SW5kZXggPSBwcm9wcy56SW5kZXgsXG4gICAgb25Nb3VzZUVudGVyID0gcHJvcHMub25Nb3VzZUVudGVyLFxuICAgIG9uTW91c2VMZWF2ZSA9IHByb3BzLm9uTW91c2VMZWF2ZSxcbiAgICBvblBvaW50ZXJFbnRlciA9IHByb3BzLm9uUG9pbnRlckVudGVyLFxuICAgIG9uUG9pbnRlckRvd25DYXB0dXJlID0gcHJvcHMub25Qb2ludGVyRG93bkNhcHR1cmUsXG4gICAgcmVhZHkgPSBwcm9wcy5yZWFkeSxcbiAgICBvZmZzZXRYID0gcHJvcHMub2Zmc2V0WCxcbiAgICBvZmZzZXRZID0gcHJvcHMub2Zmc2V0WSxcbiAgICBvZmZzZXRSID0gcHJvcHMub2Zmc2V0UixcbiAgICBvZmZzZXRCID0gcHJvcHMub2Zmc2V0QixcbiAgICBvbkFsaWduID0gcHJvcHMub25BbGlnbixcbiAgICBvblByZXBhcmUgPSBwcm9wcy5vblByZXBhcmUsXG4gICAgc3RyZXRjaCA9IHByb3BzLnN0cmV0Y2gsXG4gICAgdGFyZ2V0V2lkdGggPSBwcm9wcy50YXJnZXRXaWR0aCxcbiAgICB0YXJnZXRIZWlnaHQgPSBwcm9wcy50YXJnZXRIZWlnaHQ7XG4gIHZhciBjaGlsZE5vZGUgPSB0eXBlb2YgcG9wdXAgPT09ICdmdW5jdGlvbicgPyBwb3B1cCgpIDogcG9wdXA7XG5cbiAgLy8gV2UgY2FuIG5vdCByZW1vdmUgaG9sZGVyIG9ubHkgd2hlbiBtb3Rpb24gZmluaXNoZWQuXG4gIHZhciBpc05vZGVWaXNpYmxlID0gb3BlbiB8fCBrZWVwRG9tO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09IENvbnRhaW5lciA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGdldFBvcHVwQ29udGFpbmVyTmVlZFBhcmFtcyA9IChnZXRQb3B1cENvbnRhaW5lciA9PT0gbnVsbCB8fCBnZXRQb3B1cENvbnRhaW5lciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZ2V0UG9wdXBDb250YWluZXIubGVuZ3RoKSA+IDA7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZSghZ2V0UG9wdXBDb250YWluZXIgfHwgIWdldFBvcHVwQ29udGFpbmVyTmVlZFBhcmFtcyksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgc2hvdyA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0U2hvdyA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG5cbiAgLy8gRGVsYXkgdG8gc2hvdyBzaW5jZSBgZ2V0UG9wdXBDb250YWluZXJgIG5lZWQgdGFyZ2V0IGVsZW1lbnRcbiAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXNob3cgJiYgZ2V0UG9wdXBDb250YWluZXJOZWVkUGFyYW1zICYmIHRhcmdldCkge1xuICAgICAgc2V0U2hvdyh0cnVlKTtcbiAgICB9XG4gIH0sIFtzaG93LCBnZXRQb3B1cENvbnRhaW5lck5lZWRQYXJhbXMsIHRhcmdldF0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgaWYgKCFzaG93KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyA+Pj4+PiBPZmZzZXRcbiAgdmFyIEFVVE8gPSAnYXV0byc7XG4gIHZhciBvZmZzZXRTdHlsZSA9IHtcbiAgICBsZWZ0OiAnLTEwMDB2dycsXG4gICAgdG9wOiAnLTEwMDB2aCcsXG4gICAgcmlnaHQ6IEFVVE8sXG4gICAgYm90dG9tOiBBVVRPXG4gIH07XG5cbiAgLy8gU2V0IGFsaWduIHN0eWxlXG4gIGlmIChyZWFkeSB8fCAhb3Blbikge1xuICAgIHZhciBfZXhwZXJpbWVudGFsO1xuICAgIHZhciBwb2ludHMgPSBhbGlnbi5wb2ludHM7XG4gICAgdmFyIGR5bmFtaWNJbnNldCA9IGFsaWduLmR5bmFtaWNJbnNldCB8fCAoKF9leHBlcmltZW50YWwgPSBhbGlnbi5fZXhwZXJpbWVudGFsKSA9PT0gbnVsbCB8fCBfZXhwZXJpbWVudGFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZXhwZXJpbWVudGFsLmR5bmFtaWNJbnNldCk7XG4gICAgdmFyIGFsaWduUmlnaHQgPSBkeW5hbWljSW5zZXQgJiYgcG9pbnRzWzBdWzFdID09PSAncic7XG4gICAgdmFyIGFsaWduQm90dG9tID0gZHluYW1pY0luc2V0ICYmIHBvaW50c1swXVswXSA9PT0gJ2InO1xuICAgIGlmIChhbGlnblJpZ2h0KSB7XG4gICAgICBvZmZzZXRTdHlsZS5yaWdodCA9IG9mZnNldFI7XG4gICAgICBvZmZzZXRTdHlsZS5sZWZ0ID0gQVVUTztcbiAgICB9IGVsc2Uge1xuICAgICAgb2Zmc2V0U3R5bGUubGVmdCA9IG9mZnNldFg7XG4gICAgICBvZmZzZXRTdHlsZS5yaWdodCA9IEFVVE87XG4gICAgfVxuICAgIGlmIChhbGlnbkJvdHRvbSkge1xuICAgICAgb2Zmc2V0U3R5bGUuYm90dG9tID0gb2Zmc2V0QjtcbiAgICAgIG9mZnNldFN0eWxlLnRvcCA9IEFVVE87XG4gICAgfSBlbHNlIHtcbiAgICAgIG9mZnNldFN0eWxlLnRvcCA9IG9mZnNldFk7XG4gICAgICBvZmZzZXRTdHlsZS5ib3R0b20gPSBBVVRPO1xuICAgIH1cbiAgfVxuXG4gIC8vID4+Pj4+IE1pc2NcbiAgdmFyIG1pc2NTdHlsZSA9IHt9O1xuICBpZiAoc3RyZXRjaCkge1xuICAgIGlmIChzdHJldGNoLmluY2x1ZGVzKCdoZWlnaHQnKSAmJiB0YXJnZXRIZWlnaHQpIHtcbiAgICAgIG1pc2NTdHlsZS5oZWlnaHQgPSB0YXJnZXRIZWlnaHQ7XG4gICAgfSBlbHNlIGlmIChzdHJldGNoLmluY2x1ZGVzKCdtaW5IZWlnaHQnKSAmJiB0YXJnZXRIZWlnaHQpIHtcbiAgICAgIG1pc2NTdHlsZS5taW5IZWlnaHQgPSB0YXJnZXRIZWlnaHQ7XG4gICAgfVxuICAgIGlmIChzdHJldGNoLmluY2x1ZGVzKCd3aWR0aCcpICYmIHRhcmdldFdpZHRoKSB7XG4gICAgICBtaXNjU3R5bGUud2lkdGggPSB0YXJnZXRXaWR0aDtcbiAgICB9IGVsc2UgaWYgKHN0cmV0Y2guaW5jbHVkZXMoJ21pbldpZHRoJykgJiYgdGFyZ2V0V2lkdGgpIHtcbiAgICAgIG1pc2NTdHlsZS5taW5XaWR0aCA9IHRhcmdldFdpZHRoO1xuICAgIH1cbiAgfVxuICBpZiAoIW9wZW4pIHtcbiAgICBtaXNjU3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUG9ydGFsLCB7XG4gICAgb3BlbjogZm9yY2VSZW5kZXIgfHwgaXNOb2RlVmlzaWJsZSxcbiAgICBnZXRDb250YWluZXI6IGdldFBvcHVwQ29udGFpbmVyICYmIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBnZXRQb3B1cENvbnRhaW5lcih0YXJnZXQpO1xuICAgIH0sXG4gICAgYXV0b0Rlc3Ryb3k6IGF1dG9EZXN0cm95XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE1hc2ssIHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBvcGVuOiBvcGVuLFxuICAgIHpJbmRleDogekluZGV4LFxuICAgIG1hc2s6IG1hc2ssXG4gICAgbW90aW9uOiBtYXNrTW90aW9uXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZXNpemVPYnNlcnZlciwge1xuICAgIG9uUmVzaXplOiBvbkFsaWduLFxuICAgIGRpc2FibGVkOiAhb3BlblxuICB9LCBmdW5jdGlvbiAocmVzaXplT2JzZXJ2ZXJSZWYpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ1NTTW90aW9uLCBfZXh0ZW5kcyh7XG4gICAgICBtb3Rpb25BcHBlYXI6IHRydWUsXG4gICAgICBtb3Rpb25FbnRlcjogdHJ1ZSxcbiAgICAgIG1vdGlvbkxlYXZlOiB0cnVlLFxuICAgICAgcmVtb3ZlT25MZWF2ZTogZmFsc2UsXG4gICAgICBmb3JjZVJlbmRlcjogZm9yY2VSZW5kZXIsXG4gICAgICBsZWF2ZWRDbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaGlkZGVuXCIpXG4gICAgfSwgbW90aW9uLCB7XG4gICAgICBvbkFwcGVhclByZXBhcmU6IG9uUHJlcGFyZSxcbiAgICAgIG9uRW50ZXJQcmVwYXJlOiBvblByZXBhcmUsXG4gICAgICB2aXNpYmxlOiBvcGVuLFxuICAgICAgb25WaXNpYmxlQ2hhbmdlZDogZnVuY3Rpb24gb25WaXNpYmxlQ2hhbmdlZChuZXh0VmlzaWJsZSkge1xuICAgICAgICB2YXIgX21vdGlvbiRvblZpc2libGVDaGFuO1xuICAgICAgICBtb3Rpb24gPT09IG51bGwgfHwgbW90aW9uID09PSB2b2lkIDAgfHwgKF9tb3Rpb24kb25WaXNpYmxlQ2hhbiA9IG1vdGlvbi5vblZpc2libGVDaGFuZ2VkKSA9PT0gbnVsbCB8fCBfbW90aW9uJG9uVmlzaWJsZUNoYW4gPT09IHZvaWQgMCB8fCBfbW90aW9uJG9uVmlzaWJsZUNoYW4uY2FsbChtb3Rpb24sIG5leHRWaXNpYmxlKTtcbiAgICAgICAgX29uVmlzaWJsZUNoYW5nZWQobmV4dFZpc2libGUpO1xuICAgICAgfVxuICAgIH0pLCBmdW5jdGlvbiAoX3JlZiwgbW90aW9uUmVmKSB7XG4gICAgICB2YXIgbW90aW9uQ2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsXG4gICAgICAgIG1vdGlvblN0eWxlID0gX3JlZi5zdHlsZTtcbiAgICAgIHZhciBjbHMgPSBjbGFzc05hbWVzKHByZWZpeENscywgbW90aW9uQ2xhc3NOYW1lLCBjbGFzc05hbWUpO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgcmVmOiBjb21wb3NlUmVmKHJlc2l6ZU9ic2VydmVyUmVmLCByZWYsIG1vdGlvblJlZiksXG4gICAgICAgIGNsYXNzTmFtZTogY2xzLFxuICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7XG4gICAgICAgICAgJy0tYXJyb3cteCc6IFwiXCIuY29uY2F0KGFycm93UG9zLnggfHwgMCwgXCJweFwiKSxcbiAgICAgICAgICAnLS1hcnJvdy15JzogXCJcIi5jb25jYXQoYXJyb3dQb3MueSB8fCAwLCBcInB4XCIpXG4gICAgICAgIH0sIG9mZnNldFN0eWxlKSwgbWlzY1N0eWxlKSwgbW90aW9uU3R5bGUpLCB7fSwge1xuICAgICAgICAgIGJveFNpemluZzogJ2JvcmRlci1ib3gnLFxuICAgICAgICAgIHpJbmRleDogekluZGV4XG4gICAgICAgIH0sIHN0eWxlKSxcbiAgICAgICAgb25Nb3VzZUVudGVyOiBvbk1vdXNlRW50ZXIsXG4gICAgICAgIG9uTW91c2VMZWF2ZTogb25Nb3VzZUxlYXZlLFxuICAgICAgICBvblBvaW50ZXJFbnRlcjogb25Qb2ludGVyRW50ZXIsXG4gICAgICAgIG9uQ2xpY2s6IG9uQ2xpY2ssXG4gICAgICAgIG9uUG9pbnRlckRvd25DYXB0dXJlOiBvblBvaW50ZXJEb3duQ2FwdHVyZVxuICAgICAgfSwgYXJyb3cgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQXJyb3csIHtcbiAgICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICAgIGFycm93OiBhcnJvdyxcbiAgICAgICAgYXJyb3dQb3M6IGFycm93UG9zLFxuICAgICAgICBhbGlnbjogYWxpZ25cbiAgICAgIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQb3B1cENvbnRlbnQsIHtcbiAgICAgICAgY2FjaGU6ICFvcGVuICYmICFmcmVzaFxuICAgICAgfSwgY2hpbGROb2RlKSk7XG4gICAgfSk7XG4gIH0pKTtcbn0pO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgUG9wdXAuZGlzcGxheU5hbWUgPSAnUG9wdXAnO1xufVxuZXhwb3J0IGRlZmF1bHQgUG9wdXA7IiwgImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQXJyb3cocHJvcHMpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBhbGlnbiA9IHByb3BzLmFsaWduLFxuICAgIGFycm93ID0gcHJvcHMuYXJyb3csXG4gICAgYXJyb3dQb3MgPSBwcm9wcy5hcnJvd1BvcztcbiAgdmFyIF9yZWYgPSBhcnJvdyB8fCB7fSxcbiAgICBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICBjb250ZW50ID0gX3JlZi5jb250ZW50O1xuICB2YXIgX2Fycm93UG9zJHggPSBhcnJvd1Bvcy54LFxuICAgIHggPSBfYXJyb3dQb3MkeCA9PT0gdm9pZCAwID8gMCA6IF9hcnJvd1BvcyR4LFxuICAgIF9hcnJvd1BvcyR5ID0gYXJyb3dQb3MueSxcbiAgICB5ID0gX2Fycm93UG9zJHkgPT09IHZvaWQgMCA/IDAgOiBfYXJyb3dQb3MkeTtcbiAgdmFyIGFycm93UmVmID0gUmVhY3QudXNlUmVmKCk7XG5cbiAgLy8gU2tpcCBpZiBubyBhbGlnblxuICBpZiAoIWFsaWduIHx8ICFhbGlnbi5wb2ludHMpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2YXIgYWxpZ25TdHlsZSA9IHtcbiAgICBwb3NpdGlvbjogJ2Fic29sdXRlJ1xuICB9O1xuXG4gIC8vIFNraXAgaWYgbm8gbmVlZCB0byBhbGlnblxuICBpZiAoYWxpZ24uYXV0b0Fycm93ICE9PSBmYWxzZSkge1xuICAgIHZhciBwb3B1cFBvaW50cyA9IGFsaWduLnBvaW50c1swXTtcbiAgICB2YXIgdGFyZ2V0UG9pbnRzID0gYWxpZ24ucG9pbnRzWzFdO1xuICAgIHZhciBwb3B1cFRCID0gcG9wdXBQb2ludHNbMF07XG4gICAgdmFyIHBvcHVwTFIgPSBwb3B1cFBvaW50c1sxXTtcbiAgICB2YXIgdGFyZ2V0VEIgPSB0YXJnZXRQb2ludHNbMF07XG4gICAgdmFyIHRhcmdldExSID0gdGFyZ2V0UG9pbnRzWzFdO1xuXG4gICAgLy8gVG9wICYgQm90dG9tXG4gICAgaWYgKHBvcHVwVEIgPT09IHRhcmdldFRCIHx8ICFbJ3QnLCAnYiddLmluY2x1ZGVzKHBvcHVwVEIpKSB7XG4gICAgICBhbGlnblN0eWxlLnRvcCA9IHk7XG4gICAgfSBlbHNlIGlmIChwb3B1cFRCID09PSAndCcpIHtcbiAgICAgIGFsaWduU3R5bGUudG9wID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgYWxpZ25TdHlsZS5ib3R0b20gPSAwO1xuICAgIH1cblxuICAgIC8vIExlZnQgJiBSaWdodFxuICAgIGlmIChwb3B1cExSID09PSB0YXJnZXRMUiB8fCAhWydsJywgJ3InXS5pbmNsdWRlcyhwb3B1cExSKSkge1xuICAgICAgYWxpZ25TdHlsZS5sZWZ0ID0geDtcbiAgICB9IGVsc2UgaWYgKHBvcHVwTFIgPT09ICdsJykge1xuICAgICAgYWxpZ25TdHlsZS5sZWZ0ID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgYWxpZ25TdHlsZS5yaWdodCA9IDA7XG4gICAgfVxuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgcmVmOiBhcnJvd1JlZixcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hcnJvd1wiKSwgY2xhc3NOYW1lKSxcbiAgICBzdHlsZTogYWxpZ25TdHlsZVxuICB9LCBjb250ZW50KTtcbn0iLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBDU1NNb3Rpb24gZnJvbSAncmMtbW90aW9uJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIE1hc2socHJvcHMpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBvcGVuID0gcHJvcHMub3BlbixcbiAgICB6SW5kZXggPSBwcm9wcy56SW5kZXgsXG4gICAgbWFzayA9IHByb3BzLm1hc2ssXG4gICAgbW90aW9uID0gcHJvcHMubW90aW9uO1xuICBpZiAoIW1hc2spIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ1NTTW90aW9uLCBfZXh0ZW5kcyh7fSwgbW90aW9uLCB7XG4gICAgbW90aW9uQXBwZWFyOiB0cnVlLFxuICAgIHZpc2libGU6IG9wZW4sXG4gICAgcmVtb3ZlT25MZWF2ZTogdHJ1ZVxuICB9KSwgZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIgY2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWU7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIHpJbmRleDogekluZGV4XG4gICAgICB9LFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbWFza1wiKSwgY2xhc3NOYW1lKVxuICAgIH0pO1xuICB9KTtcbn0iLCAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xudmFyIFBvcHVwQ29udGVudCA9IC8qI19fUFVSRV9fKi9SZWFjdC5tZW1vKGZ1bmN0aW9uIChfcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW47XG4gIHJldHVybiBjaGlsZHJlbjtcbn0sIGZ1bmN0aW9uIChfLCBuZXh0KSB7XG4gIHJldHVybiBuZXh0LmNhY2hlO1xufSk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBQb3B1cENvbnRlbnQuZGlzcGxheU5hbWUgPSAnUG9wdXBDb250ZW50Jztcbn1cbmV4cG9ydCBkZWZhdWx0IFBvcHVwQ29udGVudDsiLCAiaW1wb3J0IHsgZmlsbFJlZiwgZ2V0Tm9kZVJlZiwgc3VwcG9ydFJlZiwgdXNlQ29tcG9zZVJlZiB9IGZyb20gXCJyYy11dGlsL2VzL3JlZlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xudmFyIFRyaWdnZXJXcmFwcGVyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgZ2V0VHJpZ2dlckRPTU5vZGUgPSBwcm9wcy5nZXRUcmlnZ2VyRE9NTm9kZTtcbiAgdmFyIGNhblVzZVJlZiA9IHN1cHBvcnRSZWYoY2hpbGRyZW4pO1xuXG4gIC8vIFdoZW4gdXNlIGBnZXRUcmlnZ2VyRE9NTm9kZWAsIHdlIHNob3VsZCBkbyBhZGRpdGlvbmFsIHdvcmsgdG8gZ2V0IHRoZSByZWFsIGRvbVxuICB2YXIgc2V0UmVmID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKG5vZGUpIHtcbiAgICBmaWxsUmVmKHJlZiwgZ2V0VHJpZ2dlckRPTU5vZGUgPyBnZXRUcmlnZ2VyRE9NTm9kZShub2RlKSA6IG5vZGUpO1xuICB9LCBbZ2V0VHJpZ2dlckRPTU5vZGVdKTtcbiAgdmFyIG1lcmdlZFJlZiA9IHVzZUNvbXBvc2VSZWYoc2V0UmVmLCBnZXROb2RlUmVmKGNoaWxkcmVuKSk7XG4gIHJldHVybiBjYW5Vc2VSZWYgPyAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkcmVuLCB7XG4gICAgcmVmOiBtZXJnZWRSZWZcbiAgfSkgOiBjaGlsZHJlbjtcbn0pO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgVHJpZ2dlcldyYXBwZXIuZGlzcGxheU5hbWUgPSAnVHJpZ2dlcldyYXBwZXInO1xufVxuZXhwb3J0IGRlZmF1bHQgVHJpZ2dlcldyYXBwZXI7IiwgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbnZhciBUcmlnZ2VyQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuZXhwb3J0IGRlZmF1bHQgVHJpZ2dlckNvbnRleHQ7IiwgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmZ1bmN0aW9uIHRvQXJyYXkodmFsKSB7XG4gIHJldHVybiB2YWwgPyBBcnJheS5pc0FycmF5KHZhbCkgPyB2YWwgOiBbdmFsXSA6IFtdO1xufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlQWN0aW9uKG1vYmlsZSwgYWN0aW9uLCBzaG93QWN0aW9uLCBoaWRlQWN0aW9uKSB7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbWVyZ2VkU2hvd0FjdGlvbiA9IHRvQXJyYXkoc2hvd0FjdGlvbiAhPT0gbnVsbCAmJiBzaG93QWN0aW9uICE9PSB2b2lkIDAgPyBzaG93QWN0aW9uIDogYWN0aW9uKTtcbiAgICB2YXIgbWVyZ2VkSGlkZUFjdGlvbiA9IHRvQXJyYXkoaGlkZUFjdGlvbiAhPT0gbnVsbCAmJiBoaWRlQWN0aW9uICE9PSB2b2lkIDAgPyBoaWRlQWN0aW9uIDogYWN0aW9uKTtcbiAgICB2YXIgc2hvd0FjdGlvblNldCA9IG5ldyBTZXQobWVyZ2VkU2hvd0FjdGlvbik7XG4gICAgdmFyIGhpZGVBY3Rpb25TZXQgPSBuZXcgU2V0KG1lcmdlZEhpZGVBY3Rpb24pO1xuICAgIGlmIChtb2JpbGUpIHtcbiAgICAgIGlmIChzaG93QWN0aW9uU2V0LmhhcygnaG92ZXInKSkge1xuICAgICAgICBzaG93QWN0aW9uU2V0LmRlbGV0ZSgnaG92ZXInKTtcbiAgICAgICAgc2hvd0FjdGlvblNldC5hZGQoJ2NsaWNrJyk7XG4gICAgICB9XG4gICAgICBpZiAoaGlkZUFjdGlvblNldC5oYXMoJ2hvdmVyJykpIHtcbiAgICAgICAgaGlkZUFjdGlvblNldC5kZWxldGUoJ2hvdmVyJyk7XG4gICAgICAgIGhpZGVBY3Rpb25TZXQuYWRkKCdjbGljaycpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW3Nob3dBY3Rpb25TZXQsIGhpZGVBY3Rpb25TZXRdO1xuICB9LCBbbW9iaWxlLCBhY3Rpb24sIHNob3dBY3Rpb24sIGhpZGVBY3Rpb25dKTtcbn0iLCAiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IHsgaXNET00gfSBmcm9tIFwicmMtdXRpbC9lcy9Eb20vZmluZERPTU5vZGVcIjtcbmltcG9ydCBpc1Zpc2libGUgZnJvbSBcInJjLXV0aWwvZXMvRG9tL2lzVmlzaWJsZVwiO1xuaW1wb3J0IHVzZUV2ZW50IGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZUV2ZW50XCI7XG5pbXBvcnQgdXNlTGF5b3V0RWZmZWN0IGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZUxheW91dEVmZmVjdFwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY29sbGVjdFNjcm9sbGVyLCBnZXRWaXNpYmxlQXJlYSwgZ2V0V2luLCB0b051bSB9IGZyb20gXCIuLi91dGlsXCI7XG5mdW5jdGlvbiBnZXRVbml0T2Zmc2V0KHNpemUpIHtcbiAgdmFyIG9mZnNldCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMDtcbiAgdmFyIG9mZnNldFN0ciA9IFwiXCIuY29uY2F0KG9mZnNldCk7XG4gIHZhciBjZWxscyA9IG9mZnNldFN0ci5tYXRjaCgvXiguKilcXCUkLyk7XG4gIGlmIChjZWxscykge1xuICAgIHJldHVybiBzaXplICogKHBhcnNlRmxvYXQoY2VsbHNbMV0pIC8gMTAwKTtcbiAgfVxuICByZXR1cm4gcGFyc2VGbG9hdChvZmZzZXRTdHIpO1xufVxuZnVuY3Rpb24gZ2V0TnVtYmVyT2Zmc2V0KHJlY3QsIG9mZnNldCkge1xuICB2YXIgX3JlZiA9IG9mZnNldCB8fCBbXSxcbiAgICBfcmVmMiA9IF9zbGljZWRUb0FycmF5KF9yZWYsIDIpLFxuICAgIG9mZnNldFggPSBfcmVmMlswXSxcbiAgICBvZmZzZXRZID0gX3JlZjJbMV07XG4gIHJldHVybiBbZ2V0VW5pdE9mZnNldChyZWN0LndpZHRoLCBvZmZzZXRYKSwgZ2V0VW5pdE9mZnNldChyZWN0LmhlaWdodCwgb2Zmc2V0WSldO1xufVxuZnVuY3Rpb24gc3BsaXRQb2ludHMoKSB7XG4gIHZhciBwb2ludHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICcnO1xuICByZXR1cm4gW3BvaW50c1swXSwgcG9pbnRzWzFdXTtcbn1cbmZ1bmN0aW9uIGdldEFsaWduUG9pbnQocmVjdCwgcG9pbnRzKSB7XG4gIHZhciB0b3BCb3R0b20gPSBwb2ludHNbMF07XG4gIHZhciBsZWZ0UmlnaHQgPSBwb2ludHNbMV07XG4gIHZhciB4O1xuICB2YXIgeTtcblxuICAvLyBUb3AgJiBCb3R0b21cbiAgaWYgKHRvcEJvdHRvbSA9PT0gJ3QnKSB7XG4gICAgeSA9IHJlY3QueTtcbiAgfSBlbHNlIGlmICh0b3BCb3R0b20gPT09ICdiJykge1xuICAgIHkgPSByZWN0LnkgKyByZWN0LmhlaWdodDtcbiAgfSBlbHNlIHtcbiAgICB5ID0gcmVjdC55ICsgcmVjdC5oZWlnaHQgLyAyO1xuICB9XG5cbiAgLy8gTGVmdCAmIFJpZ2h0XG4gIGlmIChsZWZ0UmlnaHQgPT09ICdsJykge1xuICAgIHggPSByZWN0Lng7XG4gIH0gZWxzZSBpZiAobGVmdFJpZ2h0ID09PSAncicpIHtcbiAgICB4ID0gcmVjdC54ICsgcmVjdC53aWR0aDtcbiAgfSBlbHNlIHtcbiAgICB4ID0gcmVjdC54ICsgcmVjdC53aWR0aCAvIDI7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfTtcbn1cbmZ1bmN0aW9uIHJldmVyc2VQb2ludHMocG9pbnRzLCBpbmRleCkge1xuICB2YXIgcmV2ZXJzZU1hcCA9IHtcbiAgICB0OiAnYicsXG4gICAgYjogJ3QnLFxuICAgIGw6ICdyJyxcbiAgICByOiAnbCdcbiAgfTtcbiAgcmV0dXJuIHBvaW50cy5tYXAoZnVuY3Rpb24gKHBvaW50LCBpKSB7XG4gICAgaWYgKGkgPT09IGluZGV4KSB7XG4gICAgICByZXR1cm4gcmV2ZXJzZU1hcFtwb2ludF0gfHwgJ2MnO1xuICAgIH1cbiAgICByZXR1cm4gcG9pbnQ7XG4gIH0pLmpvaW4oJycpO1xufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlQWxpZ24ob3BlbiwgcG9wdXBFbGUsIHRhcmdldCwgcGxhY2VtZW50LCBidWlsdGluUGxhY2VtZW50cywgcG9wdXBBbGlnbiwgb25Qb3B1cEFsaWduKSB7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZSh7XG4gICAgICByZWFkeTogZmFsc2UsXG4gICAgICBvZmZzZXRYOiAwLFxuICAgICAgb2Zmc2V0WTogMCxcbiAgICAgIG9mZnNldFI6IDAsXG4gICAgICBvZmZzZXRCOiAwLFxuICAgICAgYXJyb3dYOiAwLFxuICAgICAgYXJyb3dZOiAwLFxuICAgICAgc2NhbGVYOiAxLFxuICAgICAgc2NhbGVZOiAxLFxuICAgICAgYWxpZ246IGJ1aWx0aW5QbGFjZW1lbnRzW3BsYWNlbWVudF0gfHwge31cbiAgICB9KSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBvZmZzZXRJbmZvID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXRPZmZzZXRJbmZvID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIGFsaWduQ291bnRSZWYgPSBSZWFjdC51c2VSZWYoMCk7XG4gIHZhciBzY3JvbGxlckxpc3QgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXBvcHVwRWxlKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiBjb2xsZWN0U2Nyb2xsZXIocG9wdXBFbGUpO1xuICB9LCBbcG9wdXBFbGVdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IEZsaXAgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gV2Ugd2lsbCBtZW1vIGZsaXAgaW5mby5cbiAgLy8gSWYgc2l6ZSBjaGFuZ2UgdG8gbWFrZSBmbGlwLCBpdCB3aWxsIG1lbW8gdGhlIGZsaXAgaW5mbyBhbmQgdXNlIGl0IGluIG5leHQgYWxpZ24uXG4gIHZhciBwcmV2RmxpcFJlZiA9IFJlYWN0LnVzZVJlZih7fSk7XG4gIHZhciByZXNldEZsaXBDYWNoZSA9IGZ1bmN0aW9uIHJlc2V0RmxpcENhY2hlKCkge1xuICAgIHByZXZGbGlwUmVmLmN1cnJlbnQgPSB7fTtcbiAgfTtcbiAgaWYgKCFvcGVuKSB7XG4gICAgcmVzZXRGbGlwQ2FjaGUoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gQWxpZ24gPT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgb25BbGlnbiA9IHVzZUV2ZW50KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocG9wdXBFbGUgJiYgdGFyZ2V0ICYmIG9wZW4pIHtcbiAgICAgIHZhciBfcG9wdXBFbGVtZW50JHBhcmVudEUsIF9wb3B1cFJlY3QkeCwgX3BvcHVwUmVjdCR5LCBfcG9wdXBFbGVtZW50JHBhcmVudEUyO1xuICAgICAgdmFyIHBvcHVwRWxlbWVudCA9IHBvcHVwRWxlO1xuICAgICAgdmFyIGRvYyA9IHBvcHVwRWxlbWVudC5vd25lckRvY3VtZW50O1xuICAgICAgdmFyIHdpbiA9IGdldFdpbihwb3B1cEVsZW1lbnQpO1xuICAgICAgdmFyIF93aW4kZ2V0Q29tcHV0ZWRTdHlsZSA9IHdpbi5nZXRDb21wdXRlZFN0eWxlKHBvcHVwRWxlbWVudCksXG4gICAgICAgIHdpZHRoID0gX3dpbiRnZXRDb21wdXRlZFN0eWxlLndpZHRoLFxuICAgICAgICBoZWlnaHQgPSBfd2luJGdldENvbXB1dGVkU3R5bGUuaGVpZ2h0LFxuICAgICAgICBwb3B1cFBvc2l0aW9uID0gX3dpbiRnZXRDb21wdXRlZFN0eWxlLnBvc2l0aW9uO1xuICAgICAgdmFyIG9yaWdpbkxlZnQgPSBwb3B1cEVsZW1lbnQuc3R5bGUubGVmdDtcbiAgICAgIHZhciBvcmlnaW5Ub3AgPSBwb3B1cEVsZW1lbnQuc3R5bGUudG9wO1xuICAgICAgdmFyIG9yaWdpblJpZ2h0ID0gcG9wdXBFbGVtZW50LnN0eWxlLnJpZ2h0O1xuICAgICAgdmFyIG9yaWdpbkJvdHRvbSA9IHBvcHVwRWxlbWVudC5zdHlsZS5ib3R0b207XG4gICAgICB2YXIgb3JpZ2luT3ZlcmZsb3cgPSBwb3B1cEVsZW1lbnQuc3R5bGUub3ZlcmZsb3c7XG5cbiAgICAgIC8vIFBsYWNlbWVudFxuICAgICAgdmFyIHBsYWNlbWVudEluZm8gPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGJ1aWx0aW5QbGFjZW1lbnRzW3BsYWNlbWVudF0pLCBwb3B1cEFsaWduKTtcblxuICAgICAgLy8gcGxhY2Vob2xkZXIgZWxlbWVudFxuICAgICAgdmFyIHBsYWNlaG9sZGVyRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIChfcG9wdXBFbGVtZW50JHBhcmVudEUgPSBwb3B1cEVsZW1lbnQucGFyZW50RWxlbWVudCkgPT09IG51bGwgfHwgX3BvcHVwRWxlbWVudCRwYXJlbnRFID09PSB2b2lkIDAgfHwgX3BvcHVwRWxlbWVudCRwYXJlbnRFLmFwcGVuZENoaWxkKHBsYWNlaG9sZGVyRWxlbWVudCk7XG4gICAgICBwbGFjZWhvbGRlckVsZW1lbnQuc3R5bGUubGVmdCA9IFwiXCIuY29uY2F0KHBvcHVwRWxlbWVudC5vZmZzZXRMZWZ0LCBcInB4XCIpO1xuICAgICAgcGxhY2Vob2xkZXJFbGVtZW50LnN0eWxlLnRvcCA9IFwiXCIuY29uY2F0KHBvcHVwRWxlbWVudC5vZmZzZXRUb3AsIFwicHhcIik7XG4gICAgICBwbGFjZWhvbGRlckVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSBwb3B1cFBvc2l0aW9uO1xuICAgICAgcGxhY2Vob2xkZXJFbGVtZW50LnN0eWxlLmhlaWdodCA9IFwiXCIuY29uY2F0KHBvcHVwRWxlbWVudC5vZmZzZXRIZWlnaHQsIFwicHhcIik7XG4gICAgICBwbGFjZWhvbGRlckVsZW1lbnQuc3R5bGUud2lkdGggPSBcIlwiLmNvbmNhdChwb3B1cEVsZW1lbnQub2Zmc2V0V2lkdGgsIFwicHhcIik7XG5cbiAgICAgIC8vIFJlc2V0IGZpcnN0XG4gICAgICBwb3B1cEVsZW1lbnQuc3R5bGUubGVmdCA9ICcwJztcbiAgICAgIHBvcHVwRWxlbWVudC5zdHlsZS50b3AgPSAnMCc7XG4gICAgICBwb3B1cEVsZW1lbnQuc3R5bGUucmlnaHQgPSAnYXV0byc7XG4gICAgICBwb3B1cEVsZW1lbnQuc3R5bGUuYm90dG9tID0gJ2F1dG8nO1xuICAgICAgcG9wdXBFbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBhbGlnbiBzdHlsZSwgd2Ugc2hvdWxkIGNvbnNpZGVyIGB0cmFuc2Zvcm1gIGNhc2VcbiAgICAgIHZhciB0YXJnZXRSZWN0O1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXRSZWN0ID0ge1xuICAgICAgICAgIHg6IHRhcmdldFswXSxcbiAgICAgICAgICB5OiB0YXJnZXRbMV0sXG4gICAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgICAgaGVpZ2h0OiAwXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgX3JlY3QkeCwgX3JlY3QkeTtcbiAgICAgICAgdmFyIHJlY3QgPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHJlY3QueCA9IChfcmVjdCR4ID0gcmVjdC54KSAhPT0gbnVsbCAmJiBfcmVjdCR4ICE9PSB2b2lkIDAgPyBfcmVjdCR4IDogcmVjdC5sZWZ0O1xuICAgICAgICByZWN0LnkgPSAoX3JlY3QkeSA9IHJlY3QueSkgIT09IG51bGwgJiYgX3JlY3QkeSAhPT0gdm9pZCAwID8gX3JlY3QkeSA6IHJlY3QudG9wO1xuICAgICAgICB0YXJnZXRSZWN0ID0ge1xuICAgICAgICAgIHg6IHJlY3QueCxcbiAgICAgICAgICB5OiByZWN0LnksXG4gICAgICAgICAgd2lkdGg6IHJlY3Qud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiByZWN0LmhlaWdodFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdmFyIHBvcHVwUmVjdCA9IHBvcHVwRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHBvcHVwUmVjdC54ID0gKF9wb3B1cFJlY3QkeCA9IHBvcHVwUmVjdC54KSAhPT0gbnVsbCAmJiBfcG9wdXBSZWN0JHggIT09IHZvaWQgMCA/IF9wb3B1cFJlY3QkeCA6IHBvcHVwUmVjdC5sZWZ0O1xuICAgICAgcG9wdXBSZWN0LnkgPSAoX3BvcHVwUmVjdCR5ID0gcG9wdXBSZWN0LnkpICE9PSBudWxsICYmIF9wb3B1cFJlY3QkeSAhPT0gdm9pZCAwID8gX3BvcHVwUmVjdCR5IDogcG9wdXBSZWN0LnRvcDtcbiAgICAgIHZhciBfZG9jJGRvY3VtZW50RWxlbWVudCA9IGRvYy5kb2N1bWVudEVsZW1lbnQsXG4gICAgICAgIGNsaWVudFdpZHRoID0gX2RvYyRkb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsXG4gICAgICAgIGNsaWVudEhlaWdodCA9IF9kb2MkZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCxcbiAgICAgICAgc2Nyb2xsV2lkdGggPSBfZG9jJGRvY3VtZW50RWxlbWVudC5zY3JvbGxXaWR0aCxcbiAgICAgICAgc2Nyb2xsSGVpZ2h0ID0gX2RvYyRkb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0LFxuICAgICAgICBzY3JvbGxUb3AgPSBfZG9jJGRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AsXG4gICAgICAgIHNjcm9sbExlZnQgPSBfZG9jJGRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgICAgdmFyIHBvcHVwSGVpZ2h0ID0gcG9wdXBSZWN0LmhlaWdodDtcbiAgICAgIHZhciBwb3B1cFdpZHRoID0gcG9wdXBSZWN0LndpZHRoO1xuICAgICAgdmFyIHRhcmdldEhlaWdodCA9IHRhcmdldFJlY3QuaGVpZ2h0O1xuICAgICAgdmFyIHRhcmdldFdpZHRoID0gdGFyZ2V0UmVjdC53aWR0aDtcblxuICAgICAgLy8gR2V0IGJvdW5kaW5nIG9mIHZpc2libGUgYXJlYVxuICAgICAgdmFyIHZpc2libGVSZWdpb24gPSB7XG4gICAgICAgIGxlZnQ6IDAsXG4gICAgICAgIHRvcDogMCxcbiAgICAgICAgcmlnaHQ6IGNsaWVudFdpZHRoLFxuICAgICAgICBib3R0b206IGNsaWVudEhlaWdodFxuICAgICAgfTtcbiAgICAgIHZhciBzY3JvbGxSZWdpb24gPSB7XG4gICAgICAgIGxlZnQ6IC1zY3JvbGxMZWZ0LFxuICAgICAgICB0b3A6IC1zY3JvbGxUb3AsXG4gICAgICAgIHJpZ2h0OiBzY3JvbGxXaWR0aCAtIHNjcm9sbExlZnQsXG4gICAgICAgIGJvdHRvbTogc2Nyb2xsSGVpZ2h0IC0gc2Nyb2xsVG9wXG4gICAgICB9O1xuICAgICAgdmFyIGh0bWxSZWdpb24gPSBwbGFjZW1lbnRJbmZvLmh0bWxSZWdpb247XG4gICAgICB2YXIgVklTSUJMRSA9ICd2aXNpYmxlJztcbiAgICAgIHZhciBWSVNJQkxFX0ZJUlNUID0gJ3Zpc2libGVGaXJzdCc7XG4gICAgICBpZiAoaHRtbFJlZ2lvbiAhPT0gJ3Njcm9sbCcgJiYgaHRtbFJlZ2lvbiAhPT0gVklTSUJMRV9GSVJTVCkge1xuICAgICAgICBodG1sUmVnaW9uID0gVklTSUJMRTtcbiAgICAgIH1cbiAgICAgIHZhciBpc1Zpc2libGVGaXJzdCA9IGh0bWxSZWdpb24gPT09IFZJU0lCTEVfRklSU1Q7XG4gICAgICB2YXIgc2Nyb2xsUmVnaW9uQXJlYSA9IGdldFZpc2libGVBcmVhKHNjcm9sbFJlZ2lvbiwgc2Nyb2xsZXJMaXN0KTtcbiAgICAgIHZhciB2aXNpYmxlUmVnaW9uQXJlYSA9IGdldFZpc2libGVBcmVhKHZpc2libGVSZWdpb24sIHNjcm9sbGVyTGlzdCk7XG4gICAgICB2YXIgdmlzaWJsZUFyZWEgPSBodG1sUmVnaW9uID09PSBWSVNJQkxFID8gdmlzaWJsZVJlZ2lvbkFyZWEgOiBzY3JvbGxSZWdpb25BcmVhO1xuXG4gICAgICAvLyBXaGVuIHNldCB0byBgdmlzaWJsZUZpcnN0YCxcbiAgICAgIC8vIHRoZSBjaGVjayBgYWRqdXN0YCBsb2dpYyB3aWxsIHVzZSBgdmlzaWJsZVJlZ2lvbmAgZm9yIGNoZWNrIGZpcnN0LlxuICAgICAgdmFyIGFkanVzdENoZWNrVmlzaWJsZUFyZWEgPSBpc1Zpc2libGVGaXJzdCA/IHZpc2libGVSZWdpb25BcmVhIDogdmlzaWJsZUFyZWE7XG5cbiAgICAgIC8vIFJlY29yZCByaWdodCAmIGJvdHRvbSBhbGlnbiBkYXRhXG4gICAgICBwb3B1cEVsZW1lbnQuc3R5bGUubGVmdCA9ICdhdXRvJztcbiAgICAgIHBvcHVwRWxlbWVudC5zdHlsZS50b3AgPSAnYXV0byc7XG4gICAgICBwb3B1cEVsZW1lbnQuc3R5bGUucmlnaHQgPSAnMCc7XG4gICAgICBwb3B1cEVsZW1lbnQuc3R5bGUuYm90dG9tID0gJzAnO1xuICAgICAgdmFyIHBvcHVwTWlycm9yUmVjdCA9IHBvcHVwRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgLy8gUmVzZXQgYmFja1xuICAgICAgcG9wdXBFbGVtZW50LnN0eWxlLmxlZnQgPSBvcmlnaW5MZWZ0O1xuICAgICAgcG9wdXBFbGVtZW50LnN0eWxlLnRvcCA9IG9yaWdpblRvcDtcbiAgICAgIHBvcHVwRWxlbWVudC5zdHlsZS5yaWdodCA9IG9yaWdpblJpZ2h0O1xuICAgICAgcG9wdXBFbGVtZW50LnN0eWxlLmJvdHRvbSA9IG9yaWdpbkJvdHRvbTtcbiAgICAgIHBvcHVwRWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9IG9yaWdpbk92ZXJmbG93O1xuICAgICAgKF9wb3B1cEVsZW1lbnQkcGFyZW50RTIgPSBwb3B1cEVsZW1lbnQucGFyZW50RWxlbWVudCkgPT09IG51bGwgfHwgX3BvcHVwRWxlbWVudCRwYXJlbnRFMiA9PT0gdm9pZCAwIHx8IF9wb3B1cEVsZW1lbnQkcGFyZW50RTIucmVtb3ZlQ2hpbGQocGxhY2Vob2xkZXJFbGVtZW50KTtcblxuICAgICAgLy8gQ2FsY3VsYXRlIHNjYWxlXG4gICAgICB2YXIgX3NjYWxlWCA9IHRvTnVtKE1hdGgucm91bmQocG9wdXBXaWR0aCAvIHBhcnNlRmxvYXQod2lkdGgpICogMTAwMCkgLyAxMDAwKTtcbiAgICAgIHZhciBfc2NhbGVZID0gdG9OdW0oTWF0aC5yb3VuZChwb3B1cEhlaWdodCAvIHBhcnNlRmxvYXQoaGVpZ2h0KSAqIDEwMDApIC8gMTAwMCk7XG5cbiAgICAgIC8vIE5vIG5lZWQgdG8gYWxpZ24gc2luY2UgaXQncyBub3QgdmlzaWJsZSBpbiB2aWV3XG4gICAgICBpZiAoX3NjYWxlWCA9PT0gMCB8fCBfc2NhbGVZID09PSAwIHx8IGlzRE9NKHRhcmdldCkgJiYgIWlzVmlzaWJsZSh0YXJnZXQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gT2Zmc2V0XG4gICAgICB2YXIgb2Zmc2V0ID0gcGxhY2VtZW50SW5mby5vZmZzZXQsXG4gICAgICAgIHRhcmdldE9mZnNldCA9IHBsYWNlbWVudEluZm8udGFyZ2V0T2Zmc2V0O1xuICAgICAgdmFyIF9nZXROdW1iZXJPZmZzZXQgPSBnZXROdW1iZXJPZmZzZXQocG9wdXBSZWN0LCBvZmZzZXQpLFxuICAgICAgICBfZ2V0TnVtYmVyT2Zmc2V0MiA9IF9zbGljZWRUb0FycmF5KF9nZXROdW1iZXJPZmZzZXQsIDIpLFxuICAgICAgICBwb3B1cE9mZnNldFggPSBfZ2V0TnVtYmVyT2Zmc2V0MlswXSxcbiAgICAgICAgcG9wdXBPZmZzZXRZID0gX2dldE51bWJlck9mZnNldDJbMV07XG4gICAgICB2YXIgX2dldE51bWJlck9mZnNldDMgPSBnZXROdW1iZXJPZmZzZXQodGFyZ2V0UmVjdCwgdGFyZ2V0T2Zmc2V0KSxcbiAgICAgICAgX2dldE51bWJlck9mZnNldDQgPSBfc2xpY2VkVG9BcnJheShfZ2V0TnVtYmVyT2Zmc2V0MywgMiksXG4gICAgICAgIHRhcmdldE9mZnNldFggPSBfZ2V0TnVtYmVyT2Zmc2V0NFswXSxcbiAgICAgICAgdGFyZ2V0T2Zmc2V0WSA9IF9nZXROdW1iZXJPZmZzZXQ0WzFdO1xuICAgICAgdGFyZ2V0UmVjdC54IC09IHRhcmdldE9mZnNldFg7XG4gICAgICB0YXJnZXRSZWN0LnkgLT0gdGFyZ2V0T2Zmc2V0WTtcblxuICAgICAgLy8gUG9pbnRzXG4gICAgICB2YXIgX3JlZjMgPSBwbGFjZW1lbnRJbmZvLnBvaW50cyB8fCBbXSxcbiAgICAgICAgX3JlZjQgPSBfc2xpY2VkVG9BcnJheShfcmVmMywgMiksXG4gICAgICAgIHBvcHVwUG9pbnQgPSBfcmVmNFswXSxcbiAgICAgICAgdGFyZ2V0UG9pbnQgPSBfcmVmNFsxXTtcbiAgICAgIHZhciB0YXJnZXRQb2ludHMgPSBzcGxpdFBvaW50cyh0YXJnZXRQb2ludCk7XG4gICAgICB2YXIgcG9wdXBQb2ludHMgPSBzcGxpdFBvaW50cyhwb3B1cFBvaW50KTtcbiAgICAgIHZhciB0YXJnZXRBbGlnblBvaW50ID0gZ2V0QWxpZ25Qb2ludCh0YXJnZXRSZWN0LCB0YXJnZXRQb2ludHMpO1xuICAgICAgdmFyIHBvcHVwQWxpZ25Qb2ludCA9IGdldEFsaWduUG9pbnQocG9wdXBSZWN0LCBwb3B1cFBvaW50cyk7XG5cbiAgICAgIC8vIFJlYWwgYWxpZ24gaW5mbyBtYXkgbm90IHNhbWUgYXMgb3JpZ2luIG9uZVxuICAgICAgdmFyIG5leHRBbGlnbkluZm8gPSBfb2JqZWN0U3ByZWFkKHt9LCBwbGFjZW1lbnRJbmZvKTtcblxuICAgICAgLy8gTmV4dCBPZmZzZXRcbiAgICAgIHZhciBuZXh0T2Zmc2V0WCA9IHRhcmdldEFsaWduUG9pbnQueCAtIHBvcHVwQWxpZ25Qb2ludC54ICsgcG9wdXBPZmZzZXRYO1xuICAgICAgdmFyIG5leHRPZmZzZXRZID0gdGFyZ2V0QWxpZ25Qb2ludC55IC0gcG9wdXBBbGlnblBvaW50LnkgKyBwb3B1cE9mZnNldFk7XG5cbiAgICAgIC8vID09PT09PT09PT09PT09IEludGVyc2VjdGlvbiA9PT09PT09PT09PT09PT1cbiAgICAgIC8vIEdldCBhcmVhIGJ5IHBvc2l0aW9uLiBVc2VkIGZvciBjaGVjayBpZiBmbGlwIGFyZWEgaXMgYmV0dGVyXG4gICAgICBmdW5jdGlvbiBnZXRJbnRlcnNlY3Rpb25WaXNpYmxlQXJlYShvZmZzZXRYLCBvZmZzZXRZKSB7XG4gICAgICAgIHZhciBhcmVhID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB2aXNpYmxlQXJlYTtcbiAgICAgICAgdmFyIGwgPSBwb3B1cFJlY3QueCArIG9mZnNldFg7XG4gICAgICAgIHZhciB0ID0gcG9wdXBSZWN0LnkgKyBvZmZzZXRZO1xuICAgICAgICB2YXIgciA9IGwgKyBwb3B1cFdpZHRoO1xuICAgICAgICB2YXIgYiA9IHQgKyBwb3B1cEhlaWdodDtcbiAgICAgICAgdmFyIHZpc2libGVMID0gTWF0aC5tYXgobCwgYXJlYS5sZWZ0KTtcbiAgICAgICAgdmFyIHZpc2libGVUID0gTWF0aC5tYXgodCwgYXJlYS50b3ApO1xuICAgICAgICB2YXIgdmlzaWJsZVIgPSBNYXRoLm1pbihyLCBhcmVhLnJpZ2h0KTtcbiAgICAgICAgdmFyIHZpc2libGVCID0gTWF0aC5taW4oYiwgYXJlYS5ib3R0b20pO1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgKHZpc2libGVSIC0gdmlzaWJsZUwpICogKHZpc2libGVCIC0gdmlzaWJsZVQpKTtcbiAgICAgIH1cbiAgICAgIHZhciBvcmlnaW5JbnRlcnNlY3Rpb25WaXNpYmxlQXJlYSA9IGdldEludGVyc2VjdGlvblZpc2libGVBcmVhKG5leHRPZmZzZXRYLCBuZXh0T2Zmc2V0WSk7XG5cbiAgICAgIC8vIEFzIGB2aXNpYmxlRmlyc3RgLCB3ZSBwcmVwYXJlIHRoaXMgZm9yIGNoZWNrXG4gICAgICB2YXIgb3JpZ2luSW50ZXJzZWN0aW9uUmVjb21tZW5kQXJlYSA9IGdldEludGVyc2VjdGlvblZpc2libGVBcmVhKG5leHRPZmZzZXRYLCBuZXh0T2Zmc2V0WSwgdmlzaWJsZVJlZ2lvbkFyZWEpO1xuXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBPdmVyZmxvdyA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIHZhciB0YXJnZXRBbGlnblBvaW50VEwgPSBnZXRBbGlnblBvaW50KHRhcmdldFJlY3QsIFsndCcsICdsJ10pO1xuICAgICAgdmFyIHBvcHVwQWxpZ25Qb2ludFRMID0gZ2V0QWxpZ25Qb2ludChwb3B1cFJlY3QsIFsndCcsICdsJ10pO1xuICAgICAgdmFyIHRhcmdldEFsaWduUG9pbnRCUiA9IGdldEFsaWduUG9pbnQodGFyZ2V0UmVjdCwgWydiJywgJ3InXSk7XG4gICAgICB2YXIgcG9wdXBBbGlnblBvaW50QlIgPSBnZXRBbGlnblBvaW50KHBvcHVwUmVjdCwgWydiJywgJ3InXSk7XG4gICAgICB2YXIgb3ZlcmZsb3cgPSBwbGFjZW1lbnRJbmZvLm92ZXJmbG93IHx8IHt9O1xuICAgICAgdmFyIGFkanVzdFggPSBvdmVyZmxvdy5hZGp1c3RYLFxuICAgICAgICBhZGp1c3RZID0gb3ZlcmZsb3cuYWRqdXN0WSxcbiAgICAgICAgc2hpZnRYID0gb3ZlcmZsb3cuc2hpZnRYLFxuICAgICAgICBzaGlmdFkgPSBvdmVyZmxvdy5zaGlmdFk7XG4gICAgICB2YXIgc3VwcG9ydEFkanVzdCA9IGZ1bmN0aW9uIHN1cHBvcnRBZGp1c3QodmFsKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWwgPj0gMDtcbiAgICAgIH07XG5cbiAgICAgIC8vIFByZXBhcmUgcG9zaXRpb25cbiAgICAgIHZhciBuZXh0UG9wdXBZO1xuICAgICAgdmFyIG5leHRQb3B1cEJvdHRvbTtcbiAgICAgIHZhciBuZXh0UG9wdXBYO1xuICAgICAgdmFyIG5leHRQb3B1cFJpZ2h0O1xuICAgICAgZnVuY3Rpb24gc3luY05leHRQb3B1cFBvc2l0aW9uKCkge1xuICAgICAgICBuZXh0UG9wdXBZID0gcG9wdXBSZWN0LnkgKyBuZXh0T2Zmc2V0WTtcbiAgICAgICAgbmV4dFBvcHVwQm90dG9tID0gbmV4dFBvcHVwWSArIHBvcHVwSGVpZ2h0O1xuICAgICAgICBuZXh0UG9wdXBYID0gcG9wdXBSZWN0LnggKyBuZXh0T2Zmc2V0WDtcbiAgICAgICAgbmV4dFBvcHVwUmlnaHQgPSBuZXh0UG9wdXBYICsgcG9wdXBXaWR0aDtcbiAgICAgIH1cbiAgICAgIHN5bmNOZXh0UG9wdXBQb3NpdGlvbigpO1xuXG4gICAgICAvLyA+Pj4+Pj4+Pj4+IFRvcCAmIEJvdHRvbVxuICAgICAgdmFyIG5lZWRBZGp1c3RZID0gc3VwcG9ydEFkanVzdChhZGp1c3RZKTtcbiAgICAgIHZhciBzYW1lVEIgPSBwb3B1cFBvaW50c1swXSA9PT0gdGFyZ2V0UG9pbnRzWzBdO1xuXG4gICAgICAvLyBCb3R0b20gdG8gVG9wXG4gICAgICBpZiAobmVlZEFkanVzdFkgJiYgcG9wdXBQb2ludHNbMF0gPT09ICd0JyAmJiAobmV4dFBvcHVwQm90dG9tID4gYWRqdXN0Q2hlY2tWaXNpYmxlQXJlYS5ib3R0b20gfHwgcHJldkZsaXBSZWYuY3VycmVudC5idCkpIHtcbiAgICAgICAgdmFyIHRtcE5leHRPZmZzZXRZID0gbmV4dE9mZnNldFk7XG4gICAgICAgIGlmIChzYW1lVEIpIHtcbiAgICAgICAgICB0bXBOZXh0T2Zmc2V0WSAtPSBwb3B1cEhlaWdodCAtIHRhcmdldEhlaWdodDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0bXBOZXh0T2Zmc2V0WSA9IHRhcmdldEFsaWduUG9pbnRUTC55IC0gcG9wdXBBbGlnblBvaW50QlIueSAtIHBvcHVwT2Zmc2V0WTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbmV3VmlzaWJsZUFyZWEgPSBnZXRJbnRlcnNlY3Rpb25WaXNpYmxlQXJlYShuZXh0T2Zmc2V0WCwgdG1wTmV4dE9mZnNldFkpO1xuICAgICAgICB2YXIgbmV3VmlzaWJsZVJlY29tbWVuZEFyZWEgPSBnZXRJbnRlcnNlY3Rpb25WaXNpYmxlQXJlYShuZXh0T2Zmc2V0WCwgdG1wTmV4dE9mZnNldFksIHZpc2libGVSZWdpb25BcmVhKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAvLyBPZiBjb3Vyc2UgdXNlIGxhcmdlciBvbmVcbiAgICAgICAgbmV3VmlzaWJsZUFyZWEgPiBvcmlnaW5JbnRlcnNlY3Rpb25WaXNpYmxlQXJlYSB8fCBuZXdWaXNpYmxlQXJlYSA9PT0gb3JpZ2luSW50ZXJzZWN0aW9uVmlzaWJsZUFyZWEgJiYgKCFpc1Zpc2libGVGaXJzdCB8fFxuICAgICAgICAvLyBDaG9vc2UgcmVjb21tZW5kIG9uZVxuICAgICAgICBuZXdWaXNpYmxlUmVjb21tZW5kQXJlYSA+PSBvcmlnaW5JbnRlcnNlY3Rpb25SZWNvbW1lbmRBcmVhKSkge1xuICAgICAgICAgIHByZXZGbGlwUmVmLmN1cnJlbnQuYnQgPSB0cnVlO1xuICAgICAgICAgIG5leHRPZmZzZXRZID0gdG1wTmV4dE9mZnNldFk7XG4gICAgICAgICAgcG9wdXBPZmZzZXRZID0gLXBvcHVwT2Zmc2V0WTtcbiAgICAgICAgICBuZXh0QWxpZ25JbmZvLnBvaW50cyA9IFtyZXZlcnNlUG9pbnRzKHBvcHVwUG9pbnRzLCAwKSwgcmV2ZXJzZVBvaW50cyh0YXJnZXRQb2ludHMsIDApXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmV2RmxpcFJlZi5jdXJyZW50LmJ0ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVG9wIHRvIEJvdHRvbVxuICAgICAgaWYgKG5lZWRBZGp1c3RZICYmIHBvcHVwUG9pbnRzWzBdID09PSAnYicgJiYgKG5leHRQb3B1cFkgPCBhZGp1c3RDaGVja1Zpc2libGVBcmVhLnRvcCB8fCBwcmV2RmxpcFJlZi5jdXJyZW50LnRiKSkge1xuICAgICAgICB2YXIgX3RtcE5leHRPZmZzZXRZID0gbmV4dE9mZnNldFk7XG4gICAgICAgIGlmIChzYW1lVEIpIHtcbiAgICAgICAgICBfdG1wTmV4dE9mZnNldFkgKz0gcG9wdXBIZWlnaHQgLSB0YXJnZXRIZWlnaHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgX3RtcE5leHRPZmZzZXRZID0gdGFyZ2V0QWxpZ25Qb2ludEJSLnkgLSBwb3B1cEFsaWduUG9pbnRUTC55IC0gcG9wdXBPZmZzZXRZO1xuICAgICAgICB9XG4gICAgICAgIHZhciBfbmV3VmlzaWJsZUFyZWEgPSBnZXRJbnRlcnNlY3Rpb25WaXNpYmxlQXJlYShuZXh0T2Zmc2V0WCwgX3RtcE5leHRPZmZzZXRZKTtcbiAgICAgICAgdmFyIF9uZXdWaXNpYmxlUmVjb21tZW5kQXJlYSA9IGdldEludGVyc2VjdGlvblZpc2libGVBcmVhKG5leHRPZmZzZXRYLCBfdG1wTmV4dE9mZnNldFksIHZpc2libGVSZWdpb25BcmVhKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAvLyBPZiBjb3Vyc2UgdXNlIGxhcmdlciBvbmVcbiAgICAgICAgX25ld1Zpc2libGVBcmVhID4gb3JpZ2luSW50ZXJzZWN0aW9uVmlzaWJsZUFyZWEgfHwgX25ld1Zpc2libGVBcmVhID09PSBvcmlnaW5JbnRlcnNlY3Rpb25WaXNpYmxlQXJlYSAmJiAoIWlzVmlzaWJsZUZpcnN0IHx8XG4gICAgICAgIC8vIENob29zZSByZWNvbW1lbmQgb25lXG4gICAgICAgIF9uZXdWaXNpYmxlUmVjb21tZW5kQXJlYSA+PSBvcmlnaW5JbnRlcnNlY3Rpb25SZWNvbW1lbmRBcmVhKSkge1xuICAgICAgICAgIHByZXZGbGlwUmVmLmN1cnJlbnQudGIgPSB0cnVlO1xuICAgICAgICAgIG5leHRPZmZzZXRZID0gX3RtcE5leHRPZmZzZXRZO1xuICAgICAgICAgIHBvcHVwT2Zmc2V0WSA9IC1wb3B1cE9mZnNldFk7XG4gICAgICAgICAgbmV4dEFsaWduSW5mby5wb2ludHMgPSBbcmV2ZXJzZVBvaW50cyhwb3B1cFBvaW50cywgMCksIHJldmVyc2VQb2ludHModGFyZ2V0UG9pbnRzLCAwKV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldkZsaXBSZWYuY3VycmVudC50YiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vID4+Pj4+Pj4+Pj4gTGVmdCAmIFJpZ2h0XG4gICAgICB2YXIgbmVlZEFkanVzdFggPSBzdXBwb3J0QWRqdXN0KGFkanVzdFgpO1xuXG4gICAgICAvLyA+Pj4+PiBGbGlwXG4gICAgICB2YXIgc2FtZUxSID0gcG9wdXBQb2ludHNbMV0gPT09IHRhcmdldFBvaW50c1sxXTtcblxuICAgICAgLy8gUmlnaHQgdG8gTGVmdFxuICAgICAgaWYgKG5lZWRBZGp1c3RYICYmIHBvcHVwUG9pbnRzWzFdID09PSAnbCcgJiYgKG5leHRQb3B1cFJpZ2h0ID4gYWRqdXN0Q2hlY2tWaXNpYmxlQXJlYS5yaWdodCB8fCBwcmV2RmxpcFJlZi5jdXJyZW50LnJsKSkge1xuICAgICAgICB2YXIgdG1wTmV4dE9mZnNldFggPSBuZXh0T2Zmc2V0WDtcbiAgICAgICAgaWYgKHNhbWVMUikge1xuICAgICAgICAgIHRtcE5leHRPZmZzZXRYIC09IHBvcHVwV2lkdGggLSB0YXJnZXRXaWR0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0bXBOZXh0T2Zmc2V0WCA9IHRhcmdldEFsaWduUG9pbnRUTC54IC0gcG9wdXBBbGlnblBvaW50QlIueCAtIHBvcHVwT2Zmc2V0WDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgX25ld1Zpc2libGVBcmVhMiA9IGdldEludGVyc2VjdGlvblZpc2libGVBcmVhKHRtcE5leHRPZmZzZXRYLCBuZXh0T2Zmc2V0WSk7XG4gICAgICAgIHZhciBfbmV3VmlzaWJsZVJlY29tbWVuZEFyZWEyID0gZ2V0SW50ZXJzZWN0aW9uVmlzaWJsZUFyZWEodG1wTmV4dE9mZnNldFgsIG5leHRPZmZzZXRZLCB2aXNpYmxlUmVnaW9uQXJlYSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgLy8gT2YgY291cnNlIHVzZSBsYXJnZXIgb25lXG4gICAgICAgIF9uZXdWaXNpYmxlQXJlYTIgPiBvcmlnaW5JbnRlcnNlY3Rpb25WaXNpYmxlQXJlYSB8fCBfbmV3VmlzaWJsZUFyZWEyID09PSBvcmlnaW5JbnRlcnNlY3Rpb25WaXNpYmxlQXJlYSAmJiAoIWlzVmlzaWJsZUZpcnN0IHx8XG4gICAgICAgIC8vIENob29zZSByZWNvbW1lbmQgb25lXG4gICAgICAgIF9uZXdWaXNpYmxlUmVjb21tZW5kQXJlYTIgPj0gb3JpZ2luSW50ZXJzZWN0aW9uUmVjb21tZW5kQXJlYSkpIHtcbiAgICAgICAgICBwcmV2RmxpcFJlZi5jdXJyZW50LnJsID0gdHJ1ZTtcbiAgICAgICAgICBuZXh0T2Zmc2V0WCA9IHRtcE5leHRPZmZzZXRYO1xuICAgICAgICAgIHBvcHVwT2Zmc2V0WCA9IC1wb3B1cE9mZnNldFg7XG4gICAgICAgICAgbmV4dEFsaWduSW5mby5wb2ludHMgPSBbcmV2ZXJzZVBvaW50cyhwb3B1cFBvaW50cywgMSksIHJldmVyc2VQb2ludHModGFyZ2V0UG9pbnRzLCAxKV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldkZsaXBSZWYuY3VycmVudC5ybCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIExlZnQgdG8gUmlnaHRcbiAgICAgIGlmIChuZWVkQWRqdXN0WCAmJiBwb3B1cFBvaW50c1sxXSA9PT0gJ3InICYmIChuZXh0UG9wdXBYIDwgYWRqdXN0Q2hlY2tWaXNpYmxlQXJlYS5sZWZ0IHx8IHByZXZGbGlwUmVmLmN1cnJlbnQubHIpKSB7XG4gICAgICAgIHZhciBfdG1wTmV4dE9mZnNldFggPSBuZXh0T2Zmc2V0WDtcbiAgICAgICAgaWYgKHNhbWVMUikge1xuICAgICAgICAgIF90bXBOZXh0T2Zmc2V0WCArPSBwb3B1cFdpZHRoIC0gdGFyZ2V0V2lkdGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgX3RtcE5leHRPZmZzZXRYID0gdGFyZ2V0QWxpZ25Qb2ludEJSLnggLSBwb3B1cEFsaWduUG9pbnRUTC54IC0gcG9wdXBPZmZzZXRYO1xuICAgICAgICB9XG4gICAgICAgIHZhciBfbmV3VmlzaWJsZUFyZWEzID0gZ2V0SW50ZXJzZWN0aW9uVmlzaWJsZUFyZWEoX3RtcE5leHRPZmZzZXRYLCBuZXh0T2Zmc2V0WSk7XG4gICAgICAgIHZhciBfbmV3VmlzaWJsZVJlY29tbWVuZEFyZWEzID0gZ2V0SW50ZXJzZWN0aW9uVmlzaWJsZUFyZWEoX3RtcE5leHRPZmZzZXRYLCBuZXh0T2Zmc2V0WSwgdmlzaWJsZVJlZ2lvbkFyZWEpO1xuICAgICAgICBpZiAoXG4gICAgICAgIC8vIE9mIGNvdXJzZSB1c2UgbGFyZ2VyIG9uZVxuICAgICAgICBfbmV3VmlzaWJsZUFyZWEzID4gb3JpZ2luSW50ZXJzZWN0aW9uVmlzaWJsZUFyZWEgfHwgX25ld1Zpc2libGVBcmVhMyA9PT0gb3JpZ2luSW50ZXJzZWN0aW9uVmlzaWJsZUFyZWEgJiYgKCFpc1Zpc2libGVGaXJzdCB8fFxuICAgICAgICAvLyBDaG9vc2UgcmVjb21tZW5kIG9uZVxuICAgICAgICBfbmV3VmlzaWJsZVJlY29tbWVuZEFyZWEzID49IG9yaWdpbkludGVyc2VjdGlvblJlY29tbWVuZEFyZWEpKSB7XG4gICAgICAgICAgcHJldkZsaXBSZWYuY3VycmVudC5sciA9IHRydWU7XG4gICAgICAgICAgbmV4dE9mZnNldFggPSBfdG1wTmV4dE9mZnNldFg7XG4gICAgICAgICAgcG9wdXBPZmZzZXRYID0gLXBvcHVwT2Zmc2V0WDtcbiAgICAgICAgICBuZXh0QWxpZ25JbmZvLnBvaW50cyA9IFtyZXZlcnNlUG9pbnRzKHBvcHVwUG9pbnRzLCAxKSwgcmV2ZXJzZVBvaW50cyh0YXJnZXRQb2ludHMsIDEpXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmV2RmxpcFJlZi5jdXJyZW50LmxyID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTaGlmdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICBzeW5jTmV4dFBvcHVwUG9zaXRpb24oKTtcbiAgICAgIHZhciBudW1TaGlmdFggPSBzaGlmdFggPT09IHRydWUgPyAwIDogc2hpZnRYO1xuICAgICAgaWYgKHR5cGVvZiBudW1TaGlmdFggPT09ICdudW1iZXInKSB7XG4gICAgICAgIC8vIExlZnRcbiAgICAgICAgaWYgKG5leHRQb3B1cFggPCB2aXNpYmxlUmVnaW9uQXJlYS5sZWZ0KSB7XG4gICAgICAgICAgbmV4dE9mZnNldFggLT0gbmV4dFBvcHVwWCAtIHZpc2libGVSZWdpb25BcmVhLmxlZnQgLSBwb3B1cE9mZnNldFg7XG4gICAgICAgICAgaWYgKHRhcmdldFJlY3QueCArIHRhcmdldFdpZHRoIDwgdmlzaWJsZVJlZ2lvbkFyZWEubGVmdCArIG51bVNoaWZ0WCkge1xuICAgICAgICAgICAgbmV4dE9mZnNldFggKz0gdGFyZ2V0UmVjdC54IC0gdmlzaWJsZVJlZ2lvbkFyZWEubGVmdCArIHRhcmdldFdpZHRoIC0gbnVtU2hpZnRYO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJpZ2h0XG4gICAgICAgIGlmIChuZXh0UG9wdXBSaWdodCA+IHZpc2libGVSZWdpb25BcmVhLnJpZ2h0KSB7XG4gICAgICAgICAgbmV4dE9mZnNldFggLT0gbmV4dFBvcHVwUmlnaHQgLSB2aXNpYmxlUmVnaW9uQXJlYS5yaWdodCAtIHBvcHVwT2Zmc2V0WDtcbiAgICAgICAgICBpZiAodGFyZ2V0UmVjdC54ID4gdmlzaWJsZVJlZ2lvbkFyZWEucmlnaHQgLSBudW1TaGlmdFgpIHtcbiAgICAgICAgICAgIG5leHRPZmZzZXRYICs9IHRhcmdldFJlY3QueCAtIHZpc2libGVSZWdpb25BcmVhLnJpZ2h0ICsgbnVtU2hpZnRYO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIG51bVNoaWZ0WSA9IHNoaWZ0WSA9PT0gdHJ1ZSA/IDAgOiBzaGlmdFk7XG4gICAgICBpZiAodHlwZW9mIG51bVNoaWZ0WSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgLy8gVG9wXG4gICAgICAgIGlmIChuZXh0UG9wdXBZIDwgdmlzaWJsZVJlZ2lvbkFyZWEudG9wKSB7XG4gICAgICAgICAgbmV4dE9mZnNldFkgLT0gbmV4dFBvcHVwWSAtIHZpc2libGVSZWdpb25BcmVhLnRvcCAtIHBvcHVwT2Zmc2V0WTtcblxuICAgICAgICAgIC8vIFdoZW4gdGFyZ2V0IGlmIGZhciBhd2F5IGZyb20gdmlzaWJsZSBhcmVhXG4gICAgICAgICAgLy8gU3RvcCBzaGlmdFxuICAgICAgICAgIGlmICh0YXJnZXRSZWN0LnkgKyB0YXJnZXRIZWlnaHQgPCB2aXNpYmxlUmVnaW9uQXJlYS50b3AgKyBudW1TaGlmdFkpIHtcbiAgICAgICAgICAgIG5leHRPZmZzZXRZICs9IHRhcmdldFJlY3QueSAtIHZpc2libGVSZWdpb25BcmVhLnRvcCArIHRhcmdldEhlaWdodCAtIG51bVNoaWZ0WTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCb3R0b21cbiAgICAgICAgaWYgKG5leHRQb3B1cEJvdHRvbSA+IHZpc2libGVSZWdpb25BcmVhLmJvdHRvbSkge1xuICAgICAgICAgIG5leHRPZmZzZXRZIC09IG5leHRQb3B1cEJvdHRvbSAtIHZpc2libGVSZWdpb25BcmVhLmJvdHRvbSAtIHBvcHVwT2Zmc2V0WTtcbiAgICAgICAgICBpZiAodGFyZ2V0UmVjdC55ID4gdmlzaWJsZVJlZ2lvbkFyZWEuYm90dG9tIC0gbnVtU2hpZnRZKSB7XG4gICAgICAgICAgICBuZXh0T2Zmc2V0WSArPSB0YXJnZXRSZWN0LnkgLSB2aXNpYmxlUmVnaW9uQXJlYS5ib3R0b20gKyBudW1TaGlmdFk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQXJyb3cgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgLy8gQXJyb3cgY2VudGVyIGFsaWduXG4gICAgICB2YXIgcG9wdXBMZWZ0ID0gcG9wdXBSZWN0LnggKyBuZXh0T2Zmc2V0WDtcbiAgICAgIHZhciBwb3B1cFJpZ2h0ID0gcG9wdXBMZWZ0ICsgcG9wdXBXaWR0aDtcbiAgICAgIHZhciBwb3B1cFRvcCA9IHBvcHVwUmVjdC55ICsgbmV4dE9mZnNldFk7XG4gICAgICB2YXIgcG9wdXBCb3R0b20gPSBwb3B1cFRvcCArIHBvcHVwSGVpZ2h0O1xuICAgICAgdmFyIHRhcmdldExlZnQgPSB0YXJnZXRSZWN0Lng7XG4gICAgICB2YXIgdGFyZ2V0UmlnaHQgPSB0YXJnZXRMZWZ0ICsgdGFyZ2V0V2lkdGg7XG4gICAgICB2YXIgdGFyZ2V0VG9wID0gdGFyZ2V0UmVjdC55O1xuICAgICAgdmFyIHRhcmdldEJvdHRvbSA9IHRhcmdldFRvcCArIHRhcmdldEhlaWdodDtcbiAgICAgIHZhciBtYXhMZWZ0ID0gTWF0aC5tYXgocG9wdXBMZWZ0LCB0YXJnZXRMZWZ0KTtcbiAgICAgIHZhciBtaW5SaWdodCA9IE1hdGgubWluKHBvcHVwUmlnaHQsIHRhcmdldFJpZ2h0KTtcbiAgICAgIHZhciB4Q2VudGVyID0gKG1heExlZnQgKyBtaW5SaWdodCkgLyAyO1xuICAgICAgdmFyIG5leHRBcnJvd1ggPSB4Q2VudGVyIC0gcG9wdXBMZWZ0O1xuICAgICAgdmFyIG1heFRvcCA9IE1hdGgubWF4KHBvcHVwVG9wLCB0YXJnZXRUb3ApO1xuICAgICAgdmFyIG1pbkJvdHRvbSA9IE1hdGgubWluKHBvcHVwQm90dG9tLCB0YXJnZXRCb3R0b20pO1xuICAgICAgdmFyIHlDZW50ZXIgPSAobWF4VG9wICsgbWluQm90dG9tKSAvIDI7XG4gICAgICB2YXIgbmV4dEFycm93WSA9IHlDZW50ZXIgLSBwb3B1cFRvcDtcbiAgICAgIG9uUG9wdXBBbGlnbiA9PT0gbnVsbCB8fCBvblBvcHVwQWxpZ24gPT09IHZvaWQgMCB8fCBvblBvcHVwQWxpZ24ocG9wdXBFbGUsIG5leHRBbGlnbkluZm8pO1xuXG4gICAgICAvLyBBZGRpdGlvbmFsIGNhbGN1bGF0ZSByaWdodCAmIGJvdHRvbSBwb3NpdGlvblxuICAgICAgdmFyIG9mZnNldFg0UmlnaHQgPSBwb3B1cE1pcnJvclJlY3QucmlnaHQgLSBwb3B1cFJlY3QueCAtIChuZXh0T2Zmc2V0WCArIHBvcHVwUmVjdC53aWR0aCk7XG4gICAgICB2YXIgb2Zmc2V0WTRCb3R0b20gPSBwb3B1cE1pcnJvclJlY3QuYm90dG9tIC0gcG9wdXBSZWN0LnkgLSAobmV4dE9mZnNldFkgKyBwb3B1cFJlY3QuaGVpZ2h0KTtcbiAgICAgIGlmIChfc2NhbGVYID09PSAxKSB7XG4gICAgICAgIG5leHRPZmZzZXRYID0gTWF0aC5yb3VuZChuZXh0T2Zmc2V0WCk7XG4gICAgICAgIG9mZnNldFg0UmlnaHQgPSBNYXRoLnJvdW5kKG9mZnNldFg0UmlnaHQpO1xuICAgICAgfVxuICAgICAgaWYgKF9zY2FsZVkgPT09IDEpIHtcbiAgICAgICAgbmV4dE9mZnNldFkgPSBNYXRoLnJvdW5kKG5leHRPZmZzZXRZKTtcbiAgICAgICAgb2Zmc2V0WTRCb3R0b20gPSBNYXRoLnJvdW5kKG9mZnNldFk0Qm90dG9tKTtcbiAgICAgIH1cbiAgICAgIHZhciBuZXh0T2Zmc2V0SW5mbyA9IHtcbiAgICAgICAgcmVhZHk6IHRydWUsXG4gICAgICAgIG9mZnNldFg6IG5leHRPZmZzZXRYIC8gX3NjYWxlWCxcbiAgICAgICAgb2Zmc2V0WTogbmV4dE9mZnNldFkgLyBfc2NhbGVZLFxuICAgICAgICBvZmZzZXRSOiBvZmZzZXRYNFJpZ2h0IC8gX3NjYWxlWCxcbiAgICAgICAgb2Zmc2V0Qjogb2Zmc2V0WTRCb3R0b20gLyBfc2NhbGVZLFxuICAgICAgICBhcnJvd1g6IG5leHRBcnJvd1ggLyBfc2NhbGVYLFxuICAgICAgICBhcnJvd1k6IG5leHRBcnJvd1kgLyBfc2NhbGVZLFxuICAgICAgICBzY2FsZVg6IF9zY2FsZVgsXG4gICAgICAgIHNjYWxlWTogX3NjYWxlWSxcbiAgICAgICAgYWxpZ246IG5leHRBbGlnbkluZm9cbiAgICAgIH07XG4gICAgICBzZXRPZmZzZXRJbmZvKG5leHRPZmZzZXRJbmZvKTtcbiAgICB9XG4gIH0pO1xuICB2YXIgdHJpZ2dlckFsaWduID0gZnVuY3Rpb24gdHJpZ2dlckFsaWduKCkge1xuICAgIGFsaWduQ291bnRSZWYuY3VycmVudCArPSAxO1xuICAgIHZhciBpZCA9IGFsaWduQ291bnRSZWYuY3VycmVudDtcblxuICAgIC8vIE1lcmdlIGFsbCBhbGlnbiByZXF1aXJlbWVudCBpbnRvIG9uZSBmcmFtZVxuICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGFsaWduQ291bnRSZWYuY3VycmVudCA9PT0gaWQpIHtcbiAgICAgICAgb25BbGlnbigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIC8vIFJlc2V0IHJlYWR5IHN0YXR1cyB3aGVuIHBsYWNlbWVudCAmIG9wZW4gY2hhbmdlZFxuICB2YXIgcmVzZXRSZWFkeSA9IGZ1bmN0aW9uIHJlc2V0UmVhZHkoKSB7XG4gICAgc2V0T2Zmc2V0SW5mbyhmdW5jdGlvbiAob3JpKSB7XG4gICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBvcmkpLCB7fSwge1xuICAgICAgICByZWFkeTogZmFsc2VcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuICB1c2VMYXlvdXRFZmZlY3QocmVzZXRSZWFkeSwgW3BsYWNlbWVudF0pO1xuICB1c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICghb3Blbikge1xuICAgICAgcmVzZXRSZWFkeSgpO1xuICAgIH1cbiAgfSwgW29wZW5dKTtcbiAgcmV0dXJuIFtvZmZzZXRJbmZvLnJlYWR5LCBvZmZzZXRJbmZvLm9mZnNldFgsIG9mZnNldEluZm8ub2Zmc2V0WSwgb2Zmc2V0SW5mby5vZmZzZXRSLCBvZmZzZXRJbmZvLm9mZnNldEIsIG9mZnNldEluZm8uYXJyb3dYLCBvZmZzZXRJbmZvLmFycm93WSwgb2Zmc2V0SW5mby5zY2FsZVgsIG9mZnNldEluZm8uc2NhbGVZLCBvZmZzZXRJbmZvLmFsaWduLCB0cmlnZ2VyQWxpZ25dO1xufSIsICJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuZnVuY3Rpb24gaXNQb2ludHNFcSgpIHtcbiAgdmFyIGExID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbXTtcbiAgdmFyIGEyID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBbXTtcbiAgdmFyIGlzQWxpZ25Qb2ludCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkO1xuICBpZiAoaXNBbGlnblBvaW50KSB7XG4gICAgcmV0dXJuIGExWzBdID09PSBhMlswXTtcbiAgfVxuICByZXR1cm4gYTFbMF0gPT09IGEyWzBdICYmIGExWzFdID09PSBhMlsxXTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbGlnblBvcHVwQ2xhc3NOYW1lKGJ1aWx0aW5QbGFjZW1lbnRzLCBwcmVmaXhDbHMsIGFsaWduLCBpc0FsaWduUG9pbnQpIHtcbiAgdmFyIHBvaW50cyA9IGFsaWduLnBvaW50cztcbiAgdmFyIHBsYWNlbWVudHMgPSBPYmplY3Qua2V5cyhidWlsdGluUGxhY2VtZW50cyk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGxhY2VtZW50cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIHZhciBfYnVpbHRpblBsYWNlbWVudHMkcGw7XG4gICAgdmFyIHBsYWNlbWVudCA9IHBsYWNlbWVudHNbaV07XG4gICAgaWYgKGlzUG9pbnRzRXEoKF9idWlsdGluUGxhY2VtZW50cyRwbCA9IGJ1aWx0aW5QbGFjZW1lbnRzW3BsYWNlbWVudF0pID09PSBudWxsIHx8IF9idWlsdGluUGxhY2VtZW50cyRwbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2J1aWx0aW5QbGFjZW1lbnRzJHBsLnBvaW50cywgcG9pbnRzLCBpc0FsaWduUG9pbnQpKSB7XG4gICAgICByZXR1cm4gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1wbGFjZW1lbnQtXCIpLmNvbmNhdChwbGFjZW1lbnQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbi8qKiBAZGVwcmVjYXRlZCBXZSBzaG91bGQgbm90IHVzZSB0aGlzIGlmIHdlIGNhbiByZWZhY3RvciBhbGwgZGVwcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1vdGlvbihwcmVmaXhDbHMsIG1vdGlvbiwgYW5pbWF0aW9uLCB0cmFuc2l0aW9uTmFtZSkge1xuICBpZiAobW90aW9uKSB7XG4gICAgcmV0dXJuIG1vdGlvbjtcbiAgfVxuICBpZiAoYW5pbWF0aW9uKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1vdGlvbk5hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdChhbmltYXRpb24pXG4gICAgfTtcbiAgfVxuICBpZiAodHJhbnNpdGlvbk5hbWUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbW90aW9uTmFtZTogdHJhbnNpdGlvbk5hbWVcbiAgICB9O1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFdpbihlbGUpIHtcbiAgcmV0dXJuIGVsZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xufVxuXG4vKipcbiAqIEdldCBhbGwgdGhlIHNjcm9sbGFibGUgcGFyZW50IGVsZW1lbnRzIG9mIHRoZSBlbGVtZW50XG4gKiBAcGFyYW0gZWxlICAgICAgIFRoZSBlbGVtZW50IHRvIGJlIGRldGVjdGVkXG4gKiBAcGFyYW0gYXJlYU9ubHkgIE9ubHkgcmV0dXJuIHRoZSBwYXJlbnQgd2hpY2ggd2lsbCBjdXQgdmlzaWJsZSBhcmVhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0U2Nyb2xsZXIoZWxlKSB7XG4gIHZhciBzY3JvbGxlckxpc3QgPSBbXTtcbiAgdmFyIGN1cnJlbnQgPSBlbGUgPT09IG51bGwgfHwgZWxlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbGUucGFyZW50RWxlbWVudDtcbiAgdmFyIHNjcm9sbFN0eWxlID0gWydoaWRkZW4nLCAnc2Nyb2xsJywgJ2NsaXAnLCAnYXV0byddO1xuICB3aGlsZSAoY3VycmVudCkge1xuICAgIHZhciBfZ2V0V2luJGdldENvbXB1dGVkU3QgPSBnZXRXaW4oY3VycmVudCkuZ2V0Q29tcHV0ZWRTdHlsZShjdXJyZW50KSxcbiAgICAgIG92ZXJmbG93WCA9IF9nZXRXaW4kZ2V0Q29tcHV0ZWRTdC5vdmVyZmxvd1gsXG4gICAgICBvdmVyZmxvd1kgPSBfZ2V0V2luJGdldENvbXB1dGVkU3Qub3ZlcmZsb3dZLFxuICAgICAgb3ZlcmZsb3cgPSBfZ2V0V2luJGdldENvbXB1dGVkU3Qub3ZlcmZsb3c7XG4gICAgaWYgKFtvdmVyZmxvd1gsIG92ZXJmbG93WSwgb3ZlcmZsb3ddLnNvbWUoZnVuY3Rpb24gKG8pIHtcbiAgICAgIHJldHVybiBzY3JvbGxTdHlsZS5pbmNsdWRlcyhvKTtcbiAgICB9KSkge1xuICAgICAgc2Nyb2xsZXJMaXN0LnB1c2goY3VycmVudCk7XG4gICAgfVxuICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudEVsZW1lbnQ7XG4gIH1cbiAgcmV0dXJuIHNjcm9sbGVyTGlzdDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0b051bShudW0pIHtcbiAgdmFyIGRlZmF1bHRWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMTtcbiAgcmV0dXJuIE51bWJlci5pc05hTihudW0pID8gZGVmYXVsdFZhbHVlIDogbnVtO1xufVxuZnVuY3Rpb24gZ2V0UHhWYWx1ZSh2YWwpIHtcbiAgcmV0dXJuIHRvTnVtKHBhcnNlRmxvYXQodmFsKSwgMCk7XG59XG4vKipcbiAqXG4gKlxuICogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgKiAgICAgICAgICAgICAgQm9yZGVyICAgICAgICAgICAgICAgICpcbiAqICAqICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgKlxuICogICogICAgICogICAgICAgICAgICAgICAgICAqICAgICAqICAgICAqXG4gKiAgKiAgQiAgKiAgICAgICAgICAgICAgICAgICogIFMgICogIEIgICpcbiAqICAqICBvICAqICAgICAgICAgICAgICAgICAgKiAgYyAgKiAgbyAgKlxuICogICogIHIgICogICAgICBDb250ZW50ICAgICAqICByICAqICByICAqXG4gKiAgKiAgZCAgKiAgICAgICAgICAgICAgICAgICogIG8gICogIGQgICpcbiAqICAqICBlICAqICAgICAgICAgICAgICAgICAgKiAgbCAgKiAgZSAgKlxuICogICogIHIgICoqKioqKioqKioqKioqKioqKioqICBsICAqICByICAqXG4gKiAgKiAgICAgKiAgICAgICAgU2Nyb2xsICAgICAgICAgICogICAgICpcbiAqICAqICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgKlxuICogICogICAgICAgICAgICAgIEJvcmRlciAgICAgICAgICAgICAgICAqXG4gKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqXG4gKi9cbi8qKlxuICogR2V0IHZpc2libGUgYXJlYSBvZiBlbGVtZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWaXNpYmxlQXJlYShpbml0QXJlYSwgc2Nyb2xsZXJMaXN0KSB7XG4gIHZhciB2aXNpYmxlQXJlYSA9IF9vYmplY3RTcHJlYWQoe30sIGluaXRBcmVhKTtcbiAgKHNjcm9sbGVyTGlzdCB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgaWYgKGVsZSBpbnN0YW5jZW9mIEhUTUxCb2R5RWxlbWVudCB8fCBlbGUgaW5zdGFuY2VvZiBIVE1MSHRtbEVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTa2lwIGlmIHN0YXRpYyBwb3NpdGlvbiB3aGljaCB3aWxsIG5vdCBhZmZlY3QgdmlzaWJsZSBhcmVhXG4gICAgdmFyIF9nZXRXaW4kZ2V0Q29tcHV0ZWRTdDIgPSBnZXRXaW4oZWxlKS5nZXRDb21wdXRlZFN0eWxlKGVsZSksXG4gICAgICBvdmVyZmxvdyA9IF9nZXRXaW4kZ2V0Q29tcHV0ZWRTdDIub3ZlcmZsb3csXG4gICAgICBvdmVyZmxvd0NsaXBNYXJnaW4gPSBfZ2V0V2luJGdldENvbXB1dGVkU3QyLm92ZXJmbG93Q2xpcE1hcmdpbixcbiAgICAgIGJvcmRlclRvcFdpZHRoID0gX2dldFdpbiRnZXRDb21wdXRlZFN0Mi5ib3JkZXJUb3BXaWR0aCxcbiAgICAgIGJvcmRlckJvdHRvbVdpZHRoID0gX2dldFdpbiRnZXRDb21wdXRlZFN0Mi5ib3JkZXJCb3R0b21XaWR0aCxcbiAgICAgIGJvcmRlckxlZnRXaWR0aCA9IF9nZXRXaW4kZ2V0Q29tcHV0ZWRTdDIuYm9yZGVyTGVmdFdpZHRoLFxuICAgICAgYm9yZGVyUmlnaHRXaWR0aCA9IF9nZXRXaW4kZ2V0Q29tcHV0ZWRTdDIuYm9yZGVyUmlnaHRXaWR0aDtcbiAgICB2YXIgZWxlUmVjdCA9IGVsZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB2YXIgZWxlT3V0SGVpZ2h0ID0gZWxlLm9mZnNldEhlaWdodCxcbiAgICAgIGVsZUlubmVySGVpZ2h0ID0gZWxlLmNsaWVudEhlaWdodCxcbiAgICAgIGVsZU91dFdpZHRoID0gZWxlLm9mZnNldFdpZHRoLFxuICAgICAgZWxlSW5uZXJXaWR0aCA9IGVsZS5jbGllbnRXaWR0aDtcbiAgICB2YXIgYm9yZGVyVG9wTnVtID0gZ2V0UHhWYWx1ZShib3JkZXJUb3BXaWR0aCk7XG4gICAgdmFyIGJvcmRlckJvdHRvbU51bSA9IGdldFB4VmFsdWUoYm9yZGVyQm90dG9tV2lkdGgpO1xuICAgIHZhciBib3JkZXJMZWZ0TnVtID0gZ2V0UHhWYWx1ZShib3JkZXJMZWZ0V2lkdGgpO1xuICAgIHZhciBib3JkZXJSaWdodE51bSA9IGdldFB4VmFsdWUoYm9yZGVyUmlnaHRXaWR0aCk7XG4gICAgdmFyIHNjYWxlWCA9IHRvTnVtKE1hdGgucm91bmQoZWxlUmVjdC53aWR0aCAvIGVsZU91dFdpZHRoICogMTAwMCkgLyAxMDAwKTtcbiAgICB2YXIgc2NhbGVZID0gdG9OdW0oTWF0aC5yb3VuZChlbGVSZWN0LmhlaWdodCAvIGVsZU91dEhlaWdodCAqIDEwMDApIC8gMTAwMCk7XG5cbiAgICAvLyBPcmlnaW5hbCB2aXNpYmxlIGFyZWFcbiAgICB2YXIgZWxlU2Nyb2xsV2lkdGggPSAoZWxlT3V0V2lkdGggLSBlbGVJbm5lcldpZHRoIC0gYm9yZGVyTGVmdE51bSAtIGJvcmRlclJpZ2h0TnVtKSAqIHNjYWxlWDtcbiAgICB2YXIgZWxlU2Nyb2xsSGVpZ2h0ID0gKGVsZU91dEhlaWdodCAtIGVsZUlubmVySGVpZ2h0IC0gYm9yZGVyVG9wTnVtIC0gYm9yZGVyQm90dG9tTnVtKSAqIHNjYWxlWTtcblxuICAgIC8vIEN1dCBib3JkZXIgc2l6ZVxuICAgIHZhciBzY2FsZWRCb3JkZXJUb3BXaWR0aCA9IGJvcmRlclRvcE51bSAqIHNjYWxlWTtcbiAgICB2YXIgc2NhbGVkQm9yZGVyQm90dG9tV2lkdGggPSBib3JkZXJCb3R0b21OdW0gKiBzY2FsZVk7XG4gICAgdmFyIHNjYWxlZEJvcmRlckxlZnRXaWR0aCA9IGJvcmRlckxlZnROdW0gKiBzY2FsZVg7XG4gICAgdmFyIHNjYWxlZEJvcmRlclJpZ2h0V2lkdGggPSBib3JkZXJSaWdodE51bSAqIHNjYWxlWDtcblxuICAgIC8vIENsaXAgbWFyZ2luXG4gICAgdmFyIGNsaXBNYXJnaW5XaWR0aCA9IDA7XG4gICAgdmFyIGNsaXBNYXJnaW5IZWlnaHQgPSAwO1xuICAgIGlmIChvdmVyZmxvdyA9PT0gJ2NsaXAnKSB7XG4gICAgICB2YXIgY2xpcE51bSA9IGdldFB4VmFsdWUob3ZlcmZsb3dDbGlwTWFyZ2luKTtcbiAgICAgIGNsaXBNYXJnaW5XaWR0aCA9IGNsaXBOdW0gKiBzY2FsZVg7XG4gICAgICBjbGlwTWFyZ2luSGVpZ2h0ID0gY2xpcE51bSAqIHNjYWxlWTtcbiAgICB9XG5cbiAgICAvLyBSZWdpb25cbiAgICB2YXIgZWxlTGVmdCA9IGVsZVJlY3QueCArIHNjYWxlZEJvcmRlckxlZnRXaWR0aCAtIGNsaXBNYXJnaW5XaWR0aDtcbiAgICB2YXIgZWxlVG9wID0gZWxlUmVjdC55ICsgc2NhbGVkQm9yZGVyVG9wV2lkdGggLSBjbGlwTWFyZ2luSGVpZ2h0O1xuICAgIHZhciBlbGVSaWdodCA9IGVsZUxlZnQgKyBlbGVSZWN0LndpZHRoICsgMiAqIGNsaXBNYXJnaW5XaWR0aCAtIHNjYWxlZEJvcmRlckxlZnRXaWR0aCAtIHNjYWxlZEJvcmRlclJpZ2h0V2lkdGggLSBlbGVTY3JvbGxXaWR0aDtcbiAgICB2YXIgZWxlQm90dG9tID0gZWxlVG9wICsgZWxlUmVjdC5oZWlnaHQgKyAyICogY2xpcE1hcmdpbkhlaWdodCAtIHNjYWxlZEJvcmRlclRvcFdpZHRoIC0gc2NhbGVkQm9yZGVyQm90dG9tV2lkdGggLSBlbGVTY3JvbGxIZWlnaHQ7XG4gICAgdmlzaWJsZUFyZWEubGVmdCA9IE1hdGgubWF4KHZpc2libGVBcmVhLmxlZnQsIGVsZUxlZnQpO1xuICAgIHZpc2libGVBcmVhLnRvcCA9IE1hdGgubWF4KHZpc2libGVBcmVhLnRvcCwgZWxlVG9wKTtcbiAgICB2aXNpYmxlQXJlYS5yaWdodCA9IE1hdGgubWluKHZpc2libGVBcmVhLnJpZ2h0LCBlbGVSaWdodCk7XG4gICAgdmlzaWJsZUFyZWEuYm90dG9tID0gTWF0aC5taW4odmlzaWJsZUFyZWEuYm90dG9tLCBlbGVCb3R0b20pO1xuICB9KTtcbiAgcmV0dXJuIHZpc2libGVBcmVhO1xufSIsICJpbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IHVzZUxheW91dEVmZmVjdCBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VMYXlvdXRFZmZlY3RcIjtcbmltcG9ydCB7IGNvbGxlY3RTY3JvbGxlciwgZ2V0V2luIH0gZnJvbSBcIi4uL3V0aWxcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVdhdGNoKG9wZW4sIHRhcmdldCwgcG9wdXAsIG9uQWxpZ24sIG9uU2Nyb2xsKSB7XG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKG9wZW4gJiYgdGFyZ2V0ICYmIHBvcHVwKSB7XG4gICAgICB2YXIgdGFyZ2V0RWxlbWVudCA9IHRhcmdldDtcbiAgICAgIHZhciBwb3B1cEVsZW1lbnQgPSBwb3B1cDtcbiAgICAgIHZhciB0YXJnZXRTY3JvbGxMaXN0ID0gY29sbGVjdFNjcm9sbGVyKHRhcmdldEVsZW1lbnQpO1xuICAgICAgdmFyIHBvcHVwU2Nyb2xsTGlzdCA9IGNvbGxlY3RTY3JvbGxlcihwb3B1cEVsZW1lbnQpO1xuICAgICAgdmFyIHdpbiA9IGdldFdpbihwb3B1cEVsZW1lbnQpO1xuICAgICAgdmFyIG1lcmdlZExpc3QgPSBuZXcgU2V0KFt3aW5dLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkodGFyZ2V0U2Nyb2xsTGlzdCksIF90b0NvbnN1bWFibGVBcnJheShwb3B1cFNjcm9sbExpc3QpKSk7XG4gICAgICBmdW5jdGlvbiBub3RpZnlTY3JvbGwoKSB7XG4gICAgICAgIG9uQWxpZ24oKTtcbiAgICAgICAgb25TY3JvbGwoKTtcbiAgICAgIH1cbiAgICAgIG1lcmdlZExpc3QuZm9yRWFjaChmdW5jdGlvbiAoc2Nyb2xsZXIpIHtcbiAgICAgICAgc2Nyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgbm90aWZ5U2Nyb2xsLCB7XG4gICAgICAgICAgcGFzc2l2ZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgd2luLmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIG5vdGlmeVNjcm9sbCwge1xuICAgICAgICBwYXNzaXZlOiB0cnVlXG4gICAgICB9KTtcblxuICAgICAgLy8gRmlyc3QgdGltZSBhbHdheXMgZG8gYWxpZ25cbiAgICAgIG9uQWxpZ24oKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIG1lcmdlZExpc3QuZm9yRWFjaChmdW5jdGlvbiAoc2Nyb2xsZXIpIHtcbiAgICAgICAgICBzY3JvbGxlci5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBub3RpZnlTY3JvbGwpO1xuICAgICAgICAgIHdpbi5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBub3RpZnlTY3JvbGwpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfVxuICB9LCBbb3BlbiwgdGFyZ2V0LCBwb3B1cF0pO1xufSIsICJpbXBvcnQgeyBnZXRTaGFkb3dSb290IH0gZnJvbSBcInJjLXV0aWwvZXMvRG9tL3NoYWRvd1wiO1xuaW1wb3J0IHsgd2FybmluZyB9IGZyb20gXCJyYy11dGlsL2VzL3dhcm5pbmdcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGdldFdpbiB9IGZyb20gXCIuLi91dGlsXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VXaW5DbGljayhvcGVuLCBjbGlja1RvSGlkZSwgdGFyZ2V0RWxlLCBwb3B1cEVsZSwgbWFzaywgbWFza0Nsb3NhYmxlLCBpblBvcHVwT3JDaGlsZCwgdHJpZ2dlck9wZW4pIHtcbiAgdmFyIG9wZW5SZWYgPSBSZWFjdC51c2VSZWYob3Blbik7XG4gIG9wZW5SZWYuY3VycmVudCA9IG9wZW47XG4gIHZhciBwb3B1cFBvaW50ZXJEb3duUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcblxuICAvLyBDbGljayB0byBoaWRlIGlzIHNwZWNpYWwgYWN0aW9uIHNpbmNlIGNsaWNrIHBvcHVwIGVsZW1lbnQgc2hvdWxkIG5vdCBoaWRlXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGNsaWNrVG9IaWRlICYmIHBvcHVwRWxlICYmICghbWFzayB8fCBtYXNrQ2xvc2FibGUpKSB7XG4gICAgICB2YXIgb25Qb2ludGVyRG93biA9IGZ1bmN0aW9uIG9uUG9pbnRlckRvd24oKSB7XG4gICAgICAgIHBvcHVwUG9pbnRlckRvd25SZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgfTtcbiAgICAgIHZhciBvblRyaWdnZXJDbG9zZSA9IGZ1bmN0aW9uIG9uVHJpZ2dlckNsb3NlKGUpIHtcbiAgICAgICAgdmFyIF9lJGNvbXBvc2VkUGF0aDtcbiAgICAgICAgaWYgKG9wZW5SZWYuY3VycmVudCAmJiAhaW5Qb3B1cE9yQ2hpbGQoKChfZSRjb21wb3NlZFBhdGggPSBlLmNvbXBvc2VkUGF0aCkgPT09IG51bGwgfHwgX2UkY29tcG9zZWRQYXRoID09PSB2b2lkIDAgfHwgKF9lJGNvbXBvc2VkUGF0aCA9IF9lJGNvbXBvc2VkUGF0aC5jYWxsKGUpKSA9PT0gbnVsbCB8fCBfZSRjb21wb3NlZFBhdGggPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lJGNvbXBvc2VkUGF0aFswXSkgfHwgZS50YXJnZXQpICYmICFwb3B1cFBvaW50ZXJEb3duUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICB0cmlnZ2VyT3BlbihmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB2YXIgd2luID0gZ2V0V2luKHBvcHVwRWxlKTtcbiAgICAgIHdpbi5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIG9uUG9pbnRlckRvd24sIHRydWUpO1xuICAgICAgd2luLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIG9uVHJpZ2dlckNsb3NlLCB0cnVlKTtcbiAgICAgIHdpbi5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIG9uVHJpZ2dlckNsb3NlLCB0cnVlKTtcblxuICAgICAgLy8gc2hhZG93IHJvb3RcbiAgICAgIHZhciB0YXJnZXRTaGFkb3dSb290ID0gZ2V0U2hhZG93Um9vdCh0YXJnZXRFbGUpO1xuICAgICAgaWYgKHRhcmdldFNoYWRvd1Jvb3QpIHtcbiAgICAgICAgdGFyZ2V0U2hhZG93Um9vdC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvblRyaWdnZXJDbG9zZSwgdHJ1ZSk7XG4gICAgICAgIHRhcmdldFNoYWRvd1Jvb3QuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCBvblRyaWdnZXJDbG9zZSwgdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFdhcm5pbmcgaWYgdGFyZ2V0IGFuZCBwb3B1cCBub3QgaW4gc2FtZSByb290XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICB2YXIgX3RhcmdldEVsZSRnZXRSb290Tm9kLCBfcG9wdXBFbGUkZ2V0Um9vdE5vZGU7XG4gICAgICAgIHZhciB0YXJnZXRSb290ID0gdGFyZ2V0RWxlID09PSBudWxsIHx8IHRhcmdldEVsZSA9PT0gdm9pZCAwIHx8IChfdGFyZ2V0RWxlJGdldFJvb3ROb2QgPSB0YXJnZXRFbGUuZ2V0Um9vdE5vZGUpID09PSBudWxsIHx8IF90YXJnZXRFbGUkZ2V0Um9vdE5vZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RhcmdldEVsZSRnZXRSb290Tm9kLmNhbGwodGFyZ2V0RWxlKTtcbiAgICAgICAgdmFyIHBvcHVwUm9vdCA9IChfcG9wdXBFbGUkZ2V0Um9vdE5vZGUgPSBwb3B1cEVsZS5nZXRSb290Tm9kZSkgPT09IG51bGwgfHwgX3BvcHVwRWxlJGdldFJvb3ROb2RlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfcG9wdXBFbGUkZ2V0Um9vdE5vZGUuY2FsbChwb3B1cEVsZSk7XG4gICAgICAgIHdhcm5pbmcodGFyZ2V0Um9vdCA9PT0gcG9wdXBSb290LCBcInRyaWdnZXIgZWxlbWVudCBhbmQgcG9wdXAgZWxlbWVudCBzaG91bGQgaW4gc2FtZSBzaGFkb3cgcm9vdC5cIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICB3aW4ucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCBvblBvaW50ZXJEb3duLCB0cnVlKTtcbiAgICAgICAgd2luLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIG9uVHJpZ2dlckNsb3NlLCB0cnVlKTtcbiAgICAgICAgd2luLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51Jywgb25UcmlnZ2VyQ2xvc2UsIHRydWUpO1xuICAgICAgICBpZiAodGFyZ2V0U2hhZG93Um9vdCkge1xuICAgICAgICAgIHRhcmdldFNoYWRvd1Jvb3QucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgb25UcmlnZ2VyQ2xvc2UsIHRydWUpO1xuICAgICAgICAgIHRhcmdldFNoYWRvd1Jvb3QucmVtb3ZlRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCBvblRyaWdnZXJDbG9zZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9LCBbY2xpY2tUb0hpZGUsIHRhcmdldEVsZSwgcG9wdXBFbGUsIG1hc2ssIG1hc2tDbG9zYWJsZV0pO1xuICBmdW5jdGlvbiBvblBvcHVwUG9pbnRlckRvd24oKSB7XG4gICAgcG9wdXBQb2ludGVyRG93blJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gb25Qb3B1cFBvaW50ZXJEb3duO1xufSIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJwcmVmaXhDbHNcIiwgXCJkaXNhYmxlZFwiLCBcInZpc2libGVcIiwgXCJjaGlsZHJlblwiLCBcInBvcHVwRWxlbWVudFwiLCBcImFuaW1hdGlvblwiLCBcInRyYW5zaXRpb25OYW1lXCIsIFwiZHJvcGRvd25TdHlsZVwiLCBcImRyb3Bkb3duQ2xhc3NOYW1lXCIsIFwiZGlyZWN0aW9uXCIsIFwicGxhY2VtZW50XCIsIFwiYnVpbHRpblBsYWNlbWVudHNcIiwgXCJkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGhcIiwgXCJkcm9wZG93blJlbmRlclwiLCBcImRyb3Bkb3duQWxpZ25cIiwgXCJnZXRQb3B1cENvbnRhaW5lclwiLCBcImVtcHR5XCIsIFwiZ2V0VHJpZ2dlckRPTU5vZGVcIiwgXCJvblBvcHVwVmlzaWJsZUNoYW5nZVwiLCBcIm9uUG9wdXBNb3VzZUVudGVyXCJdO1xuaW1wb3J0IFRyaWdnZXIgZnJvbSAnQHJjLWNvbXBvbmVudC90cmlnZ2VyJztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xudmFyIGdldEJ1aWx0SW5QbGFjZW1lbnRzID0gZnVuY3Rpb24gZ2V0QnVpbHRJblBsYWNlbWVudHMoZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoKSB7XG4gIC8vIEVuYWJsZSBob3Jpem9udGFsIG92ZXJmbG93IGF1dG8tYWRqdXN0bWVudCB3aGVuIGEgY3VzdG9tIGRyb3Bkb3duIHdpZHRoIGlzIHByb3ZpZGVkXG4gIHZhciBhZGp1c3RYID0gZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoID09PSB0cnVlID8gMCA6IDE7XG4gIHJldHVybiB7XG4gICAgYm90dG9tTGVmdDoge1xuICAgICAgcG9pbnRzOiBbJ3RsJywgJ2JsJ10sXG4gICAgICBvZmZzZXQ6IFswLCA0XSxcbiAgICAgIG92ZXJmbG93OiB7XG4gICAgICAgIGFkanVzdFg6IGFkanVzdFgsXG4gICAgICAgIGFkanVzdFk6IDFcbiAgICAgIH0sXG4gICAgICBodG1sUmVnaW9uOiAnc2Nyb2xsJ1xuICAgIH0sXG4gICAgYm90dG9tUmlnaHQ6IHtcbiAgICAgIHBvaW50czogWyd0cicsICdiciddLFxuICAgICAgb2Zmc2V0OiBbMCwgNF0sXG4gICAgICBvdmVyZmxvdzoge1xuICAgICAgICBhZGp1c3RYOiBhZGp1c3RYLFxuICAgICAgICBhZGp1c3RZOiAxXG4gICAgICB9LFxuICAgICAgaHRtbFJlZ2lvbjogJ3Njcm9sbCdcbiAgICB9LFxuICAgIHRvcExlZnQ6IHtcbiAgICAgIHBvaW50czogWydibCcsICd0bCddLFxuICAgICAgb2Zmc2V0OiBbMCwgLTRdLFxuICAgICAgb3ZlcmZsb3c6IHtcbiAgICAgICAgYWRqdXN0WDogYWRqdXN0WCxcbiAgICAgICAgYWRqdXN0WTogMVxuICAgICAgfSxcbiAgICAgIGh0bWxSZWdpb246ICdzY3JvbGwnXG4gICAgfSxcbiAgICB0b3BSaWdodDoge1xuICAgICAgcG9pbnRzOiBbJ2JyJywgJ3RyJ10sXG4gICAgICBvZmZzZXQ6IFswLCAtNF0sXG4gICAgICBvdmVyZmxvdzoge1xuICAgICAgICBhZGp1c3RYOiBhZGp1c3RYLFxuICAgICAgICBhZGp1c3RZOiAxXG4gICAgICB9LFxuICAgICAgaHRtbFJlZ2lvbjogJ3Njcm9sbCdcbiAgICB9XG4gIH07XG59O1xudmFyIFNlbGVjdFRyaWdnZXIgPSBmdW5jdGlvbiBTZWxlY3RUcmlnZ2VyKHByb3BzLCByZWYpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkLFxuICAgIHZpc2libGUgPSBwcm9wcy52aXNpYmxlLFxuICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgcG9wdXBFbGVtZW50ID0gcHJvcHMucG9wdXBFbGVtZW50LFxuICAgIGFuaW1hdGlvbiA9IHByb3BzLmFuaW1hdGlvbixcbiAgICB0cmFuc2l0aW9uTmFtZSA9IHByb3BzLnRyYW5zaXRpb25OYW1lLFxuICAgIGRyb3Bkb3duU3R5bGUgPSBwcm9wcy5kcm9wZG93blN0eWxlLFxuICAgIGRyb3Bkb3duQ2xhc3NOYW1lID0gcHJvcHMuZHJvcGRvd25DbGFzc05hbWUsXG4gICAgX3Byb3BzJGRpcmVjdGlvbiA9IHByb3BzLmRpcmVjdGlvbixcbiAgICBkaXJlY3Rpb24gPSBfcHJvcHMkZGlyZWN0aW9uID09PSB2b2lkIDAgPyAnbHRyJyA6IF9wcm9wcyRkaXJlY3Rpb24sXG4gICAgcGxhY2VtZW50ID0gcHJvcHMucGxhY2VtZW50LFxuICAgIGJ1aWx0aW5QbGFjZW1lbnRzID0gcHJvcHMuYnVpbHRpblBsYWNlbWVudHMsXG4gICAgZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoID0gcHJvcHMuZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoLFxuICAgIGRyb3Bkb3duUmVuZGVyID0gcHJvcHMuZHJvcGRvd25SZW5kZXIsXG4gICAgZHJvcGRvd25BbGlnbiA9IHByb3BzLmRyb3Bkb3duQWxpZ24sXG4gICAgZ2V0UG9wdXBDb250YWluZXIgPSBwcm9wcy5nZXRQb3B1cENvbnRhaW5lcixcbiAgICBlbXB0eSA9IHByb3BzLmVtcHR5LFxuICAgIGdldFRyaWdnZXJET01Ob2RlID0gcHJvcHMuZ2V0VHJpZ2dlckRPTU5vZGUsXG4gICAgb25Qb3B1cFZpc2libGVDaGFuZ2UgPSBwcm9wcy5vblBvcHVwVmlzaWJsZUNoYW5nZSxcbiAgICBvblBvcHVwTW91c2VFbnRlciA9IHByb3BzLm9uUG9wdXBNb3VzZUVudGVyLFxuICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgX2V4Y2x1ZGVkKTtcbiAgdmFyIGRyb3Bkb3duUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kcm9wZG93blwiKTtcbiAgdmFyIHBvcHVwTm9kZSA9IHBvcHVwRWxlbWVudDtcbiAgaWYgKGRyb3Bkb3duUmVuZGVyKSB7XG4gICAgcG9wdXBOb2RlID0gZHJvcGRvd25SZW5kZXIocG9wdXBFbGVtZW50KTtcbiAgfVxuICB2YXIgbWVyZ2VkQnVpbHRpblBsYWNlbWVudHMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gYnVpbHRpblBsYWNlbWVudHMgfHwgZ2V0QnVpbHRJblBsYWNlbWVudHMoZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoKTtcbiAgfSwgW2J1aWx0aW5QbGFjZW1lbnRzLCBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGhdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gTW90aW9uID09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG1lcmdlZFRyYW5zaXRpb25OYW1lID0gYW5pbWF0aW9uID8gXCJcIi5jb25jYXQoZHJvcGRvd25QcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQoYW5pbWF0aW9uKSA6IHRyYW5zaXRpb25OYW1lO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT0gUG9wdXAgV2lkdGggPT09PT09PT09PT09PT09PT09PVxuICB2YXIgaXNOdW1iZXJQb3B1cFdpZHRoID0gdHlwZW9mIGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCA9PT0gJ251bWJlcic7XG4gIHZhciBzdHJldGNoID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGlzTnVtYmVyUG9wdXBXaWR0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGggPT09IGZhbHNlID8gJ21pbldpZHRoJyA6ICd3aWR0aCc7XG4gIH0sIFtkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGgsIGlzTnVtYmVyUG9wdXBXaWR0aF0pO1xuICB2YXIgcG9wdXBTdHlsZSA9IGRyb3Bkb3duU3R5bGU7XG4gIGlmIChpc051bWJlclBvcHVwV2lkdGgpIHtcbiAgICBwb3B1cFN0eWxlID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwb3B1cFN0eWxlKSwge30sIHtcbiAgICAgIHdpZHRoOiBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGhcbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09IFJlZiA9PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgdHJpZ2dlclBvcHVwUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBnZXRQb3B1cEVsZW1lbnQ6IGZ1bmN0aW9uIGdldFBvcHVwRWxlbWVudCgpIHtcbiAgICAgICAgdmFyIF90cmlnZ2VyUG9wdXBSZWYkY3VycjtcbiAgICAgICAgcmV0dXJuIChfdHJpZ2dlclBvcHVwUmVmJGN1cnIgPSB0cmlnZ2VyUG9wdXBSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX3RyaWdnZXJQb3B1cFJlZiRjdXJyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdHJpZ2dlclBvcHVwUmVmJGN1cnIucG9wdXBFbGVtZW50O1xuICAgICAgfVxuICAgIH07XG4gIH0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVHJpZ2dlciwgX2V4dGVuZHMoe30sIHJlc3RQcm9wcywge1xuICAgIHNob3dBY3Rpb246IG9uUG9wdXBWaXNpYmxlQ2hhbmdlID8gWydjbGljayddIDogW10sXG4gICAgaGlkZUFjdGlvbjogb25Qb3B1cFZpc2libGVDaGFuZ2UgPyBbJ2NsaWNrJ10gOiBbXSxcbiAgICBwb3B1cFBsYWNlbWVudDogcGxhY2VtZW50IHx8IChkaXJlY3Rpb24gPT09ICdydGwnID8gJ2JvdHRvbVJpZ2h0JyA6ICdib3R0b21MZWZ0JyksXG4gICAgYnVpbHRpblBsYWNlbWVudHM6IG1lcmdlZEJ1aWx0aW5QbGFjZW1lbnRzLFxuICAgIHByZWZpeENsczogZHJvcGRvd25QcmVmaXhDbHMsXG4gICAgcG9wdXBUcmFuc2l0aW9uTmFtZTogbWVyZ2VkVHJhbnNpdGlvbk5hbWUsXG4gICAgcG9wdXA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIG9uTW91c2VFbnRlcjogb25Qb3B1cE1vdXNlRW50ZXJcbiAgICB9LCBwb3B1cE5vZGUpLFxuICAgIHJlZjogdHJpZ2dlclBvcHVwUmVmLFxuICAgIHN0cmV0Y2g6IHN0cmV0Y2gsXG4gICAgcG9wdXBBbGlnbjogZHJvcGRvd25BbGlnbixcbiAgICBwb3B1cFZpc2libGU6IHZpc2libGUsXG4gICAgZ2V0UG9wdXBDb250YWluZXI6IGdldFBvcHVwQ29udGFpbmVyLFxuICAgIHBvcHVwQ2xhc3NOYW1lOiBjbGFzc05hbWVzKGRyb3Bkb3duQ2xhc3NOYW1lLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KGRyb3Bkb3duUHJlZml4Q2xzLCBcIi1lbXB0eVwiKSwgZW1wdHkpKSxcbiAgICBwb3B1cFN0eWxlOiBwb3B1cFN0eWxlLFxuICAgIGdldFRyaWdnZXJET01Ob2RlOiBnZXRUcmlnZ2VyRE9NTm9kZSxcbiAgICBvblBvcHVwVmlzaWJsZUNoYW5nZTogb25Qb3B1cFZpc2libGVDaGFuZ2VcbiAgfSksIGNoaWxkcmVuKTtcbn07XG52YXIgUmVmU2VsZWN0VHJpZ2dlciA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKFNlbGVjdFRyaWdnZXIpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgUmVmU2VsZWN0VHJpZ2dlci5kaXNwbGF5TmFtZSA9ICdTZWxlY3RUcmlnZ2VyJztcbn1cbmV4cG9ydCBkZWZhdWx0IFJlZlNlbGVjdFRyaWdnZXI7IiwgImltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX3RvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQXJyYXlcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgd2FybmluZyBmcm9tIFwicmMtdXRpbC9lcy93YXJuaW5nXCI7XG5mdW5jdGlvbiBnZXRLZXkoZGF0YSwgaW5kZXgpIHtcbiAgdmFyIGtleSA9IGRhdGEua2V5O1xuICB2YXIgdmFsdWU7XG4gIGlmICgndmFsdWUnIGluIGRhdGEpIHtcbiAgICB2YWx1ZSA9IGRhdGEudmFsdWU7XG4gIH1cbiAgaWYgKGtleSAhPT0gbnVsbCAmJiBrZXkgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBrZXk7XG4gIH1cbiAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIFwicmMtaW5kZXgta2V5LVwiLmNvbmNhdChpbmRleCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZENvdW50KHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnICYmICFOdW1iZXIuaXNOYU4odmFsdWUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZpbGxGaWVsZE5hbWVzKGZpZWxkTmFtZXMsIGNoaWxkcmVuQXNEYXRhKSB7XG4gIHZhciBfcmVmID0gZmllbGROYW1lcyB8fCB7fSxcbiAgICBsYWJlbCA9IF9yZWYubGFiZWwsXG4gICAgdmFsdWUgPSBfcmVmLnZhbHVlLFxuICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnMsXG4gICAgZ3JvdXBMYWJlbCA9IF9yZWYuZ3JvdXBMYWJlbDtcbiAgdmFyIG1lcmdlZExhYmVsID0gbGFiZWwgfHwgKGNoaWxkcmVuQXNEYXRhID8gJ2NoaWxkcmVuJyA6ICdsYWJlbCcpO1xuICByZXR1cm4ge1xuICAgIGxhYmVsOiBtZXJnZWRMYWJlbCxcbiAgICB2YWx1ZTogdmFsdWUgfHwgJ3ZhbHVlJyxcbiAgICBvcHRpb25zOiBvcHRpb25zIHx8ICdvcHRpb25zJyxcbiAgICBncm91cExhYmVsOiBncm91cExhYmVsIHx8IG1lcmdlZExhYmVsXG4gIH07XG59XG5cbi8qKlxuICogRmxhdCBvcHRpb25zIGludG8gZmxhdHRlbiBsaXN0LlxuICogV2UgdXNlIGBvcHRpb25Pbmx5YCBoZXJlIGlzIGFpbSB0byBhdm9pZCB1c2VyIHVzZSBuZXN0ZWQgb3B0aW9uIGdyb3VwLlxuICogSGVyZSBpcyBzaW1wbHkgc2V0IGBrZXlgIHRvIHRoZSBpbmRleCBpZiBub3QgcHJvdmlkZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuT3B0aW9ucyhvcHRpb25zKSB7XG4gIHZhciBfcmVmMiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge30sXG4gICAgZmllbGROYW1lcyA9IF9yZWYyLmZpZWxkTmFtZXMsXG4gICAgY2hpbGRyZW5Bc0RhdGEgPSBfcmVmMi5jaGlsZHJlbkFzRGF0YTtcbiAgdmFyIGZsYXR0ZW5MaXN0ID0gW107XG4gIHZhciBfZmlsbEZpZWxkTmFtZXMgPSBmaWxsRmllbGROYW1lcyhmaWVsZE5hbWVzLCBmYWxzZSksXG4gICAgZmllbGRMYWJlbCA9IF9maWxsRmllbGROYW1lcy5sYWJlbCxcbiAgICBmaWVsZFZhbHVlID0gX2ZpbGxGaWVsZE5hbWVzLnZhbHVlLFxuICAgIGZpZWxkT3B0aW9ucyA9IF9maWxsRmllbGROYW1lcy5vcHRpb25zLFxuICAgIGdyb3VwTGFiZWwgPSBfZmlsbEZpZWxkTmFtZXMuZ3JvdXBMYWJlbDtcbiAgZnVuY3Rpb24gZGlnKGxpc3QsIGlzR3JvdXBPcHRpb24pIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobGlzdCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICBpZiAoaXNHcm91cE9wdGlvbiB8fCAhKGZpZWxkT3B0aW9ucyBpbiBkYXRhKSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBkYXRhW2ZpZWxkVmFsdWVdO1xuXG4gICAgICAgIC8vIE9wdGlvblxuICAgICAgICBmbGF0dGVuTGlzdC5wdXNoKHtcbiAgICAgICAgICBrZXk6IGdldEtleShkYXRhLCBmbGF0dGVuTGlzdC5sZW5ndGgpLFxuICAgICAgICAgIGdyb3VwT3B0aW9uOiBpc0dyb3VwT3B0aW9uLFxuICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgbGFiZWw6IGRhdGFbZmllbGRMYWJlbF0sXG4gICAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGdycExhYmVsID0gZGF0YVtncm91cExhYmVsXTtcbiAgICAgICAgaWYgKGdycExhYmVsID09PSB1bmRlZmluZWQgJiYgY2hpbGRyZW5Bc0RhdGEpIHtcbiAgICAgICAgICBncnBMYWJlbCA9IGRhdGEubGFiZWw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPcHRpb24gR3JvdXBcbiAgICAgICAgZmxhdHRlbkxpc3QucHVzaCh7XG4gICAgICAgICAga2V5OiBnZXRLZXkoZGF0YSwgZmxhdHRlbkxpc3QubGVuZ3RoKSxcbiAgICAgICAgICBncm91cDogdHJ1ZSxcbiAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICAgIGxhYmVsOiBncnBMYWJlbFxuICAgICAgICB9KTtcbiAgICAgICAgZGlnKGRhdGFbZmllbGRPcHRpb25zXSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgZGlnKG9wdGlvbnMsIGZhbHNlKTtcbiAgcmV0dXJuIGZsYXR0ZW5MaXN0O1xufVxuXG4vKipcbiAqIEluamVjdCBgcHJvcHNgIGludG8gYG9wdGlvbmAgZm9yIGxlZ2FjeSB1c2FnZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0UHJvcHNXaXRoT3B0aW9uKG9wdGlvbikge1xuICB2YXIgbmV3T3B0aW9uID0gX29iamVjdFNwcmVhZCh7fSwgb3B0aW9uKTtcbiAgaWYgKCEoJ3Byb3BzJyBpbiBuZXdPcHRpb24pKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld09wdGlvbiwgJ3Byb3BzJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHdhcm5pbmcoZmFsc2UsICdSZXR1cm4gdHlwZSBpcyBvcHRpb24gaW5zdGVhZCBvZiBPcHRpb24gaW5zdGFuY2UuIFBsZWFzZSByZWFkIHZhbHVlIGRpcmVjdGx5IGluc3RlYWQgb2YgcmVhZGluZyBmcm9tIGBwcm9wc2AuJyk7XG4gICAgICAgIHJldHVybiBuZXdPcHRpb247XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG5ld09wdGlvbjtcbn1cbmV4cG9ydCB2YXIgZ2V0U2VwYXJhdGVkQ29udGVudCA9IGZ1bmN0aW9uIGdldFNlcGFyYXRlZENvbnRlbnQodGV4dCwgdG9rZW5zLCBlbmQpIHtcbiAgaWYgKCF0b2tlbnMgfHwgIXRva2Vucy5sZW5ndGgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2YXIgbWF0Y2ggPSBmYWxzZTtcbiAgdmFyIHNlcGFyYXRlID0gZnVuY3Rpb24gc2VwYXJhdGUoc3RyLCBfcmVmMykge1xuICAgIHZhciBfcmVmNCA9IF90b0FycmF5KF9yZWYzKSxcbiAgICAgIHRva2VuID0gX3JlZjRbMF0sXG4gICAgICByZXN0VG9rZW5zID0gX3JlZjQuc2xpY2UoMSk7XG4gICAgaWYgKCF0b2tlbikge1xuICAgICAgcmV0dXJuIFtzdHJdO1xuICAgIH1cbiAgICB2YXIgbGlzdCA9IHN0ci5zcGxpdCh0b2tlbik7XG4gICAgbWF0Y2ggPSBtYXRjaCB8fCBsaXN0Lmxlbmd0aCA+IDE7XG4gICAgcmV0dXJuIGxpc3QucmVkdWNlKGZ1bmN0aW9uIChwcmV2TGlzdCwgdW5pdFN0cikge1xuICAgICAgcmV0dXJuIFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkocHJldkxpc3QpLCBfdG9Db25zdW1hYmxlQXJyYXkoc2VwYXJhdGUodW5pdFN0ciwgcmVzdFRva2VucykpKTtcbiAgICB9LCBbXSkuZmlsdGVyKEJvb2xlYW4pO1xuICB9O1xuICB2YXIgbGlzdCA9IHNlcGFyYXRlKHRleHQsIHRva2Vucyk7XG4gIGlmIChtYXRjaCkge1xuICAgIHJldHVybiB0eXBlb2YgZW5kICE9PSAndW5kZWZpbmVkJyA/IGxpc3Quc2xpY2UoMCwgZW5kKSA6IGxpc3Q7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn07IiwgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcblxuLy8gVXNlIGFueSBoZXJlIHNpbmNlIHdlIGRvIG5vdCBnZXQgdGhlIHR5cGUgZHVyaW5nIGNvbXBpbGF0aW9uXG5cbnZhciBTZWxlY3RDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQobnVsbCk7XG5leHBvcnQgZGVmYXVsdCBTZWxlY3RDb250ZXh0OyIsICJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBQb2xpdGUocHJvcHMpIHtcbiAgdmFyIHZpc2libGUgPSBwcm9wcy52aXNpYmxlLFxuICAgIHZhbHVlcyA9IHByb3BzLnZhbHVlcztcbiAgaWYgKCF2aXNpYmxlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBPbmx5IGN1dCBwYXJ0IG9mIHZhbHVlcyBzaW5jZSBpdCdzIGEgc2NyZWVuIHJlYWRlclxuICB2YXIgTUFYX0NPVU5UID0gNTA7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIFwiYXJpYS1saXZlXCI6IFwicG9saXRlXCIsXG4gICAgc3R5bGU6IHtcbiAgICAgIHdpZHRoOiAwLFxuICAgICAgaGVpZ2h0OiAwLFxuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgICBvcGFjaXR5OiAwXG4gICAgfVxuICB9LCBcIlwiLmNvbmNhdCh2YWx1ZXMuc2xpY2UoMCwgTUFYX0NPVU5UKS5tYXAoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIgbGFiZWwgPSBfcmVmLmxhYmVsLFxuICAgICAgdmFsdWUgPSBfcmVmLnZhbHVlO1xuICAgIHJldHVybiBbJ251bWJlcicsICdzdHJpbmcnXS5pbmNsdWRlcyhfdHlwZW9mKGxhYmVsKSkgPyBsYWJlbCA6IHZhbHVlO1xuICB9KS5qb2luKCcsICcpKSwgdmFsdWVzLmxlbmd0aCA+IE1BWF9DT1VOVCA/ICcsIC4uLicgOiBudWxsKTtcbn0iLCAiLyogaXN0YW5idWwgaWdub3JlIGZpbGUgKi9cblxuLyoqIFRoaXMgaXMgYSBwbGFjZWhvbGRlciwgbm90IHJlYWwgcmVuZGVyIGluIGRvbSAqL1xudmFyIE9wdEdyb3VwID0gZnVuY3Rpb24gT3B0R3JvdXAoKSB7XG4gIHJldHVybiBudWxsO1xufTtcbk9wdEdyb3VwLmlzU2VsZWN0T3B0R3JvdXAgPSB0cnVlO1xuZXhwb3J0IGRlZmF1bHQgT3B0R3JvdXA7IiwgIi8qIGlzdGFuYnVsIGlnbm9yZSBmaWxlICovXG5cbi8qKiBUaGlzIGlzIGEgcGxhY2Vob2xkZXIsIG5vdCByZWFsIHJlbmRlciBpbiBkb20gKi9cbnZhciBPcHRpb24gPSBmdW5jdGlvbiBPcHRpb24oKSB7XG4gIHJldHVybiBudWxsO1xufTtcbk9wdGlvbi5pc1NlbGVjdE9wdGlvbiA9IHRydWU7XG5leHBvcnQgZGVmYXVsdCBPcHRpb247IiwgImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiZGlzYWJsZWRcIiwgXCJ0aXRsZVwiLCBcImNoaWxkcmVuXCIsIFwic3R5bGVcIiwgXCJjbGFzc05hbWVcIl07XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBLZXlDb2RlIGZyb20gXCJyYy11dGlsL2VzL0tleUNvZGVcIjtcbmltcG9ydCB1c2VNZW1vIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZU1lbW9cIjtcbmltcG9ydCBvbWl0IGZyb20gXCJyYy11dGlsL2VzL29taXRcIjtcbmltcG9ydCBwaWNrQXR0cnMgZnJvbSBcInJjLXV0aWwvZXMvcGlja0F0dHJzXCI7XG5pbXBvcnQgTGlzdCBmcm9tICdyYy12aXJ0dWFsLWxpc3QnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFNlbGVjdENvbnRleHQgZnJvbSBcIi4vU2VsZWN0Q29udGV4dFwiO1xuaW1wb3J0IFRyYW5zQnRuIGZyb20gXCIuL1RyYW5zQnRuXCI7XG5pbXBvcnQgdXNlQmFzZVByb3BzIGZyb20gXCIuL2hvb2tzL3VzZUJhc2VQcm9wc1wiO1xuaW1wb3J0IHsgaXNQbGF0Zm9ybU1hYyB9IGZyb20gXCIuL3V0aWxzL3BsYXRmb3JtVXRpbFwiO1xuaW1wb3J0IHsgaXNWYWxpZENvdW50IH0gZnJvbSBcIi4vdXRpbHMvdmFsdWVVdGlsXCI7XG5cbi8vIGV4cG9ydCBpbnRlcmZhY2UgT3B0aW9uTGlzdFByb3BzPE9wdGlvbnNUeXBlIGV4dGVuZHMgb2JqZWN0W10+IHtcblxuZnVuY3Rpb24gaXNUaXRsZVR5cGUoY29udGVudCkge1xuICByZXR1cm4gdHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBjb250ZW50ID09PSAnbnVtYmVyJztcbn1cblxuLyoqXG4gKiBVc2luZyB2aXJ0dWFsIGxpc3Qgb2Ygb3B0aW9uIGRpc3BsYXkuXG4gKiBXaWxsIGZhbGxiYWNrIHRvIGRvbSBpZiB1c2UgY3VzdG9taXplIHJlbmRlci5cbiAqL1xudmFyIE9wdGlvbkxpc3QgPSBmdW5jdGlvbiBPcHRpb25MaXN0KF8sIHJlZikge1xuICB2YXIgX3VzZUJhc2VQcm9wcyA9IHVzZUJhc2VQcm9wcygpLFxuICAgIHByZWZpeENscyA9IF91c2VCYXNlUHJvcHMucHJlZml4Q2xzLFxuICAgIGlkID0gX3VzZUJhc2VQcm9wcy5pZCxcbiAgICBvcGVuID0gX3VzZUJhc2VQcm9wcy5vcGVuLFxuICAgIG11bHRpcGxlID0gX3VzZUJhc2VQcm9wcy5tdWx0aXBsZSxcbiAgICBtb2RlID0gX3VzZUJhc2VQcm9wcy5tb2RlLFxuICAgIHNlYXJjaFZhbHVlID0gX3VzZUJhc2VQcm9wcy5zZWFyY2hWYWx1ZSxcbiAgICB0b2dnbGVPcGVuID0gX3VzZUJhc2VQcm9wcy50b2dnbGVPcGVuLFxuICAgIG5vdEZvdW5kQ29udGVudCA9IF91c2VCYXNlUHJvcHMubm90Rm91bmRDb250ZW50LFxuICAgIG9uUG9wdXBTY3JvbGwgPSBfdXNlQmFzZVByb3BzLm9uUG9wdXBTY3JvbGw7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoU2VsZWN0Q29udGV4dCksXG4gICAgbWF4Q291bnQgPSBfUmVhY3QkdXNlQ29udGV4dC5tYXhDb3VudCxcbiAgICBmbGF0dGVuT3B0aW9ucyA9IF9SZWFjdCR1c2VDb250ZXh0LmZsYXR0ZW5PcHRpb25zLFxuICAgIG9uQWN0aXZlVmFsdWUgPSBfUmVhY3QkdXNlQ29udGV4dC5vbkFjdGl2ZVZhbHVlLFxuICAgIGRlZmF1bHRBY3RpdmVGaXJzdE9wdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRlZmF1bHRBY3RpdmVGaXJzdE9wdGlvbixcbiAgICBvblNlbGVjdCA9IF9SZWFjdCR1c2VDb250ZXh0Lm9uU2VsZWN0LFxuICAgIG1lbnVJdGVtU2VsZWN0ZWRJY29uID0gX1JlYWN0JHVzZUNvbnRleHQubWVudUl0ZW1TZWxlY3RlZEljb24sXG4gICAgcmF3VmFsdWVzID0gX1JlYWN0JHVzZUNvbnRleHQucmF3VmFsdWVzLFxuICAgIGZpZWxkTmFtZXMgPSBfUmVhY3QkdXNlQ29udGV4dC5maWVsZE5hbWVzLFxuICAgIHZpcnR1YWwgPSBfUmVhY3QkdXNlQ29udGV4dC52aXJ0dWFsLFxuICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbixcbiAgICBsaXN0SGVpZ2h0ID0gX1JlYWN0JHVzZUNvbnRleHQubGlzdEhlaWdodCxcbiAgICBsaXN0SXRlbUhlaWdodCA9IF9SZWFjdCR1c2VDb250ZXh0Lmxpc3RJdGVtSGVpZ2h0LFxuICAgIG9wdGlvblJlbmRlciA9IF9SZWFjdCR1c2VDb250ZXh0Lm9wdGlvblJlbmRlcjtcbiAgdmFyIGl0ZW1QcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW1cIik7XG4gIHZhciBtZW1vRmxhdHRlbk9wdGlvbnMgPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZmxhdHRlbk9wdGlvbnM7XG4gIH0sIFtvcGVuLCBmbGF0dGVuT3B0aW9uc10sIGZ1bmN0aW9uIChwcmV2LCBuZXh0KSB7XG4gICAgcmV0dXJuIG5leHRbMF0gJiYgcHJldlsxXSAhPT0gbmV4dFsxXTtcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IExpc3QgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBsaXN0UmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICB2YXIgb3Zlck1heENvdW50ID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG11bHRpcGxlICYmIGlzVmFsaWRDb3VudChtYXhDb3VudCkgJiYgKHJhd1ZhbHVlcyA9PT0gbnVsbCB8fCByYXdWYWx1ZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJhd1ZhbHVlcy5zaXplKSA+PSBtYXhDb3VudDtcbiAgfSwgW211bHRpcGxlLCBtYXhDb3VudCwgcmF3VmFsdWVzID09PSBudWxsIHx8IHJhd1ZhbHVlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmF3VmFsdWVzLnNpemVdKTtcbiAgdmFyIG9uTGlzdE1vdXNlRG93biA9IGZ1bmN0aW9uIG9uTGlzdE1vdXNlRG93bihldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH07XG4gIHZhciBzY3JvbGxJbnRvVmlldyA9IGZ1bmN0aW9uIHNjcm9sbEludG9WaWV3KGFyZ3MpIHtcbiAgICB2YXIgX2xpc3RSZWYkY3VycmVudDtcbiAgICAoX2xpc3RSZWYkY3VycmVudCA9IGxpc3RSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2xpc3RSZWYkY3VycmVudCA9PT0gdm9pZCAwIHx8IF9saXN0UmVmJGN1cnJlbnQuc2Nyb2xsVG8odHlwZW9mIGFyZ3MgPT09ICdudW1iZXInID8ge1xuICAgICAgaW5kZXg6IGFyZ3NcbiAgICB9IDogYXJncyk7XG4gIH07XG5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMzQ5NzVcbiAgdmFyIGlzU2VsZWN0ZWQgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBpZiAobW9kZSA9PT0gJ2NvbWJvYm94Jykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gcmF3VmFsdWVzLmhhcyh2YWx1ZSk7XG4gIH0sIFttb2RlLCBfdG9Db25zdW1hYmxlQXJyYXkocmF3VmFsdWVzKS50b1N0cmluZygpLCByYXdWYWx1ZXMuc2l6ZV0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IEFjdGl2ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgZ2V0RW5hYmxlZEFjdGl2ZUluZGV4ID0gZnVuY3Rpb24gZ2V0RW5hYmxlZEFjdGl2ZUluZGV4KGluZGV4KSB7XG4gICAgdmFyIG9mZnNldCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMTtcbiAgICB2YXIgbGVuID0gbWVtb0ZsYXR0ZW5PcHRpb25zLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICB2YXIgY3VycmVudCA9IChpbmRleCArIGkgKiBvZmZzZXQgKyBsZW4pICUgbGVuO1xuICAgICAgdmFyIF9yZWYgPSBtZW1vRmxhdHRlbk9wdGlvbnNbY3VycmVudF0gfHwge30sXG4gICAgICAgIGdyb3VwID0gX3JlZi5ncm91cCxcbiAgICAgICAgZGF0YSA9IF9yZWYuZGF0YTtcbiAgICAgIGlmICghZ3JvdXAgJiYgIShkYXRhICE9PSBudWxsICYmIGRhdGEgIT09IHZvaWQgMCAmJiBkYXRhLmRpc2FibGVkKSAmJiAoaXNTZWxlY3RlZChkYXRhLnZhbHVlKSB8fCAhb3Zlck1heENvdW50KSkge1xuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9O1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGdldEVuYWJsZWRBY3RpdmVJbmRleCgwKTtcbiAgICB9KSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBhY3RpdmVJbmRleCA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0QWN0aXZlSW5kZXggPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICB2YXIgc2V0QWN0aXZlID0gZnVuY3Rpb24gc2V0QWN0aXZlKGluZGV4KSB7XG4gICAgdmFyIGZyb21LZXlib2FyZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG4gICAgc2V0QWN0aXZlSW5kZXgoaW5kZXgpO1xuICAgIHZhciBpbmZvID0ge1xuICAgICAgc291cmNlOiBmcm9tS2V5Ym9hcmQgPyAna2V5Ym9hcmQnIDogJ21vdXNlJ1xuICAgIH07XG5cbiAgICAvLyBUcmlnZ2VyIGFjdGl2ZSBldmVudFxuICAgIHZhciBmbGF0dGVuSXRlbSA9IG1lbW9GbGF0dGVuT3B0aW9uc1tpbmRleF07XG4gICAgaWYgKCFmbGF0dGVuSXRlbSkge1xuICAgICAgb25BY3RpdmVWYWx1ZShudWxsLCAtMSwgaW5mbyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG9uQWN0aXZlVmFsdWUoZmxhdHRlbkl0ZW0udmFsdWUsIGluZGV4LCBpbmZvKTtcbiAgfTtcblxuICAvLyBBdXRvIGFjdGl2ZSBmaXJzdCBpdGVtIHdoZW4gbGlzdCBsZW5ndGggb3Igc2VhcmNoVmFsdWUgY2hhbmdlZFxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHNldEFjdGl2ZShkZWZhdWx0QWN0aXZlRmlyc3RPcHRpb24gIT09IGZhbHNlID8gZ2V0RW5hYmxlZEFjdGl2ZUluZGV4KDApIDogLTEpO1xuICB9LCBbbWVtb0ZsYXR0ZW5PcHRpb25zLmxlbmd0aCwgc2VhcmNoVmFsdWVdKTtcblxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy80ODAzNlxuICB2YXIgaXNBcmlhU2VsZWN0ZWQgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBpZiAobW9kZSA9PT0gJ2NvbWJvYm94Jykge1xuICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSkudG9Mb3dlckNhc2UoKSA9PT0gc2VhcmNoVmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJhd1ZhbHVlcy5oYXModmFsdWUpO1xuICB9LCBbbW9kZSwgc2VhcmNoVmFsdWUsIF90b0NvbnN1bWFibGVBcnJheShyYXdWYWx1ZXMpLnRvU3RyaW5nKCksIHJhd1ZhbHVlcy5zaXplXSk7XG5cbiAgLy8gQXV0byBzY3JvbGwgdG8gaXRlbSBwb3NpdGlvbiBpbiBzaW5nbGUgbW9kZVxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIFJlYWN0IHdpbGwgc2tpcCBgb25DaGFuZ2VgIHdoZW4gY29tcG9uZW50IHVwZGF0ZS5cbiAgICAgKiBgc2V0QWN0aXZlYCBmdW5jdGlvbiB3aWxsIGNhbGwgcm9vdCBhY2Nlc3NpYmlsaXR5IHN0YXRlIHVwZGF0ZSB3aGljaCBtYWtlcyByZS1yZW5kZXIuXG4gICAgICogU28gd2UgbmVlZCB0byBkZWxheSB0byBsZXQgSW5wdXQgY29tcG9uZW50IHRyaWdnZXIgb25DaGFuZ2UgZmlyc3QuXG4gICAgICovXG4gICAgdmFyIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFtdWx0aXBsZSAmJiBvcGVuICYmIHJhd1ZhbHVlcy5zaXplID09PSAxKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IEFycmF5LmZyb20ocmF3VmFsdWVzKVswXTtcbiAgICAgICAgLy8gU2Nyb2xsIHRvIHRoZSBvcHRpb24gY2xvc2VzdCB0byB0aGUgc2VhcmNoVmFsdWUgaWYgc2VhcmNoaW5nLlxuICAgICAgICB2YXIgaW5kZXggPSBtZW1vRmxhdHRlbk9wdGlvbnMuZmluZEluZGV4KGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgICAgIHZhciBkYXRhID0gX3JlZjIuZGF0YTtcbiAgICAgICAgICByZXR1cm4gc2VhcmNoVmFsdWUgPyBTdHJpbmcoZGF0YS52YWx1ZSkuc3RhcnRzV2l0aChzZWFyY2hWYWx1ZSkgOiBkYXRhLnZhbHVlID09PSB2YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICBzZXRBY3RpdmUoaW5kZXgpO1xuICAgICAgICAgIHNjcm9sbEludG9WaWV3KGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gRm9yY2UgdHJpZ2dlciBzY3JvbGxiYXIgdmlzaWJsZSB3aGVuIG9wZW5cbiAgICBpZiAob3Blbikge1xuICAgICAgdmFyIF9saXN0UmVmJGN1cnJlbnQyO1xuICAgICAgKF9saXN0UmVmJGN1cnJlbnQyID0gbGlzdFJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfbGlzdFJlZiRjdXJyZW50MiA9PT0gdm9pZCAwIHx8IF9saXN0UmVmJGN1cnJlbnQyLnNjcm9sbFRvKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgfTtcbiAgfSwgW29wZW4sIHNlYXJjaFZhbHVlXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gVmFsdWVzID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBvblNlbGVjdFZhbHVlID0gZnVuY3Rpb24gb25TZWxlY3RWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBvblNlbGVjdCh2YWx1ZSwge1xuICAgICAgICBzZWxlY3RlZDogIXJhd1ZhbHVlcy5oYXModmFsdWUpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBTaW5nbGUgbW9kZSBzaG91bGQgYWx3YXlzIGNsb3NlIGJ5IHNlbGVjdFxuICAgIGlmICghbXVsdGlwbGUpIHtcbiAgICAgIHRvZ2dsZU9wZW4oZmFsc2UpO1xuICAgIH1cbiAgfTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IEtleWJvYXJkID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgUmVhY3QudXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgb25LZXlEb3duOiBmdW5jdGlvbiBvbktleURvd24oZXZlbnQpIHtcbiAgICAgICAgdmFyIHdoaWNoID0gZXZlbnQud2hpY2gsXG4gICAgICAgICAgY3RybEtleSA9IGV2ZW50LmN0cmxLZXk7XG4gICAgICAgIHN3aXRjaCAod2hpY2gpIHtcbiAgICAgICAgICAvLyA+Pj4gQXJyb3cga2V5cyAmIGN0cmwgKyBuL3Agb24gTWFjXG4gICAgICAgICAgY2FzZSBLZXlDb2RlLk46XG4gICAgICAgICAgY2FzZSBLZXlDb2RlLlA6XG4gICAgICAgICAgY2FzZSBLZXlDb2RlLlVQOlxuICAgICAgICAgIGNhc2UgS2V5Q29kZS5ET1dOOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gMDtcbiAgICAgICAgICAgICAgaWYgKHdoaWNoID09PSBLZXlDb2RlLlVQKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gLTE7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hpY2ggPT09IEtleUNvZGUuRE9XTikge1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IDE7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNQbGF0Zm9ybU1hYygpICYmIGN0cmxLZXkpIHtcbiAgICAgICAgICAgICAgICBpZiAod2hpY2ggPT09IEtleUNvZGUuTikge1xuICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gMTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoaWNoID09PSBLZXlDb2RlLlApIHtcbiAgICAgICAgICAgICAgICAgIG9mZnNldCA9IC0xO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAob2Zmc2V0ICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5leHRBY3RpdmVJbmRleCA9IGdldEVuYWJsZWRBY3RpdmVJbmRleChhY3RpdmVJbmRleCArIG9mZnNldCwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBzY3JvbGxJbnRvVmlldyhuZXh0QWN0aXZlSW5kZXgpO1xuICAgICAgICAgICAgICAgIHNldEFjdGl2ZShuZXh0QWN0aXZlSW5kZXgsIHRydWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gPj4+IFNlbGVjdCAoVGFiIC8gRW50ZXIpXG4gICAgICAgICAgY2FzZSBLZXlDb2RlLlRBQjpcbiAgICAgICAgICBjYXNlIEtleUNvZGUuRU5URVI6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHZhciBfaXRlbSRkYXRhO1xuICAgICAgICAgICAgICAvLyB2YWx1ZVxuICAgICAgICAgICAgICB2YXIgaXRlbSA9IG1lbW9GbGF0dGVuT3B0aW9uc1thY3RpdmVJbmRleF07XG4gICAgICAgICAgICAgIGlmIChpdGVtICYmICEoaXRlbSAhPT0gbnVsbCAmJiBpdGVtICE9PSB2b2lkIDAgJiYgKF9pdGVtJGRhdGEgPSBpdGVtLmRhdGEpICE9PSBudWxsICYmIF9pdGVtJGRhdGEgIT09IHZvaWQgMCAmJiBfaXRlbSRkYXRhLmRpc2FibGVkKSAmJiAhb3Zlck1heENvdW50KSB7XG4gICAgICAgICAgICAgICAgb25TZWxlY3RWYWx1ZShpdGVtLnZhbHVlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvblNlbGVjdFZhbHVlKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKG9wZW4pIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gPj4+IENsb3NlXG4gICAgICAgICAgY2FzZSBLZXlDb2RlLkVTQzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdG9nZ2xlT3BlbihmYWxzZSk7XG4gICAgICAgICAgICAgIGlmIChvcGVuKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9uS2V5VXA6IGZ1bmN0aW9uIG9uS2V5VXAoKSB7fSxcbiAgICAgIHNjcm9sbFRvOiBmdW5jdGlvbiBzY3JvbGxUbyhpbmRleCkge1xuICAgICAgICBzY3JvbGxJbnRvVmlldyhpbmRleCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGlmIChtZW1vRmxhdHRlbk9wdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIHJvbGU6IFwibGlzdGJveFwiLFxuICAgICAgaWQ6IFwiXCIuY29uY2F0KGlkLCBcIl9saXN0XCIpLFxuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChpdGVtUHJlZml4Q2xzLCBcIi1lbXB0eVwiKSxcbiAgICAgIG9uTW91c2VEb3duOiBvbkxpc3RNb3VzZURvd25cbiAgICB9LCBub3RGb3VuZENvbnRlbnQpO1xuICB9XG4gIHZhciBvbWl0RmllbGROYW1lTGlzdCA9IE9iamVjdC5rZXlzKGZpZWxkTmFtZXMpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIGZpZWxkTmFtZXNba2V5XTtcbiAgfSk7XG4gIHZhciBnZXRMYWJlbCA9IGZ1bmN0aW9uIGdldExhYmVsKGl0ZW0pIHtcbiAgICByZXR1cm4gaXRlbS5sYWJlbDtcbiAgfTtcbiAgZnVuY3Rpb24gZ2V0SXRlbUFyaWFQcm9wcyhpdGVtLCBpbmRleCkge1xuICAgIHZhciBncm91cCA9IGl0ZW0uZ3JvdXA7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJvbGU6IGdyb3VwID8gJ3ByZXNlbnRhdGlvbicgOiAnb3B0aW9uJyxcbiAgICAgIGlkOiBcIlwiLmNvbmNhdChpZCwgXCJfbGlzdF9cIikuY29uY2F0KGluZGV4KVxuICAgIH07XG4gIH1cbiAgdmFyIHJlbmRlckl0ZW0gPSBmdW5jdGlvbiByZW5kZXJJdGVtKGluZGV4KSB7XG4gICAgdmFyIGl0ZW0gPSBtZW1vRmxhdHRlbk9wdGlvbnNbaW5kZXhdO1xuICAgIGlmICghaXRlbSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBpdGVtRGF0YSA9IGl0ZW0uZGF0YSB8fCB7fTtcbiAgICB2YXIgdmFsdWUgPSBpdGVtRGF0YS52YWx1ZTtcbiAgICB2YXIgZ3JvdXAgPSBpdGVtLmdyb3VwO1xuICAgIHZhciBhdHRycyA9IHBpY2tBdHRycyhpdGVtRGF0YSwgdHJ1ZSk7XG4gICAgdmFyIG1lcmdlZExhYmVsID0gZ2V0TGFiZWwoaXRlbSk7XG4gICAgcmV0dXJuIGl0ZW0gPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgICBcImFyaWEtbGFiZWxcIjogdHlwZW9mIG1lcmdlZExhYmVsID09PSAnc3RyaW5nJyAmJiAhZ3JvdXAgPyBtZXJnZWRMYWJlbCA6IG51bGxcbiAgICB9LCBhdHRycywge1xuICAgICAga2V5OiBpbmRleFxuICAgIH0sIGdldEl0ZW1BcmlhUHJvcHMoaXRlbSwgaW5kZXgpLCB7XG4gICAgICBcImFyaWEtc2VsZWN0ZWRcIjogaXNBcmlhU2VsZWN0ZWQodmFsdWUpXG4gICAgfSksIHZhbHVlKSA6IG51bGw7XG4gIH07XG4gIHZhciBhMTF5UHJvcHMgPSB7XG4gICAgcm9sZTogJ2xpc3Rib3gnLFxuICAgIGlkOiBcIlwiLmNvbmNhdChpZCwgXCJfbGlzdFwiKVxuICB9O1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIHZpcnR1YWwgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe30sIGExMXlQcm9wcywge1xuICAgIHN0eWxlOiB7XG4gICAgICBoZWlnaHQ6IDAsXG4gICAgICB3aWR0aDogMCxcbiAgICAgIG92ZXJmbG93OiAnaGlkZGVuJ1xuICAgIH1cbiAgfSksIHJlbmRlckl0ZW0oYWN0aXZlSW5kZXggLSAxKSwgcmVuZGVySXRlbShhY3RpdmVJbmRleCksIHJlbmRlckl0ZW0oYWN0aXZlSW5kZXggKyAxKSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExpc3QsIHtcbiAgICBpdGVtS2V5OiBcImtleVwiLFxuICAgIHJlZjogbGlzdFJlZixcbiAgICBkYXRhOiBtZW1vRmxhdHRlbk9wdGlvbnMsXG4gICAgaGVpZ2h0OiBsaXN0SGVpZ2h0LFxuICAgIGl0ZW1IZWlnaHQ6IGxpc3RJdGVtSGVpZ2h0LFxuICAgIGZ1bGxIZWlnaHQ6IGZhbHNlLFxuICAgIG9uTW91c2VEb3duOiBvbkxpc3RNb3VzZURvd24sXG4gICAgb25TY3JvbGw6IG9uUG9wdXBTY3JvbGwsXG4gICAgdmlydHVhbDogdmlydHVhbCxcbiAgICBkaXJlY3Rpb246IGRpcmVjdGlvbixcbiAgICBpbm5lclByb3BzOiB2aXJ0dWFsID8gbnVsbCA6IGExMXlQcm9wc1xuICB9LCBmdW5jdGlvbiAoaXRlbSwgaXRlbUluZGV4KSB7XG4gICAgdmFyIGdyb3VwID0gaXRlbS5ncm91cCxcbiAgICAgIGdyb3VwT3B0aW9uID0gaXRlbS5ncm91cE9wdGlvbixcbiAgICAgIGRhdGEgPSBpdGVtLmRhdGEsXG4gICAgICBsYWJlbCA9IGl0ZW0ubGFiZWwsXG4gICAgICB2YWx1ZSA9IGl0ZW0udmFsdWU7XG4gICAgdmFyIGtleSA9IGRhdGEua2V5O1xuXG4gICAgLy8gR3JvdXBcbiAgICBpZiAoZ3JvdXApIHtcbiAgICAgIHZhciBfZGF0YSR0aXRsZTtcbiAgICAgIHZhciBncm91cFRpdGxlID0gKF9kYXRhJHRpdGxlID0gZGF0YS50aXRsZSkgIT09IG51bGwgJiYgX2RhdGEkdGl0bGUgIT09IHZvaWQgMCA/IF9kYXRhJHRpdGxlIDogaXNUaXRsZVR5cGUobGFiZWwpID8gbGFiZWwudG9TdHJpbmcoKSA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhpdGVtUHJlZml4Q2xzLCBcIlwiLmNvbmNhdChpdGVtUHJlZml4Q2xzLCBcIi1ncm91cFwiKSwgZGF0YS5jbGFzc05hbWUpLFxuICAgICAgICB0aXRsZTogZ3JvdXBUaXRsZVxuICAgICAgfSwgbGFiZWwgIT09IHVuZGVmaW5lZCA/IGxhYmVsIDoga2V5KTtcbiAgICB9XG4gICAgdmFyIGRpc2FibGVkID0gZGF0YS5kaXNhYmxlZCxcbiAgICAgIHRpdGxlID0gZGF0YS50aXRsZSxcbiAgICAgIGNoaWxkcmVuID0gZGF0YS5jaGlsZHJlbixcbiAgICAgIHN0eWxlID0gZGF0YS5zdHlsZSxcbiAgICAgIGNsYXNzTmFtZSA9IGRhdGEuY2xhc3NOYW1lLFxuICAgICAgb3RoZXJQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhkYXRhLCBfZXhjbHVkZWQpO1xuICAgIHZhciBwYXNzZWRQcm9wcyA9IG9taXQob3RoZXJQcm9wcywgb21pdEZpZWxkTmFtZUxpc3QpO1xuXG4gICAgLy8gT3B0aW9uXG4gICAgdmFyIHNlbGVjdGVkID0gaXNTZWxlY3RlZCh2YWx1ZSk7XG4gICAgdmFyIG1lcmdlZERpc2FibGVkID0gZGlzYWJsZWQgfHwgIXNlbGVjdGVkICYmIG92ZXJNYXhDb3VudDtcbiAgICB2YXIgb3B0aW9uUHJlZml4Q2xzID0gXCJcIi5jb25jYXQoaXRlbVByZWZpeENscywgXCItb3B0aW9uXCIpO1xuICAgIHZhciBvcHRpb25DbGFzc05hbWUgPSBjbGFzc05hbWVzKGl0ZW1QcmVmaXhDbHMsIG9wdGlvblByZWZpeENscywgY2xhc3NOYW1lLCBfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KG9wdGlvblByZWZpeENscywgXCItZ3JvdXBlZFwiKSwgZ3JvdXBPcHRpb24pLCBcIlwiLmNvbmNhdChvcHRpb25QcmVmaXhDbHMsIFwiLWFjdGl2ZVwiKSwgYWN0aXZlSW5kZXggPT09IGl0ZW1JbmRleCAmJiAhbWVyZ2VkRGlzYWJsZWQpLCBcIlwiLmNvbmNhdChvcHRpb25QcmVmaXhDbHMsIFwiLWRpc2FibGVkXCIpLCBtZXJnZWREaXNhYmxlZCksIFwiXCIuY29uY2F0KG9wdGlvblByZWZpeENscywgXCItc2VsZWN0ZWRcIiksIHNlbGVjdGVkKSk7XG4gICAgdmFyIG1lcmdlZExhYmVsID0gZ2V0TGFiZWwoaXRlbSk7XG4gICAgdmFyIGljb25WaXNpYmxlID0gIW1lbnVJdGVtU2VsZWN0ZWRJY29uIHx8IHR5cGVvZiBtZW51SXRlbVNlbGVjdGVkSWNvbiA9PT0gJ2Z1bmN0aW9uJyB8fCBzZWxlY3RlZDtcblxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzM0MTQ1XG4gICAgdmFyIGNvbnRlbnQgPSB0eXBlb2YgbWVyZ2VkTGFiZWwgPT09ICdudW1iZXInID8gbWVyZ2VkTGFiZWwgOiBtZXJnZWRMYWJlbCB8fCB2YWx1ZTtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8yNjcxN1xuICAgIHZhciBvcHRpb25UaXRsZSA9IGlzVGl0bGVUeXBlKGNvbnRlbnQpID8gY29udGVudC50b1N0cmluZygpIDogdW5kZWZpbmVkO1xuICAgIGlmICh0aXRsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBvcHRpb25UaXRsZSA9IHRpdGxlO1xuICAgIH1cbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe30sIHBpY2tBdHRycyhwYXNzZWRQcm9wcyksICF2aXJ0dWFsID8gZ2V0SXRlbUFyaWFQcm9wcyhpdGVtLCBpdGVtSW5kZXgpIDoge30sIHtcbiAgICAgIFwiYXJpYS1zZWxlY3RlZFwiOiBpc0FyaWFTZWxlY3RlZCh2YWx1ZSksXG4gICAgICBjbGFzc05hbWU6IG9wdGlvbkNsYXNzTmFtZSxcbiAgICAgIHRpdGxlOiBvcHRpb25UaXRsZSxcbiAgICAgIG9uTW91c2VNb3ZlOiBmdW5jdGlvbiBvbk1vdXNlTW92ZSgpIHtcbiAgICAgICAgaWYgKGFjdGl2ZUluZGV4ID09PSBpdGVtSW5kZXggfHwgbWVyZ2VkRGlzYWJsZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2V0QWN0aXZlKGl0ZW1JbmRleCk7XG4gICAgICB9LFxuICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgICAgaWYgKCFtZXJnZWREaXNhYmxlZCkge1xuICAgICAgICAgIG9uU2VsZWN0VmFsdWUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc3R5bGU6IHN0eWxlXG4gICAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQob3B0aW9uUHJlZml4Q2xzLCBcIi1jb250ZW50XCIpXG4gICAgfSwgdHlwZW9mIG9wdGlvblJlbmRlciA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvblJlbmRlcihpdGVtLCB7XG4gICAgICBpbmRleDogaXRlbUluZGV4XG4gICAgfSkgOiBjb250ZW50KSwgLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KG1lbnVJdGVtU2VsZWN0ZWRJY29uKSB8fCBzZWxlY3RlZCwgaWNvblZpc2libGUgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVHJhbnNCdG4sIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQoaXRlbVByZWZpeENscywgXCItb3B0aW9uLXN0YXRlXCIpLFxuICAgICAgY3VzdG9taXplSWNvbjogbWVudUl0ZW1TZWxlY3RlZEljb24sXG4gICAgICBjdXN0b21pemVJY29uUHJvcHM6IHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICBkaXNhYmxlZDogbWVyZ2VkRGlzYWJsZWQsXG4gICAgICAgIGlzU2VsZWN0ZWQ6IHNlbGVjdGVkXG4gICAgICB9XG4gICAgfSwgc2VsZWN0ZWQgPyAnXHUyNzEzJyA6IG51bGwpKTtcbiAgfSkpO1xufTtcbnZhciBSZWZPcHRpb25MaXN0ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoT3B0aW9uTGlzdCk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBSZWZPcHRpb25MaXN0LmRpc3BsYXlOYW1lID0gJ09wdGlvbkxpc3QnO1xufVxuZXhwb3J0IGRlZmF1bHQgUmVmT3B0aW9uTGlzdDsiLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJwcmVmaXhDbHNcIiwgXCJjbGFzc05hbWVcIiwgXCJoZWlnaHRcIiwgXCJpdGVtSGVpZ2h0XCIsIFwiZnVsbEhlaWdodFwiLCBcInN0eWxlXCIsIFwiZGF0YVwiLCBcImNoaWxkcmVuXCIsIFwiaXRlbUtleVwiLCBcInZpcnR1YWxcIiwgXCJkaXJlY3Rpb25cIiwgXCJzY3JvbGxXaWR0aFwiLCBcImNvbXBvbmVudFwiLCBcIm9uU2Nyb2xsXCIsIFwib25WaXJ0dWFsU2Nyb2xsXCIsIFwib25WaXNpYmxlQ2hhbmdlXCIsIFwiaW5uZXJQcm9wc1wiLCBcImV4dHJhUmVuZGVyXCIsIFwic3R5bGVzXCIsIFwic2hvd1Njcm9sbEJhclwiXTtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFJlc2l6ZU9ic2VydmVyIGZyb20gJ3JjLXJlc2l6ZS1vYnNlcnZlcic7XG5pbXBvcnQgeyB1c2VFdmVudCB9IGZyb20gJ3JjLXV0aWwnO1xuaW1wb3J0IHVzZUxheW91dEVmZmVjdCBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VMYXlvdXRFZmZlY3RcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBmbHVzaFN5bmMgfSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IEZpbGxlciBmcm9tIFwiLi9GaWxsZXJcIjtcbmltcG9ydCB1c2VDaGlsZHJlbiBmcm9tIFwiLi9ob29rcy91c2VDaGlsZHJlblwiO1xuaW1wb3J0IHVzZURpZmZJdGVtIGZyb20gXCIuL2hvb2tzL3VzZURpZmZJdGVtXCI7XG5pbXBvcnQgdXNlRnJhbWVXaGVlbCBmcm9tIFwiLi9ob29rcy91c2VGcmFtZVdoZWVsXCI7XG5pbXBvcnQgeyB1c2VHZXRTaXplIH0gZnJvbSBcIi4vaG9va3MvdXNlR2V0U2l6ZVwiO1xuaW1wb3J0IHVzZUhlaWdodHMgZnJvbSBcIi4vaG9va3MvdXNlSGVpZ2h0c1wiO1xuaW1wb3J0IHVzZU1vYmlsZVRvdWNoTW92ZSBmcm9tIFwiLi9ob29rcy91c2VNb2JpbGVUb3VjaE1vdmVcIjtcbmltcG9ydCB1c2VPcmlnaW5TY3JvbGwgZnJvbSBcIi4vaG9va3MvdXNlT3JpZ2luU2Nyb2xsXCI7XG5pbXBvcnQgdXNlU2Nyb2xsRHJhZyBmcm9tIFwiLi9ob29rcy91c2VTY3JvbGxEcmFnXCI7XG5pbXBvcnQgdXNlU2Nyb2xsVG8gZnJvbSBcIi4vaG9va3MvdXNlU2Nyb2xsVG9cIjtcbmltcG9ydCBTY3JvbGxCYXIgZnJvbSBcIi4vU2Nyb2xsQmFyXCI7XG5pbXBvcnQgeyBnZXRTcGluU2l6ZSB9IGZyb20gXCIuL3V0aWxzL3Njcm9sbGJhclV0aWxcIjtcbnZhciBFTVBUWV9EQVRBID0gW107XG52YXIgU2Nyb2xsU3R5bGUgPSB7XG4gIG92ZXJmbG93WTogJ2F1dG8nLFxuICBvdmVyZmxvd0FuY2hvcjogJ25vbmUnXG59O1xuZXhwb3J0IGZ1bmN0aW9uIFJhd0xpc3QocHJvcHMsIHJlZikge1xuICB2YXIgX3Byb3BzJHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBwcmVmaXhDbHMgPSBfcHJvcHMkcHJlZml4Q2xzID09PSB2b2lkIDAgPyAncmMtdmlydHVhbC1saXN0JyA6IF9wcm9wcyRwcmVmaXhDbHMsXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIGhlaWdodCA9IHByb3BzLmhlaWdodCxcbiAgICBpdGVtSGVpZ2h0ID0gcHJvcHMuaXRlbUhlaWdodCxcbiAgICBfcHJvcHMkZnVsbEhlaWdodCA9IHByb3BzLmZ1bGxIZWlnaHQsXG4gICAgZnVsbEhlaWdodCA9IF9wcm9wcyRmdWxsSGVpZ2h0ID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJGZ1bGxIZWlnaHQsXG4gICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICBkYXRhID0gcHJvcHMuZGF0YSxcbiAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgIGl0ZW1LZXkgPSBwcm9wcy5pdGVtS2V5LFxuICAgIHZpcnR1YWwgPSBwcm9wcy52aXJ0dWFsLFxuICAgIGRpcmVjdGlvbiA9IHByb3BzLmRpcmVjdGlvbixcbiAgICBzY3JvbGxXaWR0aCA9IHByb3BzLnNjcm9sbFdpZHRoLFxuICAgIF9wcm9wcyRjb21wb25lbnQgPSBwcm9wcy5jb21wb25lbnQsXG4gICAgQ29tcG9uZW50ID0gX3Byb3BzJGNvbXBvbmVudCA9PT0gdm9pZCAwID8gJ2RpdicgOiBfcHJvcHMkY29tcG9uZW50LFxuICAgIG9uU2Nyb2xsID0gcHJvcHMub25TY3JvbGwsXG4gICAgb25WaXJ0dWFsU2Nyb2xsID0gcHJvcHMub25WaXJ0dWFsU2Nyb2xsLFxuICAgIG9uVmlzaWJsZUNoYW5nZSA9IHByb3BzLm9uVmlzaWJsZUNoYW5nZSxcbiAgICBpbm5lclByb3BzID0gcHJvcHMuaW5uZXJQcm9wcyxcbiAgICBleHRyYVJlbmRlciA9IHByb3BzLmV4dHJhUmVuZGVyLFxuICAgIHN0eWxlcyA9IHByb3BzLnN0eWxlcyxcbiAgICBfcHJvcHMkc2hvd1Njcm9sbEJhciA9IHByb3BzLnNob3dTY3JvbGxCYXIsXG4gICAgc2hvd1Njcm9sbEJhciA9IF9wcm9wcyRzaG93U2Nyb2xsQmFyID09PSB2b2lkIDAgPyAnb3B0aW9uYWwnIDogX3Byb3BzJHNob3dTY3JvbGxCYXIsXG4gICAgcmVzdFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBfZXhjbHVkZWQpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSXRlbSBLZXkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgZ2V0S2V5ID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICBpZiAodHlwZW9mIGl0ZW1LZXkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBpdGVtS2V5KGl0ZW0pO1xuICAgIH1cbiAgICByZXR1cm4gaXRlbSA9PT0gbnVsbCB8fCBpdGVtID09PSB2b2lkIDAgPyB2b2lkIDAgOiBpdGVtW2l0ZW1LZXldO1xuICB9LCBbaXRlbUtleV0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEhlaWdodCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX3VzZUhlaWdodHMgPSB1c2VIZWlnaHRzKGdldEtleSwgbnVsbCwgbnVsbCksXG4gICAgX3VzZUhlaWdodHMyID0gX3NsaWNlZFRvQXJyYXkoX3VzZUhlaWdodHMsIDQpLFxuICAgIHNldEluc3RhbmNlUmVmID0gX3VzZUhlaWdodHMyWzBdLFxuICAgIGNvbGxlY3RIZWlnaHQgPSBfdXNlSGVpZ2h0czJbMV0sXG4gICAgaGVpZ2h0cyA9IF91c2VIZWlnaHRzMlsyXSxcbiAgICBoZWlnaHRVcGRhdGVkTWFyayA9IF91c2VIZWlnaHRzMlszXTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gTUlTQyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHVzZVZpcnR1YWwgPSAhISh2aXJ0dWFsICE9PSBmYWxzZSAmJiBoZWlnaHQgJiYgaXRlbUhlaWdodCk7XG4gIHZhciBjb250YWluZXJIZWlnaHQgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhoZWlnaHRzLm1hcHMpLnJlZHVjZShmdW5jdGlvbiAodG90YWwsIGN1cnIpIHtcbiAgICAgIHJldHVybiB0b3RhbCArIGN1cnI7XG4gICAgfSwgMCk7XG4gIH0sIFtoZWlnaHRzLmlkLCBoZWlnaHRzLm1hcHNdKTtcbiAgdmFyIGluVmlydHVhbCA9IHVzZVZpcnR1YWwgJiYgZGF0YSAmJiAoTWF0aC5tYXgoaXRlbUhlaWdodCAqIGRhdGEubGVuZ3RoLCBjb250YWluZXJIZWlnaHQpID4gaGVpZ2h0IHx8ICEhc2Nyb2xsV2lkdGgpO1xuICB2YXIgaXNSVEwgPSBkaXJlY3Rpb24gPT09ICdydGwnO1xuICB2YXIgbWVyZ2VkQ2xhc3NOYW1lID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIGlzUlRMKSwgY2xhc3NOYW1lKTtcbiAgdmFyIG1lcmdlZERhdGEgPSBkYXRhIHx8IEVNUFRZX0RBVEE7XG4gIHZhciBjb21wb25lbnRSZWYgPSB1c2VSZWYoKTtcbiAgdmFyIGZpbGxlcklubmVyUmVmID0gdXNlUmVmKCk7XG4gIHZhciBjb250YWluZXJSZWYgPSB1c2VSZWYoKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEl0ZW0gS2V5ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUoMCksXG4gICAgX3VzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZSwgMiksXG4gICAgb2Zmc2V0VG9wID0gX3VzZVN0YXRlMlswXSxcbiAgICBzZXRPZmZzZXRUb3AgPSBfdXNlU3RhdGUyWzFdO1xuICB2YXIgX3VzZVN0YXRlMyA9IHVzZVN0YXRlKDApLFxuICAgIF91c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUzLCAyKSxcbiAgICBvZmZzZXRMZWZ0ID0gX3VzZVN0YXRlNFswXSxcbiAgICBzZXRPZmZzZXRMZWZ0ID0gX3VzZVN0YXRlNFsxXTtcbiAgdmFyIF91c2VTdGF0ZTUgPSB1c2VTdGF0ZShmYWxzZSksXG4gICAgX3VzZVN0YXRlNiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZTUsIDIpLFxuICAgIHNjcm9sbE1vdmluZyA9IF91c2VTdGF0ZTZbMF0sXG4gICAgc2V0U2Nyb2xsTW92aW5nID0gX3VzZVN0YXRlNlsxXTtcbiAgdmFyIG9uU2Nyb2xsYmFyU3RhcnRNb3ZlID0gZnVuY3Rpb24gb25TY3JvbGxiYXJTdGFydE1vdmUoKSB7XG4gICAgc2V0U2Nyb2xsTW92aW5nKHRydWUpO1xuICB9O1xuICB2YXIgb25TY3JvbGxiYXJTdG9wTW92ZSA9IGZ1bmN0aW9uIG9uU2Nyb2xsYmFyU3RvcE1vdmUoKSB7XG4gICAgc2V0U2Nyb2xsTW92aW5nKGZhbHNlKTtcbiAgfTtcbiAgdmFyIHNoYXJlZENvbmZpZyA9IHtcbiAgICBnZXRLZXk6IGdldEtleVxuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNjcm9sbCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBmdW5jdGlvbiBzeW5jU2Nyb2xsVG9wKG5ld1RvcCkge1xuICAgIHNldE9mZnNldFRvcChmdW5jdGlvbiAob3JpZ2luKSB7XG4gICAgICB2YXIgdmFsdWU7XG4gICAgICBpZiAodHlwZW9mIG5ld1RvcCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YWx1ZSA9IG5ld1RvcChvcmlnaW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSBuZXdUb3A7XG4gICAgICB9XG4gICAgICB2YXIgYWxpZ25lZFRvcCA9IGtlZXBJblJhbmdlKHZhbHVlKTtcbiAgICAgIGNvbXBvbmVudFJlZi5jdXJyZW50LnNjcm9sbFRvcCA9IGFsaWduZWRUb3A7XG4gICAgICByZXR1cm4gYWxpZ25lZFRvcDtcbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IExlZ2FjeSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQdXQgcmVmIGhlcmUgc2luY2UgdGhlIHJhbmdlIGlzIGdlbmVyYXRlIGJ5IGZvbGxvd1xuICB2YXIgcmFuZ2VSZWYgPSB1c2VSZWYoe1xuICAgIHN0YXJ0OiAwLFxuICAgIGVuZDogbWVyZ2VkRGF0YS5sZW5ndGhcbiAgfSk7XG4gIHZhciBkaWZmSXRlbVJlZiA9IHVzZVJlZigpO1xuICB2YXIgX3VzZURpZmZJdGVtID0gdXNlRGlmZkl0ZW0obWVyZ2VkRGF0YSwgZ2V0S2V5KSxcbiAgICBfdXNlRGlmZkl0ZW0yID0gX3NsaWNlZFRvQXJyYXkoX3VzZURpZmZJdGVtLCAxKSxcbiAgICBkaWZmSXRlbSA9IF91c2VEaWZmSXRlbTJbMF07XG4gIGRpZmZJdGVtUmVmLmN1cnJlbnQgPSBkaWZmSXRlbTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBWaXNpYmxlIENhbGN1bGF0aW9uID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF9SZWFjdCR1c2VNZW1vID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIXVzZVZpcnR1YWwpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzY3JvbGxIZWlnaHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICBzdGFydDogMCxcbiAgICAgICAgICBlbmQ6IG1lcmdlZERhdGEubGVuZ3RoIC0gMSxcbiAgICAgICAgICBvZmZzZXQ6IHVuZGVmaW5lZFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBBbHdheXMgdXNlIHZpcnR1YWwgc2Nyb2xsIGJhciBpbiBhdm9pZCBzaGFraW5nXG4gICAgICBpZiAoIWluVmlydHVhbCkge1xuICAgICAgICB2YXIgX2ZpbGxlcklubmVyUmVmJGN1cnJlO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNjcm9sbEhlaWdodDogKChfZmlsbGVySW5uZXJSZWYkY3VycmUgPSBmaWxsZXJJbm5lclJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfZmlsbGVySW5uZXJSZWYkY3VycmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9maWxsZXJJbm5lclJlZiRjdXJyZS5vZmZzZXRIZWlnaHQpIHx8IDAsXG4gICAgICAgICAgc3RhcnQ6IDAsXG4gICAgICAgICAgZW5kOiBtZXJnZWREYXRhLmxlbmd0aCAtIDEsXG4gICAgICAgICAgb2Zmc2V0OiB1bmRlZmluZWRcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHZhciBpdGVtVG9wID0gMDtcbiAgICAgIHZhciBzdGFydEluZGV4O1xuICAgICAgdmFyIHN0YXJ0T2Zmc2V0O1xuICAgICAgdmFyIGVuZEluZGV4O1xuICAgICAgdmFyIGRhdGFMZW4gPSBtZXJnZWREYXRhLmxlbmd0aDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YUxlbjsgaSArPSAxKSB7XG4gICAgICAgIHZhciBfaXRlbSA9IG1lcmdlZERhdGFbaV07XG4gICAgICAgIHZhciBrZXkgPSBnZXRLZXkoX2l0ZW0pO1xuICAgICAgICB2YXIgY2FjaGVIZWlnaHQgPSBoZWlnaHRzLmdldChrZXkpO1xuICAgICAgICB2YXIgY3VycmVudEl0ZW1Cb3R0b20gPSBpdGVtVG9wICsgKGNhY2hlSGVpZ2h0ID09PSB1bmRlZmluZWQgPyBpdGVtSGVpZ2h0IDogY2FjaGVIZWlnaHQpO1xuXG4gICAgICAgIC8vIENoZWNrIGl0ZW0gdG9wIGluIHRoZSByYW5nZVxuICAgICAgICBpZiAoY3VycmVudEl0ZW1Cb3R0b20gPj0gb2Zmc2V0VG9wICYmIHN0YXJ0SW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHN0YXJ0SW5kZXggPSBpO1xuICAgICAgICAgIHN0YXJ0T2Zmc2V0ID0gaXRlbVRvcDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGl0ZW0gYm90dG9tIGluIHRoZSByYW5nZS4gV2Ugd2lsbCByZW5kZXIgYWRkaXRpb25hbCBvbmUgaXRlbSBmb3IgbW90aW9uIHVzYWdlXG4gICAgICAgIGlmIChjdXJyZW50SXRlbUJvdHRvbSA+IG9mZnNldFRvcCArIGhlaWdodCAmJiBlbmRJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZW5kSW5kZXggPSBpO1xuICAgICAgICB9XG4gICAgICAgIGl0ZW1Ub3AgPSBjdXJyZW50SXRlbUJvdHRvbTtcbiAgICAgIH1cblxuICAgICAgLy8gV2hlbiBzY3JvbGxUb3AgYXQgdGhlIGVuZCBidXQgZGF0YSBjdXQgdG8gc21hbGwgY291bnQgd2lsbCByZWFjaCB0aGlzXG4gICAgICBpZiAoc3RhcnRJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHN0YXJ0SW5kZXggPSAwO1xuICAgICAgICBzdGFydE9mZnNldCA9IDA7XG4gICAgICAgIGVuZEluZGV4ID0gTWF0aC5jZWlsKGhlaWdodCAvIGl0ZW1IZWlnaHQpO1xuICAgICAgfVxuICAgICAgaWYgKGVuZEluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZW5kSW5kZXggPSBtZXJnZWREYXRhLmxlbmd0aCAtIDE7XG4gICAgICB9XG5cbiAgICAgIC8vIEdpdmUgY2FjaGUgdG8gaW1wcm92ZSBzY3JvbGwgZXhwZXJpZW5jZVxuICAgICAgZW5kSW5kZXggPSBNYXRoLm1pbihlbmRJbmRleCArIDEsIG1lcmdlZERhdGEubGVuZ3RoIC0gMSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzY3JvbGxIZWlnaHQ6IGl0ZW1Ub3AsXG4gICAgICAgIHN0YXJ0OiBzdGFydEluZGV4LFxuICAgICAgICBlbmQ6IGVuZEluZGV4LFxuICAgICAgICBvZmZzZXQ6IHN0YXJ0T2Zmc2V0XG4gICAgICB9O1xuICAgIH0sIFtpblZpcnR1YWwsIHVzZVZpcnR1YWwsIG9mZnNldFRvcCwgbWVyZ2VkRGF0YSwgaGVpZ2h0VXBkYXRlZE1hcmssIGhlaWdodF0pLFxuICAgIHNjcm9sbEhlaWdodCA9IF9SZWFjdCR1c2VNZW1vLnNjcm9sbEhlaWdodCxcbiAgICBzdGFydCA9IF9SZWFjdCR1c2VNZW1vLnN0YXJ0LFxuICAgIGVuZCA9IF9SZWFjdCR1c2VNZW1vLmVuZCxcbiAgICBmaWxsZXJPZmZzZXQgPSBfUmVhY3QkdXNlTWVtby5vZmZzZXQ7XG4gIHJhbmdlUmVmLmN1cnJlbnQuc3RhcnQgPSBzdGFydDtcbiAgcmFuZ2VSZWYuY3VycmVudC5lbmQgPSBlbmQ7XG5cbiAgLy8gV2hlbiBzY3JvbGwgdXAsIGZpcnN0IHZpc2libGUgaXRlbSBnZXQgcmVhbCBoZWlnaHQgbWF5IG5vdCBzYW1lIGFzIGBpdGVtSGVpZ2h0YCxcbiAgLy8gV2hpY2ggd2lsbCBtYWtlIHNjcm9sbCBqdW1wLlxuICAvLyBMZXQncyBzeW5jIHNjcm9sbCB0b3AgdG8gYXZvaWQganVtcFxuICBSZWFjdC51c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBjaGFuZ2VkUmVjb3JkID0gaGVpZ2h0cy5nZXRSZWNvcmQoKTtcbiAgICBpZiAoY2hhbmdlZFJlY29yZC5zaXplID09PSAxKSB7XG4gICAgICB2YXIgcmVjb3JkS2V5ID0gQXJyYXkuZnJvbShjaGFuZ2VkUmVjb3JkLmtleXMoKSlbMF07XG4gICAgICB2YXIgcHJldkNhY2hlSGVpZ2h0ID0gY2hhbmdlZFJlY29yZC5nZXQocmVjb3JkS2V5KTtcblxuICAgICAgLy8gUXVpY2sgc3dpdGNoIGRhdGEgbWF5IGNhdXNlIGBzdGFydGAgbm90IGluIGBtZXJnZWREYXRhYCBhbnltb3JlXG4gICAgICB2YXIgc3RhcnRJdGVtID0gbWVyZ2VkRGF0YVtzdGFydF07XG4gICAgICBpZiAoc3RhcnRJdGVtICYmIHByZXZDYWNoZUhlaWdodCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBzdGFydEluZGV4S2V5ID0gZ2V0S2V5KHN0YXJ0SXRlbSk7XG4gICAgICAgIGlmIChzdGFydEluZGV4S2V5ID09PSByZWNvcmRLZXkpIHtcbiAgICAgICAgICB2YXIgcmVhbFN0YXJ0SGVpZ2h0ID0gaGVpZ2h0cy5nZXQocmVjb3JkS2V5KTtcbiAgICAgICAgICB2YXIgZGlmZkhlaWdodCA9IHJlYWxTdGFydEhlaWdodCAtIGl0ZW1IZWlnaHQ7XG4gICAgICAgICAgc3luY1Njcm9sbFRvcChmdW5jdGlvbiAob3JpKSB7XG4gICAgICAgICAgICByZXR1cm4gb3JpICsgZGlmZkhlaWdodDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBoZWlnaHRzLnJlc2V0UmVjb3JkKCk7XG4gIH0sIFtzY3JvbGxIZWlnaHRdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU2l6ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKHtcbiAgICAgIHdpZHRoOiAwLFxuICAgICAgaGVpZ2h0OiBoZWlnaHRcbiAgICB9KSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBzaXplID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXRTaXplID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIG9uSG9sZGVyUmVzaXplID0gZnVuY3Rpb24gb25Ib2xkZXJSZXNpemUoc2l6ZUluZm8pIHtcbiAgICBzZXRTaXplKHtcbiAgICAgIHdpZHRoOiBzaXplSW5mby5vZmZzZXRXaWR0aCxcbiAgICAgIGhlaWdodDogc2l6ZUluZm8ub2Zmc2V0SGVpZ2h0XG4gICAgfSk7XG4gIH07XG5cbiAgLy8gSGFjayBvbiBzY3JvbGxiYXIgdG8gZW5hYmxlIGZsYXNoIGNhbGxcbiAgdmFyIHZlcnRpY2FsU2Nyb2xsQmFyUmVmID0gdXNlUmVmKCk7XG4gIHZhciBob3Jpem9udGFsU2Nyb2xsQmFyUmVmID0gdXNlUmVmKCk7XG4gIHZhciBob3Jpem9udGFsU2Nyb2xsQmFyU3BpblNpemUgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZ2V0U3BpblNpemUoc2l6ZS53aWR0aCwgc2Nyb2xsV2lkdGgpO1xuICB9LCBbc2l6ZS53aWR0aCwgc2Nyb2xsV2lkdGhdKTtcbiAgdmFyIHZlcnRpY2FsU2Nyb2xsQmFyU3BpblNpemUgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZ2V0U3BpblNpemUoc2l6ZS5oZWlnaHQsIHNjcm9sbEhlaWdodCk7XG4gIH0sIFtzaXplLmhlaWdodCwgc2Nyb2xsSGVpZ2h0XSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBJbiBSYW5nZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBtYXhTY3JvbGxIZWlnaHQgPSBzY3JvbGxIZWlnaHQgLSBoZWlnaHQ7XG4gIHZhciBtYXhTY3JvbGxIZWlnaHRSZWYgPSB1c2VSZWYobWF4U2Nyb2xsSGVpZ2h0KTtcbiAgbWF4U2Nyb2xsSGVpZ2h0UmVmLmN1cnJlbnQgPSBtYXhTY3JvbGxIZWlnaHQ7XG4gIGZ1bmN0aW9uIGtlZXBJblJhbmdlKG5ld1Njcm9sbFRvcCkge1xuICAgIHZhciBuZXdUb3AgPSBuZXdTY3JvbGxUb3A7XG4gICAgaWYgKCFOdW1iZXIuaXNOYU4obWF4U2Nyb2xsSGVpZ2h0UmVmLmN1cnJlbnQpKSB7XG4gICAgICBuZXdUb3AgPSBNYXRoLm1pbihuZXdUb3AsIG1heFNjcm9sbEhlaWdodFJlZi5jdXJyZW50KTtcbiAgICB9XG4gICAgbmV3VG9wID0gTWF0aC5tYXgobmV3VG9wLCAwKTtcbiAgICByZXR1cm4gbmV3VG9wO1xuICB9XG4gIHZhciBpc1Njcm9sbEF0VG9wID0gb2Zmc2V0VG9wIDw9IDA7XG4gIHZhciBpc1Njcm9sbEF0Qm90dG9tID0gb2Zmc2V0VG9wID49IG1heFNjcm9sbEhlaWdodDtcbiAgdmFyIGlzU2Nyb2xsQXRMZWZ0ID0gb2Zmc2V0TGVmdCA8PSAwO1xuICB2YXIgaXNTY3JvbGxBdFJpZ2h0ID0gb2Zmc2V0TGVmdCA+PSBzY3JvbGxXaWR0aDtcbiAgdmFyIG9yaWdpblNjcm9sbCA9IHVzZU9yaWdpblNjcm9sbChpc1Njcm9sbEF0VG9wLCBpc1Njcm9sbEF0Qm90dG9tLCBpc1Njcm9sbEF0TGVmdCwgaXNTY3JvbGxBdFJpZ2h0KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTY3JvbGwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGdldFZpcnR1YWxTY3JvbGxJbmZvID0gZnVuY3Rpb24gZ2V0VmlydHVhbFNjcm9sbEluZm8oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IGlzUlRMID8gLW9mZnNldExlZnQgOiBvZmZzZXRMZWZ0LFxuICAgICAgeTogb2Zmc2V0VG9wXG4gICAgfTtcbiAgfTtcbiAgdmFyIGxhc3RWaXJ0dWFsU2Nyb2xsSW5mb1JlZiA9IHVzZVJlZihnZXRWaXJ0dWFsU2Nyb2xsSW5mbygpKTtcbiAgdmFyIHRyaWdnZXJTY3JvbGwgPSB1c2VFdmVudChmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgaWYgKG9uVmlydHVhbFNjcm9sbCkge1xuICAgICAgdmFyIG5leHRJbmZvID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBnZXRWaXJ0dWFsU2Nyb2xsSW5mbygpKSwgcGFyYW1zKTtcblxuICAgICAgLy8gVHJpZ2dlciB3aGVuIG9mZnNldCBjaGFuZ2VkXG4gICAgICBpZiAobGFzdFZpcnR1YWxTY3JvbGxJbmZvUmVmLmN1cnJlbnQueCAhPT0gbmV4dEluZm8ueCB8fCBsYXN0VmlydHVhbFNjcm9sbEluZm9SZWYuY3VycmVudC55ICE9PSBuZXh0SW5mby55KSB7XG4gICAgICAgIG9uVmlydHVhbFNjcm9sbChuZXh0SW5mbyk7XG4gICAgICAgIGxhc3RWaXJ0dWFsU2Nyb2xsSW5mb1JlZi5jdXJyZW50ID0gbmV4dEluZm87XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgZnVuY3Rpb24gb25TY3JvbGxCYXIobmV3U2Nyb2xsT2Zmc2V0LCBob3Jpem9udGFsKSB7XG4gICAgdmFyIG5ld09mZnNldCA9IG5ld1Njcm9sbE9mZnNldDtcbiAgICBpZiAoaG9yaXpvbnRhbCkge1xuICAgICAgZmx1c2hTeW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2V0T2Zmc2V0TGVmdChuZXdPZmZzZXQpO1xuICAgICAgfSk7XG4gICAgICB0cmlnZ2VyU2Nyb2xsKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN5bmNTY3JvbGxUb3AobmV3T2Zmc2V0KTtcbiAgICB9XG4gIH1cblxuICAvLyBXaGVuIGRhdGEgc2l6ZSByZWR1Y2UuIEl0IG1heSB0cmlnZ2VyIG5hdGl2ZSBzY3JvbGwgZXZlbnQgYmFjayB0byBmaXQgc2Nyb2xsIHBvc2l0aW9uXG4gIGZ1bmN0aW9uIG9uRmFsbGJhY2tTY3JvbGwoZSkge1xuICAgIHZhciBuZXdTY3JvbGxUb3AgPSBlLmN1cnJlbnRUYXJnZXQuc2Nyb2xsVG9wO1xuICAgIGlmIChuZXdTY3JvbGxUb3AgIT09IG9mZnNldFRvcCkge1xuICAgICAgc3luY1Njcm9sbFRvcChuZXdTY3JvbGxUb3ApO1xuICAgIH1cblxuICAgIC8vIFRyaWdnZXIgb3JpZ2luIG9uU2Nyb2xsXG4gICAgb25TY3JvbGwgPT09IG51bGwgfHwgb25TY3JvbGwgPT09IHZvaWQgMCB8fCBvblNjcm9sbChlKTtcbiAgICB0cmlnZ2VyU2Nyb2xsKCk7XG4gIH1cbiAgdmFyIGtlZXBJbkhvcml6b250YWxSYW5nZSA9IGZ1bmN0aW9uIGtlZXBJbkhvcml6b250YWxSYW5nZShuZXh0T2Zmc2V0TGVmdCkge1xuICAgIHZhciB0bXBPZmZzZXRMZWZ0ID0gbmV4dE9mZnNldExlZnQ7XG4gICAgdmFyIG1heCA9ICEhc2Nyb2xsV2lkdGggPyBzY3JvbGxXaWR0aCAtIHNpemUud2lkdGggOiAwO1xuICAgIHRtcE9mZnNldExlZnQgPSBNYXRoLm1heCh0bXBPZmZzZXRMZWZ0LCAwKTtcbiAgICB0bXBPZmZzZXRMZWZ0ID0gTWF0aC5taW4odG1wT2Zmc2V0TGVmdCwgbWF4KTtcbiAgICByZXR1cm4gdG1wT2Zmc2V0TGVmdDtcbiAgfTtcbiAgdmFyIG9uV2hlZWxEZWx0YSA9IHVzZUV2ZW50KGZ1bmN0aW9uIChvZmZzZXRYWSwgZnJvbUhvcml6b250YWwpIHtcbiAgICBpZiAoZnJvbUhvcml6b250YWwpIHtcbiAgICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNldE9mZnNldExlZnQoZnVuY3Rpb24gKGxlZnQpIHtcbiAgICAgICAgICB2YXIgbmV4dE9mZnNldExlZnQgPSBsZWZ0ICsgKGlzUlRMID8gLW9mZnNldFhZIDogb2Zmc2V0WFkpO1xuICAgICAgICAgIHJldHVybiBrZWVwSW5Ib3Jpem9udGFsUmFuZ2UobmV4dE9mZnNldExlZnQpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgdHJpZ2dlclNjcm9sbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzeW5jU2Nyb2xsVG9wKGZ1bmN0aW9uICh0b3ApIHtcbiAgICAgICAgdmFyIG5ld1RvcCA9IHRvcCArIG9mZnNldFhZO1xuICAgICAgICByZXR1cm4gbmV3VG9wO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcblxuICAvLyBTaW5jZSB0aGlzIGFkZGVkIGluIGdsb2JhbCxzaG91bGQgdXNlIHJlZiB0byBrZWVwIHVwZGF0ZVxuICB2YXIgX3VzZUZyYW1lV2hlZWwgPSB1c2VGcmFtZVdoZWVsKHVzZVZpcnR1YWwsIGlzU2Nyb2xsQXRUb3AsIGlzU2Nyb2xsQXRCb3R0b20sIGlzU2Nyb2xsQXRMZWZ0LCBpc1Njcm9sbEF0UmlnaHQsICEhc2Nyb2xsV2lkdGgsIG9uV2hlZWxEZWx0YSksXG4gICAgX3VzZUZyYW1lV2hlZWwyID0gX3NsaWNlZFRvQXJyYXkoX3VzZUZyYW1lV2hlZWwsIDIpLFxuICAgIG9uUmF3V2hlZWwgPSBfdXNlRnJhbWVXaGVlbDJbMF0sXG4gICAgb25GaXJlRm94U2Nyb2xsID0gX3VzZUZyYW1lV2hlZWwyWzFdO1xuXG4gIC8vIE1vYmlsZSB0b3VjaCBtb3ZlXG4gIHVzZU1vYmlsZVRvdWNoTW92ZSh1c2VWaXJ0dWFsLCBjb21wb25lbnRSZWYsIGZ1bmN0aW9uIChpc0hvcml6b250YWwsIGRlbHRhLCBzbW9vdGhPZmZzZXQsIGUpIHtcbiAgICB2YXIgZXZlbnQgPSBlO1xuICAgIGlmIChvcmlnaW5TY3JvbGwoaXNIb3Jpem9udGFsLCBkZWx0YSwgc21vb3RoT2Zmc2V0KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEZpeCBuZXN0IExpc3QgdHJpZ2dlciBUb3VjaE1vdmUgZXZlbnRcbiAgICBpZiAoIWV2ZW50IHx8ICFldmVudC5fdmlydHVhbEhhbmRsZWQpIHtcbiAgICAgIGlmIChldmVudCkge1xuICAgICAgICBldmVudC5fdmlydHVhbEhhbmRsZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgb25SYXdXaGVlbCh7XG4gICAgICAgIHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbiBwcmV2ZW50RGVmYXVsdCgpIHt9LFxuICAgICAgICBkZWx0YVg6IGlzSG9yaXpvbnRhbCA/IGRlbHRhIDogMCxcbiAgICAgICAgZGVsdGFZOiBpc0hvcml6b250YWwgPyAwIDogZGVsdGFcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG5cbiAgLy8gTW91c2VEb3duIGRyYWcgZm9yIHNjcm9sbFxuICB1c2VTY3JvbGxEcmFnKGluVmlydHVhbCwgY29tcG9uZW50UmVmLCBmdW5jdGlvbiAob2Zmc2V0KSB7XG4gICAgc3luY1Njcm9sbFRvcChmdW5jdGlvbiAodG9wKSB7XG4gICAgICByZXR1cm4gdG9wICsgb2Zmc2V0O1xuICAgIH0pO1xuICB9KTtcbiAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAvLyBGaXJlZm94IG9ubHlcbiAgICBmdW5jdGlvbiBvbk1vek1vdXNlUGl4ZWxTY3JvbGwoZSkge1xuICAgICAgLy8gc2Nyb2xsaW5nIGF0IHRvcC9ib3R0b20gbGltaXRcbiAgICAgIHZhciBzY3JvbGxpbmdVcEF0VG9wID0gaXNTY3JvbGxBdFRvcCAmJiBlLmRldGFpbCA8IDA7XG4gICAgICB2YXIgc2Nyb2xsaW5nRG93bkF0Qm90dG9tID0gaXNTY3JvbGxBdEJvdHRvbSAmJiBlLmRldGFpbCA+IDA7XG4gICAgICBpZiAodXNlVmlydHVhbCAmJiAhc2Nyb2xsaW5nVXBBdFRvcCAmJiAhc2Nyb2xsaW5nRG93bkF0Qm90dG9tKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGNvbXBvbmVudEVsZSA9IGNvbXBvbmVudFJlZi5jdXJyZW50O1xuICAgIGNvbXBvbmVudEVsZS5hZGRFdmVudExpc3RlbmVyKCd3aGVlbCcsIG9uUmF3V2hlZWwsIHtcbiAgICAgIHBhc3NpdmU6IGZhbHNlXG4gICAgfSk7XG4gICAgY29tcG9uZW50RWxlLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTU1vdXNlU2Nyb2xsJywgb25GaXJlRm94U2Nyb2xsLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlXG4gICAgfSk7XG4gICAgY29tcG9uZW50RWxlLmFkZEV2ZW50TGlzdGVuZXIoJ01vek1vdXNlUGl4ZWxTY3JvbGwnLCBvbk1vek1vdXNlUGl4ZWxTY3JvbGwsIHtcbiAgICAgIHBhc3NpdmU6IGZhbHNlXG4gICAgfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbXBvbmVudEVsZS5yZW1vdmVFdmVudExpc3RlbmVyKCd3aGVlbCcsIG9uUmF3V2hlZWwpO1xuICAgICAgY29tcG9uZW50RWxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ0RPTU1vdXNlU2Nyb2xsJywgb25GaXJlRm94U2Nyb2xsKTtcbiAgICAgIGNvbXBvbmVudEVsZS5yZW1vdmVFdmVudExpc3RlbmVyKCdNb3pNb3VzZVBpeGVsU2Nyb2xsJywgb25Nb3pNb3VzZVBpeGVsU2Nyb2xsKTtcbiAgICB9O1xuICB9LCBbdXNlVmlydHVhbCwgaXNTY3JvbGxBdFRvcCwgaXNTY3JvbGxBdEJvdHRvbV0pO1xuXG4gIC8vIFN5bmMgc2Nyb2xsIGxlZnRcbiAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoc2Nyb2xsV2lkdGgpIHtcbiAgICAgIHZhciBuZXdPZmZzZXRMZWZ0ID0ga2VlcEluSG9yaXpvbnRhbFJhbmdlKG9mZnNldExlZnQpO1xuICAgICAgc2V0T2Zmc2V0TGVmdChuZXdPZmZzZXRMZWZ0KTtcbiAgICAgIHRyaWdnZXJTY3JvbGwoe1xuICAgICAgICB4OiBuZXdPZmZzZXRMZWZ0XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIFtzaXplLndpZHRoLCBzY3JvbGxXaWR0aF0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZWYgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgZGVsYXlIaWRlU2Nyb2xsQmFyID0gZnVuY3Rpb24gZGVsYXlIaWRlU2Nyb2xsQmFyKCkge1xuICAgIHZhciBfdmVydGljYWxTY3JvbGxCYXJSZWYsIF9ob3Jpem9udGFsU2Nyb2xsQmFyUjtcbiAgICAoX3ZlcnRpY2FsU2Nyb2xsQmFyUmVmID0gdmVydGljYWxTY3JvbGxCYXJSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX3ZlcnRpY2FsU2Nyb2xsQmFyUmVmID09PSB2b2lkIDAgfHwgX3ZlcnRpY2FsU2Nyb2xsQmFyUmVmLmRlbGF5SGlkZGVuKCk7XG4gICAgKF9ob3Jpem9udGFsU2Nyb2xsQmFyUiA9IGhvcml6b250YWxTY3JvbGxCYXJSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2hvcml6b250YWxTY3JvbGxCYXJSID09PSB2b2lkIDAgfHwgX2hvcml6b250YWxTY3JvbGxCYXJSLmRlbGF5SGlkZGVuKCk7XG4gIH07XG4gIHZhciBfc2Nyb2xsVG8gPSB1c2VTY3JvbGxUbyhjb21wb25lbnRSZWYsIG1lcmdlZERhdGEsIGhlaWdodHMsIGl0ZW1IZWlnaHQsIGdldEtleSwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjb2xsZWN0SGVpZ2h0KHRydWUpO1xuICB9LCBzeW5jU2Nyb2xsVG9wLCBkZWxheUhpZGVTY3JvbGxCYXIpO1xuICBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBuYXRpdmVFbGVtZW50OiBjb250YWluZXJSZWYuY3VycmVudCxcbiAgICAgIGdldFNjcm9sbEluZm86IGdldFZpcnR1YWxTY3JvbGxJbmZvLFxuICAgICAgc2Nyb2xsVG86IGZ1bmN0aW9uIHNjcm9sbFRvKGNvbmZpZykge1xuICAgICAgICBmdW5jdGlvbiBpc1Bvc1Njcm9sbChhcmcpIHtcbiAgICAgICAgICByZXR1cm4gYXJnICYmIF90eXBlb2YoYXJnKSA9PT0gJ29iamVjdCcgJiYgKCdsZWZ0JyBpbiBhcmcgfHwgJ3RvcCcgaW4gYXJnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQb3NTY3JvbGwoY29uZmlnKSkge1xuICAgICAgICAgIC8vIFNjcm9sbCBYXG4gICAgICAgICAgaWYgKGNvbmZpZy5sZWZ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHNldE9mZnNldExlZnQoa2VlcEluSG9yaXpvbnRhbFJhbmdlKGNvbmZpZy5sZWZ0KSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU2Nyb2xsIFlcbiAgICAgICAgICBfc2Nyb2xsVG8oY29uZmlnLnRvcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgX3Njcm9sbFRvKGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFZmZlY3QgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLyoqIFdlIG5lZWQgdG9sZCBvdXRzaWRlIHRoYXQgc29tZSBsaXN0IG5vdCByZW5kZXJlZCAqL1xuICB1c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChvblZpc2libGVDaGFuZ2UpIHtcbiAgICAgIHZhciByZW5kZXJMaXN0ID0gbWVyZ2VkRGF0YS5zbGljZShzdGFydCwgZW5kICsgMSk7XG4gICAgICBvblZpc2libGVDaGFuZ2UocmVuZGVyTGlzdCwgbWVyZ2VkRGF0YSk7XG4gICAgfVxuICB9LCBbc3RhcnQsIGVuZCwgbWVyZ2VkRGF0YV0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEV4dHJhID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgZ2V0U2l6ZSA9IHVzZUdldFNpemUobWVyZ2VkRGF0YSwgZ2V0S2V5LCBoZWlnaHRzLCBpdGVtSGVpZ2h0KTtcbiAgdmFyIGV4dHJhQ29udGVudCA9IGV4dHJhUmVuZGVyID09PSBudWxsIHx8IGV4dHJhUmVuZGVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBleHRyYVJlbmRlcih7XG4gICAgc3RhcnQ6IHN0YXJ0LFxuICAgIGVuZDogZW5kLFxuICAgIHZpcnR1YWw6IGluVmlydHVhbCxcbiAgICBvZmZzZXRYOiBvZmZzZXRMZWZ0LFxuICAgIG9mZnNldFk6IGZpbGxlck9mZnNldCxcbiAgICBydGw6IGlzUlRMLFxuICAgIGdldFNpemU6IGdldFNpemVcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBsaXN0Q2hpbGRyZW4gPSB1c2VDaGlsZHJlbihtZXJnZWREYXRhLCBzdGFydCwgZW5kLCBzY3JvbGxXaWR0aCwgb2Zmc2V0TGVmdCwgc2V0SW5zdGFuY2VSZWYsIGNoaWxkcmVuLCBzaGFyZWRDb25maWcpO1xuICB2YXIgY29tcG9uZW50U3R5bGUgPSBudWxsO1xuICBpZiAoaGVpZ2h0KSB7XG4gICAgY29tcG9uZW50U3R5bGUgPSBfb2JqZWN0U3ByZWFkKF9kZWZpbmVQcm9wZXJ0eSh7fSwgZnVsbEhlaWdodCA/ICdoZWlnaHQnIDogJ21heEhlaWdodCcsIGhlaWdodCksIFNjcm9sbFN0eWxlKTtcbiAgICBpZiAodXNlVmlydHVhbCkge1xuICAgICAgY29tcG9uZW50U3R5bGUub3ZlcmZsb3dZID0gJ2hpZGRlbic7XG4gICAgICBpZiAoc2Nyb2xsV2lkdGgpIHtcbiAgICAgICAgY29tcG9uZW50U3R5bGUub3ZlcmZsb3dYID0gJ2hpZGRlbic7XG4gICAgICB9XG4gICAgICBpZiAoc2Nyb2xsTW92aW5nKSB7XG4gICAgICAgIGNvbXBvbmVudFN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHZhciBjb250YWluZXJQcm9wcyA9IHt9O1xuICBpZiAoaXNSVEwpIHtcbiAgICBjb250YWluZXJQcm9wcy5kaXIgPSAncnRsJztcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIHJlZjogY29udGFpbmVyUmVmLFxuICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN0eWxlKSwge30sIHtcbiAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnXG4gICAgfSksXG4gICAgY2xhc3NOYW1lOiBtZXJnZWRDbGFzc05hbWVcbiAgfSwgY29udGFpbmVyUHJvcHMsIHJlc3RQcm9wcyksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlc2l6ZU9ic2VydmVyLCB7XG4gICAgb25SZXNpemU6IG9uSG9sZGVyUmVzaXplXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ob2xkZXJcIiksXG4gICAgc3R5bGU6IGNvbXBvbmVudFN0eWxlLFxuICAgIHJlZjogY29tcG9uZW50UmVmLFxuICAgIG9uU2Nyb2xsOiBvbkZhbGxiYWNrU2Nyb2xsLFxuICAgIG9uTW91c2VFbnRlcjogZGVsYXlIaWRlU2Nyb2xsQmFyXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZpbGxlciwge1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGhlaWdodDogc2Nyb2xsSGVpZ2h0LFxuICAgIG9mZnNldFg6IG9mZnNldExlZnQsXG4gICAgb2Zmc2V0WTogZmlsbGVyT2Zmc2V0LFxuICAgIHNjcm9sbFdpZHRoOiBzY3JvbGxXaWR0aCxcbiAgICBvbklubmVyUmVzaXplOiBjb2xsZWN0SGVpZ2h0LFxuICAgIHJlZjogZmlsbGVySW5uZXJSZWYsXG4gICAgaW5uZXJQcm9wczogaW5uZXJQcm9wcyxcbiAgICBydGw6IGlzUlRMLFxuICAgIGV4dHJhOiBleHRyYUNvbnRlbnRcbiAgfSwgbGlzdENoaWxkcmVuKSkpLCBpblZpcnR1YWwgJiYgc2Nyb2xsSGVpZ2h0ID4gaGVpZ2h0ICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNjcm9sbEJhciwge1xuICAgIHJlZjogdmVydGljYWxTY3JvbGxCYXJSZWYsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgc2Nyb2xsT2Zmc2V0OiBvZmZzZXRUb3AsXG4gICAgc2Nyb2xsUmFuZ2U6IHNjcm9sbEhlaWdodCxcbiAgICBydGw6IGlzUlRMLFxuICAgIG9uU2Nyb2xsOiBvblNjcm9sbEJhcixcbiAgICBvblN0YXJ0TW92ZTogb25TY3JvbGxiYXJTdGFydE1vdmUsXG4gICAgb25TdG9wTW92ZTogb25TY3JvbGxiYXJTdG9wTW92ZSxcbiAgICBzcGluU2l6ZTogdmVydGljYWxTY3JvbGxCYXJTcGluU2l6ZSxcbiAgICBjb250YWluZXJTaXplOiBzaXplLmhlaWdodCxcbiAgICBzdHlsZTogc3R5bGVzID09PSBudWxsIHx8IHN0eWxlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3R5bGVzLnZlcnRpY2FsU2Nyb2xsQmFyLFxuICAgIHRodW1iU3R5bGU6IHN0eWxlcyA9PT0gbnVsbCB8fCBzdHlsZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0eWxlcy52ZXJ0aWNhbFNjcm9sbEJhclRodW1iLFxuICAgIHNob3dTY3JvbGxCYXI6IHNob3dTY3JvbGxCYXJcbiAgfSksIGluVmlydHVhbCAmJiBzY3JvbGxXaWR0aCA+IHNpemUud2lkdGggJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU2Nyb2xsQmFyLCB7XG4gICAgcmVmOiBob3Jpem9udGFsU2Nyb2xsQmFyUmVmLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIHNjcm9sbE9mZnNldDogb2Zmc2V0TGVmdCxcbiAgICBzY3JvbGxSYW5nZTogc2Nyb2xsV2lkdGgsXG4gICAgcnRsOiBpc1JUTCxcbiAgICBvblNjcm9sbDogb25TY3JvbGxCYXIsXG4gICAgb25TdGFydE1vdmU6IG9uU2Nyb2xsYmFyU3RhcnRNb3ZlLFxuICAgIG9uU3RvcE1vdmU6IG9uU2Nyb2xsYmFyU3RvcE1vdmUsXG4gICAgc3BpblNpemU6IGhvcml6b250YWxTY3JvbGxCYXJTcGluU2l6ZSxcbiAgICBjb250YWluZXJTaXplOiBzaXplLndpZHRoLFxuICAgIGhvcml6b250YWw6IHRydWUsXG4gICAgc3R5bGU6IHN0eWxlcyA9PT0gbnVsbCB8fCBzdHlsZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0eWxlcy5ob3Jpem9udGFsU2Nyb2xsQmFyLFxuICAgIHRodW1iU3R5bGU6IHN0eWxlcyA9PT0gbnVsbCB8fCBzdHlsZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0eWxlcy5ob3Jpem9udGFsU2Nyb2xsQmFyVGh1bWIsXG4gICAgc2hvd1Njcm9sbEJhcjogc2hvd1Njcm9sbEJhclxuICB9KSk7XG59XG52YXIgTGlzdCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKFJhd0xpc3QpO1xuTGlzdC5kaXNwbGF5TmFtZSA9ICdMaXN0JztcbmV4cG9ydCBkZWZhdWx0IExpc3Q7IiwgImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUmVzaXplT2JzZXJ2ZXIgZnJvbSAncmMtcmVzaXplLW9ic2VydmVyJztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuLyoqXG4gKiBGaWxsIGNvbXBvbmVudCB0byBwcm92aWRlZCB0aGUgc2Nyb2xsIGNvbnRlbnQgcmVhbCBoZWlnaHQuXG4gKi9cbnZhciBGaWxsZXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAoX3JlZiwgcmVmKSB7XG4gIHZhciBoZWlnaHQgPSBfcmVmLmhlaWdodCxcbiAgICBvZmZzZXRZID0gX3JlZi5vZmZzZXRZLFxuICAgIG9mZnNldFggPSBfcmVmLm9mZnNldFgsXG4gICAgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuLFxuICAgIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgIG9uSW5uZXJSZXNpemUgPSBfcmVmLm9uSW5uZXJSZXNpemUsXG4gICAgaW5uZXJQcm9wcyA9IF9yZWYuaW5uZXJQcm9wcyxcbiAgICBydGwgPSBfcmVmLnJ0bCxcbiAgICBleHRyYSA9IF9yZWYuZXh0cmE7XG4gIHZhciBvdXRlclN0eWxlID0ge307XG4gIHZhciBpbm5lclN0eWxlID0ge1xuICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJ1xuICB9O1xuICBpZiAob2Zmc2V0WSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gTm90IHNldCBgd2lkdGhgIHNpbmNlIHRoaXMgd2lsbCBicmVhayBgc3RpY2t5OiByaWdodGBcbiAgICBvdXRlclN0eWxlID0ge1xuICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgIG92ZXJmbG93OiAnaGlkZGVuJ1xuICAgIH07XG4gICAgaW5uZXJTdHlsZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgaW5uZXJTdHlsZSksIHt9LCBfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KHtcbiAgICAgIHRyYW5zZm9ybTogXCJ0cmFuc2xhdGVZKFwiLmNvbmNhdChvZmZzZXRZLCBcInB4KVwiKVxuICAgIH0sIHJ0bCA/ICdtYXJnaW5SaWdodCcgOiAnbWFyZ2luTGVmdCcsIC1vZmZzZXRYKSwgXCJwb3NpdGlvblwiLCAnYWJzb2x1dGUnKSwgXCJsZWZ0XCIsIDApLCBcInJpZ2h0XCIsIDApLCBcInRvcFwiLCAwKSk7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBzdHlsZTogb3V0ZXJTdHlsZVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZXNpemVPYnNlcnZlciwge1xuICAgIG9uUmVzaXplOiBmdW5jdGlvbiBvblJlc2l6ZShfcmVmMikge1xuICAgICAgdmFyIG9mZnNldEhlaWdodCA9IF9yZWYyLm9mZnNldEhlaWdodDtcbiAgICAgIGlmIChvZmZzZXRIZWlnaHQgJiYgb25Jbm5lclJlc2l6ZSkge1xuICAgICAgICBvbklubmVyUmVzaXplKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgc3R5bGU6IGlubmVyU3R5bGUsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ob2xkZXItaW5uZXJcIiksIHByZWZpeENscykpLFxuICAgIHJlZjogcmVmXG4gIH0sIGlubmVyUHJvcHMpLCBjaGlsZHJlbiwgZXh0cmEpKSk7XG59KTtcbkZpbGxlci5kaXNwbGF5TmFtZSA9ICdGaWxsZXInO1xuZXhwb3J0IGRlZmF1bHQgRmlsbGVyOyIsICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBJdGVtIH0gZnJvbSBcIi4uL0l0ZW1cIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUNoaWxkcmVuKGxpc3QsIHN0YXJ0SW5kZXgsIGVuZEluZGV4LCBzY3JvbGxXaWR0aCwgb2Zmc2V0WCwgc2V0Tm9kZVJlZiwgcmVuZGVyRnVuYywgX3JlZikge1xuICB2YXIgZ2V0S2V5ID0gX3JlZi5nZXRLZXk7XG4gIHJldHVybiBsaXN0LnNsaWNlKHN0YXJ0SW5kZXgsIGVuZEluZGV4ICsgMSkubWFwKGZ1bmN0aW9uIChpdGVtLCBpbmRleCkge1xuICAgIHZhciBlbGVJbmRleCA9IHN0YXJ0SW5kZXggKyBpbmRleDtcbiAgICB2YXIgbm9kZSA9IHJlbmRlckZ1bmMoaXRlbSwgZWxlSW5kZXgsIHtcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIHdpZHRoOiBzY3JvbGxXaWR0aFxuICAgICAgfSxcbiAgICAgIG9mZnNldFg6IG9mZnNldFhcbiAgICB9KTtcbiAgICB2YXIga2V5ID0gZ2V0S2V5KGl0ZW0pO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJdGVtLCB7XG4gICAgICBrZXk6IGtleSxcbiAgICAgIHNldFJlZjogZnVuY3Rpb24gc2V0UmVmKGVsZSkge1xuICAgICAgICByZXR1cm4gc2V0Tm9kZVJlZihpdGVtLCBlbGUpO1xuICAgICAgfVxuICAgIH0sIG5vZGUpO1xuICB9KTtcbn0iLCAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuZXhwb3J0IGZ1bmN0aW9uIEl0ZW0oX3JlZikge1xuICB2YXIgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuLFxuICAgIHNldFJlZiA9IF9yZWYuc2V0UmVmO1xuICB2YXIgcmVmRnVuYyA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgc2V0UmVmKG5vZGUpO1xuICB9LCBbXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkcmVuLCB7XG4gICAgcmVmOiByZWZGdW5jXG4gIH0pO1xufSIsICJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGZpbmRMaXN0RGlmZkluZGV4IH0gZnJvbSBcIi4uL3V0aWxzL2FsZ29yaXRobVV0aWxcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZURpZmZJdGVtKGRhdGEsIGdldEtleSwgb25EaWZmKSB7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShkYXRhKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBwcmV2RGF0YSA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0UHJldkRhdGEgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlMyA9IFJlYWN0LnVzZVN0YXRlKG51bGwpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUzLCAyKSxcbiAgICBkaWZmSXRlbSA9IF9SZWFjdCR1c2VTdGF0ZTRbMF0sXG4gICAgc2V0RGlmZkl0ZW0gPSBfUmVhY3QkdXNlU3RhdGU0WzFdO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBkaWZmID0gZmluZExpc3REaWZmSW5kZXgocHJldkRhdGEgfHwgW10sIGRhdGEgfHwgW10sIGdldEtleSk7XG4gICAgaWYgKChkaWZmID09PSBudWxsIHx8IGRpZmYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRpZmYuaW5kZXgpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG9uRGlmZiA9PT0gbnVsbCB8fCBvbkRpZmYgPT09IHZvaWQgMCB8fCBvbkRpZmYoZGlmZi5pbmRleCk7XG4gICAgICBzZXREaWZmSXRlbShkYXRhW2RpZmYuaW5kZXhdKTtcbiAgICB9XG4gICAgc2V0UHJldkRhdGEoZGF0YSk7XG4gIH0sIFtkYXRhXSk7XG4gIHJldHVybiBbZGlmZkl0ZW1dO1xufSIsICIvKipcbiAqIEdldCBpbmRleCB3aXRoIHNwZWNpZmljIHN0YXJ0IGluZGV4IG9uZSBieSBvbmUuIGUuZy5cbiAqIG1pbjogMywgbWF4OiA5LCBzdGFydDogNlxuICpcbiAqIFJldHVybiBpbmRleCBpczpcbiAqIFswXTogNlxuICogWzFdOiA3XG4gKiBbMl06IDVcbiAqIFszXTogOFxuICogWzRdOiA0XG4gKiBbNV06IDlcbiAqIFs2XTogM1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5kZXhCeVN0YXJ0TG9jKG1pbiwgbWF4LCBzdGFydCwgaW5kZXgpIHtcbiAgdmFyIGJlZm9yZUNvdW50ID0gc3RhcnQgLSBtaW47XG4gIHZhciBhZnRlckNvdW50ID0gbWF4IC0gc3RhcnQ7XG4gIHZhciBiYWxhbmNlQ291bnQgPSBNYXRoLm1pbihiZWZvcmVDb3VudCwgYWZ0ZXJDb3VudCkgKiAyO1xuXG4gIC8vIEJhbGFuY2VcbiAgaWYgKGluZGV4IDw9IGJhbGFuY2VDb3VudCkge1xuICAgIHZhciBzdGVwSW5kZXggPSBNYXRoLmZsb29yKGluZGV4IC8gMik7XG4gICAgaWYgKGluZGV4ICUgMikge1xuICAgICAgcmV0dXJuIHN0YXJ0ICsgc3RlcEluZGV4ICsgMTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXJ0IC0gc3RlcEluZGV4O1xuICB9XG5cbiAgLy8gT25lIGlzIG91dCBvZiByYW5nZVxuICBpZiAoYmVmb3JlQ291bnQgPiBhZnRlckNvdW50KSB7XG4gICAgcmV0dXJuIHN0YXJ0IC0gKGluZGV4IC0gYWZ0ZXJDb3VudCk7XG4gIH1cbiAgcmV0dXJuIHN0YXJ0ICsgKGluZGV4IC0gYmVmb3JlQ291bnQpO1xufVxuXG4vKipcbiAqIFdlIGFzc3VtZSB0aGF0IDIgbGlzdCBoYXMgb25seSAxIGl0ZW0gZGlmZiBhbmQgb3RoZXJzIGtlZXBpbmcgdGhlIG9yZGVyLlxuICogU28gd2UgY2FuIHVzZSBkaWNob3RvbXkgYWxnb3JpdGhtIHRvIGZpbmQgY2hhbmdlZCBvbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kTGlzdERpZmZJbmRleChvcmlnaW5MaXN0LCB0YXJnZXRMaXN0LCBnZXRLZXkpIHtcbiAgdmFyIG9yaWdpbkxlbiA9IG9yaWdpbkxpc3QubGVuZ3RoO1xuICB2YXIgdGFyZ2V0TGVuID0gdGFyZ2V0TGlzdC5sZW5ndGg7XG4gIHZhciBzaG9ydExpc3Q7XG4gIHZhciBsb25nTGlzdDtcbiAgaWYgKG9yaWdpbkxlbiA9PT0gMCAmJiB0YXJnZXRMZW4gPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAob3JpZ2luTGVuIDwgdGFyZ2V0TGVuKSB7XG4gICAgc2hvcnRMaXN0ID0gb3JpZ2luTGlzdDtcbiAgICBsb25nTGlzdCA9IHRhcmdldExpc3Q7XG4gIH0gZWxzZSB7XG4gICAgc2hvcnRMaXN0ID0gdGFyZ2V0TGlzdDtcbiAgICBsb25nTGlzdCA9IG9yaWdpbkxpc3Q7XG4gIH1cbiAgdmFyIG5vdEV4aXN0S2V5ID0ge1xuICAgIF9fRU1QVFlfSVRFTV9fOiB0cnVlXG4gIH07XG4gIGZ1bmN0aW9uIGdldEl0ZW1LZXkoaXRlbSkge1xuICAgIGlmIChpdGVtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBnZXRLZXkoaXRlbSk7XG4gICAgfVxuICAgIHJldHVybiBub3RFeGlzdEtleTtcbiAgfVxuXG4gIC8vIExvb3AgdG8gZmluZCBkaWZmIG9uZVxuICB2YXIgZGlmZkluZGV4ID0gbnVsbDtcbiAgdmFyIG11bHRpcGxlID0gTWF0aC5hYnMob3JpZ2luTGVuIC0gdGFyZ2V0TGVuKSAhPT0gMTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb25nTGlzdC5sZW5ndGg7IGkgKz0gMSkge1xuICAgIHZhciBzaG9ydEtleSA9IGdldEl0ZW1LZXkoc2hvcnRMaXN0W2ldKTtcbiAgICB2YXIgbG9uZ0tleSA9IGdldEl0ZW1LZXkobG9uZ0xpc3RbaV0pO1xuICAgIGlmIChzaG9ydEtleSAhPT0gbG9uZ0tleSkge1xuICAgICAgZGlmZkluZGV4ID0gaTtcbiAgICAgIG11bHRpcGxlID0gbXVsdGlwbGUgfHwgc2hvcnRLZXkgIT09IGdldEl0ZW1LZXkobG9uZ0xpc3RbaSArIDFdKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGlmZkluZGV4ID09PSBudWxsID8gbnVsbCA6IHtcbiAgICBpbmRleDogZGlmZkluZGV4LFxuICAgIG11bHRpcGxlOiBtdWx0aXBsZVxuICB9O1xufSIsICJpbXBvcnQgcmFmIGZyb20gXCJyYy11dGlsL2VzL3JhZlwiO1xuaW1wb3J0IHsgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGlzRkYgZnJvbSBcIi4uL3V0aWxzL2lzRmlyZWZveFwiO1xuaW1wb3J0IHVzZU9yaWdpblNjcm9sbCBmcm9tIFwiLi91c2VPcmlnaW5TY3JvbGxcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUZyYW1lV2hlZWwoaW5WaXJ0dWFsLCBpc1Njcm9sbEF0VG9wLCBpc1Njcm9sbEF0Qm90dG9tLCBpc1Njcm9sbEF0TGVmdCwgaXNTY3JvbGxBdFJpZ2h0LCBob3Jpem9udGFsU2Nyb2xsLFxuLyoqKlxuICogUmV0dXJuIGB0cnVlYCB3aGVuIHlvdSBuZWVkIHRvIHByZXZlbnQgZGVmYXVsdCBldmVudFxuICovXG5vbldoZWVsRGVsdGEpIHtcbiAgdmFyIG9mZnNldFJlZiA9IHVzZVJlZigwKTtcbiAgdmFyIG5leHRGcmFtZVJlZiA9IHVzZVJlZihudWxsKTtcblxuICAvLyBGaXJlZm94IHBhdGNoXG4gIHZhciB3aGVlbFZhbHVlUmVmID0gdXNlUmVmKG51bGwpO1xuICB2YXIgaXNNb3VzZVNjcm9sbFJlZiA9IHVzZVJlZihmYWxzZSk7XG5cbiAgLy8gU2Nyb2xsIHN0YXR1cyBzeW5jXG4gIHZhciBvcmlnaW5TY3JvbGwgPSB1c2VPcmlnaW5TY3JvbGwoaXNTY3JvbGxBdFRvcCwgaXNTY3JvbGxBdEJvdHRvbSwgaXNTY3JvbGxBdExlZnQsIGlzU2Nyb2xsQXRSaWdodCk7XG4gIGZ1bmN0aW9uIG9uV2hlZWxZKGUsIGRlbHRhWSkge1xuICAgIHJhZi5jYW5jZWwobmV4dEZyYW1lUmVmLmN1cnJlbnQpO1xuXG4gICAgLy8gRG8gbm90aGluZyB3aGVuIHNjcm9sbCBhdCB0aGUgZWRnZSwgU2tpcCBjaGVjayB3aGVuIGlzIGluIHNjcm9sbFxuICAgIGlmIChvcmlnaW5TY3JvbGwoZmFsc2UsIGRlbHRhWSkpIHJldHVybjtcblxuICAgIC8vIFNraXAgaWYgbmVzdCBMaXN0IGhhcyBoYW5kbGVkIHRoaXMgZXZlbnRcbiAgICB2YXIgZXZlbnQgPSBlO1xuICAgIGlmICghZXZlbnQuX3ZpcnR1YWxIYW5kbGVkKSB7XG4gICAgICBldmVudC5fdmlydHVhbEhhbmRsZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG9mZnNldFJlZi5jdXJyZW50ICs9IGRlbHRhWTtcbiAgICB3aGVlbFZhbHVlUmVmLmN1cnJlbnQgPSBkZWx0YVk7XG5cbiAgICAvLyBQcm94eSBvZiBzY3JvbGwgZXZlbnRzXG4gICAgaWYgKCFpc0ZGKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBuZXh0RnJhbWVSZWYuY3VycmVudCA9IHJhZihmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBQYXRjaCBhIG11bHRpcGxlIGZvciBGaXJlZm94IHRvIGZpeCB3aGVlbCBudW1iZXIgdG9vIHNtYWxsXG4gICAgICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzI2MzcyI2lzc3VlY29tbWVudC02Nzk0NjAyNjZcbiAgICAgIHZhciBwYXRjaE11bHRpcGxlID0gaXNNb3VzZVNjcm9sbFJlZi5jdXJyZW50ID8gMTAgOiAxO1xuICAgICAgb25XaGVlbERlbHRhKG9mZnNldFJlZi5jdXJyZW50ICogcGF0Y2hNdWx0aXBsZSwgZmFsc2UpO1xuICAgICAgb2Zmc2V0UmVmLmN1cnJlbnQgPSAwO1xuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIG9uV2hlZWxYKGV2ZW50LCBkZWx0YVgpIHtcbiAgICBvbldoZWVsRGVsdGEoZGVsdGFYLCB0cnVlKTtcbiAgICBpZiAoIWlzRkYpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIHdoaWNoIGRpcmVjdGlvbiBkb2VzIHdoZWVsIGRvLiBgc3hgIG1lYW5zIGBzaGlmdCArIHdoZWVsYFxuICB2YXIgd2hlZWxEaXJlY3Rpb25SZWYgPSB1c2VSZWYobnVsbCk7XG4gIHZhciB3aGVlbERpcmVjdGlvbkNsZWFuUmVmID0gdXNlUmVmKG51bGwpO1xuICBmdW5jdGlvbiBvbldoZWVsKGV2ZW50KSB7XG4gICAgaWYgKCFpblZpcnR1YWwpIHJldHVybjtcblxuICAgIC8vIFdhaXQgZm9yIDIgZnJhbWUgdG8gY2xlYW4gZGlyZWN0aW9uXG4gICAgcmFmLmNhbmNlbCh3aGVlbERpcmVjdGlvbkNsZWFuUmVmLmN1cnJlbnQpO1xuICAgIHdoZWVsRGlyZWN0aW9uQ2xlYW5SZWYuY3VycmVudCA9IHJhZihmdW5jdGlvbiAoKSB7XG4gICAgICB3aGVlbERpcmVjdGlvblJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICB9LCAyKTtcbiAgICB2YXIgZGVsdGFYID0gZXZlbnQuZGVsdGFYLFxuICAgICAgZGVsdGFZID0gZXZlbnQuZGVsdGFZLFxuICAgICAgc2hpZnRLZXkgPSBldmVudC5zaGlmdEtleTtcbiAgICB2YXIgbWVyZ2VkRGVsdGFYID0gZGVsdGFYO1xuICAgIHZhciBtZXJnZWREZWx0YVkgPSBkZWx0YVk7XG4gICAgaWYgKHdoZWVsRGlyZWN0aW9uUmVmLmN1cnJlbnQgPT09ICdzeCcgfHwgIXdoZWVsRGlyZWN0aW9uUmVmLmN1cnJlbnQgJiYgKHNoaWZ0S2V5IHx8IGZhbHNlKSAmJiBkZWx0YVkgJiYgIWRlbHRhWCkge1xuICAgICAgbWVyZ2VkRGVsdGFYID0gZGVsdGFZO1xuICAgICAgbWVyZ2VkRGVsdGFZID0gMDtcbiAgICAgIHdoZWVsRGlyZWN0aW9uUmVmLmN1cnJlbnQgPSAnc3gnO1xuICAgIH1cbiAgICB2YXIgYWJzWCA9IE1hdGguYWJzKG1lcmdlZERlbHRhWCk7XG4gICAgdmFyIGFic1kgPSBNYXRoLmFicyhtZXJnZWREZWx0YVkpO1xuICAgIGlmICh3aGVlbERpcmVjdGlvblJlZi5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgICB3aGVlbERpcmVjdGlvblJlZi5jdXJyZW50ID0gaG9yaXpvbnRhbFNjcm9sbCAmJiBhYnNYID4gYWJzWSA/ICd4JyA6ICd5JztcbiAgICB9XG4gICAgaWYgKHdoZWVsRGlyZWN0aW9uUmVmLmN1cnJlbnQgPT09ICd5Jykge1xuICAgICAgb25XaGVlbFkoZXZlbnQsIG1lcmdlZERlbHRhWSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9uV2hlZWxYKGV2ZW50LCBtZXJnZWREZWx0YVgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEEgcGF0Y2ggZm9yIGZpcmVmb3hcbiAgZnVuY3Rpb24gb25GaXJlRm94U2Nyb2xsKGV2ZW50KSB7XG4gICAgaWYgKCFpblZpcnR1YWwpIHJldHVybjtcbiAgICBpc01vdXNlU2Nyb2xsUmVmLmN1cnJlbnQgPSBldmVudC5kZXRhaWwgPT09IHdoZWVsVmFsdWVSZWYuY3VycmVudDtcbiAgfVxuICByZXR1cm4gW29uV2hlZWwsIG9uRmlyZUZveFNjcm9sbF07XG59IiwgImltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbnZhciBpc0ZGID0gKHR5cGVvZiBuYXZpZ2F0b3IgPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihuYXZpZ2F0b3IpKSA9PT0gJ29iamVjdCcgJiYgL0ZpcmVmb3gvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuZXhwb3J0IGRlZmF1bHQgaXNGRjsiLCAiaW1wb3J0IHsgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIChpc1Njcm9sbEF0VG9wLCBpc1Njcm9sbEF0Qm90dG9tLCBpc1Njcm9sbEF0TGVmdCwgaXNTY3JvbGxBdFJpZ2h0KSB7XG4gIC8vIERvIGxvY2sgZm9yIGEgd2hlZWwgd2hlbiBzY3JvbGxpbmdcbiAgdmFyIGxvY2tSZWYgPSB1c2VSZWYoZmFsc2UpO1xuICB2YXIgbG9ja1RpbWVvdXRSZWYgPSB1c2VSZWYobnVsbCk7XG4gIGZ1bmN0aW9uIGxvY2tTY3JvbGwoKSB7XG4gICAgY2xlYXJUaW1lb3V0KGxvY2tUaW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgIGxvY2tSZWYuY3VycmVudCA9IHRydWU7XG4gICAgbG9ja1RpbWVvdXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgbG9ja1JlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgfSwgNTApO1xuICB9XG5cbiAgLy8gUGFzcyB0byByZWYgc2luY2UgZ2xvYmFsIGFkZCBpcyBpbiBjbG9zdXJlXG4gIHZhciBzY3JvbGxQaW5nUmVmID0gdXNlUmVmKHtcbiAgICB0b3A6IGlzU2Nyb2xsQXRUb3AsXG4gICAgYm90dG9tOiBpc1Njcm9sbEF0Qm90dG9tLFxuICAgIGxlZnQ6IGlzU2Nyb2xsQXRMZWZ0LFxuICAgIHJpZ2h0OiBpc1Njcm9sbEF0UmlnaHRcbiAgfSk7XG4gIHNjcm9sbFBpbmdSZWYuY3VycmVudC50b3AgPSBpc1Njcm9sbEF0VG9wO1xuICBzY3JvbGxQaW5nUmVmLmN1cnJlbnQuYm90dG9tID0gaXNTY3JvbGxBdEJvdHRvbTtcbiAgc2Nyb2xsUGluZ1JlZi5jdXJyZW50LmxlZnQgPSBpc1Njcm9sbEF0TGVmdDtcbiAgc2Nyb2xsUGluZ1JlZi5jdXJyZW50LnJpZ2h0ID0gaXNTY3JvbGxBdFJpZ2h0O1xuICByZXR1cm4gZnVuY3Rpb24gKGlzSG9yaXpvbnRhbCwgZGVsdGEpIHtcbiAgICB2YXIgc21vb3RoT2Zmc2V0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcbiAgICB2YXIgb3JpZ2luU2Nyb2xsID0gaXNIb3Jpem9udGFsID9cbiAgICAvLyBQYXNzIG9yaWdpbiB3aGVlbCB3aGVuIG9uIHRoZSBsZWZ0XG4gICAgZGVsdGEgPCAwICYmIHNjcm9sbFBpbmdSZWYuY3VycmVudC5sZWZ0IHx8XG4gICAgLy8gUGFzcyBvcmlnaW4gd2hlZWwgd2hlbiBvbiB0aGUgcmlnaHRcbiAgICBkZWx0YSA+IDAgJiYgc2Nyb2xsUGluZ1JlZi5jdXJyZW50LnJpZ2h0IC8vIFBhc3Mgb3JpZ2luIHdoZWVsIHdoZW4gb24gdGhlIHRvcFxuICAgIDogZGVsdGEgPCAwICYmIHNjcm9sbFBpbmdSZWYuY3VycmVudC50b3AgfHxcbiAgICAvLyBQYXNzIG9yaWdpbiB3aGVlbCB3aGVuIG9uIHRoZSBib3R0b21cbiAgICBkZWx0YSA+IDAgJiYgc2Nyb2xsUGluZ1JlZi5jdXJyZW50LmJvdHRvbTtcbiAgICBpZiAoc21vb3RoT2Zmc2V0ICYmIG9yaWdpblNjcm9sbCkge1xuICAgICAgLy8gTm8gbmVlZCBsb2NrIGFueW1vcmUgd2hlbiBpdCdzIHNtb290aCBvZmZzZXQgZnJvbSB0b3VjaE1vdmUgaW50ZXJ2YWxcbiAgICAgIGNsZWFyVGltZW91dChsb2NrVGltZW91dFJlZi5jdXJyZW50KTtcbiAgICAgIGxvY2tSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoIW9yaWdpblNjcm9sbCB8fCBsb2NrUmVmLmN1cnJlbnQpIHtcbiAgICAgIGxvY2tTY3JvbGwoKTtcbiAgICB9XG4gICAgcmV0dXJuICFsb2NrUmVmLmN1cnJlbnQgJiYgb3JpZ2luU2Nyb2xsO1xuICB9O1xufSk7IiwgImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG4vKipcbiAqIFNpemUgaW5mbyBuZWVkIGxvb3AgcXVlcnkgZm9yIHRoZSBgaGVpZ2h0c2Agd2hpY2ggd2lsbCBoYXMgdGhlIHBlcmYgaXNzdWUuXG4gKiBMZXQgY2FjaGUgcmVzdWx0IGZvciBlYWNoIHJlbmRlciBwaGFzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUdldFNpemUobWVyZ2VkRGF0YSwgZ2V0S2V5LCBoZWlnaHRzLCBpdGVtSGVpZ2h0KSB7XG4gIHZhciBfUmVhY3QkdXNlTWVtbyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIFtuZXcgTWFwKCksIFtdXTtcbiAgICB9LCBbbWVyZ2VkRGF0YSwgaGVpZ2h0cy5pZCwgaXRlbUhlaWdodF0pLFxuICAgIF9SZWFjdCR1c2VNZW1vMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VNZW1vLCAyKSxcbiAgICBrZXkySW5kZXggPSBfUmVhY3QkdXNlTWVtbzJbMF0sXG4gICAgYm90dG9tTGlzdCA9IF9SZWFjdCR1c2VNZW1vMlsxXTtcbiAgdmFyIGdldFNpemUgPSBmdW5jdGlvbiBnZXRTaXplKHN0YXJ0S2V5KSB7XG4gICAgdmFyIGVuZEtleSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogc3RhcnRLZXk7XG4gICAgLy8gR2V0IGZyb20gY2FjaGUgZmlyc3RcbiAgICB2YXIgc3RhcnRJbmRleCA9IGtleTJJbmRleC5nZXQoc3RhcnRLZXkpO1xuICAgIHZhciBlbmRJbmRleCA9IGtleTJJbmRleC5nZXQoZW5kS2V5KTtcblxuICAgIC8vIExvb3AgdG8gZmlsbCB0aGUgY2FjaGVcbiAgICBpZiAoc3RhcnRJbmRleCA9PT0gdW5kZWZpbmVkIHx8IGVuZEluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBkYXRhTGVuID0gbWVyZ2VkRGF0YS5sZW5ndGg7XG4gICAgICBmb3IgKHZhciBpID0gYm90dG9tTGlzdC5sZW5ndGg7IGkgPCBkYXRhTGVuOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIF9oZWlnaHRzJGdldDtcbiAgICAgICAgdmFyIGl0ZW0gPSBtZXJnZWREYXRhW2ldO1xuICAgICAgICB2YXIga2V5ID0gZ2V0S2V5KGl0ZW0pO1xuICAgICAgICBrZXkySW5kZXguc2V0KGtleSwgaSk7XG4gICAgICAgIHZhciBjYWNoZUhlaWdodCA9IChfaGVpZ2h0cyRnZXQgPSBoZWlnaHRzLmdldChrZXkpKSAhPT0gbnVsbCAmJiBfaGVpZ2h0cyRnZXQgIT09IHZvaWQgMCA/IF9oZWlnaHRzJGdldCA6IGl0ZW1IZWlnaHQ7XG4gICAgICAgIGJvdHRvbUxpc3RbaV0gPSAoYm90dG9tTGlzdFtpIC0gMV0gfHwgMCkgKyBjYWNoZUhlaWdodDtcbiAgICAgICAgaWYgKGtleSA9PT0gc3RhcnRLZXkpIHtcbiAgICAgICAgICBzdGFydEluZGV4ID0gaTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoa2V5ID09PSBlbmRLZXkpIHtcbiAgICAgICAgICBlbmRJbmRleCA9IGk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0SW5kZXggIT09IHVuZGVmaW5lZCAmJiBlbmRJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHRvcDogYm90dG9tTGlzdFtzdGFydEluZGV4IC0gMV0gfHwgMCxcbiAgICAgIGJvdHRvbTogYm90dG9tTGlzdFtlbmRJbmRleF1cbiAgICB9O1xuICB9O1xuICByZXR1cm4gZ2V0U2l6ZTtcbn0iLCAiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBDYWNoZU1hcCBmcm9tIFwiLi4vdXRpbHMvQ2FjaGVNYXBcIjtcbmZ1bmN0aW9uIHBhcnNlTnVtYmVyKHZhbHVlKSB7XG4gIHZhciBudW0gPSBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgcmV0dXJuIGlzTmFOKG51bSkgPyAwIDogbnVtO1xufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlSGVpZ2h0cyhnZXRLZXksIG9uSXRlbUFkZCwgb25JdGVtUmVtb3ZlKSB7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZSgwKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICB1cGRhdGVkTWFyayA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0VXBkYXRlZE1hcmsgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICB2YXIgaW5zdGFuY2VSZWYgPSB1c2VSZWYobmV3IE1hcCgpKTtcbiAgdmFyIGhlaWdodHNSZWYgPSB1c2VSZWYobmV3IENhY2hlTWFwKCkpO1xuICB2YXIgcHJvbWlzZUlkUmVmID0gdXNlUmVmKDApO1xuICBmdW5jdGlvbiBjYW5jZWxSYWYoKSB7XG4gICAgcHJvbWlzZUlkUmVmLmN1cnJlbnQgKz0gMTtcbiAgfVxuICBmdW5jdGlvbiBjb2xsZWN0SGVpZ2h0KCkge1xuICAgIHZhciBzeW5jID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcbiAgICBjYW5jZWxSYWYoKTtcbiAgICB2YXIgZG9Db2xsZWN0ID0gZnVuY3Rpb24gZG9Db2xsZWN0KCkge1xuICAgICAgdmFyIGNoYW5nZWQgPSBmYWxzZTtcbiAgICAgIGluc3RhbmNlUmVmLmN1cnJlbnQuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCwga2V5KSB7XG4gICAgICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQub2Zmc2V0UGFyZW50KSB7XG4gICAgICAgICAgdmFyIG9mZnNldEhlaWdodCA9IGVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgICAgICAgIHZhciBfZ2V0Q29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCksXG4gICAgICAgICAgICBtYXJnaW5Ub3AgPSBfZ2V0Q29tcHV0ZWRTdHlsZS5tYXJnaW5Ub3AsXG4gICAgICAgICAgICBtYXJnaW5Cb3R0b20gPSBfZ2V0Q29tcHV0ZWRTdHlsZS5tYXJnaW5Cb3R0b207XG4gICAgICAgICAgdmFyIG1hcmdpblRvcE51bSA9IHBhcnNlTnVtYmVyKG1hcmdpblRvcCk7XG4gICAgICAgICAgdmFyIG1hcmdpbkJvdHRvbU51bSA9IHBhcnNlTnVtYmVyKG1hcmdpbkJvdHRvbSk7XG4gICAgICAgICAgdmFyIHRvdGFsSGVpZ2h0ID0gb2Zmc2V0SGVpZ2h0ICsgbWFyZ2luVG9wTnVtICsgbWFyZ2luQm90dG9tTnVtO1xuICAgICAgICAgIGlmIChoZWlnaHRzUmVmLmN1cnJlbnQuZ2V0KGtleSkgIT09IHRvdGFsSGVpZ2h0KSB7XG4gICAgICAgICAgICBoZWlnaHRzUmVmLmN1cnJlbnQuc2V0KGtleSwgdG90YWxIZWlnaHQpO1xuICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gQWx3YXlzIHRyaWdnZXIgdXBkYXRlIG1hcmsgdG8gdGVsbCBwYXJlbnQgdGhhdCBzaG91bGQgcmUtY2FsY3VsYXRlIGhlaWdodHMgd2hlbiByZXNpemVkXG4gICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICBzZXRVcGRhdGVkTWFyayhmdW5jdGlvbiAoYykge1xuICAgICAgICAgIHJldHVybiBjICsgMTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAoc3luYykge1xuICAgICAgZG9Db2xsZWN0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb21pc2VJZFJlZi5jdXJyZW50ICs9IDE7XG4gICAgICB2YXIgaWQgPSBwcm9taXNlSWRSZWYuY3VycmVudDtcbiAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoaWQgPT09IHByb21pc2VJZFJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgZG9Db2xsZWN0KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBzZXRJbnN0YW5jZVJlZihpdGVtLCBpbnN0YW5jZSkge1xuICAgIHZhciBrZXkgPSBnZXRLZXkoaXRlbSk7XG4gICAgdmFyIG9yaWdpbiA9IGluc3RhbmNlUmVmLmN1cnJlbnQuZ2V0KGtleSk7XG4gICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICBpbnN0YW5jZVJlZi5jdXJyZW50LnNldChrZXksIGluc3RhbmNlKTtcbiAgICAgIGNvbGxlY3RIZWlnaHQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zdGFuY2VSZWYuY3VycmVudC5kZWxldGUoa2V5KTtcbiAgICB9XG5cbiAgICAvLyBJbnN0YW5jZSBjaGFuZ2VkXG4gICAgaWYgKCFvcmlnaW4gIT09ICFpbnN0YW5jZSkge1xuICAgICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICAgIG9uSXRlbUFkZCA9PT0gbnVsbCB8fCBvbkl0ZW1BZGQgPT09IHZvaWQgMCB8fCBvbkl0ZW1BZGQoaXRlbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbkl0ZW1SZW1vdmUgPT09IG51bGwgfHwgb25JdGVtUmVtb3ZlID09PSB2b2lkIDAgfHwgb25JdGVtUmVtb3ZlKGl0ZW0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjYW5jZWxSYWY7XG4gIH0sIFtdKTtcbiAgcmV0dXJuIFtzZXRJbnN0YW5jZVJlZiwgY29sbGVjdEhlaWdodCwgaGVpZ2h0c1JlZi5jdXJyZW50LCB1cGRhdGVkTWFya107XG59IiwgImltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbi8vIEZpcmVmb3ggaGFzIGxvdyBwZXJmb3JtYW5jZSBvZiBtYXAuXG52YXIgQ2FjaGVNYXAgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBDYWNoZU1hcCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2FjaGVNYXApO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm1hcHNcIiwgdm9pZCAwKTtcbiAgICAvLyBVc2VkIGZvciBjYWNoZSBrZXlcbiAgICAvLyBgdXNlTWVtb2Agbm8gbmVlZCB0byB1cGRhdGUgaWYgYGlkYCBub3QgY2hhbmdlXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiaWRcIiwgMCk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiZGlmZlJlY29yZHNcIiwgbmV3IE1hcCgpKTtcbiAgICB0aGlzLm1hcHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB9XG4gIF9jcmVhdGVDbGFzcyhDYWNoZU1hcCwgW3tcbiAgICBrZXk6IFwic2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAvLyBSZWNvcmQgcHJldiB2YWx1ZVxuICAgICAgdGhpcy5kaWZmUmVjb3Jkcy5zZXQoa2V5LCB0aGlzLm1hcHNba2V5XSk7XG4gICAgICB0aGlzLm1hcHNba2V5XSA9IHZhbHVlO1xuICAgICAgdGhpcy5pZCArPSAxO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMubWFwc1trZXldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhY2hlTWFwIHdpbGwgcmVjb3JkIHRoZSBrZXkgY2hhbmdlZC5cbiAgICAgKiBUbyBoZWxwIHRvIGtub3cgd2hhdCdzIHVwZGF0ZSBpbiB0aGUgbmV4dCByZW5kZXIuXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6IFwicmVzZXRSZWNvcmRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVzZXRSZWNvcmQoKSB7XG4gICAgICB0aGlzLmRpZmZSZWNvcmRzLmNsZWFyKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFJlY29yZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRSZWNvcmQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaWZmUmVjb3JkcztcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIENhY2hlTWFwO1xufSgpO1xuZXhwb3J0IGRlZmF1bHQgQ2FjaGVNYXA7IiwgImltcG9ydCB1c2VMYXlvdXRFZmZlY3QgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlTGF5b3V0RWZmZWN0XCI7XG5pbXBvcnQgeyB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG52YXIgU01PT1RIX1BURyA9IDE0IC8gMTU7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VNb2JpbGVUb3VjaE1vdmUoaW5WaXJ0dWFsLCBsaXN0UmVmLCBjYWxsYmFjaykge1xuICB2YXIgdG91Y2hlZFJlZiA9IHVzZVJlZihmYWxzZSk7XG4gIHZhciB0b3VjaFhSZWYgPSB1c2VSZWYoMCk7XG4gIHZhciB0b3VjaFlSZWYgPSB1c2VSZWYoMCk7XG4gIHZhciBlbGVtZW50UmVmID0gdXNlUmVmKG51bGwpO1xuXG4gIC8vIFNtb290aCBzY3JvbGxcbiAgdmFyIGludGVydmFsUmVmID0gdXNlUmVmKG51bGwpO1xuXG4gIC8qIGVzbGludC1kaXNhYmxlIHByZWZlci1jb25zdCAqL1xuICB2YXIgY2xlYW5VcEV2ZW50cztcbiAgdmFyIG9uVG91Y2hNb3ZlID0gZnVuY3Rpb24gb25Ub3VjaE1vdmUoZSkge1xuICAgIGlmICh0b3VjaGVkUmVmLmN1cnJlbnQpIHtcbiAgICAgIHZhciBjdXJyZW50WCA9IE1hdGguY2VpbChlLnRvdWNoZXNbMF0ucGFnZVgpO1xuICAgICAgdmFyIGN1cnJlbnRZID0gTWF0aC5jZWlsKGUudG91Y2hlc1swXS5wYWdlWSk7XG4gICAgICB2YXIgb2Zmc2V0WCA9IHRvdWNoWFJlZi5jdXJyZW50IC0gY3VycmVudFg7XG4gICAgICB2YXIgb2Zmc2V0WSA9IHRvdWNoWVJlZi5jdXJyZW50IC0gY3VycmVudFk7XG4gICAgICB2YXIgX2lzSG9yaXpvbnRhbCA9IE1hdGguYWJzKG9mZnNldFgpID4gTWF0aC5hYnMob2Zmc2V0WSk7XG4gICAgICBpZiAoX2lzSG9yaXpvbnRhbCkge1xuICAgICAgICB0b3VjaFhSZWYuY3VycmVudCA9IGN1cnJlbnRYO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdG91Y2hZUmVmLmN1cnJlbnQgPSBjdXJyZW50WTtcbiAgICAgIH1cbiAgICAgIHZhciBzY3JvbGxIYW5kbGVkID0gY2FsbGJhY2soX2lzSG9yaXpvbnRhbCwgX2lzSG9yaXpvbnRhbCA/IG9mZnNldFggOiBvZmZzZXRZLCBmYWxzZSwgZSk7XG4gICAgICBpZiAoc2Nyb2xsSGFuZGxlZCkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNtb290aCBpbnRlcnZhbFxuICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbFJlZi5jdXJyZW50KTtcbiAgICAgIGlmIChzY3JvbGxIYW5kbGVkKSB7XG4gICAgICAgIGludGVydmFsUmVmLmN1cnJlbnQgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKF9pc0hvcml6b250YWwpIHtcbiAgICAgICAgICAgIG9mZnNldFggKj0gU01PT1RIX1BURztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb2Zmc2V0WSAqPSBTTU9PVEhfUFRHO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgb2Zmc2V0ID0gTWF0aC5mbG9vcihfaXNIb3Jpem9udGFsID8gb2Zmc2V0WCA6IG9mZnNldFkpO1xuICAgICAgICAgIGlmICghY2FsbGJhY2soX2lzSG9yaXpvbnRhbCwgb2Zmc2V0LCB0cnVlKSB8fCBNYXRoLmFicyhvZmZzZXQpIDw9IDAuMSkge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbFJlZi5jdXJyZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDE2KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHZhciBvblRvdWNoRW5kID0gZnVuY3Rpb24gb25Ub3VjaEVuZCgpIHtcbiAgICB0b3VjaGVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICBjbGVhblVwRXZlbnRzKCk7XG4gIH07XG4gIHZhciBvblRvdWNoU3RhcnQgPSBmdW5jdGlvbiBvblRvdWNoU3RhcnQoZSkge1xuICAgIGNsZWFuVXBFdmVudHMoKTtcbiAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCA9PT0gMSAmJiAhdG91Y2hlZFJlZi5jdXJyZW50KSB7XG4gICAgICB0b3VjaGVkUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgdG91Y2hYUmVmLmN1cnJlbnQgPSBNYXRoLmNlaWwoZS50b3VjaGVzWzBdLnBhZ2VYKTtcbiAgICAgIHRvdWNoWVJlZi5jdXJyZW50ID0gTWF0aC5jZWlsKGUudG91Y2hlc1swXS5wYWdlWSk7XG4gICAgICBlbGVtZW50UmVmLmN1cnJlbnQgPSBlLnRhcmdldDtcbiAgICAgIGVsZW1lbnRSZWYuY3VycmVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBvblRvdWNoTW92ZSwge1xuICAgICAgICBwYXNzaXZlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgICBlbGVtZW50UmVmLmN1cnJlbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBvblRvdWNoRW5kLCB7XG4gICAgICAgIHBhc3NpdmU6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgY2xlYW5VcEV2ZW50cyA9IGZ1bmN0aW9uIGNsZWFuVXBFdmVudHMoKSB7XG4gICAgaWYgKGVsZW1lbnRSZWYuY3VycmVudCkge1xuICAgICAgZWxlbWVudFJlZi5jdXJyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIG9uVG91Y2hNb3ZlKTtcbiAgICAgIGVsZW1lbnRSZWYuY3VycmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIG9uVG91Y2hFbmQpO1xuICAgIH1cbiAgfTtcbiAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoaW5WaXJ0dWFsKSB7XG4gICAgICBsaXN0UmVmLmN1cnJlbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIG9uVG91Y2hTdGFydCwge1xuICAgICAgICBwYXNzaXZlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfbGlzdFJlZiRjdXJyZW50O1xuICAgICAgKF9saXN0UmVmJGN1cnJlbnQgPSBsaXN0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9saXN0UmVmJGN1cnJlbnQgPT09IHZvaWQgMCB8fCBfbGlzdFJlZiRjdXJyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBvblRvdWNoU3RhcnQpO1xuICAgICAgY2xlYW5VcEV2ZW50cygpO1xuICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbFJlZi5jdXJyZW50KTtcbiAgICB9O1xuICB9LCBbaW5WaXJ0dWFsXSk7XG59IiwgImltcG9ydCByYWYgZnJvbSBcInJjLXV0aWwvZXMvcmFmXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5mdW5jdGlvbiBzbW9vdGhTY3JvbGxPZmZzZXQob2Zmc2V0KSB7XG4gIHJldHVybiBNYXRoLmZsb29yKE1hdGgucG93KG9mZnNldCwgMC41KSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFnZVhZKGUsIGhvcml6b250YWwpIHtcbiAgdmFyIG9iaiA9ICd0b3VjaGVzJyBpbiBlID8gZS50b3VjaGVzWzBdIDogZTtcbiAgcmV0dXJuIG9ialtob3Jpem9udGFsID8gJ3BhZ2VYJyA6ICdwYWdlWSddIC0gd2luZG93W2hvcml6b250YWwgPyAnc2Nyb2xsWCcgOiAnc2Nyb2xsWSddO1xufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlU2Nyb2xsRHJhZyhpblZpcnR1YWwsIGNvbXBvbmVudFJlZiwgb25TY3JvbGxPZmZzZXQpIHtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZWxlID0gY29tcG9uZW50UmVmLmN1cnJlbnQ7XG4gICAgaWYgKGluVmlydHVhbCAmJiBlbGUpIHtcbiAgICAgIHZhciBtb3VzZURvd25Mb2NrID0gZmFsc2U7XG4gICAgICB2YXIgcmFmSWQ7XG4gICAgICB2YXIgX29mZnNldDtcbiAgICAgIHZhciBzdG9wU2Nyb2xsID0gZnVuY3Rpb24gc3RvcFNjcm9sbCgpIHtcbiAgICAgICAgcmFmLmNhbmNlbChyYWZJZCk7XG4gICAgICB9O1xuICAgICAgdmFyIGNvbnRpbnVlU2Nyb2xsID0gZnVuY3Rpb24gY29udGludWVTY3JvbGwoKSB7XG4gICAgICAgIHN0b3BTY3JvbGwoKTtcbiAgICAgICAgcmFmSWQgPSByYWYoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIG9uU2Nyb2xsT2Zmc2V0KF9vZmZzZXQpO1xuICAgICAgICAgIGNvbnRpbnVlU2Nyb2xsKCk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIHZhciBvbk1vdXNlRG93biA9IGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICAgICAgLy8gU2tpcCBpZiBlbGVtZW50IHNldCBkcmFnZ2FibGVcbiAgICAgICAgaWYgKGUudGFyZ2V0LmRyYWdnYWJsZSB8fCBlLmJ1dHRvbiAhPT0gMCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBTa2lwIGlmIG5lc3QgTGlzdCBoYXMgaGFuZGxlZCB0aGlzIGV2ZW50XG4gICAgICAgIHZhciBldmVudCA9IGU7XG4gICAgICAgIGlmICghZXZlbnQuX3ZpcnR1YWxIYW5kbGVkKSB7XG4gICAgICAgICAgZXZlbnQuX3ZpcnR1YWxIYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgICBtb3VzZURvd25Mb2NrID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHZhciBvbk1vdXNlVXAgPSBmdW5jdGlvbiBvbk1vdXNlVXAoKSB7XG4gICAgICAgIG1vdXNlRG93bkxvY2sgPSBmYWxzZTtcbiAgICAgICAgc3RvcFNjcm9sbCgpO1xuICAgICAgfTtcbiAgICAgIHZhciBvbk1vdXNlTW92ZSA9IGZ1bmN0aW9uIG9uTW91c2VNb3ZlKGUpIHtcbiAgICAgICAgaWYgKG1vdXNlRG93bkxvY2spIHtcbiAgICAgICAgICB2YXIgbW91c2VZID0gZ2V0UGFnZVhZKGUsIGZhbHNlKTtcbiAgICAgICAgICB2YXIgX2VsZSRnZXRCb3VuZGluZ0NsaWVuID0gZWxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgICAgICAgICAgdG9wID0gX2VsZSRnZXRCb3VuZGluZ0NsaWVuLnRvcCxcbiAgICAgICAgICAgIGJvdHRvbSA9IF9lbGUkZ2V0Qm91bmRpbmdDbGllbi5ib3R0b207XG4gICAgICAgICAgaWYgKG1vdXNlWSA8PSB0b3ApIHtcbiAgICAgICAgICAgIHZhciBkaWZmID0gdG9wIC0gbW91c2VZO1xuICAgICAgICAgICAgX29mZnNldCA9IC1zbW9vdGhTY3JvbGxPZmZzZXQoZGlmZik7XG4gICAgICAgICAgICBjb250aW51ZVNjcm9sbCgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAobW91c2VZID49IGJvdHRvbSkge1xuICAgICAgICAgICAgdmFyIF9kaWZmID0gbW91c2VZIC0gYm90dG9tO1xuICAgICAgICAgICAgX29mZnNldCA9IHNtb290aFNjcm9sbE9mZnNldChfZGlmZik7XG4gICAgICAgICAgICBjb250aW51ZVNjcm9sbCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdG9wU2Nyb2xsKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgZWxlLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIG9uTW91c2VEb3duKTtcbiAgICAgIGVsZS5vd25lckRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgICAgZWxlLm93bmVyRG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZWxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIG9uTW91c2VEb3duKTtcbiAgICAgICAgZWxlLm93bmVyRG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XG4gICAgICAgIGVsZS5vd25lckRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlKTtcbiAgICAgICAgc3RvcFNjcm9sbCgpO1xuICAgICAgfTtcbiAgICB9XG4gIH0sIFtpblZpcnR1YWxdKTtcbn0iLCAiaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuLyogZXNsaW50LWRpc2FibGUgbm8tcGFyYW0tcmVhc3NpZ24gKi9cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCByYWYgZnJvbSBcInJjLXV0aWwvZXMvcmFmXCI7XG5pbXBvcnQgdXNlTGF5b3V0RWZmZWN0IGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZUxheW91dEVmZmVjdFwiO1xuaW1wb3J0IHsgd2FybmluZyB9IGZyb20gJ3JjLXV0aWwnO1xudmFyIE1BWF9USU1FUyA9IDEwO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlU2Nyb2xsVG8oY29udGFpbmVyUmVmLCBkYXRhLCBoZWlnaHRzLCBpdGVtSGVpZ2h0LCBnZXRLZXksIGNvbGxlY3RIZWlnaHQsIHN5bmNTY3JvbGxUb3AsIHRyaWdnZXJGbGFzaCkge1xuICB2YXIgc2Nyb2xsUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShudWxsKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBzeW5jU3RhdGUgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldFN5bmNTdGF0ZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gU3luYyBTY3JvbGwgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoc3luY1N0YXRlICYmIHN5bmNTdGF0ZS50aW1lcyA8IE1BWF9USU1FUykge1xuICAgICAgLy8gTmV2ZXIgcmVhY2hcbiAgICAgIGlmICghY29udGFpbmVyUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgc2V0U3luY1N0YXRlKGZ1bmN0aW9uIChvcmkpIHtcbiAgICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZCh7fSwgb3JpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbGxlY3RIZWlnaHQoKTtcbiAgICAgIHZhciB0YXJnZXRBbGlnbiA9IHN5bmNTdGF0ZS50YXJnZXRBbGlnbixcbiAgICAgICAgb3JpZ2luQWxpZ24gPSBzeW5jU3RhdGUub3JpZ2luQWxpZ24sXG4gICAgICAgIGluZGV4ID0gc3luY1N0YXRlLmluZGV4LFxuICAgICAgICBvZmZzZXQgPSBzeW5jU3RhdGUub2Zmc2V0O1xuICAgICAgdmFyIGhlaWdodCA9IGNvbnRhaW5lclJlZi5jdXJyZW50LmNsaWVudEhlaWdodDtcbiAgICAgIHZhciBuZWVkQ29sbGVjdEhlaWdodCA9IGZhbHNlO1xuICAgICAgdmFyIG5ld1RhcmdldEFsaWduID0gdGFyZ2V0QWxpZ247XG4gICAgICB2YXIgdGFyZ2V0VG9wID0gbnVsbDtcblxuICAgICAgLy8gR28gdG8gbmV4dCBmcmFtZSBpZiBoZWlnaHQgbm90IGV4aXN0XG4gICAgICBpZiAoaGVpZ2h0KSB7XG4gICAgICAgIHZhciBtZXJnZWRBbGlnbiA9IHRhcmdldEFsaWduIHx8IG9yaWdpbkFsaWduO1xuXG4gICAgICAgIC8vIEdldCB0b3AgJiBib3R0b21cbiAgICAgICAgdmFyIHN0YWNrVG9wID0gMDtcbiAgICAgICAgdmFyIGl0ZW1Ub3AgPSAwO1xuICAgICAgICB2YXIgaXRlbUJvdHRvbSA9IDA7XG4gICAgICAgIHZhciBtYXhMZW4gPSBNYXRoLm1pbihkYXRhLmxlbmd0aCAtIDEsIGluZGV4KTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gbWF4TGVuOyBpICs9IDEpIHtcbiAgICAgICAgICB2YXIga2V5ID0gZ2V0S2V5KGRhdGFbaV0pO1xuICAgICAgICAgIGl0ZW1Ub3AgPSBzdGFja1RvcDtcbiAgICAgICAgICB2YXIgY2FjaGVIZWlnaHQgPSBoZWlnaHRzLmdldChrZXkpO1xuICAgICAgICAgIGl0ZW1Cb3R0b20gPSBpdGVtVG9wICsgKGNhY2hlSGVpZ2h0ID09PSB1bmRlZmluZWQgPyBpdGVtSGVpZ2h0IDogY2FjaGVIZWlnaHQpO1xuICAgICAgICAgIHN0YWNrVG9wID0gaXRlbUJvdHRvbTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIG5lZWQgc3luYyBoZWlnaHQgKHZpc2libGUgcmFuZ2UgaGFzIGl0ZW0gbm90IHJlY29yZCBoZWlnaHQpXG4gICAgICAgIHZhciBsZWZ0SGVpZ2h0ID0gbWVyZ2VkQWxpZ24gPT09ICd0b3AnID8gb2Zmc2V0IDogaGVpZ2h0IC0gb2Zmc2V0O1xuICAgICAgICBmb3IgKHZhciBfaSA9IG1heExlbjsgX2kgPj0gMDsgX2kgLT0gMSkge1xuICAgICAgICAgIHZhciBfa2V5ID0gZ2V0S2V5KGRhdGFbX2ldKTtcbiAgICAgICAgICB2YXIgX2NhY2hlSGVpZ2h0ID0gaGVpZ2h0cy5nZXQoX2tleSk7XG4gICAgICAgICAgaWYgKF9jYWNoZUhlaWdodCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBuZWVkQ29sbGVjdEhlaWdodCA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgbGVmdEhlaWdodCAtPSBfY2FjaGVIZWlnaHQ7XG4gICAgICAgICAgaWYgKGxlZnRIZWlnaHQgPD0gMCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2Nyb2xsIHRvXG4gICAgICAgIHN3aXRjaCAobWVyZ2VkQWxpZ24pIHtcbiAgICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgICAgdGFyZ2V0VG9wID0gaXRlbVRvcCAtIG9mZnNldDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgICB0YXJnZXRUb3AgPSBpdGVtQm90dG9tIC0gaGVpZ2h0ICsgb2Zmc2V0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdmFyIHNjcm9sbFRvcCA9IGNvbnRhaW5lclJlZi5jdXJyZW50LnNjcm9sbFRvcDtcbiAgICAgICAgICAgICAgdmFyIHNjcm9sbEJvdHRvbSA9IHNjcm9sbFRvcCArIGhlaWdodDtcbiAgICAgICAgICAgICAgaWYgKGl0ZW1Ub3AgPCBzY3JvbGxUb3ApIHtcbiAgICAgICAgICAgICAgICBuZXdUYXJnZXRBbGlnbiA9ICd0b3AnO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW1Cb3R0b20gPiBzY3JvbGxCb3R0b20pIHtcbiAgICAgICAgICAgICAgICBuZXdUYXJnZXRBbGlnbiA9ICdib3R0b20nO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhcmdldFRvcCAhPT0gbnVsbCkge1xuICAgICAgICAgIHN5bmNTY3JvbGxUb3AodGFyZ2V0VG9wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9uZSBtb3JlIHRpbWUgZm9yIHN5bmNcbiAgICAgICAgaWYgKHRhcmdldFRvcCAhPT0gc3luY1N0YXRlLmxhc3RUb3ApIHtcbiAgICAgICAgICBuZWVkQ29sbGVjdEhlaWdodCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVHJpZ2dlciBuZXh0IGVmZmVjdFxuICAgICAgaWYgKG5lZWRDb2xsZWN0SGVpZ2h0KSB7XG4gICAgICAgIHNldFN5bmNTdGF0ZShfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN5bmNTdGF0ZSksIHt9LCB7XG4gICAgICAgICAgdGltZXM6IHN5bmNTdGF0ZS50aW1lcyArIDEsXG4gICAgICAgICAgdGFyZ2V0QWxpZ246IG5ld1RhcmdldEFsaWduLFxuICAgICAgICAgIGxhc3RUb3A6IHRhcmdldFRvcFxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIChzeW5jU3RhdGUgPT09IG51bGwgfHwgc3luY1N0YXRlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzeW5jU3RhdGUudGltZXMpID09PSBNQVhfVElNRVMpIHtcbiAgICAgIHdhcm5pbmcoZmFsc2UsICdTZWVtcyBgc2Nyb2xsVG9gIHdpdGggYHJjLXZpcnR1YWwtbGlzdGAgcmVhY2ggdGhlIG1heCBsaW1pdGF0aW9uLiBQbGVhc2UgZmlyZSBpc3N1ZSBmb3IgdXMuIFRoYW5rcy4nKTtcbiAgICB9XG4gIH0sIFtzeW5jU3RhdGUsIGNvbnRhaW5lclJlZi5jdXJyZW50XSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IFNjcm9sbCBUbyA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgcmV0dXJuIGZ1bmN0aW9uIChhcmcpIHtcbiAgICAvLyBXaGVuIG5vdCBhcmd1bWVudCBwcm92aWRlZCwgd2UgdGhpbmsgZGV2IG1heSB3YW50IHRvIHNob3cgdGhlIHNjcm9sbGJhclxuICAgIGlmIChhcmcgPT09IG51bGwgfHwgYXJnID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRyaWdnZXJGbGFzaCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE5vcm1hbCBzY3JvbGwgbG9naWNcbiAgICByYWYuY2FuY2VsKHNjcm9sbFJlZi5jdXJyZW50KTtcbiAgICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICAgIHN5bmNTY3JvbGxUb3AoYXJnKTtcbiAgICB9IGVsc2UgaWYgKGFyZyAmJiBfdHlwZW9mKGFyZykgPT09ICdvYmplY3QnKSB7XG4gICAgICB2YXIgaW5kZXg7XG4gICAgICB2YXIgYWxpZ24gPSBhcmcuYWxpZ247XG4gICAgICBpZiAoJ2luZGV4JyBpbiBhcmcpIHtcbiAgICAgICAgaW5kZXggPSBhcmcuaW5kZXg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmRleCA9IGRhdGEuZmluZEluZGV4KGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgcmV0dXJuIGdldEtleShpdGVtKSA9PT0gYXJnLmtleTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB2YXIgX2FyZyRvZmZzZXQgPSBhcmcub2Zmc2V0LFxuICAgICAgICBvZmZzZXQgPSBfYXJnJG9mZnNldCA9PT0gdm9pZCAwID8gMCA6IF9hcmckb2Zmc2V0O1xuICAgICAgc2V0U3luY1N0YXRlKHtcbiAgICAgICAgdGltZXM6IDAsXG4gICAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgICAgb2Zmc2V0OiBvZmZzZXQsXG4gICAgICAgIG9yaWdpbkFsaWduOiBhbGlnblxuICAgICAgfSk7XG4gICAgfVxuICB9O1xufSIsICJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgcmFmIGZyb20gXCJyYy11dGlsL2VzL3JhZlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZ2V0UGFnZVhZIH0gZnJvbSBcIi4vaG9va3MvdXNlU2Nyb2xsRHJhZ1wiO1xudmFyIFNjcm9sbEJhciA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgcnRsID0gcHJvcHMucnRsLFxuICAgIHNjcm9sbE9mZnNldCA9IHByb3BzLnNjcm9sbE9mZnNldCxcbiAgICBzY3JvbGxSYW5nZSA9IHByb3BzLnNjcm9sbFJhbmdlLFxuICAgIG9uU3RhcnRNb3ZlID0gcHJvcHMub25TdGFydE1vdmUsXG4gICAgb25TdG9wTW92ZSA9IHByb3BzLm9uU3RvcE1vdmUsXG4gICAgb25TY3JvbGwgPSBwcm9wcy5vblNjcm9sbCxcbiAgICBob3Jpem9udGFsID0gcHJvcHMuaG9yaXpvbnRhbCxcbiAgICBzcGluU2l6ZSA9IHByb3BzLnNwaW5TaXplLFxuICAgIGNvbnRhaW5lclNpemUgPSBwcm9wcy5jb250YWluZXJTaXplLFxuICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgcHJvcHNUaHVtYlN0eWxlID0gcHJvcHMudGh1bWJTdHlsZSxcbiAgICBzaG93U2Nyb2xsQmFyID0gcHJvcHMuc2hvd1Njcm9sbEJhcjtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBkcmFnZ2luZyA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0RHJhZ2dpbmcgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlMyA9IFJlYWN0LnVzZVN0YXRlKG51bGwpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUzLCAyKSxcbiAgICBwYWdlWFkgPSBfUmVhY3QkdXNlU3RhdGU0WzBdLFxuICAgIHNldFBhZ2VYWSA9IF9SZWFjdCR1c2VTdGF0ZTRbMV07XG4gIHZhciBfUmVhY3QkdXNlU3RhdGU1ID0gUmVhY3QudXNlU3RhdGUobnVsbCksXG4gICAgX1JlYWN0JHVzZVN0YXRlNiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTUsIDIpLFxuICAgIHN0YXJ0VG9wID0gX1JlYWN0JHVzZVN0YXRlNlswXSxcbiAgICBzZXRTdGFydFRvcCA9IF9SZWFjdCR1c2VTdGF0ZTZbMV07XG4gIHZhciBpc0xUUiA9ICFydGw7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBSZWZzID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHNjcm9sbGJhclJlZiA9IFJlYWN0LnVzZVJlZigpO1xuICB2YXIgdGh1bWJSZWYgPSBSZWFjdC51c2VSZWYoKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBWaXNpYmxlID09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX1JlYWN0JHVzZVN0YXRlNyA9IFJlYWN0LnVzZVN0YXRlKHNob3dTY3JvbGxCYXIpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTggPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGU3LCAyKSxcbiAgICB2aXNpYmxlID0gX1JlYWN0JHVzZVN0YXRlOFswXSxcbiAgICBzZXRWaXNpYmxlID0gX1JlYWN0JHVzZVN0YXRlOFsxXTtcbiAgdmFyIHZpc2libGVUaW1lb3V0UmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIHZhciBkZWxheUhpZGRlbiA9IGZ1bmN0aW9uIGRlbGF5SGlkZGVuKCkge1xuICAgIGlmIChzaG93U2Nyb2xsQmFyID09PSB0cnVlIHx8IHNob3dTY3JvbGxCYXIgPT09IGZhbHNlKSByZXR1cm47XG4gICAgY2xlYXJUaW1lb3V0KHZpc2libGVUaW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgIHNldFZpc2libGUodHJ1ZSk7XG4gICAgdmlzaWJsZVRpbWVvdXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgc2V0VmlzaWJsZShmYWxzZSk7XG4gICAgfSwgMzAwMCk7XG4gIH07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IFJhbmdlID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGVuYWJsZVNjcm9sbFJhbmdlID0gc2Nyb2xsUmFuZ2UgLSBjb250YWluZXJTaXplIHx8IDA7XG4gIHZhciBlbmFibGVPZmZzZXRSYW5nZSA9IGNvbnRhaW5lclNpemUgLSBzcGluU2l6ZSB8fCAwO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gVG9wID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciB0b3AgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoc2Nyb2xsT2Zmc2V0ID09PSAwIHx8IGVuYWJsZVNjcm9sbFJhbmdlID09PSAwKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgdmFyIHB0ZyA9IHNjcm9sbE9mZnNldCAvIGVuYWJsZVNjcm9sbFJhbmdlO1xuICAgIHJldHVybiBwdGcgKiBlbmFibGVPZmZzZXRSYW5nZTtcbiAgfSwgW3Njcm9sbE9mZnNldCwgZW5hYmxlU2Nyb2xsUmFuZ2UsIGVuYWJsZU9mZnNldFJhbmdlXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PSBDb250YWluZXIgPT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG9uQ29udGFpbmVyTW91c2VEb3duID0gZnVuY3Rpb24gb25Db250YWluZXJNb3VzZURvd24oZSkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBUaHVtYiA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBzdGF0ZVJlZiA9IFJlYWN0LnVzZVJlZih7XG4gICAgdG9wOiB0b3AsXG4gICAgZHJhZ2dpbmc6IGRyYWdnaW5nLFxuICAgIHBhZ2VZOiBwYWdlWFksXG4gICAgc3RhcnRUb3A6IHN0YXJ0VG9wXG4gIH0pO1xuICBzdGF0ZVJlZi5jdXJyZW50ID0ge1xuICAgIHRvcDogdG9wLFxuICAgIGRyYWdnaW5nOiBkcmFnZ2luZyxcbiAgICBwYWdlWTogcGFnZVhZLFxuICAgIHN0YXJ0VG9wOiBzdGFydFRvcFxuICB9O1xuICB2YXIgb25UaHVtYk1vdXNlRG93biA9IGZ1bmN0aW9uIG9uVGh1bWJNb3VzZURvd24oZSkge1xuICAgIHNldERyYWdnaW5nKHRydWUpO1xuICAgIHNldFBhZ2VYWShnZXRQYWdlWFkoZSwgaG9yaXpvbnRhbCkpO1xuICAgIHNldFN0YXJ0VG9wKHN0YXRlUmVmLmN1cnJlbnQudG9wKTtcbiAgICBvblN0YXJ0TW92ZSgpO1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBFZmZlY3QgPT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLy8gUmVhY3QgbWFrZSBldmVudCBhcyBwYXNzaXZlLCBidXQgd2UgbmVlZCB0byBwcmV2ZW50RGVmYXVsdFxuICAvLyBBZGQgZXZlbnQgb24gZG9tIGRpcmVjdGx5IGluc3RlYWQuXG4gIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy85ODA5XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG9uU2Nyb2xsYmFyVG91Y2hTdGFydCA9IGZ1bmN0aW9uIG9uU2Nyb2xsYmFyVG91Y2hTdGFydChlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfTtcbiAgICB2YXIgc2Nyb2xsYmFyRWxlID0gc2Nyb2xsYmFyUmVmLmN1cnJlbnQ7XG4gICAgdmFyIHRodW1iRWxlID0gdGh1bWJSZWYuY3VycmVudDtcbiAgICBzY3JvbGxiYXJFbGUuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIG9uU2Nyb2xsYmFyVG91Y2hTdGFydCwge1xuICAgICAgcGFzc2l2ZTogZmFsc2VcbiAgICB9KTtcbiAgICB0aHVtYkVsZS5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0Jywgb25UaHVtYk1vdXNlRG93biwge1xuICAgICAgcGFzc2l2ZTogZmFsc2VcbiAgICB9KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgc2Nyb2xsYmFyRWxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBvblNjcm9sbGJhclRvdWNoU3RhcnQpO1xuICAgICAgdGh1bWJFbGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIG9uVGh1bWJNb3VzZURvd24pO1xuICAgIH07XG4gIH0sIFtdKTtcblxuICAvLyBQYXNzIHRvIGVmZmVjdFxuICB2YXIgZW5hYmxlU2Nyb2xsUmFuZ2VSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgZW5hYmxlU2Nyb2xsUmFuZ2VSZWYuY3VycmVudCA9IGVuYWJsZVNjcm9sbFJhbmdlO1xuICB2YXIgZW5hYmxlT2Zmc2V0UmFuZ2VSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgZW5hYmxlT2Zmc2V0UmFuZ2VSZWYuY3VycmVudCA9IGVuYWJsZU9mZnNldFJhbmdlO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChkcmFnZ2luZykge1xuICAgICAgdmFyIG1vdmVSYWZJZDtcbiAgICAgIHZhciBvbk1vdXNlTW92ZSA9IGZ1bmN0aW9uIG9uTW91c2VNb3ZlKGUpIHtcbiAgICAgICAgdmFyIF9zdGF0ZVJlZiRjdXJyZW50ID0gc3RhdGVSZWYuY3VycmVudCxcbiAgICAgICAgICBzdGF0ZURyYWdnaW5nID0gX3N0YXRlUmVmJGN1cnJlbnQuZHJhZ2dpbmcsXG4gICAgICAgICAgc3RhdGVQYWdlWSA9IF9zdGF0ZVJlZiRjdXJyZW50LnBhZ2VZLFxuICAgICAgICAgIHN0YXRlU3RhcnRUb3AgPSBfc3RhdGVSZWYkY3VycmVudC5zdGFydFRvcDtcbiAgICAgICAgcmFmLmNhbmNlbChtb3ZlUmFmSWQpO1xuICAgICAgICB2YXIgcmVjdCA9IHNjcm9sbGJhclJlZi5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB2YXIgc2NhbGUgPSBjb250YWluZXJTaXplIC8gKGhvcml6b250YWwgPyByZWN0LndpZHRoIDogcmVjdC5oZWlnaHQpO1xuICAgICAgICBpZiAoc3RhdGVEcmFnZ2luZykge1xuICAgICAgICAgIHZhciBvZmZzZXQgPSAoZ2V0UGFnZVhZKGUsIGhvcml6b250YWwpIC0gc3RhdGVQYWdlWSkgKiBzY2FsZTtcbiAgICAgICAgICB2YXIgbmV3VG9wID0gc3RhdGVTdGFydFRvcDtcbiAgICAgICAgICBpZiAoIWlzTFRSICYmIGhvcml6b250YWwpIHtcbiAgICAgICAgICAgIG5ld1RvcCAtPSBvZmZzZXQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld1RvcCArPSBvZmZzZXQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciB0bXBFbmFibGVTY3JvbGxSYW5nZSA9IGVuYWJsZVNjcm9sbFJhbmdlUmVmLmN1cnJlbnQ7XG4gICAgICAgICAgdmFyIHRtcEVuYWJsZU9mZnNldFJhbmdlID0gZW5hYmxlT2Zmc2V0UmFuZ2VSZWYuY3VycmVudDtcbiAgICAgICAgICB2YXIgcHRnID0gdG1wRW5hYmxlT2Zmc2V0UmFuZ2UgPyBuZXdUb3AgLyB0bXBFbmFibGVPZmZzZXRSYW5nZSA6IDA7XG4gICAgICAgICAgdmFyIG5ld1Njcm9sbFRvcCA9IE1hdGguY2VpbChwdGcgKiB0bXBFbmFibGVTY3JvbGxSYW5nZSk7XG4gICAgICAgICAgbmV3U2Nyb2xsVG9wID0gTWF0aC5tYXgobmV3U2Nyb2xsVG9wLCAwKTtcbiAgICAgICAgICBuZXdTY3JvbGxUb3AgPSBNYXRoLm1pbihuZXdTY3JvbGxUb3AsIHRtcEVuYWJsZVNjcm9sbFJhbmdlKTtcbiAgICAgICAgICBtb3ZlUmFmSWQgPSByYWYoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgb25TY3JvbGwobmV3U2Nyb2xsVG9wLCBob3Jpem9udGFsKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHZhciBvbk1vdXNlVXAgPSBmdW5jdGlvbiBvbk1vdXNlVXAoKSB7XG4gICAgICAgIHNldERyYWdnaW5nKGZhbHNlKTtcbiAgICAgICAgb25TdG9wTW92ZSgpO1xuICAgICAgfTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSwge1xuICAgICAgICBwYXNzaXZlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBvbk1vdXNlTW92ZSwge1xuICAgICAgICBwYXNzaXZlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Nb3VzZVVwLCB7XG4gICAgICAgIHBhc3NpdmU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgb25Nb3VzZVVwLCB7XG4gICAgICAgIHBhc3NpdmU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlKTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIG9uTW91c2VNb3ZlKTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBvbk1vdXNlVXApO1xuICAgICAgICByYWYuY2FuY2VsKG1vdmVSYWZJZCk7XG4gICAgICB9O1xuICAgIH1cbiAgfSwgW2RyYWdnaW5nXSk7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgZGVsYXlIaWRkZW4oKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHZpc2libGVUaW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgIH07XG4gIH0sIFtzY3JvbGxPZmZzZXRdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09IEltcGVyYXRpdmUgPT09PT09PT09PT09PT09PT09PT09PVxuICBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBkZWxheUhpZGRlbjogZGVsYXlIaWRkZW5cbiAgICB9O1xuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgc2Nyb2xsYmFyUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zY3JvbGxiYXJcIik7XG4gIHZhciBjb250YWluZXJTdHlsZSA9IHtcbiAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlID8gbnVsbCA6ICdoaWRkZW4nXG4gIH07XG4gIHZhciB0aHVtYlN0eWxlID0ge1xuICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgIGJhY2tncm91bmQ6ICdyZ2JhKDAsIDAsIDAsIDAuNSknLFxuICAgIGJvcmRlclJhZGl1czogOTksXG4gICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgdXNlclNlbGVjdDogJ25vbmUnXG4gIH07XG4gIGlmIChob3Jpem9udGFsKSB7XG4gICAgLy8gQ29udGFpbmVyXG4gICAgY29udGFpbmVyU3R5bGUuaGVpZ2h0ID0gODtcbiAgICBjb250YWluZXJTdHlsZS5sZWZ0ID0gMDtcbiAgICBjb250YWluZXJTdHlsZS5yaWdodCA9IDA7XG4gICAgY29udGFpbmVyU3R5bGUuYm90dG9tID0gMDtcblxuICAgIC8vIFRodW1iXG4gICAgdGh1bWJTdHlsZS5oZWlnaHQgPSAnMTAwJSc7XG4gICAgdGh1bWJTdHlsZS53aWR0aCA9IHNwaW5TaXplO1xuICAgIGlmIChpc0xUUikge1xuICAgICAgdGh1bWJTdHlsZS5sZWZ0ID0gdG9wO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHVtYlN0eWxlLnJpZ2h0ID0gdG9wO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBDb250YWluZXJcbiAgICBjb250YWluZXJTdHlsZS53aWR0aCA9IDg7XG4gICAgY29udGFpbmVyU3R5bGUudG9wID0gMDtcbiAgICBjb250YWluZXJTdHlsZS5ib3R0b20gPSAwO1xuICAgIGlmIChpc0xUUikge1xuICAgICAgY29udGFpbmVyU3R5bGUucmlnaHQgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250YWluZXJTdHlsZS5sZWZ0ID0gMDtcbiAgICB9XG5cbiAgICAvLyBUaHVtYlxuICAgIHRodW1iU3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgdGh1bWJTdHlsZS5oZWlnaHQgPSBzcGluU2l6ZTtcbiAgICB0aHVtYlN0eWxlLnRvcCA9IHRvcDtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHJlZjogc2Nyb2xsYmFyUmVmLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhzY3JvbGxiYXJQcmVmaXhDbHMsIF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChzY3JvbGxiYXJQcmVmaXhDbHMsIFwiLWhvcml6b250YWxcIiksIGhvcml6b250YWwpLCBcIlwiLmNvbmNhdChzY3JvbGxiYXJQcmVmaXhDbHMsIFwiLXZlcnRpY2FsXCIpLCAhaG9yaXpvbnRhbCksIFwiXCIuY29uY2F0KHNjcm9sbGJhclByZWZpeENscywgXCItdmlzaWJsZVwiKSwgdmlzaWJsZSkpLFxuICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGNvbnRhaW5lclN0eWxlKSwgc3R5bGUpLFxuICAgIG9uTW91c2VEb3duOiBvbkNvbnRhaW5lck1vdXNlRG93bixcbiAgICBvbk1vdXNlTW92ZTogZGVsYXlIaWRkZW5cbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHJlZjogdGh1bWJSZWYsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHNjcm9sbGJhclByZWZpeENscywgXCItdGh1bWJcIiksIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQoc2Nyb2xsYmFyUHJlZml4Q2xzLCBcIi10aHVtYi1tb3ZpbmdcIiksIGRyYWdnaW5nKSksXG4gICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdGh1bWJTdHlsZSksIHByb3BzVGh1bWJTdHlsZSksXG4gICAgb25Nb3VzZURvd246IG9uVGh1bWJNb3VzZURvd25cbiAgfSkpO1xufSk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBTY3JvbGxCYXIuZGlzcGxheU5hbWUgPSAnU2Nyb2xsQmFyJztcbn1cbmV4cG9ydCBkZWZhdWx0IFNjcm9sbEJhcjsiLCAidmFyIE1JTl9TSVpFID0gMjA7XG5leHBvcnQgZnVuY3Rpb24gZ2V0U3BpblNpemUoKSB7XG4gIHZhciBjb250YWluZXJTaXplID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAwO1xuICB2YXIgc2Nyb2xsUmFuZ2UgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDA7XG4gIHZhciBiYXNlU2l6ZSA9IGNvbnRhaW5lclNpemUgLyBzY3JvbGxSYW5nZSAqIGNvbnRhaW5lclNpemU7XG4gIGlmIChpc05hTihiYXNlU2l6ZSkpIHtcbiAgICBiYXNlU2l6ZSA9IDA7XG4gIH1cbiAgYmFzZVNpemUgPSBNYXRoLm1heChiYXNlU2l6ZSwgTUlOX1NJWkUpO1xuICByZXR1cm4gTWF0aC5mbG9vcihiYXNlU2l6ZSk7XG59IiwgImltcG9ydCBMaXN0IGZyb20gXCIuL0xpc3RcIjtcbmV4cG9ydCBkZWZhdWx0IExpc3Q7IiwgIi8qIGlzdGFuYnVsIGlnbm9yZSBmaWxlICovXG5leHBvcnQgZnVuY3Rpb24gaXNQbGF0Zm9ybU1hYygpIHtcbiAgcmV0dXJuIC8obWFjXFxzb3N8bWFjaW50b3NoKS9pLnRlc3QobmF2aWdhdG9yLmFwcFZlcnNpb24pO1xufSIsICJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuLyoqXG4gKiBDYWNoZSBgdmFsdWVgIHJlbGF0ZWQgTGFiZWxlZFZhbHVlICYgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIChsYWJlbGVkVmFsdWVzLCB2YWx1ZU9wdGlvbnMpIHtcbiAgdmFyIGNhY2hlUmVmID0gUmVhY3QudXNlUmVmKHtcbiAgICB2YWx1ZXM6IG5ldyBNYXAoKSxcbiAgICBvcHRpb25zOiBuZXcgTWFwKClcbiAgfSk7XG4gIHZhciBmaWxsZWRMYWJlbGVkVmFsdWVzID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9jYWNoZVJlZiRjdXJyZW50ID0gY2FjaGVSZWYuY3VycmVudCxcbiAgICAgIHByZXZWYWx1ZUNhY2hlID0gX2NhY2hlUmVmJGN1cnJlbnQudmFsdWVzLFxuICAgICAgcHJldk9wdGlvbkNhY2hlID0gX2NhY2hlUmVmJGN1cnJlbnQub3B0aW9ucztcblxuICAgIC8vIEZpbGwgbGFiZWwgYnkgY2FjaGVcbiAgICB2YXIgcGF0Y2hlZFZhbHVlcyA9IGxhYmVsZWRWYWx1ZXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICBpZiAoaXRlbS5sYWJlbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBfcHJldlZhbHVlQ2FjaGUkZ2V0O1xuICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBpdGVtKSwge30sIHtcbiAgICAgICAgICBsYWJlbDogKF9wcmV2VmFsdWVDYWNoZSRnZXQgPSBwcmV2VmFsdWVDYWNoZS5nZXQoaXRlbS52YWx1ZSkpID09PSBudWxsIHx8IF9wcmV2VmFsdWVDYWNoZSRnZXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9wcmV2VmFsdWVDYWNoZSRnZXQubGFiZWxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9KTtcblxuICAgIC8vIFJlZnJlc2ggY2FjaGVcbiAgICB2YXIgdmFsdWVDYWNoZSA9IG5ldyBNYXAoKTtcbiAgICB2YXIgb3B0aW9uQ2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgcGF0Y2hlZFZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICB2YWx1ZUNhY2hlLnNldChpdGVtLnZhbHVlLCBpdGVtKTtcbiAgICAgIG9wdGlvbkNhY2hlLnNldChpdGVtLnZhbHVlLCB2YWx1ZU9wdGlvbnMuZ2V0KGl0ZW0udmFsdWUpIHx8IHByZXZPcHRpb25DYWNoZS5nZXQoaXRlbS52YWx1ZSkpO1xuICAgIH0pO1xuICAgIGNhY2hlUmVmLmN1cnJlbnQudmFsdWVzID0gdmFsdWVDYWNoZTtcbiAgICBjYWNoZVJlZi5jdXJyZW50Lm9wdGlvbnMgPSBvcHRpb25DYWNoZTtcbiAgICByZXR1cm4gcGF0Y2hlZFZhbHVlcztcbiAgfSwgW2xhYmVsZWRWYWx1ZXMsIHZhbHVlT3B0aW9uc10pO1xuICB2YXIgZ2V0T3B0aW9uID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKHZhbCkge1xuICAgIHJldHVybiB2YWx1ZU9wdGlvbnMuZ2V0KHZhbCkgfHwgY2FjaGVSZWYuY3VycmVudC5vcHRpb25zLmdldCh2YWwpO1xuICB9LCBbdmFsdWVPcHRpb25zXSk7XG4gIHJldHVybiBbZmlsbGVkTGFiZWxlZFZhbHVlcywgZ2V0T3B0aW9uXTtcbn0pOyIsICJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHRvQXJyYXkgfSBmcm9tIFwiLi4vdXRpbHMvY29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgaW5qZWN0UHJvcHNXaXRoT3B0aW9uIH0gZnJvbSBcIi4uL3V0aWxzL3ZhbHVlVXRpbFwiO1xuZnVuY3Rpb24gaW5jbHVkZXModGVzdCwgc2VhcmNoKSB7XG4gIHJldHVybiB0b0FycmF5KHRlc3QpLmpvaW4oJycpLnRvVXBwZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoKTtcbn1cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAob3B0aW9ucywgZmllbGROYW1lcywgc2VhcmNoVmFsdWUsIGZpbHRlck9wdGlvbiwgb3B0aW9uRmlsdGVyUHJvcCkge1xuICByZXR1cm4gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFzZWFyY2hWYWx1ZSB8fCBmaWx0ZXJPcHRpb24gPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucztcbiAgICB9XG4gICAgdmFyIGZpZWxkT3B0aW9ucyA9IGZpZWxkTmFtZXMub3B0aW9ucyxcbiAgICAgIGZpZWxkTGFiZWwgPSBmaWVsZE5hbWVzLmxhYmVsLFxuICAgICAgZmllbGRWYWx1ZSA9IGZpZWxkTmFtZXMudmFsdWU7XG4gICAgdmFyIGZpbHRlcmVkT3B0aW9ucyA9IFtdO1xuICAgIHZhciBjdXN0b21pemVGaWx0ZXIgPSB0eXBlb2YgZmlsdGVyT3B0aW9uID09PSAnZnVuY3Rpb24nO1xuICAgIHZhciB1cHBlclNlYXJjaCA9IHNlYXJjaFZhbHVlLnRvVXBwZXJDYXNlKCk7XG4gICAgdmFyIGZpbHRlckZ1bmMgPSBjdXN0b21pemVGaWx0ZXIgPyBmaWx0ZXJPcHRpb24gOiBmdW5jdGlvbiAoXywgb3B0aW9uKSB7XG4gICAgICAvLyBVc2UgcHJvdmlkZWQgYG9wdGlvbkZpbHRlclByb3BgXG4gICAgICBpZiAob3B0aW9uRmlsdGVyUHJvcCkge1xuICAgICAgICByZXR1cm4gaW5jbHVkZXMob3B0aW9uW29wdGlvbkZpbHRlclByb3BdLCB1cHBlclNlYXJjaCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEF1dG8gc2VsZWN0IGBsYWJlbGAgb3IgYHZhbHVlYCBieSBvcHRpb24gdHlwZVxuICAgICAgaWYgKG9wdGlvbltmaWVsZE9wdGlvbnNdKSB7XG4gICAgICAgIC8vIGhhY2sgYGZpZWxkTGFiZWxgIHNpbmNlIGBPcHRpb25Hcm91cGAgY2hpbGRyZW4gaXMgbm90IGBsYWJlbGBcbiAgICAgICAgcmV0dXJuIGluY2x1ZGVzKG9wdGlvbltmaWVsZExhYmVsICE9PSAnY2hpbGRyZW4nID8gZmllbGRMYWJlbCA6ICdsYWJlbCddLCB1cHBlclNlYXJjaCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaW5jbHVkZXMob3B0aW9uW2ZpZWxkVmFsdWVdLCB1cHBlclNlYXJjaCk7XG4gICAgfTtcbiAgICB2YXIgd3JhcE9wdGlvbiA9IGN1c3RvbWl6ZUZpbHRlciA/IGZ1bmN0aW9uIChvcHQpIHtcbiAgICAgIHJldHVybiBpbmplY3RQcm9wc1dpdGhPcHRpb24ob3B0KTtcbiAgICB9IDogZnVuY3Rpb24gKG9wdCkge1xuICAgICAgcmV0dXJuIG9wdDtcbiAgICB9O1xuICAgIG9wdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgLy8gR3JvdXAgc2hvdWxkIGNoZWNrIGNoaWxkIG9wdGlvbnNcbiAgICAgIGlmIChpdGVtW2ZpZWxkT3B0aW9uc10pIHtcbiAgICAgICAgLy8gQ2hlY2sgZ3JvdXAgZmlyc3RcbiAgICAgICAgdmFyIG1hdGNoR3JvdXAgPSBmaWx0ZXJGdW5jKHNlYXJjaFZhbHVlLCB3cmFwT3B0aW9uKGl0ZW0pKTtcbiAgICAgICAgaWYgKG1hdGNoR3JvdXApIHtcbiAgICAgICAgICBmaWx0ZXJlZE9wdGlvbnMucHVzaChpdGVtKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBDaGVjayBvcHRpb25cbiAgICAgICAgICB2YXIgc3ViT3B0aW9ucyA9IGl0ZW1bZmllbGRPcHRpb25zXS5maWx0ZXIoZnVuY3Rpb24gKHN1Ykl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiBmaWx0ZXJGdW5jKHNlYXJjaFZhbHVlLCB3cmFwT3B0aW9uKHN1Ykl0ZW0pKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoc3ViT3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGZpbHRlcmVkT3B0aW9ucy5wdXNoKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgaXRlbSksIHt9LCBfZGVmaW5lUHJvcGVydHkoe30sIGZpZWxkT3B0aW9ucywgc3ViT3B0aW9ucykpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGZpbHRlckZ1bmMoc2VhcmNoVmFsdWUsIHdyYXBPcHRpb24oaXRlbSkpKSB7XG4gICAgICAgIGZpbHRlcmVkT3B0aW9ucy5wdXNoKGl0ZW0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmaWx0ZXJlZE9wdGlvbnM7XG4gIH0sIFtvcHRpb25zLCBmaWx0ZXJPcHRpb24sIG9wdGlvbkZpbHRlclByb3AsIHNlYXJjaFZhbHVlLCBmaWVsZE5hbWVzXSk7XG59KTsiLCAiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2FuVXNlRG9tIGZyb20gXCJyYy11dGlsL2VzL0RvbS9jYW5Vc2VEb21cIjtcbnZhciB1dWlkID0gMDtcblxuLyoqIElzIGNsaWVudCBzaWRlIGFuZCBub3QganNkb20gKi9cbmV4cG9ydCB2YXIgaXNCcm93c2VyQ2xpZW50ID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICd0ZXN0JyAmJiBjYW5Vc2VEb20oKTtcblxuLyoqIEdldCB1bmlxdWUgaWQgZm9yIGFjY2Vzc2liaWxpdHkgdXNhZ2UgKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRVVUlEKCkge1xuICB2YXIgcmV0SWQ7XG5cbiAgLy8gVGVzdCBuZXZlciByZWFjaFxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKGlzQnJvd3NlckNsaWVudCkge1xuICAgIHJldElkID0gdXVpZDtcbiAgICB1dWlkICs9IDE7XG4gIH0gZWxzZSB7XG4gICAgcmV0SWQgPSAnVEVTVF9PUl9TU1InO1xuICB9XG4gIHJldHVybiByZXRJZDtcbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUlkKGlkKSB7XG4gIC8vIElubmVyIGlkIGZvciBhY2Nlc3NpYmlsaXR5IHVzYWdlLiBPbmx5IHdvcmsgaW4gY2xpZW50IHNpZGVcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKCksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgaW5uZXJJZCA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0SW5uZXJJZCA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgc2V0SW5uZXJJZChcInJjX3NlbGVjdF9cIi5jb25jYXQoZ2V0VVVJRCgpKSk7XG4gIH0sIFtdKTtcbiAgcmV0dXJuIGlkIHx8IGlubmVySWQ7XG59IiwgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNvbnZlcnRDaGlsZHJlblRvRGF0YSB9IGZyb20gXCIuLi91dGlscy9sZWdhY3lVdGlsXCI7XG5cbi8qKlxuICogUGFyc2UgYGNoaWxkcmVuYCB0byBgb3B0aW9uc2AgaWYgYG9wdGlvbnNgIGlzIG5vdCBwcm92aWRlZC5cbiAqIFRoZW4gZmxhdHRlbiB0aGUgYG9wdGlvbnNgLlxuICovXG52YXIgdXNlT3B0aW9ucyA9IGZ1bmN0aW9uIHVzZU9wdGlvbnMob3B0aW9ucywgY2hpbGRyZW4sIGZpZWxkTmFtZXMsIG9wdGlvbkZpbHRlclByb3AsIG9wdGlvbkxhYmVsUHJvcCkge1xuICByZXR1cm4gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG1lcmdlZE9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHZhciBjaGlsZHJlbkFzRGF0YSA9ICFvcHRpb25zO1xuICAgIGlmIChjaGlsZHJlbkFzRGF0YSkge1xuICAgICAgbWVyZ2VkT3B0aW9ucyA9IGNvbnZlcnRDaGlsZHJlblRvRGF0YShjaGlsZHJlbik7XG4gICAgfVxuICAgIHZhciB2YWx1ZU9wdGlvbnMgPSBuZXcgTWFwKCk7XG4gICAgdmFyIGxhYmVsT3B0aW9ucyA9IG5ldyBNYXAoKTtcbiAgICB2YXIgc2V0TGFiZWxPcHRpb25zID0gZnVuY3Rpb24gc2V0TGFiZWxPcHRpb25zKGxhYmVsT3B0aW9uc01hcCwgb3B0aW9uLCBrZXkpIHtcbiAgICAgIGlmIChrZXkgJiYgdHlwZW9mIGtleSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgbGFiZWxPcHRpb25zTWFwLnNldChvcHRpb25ba2V5XSwgb3B0aW9uKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciBkaWcgPSBmdW5jdGlvbiBkaWcob3B0aW9uTGlzdCkge1xuICAgICAgdmFyIGlzQ2hpbGRyZW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuICAgICAgLy8gZm9yIGxvb3AgdG8gc3BlZWQgdXAgY29sbGVjdGlvbiBzcGVlZFxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcHRpb25MaXN0Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBvcHRpb24gPSBvcHRpb25MaXN0W2ldO1xuICAgICAgICBpZiAoIW9wdGlvbltmaWVsZE5hbWVzLm9wdGlvbnNdIHx8IGlzQ2hpbGRyZW4pIHtcbiAgICAgICAgICB2YWx1ZU9wdGlvbnMuc2V0KG9wdGlvbltmaWVsZE5hbWVzLnZhbHVlXSwgb3B0aW9uKTtcbiAgICAgICAgICBzZXRMYWJlbE9wdGlvbnMobGFiZWxPcHRpb25zLCBvcHRpb24sIGZpZWxkTmFtZXMubGFiZWwpO1xuICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzM1MzA0XG4gICAgICAgICAgc2V0TGFiZWxPcHRpb25zKGxhYmVsT3B0aW9ucywgb3B0aW9uLCBvcHRpb25GaWx0ZXJQcm9wKTtcbiAgICAgICAgICBzZXRMYWJlbE9wdGlvbnMobGFiZWxPcHRpb25zLCBvcHRpb24sIG9wdGlvbkxhYmVsUHJvcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGlnKG9wdGlvbltmaWVsZE5hbWVzLm9wdGlvbnNdLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgZGlnKG1lcmdlZE9wdGlvbnMpO1xuICAgIHJldHVybiB7XG4gICAgICBvcHRpb25zOiBtZXJnZWRPcHRpb25zLFxuICAgICAgdmFsdWVPcHRpb25zOiB2YWx1ZU9wdGlvbnMsXG4gICAgICBsYWJlbE9wdGlvbnM6IGxhYmVsT3B0aW9uc1xuICAgIH07XG4gIH0sIFtvcHRpb25zLCBjaGlsZHJlbiwgZmllbGROYW1lcywgb3B0aW9uRmlsdGVyUHJvcCwgb3B0aW9uTGFiZWxQcm9wXSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgdXNlT3B0aW9uczsiLCAiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiY2hpbGRyZW5cIiwgXCJ2YWx1ZVwiXSxcbiAgX2V4Y2x1ZGVkMiA9IFtcImNoaWxkcmVuXCJdO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHRvQXJyYXkgZnJvbSBcInJjLXV0aWwvZXMvQ2hpbGRyZW4vdG9BcnJheVwiO1xuZnVuY3Rpb24gY29udmVydE5vZGVUb09wdGlvbihub2RlKSB7XG4gIHZhciBfcmVmID0gbm9kZSxcbiAgICBrZXkgPSBfcmVmLmtleSxcbiAgICBfcmVmJHByb3BzID0gX3JlZi5wcm9wcyxcbiAgICBjaGlsZHJlbiA9IF9yZWYkcHJvcHMuY2hpbGRyZW4sXG4gICAgdmFsdWUgPSBfcmVmJHByb3BzLnZhbHVlLFxuICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmJHByb3BzLCBfZXhjbHVkZWQpO1xuICByZXR1cm4gX29iamVjdFNwcmVhZCh7XG4gICAga2V5OiBrZXksXG4gICAgdmFsdWU6IHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IGtleSxcbiAgICBjaGlsZHJlbjogY2hpbGRyZW5cbiAgfSwgcmVzdFByb3BzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0Q2hpbGRyZW5Ub0RhdGEobm9kZXMpIHtcbiAgdmFyIG9wdGlvbk9ubHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuICByZXR1cm4gdG9BcnJheShub2RlcykubWFwKGZ1bmN0aW9uIChub2RlLCBpbmRleCkge1xuICAgIGlmICghIC8qI19fUFVSRV9fKi9SZWFjdC5pc1ZhbGlkRWxlbWVudChub2RlKSB8fCAhbm9kZS50eXBlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIF9yZWYyID0gbm9kZSxcbiAgICAgIGlzU2VsZWN0T3B0R3JvdXAgPSBfcmVmMi50eXBlLmlzU2VsZWN0T3B0R3JvdXAsXG4gICAgICBrZXkgPSBfcmVmMi5rZXksXG4gICAgICBfcmVmMiRwcm9wcyA9IF9yZWYyLnByb3BzLFxuICAgICAgY2hpbGRyZW4gPSBfcmVmMiRwcm9wcy5jaGlsZHJlbixcbiAgICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmMiRwcm9wcywgX2V4Y2x1ZGVkMik7XG4gICAgaWYgKG9wdGlvbk9ubHkgfHwgIWlzU2VsZWN0T3B0R3JvdXApIHtcbiAgICAgIHJldHVybiBjb252ZXJ0Tm9kZVRvT3B0aW9uKG5vZGUpO1xuICAgIH1cbiAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHtcbiAgICAgIGtleTogXCJfX1JDX1NFTEVDVF9HUlBfX1wiLmNvbmNhdChrZXkgPT09IG51bGwgPyBpbmRleCA6IGtleSwgXCJfX1wiKSxcbiAgICAgIGxhYmVsOiBrZXlcbiAgICB9LCByZXN0UHJvcHMpLCB7fSwge1xuICAgICAgb3B0aW9uczogY29udmVydENoaWxkcmVuVG9EYXRhKGNoaWxkcmVuKVxuICAgIH0pO1xuICB9KS5maWx0ZXIoZnVuY3Rpb24gKGRhdGEpIHtcbiAgICByZXR1cm4gZGF0YTtcbiAgfSk7XG59IiwgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcblxuLyoqXG4gKiBTYW1lIGFzIGBSZWFjdC51c2VDYWxsYmFja2AgYnV0IGFsd2F5cyByZXR1cm4gYSBtZW1vaXplZCBmdW5jdGlvblxuICogYnV0IHJlZGlyZWN0IHRvIHJlYWwgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVJlZkZ1bmMoY2FsbGJhY2spIHtcbiAgdmFyIGZ1bmNSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgZnVuY1JlZi5jdXJyZW50ID0gY2FsbGJhY2s7XG4gIHZhciBjYWNoZUZuID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmdW5jUmVmLmN1cnJlbnQuYXBwbHkoZnVuY1JlZiwgYXJndW1lbnRzKTtcbiAgfSwgW10pO1xuICByZXR1cm4gY2FjaGVGbjtcbn0iLCAiaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IHRvTm9kZUFycmF5IGZyb20gXCJyYy11dGlsL2VzL0NoaWxkcmVuL3RvQXJyYXlcIjtcbmltcG9ydCB3YXJuaW5nLCB7IG5vdGVPbmNlIH0gZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgaXNNdWx0aXBsZSB9IGZyb20gXCIuLi9CYXNlU2VsZWN0XCI7XG5pbXBvcnQgeyB0b0FycmF5IH0gZnJvbSBcIi4vY29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgY29udmVydENoaWxkcmVuVG9EYXRhIH0gZnJvbSBcIi4vbGVnYWN5VXRpbFwiO1xuZnVuY3Rpb24gd2FybmluZ1Byb3BzKHByb3BzKSB7XG4gIHZhciBtb2RlID0gcHJvcHMubW9kZSxcbiAgICBvcHRpb25zID0gcHJvcHMub3B0aW9ucyxcbiAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgIGJhY2tmaWxsID0gcHJvcHMuYmFja2ZpbGwsXG4gICAgYWxsb3dDbGVhciA9IHByb3BzLmFsbG93Q2xlYXIsXG4gICAgcGxhY2Vob2xkZXIgPSBwcm9wcy5wbGFjZWhvbGRlcixcbiAgICBnZXRJbnB1dEVsZW1lbnQgPSBwcm9wcy5nZXRJbnB1dEVsZW1lbnQsXG4gICAgc2hvd1NlYXJjaCA9IHByb3BzLnNob3dTZWFyY2gsXG4gICAgb25TZWFyY2ggPSBwcm9wcy5vblNlYXJjaCxcbiAgICBkZWZhdWx0T3BlbiA9IHByb3BzLmRlZmF1bHRPcGVuLFxuICAgIGF1dG9Gb2N1cyA9IHByb3BzLmF1dG9Gb2N1cyxcbiAgICBsYWJlbEluVmFsdWUgPSBwcm9wcy5sYWJlbEluVmFsdWUsXG4gICAgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICBpbnB1dFZhbHVlID0gcHJvcHMuaW5wdXRWYWx1ZSxcbiAgICBvcHRpb25MYWJlbFByb3AgPSBwcm9wcy5vcHRpb25MYWJlbFByb3A7XG4gIHZhciBtdWx0aXBsZSA9IGlzTXVsdGlwbGUobW9kZSk7XG4gIHZhciBtZXJnZWRTaG93U2VhcmNoID0gc2hvd1NlYXJjaCAhPT0gdW5kZWZpbmVkID8gc2hvd1NlYXJjaCA6IG11bHRpcGxlIHx8IG1vZGUgPT09ICdjb21ib2JveCc7XG4gIHZhciBtZXJnZWRPcHRpb25zID0gb3B0aW9ucyB8fCBjb252ZXJ0Q2hpbGRyZW5Ub0RhdGEoY2hpbGRyZW4pO1xuXG4gIC8vIGB0YWdzYCBzaG91bGQgbm90IHNldCBvcHRpb24gYXMgZGlzYWJsZWRcbiAgd2FybmluZyhtb2RlICE9PSAndGFncycgfHwgbWVyZ2VkT3B0aW9ucy5ldmVyeShmdW5jdGlvbiAob3B0KSB7XG4gICAgcmV0dXJuICFvcHQuZGlzYWJsZWQ7XG4gIH0pLCAnUGxlYXNlIGF2b2lkIHNldHRpbmcgb3B0aW9uIHRvIGRpc2FibGVkIGluIHRhZ3MgbW9kZSBzaW5jZSB1c2VyIGNhbiBhbHdheXMgdHlwZSB0ZXh0IGFzIHRhZy4nKTtcblxuICAvLyBgY29tYm9ib3hgICYgYHRhZ3NgIHNob3VsZCBvcHRpb24gYmUgYHN0cmluZ2AgdHlwZVxuICBpZiAobW9kZSA9PT0gJ3RhZ3MnIHx8IG1vZGUgPT09ICdjb21ib2JveCcpIHtcbiAgICB2YXIgaGFzTnVtYmVyVmFsdWUgPSBtZXJnZWRPcHRpb25zLnNvbWUoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIGlmIChpdGVtLm9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0ub3B0aW9ucy5zb21lKGZ1bmN0aW9uIChvcHQpIHtcbiAgICAgICAgICByZXR1cm4gdHlwZW9mICgndmFsdWUnIGluIG9wdCA/IG9wdC52YWx1ZSA6IG9wdC5rZXkpID09PSAnbnVtYmVyJztcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHlwZW9mICgndmFsdWUnIGluIGl0ZW0gPyBpdGVtLnZhbHVlIDogaXRlbS5rZXkpID09PSAnbnVtYmVyJztcbiAgICB9KTtcbiAgICB3YXJuaW5nKCFoYXNOdW1iZXJWYWx1ZSwgJ2B2YWx1ZWAgb2YgT3B0aW9uIHNob3VsZCBub3QgdXNlIG51bWJlciB0eXBlIHdoZW4gYG1vZGVgIGlzIGB0YWdzYCBvciBgY29tYm9ib3hgLicpO1xuICB9XG5cbiAgLy8gYGNvbWJvYm94YCBzaG91bGQgbm90IHVzZSBgb3B0aW9uTGFiZWxQcm9wYFxuICB3YXJuaW5nKG1vZGUgIT09ICdjb21ib2JveCcgfHwgIW9wdGlvbkxhYmVsUHJvcCwgJ2Bjb21ib2JveGAgbW9kZSBub3Qgc3VwcG9ydCBgb3B0aW9uTGFiZWxQcm9wYC4gUGxlYXNlIHNldCBgdmFsdWVgIG9uIE9wdGlvbiBkaXJlY3RseS4nKTtcblxuICAvLyBPbmx5IGBjb21ib2JveGAgc3VwcG9ydCBgYmFja2ZpbGxgXG4gIHdhcm5pbmcobW9kZSA9PT0gJ2NvbWJvYm94JyB8fCAhYmFja2ZpbGwsICdgYmFja2ZpbGxgIG9ubHkgd29ya3Mgd2l0aCBgY29tYm9ib3hgIG1vZGUuJyk7XG5cbiAgLy8gT25seSBgY29tYm9ib3hgIHN1cHBvcnQgYGdldElucHV0RWxlbWVudGBcbiAgd2FybmluZyhtb2RlID09PSAnY29tYm9ib3gnIHx8ICFnZXRJbnB1dEVsZW1lbnQsICdgZ2V0SW5wdXRFbGVtZW50YCBvbmx5IHdvcmsgd2l0aCBgY29tYm9ib3hgIG1vZGUuJyk7XG5cbiAgLy8gQ3VzdG9taXplIGBnZXRJbnB1dEVsZW1lbnRgIHNob3VsZCBub3QgdXNlIGBhbGxvd0NsZWFyYCAmIGBwbGFjZWhvbGRlcmBcbiAgbm90ZU9uY2UobW9kZSAhPT0gJ2NvbWJvYm94JyB8fCAhZ2V0SW5wdXRFbGVtZW50IHx8ICFhbGxvd0NsZWFyIHx8ICFwbGFjZWhvbGRlciwgJ0N1c3RvbWl6ZSBgZ2V0SW5wdXRFbGVtZW50YCBzaG91bGQgY3VzdG9taXplIGNsZWFyIGFuZCBwbGFjZWhvbGRlciBsb2dpYyBpbnN0ZWFkIG9mIGNvbmZpZ3VyaW5nIGBhbGxvd0NsZWFyYCBhbmQgYHBsYWNlaG9sZGVyYC4nKTtcblxuICAvLyBgb25TZWFyY2hgIHNob3VsZCB1c2UgaW4gYGNvbWJvYm94YCBvciBgc2hvd1NlYXJjaGBcbiAgaWYgKG9uU2VhcmNoICYmICFtZXJnZWRTaG93U2VhcmNoICYmIG1vZGUgIT09ICdjb21ib2JveCcgJiYgbW9kZSAhPT0gJ3RhZ3MnKSB7XG4gICAgd2FybmluZyhmYWxzZSwgJ2BvblNlYXJjaGAgc2hvdWxkIHdvcmsgd2l0aCBgc2hvd1NlYXJjaGAgaW5zdGVhZCBvZiB1c2UgYWxvbmUuJyk7XG4gIH1cbiAgbm90ZU9uY2UoIWRlZmF1bHRPcGVuIHx8IGF1dG9Gb2N1cywgJ2BkZWZhdWx0T3BlbmAgbWFrZXMgU2VsZWN0IG9wZW4gd2l0aG91dCBmb2N1cyB3aGljaCBtZWFucyBpdCB3aWxsIG5vdCBjbG9zZSBieSBjbGljayBvdXRzaWRlLiBZb3UgY2FuIHNldCBgYXV0b0ZvY3VzYCBpZiBuZWVkZWQuJyk7XG4gIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgdmFyIHZhbHVlcyA9IHRvQXJyYXkodmFsdWUpO1xuICAgIHdhcm5pbmcoIWxhYmVsSW5WYWx1ZSB8fCB2YWx1ZXMuZXZlcnkoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgcmV0dXJuIF90eXBlb2YodmFsKSA9PT0gJ29iamVjdCcgJiYgKCdrZXknIGluIHZhbCB8fCAndmFsdWUnIGluIHZhbCk7XG4gICAgfSksICdgdmFsdWVgIHNob3VsZCBpbiBzaGFwZSBvZiBgeyB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyLCBsYWJlbD86IFJlYWN0Tm9kZSB9YCB3aGVuIHlvdSBzZXQgYGxhYmVsSW5WYWx1ZWAgdG8gYHRydWVgJyk7XG4gICAgd2FybmluZyghbXVsdGlwbGUgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSksICdgdmFsdWVgIHNob3VsZCBiZSBhcnJheSB3aGVuIGBtb2RlYCBpcyBgbXVsdGlwbGVgIG9yIGB0YWdzYCcpO1xuICB9XG5cbiAgLy8gU3ludGFjdGljIHN1Z2FyIHNob3VsZCB1c2UgY29ycmVjdCBjaGlsZHJlbiB0eXBlXG4gIGlmIChjaGlsZHJlbikge1xuICAgIHZhciBpbnZhbGlkYXRlQ2hpbGRUeXBlID0gbnVsbDtcbiAgICB0b05vZGVBcnJheShjaGlsZHJlbikuc29tZShmdW5jdGlvbiAobm9kZSkge1xuICAgICAgaWYgKCEgLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KG5vZGUpIHx8ICFub2RlLnR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIF9yZWYgPSBub2RlLFxuICAgICAgICB0eXBlID0gX3JlZi50eXBlO1xuICAgICAgaWYgKHR5cGUuaXNTZWxlY3RPcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUuaXNTZWxlY3RPcHRHcm91cCkge1xuICAgICAgICB2YXIgYWxsQ2hpbGRyZW5WYWxpZCA9IHRvTm9kZUFycmF5KG5vZGUucHJvcHMuY2hpbGRyZW4pLmV2ZXJ5KGZ1bmN0aW9uIChzdWJOb2RlKSB7XG4gICAgICAgICAgaWYgKCEgLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KHN1Yk5vZGUpIHx8ICFub2RlLnR5cGUgfHwgc3ViTm9kZS50eXBlLmlzU2VsZWN0T3B0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaW52YWxpZGF0ZUNoaWxkVHlwZSA9IHN1Yk5vZGUudHlwZTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoYWxsQ2hpbGRyZW5WYWxpZCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGludmFsaWRhdGVDaGlsZFR5cGUgPSB0eXBlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gICAgaWYgKGludmFsaWRhdGVDaGlsZFR5cGUpIHtcbiAgICAgIHdhcm5pbmcoZmFsc2UsIFwiYGNoaWxkcmVuYCBzaG91bGQgYmUgYFNlbGVjdC5PcHRpb25gIG9yIGBTZWxlY3QuT3B0R3JvdXBgIGluc3RlYWQgb2YgYFwiLmNvbmNhdChpbnZhbGlkYXRlQ2hpbGRUeXBlLmRpc3BsYXlOYW1lIHx8IGludmFsaWRhdGVDaGlsZFR5cGUubmFtZSB8fCBpbnZhbGlkYXRlQ2hpbGRUeXBlLCBcImAuXCIpKTtcbiAgICB9XG4gICAgd2FybmluZyhpbnB1dFZhbHVlID09PSB1bmRlZmluZWQsICdgaW5wdXRWYWx1ZWAgaXMgZGVwcmVjYXRlZCwgcGxlYXNlIHVzZSBgc2VhcmNoVmFsdWVgIGluc3RlYWQuJyk7XG4gIH1cbn1cblxuLy8gdmFsdWUgaW4gU2VsZWN0IG9wdGlvbiBzaG91bGQgbm90IGJlIG51bGxcbi8vIG5vdGU6IE9wdEdyb3VwIGhhcyBvcHRpb25zIHRvb1xuZXhwb3J0IGZ1bmN0aW9uIHdhcm5pbmdOdWxsT3B0aW9ucyhvcHRpb25zLCBmaWVsZE5hbWVzKSB7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgdmFyIHJlY3Vyc2l2ZU9wdGlvbnMgPSBmdW5jdGlvbiByZWN1cnNpdmVPcHRpb25zKG9wdGlvbnNMaXN0KSB7XG4gICAgICB2YXIgaW5Hcm91cCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9wdGlvbnNMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBvcHRpb24gPSBvcHRpb25zTGlzdFtpXTtcbiAgICAgICAgaWYgKG9wdGlvbltmaWVsZE5hbWVzID09PSBudWxsIHx8IGZpZWxkTmFtZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZpZWxkTmFtZXMudmFsdWVdID09PSBudWxsKSB7XG4gICAgICAgICAgd2FybmluZyhmYWxzZSwgJ2B2YWx1ZWAgaW4gU2VsZWN0IG9wdGlvbnMgc2hvdWxkIG5vdCBiZSBgbnVsbGAuJyk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpbkdyb3VwICYmIEFycmF5LmlzQXJyYXkob3B0aW9uW2ZpZWxkTmFtZXMgPT09IG51bGwgfHwgZmllbGROYW1lcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogZmllbGROYW1lcy5vcHRpb25zXSkgJiYgcmVjdXJzaXZlT3B0aW9ucyhvcHRpb25bZmllbGROYW1lcyA9PT0gbnVsbCB8fCBmaWVsZE5hbWVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmaWVsZE5hbWVzLm9wdGlvbnNdLCB0cnVlKSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICByZWN1cnNpdmVPcHRpb25zKG9wdGlvbnMpO1xuICB9XG59XG5leHBvcnQgZGVmYXVsdCB3YXJuaW5nUHJvcHM7IiwgImltcG9ydCBTZWxlY3QgZnJvbSBcIi4vU2VsZWN0XCI7XG5pbXBvcnQgT3B0aW9uIGZyb20gXCIuL09wdGlvblwiO1xuaW1wb3J0IE9wdEdyb3VwIGZyb20gXCIuL09wdEdyb3VwXCI7XG5pbXBvcnQgQmFzZVNlbGVjdCBmcm9tIFwiLi9CYXNlU2VsZWN0XCI7XG5pbXBvcnQgdXNlQmFzZVByb3BzIGZyb20gXCIuL2hvb2tzL3VzZUJhc2VQcm9wc1wiO1xuZXhwb3J0IHsgT3B0aW9uLCBPcHRHcm91cCwgQmFzZVNlbGVjdCwgdXNlQmFzZVByb3BzIH07XG5leHBvcnQgZGVmYXVsdCBTZWxlY3Q7IiwgImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuY29uc3QgX0lucHV0U3RhdHVzZXMgPSBbJ3dhcm5pbmcnLCAnZXJyb3InLCAnJ107XG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhdHVzQ2xhc3NOYW1lcyhwcmVmaXhDbHMsIHN0YXR1cywgaGFzRmVlZGJhY2spIHtcbiAgcmV0dXJuIGNsYXNzTmFtZXMoe1xuICAgIFtgJHtwcmVmaXhDbHN9LXN0YXR1cy1zdWNjZXNzYF06IHN0YXR1cyA9PT0gJ3N1Y2Nlc3MnLFxuICAgIFtgJHtwcmVmaXhDbHN9LXN0YXR1cy13YXJuaW5nYF06IHN0YXR1cyA9PT0gJ3dhcm5pbmcnLFxuICAgIFtgJHtwcmVmaXhDbHN9LXN0YXR1cy1lcnJvcmBdOiBzdGF0dXMgPT09ICdlcnJvcicsXG4gICAgW2Ake3ByZWZpeENsc30tc3RhdHVzLXZhbGlkYXRpbmdgXTogc3RhdHVzID09PSAndmFsaWRhdGluZycsXG4gICAgW2Ake3ByZWZpeENsc30taGFzLWZlZWRiYWNrYF06IGhhc0ZlZWRiYWNrXG4gIH0pO1xufVxuZXhwb3J0IGNvbnN0IGdldE1lcmdlZFN0YXR1cyA9IChjb250ZXh0U3RhdHVzLCBjdXN0b21TdGF0dXMpID0+IGN1c3RvbVN0YXR1cyB8fCBjb250ZXh0U3RhdHVzOyIsICJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0IFJlYWN0LCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLic7XG5pbXBvcnQgRW1wdHkgZnJvbSAnLi4vZW1wdHknO1xuY29uc3QgRGVmYXVsdFJlbmRlckVtcHR5ID0gcHJvcHMgPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50TmFtZVxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IHtcbiAgICBnZXRQcmVmaXhDbHNcbiAgfSA9IHVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCk7XG4gIGNvbnN0IHByZWZpeCA9IGdldFByZWZpeENscygnZW1wdHknKTtcbiAgc3dpdGNoIChjb21wb25lbnROYW1lKSB7XG4gICAgY2FzZSAnVGFibGUnOlxuICAgIGNhc2UgJ0xpc3QnOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVtcHR5LCB7XG4gICAgICAgIGltYWdlOiBFbXB0eS5QUkVTRU5URURfSU1BR0VfU0lNUExFXG4gICAgICB9KTtcbiAgICBjYXNlICdTZWxlY3QnOlxuICAgIGNhc2UgJ1RyZWVTZWxlY3QnOlxuICAgIGNhc2UgJ0Nhc2NhZGVyJzpcbiAgICBjYXNlICdUcmFuc2Zlcic6XG4gICAgY2FzZSAnTWVudGlvbnMnOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVtcHR5LCB7XG4gICAgICAgIGltYWdlOiBFbXB0eS5QUkVTRU5URURfSU1BR0VfU0lNUExFLFxuICAgICAgICBjbGFzc05hbWU6IGAke3ByZWZpeH0tc21hbGxgXG4gICAgICB9KTtcbiAgICAvKipcbiAgICAgKiBUaGlzIHR5cGUgb2YgY29tcG9uZW50IHNob3VsZCBzYXRpc2Z5IHRoZSBudWxsaXNoIGNvYWxlc2Npbmcgb3BlcmF0b3IoPz8pIG9uIHRoZSBsZWZ0LWhhbmQgc2lkZS5cbiAgICAgKiB0byBsZXQgdGhlIGNvbXBvbmVudCBpdHNlbGYgaW1wbGVtZW50IHRoZSBsb2dpYy5cbiAgICAgKiBGb3IgZXhhbXBsZSBgVGFibGUuZmlsdGVyYC5cbiAgICAgKi9cbiAgICBjYXNlICdUYWJsZS5maWx0ZXInOlxuICAgICAgLy8gd2h5IGBudWxsYD8gbGVnYWN5IHJlYWN0MTYgbm9kZSB0eXBlIGB1bmRlZmluZWRgIGlzIG5vdCBhbGxvd2VkLlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIFNob3VsZCBuZXZlciBoaXQgaWYgd2UgdGFrZSBhbGwgdGhlIGNvbXBvbmVudCBpbnRvIGNvbnNpZGVyLlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVtcHR5LCBudWxsKTtcbiAgfVxufTtcbmV4cG9ydCBkZWZhdWx0IERlZmF1bHRSZW5kZXJFbXB0eTsiLCAiXCJ1c2UgY2xpZW50XCI7XG5cbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IGRldlVzZVdhcm5pbmcgfSBmcm9tICcuLi9fdXRpbC93YXJuaW5nJztcbmltcG9ydCB7IHVzZUxvY2FsZSB9IGZyb20gJy4uL2xvY2FsZSc7XG5pbXBvcnQgRGVmYXVsdEVtcHR5SW1nIGZyb20gJy4vZW1wdHknO1xuaW1wb3J0IFNpbXBsZUVtcHR5SW1nIGZyb20gJy4vc2ltcGxlJztcbmltcG9ydCB1c2VTdHlsZSBmcm9tICcuL3N0eWxlJztcbmltcG9ydCB7IHVzZUNvbXBvbmVudENvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlci9jb250ZXh0JztcbmNvbnN0IGRlZmF1bHRFbXB0eUltZyA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERlZmF1bHRFbXB0eUltZywgbnVsbCk7XG5jb25zdCBzaW1wbGVFbXB0eUltZyA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNpbXBsZUVtcHR5SW1nLCBudWxsKTtcbmNvbnN0IEVtcHR5ID0gcHJvcHMgPT4ge1xuICBjb25zdCB7XG4gICAgICBjbGFzc05hbWUsXG4gICAgICByb290Q2xhc3NOYW1lLFxuICAgICAgcHJlZml4Q2xzOiBjdXN0b21pemVQcmVmaXhDbHMsXG4gICAgICBpbWFnZSA9IGRlZmF1bHRFbXB0eUltZyxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgY2hpbGRyZW4sXG4gICAgICBpbWFnZVN0eWxlLFxuICAgICAgc3R5bGUsXG4gICAgICBjbGFzc05hbWVzOiBlbXB0eUNsYXNzTmFtZXMsXG4gICAgICBzdHlsZXNcbiAgICB9ID0gcHJvcHMsXG4gICAgcmVzdFByb3BzID0gX19yZXN0KHByb3BzLCBbXCJjbGFzc05hbWVcIiwgXCJyb290Q2xhc3NOYW1lXCIsIFwicHJlZml4Q2xzXCIsIFwiaW1hZ2VcIiwgXCJkZXNjcmlwdGlvblwiLCBcImNoaWxkcmVuXCIsIFwiaW1hZ2VTdHlsZVwiLCBcInN0eWxlXCIsIFwiY2xhc3NOYW1lc1wiLCBcInN0eWxlc1wiXSk7XG4gIGNvbnN0IHtcbiAgICBnZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uLFxuICAgIGNsYXNzTmFtZTogY29udGV4dENsYXNzTmFtZSxcbiAgICBzdHlsZTogY29udGV4dFN0eWxlLFxuICAgIGNsYXNzTmFtZXM6IGNvbnRleHRDbGFzc05hbWVzLFxuICAgIHN0eWxlczogY29udGV4dFN0eWxlc1xuICB9ID0gdXNlQ29tcG9uZW50Q29uZmlnKCdlbXB0eScpO1xuICBjb25zdCBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2VtcHR5JywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgY29uc3QgW3dyYXBDU1NWYXIsIGhhc2hJZCwgY3NzVmFyQ2xzXSA9IHVzZVN0eWxlKHByZWZpeENscyk7XG4gIGNvbnN0IFtsb2NhbGVdID0gdXNlTG9jYWxlKCdFbXB0eScpO1xuICBjb25zdCBkZXMgPSB0eXBlb2YgZGVzY3JpcHRpb24gIT09ICd1bmRlZmluZWQnID8gZGVzY3JpcHRpb24gOiBsb2NhbGUgPT09IG51bGwgfHwgbG9jYWxlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBsb2NhbGUuZGVzY3JpcHRpb247XG4gIGNvbnN0IGFsdCA9IHR5cGVvZiBkZXMgPT09ICdzdHJpbmcnID8gZGVzIDogJ2VtcHR5JztcbiAgbGV0IGltYWdlTm9kZSA9IG51bGw7XG4gIGlmICh0eXBlb2YgaW1hZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgaW1hZ2VOb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIiwge1xuICAgICAgYWx0OiBhbHQsXG4gICAgICBzcmM6IGltYWdlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgaW1hZ2VOb2RlID0gaW1hZ2U7XG4gIH1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gV2FybmluZyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBjb25zdCB3YXJuaW5nID0gZGV2VXNlV2FybmluZygnRW1wdHknKTtcbiAgICBbWydpbWFnZVN0eWxlJywgJ3N0eWxlczogeyBpbWFnZToge30gfSddXS5mb3JFYWNoKF9yZWYgPT4ge1xuICAgICAgbGV0IFtkZXByZWNhdGVkTmFtZSwgbmV3TmFtZV0gPSBfcmVmO1xuICAgICAgd2FybmluZy5kZXByZWNhdGVkKCEoZGVwcmVjYXRlZE5hbWUgaW4gcHJvcHMpLCBkZXByZWNhdGVkTmFtZSwgbmV3TmFtZSk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHdyYXBDU1NWYXIoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgT2JqZWN0LmFzc2lnbih7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGhhc2hJZCwgY3NzVmFyQ2xzLCBwcmVmaXhDbHMsIGNvbnRleHRDbGFzc05hbWUsIHtcbiAgICAgIFtgJHtwcmVmaXhDbHN9LW5vcm1hbGBdOiBpbWFnZSA9PT0gc2ltcGxlRW1wdHlJbWcsXG4gICAgICBbYCR7cHJlZml4Q2xzfS1ydGxgXTogZGlyZWN0aW9uID09PSAncnRsJ1xuICAgIH0sIGNsYXNzTmFtZSwgcm9vdENsYXNzTmFtZSwgY29udGV4dENsYXNzTmFtZXMucm9vdCwgZW1wdHlDbGFzc05hbWVzID09PSBudWxsIHx8IGVtcHR5Q2xhc3NOYW1lcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogZW1wdHlDbGFzc05hbWVzLnJvb3QpLFxuICAgIHN0eWxlOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjb250ZXh0U3R5bGVzLnJvb3QpLCBjb250ZXh0U3R5bGUpLCBzdHlsZXMgPT09IG51bGwgfHwgc3R5bGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdHlsZXMucm9vdCksIHN0eWxlKVxuICB9LCByZXN0UHJvcHMpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGAke3ByZWZpeENsc30taW1hZ2VgLCBjb250ZXh0Q2xhc3NOYW1lcy5pbWFnZSwgZW1wdHlDbGFzc05hbWVzID09PSBudWxsIHx8IGVtcHR5Q2xhc3NOYW1lcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogZW1wdHlDbGFzc05hbWVzLmltYWdlKSxcbiAgICBzdHlsZTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGltYWdlU3R5bGUpLCBjb250ZXh0U3R5bGVzLmltYWdlKSwgc3R5bGVzID09PSBudWxsIHx8IHN0eWxlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3R5bGVzLmltYWdlKVxuICB9LCBpbWFnZU5vZGUpLCBkZXMgJiYgKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoYCR7cHJlZml4Q2xzfS1kZXNjcmlwdGlvbmAsIGNvbnRleHRDbGFzc05hbWVzLmRlc2NyaXB0aW9uLCBlbXB0eUNsYXNzTmFtZXMgPT09IG51bGwgfHwgZW1wdHlDbGFzc05hbWVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbXB0eUNsYXNzTmFtZXMuZGVzY3JpcHRpb24pLFxuICAgIHN0eWxlOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGNvbnRleHRTdHlsZXMuZGVzY3JpcHRpb24pLCBzdHlsZXMgPT09IG51bGwgfHwgc3R5bGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdHlsZXMuZGVzY3JpcHRpb24pXG4gIH0sIGRlcykpLCBjaGlsZHJlbiAmJiAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhgJHtwcmVmaXhDbHN9LWZvb3RlcmAsIGNvbnRleHRDbGFzc05hbWVzLmZvb3RlciwgZW1wdHlDbGFzc05hbWVzID09PSBudWxsIHx8IGVtcHR5Q2xhc3NOYW1lcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogZW1wdHlDbGFzc05hbWVzLmZvb3RlciksXG4gICAgc3R5bGU6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY29udGV4dFN0eWxlcy5mb290ZXIpLCBzdHlsZXMgPT09IG51bGwgfHwgc3R5bGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdHlsZXMuZm9vdGVyKVxuICB9LCBjaGlsZHJlbikpKSk7XG59O1xuRW1wdHkuUFJFU0VOVEVEX0lNQUdFX0RFRkFVTFQgPSBkZWZhdWx0RW1wdHlJbWc7XG5FbXB0eS5QUkVTRU5URURfSU1BR0VfU0lNUExFID0gc2ltcGxlRW1wdHlJbWc7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBFbXB0eS5kaXNwbGF5TmFtZSA9ICdFbXB0eSc7XG59XG5leHBvcnQgZGVmYXVsdCBFbXB0eTsiLCAiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEZhc3RDb2xvciB9IGZyb20gJ0BhbnQtZGVzaWduL2Zhc3QtY29sb3InO1xuaW1wb3J0IHsgdXNlTG9jYWxlIH0gZnJvbSAnLi4vbG9jYWxlJztcbmltcG9ydCB7IHVzZVRva2VuIH0gZnJvbSAnLi4vdGhlbWUvaW50ZXJuYWwnO1xuY29uc3QgRW1wdHkgPSAoKSA9PiB7XG4gIGNvbnN0IFssIHRva2VuXSA9IHVzZVRva2VuKCk7XG4gIGNvbnN0IFtsb2NhbGVdID0gdXNlTG9jYWxlKCdFbXB0eScpO1xuICBjb25zdCBiZ0NvbG9yID0gbmV3IEZhc3RDb2xvcih0b2tlbi5jb2xvckJnQmFzZSk7XG4gIC8vIERhcmsgVGhlbWUgbmVlZCBtb3JlIGRhcmsgb2YgdGhpc1xuICBjb25zdCB0aGVtZVN0eWxlID0gYmdDb2xvci50b0hzbCgpLmwgPCAwLjUgPyB7XG4gICAgb3BhY2l0eTogMC42NVxuICB9IDoge307XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XG4gICAgc3R5bGU6IHRoZW1lU3R5bGUsXG4gICAgd2lkdGg6IFwiMTg0XCIsXG4gICAgaGVpZ2h0OiBcIjE1MlwiLFxuICAgIHZpZXdCb3g6IFwiMCAwIDE4NCAxNTJcIixcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwidGl0bGVcIiwgbnVsbCwgKGxvY2FsZSA9PT0gbnVsbCB8fCBsb2NhbGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxvY2FsZS5kZXNjcmlwdGlvbikgfHwgJ0VtcHR5JyksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZ1wiLCB7XG4gICAgZmlsbDogXCJub25lXCIsXG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZ1wiLCB7XG4gICAgdHJhbnNmb3JtOiBcInRyYW5zbGF0ZSgyNCAzMS42NylcIlxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImVsbGlwc2VcIiwge1xuICAgIGZpbGxPcGFjaXR5OiBcIi44XCIsXG4gICAgZmlsbDogXCIjRjVGNUY3XCIsXG4gICAgY3g6IFwiNjcuNzk3XCIsXG4gICAgY3k6IFwiMTA2Ljg5XCIsXG4gICAgcng6IFwiNjcuNzk3XCIsXG4gICAgcnk6IFwiMTIuNjY4XCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTIyLjAzNCA2OS42NzRMOTguMTA5IDQwLjIyOWMtMS4xNDgtMS4zODYtMi44MjYtMi4yMjUtNC41OTMtMi4yMjVoLTUxLjQ0Yy0xLjc2NiAwLTMuNDQ0LjgzOS00LjU5MiAyLjIyNUwxMy41NiA2OS42NzR2MTUuMzgzaDEwOC40NzVWNjkuNjc0elwiLFxuICAgIGZpbGw6IFwiI0FFQjhDMlwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTEwMS41MzcgODYuMjE0TDgwLjYzIDYxLjEwMmMtMS4wMDEtMS4yMDctMi41MDctMS44NjctNC4wNDgtMS44NjdIMzEuNzI0Yy0xLjU0IDAtMy4wNDcuNjYtNC4wNDggMS44NjdMNi43NjkgODYuMjE0djEzLjc5Mmg5NC43NjhWODYuMjE0elwiLFxuICAgIGZpbGw6IFwidXJsKCNsaW5lYXJHcmFkaWVudC0xKVwiLFxuICAgIHRyYW5zZm9ybTogXCJ0cmFuc2xhdGUoMTMuNTYpXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMzMuODMgMGg2Ny45MzNhNCA0IDAgMCAxIDQgNHY5My4zNDRhNCA0IDAgMCAxLTQgNEgzMy44M2E0IDQgMCAwIDEtNC00VjRhNCA0IDAgMCAxIDQtNHpcIixcbiAgICBmaWxsOiBcIiNGNUY1RjdcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk00Mi42NzggOS45NTNoNTAuMjM3YTIgMiAwIDAgMSAyIDJWMzYuOTFhMiAyIDAgMCAxLTIgMkg0Mi42NzhhMiAyIDAgMCAxLTItMlYxMS45NTNhMiAyIDAgMCAxIDItMnpNNDIuOTQgNDkuNzY3aDQ5LjcxM2EyLjI2MiAyLjI2MiAwIDEgMSAwIDQuNTI0SDQyLjk0YTIuMjYyIDIuMjYyIDAgMCAxIDAtNC41MjR6TTQyLjk0IDYxLjUzaDQ5LjcxM2EyLjI2MiAyLjI2MiAwIDEgMSAwIDQuNTI1SDQyLjk0YTIuMjYyIDIuMjYyIDAgMCAxIDAtNC41MjV6TTEyMS44MTMgMTA1LjAzMmMtLjc3NSAzLjA3MS0zLjQ5NyA1LjM2LTYuNzM1IDUuMzZIMjAuNTE1Yy0zLjIzOCAwLTUuOTYtMi4yOS02LjczNC01LjM2YTcuMzA5IDcuMzA5IDAgMCAxLS4yMjItMS43OVY2OS42NzVoMjYuMzE4YzIuOTA3IDAgNS4yNSAyLjQ0OCA1LjI1IDUuNDJ2LjA0YzAgMi45NzEgMi4zNyA1LjM3IDUuMjc3IDUuMzdoMzQuNzg1YzIuOTA3IDAgNS4yNzctMi40MjEgNS4yNzctNS4zOTNWNzUuMWMwLTIuOTcyIDIuMzQzLTUuNDI2IDUuMjUtNS40MjZoMjYuMzE4djMzLjU2OWMwIC42MTctLjA3NyAxLjIxNi0uMjIxIDEuNzg5elwiLFxuICAgIGZpbGw6IFwiI0RDRTBFNlwiXG4gIH0pKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xNDkuMTIxIDMzLjI5MmwtNi44MyAyLjY1YTEgMSAwIDAgMS0xLjMxNy0xLjIzbDEuOTM3LTYuMjA3Yy0yLjU4OS0yLjk0NC00LjEwOS02LjUzNC00LjEwOS0xMC40MDhDMTM4LjgwMiA4LjEwMiAxNDguOTIgMCAxNjEuNDAyIDAgMTczLjg4MSAwIDE4NCA4LjEwMiAxODQgMTguMDk3YzAgOS45OTUtMTAuMTE4IDE4LjA5Ny0yMi41OTkgMTguMDk3LTQuNTI4IDAtOC43NDQtMS4wNjYtMTIuMjgtMi45MDJ6XCIsXG4gICAgZmlsbDogXCIjRENFMEU2XCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZ1wiLCB7XG4gICAgdHJhbnNmb3JtOiBcInRyYW5zbGF0ZSgxNDkuNjUgMTUuMzgzKVwiLFxuICAgIGZpbGw6IFwiI0ZGRlwiXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZWxsaXBzZVwiLCB7XG4gICAgY3g6IFwiMjAuNjU0XCIsXG4gICAgY3k6IFwiMy4xNjdcIixcbiAgICByeDogXCIyLjg0OVwiLFxuICAgIHJ5OiBcIjIuODE1XCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNS42OTggNS42M0gwTDIuODk4LjcwNHpNOS4yNTkuNzA0aDQuOTg1VjUuNjNIOS4yNTl6XCJcbiAgfSkpKSk7XG59O1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgRW1wdHkuZGlzcGxheU5hbWUgPSAnRW1wdHlJbWFnZSc7XG59XG5leHBvcnQgZGVmYXVsdCBFbXB0eTsiLCAiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBGYXN0Q29sb3IgfSBmcm9tICdAYW50LWRlc2lnbi9mYXN0LWNvbG9yJztcbmltcG9ydCB7IHVzZVRva2VuIH0gZnJvbSAnLi4vdGhlbWUvaW50ZXJuYWwnO1xuaW1wb3J0IHsgdXNlTG9jYWxlIH0gZnJvbSAnLi4vbG9jYWxlJztcbmNvbnN0IFNpbXBsZSA9ICgpID0+IHtcbiAgY29uc3QgWywgdG9rZW5dID0gdXNlVG9rZW4oKTtcbiAgY29uc3QgW2xvY2FsZV0gPSB1c2VMb2NhbGUoJ0VtcHR5Jyk7XG4gIGNvbnN0IHtcbiAgICBjb2xvckZpbGwsXG4gICAgY29sb3JGaWxsVGVydGlhcnksXG4gICAgY29sb3JGaWxsUXVhdGVybmFyeSxcbiAgICBjb2xvckJnQ29udGFpbmVyXG4gIH0gPSB0b2tlbjtcbiAgY29uc3Qge1xuICAgIGJvcmRlckNvbG9yLFxuICAgIHNoYWRvd0NvbG9yLFxuICAgIGNvbnRlbnRDb2xvclxuICB9ID0gdXNlTWVtbygoKSA9PiAoe1xuICAgIGJvcmRlckNvbG9yOiBuZXcgRmFzdENvbG9yKGNvbG9yRmlsbCkub25CYWNrZ3JvdW5kKGNvbG9yQmdDb250YWluZXIpLnRvSGV4U3RyaW5nKCksXG4gICAgc2hhZG93Q29sb3I6IG5ldyBGYXN0Q29sb3IoY29sb3JGaWxsVGVydGlhcnkpLm9uQmFja2dyb3VuZChjb2xvckJnQ29udGFpbmVyKS50b0hleFN0cmluZygpLFxuICAgIGNvbnRlbnRDb2xvcjogbmV3IEZhc3RDb2xvcihjb2xvckZpbGxRdWF0ZXJuYXJ5KS5vbkJhY2tncm91bmQoY29sb3JCZ0NvbnRhaW5lcikudG9IZXhTdHJpbmcoKVxuICB9KSwgW2NvbG9yRmlsbCwgY29sb3JGaWxsVGVydGlhcnksIGNvbG9yRmlsbFF1YXRlcm5hcnksIGNvbG9yQmdDb250YWluZXJdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcbiAgICB3aWR0aDogXCI2NFwiLFxuICAgIGhlaWdodDogXCI0MVwiLFxuICAgIHZpZXdCb3g6IFwiMCAwIDY0IDQxXCIsXG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInRpdGxlXCIsIG51bGwsIChsb2NhbGUgPT09IG51bGwgfHwgbG9jYWxlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBsb2NhbGUuZGVzY3JpcHRpb24pIHx8ICdFbXB0eScpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImdcIiwge1xuICAgIHRyYW5zZm9ybTogXCJ0cmFuc2xhdGUoMCAxKVwiLFxuICAgIGZpbGw6IFwibm9uZVwiLFxuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIlxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImVsbGlwc2VcIiwge1xuICAgIGZpbGw6IHNoYWRvd0NvbG9yLFxuICAgIGN4OiBcIjMyXCIsXG4gICAgY3k6IFwiMzNcIixcbiAgICByeDogXCIzMlwiLFxuICAgIHJ5OiBcIjdcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJnXCIsIHtcbiAgICBmaWxsUnVsZTogXCJub256ZXJvXCIsXG4gICAgc3Ryb2tlOiBib3JkZXJDb2xvclxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTU1IDEyLjc2TDQ0Ljg1NCAxLjI1OEM0NC4zNjcuNDc0IDQzLjY1NiAwIDQyLjkwNyAwSDIxLjA5M2MtLjc0OSAwLTEuNDYuNDc0LTEuOTQ3IDEuMjU3TDkgMTIuNzYxVjIyaDQ2di05LjI0elwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTQxLjYxMyAxNS45MzFjMC0xLjYwNS45OTQtMi45MyAyLjIyNy0yLjkzMUg1NXYxOC4xMzdDNTUgMzMuMjYgNTMuNjggMzUgNTIuMDUgMzVoLTQwLjFDMTAuMzIgMzUgOSAzMy4yNTkgOSAzMS4xMzdWMTNoMTEuMTZjMS4yMzMgMCAyLjIyNyAxLjMyMyAyLjIyNyAyLjkyOHYuMDIyYzAgMS42MDUgMS4wMDUgMi45MDEgMi4yMzcgMi45MDFoMTQuNzUyYzEuMjMyIDAgMi4yMzctMS4zMDggMi4yMzctMi45MTN2LS4wMDd6XCIsXG4gICAgZmlsbDogY29udGVudENvbG9yXG4gIH0pKSkpO1xufTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFNpbXBsZS5kaXNwbGF5TmFtZSA9ICdTaW1wbGVJbWFnZSc7XG59XG5leHBvcnQgZGVmYXVsdCBTaW1wbGU7IiwgImltcG9ydCB7IGdlblN0eWxlSG9va3MsIG1lcmdlVG9rZW4gfSBmcm9tICcuLi8uLi90aGVtZS9pbnRlcm5hbCc7XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU2hhcmVkID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuY29uc3QgZ2VuU2hhcmVkRW1wdHlTdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENscyxcbiAgICBtYXJnaW4sXG4gICAgbWFyZ2luWFMsXG4gICAgbWFyZ2luWEwsXG4gICAgZm9udFNpemUsXG4gICAgbGluZUhlaWdodFxuICB9ID0gdG9rZW47XG4gIHJldHVybiB7XG4gICAgW2NvbXBvbmVudENsc106IHtcbiAgICAgIG1hcmdpbklubGluZTogbWFyZ2luWFMsXG4gICAgICBmb250U2l6ZSxcbiAgICAgIGxpbmVIZWlnaHQsXG4gICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgLy8gXHU1MzlGXHU2NzY1ICYtaW1hZ2UgXHU2Q0ExXHU2NzA5XHU3MjM2XHU1QjUwXHU3RUQzXHU2Nzg0XHVGRjBDXHU3M0IwXHU1NzI4XHU0RTNBXHU0RTg2XHU1OTE2XHU1QzQyXHU2MjdGXHU2MkM1XHU2MjExXHU0RUVDXHU3Njg0IGhhc2hJZFx1RkYwQ1x1NjUzOVx1NjIxMFx1NzIzNlx1NUI1MFx1N0VEM1x1Njc4NFxuICAgICAgW2Ake2NvbXBvbmVudENsc30taW1hZ2VgXToge1xuICAgICAgICBoZWlnaHQ6IHRva2VuLmVtcHR5SW1nSGVpZ2h0LFxuICAgICAgICBtYXJnaW5Cb3R0b206IG1hcmdpblhTLFxuICAgICAgICBvcGFjaXR5OiB0b2tlbi5vcGFjaXR5SW1hZ2UsXG4gICAgICAgIGltZzoge1xuICAgICAgICAgIGhlaWdodDogJzEwMCUnXG4gICAgICAgIH0sXG4gICAgICAgIHN2Zzoge1xuICAgICAgICAgIG1heFdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgICAgbWFyZ2luOiAnYXV0bydcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWRlc2NyaXB0aW9uYF06IHtcbiAgICAgICAgY29sb3I6IHRva2VuLmNvbG9yVGV4dERlc2NyaXB0aW9uXG4gICAgICB9LFxuICAgICAgLy8gXHU1MzlGXHU2NzY1ICYtZm9vdGVyIFx1NkNBMVx1NjcwOVx1NzIzNlx1NUI1MFx1N0VEM1x1Njc4NFx1RkYwQ1x1NzNCMFx1NTcyOFx1NEUzQVx1NEU4Nlx1NTkxNlx1NUM0Mlx1NjI3Rlx1NjJDNVx1NjIxMVx1NEVFQ1x1NzY4NCBoYXNoSWRcdUZGMENcdTY1MzlcdTYyMTBcdTcyMzZcdTVCNTBcdTdFRDNcdTY3ODRcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWZvb3RlcmBdOiB7XG4gICAgICAgIG1hcmdpblRvcDogbWFyZ2luXG4gICAgICB9LFxuICAgICAgJyYtbm9ybWFsJzoge1xuICAgICAgICBtYXJnaW5CbG9jazogbWFyZ2luWEwsXG4gICAgICAgIGNvbG9yOiB0b2tlbi5jb2xvclRleHREZXNjcmlwdGlvbixcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30tZGVzY3JpcHRpb25gXToge1xuICAgICAgICAgIGNvbG9yOiB0b2tlbi5jb2xvclRleHREZXNjcmlwdGlvblxuICAgICAgICB9LFxuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1pbWFnZWBdOiB7XG4gICAgICAgICAgaGVpZ2h0OiB0b2tlbi5lbXB0eUltZ0hlaWdodE1EXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAnJi1zbWFsbCc6IHtcbiAgICAgICAgbWFyZ2luQmxvY2s6IG1hcmdpblhTLFxuICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JUZXh0RGVzY3JpcHRpb24sXG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LWltYWdlYF06IHtcbiAgICAgICAgICBoZWlnaHQ6IHRva2VuLmVtcHR5SW1nSGVpZ2h0U01cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRXhwb3J0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuZXhwb3J0IGRlZmF1bHQgZ2VuU3R5bGVIb29rcygnRW1wdHknLCB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHMsXG4gICAgY29udHJvbEhlaWdodExHLFxuICAgIGNhbGNcbiAgfSA9IHRva2VuO1xuICBjb25zdCBlbXB0eVRva2VuID0gbWVyZ2VUb2tlbih0b2tlbiwge1xuICAgIGVtcHR5SW1nQ2xzOiBgJHtjb21wb25lbnRDbHN9LWltZ2AsXG4gICAgZW1wdHlJbWdIZWlnaHQ6IGNhbGMoY29udHJvbEhlaWdodExHKS5tdWwoMi41KS5lcXVhbCgpLFxuICAgIGVtcHR5SW1nSGVpZ2h0TUQ6IGNvbnRyb2xIZWlnaHRMRyxcbiAgICBlbXB0eUltZ0hlaWdodFNNOiBjYWxjKGNvbnRyb2xIZWlnaHRMRykubXVsKDAuODc1KS5lcXVhbCgpXG4gIH0pO1xuICByZXR1cm4gW2dlblNoYXJlZEVtcHR5U3R5bGUoZW1wdHlUb2tlbildO1xufSk7IiwgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFZhcmlhbnRDb250ZXh0IH0gZnJvbSAnLi4vY29udGV4dCc7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0LCBWYXJpYW50cyB9IGZyb20gJy4uLy4uL2NvbmZpZy1wcm92aWRlcic7XG4vKipcbiAqIENvbXBhdGlibGUgZm9yIGxlZ2FjeSBgYm9yZGVyZWRgIHByb3AuXG4gKi9cbmNvbnN0IHVzZVZhcmlhbnQgPSBmdW5jdGlvbiAoY29tcG9uZW50LCB2YXJpYW50KSB7XG4gIGxldCBsZWdhY3lCb3JkZXJlZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkO1xuICB2YXIgX2EsIF9iO1xuICBjb25zdCB7XG4gICAgdmFyaWFudDogY29uZmlnVmFyaWFudCxcbiAgICBbY29tcG9uZW50XTogY29tcG9uZW50Q29uZmlnXG4gIH0gPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpO1xuICBjb25zdCBjdHhWYXJpYW50ID0gUmVhY3QudXNlQ29udGV4dChWYXJpYW50Q29udGV4dCk7XG4gIGNvbnN0IGNvbmZpZ0NvbXBvbmVudFZhcmlhbnQgPSBjb21wb25lbnRDb25maWcgPT09IG51bGwgfHwgY29tcG9uZW50Q29uZmlnID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb21wb25lbnRDb25maWcudmFyaWFudDtcbiAgbGV0IG1lcmdlZFZhcmlhbnQ7XG4gIGlmICh0eXBlb2YgdmFyaWFudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBtZXJnZWRWYXJpYW50ID0gdmFyaWFudDtcbiAgfSBlbHNlIGlmIChsZWdhY3lCb3JkZXJlZCA9PT0gZmFsc2UpIHtcbiAgICBtZXJnZWRWYXJpYW50ID0gJ2JvcmRlcmxlc3MnO1xuICB9IGVsc2Uge1xuICAgIC8vIGZvcm0gdmFyaWFudCA+IGNvbXBvbmVudCBnbG9iYWwgdmFyaWFudCA+IGdsb2JhbCB2YXJpYW50XG4gICAgbWVyZ2VkVmFyaWFudCA9IChfYiA9IChfYSA9IGN0eFZhcmlhbnQgIT09IG51bGwgJiYgY3R4VmFyaWFudCAhPT0gdm9pZCAwID8gY3R4VmFyaWFudCA6IGNvbmZpZ0NvbXBvbmVudFZhcmlhbnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGNvbmZpZ1ZhcmlhbnQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICdvdXRsaW5lZCc7XG4gIH1cbiAgY29uc3QgZW5hYmxlVmFyaWFudENscyA9IFZhcmlhbnRzLmluY2x1ZGVzKG1lcmdlZFZhcmlhbnQpO1xuICByZXR1cm4gW21lcmdlZFZhcmlhbnQsIGVuYWJsZVZhcmlhbnRDbHNdO1xufTtcbmV4cG9ydCBkZWZhdWx0IHVzZVZhcmlhbnQ7IiwgImNvbnN0IGdldEJ1aWx0SW5QbGFjZW1lbnRzID0gcG9wdXBPdmVyZmxvdyA9PiB7XG4gIGNvbnN0IGh0bWxSZWdpb24gPSBwb3B1cE92ZXJmbG93ID09PSAnc2Nyb2xsJyA/ICdzY3JvbGwnIDogJ3Zpc2libGUnO1xuICBjb25zdCBzaGFyZWRDb25maWcgPSB7XG4gICAgb3ZlcmZsb3c6IHtcbiAgICAgIGFkanVzdFg6IHRydWUsXG4gICAgICBhZGp1c3RZOiB0cnVlLFxuICAgICAgc2hpZnRZOiB0cnVlXG4gICAgfSxcbiAgICBodG1sUmVnaW9uLFxuICAgIGR5bmFtaWNJbnNldDogdHJ1ZVxuICB9O1xuICByZXR1cm4ge1xuICAgIGJvdHRvbUxlZnQ6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc2hhcmVkQ29uZmlnKSwge1xuICAgICAgcG9pbnRzOiBbJ3RsJywgJ2JsJ10sXG4gICAgICBvZmZzZXQ6IFswLCA0XVxuICAgIH0pLFxuICAgIGJvdHRvbVJpZ2h0OiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHNoYXJlZENvbmZpZyksIHtcbiAgICAgIHBvaW50czogWyd0cicsICdiciddLFxuICAgICAgb2Zmc2V0OiBbMCwgNF1cbiAgICB9KSxcbiAgICB0b3BMZWZ0OiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHNoYXJlZENvbmZpZyksIHtcbiAgICAgIHBvaW50czogWydibCcsICd0bCddLFxuICAgICAgb2Zmc2V0OiBbMCwgLTRdXG4gICAgfSksXG4gICAgdG9wUmlnaHQ6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc2hhcmVkQ29uZmlnKSwge1xuICAgICAgcG9pbnRzOiBbJ2JyJywgJ3RyJ10sXG4gICAgICBvZmZzZXQ6IFswLCAtNF1cbiAgICB9KVxuICB9O1xufTtcbmZ1bmN0aW9uIG1lcmdlZEJ1aWx0aW5QbGFjZW1lbnRzKGJ1aWxkSW5QbGFjZW1lbnRzLCBwb3B1cE92ZXJmbG93KSB7XG4gIHJldHVybiBidWlsZEluUGxhY2VtZW50cyB8fCBnZXRCdWlsdEluUGxhY2VtZW50cyhwb3B1cE92ZXJmbG93KTtcbn1cbmV4cG9ydCBkZWZhdWx0IG1lcmdlZEJ1aWx0aW5QbGFjZW1lbnRzOyIsICJpbXBvcnQgeyByZXNldENvbXBvbmVudCwgdGV4dEVsbGlwc2lzIH0gZnJvbSAnLi4vLi4vc3R5bGUnO1xuaW1wb3J0IHsgaW5pdE1vdmVNb3Rpb24sIGluaXRTbGlkZU1vdGlvbiwgc2xpZGVEb3duSW4sIHNsaWRlRG93bk91dCwgc2xpZGVVcEluLCBzbGlkZVVwT3V0IH0gZnJvbSAnLi4vLi4vc3R5bGUvbW90aW9uJztcbmNvbnN0IGdlbkl0ZW1TdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIG9wdGlvbkhlaWdodCxcbiAgICBvcHRpb25Gb250U2l6ZSxcbiAgICBvcHRpb25MaW5lSGVpZ2h0LFxuICAgIG9wdGlvblBhZGRpbmdcbiAgfSA9IHRva2VuO1xuICByZXR1cm4ge1xuICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgIGRpc3BsYXk6ICdibG9jaycsXG4gICAgbWluSGVpZ2h0OiBvcHRpb25IZWlnaHQsXG4gICAgcGFkZGluZzogb3B0aW9uUGFkZGluZyxcbiAgICBjb2xvcjogdG9rZW4uY29sb3JUZXh0LFxuICAgIGZvbnRXZWlnaHQ6ICdub3JtYWwnLFxuICAgIGZvbnRTaXplOiBvcHRpb25Gb250U2l6ZSxcbiAgICBsaW5lSGVpZ2h0OiBvcHRpb25MaW5lSGVpZ2h0LFxuICAgIGJveFNpemluZzogJ2JvcmRlci1ib3gnXG4gIH07XG59O1xuY29uc3QgZ2VuU2luZ2xlU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBhbnRDbHMsXG4gICAgY29tcG9uZW50Q2xzXG4gIH0gPSB0b2tlbjtcbiAgY29uc3Qgc2VsZWN0SXRlbUNscyA9IGAke2NvbXBvbmVudENsc30taXRlbWA7XG4gIGNvbnN0IHNsaWRlVXBFbnRlckFjdGl2ZSA9IGAmJHthbnRDbHN9LXNsaWRlLXVwLWVudGVyJHthbnRDbHN9LXNsaWRlLXVwLWVudGVyLWFjdGl2ZWA7XG4gIGNvbnN0IHNsaWRlVXBBcHBlYXJBY3RpdmUgPSBgJiR7YW50Q2xzfS1zbGlkZS11cC1hcHBlYXIke2FudENsc30tc2xpZGUtdXAtYXBwZWFyLWFjdGl2ZWA7XG4gIGNvbnN0IHNsaWRlVXBMZWF2ZUFjdGl2ZSA9IGAmJHthbnRDbHN9LXNsaWRlLXVwLWxlYXZlJHthbnRDbHN9LXNsaWRlLXVwLWxlYXZlLWFjdGl2ZWA7XG4gIGNvbnN0IGRyb3Bkb3duUGxhY2VtZW50Q2xzID0gYCR7Y29tcG9uZW50Q2xzfS1kcm9wZG93bi1wbGFjZW1lbnQtYDtcbiAgY29uc3Qgc2VsZWN0ZWRJdGVtQ2xzID0gYCR7c2VsZWN0SXRlbUNsc30tb3B0aW9uLXNlbGVjdGVkYDtcbiAgcmV0dXJuIFt7XG4gICAgW2Ake2NvbXBvbmVudENsc30tZHJvcGRvd25gXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXNldENvbXBvbmVudCh0b2tlbikpLCB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIHRvcDogLTk5OTksXG4gICAgICB6SW5kZXg6IHRva2VuLnpJbmRleFBvcHVwLFxuICAgICAgYm94U2l6aW5nOiAnYm9yZGVyLWJveCcsXG4gICAgICBwYWRkaW5nOiB0b2tlbi5wYWRkaW5nWFhTLFxuICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgZm9udFNpemU6IHRva2VuLmZvbnRTaXplLFxuICAgICAgLy8gRml4IHNlbGVjdCByZW5kZXIgbGFnIG9mIGxvbmcgdGV4dCBpbiBjaHJvbWVcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzExNDU2XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8xMTg0M1xuICAgICAgZm9udFZhcmlhbnQ6ICdpbml0aWFsJyxcbiAgICAgIGJhY2tncm91bmRDb2xvcjogdG9rZW4uY29sb3JCZ0VsZXZhdGVkLFxuICAgICAgYm9yZGVyUmFkaXVzOiB0b2tlbi5ib3JkZXJSYWRpdXNMRyxcbiAgICAgIG91dGxpbmU6ICdub25lJyxcbiAgICAgIGJveFNoYWRvdzogdG9rZW4uYm94U2hhZG93U2Vjb25kYXJ5LFxuICAgICAgW2BcbiAgICAgICAgICAke3NsaWRlVXBFbnRlckFjdGl2ZX0ke2Ryb3Bkb3duUGxhY2VtZW50Q2xzfWJvdHRvbUxlZnQsXG4gICAgICAgICAgJHtzbGlkZVVwQXBwZWFyQWN0aXZlfSR7ZHJvcGRvd25QbGFjZW1lbnRDbHN9Ym90dG9tTGVmdFxuICAgICAgICBgXToge1xuICAgICAgICBhbmltYXRpb25OYW1lOiBzbGlkZVVwSW5cbiAgICAgIH0sXG4gICAgICBbYFxuICAgICAgICAgICR7c2xpZGVVcEVudGVyQWN0aXZlfSR7ZHJvcGRvd25QbGFjZW1lbnRDbHN9dG9wTGVmdCxcbiAgICAgICAgICAke3NsaWRlVXBBcHBlYXJBY3RpdmV9JHtkcm9wZG93blBsYWNlbWVudENsc310b3BMZWZ0LFxuICAgICAgICAgICR7c2xpZGVVcEVudGVyQWN0aXZlfSR7ZHJvcGRvd25QbGFjZW1lbnRDbHN9dG9wUmlnaHQsXG4gICAgICAgICAgJHtzbGlkZVVwQXBwZWFyQWN0aXZlfSR7ZHJvcGRvd25QbGFjZW1lbnRDbHN9dG9wUmlnaHRcbiAgICAgICAgYF06IHtcbiAgICAgICAgYW5pbWF0aW9uTmFtZTogc2xpZGVEb3duSW5cbiAgICAgIH0sXG4gICAgICBbYCR7c2xpZGVVcExlYXZlQWN0aXZlfSR7ZHJvcGRvd25QbGFjZW1lbnRDbHN9Ym90dG9tTGVmdGBdOiB7XG4gICAgICAgIGFuaW1hdGlvbk5hbWU6IHNsaWRlVXBPdXRcbiAgICAgIH0sXG4gICAgICBbYFxuICAgICAgICAgICR7c2xpZGVVcExlYXZlQWN0aXZlfSR7ZHJvcGRvd25QbGFjZW1lbnRDbHN9dG9wTGVmdCxcbiAgICAgICAgICAke3NsaWRlVXBMZWF2ZUFjdGl2ZX0ke2Ryb3Bkb3duUGxhY2VtZW50Q2xzfXRvcFJpZ2h0XG4gICAgICAgIGBdOiB7XG4gICAgICAgIGFuaW1hdGlvbk5hbWU6IHNsaWRlRG93bk91dFxuICAgICAgfSxcbiAgICAgICcmLWhpZGRlbic6IHtcbiAgICAgICAgZGlzcGxheTogJ25vbmUnXG4gICAgICB9LFxuICAgICAgW3NlbGVjdEl0ZW1DbHNdOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGdlbkl0ZW1TdHlsZSh0b2tlbikpLCB7XG4gICAgICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgICAgICB0cmFuc2l0aW9uOiBgYmFja2dyb3VuZCAke3Rva2VuLm1vdGlvbkR1cmF0aW9uU2xvd30gZWFzZWAsXG4gICAgICAgIGJvcmRlclJhZGl1czogdG9rZW4uYm9yZGVyUmFkaXVzU00sXG4gICAgICAgIC8vID09PT09PT09PT09IEdyb3VwID09PT09PT09PT09PVxuICAgICAgICAnJi1ncm91cCc6IHtcbiAgICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JUZXh0RGVzY3JpcHRpb24sXG4gICAgICAgICAgZm9udFNpemU6IHRva2VuLmZvbnRTaXplU00sXG4gICAgICAgICAgY3Vyc29yOiAnZGVmYXVsdCdcbiAgICAgICAgfSxcbiAgICAgICAgLy8gPT09PT09PT09PT0gT3B0aW9uID09PT09PT09PT09XG4gICAgICAgICcmLW9wdGlvbic6IHtcbiAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgJyYtY29udGVudCc6IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgZmxleDogJ2F1dG8nXG4gICAgICAgICAgfSwgdGV4dEVsbGlwc2lzKSxcbiAgICAgICAgICAnJi1zdGF0ZSc6IHtcbiAgICAgICAgICAgIGZsZXg6ICdub25lJyxcbiAgICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInXG4gICAgICAgICAgfSxcbiAgICAgICAgICBbYCYtYWN0aXZlOm5vdCgke3NlbGVjdEl0ZW1DbHN9LW9wdGlvbi1kaXNhYmxlZClgXToge1xuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0b2tlbi5vcHRpb25BY3RpdmVCZ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgW2AmLXNlbGVjdGVkOm5vdCgke3NlbGVjdEl0ZW1DbHN9LW9wdGlvbi1kaXNhYmxlZClgXToge1xuICAgICAgICAgICAgY29sb3I6IHRva2VuLm9wdGlvblNlbGVjdGVkQ29sb3IsXG4gICAgICAgICAgICBmb250V2VpZ2h0OiB0b2tlbi5vcHRpb25TZWxlY3RlZEZvbnRXZWlnaHQsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRva2VuLm9wdGlvblNlbGVjdGVkQmcsXG4gICAgICAgICAgICBbYCR7c2VsZWN0SXRlbUNsc30tb3B0aW9uLXN0YXRlYF06IHtcbiAgICAgICAgICAgICAgY29sb3I6IHRva2VuLmNvbG9yUHJpbWFyeVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgJyYtZGlzYWJsZWQnOiB7XG4gICAgICAgICAgICBbYCYke3NlbGVjdEl0ZW1DbHN9LW9wdGlvbi1zZWxlY3RlZGBdOiB7XG4gICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdG9rZW4uY29sb3JCZ0NvbnRhaW5lckRpc2FibGVkXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29sb3I6IHRva2VuLmNvbG9yVGV4dERpc2FibGVkLFxuICAgICAgICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQnXG4gICAgICAgICAgfSxcbiAgICAgICAgICAnJi1ncm91cGVkJzoge1xuICAgICAgICAgICAgcGFkZGluZ0lubGluZVN0YXJ0OiB0b2tlbi5jYWxjKHRva2VuLmNvbnRyb2xQYWRkaW5nSG9yaXpvbnRhbCkubXVsKDIpLmVxdWFsKClcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICcmLWVtcHR5JzogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBnZW5JdGVtU3R5bGUodG9rZW4pKSwge1xuICAgICAgICAgIGNvbG9yOiB0b2tlbi5jb2xvclRleHREaXNhYmxlZFxuICAgICAgICB9KVxuICAgICAgfSksXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL3B1bGwvNDY2NDZcbiAgICAgIFtgJHtzZWxlY3RlZEl0ZW1DbHN9OmhhcygrICR7c2VsZWN0ZWRJdGVtQ2xzfSlgXToge1xuICAgICAgICBib3JkZXJFbmRTdGFydFJhZGl1czogMCxcbiAgICAgICAgYm9yZGVyRW5kRW5kUmFkaXVzOiAwLFxuICAgICAgICBbYCYgKyAke3NlbGVjdGVkSXRlbUNsc31gXToge1xuICAgICAgICAgIGJvcmRlclN0YXJ0U3RhcnRSYWRpdXM6IDAsXG4gICAgICAgICAgYm9yZGVyU3RhcnRFbmRSYWRpdXM6IDBcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBSVEwgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAnJi1ydGwnOiB7XG4gICAgICAgIGRpcmVjdGlvbjogJ3J0bCdcbiAgICAgIH1cbiAgICB9KVxuICB9LFxuICAvLyBGb2xsb3cgY29kZSBtYXkgcmV1c2UgaW4gb3RoZXIgY29tcG9uZW50c1xuICBpbml0U2xpZGVNb3Rpb24odG9rZW4sICdzbGlkZS11cCcpLCBpbml0U2xpZGVNb3Rpb24odG9rZW4sICdzbGlkZS1kb3duJyksIGluaXRNb3ZlTW90aW9uKHRva2VuLCAnbW92ZS11cCcpLCBpbml0TW92ZU1vdGlvbih0b2tlbiwgJ21vdmUtZG93bicpXTtcbn07XG5leHBvcnQgZGVmYXVsdCBnZW5TaW5nbGVTdHlsZTsiLCAiaW1wb3J0IHsgdW5pdCB9IGZyb20gJ0BhbnQtZGVzaWduL2Nzc2luanMnO1xuaW1wb3J0IHsgcmVzZXRJY29uIH0gZnJvbSAnLi4vLi4vc3R5bGUnO1xuaW1wb3J0IHsgbWVyZ2VUb2tlbiB9IGZyb20gJy4uLy4uL3RoZW1lL2ludGVybmFsJztcbi8qKlxuICogR2V0IG11bHRpcGxlIHNlbGVjdG9yIG5lZWRlZCBzdHlsZS4gVGhlIGNhbGN1bGF0aW9uOlxuICpcbiAqIENvbnRhaW5lclBhZGRpbmcgPSBCYXNlUGFkZGluZyAtIEl0ZW1NYXJnaW5cbiAqXG4gKiBCb3JkZXI6ICAgICAgICAgICAgICAgICAgICBcdTI1NTRcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTcgICAgICAgICAgICAgICAgIFx1MjUyQ1xuICogQ29udGFpbmVyUGFkZGluZzogICAgICAgICAgXHUyNTUxICAgICAgICAgICAgICAgICAgICAgICAgICAgXHUyNTUxICAgICAgICAgICAgICAgICBcdTI1MDJcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx1MjU1Rlx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjU2MiAgICAgXHUyNTJDICAgICAgICAgICBcdTI1MDJcbiAqIEl0ZW0gTWFyZ2luOiAgICAgICAgICAgICAgIFx1MjU1MSAgICAgICAgICAgICAgICAgICAgICAgICAgIFx1MjU1MSAgICAgXHUyNTAyICAgICAgICAgICBcdTI1MDJcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx1MjU1MSAgICAgICAgICAgICBcdTI1MENcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MTAgIFx1MjU1MSAgICAgXHUyNTAyICAgICAgICAgICBcdTI1MDJcbiAqIEl0ZW0obXVsdGlwbGVJdGVtSGVpZ2h0KTogIFx1MjU1MSBCYXNlUGFkZGluZyBcdTI1MDIgICBJdGVtICAgXHUyNTAyICBcdTI1NTEgIE92ZXJmbG93ICBDb250YWluZXIoQ29udHJvbEhlaWdodClcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx1MjU1MSAgICAgICAgICAgICBcdTI1MTRcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MTggIFx1MjU1MSAgICAgXHUyNTAyICAgICAgICAgICBcdTI1MDJcbiAqIEl0ZW0gTWFyZ2luOiAgICAgICAgICAgICAgIFx1MjU1MSAgICAgICAgICAgICAgICAgICAgICAgICAgIFx1MjU1MSAgICAgXHUyNTAyICAgICAgICAgICBcdTI1MDJcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx1MjU1Rlx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjU2MiAgICAgXHUyNTM0ICAgICAgICAgICBcdTI1MDJcbiAqIENvbnRhaW5lclBhZGRpbmc6ICAgICAgICAgIFx1MjU1MSAgICAgICAgICAgICAgICAgICAgICAgICAgIFx1MjU1MSAgICAgICAgICAgICAgICAgXHUyNTAyXG4gKiBCb3JkZXI6ICAgICAgICAgICAgICAgICAgICBcdTI1NUFcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NUQgICAgICAgICAgICAgICAgIFx1MjUzNFxuICovXG5leHBvcnQgY29uc3QgZ2V0TXVsdGlwbGVTZWxlY3RvclVuaXQgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBtdWx0aXBsZVNlbGVjdEl0ZW1IZWlnaHQsXG4gICAgcGFkZGluZ1hYUyxcbiAgICBsaW5lV2lkdGgsXG4gICAgSU5URVJOQUxfRklYRURfSVRFTV9NQVJHSU5cbiAgfSA9IHRva2VuO1xuICBjb25zdCBiYXNlUGFkZGluZyA9IHRva2VuLm1heCh0b2tlbi5jYWxjKHBhZGRpbmdYWFMpLnN1YihsaW5lV2lkdGgpLmVxdWFsKCksIDApO1xuICBjb25zdCBjb250YWluZXJQYWRkaW5nID0gdG9rZW4ubWF4KHRva2VuLmNhbGMoYmFzZVBhZGRpbmcpLnN1YihJTlRFUk5BTF9GSVhFRF9JVEVNX01BUkdJTikuZXF1YWwoKSwgMCk7XG4gIHJldHVybiB7XG4gICAgYmFzZVBhZGRpbmcsXG4gICAgY29udGFpbmVyUGFkZGluZyxcbiAgICBpdGVtSGVpZ2h0OiB1bml0KG11bHRpcGxlU2VsZWN0SXRlbUhlaWdodCksXG4gICAgaXRlbUxpbmVIZWlnaHQ6IHVuaXQodG9rZW4uY2FsYyhtdWx0aXBsZVNlbGVjdEl0ZW1IZWlnaHQpLnN1Yih0b2tlbi5jYWxjKHRva2VuLmxpbmVXaWR0aCkubXVsKDIpKS5lcXVhbCgpKVxuICB9O1xufTtcbmNvbnN0IGdldFNlbGVjdEl0ZW1TdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIG11bHRpcGxlU2VsZWN0SXRlbUhlaWdodCxcbiAgICBzZWxlY3RIZWlnaHQsXG4gICAgbGluZVdpZHRoXG4gIH0gPSB0b2tlbjtcbiAgY29uc3Qgc2VsZWN0SXRlbURpc3QgPSB0b2tlbi5jYWxjKHNlbGVjdEhlaWdodCkuc3ViKG11bHRpcGxlU2VsZWN0SXRlbUhlaWdodCkuZGl2KDIpLnN1YihsaW5lV2lkdGgpLmVxdWFsKCk7XG4gIHJldHVybiBzZWxlY3RJdGVtRGlzdDtcbn07XG4vKipcbiAqIEdldCB0aGUgYHJjLW92ZXJmbG93YCBuZWVkZWQgc3R5bGUuXG4gKiBJdCdzIGEgc2hhcmUgc3R5bGUgd2hpY2ggbWVhbnMgbm90IGFmZmVjdGVkIGJ5IGBzaXplYC5cbiAqL1xuZXhwb3J0IGNvbnN0IGdlbk92ZXJmbG93U3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHMsXG4gICAgaWNvbkNscyxcbiAgICBib3JkZXJSYWRpdXNTTSxcbiAgICBtb3Rpb25EdXJhdGlvblNsb3csXG4gICAgcGFkZGluZ1hTLFxuICAgIG11bHRpcGxlSXRlbUNvbG9yRGlzYWJsZWQsXG4gICAgbXVsdGlwbGVJdGVtQm9yZGVyQ29sb3JEaXNhYmxlZCxcbiAgICBjb2xvckljb24sXG4gICAgY29sb3JJY29uSG92ZXIsXG4gICAgSU5URVJOQUxfRklYRURfSVRFTV9NQVJHSU5cbiAgfSA9IHRva2VuO1xuICBjb25zdCBzZWxlY3RPdmVyZmxvd1ByZWZpeENscyA9IGAke2NvbXBvbmVudENsc30tc2VsZWN0aW9uLW92ZXJmbG93YDtcbiAgcmV0dXJuIHtcbiAgICAvKipcbiAgICAgKiBEbyBub3QgbWVyZ2UgYGhlaWdodGAgJiBgbGluZS1oZWlnaHRgIHVuZGVyIHN0eWxlIHdpdGggYHNlbGVjdGlvbmAgJiBgc2VhcmNoYCwgc2luY2UgY2hyb21lXG4gICAgICogbWF5IHVwZGF0ZSB0byByZWRlc2lnbiB3aXRoIGl0cyBhbGlnbiBsb2dpYy5cbiAgICAgKi9cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gT3ZlcmZsb3cgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgW3NlbGVjdE92ZXJmbG93UHJlZml4Q2xzXToge1xuICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICBmbGV4OiAnYXV0bycsXG4gICAgICBmbGV4V3JhcDogJ3dyYXAnLFxuICAgICAgbWF4V2lkdGg6ICcxMDAlJyxcbiAgICAgICcmLWl0ZW0nOiB7XG4gICAgICAgIGZsZXg6ICdub25lJyxcbiAgICAgICAgYWxpZ25TZWxmOiAnY2VudGVyJyxcbiAgICAgICAgbWF4V2lkdGg6ICcxMDAlJyxcbiAgICAgICAgZGlzcGxheTogJ2lubGluZS1mbGV4J1xuICAgICAgfSxcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBTZWxlY3Rpb25zID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1zZWxlY3Rpb24taXRlbWBdOiB7XG4gICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgYWxpZ25TZWxmOiAnY2VudGVyJyxcbiAgICAgICAgZmxleDogJ25vbmUnLFxuICAgICAgICBib3hTaXppbmc6ICdib3JkZXItYm94JyxcbiAgICAgICAgbWF4V2lkdGg6ICcxMDAlJyxcbiAgICAgICAgbWFyZ2luQmxvY2s6IElOVEVSTkFMX0ZJWEVEX0lURU1fTUFSR0lOLFxuICAgICAgICBib3JkZXJSYWRpdXM6IGJvcmRlclJhZGl1c1NNLFxuICAgICAgICBjdXJzb3I6ICdkZWZhdWx0JyxcbiAgICAgICAgdHJhbnNpdGlvbjogYGZvbnQtc2l6ZSAke21vdGlvbkR1cmF0aW9uU2xvd30sIGxpbmUtaGVpZ2h0ICR7bW90aW9uRHVyYXRpb25TbG93fSwgaGVpZ2h0ICR7bW90aW9uRHVyYXRpb25TbG93fWAsXG4gICAgICAgIG1hcmdpbklubGluZUVuZDogdG9rZW4uY2FsYyhJTlRFUk5BTF9GSVhFRF9JVEVNX01BUkdJTikubXVsKDIpLmVxdWFsKCksXG4gICAgICAgIHBhZGRpbmdJbmxpbmVTdGFydDogcGFkZGluZ1hTLFxuICAgICAgICBwYWRkaW5nSW5saW5lRW5kOiB0b2tlbi5jYWxjKHBhZGRpbmdYUykuZGl2KDIpLmVxdWFsKCksXG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LWRpc2FibGVkJmBdOiB7XG4gICAgICAgICAgY29sb3I6IG11bHRpcGxlSXRlbUNvbG9yRGlzYWJsZWQsXG4gICAgICAgICAgYm9yZGVyQ29sb3I6IG11bHRpcGxlSXRlbUJvcmRlckNvbG9yRGlzYWJsZWQsXG4gICAgICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQnXG4gICAgICAgIH0sXG4gICAgICAgIC8vIEl0J3Mgb2sgbm90IHRvIGRvIHRoaXMsIGJ1dCAyNHB4IG1ha2VzIGJvdHRvbSBuYXJyb3cgaW4gdmlldyBzaG91bGQgYWRqdXN0XG4gICAgICAgICcmLWNvbnRlbnQnOiB7XG4gICAgICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICAgICAgbWFyZ2luSW5saW5lRW5kOiB0b2tlbi5jYWxjKHBhZGRpbmdYUykuZGl2KDIpLmVxdWFsKCksXG4gICAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgICAgIHdoaXRlU3BhY2U6ICdwcmUnLFxuICAgICAgICAgIC8vIGZpeCB3aGl0ZXNwYWNlIHdyYXBwaW5nLiBjdXN0b20gdGFncyBkaXNwbGF5IGFsbCB3aGl0ZXNwYWNlIHdpdGhpbi5cbiAgICAgICAgICB0ZXh0T3ZlcmZsb3c6ICdlbGxpcHNpcydcbiAgICAgICAgfSxcbiAgICAgICAgJyYtcmVtb3ZlJzogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXNldEljb24oKSksIHtcbiAgICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWZsZXgnLFxuICAgICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICAgIGNvbG9yOiBjb2xvckljb24sXG4gICAgICAgICAgZm9udFdlaWdodDogJ2JvbGQnLFxuICAgICAgICAgIGZvbnRTaXplOiAxMCxcbiAgICAgICAgICBsaW5lSGVpZ2h0OiAnaW5oZXJpdCcsXG4gICAgICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgICAgICAgW2A+ICR7aWNvbkNsc31gXToge1xuICAgICAgICAgICAgdmVydGljYWxBbGlnbjogJy0wLjJlbSdcbiAgICAgICAgICB9LFxuICAgICAgICAgICcmOmhvdmVyJzoge1xuICAgICAgICAgICAgY29sb3I6IGNvbG9ySWNvbkhvdmVyXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG5jb25zdCBnZW5TZWxlY3Rpb25TdHlsZSA9ICh0b2tlbiwgc3VmZml4KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHMsXG4gICAgSU5URVJOQUxfRklYRURfSVRFTV9NQVJHSU5cbiAgfSA9IHRva2VuO1xuICBjb25zdCBzZWxlY3RPdmVyZmxvd1ByZWZpeENscyA9IGAke2NvbXBvbmVudENsc30tc2VsZWN0aW9uLW92ZXJmbG93YDtcbiAgY29uc3Qgc2VsZWN0SXRlbUhlaWdodCA9IHRva2VuLm11bHRpcGxlU2VsZWN0SXRlbUhlaWdodDtcbiAgY29uc3Qgc2VsZWN0SXRlbURpc3QgPSBnZXRTZWxlY3RJdGVtU3R5bGUodG9rZW4pO1xuICBjb25zdCBzdWZmaXhDbHMgPSBzdWZmaXggPyBgJHtjb21wb25lbnRDbHN9LSR7c3VmZml4fWAgOiAnJztcbiAgY29uc3QgbXVsdGlwbGVTZWxlY3RvclVuaXQgPSBnZXRNdWx0aXBsZVNlbGVjdG9yVW5pdCh0b2tlbik7XG4gIHJldHVybiB7XG4gICAgW2Ake2NvbXBvbmVudENsc30tbXVsdGlwbGUke3N1ZmZpeENsc31gXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBnZW5PdmVyZmxvd1N0eWxlKHRva2VuKSksIHtcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gU2VsZWN0b3IgPT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgW2Ake2NvbXBvbmVudENsc30tc2VsZWN0b3JgXToge1xuICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAgLy8gTXVsdGlwbGUgaXMgbGl0dGxlIGRpZmZlcmVudCB0aGF0IGhvcml6b250YWwgaXMgZm9sbG93IHRoZSB2ZXJ0aWNhbFxuICAgICAgICBwYWRkaW5nSW5saW5lOiBtdWx0aXBsZVNlbGVjdG9yVW5pdC5iYXNlUGFkZGluZyxcbiAgICAgICAgcGFkZGluZ0Jsb2NrOiBtdWx0aXBsZVNlbGVjdG9yVW5pdC5jb250YWluZXJQYWRkaW5nLFxuICAgICAgICBib3JkZXJSYWRpdXM6IHRva2VuLmJvcmRlclJhZGl1cyxcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30tZGlzYWJsZWQmYF06IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kOiB0b2tlbi5tdWx0aXBsZVNlbGVjdG9yQmdEaXNhYmxlZCxcbiAgICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCdcbiAgICAgICAgfSxcbiAgICAgICAgJyY6YWZ0ZXInOiB7XG4gICAgICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgICAgbWFyZ2luOiBgJHt1bml0KElOVEVSTkFMX0ZJWEVEX0lURU1fTUFSR0lOKX0gMGAsXG4gICAgICAgICAgbGluZUhlaWdodDogdW5pdChzZWxlY3RJdGVtSGVpZ2h0KSxcbiAgICAgICAgICB2aXNpYmlsaXR5OiAnaGlkZGVuJyxcbiAgICAgICAgICBjb250ZW50OiAnXCJcXFxcYTBcIidcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBTZWxlY3Rpb25zID09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgW2Ake2NvbXBvbmVudENsc30tc2VsZWN0aW9uLWl0ZW1gXToge1xuICAgICAgICBoZWlnaHQ6IG11bHRpcGxlU2VsZWN0b3JVbml0Lml0ZW1IZWlnaHQsXG4gICAgICAgIGxpbmVIZWlnaHQ6IHVuaXQobXVsdGlwbGVTZWxlY3RvclVuaXQuaXRlbUxpbmVIZWlnaHQpXG4gICAgICB9LFxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gV3JhcCA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LXNlbGVjdGlvbi13cmFwYF06IHtcbiAgICAgICAgYWxpZ25TZWxmOiAnZmxleC1zdGFydCcsXG4gICAgICAgICcmOmFmdGVyJzoge1xuICAgICAgICAgIGxpbmVIZWlnaHQ6IHVuaXQoc2VsZWN0SXRlbUhlaWdodCksXG4gICAgICAgICAgbWFyZ2luQmxvY2s6IElOVEVSTkFMX0ZJWEVEX0lURU1fTUFSR0lOXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBJbnB1dCA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgW2Ake2NvbXBvbmVudENsc30tcHJlZml4YF06IHtcbiAgICAgICAgbWFyZ2luSW5saW5lU3RhcnQ6IHRva2VuLmNhbGModG9rZW4uaW5wdXRQYWRkaW5nSG9yaXpvbnRhbEJhc2UpLnN1YihtdWx0aXBsZVNlbGVjdG9yVW5pdC5iYXNlUGFkZGluZykuZXF1YWwoKVxuICAgICAgfSxcbiAgICAgIFtgJHtzZWxlY3RPdmVyZmxvd1ByZWZpeENsc30taXRlbSArICR7c2VsZWN0T3ZlcmZsb3dQcmVmaXhDbHN9LWl0ZW0sXG4gICAgICAgICR7Y29tcG9uZW50Q2xzfS1wcmVmaXggKyAke2NvbXBvbmVudENsc30tc2VsZWN0aW9uLXdyYXBcbiAgICAgIGBdOiB7XG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LXNlbGVjdGlvbi1zZWFyY2hgXToge1xuICAgICAgICAgIG1hcmdpbklubGluZVN0YXJ0OiAwXG4gICAgICAgIH0sXG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LXNlbGVjdGlvbi1wbGFjZWhvbGRlcmBdOiB7XG4gICAgICAgICAgaW5zZXRJbmxpbmVTdGFydDogMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvNDQ3NTRcbiAgICAgIC8vIFNhbWUgYXMgYHdyYXA6YWZ0ZXJgXG4gICAgICBbYCR7c2VsZWN0T3ZlcmZsb3dQcmVmaXhDbHN9LWl0ZW0tc3VmZml4YF06IHtcbiAgICAgICAgbWluSGVpZ2h0OiBtdWx0aXBsZVNlbGVjdG9yVW5pdC5pdGVtSGVpZ2h0LFxuICAgICAgICBtYXJnaW5CbG9jazogSU5URVJOQUxfRklYRURfSVRFTV9NQVJHSU5cbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1zZWxlY3Rpb24tc2VhcmNoYF06IHtcbiAgICAgICAgZGlzcGxheTogJ2lubGluZS1mbGV4JyxcbiAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICAgIG1heFdpZHRoOiAnMTAwJScsXG4gICAgICAgIG1hcmdpbklubGluZVN0YXJ0OiB0b2tlbi5jYWxjKHRva2VuLmlucHV0UGFkZGluZ0hvcml6b250YWxCYXNlKS5zdWIoc2VsZWN0SXRlbURpc3QpLmVxdWFsKCksXG4gICAgICAgIFtgXG4gICAgICAgICAgJi1pbnB1dCxcbiAgICAgICAgICAmLW1pcnJvclxuICAgICAgICBgXToge1xuICAgICAgICAgIGhlaWdodDogc2VsZWN0SXRlbUhlaWdodCxcbiAgICAgICAgICBmb250RmFtaWx5OiB0b2tlbi5mb250RmFtaWx5LFxuICAgICAgICAgIGxpbmVIZWlnaHQ6IHVuaXQoc2VsZWN0SXRlbUhlaWdodCksXG4gICAgICAgICAgdHJhbnNpdGlvbjogYGFsbCAke3Rva2VuLm1vdGlvbkR1cmF0aW9uU2xvd31gXG4gICAgICAgIH0sXG4gICAgICAgICcmLWlucHV0Jzoge1xuICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgbWluV2lkdGg6IDQuMSAvLyBmaXggc2VhcmNoIGN1cnNvciBtaXNzaW5nXG4gICAgICAgIH0sXG4gICAgICAgICcmLW1pcnJvcic6IHtcbiAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgaW5zZXRJbmxpbmVTdGFydDogMCxcbiAgICAgICAgICBpbnNldElubGluZUVuZDogJ2F1dG8nLFxuICAgICAgICAgIHpJbmRleDogOTk5LFxuICAgICAgICAgIHdoaXRlU3BhY2U6ICdwcmUnLFxuICAgICAgICAgIC8vIGZpeCB3aGl0ZXNwYWNlIHdyYXBwaW5nIGNhdXNlZCB3aWR0aCBjYWxjdWxhdGlvbiBidWdcbiAgICAgICAgICB2aXNpYmlsaXR5OiAnaGlkZGVuJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT0gUGxhY2Vob2xkZXIgPT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LXNlbGVjdGlvbi1wbGFjZWhvbGRlcmBdOiB7XG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICB0b3A6ICc1MCUnLFxuICAgICAgICBpbnNldElubGluZVN0YXJ0OiB0b2tlbi5jYWxjKHRva2VuLmlucHV0UGFkZGluZ0hvcml6b250YWxCYXNlKS5zdWIobXVsdGlwbGVTZWxlY3RvclVuaXQuYmFzZVBhZGRpbmcpLmVxdWFsKCksXG4gICAgICAgIGluc2V0SW5saW5lRW5kOiB0b2tlbi5pbnB1dFBhZGRpbmdIb3Jpem9udGFsQmFzZSxcbiAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgtNTAlKScsXG4gICAgICAgIHRyYW5zaXRpb246IGBhbGwgJHt0b2tlbi5tb3Rpb25EdXJhdGlvblNsb3d9YFxuICAgICAgfVxuICAgIH0pXG4gIH07XG59O1xuZnVuY3Rpb24gZ2VuU2l6ZVN0eWxlKHRva2VuLCBzdWZmaXgpIHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENsc1xuICB9ID0gdG9rZW47XG4gIGNvbnN0IHN1ZmZpeENscyA9IHN1ZmZpeCA/IGAke2NvbXBvbmVudENsc30tJHtzdWZmaXh9YCA6ICcnO1xuICBjb25zdCByYXdTdHlsZSA9IHtcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS1tdWx0aXBsZSR7c3VmZml4Q2xzfWBdOiB7XG4gICAgICBmb250U2l6ZTogdG9rZW4uZm9udFNpemUsXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IFNlbGVjdG9yID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LXNlbGVjdG9yYF06IHtcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30tc2hvdy1zZWFyY2gmYF06IHtcbiAgICAgICAgICBjdXJzb3I6ICd0ZXh0J1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2BcbiAgICAgICAgJiR7Y29tcG9uZW50Q2xzfS1zaG93LWFycm93ICR7Y29tcG9uZW50Q2xzfS1zZWxlY3RvcixcbiAgICAgICAgJiR7Y29tcG9uZW50Q2xzfS1hbGxvdy1jbGVhciAke2NvbXBvbmVudENsc30tc2VsZWN0b3JcbiAgICAgIGBdOiB7XG4gICAgICAgIHBhZGRpbmdJbmxpbmVFbmQ6IHRva2VuLmNhbGModG9rZW4uZm9udFNpemVJY29uKS5hZGQodG9rZW4uY29udHJvbFBhZGRpbmdIb3Jpem9udGFsKS5lcXVhbCgpXG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXR1cm4gW2dlblNlbGVjdGlvblN0eWxlKHRva2VuLCBzdWZmaXgpLCByYXdTdHlsZV07XG59XG5jb25zdCBnZW5NdWx0aXBsZVN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzXG4gIH0gPSB0b2tlbjtcbiAgY29uc3Qgc21hbGxUb2tlbiA9IG1lcmdlVG9rZW4odG9rZW4sIHtcbiAgICBzZWxlY3RIZWlnaHQ6IHRva2VuLmNvbnRyb2xIZWlnaHRTTSxcbiAgICBtdWx0aXBsZVNlbGVjdEl0ZW1IZWlnaHQ6IHRva2VuLm11bHRpcGxlSXRlbUhlaWdodFNNLFxuICAgIGJvcmRlclJhZGl1czogdG9rZW4uYm9yZGVyUmFkaXVzU00sXG4gICAgYm9yZGVyUmFkaXVzU006IHRva2VuLmJvcmRlclJhZGl1c1hTXG4gIH0pO1xuICBjb25zdCBsYXJnZVRva2VuID0gbWVyZ2VUb2tlbih0b2tlbiwge1xuICAgIGZvbnRTaXplOiB0b2tlbi5mb250U2l6ZUxHLFxuICAgIHNlbGVjdEhlaWdodDogdG9rZW4uY29udHJvbEhlaWdodExHLFxuICAgIG11bHRpcGxlU2VsZWN0SXRlbUhlaWdodDogdG9rZW4ubXVsdGlwbGVJdGVtSGVpZ2h0TEcsXG4gICAgYm9yZGVyUmFkaXVzOiB0b2tlbi5ib3JkZXJSYWRpdXNMRyxcbiAgICBib3JkZXJSYWRpdXNTTTogdG9rZW4uYm9yZGVyUmFkaXVzXG4gIH0pO1xuICByZXR1cm4gW2dlblNpemVTdHlsZSh0b2tlbiksXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBTbWFsbCA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgZ2VuU2l6ZVN0eWxlKHNtYWxsVG9rZW4sICdzbScpLFxuICAvLyBQYWRkaW5nXG4gIHtcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS1tdWx0aXBsZSR7Y29tcG9uZW50Q2xzfS1zbWBdOiB7XG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1zZWxlY3Rpb24tcGxhY2Vob2xkZXJgXToge1xuICAgICAgICBpbnNldElubGluZTogdG9rZW4uY2FsYyh0b2tlbi5jb250cm9sUGFkZGluZ0hvcml6b250YWxTTSkuc3ViKHRva2VuLmxpbmVXaWR0aCkuZXF1YWwoKVxuICAgICAgfSxcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzI5NTU5XG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1zZWxlY3Rpb24tc2VhcmNoYF06IHtcbiAgICAgICAgbWFyZ2luSW5saW5lU3RhcnQ6IDIgLy8gTWFnaWMgTnVtYmVyXG4gICAgICB9XG4gICAgfVxuICB9LFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gTGFyZ2UgPT09PT09PT09PT09PT09PT09PT09PT09XG4gIGdlblNpemVTdHlsZShsYXJnZVRva2VuLCAnbGcnKV07XG59O1xuZXhwb3J0IGRlZmF1bHQgZ2VuTXVsdGlwbGVTdHlsZTsiLCAiaW1wb3J0IHsgdW5pdCB9IGZyb20gJ0BhbnQtZGVzaWduL2Nzc2luanMnO1xuaW1wb3J0IHsgcmVzZXRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9zdHlsZSc7XG5pbXBvcnQgeyBtZXJnZVRva2VuIH0gZnJvbSAnLi4vLi4vdGhlbWUvaW50ZXJuYWwnO1xuZnVuY3Rpb24gZ2VuU2l6ZVN0eWxlKHRva2VuLCBzdWZmaXgpIHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENscyxcbiAgICBpbnB1dFBhZGRpbmdIb3Jpem9udGFsQmFzZSxcbiAgICBib3JkZXJSYWRpdXNcbiAgfSA9IHRva2VuO1xuICBjb25zdCBzZWxlY3RIZWlnaHRXaXRob3V0Qm9yZGVyID0gdG9rZW4uY2FsYyh0b2tlbi5jb250cm9sSGVpZ2h0KS5zdWIodG9rZW4uY2FsYyh0b2tlbi5saW5lV2lkdGgpLm11bCgyKSkuZXF1YWwoKTtcbiAgY29uc3Qgc3VmZml4Q2xzID0gc3VmZml4ID8gYCR7Y29tcG9uZW50Q2xzfS0ke3N1ZmZpeH1gIDogJyc7XG4gIHJldHVybiB7XG4gICAgW2Ake2NvbXBvbmVudENsc30tc2luZ2xlJHtzdWZmaXhDbHN9YF06IHtcbiAgICAgIGZvbnRTaXplOiB0b2tlbi5mb250U2l6ZSxcbiAgICAgIGhlaWdodDogdG9rZW4uY29udHJvbEhlaWdodCxcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gU2VsZWN0b3IgPT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgW2Ake2NvbXBvbmVudENsc30tc2VsZWN0b3JgXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXNldENvbXBvbmVudCh0b2tlbiwgdHJ1ZSkpLCB7XG4gICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgYm9yZGVyUmFkaXVzLFxuICAgICAgICBmbGV4OiAnMSAxIGF1dG8nLFxuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1zZWxlY3Rpb24td3JhcDphZnRlcmBdOiB7XG4gICAgICAgICAgbGluZUhlaWdodDogdW5pdChzZWxlY3RIZWlnaHRXaXRob3V0Qm9yZGVyKVxuICAgICAgICB9LFxuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1zZWxlY3Rpb24tc2VhcmNoYF06IHtcbiAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICBpbnNldDogMCxcbiAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgICcmLWlucHV0Jzoge1xuICAgICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICAgIFdlYmtpdEFwcGVhcmFuY2U6ICd0ZXh0ZmllbGQnXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbYFxuICAgICAgICAgICR7Y29tcG9uZW50Q2xzfS1zZWxlY3Rpb24taXRlbSxcbiAgICAgICAgICAke2NvbXBvbmVudENsc30tc2VsZWN0aW9uLXBsYWNlaG9sZGVyXG4gICAgICAgIGBdOiB7XG4gICAgICAgICAgZGlzcGxheTogJ2Jsb2NrJyxcbiAgICAgICAgICBwYWRkaW5nOiAwLFxuICAgICAgICAgIGxpbmVIZWlnaHQ6IHVuaXQoc2VsZWN0SGVpZ2h0V2l0aG91dEJvcmRlciksXG4gICAgICAgICAgdHJhbnNpdGlvbjogYGFsbCAke3Rva2VuLm1vdGlvbkR1cmF0aW9uU2xvd30sIHZpc2liaWxpdHkgMHNgLFxuICAgICAgICAgIGFsaWduU2VsZjogJ2NlbnRlcidcbiAgICAgICAgfSxcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30tc2VsZWN0aW9uLXBsYWNlaG9sZGVyYF06IHtcbiAgICAgICAgICB0cmFuc2l0aW9uOiAnbm9uZScsXG4gICAgICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnXG4gICAgICAgIH0sXG4gICAgICAgIC8vIEZvciBjb21tb24gYmFzZWxpbmUgYWxpZ25cbiAgICAgICAgW1snJjphZnRlcicsIC8qIEZvciAnJyB2YWx1ZSBiYXNlbGluZSBhbGlnbiAqL1xuICAgICAgICBgJHtjb21wb25lbnRDbHN9LXNlbGVjdGlvbi1pdGVtOmVtcHR5OmFmdGVyYCwgLyogRm9yIHVuZGVmaW5lZCB2YWx1ZSBiYXNlbGluZSBhbGlnbiAqL1xuICAgICAgICBgJHtjb21wb25lbnRDbHN9LXNlbGVjdGlvbi1wbGFjZWhvbGRlcjplbXB0eTphZnRlcmBdLmpvaW4oJywnKV06IHtcbiAgICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJyxcbiAgICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgICB2aXNpYmlsaXR5OiAnaGlkZGVuJyxcbiAgICAgICAgICBjb250ZW50OiAnXCJcXFxcYTBcIidcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICBbYFxuICAgICAgICAmJHtjb21wb25lbnRDbHN9LXNob3ctYXJyb3cgJHtjb21wb25lbnRDbHN9LXNlbGVjdGlvbi1pdGVtLFxuICAgICAgICAmJHtjb21wb25lbnRDbHN9LXNob3ctYXJyb3cgJHtjb21wb25lbnRDbHN9LXNlbGVjdGlvbi1zZWFyY2gsXG4gICAgICAgICYke2NvbXBvbmVudENsc30tc2hvdy1hcnJvdyAke2NvbXBvbmVudENsc30tc2VsZWN0aW9uLXBsYWNlaG9sZGVyXG4gICAgICBgXToge1xuICAgICAgICBwYWRkaW5nSW5saW5lRW5kOiB0b2tlbi5zaG93QXJyb3dQYWRkaW5nSW5saW5lRW5kXG4gICAgICB9LFxuICAgICAgLy8gT3BhY2l0eSBzZWxlY3Rpb24gaWYgb3BlblxuICAgICAgW2AmJHtjb21wb25lbnRDbHN9LW9wZW4gJHtjb21wb25lbnRDbHN9LXNlbGVjdGlvbi1pdGVtYF06IHtcbiAgICAgICAgY29sb3I6IHRva2VuLmNvbG9yVGV4dFBsYWNlaG9sZGVyXG4gICAgICB9LFxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gSW5wdXQgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIC8vIFdlIG9ubHkgY2hhbmdlIHRoZSBzdHlsZSBvZiBub24tY3VzdG9taXplIGlucHV0IHdoaWNoIGlzIG9ubHkgc3VwcG9ydCBieSBgY29tYm9ib3hgIG1vZGUuXG4gICAgICAvLyBOb3QgY3VzdG9taXplXG4gICAgICBbYCY6bm90KCR7Y29tcG9uZW50Q2xzfS1jdXN0b21pemUtaW5wdXQpYF06IHtcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30tc2VsZWN0b3JgXToge1xuICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAgcGFkZGluZzogYDAgJHt1bml0KGlucHV0UGFkZGluZ0hvcml6b250YWxCYXNlKX1gLFxuICAgICAgICAgIFtgJHtjb21wb25lbnRDbHN9LXNlbGVjdGlvbi1zZWFyY2gtaW5wdXRgXToge1xuICAgICAgICAgICAgaGVpZ2h0OiBzZWxlY3RIZWlnaHRXaXRob3V0Qm9yZGVyLFxuICAgICAgICAgICAgZm9udFNpemU6IHRva2VuLmZvbnRTaXplXG4gICAgICAgICAgfSxcbiAgICAgICAgICAnJjphZnRlcic6IHtcbiAgICAgICAgICAgIGxpbmVIZWlnaHQ6IHVuaXQoc2VsZWN0SGVpZ2h0V2l0aG91dEJvcmRlcilcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbYCYke2NvbXBvbmVudENsc30tY3VzdG9taXplLWlucHV0YF06IHtcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30tc2VsZWN0b3JgXToge1xuICAgICAgICAgICcmOmFmdGVyJzoge1xuICAgICAgICAgICAgZGlzcGxheTogJ25vbmUnXG4gICAgICAgICAgfSxcbiAgICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1zZWxlY3Rpb24tc2VhcmNoYF06IHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnc3RhdGljJyxcbiAgICAgICAgICAgIHdpZHRoOiAnMTAwJSdcbiAgICAgICAgICB9LFxuICAgICAgICAgIFtgJHtjb21wb25lbnRDbHN9LXNlbGVjdGlvbi1wbGFjZWhvbGRlcmBdOiB7XG4gICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgIGluc2V0SW5saW5lU3RhcnQ6IDAsXG4gICAgICAgICAgICBpbnNldElubGluZUVuZDogMCxcbiAgICAgICAgICAgIHBhZGRpbmc6IGAwICR7dW5pdChpbnB1dFBhZGRpbmdIb3Jpem9udGFsQmFzZSl9YCxcbiAgICAgICAgICAgICcmOmFmdGVyJzoge1xuICAgICAgICAgICAgICBkaXNwbGF5OiAnbm9uZSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZW5TaW5nbGVTdHlsZSh0b2tlbikge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzXG4gIH0gPSB0b2tlbjtcbiAgY29uc3QgaW5wdXRQYWRkaW5nSG9yaXpvbnRhbFNNID0gdG9rZW4uY2FsYyh0b2tlbi5jb250cm9sUGFkZGluZ0hvcml6b250YWxTTSkuc3ViKHRva2VuLmxpbmVXaWR0aCkuZXF1YWwoKTtcbiAgcmV0dXJuIFtnZW5TaXplU3R5bGUodG9rZW4pLFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gU21hbGwgPT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFNoYXJlZFxuICBnZW5TaXplU3R5bGUobWVyZ2VUb2tlbih0b2tlbiwge1xuICAgIGNvbnRyb2xIZWlnaHQ6IHRva2VuLmNvbnRyb2xIZWlnaHRTTSxcbiAgICBib3JkZXJSYWRpdXM6IHRva2VuLmJvcmRlclJhZGl1c1NNXG4gIH0pLCAnc20nKSxcbiAgLy8gcGFkZGluZ1xuICB7XG4gICAgW2Ake2NvbXBvbmVudENsc30tc2luZ2xlJHtjb21wb25lbnRDbHN9LXNtYF06IHtcbiAgICAgIFtgJjpub3QoJHtjb21wb25lbnRDbHN9LWN1c3RvbWl6ZS1pbnB1dClgXToge1xuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1zZWxlY3RvcmBdOiB7XG4gICAgICAgICAgcGFkZGluZzogYDAgJHt1bml0KGlucHV0UGFkZGluZ0hvcml6b250YWxTTSl9YFxuICAgICAgICB9LFxuICAgICAgICAvLyBXaXRoIGFycm93IHNob3VsZCBwcm92aWRlcyBgcGFkZGluZy1yaWdodGAgdG8gc2hvdyB0aGUgYXJyb3dcbiAgICAgICAgW2AmJHtjb21wb25lbnRDbHN9LXNob3ctYXJyb3cgJHtjb21wb25lbnRDbHN9LXNlbGVjdGlvbi1zZWFyY2hgXToge1xuICAgICAgICAgIGluc2V0SW5saW5lRW5kOiB0b2tlbi5jYWxjKGlucHV0UGFkZGluZ0hvcml6b250YWxTTSkuYWRkKHRva2VuLmNhbGModG9rZW4uZm9udFNpemUpLm11bCgxLjUpKS5lcXVhbCgpXG4gICAgICAgIH0sXG4gICAgICAgIFtgXG4gICAgICAgICAgICAmJHtjb21wb25lbnRDbHN9LXNob3ctYXJyb3cgJHtjb21wb25lbnRDbHN9LXNlbGVjdGlvbi1pdGVtLFxuICAgICAgICAgICAgJiR7Y29tcG9uZW50Q2xzfS1zaG93LWFycm93ICR7Y29tcG9uZW50Q2xzfS1zZWxlY3Rpb24tcGxhY2Vob2xkZXJcbiAgICAgICAgICBgXToge1xuICAgICAgICAgIHBhZGRpbmdJbmxpbmVFbmQ6IHRva2VuLmNhbGModG9rZW4uZm9udFNpemUpLm11bCgxLjUpLmVxdWFsKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IExhcmdlID09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTaGFyZWRcbiAgZ2VuU2l6ZVN0eWxlKG1lcmdlVG9rZW4odG9rZW4sIHtcbiAgICBjb250cm9sSGVpZ2h0OiB0b2tlbi5zaW5nbGVJdGVtSGVpZ2h0TEcsXG4gICAgZm9udFNpemU6IHRva2VuLmZvbnRTaXplTEcsXG4gICAgYm9yZGVyUmFkaXVzOiB0b2tlbi5ib3JkZXJSYWRpdXNMR1xuICB9KSwgJ2xnJyldO1xufSIsICJleHBvcnQgY29uc3QgcHJlcGFyZUNvbXBvbmVudFRva2VuID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgZm9udFNpemUsXG4gICAgbGluZUhlaWdodCxcbiAgICBsaW5lV2lkdGgsXG4gICAgY29udHJvbEhlaWdodCxcbiAgICBjb250cm9sSGVpZ2h0U00sXG4gICAgY29udHJvbEhlaWdodExHLFxuICAgIHBhZGRpbmdYWFMsXG4gICAgY29udHJvbFBhZGRpbmdIb3Jpem9udGFsLFxuICAgIHpJbmRleFBvcHVwQmFzZSxcbiAgICBjb2xvclRleHQsXG4gICAgZm9udFdlaWdodFN0cm9uZyxcbiAgICBjb250cm9sSXRlbUJnQWN0aXZlLFxuICAgIGNvbnRyb2xJdGVtQmdIb3ZlcixcbiAgICBjb2xvckJnQ29udGFpbmVyLFxuICAgIGNvbG9yRmlsbFNlY29uZGFyeSxcbiAgICBjb2xvckJnQ29udGFpbmVyRGlzYWJsZWQsXG4gICAgY29sb3JUZXh0RGlzYWJsZWQsXG4gICAgY29sb3JQcmltYXJ5SG92ZXIsXG4gICAgY29sb3JQcmltYXJ5LFxuICAgIGNvbnRyb2xPdXRsaW5lXG4gIH0gPSB0b2tlbjtcbiAgLy8gSXRlbSBoZWlnaHQgZGVmYXVsdCB1c2UgYGNvbnRyb2xIZWlnaHQgLSAyICogcGFkZGluZ1hYU2AsXG4gIC8vIGJ1dCBzb21lIGNhc2UgYHBhZGRpbmdYWFM9MGAuXG4gIC8vIExldCdzIGZhbGxiYWNrIGl0LlxuICBjb25zdCBkYmxQYWRkaW5nWFhTID0gcGFkZGluZ1hYUyAqIDI7XG4gIGNvbnN0IGRibExpbmVXaWR0aCA9IGxpbmVXaWR0aCAqIDI7XG4gIGNvbnN0IG11bHRpcGxlSXRlbUhlaWdodCA9IE1hdGgubWluKGNvbnRyb2xIZWlnaHQgLSBkYmxQYWRkaW5nWFhTLCBjb250cm9sSGVpZ2h0IC0gZGJsTGluZVdpZHRoKTtcbiAgY29uc3QgbXVsdGlwbGVJdGVtSGVpZ2h0U00gPSBNYXRoLm1pbihjb250cm9sSGVpZ2h0U00gLSBkYmxQYWRkaW5nWFhTLCBjb250cm9sSGVpZ2h0U00gLSBkYmxMaW5lV2lkdGgpO1xuICBjb25zdCBtdWx0aXBsZUl0ZW1IZWlnaHRMRyA9IE1hdGgubWluKGNvbnRyb2xIZWlnaHRMRyAtIGRibFBhZGRpbmdYWFMsIGNvbnRyb2xIZWlnaHRMRyAtIGRibExpbmVXaWR0aCk7XG4gIC8vIEZJWEVEX0lURU1fTUFSR0lOIGlzIGEgaGFyZGNvZGUgY2FsY3VsYXRpb24gc2luY2UgY2FsYyBub3Qgc3VwcG9ydCByb3VuZGluZ1xuICBjb25zdCBJTlRFUk5BTF9GSVhFRF9JVEVNX01BUkdJTiA9IE1hdGguZmxvb3IocGFkZGluZ1hYUyAvIDIpO1xuICByZXR1cm4ge1xuICAgIElOVEVSTkFMX0ZJWEVEX0lURU1fTUFSR0lOLFxuICAgIHpJbmRleFBvcHVwOiB6SW5kZXhQb3B1cEJhc2UgKyA1MCxcbiAgICBvcHRpb25TZWxlY3RlZENvbG9yOiBjb2xvclRleHQsXG4gICAgb3B0aW9uU2VsZWN0ZWRGb250V2VpZ2h0OiBmb250V2VpZ2h0U3Ryb25nLFxuICAgIG9wdGlvblNlbGVjdGVkQmc6IGNvbnRyb2xJdGVtQmdBY3RpdmUsXG4gICAgb3B0aW9uQWN0aXZlQmc6IGNvbnRyb2xJdGVtQmdIb3ZlcixcbiAgICBvcHRpb25QYWRkaW5nOiBgJHsoY29udHJvbEhlaWdodCAtIGZvbnRTaXplICogbGluZUhlaWdodCkgLyAyfXB4ICR7Y29udHJvbFBhZGRpbmdIb3Jpem9udGFsfXB4YCxcbiAgICBvcHRpb25Gb250U2l6ZTogZm9udFNpemUsXG4gICAgb3B0aW9uTGluZUhlaWdodDogbGluZUhlaWdodCxcbiAgICBvcHRpb25IZWlnaHQ6IGNvbnRyb2xIZWlnaHQsXG4gICAgc2VsZWN0b3JCZzogY29sb3JCZ0NvbnRhaW5lcixcbiAgICBjbGVhckJnOiBjb2xvckJnQ29udGFpbmVyLFxuICAgIHNpbmdsZUl0ZW1IZWlnaHRMRzogY29udHJvbEhlaWdodExHLFxuICAgIG11bHRpcGxlSXRlbUJnOiBjb2xvckZpbGxTZWNvbmRhcnksXG4gICAgbXVsdGlwbGVJdGVtQm9yZGVyQ29sb3I6ICd0cmFuc3BhcmVudCcsXG4gICAgbXVsdGlwbGVJdGVtSGVpZ2h0LFxuICAgIG11bHRpcGxlSXRlbUhlaWdodFNNLFxuICAgIG11bHRpcGxlSXRlbUhlaWdodExHLFxuICAgIG11bHRpcGxlU2VsZWN0b3JCZ0Rpc2FibGVkOiBjb2xvckJnQ29udGFpbmVyRGlzYWJsZWQsXG4gICAgbXVsdGlwbGVJdGVtQ29sb3JEaXNhYmxlZDogY29sb3JUZXh0RGlzYWJsZWQsXG4gICAgbXVsdGlwbGVJdGVtQm9yZGVyQ29sb3JEaXNhYmxlZDogJ3RyYW5zcGFyZW50JyxcbiAgICBzaG93QXJyb3dQYWRkaW5nSW5saW5lRW5kOiBNYXRoLmNlaWwodG9rZW4uZm9udFNpemUgKiAxLjI1KSxcbiAgICBob3ZlckJvcmRlckNvbG9yOiBjb2xvclByaW1hcnlIb3ZlcixcbiAgICBhY3RpdmVCb3JkZXJDb2xvcjogY29sb3JQcmltYXJ5LFxuICAgIGFjdGl2ZU91dGxpbmVDb2xvcjogY29udHJvbE91dGxpbmUsXG4gICAgc2VsZWN0QWZmaXhQYWRkaW5nOiBwYWRkaW5nWFhTXG4gIH07XG59OyIsICJpbXBvcnQgeyB1bml0IH0gZnJvbSAnQGFudC1kZXNpZ24vY3NzaW5qcyc7XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gPT0gICAgICAgICAgICAgICAgICBPdXRsaW5lZCAgICAgICAgICAgICAgICAgICAgICAgPT1cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5jb25zdCBnZW5CYXNlT3V0bGluZWRTdHlsZSA9ICh0b2tlbiwgb3B0aW9ucykgPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzLFxuICAgIGFudENscyxcbiAgICBjb250cm9sT3V0bGluZVdpZHRoXG4gIH0gPSB0b2tlbjtcbiAgcmV0dXJuIHtcbiAgICBbYCY6bm90KCR7Y29tcG9uZW50Q2xzfS1jdXN0b21pemUtaW5wdXQpICR7Y29tcG9uZW50Q2xzfS1zZWxlY3RvcmBdOiB7XG4gICAgICBib3JkZXI6IGAke3VuaXQodG9rZW4ubGluZVdpZHRoKX0gJHt0b2tlbi5saW5lVHlwZX0gJHtvcHRpb25zLmJvcmRlckNvbG9yfWAsXG4gICAgICBiYWNrZ3JvdW5kOiB0b2tlbi5zZWxlY3RvckJnXG4gICAgfSxcbiAgICBbYCY6bm90KCR7Y29tcG9uZW50Q2xzfS1kaXNhYmxlZCk6bm90KCR7Y29tcG9uZW50Q2xzfS1jdXN0b21pemUtaW5wdXQpOm5vdCgke2FudENsc30tcGFnaW5hdGlvbi1zaXplLWNoYW5nZXIpYF06IHtcbiAgICAgIFtgJjpob3ZlciAke2NvbXBvbmVudENsc30tc2VsZWN0b3JgXToge1xuICAgICAgICBib3JkZXJDb2xvcjogb3B0aW9ucy5ob3ZlckJvcmRlckhvdmVyXG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tZm9jdXNlZCYgJHtjb21wb25lbnRDbHN9LXNlbGVjdG9yYF06IHtcbiAgICAgICAgYm9yZGVyQ29sb3I6IG9wdGlvbnMuYWN0aXZlQm9yZGVyQ29sb3IsXG4gICAgICAgIGJveFNoYWRvdzogYDAgMCAwICR7dW5pdChjb250cm9sT3V0bGluZVdpZHRoKX0gJHtvcHRpb25zLmFjdGl2ZU91dGxpbmVDb2xvcn1gLFxuICAgICAgICBvdXRsaW5lOiAwXG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tcHJlZml4YF06IHtcbiAgICAgICAgY29sb3I6IG9wdGlvbnMuY29sb3JcbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xuY29uc3QgZ2VuT3V0bGluZWRTdGF0dXNTdHlsZSA9ICh0b2tlbiwgb3B0aW9ucykgPT4gKHtcbiAgW2AmJHt0b2tlbi5jb21wb25lbnRDbHN9LXN0YXR1cy0ke29wdGlvbnMuc3RhdHVzfWBdOiBPYmplY3QuYXNzaWduKHt9LCBnZW5CYXNlT3V0bGluZWRTdHlsZSh0b2tlbiwgb3B0aW9ucykpXG59KTtcbmNvbnN0IGdlbk91dGxpbmVkU3R5bGUgPSB0b2tlbiA9PiAoe1xuICAnJi1vdXRsaW5lZCc6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGdlbkJhc2VPdXRsaW5lZFN0eWxlKHRva2VuLCB7XG4gICAgYm9yZGVyQ29sb3I6IHRva2VuLmNvbG9yQm9yZGVyLFxuICAgIGhvdmVyQm9yZGVySG92ZXI6IHRva2VuLmhvdmVyQm9yZGVyQ29sb3IsXG4gICAgYWN0aXZlQm9yZGVyQ29sb3I6IHRva2VuLmFjdGl2ZUJvcmRlckNvbG9yLFxuICAgIGFjdGl2ZU91dGxpbmVDb2xvcjogdG9rZW4uYWN0aXZlT3V0bGluZUNvbG9yLFxuICAgIGNvbG9yOiB0b2tlbi5jb2xvclRleHRcbiAgfSkpLCBnZW5PdXRsaW5lZFN0YXR1c1N0eWxlKHRva2VuLCB7XG4gICAgc3RhdHVzOiAnZXJyb3InLFxuICAgIGJvcmRlckNvbG9yOiB0b2tlbi5jb2xvckVycm9yLFxuICAgIGhvdmVyQm9yZGVySG92ZXI6IHRva2VuLmNvbG9yRXJyb3JIb3ZlcixcbiAgICBhY3RpdmVCb3JkZXJDb2xvcjogdG9rZW4uY29sb3JFcnJvcixcbiAgICBhY3RpdmVPdXRsaW5lQ29sb3I6IHRva2VuLmNvbG9yRXJyb3JPdXRsaW5lLFxuICAgIGNvbG9yOiB0b2tlbi5jb2xvckVycm9yXG4gIH0pKSwgZ2VuT3V0bGluZWRTdGF0dXNTdHlsZSh0b2tlbiwge1xuICAgIHN0YXR1czogJ3dhcm5pbmcnLFxuICAgIGJvcmRlckNvbG9yOiB0b2tlbi5jb2xvcldhcm5pbmcsXG4gICAgaG92ZXJCb3JkZXJIb3ZlcjogdG9rZW4uY29sb3JXYXJuaW5nSG92ZXIsXG4gICAgYWN0aXZlQm9yZGVyQ29sb3I6IHRva2VuLmNvbG9yV2FybmluZyxcbiAgICBhY3RpdmVPdXRsaW5lQ29sb3I6IHRva2VuLmNvbG9yV2FybmluZ091dGxpbmUsXG4gICAgY29sb3I6IHRva2VuLmNvbG9yV2FybmluZ1xuICB9KSksIHtcbiAgICBbYCYke3Rva2VuLmNvbXBvbmVudENsc30tZGlzYWJsZWRgXToge1xuICAgICAgW2AmOm5vdCgke3Rva2VuLmNvbXBvbmVudENsc30tY3VzdG9taXplLWlucHV0KSAke3Rva2VuLmNvbXBvbmVudENsc30tc2VsZWN0b3JgXToge1xuICAgICAgICBiYWNrZ3JvdW5kOiB0b2tlbi5jb2xvckJnQ29udGFpbmVyRGlzYWJsZWQsXG4gICAgICAgIGNvbG9yOiB0b2tlbi5jb2xvclRleHREaXNhYmxlZFxuICAgICAgfVxuICAgIH0sXG4gICAgW2AmJHt0b2tlbi5jb21wb25lbnRDbHN9LW11bHRpcGxlICR7dG9rZW4uY29tcG9uZW50Q2xzfS1zZWxlY3Rpb24taXRlbWBdOiB7XG4gICAgICBiYWNrZ3JvdW5kOiB0b2tlbi5tdWx0aXBsZUl0ZW1CZyxcbiAgICAgIGJvcmRlcjogYCR7dW5pdCh0b2tlbi5saW5lV2lkdGgpfSAke3Rva2VuLmxpbmVUeXBlfSAke3Rva2VuLm11bHRpcGxlSXRlbUJvcmRlckNvbG9yfWBcbiAgICB9XG4gIH0pXG59KTtcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyA9PSAgICAgICAgICAgICAgICAgICBGaWxsZWQgICAgICAgICAgICAgICAgICAgICAgICA9PVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmNvbnN0IGdlbkJhc2VGaWxsZWRTdHlsZSA9ICh0b2tlbiwgb3B0aW9ucykgPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzLFxuICAgIGFudENsc1xuICB9ID0gdG9rZW47XG4gIHJldHVybiB7XG4gICAgW2AmOm5vdCgke2NvbXBvbmVudENsc30tY3VzdG9taXplLWlucHV0KSAke2NvbXBvbmVudENsc30tc2VsZWN0b3JgXToge1xuICAgICAgYmFja2dyb3VuZDogb3B0aW9ucy5iZyxcbiAgICAgIGJvcmRlcjogYCR7dW5pdCh0b2tlbi5saW5lV2lkdGgpfSAke3Rva2VuLmxpbmVUeXBlfSB0cmFuc3BhcmVudGAsXG4gICAgICBjb2xvcjogb3B0aW9ucy5jb2xvclxuICAgIH0sXG4gICAgW2AmOm5vdCgke2NvbXBvbmVudENsc30tZGlzYWJsZWQpOm5vdCgke2NvbXBvbmVudENsc30tY3VzdG9taXplLWlucHV0KTpub3QoJHthbnRDbHN9LXBhZ2luYXRpb24tc2l6ZS1jaGFuZ2VyKWBdOiB7XG4gICAgICBbYCY6aG92ZXIgJHtjb21wb25lbnRDbHN9LXNlbGVjdG9yYF06IHtcbiAgICAgICAgYmFja2dyb3VuZDogb3B0aW9ucy5ob3ZlckJnXG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tZm9jdXNlZCYgJHtjb21wb25lbnRDbHN9LXNlbGVjdG9yYF06IHtcbiAgICAgICAgYmFja2dyb3VuZDogdG9rZW4uc2VsZWN0b3JCZyxcbiAgICAgICAgYm9yZGVyQ29sb3I6IG9wdGlvbnMuYWN0aXZlQm9yZGVyQ29sb3IsXG4gICAgICAgIG91dGxpbmU6IDBcbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xuY29uc3QgZ2VuRmlsbGVkU3RhdHVzU3R5bGUgPSAodG9rZW4sIG9wdGlvbnMpID0+ICh7XG4gIFtgJiR7dG9rZW4uY29tcG9uZW50Q2xzfS1zdGF0dXMtJHtvcHRpb25zLnN0YXR1c31gXTogT2JqZWN0LmFzc2lnbih7fSwgZ2VuQmFzZUZpbGxlZFN0eWxlKHRva2VuLCBvcHRpb25zKSlcbn0pO1xuY29uc3QgZ2VuRmlsbGVkU3R5bGUgPSB0b2tlbiA9PiAoe1xuICAnJi1maWxsZWQnOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBnZW5CYXNlRmlsbGVkU3R5bGUodG9rZW4sIHtcbiAgICBiZzogdG9rZW4uY29sb3JGaWxsVGVydGlhcnksXG4gICAgaG92ZXJCZzogdG9rZW4uY29sb3JGaWxsU2Vjb25kYXJ5LFxuICAgIGFjdGl2ZUJvcmRlckNvbG9yOiB0b2tlbi5hY3RpdmVCb3JkZXJDb2xvcixcbiAgICBjb2xvcjogdG9rZW4uY29sb3JUZXh0XG4gIH0pKSwgZ2VuRmlsbGVkU3RhdHVzU3R5bGUodG9rZW4sIHtcbiAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgYmc6IHRva2VuLmNvbG9yRXJyb3JCZyxcbiAgICBob3ZlckJnOiB0b2tlbi5jb2xvckVycm9yQmdIb3ZlcixcbiAgICBhY3RpdmVCb3JkZXJDb2xvcjogdG9rZW4uY29sb3JFcnJvcixcbiAgICBjb2xvcjogdG9rZW4uY29sb3JFcnJvclxuICB9KSksIGdlbkZpbGxlZFN0YXR1c1N0eWxlKHRva2VuLCB7XG4gICAgc3RhdHVzOiAnd2FybmluZycsXG4gICAgYmc6IHRva2VuLmNvbG9yV2FybmluZ0JnLFxuICAgIGhvdmVyQmc6IHRva2VuLmNvbG9yV2FybmluZ0JnSG92ZXIsXG4gICAgYWN0aXZlQm9yZGVyQ29sb3I6IHRva2VuLmNvbG9yV2FybmluZyxcbiAgICBjb2xvcjogdG9rZW4uY29sb3JXYXJuaW5nXG4gIH0pKSwge1xuICAgIFtgJiR7dG9rZW4uY29tcG9uZW50Q2xzfS1kaXNhYmxlZGBdOiB7XG4gICAgICBbYCY6bm90KCR7dG9rZW4uY29tcG9uZW50Q2xzfS1jdXN0b21pemUtaW5wdXQpICR7dG9rZW4uY29tcG9uZW50Q2xzfS1zZWxlY3RvcmBdOiB7XG4gICAgICAgIGJvcmRlckNvbG9yOiB0b2tlbi5jb2xvckJvcmRlcixcbiAgICAgICAgYmFja2dyb3VuZDogdG9rZW4uY29sb3JCZ0NvbnRhaW5lckRpc2FibGVkLFxuICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JUZXh0RGlzYWJsZWRcbiAgICAgIH1cbiAgICB9LFxuICAgIFtgJiR7dG9rZW4uY29tcG9uZW50Q2xzfS1tdWx0aXBsZSAke3Rva2VuLmNvbXBvbmVudENsc30tc2VsZWN0aW9uLWl0ZW1gXToge1xuICAgICAgYmFja2dyb3VuZDogdG9rZW4uY29sb3JCZ0NvbnRhaW5lcixcbiAgICAgIGJvcmRlcjogYCR7dW5pdCh0b2tlbi5saW5lV2lkdGgpfSAke3Rva2VuLmxpbmVUeXBlfSAke3Rva2VuLmNvbG9yU3BsaXR9YFxuICAgIH1cbiAgfSlcbn0pO1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vID09ICAgICAgICAgICAgICAgICBCb3JkZXJsZXNzICAgICAgICAgICAgICAgICAgICAgID09XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuY29uc3QgZ2VuQm9yZGVybGVzc1N0eWxlID0gdG9rZW4gPT4gKHtcbiAgJyYtYm9yZGVybGVzcyc6IHtcbiAgICBbYCR7dG9rZW4uY29tcG9uZW50Q2xzfS1zZWxlY3RvcmBdOiB7XG4gICAgICBiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnLFxuICAgICAgYm9yZGVyOiBgJHt1bml0KHRva2VuLmxpbmVXaWR0aCl9ICR7dG9rZW4ubGluZVR5cGV9IHRyYW5zcGFyZW50YFxuICAgIH0sXG4gICAgW2AmJHt0b2tlbi5jb21wb25lbnRDbHN9LWRpc2FibGVkYF06IHtcbiAgICAgIFtgJjpub3QoJHt0b2tlbi5jb21wb25lbnRDbHN9LWN1c3RvbWl6ZS1pbnB1dCkgJHt0b2tlbi5jb21wb25lbnRDbHN9LXNlbGVjdG9yYF06IHtcbiAgICAgICAgY29sb3I6IHRva2VuLmNvbG9yVGV4dERpc2FibGVkXG4gICAgICB9XG4gICAgfSxcbiAgICBbYCYke3Rva2VuLmNvbXBvbmVudENsc30tbXVsdGlwbGUgJHt0b2tlbi5jb21wb25lbnRDbHN9LXNlbGVjdGlvbi1pdGVtYF06IHtcbiAgICAgIGJhY2tncm91bmQ6IHRva2VuLm11bHRpcGxlSXRlbUJnLFxuICAgICAgYm9yZGVyOiBgJHt1bml0KHRva2VuLmxpbmVXaWR0aCl9ICR7dG9rZW4ubGluZVR5cGV9ICR7dG9rZW4ubXVsdGlwbGVJdGVtQm9yZGVyQ29sb3J9YFxuICAgIH0sXG4gICAgLy8gU3RhdHVzXG4gICAgW2AmJHt0b2tlbi5jb21wb25lbnRDbHN9LXN0YXR1cy1lcnJvcmBdOiB7XG4gICAgICBbYCR7dG9rZW4uY29tcG9uZW50Q2xzfS1wcmVmaXgsICR7dG9rZW4uY29tcG9uZW50Q2xzfS1zZWxlY3Rpb24taXRlbWBdOiB7XG4gICAgICAgIGNvbG9yOiB0b2tlbi5jb2xvckVycm9yXG4gICAgICB9XG4gICAgfSxcbiAgICBbYCYke3Rva2VuLmNvbXBvbmVudENsc30tc3RhdHVzLXdhcm5pbmdgXToge1xuICAgICAgW2Ake3Rva2VuLmNvbXBvbmVudENsc30tcHJlZml4LCAke3Rva2VuLmNvbXBvbmVudENsc30tc2VsZWN0aW9uLWl0ZW1gXToge1xuICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JXYXJuaW5nXG4gICAgICB9XG4gICAgfVxuICB9XG59KTtcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyA9PSAgICAgICAgICAgICAgICAgVW5kZXJsaW5lZCAgICAgICAgICAgICAgICAgICAgICA9PVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmNvbnN0IGdlbkJhc2VVbmRlcmxpbmVkU3R5bGUgPSAodG9rZW4sIG9wdGlvbnMpID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENscyxcbiAgICBhbnRDbHNcbiAgfSA9IHRva2VuO1xuICByZXR1cm4ge1xuICAgIFtgJjpub3QoJHtjb21wb25lbnRDbHN9LWN1c3RvbWl6ZS1pbnB1dCkgJHtjb21wb25lbnRDbHN9LXNlbGVjdG9yYF06IHtcbiAgICAgIGJvcmRlcldpZHRoOiBgMCAwICR7dW5pdCh0b2tlbi5saW5lV2lkdGgpfSAwYCxcbiAgICAgIGJvcmRlclN0eWxlOiBgbm9uZSBub25lICR7dG9rZW4ubGluZVR5cGV9IG5vbmVgLFxuICAgICAgYm9yZGVyQ29sb3I6IG9wdGlvbnMuYm9yZGVyQ29sb3IsXG4gICAgICBiYWNrZ3JvdW5kOiB0b2tlbi5zZWxlY3RvckJnLFxuICAgICAgYm9yZGVyUmFkaXVzOiAwXG4gICAgfSxcbiAgICBbYCY6bm90KCR7Y29tcG9uZW50Q2xzfS1kaXNhYmxlZCk6bm90KCR7Y29tcG9uZW50Q2xzfS1jdXN0b21pemUtaW5wdXQpOm5vdCgke2FudENsc30tcGFnaW5hdGlvbi1zaXplLWNoYW5nZXIpYF06IHtcbiAgICAgIFtgJjpob3ZlciAke2NvbXBvbmVudENsc30tc2VsZWN0b3JgXToge1xuICAgICAgICBib3JkZXJDb2xvcjogb3B0aW9ucy5ob3ZlckJvcmRlckhvdmVyXG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tZm9jdXNlZCYgJHtjb21wb25lbnRDbHN9LXNlbGVjdG9yYF06IHtcbiAgICAgICAgYm9yZGVyQ29sb3I6IG9wdGlvbnMuYWN0aXZlQm9yZGVyQ29sb3IsXG4gICAgICAgIG91dGxpbmU6IDBcbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1wcmVmaXhgXToge1xuICAgICAgICBjb2xvcjogb3B0aW9ucy5jb2xvclxuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG5jb25zdCBnZW5VbmRlcmxpbmVkU3RhdHVzU3R5bGUgPSAodG9rZW4sIG9wdGlvbnMpID0+ICh7XG4gIFtgJiR7dG9rZW4uY29tcG9uZW50Q2xzfS1zdGF0dXMtJHtvcHRpb25zLnN0YXR1c31gXTogT2JqZWN0LmFzc2lnbih7fSwgZ2VuQmFzZVVuZGVybGluZWRTdHlsZSh0b2tlbiwgb3B0aW9ucykpXG59KTtcbmNvbnN0IGdlblVuZGVybGluZWRTdHlsZSA9IHRva2VuID0+ICh7XG4gICcmLXVuZGVybGluZWQnOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBnZW5CYXNlVW5kZXJsaW5lZFN0eWxlKHRva2VuLCB7XG4gICAgYm9yZGVyQ29sb3I6IHRva2VuLmNvbG9yQm9yZGVyLFxuICAgIGhvdmVyQm9yZGVySG92ZXI6IHRva2VuLmhvdmVyQm9yZGVyQ29sb3IsXG4gICAgYWN0aXZlQm9yZGVyQ29sb3I6IHRva2VuLmFjdGl2ZUJvcmRlckNvbG9yLFxuICAgIGFjdGl2ZU91dGxpbmVDb2xvcjogdG9rZW4uYWN0aXZlT3V0bGluZUNvbG9yLFxuICAgIGNvbG9yOiB0b2tlbi5jb2xvclRleHRcbiAgfSkpLCBnZW5VbmRlcmxpbmVkU3RhdHVzU3R5bGUodG9rZW4sIHtcbiAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgYm9yZGVyQ29sb3I6IHRva2VuLmNvbG9yRXJyb3IsXG4gICAgaG92ZXJCb3JkZXJIb3ZlcjogdG9rZW4uY29sb3JFcnJvckhvdmVyLFxuICAgIGFjdGl2ZUJvcmRlckNvbG9yOiB0b2tlbi5jb2xvckVycm9yLFxuICAgIGFjdGl2ZU91dGxpbmVDb2xvcjogdG9rZW4uY29sb3JFcnJvck91dGxpbmUsXG4gICAgY29sb3I6IHRva2VuLmNvbG9yRXJyb3JcbiAgfSkpLCBnZW5VbmRlcmxpbmVkU3RhdHVzU3R5bGUodG9rZW4sIHtcbiAgICBzdGF0dXM6ICd3YXJuaW5nJyxcbiAgICBib3JkZXJDb2xvcjogdG9rZW4uY29sb3JXYXJuaW5nLFxuICAgIGhvdmVyQm9yZGVySG92ZXI6IHRva2VuLmNvbG9yV2FybmluZ0hvdmVyLFxuICAgIGFjdGl2ZUJvcmRlckNvbG9yOiB0b2tlbi5jb2xvcldhcm5pbmcsXG4gICAgYWN0aXZlT3V0bGluZUNvbG9yOiB0b2tlbi5jb2xvcldhcm5pbmdPdXRsaW5lLFxuICAgIGNvbG9yOiB0b2tlbi5jb2xvcldhcm5pbmdcbiAgfSkpLCB7XG4gICAgW2AmJHt0b2tlbi5jb21wb25lbnRDbHN9LWRpc2FibGVkYF06IHtcbiAgICAgIFtgJjpub3QoJHt0b2tlbi5jb21wb25lbnRDbHN9LWN1c3RvbWl6ZS1pbnB1dCkgJHt0b2tlbi5jb21wb25lbnRDbHN9LXNlbGVjdG9yYF06IHtcbiAgICAgICAgY29sb3I6IHRva2VuLmNvbG9yVGV4dERpc2FibGVkXG4gICAgICB9XG4gICAgfSxcbiAgICBbYCYke3Rva2VuLmNvbXBvbmVudENsc30tbXVsdGlwbGUgJHt0b2tlbi5jb21wb25lbnRDbHN9LXNlbGVjdGlvbi1pdGVtYF06IHtcbiAgICAgIGJhY2tncm91bmQ6IHRva2VuLm11bHRpcGxlSXRlbUJnLFxuICAgICAgYm9yZGVyOiBgJHt1bml0KHRva2VuLmxpbmVXaWR0aCl9ICR7dG9rZW4ubGluZVR5cGV9ICR7dG9rZW4ubXVsdGlwbGVJdGVtQm9yZGVyQ29sb3J9YFxuICAgIH1cbiAgfSlcbn0pO1xuY29uc3QgZ2VuVmFyaWFudHNTdHlsZSA9IHRva2VuID0+ICh7XG4gIFt0b2tlbi5jb21wb25lbnRDbHNdOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBnZW5PdXRsaW5lZFN0eWxlKHRva2VuKSksIGdlbkZpbGxlZFN0eWxlKHRva2VuKSksIGdlbkJvcmRlcmxlc3NTdHlsZSh0b2tlbikpLCBnZW5VbmRlcmxpbmVkU3R5bGUodG9rZW4pKVxufSk7XG5leHBvcnQgZGVmYXVsdCBnZW5WYXJpYW50c1N0eWxlOyIsICJpbXBvcnQgeyByZXNldENvbXBvbmVudCwgcmVzZXRJY29uLCB0ZXh0RWxsaXBzaXMgfSBmcm9tICcuLi8uLi9zdHlsZSc7XG5pbXBvcnQgeyBnZW5Db21wYWN0SXRlbVN0eWxlIH0gZnJvbSAnLi4vLi4vc3R5bGUvY29tcGFjdC1pdGVtJztcbmltcG9ydCB7IGdlblN0eWxlSG9va3MsIG1lcmdlVG9rZW4gfSBmcm9tICcuLi8uLi90aGVtZS9pbnRlcm5hbCc7XG5pbXBvcnQgZ2VuRHJvcGRvd25TdHlsZSBmcm9tICcuL2Ryb3Bkb3duJztcbmltcG9ydCBnZW5NdWx0aXBsZVN0eWxlIGZyb20gJy4vbXVsdGlwbGUnO1xuaW1wb3J0IGdlblNpbmdsZVN0eWxlIGZyb20gJy4vc2luZ2xlJztcbmltcG9ydCB7IHByZXBhcmVDb21wb25lbnRUb2tlbiB9IGZyb20gJy4vdG9rZW4nO1xuaW1wb3J0IGdlblZhcmlhbnRzU3R5bGUgZnJvbSAnLi92YXJpYW50cyc7XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTZWxlY3RvciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuY29uc3QgZ2VuU2VsZWN0b3JTdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENsc1xuICB9ID0gdG9rZW47XG4gIHJldHVybiB7XG4gICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgdHJhbnNpdGlvbjogYGFsbCAke3Rva2VuLm1vdGlvbkR1cmF0aW9uTWlkfSAke3Rva2VuLm1vdGlvbkVhc2VJbk91dH1gLFxuICAgIGlucHV0OiB7XG4gICAgICBjdXJzb3I6ICdwb2ludGVyJ1xuICAgIH0sXG4gICAgW2Ake2NvbXBvbmVudENsc30tc2hvdy1zZWFyY2gmYF06IHtcbiAgICAgIGN1cnNvcjogJ3RleHQnLFxuICAgICAgaW5wdXQ6IHtcbiAgICAgICAgY3Vyc29yOiAnYXV0bycsXG4gICAgICAgIGNvbG9yOiAnaW5oZXJpdCcsXG4gICAgICAgIGhlaWdodDogJzEwMCUnXG4gICAgICB9XG4gICAgfSxcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS1kaXNhYmxlZCZgXToge1xuICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQnLFxuICAgICAgaW5wdXQ6IHtcbiAgICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQnXG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTdHlsZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyAvKiBSZXNldCBzZWFyY2ggaW5wdXQgc3R5bGUgKi9cbmNvbnN0IGdldFNlYXJjaElucHV0V2l0aG91dEJvcmRlclN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzXG4gIH0gPSB0b2tlbjtcbiAgcmV0dXJuIHtcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS1zZWxlY3Rpb24tc2VhcmNoLWlucHV0YF06IHtcbiAgICAgIG1hcmdpbjogMCxcbiAgICAgIHBhZGRpbmc6IDAsXG4gICAgICBiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnLFxuICAgICAgYm9yZGVyOiAnbm9uZScsXG4gICAgICBvdXRsaW5lOiAnbm9uZScsXG4gICAgICBhcHBlYXJhbmNlOiAnbm9uZScsXG4gICAgICBmb250RmFtaWx5OiAnaW5oZXJpdCcsXG4gICAgICAnJjo6LXdlYmtpdC1zZWFyY2gtY2FuY2VsLWJ1dHRvbic6IHtcbiAgICAgICAgZGlzcGxheTogJ25vbmUnLFxuICAgICAgICBhcHBlYXJhbmNlOiAnbm9uZSdcbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBCYXNlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmNvbnN0IGdlbkJhc2VTdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGFudENscyxcbiAgICBjb21wb25lbnRDbHMsXG4gICAgaW5wdXRQYWRkaW5nSG9yaXpvbnRhbEJhc2UsXG4gICAgaWNvbkNsc1xuICB9ID0gdG9rZW47XG4gIGNvbnN0IGhvdmVyU2hvd0NsZWFyU3R5bGUgPSB7XG4gICAgW2Ake2NvbXBvbmVudENsc30tY2xlYXJgXToge1xuICAgICAgb3BhY2l0eTogMSxcbiAgICAgIGJhY2tncm91bmQ6IHRva2VuLmNvbG9yQmdCYXNlLFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNTAlJ1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBbY29tcG9uZW50Q2xzXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXNldENvbXBvbmVudCh0b2tlbikpLCB7XG4gICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgIGRpc3BsYXk6ICdpbmxpbmUtZmxleCcsXG4gICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgIFtgJjpub3QoJHtjb21wb25lbnRDbHN9LWN1c3RvbWl6ZS1pbnB1dCkgJHtjb21wb25lbnRDbHN9LXNlbGVjdG9yYF06IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZ2VuU2VsZWN0b3JTdHlsZSh0b2tlbikpLCBnZXRTZWFyY2hJbnB1dFdpdGhvdXRCb3JkZXJTdHlsZSh0b2tlbikpLFxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IFNlbGVjdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LXNlbGVjdGlvbi1pdGVtYF06IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIGZsZXg6IDEsXG4gICAgICAgIGZvbnRXZWlnaHQ6ICdub3JtYWwnLFxuICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgdXNlclNlbGVjdDogJ25vbmUnXG4gICAgICB9LCB0ZXh0RWxsaXBzaXMpLCB7XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzQwNDIxXG4gICAgICAgIFtgPiAke2FudENsc30tdHlwb2dyYXBoeWBdOiB7XG4gICAgICAgICAgZGlzcGxheTogJ2lubGluZSdcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBQbGFjZWhvbGRlciA9PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgW2Ake2NvbXBvbmVudENsc30tc2VsZWN0aW9uLXBsYWNlaG9sZGVyYF06IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGV4dEVsbGlwc2lzKSwge1xuICAgICAgICBmbGV4OiAxLFxuICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JUZXh0UGxhY2Vob2xkZXIsXG4gICAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJ1xuICAgICAgfSksXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBBcnJvdyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgW2Ake2NvbXBvbmVudENsc30tYXJyb3dgXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXNldEljb24oKSksIHtcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgIHRvcDogJzUwJScsXG4gICAgICAgIGluc2V0SW5saW5lU3RhcnQ6ICdhdXRvJyxcbiAgICAgICAgaW5zZXRJbmxpbmVFbmQ6IGlucHV0UGFkZGluZ0hvcml6b250YWxCYXNlLFxuICAgICAgICBoZWlnaHQ6IHRva2VuLmZvbnRTaXplSWNvbixcbiAgICAgICAgbWFyZ2luVG9wOiB0b2tlbi5jYWxjKHRva2VuLmZvbnRTaXplSWNvbikubXVsKC0xKS5kaXYoMikuZXF1YWwoKSxcbiAgICAgICAgY29sb3I6IHRva2VuLmNvbG9yVGV4dFF1YXRlcm5hcnksXG4gICAgICAgIGZvbnRTaXplOiB0b2tlbi5mb250U2l6ZUljb24sXG4gICAgICAgIGxpbmVIZWlnaHQ6IDEsXG4gICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgdHJhbnNpdGlvbjogYG9wYWNpdHkgJHt0b2tlbi5tb3Rpb25EdXJhdGlvblNsb3d9IGVhc2VgLFxuICAgICAgICBbaWNvbkNsc106IHtcbiAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiAndG9wJyxcbiAgICAgICAgICB0cmFuc2l0aW9uOiBgdHJhbnNmb3JtICR7dG9rZW4ubW90aW9uRHVyYXRpb25TbG93fWAsXG4gICAgICAgICAgJz4gc3ZnJzoge1xuICAgICAgICAgICAgdmVydGljYWxBbGlnbjogJ3RvcCdcbiAgICAgICAgICB9LFxuICAgICAgICAgIFtgJjpub3QoJHtjb21wb25lbnRDbHN9LXN1ZmZpeClgXToge1xuICAgICAgICAgICAgcG9pbnRlckV2ZW50czogJ2F1dG8nXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1kaXNhYmxlZCAmYF06IHtcbiAgICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCdcbiAgICAgICAgfSxcbiAgICAgICAgJz4gKjpub3QoOmxhc3QtY2hpbGQpJzoge1xuICAgICAgICAgIG1hcmdpbklubGluZUVuZDogOCAvLyBGSVhNRTogbWFnaWNcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBXcmFwID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgW2Ake2NvbXBvbmVudENsc30tc2VsZWN0aW9uLXdyYXBgXToge1xuICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgICBtaW5XaWR0aDogMCxcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvNTE2NjlcbiAgICAgICAgJyY6YWZ0ZXInOiB7XG4gICAgICAgICAgY29udGVudDogJ1wiXFxcXGEwXCInLFxuICAgICAgICAgIHdpZHRoOiAwLFxuICAgICAgICAgIG92ZXJmbG93OiAnaGlkZGVuJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBQcmVmaXggPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LXByZWZpeGBdOiB7XG4gICAgICAgIGZsZXg6ICdub25lJyxcbiAgICAgICAgbWFyZ2luSW5saW5lRW5kOiB0b2tlbi5zZWxlY3RBZmZpeFBhZGRpbmdcbiAgICAgIH0sXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBDbGVhciA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgW2Ake2NvbXBvbmVudENsc30tY2xlYXJgXToge1xuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgdG9wOiAnNTAlJyxcbiAgICAgICAgaW5zZXRJbmxpbmVTdGFydDogJ2F1dG8nLFxuICAgICAgICBpbnNldElubGluZUVuZDogaW5wdXRQYWRkaW5nSG9yaXpvbnRhbEJhc2UsXG4gICAgICAgIHpJbmRleDogMSxcbiAgICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICAgIHdpZHRoOiB0b2tlbi5mb250U2l6ZUljb24sXG4gICAgICAgIGhlaWdodDogdG9rZW4uZm9udFNpemVJY29uLFxuICAgICAgICBtYXJnaW5Ub3A6IHRva2VuLmNhbGModG9rZW4uZm9udFNpemVJY29uKS5tdWwoLTEpLmRpdigyKS5lcXVhbCgpLFxuICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JUZXh0UXVhdGVybmFyeSxcbiAgICAgICAgZm9udFNpemU6IHRva2VuLmZvbnRTaXplSWNvbixcbiAgICAgICAgZm9udFN0eWxlOiAnbm9ybWFsJyxcbiAgICAgICAgbGluZUhlaWdodDogMSxcbiAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgdGV4dFRyYW5zZm9ybTogJ25vbmUnLFxuICAgICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgICAgb3BhY2l0eTogMCxcbiAgICAgICAgdHJhbnNpdGlvbjogYGNvbG9yICR7dG9rZW4ubW90aW9uRHVyYXRpb25NaWR9IGVhc2UsIG9wYWNpdHkgJHt0b2tlbi5tb3Rpb25EdXJhdGlvblNsb3d9IGVhc2VgLFxuICAgICAgICB0ZXh0UmVuZGVyaW5nOiAnYXV0bycsXG4gICAgICAgICcmOmJlZm9yZSc6IHtcbiAgICAgICAgICBkaXNwbGF5OiAnYmxvY2snXG4gICAgICAgIH0sXG4gICAgICAgICcmOmhvdmVyJzoge1xuICAgICAgICAgIGNvbG9yOiB0b2tlbi5jb2xvckljb25cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICdAbWVkaWEoaG92ZXI6bm9uZSknOiBob3ZlclNob3dDbGVhclN0eWxlLFxuICAgICAgJyY6aG92ZXInOiBob3ZlclNob3dDbGVhclN0eWxlXG4gICAgfSksXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBGZWVkYmFjayA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIFtgJHtjb21wb25lbnRDbHN9LXN0YXR1c2BdOiB7XG4gICAgICAnJi1lcnJvciwgJi13YXJuaW5nLCAmLXN1Y2Nlc3MsICYtdmFsaWRhdGluZyc6IHtcbiAgICAgICAgW2AmJHtjb21wb25lbnRDbHN9LWhhcy1mZWVkYmFja2BdOiB7XG4gICAgICAgICAgW2Ake2NvbXBvbmVudENsc30tY2xlYXJgXToge1xuICAgICAgICAgICAgaW5zZXRJbmxpbmVFbmQ6IHRva2VuLmNhbGMoaW5wdXRQYWRkaW5nSG9yaXpvbnRhbEJhc2UpLmFkZCh0b2tlbi5mb250U2l6ZSkuYWRkKHRva2VuLnBhZGRpbmdYUykuZXF1YWwoKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU3R5bGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuY29uc3QgZ2VuU2VsZWN0U3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHNcbiAgfSA9IHRva2VuO1xuICByZXR1cm4gW3tcbiAgICBbY29tcG9uZW50Q2xzXToge1xuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT0gSW4gRm9ybSA9PT09PT09PT09PT09PT09PT09PVxuICAgICAgW2AmJHtjb21wb25lbnRDbHN9LWluLWZvcm0taXRlbWBdOiB7XG4gICAgICAgIHdpZHRoOiAnMTAwJSdcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vID09ICAgICAgICAgICAgICAgICAgICAgICBMVFIgICAgICAgICAgICAgICAgICAgICAgID09XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEJhc2VcbiAgZ2VuQmFzZVN0eWxlKHRva2VuKSxcbiAgLy8gU2luZ2xlXG4gIGdlblNpbmdsZVN0eWxlKHRva2VuKSxcbiAgLy8gTXVsdGlwbGVcbiAgZ2VuTXVsdGlwbGVTdHlsZSh0b2tlbiksXG4gIC8vIERyb3Bkb3duXG4gIGdlbkRyb3Bkb3duU3R5bGUodG9rZW4pLFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyA9PSAgICAgICAgICAgICAgICAgICAgICAgUlRMICAgICAgICAgICAgICAgICAgICAgICA9PVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB7XG4gICAgW2Ake2NvbXBvbmVudENsc30tcnRsYF06IHtcbiAgICAgIGRpcmVjdGlvbjogJ3J0bCdcbiAgICB9XG4gIH0sXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vID09ICAgICAgICAgICAgIFNwYWNlIENvbXBhY3QgICAgICAgICAgICAgICAgICAgICAgID09XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGdlbkNvbXBhY3RJdGVtU3R5bGUodG9rZW4sIHtcbiAgICBib3JkZXJFbENsczogYCR7Y29tcG9uZW50Q2xzfS1zZWxlY3RvcmAsXG4gICAgZm9jdXNFbENsczogYCR7Y29tcG9uZW50Q2xzfS1mb2N1c2VkYFxuICB9KV07XG59O1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEV4cG9ydCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmV4cG9ydCBkZWZhdWx0IGdlblN0eWxlSG9va3MoJ1NlbGVjdCcsICh0b2tlbiwgX3JlZikgPT4ge1xuICBsZXQge1xuICAgIHJvb3RQcmVmaXhDbHNcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IHNlbGVjdFRva2VuID0gbWVyZ2VUb2tlbih0b2tlbiwge1xuICAgIHJvb3RQcmVmaXhDbHMsXG4gICAgaW5wdXRQYWRkaW5nSG9yaXpvbnRhbEJhc2U6IHRva2VuLmNhbGModG9rZW4ucGFkZGluZ1NNKS5zdWIoMSkuZXF1YWwoKSxcbiAgICBtdWx0aXBsZVNlbGVjdEl0ZW1IZWlnaHQ6IHRva2VuLm11bHRpcGxlSXRlbUhlaWdodCxcbiAgICBzZWxlY3RIZWlnaHQ6IHRva2VuLmNvbnRyb2xIZWlnaHRcbiAgfSk7XG4gIHJldHVybiBbZ2VuU2VsZWN0U3R5bGUoc2VsZWN0VG9rZW4pLCBnZW5WYXJpYW50c1N0eWxlKHNlbGVjdFRva2VuKV07XG59LCBwcmVwYXJlQ29tcG9uZW50VG9rZW4sIHtcbiAgdW5pdGxlc3M6IHtcbiAgICBvcHRpb25MaW5lSGVpZ2h0OiB0cnVlLFxuICAgIG9wdGlvblNlbGVjdGVkRm9udFdlaWdodDogdHJ1ZVxuICB9XG59KTsiLCAiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBDaGVja091dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9DaGVja091dGxpbmVkXCI7XG5pbXBvcnQgQ2xvc2VDaXJjbGVGaWxsZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0Nsb3NlQ2lyY2xlRmlsbGVkXCI7XG5pbXBvcnQgQ2xvc2VPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvQ2xvc2VPdXRsaW5lZFwiO1xuaW1wb3J0IERvd25PdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvRG93bk91dGxpbmVkXCI7XG5pbXBvcnQgTG9hZGluZ091dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9Mb2FkaW5nT3V0bGluZWRcIjtcbmltcG9ydCBTZWFyY2hPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvU2VhcmNoT3V0bGluZWRcIjtcbmltcG9ydCB7IGRldlVzZVdhcm5pbmcgfSBmcm9tICcuLi9fdXRpbC93YXJuaW5nJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUljb25zKF9yZWYpIHtcbiAgbGV0IHtcbiAgICBzdWZmaXhJY29uLFxuICAgIGNsZWFySWNvbixcbiAgICBtZW51SXRlbVNlbGVjdGVkSWNvbixcbiAgICByZW1vdmVJY29uLFxuICAgIGxvYWRpbmcsXG4gICAgbXVsdGlwbGUsXG4gICAgaGFzRmVlZGJhY2ssXG4gICAgcHJlZml4Q2xzLFxuICAgIHNob3dTdWZmaXhJY29uLFxuICAgIGZlZWRiYWNrSWNvbixcbiAgICBzaG93QXJyb3csXG4gICAgY29tcG9uZW50TmFtZVxuICB9ID0gX3JlZjtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBjb25zdCB3YXJuaW5nID0gZGV2VXNlV2FybmluZyhjb21wb25lbnROYW1lKTtcbiAgICB3YXJuaW5nLmRlcHJlY2F0ZWQoIWNsZWFySWNvbiwgJ2NsZWFySWNvbicsICdhbGxvd0NsZWFyPXt7IGNsZWFySWNvbjogUmVhY3QuUmVhY3ROb2RlIH19Jyk7XG4gIH1cbiAgLy8gQ2xlYXIgSWNvblxuICBjb25zdCBtZXJnZWRDbGVhckljb24gPSBjbGVhckljb24gIT09IG51bGwgJiYgY2xlYXJJY29uICE9PSB2b2lkIDAgPyBjbGVhckljb24gOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDbG9zZUNpcmNsZUZpbGxlZCwgbnVsbCk7XG4gIC8vIFZhbGlkYXRpb24gRmVlZGJhY2sgSWNvblxuICBjb25zdCBnZXRTdWZmaXhJY29uTm9kZSA9IGFycm93SWNvbiA9PiB7XG4gICAgaWYgKHN1ZmZpeEljb24gPT09IG51bGwgJiYgIWhhc0ZlZWRiYWNrICYmICFzaG93QXJyb3cpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIHNob3dTdWZmaXhJY29uICE9PSBmYWxzZSAmJiBhcnJvd0ljb24sIGhhc0ZlZWRiYWNrICYmIGZlZWRiYWNrSWNvbik7XG4gIH07XG4gIC8vIEFycm93IGl0ZW0gaWNvblxuICBsZXQgbWVyZ2VkU3VmZml4SWNvbiA9IG51bGw7XG4gIGlmIChzdWZmaXhJY29uICE9PSB1bmRlZmluZWQpIHtcbiAgICBtZXJnZWRTdWZmaXhJY29uID0gZ2V0U3VmZml4SWNvbk5vZGUoc3VmZml4SWNvbik7XG4gIH0gZWxzZSBpZiAobG9hZGluZykge1xuICAgIG1lcmdlZFN1ZmZpeEljb24gPSBnZXRTdWZmaXhJY29uTm9kZSgvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMb2FkaW5nT3V0bGluZWQsIHtcbiAgICAgIHNwaW46IHRydWVcbiAgICB9KSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgaWNvbkNscyA9IGAke3ByZWZpeENsc30tc3VmZml4YDtcbiAgICBtZXJnZWRTdWZmaXhJY29uID0gX3JlZjIgPT4ge1xuICAgICAgbGV0IHtcbiAgICAgICAgb3BlbixcbiAgICAgICAgc2hvd1NlYXJjaFxuICAgICAgfSA9IF9yZWYyO1xuICAgICAgaWYgKG9wZW4gJiYgc2hvd1NlYXJjaCkge1xuICAgICAgICByZXR1cm4gZ2V0U3VmZml4SWNvbk5vZGUoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU2VhcmNoT3V0bGluZWQsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IGljb25DbHNcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGdldFN1ZmZpeEljb25Ob2RlKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERvd25PdXRsaW5lZCwge1xuICAgICAgICBjbGFzc05hbWU6IGljb25DbHNcbiAgICAgIH0pKTtcbiAgICB9O1xuICB9XG4gIC8vIENoZWNrZWQgaXRlbSBpY29uXG4gIGxldCBtZXJnZWRJdGVtSWNvbiA9IG51bGw7XG4gIGlmIChtZW51SXRlbVNlbGVjdGVkSWNvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbWVyZ2VkSXRlbUljb24gPSBtZW51SXRlbVNlbGVjdGVkSWNvbjtcbiAgfSBlbHNlIGlmIChtdWx0aXBsZSkge1xuICAgIG1lcmdlZEl0ZW1JY29uID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hlY2tPdXRsaW5lZCwgbnVsbCk7XG4gIH0gZWxzZSB7XG4gICAgbWVyZ2VkSXRlbUljb24gPSBudWxsO1xuICB9XG4gIGxldCBtZXJnZWRSZW1vdmVJY29uID0gbnVsbDtcbiAgaWYgKHJlbW92ZUljb24gIT09IHVuZGVmaW5lZCkge1xuICAgIG1lcmdlZFJlbW92ZUljb24gPSByZW1vdmVJY29uO1xuICB9IGVsc2Uge1xuICAgIG1lcmdlZFJlbW92ZUljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDbG9zZU91dGxpbmVkLCBudWxsKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGNsZWFySWNvbjogbWVyZ2VkQ2xlYXJJY29uLFxuICAgIHN1ZmZpeEljb246IG1lcmdlZFN1ZmZpeEljb24sXG4gICAgaXRlbUljb246IG1lcmdlZEl0ZW1JY29uLFxuICAgIHJlbW92ZUljb246IG1lcmdlZFJlbW92ZUljb25cbiAgfTtcbn0iLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQ2hlY2tPdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9DaGVja091dGxpbmVkXCI7XG5pbXBvcnQgQW50ZEljb24gZnJvbSBcIi4uL2NvbXBvbmVudHMvQW50ZEljb25cIjtcbnZhciBDaGVja091dGxpbmVkID0gZnVuY3Rpb24gQ2hlY2tPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbnRkSWNvbiwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogQ2hlY2tPdXRsaW5lZFN2Z1xuICB9KSk7XG59O1xuXG4vKiohW2NoZWNrXShkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUIzYVdSMGFEMGlOVEFpSUdobGFXZG9kRDBpTlRBaUlHWnBiR3c5SWlOallXTmhZMkVpSUhacFpYZENiM2c5SWpZMElEWTBJRGc1TmlBNE9UWWlJR1p2WTNWellXSnNaVDBpWm1Gc2MyVWlJSGh0Ykc1elBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5SStQSEJoZEdnZ1pEMGlUVGt4TWlBeE9UQm9MVFk1TGpsakxUa3VPQ0F3TFRFNUxqRWdOQzQxTFRJMUxqRWdNVEl1TWt3ME1EUXVOeUEzTWpRdU5TQXlNRGNnTkRjMFlUTXlJRE15SURBZ01EQXRNalV1TVMweE1pNHlTREV4TW1NdE5pNDNJREF0TVRBdU5DQTNMamN0Tmk0eklERXlMamxzTWpjekxqa2dNelEzWXpFeUxqZ2dNVFl1TWlBek55NDBJREUyTGpJZ05UQXVNeUF3YkRRNE9DNDBMVFl4T0M0NVl6UXVNUzAxTGpFdU5DMHhNaTQ0TFRZdU15MHhNaTQ0ZWlJZ0x6NDhMM04yWno0PSkgKi9cbnZhciBSZWZJY29uID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoQ2hlY2tPdXRsaW5lZCk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBSZWZJY29uLmRpc3BsYXlOYW1lID0gJ0NoZWNrT3V0bGluZWQnO1xufVxuZXhwb3J0IGRlZmF1bHQgUmVmSWNvbjsiLCAiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgQ2hlY2tPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNOTEyIDE5MGgtNjkuOWMtOS44IDAtMTkuMSA0LjUtMjUuMSAxMi4yTDQwNC43IDcyNC41IDIwNyA0NzRhMzIgMzIgMCAwMC0yNS4xLTEyLjJIMTEyYy02LjcgMC0xMC40IDcuNy02LjMgMTIuOWwyNzMuOSAzNDdjMTIuOCAxNi4yIDM3LjQgMTYuMiA1MC4zIDBsNDg4LjQtNjE4LjljNC4xLTUuMS40LTEyLjgtNi4zLTEyLjh6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJjaGVja1wiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgQ2hlY2tPdXRsaW5lZDtcbiIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBEb3duT3V0bGluZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vRG93bk91dGxpbmVkXCI7XG5pbXBvcnQgQW50ZEljb24gZnJvbSBcIi4uL2NvbXBvbmVudHMvQW50ZEljb25cIjtcbnZhciBEb3duT3V0bGluZWQgPSBmdW5jdGlvbiBEb3duT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IERvd25PdXRsaW5lZFN2Z1xuICB9KSk7XG59O1xuXG4vKiohW2Rvd25dKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjNhV1IwYUQwaU5UQWlJR2hsYVdkb2REMGlOVEFpSUdacGJHdzlJaU5qWVdOaFkyRWlJSFpwWlhkQ2IzZzlJalkwSURZMElEZzVOaUE0T1RZaUlHWnZZM1Z6WVdKc1pUMGlabUZzYzJVaUlIaHRiRzV6UFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eU1EQXdMM04yWnlJK1BIQmhkR2dnWkQwaVRUZzROQ0F5TlRab0xUYzFZeTAxTGpFZ01DMDVMamtnTWk0MUxURXlMamtnTmk0MlREVXhNaUEyTlRRdU1pQXlNamN1T1NBeU5qSXVObU10TXkwMExqRXROeTQ0TFRZdU5pMHhNaTQ1TFRZdU5tZ3ROelZqTFRZdU5TQXdMVEV3TGpNZ055NDBMVFl1TlNBeE1pNDNiRE0xTWk0MklEUTROaTR4WXpFeUxqZ2dNVGN1TmlBek9TQXhOeTQySURVeExqY2dNR3d6TlRJdU5pMDBPRFl1TVdNekxqa3ROUzR6TGpFdE1USXVOeTAyTGpRdE1USXVOM29pSUM4K1BDOXpkbWMrKSAqL1xudmFyIFJlZkljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihEb3duT3V0bGluZWQpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgUmVmSWNvbi5kaXNwbGF5TmFtZSA9ICdEb3duT3V0bGluZWQnO1xufVxuZXhwb3J0IGRlZmF1bHQgUmVmSWNvbjsiLCAiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgRG93bk91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk04ODQgMjU2aC03NWMtNS4xIDAtOS45IDIuNS0xMi45IDYuNkw1MTIgNjU0LjIgMjI3LjkgMjYyLjZjLTMtNC4xLTcuOC02LjYtMTIuOS02LjZoLTc1Yy02LjUgMC0xMC4zIDcuNC02LjUgMTIuN2wzNTIuNiA0ODYuMWMxMi44IDE3LjYgMzkgMTcuNiA1MS43IDBsMzUyLjYtNDg2LjFjMy45LTUuMy4xLTEyLjctNi40LTEyLjd6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJkb3duXCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnQgZGVmYXVsdCBEb3duT3V0bGluZWQ7XG4iLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgU2VhcmNoT3V0bGluZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vU2VhcmNoT3V0bGluZWRcIjtcbmltcG9ydCBBbnRkSWNvbiBmcm9tIFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiO1xudmFyIFNlYXJjaE91dGxpbmVkID0gZnVuY3Rpb24gU2VhcmNoT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IFNlYXJjaE91dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5cbi8qKiFbc2VhcmNoXShkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUIzYVdSMGFEMGlOVEFpSUdobGFXZG9kRDBpTlRBaUlHWnBiR3c5SWlOallXTmhZMkVpSUhacFpYZENiM2c5SWpZMElEWTBJRGc1TmlBNE9UWWlJR1p2WTNWellXSnNaVDBpWm1Gc2MyVWlJSGh0Ykc1elBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5SStQSEJoZEdnZ1pEMGlUVGt3T1M0MklEZzFOQzQxVERZME9TNDVJRFU1TkM0NFF6WTVNQzR5SURVME1pNDNJRGN4TWlBME56a2dOekV5SURReE1tTXdMVGd3TGpJdE16RXVNeTB4TlRVdU5DMDROeTQ1TFRJeE1pNHhMVFUyTGpZdE5UWXVOeTB4TXpJdE9EY3VPUzB5TVRJdU1TMDROeTQ1Y3kweE5UVXVOU0F6TVM0ekxUSXhNaTR4SURnM0xqbERNVFF6TGpJZ01qVTJMalVnTVRFeUlETXpNUzQ0SURFeE1pQTBNVEpqTUNBNE1DNHhJRE14TGpNZ01UVTFMalVnT0RjdU9TQXlNVEl1TVVNeU5UWXVOU0EyT0RBdU9DQXpNekV1T0NBM01USWdOREV5SURjeE1tTTJOeUF3SURFek1DNDJMVEl4TGpnZ01UZ3lMamN0TmpKc01qVTVMamNnTWpVNUxqWmhPQzR5SURndU1pQXdJREF3TVRFdU5pQXdiRFF6TGpZdE5ETXVOV0U0TGpJZ09DNHlJREFnTURBd0xURXhMalo2VFRVM01DNDBJRFUzTUM0MFF6VXlPQ0EyTVRJdU55QTBOekV1T0NBMk16WWdOREV5SURZek5uTXRNVEUyTFRJekxqTXRNVFU0TGpRdE5qVXVOa015TVRFdU15QTFNamdnTVRnNElEUTNNUzQ0SURFNE9DQTBNVEp6TWpNdU15MHhNVFl1TVNBMk5TNDJMVEUxT0M0MFF6STVOaUF5TVRFdU15QXpOVEl1TWlBeE9EZ2dOREV5SURFNE9ITXhNVFl1TVNBeU15NHlJREUxT0M0MElEWTFMalpUTmpNMklETTFNaTR5SURZek5pQTBNVEp6TFRJekxqTWdNVEUyTGpFdE5qVXVOaUF4TlRndU5Ib2lJQzgrUEM5emRtYyspICovXG52YXIgUmVmSWNvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKFNlYXJjaE91dGxpbmVkKTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFJlZkljb24uZGlzcGxheU5hbWUgPSAnU2VhcmNoT3V0bGluZWQnO1xufVxuZXhwb3J0IGRlZmF1bHQgUmVmSWNvbjsiLCAiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgU2VhcmNoT3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTkwOS42IDg1NC41TDY0OS45IDU5NC44QzY5MC4yIDU0Mi43IDcxMiA0NzkgNzEyIDQxMmMwLTgwLjItMzEuMy0xNTUuNC04Ny45LTIxMi4xLTU2LjYtNTYuNy0xMzItODcuOS0yMTIuMS04Ny45cy0xNTUuNSAzMS4zLTIxMi4xIDg3LjlDMTQzLjIgMjU2LjUgMTEyIDMzMS44IDExMiA0MTJjMCA4MC4xIDMxLjMgMTU1LjUgODcuOSAyMTIuMUMyNTYuNSA2ODAuOCAzMzEuOCA3MTIgNDEyIDcxMmM2NyAwIDEzMC42LTIxLjggMTgyLjctNjJsMjU5LjcgMjU5LjZhOC4yIDguMiAwIDAwMTEuNiAwbDQzLjYtNDMuNWE4LjIgOC4yIDAgMDAwLTExLjZ6TTU3MC40IDU3MC40QzUyOCA2MTIuNyA0NzEuOCA2MzYgNDEyIDYzNnMtMTE2LTIzLjMtMTU4LjQtNjUuNkMyMTEuMyA1MjggMTg4IDQ3MS44IDE4OCA0MTJzMjMuMy0xMTYuMSA2NS42LTE1OC40QzI5NiAyMTEuMyAzNTIuMiAxODggNDEyIDE4OHMxMTYuMSAyMy4yIDE1OC40IDY1LjZTNjM2IDM1Mi4yIDYzNiA0MTJzLTIzLjMgMTE2LjEtNjUuNiAxNTguNHpcIiB9IH1dIH0sIFwibmFtZVwiOiBcInNlYXJjaFwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgU2VhcmNoT3V0bGluZWQ7XG4iLCAiLyoqXG4gKiBTaW5jZSBTZWxlY3QsIFRyZWVTZWxlY3QsIENhc2NhZGVyIGlzIHNhbWUgU2VsZWN0IGxpa2UgY29tcG9uZW50LlxuICogV2UganVzdCB1c2Ugc2FtZSBob29rIHRvIGhhbmRsZSB0aGlzIGxvZ2ljLlxuICpcbiAqIElmIGBzdWZmaXhJY29uYCBpcyBub3QgZXF1YWwgdG8gYG51bGxgLCBhbHdheXMgc2hvdyBpdC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlU2hvd0Fycm93KHN1ZmZpeEljb24sIHNob3dBcnJvdykge1xuICByZXR1cm4gc2hvd0Fycm93ICE9PSB1bmRlZmluZWQgPyBzaG93QXJyb3cgOiBzdWZmaXhJY29uICE9PSBudWxsO1xufSIsICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VGb3JjZVVwZGF0ZSgpIHtcbiAgY29uc3QgWywgZm9yY2VVcGRhdGVdID0gUmVhY3QudXNlUmVkdWNlcih4ID0+IHggKyAxLCAwKTtcbiAgcmV0dXJuIGZvcmNlVXBkYXRlO1xufSIsICJcInVzZSBjbGllbnRcIjtcblxudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFJjVG9vbHRpcCBmcm9tICdyYy10b29sdGlwJztcbmltcG9ydCB1c2VNZXJnZWRTdGF0ZSBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VNZXJnZWRTdGF0ZVwiO1xuaW1wb3J0IENvbnRleHRJc29sYXRvciBmcm9tICcuLi9fdXRpbC9Db250ZXh0SXNvbGF0b3InO1xuaW1wb3J0IHsgdXNlWkluZGV4IH0gZnJvbSAnLi4vX3V0aWwvaG9va3MvdXNlWkluZGV4JztcbmltcG9ydCB7IGdldFRyYW5zaXRpb25OYW1lIH0gZnJvbSAnLi4vX3V0aWwvbW90aW9uJztcbmltcG9ydCBnZXRQbGFjZW1lbnRzIGZyb20gJy4uL191dGlsL3BsYWNlbWVudHMnO1xuaW1wb3J0IHsgY2xvbmVFbGVtZW50LCBpc0ZyYWdtZW50IH0gZnJvbSAnLi4vX3V0aWwvcmVhY3ROb2RlJztcbmltcG9ydCB7IGRldlVzZVdhcm5pbmcgfSBmcm9tICcuLi9fdXRpbC93YXJuaW5nJztcbmltcG9ydCB6SW5kZXhDb250ZXh0IGZyb20gJy4uL191dGlsL3ppbmRleENvbnRleHQnO1xuaW1wb3J0IHsgdXNlQ29tcG9uZW50Q29uZmlnIH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL2NvbnRleHQnO1xuaW1wb3J0IHsgdXNlVG9rZW4gfSBmcm9tICcuLi90aGVtZS9pbnRlcm5hbCc7XG5pbXBvcnQgUHVyZVBhbmVsIGZyb20gJy4vUHVyZVBhbmVsJztcbmltcG9ydCB1c2VTdHlsZSBmcm9tICcuL3N0eWxlJztcbmltcG9ydCB7IHBhcnNlQ29sb3IgfSBmcm9tICcuL3V0aWwnO1xuY29uc3QgSW50ZXJuYWxUb29sdGlwID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHByb3BzLCByZWYpID0+IHtcbiAgdmFyIF9hLCBfYjtcbiAgY29uc3Qge1xuICAgICAgcHJlZml4Q2xzOiBjdXN0b21pemVQcmVmaXhDbHMsXG4gICAgICBvcGVuQ2xhc3NOYW1lLFxuICAgICAgZ2V0VG9vbHRpcENvbnRhaW5lcixcbiAgICAgIGNvbG9yLFxuICAgICAgb3ZlcmxheUlubmVyU3R5bGUsXG4gICAgICBjaGlsZHJlbixcbiAgICAgIGFmdGVyT3BlbkNoYW5nZSxcbiAgICAgIGFmdGVyVmlzaWJsZUNoYW5nZSxcbiAgICAgIGRlc3Ryb3lUb29sdGlwT25IaWRlLFxuICAgICAgZGVzdHJveU9uSGlkZGVuLFxuICAgICAgYXJyb3cgPSB0cnVlLFxuICAgICAgdGl0bGUsXG4gICAgICBvdmVybGF5LFxuICAgICAgYnVpbHRpblBsYWNlbWVudHMsXG4gICAgICBhcnJvd1BvaW50QXRDZW50ZXIgPSBmYWxzZSxcbiAgICAgIGF1dG9BZGp1c3RPdmVyZmxvdyA9IHRydWUsXG4gICAgICBtb3Rpb24sXG4gICAgICBnZXRQb3B1cENvbnRhaW5lcixcbiAgICAgIHBsYWNlbWVudCA9ICd0b3AnLFxuICAgICAgbW91c2VFbnRlckRlbGF5ID0gMC4xLFxuICAgICAgbW91c2VMZWF2ZURlbGF5ID0gMC4xLFxuICAgICAgb3ZlcmxheVN0eWxlLFxuICAgICAgcm9vdENsYXNzTmFtZSxcbiAgICAgIG92ZXJsYXlDbGFzc05hbWUsXG4gICAgICBzdHlsZXMsXG4gICAgICBjbGFzc05hbWVzOiB0b29sdGlwQ2xhc3NOYW1lc1xuICAgIH0gPSBwcm9wcyxcbiAgICByZXN0UHJvcHMgPSBfX3Jlc3QocHJvcHMsIFtcInByZWZpeENsc1wiLCBcIm9wZW5DbGFzc05hbWVcIiwgXCJnZXRUb29sdGlwQ29udGFpbmVyXCIsIFwiY29sb3JcIiwgXCJvdmVybGF5SW5uZXJTdHlsZVwiLCBcImNoaWxkcmVuXCIsIFwiYWZ0ZXJPcGVuQ2hhbmdlXCIsIFwiYWZ0ZXJWaXNpYmxlQ2hhbmdlXCIsIFwiZGVzdHJveVRvb2x0aXBPbkhpZGVcIiwgXCJkZXN0cm95T25IaWRkZW5cIiwgXCJhcnJvd1wiLCBcInRpdGxlXCIsIFwib3ZlcmxheVwiLCBcImJ1aWx0aW5QbGFjZW1lbnRzXCIsIFwiYXJyb3dQb2ludEF0Q2VudGVyXCIsIFwiYXV0b0FkanVzdE92ZXJmbG93XCIsIFwibW90aW9uXCIsIFwiZ2V0UG9wdXBDb250YWluZXJcIiwgXCJwbGFjZW1lbnRcIiwgXCJtb3VzZUVudGVyRGVsYXlcIiwgXCJtb3VzZUxlYXZlRGVsYXlcIiwgXCJvdmVybGF5U3R5bGVcIiwgXCJyb290Q2xhc3NOYW1lXCIsIFwib3ZlcmxheUNsYXNzTmFtZVwiLCBcInN0eWxlc1wiLCBcImNsYXNzTmFtZXNcIl0pO1xuICBjb25zdCBtZXJnZWRTaG93QXJyb3cgPSAhIWFycm93O1xuICBjb25zdCBbLCB0b2tlbl0gPSB1c2VUb2tlbigpO1xuICBjb25zdCB7XG4gICAgZ2V0UG9wdXBDb250YWluZXI6IGdldENvbnRleHRQb3B1cENvbnRhaW5lcixcbiAgICBnZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uLFxuICAgIGNsYXNzTmFtZTogY29udGV4dENsYXNzTmFtZSxcbiAgICBzdHlsZTogY29udGV4dFN0eWxlLFxuICAgIGNsYXNzTmFtZXM6IGNvbnRleHRDbGFzc05hbWVzLFxuICAgIHN0eWxlczogY29udGV4dFN0eWxlc1xuICB9ID0gdXNlQ29tcG9uZW50Q29uZmlnKCd0b29sdGlwJyk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZWYgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCB3YXJuaW5nID0gZGV2VXNlV2FybmluZygnVG9vbHRpcCcpO1xuICBjb25zdCB0b29sdGlwUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBjb25zdCBmb3JjZUFsaWduID0gKCkgPT4ge1xuICAgIHZhciBfYTtcbiAgICAoX2EgPSB0b29sdGlwUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5mb3JjZUFsaWduKCk7XG4gIH07XG4gIFJlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4ge1xuICAgICAgZm9yY2VBbGlnbixcbiAgICAgIGZvcmNlUG9wdXBBbGlnbjogKCkgPT4ge1xuICAgICAgICB3YXJuaW5nLmRlcHJlY2F0ZWQoZmFsc2UsICdmb3JjZVBvcHVwQWxpZ24nLCAnZm9yY2VBbGlnbicpO1xuICAgICAgICBmb3JjZUFsaWduKCk7XG4gICAgICB9LFxuICAgICAgbmF0aXZlRWxlbWVudDogKF9hID0gdG9vbHRpcFJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubmF0aXZlRWxlbWVudCxcbiAgICAgIHBvcHVwRWxlbWVudDogKF9iID0gdG9vbHRpcFJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IucG9wdXBFbGVtZW50XG4gICAgfTtcbiAgfSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBXYXJuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIFtbJ3Zpc2libGUnLCAnb3BlbiddLCBbJ2RlZmF1bHRWaXNpYmxlJywgJ2RlZmF1bHRPcGVuJ10sIFsnb25WaXNpYmxlQ2hhbmdlJywgJ29uT3BlbkNoYW5nZSddLCBbJ2FmdGVyVmlzaWJsZUNoYW5nZScsICdhZnRlck9wZW5DaGFuZ2UnXSwgWydkZXN0cm95VG9vbHRpcE9uSGlkZScsICdkZXN0cm95T25IaWRkZW4nXSwgWydhcnJvd1BvaW50QXRDZW50ZXInLCAnYXJyb3c9e3sgcG9pbnRBdENlbnRlcjogdHJ1ZSB9fSddLCBbJ292ZXJsYXlTdHlsZScsICdzdHlsZXM9e3sgcm9vdDoge30gfX0nXSwgWydvdmVybGF5SW5uZXJTdHlsZScsICdzdHlsZXM9e3sgYm9keToge30gfX0nXSwgWydvdmVybGF5Q2xhc3NOYW1lJywgJ2NsYXNzTmFtZXM9e3sgcm9vdDogXCJcIiB9fSddXS5mb3JFYWNoKF9yZWYgPT4ge1xuICAgICAgbGV0IFtkZXByZWNhdGVkTmFtZSwgbmV3TmFtZV0gPSBfcmVmO1xuICAgICAgd2FybmluZy5kZXByZWNhdGVkKCEoZGVwcmVjYXRlZE5hbWUgaW4gcHJvcHMpLCBkZXByZWNhdGVkTmFtZSwgbmV3TmFtZSk7XG4gICAgfSk7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyghZGVzdHJveVRvb2x0aXBPbkhpZGUgfHwgdHlwZW9mIGRlc3Ryb3lUb29sdGlwT25IaWRlID09PSAnYm9vbGVhbicsICd1c2FnZScsICdgZGVzdHJveVRvb2x0aXBPbkhpZGVgIG5vIG5lZWQgY29uZmlnIGBrZWVwUGFyZW50YCBhbnltb3JlLiBQbGVhc2UgdXNlIGBib29sZWFuYCB2YWx1ZSBkaXJlY3RseS4nKSA6IHZvaWQgMDtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCFhcnJvdyB8fCB0eXBlb2YgYXJyb3cgPT09ICdib29sZWFuJyB8fCAhKCdhcnJvd1BvaW50QXRDZW50ZXInIGluIGFycm93KSwgJ2RlcHJlY2F0ZWQnLCAnYGFycm93UG9pbnRBdENlbnRlcmAgaW4gYGFycm93YCBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIGBwb2ludEF0Q2VudGVyYCBpbnN0ZWFkLicpIDogdm9pZCAwO1xuICB9XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBPcGVuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBbb3Blbiwgc2V0T3Blbl0gPSB1c2VNZXJnZWRTdGF0ZShmYWxzZSwge1xuICAgIHZhbHVlOiAoX2EgPSBwcm9wcy5vcGVuKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBwcm9wcy52aXNpYmxlLFxuICAgIGRlZmF1bHRWYWx1ZTogKF9iID0gcHJvcHMuZGVmYXVsdE9wZW4pICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHByb3BzLmRlZmF1bHRWaXNpYmxlXG4gIH0pO1xuICBjb25zdCBub1RpdGxlID0gIXRpdGxlICYmICFvdmVybGF5ICYmIHRpdGxlICE9PSAwOyAvLyBvdmVybGF5IGZvciBvbGQgdmVyc2lvbiBjb21wYXRpYmlsaXR5XG4gIGNvbnN0IG9uT3BlbkNoYW5nZSA9IHZpcyA9PiB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICBzZXRPcGVuKG5vVGl0bGUgPyBmYWxzZSA6IHZpcyk7XG4gICAgaWYgKCFub1RpdGxlKSB7XG4gICAgICAoX2EgPSBwcm9wcy5vbk9wZW5DaGFuZ2UpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKHByb3BzLCB2aXMpO1xuICAgICAgKF9iID0gcHJvcHMub25WaXNpYmxlQ2hhbmdlKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChwcm9wcywgdmlzKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHRvb2x0aXBQbGFjZW1lbnRzID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICBsZXQgbWVyZ2VkQXJyb3dQb2ludEF0Q2VudGVyID0gYXJyb3dQb2ludEF0Q2VudGVyO1xuICAgIGlmICh0eXBlb2YgYXJyb3cgPT09ICdvYmplY3QnKSB7XG4gICAgICBtZXJnZWRBcnJvd1BvaW50QXRDZW50ZXIgPSAoX2IgPSAoX2EgPSBhcnJvdy5wb2ludEF0Q2VudGVyKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBhcnJvdy5hcnJvd1BvaW50QXRDZW50ZXIpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGFycm93UG9pbnRBdENlbnRlcjtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWx0aW5QbGFjZW1lbnRzIHx8IGdldFBsYWNlbWVudHMoe1xuICAgICAgYXJyb3dQb2ludEF0Q2VudGVyOiBtZXJnZWRBcnJvd1BvaW50QXRDZW50ZXIsXG4gICAgICBhdXRvQWRqdXN0T3ZlcmZsb3csXG4gICAgICBhcnJvd1dpZHRoOiBtZXJnZWRTaG93QXJyb3cgPyB0b2tlbi5zaXplUG9wdXBBcnJvdyA6IDAsXG4gICAgICBib3JkZXJSYWRpdXM6IHRva2VuLmJvcmRlclJhZGl1cyxcbiAgICAgIG9mZnNldDogdG9rZW4ubWFyZ2luWFhTLFxuICAgICAgdmlzaWJsZUZpcnN0OiB0cnVlXG4gICAgfSk7XG4gIH0sIFthcnJvd1BvaW50QXRDZW50ZXIsIGFycm93LCBidWlsdGluUGxhY2VtZW50cywgdG9rZW5dKTtcbiAgY29uc3QgbWVtb092ZXJsYXkgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBpZiAodGl0bGUgPT09IDApIHtcbiAgICAgIHJldHVybiB0aXRsZTtcbiAgICB9XG4gICAgcmV0dXJuIG92ZXJsYXkgfHwgdGl0bGUgfHwgJyc7XG4gIH0sIFtvdmVybGF5LCB0aXRsZV0pO1xuICBjb25zdCBtZW1vT3ZlcmxheVdyYXBwZXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb250ZXh0SXNvbGF0b3IsIHtcbiAgICBzcGFjZTogdHJ1ZVxuICB9LCB0eXBlb2YgbWVtb092ZXJsYXkgPT09ICdmdW5jdGlvbicgPyBtZW1vT3ZlcmxheSgpIDogbWVtb092ZXJsYXkpO1xuICBjb25zdCBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ3Rvb2x0aXAnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICBjb25zdCByb290UHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCk7XG4gIGNvbnN0IGluamVjdEZyb21Qb3BvdmVyID0gcHJvcHNbJ2RhdGEtcG9wb3Zlci1pbmplY3QnXTtcbiAgbGV0IHRlbXBPcGVuID0gb3BlbjtcbiAgLy8gSGlkZSB0b29sdGlwIHdoZW4gdGhlcmUgaXMgbm8gdGl0bGVcbiAgaWYgKCEoJ29wZW4nIGluIHByb3BzKSAmJiAhKCd2aXNpYmxlJyBpbiBwcm9wcykgJiYgbm9UaXRsZSkge1xuICAgIHRlbXBPcGVuID0gZmFsc2U7XG4gIH1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IGNoaWxkID0gLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSAmJiAhaXNGcmFnbWVudChjaGlsZHJlbikgPyBjaGlsZHJlbiA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBjaGlsZHJlbik7XG4gIGNvbnN0IGNoaWxkUHJvcHMgPSBjaGlsZC5wcm9wcztcbiAgY29uc3QgY2hpbGRDbHMgPSAhY2hpbGRQcm9wcy5jbGFzc05hbWUgfHwgdHlwZW9mIGNoaWxkUHJvcHMuY2xhc3NOYW1lID09PSAnc3RyaW5nJyA/IGNsYXNzTmFtZXMoY2hpbGRQcm9wcy5jbGFzc05hbWUsIG9wZW5DbGFzc05hbWUgfHwgYCR7cHJlZml4Q2xzfS1vcGVuYCkgOiBjaGlsZFByb3BzLmNsYXNzTmFtZTtcbiAgLy8gU3R5bGVcbiAgY29uc3QgW3dyYXBDU1NWYXIsIGhhc2hJZCwgY3NzVmFyQ2xzXSA9IHVzZVN0eWxlKHByZWZpeENscywgIWluamVjdEZyb21Qb3BvdmVyKTtcbiAgLy8gQ29sb3JcbiAgY29uc3QgY29sb3JJbmZvID0gcGFyc2VDb2xvcihwcmVmaXhDbHMsIGNvbG9yKTtcbiAgY29uc3QgYXJyb3dDb250ZW50U3R5bGUgPSBjb2xvckluZm8uYXJyb3dTdHlsZTtcbiAgY29uc3Qgcm9vdENsYXNzTmFtZXMgPSBjbGFzc05hbWVzKG92ZXJsYXlDbGFzc05hbWUsIHtcbiAgICBbYCR7cHJlZml4Q2xzfS1ydGxgXTogZGlyZWN0aW9uID09PSAncnRsJ1xuICB9LCBjb2xvckluZm8uY2xhc3NOYW1lLCByb290Q2xhc3NOYW1lLCBoYXNoSWQsIGNzc1ZhckNscywgY29udGV4dENsYXNzTmFtZSwgY29udGV4dENsYXNzTmFtZXMucm9vdCwgdG9vbHRpcENsYXNzTmFtZXMgPT09IG51bGwgfHwgdG9vbHRpcENsYXNzTmFtZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRvb2x0aXBDbGFzc05hbWVzLnJvb3QpO1xuICBjb25zdCBib2R5Q2xhc3NOYW1lcyA9IGNsYXNzTmFtZXMoY29udGV4dENsYXNzTmFtZXMuYm9keSwgdG9vbHRpcENsYXNzTmFtZXMgPT09IG51bGwgfHwgdG9vbHRpcENsYXNzTmFtZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRvb2x0aXBDbGFzc05hbWVzLmJvZHkpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IHpJbmRleCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IFt6SW5kZXgsIGNvbnRleHRaSW5kZXhdID0gdXNlWkluZGV4KCdUb29sdGlwJywgcmVzdFByb3BzLnpJbmRleCk7XG4gIGNvbnN0IGNvbnRlbnQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSY1Rvb2x0aXAsIE9iamVjdC5hc3NpZ24oe30sIHJlc3RQcm9wcywge1xuICAgIHpJbmRleDogekluZGV4LFxuICAgIHNob3dBcnJvdzogbWVyZ2VkU2hvd0Fycm93LFxuICAgIHBsYWNlbWVudDogcGxhY2VtZW50LFxuICAgIG1vdXNlRW50ZXJEZWxheTogbW91c2VFbnRlckRlbGF5LFxuICAgIG1vdXNlTGVhdmVEZWxheTogbW91c2VMZWF2ZURlbGF5LFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZXM6IHtcbiAgICAgIHJvb3Q6IHJvb3RDbGFzc05hbWVzLFxuICAgICAgYm9keTogYm9keUNsYXNzTmFtZXNcbiAgICB9LFxuICAgIHN0eWxlczoge1xuICAgICAgcm9vdDogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBhcnJvd0NvbnRlbnRTdHlsZSksIGNvbnRleHRTdHlsZXMucm9vdCksIGNvbnRleHRTdHlsZSksIG92ZXJsYXlTdHlsZSksIHN0eWxlcyA9PT0gbnVsbCB8fCBzdHlsZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0eWxlcy5yb290KSxcbiAgICAgIGJvZHk6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGNvbnRleHRTdHlsZXMuYm9keSksIG92ZXJsYXlJbm5lclN0eWxlKSwgc3R5bGVzID09PSBudWxsIHx8IHN0eWxlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3R5bGVzLmJvZHkpLCBjb2xvckluZm8ub3ZlcmxheVN0eWxlKVxuICAgIH0sXG4gICAgZ2V0VG9vbHRpcENvbnRhaW5lcjogZ2V0UG9wdXBDb250YWluZXIgfHwgZ2V0VG9vbHRpcENvbnRhaW5lciB8fCBnZXRDb250ZXh0UG9wdXBDb250YWluZXIsXG4gICAgcmVmOiB0b29sdGlwUmVmLFxuICAgIGJ1aWx0aW5QbGFjZW1lbnRzOiB0b29sdGlwUGxhY2VtZW50cyxcbiAgICBvdmVybGF5OiBtZW1vT3ZlcmxheVdyYXBwZXIsXG4gICAgdmlzaWJsZTogdGVtcE9wZW4sXG4gICAgb25WaXNpYmxlQ2hhbmdlOiBvbk9wZW5DaGFuZ2UsXG4gICAgYWZ0ZXJWaXNpYmxlQ2hhbmdlOiBhZnRlck9wZW5DaGFuZ2UgIT09IG51bGwgJiYgYWZ0ZXJPcGVuQ2hhbmdlICE9PSB2b2lkIDAgPyBhZnRlck9wZW5DaGFuZ2UgOiBhZnRlclZpc2libGVDaGFuZ2UsXG4gICAgYXJyb3dDb250ZW50OiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBgJHtwcmVmaXhDbHN9LWFycm93LWNvbnRlbnRgXG4gICAgfSksXG4gICAgbW90aW9uOiB7XG4gICAgICBtb3Rpb25OYW1lOiBnZXRUcmFuc2l0aW9uTmFtZShyb290UHJlZml4Q2xzLCAnem9vbS1iaWctZmFzdCcsIHByb3BzLnRyYW5zaXRpb25OYW1lKSxcbiAgICAgIG1vdGlvbkRlYWRsaW5lOiAxMDAwXG4gICAgfSxcbiAgICAvLyBUT0RPOiBJbiB0aGUgZnV0dXJlLCBkZXN0cm95VG9vbHRpcE9uSGlkZSBpbiByYy10b29sdGlwIG5lZWRzIHRvIGJlIHVwZ3JhZGUgdG8gZGVzdHJveU9uSGlkZGVuXG4gICAgZGVzdHJveVRvb2x0aXBPbkhpZGU6IGRlc3Ryb3lPbkhpZGRlbiAhPT0gbnVsbCAmJiBkZXN0cm95T25IaWRkZW4gIT09IHZvaWQgMCA/IGRlc3Ryb3lPbkhpZGRlbiA6ICEhZGVzdHJveVRvb2x0aXBPbkhpZGVcbiAgfSksIHRlbXBPcGVuID8gY2xvbmVFbGVtZW50KGNoaWxkLCB7XG4gICAgY2xhc3NOYW1lOiBjaGlsZENsc1xuICB9KSA6IGNoaWxkKTtcbiAgcmV0dXJuIHdyYXBDU1NWYXIoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoekluZGV4Q29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBjb250ZXh0WkluZGV4XG4gIH0sIGNvbnRlbnQpKTtcbn0pO1xuY29uc3QgVG9vbHRpcCA9IEludGVybmFsVG9vbHRpcDtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFRvb2x0aXAuZGlzcGxheU5hbWUgPSAnVG9vbHRpcCc7XG59XG5Ub29sdGlwLl9JbnRlcm5hbFBhbmVsRG9Ob3RVc2VPcllvdVdpbGxCZUZpcmVkID0gUHVyZVBhbmVsO1xuZXhwb3J0IGRlZmF1bHQgVG9vbHRpcDsiLCAiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBQb3B1cChwcm9wcykge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgaWQgPSBwcm9wcy5pZCxcbiAgICBpbm5lclN0eWxlID0gcHJvcHMub3ZlcmxheUlubmVyU3R5bGUsXG4gICAgYm9keUNsYXNzTmFtZSA9IHByb3BzLmJvZHlDbGFzc05hbWUsXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIHN0eWxlID0gcHJvcHMuc3R5bGU7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29udGVudFwiKSwgY2xhc3NOYW1lKSxcbiAgICBzdHlsZTogc3R5bGVcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWlubmVyXCIpLCBib2R5Q2xhc3NOYW1lKSxcbiAgICBpZDogaWQsXG4gICAgcm9sZTogXCJ0b29sdGlwXCIsXG4gICAgc3R5bGU6IGlubmVyU3R5bGVcbiAgfSwgdHlwZW9mIGNoaWxkcmVuID09PSAnZnVuY3Rpb24nID8gY2hpbGRyZW4oKSA6IGNoaWxkcmVuKSk7XG59IiwgImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wib3ZlcmxheUNsYXNzTmFtZVwiLCBcInRyaWdnZXJcIiwgXCJtb3VzZUVudGVyRGVsYXlcIiwgXCJtb3VzZUxlYXZlRGVsYXlcIiwgXCJvdmVybGF5U3R5bGVcIiwgXCJwcmVmaXhDbHNcIiwgXCJjaGlsZHJlblwiLCBcIm9uVmlzaWJsZUNoYW5nZVwiLCBcImFmdGVyVmlzaWJsZUNoYW5nZVwiLCBcInRyYW5zaXRpb25OYW1lXCIsIFwiYW5pbWF0aW9uXCIsIFwibW90aW9uXCIsIFwicGxhY2VtZW50XCIsIFwiYWxpZ25cIiwgXCJkZXN0cm95VG9vbHRpcE9uSGlkZVwiLCBcImRlZmF1bHRWaXNpYmxlXCIsIFwiZ2V0VG9vbHRpcENvbnRhaW5lclwiLCBcIm92ZXJsYXlJbm5lclN0eWxlXCIsIFwiYXJyb3dDb250ZW50XCIsIFwib3ZlcmxheVwiLCBcImlkXCIsIFwic2hvd0Fycm93XCIsIFwiY2xhc3NOYW1lc1wiLCBcInN0eWxlc1wiXTtcbmltcG9ydCBUcmlnZ2VyIGZyb20gJ0ByYy1jb21wb25lbnQvdHJpZ2dlcic7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGZvcndhcmRSZWYsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHBsYWNlbWVudHMgfSBmcm9tIFwiLi9wbGFjZW1lbnRzXCI7XG5pbXBvcnQgUG9wdXAgZnJvbSBcIi4vUG9wdXBcIjtcbmltcG9ydCB1c2VJZCBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VJZFwiO1xudmFyIFRvb2x0aXAgPSBmdW5jdGlvbiBUb29sdGlwKHByb3BzLCByZWYpIHtcbiAgdmFyIG92ZXJsYXlDbGFzc05hbWUgPSBwcm9wcy5vdmVybGF5Q2xhc3NOYW1lLFxuICAgIF9wcm9wcyR0cmlnZ2VyID0gcHJvcHMudHJpZ2dlcixcbiAgICB0cmlnZ2VyID0gX3Byb3BzJHRyaWdnZXIgPT09IHZvaWQgMCA/IFsnaG92ZXInXSA6IF9wcm9wcyR0cmlnZ2VyLFxuICAgIF9wcm9wcyRtb3VzZUVudGVyRGVsYSA9IHByb3BzLm1vdXNlRW50ZXJEZWxheSxcbiAgICBtb3VzZUVudGVyRGVsYXkgPSBfcHJvcHMkbW91c2VFbnRlckRlbGEgPT09IHZvaWQgMCA/IDAgOiBfcHJvcHMkbW91c2VFbnRlckRlbGEsXG4gICAgX3Byb3BzJG1vdXNlTGVhdmVEZWxhID0gcHJvcHMubW91c2VMZWF2ZURlbGF5LFxuICAgIG1vdXNlTGVhdmVEZWxheSA9IF9wcm9wcyRtb3VzZUxlYXZlRGVsYSA9PT0gdm9pZCAwID8gMC4xIDogX3Byb3BzJG1vdXNlTGVhdmVEZWxhLFxuICAgIG92ZXJsYXlTdHlsZSA9IHByb3BzLm92ZXJsYXlTdHlsZSxcbiAgICBfcHJvcHMkcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIHByZWZpeENscyA9IF9wcm9wcyRwcmVmaXhDbHMgPT09IHZvaWQgMCA/ICdyYy10b29sdGlwJyA6IF9wcm9wcyRwcmVmaXhDbHMsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBvblZpc2libGVDaGFuZ2UgPSBwcm9wcy5vblZpc2libGVDaGFuZ2UsXG4gICAgYWZ0ZXJWaXNpYmxlQ2hhbmdlID0gcHJvcHMuYWZ0ZXJWaXNpYmxlQ2hhbmdlLFxuICAgIHRyYW5zaXRpb25OYW1lID0gcHJvcHMudHJhbnNpdGlvbk5hbWUsXG4gICAgYW5pbWF0aW9uID0gcHJvcHMuYW5pbWF0aW9uLFxuICAgIG1vdGlvbiA9IHByb3BzLm1vdGlvbixcbiAgICBfcHJvcHMkcGxhY2VtZW50ID0gcHJvcHMucGxhY2VtZW50LFxuICAgIHBsYWNlbWVudCA9IF9wcm9wcyRwbGFjZW1lbnQgPT09IHZvaWQgMCA/ICdyaWdodCcgOiBfcHJvcHMkcGxhY2VtZW50LFxuICAgIF9wcm9wcyRhbGlnbiA9IHByb3BzLmFsaWduLFxuICAgIGFsaWduID0gX3Byb3BzJGFsaWduID09PSB2b2lkIDAgPyB7fSA6IF9wcm9wcyRhbGlnbixcbiAgICBfcHJvcHMkZGVzdHJveVRvb2x0aXAgPSBwcm9wcy5kZXN0cm95VG9vbHRpcE9uSGlkZSxcbiAgICBkZXN0cm95VG9vbHRpcE9uSGlkZSA9IF9wcm9wcyRkZXN0cm95VG9vbHRpcCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkZGVzdHJveVRvb2x0aXAsXG4gICAgZGVmYXVsdFZpc2libGUgPSBwcm9wcy5kZWZhdWx0VmlzaWJsZSxcbiAgICBnZXRUb29sdGlwQ29udGFpbmVyID0gcHJvcHMuZ2V0VG9vbHRpcENvbnRhaW5lcixcbiAgICBvdmVybGF5SW5uZXJTdHlsZSA9IHByb3BzLm92ZXJsYXlJbm5lclN0eWxlLFxuICAgIGFycm93Q29udGVudCA9IHByb3BzLmFycm93Q29udGVudCxcbiAgICBvdmVybGF5ID0gcHJvcHMub3ZlcmxheSxcbiAgICBpZCA9IHByb3BzLmlkLFxuICAgIF9wcm9wcyRzaG93QXJyb3cgPSBwcm9wcy5zaG93QXJyb3csXG4gICAgc2hvd0Fycm93ID0gX3Byb3BzJHNob3dBcnJvdyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyRzaG93QXJyb3csXG4gICAgdG9vbHRpcENsYXNzTmFtZXMgPSBwcm9wcy5jbGFzc05hbWVzLFxuICAgIHRvb2x0aXBTdHlsZXMgPSBwcm9wcy5zdHlsZXMsXG4gICAgcmVzdFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBfZXhjbHVkZWQpO1xuICB2YXIgbWVyZ2VkSWQgPSB1c2VJZChpZCk7XG4gIHZhciB0cmlnZ2VyUmVmID0gdXNlUmVmKG51bGwpO1xuICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0cmlnZ2VyUmVmLmN1cnJlbnQ7XG4gIH0pO1xuICB2YXIgZXh0cmFQcm9wcyA9IF9vYmplY3RTcHJlYWQoe30sIHJlc3RQcm9wcyk7XG4gIGlmICgndmlzaWJsZScgaW4gcHJvcHMpIHtcbiAgICBleHRyYVByb3BzLnBvcHVwVmlzaWJsZSA9IHByb3BzLnZpc2libGU7XG4gIH1cbiAgdmFyIGdldFBvcHVwRWxlbWVudCA9IGZ1bmN0aW9uIGdldFBvcHVwRWxlbWVudCgpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUG9wdXAsIHtcbiAgICAgIGtleTogXCJjb250ZW50XCIsXG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgIGlkOiBtZXJnZWRJZCxcbiAgICAgIGJvZHlDbGFzc05hbWU6IHRvb2x0aXBDbGFzc05hbWVzID09PSBudWxsIHx8IHRvb2x0aXBDbGFzc05hbWVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0b29sdGlwQ2xhc3NOYW1lcy5ib2R5LFxuICAgICAgb3ZlcmxheUlubmVyU3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgb3ZlcmxheUlubmVyU3R5bGUpLCB0b29sdGlwU3R5bGVzID09PSBudWxsIHx8IHRvb2x0aXBTdHlsZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRvb2x0aXBTdHlsZXMuYm9keSlcbiAgICB9LCBvdmVybGF5KTtcbiAgfTtcbiAgdmFyIGdldENoaWxkcmVuID0gZnVuY3Rpb24gZ2V0Q2hpbGRyZW4oKSB7XG4gICAgdmFyIGNoaWxkID0gUmVhY3QuQ2hpbGRyZW4ub25seShjaGlsZHJlbik7XG4gICAgdmFyIG9yaWdpbmFsUHJvcHMgPSAoY2hpbGQgPT09IG51bGwgfHwgY2hpbGQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNoaWxkLnByb3BzKSB8fCB7fTtcbiAgICB2YXIgY2hpbGRQcm9wcyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgb3JpZ2luYWxQcm9wcyksIHt9LCB7XG4gICAgICAnYXJpYS1kZXNjcmliZWRieSc6IG92ZXJsYXkgPyBtZXJnZWRJZCA6IG51bGxcbiAgICB9KTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChjaGlsZHJlbiwgY2hpbGRQcm9wcyk7XG4gIH07XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUcmlnZ2VyLCBfZXh0ZW5kcyh7XG4gICAgcG9wdXBDbGFzc05hbWU6IGNsYXNzTmFtZXMob3ZlcmxheUNsYXNzTmFtZSwgdG9vbHRpcENsYXNzTmFtZXMgPT09IG51bGwgfHwgdG9vbHRpcENsYXNzTmFtZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRvb2x0aXBDbGFzc05hbWVzLnJvb3QpLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIHBvcHVwOiBnZXRQb3B1cEVsZW1lbnQsXG4gICAgYWN0aW9uOiB0cmlnZ2VyLFxuICAgIGJ1aWx0aW5QbGFjZW1lbnRzOiBwbGFjZW1lbnRzLFxuICAgIHBvcHVwUGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgcmVmOiB0cmlnZ2VyUmVmLFxuICAgIHBvcHVwQWxpZ246IGFsaWduLFxuICAgIGdldFBvcHVwQ29udGFpbmVyOiBnZXRUb29sdGlwQ29udGFpbmVyLFxuICAgIG9uUG9wdXBWaXNpYmxlQ2hhbmdlOiBvblZpc2libGVDaGFuZ2UsXG4gICAgYWZ0ZXJQb3B1cFZpc2libGVDaGFuZ2U6IGFmdGVyVmlzaWJsZUNoYW5nZSxcbiAgICBwb3B1cFRyYW5zaXRpb25OYW1lOiB0cmFuc2l0aW9uTmFtZSxcbiAgICBwb3B1cEFuaW1hdGlvbjogYW5pbWF0aW9uLFxuICAgIHBvcHVwTW90aW9uOiBtb3Rpb24sXG4gICAgZGVmYXVsdFBvcHVwVmlzaWJsZTogZGVmYXVsdFZpc2libGUsXG4gICAgYXV0b0Rlc3Ryb3k6IGRlc3Ryb3lUb29sdGlwT25IaWRlLFxuICAgIG1vdXNlTGVhdmVEZWxheTogbW91c2VMZWF2ZURlbGF5LFxuICAgIHBvcHVwU3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgb3ZlcmxheVN0eWxlKSwgdG9vbHRpcFN0eWxlcyA9PT0gbnVsbCB8fCB0b29sdGlwU3R5bGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0b29sdGlwU3R5bGVzLnJvb3QpLFxuICAgIG1vdXNlRW50ZXJEZWxheTogbW91c2VFbnRlckRlbGF5LFxuICAgIGFycm93OiBzaG93QXJyb3dcbiAgfSwgZXh0cmFQcm9wcyksIGdldENoaWxkcmVuKCkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi9mb3J3YXJkUmVmKFRvb2x0aXApOyIsICJ2YXIgYXV0b0FkanVzdE92ZXJmbG93VG9wQm90dG9tID0ge1xuICBzaGlmdFg6IDY0LFxuICBhZGp1c3RZOiAxXG59O1xudmFyIGF1dG9BZGp1c3RPdmVyZmxvd0xlZnRSaWdodCA9IHtcbiAgYWRqdXN0WDogMSxcbiAgc2hpZnRZOiB0cnVlXG59O1xudmFyIHRhcmdldE9mZnNldCA9IFswLCAwXTtcbmV4cG9ydCB2YXIgcGxhY2VtZW50cyA9IHtcbiAgbGVmdDoge1xuICAgIHBvaW50czogWydjcicsICdjbCddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3dMZWZ0UmlnaHQsXG4gICAgb2Zmc2V0OiBbLTQsIDBdLFxuICAgIHRhcmdldE9mZnNldDogdGFyZ2V0T2Zmc2V0XG4gIH0sXG4gIHJpZ2h0OiB7XG4gICAgcG9pbnRzOiBbJ2NsJywgJ2NyJ10sXG4gICAgb3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvd0xlZnRSaWdodCxcbiAgICBvZmZzZXQ6IFs0LCAwXSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICB0b3A6IHtcbiAgICBwb2ludHM6IFsnYmMnLCAndGMnXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93VG9wQm90dG9tLFxuICAgIG9mZnNldDogWzAsIC00XSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICBib3R0b206IHtcbiAgICBwb2ludHM6IFsndGMnLCAnYmMnXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93VG9wQm90dG9tLFxuICAgIG9mZnNldDogWzAsIDRdLFxuICAgIHRhcmdldE9mZnNldDogdGFyZ2V0T2Zmc2V0XG4gIH0sXG4gIHRvcExlZnQ6IHtcbiAgICBwb2ludHM6IFsnYmwnLCAndGwnXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93VG9wQm90dG9tLFxuICAgIG9mZnNldDogWzAsIC00XSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICBsZWZ0VG9wOiB7XG4gICAgcG9pbnRzOiBbJ3RyJywgJ3RsJ10sXG4gICAgb3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvd0xlZnRSaWdodCxcbiAgICBvZmZzZXQ6IFstNCwgMF0sXG4gICAgdGFyZ2V0T2Zmc2V0OiB0YXJnZXRPZmZzZXRcbiAgfSxcbiAgdG9wUmlnaHQ6IHtcbiAgICBwb2ludHM6IFsnYnInLCAndHInXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93VG9wQm90dG9tLFxuICAgIG9mZnNldDogWzAsIC00XSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICByaWdodFRvcDoge1xuICAgIHBvaW50czogWyd0bCcsICd0ciddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3dMZWZ0UmlnaHQsXG4gICAgb2Zmc2V0OiBbNCwgMF0sXG4gICAgdGFyZ2V0T2Zmc2V0OiB0YXJnZXRPZmZzZXRcbiAgfSxcbiAgYm90dG9tUmlnaHQ6IHtcbiAgICBwb2ludHM6IFsndHInLCAnYnInXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93VG9wQm90dG9tLFxuICAgIG9mZnNldDogWzAsIDRdLFxuICAgIHRhcmdldE9mZnNldDogdGFyZ2V0T2Zmc2V0XG4gIH0sXG4gIHJpZ2h0Qm90dG9tOiB7XG4gICAgcG9pbnRzOiBbJ2JsJywgJ2JyJ10sXG4gICAgb3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvd0xlZnRSaWdodCxcbiAgICBvZmZzZXQ6IFs0LCAwXSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICBib3R0b21MZWZ0OiB7XG4gICAgcG9pbnRzOiBbJ3RsJywgJ2JsJ10sXG4gICAgb3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvd1RvcEJvdHRvbSxcbiAgICBvZmZzZXQ6IFswLCA0XSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICBsZWZ0Qm90dG9tOiB7XG4gICAgcG9pbnRzOiBbJ2JyJywgJ2JsJ10sXG4gICAgb3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvd0xlZnRSaWdodCxcbiAgICBvZmZzZXQ6IFstNCwgMF0sXG4gICAgdGFyZ2V0T2Zmc2V0OiB0YXJnZXRPZmZzZXRcbiAgfVxufTtcbmV4cG9ydCBkZWZhdWx0IHBsYWNlbWVudHM7IiwgImltcG9ydCBQb3B1cCBmcm9tIFwiLi9Qb3B1cFwiO1xuaW1wb3J0IFRvb2x0aXAgZnJvbSBcIi4vVG9vbHRpcFwiO1xuZXhwb3J0IHsgUG9wdXAgfTtcbmV4cG9ydCBkZWZhdWx0IFRvb2x0aXA7IiwgImltcG9ydCB7IHVuaXQgfSBmcm9tICdAYW50LWRlc2lnbi9jc3NpbmpzJztcbmV4cG9ydCBmdW5jdGlvbiBnZXRBcnJvd1Rva2VuKHRva2VuKSB7XG4gIGNvbnN0IHtcbiAgICBzaXplUG9wdXBBcnJvdyxcbiAgICBib3JkZXJSYWRpdXNYUyxcbiAgICBib3JkZXJSYWRpdXNPdXRlclxuICB9ID0gdG9rZW47XG4gIGNvbnN0IHVuaXRXaWR0aCA9IHNpemVQb3B1cEFycm93IC8gMjtcbiAgY29uc3QgYXggPSAwO1xuICBjb25zdCBheSA9IHVuaXRXaWR0aDtcbiAgY29uc3QgYnggPSBib3JkZXJSYWRpdXNPdXRlciAqIDEgLyBNYXRoLnNxcnQoMik7XG4gIGNvbnN0IGJ5ID0gdW5pdFdpZHRoIC0gYm9yZGVyUmFkaXVzT3V0ZXIgKiAoMSAtIDEgLyBNYXRoLnNxcnQoMikpO1xuICBjb25zdCBjeCA9IHVuaXRXaWR0aCAtIGJvcmRlclJhZGl1c1hTICogKDEgLyBNYXRoLnNxcnQoMikpO1xuICBjb25zdCBjeSA9IGJvcmRlclJhZGl1c091dGVyICogKE1hdGguc3FydCgyKSAtIDEpICsgYm9yZGVyUmFkaXVzWFMgKiAoMSAvIE1hdGguc3FydCgyKSk7XG4gIGNvbnN0IGR4ID0gMiAqIHVuaXRXaWR0aCAtIGN4O1xuICBjb25zdCBkeSA9IGN5O1xuICBjb25zdCBleCA9IDIgKiB1bml0V2lkdGggLSBieDtcbiAgY29uc3QgZXkgPSBieTtcbiAgY29uc3QgZnggPSAyICogdW5pdFdpZHRoIC0gYXg7XG4gIGNvbnN0IGZ5ID0gYXk7XG4gIGNvbnN0IHNoYWRvd1dpZHRoID0gdW5pdFdpZHRoICogTWF0aC5zcXJ0KDIpICsgYm9yZGVyUmFkaXVzT3V0ZXIgKiAoTWF0aC5zcXJ0KDIpIC0gMik7XG4gIGNvbnN0IHBvbHlnb25PZmZzZXQgPSBib3JkZXJSYWRpdXNPdXRlciAqIChNYXRoLnNxcnQoMikgLSAxKTtcbiAgY29uc3QgYXJyb3dQb2x5Z29uID0gYHBvbHlnb24oJHtwb2x5Z29uT2Zmc2V0fXB4IDEwMCUsIDUwJSAke3BvbHlnb25PZmZzZXR9cHgsICR7MiAqIHVuaXRXaWR0aCAtIHBvbHlnb25PZmZzZXR9cHggMTAwJSwgJHtwb2x5Z29uT2Zmc2V0fXB4IDEwMCUpYDtcbiAgY29uc3QgYXJyb3dQYXRoID0gYHBhdGgoJ00gJHtheH0gJHtheX0gQSAke2JvcmRlclJhZGl1c091dGVyfSAke2JvcmRlclJhZGl1c091dGVyfSAwIDAgMCAke2J4fSAke2J5fSBMICR7Y3h9ICR7Y3l9IEEgJHtib3JkZXJSYWRpdXNYU30gJHtib3JkZXJSYWRpdXNYU30gMCAwIDEgJHtkeH0gJHtkeX0gTCAke2V4fSAke2V5fSBBICR7Ym9yZGVyUmFkaXVzT3V0ZXJ9ICR7Ym9yZGVyUmFkaXVzT3V0ZXJ9IDAgMCAwICR7Znh9ICR7Znl9IFonKWA7XG4gIHJldHVybiB7XG4gICAgYXJyb3dTaGFkb3dXaWR0aDogc2hhZG93V2lkdGgsXG4gICAgYXJyb3dQYXRoLFxuICAgIGFycm93UG9seWdvblxuICB9O1xufVxuZXhwb3J0IGNvbnN0IGdlblJvdW5kZWRBcnJvdyA9ICh0b2tlbiwgYmdDb2xvciwgYm94U2hhZG93KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBzaXplUG9wdXBBcnJvdyxcbiAgICBhcnJvd1BvbHlnb24sXG4gICAgYXJyb3dQYXRoLFxuICAgIGFycm93U2hhZG93V2lkdGgsXG4gICAgYm9yZGVyUmFkaXVzWFMsXG4gICAgY2FsY1xuICB9ID0gdG9rZW47XG4gIHJldHVybiB7XG4gICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgIHdpZHRoOiBzaXplUG9wdXBBcnJvdyxcbiAgICBoZWlnaHQ6IHNpemVQb3B1cEFycm93LFxuICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICAnJjo6YmVmb3JlJzoge1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBib3R0b206IDAsXG4gICAgICBpbnNldElubGluZVN0YXJ0OiAwLFxuICAgICAgd2lkdGg6IHNpemVQb3B1cEFycm93LFxuICAgICAgaGVpZ2h0OiBjYWxjKHNpemVQb3B1cEFycm93KS5kaXYoMikuZXF1YWwoKSxcbiAgICAgIGJhY2tncm91bmQ6IGJnQ29sb3IsXG4gICAgICBjbGlwUGF0aDoge1xuICAgICAgICBfbXVsdGlfdmFsdWVfOiB0cnVlLFxuICAgICAgICB2YWx1ZTogW2Fycm93UG9seWdvbiwgYXJyb3dQYXRoXVxuICAgICAgfSxcbiAgICAgIGNvbnRlbnQ6ICdcIlwiJ1xuICAgIH0sXG4gICAgJyY6OmFmdGVyJzoge1xuICAgICAgY29udGVudDogJ1wiXCInLFxuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICB3aWR0aDogYXJyb3dTaGFkb3dXaWR0aCxcbiAgICAgIGhlaWdodDogYXJyb3dTaGFkb3dXaWR0aCxcbiAgICAgIGJvdHRvbTogMCxcbiAgICAgIGluc2V0SW5saW5lOiAwLFxuICAgICAgbWFyZ2luOiAnYXV0bycsXG4gICAgICBib3JkZXJSYWRpdXM6IHtcbiAgICAgICAgX3NraXBfY2hlY2tfOiB0cnVlLFxuICAgICAgICB2YWx1ZTogYDAgMCAke3VuaXQoYm9yZGVyUmFkaXVzWFMpfSAwYFxuICAgICAgfSxcbiAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoNTAlKSByb3RhdGUoLTEzNWRlZyknLFxuICAgICAgYm94U2hhZG93LFxuICAgICAgekluZGV4OiAwLFxuICAgICAgYmFja2dyb3VuZDogJ3RyYW5zcGFyZW50J1xuICAgIH1cbiAgfTtcbn07IiwgImltcG9ydCB7IHVuaXQgfSBmcm9tICdAYW50LWRlc2lnbi9jc3NpbmpzJztcbmltcG9ydCB7IGdlblJvdW5kZWRBcnJvdyB9IGZyb20gJy4vcm91bmRlZEFycm93JztcbmV4cG9ydCBjb25zdCBNQVhfVkVSVElDQUxfQ09OVEVOVF9SQURJVVMgPSA4O1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFycm93T2Zmc2V0VG9rZW4ob3B0aW9ucykge1xuICBjb25zdCB7XG4gICAgY29udGVudFJhZGl1cyxcbiAgICBsaW1pdFZlcnRpY2FsUmFkaXVzXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBhcnJvd09mZnNldCA9IGNvbnRlbnRSYWRpdXMgPiAxMiA/IGNvbnRlbnRSYWRpdXMgKyAyIDogMTI7XG4gIGNvbnN0IGFycm93T2Zmc2V0VmVydGljYWwgPSBsaW1pdFZlcnRpY2FsUmFkaXVzID8gTUFYX1ZFUlRJQ0FMX0NPTlRFTlRfUkFESVVTIDogYXJyb3dPZmZzZXQ7XG4gIHJldHVybiB7XG4gICAgYXJyb3dPZmZzZXRIb3Jpem9udGFsOiBhcnJvd09mZnNldCxcbiAgICBhcnJvd09mZnNldFZlcnRpY2FsXG4gIH07XG59XG5mdW5jdGlvbiBpc0luamVjdCh2YWxpZCwgY29kZSkge1xuICBpZiAoIXZhbGlkKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIHJldHVybiBjb2RlO1xufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0QXJyb3dTdHlsZSh0b2tlbiwgY29sb3JCZywgb3B0aW9ucykge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzLFxuICAgIGJveFNoYWRvd1BvcG92ZXJBcnJvdyxcbiAgICBhcnJvd09mZnNldFZlcnRpY2FsLFxuICAgIGFycm93T2Zmc2V0SG9yaXpvbnRhbFxuICB9ID0gdG9rZW47XG4gIGNvbnN0IHtcbiAgICBhcnJvd0Rpc3RhbmNlID0gMCxcbiAgICBhcnJvd1BsYWNlbWVudCA9IHtcbiAgICAgIGxlZnQ6IHRydWUsXG4gICAgICByaWdodDogdHJ1ZSxcbiAgICAgIHRvcDogdHJ1ZSxcbiAgICAgIGJvdHRvbTogdHJ1ZVxuICAgIH1cbiAgfSA9IG9wdGlvbnMgfHwge307XG4gIHJldHVybiB7XG4gICAgW2NvbXBvbmVudENsc106IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe1xuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBCYXNpYyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1hcnJvd2BdOiBbT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHtcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgIHpJbmRleDogMSxcbiAgICAgICAgZGlzcGxheTogJ2Jsb2NrJ1xuICAgICAgfSwgZ2VuUm91bmRlZEFycm93KHRva2VuLCBjb2xvckJnLCBib3hTaGFkb3dQb3BvdmVyQXJyb3cpKSwge1xuICAgICAgICAnJjpiZWZvcmUnOiB7XG4gICAgICAgICAgYmFja2dyb3VuZDogY29sb3JCZ1xuICAgICAgICB9XG4gICAgICB9KV1cbiAgICB9LCBpc0luamVjdCghIWFycm93UGxhY2VtZW50LnRvcCwge1xuICAgICAgW1tgJi1wbGFjZW1lbnQtdG9wID4gJHtjb21wb25lbnRDbHN9LWFycm93YCwgYCYtcGxhY2VtZW50LXRvcExlZnQgPiAke2NvbXBvbmVudENsc30tYXJyb3dgLCBgJi1wbGFjZW1lbnQtdG9wUmlnaHQgPiAke2NvbXBvbmVudENsc30tYXJyb3dgXS5qb2luKCcsJyldOiB7XG4gICAgICAgIGJvdHRvbTogYXJyb3dEaXN0YW5jZSxcbiAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgxMDAlKSByb3RhdGUoMTgwZGVnKSdcbiAgICAgIH0sXG4gICAgICBbYCYtcGxhY2VtZW50LXRvcCA+ICR7Y29tcG9uZW50Q2xzfS1hcnJvd2BdOiB7XG4gICAgICAgIGxlZnQ6IHtcbiAgICAgICAgICBfc2tpcF9jaGVja186IHRydWUsXG4gICAgICAgICAgdmFsdWU6ICc1MCUnXG4gICAgICAgIH0sXG4gICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoLTUwJSkgdHJhbnNsYXRlWSgxMDAlKSByb3RhdGUoMTgwZGVnKSdcbiAgICAgIH0sXG4gICAgICAnJi1wbGFjZW1lbnQtdG9wTGVmdCc6IHtcbiAgICAgICAgJy0tYXJyb3ctb2Zmc2V0LWhvcml6b250YWwnOiBhcnJvd09mZnNldEhvcml6b250YWwsXG4gICAgICAgIFtgPiAke2NvbXBvbmVudENsc30tYXJyb3dgXToge1xuICAgICAgICAgIGxlZnQ6IHtcbiAgICAgICAgICAgIF9za2lwX2NoZWNrXzogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBhcnJvd09mZnNldEhvcml6b250YWxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAnJi1wbGFjZW1lbnQtdG9wUmlnaHQnOiB7XG4gICAgICAgICctLWFycm93LW9mZnNldC1ob3Jpem9udGFsJzogYGNhbGMoMTAwJSAtICR7dW5pdChhcnJvd09mZnNldEhvcml6b250YWwpfSlgLFxuICAgICAgICBbYD4gJHtjb21wb25lbnRDbHN9LWFycm93YF06IHtcbiAgICAgICAgICByaWdodDoge1xuICAgICAgICAgICAgX3NraXBfY2hlY2tfOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IGFycm93T2Zmc2V0SG9yaXpvbnRhbFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKSwgaXNJbmplY3QoISFhcnJvd1BsYWNlbWVudC5ib3R0b20sIHtcbiAgICAgIFtbYCYtcGxhY2VtZW50LWJvdHRvbSA+ICR7Y29tcG9uZW50Q2xzfS1hcnJvd2AsIGAmLXBsYWNlbWVudC1ib3R0b21MZWZ0ID4gJHtjb21wb25lbnRDbHN9LWFycm93YCwgYCYtcGxhY2VtZW50LWJvdHRvbVJpZ2h0ID4gJHtjb21wb25lbnRDbHN9LWFycm93YF0uam9pbignLCcpXToge1xuICAgICAgICB0b3A6IGFycm93RGlzdGFuY2UsXG4gICAgICAgIHRyYW5zZm9ybTogYHRyYW5zbGF0ZVkoLTEwMCUpYFxuICAgICAgfSxcbiAgICAgIFtgJi1wbGFjZW1lbnQtYm90dG9tID4gJHtjb21wb25lbnRDbHN9LWFycm93YF06IHtcbiAgICAgICAgbGVmdDoge1xuICAgICAgICAgIF9za2lwX2NoZWNrXzogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZTogJzUwJSdcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlWCgtNTAlKSB0cmFuc2xhdGVZKC0xMDAlKWBcbiAgICAgIH0sXG4gICAgICAnJi1wbGFjZW1lbnQtYm90dG9tTGVmdCc6IHtcbiAgICAgICAgJy0tYXJyb3ctb2Zmc2V0LWhvcml6b250YWwnOiBhcnJvd09mZnNldEhvcml6b250YWwsXG4gICAgICAgIFtgPiAke2NvbXBvbmVudENsc30tYXJyb3dgXToge1xuICAgICAgICAgIGxlZnQ6IHtcbiAgICAgICAgICAgIF9za2lwX2NoZWNrXzogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBhcnJvd09mZnNldEhvcml6b250YWxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAnJi1wbGFjZW1lbnQtYm90dG9tUmlnaHQnOiB7XG4gICAgICAgICctLWFycm93LW9mZnNldC1ob3Jpem9udGFsJzogYGNhbGMoMTAwJSAtICR7dW5pdChhcnJvd09mZnNldEhvcml6b250YWwpfSlgLFxuICAgICAgICBbYD4gJHtjb21wb25lbnRDbHN9LWFycm93YF06IHtcbiAgICAgICAgICByaWdodDoge1xuICAgICAgICAgICAgX3NraXBfY2hlY2tfOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IGFycm93T2Zmc2V0SG9yaXpvbnRhbFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKSwgaXNJbmplY3QoISFhcnJvd1BsYWNlbWVudC5sZWZ0LCB7XG4gICAgICBbW2AmLXBsYWNlbWVudC1sZWZ0ID4gJHtjb21wb25lbnRDbHN9LWFycm93YCwgYCYtcGxhY2VtZW50LWxlZnRUb3AgPiAke2NvbXBvbmVudENsc30tYXJyb3dgLCBgJi1wbGFjZW1lbnQtbGVmdEJvdHRvbSA+ICR7Y29tcG9uZW50Q2xzfS1hcnJvd2BdLmpvaW4oJywnKV06IHtcbiAgICAgICAgcmlnaHQ6IHtcbiAgICAgICAgICBfc2tpcF9jaGVja186IHRydWUsXG4gICAgICAgICAgdmFsdWU6IGFycm93RGlzdGFuY2VcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgxMDAlKSByb3RhdGUoOTBkZWcpJ1xuICAgICAgfSxcbiAgICAgIFtgJi1wbGFjZW1lbnQtbGVmdCA+ICR7Y29tcG9uZW50Q2xzfS1hcnJvd2BdOiB7XG4gICAgICAgIHRvcDoge1xuICAgICAgICAgIF9za2lwX2NoZWNrXzogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZTogJzUwJSdcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgtNTAlKSB0cmFuc2xhdGVYKDEwMCUpIHJvdGF0ZSg5MGRlZyknXG4gICAgICB9LFxuICAgICAgW2AmLXBsYWNlbWVudC1sZWZ0VG9wID4gJHtjb21wb25lbnRDbHN9LWFycm93YF06IHtcbiAgICAgICAgdG9wOiBhcnJvd09mZnNldFZlcnRpY2FsXG4gICAgICB9LFxuICAgICAgW2AmLXBsYWNlbWVudC1sZWZ0Qm90dG9tID4gJHtjb21wb25lbnRDbHN9LWFycm93YF06IHtcbiAgICAgICAgYm90dG9tOiBhcnJvd09mZnNldFZlcnRpY2FsXG4gICAgICB9XG4gICAgfSkpLCBpc0luamVjdCghIWFycm93UGxhY2VtZW50LnJpZ2h0LCB7XG4gICAgICBbW2AmLXBsYWNlbWVudC1yaWdodCA+ICR7Y29tcG9uZW50Q2xzfS1hcnJvd2AsIGAmLXBsYWNlbWVudC1yaWdodFRvcCA+ICR7Y29tcG9uZW50Q2xzfS1hcnJvd2AsIGAmLXBsYWNlbWVudC1yaWdodEJvdHRvbSA+ICR7Y29tcG9uZW50Q2xzfS1hcnJvd2BdLmpvaW4oJywnKV06IHtcbiAgICAgICAgbGVmdDoge1xuICAgICAgICAgIF9za2lwX2NoZWNrXzogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZTogYXJyb3dEaXN0YW5jZVxuICAgICAgICB9LFxuICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKC0xMDAlKSByb3RhdGUoLTkwZGVnKSdcbiAgICAgIH0sXG4gICAgICBbYCYtcGxhY2VtZW50LXJpZ2h0ID4gJHtjb21wb25lbnRDbHN9LWFycm93YF06IHtcbiAgICAgICAgdG9wOiB7XG4gICAgICAgICAgX3NraXBfY2hlY2tfOiB0cnVlLFxuICAgICAgICAgIHZhbHVlOiAnNTAlJ1xuICAgICAgICB9LFxuICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKC01MCUpIHRyYW5zbGF0ZVgoLTEwMCUpIHJvdGF0ZSgtOTBkZWcpJ1xuICAgICAgfSxcbiAgICAgIFtgJi1wbGFjZW1lbnQtcmlnaHRUb3AgPiAke2NvbXBvbmVudENsc30tYXJyb3dgXToge1xuICAgICAgICB0b3A6IGFycm93T2Zmc2V0VmVydGljYWxcbiAgICAgIH0sXG4gICAgICBbYCYtcGxhY2VtZW50LXJpZ2h0Qm90dG9tID4gJHtjb21wb25lbnRDbHN9LWFycm93YF06IHtcbiAgICAgICAgYm90dG9tOiBhcnJvd09mZnNldFZlcnRpY2FsXG4gICAgICB9XG4gICAgfSkpXG4gIH07XG59IiwgImltcG9ydCB7IGdldEFycm93T2Zmc2V0VG9rZW4gfSBmcm9tICcuLi9zdHlsZS9wbGFjZW1lbnRBcnJvdyc7XG5leHBvcnQgZnVuY3Rpb24gZ2V0T3ZlcmZsb3dPcHRpb25zKHBsYWNlbWVudCwgYXJyb3dPZmZzZXQsIGFycm93V2lkdGgsIGF1dG9BZGp1c3RPdmVyZmxvdykge1xuICBpZiAoYXV0b0FkanVzdE92ZXJmbG93ID09PSBmYWxzZSkge1xuICAgIHJldHVybiB7XG4gICAgICBhZGp1c3RYOiBmYWxzZSxcbiAgICAgIGFkanVzdFk6IGZhbHNlXG4gICAgfTtcbiAgfVxuICBjb25zdCBvdmVyZmxvdyA9IGF1dG9BZGp1c3RPdmVyZmxvdyAmJiB0eXBlb2YgYXV0b0FkanVzdE92ZXJmbG93ID09PSAnb2JqZWN0JyA/IGF1dG9BZGp1c3RPdmVyZmxvdyA6IHt9O1xuICBjb25zdCBiYXNlT3ZlcmZsb3cgPSB7fTtcbiAgc3dpdGNoIChwbGFjZW1lbnQpIHtcbiAgICBjYXNlICd0b3AnOlxuICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICBiYXNlT3ZlcmZsb3cuc2hpZnRYID0gYXJyb3dPZmZzZXQuYXJyb3dPZmZzZXRIb3Jpem9udGFsICogMiArIGFycm93V2lkdGg7XG4gICAgICBiYXNlT3ZlcmZsb3cuc2hpZnRZID0gdHJ1ZTtcbiAgICAgIGJhc2VPdmVyZmxvdy5hZGp1c3RZID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2xlZnQnOlxuICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgIGJhc2VPdmVyZmxvdy5zaGlmdFkgPSBhcnJvd09mZnNldC5hcnJvd09mZnNldFZlcnRpY2FsICogMiArIGFycm93V2lkdGg7XG4gICAgICBiYXNlT3ZlcmZsb3cuc2hpZnRYID0gdHJ1ZTtcbiAgICAgIGJhc2VPdmVyZmxvdy5hZGp1c3RYID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICB9XG4gIGNvbnN0IG1lcmdlZE92ZXJmbG93ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBiYXNlT3ZlcmZsb3cpLCBvdmVyZmxvdyk7XG4gIC8vIFN1cHBvcnQgYXV0byBzaGlmdFxuICBpZiAoIW1lcmdlZE92ZXJmbG93LnNoaWZ0WCkge1xuICAgIG1lcmdlZE92ZXJmbG93LmFkanVzdFggPSB0cnVlO1xuICB9XG4gIGlmICghbWVyZ2VkT3ZlcmZsb3cuc2hpZnRZKSB7XG4gICAgbWVyZ2VkT3ZlcmZsb3cuYWRqdXN0WSA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIG1lcmdlZE92ZXJmbG93O1xufVxuY29uc3QgUGxhY2VtZW50QWxpZ25NYXAgPSB7XG4gIGxlZnQ6IHtcbiAgICBwb2ludHM6IFsnY3InLCAnY2wnXVxuICB9LFxuICByaWdodDoge1xuICAgIHBvaW50czogWydjbCcsICdjciddXG4gIH0sXG4gIHRvcDoge1xuICAgIHBvaW50czogWydiYycsICd0YyddXG4gIH0sXG4gIGJvdHRvbToge1xuICAgIHBvaW50czogWyd0YycsICdiYyddXG4gIH0sXG4gIHRvcExlZnQ6IHtcbiAgICBwb2ludHM6IFsnYmwnLCAndGwnXVxuICB9LFxuICBsZWZ0VG9wOiB7XG4gICAgcG9pbnRzOiBbJ3RyJywgJ3RsJ11cbiAgfSxcbiAgdG9wUmlnaHQ6IHtcbiAgICBwb2ludHM6IFsnYnInLCAndHInXVxuICB9LFxuICByaWdodFRvcDoge1xuICAgIHBvaW50czogWyd0bCcsICd0ciddXG4gIH0sXG4gIGJvdHRvbVJpZ2h0OiB7XG4gICAgcG9pbnRzOiBbJ3RyJywgJ2JyJ11cbiAgfSxcbiAgcmlnaHRCb3R0b206IHtcbiAgICBwb2ludHM6IFsnYmwnLCAnYnInXVxuICB9LFxuICBib3R0b21MZWZ0OiB7XG4gICAgcG9pbnRzOiBbJ3RsJywgJ2JsJ11cbiAgfSxcbiAgbGVmdEJvdHRvbToge1xuICAgIHBvaW50czogWydicicsICdibCddXG4gIH1cbn07XG5jb25zdCBBcnJvd0NlbnRlclBsYWNlbWVudEFsaWduTWFwID0ge1xuICB0b3BMZWZ0OiB7XG4gICAgcG9pbnRzOiBbJ2JsJywgJ3RjJ11cbiAgfSxcbiAgbGVmdFRvcDoge1xuICAgIHBvaW50czogWyd0cicsICdjbCddXG4gIH0sXG4gIHRvcFJpZ2h0OiB7XG4gICAgcG9pbnRzOiBbJ2JyJywgJ3RjJ11cbiAgfSxcbiAgcmlnaHRUb3A6IHtcbiAgICBwb2ludHM6IFsndGwnLCAnY3InXVxuICB9LFxuICBib3R0b21SaWdodDoge1xuICAgIHBvaW50czogWyd0cicsICdiYyddXG4gIH0sXG4gIHJpZ2h0Qm90dG9tOiB7XG4gICAgcG9pbnRzOiBbJ2JsJywgJ2NyJ11cbiAgfSxcbiAgYm90dG9tTGVmdDoge1xuICAgIHBvaW50czogWyd0bCcsICdiYyddXG4gIH0sXG4gIGxlZnRCb3R0b206IHtcbiAgICBwb2ludHM6IFsnYnInLCAnY2wnXVxuICB9XG59O1xuY29uc3QgRGlzYWJsZUF1dG9BcnJvd0xpc3QgPSBuZXcgU2V0KFsndG9wTGVmdCcsICd0b3BSaWdodCcsICdib3R0b21MZWZ0JywgJ2JvdHRvbVJpZ2h0JywgJ2xlZnRUb3AnLCAnbGVmdEJvdHRvbScsICdyaWdodFRvcCcsICdyaWdodEJvdHRvbSddKTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFBsYWNlbWVudHMoY29uZmlnKSB7XG4gIGNvbnN0IHtcbiAgICBhcnJvd1dpZHRoLFxuICAgIGF1dG9BZGp1c3RPdmVyZmxvdyxcbiAgICBhcnJvd1BvaW50QXRDZW50ZXIsXG4gICAgb2Zmc2V0LFxuICAgIGJvcmRlclJhZGl1cyxcbiAgICB2aXNpYmxlRmlyc3RcbiAgfSA9IGNvbmZpZztcbiAgY29uc3QgaGFsZkFycm93V2lkdGggPSBhcnJvd1dpZHRoIC8gMjtcbiAgY29uc3QgcGxhY2VtZW50TWFwID0ge307XG4gIE9iamVjdC5rZXlzKFBsYWNlbWVudEFsaWduTWFwKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgY29uc3QgdGVtcGxhdGUgPSBhcnJvd1BvaW50QXRDZW50ZXIgJiYgQXJyb3dDZW50ZXJQbGFjZW1lbnRBbGlnbk1hcFtrZXldIHx8IFBsYWNlbWVudEFsaWduTWFwW2tleV07XG4gICAgY29uc3QgcGxhY2VtZW50SW5mbyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGVtcGxhdGUpLCB7XG4gICAgICBvZmZzZXQ6IFswLCAwXSxcbiAgICAgIGR5bmFtaWNJbnNldDogdHJ1ZVxuICAgIH0pO1xuICAgIHBsYWNlbWVudE1hcFtrZXldID0gcGxhY2VtZW50SW5mbztcbiAgICAvLyBEaXNhYmxlIGF1dG9BcnJvdyBzaW5jZSBkZXNpZ24gaXMgZml4ZWQgcG9zaXRpb25cbiAgICBpZiAoRGlzYWJsZUF1dG9BcnJvd0xpc3QuaGFzKGtleSkpIHtcbiAgICAgIHBsYWNlbWVudEluZm8uYXV0b0Fycm93ID0gZmFsc2U7XG4gICAgfVxuICAgIC8vIFN0YXRpYyBvZmZzZXRcbiAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgY2FzZSAndG9wJzpcbiAgICAgIGNhc2UgJ3RvcExlZnQnOlxuICAgICAgY2FzZSAndG9wUmlnaHQnOlxuICAgICAgICBwbGFjZW1lbnRJbmZvLm9mZnNldFsxXSA9IC1oYWxmQXJyb3dXaWR0aCAtIG9mZnNldDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdib3R0b20nOlxuICAgICAgY2FzZSAnYm90dG9tTGVmdCc6XG4gICAgICBjYXNlICdib3R0b21SaWdodCc6XG4gICAgICAgIHBsYWNlbWVudEluZm8ub2Zmc2V0WzFdID0gaGFsZkFycm93V2lkdGggKyBvZmZzZXQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICBjYXNlICdsZWZ0VG9wJzpcbiAgICAgIGNhc2UgJ2xlZnRCb3R0b20nOlxuICAgICAgICBwbGFjZW1lbnRJbmZvLm9mZnNldFswXSA9IC1oYWxmQXJyb3dXaWR0aCAtIG9mZnNldDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyaWdodCc6XG4gICAgICBjYXNlICdyaWdodFRvcCc6XG4gICAgICBjYXNlICdyaWdodEJvdHRvbSc6XG4gICAgICAgIHBsYWNlbWVudEluZm8ub2Zmc2V0WzBdID0gaGFsZkFycm93V2lkdGggKyBvZmZzZXQ7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICAvLyBEeW5hbWljIG9mZnNldFxuICAgIGNvbnN0IGFycm93T2Zmc2V0ID0gZ2V0QXJyb3dPZmZzZXRUb2tlbih7XG4gICAgICBjb250ZW50UmFkaXVzOiBib3JkZXJSYWRpdXMsXG4gICAgICBsaW1pdFZlcnRpY2FsUmFkaXVzOiB0cnVlXG4gICAgfSk7XG4gICAgaWYgKGFycm93UG9pbnRBdENlbnRlcikge1xuICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgY2FzZSAndG9wTGVmdCc6XG4gICAgICAgIGNhc2UgJ2JvdHRvbUxlZnQnOlxuICAgICAgICAgIHBsYWNlbWVudEluZm8ub2Zmc2V0WzBdID0gLWFycm93T2Zmc2V0LmFycm93T2Zmc2V0SG9yaXpvbnRhbCAtIGhhbGZBcnJvd1dpZHRoO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0b3BSaWdodCc6XG4gICAgICAgIGNhc2UgJ2JvdHRvbVJpZ2h0JzpcbiAgICAgICAgICBwbGFjZW1lbnRJbmZvLm9mZnNldFswXSA9IGFycm93T2Zmc2V0LmFycm93T2Zmc2V0SG9yaXpvbnRhbCArIGhhbGZBcnJvd1dpZHRoO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdsZWZ0VG9wJzpcbiAgICAgICAgY2FzZSAncmlnaHRUb3AnOlxuICAgICAgICAgIHBsYWNlbWVudEluZm8ub2Zmc2V0WzFdID0gLWFycm93T2Zmc2V0LmFycm93T2Zmc2V0SG9yaXpvbnRhbCAqIDIgKyBoYWxmQXJyb3dXaWR0aDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbGVmdEJvdHRvbSc6XG4gICAgICAgIGNhc2UgJ3JpZ2h0Qm90dG9tJzpcbiAgICAgICAgICBwbGFjZW1lbnRJbmZvLm9mZnNldFsxXSA9IGFycm93T2Zmc2V0LmFycm93T2Zmc2V0SG9yaXpvbnRhbCAqIDIgLSBoYWxmQXJyb3dXaWR0aDtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gT3ZlcmZsb3dcbiAgICBwbGFjZW1lbnRJbmZvLm92ZXJmbG93ID0gZ2V0T3ZlcmZsb3dPcHRpb25zKGtleSwgYXJyb3dPZmZzZXQsIGFycm93V2lkdGgsIGF1dG9BZGp1c3RPdmVyZmxvdyk7XG4gICAgLy8gVmlzaWJsZUZpcnN0XG4gICAgaWYgKHZpc2libGVGaXJzdCkge1xuICAgICAgcGxhY2VtZW50SW5mby5odG1sUmVnaW9uID0gJ3Zpc2libGVGaXJzdCc7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHBsYWNlbWVudE1hcDtcbn0iLCAiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgUG9wdXAgfSBmcm9tICdyYy10b29sdGlwJztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHVzZVN0eWxlIGZyb20gJy4vc3R5bGUnO1xuaW1wb3J0IHsgcGFyc2VDb2xvciB9IGZyb20gJy4vdXRpbCc7XG4vKiogQHByaXZhdGUgSW50ZXJuYWwgQ29tcG9uZW50LiBEbyBub3QgdXNlIGluIHlvdXIgcHJvZHVjdGlvbi4gKi9cbmNvbnN0IFB1cmVQYW5lbCA9IHByb3BzID0+IHtcbiAgY29uc3Qge1xuICAgIHByZWZpeENsczogY3VzdG9taXplUHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZSxcbiAgICBwbGFjZW1lbnQgPSAndG9wJyxcbiAgICB0aXRsZSxcbiAgICBjb2xvcixcbiAgICBvdmVybGF5SW5uZXJTdHlsZVxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IHtcbiAgICBnZXRQcmVmaXhDbHNcbiAgfSA9IFJlYWN0LnVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCk7XG4gIGNvbnN0IHByZWZpeENscyA9IGdldFByZWZpeENscygndG9vbHRpcCcsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIGNvbnN0IFt3cmFwQ1NTVmFyLCBoYXNoSWQsIGNzc1ZhckNsc10gPSB1c2VTdHlsZShwcmVmaXhDbHMpO1xuICAvLyBDb2xvclxuICBjb25zdCBjb2xvckluZm8gPSBwYXJzZUNvbG9yKHByZWZpeENscywgY29sb3IpO1xuICBjb25zdCBhcnJvd0NvbnRlbnRTdHlsZSA9IGNvbG9ySW5mby5hcnJvd1N0eWxlO1xuICBjb25zdCBmb3JtYXR0ZWRPdmVybGF5SW5uZXJTdHlsZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3ZlcmxheUlubmVyU3R5bGUpLCBjb2xvckluZm8ub3ZlcmxheVN0eWxlKTtcbiAgY29uc3QgY2xzID0gY2xhc3NOYW1lcyhoYXNoSWQsIGNzc1ZhckNscywgcHJlZml4Q2xzLCBgJHtwcmVmaXhDbHN9LXB1cmVgLCBgJHtwcmVmaXhDbHN9LXBsYWNlbWVudC0ke3BsYWNlbWVudH1gLCBjbGFzc05hbWUsIGNvbG9ySW5mby5jbGFzc05hbWUpO1xuICByZXR1cm4gd3JhcENTU1ZhcigvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbHMsXG4gICAgc3R5bGU6IGFycm93Q29udGVudFN0eWxlXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGAke3ByZWZpeENsc30tYXJyb3dgXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQb3B1cCwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICBjbGFzc05hbWU6IGhhc2hJZCxcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBvdmVybGF5SW5uZXJTdHlsZTogZm9ybWF0dGVkT3ZlcmxheUlubmVyU3R5bGVcbiAgfSksIHRpdGxlKSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFB1cmVQYW5lbDsiLCAiaW1wb3J0IHsgdW5pdCB9IGZyb20gJ0BhbnQtZGVzaWduL2Nzc2luanMnO1xuaW1wb3J0IHsgcmVzZXRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9zdHlsZSc7XG5pbXBvcnQgeyBpbml0Wm9vbU1vdGlvbiB9IGZyb20gJy4uLy4uL3N0eWxlL21vdGlvbic7XG5pbXBvcnQgZ2V0QXJyb3dTdHlsZSwgeyBnZXRBcnJvd09mZnNldFRva2VuLCBNQVhfVkVSVElDQUxfQ09OVEVOVF9SQURJVVMgfSBmcm9tICcuLi8uLi9zdHlsZS9wbGFjZW1lbnRBcnJvdyc7XG5pbXBvcnQgeyBnZXRBcnJvd1Rva2VuIH0gZnJvbSAnLi4vLi4vc3R5bGUvcm91bmRlZEFycm93JztcbmltcG9ydCB7IGdlblByZXNldENvbG9yLCBnZW5TdHlsZUhvb2tzLCBtZXJnZVRva2VuIH0gZnJvbSAnLi4vLi4vdGhlbWUvaW50ZXJuYWwnO1xuY29uc3QgZ2VuVG9vbHRpcFN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY2FsYyxcbiAgICBjb21wb25lbnRDbHMsXG4gICAgLy8gYW50LXRvb2x0aXBcbiAgICB0b29sdGlwTWF4V2lkdGgsXG4gICAgdG9vbHRpcENvbG9yLFxuICAgIHRvb2x0aXBCZyxcbiAgICB0b29sdGlwQm9yZGVyUmFkaXVzLFxuICAgIHpJbmRleFBvcHVwLFxuICAgIGNvbnRyb2xIZWlnaHQsXG4gICAgYm94U2hhZG93U2Vjb25kYXJ5LFxuICAgIHBhZGRpbmdTTSxcbiAgICBwYWRkaW5nWFMsXG4gICAgYXJyb3dPZmZzZXRIb3Jpem9udGFsLFxuICAgIHNpemVQb3B1cEFycm93XG4gIH0gPSB0b2tlbjtcbiAgLy8gYXJyb3dPZmZzZXRIb3Jpem9udGFsICsgYXJyb3dXaWR0aCArIGJvcmRlclJhZGl1c1xuICBjb25zdCBlZGdlQWxpZ25NaW5XaWR0aCA9IGNhbGModG9vbHRpcEJvcmRlclJhZGl1cykuYWRkKHNpemVQb3B1cEFycm93KS5hZGQoYXJyb3dPZmZzZXRIb3Jpem9udGFsKS5lcXVhbCgpO1xuICAvLyBib3JkZXJSYWRpdXMgKiAyICsgYXJyb3dXaWR0aFxuICBjb25zdCBjZW50ZXJBbGlnbk1pbldpZHRoID0gY2FsYyh0b29sdGlwQm9yZGVyUmFkaXVzKS5tdWwoMikuYWRkKHNpemVQb3B1cEFycm93KS5lcXVhbCgpO1xuICByZXR1cm4gW3tcbiAgICBbY29tcG9uZW50Q2xzXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVzZXRDb21wb25lbnQodG9rZW4pKSwge1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICB6SW5kZXg6IHpJbmRleFBvcHVwLFxuICAgICAgZGlzcGxheTogJ2Jsb2NrJyxcbiAgICAgIHdpZHRoOiAnbWF4LWNvbnRlbnQnLFxuICAgICAgbWF4V2lkdGg6IHRvb2x0aXBNYXhXaWR0aCxcbiAgICAgIHZpc2liaWxpdHk6ICd2aXNpYmxlJyxcbiAgICAgIC8vIFdoZW4gdXNlIGBhdXRvQXJyb3dgLCBvcmlnaW4gd2lsbCBmb2xsb3cgdGhlIGFycm93IHBvc2l0aW9uXG4gICAgICAnLS12YWxpZC1vZmZzZXQteCc6ICd2YXIoLS1hcnJvdy1vZmZzZXQtaG9yaXpvbnRhbCwgdmFyKC0tYXJyb3cteCkpJyxcbiAgICAgIHRyYW5zZm9ybU9yaWdpbjogW2B2YXIoLS12YWxpZC1vZmZzZXQteCwgNTAlKWAsIGB2YXIoLS1hcnJvdy15LCA1MCUpYF0uam9pbignICcpLFxuICAgICAgJyYtaGlkZGVuJzoge1xuICAgICAgICBkaXNwbGF5OiAnbm9uZSdcbiAgICAgIH0sXG4gICAgICAnLS1hbnRkLWFycm93LWJhY2tncm91bmQtY29sb3InOiB0b29sdGlwQmcsXG4gICAgICAvLyBXcmFwcGVyIGZvciB0aGUgdG9vbHRpcCBjb250ZW50XG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1pbm5lcmBdOiB7XG4gICAgICAgIG1pbldpZHRoOiBjZW50ZXJBbGlnbk1pbldpZHRoLFxuICAgICAgICBtaW5IZWlnaHQ6IGNvbnRyb2xIZWlnaHQsXG4gICAgICAgIHBhZGRpbmc6IGAke3VuaXQodG9rZW4uY2FsYyhwYWRkaW5nU00pLmRpdigyKS5lcXVhbCgpKX0gJHt1bml0KHBhZGRpbmdYUyl9YCxcbiAgICAgICAgY29sb3I6IHRvb2x0aXBDb2xvcixcbiAgICAgICAgdGV4dEFsaWduOiAnc3RhcnQnLFxuICAgICAgICB0ZXh0RGVjb3JhdGlvbjogJ25vbmUnLFxuICAgICAgICB3b3JkV3JhcDogJ2JyZWFrLXdvcmQnLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRvb2x0aXBCZyxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiB0b29sdGlwQm9yZGVyUmFkaXVzLFxuICAgICAgICBib3hTaGFkb3c6IGJveFNoYWRvd1NlY29uZGFyeSxcbiAgICAgICAgYm94U2l6aW5nOiAnYm9yZGVyLWJveCdcbiAgICAgIH0sXG4gICAgICAvLyBBbGlnbiBwbGFjZW1lbnQgc2hvdWxkIGhhdmUgYW5vdGhlciBtaW4gd2lkdGhcbiAgICAgIFtbYCYtcGxhY2VtZW50LXRvcExlZnRgLCBgJi1wbGFjZW1lbnQtdG9wUmlnaHRgLCBgJi1wbGFjZW1lbnQtYm90dG9tTGVmdGAsIGAmLXBsYWNlbWVudC1ib3R0b21SaWdodGBdLmpvaW4oJywnKV06IHtcbiAgICAgICAgbWluV2lkdGg6IGVkZ2VBbGlnbk1pbldpZHRoXG4gICAgICB9LFxuICAgICAgLy8gTGltaXQgbGVmdCBhbmQgcmlnaHQgcGxhY2VtZW50IHJhZGl1c1xuICAgICAgW1tgJi1wbGFjZW1lbnQtbGVmdGAsIGAmLXBsYWNlbWVudC1sZWZ0VG9wYCwgYCYtcGxhY2VtZW50LWxlZnRCb3R0b21gLCBgJi1wbGFjZW1lbnQtcmlnaHRgLCBgJi1wbGFjZW1lbnQtcmlnaHRUb3BgLCBgJi1wbGFjZW1lbnQtcmlnaHRCb3R0b21gXS5qb2luKCcsJyldOiB7XG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LWlubmVyYF06IHtcbiAgICAgICAgICBib3JkZXJSYWRpdXM6IHRva2VuLm1pbih0b29sdGlwQm9yZGVyUmFkaXVzLCBNQVhfVkVSVElDQUxfQ09OVEVOVF9SQURJVVMpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1jb250ZW50YF06IHtcbiAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZSdcbiAgICAgIH1cbiAgICB9KSwgZ2VuUHJlc2V0Q29sb3IodG9rZW4sIChjb2xvcktleSwgX3JlZikgPT4ge1xuICAgICAgbGV0IHtcbiAgICAgICAgZGFya0NvbG9yXG4gICAgICB9ID0gX3JlZjtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIFtgJiR7Y29tcG9uZW50Q2xzfS0ke2NvbG9yS2V5fWBdOiB7XG4gICAgICAgICAgW2Ake2NvbXBvbmVudENsc30taW5uZXJgXToge1xuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBkYXJrQ29sb3JcbiAgICAgICAgICB9LFxuICAgICAgICAgIFtgJHtjb21wb25lbnRDbHN9LWFycm93YF06IHtcbiAgICAgICAgICAgICctLWFudGQtYXJyb3ctYmFja2dyb3VuZC1jb2xvcic6IGRhcmtDb2xvclxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KSksIHtcbiAgICAgIC8vIFJUTFxuICAgICAgJyYtcnRsJzoge1xuICAgICAgICBkaXJlY3Rpb246ICdydGwnXG4gICAgICB9XG4gICAgfSlcbiAgfSxcbiAgLy8gQXJyb3cgU3R5bGVcbiAgZ2V0QXJyb3dTdHlsZSh0b2tlbiwgJ3ZhcigtLWFudGQtYXJyb3ctYmFja2dyb3VuZC1jb2xvciknKSxcbiAgLy8gUHVyZSBSZW5kZXJcbiAge1xuICAgIFtgJHtjb21wb25lbnRDbHN9LXB1cmVgXToge1xuICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICBtYXhXaWR0aDogJ25vbmUnLFxuICAgICAgbWFyZ2luOiB0b2tlbi5zaXplUG9wdXBBcnJvd1xuICAgIH1cbiAgfV07XG59O1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEV4cG9ydCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmV4cG9ydCBjb25zdCBwcmVwYXJlQ29tcG9uZW50VG9rZW4gPSB0b2tlbiA9PiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe1xuICB6SW5kZXhQb3B1cDogdG9rZW4uekluZGV4UG9wdXBCYXNlICsgNzBcbn0sIGdldEFycm93T2Zmc2V0VG9rZW4oe1xuICBjb250ZW50UmFkaXVzOiB0b2tlbi5ib3JkZXJSYWRpdXMsXG4gIGxpbWl0VmVydGljYWxSYWRpdXM6IHRydWVcbn0pKSwgZ2V0QXJyb3dUb2tlbihtZXJnZVRva2VuKHRva2VuLCB7XG4gIGJvcmRlclJhZGl1c091dGVyOiBNYXRoLm1pbih0b2tlbi5ib3JkZXJSYWRpdXNPdXRlciwgNClcbn0pKSk7XG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gKHByZWZpeENscykge1xuICBsZXQgaW5qZWN0U3R5bGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7XG4gIGNvbnN0IHVzZVN0eWxlID0gZ2VuU3R5bGVIb29rcygnVG9vbHRpcCcsIHRva2VuID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBib3JkZXJSYWRpdXMsXG4gICAgICBjb2xvclRleHRMaWdodFNvbGlkLFxuICAgICAgY29sb3JCZ1Nwb3RsaWdodFxuICAgIH0gPSB0b2tlbjtcbiAgICBjb25zdCBUb29sdGlwVG9rZW4gPSBtZXJnZVRva2VuKHRva2VuLCB7XG4gICAgICAvLyBkZWZhdWx0IHZhcmlhYmxlc1xuICAgICAgdG9vbHRpcE1heFdpZHRoOiAyNTAsXG4gICAgICB0b29sdGlwQ29sb3I6IGNvbG9yVGV4dExpZ2h0U29saWQsXG4gICAgICB0b29sdGlwQm9yZGVyUmFkaXVzOiBib3JkZXJSYWRpdXMsXG4gICAgICB0b29sdGlwQmc6IGNvbG9yQmdTcG90bGlnaHRcbiAgICB9KTtcbiAgICByZXR1cm4gW2dlblRvb2x0aXBTdHlsZShUb29sdGlwVG9rZW4pLCBpbml0Wm9vbU1vdGlvbih0b2tlbiwgJ3pvb20tYmlnLWZhc3QnKV07XG4gIH0sIHByZXBhcmVDb21wb25lbnRUb2tlbiwge1xuICAgIHJlc2V0U3R5bGU6IGZhbHNlLFxuICAgIC8vIFBvcG92ZXIgdXNlIFRvb2x0aXAgYXMgaW50ZXJuYWwgY29tcG9uZW50LiBXZSBkbyBub3QgbmVlZCB0byBoYW5kbGUgdGhpcy5cbiAgICBpbmplY3RTdHlsZVxuICB9KTtcbiAgcmV0dXJuIHVzZVN0eWxlKHByZWZpeENscyk7XG59KTsiLCAiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyBpc1ByZXNldENvbG9yIH0gZnJvbSAnLi4vX3V0aWwvY29sb3JzJztcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNvbG9yKHByZWZpeENscywgY29sb3IpIHtcbiAgY29uc3QgaXNJbnRlcm5hbENvbG9yID0gaXNQcmVzZXRDb2xvcihjb2xvcik7XG4gIGNvbnN0IGNsYXNzTmFtZSA9IGNsYXNzTmFtZXMoe1xuICAgIFtgJHtwcmVmaXhDbHN9LSR7Y29sb3J9YF06IGNvbG9yICYmIGlzSW50ZXJuYWxDb2xvclxuICB9KTtcbiAgY29uc3Qgb3ZlcmxheVN0eWxlID0ge307XG4gIGNvbnN0IGFycm93U3R5bGUgPSB7fTtcbiAgaWYgKGNvbG9yICYmICFpc0ludGVybmFsQ29sb3IpIHtcbiAgICBvdmVybGF5U3R5bGUuYmFja2dyb3VuZCA9IGNvbG9yO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBhcnJvd1N0eWxlWyctLWFudGQtYXJyb3ctYmFja2dyb3VuZC1jb2xvciddID0gY29sb3I7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBjbGFzc05hbWUsXG4gICAgb3ZlcmxheVN0eWxlLFxuICAgIGFycm93U3R5bGVcbiAgfTtcbn0iLCAiaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCB7IFByZXNldENvbG9ycyB9IGZyb20gJy4uL3RoZW1lL2ludGVyZmFjZSc7XG5jb25zdCBpbnZlcnNlQ29sb3JzID0gUHJlc2V0Q29sb3JzLm1hcChjb2xvciA9PiBgJHtjb2xvcn0taW52ZXJzZWApO1xuZXhwb3J0IGNvbnN0IFByZXNldFN0YXR1c0NvbG9yVHlwZXMgPSBbJ3N1Y2Nlc3MnLCAncHJvY2Vzc2luZycsICdlcnJvcicsICdkZWZhdWx0JywgJ3dhcm5pbmcnXTtcbi8qKlxuICogZGV0ZXJtaW5lIGlmIHRoZSBjb2xvciBrZXl3b3JkIGJlbG9uZ3MgdG8gdGhlIGBBbnQgRGVzaWduYCB7QGxpbmsgUHJlc2V0Q29sb3JzfS5cbiAqIEBwYXJhbSBjb2xvciBjb2xvciB0byBiZSBqdWRnZWRcbiAqIEBwYXJhbSBpbmNsdWRlSW52ZXJzZSB3aGV0aGVyIHRvIGluY2x1ZGUgcmV2ZXJzZWQgY29sb3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ByZXNldENvbG9yKGNvbG9yKSB7XG4gIGxldCBpbmNsdWRlSW52ZXJzZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcbiAgaWYgKGluY2x1ZGVJbnZlcnNlKSB7XG4gICAgcmV0dXJuIFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoaW52ZXJzZUNvbG9ycyksIF90b0NvbnN1bWFibGVBcnJheShQcmVzZXRDb2xvcnMpKS5pbmNsdWRlcyhjb2xvcik7XG4gIH1cbiAgcmV0dXJuIFByZXNldENvbG9ycy5pbmNsdWRlcyhjb2xvcik7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNQcmVzZXRTdGF0dXNDb2xvcihjb2xvcikge1xuICByZXR1cm4gUHJlc2V0U3RhdHVzQ29sb3JUeXBlcy5pbmNsdWRlcyhjb2xvcik7XG59IiwgImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IExlZnRPdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9MZWZ0T3V0bGluZWRcIjtcbmltcG9ydCBBbnRkSWNvbiBmcm9tIFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiO1xudmFyIExlZnRPdXRsaW5lZCA9IGZ1bmN0aW9uIExlZnRPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbnRkSWNvbiwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogTGVmdE91dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5cbi8qKiFbbGVmdF0oZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTlRBaUlHaGxhV2RvZEQwaU5UQWlJR1pwYkd3OUlpTmpZV05oWTJFaUlIWnBaWGRDYjNnOUlqWTBJRFkwSURnNU5pQTRPVFlpSUdadlkzVnpZV0pzWlQwaVptRnNjMlVpSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUkrUEhCaGRHZ2daRDBpVFRjeU5DQXlNVGd1TTFZeE5ERmpNQzAyTGpjdE55NDNMVEV3TGpRdE1USXVPUzAyTGpOTU1qWXdMak1nTkRnMkxqaGhNekV1T0RZZ016RXVPRFlnTUNBd01EQWdOVEF1TTJ3ME5UQXVPQ0F6TlRJdU1XTTFMak1nTkM0eElERXlMamt1TkNBeE1pNDVMVFl1TTNZdE56Y3VNMk13TFRRdU9TMHlMak10T1M0MkxUWXVNUzB4TWk0MmJDMHpOakF0TWpneElETTJNQzB5T0RFdU1XTXpMamd0TXlBMkxqRXROeTQzSURZdU1TMHhNaTQyZWlJZ0x6NDhMM04yWno0PSkgKi9cbnZhciBSZWZJY29uID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoTGVmdE91dGxpbmVkKTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFJlZkljb24uZGlzcGxheU5hbWUgPSAnTGVmdE91dGxpbmVkJztcbn1cbmV4cG9ydCBkZWZhdWx0IFJlZkljb247IiwgIi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxudmFyIExlZnRPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNzI0IDIxOC4zVjE0MWMwLTYuNy03LjctMTAuNC0xMi45LTYuM0wyNjAuMyA0ODYuOGEzMS44NiAzMS44NiAwIDAwMCA1MC4zbDQ1MC44IDM1Mi4xYzUuMyA0LjEgMTIuOS40IDEyLjktNi4zdi03Ny4zYzAtNC45LTIuMy05LjYtNi4xLTEyLjZsLTM2MC0yODEgMzYwLTI4MS4xYzMuOC0zIDYuMS03LjcgNi4xLTEyLjZ6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJsZWZ0XCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnQgZGVmYXVsdCBMZWZ0T3V0bGluZWQ7XG4iLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJwcmVmaXhDbHNcIiwgXCJjbGFzc05hbWVcIiwgXCJzdHlsZVwiLCBcImNoZWNrZWRcIiwgXCJkaXNhYmxlZFwiLCBcImRlZmF1bHRDaGVja2VkXCIsIFwidHlwZVwiLCBcInRpdGxlXCIsIFwib25DaGFuZ2VcIl07XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB1c2VNZXJnZWRTdGF0ZSBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VNZXJnZWRTdGF0ZVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZm9yd2FyZFJlZiwgdXNlSW1wZXJhdGl2ZUhhbmRsZSwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuZXhwb3J0IHZhciBDaGVja2JveCA9IC8qI19fUFVSRV9fKi9mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBfcHJvcHMkcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIHByZWZpeENscyA9IF9wcm9wcyRwcmVmaXhDbHMgPT09IHZvaWQgMCA/ICdyYy1jaGVja2JveCcgOiBfcHJvcHMkcHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgIGNoZWNrZWQgPSBwcm9wcy5jaGVja2VkLFxuICAgIGRpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgX3Byb3BzJGRlZmF1bHRDaGVja2VkID0gcHJvcHMuZGVmYXVsdENoZWNrZWQsXG4gICAgZGVmYXVsdENoZWNrZWQgPSBfcHJvcHMkZGVmYXVsdENoZWNrZWQgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJGRlZmF1bHRDaGVja2VkLFxuICAgIF9wcm9wcyR0eXBlID0gcHJvcHMudHlwZSxcbiAgICB0eXBlID0gX3Byb3BzJHR5cGUgPT09IHZvaWQgMCA/ICdjaGVja2JveCcgOiBfcHJvcHMkdHlwZSxcbiAgICB0aXRsZSA9IHByb3BzLnRpdGxlLFxuICAgIG9uQ2hhbmdlID0gcHJvcHMub25DaGFuZ2UsXG4gICAgaW5wdXRQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgX2V4Y2x1ZGVkKTtcbiAgdmFyIGlucHV0UmVmID0gdXNlUmVmKG51bGwpO1xuICB2YXIgaG9sZGVyUmVmID0gdXNlUmVmKG51bGwpO1xuICB2YXIgX3VzZU1lcmdlZFN0YXRlID0gdXNlTWVyZ2VkU3RhdGUoZGVmYXVsdENoZWNrZWQsIHtcbiAgICAgIHZhbHVlOiBjaGVja2VkXG4gICAgfSksXG4gICAgX3VzZU1lcmdlZFN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VNZXJnZWRTdGF0ZSwgMiksXG4gICAgcmF3VmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGUyWzBdLFxuICAgIHNldFJhd1ZhbHVlID0gX3VzZU1lcmdlZFN0YXRlMlsxXTtcbiAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZm9jdXM6IGZ1bmN0aW9uIGZvY3VzKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9pbnB1dFJlZiRjdXJyZW50O1xuICAgICAgICAoX2lucHV0UmVmJGN1cnJlbnQgPSBpbnB1dFJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfaW5wdXRSZWYkY3VycmVudCA9PT0gdm9pZCAwIHx8IF9pbnB1dFJlZiRjdXJyZW50LmZvY3VzKG9wdGlvbnMpO1xuICAgICAgfSxcbiAgICAgIGJsdXI6IGZ1bmN0aW9uIGJsdXIoKSB7XG4gICAgICAgIHZhciBfaW5wdXRSZWYkY3VycmVudDI7XG4gICAgICAgIChfaW5wdXRSZWYkY3VycmVudDIgPSBpbnB1dFJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfaW5wdXRSZWYkY3VycmVudDIgPT09IHZvaWQgMCB8fCBfaW5wdXRSZWYkY3VycmVudDIuYmx1cigpO1xuICAgICAgfSxcbiAgICAgIGlucHV0OiBpbnB1dFJlZi5jdXJyZW50LFxuICAgICAgbmF0aXZlRWxlbWVudDogaG9sZGVyUmVmLmN1cnJlbnRcbiAgICB9O1xuICB9KTtcbiAgdmFyIGNsYXNzU3RyaW5nID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIGNsYXNzTmFtZSwgX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jaGVja2VkXCIpLCByYXdWYWx1ZSksIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZGlzYWJsZWRcIiksIGRpc2FibGVkKSk7XG4gIHZhciBoYW5kbGVDaGFuZ2UgPSBmdW5jdGlvbiBoYW5kbGVDaGFuZ2UoZSkge1xuICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoISgnY2hlY2tlZCcgaW4gcHJvcHMpKSB7XG4gICAgICBzZXRSYXdWYWx1ZShlLnRhcmdldC5jaGVja2VkKTtcbiAgICB9XG4gICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCB8fCBvbkNoYW5nZSh7XG4gICAgICB0YXJnZXQ6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCB7fSwge1xuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICBjaGVja2VkOiBlLnRhcmdldC5jaGVja2VkXG4gICAgICB9KSxcbiAgICAgIHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24gc3RvcFByb3BhZ2F0aW9uKCkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgfSxcbiAgICAgIHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbiBwcmV2ZW50RGVmYXVsdCgpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfSxcbiAgICAgIG5hdGl2ZUV2ZW50OiBlLm5hdGl2ZUV2ZW50XG4gICAgfSk7XG4gIH07XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NTdHJpbmcsXG4gICAgdGl0bGU6IHRpdGxlLFxuICAgIHN0eWxlOiBzdHlsZSxcbiAgICByZWY6IGhvbGRlclJlZlxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImlucHV0XCIsIF9leHRlbmRzKHt9LCBpbnB1dFByb3BzLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWlucHV0XCIpLFxuICAgIHJlZjogaW5wdXRSZWYsXG4gICAgb25DaGFuZ2U6IGhhbmRsZUNoYW5nZSxcbiAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgY2hlY2tlZDogISFyYXdWYWx1ZSxcbiAgICB0eXBlOiB0eXBlXG4gIH0pKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW5uZXJcIilcbiAgfSkpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBDaGVja2JveDsiLCAiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCByYWYgZnJvbSBcInJjLXV0aWwvZXMvcmFmXCI7XG4vKipcbiAqIFdoZW4gY2xpY2sgb24gdGhlIGxhYmVsLFxuICogdGhlIGV2ZW50IHdpbGwgYmUgc3RvcHBlZCB0byBwcmV2ZW50IHRoZSBsYWJlbCBmcm9tIGJlaW5nIGNsaWNrZWQgdHdpY2UuXG4gKiBsYWJlbCBjbGljayAtPiBpbnB1dCBjbGljayAtPiBsYWJlbCBjbGljayBhZ2FpblxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VCdWJibGVMb2NrKG9uT3JpZ2luSW5wdXRDbGljaykge1xuICBjb25zdCBsYWJlbENsaWNrTG9ja1JlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3QgY2xlYXJMb2NrID0gKCkgPT4ge1xuICAgIHJhZi5jYW5jZWwobGFiZWxDbGlja0xvY2tSZWYuY3VycmVudCk7XG4gICAgbGFiZWxDbGlja0xvY2tSZWYuY3VycmVudCA9IG51bGw7XG4gIH07XG4gIGNvbnN0IG9uTGFiZWxDbGljayA9ICgpID0+IHtcbiAgICBjbGVhckxvY2soKTtcbiAgICBsYWJlbENsaWNrTG9ja1JlZi5jdXJyZW50ID0gcmFmKCgpID0+IHtcbiAgICAgIGxhYmVsQ2xpY2tMb2NrUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgIH0pO1xuICB9O1xuICBjb25zdCBvbklucHV0Q2xpY2sgPSBlID0+IHtcbiAgICBpZiAobGFiZWxDbGlja0xvY2tSZWYuY3VycmVudCkge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGNsZWFyTG9jaygpO1xuICAgIH1cbiAgICBvbk9yaWdpbklucHV0Q2xpY2sgPT09IG51bGwgfHwgb25PcmlnaW5JbnB1dENsaWNrID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbk9yaWdpbklucHV0Q2xpY2soZSk7XG4gIH07XG4gIHJldHVybiBbb25MYWJlbENsaWNrLCBvbklucHV0Q2xpY2tdO1xufSIsICJpbXBvcnQgeyBtZXJnZVRva2VuIH0gZnJvbSAnLi4vLi4vdGhlbWUvaW50ZXJuYWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRJbnB1dFRva2VuKHRva2VuKSB7XG4gIHJldHVybiBtZXJnZVRva2VuKHRva2VuLCB7XG4gICAgaW5wdXRBZmZpeFBhZGRpbmc6IHRva2VuLnBhZGRpbmdYWFNcbiAgfSk7XG59XG5leHBvcnQgY29uc3QgaW5pdENvbXBvbmVudFRva2VuID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29udHJvbEhlaWdodCxcbiAgICBmb250U2l6ZSxcbiAgICBsaW5lSGVpZ2h0LFxuICAgIGxpbmVXaWR0aCxcbiAgICBjb250cm9sSGVpZ2h0U00sXG4gICAgY29udHJvbEhlaWdodExHLFxuICAgIGZvbnRTaXplTEcsXG4gICAgbGluZUhlaWdodExHLFxuICAgIHBhZGRpbmdTTSxcbiAgICBjb250cm9sUGFkZGluZ0hvcml6b250YWxTTSxcbiAgICBjb250cm9sUGFkZGluZ0hvcml6b250YWwsXG4gICAgY29sb3JGaWxsQWx0ZXIsXG4gICAgY29sb3JQcmltYXJ5SG92ZXIsXG4gICAgY29sb3JQcmltYXJ5LFxuICAgIGNvbnRyb2xPdXRsaW5lV2lkdGgsXG4gICAgY29udHJvbE91dGxpbmUsXG4gICAgY29sb3JFcnJvck91dGxpbmUsXG4gICAgY29sb3JXYXJuaW5nT3V0bGluZSxcbiAgICBjb2xvckJnQ29udGFpbmVyLFxuICAgIGlucHV0Rm9udFNpemUsXG4gICAgaW5wdXRGb250U2l6ZUxHLFxuICAgIGlucHV0Rm9udFNpemVTTVxuICB9ID0gdG9rZW47XG4gIGNvbnN0IG1lcmdlZEZvbnRTaXplID0gaW5wdXRGb250U2l6ZSB8fCBmb250U2l6ZTtcbiAgY29uc3QgbWVyZ2VkRm9udFNpemVTTSA9IGlucHV0Rm9udFNpemVTTSB8fCBtZXJnZWRGb250U2l6ZTtcbiAgY29uc3QgbWVyZ2VkRm9udFNpemVMRyA9IGlucHV0Rm9udFNpemVMRyB8fCBmb250U2l6ZUxHO1xuICBjb25zdCBwYWRkaW5nQmxvY2sgPSBNYXRoLnJvdW5kKChjb250cm9sSGVpZ2h0IC0gbWVyZ2VkRm9udFNpemUgKiBsaW5lSGVpZ2h0KSAvIDIgKiAxMCkgLyAxMCAtIGxpbmVXaWR0aDtcbiAgY29uc3QgcGFkZGluZ0Jsb2NrU00gPSBNYXRoLnJvdW5kKChjb250cm9sSGVpZ2h0U00gLSBtZXJnZWRGb250U2l6ZVNNICogbGluZUhlaWdodCkgLyAyICogMTApIC8gMTAgLSBsaW5lV2lkdGg7XG4gIGNvbnN0IHBhZGRpbmdCbG9ja0xHID0gTWF0aC5jZWlsKChjb250cm9sSGVpZ2h0TEcgLSBtZXJnZWRGb250U2l6ZUxHICogbGluZUhlaWdodExHKSAvIDIgKiAxMCkgLyAxMCAtIGxpbmVXaWR0aDtcbiAgcmV0dXJuIHtcbiAgICBwYWRkaW5nQmxvY2s6IE1hdGgubWF4KHBhZGRpbmdCbG9jaywgMCksXG4gICAgcGFkZGluZ0Jsb2NrU006IE1hdGgubWF4KHBhZGRpbmdCbG9ja1NNLCAwKSxcbiAgICBwYWRkaW5nQmxvY2tMRzogTWF0aC5tYXgocGFkZGluZ0Jsb2NrTEcsIDApLFxuICAgIHBhZGRpbmdJbmxpbmU6IHBhZGRpbmdTTSAtIGxpbmVXaWR0aCxcbiAgICBwYWRkaW5nSW5saW5lU006IGNvbnRyb2xQYWRkaW5nSG9yaXpvbnRhbFNNIC0gbGluZVdpZHRoLFxuICAgIHBhZGRpbmdJbmxpbmVMRzogY29udHJvbFBhZGRpbmdIb3Jpem9udGFsIC0gbGluZVdpZHRoLFxuICAgIGFkZG9uQmc6IGNvbG9yRmlsbEFsdGVyLFxuICAgIGFjdGl2ZUJvcmRlckNvbG9yOiBjb2xvclByaW1hcnksXG4gICAgaG92ZXJCb3JkZXJDb2xvcjogY29sb3JQcmltYXJ5SG92ZXIsXG4gICAgYWN0aXZlU2hhZG93OiBgMCAwIDAgJHtjb250cm9sT3V0bGluZVdpZHRofXB4ICR7Y29udHJvbE91dGxpbmV9YCxcbiAgICBlcnJvckFjdGl2ZVNoYWRvdzogYDAgMCAwICR7Y29udHJvbE91dGxpbmVXaWR0aH1weCAke2NvbG9yRXJyb3JPdXRsaW5lfWAsXG4gICAgd2FybmluZ0FjdGl2ZVNoYWRvdzogYDAgMCAwICR7Y29udHJvbE91dGxpbmVXaWR0aH1weCAke2NvbG9yV2FybmluZ091dGxpbmV9YCxcbiAgICBob3ZlckJnOiBjb2xvckJnQ29udGFpbmVyLFxuICAgIGFjdGl2ZUJnOiBjb2xvckJnQ29udGFpbmVyLFxuICAgIGlucHV0Rm9udFNpemU6IG1lcmdlZEZvbnRTaXplLFxuICAgIGlucHV0Rm9udFNpemVMRzogbWVyZ2VkRm9udFNpemVMRyxcbiAgICBpbnB1dEZvbnRTaXplU006IG1lcmdlZEZvbnRTaXplU01cbiAgfTtcbn07IiwgImltcG9ydCB7IHVuaXQgfSBmcm9tICdAYW50LWRlc2lnbi9jc3NpbmpzJztcbmltcG9ydCB7IG1lcmdlVG9rZW4gfSBmcm9tICcuLi8uLi90aGVtZS9pbnRlcm5hbCc7XG5leHBvcnQgY29uc3QgZ2VuSG92ZXJTdHlsZSA9IHRva2VuID0+ICh7XG4gIGJvcmRlckNvbG9yOiB0b2tlbi5ob3ZlckJvcmRlckNvbG9yLFxuICBiYWNrZ3JvdW5kQ29sb3I6IHRva2VuLmhvdmVyQmdcbn0pO1xuZXhwb3J0IGNvbnN0IGdlbkRpc2FibGVkU3R5bGUgPSB0b2tlbiA9PiAoe1xuICBjb2xvcjogdG9rZW4uY29sb3JUZXh0RGlzYWJsZWQsXG4gIGJhY2tncm91bmRDb2xvcjogdG9rZW4uY29sb3JCZ0NvbnRhaW5lckRpc2FibGVkLFxuICBib3JkZXJDb2xvcjogdG9rZW4uY29sb3JCb3JkZXIsXG4gIGJveFNoYWRvdzogJ25vbmUnLFxuICBjdXJzb3I6ICdub3QtYWxsb3dlZCcsXG4gIG9wYWNpdHk6IDEsXG4gICdpbnB1dFtkaXNhYmxlZF0sIHRleHRhcmVhW2Rpc2FibGVkXSc6IHtcbiAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCdcbiAgfSxcbiAgJyY6aG92ZXI6bm90KFtkaXNhYmxlZF0pJzogT2JqZWN0LmFzc2lnbih7fSwgZ2VuSG92ZXJTdHlsZShtZXJnZVRva2VuKHRva2VuLCB7XG4gICAgaG92ZXJCb3JkZXJDb2xvcjogdG9rZW4uY29sb3JCb3JkZXIsXG4gICAgaG92ZXJCZzogdG9rZW4uY29sb3JCZ0NvbnRhaW5lckRpc2FibGVkXG4gIH0pKSlcbn0pO1xuLyogPT09PT09PT09PT09PT0gT3V0bGluZWQgPT09PT09PT09PT09PT0gKi9cbmV4cG9ydCBjb25zdCBnZW5CYXNlT3V0bGluZWRTdHlsZSA9ICh0b2tlbiwgb3B0aW9ucykgPT4gKHtcbiAgYmFja2dyb3VuZDogdG9rZW4uY29sb3JCZ0NvbnRhaW5lcixcbiAgYm9yZGVyV2lkdGg6IHRva2VuLmxpbmVXaWR0aCxcbiAgYm9yZGVyU3R5bGU6IHRva2VuLmxpbmVUeXBlLFxuICBib3JkZXJDb2xvcjogb3B0aW9ucy5ib3JkZXJDb2xvcixcbiAgJyY6aG92ZXInOiB7XG4gICAgYm9yZGVyQ29sb3I6IG9wdGlvbnMuaG92ZXJCb3JkZXJDb2xvcixcbiAgICBiYWNrZ3JvdW5kQ29sb3I6IHRva2VuLmhvdmVyQmdcbiAgfSxcbiAgJyY6Zm9jdXMsICY6Zm9jdXMtd2l0aGluJzoge1xuICAgIGJvcmRlckNvbG9yOiBvcHRpb25zLmFjdGl2ZUJvcmRlckNvbG9yLFxuICAgIGJveFNoYWRvdzogb3B0aW9ucy5hY3RpdmVTaGFkb3csXG4gICAgb3V0bGluZTogMCxcbiAgICBiYWNrZ3JvdW5kQ29sb3I6IHRva2VuLmFjdGl2ZUJnXG4gIH1cbn0pO1xuY29uc3QgZ2VuT3V0bGluZWRTdGF0dXNTdHlsZSA9ICh0b2tlbiwgb3B0aW9ucykgPT4gKHtcbiAgW2AmJHt0b2tlbi5jb21wb25lbnRDbHN9LXN0YXR1cy0ke29wdGlvbnMuc3RhdHVzfTpub3QoJHt0b2tlbi5jb21wb25lbnRDbHN9LWRpc2FibGVkKWBdOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGdlbkJhc2VPdXRsaW5lZFN0eWxlKHRva2VuLCBvcHRpb25zKSksIHtcbiAgICBbYCR7dG9rZW4uY29tcG9uZW50Q2xzfS1wcmVmaXgsICR7dG9rZW4uY29tcG9uZW50Q2xzfS1zdWZmaXhgXToge1xuICAgICAgY29sb3I6IG9wdGlvbnMuYWZmaXhDb2xvclxuICAgIH1cbiAgfSksXG4gIFtgJiR7dG9rZW4uY29tcG9uZW50Q2xzfS1zdGF0dXMtJHtvcHRpb25zLnN0YXR1c30ke3Rva2VuLmNvbXBvbmVudENsc30tZGlzYWJsZWRgXToge1xuICAgIGJvcmRlckNvbG9yOiBvcHRpb25zLmJvcmRlckNvbG9yXG4gIH1cbn0pO1xuZXhwb3J0IGNvbnN0IGdlbk91dGxpbmVkU3R5bGUgPSAodG9rZW4sIGV4dHJhU3R5bGVzKSA9PiAoe1xuICAnJi1vdXRsaW5lZCc6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZ2VuQmFzZU91dGxpbmVkU3R5bGUodG9rZW4sIHtcbiAgICBib3JkZXJDb2xvcjogdG9rZW4uY29sb3JCb3JkZXIsXG4gICAgaG92ZXJCb3JkZXJDb2xvcjogdG9rZW4uaG92ZXJCb3JkZXJDb2xvcixcbiAgICBhY3RpdmVCb3JkZXJDb2xvcjogdG9rZW4uYWN0aXZlQm9yZGVyQ29sb3IsXG4gICAgYWN0aXZlU2hhZG93OiB0b2tlbi5hY3RpdmVTaGFkb3dcbiAgfSkpLCB7XG4gICAgW2AmJHt0b2tlbi5jb21wb25lbnRDbHN9LWRpc2FibGVkLCAmW2Rpc2FibGVkXWBdOiBPYmplY3QuYXNzaWduKHt9LCBnZW5EaXNhYmxlZFN0eWxlKHRva2VuKSlcbiAgfSksIGdlbk91dGxpbmVkU3RhdHVzU3R5bGUodG9rZW4sIHtcbiAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgYm9yZGVyQ29sb3I6IHRva2VuLmNvbG9yRXJyb3IsXG4gICAgaG92ZXJCb3JkZXJDb2xvcjogdG9rZW4uY29sb3JFcnJvckJvcmRlckhvdmVyLFxuICAgIGFjdGl2ZUJvcmRlckNvbG9yOiB0b2tlbi5jb2xvckVycm9yLFxuICAgIGFjdGl2ZVNoYWRvdzogdG9rZW4uZXJyb3JBY3RpdmVTaGFkb3csXG4gICAgYWZmaXhDb2xvcjogdG9rZW4uY29sb3JFcnJvclxuICB9KSksIGdlbk91dGxpbmVkU3RhdHVzU3R5bGUodG9rZW4sIHtcbiAgICBzdGF0dXM6ICd3YXJuaW5nJyxcbiAgICBib3JkZXJDb2xvcjogdG9rZW4uY29sb3JXYXJuaW5nLFxuICAgIGhvdmVyQm9yZGVyQ29sb3I6IHRva2VuLmNvbG9yV2FybmluZ0JvcmRlckhvdmVyLFxuICAgIGFjdGl2ZUJvcmRlckNvbG9yOiB0b2tlbi5jb2xvcldhcm5pbmcsXG4gICAgYWN0aXZlU2hhZG93OiB0b2tlbi53YXJuaW5nQWN0aXZlU2hhZG93LFxuICAgIGFmZml4Q29sb3I6IHRva2VuLmNvbG9yV2FybmluZ1xuICB9KSksIGV4dHJhU3R5bGVzKVxufSk7XG5jb25zdCBnZW5PdXRsaW5lZEdyb3VwU3RhdHVzU3R5bGUgPSAodG9rZW4sIG9wdGlvbnMpID0+ICh7XG4gIFtgJiR7dG9rZW4uY29tcG9uZW50Q2xzfS1ncm91cC13cmFwcGVyLXN0YXR1cy0ke29wdGlvbnMuc3RhdHVzfWBdOiB7XG4gICAgW2Ake3Rva2VuLmNvbXBvbmVudENsc30tZ3JvdXAtYWRkb25gXToge1xuICAgICAgYm9yZGVyQ29sb3I6IG9wdGlvbnMuYWRkb25Cb3JkZXJDb2xvcixcbiAgICAgIGNvbG9yOiBvcHRpb25zLmFkZG9uQ29sb3JcbiAgICB9XG4gIH1cbn0pO1xuZXhwb3J0IGNvbnN0IGdlbk91dGxpbmVkR3JvdXBTdHlsZSA9IHRva2VuID0+ICh7XG4gICcmLW91dGxpbmVkJzogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe1xuICAgIFtgJHt0b2tlbi5jb21wb25lbnRDbHN9LWdyb3VwYF06IHtcbiAgICAgICcmLWFkZG9uJzoge1xuICAgICAgICBiYWNrZ3JvdW5kOiB0b2tlbi5hZGRvbkJnLFxuICAgICAgICBib3JkZXI6IGAke3VuaXQodG9rZW4ubGluZVdpZHRoKX0gJHt0b2tlbi5saW5lVHlwZX0gJHt0b2tlbi5jb2xvckJvcmRlcn1gXG4gICAgICB9LFxuICAgICAgJyYtYWRkb246Zmlyc3QtY2hpbGQnOiB7XG4gICAgICAgIGJvcmRlcklubGluZUVuZDogMFxuICAgICAgfSxcbiAgICAgICcmLWFkZG9uOmxhc3QtY2hpbGQnOiB7XG4gICAgICAgIGJvcmRlcklubGluZVN0YXJ0OiAwXG4gICAgICB9XG4gICAgfVxuICB9LCBnZW5PdXRsaW5lZEdyb3VwU3RhdHVzU3R5bGUodG9rZW4sIHtcbiAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgYWRkb25Cb3JkZXJDb2xvcjogdG9rZW4uY29sb3JFcnJvcixcbiAgICBhZGRvbkNvbG9yOiB0b2tlbi5jb2xvckVycm9yVGV4dFxuICB9KSksIGdlbk91dGxpbmVkR3JvdXBTdGF0dXNTdHlsZSh0b2tlbiwge1xuICAgIHN0YXR1czogJ3dhcm5pbmcnLFxuICAgIGFkZG9uQm9yZGVyQ29sb3I6IHRva2VuLmNvbG9yV2FybmluZyxcbiAgICBhZGRvbkNvbG9yOiB0b2tlbi5jb2xvcldhcm5pbmdUZXh0XG4gIH0pKSwge1xuICAgIFtgJiR7dG9rZW4uY29tcG9uZW50Q2xzfS1ncm91cC13cmFwcGVyLWRpc2FibGVkYF06IHtcbiAgICAgIFtgJHt0b2tlbi5jb21wb25lbnRDbHN9LWdyb3VwLWFkZG9uYF06IE9iamVjdC5hc3NpZ24oe30sIGdlbkRpc2FibGVkU3R5bGUodG9rZW4pKVxuICAgIH1cbiAgfSlcbn0pO1xuLyogPT09PT09PT09PT09IEJvcmRlcmxlc3MgPT09PT09PT09PT09ICovXG5leHBvcnQgY29uc3QgZ2VuQm9yZGVybGVzc1N0eWxlID0gKHRva2VuLCBleHRyYVN0eWxlcykgPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzXG4gIH0gPSB0b2tlbjtcbiAgcmV0dXJuIHtcbiAgICAnJi1ib3JkZXJsZXNzJzogT2JqZWN0LmFzc2lnbih7XG4gICAgICBiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnLFxuICAgICAgYm9yZGVyOiAnbm9uZScsXG4gICAgICAnJjpmb2N1cywgJjpmb2N1cy13aXRoaW4nOiB7XG4gICAgICAgIG91dGxpbmU6ICdub25lJ1xuICAgICAgfSxcbiAgICAgIC8vID4+Pj4+IERpc2FibGVkXG4gICAgICBbYCYke2NvbXBvbmVudENsc30tZGlzYWJsZWQsICZbZGlzYWJsZWRdYF06IHtcbiAgICAgICAgY29sb3I6IHRva2VuLmNvbG9yVGV4dERpc2FibGVkLFxuICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCdcbiAgICAgIH0sXG4gICAgICAvLyA+Pj4+PiBTdGF0dXNcbiAgICAgIFtgJiR7Y29tcG9uZW50Q2xzfS1zdGF0dXMtZXJyb3JgXToge1xuICAgICAgICAnJiwgJiBpbnB1dCwgJiB0ZXh0YXJlYSc6IHtcbiAgICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JFcnJvclxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2AmJHtjb21wb25lbnRDbHN9LXN0YXR1cy13YXJuaW5nYF06IHtcbiAgICAgICAgJyYsICYgaW5wdXQsICYgdGV4dGFyZWEnOiB7XG4gICAgICAgICAgY29sb3I6IHRva2VuLmNvbG9yV2FybmluZ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgZXh0cmFTdHlsZXMpXG4gIH07XG59O1xuLyogPT09PT09PT09PT09PT0gRmlsbGVkID09PT09PT09PT09PT09ICovXG5jb25zdCBnZW5CYXNlRmlsbGVkU3R5bGUgPSAodG9rZW4sIG9wdGlvbnMpID0+IHtcbiAgdmFyIF9hO1xuICByZXR1cm4ge1xuICAgIGJhY2tncm91bmQ6IG9wdGlvbnMuYmcsXG4gICAgYm9yZGVyV2lkdGg6IHRva2VuLmxpbmVXaWR0aCxcbiAgICBib3JkZXJTdHlsZTogdG9rZW4ubGluZVR5cGUsXG4gICAgYm9yZGVyQ29sb3I6ICd0cmFuc3BhcmVudCcsXG4gICAgJ2lucHV0JiwgJiBpbnB1dCwgdGV4dGFyZWEmLCAmIHRleHRhcmVhJzoge1xuICAgICAgY29sb3I6IChfYSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5pbnB1dENvbG9yKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAndW5zZXQnXG4gICAgfSxcbiAgICAnJjpob3Zlcic6IHtcbiAgICAgIGJhY2tncm91bmQ6IG9wdGlvbnMuaG92ZXJCZ1xuICAgIH0sXG4gICAgJyY6Zm9jdXMsICY6Zm9jdXMtd2l0aGluJzoge1xuICAgICAgb3V0bGluZTogMCxcbiAgICAgIGJvcmRlckNvbG9yOiBvcHRpb25zLmFjdGl2ZUJvcmRlckNvbG9yLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0b2tlbi5hY3RpdmVCZ1xuICAgIH1cbiAgfTtcbn07XG5jb25zdCBnZW5GaWxsZWRTdGF0dXNTdHlsZSA9ICh0b2tlbiwgb3B0aW9ucykgPT4gKHtcbiAgW2AmJHt0b2tlbi5jb21wb25lbnRDbHN9LXN0YXR1cy0ke29wdGlvbnMuc3RhdHVzfTpub3QoJHt0b2tlbi5jb21wb25lbnRDbHN9LWRpc2FibGVkKWBdOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGdlbkJhc2VGaWxsZWRTdHlsZSh0b2tlbiwgb3B0aW9ucykpLCB7XG4gICAgW2Ake3Rva2VuLmNvbXBvbmVudENsc30tcHJlZml4LCAke3Rva2VuLmNvbXBvbmVudENsc30tc3VmZml4YF06IHtcbiAgICAgIGNvbG9yOiBvcHRpb25zLmFmZml4Q29sb3JcbiAgICB9XG4gIH0pXG59KTtcbmV4cG9ydCBjb25zdCBnZW5GaWxsZWRTdHlsZSA9ICh0b2tlbiwgZXh0cmFTdHlsZXMpID0+ICh7XG4gICcmLWZpbGxlZCc6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZ2VuQmFzZUZpbGxlZFN0eWxlKHRva2VuLCB7XG4gICAgYmc6IHRva2VuLmNvbG9yRmlsbFRlcnRpYXJ5LFxuICAgIGhvdmVyQmc6IHRva2VuLmNvbG9yRmlsbFNlY29uZGFyeSxcbiAgICBhY3RpdmVCb3JkZXJDb2xvcjogdG9rZW4uYWN0aXZlQm9yZGVyQ29sb3JcbiAgfSkpLCB7XG4gICAgW2AmJHt0b2tlbi5jb21wb25lbnRDbHN9LWRpc2FibGVkLCAmW2Rpc2FibGVkXWBdOiBPYmplY3QuYXNzaWduKHt9LCBnZW5EaXNhYmxlZFN0eWxlKHRva2VuKSlcbiAgfSksIGdlbkZpbGxlZFN0YXR1c1N0eWxlKHRva2VuLCB7XG4gICAgc3RhdHVzOiAnZXJyb3InLFxuICAgIGJnOiB0b2tlbi5jb2xvckVycm9yQmcsXG4gICAgaG92ZXJCZzogdG9rZW4uY29sb3JFcnJvckJnSG92ZXIsXG4gICAgYWN0aXZlQm9yZGVyQ29sb3I6IHRva2VuLmNvbG9yRXJyb3IsXG4gICAgaW5wdXRDb2xvcjogdG9rZW4uY29sb3JFcnJvclRleHQsXG4gICAgYWZmaXhDb2xvcjogdG9rZW4uY29sb3JFcnJvclxuICB9KSksIGdlbkZpbGxlZFN0YXR1c1N0eWxlKHRva2VuLCB7XG4gICAgc3RhdHVzOiAnd2FybmluZycsXG4gICAgYmc6IHRva2VuLmNvbG9yV2FybmluZ0JnLFxuICAgIGhvdmVyQmc6IHRva2VuLmNvbG9yV2FybmluZ0JnSG92ZXIsXG4gICAgYWN0aXZlQm9yZGVyQ29sb3I6IHRva2VuLmNvbG9yV2FybmluZyxcbiAgICBpbnB1dENvbG9yOiB0b2tlbi5jb2xvcldhcm5pbmdUZXh0LFxuICAgIGFmZml4Q29sb3I6IHRva2VuLmNvbG9yV2FybmluZ1xuICB9KSksIGV4dHJhU3R5bGVzKVxufSk7XG5jb25zdCBnZW5GaWxsZWRHcm91cFN0YXR1c1N0eWxlID0gKHRva2VuLCBvcHRpb25zKSA9PiAoe1xuICBbYCYke3Rva2VuLmNvbXBvbmVudENsc30tZ3JvdXAtd3JhcHBlci1zdGF0dXMtJHtvcHRpb25zLnN0YXR1c31gXToge1xuICAgIFtgJHt0b2tlbi5jb21wb25lbnRDbHN9LWdyb3VwLWFkZG9uYF06IHtcbiAgICAgIGJhY2tncm91bmQ6IG9wdGlvbnMuYWRkb25CZyxcbiAgICAgIGNvbG9yOiBvcHRpb25zLmFkZG9uQ29sb3JcbiAgICB9XG4gIH1cbn0pO1xuZXhwb3J0IGNvbnN0IGdlbkZpbGxlZEdyb3VwU3R5bGUgPSB0b2tlbiA9PiAoe1xuICAnJi1maWxsZWQnOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7XG4gICAgW2Ake3Rva2VuLmNvbXBvbmVudENsc30tZ3JvdXBgXToge1xuICAgICAgJyYtYWRkb24nOiB7XG4gICAgICAgIGJhY2tncm91bmQ6IHRva2VuLmNvbG9yRmlsbFRlcnRpYXJ5XG4gICAgICB9LFxuICAgICAgW2Ake3Rva2VuLmNvbXBvbmVudENsc30tZmlsbGVkOm5vdCg6Zm9jdXMpOm5vdCg6Zm9jdXMtd2l0aGluKWBdOiB7XG4gICAgICAgICcmOm5vdCg6Zmlyc3QtY2hpbGQpJzoge1xuICAgICAgICAgIGJvcmRlcklubGluZVN0YXJ0OiBgJHt1bml0KHRva2VuLmxpbmVXaWR0aCl9ICR7dG9rZW4ubGluZVR5cGV9ICR7dG9rZW4uY29sb3JTcGxpdH1gXG4gICAgICAgIH0sXG4gICAgICAgICcmOm5vdCg6bGFzdC1jaGlsZCknOiB7XG4gICAgICAgICAgYm9yZGVySW5saW5lRW5kOiBgJHt1bml0KHRva2VuLmxpbmVXaWR0aCl9ICR7dG9rZW4ubGluZVR5cGV9ICR7dG9rZW4uY29sb3JTcGxpdH1gXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIGdlbkZpbGxlZEdyb3VwU3RhdHVzU3R5bGUodG9rZW4sIHtcbiAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgYWRkb25CZzogdG9rZW4uY29sb3JFcnJvckJnLFxuICAgIGFkZG9uQ29sb3I6IHRva2VuLmNvbG9yRXJyb3JUZXh0XG4gIH0pKSwgZ2VuRmlsbGVkR3JvdXBTdGF0dXNTdHlsZSh0b2tlbiwge1xuICAgIHN0YXR1czogJ3dhcm5pbmcnLFxuICAgIGFkZG9uQmc6IHRva2VuLmNvbG9yV2FybmluZ0JnLFxuICAgIGFkZG9uQ29sb3I6IHRva2VuLmNvbG9yV2FybmluZ1RleHRcbiAgfSkpLCB7XG4gICAgW2AmJHt0b2tlbi5jb21wb25lbnRDbHN9LWdyb3VwLXdyYXBwZXItZGlzYWJsZWRgXToge1xuICAgICAgW2Ake3Rva2VuLmNvbXBvbmVudENsc30tZ3JvdXBgXToge1xuICAgICAgICAnJi1hZGRvbic6IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kOiB0b2tlbi5jb2xvckZpbGxUZXJ0aWFyeSxcbiAgICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JUZXh0RGlzYWJsZWRcbiAgICAgICAgfSxcbiAgICAgICAgJyYtYWRkb246Zmlyc3QtY2hpbGQnOiB7XG4gICAgICAgICAgYm9yZGVySW5saW5lU3RhcnQ6IGAke3VuaXQodG9rZW4ubGluZVdpZHRoKX0gJHt0b2tlbi5saW5lVHlwZX0gJHt0b2tlbi5jb2xvckJvcmRlcn1gLFxuICAgICAgICAgIGJvcmRlclRvcDogYCR7dW5pdCh0b2tlbi5saW5lV2lkdGgpfSAke3Rva2VuLmxpbmVUeXBlfSAke3Rva2VuLmNvbG9yQm9yZGVyfWAsXG4gICAgICAgICAgYm9yZGVyQm90dG9tOiBgJHt1bml0KHRva2VuLmxpbmVXaWR0aCl9ICR7dG9rZW4ubGluZVR5cGV9ICR7dG9rZW4uY29sb3JCb3JkZXJ9YFxuICAgICAgICB9LFxuICAgICAgICAnJi1hZGRvbjpsYXN0LWNoaWxkJzoge1xuICAgICAgICAgIGJvcmRlcklubGluZUVuZDogYCR7dW5pdCh0b2tlbi5saW5lV2lkdGgpfSAke3Rva2VuLmxpbmVUeXBlfSAke3Rva2VuLmNvbG9yQm9yZGVyfWAsXG4gICAgICAgICAgYm9yZGVyVG9wOiBgJHt1bml0KHRva2VuLmxpbmVXaWR0aCl9ICR7dG9rZW4ubGluZVR5cGV9ICR7dG9rZW4uY29sb3JCb3JkZXJ9YCxcbiAgICAgICAgICBib3JkZXJCb3R0b206IGAke3VuaXQodG9rZW4ubGluZVdpZHRoKX0gJHt0b2tlbi5saW5lVHlwZX0gJHt0b2tlbi5jb2xvckJvcmRlcn1gXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pXG59KTtcbi8qID09PT09PT09PT09PT09IFVuZGVybGluZWQgPT09PT09PT09PT09PT0gKi9cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzUxMzc5XG5leHBvcnQgY29uc3QgZ2VuQmFzZVVuZGVybGluZWRTdHlsZSA9ICh0b2tlbiwgb3B0aW9ucykgPT4gKHtcbiAgYmFja2dyb3VuZDogdG9rZW4uY29sb3JCZ0NvbnRhaW5lcixcbiAgYm9yZGVyV2lkdGg6IGAke3VuaXQodG9rZW4ubGluZVdpZHRoKX0gMGAsXG4gIGJvcmRlclN0eWxlOiBgJHt0b2tlbi5saW5lVHlwZX0gbm9uZWAsXG4gIGJvcmRlckNvbG9yOiBgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgJHtvcHRpb25zLmJvcmRlckNvbG9yfSB0cmFuc3BhcmVudGAsXG4gIGJvcmRlclJhZGl1czogMCxcbiAgJyY6aG92ZXInOiB7XG4gICAgYm9yZGVyQ29sb3I6IGB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCAke29wdGlvbnMuYm9yZGVyQ29sb3J9IHRyYW5zcGFyZW50YCxcbiAgICBiYWNrZ3JvdW5kQ29sb3I6IHRva2VuLmhvdmVyQmdcbiAgfSxcbiAgJyY6Zm9jdXMsICY6Zm9jdXMtd2l0aGluJzoge1xuICAgIGJvcmRlckNvbG9yOiBgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgJHtvcHRpb25zLmJvcmRlckNvbG9yfSB0cmFuc3BhcmVudGAsXG4gICAgb3V0bGluZTogMCxcbiAgICBiYWNrZ3JvdW5kQ29sb3I6IHRva2VuLmFjdGl2ZUJnXG4gIH1cbn0pO1xuY29uc3QgZ2VuVW5kZXJsaW5lZFN0YXR1c1N0eWxlID0gKHRva2VuLCBvcHRpb25zKSA9PiAoe1xuICBbYCYke3Rva2VuLmNvbXBvbmVudENsc30tc3RhdHVzLSR7b3B0aW9ucy5zdGF0dXN9Om5vdCgke3Rva2VuLmNvbXBvbmVudENsc30tZGlzYWJsZWQpYF06IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZ2VuQmFzZVVuZGVybGluZWRTdHlsZSh0b2tlbiwgb3B0aW9ucykpLCB7XG4gICAgW2Ake3Rva2VuLmNvbXBvbmVudENsc30tcHJlZml4LCAke3Rva2VuLmNvbXBvbmVudENsc30tc3VmZml4YF06IHtcbiAgICAgIGNvbG9yOiBvcHRpb25zLmFmZml4Q29sb3JcbiAgICB9XG4gIH0pLFxuICBbYCYke3Rva2VuLmNvbXBvbmVudENsc30tc3RhdHVzLSR7b3B0aW9ucy5zdGF0dXN9JHt0b2tlbi5jb21wb25lbnRDbHN9LWRpc2FibGVkYF06IHtcbiAgICBib3JkZXJDb2xvcjogYHRyYW5zcGFyZW50IHRyYW5zcGFyZW50ICR7b3B0aW9ucy5ib3JkZXJDb2xvcn0gdHJhbnNwYXJlbnRgXG4gIH1cbn0pO1xuZXhwb3J0IGNvbnN0IGdlblVuZGVybGluZWRTdHlsZSA9ICh0b2tlbiwgZXh0cmFTdHlsZXMpID0+ICh7XG4gICcmLXVuZGVybGluZWQnOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGdlbkJhc2VVbmRlcmxpbmVkU3R5bGUodG9rZW4sIHtcbiAgICBib3JkZXJDb2xvcjogdG9rZW4uY29sb3JCb3JkZXIsXG4gICAgaG92ZXJCb3JkZXJDb2xvcjogdG9rZW4uaG92ZXJCb3JkZXJDb2xvcixcbiAgICBhY3RpdmVCb3JkZXJDb2xvcjogdG9rZW4uYWN0aXZlQm9yZGVyQ29sb3IsXG4gICAgYWN0aXZlU2hhZG93OiB0b2tlbi5hY3RpdmVTaGFkb3dcbiAgfSkpLCB7XG4gICAgLy8gPj4+Pj4gRGlzYWJsZWRcbiAgICBbYCYke3Rva2VuLmNvbXBvbmVudENsc30tZGlzYWJsZWQsICZbZGlzYWJsZWRdYF06IHtcbiAgICAgIGNvbG9yOiB0b2tlbi5jb2xvclRleHREaXNhYmxlZCxcbiAgICAgIGJveFNoYWRvdzogJ25vbmUnLFxuICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQnLFxuICAgICAgJyY6aG92ZXInOiB7XG4gICAgICAgIGJvcmRlckNvbG9yOiBgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgJHt0b2tlbi5jb2xvckJvcmRlcn0gdHJhbnNwYXJlbnRgXG4gICAgICB9XG4gICAgfSxcbiAgICAnaW5wdXRbZGlzYWJsZWRdLCB0ZXh0YXJlYVtkaXNhYmxlZF0nOiB7XG4gICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCdcbiAgICB9XG4gIH0pLCBnZW5VbmRlcmxpbmVkU3RhdHVzU3R5bGUodG9rZW4sIHtcbiAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgYm9yZGVyQ29sb3I6IHRva2VuLmNvbG9yRXJyb3IsXG4gICAgaG92ZXJCb3JkZXJDb2xvcjogdG9rZW4uY29sb3JFcnJvckJvcmRlckhvdmVyLFxuICAgIGFjdGl2ZUJvcmRlckNvbG9yOiB0b2tlbi5jb2xvckVycm9yLFxuICAgIGFjdGl2ZVNoYWRvdzogdG9rZW4uZXJyb3JBY3RpdmVTaGFkb3csXG4gICAgYWZmaXhDb2xvcjogdG9rZW4uY29sb3JFcnJvclxuICB9KSksIGdlblVuZGVybGluZWRTdGF0dXNTdHlsZSh0b2tlbiwge1xuICAgIHN0YXR1czogJ3dhcm5pbmcnLFxuICAgIGJvcmRlckNvbG9yOiB0b2tlbi5jb2xvcldhcm5pbmcsXG4gICAgaG92ZXJCb3JkZXJDb2xvcjogdG9rZW4uY29sb3JXYXJuaW5nQm9yZGVySG92ZXIsXG4gICAgYWN0aXZlQm9yZGVyQ29sb3I6IHRva2VuLmNvbG9yV2FybmluZyxcbiAgICBhY3RpdmVTaGFkb3c6IHRva2VuLndhcm5pbmdBY3RpdmVTaGFkb3csXG4gICAgYWZmaXhDb2xvcjogdG9rZW4uY29sb3JXYXJuaW5nXG4gIH0pKSwgZXh0cmFTdHlsZXMpXG59KTsiLCAiaW1wb3J0IHsgdW5pdCB9IGZyb20gJ0BhbnQtZGVzaWduL2Nzc2luanMnO1xuaW1wb3J0IHsgY2xlYXJGaXgsIHJlc2V0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc3R5bGUnO1xuaW1wb3J0IHsgZ2VuQ29tcGFjdEl0ZW1TdHlsZSB9IGZyb20gJy4uLy4uL3N0eWxlL2NvbXBhY3QtaXRlbSc7XG5pbXBvcnQgeyBnZW5TdHlsZUhvb2tzLCBtZXJnZVRva2VuIH0gZnJvbSAnLi4vLi4vdGhlbWUvaW50ZXJuYWwnO1xuaW1wb3J0IHsgaW5pdENvbXBvbmVudFRva2VuLCBpbml0SW5wdXRUb2tlbiB9IGZyb20gJy4vdG9rZW4nO1xuaW1wb3J0IHsgZ2VuQm9yZGVybGVzc1N0eWxlLCBnZW5GaWxsZWRHcm91cFN0eWxlLCBnZW5GaWxsZWRTdHlsZSwgZ2VuT3V0bGluZWRHcm91cFN0eWxlLCBnZW5PdXRsaW5lZFN0eWxlLCBnZW5VbmRlcmxpbmVkU3R5bGUgfSBmcm9tICcuL3ZhcmlhbnRzJztcbmV4cG9ydCB7IGluaXRDb21wb25lbnRUb2tlbiwgaW5pdElucHV0VG9rZW4gfTtcbmV4cG9ydCBjb25zdCBnZW5QbGFjZWhvbGRlclN0eWxlID0gY29sb3IgPT4gKHtcbiAgLy8gRmlyZWZveFxuICAnJjo6LW1vei1wbGFjZWhvbGRlcic6IHtcbiAgICBvcGFjaXR5OiAxXG4gIH0sXG4gICcmOjpwbGFjZWhvbGRlcic6IHtcbiAgICBjb2xvcixcbiAgICB1c2VyU2VsZWN0OiAnbm9uZScgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9wdWxsLzMyNjM5XG4gIH0sXG4gICcmOnBsYWNlaG9sZGVyLXNob3duJzoge1xuICAgIHRleHRPdmVyZmxvdzogJ2VsbGlwc2lzJ1xuICB9XG59KTtcbmV4cG9ydCBjb25zdCBnZW5BY3RpdmVTdHlsZSA9IHRva2VuID0+ICh7XG4gIGJvcmRlckNvbG9yOiB0b2tlbi5hY3RpdmVCb3JkZXJDb2xvcixcbiAgYm94U2hhZG93OiB0b2tlbi5hY3RpdmVTaGFkb3csXG4gIG91dGxpbmU6IDAsXG4gIGJhY2tncm91bmRDb2xvcjogdG9rZW4uYWN0aXZlQmdcbn0pO1xuY29uc3QgZ2VuSW5wdXRMYXJnZVN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgcGFkZGluZ0Jsb2NrTEcsXG4gICAgbGluZUhlaWdodExHLFxuICAgIGJvcmRlclJhZGl1c0xHLFxuICAgIHBhZGRpbmdJbmxpbmVMR1xuICB9ID0gdG9rZW47XG4gIHJldHVybiB7XG4gICAgcGFkZGluZzogYCR7dW5pdChwYWRkaW5nQmxvY2tMRyl9ICR7dW5pdChwYWRkaW5nSW5saW5lTEcpfWAsXG4gICAgZm9udFNpemU6IHRva2VuLmlucHV0Rm9udFNpemVMRyxcbiAgICBsaW5lSGVpZ2h0OiBsaW5lSGVpZ2h0TEcsXG4gICAgYm9yZGVyUmFkaXVzOiBib3JkZXJSYWRpdXNMR1xuICB9O1xufTtcbmV4cG9ydCBjb25zdCBnZW5JbnB1dFNtYWxsU3R5bGUgPSB0b2tlbiA9PiAoe1xuICBwYWRkaW5nOiBgJHt1bml0KHRva2VuLnBhZGRpbmdCbG9ja1NNKX0gJHt1bml0KHRva2VuLnBhZGRpbmdJbmxpbmVTTSl9YCxcbiAgZm9udFNpemU6IHRva2VuLmlucHV0Rm9udFNpemVTTSxcbiAgYm9yZGVyUmFkaXVzOiB0b2tlbi5ib3JkZXJSYWRpdXNTTVxufSk7XG5leHBvcnQgY29uc3QgZ2VuQmFzaWNJbnB1dFN0eWxlID0gdG9rZW4gPT4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHtcbiAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICB3aWR0aDogJzEwMCUnLFxuICBtaW5XaWR0aDogMCxcbiAgcGFkZGluZzogYCR7dW5pdCh0b2tlbi5wYWRkaW5nQmxvY2spfSAke3VuaXQodG9rZW4ucGFkZGluZ0lubGluZSl9YCxcbiAgY29sb3I6IHRva2VuLmNvbG9yVGV4dCxcbiAgZm9udFNpemU6IHRva2VuLmlucHV0Rm9udFNpemUsXG4gIGxpbmVIZWlnaHQ6IHRva2VuLmxpbmVIZWlnaHQsXG4gIGJvcmRlclJhZGl1czogdG9rZW4uYm9yZGVyUmFkaXVzLFxuICB0cmFuc2l0aW9uOiBgYWxsICR7dG9rZW4ubW90aW9uRHVyYXRpb25NaWR9YFxufSwgZ2VuUGxhY2Vob2xkZXJTdHlsZSh0b2tlbi5jb2xvclRleHRQbGFjZWhvbGRlcikpLCB7XG4gIC8vIFNpemVcbiAgJyYtbGcnOiBPYmplY3QuYXNzaWduKHt9LCBnZW5JbnB1dExhcmdlU3R5bGUodG9rZW4pKSxcbiAgJyYtc20nOiBPYmplY3QuYXNzaWduKHt9LCBnZW5JbnB1dFNtYWxsU3R5bGUodG9rZW4pKSxcbiAgLy8gUlRMXG4gICcmLXJ0bCwgJi10ZXh0YXJlYS1ydGwnOiB7XG4gICAgZGlyZWN0aW9uOiAncnRsJ1xuICB9XG59KTtcbmV4cG9ydCBjb25zdCBnZW5JbnB1dEdyb3VwU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHMsXG4gICAgYW50Q2xzXG4gIH0gPSB0b2tlbjtcbiAgcmV0dXJuIHtcbiAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICBkaXNwbGF5OiAndGFibGUnLFxuICAgIHdpZHRoOiAnMTAwJScsXG4gICAgYm9yZGVyQ29sbGFwc2U6ICdzZXBhcmF0ZScsXG4gICAgYm9yZGVyU3BhY2luZzogMCxcbiAgICAvLyBVbmRvIHBhZGRpbmcgYW5kIGZsb2F0IG9mIGdyaWQgY2xhc3Nlc1xuICAgIFwiJltjbGFzcyo9J2NvbC0nXVwiOiB7XG4gICAgICBwYWRkaW5nSW5saW5lRW5kOiB0b2tlbi5wYWRkaW5nWFMsXG4gICAgICAnJjpsYXN0LWNoaWxkJzoge1xuICAgICAgICBwYWRkaW5nSW5saW5lRW5kOiAwXG4gICAgICB9XG4gICAgfSxcbiAgICAvLyBTaXppbmcgb3B0aW9uc1xuICAgIFtgJi1sZyAke2NvbXBvbmVudENsc30sICYtbGcgPiAke2NvbXBvbmVudENsc30tZ3JvdXAtYWRkb25gXTogT2JqZWN0LmFzc2lnbih7fSwgZ2VuSW5wdXRMYXJnZVN0eWxlKHRva2VuKSksXG4gICAgW2AmLXNtICR7Y29tcG9uZW50Q2xzfSwgJi1zbSA+ICR7Y29tcG9uZW50Q2xzfS1ncm91cC1hZGRvbmBdOiBPYmplY3QuYXNzaWduKHt9LCBnZW5JbnB1dFNtYWxsU3R5bGUodG9rZW4pKSxcbiAgICAvLyBGaXggaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvNTc1NFxuICAgIFtgJi1sZyAke2FudENsc30tc2VsZWN0LXNpbmdsZSAke2FudENsc30tc2VsZWN0LXNlbGVjdG9yYF06IHtcbiAgICAgIGhlaWdodDogdG9rZW4uY29udHJvbEhlaWdodExHXG4gICAgfSxcbiAgICBbYCYtc20gJHthbnRDbHN9LXNlbGVjdC1zaW5nbGUgJHthbnRDbHN9LXNlbGVjdC1zZWxlY3RvcmBdOiB7XG4gICAgICBoZWlnaHQ6IHRva2VuLmNvbnRyb2xIZWlnaHRTTVxuICAgIH0sXG4gICAgW2A+ICR7Y29tcG9uZW50Q2xzfWBdOiB7XG4gICAgICBkaXNwbGF5OiAndGFibGUtY2VsbCcsXG4gICAgICAnJjpub3QoOmZpcnN0LWNoaWxkKTpub3QoOmxhc3QtY2hpbGQpJzoge1xuICAgICAgICBib3JkZXJSYWRpdXM6IDBcbiAgICAgIH1cbiAgICB9LFxuICAgIFtgJHtjb21wb25lbnRDbHN9LWdyb3VwYF06IHtcbiAgICAgICcmLWFkZG9uLCAmLXdyYXAnOiB7XG4gICAgICAgIGRpc3BsYXk6ICd0YWJsZS1jZWxsJyxcbiAgICAgICAgd2lkdGg6IDEsXG4gICAgICAgIHdoaXRlU3BhY2U6ICdub3dyYXAnLFxuICAgICAgICB2ZXJ0aWNhbEFsaWduOiAnbWlkZGxlJyxcbiAgICAgICAgJyY6bm90KDpmaXJzdC1jaGlsZCk6bm90KDpsYXN0LWNoaWxkKSc6IHtcbiAgICAgICAgICBib3JkZXJSYWRpdXM6IDBcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICcmLXdyYXAgPiAqJzoge1xuICAgICAgICBkaXNwbGF5OiAnYmxvY2sgIWltcG9ydGFudCdcbiAgICAgIH0sXG4gICAgICAnJi1hZGRvbic6IHtcbiAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICAgIHBhZGRpbmc6IGAwICR7dW5pdCh0b2tlbi5wYWRkaW5nSW5saW5lKX1gLFxuICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JUZXh0LFxuICAgICAgICBmb250V2VpZ2h0OiAnbm9ybWFsJyxcbiAgICAgICAgZm9udFNpemU6IHRva2VuLmlucHV0Rm9udFNpemUsXG4gICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAgIGJvcmRlclJhZGl1czogdG9rZW4uYm9yZGVyUmFkaXVzLFxuICAgICAgICB0cmFuc2l0aW9uOiBgYWxsICR7dG9rZW4ubW90aW9uRHVyYXRpb25TbG93fWAsXG4gICAgICAgIGxpbmVIZWlnaHQ6IDEsXG4gICAgICAgIC8vIFJlc2V0IFNlbGVjdCdzIHN0eWxlIGluIGFkZG9uXG4gICAgICAgIFtgJHthbnRDbHN9LXNlbGVjdGBdOiB7XG4gICAgICAgICAgbWFyZ2luOiBgJHt1bml0KHRva2VuLmNhbGModG9rZW4ucGFkZGluZ0Jsb2NrKS5hZGQoMSkubXVsKC0xKS5lcXVhbCgpKX0gJHt1bml0KHRva2VuLmNhbGModG9rZW4ucGFkZGluZ0lubGluZSkubXVsKC0xKS5lcXVhbCgpKX1gLFxuICAgICAgICAgIFtgJiR7YW50Q2xzfS1zZWxlY3Qtc2luZ2xlOm5vdCgke2FudENsc30tc2VsZWN0LWN1c3RvbWl6ZS1pbnB1dCk6bm90KCR7YW50Q2xzfS1wYWdpbmF0aW9uLXNpemUtY2hhbmdlcilgXToge1xuICAgICAgICAgICAgW2Ake2FudENsc30tc2VsZWN0LXNlbGVjdG9yYF06IHtcbiAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnaW5oZXJpdCcsXG4gICAgICAgICAgICAgIGJvcmRlcjogYCR7dW5pdCh0b2tlbi5saW5lV2lkdGgpfSAke3Rva2VuLmxpbmVUeXBlfSB0cmFuc3BhcmVudGAsXG4gICAgICAgICAgICAgIGJveFNoYWRvdzogJ25vbmUnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8zMTMzM1xuICAgICAgICBbYCR7YW50Q2xzfS1jYXNjYWRlci1waWNrZXJgXToge1xuICAgICAgICAgIG1hcmdpbjogYC05cHggJHt1bml0KHRva2VuLmNhbGModG9rZW4ucGFkZGluZ0lubGluZSkubXVsKC0xKS5lcXVhbCgpKX1gLFxuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgICBbYCR7YW50Q2xzfS1jYXNjYWRlci1pbnB1dGBdOiB7XG4gICAgICAgICAgICB0ZXh0QWxpZ246ICdzdGFydCcsXG4gICAgICAgICAgICBib3JkZXI6IDAsXG4gICAgICAgICAgICBib3hTaGFkb3c6ICdub25lJ1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW2NvbXBvbmVudENsc106IHtcbiAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICBtYXJnaW5Cb3R0b206IDAsXG4gICAgICB0ZXh0QWxpZ246ICdpbmhlcml0JyxcbiAgICAgICcmOmZvY3VzJzoge1xuICAgICAgICB6SW5kZXg6IDEsXG4gICAgICAgIC8vIEZpeCBodHRwczovL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvREhOcG9xZk1YU2ZyU25sWnZoc0oucG5nXG4gICAgICAgIGJvcmRlcklubGluZUVuZFdpZHRoOiAxXG4gICAgICB9LFxuICAgICAgJyY6aG92ZXInOiB7XG4gICAgICAgIHpJbmRleDogMSxcbiAgICAgICAgYm9yZGVySW5saW5lRW5kV2lkdGg6IDEsXG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LXNlYXJjaC13aXRoLWJ1dHRvbiAmYF06IHtcbiAgICAgICAgICB6SW5kZXg6IDBcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgLy8gUmVzZXQgcm91bmRlZCBjb3JuZXJzXG4gICAgW2A+ICR7Y29tcG9uZW50Q2xzfTpmaXJzdC1jaGlsZCwgJHtjb21wb25lbnRDbHN9LWdyb3VwLWFkZG9uOmZpcnN0LWNoaWxkYF06IHtcbiAgICAgIGJvcmRlclN0YXJ0RW5kUmFkaXVzOiAwLFxuICAgICAgYm9yZGVyRW5kRW5kUmFkaXVzOiAwLFxuICAgICAgLy8gUmVzZXQgU2VsZWN0J3Mgc3R5bGUgaW4gYWRkb25cbiAgICAgIFtgJHthbnRDbHN9LXNlbGVjdCAke2FudENsc30tc2VsZWN0LXNlbGVjdG9yYF06IHtcbiAgICAgICAgYm9yZGVyU3RhcnRFbmRSYWRpdXM6IDAsXG4gICAgICAgIGJvcmRlckVuZEVuZFJhZGl1czogMFxuICAgICAgfVxuICAgIH0sXG4gICAgW2A+ICR7Y29tcG9uZW50Q2xzfS1hZmZpeC13cmFwcGVyYF06IHtcbiAgICAgIFtgJjpub3QoOmZpcnN0LWNoaWxkKSAke2NvbXBvbmVudENsc31gXToge1xuICAgICAgICBib3JkZXJTdGFydFN0YXJ0UmFkaXVzOiAwLFxuICAgICAgICBib3JkZXJFbmRTdGFydFJhZGl1czogMFxuICAgICAgfSxcbiAgICAgIFtgJjpub3QoOmxhc3QtY2hpbGQpICR7Y29tcG9uZW50Q2xzfWBdOiB7XG4gICAgICAgIGJvcmRlclN0YXJ0RW5kUmFkaXVzOiAwLFxuICAgICAgICBib3JkZXJFbmRFbmRSYWRpdXM6IDBcbiAgICAgIH1cbiAgICB9LFxuICAgIFtgPiAke2NvbXBvbmVudENsc306bGFzdC1jaGlsZCwgJHtjb21wb25lbnRDbHN9LWdyb3VwLWFkZG9uOmxhc3QtY2hpbGRgXToge1xuICAgICAgYm9yZGVyU3RhcnRTdGFydFJhZGl1czogMCxcbiAgICAgIGJvcmRlckVuZFN0YXJ0UmFkaXVzOiAwLFxuICAgICAgLy8gUmVzZXQgU2VsZWN0J3Mgc3R5bGUgaW4gYWRkb25cbiAgICAgIFtgJHthbnRDbHN9LXNlbGVjdCAke2FudENsc30tc2VsZWN0LXNlbGVjdG9yYF06IHtcbiAgICAgICAgYm9yZGVyU3RhcnRTdGFydFJhZGl1czogMCxcbiAgICAgICAgYm9yZGVyRW5kU3RhcnRSYWRpdXM6IDBcbiAgICAgIH1cbiAgICB9LFxuICAgIFtgJHtjb21wb25lbnRDbHN9LWFmZml4LXdyYXBwZXJgXToge1xuICAgICAgJyY6bm90KDpsYXN0LWNoaWxkKSc6IHtcbiAgICAgICAgYm9yZGVyU3RhcnRFbmRSYWRpdXM6IDAsXG4gICAgICAgIGJvcmRlckVuZEVuZFJhZGl1czogMCxcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30tc2VhcmNoICZgXToge1xuICAgICAgICAgIGJvcmRlclN0YXJ0U3RhcnRSYWRpdXM6IHRva2VuLmJvcmRlclJhZGl1cyxcbiAgICAgICAgICBib3JkZXJFbmRTdGFydFJhZGl1czogdG9rZW4uYm9yZGVyUmFkaXVzXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbYCY6bm90KDpmaXJzdC1jaGlsZCksICR7Y29tcG9uZW50Q2xzfS1zZWFyY2ggJjpub3QoOmZpcnN0LWNoaWxkKWBdOiB7XG4gICAgICAgIGJvcmRlclN0YXJ0U3RhcnRSYWRpdXM6IDAsXG4gICAgICAgIGJvcmRlckVuZFN0YXJ0UmFkaXVzOiAwXG4gICAgICB9XG4gICAgfSxcbiAgICBbYCYke2NvbXBvbmVudENsc30tZ3JvdXAtY29tcGFjdGBdOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe1xuICAgICAgZGlzcGxheTogJ2Jsb2NrJ1xuICAgIH0sIGNsZWFyRml4KCkpLCB7XG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1ncm91cC1hZGRvbiwgJHtjb21wb25lbnRDbHN9LWdyb3VwLXdyYXAsID4gJHtjb21wb25lbnRDbHN9YF06IHtcbiAgICAgICAgJyY6bm90KDpmaXJzdC1jaGlsZCk6bm90KDpsYXN0LWNoaWxkKSc6IHtcbiAgICAgICAgICBib3JkZXJJbmxpbmVFbmRXaWR0aDogdG9rZW4ubGluZVdpZHRoLFxuICAgICAgICAgICcmOmhvdmVyLCAmOmZvY3VzJzoge1xuICAgICAgICAgICAgekluZGV4OiAxXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgJyYgPiAqJzoge1xuICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWZsZXgnLFxuICAgICAgICBmbG9hdDogJ25vbmUnLFxuICAgICAgICB2ZXJ0aWNhbEFsaWduOiAndG9wJyxcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi1wcm8vaXNzdWVzLzEzOVxuICAgICAgICBib3JkZXJSYWRpdXM6IDBcbiAgICAgIH0sXG4gICAgICBbYFxuICAgICAgICAmID4gJHtjb21wb25lbnRDbHN9LWFmZml4LXdyYXBwZXIsXG4gICAgICAgICYgPiAke2NvbXBvbmVudENsc30tbnVtYmVyLWFmZml4LXdyYXBwZXIsXG4gICAgICAgICYgPiAke2FudENsc30tcGlja2VyLXJhbmdlXG4gICAgICBgXToge1xuICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWZsZXgnXG4gICAgICB9LFxuICAgICAgJyYgPiAqOm5vdCg6bGFzdC1jaGlsZCknOiB7XG4gICAgICAgIG1hcmdpbklubGluZUVuZDogdG9rZW4uY2FsYyh0b2tlbi5saW5lV2lkdGgpLm11bCgtMSkuZXF1YWwoKSxcbiAgICAgICAgYm9yZGVySW5saW5lRW5kV2lkdGg6IHRva2VuLmxpbmVXaWR0aFxuICAgICAgfSxcbiAgICAgIC8vIFVuZG8gZmxvYXQgZm9yIC5hbnQtaW5wdXQtZ3JvdXAgLmFudC1pbnB1dFxuICAgICAgW2NvbXBvbmVudENsc106IHtcbiAgICAgICAgZmxvYXQ6ICdub25lJ1xuICAgICAgfSxcbiAgICAgIC8vIHJlc2V0IGJvcmRlciBmb3IgU2VsZWN0LCBEYXRlUGlja2VyLCBBdXRvQ29tcGxldGUsIENhc2NhZGVyLCBNZW50aW9uLCBUaW1lUGlja2VyLCBJbnB1dFxuICAgICAgW2AmID4gJHthbnRDbHN9LXNlbGVjdCA+ICR7YW50Q2xzfS1zZWxlY3Qtc2VsZWN0b3IsXG4gICAgICAmID4gJHthbnRDbHN9LXNlbGVjdC1hdXRvLWNvbXBsZXRlICR7Y29tcG9uZW50Q2xzfSxcbiAgICAgICYgPiAke2FudENsc30tY2FzY2FkZXItcGlja2VyICR7Y29tcG9uZW50Q2xzfSxcbiAgICAgICYgPiAke2NvbXBvbmVudENsc30tZ3JvdXAtd3JhcHBlciAke2NvbXBvbmVudENsc31gXToge1xuICAgICAgICBib3JkZXJJbmxpbmVFbmRXaWR0aDogdG9rZW4ubGluZVdpZHRoLFxuICAgICAgICBib3JkZXJSYWRpdXM6IDAsXG4gICAgICAgICcmOmhvdmVyLCAmOmZvY3VzJzoge1xuICAgICAgICAgIHpJbmRleDogMVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2AmID4gJHthbnRDbHN9LXNlbGVjdC1mb2N1c2VkYF06IHtcbiAgICAgICAgekluZGV4OiAxXG4gICAgICB9LFxuICAgICAgLy8gdXBkYXRlIHotaW5kZXggZm9yIGFycm93IGljb25cbiAgICAgIFtgJiA+ICR7YW50Q2xzfS1zZWxlY3QgPiAke2FudENsc30tc2VsZWN0LWFycm93YF06IHtcbiAgICAgICAgekluZGV4OiAxIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzIwMzcxXG4gICAgICB9LFxuICAgICAgW2AmID4gKjpmaXJzdC1jaGlsZCxcbiAgICAgICYgPiAke2FudENsc30tc2VsZWN0OmZpcnN0LWNoaWxkID4gJHthbnRDbHN9LXNlbGVjdC1zZWxlY3RvcixcbiAgICAgICYgPiAke2FudENsc30tc2VsZWN0LWF1dG8tY29tcGxldGU6Zmlyc3QtY2hpbGQgJHtjb21wb25lbnRDbHN9LFxuICAgICAgJiA+ICR7YW50Q2xzfS1jYXNjYWRlci1waWNrZXI6Zmlyc3QtY2hpbGQgJHtjb21wb25lbnRDbHN9YF06IHtcbiAgICAgICAgYm9yZGVyU3RhcnRTdGFydFJhZGl1czogdG9rZW4uYm9yZGVyUmFkaXVzLFxuICAgICAgICBib3JkZXJFbmRTdGFydFJhZGl1czogdG9rZW4uYm9yZGVyUmFkaXVzXG4gICAgICB9LFxuICAgICAgW2AmID4gKjpsYXN0LWNoaWxkLFxuICAgICAgJiA+ICR7YW50Q2xzfS1zZWxlY3Q6bGFzdC1jaGlsZCA+ICR7YW50Q2xzfS1zZWxlY3Qtc2VsZWN0b3IsXG4gICAgICAmID4gJHthbnRDbHN9LWNhc2NhZGVyLXBpY2tlcjpsYXN0LWNoaWxkICR7Y29tcG9uZW50Q2xzfSxcbiAgICAgICYgPiAke2FudENsc30tY2FzY2FkZXItcGlja2VyLWZvY3VzZWQ6bGFzdC1jaGlsZCAke2NvbXBvbmVudENsc31gXToge1xuICAgICAgICBib3JkZXJJbmxpbmVFbmRXaWR0aDogdG9rZW4ubGluZVdpZHRoLFxuICAgICAgICBib3JkZXJTdGFydEVuZFJhZGl1czogdG9rZW4uYm9yZGVyUmFkaXVzLFxuICAgICAgICBib3JkZXJFbmRFbmRSYWRpdXM6IHRva2VuLmJvcmRlclJhZGl1c1xuICAgICAgfSxcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzEyNDkzXG4gICAgICBbYCYgPiAke2FudENsc30tc2VsZWN0LWF1dG8tY29tcGxldGUgJHtjb21wb25lbnRDbHN9YF06IHtcbiAgICAgICAgdmVydGljYWxBbGlnbjogJ3RvcCdcbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1ncm91cC13cmFwcGVyICsgJHtjb21wb25lbnRDbHN9LWdyb3VwLXdyYXBwZXJgXToge1xuICAgICAgICBtYXJnaW5JbmxpbmVTdGFydDogdG9rZW4uY2FsYyh0b2tlbi5saW5lV2lkdGgpLm11bCgtMSkuZXF1YWwoKSxcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30tYWZmaXgtd3JhcHBlcmBdOiB7XG4gICAgICAgICAgYm9yZGVyUmFkaXVzOiAwXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1ncm91cC13cmFwcGVyOm5vdCg6bGFzdC1jaGlsZClgXToge1xuICAgICAgICBbYCYke2NvbXBvbmVudENsc30tc2VhcmNoID4gJHtjb21wb25lbnRDbHN9LWdyb3VwYF06IHtcbiAgICAgICAgICBbYCYgPiAke2NvbXBvbmVudENsc30tZ3JvdXAtYWRkb24gPiAke2NvbXBvbmVudENsc30tc2VhcmNoLWJ1dHRvbmBdOiB7XG4gICAgICAgICAgICBib3JkZXJSYWRpdXM6IDBcbiAgICAgICAgICB9LFxuICAgICAgICAgIFtgJiA+ICR7Y29tcG9uZW50Q2xzfWBdOiB7XG4gICAgICAgICAgICBib3JkZXJTdGFydFN0YXJ0UmFkaXVzOiB0b2tlbi5ib3JkZXJSYWRpdXMsXG4gICAgICAgICAgICBib3JkZXJTdGFydEVuZFJhZGl1czogMCxcbiAgICAgICAgICAgIGJvcmRlckVuZEVuZFJhZGl1czogMCxcbiAgICAgICAgICAgIGJvcmRlckVuZFN0YXJ0UmFkaXVzOiB0b2tlbi5ib3JkZXJSYWRpdXNcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9O1xufTtcbmV4cG9ydCBjb25zdCBnZW5JbnB1dFN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzLFxuICAgIGNvbnRyb2xIZWlnaHRTTSxcbiAgICBsaW5lV2lkdGgsXG4gICAgY2FsY1xuICB9ID0gdG9rZW47XG4gIGNvbnN0IEZJWEVEX0NIUk9NRV9DT0xPUl9IRUlHSFQgPSAxNjtcbiAgY29uc3QgY29sb3JTbWFsbFBhZGRpbmcgPSBjYWxjKGNvbnRyb2xIZWlnaHRTTSkuc3ViKGNhbGMobGluZVdpZHRoKS5tdWwoMikpLnN1YihGSVhFRF9DSFJPTUVfQ09MT1JfSEVJR0hUKS5kaXYoMikuZXF1YWwoKTtcbiAgcmV0dXJuIHtcbiAgICBbY29tcG9uZW50Q2xzXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVzZXRDb21wb25lbnQodG9rZW4pKSwgZ2VuQmFzaWNJbnB1dFN0eWxlKHRva2VuKSksIGdlbk91dGxpbmVkU3R5bGUodG9rZW4pKSwgZ2VuRmlsbGVkU3R5bGUodG9rZW4pKSwgZ2VuQm9yZGVybGVzc1N0eWxlKHRva2VuKSksIGdlblVuZGVybGluZWRTdHlsZSh0b2tlbikpLCB7XG4gICAgICAnJlt0eXBlPVwiY29sb3JcIl0nOiB7XG4gICAgICAgIGhlaWdodDogdG9rZW4uY29udHJvbEhlaWdodCxcbiAgICAgICAgW2AmJHtjb21wb25lbnRDbHN9LWxnYF06IHtcbiAgICAgICAgICBoZWlnaHQ6IHRva2VuLmNvbnRyb2xIZWlnaHRMR1xuICAgICAgICB9LFxuICAgICAgICBbYCYke2NvbXBvbmVudENsc30tc21gXToge1xuICAgICAgICAgIGhlaWdodDogY29udHJvbEhlaWdodFNNLFxuICAgICAgICAgIHBhZGRpbmdUb3A6IGNvbG9yU21hbGxQYWRkaW5nLFxuICAgICAgICAgIHBhZGRpbmdCb3R0b206IGNvbG9yU21hbGxQYWRkaW5nXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAnJlt0eXBlPVwic2VhcmNoXCJdOjotd2Via2l0LXNlYXJjaC1jYW5jZWwtYnV0dG9uLCAmW3R5cGU9XCJzZWFyY2hcIl06Oi13ZWJraXQtc2VhcmNoLWRlY29yYXRpb24nOiB7XG4gICAgICAgIGFwcGVhcmFuY2U6ICdub25lJ1xuICAgICAgfVxuICAgIH0pXG4gIH07XG59O1xuY29uc3QgZ2VuQWxsb3dDbGVhclN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzXG4gIH0gPSB0b2tlbjtcbiAgcmV0dXJuIHtcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IElucHV0ID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBbYCR7Y29tcG9uZW50Q2xzfS1jbGVhci1pY29uYF06IHtcbiAgICAgIG1hcmdpbjogMCxcbiAgICAgIHBhZGRpbmc6IDAsXG4gICAgICBsaW5lSGVpZ2h0OiAwLFxuICAgICAgY29sb3I6IHRva2VuLmNvbG9yVGV4dFF1YXRlcm5hcnksXG4gICAgICBmb250U2l6ZTogdG9rZW4uZm9udFNpemVJY29uLFxuICAgICAgdmVydGljYWxBbGlnbjogLTEsXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL3B1bGwvMTgxNTFcbiAgICAgIC8vIGh0dHBzOi8vY29kZXNhbmRib3guaW8vcy93aXphcmRseS1zdW4tdTEwYnJcbiAgICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgICAgdHJhbnNpdGlvbjogYGNvbG9yICR7dG9rZW4ubW90aW9uRHVyYXRpb25TbG93fWAsXG4gICAgICBib3JkZXI6ICdub25lJyxcbiAgICAgIG91dGxpbmU6ICdub25lJyxcbiAgICAgIGJhY2tncm91bmRDb2xvcjogJ3RyYW5zcGFyZW50JyxcbiAgICAgICcmOmhvdmVyJzoge1xuICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JJY29uXG4gICAgICB9LFxuICAgICAgJyY6YWN0aXZlJzoge1xuICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JUZXh0XG4gICAgICB9LFxuICAgICAgJyYtaGlkZGVuJzoge1xuICAgICAgICB2aXNpYmlsaXR5OiAnaGlkZGVuJ1xuICAgICAgfSxcbiAgICAgICcmLWhhcy1zdWZmaXgnOiB7XG4gICAgICAgIG1hcmdpbjogYDAgJHt1bml0KHRva2VuLmlucHV0QWZmaXhQYWRkaW5nKX1gXG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbmV4cG9ydCBjb25zdCBnZW5BZmZpeFN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzLFxuICAgIGlucHV0QWZmaXhQYWRkaW5nLFxuICAgIGNvbG9yVGV4dERlc2NyaXB0aW9uLFxuICAgIG1vdGlvbkR1cmF0aW9uU2xvdyxcbiAgICBjb2xvckljb24sXG4gICAgY29sb3JJY29uSG92ZXIsXG4gICAgaWNvbkNsc1xuICB9ID0gdG9rZW47XG4gIGNvbnN0IGFmZml4Q2xzID0gYCR7Y29tcG9uZW50Q2xzfS1hZmZpeC13cmFwcGVyYDtcbiAgY29uc3QgYWZmaXhDbHNEaXNhYmxlZCA9IGAke2NvbXBvbmVudENsc30tYWZmaXgtd3JhcHBlci1kaXNhYmxlZGA7XG4gIHJldHVybiB7XG4gICAgW2FmZml4Q2xzXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZ2VuQmFzaWNJbnB1dFN0eWxlKHRva2VuKSksIHtcbiAgICAgIGRpc3BsYXk6ICdpbmxpbmUtZmxleCcsXG4gICAgICBbYCY6bm90KCR7Y29tcG9uZW50Q2xzfS1kaXNhYmxlZCk6aG92ZXJgXToge1xuICAgICAgICB6SW5kZXg6IDEsXG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LXNlYXJjaC13aXRoLWJ1dHRvbiAmYF06IHtcbiAgICAgICAgICB6SW5kZXg6IDBcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICcmLWZvY3VzZWQsICY6Zm9jdXMnOiB7XG4gICAgICAgIHpJbmRleDogMVxuICAgICAgfSxcbiAgICAgIFtgPiBpbnB1dCR7Y29tcG9uZW50Q2xzfWBdOiB7XG4gICAgICAgIHBhZGRpbmc6IDBcbiAgICAgIH0sXG4gICAgICBbYD4gaW5wdXQke2NvbXBvbmVudENsc30sID4gdGV4dGFyZWEke2NvbXBvbmVudENsc31gXToge1xuICAgICAgICBmb250U2l6ZTogJ2luaGVyaXQnLFxuICAgICAgICBib3JkZXI6ICdub25lJyxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiAwLFxuICAgICAgICBvdXRsaW5lOiAnbm9uZScsXG4gICAgICAgIGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgIGNvbG9yOiAnaW5oZXJpdCcsXG4gICAgICAgICcmOjotbXMtcmV2ZWFsJzoge1xuICAgICAgICAgIGRpc3BsYXk6ICdub25lJ1xuICAgICAgICB9LFxuICAgICAgICAnJjpmb2N1cyc6IHtcbiAgICAgICAgICBib3hTaGFkb3c6ICdub25lICFpbXBvcnRhbnQnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAnJjo6YmVmb3JlJzoge1xuICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJyxcbiAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgIHZpc2liaWxpdHk6ICdoaWRkZW4nLFxuICAgICAgICBjb250ZW50OiAnXCJcXFxcYTBcIidcbiAgICAgIH0sXG4gICAgICBbY29tcG9uZW50Q2xzXToge1xuICAgICAgICAnJi1wcmVmaXgsICYtc3VmZml4Jzoge1xuICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgICBmbGV4OiAnbm9uZScsXG4gICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAgJz4gKjpub3QoOmxhc3QtY2hpbGQpJzoge1xuICAgICAgICAgICAgbWFyZ2luSW5saW5lRW5kOiB0b2tlbi5wYWRkaW5nWFNcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICcmLXNob3ctY291bnQtc3VmZml4Jzoge1xuICAgICAgICAgIGNvbG9yOiBjb2xvclRleHREZXNjcmlwdGlvbixcbiAgICAgICAgICBkaXJlY3Rpb246ICdsdHInXG4gICAgICAgIH0sXG4gICAgICAgICcmLXNob3ctY291bnQtaGFzLXN1ZmZpeCc6IHtcbiAgICAgICAgICBtYXJnaW5JbmxpbmVFbmQ6IHRva2VuLnBhZGRpbmdYWFNcbiAgICAgICAgfSxcbiAgICAgICAgJyYtcHJlZml4Jzoge1xuICAgICAgICAgIG1hcmdpbklubGluZUVuZDogaW5wdXRBZmZpeFBhZGRpbmdcbiAgICAgICAgfSxcbiAgICAgICAgJyYtc3VmZml4Jzoge1xuICAgICAgICAgIG1hcmdpbklubGluZVN0YXJ0OiBpbnB1dEFmZml4UGFkZGluZ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSksIGdlbkFsbG93Q2xlYXJTdHlsZSh0b2tlbikpLCB7XG4gICAgICAvLyBwYXNzd29yZFxuICAgICAgW2Ake2ljb25DbHN9JHtjb21wb25lbnRDbHN9LXBhc3N3b3JkLWljb25gXToge1xuICAgICAgICBjb2xvcjogY29sb3JJY29uLFxuICAgICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgICAgdHJhbnNpdGlvbjogYGFsbCAke21vdGlvbkR1cmF0aW9uU2xvd31gLFxuICAgICAgICAnJjpob3Zlcic6IHtcbiAgICAgICAgICBjb2xvcjogY29sb3JJY29uSG92ZXJcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pLFxuICAgIC8vIFx1ODk4Nlx1NzZENiBhZmZpeC13cmFwcGVyIGJvcmRlclJhZGl1c1x1RkYwMVxuICAgIFtgJHtjb21wb25lbnRDbHN9LXVuZGVybGluZWRgXToge1xuICAgICAgYm9yZGVyUmFkaXVzOiAwXG4gICAgfSxcbiAgICBbYWZmaXhDbHNEaXNhYmxlZF06IHtcbiAgICAgIC8vIHBhc3N3b3JkIGRpc2FibGVkXG4gICAgICBbYCR7aWNvbkNsc30ke2NvbXBvbmVudENsc30tcGFzc3dvcmQtaWNvbmBdOiB7XG4gICAgICAgIGNvbG9yOiBjb2xvckljb24sXG4gICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkJyxcbiAgICAgICAgJyY6aG92ZXInOiB7XG4gICAgICAgICAgY29sb3I6IGNvbG9ySWNvblxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbmNvbnN0IGdlbkdyb3VwU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHMsXG4gICAgYm9yZGVyUmFkaXVzTEcsXG4gICAgYm9yZGVyUmFkaXVzU01cbiAgfSA9IHRva2VuO1xuICByZXR1cm4ge1xuICAgIFtgJHtjb21wb25lbnRDbHN9LWdyb3VwYF06IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXNldENvbXBvbmVudCh0b2tlbikpLCBnZW5JbnB1dEdyb3VwU3R5bGUodG9rZW4pKSwge1xuICAgICAgJyYtcnRsJzoge1xuICAgICAgICBkaXJlY3Rpb246ICdydGwnXG4gICAgICB9LFxuICAgICAgJyYtd3JhcHBlcic6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHtcbiAgICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgIHRleHRBbGlnbjogJ3N0YXJ0JyxcbiAgICAgICAgdmVydGljYWxBbGlnbjogJ3RvcCcsXG4gICAgICAgICcmLXJ0bCc6IHtcbiAgICAgICAgICBkaXJlY3Rpb246ICdydGwnXG4gICAgICAgIH0sXG4gICAgICAgIC8vIFNpemVcbiAgICAgICAgJyYtbGcnOiB7XG4gICAgICAgICAgW2Ake2NvbXBvbmVudENsc30tZ3JvdXAtYWRkb25gXToge1xuICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBib3JkZXJSYWRpdXNMRyxcbiAgICAgICAgICAgIGZvbnRTaXplOiB0b2tlbi5pbnB1dEZvbnRTaXplTEdcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICcmLXNtJzoge1xuICAgICAgICAgIFtgJHtjb21wb25lbnRDbHN9LWdyb3VwLWFkZG9uYF06IHtcbiAgICAgICAgICAgIGJvcmRlclJhZGl1czogYm9yZGVyUmFkaXVzU01cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIGdlbk91dGxpbmVkR3JvdXBTdHlsZSh0b2tlbikpLCBnZW5GaWxsZWRHcm91cFN0eWxlKHRva2VuKSksIHtcbiAgICAgICAgLy8gJyYtZGlzYWJsZWQnOiB7XG4gICAgICAgIC8vICAgW2Ake2NvbXBvbmVudENsc30tZ3JvdXAtYWRkb25gXToge1xuICAgICAgICAvLyAgICAgLi4uZ2VuRGlzYWJsZWRTdHlsZSh0b2tlbiksXG4gICAgICAgIC8vICAgfSxcbiAgICAgICAgLy8gfSxcbiAgICAgICAgLy8gRml4IHRoZSBpc3N1ZSBvZiB1c2luZyBpY29ucyBpbiBTcGFjZSBDb21wYWN0IG1vZGVcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvNDIxMjJcbiAgICAgICAgW2AmOm5vdCgke2NvbXBvbmVudENsc30tY29tcGFjdC1maXJzdC1pdGVtKTpub3QoJHtjb21wb25lbnRDbHN9LWNvbXBhY3QtbGFzdC1pdGVtKSR7Y29tcG9uZW50Q2xzfS1jb21wYWN0LWl0ZW1gXToge1xuICAgICAgICAgIFtgJHtjb21wb25lbnRDbHN9LCAke2NvbXBvbmVudENsc30tZ3JvdXAtYWRkb25gXToge1xuICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAwXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbYCY6bm90KCR7Y29tcG9uZW50Q2xzfS1jb21wYWN0LWxhc3QtaXRlbSkke2NvbXBvbmVudENsc30tY29tcGFjdC1maXJzdC1pdGVtYF06IHtcbiAgICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfSwgJHtjb21wb25lbnRDbHN9LWdyb3VwLWFkZG9uYF06IHtcbiAgICAgICAgICAgIGJvcmRlclN0YXJ0RW5kUmFkaXVzOiAwLFxuICAgICAgICAgICAgYm9yZGVyRW5kRW5kUmFkaXVzOiAwXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbYCY6bm90KCR7Y29tcG9uZW50Q2xzfS1jb21wYWN0LWZpcnN0LWl0ZW0pJHtjb21wb25lbnRDbHN9LWNvbXBhY3QtbGFzdC1pdGVtYF06IHtcbiAgICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfSwgJHtjb21wb25lbnRDbHN9LWdyb3VwLWFkZG9uYF06IHtcbiAgICAgICAgICAgIGJvcmRlclN0YXJ0U3RhcnRSYWRpdXM6IDAsXG4gICAgICAgICAgICBib3JkZXJFbmRTdGFydFJhZGl1czogMFxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLy8gRml4IHRoZSBpc3N1ZSBvZiBpbnB1dCB1c2Ugc2hvdy1jb3VudCBwYXJhbSBpbiBzcGFjZSBjb21wYWN0IG1vZGVcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvNDY4NzJcbiAgICAgICAgW2AmOm5vdCgke2NvbXBvbmVudENsc30tY29tcGFjdC1sYXN0LWl0ZW0pJHtjb21wb25lbnRDbHN9LWNvbXBhY3QtaXRlbWBdOiB7XG4gICAgICAgICAgW2Ake2NvbXBvbmVudENsc30tYWZmaXgtd3JhcHBlcmBdOiB7XG4gICAgICAgICAgICBib3JkZXJTdGFydEVuZFJhZGl1czogMCxcbiAgICAgICAgICAgIGJvcmRlckVuZEVuZFJhZGl1czogMFxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLy8gRml4IHRoZSBpc3N1ZSBvZiBpbnB1dCB1c2UgYGFkZG9uQWZ0ZXJgIHBhcmFtIGluIHNwYWNlIGNvbXBhY3QgbW9kZVxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy81MjQ4M1xuICAgICAgICBbYCY6bm90KCR7Y29tcG9uZW50Q2xzfS1jb21wYWN0LWZpcnN0LWl0ZW0pJHtjb21wb25lbnRDbHN9LWNvbXBhY3QtaXRlbWBdOiB7XG4gICAgICAgICAgW2Ake2NvbXBvbmVudENsc30tYWZmaXgtd3JhcHBlcmBdOiB7XG4gICAgICAgICAgICBib3JkZXJTdGFydFN0YXJ0UmFkaXVzOiAwLFxuICAgICAgICAgICAgYm9yZGVyRW5kU3RhcnRSYWRpdXM6IDBcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcbiAgfTtcbn07XG5jb25zdCBnZW5TZWFyY2hJbnB1dFN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzLFxuICAgIGFudENsc1xuICB9ID0gdG9rZW47XG4gIGNvbnN0IHNlYXJjaFByZWZpeENscyA9IGAke2NvbXBvbmVudENsc30tc2VhcmNoYDtcbiAgcmV0dXJuIHtcbiAgICBbc2VhcmNoUHJlZml4Q2xzXToge1xuICAgICAgW2NvbXBvbmVudENsc106IHtcbiAgICAgICAgJyY6aG92ZXIsICY6Zm9jdXMnOiB7XG4gICAgICAgICAgW2ArICR7Y29tcG9uZW50Q2xzfS1ncm91cC1hZGRvbiAke3NlYXJjaFByZWZpeENsc30tYnV0dG9uOm5vdCgke2FudENsc30tYnRuLXByaW1hcnkpYF06IHtcbiAgICAgICAgICAgIGJvcmRlcklubGluZVN0YXJ0Q29sb3I6IHRva2VuLmNvbG9yUHJpbWFyeUhvdmVyXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tYWZmaXgtd3JhcHBlcmBdOiB7XG4gICAgICAgIGhlaWdodDogdG9rZW4uY29udHJvbEhlaWdodCxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiAwXG4gICAgICB9LFxuICAgICAgLy8gZml4IHNsaWdodCBoZWlnaHQgZGlmZiBpbiBGaXJlZm94OlxuICAgICAgLy8gaHR0cHM6Ly9hbnQuZGVzaWduL2NvbXBvbmVudHMvYXV0by1jb21wbGV0ZS1jbi8jYXV0by1jb21wbGV0ZS1kZW1vLWNlcnRhaW4tY2F0ZWdvcnlcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWxnYF06IHtcbiAgICAgICAgbGluZUhlaWdodDogdG9rZW4uY2FsYyh0b2tlbi5saW5lSGVpZ2h0TEcpLnN1YigwLjAwMDIpLmVxdWFsKClcbiAgICAgIH0sXG4gICAgICBbYD4gJHtjb21wb25lbnRDbHN9LWdyb3VwYF06IHtcbiAgICAgICAgW2A+ICR7Y29tcG9uZW50Q2xzfS1ncm91cC1hZGRvbjpsYXN0LWNoaWxkYF06IHtcbiAgICAgICAgICBpbnNldElubGluZVN0YXJ0OiAtMSxcbiAgICAgICAgICBwYWRkaW5nOiAwLFxuICAgICAgICAgIGJvcmRlcjogMCxcbiAgICAgICAgICBbYCR7c2VhcmNoUHJlZml4Q2xzfS1idXR0b25gXToge1xuICAgICAgICAgICAgLy8gRml4IGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzQ3MTUwXG4gICAgICAgICAgICBtYXJnaW5JbmxpbmVFbmQ6IC0xLFxuICAgICAgICAgICAgYm9yZGVyU3RhcnRTdGFydFJhZGl1czogMCxcbiAgICAgICAgICAgIGJvcmRlckVuZFN0YXJ0UmFkaXVzOiAwLFxuICAgICAgICAgICAgYm94U2hhZG93OiAnbm9uZSdcbiAgICAgICAgICB9LFxuICAgICAgICAgIFtgJHtzZWFyY2hQcmVmaXhDbHN9LWJ1dHRvbjpub3QoJHthbnRDbHN9LWJ0bi1wcmltYXJ5KWBdOiB7XG4gICAgICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JUZXh0RGVzY3JpcHRpb24sXG4gICAgICAgICAgICAnJjpob3Zlcic6IHtcbiAgICAgICAgICAgICAgY29sb3I6IHRva2VuLmNvbG9yUHJpbWFyeUhvdmVyXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyY6YWN0aXZlJzoge1xuICAgICAgICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JQcmltYXJ5QWN0aXZlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW2AmJHthbnRDbHN9LWJ0bi1sb2FkaW5nOjpiZWZvcmVgXToge1xuICAgICAgICAgICAgICBpbnNldElubGluZVN0YXJ0OiAwLFxuICAgICAgICAgICAgICBpbnNldElubGluZUVuZDogMCxcbiAgICAgICAgICAgICAgaW5zZXRCbG9ja1N0YXJ0OiAwLFxuICAgICAgICAgICAgICBpbnNldEJsb2NrRW5kOiAwXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2Ake3NlYXJjaFByZWZpeENsc30tYnV0dG9uYF06IHtcbiAgICAgICAgaGVpZ2h0OiB0b2tlbi5jb250cm9sSGVpZ2h0LFxuICAgICAgICAnJjpob3ZlciwgJjpmb2N1cyc6IHtcbiAgICAgICAgICB6SW5kZXg6IDFcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICcmLWxhcmdlJzoge1xuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1hZmZpeC13cmFwcGVyLCAke3NlYXJjaFByZWZpeENsc30tYnV0dG9uYF06IHtcbiAgICAgICAgICBoZWlnaHQ6IHRva2VuLmNvbnRyb2xIZWlnaHRMR1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgJyYtc21hbGwnOiB7XG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LWFmZml4LXdyYXBwZXIsICR7c2VhcmNoUHJlZml4Q2xzfS1idXR0b25gXToge1xuICAgICAgICAgIGhlaWdodDogdG9rZW4uY29udHJvbEhlaWdodFNNXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAnJi1ydGwnOiB7XG4gICAgICAgIGRpcmVjdGlvbjogJ3J0bCdcbiAgICAgIH0sXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT0gQ29tcGFjdCBJdGVtIEN1c3RvbWl6ZWQgU3R5bGVzID09PT09PT09PT09PT09PT09PT09PVxuICAgICAgW2AmJHtjb21wb25lbnRDbHN9LWNvbXBhY3QtaXRlbWBdOiB7XG4gICAgICAgIFtgJjpub3QoJHtjb21wb25lbnRDbHN9LWNvbXBhY3QtbGFzdC1pdGVtKWBdOiB7XG4gICAgICAgICAgW2Ake2NvbXBvbmVudENsc30tZ3JvdXAtYWRkb25gXToge1xuICAgICAgICAgICAgW2Ake2NvbXBvbmVudENsc30tc2VhcmNoLWJ1dHRvbmBdOiB7XG4gICAgICAgICAgICAgIG1hcmdpbklubGluZUVuZDogdG9rZW4uY2FsYyh0b2tlbi5saW5lV2lkdGgpLm11bCgtMSkuZXF1YWwoKSxcbiAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAwXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbYCY6bm90KCR7Y29tcG9uZW50Q2xzfS1jb21wYWN0LWZpcnN0LWl0ZW0pYF06IHtcbiAgICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfSwke2NvbXBvbmVudENsc30tYWZmaXgtd3JhcHBlcmBdOiB7XG4gICAgICAgICAgICBib3JkZXJSYWRpdXM6IDBcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtgPiAke2NvbXBvbmVudENsc30tZ3JvdXAtYWRkb24gJHtjb21wb25lbnRDbHN9LXNlYXJjaC1idXR0b24sXG4gICAgICAgID4gJHtjb21wb25lbnRDbHN9LFxuICAgICAgICAke2NvbXBvbmVudENsc30tYWZmaXgtd3JhcHBlcmBdOiB7XG4gICAgICAgICAgJyY6aG92ZXIsICY6Zm9jdXMsICY6YWN0aXZlJzoge1xuICAgICAgICAgICAgekluZGV4OiAyXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbYD4gJHtjb21wb25lbnRDbHN9LWFmZml4LXdyYXBwZXItZm9jdXNlZGBdOiB7XG4gICAgICAgICAgekluZGV4OiAyXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJhbmdlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmNvbnN0IGdlblJhbmdlU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHNcbiAgfSA9IHRva2VuO1xuICByZXR1cm4ge1xuICAgIFtgJHtjb21wb25lbnRDbHN9LW91dC1vZi1yYW5nZWBdOiB7XG4gICAgICBbYCYsICYgaW5wdXQsICYgdGV4dGFyZWEsICR7Y29tcG9uZW50Q2xzfS1zaG93LWNvdW50LXN1ZmZpeCwgJHtjb21wb25lbnRDbHN9LWRhdGEtY291bnRgXToge1xuICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JFcnJvclxuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRXhwb3J0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuZXhwb3J0IGNvbnN0IHVzZVNoYXJlZFN0eWxlID0gZ2VuU3R5bGVIb29rcyhbJ0lucHV0JywgJ1NoYXJlZCddLCB0b2tlbiA9PiB7XG4gIGNvbnN0IGlucHV0VG9rZW4gPSBtZXJnZVRva2VuKHRva2VuLCBpbml0SW5wdXRUb2tlbih0b2tlbikpO1xuICByZXR1cm4gW2dlbklucHV0U3R5bGUoaW5wdXRUb2tlbiksIGdlbkFmZml4U3R5bGUoaW5wdXRUb2tlbildO1xufSwgaW5pdENvbXBvbmVudFRva2VuLCB7XG4gIHJlc2V0Rm9udDogZmFsc2Vcbn0pO1xuZXhwb3J0IGRlZmF1bHQgZ2VuU3R5bGVIb29rcyhbJ0lucHV0JywgJ0NvbXBvbmVudCddLCB0b2tlbiA9PiB7XG4gIGNvbnN0IGlucHV0VG9rZW4gPSBtZXJnZVRva2VuKHRva2VuLCBpbml0SW5wdXRUb2tlbih0b2tlbikpO1xuICByZXR1cm4gW2dlbkdyb3VwU3R5bGUoaW5wdXRUb2tlbiksIGdlblNlYXJjaElucHV0U3R5bGUoaW5wdXRUb2tlbiksIGdlblJhbmdlU3R5bGUoaW5wdXRUb2tlbiksXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vID09ICAgICAgICAgICAgIFNwYWNlIENvbXBhY3QgICAgICAgICAgICAgICAgICAgICAgID09XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGdlbkNvbXBhY3RJdGVtU3R5bGUoaW5wdXRUb2tlbildO1xufSwgaW5pdENvbXBvbmVudFRva2VuLCB7XG4gIHJlc2V0Rm9udDogZmFsc2Vcbn0pOyIsICJpbXBvcnQgeyB1bml0IH0gZnJvbSAnQGFudC1kZXNpZ24vY3NzaW5qcyc7XG5pbXBvcnQgeyBnZW5Gb2N1c091dGxpbmUsIHJlc2V0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc3R5bGUnO1xuaW1wb3J0IHsgZ2VuU3R5bGVIb29rcywgbWVyZ2VUb2tlbiB9IGZyb20gJy4uLy4uL3RoZW1lL2ludGVybmFsJztcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTdHlsZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgY29uc3QgZ2VuQ2hlY2tib3hTdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNoZWNrYm94Q2xzXG4gIH0gPSB0b2tlbjtcbiAgY29uc3Qgd3JhcHBlckNscyA9IGAke2NoZWNrYm94Q2xzfS13cmFwcGVyYDtcbiAgcmV0dXJuIFtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09IEJhc2ljID09PT09PT09PT09PT09PT09PT09PVxuICB7XG4gICAgLy8gR3JvdXBcbiAgICBbYCR7Y2hlY2tib3hDbHN9LWdyb3VwYF06IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVzZXRDb21wb25lbnQodG9rZW4pKSwge1xuICAgICAgZGlzcGxheTogJ2lubGluZS1mbGV4JyxcbiAgICAgIGZsZXhXcmFwOiAnd3JhcCcsXG4gICAgICBjb2x1bW5HYXA6IHRva2VuLm1hcmdpblhTLFxuICAgICAgLy8gR3JvdXAgPiBHcmlkXG4gICAgICBbYD4gJHt0b2tlbi5hbnRDbHN9LXJvd2BdOiB7XG4gICAgICAgIGZsZXg6IDFcbiAgICAgIH1cbiAgICB9KSxcbiAgICAvLyBXcmFwcGVyXG4gICAgW3dyYXBwZXJDbHNdOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlc2V0Q29tcG9uZW50KHRva2VuKSksIHtcbiAgICAgIGRpc3BsYXk6ICdpbmxpbmUtZmxleCcsXG4gICAgICBhbGlnbkl0ZW1zOiAnYmFzZWxpbmUnLFxuICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgICAvLyBGaXggY2hlY2tib3ggJiByYWRpbyBpbiBmbGV4IGFsaWduICMzMDI2MFxuICAgICAgJyY6YWZ0ZXInOiB7XG4gICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgICBjb250ZW50OiBcIidcXFxcYTAnXCJcbiAgICAgIH0sXG4gICAgICAvLyBDaGVja2JveCBuZWFyIGNoZWNrYm94XG4gICAgICBbYCYgKyAke3dyYXBwZXJDbHN9YF06IHtcbiAgICAgICAgbWFyZ2luSW5saW5lU3RhcnQ6IDBcbiAgICAgIH0sXG4gICAgICBbYCYke3dyYXBwZXJDbHN9LWluLWZvcm0taXRlbWBdOiB7XG4gICAgICAgICdpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0nOiB7XG4gICAgICAgICAgd2lkdGg6IDE0LFxuICAgICAgICAgIC8vIEZJWE1FOiBtYWdpY1xuICAgICAgICAgIGhlaWdodDogMTQgLy8gRklYTUU6IG1hZ2ljXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSxcbiAgICAvLyBXcmFwcGVyID4gQ2hlY2tib3hcbiAgICBbY2hlY2tib3hDbHNdOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlc2V0Q29tcG9uZW50KHRva2VuKSksIHtcbiAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgd2hpdGVTcGFjZTogJ25vd3JhcCcsXG4gICAgICBsaW5lSGVpZ2h0OiAxLFxuICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgICBib3JkZXJSYWRpdXM6IHRva2VuLmJvcmRlclJhZGl1c1NNLFxuICAgICAgLy8gVG8gbWFrZSBhbGlnbm1lbnQgcmlnaHQgd2hlbiBgY29udHJvbEhlaWdodGAgaXMgY2hhbmdlZFxuICAgICAgLy8gUmVmOiBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy80MTU2NFxuICAgICAgYWxpZ25TZWxmOiAnY2VudGVyJyxcbiAgICAgIC8vIFdyYXBwZXIgPiBDaGVja2JveCA+IGlucHV0XG4gICAgICBbYCR7Y2hlY2tib3hDbHN9LWlucHV0YF06IHtcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgIC8vIFNpbmNlIGJhc2VsaW5lIGFsaWduIHdpbGwgZ2V0IGFkZGl0aW9uYWwgc3BhY2Ugb2Zmc2V0LFxuICAgICAgICAvLyB3ZSBuZWVkIHRvIG1vdmUgaW5wdXQgdG8gdG9wIHRvIG1ha2UgaXQgYWxpZ24gd2l0aCB0ZXh0LlxuICAgICAgICAvLyBSZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzM4OTI2I2lzc3VlY29tbWVudC0xNDg2MTM3Nzk5XG4gICAgICAgIGluc2V0OiAwLFxuICAgICAgICB6SW5kZXg6IDEsXG4gICAgICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgICAgICBvcGFjaXR5OiAwLFxuICAgICAgICBtYXJnaW46IDAsXG4gICAgICAgIFtgJjpmb2N1cy12aXNpYmxlICsgJHtjaGVja2JveENsc30taW5uZXJgXTogT2JqZWN0LmFzc2lnbih7fSwgZ2VuRm9jdXNPdXRsaW5lKHRva2VuKSlcbiAgICAgIH0sXG4gICAgICAvLyBXcmFwcGVyID4gQ2hlY2tib3ggPiBpbm5lclxuICAgICAgW2Ake2NoZWNrYm94Q2xzfS1pbm5lcmBdOiB7XG4gICAgICAgIGJveFNpemluZzogJ2JvcmRlci1ib3gnLFxuICAgICAgICBkaXNwbGF5OiAnYmxvY2snLFxuICAgICAgICB3aWR0aDogdG9rZW4uY2hlY2tib3hTaXplLFxuICAgICAgICBoZWlnaHQ6IHRva2VuLmNoZWNrYm94U2l6ZSxcbiAgICAgICAgZGlyZWN0aW9uOiAnbHRyJyxcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0b2tlbi5jb2xvckJnQ29udGFpbmVyLFxuICAgICAgICBib3JkZXI6IGAke3VuaXQodG9rZW4ubGluZVdpZHRoKX0gJHt0b2tlbi5saW5lVHlwZX0gJHt0b2tlbi5jb2xvckJvcmRlcn1gLFxuICAgICAgICBib3JkZXJSYWRpdXM6IHRva2VuLmJvcmRlclJhZGl1c1NNLFxuICAgICAgICBib3JkZXJDb2xsYXBzZTogJ3NlcGFyYXRlJyxcbiAgICAgICAgdHJhbnNpdGlvbjogYGFsbCAke3Rva2VuLm1vdGlvbkR1cmF0aW9uU2xvd31gLFxuICAgICAgICAnJjphZnRlcic6IHtcbiAgICAgICAgICBib3hTaXppbmc6ICdib3JkZXItYm94JyxcbiAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICB0b3A6ICc1MCUnLFxuICAgICAgICAgIGluc2V0SW5saW5lU3RhcnQ6ICcyNSUnLFxuICAgICAgICAgIGRpc3BsYXk6ICd0YWJsZScsXG4gICAgICAgICAgd2lkdGg6IHRva2VuLmNhbGModG9rZW4uY2hlY2tib3hTaXplKS5kaXYoMTQpLm11bCg1KS5lcXVhbCgpLFxuICAgICAgICAgIGhlaWdodDogdG9rZW4uY2FsYyh0b2tlbi5jaGVja2JveFNpemUpLmRpdigxNCkubXVsKDgpLmVxdWFsKCksXG4gICAgICAgICAgYm9yZGVyOiBgJHt1bml0KHRva2VuLmxpbmVXaWR0aEJvbGQpfSBzb2xpZCAke3Rva2VuLmNvbG9yV2hpdGV9YCxcbiAgICAgICAgICBib3JkZXJUb3A6IDAsXG4gICAgICAgICAgYm9yZGVySW5saW5lU3RhcnQ6IDAsXG4gICAgICAgICAgdHJhbnNmb3JtOiAncm90YXRlKDQ1ZGVnKSBzY2FsZSgwKSB0cmFuc2xhdGUoLTUwJSwtNTAlKScsXG4gICAgICAgICAgb3BhY2l0eTogMCxcbiAgICAgICAgICBjb250ZW50OiAnXCJcIicsXG4gICAgICAgICAgdHJhbnNpdGlvbjogYGFsbCAke3Rva2VuLm1vdGlvbkR1cmF0aW9uRmFzdH0gJHt0b2tlbi5tb3Rpb25FYXNlSW5CYWNrfSwgb3BhY2l0eSAke3Rva2VuLm1vdGlvbkR1cmF0aW9uRmFzdH1gXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyBXcmFwcGVyID4gQ2hlY2tib3ggKyBUZXh0XG4gICAgICAnJiArIHNwYW4nOiB7XG4gICAgICAgIHBhZGRpbmdJbmxpbmVTdGFydDogdG9rZW4ucGFkZGluZ1hTLFxuICAgICAgICBwYWRkaW5nSW5saW5lRW5kOiB0b2tlbi5wYWRkaW5nWFNcbiAgICAgIH1cbiAgICB9KVxuICB9LFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gSG92ZXIgPT09PT09PT09PT09PT09PT09PT09XG4gIHtcbiAgICAvLyBXcmFwcGVyICYgV3JhcHBlciA+IENoZWNrYm94XG4gICAgW2BcbiAgICAgICAgJHt3cmFwcGVyQ2xzfTpub3QoJHt3cmFwcGVyQ2xzfS1kaXNhYmxlZCksXG4gICAgICAgICR7Y2hlY2tib3hDbHN9Om5vdCgke2NoZWNrYm94Q2xzfS1kaXNhYmxlZClcbiAgICAgIGBdOiB7XG4gICAgICBbYCY6aG92ZXIgJHtjaGVja2JveENsc30taW5uZXJgXToge1xuICAgICAgICBib3JkZXJDb2xvcjogdG9rZW4uY29sb3JQcmltYXJ5XG4gICAgICB9XG4gICAgfSxcbiAgICBbYCR7d3JhcHBlckNsc306bm90KCR7d3JhcHBlckNsc30tZGlzYWJsZWQpYF06IHtcbiAgICAgIFtgJjpob3ZlciAke2NoZWNrYm94Q2xzfS1jaGVja2VkOm5vdCgke2NoZWNrYm94Q2xzfS1kaXNhYmxlZCkgJHtjaGVja2JveENsc30taW5uZXJgXToge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRva2VuLmNvbG9yUHJpbWFyeUhvdmVyLFxuICAgICAgICBib3JkZXJDb2xvcjogJ3RyYW5zcGFyZW50J1xuICAgICAgfSxcbiAgICAgIFtgJjpob3ZlciAke2NoZWNrYm94Q2xzfS1jaGVja2VkOm5vdCgke2NoZWNrYm94Q2xzfS1kaXNhYmxlZCk6YWZ0ZXJgXToge1xuICAgICAgICBib3JkZXJDb2xvcjogdG9rZW4uY29sb3JQcmltYXJ5SG92ZXJcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIC8vID09PT09PT09PT09PT09PT09PT09IENoZWNrZWQgPT09PT09PT09PT09PT09PT09PT1cbiAge1xuICAgIC8vIFdyYXBwZXIgPiBDaGVja2JveFxuICAgIFtgJHtjaGVja2JveENsc30tY2hlY2tlZGBdOiB7XG4gICAgICBbYCR7Y2hlY2tib3hDbHN9LWlubmVyYF06IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0b2tlbi5jb2xvclByaW1hcnksXG4gICAgICAgIGJvcmRlckNvbG9yOiB0b2tlbi5jb2xvclByaW1hcnksXG4gICAgICAgICcmOmFmdGVyJzoge1xuICAgICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgICAgdHJhbnNmb3JtOiAncm90YXRlKDQ1ZGVnKSBzY2FsZSgxKSB0cmFuc2xhdGUoLTUwJSwtNTAlKScsXG4gICAgICAgICAgdHJhbnNpdGlvbjogYGFsbCAke3Rva2VuLm1vdGlvbkR1cmF0aW9uTWlkfSAke3Rva2VuLm1vdGlvbkVhc2VPdXRCYWNrfSAke3Rva2VuLm1vdGlvbkR1cmF0aW9uRmFzdH1gXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFtgXG4gICAgICAgICR7d3JhcHBlckNsc30tY2hlY2tlZDpub3QoJHt3cmFwcGVyQ2xzfS1kaXNhYmxlZCksXG4gICAgICAgICR7Y2hlY2tib3hDbHN9LWNoZWNrZWQ6bm90KCR7Y2hlY2tib3hDbHN9LWRpc2FibGVkKVxuICAgICAgYF06IHtcbiAgICAgIFtgJjpob3ZlciAke2NoZWNrYm94Q2xzfS1pbm5lcmBdOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogdG9rZW4uY29sb3JQcmltYXJ5SG92ZXIsXG4gICAgICAgIGJvcmRlckNvbG9yOiAndHJhbnNwYXJlbnQnXG4gICAgICB9XG4gICAgfVxuICB9LFxuICAvLyA9PT09PT09PT09PT09PT09PSBJbmRldGVybWluYXRlID09PT09PT09PT09PT09PT09XG4gIHtcbiAgICBbY2hlY2tib3hDbHNdOiB7XG4gICAgICAnJi1pbmRldGVybWluYXRlJzoge1xuICAgICAgICAvLyBXcmFwcGVyID4gQ2hlY2tib3ggPiBpbm5lclxuICAgICAgICBbYCR7Y2hlY2tib3hDbHN9LWlubmVyYF06IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGAke3Rva2VuLmNvbG9yQmdDb250YWluZXJ9ICFpbXBvcnRhbnRgLFxuICAgICAgICAgIGJvcmRlckNvbG9yOiBgJHt0b2tlbi5jb2xvckJvcmRlcn0gIWltcG9ydGFudGAsXG4gICAgICAgICAgJyY6YWZ0ZXInOiB7XG4gICAgICAgICAgICB0b3A6ICc1MCUnLFxuICAgICAgICAgICAgaW5zZXRJbmxpbmVTdGFydDogJzUwJScsXG4gICAgICAgICAgICB3aWR0aDogdG9rZW4uY2FsYyh0b2tlbi5mb250U2l6ZUxHKS5kaXYoMikuZXF1YWwoKSxcbiAgICAgICAgICAgIGhlaWdodDogdG9rZW4uY2FsYyh0b2tlbi5mb250U2l6ZUxHKS5kaXYoMikuZXF1YWwoKSxcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdG9rZW4uY29sb3JQcmltYXJ5LFxuICAgICAgICAgICAgYm9yZGVyOiAwLFxuICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlKC01MCUsIC01MCUpIHNjYWxlKDEpJyxcbiAgICAgICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgICAgICBjb250ZW50OiAnXCJcIidcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzUwMDc0XG4gICAgICAgIFtgJjpob3ZlciAke2NoZWNrYm94Q2xzfS1pbm5lcmBdOiB7XG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBgJHt0b2tlbi5jb2xvckJnQ29udGFpbmVyfSAhaW1wb3J0YW50YCxcbiAgICAgICAgICBib3JkZXJDb2xvcjogYCR7dG9rZW4uY29sb3JQcmltYXJ5fSAhaW1wb3J0YW50YFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBEaXNhYmxlID09PT09PT09PT09PT09PT09PT09XG4gIHtcbiAgICAvLyBXcmFwcGVyXG4gICAgW2Ake3dyYXBwZXJDbHN9LWRpc2FibGVkYF06IHtcbiAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkJ1xuICAgIH0sXG4gICAgLy8gV3JhcHBlciA+IENoZWNrYm94XG4gICAgW2Ake2NoZWNrYm94Q2xzfS1kaXNhYmxlZGBdOiB7XG4gICAgICAvLyBXcmFwcGVyID4gQ2hlY2tib3ggPiBpbnB1dFxuICAgICAgW2AmLCAke2NoZWNrYm94Q2xzfS1pbnB1dGBdOiB7XG4gICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkJyxcbiAgICAgICAgLy8gRGlzYWJsZWQgZm9yIG5hdGl2ZSBpbnB1dCB0byBlbmFibGUgVG9vbHRpcCBldmVudCBoYW5kbGVyXG4gICAgICAgIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMzk4MjIjaXNzdWVjb21tZW50LTEzNjUwNzU5MDFcbiAgICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnXG4gICAgICB9LFxuICAgICAgLy8gV3JhcHBlciA+IENoZWNrYm94ID4gaW5uZXJcbiAgICAgIFtgJHtjaGVja2JveENsc30taW5uZXJgXToge1xuICAgICAgICBiYWNrZ3JvdW5kOiB0b2tlbi5jb2xvckJnQ29udGFpbmVyRGlzYWJsZWQsXG4gICAgICAgIGJvcmRlckNvbG9yOiB0b2tlbi5jb2xvckJvcmRlcixcbiAgICAgICAgJyY6YWZ0ZXInOiB7XG4gICAgICAgICAgYm9yZGVyQ29sb3I6IHRva2VuLmNvbG9yVGV4dERpc2FibGVkXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAnJjphZnRlcic6IHtcbiAgICAgICAgZGlzcGxheTogJ25vbmUnXG4gICAgICB9LFxuICAgICAgJyYgKyBzcGFuJzoge1xuICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JUZXh0RGlzYWJsZWRcbiAgICAgIH0sXG4gICAgICBbYCYke2NoZWNrYm94Q2xzfS1pbmRldGVybWluYXRlICR7Y2hlY2tib3hDbHN9LWlubmVyOjphZnRlcmBdOiB7XG4gICAgICAgIGJhY2tncm91bmQ6IHRva2VuLmNvbG9yVGV4dERpc2FibGVkXG4gICAgICB9XG4gICAgfVxuICB9XTtcbn07XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRXhwb3J0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0eWxlKHByZWZpeENscywgdG9rZW4pIHtcbiAgY29uc3QgY2hlY2tib3hUb2tlbiA9IG1lcmdlVG9rZW4odG9rZW4sIHtcbiAgICBjaGVja2JveENsczogYC4ke3ByZWZpeENsc31gLFxuICAgIGNoZWNrYm94U2l6ZTogdG9rZW4uY29udHJvbEludGVyYWN0aXZlU2l6ZVxuICB9KTtcbiAgcmV0dXJuIFtnZW5DaGVja2JveFN0eWxlKGNoZWNrYm94VG9rZW4pXTtcbn1cbmV4cG9ydCBkZWZhdWx0IGdlblN0eWxlSG9va3MoJ0NoZWNrYm94JywgKHRva2VuLCBfcmVmKSA9PiB7XG4gIGxldCB7XG4gICAgcHJlZml4Q2xzXG4gIH0gPSBfcmVmO1xuICByZXR1cm4gW2dldFN0eWxlKHByZWZpeENscywgdG9rZW4pXTtcbn0pOyIsICJcInVzZSBjbGllbnRcIjtcblxudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFJjQ2hlY2tib3ggZnJvbSAncmMtY2hlY2tib3gnO1xuaW1wb3J0IHsgY29tcG9zZVJlZiB9IGZyb20gXCJyYy11dGlsL2VzL3JlZlwiO1xuaW1wb3J0IHsgZGV2VXNlV2FybmluZyB9IGZyb20gJy4uL191dGlsL3dhcm5pbmcnO1xuaW1wb3J0IFdhdmUgZnJvbSAnLi4vX3V0aWwvd2F2ZSc7XG5pbXBvcnQgeyBUQVJHRVRfQ0xTIH0gZnJvbSAnLi4vX3V0aWwvd2F2ZS9pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgRGlzYWJsZWRDb250ZXh0IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlci9EaXNhYmxlZENvbnRleHQnO1xuaW1wb3J0IHVzZUNTU1ZhckNscyBmcm9tICcuLi9jb25maWctcHJvdmlkZXIvaG9va3MvdXNlQ1NTVmFyQ2xzJztcbmltcG9ydCB7IEZvcm1JdGVtSW5wdXRDb250ZXh0IH0gZnJvbSAnLi4vZm9ybS9jb250ZXh0JztcbmltcG9ydCBHcm91cENvbnRleHQgZnJvbSAnLi9Hcm91cENvbnRleHQnO1xuaW1wb3J0IHVzZVN0eWxlIGZyb20gJy4vc3R5bGUnO1xuaW1wb3J0IHVzZUJ1YmJsZUxvY2sgZnJvbSAnLi91c2VCdWJibGVMb2NrJztcbmNvbnN0IEludGVybmFsQ2hlY2tib3ggPSAocHJvcHMsIHJlZikgPT4ge1xuICB2YXIgX2E7XG4gIGNvbnN0IHtcbiAgICAgIHByZWZpeENsczogY3VzdG9taXplUHJlZml4Q2xzLFxuICAgICAgY2xhc3NOYW1lLFxuICAgICAgcm9vdENsYXNzTmFtZSxcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgaW5kZXRlcm1pbmF0ZSA9IGZhbHNlLFxuICAgICAgc3R5bGUsXG4gICAgICBvbk1vdXNlRW50ZXIsXG4gICAgICBvbk1vdXNlTGVhdmUsXG4gICAgICBza2lwR3JvdXAgPSBmYWxzZSxcbiAgICAgIGRpc2FibGVkXG4gICAgfSA9IHByb3BzLFxuICAgIHJlc3RQcm9wcyA9IF9fcmVzdChwcm9wcywgW1wicHJlZml4Q2xzXCIsIFwiY2xhc3NOYW1lXCIsIFwicm9vdENsYXNzTmFtZVwiLCBcImNoaWxkcmVuXCIsIFwiaW5kZXRlcm1pbmF0ZVwiLCBcInN0eWxlXCIsIFwib25Nb3VzZUVudGVyXCIsIFwib25Nb3VzZUxlYXZlXCIsIFwic2tpcEdyb3VwXCIsIFwiZGlzYWJsZWRcIl0pO1xuICBjb25zdCB7XG4gICAgZ2V0UHJlZml4Q2xzLFxuICAgIGRpcmVjdGlvbixcbiAgICBjaGVja2JveFxuICB9ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KTtcbiAgY29uc3QgY2hlY2tib3hHcm91cCA9IFJlYWN0LnVzZUNvbnRleHQoR3JvdXBDb250ZXh0KTtcbiAgY29uc3Qge1xuICAgIGlzRm9ybUl0ZW1JbnB1dFxuICB9ID0gUmVhY3QudXNlQ29udGV4dChGb3JtSXRlbUlucHV0Q29udGV4dCk7XG4gIGNvbnN0IGNvbnRleHREaXNhYmxlZCA9IFJlYWN0LnVzZUNvbnRleHQoRGlzYWJsZWRDb250ZXh0KTtcbiAgY29uc3QgbWVyZ2VkRGlzYWJsZWQgPSAoX2EgPSAoY2hlY2tib3hHcm91cCA9PT0gbnVsbCB8fCBjaGVja2JveEdyb3VwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjaGVja2JveEdyb3VwLmRpc2FibGVkKSB8fCBkaXNhYmxlZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogY29udGV4dERpc2FibGVkO1xuICBjb25zdCBwcmV2VmFsdWUgPSBSZWFjdC51c2VSZWYocmVzdFByb3BzLnZhbHVlKTtcbiAgY29uc3QgY2hlY2tib3hSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIGNvbnN0IG1lcmdlZFJlZiA9IGNvbXBvc2VSZWYocmVmLCBjaGVja2JveFJlZik7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgY29uc3Qgd2FybmluZyA9IGRldlVzZVdhcm5pbmcoJ0NoZWNrYm94Jyk7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZygnY2hlY2tlZCcgaW4gcmVzdFByb3BzIHx8ICEhY2hlY2tib3hHcm91cCB8fCAhKCd2YWx1ZScgaW4gcmVzdFByb3BzKSwgJ3VzYWdlJywgJ2B2YWx1ZWAgaXMgbm90IGEgdmFsaWQgcHJvcCwgZG8geW91IG1lYW4gYGNoZWNrZWRgPycpIDogdm9pZCAwO1xuICB9XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY2hlY2tib3hHcm91cCA9PT0gbnVsbCB8fCBjaGVja2JveEdyb3VwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjaGVja2JveEdyb3VwLnJlZ2lzdGVyVmFsdWUocmVzdFByb3BzLnZhbHVlKTtcbiAgfSwgW10pO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChza2lwR3JvdXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHJlc3RQcm9wcy52YWx1ZSAhPT0gcHJldlZhbHVlLmN1cnJlbnQpIHtcbiAgICAgIGNoZWNrYm94R3JvdXAgPT09IG51bGwgfHwgY2hlY2tib3hHcm91cCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2hlY2tib3hHcm91cC5jYW5jZWxWYWx1ZShwcmV2VmFsdWUuY3VycmVudCk7XG4gICAgICBjaGVja2JveEdyb3VwID09PSBudWxsIHx8IGNoZWNrYm94R3JvdXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNoZWNrYm94R3JvdXAucmVnaXN0ZXJWYWx1ZShyZXN0UHJvcHMudmFsdWUpO1xuICAgICAgcHJldlZhbHVlLmN1cnJlbnQgPSByZXN0UHJvcHMudmFsdWU7XG4gICAgfVxuICAgIHJldHVybiAoKSA9PiBjaGVja2JveEdyb3VwID09PSBudWxsIHx8IGNoZWNrYm94R3JvdXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNoZWNrYm94R3JvdXAuY2FuY2VsVmFsdWUocmVzdFByb3BzLnZhbHVlKTtcbiAgfSwgW3Jlc3RQcm9wcy52YWx1ZV0pO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIHZhciBfYTtcbiAgICBpZiAoKF9hID0gY2hlY2tib3hSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmlucHV0KSB7XG4gICAgICBjaGVja2JveFJlZi5jdXJyZW50LmlucHV0LmluZGV0ZXJtaW5hdGUgPSBpbmRldGVybWluYXRlO1xuICAgIH1cbiAgfSwgW2luZGV0ZXJtaW5hdGVdKTtcbiAgY29uc3QgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdjaGVja2JveCcsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIGNvbnN0IHJvb3RDbHMgPSB1c2VDU1NWYXJDbHMocHJlZml4Q2xzKTtcbiAgY29uc3QgW3dyYXBDU1NWYXIsIGhhc2hJZCwgY3NzVmFyQ2xzXSA9IHVzZVN0eWxlKHByZWZpeENscywgcm9vdENscyk7XG4gIGNvbnN0IGNoZWNrYm94UHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCByZXN0UHJvcHMpO1xuICBpZiAoY2hlY2tib3hHcm91cCAmJiAhc2tpcEdyb3VwKSB7XG4gICAgY2hlY2tib3hQcm9wcy5vbkNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChyZXN0UHJvcHMub25DaGFuZ2UpIHtcbiAgICAgICAgcmVzdFByb3BzLm9uQ2hhbmdlLmFwcGx5KHJlc3RQcm9wcywgYXJndW1lbnRzKTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGVja2JveEdyb3VwLnRvZ2dsZU9wdGlvbikge1xuICAgICAgICBjaGVja2JveEdyb3VwLnRvZ2dsZU9wdGlvbih7XG4gICAgICAgICAgbGFiZWw6IGNoaWxkcmVuLFxuICAgICAgICAgIHZhbHVlOiByZXN0UHJvcHMudmFsdWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBjaGVja2JveFByb3BzLm5hbWUgPSBjaGVja2JveEdyb3VwLm5hbWU7XG4gICAgY2hlY2tib3hQcm9wcy5jaGVja2VkID0gY2hlY2tib3hHcm91cC52YWx1ZS5pbmNsdWRlcyhyZXN0UHJvcHMudmFsdWUpO1xuICB9XG4gIGNvbnN0IGNsYXNzU3RyaW5nID0gY2xhc3NOYW1lcyhgJHtwcmVmaXhDbHN9LXdyYXBwZXJgLCB7XG4gICAgW2Ake3ByZWZpeENsc30tcnRsYF06IGRpcmVjdGlvbiA9PT0gJ3J0bCcsXG4gICAgW2Ake3ByZWZpeENsc30td3JhcHBlci1jaGVja2VkYF06IGNoZWNrYm94UHJvcHMuY2hlY2tlZCxcbiAgICBbYCR7cHJlZml4Q2xzfS13cmFwcGVyLWRpc2FibGVkYF06IG1lcmdlZERpc2FibGVkLFxuICAgIFtgJHtwcmVmaXhDbHN9LXdyYXBwZXItaW4tZm9ybS1pdGVtYF06IGlzRm9ybUl0ZW1JbnB1dFxuICB9LCBjaGVja2JveCA9PT0gbnVsbCB8fCBjaGVja2JveCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2hlY2tib3guY2xhc3NOYW1lLCBjbGFzc05hbWUsIHJvb3RDbGFzc05hbWUsIGNzc1ZhckNscywgcm9vdENscywgaGFzaElkKTtcbiAgY29uc3QgY2hlY2tib3hDbGFzcyA9IGNsYXNzTmFtZXMoe1xuICAgIFtgJHtwcmVmaXhDbHN9LWluZGV0ZXJtaW5hdGVgXTogaW5kZXRlcm1pbmF0ZVxuICB9LCBUQVJHRVRfQ0xTLCBoYXNoSWQpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IEV2ZW50IExvY2sgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBbb25MYWJlbENsaWNrLCBvbklucHV0Q2xpY2tdID0gdXNlQnViYmxlTG9jayhjaGVja2JveFByb3BzLm9uQ2xpY2spO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICByZXR1cm4gd3JhcENTU1ZhcigvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChXYXZlLCB7XG4gICAgY29tcG9uZW50OiBcIkNoZWNrYm94XCIsXG4gICAgZGlzYWJsZWQ6IG1lcmdlZERpc2FibGVkXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwibGFiZWxcIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NTdHJpbmcsXG4gICAgc3R5bGU6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY2hlY2tib3ggPT09IG51bGwgfHwgY2hlY2tib3ggPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNoZWNrYm94LnN0eWxlKSwgc3R5bGUpLFxuICAgIG9uTW91c2VFbnRlcjogb25Nb3VzZUVudGVyLFxuICAgIG9uTW91c2VMZWF2ZTogb25Nb3VzZUxlYXZlLFxuICAgIG9uQ2xpY2s6IG9uTGFiZWxDbGlja1xuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSY0NoZWNrYm94LCBPYmplY3QuYXNzaWduKHt9LCBjaGVja2JveFByb3BzLCB7XG4gICAgb25DbGljazogb25JbnB1dENsaWNrLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZTogY2hlY2tib3hDbGFzcyxcbiAgICBkaXNhYmxlZDogbWVyZ2VkRGlzYWJsZWQsXG4gICAgcmVmOiBtZXJnZWRSZWZcbiAgfSkpLCBjaGlsZHJlbiAhPT0gdW5kZWZpbmVkICYmIGNoaWxkcmVuICE9PSBudWxsICYmICgvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogYCR7cHJlZml4Q2xzfS1sYWJlbGBcbiAgfSwgY2hpbGRyZW4pKSkpKTtcbn07XG5jb25zdCBDaGVja2JveCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKEludGVybmFsQ2hlY2tib3gpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgQ2hlY2tib3guZGlzcGxheU5hbWUgPSAnQ2hlY2tib3gnO1xufVxuZXhwb3J0IGRlZmF1bHQgQ2hlY2tib3g7IiwgImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5jb25zdCBHcm91cENvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmV4cG9ydCBkZWZhdWx0IEdyb3VwQ29udGV4dDsiLCAiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgb21pdCBmcm9tIFwicmMtdXRpbC9lcy9vbWl0XCI7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCB1c2VDU1NWYXJDbHMgZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL2hvb2tzL3VzZUNTU1ZhckNscyc7XG5pbXBvcnQgQ2hlY2tib3ggZnJvbSAnLi9DaGVja2JveCc7XG5pbXBvcnQgR3JvdXBDb250ZXh0IGZyb20gJy4vR3JvdXBDb250ZXh0JztcbmltcG9ydCB1c2VTdHlsZSBmcm9tICcuL3N0eWxlJztcbmNvbnN0IENoZWNrYm94R3JvdXAgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIHJlZikgPT4ge1xuICBjb25zdCB7XG4gICAgICBkZWZhdWx0VmFsdWUsXG4gICAgICBjaGlsZHJlbixcbiAgICAgIG9wdGlvbnMgPSBbXSxcbiAgICAgIHByZWZpeENsczogY3VzdG9taXplUHJlZml4Q2xzLFxuICAgICAgY2xhc3NOYW1lLFxuICAgICAgcm9vdENsYXNzTmFtZSxcbiAgICAgIHN0eWxlLFxuICAgICAgb25DaGFuZ2VcbiAgICB9ID0gcHJvcHMsXG4gICAgcmVzdFByb3BzID0gX19yZXN0KHByb3BzLCBbXCJkZWZhdWx0VmFsdWVcIiwgXCJjaGlsZHJlblwiLCBcIm9wdGlvbnNcIiwgXCJwcmVmaXhDbHNcIiwgXCJjbGFzc05hbWVcIiwgXCJyb290Q2xhc3NOYW1lXCIsIFwic3R5bGVcIiwgXCJvbkNoYW5nZVwiXSk7XG4gIGNvbnN0IHtcbiAgICBnZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uXG4gIH0gPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpO1xuICBjb25zdCBbdmFsdWUsIHNldFZhbHVlXSA9IFJlYWN0LnVzZVN0YXRlKHJlc3RQcm9wcy52YWx1ZSB8fCBkZWZhdWx0VmFsdWUgfHwgW10pO1xuICBjb25zdCBbcmVnaXN0ZXJlZFZhbHVlcywgc2V0UmVnaXN0ZXJlZFZhbHVlc10gPSBSZWFjdC51c2VTdGF0ZShbXSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCd2YWx1ZScgaW4gcmVzdFByb3BzKSB7XG4gICAgICBzZXRWYWx1ZShyZXN0UHJvcHMudmFsdWUgfHwgW10pO1xuICAgIH1cbiAgfSwgW3Jlc3RQcm9wcy52YWx1ZV0pO1xuICBjb25zdCBtZW1vaXplZE9wdGlvbnMgPSBSZWFjdC51c2VNZW1vKCgpID0+IG9wdGlvbnMubWFwKG9wdGlvbiA9PiB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBvcHRpb24gPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsYWJlbDogb3B0aW9uLFxuICAgICAgICB2YWx1ZTogb3B0aW9uXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gb3B0aW9uO1xuICB9KSwgW29wdGlvbnNdKTtcbiAgY29uc3QgY2FuY2VsVmFsdWUgPSB2YWwgPT4ge1xuICAgIHNldFJlZ2lzdGVyZWRWYWx1ZXMocHJldlZhbHVlcyA9PiBwcmV2VmFsdWVzLmZpbHRlcih2ID0+IHYgIT09IHZhbCkpO1xuICB9O1xuICBjb25zdCByZWdpc3RlclZhbHVlID0gdmFsID0+IHtcbiAgICBzZXRSZWdpc3RlcmVkVmFsdWVzKHByZXZWYWx1ZXMgPT4gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShwcmV2VmFsdWVzKSwgW3ZhbF0pKTtcbiAgfTtcbiAgY29uc3QgdG9nZ2xlT3B0aW9uID0gb3B0aW9uID0+IHtcbiAgICBjb25zdCBvcHRpb25JbmRleCA9IHZhbHVlLmluZGV4T2Yob3B0aW9uLnZhbHVlKTtcbiAgICBjb25zdCBuZXdWYWx1ZSA9IF90b0NvbnN1bWFibGVBcnJheSh2YWx1ZSk7XG4gICAgaWYgKG9wdGlvbkluZGV4ID09PSAtMSkge1xuICAgICAgbmV3VmFsdWUucHVzaChvcHRpb24udmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdWYWx1ZS5zcGxpY2Uob3B0aW9uSW5kZXgsIDEpO1xuICAgIH1cbiAgICBpZiAoISgndmFsdWUnIGluIHJlc3RQcm9wcykpIHtcbiAgICAgIHNldFZhbHVlKG5ld1ZhbHVlKTtcbiAgICB9XG4gICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5ld1ZhbHVlLmZpbHRlcih2YWwgPT4gcmVnaXN0ZXJlZFZhbHVlcy5pbmNsdWRlcyh2YWwpKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBpbmRleEEgPSBtZW1vaXplZE9wdGlvbnMuZmluZEluZGV4KG9wdCA9PiBvcHQudmFsdWUgPT09IGEpO1xuICAgICAgY29uc3QgaW5kZXhCID0gbWVtb2l6ZWRPcHRpb25zLmZpbmRJbmRleChvcHQgPT4gb3B0LnZhbHVlID09PSBiKTtcbiAgICAgIHJldHVybiBpbmRleEEgLSBpbmRleEI7XG4gICAgfSkpO1xuICB9O1xuICBjb25zdCBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2NoZWNrYm94JywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgY29uc3QgZ3JvdXBQcmVmaXhDbHMgPSBgJHtwcmVmaXhDbHN9LWdyb3VwYDtcbiAgY29uc3Qgcm9vdENscyA9IHVzZUNTU1ZhckNscyhwcmVmaXhDbHMpO1xuICBjb25zdCBbd3JhcENTU1ZhciwgaGFzaElkLCBjc3NWYXJDbHNdID0gdXNlU3R5bGUocHJlZml4Q2xzLCByb290Q2xzKTtcbiAgY29uc3QgZG9tUHJvcHMgPSBvbWl0KHJlc3RQcm9wcywgWyd2YWx1ZScsICdkaXNhYmxlZCddKTtcbiAgY29uc3QgY2hpbGRyZW5Ob2RlID0gb3B0aW9ucy5sZW5ndGggPyBtZW1vaXplZE9wdGlvbnMubWFwKG9wdGlvbiA9PiAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hlY2tib3gsIHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBrZXk6IG9wdGlvbi52YWx1ZS50b1N0cmluZygpLFxuICAgIGRpc2FibGVkOiAnZGlzYWJsZWQnIGluIG9wdGlvbiA/IG9wdGlvbi5kaXNhYmxlZCA6IHJlc3RQcm9wcy5kaXNhYmxlZCxcbiAgICB2YWx1ZTogb3B0aW9uLnZhbHVlLFxuICAgIGNoZWNrZWQ6IHZhbHVlLmluY2x1ZGVzKG9wdGlvbi52YWx1ZSksXG4gICAgb25DaGFuZ2U6IG9wdGlvbi5vbkNoYW5nZSxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoYCR7Z3JvdXBQcmVmaXhDbHN9LWl0ZW1gLCBvcHRpb24uY2xhc3NOYW1lKSxcbiAgICBzdHlsZTogb3B0aW9uLnN0eWxlLFxuICAgIHRpdGxlOiBvcHRpb24udGl0bGUsXG4gICAgaWQ6IG9wdGlvbi5pZCxcbiAgICByZXF1aXJlZDogb3B0aW9uLnJlcXVpcmVkXG4gIH0sIG9wdGlvbi5sYWJlbCkpKSA6IGNoaWxkcmVuO1xuICBjb25zdCBtZW1vaXplZENvbnRleHQgPSBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgdG9nZ2xlT3B0aW9uLFxuICAgIHZhbHVlLFxuICAgIGRpc2FibGVkOiByZXN0UHJvcHMuZGlzYWJsZWQsXG4gICAgbmFtZTogcmVzdFByb3BzLm5hbWUsXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMTYzNzZcbiAgICByZWdpc3RlclZhbHVlLFxuICAgIGNhbmNlbFZhbHVlXG4gIH0pLCBbdG9nZ2xlT3B0aW9uLCB2YWx1ZSwgcmVzdFByb3BzLmRpc2FibGVkLCByZXN0UHJvcHMubmFtZSwgcmVnaXN0ZXJWYWx1ZSwgY2FuY2VsVmFsdWVdKTtcbiAgY29uc3QgY2xhc3NTdHJpbmcgPSBjbGFzc05hbWVzKGdyb3VwUHJlZml4Q2xzLCB7XG4gICAgW2Ake2dyb3VwUHJlZml4Q2xzfS1ydGxgXTogZGlyZWN0aW9uID09PSAncnRsJ1xuICB9LCBjbGFzc05hbWUsIHJvb3RDbGFzc05hbWUsIGNzc1ZhckNscywgcm9vdENscywgaGFzaElkKTtcbiAgcmV0dXJuIHdyYXBDU1NWYXIoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgT2JqZWN0LmFzc2lnbih7XG4gICAgY2xhc3NOYW1lOiBjbGFzc1N0cmluZyxcbiAgICBzdHlsZTogc3R5bGVcbiAgfSwgZG9tUHJvcHMsIHtcbiAgICByZWY6IHJlZlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoR3JvdXBDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IG1lbW9pemVkQ29udGV4dFxuICB9LCBjaGlsZHJlbk5vZGUpKSk7XG59KTtcbmV4cG9ydCB7IEdyb3VwQ29udGV4dCB9O1xuZXhwb3J0IGRlZmF1bHQgQ2hlY2tib3hHcm91cDsiLCAiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCBJbnRlcm5hbENoZWNrYm94IGZyb20gJy4vQ2hlY2tib3gnO1xuaW1wb3J0IEdyb3VwIGZyb20gJy4vR3JvdXAnO1xuY29uc3QgQ2hlY2tib3ggPSBJbnRlcm5hbENoZWNrYm94O1xuQ2hlY2tib3guR3JvdXAgPSBHcm91cDtcbkNoZWNrYm94Ll9fQU5UX0NIRUNLQk9YID0gdHJ1ZTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIENoZWNrYm94LmRpc3BsYXlOYW1lID0gJ0NoZWNrYm94Jztcbn1cbmV4cG9ydCBkZWZhdWx0IENoZWNrYm94OyIsICJcInVzZSBjbGllbnRcIjtcblxudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBEb3duT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0Rvd25PdXRsaW5lZFwiO1xuaW1wb3J0IFVwT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL1VwT3V0bGluZWRcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFJjSW5wdXROdW1iZXIgZnJvbSAncmMtaW5wdXQtbnVtYmVyJztcbmltcG9ydCBDb250ZXh0SXNvbGF0b3IgZnJvbSAnLi4vX3V0aWwvQ29udGV4dElzb2xhdG9yJztcbmltcG9ydCB7IGdldE1lcmdlZFN0YXR1cywgZ2V0U3RhdHVzQ2xhc3NOYW1lcyB9IGZyb20gJy4uL191dGlsL3N0YXR1c1V0aWxzJztcbmltcG9ydCB7IGRldlVzZVdhcm5pbmcgfSBmcm9tICcuLi9fdXRpbC93YXJuaW5nJztcbmltcG9ydCBDb25maWdQcm92aWRlciwgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCBEaXNhYmxlZENvbnRleHQgZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL0Rpc2FibGVkQ29udGV4dCc7XG5pbXBvcnQgdXNlQ1NTVmFyQ2xzIGZyb20gJy4uL2NvbmZpZy1wcm92aWRlci9ob29rcy91c2VDU1NWYXJDbHMnO1xuaW1wb3J0IHVzZVNpemUgZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL2hvb2tzL3VzZVNpemUnO1xuaW1wb3J0IHsgRm9ybUl0ZW1JbnB1dENvbnRleHQgfSBmcm9tICcuLi9mb3JtL2NvbnRleHQnO1xuaW1wb3J0IHVzZVZhcmlhbnQgZnJvbSAnLi4vZm9ybS9ob29rcy91c2VWYXJpYW50cyc7XG5pbXBvcnQgeyB1c2VDb21wYWN0SXRlbUNvbnRleHQgfSBmcm9tICcuLi9zcGFjZS9Db21wYWN0JztcbmltcG9ydCB1c2VTdHlsZSBmcm9tICcuL3N0eWxlJztcbmNvbnN0IElucHV0TnVtYmVyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHByb3BzLCByZWYpID0+IHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBjb25zdCB0eXBlV2FybmluZyA9IGRldlVzZVdhcm5pbmcoJ0lucHV0TnVtYmVyJyk7XG4gICAgdHlwZVdhcm5pbmcuZGVwcmVjYXRlZCghKCdib3JkZXJlZCcgaW4gcHJvcHMpLCAnYm9yZGVyZWQnLCAndmFyaWFudCcpO1xuICAgIHR5cGVXYXJuaW5nKCEocHJvcHMudHlwZSA9PT0gJ251bWJlcicgJiYgcHJvcHMuY2hhbmdlT25XaGVlbCksICd1c2FnZScsICdXaGVuIGB0eXBlPW51bWJlcmAgaXMgdXNlZCB0b2dldGhlciB3aXRoIGBjaGFuZ2VPbldoZWVsYCwgY2hhbmdlT25XaGVlbCBtYXkgbm90IHdvcmsgcHJvcGVybHkuIFBsZWFzZSBkZWxldGUgYHR5cGU9bnVtYmVyYCBpZiBpdCBpcyBub3QgbmVjZXNzYXJ5LicpO1xuICB9XG4gIGNvbnN0IHtcbiAgICBnZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uXG4gIH0gPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpO1xuICBjb25zdCBpbnB1dFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgUmVhY3QudXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsICgpID0+IGlucHV0UmVmLmN1cnJlbnQpO1xuICBjb25zdCB7XG4gICAgICBjbGFzc05hbWUsXG4gICAgICByb290Q2xhc3NOYW1lLFxuICAgICAgc2l6ZTogY3VzdG9taXplU2l6ZSxcbiAgICAgIGRpc2FibGVkOiBjdXN0b21EaXNhYmxlZCxcbiAgICAgIHByZWZpeENsczogY3VzdG9taXplUHJlZml4Q2xzLFxuICAgICAgYWRkb25CZWZvcmUsXG4gICAgICBhZGRvbkFmdGVyLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgYm9yZGVyZWQsXG4gICAgICByZWFkT25seSxcbiAgICAgIHN0YXR1czogY3VzdG9tU3RhdHVzLFxuICAgICAgY29udHJvbHMsXG4gICAgICB2YXJpYW50OiBjdXN0b21WYXJpYW50XG4gICAgfSA9IHByb3BzLFxuICAgIG90aGVycyA9IF9fcmVzdChwcm9wcywgW1wiY2xhc3NOYW1lXCIsIFwicm9vdENsYXNzTmFtZVwiLCBcInNpemVcIiwgXCJkaXNhYmxlZFwiLCBcInByZWZpeENsc1wiLCBcImFkZG9uQmVmb3JlXCIsIFwiYWRkb25BZnRlclwiLCBcInByZWZpeFwiLCBcInN1ZmZpeFwiLCBcImJvcmRlcmVkXCIsIFwicmVhZE9ubHlcIiwgXCJzdGF0dXNcIiwgXCJjb250cm9sc1wiLCBcInZhcmlhbnRcIl0pO1xuICBjb25zdCBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2lucHV0LW51bWJlcicsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIC8vIFN0eWxlXG4gIGNvbnN0IHJvb3RDbHMgPSB1c2VDU1NWYXJDbHMocHJlZml4Q2xzKTtcbiAgY29uc3QgW3dyYXBDU1NWYXIsIGhhc2hJZCwgY3NzVmFyQ2xzXSA9IHVzZVN0eWxlKHByZWZpeENscywgcm9vdENscyk7XG4gIGNvbnN0IHtcbiAgICBjb21wYWN0U2l6ZSxcbiAgICBjb21wYWN0SXRlbUNsYXNzbmFtZXNcbiAgfSA9IHVzZUNvbXBhY3RJdGVtQ29udGV4dChwcmVmaXhDbHMsIGRpcmVjdGlvbik7XG4gIGxldCB1cEljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChVcE91dGxpbmVkLCB7XG4gICAgY2xhc3NOYW1lOiBgJHtwcmVmaXhDbHN9LWhhbmRsZXItdXAtaW5uZXJgXG4gIH0pO1xuICBsZXQgZG93bkljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEb3duT3V0bGluZWQsIHtcbiAgICBjbGFzc05hbWU6IGAke3ByZWZpeENsc30taGFuZGxlci1kb3duLWlubmVyYFxuICB9KTtcbiAgY29uc3QgY29udHJvbHNUZW1wID0gdHlwZW9mIGNvbnRyb2xzID09PSAnYm9vbGVhbicgPyBjb250cm9scyA6IHVuZGVmaW5lZDtcbiAgaWYgKHR5cGVvZiBjb250cm9scyA9PT0gJ29iamVjdCcpIHtcbiAgICB1cEljb24gPSB0eXBlb2YgY29udHJvbHMudXBJY29uID09PSAndW5kZWZpbmVkJyA/IHVwSWNvbiA6ICgvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBgJHtwcmVmaXhDbHN9LWhhbmRsZXItdXAtaW5uZXJgXG4gICAgfSwgY29udHJvbHMudXBJY29uKSk7XG4gICAgZG93bkljb24gPSB0eXBlb2YgY29udHJvbHMuZG93bkljb24gPT09ICd1bmRlZmluZWQnID8gZG93bkljb24gOiAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogYCR7cHJlZml4Q2xzfS1oYW5kbGVyLWRvd24taW5uZXJgXG4gICAgfSwgY29udHJvbHMuZG93bkljb24pKTtcbiAgfVxuICBjb25zdCB7XG4gICAgaGFzRmVlZGJhY2ssXG4gICAgc3RhdHVzOiBjb250ZXh0U3RhdHVzLFxuICAgIGlzRm9ybUl0ZW1JbnB1dCxcbiAgICBmZWVkYmFja0ljb25cbiAgfSA9IFJlYWN0LnVzZUNvbnRleHQoRm9ybUl0ZW1JbnB1dENvbnRleHQpO1xuICBjb25zdCBtZXJnZWRTdGF0dXMgPSBnZXRNZXJnZWRTdGF0dXMoY29udGV4dFN0YXR1cywgY3VzdG9tU3RhdHVzKTtcbiAgY29uc3QgbWVyZ2VkU2l6ZSA9IHVzZVNpemUoY3R4ID0+IHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIChfYSA9IGN1c3RvbWl6ZVNpemUgIT09IG51bGwgJiYgY3VzdG9taXplU2l6ZSAhPT0gdm9pZCAwID8gY3VzdG9taXplU2l6ZSA6IGNvbXBhY3RTaXplKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBjdHg7XG4gIH0pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gRGlzYWJsZWQgPT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IGRpc2FibGVkID0gUmVhY3QudXNlQ29udGV4dChEaXNhYmxlZENvbnRleHQpO1xuICBjb25zdCBtZXJnZWREaXNhYmxlZCA9IGN1c3RvbURpc2FibGVkICE9PSBudWxsICYmIGN1c3RvbURpc2FibGVkICE9PSB2b2lkIDAgPyBjdXN0b21EaXNhYmxlZCA6IGRpc2FibGVkO1xuICBjb25zdCBbdmFyaWFudCwgZW5hYmxlVmFyaWFudENsc10gPSB1c2VWYXJpYW50KCdpbnB1dE51bWJlcicsIGN1c3RvbVZhcmlhbnQsIGJvcmRlcmVkKTtcbiAgY29uc3Qgc3VmZml4Tm9kZSA9IGhhc0ZlZWRiYWNrICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBmZWVkYmFja0ljb24pO1xuICBjb25zdCBpbnB1dE51bWJlckNsYXNzID0gY2xhc3NOYW1lcyh7XG4gICAgW2Ake3ByZWZpeENsc30tbGdgXTogbWVyZ2VkU2l6ZSA9PT0gJ2xhcmdlJyxcbiAgICBbYCR7cHJlZml4Q2xzfS1zbWBdOiBtZXJnZWRTaXplID09PSAnc21hbGwnLFxuICAgIFtgJHtwcmVmaXhDbHN9LXJ0bGBdOiBkaXJlY3Rpb24gPT09ICdydGwnLFxuICAgIFtgJHtwcmVmaXhDbHN9LWluLWZvcm0taXRlbWBdOiBpc0Zvcm1JdGVtSW5wdXRcbiAgfSwgaGFzaElkKTtcbiAgY29uc3Qgd3JhcHBlckNsYXNzTmFtZSA9IGAke3ByZWZpeENsc30tZ3JvdXBgO1xuICBjb25zdCBlbGVtZW50ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmNJbnB1dE51bWJlciwgT2JqZWN0LmFzc2lnbih7XG4gICAgcmVmOiBpbnB1dFJlZixcbiAgICBkaXNhYmxlZDogbWVyZ2VkRGlzYWJsZWQsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNzc1ZhckNscywgcm9vdENscywgY2xhc3NOYW1lLCByb290Q2xhc3NOYW1lLCBjb21wYWN0SXRlbUNsYXNzbmFtZXMpLFxuICAgIHVwSGFuZGxlcjogdXBJY29uLFxuICAgIGRvd25IYW5kbGVyOiBkb3duSWNvbixcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICByZWFkT25seTogcmVhZE9ubHksXG4gICAgY29udHJvbHM6IGNvbnRyb2xzVGVtcCxcbiAgICBwcmVmaXg6IHByZWZpeCxcbiAgICBzdWZmaXg6IHN1ZmZpeE5vZGUgfHwgc3VmZml4LFxuICAgIGFkZG9uQmVmb3JlOiBhZGRvbkJlZm9yZSAmJiAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29udGV4dElzb2xhdG9yLCB7XG4gICAgICBmb3JtOiB0cnVlLFxuICAgICAgc3BhY2U6IHRydWVcbiAgICB9LCBhZGRvbkJlZm9yZSkpLFxuICAgIGFkZG9uQWZ0ZXI6IGFkZG9uQWZ0ZXIgJiYgKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbnRleHRJc29sYXRvciwge1xuICAgICAgZm9ybTogdHJ1ZSxcbiAgICAgIHNwYWNlOiB0cnVlXG4gICAgfSwgYWRkb25BZnRlcikpLFxuICAgIGNsYXNzTmFtZXM6IHtcbiAgICAgIGlucHV0OiBpbnB1dE51bWJlckNsYXNzLFxuICAgICAgdmFyaWFudDogY2xhc3NOYW1lcyh7XG4gICAgICAgIFtgJHtwcmVmaXhDbHN9LSR7dmFyaWFudH1gXTogZW5hYmxlVmFyaWFudENsc1xuICAgICAgfSwgZ2V0U3RhdHVzQ2xhc3NOYW1lcyhwcmVmaXhDbHMsIG1lcmdlZFN0YXR1cywgaGFzRmVlZGJhY2spKSxcbiAgICAgIGFmZml4V3JhcHBlcjogY2xhc3NOYW1lcyh7XG4gICAgICAgIFtgJHtwcmVmaXhDbHN9LWFmZml4LXdyYXBwZXItc21gXTogbWVyZ2VkU2l6ZSA9PT0gJ3NtYWxsJyxcbiAgICAgICAgW2Ake3ByZWZpeENsc30tYWZmaXgtd3JhcHBlci1sZ2BdOiBtZXJnZWRTaXplID09PSAnbGFyZ2UnLFxuICAgICAgICBbYCR7cHJlZml4Q2xzfS1hZmZpeC13cmFwcGVyLXJ0bGBdOiBkaXJlY3Rpb24gPT09ICdydGwnLFxuICAgICAgICBbYCR7cHJlZml4Q2xzfS1hZmZpeC13cmFwcGVyLXdpdGhvdXQtY29udHJvbHNgXTogY29udHJvbHMgPT09IGZhbHNlIHx8IG1lcmdlZERpc2FibGVkXG4gICAgICB9LCBoYXNoSWQpLFxuICAgICAgd3JhcHBlcjogY2xhc3NOYW1lcyh7XG4gICAgICAgIFtgJHt3cmFwcGVyQ2xhc3NOYW1lfS1ydGxgXTogZGlyZWN0aW9uID09PSAncnRsJ1xuICAgICAgfSwgaGFzaElkKSxcbiAgICAgIGdyb3VwV3JhcHBlcjogY2xhc3NOYW1lcyh7XG4gICAgICAgIFtgJHtwcmVmaXhDbHN9LWdyb3VwLXdyYXBwZXItc21gXTogbWVyZ2VkU2l6ZSA9PT0gJ3NtYWxsJyxcbiAgICAgICAgW2Ake3ByZWZpeENsc30tZ3JvdXAtd3JhcHBlci1sZ2BdOiBtZXJnZWRTaXplID09PSAnbGFyZ2UnLFxuICAgICAgICBbYCR7cHJlZml4Q2xzfS1ncm91cC13cmFwcGVyLXJ0bGBdOiBkaXJlY3Rpb24gPT09ICdydGwnLFxuICAgICAgICBbYCR7cHJlZml4Q2xzfS1ncm91cC13cmFwcGVyLSR7dmFyaWFudH1gXTogZW5hYmxlVmFyaWFudENsc1xuICAgICAgfSwgZ2V0U3RhdHVzQ2xhc3NOYW1lcyhgJHtwcmVmaXhDbHN9LWdyb3VwLXdyYXBwZXJgLCBtZXJnZWRTdGF0dXMsIGhhc0ZlZWRiYWNrKSwgaGFzaElkKVxuICAgIH1cbiAgfSwgb3RoZXJzKSk7XG4gIHJldHVybiB3cmFwQ1NTVmFyKGVsZW1lbnQpO1xufSk7XG5jb25zdCBUeXBlZElucHV0TnVtYmVyID0gSW5wdXROdW1iZXI7XG4vKiogQHByaXZhdGUgSW50ZXJuYWwgQ29tcG9uZW50LiBEbyBub3QgdXNlIGluIHlvdXIgcHJvZHVjdGlvbi4gKi9cbmNvbnN0IFB1cmVJbnB1dE51bWJlciA9IHByb3BzID0+ICgvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb25maWdQcm92aWRlciwge1xuICB0aGVtZToge1xuICAgIGNvbXBvbmVudHM6IHtcbiAgICAgIElucHV0TnVtYmVyOiB7XG4gICAgICAgIGhhbmRsZVZpc2libGU6IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KElucHV0TnVtYmVyLCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcykpKSk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBUeXBlZElucHV0TnVtYmVyLmRpc3BsYXlOYW1lID0gJ0lucHV0TnVtYmVyJztcbn1cblR5cGVkSW5wdXROdW1iZXIuX0ludGVybmFsUGFuZWxEb05vdFVzZU9yWW91V2lsbEJlRmlyZWQgPSBQdXJlSW5wdXROdW1iZXI7XG5leHBvcnQgZGVmYXVsdCBUeXBlZElucHV0TnVtYmVyOyIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBVcE91dGxpbmVkU3ZnIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL1VwT3V0bGluZWRcIjtcbmltcG9ydCBBbnRkSWNvbiBmcm9tIFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiO1xudmFyIFVwT3V0bGluZWQgPSBmdW5jdGlvbiBVcE91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFudGRJY29uLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBVcE91dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5cbi8qKiFbdXBdKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjNhV1IwYUQwaU5UQWlJR2hsYVdkb2REMGlOVEFpSUdacGJHdzlJaU5qWVdOaFkyRWlJSFpwWlhkQ2IzZzlJalkwSURZMElEZzVOaUE0T1RZaUlHWnZZM1Z6WVdKc1pUMGlabUZzYzJVaUlIaHRiRzV6UFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eU1EQXdMM04yWnlJK1BIQmhkR2dnWkQwaVRUZzVNQzQxSURjMU5TNHpURFV6Tnk0NUlESTJPUzR5WXkweE1pNDRMVEUzTGpZdE16a3RNVGN1TmkwMU1TNDNJREJNTVRNekxqVWdOelUxTGpOQk9DQTRJREFnTURBeE5EQWdOelk0YURjMVl6VXVNU0F3SURrdU9TMHlMalVnTVRJdU9TMDJMalpNTlRFeUlETTJPUzQ0YkRJNE5DNHhJRE01TVM0Mll6TWdOQzR4SURjdU9DQTJMallnTVRJdU9TQTJMalpvTnpWak5pNDFJREFnTVRBdU15MDNMalFnTmk0MUxURXlMamQ2SWlBdlBqd3ZjM1puUGc9PSkgKi9cbnZhciBSZWZJY29uID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoVXBPdXRsaW5lZCk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBSZWZJY29uLmRpc3BsYXlOYW1lID0gJ1VwT3V0bGluZWQnO1xufVxuZXhwb3J0IGRlZmF1bHQgUmVmSWNvbjsiLCAiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgVXBPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNODkwLjUgNzU1LjNMNTM3LjkgMjY5LjJjLTEyLjgtMTcuNi0zOS0xNy42LTUxLjcgMEwxMzMuNSA3NTUuM0E4IDggMCAwMDE0MCA3NjhoNzVjNS4xIDAgOS45LTIuNSAxMi45LTYuNkw1MTIgMzY5LjhsMjg0LjEgMzkxLjZjMyA0LjEgNy44IDYuNiAxMi45IDYuNmg3NWM2LjUgMCAxMC4zLTcuNCA2LjUtMTIuN3pcIiB9IH1dIH0sIFwibmFtZVwiOiBcInVwXCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnQgZGVmYXVsdCBVcE91dGxpbmVkO1xuIiwgImV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0QmlnSW50KCkge1xuICByZXR1cm4gdHlwZW9mIEJpZ0ludCA9PT0gJ2Z1bmN0aW9uJztcbn0iLCAiaW1wb3J0IHsgc3VwcG9ydEJpZ0ludCB9IGZyb20gXCIuL3N1cHBvcnRVdGlsXCI7XG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkge1xuICByZXR1cm4gIXZhbHVlICYmIHZhbHVlICE9PSAwICYmICFOdW1iZXIuaXNOYU4odmFsdWUpIHx8ICFTdHJpbmcodmFsdWUpLnRyaW0oKTtcbn1cblxuLyoqXG4gKiBGb3JtYXQgc3RyaW5nIG51bWJlciB0byByZWFkYWJsZSBudW1iZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaW1OdW1iZXIobnVtU3RyKSB7XG4gIHZhciBzdHIgPSBudW1TdHIudHJpbSgpO1xuICB2YXIgbmVnYXRpdmUgPSBzdHIuc3RhcnRzV2l0aCgnLScpO1xuICBpZiAobmVnYXRpdmUpIHtcbiAgICBzdHIgPSBzdHIuc2xpY2UoMSk7XG4gIH1cbiAgc3RyID0gc3RyXG4gIC8vIFJlbW92ZSBkZWNpbWFsIDAuIGAxLjAwMGAgPT4gYDEuYCwgYDEuMTAwYCA9PiBgMS4xYFxuICAucmVwbGFjZSgvKFxcLlxcZCpbXjBdKTAqJC8sICckMScpXG4gIC8vIFJlbW92ZSB1c2VsZXNzIGRlY2ltYWwuIGAxLmAgPT4gYDFgXG4gIC5yZXBsYWNlKC9cXC4wKiQvLCAnJylcbiAgLy8gUmVtb3ZlIGludGVnZXIgMC4gYDAwMDFgID0+IGAxYCwgMDAwLjEnID0+IGAuMWBcbiAgLnJlcGxhY2UoL14wKy8sICcnKTtcbiAgaWYgKHN0ci5zdGFydHNXaXRoKCcuJykpIHtcbiAgICBzdHIgPSBcIjBcIi5jb25jYXQoc3RyKTtcbiAgfVxuICB2YXIgdHJpbVN0ciA9IHN0ciB8fCAnMCc7XG4gIHZhciBzcGxpdE51bWJlciA9IHRyaW1TdHIuc3BsaXQoJy4nKTtcbiAgdmFyIGludGVnZXJTdHIgPSBzcGxpdE51bWJlclswXSB8fCAnMCc7XG4gIHZhciBkZWNpbWFsU3RyID0gc3BsaXROdW1iZXJbMV0gfHwgJzAnO1xuICBpZiAoaW50ZWdlclN0ciA9PT0gJzAnICYmIGRlY2ltYWxTdHIgPT09ICcwJykge1xuICAgIG5lZ2F0aXZlID0gZmFsc2U7XG4gIH1cbiAgdmFyIG5lZ2F0aXZlU3RyID0gbmVnYXRpdmUgPyAnLScgOiAnJztcbiAgcmV0dXJuIHtcbiAgICBuZWdhdGl2ZTogbmVnYXRpdmUsXG4gICAgbmVnYXRpdmVTdHI6IG5lZ2F0aXZlU3RyLFxuICAgIHRyaW1TdHI6IHRyaW1TdHIsXG4gICAgaW50ZWdlclN0cjogaW50ZWdlclN0cixcbiAgICBkZWNpbWFsU3RyOiBkZWNpbWFsU3RyLFxuICAgIGZ1bGxTdHI6IFwiXCIuY29uY2F0KG5lZ2F0aXZlU3RyKS5jb25jYXQodHJpbVN0cilcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0UobnVtYmVyKSB7XG4gIHZhciBzdHIgPSBTdHJpbmcobnVtYmVyKTtcbiAgcmV0dXJuICFOdW1iZXIuaXNOYU4oTnVtYmVyKHN0cikpICYmIHN0ci5pbmNsdWRlcygnZScpO1xufVxuXG4vKipcbiAqIFtMZWdhY3ldIENvbnZlcnQgMWUtOSB0byAwLjAwMDAwMDAwMS5cbiAqIFRoaXMgbWF5IGxvc2Ugc29tZSBwcmVjaXNpb24gaWYgdXNlciByZWFsbHkgd2FudCAxZS05LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TnVtYmVyUHJlY2lzaW9uKG51bWJlcikge1xuICB2YXIgbnVtU3RyID0gU3RyaW5nKG51bWJlcik7XG4gIGlmIChpc0UobnVtYmVyKSkge1xuICAgIHZhciBwcmVjaXNpb24gPSBOdW1iZXIobnVtU3RyLnNsaWNlKG51bVN0ci5pbmRleE9mKCdlLScpICsgMikpO1xuICAgIHZhciBkZWNpbWFsTWF0Y2ggPSBudW1TdHIubWF0Y2goL1xcLihcXGQrKS8pO1xuICAgIGlmIChkZWNpbWFsTWF0Y2ggIT09IG51bGwgJiYgZGVjaW1hbE1hdGNoICE9PSB2b2lkIDAgJiYgZGVjaW1hbE1hdGNoWzFdKSB7XG4gICAgICBwcmVjaXNpb24gKz0gZGVjaW1hbE1hdGNoWzFdLmxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIHByZWNpc2lvbjtcbiAgfVxuICByZXR1cm4gbnVtU3RyLmluY2x1ZGVzKCcuJykgJiYgdmFsaWRhdGVOdW1iZXIobnVtU3RyKSA/IG51bVN0ci5sZW5ndGggLSBudW1TdHIuaW5kZXhPZignLicpIC0gMSA6IDA7XG59XG5cbi8qKlxuICogQ29udmVydCBudW1iZXIgKGluY2x1ZGVzIHNjaWVudGlmaWMgbm90YXRpb24pIHRvIC14eHgueXl5IGZvcm1hdFxuICovXG5leHBvcnQgZnVuY3Rpb24gbnVtMnN0cihudW1iZXIpIHtcbiAgdmFyIG51bVN0ciA9IFN0cmluZyhudW1iZXIpO1xuICBpZiAoaXNFKG51bWJlcikpIHtcbiAgICBpZiAobnVtYmVyID4gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgIHJldHVybiBTdHJpbmcoc3VwcG9ydEJpZ0ludCgpID8gQmlnSW50KG51bWJlcikudG9TdHJpbmcoKSA6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKTtcbiAgICB9XG4gICAgaWYgKG51bWJlciA8IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKHN1cHBvcnRCaWdJbnQoKSA/IEJpZ0ludChudW1iZXIpLnRvU3RyaW5nKCkgOiBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUik7XG4gICAgfVxuICAgIG51bVN0ciA9IG51bWJlci50b0ZpeGVkKGdldE51bWJlclByZWNpc2lvbihudW1TdHIpKTtcbiAgfVxuICByZXR1cm4gdHJpbU51bWJlcihudW1TdHIpLmZ1bGxTdHI7XG59XG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVOdW1iZXIobnVtKSB7XG4gIGlmICh0eXBlb2YgbnVtID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiAhTnVtYmVyLmlzTmFOKG51bSk7XG4gIH1cblxuICAvLyBFbXB0eVxuICBpZiAoIW51bSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gKFxuICAgIC8vIE5vcm1hbCB0eXBlOiAxMS4yOFxuICAgIC9eXFxzKi0/XFxkKyhcXC5cXGQrKT9cXHMqJC8udGVzdChudW0pIHx8XG4gICAgLy8gUHJlLW51bWJlcjogMS5cbiAgICAvXlxccyotP1xcZCtcXC5cXHMqJC8udGVzdChudW0pIHx8XG4gICAgLy8gUG9zdC1udW1iZXI6IC4xXG4gICAgL15cXHMqLT9cXC5cXGQrXFxzKiQvLnRlc3QobnVtKVxuICApO1xufSIsICJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgeyBpc0UsIGlzRW1wdHksIG51bTJzdHIsIHRyaW1OdW1iZXIsIHZhbGlkYXRlTnVtYmVyIH0gZnJvbSBcIi4vbnVtYmVyVXRpbFwiO1xudmFyIEJpZ0ludERlY2ltYWwgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAvKiogQmlnSW50IHdpbGwgY29udmVydCBgMDAwOWAgdG8gYDlgLiBXZSBuZWVkIHJlY29yZCB0aGUgbGVuIG9mIGRlY2ltYWwgKi9cblxuICBmdW5jdGlvbiBCaWdJbnREZWNpbWFsKHZhbHVlKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEJpZ0ludERlY2ltYWwpO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm9yaWdpblwiLCAnJyk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwibmVnYXRpdmVcIiwgdm9pZCAwKTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJpbnRlZ2VyXCIsIHZvaWQgMCk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiZGVjaW1hbFwiLCB2b2lkIDApO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImRlY2ltYWxMZW5cIiwgdm9pZCAwKTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJlbXB0eVwiLCB2b2lkIDApO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm5hblwiLCB2b2lkIDApO1xuICAgIGlmIChpc0VtcHR5KHZhbHVlKSkge1xuICAgICAgdGhpcy5lbXB0eSA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMub3JpZ2luID0gU3RyaW5nKHZhbHVlKTtcblxuICAgIC8vIEFjdCBsaWtlIE51bWJlciBjb252ZXJ0XG4gICAgaWYgKHZhbHVlID09PSAnLScgfHwgTnVtYmVyLmlzTmFOKHZhbHVlKSkge1xuICAgICAgdGhpcy5uYW4gPSB0cnVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgbWVyZ2VkVmFsdWUgPSB2YWx1ZTtcblxuICAgIC8vIFdlIG5lZWQgY29udmVydCBiYWNrIHRvIE51bWJlciBzaW5jZSBpdCByZXF1aXJlIGB0b0ZpeGVkYCB0byBoYW5kbGUgdGhpc1xuICAgIGlmIChpc0UobWVyZ2VkVmFsdWUpKSB7XG4gICAgICBtZXJnZWRWYWx1ZSA9IE51bWJlcihtZXJnZWRWYWx1ZSk7XG4gICAgfVxuICAgIG1lcmdlZFZhbHVlID0gdHlwZW9mIG1lcmdlZFZhbHVlID09PSAnc3RyaW5nJyA/IG1lcmdlZFZhbHVlIDogbnVtMnN0cihtZXJnZWRWYWx1ZSk7XG4gICAgaWYgKHZhbGlkYXRlTnVtYmVyKG1lcmdlZFZhbHVlKSkge1xuICAgICAgdmFyIHRyaW1SZXQgPSB0cmltTnVtYmVyKG1lcmdlZFZhbHVlKTtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSB0cmltUmV0Lm5lZ2F0aXZlO1xuICAgICAgdmFyIG51bWJlcnMgPSB0cmltUmV0LnRyaW1TdHIuc3BsaXQoJy4nKTtcbiAgICAgIHRoaXMuaW50ZWdlciA9IEJpZ0ludChudW1iZXJzWzBdKTtcbiAgICAgIHZhciBkZWNpbWFsU3RyID0gbnVtYmVyc1sxXSB8fCAnMCc7XG4gICAgICB0aGlzLmRlY2ltYWwgPSBCaWdJbnQoZGVjaW1hbFN0cik7XG4gICAgICB0aGlzLmRlY2ltYWxMZW4gPSBkZWNpbWFsU3RyLmxlbmd0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5uYW4gPSB0cnVlO1xuICAgIH1cbiAgfVxuICBfY3JlYXRlQ2xhc3MoQmlnSW50RGVjaW1hbCwgW3tcbiAgICBrZXk6IFwiZ2V0TWFya1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRNYXJrKCkge1xuICAgICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgPyAnLScgOiAnJztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0SW50ZWdlclN0clwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRJbnRlZ2VyU3RyKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW50ZWdlci50b1N0cmluZygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlIGdldCBkZWNpbWFsIHN0cmluZ1xuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiBcImdldERlY2ltYWxTdHJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RGVjaW1hbFN0cigpIHtcbiAgICAgIHJldHVybiB0aGlzLmRlY2ltYWwudG9TdHJpbmcoKS5wYWRTdGFydCh0aGlzLmRlY2ltYWxMZW4sICcwJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGUgQWxpZ24gQmlnSW50RGVjaW1hbCB3aXRoIHNhbWUgZGVjaW1hbCBsZW5ndGguIGUuZy4gMTIuMyArIDUgPSAxMjMwMDAwXG4gICAgICogVGhpcyBpcyB1c2VkIGZvciBhZGQgZnVuY3Rpb24gb25seS5cbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogXCJhbGlnbkRlY2ltYWxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWxpZ25EZWNpbWFsKGRlY2ltYWxMZW5ndGgpIHtcbiAgICAgIHZhciBzdHIgPSBcIlwiLmNvbmNhdCh0aGlzLmdldE1hcmsoKSkuY29uY2F0KHRoaXMuZ2V0SW50ZWdlclN0cigpKS5jb25jYXQodGhpcy5nZXREZWNpbWFsU3RyKCkucGFkRW5kKGRlY2ltYWxMZW5ndGgsICcwJykpO1xuICAgICAgcmV0dXJuIEJpZ0ludChzdHIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJuZWdhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbmVnYXRlKCkge1xuICAgICAgdmFyIGNsb25lID0gbmV3IEJpZ0ludERlY2ltYWwodGhpcy50b1N0cmluZygpKTtcbiAgICAgIGNsb25lLm5lZ2F0aXZlID0gIWNsb25lLm5lZ2F0aXZlO1xuICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjYWxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2FsKG9mZnNldCwgY2FsY3VsYXRvciwgY2FsRGVjaW1hbExlbikge1xuICAgICAgdmFyIG1heERlY2ltYWxMZW5ndGggPSBNYXRoLm1heCh0aGlzLmdldERlY2ltYWxTdHIoKS5sZW5ndGgsIG9mZnNldC5nZXREZWNpbWFsU3RyKCkubGVuZ3RoKTtcbiAgICAgIHZhciBteUFsaWduZWREZWNpbWFsID0gdGhpcy5hbGlnbkRlY2ltYWwobWF4RGVjaW1hbExlbmd0aCk7XG4gICAgICB2YXIgb2Zmc2V0QWxpZ25lZERlY2ltYWwgPSBvZmZzZXQuYWxpZ25EZWNpbWFsKG1heERlY2ltYWxMZW5ndGgpO1xuICAgICAgdmFyIHZhbHVlU3RyID0gY2FsY3VsYXRvcihteUFsaWduZWREZWNpbWFsLCBvZmZzZXRBbGlnbmVkRGVjaW1hbCkudG9TdHJpbmcoKTtcbiAgICAgIHZhciBuZXh0RGVjaW1hbExlbmd0aCA9IGNhbERlY2ltYWxMZW4obWF4RGVjaW1hbExlbmd0aCk7XG5cbiAgICAgIC8vIFdlIG5lZWQgZmlsbCBzdHJpbmcgbGVuZ3RoIGJhY2sgdG8gYG1heERlY2ltYWxMZW5ndGhgIHRvIGF2b2lkIHBhcnNlciBmYWlsZWRcbiAgICAgIHZhciBfdHJpbU51bWJlciA9IHRyaW1OdW1iZXIodmFsdWVTdHIpLFxuICAgICAgICBuZWdhdGl2ZVN0ciA9IF90cmltTnVtYmVyLm5lZ2F0aXZlU3RyLFxuICAgICAgICB0cmltU3RyID0gX3RyaW1OdW1iZXIudHJpbVN0cjtcbiAgICAgIHZhciBoeWRyYXRlVmFsdWVTdHIgPSBcIlwiLmNvbmNhdChuZWdhdGl2ZVN0cikuY29uY2F0KHRyaW1TdHIucGFkU3RhcnQobmV4dERlY2ltYWxMZW5ndGggKyAxLCAnMCcpKTtcbiAgICAgIHJldHVybiBuZXcgQmlnSW50RGVjaW1hbChcIlwiLmNvbmNhdChoeWRyYXRlVmFsdWVTdHIuc2xpY2UoMCwgLW5leHREZWNpbWFsTGVuZ3RoKSwgXCIuXCIpLmNvbmNhdChoeWRyYXRlVmFsdWVTdHIuc2xpY2UoLW5leHREZWNpbWFsTGVuZ3RoKSkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhZGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkKHZhbHVlKSB7XG4gICAgICBpZiAodGhpcy5pc0ludmFsaWRhdGUoKSkge1xuICAgICAgICByZXR1cm4gbmV3IEJpZ0ludERlY2ltYWwodmFsdWUpO1xuICAgICAgfVxuICAgICAgdmFyIG9mZnNldCA9IG5ldyBCaWdJbnREZWNpbWFsKHZhbHVlKTtcbiAgICAgIGlmIChvZmZzZXQuaXNJbnZhbGlkYXRlKCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5jYWwob2Zmc2V0LCBmdW5jdGlvbiAobnVtMSwgbnVtMikge1xuICAgICAgICByZXR1cm4gbnVtMSArIG51bTI7XG4gICAgICB9LCBmdW5jdGlvbiAobGVuKSB7XG4gICAgICAgIHJldHVybiBsZW47XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibXVsdGlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbXVsdGkodmFsdWUpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBuZXcgQmlnSW50RGVjaW1hbCh2YWx1ZSk7XG4gICAgICBpZiAodGhpcy5pc0ludmFsaWRhdGUoKSB8fCB0YXJnZXQuaXNJbnZhbGlkYXRlKCkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCaWdJbnREZWNpbWFsKE5hTik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5jYWwodGFyZ2V0LCBmdW5jdGlvbiAobnVtMSwgbnVtMikge1xuICAgICAgICByZXR1cm4gbnVtMSAqIG51bTI7XG4gICAgICB9LCBmdW5jdGlvbiAobGVuKSB7XG4gICAgICAgIHJldHVybiBsZW4gKiAyO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzRW1wdHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNFbXB0eSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmVtcHR5O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc05hTlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc05hTigpIHtcbiAgICAgIHJldHVybiB0aGlzLm5hbjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNJbnZhbGlkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzSW52YWxpZGF0ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzRW1wdHkoKSB8fCB0aGlzLmlzTmFOKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVxdWFsc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlcXVhbHModGFyZ2V0KSB7XG4gICAgICByZXR1cm4gdGhpcy50b1N0cmluZygpID09PSAodGFyZ2V0ID09PSBudWxsIHx8IHRhcmdldCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGFyZ2V0LnRvU3RyaW5nKCkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJsZXNzRXF1YWxzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxlc3NFcXVhbHModGFyZ2V0KSB7XG4gICAgICByZXR1cm4gdGhpcy5hZGQodGFyZ2V0Lm5lZ2F0ZSgpLnRvU3RyaW5nKCkpLnRvTnVtYmVyKCkgPD0gMDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidG9OdW1iZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9OdW1iZXIoKSB7XG4gICAgICBpZiAodGhpcy5pc05hTigpKSB7XG4gICAgICAgIHJldHVybiBOYU47XG4gICAgICB9XG4gICAgICByZXR1cm4gTnVtYmVyKHRoaXMudG9TdHJpbmcoKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRvU3RyaW5nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgdmFyIHNhZmUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRydWU7XG4gICAgICBpZiAoIXNhZmUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaXNJbnZhbGlkYXRlKCkpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRyaW1OdW1iZXIoXCJcIi5jb25jYXQodGhpcy5nZXRNYXJrKCkpLmNvbmNhdCh0aGlzLmdldEludGVnZXJTdHIoKSwgXCIuXCIpLmNvbmNhdCh0aGlzLmdldERlY2ltYWxTdHIoKSkpLmZ1bGxTdHI7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBCaWdJbnREZWNpbWFsO1xufSgpO1xuZXhwb3J0IHsgQmlnSW50RGVjaW1hbCBhcyBkZWZhdWx0IH07IiwgImltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCB7IGdldE51bWJlclByZWNpc2lvbiwgaXNFbXB0eSwgbnVtMnN0ciB9IGZyb20gXCIuL251bWJlclV0aWxcIjtcblxuLyoqXG4gKiBXZSBjYW4gcmVtb3ZlIHRoaXMgd2hlbiBJRSBub3Qgc3VwcG9ydCBhbnltb3JlXG4gKi9cbnZhciBOdW1iZXJEZWNpbWFsID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTnVtYmVyRGVjaW1hbCh2YWx1ZSkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBOdW1iZXJEZWNpbWFsKTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJvcmlnaW5cIiwgJycpO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm51bWJlclwiLCB2b2lkIDApO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImVtcHR5XCIsIHZvaWQgMCk7XG4gICAgaWYgKGlzRW1wdHkodmFsdWUpKSB7XG4gICAgICB0aGlzLmVtcHR5ID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vcmlnaW4gPSBTdHJpbmcodmFsdWUpO1xuICAgIHRoaXMubnVtYmVyID0gTnVtYmVyKHZhbHVlKTtcbiAgfVxuICBfY3JlYXRlQ2xhc3MoTnVtYmVyRGVjaW1hbCwgW3tcbiAgICBrZXk6IFwibmVnYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5lZ2F0ZSgpIHtcbiAgICAgIHJldHVybiBuZXcgTnVtYmVyRGVjaW1hbCgtdGhpcy50b051bWJlcigpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZCh2YWx1ZSkge1xuICAgICAgaWYgKHRoaXMuaXNJbnZhbGlkYXRlKCkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOdW1iZXJEZWNpbWFsKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHZhciB0YXJnZXQgPSBOdW1iZXIodmFsdWUpO1xuICAgICAgaWYgKE51bWJlci5pc05hTih0YXJnZXQpKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgdmFyIG51bWJlciA9IHRoaXMubnVtYmVyICsgdGFyZ2V0O1xuXG4gICAgICAvLyBbTGVnYWN5XSBCYWNrIHRvIHNhZmUgaW50ZWdlclxuICAgICAgaWYgKG51bWJlciA+IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgICAgIHJldHVybiBuZXcgTnVtYmVyRGVjaW1hbChOdW1iZXIuTUFYX1NBRkVfSU5URUdFUik7XG4gICAgICB9XG4gICAgICBpZiAobnVtYmVyIDwgTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOdW1iZXJEZWNpbWFsKE51bWJlci5NSU5fU0FGRV9JTlRFR0VSKTtcbiAgICAgIH1cbiAgICAgIHZhciBtYXhQcmVjaXNpb24gPSBNYXRoLm1heChnZXROdW1iZXJQcmVjaXNpb24odGhpcy5udW1iZXIpLCBnZXROdW1iZXJQcmVjaXNpb24odGFyZ2V0KSk7XG4gICAgICByZXR1cm4gbmV3IE51bWJlckRlY2ltYWwobnVtYmVyLnRvRml4ZWQobWF4UHJlY2lzaW9uKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm11bHRpXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG11bHRpKHZhbHVlKSB7XG4gICAgICB2YXIgdGFyZ2V0ID0gTnVtYmVyKHZhbHVlKTtcbiAgICAgIGlmICh0aGlzLmlzSW52YWxpZGF0ZSgpIHx8IE51bWJlci5pc05hTih0YXJnZXQpKSB7XG4gICAgICAgIHJldHVybiBuZXcgTnVtYmVyRGVjaW1hbChOYU4pO1xuICAgICAgfVxuICAgICAgdmFyIG51bWJlciA9IHRoaXMubnVtYmVyICogdGFyZ2V0O1xuXG4gICAgICAvLyBbTGVnYWN5XSBCYWNrIHRvIHNhZmUgaW50ZWdlclxuICAgICAgaWYgKG51bWJlciA+IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgICAgIHJldHVybiBuZXcgTnVtYmVyRGVjaW1hbChOdW1iZXIuTUFYX1NBRkVfSU5URUdFUik7XG4gICAgICB9XG4gICAgICBpZiAobnVtYmVyIDwgTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOdW1iZXJEZWNpbWFsKE51bWJlci5NSU5fU0FGRV9JTlRFR0VSKTtcbiAgICAgIH1cbiAgICAgIHZhciBtYXhQcmVjaXNpb24gPSBNYXRoLm1heChnZXROdW1iZXJQcmVjaXNpb24odGhpcy5udW1iZXIpLCBnZXROdW1iZXJQcmVjaXNpb24odGFyZ2V0KSk7XG4gICAgICByZXR1cm4gbmV3IE51bWJlckRlY2ltYWwobnVtYmVyLnRvRml4ZWQobWF4UHJlY2lzaW9uKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzRW1wdHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNFbXB0eSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmVtcHR5O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc05hTlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc05hTigpIHtcbiAgICAgIHJldHVybiBOdW1iZXIuaXNOYU4odGhpcy5udW1iZXIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc0ludmFsaWRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNJbnZhbGlkYXRlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNFbXB0eSgpIHx8IHRoaXMuaXNOYU4oKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZXF1YWxzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVxdWFscyh0YXJnZXQpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvTnVtYmVyKCkgPT09ICh0YXJnZXQgPT09IG51bGwgfHwgdGFyZ2V0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0YXJnZXQudG9OdW1iZXIoKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImxlc3NFcXVhbHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbGVzc0VxdWFscyh0YXJnZXQpIHtcbiAgICAgIHJldHVybiB0aGlzLmFkZCh0YXJnZXQubmVnYXRlKCkudG9TdHJpbmcoKSkudG9OdW1iZXIoKSA8PSAwO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0b051bWJlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b051bWJlcigpIHtcbiAgICAgIHJldHVybiB0aGlzLm51bWJlcjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidG9TdHJpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICB2YXIgc2FmZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdHJ1ZTtcbiAgICAgIGlmICghc2FmZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pc0ludmFsaWRhdGUoKSkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVtMnN0cih0aGlzLm51bWJlcik7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBOdW1iZXJEZWNpbWFsO1xufSgpO1xuZXhwb3J0IHsgTnVtYmVyRGVjaW1hbCBhcyBkZWZhdWx0IH07IiwgIi8qIGVzbGludC1kaXNhYmxlIG1heC1jbGFzc2VzLXBlci1maWxlICovXG5cbmltcG9ydCBCaWdJbnREZWNpbWFsIGZyb20gXCIuL0JpZ0ludERlY2ltYWxcIjtcbmltcG9ydCBOdW1iZXJEZWNpbWFsIGZyb20gXCIuL051bWJlckRlY2ltYWxcIjtcbmltcG9ydCB7IHRyaW1OdW1iZXIgfSBmcm9tIFwiLi9udW1iZXJVdGlsXCI7XG5pbXBvcnQgeyBzdXBwb3J0QmlnSW50IH0gZnJvbSBcIi4vc3VwcG9ydFV0aWxcIjtcblxuLy8gU3RpbGwgc3VwcG9ydCBvcmlnaW4gZXhwb3J0XG5leHBvcnQgeyBOdW1iZXJEZWNpbWFsLCBCaWdJbnREZWNpbWFsIH07XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRNaW5pRGVjaW1hbCh2YWx1ZSkge1xuICAvLyBXZSB1c2UgQmlnSW50IGhlcmUuXG4gIC8vIFdpbGwgZmFsbGJhY2sgdG8gTnVtYmVyIGlmIG5vdCBzdXBwb3J0LlxuICBpZiAoc3VwcG9ydEJpZ0ludCgpKSB7XG4gICAgcmV0dXJuIG5ldyBCaWdJbnREZWNpbWFsKHZhbHVlKTtcbiAgfVxuICByZXR1cm4gbmV3IE51bWJlckRlY2ltYWwodmFsdWUpO1xufVxuXG4vKipcbiAqIEFsaWduIHRoZSBsb2dpYyBvZiB0b0ZpeGVkIHRvIGFyb3VuZCBsaWtlIDEuNSA9PiAyLlxuICogSWYgc2V0IGBjdXRPbmx5YCwgd2lsbCBqdXN0IHJlbW92ZSB0aGUgb3ZlciBkZWNpbWFsIHBhcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0ZpeGVkKG51bVN0ciwgc2VwYXJhdG9yU3RyLCBwcmVjaXNpb24pIHtcbiAgdmFyIGN1dE9ubHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IGZhbHNlO1xuICBpZiAobnVtU3RyID09PSAnJykge1xuICAgIHJldHVybiAnJztcbiAgfVxuICB2YXIgX3RyaW1OdW1iZXIgPSB0cmltTnVtYmVyKG51bVN0ciksXG4gICAgbmVnYXRpdmVTdHIgPSBfdHJpbU51bWJlci5uZWdhdGl2ZVN0cixcbiAgICBpbnRlZ2VyU3RyID0gX3RyaW1OdW1iZXIuaW50ZWdlclN0cixcbiAgICBkZWNpbWFsU3RyID0gX3RyaW1OdW1iZXIuZGVjaW1hbFN0cjtcbiAgdmFyIHByZWNpc2lvbkRlY2ltYWxTdHIgPSBcIlwiLmNvbmNhdChzZXBhcmF0b3JTdHIpLmNvbmNhdChkZWNpbWFsU3RyKTtcbiAgdmFyIG51bWJlcldpdGhvdXREZWNpbWFsID0gXCJcIi5jb25jYXQobmVnYXRpdmVTdHIpLmNvbmNhdChpbnRlZ2VyU3RyKTtcbiAgaWYgKHByZWNpc2lvbiA+PSAwKSB7XG4gICAgLy8gV2Ugd2lsbCBnZXQgbGFzdCArIDEgbnVtYmVyIHRvIGNoZWNrIGlmIG5lZWQgYWR2YW5jZWQgbnVtYmVyXG4gICAgdmFyIGFkdmFuY2VkTnVtID0gTnVtYmVyKGRlY2ltYWxTdHJbcHJlY2lzaW9uXSk7XG4gICAgaWYgKGFkdmFuY2VkTnVtID49IDUgJiYgIWN1dE9ubHkpIHtcbiAgICAgIHZhciBhZHZhbmNlZERlY2ltYWwgPSBnZXRNaW5pRGVjaW1hbChudW1TdHIpLmFkZChcIlwiLmNvbmNhdChuZWdhdGl2ZVN0ciwgXCIwLlwiKS5jb25jYXQoJzAnLnJlcGVhdChwcmVjaXNpb24pKS5jb25jYXQoMTAgLSBhZHZhbmNlZE51bSkpO1xuICAgICAgcmV0dXJuIHRvRml4ZWQoYWR2YW5jZWREZWNpbWFsLnRvU3RyaW5nKCksIHNlcGFyYXRvclN0ciwgcHJlY2lzaW9uLCBjdXRPbmx5KTtcbiAgICB9XG4gICAgaWYgKHByZWNpc2lvbiA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bWJlcldpdGhvdXREZWNpbWFsO1xuICAgIH1cbiAgICByZXR1cm4gXCJcIi5jb25jYXQobnVtYmVyV2l0aG91dERlY2ltYWwpLmNvbmNhdChzZXBhcmF0b3JTdHIpLmNvbmNhdChkZWNpbWFsU3RyLnBhZEVuZChwcmVjaXNpb24sICcwJykuc2xpY2UoMCwgcHJlY2lzaW9uKSk7XG4gIH1cbiAgaWYgKHByZWNpc2lvbkRlY2ltYWxTdHIgPT09ICcuMCcpIHtcbiAgICByZXR1cm4gbnVtYmVyV2l0aG91dERlY2ltYWw7XG4gIH1cbiAgcmV0dXJuIFwiXCIuY29uY2F0KG51bWJlcldpdGhvdXREZWNpbWFsKS5jb25jYXQocHJlY2lzaW9uRGVjaW1hbFN0cik7XG59IiwgImltcG9ydCBnZXRNaW5pRGVjaW1hbCBmcm9tIFwiLi9NaW5pRGVjaW1hbFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vTWluaURlY2ltYWxcIjtcbmltcG9ydCB7IHRyaW1OdW1iZXIsIGdldE51bWJlclByZWNpc2lvbiwgbnVtMnN0ciwgdmFsaWRhdGVOdW1iZXIgfSBmcm9tIFwiLi9udW1iZXJVdGlsXCI7XG5leHBvcnQgeyB0cmltTnVtYmVyLCBnZXROdW1iZXJQcmVjaXNpb24sIG51bTJzdHIsIHZhbGlkYXRlTnVtYmVyIH07XG5leHBvcnQgZGVmYXVsdCBnZXRNaW5pRGVjaW1hbDsiLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcInByZWZpeENsc1wiLCBcImNsYXNzTmFtZVwiLCBcInN0eWxlXCIsIFwibWluXCIsIFwibWF4XCIsIFwic3RlcFwiLCBcImRlZmF1bHRWYWx1ZVwiLCBcInZhbHVlXCIsIFwiZGlzYWJsZWRcIiwgXCJyZWFkT25seVwiLCBcInVwSGFuZGxlclwiLCBcImRvd25IYW5kbGVyXCIsIFwia2V5Ym9hcmRcIiwgXCJjaGFuZ2VPbldoZWVsXCIsIFwiY29udHJvbHNcIiwgXCJjbGFzc05hbWVzXCIsIFwic3RyaW5nTW9kZVwiLCBcInBhcnNlclwiLCBcImZvcm1hdHRlclwiLCBcInByZWNpc2lvblwiLCBcImRlY2ltYWxTZXBhcmF0b3JcIiwgXCJvbkNoYW5nZVwiLCBcIm9uSW5wdXRcIiwgXCJvblByZXNzRW50ZXJcIiwgXCJvblN0ZXBcIiwgXCJjaGFuZ2VPbkJsdXJcIiwgXCJkb21SZWZcIl0sXG4gIF9leGNsdWRlZDIgPSBbXCJkaXNhYmxlZFwiLCBcInN0eWxlXCIsIFwicHJlZml4Q2xzXCIsIFwidmFsdWVcIiwgXCJwcmVmaXhcIiwgXCJzdWZmaXhcIiwgXCJhZGRvbkJlZm9yZVwiLCBcImFkZG9uQWZ0ZXJcIiwgXCJjbGFzc05hbWVcIiwgXCJjbGFzc05hbWVzXCJdO1xuaW1wb3J0IGdldE1pbmlEZWNpbWFsLCB7IGdldE51bWJlclByZWNpc2lvbiwgbnVtMnN0ciwgdG9GaXhlZCwgdmFsaWRhdGVOdW1iZXIgfSBmcm9tICdAcmMtY29tcG9uZW50L21pbmktZGVjaW1hbCc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IEJhc2VJbnB1dCB9IGZyb20gJ3JjLWlucHV0JztcbmltcG9ydCB7IHVzZUxheW91dFVwZGF0ZUVmZmVjdCB9IGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZUxheW91dEVmZmVjdFwiO1xuaW1wb3J0IHByb3h5T2JqZWN0IGZyb20gXCJyYy11dGlsL2VzL3Byb3h5T2JqZWN0XCI7XG5pbXBvcnQgeyBjb21wb3NlUmVmIH0gZnJvbSBcInJjLXV0aWwvZXMvcmVmXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlQ3Vyc29yIGZyb20gXCIuL2hvb2tzL3VzZUN1cnNvclwiO1xuaW1wb3J0IFN0ZXBIYW5kbGVyIGZyb20gXCIuL1N0ZXBIYW5kbGVyXCI7XG5pbXBvcnQgeyBnZXREZWN1cGxlU3RlcHMgfSBmcm9tIFwiLi91dGlscy9udW1iZXJVdGlsXCI7XG5pbXBvcnQgeyB0cmlnZ2VyRm9jdXMgfSBmcm9tIFwicmMtaW5wdXQvZXMvdXRpbHMvY29tbW9uVXRpbHNcIjtcbmltcG9ydCB1c2VGcmFtZSBmcm9tIFwiLi9ob29rcy91c2VGcmFtZVwiO1xuLyoqXG4gKiBXZSBzdXBwb3J0IGBzdHJpbmdNb2RlYCB3aGljaCBuZWVkIGhhbmRsZSBjb3JyZWN0IHR5cGUgd2hlbiB1c2VyIGNhbGwgaW4gb25DaGFuZ2VcbiAqIGZvcm1hdCBtYXggb3IgbWluIHZhbHVlXG4gKiAxLiBpZiBpc0ludmFsaWQgcmV0dXJuIG51bGxcbiAqIDIuIGlmIHByZWNpc2lvbiBpcyB1bmRlZmluZWQsIHJldHVybiBkZWNpbWFsXG4gKiAzLiBmb3JtYXQgd2l0aCBwcmVjaXNpb25cbiAqICAgIEkuIGlmIG1heCA+IDAsIHJvdW5kIGRvd24gd2l0aCBwcmVjaXNpb24uIEV4YW1wbGU6IG1heD0gMy41LCBwcmVjaXNpb249MCAgYWZ0ZXJGb3JtYXQ6IDNcbiAqICAgIElJLiBpZiBtYXggPCAwLCByb3VuZCB1cCB3aXRoIHByZWNpc2lvbi4gRXhhbXBsZTogbWF4PSAtMy41LCBwcmVjaXNpb249MCAgYWZ0ZXJGb3JtYXQ6IC00XG4gKiAgICBJSUkuIGlmIG1pbiA+IDAsIHJvdW5kIHVwIHdpdGggcHJlY2lzaW9uLiBFeGFtcGxlOiBtaW49IDMuNSwgcHJlY2lzaW9uPTAgIGFmdGVyRm9ybWF0OiA0XG4gKiAgICBJVi4gaWYgbWluIDwgMCwgcm91bmQgZG93biB3aXRoIHByZWNpc2lvbi4gRXhhbXBsZTogbWF4PSAtMy41LCBwcmVjaXNpb249MCAgYWZ0ZXJGb3JtYXQ6IC0zXG4gKi9cbnZhciBnZXREZWNpbWFsVmFsdWUgPSBmdW5jdGlvbiBnZXREZWNpbWFsVmFsdWUoc3RyaW5nTW9kZSwgZGVjaW1hbFZhbHVlKSB7XG4gIGlmIChzdHJpbmdNb2RlIHx8IGRlY2ltYWxWYWx1ZS5pc0VtcHR5KCkpIHtcbiAgICByZXR1cm4gZGVjaW1hbFZhbHVlLnRvU3RyaW5nKCk7XG4gIH1cbiAgcmV0dXJuIGRlY2ltYWxWYWx1ZS50b051bWJlcigpO1xufTtcbnZhciBnZXREZWNpbWFsSWZWYWxpZGF0ZSA9IGZ1bmN0aW9uIGdldERlY2ltYWxJZlZhbGlkYXRlKHZhbHVlKSB7XG4gIHZhciBkZWNpbWFsID0gZ2V0TWluaURlY2ltYWwodmFsdWUpO1xuICByZXR1cm4gZGVjaW1hbC5pc0ludmFsaWRhdGUoKSA/IG51bGwgOiBkZWNpbWFsO1xufTtcbnZhciBJbnRlcm5hbElucHV0TnVtYmVyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICBtaW4gPSBwcm9wcy5taW4sXG4gICAgbWF4ID0gcHJvcHMubWF4LFxuICAgIF9wcm9wcyRzdGVwID0gcHJvcHMuc3RlcCxcbiAgICBzdGVwID0gX3Byb3BzJHN0ZXAgPT09IHZvaWQgMCA/IDEgOiBfcHJvcHMkc3RlcCxcbiAgICBkZWZhdWx0VmFsdWUgPSBwcm9wcy5kZWZhdWx0VmFsdWUsXG4gICAgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICBkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkLFxuICAgIHJlYWRPbmx5ID0gcHJvcHMucmVhZE9ubHksXG4gICAgdXBIYW5kbGVyID0gcHJvcHMudXBIYW5kbGVyLFxuICAgIGRvd25IYW5kbGVyID0gcHJvcHMuZG93bkhhbmRsZXIsXG4gICAga2V5Ym9hcmQgPSBwcm9wcy5rZXlib2FyZCxcbiAgICBfcHJvcHMkY2hhbmdlT25XaGVlbCA9IHByb3BzLmNoYW5nZU9uV2hlZWwsXG4gICAgY2hhbmdlT25XaGVlbCA9IF9wcm9wcyRjaGFuZ2VPbldoZWVsID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRjaGFuZ2VPbldoZWVsLFxuICAgIF9wcm9wcyRjb250cm9scyA9IHByb3BzLmNvbnRyb2xzLFxuICAgIGNvbnRyb2xzID0gX3Byb3BzJGNvbnRyb2xzID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJGNvbnRyb2xzLFxuICAgIGNsYXNzTmFtZXMgPSBwcm9wcy5jbGFzc05hbWVzLFxuICAgIHN0cmluZ01vZGUgPSBwcm9wcy5zdHJpbmdNb2RlLFxuICAgIHBhcnNlciA9IHByb3BzLnBhcnNlcixcbiAgICBmb3JtYXR0ZXIgPSBwcm9wcy5mb3JtYXR0ZXIsXG4gICAgcHJlY2lzaW9uID0gcHJvcHMucHJlY2lzaW9uLFxuICAgIGRlY2ltYWxTZXBhcmF0b3IgPSBwcm9wcy5kZWNpbWFsU2VwYXJhdG9yLFxuICAgIG9uQ2hhbmdlID0gcHJvcHMub25DaGFuZ2UsXG4gICAgb25JbnB1dCA9IHByb3BzLm9uSW5wdXQsXG4gICAgb25QcmVzc0VudGVyID0gcHJvcHMub25QcmVzc0VudGVyLFxuICAgIG9uU3RlcCA9IHByb3BzLm9uU3RlcCxcbiAgICBfcHJvcHMkY2hhbmdlT25CbHVyID0gcHJvcHMuY2hhbmdlT25CbHVyLFxuICAgIGNoYW5nZU9uQmx1ciA9IF9wcm9wcyRjaGFuZ2VPbkJsdXIgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkY2hhbmdlT25CbHVyLFxuICAgIGRvbVJlZiA9IHByb3BzLmRvbVJlZixcbiAgICBpbnB1dFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBfZXhjbHVkZWQpO1xuICB2YXIgaW5wdXRDbGFzc05hbWUgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWlucHV0XCIpO1xuICB2YXIgaW5wdXRSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShmYWxzZSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgZm9jdXMgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldEZvY3VzID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIHVzZXJUeXBpbmdSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICB2YXIgY29tcG9zaXRpb25SZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICB2YXIgc2hpZnRLZXlSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gVmFsdWUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUmVhbCB2YWx1ZSBjb250cm9sXG4gIHZhciBfUmVhY3QkdXNlU3RhdGUzID0gUmVhY3QudXNlU3RhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGdldE1pbmlEZWNpbWFsKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDAgPyB2YWx1ZSA6IGRlZmF1bHRWYWx1ZSk7XG4gICAgfSksXG4gICAgX1JlYWN0JHVzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTMsIDIpLFxuICAgIGRlY2ltYWxWYWx1ZSA9IF9SZWFjdCR1c2VTdGF0ZTRbMF0sXG4gICAgc2V0RGVjaW1hbFZhbHVlID0gX1JlYWN0JHVzZVN0YXRlNFsxXTtcbiAgZnVuY3Rpb24gc2V0VW5jb250cm9sbGVkRGVjaW1hbFZhbHVlKG5ld0RlY2ltYWwpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgc2V0RGVjaW1hbFZhbHVlKG5ld0RlY2ltYWwpO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT0gUGFyc2VyICYgRm9ybWF0dGVyID09PT09PT09PT09PT09PT09PT09PT1cbiAgLyoqXG4gICAqIGBwcmVjaXNpb25gIGlzIHVzZWQgZm9yIGZvcm1hdHRlciAmIG9uQ2hhbmdlLlxuICAgKiBJdCB3aWxsIGF1dG8gZ2VuZXJhdGUgYnkgYHZhbHVlYCAmIGBzdGVwYC5cbiAgICogQnV0IGl0IHdpbGwgbm90IGJsb2NrIHVzZXIgdHlwaW5nLlxuICAgKlxuICAgKiBOb3RlOiBBdXRvIGdlbmVyYXRlIGBwcmVjaXNpb25gIGlzIHVzZWQgZm9yIGxlZ2FjeSBsb2dpYy5cbiAgICogV2Ugc2hvdWxkIHJlbW92ZSB0aGlzIHNpbmNlIHdlIGFscmVhZHkgc3VwcG9ydCBoaWdoIHByZWNpc2lvbiB3aXRoIEJpZ0ludC5cbiAgICpcbiAgICogQHBhcmFtIG51bWJlciAgUHJvdmlkZSB3aGljaCBudW1iZXIgc2hvdWxkIGNhbGN1bGF0ZSBwcmVjaXNpb25cbiAgICogQHBhcmFtIHVzZXJUeXBpbmcgIENoYW5nZSBieSB1c2VyIHR5cGluZ1xuICAgKi9cbiAgdmFyIGdldFByZWNpc2lvbiA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChudW1TdHIsIHVzZXJUeXBpbmcpIHtcbiAgICBpZiAodXNlclR5cGluZykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHByZWNpc2lvbiA+PSAwKSB7XG4gICAgICByZXR1cm4gcHJlY2lzaW9uO1xuICAgIH1cbiAgICByZXR1cm4gTWF0aC5tYXgoZ2V0TnVtYmVyUHJlY2lzaW9uKG51bVN0ciksIGdldE51bWJlclByZWNpc2lvbihzdGVwKSk7XG4gIH0sIFtwcmVjaXNpb24sIHN0ZXBdKTtcblxuICAvLyA+Pj4gUGFyc2VyXG4gIHZhciBtZXJnZWRQYXJzZXIgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAobnVtKSB7XG4gICAgdmFyIG51bVN0ciA9IFN0cmluZyhudW0pO1xuICAgIGlmIChwYXJzZXIpIHtcbiAgICAgIHJldHVybiBwYXJzZXIobnVtU3RyKTtcbiAgICB9XG4gICAgdmFyIHBhcnNlZFN0ciA9IG51bVN0cjtcbiAgICBpZiAoZGVjaW1hbFNlcGFyYXRvcikge1xuICAgICAgcGFyc2VkU3RyID0gcGFyc2VkU3RyLnJlcGxhY2UoZGVjaW1hbFNlcGFyYXRvciwgJy4nKTtcbiAgICB9XG5cbiAgICAvLyBbTGVnYWN5XSBXZSBzdGlsbCBzdXBwb3J0IGF1dG8gY29udmVydCBgJCAxMjMsNDU2YCB0byBgMTIzNDU2YFxuICAgIHJldHVybiBwYXJzZWRTdHIucmVwbGFjZSgvW15cXHcuLV0rL2csICcnKTtcbiAgfSwgW3BhcnNlciwgZGVjaW1hbFNlcGFyYXRvcl0pO1xuXG4gIC8vID4+PiBGb3JtYXR0ZXJcbiAgdmFyIGlucHV0VmFsdWVSZWYgPSBSZWFjdC51c2VSZWYoJycpO1xuICB2YXIgbWVyZ2VkRm9ybWF0dGVyID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKG51bWJlciwgdXNlclR5cGluZykge1xuICAgIGlmIChmb3JtYXR0ZXIpIHtcbiAgICAgIHJldHVybiBmb3JtYXR0ZXIobnVtYmVyLCB7XG4gICAgICAgIHVzZXJUeXBpbmc6IHVzZXJUeXBpbmcsXG4gICAgICAgIGlucHV0OiBTdHJpbmcoaW5wdXRWYWx1ZVJlZi5jdXJyZW50KVxuICAgICAgfSk7XG4gICAgfVxuICAgIHZhciBzdHIgPSB0eXBlb2YgbnVtYmVyID09PSAnbnVtYmVyJyA/IG51bTJzdHIobnVtYmVyKSA6IG51bWJlcjtcblxuICAgIC8vIFVzZXIgdHlwaW5nIHdpbGwgbm90IGF1dG8gZm9ybWF0IHdpdGggcHJlY2lzaW9uIGRpcmVjdGx5XG4gICAgaWYgKCF1c2VyVHlwaW5nKSB7XG4gICAgICB2YXIgbWVyZ2VkUHJlY2lzaW9uID0gZ2V0UHJlY2lzaW9uKHN0ciwgdXNlclR5cGluZyk7XG4gICAgICBpZiAodmFsaWRhdGVOdW1iZXIoc3RyKSAmJiAoZGVjaW1hbFNlcGFyYXRvciB8fCBtZXJnZWRQcmVjaXNpb24gPj0gMCkpIHtcbiAgICAgICAgLy8gU2VwYXJhdG9yXG4gICAgICAgIHZhciBzZXBhcmF0b3JTdHIgPSBkZWNpbWFsU2VwYXJhdG9yIHx8ICcuJztcbiAgICAgICAgc3RyID0gdG9GaXhlZChzdHIsIHNlcGFyYXRvclN0ciwgbWVyZ2VkUHJlY2lzaW9uKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbiAgfSwgW2Zvcm1hdHRlciwgZ2V0UHJlY2lzaW9uLCBkZWNpbWFsU2VwYXJhdG9yXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gSW5wdXRWYWx1ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvKipcbiAgICogSW5wdXQgdGV4dCB2YWx1ZSBjb250cm9sXG4gICAqXG4gICAqIFVzZXIgY2FuIG5vdCB1cGRhdGUgaW5wdXQgY29udGVudCBkaXJlY3RseS4gSXQgdXBkYXRlcyB3aXRoIGZvbGxvdyBydWxlcyBieSBwcmlvcml0eTpcbiAgICogIDEuIGNvbnRyb2xsZWQgYHZhbHVlYCBjaGFuZ2VkXG4gICAqICAgICogW1NQRUNJQUxdIFR5cGluZyBsaWtlIGAxLmAgc2hvdWxkIG5vdCBpbW1lZGlhdGVseSBjb252ZXJ0IHRvIGAxYFxuICAgKiAgMi4gVXNlciB0eXBpbmcgd2l0aCBmb3JtYXQgKG5vdCBwcmVjaXNpb24pXG4gICAqICAzLiBCbHVyIG9yIEVudGVyIHRyaWdnZXIgcmV2YWxpZGF0ZVxuICAgKi9cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTUgPSBSZWFjdC51c2VTdGF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgaW5pdFZhbHVlID0gZGVmYXVsdFZhbHVlICE9PSBudWxsICYmIGRlZmF1bHRWYWx1ZSAhPT0gdm9pZCAwID8gZGVmYXVsdFZhbHVlIDogdmFsdWU7XG4gICAgICBpZiAoZGVjaW1hbFZhbHVlLmlzSW52YWxpZGF0ZSgpICYmIFsnc3RyaW5nJywgJ251bWJlciddLmluY2x1ZGVzKF90eXBlb2YoaW5pdFZhbHVlKSkpIHtcbiAgICAgICAgcmV0dXJuIE51bWJlci5pc05hTihpbml0VmFsdWUpID8gJycgOiBpbml0VmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gbWVyZ2VkRm9ybWF0dGVyKGRlY2ltYWxWYWx1ZS50b1N0cmluZygpLCBmYWxzZSk7XG4gICAgfSksXG4gICAgX1JlYWN0JHVzZVN0YXRlNiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTUsIDIpLFxuICAgIGlucHV0VmFsdWUgPSBfUmVhY3QkdXNlU3RhdGU2WzBdLFxuICAgIHNldEludGVybmFsSW5wdXRWYWx1ZSA9IF9SZWFjdCR1c2VTdGF0ZTZbMV07XG4gIGlucHV0VmFsdWVSZWYuY3VycmVudCA9IGlucHV0VmFsdWU7XG5cbiAgLy8gU2hvdWxkIGFsd2F5cyBiZSBzdHJpbmdcbiAgZnVuY3Rpb24gc2V0SW5wdXRWYWx1ZShuZXdWYWx1ZSwgdXNlclR5cGluZykge1xuICAgIHNldEludGVybmFsSW5wdXRWYWx1ZShtZXJnZWRGb3JtYXR0ZXIoXG4gICAgLy8gSW52YWxpZGF0ZSBudW1iZXIgaXMgc29tZXRpbWUgcGFzc2VkIGJ5IGV4dGVybmFsIGNvbnRyb2wsIHdlIHNob3VsZCBsZXQgaXQgZ29cbiAgICAvLyBPdGhlcndpc2UgaXMgY29udHJvbGxlZCBieSBpbnRlcm5hbCBpbnRlcmFjdGl2ZSBsb2dpYyB3aGljaCBjaGVjayBieSB1c2VyVHlwaW5nXG4gICAgLy8gWW91IGNhbiByZWYgJ3Nob3cgbGltaXRlZCB2YWx1ZSB3aGVuIGlucHV0IGlzIG5vdCBmb2N1c2VkJyB0ZXN0IGZvciBtb3JlIGluZm8uXG4gICAgbmV3VmFsdWUuaXNJbnZhbGlkYXRlKCkgPyBuZXdWYWx1ZS50b1N0cmluZyhmYWxzZSkgOiBuZXdWYWx1ZS50b1N0cmluZyghdXNlclR5cGluZyksIHVzZXJUeXBpbmcpKTtcbiAgfVxuXG4gIC8vID4+PiBNYXggJiBNaW4gbGltaXRcbiAgdmFyIG1heERlY2ltYWwgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZ2V0RGVjaW1hbElmVmFsaWRhdGUobWF4KTtcbiAgfSwgW21heCwgcHJlY2lzaW9uXSk7XG4gIHZhciBtaW5EZWNpbWFsID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGdldERlY2ltYWxJZlZhbGlkYXRlKG1pbik7XG4gIH0sIFttaW4sIHByZWNpc2lvbl0pO1xuICB2YXIgdXBEaXNhYmxlZCA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGlmICghbWF4RGVjaW1hbCB8fCAhZGVjaW1hbFZhbHVlIHx8IGRlY2ltYWxWYWx1ZS5pc0ludmFsaWRhdGUoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gbWF4RGVjaW1hbC5sZXNzRXF1YWxzKGRlY2ltYWxWYWx1ZSk7XG4gIH0sIFttYXhEZWNpbWFsLCBkZWNpbWFsVmFsdWVdKTtcbiAgdmFyIGRvd25EaXNhYmxlZCA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGlmICghbWluRGVjaW1hbCB8fCAhZGVjaW1hbFZhbHVlIHx8IGRlY2ltYWxWYWx1ZS5pc0ludmFsaWRhdGUoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gZGVjaW1hbFZhbHVlLmxlc3NFcXVhbHMobWluRGVjaW1hbCk7XG4gIH0sIFttaW5EZWNpbWFsLCBkZWNpbWFsVmFsdWVdKTtcblxuICAvLyBDdXJzb3IgY29udHJvbGxlclxuICB2YXIgX3VzZUN1cnNvciA9IHVzZUN1cnNvcihpbnB1dFJlZi5jdXJyZW50LCBmb2N1cyksXG4gICAgX3VzZUN1cnNvcjIgPSBfc2xpY2VkVG9BcnJheShfdXNlQ3Vyc29yLCAyKSxcbiAgICByZWNvcmRDdXJzb3IgPSBfdXNlQ3Vyc29yMlswXSxcbiAgICByZXN0b3JlQ3Vyc29yID0gX3VzZUN1cnNvcjJbMV07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRGF0YSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvKipcbiAgICogRmluZCB0YXJnZXQgdmFsdWUgY2xvc2V0IHdpdGhpbiByYW5nZS5cbiAgICogZS5nLiBbMTEsIDI4XTpcbiAgICogICAgMyAgPT4gMTFcbiAgICogICAgMjMgPT4gMjNcbiAgICogICAgOTkgPT4gMjhcbiAgICovXG4gIHZhciBnZXRSYW5nZVZhbHVlID0gZnVuY3Rpb24gZ2V0UmFuZ2VWYWx1ZSh0YXJnZXQpIHtcbiAgICAvLyB0YXJnZXQgPiBtYXhcbiAgICBpZiAobWF4RGVjaW1hbCAmJiAhdGFyZ2V0Lmxlc3NFcXVhbHMobWF4RGVjaW1hbCkpIHtcbiAgICAgIHJldHVybiBtYXhEZWNpbWFsO1xuICAgIH1cblxuICAgIC8vIHRhcmdldCA8IG1pblxuICAgIGlmIChtaW5EZWNpbWFsICYmICFtaW5EZWNpbWFsLmxlc3NFcXVhbHModGFyZ2V0KSkge1xuICAgICAgcmV0dXJuIG1pbkRlY2ltYWw7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDaGVjayB2YWx1ZSBpcyBpbiBbbWluLCBtYXhdIHJhbmdlXG4gICAqL1xuICB2YXIgaXNJblJhbmdlID0gZnVuY3Rpb24gaXNJblJhbmdlKHRhcmdldCkge1xuICAgIHJldHVybiAhZ2V0UmFuZ2VWYWx1ZSh0YXJnZXQpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBUcmlnZ2VyIGBvbkNoYW5nZWAgaWYgdmFsdWUgdmFsaWRhdGVkIGFuZCBub3QgZXF1YWxzIG9mIG9yaWdpbi5cbiAgICogUmV0dXJuIHRoZSB2YWx1ZSB0aGF0IHJlLWFsaWduIGluIHJhbmdlLlxuICAgKi9cbiAgdmFyIHRyaWdnZXJWYWx1ZVVwZGF0ZSA9IGZ1bmN0aW9uIHRyaWdnZXJWYWx1ZVVwZGF0ZShuZXdWYWx1ZSwgdXNlclR5cGluZykge1xuICAgIHZhciB1cGRhdGVWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgIHZhciBpc1JhbmdlVmFsaWRhdGUgPSBpc0luUmFuZ2UodXBkYXRlVmFsdWUpIHx8IHVwZGF0ZVZhbHVlLmlzRW1wdHkoKTtcblxuICAgIC8vIFNraXAgYWxpZ24gdmFsdWUgd2hlbiB0cmlnZ2VyIHZhbHVlIGlzIGVtcHR5LlxuICAgIC8vIFdlIGp1c3QgdHJpZ2dlciBvbkNoYW5nZShudWxsKVxuICAgIC8vIFRoaXMgc2hvdWxkIG5vdCBibG9jayB1c2VyIHR5cGluZ1xuICAgIGlmICghdXBkYXRlVmFsdWUuaXNFbXB0eSgpICYmICF1c2VyVHlwaW5nKSB7XG4gICAgICAvLyBSZXZlcnQgdmFsdWUgaW4gcmFuZ2UgaWYgbmVlZGVkXG4gICAgICB1cGRhdGVWYWx1ZSA9IGdldFJhbmdlVmFsdWUodXBkYXRlVmFsdWUpIHx8IHVwZGF0ZVZhbHVlO1xuICAgICAgaXNSYW5nZVZhbGlkYXRlID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCFyZWFkT25seSAmJiAhZGlzYWJsZWQgJiYgaXNSYW5nZVZhbGlkYXRlKSB7XG4gICAgICB2YXIgbnVtU3RyID0gdXBkYXRlVmFsdWUudG9TdHJpbmcoKTtcbiAgICAgIHZhciBtZXJnZWRQcmVjaXNpb24gPSBnZXRQcmVjaXNpb24obnVtU3RyLCB1c2VyVHlwaW5nKTtcbiAgICAgIGlmIChtZXJnZWRQcmVjaXNpb24gPj0gMCkge1xuICAgICAgICB1cGRhdGVWYWx1ZSA9IGdldE1pbmlEZWNpbWFsKHRvRml4ZWQobnVtU3RyLCAnLicsIG1lcmdlZFByZWNpc2lvbikpO1xuXG4gICAgICAgIC8vIFdoZW4gdG8gZml4ZWQuIFRoZSB2YWx1ZSBtYXkgb3V0IG9mIG1pbiAmIG1heCByYW5nZS5cbiAgICAgICAgLy8gNCBpbiBbMCwgMy44XSA9PiAzLjggPT4gNCAodG9GaXhlZClcbiAgICAgICAgaWYgKCFpc0luUmFuZ2UodXBkYXRlVmFsdWUpKSB7XG4gICAgICAgICAgdXBkYXRlVmFsdWUgPSBnZXRNaW5pRGVjaW1hbCh0b0ZpeGVkKG51bVN0ciwgJy4nLCBtZXJnZWRQcmVjaXNpb24sIHRydWUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUcmlnZ2VyIGV2ZW50XG4gICAgICBpZiAoIXVwZGF0ZVZhbHVlLmVxdWFscyhkZWNpbWFsVmFsdWUpKSB7XG4gICAgICAgIHNldFVuY29udHJvbGxlZERlY2ltYWxWYWx1ZSh1cGRhdGVWYWx1ZSk7XG4gICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgfHwgb25DaGFuZ2UodXBkYXRlVmFsdWUuaXNFbXB0eSgpID8gbnVsbCA6IGdldERlY2ltYWxWYWx1ZShzdHJpbmdNb2RlLCB1cGRhdGVWYWx1ZSkpO1xuXG4gICAgICAgIC8vIFJlZm9ybWF0IGlucHV0IGlmIHZhbHVlIGlzIG5vdCBjb250cm9sbGVkXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgc2V0SW5wdXRWYWx1ZSh1cGRhdGVWYWx1ZSwgdXNlclR5cGluZyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB1cGRhdGVWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGRlY2ltYWxWYWx1ZTtcbiAgfTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBVc2VyIElucHV0ID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBvbk5leHRQcm9taXNlID0gdXNlRnJhbWUoKTtcblxuICAvLyA+Pj4gQ29sbGVjdCBpbnB1dCB2YWx1ZVxuICB2YXIgY29sbGVjdElucHV0VmFsdWUgPSBmdW5jdGlvbiBjb2xsZWN0SW5wdXRWYWx1ZShpbnB1dFN0cikge1xuICAgIHJlY29yZEN1cnNvcigpO1xuXG4gICAgLy8gVXBkYXRlIGlucHV0VmFsdWUgaW4gY2FzZSBpbnB1dCBjYW4gbm90IHBhcnNlIGFzIG51bWJlclxuICAgIC8vIFJlZnJlc2ggcmVmIHZhbHVlIGltbWVkaWF0ZWx5IHNpbmNlIGl0IG1heSB1c2VkIGJ5IGZvcm1hdHRlclxuICAgIGlucHV0VmFsdWVSZWYuY3VycmVudCA9IGlucHV0U3RyO1xuICAgIHNldEludGVybmFsSW5wdXRWYWx1ZShpbnB1dFN0cik7XG5cbiAgICAvLyBQYXJzZSBudW1iZXJcbiAgICBpZiAoIWNvbXBvc2l0aW9uUmVmLmN1cnJlbnQpIHtcbiAgICAgIHZhciBmaW5hbFZhbHVlID0gbWVyZ2VkUGFyc2VyKGlucHV0U3RyKTtcbiAgICAgIHZhciBmaW5hbERlY2ltYWwgPSBnZXRNaW5pRGVjaW1hbChmaW5hbFZhbHVlKTtcbiAgICAgIGlmICghZmluYWxEZWNpbWFsLmlzTmFOKCkpIHtcbiAgICAgICAgdHJpZ2dlclZhbHVlVXBkYXRlKGZpbmFsRGVjaW1hbCwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVHJpZ2dlciBvbklucHV0IGxhdGVyIHRvIGxldCB1c2VyIGN1c3RvbWl6ZSB2YWx1ZSBpZiB0aGV5IHdhbnQgdG8gaGFuZGxlIHNvbWV0aGluZyBhZnRlciBvbkNoYW5nZVxuICAgIG9uSW5wdXQgPT09IG51bGwgfHwgb25JbnB1dCA9PT0gdm9pZCAwIHx8IG9uSW5wdXQoaW5wdXRTdHIpO1xuXG4gICAgLy8gb3B0aW1pemUgZm9yIGNoaW5lc2UgaW5wdXQgZXhwZXJpZW5jZVxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzgxOTZcbiAgICBvbk5leHRQcm9taXNlKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBuZXh0SW5wdXRTdHIgPSBpbnB1dFN0cjtcbiAgICAgIGlmICghcGFyc2VyKSB7XG4gICAgICAgIG5leHRJbnB1dFN0ciA9IGlucHV0U3RyLnJlcGxhY2UoL1x1MzAwMi9nLCAnLicpO1xuICAgICAgfVxuICAgICAgaWYgKG5leHRJbnB1dFN0ciAhPT0gaW5wdXRTdHIpIHtcbiAgICAgICAgY29sbGVjdElucHV0VmFsdWUobmV4dElucHV0U3RyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICAvLyA+Pj4gQ29tcG9zaXRpb25cbiAgdmFyIG9uQ29tcG9zaXRpb25TdGFydCA9IGZ1bmN0aW9uIG9uQ29tcG9zaXRpb25TdGFydCgpIHtcbiAgICBjb21wb3NpdGlvblJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgfTtcbiAgdmFyIG9uQ29tcG9zaXRpb25FbmQgPSBmdW5jdGlvbiBvbkNvbXBvc2l0aW9uRW5kKCkge1xuICAgIGNvbXBvc2l0aW9uUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICBjb2xsZWN0SW5wdXRWYWx1ZShpbnB1dFJlZi5jdXJyZW50LnZhbHVlKTtcbiAgfTtcblxuICAvLyA+Pj4gSW5wdXRcbiAgdmFyIG9uSW50ZXJuYWxJbnB1dCA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxJbnB1dChlKSB7XG4gICAgY29sbGVjdElucHV0VmFsdWUoZS50YXJnZXQudmFsdWUpO1xuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFN0ZXAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG9uSW50ZXJuYWxTdGVwID0gZnVuY3Rpb24gb25JbnRlcm5hbFN0ZXAodXApIHtcbiAgICB2YXIgX2lucHV0UmVmJGN1cnJlbnQ7XG4gICAgLy8gSWdub3JlIHN0ZXAgc2luY2Ugb3V0IG9mIHJhbmdlXG4gICAgaWYgKHVwICYmIHVwRGlzYWJsZWQgfHwgIXVwICYmIGRvd25EaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENsZWFyIHR5cGluZyBzdGF0dXMgc2luY2UgaXQgbWF5IGJlIGNhdXNlZCBieSB1cCAmIGRvd24ga2V5LlxuICAgIC8vIFdlIHNob3VsZCBzeW5jIHdpdGggaW5wdXQgdmFsdWUuXG4gICAgdXNlclR5cGluZ1JlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgdmFyIHN0ZXBEZWNpbWFsID0gZ2V0TWluaURlY2ltYWwoc2hpZnRLZXlSZWYuY3VycmVudCA/IGdldERlY3VwbGVTdGVwcyhzdGVwKSA6IHN0ZXApO1xuICAgIGlmICghdXApIHtcbiAgICAgIHN0ZXBEZWNpbWFsID0gc3RlcERlY2ltYWwubmVnYXRlKCk7XG4gICAgfVxuICAgIHZhciB0YXJnZXQgPSAoZGVjaW1hbFZhbHVlIHx8IGdldE1pbmlEZWNpbWFsKDApKS5hZGQoc3RlcERlY2ltYWwudG9TdHJpbmcoKSk7XG4gICAgdmFyIHVwZGF0ZWRWYWx1ZSA9IHRyaWdnZXJWYWx1ZVVwZGF0ZSh0YXJnZXQsIGZhbHNlKTtcbiAgICBvblN0ZXAgPT09IG51bGwgfHwgb25TdGVwID09PSB2b2lkIDAgfHwgb25TdGVwKGdldERlY2ltYWxWYWx1ZShzdHJpbmdNb2RlLCB1cGRhdGVkVmFsdWUpLCB7XG4gICAgICBvZmZzZXQ6IHNoaWZ0S2V5UmVmLmN1cnJlbnQgPyBnZXREZWN1cGxlU3RlcHMoc3RlcCkgOiBzdGVwLFxuICAgICAgdHlwZTogdXAgPyAndXAnIDogJ2Rvd24nXG4gICAgfSk7XG4gICAgKF9pbnB1dFJlZiRjdXJyZW50ID0gaW5wdXRSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2lucHV0UmVmJGN1cnJlbnQgPT09IHZvaWQgMCB8fCBfaW5wdXRSZWYkY3VycmVudC5mb2N1cygpO1xuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRmx1c2ggPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLyoqXG4gICAqIEZsdXNoIGN1cnJlbnQgaW5wdXQgY29udGVudCB0byB0cmlnZ2VyIHZhbHVlIGNoYW5nZSAmIHJlLWZvcm1hdHRlciBpbnB1dCBpZiBuZWVkZWQuXG4gICAqIFRoaXMgd2lsbCBhbHdheXMgZmx1c2ggaW5wdXQgdmFsdWUgZm9yIHVwZGF0ZS5cbiAgICogSWYgaXQncyBpbnZhbGlkYXRlLCB3aWxsIGZhbGxiYWNrIHRvIGxhc3QgdmFsaWRhdGUgdmFsdWUuXG4gICAqL1xuICB2YXIgZmx1c2hJbnB1dFZhbHVlID0gZnVuY3Rpb24gZmx1c2hJbnB1dFZhbHVlKHVzZXJUeXBpbmcpIHtcbiAgICB2YXIgcGFyc2VkVmFsdWUgPSBnZXRNaW5pRGVjaW1hbChtZXJnZWRQYXJzZXIoaW5wdXRWYWx1ZSkpO1xuICAgIHZhciBmb3JtYXRWYWx1ZTtcbiAgICBpZiAoIXBhcnNlZFZhbHVlLmlzTmFOKCkpIHtcbiAgICAgIC8vIE9ubHkgdmFsaWRhdGUgdmFsdWUgb3IgZW1wdHkgdmFsdWUgY2FuIGJlIHJlLWZpbGwgdG8gaW5wdXRWYWx1ZVxuICAgICAgLy8gUmVhc3NpZ24gdGhlIGZvcm1hdFZhbHVlIHdpdGhpbiByYW5nZWQgb2YgdHJpZ2dlciBjb250cm9sXG4gICAgICBmb3JtYXRWYWx1ZSA9IHRyaWdnZXJWYWx1ZVVwZGF0ZShwYXJzZWRWYWx1ZSwgdXNlclR5cGluZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvcm1hdFZhbHVlID0gdHJpZ2dlclZhbHVlVXBkYXRlKGRlY2ltYWxWYWx1ZSwgdXNlclR5cGluZyk7XG4gICAgfVxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBSZXNldCBiYWNrIHdpdGggY29udHJvbGxlZCB2YWx1ZSBmaXJzdFxuICAgICAgc2V0SW5wdXRWYWx1ZShkZWNpbWFsVmFsdWUsIGZhbHNlKTtcbiAgICB9IGVsc2UgaWYgKCFmb3JtYXRWYWx1ZS5pc05hTigpKSB7XG4gICAgICAvLyBSZXNldCBpbnB1dCBiYWNrIHNpbmNlIG5vIHZhbGlkYXRlIHZhbHVlXG4gICAgICBzZXRJbnB1dFZhbHVlKGZvcm1hdFZhbHVlLCBmYWxzZSk7XG4gICAgfVxuICB9O1xuXG4gIC8vIFNvbHZlIHRoZSBpc3N1ZSBvZiB0aGUgZXZlbnQgdHJpZ2dlcmluZyBzZXF1ZW5jZSB3aGVuIGVudGVyaW5nIG51bWJlcnMgaW4gY2hpbmVzZSBpbnB1dCAoU2FmYXJpKVxuICB2YXIgb25CZWZvcmVJbnB1dCA9IGZ1bmN0aW9uIG9uQmVmb3JlSW5wdXQoKSB7XG4gICAgdXNlclR5cGluZ1JlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgfTtcbiAgdmFyIG9uS2V5RG93biA9IGZ1bmN0aW9uIG9uS2V5RG93bihldmVudCkge1xuICAgIHZhciBrZXkgPSBldmVudC5rZXksXG4gICAgICBzaGlmdEtleSA9IGV2ZW50LnNoaWZ0S2V5O1xuICAgIHVzZXJUeXBpbmdSZWYuY3VycmVudCA9IHRydWU7XG4gICAgc2hpZnRLZXlSZWYuY3VycmVudCA9IHNoaWZ0S2V5O1xuICAgIGlmIChrZXkgPT09ICdFbnRlcicpIHtcbiAgICAgIGlmICghY29tcG9zaXRpb25SZWYuY3VycmVudCkge1xuICAgICAgICB1c2VyVHlwaW5nUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGZsdXNoSW5wdXRWYWx1ZShmYWxzZSk7XG4gICAgICBvblByZXNzRW50ZXIgPT09IG51bGwgfHwgb25QcmVzc0VudGVyID09PSB2b2lkIDAgfHwgb25QcmVzc0VudGVyKGV2ZW50KTtcbiAgICB9XG4gICAgaWYgKGtleWJvYXJkID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIERvIHN0ZXBcbiAgICBpZiAoIWNvbXBvc2l0aW9uUmVmLmN1cnJlbnQgJiYgWydVcCcsICdBcnJvd1VwJywgJ0Rvd24nLCAnQXJyb3dEb3duJ10uaW5jbHVkZXMoa2V5KSkge1xuICAgICAgb25JbnRlcm5hbFN0ZXAoa2V5ID09PSAnVXAnIHx8IGtleSA9PT0gJ0Fycm93VXAnKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9O1xuICB2YXIgb25LZXlVcCA9IGZ1bmN0aW9uIG9uS2V5VXAoKSB7XG4gICAgdXNlclR5cGluZ1JlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgc2hpZnRLZXlSZWYuY3VycmVudCA9IGZhbHNlO1xuICB9O1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChjaGFuZ2VPbldoZWVsICYmIGZvY3VzKSB7XG4gICAgICB2YXIgb25XaGVlbCA9IGZ1bmN0aW9uIG9uV2hlZWwoZXZlbnQpIHtcbiAgICAgICAgLy8gbW92aW5nIG1vdXNlIHdoZWVsIHJpc2VzIHdoZWVsIGV2ZW50IHdpdGggZGVsdGFZIDwgMFxuICAgICAgICAvLyBzY3JvbGwgdmFsdWUgZ3Jvd3MgZnJvbSB0b3AgdG8gYm90dG9tLCBhcyBzY3JlZW4gWSBjb29yZGluYXRlXG4gICAgICAgIG9uSW50ZXJuYWxTdGVwKGV2ZW50LmRlbHRhWSA8IDApO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfTtcbiAgICAgIHZhciBpbnB1dCA9IGlucHV0UmVmLmN1cnJlbnQ7XG4gICAgICBpZiAoaW5wdXQpIHtcbiAgICAgICAgLy8gUmVhY3Qgb25XaGVlbCBpcyBwYXNzaXZlIGFuZCB3ZSBjYW4ndCBwcmV2ZW50RGVmYXVsdCgpIGluIGl0LlxuICAgICAgICAvLyBUaGF0J3Mgd2h5IHdlIHNob3VsZCBzdWJzY3JpYmUgd2l0aCBET00gbGlzdGVuZXJcbiAgICAgICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNjM2NjMwMjUvcmVhY3Qtb253aGVlbC1oYW5kbGVyLWNhbnQtcHJldmVudGRlZmF1bHQtYmVjYXVzZS1pdHMtYS1wYXNzaXZlLWV2ZW50LWxpc3RlbmV2XG4gICAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgb25XaGVlbCwge1xuICAgICAgICAgIHBhc3NpdmU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBpbnB1dC5yZW1vdmVFdmVudExpc3RlbmVyKCd3aGVlbCcsIG9uV2hlZWwpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgLy8gPj4+IEZvY3VzICYgQmx1clxuICB2YXIgb25CbHVyID0gZnVuY3Rpb24gb25CbHVyKCkge1xuICAgIGlmIChjaGFuZ2VPbkJsdXIpIHtcbiAgICAgIGZsdXNoSW5wdXRWYWx1ZShmYWxzZSk7XG4gICAgfVxuICAgIHNldEZvY3VzKGZhbHNlKTtcbiAgICB1c2VyVHlwaW5nUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgfTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBDb250cm9sbGVkID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIElucHV0IGJ5IHByZWNpc2lvbiAmIGZvcm1hdHRlclxuICB1c2VMYXlvdXRVcGRhdGVFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICghZGVjaW1hbFZhbHVlLmlzSW52YWxpZGF0ZSgpKSB7XG4gICAgICBzZXRJbnB1dFZhbHVlKGRlY2ltYWxWYWx1ZSwgZmFsc2UpO1xuICAgIH1cbiAgfSwgW3ByZWNpc2lvbiwgZm9ybWF0dGVyXSk7XG5cbiAgLy8gSW5wdXQgYnkgdmFsdWVcbiAgdXNlTGF5b3V0VXBkYXRlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbmV3VmFsdWUgPSBnZXRNaW5pRGVjaW1hbCh2YWx1ZSk7XG4gICAgc2V0RGVjaW1hbFZhbHVlKG5ld1ZhbHVlKTtcbiAgICB2YXIgY3VycmVudFBhcnNlZFZhbHVlID0gZ2V0TWluaURlY2ltYWwobWVyZ2VkUGFyc2VyKGlucHV0VmFsdWUpKTtcblxuICAgIC8vIFdoZW4gdXNlciB0eXBpbmcgZnJvbSBgMS4yYCB0byBgMS5gLCB3ZSBzaG91bGQgbm90IGNvbnZlcnQgdG8gYDFgIGltbWVkaWF0ZWx5LlxuICAgIC8vIEJ1dCBsZXQgaXQgZ28gaWYgdXNlciBzZXQgYGZvcm1hdHRlcmBcbiAgICBpZiAoIW5ld1ZhbHVlLmVxdWFscyhjdXJyZW50UGFyc2VkVmFsdWUpIHx8ICF1c2VyVHlwaW5nUmVmLmN1cnJlbnQgfHwgZm9ybWF0dGVyKSB7XG4gICAgICAvLyBVcGRhdGUgdmFsdWUgYXMgZWZmZWN0XG4gICAgICBzZXRJbnB1dFZhbHVlKG5ld1ZhbHVlLCB1c2VyVHlwaW5nUmVmLmN1cnJlbnQpO1xuICAgIH1cbiAgfSwgW3ZhbHVlXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDdXJzb3IgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB1c2VMYXlvdXRVcGRhdGVFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChmb3JtYXR0ZXIpIHtcbiAgICAgIHJlc3RvcmVDdXJzb3IoKTtcbiAgICB9XG4gIH0sIFtpbnB1dFZhbHVlXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHJlZjogZG9tUmVmLFxuICAgIGNsYXNzTmFtZTogY2xzeChwcmVmaXhDbHMsIGNsYXNzTmFtZSwgX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1mb2N1c2VkXCIpLCBmb2N1cyksIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZGlzYWJsZWRcIiksIGRpc2FibGVkKSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1yZWFkb25seVwiKSwgcmVhZE9ubHkpLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW5vdC1hLW51bWJlclwiKSwgZGVjaW1hbFZhbHVlLmlzTmFOKCkpLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW91dC1vZi1yYW5nZVwiKSwgIWRlY2ltYWxWYWx1ZS5pc0ludmFsaWRhdGUoKSAmJiAhaXNJblJhbmdlKGRlY2ltYWxWYWx1ZSkpKSxcbiAgICBzdHlsZTogc3R5bGUsXG4gICAgb25Gb2N1czogZnVuY3Rpb24gb25Gb2N1cygpIHtcbiAgICAgIHNldEZvY3VzKHRydWUpO1xuICAgIH0sXG4gICAgb25CbHVyOiBvbkJsdXIsXG4gICAgb25LZXlEb3duOiBvbktleURvd24sXG4gICAgb25LZXlVcDogb25LZXlVcCxcbiAgICBvbkNvbXBvc2l0aW9uU3RhcnQ6IG9uQ29tcG9zaXRpb25TdGFydCxcbiAgICBvbkNvbXBvc2l0aW9uRW5kOiBvbkNvbXBvc2l0aW9uRW5kLFxuICAgIG9uQmVmb3JlSW5wdXQ6IG9uQmVmb3JlSW5wdXRcbiAgfSwgY29udHJvbHMgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU3RlcEhhbmRsZXIsIHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICB1cE5vZGU6IHVwSGFuZGxlcixcbiAgICBkb3duTm9kZTogZG93bkhhbmRsZXIsXG4gICAgdXBEaXNhYmxlZDogdXBEaXNhYmxlZCxcbiAgICBkb3duRGlzYWJsZWQ6IGRvd25EaXNhYmxlZCxcbiAgICBvblN0ZXA6IG9uSW50ZXJuYWxTdGVwXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChpbnB1dENsYXNzTmFtZSwgXCItd3JhcFwiKVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImlucHV0XCIsIF9leHRlbmRzKHtcbiAgICBhdXRvQ29tcGxldGU6IFwib2ZmXCIsXG4gICAgcm9sZTogXCJzcGluYnV0dG9uXCIsXG4gICAgXCJhcmlhLXZhbHVlbWluXCI6IG1pbixcbiAgICBcImFyaWEtdmFsdWVtYXhcIjogbWF4LFxuICAgIFwiYXJpYS12YWx1ZW5vd1wiOiBkZWNpbWFsVmFsdWUuaXNJbnZhbGlkYXRlKCkgPyBudWxsIDogZGVjaW1hbFZhbHVlLnRvU3RyaW5nKCksXG4gICAgc3RlcDogc3RlcFxuICB9LCBpbnB1dFByb3BzLCB7XG4gICAgcmVmOiBjb21wb3NlUmVmKGlucHV0UmVmLCByZWYpLFxuICAgIGNsYXNzTmFtZTogaW5wdXRDbGFzc05hbWUsXG4gICAgdmFsdWU6IGlucHV0VmFsdWUsXG4gICAgb25DaGFuZ2U6IG9uSW50ZXJuYWxJbnB1dCxcbiAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgcmVhZE9ubHk6IHJlYWRPbmx5XG4gIH0pKSkpO1xufSk7XG52YXIgSW5wdXROdW1iZXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICB2YXIgZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgIF9wcm9wcyRwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgcHJlZml4Q2xzID0gX3Byb3BzJHByZWZpeENscyA9PT0gdm9pZCAwID8gJ3JjLWlucHV0LW51bWJlcicgOiBfcHJvcHMkcHJlZml4Q2xzLFxuICAgIHZhbHVlID0gcHJvcHMudmFsdWUsXG4gICAgcHJlZml4ID0gcHJvcHMucHJlZml4LFxuICAgIHN1ZmZpeCA9IHByb3BzLnN1ZmZpeCxcbiAgICBhZGRvbkJlZm9yZSA9IHByb3BzLmFkZG9uQmVmb3JlLFxuICAgIGFkZG9uQWZ0ZXIgPSBwcm9wcy5hZGRvbkFmdGVyLFxuICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBjbGFzc05hbWVzID0gcHJvcHMuY2xhc3NOYW1lcyxcbiAgICByZXN0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBfZXhjbHVkZWQyKTtcbiAgdmFyIGhvbGRlclJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIGlucHV0TnVtYmVyRG9tUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICB2YXIgaW5wdXRGb2N1c1JlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIGZvY3VzID0gZnVuY3Rpb24gZm9jdXMob3B0aW9uKSB7XG4gICAgaWYgKGlucHV0Rm9jdXNSZWYuY3VycmVudCkge1xuICAgICAgdHJpZ2dlckZvY3VzKGlucHV0Rm9jdXNSZWYuY3VycmVudCwgb3B0aW9uKTtcbiAgICB9XG4gIH07XG4gIFJlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHByb3h5T2JqZWN0KGlucHV0Rm9jdXNSZWYuY3VycmVudCwge1xuICAgICAgZm9jdXM6IGZvY3VzLFxuICAgICAgbmF0aXZlRWxlbWVudDogaG9sZGVyUmVmLmN1cnJlbnQubmF0aXZlRWxlbWVudCB8fCBpbnB1dE51bWJlckRvbVJlZi5jdXJyZW50XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQmFzZUlucHV0LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgdHJpZ2dlckZvY3VzOiBmb2N1cyxcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgIHN0eWxlOiBzdHlsZSxcbiAgICBwcmVmaXg6IHByZWZpeCxcbiAgICBzdWZmaXg6IHN1ZmZpeCxcbiAgICBhZGRvbkFmdGVyOiBhZGRvbkFmdGVyLFxuICAgIGFkZG9uQmVmb3JlOiBhZGRvbkJlZm9yZSxcbiAgICBjbGFzc05hbWVzOiBjbGFzc05hbWVzLFxuICAgIGNvbXBvbmVudHM6IHtcbiAgICAgIGFmZml4V3JhcHBlcjogJ2RpdicsXG4gICAgICBncm91cFdyYXBwZXI6ICdkaXYnLFxuICAgICAgd3JhcHBlcjogJ2RpdicsXG4gICAgICBncm91cEFkZG9uOiAnZGl2J1xuICAgIH0sXG4gICAgcmVmOiBob2xkZXJSZWZcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSW50ZXJuYWxJbnB1dE51bWJlciwgX2V4dGVuZHMoe1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICByZWY6IGlucHV0Rm9jdXNSZWYsXG4gICAgZG9tUmVmOiBpbnB1dE51bWJlckRvbVJlZixcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMgPT09IG51bGwgfHwgY2xhc3NOYW1lcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2xhc3NOYW1lcy5pbnB1dFxuICB9LCByZXN0KSkpO1xufSk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBJbnB1dE51bWJlci5kaXNwbGF5TmFtZSA9ICdJbnB1dE51bWJlcic7XG59XG5leHBvcnQgZGVmYXVsdCBJbnB1dE51bWJlcjsiLCAiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCBjbHN4IGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFJlYWN0LCB7IGNsb25lRWxlbWVudCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgaGFzQWRkb24sIGhhc1ByZWZpeFN1ZmZpeCB9IGZyb20gXCIuL3V0aWxzL2NvbW1vblV0aWxzXCI7XG52YXIgQmFzZUlucHV0ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIF9wcm9wcywgX3Byb3BzMiwgX3Byb3BzMztcbiAgdmFyIGlucHV0RWwgPSBwcm9wcy5pbnB1dEVsZW1lbnQsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgcHJlZml4ID0gcHJvcHMucHJlZml4LFxuICAgIHN1ZmZpeCA9IHByb3BzLnN1ZmZpeCxcbiAgICBhZGRvbkJlZm9yZSA9IHByb3BzLmFkZG9uQmVmb3JlLFxuICAgIGFkZG9uQWZ0ZXIgPSBwcm9wcy5hZGRvbkFmdGVyLFxuICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgIGRpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgcmVhZE9ubHkgPSBwcm9wcy5yZWFkT25seSxcbiAgICBmb2N1c2VkID0gcHJvcHMuZm9jdXNlZCxcbiAgICB0cmlnZ2VyRm9jdXMgPSBwcm9wcy50cmlnZ2VyRm9jdXMsXG4gICAgYWxsb3dDbGVhciA9IHByb3BzLmFsbG93Q2xlYXIsXG4gICAgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICBoYW5kbGVSZXNldCA9IHByb3BzLmhhbmRsZVJlc2V0LFxuICAgIGhpZGRlbiA9IHByb3BzLmhpZGRlbixcbiAgICBjbGFzc2VzID0gcHJvcHMuY2xhc3NlcyxcbiAgICBjbGFzc05hbWVzID0gcHJvcHMuY2xhc3NOYW1lcyxcbiAgICBkYXRhQXR0cnMgPSBwcm9wcy5kYXRhQXR0cnMsXG4gICAgc3R5bGVzID0gcHJvcHMuc3R5bGVzLFxuICAgIGNvbXBvbmVudHMgPSBwcm9wcy5jb21wb25lbnRzLFxuICAgIG9uQ2xlYXIgPSBwcm9wcy5vbkNsZWFyO1xuICB2YXIgaW5wdXRFbGVtZW50ID0gY2hpbGRyZW4gIT09IG51bGwgJiYgY2hpbGRyZW4gIT09IHZvaWQgMCA/IGNoaWxkcmVuIDogaW5wdXRFbDtcbiAgdmFyIEFmZml4V3JhcHBlckNvbXBvbmVudCA9IChjb21wb25lbnRzID09PSBudWxsIHx8IGNvbXBvbmVudHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbXBvbmVudHMuYWZmaXhXcmFwcGVyKSB8fCAnc3Bhbic7XG4gIHZhciBHcm91cFdyYXBwZXJDb21wb25lbnQgPSAoY29tcG9uZW50cyA9PT0gbnVsbCB8fCBjb21wb25lbnRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb21wb25lbnRzLmdyb3VwV3JhcHBlcikgfHwgJ3NwYW4nO1xuICB2YXIgV3JhcHBlckNvbXBvbmVudCA9IChjb21wb25lbnRzID09PSBudWxsIHx8IGNvbXBvbmVudHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbXBvbmVudHMud3JhcHBlcikgfHwgJ3NwYW4nO1xuICB2YXIgR3JvdXBBZGRvbkNvbXBvbmVudCA9IChjb21wb25lbnRzID09PSBudWxsIHx8IGNvbXBvbmVudHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbXBvbmVudHMuZ3JvdXBBZGRvbikgfHwgJ3NwYW4nO1xuICB2YXIgY29udGFpbmVyUmVmID0gdXNlUmVmKG51bGwpO1xuICB2YXIgb25JbnB1dENsaWNrID0gZnVuY3Rpb24gb25JbnB1dENsaWNrKGUpIHtcbiAgICB2YXIgX2NvbnRhaW5lclJlZiRjdXJyZW50O1xuICAgIGlmICgoX2NvbnRhaW5lclJlZiRjdXJyZW50ID0gY29udGFpbmVyUmVmLmN1cnJlbnQpICE9PSBudWxsICYmIF9jb250YWluZXJSZWYkY3VycmVudCAhPT0gdm9pZCAwICYmIF9jb250YWluZXJSZWYkY3VycmVudC5jb250YWlucyhlLnRhcmdldCkpIHtcbiAgICAgIHRyaWdnZXJGb2N1cyA9PT0gbnVsbCB8fCB0cmlnZ2VyRm9jdXMgPT09IHZvaWQgMCB8fCB0cmlnZ2VyRm9jdXMoKTtcbiAgICB9XG4gIH07XG4gIHZhciBoYXNBZmZpeCA9IGhhc1ByZWZpeFN1ZmZpeChwcm9wcyk7XG4gIHZhciBlbGVtZW50ID0gLyojX19QVVJFX18qL2Nsb25lRWxlbWVudChpbnB1dEVsZW1lbnQsIHtcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgY2xhc3NOYW1lOiBjbHN4KChfcHJvcHMgPSBpbnB1dEVsZW1lbnQucHJvcHMpID09PSBudWxsIHx8IF9wcm9wcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3Byb3BzLmNsYXNzTmFtZSwgIWhhc0FmZml4ICYmIChjbGFzc05hbWVzID09PSBudWxsIHx8IGNsYXNzTmFtZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNsYXNzTmFtZXMudmFyaWFudCkpIHx8IG51bGxcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IFJlZiA9PT09PT09PT09PT09PT09PT09PT09PT0gLy9cbiAgdmFyIGdyb3VwUmVmID0gdXNlUmVmKG51bGwpO1xuICBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBuYXRpdmVFbGVtZW50OiBncm91cFJlZi5jdXJyZW50IHx8IGNvbnRhaW5lclJlZi5jdXJyZW50XG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09IFByZWZpeCAmIFN1ZmZpeCA9PT09PT09PT09PT09PT09PT0gLy9cbiAgaWYgKGhhc0FmZml4KSB7XG4gICAgLy8gPT09PT09PT09PT09PT09PT09IENsZWFyIEljb24gPT09PT09PT09PT09PT09PT09IC8vXG4gICAgdmFyIGNsZWFySWNvbiA9IG51bGw7XG4gICAgaWYgKGFsbG93Q2xlYXIpIHtcbiAgICAgIHZhciBuZWVkQ2xlYXIgPSAhZGlzYWJsZWQgJiYgIXJlYWRPbmx5ICYmIHZhbHVlO1xuICAgICAgdmFyIGNsZWFySWNvbkNscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2xlYXItaWNvblwiKTtcbiAgICAgIHZhciBpY29uTm9kZSA9IF90eXBlb2YoYWxsb3dDbGVhcikgPT09ICdvYmplY3QnICYmIGFsbG93Q2xlYXIgIT09IG51bGwgJiYgYWxsb3dDbGVhciAhPT0gdm9pZCAwICYmIGFsbG93Q2xlYXIuY2xlYXJJY29uID8gYWxsb3dDbGVhci5jbGVhckljb24gOiAnXHUyNzE2JztcbiAgICAgIGNsZWFySWNvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgICAgdGFiSW5kZXg6IC0xLFxuICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKGV2ZW50KSB7XG4gICAgICAgICAgaGFuZGxlUmVzZXQgPT09IG51bGwgfHwgaGFuZGxlUmVzZXQgPT09IHZvaWQgMCB8fCBoYW5kbGVSZXNldChldmVudCk7XG4gICAgICAgICAgb25DbGVhciA9PT0gbnVsbCB8fCBvbkNsZWFyID09PSB2b2lkIDAgfHwgb25DbGVhcigpO1xuICAgICAgICB9XG4gICAgICAgIC8vIERvIG5vdCB0cmlnZ2VyIG9uQmx1ciB3aGVuIGNsZWFyIGlucHV0XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzMxMjAwXG4gICAgICAgICxcbiAgICAgICAgb25Nb3VzZURvd246IGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICAgICAgICByZXR1cm4gZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9LFxuICAgICAgICBjbGFzc05hbWU6IGNsc3goY2xlYXJJY29uQ2xzLCBfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChjbGVhckljb25DbHMsIFwiLWhpZGRlblwiKSwgIW5lZWRDbGVhciksIFwiXCIuY29uY2F0KGNsZWFySWNvbkNscywgXCItaGFzLXN1ZmZpeFwiKSwgISFzdWZmaXgpKVxuICAgICAgfSwgaWNvbk5vZGUpO1xuICAgIH1cbiAgICB2YXIgYWZmaXhXcmFwcGVyUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hZmZpeC13cmFwcGVyXCIpO1xuICAgIHZhciBhZmZpeFdyYXBwZXJDbHMgPSBjbHN4KGFmZml4V3JhcHBlclByZWZpeENscywgX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kaXNhYmxlZFwiKSwgZGlzYWJsZWQpLCBcIlwiLmNvbmNhdChhZmZpeFdyYXBwZXJQcmVmaXhDbHMsIFwiLWRpc2FibGVkXCIpLCBkaXNhYmxlZCksIFwiXCIuY29uY2F0KGFmZml4V3JhcHBlclByZWZpeENscywgXCItZm9jdXNlZFwiKSwgZm9jdXNlZCksIFwiXCIuY29uY2F0KGFmZml4V3JhcHBlclByZWZpeENscywgXCItcmVhZG9ubHlcIiksIHJlYWRPbmx5KSwgXCJcIi5jb25jYXQoYWZmaXhXcmFwcGVyUHJlZml4Q2xzLCBcIi1pbnB1dC13aXRoLWNsZWFyLWJ0blwiKSwgc3VmZml4ICYmIGFsbG93Q2xlYXIgJiYgdmFsdWUpLCBjbGFzc2VzID09PSBudWxsIHx8IGNsYXNzZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNsYXNzZXMuYWZmaXhXcmFwcGVyLCBjbGFzc05hbWVzID09PSBudWxsIHx8IGNsYXNzTmFtZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNsYXNzTmFtZXMuYWZmaXhXcmFwcGVyLCBjbGFzc05hbWVzID09PSBudWxsIHx8IGNsYXNzTmFtZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNsYXNzTmFtZXMudmFyaWFudCk7XG4gICAgdmFyIHN1ZmZpeE5vZGUgPSAoc3VmZml4IHx8IGFsbG93Q2xlYXIpICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IGNsc3goXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zdWZmaXhcIiksIGNsYXNzTmFtZXMgPT09IG51bGwgfHwgY2xhc3NOYW1lcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2xhc3NOYW1lcy5zdWZmaXgpLFxuICAgICAgc3R5bGU6IHN0eWxlcyA9PT0gbnVsbCB8fCBzdHlsZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0eWxlcy5zdWZmaXhcbiAgICB9LCBjbGVhckljb24sIHN1ZmZpeCk7XG4gICAgZWxlbWVudCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFmZml4V3JhcHBlckNvbXBvbmVudCwgX2V4dGVuZHMoe1xuICAgICAgY2xhc3NOYW1lOiBhZmZpeFdyYXBwZXJDbHMsXG4gICAgICBzdHlsZTogc3R5bGVzID09PSBudWxsIHx8IHN0eWxlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3R5bGVzLmFmZml4V3JhcHBlcixcbiAgICAgIG9uQ2xpY2s6IG9uSW5wdXRDbGlja1xuICAgIH0sIGRhdGFBdHRycyA9PT0gbnVsbCB8fCBkYXRhQXR0cnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRhdGFBdHRycy5hZmZpeFdyYXBwZXIsIHtcbiAgICAgIHJlZjogY29udGFpbmVyUmVmXG4gICAgfSksIHByZWZpeCAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBjbHN4KFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcHJlZml4XCIpLCBjbGFzc05hbWVzID09PSBudWxsIHx8IGNsYXNzTmFtZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNsYXNzTmFtZXMucHJlZml4KSxcbiAgICAgIHN0eWxlOiBzdHlsZXMgPT09IG51bGwgfHwgc3R5bGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdHlsZXMucHJlZml4XG4gICAgfSwgcHJlZml4KSwgZWxlbWVudCwgc3VmZml4Tm9kZSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT0gQWRkb24gPT09PT09PT09PT09PT09PT09IC8vXG4gIGlmIChoYXNBZGRvbihwcm9wcykpIHtcbiAgICB2YXIgd3JhcHBlckNscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZ3JvdXBcIik7XG4gICAgdmFyIGFkZG9uQ2xzID0gXCJcIi5jb25jYXQod3JhcHBlckNscywgXCItYWRkb25cIik7XG4gICAgdmFyIGdyb3VwV3JhcHBlckNscyA9IFwiXCIuY29uY2F0KHdyYXBwZXJDbHMsIFwiLXdyYXBwZXJcIik7XG4gICAgdmFyIG1lcmdlZFdyYXBwZXJDbGFzc05hbWUgPSBjbHN4KFwiXCIuY29uY2F0KHByZWZpeENscywgXCItd3JhcHBlclwiKSwgd3JhcHBlckNscywgY2xhc3NlcyA9PT0gbnVsbCB8fCBjbGFzc2VzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjbGFzc2VzLndyYXBwZXIsIGNsYXNzTmFtZXMgPT09IG51bGwgfHwgY2xhc3NOYW1lcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2xhc3NOYW1lcy53cmFwcGVyKTtcbiAgICB2YXIgbWVyZ2VkR3JvdXBDbGFzc05hbWUgPSBjbHN4KGdyb3VwV3JhcHBlckNscywgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChncm91cFdyYXBwZXJDbHMsIFwiLWRpc2FibGVkXCIpLCBkaXNhYmxlZCksIGNsYXNzZXMgPT09IG51bGwgfHwgY2xhc3NlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2xhc3Nlcy5ncm91cCwgY2xhc3NOYW1lcyA9PT0gbnVsbCB8fCBjbGFzc05hbWVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjbGFzc05hbWVzLmdyb3VwV3JhcHBlcik7XG5cbiAgICAvLyBOZWVkIGFub3RoZXIgd3JhcHBlciBmb3IgY2hhbmdpbmcgZGlzcGxheTp0YWJsZSB0byBkaXNwbGF5OmlubGluZS1ibG9ja1xuICAgIC8vIGFuZCBwdXQgc3R5bGUgcHJvcCBpbiB3cmFwcGVyXG4gICAgZWxlbWVudCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEdyb3VwV3JhcHBlckNvbXBvbmVudCwge1xuICAgICAgY2xhc3NOYW1lOiBtZXJnZWRHcm91cENsYXNzTmFtZSxcbiAgICAgIHJlZjogZ3JvdXBSZWZcbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChXcmFwcGVyQ29tcG9uZW50LCB7XG4gICAgICBjbGFzc05hbWU6IG1lcmdlZFdyYXBwZXJDbGFzc05hbWVcbiAgICB9LCBhZGRvbkJlZm9yZSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChHcm91cEFkZG9uQ29tcG9uZW50LCB7XG4gICAgICBjbGFzc05hbWU6IGFkZG9uQ2xzXG4gICAgfSwgYWRkb25CZWZvcmUpLCBlbGVtZW50LCBhZGRvbkFmdGVyICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEdyb3VwQWRkb25Db21wb25lbnQsIHtcbiAgICAgIGNsYXNzTmFtZTogYWRkb25DbHNcbiAgICB9LCBhZGRvbkFmdGVyKSkpO1xuICB9XG5cbiAgLy8gYGNsYXNzTmFtZWAgYW5kIGBzdHlsZWAgYXJlIGFsd2F5cyBvbiB0aGUgcm9vdCBlbGVtZW50XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICBjbGFzc05hbWU6IGNsc3goKF9wcm9wczIgPSBlbGVtZW50LnByb3BzKSA9PT0gbnVsbCB8fCBfcHJvcHMyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfcHJvcHMyLmNsYXNzTmFtZSwgY2xhc3NOYW1lKSB8fCBudWxsLFxuICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIChfcHJvcHMzID0gZWxlbWVudC5wcm9wcykgPT09IG51bGwgfHwgX3Byb3BzMyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3Byb3BzMy5zdHlsZSksIHN0eWxlKSxcbiAgICBoaWRkZW46IGhpZGRlblxuICB9KTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgQmFzZUlucHV0OyIsICJleHBvcnQgZnVuY3Rpb24gaGFzQWRkb24ocHJvcHMpIHtcbiAgcmV0dXJuICEhKHByb3BzLmFkZG9uQmVmb3JlIHx8IHByb3BzLmFkZG9uQWZ0ZXIpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGhhc1ByZWZpeFN1ZmZpeChwcm9wcykge1xuICByZXR1cm4gISEocHJvcHMucHJlZml4IHx8IHByb3BzLnN1ZmZpeCB8fCBwcm9wcy5hbGxvd0NsZWFyKTtcbn1cblxuLy8gVE9ETzogSXQncyBiZXR0ZXIgdG8gdXNlIGBQcm94eWAgcmVwbGFjZSB0aGUgYGVsZW1lbnQudmFsdWVgLiBCdXQgd2Ugc3RpbGwgbmVlZCBzdXBwb3J0IElFMTEuXG5mdW5jdGlvbiBjbG9uZUV2ZW50KGV2ZW50LCB0YXJnZXQsIHZhbHVlKSB7XG4gIC8vIEEgYnVnIHJlcG9ydCBmaWxlZCBvbiBXZWJLaXQncyBCdWd6aWxsYSB0cmFja2VyLCBkYXRpbmcgYmFjayB0byAyMDA5LCBzcGVjaWZpY2FsbHkgYWRkcmVzc2VzIHRoZSBpc3N1ZSBvZiBjbG9uZU5vZGUoKSBub3QgY29weWluZyBmaWxlcyBvZiA8aW5wdXQgdHlwZT1cImZpbGVcIj4gZWxlbWVudHMuXG4gIC8vIEFzIG9mIHRoZSBsYXN0IHVwZGF0ZSwgdGhpcyBidWcgd2FzIHN0aWxsIG1hcmtlZCBhcyBcIk5FVyxcIiBpbmRpY2F0aW5nIHRoYXQgaXQgbWlnaHQgbm90IGhhdmUgYmVlbiByZXNvbHZlZCB5ZXRcdTIwMEJcdTIwMEIuXG4gIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yODEyM1xuICB2YXIgY3VycmVudFRhcmdldCA9IHRhcmdldC5jbG9uZU5vZGUodHJ1ZSk7XG5cbiAgLy8gY2xpY2sgY2xlYXIgaWNvblxuICB2YXIgbmV3RXZlbnQgPSBPYmplY3QuY3JlYXRlKGV2ZW50LCB7XG4gICAgdGFyZ2V0OiB7XG4gICAgICB2YWx1ZTogY3VycmVudFRhcmdldFxuICAgIH0sXG4gICAgY3VycmVudFRhcmdldDoge1xuICAgICAgdmFsdWU6IGN1cnJlbnRUYXJnZXRcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEZpbGwgZGF0YVxuICBjdXJyZW50VGFyZ2V0LnZhbHVlID0gdmFsdWU7XG5cbiAgLy8gRmlsbCBzZWxlY3Rpb24uIFNvbWUgdHlwZSBsaWtlIGBlbWFpbGAgbm90IHN1cHBvcnQgc2VsZWN0aW9uXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzQ3ODMzXG4gIGlmICh0eXBlb2YgdGFyZ2V0LnNlbGVjdGlvblN0YXJ0ID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgdGFyZ2V0LnNlbGVjdGlvbkVuZCA9PT0gJ251bWJlcicpIHtcbiAgICBjdXJyZW50VGFyZ2V0LnNlbGVjdGlvblN0YXJ0ID0gdGFyZ2V0LnNlbGVjdGlvblN0YXJ0O1xuICAgIGN1cnJlbnRUYXJnZXQuc2VsZWN0aW9uRW5kID0gdGFyZ2V0LnNlbGVjdGlvbkVuZDtcbiAgfVxuICBjdXJyZW50VGFyZ2V0LnNldFNlbGVjdGlvblJhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgIHRhcmdldC5zZXRTZWxlY3Rpb25SYW5nZS5hcHBseSh0YXJnZXQsIGFyZ3VtZW50cyk7XG4gIH07XG4gIHJldHVybiBuZXdFdmVudDtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlT25DaGFuZ2UodGFyZ2V0LCBlLCBvbkNoYW5nZSwgdGFyZ2V0VmFsdWUpIHtcbiAgaWYgKCFvbkNoYW5nZSkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgZXZlbnQgPSBlO1xuICBpZiAoZS50eXBlID09PSAnY2xpY2snKSB7XG4gICAgLy8gQ2xvbmUgYSBuZXcgdGFyZ2V0IGZvciBldmVudC5cbiAgICAvLyBBdm9pZCB0aGUgZm9sbG93aW5nIHVzYWdlLCB0aGUgc2V0UXVlcnkgbWV0aG9kIGdldHMgdGhlIG9yaWdpbmFsIHZhbHVlLlxuICAgIC8vXG4gICAgLy8gY29uc3QgW3F1ZXJ5LCBzZXRRdWVyeV0gPSBSZWFjdC51c2VTdGF0ZSgnJyk7XG4gICAgLy8gPElucHV0XG4gICAgLy8gICBhbGxvd0NsZWFyXG4gICAgLy8gICB2YWx1ZT17cXVlcnl9XG4gICAgLy8gICBvbkNoYW5nZT17KGUpPT4ge1xuICAgIC8vICAgICBzZXRRdWVyeSgocHJldlN0YXR1cykgPT4gZS50YXJnZXQudmFsdWUpO1xuICAgIC8vICAgfX1cbiAgICAvLyAvPlxuXG4gICAgZXZlbnQgPSBjbG9uZUV2ZW50KGUsIHRhcmdldCwgJycpO1xuICAgIG9uQ2hhbmdlKGV2ZW50KTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBUcmlnZ2VyIGJ5IGNvbXBvc2l0aW9uIGV2ZW50LCB0aGlzIG1lYW5zIHdlIG5lZWQgZm9yY2UgY2hhbmdlIHRoZSBpbnB1dCB2YWx1ZVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy80NTczN1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy80NjU5OFxuICBpZiAodGFyZ2V0LnR5cGUgIT09ICdmaWxlJyAmJiB0YXJnZXRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZXZlbnQgPSBjbG9uZUV2ZW50KGUsIHRhcmdldCwgdGFyZ2V0VmFsdWUpO1xuICAgIG9uQ2hhbmdlKGV2ZW50KTtcbiAgICByZXR1cm47XG4gIH1cbiAgb25DaGFuZ2UoZXZlbnQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRyaWdnZXJGb2N1cyhlbGVtZW50LCBvcHRpb24pIHtcbiAgaWYgKCFlbGVtZW50KSByZXR1cm47XG4gIGVsZW1lbnQuZm9jdXMob3B0aW9uKTtcblxuICAvLyBTZWxlY3Rpb24gY29udGVudFxuICB2YXIgX3JlZiA9IG9wdGlvbiB8fCB7fSxcbiAgICBjdXJzb3IgPSBfcmVmLmN1cnNvcjtcbiAgaWYgKGN1cnNvcikge1xuICAgIHZhciBsZW4gPSBlbGVtZW50LnZhbHVlLmxlbmd0aDtcbiAgICBzd2l0Y2ggKGN1cnNvcikge1xuICAgICAgY2FzZSAnc3RhcnQnOlxuICAgICAgICBlbGVtZW50LnNldFNlbGVjdGlvblJhbmdlKDAsIDApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgIGVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UobGVuLCBsZW4pO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgbGVuKTtcbiAgICB9XG4gIH1cbn0iLCAiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiYXV0b0NvbXBsZXRlXCIsIFwib25DaGFuZ2VcIiwgXCJvbkZvY3VzXCIsIFwib25CbHVyXCIsIFwib25QcmVzc0VudGVyXCIsIFwib25LZXlEb3duXCIsIFwib25LZXlVcFwiLCBcInByZWZpeENsc1wiLCBcImRpc2FibGVkXCIsIFwiaHRtbFNpemVcIiwgXCJjbGFzc05hbWVcIiwgXCJtYXhMZW5ndGhcIiwgXCJzdWZmaXhcIiwgXCJzaG93Q291bnRcIiwgXCJjb3VudFwiLCBcInR5cGVcIiwgXCJjbGFzc2VzXCIsIFwiY2xhc3NOYW1lc1wiLCBcInN0eWxlc1wiLCBcIm9uQ29tcG9zaXRpb25TdGFydFwiLCBcIm9uQ29tcG9zaXRpb25FbmRcIl07XG5pbXBvcnQgY2xzeCBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB1c2VNZXJnZWRTdGF0ZSBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VNZXJnZWRTdGF0ZVwiO1xuaW1wb3J0IG9taXQgZnJvbSBcInJjLXV0aWwvZXMvb21pdFwiO1xuaW1wb3J0IFJlYWN0LCB7IGZvcndhcmRSZWYsIHVzZUVmZmVjdCwgdXNlSW1wZXJhdGl2ZUhhbmRsZSwgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBCYXNlSW5wdXQgZnJvbSBcIi4vQmFzZUlucHV0XCI7XG5pbXBvcnQgdXNlQ291bnQgZnJvbSBcIi4vaG9va3MvdXNlQ291bnRcIjtcbmltcG9ydCB7IHJlc29sdmVPbkNoYW5nZSwgdHJpZ2dlckZvY3VzIH0gZnJvbSBcIi4vdXRpbHMvY29tbW9uVXRpbHNcIjtcbnZhciBJbnB1dCA9IC8qI19fUFVSRV9fKi9mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBhdXRvQ29tcGxldGUgPSBwcm9wcy5hdXRvQ29tcGxldGUsXG4gICAgb25DaGFuZ2UgPSBwcm9wcy5vbkNoYW5nZSxcbiAgICBvbkZvY3VzID0gcHJvcHMub25Gb2N1cyxcbiAgICBvbkJsdXIgPSBwcm9wcy5vbkJsdXIsXG4gICAgb25QcmVzc0VudGVyID0gcHJvcHMub25QcmVzc0VudGVyLFxuICAgIG9uS2V5RG93biA9IHByb3BzLm9uS2V5RG93bixcbiAgICBvbktleVVwID0gcHJvcHMub25LZXlVcCxcbiAgICBfcHJvcHMkcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIHByZWZpeENscyA9IF9wcm9wcyRwcmVmaXhDbHMgPT09IHZvaWQgMCA/ICdyYy1pbnB1dCcgOiBfcHJvcHMkcHJlZml4Q2xzLFxuICAgIGRpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgaHRtbFNpemUgPSBwcm9wcy5odG1sU2l6ZSxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgbWF4TGVuZ3RoID0gcHJvcHMubWF4TGVuZ3RoLFxuICAgIHN1ZmZpeCA9IHByb3BzLnN1ZmZpeCxcbiAgICBzaG93Q291bnQgPSBwcm9wcy5zaG93Q291bnQsXG4gICAgY291bnQgPSBwcm9wcy5jb3VudCxcbiAgICBfcHJvcHMkdHlwZSA9IHByb3BzLnR5cGUsXG4gICAgdHlwZSA9IF9wcm9wcyR0eXBlID09PSB2b2lkIDAgPyAndGV4dCcgOiBfcHJvcHMkdHlwZSxcbiAgICBjbGFzc2VzID0gcHJvcHMuY2xhc3NlcyxcbiAgICBjbGFzc05hbWVzID0gcHJvcHMuY2xhc3NOYW1lcyxcbiAgICBzdHlsZXMgPSBwcm9wcy5zdHlsZXMsXG4gICAgX29uQ29tcG9zaXRpb25TdGFydCA9IHByb3BzLm9uQ29tcG9zaXRpb25TdGFydCxcbiAgICBvbkNvbXBvc2l0aW9uRW5kID0gcHJvcHMub25Db21wb3NpdGlvbkVuZCxcbiAgICByZXN0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBfZXhjbHVkZWQpO1xuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUoZmFsc2UpLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIGZvY3VzZWQgPSBfdXNlU3RhdGUyWzBdLFxuICAgIHNldEZvY3VzZWQgPSBfdXNlU3RhdGUyWzFdO1xuICB2YXIgY29tcG9zaXRpb25SZWYgPSB1c2VSZWYoZmFsc2UpO1xuICB2YXIga2V5TG9ja1JlZiA9IHVzZVJlZihmYWxzZSk7XG4gIHZhciBpbnB1dFJlZiA9IHVzZVJlZihudWxsKTtcbiAgdmFyIGhvbGRlclJlZiA9IHVzZVJlZihudWxsKTtcbiAgdmFyIGZvY3VzID0gZnVuY3Rpb24gZm9jdXMob3B0aW9uKSB7XG4gICAgaWYgKGlucHV0UmVmLmN1cnJlbnQpIHtcbiAgICAgIHRyaWdnZXJGb2N1cyhpbnB1dFJlZi5jdXJyZW50LCBvcHRpb24pO1xuICAgIH1cbiAgfTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09IFZhbHVlID09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfdXNlTWVyZ2VkU3RhdGUgPSB1c2VNZXJnZWRTdGF0ZShwcm9wcy5kZWZhdWx0VmFsdWUsIHtcbiAgICAgIHZhbHVlOiBwcm9wcy52YWx1ZVxuICAgIH0pLFxuICAgIF91c2VNZXJnZWRTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlTWVyZ2VkU3RhdGUsIDIpLFxuICAgIHZhbHVlID0gX3VzZU1lcmdlZFN0YXRlMlswXSxcbiAgICBzZXRWYWx1ZSA9IF91c2VNZXJnZWRTdGF0ZTJbMV07XG4gIHZhciBmb3JtYXRWYWx1ZSA9IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgPyAnJyA6IFN0cmluZyh2YWx1ZSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PSBTZWxlY3QgUmFuZ2UgPT09PT09PT09PT09PT09PT09PVxuICB2YXIgX3VzZVN0YXRlMyA9IHVzZVN0YXRlKG51bGwpLFxuICAgIF91c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUzLCAyKSxcbiAgICBzZWxlY3Rpb24gPSBfdXNlU3RhdGU0WzBdLFxuICAgIHNldFNlbGVjdGlvbiA9IF91c2VTdGF0ZTRbMV07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PSBDb3VudCA9PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgY291bnRDb25maWcgPSB1c2VDb3VudChjb3VudCwgc2hvd0NvdW50KTtcbiAgdmFyIG1lcmdlZE1heCA9IGNvdW50Q29uZmlnLm1heCB8fCBtYXhMZW5ndGg7XG4gIHZhciB2YWx1ZUxlbmd0aCA9IGNvdW50Q29uZmlnLnN0cmF0ZWd5KGZvcm1hdFZhbHVlKTtcbiAgdmFyIGlzT3V0T2ZSYW5nZSA9ICEhbWVyZ2VkTWF4ICYmIHZhbHVlTGVuZ3RoID4gbWVyZ2VkTWF4O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09IFJlZiA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX2hvbGRlclJlZiRjdXJyZW50O1xuICAgIHJldHVybiB7XG4gICAgICBmb2N1czogZm9jdXMsXG4gICAgICBibHVyOiBmdW5jdGlvbiBibHVyKCkge1xuICAgICAgICB2YXIgX2lucHV0UmVmJGN1cnJlbnQ7XG4gICAgICAgIChfaW5wdXRSZWYkY3VycmVudCA9IGlucHV0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9pbnB1dFJlZiRjdXJyZW50ID09PSB2b2lkIDAgfHwgX2lucHV0UmVmJGN1cnJlbnQuYmx1cigpO1xuICAgICAgfSxcbiAgICAgIHNldFNlbGVjdGlvblJhbmdlOiBmdW5jdGlvbiBzZXRTZWxlY3Rpb25SYW5nZShzdGFydCwgZW5kLCBkaXJlY3Rpb24pIHtcbiAgICAgICAgdmFyIF9pbnB1dFJlZiRjdXJyZW50MjtcbiAgICAgICAgKF9pbnB1dFJlZiRjdXJyZW50MiA9IGlucHV0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9pbnB1dFJlZiRjdXJyZW50MiA9PT0gdm9pZCAwIHx8IF9pbnB1dFJlZiRjdXJyZW50Mi5zZXRTZWxlY3Rpb25SYW5nZShzdGFydCwgZW5kLCBkaXJlY3Rpb24pO1xuICAgICAgfSxcbiAgICAgIHNlbGVjdDogZnVuY3Rpb24gc2VsZWN0KCkge1xuICAgICAgICB2YXIgX2lucHV0UmVmJGN1cnJlbnQzO1xuICAgICAgICAoX2lucHV0UmVmJGN1cnJlbnQzID0gaW5wdXRSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2lucHV0UmVmJGN1cnJlbnQzID09PSB2b2lkIDAgfHwgX2lucHV0UmVmJGN1cnJlbnQzLnNlbGVjdCgpO1xuICAgICAgfSxcbiAgICAgIGlucHV0OiBpbnB1dFJlZi5jdXJyZW50LFxuICAgICAgbmF0aXZlRWxlbWVudDogKChfaG9sZGVyUmVmJGN1cnJlbnQgPSBob2xkZXJSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2hvbGRlclJlZiRjdXJyZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfaG9sZGVyUmVmJGN1cnJlbnQubmF0aXZlRWxlbWVudCkgfHwgaW5wdXRSZWYuY3VycmVudFxuICAgIH07XG4gIH0pO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChrZXlMb2NrUmVmLmN1cnJlbnQpIHtcbiAgICAgIGtleUxvY2tSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIH1cbiAgICBzZXRGb2N1c2VkKGZ1bmN0aW9uIChwcmV2KSB7XG4gICAgICByZXR1cm4gcHJldiAmJiBkaXNhYmxlZCA/IGZhbHNlIDogcHJldjtcbiAgICB9KTtcbiAgfSwgW2Rpc2FibGVkXSk7XG4gIHZhciB0cmlnZ2VyQ2hhbmdlID0gZnVuY3Rpb24gdHJpZ2dlckNoYW5nZShlLCBjdXJyZW50VmFsdWUsIGluZm8pIHtcbiAgICB2YXIgY3V0VmFsdWUgPSBjdXJyZW50VmFsdWU7XG4gICAgaWYgKCFjb21wb3NpdGlvblJlZi5jdXJyZW50ICYmIGNvdW50Q29uZmlnLmV4Y2VlZEZvcm1hdHRlciAmJiBjb3VudENvbmZpZy5tYXggJiYgY291bnRDb25maWcuc3RyYXRlZ3koY3VycmVudFZhbHVlKSA+IGNvdW50Q29uZmlnLm1heCkge1xuICAgICAgY3V0VmFsdWUgPSBjb3VudENvbmZpZy5leGNlZWRGb3JtYXR0ZXIoY3VycmVudFZhbHVlLCB7XG4gICAgICAgIG1heDogY291bnRDb25maWcubWF4XG4gICAgICB9KTtcbiAgICAgIGlmIChjdXJyZW50VmFsdWUgIT09IGN1dFZhbHVlKSB7XG4gICAgICAgIHZhciBfaW5wdXRSZWYkY3VycmVudDQsIF9pbnB1dFJlZiRjdXJyZW50NTtcbiAgICAgICAgc2V0U2VsZWN0aW9uKFsoKF9pbnB1dFJlZiRjdXJyZW50NCA9IGlucHV0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9pbnB1dFJlZiRjdXJyZW50NCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2lucHV0UmVmJGN1cnJlbnQ0LnNlbGVjdGlvblN0YXJ0KSB8fCAwLCAoKF9pbnB1dFJlZiRjdXJyZW50NSA9IGlucHV0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9pbnB1dFJlZiRjdXJyZW50NSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2lucHV0UmVmJGN1cnJlbnQ1LnNlbGVjdGlvbkVuZCkgfHwgMF0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaW5mby5zb3VyY2UgPT09ICdjb21wb3NpdGlvbkVuZCcpIHtcbiAgICAgIC8vIEF2b2lkIHRyaWdnZXJpbmcgdHdpY2VcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzQ2NTg3XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNldFZhbHVlKGN1dFZhbHVlKTtcbiAgICBpZiAoaW5wdXRSZWYuY3VycmVudCkge1xuICAgICAgcmVzb2x2ZU9uQ2hhbmdlKGlucHV0UmVmLmN1cnJlbnQsIGUsIG9uQ2hhbmdlLCBjdXRWYWx1ZSk7XG4gICAgfVxuICB9O1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChzZWxlY3Rpb24pIHtcbiAgICAgIHZhciBfaW5wdXRSZWYkY3VycmVudDY7XG4gICAgICAoX2lucHV0UmVmJGN1cnJlbnQ2ID0gaW5wdXRSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2lucHV0UmVmJGN1cnJlbnQ2ID09PSB2b2lkIDAgfHwgX2lucHV0UmVmJGN1cnJlbnQ2LnNldFNlbGVjdGlvblJhbmdlLmFwcGx5KF9pbnB1dFJlZiRjdXJyZW50NiwgX3RvQ29uc3VtYWJsZUFycmF5KHNlbGVjdGlvbikpO1xuICAgIH1cbiAgfSwgW3NlbGVjdGlvbl0pO1xuICB2YXIgb25JbnRlcm5hbENoYW5nZSA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxDaGFuZ2UoZSkge1xuICAgIHRyaWdnZXJDaGFuZ2UoZSwgZS50YXJnZXQudmFsdWUsIHtcbiAgICAgIHNvdXJjZTogJ2NoYW5nZSdcbiAgICB9KTtcbiAgfTtcbiAgdmFyIG9uSW50ZXJuYWxDb21wb3NpdGlvbkVuZCA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxDb21wb3NpdGlvbkVuZChlKSB7XG4gICAgY29tcG9zaXRpb25SZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIHRyaWdnZXJDaGFuZ2UoZSwgZS5jdXJyZW50VGFyZ2V0LnZhbHVlLCB7XG4gICAgICBzb3VyY2U6ICdjb21wb3NpdGlvbkVuZCdcbiAgICB9KTtcbiAgICBvbkNvbXBvc2l0aW9uRW5kID09PSBudWxsIHx8IG9uQ29tcG9zaXRpb25FbmQgPT09IHZvaWQgMCB8fCBvbkNvbXBvc2l0aW9uRW5kKGUpO1xuICB9O1xuICB2YXIgaGFuZGxlS2V5RG93biA9IGZ1bmN0aW9uIGhhbmRsZUtleURvd24oZSkge1xuICAgIGlmIChvblByZXNzRW50ZXIgJiYgZS5rZXkgPT09ICdFbnRlcicgJiYgIWtleUxvY2tSZWYuY3VycmVudCkge1xuICAgICAga2V5TG9ja1JlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIG9uUHJlc3NFbnRlcihlKTtcbiAgICB9XG4gICAgb25LZXlEb3duID09PSBudWxsIHx8IG9uS2V5RG93biA9PT0gdm9pZCAwIHx8IG9uS2V5RG93bihlKTtcbiAgfTtcbiAgdmFyIGhhbmRsZUtleVVwID0gZnVuY3Rpb24gaGFuZGxlS2V5VXAoZSkge1xuICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJykge1xuICAgICAga2V5TG9ja1JlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgfVxuICAgIG9uS2V5VXAgPT09IG51bGwgfHwgb25LZXlVcCA9PT0gdm9pZCAwIHx8IG9uS2V5VXAoZSk7XG4gIH07XG4gIHZhciBoYW5kbGVGb2N1cyA9IGZ1bmN0aW9uIGhhbmRsZUZvY3VzKGUpIHtcbiAgICBzZXRGb2N1c2VkKHRydWUpO1xuICAgIG9uRm9jdXMgPT09IG51bGwgfHwgb25Gb2N1cyA9PT0gdm9pZCAwIHx8IG9uRm9jdXMoZSk7XG4gIH07XG4gIHZhciBoYW5kbGVCbHVyID0gZnVuY3Rpb24gaGFuZGxlQmx1cihlKSB7XG4gICAgaWYgKGtleUxvY2tSZWYuY3VycmVudCkge1xuICAgICAga2V5TG9ja1JlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgfVxuICAgIHNldEZvY3VzZWQoZmFsc2UpO1xuICAgIG9uQmx1ciA9PT0gbnVsbCB8fCBvbkJsdXIgPT09IHZvaWQgMCB8fCBvbkJsdXIoZSk7XG4gIH07XG4gIHZhciBoYW5kbGVSZXNldCA9IGZ1bmN0aW9uIGhhbmRsZVJlc2V0KGUpIHtcbiAgICBzZXRWYWx1ZSgnJyk7XG4gICAgZm9jdXMoKTtcbiAgICBpZiAoaW5wdXRSZWYuY3VycmVudCkge1xuICAgICAgcmVzb2x2ZU9uQ2hhbmdlKGlucHV0UmVmLmN1cnJlbnQsIGUsIG9uQ2hhbmdlKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PSBJbnB1dCA9PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgb3V0T2ZSYW5nZUNscyA9IGlzT3V0T2ZSYW5nZSAmJiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW91dC1vZi1yYW5nZVwiKTtcbiAgdmFyIGdldElucHV0RWxlbWVudCA9IGZ1bmN0aW9uIGdldElucHV0RWxlbWVudCgpIHtcbiAgICAvLyBGaXggaHR0cHM6Ly9mYi5tZS9yZWFjdC11bmtub3duLXByb3BcbiAgICB2YXIgb3RoZXJQcm9wcyA9IG9taXQocHJvcHMsIFsncHJlZml4Q2xzJywgJ29uUHJlc3NFbnRlcicsICdhZGRvbkJlZm9yZScsICdhZGRvbkFmdGVyJywgJ3ByZWZpeCcsICdzdWZmaXgnLCAnYWxsb3dDbGVhcicsXG4gICAgLy8gSW5wdXQgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQsXG4gICAgLy8gc3BlY2lmeSBlaXRoZXIgdGhlIHZhbHVlIHByb3AsIG9yIHRoZSBkZWZhdWx0VmFsdWUgcHJvcCwgYnV0IG5vdCBib3RoLlxuICAgICdkZWZhdWx0VmFsdWUnLCAnc2hvd0NvdW50JywgJ2NvdW50JywgJ2NsYXNzZXMnLCAnaHRtbFNpemUnLCAnc3R5bGVzJywgJ2NsYXNzTmFtZXMnLCAnb25DbGVhciddKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLCBfZXh0ZW5kcyh7XG4gICAgICBhdXRvQ29tcGxldGU6IGF1dG9Db21wbGV0ZVxuICAgIH0sIG90aGVyUHJvcHMsIHtcbiAgICAgIG9uQ2hhbmdlOiBvbkludGVybmFsQ2hhbmdlLFxuICAgICAgb25Gb2N1czogaGFuZGxlRm9jdXMsXG4gICAgICBvbkJsdXI6IGhhbmRsZUJsdXIsXG4gICAgICBvbktleURvd246IGhhbmRsZUtleURvd24sXG4gICAgICBvbktleVVwOiBoYW5kbGVLZXlVcCxcbiAgICAgIGNsYXNzTmFtZTogY2xzeChwcmVmaXhDbHMsIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kaXNhYmxlZFwiKSwgZGlzYWJsZWQpLCBjbGFzc05hbWVzID09PSBudWxsIHx8IGNsYXNzTmFtZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNsYXNzTmFtZXMuaW5wdXQpLFxuICAgICAgc3R5bGU6IHN0eWxlcyA9PT0gbnVsbCB8fCBzdHlsZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0eWxlcy5pbnB1dCxcbiAgICAgIHJlZjogaW5wdXRSZWYsXG4gICAgICBzaXplOiBodG1sU2l6ZSxcbiAgICAgIHR5cGU6IHR5cGUsXG4gICAgICBvbkNvbXBvc2l0aW9uU3RhcnQ6IGZ1bmN0aW9uIG9uQ29tcG9zaXRpb25TdGFydChlKSB7XG4gICAgICAgIGNvbXBvc2l0aW9uUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICBfb25Db21wb3NpdGlvblN0YXJ0ID09PSBudWxsIHx8IF9vbkNvbXBvc2l0aW9uU3RhcnQgPT09IHZvaWQgMCB8fCBfb25Db21wb3NpdGlvblN0YXJ0KGUpO1xuICAgICAgfSxcbiAgICAgIG9uQ29tcG9zaXRpb25FbmQ6IG9uSW50ZXJuYWxDb21wb3NpdGlvbkVuZFxuICAgIH0pKTtcbiAgfTtcbiAgdmFyIGdldFN1ZmZpeCA9IGZ1bmN0aW9uIGdldFN1ZmZpeCgpIHtcbiAgICAvLyBNYXggbGVuZ3RoIHZhbHVlXG4gICAgdmFyIGhhc01heExlbmd0aCA9IE51bWJlcihtZXJnZWRNYXgpID4gMDtcbiAgICBpZiAoc3VmZml4IHx8IGNvdW50Q29uZmlnLnNob3cpIHtcbiAgICAgIHZhciBkYXRhQ291bnQgPSBjb3VudENvbmZpZy5zaG93Rm9ybWF0dGVyID8gY291bnRDb25maWcuc2hvd0Zvcm1hdHRlcih7XG4gICAgICAgIHZhbHVlOiBmb3JtYXRWYWx1ZSxcbiAgICAgICAgY291bnQ6IHZhbHVlTGVuZ3RoLFxuICAgICAgICBtYXhMZW5ndGg6IG1lcmdlZE1heFxuICAgICAgfSkgOiBcIlwiLmNvbmNhdCh2YWx1ZUxlbmd0aCkuY29uY2F0KGhhc01heExlbmd0aCA/IFwiIC8gXCIuY29uY2F0KG1lcmdlZE1heCkgOiAnJyk7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIGNvdW50Q29uZmlnLnNob3cgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBjbHN4KFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2hvdy1jb3VudC1zdWZmaXhcIiksIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zaG93LWNvdW50LWhhcy1zdWZmaXhcIiksICEhc3VmZml4KSwgY2xhc3NOYW1lcyA9PT0gbnVsbCB8fCBjbGFzc05hbWVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjbGFzc05hbWVzLmNvdW50KSxcbiAgICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoe30sIHN0eWxlcyA9PT0gbnVsbCB8fCBzdHlsZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0eWxlcy5jb3VudClcbiAgICAgIH0sIGRhdGFDb3VudCksIHN1ZmZpeCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEJhc2VJbnB1dCwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBjbGFzc05hbWU6IGNsc3goY2xhc3NOYW1lLCBvdXRPZlJhbmdlQ2xzKSxcbiAgICBoYW5kbGVSZXNldDogaGFuZGxlUmVzZXQsXG4gICAgdmFsdWU6IGZvcm1hdFZhbHVlLFxuICAgIGZvY3VzZWQ6IGZvY3VzZWQsXG4gICAgdHJpZ2dlckZvY3VzOiBmb2N1cyxcbiAgICBzdWZmaXg6IGdldFN1ZmZpeCgpLFxuICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICBjbGFzc2VzOiBjbGFzc2VzLFxuICAgIGNsYXNzTmFtZXM6IGNsYXNzTmFtZXMsXG4gICAgc3R5bGVzOiBzdHlsZXMsXG4gICAgcmVmOiBob2xkZXJSZWZcbiAgfSksIGdldElucHV0RWxlbWVudCgpKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgSW5wdXQ7IiwgImltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xudmFyIF9leGNsdWRlZCA9IFtcInNob3dcIl07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG4vKipcbiAqIEN1dCBgdmFsdWVgIGJ5IHRoZSBgY291bnQubWF4YCBwcm9wLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5Db3VudFJhbmdlKHZhbHVlLCBjb3VudENvbmZpZykge1xuICBpZiAoIWNvdW50Q29uZmlnLm1heCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHZhciBjb3VudCA9IGNvdW50Q29uZmlnLnN0cmF0ZWd5KHZhbHVlKTtcbiAgcmV0dXJuIGNvdW50IDw9IGNvdW50Q29uZmlnLm1heDtcbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUNvdW50KGNvdW50LCBzaG93Q291bnQpIHtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBtZXJnZWRDb25maWcgPSB7fTtcbiAgICBpZiAoc2hvd0NvdW50KSB7XG4gICAgICBtZXJnZWRDb25maWcuc2hvdyA9IF90eXBlb2Yoc2hvd0NvdW50KSA9PT0gJ29iamVjdCcgJiYgc2hvd0NvdW50LmZvcm1hdHRlciA/IHNob3dDb3VudC5mb3JtYXR0ZXIgOiAhIXNob3dDb3VudDtcbiAgICB9XG4gICAgbWVyZ2VkQ29uZmlnID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBtZXJnZWRDb25maWcpLCBjb3VudCk7XG4gICAgdmFyIF9yZWYgPSBtZXJnZWRDb25maWcsXG4gICAgICBzaG93ID0gX3JlZi5zaG93LFxuICAgICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBfZXhjbHVkZWQpO1xuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHJlc3QpLCB7fSwge1xuICAgICAgc2hvdzogISFzaG93LFxuICAgICAgc2hvd0Zvcm1hdHRlcjogdHlwZW9mIHNob3cgPT09ICdmdW5jdGlvbicgPyBzaG93IDogdW5kZWZpbmVkLFxuICAgICAgc3RyYXRlZ3k6IHJlc3Quc3RyYXRlZ3kgfHwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5sZW5ndGg7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sIFtjb3VudCwgc2hvd0NvdW50XSk7XG59IiwgImltcG9ydCBCYXNlSW5wdXQgZnJvbSBcIi4vQmFzZUlucHV0XCI7XG5pbXBvcnQgSW5wdXQgZnJvbSBcIi4vSW5wdXRcIjtcbmV4cG9ydCB7IEJhc2VJbnB1dCB9O1xuZXhwb3J0IGRlZmF1bHQgSW5wdXQ7IiwgIi8qKlxuICogUHJveHkgb2JqZWN0IGlmIGVudmlyb25tZW50IHN1cHBvcnRlZFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwcm94eU9iamVjdChvYmosIGV4dGVuZFByb3BzKSB7XG4gIGlmICh0eXBlb2YgUHJveHkgIT09ICd1bmRlZmluZWQnICYmIG9iaikge1xuICAgIHJldHVybiBuZXcgUHJveHkob2JqLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCh0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgaWYgKGV4dGVuZFByb3BzW3Byb3BdKSB7XG4gICAgICAgICAgcmV0dXJuIGV4dGVuZFByb3BzW3Byb3BdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHJveHkgb3JpZ2luIHByb3BlcnR5XG4gICAgICAgIHZhciBvcmlnaW5Qcm9wID0gdGFyZ2V0W3Byb3BdO1xuICAgICAgICByZXR1cm4gdHlwZW9mIG9yaWdpblByb3AgPT09ICdmdW5jdGlvbicgPyBvcmlnaW5Qcm9wLmJpbmQodGFyZ2V0KSA6IG9yaWdpblByb3A7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG9iajtcbn0iLCAiaW1wb3J0IHsgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuLyoqXG4gKiBLZWVwIGlucHV0IGN1cnNvciBpbiB0aGUgY29ycmVjdCBwb3NpdGlvbiBpZiBwb3NzaWJsZS5cbiAqIElzIHRoaXMgbmVjZXNzYXJ5IHNpbmNlIHdlIGhhdmUgYGZvcm1hdHRlcmAgd2hpY2ggbWF5IG1hc3MgdGhlIGNvbnRlbnQ/XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUN1cnNvcihpbnB1dCwgZm9jdXNlZCkge1xuICB2YXIgc2VsZWN0aW9uUmVmID0gdXNlUmVmKG51bGwpO1xuICBmdW5jdGlvbiByZWNvcmRDdXJzb3IoKSB7XG4gICAgLy8gUmVjb3JkIHBvc2l0aW9uXG4gICAgdHJ5IHtcbiAgICAgIHZhciBzdGFydCA9IGlucHV0LnNlbGVjdGlvblN0YXJ0LFxuICAgICAgICBlbmQgPSBpbnB1dC5zZWxlY3Rpb25FbmQsXG4gICAgICAgIHZhbHVlID0gaW5wdXQudmFsdWU7XG4gICAgICB2YXIgYmVmb3JlVHh0ID0gdmFsdWUuc3Vic3RyaW5nKDAsIHN0YXJ0KTtcbiAgICAgIHZhciBhZnRlclR4dCA9IHZhbHVlLnN1YnN0cmluZyhlbmQpO1xuICAgICAgc2VsZWN0aW9uUmVmLmN1cnJlbnQgPSB7XG4gICAgICAgIHN0YXJ0OiBzdGFydCxcbiAgICAgICAgZW5kOiBlbmQsXG4gICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgYmVmb3JlVHh0OiBiZWZvcmVUeHQsXG4gICAgICAgIGFmdGVyVHh0OiBhZnRlclR4dFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBGaXggZXJyb3IgaW4gQ2hyb21lOlxuICAgICAgLy8gRmFpbGVkIHRvIHJlYWQgdGhlICdzZWxlY3Rpb25TdGFydCcgcHJvcGVydHkgZnJvbSAnSFRNTElucHV0RWxlbWVudCdcbiAgICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xLzIxMTc3NDg5LzMwNDA2MDVcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZSBsb2dpYzpcbiAgICogIDEuIGJhY2sgc3RyaW5nIHNhbWVcbiAgICogIDIuIHN0YXJ0IHN0cmluZyBzYW1lXG4gICAqL1xuICBmdW5jdGlvbiByZXN0b3JlQ3Vyc29yKCkge1xuICAgIGlmIChpbnB1dCAmJiBzZWxlY3Rpb25SZWYuY3VycmVudCAmJiBmb2N1c2VkKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgdmFsdWUgPSBpbnB1dC52YWx1ZTtcbiAgICAgICAgdmFyIF9zZWxlY3Rpb25SZWYkY3VycmVudCA9IHNlbGVjdGlvblJlZi5jdXJyZW50LFxuICAgICAgICAgIGJlZm9yZVR4dCA9IF9zZWxlY3Rpb25SZWYkY3VycmVudC5iZWZvcmVUeHQsXG4gICAgICAgICAgYWZ0ZXJUeHQgPSBfc2VsZWN0aW9uUmVmJGN1cnJlbnQuYWZ0ZXJUeHQsXG4gICAgICAgICAgc3RhcnQgPSBfc2VsZWN0aW9uUmVmJGN1cnJlbnQuc3RhcnQ7XG4gICAgICAgIHZhciBzdGFydFBvcyA9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoYmVmb3JlVHh0KSkge1xuICAgICAgICAgIHN0YXJ0UG9zID0gYmVmb3JlVHh0Lmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5lbmRzV2l0aChhZnRlclR4dCkpIHtcbiAgICAgICAgICBzdGFydFBvcyA9IHZhbHVlLmxlbmd0aCAtIHNlbGVjdGlvblJlZi5jdXJyZW50LmFmdGVyVHh0Lmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgYmVmb3JlTGFzdENoYXIgPSBiZWZvcmVUeHRbc3RhcnQgLSAxXTtcbiAgICAgICAgICB2YXIgbmV3SW5kZXggPSB2YWx1ZS5pbmRleE9mKGJlZm9yZUxhc3RDaGFyLCBzdGFydCAtIDEpO1xuICAgICAgICAgIGlmIChuZXdJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIHN0YXJ0UG9zID0gbmV3SW5kZXggKyAxO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZShzdGFydFBvcywgc3RhcnRQb3MpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB3YXJuaW5nKGZhbHNlLCBcIlNvbWV0aGluZyB3YXJuaW5nIG9mIGN1cnNvciByZXN0b3JlLiBQbGVhc2UgZmlyZSBpc3N1ZSBhYm91dCB0aGlzOiBcIi5jb25jYXQoZS5tZXNzYWdlKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBbcmVjb3JkQ3Vyc29yLCByZXN0b3JlQ3Vyc29yXTtcbn0iLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuLyogZXNsaW50LWRpc2FibGUgcmVhY3Qvbm8tdW5rbm93bi1wcm9wZXJ0eSAqL1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgdXNlTW9iaWxlIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZU1vYmlsZVwiO1xuaW1wb3J0IHJhZiBmcm9tIFwicmMtdXRpbC9lcy9yYWZcIjtcblxuLyoqXG4gKiBXaGVuIGNsaWNrIGFuZCBob2xkIG9uIGEgYnV0dG9uIC0gdGhlIHNwZWVkIG9mIGF1dG8gY2hhbmdpbmcgdGhlIHZhbHVlLlxuICovXG52YXIgU1RFUF9JTlRFUlZBTCA9IDIwMDtcblxuLyoqXG4gKiBXaGVuIGNsaWNrIGFuZCBob2xkIG9uIGEgYnV0dG9uIC0gdGhlIGRlbGF5IGJlZm9yZSBhdXRvIGNoYW5naW5nIHRoZSB2YWx1ZS5cbiAqL1xudmFyIFNURVBfREVMQVkgPSA2MDA7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBTdGVwSGFuZGxlcihfcmVmKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscyxcbiAgICB1cE5vZGUgPSBfcmVmLnVwTm9kZSxcbiAgICBkb3duTm9kZSA9IF9yZWYuZG93bk5vZGUsXG4gICAgdXBEaXNhYmxlZCA9IF9yZWYudXBEaXNhYmxlZCxcbiAgICBkb3duRGlzYWJsZWQgPSBfcmVmLmRvd25EaXNhYmxlZCxcbiAgICBvblN0ZXAgPSBfcmVmLm9uU3RlcDtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IFN0ZXAgPT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBzdGVwVGltZW91dFJlZiA9IFJlYWN0LnVzZVJlZigpO1xuICB2YXIgZnJhbWVJZHMgPSBSZWFjdC51c2VSZWYoW10pO1xuICB2YXIgb25TdGVwUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIG9uU3RlcFJlZi5jdXJyZW50ID0gb25TdGVwO1xuICB2YXIgb25TdG9wU3RlcCA9IGZ1bmN0aW9uIG9uU3RvcFN0ZXAoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHN0ZXBUaW1lb3V0UmVmLmN1cnJlbnQpO1xuICB9O1xuXG4gIC8vIFdlIHdpbGwgaW50ZXJ2YWwgdXBkYXRlIHN0ZXAgd2hlbiBob2xkIG1vdXNlIGRvd25cbiAgdmFyIG9uU3RlcE1vdXNlRG93biA9IGZ1bmN0aW9uIG9uU3RlcE1vdXNlRG93bihlLCB1cCkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBvblN0b3BTdGVwKCk7XG4gICAgb25TdGVwUmVmLmN1cnJlbnQodXApO1xuXG4gICAgLy8gTG9vcCBzdGVwIGZvciBpbnRlcnZhbFxuICAgIGZ1bmN0aW9uIGxvb3BTdGVwKCkge1xuICAgICAgb25TdGVwUmVmLmN1cnJlbnQodXApO1xuICAgICAgc3RlcFRpbWVvdXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQobG9vcFN0ZXAsIFNURVBfSU5URVJWQUwpO1xuICAgIH1cblxuICAgIC8vIEZpcnN0IHRpbWUgcHJlc3Mgd2lsbCB3YWl0IHNvbWUgdGltZSB0byB0cmlnZ2VyIGxvb3Agc3RlcCB1cGRhdGVcbiAgICBzdGVwVGltZW91dFJlZi5jdXJyZW50ID0gc2V0VGltZW91dChsb29wU3RlcCwgU1RFUF9ERUxBWSk7XG4gIH07XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIG9uU3RvcFN0ZXAoKTtcbiAgICAgIGZyYW1lSWRzLmN1cnJlbnQuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgcmV0dXJuIHJhZi5jYW5jZWwoaWQpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfSwgW10pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgaXNNb2JpbGUgPSB1c2VNb2JpbGUoKTtcbiAgaWYgKGlzTW9iaWxlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIGhhbmRsZXJDbGFzc05hbWUgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhhbmRsZXJcIik7XG4gIHZhciB1cENsYXNzTmFtZSA9IGNsYXNzTmFtZXMoaGFuZGxlckNsYXNzTmFtZSwgXCJcIi5jb25jYXQoaGFuZGxlckNsYXNzTmFtZSwgXCItdXBcIiksIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQoaGFuZGxlckNsYXNzTmFtZSwgXCItdXAtZGlzYWJsZWRcIiksIHVwRGlzYWJsZWQpKTtcbiAgdmFyIGRvd25DbGFzc05hbWUgPSBjbGFzc05hbWVzKGhhbmRsZXJDbGFzc05hbWUsIFwiXCIuY29uY2F0KGhhbmRsZXJDbGFzc05hbWUsIFwiLWRvd25cIiksIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQoaGFuZGxlckNsYXNzTmFtZSwgXCItZG93bi1kaXNhYmxlZFwiKSwgZG93bkRpc2FibGVkKSk7XG5cbiAgLy8gZml4OiBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy80MzA4OFxuICAvLyBJbiBTYWZhcmksIFdoZW4gd2UgZmlyZSBvbm1vdXNlZG93biBhbmQgb25tb3VzZXVwIGV2ZW50cyBpbiBxdWljayBzdWNjZXNzaW9uLCBcbiAgLy8gdGhlcmUgbWF5IGJlIGEgcHJvYmxlbSB0aGF0IHRoZSBvbm1vdXNldXAgZXZlbnRzIGFyZSBleGVjdXRlZCBmaXJzdCwgXG4gIC8vIHJlc3VsdGluZyBpbiBhIGRpc29yZGVyZWQgcHJvZ3JhbSBleGVjdXRpb24uXG4gIC8vIFNvLCB3ZSBuZWVkIHRvIHVzZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgdG8gZW5zdXJlIHRoYXQgdGhlIG9ubW91c2V1cCBldmVudCBpcyBleGVjdXRlZCBhZnRlciB0aGUgb25tb3VzZWRvd24gZXZlbnQuXG4gIHZhciBzYWZlT25TdG9wU3RlcCA9IGZ1bmN0aW9uIHNhZmVPblN0b3BTdGVwKCkge1xuICAgIHJldHVybiBmcmFtZUlkcy5jdXJyZW50LnB1c2gocmFmKG9uU3RvcFN0ZXApKTtcbiAgfTtcbiAgdmFyIHNoYXJlZEhhbmRsZXJQcm9wcyA9IHtcbiAgICB1bnNlbGVjdGFibGU6ICdvbicsXG4gICAgcm9sZTogJ2J1dHRvbicsXG4gICAgb25Nb3VzZVVwOiBzYWZlT25TdG9wU3RlcCxcbiAgICBvbk1vdXNlTGVhdmU6IHNhZmVPblN0b3BTdGVwXG4gIH07XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChoYW5kbGVyQ2xhc3NOYW1lLCBcIi13cmFwXCIpXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBfZXh0ZW5kcyh7fSwgc2hhcmVkSGFuZGxlclByb3BzLCB7XG4gICAgb25Nb3VzZURvd246IGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICAgIG9uU3RlcE1vdXNlRG93bihlLCB0cnVlKTtcbiAgICB9LFxuICAgIFwiYXJpYS1sYWJlbFwiOiBcIkluY3JlYXNlIFZhbHVlXCIsXG4gICAgXCJhcmlhLWRpc2FibGVkXCI6IHVwRGlzYWJsZWQsXG4gICAgY2xhc3NOYW1lOiB1cENsYXNzTmFtZVxuICB9KSwgdXBOb2RlIHx8IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgdW5zZWxlY3RhYmxlOiBcIm9uXCIsXG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhhbmRsZXItdXAtaW5uZXJcIilcbiAgfSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgX2V4dGVuZHMoe30sIHNoYXJlZEhhbmRsZXJQcm9wcywge1xuICAgIG9uTW91c2VEb3duOiBmdW5jdGlvbiBvbk1vdXNlRG93bihlKSB7XG4gICAgICBvblN0ZXBNb3VzZURvd24oZSwgZmFsc2UpO1xuICAgIH0sXG4gICAgXCJhcmlhLWxhYmVsXCI6IFwiRGVjcmVhc2UgVmFsdWVcIixcbiAgICBcImFyaWEtZGlzYWJsZWRcIjogZG93bkRpc2FibGVkLFxuICAgIGNsYXNzTmFtZTogZG93bkNsYXNzTmFtZVxuICB9KSwgZG93bk5vZGUgfHwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICB1bnNlbGVjdGFibGU6IFwib25cIixcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaGFuZGxlci1kb3duLWlubmVyXCIpXG4gIH0pKSk7XG59IiwgImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgaXNNb2JpbGUgZnJvbSBcIi4uL2lzTW9iaWxlXCI7XG5pbXBvcnQgdXNlTGF5b3V0RWZmZWN0IGZyb20gXCIuL3VzZUxheW91dEVmZmVjdFwiO1xuXG4vKipcbiAqIEhvb2sgdG8gZGV0ZWN0IGlmIHRoZSB1c2VyIGlzIG9uIGEgbW9iaWxlIGRldmljZVxuICogTm90aWNlIHRoYXQgdGhpcyBob29rIHdpbGwgb25seSBkZXRlY3QgdGhlIGRldmljZSB0eXBlIGluIGVmZmVjdCwgc28gaXQgd2lsbCBhbHdheXMgYmUgZmFsc2UgaW4gc2VydmVyIHNpZGVcbiAqL1xudmFyIHVzZU1vYmlsZSA9IGZ1bmN0aW9uIHVzZU1vYmlsZSgpIHtcbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKGZhbHNlKSxcbiAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICBtb2JpbGUgPSBfdXNlU3RhdGUyWzBdLFxuICAgIHNldE1vYmlsZSA9IF91c2VTdGF0ZTJbMV07XG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgc2V0TW9iaWxlKGlzTW9iaWxlKCkpO1xuICB9LCBbXSk7XG4gIHJldHVybiBtb2JpbGU7XG59O1xuZXhwb3J0IGRlZmF1bHQgdXNlTW9iaWxlOyIsICJpbXBvcnQgeyB0cmltTnVtYmVyLCBudW0yc3RyIH0gZnJvbSAnQHJjLWNvbXBvbmVudC9taW5pLWRlY2ltYWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlY3VwbGVTdGVwcyhzdGVwKSB7XG4gIHZhciBzdGVwU3RyID0gdHlwZW9mIHN0ZXAgPT09ICdudW1iZXInID8gbnVtMnN0cihzdGVwKSA6IHRyaW1OdW1iZXIoc3RlcCkuZnVsbFN0cjtcbiAgdmFyIGhhc1BvaW50ID0gc3RlcFN0ci5pbmNsdWRlcygnLicpO1xuICBpZiAoIWhhc1BvaW50KSB7XG4gICAgcmV0dXJuIHN0ZXAgKyAnMCc7XG4gIH1cbiAgcmV0dXJuIHRyaW1OdW1iZXIoc3RlcFN0ci5yZXBsYWNlKC8oXFxkKVxcLihcXGQpL2csICckMSQyLicpKS5mdWxsU3RyO1xufSIsICJpbXBvcnQgeyB1c2VSZWYsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCByYWYgZnJvbSBcInJjLXV0aWwvZXMvcmFmXCI7XG5cbi8qKlxuICogQWx3YXlzIHRyaWdnZXIgbGF0ZXN0IG9uY2Ugd2hlbiBjYWxsIG11bHRpcGxlIHRpbWVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uICgpIHtcbiAgdmFyIGlkUmVmID0gdXNlUmVmKDApO1xuICB2YXIgY2xlYW5VcCA9IGZ1bmN0aW9uIGNsZWFuVXAoKSB7XG4gICAgcmFmLmNhbmNlbChpZFJlZi5jdXJyZW50KTtcbiAgfTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gY2xlYW5VcDtcbiAgfSwgW10pO1xuICByZXR1cm4gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgY2xlYW5VcCgpO1xuICAgIGlkUmVmLmN1cnJlbnQgPSByYWYoZnVuY3Rpb24gKCkge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9KTtcbiAgfTtcbn0pOyIsICJpbXBvcnQgSW5wdXROdW1iZXIgZnJvbSBcIi4vSW5wdXROdW1iZXJcIjtcbmV4cG9ydCBkZWZhdWx0IElucHV0TnVtYmVyOyIsICJpbXBvcnQgeyBGYXN0Q29sb3IgfSBmcm9tICdAYW50LWRlc2lnbi9mYXN0LWNvbG9yJztcbmltcG9ydCB7IGluaXRDb21wb25lbnRUb2tlbiB9IGZyb20gJy4uLy4uL2lucHV0L3N0eWxlL3Rva2VuJztcbmV4cG9ydCBjb25zdCBwcmVwYXJlQ29tcG9uZW50VG9rZW4gPSB0b2tlbiA9PiB7XG4gIHZhciBfYTtcbiAgY29uc3QgaGFuZGxlVmlzaWJsZSA9IChfYSA9IHRva2VuLmhhbmRsZVZpc2libGUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICdhdXRvJztcbiAgY29uc3QgaGFuZGxlV2lkdGggPSB0b2tlbi5jb250cm9sSGVpZ2h0U00gLSB0b2tlbi5saW5lV2lkdGggKiAyO1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBpbml0Q29tcG9uZW50VG9rZW4odG9rZW4pKSwge1xuICAgIGNvbnRyb2xXaWR0aDogOTAsXG4gICAgaGFuZGxlV2lkdGgsXG4gICAgaGFuZGxlRm9udFNpemU6IHRva2VuLmZvbnRTaXplIC8gMixcbiAgICBoYW5kbGVWaXNpYmxlLFxuICAgIGhhbmRsZUFjdGl2ZUJnOiB0b2tlbi5jb2xvckZpbGxBbHRlcixcbiAgICBoYW5kbGVCZzogdG9rZW4uY29sb3JCZ0NvbnRhaW5lcixcbiAgICBmaWxsZWRIYW5kbGVCZzogbmV3IEZhc3RDb2xvcih0b2tlbi5jb2xvckZpbGxTZWNvbmRhcnkpLm9uQmFja2dyb3VuZCh0b2tlbi5jb2xvckJnQ29udGFpbmVyKS50b0hleFN0cmluZygpLFxuICAgIGhhbmRsZUhvdmVyQ29sb3I6IHRva2VuLmNvbG9yUHJpbWFyeSxcbiAgICBoYW5kbGVCb3JkZXJDb2xvcjogdG9rZW4uY29sb3JCb3JkZXIsXG4gICAgaGFuZGxlT3BhY2l0eTogaGFuZGxlVmlzaWJsZSA9PT0gdHJ1ZSA/IDEgOiAwLFxuICAgIGhhbmRsZVZpc2libGVXaWR0aDogaGFuZGxlVmlzaWJsZSA9PT0gdHJ1ZSA/IGhhbmRsZVdpZHRoIDogMFxuICB9KTtcbn07IiwgImltcG9ydCB7IHVuaXQgfSBmcm9tICdAYW50LWRlc2lnbi9jc3NpbmpzJztcbmltcG9ydCB7IGdlbkJhc2ljSW5wdXRTdHlsZSwgZ2VuSW5wdXRHcm91cFN0eWxlLCBnZW5QbGFjZWhvbGRlclN0eWxlLCBpbml0SW5wdXRUb2tlbiB9IGZyb20gJy4uLy4uL2lucHV0L3N0eWxlJztcbmltcG9ydCB7IGdlbkJvcmRlcmxlc3NTdHlsZSwgZ2VuRmlsbGVkR3JvdXBTdHlsZSwgZ2VuRmlsbGVkU3R5bGUsIGdlbk91dGxpbmVkR3JvdXBTdHlsZSwgZ2VuT3V0bGluZWRTdHlsZSwgZ2VuVW5kZXJsaW5lZFN0eWxlIH0gZnJvbSAnLi4vLi4vaW5wdXQvc3R5bGUvdmFyaWFudHMnO1xuaW1wb3J0IHsgcmVzZXRDb21wb25lbnQsIHJlc2V0SWNvbiB9IGZyb20gJy4uLy4uL3N0eWxlJztcbmltcG9ydCB7IGdlbkNvbXBhY3RJdGVtU3R5bGUgfSBmcm9tICcuLi8uLi9zdHlsZS9jb21wYWN0LWl0ZW0nO1xuaW1wb3J0IHsgZ2VuU3R5bGVIb29rcywgbWVyZ2VUb2tlbiB9IGZyb20gJy4uLy4uL3RoZW1lL2ludGVybmFsJztcbmltcG9ydCB7IHByZXBhcmVDb21wb25lbnRUb2tlbiB9IGZyb20gJy4vdG9rZW4nO1xuZXhwb3J0IGNvbnN0IGdlblJhZGl1c1N0eWxlID0gKF9yZWYsIHNpemUpID0+IHtcbiAgbGV0IHtcbiAgICBjb21wb25lbnRDbHMsXG4gICAgYm9yZGVyUmFkaXVzU00sXG4gICAgYm9yZGVyUmFkaXVzTEdcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IGJvcmRlclJhZGl1cyA9IHNpemUgPT09ICdsZycgPyBib3JkZXJSYWRpdXNMRyA6IGJvcmRlclJhZGl1c1NNO1xuICByZXR1cm4ge1xuICAgIFtgJi0ke3NpemV9YF06IHtcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWhhbmRsZXItd3JhcGBdOiB7XG4gICAgICAgIGJvcmRlclN0YXJ0RW5kUmFkaXVzOiBib3JkZXJSYWRpdXMsXG4gICAgICAgIGJvcmRlckVuZEVuZFJhZGl1czogYm9yZGVyUmFkaXVzXG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30taGFuZGxlci11cGBdOiB7XG4gICAgICAgIGJvcmRlclN0YXJ0RW5kUmFkaXVzOiBib3JkZXJSYWRpdXNcbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1oYW5kbGVyLWRvd25gXToge1xuICAgICAgICBib3JkZXJFbmRFbmRSYWRpdXM6IGJvcmRlclJhZGl1c1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG5jb25zdCBnZW5JbnB1dE51bWJlclN0eWxlcyA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENscyxcbiAgICBsaW5lV2lkdGgsXG4gICAgbGluZVR5cGUsXG4gICAgYm9yZGVyUmFkaXVzLFxuICAgIGlucHV0Rm9udFNpemVTTSxcbiAgICBpbnB1dEZvbnRTaXplTEcsXG4gICAgY29udHJvbEhlaWdodExHLFxuICAgIGNvbnRyb2xIZWlnaHRTTSxcbiAgICBjb2xvckVycm9yLFxuICAgIHBhZGRpbmdJbmxpbmVTTSxcbiAgICBwYWRkaW5nQmxvY2tTTSxcbiAgICBwYWRkaW5nQmxvY2tMRyxcbiAgICBwYWRkaW5nSW5saW5lTEcsXG4gICAgY29sb3JJY29uLFxuICAgIG1vdGlvbkR1cmF0aW9uTWlkLFxuICAgIGhhbmRsZUhvdmVyQ29sb3IsXG4gICAgaGFuZGxlT3BhY2l0eSxcbiAgICBwYWRkaW5nSW5saW5lLFxuICAgIHBhZGRpbmdCbG9jayxcbiAgICBoYW5kbGVCZyxcbiAgICBoYW5kbGVBY3RpdmVCZyxcbiAgICBjb2xvclRleHREaXNhYmxlZCxcbiAgICBib3JkZXJSYWRpdXNTTSxcbiAgICBib3JkZXJSYWRpdXNMRyxcbiAgICBjb250cm9sV2lkdGgsXG4gICAgaGFuZGxlQm9yZGVyQ29sb3IsXG4gICAgZmlsbGVkSGFuZGxlQmcsXG4gICAgbGluZUhlaWdodExHLFxuICAgIGNhbGNcbiAgfSA9IHRva2VuO1xuICByZXR1cm4gW3tcbiAgICBbY29tcG9uZW50Q2xzXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXNldENvbXBvbmVudCh0b2tlbikpLCBnZW5CYXNpY0lucHV0U3R5bGUodG9rZW4pKSwge1xuICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICB3aWR0aDogY29udHJvbFdpZHRoLFxuICAgICAgbWFyZ2luOiAwLFxuICAgICAgcGFkZGluZzogMCxcbiAgICAgIGJvcmRlclJhZGl1c1xuICAgIH0pLCBnZW5PdXRsaW5lZFN0eWxlKHRva2VuLCB7XG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1oYW5kbGVyLXdyYXBgXToge1xuICAgICAgICBiYWNrZ3JvdW5kOiBoYW5kbGVCZyxcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30taGFuZGxlci1kb3duYF06IHtcbiAgICAgICAgICBib3JkZXJCbG9ja1N0YXJ0OiBgJHt1bml0KGxpbmVXaWR0aCl9ICR7bGluZVR5cGV9ICR7aGFuZGxlQm9yZGVyQ29sb3J9YFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkpLCBnZW5GaWxsZWRTdHlsZSh0b2tlbiwge1xuICAgICAgW2Ake2NvbXBvbmVudENsc30taGFuZGxlci13cmFwYF06IHtcbiAgICAgICAgYmFja2dyb3VuZDogZmlsbGVkSGFuZGxlQmcsXG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LWhhbmRsZXItZG93bmBdOiB7XG4gICAgICAgICAgYm9yZGVyQmxvY2tTdGFydDogYCR7dW5pdChsaW5lV2lkdGgpfSAke2xpbmVUeXBlfSAke2hhbmRsZUJvcmRlckNvbG9yfWBcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICcmOmZvY3VzLXdpdGhpbic6IHtcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30taGFuZGxlci13cmFwYF06IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kOiBoYW5kbGVCZ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkpLCBnZW5VbmRlcmxpbmVkU3R5bGUodG9rZW4sIHtcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWhhbmRsZXItd3JhcGBdOiB7XG4gICAgICAgIGJhY2tncm91bmQ6IGhhbmRsZUJnLFxuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1oYW5kbGVyLWRvd25gXToge1xuICAgICAgICAgIGJvcmRlckJsb2NrU3RhcnQ6IGAke3VuaXQobGluZVdpZHRoKX0gJHtsaW5lVHlwZX0gJHtoYW5kbGVCb3JkZXJDb2xvcn1gXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSksIGdlbkJvcmRlcmxlc3NTdHlsZSh0b2tlbikpLCB7XG4gICAgICAnJi1ydGwnOiB7XG4gICAgICAgIGRpcmVjdGlvbjogJ3J0bCcsXG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LWlucHV0YF06IHtcbiAgICAgICAgICBkaXJlY3Rpb246ICdydGwnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAnJi1sZyc6IHtcbiAgICAgICAgcGFkZGluZzogMCxcbiAgICAgICAgZm9udFNpemU6IGlucHV0Rm9udFNpemVMRyxcbiAgICAgICAgbGluZUhlaWdodDogbGluZUhlaWdodExHLFxuICAgICAgICBib3JkZXJSYWRpdXM6IGJvcmRlclJhZGl1c0xHLFxuICAgICAgICBbYGlucHV0JHtjb21wb25lbnRDbHN9LWlucHV0YF06IHtcbiAgICAgICAgICBoZWlnaHQ6IGNhbGMoY29udHJvbEhlaWdodExHKS5zdWIoY2FsYyhsaW5lV2lkdGgpLm11bCgyKSkuZXF1YWwoKSxcbiAgICAgICAgICBwYWRkaW5nOiBgJHt1bml0KHBhZGRpbmdCbG9ja0xHKX0gJHt1bml0KHBhZGRpbmdJbmxpbmVMRyl9YFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgJyYtc20nOiB7XG4gICAgICAgIHBhZGRpbmc6IDAsXG4gICAgICAgIGZvbnRTaXplOiBpbnB1dEZvbnRTaXplU00sXG4gICAgICAgIGJvcmRlclJhZGl1czogYm9yZGVyUmFkaXVzU00sXG4gICAgICAgIFtgaW5wdXQke2NvbXBvbmVudENsc30taW5wdXRgXToge1xuICAgICAgICAgIGhlaWdodDogY2FsYyhjb250cm9sSGVpZ2h0U00pLnN1YihjYWxjKGxpbmVXaWR0aCkubXVsKDIpKS5lcXVhbCgpLFxuICAgICAgICAgIHBhZGRpbmc6IGAke3VuaXQocGFkZGluZ0Jsb2NrU00pfSAke3VuaXQocGFkZGluZ0lubGluZVNNKX1gXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT0gT3V0IE9mIFJhbmdlID09PT09PT09PT09PT09PT09PT09PVxuICAgICAgJyYtb3V0LW9mLXJhbmdlJzoge1xuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1pbnB1dC13cmFwYF06IHtcbiAgICAgICAgICBpbnB1dDoge1xuICAgICAgICAgICAgY29sb3I6IGNvbG9yRXJyb3JcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyBTdHlsZSBmb3IgaW5wdXQtZ3JvdXA6IGlucHV0IHdpdGggbGFiZWwsIHdpdGggYnV0dG9uIG9yIGRyb3Bkb3duLi4uXG4gICAgICAnJi1ncm91cCc6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXNldENvbXBvbmVudCh0b2tlbikpLCBnZW5JbnB1dEdyb3VwU3R5bGUodG9rZW4pKSwge1xuICAgICAgICAnJi13cmFwcGVyJzogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgICAgIHRleHRBbGlnbjogJ3N0YXJ0JyxcbiAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiAndG9wJyxcbiAgICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1hZmZpeC13cmFwcGVyYF06IHtcbiAgICAgICAgICAgIHdpZHRoOiAnMTAwJSdcbiAgICAgICAgICB9LFxuICAgICAgICAgIC8vIFNpemVcbiAgICAgICAgICAnJi1sZyc6IHtcbiAgICAgICAgICAgIFtgJHtjb21wb25lbnRDbHN9LWdyb3VwLWFkZG9uYF06IHtcbiAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBib3JkZXJSYWRpdXNMRyxcbiAgICAgICAgICAgICAgZm9udFNpemU6IHRva2VuLmZvbnRTaXplTEdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgICcmLXNtJzoge1xuICAgICAgICAgICAgW2Ake2NvbXBvbmVudENsc30tZ3JvdXAtYWRkb25gXToge1xuICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IGJvcmRlclJhZGl1c1NNXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LCBnZW5PdXRsaW5lZEdyb3VwU3R5bGUodG9rZW4pKSwgZ2VuRmlsbGVkR3JvdXBTdHlsZSh0b2tlbikpLCB7XG4gICAgICAgICAgLy8gRml4IHRoZSBpc3N1ZSBvZiB1c2luZyBpY29ucyBpbiBTcGFjZSBDb21wYWN0IG1vZGVcbiAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy80NTc2NFxuICAgICAgICAgIFtgJjpub3QoJHtjb21wb25lbnRDbHN9LWNvbXBhY3QtZmlyc3QtaXRlbSk6bm90KCR7Y29tcG9uZW50Q2xzfS1jb21wYWN0LWxhc3QtaXRlbSkke2NvbXBvbmVudENsc30tY29tcGFjdC1pdGVtYF06IHtcbiAgICAgICAgICAgIFtgJHtjb21wb25lbnRDbHN9LCAke2NvbXBvbmVudENsc30tZ3JvdXAtYWRkb25gXToge1xuICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFtgJjpub3QoJHtjb21wb25lbnRDbHN9LWNvbXBhY3QtbGFzdC1pdGVtKSR7Y29tcG9uZW50Q2xzfS1jb21wYWN0LWZpcnN0LWl0ZW1gXToge1xuICAgICAgICAgICAgW2Ake2NvbXBvbmVudENsc30sICR7Y29tcG9uZW50Q2xzfS1ncm91cC1hZGRvbmBdOiB7XG4gICAgICAgICAgICAgIGJvcmRlclN0YXJ0RW5kUmFkaXVzOiAwLFxuICAgICAgICAgICAgICBib3JkZXJFbmRFbmRSYWRpdXM6IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFtgJjpub3QoJHtjb21wb25lbnRDbHN9LWNvbXBhY3QtZmlyc3QtaXRlbSkke2NvbXBvbmVudENsc30tY29tcGFjdC1sYXN0LWl0ZW1gXToge1xuICAgICAgICAgICAgW2Ake2NvbXBvbmVudENsc30sICR7Y29tcG9uZW50Q2xzfS1ncm91cC1hZGRvbmBdOiB7XG4gICAgICAgICAgICAgIGJvcmRlclN0YXJ0U3RhcnRSYWRpdXM6IDAsXG4gICAgICAgICAgICAgIGJvcmRlckVuZFN0YXJ0UmFkaXVzOiAwXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSksXG4gICAgICBbYCYtZGlzYWJsZWQgJHtjb21wb25lbnRDbHN9LWlucHV0YF06IHtcbiAgICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQnXG4gICAgICB9LFxuICAgICAgW2NvbXBvbmVudENsc106IHtcbiAgICAgICAgJyYtaW5wdXQnOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXNldENvbXBvbmVudCh0b2tlbikpLCB7XG4gICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICBwYWRkaW5nOiBgJHt1bml0KHBhZGRpbmdCbG9jayl9ICR7dW5pdChwYWRkaW5nSW5saW5lKX1gLFxuICAgICAgICAgIHRleHRBbGlnbjogJ3N0YXJ0JyxcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgICAgYm9yZGVyOiAwLFxuICAgICAgICAgIGJvcmRlclJhZGl1cyxcbiAgICAgICAgICBvdXRsaW5lOiAwLFxuICAgICAgICAgIHRyYW5zaXRpb246IGBhbGwgJHttb3Rpb25EdXJhdGlvbk1pZH0gbGluZWFyYCxcbiAgICAgICAgICBhcHBlYXJhbmNlOiAndGV4dGZpZWxkJyxcbiAgICAgICAgICBmb250U2l6ZTogJ2luaGVyaXQnXG4gICAgICAgIH0pLCBnZW5QbGFjZWhvbGRlclN0eWxlKHRva2VuLmNvbG9yVGV4dFBsYWNlaG9sZGVyKSksIHtcbiAgICAgICAgICAnJlt0eXBlPVwibnVtYmVyXCJdOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLCAmW3R5cGU9XCJudW1iZXJcIl06Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b24nOiB7XG4gICAgICAgICAgICBtYXJnaW46IDAsXG4gICAgICAgICAgICBhcHBlYXJhbmNlOiAnbm9uZSdcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9LFxuICAgICAgW2AmOmhvdmVyICR7Y29tcG9uZW50Q2xzfS1oYW5kbGVyLXdyYXAsICYtZm9jdXNlZCAke2NvbXBvbmVudENsc30taGFuZGxlci13cmFwYF06IHtcbiAgICAgICAgd2lkdGg6IHRva2VuLmhhbmRsZVdpZHRoLFxuICAgICAgICBvcGFjaXR5OiAxXG4gICAgICB9XG4gICAgfSlcbiAgfSxcbiAgLy8gSGFuZGxlclxuICB7XG4gICAgW2NvbXBvbmVudENsc106IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHtcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWhhbmRsZXItd3JhcGBdOiB7XG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICBpbnNldEJsb2NrU3RhcnQ6IDAsXG4gICAgICAgIGluc2V0SW5saW5lRW5kOiAwLFxuICAgICAgICB3aWR0aDogdG9rZW4uaGFuZGxlVmlzaWJsZVdpZHRoLFxuICAgICAgICBvcGFjaXR5OiBoYW5kbGVPcGFjaXR5LFxuICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAgYm9yZGVyU3RhcnRTdGFydFJhZGl1czogMCxcbiAgICAgICAgYm9yZGVyU3RhcnRFbmRSYWRpdXM6IGJvcmRlclJhZGl1cyxcbiAgICAgICAgYm9yZGVyRW5kRW5kUmFkaXVzOiBib3JkZXJSYWRpdXMsXG4gICAgICAgIGJvcmRlckVuZFN0YXJ0UmFkaXVzOiAwLFxuICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLFxuICAgICAgICBhbGlnbkl0ZW1zOiAnc3RyZXRjaCcsXG4gICAgICAgIHRyYW5zaXRpb246IGBhbGwgJHttb3Rpb25EdXJhdGlvbk1pZH1gLFxuICAgICAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgICAgIC8vIEZpeCBpbnB1dCBudW1iZXIgaW5zaWRlIE1lbnUgbWFrZXMgaWNvbiB0b28gbGFyZ2VcbiAgICAgICAgLy8gV2UgYXJpc2UgdGhlIHNlbGVjdG9yIHByaW9yaXR5IGJ5IG5lc3Qgc2VsZWN0b3IgaGVyZVxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8xNDM2N1xuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1oYW5kbGVyYF06IHtcbiAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLFxuICAgICAgICAgIGZsZXg6ICdhdXRvJyxcbiAgICAgICAgICBoZWlnaHQ6ICc0MCUnLFxuICAgICAgICAgIFtgXG4gICAgICAgICAgICAgICR7Y29tcG9uZW50Q2xzfS1oYW5kbGVyLXVwLWlubmVyLFxuICAgICAgICAgICAgICAke2NvbXBvbmVudENsc30taGFuZGxlci1kb3duLWlubmVyXG4gICAgICAgICAgICBgXToge1xuICAgICAgICAgICAgbWFyZ2luSW5saW5lRW5kOiAwLFxuICAgICAgICAgICAgZm9udFNpemU6IHRva2VuLmhhbmRsZUZvbnRTaXplXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30taGFuZGxlcmBdOiB7XG4gICAgICAgIGhlaWdodDogJzUwJScsXG4gICAgICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICAgICAgY29sb3I6IGNvbG9ySWNvbixcbiAgICAgICAgZm9udFdlaWdodDogJ2JvbGQnLFxuICAgICAgICBsaW5lSGVpZ2h0OiAwLFxuICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgICAgYm9yZGVySW5saW5lU3RhcnQ6IGAke3VuaXQobGluZVdpZHRoKX0gJHtsaW5lVHlwZX0gJHtoYW5kbGVCb3JkZXJDb2xvcn1gLFxuICAgICAgICB0cmFuc2l0aW9uOiBgYWxsICR7bW90aW9uRHVyYXRpb25NaWR9IGxpbmVhcmAsXG4gICAgICAgICcmOmFjdGl2ZSc6IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kOiBoYW5kbGVBY3RpdmVCZ1xuICAgICAgICB9LFxuICAgICAgICAvLyBIb3ZlclxuICAgICAgICAnJjpob3Zlcic6IHtcbiAgICAgICAgICBoZWlnaHQ6IGA2MCVgLFxuICAgICAgICAgIFtgXG4gICAgICAgICAgICAgICR7Y29tcG9uZW50Q2xzfS1oYW5kbGVyLXVwLWlubmVyLFxuICAgICAgICAgICAgICAke2NvbXBvbmVudENsc30taGFuZGxlci1kb3duLWlubmVyXG4gICAgICAgICAgICBgXToge1xuICAgICAgICAgICAgY29sb3I6IGhhbmRsZUhvdmVyQ29sb3JcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICcmLXVwLWlubmVyLCAmLWRvd24taW5uZXInOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlc2V0SWNvbigpKSwge1xuICAgICAgICAgIGNvbG9yOiBjb2xvckljb24sXG4gICAgICAgICAgdHJhbnNpdGlvbjogYGFsbCAke21vdGlvbkR1cmF0aW9uTWlkfSBsaW5lYXJgLFxuICAgICAgICAgIHVzZXJTZWxlY3Q6ICdub25lJ1xuICAgICAgICB9KVxuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWhhbmRsZXItdXBgXToge1xuICAgICAgICBib3JkZXJTdGFydEVuZFJhZGl1czogYm9yZGVyUmFkaXVzXG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30taGFuZGxlci1kb3duYF06IHtcbiAgICAgICAgYm9yZGVyRW5kRW5kUmFkaXVzOiBib3JkZXJSYWRpdXNcbiAgICAgIH1cbiAgICB9LCBnZW5SYWRpdXNTdHlsZSh0b2tlbiwgJ2xnJykpLCBnZW5SYWRpdXNTdHlsZSh0b2tlbiwgJ3NtJykpLCB7XG4gICAgICAvLyBEaXNhYmxlZFxuICAgICAgJyYtZGlzYWJsZWQsICYtcmVhZG9ubHknOiB7XG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LWhhbmRsZXItd3JhcGBdOiB7XG4gICAgICAgICAgZGlzcGxheTogJ25vbmUnXG4gICAgICAgIH0sXG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LWlucHV0YF06IHtcbiAgICAgICAgICBjb2xvcjogJ2luaGVyaXQnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbYFxuICAgICAgICAgICR7Y29tcG9uZW50Q2xzfS1oYW5kbGVyLXVwLWRpc2FibGVkLFxuICAgICAgICAgICR7Y29tcG9uZW50Q2xzfS1oYW5kbGVyLWRvd24tZGlzYWJsZWRcbiAgICAgICAgYF06IHtcbiAgICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQnXG4gICAgICB9LFxuICAgICAgW2BcbiAgICAgICAgICAke2NvbXBvbmVudENsc30taGFuZGxlci11cC1kaXNhYmxlZDpob3ZlciAmLWhhbmRsZXItdXAtaW5uZXIsXG4gICAgICAgICAgJHtjb21wb25lbnRDbHN9LWhhbmRsZXItZG93bi1kaXNhYmxlZDpob3ZlciAmLWhhbmRsZXItZG93bi1pbm5lclxuICAgICAgICBgXToge1xuICAgICAgICBjb2xvcjogY29sb3JUZXh0RGlzYWJsZWRcbiAgICAgIH1cbiAgICB9KVxuICB9XTtcbn07XG5jb25zdCBnZW5BZmZpeFdyYXBwZXJTdHlsZXMgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHMsXG4gICAgcGFkZGluZ0Jsb2NrLFxuICAgIHBhZGRpbmdJbmxpbmUsXG4gICAgaW5wdXRBZmZpeFBhZGRpbmcsXG4gICAgY29udHJvbFdpZHRoLFxuICAgIGJvcmRlclJhZGl1c0xHLFxuICAgIGJvcmRlclJhZGl1c1NNLFxuICAgIHBhZGRpbmdJbmxpbmVMRyxcbiAgICBwYWRkaW5nSW5saW5lU00sXG4gICAgcGFkZGluZ0Jsb2NrTEcsXG4gICAgcGFkZGluZ0Jsb2NrU00sXG4gICAgbW90aW9uRHVyYXRpb25NaWRcbiAgfSA9IHRva2VuO1xuICByZXR1cm4ge1xuICAgIFtgJHtjb21wb25lbnRDbHN9LWFmZml4LXdyYXBwZXJgXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHtcbiAgICAgIFtgaW5wdXQke2NvbXBvbmVudENsc30taW5wdXRgXToge1xuICAgICAgICBwYWRkaW5nOiBgJHt1bml0KHBhZGRpbmdCbG9jayl9IDBgXG4gICAgICB9XG4gICAgfSwgZ2VuQmFzaWNJbnB1dFN0eWxlKHRva2VuKSksIHtcbiAgICAgIC8vIG9yIG51bWJlciBoYW5kbGVyIHdpbGwgY292ZXIgZm9ybSBzdGF0dXNcbiAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgZGlzcGxheTogJ2lubGluZS1mbGV4JyxcbiAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgd2lkdGg6IGNvbnRyb2xXaWR0aCxcbiAgICAgIHBhZGRpbmc6IDAsXG4gICAgICBwYWRkaW5nSW5saW5lU3RhcnQ6IHBhZGRpbmdJbmxpbmUsXG4gICAgICAnJi1sZyc6IHtcbiAgICAgICAgYm9yZGVyUmFkaXVzOiBib3JkZXJSYWRpdXNMRyxcbiAgICAgICAgcGFkZGluZ0lubGluZVN0YXJ0OiBwYWRkaW5nSW5saW5lTEcsXG4gICAgICAgIFtgaW5wdXQke2NvbXBvbmVudENsc30taW5wdXRgXToge1xuICAgICAgICAgIHBhZGRpbmc6IGAke3VuaXQocGFkZGluZ0Jsb2NrTEcpfSAwYFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgJyYtc20nOiB7XG4gICAgICAgIGJvcmRlclJhZGl1czogYm9yZGVyUmFkaXVzU00sXG4gICAgICAgIHBhZGRpbmdJbmxpbmVTdGFydDogcGFkZGluZ0lubGluZVNNLFxuICAgICAgICBbYGlucHV0JHtjb21wb25lbnRDbHN9LWlucHV0YF06IHtcbiAgICAgICAgICBwYWRkaW5nOiBgJHt1bml0KHBhZGRpbmdCbG9ja1NNKX0gMGBcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtgJjpub3QoJHtjb21wb25lbnRDbHN9LWRpc2FibGVkKTpob3ZlcmBdOiB7XG4gICAgICAgIHpJbmRleDogMVxuICAgICAgfSxcbiAgICAgICcmLWZvY3VzZWQsICY6Zm9jdXMnOiB7XG4gICAgICAgIHpJbmRleDogMVxuICAgICAgfSxcbiAgICAgIFtgJi1kaXNhYmxlZCA+ICR7Y29tcG9uZW50Q2xzfS1kaXNhYmxlZGBdOiB7XG4gICAgICAgIGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCdcbiAgICAgIH0sXG4gICAgICBbYD4gZGl2JHtjb21wb25lbnRDbHN9YF06IHtcbiAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgYm9yZGVyOiAnbm9uZScsXG4gICAgICAgIG91dGxpbmU6ICdub25lJyxcbiAgICAgICAgW2AmJHtjb21wb25lbnRDbHN9LWZvY3VzZWRgXToge1xuICAgICAgICAgIGJveFNoYWRvdzogJ25vbmUgIWltcG9ydGFudCdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICcmOjpiZWZvcmUnOiB7XG4gICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgdmlzaWJpbGl0eTogJ2hpZGRlbicsXG4gICAgICAgIGNvbnRlbnQ6ICdcIlxcXFxhMFwiJ1xuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWhhbmRsZXItd3JhcGBdOiB7XG4gICAgICAgIHpJbmRleDogMlxuICAgICAgfSxcbiAgICAgIFtjb21wb25lbnRDbHNdOiB7XG4gICAgICAgIHBvc2l0aW9uOiAnc3RhdGljJyxcbiAgICAgICAgY29sb3I6ICdpbmhlcml0JyxcbiAgICAgICAgJyYtcHJlZml4LCAmLXN1ZmZpeCc6IHtcbiAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgZmxleDogJ25vbmUnLFxuICAgICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJ1xuICAgICAgICB9LFxuICAgICAgICAnJi1wcmVmaXgnOiB7XG4gICAgICAgICAgbWFyZ2luSW5saW5lRW5kOiBpbnB1dEFmZml4UGFkZGluZ1xuICAgICAgICB9LFxuICAgICAgICAnJi1zdWZmaXgnOiB7XG4gICAgICAgICAgaW5zZXRCbG9ja1N0YXJ0OiAwLFxuICAgICAgICAgIGluc2V0SW5saW5lRW5kOiAwLFxuICAgICAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgICAgIG1hcmdpbklubGluZUVuZDogcGFkZGluZ0lubGluZSxcbiAgICAgICAgICBtYXJnaW5JbmxpbmVTdGFydDogaW5wdXRBZmZpeFBhZGRpbmcsXG4gICAgICAgICAgdHJhbnNpdGlvbjogYG1hcmdpbiAke21vdGlvbkR1cmF0aW9uTWlkfWBcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtgJjpob3ZlciAke2NvbXBvbmVudENsc30taGFuZGxlci13cmFwLCAmLWZvY3VzZWQgJHtjb21wb25lbnRDbHN9LWhhbmRsZXItd3JhcGBdOiB7XG4gICAgICAgIHdpZHRoOiB0b2tlbi5oYW5kbGVXaWR0aCxcbiAgICAgICAgb3BhY2l0eTogMVxuICAgICAgfSxcbiAgICAgIFtgJjpub3QoJHtjb21wb25lbnRDbHN9LWFmZml4LXdyYXBwZXItd2l0aG91dC1jb250cm9scyk6aG92ZXIgJHtjb21wb25lbnRDbHN9LXN1ZmZpeGBdOiB7XG4gICAgICAgIG1hcmdpbklubGluZUVuZDogdG9rZW4uY2FsYyh0b2tlbi5oYW5kbGVXaWR0aCkuYWRkKHBhZGRpbmdJbmxpbmUpLmVxdWFsKClcbiAgICAgIH1cbiAgICB9KVxuICB9O1xufTtcbmV4cG9ydCBkZWZhdWx0IGdlblN0eWxlSG9va3MoJ0lucHV0TnVtYmVyJywgdG9rZW4gPT4ge1xuICBjb25zdCBpbnB1dE51bWJlclRva2VuID0gbWVyZ2VUb2tlbih0b2tlbiwgaW5pdElucHV0VG9rZW4odG9rZW4pKTtcbiAgcmV0dXJuIFtnZW5JbnB1dE51bWJlclN0eWxlcyhpbnB1dE51bWJlclRva2VuKSwgZ2VuQWZmaXhXcmFwcGVyU3R5bGVzKGlucHV0TnVtYmVyVG9rZW4pLFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyA9PSAgICAgICAgICAgICBTcGFjZSBDb21wYWN0ICAgICAgICAgICAgICAgICAgICAgICA9PVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBnZW5Db21wYWN0SXRlbVN0eWxlKGlucHV0TnVtYmVyVG9rZW4pXTtcbn0sIHByZXBhcmVDb21wb25lbnRUb2tlbiwge1xuICB1bml0bGVzczoge1xuICAgIGhhbmRsZU9wYWNpdHk6IHRydWVcbiAgfVxufSk7IiwgIlwidXNlIGNsaWVudFwiO1xuXG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IFJlYWN0LCB7IGZvcndhcmRSZWYsIHVzZUNvbnRleHQsIHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUmNJbnB1dCBmcm9tICdyYy1pbnB1dCc7XG5pbXBvcnQgeyB0cmlnZ2VyRm9jdXMgfSBmcm9tIFwicmMtaW5wdXQvZXMvdXRpbHMvY29tbW9uVXRpbHNcIjtcbmltcG9ydCB7IGNvbXBvc2VSZWYgfSBmcm9tIFwicmMtdXRpbC9lcy9yZWZcIjtcbmltcG9ydCBDb250ZXh0SXNvbGF0b3IgZnJvbSAnLi4vX3V0aWwvQ29udGV4dElzb2xhdG9yJztcbmltcG9ydCBnZXRBbGxvd0NsZWFyIGZyb20gJy4uL191dGlsL2dldEFsbG93Q2xlYXInO1xuaW1wb3J0IHsgZ2V0TWVyZ2VkU3RhdHVzLCBnZXRTdGF0dXNDbGFzc05hbWVzIH0gZnJvbSAnLi4vX3V0aWwvc3RhdHVzVXRpbHMnO1xuaW1wb3J0IHsgZGV2VXNlV2FybmluZyB9IGZyb20gJy4uL191dGlsL3dhcm5pbmcnO1xuaW1wb3J0IHsgdXNlQ29tcG9uZW50Q29uZmlnIH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL2NvbnRleHQnO1xuaW1wb3J0IERpc2FibGVkQ29udGV4dCBmcm9tICcuLi9jb25maWctcHJvdmlkZXIvRGlzYWJsZWRDb250ZXh0JztcbmltcG9ydCB1c2VDU1NWYXJDbHMgZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL2hvb2tzL3VzZUNTU1ZhckNscyc7XG5pbXBvcnQgdXNlU2l6ZSBmcm9tICcuLi9jb25maWctcHJvdmlkZXIvaG9va3MvdXNlU2l6ZSc7XG5pbXBvcnQgeyBGb3JtSXRlbUlucHV0Q29udGV4dCB9IGZyb20gJy4uL2Zvcm0vY29udGV4dCc7XG5pbXBvcnQgdXNlVmFyaWFudCBmcm9tICcuLi9mb3JtL2hvb2tzL3VzZVZhcmlhbnRzJztcbmltcG9ydCB7IHVzZUNvbXBhY3RJdGVtQ29udGV4dCB9IGZyb20gJy4uL3NwYWNlL0NvbXBhY3QnO1xuaW1wb3J0IHVzZVJlbW92ZVBhc3N3b3JkVGltZW91dCBmcm9tICcuL2hvb2tzL3VzZVJlbW92ZVBhc3N3b3JkVGltZW91dCc7XG5pbXBvcnQgdXNlU3R5bGUsIHsgdXNlU2hhcmVkU3R5bGUgfSBmcm9tICcuL3N0eWxlJztcbmltcG9ydCB7IGhhc1ByZWZpeFN1ZmZpeCB9IGZyb20gJy4vdXRpbHMnO1xuZXhwb3J0IHsgdHJpZ2dlckZvY3VzIH07XG5jb25zdCBJbnB1dCA9IC8qI19fUFVSRV9fKi9mb3J3YXJkUmVmKChwcm9wcywgcmVmKSA9PiB7XG4gIGNvbnN0IHtcbiAgICAgIHByZWZpeENsczogY3VzdG9taXplUHJlZml4Q2xzLFxuICAgICAgYm9yZGVyZWQgPSB0cnVlLFxuICAgICAgc3RhdHVzOiBjdXN0b21TdGF0dXMsXG4gICAgICBzaXplOiBjdXN0b21TaXplLFxuICAgICAgZGlzYWJsZWQ6IGN1c3RvbURpc2FibGVkLFxuICAgICAgb25CbHVyLFxuICAgICAgb25Gb2N1cyxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGFsbG93Q2xlYXIsXG4gICAgICBhZGRvbkFmdGVyLFxuICAgICAgYWRkb25CZWZvcmUsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBzdHlsZSxcbiAgICAgIHN0eWxlcyxcbiAgICAgIHJvb3RDbGFzc05hbWUsXG4gICAgICBvbkNoYW5nZSxcbiAgICAgIGNsYXNzTmFtZXM6IGNsYXNzZXMsXG4gICAgICB2YXJpYW50OiBjdXN0b21WYXJpYW50XG4gICAgfSA9IHByb3BzLFxuICAgIHJlc3QgPSBfX3Jlc3QocHJvcHMsIFtcInByZWZpeENsc1wiLCBcImJvcmRlcmVkXCIsIFwic3RhdHVzXCIsIFwic2l6ZVwiLCBcImRpc2FibGVkXCIsIFwib25CbHVyXCIsIFwib25Gb2N1c1wiLCBcInN1ZmZpeFwiLCBcImFsbG93Q2xlYXJcIiwgXCJhZGRvbkFmdGVyXCIsIFwiYWRkb25CZWZvcmVcIiwgXCJjbGFzc05hbWVcIiwgXCJzdHlsZVwiLCBcInN0eWxlc1wiLCBcInJvb3RDbGFzc05hbWVcIiwgXCJvbkNoYW5nZVwiLCBcImNsYXNzTmFtZXNcIiwgXCJ2YXJpYW50XCJdKTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBjb25zdCB7XG4gICAgICBkZXByZWNhdGVkXG4gICAgfSA9IGRldlVzZVdhcm5pbmcoJ0lucHV0Jyk7XG4gICAgZGVwcmVjYXRlZCghKCdib3JkZXJlZCcgaW4gcHJvcHMpLCAnYm9yZGVyZWQnLCAndmFyaWFudCcpO1xuICB9XG4gIGNvbnN0IHtcbiAgICBnZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uLFxuICAgIGFsbG93Q2xlYXI6IGNvbnRleHRBbGxvd0NsZWFyLFxuICAgIGF1dG9Db21wbGV0ZTogY29udGV4dEF1dG9Db21wbGV0ZSxcbiAgICBjbGFzc05hbWU6IGNvbnRleHRDbGFzc05hbWUsXG4gICAgc3R5bGU6IGNvbnRleHRTdHlsZSxcbiAgICBjbGFzc05hbWVzOiBjb250ZXh0Q2xhc3NOYW1lcyxcbiAgICBzdHlsZXM6IGNvbnRleHRTdHlsZXNcbiAgfSA9IHVzZUNvbXBvbmVudENvbmZpZygnaW5wdXQnKTtcbiAgY29uc3QgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdpbnB1dCcsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIGNvbnN0IGlucHV0UmVmID0gdXNlUmVmKG51bGwpO1xuICAvLyBTdHlsZVxuICBjb25zdCByb290Q2xzID0gdXNlQ1NTVmFyQ2xzKHByZWZpeENscyk7XG4gIGNvbnN0IFt3cmFwU2hhcmVkQ1NTVmFyLCBoYXNoSWQsIGNzc1ZhckNsc10gPSB1c2VTaGFyZWRTdHlsZShwcmVmaXhDbHMsIHJvb3RDbGFzc05hbWUpO1xuICBjb25zdCBbd3JhcENTU1Zhcl0gPSB1c2VTdHlsZShwcmVmaXhDbHMsIHJvb3RDbHMpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gQ29tcGFjdCBJdGVtID09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCB7XG4gICAgY29tcGFjdFNpemUsXG4gICAgY29tcGFjdEl0ZW1DbGFzc25hbWVzXG4gIH0gPSB1c2VDb21wYWN0SXRlbUNvbnRleHQocHJlZml4Q2xzLCBkaXJlY3Rpb24pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gU2l6ZSA9PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3QgbWVyZ2VkU2l6ZSA9IHVzZVNpemUoY3R4ID0+IHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIChfYSA9IGN1c3RvbVNpemUgIT09IG51bGwgJiYgY3VzdG9tU2l6ZSAhPT0gdm9pZCAwID8gY3VzdG9tU2l6ZSA6IGNvbXBhY3RTaXplKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBjdHg7XG4gIH0pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gRGlzYWJsZWQgPT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IGRpc2FibGVkID0gUmVhY3QudXNlQ29udGV4dChEaXNhYmxlZENvbnRleHQpO1xuICBjb25zdCBtZXJnZWREaXNhYmxlZCA9IGN1c3RvbURpc2FibGVkICE9PSBudWxsICYmIGN1c3RvbURpc2FibGVkICE9PSB2b2lkIDAgPyBjdXN0b21EaXNhYmxlZCA6IGRpc2FibGVkO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gU3RhdHVzID09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCB7XG4gICAgc3RhdHVzOiBjb250ZXh0U3RhdHVzLFxuICAgIGhhc0ZlZWRiYWNrLFxuICAgIGZlZWRiYWNrSWNvblxuICB9ID0gdXNlQ29udGV4dChGb3JtSXRlbUlucHV0Q29udGV4dCk7XG4gIGNvbnN0IG1lcmdlZFN0YXR1cyA9IGdldE1lcmdlZFN0YXR1cyhjb250ZXh0U3RhdHVzLCBjdXN0b21TdGF0dXMpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gRm9jdXMgd2FybmluZyA9PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3QgaW5wdXRIYXNQcmVmaXhTdWZmaXggPSBoYXNQcmVmaXhTdWZmaXgocHJvcHMpIHx8ICEhaGFzRmVlZGJhY2s7XG4gIGNvbnN0IHByZXZIYXNQcmVmaXhTdWZmaXggPSB1c2VSZWYoaW5wdXRIYXNQcmVmaXhTdWZmaXgpO1xuICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1ob29rcy9ydWxlcy1vZi1ob29rcyAqL1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGNvbnN0IHdhcm5pbmcgPSBkZXZVc2VXYXJuaW5nKCdJbnB1dCcpO1xuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICB2YXIgX2E7XG4gICAgICBpZiAoaW5wdXRIYXNQcmVmaXhTdWZmaXggJiYgIXByZXZIYXNQcmVmaXhTdWZmaXguY3VycmVudCkge1xuICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09ICgoX2EgPSBpbnB1dFJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaW5wdXQpLCAndXNhZ2UnLCBgV2hlbiBJbnB1dCBpcyBmb2N1c2VkLCBkeW5hbWljIGFkZCBvciByZW1vdmUgcHJlZml4IC8gc3VmZml4IHdpbGwgbWFrZSBpdCBsb3NlIGZvY3VzIGNhdXNlZCBieSBkb20gc3RydWN0dXJlIGNoYW5nZS4gUmVhZCBtb3JlOiBodHRwczovL2FudC5kZXNpZ24vY29tcG9uZW50cy9pbnB1dC8jRkFRYCkgOiB2b2lkIDA7XG4gICAgICB9XG4gICAgICBwcmV2SGFzUHJlZml4U3VmZml4LmN1cnJlbnQgPSBpbnB1dEhhc1ByZWZpeFN1ZmZpeDtcbiAgICB9LCBbaW5wdXRIYXNQcmVmaXhTdWZmaXhdKTtcbiAgfVxuICAvKiBlc2xpbnQtZW5hYmxlICovXG4gIC8vID09PT09PT09PT09PT09PT09PT09PSBSZW1vdmUgUGFzc3dvcmQgdmFsdWUgPT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IHJlbW92ZVBhc3N3b3JkVGltZW91dCA9IHVzZVJlbW92ZVBhc3N3b3JkVGltZW91dChpbnB1dFJlZiwgdHJ1ZSk7XG4gIGNvbnN0IGhhbmRsZUJsdXIgPSBlID0+IHtcbiAgICByZW1vdmVQYXNzd29yZFRpbWVvdXQoKTtcbiAgICBvbkJsdXIgPT09IG51bGwgfHwgb25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJsdXIoZSk7XG4gIH07XG4gIGNvbnN0IGhhbmRsZUZvY3VzID0gZSA9PiB7XG4gICAgcmVtb3ZlUGFzc3dvcmRUaW1lb3V0KCk7XG4gICAgb25Gb2N1cyA9PT0gbnVsbCB8fCBvbkZvY3VzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkZvY3VzKGUpO1xuICB9O1xuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSBlID0+IHtcbiAgICByZW1vdmVQYXNzd29yZFRpbWVvdXQoKTtcbiAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UoZSk7XG4gIH07XG4gIGNvbnN0IHN1ZmZpeE5vZGUgPSAoaGFzRmVlZGJhY2sgfHwgc3VmZml4KSAmJiAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIHN1ZmZpeCwgaGFzRmVlZGJhY2sgJiYgZmVlZGJhY2tJY29uKSk7XG4gIGNvbnN0IG1lcmdlZEFsbG93Q2xlYXIgPSBnZXRBbGxvd0NsZWFyKGFsbG93Q2xlYXIgIT09IG51bGwgJiYgYWxsb3dDbGVhciAhPT0gdm9pZCAwID8gYWxsb3dDbGVhciA6IGNvbnRleHRBbGxvd0NsZWFyKTtcbiAgY29uc3QgW3ZhcmlhbnQsIGVuYWJsZVZhcmlhbnRDbHNdID0gdXNlVmFyaWFudCgnaW5wdXQnLCBjdXN0b21WYXJpYW50LCBib3JkZXJlZCk7XG4gIHJldHVybiB3cmFwU2hhcmVkQ1NTVmFyKHdyYXBDU1NWYXIoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmNJbnB1dCwgT2JqZWN0LmFzc2lnbih7XG4gICAgcmVmOiBjb21wb3NlUmVmKHJlZiwgaW5wdXRSZWYpLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGF1dG9Db21wbGV0ZTogY29udGV4dEF1dG9Db21wbGV0ZVxuICB9LCByZXN0LCB7XG4gICAgZGlzYWJsZWQ6IG1lcmdlZERpc2FibGVkLFxuICAgIG9uQmx1cjogaGFuZGxlQmx1cixcbiAgICBvbkZvY3VzOiBoYW5kbGVGb2N1cyxcbiAgICBzdHlsZTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjb250ZXh0U3R5bGUpLCBzdHlsZSksXG4gICAgc3R5bGVzOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGNvbnRleHRTdHlsZXMpLCBzdHlsZXMpLFxuICAgIHN1ZmZpeDogc3VmZml4Tm9kZSxcbiAgICBhbGxvd0NsZWFyOiBtZXJnZWRBbGxvd0NsZWFyLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIHJvb3RDbGFzc05hbWUsIGNzc1ZhckNscywgcm9vdENscywgY29tcGFjdEl0ZW1DbGFzc25hbWVzLCBjb250ZXh0Q2xhc3NOYW1lKSxcbiAgICBvbkNoYW5nZTogaGFuZGxlQ2hhbmdlLFxuICAgIGFkZG9uQmVmb3JlOiBhZGRvbkJlZm9yZSAmJiAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29udGV4dElzb2xhdG9yLCB7XG4gICAgICBmb3JtOiB0cnVlLFxuICAgICAgc3BhY2U6IHRydWVcbiAgICB9LCBhZGRvbkJlZm9yZSkpLFxuICAgIGFkZG9uQWZ0ZXI6IGFkZG9uQWZ0ZXIgJiYgKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbnRleHRJc29sYXRvciwge1xuICAgICAgZm9ybTogdHJ1ZSxcbiAgICAgIHNwYWNlOiB0cnVlXG4gICAgfSwgYWRkb25BZnRlcikpLFxuICAgIGNsYXNzTmFtZXM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjbGFzc2VzKSwgY29udGV4dENsYXNzTmFtZXMpLCB7XG4gICAgICBpbnB1dDogY2xhc3NOYW1lcyh7XG4gICAgICAgIFtgJHtwcmVmaXhDbHN9LXNtYF06IG1lcmdlZFNpemUgPT09ICdzbWFsbCcsXG4gICAgICAgIFtgJHtwcmVmaXhDbHN9LWxnYF06IG1lcmdlZFNpemUgPT09ICdsYXJnZScsXG4gICAgICAgIFtgJHtwcmVmaXhDbHN9LXJ0bGBdOiBkaXJlY3Rpb24gPT09ICdydGwnXG4gICAgICB9LCBjbGFzc2VzID09PSBudWxsIHx8IGNsYXNzZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNsYXNzZXMuaW5wdXQsIGNvbnRleHRDbGFzc05hbWVzLmlucHV0LCBoYXNoSWQpLFxuICAgICAgdmFyaWFudDogY2xhc3NOYW1lcyh7XG4gICAgICAgIFtgJHtwcmVmaXhDbHN9LSR7dmFyaWFudH1gXTogZW5hYmxlVmFyaWFudENsc1xuICAgICAgfSwgZ2V0U3RhdHVzQ2xhc3NOYW1lcyhwcmVmaXhDbHMsIG1lcmdlZFN0YXR1cykpLFxuICAgICAgYWZmaXhXcmFwcGVyOiBjbGFzc05hbWVzKHtcbiAgICAgICAgW2Ake3ByZWZpeENsc30tYWZmaXgtd3JhcHBlci1zbWBdOiBtZXJnZWRTaXplID09PSAnc21hbGwnLFxuICAgICAgICBbYCR7cHJlZml4Q2xzfS1hZmZpeC13cmFwcGVyLWxnYF06IG1lcmdlZFNpemUgPT09ICdsYXJnZScsXG4gICAgICAgIFtgJHtwcmVmaXhDbHN9LWFmZml4LXdyYXBwZXItcnRsYF06IGRpcmVjdGlvbiA9PT0gJ3J0bCdcbiAgICAgIH0sIGhhc2hJZCksXG4gICAgICB3cmFwcGVyOiBjbGFzc05hbWVzKHtcbiAgICAgICAgW2Ake3ByZWZpeENsc30tZ3JvdXAtcnRsYF06IGRpcmVjdGlvbiA9PT0gJ3J0bCdcbiAgICAgIH0sIGhhc2hJZCksXG4gICAgICBncm91cFdyYXBwZXI6IGNsYXNzTmFtZXMoe1xuICAgICAgICBbYCR7cHJlZml4Q2xzfS1ncm91cC13cmFwcGVyLXNtYF06IG1lcmdlZFNpemUgPT09ICdzbWFsbCcsXG4gICAgICAgIFtgJHtwcmVmaXhDbHN9LWdyb3VwLXdyYXBwZXItbGdgXTogbWVyZ2VkU2l6ZSA9PT0gJ2xhcmdlJyxcbiAgICAgICAgW2Ake3ByZWZpeENsc30tZ3JvdXAtd3JhcHBlci1ydGxgXTogZGlyZWN0aW9uID09PSAncnRsJyxcbiAgICAgICAgW2Ake3ByZWZpeENsc30tZ3JvdXAtd3JhcHBlci0ke3ZhcmlhbnR9YF06IGVuYWJsZVZhcmlhbnRDbHNcbiAgICAgIH0sIGdldFN0YXR1c0NsYXNzTmFtZXMoYCR7cHJlZml4Q2xzfS1ncm91cC13cmFwcGVyYCwgbWVyZ2VkU3RhdHVzLCBoYXNGZWVkYmFjayksIGhhc2hJZClcbiAgICB9KVxuICB9KSkpKTtcbn0pO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgSW5wdXQuZGlzcGxheU5hbWUgPSAnSW5wdXQnO1xufVxuZXhwb3J0IGRlZmF1bHQgSW5wdXQ7IiwgIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IENsb3NlQ2lyY2xlRmlsbGVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9DbG9zZUNpcmNsZUZpbGxlZFwiO1xuY29uc3QgZ2V0QWxsb3dDbGVhciA9IGFsbG93Q2xlYXIgPT4ge1xuICBsZXQgbWVyZ2VkQWxsb3dDbGVhcjtcbiAgaWYgKHR5cGVvZiBhbGxvd0NsZWFyID09PSAnb2JqZWN0JyAmJiAoYWxsb3dDbGVhciA9PT0gbnVsbCB8fCBhbGxvd0NsZWFyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhbGxvd0NsZWFyLmNsZWFySWNvbikpIHtcbiAgICBtZXJnZWRBbGxvd0NsZWFyID0gYWxsb3dDbGVhcjtcbiAgfSBlbHNlIGlmIChhbGxvd0NsZWFyKSB7XG4gICAgbWVyZ2VkQWxsb3dDbGVhciA9IHtcbiAgICAgIGNsZWFySWNvbjogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ2xvc2VDaXJjbGVGaWxsZWQsIG51bGwpXG4gICAgfTtcbiAgfVxuICByZXR1cm4gbWVyZ2VkQWxsb3dDbGVhcjtcbn07XG5leHBvcnQgZGVmYXVsdCBnZXRBbGxvd0NsZWFyOyIsICJpbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVJlbW92ZVBhc3N3b3JkVGltZW91dChpbnB1dFJlZiwgdHJpZ2dlck9uTW91bnQpIHtcbiAgY29uc3QgcmVtb3ZlUGFzc3dvcmRUaW1lb3V0UmVmID0gdXNlUmVmKFtdKTtcbiAgY29uc3QgcmVtb3ZlUGFzc3dvcmRUaW1lb3V0ID0gKCkgPT4ge1xuICAgIHJlbW92ZVBhc3N3b3JkVGltZW91dFJlZi5jdXJyZW50LnB1c2goc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICBpZiAoKChfYSA9IGlucHV0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5pbnB1dCkgJiYgKChfYiA9IGlucHV0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5pbnB1dC5nZXRBdHRyaWJ1dGUoJ3R5cGUnKSkgPT09ICdwYXNzd29yZCcgJiYgKChfYyA9IGlucHV0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5pbnB1dC5oYXNBdHRyaWJ1dGUoJ3ZhbHVlJykpKSB7XG4gICAgICAgIChfZCA9IGlucHV0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5pbnB1dC5yZW1vdmVBdHRyaWJ1dGUoJ3ZhbHVlJyk7XG4gICAgICB9XG4gICAgfSkpO1xuICB9O1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh0cmlnZ2VyT25Nb3VudCkge1xuICAgICAgcmVtb3ZlUGFzc3dvcmRUaW1lb3V0KCk7XG4gICAgfVxuICAgIHJldHVybiAoKSA9PiByZW1vdmVQYXNzd29yZFRpbWVvdXRSZWYuY3VycmVudC5mb3JFYWNoKHRpbWVyID0+IHtcbiAgICAgIGlmICh0aW1lcikge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9LCBbXSk7XG4gIHJldHVybiByZW1vdmVQYXNzd29yZFRpbWVvdXQ7XG59IiwgImV4cG9ydCBmdW5jdGlvbiBoYXNQcmVmaXhTdWZmaXgocHJvcHMpIHtcbiAgcmV0dXJuICEhKHByb3BzLnByZWZpeCB8fCBwcm9wcy5zdWZmaXggfHwgcHJvcHMuYWxsb3dDbGVhciB8fCBwcm9wcy5zaG93Q291bnQpO1xufSIsICJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBjbHMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgdXNlRXZlbnQgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlRXZlbnRcIjtcbmltcG9ydCB1c2VNZXJnZWRTdGF0ZSBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VNZXJnZWRTdGF0ZVwiO1xuaW1wb3J0IGlzRXF1YWwgZnJvbSBcInJjLXV0aWwvZXMvaXNFcXVhbFwiO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEhhbmRsZXMgZnJvbSBcIi4vSGFuZGxlc1wiO1xuaW1wb3J0IE1hcmtzIGZyb20gXCIuL01hcmtzXCI7XG5pbXBvcnQgU3RlcHMgZnJvbSBcIi4vU3RlcHNcIjtcbmltcG9ydCBUcmFja3MgZnJvbSBcIi4vVHJhY2tzXCI7XG5pbXBvcnQgU2xpZGVyQ29udGV4dCBmcm9tIFwiLi9jb250ZXh0XCI7XG5pbXBvcnQgdXNlRHJhZyBmcm9tIFwiLi9ob29rcy91c2VEcmFnXCI7XG5pbXBvcnQgdXNlT2Zmc2V0IGZyb20gXCIuL2hvb2tzL3VzZU9mZnNldFwiO1xuaW1wb3J0IHVzZVJhbmdlIGZyb20gXCIuL2hvb2tzL3VzZVJhbmdlXCI7XG5cbi8qKlxuICogTmV3OlxuICogLSBjbGljayBtYXJrIHRvIHVwZGF0ZSByYW5nZSB2YWx1ZVxuICogLSBoYW5kbGVSZW5kZXJcbiAqIC0gRml4IGhhbmRsZSB3aXRoIGNvdW50IG5vdCBjb3JyZWN0XG4gKiAtIEZpeCBwdXNoYWJsZSBub3Qgd29yayBpbiBzb21lIGNhc2VcbiAqIC0gTm8gbW9yZSBGaW5kRE9NTm9kZVxuICogLSBNb3ZlIGFsbCBwb3NpdGlvbiByZWxhdGVkIHN0eWxlIGludG8gaW5saW5lIHN0eWxlXG4gKiAtIEtleTogdXAgaXMgcGx1cywgZG93biBpcyBtaW51c1xuICogLSBmaXggS2V5IHdpdGggc3RlcCA9IG51bGwgbm90IGFsaWduIHdpdGggbWFya3NcbiAqIC0gQ2hhbmdlIHJhbmdlIHNob3VsZCBub3QgdHJpZ2dlciBvbkNoYW5nZVxuICogLSBrZXlib2FyZCBzdXBwb3J0IHB1c2hhYmxlXG4gKi9cblxudmFyIFNsaWRlciA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBfcHJvcHMkcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIHByZWZpeENscyA9IF9wcm9wcyRwcmVmaXhDbHMgPT09IHZvaWQgMCA/ICdyYy1zbGlkZXInIDogX3Byb3BzJHByZWZpeENscyxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICBjbGFzc05hbWVzID0gcHJvcHMuY2xhc3NOYW1lcyxcbiAgICBzdHlsZXMgPSBwcm9wcy5zdHlsZXMsXG4gICAgaWQgPSBwcm9wcy5pZCxcbiAgICBfcHJvcHMkZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICBkaXNhYmxlZCA9IF9wcm9wcyRkaXNhYmxlZCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkZGlzYWJsZWQsXG4gICAgX3Byb3BzJGtleWJvYXJkID0gcHJvcHMua2V5Ym9hcmQsXG4gICAga2V5Ym9hcmQgPSBfcHJvcHMka2V5Ym9hcmQgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMka2V5Ym9hcmQsXG4gICAgYXV0b0ZvY3VzID0gcHJvcHMuYXV0b0ZvY3VzLFxuICAgIG9uRm9jdXMgPSBwcm9wcy5vbkZvY3VzLFxuICAgIG9uQmx1ciA9IHByb3BzLm9uQmx1cixcbiAgICBfcHJvcHMkbWluID0gcHJvcHMubWluLFxuICAgIG1pbiA9IF9wcm9wcyRtaW4gPT09IHZvaWQgMCA/IDAgOiBfcHJvcHMkbWluLFxuICAgIF9wcm9wcyRtYXggPSBwcm9wcy5tYXgsXG4gICAgbWF4ID0gX3Byb3BzJG1heCA9PT0gdm9pZCAwID8gMTAwIDogX3Byb3BzJG1heCxcbiAgICBfcHJvcHMkc3RlcCA9IHByb3BzLnN0ZXAsXG4gICAgc3RlcCA9IF9wcm9wcyRzdGVwID09PSB2b2lkIDAgPyAxIDogX3Byb3BzJHN0ZXAsXG4gICAgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICBkZWZhdWx0VmFsdWUgPSBwcm9wcy5kZWZhdWx0VmFsdWUsXG4gICAgcmFuZ2UgPSBwcm9wcy5yYW5nZSxcbiAgICBjb3VudCA9IHByb3BzLmNvdW50LFxuICAgIG9uQ2hhbmdlID0gcHJvcHMub25DaGFuZ2UsXG4gICAgb25CZWZvcmVDaGFuZ2UgPSBwcm9wcy5vbkJlZm9yZUNoYW5nZSxcbiAgICBvbkFmdGVyQ2hhbmdlID0gcHJvcHMub25BZnRlckNoYW5nZSxcbiAgICBvbkNoYW5nZUNvbXBsZXRlID0gcHJvcHMub25DaGFuZ2VDb21wbGV0ZSxcbiAgICBfcHJvcHMkYWxsb3dDcm9zcyA9IHByb3BzLmFsbG93Q3Jvc3MsXG4gICAgYWxsb3dDcm9zcyA9IF9wcm9wcyRhbGxvd0Nyb3NzID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJGFsbG93Q3Jvc3MsXG4gICAgX3Byb3BzJHB1c2hhYmxlID0gcHJvcHMucHVzaGFibGUsXG4gICAgcHVzaGFibGUgPSBfcHJvcHMkcHVzaGFibGUgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJHB1c2hhYmxlLFxuICAgIHJldmVyc2UgPSBwcm9wcy5yZXZlcnNlLFxuICAgIHZlcnRpY2FsID0gcHJvcHMudmVydGljYWwsXG4gICAgX3Byb3BzJGluY2x1ZGVkID0gcHJvcHMuaW5jbHVkZWQsXG4gICAgaW5jbHVkZWQgPSBfcHJvcHMkaW5jbHVkZWQgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkaW5jbHVkZWQsXG4gICAgc3RhcnRQb2ludCA9IHByb3BzLnN0YXJ0UG9pbnQsXG4gICAgdHJhY2tTdHlsZSA9IHByb3BzLnRyYWNrU3R5bGUsXG4gICAgaGFuZGxlU3R5bGUgPSBwcm9wcy5oYW5kbGVTdHlsZSxcbiAgICByYWlsU3R5bGUgPSBwcm9wcy5yYWlsU3R5bGUsXG4gICAgZG90U3R5bGUgPSBwcm9wcy5kb3RTdHlsZSxcbiAgICBhY3RpdmVEb3RTdHlsZSA9IHByb3BzLmFjdGl2ZURvdFN0eWxlLFxuICAgIG1hcmtzID0gcHJvcHMubWFya3MsXG4gICAgZG90cyA9IHByb3BzLmRvdHMsXG4gICAgaGFuZGxlUmVuZGVyID0gcHJvcHMuaGFuZGxlUmVuZGVyLFxuICAgIGFjdGl2ZUhhbmRsZVJlbmRlciA9IHByb3BzLmFjdGl2ZUhhbmRsZVJlbmRlcixcbiAgICB0cmFjayA9IHByb3BzLnRyYWNrLFxuICAgIF9wcm9wcyR0YWJJbmRleCA9IHByb3BzLnRhYkluZGV4LFxuICAgIHRhYkluZGV4ID0gX3Byb3BzJHRhYkluZGV4ID09PSB2b2lkIDAgPyAwIDogX3Byb3BzJHRhYkluZGV4LFxuICAgIGFyaWFMYWJlbEZvckhhbmRsZSA9IHByb3BzLmFyaWFMYWJlbEZvckhhbmRsZSxcbiAgICBhcmlhTGFiZWxsZWRCeUZvckhhbmRsZSA9IHByb3BzLmFyaWFMYWJlbGxlZEJ5Rm9ySGFuZGxlLFxuICAgIGFyaWFSZXF1aXJlZCA9IHByb3BzLmFyaWFSZXF1aXJlZCxcbiAgICBhcmlhVmFsdWVUZXh0Rm9ybWF0dGVyRm9ySGFuZGxlID0gcHJvcHMuYXJpYVZhbHVlVGV4dEZvcm1hdHRlckZvckhhbmRsZTtcbiAgdmFyIGhhbmRsZXNSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHZhciBjb250YWluZXJSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHZhciBkaXJlY3Rpb24gPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodmVydGljYWwpIHtcbiAgICAgIHJldHVybiByZXZlcnNlID8gJ3R0YicgOiAnYnR0JztcbiAgICB9XG4gICAgcmV0dXJuIHJldmVyc2UgPyAncnRsJyA6ICdsdHInO1xuICB9LCBbcmV2ZXJzZSwgdmVydGljYWxdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJhbmdlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfdXNlUmFuZ2UgPSB1c2VSYW5nZShyYW5nZSksXG4gICAgX3VzZVJhbmdlMiA9IF9zbGljZWRUb0FycmF5KF91c2VSYW5nZSwgNSksXG4gICAgcmFuZ2VFbmFibGVkID0gX3VzZVJhbmdlMlswXSxcbiAgICByYW5nZUVkaXRhYmxlID0gX3VzZVJhbmdlMlsxXSxcbiAgICByYW5nZURyYWdnYWJsZVRyYWNrID0gX3VzZVJhbmdlMlsyXSxcbiAgICBtaW5Db3VudCA9IF91c2VSYW5nZTJbM10sXG4gICAgbWF4Q291bnQgPSBfdXNlUmFuZ2UyWzRdO1xuICB2YXIgbWVyZ2VkTWluID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGlzRmluaXRlKG1pbikgPyBtaW4gOiAwO1xuICB9LCBbbWluXSk7XG4gIHZhciBtZXJnZWRNYXggPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gaXNGaW5pdGUobWF4KSA/IG1heCA6IDEwMDtcbiAgfSwgW21heF0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFN0ZXAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG1lcmdlZFN0ZXAgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gc3RlcCAhPT0gbnVsbCAmJiBzdGVwIDw9IDAgPyAxIDogc3RlcDtcbiAgfSwgW3N0ZXBdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBQdXNoID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBtZXJnZWRQdXNoID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHR5cGVvZiBwdXNoYWJsZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICByZXR1cm4gcHVzaGFibGUgPyBtZXJnZWRTdGVwIDogZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBwdXNoYWJsZSA+PSAwID8gcHVzaGFibGUgOiBmYWxzZTtcbiAgfSwgW3B1c2hhYmxlLCBtZXJnZWRTdGVwXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBNYXJrcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgbWFya0xpc3QgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMobWFya3MgfHwge30pLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICB2YXIgbWFyayA9IG1hcmtzW2tleV07XG4gICAgICB2YXIgbWFya09iaiA9IHtcbiAgICAgICAgdmFsdWU6IE51bWJlcihrZXkpXG4gICAgICB9O1xuICAgICAgaWYgKG1hcmsgJiYgX3R5cGVvZihtYXJrKSA9PT0gJ29iamVjdCcgJiYgISAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQobWFyaykgJiYgKCdsYWJlbCcgaW4gbWFyayB8fCAnc3R5bGUnIGluIG1hcmspKSB7XG4gICAgICAgIG1hcmtPYmouc3R5bGUgPSBtYXJrLnN0eWxlO1xuICAgICAgICBtYXJrT2JqLmxhYmVsID0gbWFyay5sYWJlbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1hcmtPYmoubGFiZWwgPSBtYXJrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1hcmtPYmo7XG4gICAgfSkuZmlsdGVyKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICB2YXIgbGFiZWwgPSBfcmVmLmxhYmVsO1xuICAgICAgcmV0dXJuIGxhYmVsIHx8IHR5cGVvZiBsYWJlbCA9PT0gJ251bWJlcic7XG4gICAgfSkuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEudmFsdWUgLSBiLnZhbHVlO1xuICAgIH0pO1xuICB9LCBbbWFya3NdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IEZvcm1hdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfdXNlT2Zmc2V0ID0gdXNlT2Zmc2V0KG1lcmdlZE1pbiwgbWVyZ2VkTWF4LCBtZXJnZWRTdGVwLCBtYXJrTGlzdCwgYWxsb3dDcm9zcywgbWVyZ2VkUHVzaCksXG4gICAgX3VzZU9mZnNldDIgPSBfc2xpY2VkVG9BcnJheShfdXNlT2Zmc2V0LCAyKSxcbiAgICBmb3JtYXRWYWx1ZSA9IF91c2VPZmZzZXQyWzBdLFxuICAgIG9mZnNldFZhbHVlcyA9IF91c2VPZmZzZXQyWzFdO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gVmFsdWVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF91c2VNZXJnZWRTdGF0ZSA9IHVzZU1lcmdlZFN0YXRlKGRlZmF1bHRWYWx1ZSwge1xuICAgICAgdmFsdWU6IHZhbHVlXG4gICAgfSksXG4gICAgX3VzZU1lcmdlZFN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VNZXJnZWRTdGF0ZSwgMiksXG4gICAgbWVyZ2VkVmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGUyWzBdLFxuICAgIHNldFZhbHVlID0gX3VzZU1lcmdlZFN0YXRlMlsxXTtcbiAgdmFyIHJhd1ZhbHVlcyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciB2YWx1ZUxpc3QgPSBtZXJnZWRWYWx1ZSA9PT0gbnVsbCB8fCBtZXJnZWRWYWx1ZSA9PT0gdW5kZWZpbmVkID8gW10gOiBBcnJheS5pc0FycmF5KG1lcmdlZFZhbHVlKSA/IG1lcmdlZFZhbHVlIDogW21lcmdlZFZhbHVlXTtcbiAgICB2YXIgX3ZhbHVlTGlzdCA9IF9zbGljZWRUb0FycmF5KHZhbHVlTGlzdCwgMSksXG4gICAgICBfdmFsdWVMaXN0JCA9IF92YWx1ZUxpc3RbMF0sXG4gICAgICB2YWwwID0gX3ZhbHVlTGlzdCQgPT09IHZvaWQgMCA/IG1lcmdlZE1pbiA6IF92YWx1ZUxpc3QkO1xuICAgIHZhciByZXR1cm5WYWx1ZXMgPSBtZXJnZWRWYWx1ZSA9PT0gbnVsbCA/IFtdIDogW3ZhbDBdO1xuXG4gICAgLy8gRm9ybWF0IGFzIHJhbmdlXG4gICAgaWYgKHJhbmdlRW5hYmxlZCkge1xuICAgICAgcmV0dXJuVmFsdWVzID0gX3RvQ29uc3VtYWJsZUFycmF5KHZhbHVlTGlzdCk7XG5cbiAgICAgIC8vIFdoZW4gY291bnQgcHJvdmlkZWQgb3IgdmFsdWUgaXMgYHVuZGVmaW5lZGAsIHdlIGZpbGwgdmFsdWVzXG4gICAgICBpZiAoY291bnQgfHwgbWVyZ2VkVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YXIgcG9pbnRDb3VudCA9IGNvdW50ID49IDAgPyBjb3VudCArIDEgOiAyO1xuICAgICAgICByZXR1cm5WYWx1ZXMgPSByZXR1cm5WYWx1ZXMuc2xpY2UoMCwgcG9pbnRDb3VudCk7XG5cbiAgICAgICAgLy8gRmlsbCB3aXRoIGNvdW50XG4gICAgICAgIHdoaWxlIChyZXR1cm5WYWx1ZXMubGVuZ3RoIDwgcG9pbnRDb3VudCkge1xuICAgICAgICAgIHZhciBfcmV0dXJuVmFsdWVzO1xuICAgICAgICAgIHJldHVyblZhbHVlcy5wdXNoKChfcmV0dXJuVmFsdWVzID0gcmV0dXJuVmFsdWVzW3JldHVyblZhbHVlcy5sZW5ndGggLSAxXSkgIT09IG51bGwgJiYgX3JldHVyblZhbHVlcyAhPT0gdm9pZCAwID8gX3JldHVyblZhbHVlcyA6IG1lcmdlZE1pbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVyblZhbHVlcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIHJldHVybiBhIC0gYjtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFsaWduIGluIHJhbmdlXG4gICAgcmV0dXJuVmFsdWVzLmZvckVhY2goZnVuY3Rpb24gKHZhbCwgaW5kZXgpIHtcbiAgICAgIHJldHVyblZhbHVlc1tpbmRleF0gPSBmb3JtYXRWYWx1ZSh2YWwpO1xuICAgIH0pO1xuICAgIHJldHVybiByZXR1cm5WYWx1ZXM7XG4gIH0sIFttZXJnZWRWYWx1ZSwgcmFuZ2VFbmFibGVkLCBtZXJnZWRNaW4sIGNvdW50LCBmb3JtYXRWYWx1ZV0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBvbkNoYW5nZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGdldFRyaWdnZXJWYWx1ZSA9IGZ1bmN0aW9uIGdldFRyaWdnZXJWYWx1ZSh0cmlnZ2VyVmFsdWVzKSB7XG4gICAgcmV0dXJuIHJhbmdlRW5hYmxlZCA/IHRyaWdnZXJWYWx1ZXMgOiB0cmlnZ2VyVmFsdWVzWzBdO1xuICB9O1xuICB2YXIgdHJpZ2dlckNoYW5nZSA9IHVzZUV2ZW50KGZ1bmN0aW9uIChuZXh0VmFsdWVzKSB7XG4gICAgLy8gT3JkZXIgZmlyc3RcbiAgICB2YXIgY2xvbmVOZXh0VmFsdWVzID0gX3RvQ29uc3VtYWJsZUFycmF5KG5leHRWYWx1ZXMpLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBhIC0gYjtcbiAgICB9KTtcblxuICAgIC8vIFRyaWdnZXIgZXZlbnQgaWYgbmVlZGVkXG4gICAgaWYgKG9uQ2hhbmdlICYmICFpc0VxdWFsKGNsb25lTmV4dFZhbHVlcywgcmF3VmFsdWVzLCB0cnVlKSkge1xuICAgICAgb25DaGFuZ2UoZ2V0VHJpZ2dlclZhbHVlKGNsb25lTmV4dFZhbHVlcykpO1xuICAgIH1cblxuICAgIC8vIFdlIHNldCB0aGlzIGxhdGVyIHNpbmNlIGl0IHdpbGwgcmUtcmVuZGVyIGNvbXBvbmVudCBpbW1lZGlhdGVseVxuICAgIHNldFZhbHVlKGNsb25lTmV4dFZhbHVlcyk7XG4gIH0pO1xuICB2YXIgZmluaXNoQ2hhbmdlID0gdXNlRXZlbnQoZnVuY3Rpb24gKGRyYWdnaW5nRGVsZXRlKSB7XG4gICAgLy8gVHJpZ2dlciBmcm9tIGB1c2VEcmFnYCB3aWxsIHRlbGwgaWYgaXQncyBhIGRlbGV0ZSBhY3Rpb25cbiAgICBpZiAoZHJhZ2dpbmdEZWxldGUpIHtcbiAgICAgIGhhbmRsZXNSZWYuY3VycmVudC5oaWRlSGVscCgpO1xuICAgIH1cbiAgICB2YXIgZmluaXNoVmFsdWUgPSBnZXRUcmlnZ2VyVmFsdWUocmF3VmFsdWVzKTtcbiAgICBvbkFmdGVyQ2hhbmdlID09PSBudWxsIHx8IG9uQWZ0ZXJDaGFuZ2UgPT09IHZvaWQgMCB8fCBvbkFmdGVyQ2hhbmdlKGZpbmlzaFZhbHVlKTtcbiAgICB3YXJuaW5nKCFvbkFmdGVyQ2hhbmdlLCAnW3JjLXNsaWRlcl0gYG9uQWZ0ZXJDaGFuZ2VgIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgYG9uQ2hhbmdlQ29tcGxldGVgIGluc3RlYWQuJyk7XG4gICAgb25DaGFuZ2VDb21wbGV0ZSA9PT0gbnVsbCB8fCBvbkNoYW5nZUNvbXBsZXRlID09PSB2b2lkIDAgfHwgb25DaGFuZ2VDb21wbGV0ZShmaW5pc2hWYWx1ZSk7XG4gIH0pO1xuICB2YXIgb25EZWxldGUgPSBmdW5jdGlvbiBvbkRlbGV0ZShpbmRleCkge1xuICAgIGlmIChkaXNhYmxlZCB8fCAhcmFuZ2VFZGl0YWJsZSB8fCByYXdWYWx1ZXMubGVuZ3RoIDw9IG1pbkNvdW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBjbG9uZU5leHRWYWx1ZXMgPSBfdG9Db25zdW1hYmxlQXJyYXkocmF3VmFsdWVzKTtcbiAgICBjbG9uZU5leHRWYWx1ZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBvbkJlZm9yZUNoYW5nZSA9PT0gbnVsbCB8fCBvbkJlZm9yZUNoYW5nZSA9PT0gdm9pZCAwIHx8IG9uQmVmb3JlQ2hhbmdlKGdldFRyaWdnZXJWYWx1ZShjbG9uZU5leHRWYWx1ZXMpKTtcbiAgICB0cmlnZ2VyQ2hhbmdlKGNsb25lTmV4dFZhbHVlcyk7XG4gICAgdmFyIG5leHRGb2N1c0luZGV4ID0gTWF0aC5tYXgoMCwgaW5kZXggLSAxKTtcbiAgICBoYW5kbGVzUmVmLmN1cnJlbnQuaGlkZUhlbHAoKTtcbiAgICBoYW5kbGVzUmVmLmN1cnJlbnQuZm9jdXMobmV4dEZvY3VzSW5kZXgpO1xuICB9O1xuICB2YXIgX3VzZURyYWcgPSB1c2VEcmFnKGNvbnRhaW5lclJlZiwgZGlyZWN0aW9uLCByYXdWYWx1ZXMsIG1lcmdlZE1pbiwgbWVyZ2VkTWF4LCBmb3JtYXRWYWx1ZSwgdHJpZ2dlckNoYW5nZSwgZmluaXNoQ2hhbmdlLCBvZmZzZXRWYWx1ZXMsIHJhbmdlRWRpdGFibGUsIG1pbkNvdW50KSxcbiAgICBfdXNlRHJhZzIgPSBfc2xpY2VkVG9BcnJheShfdXNlRHJhZywgNSksXG4gICAgZHJhZ2dpbmdJbmRleCA9IF91c2VEcmFnMlswXSxcbiAgICBkcmFnZ2luZ1ZhbHVlID0gX3VzZURyYWcyWzFdLFxuICAgIGRyYWdnaW5nRGVsZXRlID0gX3VzZURyYWcyWzJdLFxuICAgIGNhY2hlVmFsdWVzID0gX3VzZURyYWcyWzNdLFxuICAgIG9uU3RhcnREcmFnID0gX3VzZURyYWcyWzRdO1xuXG4gIC8qKlxuICAgKiBXaGVuIGByYW5nZUVkaXRhYmxlYCB3aWxsIGluc2VydCBhIG5ldyB2YWx1ZSBpbiB0aGUgdmFsdWVzIGFycmF5LlxuICAgKiBFbHNlIGl0IHdpbGwgcmVwbGFjZSB0aGUgdmFsdWUgaW4gdGhlIHZhbHVlcyBhcnJheS5cbiAgICovXG4gIHZhciBjaGFuZ2VUb0Nsb3NlVmFsdWUgPSBmdW5jdGlvbiBjaGFuZ2VUb0Nsb3NlVmFsdWUobmV3VmFsdWUsIGUpIHtcbiAgICBpZiAoIWRpc2FibGVkKSB7XG4gICAgICAvLyBDcmVhdGUgbmV3IHZhbHVlc1xuICAgICAgdmFyIGNsb25lTmV4dFZhbHVlcyA9IF90b0NvbnN1bWFibGVBcnJheShyYXdWYWx1ZXMpO1xuICAgICAgdmFyIHZhbHVlSW5kZXggPSAwO1xuICAgICAgdmFyIHZhbHVlQmVmb3JlSW5kZXggPSAwOyAvLyBSZWNvcmQgdGhlIGluZGV4IHdoaWNoIHZhbHVlIDwgbmV3VmFsdWVcbiAgICAgIHZhciB2YWx1ZURpc3QgPSBtZXJnZWRNYXggLSBtZXJnZWRNaW47XG4gICAgICByYXdWYWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAodmFsLCBpbmRleCkge1xuICAgICAgICB2YXIgZGlzdCA9IE1hdGguYWJzKG5ld1ZhbHVlIC0gdmFsKTtcbiAgICAgICAgaWYgKGRpc3QgPD0gdmFsdWVEaXN0KSB7XG4gICAgICAgICAgdmFsdWVEaXN0ID0gZGlzdDtcbiAgICAgICAgICB2YWx1ZUluZGV4ID0gaW5kZXg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbCA8IG5ld1ZhbHVlKSB7XG4gICAgICAgICAgdmFsdWVCZWZvcmVJbmRleCA9IGluZGV4O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHZhciBmb2N1c0luZGV4ID0gdmFsdWVJbmRleDtcbiAgICAgIGlmIChyYW5nZUVkaXRhYmxlICYmIHZhbHVlRGlzdCAhPT0gMCAmJiAoIW1heENvdW50IHx8IHJhd1ZhbHVlcy5sZW5ndGggPCBtYXhDb3VudCkpIHtcbiAgICAgICAgY2xvbmVOZXh0VmFsdWVzLnNwbGljZSh2YWx1ZUJlZm9yZUluZGV4ICsgMSwgMCwgbmV3VmFsdWUpO1xuICAgICAgICBmb2N1c0luZGV4ID0gdmFsdWVCZWZvcmVJbmRleCArIDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbG9uZU5leHRWYWx1ZXNbdmFsdWVJbmRleF0gPSBuZXdWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gRmlsbCB2YWx1ZSB0byBtYXRjaCBkZWZhdWx0IDIgKG9ubHkgd2hlbiBgcmF3VmFsdWVzYCBpcyBlbXB0eSlcbiAgICAgIGlmIChyYW5nZUVuYWJsZWQgJiYgIXJhd1ZhbHVlcy5sZW5ndGggJiYgY291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjbG9uZU5leHRWYWx1ZXMucHVzaChuZXdWYWx1ZSk7XG4gICAgICB9XG4gICAgICB2YXIgbmV4dFZhbHVlID0gZ2V0VHJpZ2dlclZhbHVlKGNsb25lTmV4dFZhbHVlcyk7XG4gICAgICBvbkJlZm9yZUNoYW5nZSA9PT0gbnVsbCB8fCBvbkJlZm9yZUNoYW5nZSA9PT0gdm9pZCAwIHx8IG9uQmVmb3JlQ2hhbmdlKG5leHRWYWx1ZSk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlKGNsb25lTmV4dFZhbHVlcyk7XG4gICAgICBpZiAoZSkge1xuICAgICAgICB2YXIgX2RvY3VtZW50JGFjdGl2ZUVsZW1lLCBfZG9jdW1lbnQkYWN0aXZlRWxlbWUyO1xuICAgICAgICAoX2RvY3VtZW50JGFjdGl2ZUVsZW1lID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkgPT09IG51bGwgfHwgX2RvY3VtZW50JGFjdGl2ZUVsZW1lID09PSB2b2lkIDAgfHwgKF9kb2N1bWVudCRhY3RpdmVFbGVtZTIgPSBfZG9jdW1lbnQkYWN0aXZlRWxlbWUuYmx1cikgPT09IG51bGwgfHwgX2RvY3VtZW50JGFjdGl2ZUVsZW1lMiA9PT0gdm9pZCAwIHx8IF9kb2N1bWVudCRhY3RpdmVFbGVtZTIuY2FsbChfZG9jdW1lbnQkYWN0aXZlRWxlbWUpO1xuICAgICAgICBoYW5kbGVzUmVmLmN1cnJlbnQuZm9jdXMoZm9jdXNJbmRleCk7XG4gICAgICAgIG9uU3RhcnREcmFnKGUsIGZvY3VzSW5kZXgsIGNsb25lTmV4dFZhbHVlcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy80OTk5N1xuICAgICAgICBvbkFmdGVyQ2hhbmdlID09PSBudWxsIHx8IG9uQWZ0ZXJDaGFuZ2UgPT09IHZvaWQgMCB8fCBvbkFmdGVyQ2hhbmdlKG5leHRWYWx1ZSk7XG4gICAgICAgIHdhcm5pbmcoIW9uQWZ0ZXJDaGFuZ2UsICdbcmMtc2xpZGVyXSBgb25BZnRlckNoYW5nZWAgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBgb25DaGFuZ2VDb21wbGV0ZWAgaW5zdGVhZC4nKTtcbiAgICAgICAgb25DaGFuZ2VDb21wbGV0ZSA9PT0gbnVsbCB8fCBvbkNoYW5nZUNvbXBsZXRlID09PSB2b2lkIDAgfHwgb25DaGFuZ2VDb21wbGV0ZShuZXh0VmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IENsaWNrID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBvblNsaWRlck1vdXNlRG93biA9IGZ1bmN0aW9uIG9uU2xpZGVyTW91c2VEb3duKGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgdmFyIF9jb250YWluZXJSZWYkY3VycmVudCA9IGNvbnRhaW5lclJlZi5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgICAgd2lkdGggPSBfY29udGFpbmVyUmVmJGN1cnJlbnQud2lkdGgsXG4gICAgICBoZWlnaHQgPSBfY29udGFpbmVyUmVmJGN1cnJlbnQuaGVpZ2h0LFxuICAgICAgbGVmdCA9IF9jb250YWluZXJSZWYkY3VycmVudC5sZWZ0LFxuICAgICAgdG9wID0gX2NvbnRhaW5lclJlZiRjdXJyZW50LnRvcCxcbiAgICAgIGJvdHRvbSA9IF9jb250YWluZXJSZWYkY3VycmVudC5ib3R0b20sXG4gICAgICByaWdodCA9IF9jb250YWluZXJSZWYkY3VycmVudC5yaWdodDtcbiAgICB2YXIgY2xpZW50WCA9IGUuY2xpZW50WCxcbiAgICAgIGNsaWVudFkgPSBlLmNsaWVudFk7XG4gICAgdmFyIHBlcmNlbnQ7XG4gICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcbiAgICAgIGNhc2UgJ2J0dCc6XG4gICAgICAgIHBlcmNlbnQgPSAoYm90dG9tIC0gY2xpZW50WSkgLyBoZWlnaHQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndHRiJzpcbiAgICAgICAgcGVyY2VudCA9IChjbGllbnRZIC0gdG9wKSAvIGhlaWdodDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdydGwnOlxuICAgICAgICBwZXJjZW50ID0gKHJpZ2h0IC0gY2xpZW50WCkgLyB3aWR0aDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBwZXJjZW50ID0gKGNsaWVudFggLSBsZWZ0KSAvIHdpZHRoO1xuICAgIH1cbiAgICB2YXIgbmV4dFZhbHVlID0gbWVyZ2VkTWluICsgcGVyY2VudCAqIChtZXJnZWRNYXggLSBtZXJnZWRNaW4pO1xuICAgIGNoYW5nZVRvQ2xvc2VWYWx1ZShmb3JtYXRWYWx1ZShuZXh0VmFsdWUpLCBlKTtcbiAgfTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gS2V5Ym9hcmQgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShudWxsKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBrZXlib2FyZFZhbHVlID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXRLZXlib2FyZFZhbHVlID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIG9uSGFuZGxlT2Zmc2V0Q2hhbmdlID0gZnVuY3Rpb24gb25IYW5kbGVPZmZzZXRDaGFuZ2Uob2Zmc2V0LCB2YWx1ZUluZGV4KSB7XG4gICAgaWYgKCFkaXNhYmxlZCkge1xuICAgICAgdmFyIG5leHQgPSBvZmZzZXRWYWx1ZXMocmF3VmFsdWVzLCBvZmZzZXQsIHZhbHVlSW5kZXgpO1xuICAgICAgb25CZWZvcmVDaGFuZ2UgPT09IG51bGwgfHwgb25CZWZvcmVDaGFuZ2UgPT09IHZvaWQgMCB8fCBvbkJlZm9yZUNoYW5nZShnZXRUcmlnZ2VyVmFsdWUocmF3VmFsdWVzKSk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlKG5leHQudmFsdWVzKTtcbiAgICAgIHNldEtleWJvYXJkVmFsdWUobmV4dC52YWx1ZSk7XG4gICAgfVxuICB9O1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChrZXlib2FyZFZhbHVlICE9PSBudWxsKSB7XG4gICAgICB2YXIgdmFsdWVJbmRleCA9IHJhd1ZhbHVlcy5pbmRleE9mKGtleWJvYXJkVmFsdWUpO1xuICAgICAgaWYgKHZhbHVlSW5kZXggPj0gMCkge1xuICAgICAgICBoYW5kbGVzUmVmLmN1cnJlbnQuZm9jdXModmFsdWVJbmRleCk7XG4gICAgICB9XG4gICAgfVxuICAgIHNldEtleWJvYXJkVmFsdWUobnVsbCk7XG4gIH0sIFtrZXlib2FyZFZhbHVlXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRHJhZyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgbWVyZ2VkRHJhZ2dhYmxlVHJhY2sgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocmFuZ2VEcmFnZ2FibGVUcmFjayAmJiBtZXJnZWRTdGVwID09PSBudWxsKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICB3YXJuaW5nKGZhbHNlLCAnYGRyYWdnYWJsZVRyYWNrYCBpcyBub3Qgc3VwcG9ydGVkIHdoZW4gYHN0ZXBgIGlzIGBudWxsYC4nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHJhbmdlRHJhZ2dhYmxlVHJhY2s7XG4gIH0sIFtyYW5nZURyYWdnYWJsZVRyYWNrLCBtZXJnZWRTdGVwXSk7XG4gIHZhciBvblN0YXJ0TW92ZSA9IHVzZUV2ZW50KGZ1bmN0aW9uIChlLCB2YWx1ZUluZGV4KSB7XG4gICAgb25TdGFydERyYWcoZSwgdmFsdWVJbmRleCk7XG4gICAgb25CZWZvcmVDaGFuZ2UgPT09IG51bGwgfHwgb25CZWZvcmVDaGFuZ2UgPT09IHZvaWQgMCB8fCBvbkJlZm9yZUNoYW5nZShnZXRUcmlnZ2VyVmFsdWUocmF3VmFsdWVzKSk7XG4gIH0pO1xuXG4gIC8vIEF1dG8gZm9jdXMgZm9yIHVwZGF0ZWQgaGFuZGxlXG4gIHZhciBkcmFnZ2luZyA9IGRyYWdnaW5nSW5kZXggIT09IC0xO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICghZHJhZ2dpbmcpIHtcbiAgICAgIHZhciB2YWx1ZUluZGV4ID0gcmF3VmFsdWVzLmxhc3RJbmRleE9mKGRyYWdnaW5nVmFsdWUpO1xuICAgICAgaGFuZGxlc1JlZi5jdXJyZW50LmZvY3VzKHZhbHVlSW5kZXgpO1xuICAgIH1cbiAgfSwgW2RyYWdnaW5nXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IEluY2x1ZGVkID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgc29ydGVkQ2FjaGVWYWx1ZXMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX3RvQ29uc3VtYWJsZUFycmF5KGNhY2hlVmFsdWVzKS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gYSAtIGI7XG4gICAgfSk7XG4gIH0sIFtjYWNoZVZhbHVlc10pO1xuXG4gIC8vIFByb3ZpZGUgYSByYW5nZSB2YWx1ZXMgd2l0aCBpbmNsdWRlZCBbbWluLCBtYXhdXG4gIC8vIFVzZWQgZm9yIFRyYWNrLCBNYXJrICYgRG90XG4gIHZhciBfUmVhY3QkdXNlTWVtbyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFyYW5nZUVuYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuIFttZXJnZWRNaW4sIHNvcnRlZENhY2hlVmFsdWVzWzBdXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbc29ydGVkQ2FjaGVWYWx1ZXNbMF0sIHNvcnRlZENhY2hlVmFsdWVzW3NvcnRlZENhY2hlVmFsdWVzLmxlbmd0aCAtIDFdXTtcbiAgICB9LCBbc29ydGVkQ2FjaGVWYWx1ZXMsIHJhbmdlRW5hYmxlZCwgbWVyZ2VkTWluXSksXG4gICAgX1JlYWN0JHVzZU1lbW8yID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZU1lbW8sIDIpLFxuICAgIGluY2x1ZGVkU3RhcnQgPSBfUmVhY3QkdXNlTWVtbzJbMF0sXG4gICAgaW5jbHVkZWRFbmQgPSBfUmVhY3QkdXNlTWVtbzJbMV07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVmcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBmb2N1czogZnVuY3Rpb24gZm9jdXMoKSB7XG4gICAgICAgIGhhbmRsZXNSZWYuY3VycmVudC5mb2N1cygwKTtcbiAgICAgIH0sXG4gICAgICBibHVyOiBmdW5jdGlvbiBibHVyKCkge1xuICAgICAgICB2YXIgX2NvbnRhaW5lclJlZiRjdXJyZW50MjtcbiAgICAgICAgdmFyIF9kb2N1bWVudCA9IGRvY3VtZW50LFxuICAgICAgICAgIGFjdGl2ZUVsZW1lbnQgPSBfZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgICAgaWYgKChfY29udGFpbmVyUmVmJGN1cnJlbnQyID0gY29udGFpbmVyUmVmLmN1cnJlbnQpICE9PSBudWxsICYmIF9jb250YWluZXJSZWYkY3VycmVudDIgIT09IHZvaWQgMCAmJiBfY29udGFpbmVyUmVmJGN1cnJlbnQyLmNvbnRhaW5zKGFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgICAgYWN0aXZlRWxlbWVudCA9PT0gbnVsbCB8fCBhY3RpdmVFbGVtZW50ID09PSB2b2lkIDAgfHwgYWN0aXZlRWxlbWVudC5ibHVyKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBBdXRvIEZvY3VzID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGF1dG9Gb2N1cykge1xuICAgICAgaGFuZGxlc1JlZi5jdXJyZW50LmZvY3VzKDApO1xuICAgIH1cbiAgfSwgW10pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBDb250ZXh0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGNvbnRleHQgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWluOiBtZXJnZWRNaW4sXG4gICAgICBtYXg6IG1lcmdlZE1heCxcbiAgICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uLFxuICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgICAga2V5Ym9hcmQ6IGtleWJvYXJkLFxuICAgICAgc3RlcDogbWVyZ2VkU3RlcCxcbiAgICAgIGluY2x1ZGVkOiBpbmNsdWRlZCxcbiAgICAgIGluY2x1ZGVkU3RhcnQ6IGluY2x1ZGVkU3RhcnQsXG4gICAgICBpbmNsdWRlZEVuZDogaW5jbHVkZWRFbmQsXG4gICAgICByYW5nZTogcmFuZ2VFbmFibGVkLFxuICAgICAgdGFiSW5kZXg6IHRhYkluZGV4LFxuICAgICAgYXJpYUxhYmVsRm9ySGFuZGxlOiBhcmlhTGFiZWxGb3JIYW5kbGUsXG4gICAgICBhcmlhTGFiZWxsZWRCeUZvckhhbmRsZTogYXJpYUxhYmVsbGVkQnlGb3JIYW5kbGUsXG4gICAgICBhcmlhUmVxdWlyZWQ6IGFyaWFSZXF1aXJlZCxcbiAgICAgIGFyaWFWYWx1ZVRleHRGb3JtYXR0ZXJGb3JIYW5kbGU6IGFyaWFWYWx1ZVRleHRGb3JtYXR0ZXJGb3JIYW5kbGUsXG4gICAgICBzdHlsZXM6IHN0eWxlcyB8fCB7fSxcbiAgICAgIGNsYXNzTmFtZXM6IGNsYXNzTmFtZXMgfHwge31cbiAgICB9O1xuICB9LCBbbWVyZ2VkTWluLCBtZXJnZWRNYXgsIGRpcmVjdGlvbiwgZGlzYWJsZWQsIGtleWJvYXJkLCBtZXJnZWRTdGVwLCBpbmNsdWRlZCwgaW5jbHVkZWRTdGFydCwgaW5jbHVkZWRFbmQsIHJhbmdlRW5hYmxlZCwgdGFiSW5kZXgsIGFyaWFMYWJlbEZvckhhbmRsZSwgYXJpYUxhYmVsbGVkQnlGb3JIYW5kbGUsIGFyaWFSZXF1aXJlZCwgYXJpYVZhbHVlVGV4dEZvcm1hdHRlckZvckhhbmRsZSwgc3R5bGVzLCBjbGFzc05hbWVzXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU2xpZGVyQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBjb250ZXh0XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICByZWY6IGNvbnRhaW5lclJlZixcbiAgICBjbGFzc05hbWU6IGNscyhwcmVmaXhDbHMsIGNsYXNzTmFtZSwgX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRpc2FibGVkXCIpLCBkaXNhYmxlZCksIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdmVydGljYWxcIiksIHZlcnRpY2FsKSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ob3Jpem9udGFsXCIpLCAhdmVydGljYWwpLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXdpdGgtbWFya3NcIiksIG1hcmtMaXN0Lmxlbmd0aCkpLFxuICAgIHN0eWxlOiBzdHlsZSxcbiAgICBvbk1vdXNlRG93bjogb25TbGlkZXJNb3VzZURvd24sXG4gICAgaWQ6IGlkXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNscyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJhaWxcIiksIGNsYXNzTmFtZXMgPT09IG51bGwgfHwgY2xhc3NOYW1lcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2xhc3NOYW1lcy5yYWlsKSxcbiAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCByYWlsU3R5bGUpLCBzdHlsZXMgPT09IG51bGwgfHwgc3R5bGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdHlsZXMucmFpbClcbiAgfSksIHRyYWNrICE9PSBmYWxzZSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUcmFja3MsIHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBzdHlsZTogdHJhY2tTdHlsZSxcbiAgICB2YWx1ZXM6IHJhd1ZhbHVlcyxcbiAgICBzdGFydFBvaW50OiBzdGFydFBvaW50LFxuICAgIG9uU3RhcnRNb3ZlOiBtZXJnZWREcmFnZ2FibGVUcmFjayA/IG9uU3RhcnRNb3ZlIDogdW5kZWZpbmVkXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTdGVwcywge1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIG1hcmtzOiBtYXJrTGlzdCxcbiAgICBkb3RzOiBkb3RzLFxuICAgIHN0eWxlOiBkb3RTdHlsZSxcbiAgICBhY3RpdmVTdHlsZTogYWN0aXZlRG90U3R5bGVcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEhhbmRsZXMsIHtcbiAgICByZWY6IGhhbmRsZXNSZWYsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgc3R5bGU6IGhhbmRsZVN0eWxlLFxuICAgIHZhbHVlczogY2FjaGVWYWx1ZXMsXG4gICAgZHJhZ2dpbmdJbmRleDogZHJhZ2dpbmdJbmRleCxcbiAgICBkcmFnZ2luZ0RlbGV0ZTogZHJhZ2dpbmdEZWxldGUsXG4gICAgb25TdGFydE1vdmU6IG9uU3RhcnRNb3ZlLFxuICAgIG9uT2Zmc2V0Q2hhbmdlOiBvbkhhbmRsZU9mZnNldENoYW5nZSxcbiAgICBvbkZvY3VzOiBvbkZvY3VzLFxuICAgIG9uQmx1cjogb25CbHVyLFxuICAgIGhhbmRsZVJlbmRlcjogaGFuZGxlUmVuZGVyLFxuICAgIGFjdGl2ZUhhbmRsZVJlbmRlcjogYWN0aXZlSGFuZGxlUmVuZGVyLFxuICAgIG9uQ2hhbmdlQ29tcGxldGU6IGZpbmlzaENoYW5nZSxcbiAgICBvbkRlbGV0ZTogcmFuZ2VFZGl0YWJsZSA/IG9uRGVsZXRlIDogdW5kZWZpbmVkXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChNYXJrcywge1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIG1hcmtzOiBtYXJrTGlzdCxcbiAgICBvbkNsaWNrOiBjaGFuZ2VUb0Nsb3NlVmFsdWVcbiAgfSkpKTtcbn0pO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgU2xpZGVyLmRpc3BsYXlOYW1lID0gJ1NsaWRlcic7XG59XG5leHBvcnQgZGVmYXVsdCBTbGlkZXI7IiwgImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJwcmVmaXhDbHNcIiwgXCJzdHlsZVwiLCBcIm9uU3RhcnRNb3ZlXCIsIFwib25PZmZzZXRDaGFuZ2VcIiwgXCJ2YWx1ZXNcIiwgXCJoYW5kbGVSZW5kZXJcIiwgXCJhY3RpdmVIYW5kbGVSZW5kZXJcIiwgXCJkcmFnZ2luZ0luZGV4XCIsIFwiZHJhZ2dpbmdEZWxldGVcIiwgXCJvbkZvY3VzXCJdO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZmx1c2hTeW5jIH0gZnJvbSAncmVhY3QtZG9tJztcbmltcG9ydCB7IGdldEluZGV4IH0gZnJvbSBcIi4uL3V0aWxcIjtcbmltcG9ydCBIYW5kbGUgZnJvbSBcIi4vSGFuZGxlXCI7XG52YXIgSGFuZGxlcyA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICBvblN0YXJ0TW92ZSA9IHByb3BzLm9uU3RhcnRNb3ZlLFxuICAgIG9uT2Zmc2V0Q2hhbmdlID0gcHJvcHMub25PZmZzZXRDaGFuZ2UsXG4gICAgdmFsdWVzID0gcHJvcHMudmFsdWVzLFxuICAgIGhhbmRsZVJlbmRlciA9IHByb3BzLmhhbmRsZVJlbmRlcixcbiAgICBhY3RpdmVIYW5kbGVSZW5kZXIgPSBwcm9wcy5hY3RpdmVIYW5kbGVSZW5kZXIsXG4gICAgZHJhZ2dpbmdJbmRleCA9IHByb3BzLmRyYWdnaW5nSW5kZXgsXG4gICAgZHJhZ2dpbmdEZWxldGUgPSBwcm9wcy5kcmFnZ2luZ0RlbGV0ZSxcbiAgICBvbkZvY3VzID0gcHJvcHMub25Gb2N1cyxcbiAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIF9leGNsdWRlZCk7XG4gIHZhciBoYW5kbGVzUmVmID0gUmVhY3QudXNlUmVmKHt9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gQWN0aXZlID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIGFjdGl2ZVZpc2libGUgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldEFjdGl2ZVZpc2libGUgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlMyA9IFJlYWN0LnVzZVN0YXRlKC0xKSxcbiAgICBfUmVhY3QkdXNlU3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlMywgMiksXG4gICAgYWN0aXZlSW5kZXggPSBfUmVhY3QkdXNlU3RhdGU0WzBdLFxuICAgIHNldEFjdGl2ZUluZGV4ID0gX1JlYWN0JHVzZVN0YXRlNFsxXTtcbiAgdmFyIG9uQWN0aXZlID0gZnVuY3Rpb24gb25BY3RpdmUoaW5kZXgpIHtcbiAgICBzZXRBY3RpdmVJbmRleChpbmRleCk7XG4gICAgc2V0QWN0aXZlVmlzaWJsZSh0cnVlKTtcbiAgfTtcbiAgdmFyIG9uSGFuZGxlRm9jdXMgPSBmdW5jdGlvbiBvbkhhbmRsZUZvY3VzKGUsIGluZGV4KSB7XG4gICAgb25BY3RpdmUoaW5kZXgpO1xuICAgIG9uRm9jdXMgPT09IG51bGwgfHwgb25Gb2N1cyA9PT0gdm9pZCAwIHx8IG9uRm9jdXMoZSk7XG4gIH07XG4gIHZhciBvbkhhbmRsZU1vdXNlRW50ZXIgPSBmdW5jdGlvbiBvbkhhbmRsZU1vdXNlRW50ZXIoZSwgaW5kZXgpIHtcbiAgICBvbkFjdGl2ZShpbmRleCk7XG4gIH07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgUmVhY3QudXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZm9jdXM6IGZ1bmN0aW9uIGZvY3VzKGluZGV4KSB7XG4gICAgICAgIHZhciBfaGFuZGxlc1JlZiRjdXJyZW50JGk7XG4gICAgICAgIChfaGFuZGxlc1JlZiRjdXJyZW50JGkgPSBoYW5kbGVzUmVmLmN1cnJlbnRbaW5kZXhdKSA9PT0gbnVsbCB8fCBfaGFuZGxlc1JlZiRjdXJyZW50JGkgPT09IHZvaWQgMCB8fCBfaGFuZGxlc1JlZiRjdXJyZW50JGkuZm9jdXMoKTtcbiAgICAgIH0sXG4gICAgICBoaWRlSGVscDogZnVuY3Rpb24gaGlkZUhlbHAoKSB7XG4gICAgICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc2V0QWN0aXZlVmlzaWJsZShmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEhhbmRsZSBQcm9wc1xuICB2YXIgaGFuZGxlUHJvcHMgPSBfb2JqZWN0U3ByZWFkKHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBvblN0YXJ0TW92ZTogb25TdGFydE1vdmUsXG4gICAgb25PZmZzZXRDaGFuZ2U6IG9uT2Zmc2V0Q2hhbmdlLFxuICAgIHJlbmRlcjogaGFuZGxlUmVuZGVyLFxuICAgIG9uRm9jdXM6IG9uSGFuZGxlRm9jdXMsXG4gICAgb25Nb3VzZUVudGVyOiBvbkhhbmRsZU1vdXNlRW50ZXJcbiAgfSwgcmVzdFByb3BzKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCB2YWx1ZXMubWFwKGZ1bmN0aW9uICh2YWx1ZSwgaW5kZXgpIHtcbiAgICB2YXIgZHJhZ2dpbmcgPSBkcmFnZ2luZ0luZGV4ID09PSBpbmRleDtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSGFuZGxlLCBfZXh0ZW5kcyh7XG4gICAgICByZWY6IGZ1bmN0aW9uIHJlZihub2RlKSB7XG4gICAgICAgIGlmICghbm9kZSkge1xuICAgICAgICAgIGRlbGV0ZSBoYW5kbGVzUmVmLmN1cnJlbnRbaW5kZXhdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGhhbmRsZXNSZWYuY3VycmVudFtpbmRleF0gPSBub2RlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZHJhZ2dpbmc6IGRyYWdnaW5nLFxuICAgICAgZHJhZ2dpbmdEZWxldGU6IGRyYWdnaW5nICYmIGRyYWdnaW5nRGVsZXRlLFxuICAgICAgc3R5bGU6IGdldEluZGV4KHN0eWxlLCBpbmRleCksXG4gICAgICBrZXk6IGluZGV4LFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgdmFsdWVJbmRleDogaW5kZXhcbiAgICB9LCBoYW5kbGVQcm9wcykpO1xuICB9KSwgYWN0aXZlSGFuZGxlUmVuZGVyICYmIGFjdGl2ZVZpc2libGUgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSGFuZGxlLCBfZXh0ZW5kcyh7XG4gICAga2V5OiBcImExMXlcIlxuICB9LCBoYW5kbGVQcm9wcywge1xuICAgIHZhbHVlOiB2YWx1ZXNbYWN0aXZlSW5kZXhdLFxuICAgIHZhbHVlSW5kZXg6IG51bGwsXG4gICAgZHJhZ2dpbmc6IGRyYWdnaW5nSW5kZXggIT09IC0xLFxuICAgIGRyYWdnaW5nRGVsZXRlOiBkcmFnZ2luZ0RlbGV0ZSxcbiAgICByZW5kZXI6IGFjdGl2ZUhhbmRsZVJlbmRlcixcbiAgICBzdHlsZToge1xuICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnXG4gICAgfSxcbiAgICB0YWJJbmRleDogbnVsbCxcbiAgICBcImFyaWEtaGlkZGVuXCI6IHRydWVcbiAgfSkpKTtcbn0pO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgSGFuZGxlcy5kaXNwbGF5TmFtZSA9ICdIYW5kbGVzJztcbn1cbmV4cG9ydCBkZWZhdWx0IEhhbmRsZXM7IiwgImV4cG9ydCBmdW5jdGlvbiBnZXRPZmZzZXQodmFsdWUsIG1pbiwgbWF4KSB7XG4gIHJldHVybiAodmFsdWUgLSBtaW4pIC8gKG1heCAtIG1pbik7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0RGlyZWN0aW9uU3R5bGUoZGlyZWN0aW9uLCB2YWx1ZSwgbWluLCBtYXgpIHtcbiAgdmFyIG9mZnNldCA9IGdldE9mZnNldCh2YWx1ZSwgbWluLCBtYXgpO1xuICB2YXIgcG9zaXRpb25TdHlsZSA9IHt9O1xuICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgIGNhc2UgJ3J0bCc6XG4gICAgICBwb3NpdGlvblN0eWxlLnJpZ2h0ID0gXCJcIi5jb25jYXQob2Zmc2V0ICogMTAwLCBcIiVcIik7XG4gICAgICBwb3NpdGlvblN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVYKDUwJSknO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYnR0JzpcbiAgICAgIHBvc2l0aW9uU3R5bGUuYm90dG9tID0gXCJcIi5jb25jYXQob2Zmc2V0ICogMTAwLCBcIiVcIik7XG4gICAgICBwb3NpdGlvblN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVZKDUwJSknO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndHRiJzpcbiAgICAgIHBvc2l0aW9uU3R5bGUudG9wID0gXCJcIi5jb25jYXQob2Zmc2V0ICogMTAwLCBcIiVcIik7XG4gICAgICBwb3NpdGlvblN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVZKC01MCUpJztcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBwb3NpdGlvblN0eWxlLmxlZnQgPSBcIlwiLmNvbmNhdChvZmZzZXQgKiAxMDAsIFwiJVwiKTtcbiAgICAgIHBvc2l0aW9uU3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZVgoLTUwJSknO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIHBvc2l0aW9uU3R5bGU7XG59XG5cbi8qKiBSZXR1cm4gaW5kZXggdmFsdWUgaWYgaXMgbGlzdCBvciByZXR1cm4gdmFsdWUgZGlyZWN0bHkgKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbmRleCh2YWx1ZSwgaW5kZXgpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWVbaW5kZXhdIDogdmFsdWU7XG59IiwgImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcInByZWZpeENsc1wiLCBcInZhbHVlXCIsIFwidmFsdWVJbmRleFwiLCBcIm9uU3RhcnRNb3ZlXCIsIFwib25EZWxldGVcIiwgXCJzdHlsZVwiLCBcInJlbmRlclwiLCBcImRyYWdnaW5nXCIsIFwiZHJhZ2dpbmdEZWxldGVcIiwgXCJvbk9mZnNldENoYW5nZVwiLCBcIm9uQ2hhbmdlQ29tcGxldGVcIiwgXCJvbkZvY3VzXCIsIFwib25Nb3VzZUVudGVyXCJdO1xuaW1wb3J0IGNscyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBLZXlDb2RlIGZyb20gXCJyYy11dGlsL2VzL0tleUNvZGVcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBTbGlkZXJDb250ZXh0IGZyb20gXCIuLi9jb250ZXh0XCI7XG5pbXBvcnQgeyBnZXREaXJlY3Rpb25TdHlsZSwgZ2V0SW5kZXggfSBmcm9tIFwiLi4vdXRpbFwiO1xudmFyIEhhbmRsZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICB2YWx1ZUluZGV4ID0gcHJvcHMudmFsdWVJbmRleCxcbiAgICBvblN0YXJ0TW92ZSA9IHByb3BzLm9uU3RhcnRNb3ZlLFxuICAgIG9uRGVsZXRlID0gcHJvcHMub25EZWxldGUsXG4gICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICByZW5kZXIgPSBwcm9wcy5yZW5kZXIsXG4gICAgZHJhZ2dpbmcgPSBwcm9wcy5kcmFnZ2luZyxcbiAgICBkcmFnZ2luZ0RlbGV0ZSA9IHByb3BzLmRyYWdnaW5nRGVsZXRlLFxuICAgIG9uT2Zmc2V0Q2hhbmdlID0gcHJvcHMub25PZmZzZXRDaGFuZ2UsXG4gICAgb25DaGFuZ2VDb21wbGV0ZSA9IHByb3BzLm9uQ2hhbmdlQ29tcGxldGUsXG4gICAgb25Gb2N1cyA9IHByb3BzLm9uRm9jdXMsXG4gICAgb25Nb3VzZUVudGVyID0gcHJvcHMub25Nb3VzZUVudGVyLFxuICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgX2V4Y2x1ZGVkKTtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChTbGlkZXJDb250ZXh0KSxcbiAgICBtaW4gPSBfUmVhY3QkdXNlQ29udGV4dC5taW4sXG4gICAgbWF4ID0gX1JlYWN0JHVzZUNvbnRleHQubWF4LFxuICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbixcbiAgICBkaXNhYmxlZCA9IF9SZWFjdCR1c2VDb250ZXh0LmRpc2FibGVkLFxuICAgIGtleWJvYXJkID0gX1JlYWN0JHVzZUNvbnRleHQua2V5Ym9hcmQsXG4gICAgcmFuZ2UgPSBfUmVhY3QkdXNlQ29udGV4dC5yYW5nZSxcbiAgICB0YWJJbmRleCA9IF9SZWFjdCR1c2VDb250ZXh0LnRhYkluZGV4LFxuICAgIGFyaWFMYWJlbEZvckhhbmRsZSA9IF9SZWFjdCR1c2VDb250ZXh0LmFyaWFMYWJlbEZvckhhbmRsZSxcbiAgICBhcmlhTGFiZWxsZWRCeUZvckhhbmRsZSA9IF9SZWFjdCR1c2VDb250ZXh0LmFyaWFMYWJlbGxlZEJ5Rm9ySGFuZGxlLFxuICAgIGFyaWFSZXF1aXJlZCA9IF9SZWFjdCR1c2VDb250ZXh0LmFyaWFSZXF1aXJlZCxcbiAgICBhcmlhVmFsdWVUZXh0Rm9ybWF0dGVyRm9ySGFuZGxlID0gX1JlYWN0JHVzZUNvbnRleHQuYXJpYVZhbHVlVGV4dEZvcm1hdHRlckZvckhhbmRsZSxcbiAgICBzdHlsZXMgPSBfUmVhY3QkdXNlQ29udGV4dC5zdHlsZXMsXG4gICAgY2xhc3NOYW1lcyA9IF9SZWFjdCR1c2VDb250ZXh0LmNsYXNzTmFtZXM7XG4gIHZhciBoYW5kbGVQcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhhbmRsZVwiKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IEV2ZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBvbkludGVybmFsU3RhcnRNb3ZlID0gZnVuY3Rpb24gb25JbnRlcm5hbFN0YXJ0TW92ZShlKSB7XG4gICAgaWYgKCFkaXNhYmxlZCkge1xuICAgICAgb25TdGFydE1vdmUoZSwgdmFsdWVJbmRleCk7XG4gICAgfVxuICB9O1xuICB2YXIgb25JbnRlcm5hbEZvY3VzID0gZnVuY3Rpb24gb25JbnRlcm5hbEZvY3VzKGUpIHtcbiAgICBvbkZvY3VzID09PSBudWxsIHx8IG9uRm9jdXMgPT09IHZvaWQgMCB8fCBvbkZvY3VzKGUsIHZhbHVlSW5kZXgpO1xuICB9O1xuICB2YXIgb25JbnRlcm5hbE1vdXNlRW50ZXIgPSBmdW5jdGlvbiBvbkludGVybmFsTW91c2VFbnRlcihlKSB7XG4gICAgb25Nb3VzZUVudGVyKGUsIHZhbHVlSW5kZXgpO1xuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBLZXlib2FyZCA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG9uS2V5RG93biA9IGZ1bmN0aW9uIG9uS2V5RG93bihlKSB7XG4gICAgaWYgKCFkaXNhYmxlZCAmJiBrZXlib2FyZCkge1xuICAgICAgdmFyIG9mZnNldCA9IG51bGw7XG5cbiAgICAgIC8vIENoYW5nZSB0aGUgdmFsdWVcbiAgICAgIHN3aXRjaCAoZS53aGljaCB8fCBlLmtleUNvZGUpIHtcbiAgICAgICAgY2FzZSBLZXlDb2RlLkxFRlQ6XG4gICAgICAgICAgb2Zmc2V0ID0gZGlyZWN0aW9uID09PSAnbHRyJyB8fCBkaXJlY3Rpb24gPT09ICdidHQnID8gLTEgOiAxO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEtleUNvZGUuUklHSFQ6XG4gICAgICAgICAgb2Zmc2V0ID0gZGlyZWN0aW9uID09PSAnbHRyJyB8fCBkaXJlY3Rpb24gPT09ICdidHQnID8gMSA6IC0xO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIC8vIFVwIGlzIHBsdXNcbiAgICAgICAgY2FzZSBLZXlDb2RlLlVQOlxuICAgICAgICAgIG9mZnNldCA9IGRpcmVjdGlvbiAhPT0gJ3R0YicgPyAxIDogLTE7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgLy8gRG93biBpcyBtaW51c1xuICAgICAgICBjYXNlIEtleUNvZGUuRE9XTjpcbiAgICAgICAgICBvZmZzZXQgPSBkaXJlY3Rpb24gIT09ICd0dGInID8gLTEgOiAxO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEtleUNvZGUuSE9NRTpcbiAgICAgICAgICBvZmZzZXQgPSAnbWluJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBLZXlDb2RlLkVORDpcbiAgICAgICAgICBvZmZzZXQgPSAnbWF4JztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBLZXlDb2RlLlBBR0VfVVA6XG4gICAgICAgICAgb2Zmc2V0ID0gMjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBLZXlDb2RlLlBBR0VfRE9XTjpcbiAgICAgICAgICBvZmZzZXQgPSAtMjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBLZXlDb2RlLkJBQ0tTUEFDRTpcbiAgICAgICAgY2FzZSBLZXlDb2RlLkRFTEVURTpcbiAgICAgICAgICBvbkRlbGV0ZSh2YWx1ZUluZGV4KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChvZmZzZXQgIT09IG51bGwpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBvbk9mZnNldENoYW5nZShvZmZzZXQsIHZhbHVlSW5kZXgpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgdmFyIGhhbmRsZUtleVVwID0gZnVuY3Rpb24gaGFuZGxlS2V5VXAoZSkge1xuICAgIHN3aXRjaCAoZS53aGljaCB8fCBlLmtleUNvZGUpIHtcbiAgICAgIGNhc2UgS2V5Q29kZS5MRUZUOlxuICAgICAgY2FzZSBLZXlDb2RlLlJJR0hUOlxuICAgICAgY2FzZSBLZXlDb2RlLlVQOlxuICAgICAgY2FzZSBLZXlDb2RlLkRPV046XG4gICAgICBjYXNlIEtleUNvZGUuSE9NRTpcbiAgICAgIGNhc2UgS2V5Q29kZS5FTkQ6XG4gICAgICBjYXNlIEtleUNvZGUuUEFHRV9VUDpcbiAgICAgIGNhc2UgS2V5Q29kZS5QQUdFX0RPV046XG4gICAgICAgIG9uQ2hhbmdlQ29tcGxldGUgPT09IG51bGwgfHwgb25DaGFuZ2VDb21wbGV0ZSA9PT0gdm9pZCAwIHx8IG9uQ2hhbmdlQ29tcGxldGUoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gT2Zmc2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHBvc2l0aW9uU3R5bGUgPSBnZXREaXJlY3Rpb25TdHlsZShkaXJlY3Rpb24sIHZhbHVlLCBtaW4sIG1heCk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgZGl2UHJvcHMgPSB7fTtcbiAgaWYgKHZhbHVlSW5kZXggIT09IG51bGwpIHtcbiAgICB2YXIgX2dldEluZGV4O1xuICAgIGRpdlByb3BzID0ge1xuICAgICAgdGFiSW5kZXg6IGRpc2FibGVkID8gbnVsbCA6IGdldEluZGV4KHRhYkluZGV4LCB2YWx1ZUluZGV4KSxcbiAgICAgIHJvbGU6ICdzbGlkZXInLFxuICAgICAgJ2FyaWEtdmFsdWVtaW4nOiBtaW4sXG4gICAgICAnYXJpYS12YWx1ZW1heCc6IG1heCxcbiAgICAgICdhcmlhLXZhbHVlbm93JzogdmFsdWUsXG4gICAgICAnYXJpYS1kaXNhYmxlZCc6IGRpc2FibGVkLFxuICAgICAgJ2FyaWEtbGFiZWwnOiBnZXRJbmRleChhcmlhTGFiZWxGb3JIYW5kbGUsIHZhbHVlSW5kZXgpLFxuICAgICAgJ2FyaWEtbGFiZWxsZWRieSc6IGdldEluZGV4KGFyaWFMYWJlbGxlZEJ5Rm9ySGFuZGxlLCB2YWx1ZUluZGV4KSxcbiAgICAgICdhcmlhLXJlcXVpcmVkJzogZ2V0SW5kZXgoYXJpYVJlcXVpcmVkLCB2YWx1ZUluZGV4KSxcbiAgICAgICdhcmlhLXZhbHVldGV4dCc6IChfZ2V0SW5kZXggPSBnZXRJbmRleChhcmlhVmFsdWVUZXh0Rm9ybWF0dGVyRm9ySGFuZGxlLCB2YWx1ZUluZGV4KSkgPT09IG51bGwgfHwgX2dldEluZGV4ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZ2V0SW5kZXgodmFsdWUpLFxuICAgICAgJ2FyaWEtb3JpZW50YXRpb24nOiBkaXJlY3Rpb24gPT09ICdsdHInIHx8IGRpcmVjdGlvbiA9PT0gJ3J0bCcgPyAnaG9yaXpvbnRhbCcgOiAndmVydGljYWwnLFxuICAgICAgb25Nb3VzZURvd246IG9uSW50ZXJuYWxTdGFydE1vdmUsXG4gICAgICBvblRvdWNoU3RhcnQ6IG9uSW50ZXJuYWxTdGFydE1vdmUsXG4gICAgICBvbkZvY3VzOiBvbkludGVybmFsRm9jdXMsXG4gICAgICBvbk1vdXNlRW50ZXI6IG9uSW50ZXJuYWxNb3VzZUVudGVyLFxuICAgICAgb25LZXlEb3duOiBvbktleURvd24sXG4gICAgICBvbktleVVwOiBoYW5kbGVLZXlVcFxuICAgIH07XG4gIH1cbiAgdmFyIGhhbmRsZU5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgcmVmOiByZWYsXG4gICAgY2xhc3NOYW1lOiBjbHMoaGFuZGxlUHJlZml4Q2xzLCBfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQoaGFuZGxlUHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KHZhbHVlSW5kZXggKyAxKSwgdmFsdWVJbmRleCAhPT0gbnVsbCAmJiByYW5nZSksIFwiXCIuY29uY2F0KGhhbmRsZVByZWZpeENscywgXCItZHJhZ2dpbmdcIiksIGRyYWdnaW5nKSwgXCJcIi5jb25jYXQoaGFuZGxlUHJlZml4Q2xzLCBcIi1kcmFnZ2luZy1kZWxldGVcIiksIGRyYWdnaW5nRGVsZXRlKSwgY2xhc3NOYW1lcy5oYW5kbGUpLFxuICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcG9zaXRpb25TdHlsZSksIHN0eWxlKSwgc3R5bGVzLmhhbmRsZSlcbiAgfSwgZGl2UHJvcHMsIHJlc3RQcm9wcykpO1xuXG4gIC8vIEN1c3RvbWl6ZVxuICBpZiAocmVuZGVyKSB7XG4gICAgaGFuZGxlTm9kZSA9IHJlbmRlcihoYW5kbGVOb2RlLCB7XG4gICAgICBpbmRleDogdmFsdWVJbmRleCxcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZHJhZ2dpbmc6IGRyYWdnaW5nLFxuICAgICAgZHJhZ2dpbmdEZWxldGU6IGRyYWdnaW5nRGVsZXRlXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGhhbmRsZU5vZGU7XG59KTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIEhhbmRsZS5kaXNwbGF5TmFtZSA9ICdIYW5kbGUnO1xufVxuZXhwb3J0IGRlZmF1bHQgSGFuZGxlOyIsICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG52YXIgU2xpZGVyQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHtcbiAgbWluOiAwLFxuICBtYXg6IDAsXG4gIGRpcmVjdGlvbjogJ2x0cicsXG4gIHN0ZXA6IDEsXG4gIGluY2x1ZGVkU3RhcnQ6IDAsXG4gIGluY2x1ZGVkRW5kOiAwLFxuICB0YWJJbmRleDogMCxcbiAga2V5Ym9hcmQ6IHRydWUsXG4gIHN0eWxlczoge30sXG4gIGNsYXNzTmFtZXM6IHt9XG59KTtcbmV4cG9ydCBkZWZhdWx0IFNsaWRlckNvbnRleHQ7XG4vKiogQHByaXZhdGUgTk9UIFBST01JU0UgQVZBSUxBQkxFLiBETyBOT1QgVVNFIElOIFBST0RVQ1RJT04uICovXG5leHBvcnQgdmFyIFVuc3RhYmxlQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHt9KTsiLCAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IE1hcmsgZnJvbSBcIi4vTWFya1wiO1xudmFyIE1hcmtzID0gZnVuY3Rpb24gTWFya3MocHJvcHMpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBtYXJrcyA9IHByb3BzLm1hcmtzLFxuICAgIG9uQ2xpY2sgPSBwcm9wcy5vbkNsaWNrO1xuICB2YXIgbWFya1ByZWZpeENscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbWFya1wiKTtcblxuICAvLyBOb3QgcmVuZGVyIG1hcmsgaWYgZW1wdHlcbiAgaWYgKCFtYXJrcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogbWFya1ByZWZpeENsc1xuICB9LCBtYXJrcy5tYXAoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIgdmFsdWUgPSBfcmVmLnZhbHVlLFxuICAgICAgc3R5bGUgPSBfcmVmLnN0eWxlLFxuICAgICAgbGFiZWwgPSBfcmVmLmxhYmVsO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChNYXJrLCB7XG4gICAgICBrZXk6IHZhbHVlLFxuICAgICAgcHJlZml4Q2xzOiBtYXJrUHJlZml4Q2xzLFxuICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgb25DbGljazogb25DbGlja1xuICAgIH0sIGxhYmVsKTtcbiAgfSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IE1hcmtzOyIsICJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFNsaWRlckNvbnRleHQgZnJvbSBcIi4uL2NvbnRleHRcIjtcbmltcG9ydCB7IGdldERpcmVjdGlvblN0eWxlIH0gZnJvbSBcIi4uL3V0aWxcIjtcbnZhciBNYXJrID0gZnVuY3Rpb24gTWFyayhwcm9wcykge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICB2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgIF9vbkNsaWNrID0gcHJvcHMub25DbGljaztcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChTbGlkZXJDb250ZXh0KSxcbiAgICBtaW4gPSBfUmVhY3QkdXNlQ29udGV4dC5taW4sXG4gICAgbWF4ID0gX1JlYWN0JHVzZUNvbnRleHQubWF4LFxuICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbixcbiAgICBpbmNsdWRlZFN0YXJ0ID0gX1JlYWN0JHVzZUNvbnRleHQuaW5jbHVkZWRTdGFydCxcbiAgICBpbmNsdWRlZEVuZCA9IF9SZWFjdCR1c2VDb250ZXh0LmluY2x1ZGVkRW5kLFxuICAgIGluY2x1ZGVkID0gX1JlYWN0JHVzZUNvbnRleHQuaW5jbHVkZWQ7XG4gIHZhciB0ZXh0Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10ZXh0XCIpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gT2Zmc2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHBvc2l0aW9uU3R5bGUgPSBnZXREaXJlY3Rpb25TdHlsZShkaXJlY3Rpb24sIHZhbHVlLCBtaW4sIG1heCk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyh0ZXh0Q2xzLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHRleHRDbHMsIFwiLWFjdGl2ZVwiKSwgaW5jbHVkZWQgJiYgaW5jbHVkZWRTdGFydCA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSBpbmNsdWRlZEVuZCkpLFxuICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHBvc2l0aW9uU3R5bGUpLCBzdHlsZSksXG4gICAgb25Nb3VzZURvd246IGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfSxcbiAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgX29uQ2xpY2sodmFsdWUpO1xuICAgIH1cbiAgfSwgY2hpbGRyZW4pO1xufTtcbmV4cG9ydCBkZWZhdWx0IE1hcms7IiwgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBTbGlkZXJDb250ZXh0IGZyb20gXCIuLi9jb250ZXh0XCI7XG5pbXBvcnQgRG90IGZyb20gXCIuL0RvdFwiO1xudmFyIFN0ZXBzID0gZnVuY3Rpb24gU3RlcHMocHJvcHMpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBtYXJrcyA9IHByb3BzLm1hcmtzLFxuICAgIGRvdHMgPSBwcm9wcy5kb3RzLFxuICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgYWN0aXZlU3R5bGUgPSBwcm9wcy5hY3RpdmVTdHlsZTtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChTbGlkZXJDb250ZXh0KSxcbiAgICBtaW4gPSBfUmVhY3QkdXNlQ29udGV4dC5taW4sXG4gICAgbWF4ID0gX1JlYWN0JHVzZUNvbnRleHQubWF4LFxuICAgIHN0ZXAgPSBfUmVhY3QkdXNlQ29udGV4dC5zdGVwO1xuICB2YXIgc3RlcERvdHMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZG90U2V0ID0gbmV3IFNldCgpO1xuXG4gICAgLy8gQWRkIG1hcmtzXG4gICAgbWFya3MuZm9yRWFjaChmdW5jdGlvbiAobWFyaykge1xuICAgICAgZG90U2V0LmFkZChtYXJrLnZhbHVlKTtcbiAgICB9KTtcblxuICAgIC8vIEZpbGwgZG90c1xuICAgIGlmIChkb3RzICYmIHN0ZXAgIT09IG51bGwpIHtcbiAgICAgIHZhciBjdXJyZW50ID0gbWluO1xuICAgICAgd2hpbGUgKGN1cnJlbnQgPD0gbWF4KSB7XG4gICAgICAgIGRvdFNldC5hZGQoY3VycmVudCk7XG4gICAgICAgIGN1cnJlbnQgKz0gc3RlcDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIEFycmF5LmZyb20oZG90U2V0KTtcbiAgfSwgW21pbiwgbWF4LCBzdGVwLCBkb3RzLCBtYXJrc10pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zdGVwXCIpXG4gIH0sIHN0ZXBEb3RzLm1hcChmdW5jdGlvbiAoZG90VmFsdWUpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRG90LCB7XG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgIGtleTogZG90VmFsdWUsXG4gICAgICB2YWx1ZTogZG90VmFsdWUsXG4gICAgICBzdHlsZTogc3R5bGUsXG4gICAgICBhY3RpdmVTdHlsZTogYWN0aXZlU3R5bGVcbiAgICB9KTtcbiAgfSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFN0ZXBzOyIsICJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFNsaWRlckNvbnRleHQgZnJvbSBcIi4uL2NvbnRleHRcIjtcbmltcG9ydCB7IGdldERpcmVjdGlvblN0eWxlIH0gZnJvbSBcIi4uL3V0aWxcIjtcbnZhciBEb3QgPSBmdW5jdGlvbiBEb3QocHJvcHMpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICB2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgYWN0aXZlU3R5bGUgPSBwcm9wcy5hY3RpdmVTdHlsZTtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChTbGlkZXJDb250ZXh0KSxcbiAgICBtaW4gPSBfUmVhY3QkdXNlQ29udGV4dC5taW4sXG4gICAgbWF4ID0gX1JlYWN0JHVzZUNvbnRleHQubWF4LFxuICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbixcbiAgICBpbmNsdWRlZCA9IF9SZWFjdCR1c2VDb250ZXh0LmluY2x1ZGVkLFxuICAgIGluY2x1ZGVkU3RhcnQgPSBfUmVhY3QkdXNlQ29udGV4dC5pbmNsdWRlZFN0YXJ0LFxuICAgIGluY2x1ZGVkRW5kID0gX1JlYWN0JHVzZUNvbnRleHQuaW5jbHVkZWRFbmQ7XG4gIHZhciBkb3RDbGFzc05hbWUgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRvdFwiKTtcbiAgdmFyIGFjdGl2ZSA9IGluY2x1ZGVkICYmIGluY2x1ZGVkU3RhcnQgPD0gdmFsdWUgJiYgdmFsdWUgPD0gaW5jbHVkZWRFbmQ7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBPZmZzZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgbWVyZ2VkU3R5bGUgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGdldERpcmVjdGlvblN0eWxlKGRpcmVjdGlvbiwgdmFsdWUsIG1pbiwgbWF4KSksIHR5cGVvZiBzdHlsZSA9PT0gJ2Z1bmN0aW9uJyA/IHN0eWxlKHZhbHVlKSA6IHN0eWxlKTtcbiAgaWYgKGFjdGl2ZSkge1xuICAgIG1lcmdlZFN0eWxlID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBtZXJnZWRTdHlsZSksIHR5cGVvZiBhY3RpdmVTdHlsZSA9PT0gJ2Z1bmN0aW9uJyA/IGFjdGl2ZVN0eWxlKHZhbHVlKSA6IGFjdGl2ZVN0eWxlKTtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoZG90Q2xhc3NOYW1lLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KGRvdENsYXNzTmFtZSwgXCItYWN0aXZlXCIpLCBhY3RpdmUpKSxcbiAgICBzdHlsZTogbWVyZ2VkU3R5bGVcbiAgfSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgRG90OyIsICJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IGNscyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBTbGlkZXJDb250ZXh0IGZyb20gXCIuLi9jb250ZXh0XCI7XG5pbXBvcnQgeyBnZXRJbmRleCB9IGZyb20gXCIuLi91dGlsXCI7XG5pbXBvcnQgVHJhY2sgZnJvbSBcIi4vVHJhY2tcIjtcbnZhciBUcmFja3MgPSBmdW5jdGlvbiBUcmFja3MocHJvcHMpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgIHZhbHVlcyA9IHByb3BzLnZhbHVlcyxcbiAgICBzdGFydFBvaW50ID0gcHJvcHMuc3RhcnRQb2ludCxcbiAgICBvblN0YXJ0TW92ZSA9IHByb3BzLm9uU3RhcnRNb3ZlO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KFNsaWRlckNvbnRleHQpLFxuICAgIGluY2x1ZGVkID0gX1JlYWN0JHVzZUNvbnRleHQuaW5jbHVkZWQsXG4gICAgcmFuZ2UgPSBfUmVhY3QkdXNlQ29udGV4dC5yYW5nZSxcbiAgICBtaW4gPSBfUmVhY3QkdXNlQ29udGV4dC5taW4sXG4gICAgc3R5bGVzID0gX1JlYWN0JHVzZUNvbnRleHQuc3R5bGVzLFxuICAgIGNsYXNzTmFtZXMgPSBfUmVhY3QkdXNlQ29udGV4dC5jbGFzc05hbWVzO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBMaXN0ID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgdHJhY2tMaXN0ID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFyYW5nZSkge1xuICAgICAgLy8gbnVsbCB2YWx1ZSBkbyBub3QgaGF2ZSB0cmFja1xuICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIHN0YXJ0VmFsdWUgPSBzdGFydFBvaW50ICE9PSBudWxsICYmIHN0YXJ0UG9pbnQgIT09IHZvaWQgMCA/IHN0YXJ0UG9pbnQgOiBtaW47XG4gICAgICB2YXIgZW5kVmFsdWUgPSB2YWx1ZXNbMF07XG4gICAgICByZXR1cm4gW3tcbiAgICAgICAgc3RhcnQ6IE1hdGgubWluKHN0YXJ0VmFsdWUsIGVuZFZhbHVlKSxcbiAgICAgICAgZW5kOiBNYXRoLm1heChzdGFydFZhbHVlLCBlbmRWYWx1ZSlcbiAgICAgIH1dO1xuICAgIH1cblxuICAgIC8vIE11bHRpcGxlXG4gICAgdmFyIGxpc3QgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGggLSAxOyBpICs9IDEpIHtcbiAgICAgIGxpc3QucHVzaCh7XG4gICAgICAgIHN0YXJ0OiB2YWx1ZXNbaV0sXG4gICAgICAgIGVuZDogdmFsdWVzW2kgKyAxXVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBsaXN0O1xuICB9LCBbdmFsdWVzLCByYW5nZSwgc3RhcnRQb2ludCwgbWluXSk7XG4gIGlmICghaW5jbHVkZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgdHJhY2tzTm9kZSA9IHRyYWNrTGlzdCAhPT0gbnVsbCAmJiB0cmFja0xpc3QgIT09IHZvaWQgMCAmJiB0cmFja0xpc3QubGVuZ3RoICYmIChjbGFzc05hbWVzLnRyYWNrcyB8fCBzdHlsZXMudHJhY2tzKSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRyYWNrLCB7XG4gICAgaW5kZXg6IG51bGwsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgc3RhcnQ6IHRyYWNrTGlzdFswXS5zdGFydCxcbiAgICBlbmQ6IHRyYWNrTGlzdFt0cmFja0xpc3QubGVuZ3RoIC0gMV0uZW5kLFxuICAgIHJlcGxhY2VDbHM6IGNscyhjbGFzc05hbWVzLnRyYWNrcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10cmFja3NcIikpLFxuICAgIHN0eWxlOiBzdHlsZXMudHJhY2tzXG4gIH0pIDogbnVsbDtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCB0cmFja3NOb2RlLCB0cmFja0xpc3QubWFwKGZ1bmN0aW9uIChfcmVmLCBpbmRleCkge1xuICAgIHZhciBzdGFydCA9IF9yZWYuc3RhcnQsXG4gICAgICBlbmQgPSBfcmVmLmVuZDtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVHJhY2ssIHtcbiAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZ2V0SW5kZXgoc3R5bGUsIGluZGV4KSksIHN0eWxlcy50cmFjayksXG4gICAgICBzdGFydDogc3RhcnQsXG4gICAgICBlbmQ6IGVuZCxcbiAgICAgIGtleTogaW5kZXgsXG4gICAgICBvblN0YXJ0TW92ZTogb25TdGFydE1vdmVcbiAgICB9KTtcbiAgfSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFRyYWNrczsiLCAiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgY2xzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFNsaWRlckNvbnRleHQgZnJvbSBcIi4uL2NvbnRleHRcIjtcbmltcG9ydCB7IGdldE9mZnNldCB9IGZyb20gXCIuLi91dGlsXCI7XG52YXIgVHJhY2sgPSBmdW5jdGlvbiBUcmFjayhwcm9wcykge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgc3RhcnQgPSBwcm9wcy5zdGFydCxcbiAgICBlbmQgPSBwcm9wcy5lbmQsXG4gICAgaW5kZXggPSBwcm9wcy5pbmRleCxcbiAgICBvblN0YXJ0TW92ZSA9IHByb3BzLm9uU3RhcnRNb3ZlLFxuICAgIHJlcGxhY2VDbHMgPSBwcm9wcy5yZXBsYWNlQ2xzO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KFNsaWRlckNvbnRleHQpLFxuICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbixcbiAgICBtaW4gPSBfUmVhY3QkdXNlQ29udGV4dC5taW4sXG4gICAgbWF4ID0gX1JlYWN0JHVzZUNvbnRleHQubWF4LFxuICAgIGRpc2FibGVkID0gX1JlYWN0JHVzZUNvbnRleHQuZGlzYWJsZWQsXG4gICAgcmFuZ2UgPSBfUmVhY3QkdXNlQ29udGV4dC5yYW5nZSxcbiAgICBjbGFzc05hbWVzID0gX1JlYWN0JHVzZUNvbnRleHQuY2xhc3NOYW1lcztcbiAgdmFyIHRyYWNrUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10cmFja1wiKTtcbiAgdmFyIG9mZnNldFN0YXJ0ID0gZ2V0T2Zmc2V0KHN0YXJ0LCBtaW4sIG1heCk7XG4gIHZhciBvZmZzZXRFbmQgPSBnZXRPZmZzZXQoZW5kLCBtaW4sIG1heCk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFdmVudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgb25JbnRlcm5hbFN0YXJ0TW92ZSA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxTdGFydE1vdmUoZSkge1xuICAgIGlmICghZGlzYWJsZWQgJiYgb25TdGFydE1vdmUpIHtcbiAgICAgIG9uU3RhcnRNb3ZlKGUsIC0xKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgcG9zaXRpb25TdHlsZSA9IHt9O1xuICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgIGNhc2UgJ3J0bCc6XG4gICAgICBwb3NpdGlvblN0eWxlLnJpZ2h0ID0gXCJcIi5jb25jYXQob2Zmc2V0U3RhcnQgKiAxMDAsIFwiJVwiKTtcbiAgICAgIHBvc2l0aW9uU3R5bGUud2lkdGggPSBcIlwiLmNvbmNhdChvZmZzZXRFbmQgKiAxMDAgLSBvZmZzZXRTdGFydCAqIDEwMCwgXCIlXCIpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYnR0JzpcbiAgICAgIHBvc2l0aW9uU3R5bGUuYm90dG9tID0gXCJcIi5jb25jYXQob2Zmc2V0U3RhcnQgKiAxMDAsIFwiJVwiKTtcbiAgICAgIHBvc2l0aW9uU3R5bGUuaGVpZ2h0ID0gXCJcIi5jb25jYXQob2Zmc2V0RW5kICogMTAwIC0gb2Zmc2V0U3RhcnQgKiAxMDAsIFwiJVwiKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3R0Yic6XG4gICAgICBwb3NpdGlvblN0eWxlLnRvcCA9IFwiXCIuY29uY2F0KG9mZnNldFN0YXJ0ICogMTAwLCBcIiVcIik7XG4gICAgICBwb3NpdGlvblN0eWxlLmhlaWdodCA9IFwiXCIuY29uY2F0KG9mZnNldEVuZCAqIDEwMCAtIG9mZnNldFN0YXJ0ICogMTAwLCBcIiVcIik7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcG9zaXRpb25TdHlsZS5sZWZ0ID0gXCJcIi5jb25jYXQob2Zmc2V0U3RhcnQgKiAxMDAsIFwiJVwiKTtcbiAgICAgIHBvc2l0aW9uU3R5bGUud2lkdGggPSBcIlwiLmNvbmNhdChvZmZzZXRFbmQgKiAxMDAgLSBvZmZzZXRTdGFydCAqIDEwMCwgXCIlXCIpO1xuICB9XG4gIHZhciBjbGFzc05hbWUgPSByZXBsYWNlQ2xzIHx8IGNscyh0cmFja1ByZWZpeENscywgX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQodHJhY2tQcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQoaW5kZXggKyAxKSwgaW5kZXggIT09IG51bGwgJiYgcmFuZ2UpLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRyYWNrLWRyYWdnYWJsZVwiKSwgb25TdGFydE1vdmUpLCBjbGFzc05hbWVzLnRyYWNrKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwb3NpdGlvblN0eWxlKSwgc3R5bGUpLFxuICAgIG9uTW91c2VEb3duOiBvbkludGVybmFsU3RhcnRNb3ZlLFxuICAgIG9uVG91Y2hTdGFydDogb25JbnRlcm5hbFN0YXJ0TW92ZVxuICB9KTtcbn07XG5leHBvcnQgZGVmYXVsdCBUcmFjazsiLCAiaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZUV2ZW50IGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZUV2ZW50XCI7XG5pbXBvcnQgdXNlTGF5b3V0RWZmZWN0IGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZUxheW91dEVmZmVjdFwiO1xuaW1wb3J0IHsgVW5zdGFibGVDb250ZXh0IH0gZnJvbSBcIi4uL2NvbnRleHRcIjtcbi8qKiBEcmFnIHRvIGRlbGV0ZSBvZmZzZXQuIEl0J3MgYSB1c2VyIGV4cGVyaWVuY2UgbnVtYmVyIGZvciBkcmFnZ2luZyBvdXQgKi9cbnZhciBSRU1PVkVfRElTVCA9IDEzMDtcbmZ1bmN0aW9uIGdldFBvc2l0aW9uKGUpIHtcbiAgdmFyIG9iaiA9ICd0YXJnZXRUb3VjaGVzJyBpbiBlID8gZS50YXJnZXRUb3VjaGVzWzBdIDogZTtcbiAgcmV0dXJuIHtcbiAgICBwYWdlWDogb2JqLnBhZ2VYLFxuICAgIHBhZ2VZOiBvYmoucGFnZVlcbiAgfTtcbn1cbmZ1bmN0aW9uIHVzZURyYWcoY29udGFpbmVyUmVmLCBkaXJlY3Rpb24sIHJhd1ZhbHVlcywgbWluLCBtYXgsIGZvcm1hdFZhbHVlLCB0cmlnZ2VyQ2hhbmdlLCBmaW5pc2hDaGFuZ2UsIG9mZnNldFZhbHVlcywgZWRpdGFibGUsIG1pbkNvdW50KSB7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShudWxsKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBkcmFnZ2luZ1ZhbHVlID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXREcmFnZ2luZ1ZhbHVlID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTMgPSBSZWFjdC51c2VTdGF0ZSgtMSksXG4gICAgX1JlYWN0JHVzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTMsIDIpLFxuICAgIGRyYWdnaW5nSW5kZXggPSBfUmVhY3QkdXNlU3RhdGU0WzBdLFxuICAgIHNldERyYWdnaW5nSW5kZXggPSBfUmVhY3QkdXNlU3RhdGU0WzFdO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlNSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKSxcbiAgICBfUmVhY3QkdXNlU3RhdGU2ID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlNSwgMiksXG4gICAgZHJhZ2dpbmdEZWxldGUgPSBfUmVhY3QkdXNlU3RhdGU2WzBdLFxuICAgIHNldERyYWdnaW5nRGVsZXRlID0gX1JlYWN0JHVzZVN0YXRlNlsxXTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTcgPSBSZWFjdC51c2VTdGF0ZShyYXdWYWx1ZXMpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTggPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGU3LCAyKSxcbiAgICBjYWNoZVZhbHVlcyA9IF9SZWFjdCR1c2VTdGF0ZThbMF0sXG4gICAgc2V0Q2FjaGVWYWx1ZXMgPSBfUmVhY3QkdXNlU3RhdGU4WzFdO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlOSA9IFJlYWN0LnVzZVN0YXRlKHJhd1ZhbHVlcyksXG4gICAgX1JlYWN0JHVzZVN0YXRlMTAgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGU5LCAyKSxcbiAgICBvcmlnaW5WYWx1ZXMgPSBfUmVhY3QkdXNlU3RhdGUxMFswXSxcbiAgICBzZXRPcmlnaW5WYWx1ZXMgPSBfUmVhY3QkdXNlU3RhdGUxMFsxXTtcbiAgdmFyIG1vdXNlTW92ZUV2ZW50UmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICB2YXIgbW91c2VVcEV2ZW50UmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICB2YXIgdG91Y2hFdmVudFRhcmdldFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChVbnN0YWJsZUNvbnRleHQpLFxuICAgIG9uRHJhZ1N0YXJ0ID0gX1JlYWN0JHVzZUNvbnRleHQub25EcmFnU3RhcnQsXG4gICAgb25EcmFnQ2hhbmdlID0gX1JlYWN0JHVzZUNvbnRleHQub25EcmFnQ2hhbmdlO1xuICB1c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChkcmFnZ2luZ0luZGV4ID09PSAtMSkge1xuICAgICAgc2V0Q2FjaGVWYWx1ZXMocmF3VmFsdWVzKTtcbiAgICB9XG4gIH0sIFtyYXdWYWx1ZXMsIGRyYWdnaW5nSW5kZXhdKTtcblxuICAvLyBDbGVhbiB1cCBldmVudFxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBtb3VzZU1vdmVFdmVudFJlZi5jdXJyZW50KTtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBtb3VzZVVwRXZlbnRSZWYuY3VycmVudCk7XG4gICAgICBpZiAodG91Y2hFdmVudFRhcmdldFJlZi5jdXJyZW50KSB7XG4gICAgICAgIHRvdWNoRXZlbnRUYXJnZXRSZWYuY3VycmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBtb3VzZU1vdmVFdmVudFJlZi5jdXJyZW50KTtcbiAgICAgICAgdG91Y2hFdmVudFRhcmdldFJlZi5jdXJyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgbW91c2VVcEV2ZW50UmVmLmN1cnJlbnQpO1xuICAgICAgfVxuICAgIH07XG4gIH0sIFtdKTtcbiAgdmFyIGZsdXNoVmFsdWVzID0gZnVuY3Rpb24gZmx1c2hWYWx1ZXMobmV4dFZhbHVlcywgbmV4dFZhbHVlLCBkZWxldGVNYXJrKSB7XG4gICAgLy8gUGVyZjogT25seSB1cGRhdGUgc3RhdGUgd2hlbiB2YWx1ZSBjaGFuZ2VkXG4gICAgaWYgKG5leHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzZXREcmFnZ2luZ1ZhbHVlKG5leHRWYWx1ZSk7XG4gICAgfVxuICAgIHNldENhY2hlVmFsdWVzKG5leHRWYWx1ZXMpO1xuICAgIHZhciBjaGFuZ2VWYWx1ZXMgPSBuZXh0VmFsdWVzO1xuICAgIGlmIChkZWxldGVNYXJrKSB7XG4gICAgICBjaGFuZ2VWYWx1ZXMgPSBuZXh0VmFsdWVzLmZpbHRlcihmdW5jdGlvbiAoXywgaSkge1xuICAgICAgICByZXR1cm4gaSAhPT0gZHJhZ2dpbmdJbmRleDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0cmlnZ2VyQ2hhbmdlKGNoYW5nZVZhbHVlcyk7XG4gICAgaWYgKG9uRHJhZ0NoYW5nZSkge1xuICAgICAgb25EcmFnQ2hhbmdlKHtcbiAgICAgICAgcmF3VmFsdWVzOiBuZXh0VmFsdWVzLFxuICAgICAgICBkZWxldGVJbmRleDogZGVsZXRlTWFyayA/IGRyYWdnaW5nSW5kZXggOiAtMSxcbiAgICAgICAgZHJhZ2dpbmdJbmRleDogZHJhZ2dpbmdJbmRleCxcbiAgICAgICAgZHJhZ2dpbmdWYWx1ZTogbmV4dFZhbHVlXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIHZhciB1cGRhdGVDYWNoZVZhbHVlID0gdXNlRXZlbnQoZnVuY3Rpb24gKHZhbHVlSW5kZXgsIG9mZnNldFBlcmNlbnQsIGRlbGV0ZU1hcmspIHtcbiAgICBpZiAodmFsdWVJbmRleCA9PT0gLTEpIHtcbiAgICAgIC8vID4+Pj4gRHJhZ2dpbmcgb24gdGhlIHRyYWNrXG4gICAgICB2YXIgc3RhcnRWYWx1ZSA9IG9yaWdpblZhbHVlc1swXTtcbiAgICAgIHZhciBlbmRWYWx1ZSA9IG9yaWdpblZhbHVlc1tvcmlnaW5WYWx1ZXMubGVuZ3RoIC0gMV07XG4gICAgICB2YXIgbWF4U3RhcnRPZmZzZXQgPSBtaW4gLSBzdGFydFZhbHVlO1xuICAgICAgdmFyIG1heEVuZE9mZnNldCA9IG1heCAtIGVuZFZhbHVlO1xuXG4gICAgICAvLyBHZXQgdmFsaWQgb2Zmc2V0XG4gICAgICB2YXIgb2Zmc2V0ID0gb2Zmc2V0UGVyY2VudCAqIChtYXggLSBtaW4pO1xuICAgICAgb2Zmc2V0ID0gTWF0aC5tYXgob2Zmc2V0LCBtYXhTdGFydE9mZnNldCk7XG4gICAgICBvZmZzZXQgPSBNYXRoLm1pbihvZmZzZXQsIG1heEVuZE9mZnNldCk7XG5cbiAgICAgIC8vIFVzZSBmaXJzdCB2YWx1ZSB0byByZXZlcnQgYmFjayBvZiB2YWxpZCBvZmZzZXQgKGxpa2Ugc3RlcHMgbWFya3MpXG4gICAgICB2YXIgZm9ybWF0U3RhcnRWYWx1ZSA9IGZvcm1hdFZhbHVlKHN0YXJ0VmFsdWUgKyBvZmZzZXQpO1xuICAgICAgb2Zmc2V0ID0gZm9ybWF0U3RhcnRWYWx1ZSAtIHN0YXJ0VmFsdWU7XG4gICAgICB2YXIgY2xvbmVDYWNoZVZhbHVlcyA9IG9yaWdpblZhbHVlcy5tYXAoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICByZXR1cm4gdmFsICsgb2Zmc2V0O1xuICAgICAgfSk7XG4gICAgICBmbHVzaFZhbHVlcyhjbG9uZUNhY2hlVmFsdWVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gPj4+PiBEcmFnZ2luZyBvbiB0aGUgaGFuZGxlXG4gICAgICB2YXIgb2Zmc2V0RGlzdCA9IChtYXggLSBtaW4pICogb2Zmc2V0UGVyY2VudDtcblxuICAgICAgLy8gQWx3YXlzIHN0YXJ0IHdpdGggdGhlIHZhbHVlSW5kZXggb3JpZ2luIHZhbHVlXG4gICAgICB2YXIgY2xvbmVWYWx1ZXMgPSBfdG9Db25zdW1hYmxlQXJyYXkoY2FjaGVWYWx1ZXMpO1xuICAgICAgY2xvbmVWYWx1ZXNbdmFsdWVJbmRleF0gPSBvcmlnaW5WYWx1ZXNbdmFsdWVJbmRleF07XG4gICAgICB2YXIgbmV4dCA9IG9mZnNldFZhbHVlcyhjbG9uZVZhbHVlcywgb2Zmc2V0RGlzdCwgdmFsdWVJbmRleCwgJ2Rpc3QnKTtcbiAgICAgIGZsdXNoVmFsdWVzKG5leHQudmFsdWVzLCBuZXh0LnZhbHVlLCBkZWxldGVNYXJrKTtcbiAgICB9XG4gIH0pO1xuICB2YXIgb25TdGFydE1vdmUgPSBmdW5jdGlvbiBvblN0YXJ0TW92ZShlLCB2YWx1ZUluZGV4LCBzdGFydFZhbHVlcykge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAvLyBcdTU5ODJcdTY3OUNcdTY2MkZcdTcwQjlcdTUxRkIgdHJhY2sgXHU4OUU2XHU1M0QxXHU3Njg0XHVGRjBDXHU5NzAwXHU4OTgxXHU0RjIwXHU1MTY1XHU1M0Q4XHU1MzE2XHU1NDBFXHU3Njg0XHU1MjFEXHU1OUNCXHU1MDNDXHVGRjBDXHU4MDBDXHU0RTBEXHU4MEZEXHU3NkY0XHU2M0E1XHU3NTI4IHJhd1ZhbHVlc1xuICAgIHZhciBpbml0aWFsVmFsdWVzID0gc3RhcnRWYWx1ZXMgfHwgcmF3VmFsdWVzO1xuICAgIHZhciBvcmlnaW5WYWx1ZSA9IGluaXRpYWxWYWx1ZXNbdmFsdWVJbmRleF07XG4gICAgc2V0RHJhZ2dpbmdJbmRleCh2YWx1ZUluZGV4KTtcbiAgICBzZXREcmFnZ2luZ1ZhbHVlKG9yaWdpblZhbHVlKTtcbiAgICBzZXRPcmlnaW5WYWx1ZXMoaW5pdGlhbFZhbHVlcyk7XG4gICAgc2V0Q2FjaGVWYWx1ZXMoaW5pdGlhbFZhbHVlcyk7XG4gICAgc2V0RHJhZ2dpbmdEZWxldGUoZmFsc2UpO1xuICAgIHZhciBfZ2V0UG9zaXRpb24gPSBnZXRQb3NpdGlvbihlKSxcbiAgICAgIHN0YXJ0WCA9IF9nZXRQb3NpdGlvbi5wYWdlWCxcbiAgICAgIHN0YXJ0WSA9IF9nZXRQb3NpdGlvbi5wYWdlWTtcblxuICAgIC8vIFdlIGRlY2xhcmUgaXQgaGVyZSBzaW5jZSBjbG9zdXJlIGNhbid0IGdldCBvdXRlciBsYXRlc3QgdmFsdWVcbiAgICB2YXIgZGVsZXRlTWFyayA9IGZhbHNlO1xuXG4gICAgLy8gSW50ZXJuYWwgdHJpZ2dlciBldmVudFxuICAgIGlmIChvbkRyYWdTdGFydCkge1xuICAgICAgb25EcmFnU3RhcnQoe1xuICAgICAgICByYXdWYWx1ZXM6IGluaXRpYWxWYWx1ZXMsXG4gICAgICAgIGRyYWdnaW5nSW5kZXg6IHZhbHVlSW5kZXgsXG4gICAgICAgIGRyYWdnaW5nVmFsdWU6IG9yaWdpblZhbHVlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBNb3ZpbmdcbiAgICB2YXIgb25Nb3VzZU1vdmUgPSBmdW5jdGlvbiBvbk1vdXNlTW92ZShldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHZhciBfZ2V0UG9zaXRpb24yID0gZ2V0UG9zaXRpb24oZXZlbnQpLFxuICAgICAgICBtb3ZlWCA9IF9nZXRQb3NpdGlvbjIucGFnZVgsXG4gICAgICAgIG1vdmVZID0gX2dldFBvc2l0aW9uMi5wYWdlWTtcbiAgICAgIHZhciBvZmZzZXRYID0gbW92ZVggLSBzdGFydFg7XG4gICAgICB2YXIgb2Zmc2V0WSA9IG1vdmVZIC0gc3RhcnRZO1xuICAgICAgdmFyIF9jb250YWluZXJSZWYkY3VycmVudCA9IGNvbnRhaW5lclJlZi5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgICAgICB3aWR0aCA9IF9jb250YWluZXJSZWYkY3VycmVudC53aWR0aCxcbiAgICAgICAgaGVpZ2h0ID0gX2NvbnRhaW5lclJlZiRjdXJyZW50LmhlaWdodDtcbiAgICAgIHZhciBvZmZTZXRQZXJjZW50O1xuICAgICAgdmFyIHJlbW92ZURpc3Q7XG4gICAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgICAgICBjYXNlICdidHQnOlxuICAgICAgICAgIG9mZlNldFBlcmNlbnQgPSAtb2Zmc2V0WSAvIGhlaWdodDtcbiAgICAgICAgICByZW1vdmVEaXN0ID0gb2Zmc2V0WDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndHRiJzpcbiAgICAgICAgICBvZmZTZXRQZXJjZW50ID0gb2Zmc2V0WSAvIGhlaWdodDtcbiAgICAgICAgICByZW1vdmVEaXN0ID0gb2Zmc2V0WDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncnRsJzpcbiAgICAgICAgICBvZmZTZXRQZXJjZW50ID0gLW9mZnNldFggLyB3aWR0aDtcbiAgICAgICAgICByZW1vdmVEaXN0ID0gb2Zmc2V0WTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBvZmZTZXRQZXJjZW50ID0gb2Zmc2V0WCAvIHdpZHRoO1xuICAgICAgICAgIHJlbW92ZURpc3QgPSBvZmZzZXRZO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiBuZWVkIG1hcmsgcmVtb3ZlXG4gICAgICBkZWxldGVNYXJrID0gZWRpdGFibGUgPyBNYXRoLmFicyhyZW1vdmVEaXN0KSA+IFJFTU9WRV9ESVNUICYmIG1pbkNvdW50IDwgY2FjaGVWYWx1ZXMubGVuZ3RoIDogZmFsc2U7XG4gICAgICBzZXREcmFnZ2luZ0RlbGV0ZShkZWxldGVNYXJrKTtcbiAgICAgIHVwZGF0ZUNhY2hlVmFsdWUodmFsdWVJbmRleCwgb2ZmU2V0UGVyY2VudCwgZGVsZXRlTWFyayk7XG4gICAgfTtcblxuICAgIC8vIEVuZFxuICAgIHZhciBvbk1vdXNlVXAgPSBmdW5jdGlvbiBvbk1vdXNlVXAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Nb3VzZVVwKTtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlKTtcbiAgICAgIGlmICh0b3VjaEV2ZW50VGFyZ2V0UmVmLmN1cnJlbnQpIHtcbiAgICAgICAgdG91Y2hFdmVudFRhcmdldFJlZi5jdXJyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIG1vdXNlTW92ZUV2ZW50UmVmLmN1cnJlbnQpO1xuICAgICAgICB0b3VjaEV2ZW50VGFyZ2V0UmVmLmN1cnJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBtb3VzZVVwRXZlbnRSZWYuY3VycmVudCk7XG4gICAgICB9XG4gICAgICBtb3VzZU1vdmVFdmVudFJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgIG1vdXNlVXBFdmVudFJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgIHRvdWNoRXZlbnRUYXJnZXRSZWYuY3VycmVudCA9IG51bGw7XG4gICAgICBmaW5pc2hDaGFuZ2UoZGVsZXRlTWFyayk7XG4gICAgICBzZXREcmFnZ2luZ0luZGV4KC0xKTtcbiAgICAgIHNldERyYWdnaW5nRGVsZXRlKGZhbHNlKTtcbiAgICB9O1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlKTtcbiAgICBlLmN1cnJlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBvbk1vdXNlVXApO1xuICAgIGUuY3VycmVudFRhcmdldC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBvbk1vdXNlTW92ZSk7XG4gICAgbW91c2VNb3ZlRXZlbnRSZWYuY3VycmVudCA9IG9uTW91c2VNb3ZlO1xuICAgIG1vdXNlVXBFdmVudFJlZi5jdXJyZW50ID0gb25Nb3VzZVVwO1xuICAgIHRvdWNoRXZlbnRUYXJnZXRSZWYuY3VycmVudCA9IGUuY3VycmVudFRhcmdldDtcbiAgfTtcblxuICAvLyBPbmx5IHJldHVybiBjYWNoZSB2YWx1ZSB3aGVuIGl0IG1hcHBpbmcgd2l0aCByYXdWYWx1ZXNcbiAgdmFyIHJldHVyblZhbHVlcyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBzb3VyY2VWYWx1ZXMgPSBfdG9Db25zdW1hYmxlQXJyYXkocmF3VmFsdWVzKS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gYSAtIGI7XG4gICAgfSk7XG4gICAgdmFyIHRhcmdldFZhbHVlcyA9IF90b0NvbnN1bWFibGVBcnJheShjYWNoZVZhbHVlcykuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEgLSBiO1xuICAgIH0pO1xuICAgIHZhciBjb3VudHMgPSB7fTtcbiAgICB0YXJnZXRWYWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAodmFsKSB7XG4gICAgICBjb3VudHNbdmFsXSA9IChjb3VudHNbdmFsXSB8fCAwKSArIDE7XG4gICAgfSk7XG4gICAgc291cmNlVmFsdWVzLmZvckVhY2goZnVuY3Rpb24gKHZhbCkge1xuICAgICAgY291bnRzW3ZhbF0gPSAoY291bnRzW3ZhbF0gfHwgMCkgLSAxO1xuICAgIH0pO1xuICAgIHZhciBtYXhEaWZmQ291bnQgPSBlZGl0YWJsZSA/IDEgOiAwO1xuICAgIHZhciBkaWZmQ291bnQgPSBPYmplY3QudmFsdWVzKGNvdW50cykucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCBuZXh0KSB7XG4gICAgICByZXR1cm4gcHJldiArIE1hdGguYWJzKG5leHQpO1xuICAgIH0sIDApO1xuICAgIHJldHVybiBkaWZmQ291bnQgPD0gbWF4RGlmZkNvdW50ID8gY2FjaGVWYWx1ZXMgOiByYXdWYWx1ZXM7XG4gIH0sIFtyYXdWYWx1ZXMsIGNhY2hlVmFsdWVzLCBlZGl0YWJsZV0pO1xuICByZXR1cm4gW2RyYWdnaW5nSW5kZXgsIGRyYWdnaW5nVmFsdWUsIGRyYWdnaW5nRGVsZXRlLCByZXR1cm5WYWx1ZXMsIG9uU3RhcnRNb3ZlXTtcbn1cbmV4cG9ydCBkZWZhdWx0IHVzZURyYWc7IiwgImltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbi8qKiBGb3JtYXQgdGhlIHZhbHVlIGluIHRoZSByYW5nZSBvZiBbbWluLCBtYXhdICovXG5cbi8qKiBGb3JtYXQgdmFsdWUgYWxpZ24gd2l0aCBzdGVwICovXG5cbi8qKiBGb3JtYXQgdmFsdWUgYWxpZ24gd2l0aCBzdGVwICYgbWFya3MgKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlT2Zmc2V0KG1pbiwgbWF4LCBzdGVwLCBtYXJrTGlzdCwgYWxsb3dDcm9zcywgcHVzaGFibGUpIHtcbiAgdmFyIGZvcm1hdFJhbmdlVmFsdWUgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAodmFsKSB7XG4gICAgcmV0dXJuIE1hdGgubWF4KG1pbiwgTWF0aC5taW4obWF4LCB2YWwpKTtcbiAgfSwgW21pbiwgbWF4XSk7XG4gIHZhciBmb3JtYXRTdGVwVmFsdWUgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAodmFsKSB7XG4gICAgaWYgKHN0ZXAgIT09IG51bGwpIHtcbiAgICAgIHZhciBzdGVwVmFsdWUgPSBtaW4gKyBNYXRoLnJvdW5kKChmb3JtYXRSYW5nZVZhbHVlKHZhbCkgLSBtaW4pIC8gc3RlcCkgKiBzdGVwO1xuXG4gICAgICAvLyBDdXQgbnVtYmVyIGluIGNhc2UgdG8gYmUgbGlrZSAwLjMwMDAwMDAwMDAwMDAwMDA0XG4gICAgICB2YXIgZ2V0RGVjaW1hbCA9IGZ1bmN0aW9uIGdldERlY2ltYWwobnVtKSB7XG4gICAgICAgIHJldHVybiAoU3RyaW5nKG51bSkuc3BsaXQoJy4nKVsxXSB8fCAnJykubGVuZ3RoO1xuICAgICAgfTtcbiAgICAgIHZhciBtYXhEZWNpbWFsID0gTWF0aC5tYXgoZ2V0RGVjaW1hbChzdGVwKSwgZ2V0RGVjaW1hbChtYXgpLCBnZXREZWNpbWFsKG1pbikpO1xuICAgICAgdmFyIGZpeGVkVmFsdWUgPSBOdW1iZXIoc3RlcFZhbHVlLnRvRml4ZWQobWF4RGVjaW1hbCkpO1xuICAgICAgcmV0dXJuIG1pbiA8PSBmaXhlZFZhbHVlICYmIGZpeGVkVmFsdWUgPD0gbWF4ID8gZml4ZWRWYWx1ZSA6IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9LCBbc3RlcCwgbWluLCBtYXgsIGZvcm1hdFJhbmdlVmFsdWVdKTtcbiAgdmFyIGZvcm1hdFZhbHVlID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKHZhbCkge1xuICAgIHZhciBmb3JtYXROZXh0VmFsdWUgPSBmb3JtYXRSYW5nZVZhbHVlKHZhbCk7XG5cbiAgICAvLyBMaXN0IGFsaWduIHZhbHVlc1xuICAgIHZhciBhbGlnblZhbHVlcyA9IG1hcmtMaXN0Lm1hcChmdW5jdGlvbiAobWFyaykge1xuICAgICAgcmV0dXJuIG1hcmsudmFsdWU7XG4gICAgfSk7XG4gICAgaWYgKHN0ZXAgIT09IG51bGwpIHtcbiAgICAgIGFsaWduVmFsdWVzLnB1c2goZm9ybWF0U3RlcFZhbHVlKHZhbCkpO1xuICAgIH1cblxuICAgIC8vIG1pbiAmIG1heFxuICAgIGFsaWduVmFsdWVzLnB1c2gobWluLCBtYXgpO1xuXG4gICAgLy8gQWxpZ24gd2l0aCBtYXJrc1xuICAgIHZhciBjbG9zZVZhbHVlID0gYWxpZ25WYWx1ZXNbMF07XG4gICAgdmFyIGNsb3NlRGlzdCA9IG1heCAtIG1pbjtcbiAgICBhbGlnblZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uIChhbGlnblZhbHVlKSB7XG4gICAgICB2YXIgZGlzdCA9IE1hdGguYWJzKGZvcm1hdE5leHRWYWx1ZSAtIGFsaWduVmFsdWUpO1xuICAgICAgaWYgKGRpc3QgPD0gY2xvc2VEaXN0KSB7XG4gICAgICAgIGNsb3NlVmFsdWUgPSBhbGlnblZhbHVlO1xuICAgICAgICBjbG9zZURpc3QgPSBkaXN0O1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjbG9zZVZhbHVlO1xuICB9LCBbbWluLCBtYXgsIG1hcmtMaXN0LCBzdGVwLCBmb3JtYXRSYW5nZVZhbHVlLCBmb3JtYXRTdGVwVmFsdWVdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBPZmZzZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gU2luZ2xlIFZhbHVlXG4gIHZhciBvZmZzZXRWYWx1ZSA9IGZ1bmN0aW9uIG9mZnNldFZhbHVlKHZhbHVlcywgb2Zmc2V0LCB2YWx1ZUluZGV4KSB7XG4gICAgdmFyIG1vZGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6ICd1bml0JztcbiAgICBpZiAodHlwZW9mIG9mZnNldCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHZhciBuZXh0VmFsdWU7XG4gICAgICB2YXIgb3JpZ2luVmFsdWUgPSB2YWx1ZXNbdmFsdWVJbmRleF07XG5cbiAgICAgIC8vIE9ubHkgdXNlZCBmb3IgYGRpc3RgIG1vZGVcbiAgICAgIHZhciB0YXJnZXREaXN0VmFsdWUgPSBvcmlnaW5WYWx1ZSArIG9mZnNldDtcblxuICAgICAgLy8gQ29tcGFyZSBuZXh0IHN0ZXAgdmFsdWUgJiBtYXJrIHZhbHVlIHdoaWNoIGlzIGJlc3QgbWF0Y2hcbiAgICAgIHZhciBwb3RlbnRpYWxWYWx1ZXMgPSBbXTtcbiAgICAgIG1hcmtMaXN0LmZvckVhY2goZnVuY3Rpb24gKG1hcmspIHtcbiAgICAgICAgcG90ZW50aWFsVmFsdWVzLnB1c2gobWFyay52YWx1ZSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gTWluICYgTWF4XG4gICAgICBwb3RlbnRpYWxWYWx1ZXMucHVzaChtaW4sIG1heCk7XG5cbiAgICAgIC8vIEluIGNhc2Ugb3JpZ2luIHZhbHVlIGlzIGFsaWduIHdpdGggbWFyayBidXQgbm90IHdpdGggc3RlcFxuICAgICAgcG90ZW50aWFsVmFsdWVzLnB1c2goZm9ybWF0U3RlcFZhbHVlKG9yaWdpblZhbHVlKSk7XG5cbiAgICAgIC8vIFB1dCBvZmZzZXQgc3RlcCB2YWx1ZSBhbHNvXG4gICAgICB2YXIgc2lnbiA9IG9mZnNldCA+IDAgPyAxIDogLTE7XG4gICAgICBpZiAobW9kZSA9PT0gJ3VuaXQnKSB7XG4gICAgICAgIHBvdGVudGlhbFZhbHVlcy5wdXNoKGZvcm1hdFN0ZXBWYWx1ZShvcmlnaW5WYWx1ZSArIHNpZ24gKiBzdGVwKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwb3RlbnRpYWxWYWx1ZXMucHVzaChmb3JtYXRTdGVwVmFsdWUodGFyZ2V0RGlzdFZhbHVlKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEZpbmQgY2xvc2Ugb25lXG4gICAgICBwb3RlbnRpYWxWYWx1ZXMgPSBwb3RlbnRpYWxWYWx1ZXMuZmlsdGVyKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgcmV0dXJuIHZhbCAhPT0gbnVsbDtcbiAgICAgIH0pXG4gICAgICAvLyBSZW1vdmUgcmV2ZXJzZSB2YWx1ZVxuICAgICAgLmZpbHRlcihmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPCAwID8gdmFsIDw9IG9yaWdpblZhbHVlIDogdmFsID49IG9yaWdpblZhbHVlO1xuICAgICAgfSk7XG4gICAgICBpZiAobW9kZSA9PT0gJ3VuaXQnKSB7XG4gICAgICAgIC8vIGB1bml0YCBtb2RlIGNhbiBub3QgY29udGFpbiBpdHNlbGZcbiAgICAgICAgcG90ZW50aWFsVmFsdWVzID0gcG90ZW50aWFsVmFsdWVzLmZpbHRlcihmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbCAhPT0gb3JpZ2luVmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdmFyIGNvbXBhcmVWYWx1ZSA9IG1vZGUgPT09ICd1bml0JyA/IG9yaWdpblZhbHVlIDogdGFyZ2V0RGlzdFZhbHVlO1xuICAgICAgbmV4dFZhbHVlID0gcG90ZW50aWFsVmFsdWVzWzBdO1xuICAgICAgdmFyIHZhbHVlRGlzdCA9IE1hdGguYWJzKG5leHRWYWx1ZSAtIGNvbXBhcmVWYWx1ZSk7XG4gICAgICBwb3RlbnRpYWxWYWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAocG90ZW50aWFsVmFsdWUpIHtcbiAgICAgICAgdmFyIGRpc3QgPSBNYXRoLmFicyhwb3RlbnRpYWxWYWx1ZSAtIGNvbXBhcmVWYWx1ZSk7XG4gICAgICAgIGlmIChkaXN0IDwgdmFsdWVEaXN0KSB7XG4gICAgICAgICAgbmV4dFZhbHVlID0gcG90ZW50aWFsVmFsdWU7XG4gICAgICAgICAgdmFsdWVEaXN0ID0gZGlzdDtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIE91dCBvZiByYW5nZSB3aWxsIGJhY2sgdG8gcmFuZ2VcbiAgICAgIGlmIChuZXh0VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gb2Zmc2V0IDwgMCA/IG1pbiA6IG1heDtcbiAgICAgIH1cblxuICAgICAgLy8gYGRpc3RgIG1vZGVcbiAgICAgIGlmIChtb2RlID09PSAnZGlzdCcpIHtcbiAgICAgICAgcmV0dXJuIG5leHRWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gYHVuaXRgIG1vZGUgbWF5IG5lZWQgYW5vdGhlciByb3VuZFxuICAgICAgaWYgKE1hdGguYWJzKG9mZnNldCkgPiAxKSB7XG4gICAgICAgIHZhciBjbG9uZVZhbHVlcyA9IF90b0NvbnN1bWFibGVBcnJheSh2YWx1ZXMpO1xuICAgICAgICBjbG9uZVZhbHVlc1t2YWx1ZUluZGV4XSA9IG5leHRWYWx1ZTtcbiAgICAgICAgcmV0dXJuIG9mZnNldFZhbHVlKGNsb25lVmFsdWVzLCBvZmZzZXQgLSBzaWduLCB2YWx1ZUluZGV4LCBtb2RlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXh0VmFsdWU7XG4gICAgfSBlbHNlIGlmIChvZmZzZXQgPT09ICdtaW4nKSB7XG4gICAgICByZXR1cm4gbWluO1xuICAgIH0gZWxzZSBpZiAob2Zmc2V0ID09PSAnbWF4Jykge1xuICAgICAgcmV0dXJuIG1heDtcbiAgICB9XG4gIH07XG5cbiAgLyoqIFNhbWUgYXMgYG9mZnNldFZhbHVlYCBidXQgcmV0dXJuIGBjaGFuZ2VkYCBtYXJrIHRvIHRlbGwgdmFsdWUgY2hhbmdlZCAqL1xuICB2YXIgb2Zmc2V0Q2hhbmdlZFZhbHVlID0gZnVuY3Rpb24gb2Zmc2V0Q2hhbmdlZFZhbHVlKHZhbHVlcywgb2Zmc2V0LCB2YWx1ZUluZGV4KSB7XG4gICAgdmFyIG1vZGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6ICd1bml0JztcbiAgICB2YXIgb3JpZ2luVmFsdWUgPSB2YWx1ZXNbdmFsdWVJbmRleF07XG4gICAgdmFyIG5leHRWYWx1ZSA9IG9mZnNldFZhbHVlKHZhbHVlcywgb2Zmc2V0LCB2YWx1ZUluZGV4LCBtb2RlKTtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IG5leHRWYWx1ZSxcbiAgICAgIGNoYW5nZWQ6IG5leHRWYWx1ZSAhPT0gb3JpZ2luVmFsdWVcbiAgICB9O1xuICB9O1xuICB2YXIgbmVlZFB1c2ggPSBmdW5jdGlvbiBuZWVkUHVzaChkaXN0KSB7XG4gICAgcmV0dXJuIHB1c2hhYmxlID09PSBudWxsICYmIGRpc3QgPT09IDAgfHwgdHlwZW9mIHB1c2hhYmxlID09PSAnbnVtYmVyJyAmJiBkaXN0IDwgcHVzaGFibGU7XG4gIH07XG5cbiAgLy8gVmFsdWVzXG4gIHZhciBvZmZzZXRWYWx1ZXMgPSBmdW5jdGlvbiBvZmZzZXRWYWx1ZXModmFsdWVzLCBvZmZzZXQsIHZhbHVlSW5kZXgpIHtcbiAgICB2YXIgbW9kZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogJ3VuaXQnO1xuICAgIHZhciBuZXh0VmFsdWVzID0gdmFsdWVzLm1hcChmb3JtYXRWYWx1ZSk7XG4gICAgdmFyIG9yaWdpblZhbHVlID0gbmV4dFZhbHVlc1t2YWx1ZUluZGV4XTtcbiAgICB2YXIgbmV4dFZhbHVlID0gb2Zmc2V0VmFsdWUobmV4dFZhbHVlcywgb2Zmc2V0LCB2YWx1ZUluZGV4LCBtb2RlKTtcbiAgICBuZXh0VmFsdWVzW3ZhbHVlSW5kZXhdID0gbmV4dFZhbHVlO1xuICAgIGlmIChhbGxvd0Nyb3NzID09PSBmYWxzZSkge1xuICAgICAgLy8gPj4+Pj4gQWxsb3cgQ3Jvc3NcbiAgICAgIHZhciBwdXNoTnVtID0gcHVzaGFibGUgfHwgMDtcblxuICAgICAgLy8gPT09PT09PT09PT09IEFsbG93Q3Jvc3MgPT09PT09PT09PT09PT09XG4gICAgICBpZiAodmFsdWVJbmRleCA+IDAgJiYgbmV4dFZhbHVlc1t2YWx1ZUluZGV4IC0gMV0gIT09IG9yaWdpblZhbHVlKSB7XG4gICAgICAgIG5leHRWYWx1ZXNbdmFsdWVJbmRleF0gPSBNYXRoLm1heChuZXh0VmFsdWVzW3ZhbHVlSW5kZXhdLCBuZXh0VmFsdWVzW3ZhbHVlSW5kZXggLSAxXSArIHB1c2hOdW0pO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlSW5kZXggPCBuZXh0VmFsdWVzLmxlbmd0aCAtIDEgJiYgbmV4dFZhbHVlc1t2YWx1ZUluZGV4ICsgMV0gIT09IG9yaWdpblZhbHVlKSB7XG4gICAgICAgIG5leHRWYWx1ZXNbdmFsdWVJbmRleF0gPSBNYXRoLm1pbihuZXh0VmFsdWVzW3ZhbHVlSW5kZXhdLCBuZXh0VmFsdWVzW3ZhbHVlSW5kZXggKyAxXSAtIHB1c2hOdW0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHB1c2hhYmxlID09PSAnbnVtYmVyJyB8fCBwdXNoYWJsZSA9PT0gbnVsbCkge1xuICAgICAgLy8gPj4+Pj4gUHVzaGFibGVcbiAgICAgIC8vID09PT09PT09PT09PT09PSBQdXNoID09PT09PT09PT09PT09PT09PVxuXG4gICAgICAvLyA+Pj4+Pj4gQmFzaWMgcHVzaFxuICAgICAgLy8gRW5kIHZhbHVlc1xuICAgICAgZm9yICh2YXIgaSA9IHZhbHVlSW5kZXggKyAxOyBpIDwgbmV4dFZhbHVlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB2YXIgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIHdoaWxlIChuZWVkUHVzaChuZXh0VmFsdWVzW2ldIC0gbmV4dFZhbHVlc1tpIC0gMV0pICYmIGNoYW5nZWQpIHtcbiAgICAgICAgICB2YXIgX29mZnNldENoYW5nZWRWYWx1ZSA9IG9mZnNldENoYW5nZWRWYWx1ZShuZXh0VmFsdWVzLCAxLCBpKTtcbiAgICAgICAgICBuZXh0VmFsdWVzW2ldID0gX29mZnNldENoYW5nZWRWYWx1ZS52YWx1ZTtcbiAgICAgICAgICBjaGFuZ2VkID0gX29mZnNldENoYW5nZWRWYWx1ZS5jaGFuZ2VkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFN0YXJ0IHZhbHVlc1xuICAgICAgZm9yICh2YXIgX2kgPSB2YWx1ZUluZGV4OyBfaSA+IDA7IF9pIC09IDEpIHtcbiAgICAgICAgdmFyIF9jaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgd2hpbGUgKG5lZWRQdXNoKG5leHRWYWx1ZXNbX2ldIC0gbmV4dFZhbHVlc1tfaSAtIDFdKSAmJiBfY2hhbmdlZCkge1xuICAgICAgICAgIHZhciBfb2Zmc2V0Q2hhbmdlZFZhbHVlMiA9IG9mZnNldENoYW5nZWRWYWx1ZShuZXh0VmFsdWVzLCAtMSwgX2kgLSAxKTtcbiAgICAgICAgICBuZXh0VmFsdWVzW19pIC0gMV0gPSBfb2Zmc2V0Q2hhbmdlZFZhbHVlMi52YWx1ZTtcbiAgICAgICAgICBfY2hhbmdlZCA9IF9vZmZzZXRDaGFuZ2VkVmFsdWUyLmNoYW5nZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gPj4+Pj4gUmV2ZXJ0IGJhY2sgdG8gc2FmZSBwdXNoIHJhbmdlXG4gICAgICAvLyBFbmQgdG8gU3RhcnRcbiAgICAgIGZvciAodmFyIF9pMiA9IG5leHRWYWx1ZXMubGVuZ3RoIC0gMTsgX2kyID4gMDsgX2kyIC09IDEpIHtcbiAgICAgICAgdmFyIF9jaGFuZ2VkMiA9IHRydWU7XG4gICAgICAgIHdoaWxlIChuZWVkUHVzaChuZXh0VmFsdWVzW19pMl0gLSBuZXh0VmFsdWVzW19pMiAtIDFdKSAmJiBfY2hhbmdlZDIpIHtcbiAgICAgICAgICB2YXIgX29mZnNldENoYW5nZWRWYWx1ZTMgPSBvZmZzZXRDaGFuZ2VkVmFsdWUobmV4dFZhbHVlcywgLTEsIF9pMiAtIDEpO1xuICAgICAgICAgIG5leHRWYWx1ZXNbX2kyIC0gMV0gPSBfb2Zmc2V0Q2hhbmdlZFZhbHVlMy52YWx1ZTtcbiAgICAgICAgICBfY2hhbmdlZDIgPSBfb2Zmc2V0Q2hhbmdlZFZhbHVlMy5jaGFuZ2VkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFN0YXJ0IHRvIEVuZFxuICAgICAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgbmV4dFZhbHVlcy5sZW5ndGggLSAxOyBfaTMgKz0gMSkge1xuICAgICAgICB2YXIgX2NoYW5nZWQzID0gdHJ1ZTtcbiAgICAgICAgd2hpbGUgKG5lZWRQdXNoKG5leHRWYWx1ZXNbX2kzICsgMV0gLSBuZXh0VmFsdWVzW19pM10pICYmIF9jaGFuZ2VkMykge1xuICAgICAgICAgIHZhciBfb2Zmc2V0Q2hhbmdlZFZhbHVlNCA9IG9mZnNldENoYW5nZWRWYWx1ZShuZXh0VmFsdWVzLCAxLCBfaTMgKyAxKTtcbiAgICAgICAgICBuZXh0VmFsdWVzW19pMyArIDFdID0gX29mZnNldENoYW5nZWRWYWx1ZTQudmFsdWU7XG4gICAgICAgICAgX2NoYW5nZWQzID0gX29mZnNldENoYW5nZWRWYWx1ZTQuY2hhbmdlZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IG5leHRWYWx1ZXNbdmFsdWVJbmRleF0sXG4gICAgICB2YWx1ZXM6IG5leHRWYWx1ZXNcbiAgICB9O1xuICB9O1xuICByZXR1cm4gW2Zvcm1hdFZhbHVlLCBvZmZzZXRWYWx1ZXNdO1xufSIsICJpbXBvcnQgeyB3YXJuaW5nIH0gZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuaW1wb3J0IHsgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVJhbmdlKHJhbmdlKSB7XG4gIHJldHVybiB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocmFuZ2UgPT09IHRydWUgfHwgIXJhbmdlKSB7XG4gICAgICByZXR1cm4gWyEhcmFuZ2UsIGZhbHNlLCBmYWxzZSwgMF07XG4gICAgfVxuICAgIHZhciBlZGl0YWJsZSA9IHJhbmdlLmVkaXRhYmxlLFxuICAgICAgZHJhZ2dhYmxlVHJhY2sgPSByYW5nZS5kcmFnZ2FibGVUcmFjayxcbiAgICAgIG1pbkNvdW50ID0gcmFuZ2UubWluQ291bnQsXG4gICAgICBtYXhDb3VudCA9IHJhbmdlLm1heENvdW50O1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB3YXJuaW5nKCFlZGl0YWJsZSB8fCAhZHJhZ2dhYmxlVHJhY2ssICdgZWRpdGFibGVgIGNhbiBub3Qgd29yayB3aXRoIGBkcmFnZ2FibGVUcmFja2AuJyk7XG4gICAgfVxuICAgIHJldHVybiBbdHJ1ZSwgZWRpdGFibGUsICFlZGl0YWJsZSAmJiBkcmFnZ2FibGVUcmFjaywgbWluQ291bnQgfHwgMCwgbWF4Q291bnRdO1xuICB9LCBbcmFuZ2VdKTtcbn0iLCAiaW1wb3J0IFNsaWRlciBmcm9tIFwiLi9TbGlkZXJcIjtcbmV4cG9ydCB7IFVuc3RhYmxlQ29udGV4dCB9IGZyb20gXCIuL2NvbnRleHRcIjtcbmV4cG9ydCBkZWZhdWx0IFNsaWRlcjsiLCAiXCJ1c2UgY2xpZW50XCI7XG5cbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUmNTbGlkZXIgZnJvbSAncmMtc2xpZGVyJztcbmltcG9ydCByYWYgZnJvbSBcInJjLXV0aWwvZXMvcmFmXCI7XG5pbXBvcnQgeyBkZXZVc2VXYXJuaW5nIH0gZnJvbSAnLi4vX3V0aWwvd2FybmluZyc7XG5pbXBvcnQgRGlzYWJsZWRDb250ZXh0IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlci9EaXNhYmxlZENvbnRleHQnO1xuaW1wb3J0IFNsaWRlckludGVybmFsQ29udGV4dCBmcm9tICcuL0NvbnRleHQnO1xuaW1wb3J0IFNsaWRlclRvb2x0aXAgZnJvbSAnLi9TbGlkZXJUb29sdGlwJztcbmltcG9ydCB1c2VTdHlsZSBmcm9tICcuL3N0eWxlJztcbmltcG9ydCB1c2VSYWZMb2NrIGZyb20gJy4vdXNlUmFmTG9jayc7XG5pbXBvcnQgeyB1c2VDb21wb25lbnRDb25maWcgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXIvY29udGV4dCc7XG5mdW5jdGlvbiBnZXRUaXBGb3JtYXR0ZXIodGlwRm9ybWF0dGVyLCBsZWdhY3lUaXBGb3JtYXR0ZXIpIHtcbiAgaWYgKHRpcEZvcm1hdHRlciB8fCB0aXBGb3JtYXR0ZXIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdGlwRm9ybWF0dGVyO1xuICB9XG4gIGlmIChsZWdhY3lUaXBGb3JtYXR0ZXIgfHwgbGVnYWN5VGlwRm9ybWF0dGVyID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGxlZ2FjeVRpcEZvcm1hdHRlcjtcbiAgfVxuICByZXR1cm4gdmFsID0+IHR5cGVvZiB2YWwgPT09ICdudW1iZXInID8gdmFsLnRvU3RyaW5nKCkgOiAnJztcbn1cbmNvbnN0IFNsaWRlciA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgcmVmKSA9PiB7XG4gIGNvbnN0IHtcbiAgICAgIHByZWZpeENsczogY3VzdG9taXplUHJlZml4Q2xzLFxuICAgICAgcmFuZ2UsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICByb290Q2xhc3NOYW1lLFxuICAgICAgc3R5bGUsXG4gICAgICBkaXNhYmxlZCxcbiAgICAgIC8vIERlcHJlY2F0ZWQgUHJvcHNcbiAgICAgIHRvb2x0aXBQcmVmaXhDbHM6IGxlZ2FjeVRvb2x0aXBQcmVmaXhDbHMsXG4gICAgICB0aXBGb3JtYXR0ZXI6IGxlZ2FjeVRpcEZvcm1hdHRlcixcbiAgICAgIHRvb2x0aXBWaXNpYmxlOiBsZWdhY3lUb29sdGlwVmlzaWJsZSxcbiAgICAgIGdldFRvb2x0aXBQb3B1cENvbnRhaW5lcjogbGVnYWN5R2V0VG9vbHRpcFBvcHVwQ29udGFpbmVyLFxuICAgICAgdG9vbHRpcFBsYWNlbWVudDogbGVnYWN5VG9vbHRpcFBsYWNlbWVudCxcbiAgICAgIHRvb2x0aXAgPSB7fSxcbiAgICAgIG9uQ2hhbmdlQ29tcGxldGUsXG4gICAgICBjbGFzc05hbWVzOiBzbGlkZXJDbGFzc05hbWVzLFxuICAgICAgc3R5bGVzXG4gICAgfSA9IHByb3BzLFxuICAgIHJlc3RQcm9wcyA9IF9fcmVzdChwcm9wcywgW1wicHJlZml4Q2xzXCIsIFwicmFuZ2VcIiwgXCJjbGFzc05hbWVcIiwgXCJyb290Q2xhc3NOYW1lXCIsIFwic3R5bGVcIiwgXCJkaXNhYmxlZFwiLCBcInRvb2x0aXBQcmVmaXhDbHNcIiwgXCJ0aXBGb3JtYXR0ZXJcIiwgXCJ0b29sdGlwVmlzaWJsZVwiLCBcImdldFRvb2x0aXBQb3B1cENvbnRhaW5lclwiLCBcInRvb2x0aXBQbGFjZW1lbnRcIiwgXCJ0b29sdGlwXCIsIFwib25DaGFuZ2VDb21wbGV0ZVwiLCBcImNsYXNzTmFtZXNcIiwgXCJzdHlsZXNcIl0pO1xuICBjb25zdCB7XG4gICAgdmVydGljYWxcbiAgfSA9IHByb3BzO1xuICBjb25zdCB7XG4gICAgZ2V0UHJlZml4Q2xzLFxuICAgIGRpcmVjdGlvbjogY29udGV4dERpcmVjdGlvbixcbiAgICBjbGFzc05hbWU6IGNvbnRleHRDbGFzc05hbWUsXG4gICAgc3R5bGU6IGNvbnRleHRTdHlsZSxcbiAgICBjbGFzc05hbWVzOiBjb250ZXh0Q2xhc3NOYW1lcyxcbiAgICBzdHlsZXM6IGNvbnRleHRTdHlsZXMsXG4gICAgZ2V0UG9wdXBDb250YWluZXJcbiAgfSA9IHVzZUNvbXBvbmVudENvbmZpZygnc2xpZGVyJyk7XG4gIGNvbnN0IGNvbnRleHREaXNhYmxlZCA9IFJlYWN0LnVzZUNvbnRleHQoRGlzYWJsZWRDb250ZXh0KTtcbiAgY29uc3QgbWVyZ2VkRGlzYWJsZWQgPSBkaXNhYmxlZCAhPT0gbnVsbCAmJiBkaXNhYmxlZCAhPT0gdm9pZCAwID8gZGlzYWJsZWQgOiBjb250ZXh0RGlzYWJsZWQ7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IENvbnRleHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IHtcbiAgICBoYW5kbGVSZW5kZXI6IGNvbnRleHRIYW5kbGVSZW5kZXIsXG4gICAgZGlyZWN0aW9uOiBpbnRlcm5hbENvbnRleHREaXJlY3Rpb25cbiAgfSA9IFJlYWN0LnVzZUNvbnRleHQoU2xpZGVySW50ZXJuYWxDb250ZXh0KTtcbiAgY29uc3QgbWVyZ2VkRGlyZWN0aW9uID0gaW50ZXJuYWxDb250ZXh0RGlyZWN0aW9uIHx8IGNvbnRleHREaXJlY3Rpb247XG4gIGNvbnN0IGlzUlRMID0gbWVyZ2VkRGlyZWN0aW9uID09PSAncnRsJztcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBPcGVuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3QgW2hvdmVyT3Blbiwgc2V0SG92ZXJPcGVuXSA9IHVzZVJhZkxvY2soKTtcbiAgY29uc3QgW2ZvY3VzT3Blbiwgc2V0Rm9jdXNPcGVuXSA9IHVzZVJhZkxvY2soKTtcbiAgY29uc3QgdG9vbHRpcFByb3BzID0gT2JqZWN0LmFzc2lnbih7fSwgdG9vbHRpcCk7XG4gIGNvbnN0IHtcbiAgICBvcGVuOiB0b29sdGlwT3BlbixcbiAgICBwbGFjZW1lbnQ6IHRvb2x0aXBQbGFjZW1lbnQsXG4gICAgZ2V0UG9wdXBDb250YWluZXI6IGdldFRvb2x0aXBQb3B1cENvbnRhaW5lcixcbiAgICBwcmVmaXhDbHM6IGN1c3RvbWl6ZVRvb2x0aXBQcmVmaXhDbHMsXG4gICAgZm9ybWF0dGVyOiB0aXBGb3JtYXR0ZXJcbiAgfSA9IHRvb2x0aXBQcm9wcztcbiAgY29uc3QgbG9ja09wZW4gPSB0b29sdGlwT3BlbiAhPT0gbnVsbCAmJiB0b29sdGlwT3BlbiAhPT0gdm9pZCAwID8gdG9vbHRpcE9wZW4gOiBsZWdhY3lUb29sdGlwVmlzaWJsZTtcbiAgY29uc3QgYWN0aXZlT3BlbiA9IChob3Zlck9wZW4gfHwgZm9jdXNPcGVuKSAmJiBsb2NrT3BlbiAhPT0gZmFsc2U7XG4gIGNvbnN0IG1lcmdlZFRpcEZvcm1hdHRlciA9IGdldFRpcEZvcm1hdHRlcih0aXBGb3JtYXR0ZXIsIGxlZ2FjeVRpcEZvcm1hdHRlcik7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IENoYW5nZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3QgW2RyYWdnaW5nLCBzZXREcmFnZ2luZ10gPSB1c2VSYWZMb2NrKCk7XG4gIGNvbnN0IG9uSW50ZXJuYWxDaGFuZ2VDb21wbGV0ZSA9IG5leHRWYWx1ZXMgPT4ge1xuICAgIG9uQ2hhbmdlQ29tcGxldGUgPT09IG51bGwgfHwgb25DaGFuZ2VDb21wbGV0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2VDb21wbGV0ZShuZXh0VmFsdWVzKTtcbiAgICBzZXREcmFnZ2luZyhmYWxzZSk7XG4gIH07XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUGxhY2VtZW50ID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3QgZ2V0VG9vbHRpcFBsYWNlbWVudCA9IChwbGFjZW1lbnQsIHZlcnQpID0+IHtcbiAgICBpZiAocGxhY2VtZW50KSB7XG4gICAgICByZXR1cm4gcGxhY2VtZW50O1xuICAgIH1cbiAgICBpZiAoIXZlcnQpIHtcbiAgICAgIHJldHVybiAndG9wJztcbiAgICB9XG4gICAgcmV0dXJuIGlzUlRMID8gJ2xlZnQnIDogJ3JpZ2h0JztcbiAgfTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFN0eWxlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3QgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdzbGlkZXInLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICBjb25zdCBbd3JhcENTU1ZhciwgaGFzaElkLCBjc3NWYXJDbHNdID0gdXNlU3R5bGUocHJlZml4Q2xzKTtcbiAgY29uc3Qgcm9vdENsYXNzTmFtZXMgPSBjbGFzc05hbWVzKGNsYXNzTmFtZSwgY29udGV4dENsYXNzTmFtZSwgY29udGV4dENsYXNzTmFtZXMucm9vdCwgc2xpZGVyQ2xhc3NOYW1lcyA9PT0gbnVsbCB8fCBzbGlkZXJDbGFzc05hbWVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzbGlkZXJDbGFzc05hbWVzLnJvb3QsIHJvb3RDbGFzc05hbWUsIHtcbiAgICBbYCR7cHJlZml4Q2xzfS1ydGxgXTogaXNSVEwsXG4gICAgW2Ake3ByZWZpeENsc30tbG9ja2BdOiBkcmFnZ2luZ1xuICB9LCBoYXNoSWQsIGNzc1ZhckNscyk7XG4gIC8vIG1ha2UgcmV2ZXJzZSBkZWZhdWx0IG9uIHJ0bCBkaXJlY3Rpb25cbiAgaWYgKGlzUlRMICYmICFyZXN0UHJvcHMudmVydGljYWwpIHtcbiAgICByZXN0UHJvcHMucmV2ZXJzZSA9ICFyZXN0UHJvcHMucmV2ZXJzZTtcbiAgfVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBXYXJuaW5nID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBXYXJuaW5nIGZvciBkZXByZWNhdGVkIHVzYWdlXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgY29uc3Qgd2FybmluZyA9IGRldlVzZVdhcm5pbmcoJ1NsaWRlcicpO1xuICAgIFtbJ3Rvb2x0aXBQcmVmaXhDbHMnLCAncHJlZml4Q2xzJ10sIFsnZ2V0VG9vbHRpcFBvcHVwQ29udGFpbmVyJywgJ2dldFBvcHVwQ29udGFpbmVyJ10sIFsndGlwRm9ybWF0dGVyJywgJ2Zvcm1hdHRlciddLCBbJ3Rvb2x0aXBQbGFjZW1lbnQnLCAncGxhY2VtZW50J10sIFsndG9vbHRpcFZpc2libGUnLCAnb3BlbiddXS5mb3JFYWNoKF9yZWYgPT4ge1xuICAgICAgbGV0IFtkZXByZWNhdGVkTmFtZSwgbmV3TmFtZV0gPSBfcmVmO1xuICAgICAgd2FybmluZy5kZXByZWNhdGVkKCEoZGVwcmVjYXRlZE5hbWUgaW4gcHJvcHMpLCBkZXByZWNhdGVkTmFtZSwgYHRvb2x0aXAuJHtuZXdOYW1lfWApO1xuICAgIH0pO1xuICB9XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBIYW5kbGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgb25Nb3VzZVVwID0gKCkgPT4ge1xuICAgICAgLy8gRGVsYXkgZm9yIDEgZnJhbWUgdG8gbWFrZSB0aGUgY2xpY2sgdG8gZW5hYmxlIGhpZGUgdG9vbHRpcFxuICAgICAgLy8gZXZlbiB3aGVuIHRoZSBoYW5kbGUgaXMgZm9jdXNlZFxuICAgICAgcmFmKCgpID0+IHtcbiAgICAgICAgc2V0Rm9jdXNPcGVuKGZhbHNlKTtcbiAgICAgIH0sIDEpO1xuICAgIH07XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgY29uc3QgdXNlQWN0aXZlVG9vbHRpcEhhbmRsZSA9IHJhbmdlICYmICFsb2NrT3BlbjtcbiAgY29uc3QgaGFuZGxlUmVuZGVyID0gY29udGV4dEhhbmRsZVJlbmRlciB8fCAoKG5vZGUsIGluZm8pID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBpbmRleFxuICAgIH0gPSBpbmZvO1xuICAgIGNvbnN0IG5vZGVQcm9wcyA9IG5vZGUucHJvcHM7XG4gICAgZnVuY3Rpb24gcHJveHlFdmVudChldmVudE5hbWUsIGV2ZW50LCB0cmlnZ2VyUmVzdFByb3BzRXZlbnQpIHtcbiAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgIGlmICh0cmlnZ2VyUmVzdFByb3BzRXZlbnQpIHtcbiAgICAgICAgKF9iID0gKF9hID0gcmVzdFByb3BzKVtldmVudE5hbWVdKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChfYSwgZXZlbnQpO1xuICAgICAgfVxuICAgICAgKF9kID0gKF9jID0gbm9kZVByb3BzKVtldmVudE5hbWVdKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QuY2FsbChfYywgZXZlbnQpO1xuICAgIH1cbiAgICBjb25zdCBwYXNzZWRQcm9wcyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgbm9kZVByb3BzKSwge1xuICAgICAgb25Nb3VzZUVudGVyOiBlID0+IHtcbiAgICAgICAgc2V0SG92ZXJPcGVuKHRydWUpO1xuICAgICAgICBwcm94eUV2ZW50KCdvbk1vdXNlRW50ZXInLCBlKTtcbiAgICAgIH0sXG4gICAgICBvbk1vdXNlTGVhdmU6IGUgPT4ge1xuICAgICAgICBzZXRIb3Zlck9wZW4oZmFsc2UpO1xuICAgICAgICBwcm94eUV2ZW50KCdvbk1vdXNlTGVhdmUnLCBlKTtcbiAgICAgIH0sXG4gICAgICBvbk1vdXNlRG93bjogZSA9PiB7XG4gICAgICAgIHNldEZvY3VzT3Blbih0cnVlKTtcbiAgICAgICAgc2V0RHJhZ2dpbmcodHJ1ZSk7XG4gICAgICAgIHByb3h5RXZlbnQoJ29uTW91c2VEb3duJywgZSk7XG4gICAgICB9LFxuICAgICAgb25Gb2N1czogZSA9PiB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgc2V0Rm9jdXNPcGVuKHRydWUpO1xuICAgICAgICAoX2EgPSByZXN0UHJvcHMub25Gb2N1cykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwocmVzdFByb3BzLCBlKTtcbiAgICAgICAgcHJveHlFdmVudCgnb25Gb2N1cycsIGUsIHRydWUpO1xuICAgICAgfSxcbiAgICAgIG9uQmx1cjogZSA9PiB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgc2V0Rm9jdXNPcGVuKGZhbHNlKTtcbiAgICAgICAgKF9hID0gcmVzdFByb3BzLm9uQmx1cikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwocmVzdFByb3BzLCBlKTtcbiAgICAgICAgcHJveHlFdmVudCgnb25CbHVyJywgZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgY2xvbmVOb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChub2RlLCBwYXNzZWRQcm9wcyk7XG4gICAgY29uc3Qgb3BlbiA9ICghIWxvY2tPcGVuIHx8IGFjdGl2ZU9wZW4pICYmIG1lcmdlZFRpcEZvcm1hdHRlciAhPT0gbnVsbDtcbiAgICAvLyBXcmFwIG9uIGhhbmRsZSB3aXRoIFRvb2x0aXAgd2hlbiBpcyBzaW5nbGUgbW9kZSBvciBtdWx0aXBsZSB3aXRoIGFsbCBzaG93IHRvb2x0aXBcbiAgICBpZiAoIXVzZUFjdGl2ZVRvb2x0aXBIYW5kbGUpIHtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTbGlkZXJUb29sdGlwLCBPYmplY3QuYXNzaWduKHt9LCB0b29sdGlwUHJvcHMsIHtcbiAgICAgICAgcHJlZml4Q2xzOiBnZXRQcmVmaXhDbHMoJ3Rvb2x0aXAnLCBjdXN0b21pemVUb29sdGlwUHJlZml4Q2xzICE9PSBudWxsICYmIGN1c3RvbWl6ZVRvb2x0aXBQcmVmaXhDbHMgIT09IHZvaWQgMCA/IGN1c3RvbWl6ZVRvb2x0aXBQcmVmaXhDbHMgOiBsZWdhY3lUb29sdGlwUHJlZml4Q2xzKSxcbiAgICAgICAgdGl0bGU6IG1lcmdlZFRpcEZvcm1hdHRlciA/IG1lcmdlZFRpcEZvcm1hdHRlcihpbmZvLnZhbHVlKSA6ICcnLFxuICAgICAgICB2YWx1ZTogaW5mby52YWx1ZSxcbiAgICAgICAgb3Blbjogb3BlbixcbiAgICAgICAgcGxhY2VtZW50OiBnZXRUb29sdGlwUGxhY2VtZW50KHRvb2x0aXBQbGFjZW1lbnQgIT09IG51bGwgJiYgdG9vbHRpcFBsYWNlbWVudCAhPT0gdm9pZCAwID8gdG9vbHRpcFBsYWNlbWVudCA6IGxlZ2FjeVRvb2x0aXBQbGFjZW1lbnQsIHZlcnRpY2FsKSxcbiAgICAgICAga2V5OiBpbmRleCxcbiAgICAgICAgY2xhc3NOYW1lczoge1xuICAgICAgICAgIHJvb3Q6IGAke3ByZWZpeENsc30tdG9vbHRpcGBcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0UG9wdXBDb250YWluZXI6IGdldFRvb2x0aXBQb3B1cENvbnRhaW5lciB8fCBsZWdhY3lHZXRUb29sdGlwUG9wdXBDb250YWluZXIgfHwgZ2V0UG9wdXBDb250YWluZXJcbiAgICAgIH0pLCBjbG9uZU5vZGUpO1xuICAgIH1cbiAgICByZXR1cm4gY2xvbmVOb2RlO1xuICB9KTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gQWN0aXZlIEhhbmRsZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3QgYWN0aXZlSGFuZGxlUmVuZGVyID0gdXNlQWN0aXZlVG9vbHRpcEhhbmRsZSA/IChoYW5kbGUsIGluZm8pID0+IHtcbiAgICBjb25zdCBjbG9uZU5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGhhbmRsZSwge1xuICAgICAgc3R5bGU6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgaGFuZGxlLnByb3BzLnN0eWxlKSwge1xuICAgICAgICB2aXNpYmlsaXR5OiAnaGlkZGVuJ1xuICAgICAgfSlcbiAgICB9KTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU2xpZGVyVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7fSwgdG9vbHRpcFByb3BzLCB7XG4gICAgICBwcmVmaXhDbHM6IGdldFByZWZpeENscygndG9vbHRpcCcsIGN1c3RvbWl6ZVRvb2x0aXBQcmVmaXhDbHMgIT09IG51bGwgJiYgY3VzdG9taXplVG9vbHRpcFByZWZpeENscyAhPT0gdm9pZCAwID8gY3VzdG9taXplVG9vbHRpcFByZWZpeENscyA6IGxlZ2FjeVRvb2x0aXBQcmVmaXhDbHMpLFxuICAgICAgdGl0bGU6IG1lcmdlZFRpcEZvcm1hdHRlciA/IG1lcmdlZFRpcEZvcm1hdHRlcihpbmZvLnZhbHVlKSA6ICcnLFxuICAgICAgb3BlbjogbWVyZ2VkVGlwRm9ybWF0dGVyICE9PSBudWxsICYmIGFjdGl2ZU9wZW4sXG4gICAgICBwbGFjZW1lbnQ6IGdldFRvb2x0aXBQbGFjZW1lbnQodG9vbHRpcFBsYWNlbWVudCAhPT0gbnVsbCAmJiB0b29sdGlwUGxhY2VtZW50ICE9PSB2b2lkIDAgPyB0b29sdGlwUGxhY2VtZW50IDogbGVnYWN5VG9vbHRpcFBsYWNlbWVudCwgdmVydGljYWwpLFxuICAgICAga2V5OiBcInRvb2x0aXBcIixcbiAgICAgIGNsYXNzTmFtZXM6IHtcbiAgICAgICAgcm9vdDogYCR7cHJlZml4Q2xzfS10b29sdGlwYFxuICAgICAgfSxcbiAgICAgIGdldFBvcHVwQ29udGFpbmVyOiBnZXRUb29sdGlwUG9wdXBDb250YWluZXIgfHwgbGVnYWN5R2V0VG9vbHRpcFBvcHVwQ29udGFpbmVyIHx8IGdldFBvcHVwQ29udGFpbmVyLFxuICAgICAgZHJhZ2dpbmdEZWxldGU6IGluZm8uZHJhZ2dpbmdEZWxldGVcbiAgICB9KSwgY2xvbmVOb2RlKTtcbiAgfSA6IHVuZGVmaW5lZDtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3Qgcm9vdFN0eWxlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY29udGV4dFN0eWxlcy5yb290KSwgY29udGV4dFN0eWxlKSwgc3R5bGVzID09PSBudWxsIHx8IHN0eWxlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3R5bGVzLnJvb3QpLCBzdHlsZSk7XG4gIGNvbnN0IG1lcmdlZFRyYWNrcyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY29udGV4dFN0eWxlcy50cmFja3MpLCBzdHlsZXMgPT09IG51bGwgfHwgc3R5bGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdHlsZXMudHJhY2tzKTtcbiAgY29uc3QgbWVyZ2VkVHJhY2tzQ2xhc3NOYW1lcyA9IGNsYXNzTmFtZXMoY29udGV4dENsYXNzTmFtZXMudHJhY2tzLCBzbGlkZXJDbGFzc05hbWVzID09PSBudWxsIHx8IHNsaWRlckNsYXNzTmFtZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNsaWRlckNsYXNzTmFtZXMudHJhY2tzKTtcbiAgcmV0dXJuIHdyYXBDU1NWYXIoXG4gIC8qI19fUFVSRV9fKi9cbiAgLy8gQHRzLWlnbm9yZVxuICBSZWFjdC5jcmVhdGVFbGVtZW50KFJjU2xpZGVyLCBPYmplY3QuYXNzaWduKHt9LCByZXN0UHJvcHMsIHtcbiAgICBjbGFzc05hbWVzOiBPYmplY3QuYXNzaWduKHtcbiAgICAgIGhhbmRsZTogY2xhc3NOYW1lcyhjb250ZXh0Q2xhc3NOYW1lcy5oYW5kbGUsIHNsaWRlckNsYXNzTmFtZXMgPT09IG51bGwgfHwgc2xpZGVyQ2xhc3NOYW1lcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2xpZGVyQ2xhc3NOYW1lcy5oYW5kbGUpLFxuICAgICAgcmFpbDogY2xhc3NOYW1lcyhjb250ZXh0Q2xhc3NOYW1lcy5yYWlsLCBzbGlkZXJDbGFzc05hbWVzID09PSBudWxsIHx8IHNsaWRlckNsYXNzTmFtZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNsaWRlckNsYXNzTmFtZXMucmFpbCksXG4gICAgICB0cmFjazogY2xhc3NOYW1lcyhjb250ZXh0Q2xhc3NOYW1lcy50cmFjaywgc2xpZGVyQ2xhc3NOYW1lcyA9PT0gbnVsbCB8fCBzbGlkZXJDbGFzc05hbWVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzbGlkZXJDbGFzc05hbWVzLnRyYWNrKVxuICAgIH0sIG1lcmdlZFRyYWNrc0NsYXNzTmFtZXMgPyB7XG4gICAgICB0cmFja3M6IG1lcmdlZFRyYWNrc0NsYXNzTmFtZXNcbiAgICB9IDoge30pLFxuICAgIHN0eWxlczogT2JqZWN0LmFzc2lnbih7XG4gICAgICBoYW5kbGU6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY29udGV4dFN0eWxlcy5oYW5kbGUpLCBzdHlsZXMgPT09IG51bGwgfHwgc3R5bGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdHlsZXMuaGFuZGxlKSxcbiAgICAgIHJhaWw6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY29udGV4dFN0eWxlcy5yYWlsKSwgc3R5bGVzID09PSBudWxsIHx8IHN0eWxlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3R5bGVzLnJhaWwpLFxuICAgICAgdHJhY2s6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY29udGV4dFN0eWxlcy50cmFjayksIHN0eWxlcyA9PT0gbnVsbCB8fCBzdHlsZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0eWxlcy50cmFjaylcbiAgICB9LCBPYmplY3Qua2V5cyhtZXJnZWRUcmFja3MpLmxlbmd0aCA/IHtcbiAgICAgIHRyYWNrczogbWVyZ2VkVHJhY2tzXG4gICAgfSA6IHt9KSxcbiAgICBzdGVwOiByZXN0UHJvcHMuc3RlcCxcbiAgICByYW5nZTogcmFuZ2UsXG4gICAgY2xhc3NOYW1lOiByb290Q2xhc3NOYW1lcyxcbiAgICBzdHlsZTogcm9vdFN0eWxlLFxuICAgIGRpc2FibGVkOiBtZXJnZWREaXNhYmxlZCxcbiAgICByZWY6IHJlZixcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBoYW5kbGVSZW5kZXI6IGhhbmRsZVJlbmRlcixcbiAgICBhY3RpdmVIYW5kbGVSZW5kZXI6IGFjdGl2ZUhhbmRsZVJlbmRlcixcbiAgICBvbkNoYW5nZUNvbXBsZXRlOiBvbkludGVybmFsQ2hhbmdlQ29tcGxldGVcbiAgfSkpKTtcbn0pO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgU2xpZGVyLmRpc3BsYXlOYW1lID0gJ1NsaWRlcic7XG59XG5leHBvcnQgZGVmYXVsdCBTbGlkZXI7IiwgImltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG4vKiogQHByaXZhdGUgSW50ZXJuYWwgY29udGV4dC4gRG8gbm90IHVzZSBpbiB5b3VyIHByb2R1Y3Rpb24uICovXG5jb25zdCBTbGlkZXJJbnRlcm5hbENvbnRleHQgPSAvKiNfX1BVUkVfXyovY3JlYXRlQ29udGV4dCh7fSk7XG5leHBvcnQgZGVmYXVsdCBTbGlkZXJJbnRlcm5hbENvbnRleHQ7IiwgIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgcmFmIGZyb20gXCJyYy11dGlsL2VzL3JhZlwiO1xuaW1wb3J0IHsgY29tcG9zZVJlZiB9IGZyb20gXCJyYy11dGlsL2VzL3JlZlwiO1xuaW1wb3J0IFRvb2x0aXAgZnJvbSAnLi4vdG9vbHRpcCc7XG5jb25zdCBTbGlkZXJUb29sdGlwID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHByb3BzLCByZWYpID0+IHtcbiAgY29uc3Qge1xuICAgIG9wZW4sXG4gICAgZHJhZ2dpbmdEZWxldGUsXG4gICAgdmFsdWVcbiAgfSA9IHByb3BzO1xuICBjb25zdCBpbm5lclJlZiA9IHVzZVJlZihudWxsKTtcbiAgY29uc3QgbWVyZ2VkT3BlbiA9IG9wZW4gJiYgIWRyYWdnaW5nRGVsZXRlO1xuICBjb25zdCByYWZSZWYgPSB1c2VSZWYobnVsbCk7XG4gIGZ1bmN0aW9uIGNhbmNlbEtlZXBBbGlnbigpIHtcbiAgICByYWYuY2FuY2VsKHJhZlJlZi5jdXJyZW50KTtcbiAgICByYWZSZWYuY3VycmVudCA9IG51bGw7XG4gIH1cbiAgZnVuY3Rpb24ga2VlcEFsaWduKCkge1xuICAgIHJhZlJlZi5jdXJyZW50ID0gcmFmKCgpID0+IHtcbiAgICAgIHZhciBfYTtcbiAgICAgIChfYSA9IGlubmVyUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5mb3JjZUFsaWduKCk7XG4gICAgICByYWZSZWYuY3VycmVudCA9IG51bGw7XG4gICAgfSk7XG4gIH1cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAobWVyZ2VkT3Blbikge1xuICAgICAga2VlcEFsaWduKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbmNlbEtlZXBBbGlnbigpO1xuICAgIH1cbiAgICByZXR1cm4gY2FuY2VsS2VlcEFsaWduO1xuICB9LCBbbWVyZ2VkT3BlbiwgcHJvcHMudGl0bGUsIHZhbHVlXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwLCBPYmplY3QuYXNzaWduKHtcbiAgICByZWY6IGNvbXBvc2VSZWYoaW5uZXJSZWYsIHJlZilcbiAgfSwgcHJvcHMsIHtcbiAgICBvcGVuOiBtZXJnZWRPcGVuXG4gIH0pKTtcbn0pO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgU2xpZGVyVG9vbHRpcC5kaXNwbGF5TmFtZSA9ICdTbGlkZXJUb29sdGlwJztcbn1cbmV4cG9ydCBkZWZhdWx0IFNsaWRlclRvb2x0aXA7IiwgImltcG9ydCB7IHVuaXQgfSBmcm9tICdAYW50LWRlc2lnbi9jc3NpbmpzJztcbmltcG9ydCB7IEZhc3RDb2xvciB9IGZyb20gJ0BhbnQtZGVzaWduL2Zhc3QtY29sb3InO1xuaW1wb3J0IHsgcmVzZXRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9zdHlsZSc7XG5pbXBvcnQgeyBnZW5TdHlsZUhvb2tzLCBtZXJnZVRva2VuIH0gZnJvbSAnLi4vLi4vdGhlbWUvaW50ZXJuYWwnO1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBCYXNlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmNvbnN0IGdlbkJhc2VTdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENscyxcbiAgICBhbnRDbHMsXG4gICAgY29udHJvbFNpemUsXG4gICAgZG90U2l6ZSxcbiAgICBtYXJnaW5GdWxsLFxuICAgIG1hcmdpblBhcnQsXG4gICAgY29sb3JGaWxsQ29udGVudEhvdmVyLFxuICAgIGhhbmRsZUNvbG9yRGlzYWJsZWQsXG4gICAgY2FsYyxcbiAgICBoYW5kbGVTaXplLFxuICAgIGhhbmRsZVNpemVIb3ZlcixcbiAgICBoYW5kbGVBY3RpdmVDb2xvcixcbiAgICBoYW5kbGVBY3RpdmVPdXRsaW5lQ29sb3IsXG4gICAgaGFuZGxlTGluZVdpZHRoLFxuICAgIGhhbmRsZUxpbmVXaWR0aEhvdmVyLFxuICAgIG1vdGlvbkR1cmF0aW9uTWlkXG4gIH0gPSB0b2tlbjtcbiAgcmV0dXJuIHtcbiAgICBbY29tcG9uZW50Q2xzXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXNldENvbXBvbmVudCh0b2tlbikpLCB7XG4gICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgIGhlaWdodDogY29udHJvbFNpemUsXG4gICAgICBtYXJnaW46IGAke3VuaXQobWFyZ2luUGFydCl9ICR7dW5pdChtYXJnaW5GdWxsKX1gLFxuICAgICAgcGFkZGluZzogMCxcbiAgICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgICAgdG91Y2hBY3Rpb246ICdub25lJyxcbiAgICAgICcmLXZlcnRpY2FsJzoge1xuICAgICAgICBtYXJnaW46IGAke3VuaXQobWFyZ2luRnVsbCl9ICR7dW5pdChtYXJnaW5QYXJ0KX1gXG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tcmFpbGBdOiB7XG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRva2VuLnJhaWxCZyxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiB0b2tlbi5ib3JkZXJSYWRpdXNYUyxcbiAgICAgICAgdHJhbnNpdGlvbjogYGJhY2tncm91bmQtY29sb3IgJHttb3Rpb25EdXJhdGlvbk1pZH1gXG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tdHJhY2ssJHtjb21wb25lbnRDbHN9LXRyYWNrc2BdOiB7XG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICB0cmFuc2l0aW9uOiBgYmFja2dyb3VuZC1jb2xvciAke21vdGlvbkR1cmF0aW9uTWlkfWBcbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS10cmFja2BdOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogdG9rZW4udHJhY2tCZyxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiB0b2tlbi5ib3JkZXJSYWRpdXNYU1xuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LXRyYWNrLWRyYWdnYWJsZWBdOiB7XG4gICAgICAgIGJveFNpemluZzogJ2NvbnRlbnQtYm94JyxcbiAgICAgICAgYmFja2dyb3VuZENsaXA6ICdjb250ZW50LWJveCcsXG4gICAgICAgIGJvcmRlcjogJ3NvbGlkIHJnYmEoMCwwLDAsMCknXG4gICAgICB9LFxuICAgICAgJyY6aG92ZXInOiB7XG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LXJhaWxgXToge1xuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdG9rZW4ucmFpbEhvdmVyQmdcbiAgICAgICAgfSxcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30tdHJhY2tgXToge1xuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdG9rZW4udHJhY2tIb3ZlckJnXG4gICAgICAgIH0sXG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LWRvdGBdOiB7XG4gICAgICAgICAgYm9yZGVyQ29sb3I6IGNvbG9yRmlsbENvbnRlbnRIb3ZlclxuICAgICAgICB9LFxuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1oYW5kbGU6OmFmdGVyYF06IHtcbiAgICAgICAgICBib3hTaGFkb3c6IGAwIDAgMCAke3VuaXQoaGFuZGxlTGluZVdpZHRoKX0gJHt0b2tlbi5jb2xvclByaW1hcnlCb3JkZXJIb3Zlcn1gXG4gICAgICAgIH0sXG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LWRvdC1hY3RpdmVgXToge1xuICAgICAgICAgIGJvcmRlckNvbG9yOiB0b2tlbi5kb3RBY3RpdmVCb3JkZXJDb2xvclxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30taGFuZGxlYF06IHtcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgIHdpZHRoOiBoYW5kbGVTaXplLFxuICAgICAgICBoZWlnaHQ6IGhhbmRsZVNpemUsXG4gICAgICAgIG91dGxpbmU6ICdub25lJyxcbiAgICAgICAgdXNlclNlbGVjdDogJ25vbmUnLFxuICAgICAgICAvLyBEcmFnZ2luZyBzdGF0dXNcbiAgICAgICAgJyYtZHJhZ2dpbmctZGVsZXRlJzoge1xuICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgfSxcbiAgICAgICAgLy8gXHU2MjY5XHU1OTI3XHU5MDA5XHU1MzNBXG4gICAgICAgICcmOjpiZWZvcmUnOiB7XG4gICAgICAgICAgY29udGVudDogJ1wiXCInLFxuICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgIGluc2V0SW5saW5lU3RhcnQ6IGNhbGMoaGFuZGxlTGluZVdpZHRoKS5tdWwoLTEpLmVxdWFsKCksXG4gICAgICAgICAgaW5zZXRCbG9ja1N0YXJ0OiBjYWxjKGhhbmRsZUxpbmVXaWR0aCkubXVsKC0xKS5lcXVhbCgpLFxuICAgICAgICAgIHdpZHRoOiBjYWxjKGhhbmRsZVNpemUpLmFkZChjYWxjKGhhbmRsZUxpbmVXaWR0aCkubXVsKDIpKS5lcXVhbCgpLFxuICAgICAgICAgIGhlaWdodDogY2FsYyhoYW5kbGVTaXplKS5hZGQoY2FsYyhoYW5kbGVMaW5lV2lkdGgpLm11bCgyKSkuZXF1YWwoKSxcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd0cmFuc3BhcmVudCdcbiAgICAgICAgfSxcbiAgICAgICAgJyY6OmFmdGVyJzoge1xuICAgICAgICAgIGNvbnRlbnQ6ICdcIlwiJyxcbiAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICBpbnNldEJsb2NrU3RhcnQ6IDAsXG4gICAgICAgICAgaW5zZXRJbmxpbmVTdGFydDogMCxcbiAgICAgICAgICB3aWR0aDogaGFuZGxlU2l6ZSxcbiAgICAgICAgICBoZWlnaHQ6IGhhbmRsZVNpemUsXG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0b2tlbi5jb2xvckJnRWxldmF0ZWQsXG4gICAgICAgICAgYm94U2hhZG93OiBgMCAwIDAgJHt1bml0KGhhbmRsZUxpbmVXaWR0aCl9ICR7dG9rZW4uaGFuZGxlQ29sb3J9YCxcbiAgICAgICAgICBvdXRsaW5lOiBgMHB4IHNvbGlkIHRyYW5zcGFyZW50YCxcbiAgICAgICAgICBib3JkZXJSYWRpdXM6ICc1MCUnLFxuICAgICAgICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgICAgICAgIHRyYW5zaXRpb246IGBcbiAgICAgICAgICAgIGluc2V0LWlubGluZS1zdGFydCAke21vdGlvbkR1cmF0aW9uTWlkfSxcbiAgICAgICAgICAgIGluc2V0LWJsb2NrLXN0YXJ0ICR7bW90aW9uRHVyYXRpb25NaWR9LFxuICAgICAgICAgICAgd2lkdGggJHttb3Rpb25EdXJhdGlvbk1pZH0sXG4gICAgICAgICAgICBoZWlnaHQgJHttb3Rpb25EdXJhdGlvbk1pZH0sXG4gICAgICAgICAgICBib3gtc2hhZG93ICR7bW90aW9uRHVyYXRpb25NaWR9LFxuICAgICAgICAgICAgb3V0bGluZSAke21vdGlvbkR1cmF0aW9uTWlkfVxuICAgICAgICAgIGBcbiAgICAgICAgfSxcbiAgICAgICAgJyY6aG92ZXIsICY6YWN0aXZlLCAmOmZvY3VzJzoge1xuICAgICAgICAgICcmOjpiZWZvcmUnOiB7XG4gICAgICAgICAgICBpbnNldElubGluZVN0YXJ0OiBjYWxjKGhhbmRsZVNpemVIb3Zlcikuc3ViKGhhbmRsZVNpemUpLmRpdigyKS5hZGQoaGFuZGxlTGluZVdpZHRoSG92ZXIpLm11bCgtMSkuZXF1YWwoKSxcbiAgICAgICAgICAgIGluc2V0QmxvY2tTdGFydDogY2FsYyhoYW5kbGVTaXplSG92ZXIpLnN1YihoYW5kbGVTaXplKS5kaXYoMikuYWRkKGhhbmRsZUxpbmVXaWR0aEhvdmVyKS5tdWwoLTEpLmVxdWFsKCksXG4gICAgICAgICAgICB3aWR0aDogY2FsYyhoYW5kbGVTaXplSG92ZXIpLmFkZChjYWxjKGhhbmRsZUxpbmVXaWR0aEhvdmVyKS5tdWwoMikpLmVxdWFsKCksXG4gICAgICAgICAgICBoZWlnaHQ6IGNhbGMoaGFuZGxlU2l6ZUhvdmVyKS5hZGQoY2FsYyhoYW5kbGVMaW5lV2lkdGhIb3ZlcikubXVsKDIpKS5lcXVhbCgpXG4gICAgICAgICAgfSxcbiAgICAgICAgICAnJjo6YWZ0ZXInOiB7XG4gICAgICAgICAgICBib3hTaGFkb3c6IGAwIDAgMCAke3VuaXQoaGFuZGxlTGluZVdpZHRoSG92ZXIpfSAke2hhbmRsZUFjdGl2ZUNvbG9yfWAsXG4gICAgICAgICAgICBvdXRsaW5lOiBgNnB4IHNvbGlkICR7aGFuZGxlQWN0aXZlT3V0bGluZUNvbG9yfWAsXG4gICAgICAgICAgICB3aWR0aDogaGFuZGxlU2l6ZUhvdmVyLFxuICAgICAgICAgICAgaGVpZ2h0OiBoYW5kbGVTaXplSG92ZXIsXG4gICAgICAgICAgICBpbnNldElubGluZVN0YXJ0OiB0b2tlbi5jYWxjKGhhbmRsZVNpemUpLnN1YihoYW5kbGVTaXplSG92ZXIpLmRpdigyKS5lcXVhbCgpLFxuICAgICAgICAgICAgaW5zZXRCbG9ja1N0YXJ0OiB0b2tlbi5jYWxjKGhhbmRsZVNpemUpLnN1YihoYW5kbGVTaXplSG92ZXIpLmRpdigyKS5lcXVhbCgpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2AmLWxvY2sgJHtjb21wb25lbnRDbHN9LWhhbmRsZWBdOiB7XG4gICAgICAgICcmOjpiZWZvcmUsICY6OmFmdGVyJzoge1xuICAgICAgICAgIHRyYW5zaXRpb246ICdub25lJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tbWFya2BdOiB7XG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICBmb250U2l6ZTogdG9rZW4uZm9udFNpemVcbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1tYXJrLXRleHRgXToge1xuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICAgIGNvbG9yOiB0b2tlbi5jb2xvclRleHREZXNjcmlwdGlvbixcbiAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgd29yZEJyZWFrOiAna2VlcC1hbGwnLFxuICAgICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgICAgdXNlclNlbGVjdDogJ25vbmUnLFxuICAgICAgICAnJi1hY3RpdmUnOiB7XG4gICAgICAgICAgY29sb3I6IHRva2VuLmNvbG9yVGV4dFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tc3RlcGBdOiB7XG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICBiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZSdcbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1kb3RgXToge1xuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgd2lkdGg6IGRvdFNpemUsXG4gICAgICAgIGhlaWdodDogZG90U2l6ZSxcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0b2tlbi5jb2xvckJnRWxldmF0ZWQsXG4gICAgICAgIGJvcmRlcjogYCR7dW5pdChoYW5kbGVMaW5lV2lkdGgpfSBzb2xpZCAke3Rva2VuLmRvdEJvcmRlckNvbG9yfWAsXG4gICAgICAgIGJvcmRlclJhZGl1czogJzUwJScsXG4gICAgICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgICAgICB0cmFuc2l0aW9uOiBgYm9yZGVyLWNvbG9yICR7dG9rZW4ubW90aW9uRHVyYXRpb25TbG93fWAsXG4gICAgICAgIHBvaW50ZXJFdmVudHM6ICdhdXRvJyxcbiAgICAgICAgJyYtYWN0aXZlJzoge1xuICAgICAgICAgIGJvcmRlckNvbG9yOiB0b2tlbi5kb3RBY3RpdmVCb3JkZXJDb2xvclxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2AmJHtjb21wb25lbnRDbHN9LWRpc2FibGVkYF06IHtcbiAgICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQnLFxuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1yYWlsYF06IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGAke3Rva2VuLnJhaWxCZ30gIWltcG9ydGFudGBcbiAgICAgICAgfSxcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30tdHJhY2tgXToge1xuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogYCR7dG9rZW4udHJhY2tCZ0Rpc2FibGVkfSAhaW1wb3J0YW50YFxuICAgICAgICB9LFxuICAgICAgICBbYFxuICAgICAgICAgICR7Y29tcG9uZW50Q2xzfS1kb3RcbiAgICAgICAgYF06IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRva2VuLmNvbG9yQmdFbGV2YXRlZCxcbiAgICAgICAgICBib3JkZXJDb2xvcjogdG9rZW4udHJhY2tCZ0Rpc2FibGVkLFxuICAgICAgICAgIGJveFNoYWRvdzogJ25vbmUnLFxuICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkJ1xuICAgICAgICB9LFxuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1oYW5kbGU6OmFmdGVyYF06IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRva2VuLmNvbG9yQmdFbGV2YXRlZCxcbiAgICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCcsXG4gICAgICAgICAgd2lkdGg6IGhhbmRsZVNpemUsXG4gICAgICAgICAgaGVpZ2h0OiBoYW5kbGVTaXplLFxuICAgICAgICAgIGJveFNoYWRvdzogYDAgMCAwICR7dW5pdChoYW5kbGVMaW5lV2lkdGgpfSAke2hhbmRsZUNvbG9yRGlzYWJsZWR9YCxcbiAgICAgICAgICBpbnNldElubGluZVN0YXJ0OiAwLFxuICAgICAgICAgIGluc2V0QmxvY2tTdGFydDogMFxuICAgICAgICB9LFxuICAgICAgICBbYFxuICAgICAgICAgICR7Y29tcG9uZW50Q2xzfS1tYXJrLXRleHQsXG4gICAgICAgICAgJHtjb21wb25lbnRDbHN9LWRvdFxuICAgICAgICBgXToge1xuICAgICAgICAgIGN1cnNvcjogYG5vdC1hbGxvd2VkICFpbXBvcnRhbnRgXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbYCYtdG9vbHRpcCAke2FudENsc30tdG9vbHRpcC1pbm5lcmBdOiB7XG4gICAgICAgIG1pbldpZHRoOiAndW5zZXQnXG4gICAgICB9XG4gICAgfSlcbiAgfTtcbn07XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IEhvcml6b250YWwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuY29uc3QgZ2VuRGlyZWN0aW9uU3R5bGUgPSAodG9rZW4sIGhvcml6b250YWwpID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENscyxcbiAgICByYWlsU2l6ZSxcbiAgICBoYW5kbGVTaXplLFxuICAgIGRvdFNpemUsXG4gICAgbWFyZ2luRnVsbCxcbiAgICBjYWxjXG4gIH0gPSB0b2tlbjtcbiAgY29uc3QgcmFpbFBhZGRpbmcgPSBob3Jpem9udGFsID8gJ3BhZGRpbmdCbG9jaycgOiAncGFkZGluZ0lubGluZSc7XG4gIGNvbnN0IGZ1bGwgPSBob3Jpem9udGFsID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuICBjb25zdCBwYXJ0ID0gaG9yaXpvbnRhbCA/ICdoZWlnaHQnIDogJ3dpZHRoJztcbiAgY29uc3QgaGFuZGxlUG9zID0gaG9yaXpvbnRhbCA/ICdpbnNldEJsb2NrU3RhcnQnIDogJ2luc2V0SW5saW5lU3RhcnQnO1xuICBjb25zdCBtYXJrSW5zZXQgPSBob3Jpem9udGFsID8gJ3RvcCcgOiAnaW5zZXRJbmxpbmVTdGFydCc7XG4gIGNvbnN0IGhhbmRsZVBvc1NpemUgPSBjYWxjKHJhaWxTaXplKS5tdWwoMykuc3ViKGhhbmRsZVNpemUpLmRpdigyKS5lcXVhbCgpO1xuICBjb25zdCBkcmFnZ2FibGVCb3JkZXJTaXplID0gY2FsYyhoYW5kbGVTaXplKS5zdWIocmFpbFNpemUpLmRpdigyKS5lcXVhbCgpO1xuICBjb25zdCBkcmFnZ2FibGVCb3JkZXIgPSBob3Jpem9udGFsID8ge1xuICAgIGJvcmRlcldpZHRoOiBgJHt1bml0KGRyYWdnYWJsZUJvcmRlclNpemUpfSAwYCxcbiAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGVZKCR7dW5pdChjYWxjKGRyYWdnYWJsZUJvcmRlclNpemUpLm11bCgtMSkuZXF1YWwoKSl9KWBcbiAgfSA6IHtcbiAgICBib3JkZXJXaWR0aDogYDAgJHt1bml0KGRyYWdnYWJsZUJvcmRlclNpemUpfWAsXG4gICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlWCgke3VuaXQodG9rZW4uY2FsYyhkcmFnZ2FibGVCb3JkZXJTaXplKS5tdWwoLTEpLmVxdWFsKCkpfSlgXG4gIH07XG4gIHJldHVybiB7XG4gICAgW3JhaWxQYWRkaW5nXTogcmFpbFNpemUsXG4gICAgW3BhcnRdOiBjYWxjKHJhaWxTaXplKS5tdWwoMykuZXF1YWwoKSxcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS1yYWlsYF06IHtcbiAgICAgIFtmdWxsXTogJzEwMCUnLFxuICAgICAgW3BhcnRdOiByYWlsU2l6ZVxuICAgIH0sXG4gICAgW2Ake2NvbXBvbmVudENsc30tdHJhY2ssJHtjb21wb25lbnRDbHN9LXRyYWNrc2BdOiB7XG4gICAgICBbcGFydF06IHJhaWxTaXplXG4gICAgfSxcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS10cmFjay1kcmFnZ2FibGVgXTogT2JqZWN0LmFzc2lnbih7fSwgZHJhZ2dhYmxlQm9yZGVyKSxcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS1oYW5kbGVgXToge1xuICAgICAgW2hhbmRsZVBvc106IGhhbmRsZVBvc1NpemVcbiAgICB9LFxuICAgIFtgJHtjb21wb25lbnRDbHN9LW1hcmtgXToge1xuICAgICAgLy8gUmVzZXQgYWxsXG4gICAgICBpbnNldElubGluZVN0YXJ0OiAwLFxuICAgICAgdG9wOiAwLFxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvNDM3MzFcbiAgICAgIFttYXJrSW5zZXRdOiBjYWxjKHJhaWxTaXplKS5tdWwoMykuYWRkKGhvcml6b250YWwgPyAwIDogbWFyZ2luRnVsbCkuZXF1YWwoKSxcbiAgICAgIFtmdWxsXTogJzEwMCUnXG4gICAgfSxcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS1zdGVwYF06IHtcbiAgICAgIC8vIFJlc2V0IGFsbFxuICAgICAgaW5zZXRJbmxpbmVTdGFydDogMCxcbiAgICAgIHRvcDogMCxcbiAgICAgIFttYXJrSW5zZXRdOiByYWlsU2l6ZSxcbiAgICAgIFtmdWxsXTogJzEwMCUnLFxuICAgICAgW3BhcnRdOiByYWlsU2l6ZVxuICAgIH0sXG4gICAgW2Ake2NvbXBvbmVudENsc30tZG90YF06IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgW2hhbmRsZVBvc106IGNhbGMocmFpbFNpemUpLnN1Yihkb3RTaXplKS5kaXYoMikuZXF1YWwoKVxuICAgIH1cbiAgfTtcbn07XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IEhvcml6b250YWwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuY29uc3QgZ2VuSG9yaXpvbnRhbFN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzLFxuICAgIG1hcmdpblBhcnRXaXRoTWFya1xuICB9ID0gdG9rZW47XG4gIHJldHVybiB7XG4gICAgW2Ake2NvbXBvbmVudENsc30taG9yaXpvbnRhbGBdOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGdlbkRpcmVjdGlvblN0eWxlKHRva2VuLCB0cnVlKSksIHtcbiAgICAgIFtgJiR7Y29tcG9uZW50Q2xzfS13aXRoLW1hcmtzYF06IHtcbiAgICAgICAgbWFyZ2luQm90dG9tOiBtYXJnaW5QYXJ0V2l0aE1hcmtcbiAgICAgIH1cbiAgICB9KVxuICB9O1xufTtcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFZlcnRpY2FsID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5jb25zdCBnZW5WZXJ0aWNhbFN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzXG4gIH0gPSB0b2tlbjtcbiAgcmV0dXJuIHtcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS12ZXJ0aWNhbGBdOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGdlbkRpcmVjdGlvblN0eWxlKHRva2VuLCBmYWxzZSkpLCB7XG4gICAgICBoZWlnaHQ6ICcxMDAlJ1xuICAgIH0pXG4gIH07XG59O1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEV4cG9ydCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmV4cG9ydCBjb25zdCBwcmVwYXJlQ29tcG9uZW50VG9rZW4gPSB0b2tlbiA9PiB7XG4gIC8vIEhhbmRsZSBsaW5lIHdpZHRoIGlzIGFsd2F5cyB3aWR0aC1lciAxcHhcbiAgY29uc3QgaW5jcmVhc2VIYW5kbGVXaWR0aCA9IDE7XG4gIGNvbnN0IGNvbnRyb2xTaXplID0gdG9rZW4uY29udHJvbEhlaWdodExHIC8gNDtcbiAgY29uc3QgY29udHJvbFNpemVIb3ZlciA9IHRva2VuLmNvbnRyb2xIZWlnaHRTTSAvIDI7XG4gIGNvbnN0IGhhbmRsZUxpbmVXaWR0aCA9IHRva2VuLmxpbmVXaWR0aCArIGluY3JlYXNlSGFuZGxlV2lkdGg7XG4gIGNvbnN0IGhhbmRsZUxpbmVXaWR0aEhvdmVyID0gdG9rZW4ubGluZVdpZHRoICsgaW5jcmVhc2VIYW5kbGVXaWR0aCAqIDEuNTtcbiAgY29uc3QgaGFuZGxlQWN0aXZlQ29sb3IgPSB0b2tlbi5jb2xvclByaW1hcnk7XG4gIGNvbnN0IGhhbmRsZUFjdGl2ZU91dGxpbmVDb2xvciA9IG5ldyBGYXN0Q29sb3IoaGFuZGxlQWN0aXZlQ29sb3IpLnNldEEoMC4yKS50b1JnYlN0cmluZygpO1xuICByZXR1cm4ge1xuICAgIGNvbnRyb2xTaXplLFxuICAgIHJhaWxTaXplOiA0LFxuICAgIGhhbmRsZVNpemU6IGNvbnRyb2xTaXplLFxuICAgIGhhbmRsZVNpemVIb3ZlcjogY29udHJvbFNpemVIb3ZlcixcbiAgICBkb3RTaXplOiA4LFxuICAgIGhhbmRsZUxpbmVXaWR0aCxcbiAgICBoYW5kbGVMaW5lV2lkdGhIb3ZlcixcbiAgICByYWlsQmc6IHRva2VuLmNvbG9yRmlsbFRlcnRpYXJ5LFxuICAgIHJhaWxIb3ZlckJnOiB0b2tlbi5jb2xvckZpbGxTZWNvbmRhcnksXG4gICAgdHJhY2tCZzogdG9rZW4uY29sb3JQcmltYXJ5Qm9yZGVyLFxuICAgIHRyYWNrSG92ZXJCZzogdG9rZW4uY29sb3JQcmltYXJ5Qm9yZGVySG92ZXIsXG4gICAgaGFuZGxlQ29sb3I6IHRva2VuLmNvbG9yUHJpbWFyeUJvcmRlcixcbiAgICBoYW5kbGVBY3RpdmVDb2xvcixcbiAgICBoYW5kbGVBY3RpdmVPdXRsaW5lQ29sb3IsXG4gICAgaGFuZGxlQ29sb3JEaXNhYmxlZDogbmV3IEZhc3RDb2xvcih0b2tlbi5jb2xvclRleHREaXNhYmxlZCkub25CYWNrZ3JvdW5kKHRva2VuLmNvbG9yQmdDb250YWluZXIpLnRvSGV4U3RyaW5nKCksXG4gICAgZG90Qm9yZGVyQ29sb3I6IHRva2VuLmNvbG9yQm9yZGVyU2Vjb25kYXJ5LFxuICAgIGRvdEFjdGl2ZUJvcmRlckNvbG9yOiB0b2tlbi5jb2xvclByaW1hcnlCb3JkZXIsXG4gICAgdHJhY2tCZ0Rpc2FibGVkOiB0b2tlbi5jb2xvckJnQ29udGFpbmVyRGlzYWJsZWRcbiAgfTtcbn07XG5leHBvcnQgZGVmYXVsdCBnZW5TdHlsZUhvb2tzKCdTbGlkZXInLCB0b2tlbiA9PiB7XG4gIGNvbnN0IHNsaWRlclRva2VuID0gbWVyZ2VUb2tlbih0b2tlbiwge1xuICAgIG1hcmdpblBhcnQ6IHRva2VuLmNhbGModG9rZW4uY29udHJvbEhlaWdodCkuc3ViKHRva2VuLmNvbnRyb2xTaXplKS5kaXYoMikuZXF1YWwoKSxcbiAgICBtYXJnaW5GdWxsOiB0b2tlbi5jYWxjKHRva2VuLmNvbnRyb2xTaXplKS5kaXYoMikuZXF1YWwoKSxcbiAgICBtYXJnaW5QYXJ0V2l0aE1hcms6IHRva2VuLmNhbGModG9rZW4uY29udHJvbEhlaWdodExHKS5zdWIodG9rZW4uY29udHJvbFNpemUpLmVxdWFsKClcbiAgfSk7XG4gIHJldHVybiBbZ2VuQmFzZVN0eWxlKHNsaWRlclRva2VuKSwgZ2VuSG9yaXpvbnRhbFN0eWxlKHNsaWRlclRva2VuKSwgZ2VuVmVydGljYWxTdHlsZShzbGlkZXJUb2tlbildO1xufSwgcHJlcGFyZUNvbXBvbmVudFRva2VuKTsiLCAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHJhZiBmcm9tIFwicmMtdXRpbC9lcy9yYWZcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVJhZkxvY2soKSB7XG4gIGNvbnN0IFtzdGF0ZSwgc2V0U3RhdGVdID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCByYWZSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgcmFmLmNhbmNlbChyYWZSZWYuY3VycmVudCk7XG4gIH07XG4gIGNvbnN0IHNldERlbGF5U3RhdGUgPSBuZXh0U3RhdGUgPT4ge1xuICAgIGNsZWFudXAoKTtcbiAgICBpZiAobmV4dFN0YXRlKSB7XG4gICAgICBzZXRTdGF0ZShuZXh0U3RhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByYWZSZWYuY3VycmVudCA9IHJhZigoKSA9PiB7XG4gICAgICAgIHNldFN0YXRlKG5leHRTdGF0ZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiBjbGVhbnVwLCBbXSk7XG4gIHJldHVybiBbc3RhdGUsIHNldERlbGF5U3RhdGVdO1xufSIsICJleHBvcnQgZnVuY3Rpb24gaXNQcmVzZXRTaXplKHNpemUpIHtcbiAgcmV0dXJuIFsnc21hbGwnLCAnbWlkZGxlJywgJ2xhcmdlJ10uaW5jbHVkZXMoc2l6ZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEdhcE51bWJlcihzaXplKSB7XG4gIGlmICghc2l6ZSkge1xuICAgIC8vIFRoZSBjYXNlIG9mIHNpemUgPSAwIGlzIGRlbGliZXJhdGVseSBleGNsdWRlZCBoZXJlLCBiZWNhdXNlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBnYXAgYXR0cmlidXRlIGluIENTUyBpcyAwLCBzbyBpZiB0aGUgdXNlciBwYXNzZXMgMCBpbiwgd2UgY2FuIGRpcmVjdGx5IGlnbm9yZSBpdC5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHR5cGVvZiBzaXplID09PSAnbnVtYmVyJyAmJiAhTnVtYmVyLmlzTmFOKHNpemUpO1xufSIsICJcInVzZSBjbGllbnRcIjtcblxudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBvbWl0IGZyb20gXCJyYy11dGlsL2VzL29taXRcIjtcbmltcG9ydCB7IGlzUHJlc2V0U2l6ZSB9IGZyb20gJy4uL191dGlsL2dhcFNpemUnO1xuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgdXNlU3R5bGUgZnJvbSAnLi9zdHlsZSc7XG5pbXBvcnQgY3JlYXRlRmxleENsYXNzTmFtZXMgZnJvbSAnLi91dGlscyc7XG5jb25zdCBGbGV4ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHByb3BzLCByZWYpID0+IHtcbiAgY29uc3Qge1xuICAgICAgcHJlZml4Q2xzOiBjdXN0b21pemVQcmVmaXhDbHMsXG4gICAgICByb290Q2xhc3NOYW1lLFxuICAgICAgY2xhc3NOYW1lLFxuICAgICAgc3R5bGUsXG4gICAgICBmbGV4LFxuICAgICAgZ2FwLFxuICAgICAgY2hpbGRyZW4sXG4gICAgICB2ZXJ0aWNhbCA9IGZhbHNlLFxuICAgICAgY29tcG9uZW50OiBDb21wb25lbnQgPSAnZGl2J1xuICAgIH0gPSBwcm9wcyxcbiAgICBvdGhlcnNQcm9wcyA9IF9fcmVzdChwcm9wcywgW1wicHJlZml4Q2xzXCIsIFwicm9vdENsYXNzTmFtZVwiLCBcImNsYXNzTmFtZVwiLCBcInN0eWxlXCIsIFwiZmxleFwiLCBcImdhcFwiLCBcImNoaWxkcmVuXCIsIFwidmVydGljYWxcIiwgXCJjb21wb25lbnRcIl0pO1xuICBjb25zdCB7XG4gICAgZmxleDogY3R4RmxleCxcbiAgICBkaXJlY3Rpb246IGN0eERpcmVjdGlvbixcbiAgICBnZXRQcmVmaXhDbHNcbiAgfSA9IFJlYWN0LnVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCk7XG4gIGNvbnN0IHByZWZpeENscyA9IGdldFByZWZpeENscygnZmxleCcsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIGNvbnN0IFt3cmFwQ1NTVmFyLCBoYXNoSWQsIGNzc1ZhckNsc10gPSB1c2VTdHlsZShwcmVmaXhDbHMpO1xuICBjb25zdCBtZXJnZWRWZXJ0aWNhbCA9IHZlcnRpY2FsICE9PSBudWxsICYmIHZlcnRpY2FsICE9PSB2b2lkIDAgPyB2ZXJ0aWNhbCA6IGN0eEZsZXggPT09IG51bGwgfHwgY3R4RmxleCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY3R4RmxleC52ZXJ0aWNhbDtcbiAgY29uc3QgbWVyZ2VkQ2xzID0gY2xhc3NOYW1lcyhjbGFzc05hbWUsIHJvb3RDbGFzc05hbWUsIGN0eEZsZXggPT09IG51bGwgfHwgY3R4RmxleCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY3R4RmxleC5jbGFzc05hbWUsIHByZWZpeENscywgaGFzaElkLCBjc3NWYXJDbHMsIGNyZWF0ZUZsZXhDbGFzc05hbWVzKHByZWZpeENscywgcHJvcHMpLCB7XG4gICAgW2Ake3ByZWZpeENsc30tcnRsYF06IGN0eERpcmVjdGlvbiA9PT0gJ3J0bCcsXG4gICAgW2Ake3ByZWZpeENsc30tZ2FwLSR7Z2FwfWBdOiBpc1ByZXNldFNpemUoZ2FwKSxcbiAgICBbYCR7cHJlZml4Q2xzfS12ZXJ0aWNhbGBdOiBtZXJnZWRWZXJ0aWNhbFxuICB9KTtcbiAgY29uc3QgbWVyZ2VkU3R5bGUgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGN0eEZsZXggPT09IG51bGwgfHwgY3R4RmxleCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY3R4RmxleC5zdHlsZSksIHN0eWxlKTtcbiAgaWYgKGZsZXgpIHtcbiAgICBtZXJnZWRTdHlsZS5mbGV4ID0gZmxleDtcbiAgfVxuICBpZiAoZ2FwICYmICFpc1ByZXNldFNpemUoZ2FwKSkge1xuICAgIG1lcmdlZFN0eWxlLmdhcCA9IGdhcDtcbiAgfVxuICByZXR1cm4gd3JhcENTU1ZhcigvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb25lbnQsIE9iamVjdC5hc3NpZ24oe1xuICAgIHJlZjogcmVmLFxuICAgIGNsYXNzTmFtZTogbWVyZ2VkQ2xzLFxuICAgIHN0eWxlOiBtZXJnZWRTdHlsZVxuICB9LCBvbWl0KG90aGVyc1Byb3BzLCBbJ2p1c3RpZnknLCAnd3JhcCcsICdhbGlnbiddKSksIGNoaWxkcmVuKSk7XG59KTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIEZsZXguZGlzcGxheU5hbWUgPSAnRmxleCc7XG59XG5leHBvcnQgZGVmYXVsdCBGbGV4OyIsICJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmV4cG9ydCBjb25zdCBmbGV4V3JhcFZhbHVlcyA9IFsnd3JhcCcsICdub3dyYXAnLCAnd3JhcC1yZXZlcnNlJ107XG5leHBvcnQgY29uc3QganVzdGlmeUNvbnRlbnRWYWx1ZXMgPSBbJ2ZsZXgtc3RhcnQnLCAnZmxleC1lbmQnLCAnc3RhcnQnLCAnZW5kJywgJ2NlbnRlcicsICdzcGFjZS1iZXR3ZWVuJywgJ3NwYWNlLWFyb3VuZCcsICdzcGFjZS1ldmVubHknLCAnc3RyZXRjaCcsICdub3JtYWwnLCAnbGVmdCcsICdyaWdodCddO1xuZXhwb3J0IGNvbnN0IGFsaWduSXRlbXNWYWx1ZXMgPSBbJ2NlbnRlcicsICdzdGFydCcsICdlbmQnLCAnZmxleC1zdGFydCcsICdmbGV4LWVuZCcsICdzZWxmLXN0YXJ0JywgJ3NlbGYtZW5kJywgJ2Jhc2VsaW5lJywgJ25vcm1hbCcsICdzdHJldGNoJ107XG5jb25zdCBnZW5DbHNXcmFwID0gKHByZWZpeENscywgcHJvcHMpID0+IHtcbiAgY29uc3Qgd3JhcCA9IHByb3BzLndyYXAgPT09IHRydWUgPyAnd3JhcCcgOiBwcm9wcy53cmFwO1xuICByZXR1cm4ge1xuICAgIFtgJHtwcmVmaXhDbHN9LXdyYXAtJHt3cmFwfWBdOiB3cmFwICYmIGZsZXhXcmFwVmFsdWVzLmluY2x1ZGVzKHdyYXApXG4gIH07XG59O1xuY29uc3QgZ2VuQ2xzQWxpZ24gPSAocHJlZml4Q2xzLCBwcm9wcykgPT4ge1xuICBjb25zdCBhbGlnbkNscyA9IHt9O1xuICBhbGlnbkl0ZW1zVmFsdWVzLmZvckVhY2goY3NzS2V5ID0+IHtcbiAgICBhbGlnbkNsc1tgJHtwcmVmaXhDbHN9LWFsaWduLSR7Y3NzS2V5fWBdID0gcHJvcHMuYWxpZ24gPT09IGNzc0tleTtcbiAgfSk7XG4gIGFsaWduQ2xzW2Ake3ByZWZpeENsc30tYWxpZ24tc3RyZXRjaGBdID0gIXByb3BzLmFsaWduICYmICEhcHJvcHMudmVydGljYWw7XG4gIHJldHVybiBhbGlnbkNscztcbn07XG5jb25zdCBnZW5DbHNKdXN0aWZ5ID0gKHByZWZpeENscywgcHJvcHMpID0+IHtcbiAgY29uc3QganVzdGlmeUNscyA9IHt9O1xuICBqdXN0aWZ5Q29udGVudFZhbHVlcy5mb3JFYWNoKGNzc0tleSA9PiB7XG4gICAganVzdGlmeUNsc1tgJHtwcmVmaXhDbHN9LWp1c3RpZnktJHtjc3NLZXl9YF0gPSBwcm9wcy5qdXN0aWZ5ID09PSBjc3NLZXk7XG4gIH0pO1xuICByZXR1cm4ganVzdGlmeUNscztcbn07XG5mdW5jdGlvbiBjcmVhdGVGbGV4Q2xhc3NOYW1lcyhwcmVmaXhDbHMsIHByb3BzKSB7XG4gIHJldHVybiBjbGFzc05hbWVzKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBnZW5DbHNXcmFwKHByZWZpeENscywgcHJvcHMpKSwgZ2VuQ2xzQWxpZ24ocHJlZml4Q2xzLCBwcm9wcykpLCBnZW5DbHNKdXN0aWZ5KHByZWZpeENscywgcHJvcHMpKSk7XG59XG5leHBvcnQgZGVmYXVsdCBjcmVhdGVGbGV4Q2xhc3NOYW1lczsiLCAiaW1wb3J0IHsgZ2VuU3R5bGVIb29rcywgbWVyZ2VUb2tlbiB9IGZyb20gJy4uLy4uL3RoZW1lL2ludGVybmFsJztcbmltcG9ydCB7IGFsaWduSXRlbXNWYWx1ZXMsIGZsZXhXcmFwVmFsdWVzLCBqdXN0aWZ5Q29udGVudFZhbHVlcyB9IGZyb20gJy4uL3V0aWxzJztcbmNvbnN0IGdlbkZsZXhTdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENsc1xuICB9ID0gdG9rZW47XG4gIHJldHVybiB7XG4gICAgW2NvbXBvbmVudENsc106IHtcbiAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgIG1hcmdpbjogMCxcbiAgICAgIHBhZGRpbmc6IDAsXG4gICAgICAnJi12ZXJ0aWNhbCc6IHtcbiAgICAgICAgZmxleERpcmVjdGlvbjogJ2NvbHVtbidcbiAgICAgIH0sXG4gICAgICAnJi1ydGwnOiB7XG4gICAgICAgIGRpcmVjdGlvbjogJ3J0bCdcbiAgICAgIH0sXG4gICAgICAnJjplbXB0eSc6IHtcbiAgICAgICAgZGlzcGxheTogJ25vbmUnXG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbmNvbnN0IGdlbkZsZXhHYXBTdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENsc1xuICB9ID0gdG9rZW47XG4gIHJldHVybiB7XG4gICAgW2NvbXBvbmVudENsc106IHtcbiAgICAgICcmLWdhcC1zbWFsbCc6IHtcbiAgICAgICAgZ2FwOiB0b2tlbi5mbGV4R2FwU01cbiAgICAgIH0sXG4gICAgICAnJi1nYXAtbWlkZGxlJzoge1xuICAgICAgICBnYXA6IHRva2VuLmZsZXhHYXBcbiAgICAgIH0sXG4gICAgICAnJi1nYXAtbGFyZ2UnOiB7XG4gICAgICAgIGdhcDogdG9rZW4uZmxleEdhcExHXG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbmNvbnN0IGdlbkZsZXhXcmFwU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHNcbiAgfSA9IHRva2VuO1xuICBjb25zdCB3cmFwU3R5bGUgPSB7fTtcbiAgZmxleFdyYXBWYWx1ZXMuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgd3JhcFN0eWxlW2Ake2NvbXBvbmVudENsc30td3JhcC0ke3ZhbHVlfWBdID0ge1xuICAgICAgZmxleFdyYXA6IHZhbHVlXG4gICAgfTtcbiAgfSk7XG4gIHJldHVybiB3cmFwU3R5bGU7XG59O1xuY29uc3QgZ2VuQWxpZ25JdGVtc1N0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzXG4gIH0gPSB0b2tlbjtcbiAgY29uc3QgYWxpZ25TdHlsZSA9IHt9O1xuICBhbGlnbkl0ZW1zVmFsdWVzLmZvckVhY2godmFsdWUgPT4ge1xuICAgIGFsaWduU3R5bGVbYCR7Y29tcG9uZW50Q2xzfS1hbGlnbi0ke3ZhbHVlfWBdID0ge1xuICAgICAgYWxpZ25JdGVtczogdmFsdWVcbiAgICB9O1xuICB9KTtcbiAgcmV0dXJuIGFsaWduU3R5bGU7XG59O1xuY29uc3QgZ2VuSnVzdGlmeUNvbnRlbnRTdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENsc1xuICB9ID0gdG9rZW47XG4gIGNvbnN0IGp1c3RpZnlTdHlsZSA9IHt9O1xuICBqdXN0aWZ5Q29udGVudFZhbHVlcy5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICBqdXN0aWZ5U3R5bGVbYCR7Y29tcG9uZW50Q2xzfS1qdXN0aWZ5LSR7dmFsdWV9YF0gPSB7XG4gICAgICBqdXN0aWZ5Q29udGVudDogdmFsdWVcbiAgICB9O1xuICB9KTtcbiAgcmV0dXJuIGp1c3RpZnlTdHlsZTtcbn07XG5leHBvcnQgY29uc3QgcHJlcGFyZUNvbXBvbmVudFRva2VuID0gKCkgPT4gKHt9KTtcbmV4cG9ydCBkZWZhdWx0IGdlblN0eWxlSG9va3MoJ0ZsZXgnLCB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBwYWRkaW5nWFMsXG4gICAgcGFkZGluZyxcbiAgICBwYWRkaW5nTEdcbiAgfSA9IHRva2VuO1xuICBjb25zdCBmbGV4VG9rZW4gPSBtZXJnZVRva2VuKHRva2VuLCB7XG4gICAgZmxleEdhcFNNOiBwYWRkaW5nWFMsXG4gICAgZmxleEdhcDogcGFkZGluZyxcbiAgICBmbGV4R2FwTEc6IHBhZGRpbmdMR1xuICB9KTtcbiAgcmV0dXJuIFtnZW5GbGV4U3R5bGUoZmxleFRva2VuKSwgZ2VuRmxleEdhcFN0eWxlKGZsZXhUb2tlbiksIGdlbkZsZXhXcmFwU3R5bGUoZmxleFRva2VuKSwgZ2VuQWxpZ25JdGVtc1N0eWxlKGZsZXhUb2tlbiksIGdlbkp1c3RpZnlDb250ZW50U3R5bGUoZmxleFRva2VuKV07XG59LCBwcmVwYXJlQ29tcG9uZW50VG9rZW4sIHtcbiAgLy8gRmxleCBjb21wb25lbnQgZG9uJ3QgYXBwbHkgZXh0cmEgZm9udCBzdHlsZVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy80NjQwM1xuICByZXNldFN0eWxlOiBmYWxzZVxufSk7IiwgIlwidXNlIGNsaWVudFwiO1xuXG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEV5ZU91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9FeWVPdXRsaW5lZFwiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUmNJbWFnZSBmcm9tICdyYy1pbWFnZSc7XG5pbXBvcnQgeyB1c2VaSW5kZXggfSBmcm9tICcuLi9fdXRpbC9ob29rcy91c2VaSW5kZXgnO1xuaW1wb3J0IHsgZ2V0VHJhbnNpdGlvbk5hbWUgfSBmcm9tICcuLi9fdXRpbC9tb3Rpb24nO1xuaW1wb3J0IHsgZGV2VXNlV2FybmluZyB9IGZyb20gJy4uL191dGlsL3dhcm5pbmcnO1xuaW1wb3J0IHsgdXNlQ29tcG9uZW50Q29uZmlnIH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL2NvbnRleHQnO1xuaW1wb3J0IHVzZUNTU1ZhckNscyBmcm9tICcuLi9jb25maWctcHJvdmlkZXIvaG9va3MvdXNlQ1NTVmFyQ2xzJztcbmltcG9ydCB7IHVzZUxvY2FsZSB9IGZyb20gJy4uL2xvY2FsZSc7XG5pbXBvcnQgUHJldmlld0dyb3VwLCB7IGljb25zIH0gZnJvbSAnLi9QcmV2aWV3R3JvdXAnO1xuaW1wb3J0IHVzZVN0eWxlIGZyb20gJy4vc3R5bGUnO1xuY29uc3QgSW1hZ2UgPSBwcm9wcyA9PiB7XG4gIGNvbnN0IHtcbiAgICAgIHByZWZpeENsczogY3VzdG9taXplUHJlZml4Q2xzLFxuICAgICAgcHJldmlldyxcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIHJvb3RDbGFzc05hbWUsXG4gICAgICBzdHlsZVxuICAgIH0gPSBwcm9wcyxcbiAgICBvdGhlclByb3BzID0gX19yZXN0KHByb3BzLCBbXCJwcmVmaXhDbHNcIiwgXCJwcmV2aWV3XCIsIFwiY2xhc3NOYW1lXCIsIFwicm9vdENsYXNzTmFtZVwiLCBcInN0eWxlXCJdKTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBjb25zdCB3YXJuaW5nID0gZGV2VXNlV2FybmluZygnSW1hZ2UnKTtcbiAgICB3YXJuaW5nLmRlcHJlY2F0ZWQoIShwcmV2aWV3ICYmIHR5cGVvZiBwcmV2aWV3ID09PSAnb2JqZWN0JyAmJiAnZGVzdHJveU9uQ2xvc2UnIGluIHByZXZpZXcpLCAnZGVzdHJveU9uQ2xvc2UnLCAnZGVzdHJveU9uSGlkZGVuJyk7XG4gIH1cbiAgY29uc3Qge1xuICAgIGdldFByZWZpeENscyxcbiAgICBnZXRQb3B1cENvbnRhaW5lcjogZ2V0Q29udGV4dFBvcHVwQ29udGFpbmVyLFxuICAgIGNsYXNzTmFtZTogY29udGV4dENsYXNzTmFtZSxcbiAgICBzdHlsZTogY29udGV4dFN0eWxlLFxuICAgIHByZXZpZXc6IGNvbnRleHRQcmV2aWV3XG4gIH0gPSB1c2VDb21wb25lbnRDb25maWcoJ2ltYWdlJyk7XG4gIGNvbnN0IFtpbWFnZUxvY2FsZV0gPSB1c2VMb2NhbGUoJ0ltYWdlJyk7XG4gIGNvbnN0IHByZWZpeENscyA9IGdldFByZWZpeENscygnaW1hZ2UnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICBjb25zdCByb290UHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCk7XG4gIC8vIFN0eWxlXG4gIGNvbnN0IHJvb3RDbHMgPSB1c2VDU1NWYXJDbHMocHJlZml4Q2xzKTtcbiAgY29uc3QgW3dyYXBDU1NWYXIsIGhhc2hJZCwgY3NzVmFyQ2xzXSA9IHVzZVN0eWxlKHByZWZpeENscywgcm9vdENscyk7XG4gIGNvbnN0IG1lcmdlZFJvb3RDbGFzc05hbWUgPSBjbGFzc05hbWVzKHJvb3RDbGFzc05hbWUsIGhhc2hJZCwgY3NzVmFyQ2xzLCByb290Q2xzKTtcbiAgY29uc3QgbWVyZ2VkQ2xhc3NOYW1lID0gY2xhc3NOYW1lcyhjbGFzc05hbWUsIGhhc2hJZCwgY29udGV4dENsYXNzTmFtZSk7XG4gIGNvbnN0IFt6SW5kZXhdID0gdXNlWkluZGV4KCdJbWFnZVByZXZpZXcnLCB0eXBlb2YgcHJldmlldyA9PT0gJ29iamVjdCcgPyBwcmV2aWV3LnpJbmRleCA6IHVuZGVmaW5lZCk7XG4gIGNvbnN0IG1lcmdlZFByZXZpZXcgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBpZiAocHJldmlldyA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBwcmV2aWV3O1xuICAgIH1cbiAgICBjb25zdCBfcHJldmlldyA9IHR5cGVvZiBwcmV2aWV3ID09PSAnb2JqZWN0JyA/IHByZXZpZXcgOiB7fTtcbiAgICBjb25zdCB7XG4gICAgICAgIGdldENvbnRhaW5lcixcbiAgICAgICAgY2xvc2VJY29uLFxuICAgICAgICByb290Q2xhc3NOYW1lLFxuICAgICAgICBkZXN0cm95T25DbG9zZSxcbiAgICAgICAgZGVzdHJveU9uSGlkZGVuXG4gICAgICB9ID0gX3ByZXZpZXcsXG4gICAgICByZXN0UHJldmlld1Byb3BzID0gX19yZXN0KF9wcmV2aWV3LCBbXCJnZXRDb250YWluZXJcIiwgXCJjbG9zZUljb25cIiwgXCJyb290Q2xhc3NOYW1lXCIsIFwiZGVzdHJveU9uQ2xvc2VcIiwgXCJkZXN0cm95T25IaWRkZW5cIl0pO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe1xuICAgICAgbWFzazogKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBgJHtwcmVmaXhDbHN9LW1hc2staW5mb2BcbiAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEV5ZU91dGxpbmVkLCBudWxsKSwgaW1hZ2VMb2NhbGUgPT09IG51bGwgfHwgaW1hZ2VMb2NhbGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGltYWdlTG9jYWxlLnByZXZpZXcpKSxcbiAgICAgIGljb25zXG4gICAgfSwgcmVzdFByZXZpZXdQcm9wcyksIHtcbiAgICAgIC8vIFRPRE86IEluIHRoZSBmdXR1cmUsIGRlc3Ryb3lPbkNsb3NlIGluIHJjLWltYWdlIG5lZWRzIHRvIGJlIHVwZ3JhZGUgdG8gZGVzdHJveU9uSGlkZGVuXG4gICAgICBkZXN0cm95T25DbG9zZTogZGVzdHJveU9uSGlkZGVuICE9PSBudWxsICYmIGRlc3Ryb3lPbkhpZGRlbiAhPT0gdm9pZCAwID8gZGVzdHJveU9uSGlkZGVuIDogZGVzdHJveU9uQ2xvc2UsXG4gICAgICByb290Q2xhc3NOYW1lOiBjbGFzc05hbWVzKG1lcmdlZFJvb3RDbGFzc05hbWUsIHJvb3RDbGFzc05hbWUpLFxuICAgICAgZ2V0Q29udGFpbmVyOiBnZXRDb250YWluZXIgIT09IG51bGwgJiYgZ2V0Q29udGFpbmVyICE9PSB2b2lkIDAgPyBnZXRDb250YWluZXIgOiBnZXRDb250ZXh0UG9wdXBDb250YWluZXIsXG4gICAgICB0cmFuc2l0aW9uTmFtZTogZ2V0VHJhbnNpdGlvbk5hbWUocm9vdFByZWZpeENscywgJ3pvb20nLCBfcHJldmlldy50cmFuc2l0aW9uTmFtZSksXG4gICAgICBtYXNrVHJhbnNpdGlvbk5hbWU6IGdldFRyYW5zaXRpb25OYW1lKHJvb3RQcmVmaXhDbHMsICdmYWRlJywgX3ByZXZpZXcubWFza1RyYW5zaXRpb25OYW1lKSxcbiAgICAgIHpJbmRleCxcbiAgICAgIGNsb3NlSWNvbjogY2xvc2VJY29uICE9PSBudWxsICYmIGNsb3NlSWNvbiAhPT0gdm9pZCAwID8gY2xvc2VJY29uIDogY29udGV4dFByZXZpZXcgPT09IG51bGwgfHwgY29udGV4dFByZXZpZXcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbnRleHRQcmV2aWV3LmNsb3NlSWNvblxuICAgIH0pO1xuICB9LCBbcHJldmlldywgaW1hZ2VMb2NhbGUsIGNvbnRleHRQcmV2aWV3ID09PSBudWxsIHx8IGNvbnRleHRQcmV2aWV3ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb250ZXh0UHJldmlldy5jbG9zZUljb25dKTtcbiAgY29uc3QgbWVyZ2VkU3R5bGUgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGNvbnRleHRTdHlsZSksIHN0eWxlKTtcbiAgcmV0dXJuIHdyYXBDU1NWYXIoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmNJbWFnZSwgT2JqZWN0LmFzc2lnbih7XG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgcHJldmlldzogbWVyZ2VkUHJldmlldyxcbiAgICByb290Q2xhc3NOYW1lOiBtZXJnZWRSb290Q2xhc3NOYW1lLFxuICAgIGNsYXNzTmFtZTogbWVyZ2VkQ2xhc3NOYW1lLFxuICAgIHN0eWxlOiBtZXJnZWRTdHlsZVxuICB9LCBvdGhlclByb3BzKSkpO1xufTtcbkltYWdlLlByZXZpZXdHcm91cCA9IFByZXZpZXdHcm91cDtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIEltYWdlLmRpc3BsYXlOYW1lID0gJ0ltYWdlJztcbn1cbmV4cG9ydCBkZWZhdWx0IEltYWdlOyIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBFeWVPdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9FeWVPdXRsaW5lZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gXCIuLi9jb21wb25lbnRzL0FudGRJY29uXCI7XG52YXIgRXllT3V0bGluZWQgPSBmdW5jdGlvbiBFeWVPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbnRkSWNvbiwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogRXllT3V0bGluZWRTdmdcbiAgfSkpO1xufTtcblxuLyoqIVtleWVdKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjNhV1IwYUQwaU5UQWlJR2hsYVdkb2REMGlOVEFpSUdacGJHdzlJaU5qWVdOaFkyRWlJSFpwWlhkQ2IzZzlJalkwSURZMElEZzVOaUE0T1RZaUlHWnZZM1Z6WVdKc1pUMGlabUZzYzJVaUlIaHRiRzV6UFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eU1EQXdMM04yWnlJK1BIQmhkR2dnWkQwaVRUazBNaTR5SURRNE5pNHlRemcwTnk0MElESTROaTQxSURjd05DNHhJREU0TmlBMU1USWdNVGcyWXkweE9USXVNaUF3TFRNek5TNDBJREV3TUM0MUxUUXpNQzR5SURNd01DNHpZVFl3TGpNZ05qQXVNeUF3SURBd01DQTFNUzQxUXpFM05pNDJJRGN6Tnk0MUlETXhPUzQ1SURnek9DQTFNVElnT0RNNFl6RTVNaTR5SURBZ016TTFMalF0TVRBd0xqVWdORE13TGpJdE16QXdMak1nTnk0M0xURTJMaklnTnk0M0xUTTFJREF0TlRFdU5YcE5OVEV5SURjMk5tTXRNVFl4TGpNZ01DMHlOemt1TkMwNE1TNDRMVE0yTWk0M0xUSTFORU15TXpJdU5pQXpNemt1T0NBek5UQXVOeUF5TlRnZ05URXlJREkxT0dNeE5qRXVNeUF3SURJM09TNDBJRGd4TGpnZ016WXlMamNnTWpVMFF6YzVNUzQxSURZNE5DNHlJRFkzTXk0MElEYzJOaUExTVRJZ056WTJlbTB0TkMwME16QmpMVGszTGpJZ01DMHhOellnTnpndU9DMHhOellnTVRjMmN6YzRMamdnTVRjMklERTNOaUF4TnpZZ01UYzJMVGM0TGpnZ01UYzJMVEUzTmkwM09DNDRMVEUzTmkweE56WXRNVGMyZW0wd0lESTRPR010TmpFdU9TQXdMVEV4TWkwMU1DNHhMVEV4TWkweE1USnpOVEF1TVMweE1USWdNVEV5TFRFeE1pQXhNVElnTlRBdU1TQXhNVElnTVRFeUxUVXdMakVnTVRFeUxURXhNaUF4TVRKNklpQXZQand2YzNablBnPT0pICovXG52YXIgUmVmSWNvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKEV5ZU91dGxpbmVkKTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFJlZkljb24uZGlzcGxheU5hbWUgPSAnRXllT3V0bGluZWQnO1xufVxuZXhwb3J0IGRlZmF1bHQgUmVmSWNvbjsiLCAiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgRXllT3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTk0Mi4yIDQ4Ni4yQzg0Ny40IDI4Ni41IDcwNC4xIDE4NiA1MTIgMTg2Yy0xOTIuMiAwLTMzNS40IDEwMC41LTQzMC4yIDMwMC4zYTYwLjMgNjAuMyAwIDAwMCA1MS41QzE3Ni42IDczNy41IDMxOS45IDgzOCA1MTIgODM4YzE5Mi4yIDAgMzM1LjQtMTAwLjUgNDMwLjItMzAwLjMgNy43LTE2LjIgNy43LTM1IDAtNTEuNXpNNTEyIDc2NmMtMTYxLjMgMC0yNzkuNC04MS44LTM2Mi43LTI1NEMyMzIuNiAzMzkuOCAzNTAuNyAyNTggNTEyIDI1OGMxNjEuMyAwIDI3OS40IDgxLjggMzYyLjcgMjU0Qzc5MS41IDY4NC4yIDY3My40IDc2NiA1MTIgNzY2em0tNC00MzBjLTk3LjIgMC0xNzYgNzguOC0xNzYgMTc2czc4LjggMTc2IDE3NiAxNzYgMTc2LTc4LjggMTc2LTE3Ni03OC44LTE3Ni0xNzYtMTc2em0wIDI4OGMtNjEuOSAwLTExMi01MC4xLTExMi0xMTJzNTAuMS0xMTIgMTEyLTExMiAxMTIgNTAuMSAxMTIgMTEyLTUwLjEgMTEyLTExMiAxMTJ6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJleWVcIiwgXCJ0aGVtZVwiOiBcIm91dGxpbmVkXCIgfTtcbmV4cG9ydCBkZWZhdWx0IEV5ZU91dGxpbmVkO1xuIiwgImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wic3JjXCIsIFwiYWx0XCIsIFwib25QcmV2aWV3Q2xvc2VcIiwgXCJwcmVmaXhDbHNcIiwgXCJwcmV2aWV3UHJlZml4Q2xzXCIsIFwicGxhY2Vob2xkZXJcIiwgXCJmYWxsYmFja1wiLCBcIndpZHRoXCIsIFwiaGVpZ2h0XCIsIFwic3R5bGVcIiwgXCJwcmV2aWV3XCIsIFwiY2xhc3NOYW1lXCIsIFwib25DbGlja1wiLCBcIm9uRXJyb3JcIiwgXCJ3cmFwcGVyQ2xhc3NOYW1lXCIsIFwid3JhcHBlclN0eWxlXCIsIFwicm9vdENsYXNzTmFtZVwiXSxcbiAgX2V4Y2x1ZGVkMiA9IFtcInNyY1wiLCBcInZpc2libGVcIiwgXCJvblZpc2libGVDaGFuZ2VcIiwgXCJnZXRDb250YWluZXJcIiwgXCJtYXNrXCIsIFwibWFza0NsYXNzTmFtZVwiLCBcIm1vdmFibGVcIiwgXCJpY29uc1wiLCBcInNjYWxlU3RlcFwiLCBcIm1pblNjYWxlXCIsIFwibWF4U2NhbGVcIiwgXCJpbWFnZVJlbmRlclwiLCBcInRvb2xiYXJSZW5kZXJcIl07XG5pbXBvcnQgY24gZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyBnZXRPZmZzZXQgfSBmcm9tIFwicmMtdXRpbC9lcy9Eb20vY3NzXCI7XG5pbXBvcnQgdXNlTWVyZ2VkU3RhdGUgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlTWVyZ2VkU3RhdGVcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRleHQsIHVzZU1lbW8sIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByZXZpZXcgZnJvbSBcIi4vUHJldmlld1wiO1xuaW1wb3J0IFByZXZpZXdHcm91cCBmcm9tIFwiLi9QcmV2aWV3R3JvdXBcIjtcbmltcG9ydCB7IENPTU1PTl9QUk9QUyB9IGZyb20gXCIuL2NvbW1vblwiO1xuaW1wb3J0IHsgUHJldmlld0dyb3VwQ29udGV4dCB9IGZyb20gXCIuL2NvbnRleHRcIjtcbmltcG9ydCB1c2VSZWdpc3RlckltYWdlIGZyb20gXCIuL2hvb2tzL3VzZVJlZ2lzdGVySW1hZ2VcIjtcbmltcG9ydCB1c2VTdGF0dXMgZnJvbSBcIi4vaG9va3MvdXNlU3RhdHVzXCI7XG52YXIgSW1hZ2VJbnRlcm5hbCA9IGZ1bmN0aW9uIEltYWdlSW50ZXJuYWwocHJvcHMpIHtcbiAgdmFyIGltZ1NyYyA9IHByb3BzLnNyYyxcbiAgICBhbHQgPSBwcm9wcy5hbHQsXG4gICAgb25Jbml0aWFsUHJldmlld0Nsb3NlID0gcHJvcHMub25QcmV2aWV3Q2xvc2UsXG4gICAgX3Byb3BzJHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBwcmVmaXhDbHMgPSBfcHJvcHMkcHJlZml4Q2xzID09PSB2b2lkIDAgPyAncmMtaW1hZ2UnIDogX3Byb3BzJHByZWZpeENscyxcbiAgICBfcHJvcHMkcHJldmlld1ByZWZpeEMgPSBwcm9wcy5wcmV2aWV3UHJlZml4Q2xzLFxuICAgIHByZXZpZXdQcmVmaXhDbHMgPSBfcHJvcHMkcHJldmlld1ByZWZpeEMgPT09IHZvaWQgMCA/IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcHJldmlld1wiKSA6IF9wcm9wcyRwcmV2aWV3UHJlZml4QyxcbiAgICBwbGFjZWhvbGRlciA9IHByb3BzLnBsYWNlaG9sZGVyLFxuICAgIGZhbGxiYWNrID0gcHJvcHMuZmFsbGJhY2ssXG4gICAgd2lkdGggPSBwcm9wcy53aWR0aCxcbiAgICBoZWlnaHQgPSBwcm9wcy5oZWlnaHQsXG4gICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICBfcHJvcHMkcHJldmlldyA9IHByb3BzLnByZXZpZXcsXG4gICAgcHJldmlldyA9IF9wcm9wcyRwcmV2aWV3ID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJHByZXZpZXcsXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIG9uQ2xpY2sgPSBwcm9wcy5vbkNsaWNrLFxuICAgIG9uRXJyb3IgPSBwcm9wcy5vbkVycm9yLFxuICAgIHdyYXBwZXJDbGFzc05hbWUgPSBwcm9wcy53cmFwcGVyQ2xhc3NOYW1lLFxuICAgIHdyYXBwZXJTdHlsZSA9IHByb3BzLndyYXBwZXJTdHlsZSxcbiAgICByb290Q2xhc3NOYW1lID0gcHJvcHMucm9vdENsYXNzTmFtZSxcbiAgICBvdGhlclByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBfZXhjbHVkZWQpO1xuICB2YXIgaXNDdXN0b21QbGFjZWhvbGRlciA9IHBsYWNlaG9sZGVyICYmIHBsYWNlaG9sZGVyICE9PSB0cnVlO1xuICB2YXIgX3JlZiA9IF90eXBlb2YocHJldmlldykgPT09ICdvYmplY3QnID8gcHJldmlldyA6IHt9LFxuICAgIHByZXZpZXdTcmMgPSBfcmVmLnNyYyxcbiAgICBfcmVmJHZpc2libGUgPSBfcmVmLnZpc2libGUsXG4gICAgcHJldmlld1Zpc2libGUgPSBfcmVmJHZpc2libGUgPT09IHZvaWQgMCA/IHVuZGVmaW5lZCA6IF9yZWYkdmlzaWJsZSxcbiAgICBfcmVmJG9uVmlzaWJsZUNoYW5nZSA9IF9yZWYub25WaXNpYmxlQ2hhbmdlLFxuICAgIG9uUHJldmlld1Zpc2libGVDaGFuZ2UgPSBfcmVmJG9uVmlzaWJsZUNoYW5nZSA9PT0gdm9pZCAwID8gb25Jbml0aWFsUHJldmlld0Nsb3NlIDogX3JlZiRvblZpc2libGVDaGFuZ2UsXG4gICAgX3JlZiRnZXRDb250YWluZXIgPSBfcmVmLmdldENvbnRhaW5lcixcbiAgICBnZXRQcmV2aWV3Q29udGFpbmVyID0gX3JlZiRnZXRDb250YWluZXIgPT09IHZvaWQgMCA/IHVuZGVmaW5lZCA6IF9yZWYkZ2V0Q29udGFpbmVyLFxuICAgIHByZXZpZXdNYXNrID0gX3JlZi5tYXNrLFxuICAgIG1hc2tDbGFzc05hbWUgPSBfcmVmLm1hc2tDbGFzc05hbWUsXG4gICAgbW92YWJsZSA9IF9yZWYubW92YWJsZSxcbiAgICBpY29ucyA9IF9yZWYuaWNvbnMsXG4gICAgc2NhbGVTdGVwID0gX3JlZi5zY2FsZVN0ZXAsXG4gICAgbWluU2NhbGUgPSBfcmVmLm1pblNjYWxlLFxuICAgIG1heFNjYWxlID0gX3JlZi5tYXhTY2FsZSxcbiAgICBpbWFnZVJlbmRlciA9IF9yZWYuaW1hZ2VSZW5kZXIsXG4gICAgdG9vbGJhclJlbmRlciA9IF9yZWYudG9vbGJhclJlbmRlcixcbiAgICBkaWFsb2dQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBfZXhjbHVkZWQyKTtcbiAgdmFyIHNyYyA9IHByZXZpZXdTcmMgIT09IG51bGwgJiYgcHJldmlld1NyYyAhPT0gdm9pZCAwID8gcHJldmlld1NyYyA6IGltZ1NyYztcbiAgdmFyIF91c2VNZXJnZWRTdGF0ZSA9IHVzZU1lcmdlZFN0YXRlKCEhcHJldmlld1Zpc2libGUsIHtcbiAgICAgIHZhbHVlOiBwcmV2aWV3VmlzaWJsZSxcbiAgICAgIG9uQ2hhbmdlOiBvblByZXZpZXdWaXNpYmxlQ2hhbmdlXG4gICAgfSksXG4gICAgX3VzZU1lcmdlZFN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VNZXJnZWRTdGF0ZSwgMiksXG4gICAgaXNTaG93UHJldmlldyA9IF91c2VNZXJnZWRTdGF0ZTJbMF0sXG4gICAgc2V0U2hvd1ByZXZpZXcgPSBfdXNlTWVyZ2VkU3RhdGUyWzFdO1xuICB2YXIgX3VzZVN0YXR1cyA9IHVzZVN0YXR1cyh7XG4gICAgICBzcmM6IGltZ1NyYyxcbiAgICAgIGlzQ3VzdG9tUGxhY2Vob2xkZXI6IGlzQ3VzdG9tUGxhY2Vob2xkZXIsXG4gICAgICBmYWxsYmFjazogZmFsbGJhY2tcbiAgICB9KSxcbiAgICBfdXNlU3RhdHVzMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0dXMsIDMpLFxuICAgIGdldEltZ1JlZiA9IF91c2VTdGF0dXMyWzBdLFxuICAgIHNyY0FuZE9ubG9hZCA9IF91c2VTdGF0dXMyWzFdLFxuICAgIHN0YXR1cyA9IF91c2VTdGF0dXMyWzJdO1xuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUobnVsbCksXG4gICAgX3VzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZSwgMiksXG4gICAgbW91c2VQb3NpdGlvbiA9IF91c2VTdGF0ZTJbMF0sXG4gICAgc2V0TW91c2VQb3NpdGlvbiA9IF91c2VTdGF0ZTJbMV07XG4gIHZhciBncm91cENvbnRleHQgPSB1c2VDb250ZXh0KFByZXZpZXdHcm91cENvbnRleHQpO1xuICB2YXIgY2FuUHJldmlldyA9ICEhcHJldmlldztcbiAgdmFyIG9uUHJldmlld0Nsb3NlID0gZnVuY3Rpb24gb25QcmV2aWV3Q2xvc2UoKSB7XG4gICAgc2V0U2hvd1ByZXZpZXcoZmFsc2UpO1xuICAgIHNldE1vdXNlUG9zaXRpb24obnVsbCk7XG4gIH07XG4gIHZhciB3cmFwcGVyQ2xhc3MgPSBjbihwcmVmaXhDbHMsIHdyYXBwZXJDbGFzc05hbWUsIHJvb3RDbGFzc05hbWUsIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1lcnJvclwiKSwgc3RhdHVzID09PSAnZXJyb3InKSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBJbWFnZVByb3BzID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGltZ0NvbW1vblByb3BzID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG9iaiA9IHt9O1xuICAgIENPTU1PTl9QUk9QUy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICBpZiAocHJvcHNbcHJvcF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBvYmpbcHJvcF0gPSBwcm9wc1twcm9wXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gb2JqO1xuICB9LCBDT01NT05fUFJPUFMubWFwKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgcmV0dXJuIHByb3BzW3Byb3BdO1xuICB9KSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVnaXN0ZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHJlZ2lzdGVyRGF0YSA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGltZ0NvbW1vblByb3BzKSwge30sIHtcbiAgICAgIHNyYzogc3JjXG4gICAgfSk7XG4gIH0sIFtzcmMsIGltZ0NvbW1vblByb3BzXSk7XG4gIHZhciBpbWFnZUlkID0gdXNlUmVnaXN0ZXJJbWFnZShjYW5QcmV2aWV3LCByZWdpc3RlckRhdGEpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IFByZXZpZXcgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBvblByZXZpZXcgPSBmdW5jdGlvbiBvblByZXZpZXcoZSkge1xuICAgIHZhciBfZ2V0T2Zmc2V0ID0gZ2V0T2Zmc2V0KGUudGFyZ2V0KSxcbiAgICAgIGxlZnQgPSBfZ2V0T2Zmc2V0LmxlZnQsXG4gICAgICB0b3AgPSBfZ2V0T2Zmc2V0LnRvcDtcbiAgICBpZiAoZ3JvdXBDb250ZXh0KSB7XG4gICAgICBncm91cENvbnRleHQub25QcmV2aWV3KGltYWdlSWQsIHNyYywgbGVmdCwgdG9wKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0TW91c2VQb3NpdGlvbih7XG4gICAgICAgIHg6IGxlZnQsXG4gICAgICAgIHk6IHRvcFxuICAgICAgfSk7XG4gICAgICBzZXRTaG93UHJldmlldyh0cnVlKTtcbiAgICB9XG4gICAgb25DbGljayA9PT0gbnVsbCB8fCBvbkNsaWNrID09PSB2b2lkIDAgfHwgb25DbGljayhlKTtcbiAgfTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHt9LCBvdGhlclByb3BzLCB7XG4gICAgY2xhc3NOYW1lOiB3cmFwcGVyQ2xhc3MsXG4gICAgb25DbGljazogY2FuUHJldmlldyA/IG9uUHJldmlldyA6IG9uQ2xpY2ssXG4gICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoe1xuICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgaGVpZ2h0OiBoZWlnaHRcbiAgICB9LCB3cmFwcGVyU3R5bGUpXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImltZ1wiLCBfZXh0ZW5kcyh7fSwgaW1nQ29tbW9uUHJvcHMsIHtcbiAgICBjbGFzc05hbWU6IGNuKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW1nXCIpLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW1nLXBsYWNlaG9sZGVyXCIpLCBwbGFjZWhvbGRlciA9PT0gdHJ1ZSksIGNsYXNzTmFtZSksXG4gICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoe1xuICAgICAgaGVpZ2h0OiBoZWlnaHRcbiAgICB9LCBzdHlsZSksXG4gICAgcmVmOiBnZXRJbWdSZWZcbiAgfSwgc3JjQW5kT25sb2FkLCB7XG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIG9uRXJyb3I6IG9uRXJyb3JcbiAgfSkpLCBzdGF0dXMgPT09ICdsb2FkaW5nJyAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIixcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcGxhY2Vob2xkZXJcIilcbiAgfSwgcGxhY2Vob2xkZXIpLCBwcmV2aWV3TWFzayAmJiBjYW5QcmV2aWV3ICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNuKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbWFza1wiKSwgbWFza0NsYXNzTmFtZSksXG4gICAgc3R5bGU6IHtcbiAgICAgIGRpc3BsYXk6IChzdHlsZSA9PT0gbnVsbCB8fCBzdHlsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3R5bGUuZGlzcGxheSkgPT09ICdub25lJyA/ICdub25lJyA6IHVuZGVmaW5lZFxuICAgIH1cbiAgfSwgcHJldmlld01hc2spKSwgIWdyb3VwQ29udGV4dCAmJiBjYW5QcmV2aWV3ICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFByZXZpZXcsIF9leHRlbmRzKHtcbiAgICBcImFyaWEtaGlkZGVuXCI6ICFpc1Nob3dQcmV2aWV3LFxuICAgIHZpc2libGU6IGlzU2hvd1ByZXZpZXcsXG4gICAgcHJlZml4Q2xzOiBwcmV2aWV3UHJlZml4Q2xzLFxuICAgIG9uQ2xvc2U6IG9uUHJldmlld0Nsb3NlLFxuICAgIG1vdXNlUG9zaXRpb246IG1vdXNlUG9zaXRpb24sXG4gICAgc3JjOiBzcmMsXG4gICAgYWx0OiBhbHQsXG4gICAgaW1hZ2VJbmZvOiB7XG4gICAgICB3aWR0aDogd2lkdGgsXG4gICAgICBoZWlnaHQ6IGhlaWdodFxuICAgIH0sXG4gICAgZmFsbGJhY2s6IGZhbGxiYWNrLFxuICAgIGdldENvbnRhaW5lcjogZ2V0UHJldmlld0NvbnRhaW5lcixcbiAgICBpY29uczogaWNvbnMsXG4gICAgbW92YWJsZTogbW92YWJsZSxcbiAgICBzY2FsZVN0ZXA6IHNjYWxlU3RlcCxcbiAgICBtaW5TY2FsZTogbWluU2NhbGUsXG4gICAgbWF4U2NhbGU6IG1heFNjYWxlLFxuICAgIHJvb3RDbGFzc05hbWU6IHJvb3RDbGFzc05hbWUsXG4gICAgaW1hZ2VSZW5kZXI6IGltYWdlUmVuZGVyLFxuICAgIGltZ0NvbW1vblByb3BzOiBpbWdDb21tb25Qcm9wcyxcbiAgICB0b29sYmFyUmVuZGVyOiB0b29sYmFyUmVuZGVyXG4gIH0sIGRpYWxvZ1Byb3BzKSkpO1xufTtcbkltYWdlSW50ZXJuYWwuUHJldmlld0dyb3VwID0gUHJldmlld0dyb3VwO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgSW1hZ2VJbnRlcm5hbC5kaXNwbGF5TmFtZSA9ICdJbWFnZSc7XG59XG5leHBvcnQgZGVmYXVsdCBJbWFnZUludGVybmFsOyIsICIvKiBlc2xpbnQtZGlzYWJsZSBuby1uZXN0ZWQtdGVybmFyeSAqL1xudmFyIFBJWEVMX1BBVFRFUk4gPSAvbWFyZ2lufHBhZGRpbmd8d2lkdGh8aGVpZ2h0fG1heHxtaW58b2Zmc2V0LztcbnZhciByZW1vdmVQaXhlbCA9IHtcbiAgbGVmdDogdHJ1ZSxcbiAgdG9wOiB0cnVlXG59O1xudmFyIGZsb2F0TWFwID0ge1xuICBjc3NGbG9hdDogMSxcbiAgc3R5bGVGbG9hdDogMSxcbiAgZmxvYXQ6IDFcbn07XG5mdW5jdGlvbiBnZXRDb21wdXRlZFN0eWxlKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT09IDEgPyBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCBudWxsKSA6IHt9O1xufVxuZnVuY3Rpb24gZ2V0U3R5bGVWYWx1ZShub2RlLCB0eXBlLCB2YWx1ZSkge1xuICB0eXBlID0gdHlwZS50b0xvd2VyQ2FzZSgpO1xuICBpZiAodmFsdWUgPT09ICdhdXRvJykge1xuICAgIGlmICh0eXBlID09PSAnaGVpZ2h0Jykge1xuICAgICAgcmV0dXJuIG5vZGUub2Zmc2V0SGVpZ2h0O1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ3dpZHRoJykge1xuICAgICAgcmV0dXJuIG5vZGUub2Zmc2V0V2lkdGg7XG4gICAgfVxuICB9XG4gIGlmICghKHR5cGUgaW4gcmVtb3ZlUGl4ZWwpKSB7XG4gICAgcmVtb3ZlUGl4ZWxbdHlwZV0gPSBQSVhFTF9QQVRURVJOLnRlc3QodHlwZSk7XG4gIH1cbiAgcmV0dXJuIHJlbW92ZVBpeGVsW3R5cGVdID8gcGFyc2VGbG9hdCh2YWx1ZSkgfHwgMCA6IHZhbHVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldChub2RlLCBuYW1lKSB7XG4gIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuICBuYW1lID0gZmxvYXRNYXBbbmFtZV0gPyAnY3NzRmxvYXQnIGluIG5vZGUuc3R5bGUgPyAnY3NzRmxvYXQnIDogJ3N0eWxlRmxvYXQnIDogbmFtZTtcbiAgcmV0dXJuIGxlbmd0aCA9PT0gMSA/IHN0eWxlIDogZ2V0U3R5bGVWYWx1ZShub2RlLCBuYW1lLCBzdHlsZVtuYW1lXSB8fCBub2RlLnN0eWxlW25hbWVdKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzZXQobm9kZSwgbmFtZSwgdmFsdWUpIHtcbiAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIG5hbWUgPSBmbG9hdE1hcFtuYW1lXSA/ICdjc3NGbG9hdCcgaW4gbm9kZS5zdHlsZSA/ICdjc3NGbG9hdCcgOiAnc3R5bGVGbG9hdCcgOiBuYW1lO1xuICBpZiAobGVuZ3RoID09PSAzKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgUElYRUxfUEFUVEVSTi50ZXN0KG5hbWUpKSB7XG4gICAgICB2YWx1ZSA9IFwiXCIuY29uY2F0KHZhbHVlLCBcInB4XCIpO1xuICAgIH1cbiAgICBub2RlLnN0eWxlW25hbWVdID0gdmFsdWU7IC8vIE51bWJlclxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBmb3IgKHZhciB4IGluIG5hbWUpIHtcbiAgICBpZiAobmFtZS5oYXNPd25Qcm9wZXJ0eSh4KSkge1xuICAgICAgc2V0KG5vZGUsIHgsIG5hbWVbeF0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRPdXRlcldpZHRoKGVsKSB7XG4gIGlmIChlbCA9PT0gZG9jdW1lbnQuYm9keSkge1xuICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7XG4gIH1cbiAgcmV0dXJuIGVsLm9mZnNldFdpZHRoO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldE91dGVySGVpZ2h0KGVsKSB7XG4gIGlmIChlbCA9PT0gZG9jdW1lbnQuYm9keSkge1xuICAgIHJldHVybiB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDtcbiAgfVxuICByZXR1cm4gZWwub2Zmc2V0SGVpZ2h0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldERvY1NpemUoKSB7XG4gIHZhciB3aWR0aCA9IE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxXaWR0aCwgZG9jdW1lbnQuYm9keS5zY3JvbGxXaWR0aCk7XG4gIHZhciBoZWlnaHQgPSBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0LCBkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodCk7XG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0XG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2xpZW50U2l6ZSgpIHtcbiAgdmFyIHdpZHRoID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO1xuICB2YXIgaGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0XG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0U2Nyb2xsKCkge1xuICByZXR1cm4ge1xuICAgIHNjcm9sbExlZnQ6IE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0LCBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQpLFxuICAgIHNjcm9sbFRvcDogTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ApXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0T2Zmc2V0KG5vZGUpIHtcbiAgdmFyIGJveCA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHZhciBkb2NFbGVtID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG4gIC8vIDwgaWU4IFx1NEUwRFx1NjUyRlx1NjMwMSB3aW4ucGFnZVhPZmZzZXQsIFx1NTIxOVx1NEY3Rlx1NzUyOCBkb2NFbGVtLnNjcm9sbExlZnRcbiAgcmV0dXJuIHtcbiAgICBsZWZ0OiBib3gubGVmdCArICh3aW5kb3cucGFnZVhPZmZzZXQgfHwgZG9jRWxlbS5zY3JvbGxMZWZ0KSAtIChkb2NFbGVtLmNsaWVudExlZnQgfHwgZG9jdW1lbnQuYm9keS5jbGllbnRMZWZ0IHx8IDApLFxuICAgIHRvcDogYm94LnRvcCArICh3aW5kb3cucGFnZVlPZmZzZXQgfHwgZG9jRWxlbS5zY3JvbGxUb3ApIC0gKGRvY0VsZW0uY2xpZW50VG9wIHx8IGRvY3VtZW50LmJvZHkuY2xpZW50VG9wIHx8IDApXG4gIH07XG59IiwgImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiZmFsbGJhY2tcIiwgXCJzcmNcIiwgXCJpbWdSZWZcIl0sXG4gIF9leGNsdWRlZDIgPSBbXCJwcmVmaXhDbHNcIiwgXCJzcmNcIiwgXCJhbHRcIiwgXCJpbWFnZUluZm9cIiwgXCJmYWxsYmFja1wiLCBcIm1vdmFibGVcIiwgXCJvbkNsb3NlXCIsIFwidmlzaWJsZVwiLCBcImljb25zXCIsIFwicm9vdENsYXNzTmFtZVwiLCBcImNsb3NlSWNvblwiLCBcImdldENvbnRhaW5lclwiLCBcImN1cnJlbnRcIiwgXCJjb3VudFwiLCBcImNvdW50UmVuZGVyXCIsIFwic2NhbGVTdGVwXCIsIFwibWluU2NhbGVcIiwgXCJtYXhTY2FsZVwiLCBcInRyYW5zaXRpb25OYW1lXCIsIFwibWFza1RyYW5zaXRpb25OYW1lXCIsIFwiaW1hZ2VSZW5kZXJcIiwgXCJpbWdDb21tb25Qcm9wc1wiLCBcInRvb2xiYXJSZW5kZXJcIiwgXCJvblRyYW5zZm9ybVwiLCBcIm9uQ2hhbmdlXCJdO1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgRGlhbG9nIGZyb20gJ3JjLWRpYWxvZyc7XG5pbXBvcnQgYWRkRXZlbnRMaXN0ZW5lciBmcm9tIFwicmMtdXRpbC9lcy9Eb20vYWRkRXZlbnRMaXN0ZW5lclwiO1xuaW1wb3J0IEtleUNvZGUgZnJvbSBcInJjLXV0aWwvZXMvS2V5Q29kZVwiO1xuaW1wb3J0IFJlYWN0LCB7IHVzZUNvbnRleHQsIHVzZUVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBPcGVyYXRpb25zIGZyb20gXCIuL09wZXJhdGlvbnNcIjtcbmltcG9ydCB7IFByZXZpZXdHcm91cENvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0XCI7XG5pbXBvcnQgdXNlSW1hZ2VUcmFuc2Zvcm0gZnJvbSBcIi4vaG9va3MvdXNlSW1hZ2VUcmFuc2Zvcm1cIjtcbmltcG9ydCB1c2VNb3VzZUV2ZW50IGZyb20gXCIuL2hvb2tzL3VzZU1vdXNlRXZlbnRcIjtcbmltcG9ydCB1c2VTdGF0dXMgZnJvbSBcIi4vaG9va3MvdXNlU3RhdHVzXCI7XG5pbXBvcnQgdXNlVG91Y2hFdmVudCBmcm9tIFwiLi9ob29rcy91c2VUb3VjaEV2ZW50XCI7XG5pbXBvcnQgeyBCQVNFX1NDQUxFX1JBVElPIH0gZnJvbSBcIi4vcHJldmlld0NvbmZpZ1wiO1xudmFyIFByZXZpZXdJbWFnZSA9IGZ1bmN0aW9uIFByZXZpZXdJbWFnZShfcmVmKSB7XG4gIHZhciBmYWxsYmFjayA9IF9yZWYuZmFsbGJhY2ssXG4gICAgc3JjID0gX3JlZi5zcmMsXG4gICAgaW1nUmVmID0gX3JlZi5pbWdSZWYsXG4gICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZiwgX2V4Y2x1ZGVkKTtcbiAgdmFyIF91c2VTdGF0dXMgPSB1c2VTdGF0dXMoe1xuICAgICAgc3JjOiBzcmMsXG4gICAgICBmYWxsYmFjazogZmFsbGJhY2tcbiAgICB9KSxcbiAgICBfdXNlU3RhdHVzMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0dXMsIDIpLFxuICAgIGdldEltZ1JlZiA9IF91c2VTdGF0dXMyWzBdLFxuICAgIHNyY0FuZE9ubG9hZCA9IF91c2VTdGF0dXMyWzFdO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIiwgX2V4dGVuZHMoe1xuICAgIHJlZjogZnVuY3Rpb24gcmVmKF9yZWYyKSB7XG4gICAgICBpbWdSZWYuY3VycmVudCA9IF9yZWYyO1xuICAgICAgZ2V0SW1nUmVmKF9yZWYyKTtcbiAgICB9XG4gIH0sIHByb3BzLCBzcmNBbmRPbmxvYWQpKTtcbn07XG52YXIgUHJldmlldyA9IGZ1bmN0aW9uIFByZXZpZXcocHJvcHMpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBzcmMgPSBwcm9wcy5zcmMsXG4gICAgYWx0ID0gcHJvcHMuYWx0LFxuICAgIGltYWdlSW5mbyA9IHByb3BzLmltYWdlSW5mbyxcbiAgICBmYWxsYmFjayA9IHByb3BzLmZhbGxiYWNrLFxuICAgIF9wcm9wcyRtb3ZhYmxlID0gcHJvcHMubW92YWJsZSxcbiAgICBtb3ZhYmxlID0gX3Byb3BzJG1vdmFibGUgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkbW92YWJsZSxcbiAgICBvbkNsb3NlID0gcHJvcHMub25DbG9zZSxcbiAgICB2aXNpYmxlID0gcHJvcHMudmlzaWJsZSxcbiAgICBfcHJvcHMkaWNvbnMgPSBwcm9wcy5pY29ucyxcbiAgICBpY29ucyA9IF9wcm9wcyRpY29ucyA9PT0gdm9pZCAwID8ge30gOiBfcHJvcHMkaWNvbnMsXG4gICAgcm9vdENsYXNzTmFtZSA9IHByb3BzLnJvb3RDbGFzc05hbWUsXG4gICAgY2xvc2VJY29uID0gcHJvcHMuY2xvc2VJY29uLFxuICAgIGdldENvbnRhaW5lciA9IHByb3BzLmdldENvbnRhaW5lcixcbiAgICBfcHJvcHMkY3VycmVudCA9IHByb3BzLmN1cnJlbnQsXG4gICAgY3VycmVudCA9IF9wcm9wcyRjdXJyZW50ID09PSB2b2lkIDAgPyAwIDogX3Byb3BzJGN1cnJlbnQsXG4gICAgX3Byb3BzJGNvdW50ID0gcHJvcHMuY291bnQsXG4gICAgY291bnQgPSBfcHJvcHMkY291bnQgPT09IHZvaWQgMCA/IDEgOiBfcHJvcHMkY291bnQsXG4gICAgY291bnRSZW5kZXIgPSBwcm9wcy5jb3VudFJlbmRlcixcbiAgICBfcHJvcHMkc2NhbGVTdGVwID0gcHJvcHMuc2NhbGVTdGVwLFxuICAgIHNjYWxlU3RlcCA9IF9wcm9wcyRzY2FsZVN0ZXAgPT09IHZvaWQgMCA/IDAuNSA6IF9wcm9wcyRzY2FsZVN0ZXAsXG4gICAgX3Byb3BzJG1pblNjYWxlID0gcHJvcHMubWluU2NhbGUsXG4gICAgbWluU2NhbGUgPSBfcHJvcHMkbWluU2NhbGUgPT09IHZvaWQgMCA/IDEgOiBfcHJvcHMkbWluU2NhbGUsXG4gICAgX3Byb3BzJG1heFNjYWxlID0gcHJvcHMubWF4U2NhbGUsXG4gICAgbWF4U2NhbGUgPSBfcHJvcHMkbWF4U2NhbGUgPT09IHZvaWQgMCA/IDUwIDogX3Byb3BzJG1heFNjYWxlLFxuICAgIF9wcm9wcyR0cmFuc2l0aW9uTmFtZSA9IHByb3BzLnRyYW5zaXRpb25OYW1lLFxuICAgIHRyYW5zaXRpb25OYW1lID0gX3Byb3BzJHRyYW5zaXRpb25OYW1lID09PSB2b2lkIDAgPyAnem9vbScgOiBfcHJvcHMkdHJhbnNpdGlvbk5hbWUsXG4gICAgX3Byb3BzJG1hc2tUcmFuc2l0aW9uID0gcHJvcHMubWFza1RyYW5zaXRpb25OYW1lLFxuICAgIG1hc2tUcmFuc2l0aW9uTmFtZSA9IF9wcm9wcyRtYXNrVHJhbnNpdGlvbiA9PT0gdm9pZCAwID8gJ2ZhZGUnIDogX3Byb3BzJG1hc2tUcmFuc2l0aW9uLFxuICAgIGltYWdlUmVuZGVyID0gcHJvcHMuaW1hZ2VSZW5kZXIsXG4gICAgaW1nQ29tbW9uUHJvcHMgPSBwcm9wcy5pbWdDb21tb25Qcm9wcyxcbiAgICB0b29sYmFyUmVuZGVyID0gcHJvcHMudG9vbGJhclJlbmRlcixcbiAgICBvblRyYW5zZm9ybSA9IHByb3BzLm9uVHJhbnNmb3JtLFxuICAgIG9uQ2hhbmdlID0gcHJvcHMub25DaGFuZ2UsXG4gICAgcmVzdFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBfZXhjbHVkZWQyKTtcbiAgdmFyIGltZ1JlZiA9IHVzZVJlZigpO1xuICB2YXIgZ3JvdXBDb250ZXh0ID0gdXNlQ29udGV4dChQcmV2aWV3R3JvdXBDb250ZXh0KTtcbiAgdmFyIHNob3dMZWZ0T3JSaWdodFN3aXRjaGVzID0gZ3JvdXBDb250ZXh0ICYmIGNvdW50ID4gMTtcbiAgdmFyIHNob3dPcGVyYXRpb25zUHJvZ3Jlc3MgPSBncm91cENvbnRleHQgJiYgY291bnQgPj0gMTtcbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKHRydWUpLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIGVuYWJsZVRyYW5zaXRpb24gPSBfdXNlU3RhdGUyWzBdLFxuICAgIHNldEVuYWJsZVRyYW5zaXRpb24gPSBfdXNlU3RhdGUyWzFdO1xuICB2YXIgX3VzZUltYWdlVHJhbnNmb3JtID0gdXNlSW1hZ2VUcmFuc2Zvcm0oaW1nUmVmLCBtaW5TY2FsZSwgbWF4U2NhbGUsIG9uVHJhbnNmb3JtKSxcbiAgICB0cmFuc2Zvcm0gPSBfdXNlSW1hZ2VUcmFuc2Zvcm0udHJhbnNmb3JtLFxuICAgIHJlc2V0VHJhbnNmb3JtID0gX3VzZUltYWdlVHJhbnNmb3JtLnJlc2V0VHJhbnNmb3JtLFxuICAgIHVwZGF0ZVRyYW5zZm9ybSA9IF91c2VJbWFnZVRyYW5zZm9ybS51cGRhdGVUcmFuc2Zvcm0sXG4gICAgZGlzcGF0Y2hab29tQ2hhbmdlID0gX3VzZUltYWdlVHJhbnNmb3JtLmRpc3BhdGNoWm9vbUNoYW5nZTtcbiAgdmFyIF91c2VNb3VzZUV2ZW50ID0gdXNlTW91c2VFdmVudChpbWdSZWYsIG1vdmFibGUsIHZpc2libGUsIHNjYWxlU3RlcCwgdHJhbnNmb3JtLCB1cGRhdGVUcmFuc2Zvcm0sIGRpc3BhdGNoWm9vbUNoYW5nZSksXG4gICAgaXNNb3ZpbmcgPSBfdXNlTW91c2VFdmVudC5pc01vdmluZyxcbiAgICBvbk1vdXNlRG93biA9IF91c2VNb3VzZUV2ZW50Lm9uTW91c2VEb3duLFxuICAgIG9uV2hlZWwgPSBfdXNlTW91c2VFdmVudC5vbldoZWVsO1xuICB2YXIgX3VzZVRvdWNoRXZlbnQgPSB1c2VUb3VjaEV2ZW50KGltZ1JlZiwgbW92YWJsZSwgdmlzaWJsZSwgbWluU2NhbGUsIHRyYW5zZm9ybSwgdXBkYXRlVHJhbnNmb3JtLCBkaXNwYXRjaFpvb21DaGFuZ2UpLFxuICAgIGlzVG91Y2hpbmcgPSBfdXNlVG91Y2hFdmVudC5pc1RvdWNoaW5nLFxuICAgIG9uVG91Y2hTdGFydCA9IF91c2VUb3VjaEV2ZW50Lm9uVG91Y2hTdGFydCxcbiAgICBvblRvdWNoTW92ZSA9IF91c2VUb3VjaEV2ZW50Lm9uVG91Y2hNb3ZlLFxuICAgIG9uVG91Y2hFbmQgPSBfdXNlVG91Y2hFdmVudC5vblRvdWNoRW5kO1xuICB2YXIgcm90YXRlID0gdHJhbnNmb3JtLnJvdGF0ZSxcbiAgICBzY2FsZSA9IHRyYW5zZm9ybS5zY2FsZTtcbiAgdmFyIHdyYXBDbGFzc05hbWUgPSBjbGFzc25hbWVzKF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1tb3ZpbmdcIiksIGlzTW92aW5nKSk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFlbmFibGVUcmFuc2l0aW9uKSB7XG4gICAgICBzZXRFbmFibGVUcmFuc2l0aW9uKHRydWUpO1xuICAgIH1cbiAgfSwgW2VuYWJsZVRyYW5zaXRpb25dKTtcbiAgdmFyIG9uQWZ0ZXJDbG9zZSA9IGZ1bmN0aW9uIG9uQWZ0ZXJDbG9zZSgpIHtcbiAgICByZXNldFRyYW5zZm9ybSgnY2xvc2UnKTtcbiAgfTtcbiAgdmFyIG9uWm9vbUluID0gZnVuY3Rpb24gb25ab29tSW4oKSB7XG4gICAgZGlzcGF0Y2hab29tQ2hhbmdlKEJBU0VfU0NBTEVfUkFUSU8gKyBzY2FsZVN0ZXAsICd6b29tSW4nKTtcbiAgfTtcbiAgdmFyIG9uWm9vbU91dCA9IGZ1bmN0aW9uIG9uWm9vbU91dCgpIHtcbiAgICBkaXNwYXRjaFpvb21DaGFuZ2UoQkFTRV9TQ0FMRV9SQVRJTyAvIChCQVNFX1NDQUxFX1JBVElPICsgc2NhbGVTdGVwKSwgJ3pvb21PdXQnKTtcbiAgfTtcbiAgdmFyIG9uUm90YXRlUmlnaHQgPSBmdW5jdGlvbiBvblJvdGF0ZVJpZ2h0KCkge1xuICAgIHVwZGF0ZVRyYW5zZm9ybSh7XG4gICAgICByb3RhdGU6IHJvdGF0ZSArIDkwXG4gICAgfSwgJ3JvdGF0ZVJpZ2h0Jyk7XG4gIH07XG4gIHZhciBvblJvdGF0ZUxlZnQgPSBmdW5jdGlvbiBvblJvdGF0ZUxlZnQoKSB7XG4gICAgdXBkYXRlVHJhbnNmb3JtKHtcbiAgICAgIHJvdGF0ZTogcm90YXRlIC0gOTBcbiAgICB9LCAncm90YXRlTGVmdCcpO1xuICB9O1xuICB2YXIgb25GbGlwWCA9IGZ1bmN0aW9uIG9uRmxpcFgoKSB7XG4gICAgdXBkYXRlVHJhbnNmb3JtKHtcbiAgICAgIGZsaXBYOiAhdHJhbnNmb3JtLmZsaXBYXG4gICAgfSwgJ2ZsaXBYJyk7XG4gIH07XG4gIHZhciBvbkZsaXBZID0gZnVuY3Rpb24gb25GbGlwWSgpIHtcbiAgICB1cGRhdGVUcmFuc2Zvcm0oe1xuICAgICAgZmxpcFk6ICF0cmFuc2Zvcm0uZmxpcFlcbiAgICB9LCAnZmxpcFknKTtcbiAgfTtcbiAgdmFyIG9uUmVzZXQgPSBmdW5jdGlvbiBvblJlc2V0KCkge1xuICAgIHJlc2V0VHJhbnNmb3JtKCdyZXNldCcpO1xuICB9O1xuICB2YXIgb25BY3RpdmUgPSBmdW5jdGlvbiBvbkFjdGl2ZShvZmZzZXQpIHtcbiAgICB2YXIgcG9zaXRpb24gPSBjdXJyZW50ICsgb2Zmc2V0O1xuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihwb3NpdGlvbikgfHwgcG9zaXRpb24gPCAwIHx8IHBvc2l0aW9uID4gY291bnQgLSAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNldEVuYWJsZVRyYW5zaXRpb24oZmFsc2UpO1xuICAgIHJlc2V0VHJhbnNmb3JtKG9mZnNldCA8IDAgPyAncHJldicgOiAnbmV4dCcpO1xuICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgfHwgb25DaGFuZ2UocG9zaXRpb24sIGN1cnJlbnQpO1xuICB9O1xuICB2YXIgb25LZXlEb3duID0gZnVuY3Rpb24gb25LZXlEb3duKGV2ZW50KSB7XG4gICAgaWYgKCF2aXNpYmxlIHx8ICFzaG93TGVmdE9yUmlnaHRTd2l0Y2hlcykgcmV0dXJuO1xuICAgIGlmIChldmVudC5rZXlDb2RlID09PSBLZXlDb2RlLkxFRlQpIHtcbiAgICAgIG9uQWN0aXZlKC0xKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleUNvZGUgPT09IEtleUNvZGUuUklHSFQpIHtcbiAgICAgIG9uQWN0aXZlKDEpO1xuICAgIH1cbiAgfTtcbiAgdmFyIG9uRG91YmxlQ2xpY2sgPSBmdW5jdGlvbiBvbkRvdWJsZUNsaWNrKGV2ZW50KSB7XG4gICAgaWYgKHZpc2libGUpIHtcbiAgICAgIGlmIChzY2FsZSAhPT0gMSkge1xuICAgICAgICB1cGRhdGVUcmFuc2Zvcm0oe1xuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogMCxcbiAgICAgICAgICBzY2FsZTogMVxuICAgICAgICB9LCAnZG91YmxlQ2xpY2snKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpc3BhdGNoWm9vbUNoYW5nZShCQVNFX1NDQUxFX1JBVElPICsgc2NhbGVTdGVwLCAnZG91YmxlQ2xpY2snLCBldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG9uS2V5RG93bkxpc3RlbmVyID0gYWRkRXZlbnRMaXN0ZW5lcih3aW5kb3csICdrZXlkb3duJywgb25LZXlEb3duLCBmYWxzZSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIG9uS2V5RG93bkxpc3RlbmVyLnJlbW92ZSgpO1xuICAgIH07XG4gIH0sIFt2aXNpYmxlLCBzaG93TGVmdE9yUmlnaHRTd2l0Y2hlcywgY3VycmVudF0pO1xuICB2YXIgaW1nTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFByZXZpZXdJbWFnZSwgX2V4dGVuZHMoe30sIGltZ0NvbW1vblByb3BzLCB7XG4gICAgd2lkdGg6IHByb3BzLndpZHRoLFxuICAgIGhlaWdodDogcHJvcHMuaGVpZ2h0LFxuICAgIGltZ1JlZjogaW1nUmVmLFxuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbWdcIiksXG4gICAgYWx0OiBhbHQsXG4gICAgc3R5bGU6IHtcbiAgICAgIHRyYW5zZm9ybTogXCJ0cmFuc2xhdGUzZChcIi5jb25jYXQodHJhbnNmb3JtLngsIFwicHgsIFwiKS5jb25jYXQodHJhbnNmb3JtLnksIFwicHgsIDApIHNjYWxlM2QoXCIpLmNvbmNhdCh0cmFuc2Zvcm0uZmxpcFggPyAnLScgOiAnJykuY29uY2F0KHNjYWxlLCBcIiwgXCIpLmNvbmNhdCh0cmFuc2Zvcm0uZmxpcFkgPyAnLScgOiAnJykuY29uY2F0KHNjYWxlLCBcIiwgMSkgcm90YXRlKFwiKS5jb25jYXQocm90YXRlLCBcImRlZylcIiksXG4gICAgICB0cmFuc2l0aW9uRHVyYXRpb246ICghZW5hYmxlVHJhbnNpdGlvbiB8fCBpc1RvdWNoaW5nKSAmJiAnMHMnXG4gICAgfSxcbiAgICBmYWxsYmFjazogZmFsbGJhY2ssXG4gICAgc3JjOiBzcmMsXG4gICAgb25XaGVlbDogb25XaGVlbCxcbiAgICBvbk1vdXNlRG93bjogb25Nb3VzZURvd24sXG4gICAgb25Eb3VibGVDbGljazogb25Eb3VibGVDbGljayxcbiAgICBvblRvdWNoU3RhcnQ6IG9uVG91Y2hTdGFydCxcbiAgICBvblRvdWNoTW92ZTogb25Ub3VjaE1vdmUsXG4gICAgb25Ub3VjaEVuZDogb25Ub3VjaEVuZCxcbiAgICBvblRvdWNoQ2FuY2VsOiBvblRvdWNoRW5kXG4gIH0pKTtcbiAgdmFyIGltYWdlID0gX29iamVjdFNwcmVhZCh7XG4gICAgdXJsOiBzcmMsXG4gICAgYWx0OiBhbHRcbiAgfSwgaW1hZ2VJbmZvKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEaWFsb2csIF9leHRlbmRzKHtcbiAgICB0cmFuc2l0aW9uTmFtZTogdHJhbnNpdGlvbk5hbWUsXG4gICAgbWFza1RyYW5zaXRpb25OYW1lOiBtYXNrVHJhbnNpdGlvbk5hbWUsXG4gICAgY2xvc2FibGU6IGZhbHNlLFxuICAgIGtleWJvYXJkOiB0cnVlLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIG9uQ2xvc2U6IG9uQ2xvc2UsXG4gICAgdmlzaWJsZTogdmlzaWJsZSxcbiAgICBjbGFzc05hbWVzOiB7XG4gICAgICB3cmFwcGVyOiB3cmFwQ2xhc3NOYW1lXG4gICAgfSxcbiAgICByb290Q2xhc3NOYW1lOiByb290Q2xhc3NOYW1lLFxuICAgIGdldENvbnRhaW5lcjogZ2V0Q29udGFpbmVyXG4gIH0sIHJlc3RQcm9wcywge1xuICAgIGFmdGVyQ2xvc2U6IG9uQWZ0ZXJDbG9zZVxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbWctd3JhcHBlclwiKVxuICB9LCBpbWFnZVJlbmRlciA/IGltYWdlUmVuZGVyKGltZ05vZGUsIF9vYmplY3RTcHJlYWQoe1xuICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtLFxuICAgIGltYWdlOiBpbWFnZVxuICB9LCBncm91cENvbnRleHQgPyB7XG4gICAgY3VycmVudDogY3VycmVudFxuICB9IDoge30pKSA6IGltZ05vZGUpKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoT3BlcmF0aW9ucywge1xuICAgIHZpc2libGU6IHZpc2libGUsXG4gICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm0sXG4gICAgbWFza1RyYW5zaXRpb25OYW1lOiBtYXNrVHJhbnNpdGlvbk5hbWUsXG4gICAgY2xvc2VJY29uOiBjbG9zZUljb24sXG4gICAgZ2V0Q29udGFpbmVyOiBnZXRDb250YWluZXIsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgcm9vdENsYXNzTmFtZTogcm9vdENsYXNzTmFtZSxcbiAgICBpY29uczogaWNvbnMsXG4gICAgY291bnRSZW5kZXI6IGNvdW50UmVuZGVyLFxuICAgIHNob3dTd2l0Y2g6IHNob3dMZWZ0T3JSaWdodFN3aXRjaGVzLFxuICAgIHNob3dQcm9ncmVzczogc2hvd09wZXJhdGlvbnNQcm9ncmVzcyxcbiAgICBjdXJyZW50OiBjdXJyZW50LFxuICAgIGNvdW50OiBjb3VudCxcbiAgICBzY2FsZTogc2NhbGUsXG4gICAgbWluU2NhbGU6IG1pblNjYWxlLFxuICAgIG1heFNjYWxlOiBtYXhTY2FsZSxcbiAgICB0b29sYmFyUmVuZGVyOiB0b29sYmFyUmVuZGVyLFxuICAgIG9uQWN0aXZlOiBvbkFjdGl2ZSxcbiAgICBvblpvb21Jbjogb25ab29tSW4sXG4gICAgb25ab29tT3V0OiBvblpvb21PdXQsXG4gICAgb25Sb3RhdGVSaWdodDogb25Sb3RhdGVSaWdodCxcbiAgICBvblJvdGF0ZUxlZnQ6IG9uUm90YXRlTGVmdCxcbiAgICBvbkZsaXBYOiBvbkZsaXBYLFxuICAgIG9uRmxpcFk6IG9uRmxpcFksXG4gICAgb25DbG9zZTogb25DbG9zZSxcbiAgICBvblJlc2V0OiBvblJlc2V0LFxuICAgIHpJbmRleDogcmVzdFByb3BzLnpJbmRleCAhPT0gdW5kZWZpbmVkID8gcmVzdFByb3BzLnpJbmRleCArIDEgOiB1bmRlZmluZWQsXG4gICAgaW1hZ2U6IGltYWdlXG4gIH0pKTtcbn07XG5leHBvcnQgZGVmYXVsdCBQcmV2aWV3OyIsICJpbXBvcnQgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXJXcmFwKHRhcmdldCwgZXZlbnRUeXBlLCBjYiwgb3B0aW9uKSB7XG4gIC8qIGVzbGludCBjYW1lbGNhc2U6IDIgKi9cbiAgdmFyIGNhbGxiYWNrID0gUmVhY3RET00udW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMgPyBmdW5jdGlvbiBydW4oZSkge1xuICAgIFJlYWN0RE9NLnVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzKGNiLCBlKTtcbiAgfSA6IGNiO1xuICBpZiAodGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwICYmIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBjYWxsYmFjaywgb3B0aW9uKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgICAgaWYgKHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCAmJiB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGNhbGxiYWNrLCBvcHRpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn0iLCAiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgUG9ydGFsIGZyb20gJ0ByYy1jb21wb25lbnQvcG9ydGFsJztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IENTU01vdGlvbiBmcm9tICdyYy1tb3Rpb24nO1xuaW1wb3J0IEtleUNvZGUgZnJvbSBcInJjLXV0aWwvZXMvS2V5Q29kZVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFByZXZpZXdHcm91cENvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0XCI7XG52YXIgT3BlcmF0aW9ucyA9IGZ1bmN0aW9uIE9wZXJhdGlvbnMocHJvcHMpIHtcbiAgdmFyIHZpc2libGUgPSBwcm9wcy52aXNpYmxlLFxuICAgIG1hc2tUcmFuc2l0aW9uTmFtZSA9IHByb3BzLm1hc2tUcmFuc2l0aW9uTmFtZSxcbiAgICBnZXRDb250YWluZXIgPSBwcm9wcy5nZXRDb250YWluZXIsXG4gICAgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIHJvb3RDbGFzc05hbWUgPSBwcm9wcy5yb290Q2xhc3NOYW1lLFxuICAgIGljb25zID0gcHJvcHMuaWNvbnMsXG4gICAgY291bnRSZW5kZXIgPSBwcm9wcy5jb3VudFJlbmRlcixcbiAgICBzaG93U3dpdGNoID0gcHJvcHMuc2hvd1N3aXRjaCxcbiAgICBzaG93UHJvZ3Jlc3MgPSBwcm9wcy5zaG93UHJvZ3Jlc3MsXG4gICAgY3VycmVudCA9IHByb3BzLmN1cnJlbnQsXG4gICAgdHJhbnNmb3JtID0gcHJvcHMudHJhbnNmb3JtLFxuICAgIGNvdW50ID0gcHJvcHMuY291bnQsXG4gICAgc2NhbGUgPSBwcm9wcy5zY2FsZSxcbiAgICBtaW5TY2FsZSA9IHByb3BzLm1pblNjYWxlLFxuICAgIG1heFNjYWxlID0gcHJvcHMubWF4U2NhbGUsXG4gICAgY2xvc2VJY29uID0gcHJvcHMuY2xvc2VJY29uLFxuICAgIG9uQWN0aXZlID0gcHJvcHMub25BY3RpdmUsXG4gICAgb25DbG9zZSA9IHByb3BzLm9uQ2xvc2UsXG4gICAgb25ab29tSW4gPSBwcm9wcy5vblpvb21JbixcbiAgICBvblpvb21PdXQgPSBwcm9wcy5vblpvb21PdXQsXG4gICAgb25Sb3RhdGVSaWdodCA9IHByb3BzLm9uUm90YXRlUmlnaHQsXG4gICAgb25Sb3RhdGVMZWZ0ID0gcHJvcHMub25Sb3RhdGVMZWZ0LFxuICAgIG9uRmxpcFggPSBwcm9wcy5vbkZsaXBYLFxuICAgIG9uRmxpcFkgPSBwcm9wcy5vbkZsaXBZLFxuICAgIG9uUmVzZXQgPSBwcm9wcy5vblJlc2V0LFxuICAgIHRvb2xiYXJSZW5kZXIgPSBwcm9wcy50b29sYmFyUmVuZGVyLFxuICAgIHpJbmRleCA9IHByb3BzLnpJbmRleCxcbiAgICBpbWFnZSA9IHByb3BzLmltYWdlO1xuICB2YXIgZ3JvdXBDb250ZXh0ID0gdXNlQ29udGV4dChQcmV2aWV3R3JvdXBDb250ZXh0KTtcbiAgdmFyIHJvdGF0ZUxlZnQgPSBpY29ucy5yb3RhdGVMZWZ0LFxuICAgIHJvdGF0ZVJpZ2h0ID0gaWNvbnMucm90YXRlUmlnaHQsXG4gICAgem9vbUluID0gaWNvbnMuem9vbUluLFxuICAgIHpvb21PdXQgPSBpY29ucy56b29tT3V0LFxuICAgIGNsb3NlID0gaWNvbnMuY2xvc2UsXG4gICAgbGVmdCA9IGljb25zLmxlZnQsXG4gICAgcmlnaHQgPSBpY29ucy5yaWdodCxcbiAgICBmbGlwWCA9IGljb25zLmZsaXBYLFxuICAgIGZsaXBZID0gaWNvbnMuZmxpcFk7XG4gIHZhciB0b29sQ2xhc3NOYW1lID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1vcGVyYXRpb25zLW9wZXJhdGlvblwiKTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgb25LZXlEb3duID0gZnVuY3Rpb24gb25LZXlEb3duKGUpIHtcbiAgICAgIGlmIChlLmtleUNvZGUgPT09IEtleUNvZGUuRVNDKSB7XG4gICAgICAgIG9uQ2xvc2UoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmICh2aXNpYmxlKSB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5RG93bik7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5RG93bik7XG4gICAgfTtcbiAgfSwgW3Zpc2libGVdKTtcbiAgdmFyIGhhbmRsZUFjdGl2ZSA9IGZ1bmN0aW9uIGhhbmRsZUFjdGl2ZShlLCBvZmZzZXQpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBvbkFjdGl2ZShvZmZzZXQpO1xuICB9O1xuICB2YXIgcmVuZGVyT3BlcmF0aW9uID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIgdHlwZSA9IF9yZWYudHlwZSxcbiAgICAgIGRpc2FibGVkID0gX3JlZi5kaXNhYmxlZCxcbiAgICAgIG9uQ2xpY2sgPSBfcmVmLm9uQ2xpY2ssXG4gICAgICBpY29uID0gX3JlZi5pY29uO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBrZXk6IHR5cGUsXG4gICAgICBjbGFzc05hbWU6IGNsYXNzbmFtZXModG9vbENsYXNzTmFtZSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1vcGVyYXRpb25zLW9wZXJhdGlvbi1cIikuY29uY2F0KHR5cGUpLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItb3BlcmF0aW9ucy1vcGVyYXRpb24tZGlzYWJsZWRcIiksICEhZGlzYWJsZWQpKSxcbiAgICAgIG9uQ2xpY2s6IG9uQ2xpY2tcbiAgICB9LCBpY29uKTtcbiAgfSwgW3Rvb2xDbGFzc05hbWUsIHByZWZpeENsc10pO1xuICB2YXIgc3dpdGNoUHJldk5vZGUgPSBzaG93U3dpdGNoID8gcmVuZGVyT3BlcmF0aW9uKHtcbiAgICBpY29uOiBsZWZ0LFxuICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soZSkge1xuICAgICAgcmV0dXJuIGhhbmRsZUFjdGl2ZShlLCAtMSk7XG4gICAgfSxcbiAgICB0eXBlOiAncHJldicsXG4gICAgZGlzYWJsZWQ6IGN1cnJlbnQgPT09IDBcbiAgfSkgOiB1bmRlZmluZWQ7XG4gIHZhciBzd2l0Y2hOZXh0Tm9kZSA9IHNob3dTd2l0Y2ggPyByZW5kZXJPcGVyYXRpb24oe1xuICAgIGljb246IHJpZ2h0LFxuICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soZSkge1xuICAgICAgcmV0dXJuIGhhbmRsZUFjdGl2ZShlLCAxKTtcbiAgICB9LFxuICAgIHR5cGU6ICduZXh0JyxcbiAgICBkaXNhYmxlZDogY3VycmVudCA9PT0gY291bnQgLSAxXG4gIH0pIDogdW5kZWZpbmVkO1xuICB2YXIgZmxpcFlOb2RlID0gcmVuZGVyT3BlcmF0aW9uKHtcbiAgICBpY29uOiBmbGlwWSxcbiAgICBvbkNsaWNrOiBvbkZsaXBZLFxuICAgIHR5cGU6ICdmbGlwWSdcbiAgfSk7XG4gIHZhciBmbGlwWE5vZGUgPSByZW5kZXJPcGVyYXRpb24oe1xuICAgIGljb246IGZsaXBYLFxuICAgIG9uQ2xpY2s6IG9uRmxpcFgsXG4gICAgdHlwZTogJ2ZsaXBYJ1xuICB9KTtcbiAgdmFyIHJvdGF0ZUxlZnROb2RlID0gcmVuZGVyT3BlcmF0aW9uKHtcbiAgICBpY29uOiByb3RhdGVMZWZ0LFxuICAgIG9uQ2xpY2s6IG9uUm90YXRlTGVmdCxcbiAgICB0eXBlOiAncm90YXRlTGVmdCdcbiAgfSk7XG4gIHZhciByb3RhdGVSaWdodE5vZGUgPSByZW5kZXJPcGVyYXRpb24oe1xuICAgIGljb246IHJvdGF0ZVJpZ2h0LFxuICAgIG9uQ2xpY2s6IG9uUm90YXRlUmlnaHQsXG4gICAgdHlwZTogJ3JvdGF0ZVJpZ2h0J1xuICB9KTtcbiAgdmFyIHpvb21PdXROb2RlID0gcmVuZGVyT3BlcmF0aW9uKHtcbiAgICBpY29uOiB6b29tT3V0LFxuICAgIG9uQ2xpY2s6IG9uWm9vbU91dCxcbiAgICB0eXBlOiAnem9vbU91dCcsXG4gICAgZGlzYWJsZWQ6IHNjYWxlIDw9IG1pblNjYWxlXG4gIH0pO1xuICB2YXIgem9vbUluTm9kZSA9IHJlbmRlck9wZXJhdGlvbih7XG4gICAgaWNvbjogem9vbUluLFxuICAgIG9uQ2xpY2s6IG9uWm9vbUluLFxuICAgIHR5cGU6ICd6b29tSW4nLFxuICAgIGRpc2FibGVkOiBzY2FsZSA9PT0gbWF4U2NhbGVcbiAgfSk7XG4gIHZhciB0b29sYmFyTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItb3BlcmF0aW9uc1wiKVxuICB9LCBmbGlwWU5vZGUsIGZsaXBYTm9kZSwgcm90YXRlTGVmdE5vZGUsIHJvdGF0ZVJpZ2h0Tm9kZSwgem9vbU91dE5vZGUsIHpvb21Jbk5vZGUpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ1NTTW90aW9uLCB7XG4gICAgdmlzaWJsZTogdmlzaWJsZSxcbiAgICBtb3Rpb25OYW1lOiBtYXNrVHJhbnNpdGlvbk5hbWVcbiAgfSwgZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgdmFyIGNsYXNzTmFtZSA9IF9yZWYyLmNsYXNzTmFtZSxcbiAgICAgIHN0eWxlID0gX3JlZjIuc3R5bGU7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBvcnRhbCwge1xuICAgICAgb3BlbjogdHJ1ZSxcbiAgICAgIGdldENvbnRhaW5lcjogZ2V0Q29udGFpbmVyICE9PSBudWxsICYmIGdldENvbnRhaW5lciAhPT0gdm9pZCAwID8gZ2V0Q29udGFpbmVyIDogZG9jdW1lbnQuYm9keVxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NuYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW9wZXJhdGlvbnMtd3JhcHBlclwiKSwgY2xhc3NOYW1lLCByb290Q2xhc3NOYW1lKSxcbiAgICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN0eWxlKSwge30sIHtcbiAgICAgICAgekluZGV4OiB6SW5kZXhcbiAgICAgIH0pXG4gICAgfSwgY2xvc2VJY29uID09PSBudWxsID8gbnVsbCA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jbG9zZVwiKSxcbiAgICAgIG9uQ2xpY2s6IG9uQ2xvc2VcbiAgICB9LCBjbG9zZUljb24gfHwgY2xvc2UpLCBzaG93U3dpdGNoICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzbmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zd2l0Y2gtbGVmdFwiKSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXN3aXRjaC1sZWZ0LWRpc2FibGVkXCIpLCBjdXJyZW50ID09PSAwKSksXG4gICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKGUpIHtcbiAgICAgICAgcmV0dXJuIGhhbmRsZUFjdGl2ZShlLCAtMSk7XG4gICAgICB9XG4gICAgfSwgbGVmdCksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NuYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXN3aXRjaC1yaWdodFwiKSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXN3aXRjaC1yaWdodC1kaXNhYmxlZFwiKSwgY3VycmVudCA9PT0gY291bnQgLSAxKSksXG4gICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKGUpIHtcbiAgICAgICAgcmV0dXJuIGhhbmRsZUFjdGl2ZShlLCAxKTtcbiAgICAgIH1cbiAgICB9LCByaWdodCkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZm9vdGVyXCIpXG4gICAgfSwgc2hvd1Byb2dyZXNzICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1wcm9ncmVzc1wiKVxuICAgIH0sIGNvdW50UmVuZGVyID8gY291bnRSZW5kZXIoY3VycmVudCArIDEsIGNvdW50KSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiYmRpXCIsIG51bGwsIFwiXCIuY29uY2F0KGN1cnJlbnQgKyAxLCBcIiAvIFwiKS5jb25jYXQoY291bnQpKSksIHRvb2xiYXJSZW5kZXIgPyB0b29sYmFyUmVuZGVyKHRvb2xiYXJOb2RlLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe1xuICAgICAgaWNvbnM6IHtcbiAgICAgICAgcHJldkljb246IHN3aXRjaFByZXZOb2RlLFxuICAgICAgICBuZXh0SWNvbjogc3dpdGNoTmV4dE5vZGUsXG4gICAgICAgIGZsaXBZSWNvbjogZmxpcFlOb2RlLFxuICAgICAgICBmbGlwWEljb246IGZsaXBYTm9kZSxcbiAgICAgICAgcm90YXRlTGVmdEljb246IHJvdGF0ZUxlZnROb2RlLFxuICAgICAgICByb3RhdGVSaWdodEljb246IHJvdGF0ZVJpZ2h0Tm9kZSxcbiAgICAgICAgem9vbU91dEljb246IHpvb21PdXROb2RlLFxuICAgICAgICB6b29tSW5JY29uOiB6b29tSW5Ob2RlXG4gICAgICB9LFxuICAgICAgYWN0aW9uczoge1xuICAgICAgICBvbkFjdGl2ZTogb25BY3RpdmUsXG4gICAgICAgIG9uRmxpcFk6IG9uRmxpcFksXG4gICAgICAgIG9uRmxpcFg6IG9uRmxpcFgsXG4gICAgICAgIG9uUm90YXRlTGVmdDogb25Sb3RhdGVMZWZ0LFxuICAgICAgICBvblJvdGF0ZVJpZ2h0OiBvblJvdGF0ZVJpZ2h0LFxuICAgICAgICBvblpvb21PdXQ6IG9uWm9vbU91dCxcbiAgICAgICAgb25ab29tSW46IG9uWm9vbUluLFxuICAgICAgICBvblJlc2V0OiBvblJlc2V0LFxuICAgICAgICBvbkNsb3NlOiBvbkNsb3NlXG4gICAgICB9LFxuICAgICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm1cbiAgICB9LCBncm91cENvbnRleHQgPyB7XG4gICAgICBjdXJyZW50OiBjdXJyZW50LFxuICAgICAgdG90YWw6IGNvdW50XG4gICAgfSA6IHt9KSwge30sIHtcbiAgICAgIGltYWdlOiBpbWFnZVxuICAgIH0pKSA6IHRvb2xiYXJOb2RlKSkpO1xuICB9KTtcbn07XG5leHBvcnQgZGVmYXVsdCBPcGVyYXRpb25zOyIsICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5leHBvcnQgdmFyIFByZXZpZXdHcm91cENvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTsiLCAiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IHsgZ2V0Q2xpZW50U2l6ZSB9IGZyb20gXCJyYy11dGlsL2VzL0RvbS9jc3NcIjtcbmltcG9ydCBpc0VxdWFsIGZyb20gXCJyYy11dGlsL2VzL2lzRXF1YWxcIjtcbmltcG9ydCByYWYgZnJvbSBcInJjLXV0aWwvZXMvcmFmXCI7XG5pbXBvcnQgeyB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xudmFyIGluaXRpYWxUcmFuc2Zvcm0gPSB7XG4gIHg6IDAsXG4gIHk6IDAsXG4gIHJvdGF0ZTogMCxcbiAgc2NhbGU6IDEsXG4gIGZsaXBYOiBmYWxzZSxcbiAgZmxpcFk6IGZhbHNlXG59O1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlSW1hZ2VUcmFuc2Zvcm0oaW1nUmVmLCBtaW5TY2FsZSwgbWF4U2NhbGUsIG9uVHJhbnNmb3JtKSB7XG4gIHZhciBmcmFtZSA9IHVzZVJlZihudWxsKTtcbiAgdmFyIHF1ZXVlID0gdXNlUmVmKFtdKTtcbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKGluaXRpYWxUcmFuc2Zvcm0pLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIHRyYW5zZm9ybSA9IF91c2VTdGF0ZTJbMF0sXG4gICAgc2V0VHJhbnNmb3JtID0gX3VzZVN0YXRlMlsxXTtcbiAgdmFyIHJlc2V0VHJhbnNmb3JtID0gZnVuY3Rpb24gcmVzZXRUcmFuc2Zvcm0oYWN0aW9uKSB7XG4gICAgc2V0VHJhbnNmb3JtKGluaXRpYWxUcmFuc2Zvcm0pO1xuICAgIGlmICghaXNFcXVhbChpbml0aWFsVHJhbnNmb3JtLCB0cmFuc2Zvcm0pKSB7XG4gICAgICBvblRyYW5zZm9ybSA9PT0gbnVsbCB8fCBvblRyYW5zZm9ybSA9PT0gdm9pZCAwIHx8IG9uVHJhbnNmb3JtKHtcbiAgICAgICAgdHJhbnNmb3JtOiBpbml0aWFsVHJhbnNmb3JtLFxuICAgICAgICBhY3Rpb246IGFjdGlvblxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKiBEaXJlY3QgdXBkYXRlIHRyYW5zZm9ybSAqL1xuICB2YXIgdXBkYXRlVHJhbnNmb3JtID0gZnVuY3Rpb24gdXBkYXRlVHJhbnNmb3JtKG5ld1RyYW5zZm9ybSwgYWN0aW9uKSB7XG4gICAgaWYgKGZyYW1lLmN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIHF1ZXVlLmN1cnJlbnQgPSBbXTtcbiAgICAgIGZyYW1lLmN1cnJlbnQgPSByYWYoZnVuY3Rpb24gKCkge1xuICAgICAgICBzZXRUcmFuc2Zvcm0oZnVuY3Rpb24gKHByZVN0YXRlKSB7XG4gICAgICAgICAgdmFyIG1lbW9TdGF0ZSA9IHByZVN0YXRlO1xuICAgICAgICAgIHF1ZXVlLmN1cnJlbnQuZm9yRWFjaChmdW5jdGlvbiAocXVldWVTdGF0ZSkge1xuICAgICAgICAgICAgbWVtb1N0YXRlID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBtZW1vU3RhdGUpLCBxdWV1ZVN0YXRlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBmcmFtZS5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgICBvblRyYW5zZm9ybSA9PT0gbnVsbCB8fCBvblRyYW5zZm9ybSA9PT0gdm9pZCAwIHx8IG9uVHJhbnNmb3JtKHtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogbWVtb1N0YXRlLFxuICAgICAgICAgICAgYWN0aW9uOiBhY3Rpb25cbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gbWVtb1N0YXRlO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBxdWV1ZS5jdXJyZW50LnB1c2goX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB0cmFuc2Zvcm0pLCBuZXdUcmFuc2Zvcm0pKTtcbiAgfTtcblxuICAvKiogU2NhbGUgYWNjb3JkaW5nIHRvIHRoZSBwb3NpdGlvbiBvZiBjZW50ZXJYIGFuZCBjZW50ZXJZICovXG4gIHZhciBkaXNwYXRjaFpvb21DaGFuZ2UgPSBmdW5jdGlvbiBkaXNwYXRjaFpvb21DaGFuZ2UocmF0aW8sIGFjdGlvbiwgY2VudGVyWCwgY2VudGVyWSwgaXNUb3VjaCkge1xuICAgIHZhciBfaW1nUmVmJGN1cnJlbnQgPSBpbWdSZWYuY3VycmVudCxcbiAgICAgIHdpZHRoID0gX2ltZ1JlZiRjdXJyZW50LndpZHRoLFxuICAgICAgaGVpZ2h0ID0gX2ltZ1JlZiRjdXJyZW50LmhlaWdodCxcbiAgICAgIG9mZnNldFdpZHRoID0gX2ltZ1JlZiRjdXJyZW50Lm9mZnNldFdpZHRoLFxuICAgICAgb2Zmc2V0SGVpZ2h0ID0gX2ltZ1JlZiRjdXJyZW50Lm9mZnNldEhlaWdodCxcbiAgICAgIG9mZnNldExlZnQgPSBfaW1nUmVmJGN1cnJlbnQub2Zmc2V0TGVmdCxcbiAgICAgIG9mZnNldFRvcCA9IF9pbWdSZWYkY3VycmVudC5vZmZzZXRUb3A7XG4gICAgdmFyIG5ld1JhdGlvID0gcmF0aW87XG4gICAgdmFyIG5ld1NjYWxlID0gdHJhbnNmb3JtLnNjYWxlICogcmF0aW87XG4gICAgaWYgKG5ld1NjYWxlID4gbWF4U2NhbGUpIHtcbiAgICAgIG5ld1NjYWxlID0gbWF4U2NhbGU7XG4gICAgICBuZXdSYXRpbyA9IG1heFNjYWxlIC8gdHJhbnNmb3JtLnNjYWxlO1xuICAgIH0gZWxzZSBpZiAobmV3U2NhbGUgPCBtaW5TY2FsZSkge1xuICAgICAgLy8gRm9yIG1vYmlsZSBpbnRlcmFjdGlvbnMsIGFsbG93IHNjYWxpbmcgZG93biB0byB0aGUgbWluaW11bSBzY2FsZS5cbiAgICAgIG5ld1NjYWxlID0gaXNUb3VjaCA/IG5ld1NjYWxlIDogbWluU2NhbGU7XG4gICAgICBuZXdSYXRpbyA9IG5ld1NjYWxlIC8gdHJhbnNmb3JtLnNjYWxlO1xuICAgIH1cblxuICAgIC8qKiBEZWZhdWx0IGNlbnRlciBwb2ludCBzY2FsaW5nICovXG4gICAgdmFyIG1lcmdlZENlbnRlclggPSBjZW50ZXJYICE9PSBudWxsICYmIGNlbnRlclggIT09IHZvaWQgMCA/IGNlbnRlclggOiBpbm5lcldpZHRoIC8gMjtcbiAgICB2YXIgbWVyZ2VkQ2VudGVyWSA9IGNlbnRlclkgIT09IG51bGwgJiYgY2VudGVyWSAhPT0gdm9pZCAwID8gY2VudGVyWSA6IGlubmVySGVpZ2h0IC8gMjtcbiAgICB2YXIgZGlmZlJhdGlvID0gbmV3UmF0aW8gLSAxO1xuICAgIC8qKiBEZXZpYXRpb24gY2FsY3VsYXRlZCBmcm9tIGltYWdlIHNpemUgKi9cbiAgICB2YXIgZGlmZkltZ1ggPSBkaWZmUmF0aW8gKiB3aWR0aCAqIDAuNTtcbiAgICB2YXIgZGlmZkltZ1kgPSBkaWZmUmF0aW8gKiBoZWlnaHQgKiAwLjU7XG4gICAgLyoqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGNsaWNrIHBvc2l0aW9uIGFuZCB0aGUgZWRnZSBvZiB0aGUgZG9jdW1lbnQgKi9cbiAgICB2YXIgZGlmZk9mZnNldExlZnQgPSBkaWZmUmF0aW8gKiAobWVyZ2VkQ2VudGVyWCAtIHRyYW5zZm9ybS54IC0gb2Zmc2V0TGVmdCk7XG4gICAgdmFyIGRpZmZPZmZzZXRUb3AgPSBkaWZmUmF0aW8gKiAobWVyZ2VkQ2VudGVyWSAtIHRyYW5zZm9ybS55IC0gb2Zmc2V0VG9wKTtcbiAgICAvKiogRmluYWwgcG9zaXRpb25pbmcgKi9cbiAgICB2YXIgbmV3WCA9IHRyYW5zZm9ybS54IC0gKGRpZmZPZmZzZXRMZWZ0IC0gZGlmZkltZ1gpO1xuICAgIHZhciBuZXdZID0gdHJhbnNmb3JtLnkgLSAoZGlmZk9mZnNldFRvcCAtIGRpZmZJbWdZKTtcblxuICAgIC8qKlxuICAgICAqIFdoZW4gem9vbWluZyB0aGUgaW1hZ2VcbiAgICAgKiBXaGVuIHRoZSBpbWFnZSBzaXplIGlzIHNtYWxsZXIgdGhhbiB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgd2luZG93LCB0aGUgcG9zaXRpb24gaXMgaW5pdGlhbGl6ZWRcbiAgICAgKi9cbiAgICBpZiAocmF0aW8gPCAxICYmIG5ld1NjYWxlID09PSAxKSB7XG4gICAgICB2YXIgbWVyZ2VkV2lkdGggPSBvZmZzZXRXaWR0aCAqIG5ld1NjYWxlO1xuICAgICAgdmFyIG1lcmdlZEhlaWdodCA9IG9mZnNldEhlaWdodCAqIG5ld1NjYWxlO1xuICAgICAgdmFyIF9nZXRDbGllbnRTaXplID0gZ2V0Q2xpZW50U2l6ZSgpLFxuICAgICAgICBjbGllbnRXaWR0aCA9IF9nZXRDbGllbnRTaXplLndpZHRoLFxuICAgICAgICBjbGllbnRIZWlnaHQgPSBfZ2V0Q2xpZW50U2l6ZS5oZWlnaHQ7XG4gICAgICBpZiAobWVyZ2VkV2lkdGggPD0gY2xpZW50V2lkdGggJiYgbWVyZ2VkSGVpZ2h0IDw9IGNsaWVudEhlaWdodCkge1xuICAgICAgICBuZXdYID0gMDtcbiAgICAgICAgbmV3WSA9IDA7XG4gICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZVRyYW5zZm9ybSh7XG4gICAgICB4OiBuZXdYLFxuICAgICAgeTogbmV3WSxcbiAgICAgIHNjYWxlOiBuZXdTY2FsZVxuICAgIH0sIGFjdGlvbik7XG4gIH07XG4gIHJldHVybiB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm0sXG4gICAgcmVzZXRUcmFuc2Zvcm06IHJlc2V0VHJhbnNmb3JtLFxuICAgIHVwZGF0ZVRyYW5zZm9ybTogdXBkYXRlVHJhbnNmb3JtLFxuICAgIGRpc3BhdGNoWm9vbUNoYW5nZTogZGlzcGF0Y2hab29tQ2hhbmdlXG4gIH07XG59IiwgImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBhZGRFdmVudExpc3RlbmVyIGZyb20gXCJyYy11dGlsL2VzL0RvbS9hZGRFdmVudExpc3RlbmVyXCI7XG5pbXBvcnQgeyB3YXJuaW5nIH0gZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGdldEZpeFNjYWxlRWxlVHJhbnNQb3NpdGlvbiBmcm9tIFwiLi4vZ2V0Rml4U2NhbGVFbGVUcmFuc1Bvc2l0aW9uXCI7XG5pbXBvcnQgeyBCQVNFX1NDQUxFX1JBVElPLCBXSEVFTF9NQVhfU0NBTEVfUkFUSU8gfSBmcm9tIFwiLi4vcHJldmlld0NvbmZpZ1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlTW91c2VFdmVudChpbWdSZWYsIG1vdmFibGUsIHZpc2libGUsIHNjYWxlU3RlcCwgdHJhbnNmb3JtLCB1cGRhdGVUcmFuc2Zvcm0sIGRpc3BhdGNoWm9vbUNoYW5nZSkge1xuICB2YXIgcm90YXRlID0gdHJhbnNmb3JtLnJvdGF0ZSxcbiAgICBzY2FsZSA9IHRyYW5zZm9ybS5zY2FsZSxcbiAgICB4ID0gdHJhbnNmb3JtLngsXG4gICAgeSA9IHRyYW5zZm9ybS55O1xuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUoZmFsc2UpLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIGlzTW92aW5nID0gX3VzZVN0YXRlMlswXSxcbiAgICBzZXRNb3ZpbmcgPSBfdXNlU3RhdGUyWzFdO1xuICB2YXIgc3RhcnRQb3NpdGlvbkluZm8gPSB1c2VSZWYoe1xuICAgIGRpZmZYOiAwLFxuICAgIGRpZmZZOiAwLFxuICAgIHRyYW5zZm9ybVg6IDAsXG4gICAgdHJhbnNmb3JtWTogMFxuICB9KTtcbiAgdmFyIG9uTW91c2VEb3duID0gZnVuY3Rpb24gb25Nb3VzZURvd24oZXZlbnQpIHtcbiAgICAvLyBPbmx5IGFsbG93IG1haW4gYnV0dG9uXG4gICAgaWYgKCFtb3ZhYmxlIHx8IGV2ZW50LmJ1dHRvbiAhPT0gMCkgcmV0dXJuO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgc3RhcnRQb3NpdGlvbkluZm8uY3VycmVudCA9IHtcbiAgICAgIGRpZmZYOiBldmVudC5wYWdlWCAtIHgsXG4gICAgICBkaWZmWTogZXZlbnQucGFnZVkgLSB5LFxuICAgICAgdHJhbnNmb3JtWDogeCxcbiAgICAgIHRyYW5zZm9ybVk6IHlcbiAgICB9O1xuICAgIHNldE1vdmluZyh0cnVlKTtcbiAgfTtcbiAgdmFyIG9uTW91c2VNb3ZlID0gZnVuY3Rpb24gb25Nb3VzZU1vdmUoZXZlbnQpIHtcbiAgICBpZiAodmlzaWJsZSAmJiBpc01vdmluZykge1xuICAgICAgdXBkYXRlVHJhbnNmb3JtKHtcbiAgICAgICAgeDogZXZlbnQucGFnZVggLSBzdGFydFBvc2l0aW9uSW5mby5jdXJyZW50LmRpZmZYLFxuICAgICAgICB5OiBldmVudC5wYWdlWSAtIHN0YXJ0UG9zaXRpb25JbmZvLmN1cnJlbnQuZGlmZllcbiAgICAgIH0sICdtb3ZlJyk7XG4gICAgfVxuICB9O1xuICB2YXIgb25Nb3VzZVVwID0gZnVuY3Rpb24gb25Nb3VzZVVwKCkge1xuICAgIGlmICh2aXNpYmxlICYmIGlzTW92aW5nKSB7XG4gICAgICBzZXRNb3ZpbmcoZmFsc2UpO1xuXG4gICAgICAvKiogTm8gbmVlZCB0byByZXN0b3JlIHRoZSBwb3NpdGlvbiB3aGVuIHRoZSBwaWN0dXJlIGlzIG5vdCBtb3ZlZCwgU28gYXMgbm90IHRvIGludGVyZmVyZSB3aXRoIHRoZSBjbGljayAqL1xuICAgICAgdmFyIF9zdGFydFBvc2l0aW9uSW5mbyRjdSA9IHN0YXJ0UG9zaXRpb25JbmZvLmN1cnJlbnQsXG4gICAgICAgIHRyYW5zZm9ybVggPSBfc3RhcnRQb3NpdGlvbkluZm8kY3UudHJhbnNmb3JtWCxcbiAgICAgICAgdHJhbnNmb3JtWSA9IF9zdGFydFBvc2l0aW9uSW5mbyRjdS50cmFuc2Zvcm1ZO1xuICAgICAgdmFyIGhhc0NoYW5nZWRQb3NpdGlvbiA9IHggIT09IHRyYW5zZm9ybVggJiYgeSAhPT0gdHJhbnNmb3JtWTtcbiAgICAgIGlmICghaGFzQ2hhbmdlZFBvc2l0aW9uKSByZXR1cm47XG4gICAgICB2YXIgd2lkdGggPSBpbWdSZWYuY3VycmVudC5vZmZzZXRXaWR0aCAqIHNjYWxlO1xuICAgICAgdmFyIGhlaWdodCA9IGltZ1JlZi5jdXJyZW50Lm9mZnNldEhlaWdodCAqIHNjYWxlO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1zaGFkb3dcbiAgICAgIHZhciBfaW1nUmVmJGN1cnJlbnQkZ2V0Qm8gPSBpbWdSZWYuY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgbGVmdCA9IF9pbWdSZWYkY3VycmVudCRnZXRCby5sZWZ0LFxuICAgICAgICB0b3AgPSBfaW1nUmVmJGN1cnJlbnQkZ2V0Qm8udG9wO1xuICAgICAgdmFyIGlzUm90YXRlID0gcm90YXRlICUgMTgwICE9PSAwO1xuICAgICAgdmFyIGZpeFN0YXRlID0gZ2V0Rml4U2NhbGVFbGVUcmFuc1Bvc2l0aW9uKGlzUm90YXRlID8gaGVpZ2h0IDogd2lkdGgsIGlzUm90YXRlID8gd2lkdGggOiBoZWlnaHQsIGxlZnQsIHRvcCk7XG4gICAgICBpZiAoZml4U3RhdGUpIHtcbiAgICAgICAgdXBkYXRlVHJhbnNmb3JtKF9vYmplY3RTcHJlYWQoe30sIGZpeFN0YXRlKSwgJ2RyYWdSZWJvdW5kJyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICB2YXIgb25XaGVlbCA9IGZ1bmN0aW9uIG9uV2hlZWwoZXZlbnQpIHtcbiAgICBpZiAoIXZpc2libGUgfHwgZXZlbnQuZGVsdGFZID09IDApIHJldHVybjtcbiAgICAvLyBTY2FsZSByYXRpbyBkZXBlbmRzIG9uIHRoZSBkZWx0YVkgc2l6ZVxuICAgIHZhciBzY2FsZVJhdGlvID0gTWF0aC5hYnMoZXZlbnQuZGVsdGFZIC8gMTAwKTtcbiAgICAvLyBMaW1pdCB0aGUgbWF4aW11bSBzY2FsZSByYXRpb1xuICAgIHZhciBtZXJnZWRTY2FsZVJhdGlvID0gTWF0aC5taW4oc2NhbGVSYXRpbywgV0hFRUxfTUFYX1NDQUxFX1JBVElPKTtcbiAgICAvLyBTY2FsZSB0aGUgcmF0aW8gZWFjaCB0aW1lXG4gICAgdmFyIHJhdGlvID0gQkFTRV9TQ0FMRV9SQVRJTyArIG1lcmdlZFNjYWxlUmF0aW8gKiBzY2FsZVN0ZXA7XG4gICAgaWYgKGV2ZW50LmRlbHRhWSA+IDApIHtcbiAgICAgIHJhdGlvID0gQkFTRV9TQ0FMRV9SQVRJTyAvIHJhdGlvO1xuICAgIH1cbiAgICBkaXNwYXRjaFpvb21DaGFuZ2UocmF0aW8sICd3aGVlbCcsIGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpO1xuICB9O1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBvblRvcE1vdXNlVXBMaXN0ZW5lcjtcbiAgICB2YXIgb25Ub3BNb3VzZU1vdmVMaXN0ZW5lcjtcbiAgICB2YXIgb25Nb3VzZVVwTGlzdGVuZXI7XG4gICAgdmFyIG9uTW91c2VNb3ZlTGlzdGVuZXI7XG4gICAgaWYgKG1vdmFibGUpIHtcbiAgICAgIG9uTW91c2VVcExpc3RlbmVyID0gYWRkRXZlbnRMaXN0ZW5lcih3aW5kb3csICdtb3VzZXVwJywgb25Nb3VzZVVwLCBmYWxzZSk7XG4gICAgICBvbk1vdXNlTW92ZUxpc3RlbmVyID0gYWRkRXZlbnRMaXN0ZW5lcih3aW5kb3csICdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSwgZmFsc2UpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gUmVzb2x2ZSBpZiBpbiBpZnJhbWUgbG9zdCBldmVudFxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICBpZiAod2luZG93LnRvcCAhPT0gd2luZG93LnNlbGYpIHtcbiAgICAgICAgICBvblRvcE1vdXNlVXBMaXN0ZW5lciA9IGFkZEV2ZW50TGlzdGVuZXIod2luZG93LnRvcCwgJ21vdXNldXAnLCBvbk1vdXNlVXAsIGZhbHNlKTtcbiAgICAgICAgICBvblRvcE1vdXNlTW92ZUxpc3RlbmVyID0gYWRkRXZlbnRMaXN0ZW5lcih3aW5kb3cudG9wLCAnbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgd2FybmluZyhmYWxzZSwgXCJbcmMtaW1hZ2VdIFwiLmNvbmNhdChlcnJvcikpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9vbk1vdXNlVXBMaXN0ZW5lciwgX29uTW91c2VNb3ZlTGlzdGVuZXIsIF9vblRvcE1vdXNlVXBMaXN0ZW5lciwgX29uVG9wTW91c2VNb3ZlTGlzdGVuO1xuICAgICAgKF9vbk1vdXNlVXBMaXN0ZW5lciA9IG9uTW91c2VVcExpc3RlbmVyKSA9PT0gbnVsbCB8fCBfb25Nb3VzZVVwTGlzdGVuZXIgPT09IHZvaWQgMCB8fCBfb25Nb3VzZVVwTGlzdGVuZXIucmVtb3ZlKCk7XG4gICAgICAoX29uTW91c2VNb3ZlTGlzdGVuZXIgPSBvbk1vdXNlTW92ZUxpc3RlbmVyKSA9PT0gbnVsbCB8fCBfb25Nb3VzZU1vdmVMaXN0ZW5lciA9PT0gdm9pZCAwIHx8IF9vbk1vdXNlTW92ZUxpc3RlbmVyLnJlbW92ZSgpO1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIChfb25Ub3BNb3VzZVVwTGlzdGVuZXIgPSBvblRvcE1vdXNlVXBMaXN0ZW5lcikgPT09IG51bGwgfHwgX29uVG9wTW91c2VVcExpc3RlbmVyID09PSB2b2lkIDAgfHwgX29uVG9wTW91c2VVcExpc3RlbmVyLnJlbW92ZSgpO1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIChfb25Ub3BNb3VzZU1vdmVMaXN0ZW4gPSBvblRvcE1vdXNlTW92ZUxpc3RlbmVyKSA9PT0gbnVsbCB8fCBfb25Ub3BNb3VzZU1vdmVMaXN0ZW4gPT09IHZvaWQgMCB8fCBfb25Ub3BNb3VzZU1vdmVMaXN0ZW4ucmVtb3ZlKCk7XG4gICAgfTtcbiAgfSwgW3Zpc2libGUsIGlzTW92aW5nLCB4LCB5LCByb3RhdGUsIG1vdmFibGVdKTtcbiAgcmV0dXJuIHtcbiAgICBpc01vdmluZzogaXNNb3ZpbmcsXG4gICAgb25Nb3VzZURvd246IG9uTW91c2VEb3duLFxuICAgIG9uTW91c2VNb3ZlOiBvbk1vdXNlTW92ZSxcbiAgICBvbk1vdXNlVXA6IG9uTW91c2VVcCxcbiAgICBvbldoZWVsOiBvbldoZWVsXG4gIH07XG59IiwgImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IHsgZ2V0Q2xpZW50U2l6ZSB9IGZyb20gXCJyYy11dGlsL2VzL0RvbS9jc3NcIjtcbmZ1bmN0aW9uIGZpeFBvaW50KGtleSwgc3RhcnQsIHdpZHRoLCBjbGllbnRXaWR0aCkge1xuICB2YXIgc3RhcnRBZGRXaWR0aCA9IHN0YXJ0ICsgd2lkdGg7XG4gIHZhciBvZmZzZXRTdGFydCA9ICh3aWR0aCAtIGNsaWVudFdpZHRoKSAvIDI7XG4gIGlmICh3aWR0aCA+IGNsaWVudFdpZHRoKSB7XG4gICAgaWYgKHN0YXJ0ID4gMCkge1xuICAgICAgcmV0dXJuIF9kZWZpbmVQcm9wZXJ0eSh7fSwga2V5LCBvZmZzZXRTdGFydCk7XG4gICAgfVxuICAgIGlmIChzdGFydCA8IDAgJiYgc3RhcnRBZGRXaWR0aCA8IGNsaWVudFdpZHRoKSB7XG4gICAgICByZXR1cm4gX2RlZmluZVByb3BlcnR5KHt9LCBrZXksIC1vZmZzZXRTdGFydCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydEFkZFdpZHRoID4gY2xpZW50V2lkdGgpIHtcbiAgICByZXR1cm4gX2RlZmluZVByb3BlcnR5KHt9LCBrZXksIHN0YXJ0IDwgMCA/IG9mZnNldFN0YXJ0IDogLW9mZnNldFN0YXJ0KTtcbiAgfVxuICByZXR1cm4ge307XG59XG5cbi8qKlxuICogRml4IHBvc2l0b24geCx5IHBvaW50IHdoZW5cbiAqXG4gKiBFbGUgd2lkdGggJiYgaGVpZ2h0IDwgY2xpZW50XG4gKiAtIEJhY2sgb3JpZ2luXG4gKlxuICogLSBFbGUgd2lkdGggfCBoZWlnaHQgPiBjbGllbnRXaWR0aCB8IGNsaWVudEhlaWdodFxuICogLSBsZWZ0IHwgdG9wID4gMCAtPiBCYWNrIDBcbiAqIC0gbGVmdCB8IHRvcCArIHdpZHRoIHwgaGVpZ2h0IDwgY2xpZW50V2lkdGggfCBjbGllbnRIZWlnaHQgLT4gQmFjayBsZWZ0IHwgdG9wICsgd2lkdGggfCBoZWlnaHQgPT09IGNsaWVudFdpZHRoIHwgY2xpZW50SGVpZ2h0XG4gKlxuICogUmVnYXJkbGVzcyBvZiBvdGhlclxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRGaXhTY2FsZUVsZVRyYW5zUG9zaXRpb24od2lkdGgsIGhlaWdodCwgbGVmdCwgdG9wKSB7XG4gIHZhciBfZ2V0Q2xpZW50U2l6ZSA9IGdldENsaWVudFNpemUoKSxcbiAgICBjbGllbnRXaWR0aCA9IF9nZXRDbGllbnRTaXplLndpZHRoLFxuICAgIGNsaWVudEhlaWdodCA9IF9nZXRDbGllbnRTaXplLmhlaWdodDtcbiAgdmFyIGZpeFBvcyA9IG51bGw7XG4gIGlmICh3aWR0aCA8PSBjbGllbnRXaWR0aCAmJiBoZWlnaHQgPD0gY2xpZW50SGVpZ2h0KSB7XG4gICAgZml4UG9zID0ge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDBcbiAgICB9O1xuICB9IGVsc2UgaWYgKHdpZHRoID4gY2xpZW50V2lkdGggfHwgaGVpZ2h0ID4gY2xpZW50SGVpZ2h0KSB7XG4gICAgZml4UG9zID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBmaXhQb2ludCgneCcsIGxlZnQsIHdpZHRoLCBjbGllbnRXaWR0aCkpLCBmaXhQb2ludCgneScsIHRvcCwgaGVpZ2h0LCBjbGllbnRIZWlnaHQpKTtcbiAgfVxuICByZXR1cm4gZml4UG9zO1xufSIsICIvKiogU2NhbGUgdGhlIHJhdGlvIGJhc2UgKi9cbmV4cG9ydCB2YXIgQkFTRV9TQ0FMRV9SQVRJTyA9IDE7XG4vKiogVGhlIG1heGltdW0gem9vbSByYXRpbyB3aGVuIHRoZSBtb3VzZSB6b29tcyBpbiwgYWRqdXN0YWJsZSAqL1xuZXhwb3J0IHZhciBXSEVFTF9NQVhfU0NBTEVfUkFUSU8gPSAxOyIsICJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGlzSW1hZ2VWYWxpZCB9IGZyb20gXCIuLi91dGlsXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VTdGF0dXMoX3JlZikge1xuICB2YXIgc3JjID0gX3JlZi5zcmMsXG4gICAgaXNDdXN0b21QbGFjZWhvbGRlciA9IF9yZWYuaXNDdXN0b21QbGFjZWhvbGRlcixcbiAgICBmYWxsYmFjayA9IF9yZWYuZmFsbGJhY2s7XG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZShpc0N1c3RvbVBsYWNlaG9sZGVyID8gJ2xvYWRpbmcnIDogJ25vcm1hbCcpLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIHN0YXR1cyA9IF91c2VTdGF0ZTJbMF0sXG4gICAgc2V0U3RhdHVzID0gX3VzZVN0YXRlMlsxXTtcbiAgdmFyIGlzTG9hZGVkID0gdXNlUmVmKGZhbHNlKTtcbiAgdmFyIGlzRXJyb3IgPSBzdGF0dXMgPT09ICdlcnJvcic7XG5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LWNvbXBvbmVudC9pbWFnZS9wdWxsLzE4N1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBpc0N1cnJlbnRTcmMgPSB0cnVlO1xuICAgIGlzSW1hZ2VWYWxpZChzcmMpLnRoZW4oZnVuY3Rpb24gKGlzVmFsaWQpIHtcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzQ0OTQ4XG4gICAgICAvLyBJZiBzcmMgY2hhbmdlcywgdGhlIHByZXZpb3VzIHNldFN0YXR1cyBzaG91bGQgbm90IGJlIHRyaWdnZXJlZFxuICAgICAgaWYgKCFpc1ZhbGlkICYmIGlzQ3VycmVudFNyYykge1xuICAgICAgICBzZXRTdGF0dXMoJ2Vycm9yJyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlzQ3VycmVudFNyYyA9IGZhbHNlO1xuICAgIH07XG4gIH0sIFtzcmNdKTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoaXNDdXN0b21QbGFjZWhvbGRlciAmJiAhaXNMb2FkZWQuY3VycmVudCkge1xuICAgICAgc2V0U3RhdHVzKCdsb2FkaW5nJyk7XG4gICAgfSBlbHNlIGlmIChpc0Vycm9yKSB7XG4gICAgICBzZXRTdGF0dXMoJ25vcm1hbCcpO1xuICAgIH1cbiAgfSwgW3NyY10pO1xuICB2YXIgb25Mb2FkID0gZnVuY3Rpb24gb25Mb2FkKCkge1xuICAgIHNldFN0YXR1cygnbm9ybWFsJyk7XG4gIH07XG4gIHZhciBnZXRJbWdSZWYgPSBmdW5jdGlvbiBnZXRJbWdSZWYoaW1nKSB7XG4gICAgaXNMb2FkZWQuY3VycmVudCA9IGZhbHNlO1xuICAgIGlmIChzdGF0dXMgPT09ICdsb2FkaW5nJyAmJiBpbWcgIT09IG51bGwgJiYgaW1nICE9PSB2b2lkIDAgJiYgaW1nLmNvbXBsZXRlICYmIChpbWcubmF0dXJhbFdpZHRoIHx8IGltZy5uYXR1cmFsSGVpZ2h0KSkge1xuICAgICAgaXNMb2FkZWQuY3VycmVudCA9IHRydWU7XG4gICAgICBvbkxvYWQoKTtcbiAgICB9XG4gIH07XG4gIHZhciBzcmNBbmRPbmxvYWQgPSBpc0Vycm9yICYmIGZhbGxiYWNrID8ge1xuICAgIHNyYzogZmFsbGJhY2tcbiAgfSA6IHtcbiAgICBvbkxvYWQ6IG9uTG9hZCxcbiAgICBzcmM6IHNyY1xuICB9O1xuICByZXR1cm4gW2dldEltZ1JlZiwgc3JjQW5kT25sb2FkLCBzdGF0dXNdO1xufSIsICJleHBvcnQgZnVuY3Rpb24gaXNJbWFnZVZhbGlkKHNyYykge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICBpZiAoIXNyYykge1xuICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcbiAgICBpbWcub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiByZXNvbHZlKGZhbHNlKTtcbiAgICB9O1xuICAgIGltZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZSh0cnVlKTtcbiAgICB9O1xuICAgIGltZy5zcmMgPSBzcmM7XG4gIH0pO1xufSIsICJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgYWRkRXZlbnRMaXN0ZW5lciBmcm9tIFwicmMtdXRpbC9lcy9Eb20vYWRkRXZlbnRMaXN0ZW5lclwiO1xuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGdldEZpeFNjYWxlRWxlVHJhbnNQb3NpdGlvbiBmcm9tIFwiLi4vZ2V0Rml4U2NhbGVFbGVUcmFuc1Bvc2l0aW9uXCI7XG5mdW5jdGlvbiBnZXREaXN0YW5jZShhLCBiKSB7XG4gIHZhciB4ID0gYS54IC0gYi54O1xuICB2YXIgeSA9IGEueSAtIGIueTtcbiAgcmV0dXJuIE1hdGguaHlwb3QoeCwgeSk7XG59XG5mdW5jdGlvbiBnZXRDZW50ZXIob2xkUG9pbnQxLCBvbGRQb2ludDIsIG5ld1BvaW50MSwgbmV3UG9pbnQyKSB7XG4gIC8vIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgZWFjaCBwb2ludCBoYXMgbW92ZWRcbiAgdmFyIGRpc3RhbmNlMSA9IGdldERpc3RhbmNlKG9sZFBvaW50MSwgbmV3UG9pbnQxKTtcbiAgdmFyIGRpc3RhbmNlMiA9IGdldERpc3RhbmNlKG9sZFBvaW50MiwgbmV3UG9pbnQyKTtcblxuICAvLyBJZiBib3RoIGRpc3RhbmNlcyBhcmUgMCwgcmV0dXJuIHRoZSBvcmlnaW5hbCBwb2ludHNcbiAgaWYgKGRpc3RhbmNlMSA9PT0gMCAmJiBkaXN0YW5jZTIgPT09IDApIHtcbiAgICByZXR1cm4gW29sZFBvaW50MS54LCBvbGRQb2ludDEueV07XG4gIH1cblxuICAvLyBDYWxjdWxhdGUgdGhlIHJhdGlvIG9mIHRoZSBkaXN0YW5jZXNcbiAgdmFyIHJhdGlvID0gZGlzdGFuY2UxIC8gKGRpc3RhbmNlMSArIGRpc3RhbmNlMik7XG5cbiAgLy8gQ2FsY3VsYXRlIHRoZSBuZXcgY2VudGVyIHBvaW50IGJhc2VkIG9uIHRoZSByYXRpb1xuICB2YXIgeCA9IG9sZFBvaW50MS54ICsgcmF0aW8gKiAob2xkUG9pbnQyLnggLSBvbGRQb2ludDEueCk7XG4gIHZhciB5ID0gb2xkUG9pbnQxLnkgKyByYXRpbyAqIChvbGRQb2ludDIueSAtIG9sZFBvaW50MS55KTtcbiAgcmV0dXJuIFt4LCB5XTtcbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVRvdWNoRXZlbnQoaW1nUmVmLCBtb3ZhYmxlLCB2aXNpYmxlLCBtaW5TY2FsZSwgdHJhbnNmb3JtLCB1cGRhdGVUcmFuc2Zvcm0sIGRpc3BhdGNoWm9vbUNoYW5nZSkge1xuICB2YXIgcm90YXRlID0gdHJhbnNmb3JtLnJvdGF0ZSxcbiAgICBzY2FsZSA9IHRyYW5zZm9ybS5zY2FsZSxcbiAgICB4ID0gdHJhbnNmb3JtLngsXG4gICAgeSA9IHRyYW5zZm9ybS55O1xuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUoZmFsc2UpLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIGlzVG91Y2hpbmcgPSBfdXNlU3RhdGUyWzBdLFxuICAgIHNldElzVG91Y2hpbmcgPSBfdXNlU3RhdGUyWzFdO1xuICB2YXIgdG91Y2hQb2ludEluZm8gPSB1c2VSZWYoe1xuICAgIHBvaW50MToge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDBcbiAgICB9LFxuICAgIHBvaW50Mjoge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDBcbiAgICB9LFxuICAgIGV2ZW50VHlwZTogJ25vbmUnXG4gIH0pO1xuICB2YXIgdXBkYXRlVG91Y2hQb2ludEluZm8gPSBmdW5jdGlvbiB1cGRhdGVUb3VjaFBvaW50SW5mbyh2YWx1ZXMpIHtcbiAgICB0b3VjaFBvaW50SW5mby5jdXJyZW50ID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB0b3VjaFBvaW50SW5mby5jdXJyZW50KSwgdmFsdWVzKTtcbiAgfTtcbiAgdmFyIG9uVG91Y2hTdGFydCA9IGZ1bmN0aW9uIG9uVG91Y2hTdGFydChldmVudCkge1xuICAgIGlmICghbW92YWJsZSkgcmV0dXJuO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHNldElzVG91Y2hpbmcodHJ1ZSk7XG4gICAgdmFyIF9ldmVudCR0b3VjaGVzID0gZXZlbnQudG91Y2hlcyxcbiAgICAgIHRvdWNoZXMgPSBfZXZlbnQkdG91Y2hlcyA9PT0gdm9pZCAwID8gW10gOiBfZXZlbnQkdG91Y2hlcztcbiAgICBpZiAodG91Y2hlcy5sZW5ndGggPiAxKSB7XG4gICAgICAvLyB0b3VjaCB6b29tXG4gICAgICB1cGRhdGVUb3VjaFBvaW50SW5mbyh7XG4gICAgICAgIHBvaW50MToge1xuICAgICAgICAgIHg6IHRvdWNoZXNbMF0uY2xpZW50WCxcbiAgICAgICAgICB5OiB0b3VjaGVzWzBdLmNsaWVudFlcbiAgICAgICAgfSxcbiAgICAgICAgcG9pbnQyOiB7XG4gICAgICAgICAgeDogdG91Y2hlc1sxXS5jbGllbnRYLFxuICAgICAgICAgIHk6IHRvdWNoZXNbMV0uY2xpZW50WVxuICAgICAgICB9LFxuICAgICAgICBldmVudFR5cGU6ICd0b3VjaFpvb20nXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdG91Y2ggbW92ZVxuICAgICAgdXBkYXRlVG91Y2hQb2ludEluZm8oe1xuICAgICAgICBwb2ludDE6IHtcbiAgICAgICAgICB4OiB0b3VjaGVzWzBdLmNsaWVudFggLSB4LFxuICAgICAgICAgIHk6IHRvdWNoZXNbMF0uY2xpZW50WSAtIHlcbiAgICAgICAgfSxcbiAgICAgICAgZXZlbnRUeXBlOiAnbW92ZSdcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgdmFyIG9uVG91Y2hNb3ZlID0gZnVuY3Rpb24gb25Ub3VjaE1vdmUoZXZlbnQpIHtcbiAgICB2YXIgX2V2ZW50JHRvdWNoZXMyID0gZXZlbnQudG91Y2hlcyxcbiAgICAgIHRvdWNoZXMgPSBfZXZlbnQkdG91Y2hlczIgPT09IHZvaWQgMCA/IFtdIDogX2V2ZW50JHRvdWNoZXMyO1xuICAgIHZhciBfdG91Y2hQb2ludEluZm8kY3VycmUgPSB0b3VjaFBvaW50SW5mby5jdXJyZW50LFxuICAgICAgcG9pbnQxID0gX3RvdWNoUG9pbnRJbmZvJGN1cnJlLnBvaW50MSxcbiAgICAgIHBvaW50MiA9IF90b3VjaFBvaW50SW5mbyRjdXJyZS5wb2ludDIsXG4gICAgICBldmVudFR5cGUgPSBfdG91Y2hQb2ludEluZm8kY3VycmUuZXZlbnRUeXBlO1xuICAgIGlmICh0b3VjaGVzLmxlbmd0aCA+IDEgJiYgZXZlbnRUeXBlID09PSAndG91Y2hab29tJykge1xuICAgICAgLy8gdG91Y2ggem9vbVxuICAgICAgdmFyIG5ld1BvaW50MSA9IHtcbiAgICAgICAgeDogdG91Y2hlc1swXS5jbGllbnRYLFxuICAgICAgICB5OiB0b3VjaGVzWzBdLmNsaWVudFlcbiAgICAgIH07XG4gICAgICB2YXIgbmV3UG9pbnQyID0ge1xuICAgICAgICB4OiB0b3VjaGVzWzFdLmNsaWVudFgsXG4gICAgICAgIHk6IHRvdWNoZXNbMV0uY2xpZW50WVxuICAgICAgfTtcbiAgICAgIHZhciBfZ2V0Q2VudGVyID0gZ2V0Q2VudGVyKHBvaW50MSwgcG9pbnQyLCBuZXdQb2ludDEsIG5ld1BvaW50MiksXG4gICAgICAgIF9nZXRDZW50ZXIyID0gX3NsaWNlZFRvQXJyYXkoX2dldENlbnRlciwgMiksXG4gICAgICAgIGNlbnRlclggPSBfZ2V0Q2VudGVyMlswXSxcbiAgICAgICAgY2VudGVyWSA9IF9nZXRDZW50ZXIyWzFdO1xuICAgICAgdmFyIHJhdGlvID0gZ2V0RGlzdGFuY2UobmV3UG9pbnQxLCBuZXdQb2ludDIpIC8gZ2V0RGlzdGFuY2UocG9pbnQxLCBwb2ludDIpO1xuICAgICAgZGlzcGF0Y2hab29tQ2hhbmdlKHJhdGlvLCAndG91Y2hab29tJywgY2VudGVyWCwgY2VudGVyWSwgdHJ1ZSk7XG4gICAgICB1cGRhdGVUb3VjaFBvaW50SW5mbyh7XG4gICAgICAgIHBvaW50MTogbmV3UG9pbnQxLFxuICAgICAgICBwb2ludDI6IG5ld1BvaW50MixcbiAgICAgICAgZXZlbnRUeXBlOiAndG91Y2hab29tJ1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09ICdtb3ZlJykge1xuICAgICAgLy8gdG91Y2ggbW92ZVxuICAgICAgdXBkYXRlVHJhbnNmb3JtKHtcbiAgICAgICAgeDogdG91Y2hlc1swXS5jbGllbnRYIC0gcG9pbnQxLngsXG4gICAgICAgIHk6IHRvdWNoZXNbMF0uY2xpZW50WSAtIHBvaW50MS55XG4gICAgICB9LCAnbW92ZScpO1xuICAgICAgdXBkYXRlVG91Y2hQb2ludEluZm8oe1xuICAgICAgICBldmVudFR5cGU6ICdtb3ZlJ1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICB2YXIgb25Ub3VjaEVuZCA9IGZ1bmN0aW9uIG9uVG91Y2hFbmQoKSB7XG4gICAgaWYgKCF2aXNpYmxlKSByZXR1cm47XG4gICAgaWYgKGlzVG91Y2hpbmcpIHtcbiAgICAgIHNldElzVG91Y2hpbmcoZmFsc2UpO1xuICAgIH1cbiAgICB1cGRhdGVUb3VjaFBvaW50SW5mbyh7XG4gICAgICBldmVudFR5cGU6ICdub25lJ1xuICAgIH0pO1xuICAgIGlmIChtaW5TY2FsZSA+IHNjYWxlKSB7XG4gICAgICAvKiogV2hlbiB0aGUgc2NhbGluZyByYXRpbyBpcyBsZXNzIHRoYW4gdGhlIG1pbmltdW0gc2NhbGluZyByYXRpbywgcmVzZXQgdGhlIHNjYWxpbmcgcmF0aW8gKi9cbiAgICAgIHJldHVybiB1cGRhdGVUcmFuc2Zvcm0oe1xuICAgICAgICB4OiAwLFxuICAgICAgICB5OiAwLFxuICAgICAgICBzY2FsZTogbWluU2NhbGVcbiAgICAgIH0sICd0b3VjaFpvb20nKTtcbiAgICB9XG4gICAgdmFyIHdpZHRoID0gaW1nUmVmLmN1cnJlbnQub2Zmc2V0V2lkdGggKiBzY2FsZTtcbiAgICB2YXIgaGVpZ2h0ID0gaW1nUmVmLmN1cnJlbnQub2Zmc2V0SGVpZ2h0ICogc2NhbGU7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1zaGFkb3dcbiAgICB2YXIgX2ltZ1JlZiRjdXJyZW50JGdldEJvID0gaW1nUmVmLmN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICBsZWZ0ID0gX2ltZ1JlZiRjdXJyZW50JGdldEJvLmxlZnQsXG4gICAgICB0b3AgPSBfaW1nUmVmJGN1cnJlbnQkZ2V0Qm8udG9wO1xuICAgIHZhciBpc1JvdGF0ZSA9IHJvdGF0ZSAlIDE4MCAhPT0gMDtcbiAgICB2YXIgZml4U3RhdGUgPSBnZXRGaXhTY2FsZUVsZVRyYW5zUG9zaXRpb24oaXNSb3RhdGUgPyBoZWlnaHQgOiB3aWR0aCwgaXNSb3RhdGUgPyB3aWR0aCA6IGhlaWdodCwgbGVmdCwgdG9wKTtcbiAgICBpZiAoZml4U3RhdGUpIHtcbiAgICAgIHVwZGF0ZVRyYW5zZm9ybShfb2JqZWN0U3ByZWFkKHt9LCBmaXhTdGF0ZSksICdkcmFnUmVib3VuZCcpO1xuICAgIH1cbiAgfTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgb25Ub3VjaE1vdmVMaXN0ZW5lcjtcbiAgICBpZiAodmlzaWJsZSAmJiBtb3ZhYmxlKSB7XG4gICAgICBvblRvdWNoTW92ZUxpc3RlbmVyID0gYWRkRXZlbnRMaXN0ZW5lcih3aW5kb3csICd0b3VjaG1vdmUnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfSwge1xuICAgICAgICBwYXNzaXZlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX29uVG91Y2hNb3ZlTGlzdGVuZXI7XG4gICAgICAoX29uVG91Y2hNb3ZlTGlzdGVuZXIgPSBvblRvdWNoTW92ZUxpc3RlbmVyKSA9PT0gbnVsbCB8fCBfb25Ub3VjaE1vdmVMaXN0ZW5lciA9PT0gdm9pZCAwIHx8IF9vblRvdWNoTW92ZUxpc3RlbmVyLnJlbW92ZSgpO1xuICAgIH07XG4gIH0sIFt2aXNpYmxlLCBtb3ZhYmxlXSk7XG4gIHJldHVybiB7XG4gICAgaXNUb3VjaGluZzogaXNUb3VjaGluZyxcbiAgICBvblRvdWNoU3RhcnQ6IG9uVG91Y2hTdGFydCxcbiAgICBvblRvdWNoTW92ZTogb25Ub3VjaE1vdmUsXG4gICAgb25Ub3VjaEVuZDogb25Ub3VjaEVuZFxuICB9O1xufSIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJ2aXNpYmxlXCIsIFwib25WaXNpYmxlQ2hhbmdlXCIsIFwiZ2V0Q29udGFpbmVyXCIsIFwiY3VycmVudFwiLCBcIm1vdmFibGVcIiwgXCJtaW5TY2FsZVwiLCBcIm1heFNjYWxlXCIsIFwiY291bnRSZW5kZXJcIiwgXCJjbG9zZUljb25cIiwgXCJvbkNoYW5nZVwiLCBcIm9uVHJhbnNmb3JtXCIsIFwidG9vbGJhclJlbmRlclwiLCBcImltYWdlUmVuZGVyXCJdLFxuICBfZXhjbHVkZWQyID0gW1wic3JjXCJdO1xuaW1wb3J0IHVzZU1lcmdlZFN0YXRlIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZU1lcmdlZFN0YXRlXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcmV2aWV3IGZyb20gXCIuL1ByZXZpZXdcIjtcbmltcG9ydCB7IFByZXZpZXdHcm91cENvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0XCI7XG5pbXBvcnQgdXNlUHJldmlld0l0ZW1zIGZyb20gXCIuL2hvb2tzL3VzZVByZXZpZXdJdGVtc1wiO1xudmFyIEdyb3VwID0gZnVuY3Rpb24gR3JvdXAoX3JlZikge1xuICB2YXIgX21lcmdlZEl0ZW1zJGN1cnJlbnQ7XG4gIHZhciBfcmVmJHByZXZpZXdQcmVmaXhDbHMgPSBfcmVmLnByZXZpZXdQcmVmaXhDbHMsXG4gICAgcHJldmlld1ByZWZpeENscyA9IF9yZWYkcHJldmlld1ByZWZpeENscyA9PT0gdm9pZCAwID8gJ3JjLWltYWdlLXByZXZpZXcnIDogX3JlZiRwcmV2aWV3UHJlZml4Q2xzLFxuICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICBfcmVmJGljb25zID0gX3JlZi5pY29ucyxcbiAgICBpY29ucyA9IF9yZWYkaWNvbnMgPT09IHZvaWQgMCA/IHt9IDogX3JlZiRpY29ucyxcbiAgICBpdGVtcyA9IF9yZWYuaXRlbXMsXG4gICAgcHJldmlldyA9IF9yZWYucHJldmlldyxcbiAgICBmYWxsYmFjayA9IF9yZWYuZmFsbGJhY2s7XG4gIHZhciBfcmVmMiA9IF90eXBlb2YocHJldmlldykgPT09ICdvYmplY3QnID8gcHJldmlldyA6IHt9LFxuICAgIHByZXZpZXdWaXNpYmxlID0gX3JlZjIudmlzaWJsZSxcbiAgICBvblZpc2libGVDaGFuZ2UgPSBfcmVmMi5vblZpc2libGVDaGFuZ2UsXG4gICAgZ2V0Q29udGFpbmVyID0gX3JlZjIuZ2V0Q29udGFpbmVyLFxuICAgIGN1cnJlbnRJbmRleCA9IF9yZWYyLmN1cnJlbnQsXG4gICAgbW92YWJsZSA9IF9yZWYyLm1vdmFibGUsXG4gICAgbWluU2NhbGUgPSBfcmVmMi5taW5TY2FsZSxcbiAgICBtYXhTY2FsZSA9IF9yZWYyLm1heFNjYWxlLFxuICAgIGNvdW50UmVuZGVyID0gX3JlZjIuY291bnRSZW5kZXIsXG4gICAgY2xvc2VJY29uID0gX3JlZjIuY2xvc2VJY29uLFxuICAgIG9uQ2hhbmdlID0gX3JlZjIub25DaGFuZ2UsXG4gICAgb25UcmFuc2Zvcm0gPSBfcmVmMi5vblRyYW5zZm9ybSxcbiAgICB0b29sYmFyUmVuZGVyID0gX3JlZjIudG9vbGJhclJlbmRlcixcbiAgICBpbWFnZVJlbmRlciA9IF9yZWYyLmltYWdlUmVuZGVyLFxuICAgIGRpYWxvZ1Byb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYyLCBfZXhjbHVkZWQpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IEl0ZW1zID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX3VzZVByZXZpZXdJdGVtcyA9IHVzZVByZXZpZXdJdGVtcyhpdGVtcyksXG4gICAgX3VzZVByZXZpZXdJdGVtczIgPSBfc2xpY2VkVG9BcnJheShfdXNlUHJldmlld0l0ZW1zLCAzKSxcbiAgICBtZXJnZWRJdGVtcyA9IF91c2VQcmV2aWV3SXRlbXMyWzBdLFxuICAgIHJlZ2lzdGVyID0gX3VzZVByZXZpZXdJdGVtczJbMV0sXG4gICAgZnJvbUl0ZW1zID0gX3VzZVByZXZpZXdJdGVtczJbMl07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBQcmV2aWV3ID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vID4+PiBJbmRleFxuICB2YXIgX3VzZU1lcmdlZFN0YXRlID0gdXNlTWVyZ2VkU3RhdGUoMCwge1xuICAgICAgdmFsdWU6IGN1cnJlbnRJbmRleFxuICAgIH0pLFxuICAgIF91c2VNZXJnZWRTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlTWVyZ2VkU3RhdGUsIDIpLFxuICAgIGN1cnJlbnQgPSBfdXNlTWVyZ2VkU3RhdGUyWzBdLFxuICAgIHNldEN1cnJlbnQgPSBfdXNlTWVyZ2VkU3RhdGUyWzFdO1xuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUoZmFsc2UpLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIGtlZXBPcGVuSW5kZXggPSBfdXNlU3RhdGUyWzBdLFxuICAgIHNldEtlZXBPcGVuSW5kZXggPSBfdXNlU3RhdGUyWzFdO1xuXG4gIC8vID4+PiBJbWFnZVxuICB2YXIgX3JlZjMgPSAoKF9tZXJnZWRJdGVtcyRjdXJyZW50ID0gbWVyZ2VkSXRlbXNbY3VycmVudF0pID09PSBudWxsIHx8IF9tZXJnZWRJdGVtcyRjdXJyZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfbWVyZ2VkSXRlbXMkY3VycmVudC5kYXRhKSB8fCB7fSxcbiAgICBzcmMgPSBfcmVmMy5zcmMsXG4gICAgaW1nQ29tbW9uUHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZjMsIF9leGNsdWRlZDIpO1xuICAvLyA+Pj4gVmlzaWJsZVxuICB2YXIgX3VzZU1lcmdlZFN0YXRlMyA9IHVzZU1lcmdlZFN0YXRlKCEhcHJldmlld1Zpc2libGUsIHtcbiAgICAgIHZhbHVlOiBwcmV2aWV3VmlzaWJsZSxcbiAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbiBvbkNoYW5nZSh2YWwsIHByZXZWYWwpIHtcbiAgICAgICAgb25WaXNpYmxlQ2hhbmdlID09PSBudWxsIHx8IG9uVmlzaWJsZUNoYW5nZSA9PT0gdm9pZCAwIHx8IG9uVmlzaWJsZUNoYW5nZSh2YWwsIHByZXZWYWwsIGN1cnJlbnQpO1xuICAgICAgfVxuICAgIH0pLFxuICAgIF91c2VNZXJnZWRTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfdXNlTWVyZ2VkU3RhdGUzLCAyKSxcbiAgICBpc1Nob3dQcmV2aWV3ID0gX3VzZU1lcmdlZFN0YXRlNFswXSxcbiAgICBzZXRTaG93UHJldmlldyA9IF91c2VNZXJnZWRTdGF0ZTRbMV07XG5cbiAgLy8gPj4+IFBvc2l0aW9uXG4gIHZhciBfdXNlU3RhdGUzID0gdXNlU3RhdGUobnVsbCksXG4gICAgX3VzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZTMsIDIpLFxuICAgIG1vdXNlUG9zaXRpb24gPSBfdXNlU3RhdGU0WzBdLFxuICAgIHNldE1vdXNlUG9zaXRpb24gPSBfdXNlU3RhdGU0WzFdO1xuICB2YXIgb25QcmV2aWV3RnJvbUltYWdlID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGlkLCBpbWFnZVNyYywgbW91c2VYLCBtb3VzZVkpIHtcbiAgICB2YXIgaW5kZXggPSBmcm9tSXRlbXMgPyBtZXJnZWRJdGVtcy5maW5kSW5kZXgoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBpdGVtLmRhdGEuc3JjID09PSBpbWFnZVNyYztcbiAgICB9KSA6IG1lcmdlZEl0ZW1zLmZpbmRJbmRleChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIGl0ZW0uaWQgPT09IGlkO1xuICAgIH0pO1xuICAgIHNldEN1cnJlbnQoaW5kZXggPCAwID8gMCA6IGluZGV4KTtcbiAgICBzZXRTaG93UHJldmlldyh0cnVlKTtcbiAgICBzZXRNb3VzZVBvc2l0aW9uKHtcbiAgICAgIHg6IG1vdXNlWCxcbiAgICAgIHk6IG1vdXNlWVxuICAgIH0pO1xuICAgIHNldEtlZXBPcGVuSW5kZXgodHJ1ZSk7XG4gIH0sIFttZXJnZWRJdGVtcywgZnJvbUl0ZW1zXSk7XG5cbiAgLy8gUmVzZXQgY3VycmVudCB3aGVuIHJlb3BlblxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChpc1Nob3dQcmV2aWV3KSB7XG4gICAgICBpZiAoIWtlZXBPcGVuSW5kZXgpIHtcbiAgICAgICAgc2V0Q3VycmVudCgwKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc2V0S2VlcE9wZW5JbmRleChmYWxzZSk7XG4gICAgfVxuICB9LCBbaXNTaG93UHJldmlld10pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IEV2ZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgb25JbnRlcm5hbENoYW5nZSA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxDaGFuZ2UobmV4dCwgcHJldikge1xuICAgIHNldEN1cnJlbnQobmV4dCk7XG4gICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCB8fCBvbkNoYW5nZShuZXh0LCBwcmV2KTtcbiAgfTtcbiAgdmFyIG9uUHJldmlld0Nsb3NlID0gZnVuY3Rpb24gb25QcmV2aWV3Q2xvc2UoKSB7XG4gICAgc2V0U2hvd1ByZXZpZXcoZmFsc2UpO1xuICAgIHNldE1vdXNlUG9zaXRpb24obnVsbCk7XG4gIH07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBDb250ZXh0ID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBwcmV2aWV3R3JvdXBDb250ZXh0ID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlZ2lzdGVyOiByZWdpc3RlcixcbiAgICAgIG9uUHJldmlldzogb25QcmV2aWV3RnJvbUltYWdlXG4gICAgfTtcbiAgfSwgW3JlZ2lzdGVyLCBvblByZXZpZXdGcm9tSW1hZ2VdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFByZXZpZXdHcm91cENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogcHJldmlld0dyb3VwQ29udGV4dFxuICB9LCBjaGlsZHJlbiwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUHJldmlldywgX2V4dGVuZHMoe1xuICAgIFwiYXJpYS1oaWRkZW5cIjogIWlzU2hvd1ByZXZpZXcsXG4gICAgbW92YWJsZTogbW92YWJsZSxcbiAgICB2aXNpYmxlOiBpc1Nob3dQcmV2aWV3LFxuICAgIHByZWZpeENsczogcHJldmlld1ByZWZpeENscyxcbiAgICBjbG9zZUljb246IGNsb3NlSWNvbixcbiAgICBvbkNsb3NlOiBvblByZXZpZXdDbG9zZSxcbiAgICBtb3VzZVBvc2l0aW9uOiBtb3VzZVBvc2l0aW9uLFxuICAgIGltZ0NvbW1vblByb3BzOiBpbWdDb21tb25Qcm9wcyxcbiAgICBzcmM6IHNyYyxcbiAgICBmYWxsYmFjazogZmFsbGJhY2ssXG4gICAgaWNvbnM6IGljb25zLFxuICAgIG1pblNjYWxlOiBtaW5TY2FsZSxcbiAgICBtYXhTY2FsZTogbWF4U2NhbGUsXG4gICAgZ2V0Q29udGFpbmVyOiBnZXRDb250YWluZXIsXG4gICAgY3VycmVudDogY3VycmVudCxcbiAgICBjb3VudDogbWVyZ2VkSXRlbXMubGVuZ3RoLFxuICAgIGNvdW50UmVuZGVyOiBjb3VudFJlbmRlcixcbiAgICBvblRyYW5zZm9ybTogb25UcmFuc2Zvcm0sXG4gICAgdG9vbGJhclJlbmRlcjogdG9vbGJhclJlbmRlcixcbiAgICBpbWFnZVJlbmRlcjogaW1hZ2VSZW5kZXIsXG4gICAgb25DaGFuZ2U6IG9uSW50ZXJuYWxDaGFuZ2VcbiAgfSwgZGlhbG9nUHJvcHMpKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgR3JvdXA7IiwgImltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ09NTU9OX1BST1BTIH0gZnJvbSBcIi4uL2NvbW1vblwiO1xuLyoqXG4gKiBNZXJnZSBwcm9wcyBwcm92aWRlZCBgaXRlbXNgIG9yIGNvbnRleHQgY29sbGVjdGVkIGltYWdlc1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VQcmV2aWV3SXRlbXMoaXRlbXMpIHtcbiAgLy8gQ29udGV4dCBjb2xsZWN0aW9uIGltYWdlIGRhdGFcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKHt9KSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBpbWFnZXMgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldEltYWdlcyA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciByZWdpc3RlckltYWdlID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGlkLCBkYXRhKSB7XG4gICAgc2V0SW1hZ2VzKGZ1bmN0aW9uIChpbWdzKSB7XG4gICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBpbWdzKSwge30sIF9kZWZpbmVQcm9wZXJ0eSh7fSwgaWQsIGRhdGEpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgc2V0SW1hZ2VzKGZ1bmN0aW9uIChpbWdzKSB7XG4gICAgICAgIHZhciBjbG9uZUltZ3MgPSBfb2JqZWN0U3ByZWFkKHt9LCBpbWdzKTtcbiAgICAgICAgZGVsZXRlIGNsb25lSW1nc1tpZF07XG4gICAgICAgIHJldHVybiBjbG9uZUltZ3M7XG4gICAgICB9KTtcbiAgICB9O1xuICB9LCBbXSk7XG5cbiAgLy8gaXRlbXNcbiAgdmFyIG1lcmdlZEl0ZW1zID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgLy8gdXNlIGBpdGVtc2AgZmlyc3RcbiAgICBpZiAoaXRlbXMpIHtcbiAgICAgIHJldHVybiBpdGVtcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgIHNyYzogaXRlbVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRhdGEgPSB7fTtcbiAgICAgICAgT2JqZWN0LmtleXMoaXRlbSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgaWYgKFsnc3JjJ10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShDT01NT05fUFJPUFMpKS5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgICBkYXRhW2tleV0gPSBpdGVtW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiBkYXRhXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyB1c2UgcmVnaXN0ZXJlZCBpbWFnZXMgc2Vjb25kbHlcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoaW1hZ2VzKS5yZWR1Y2UoZnVuY3Rpb24gKHRvdGFsLCBpZCkge1xuICAgICAgdmFyIF9pbWFnZXMkaWQgPSBpbWFnZXNbaWRdLFxuICAgICAgICBjYW5QcmV2aWV3ID0gX2ltYWdlcyRpZC5jYW5QcmV2aWV3LFxuICAgICAgICBkYXRhID0gX2ltYWdlcyRpZC5kYXRhO1xuICAgICAgaWYgKGNhblByZXZpZXcpIHtcbiAgICAgICAgdG90YWwucHVzaCh7XG4gICAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgICBpZDogaWRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdG90YWw7XG4gICAgfSwgW10pO1xuICB9LCBbaXRlbXMsIGltYWdlc10pO1xuICByZXR1cm4gW21lcmdlZEl0ZW1zLCByZWdpc3RlckltYWdlLCAhIWl0ZW1zXTtcbn0iLCAiZXhwb3J0IHZhciBDT01NT05fUFJPUFMgPSBbJ2Nyb3NzT3JpZ2luJywgJ2RlY29kaW5nJywgJ2RyYWdnYWJsZScsICdsb2FkaW5nJywgJ3JlZmVycmVyUG9saWN5JywgJ3NpemVzJywgJ3NyY1NldCcsICd1c2VNYXAnLCAnYWx0J107IiwgImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgUHJldmlld0dyb3VwQ29udGV4dCB9IGZyb20gXCIuLi9jb250ZXh0XCI7XG52YXIgdWlkID0gMDtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVJlZ2lzdGVySW1hZ2UoY2FuUHJldmlldywgZGF0YSkge1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgdWlkICs9IDE7XG4gICAgICByZXR1cm4gU3RyaW5nKHVpZCk7XG4gICAgfSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMSksXG4gICAgaWQgPSBfUmVhY3QkdXNlU3RhdGUyWzBdO1xuICB2YXIgZ3JvdXBDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChQcmV2aWV3R3JvdXBDb250ZXh0KTtcbiAgdmFyIHJlZ2lzdGVyRGF0YSA9IHtcbiAgICBkYXRhOiBkYXRhLFxuICAgIGNhblByZXZpZXc6IGNhblByZXZpZXdcbiAgfTtcblxuICAvLyBLZWVwIG9yZGVyIHN0YXJ0XG4gIC8vIFJlc29sdmUgaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMjg4ODFcbiAgLy8gT25seSBuZWVkIHVuUmVnaXN0ZXIgd2hlbiBjb21wb25lbnQgdW5Nb3VudFxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChncm91cENvbnRleHQpIHtcbiAgICAgIHJldHVybiBncm91cENvbnRleHQucmVnaXN0ZXIoaWQsIHJlZ2lzdGVyRGF0YSk7XG4gICAgfVxuICB9LCBbXSk7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGdyb3VwQ29udGV4dCkge1xuICAgICAgZ3JvdXBDb250ZXh0LnJlZ2lzdGVyKGlkLCByZWdpc3RlckRhdGEpO1xuICAgIH1cbiAgfSwgW2NhblByZXZpZXcsIGRhdGFdKTtcbiAgcmV0dXJuIGlkO1xufSIsICJpbXBvcnQgSW1hZ2UgZnJvbSBcIi4vSW1hZ2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0ltYWdlXCI7XG5leHBvcnQgZGVmYXVsdCBJbWFnZTsiLCAiXCJ1c2UgY2xpZW50XCI7XG5cbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQ2xvc2VPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvQ2xvc2VPdXRsaW5lZFwiO1xuaW1wb3J0IExlZnRPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvTGVmdE91dGxpbmVkXCI7XG5pbXBvcnQgUmlnaHRPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvUmlnaHRPdXRsaW5lZFwiO1xuaW1wb3J0IFJvdGF0ZUxlZnRPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvUm90YXRlTGVmdE91dGxpbmVkXCI7XG5pbXBvcnQgUm90YXRlUmlnaHRPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvUm90YXRlUmlnaHRPdXRsaW5lZFwiO1xuaW1wb3J0IFN3YXBPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvU3dhcE91dGxpbmVkXCI7XG5pbXBvcnQgWm9vbUluT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL1pvb21Jbk91dGxpbmVkXCI7XG5pbXBvcnQgWm9vbU91dE91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9ab29tT3V0T3V0bGluZWRcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFJjSW1hZ2UgZnJvbSAncmMtaW1hZ2UnO1xuaW1wb3J0IHsgdXNlWkluZGV4IH0gZnJvbSAnLi4vX3V0aWwvaG9va3MvdXNlWkluZGV4JztcbmltcG9ydCB7IGdldFRyYW5zaXRpb25OYW1lIH0gZnJvbSAnLi4vX3V0aWwvbW90aW9uJztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHVzZUNTU1ZhckNscyBmcm9tICcuLi9jb25maWctcHJvdmlkZXIvaG9va3MvdXNlQ1NTVmFyQ2xzJztcbmltcG9ydCB1c2VTdHlsZSBmcm9tICcuL3N0eWxlJztcbmV4cG9ydCBjb25zdCBpY29ucyA9IHtcbiAgcm90YXRlTGVmdDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUm90YXRlTGVmdE91dGxpbmVkLCBudWxsKSxcbiAgcm90YXRlUmlnaHQ6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJvdGF0ZVJpZ2h0T3V0bGluZWQsIG51bGwpLFxuICB6b29tSW46IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFpvb21Jbk91dGxpbmVkLCBudWxsKSxcbiAgem9vbU91dDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoWm9vbU91dE91dGxpbmVkLCBudWxsKSxcbiAgY2xvc2U6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENsb3NlT3V0bGluZWQsIG51bGwpLFxuICBsZWZ0OiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMZWZ0T3V0bGluZWQsIG51bGwpLFxuICByaWdodDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmlnaHRPdXRsaW5lZCwgbnVsbCksXG4gIGZsaXBYOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTd2FwT3V0bGluZWQsIG51bGwpLFxuICBmbGlwWTogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU3dhcE91dGxpbmVkLCB7XG4gICAgcm90YXRlOiA5MFxuICB9KVxufTtcbmNvbnN0IEludGVybmFsUHJldmlld0dyb3VwID0gX2EgPT4ge1xuICB2YXIge1xuICAgICAgcHJldmlld1ByZWZpeENsczogY3VzdG9taXplUHJlZml4Q2xzLFxuICAgICAgcHJldmlld1xuICAgIH0gPSBfYSxcbiAgICBvdGhlclByb3BzID0gX19yZXN0KF9hLCBbXCJwcmV2aWV3UHJlZml4Q2xzXCIsIFwicHJldmlld1wiXSk7XG4gIGNvbnN0IHtcbiAgICBnZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uXG4gIH0gPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpO1xuICBjb25zdCBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2ltYWdlJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgY29uc3QgcHJldmlld1ByZWZpeENscyA9IGAke3ByZWZpeENsc30tcHJldmlld2A7XG4gIGNvbnN0IHJvb3RQcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoKTtcbiAgY29uc3Qgcm9vdENscyA9IHVzZUNTU1ZhckNscyhwcmVmaXhDbHMpO1xuICBjb25zdCBbd3JhcENTU1ZhciwgaGFzaElkLCBjc3NWYXJDbHNdID0gdXNlU3R5bGUocHJlZml4Q2xzLCByb290Q2xzKTtcbiAgY29uc3QgW3pJbmRleF0gPSB1c2VaSW5kZXgoJ0ltYWdlUHJldmlldycsIHR5cGVvZiBwcmV2aWV3ID09PSAnb2JqZWN0JyA/IHByZXZpZXcuekluZGV4IDogdW5kZWZpbmVkKTtcbiAgY29uc3QgbWVtb2l6ZWRJY29ucyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBpY29ucyksIHtcbiAgICBsZWZ0OiBkaXJlY3Rpb24gPT09ICdydGwnID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmlnaHRPdXRsaW5lZCwgbnVsbCkgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMZWZ0T3V0bGluZWQsIG51bGwpLFxuICAgIHJpZ2h0OiBkaXJlY3Rpb24gPT09ICdydGwnID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTGVmdE91dGxpbmVkLCBudWxsKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJpZ2h0T3V0bGluZWQsIG51bGwpXG4gIH0pLCBbZGlyZWN0aW9uXSk7XG4gIGNvbnN0IG1lcmdlZFByZXZpZXcgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKHByZXZpZXcgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gcHJldmlldztcbiAgICB9XG4gICAgY29uc3QgX3ByZXZpZXcgPSB0eXBlb2YgcHJldmlldyA9PT0gJ29iamVjdCcgPyBwcmV2aWV3IDoge307XG4gICAgY29uc3QgbWVyZ2VkUm9vdENsYXNzTmFtZSA9IGNsYXNzTmFtZXMoaGFzaElkLCBjc3NWYXJDbHMsIHJvb3RDbHMsIChfYSA9IF9wcmV2aWV3LnJvb3RDbGFzc05hbWUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICcnKTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBfcHJldmlldyksIHtcbiAgICAgIHRyYW5zaXRpb25OYW1lOiBnZXRUcmFuc2l0aW9uTmFtZShyb290UHJlZml4Q2xzLCAnem9vbScsIF9wcmV2aWV3LnRyYW5zaXRpb25OYW1lKSxcbiAgICAgIG1hc2tUcmFuc2l0aW9uTmFtZTogZ2V0VHJhbnNpdGlvbk5hbWUocm9vdFByZWZpeENscywgJ2ZhZGUnLCBfcHJldmlldy5tYXNrVHJhbnNpdGlvbk5hbWUpLFxuICAgICAgcm9vdENsYXNzTmFtZTogbWVyZ2VkUm9vdENsYXNzTmFtZSxcbiAgICAgIHpJbmRleFxuICAgIH0pO1xuICB9LCBbcHJldmlld10pO1xuICByZXR1cm4gd3JhcENTU1ZhcigvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSY0ltYWdlLlByZXZpZXdHcm91cCwgT2JqZWN0LmFzc2lnbih7XG4gICAgcHJldmlldzogbWVyZ2VkUHJldmlldyxcbiAgICBwcmV2aWV3UHJlZml4Q2xzOiBwcmV2aWV3UHJlZml4Q2xzLFxuICAgIGljb25zOiBtZW1vaXplZEljb25zXG4gIH0sIG90aGVyUHJvcHMpKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgSW50ZXJuYWxQcmV2aWV3R3JvdXA7IiwgImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJvdGF0ZUxlZnRPdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9Sb3RhdGVMZWZ0T3V0bGluZWRcIjtcbmltcG9ydCBBbnRkSWNvbiBmcm9tIFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiO1xudmFyIFJvdGF0ZUxlZnRPdXRsaW5lZCA9IGZ1bmN0aW9uIFJvdGF0ZUxlZnRPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbnRkSWNvbiwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogUm90YXRlTGVmdE91dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5cbi8qKiFbcm90YXRlLWxlZnRdKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjNhV1IwYUQwaU5UQWlJR2hsYVdkb2REMGlOVEFpSUdacGJHdzlJaU5qWVdOaFkyRWlJSFpwWlhkQ2IzZzlJalkwSURZMElEZzVOaUE0T1RZaUlHWnZZM1Z6WVdKc1pUMGlabUZzYzJVaUlIaHRiRzV6UFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eU1EQXdMM04yWnlJK1BHUmxabk0rUEhOMGVXeGxJQzgrUEM5a1pXWnpQanh3WVhSb0lHUTlJazAyTnpJZ05ERTRTREUwTkdNdE1UY3VOeUF3TFRNeUlERTBMak10TXpJZ016SjJOREUwWXpBZ01UY3VOeUF4TkM0eklETXlJRE15SURNeWFEVXlPR014Tnk0M0lEQWdNekl0TVRRdU15QXpNaTB6TWxZME5UQmpNQzB4Tnk0M0xURTBMak10TXpJdE16SXRNeko2YlMwME5DQTBNREpJTVRnNFZqUTVOR2cwTkRCMk16STJlaUlnTHo0OGNHRjBhQ0JrUFNKTk9ERTVMak1nTXpJNExqVmpMVGM0TGpndE1UQXdMamN0TVRrMkxURTFNeTQyTFRNeE5DNDJMVEUxTkM0eWJDMHVNaTAyTkdNd0xUWXVOUzAzTGpZdE1UQXVNUzB4TWk0MkxUWXVNV3d0TVRJNElERXdNV010TkNBekxqRXRNeTQ1SURrdU1TQXdJREV5TGpOTU5Ea3lJRE14T0M0Mll6VXVNU0EwSURFeUxqY3VOQ0F4TWk0MkxUWXVNWFl0TmpNdU9XTXhNaTQ1TGpFZ01qVXVPUzQ1SURNNExqZ2dNaTQxSURReUxqRWdOUzR5SURneUxqRWdNVGd1TWlBeE1Ua2dNemd1TnlBek9DNHhJREl4TGpJZ056RXVNaUEwT1M0M0lEazRMalFnT0RRdU15QXlOeTR4SURNMExqY2dORFl1TnlBM015NDNJRFU0TGpFZ01URTFMamhoTXpJMUxqazFJRE15TlM0NU5TQXdJREF4Tmk0MUlERTBNQzQ1YURjMExqbGpNVFF1T0MweE1ETXVOaTB4TVM0ekxUSXhNeTA0TVMwek1ESXVNM29pSUM4K1BDOXpkbWMrKSAqL1xudmFyIFJlZkljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihSb3RhdGVMZWZ0T3V0bGluZWQpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgUmVmSWNvbi5kaXNwbGF5TmFtZSA9ICdSb3RhdGVMZWZ0T3V0bGluZWQnO1xufVxuZXhwb3J0IGRlZmF1bHQgUmVmSWNvbjsiLCAiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgUm90YXRlTGVmdE91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcImRlZnNcIiwgXCJhdHRyc1wiOiB7fSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInN0eWxlXCIsIFwiYXR0cnNcIjoge30gfV0gfSwgeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk02NzIgNDE4SDE0NGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJ2NDE0YzAgMTcuNyAxNC4zIDMyIDMyIDMyaDUyOGMxNy43IDAgMzItMTQuMyAzMi0zMlY0NTBjMC0xNy43LTE0LjMtMzItMzItMzJ6bS00NCA0MDJIMTg4VjQ5NGg0NDB2MzI2elwiIH0gfSwgeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk04MTkuMyAzMjguNWMtNzguOC0xMDAuNy0xOTYtMTUzLjYtMzE0LjYtMTU0LjJsLS4yLTY0YzAtNi41LTcuNi0xMC4xLTEyLjYtNi4xbC0xMjggMTAxYy00IDMuMS0zLjkgOS4xIDAgMTIuM0w0OTIgMzE4LjZjNS4xIDQgMTIuNy40IDEyLjYtNi4xdi02My45YzEyLjkuMSAyNS45LjkgMzguOCAyLjUgNDIuMSA1LjIgODIuMSAxOC4yIDExOSAzOC43IDM4LjEgMjEuMiA3MS4yIDQ5LjcgOTguNCA4NC4zIDI3LjEgMzQuNyA0Ni43IDczLjcgNTguMSAxMTUuOGEzMjUuOTUgMzI1Ljk1IDAgMDE2LjUgMTQwLjloNzQuOWMxNC44LTEwMy42LTExLjMtMjEzLTgxLTMwMi4zelwiIH0gfV0gfSwgXCJuYW1lXCI6IFwicm90YXRlLWxlZnRcIiwgXCJ0aGVtZVwiOiBcIm91dGxpbmVkXCIgfTtcbmV4cG9ydCBkZWZhdWx0IFJvdGF0ZUxlZnRPdXRsaW5lZDtcbiIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBSb3RhdGVSaWdodE91dGxpbmVkU3ZnIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL1JvdGF0ZVJpZ2h0T3V0bGluZWRcIjtcbmltcG9ydCBBbnRkSWNvbiBmcm9tIFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiO1xudmFyIFJvdGF0ZVJpZ2h0T3V0bGluZWQgPSBmdW5jdGlvbiBSb3RhdGVSaWdodE91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFudGRJY29uLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBSb3RhdGVSaWdodE91dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5cbi8qKiFbcm90YXRlLXJpZ2h0XShkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUIzYVdSMGFEMGlOVEFpSUdobGFXZG9kRDBpTlRBaUlHWnBiR3c5SWlOallXTmhZMkVpSUhacFpYZENiM2c5SWpZMElEWTBJRGc1TmlBNE9UWWlJR1p2WTNWellXSnNaVDBpWm1Gc2MyVWlJSGh0Ykc1elBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5SStQR1JsWm5NK1BITjBlV3hsSUM4K1BDOWtaV1p6UGp4d1lYUm9JR1E5SWswME9EQXVOU0F5TlRFdU1tTXhNeTB4TGpZZ01qVXVPUzB5TGpRZ016Z3VPQzB5TGpWMk5qTXVPV013SURZdU5TQTNMalVnTVRBdU1TQXhNaTQySURZdU1VdzJOakFnTWpFM0xqWmpOQzB6TGpJZ05DMDVMaklnTUMweE1pNHpiQzB4TWpndE1UQXhZeTAxTGpFdE5DMHhNaTQyTFM0MExURXlMallnTmk0eGJDMHVNaUEyTkdNdE1URTRMall1TlMweU16VXVPQ0ExTXk0MExUTXhOQzQySURFMU5DNHlRVE01T1M0M05TQXpPVGt1TnpVZ01DQXdNREV5TXk0MUlEWXpNV2czTkM0NVl5MHVPUzAxTGpNdE1TNDNMVEV3TGpjdE1pNDBMVEUyTGpFdE5TNHhMVFF5TGpFdE1pNHhMVGcwTGpFZ09DNDVMVEV5TkM0NElERXhMalF0TkRJdU1pQXpNUzA0TVM0eElEVTRMakV0TVRFMUxqZ2dNamN1TWkwek5DNDNJRFl3TGpNdE5qTXVNaUE1T0M0MExUZzBMak1nTXpjdE1qQXVOaUEzTmk0NUxUTXpMallnTVRFNUxqRXRNemd1T0hvaUlDOCtQSEJoZEdnZ1pEMGlUVGc0TUNBME1UaElNelV5WXkweE55NDNJREF0TXpJZ01UUXVNeTB6TWlBek1uWTBNVFJqTUNBeE55NDNJREUwTGpNZ016SWdNeklnTXpKb05USTRZekUzTGpjZ01DQXpNaTB4TkM0eklETXlMVE15VmpRMU1HTXdMVEUzTGpjdE1UUXVNeTB6TWkwek1pMHpNbnB0TFRRMElEUXdNa2d6T1RaV05EazBhRFEwTUhZek1qWjZJaUF2UGp3dmMzWm5QZz09KSAqL1xudmFyIFJlZkljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihSb3RhdGVSaWdodE91dGxpbmVkKTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFJlZkljb24uZGlzcGxheU5hbWUgPSAnUm90YXRlUmlnaHRPdXRsaW5lZCc7XG59XG5leHBvcnQgZGVmYXVsdCBSZWZJY29uOyIsICIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBSb3RhdGVSaWdodE91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcImRlZnNcIiwgXCJhdHRyc1wiOiB7fSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInN0eWxlXCIsIFwiYXR0cnNcIjoge30gfV0gfSwgeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk00ODAuNSAyNTEuMmMxMy0xLjYgMjUuOS0yLjQgMzguOC0yLjV2NjMuOWMwIDYuNSA3LjUgMTAuMSAxMi42IDYuMUw2NjAgMjE3LjZjNC0zLjIgNC05LjIgMC0xMi4zbC0xMjgtMTAxYy01LjEtNC0xMi42LS40LTEyLjYgNi4xbC0uMiA2NGMtMTE4LjYuNS0yMzUuOCA1My40LTMxNC42IDE1NC4yQTM5OS43NSAzOTkuNzUgMCAwMDEyMy41IDYzMWg3NC45Yy0uOS01LjMtMS43LTEwLjctMi40LTE2LjEtNS4xLTQyLjEtMi4xLTg0LjEgOC45LTEyNC44IDExLjQtNDIuMiAzMS04MS4xIDU4LjEtMTE1LjggMjcuMi0zNC43IDYwLjMtNjMuMiA5OC40LTg0LjMgMzctMjAuNiA3Ni45LTMzLjYgMTE5LjEtMzguOHpcIiB9IH0sIHsgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNODgwIDQxOEgzNTJjLTE3LjcgMC0zMiAxNC4zLTMyIDMydjQxNGMwIDE3LjcgMTQuMyAzMiAzMiAzMmg1MjhjMTcuNyAwIDMyLTE0LjMgMzItMzJWNDUwYzAtMTcuNy0xNC4zLTMyLTMyLTMyem0tNDQgNDAySDM5NlY0OTRoNDQwdjMyNnpcIiB9IH1dIH0sIFwibmFtZVwiOiBcInJvdGF0ZS1yaWdodFwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgUm90YXRlUmlnaHRPdXRsaW5lZDtcbiIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBTd2FwT3V0bGluZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vU3dhcE91dGxpbmVkXCI7XG5pbXBvcnQgQW50ZEljb24gZnJvbSBcIi4uL2NvbXBvbmVudHMvQW50ZEljb25cIjtcbnZhciBTd2FwT3V0bGluZWQgPSBmdW5jdGlvbiBTd2FwT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IFN3YXBPdXRsaW5lZFN2Z1xuICB9KSk7XG59O1xuXG4vKiohW3N3YXBdKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjNhV1IwYUQwaU5UQWlJR2hsYVdkb2REMGlOVEFpSUdacGJHdzlJaU5qWVdOaFkyRWlJSFpwWlhkQ2IzZzlJalkwSURZMElEZzVOaUE0T1RZaUlHWnZZM1Z6WVdKc1pUMGlabUZzYzJVaUlIaHRiRzV6UFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eU1EQXdMM04yWnlJK1BIQmhkR2dnWkQwaVRUZzBOeTQ1SURVNU1rZ3hOVEpqTFRRdU5DQXdMVGdnTXk0MkxUZ2dPSFkyTUdNd0lEUXVOQ0F6TGpZZ09DQTRJRGhvTmpBMUxqSk1OakV5TGprZ09EVXhZeTAwTGpFZ05TNHlMUzQwSURFeklEWXVNeUF4TTJnM01pNDFZelF1T1NBd0lEa3VOUzB5TGpJZ01USXVOaTAyTGpGc01UWTRMamd0TWpFMExqRmpNVFl1TlMweU1TQXhMall0TlRFdU9DMHlOUzR5TFRVeExqaDZUVGczTWlBek5UWklNalkyTGpoc01UUTBMak10TVRnell6UXVNUzAxTGpJdU5DMHhNeTAyTGpNdE1UTm9MVGN5TGpWakxUUXVPU0F3TFRrdU5TQXlMakl0TVRJdU5pQTJMakZNTVRVd0xqa2dNemd3TGpKakxURTJMalVnTWpFdE1TNDJJRFV4TGpnZ01qVXVNU0ExTVM0NGFEWTVObU0wTGpRZ01DQTRMVE11TmlBNExUaDJMVFl3WXpBdE5DNDBMVE11TmkwNExUZ3RPSG9pSUM4K1BDOXpkbWMrKSAqL1xudmFyIFJlZkljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihTd2FwT3V0bGluZWQpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgUmVmSWNvbi5kaXNwbGF5TmFtZSA9ICdTd2FwT3V0bGluZWQnO1xufVxuZXhwb3J0IGRlZmF1bHQgUmVmSWNvbjsiLCAiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgU3dhcE91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk04NDcuOSA1OTJIMTUyYy00LjQgMC04IDMuNi04IDh2NjBjMCA0LjQgMy42IDggOCA4aDYwNS4yTDYxMi45IDg1MWMtNC4xIDUuMi0uNCAxMyA2LjMgMTNoNzIuNWM0LjkgMCA5LjUtMi4yIDEyLjYtNi4xbDE2OC44LTIxNC4xYzE2LjUtMjEgMS42LTUxLjgtMjUuMi01MS44ek04NzIgMzU2SDI2Ni44bDE0NC4zLTE4M2M0LjEtNS4yLjQtMTMtNi4zLTEzaC03Mi41Yy00LjkgMC05LjUgMi4yLTEyLjYgNi4xTDE1MC45IDM4MC4yYy0xNi41IDIxLTEuNiA1MS44IDI1LjEgNTEuOGg2OTZjNC40IDAgOC0zLjYgOC04di02MGMwLTQuNC0zLjYtOC04LTh6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJzd2FwXCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnQgZGVmYXVsdCBTd2FwT3V0bGluZWQ7XG4iLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgWm9vbUluT3V0bGluZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vWm9vbUluT3V0bGluZWRcIjtcbmltcG9ydCBBbnRkSWNvbiBmcm9tIFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiO1xudmFyIFpvb21Jbk91dGxpbmVkID0gZnVuY3Rpb24gWm9vbUluT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IFpvb21Jbk91dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5cbi8qKiFbem9vbS1pbl0oZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTlRBaUlHaGxhV2RvZEQwaU5UQWlJR1pwYkd3OUlpTmpZV05oWTJFaUlIWnBaWGRDYjNnOUlqWTBJRFkwSURnNU5pQTRPVFlpSUdadlkzVnpZV0pzWlQwaVptRnNjMlVpSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUkrUEhCaGRHZ2daRDBpVFRZek55QTBORE5JTlRFNVZqTXdPV013TFRRdU5DMHpMall0T0MwNExUaG9MVFl3WXkwMExqUWdNQzA0SURNdU5pMDRJRGgyTVRNMFNETXlOV010TkM0MElEQXRPQ0F6TGpZdE9DQTRkall3WXpBZ05DNDBJRE11TmlBNElEZ2dPR2d4TVRoMk1UTTBZekFnTkM0MElETXVOaUE0SURnZ09HZzJNR00wTGpRZ01DQTRMVE11TmlBNExUaFdOVEU1YURFeE9HTTBMalFnTUNBNExUTXVOaUE0TFRoMkxUWXdZekF0TkM0MExUTXVOaTA0TFRndE9IcHRNamcwSURReU5FdzNOelVnTnpJeFl6RXlNaTR4TFRFME9DNDVJREV4TXk0MkxUTTJPUzQxTFRJMkxUVXdPUzB4TkRndE1UUTRMakV0TXpnNExqUXRNVFE0TGpFdE5UTTNJREF0TVRRNExqRWdNVFE0TGpZdE1UUTRMakVnTXpnNUlEQWdOVE0zSURFek9TNDFJREV6T1M0MklETTJNQzR4SURFME9DNHhJRFV3T1NBeU5td3hORFlnTVRRMll6TXVNaUF5TGpnZ09DNHpJREl1T0NBeE1TQXdiRFF6TFRRell6SXVPQzB5TGpjZ01pNDRMVGN1T0NBd0xURXhlazAyT1RZZ05qazJZeTB4TVRndU9DQXhNVGd1Tnkwek1URXVNaUF4TVRndU55MDBNekFnTUMweE1UZ3VOeTB4TVRndU9DMHhNVGd1Tnkwek1URXVNaUF3TFRRek1DQXhNVGd1T0MweE1UZ3VOeUF6TVRFdU1pMHhNVGd1TnlBME16QWdNQ0F4TVRndU55QXhNVGd1T0NBeE1UZ3VOeUF6TVRFdU1pQXdJRFF6TUhvaUlDOCtQQzl6ZG1jKykgKi9cbnZhciBSZWZJY29uID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoWm9vbUluT3V0bGluZWQpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgUmVmSWNvbi5kaXNwbGF5TmFtZSA9ICdab29tSW5PdXRsaW5lZCc7XG59XG5leHBvcnQgZGVmYXVsdCBSZWZJY29uOyIsICIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBab29tSW5PdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNjM3IDQ0M0g1MTlWMzA5YzAtNC40LTMuNi04LTgtOGgtNjBjLTQuNCAwLTggMy42LTggOHYxMzRIMzI1Yy00LjQgMC04IDMuNi04IDh2NjBjMCA0LjQgMy42IDggOCA4aDExOHYxMzRjMCA0LjQgMy42IDggOCA4aDYwYzQuNCAwIDgtMy42IDgtOFY1MTloMTE4YzQuNCAwIDgtMy42IDgtOHYtNjBjMC00LjQtMy42LTgtOC04em0yODQgNDI0TDc3NSA3MjFjMTIyLjEtMTQ4LjkgMTEzLjYtMzY5LjUtMjYtNTA5LTE0OC0xNDguMS0zODguNC0xNDguMS01MzcgMC0xNDguMSAxNDguNi0xNDguMSAzODkgMCA1MzcgMTM5LjUgMTM5LjYgMzYwLjEgMTQ4LjEgNTA5IDI2bDE0NiAxNDZjMy4yIDIuOCA4LjMgMi44IDExIDBsNDMtNDNjMi44LTIuNyAyLjgtNy44IDAtMTF6TTY5NiA2OTZjLTExOC44IDExOC43LTMxMS4yIDExOC43LTQzMCAwLTExOC43LTExOC44LTExOC43LTMxMS4yIDAtNDMwIDExOC44LTExOC43IDMxMS4yLTExOC43IDQzMCAwIDExOC43IDExOC44IDExOC43IDMxMS4yIDAgNDMwelwiIH0gfV0gfSwgXCJuYW1lXCI6IFwiem9vbS1pblwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgWm9vbUluT3V0bGluZWQ7XG4iLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgWm9vbU91dE91dGxpbmVkU3ZnIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL1pvb21PdXRPdXRsaW5lZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gXCIuLi9jb21wb25lbnRzL0FudGRJY29uXCI7XG52YXIgWm9vbU91dE91dGxpbmVkID0gZnVuY3Rpb24gWm9vbU91dE91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFudGRJY29uLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBab29tT3V0T3V0bGluZWRTdmdcbiAgfSkpO1xufTtcblxuLyoqIVt6b29tLW91dF0oZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTlRBaUlHaGxhV2RvZEQwaU5UQWlJR1pwYkd3OUlpTmpZV05oWTJFaUlIWnBaWGRDYjNnOUlqWTBJRFkwSURnNU5pQTRPVFlpSUdadlkzVnpZV0pzWlQwaVptRnNjMlVpSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUkrUEhCaGRHZ2daRDBpVFRZek55QTBORE5JTXpJMVl5MDBMalFnTUMwNElETXVOaTA0SURoMk5qQmpNQ0EwTGpRZ015NDJJRGdnT0NBNGFETXhNbU0wTGpRZ01DQTRMVE11TmlBNExUaDJMVFl3WXpBdE5DNDBMVE11TmkwNExUZ3RPSHB0TWpnMElEUXlORXczTnpVZ056SXhZekV5TWk0eExURTBPQzQ1SURFeE15NDJMVE0yT1M0MUxUSTJMVFV3T1MweE5EZ3RNVFE0TGpFdE16ZzRMalF0TVRRNExqRXROVE0zSURBdE1UUTRMakVnTVRRNExqWXRNVFE0TGpFZ016ZzVJREFnTlRNM0lERXpPUzQxSURFek9TNDJJRE0yTUM0eElERTBPQzR4SURVd09TQXlObXd4TkRZZ01UUTJZek11TWlBeUxqZ2dPQzR6SURJdU9DQXhNU0F3YkRRekxUUXpZekl1T0MweUxqY2dNaTQ0TFRjdU9DQXdMVEV4ZWswMk9UWWdOamsyWXkweE1UZ3VPQ0F4TVRndU55MHpNVEV1TWlBeE1UZ3VOeTAwTXpBZ01DMHhNVGd1TnkweE1UZ3VPQzB4TVRndU55MHpNVEV1TWlBd0xUUXpNQ0F4TVRndU9DMHhNVGd1TnlBek1URXVNaTB4TVRndU55QTBNekFnTUNBeE1UZ3VOeUF4TVRndU9DQXhNVGd1TnlBek1URXVNaUF3SURRek1Ib2lJQzgrUEM5emRtYyspICovXG52YXIgUmVmSWNvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKFpvb21PdXRPdXRsaW5lZCk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBSZWZJY29uLmRpc3BsYXlOYW1lID0gJ1pvb21PdXRPdXRsaW5lZCc7XG59XG5leHBvcnQgZGVmYXVsdCBSZWZJY29uOyIsICIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBab29tT3V0T3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTYzNyA0NDNIMzI1Yy00LjQgMC04IDMuNi04IDh2NjBjMCA0LjQgMy42IDggOCA4aDMxMmM0LjQgMCA4LTMuNiA4LTh2LTYwYzAtNC40LTMuNi04LTgtOHptMjg0IDQyNEw3NzUgNzIxYzEyMi4xLTE0OC45IDExMy42LTM2OS41LTI2LTUwOS0xNDgtMTQ4LjEtMzg4LjQtMTQ4LjEtNTM3IDAtMTQ4LjEgMTQ4LjYtMTQ4LjEgMzg5IDAgNTM3IDEzOS41IDEzOS42IDM2MC4xIDE0OC4xIDUwOSAyNmwxNDYgMTQ2YzMuMiAyLjggOC4zIDIuOCAxMSAwbDQzLTQzYzIuOC0yLjcgMi44LTcuOCAwLTExek02OTYgNjk2Yy0xMTguOCAxMTguNy0zMTEuMiAxMTguNy00MzAgMC0xMTguNy0xMTguOC0xMTguNy0zMTEuMiAwLTQzMCAxMTguOC0xMTguNyAzMTEuMi0xMTguNyA0MzAgMCAxMTguNyAxMTguOCAxMTguNyAzMTEuMiAwIDQzMHpcIiB9IH1dIH0sIFwibmFtZVwiOiBcInpvb20tb3V0XCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnQgZGVmYXVsdCBab29tT3V0T3V0bGluZWQ7XG4iLCAiaW1wb3J0IHsgdW5pdCB9IGZyb20gJ0BhbnQtZGVzaWduL2Nzc2luanMnO1xuaW1wb3J0IHsgRmFzdENvbG9yIH0gZnJvbSAnQGFudC1kZXNpZ24vZmFzdC1jb2xvcic7XG5pbXBvcnQgeyBnZW5Nb2RhbE1hc2tTdHlsZSB9IGZyb20gJy4uLy4uL21vZGFsL3N0eWxlJztcbmltcG9ydCB7IHRleHRFbGxpcHNpcyB9IGZyb20gJy4uLy4uL3N0eWxlJztcbmltcG9ydCB7IGluaXRGYWRlTW90aW9uLCBpbml0Wm9vbU1vdGlvbiB9IGZyb20gJy4uLy4uL3N0eWxlL21vdGlvbic7XG5pbXBvcnQgeyBnZW5TdHlsZUhvb2tzLCBtZXJnZVRva2VuIH0gZnJvbSAnLi4vLi4vdGhlbWUvaW50ZXJuYWwnO1xuZXhwb3J0IGNvbnN0IGdlbkJveFN0eWxlID0gcG9zaXRpb24gPT4gKHtcbiAgcG9zaXRpb246IHBvc2l0aW9uIHx8ICdhYnNvbHV0ZScsXG4gIGluc2V0OiAwXG59KTtcbmV4cG9ydCBjb25zdCBnZW5JbWFnZU1hc2tTdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGljb25DbHMsXG4gICAgbW90aW9uRHVyYXRpb25TbG93LFxuICAgIHBhZGRpbmdYWFMsXG4gICAgbWFyZ2luWFhTLFxuICAgIHByZWZpeENscyxcbiAgICBjb2xvclRleHRMaWdodFNvbGlkXG4gIH0gPSB0b2tlbjtcbiAgcmV0dXJuIHtcbiAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICBpbnNldDogMCxcbiAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLFxuICAgIGNvbG9yOiBjb2xvclRleHRMaWdodFNvbGlkLFxuICAgIGJhY2tncm91bmQ6IG5ldyBGYXN0Q29sb3IoJyMwMDAnKS5zZXRBKDAuNSkudG9SZ2JTdHJpbmcoKSxcbiAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICBvcGFjaXR5OiAwLFxuICAgIHRyYW5zaXRpb246IGBvcGFjaXR5ICR7bW90aW9uRHVyYXRpb25TbG93fWAsXG4gICAgW2AuJHtwcmVmaXhDbHN9LW1hc2staW5mb2BdOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRleHRFbGxpcHNpcyksIHtcbiAgICAgIHBhZGRpbmc6IGAwICR7dW5pdChwYWRkaW5nWFhTKX1gLFxuICAgICAgW2ljb25DbHNdOiB7XG4gICAgICAgIG1hcmdpbklubGluZUVuZDogbWFyZ2luWFhTLFxuICAgICAgICBzdmc6IHtcbiAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiAnYmFzZWxpbmUnXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9O1xufTtcbmV4cG9ydCBjb25zdCBnZW5QcmV2aWV3T3BlcmF0aW9uc1N0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgcHJldmlld0NscyxcbiAgICBtb2RhbE1hc2tCZyxcbiAgICBwYWRkaW5nU00sXG4gICAgbWFyZ2luWEwsXG4gICAgbWFyZ2luLFxuICAgIHBhZGRpbmdMRyxcbiAgICBwcmV2aWV3T3BlcmF0aW9uQ29sb3JEaXNhYmxlZCxcbiAgICBwcmV2aWV3T3BlcmF0aW9uSG92ZXJDb2xvcixcbiAgICBtb3Rpb25EdXJhdGlvblNsb3csXG4gICAgaWNvbkNscyxcbiAgICBjb2xvclRleHRMaWdodFNvbGlkXG4gIH0gPSB0b2tlbjtcbiAgY29uc3Qgb3BlcmF0aW9uQmcgPSBuZXcgRmFzdENvbG9yKG1vZGFsTWFza0JnKS5zZXRBKDAuMSk7XG4gIGNvbnN0IG9wZXJhdGlvbkJnSG92ZXIgPSBvcGVyYXRpb25CZy5jbG9uZSgpLnNldEEoMC4yKTtcbiAgcmV0dXJuIHtcbiAgICBbYCR7cHJldmlld0Nsc30tZm9vdGVyYF06IHtcbiAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgYm90dG9tOiBtYXJnaW5YTCxcbiAgICAgIGxlZnQ6IHtcbiAgICAgICAgX3NraXBfY2hlY2tfOiB0cnVlLFxuICAgICAgICB2YWx1ZTogJzUwJSdcbiAgICAgIH0sXG4gICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJyxcbiAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgY29sb3I6IHRva2VuLnByZXZpZXdPcGVyYXRpb25Db2xvcixcbiAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoLTUwJSknXG4gICAgfSxcbiAgICBbYCR7cHJldmlld0Nsc30tcHJvZ3Jlc3NgXToge1xuICAgICAgbWFyZ2luQm90dG9tOiBtYXJnaW5cbiAgICB9LFxuICAgIFtgJHtwcmV2aWV3Q2xzfS1jbG9zZWBdOiB7XG4gICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgIHRvcDogbWFyZ2luWEwsXG4gICAgICByaWdodDoge1xuICAgICAgICBfc2tpcF9jaGVja186IHRydWUsXG4gICAgICAgIHZhbHVlOiBtYXJnaW5YTFxuICAgICAgfSxcbiAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgIGNvbG9yOiBjb2xvclRleHRMaWdodFNvbGlkLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiBvcGVyYXRpb25CZy50b1JnYlN0cmluZygpLFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNTAlJyxcbiAgICAgIHBhZGRpbmc6IHBhZGRpbmdTTSxcbiAgICAgIG91dGxpbmU6IDAsXG4gICAgICBib3JkZXI6IDAsXG4gICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgIHRyYW5zaXRpb246IGBhbGwgJHttb3Rpb25EdXJhdGlvblNsb3d9YCxcbiAgICAgICcmOmhvdmVyJzoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IG9wZXJhdGlvbkJnSG92ZXIudG9SZ2JTdHJpbmcoKVxuICAgICAgfSxcbiAgICAgIFtgJiA+ICR7aWNvbkNsc31gXToge1xuICAgICAgICBmb250U2l6ZTogdG9rZW4ucHJldmlld09wZXJhdGlvblNpemVcbiAgICAgIH1cbiAgICB9LFxuICAgIFtgJHtwcmV2aWV3Q2xzfS1vcGVyYXRpb25zYF06IHtcbiAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgcGFkZGluZzogYDAgJHt1bml0KHBhZGRpbmdMRyl9YCxcbiAgICAgIGJhY2tncm91bmRDb2xvcjogb3BlcmF0aW9uQmcudG9SZ2JTdHJpbmcoKSxcbiAgICAgIGJvcmRlclJhZGl1czogMTAwLFxuICAgICAgJyYtb3BlcmF0aW9uJzoge1xuICAgICAgICBtYXJnaW5JbmxpbmVTdGFydDogcGFkZGluZ1NNLFxuICAgICAgICBwYWRkaW5nOiBwYWRkaW5nU00sXG4gICAgICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgICAgICB0cmFuc2l0aW9uOiBgYWxsICR7bW90aW9uRHVyYXRpb25TbG93fWAsXG4gICAgICAgIHVzZXJTZWxlY3Q6ICdub25lJyxcbiAgICAgICAgW2AmOm5vdCgke3ByZXZpZXdDbHN9LW9wZXJhdGlvbnMtb3BlcmF0aW9uLWRpc2FibGVkKTpob3ZlciA+ICR7aWNvbkNsc31gXToge1xuICAgICAgICAgIGNvbG9yOiBwcmV2aWV3T3BlcmF0aW9uSG92ZXJDb2xvclxuICAgICAgICB9LFxuICAgICAgICAnJi1kaXNhYmxlZCc6IHtcbiAgICAgICAgICBjb2xvcjogcHJldmlld09wZXJhdGlvbkNvbG9yRGlzYWJsZWQsXG4gICAgICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQnXG4gICAgICAgIH0sXG4gICAgICAgICcmOmZpcnN0LW9mLXR5cGUnOiB7XG4gICAgICAgICAgbWFyZ2luSW5saW5lU3RhcnQ6IDBcbiAgICAgICAgfSxcbiAgICAgICAgW2AmID4gJHtpY29uQ2xzfWBdOiB7XG4gICAgICAgICAgZm9udFNpemU6IHRva2VuLnByZXZpZXdPcGVyYXRpb25TaXplXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xuZXhwb3J0IGNvbnN0IGdlblByZXZpZXdTd2l0Y2hTdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIG1vZGFsTWFza0JnLFxuICAgIGljb25DbHMsXG4gICAgcHJldmlld09wZXJhdGlvbkNvbG9yRGlzYWJsZWQsXG4gICAgcHJldmlld0NscyxcbiAgICB6SW5kZXhQb3B1cCxcbiAgICBtb3Rpb25EdXJhdGlvblNsb3dcbiAgfSA9IHRva2VuO1xuICBjb25zdCBvcGVyYXRpb25CZyA9IG5ldyBGYXN0Q29sb3IobW9kYWxNYXNrQmcpLnNldEEoMC4xKTtcbiAgY29uc3Qgb3BlcmF0aW9uQmdIb3ZlciA9IG9wZXJhdGlvbkJnLmNsb25lKCkuc2V0QSgwLjIpO1xuICByZXR1cm4ge1xuICAgIFtgJHtwcmV2aWV3Q2xzfS1zd2l0Y2gtbGVmdCwgJHtwcmV2aWV3Q2xzfS1zd2l0Y2gtcmlnaHRgXToge1xuICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICBpbnNldEJsb2NrU3RhcnQ6ICc1MCUnLFxuICAgICAgekluZGV4OiB0b2tlbi5jYWxjKHpJbmRleFBvcHVwKS5hZGQoMSkuZXF1YWwoKSxcbiAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLFxuICAgICAgd2lkdGg6IHRva2VuLmltYWdlUHJldmlld1N3aXRjaFNpemUsXG4gICAgICBoZWlnaHQ6IHRva2VuLmltYWdlUHJldmlld1N3aXRjaFNpemUsXG4gICAgICBtYXJnaW5Ub3A6IHRva2VuLmNhbGModG9rZW4uaW1hZ2VQcmV2aWV3U3dpdGNoU2l6ZSkubXVsKC0xKS5kaXYoMikuZXF1YWwoKSxcbiAgICAgIGNvbG9yOiB0b2tlbi5wcmV2aWV3T3BlcmF0aW9uQ29sb3IsXG4gICAgICBiYWNrZ3JvdW5kOiBvcGVyYXRpb25CZy50b1JnYlN0cmluZygpLFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNTAlJyxcbiAgICAgIHRyYW5zZm9ybTogYHRyYW5zbGF0ZVkoLTUwJSlgLFxuICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgICB0cmFuc2l0aW9uOiBgYWxsICR7bW90aW9uRHVyYXRpb25TbG93fWAsXG4gICAgICB1c2VyU2VsZWN0OiAnbm9uZScsXG4gICAgICAnJjpob3Zlcic6IHtcbiAgICAgICAgYmFja2dyb3VuZDogb3BlcmF0aW9uQmdIb3Zlci50b1JnYlN0cmluZygpXG4gICAgICB9LFxuICAgICAgJyYtZGlzYWJsZWQnOiB7XG4gICAgICAgICcmLCAmOmhvdmVyJzoge1xuICAgICAgICAgIGNvbG9yOiBwcmV2aWV3T3BlcmF0aW9uQ29sb3JEaXNhYmxlZCxcbiAgICAgICAgICBiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkJyxcbiAgICAgICAgICBbYD4gJHtpY29uQ2xzfWBdOiB7XG4gICAgICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbYD4gJHtpY29uQ2xzfWBdOiB7XG4gICAgICAgIGZvbnRTaXplOiB0b2tlbi5wcmV2aWV3T3BlcmF0aW9uU2l6ZVxuICAgICAgfVxuICAgIH0sXG4gICAgW2Ake3ByZXZpZXdDbHN9LXN3aXRjaC1sZWZ0YF06IHtcbiAgICAgIGluc2V0SW5saW5lU3RhcnQ6IHRva2VuLm1hcmdpblNNXG4gICAgfSxcbiAgICBbYCR7cHJldmlld0Nsc30tc3dpdGNoLXJpZ2h0YF06IHtcbiAgICAgIGluc2V0SW5saW5lRW5kOiB0b2tlbi5tYXJnaW5TTVxuICAgIH1cbiAgfTtcbn07XG5leHBvcnQgY29uc3QgZ2VuSW1hZ2VQcmV2aWV3U3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBtb3Rpb25FYXNlT3V0LFxuICAgIHByZXZpZXdDbHMsXG4gICAgbW90aW9uRHVyYXRpb25TbG93LFxuICAgIGNvbXBvbmVudENsc1xuICB9ID0gdG9rZW47XG4gIHJldHVybiBbe1xuICAgIFtgJHtjb21wb25lbnRDbHN9LXByZXZpZXctcm9vdGBdOiB7XG4gICAgICBbcHJldmlld0Nsc106IHtcbiAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJ1xuICAgICAgfSxcbiAgICAgIFtgJHtwcmV2aWV3Q2xzfS1ib2R5YF06IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZ2VuQm94U3R5bGUoKSksIHtcbiAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nXG4gICAgICB9KSxcbiAgICAgIFtgJHtwcmV2aWV3Q2xzfS1pbWdgXToge1xuICAgICAgICBtYXhXaWR0aDogJzEwMCUnLFxuICAgICAgICBtYXhIZWlnaHQ6ICc3MCUnLFxuICAgICAgICB2ZXJ0aWNhbEFsaWduOiAnbWlkZGxlJyxcbiAgICAgICAgdHJhbnNmb3JtOiAnc2NhbGUzZCgxLCAxLCAxKScsXG4gICAgICAgIGN1cnNvcjogJ2dyYWInLFxuICAgICAgICB0cmFuc2l0aW9uOiBgdHJhbnNmb3JtICR7bW90aW9uRHVyYXRpb25TbG93fSAke21vdGlvbkVhc2VPdXR9IDBzYCxcbiAgICAgICAgdXNlclNlbGVjdDogJ25vbmUnLFxuICAgICAgICAnJi13cmFwcGVyJzogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBnZW5Cb3hTdHlsZSgpKSwge1xuICAgICAgICAgIHRyYW5zaXRpb246IGB0cmFuc2Zvcm0gJHttb3Rpb25EdXJhdGlvblNsb3d9ICR7bW90aW9uRWFzZU91dH0gMHNgLFxuICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzM5OTEzXG4gICAgICAgICAgLy8gVGFpbHdpbmRDU1Mgd2lsbCByZXNldCBpbWcgZGVmYXVsdCBzdHlsZS5cbiAgICAgICAgICAvLyBMZXQncyBzZXQgYmFjay5cbiAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLFxuICAgICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICAgICcmID4gKic6IHtcbiAgICAgICAgICAgIHBvaW50ZXJFdmVudHM6ICdhdXRvJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgJyY6OmJlZm9yZSc6IHtcbiAgICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgICAgICAgd2lkdGg6IDEsXG4gICAgICAgICAgICBoZWlnaHQ6ICc1MCUnLFxuICAgICAgICAgICAgbWFyZ2luSW5saW5lRW5kOiAtMSxcbiAgICAgICAgICAgIGNvbnRlbnQ6ICdcIlwiJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0sXG4gICAgICBbYCR7cHJldmlld0Nsc30tbW92aW5nYF06IHtcbiAgICAgICAgW2Ake3ByZXZpZXdDbHN9LXByZXZpZXctaW1nYF06IHtcbiAgICAgICAgICBjdXJzb3I6ICdncmFiYmluZycsXG4gICAgICAgICAgJyYtd3JhcHBlcic6IHtcbiAgICAgICAgICAgIHRyYW5zaXRpb25EdXJhdGlvbjogJzBzJ1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgLy8gT3ZlcnJpZGVcbiAge1xuICAgIFtgJHtjb21wb25lbnRDbHN9LXByZXZpZXctcm9vdGBdOiB7XG4gICAgICBbYCR7cHJldmlld0Nsc30td3JhcGBdOiB7XG4gICAgICAgIHpJbmRleDogdG9rZW4uekluZGV4UG9wdXBcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIC8vIFByZXZpZXcgb3BlcmF0aW9ucyAmIHN3aXRjaFxuICB7XG4gICAgW2Ake2NvbXBvbmVudENsc30tcHJldmlldy1vcGVyYXRpb25zLXdyYXBwZXJgXToge1xuICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICB6SW5kZXg6IHRva2VuLmNhbGModG9rZW4uekluZGV4UG9wdXApLmFkZCgxKS5lcXVhbCgpXG4gICAgfSxcbiAgICAnJic6IFtnZW5QcmV2aWV3T3BlcmF0aW9uc1N0eWxlKHRva2VuKSwgZ2VuUHJldmlld1N3aXRjaFN0eWxlKHRva2VuKV1cbiAgfV07XG59O1xuY29uc3QgZ2VuSW1hZ2VTdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENsc1xuICB9ID0gdG9rZW47XG4gIHJldHVybiB7XG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IGltYWdlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIFtjb21wb25lbnRDbHNdOiB7XG4gICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgW2Ake2NvbXBvbmVudENsc30taW1nYF06IHtcbiAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgaGVpZ2h0OiAnYXV0bycsXG4gICAgICAgIHZlcnRpY2FsQWxpZ246ICdtaWRkbGUnXG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30taW1nLXBsYWNlaG9sZGVyYF06IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0b2tlbi5jb2xvckJnQ29udGFpbmVyRGlzYWJsZWQsXG4gICAgICAgIGJhY2tncm91bmRJbWFnZTogXCJ1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjNhV1IwYUQwaU1UWWlJR2hsYVdkb2REMGlNVFlpSUhacFpYZENiM2c5SWpBZ01DQXhOaUF4TmlJZ2VHMXNibk05SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpJd01EQXZjM1puSWo0OGNHRjBhQ0JrUFNKTk1UUXVOU0F5TGpWb0xURXpRUzQxTGpVZ01DQXdJREFnTVNBemRqRXdZUzQxTGpVZ01DQXdJREFnTGpVdU5XZ3hNMkV1TlM0MUlEQWdNQ0F3SUM0MUxTNDFWak5oTGpVdU5TQXdJREFnTUMwdU5TMHVOWHBOTlM0eU9ERWdOQzQzTldFeElERWdNQ0F3SURFZ01DQXlJREVnTVNBd0lEQWdNU0F3TFRKNmJUZ3VNRE1nTmk0NE0yRXVNVEkzTGpFeU55QXdJREFnTVMwdU1EZ3hMakF6U0RJdU56WTVZUzR4TWpVdU1USTFJREFnTUNBeExTNHdPVFl0TGpJd04yd3lMalkyTVMwekxqRTFObUV1TVRJMkxqRXlOaUF3SURBZ01TQXVNVGMzTFM0d01UWnNMakF4Tmk0d01UWk1OeTR3T0NBeE1DNHdPV3d5TGpRM0xUSXVPVE5oTGpFeU5pNHhNallnTUNBd0lERWdMakUzTnkwdU1ERTJiQzR3TVRVdU1ERTJJRE11TlRnNElEUXVNalEwWVM0eE1qY3VNVEkzSURBZ01DQXhMUzR3TWk0eE56VjZJaUJtYVd4c1BTSWpPRU00UXpoRElpQm1hV3hzTFhKMWJHVTlJbTV2Ym5wbGNtOGlMejQ4TDNOMlp6ND0nKVwiLFxuICAgICAgICBiYWNrZ3JvdW5kUmVwZWF0OiAnbm8tcmVwZWF0JyxcbiAgICAgICAgYmFja2dyb3VuZFBvc2l0aW9uOiAnY2VudGVyIGNlbnRlcicsXG4gICAgICAgIGJhY2tncm91bmRTaXplOiAnMzAlJ1xuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LW1hc2tgXTogT2JqZWN0LmFzc2lnbih7fSwgZ2VuSW1hZ2VNYXNrU3R5bGUodG9rZW4pKSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LW1hc2s6aG92ZXJgXToge1xuICAgICAgICBvcGFjaXR5OiAxXG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tcGxhY2Vob2xkZXJgXTogT2JqZWN0LmFzc2lnbih7fSwgZ2VuQm94U3R5bGUoKSlcbiAgICB9XG4gIH07XG59O1xuY29uc3QgZ2VuUHJldmlld01vdGlvbiA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIHByZXZpZXdDbHNcbiAgfSA9IHRva2VuO1xuICByZXR1cm4ge1xuICAgIFtgJHtwcmV2aWV3Q2xzfS1yb290YF06IGluaXRab29tTW90aW9uKHRva2VuLCAnem9vbScpLFxuICAgICcmJzogaW5pdEZhZGVNb3Rpb24odG9rZW4sIHRydWUpXG4gIH07XG59O1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEV4cG9ydCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmV4cG9ydCBjb25zdCBwcmVwYXJlQ29tcG9uZW50VG9rZW4gPSB0b2tlbiA9PiAoe1xuICB6SW5kZXhQb3B1cDogdG9rZW4uekluZGV4UG9wdXBCYXNlICsgODAsXG4gIHByZXZpZXdPcGVyYXRpb25Db2xvcjogbmV3IEZhc3RDb2xvcih0b2tlbi5jb2xvclRleHRMaWdodFNvbGlkKS5zZXRBKDAuNjUpLnRvUmdiU3RyaW5nKCksXG4gIHByZXZpZXdPcGVyYXRpb25Ib3ZlckNvbG9yOiBuZXcgRmFzdENvbG9yKHRva2VuLmNvbG9yVGV4dExpZ2h0U29saWQpLnNldEEoMC44NSkudG9SZ2JTdHJpbmcoKSxcbiAgcHJldmlld09wZXJhdGlvbkNvbG9yRGlzYWJsZWQ6IG5ldyBGYXN0Q29sb3IodG9rZW4uY29sb3JUZXh0TGlnaHRTb2xpZCkuc2V0QSgwLjI1KS50b1JnYlN0cmluZygpLFxuICBwcmV2aWV3T3BlcmF0aW9uU2l6ZTogdG9rZW4uZm9udFNpemVJY29uICogMS41IC8vIEZJWE1FOiBmb250U2l6ZUljb25MR1xufSk7XG5leHBvcnQgZGVmYXVsdCBnZW5TdHlsZUhvb2tzKCdJbWFnZScsIHRva2VuID0+IHtcbiAgY29uc3QgcHJldmlld0NscyA9IGAke3Rva2VuLmNvbXBvbmVudENsc30tcHJldmlld2A7XG4gIGNvbnN0IGltYWdlVG9rZW4gPSBtZXJnZVRva2VuKHRva2VuLCB7XG4gICAgcHJldmlld0NscyxcbiAgICBtb2RhbE1hc2tCZzogbmV3IEZhc3RDb2xvcignIzAwMCcpLnNldEEoMC40NSkudG9SZ2JTdHJpbmcoKSxcbiAgICAvLyBGSVhNRTogU2hhcmVkIFRva2VuXG4gICAgaW1hZ2VQcmV2aWV3U3dpdGNoU2l6ZTogdG9rZW4uY29udHJvbEhlaWdodExHXG4gIH0pO1xuICByZXR1cm4gW2dlbkltYWdlU3R5bGUoaW1hZ2VUb2tlbiksIGdlbkltYWdlUHJldmlld1N0eWxlKGltYWdlVG9rZW4pLCBnZW5Nb2RhbE1hc2tTdHlsZShtZXJnZVRva2VuKGltYWdlVG9rZW4sIHtcbiAgICBjb21wb25lbnRDbHM6IHByZXZpZXdDbHNcbiAgfSkpLCBnZW5QcmV2aWV3TW90aW9uKGltYWdlVG9rZW4pXTtcbn0sIHByZXBhcmVDb21wb25lbnRUb2tlbik7IiwgIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDb250ZXh0LCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyBkZXZVc2VXYXJuaW5nIH0gZnJvbSAnLi4vX3V0aWwvd2FybmluZyc7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCB7IEZvcm1JdGVtSW5wdXRDb250ZXh0IH0gZnJvbSAnLi4vZm9ybS9jb250ZXh0JztcbmltcG9ydCB1c2VTdHlsZSBmcm9tICcuL3N0eWxlJztcbi8qKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIGBTcGFjZS5Db21wYWN0YCAqL1xuY29uc3QgR3JvdXAgPSBwcm9wcyA9PiB7XG4gIGNvbnN0IHtcbiAgICBnZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uXG4gIH0gPSB1c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpO1xuICBjb25zdCB7XG4gICAgcHJlZml4Q2xzOiBjdXN0b21pemVQcmVmaXhDbHMsXG4gICAgY2xhc3NOYW1lXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdpbnB1dC1ncm91cCcsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIGNvbnN0IGlucHV0UHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdpbnB1dCcpO1xuICBjb25zdCBbd3JhcENTU1ZhciwgaGFzaElkLCBjc3NWYXJDbHNdID0gdXNlU3R5bGUoaW5wdXRQcmVmaXhDbHMpO1xuICBjb25zdCBjbHMgPSBjbGFzc05hbWVzKHByZWZpeENscywgY3NzVmFyQ2xzLCB7XG4gICAgW2Ake3ByZWZpeENsc30tbGdgXTogcHJvcHMuc2l6ZSA9PT0gJ2xhcmdlJyxcbiAgICBbYCR7cHJlZml4Q2xzfS1zbWBdOiBwcm9wcy5zaXplID09PSAnc21hbGwnLFxuICAgIFtgJHtwcmVmaXhDbHN9LWNvbXBhY3RgXTogcHJvcHMuY29tcGFjdCxcbiAgICBbYCR7cHJlZml4Q2xzfS1ydGxgXTogZGlyZWN0aW9uID09PSAncnRsJ1xuICB9LCBoYXNoSWQsIGNsYXNzTmFtZSk7XG4gIGNvbnN0IGZvcm1JdGVtQ29udGV4dCA9IHVzZUNvbnRleHQoRm9ybUl0ZW1JbnB1dENvbnRleHQpO1xuICBjb25zdCBncm91cEZvcm1JdGVtQ29udGV4dCA9IHVzZU1lbW8oKCkgPT4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBmb3JtSXRlbUNvbnRleHQpLCB7XG4gICAgaXNGb3JtSXRlbUlucHV0OiBmYWxzZVxuICB9KSwgW2Zvcm1JdGVtQ29udGV4dF0pO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGNvbnN0IHdhcm5pbmcgPSBkZXZVc2VXYXJuaW5nKCdJbnB1dC5Hcm91cCcpO1xuICAgIHdhcm5pbmcuZGVwcmVjYXRlZChmYWxzZSwgJ0lucHV0Lkdyb3VwJywgJ1NwYWNlLkNvbXBhY3QnKTtcbiAgfVxuICByZXR1cm4gd3JhcENTU1ZhcigvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogY2xzLFxuICAgIHN0eWxlOiBwcm9wcy5zdHlsZSxcbiAgICBvbk1vdXNlRW50ZXI6IHByb3BzLm9uTW91c2VFbnRlcixcbiAgICBvbk1vdXNlTGVhdmU6IHByb3BzLm9uTW91c2VMZWF2ZSxcbiAgICBvbkZvY3VzOiBwcm9wcy5vbkZvY3VzLFxuICAgIG9uQmx1cjogcHJvcHMub25CbHVyXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZvcm1JdGVtSW5wdXRDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IGdyb3VwRm9ybUl0ZW1Db250ZXh0XG4gIH0sIHByb3BzLmNoaWxkcmVuKSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IEdyb3VwOyIsICJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB1c2VFdmVudCBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VFdmVudFwiO1xuaW1wb3J0IHBpY2tBdHRycyBmcm9tIFwicmMtdXRpbC9lcy9waWNrQXR0cnNcIjtcbmltcG9ydCB7IGdldE1lcmdlZFN0YXR1cyB9IGZyb20gJy4uLy4uL191dGlsL3N0YXR1c1V0aWxzJztcbmltcG9ydCB7IGRldlVzZVdhcm5pbmcgfSBmcm9tICcuLi8uLi9fdXRpbC93YXJuaW5nJztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi8uLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHVzZVNpemUgZnJvbSAnLi4vLi4vY29uZmlnLXByb3ZpZGVyL2hvb2tzL3VzZVNpemUnO1xuaW1wb3J0IHsgRm9ybUl0ZW1JbnB1dENvbnRleHQgfSBmcm9tICcuLi8uLi9mb3JtL2NvbnRleHQnO1xuaW1wb3J0IHVzZVN0eWxlIGZyb20gJy4uL3N0eWxlL290cCc7XG5pbXBvcnQgT1RQSW5wdXQgZnJvbSAnLi9PVFBJbnB1dCc7XG5mdW5jdGlvbiBzdHJUb0FycihzdHIpIHtcbiAgcmV0dXJuIChzdHIgfHwgJycpLnNwbGl0KCcnKTtcbn1cbmNvbnN0IFNlcGFyYXRvciA9IHByb3BzID0+IHtcbiAgY29uc3Qge1xuICAgIGluZGV4LFxuICAgIHByZWZpeENscyxcbiAgICBzZXBhcmF0b3JcbiAgfSA9IHByb3BzO1xuICBjb25zdCBzZXBhcmF0b3JOb2RlID0gdHlwZW9mIHNlcGFyYXRvciA9PT0gJ2Z1bmN0aW9uJyA/IHNlcGFyYXRvcihpbmRleCkgOiBzZXBhcmF0b3I7XG4gIGlmICghc2VwYXJhdG9yTm9kZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogYCR7cHJlZml4Q2xzfS1zZXBhcmF0b3JgXG4gIH0sIHNlcGFyYXRvck5vZGUpO1xufTtcbmNvbnN0IE9UUCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgcmVmKSA9PiB7XG4gIGNvbnN0IHtcbiAgICAgIHByZWZpeENsczogY3VzdG9taXplUHJlZml4Q2xzLFxuICAgICAgbGVuZ3RoID0gNixcbiAgICAgIHNpemU6IGN1c3RvbVNpemUsXG4gICAgICBkZWZhdWx0VmFsdWUsXG4gICAgICB2YWx1ZSxcbiAgICAgIG9uQ2hhbmdlLFxuICAgICAgZm9ybWF0dGVyLFxuICAgICAgc2VwYXJhdG9yLFxuICAgICAgdmFyaWFudCxcbiAgICAgIGRpc2FibGVkLFxuICAgICAgc3RhdHVzOiBjdXN0b21TdGF0dXMsXG4gICAgICBhdXRvRm9jdXMsXG4gICAgICBtYXNrLFxuICAgICAgdHlwZSxcbiAgICAgIG9uSW5wdXQsXG4gICAgICBpbnB1dE1vZGVcbiAgICB9ID0gcHJvcHMsXG4gICAgcmVzdFByb3BzID0gX19yZXN0KHByb3BzLCBbXCJwcmVmaXhDbHNcIiwgXCJsZW5ndGhcIiwgXCJzaXplXCIsIFwiZGVmYXVsdFZhbHVlXCIsIFwidmFsdWVcIiwgXCJvbkNoYW5nZVwiLCBcImZvcm1hdHRlclwiLCBcInNlcGFyYXRvclwiLCBcInZhcmlhbnRcIiwgXCJkaXNhYmxlZFwiLCBcInN0YXR1c1wiLCBcImF1dG9Gb2N1c1wiLCBcIm1hc2tcIiwgXCJ0eXBlXCIsIFwib25JbnB1dFwiLCBcImlucHV0TW9kZVwiXSk7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgY29uc3Qgd2FybmluZyA9IGRldlVzZVdhcm5pbmcoJ0lucHV0Lk9UUCcpO1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoISh0eXBlb2YgbWFzayA9PT0gJ3N0cmluZycgJiYgbWFzay5sZW5ndGggPiAxKSwgJ3VzYWdlJywgJ2BtYXNrYCBwcm9wIHNob3VsZCBiZSBhIHNpbmdsZSBjaGFyYWN0ZXIuJykgOiB2b2lkIDA7XG4gIH1cbiAgY29uc3Qge1xuICAgIGdldFByZWZpeENscyxcbiAgICBkaXJlY3Rpb25cbiAgfSA9IFJlYWN0LnVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCk7XG4gIGNvbnN0IHByZWZpeENscyA9IGdldFByZWZpeENscygnb3RwJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgY29uc3QgZG9tQXR0cnMgPSBwaWNrQXR0cnMocmVzdFByb3BzLCB7XG4gICAgYXJpYTogdHJ1ZSxcbiAgICBkYXRhOiB0cnVlLFxuICAgIGF0dHI6IHRydWVcbiAgfSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gUm9vdCA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFN0eWxlXG4gIGNvbnN0IFt3cmFwQ1NTVmFyLCBoYXNoSWQsIGNzc1ZhckNsc10gPSB1c2VTdHlsZShwcmVmaXhDbHMpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IFNpemUgPT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBtZXJnZWRTaXplID0gdXNlU2l6ZShjdHggPT4gY3VzdG9tU2l6ZSAhPT0gbnVsbCAmJiBjdXN0b21TaXplICE9PSB2b2lkIDAgPyBjdXN0b21TaXplIDogY3R4KTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IFN0YXR1cyA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3QgZm9ybUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KEZvcm1JdGVtSW5wdXRDb250ZXh0KTtcbiAgY29uc3QgbWVyZ2VkU3RhdHVzID0gZ2V0TWVyZ2VkU3RhdHVzKGZvcm1Db250ZXh0LnN0YXR1cywgY3VzdG9tU3RhdHVzKTtcbiAgY29uc3QgcHJveHlGb3JtQ29udGV4dCA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBmb3JtQ29udGV4dCksIHtcbiAgICBzdGF0dXM6IG1lcmdlZFN0YXR1cyxcbiAgICBoYXNGZWVkYmFjazogZmFsc2UsXG4gICAgZmVlZGJhY2tJY29uOiBudWxsXG4gIH0pLCBbZm9ybUNvbnRleHQsIG1lcmdlZFN0YXR1c10pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IFJlZnMgPT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBjb250YWluZXJSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIGNvbnN0IHJlZnMgPSBSZWFjdC51c2VSZWYoe30pO1xuICBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgKCkgPT4gKHtcbiAgICBmb2N1czogKCkgPT4ge1xuICAgICAgdmFyIF9hO1xuICAgICAgKF9hID0gcmVmcy5jdXJyZW50WzBdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZm9jdXMoKTtcbiAgICB9LFxuICAgIGJsdXI6ICgpID0+IHtcbiAgICAgIHZhciBfYTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgKF9hID0gcmVmcy5jdXJyZW50W2ldKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYmx1cigpO1xuICAgICAgfVxuICAgIH0sXG4gICAgbmF0aXZlRWxlbWVudDogY29udGFpbmVyUmVmLmN1cnJlbnRcbiAgfSkpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBGb3JtYXR0ZXIgPT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBpbnRlcm5hbEZvcm1hdHRlciA9IHR4dCA9PiBmb3JtYXR0ZXIgPyBmb3JtYXR0ZXIodHh0KSA6IHR4dDtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IFZhbHVlcyA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3QgW3ZhbHVlQ2VsbHMsIHNldFZhbHVlQ2VsbHNdID0gUmVhY3QudXNlU3RhdGUoKCkgPT4gc3RyVG9BcnIoaW50ZXJuYWxGb3JtYXR0ZXIoZGVmYXVsdFZhbHVlIHx8ICcnKSkpO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzZXRWYWx1ZUNlbGxzKHN0clRvQXJyKHZhbHVlKSk7XG4gICAgfVxuICB9LCBbdmFsdWVdKTtcbiAgY29uc3QgdHJpZ2dlclZhbHVlQ2VsbHNDaGFuZ2UgPSB1c2VFdmVudChuZXh0VmFsdWVDZWxscyA9PiB7XG4gICAgc2V0VmFsdWVDZWxscyhuZXh0VmFsdWVDZWxscyk7XG4gICAgaWYgKG9uSW5wdXQpIHtcbiAgICAgIG9uSW5wdXQobmV4dFZhbHVlQ2VsbHMpO1xuICAgIH1cbiAgICAvLyBUcmlnZ2VyIGlmIGFsbCBjZWxscyBhcmUgZmlsbGVkXG4gICAgaWYgKG9uQ2hhbmdlICYmIG5leHRWYWx1ZUNlbGxzLmxlbmd0aCA9PT0gbGVuZ3RoICYmIG5leHRWYWx1ZUNlbGxzLmV2ZXJ5KGMgPT4gYykgJiYgbmV4dFZhbHVlQ2VsbHMuc29tZSgoYywgaW5kZXgpID0+IHZhbHVlQ2VsbHNbaW5kZXhdICE9PSBjKSkge1xuICAgICAgb25DaGFuZ2UobmV4dFZhbHVlQ2VsbHMuam9pbignJykpO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IHBhdGNoVmFsdWUgPSB1c2VFdmVudCgoaW5kZXgsIHR4dCkgPT4ge1xuICAgIGxldCBuZXh0Q2VsbHMgPSBfdG9Db25zdW1hYmxlQXJyYXkodmFsdWVDZWxscyk7XG4gICAgLy8gRmlsbCBjZWxscyB0aWxsIGluZGV4XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmRleDsgaSArPSAxKSB7XG4gICAgICBpZiAoIW5leHRDZWxsc1tpXSkge1xuICAgICAgICBuZXh0Q2VsbHNbaV0gPSAnJztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR4dC5sZW5ndGggPD0gMSkge1xuICAgICAgbmV4dENlbGxzW2luZGV4XSA9IHR4dDtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dENlbGxzID0gbmV4dENlbGxzLnNsaWNlKDAsIGluZGV4KS5jb25jYXQoc3RyVG9BcnIodHh0KSk7XG4gICAgfVxuICAgIG5leHRDZWxscyA9IG5leHRDZWxscy5zbGljZSgwLCBsZW5ndGgpO1xuICAgIC8vIENsZWFuIHRoZSBsYXN0IGVtcHR5IGNlbGxcbiAgICBmb3IgKGxldCBpID0gbmV4dENlbGxzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtPSAxKSB7XG4gICAgICBpZiAobmV4dENlbGxzW2ldKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgbmV4dENlbGxzLnBvcCgpO1xuICAgIH1cbiAgICAvLyBGb3JtYXQgaWYgbmVlZGVkXG4gICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSBpbnRlcm5hbEZvcm1hdHRlcihuZXh0Q2VsbHMubWFwKGMgPT4gYyB8fCAnICcpLmpvaW4oJycpKTtcbiAgICBuZXh0Q2VsbHMgPSBzdHJUb0Fycihmb3JtYXR0ZWRWYWx1ZSkubWFwKChjLCBpKSA9PiB7XG4gICAgICBpZiAoYyA9PT0gJyAnICYmICFuZXh0Q2VsbHNbaV0pIHtcbiAgICAgICAgcmV0dXJuIG5leHRDZWxsc1tpXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjO1xuICAgIH0pO1xuICAgIHJldHVybiBuZXh0Q2VsbHM7XG4gIH0pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gQ2hhbmdlID09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBvbklucHV0Q2hhbmdlID0gKGluZGV4LCB0eHQpID0+IHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3QgbmV4dENlbGxzID0gcGF0Y2hWYWx1ZShpbmRleCwgdHh0KTtcbiAgICBjb25zdCBuZXh0SW5kZXggPSBNYXRoLm1pbihpbmRleCArIHR4dC5sZW5ndGgsIGxlbmd0aCAtIDEpO1xuICAgIGlmIChuZXh0SW5kZXggIT09IGluZGV4ICYmIG5leHRDZWxsc1tpbmRleF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgKF9hID0gcmVmcy5jdXJyZW50W25leHRJbmRleF0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5mb2N1cygpO1xuICAgIH1cbiAgICB0cmlnZ2VyVmFsdWVDZWxsc0NoYW5nZShuZXh0Q2VsbHMpO1xuICB9O1xuICBjb25zdCBvbklucHV0QWN0aXZlQ2hhbmdlID0gbmV4dEluZGV4ID0+IHtcbiAgICB2YXIgX2E7XG4gICAgKF9hID0gcmVmcy5jdXJyZW50W25leHRJbmRleF0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5mb2N1cygpO1xuICB9O1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBpbnB1dFNoYXJlZFByb3BzID0ge1xuICAgIHZhcmlhbnQsXG4gICAgZGlzYWJsZWQsXG4gICAgc3RhdHVzOiBtZXJnZWRTdGF0dXMsXG4gICAgbWFzayxcbiAgICB0eXBlLFxuICAgIGlucHV0TW9kZVxuICB9O1xuICByZXR1cm4gd3JhcENTU1ZhcigvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBPYmplY3QuYXNzaWduKHt9LCBkb21BdHRycywge1xuICAgIHJlZjogY29udGFpbmVyUmVmLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhwcmVmaXhDbHMsIHtcbiAgICAgIFtgJHtwcmVmaXhDbHN9LXNtYF06IG1lcmdlZFNpemUgPT09ICdzbWFsbCcsXG4gICAgICBbYCR7cHJlZml4Q2xzfS1sZ2BdOiBtZXJnZWRTaXplID09PSAnbGFyZ2UnLFxuICAgICAgW2Ake3ByZWZpeENsc30tcnRsYF06IGRpcmVjdGlvbiA9PT0gJ3J0bCdcbiAgICB9LCBjc3NWYXJDbHMsIGhhc2hJZCksXG4gICAgcm9sZTogXCJncm91cFwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGb3JtSXRlbUlucHV0Q29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBwcm94eUZvcm1Db250ZXh0XG4gIH0sIEFycmF5LmZyb20oe1xuICAgIGxlbmd0aFxuICB9KS5tYXAoKF8sIGluZGV4KSA9PiB7XG4gICAgY29uc3Qga2V5ID0gYG90cC0ke2luZGV4fWA7XG4gICAgY29uc3Qgc2luZ2xlVmFsdWUgPSB2YWx1ZUNlbGxzW2luZGV4XSB8fCAnJztcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIHtcbiAgICAgIGtleToga2V5XG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoT1RQSW5wdXQsIE9iamVjdC5hc3NpZ24oe1xuICAgICAgcmVmOiBpbnB1dEVsZSA9PiB7XG4gICAgICAgIHJlZnMuY3VycmVudFtpbmRleF0gPSBpbnB1dEVsZTtcbiAgICAgIH0sXG4gICAgICBpbmRleDogaW5kZXgsXG4gICAgICBzaXplOiBtZXJnZWRTaXplLFxuICAgICAgaHRtbFNpemU6IDEsXG4gICAgICBjbGFzc05hbWU6IGAke3ByZWZpeENsc30taW5wdXRgLFxuICAgICAgb25DaGFuZ2U6IG9uSW5wdXRDaGFuZ2UsXG4gICAgICB2YWx1ZTogc2luZ2xlVmFsdWUsXG4gICAgICBvbkFjdGl2ZUNoYW5nZTogb25JbnB1dEFjdGl2ZUNoYW5nZSxcbiAgICAgIGF1dG9Gb2N1czogaW5kZXggPT09IDAgJiYgYXV0b0ZvY3VzXG4gICAgfSwgaW5wdXRTaGFyZWRQcm9wcykpLCBpbmRleCA8IGxlbmd0aCAtIDEgJiYgKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNlcGFyYXRvciwge1xuICAgICAgc2VwYXJhdG9yOiBzZXBhcmF0b3IsXG4gICAgICBpbmRleDogaW5kZXgsXG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENsc1xuICAgIH0pKSk7XG4gIH0pKSkpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBPVFA7IiwgImltcG9ydCB7IGdlblN0eWxlSG9va3MsIG1lcmdlVG9rZW4gfSBmcm9tICcuLi8uLi90aGVtZS9pbnRlcm5hbCc7XG5pbXBvcnQgeyBpbml0Q29tcG9uZW50VG9rZW4sIGluaXRJbnB1dFRva2VuIH0gZnJvbSAnLi90b2tlbic7XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IE9UUCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuY29uc3QgZ2VuT1RQU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHMsXG4gICAgcGFkZGluZ1hTXG4gIH0gPSB0b2tlbjtcbiAgcmV0dXJuIHtcbiAgICBbY29tcG9uZW50Q2xzXToge1xuICAgICAgZGlzcGxheTogJ2lubGluZS1mbGV4JyxcbiAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgZmxleFdyYXA6ICdub3dyYXAnLFxuICAgICAgY29sdW1uR2FwOiBwYWRkaW5nWFMsXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1pbnB1dC13cmFwcGVyYF06IHtcbiAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LW1hc2staWNvbmBdOiB7XG4gICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgekluZGV4OiAnMScsXG4gICAgICAgICAgdG9wOiAnNTAlJyxcbiAgICAgICAgICByaWdodDogJzUwJScsXG4gICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlKDUwJSwgLTUwJSknLFxuICAgICAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJ1xuICAgICAgICB9LFxuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1tYXNrLWlucHV0YF06IHtcbiAgICAgICAgICBjb2xvcjogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgICBjYXJldENvbG9yOiAndmFyKC0tYW50LWNvbG9yLXRleHQpJ1xuICAgICAgICB9LFxuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1tYXNrLWlucHV0W3R5cGU9bnVtYmVyXTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbmBdOiB7XG4gICAgICAgICAgJy13ZWJraXQtYXBwZWFyYW5jZSc6ICdub25lJyxcbiAgICAgICAgICBtYXJnaW46IDBcbiAgICAgICAgfSxcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30tbWFzay1pbnB1dFt0eXBlPW51bWJlcl1gXToge1xuICAgICAgICAgICctbW96LWFwcGVhcmFuY2UnOiAndGV4dGZpZWxkJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgJyYtcnRsJzoge1xuICAgICAgICBkaXJlY3Rpb246ICdydGwnXG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30taW5wdXRgXToge1xuICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgICBwYWRkaW5nSW5saW5lOiB0b2tlbi5wYWRkaW5nWFhTXG4gICAgICB9LFxuICAgICAgLy8gPT09PT09PT09PT09PT09PT0gU2l6ZSA9PT09PT09PT09PT09PT09PVxuICAgICAgW2AmJHtjb21wb25lbnRDbHN9LXNtICR7Y29tcG9uZW50Q2xzfS1pbnB1dGBdOiB7XG4gICAgICAgIHBhZGRpbmdJbmxpbmU6IHRva2VuLmNhbGModG9rZW4ucGFkZGluZ1hYUykuZGl2KDIpLmVxdWFsKClcbiAgICAgIH0sXG4gICAgICBbYCYke2NvbXBvbmVudENsc30tbGcgJHtjb21wb25lbnRDbHN9LWlucHV0YF06IHtcbiAgICAgICAgcGFkZGluZ0lubGluZTogdG9rZW4ucGFkZGluZ1hTXG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFeHBvcnQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgZGVmYXVsdCBnZW5TdHlsZUhvb2tzKFsnSW5wdXQnLCAnT1RQJ10sIHRva2VuID0+IHtcbiAgY29uc3QgaW5wdXRUb2tlbiA9IG1lcmdlVG9rZW4odG9rZW4sIGluaXRJbnB1dFRva2VuKHRva2VuKSk7XG4gIHJldHVybiBbZ2VuT1RQU3R5bGUoaW5wdXRUb2tlbildO1xufSwgaW5pdENvbXBvbmVudFRva2VuKTsiLCAiXCJ1c2UgY2xpZW50XCI7XG5cbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCByYWYgZnJvbSBcInJjLXV0aWwvZXMvcmFmXCI7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCBJbnB1dCBmcm9tICcuLi9JbnB1dCc7XG5jb25zdCBPVFBJbnB1dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgcmVmKSA9PiB7XG4gIGNvbnN0IHtcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIHZhbHVlLFxuICAgICAgb25DaGFuZ2UsXG4gICAgICBvbkFjdGl2ZUNoYW5nZSxcbiAgICAgIGluZGV4LFxuICAgICAgbWFza1xuICAgIH0gPSBwcm9wcyxcbiAgICByZXN0UHJvcHMgPSBfX3Jlc3QocHJvcHMsIFtcImNsYXNzTmFtZVwiLCBcInZhbHVlXCIsIFwib25DaGFuZ2VcIiwgXCJvbkFjdGl2ZUNoYW5nZVwiLCBcImluZGV4XCIsIFwibWFza1wiXSk7XG4gIGNvbnN0IHtcbiAgICBnZXRQcmVmaXhDbHNcbiAgfSA9IFJlYWN0LnVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCk7XG4gIGNvbnN0IHByZWZpeENscyA9IGdldFByZWZpeENscygnb3RwJyk7XG4gIGNvbnN0IG1hc2tWYWx1ZSA9IHR5cGVvZiBtYXNrID09PSAnc3RyaW5nJyA/IG1hc2sgOiB2YWx1ZTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVmID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBpbnB1dFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgUmVhY3QudXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsICgpID0+IGlucHV0UmVmLmN1cnJlbnQpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IElucHV0ID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IG9uSW50ZXJuYWxDaGFuZ2UgPSBlID0+IHtcbiAgICBvbkNoYW5nZShpbmRleCwgZS50YXJnZXQudmFsdWUpO1xuICB9O1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IEZvY3VzID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IHN5bmNTZWxlY3Rpb24gPSAoKSA9PiB7XG4gICAgcmFmKCgpID0+IHtcbiAgICAgIHZhciBfYTtcbiAgICAgIGNvbnN0IGlucHV0RWxlID0gKF9hID0gaW5wdXRSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmlucHV0O1xuICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IGlucHV0RWxlICYmIGlucHV0RWxlKSB7XG4gICAgICAgIGlucHV0RWxlLnNlbGVjdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gS2V5Ym9hcmQgPT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IG9uSW50ZXJuYWxLZXlEb3duID0gZXZlbnQgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGtleSxcbiAgICAgIGN0cmxLZXksXG4gICAgICBtZXRhS2V5XG4gICAgfSA9IGV2ZW50O1xuICAgIGlmIChrZXkgPT09ICdBcnJvd0xlZnQnKSB7XG4gICAgICBvbkFjdGl2ZUNoYW5nZShpbmRleCAtIDEpO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnQXJyb3dSaWdodCcpIHtcbiAgICAgIG9uQWN0aXZlQ2hhbmdlKGluZGV4ICsgMSk7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09ICd6JyAmJiAoY3RybEtleSB8fCBtZXRhS2V5KSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgc3luY1NlbGVjdGlvbigpO1xuICB9O1xuICBjb25zdCBvbkludGVybmFsS2V5VXAgPSBlID0+IHtcbiAgICBpZiAoZS5rZXkgPT09ICdCYWNrc3BhY2UnICYmICF2YWx1ZSkge1xuICAgICAgb25BY3RpdmVDaGFuZ2UoaW5kZXggLSAxKTtcbiAgICB9XG4gICAgc3luY1NlbGVjdGlvbigpO1xuICB9O1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogYCR7cHJlZml4Q2xzfS1pbnB1dC13cmFwcGVyYCxcbiAgICByb2xlOiBcInByZXNlbnRhdGlvblwiXG4gIH0sIG1hc2sgJiYgdmFsdWUgIT09ICcnICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBgJHtwcmVmaXhDbHN9LW1hc2staWNvbmAsXG4gICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuICB9LCBtYXNrVmFsdWUpKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSW5wdXQsIE9iamVjdC5hc3NpZ24oe1xuICAgIFwiYXJpYS1sYWJlbFwiOiBgT1RQIElucHV0ICR7aW5kZXggKyAxfWAsXG4gICAgdHlwZTogbWFzayA9PT0gdHJ1ZSA/ICdwYXNzd29yZCcgOiAndGV4dCdcbiAgfSwgcmVzdFByb3BzLCB7XG4gICAgcmVmOiBpbnB1dFJlZixcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgb25JbnB1dDogb25JbnRlcm5hbENoYW5nZSxcbiAgICBvbkZvY3VzOiBzeW5jU2VsZWN0aW9uLFxuICAgIG9uS2V5RG93bjogb25JbnRlcm5hbEtleURvd24sXG4gICAgb25LZXlVcDogb25JbnRlcm5hbEtleVVwLFxuICAgIG9uTW91c2VEb3duOiBzeW5jU2VsZWN0aW9uLFxuICAgIG9uTW91c2VVcDogc3luY1NlbGVjdGlvbixcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCB7XG4gICAgICBbYCR7cHJlZml4Q2xzfS1tYXNrLWlucHV0YF06IG1hc2tcbiAgICB9KVxuICB9KSkpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBPVFBJbnB1dDsiLCAiXCJ1c2UgY2xpZW50XCI7XG5cbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IEV5ZUludmlzaWJsZU91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9FeWVJbnZpc2libGVPdXRsaW5lZFwiO1xuaW1wb3J0IEV5ZU91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9FeWVPdXRsaW5lZFwiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgb21pdCBmcm9tIFwicmMtdXRpbC9lcy9vbWl0XCI7XG5pbXBvcnQgeyBjb21wb3NlUmVmIH0gZnJvbSBcInJjLXV0aWwvZXMvcmVmXCI7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCBEaXNhYmxlZENvbnRleHQgZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL0Rpc2FibGVkQ29udGV4dCc7XG5pbXBvcnQgdXNlUmVtb3ZlUGFzc3dvcmRUaW1lb3V0IGZyb20gJy4vaG9va3MvdXNlUmVtb3ZlUGFzc3dvcmRUaW1lb3V0JztcbmltcG9ydCBJbnB1dCBmcm9tICcuL0lucHV0JztcbmNvbnN0IGRlZmF1bHRJY29uUmVuZGVyID0gdmlzaWJsZSA9PiB2aXNpYmxlID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRXllT3V0bGluZWQsIG51bGwpIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRXllSW52aXNpYmxlT3V0bGluZWQsIG51bGwpO1xuY29uc3QgYWN0aW9uTWFwID0ge1xuICBjbGljazogJ29uQ2xpY2snLFxuICBob3ZlcjogJ29uTW91c2VPdmVyJ1xufTtcbmNvbnN0IFBhc3N3b3JkID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHByb3BzLCByZWYpID0+IHtcbiAgY29uc3Qge1xuICAgIGRpc2FibGVkOiBjdXN0b21EaXNhYmxlZCxcbiAgICBhY3Rpb24gPSAnY2xpY2snLFxuICAgIHZpc2liaWxpdHlUb2dnbGUgPSB0cnVlLFxuICAgIGljb25SZW5kZXIgPSBkZWZhdWx0SWNvblJlbmRlclxuICB9ID0gcHJvcHM7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PSBEaXNhYmxlZCA9PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3QgZGlzYWJsZWQgPSBSZWFjdC51c2VDb250ZXh0KERpc2FibGVkQ29udGV4dCk7XG4gIGNvbnN0IG1lcmdlZERpc2FibGVkID0gY3VzdG9tRGlzYWJsZWQgIT09IG51bGwgJiYgY3VzdG9tRGlzYWJsZWQgIT09IHZvaWQgMCA/IGN1c3RvbURpc2FibGVkIDogZGlzYWJsZWQ7XG4gIGNvbnN0IHZpc2liaWxpdHlDb250cm9sbGVkID0gdHlwZW9mIHZpc2liaWxpdHlUb2dnbGUgPT09ICdvYmplY3QnICYmIHZpc2liaWxpdHlUb2dnbGUudmlzaWJsZSAhPT0gdW5kZWZpbmVkO1xuICBjb25zdCBbdmlzaWJsZSwgc2V0VmlzaWJsZV0gPSB1c2VTdGF0ZSgoKSA9PiB2aXNpYmlsaXR5Q29udHJvbGxlZCA/IHZpc2liaWxpdHlUb2dnbGUudmlzaWJsZSA6IGZhbHNlKTtcbiAgY29uc3QgaW5wdXRSZWYgPSB1c2VSZWYobnVsbCk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHZpc2liaWxpdHlDb250cm9sbGVkKSB7XG4gICAgICBzZXRWaXNpYmxlKHZpc2liaWxpdHlUb2dnbGUudmlzaWJsZSk7XG4gICAgfVxuICB9LCBbdmlzaWJpbGl0eUNvbnRyb2xsZWQsIHZpc2liaWxpdHlUb2dnbGVdKTtcbiAgLy8gUmVtb3ZlIFBhc3N3b3JkIHZhbHVlXG4gIGNvbnN0IHJlbW92ZVBhc3N3b3JkVGltZW91dCA9IHVzZVJlbW92ZVBhc3N3b3JkVGltZW91dChpbnB1dFJlZik7XG4gIGNvbnN0IG9uVmlzaWJsZUNoYW5nZSA9ICgpID0+IHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKG1lcmdlZERpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh2aXNpYmxlKSB7XG4gICAgICByZW1vdmVQYXNzd29yZFRpbWVvdXQoKTtcbiAgICB9XG4gICAgY29uc3QgbmV4dFZpc2libGUgPSAhdmlzaWJsZTtcbiAgICBzZXRWaXNpYmxlKG5leHRWaXNpYmxlKTtcbiAgICBpZiAodHlwZW9mIHZpc2liaWxpdHlUb2dnbGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAoX2EgPSB2aXNpYmlsaXR5VG9nZ2xlLm9uVmlzaWJsZUNoYW5nZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwodmlzaWJpbGl0eVRvZ2dsZSwgbmV4dFZpc2libGUpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgZ2V0SWNvbiA9IHByZWZpeENscyA9PiB7XG4gICAgY29uc3QgaWNvblRyaWdnZXIgPSBhY3Rpb25NYXBbYWN0aW9uXSB8fCAnJztcbiAgICBjb25zdCBpY29uID0gaWNvblJlbmRlcih2aXNpYmxlKTtcbiAgICBjb25zdCBpY29uUHJvcHMgPSB7XG4gICAgICBbaWNvblRyaWdnZXJdOiBvblZpc2libGVDaGFuZ2UsXG4gICAgICBjbGFzc05hbWU6IGAke3ByZWZpeENsc30taWNvbmAsXG4gICAgICBrZXk6ICdwYXNzd29yZEljb24nLFxuICAgICAgb25Nb3VzZURvd246IGUgPT4ge1xuICAgICAgICAvLyBQcmV2ZW50IGZvY3VzZWQgc3RhdGUgbG9zdFxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8xNTE3M1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9LFxuICAgICAgb25Nb3VzZVVwOiBlID0+IHtcbiAgICAgICAgLy8gUHJldmVudCBjYXJldCBwb3NpdGlvbiBjaGFuZ2VcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMjM1MjRcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KGljb24pID8gaWNvbiA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBpY29uKSwgaWNvblByb3BzKTtcbiAgfTtcbiAgY29uc3Qge1xuICAgICAgY2xhc3NOYW1lLFxuICAgICAgcHJlZml4Q2xzOiBjdXN0b21pemVQcmVmaXhDbHMsXG4gICAgICBpbnB1dFByZWZpeENsczogY3VzdG9taXplSW5wdXRQcmVmaXhDbHMsXG4gICAgICBzaXplXG4gICAgfSA9IHByb3BzLFxuICAgIHJlc3RQcm9wcyA9IF9fcmVzdChwcm9wcywgW1wiY2xhc3NOYW1lXCIsIFwicHJlZml4Q2xzXCIsIFwiaW5wdXRQcmVmaXhDbHNcIiwgXCJzaXplXCJdKTtcbiAgY29uc3Qge1xuICAgIGdldFByZWZpeENsc1xuICB9ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KTtcbiAgY29uc3QgaW5wdXRQcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2lucHV0JywgY3VzdG9taXplSW5wdXRQcmVmaXhDbHMpO1xuICBjb25zdCBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2lucHV0LXBhc3N3b3JkJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgY29uc3Qgc3VmZml4SWNvbiA9IHZpc2liaWxpdHlUb2dnbGUgJiYgZ2V0SWNvbihwcmVmaXhDbHMpO1xuICBjb25zdCBpbnB1dENsYXNzTmFtZSA9IGNsYXNzTmFtZXMocHJlZml4Q2xzLCBjbGFzc05hbWUsIHtcbiAgICBbYCR7cHJlZml4Q2xzfS0ke3NpemV9YF06ICEhc2l6ZVxuICB9KTtcbiAgY29uc3Qgb21pdHRlZFByb3BzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvbWl0KHJlc3RQcm9wcywgWydzdWZmaXgnLCAnaWNvblJlbmRlcicsICd2aXNpYmlsaXR5VG9nZ2xlJ10pKSwge1xuICAgIHR5cGU6IHZpc2libGUgPyAndGV4dCcgOiAncGFzc3dvcmQnLFxuICAgIGNsYXNzTmFtZTogaW5wdXRDbGFzc05hbWUsXG4gICAgcHJlZml4Q2xzOiBpbnB1dFByZWZpeENscyxcbiAgICBzdWZmaXg6IHN1ZmZpeEljb25cbiAgfSk7XG4gIGlmIChzaXplKSB7XG4gICAgb21pdHRlZFByb3BzLnNpemUgPSBzaXplO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJbnB1dCwgT2JqZWN0LmFzc2lnbih7XG4gICAgcmVmOiBjb21wb3NlUmVmKHJlZiwgaW5wdXRSZWYpXG4gIH0sIG9taXR0ZWRQcm9wcykpO1xufSk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBQYXNzd29yZC5kaXNwbGF5TmFtZSA9ICdJbnB1dC5QYXNzd29yZCc7XG59XG5leHBvcnQgZGVmYXVsdCBQYXNzd29yZDsiLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRXllSW52aXNpYmxlT3V0bGluZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vRXllSW52aXNpYmxlT3V0bGluZWRcIjtcbmltcG9ydCBBbnRkSWNvbiBmcm9tIFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiO1xudmFyIEV5ZUludmlzaWJsZU91dGxpbmVkID0gZnVuY3Rpb24gRXllSW52aXNpYmxlT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IEV5ZUludmlzaWJsZU91dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5cbi8qKiFbZXllLWludmlzaWJsZV0oZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTlRBaUlHaGxhV2RvZEQwaU5UQWlJR1pwYkd3OUlpTmpZV05oWTJFaUlIWnBaWGRDYjNnOUlqWTBJRFkwSURnNU5pQTRPVFlpSUdadlkzVnpZV0pzWlQwaVptRnNjMlVpSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUkrUEhCaGRHZ2daRDBpVFRrME1pNHlJRFE0Tmk0eVVUZzRPUzQwTnlBek56VXVNVEVnT0RFMkxqY2dNekExYkMwMU1DNDRPQ0ExTUM0NE9FTTRNRGN1TXpFZ016azFMalV6SURnME15NDBOU0EwTkRjdU5DQTROelF1TnlBMU1USWdOemt4TGpVZ05qZzBMaklnTmpjekxqUWdOelkySURVeE1pQTNOalp4TFRjeUxqWTNJREF0TVRNekxqZzNMVEl5TGpNNFRETXlNeUEzT1RndU56VlJOREE0SURnek9DQTFNVElnT0RNNGNUSTRPQzR6SURBZ05ETXdMakl0TXpBd0xqTmhOakF1TWprZ05qQXVNamtnTUNBd01EQXROVEV1TlhwdExUWXpMalUzTFRNeU1DNDJORXc0TXpZZ01USXlMamc0WVRnZ09DQXdJREF3TFRFeExqTXlJREJNTnpFMUxqTXhJREl6TWk0eVVUWXlOQzQ0TmlBeE9EWWdOVEV5SURFNE5uRXRNamc0TGpNZ01DMDBNekF1TWlBek1EQXVNMkUyTUM0eklEWXdMak1nTUNBd01EQWdOVEV1TlhFMU5pNDJPU0F4TVRrdU5DQXhNell1TlNBeE9URXVOREZNTVRFeUxqUTRJRGd6TldFNElEZ2dNQ0F3TURBZ01URXVNekZNTVRVMUxqRTNJRGc0T1dFNElEZ2dNQ0F3TURFeExqTXhJREJzTnpFeUxqRTFMVGN4TWk0eE1tRTRJRGdnTUNBd01EQXRNVEV1TXpKNlRURTBPUzR6SURVeE1rTXlNekl1TmlBek16a3VPQ0F6TlRBdU55QXlOVGdnTlRFeUlESTFPR00xTkM0MU5DQXdJREV3TkM0eE15QTVMak0ySURFME9TNHhNaUF5T0M0ek9Xd3ROekF1TXlBM01DNHpZVEUzTmlBeE56WWdNQ0F3TUMweU16Z3VNVE1nTWpNNExqRXpiQzA0TXk0ME1pQTRNeTQwTWtNeU1qTXVNU0EyTXpjdU5Ea2dNVGd6TGpNZ05UZ3lMakk0SURFME9TNHpJRFV4TW5wdE1qUTJMamNnTUdFeE1USXVNVEVnTVRFeUxqRXhJREFnTURFeE5EWXVNaTB4TURZdU5qbE1OREF4TGpNeElEVTBOaTR5UVRFeE1pQXhNVElnTUNBd01UTTVOaUExTVRKNklpQXZQanh3WVhSb0lHUTlJazAxTURnZ05qSTBZeTB6TGpRMklEQXROaTQ0TnkwdU1UWXRNVEF1TWpVdExqUTNiQzAxTWk0NE1pQTFNaTQ0TW1FeE56WXVNRGtnTVRjMkxqQTVJREFnTURBeU1qY3VOREl0TWpJM0xqUXliQzAxTWk0NE1pQTFNaTQ0TW1NdU16RWdNeTR6T0M0ME55QTJMamM1TGpRM0lERXdMakkxWVRFeE1TNDVOQ0F4TVRFdU9UUWdNQ0F3TVMweE1USWdNVEV5ZWlJZ0x6NDhMM04yWno0PSkgKi9cbnZhciBSZWZJY29uID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoRXllSW52aXNpYmxlT3V0bGluZWQpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgUmVmSWNvbi5kaXNwbGF5TmFtZSA9ICdFeWVJbnZpc2libGVPdXRsaW5lZCc7XG59XG5leHBvcnQgZGVmYXVsdCBSZWZJY29uOyIsICIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBFeWVJbnZpc2libGVPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNOTQyLjIgNDg2LjJRODg5LjQ3IDM3NS4xMSA4MTYuNyAzMDVsLTUwLjg4IDUwLjg4QzgwNy4zMSAzOTUuNTMgODQzLjQ1IDQ0Ny40IDg3NC43IDUxMiA3OTEuNSA2ODQuMiA2NzMuNCA3NjYgNTEyIDc2NnEtNzIuNjcgMC0xMzMuODctMjIuMzhMMzIzIDc5OC43NVE0MDggODM4IDUxMiA4MzhxMjg4LjMgMCA0MzAuMi0zMDAuM2E2MC4yOSA2MC4yOSAwIDAwMC01MS41em0tNjMuNTctMzIwLjY0TDgzNiAxMjIuODhhOCA4IDAgMDAtMTEuMzIgMEw3MTUuMzEgMjMyLjJRNjI0Ljg2IDE4NiA1MTIgMTg2cS0yODguMyAwLTQzMC4yIDMwMC4zYTYwLjMgNjAuMyAwIDAwMCA1MS41cTU2LjY5IDExOS40IDEzNi41IDE5MS40MUwxMTIuNDggODM1YTggOCAwIDAwMCAxMS4zMUwxNTUuMTcgODg5YTggOCAwIDAwMTEuMzEgMGw3MTIuMTUtNzEyLjEyYTggOCAwIDAwMC0xMS4zMnpNMTQ5LjMgNTEyQzIzMi42IDMzOS44IDM1MC43IDI1OCA1MTIgMjU4YzU0LjU0IDAgMTA0LjEzIDkuMzYgMTQ5LjEyIDI4LjM5bC03MC4zIDcwLjNhMTc2IDE3NiAwIDAwLTIzOC4xMyAyMzguMTNsLTgzLjQyIDgzLjQyQzIyMy4xIDYzNy40OSAxODMuMyA1ODIuMjggMTQ5LjMgNTEyem0yNDYuNyAwYTExMi4xMSAxMTIuMTEgMCAwMTE0Ni4yLTEwNi42OUw0MDEuMzEgNTQ2LjJBMTEyIDExMiAwIDAxMzk2IDUxMnpcIiB9IH0sIHsgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNTA4IDYyNGMtMy40NiAwLTYuODctLjE2LTEwLjI1LS40N2wtNTIuODIgNTIuODJhMTc2LjA5IDE3Ni4wOSAwIDAwMjI3LjQyLTIyNy40MmwtNTIuODIgNTIuODJjLjMxIDMuMzguNDcgNi43OS40NyAxMC4yNWExMTEuOTQgMTExLjk0IDAgMDEtMTEyIDExMnpcIiB9IH1dIH0sIFwibmFtZVwiOiBcImV5ZS1pbnZpc2libGVcIiwgXCJ0aGVtZVwiOiBcIm91dGxpbmVkXCIgfTtcbmV4cG9ydCBkZWZhdWx0IEV5ZUludmlzaWJsZU91dGxpbmVkO1xuIiwgIlwidXNlIGNsaWVudFwiO1xuXG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFNlYXJjaE91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9TZWFyY2hPdXRsaW5lZFwiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyBjb21wb3NlUmVmIH0gZnJvbSBcInJjLXV0aWwvZXMvcmVmXCI7XG5pbXBvcnQgeyBjbG9uZUVsZW1lbnQgfSBmcm9tICcuLi9fdXRpbC9yZWFjdE5vZGUnO1xuaW1wb3J0IEJ1dHRvbiBmcm9tICcuLi9idXR0b24nO1xuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgdXNlU2l6ZSBmcm9tICcuLi9jb25maWctcHJvdmlkZXIvaG9va3MvdXNlU2l6ZSc7XG5pbXBvcnQgeyB1c2VDb21wYWN0SXRlbUNvbnRleHQgfSBmcm9tICcuLi9zcGFjZS9Db21wYWN0JztcbmltcG9ydCBJbnB1dCBmcm9tICcuL0lucHV0JztcbmNvbnN0IFNlYXJjaCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgcmVmKSA9PiB7XG4gIGNvbnN0IHtcbiAgICAgIHByZWZpeENsczogY3VzdG9taXplUHJlZml4Q2xzLFxuICAgICAgaW5wdXRQcmVmaXhDbHM6IGN1c3RvbWl6ZUlucHV0UHJlZml4Q2xzLFxuICAgICAgY2xhc3NOYW1lLFxuICAgICAgc2l6ZTogY3VzdG9taXplU2l6ZSxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGVudGVyQnV0dG9uID0gZmFsc2UsXG4gICAgICBhZGRvbkFmdGVyLFxuICAgICAgbG9hZGluZyxcbiAgICAgIGRpc2FibGVkLFxuICAgICAgb25TZWFyY2g6IGN1c3RvbU9uU2VhcmNoLFxuICAgICAgb25DaGFuZ2U6IGN1c3RvbU9uQ2hhbmdlLFxuICAgICAgb25Db21wb3NpdGlvblN0YXJ0LFxuICAgICAgb25Db21wb3NpdGlvbkVuZFxuICAgIH0gPSBwcm9wcyxcbiAgICByZXN0UHJvcHMgPSBfX3Jlc3QocHJvcHMsIFtcInByZWZpeENsc1wiLCBcImlucHV0UHJlZml4Q2xzXCIsIFwiY2xhc3NOYW1lXCIsIFwic2l6ZVwiLCBcInN1ZmZpeFwiLCBcImVudGVyQnV0dG9uXCIsIFwiYWRkb25BZnRlclwiLCBcImxvYWRpbmdcIiwgXCJkaXNhYmxlZFwiLCBcIm9uU2VhcmNoXCIsIFwib25DaGFuZ2VcIiwgXCJvbkNvbXBvc2l0aW9uU3RhcnRcIiwgXCJvbkNvbXBvc2l0aW9uRW5kXCJdKTtcbiAgY29uc3Qge1xuICAgIGdldFByZWZpeENscyxcbiAgICBkaXJlY3Rpb25cbiAgfSA9IFJlYWN0LnVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCk7XG4gIGNvbnN0IGNvbXBvc2VkUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgY29uc3QgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdpbnB1dC1zZWFyY2gnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICBjb25zdCBpbnB1dFByZWZpeENscyA9IGdldFByZWZpeENscygnaW5wdXQnLCBjdXN0b21pemVJbnB1dFByZWZpeENscyk7XG4gIGNvbnN0IHtcbiAgICBjb21wYWN0U2l6ZVxuICB9ID0gdXNlQ29tcGFjdEl0ZW1Db250ZXh0KHByZWZpeENscywgZGlyZWN0aW9uKTtcbiAgY29uc3Qgc2l6ZSA9IHVzZVNpemUoY3R4ID0+IHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIChfYSA9IGN1c3RvbWl6ZVNpemUgIT09IG51bGwgJiYgY3VzdG9taXplU2l6ZSAhPT0gdm9pZCAwID8gY3VzdG9taXplU2l6ZSA6IGNvbXBhY3RTaXplKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBjdHg7XG4gIH0pO1xuICBjb25zdCBpbnB1dFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3Qgb25DaGFuZ2UgPSBlID0+IHtcbiAgICBpZiAoKGUgPT09IG51bGwgfHwgZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZS50YXJnZXQpICYmIGUudHlwZSA9PT0gJ2NsaWNrJyAmJiBjdXN0b21PblNlYXJjaCkge1xuICAgICAgY3VzdG9tT25TZWFyY2goZS50YXJnZXQudmFsdWUsIGUsIHtcbiAgICAgICAgc291cmNlOiAnY2xlYXInXG4gICAgICB9KTtcbiAgICB9XG4gICAgY3VzdG9tT25DaGFuZ2UgPT09IG51bGwgfHwgY3VzdG9tT25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGN1c3RvbU9uQ2hhbmdlKGUpO1xuICB9O1xuICBjb25zdCBvbk1vdXNlRG93biA9IGUgPT4ge1xuICAgIHZhciBfYTtcbiAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gKChfYSA9IGlucHV0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5pbnB1dCkpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IG9uU2VhcmNoID0gZSA9PiB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICBpZiAoY3VzdG9tT25TZWFyY2gpIHtcbiAgICAgIGN1c3RvbU9uU2VhcmNoKChfYiA9IChfYSA9IGlucHV0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5pbnB1dCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnZhbHVlLCBlLCB7XG4gICAgICAgIHNvdXJjZTogJ2lucHV0J1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICBjb25zdCBvblByZXNzRW50ZXIgPSBlID0+IHtcbiAgICBpZiAoY29tcG9zZWRSZWYuY3VycmVudCB8fCBsb2FkaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG9uU2VhcmNoKGUpO1xuICB9O1xuICBjb25zdCBzZWFyY2hJY29uID0gdHlwZW9mIGVudGVyQnV0dG9uID09PSAnYm9vbGVhbicgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTZWFyY2hPdXRsaW5lZCwgbnVsbCkgOiBudWxsO1xuICBjb25zdCBidG5DbGFzc05hbWUgPSBgJHtwcmVmaXhDbHN9LWJ1dHRvbmA7XG4gIGxldCBidXR0b247XG4gIGNvbnN0IGVudGVyQnV0dG9uQXNFbGVtZW50ID0gZW50ZXJCdXR0b24gfHwge307XG4gIGNvbnN0IGlzQW50ZEJ1dHRvbiA9IGVudGVyQnV0dG9uQXNFbGVtZW50LnR5cGUgJiYgZW50ZXJCdXR0b25Bc0VsZW1lbnQudHlwZS5fX0FOVF9CVVRUT04gPT09IHRydWU7XG4gIGlmIChpc0FudGRCdXR0b24gfHwgZW50ZXJCdXR0b25Bc0VsZW1lbnQudHlwZSA9PT0gJ2J1dHRvbicpIHtcbiAgICBidXR0b24gPSBjbG9uZUVsZW1lbnQoZW50ZXJCdXR0b25Bc0VsZW1lbnQsIE9iamVjdC5hc3NpZ24oe1xuICAgICAgb25Nb3VzZURvd24sXG4gICAgICBvbkNsaWNrOiBlID0+IHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgKF9iID0gKF9hID0gZW50ZXJCdXR0b25Bc0VsZW1lbnQgPT09IG51bGwgfHwgZW50ZXJCdXR0b25Bc0VsZW1lbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVudGVyQnV0dG9uQXNFbGVtZW50LnByb3BzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eub25DbGljaykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwoX2EsIGUpO1xuICAgICAgICBvblNlYXJjaChlKTtcbiAgICAgIH0sXG4gICAgICBrZXk6ICdlbnRlckJ1dHRvbidcbiAgICB9LCBpc0FudGRCdXR0b24gPyB7XG4gICAgICBjbGFzc05hbWU6IGJ0bkNsYXNzTmFtZSxcbiAgICAgIHNpemVcbiAgICB9IDoge30pKTtcbiAgfSBlbHNlIHtcbiAgICBidXR0b24gPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChCdXR0b24sIHtcbiAgICAgIGNsYXNzTmFtZTogYnRuQ2xhc3NOYW1lLFxuICAgICAgdHlwZTogZW50ZXJCdXR0b24gPyAncHJpbWFyeScgOiB1bmRlZmluZWQsXG4gICAgICBzaXplOiBzaXplLFxuICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgICAga2V5OiBcImVudGVyQnV0dG9uXCIsXG4gICAgICBvbk1vdXNlRG93bjogb25Nb3VzZURvd24sXG4gICAgICBvbkNsaWNrOiBvblNlYXJjaCxcbiAgICAgIGxvYWRpbmc6IGxvYWRpbmcsXG4gICAgICBpY29uOiBzZWFyY2hJY29uXG4gICAgfSwgZW50ZXJCdXR0b24pO1xuICB9XG4gIGlmIChhZGRvbkFmdGVyKSB7XG4gICAgYnV0dG9uID0gW2J1dHRvbiwgY2xvbmVFbGVtZW50KGFkZG9uQWZ0ZXIsIHtcbiAgICAgIGtleTogJ2FkZG9uQWZ0ZXInXG4gICAgfSldO1xuICB9XG4gIGNvbnN0IGNscyA9IGNsYXNzTmFtZXMocHJlZml4Q2xzLCB7XG4gICAgW2Ake3ByZWZpeENsc30tcnRsYF06IGRpcmVjdGlvbiA9PT0gJ3J0bCcsXG4gICAgW2Ake3ByZWZpeENsc30tJHtzaXplfWBdOiAhIXNpemUsXG4gICAgW2Ake3ByZWZpeENsc30td2l0aC1idXR0b25gXTogISFlbnRlckJ1dHRvblxuICB9LCBjbGFzc05hbWUpO1xuICBjb25zdCBuZXdQcm9wcyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVzdFByb3BzKSwge1xuICAgIGNsYXNzTmFtZTogY2xzLFxuICAgIHByZWZpeENsczogaW5wdXRQcmVmaXhDbHMsXG4gICAgdHlwZTogJ3NlYXJjaCdcbiAgfSk7XG4gIGNvbnN0IGhhbmRsZU9uQ29tcG9zaXRpb25TdGFydCA9IGUgPT4ge1xuICAgIGNvbXBvc2VkUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgIG9uQ29tcG9zaXRpb25TdGFydCA9PT0gbnVsbCB8fCBvbkNvbXBvc2l0aW9uU3RhcnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ29tcG9zaXRpb25TdGFydChlKTtcbiAgfTtcbiAgY29uc3QgaGFuZGxlT25Db21wb3NpdGlvbkVuZCA9IGUgPT4ge1xuICAgIGNvbXBvc2VkUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICBvbkNvbXBvc2l0aW9uRW5kID09PSBudWxsIHx8IG9uQ29tcG9zaXRpb25FbmQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ29tcG9zaXRpb25FbmQoZSk7XG4gIH07XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJbnB1dCwgT2JqZWN0LmFzc2lnbih7XG4gICAgcmVmOiBjb21wb3NlUmVmKGlucHV0UmVmLCByZWYpLFxuICAgIG9uUHJlc3NFbnRlcjogb25QcmVzc0VudGVyXG4gIH0sIG5ld1Byb3BzLCB7XG4gICAgc2l6ZTogc2l6ZSxcbiAgICBvbkNvbXBvc2l0aW9uU3RhcnQ6IGhhbmRsZU9uQ29tcG9zaXRpb25TdGFydCxcbiAgICBvbkNvbXBvc2l0aW9uRW5kOiBoYW5kbGVPbkNvbXBvc2l0aW9uRW5kLFxuICAgIGFkZG9uQWZ0ZXI6IGJ1dHRvbixcbiAgICBzdWZmaXg6IHN1ZmZpeCxcbiAgICBvbkNoYW5nZTogb25DaGFuZ2UsXG4gICAgZGlzYWJsZWQ6IGRpc2FibGVkXG4gIH0pKTtcbn0pO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgU2VhcmNoLmRpc3BsYXlOYW1lID0gJ1NlYXJjaCc7XG59XG5leHBvcnQgZGVmYXVsdCBTZWFyY2g7IiwgIlwidXNlIGNsaWVudFwiO1xuXG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZm9yd2FyZFJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFJjVGV4dEFyZWEgZnJvbSAncmMtdGV4dGFyZWEnO1xuaW1wb3J0IGdldEFsbG93Q2xlYXIgZnJvbSAnLi4vX3V0aWwvZ2V0QWxsb3dDbGVhcic7XG5pbXBvcnQgeyBnZXRNZXJnZWRTdGF0dXMsIGdldFN0YXR1c0NsYXNzTmFtZXMgfSBmcm9tICcuLi9fdXRpbC9zdGF0dXNVdGlscyc7XG5pbXBvcnQgeyBkZXZVc2VXYXJuaW5nIH0gZnJvbSAnLi4vX3V0aWwvd2FybmluZyc7XG5pbXBvcnQgeyB1c2VDb21wb25lbnRDb25maWcgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXIvY29udGV4dCc7XG5pbXBvcnQgRGlzYWJsZWRDb250ZXh0IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlci9EaXNhYmxlZENvbnRleHQnO1xuaW1wb3J0IHVzZUNTU1ZhckNscyBmcm9tICcuLi9jb25maWctcHJvdmlkZXIvaG9va3MvdXNlQ1NTVmFyQ2xzJztcbmltcG9ydCB1c2VTaXplIGZyb20gJy4uL2NvbmZpZy1wcm92aWRlci9ob29rcy91c2VTaXplJztcbmltcG9ydCB7IEZvcm1JdGVtSW5wdXRDb250ZXh0IH0gZnJvbSAnLi4vZm9ybS9jb250ZXh0JztcbmltcG9ydCB1c2VWYXJpYW50IGZyb20gJy4uL2Zvcm0vaG9va3MvdXNlVmFyaWFudHMnO1xuaW1wb3J0IHsgdXNlQ29tcGFjdEl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vc3BhY2UvQ29tcGFjdCc7XG5pbXBvcnQgeyB0cmlnZ2VyRm9jdXMgfSBmcm9tICcuL0lucHV0JztcbmltcG9ydCB7IHVzZVNoYXJlZFN0eWxlIH0gZnJvbSAnLi9zdHlsZSc7XG5pbXBvcnQgdXNlU3R5bGUgZnJvbSAnLi9zdHlsZS90ZXh0YXJlYSc7XG5jb25zdCBUZXh0QXJlYSA9IC8qI19fUFVSRV9fKi9mb3J3YXJkUmVmKChwcm9wcywgcmVmKSA9PiB7XG4gIHZhciBfYTtcbiAgY29uc3Qge1xuICAgICAgcHJlZml4Q2xzOiBjdXN0b21pemVQcmVmaXhDbHMsXG4gICAgICBib3JkZXJlZCA9IHRydWUsXG4gICAgICBzaXplOiBjdXN0b21pemVTaXplLFxuICAgICAgZGlzYWJsZWQ6IGN1c3RvbURpc2FibGVkLFxuICAgICAgc3RhdHVzOiBjdXN0b21TdGF0dXMsXG4gICAgICBhbGxvd0NsZWFyLFxuICAgICAgY2xhc3NOYW1lczogY2xhc3NlcyxcbiAgICAgIHJvb3RDbGFzc05hbWUsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBzdHlsZSxcbiAgICAgIHN0eWxlcyxcbiAgICAgIHZhcmlhbnQ6IGN1c3RvbVZhcmlhbnQsXG4gICAgICBzaG93Q291bnQsXG4gICAgICBvbk1vdXNlRG93bixcbiAgICAgIG9uUmVzaXplXG4gICAgfSA9IHByb3BzLFxuICAgIHJlc3QgPSBfX3Jlc3QocHJvcHMsIFtcInByZWZpeENsc1wiLCBcImJvcmRlcmVkXCIsIFwic2l6ZVwiLCBcImRpc2FibGVkXCIsIFwic3RhdHVzXCIsIFwiYWxsb3dDbGVhclwiLCBcImNsYXNzTmFtZXNcIiwgXCJyb290Q2xhc3NOYW1lXCIsIFwiY2xhc3NOYW1lXCIsIFwic3R5bGVcIiwgXCJzdHlsZXNcIiwgXCJ2YXJpYW50XCIsIFwic2hvd0NvdW50XCIsIFwib25Nb3VzZURvd25cIiwgXCJvblJlc2l6ZVwiXSk7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgY29uc3Qge1xuICAgICAgZGVwcmVjYXRlZFxuICAgIH0gPSBkZXZVc2VXYXJuaW5nKCdUZXh0QXJlYScpO1xuICAgIGRlcHJlY2F0ZWQoISgnYm9yZGVyZWQnIGluIHByb3BzKSwgJ2JvcmRlcmVkJywgJ3ZhcmlhbnQnKTtcbiAgfVxuICBjb25zdCB7XG4gICAgZ2V0UHJlZml4Q2xzLFxuICAgIGRpcmVjdGlvbixcbiAgICBhbGxvd0NsZWFyOiBjb250ZXh0QWxsb3dDbGVhcixcbiAgICBhdXRvQ29tcGxldGU6IGNvbnRleHRBdXRvQ29tcGxldGUsXG4gICAgY2xhc3NOYW1lOiBjb250ZXh0Q2xhc3NOYW1lLFxuICAgIHN0eWxlOiBjb250ZXh0U3R5bGUsXG4gICAgY2xhc3NOYW1lczogY29udGV4dENsYXNzTmFtZXMsXG4gICAgc3R5bGVzOiBjb250ZXh0U3R5bGVzXG4gIH0gPSB1c2VDb21wb25lbnRDb25maWcoJ3RleHRBcmVhJyk7XG4gIC8vID09PT09PT09PT09PT09PT09PT0gRGlzYWJsZWQgPT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBkaXNhYmxlZCA9IFJlYWN0LnVzZUNvbnRleHQoRGlzYWJsZWRDb250ZXh0KTtcbiAgY29uc3QgbWVyZ2VkRGlzYWJsZWQgPSBjdXN0b21EaXNhYmxlZCAhPT0gbnVsbCAmJiBjdXN0b21EaXNhYmxlZCAhPT0gdm9pZCAwID8gY3VzdG9tRGlzYWJsZWQgOiBkaXNhYmxlZDtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gU3RhdHVzID09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IHtcbiAgICBzdGF0dXM6IGNvbnRleHRTdGF0dXMsXG4gICAgaGFzRmVlZGJhY2ssXG4gICAgZmVlZGJhY2tJY29uXG4gIH0gPSBSZWFjdC51c2VDb250ZXh0KEZvcm1JdGVtSW5wdXRDb250ZXh0KTtcbiAgY29uc3QgbWVyZ2VkU3RhdHVzID0gZ2V0TWVyZ2VkU3RhdHVzKGNvbnRleHRTdGF0dXMsIGN1c3RvbVN0YXR1cyk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PSBSZWYgPT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBpbm5lclJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgUmVhY3QudXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsICgpID0+IHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc2l6YWJsZVRleHRBcmVhOiAoX2EgPSBpbm5lclJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucmVzaXphYmxlVGV4dEFyZWEsXG4gICAgICBmb2N1czogb3B0aW9uID0+IHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgdHJpZ2dlckZvY3VzKChfYiA9IChfYSA9IGlubmVyUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5yZXNpemFibGVUZXh0QXJlYSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnRleHRBcmVhLCBvcHRpb24pO1xuICAgICAgfSxcbiAgICAgIGJsdXI6ICgpID0+IHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gKF9hID0gaW5uZXJSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmJsdXIoKTtcbiAgICAgIH1cbiAgICB9O1xuICB9KTtcbiAgY29uc3QgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdpbnB1dCcsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09IFN0eWxlID09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCByb290Q2xzID0gdXNlQ1NTVmFyQ2xzKHByZWZpeENscyk7XG4gIGNvbnN0IFt3cmFwU2hhcmVkQ1NTVmFyLCBoYXNoSWQsIGNzc1ZhckNsc10gPSB1c2VTaGFyZWRTdHlsZShwcmVmaXhDbHMsIHJvb3RDbGFzc05hbWUpO1xuICBjb25zdCBbd3JhcENTU1Zhcl0gPSB1c2VTdHlsZShwcmVmaXhDbHMsIHJvb3RDbHMpO1xuICAvLyA9PT09PT09PT09PT09PT09PSBDb21wYWN0IEl0ZW0gPT09PT09PT09PT09PT09PT1cbiAgY29uc3Qge1xuICAgIGNvbXBhY3RTaXplLFxuICAgIGNvbXBhY3RJdGVtQ2xhc3NuYW1lc1xuICB9ID0gdXNlQ29tcGFjdEl0ZW1Db250ZXh0KHByZWZpeENscywgZGlyZWN0aW9uKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09IFNpemUgPT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IG1lcmdlZFNpemUgPSB1c2VTaXplKGN0eCA9PiB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiAoX2EgPSBjdXN0b21pemVTaXplICE9PSBudWxsICYmIGN1c3RvbWl6ZVNpemUgIT09IHZvaWQgMCA/IGN1c3RvbWl6ZVNpemUgOiBjb21wYWN0U2l6ZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogY3R4O1xuICB9KTtcbiAgY29uc3QgW3ZhcmlhbnQsIGVuYWJsZVZhcmlhbnRDbHNdID0gdXNlVmFyaWFudCgndGV4dEFyZWEnLCBjdXN0b21WYXJpYW50LCBib3JkZXJlZCk7XG4gIGNvbnN0IG1lcmdlZEFsbG93Q2xlYXIgPSBnZXRBbGxvd0NsZWFyKGFsbG93Q2xlYXIgIT09IG51bGwgJiYgYWxsb3dDbGVhciAhPT0gdm9pZCAwID8gYWxsb3dDbGVhciA6IGNvbnRleHRBbGxvd0NsZWFyKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gUmVzaXplID09PT09PT09PT09PT09PT09PT09XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzUxNTk0XG4gIGNvbnN0IFtpc01vdXNlRG93biwgc2V0SXNNb3VzZURvd25dID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpO1xuICAvLyBXaGVuIGhhcyB3cmFwcGVyLCByZXNpemUgd2lsbCBtYWtlIGFzIGRpcnR5IGZvciBgcmVzaXplOiBib3RoYCBzdHlsZVxuICBjb25zdCBbcmVzaXplRGlydHksIHNldFJlc2l6ZURpcnR5XSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3Qgb25JbnRlcm5hbE1vdXNlRG93biA9IGUgPT4ge1xuICAgIHNldElzTW91c2VEb3duKHRydWUpO1xuICAgIG9uTW91c2VEb3duID09PSBudWxsIHx8IG9uTW91c2VEb3duID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbk1vdXNlRG93bihlKTtcbiAgICBjb25zdCBvbk1vdXNlVXAgPSAoKSA9PiB7XG4gICAgICBzZXRJc01vdXNlRG93bihmYWxzZSk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Nb3VzZVVwKTtcbiAgICB9O1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICB9O1xuICBjb25zdCBvbkludGVybmFsUmVzaXplID0gc2l6ZSA9PiB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICBvblJlc2l6ZSA9PT0gbnVsbCB8fCBvblJlc2l6ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25SZXNpemUoc2l6ZSk7XG4gICAgLy8gQ2hhbmdlIHRvIGRpcnR5IHNpbmNlIHRoaXMgbWF5YmUgZnJvbSB0aGUgYHJlc2l6ZTogYm90aGAgc3R5bGVcbiAgICBpZiAoaXNNb3VzZURvd24gJiYgdHlwZW9mIGdldENvbXB1dGVkU3R5bGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IGVsZSA9IChfYiA9IChfYSA9IGlubmVyUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5uYXRpdmVFbGVtZW50KSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IucXVlcnlTZWxlY3RvcigndGV4dGFyZWEnKTtcbiAgICAgIGlmIChlbGUgJiYgZ2V0Q29tcHV0ZWRTdHlsZShlbGUpLnJlc2l6ZSA9PT0gJ2JvdGgnKSB7XG4gICAgICAgIHNldFJlc2l6ZURpcnR5KHRydWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09XG4gIHJldHVybiB3cmFwU2hhcmVkQ1NTVmFyKHdyYXBDU1NWYXIoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmNUZXh0QXJlYSwgT2JqZWN0LmFzc2lnbih7XG4gICAgYXV0b0NvbXBsZXRlOiBjb250ZXh0QXV0b0NvbXBsZXRlXG4gIH0sIHJlc3QsIHtcbiAgICBzdHlsZTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjb250ZXh0U3R5bGUpLCBzdHlsZSksXG4gICAgc3R5bGVzOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGNvbnRleHRTdHlsZXMpLCBzdHlsZXMpLFxuICAgIGRpc2FibGVkOiBtZXJnZWREaXNhYmxlZCxcbiAgICBhbGxvd0NsZWFyOiBtZXJnZWRBbGxvd0NsZWFyLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjc3NWYXJDbHMsIHJvb3RDbHMsIGNsYXNzTmFtZSwgcm9vdENsYXNzTmFtZSwgY29tcGFjdEl0ZW1DbGFzc25hbWVzLCBjb250ZXh0Q2xhc3NOYW1lLFxuICAgIC8vIE9ubHkgZm9yIHdyYXBwZXJcbiAgICByZXNpemVEaXJ0eSAmJiBgJHtwcmVmaXhDbHN9LXRleHRhcmVhLWFmZml4LXdyYXBwZXItcmVzaXplLWRpcnR5YCksXG4gICAgY2xhc3NOYW1lczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGNsYXNzZXMpLCBjb250ZXh0Q2xhc3NOYW1lcyksIHtcbiAgICAgIHRleHRhcmVhOiBjbGFzc05hbWVzKHtcbiAgICAgICAgW2Ake3ByZWZpeENsc30tc21gXTogbWVyZ2VkU2l6ZSA9PT0gJ3NtYWxsJyxcbiAgICAgICAgW2Ake3ByZWZpeENsc30tbGdgXTogbWVyZ2VkU2l6ZSA9PT0gJ2xhcmdlJ1xuICAgICAgfSwgaGFzaElkLCBjbGFzc2VzID09PSBudWxsIHx8IGNsYXNzZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNsYXNzZXMudGV4dGFyZWEsIGNvbnRleHRDbGFzc05hbWVzLnRleHRhcmVhLCBpc01vdXNlRG93biAmJiBgJHtwcmVmaXhDbHN9LW1vdXNlLWFjdGl2ZWApLFxuICAgICAgdmFyaWFudDogY2xhc3NOYW1lcyh7XG4gICAgICAgIFtgJHtwcmVmaXhDbHN9LSR7dmFyaWFudH1gXTogZW5hYmxlVmFyaWFudENsc1xuICAgICAgfSwgZ2V0U3RhdHVzQ2xhc3NOYW1lcyhwcmVmaXhDbHMsIG1lcmdlZFN0YXR1cykpLFxuICAgICAgYWZmaXhXcmFwcGVyOiBjbGFzc05hbWVzKGAke3ByZWZpeENsc30tdGV4dGFyZWEtYWZmaXgtd3JhcHBlcmAsIHtcbiAgICAgICAgW2Ake3ByZWZpeENsc30tYWZmaXgtd3JhcHBlci1ydGxgXTogZGlyZWN0aW9uID09PSAncnRsJyxcbiAgICAgICAgW2Ake3ByZWZpeENsc30tYWZmaXgtd3JhcHBlci1zbWBdOiBtZXJnZWRTaXplID09PSAnc21hbGwnLFxuICAgICAgICBbYCR7cHJlZml4Q2xzfS1hZmZpeC13cmFwcGVyLWxnYF06IG1lcmdlZFNpemUgPT09ICdsYXJnZScsXG4gICAgICAgIFtgJHtwcmVmaXhDbHN9LXRleHRhcmVhLXNob3ctY291bnRgXTogc2hvd0NvdW50IHx8ICgoX2EgPSBwcm9wcy5jb3VudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnNob3cpXG4gICAgICB9LCBoYXNoSWQpXG4gICAgfSksXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgc3VmZml4OiBoYXNGZWVkYmFjayAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBgJHtwcmVmaXhDbHN9LXRleHRhcmVhLXN1ZmZpeGBcbiAgICB9LCBmZWVkYmFja0ljb24pLFxuICAgIHNob3dDb3VudDogc2hvd0NvdW50LFxuICAgIHJlZjogaW5uZXJSZWYsXG4gICAgb25SZXNpemU6IG9uSW50ZXJuYWxSZXNpemUsXG4gICAgb25Nb3VzZURvd246IG9uSW50ZXJuYWxNb3VzZURvd25cbiAgfSkpKSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IFRleHRBcmVhOyIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJkZWZhdWx0VmFsdWVcIiwgXCJ2YWx1ZVwiLCBcIm9uRm9jdXNcIiwgXCJvbkJsdXJcIiwgXCJvbkNoYW5nZVwiLCBcImFsbG93Q2xlYXJcIiwgXCJtYXhMZW5ndGhcIiwgXCJvbkNvbXBvc2l0aW9uU3RhcnRcIiwgXCJvbkNvbXBvc2l0aW9uRW5kXCIsIFwic3VmZml4XCIsIFwicHJlZml4Q2xzXCIsIFwic2hvd0NvdW50XCIsIFwiY291bnRcIiwgXCJjbGFzc05hbWVcIiwgXCJzdHlsZVwiLCBcImRpc2FibGVkXCIsIFwiaGlkZGVuXCIsIFwiY2xhc3NOYW1lc1wiLCBcInN0eWxlc1wiLCBcIm9uUmVzaXplXCIsIFwib25DbGVhclwiLCBcIm9uUHJlc3NFbnRlclwiLCBcInJlYWRPbmx5XCIsIFwiYXV0b1NpemVcIiwgXCJvbktleURvd25cIl07XG5pbXBvcnQgY2xzeCBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IEJhc2VJbnB1dCB9IGZyb20gJ3JjLWlucHV0JztcbmltcG9ydCB1c2VDb3VudCBmcm9tIFwicmMtaW5wdXQvZXMvaG9va3MvdXNlQ291bnRcIjtcbmltcG9ydCB7IHJlc29sdmVPbkNoYW5nZSB9IGZyb20gXCJyYy1pbnB1dC9lcy91dGlscy9jb21tb25VdGlsc1wiO1xuaW1wb3J0IHVzZU1lcmdlZFN0YXRlIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZU1lcmdlZFN0YXRlXCI7XG5pbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0LCB1c2VJbXBlcmF0aXZlSGFuZGxlLCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUmVzaXphYmxlVGV4dEFyZWEgZnJvbSBcIi4vUmVzaXphYmxlVGV4dEFyZWFcIjtcbnZhciBUZXh0QXJlYSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChfcmVmLCByZWYpIHtcbiAgdmFyIF9jb3VudENvbmZpZyRtYXg7XG4gIHZhciBkZWZhdWx0VmFsdWUgPSBfcmVmLmRlZmF1bHRWYWx1ZSxcbiAgICBjdXN0b21WYWx1ZSA9IF9yZWYudmFsdWUsXG4gICAgb25Gb2N1cyA9IF9yZWYub25Gb2N1cyxcbiAgICBvbkJsdXIgPSBfcmVmLm9uQmx1cixcbiAgICBvbkNoYW5nZSA9IF9yZWYub25DaGFuZ2UsXG4gICAgYWxsb3dDbGVhciA9IF9yZWYuYWxsb3dDbGVhcixcbiAgICBtYXhMZW5ndGggPSBfcmVmLm1heExlbmd0aCxcbiAgICBvbkNvbXBvc2l0aW9uU3RhcnQgPSBfcmVmLm9uQ29tcG9zaXRpb25TdGFydCxcbiAgICBvbkNvbXBvc2l0aW9uRW5kID0gX3JlZi5vbkNvbXBvc2l0aW9uRW5kLFxuICAgIHN1ZmZpeCA9IF9yZWYuc3VmZml4LFxuICAgIF9yZWYkcHJlZml4Q2xzID0gX3JlZi5wcmVmaXhDbHMsXG4gICAgcHJlZml4Q2xzID0gX3JlZiRwcmVmaXhDbHMgPT09IHZvaWQgMCA/ICdyYy10ZXh0YXJlYScgOiBfcmVmJHByZWZpeENscyxcbiAgICBzaG93Q291bnQgPSBfcmVmLnNob3dDb3VudCxcbiAgICBjb3VudCA9IF9yZWYuY291bnQsXG4gICAgY2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsXG4gICAgc3R5bGUgPSBfcmVmLnN0eWxlLFxuICAgIGRpc2FibGVkID0gX3JlZi5kaXNhYmxlZCxcbiAgICBoaWRkZW4gPSBfcmVmLmhpZGRlbixcbiAgICBjbGFzc05hbWVzID0gX3JlZi5jbGFzc05hbWVzLFxuICAgIHN0eWxlcyA9IF9yZWYuc3R5bGVzLFxuICAgIG9uUmVzaXplID0gX3JlZi5vblJlc2l6ZSxcbiAgICBvbkNsZWFyID0gX3JlZi5vbkNsZWFyLFxuICAgIG9uUHJlc3NFbnRlciA9IF9yZWYub25QcmVzc0VudGVyLFxuICAgIHJlYWRPbmx5ID0gX3JlZi5yZWFkT25seSxcbiAgICBhdXRvU2l6ZSA9IF9yZWYuYXV0b1NpemUsXG4gICAgb25LZXlEb3duID0gX3JlZi5vbktleURvd24sXG4gICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBfZXhjbHVkZWQpO1xuICB2YXIgX3VzZU1lcmdlZFN0YXRlID0gdXNlTWVyZ2VkU3RhdGUoZGVmYXVsdFZhbHVlLCB7XG4gICAgICB2YWx1ZTogY3VzdG9tVmFsdWUsXG4gICAgICBkZWZhdWx0VmFsdWU6IGRlZmF1bHRWYWx1ZVxuICAgIH0pLFxuICAgIF91c2VNZXJnZWRTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlTWVyZ2VkU3RhdGUsIDIpLFxuICAgIHZhbHVlID0gX3VzZU1lcmdlZFN0YXRlMlswXSxcbiAgICBzZXRWYWx1ZSA9IF91c2VNZXJnZWRTdGF0ZTJbMV07XG4gIHZhciBmb3JtYXRWYWx1ZSA9IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgPyAnJyA6IFN0cmluZyh2YWx1ZSk7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShmYWxzZSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgZm9jdXNlZCA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0Rm9jdXNlZCA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciBjb21wb3NpdGlvblJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUzID0gUmVhY3QudXNlU3RhdGUobnVsbCksXG4gICAgX1JlYWN0JHVzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTMsIDIpLFxuICAgIHRleHRhcmVhUmVzaXplZCA9IF9SZWFjdCR1c2VTdGF0ZTRbMF0sXG4gICAgc2V0VGV4dGFyZWFSZXNpemVkID0gX1JlYWN0JHVzZVN0YXRlNFsxXTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlZiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgaG9sZGVyUmVmID0gdXNlUmVmKG51bGwpO1xuICB2YXIgcmVzaXphYmxlVGV4dEFyZWFSZWYgPSB1c2VSZWYobnVsbCk7XG4gIHZhciBnZXRUZXh0QXJlYSA9IGZ1bmN0aW9uIGdldFRleHRBcmVhKCkge1xuICAgIHZhciBfcmVzaXphYmxlVGV4dEFyZWFSZWY7XG4gICAgcmV0dXJuIChfcmVzaXphYmxlVGV4dEFyZWFSZWYgPSByZXNpemFibGVUZXh0QXJlYVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfcmVzaXphYmxlVGV4dEFyZWFSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9yZXNpemFibGVUZXh0QXJlYVJlZi50ZXh0QXJlYTtcbiAgfTtcbiAgdmFyIGZvY3VzID0gZnVuY3Rpb24gZm9jdXMoKSB7XG4gICAgZ2V0VGV4dEFyZWEoKS5mb2N1cygpO1xuICB9O1xuICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBfaG9sZGVyUmVmJGN1cnJlbnQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc2l6YWJsZVRleHRBcmVhOiByZXNpemFibGVUZXh0QXJlYVJlZi5jdXJyZW50LFxuICAgICAgZm9jdXM6IGZvY3VzLFxuICAgICAgYmx1cjogZnVuY3Rpb24gYmx1cigpIHtcbiAgICAgICAgZ2V0VGV4dEFyZWEoKS5ibHVyKCk7XG4gICAgICB9LFxuICAgICAgbmF0aXZlRWxlbWVudDogKChfaG9sZGVyUmVmJGN1cnJlbnQgPSBob2xkZXJSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2hvbGRlclJlZiRjdXJyZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfaG9sZGVyUmVmJGN1cnJlbnQubmF0aXZlRWxlbWVudCkgfHwgZ2V0VGV4dEFyZWEoKVxuICAgIH07XG4gIH0pO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHNldEZvY3VzZWQoZnVuY3Rpb24gKHByZXYpIHtcbiAgICAgIHJldHVybiAhZGlzYWJsZWQgJiYgcHJldjtcbiAgICB9KTtcbiAgfSwgW2Rpc2FibGVkXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IFNlbGVjdCBSYW5nZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTUgPSBSZWFjdC51c2VTdGF0ZShudWxsKSxcbiAgICBfUmVhY3QkdXNlU3RhdGU2ID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlNSwgMiksXG4gICAgc2VsZWN0aW9uID0gX1JlYWN0JHVzZVN0YXRlNlswXSxcbiAgICBzZXRTZWxlY3Rpb24gPSBfUmVhY3QkdXNlU3RhdGU2WzFdO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChzZWxlY3Rpb24pIHtcbiAgICAgIHZhciBfZ2V0VGV4dEFyZWE7XG4gICAgICAoX2dldFRleHRBcmVhID0gZ2V0VGV4dEFyZWEoKSkuc2V0U2VsZWN0aW9uUmFuZ2UuYXBwbHkoX2dldFRleHRBcmVhLCBfdG9Db25zdW1hYmxlQXJyYXkoc2VsZWN0aW9uKSk7XG4gICAgfVxuICB9LCBbc2VsZWN0aW9uXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IENvdW50ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGNvdW50Q29uZmlnID0gdXNlQ291bnQoY291bnQsIHNob3dDb3VudCk7XG4gIHZhciBtZXJnZWRNYXggPSAoX2NvdW50Q29uZmlnJG1heCA9IGNvdW50Q29uZmlnLm1heCkgIT09IG51bGwgJiYgX2NvdW50Q29uZmlnJG1heCAhPT0gdm9pZCAwID8gX2NvdW50Q29uZmlnJG1heCA6IG1heExlbmd0aDtcblxuICAvLyBNYXggbGVuZ3RoIHZhbHVlXG4gIHZhciBoYXNNYXhMZW5ndGggPSBOdW1iZXIobWVyZ2VkTWF4KSA+IDA7XG4gIHZhciB2YWx1ZUxlbmd0aCA9IGNvdW50Q29uZmlnLnN0cmF0ZWd5KGZvcm1hdFZhbHVlKTtcbiAgdmFyIGlzT3V0T2ZSYW5nZSA9ICEhbWVyZ2VkTWF4ICYmIHZhbHVlTGVuZ3RoID4gbWVyZ2VkTWF4O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDaGFuZ2UgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciB0cmlnZ2VyQ2hhbmdlID0gZnVuY3Rpb24gdHJpZ2dlckNoYW5nZShlLCBjdXJyZW50VmFsdWUpIHtcbiAgICB2YXIgY3V0VmFsdWUgPSBjdXJyZW50VmFsdWU7XG4gICAgaWYgKCFjb21wb3NpdGlvblJlZi5jdXJyZW50ICYmIGNvdW50Q29uZmlnLmV4Y2VlZEZvcm1hdHRlciAmJiBjb3VudENvbmZpZy5tYXggJiYgY291bnRDb25maWcuc3RyYXRlZ3koY3VycmVudFZhbHVlKSA+IGNvdW50Q29uZmlnLm1heCkge1xuICAgICAgY3V0VmFsdWUgPSBjb3VudENvbmZpZy5leGNlZWRGb3JtYXR0ZXIoY3VycmVudFZhbHVlLCB7XG4gICAgICAgIG1heDogY291bnRDb25maWcubWF4XG4gICAgICB9KTtcbiAgICAgIGlmIChjdXJyZW50VmFsdWUgIT09IGN1dFZhbHVlKSB7XG4gICAgICAgIHNldFNlbGVjdGlvbihbZ2V0VGV4dEFyZWEoKS5zZWxlY3Rpb25TdGFydCB8fCAwLCBnZXRUZXh0QXJlYSgpLnNlbGVjdGlvbkVuZCB8fCAwXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHNldFZhbHVlKGN1dFZhbHVlKTtcbiAgICByZXNvbHZlT25DaGFuZ2UoZS5jdXJyZW50VGFyZ2V0LCBlLCBvbkNoYW5nZSwgY3V0VmFsdWUpO1xuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBWYWx1ZSBVcGRhdGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBvbkludGVybmFsQ29tcG9zaXRpb25TdGFydCA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxDb21wb3NpdGlvblN0YXJ0KGUpIHtcbiAgICBjb21wb3NpdGlvblJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICBvbkNvbXBvc2l0aW9uU3RhcnQgPT09IG51bGwgfHwgb25Db21wb3NpdGlvblN0YXJ0ID09PSB2b2lkIDAgfHwgb25Db21wb3NpdGlvblN0YXJ0KGUpO1xuICB9O1xuICB2YXIgb25JbnRlcm5hbENvbXBvc2l0aW9uRW5kID0gZnVuY3Rpb24gb25JbnRlcm5hbENvbXBvc2l0aW9uRW5kKGUpIHtcbiAgICBjb21wb3NpdGlvblJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgdHJpZ2dlckNoYW5nZShlLCBlLmN1cnJlbnRUYXJnZXQudmFsdWUpO1xuICAgIG9uQ29tcG9zaXRpb25FbmQgPT09IG51bGwgfHwgb25Db21wb3NpdGlvbkVuZCA9PT0gdm9pZCAwIHx8IG9uQ29tcG9zaXRpb25FbmQoZSk7XG4gIH07XG4gIHZhciBvbkludGVybmFsQ2hhbmdlID0gZnVuY3Rpb24gb25JbnRlcm5hbENoYW5nZShlKSB7XG4gICAgdHJpZ2dlckNoYW5nZShlLCBlLnRhcmdldC52YWx1ZSk7XG4gIH07XG4gIHZhciBoYW5kbGVLZXlEb3duID0gZnVuY3Rpb24gaGFuZGxlS2V5RG93bihlKSB7XG4gICAgaWYgKGUua2V5ID09PSAnRW50ZXInICYmIG9uUHJlc3NFbnRlcikge1xuICAgICAgb25QcmVzc0VudGVyKGUpO1xuICAgIH1cbiAgICBvbktleURvd24gPT09IG51bGwgfHwgb25LZXlEb3duID09PSB2b2lkIDAgfHwgb25LZXlEb3duKGUpO1xuICB9O1xuICB2YXIgaGFuZGxlRm9jdXMgPSBmdW5jdGlvbiBoYW5kbGVGb2N1cyhlKSB7XG4gICAgc2V0Rm9jdXNlZCh0cnVlKTtcbiAgICBvbkZvY3VzID09PSBudWxsIHx8IG9uRm9jdXMgPT09IHZvaWQgMCB8fCBvbkZvY3VzKGUpO1xuICB9O1xuICB2YXIgaGFuZGxlQmx1ciA9IGZ1bmN0aW9uIGhhbmRsZUJsdXIoZSkge1xuICAgIHNldEZvY3VzZWQoZmFsc2UpO1xuICAgIG9uQmx1ciA9PT0gbnVsbCB8fCBvbkJsdXIgPT09IHZvaWQgMCB8fCBvbkJsdXIoZSk7XG4gIH07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlc2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGhhbmRsZVJlc2V0ID0gZnVuY3Rpb24gaGFuZGxlUmVzZXQoZSkge1xuICAgIHNldFZhbHVlKCcnKTtcbiAgICBmb2N1cygpO1xuICAgIHJlc29sdmVPbkNoYW5nZShnZXRUZXh0QXJlYSgpLCBlLCBvbkNoYW5nZSk7XG4gIH07XG4gIHZhciBzdWZmaXhOb2RlID0gc3VmZml4O1xuICB2YXIgZGF0YUNvdW50O1xuICBpZiAoY291bnRDb25maWcuc2hvdykge1xuICAgIGlmIChjb3VudENvbmZpZy5zaG93Rm9ybWF0dGVyKSB7XG4gICAgICBkYXRhQ291bnQgPSBjb3VudENvbmZpZy5zaG93Rm9ybWF0dGVyKHtcbiAgICAgICAgdmFsdWU6IGZvcm1hdFZhbHVlLFxuICAgICAgICBjb3VudDogdmFsdWVMZW5ndGgsXG4gICAgICAgIG1heExlbmd0aDogbWVyZ2VkTWF4XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGF0YUNvdW50ID0gXCJcIi5jb25jYXQodmFsdWVMZW5ndGgpLmNvbmNhdChoYXNNYXhMZW5ndGggPyBcIiAvIFwiLmNvbmNhdChtZXJnZWRNYXgpIDogJycpO1xuICAgIH1cbiAgICBzdWZmaXhOb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIHN1ZmZpeE5vZGUsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IGNsc3goXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kYXRhLWNvdW50XCIpLCBjbGFzc05hbWVzID09PSBudWxsIHx8IGNsYXNzTmFtZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNsYXNzTmFtZXMuY291bnQpLFxuICAgICAgc3R5bGU6IHN0eWxlcyA9PT0gbnVsbCB8fCBzdHlsZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0eWxlcy5jb3VudFxuICAgIH0sIGRhdGFDb3VudCkpO1xuICB9XG4gIHZhciBoYW5kbGVSZXNpemUgPSBmdW5jdGlvbiBoYW5kbGVSZXNpemUoc2l6ZSkge1xuICAgIHZhciBfZ2V0VGV4dEFyZWEyO1xuICAgIG9uUmVzaXplID09PSBudWxsIHx8IG9uUmVzaXplID09PSB2b2lkIDAgfHwgb25SZXNpemUoc2l6ZSk7XG4gICAgaWYgKChfZ2V0VGV4dEFyZWEyID0gZ2V0VGV4dEFyZWEoKSkgIT09IG51bGwgJiYgX2dldFRleHRBcmVhMiAhPT0gdm9pZCAwICYmIF9nZXRUZXh0QXJlYTIuc3R5bGUuaGVpZ2h0KSB7XG4gICAgICBzZXRUZXh0YXJlYVJlc2l6ZWQodHJ1ZSk7XG4gICAgfVxuICB9O1xuICB2YXIgaXNQdXJlVGV4dEFyZWEgPSAhYXV0b1NpemUgJiYgIXNob3dDb3VudCAmJiAhYWxsb3dDbGVhcjtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEJhc2VJbnB1dCwge1xuICAgIHJlZjogaG9sZGVyUmVmLFxuICAgIHZhbHVlOiBmb3JtYXRWYWx1ZSxcbiAgICBhbGxvd0NsZWFyOiBhbGxvd0NsZWFyLFxuICAgIGhhbmRsZVJlc2V0OiBoYW5kbGVSZXNldCxcbiAgICBzdWZmaXg6IHN1ZmZpeE5vZGUsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgY2xhc3NOYW1lczogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBjbGFzc05hbWVzKSwge30sIHtcbiAgICAgIGFmZml4V3JhcHBlcjogY2xzeChjbGFzc05hbWVzID09PSBudWxsIHx8IGNsYXNzTmFtZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNsYXNzTmFtZXMuYWZmaXhXcmFwcGVyLCBfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNob3ctY291bnRcIiksIHNob3dDb3VudCksIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdGV4dGFyZWEtYWxsb3ctY2xlYXJcIiksIGFsbG93Q2xlYXIpKVxuICAgIH0pLFxuICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICBmb2N1c2VkOiBmb2N1c2VkLFxuICAgIGNsYXNzTmFtZTogY2xzeChjbGFzc05hbWUsIGlzT3V0T2ZSYW5nZSAmJiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW91dC1vZi1yYW5nZVwiKSksXG4gICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3R5bGUpLCB0ZXh0YXJlYVJlc2l6ZWQgJiYgIWlzUHVyZVRleHRBcmVhID8ge1xuICAgICAgaGVpZ2h0OiAnYXV0bydcbiAgICB9IDoge30pLFxuICAgIGRhdGFBdHRyczoge1xuICAgICAgYWZmaXhXcmFwcGVyOiB7XG4gICAgICAgICdkYXRhLWNvdW50JzogdHlwZW9mIGRhdGFDb3VudCA9PT0gJ3N0cmluZycgPyBkYXRhQ291bnQgOiB1bmRlZmluZWRcbiAgICAgIH1cbiAgICB9LFxuICAgIGhpZGRlbjogaGlkZGVuLFxuICAgIHJlYWRPbmx5OiByZWFkT25seSxcbiAgICBvbkNsZWFyOiBvbkNsZWFyXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlc2l6YWJsZVRleHRBcmVhLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIGF1dG9TaXplOiBhdXRvU2l6ZSxcbiAgICBtYXhMZW5ndGg6IG1heExlbmd0aCxcbiAgICBvbktleURvd246IGhhbmRsZUtleURvd24sXG4gICAgb25DaGFuZ2U6IG9uSW50ZXJuYWxDaGFuZ2UsXG4gICAgb25Gb2N1czogaGFuZGxlRm9jdXMsXG4gICAgb25CbHVyOiBoYW5kbGVCbHVyLFxuICAgIG9uQ29tcG9zaXRpb25TdGFydDogb25JbnRlcm5hbENvbXBvc2l0aW9uU3RhcnQsXG4gICAgb25Db21wb3NpdGlvbkVuZDogb25JbnRlcm5hbENvbXBvc2l0aW9uRW5kLFxuICAgIGNsYXNzTmFtZTogY2xzeChjbGFzc05hbWVzID09PSBudWxsIHx8IGNsYXNzTmFtZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNsYXNzTmFtZXMudGV4dGFyZWEpLFxuICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN0eWxlcyA9PT0gbnVsbCB8fCBzdHlsZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0eWxlcy50ZXh0YXJlYSksIHt9LCB7XG4gICAgICByZXNpemU6IHN0eWxlID09PSBudWxsIHx8IHN0eWxlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdHlsZS5yZXNpemVcbiAgICB9KSxcbiAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgb25SZXNpemU6IGhhbmRsZVJlc2l6ZSxcbiAgICByZWY6IHJlc2l6YWJsZVRleHRBcmVhUmVmLFxuICAgIHJlYWRPbmx5OiByZWFkT25seVxuICB9KSkpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBUZXh0QXJlYTsiLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJwcmVmaXhDbHNcIiwgXCJkZWZhdWx0VmFsdWVcIiwgXCJ2YWx1ZVwiLCBcImF1dG9TaXplXCIsIFwib25SZXNpemVcIiwgXCJjbGFzc05hbWVcIiwgXCJzdHlsZVwiLCBcImRpc2FibGVkXCIsIFwib25DaGFuZ2VcIiwgXCJvbkludGVybmFsQXV0b1NpemVcIl07XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBSZXNpemVPYnNlcnZlciBmcm9tICdyYy1yZXNpemUtb2JzZXJ2ZXInO1xuaW1wb3J0IHVzZUxheW91dEVmZmVjdCBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VMYXlvdXRFZmZlY3RcIjtcbmltcG9ydCB1c2VNZXJnZWRTdGF0ZSBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VNZXJnZWRTdGF0ZVwiO1xuaW1wb3J0IHJhZiBmcm9tIFwicmMtdXRpbC9lcy9yYWZcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjYWxjdWxhdGVBdXRvU2l6ZVN0eWxlIGZyb20gXCIuL2NhbGN1bGF0ZU5vZGVIZWlnaHRcIjtcbnZhciBSRVNJWkVfU1RBUlQgPSAwO1xudmFyIFJFU0laRV9NRUFTVVJJTkcgPSAxO1xudmFyIFJFU0laRV9TVEFCTEUgPSAyO1xudmFyIFJlc2l6YWJsZVRleHRBcmVhID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIF9yZWYgPSBwcm9wcyxcbiAgICBwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscyxcbiAgICBkZWZhdWx0VmFsdWUgPSBfcmVmLmRlZmF1bHRWYWx1ZSxcbiAgICB2YWx1ZSA9IF9yZWYudmFsdWUsXG4gICAgYXV0b1NpemUgPSBfcmVmLmF1dG9TaXplLFxuICAgIG9uUmVzaXplID0gX3JlZi5vblJlc2l6ZSxcbiAgICBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICBzdHlsZSA9IF9yZWYuc3R5bGUsXG4gICAgZGlzYWJsZWQgPSBfcmVmLmRpc2FibGVkLFxuICAgIG9uQ2hhbmdlID0gX3JlZi5vbkNoYW5nZSxcbiAgICBvbkludGVybmFsQXV0b1NpemUgPSBfcmVmLm9uSW50ZXJuYWxBdXRvU2l6ZSxcbiAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZiwgX2V4Y2x1ZGVkKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFZhbHVlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfdXNlTWVyZ2VkU3RhdGUgPSB1c2VNZXJnZWRTdGF0ZShkZWZhdWx0VmFsdWUsIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIHBvc3RTdGF0ZTogZnVuY3Rpb24gcG9zdFN0YXRlKHZhbCkge1xuICAgICAgICByZXR1cm4gdmFsICE9PSBudWxsICYmIHZhbCAhPT0gdm9pZCAwID8gdmFsIDogJyc7XG4gICAgICB9XG4gICAgfSksXG4gICAgX3VzZU1lcmdlZFN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VNZXJnZWRTdGF0ZSwgMiksXG4gICAgbWVyZ2VkVmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGUyWzBdLFxuICAgIHNldE1lcmdlZFZhbHVlID0gX3VzZU1lcmdlZFN0YXRlMlsxXTtcbiAgdmFyIG9uSW50ZXJuYWxDaGFuZ2UgPSBmdW5jdGlvbiBvbkludGVybmFsQ2hhbmdlKGV2ZW50KSB7XG4gICAgc2V0TWVyZ2VkVmFsdWUoZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwIHx8IG9uQ2hhbmdlKGV2ZW50KTtcbiAgfTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZWYgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciB0ZXh0YXJlYVJlZiA9IFJlYWN0LnVzZVJlZigpO1xuICBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0ZXh0QXJlYTogdGV4dGFyZWFSZWYuY3VycmVudFxuICAgIH07XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBBdXRvU2l6ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF9SZWFjdCR1c2VNZW1vID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoYXV0b1NpemUgJiYgX3R5cGVvZihhdXRvU2l6ZSkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBbYXV0b1NpemUubWluUm93cywgYXV0b1NpemUubWF4Um93c107XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfSwgW2F1dG9TaXplXSksXG4gICAgX1JlYWN0JHVzZU1lbW8yID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZU1lbW8sIDIpLFxuICAgIG1pblJvd3MgPSBfUmVhY3QkdXNlTWVtbzJbMF0sXG4gICAgbWF4Um93cyA9IF9SZWFjdCR1c2VNZW1vMlsxXTtcbiAgdmFyIG5lZWRBdXRvU2l6ZSA9ICEhYXV0b1NpemU7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTY3JvbGwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8yMTg3MFxuICB2YXIgZml4RmlyZWZveEF1dG9TY3JvbGwgPSBmdW5jdGlvbiBmaXhGaXJlZm94QXV0b1Njcm9sbCgpIHtcbiAgICB0cnkge1xuICAgICAgLy8gRkYgaGFzIGJ1ZyB3aXRoIGp1bXAgb2Ygc2Nyb2xsIHRvIHRvcC4gV2UgZm9yY2UgYmFjayBoZXJlLlxuICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRleHRhcmVhUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgdmFyIF90ZXh0YXJlYVJlZiRjdXJyZW50ID0gdGV4dGFyZWFSZWYuY3VycmVudCxcbiAgICAgICAgICBzZWxlY3Rpb25TdGFydCA9IF90ZXh0YXJlYVJlZiRjdXJyZW50LnNlbGVjdGlvblN0YXJ0LFxuICAgICAgICAgIHNlbGVjdGlvbkVuZCA9IF90ZXh0YXJlYVJlZiRjdXJyZW50LnNlbGVjdGlvbkVuZCxcbiAgICAgICAgICBzY3JvbGxUb3AgPSBfdGV4dGFyZWFSZWYkY3VycmVudC5zY3JvbGxUb3A7XG5cbiAgICAgICAgLy8gRml4IFNhZmFyaSBidWcgd2hpY2ggbm90IHJvbGxiYWNrIHdoZW4gYnJlYWsgbGluZVxuICAgICAgICAvLyBUaGlzIG1ha2VzIENoaW5lc2UgSU1FIGNhbid0IGlucHV0LiBEbyBub3QgZml4IHRoaXNcbiAgICAgICAgLy8gY29uc3QgeyB2YWx1ZTogdG1wVmFsdWUgfSA9IHRleHRhcmVhUmVmLmN1cnJlbnQ7XG4gICAgICAgIC8vIHRleHRhcmVhUmVmLmN1cnJlbnQudmFsdWUgPSAnJztcbiAgICAgICAgLy8gdGV4dGFyZWFSZWYuY3VycmVudC52YWx1ZSA9IHRtcFZhbHVlO1xuXG4gICAgICAgIHRleHRhcmVhUmVmLmN1cnJlbnQuc2V0U2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCk7XG4gICAgICAgIHRleHRhcmVhUmVmLmN1cnJlbnQuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIEZpeCBlcnJvciBpbiBDaHJvbWU6XG4gICAgICAvLyBGYWlsZWQgdG8gcmVhZCB0aGUgJ3NlbGVjdGlvblN0YXJ0JyBwcm9wZXJ0eSBmcm9tICdIVE1MSW5wdXRFbGVtZW50J1xuICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3EvMjExNzc0ODkvMzA0MDYwNVxuICAgIH1cbiAgfTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlc2l6ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShSRVNJWkVfU1RBQkxFKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICByZXNpemVTdGF0ZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0UmVzaXplU3RhdGUgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlMyA9IFJlYWN0LnVzZVN0YXRlKCksXG4gICAgX1JlYWN0JHVzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTMsIDIpLFxuICAgIGF1dG9TaXplU3R5bGUgPSBfUmVhY3QkdXNlU3RhdGU0WzBdLFxuICAgIHNldEF1dG9TaXplU3R5bGUgPSBfUmVhY3QkdXNlU3RhdGU0WzFdO1xuICB2YXIgc3RhcnRSZXNpemUgPSBmdW5jdGlvbiBzdGFydFJlc2l6ZSgpIHtcbiAgICBzZXRSZXNpemVTdGF0ZShSRVNJWkVfU1RBUlQpO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Rlc3QnKSB7XG4gICAgICBvbkludGVybmFsQXV0b1NpemUgPT09IG51bGwgfHwgb25JbnRlcm5hbEF1dG9TaXplID09PSB2b2lkIDAgfHwgb25JbnRlcm5hbEF1dG9TaXplKCk7XG4gICAgfVxuICB9O1xuXG4gIC8vIENoYW5nZSB0byB0cmlnZ2VyIHJlc2l6ZSBtZWFzdXJlXG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKG5lZWRBdXRvU2l6ZSkge1xuICAgICAgc3RhcnRSZXNpemUoKTtcbiAgICB9XG4gIH0sIFt2YWx1ZSwgbWluUm93cywgbWF4Um93cywgbmVlZEF1dG9TaXplXSk7XG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHJlc2l6ZVN0YXRlID09PSBSRVNJWkVfU1RBUlQpIHtcbiAgICAgIHNldFJlc2l6ZVN0YXRlKFJFU0laRV9NRUFTVVJJTkcpO1xuICAgIH0gZWxzZSBpZiAocmVzaXplU3RhdGUgPT09IFJFU0laRV9NRUFTVVJJTkcpIHtcbiAgICAgIHZhciB0ZXh0YXJlYVN0eWxlcyA9IGNhbGN1bGF0ZUF1dG9TaXplU3R5bGUodGV4dGFyZWFSZWYuY3VycmVudCwgZmFsc2UsIG1pblJvd3MsIG1heFJvd3MpO1xuXG4gICAgICAvLyBTYWZhcmkgaGFzIGJ1ZyB0aGF0IHRleHQgd2lsbCBrZWVwIGJyZWFrIGxpbmUgb24gdGV4dCBjdXQgd2hlbiBpdCdzIHByZXYgaXMgYnJlYWsgbGluZS5cbiAgICAgIC8vIFpvbWJpZUo6IFRoaXMgbm90IG9mdGVuIGhhcHBlbi4gU28gd2UganVzdCBza2lwIGl0LlxuICAgICAgLy8gY29uc3QgeyBzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kLCBzY3JvbGxUb3AgfSA9IHRleHRhcmVhUmVmLmN1cnJlbnQ7XG4gICAgICAvLyBjb25zdCB7IHZhbHVlOiB0bXBWYWx1ZSB9ID0gdGV4dGFyZWFSZWYuY3VycmVudDtcbiAgICAgIC8vIHRleHRhcmVhUmVmLmN1cnJlbnQudmFsdWUgPSAnJztcbiAgICAgIC8vIHRleHRhcmVhUmVmLmN1cnJlbnQudmFsdWUgPSB0bXBWYWx1ZTtcblxuICAgICAgLy8gaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRleHRhcmVhUmVmLmN1cnJlbnQpIHtcbiAgICAgIC8vICAgdGV4dGFyZWFSZWYuY3VycmVudC5zY3JvbGxUb3AgPSBzY3JvbGxUb3A7XG4gICAgICAvLyAgIHRleHRhcmVhUmVmLmN1cnJlbnQuc2V0U2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCk7XG4gICAgICAvLyB9XG5cbiAgICAgIHNldFJlc2l6ZVN0YXRlKFJFU0laRV9TVEFCTEUpO1xuICAgICAgc2V0QXV0b1NpemVTdHlsZSh0ZXh0YXJlYVN0eWxlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZpeEZpcmVmb3hBdXRvU2Nyb2xsKCk7XG4gICAgfVxuICB9LCBbcmVzaXplU3RhdGVdKTtcblxuICAvLyBXZSBsb2NrIHJlc2l6ZSB0cmlnZ2VyIGJ5IHJhZiB0byBhdm9pZCBTYWZhcmkgd2FybmluZ1xuICB2YXIgcmVzaXplUmFmUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIHZhciBjbGVhblJhZiA9IGZ1bmN0aW9uIGNsZWFuUmFmKCkge1xuICAgIHJhZi5jYW5jZWwocmVzaXplUmFmUmVmLmN1cnJlbnQpO1xuICB9O1xuICB2YXIgb25JbnRlcm5hbFJlc2l6ZSA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxSZXNpemUoc2l6ZSkge1xuICAgIGlmIChyZXNpemVTdGF0ZSA9PT0gUkVTSVpFX1NUQUJMRSkge1xuICAgICAgb25SZXNpemUgPT09IG51bGwgfHwgb25SZXNpemUgPT09IHZvaWQgMCB8fCBvblJlc2l6ZShzaXplKTtcbiAgICAgIGlmIChhdXRvU2l6ZSkge1xuICAgICAgICBjbGVhblJhZigpO1xuICAgICAgICByZXNpemVSYWZSZWYuY3VycmVudCA9IHJhZihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc3RhcnRSZXNpemUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjbGVhblJhZjtcbiAgfSwgW10pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG1lcmdlZEF1dG9TaXplU3R5bGUgPSBuZWVkQXV0b1NpemUgPyBhdXRvU2l6ZVN0eWxlIDogbnVsbDtcbiAgdmFyIG1lcmdlZFN0eWxlID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIG1lcmdlZEF1dG9TaXplU3R5bGUpO1xuICBpZiAocmVzaXplU3RhdGUgPT09IFJFU0laRV9TVEFSVCB8fCByZXNpemVTdGF0ZSA9PT0gUkVTSVpFX01FQVNVUklORykge1xuICAgIG1lcmdlZFN0eWxlLm92ZXJmbG93WSA9ICdoaWRkZW4nO1xuICAgIG1lcmdlZFN0eWxlLm92ZXJmbG93WCA9ICdoaWRkZW4nO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZXNpemVPYnNlcnZlciwge1xuICAgIG9uUmVzaXplOiBvbkludGVybmFsUmVzaXplLFxuICAgIGRpc2FibGVkOiAhKGF1dG9TaXplIHx8IG9uUmVzaXplKVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInRleHRhcmVhXCIsIF9leHRlbmRzKHt9LCByZXN0UHJvcHMsIHtcbiAgICByZWY6IHRleHRhcmVhUmVmLFxuICAgIHN0eWxlOiBtZXJnZWRTdHlsZSxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMocHJlZml4Q2xzLCBjbGFzc05hbWUsIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kaXNhYmxlZFwiKSwgZGlzYWJsZWQpKSxcbiAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgdmFsdWU6IG1lcmdlZFZhbHVlLFxuICAgIG9uQ2hhbmdlOiBvbkludGVybmFsQ2hhbmdlXG4gIH0pKSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IFJlc2l6YWJsZVRleHRBcmVhOyIsICIvLyBUaGFua3MgdG8gaHR0cHM6Ly9naXRodWIuY29tL2FuZHJleXBvcHAvcmVhY3QtdGV4dGFyZWEtYXV0b3NpemUvXG5cbi8qKlxuICogY2FsY3VsYXRlTm9kZUhlaWdodCh1aVRleHROb2RlLCB1c2VDYWNoZSA9IGZhbHNlKVxuICovXG5cbnZhciBISURERU5fVEVYVEFSRUFfU1RZTEUgPSBcIlxcbiAgbWluLWhlaWdodDowICFpbXBvcnRhbnQ7XFxuICBtYXgtaGVpZ2h0Om5vbmUgIWltcG9ydGFudDtcXG4gIGhlaWdodDowICFpbXBvcnRhbnQ7XFxuICB2aXNpYmlsaXR5OmhpZGRlbiAhaW1wb3J0YW50O1xcbiAgb3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnQ7XFxuICBwb3NpdGlvbjphYnNvbHV0ZSAhaW1wb3J0YW50O1xcbiAgei1pbmRleDotMTAwMCAhaW1wb3J0YW50O1xcbiAgdG9wOjAgIWltcG9ydGFudDtcXG4gIHJpZ2h0OjAgIWltcG9ydGFudDtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lICFpbXBvcnRhbnQ7XFxuXCI7XG52YXIgU0laSU5HX1NUWUxFID0gWydsZXR0ZXItc3BhY2luZycsICdsaW5lLWhlaWdodCcsICdwYWRkaW5nLXRvcCcsICdwYWRkaW5nLWJvdHRvbScsICdmb250LWZhbWlseScsICdmb250LXdlaWdodCcsICdmb250LXNpemUnLCAnZm9udC12YXJpYW50JywgJ3RleHQtcmVuZGVyaW5nJywgJ3RleHQtdHJhbnNmb3JtJywgJ3dpZHRoJywgJ3RleHQtaW5kZW50JywgJ3BhZGRpbmctbGVmdCcsICdwYWRkaW5nLXJpZ2h0JywgJ2JvcmRlci13aWR0aCcsICdib3gtc2l6aW5nJywgJ3dvcmQtYnJlYWsnLCAnd2hpdGUtc3BhY2UnXTtcbnZhciBjb21wdXRlZFN0eWxlQ2FjaGUgPSB7fTtcbnZhciBoaWRkZW5UZXh0YXJlYTtcbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVOb2RlU3R5bGluZyhub2RlKSB7XG4gIHZhciB1c2VDYWNoZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG4gIHZhciBub2RlUmVmID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ2lkJykgfHwgbm9kZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmVhY3RpZCcpIHx8IG5vZGUuZ2V0QXR0cmlidXRlKCduYW1lJyk7XG4gIGlmICh1c2VDYWNoZSAmJiBjb21wdXRlZFN0eWxlQ2FjaGVbbm9kZVJlZl0pIHtcbiAgICByZXR1cm4gY29tcHV0ZWRTdHlsZUNhY2hlW25vZGVSZWZdO1xuICB9XG4gIHZhciBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuICB2YXIgYm94U2l6aW5nID0gc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnYm94LXNpemluZycpIHx8IHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJy1tb3otYm94LXNpemluZycpIHx8IHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJy13ZWJraXQtYm94LXNpemluZycpO1xuICB2YXIgcGFkZGluZ1NpemUgPSBwYXJzZUZsb2F0KHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3BhZGRpbmctYm90dG9tJykpICsgcGFyc2VGbG9hdChzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdwYWRkaW5nLXRvcCcpKTtcbiAgdmFyIGJvcmRlclNpemUgPSBwYXJzZUZsb2F0KHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2JvcmRlci1ib3R0b20td2lkdGgnKSkgKyBwYXJzZUZsb2F0KHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2JvcmRlci10b3Atd2lkdGgnKSk7XG4gIHZhciBzaXppbmdTdHlsZSA9IFNJWklOR19TVFlMRS5tYXAoZnVuY3Rpb24gKG5hbWUpIHtcbiAgICByZXR1cm4gXCJcIi5jb25jYXQobmFtZSwgXCI6XCIpLmNvbmNhdChzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpKTtcbiAgfSkuam9pbignOycpO1xuICB2YXIgbm9kZUluZm8gPSB7XG4gICAgc2l6aW5nU3R5bGU6IHNpemluZ1N0eWxlLFxuICAgIHBhZGRpbmdTaXplOiBwYWRkaW5nU2l6ZSxcbiAgICBib3JkZXJTaXplOiBib3JkZXJTaXplLFxuICAgIGJveFNpemluZzogYm94U2l6aW5nXG4gIH07XG4gIGlmICh1c2VDYWNoZSAmJiBub2RlUmVmKSB7XG4gICAgY29tcHV0ZWRTdHlsZUNhY2hlW25vZGVSZWZdID0gbm9kZUluZm87XG4gIH1cbiAgcmV0dXJuIG5vZGVJbmZvO1xufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY2FsY3VsYXRlQXV0b1NpemVTdHlsZSh1aVRleHROb2RlKSB7XG4gIHZhciB1c2VDYWNoZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG4gIHZhciBtaW5Sb3dzID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBudWxsO1xuICB2YXIgbWF4Um93cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogbnVsbDtcbiAgaWYgKCFoaWRkZW5UZXh0YXJlYSkge1xuICAgIGhpZGRlblRleHRhcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTtcbiAgICBoaWRkZW5UZXh0YXJlYS5zZXRBdHRyaWJ1dGUoJ3RhYi1pbmRleCcsICctMScpO1xuICAgIGhpZGRlblRleHRhcmVhLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuICAgIC8vIGZpeDogQSBmb3JtIGZpZWxkIGVsZW1lbnQgc2hvdWxkIGhhdmUgYW4gaWQgb3IgbmFtZSBhdHRyaWJ1dGVcbiAgICAvLyBBIGZvcm0gZmllbGQgZWxlbWVudCBoYXMgbmVpdGhlciBhbiBpZCBub3IgYSBuYW1lIGF0dHJpYnV0ZS4gVGhpcyBtaWdodCBwcmV2ZW50IHRoZSBicm93c2VyIGZyb20gY29ycmVjdGx5IGF1dG9maWxsaW5nIHRoZSBmb3JtLlxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC90ZXh0YXJlYVxuICAgIGhpZGRlblRleHRhcmVhLnNldEF0dHJpYnV0ZSgnbmFtZScsICdoaWRkZW5UZXh0YXJlYScpO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaGlkZGVuVGV4dGFyZWEpO1xuICB9XG5cbiAgLy8gRml4IHdyYXA9XCJvZmZcIiBpc3N1ZVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy82NTc3XG4gIGlmICh1aVRleHROb2RlLmdldEF0dHJpYnV0ZSgnd3JhcCcpKSB7XG4gICAgaGlkZGVuVGV4dGFyZWEuc2V0QXR0cmlidXRlKCd3cmFwJywgdWlUZXh0Tm9kZS5nZXRBdHRyaWJ1dGUoJ3dyYXAnKSk7XG4gIH0gZWxzZSB7XG4gICAgaGlkZGVuVGV4dGFyZWEucmVtb3ZlQXR0cmlidXRlKCd3cmFwJyk7XG4gIH1cblxuICAvLyBDb3B5IGFsbCBDU1MgcHJvcGVydGllcyB0aGF0IGhhdmUgYW4gaW1wYWN0IG9uIHRoZSBoZWlnaHQgb2YgdGhlIGNvbnRlbnQgaW5cbiAgLy8gdGhlIHRleHRib3hcbiAgdmFyIF9jYWxjdWxhdGVOb2RlU3R5bGluZyA9IGNhbGN1bGF0ZU5vZGVTdHlsaW5nKHVpVGV4dE5vZGUsIHVzZUNhY2hlKSxcbiAgICBwYWRkaW5nU2l6ZSA9IF9jYWxjdWxhdGVOb2RlU3R5bGluZy5wYWRkaW5nU2l6ZSxcbiAgICBib3JkZXJTaXplID0gX2NhbGN1bGF0ZU5vZGVTdHlsaW5nLmJvcmRlclNpemUsXG4gICAgYm94U2l6aW5nID0gX2NhbGN1bGF0ZU5vZGVTdHlsaW5nLmJveFNpemluZyxcbiAgICBzaXppbmdTdHlsZSA9IF9jYWxjdWxhdGVOb2RlU3R5bGluZy5zaXppbmdTdHlsZTtcblxuICAvLyBOZWVkIHRvIGhhdmUgdGhlIG92ZXJmbG93IGF0dHJpYnV0ZSB0byBoaWRlIHRoZSBzY3JvbGxiYXIgb3RoZXJ3aXNlXG4gIC8vIHRleHQtbGluZXMgd2lsbCBub3QgY2FsY3VsYXRlZCBwcm9wZXJseSBhcyB0aGUgc2hhZG93IHdpbGwgdGVjaG5pY2FsbHkgYmVcbiAgLy8gbmFycm93ZXIgZm9yIGNvbnRlbnRcbiAgaGlkZGVuVGV4dGFyZWEuc2V0QXR0cmlidXRlKCdzdHlsZScsIFwiXCIuY29uY2F0KHNpemluZ1N0eWxlLCBcIjtcIikuY29uY2F0KEhJRERFTl9URVhUQVJFQV9TVFlMRSkpO1xuICBoaWRkZW5UZXh0YXJlYS52YWx1ZSA9IHVpVGV4dE5vZGUudmFsdWUgfHwgdWlUZXh0Tm9kZS5wbGFjZWhvbGRlciB8fCAnJztcbiAgdmFyIG1pbkhlaWdodCA9IHVuZGVmaW5lZDtcbiAgdmFyIG1heEhlaWdodCA9IHVuZGVmaW5lZDtcbiAgdmFyIG92ZXJmbG93WTtcbiAgdmFyIGhlaWdodCA9IGhpZGRlblRleHRhcmVhLnNjcm9sbEhlaWdodDtcbiAgaWYgKGJveFNpemluZyA9PT0gJ2JvcmRlci1ib3gnKSB7XG4gICAgLy8gYm9yZGVyLWJveDogYWRkIGJvcmRlciwgc2luY2UgaGVpZ2h0ID0gY29udGVudCArIHBhZGRpbmcgKyBib3JkZXJcbiAgICBoZWlnaHQgKz0gYm9yZGVyU2l6ZTtcbiAgfSBlbHNlIGlmIChib3hTaXppbmcgPT09ICdjb250ZW50LWJveCcpIHtcbiAgICAvLyByZW1vdmUgcGFkZGluZywgc2luY2UgaGVpZ2h0ID0gY29udGVudFxuICAgIGhlaWdodCAtPSBwYWRkaW5nU2l6ZTtcbiAgfVxuICBpZiAobWluUm93cyAhPT0gbnVsbCB8fCBtYXhSb3dzICE9PSBudWxsKSB7XG4gICAgLy8gbWVhc3VyZSBoZWlnaHQgb2YgYSB0ZXh0YXJlYSB3aXRoIGEgc2luZ2xlIHJvd1xuICAgIGhpZGRlblRleHRhcmVhLnZhbHVlID0gJyAnO1xuICAgIHZhciBzaW5nbGVSb3dIZWlnaHQgPSBoaWRkZW5UZXh0YXJlYS5zY3JvbGxIZWlnaHQgLSBwYWRkaW5nU2l6ZTtcbiAgICBpZiAobWluUm93cyAhPT0gbnVsbCkge1xuICAgICAgbWluSGVpZ2h0ID0gc2luZ2xlUm93SGVpZ2h0ICogbWluUm93cztcbiAgICAgIGlmIChib3hTaXppbmcgPT09ICdib3JkZXItYm94Jykge1xuICAgICAgICBtaW5IZWlnaHQgPSBtaW5IZWlnaHQgKyBwYWRkaW5nU2l6ZSArIGJvcmRlclNpemU7XG4gICAgICB9XG4gICAgICBoZWlnaHQgPSBNYXRoLm1heChtaW5IZWlnaHQsIGhlaWdodCk7XG4gICAgfVxuICAgIGlmIChtYXhSb3dzICE9PSBudWxsKSB7XG4gICAgICBtYXhIZWlnaHQgPSBzaW5nbGVSb3dIZWlnaHQgKiBtYXhSb3dzO1xuICAgICAgaWYgKGJveFNpemluZyA9PT0gJ2JvcmRlci1ib3gnKSB7XG4gICAgICAgIG1heEhlaWdodCA9IG1heEhlaWdodCArIHBhZGRpbmdTaXplICsgYm9yZGVyU2l6ZTtcbiAgICAgIH1cbiAgICAgIG92ZXJmbG93WSA9IGhlaWdodCA+IG1heEhlaWdodCA/ICcnIDogJ2hpZGRlbic7XG4gICAgICBoZWlnaHQgPSBNYXRoLm1pbihtYXhIZWlnaHQsIGhlaWdodCk7XG4gICAgfVxuICB9XG4gIHZhciBzdHlsZSA9IHtcbiAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICBvdmVyZmxvd1k6IG92ZXJmbG93WSxcbiAgICByZXNpemU6ICdub25lJ1xuICB9O1xuICBpZiAobWluSGVpZ2h0KSB7XG4gICAgc3R5bGUubWluSGVpZ2h0ID0gbWluSGVpZ2h0O1xuICB9XG4gIGlmIChtYXhIZWlnaHQpIHtcbiAgICBzdHlsZS5tYXhIZWlnaHQgPSBtYXhIZWlnaHQ7XG4gIH1cbiAgcmV0dXJuIHN0eWxlO1xufSIsICJpbXBvcnQgVGV4dEFyZWEgZnJvbSBcIi4vVGV4dEFyZWFcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUmVzaXphYmxlVGV4dEFyZWEgfSBmcm9tIFwiLi9SZXNpemFibGVUZXh0QXJlYVwiO1xuZXhwb3J0IGRlZmF1bHQgVGV4dEFyZWE7IiwgImltcG9ydCB7IGdlblN0eWxlSG9va3MsIG1lcmdlVG9rZW4gfSBmcm9tICcuLi8uLi90aGVtZS9pbnRlcm5hbCc7XG5pbXBvcnQgeyBpbml0Q29tcG9uZW50VG9rZW4sIGluaXRJbnB1dFRva2VuIH0gZnJvbSAnLi90b2tlbic7XG5leHBvcnQgeyBpbml0Q29tcG9uZW50VG9rZW4sIGluaXRJbnB1dFRva2VuIH07XG5jb25zdCBnZW5UZXh0QXJlYVN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzLFxuICAgIHBhZGRpbmdMR1xuICB9ID0gdG9rZW47XG4gIGNvbnN0IHRleHRhcmVhUHJlZml4Q2xzID0gYCR7Y29tcG9uZW50Q2xzfS10ZXh0YXJlYWA7XG4gIHJldHVybiB7XG4gICAgLy8gUmF3IFRleHRhcmVhXG4gICAgW2B0ZXh0YXJlYSR7Y29tcG9uZW50Q2xzfWBdOiB7XG4gICAgICBtYXhXaWR0aDogJzEwMCUnLFxuICAgICAgLy8gcHJldmVudCB0ZXh0YXJlYSByZXNpemUgZnJvbSBjb21pbmcgb3V0IG9mIGl0cyBjb250YWluZXJcbiAgICAgIGhlaWdodDogJ2F1dG8nLFxuICAgICAgbWluSGVpZ2h0OiB0b2tlbi5jb250cm9sSGVpZ2h0LFxuICAgICAgbGluZUhlaWdodDogdG9rZW4ubGluZUhlaWdodCxcbiAgICAgIHZlcnRpY2FsQWxpZ246ICdib3R0b20nLFxuICAgICAgdHJhbnNpdGlvbjogYGFsbCAke3Rva2VuLm1vdGlvbkR1cmF0aW9uU2xvd31gLFxuICAgICAgcmVzaXplOiAndmVydGljYWwnLFxuICAgICAgW2AmJHtjb21wb25lbnRDbHN9LW1vdXNlLWFjdGl2ZWBdOiB7XG4gICAgICAgIHRyYW5zaXRpb246IGBhbGwgJHt0b2tlbi5tb3Rpb25EdXJhdGlvblNsb3d9LCBoZWlnaHQgMHMsIHdpZHRoIDBzYFxuICAgICAgfVxuICAgIH0sXG4gICAgLy8gV3JhcHBlciBmb3IgcmVzaXplXG4gICAgW2Ake2NvbXBvbmVudENsc30tdGV4dGFyZWEtYWZmaXgtd3JhcHBlci1yZXNpemUtZGlydHlgXToge1xuICAgICAgd2lkdGg6ICdhdXRvJ1xuICAgIH0sXG4gICAgW3RleHRhcmVhUHJlZml4Q2xzXToge1xuICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICAnJi1zaG93LWNvdW50Jzoge1xuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1kYXRhLWNvdW50YF06IHtcbiAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICBib3R0b206IHRva2VuLmNhbGModG9rZW4uZm9udFNpemUpLm11bCh0b2tlbi5saW5lSGVpZ2h0KS5tdWwoLTEpLmVxdWFsKCksXG4gICAgICAgICAgaW5zZXRJbmxpbmVFbmQ6IDAsXG4gICAgICAgICAgY29sb3I6IHRva2VuLmNvbG9yVGV4dERlc2NyaXB0aW9uLFxuICAgICAgICAgIHdoaXRlU3BhY2U6ICdub3dyYXAnLFxuICAgICAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2BcbiAgICAgICAgJi1hbGxvdy1jbGVhciA+ICR7Y29tcG9uZW50Q2xzfSxcbiAgICAgICAgJi1hZmZpeC13cmFwcGVyJHt0ZXh0YXJlYVByZWZpeENsc30taGFzLWZlZWRiYWNrICR7Y29tcG9uZW50Q2xzfVxuICAgICAgYF06IHtcbiAgICAgICAgcGFkZGluZ0lubGluZUVuZDogcGFkZGluZ0xHXG4gICAgICB9LFxuICAgICAgW2AmLWFmZml4LXdyYXBwZXIke2NvbXBvbmVudENsc30tYWZmaXgtd3JhcHBlcmBdOiB7XG4gICAgICAgIHBhZGRpbmc6IDAsXG4gICAgICAgIFtgPiB0ZXh0YXJlYSR7Y29tcG9uZW50Q2xzfWBdOiB7XG4gICAgICAgICAgZm9udFNpemU6ICdpbmhlcml0JyxcbiAgICAgICAgICBib3JkZXI6ICdub25lJyxcbiAgICAgICAgICBvdXRsaW5lOiAnbm9uZScsXG4gICAgICAgICAgYmFja2dyb3VuZDogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgICBtaW5IZWlnaHQ6IHRva2VuLmNhbGModG9rZW4uY29udHJvbEhlaWdodCkuc3ViKHRva2VuLmNhbGModG9rZW4ubGluZVdpZHRoKS5tdWwoMikpLmVxdWFsKCksXG4gICAgICAgICAgJyY6Zm9jdXMnOiB7XG4gICAgICAgICAgICBib3hTaGFkb3c6ICdub25lICFpbXBvcnRhbnQnXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1zdWZmaXhgXToge1xuICAgICAgICAgIG1hcmdpbjogMCxcbiAgICAgICAgICAnPiAqOm5vdCg6bGFzdC1jaGlsZCknOiB7XG4gICAgICAgICAgICBtYXJnaW5JbmxpbmU6IDBcbiAgICAgICAgICB9LFxuICAgICAgICAgIC8vIENsZWFyIEljb25cbiAgICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1jbGVhci1pY29uYF06IHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgaW5zZXRJbmxpbmVFbmQ6IHRva2VuLnBhZGRpbmdJbmxpbmUsXG4gICAgICAgICAgICBpbnNldEJsb2NrU3RhcnQ6IHRva2VuLnBhZGRpbmdYU1xuICAgICAgICAgIH0sXG4gICAgICAgICAgLy8gRmVlZGJhY2sgSWNvblxuICAgICAgICAgIFtgJHt0ZXh0YXJlYVByZWZpeENsc30tc3VmZml4YF06IHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgaW5zZXRJbmxpbmVFbmQ6IHRva2VuLnBhZGRpbmdJbmxpbmUsXG4gICAgICAgICAgICBib3R0b206IDAsXG4gICAgICAgICAgICB6SW5kZXg6IDEsXG4gICAgICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWZsZXgnLFxuICAgICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAgICBtYXJnaW46ICdhdXRvJyxcbiAgICAgICAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJ1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtgJi1hZmZpeC13cmFwcGVyJHtjb21wb25lbnRDbHN9LWFmZml4LXdyYXBwZXItcnRsYF06IHtcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30tc3VmZml4YF06IHtcbiAgICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1kYXRhLWNvdW50YF06IHtcbiAgICAgICAgICAgIGRpcmVjdGlvbjogJ2x0cicsXG4gICAgICAgICAgICBpbnNldElubGluZVN0YXJ0OiAwXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2AmLWFmZml4LXdyYXBwZXIke2NvbXBvbmVudENsc30tYWZmaXgtd3JhcHBlci1zbWBdOiB7XG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LXN1ZmZpeGBdOiB7XG4gICAgICAgICAgW2Ake2NvbXBvbmVudENsc30tY2xlYXItaWNvbmBdOiB7XG4gICAgICAgICAgICBpbnNldElubGluZUVuZDogdG9rZW4ucGFkZGluZ0lubGluZVNNXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFeHBvcnQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgZGVmYXVsdCBnZW5TdHlsZUhvb2tzKFsnSW5wdXQnLCAnVGV4dEFyZWEnXSwgdG9rZW4gPT4ge1xuICBjb25zdCBpbnB1dFRva2VuID0gbWVyZ2VUb2tlbih0b2tlbiwgaW5pdElucHV0VG9rZW4odG9rZW4pKTtcbiAgcmV0dXJuIFtnZW5UZXh0QXJlYVN0eWxlKGlucHV0VG9rZW4pXTtcbn0sIGluaXRDb21wb25lbnRUb2tlbiwge1xuICByZXNldEZvbnQ6IGZhbHNlXG59KTsiLCAiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCBHcm91cCBmcm9tICcuL0dyb3VwJztcbmltcG9ydCBJbnRlcm5hbElucHV0IGZyb20gJy4vSW5wdXQnO1xuaW1wb3J0IE9UUCBmcm9tICcuL09UUCc7XG5pbXBvcnQgUGFzc3dvcmQgZnJvbSAnLi9QYXNzd29yZCc7XG5pbXBvcnQgU2VhcmNoIGZyb20gJy4vU2VhcmNoJztcbmltcG9ydCBUZXh0QXJlYSBmcm9tICcuL1RleHRBcmVhJztcbmNvbnN0IElucHV0ID0gSW50ZXJuYWxJbnB1dDtcbklucHV0Lkdyb3VwID0gR3JvdXA7XG5JbnB1dC5TZWFyY2ggPSBTZWFyY2g7XG5JbnB1dC5UZXh0QXJlYSA9IFRleHRBcmVhO1xuSW5wdXQuUGFzc3dvcmQgPSBQYXNzd29yZDtcbklucHV0Lk9UUCA9IE9UUDtcbmV4cG9ydCBkZWZhdWx0IElucHV0OyIsICJcInVzZSBjbGllbnRcIjtcblxudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEZhc3RDb2xvciB9IGZyb20gJ0BhbnQtZGVzaWduL2Zhc3QtY29sb3InO1xuaW1wb3J0IENoZWNrQ2lyY2xlRmlsbGVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9DaGVja0NpcmNsZUZpbGxlZFwiO1xuaW1wb3J0IENoZWNrT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0NoZWNrT3V0bGluZWRcIjtcbmltcG9ydCBDbG9zZUNpcmNsZUZpbGxlZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvQ2xvc2VDaXJjbGVGaWxsZWRcIjtcbmltcG9ydCBDbG9zZU91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9DbG9zZU91dGxpbmVkXCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBvbWl0IGZyb20gXCJyYy11dGlsL2VzL29taXRcIjtcbmltcG9ydCB7IGRldlVzZVdhcm5pbmcgfSBmcm9tICcuLi9fdXRpbC93YXJuaW5nJztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IENpcmNsZSBmcm9tICcuL0NpcmNsZSc7XG5pbXBvcnQgTGluZSBmcm9tICcuL0xpbmUnO1xuaW1wb3J0IFN0ZXBzIGZyb20gJy4vU3RlcHMnO1xuaW1wb3J0IHVzZVN0eWxlIGZyb20gJy4vc3R5bGUnO1xuaW1wb3J0IHsgZ2V0U2l6ZSwgZ2V0U3VjY2Vzc1BlcmNlbnQsIHZhbGlkUHJvZ3Jlc3MgfSBmcm9tICcuL3V0aWxzJztcbmV4cG9ydCBjb25zdCBQcm9ncmVzc1R5cGVzID0gWydsaW5lJywgJ2NpcmNsZScsICdkYXNoYm9hcmQnXTtcbmNvbnN0IFByb2dyZXNzU3RhdHVzZXMgPSBbJ25vcm1hbCcsICdleGNlcHRpb24nLCAnYWN0aXZlJywgJ3N1Y2Nlc3MnXTtcbmNvbnN0IFByb2dyZXNzID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHByb3BzLCByZWYpID0+IHtcbiAgY29uc3Qge1xuICAgICAgcHJlZml4Q2xzOiBjdXN0b21pemVQcmVmaXhDbHMsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICByb290Q2xhc3NOYW1lLFxuICAgICAgc3RlcHMsXG4gICAgICBzdHJva2VDb2xvcixcbiAgICAgIHBlcmNlbnQgPSAwLFxuICAgICAgc2l6ZSA9ICdkZWZhdWx0JyxcbiAgICAgIHNob3dJbmZvID0gdHJ1ZSxcbiAgICAgIHR5cGUgPSAnbGluZScsXG4gICAgICBzdGF0dXMsXG4gICAgICBmb3JtYXQsXG4gICAgICBzdHlsZSxcbiAgICAgIHBlcmNlbnRQb3NpdGlvbiA9IHt9XG4gICAgfSA9IHByb3BzLFxuICAgIHJlc3RQcm9wcyA9IF9fcmVzdChwcm9wcywgW1wicHJlZml4Q2xzXCIsIFwiY2xhc3NOYW1lXCIsIFwicm9vdENsYXNzTmFtZVwiLCBcInN0ZXBzXCIsIFwic3Ryb2tlQ29sb3JcIiwgXCJwZXJjZW50XCIsIFwic2l6ZVwiLCBcInNob3dJbmZvXCIsIFwidHlwZVwiLCBcInN0YXR1c1wiLCBcImZvcm1hdFwiLCBcInN0eWxlXCIsIFwicGVyY2VudFBvc2l0aW9uXCJdKTtcbiAgY29uc3Qge1xuICAgIGFsaWduOiBpbmZvQWxpZ24gPSAnZW5kJyxcbiAgICB0eXBlOiBpbmZvUG9zaXRpb24gPSAnb3V0ZXInXG4gIH0gPSBwZXJjZW50UG9zaXRpb247XG4gIGNvbnN0IHN0cm9rZUNvbG9yTm90QXJyYXkgPSBBcnJheS5pc0FycmF5KHN0cm9rZUNvbG9yKSA/IHN0cm9rZUNvbG9yWzBdIDogc3Ryb2tlQ29sb3I7XG4gIGNvbnN0IHN0cm9rZUNvbG9yTm90R3JhZGllbnQgPSB0eXBlb2Ygc3Ryb2tlQ29sb3IgPT09ICdzdHJpbmcnIHx8IEFycmF5LmlzQXJyYXkoc3Ryb2tlQ29sb3IpID8gc3Ryb2tlQ29sb3IgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHN0cm9rZUNvbG9ySXNCcmlnaHQgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoc3Ryb2tlQ29sb3JOb3RBcnJheSkge1xuICAgICAgY29uc3QgY29sb3IgPSB0eXBlb2Ygc3Ryb2tlQ29sb3JOb3RBcnJheSA9PT0gJ3N0cmluZycgPyBzdHJva2VDb2xvck5vdEFycmF5IDogT2JqZWN0LnZhbHVlcyhzdHJva2VDb2xvck5vdEFycmF5KVswXTtcbiAgICAgIHJldHVybiBuZXcgRmFzdENvbG9yKGNvbG9yKS5pc0xpZ2h0KCk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSwgW3N0cm9rZUNvbG9yXSk7XG4gIGNvbnN0IHBlcmNlbnROdW1iZXIgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIGNvbnN0IHN1Y2Nlc3NQZXJjZW50ID0gZ2V0U3VjY2Vzc1BlcmNlbnQocHJvcHMpO1xuICAgIHJldHVybiBwYXJzZUludChzdWNjZXNzUGVyY2VudCAhPT0gdW5kZWZpbmVkID8gKF9hID0gc3VjY2Vzc1BlcmNlbnQgIT09IG51bGwgJiYgc3VjY2Vzc1BlcmNlbnQgIT09IHZvaWQgMCA/IHN1Y2Nlc3NQZXJjZW50IDogMCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRvU3RyaW5nKCkgOiAoX2IgPSBwZXJjZW50ICE9PSBudWxsICYmIHBlcmNlbnQgIT09IHZvaWQgMCA/IHBlcmNlbnQgOiAwKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IudG9TdHJpbmcoKSwgMTApO1xuICB9LCBbcGVyY2VudCwgcHJvcHMuc3VjY2VzcywgcHJvcHMuc3VjY2Vzc1BlcmNlbnRdKTtcbiAgY29uc3QgcHJvZ3Jlc3NTdGF0dXMgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoIVByb2dyZXNzU3RhdHVzZXMuaW5jbHVkZXMoc3RhdHVzKSAmJiBwZXJjZW50TnVtYmVyID49IDEwMCkge1xuICAgICAgcmV0dXJuICdzdWNjZXNzJztcbiAgICB9XG4gICAgcmV0dXJuIHN0YXR1cyB8fCAnbm9ybWFsJztcbiAgfSwgW3N0YXR1cywgcGVyY2VudE51bWJlcl0pO1xuICBjb25zdCB7XG4gICAgZ2V0UHJlZml4Q2xzLFxuICAgIGRpcmVjdGlvbixcbiAgICBwcm9ncmVzczogcHJvZ3Jlc3NTdHlsZVxuICB9ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KTtcbiAgY29uc3QgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdwcm9ncmVzcycsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIGNvbnN0IFt3cmFwQ1NTVmFyLCBoYXNoSWQsIGNzc1ZhckNsc10gPSB1c2VTdHlsZShwcmVmaXhDbHMpO1xuICBjb25zdCBpc0xpbmVUeXBlID0gdHlwZSA9PT0gJ2xpbmUnO1xuICBjb25zdCBpc1B1cmVMaW5lVHlwZSA9IGlzTGluZVR5cGUgJiYgIXN0ZXBzO1xuICBjb25zdCBwcm9ncmVzc0luZm8gPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoIXNob3dJbmZvKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgc3VjY2Vzc1BlcmNlbnQgPSBnZXRTdWNjZXNzUGVyY2VudChwcm9wcyk7XG4gICAgbGV0IHRleHQ7XG4gICAgY29uc3QgdGV4dEZvcm1hdHRlciA9IGZvcm1hdCB8fCAobnVtYmVyID0+IGAke251bWJlcn0lYCk7XG4gICAgY29uc3QgaXNCcmlnaHRJbm5lckNvbG9yID0gaXNMaW5lVHlwZSAmJiBzdHJva2VDb2xvcklzQnJpZ2h0ICYmIGluZm9Qb3NpdGlvbiA9PT0gJ2lubmVyJztcbiAgICBpZiAoaW5mb1Bvc2l0aW9uID09PSAnaW5uZXInIHx8IGZvcm1hdCB8fCBwcm9ncmVzc1N0YXR1cyAhPT0gJ2V4Y2VwdGlvbicgJiYgcHJvZ3Jlc3NTdGF0dXMgIT09ICdzdWNjZXNzJykge1xuICAgICAgdGV4dCA9IHRleHRGb3JtYXR0ZXIodmFsaWRQcm9ncmVzcyhwZXJjZW50KSwgdmFsaWRQcm9ncmVzcyhzdWNjZXNzUGVyY2VudCkpO1xuICAgIH0gZWxzZSBpZiAocHJvZ3Jlc3NTdGF0dXMgPT09ICdleGNlcHRpb24nKSB7XG4gICAgICB0ZXh0ID0gaXNMaW5lVHlwZSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENsb3NlQ2lyY2xlRmlsbGVkLCBudWxsKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENsb3NlT3V0bGluZWQsIG51bGwpO1xuICAgIH0gZWxzZSBpZiAocHJvZ3Jlc3NTdGF0dXMgPT09ICdzdWNjZXNzJykge1xuICAgICAgdGV4dCA9IGlzTGluZVR5cGUgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDaGVja0NpcmNsZUZpbGxlZCwgbnVsbCkgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDaGVja091dGxpbmVkLCBudWxsKTtcbiAgICB9XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoYCR7cHJlZml4Q2xzfS10ZXh0YCwge1xuICAgICAgICBbYCR7cHJlZml4Q2xzfS10ZXh0LWJyaWdodGBdOiBpc0JyaWdodElubmVyQ29sb3IsXG4gICAgICAgIFtgJHtwcmVmaXhDbHN9LXRleHQtJHtpbmZvQWxpZ259YF06IGlzUHVyZUxpbmVUeXBlLFxuICAgICAgICBbYCR7cHJlZml4Q2xzfS10ZXh0LSR7aW5mb1Bvc2l0aW9ufWBdOiBpc1B1cmVMaW5lVHlwZVxuICAgICAgfSksXG4gICAgICB0aXRsZTogdHlwZW9mIHRleHQgPT09ICdzdHJpbmcnID8gdGV4dCA6IHVuZGVmaW5lZFxuICAgIH0sIHRleHQpO1xuICB9LCBbc2hvd0luZm8sIHBlcmNlbnQsIHBlcmNlbnROdW1iZXIsIHByb2dyZXNzU3RhdHVzLCB0eXBlLCBwcmVmaXhDbHMsIGZvcm1hdF0pO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGNvbnN0IHdhcm5pbmcgPSBkZXZVc2VXYXJuaW5nKCdQcm9ncmVzcycpO1xuICAgIHdhcm5pbmcuZGVwcmVjYXRlZCghKCdzdWNjZXNzUGVyY2VudCcgaW4gcHJvcHMpLCAnc3VjY2Vzc1BlcmNlbnQnLCAnc3VjY2Vzcy5wZXJjZW50Jyk7XG4gICAgd2FybmluZy5kZXByZWNhdGVkKCEoJ3dpZHRoJyBpbiBwcm9wcyksICd3aWR0aCcsICdzaXplJyk7XG4gICAgaWYgKHR5cGUgPT09ICdjaXJjbGUnIHx8IHR5cGUgPT09ICdkYXNoYm9hcmQnKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzaXplKSkge1xuICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKGZhbHNlLCAndXNhZ2UnLCAnVHlwZSBcImNpcmNsZVwiIGFuZCBcImRhc2hib2FyZFwiIGRvIG5vdCBhY2NlcHQgYXJyYXkgYXMgYHNpemVgLCBwbGVhc2UgdXNlIG51bWJlciBvciBwcmVzZXQgc2l6ZSBpbnN0ZWFkLicpIDogdm9pZCAwO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc2l6ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhmYWxzZSwgJ3VzYWdlJywgJ1R5cGUgXCJjaXJjbGVcIiBhbmQgXCJkYXNoYm9hcmRcIiBkbyBub3QgYWNjZXB0IG9iamVjdCBhcyBgc2l6ZWAsIHBsZWFzZSB1c2UgbnVtYmVyIG9yIHByZXNldCBzaXplIGluc3RlYWQuJykgOiB2b2lkIDA7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwcm9wcy5zdWNjZXNzICYmICdwcm9ncmVzcycgaW4gcHJvcHMuc3VjY2Vzcykge1xuICAgICAgd2FybmluZy5kZXByZWNhdGVkKGZhbHNlLCAnc3VjY2Vzcy5wcm9ncmVzcycsICdzdWNjZXNzLnBlcmNlbnQnKTtcbiAgICB9XG4gIH1cbiAgbGV0IHByb2dyZXNzO1xuICAvLyBSZW5kZXIgcHJvZ3Jlc3Mgc2hhcGVcbiAgaWYgKHR5cGUgPT09ICdsaW5lJykge1xuICAgIHByb2dyZXNzID0gc3RlcHMgPyAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU3RlcHMsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICBzdHJva2VDb2xvcjogc3Ryb2tlQ29sb3JOb3RHcmFkaWVudCxcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgc3RlcHM6IHR5cGVvZiBzdGVwcyA9PT0gJ29iamVjdCcgPyBzdGVwcy5jb3VudCA6IHN0ZXBzXG4gICAgfSksIHByb2dyZXNzSW5mbykpIDogKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExpbmUsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICBzdHJva2VDb2xvcjogc3Ryb2tlQ29sb3JOb3RBcnJheSxcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgZGlyZWN0aW9uOiBkaXJlY3Rpb24sXG4gICAgICBwZXJjZW50UG9zaXRpb246IHtcbiAgICAgICAgYWxpZ246IGluZm9BbGlnbixcbiAgICAgICAgdHlwZTogaW5mb1Bvc2l0aW9uXG4gICAgICB9XG4gICAgfSksIHByb2dyZXNzSW5mbykpO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdjaXJjbGUnIHx8IHR5cGUgPT09ICdkYXNoYm9hcmQnKSB7XG4gICAgcHJvZ3Jlc3MgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDaXJjbGUsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICBzdHJva2VDb2xvcjogc3Ryb2tlQ29sb3JOb3RBcnJheSxcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgcHJvZ3Jlc3NTdGF0dXM6IHByb2dyZXNzU3RhdHVzXG4gICAgfSksIHByb2dyZXNzSW5mbyk7XG4gIH1cbiAgY29uc3QgY2xhc3NTdHJpbmcgPSBjbGFzc05hbWVzKHByZWZpeENscywgYCR7cHJlZml4Q2xzfS1zdGF0dXMtJHtwcm9ncmVzc1N0YXR1c31gLCB7XG4gICAgW2Ake3ByZWZpeENsc30tJHt0eXBlID09PSAnZGFzaGJvYXJkJyAmJiAnY2lyY2xlJyB8fCB0eXBlfWBdOiB0eXBlICE9PSAnbGluZScsXG4gICAgW2Ake3ByZWZpeENsc30taW5saW5lLWNpcmNsZWBdOiB0eXBlID09PSAnY2lyY2xlJyAmJiBnZXRTaXplKHNpemUsICdjaXJjbGUnKVswXSA8PSAyMCxcbiAgICBbYCR7cHJlZml4Q2xzfS1saW5lYF06IGlzUHVyZUxpbmVUeXBlLFxuICAgIFtgJHtwcmVmaXhDbHN9LWxpbmUtYWxpZ24tJHtpbmZvQWxpZ259YF06IGlzUHVyZUxpbmVUeXBlLFxuICAgIFtgJHtwcmVmaXhDbHN9LWxpbmUtcG9zaXRpb24tJHtpbmZvUG9zaXRpb259YF06IGlzUHVyZUxpbmVUeXBlLFxuICAgIFtgJHtwcmVmaXhDbHN9LXN0ZXBzYF06IHN0ZXBzLFxuICAgIFtgJHtwcmVmaXhDbHN9LXNob3ctaW5mb2BdOiBzaG93SW5mbyxcbiAgICBbYCR7cHJlZml4Q2xzfS0ke3NpemV9YF06IHR5cGVvZiBzaXplID09PSAnc3RyaW5nJyxcbiAgICBbYCR7cHJlZml4Q2xzfS1ydGxgXTogZGlyZWN0aW9uID09PSAncnRsJ1xuICB9LCBwcm9ncmVzc1N0eWxlID09PSBudWxsIHx8IHByb2dyZXNzU3R5bGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHByb2dyZXNzU3R5bGUuY2xhc3NOYW1lLCBjbGFzc05hbWUsIHJvb3RDbGFzc05hbWUsIGhhc2hJZCwgY3NzVmFyQ2xzKTtcbiAgcmV0dXJuIHdyYXBDU1NWYXIoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgT2JqZWN0LmFzc2lnbih7XG4gICAgcmVmOiByZWYsXG4gICAgc3R5bGU6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJvZ3Jlc3NTdHlsZSA9PT0gbnVsbCB8fCBwcm9ncmVzc1N0eWxlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwcm9ncmVzc1N0eWxlLnN0eWxlKSwgc3R5bGUpLFxuICAgIGNsYXNzTmFtZTogY2xhc3NTdHJpbmcsXG4gICAgcm9sZTogXCJwcm9ncmVzc2JhclwiLFxuICAgIFwiYXJpYS12YWx1ZW5vd1wiOiBwZXJjZW50TnVtYmVyLFxuICAgIFwiYXJpYS12YWx1ZW1pblwiOiAwLFxuICAgIFwiYXJpYS12YWx1ZW1heFwiOiAxMDBcbiAgfSwgb21pdChyZXN0UHJvcHMsIFsndHJhaWxDb2xvcicsICdzdHJva2VXaWR0aCcsICd3aWR0aCcsICdnYXBEZWdyZWUnLCAnZ2FwUG9zaXRpb24nLCAnc3Ryb2tlTGluZWNhcCcsICdzdWNjZXNzJywgJ3N1Y2Nlc3NQZXJjZW50J10pKSwgcHJvZ3Jlc3MpKTtcbn0pO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgUHJvZ3Jlc3MuZGlzcGxheU5hbWUgPSAnUHJvZ3Jlc3MnO1xufVxuZXhwb3J0IGRlZmF1bHQgUHJvZ3Jlc3M7IiwgIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IENpcmNsZSBhcyBSQ0NpcmNsZSB9IGZyb20gJ3JjLXByb2dyZXNzJztcbmltcG9ydCBUb29sdGlwIGZyb20gJy4uL3Rvb2x0aXAnO1xuaW1wb3J0IHsgZ2V0UGVyY2VudGFnZSwgZ2V0U2l6ZSwgZ2V0U3Ryb2tlQ29sb3IgfSBmcm9tICcuL3V0aWxzJztcbmNvbnN0IENJUkNMRV9NSU5fU1RST0tFX1dJRFRIID0gMztcbmNvbnN0IGdldE1pblBlcmNlbnQgPSB3aWR0aCA9PiBDSVJDTEVfTUlOX1NUUk9LRV9XSURUSCAvIHdpZHRoICogMTAwO1xuY29uc3QgQ2lyY2xlID0gcHJvcHMgPT4ge1xuICBjb25zdCB7XG4gICAgcHJlZml4Q2xzLFxuICAgIHRyYWlsQ29sb3IgPSBudWxsLFxuICAgIHN0cm9rZUxpbmVjYXAgPSAncm91bmQnLFxuICAgIGdhcFBvc2l0aW9uLFxuICAgIGdhcERlZ3JlZSxcbiAgICB3aWR0aDogb3JpZ2luV2lkdGggPSAxMjAsXG4gICAgdHlwZSxcbiAgICBjaGlsZHJlbixcbiAgICBzdWNjZXNzLFxuICAgIHNpemUgPSBvcmlnaW5XaWR0aCxcbiAgICBzdGVwc1xuICB9ID0gcHJvcHM7XG4gIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IGdldFNpemUoc2l6ZSwgJ2NpcmNsZScpO1xuICBsZXQge1xuICAgIHN0cm9rZVdpZHRoXG4gIH0gPSBwcm9wcztcbiAgaWYgKHN0cm9rZVdpZHRoID09PSB1bmRlZmluZWQpIHtcbiAgICBzdHJva2VXaWR0aCA9IE1hdGgubWF4KGdldE1pblBlcmNlbnQod2lkdGgpLCA2KTtcbiAgfVxuICBjb25zdCBjaXJjbGVTdHlsZSA9IHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgZm9udFNpemU6IHdpZHRoICogMC4xNSArIDZcbiAgfTtcbiAgY29uc3QgcmVhbEdhcERlZ3JlZSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIC8vIFN1cHBvcnQgZ2FwRGVnID0gMCB3aGVuIHR5cGUgPSAnZGFzaGJvYXJkJ1xuICAgIGlmIChnYXBEZWdyZWUgfHwgZ2FwRGVncmVlID09PSAwKSB7XG4gICAgICByZXR1cm4gZ2FwRGVncmVlO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ2Rhc2hib2FyZCcpIHtcbiAgICAgIHJldHVybiA3NTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSwgW2dhcERlZ3JlZSwgdHlwZV0pO1xuICBjb25zdCBwZXJjZW50QXJyYXkgPSBnZXRQZXJjZW50YWdlKHByb3BzKTtcbiAgY29uc3QgZ2FwUG9zID0gZ2FwUG9zaXRpb24gfHwgdHlwZSA9PT0gJ2Rhc2hib2FyZCcgJiYgJ2JvdHRvbScgfHwgdW5kZWZpbmVkO1xuICAvLyB1c2luZyBjbGFzc05hbWUgdG8gc3R5bGUgc3Ryb2tlIGNvbG9yXG4gIGNvbnN0IGlzR3JhZGllbnQgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocHJvcHMuc3Ryb2tlQ29sb3IpID09PSAnW29iamVjdCBPYmplY3RdJztcbiAgY29uc3Qgc3Ryb2tlQ29sb3IgPSBnZXRTdHJva2VDb2xvcih7XG4gICAgc3VjY2VzcyxcbiAgICBzdHJva2VDb2xvcjogcHJvcHMuc3Ryb2tlQ29sb3JcbiAgfSk7XG4gIGNvbnN0IHdyYXBwZXJDbGFzc05hbWUgPSBjbGFzc05hbWVzKGAke3ByZWZpeENsc30taW5uZXJgLCB7XG4gICAgW2Ake3ByZWZpeENsc30tY2lyY2xlLWdyYWRpZW50YF06IGlzR3JhZGllbnRcbiAgfSk7XG4gIGNvbnN0IGNpcmNsZUNvbnRlbnQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSQ0NpcmNsZSwge1xuICAgIHN0ZXBzOiBzdGVwcyxcbiAgICBwZXJjZW50OiBzdGVwcyA/IHBlcmNlbnRBcnJheVsxXSA6IHBlcmNlbnRBcnJheSxcbiAgICBzdHJva2VXaWR0aDogc3Ryb2tlV2lkdGgsXG4gICAgdHJhaWxXaWR0aDogc3Ryb2tlV2lkdGgsXG4gICAgc3Ryb2tlQ29sb3I6IHN0ZXBzID8gc3Ryb2tlQ29sb3JbMV0gOiBzdHJva2VDb2xvcixcbiAgICBzdHJva2VMaW5lY2FwOiBzdHJva2VMaW5lY2FwLFxuICAgIHRyYWlsQ29sb3I6IHRyYWlsQ29sb3IsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgZ2FwRGVncmVlOiByZWFsR2FwRGVncmVlLFxuICAgIGdhcFBvc2l0aW9uOiBnYXBQb3NcbiAgfSk7XG4gIGNvbnN0IHNtYWxsQ2lyY2xlID0gd2lkdGggPD0gMjA7XG4gIGNvbnN0IG5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiB3cmFwcGVyQ2xhc3NOYW1lLFxuICAgIHN0eWxlOiBjaXJjbGVTdHlsZVxuICB9LCBjaXJjbGVDb250ZW50LCAhc21hbGxDaXJjbGUgJiYgY2hpbGRyZW4pO1xuICBpZiAoc21hbGxDaXJjbGUpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcCwge1xuICAgICAgdGl0bGU6IGNoaWxkcmVuXG4gICAgfSwgbm9kZSk7XG4gIH1cbiAgcmV0dXJuIG5vZGU7XG59O1xuZXhwb3J0IGRlZmF1bHQgQ2lyY2xlOyIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcImNsYXNzTmFtZVwiLCBcInBlcmNlbnRcIiwgXCJwcmVmaXhDbHNcIiwgXCJzdHJva2VDb2xvclwiLCBcInN0cm9rZUxpbmVjYXBcIiwgXCJzdHJva2VXaWR0aFwiLCBcInN0eWxlXCIsIFwidHJhaWxDb2xvclwiLCBcInRyYWlsV2lkdGhcIiwgXCJ0cmFuc2l0aW9uXCJdO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyB1c2VUcmFuc2l0aW9uRHVyYXRpb24sIGRlZmF1bHRQcm9wcyB9IGZyb20gXCIuL2NvbW1vblwiO1xudmFyIExpbmUgPSBmdW5jdGlvbiBMaW5lKHByb3BzKSB7XG4gIHZhciBfZGVmYXVsdFByb3BzJHByb3BzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBkZWZhdWx0UHJvcHMpLCBwcm9wcyksXG4gICAgY2xhc3NOYW1lID0gX2RlZmF1bHRQcm9wcyRwcm9wcy5jbGFzc05hbWUsXG4gICAgcGVyY2VudCA9IF9kZWZhdWx0UHJvcHMkcHJvcHMucGVyY2VudCxcbiAgICBwcmVmaXhDbHMgPSBfZGVmYXVsdFByb3BzJHByb3BzLnByZWZpeENscyxcbiAgICBzdHJva2VDb2xvciA9IF9kZWZhdWx0UHJvcHMkcHJvcHMuc3Ryb2tlQ29sb3IsXG4gICAgc3Ryb2tlTGluZWNhcCA9IF9kZWZhdWx0UHJvcHMkcHJvcHMuc3Ryb2tlTGluZWNhcCxcbiAgICBzdHJva2VXaWR0aCA9IF9kZWZhdWx0UHJvcHMkcHJvcHMuc3Ryb2tlV2lkdGgsXG4gICAgc3R5bGUgPSBfZGVmYXVsdFByb3BzJHByb3BzLnN0eWxlLFxuICAgIHRyYWlsQ29sb3IgPSBfZGVmYXVsdFByb3BzJHByb3BzLnRyYWlsQ29sb3IsXG4gICAgdHJhaWxXaWR0aCA9IF9kZWZhdWx0UHJvcHMkcHJvcHMudHJhaWxXaWR0aCxcbiAgICB0cmFuc2l0aW9uID0gX2RlZmF1bHRQcm9wcyRwcm9wcy50cmFuc2l0aW9uLFxuICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfZGVmYXVsdFByb3BzJHByb3BzLCBfZXhjbHVkZWQpO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICBkZWxldGUgcmVzdFByb3BzLmdhcFBvc2l0aW9uO1xuICB2YXIgcGVyY2VudExpc3QgPSBBcnJheS5pc0FycmF5KHBlcmNlbnQpID8gcGVyY2VudCA6IFtwZXJjZW50XTtcbiAgdmFyIHN0cm9rZUNvbG9yTGlzdCA9IEFycmF5LmlzQXJyYXkoc3Ryb2tlQ29sb3IpID8gc3Ryb2tlQ29sb3IgOiBbc3Ryb2tlQ29sb3JdO1xuICB2YXIgcGF0aHMgPSB1c2VUcmFuc2l0aW9uRHVyYXRpb24oKTtcbiAgdmFyIGNlbnRlciA9IHN0cm9rZVdpZHRoIC8gMjtcbiAgdmFyIHJpZ2h0ID0gMTAwIC0gc3Ryb2tlV2lkdGggLyAyO1xuICB2YXIgcGF0aFN0cmluZyA9IFwiTSBcIi5jb25jYXQoc3Ryb2tlTGluZWNhcCA9PT0gJ3JvdW5kJyA/IGNlbnRlciA6IDAsIFwiLFwiKS5jb25jYXQoY2VudGVyLCBcIlxcbiAgICAgICAgIEwgXCIpLmNvbmNhdChzdHJva2VMaW5lY2FwID09PSAncm91bmQnID8gcmlnaHQgOiAxMDAsIFwiLFwiKS5jb25jYXQoY2VudGVyKTtcbiAgdmFyIHZpZXdCb3hTdHJpbmcgPSBcIjAgMCAxMDAgXCIuY29uY2F0KHN0cm9rZVdpZHRoKTtcbiAgdmFyIHN0YWNrUHRnID0gMDtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1saW5lXCIpLCBjbGFzc05hbWUpLFxuICAgIHZpZXdCb3g6IHZpZXdCb3hTdHJpbmcsXG4gICAgcHJlc2VydmVBc3BlY3RSYXRpbzogXCJub25lXCIsXG4gICAgc3R5bGU6IHN0eWxlXG4gIH0sIHJlc3RQcm9wcyksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxpbmUtdHJhaWxcIiksXG4gICAgZDogcGF0aFN0cmluZyxcbiAgICBzdHJva2VMaW5lY2FwOiBzdHJva2VMaW5lY2FwLFxuICAgIHN0cm9rZTogdHJhaWxDb2xvcixcbiAgICBzdHJva2VXaWR0aDogdHJhaWxXaWR0aCB8fCBzdHJva2VXaWR0aCxcbiAgICBmaWxsT3BhY2l0eTogXCIwXCJcbiAgfSksIHBlcmNlbnRMaXN0Lm1hcChmdW5jdGlvbiAocHRnLCBpbmRleCkge1xuICAgIHZhciBkYXNoUGVyY2VudCA9IDE7XG4gICAgc3dpdGNoIChzdHJva2VMaW5lY2FwKSB7XG4gICAgICBjYXNlICdyb3VuZCc6XG4gICAgICAgIGRhc2hQZXJjZW50ID0gMSAtIHN0cm9rZVdpZHRoIC8gMTAwO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3NxdWFyZSc6XG4gICAgICAgIGRhc2hQZXJjZW50ID0gMSAtIHN0cm9rZVdpZHRoIC8gMiAvIDEwMDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBkYXNoUGVyY2VudCA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB2YXIgcGF0aFN0eWxlID0ge1xuICAgICAgc3Ryb2tlRGFzaGFycmF5OiBcIlwiLmNvbmNhdChwdGcgKiBkYXNoUGVyY2VudCwgXCJweCwgMTAwcHhcIiksXG4gICAgICBzdHJva2VEYXNob2Zmc2V0OiBcIi1cIi5jb25jYXQoc3RhY2tQdGcsIFwicHhcIiksXG4gICAgICB0cmFuc2l0aW9uOiB0cmFuc2l0aW9uIHx8ICdzdHJva2UtZGFzaG9mZnNldCAwLjNzIGVhc2UgMHMsIHN0cm9rZS1kYXNoYXJyYXkgLjNzIGVhc2UgMHMsIHN0cm9rZSAwLjNzIGxpbmVhcidcbiAgICB9O1xuICAgIHZhciBjb2xvciA9IHN0cm9rZUNvbG9yTGlzdFtpbmRleF0gfHwgc3Ryb2tlQ29sb3JMaXN0W3N0cm9rZUNvbG9yTGlzdC5sZW5ndGggLSAxXTtcbiAgICBzdGFja1B0ZyArPSBwdGc7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgICBrZXk6IGluZGV4LFxuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxpbmUtcGF0aFwiKSxcbiAgICAgIGQ6IHBhdGhTdHJpbmcsXG4gICAgICBzdHJva2VMaW5lY2FwOiBzdHJva2VMaW5lY2FwLFxuICAgICAgc3Ryb2tlOiBjb2xvcixcbiAgICAgIHN0cm9rZVdpZHRoOiBzdHJva2VXaWR0aCxcbiAgICAgIGZpbGxPcGFjaXR5OiBcIjBcIixcbiAgICAgIHJlZjogZnVuY3Rpb24gcmVmKGVsZW0pIHtcbiAgICAgICAgLy8gaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlZnMtYW5kLXRoZS1kb20uaHRtbCNjYWxsYmFjay1yZWZzXG4gICAgICAgIC8vIFJlYWN0IHdpbGwgY2FsbCB0aGUgcmVmIGNhbGxiYWNrIHdpdGggdGhlIERPTSBlbGVtZW50IHdoZW4gdGhlIGNvbXBvbmVudCBtb3VudHMsXG4gICAgICAgIC8vIGFuZCBjYWxsIGl0IHdpdGggYG51bGxgIHdoZW4gaXQgdW5tb3VudHMuXG4gICAgICAgIC8vIFJlZnMgYXJlIGd1YXJhbnRlZWQgdG8gYmUgdXAtdG8tZGF0ZSBiZWZvcmUgY29tcG9uZW50RGlkTW91bnQgb3IgY29tcG9uZW50RGlkVXBkYXRlIGZpcmVzLlxuXG4gICAgICAgIHBhdGhzW2luZGV4XSA9IGVsZW07XG4gICAgICB9LFxuICAgICAgc3R5bGU6IHBhdGhTdHlsZVxuICAgIH0pO1xuICB9KSk7XG59O1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgTGluZS5kaXNwbGF5TmFtZSA9ICdMaW5lJztcbn1cbmV4cG9ydCBkZWZhdWx0IExpbmU7IiwgImltcG9ydCB7IHVzZVJlZiwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuZXhwb3J0IHZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIHBlcmNlbnQ6IDAsXG4gIHByZWZpeENsczogJ3JjLXByb2dyZXNzJyxcbiAgc3Ryb2tlQ29sb3I6ICcjMmRiN2Y1JyxcbiAgc3Ryb2tlTGluZWNhcDogJ3JvdW5kJyxcbiAgc3Ryb2tlV2lkdGg6IDEsXG4gIHRyYWlsQ29sb3I6ICcjRDlEOUQ5JyxcbiAgdHJhaWxXaWR0aDogMSxcbiAgZ2FwUG9zaXRpb246ICdib3R0b20nXG59O1xuZXhwb3J0IHZhciB1c2VUcmFuc2l0aW9uRHVyYXRpb24gPSBmdW5jdGlvbiB1c2VUcmFuc2l0aW9uRHVyYXRpb24oKSB7XG4gIHZhciBwYXRoc1JlZiA9IHVzZVJlZihbXSk7XG4gIHZhciBwcmV2VGltZVN0YW1wID0gdXNlUmVmKG51bGwpO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBub3cgPSBEYXRlLm5vdygpO1xuICAgIHZhciB1cGRhdGVkID0gZmFsc2U7XG4gICAgcGF0aHNSZWYuY3VycmVudC5mb3JFYWNoKGZ1bmN0aW9uIChwYXRoKSB7XG4gICAgICBpZiAoIXBhdGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdXBkYXRlZCA9IHRydWU7XG4gICAgICB2YXIgcGF0aFN0eWxlID0gcGF0aC5zdHlsZTtcbiAgICAgIHBhdGhTdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSAnLjNzLCAuM3MsIC4zcywgLjA2cyc7XG4gICAgICBpZiAocHJldlRpbWVTdGFtcC5jdXJyZW50ICYmIG5vdyAtIHByZXZUaW1lU3RhbXAuY3VycmVudCA8IDEwMCkge1xuICAgICAgICBwYXRoU3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uID0gJzBzLCAwcyc7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgIHByZXZUaW1lU3RhbXAuY3VycmVudCA9IERhdGUubm93KCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHBhdGhzUmVmLmN1cnJlbnQ7XG59OyIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcImlkXCIsIFwicHJlZml4Q2xzXCIsIFwic3RlcHNcIiwgXCJzdHJva2VXaWR0aFwiLCBcInRyYWlsV2lkdGhcIiwgXCJnYXBEZWdyZWVcIiwgXCJnYXBQb3NpdGlvblwiLCBcInRyYWlsQ29sb3JcIiwgXCJzdHJva2VMaW5lY2FwXCIsIFwic3R5bGVcIiwgXCJjbGFzc05hbWVcIiwgXCJzdHJva2VDb2xvclwiLCBcInBlcmNlbnRcIl07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IGRlZmF1bHRQcm9wcywgdXNlVHJhbnNpdGlvbkR1cmF0aW9uIH0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHVzZUlkIGZyb20gXCIuLi9ob29rcy91c2VJZFwiO1xuaW1wb3J0IFB0Z0NpcmNsZSBmcm9tIFwiLi9QdGdDaXJjbGVcIjtcbmltcG9ydCB7IFZJRVdfQk9YX1NJWkUsIGdldENpcmNsZVN0eWxlIH0gZnJvbSBcIi4vdXRpbFwiO1xuZnVuY3Rpb24gdG9BcnJheSh2YWx1ZSkge1xuICB2YXIgbWVyZ2VkVmFsdWUgPSB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdm9pZCAwID8gdmFsdWUgOiBbXTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkobWVyZ2VkVmFsdWUpID8gbWVyZ2VkVmFsdWUgOiBbbWVyZ2VkVmFsdWVdO1xufVxudmFyIENpcmNsZSA9IGZ1bmN0aW9uIENpcmNsZShwcm9wcykge1xuICB2YXIgX2RlZmF1bHRQcm9wcyRwcm9wcyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZGVmYXVsdFByb3BzKSwgcHJvcHMpLFxuICAgIGlkID0gX2RlZmF1bHRQcm9wcyRwcm9wcy5pZCxcbiAgICBwcmVmaXhDbHMgPSBfZGVmYXVsdFByb3BzJHByb3BzLnByZWZpeENscyxcbiAgICBzdGVwcyA9IF9kZWZhdWx0UHJvcHMkcHJvcHMuc3RlcHMsXG4gICAgc3Ryb2tlV2lkdGggPSBfZGVmYXVsdFByb3BzJHByb3BzLnN0cm9rZVdpZHRoLFxuICAgIHRyYWlsV2lkdGggPSBfZGVmYXVsdFByb3BzJHByb3BzLnRyYWlsV2lkdGgsXG4gICAgX2RlZmF1bHRQcm9wcyRwcm9wcyRnID0gX2RlZmF1bHRQcm9wcyRwcm9wcy5nYXBEZWdyZWUsXG4gICAgZ2FwRGVncmVlID0gX2RlZmF1bHRQcm9wcyRwcm9wcyRnID09PSB2b2lkIDAgPyAwIDogX2RlZmF1bHRQcm9wcyRwcm9wcyRnLFxuICAgIGdhcFBvc2l0aW9uID0gX2RlZmF1bHRQcm9wcyRwcm9wcy5nYXBQb3NpdGlvbixcbiAgICB0cmFpbENvbG9yID0gX2RlZmF1bHRQcm9wcyRwcm9wcy50cmFpbENvbG9yLFxuICAgIHN0cm9rZUxpbmVjYXAgPSBfZGVmYXVsdFByb3BzJHByb3BzLnN0cm9rZUxpbmVjYXAsXG4gICAgc3R5bGUgPSBfZGVmYXVsdFByb3BzJHByb3BzLnN0eWxlLFxuICAgIGNsYXNzTmFtZSA9IF9kZWZhdWx0UHJvcHMkcHJvcHMuY2xhc3NOYW1lLFxuICAgIHN0cm9rZUNvbG9yID0gX2RlZmF1bHRQcm9wcyRwcm9wcy5zdHJva2VDb2xvcixcbiAgICBwZXJjZW50ID0gX2RlZmF1bHRQcm9wcyRwcm9wcy5wZXJjZW50LFxuICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfZGVmYXVsdFByb3BzJHByb3BzLCBfZXhjbHVkZWQpO1xuICB2YXIgaGFsZlNpemUgPSBWSUVXX0JPWF9TSVpFIC8gMjtcbiAgdmFyIG1lcmdlZElkID0gdXNlSWQoaWQpO1xuICB2YXIgZ3JhZGllbnRJZCA9IFwiXCIuY29uY2F0KG1lcmdlZElkLCBcIi1ncmFkaWVudFwiKTtcbiAgdmFyIHJhZGl1cyA9IGhhbGZTaXplIC0gc3Ryb2tlV2lkdGggLyAyO1xuICB2YXIgcGVyaW1ldGVyID0gTWF0aC5QSSAqIDIgKiByYWRpdXM7XG4gIHZhciByb3RhdGVEZWcgPSBnYXBEZWdyZWUgPiAwID8gOTAgKyBnYXBEZWdyZWUgLyAyIDogLTkwO1xuICB2YXIgcGVyaW1ldGVyV2l0aG91dEdhcCA9IHBlcmltZXRlciAqICgoMzYwIC0gZ2FwRGVncmVlKSAvIDM2MCk7XG4gIHZhciBfcmVmID0gX3R5cGVvZihzdGVwcykgPT09ICdvYmplY3QnID8gc3RlcHMgOiB7XG4gICAgICBjb3VudDogc3RlcHMsXG4gICAgICBnYXA6IDJcbiAgICB9LFxuICAgIHN0ZXBDb3VudCA9IF9yZWYuY291bnQsXG4gICAgc3RlcEdhcCA9IF9yZWYuZ2FwO1xuICB2YXIgcGVyY2VudExpc3QgPSB0b0FycmF5KHBlcmNlbnQpO1xuICB2YXIgc3Ryb2tlQ29sb3JMaXN0ID0gdG9BcnJheShzdHJva2VDb2xvcik7XG4gIHZhciBncmFkaWVudCA9IHN0cm9rZUNvbG9yTGlzdC5maW5kKGZ1bmN0aW9uIChjb2xvcikge1xuICAgIHJldHVybiBjb2xvciAmJiBfdHlwZW9mKGNvbG9yKSA9PT0gJ29iamVjdCc7XG4gIH0pO1xuICB2YXIgaXNDb25pY0dyYWRpZW50ID0gZ3JhZGllbnQgJiYgX3R5cGVvZihncmFkaWVudCkgPT09ICdvYmplY3QnO1xuICB2YXIgbWVyZ2VkU3Ryb2tlTGluZWNhcCA9IGlzQ29uaWNHcmFkaWVudCA/ICdidXR0JyA6IHN0cm9rZUxpbmVjYXA7XG4gIHZhciBjaXJjbGVTdHlsZSA9IGdldENpcmNsZVN0eWxlKHBlcmltZXRlciwgcGVyaW1ldGVyV2l0aG91dEdhcCwgMCwgMTAwLCByb3RhdGVEZWcsIGdhcERlZ3JlZSwgZ2FwUG9zaXRpb24sIHRyYWlsQ29sb3IsIG1lcmdlZFN0cm9rZUxpbmVjYXAsIHN0cm9rZVdpZHRoKTtcbiAgdmFyIHBhdGhzID0gdXNlVHJhbnNpdGlvbkR1cmF0aW9uKCk7XG4gIHZhciBnZXRTdG9rZUxpc3QgPSBmdW5jdGlvbiBnZXRTdG9rZUxpc3QoKSB7XG4gICAgdmFyIHN0YWNrUHRnID0gMDtcbiAgICByZXR1cm4gcGVyY2VudExpc3QubWFwKGZ1bmN0aW9uIChwdGcsIGluZGV4KSB7XG4gICAgICB2YXIgY29sb3IgPSBzdHJva2VDb2xvckxpc3RbaW5kZXhdIHx8IHN0cm9rZUNvbG9yTGlzdFtzdHJva2VDb2xvckxpc3QubGVuZ3RoIC0gMV07XG4gICAgICB2YXIgY2lyY2xlU3R5bGVGb3JTdGFjayA9IGdldENpcmNsZVN0eWxlKHBlcmltZXRlciwgcGVyaW1ldGVyV2l0aG91dEdhcCwgc3RhY2tQdGcsIHB0Zywgcm90YXRlRGVnLCBnYXBEZWdyZWUsIGdhcFBvc2l0aW9uLCBjb2xvciwgbWVyZ2VkU3Ryb2tlTGluZWNhcCwgc3Ryb2tlV2lkdGgpO1xuICAgICAgc3RhY2tQdGcgKz0gcHRnO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFB0Z0NpcmNsZSwge1xuICAgICAgICBrZXk6IGluZGV4LFxuICAgICAgICBjb2xvcjogY29sb3IsXG4gICAgICAgIHB0ZzogcHRnLFxuICAgICAgICByYWRpdXM6IHJhZGl1cyxcbiAgICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICAgIGdyYWRpZW50SWQ6IGdyYWRpZW50SWQsXG4gICAgICAgIHN0eWxlOiBjaXJjbGVTdHlsZUZvclN0YWNrLFxuICAgICAgICBzdHJva2VMaW5lY2FwOiBtZXJnZWRTdHJva2VMaW5lY2FwLFxuICAgICAgICBzdHJva2VXaWR0aDogc3Ryb2tlV2lkdGgsXG4gICAgICAgIGdhcERlZ3JlZTogZ2FwRGVncmVlLFxuICAgICAgICByZWY6IGZ1bmN0aW9uIHJlZihlbGVtKSB7XG4gICAgICAgICAgLy8gaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlZnMtYW5kLXRoZS1kb20uaHRtbCNjYWxsYmFjay1yZWZzXG4gICAgICAgICAgLy8gUmVhY3Qgd2lsbCBjYWxsIHRoZSByZWYgY2FsbGJhY2sgd2l0aCB0aGUgRE9NIGVsZW1lbnQgd2hlbiB0aGUgY29tcG9uZW50IG1vdW50cyxcbiAgICAgICAgICAvLyBhbmQgY2FsbCBpdCB3aXRoIGBudWxsYCB3aGVuIGl0IHVubW91bnRzLlxuICAgICAgICAgIC8vIFJlZnMgYXJlIGd1YXJhbnRlZWQgdG8gYmUgdXAtdG8tZGF0ZSBiZWZvcmUgY29tcG9uZW50RGlkTW91bnQgb3IgY29tcG9uZW50RGlkVXBkYXRlIGZpcmVzLlxuXG4gICAgICAgICAgcGF0aHNbaW5kZXhdID0gZWxlbTtcbiAgICAgICAgfSxcbiAgICAgICAgc2l6ZTogVklFV19CT1hfU0laRVxuICAgICAgfSk7XG4gICAgfSkucmV2ZXJzZSgpO1xuICB9O1xuICB2YXIgZ2V0U3RlcFN0b2tlTGlzdCA9IGZ1bmN0aW9uIGdldFN0ZXBTdG9rZUxpc3QoKSB7XG4gICAgLy8gb25seSBzaG93IHRoZSBmaXJzdCBwZXJjZW50IHdoZW4gcGFzcyBzdGVwc1xuICAgIHZhciBjdXJyZW50ID0gTWF0aC5yb3VuZChzdGVwQ291bnQgKiAocGVyY2VudExpc3RbMF0gLyAxMDApKTtcbiAgICB2YXIgc3RlcFB0ZyA9IDEwMCAvIHN0ZXBDb3VudDtcbiAgICB2YXIgc3RhY2tQdGcgPSAwO1xuICAgIHJldHVybiBuZXcgQXJyYXkoc3RlcENvdW50KS5maWxsKG51bGwpLm1hcChmdW5jdGlvbiAoXywgaW5kZXgpIHtcbiAgICAgIHZhciBjb2xvciA9IGluZGV4IDw9IGN1cnJlbnQgLSAxID8gc3Ryb2tlQ29sb3JMaXN0WzBdIDogdHJhaWxDb2xvcjtcbiAgICAgIHZhciBzdHJva2UgPSBjb2xvciAmJiBfdHlwZW9mKGNvbG9yKSA9PT0gJ29iamVjdCcgPyBcInVybCgjXCIuY29uY2F0KGdyYWRpZW50SWQsIFwiKVwiKSA6IHVuZGVmaW5lZDtcbiAgICAgIHZhciBjaXJjbGVTdHlsZUZvclN0YWNrID0gZ2V0Q2lyY2xlU3R5bGUocGVyaW1ldGVyLCBwZXJpbWV0ZXJXaXRob3V0R2FwLCBzdGFja1B0Zywgc3RlcFB0Zywgcm90YXRlRGVnLCBnYXBEZWdyZWUsIGdhcFBvc2l0aW9uLCBjb2xvciwgJ2J1dHQnLCBzdHJva2VXaWR0aCwgc3RlcEdhcCk7XG4gICAgICBzdGFja1B0ZyArPSAocGVyaW1ldGVyV2l0aG91dEdhcCAtIGNpcmNsZVN0eWxlRm9yU3RhY2suc3Ryb2tlRGFzaG9mZnNldCArIHN0ZXBHYXApICogMTAwIC8gcGVyaW1ldGVyV2l0aG91dEdhcDtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImNpcmNsZVwiLCB7XG4gICAgICAgIGtleTogaW5kZXgsXG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jaXJjbGUtcGF0aFwiKSxcbiAgICAgICAgcjogcmFkaXVzLFxuICAgICAgICBjeDogaGFsZlNpemUsXG4gICAgICAgIGN5OiBoYWxmU2l6ZSxcbiAgICAgICAgc3Ryb2tlOiBzdHJva2UsXG4gICAgICAgIHN0cm9rZVdpZHRoOiBzdHJva2VXaWR0aCxcbiAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgc3R5bGU6IGNpcmNsZVN0eWxlRm9yU3RhY2ssXG4gICAgICAgIHJlZjogZnVuY3Rpb24gcmVmKGVsZW0pIHtcbiAgICAgICAgICBwYXRoc1tpbmRleF0gPSBlbGVtO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jaXJjbGVcIiksIGNsYXNzTmFtZSksXG4gICAgdmlld0JveDogXCIwIDAgXCIuY29uY2F0KFZJRVdfQk9YX1NJWkUsIFwiIFwiKS5jb25jYXQoVklFV19CT1hfU0laRSksXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIGlkOiBpZCxcbiAgICByb2xlOiBcInByZXNlbnRhdGlvblwiXG4gIH0sIHJlc3RQcm9wcyksICFzdGVwQ291bnQgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJjaXJjbGVcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jaXJjbGUtdHJhaWxcIiksXG4gICAgcjogcmFkaXVzLFxuICAgIGN4OiBoYWxmU2l6ZSxcbiAgICBjeTogaGFsZlNpemUsXG4gICAgc3Ryb2tlOiB0cmFpbENvbG9yLFxuICAgIHN0cm9rZUxpbmVjYXA6IG1lcmdlZFN0cm9rZUxpbmVjYXAsXG4gICAgc3Ryb2tlV2lkdGg6IHRyYWlsV2lkdGggfHwgc3Ryb2tlV2lkdGgsXG4gICAgc3R5bGU6IGNpcmNsZVN0eWxlXG4gIH0pLCBzdGVwQ291bnQgPyBnZXRTdGVwU3Rva2VMaXN0KCkgOiBnZXRTdG9rZUxpc3QoKSk7XG59O1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgQ2lyY2xlLmRpc3BsYXlOYW1lID0gJ0NpcmNsZSc7XG59XG5leHBvcnQgZGVmYXVsdCBDaXJjbGU7IiwgImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNhblVzZURvbSBmcm9tIFwicmMtdXRpbC9lcy9Eb20vY2FuVXNlRG9tXCI7XG52YXIgdXVpZCA9IDA7XG5cbi8qKiBJcyBjbGllbnQgc2lkZSBhbmQgbm90IGpzZG9tICovXG5leHBvcnQgdmFyIGlzQnJvd3NlckNsaWVudCA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAndGVzdCcgJiYgY2FuVXNlRG9tKCk7XG5cbi8qKiBHZXQgdW5pcXVlIGlkIGZvciBhY2Nlc3NpYmlsaXR5IHVzYWdlICovXG5mdW5jdGlvbiBnZXRVVUlEKCkge1xuICB2YXIgcmV0SWQ7XG5cbiAgLy8gVGVzdCBuZXZlciByZWFjaFxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKGlzQnJvd3NlckNsaWVudCkge1xuICAgIHJldElkID0gdXVpZDtcbiAgICB1dWlkICs9IDE7XG4gIH0gZWxzZSB7XG4gICAgcmV0SWQgPSAnVEVTVF9PUl9TU1InO1xuICB9XG4gIHJldHVybiByZXRJZDtcbn1cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAoaWQpIHtcbiAgLy8gSW5uZXIgaWQgZm9yIGFjY2Vzc2liaWxpdHkgdXNhZ2UuIE9ubHkgd29yayBpbiBjbGllbnQgc2lkZVxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBpbm5lcklkID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXRJbm5lcklkID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBzZXRJbm5lcklkKFwicmNfcHJvZ3Jlc3NfXCIuY29uY2F0KGdldFVVSUQoKSkpO1xuICB9LCBbXSk7XG4gIHJldHVybiBpZCB8fCBpbm5lcklkO1xufSk7IiwgImltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbnZhciBCbG9jayA9IGZ1bmN0aW9uIEJsb2NrKF9yZWYpIHtcbiAgdmFyIGJnID0gX3JlZi5iZyxcbiAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW47XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgc3R5bGU6IHtcbiAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgIGJhY2tncm91bmQ6IGJnXG4gICAgfVxuICB9LCBjaGlsZHJlbik7XG59O1xuZnVuY3Rpb24gZ2V0UHRnQ29sb3JzKGNvbG9yLCBzY2FsZSkge1xuICByZXR1cm4gT2JqZWN0LmtleXMoY29sb3IpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIHBhcnNlZEtleSA9IHBhcnNlRmxvYXQoa2V5KTtcbiAgICB2YXIgcHRnS2V5ID0gXCJcIi5jb25jYXQoTWF0aC5mbG9vcihwYXJzZWRLZXkgKiBzY2FsZSksIFwiJVwiKTtcbiAgICByZXR1cm4gXCJcIi5jb25jYXQoY29sb3Jba2V5XSwgXCIgXCIpLmNvbmNhdChwdGdLZXkpO1xuICB9KTtcbn1cbnZhciBQdGdDaXJjbGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIGNvbG9yID0gcHJvcHMuY29sb3IsXG4gICAgZ3JhZGllbnRJZCA9IHByb3BzLmdyYWRpZW50SWQsXG4gICAgcmFkaXVzID0gcHJvcHMucmFkaXVzLFxuICAgIGNpcmNsZVN0eWxlRm9yU3RhY2sgPSBwcm9wcy5zdHlsZSxcbiAgICBwdGcgPSBwcm9wcy5wdGcsXG4gICAgc3Ryb2tlTGluZWNhcCA9IHByb3BzLnN0cm9rZUxpbmVjYXAsXG4gICAgc3Ryb2tlV2lkdGggPSBwcm9wcy5zdHJva2VXaWR0aCxcbiAgICBzaXplID0gcHJvcHMuc2l6ZSxcbiAgICBnYXBEZWdyZWUgPSBwcm9wcy5nYXBEZWdyZWU7XG4gIHZhciBpc0dyYWRpZW50ID0gY29sb3IgJiYgX3R5cGVvZihjb2xvcikgPT09ICdvYmplY3QnO1xuICB2YXIgc3Ryb2tlID0gaXNHcmFkaWVudCA/IFwiI0ZGRlwiIDogdW5kZWZpbmVkO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IENpcmNsZSA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgaGFsZlNpemUgPSBzaXplIC8gMjtcbiAgdmFyIGNpcmNsZU5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImNpcmNsZVwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNpcmNsZS1wYXRoXCIpLFxuICAgIHI6IHJhZGl1cyxcbiAgICBjeDogaGFsZlNpemUsXG4gICAgY3k6IGhhbGZTaXplLFxuICAgIHN0cm9rZTogc3Ryb2tlLFxuICAgIHN0cm9rZUxpbmVjYXA6IHN0cm9rZUxpbmVjYXAsXG4gICAgc3Ryb2tlV2lkdGg6IHN0cm9rZVdpZHRoLFxuICAgIG9wYWNpdHk6IHB0ZyA9PT0gMCA/IDAgOiAxLFxuICAgIHN0eWxlOiBjaXJjbGVTdHlsZUZvclN0YWNrLFxuICAgIHJlZjogcmVmXG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBpZiAoIWlzR3JhZGllbnQpIHtcbiAgICByZXR1cm4gY2lyY2xlTm9kZTtcbiAgfVxuICB2YXIgbWFza0lkID0gXCJcIi5jb25jYXQoZ3JhZGllbnRJZCwgXCItY29uaWNcIik7XG4gIHZhciBmcm9tRGVnID0gZ2FwRGVncmVlID8gXCJcIi5jb25jYXQoMTgwICsgZ2FwRGVncmVlIC8gMiwgXCJkZWdcIikgOiAnMGRlZyc7XG4gIHZhciBjb25pY0NvbG9ycyA9IGdldFB0Z0NvbG9ycyhjb2xvciwgKDM2MCAtIGdhcERlZ3JlZSkgLyAzNjApO1xuICB2YXIgbGluZWFyQ29sb3JzID0gZ2V0UHRnQ29sb3JzKGNvbG9yLCAxKTtcbiAgdmFyIGNvbmljQ29sb3JCZyA9IFwiY29uaWMtZ3JhZGllbnQoZnJvbSBcIi5jb25jYXQoZnJvbURlZywgXCIsIFwiKS5jb25jYXQoY29uaWNDb2xvcnMuam9pbignLCAnKSwgXCIpXCIpO1xuICB2YXIgbGluZWFyQ29sb3JCZyA9IFwibGluZWFyLWdyYWRpZW50KHRvIFwiLmNvbmNhdChnYXBEZWdyZWUgPyAnYm90dG9tJyA6ICd0b3AnLCBcIiwgXCIpLmNvbmNhdChsaW5lYXJDb2xvcnMuam9pbignLCAnKSwgXCIpXCIpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwibWFza1wiLCB7XG4gICAgaWQ6IG1hc2tJZFxuICB9LCBjaXJjbGVOb2RlKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJmb3JlaWduT2JqZWN0XCIsIHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgd2lkdGg6IHNpemUsXG4gICAgaGVpZ2h0OiBzaXplLFxuICAgIG1hc2s6IFwidXJsKCNcIi5jb25jYXQobWFza0lkLCBcIilcIilcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQmxvY2ssIHtcbiAgICBiZzogbGluZWFyQ29sb3JCZ1xuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChCbG9jaywge1xuICAgIGJnOiBjb25pY0NvbG9yQmdcbiAgfSkpKSk7XG59KTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFB0Z0NpcmNsZS5kaXNwbGF5TmFtZSA9ICdQdGdDaXJjbGUnO1xufVxuZXhwb3J0IGRlZmF1bHQgUHRnQ2lyY2xlOyIsICJleHBvcnQgdmFyIFZJRVdfQk9YX1NJWkUgPSAxMDA7XG5leHBvcnQgdmFyIGdldENpcmNsZVN0eWxlID0gZnVuY3Rpb24gZ2V0Q2lyY2xlU3R5bGUocGVyaW1ldGVyLCBwZXJpbWV0ZXJXaXRob3V0R2FwLCBvZmZzZXQsIHBlcmNlbnQsIHJvdGF0ZURlZywgZ2FwRGVncmVlLCBnYXBQb3NpdGlvbiwgc3Ryb2tlQ29sb3IsIHN0cm9rZUxpbmVjYXAsIHN0cm9rZVdpZHRoKSB7XG4gIHZhciBzdGVwU3BhY2UgPSBhcmd1bWVudHMubGVuZ3RoID4gMTAgJiYgYXJndW1lbnRzWzEwXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzEwXSA6IDA7XG4gIHZhciBvZmZzZXREZWcgPSBvZmZzZXQgLyAxMDAgKiAzNjAgKiAoKDM2MCAtIGdhcERlZ3JlZSkgLyAzNjApO1xuICB2YXIgcG9zaXRpb25EZWcgPSBnYXBEZWdyZWUgPT09IDAgPyAwIDoge1xuICAgIGJvdHRvbTogMCxcbiAgICB0b3A6IDE4MCxcbiAgICBsZWZ0OiA5MCxcbiAgICByaWdodDogLTkwXG4gIH1bZ2FwUG9zaXRpb25dO1xuICB2YXIgc3Ryb2tlRGFzaG9mZnNldCA9ICgxMDAgLSBwZXJjZW50KSAvIDEwMCAqIHBlcmltZXRlcldpdGhvdXRHYXA7XG4gIC8vIEZpeCBwZXJjZW50IGFjY3VyYWN5IHdoZW4gc3Ryb2tlTGluZWNhcCBpcyByb3VuZFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8zNTAwOVxuICBpZiAoc3Ryb2tlTGluZWNhcCA9PT0gJ3JvdW5kJyAmJiBwZXJjZW50ICE9PSAxMDApIHtcbiAgICBzdHJva2VEYXNob2Zmc2V0ICs9IHN0cm9rZVdpZHRoIC8gMjtcbiAgICAvLyB3aGVuIHBlcmNlbnQgaXMgc21hbGwgZW5vdWdoICg8PSAxJSksIGtlZXAgc21hbGxlc3QgdmFsdWUgdG8gYXZvaWQgaXQncyBkaXNhcHBlYXJhbmNlXG4gICAgaWYgKHN0cm9rZURhc2hvZmZzZXQgPj0gcGVyaW1ldGVyV2l0aG91dEdhcCkge1xuICAgICAgc3Ryb2tlRGFzaG9mZnNldCA9IHBlcmltZXRlcldpdGhvdXRHYXAgLSAwLjAxO1xuICAgIH1cbiAgfVxuICB2YXIgaGFsZlNpemUgPSBWSUVXX0JPWF9TSVpFIC8gMjtcbiAgcmV0dXJuIHtcbiAgICBzdHJva2U6IHR5cGVvZiBzdHJva2VDb2xvciA9PT0gJ3N0cmluZycgPyBzdHJva2VDb2xvciA6IHVuZGVmaW5lZCxcbiAgICBzdHJva2VEYXNoYXJyYXk6IFwiXCIuY29uY2F0KHBlcmltZXRlcldpdGhvdXRHYXAsIFwicHggXCIpLmNvbmNhdChwZXJpbWV0ZXIpLFxuICAgIHN0cm9rZURhc2hvZmZzZXQ6IHN0cm9rZURhc2hvZmZzZXQgKyBzdGVwU3BhY2UsXG4gICAgdHJhbnNmb3JtOiBcInJvdGF0ZShcIi5jb25jYXQocm90YXRlRGVnICsgb2Zmc2V0RGVnICsgcG9zaXRpb25EZWcsIFwiZGVnKVwiKSxcbiAgICB0cmFuc2Zvcm1PcmlnaW46IFwiXCIuY29uY2F0KGhhbGZTaXplLCBcInB4IFwiKS5jb25jYXQoaGFsZlNpemUsIFwicHhcIiksXG4gICAgdHJhbnNpdGlvbjogJ3N0cm9rZS1kYXNob2Zmc2V0IC4zcyBlYXNlIDBzLCBzdHJva2UtZGFzaGFycmF5IC4zcyBlYXNlIDBzLCBzdHJva2UgLjNzLCBzdHJva2Utd2lkdGggLjA2cyBlYXNlIC4zcywgb3BhY2l0eSAuM3MgZWFzZSAwcycsXG4gICAgZmlsbE9wYWNpdHk6IDBcbiAgfTtcbn07IiwgImltcG9ydCB7IHByZXNldFByaW1hcnlDb2xvcnMgfSBmcm9tICdAYW50LWRlc2lnbi9jb2xvcnMnO1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkUHJvZ3Jlc3MocHJvZ3Jlc3MpIHtcbiAgaWYgKCFwcm9ncmVzcyB8fCBwcm9ncmVzcyA8IDApIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBpZiAocHJvZ3Jlc3MgPiAxMDApIHtcbiAgICByZXR1cm4gMTAwO1xuICB9XG4gIHJldHVybiBwcm9ncmVzcztcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdWNjZXNzUGVyY2VudChfcmVmKSB7XG4gIGxldCB7XG4gICAgc3VjY2VzcyxcbiAgICBzdWNjZXNzUGVyY2VudFxuICB9ID0gX3JlZjtcbiAgbGV0IHBlcmNlbnQgPSBzdWNjZXNzUGVyY2VudDtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgcGVyY2VudGAgaW5zdGVhZCAqL1xuICBpZiAoc3VjY2VzcyAmJiAncHJvZ3Jlc3MnIGluIHN1Y2Nlc3MpIHtcbiAgICBwZXJjZW50ID0gc3VjY2Vzcy5wcm9ncmVzcztcbiAgfVxuICBpZiAoc3VjY2VzcyAmJiAncGVyY2VudCcgaW4gc3VjY2Vzcykge1xuICAgIHBlcmNlbnQgPSBzdWNjZXNzLnBlcmNlbnQ7XG4gIH1cbiAgcmV0dXJuIHBlcmNlbnQ7XG59XG5leHBvcnQgY29uc3QgZ2V0UGVyY2VudGFnZSA9IF9yZWYyID0+IHtcbiAgbGV0IHtcbiAgICBwZXJjZW50LFxuICAgIHN1Y2Nlc3MsXG4gICAgc3VjY2Vzc1BlcmNlbnRcbiAgfSA9IF9yZWYyO1xuICBjb25zdCByZWFsU3VjY2Vzc1BlcmNlbnQgPSB2YWxpZFByb2dyZXNzKGdldFN1Y2Nlc3NQZXJjZW50KHtcbiAgICBzdWNjZXNzLFxuICAgIHN1Y2Nlc3NQZXJjZW50XG4gIH0pKTtcbiAgcmV0dXJuIFtyZWFsU3VjY2Vzc1BlcmNlbnQsIHZhbGlkUHJvZ3Jlc3ModmFsaWRQcm9ncmVzcyhwZXJjZW50KSAtIHJlYWxTdWNjZXNzUGVyY2VudCldO1xufTtcbmV4cG9ydCBjb25zdCBnZXRTdHJva2VDb2xvciA9IF9yZWYzID0+IHtcbiAgbGV0IHtcbiAgICBzdWNjZXNzID0ge30sXG4gICAgc3Ryb2tlQ29sb3JcbiAgfSA9IF9yZWYzO1xuICBjb25zdCB7XG4gICAgc3Ryb2tlQ29sb3I6IHN1Y2Nlc3NDb2xvclxuICB9ID0gc3VjY2VzcztcbiAgcmV0dXJuIFtzdWNjZXNzQ29sb3IgfHwgcHJlc2V0UHJpbWFyeUNvbG9ycy5ncmVlbiwgc3Ryb2tlQ29sb3IgfHwgbnVsbF07XG59O1xuZXhwb3J0IGNvbnN0IGdldFNpemUgPSAoc2l6ZSwgdHlwZSwgZXh0cmEpID0+IHtcbiAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICBsZXQgd2lkdGggPSAtMTtcbiAgbGV0IGhlaWdodCA9IC0xO1xuICBpZiAodHlwZSA9PT0gJ3N0ZXAnKSB7XG4gICAgY29uc3Qgc3RlcHMgPSBleHRyYS5zdGVwcztcbiAgICBjb25zdCBzdHJva2VXaWR0aCA9IGV4dHJhLnN0cm9rZVdpZHRoO1xuICAgIGlmICh0eXBlb2Ygc2l6ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHNpemUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB3aWR0aCA9IHNpemUgPT09ICdzbWFsbCcgPyAyIDogMTQ7XG4gICAgICBoZWlnaHQgPSBzdHJva2VXaWR0aCAhPT0gbnVsbCAmJiBzdHJva2VXaWR0aCAhPT0gdm9pZCAwID8gc3Ryb2tlV2lkdGggOiA4O1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHNpemUgPT09ICdudW1iZXInKSB7XG4gICAgICBbd2lkdGgsIGhlaWdodF0gPSBbc2l6ZSwgc2l6ZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIFt3aWR0aCA9IDE0LCBoZWlnaHQgPSA4XSA9IEFycmF5LmlzQXJyYXkoc2l6ZSkgPyBzaXplIDogW3NpemUud2lkdGgsIHNpemUuaGVpZ2h0XTtcbiAgICB9XG4gICAgd2lkdGggKj0gc3RlcHM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2xpbmUnKSB7XG4gICAgY29uc3Qgc3Ryb2tlV2lkdGggPSBleHRyYSA9PT0gbnVsbCB8fCBleHRyYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXh0cmEuc3Ryb2tlV2lkdGg7XG4gICAgaWYgKHR5cGVvZiBzaXplID09PSAnc3RyaW5nJyB8fCB0eXBlb2Ygc2l6ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGhlaWdodCA9IHN0cm9rZVdpZHRoIHx8IChzaXplID09PSAnc21hbGwnID8gNiA6IDgpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHNpemUgPT09ICdudW1iZXInKSB7XG4gICAgICBbd2lkdGgsIGhlaWdodF0gPSBbc2l6ZSwgc2l6ZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIFt3aWR0aCA9IC0xLCBoZWlnaHQgPSA4XSA9IEFycmF5LmlzQXJyYXkoc2l6ZSkgPyBzaXplIDogW3NpemUud2lkdGgsIHNpemUuaGVpZ2h0XTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2NpcmNsZScgfHwgdHlwZSA9PT0gJ2Rhc2hib2FyZCcpIHtcbiAgICBpZiAodHlwZW9mIHNpemUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBzaXplID09PSAndW5kZWZpbmVkJykge1xuICAgICAgW3dpZHRoLCBoZWlnaHRdID0gc2l6ZSA9PT0gJ3NtYWxsJyA/IFs2MCwgNjBdIDogWzEyMCwgMTIwXTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBzaXplID09PSAnbnVtYmVyJykge1xuICAgICAgW3dpZHRoLCBoZWlnaHRdID0gW3NpemUsIHNpemVdO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShzaXplKSkge1xuICAgICAgd2lkdGggPSAoX2IgPSAoX2EgPSBzaXplWzBdKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBzaXplWzFdKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAxMjA7XG4gICAgICBoZWlnaHQgPSAoX2QgPSAoX2MgPSBzaXplWzBdKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBzaXplWzFdKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAxMjA7XG4gICAgfVxuICB9XG4gIHJldHVybiBbd2lkdGgsIGhlaWdodF07XG59OyIsICJcInVzZSBjbGllbnRcIjtcblxudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHByZXNldFByaW1hcnlDb2xvcnMgfSBmcm9tICdAYW50LWRlc2lnbi9jb2xvcnMnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyBkZXZVc2VXYXJuaW5nIH0gZnJvbSAnLi4vX3V0aWwvd2FybmluZyc7XG5pbXBvcnQgeyBMaW5lU3Ryb2tlQ29sb3JWYXIsIFBlcmNlbnQgfSBmcm9tICcuL3N0eWxlJztcbmltcG9ydCB7IGdldFNpemUsIGdldFN1Y2Nlc3NQZXJjZW50LCB2YWxpZFByb2dyZXNzIH0gZnJvbSAnLi91dGlscyc7XG4vKipcbiAqIEBleGFtcGxlXG4gKiAgIHtcbiAqICAgICBcIjAlXCI6IFwiI2FmYzE2M1wiLFxuICogICAgIFwiNzUlXCI6IFwiIzAwOTkwMFwiLFxuICogICAgIFwiNTAlXCI6IFwiZ3JlZW5cIiwgLy8gPT09PT4gJyNhZmMxNjMgMCUsICM2NkZGMDAgMjUlLCAjMDBDQzAwIDUwJSwgIzAwOTkwMCA3NSUsICNmZmZmZmYgMTAwJSdcbiAqICAgICBcIjI1JVwiOiBcIiM2NkZGMDBcIixcbiAqICAgICBcIjEwMCVcIjogXCIjZmZmZmZmXCJcbiAqICAgfVxuICovXG5leHBvcnQgY29uc3Qgc29ydEdyYWRpZW50ID0gZ3JhZGllbnRzID0+IHtcbiAgbGV0IHRlbXBBcnIgPSBbXTtcbiAgT2JqZWN0LmtleXMoZ3JhZGllbnRzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgY29uc3QgZm9ybWF0dGVkS2V5ID0gcGFyc2VGbG9hdChrZXkucmVwbGFjZSgvJS9nLCAnJykpO1xuICAgIGlmICghTnVtYmVyLmlzTmFOKGZvcm1hdHRlZEtleSkpIHtcbiAgICAgIHRlbXBBcnIucHVzaCh7XG4gICAgICAgIGtleTogZm9ybWF0dGVkS2V5LFxuICAgICAgICB2YWx1ZTogZ3JhZGllbnRzW2tleV1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIHRlbXBBcnIgPSB0ZW1wQXJyLnNvcnQoKGEsIGIpID0+IGEua2V5IC0gYi5rZXkpO1xuICByZXR1cm4gdGVtcEFyci5tYXAoX3JlZiA9PiB7XG4gICAgbGV0IHtcbiAgICAgIGtleSxcbiAgICAgIHZhbHVlXG4gICAgfSA9IF9yZWY7XG4gICAgcmV0dXJuIGAke3ZhbHVlfSAke2tleX0lYDtcbiAgfSkuam9pbignLCAnKTtcbn07XG4vKipcbiAqIFRoZW4gdGhpcyBtYW4gY2FtZSB0byByZWFsaXplIHRoZSB0cnV0aDogQmVzaWRlcyBzaXggcGVuY2UsIHRoZXJlIGlzIHRoZSBtb29uLiBCZXNpZGVzIGJyZWFkIGFuZFxuICogYnV0dGVyLCB0aGVyZSBpcyB0aGUgYnVnLiBBbmQuLi4gQmVzaWRlcyB3b21lbiwgdGhlcmUgaXMgdGhlIGNvZGUuXG4gKlxuICogQGV4YW1wbGVcbiAqICAge1xuICogICAgIFwiMCVcIjogXCIjYWZjMTYzXCIsXG4gKiAgICAgXCIyNSVcIjogXCIjNjZGRjAwXCIsXG4gKiAgICAgXCI1MCVcIjogXCIjMDBDQzAwXCIsIC8vID09PT0+ICBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsICNhZmMxNjMgMCUsICM2NkZGMDAgMjUlLFxuICogICAgIFwiNzUlXCI6IFwiIzAwOTkwMFwiLCAvLyAgICAgICAgIzAwQ0MwMCA1MCUsICMwMDk5MDAgNzUlLCAjZmZmZmZmIDEwMCUpXG4gKiAgICAgXCIxMDAlXCI6IFwiI2ZmZmZmZlwiXG4gKiAgIH1cbiAqL1xuZXhwb3J0IGNvbnN0IGhhbmRsZUdyYWRpZW50ID0gKHN0cm9rZUNvbG9yLCBkaXJlY3Rpb25Db25maWcpID0+IHtcbiAgY29uc3Qge1xuICAgICAgZnJvbSA9IHByZXNldFByaW1hcnlDb2xvcnMuYmx1ZSxcbiAgICAgIHRvID0gcHJlc2V0UHJpbWFyeUNvbG9ycy5ibHVlLFxuICAgICAgZGlyZWN0aW9uID0gZGlyZWN0aW9uQ29uZmlnID09PSAncnRsJyA/ICd0byBsZWZ0JyA6ICd0byByaWdodCdcbiAgICB9ID0gc3Ryb2tlQ29sb3IsXG4gICAgcmVzdCA9IF9fcmVzdChzdHJva2VDb2xvciwgW1wiZnJvbVwiLCBcInRvXCIsIFwiZGlyZWN0aW9uXCJdKTtcbiAgaWYgKE9iamVjdC5rZXlzKHJlc3QpLmxlbmd0aCAhPT0gMCkge1xuICAgIGNvbnN0IHNvcnRlZEdyYWRpZW50cyA9IHNvcnRHcmFkaWVudChyZXN0KTtcbiAgICBjb25zdCBiYWNrZ3JvdW5kID0gYGxpbmVhci1ncmFkaWVudCgke2RpcmVjdGlvbn0sICR7c29ydGVkR3JhZGllbnRzfSlgO1xuICAgIHJldHVybiB7XG4gICAgICBiYWNrZ3JvdW5kLFxuICAgICAgW0xpbmVTdHJva2VDb2xvclZhcl06IGJhY2tncm91bmRcbiAgICB9O1xuICB9XG4gIGNvbnN0IGJhY2tncm91bmQgPSBgbGluZWFyLWdyYWRpZW50KCR7ZGlyZWN0aW9ufSwgJHtmcm9tfSwgJHt0b30pYDtcbiAgcmV0dXJuIHtcbiAgICBiYWNrZ3JvdW5kLFxuICAgIFtMaW5lU3Ryb2tlQ29sb3JWYXJdOiBiYWNrZ3JvdW5kXG4gIH07XG59O1xuY29uc3QgTGluZSA9IHByb3BzID0+IHtcbiAgY29uc3Qge1xuICAgIHByZWZpeENscyxcbiAgICBkaXJlY3Rpb246IGRpcmVjdGlvbkNvbmZpZyxcbiAgICBwZXJjZW50LFxuICAgIHNpemUsXG4gICAgc3Ryb2tlV2lkdGgsXG4gICAgc3Ryb2tlQ29sb3IsXG4gICAgc3Ryb2tlTGluZWNhcCA9ICdyb3VuZCcsXG4gICAgY2hpbGRyZW4sXG4gICAgdHJhaWxDb2xvciA9IG51bGwsXG4gICAgcGVyY2VudFBvc2l0aW9uLFxuICAgIHN1Y2Nlc3NcbiAgfSA9IHByb3BzO1xuICBjb25zdCB7XG4gICAgYWxpZ246IGluZm9BbGlnbixcbiAgICB0eXBlOiBpbmZvUG9zaXRpb25cbiAgfSA9IHBlcmNlbnRQb3NpdGlvbjtcbiAgY29uc3QgYmFja2dyb3VuZFByb3BzID0gc3Ryb2tlQ29sb3IgJiYgdHlwZW9mIHN0cm9rZUNvbG9yICE9PSAnc3RyaW5nJyA/IGhhbmRsZUdyYWRpZW50KHN0cm9rZUNvbG9yLCBkaXJlY3Rpb25Db25maWcpIDoge1xuICAgIFtMaW5lU3Ryb2tlQ29sb3JWYXJdOiBzdHJva2VDb2xvcixcbiAgICBiYWNrZ3JvdW5kOiBzdHJva2VDb2xvclxuICB9O1xuICBjb25zdCBib3JkZXJSYWRpdXMgPSBzdHJva2VMaW5lY2FwID09PSAnc3F1YXJlJyB8fCBzdHJva2VMaW5lY2FwID09PSAnYnV0dCcgPyAwIDogdW5kZWZpbmVkO1xuICBjb25zdCBtZXJnZWRTaXplID0gc2l6ZSAhPT0gbnVsbCAmJiBzaXplICE9PSB2b2lkIDAgPyBzaXplIDogWy0xLCBzdHJva2VXaWR0aCB8fCAoc2l6ZSA9PT0gJ3NtYWxsJyA/IDYgOiA4KV07XG4gIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IGdldFNpemUobWVyZ2VkU2l6ZSwgJ2xpbmUnLCB7XG4gICAgc3Ryb2tlV2lkdGhcbiAgfSk7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgY29uc3Qgd2FybmluZyA9IGRldlVzZVdhcm5pbmcoJ1Byb2dyZXNzJyk7XG4gICAgd2FybmluZy5kZXByZWNhdGVkKCEoJ3N0cm9rZVdpZHRoJyBpbiBwcm9wcyksICdzdHJva2VXaWR0aCcsICdzaXplJyk7XG4gIH1cbiAgY29uc3QgdHJhaWxTdHlsZSA9IHtcbiAgICBiYWNrZ3JvdW5kQ29sb3I6IHRyYWlsQ29sb3IgfHwgdW5kZWZpbmVkLFxuICAgIGJvcmRlclJhZGl1c1xuICB9O1xuICBjb25zdCBwZXJjZW50U3R5bGUgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe1xuICAgIHdpZHRoOiBgJHt2YWxpZFByb2dyZXNzKHBlcmNlbnQpfSVgLFxuICAgIGhlaWdodCxcbiAgICBib3JkZXJSYWRpdXNcbiAgfSwgYmFja2dyb3VuZFByb3BzKSwge1xuICAgIFtQZXJjZW50XTogdmFsaWRQcm9ncmVzcyhwZXJjZW50KSAvIDEwMFxuICB9KTtcbiAgY29uc3Qgc3VjY2Vzc1BlcmNlbnQgPSBnZXRTdWNjZXNzUGVyY2VudChwcm9wcyk7XG4gIGNvbnN0IHN1Y2Nlc3NQZXJjZW50U3R5bGUgPSB7XG4gICAgd2lkdGg6IGAke3ZhbGlkUHJvZ3Jlc3Moc3VjY2Vzc1BlcmNlbnQpfSVgLFxuICAgIGhlaWdodCxcbiAgICBib3JkZXJSYWRpdXMsXG4gICAgYmFja2dyb3VuZENvbG9yOiBzdWNjZXNzID09PSBudWxsIHx8IHN1Y2Nlc3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN1Y2Nlc3Muc3Ryb2tlQ29sb3JcbiAgfTtcbiAgY29uc3Qgb3V0ZXJTdHlsZSA9IHtcbiAgICB3aWR0aDogd2lkdGggPCAwID8gJzEwMCUnIDogd2lkdGhcbiAgfTtcbiAgY29uc3QgbGluZUlubmVyID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogYCR7cHJlZml4Q2xzfS1pbm5lcmAsXG4gICAgc3R5bGU6IHRyYWlsU3R5bGVcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhgJHtwcmVmaXhDbHN9LWJnYCwgYCR7cHJlZml4Q2xzfS1iZy0ke2luZm9Qb3NpdGlvbn1gKSxcbiAgICBzdHlsZTogcGVyY2VudFN0eWxlXG4gIH0sIGluZm9Qb3NpdGlvbiA9PT0gJ2lubmVyJyAmJiBjaGlsZHJlbiksIHN1Y2Nlc3NQZXJjZW50ICE9PSB1bmRlZmluZWQgJiYgKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGAke3ByZWZpeENsc30tc3VjY2Vzcy1iZ2AsXG4gICAgc3R5bGU6IHN1Y2Nlc3NQZXJjZW50U3R5bGVcbiAgfSkpKTtcbiAgY29uc3QgaXNPdXRlclN0YXJ0ID0gaW5mb1Bvc2l0aW9uID09PSAnb3V0ZXInICYmIGluZm9BbGlnbiA9PT0gJ3N0YXJ0JztcbiAgY29uc3QgaXNPdXRlckVuZCA9IGluZm9Qb3NpdGlvbiA9PT0gJ291dGVyJyAmJiBpbmZvQWxpZ24gPT09ICdlbmQnO1xuICByZXR1cm4gaW5mb1Bvc2l0aW9uID09PSAnb3V0ZXInICYmIGluZm9BbGlnbiA9PT0gJ2NlbnRlcicgPyAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogYCR7cHJlZml4Q2xzfS1sYXlvdXQtYm90dG9tYFxuICB9LCBsaW5lSW5uZXIsIGNoaWxkcmVuKSkgOiAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogYCR7cHJlZml4Q2xzfS1vdXRlcmAsXG4gICAgc3R5bGU6IG91dGVyU3R5bGVcbiAgfSwgaXNPdXRlclN0YXJ0ICYmIGNoaWxkcmVuLCBsaW5lSW5uZXIsIGlzT3V0ZXJFbmQgJiYgY2hpbGRyZW4pKTtcbn07XG5leHBvcnQgZGVmYXVsdCBMaW5lOyIsICJpbXBvcnQgeyBLZXlmcmFtZXMsIHVuaXQgfSBmcm9tICdAYW50LWRlc2lnbi9jc3NpbmpzJztcbmltcG9ydCB7IHJlc2V0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc3R5bGUnO1xuaW1wb3J0IHsgZ2VuU3R5bGVIb29rcywgbWVyZ2VUb2tlbiB9IGZyb20gJy4uLy4uL3RoZW1lL2ludGVybmFsJztcbmV4cG9ydCBjb25zdCBMaW5lU3Ryb2tlQ29sb3JWYXIgPSAnLS1wcm9ncmVzcy1saW5lLXN0cm9rZS1jb2xvcic7XG5leHBvcnQgY29uc3QgUGVyY2VudCA9ICctLXByb2dyZXNzLXBlcmNlbnQnO1xuY29uc3QgZ2VuQW50UHJvZ3Jlc3NBY3RpdmUgPSBpc1J0bCA9PiB7XG4gIGNvbnN0IGRpcmVjdGlvbiA9IGlzUnRsID8gJzEwMCUnIDogJy0xMDAlJztcbiAgcmV0dXJuIG5ldyBLZXlmcmFtZXMoYGFudFByb2dyZXNzJHtpc1J0bCA/ICdSVEwnIDogJ0xUUid9QWN0aXZlYCwge1xuICAgICcwJSc6IHtcbiAgICAgIHRyYW5zZm9ybTogYHRyYW5zbGF0ZVgoJHtkaXJlY3Rpb259KSBzY2FsZVgoMClgLFxuICAgICAgb3BhY2l0eTogMC4xXG4gICAgfSxcbiAgICAnMjAlJzoge1xuICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlWCgke2RpcmVjdGlvbn0pIHNjYWxlWCgwKWAsXG4gICAgICBvcGFjaXR5OiAwLjVcbiAgICB9LFxuICAgIHRvOiB7XG4gICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDApIHNjYWxlWCgxKScsXG4gICAgICBvcGFjaXR5OiAwXG4gICAgfVxuICB9KTtcbn07XG5jb25zdCBnZW5CYXNlU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHM6IHByb2dyZXNzQ2xzLFxuICAgIGljb25DbHM6IGljb25QcmVmaXhDbHNcbiAgfSA9IHRva2VuO1xuICByZXR1cm4ge1xuICAgIFtwcm9ncmVzc0Nsc106IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVzZXRDb21wb25lbnQodG9rZW4pKSwge1xuICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICAnJi1ydGwnOiB7XG4gICAgICAgIGRpcmVjdGlvbjogJ3J0bCdcbiAgICAgIH0sXG4gICAgICAnJi1saW5lJzoge1xuICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgZm9udFNpemU6IHRva2VuLmZvbnRTaXplXG4gICAgICB9LFxuICAgICAgW2Ake3Byb2dyZXNzQ2xzfS1vdXRlcmBdOiB7XG4gICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtZmxleCcsXG4gICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICB3aWR0aDogJzEwMCUnXG4gICAgICB9LFxuICAgICAgW2Ake3Byb2dyZXNzQ2xzfS1pbm5lcmBdOiB7XG4gICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJyxcbiAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgZmxleDogMSxcbiAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgICB2ZXJ0aWNhbEFsaWduOiAnbWlkZGxlJyxcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0b2tlbi5yZW1haW5pbmdDb2xvcixcbiAgICAgICAgYm9yZGVyUmFkaXVzOiB0b2tlbi5saW5lQm9yZGVyUmFkaXVzXG4gICAgICB9LFxuICAgICAgW2Ake3Byb2dyZXNzQ2xzfS1pbm5lcjpub3QoJHtwcm9ncmVzc0Nsc30tY2lyY2xlLWdyYWRpZW50KWBdOiB7XG4gICAgICAgIFtgJHtwcm9ncmVzc0Nsc30tY2lyY2xlLXBhdGhgXToge1xuICAgICAgICAgIHN0cm9rZTogdG9rZW4uZGVmYXVsdENvbG9yXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbYCR7cHJvZ3Jlc3NDbHN9LXN1Y2Nlc3MtYmcsICR7cHJvZ3Jlc3NDbHN9LWJnYF06IHtcbiAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICAgIGJhY2tncm91bmQ6IHRva2VuLmRlZmF1bHRDb2xvcixcbiAgICAgICAgYm9yZGVyUmFkaXVzOiB0b2tlbi5saW5lQm9yZGVyUmFkaXVzLFxuICAgICAgICB0cmFuc2l0aW9uOiBgYWxsICR7dG9rZW4ubW90aW9uRHVyYXRpb25TbG93fSAke3Rva2VuLm1vdGlvbkVhc2VJbk91dENpcmN9YFxuICAgICAgfSxcbiAgICAgIFtgJHtwcm9ncmVzc0Nsc30tbGF5b3V0LWJvdHRvbWBdOiB7XG4gICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsXG4gICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsXG4gICAgICAgIFtgJHtwcm9ncmVzc0Nsc30tdGV4dGBdOiB7XG4gICAgICAgICAgd2lkdGg6ICdtYXgtY29udGVudCcsXG4gICAgICAgICAgbWFyZ2luSW5saW5lU3RhcnQ6IDAsXG4gICAgICAgICAgbWFyZ2luVG9wOiB0b2tlbi5tYXJnaW5YWFNcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtgJHtwcm9ncmVzc0Nsc30tYmdgXToge1xuICAgICAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgICAgICcmOjphZnRlcic6IHtcbiAgICAgICAgICBjb250ZW50OiAnXCJcIicsXG4gICAgICAgICAgYmFja2dyb3VuZDoge1xuICAgICAgICAgICAgX211bHRpX3ZhbHVlXzogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBbJ2luaGVyaXQnLCBgdmFyKCR7TGluZVN0cm9rZUNvbG9yVmFyfSlgXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgICAgd2lkdGg6IGBjYWxjKDEgLyB2YXIoJHtQZXJjZW50fSkgKiAxMDAlKWAsXG4gICAgICAgICAgZGlzcGxheTogJ2Jsb2NrJ1xuICAgICAgICB9LFxuICAgICAgICBbYCYke3Byb2dyZXNzQ2xzfS1iZy1pbm5lcmBdOiB7XG4gICAgICAgICAgbWluV2lkdGg6ICdtYXgtY29udGVudCcsXG4gICAgICAgICAgJyY6OmFmdGVyJzoge1xuICAgICAgICAgICAgY29udGVudDogJ25vbmUnXG4gICAgICAgICAgfSxcbiAgICAgICAgICBbYCR7cHJvZ3Jlc3NDbHN9LXRleHQtaW5uZXJgXToge1xuICAgICAgICAgICAgY29sb3I6IHRva2VuLmNvbG9yV2hpdGUsXG4gICAgICAgICAgICBbYCYke3Byb2dyZXNzQ2xzfS10ZXh0LWJyaWdodGBdOiB7XG4gICAgICAgICAgICAgIGNvbG9yOiAncmdiYSgwLCAwLCAwLCAwLjQ1KSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbYCR7cHJvZ3Jlc3NDbHN9LXN1Y2Nlc3MtYmdgXToge1xuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgaW5zZXRCbG9ja1N0YXJ0OiAwLFxuICAgICAgICBpbnNldElubGluZVN0YXJ0OiAwLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRva2VuLmNvbG9yU3VjY2Vzc1xuICAgICAgfSxcbiAgICAgIFtgJHtwcm9ncmVzc0Nsc30tdGV4dGBdOiB7XG4gICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgICBtYXJnaW5JbmxpbmVTdGFydDogdG9rZW4ubWFyZ2luWFMsXG4gICAgICAgIGNvbG9yOiB0b2tlbi5jb2xvclRleHQsXG4gICAgICAgIGxpbmVIZWlnaHQ6IDEsXG4gICAgICAgIHdpZHRoOiAnMmVtJyxcbiAgICAgICAgd2hpdGVTcGFjZTogJ25vd3JhcCcsXG4gICAgICAgIHRleHRBbGlnbjogJ3N0YXJ0JyxcbiAgICAgICAgdmVydGljYWxBbGlnbjogJ21pZGRsZScsXG4gICAgICAgIHdvcmRCcmVhazogJ25vcm1hbCcsXG4gICAgICAgIFtpY29uUHJlZml4Q2xzXToge1xuICAgICAgICAgIGZvbnRTaXplOiB0b2tlbi5mb250U2l6ZVxuICAgICAgICB9LFxuICAgICAgICBbYCYke3Byb2dyZXNzQ2xzfS10ZXh0LW91dGVyYF06IHtcbiAgICAgICAgICB3aWR0aDogJ21heC1jb250ZW50J1xuICAgICAgICB9LFxuICAgICAgICBbYCYke3Byb2dyZXNzQ2xzfS10ZXh0LW91dGVyJHtwcm9ncmVzc0Nsc30tdGV4dC1zdGFydGBdOiB7XG4gICAgICAgICAgd2lkdGg6ICdtYXgtY29udGVudCcsXG4gICAgICAgICAgbWFyZ2luSW5saW5lU3RhcnQ6IDAsXG4gICAgICAgICAgbWFyZ2luSW5saW5lRW5kOiB0b2tlbi5tYXJnaW5YU1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2Ake3Byb2dyZXNzQ2xzfS10ZXh0LWlubmVyYF06IHtcbiAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsXG4gICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAgbWFyZ2luSW5saW5lU3RhcnQ6IDAsXG4gICAgICAgIHBhZGRpbmc6IGAwICR7dW5pdCh0b2tlbi5wYWRkaW5nWFhTKX1gLFxuICAgICAgICBbYCYke3Byb2dyZXNzQ2xzfS10ZXh0LXN0YXJ0YF06IHtcbiAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJ3N0YXJ0J1xuICAgICAgICB9LFxuICAgICAgICBbYCYke3Byb2dyZXNzQ2xzfS10ZXh0LWVuZGBdOiB7XG4gICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdlbmQnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbYCYke3Byb2dyZXNzQ2xzfS1zdGF0dXMtYWN0aXZlYF06IHtcbiAgICAgICAgW2Ake3Byb2dyZXNzQ2xzfS1iZzo6YmVmb3JlYF06IHtcbiAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICBpbnNldDogMCxcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRva2VuLmNvbG9yQmdDb250YWluZXIsXG4gICAgICAgICAgYm9yZGVyUmFkaXVzOiB0b2tlbi5saW5lQm9yZGVyUmFkaXVzLFxuICAgICAgICAgIG9wYWNpdHk6IDAsXG4gICAgICAgICAgYW5pbWF0aW9uTmFtZTogZ2VuQW50UHJvZ3Jlc3NBY3RpdmUoKSxcbiAgICAgICAgICBhbmltYXRpb25EdXJhdGlvbjogdG9rZW4ucHJvZ3Jlc3NBY3RpdmVNb3Rpb25EdXJhdGlvbixcbiAgICAgICAgICBhbmltYXRpb25UaW1pbmdGdW5jdGlvbjogdG9rZW4ubW90aW9uRWFzZU91dFF1aW50LFxuICAgICAgICAgIGFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiAnaW5maW5pdGUnLFxuICAgICAgICAgIGNvbnRlbnQ6ICdcIlwiJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2AmJHtwcm9ncmVzc0Nsc30tcnRsJHtwcm9ncmVzc0Nsc30tc3RhdHVzLWFjdGl2ZWBdOiB7XG4gICAgICAgIFtgJHtwcm9ncmVzc0Nsc30tYmc6OmJlZm9yZWBdOiB7XG4gICAgICAgICAgYW5pbWF0aW9uTmFtZTogZ2VuQW50UHJvZ3Jlc3NBY3RpdmUodHJ1ZSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtgJiR7cHJvZ3Jlc3NDbHN9LXN0YXR1cy1leGNlcHRpb25gXToge1xuICAgICAgICBbYCR7cHJvZ3Jlc3NDbHN9LWJnYF06IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRva2VuLmNvbG9yRXJyb3JcbiAgICAgICAgfSxcbiAgICAgICAgW2Ake3Byb2dyZXNzQ2xzfS10ZXh0YF06IHtcbiAgICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JFcnJvclxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2AmJHtwcm9ncmVzc0Nsc30tc3RhdHVzLWV4Y2VwdGlvbiAke3Byb2dyZXNzQ2xzfS1pbm5lcjpub3QoJHtwcm9ncmVzc0Nsc30tY2lyY2xlLWdyYWRpZW50KWBdOiB7XG4gICAgICAgIFtgJHtwcm9ncmVzc0Nsc30tY2lyY2xlLXBhdGhgXToge1xuICAgICAgICAgIHN0cm9rZTogdG9rZW4uY29sb3JFcnJvclxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2AmJHtwcm9ncmVzc0Nsc30tc3RhdHVzLXN1Y2Nlc3NgXToge1xuICAgICAgICBbYCR7cHJvZ3Jlc3NDbHN9LWJnYF06IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRva2VuLmNvbG9yU3VjY2Vzc1xuICAgICAgICB9LFxuICAgICAgICBbYCR7cHJvZ3Jlc3NDbHN9LXRleHRgXToge1xuICAgICAgICAgIGNvbG9yOiB0b2tlbi5jb2xvclN1Y2Nlc3NcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtgJiR7cHJvZ3Jlc3NDbHN9LXN0YXR1cy1zdWNjZXNzICR7cHJvZ3Jlc3NDbHN9LWlubmVyOm5vdCgke3Byb2dyZXNzQ2xzfS1jaXJjbGUtZ3JhZGllbnQpYF06IHtcbiAgICAgICAgW2Ake3Byb2dyZXNzQ2xzfS1jaXJjbGUtcGF0aGBdOiB7XG4gICAgICAgICAgc3Ryb2tlOiB0b2tlbi5jb2xvclN1Y2Nlc3NcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH07XG59O1xuY29uc3QgZ2VuQ2lyY2xlU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHM6IHByb2dyZXNzQ2xzLFxuICAgIGljb25DbHM6IGljb25QcmVmaXhDbHNcbiAgfSA9IHRva2VuO1xuICByZXR1cm4ge1xuICAgIFtwcm9ncmVzc0Nsc106IHtcbiAgICAgIFtgJHtwcm9ncmVzc0Nsc30tY2lyY2xlLXRyYWlsYF06IHtcbiAgICAgICAgc3Ryb2tlOiB0b2tlbi5yZW1haW5pbmdDb2xvclxuICAgICAgfSxcbiAgICAgIFtgJiR7cHJvZ3Jlc3NDbHN9LWNpcmNsZSAke3Byb2dyZXNzQ2xzfS1pbm5lcmBdOiB7XG4gICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgICBsaW5lSGVpZ2h0OiAxLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd0cmFuc3BhcmVudCdcbiAgICAgIH0sXG4gICAgICBbYCYke3Byb2dyZXNzQ2xzfS1jaXJjbGUgJHtwcm9ncmVzc0Nsc30tdGV4dGBdOiB7XG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICBpbnNldEJsb2NrU3RhcnQ6ICc1MCUnLFxuICAgICAgICBpbnNldElubGluZVN0YXJ0OiAwLFxuICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICBtYXJnaW46IDAsXG4gICAgICAgIHBhZGRpbmc6IDAsXG4gICAgICAgIGNvbG9yOiB0b2tlbi5jaXJjbGVUZXh0Q29sb3IsXG4gICAgICAgIGZvbnRTaXplOiB0b2tlbi5jaXJjbGVUZXh0Rm9udFNpemUsXG4gICAgICAgIGxpbmVIZWlnaHQ6IDEsXG4gICAgICAgIHdoaXRlU3BhY2U6ICdub3JtYWwnLFxuICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKC01MCUpJyxcbiAgICAgICAgW2ljb25QcmVmaXhDbHNdOiB7XG4gICAgICAgICAgZm9udFNpemU6IHRva2VuLmNpcmNsZUljb25Gb250U2l6ZVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2Ake3Byb2dyZXNzQ2xzfS1jaXJjbGUmLXN0YXR1cy1leGNlcHRpb25gXToge1xuICAgICAgICBbYCR7cHJvZ3Jlc3NDbHN9LXRleHRgXToge1xuICAgICAgICAgIGNvbG9yOiB0b2tlbi5jb2xvckVycm9yXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbYCR7cHJvZ3Jlc3NDbHN9LWNpcmNsZSYtc3RhdHVzLXN1Y2Nlc3NgXToge1xuICAgICAgICBbYCR7cHJvZ3Jlc3NDbHN9LXRleHRgXToge1xuICAgICAgICAgIGNvbG9yOiB0b2tlbi5jb2xvclN1Y2Nlc3NcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW2Ake3Byb2dyZXNzQ2xzfS1pbmxpbmUtY2lyY2xlYF06IHtcbiAgICAgIGxpbmVIZWlnaHQ6IDEsXG4gICAgICBbYCR7cHJvZ3Jlc3NDbHN9LWlubmVyYF06IHtcbiAgICAgICAgdmVydGljYWxBbGlnbjogJ2JvdHRvbSdcbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xuY29uc3QgZ2VuU3RlcFN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzOiBwcm9ncmVzc0Nsc1xuICB9ID0gdG9rZW47XG4gIHJldHVybiB7XG4gICAgW3Byb2dyZXNzQ2xzXToge1xuICAgICAgW2Ake3Byb2dyZXNzQ2xzfS1zdGVwc2BdOiB7XG4gICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgICAnJi1vdXRlcic6IHtcbiAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgZmxleERpcmVjdGlvbjogJ3JvdycsXG4gICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcidcbiAgICAgICAgfSxcbiAgICAgICAgJyYtaXRlbSc6IHtcbiAgICAgICAgICBmbGV4U2hyaW5rOiAwLFxuICAgICAgICAgIG1pbldpZHRoOiB0b2tlbi5wcm9ncmVzc1N0ZXBNaW5XaWR0aCxcbiAgICAgICAgICBtYXJnaW5JbmxpbmVFbmQ6IHRva2VuLnByb2dyZXNzU3RlcE1hcmdpbklubGluZUVuZCxcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRva2VuLnJlbWFpbmluZ0NvbG9yLFxuICAgICAgICAgIHRyYW5zaXRpb246IGBhbGwgJHt0b2tlbi5tb3Rpb25EdXJhdGlvblNsb3d9YCxcbiAgICAgICAgICAnJi1hY3RpdmUnOiB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRva2VuLmRlZmF1bHRDb2xvclxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG5jb25zdCBnZW5TbWFsbExpbmUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHM6IHByb2dyZXNzQ2xzLFxuICAgIGljb25DbHM6IGljb25QcmVmaXhDbHNcbiAgfSA9IHRva2VuO1xuICByZXR1cm4ge1xuICAgIFtwcm9ncmVzc0Nsc106IHtcbiAgICAgIFtgJHtwcm9ncmVzc0Nsc30tc21hbGwmLWxpbmUsICR7cHJvZ3Jlc3NDbHN9LXNtYWxsJi1saW5lICR7cHJvZ3Jlc3NDbHN9LXRleHQgJHtpY29uUHJlZml4Q2xzfWBdOiB7XG4gICAgICAgIGZvbnRTaXplOiB0b2tlbi5mb250U2l6ZVNNXG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbmV4cG9ydCBjb25zdCBwcmVwYXJlQ29tcG9uZW50VG9rZW4gPSB0b2tlbiA9PiAoe1xuICBjaXJjbGVUZXh0Q29sb3I6IHRva2VuLmNvbG9yVGV4dCxcbiAgZGVmYXVsdENvbG9yOiB0b2tlbi5jb2xvckluZm8sXG4gIHJlbWFpbmluZ0NvbG9yOiB0b2tlbi5jb2xvckZpbGxTZWNvbmRhcnksXG4gIGxpbmVCb3JkZXJSYWRpdXM6IDEwMCxcbiAgLy8gbWFnaWMgZm9yIGNhcHN1bGUgc2hhcGUsIHNob3VsZCBiZSBhIHZlcnkgbGFyZ2UgbnVtYmVyXG4gIGNpcmNsZVRleHRGb250U2l6ZTogJzFlbScsXG4gIGNpcmNsZUljb25Gb250U2l6ZTogYCR7dG9rZW4uZm9udFNpemUgLyB0b2tlbi5mb250U2l6ZVNNfWVtYFxufSk7XG5leHBvcnQgZGVmYXVsdCBnZW5TdHlsZUhvb2tzKCdQcm9ncmVzcycsIHRva2VuID0+IHtcbiAgY29uc3QgcHJvZ3Jlc3NTdGVwTWFyZ2luSW5saW5lRW5kID0gdG9rZW4uY2FsYyh0b2tlbi5tYXJnaW5YWFMpLmRpdigyKS5lcXVhbCgpO1xuICBjb25zdCBwcm9ncmVzc1Rva2VuID0gbWVyZ2VUb2tlbih0b2tlbiwge1xuICAgIHByb2dyZXNzU3RlcE1hcmdpbklubGluZUVuZCxcbiAgICBwcm9ncmVzc1N0ZXBNaW5XaWR0aDogcHJvZ3Jlc3NTdGVwTWFyZ2luSW5saW5lRW5kLFxuICAgIHByb2dyZXNzQWN0aXZlTW90aW9uRHVyYXRpb246ICcyLjRzJ1xuICB9KTtcbiAgcmV0dXJuIFtnZW5CYXNlU3R5bGUocHJvZ3Jlc3NUb2tlbiksIGdlbkNpcmNsZVN0eWxlKHByb2dyZXNzVG9rZW4pLCBnZW5TdGVwU3R5bGUocHJvZ3Jlc3NUb2tlbiksIGdlblNtYWxsTGluZShwcm9ncmVzc1Rva2VuKV07XG59LCBwcmVwYXJlQ29tcG9uZW50VG9rZW4pOyIsICJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyBnZXRTaXplIH0gZnJvbSAnLi91dGlscyc7XG5jb25zdCBTdGVwcyA9IHByb3BzID0+IHtcbiAgY29uc3Qge1xuICAgIHNpemUsXG4gICAgc3RlcHMsXG4gICAgcm91bmRpbmc6IGN1c3RvbVJvdW5kaW5nID0gTWF0aC5yb3VuZCxcbiAgICBwZXJjZW50ID0gMCxcbiAgICBzdHJva2VXaWR0aCA9IDgsXG4gICAgc3Ryb2tlQ29sb3IsXG4gICAgdHJhaWxDb2xvciA9IG51bGwsXG4gICAgcHJlZml4Q2xzLFxuICAgIGNoaWxkcmVuXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgY3VycmVudCA9IGN1c3RvbVJvdW5kaW5nKHN0ZXBzICogKHBlcmNlbnQgLyAxMDApKTtcbiAgY29uc3Qgc3RlcFdpZHRoID0gc2l6ZSA9PT0gJ3NtYWxsJyA/IDIgOiAxNDtcbiAgY29uc3QgbWVyZ2VkU2l6ZSA9IHNpemUgIT09IG51bGwgJiYgc2l6ZSAhPT0gdm9pZCAwID8gc2l6ZSA6IFtzdGVwV2lkdGgsIHN0cm9rZVdpZHRoXTtcbiAgY29uc3QgW3dpZHRoLCBoZWlnaHRdID0gZ2V0U2l6ZShtZXJnZWRTaXplLCAnc3RlcCcsIHtcbiAgICBzdGVwcyxcbiAgICBzdHJva2VXaWR0aFxuICB9KTtcbiAgY29uc3QgdW5pdFdpZHRoID0gd2lkdGggLyBzdGVwcztcbiAgY29uc3Qgc3R5bGVkU3RlcHMgPSBBcnJheS5mcm9tKHtcbiAgICBsZW5ndGg6IHN0ZXBzXG4gIH0pO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ZXBzOyBpKyspIHtcbiAgICBjb25zdCBjb2xvciA9IEFycmF5LmlzQXJyYXkoc3Ryb2tlQ29sb3IpID8gc3Ryb2tlQ29sb3JbaV0gOiBzdHJva2VDb2xvcjtcbiAgICBzdHlsZWRTdGVwc1tpXSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGtleTogaSxcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhgJHtwcmVmaXhDbHN9LXN0ZXBzLWl0ZW1gLCB7XG4gICAgICAgIFtgJHtwcmVmaXhDbHN9LXN0ZXBzLWl0ZW0tYWN0aXZlYF06IGkgPD0gY3VycmVudCAtIDFcbiAgICAgIH0pLFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBpIDw9IGN1cnJlbnQgLSAxID8gY29sb3IgOiB0cmFpbENvbG9yLFxuICAgICAgICB3aWR0aDogdW5pdFdpZHRoLFxuICAgICAgICBoZWlnaHRcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogYCR7cHJlZml4Q2xzfS1zdGVwcy1vdXRlcmBcbiAgfSwgc3R5bGVkU3RlcHMsIGNoaWxkcmVuKTtcbn07XG5leHBvcnQgZGVmYXVsdCBTdGVwczsiLCAiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCBQcm9ncmVzcyBmcm9tICcuL3Byb2dyZXNzJztcbmV4cG9ydCBkZWZhdWx0IFByb2dyZXNzOyIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBEZWxldGVPdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9EZWxldGVPdXRsaW5lZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gXCIuLi9jb21wb25lbnRzL0FudGRJY29uXCI7XG52YXIgRGVsZXRlT3V0bGluZWQgPSBmdW5jdGlvbiBEZWxldGVPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbnRkSWNvbiwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogRGVsZXRlT3V0bGluZWRTdmdcbiAgfSkpO1xufTtcblxuLyoqIVtkZWxldGVdKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjNhV1IwYUQwaU5UQWlJR2hsYVdkb2REMGlOVEFpSUdacGJHdzlJaU5qWVdOaFkyRWlJSFpwWlhkQ2IzZzlJalkwSURZMElEZzVOaUE0T1RZaUlHWnZZM1Z6WVdKc1pUMGlabUZzYzJVaUlIaHRiRzV6UFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eU1EQXdMM04yWnlJK1BIQmhkR2dnWkQwaVRUTTJNQ0F4T0RSb0xUaGpOQzQwSURBZ09DMHpMallnT0MwNGRqaG9NekEwZGkwNFl6QWdOQzQwSURNdU5pQTRJRGdnT0dndE9IWTNNbWczTW5ZdE9EQmpNQzB6TlM0ekxUSTRMamN0TmpRdE5qUXROalJJTXpVeVl5MHpOUzR6SURBdE5qUWdNamd1TnkwMk5DQTJOSFk0TUdnM01uWXROeko2YlRVd05DQTNNa2d4TmpCakxURTNMamNnTUMwek1pQXhOQzR6TFRNeUlETXlkak15WXpBZ05DNDBJRE11TmlBNElEZ2dPR2cyTUM0MGJESTBMamNnTlRJell6RXVOaUF6TkM0eElESTVMamdnTmpFZ05qTXVPU0EyTVdnME5UUmpNelF1TWlBd0lEWXlMak10TWpZdU9DQTJNeTQ1TFRZeGJESTBMamN0TlRJelNEZzRPR00wTGpRZ01DQTRMVE11TmlBNExUaDJMVE15WXpBdE1UY3VOeTB4TkM0ekxUTXlMVE15TFRNeWVrMDNNekV1TXlBNE5EQklNamt5TGpkc0xUSTBMakl0TlRFeWFEUTROMnd0TWpRdU1pQTFNVEo2SWlBdlBqd3ZjM1puUGc9PSkgKi9cbnZhciBSZWZJY29uID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoRGVsZXRlT3V0bGluZWQpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgUmVmSWNvbi5kaXNwbGF5TmFtZSA9ICdEZWxldGVPdXRsaW5lZCc7XG59XG5leHBvcnQgZGVmYXVsdCBSZWZJY29uOyIsICIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBEZWxldGVPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNMzYwIDE4NGgtOGM0LjQgMCA4LTMuNiA4LTh2OGgzMDR2LThjMCA0LjQgMy42IDggOCA4aC04djcyaDcydi04MGMwLTM1LjMtMjguNy02NC02NC02NEgzNTJjLTM1LjMgMC02NCAyOC43LTY0IDY0djgwaDcydi03MnptNTA0IDcySDE2MGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJ2MzJjMCA0LjQgMy42IDggOCA4aDYwLjRsMjQuNyA1MjNjMS42IDM0LjEgMjkuOCA2MSA2My45IDYxaDQ1NGMzNC4yIDAgNjIuMy0yNi44IDYzLjktNjFsMjQuNy01MjNIODg4YzQuNCAwIDgtMy42IDgtOHYtMzJjMC0xNy43LTE0LjMtMzItMzItMzJ6TTczMS4zIDg0MEgyOTIuN2wtMjQuMi01MTJoNDg3bC0yNC4yIDUxMnpcIiB9IH1dIH0sIFwibmFtZVwiOiBcImRlbGV0ZVwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgRGVsZXRlT3V0bGluZWQ7XG4iLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRG93bmxvYWRPdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9Eb3dubG9hZE91dGxpbmVkXCI7XG5pbXBvcnQgQW50ZEljb24gZnJvbSBcIi4uL2NvbXBvbmVudHMvQW50ZEljb25cIjtcbnZhciBEb3dubG9hZE91dGxpbmVkID0gZnVuY3Rpb24gRG93bmxvYWRPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbnRkSWNvbiwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogRG93bmxvYWRPdXRsaW5lZFN2Z1xuICB9KSk7XG59O1xuXG4vKiohW2Rvd25sb2FkXShkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUIzYVdSMGFEMGlOVEFpSUdobGFXZG9kRDBpTlRBaUlHWnBiR3c5SWlOallXTmhZMkVpSUhacFpYZENiM2c5SWpZMElEWTBJRGc1TmlBNE9UWWlJR1p2WTNWellXSnNaVDBpWm1Gc2MyVWlJSGh0Ykc1elBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5SStQSEJoZEdnZ1pEMGlUVFV3TlM0M0lEWTJNV0U0SURnZ01DQXdNREV5TGpZZ01Hd3hNVEl0TVRReExqZGpOQzR4TFRVdU1pNDBMVEV5TGprdE5pNHpMVEV5TGpsb0xUYzBMakZXTVRZNFl6QXROQzQwTFRNdU5pMDRMVGd0T0dndE5qQmpMVFF1TkNBd0xUZ2dNeTQyTFRnZ09IWXpNemd1TTBnME1EQmpMVFl1TnlBd0xURXdMalFnTnk0M0xUWXVNeUF4TWk0NWJERXhNaUF4TkRFdU9IcE5PRGM0SURZeU5tZ3ROakJqTFRRdU5DQXdMVGdnTXk0MkxUZ2dPSFl4TlRSSU1qRTBWall6TkdNd0xUUXVOQzB6TGpZdE9DMDRMVGhvTFRZd1l5MDBMalFnTUMwNElETXVOaTA0SURoMk1UazRZekFnTVRjdU55QXhOQzR6SURNeUlETXlJRE15YURZNE5HTXhOeTQzSURBZ016SXRNVFF1TXlBek1pMHpNbFkyTXpSak1DMDBMalF0TXk0MkxUZ3RPQzA0ZWlJZ0x6NDhMM04yWno0PSkgKi9cbnZhciBSZWZJY29uID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoRG93bmxvYWRPdXRsaW5lZCk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBSZWZJY29uLmRpc3BsYXlOYW1lID0gJ0Rvd25sb2FkT3V0bGluZWQnO1xufVxuZXhwb3J0IGRlZmF1bHQgUmVmSWNvbjsiLCAiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgRG93bmxvYWRPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNTA1LjcgNjYxYTggOCAwIDAwMTIuNiAwbDExMi0xNDEuN2M0LjEtNS4yLjQtMTIuOS02LjMtMTIuOWgtNzQuMVYxNjhjMC00LjQtMy42LTgtOC04aC02MGMtNC40IDAtOCAzLjYtOCA4djMzOC4zSDQwMGMtNi43IDAtMTAuNCA3LjctNi4zIDEyLjlsMTEyIDE0MS44ek04NzggNjI2aC02MGMtNC40IDAtOCAzLjYtOCA4djE1NEgyMTRWNjM0YzAtNC40LTMuNi04LTgtOGgtNjBjLTQuNCAwLTggMy42LTggOHYxOThjMCAxNy43IDE0LjMgMzIgMzIgMzJoNjg0YzE3LjcgMCAzMi0xNC4zIDMyLTMyVjYzNGMwLTQuNC0zLjYtOC04LTh6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJkb3dubG9hZFwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgRG93bmxvYWRPdXRsaW5lZDtcbiIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBGaWxlVHdvVG9uZVN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9GaWxlVHdvVG9uZVwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gXCIuLi9jb21wb25lbnRzL0FudGRJY29uXCI7XG52YXIgRmlsZVR3b1RvbmUgPSBmdW5jdGlvbiBGaWxlVHdvVG9uZShwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbnRkSWNvbiwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogRmlsZVR3b1RvbmVTdmdcbiAgfSkpO1xufTtcblxuLyoqIVtmaWxlXShkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUIzYVdSMGFEMGlOVEFpSUdobGFXZG9kRDBpTlRBaUlHWnBiR3c5SWlOallXTmhZMkVpSUhacFpYZENiM2c5SWpZMElEWTBJRGc1TmlBNE9UWWlJR1p2WTNWellXSnNaVDBpWm1Gc2MyVWlJSGh0Ykc1elBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5SStQSEJoZEdnZ1pEMGlUVFV6TkNBek5USldNVE0yU0RJek1uWTNOVEpvTlRZd1ZqTTVORWcxTnpaaE5ESWdORElnTUNBd01TMDBNaTAwTW5vaUlHWnBiR3c5SWlObE5tWTBabVlpSUM4K1BIQmhkR2dnWkQwaVRUZzFOQzQySURJNE9DNDJURFl6T1M0MElEY3pMalJqTFRZdE5pMHhOQzR4TFRrdU5DMHlNaTQyTFRrdU5FZ3hPVEpqTFRFM0xqY2dNQzB6TWlBeE5DNHpMVE15SURNeWRqZ3pNbU13SURFM0xqY2dNVFF1TXlBek1pQXpNaUF6TW1nMk5EQmpNVGN1TnlBd0lETXlMVEUwTGpNZ016SXRNekpXTXpFeExqTmpNQzA0TGpVdE15NDBMVEUyTGpjdE9TNDBMVEl5TGpkNlRUWXdNaUF4TXpjdU9FdzNPVEF1TWlBek1qWklOakF5VmpFek55NDRlazAzT1RJZ09EZzRTREl6TWxZeE16Wm9NekF5ZGpJeE5tRTBNaUEwTWlBd0lEQXdORElnTkRKb01qRTJkalE1TkhvaUlHWnBiR3c5SWlNeE5qYzNabVlpSUM4K1BDOXpkbWMrKSAqL1xudmFyIFJlZkljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihGaWxlVHdvVG9uZSk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBSZWZJY29uLmRpc3BsYXlOYW1lID0gJ0ZpbGVUd29Ub25lJztcbn1cbmV4cG9ydCBkZWZhdWx0IFJlZkljb247IiwgIi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxudmFyIEZpbGVUd29Ub25lID0geyBcImljb25cIjogZnVuY3Rpb24gcmVuZGVyKHByaW1hcnlDb2xvciwgc2Vjb25kYXJ5Q29sb3IpIHsgcmV0dXJuIHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNTM0IDM1MlYxMzZIMjMydjc1Mmg1NjBWMzk0SDU3NmE0MiA0MiAwIDAxLTQyLTQyelwiLCBcImZpbGxcIjogc2Vjb25kYXJ5Q29sb3IgfSB9LCB7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTg1NC42IDI4OC42TDYzOS40IDczLjRjLTYtNi0xNC4xLTkuNC0yMi42LTkuNEgxOTJjLTE3LjcgMC0zMiAxNC4zLTMyIDMydjgzMmMwIDE3LjcgMTQuMyAzMiAzMiAzMmg2NDBjMTcuNyAwIDMyLTE0LjMgMzItMzJWMzExLjNjMC04LjUtMy40LTE2LjctOS40LTIyLjd6TTYwMiAxMzcuOEw3OTAuMiAzMjZINjAyVjEzNy44ek03OTIgODg4SDIzMlYxMzZoMzAydjIxNmE0MiA0MiAwIDAwNDIgNDJoMjE2djQ5NHpcIiwgXCJmaWxsXCI6IHByaW1hcnlDb2xvciB9IH1dIH07IH0sIFwibmFtZVwiOiBcImZpbGVcIiwgXCJ0aGVtZVwiOiBcInR3b3RvbmVcIiB9O1xuZXhwb3J0IGRlZmF1bHQgRmlsZVR3b1RvbmU7XG4iLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUGFwZXJDbGlwT3V0bGluZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vUGFwZXJDbGlwT3V0bGluZWRcIjtcbmltcG9ydCBBbnRkSWNvbiBmcm9tIFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiO1xudmFyIFBhcGVyQ2xpcE91dGxpbmVkID0gZnVuY3Rpb24gUGFwZXJDbGlwT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IFBhcGVyQ2xpcE91dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5cbi8qKiFbcGFwZXItY2xpcF0oZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTlRBaUlHaGxhV2RvZEQwaU5UQWlJR1pwYkd3OUlpTmpZV05oWTJFaUlIWnBaWGRDYjNnOUlqWTBJRFkwSURnNU5pQTRPVFlpSUdadlkzVnpZV0pzWlQwaVptRnNjMlVpSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUkrUEhCaGRHZ2daRDBpVFRjM09TNHpJREU1Tmk0Mll5MDVOQzR5TFRrMExqSXRNalEzTGpZdE9UUXVNaTB6TkRFdU55QXdiQzB5TmpFZ01qWXdMamhqTFRFdU55QXhMamN0TWk0MklEUXRNaTQySURZdU5ITXVPU0EwTGpjZ01pNDJJRFl1Tkd3ek5pNDVJRE0yTGpsaE9TQTVJREFnTURBeE1pNDNJREJzTWpZeExUSTJNQzQ0WXpNeUxqUXRNekl1TkNBM05TNDFMVFV3TGpJZ01USXhMak10TlRBdU1uTTRPQzQ1SURFM0xqZ2dNVEl4TGpJZ05UQXVNbU16TWk0MElETXlMalFnTlRBdU1pQTNOUzQxSURVd0xqSWdNVEl4TGpJZ01DQTBOUzQ0TFRFM0xqZ2dPRGd1T0MwMU1DNHlJREV5TVM0eWJDMHlOallnTWpZMUxqa3RORE11TVNBME15NHhZeTAwTUM0eklEUXdMak10TVRBMUxqZ2dOREF1TXkweE5EWXVNU0F3TFRFNUxqVXRNVGt1TlMwek1DNHlMVFExTGpRdE16QXVNaTAzTTNNeE1DNDNMVFV6TGpVZ016QXVNaTAzTTJ3eU5qTXVPUzB5TmpNdU9HTTJMamN0Tmk0MklERTFMalV0TVRBdU15QXlOQzQ1TFRFd0xqTm9MakZqT1M0MElEQWdNVGd1TVNBekxqY2dNalF1TnlBeE1DNHpJRFl1TnlBMkxqY2dNVEF1TXlBeE5TNDFJREV3TGpNZ01qUXVPU0F3SURrdU15MHpMamNnTVRndU1TMHhNQzR6SURJMExqZE1NemN5TGpRZ05qVXpZeTB4TGpjZ01TNDNMVEl1TmlBMExUSXVOaUEyTGpSekxqa2dOQzQzSURJdU5pQTJMalJzTXpZdU9TQXpOaTQ1WVRrZ09TQXdJREF3TVRJdU55QXdiREl4TlM0MkxUSXhOUzQyWXpFNUxqa3RNVGt1T1NBek1DNDRMVFEyTGpNZ016QXVPQzAzTkM0MGN5MHhNUzAxTkM0MkxUTXdMamd0TnpRdU5HTXROREV1TVMwME1TNHhMVEV3Tnk0NUxUUXhMVEUwT1NBd1REUTJNeUF6TmpRZ01qSTBMamdnTmpBeUxqRkJNVGN5TGpJeUlERTNNaTR5TWlBd0lEQXdNVGMwSURjeU5DNDRZekFnTkRZdU15QXhPQzR4SURnNUxqZ2dOVEF1T0NBeE1qSXVOU0F6TXk0NUlETXpMamdnTnpndU15QTFNQzQzSURFeU1pNDNJRFV3TGpjZ05EUXVOQ0F3SURnNExqZ3RNVFl1T1NBeE1qSXVOaTAxTUM0M2JETXdPUzR5TFRNd09VTTRNalF1T0NBME9USXVOeUE0TlRBZ05ETXlJRGcxTUNBek5qY3VOV011TVMwMk5DNDJMVEkxTGpFdE1USTFMak10TnpBdU55MHhOekF1T1hvaUlDOCtQQzl6ZG1jKykgKi9cbnZhciBSZWZJY29uID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoUGFwZXJDbGlwT3V0bGluZWQpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgUmVmSWNvbi5kaXNwbGF5TmFtZSA9ICdQYXBlckNsaXBPdXRsaW5lZCc7XG59XG5leHBvcnQgZGVmYXVsdCBSZWZJY29uOyIsICIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBQYXBlckNsaXBPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNzc5LjMgMTk2LjZjLTk0LjItOTQuMi0yNDcuNi05NC4yLTM0MS43IDBsLTI2MSAyNjAuOGMtMS43IDEuNy0yLjYgNC0yLjYgNi40cy45IDQuNyAyLjYgNi40bDM2LjkgMzYuOWE5IDkgMCAwMDEyLjcgMGwyNjEtMjYwLjhjMzIuNC0zMi40IDc1LjUtNTAuMiAxMjEuMy01MC4yczg4LjkgMTcuOCAxMjEuMiA1MC4yYzMyLjQgMzIuNCA1MC4yIDc1LjUgNTAuMiAxMjEuMiAwIDQ1LjgtMTcuOCA4OC44LTUwLjIgMTIxLjJsLTI2NiAyNjUuOS00My4xIDQzLjFjLTQwLjMgNDAuMy0xMDUuOCA0MC4zLTE0Ni4xIDAtMTkuNS0xOS41LTMwLjItNDUuNC0zMC4yLTczczEwLjctNTMuNSAzMC4yLTczbDI2My45LTI2My44YzYuNy02LjYgMTUuNS0xMC4zIDI0LjktMTAuM2guMWM5LjQgMCAxOC4xIDMuNyAyNC43IDEwLjMgNi43IDYuNyAxMC4zIDE1LjUgMTAuMyAyNC45IDAgOS4zLTMuNyAxOC4xLTEwLjMgMjQuN0wzNzIuNCA2NTNjLTEuNyAxLjctMi42IDQtMi42IDYuNHMuOSA0LjcgMi42IDYuNGwzNi45IDM2LjlhOSA5IDAgMDAxMi43IDBsMjE1LjYtMjE1LjZjMTkuOS0xOS45IDMwLjgtNDYuMyAzMC44LTc0LjRzLTExLTU0LjYtMzAuOC03NC40Yy00MS4xLTQxLjEtMTA3LjktNDEtMTQ5IDBMNDYzIDM2NCAyMjQuOCA2MDIuMUExNzIuMjIgMTcyLjIyIDAgMDAxNzQgNzI0LjhjMCA0Ni4zIDE4LjEgODkuOCA1MC44IDEyMi41IDMzLjkgMzMuOCA3OC4zIDUwLjcgMTIyLjcgNTAuNyA0NC40IDAgODguOC0xNi45IDEyMi42LTUwLjdsMzA5LjItMzA5QzgyNC44IDQ5Mi43IDg1MCA0MzIgODUwIDM2Ny41Yy4xLTY0LjYtMjUuMS0xMjUuMy03MC43LTE3MC45elwiIH0gfV0gfSwgXCJuYW1lXCI6IFwicGFwZXItY2xpcFwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgUGFwZXJDbGlwT3V0bGluZWQ7XG4iLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUGljdHVyZVR3b1RvbmVTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vUGljdHVyZVR3b1RvbmVcIjtcbmltcG9ydCBBbnRkSWNvbiBmcm9tIFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiO1xudmFyIFBpY3R1cmVUd29Ub25lID0gZnVuY3Rpb24gUGljdHVyZVR3b1RvbmUocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IFBpY3R1cmVUd29Ub25lU3ZnXG4gIH0pKTtcbn07XG5cbi8qKiFbcGljdHVyZV0oZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTlRBaUlHaGxhV2RvZEQwaU5UQWlJR1pwYkd3OUlpTmpZV05oWTJFaUlIWnBaWGRDYjNnOUlqWTBJRFkwSURnNU5pQTRPVFlpSUdadlkzVnpZV0pzWlQwaVptRnNjMlVpSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUkrUEhCaGRHZ2daRDBpVFRreU9DQXhOakJJT1RaakxURTNMamNnTUMwek1pQXhOQzR6TFRNeUlETXlkalkwTUdNd0lERTNMamNnTVRRdU15QXpNaUF6TWlBek1tZzRNekpqTVRjdU55QXdJRE15TFRFMExqTWdNekl0TXpKV01Ua3lZekF0TVRjdU55MHhOQzR6TFRNeUxUTXlMVE15ZW0wdE5EQWdOak15U0RFek5uWXRNemt1T1d3eE16Z3VOUzB4TmpRdU15QXhOVEF1TVNBeE56aE1OalU0TGpFZ05EZzVJRGc0T0NBM05qRXVObFkzT1RKNmJUQXRNVEk1TGpoTU5qWTBMaklnTXprMkxqaGpMVE11TWkwekxqZ3RPUzB6TGpndE1USXVNaUF3VERReU5DNDJJRFkyTmk0MGJDMHhORFF0TVRjd0xqZGpMVE11TWkwekxqZ3RPUzB6TGpndE1USXVNaUF3VERFek5pQTJOVEl1TjFZeU16Sm9OelV5ZGpRek1DNHllaUlnWm1sc2JEMGlJekUyTnpkbVppSWdMejQ4Y0dGMGFDQmtQU0pOTkRJMExqWWdOelkxTGpoc0xURTFNQzR4TFRFM09Fd3hNellnTnpVeUxqRldOemt5YURjMU1uWXRNekF1TkV3Mk5UZ3VNU0EwT0RsNklpQm1hV3hzUFNJalpUWm1OR1ptSWlBdlBqeHdZWFJvSUdROUlrMHhNellnTmpVeUxqZHNNVE15TGpRdE1UVTNZek11TWkwekxqZ2dPUzB6TGpnZ01USXVNaUF3YkRFME5DQXhOekF1TjB3Mk5USWdNemsyTGpoak15NHlMVE11T0NBNUxUTXVPQ0F4TWk0eUlEQk1PRGc0SURZMk1pNHlWakl6TWtneE16WjJOREl3TGpkNlRUTXdOQ0F5T0RCaE9EZ2dPRGdnTUNBeE1UQWdNVGMySURnNElEZzRJREFnTURFd0xURTNObm9pSUdacGJHdzlJaU5sTm1ZMFptWWlJQzgrUEhCaGRHZ2daRDBpVFRJM05pQXpOamhoTWpnZ01qZ2dNQ0F4TURVMklEQWdNamdnTWpnZ01DQXhNQzAxTmlBd2VpSWdabWxzYkQwaUkyVTJaalJtWmlJZ0x6NDhjR0YwYUNCa1BTSk5NekEwSURRMU5tRTRPQ0E0T0NBd0lERXdNQzB4TnpZZ09EZ2dPRGdnTUNBd01EQWdNVGMyZW0wd0xURXhObU14TlM0MUlEQWdNamdnTVRJdU5TQXlPQ0F5T0hNdE1USXVOU0F5T0MweU9DQXlPQzB5T0MweE1pNDFMVEk0TFRJNElERXlMalV0TWpnZ01qZ3RNamg2SWlCbWFXeHNQU0lqTVRZM04yWm1JaUF2UGp3dmMzWm5QZz09KSAqL1xudmFyIFJlZkljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihQaWN0dXJlVHdvVG9uZSk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBSZWZJY29uLmRpc3BsYXlOYW1lID0gJ1BpY3R1cmVUd29Ub25lJztcbn1cbmV4cG9ydCBkZWZhdWx0IFJlZkljb247IiwgIi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxudmFyIFBpY3R1cmVUd29Ub25lID0geyBcImljb25cIjogZnVuY3Rpb24gcmVuZGVyKHByaW1hcnlDb2xvciwgc2Vjb25kYXJ5Q29sb3IpIHsgcmV0dXJuIHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNOTI4IDE2MEg5NmMtMTcuNyAwLTMyIDE0LjMtMzIgMzJ2NjQwYzAgMTcuNyAxNC4zIDMyIDMyIDMyaDgzMmMxNy43IDAgMzItMTQuMyAzMi0zMlYxOTJjMC0xNy43LTE0LjMtMzItMzItMzJ6bS00MCA2MzJIMTM2di0zOS45bDEzOC41LTE2NC4zIDE1MC4xIDE3OEw2NTguMSA0ODkgODg4IDc2MS42Vjc5MnptMC0xMjkuOEw2NjQuMiAzOTYuOGMtMy4yLTMuOC05LTMuOC0xMi4yIDBMNDI0LjYgNjY2LjRsLTE0NC0xNzAuN2MtMy4yLTMuOC05LTMuOC0xMi4yIDBMMTM2IDY1Mi43VjIzMmg3NTJ2NDMwLjJ6XCIsIFwiZmlsbFwiOiBwcmltYXJ5Q29sb3IgfSB9LCB7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTQyNC42IDc2NS44bC0xNTAuMS0xNzhMMTM2IDc1Mi4xVjc5Mmg3NTJ2LTMwLjRMNjU4LjEgNDg5elwiLCBcImZpbGxcIjogc2Vjb25kYXJ5Q29sb3IgfSB9LCB7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTEzNiA2NTIuN2wxMzIuNC0xNTdjMy4yLTMuOCA5LTMuOCAxMi4yIDBsMTQ0IDE3MC43TDY1MiAzOTYuOGMzLjItMy44IDktMy44IDEyLjIgMEw4ODggNjYyLjJWMjMySDEzNnY0MjAuN3pNMzA0IDI4MGE4OCA4OCAwIDExMCAxNzYgODggODggMCAwMTAtMTc2elwiLCBcImZpbGxcIjogc2Vjb25kYXJ5Q29sb3IgfSB9LCB7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTI3NiAzNjhhMjggMjggMCAxMDU2IDAgMjggMjggMCAxMC01NiAwelwiLCBcImZpbGxcIjogc2Vjb25kYXJ5Q29sb3IgfSB9LCB7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTMwNCA0NTZhODggODggMCAxMDAtMTc2IDg4IDg4IDAgMDAwIDE3NnptMC0xMTZjMTUuNSAwIDI4IDEyLjUgMjggMjhzLTEyLjUgMjgtMjggMjgtMjgtMTIuNS0yOC0yOCAxMi41LTI4IDI4LTI4elwiLCBcImZpbGxcIjogcHJpbWFyeUNvbG9yIH0gfV0gfTsgfSwgXCJuYW1lXCI6IFwicGljdHVyZVwiLCBcInRoZW1lXCI6IFwidHdvdG9uZVwiIH07XG5leHBvcnQgZGVmYXVsdCBQaWN0dXJlVHdvVG9uZTtcbiIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBVcGxvYWRPdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9VcGxvYWRPdXRsaW5lZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gXCIuLi9jb21wb25lbnRzL0FudGRJY29uXCI7XG52YXIgVXBsb2FkT3V0bGluZWQgPSBmdW5jdGlvbiBVcGxvYWRPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbnRkSWNvbiwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogVXBsb2FkT3V0bGluZWRTdmdcbiAgfSkpO1xufTtcblxuLyoqIVt1cGxvYWRdKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjNhV1IwYUQwaU5UQWlJR2hsYVdkb2REMGlOVEFpSUdacGJHdzlJaU5qWVdOaFkyRWlJSFpwWlhkQ2IzZzlJalkwSURZMElEZzVOaUE0T1RZaUlHWnZZM1Z6WVdKc1pUMGlabUZzYzJVaUlIaHRiRzV6UFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eU1EQXdMM04yWnlJK1BIQmhkR2dnWkQwaVRUUXdNQ0F6TVRjdU4yZzNNeTQ1VmpZMU5tTXdJRFF1TkNBekxqWWdPQ0E0SURob05qQmpOQzQwSURBZ09DMHpMallnT0MwNFZqTXhOeTQzU0RZeU5HTTJMamNnTUNBeE1DNDBMVGN1TnlBMkxqTXRNVEl1T1V3MU1UZ3VNeUF4TmpOaE9DQTRJREFnTURBdE1USXVOaUF3YkMweE1USWdNVFF4TGpkakxUUXVNU0ExTGpNdExqUWdNVE1nTmk0eklERXplazA0TnpnZ05qSTJhQzAyTUdNdE5DNDBJREF0T0NBekxqWXRPQ0E0ZGpFMU5FZ3lNVFJXTmpNMFl6QXROQzQwTFRNdU5pMDRMVGd0T0dndE5qQmpMVFF1TkNBd0xUZ2dNeTQyTFRnZ09IWXhPVGhqTUNBeE55NDNJREUwTGpNZ016SWdNeklnTXpKb05qZzBZekUzTGpjZ01DQXpNaTB4TkM0eklETXlMVE15VmpZek5HTXdMVFF1TkMwekxqWXRPQzA0TFRoNklpQXZQand2YzNablBnPT0pICovXG52YXIgUmVmSWNvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKFVwbG9hZE91dGxpbmVkKTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFJlZkljb24uZGlzcGxheU5hbWUgPSAnVXBsb2FkT3V0bGluZWQnO1xufVxuZXhwb3J0IGRlZmF1bHQgUmVmSWNvbjsiLCAiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgVXBsb2FkT3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTQwMCAzMTcuN2g3My45VjY1NmMwIDQuNCAzLjYgOCA4IDhoNjBjNC40IDAgOC0zLjYgOC04VjMxNy43SDYyNGM2LjcgMCAxMC40LTcuNyA2LjMtMTIuOUw1MTguMyAxNjNhOCA4IDAgMDAtMTIuNiAwbC0xMTIgMTQxLjdjLTQuMSA1LjMtLjQgMTMgNi4zIDEzek04NzggNjI2aC02MGMtNC40IDAtOCAzLjYtOCA4djE1NEgyMTRWNjM0YzAtNC40LTMuNi04LTgtOGgtNjBjLTQuNCAwLTggMy42LTggOHYxOThjMCAxNy43IDE0LjMgMzIgMzIgMzJoNjg0YzE3LjcgMCAzMi0xNC4zIDMyLTMyVjYzNGMwLTQuNC0zLjYtOC04LTh6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJ1cGxvYWRcIiwgXCJ0aGVtZVwiOiBcIm91dGxpbmVkXCIgfTtcbmV4cG9ydCBkZWZhdWx0IFVwbG9hZE91dGxpbmVkO1xuIiwgIlwidXNlIGNsaWVudFwiO1xuXG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFVwbG9hZCBmcm9tICcuL1VwbG9hZCc7XG5jb25zdCBEcmFnZ2VyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKF9hLCByZWYpID0+IHtcbiAgdmFyIHtcbiAgICAgIHN0eWxlLFxuICAgICAgaGVpZ2h0LFxuICAgICAgaGFzQ29udHJvbEluc2lkZSA9IGZhbHNlXG4gICAgfSA9IF9hLFxuICAgIHJlc3RQcm9wcyA9IF9fcmVzdChfYSwgW1wic3R5bGVcIiwgXCJoZWlnaHRcIiwgXCJoYXNDb250cm9sSW5zaWRlXCJdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFVwbG9hZCwgT2JqZWN0LmFzc2lnbih7XG4gICAgcmVmOiByZWYsXG4gICAgaGFzQ29udHJvbEluc2lkZTogaGFzQ29udHJvbEluc2lkZVxuICB9LCByZXN0UHJvcHMsIHtcbiAgICB0eXBlOiBcImRyYWdcIixcbiAgICBzdHlsZTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdHlsZSksIHtcbiAgICAgIGhlaWdodFxuICAgIH0pXG4gIH0pKTtcbn0pO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgRHJhZ2dlci5kaXNwbGF5TmFtZSA9ICdEcmFnZ2VyJztcbn1cbmV4cG9ydCBkZWZhdWx0IERyYWdnZXI7IiwgIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xudmFyIF9fYXdhaXRlciA9IHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7XG4gICAgICByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTtcbiAgICB9XG4gICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICB9KTtcbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBmbHVzaFN5bmMgfSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUmNVcGxvYWQgZnJvbSAncmMtdXBsb2FkJztcbmltcG9ydCB1c2VNZXJnZWRTdGF0ZSBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VNZXJnZWRTdGF0ZVwiO1xuaW1wb3J0IHsgZGV2VXNlV2FybmluZyB9IGZyb20gJy4uL191dGlsL3dhcm5pbmcnO1xuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgRGlzYWJsZWRDb250ZXh0IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlci9EaXNhYmxlZENvbnRleHQnO1xuaW1wb3J0IHsgdXNlTG9jYWxlIH0gZnJvbSAnLi4vbG9jYWxlJztcbmltcG9ydCBkZWZhdWx0TG9jYWxlIGZyb20gJy4uL2xvY2FsZS9lbl9VUyc7XG5pbXBvcnQgdXNlU3R5bGUgZnJvbSAnLi9zdHlsZSc7XG5pbXBvcnQgVXBsb2FkTGlzdCBmcm9tICcuL1VwbG9hZExpc3QnO1xuaW1wb3J0IHsgZmlsZTJPYmosIGdldEZpbGVJdGVtLCByZW1vdmVGaWxlSXRlbSwgdXBkYXRlRmlsZUxpc3QgfSBmcm9tICcuL3V0aWxzJztcbmV4cG9ydCBjb25zdCBMSVNUX0lHTk9SRSA9IGBfX0xJU1RfSUdOT1JFXyR7RGF0ZS5ub3coKX1fX2A7XG5jb25zdCBJbnRlcm5hbFVwbG9hZCA9IChwcm9wcywgcmVmKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBmaWxlTGlzdCxcbiAgICBkZWZhdWx0RmlsZUxpc3QsXG4gICAgb25SZW1vdmUsXG4gICAgc2hvd1VwbG9hZExpc3QgPSB0cnVlLFxuICAgIGxpc3RUeXBlID0gJ3RleHQnLFxuICAgIG9uUHJldmlldyxcbiAgICBvbkRvd25sb2FkLFxuICAgIG9uQ2hhbmdlLFxuICAgIG9uRHJvcCxcbiAgICBwcmV2aWV3RmlsZSxcbiAgICBkaXNhYmxlZDogY3VzdG9tRGlzYWJsZWQsXG4gICAgbG9jYWxlOiBwcm9wTG9jYWxlLFxuICAgIGljb25SZW5kZXIsXG4gICAgaXNJbWFnZVVybCxcbiAgICBwcm9ncmVzcyxcbiAgICBwcmVmaXhDbHM6IGN1c3RvbWl6ZVByZWZpeENscyxcbiAgICBjbGFzc05hbWUsXG4gICAgdHlwZSA9ICdzZWxlY3QnLFxuICAgIGNoaWxkcmVuLFxuICAgIHN0eWxlLFxuICAgIGl0ZW1SZW5kZXIsXG4gICAgbWF4Q291bnQsXG4gICAgZGF0YSA9IHt9LFxuICAgIG11bHRpcGxlID0gZmFsc2UsXG4gICAgaGFzQ29udHJvbEluc2lkZSA9IHRydWUsXG4gICAgYWN0aW9uID0gJycsXG4gICAgYWNjZXB0ID0gJycsXG4gICAgc3VwcG9ydFNlcnZlclJlbmRlciA9IHRydWUsXG4gICAgcm9vdENsYXNzTmFtZVxuICB9ID0gcHJvcHM7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PSBEaXNhYmxlZCA9PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3QgZGlzYWJsZWQgPSBSZWFjdC51c2VDb250ZXh0KERpc2FibGVkQ29udGV4dCk7XG4gIGNvbnN0IG1lcmdlZERpc2FibGVkID0gY3VzdG9tRGlzYWJsZWQgIT09IG51bGwgJiYgY3VzdG9tRGlzYWJsZWQgIT09IHZvaWQgMCA/IGN1c3RvbURpc2FibGVkIDogZGlzYWJsZWQ7XG4gIGNvbnN0IFttZXJnZWRGaWxlTGlzdCwgc2V0TWVyZ2VkRmlsZUxpc3RdID0gdXNlTWVyZ2VkU3RhdGUoZGVmYXVsdEZpbGVMaXN0IHx8IFtdLCB7XG4gICAgdmFsdWU6IGZpbGVMaXN0LFxuICAgIHBvc3RTdGF0ZTogbGlzdCA9PiBsaXN0ICE9PSBudWxsICYmIGxpc3QgIT09IHZvaWQgMCA/IGxpc3QgOiBbXVxuICB9KTtcbiAgY29uc3QgW2RyYWdTdGF0ZSwgc2V0RHJhZ1N0YXRlXSA9IFJlYWN0LnVzZVN0YXRlKCdkcm9wJyk7XG4gIGNvbnN0IHVwbG9hZCA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3Qgd3JhcFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBjb25zdCB3YXJuaW5nID0gZGV2VXNlV2FybmluZygnVXBsb2FkJyk7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZygnZmlsZUxpc3QnIGluIHByb3BzIHx8ICEoJ3ZhbHVlJyBpbiBwcm9wcyksICd1c2FnZScsICdgdmFsdWVgIGlzIG5vdCBhIHZhbGlkIHByb3AsIGRvIHlvdSBtZWFuIGBmaWxlTGlzdGA/JykgOiB2b2lkIDA7XG4gICAgd2FybmluZy5kZXByZWNhdGVkKCEoJ3RyYW5zZm9ybUZpbGUnIGluIHByb3BzKSwgJ3RyYW5zZm9ybUZpbGUnLCAnYmVmb3JlVXBsb2FkJyk7XG4gIH1cbiAgLy8gQ29udHJvbCBtb2RlIHdpbGwgYXV0byBmaWxsIGZpbGUgdWlkIGlmIG5vdCBwcm92aWRlZFxuICBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgIChmaWxlTGlzdCB8fCBbXSkuZm9yRWFjaCgoZmlsZSwgaW5kZXgpID0+IHtcbiAgICAgIGlmICghZmlsZS51aWQgJiYgIU9iamVjdC5pc0Zyb3plbihmaWxlKSkge1xuICAgICAgICBmaWxlLnVpZCA9IGBfX0FVVE9fXyR7dGltZXN0YW1wfV8ke2luZGV4fV9fYDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSwgW2ZpbGVMaXN0XSk7XG4gIGNvbnN0IG9uSW50ZXJuYWxDaGFuZ2UgPSAoZmlsZSwgY2hhbmdlZEZpbGVMaXN0LCBldmVudCkgPT4ge1xuICAgIGxldCBjbG9uZUxpc3QgPSBfdG9Db25zdW1hYmxlQXJyYXkoY2hhbmdlZEZpbGVMaXN0KTtcbiAgICBsZXQgZXhjZWVkTWF4Q291bnQgPSBmYWxzZTtcbiAgICAvLyBDdXQgdG8gbWF0Y2ggY291bnRcbiAgICBpZiAobWF4Q291bnQgPT09IDEpIHtcbiAgICAgIGNsb25lTGlzdCA9IGNsb25lTGlzdC5zbGljZSgtMSk7XG4gICAgfSBlbHNlIGlmIChtYXhDb3VudCkge1xuICAgICAgZXhjZWVkTWF4Q291bnQgPSBjbG9uZUxpc3QubGVuZ3RoID4gbWF4Q291bnQ7XG4gICAgICBjbG9uZUxpc3QgPSBjbG9uZUxpc3Quc2xpY2UoMCwgbWF4Q291bnQpO1xuICAgIH1cbiAgICAvLyBQcmV2ZW50IFJlYWN0MTggYXV0byBiYXRjaCBzaW5jZSBpbnB1dFt1cGxvYWRdIHRyaWdnZXIgcHJvY2VzcyBhdCBzYW1lIHRpbWVcbiAgICAvLyB3aGljaCBtYWtlcyBmaWxlTGlzdCBjbG9zdXJlIHByb2JsZW1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtZG9tL25vLWZsdXNoLXN5bmNcbiAgICBmbHVzaFN5bmMoKCkgPT4ge1xuICAgICAgc2V0TWVyZ2VkRmlsZUxpc3QoY2xvbmVMaXN0KTtcbiAgICB9KTtcbiAgICBjb25zdCBjaGFuZ2VJbmZvID0ge1xuICAgICAgZmlsZTogZmlsZSxcbiAgICAgIGZpbGVMaXN0OiBjbG9uZUxpc3RcbiAgICB9O1xuICAgIGlmIChldmVudCkge1xuICAgICAgY2hhbmdlSW5mby5ldmVudCA9IGV2ZW50O1xuICAgIH1cbiAgICBpZiAoIWV4Y2VlZE1heENvdW50IHx8IGZpbGUuc3RhdHVzID09PSAncmVtb3ZlZCcgfHxcbiAgICAvLyBXZSBzaG91bGQgaWdub3JlIGV2ZW50IGlmIGN1cnJlbnQgZmlsZSBpcyBleGNlZWQgYG1heENvdW50YFxuICAgIGNsb25lTGlzdC5zb21lKGYgPT4gZi51aWQgPT09IGZpbGUudWlkKSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWRvbS9uby1mbHVzaC1zeW5jXG4gICAgICBmbHVzaFN5bmMoKCkgPT4ge1xuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UoY2hhbmdlSW5mbyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IG1lcmdlZEJlZm9yZVVwbG9hZCA9IChmaWxlLCBmaWxlTGlzdEFyZ3MpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGJlZm9yZVVwbG9hZCxcbiAgICAgIHRyYW5zZm9ybUZpbGVcbiAgICB9ID0gcHJvcHM7XG4gICAgbGV0IHBhcnNlZEZpbGUgPSBmaWxlO1xuICAgIGlmIChiZWZvcmVVcGxvYWQpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIGJlZm9yZVVwbG9hZChmaWxlLCBmaWxlTGlzdEFyZ3MpO1xuICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgLy8gSGFjayBmb3IgTElTVF9JR05PUkUsIHdlIGFkZCBhZGRpdGlvbmFsIGluZm8gdG8gcmVtb3ZlIGZyb20gdGhlIGxpc3RcbiAgICAgIGRlbGV0ZSBmaWxlW0xJU1RfSUdOT1JFXTtcbiAgICAgIGlmIChyZXN1bHQgPT09IExJU1RfSUdOT1JFKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmaWxlLCBMSVNUX0lHTk9SRSwge1xuICAgICAgICAgIHZhbHVlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnICYmIHJlc3VsdCkge1xuICAgICAgICBwYXJzZWRGaWxlID0gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHJhbnNmb3JtRmlsZSkge1xuICAgICAgcGFyc2VkRmlsZSA9IHlpZWxkIHRyYW5zZm9ybUZpbGUocGFyc2VkRmlsZSk7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZWRGaWxlO1xuICB9KTtcbiAgY29uc3Qgb25CYXRjaFN0YXJ0ID0gYmF0Y2hGaWxlSW5mb0xpc3QgPT4ge1xuICAgIC8vIFNraXAgZmlsZSB3aGljaCBtYXJrZWQgYXMgYExJU1RfSUdOT1JFYCwgdGhlc2UgZmlsZSB3aWxsIG5vdCBhZGQgdG8gZmlsZSBsaXN0XG4gICAgY29uc3QgZmlsdGVyZWRGaWxlSW5mb0xpc3QgPSBiYXRjaEZpbGVJbmZvTGlzdC5maWx0ZXIoaW5mbyA9PiAhaW5mby5maWxlW0xJU1RfSUdOT1JFXSk7XG4gICAgLy8gTm90aGluZyB0byBkbyBzaW5jZSBubyBmaWxlIG5lZWQgdXBsb2FkXG4gICAgaWYgKCFmaWx0ZXJlZEZpbGVJbmZvTGlzdC5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb2JqZWN0RmlsZUxpc3QgPSBmaWx0ZXJlZEZpbGVJbmZvTGlzdC5tYXAoaW5mbyA9PiBmaWxlMk9iaihpbmZvLmZpbGUpKTtcbiAgICAvLyBDb25jYXQgbmV3IGZpbGVzIHdpdGggcHJldiBmaWxlc1xuICAgIGxldCBuZXdGaWxlTGlzdCA9IF90b0NvbnN1bWFibGVBcnJheShtZXJnZWRGaWxlTGlzdCk7XG4gICAgb2JqZWN0RmlsZUxpc3QuZm9yRWFjaChmaWxlT2JqID0+IHtcbiAgICAgIC8vIFJlcGxhY2UgZmlsZSBpZiBleGlzdFxuICAgICAgbmV3RmlsZUxpc3QgPSB1cGRhdGVGaWxlTGlzdChmaWxlT2JqLCBuZXdGaWxlTGlzdCk7XG4gICAgfSk7XG4gICAgb2JqZWN0RmlsZUxpc3QuZm9yRWFjaCgoZmlsZU9iaiwgaW5kZXgpID0+IHtcbiAgICAgIC8vIFJlcGVhdCB0cmlnZ2VyIGBvbkNoYW5nZWAgZXZlbnQgZm9yIGNvbXBhdGlibGVcbiAgICAgIGxldCB0cmlnZ2VyRmlsZU9iaiA9IGZpbGVPYmo7XG4gICAgICBpZiAoIWZpbHRlcmVkRmlsZUluZm9MaXN0W2luZGV4XS5wYXJzZWRGaWxlKSB7XG4gICAgICAgIC8vIGBiZWZvcmVVcGxvYWRgIHJldHVybiBmYWxzZVxuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgb3JpZ2luRmlsZU9ialxuICAgICAgICB9ID0gZmlsZU9iajtcbiAgICAgICAgbGV0IGNsb25lO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNsb25lID0gbmV3IEZpbGUoW29yaWdpbkZpbGVPYmpdLCBvcmlnaW5GaWxlT2JqLm5hbWUsIHtcbiAgICAgICAgICAgIHR5cGU6IG9yaWdpbkZpbGVPYmoudHlwZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChfYSkge1xuICAgICAgICAgIGNsb25lID0gbmV3IEJsb2IoW29yaWdpbkZpbGVPYmpdLCB7XG4gICAgICAgICAgICB0eXBlOiBvcmlnaW5GaWxlT2JqLnR5cGVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjbG9uZS5uYW1lID0gb3JpZ2luRmlsZU9iai5uYW1lO1xuICAgICAgICAgIGNsb25lLmxhc3RNb2RpZmllZERhdGUgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgIGNsb25lLmxhc3RNb2RpZmllZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNsb25lLnVpZCA9IGZpbGVPYmoudWlkO1xuICAgICAgICB0cmlnZ2VyRmlsZU9iaiA9IGNsb25lO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSW5qZWN0IGB1cGxvYWRpbmdgIHN0YXR1c1xuICAgICAgICBmaWxlT2JqLnN0YXR1cyA9ICd1cGxvYWRpbmcnO1xuICAgICAgfVxuICAgICAgb25JbnRlcm5hbENoYW5nZSh0cmlnZ2VyRmlsZU9iaiwgbmV3RmlsZUxpc3QpO1xuICAgIH0pO1xuICB9O1xuICBjb25zdCBvblN1Y2Nlc3MgPSAocmVzcG9uc2UsIGZpbGUsIHhocikgPT4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAodHlwZW9mIHJlc3BvbnNlID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS9ub1BhcmFtZXRlckFzc2lnbjogd2UgbmVlZCB0byBtb2RpZnkgcmVzcG9uc2VcbiAgICAgICAgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHJlc3BvbnNlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChfYSkge1xuICAgICAgLyogZG8gbm90aGluZyAqL1xuICAgIH1cbiAgICAvLyByZW1vdmVkXG4gICAgaWYgKCFnZXRGaWxlSXRlbShmaWxlLCBtZXJnZWRGaWxlTGlzdCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0SXRlbSA9IGZpbGUyT2JqKGZpbGUpO1xuICAgIHRhcmdldEl0ZW0uc3RhdHVzID0gJ2RvbmUnO1xuICAgIHRhcmdldEl0ZW0ucGVyY2VudCA9IDEwMDtcbiAgICB0YXJnZXRJdGVtLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgdGFyZ2V0SXRlbS54aHIgPSB4aHI7XG4gICAgY29uc3QgbmV4dEZpbGVMaXN0ID0gdXBkYXRlRmlsZUxpc3QodGFyZ2V0SXRlbSwgbWVyZ2VkRmlsZUxpc3QpO1xuICAgIG9uSW50ZXJuYWxDaGFuZ2UodGFyZ2V0SXRlbSwgbmV4dEZpbGVMaXN0KTtcbiAgfTtcbiAgY29uc3Qgb25Qcm9ncmVzcyA9IChlLCBmaWxlKSA9PiB7XG4gICAgLy8gcmVtb3ZlZFxuICAgIGlmICghZ2V0RmlsZUl0ZW0oZmlsZSwgbWVyZ2VkRmlsZUxpc3QpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldEl0ZW0gPSBmaWxlMk9iaihmaWxlKTtcbiAgICB0YXJnZXRJdGVtLnN0YXR1cyA9ICd1cGxvYWRpbmcnO1xuICAgIHRhcmdldEl0ZW0ucGVyY2VudCA9IGUucGVyY2VudDtcbiAgICBjb25zdCBuZXh0RmlsZUxpc3QgPSB1cGRhdGVGaWxlTGlzdCh0YXJnZXRJdGVtLCBtZXJnZWRGaWxlTGlzdCk7XG4gICAgb25JbnRlcm5hbENoYW5nZSh0YXJnZXRJdGVtLCBuZXh0RmlsZUxpc3QsIGUpO1xuICB9O1xuICBjb25zdCBvbkVycm9yID0gKGVycm9yLCByZXNwb25zZSwgZmlsZSkgPT4ge1xuICAgIC8vIHJlbW92ZWRcbiAgICBpZiAoIWdldEZpbGVJdGVtKGZpbGUsIG1lcmdlZEZpbGVMaXN0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXRJdGVtID0gZmlsZTJPYmooZmlsZSk7XG4gICAgdGFyZ2V0SXRlbS5lcnJvciA9IGVycm9yO1xuICAgIHRhcmdldEl0ZW0ucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICB0YXJnZXRJdGVtLnN0YXR1cyA9ICdlcnJvcic7XG4gICAgY29uc3QgbmV4dEZpbGVMaXN0ID0gdXBkYXRlRmlsZUxpc3QodGFyZ2V0SXRlbSwgbWVyZ2VkRmlsZUxpc3QpO1xuICAgIG9uSW50ZXJuYWxDaGFuZ2UodGFyZ2V0SXRlbSwgbmV4dEZpbGVMaXN0KTtcbiAgfTtcbiAgY29uc3QgaGFuZGxlUmVtb3ZlID0gZmlsZSA9PiB7XG4gICAgbGV0IGN1cnJlbnRGaWxlO1xuICAgIFByb21pc2UucmVzb2x2ZSh0eXBlb2Ygb25SZW1vdmUgPT09ICdmdW5jdGlvbicgPyBvblJlbW92ZShmaWxlKSA6IG9uUmVtb3ZlKS50aGVuKHJldCA9PiB7XG4gICAgICB2YXIgX2E7XG4gICAgICAvLyBQcmV2ZW50IHJlbW92aW5nIGZpbGVcbiAgICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlbW92ZWRGaWxlTGlzdCA9IHJlbW92ZUZpbGVJdGVtKGZpbGUsIG1lcmdlZEZpbGVMaXN0KTtcbiAgICAgIGlmIChyZW1vdmVkRmlsZUxpc3QpIHtcbiAgICAgICAgY3VycmVudEZpbGUgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGZpbGUpLCB7XG4gICAgICAgICAgc3RhdHVzOiAncmVtb3ZlZCdcbiAgICAgICAgfSk7XG4gICAgICAgIG1lcmdlZEZpbGVMaXN0ID09PSBudWxsIHx8IG1lcmdlZEZpbGVMaXN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtZXJnZWRGaWxlTGlzdC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgIGNvbnN0IG1hdGNoS2V5ID0gY3VycmVudEZpbGUudWlkICE9PSB1bmRlZmluZWQgPyAndWlkJyA6ICduYW1lJztcbiAgICAgICAgICBpZiAoaXRlbVttYXRjaEtleV0gPT09IGN1cnJlbnRGaWxlW21hdGNoS2V5XSAmJiAhT2JqZWN0LmlzRnJvemVuKGl0ZW0pKSB7XG4gICAgICAgICAgICBpdGVtLnN0YXR1cyA9ICdyZW1vdmVkJztcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAoX2EgPSB1cGxvYWQuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFib3J0KGN1cnJlbnRGaWxlKTtcbiAgICAgICAgb25JbnRlcm5hbENoYW5nZShjdXJyZW50RmlsZSwgcmVtb3ZlZEZpbGVMaXN0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgY29uc3Qgb25GaWxlRHJvcCA9IGUgPT4ge1xuICAgIHNldERyYWdTdGF0ZShlLnR5cGUpO1xuICAgIGlmIChlLnR5cGUgPT09ICdkcm9wJykge1xuICAgICAgb25Ecm9wID09PSBudWxsIHx8IG9uRHJvcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25Ecm9wKGUpO1xuICAgIH1cbiAgfTtcbiAgLy8gVGVzdCBuZWVkc1xuICBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgKCkgPT4gKHtcbiAgICBvbkJhdGNoU3RhcnQsXG4gICAgb25TdWNjZXNzLFxuICAgIG9uUHJvZ3Jlc3MsXG4gICAgb25FcnJvcixcbiAgICBmaWxlTGlzdDogbWVyZ2VkRmlsZUxpc3QsXG4gICAgdXBsb2FkOiB1cGxvYWQuY3VycmVudCxcbiAgICBuYXRpdmVFbGVtZW50OiB3cmFwUmVmLmN1cnJlbnRcbiAgfSkpO1xuICBjb25zdCB7XG4gICAgZ2V0UHJlZml4Q2xzLFxuICAgIGRpcmVjdGlvbixcbiAgICB1cGxvYWQ6IGN0eFVwbG9hZFxuICB9ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KTtcbiAgY29uc3QgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCd1cGxvYWQnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICBjb25zdCByY1VwbG9hZFByb3BzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHtcbiAgICBvbkJhdGNoU3RhcnQsXG4gICAgb25FcnJvcixcbiAgICBvblByb2dyZXNzLFxuICAgIG9uU3VjY2Vzc1xuICB9LCBwcm9wcyksIHtcbiAgICBkYXRhLFxuICAgIG11bHRpcGxlLFxuICAgIGFjdGlvbixcbiAgICBhY2NlcHQsXG4gICAgc3VwcG9ydFNlcnZlclJlbmRlcixcbiAgICBwcmVmaXhDbHMsXG4gICAgZGlzYWJsZWQ6IG1lcmdlZERpc2FibGVkLFxuICAgIGJlZm9yZVVwbG9hZDogbWVyZ2VkQmVmb3JlVXBsb2FkLFxuICAgIG9uQ2hhbmdlOiB1bmRlZmluZWQsXG4gICAgaGFzQ29udHJvbEluc2lkZVxuICB9KTtcbiAgZGVsZXRlIHJjVXBsb2FkUHJvcHMuY2xhc3NOYW1lO1xuICBkZWxldGUgcmNVcGxvYWRQcm9wcy5zdHlsZTtcbiAgLy8gUmVtb3ZlIGlkIHRvIGF2b2lkIG9wZW4gYnkgbGFiZWwgd2hlbiB0cmlnZ2VyIGlzIGhpZGRlblxuICAvLyAhY2hpbGRyZW46IGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzE0Mjk4XG4gIC8vIGRpc2FibGVkOiBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8xNjQ3OFxuICAvLyAgICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMjQxOTdcbiAgaWYgKCFjaGlsZHJlbiB8fCBtZXJnZWREaXNhYmxlZCkge1xuICAgIGRlbGV0ZSByY1VwbG9hZFByb3BzLmlkO1xuICB9XG4gIGNvbnN0IHdyYXBwZXJDbHMgPSBgJHtwcmVmaXhDbHN9LXdyYXBwZXJgO1xuICBjb25zdCBbd3JhcENTU1ZhciwgaGFzaElkLCBjc3NWYXJDbHNdID0gdXNlU3R5bGUocHJlZml4Q2xzLCB3cmFwcGVyQ2xzKTtcbiAgY29uc3QgW2NvbnRleHRMb2NhbGVdID0gdXNlTG9jYWxlKCdVcGxvYWQnLCBkZWZhdWx0TG9jYWxlLlVwbG9hZCk7XG4gIGNvbnN0IHtcbiAgICBzaG93UmVtb3ZlSWNvbixcbiAgICBzaG93UHJldmlld0ljb24sXG4gICAgc2hvd0Rvd25sb2FkSWNvbixcbiAgICByZW1vdmVJY29uLFxuICAgIHByZXZpZXdJY29uLFxuICAgIGRvd25sb2FkSWNvbixcbiAgICBleHRyYVxuICB9ID0gdHlwZW9mIHNob3dVcGxvYWRMaXN0ID09PSAnYm9vbGVhbicgPyB7fSA6IHNob3dVcGxvYWRMaXN0O1xuICAvLyB1c2Ugc2hvd1JlbW92ZUljb24gaWYgaXQgaXMgc3BlY2lmaWVkIGV4cGxpY2l0bHlcbiAgY29uc3QgcmVhbFNob3dSZW1vdmVJY29uID0gdHlwZW9mIHNob3dSZW1vdmVJY29uID09PSAndW5kZWZpbmVkJyA/ICFtZXJnZWREaXNhYmxlZCA6IHNob3dSZW1vdmVJY29uO1xuICBjb25zdCByZW5kZXJVcGxvYWRMaXN0ID0gKGJ1dHRvbiwgYnV0dG9uVmlzaWJsZSkgPT4ge1xuICAgIGlmICghc2hvd1VwbG9hZExpc3QpIHtcbiAgICAgIHJldHVybiBidXR0b247XG4gICAgfVxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChVcGxvYWRMaXN0LCB7XG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgIGxpc3RUeXBlOiBsaXN0VHlwZSxcbiAgICAgIGl0ZW1zOiBtZXJnZWRGaWxlTGlzdCxcbiAgICAgIHByZXZpZXdGaWxlOiBwcmV2aWV3RmlsZSxcbiAgICAgIG9uUHJldmlldzogb25QcmV2aWV3LFxuICAgICAgb25Eb3dubG9hZDogb25Eb3dubG9hZCxcbiAgICAgIG9uUmVtb3ZlOiBoYW5kbGVSZW1vdmUsXG4gICAgICBzaG93UmVtb3ZlSWNvbjogcmVhbFNob3dSZW1vdmVJY29uLFxuICAgICAgc2hvd1ByZXZpZXdJY29uOiBzaG93UHJldmlld0ljb24sXG4gICAgICBzaG93RG93bmxvYWRJY29uOiBzaG93RG93bmxvYWRJY29uLFxuICAgICAgcmVtb3ZlSWNvbjogcmVtb3ZlSWNvbixcbiAgICAgIHByZXZpZXdJY29uOiBwcmV2aWV3SWNvbixcbiAgICAgIGRvd25sb2FkSWNvbjogZG93bmxvYWRJY29uLFxuICAgICAgaWNvblJlbmRlcjogaWNvblJlbmRlcixcbiAgICAgIGV4dHJhOiBleHRyYSxcbiAgICAgIGxvY2FsZTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjb250ZXh0TG9jYWxlKSwgcHJvcExvY2FsZSksXG4gICAgICBpc0ltYWdlVXJsOiBpc0ltYWdlVXJsLFxuICAgICAgcHJvZ3Jlc3M6IHByb2dyZXNzLFxuICAgICAgYXBwZW5kQWN0aW9uOiBidXR0b24sXG4gICAgICBhcHBlbmRBY3Rpb25WaXNpYmxlOiBidXR0b25WaXNpYmxlLFxuICAgICAgaXRlbVJlbmRlcjogaXRlbVJlbmRlcixcbiAgICAgIGRpc2FibGVkOiBtZXJnZWREaXNhYmxlZFxuICAgIH0pO1xuICB9O1xuICBjb25zdCBtZXJnZWRDbHMgPSBjbGFzc05hbWVzKHdyYXBwZXJDbHMsIGNsYXNzTmFtZSwgcm9vdENsYXNzTmFtZSwgaGFzaElkLCBjc3NWYXJDbHMsIGN0eFVwbG9hZCA9PT0gbnVsbCB8fCBjdHhVcGxvYWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGN0eFVwbG9hZC5jbGFzc05hbWUsIHtcbiAgICBbYCR7cHJlZml4Q2xzfS1ydGxgXTogZGlyZWN0aW9uID09PSAncnRsJyxcbiAgICBbYCR7cHJlZml4Q2xzfS1waWN0dXJlLWNhcmQtd3JhcHBlcmBdOiBsaXN0VHlwZSA9PT0gJ3BpY3R1cmUtY2FyZCcsXG4gICAgW2Ake3ByZWZpeENsc30tcGljdHVyZS1jaXJjbGUtd3JhcHBlcmBdOiBsaXN0VHlwZSA9PT0gJ3BpY3R1cmUtY2lyY2xlJ1xuICB9KTtcbiAgY29uc3QgbWVyZ2VkU3R5bGUgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGN0eFVwbG9hZCA9PT0gbnVsbCB8fCBjdHhVcGxvYWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGN0eFVwbG9hZC5zdHlsZSksIHN0eWxlKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgaWYgKHR5cGUgPT09ICdkcmFnJykge1xuICAgIGNvbnN0IGRyYWdDbHMgPSBjbGFzc05hbWVzKGhhc2hJZCwgcHJlZml4Q2xzLCBgJHtwcmVmaXhDbHN9LWRyYWdgLCB7XG4gICAgICBbYCR7cHJlZml4Q2xzfS1kcmFnLXVwbG9hZGluZ2BdOiBtZXJnZWRGaWxlTGlzdC5zb21lKGZpbGUgPT4gZmlsZS5zdGF0dXMgPT09ICd1cGxvYWRpbmcnKSxcbiAgICAgIFtgJHtwcmVmaXhDbHN9LWRyYWctaG92ZXJgXTogZHJhZ1N0YXRlID09PSAnZHJhZ292ZXInLFxuICAgICAgW2Ake3ByZWZpeENsc30tZGlzYWJsZWRgXTogbWVyZ2VkRGlzYWJsZWQsXG4gICAgICBbYCR7cHJlZml4Q2xzfS1ydGxgXTogZGlyZWN0aW9uID09PSAncnRsJ1xuICAgIH0pO1xuICAgIHJldHVybiB3cmFwQ1NTVmFyKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IG1lcmdlZENscyxcbiAgICAgIHJlZjogd3JhcFJlZlxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogZHJhZ0NscyxcbiAgICAgIHN0eWxlOiBtZXJnZWRTdHlsZSxcbiAgICAgIG9uRHJvcDogb25GaWxlRHJvcCxcbiAgICAgIG9uRHJhZ092ZXI6IG9uRmlsZURyb3AsXG4gICAgICBvbkRyYWdMZWF2ZTogb25GaWxlRHJvcFxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJjVXBsb2FkLCBPYmplY3QuYXNzaWduKHt9LCByY1VwbG9hZFByb3BzLCB7XG4gICAgICByZWY6IHVwbG9hZCxcbiAgICAgIGNsYXNzTmFtZTogYCR7cHJlZml4Q2xzfS1idG5gXG4gICAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogYCR7cHJlZml4Q2xzfS1kcmFnLWNvbnRhaW5lcmBcbiAgICB9LCBjaGlsZHJlbikpKSwgcmVuZGVyVXBsb2FkTGlzdCgpKSk7XG4gIH1cbiAgY29uc3QgdXBsb2FkQnRuQ2xzID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIGAke3ByZWZpeENsc30tc2VsZWN0YCwge1xuICAgIFtgJHtwcmVmaXhDbHN9LWRpc2FibGVkYF06IG1lcmdlZERpc2FibGVkLFxuICAgIFtgJHtwcmVmaXhDbHN9LWhpZGRlbmBdOiAhY2hpbGRyZW5cbiAgfSk7XG4gIGNvbnN0IHVwbG9hZEJ1dHRvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IHVwbG9hZEJ0bkNsc1xuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSY1VwbG9hZCwgT2JqZWN0LmFzc2lnbih7fSwgcmNVcGxvYWRQcm9wcywge1xuICAgIHJlZjogdXBsb2FkXG4gIH0pKSk7XG4gIGlmIChsaXN0VHlwZSA9PT0gJ3BpY3R1cmUtY2FyZCcgfHwgbGlzdFR5cGUgPT09ICdwaWN0dXJlLWNpcmNsZScpIHtcbiAgICByZXR1cm4gd3JhcENTU1ZhcigvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBtZXJnZWRDbHMsXG4gICAgICByZWY6IHdyYXBSZWZcbiAgICB9LCByZW5kZXJVcGxvYWRMaXN0KHVwbG9hZEJ1dHRvbiwgISFjaGlsZHJlbikpKTtcbiAgfVxuICByZXR1cm4gd3JhcENTU1ZhcigvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogbWVyZ2VkQ2xzLFxuICAgIHJlZjogd3JhcFJlZlxuICB9LCB1cGxvYWRCdXR0b24sIHJlbmRlclVwbG9hZExpc3QoKSkpO1xufTtcbmNvbnN0IFVwbG9hZCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKEludGVybmFsVXBsb2FkKTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFVwbG9hZC5kaXNwbGF5TmFtZSA9ICdVcGxvYWQnO1xufVxuZXhwb3J0IGRlZmF1bHQgVXBsb2FkOyIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2Fzc2VydFRoaXNJbml0aWFsaXplZFwiO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNcIjtcbmltcG9ydCBfY3JlYXRlU3VwZXIgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZVN1cGVyXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuLyogZXNsaW50IHJlYWN0L3Byb3AtdHlwZXM6MCAqL1xuaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBBamF4VXBsb2FkIGZyb20gXCIuL0FqYXhVcGxvYWRlclwiO1xuZnVuY3Rpb24gZW1wdHkoKSB7fVxudmFyIFVwbG9hZCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoVXBsb2FkLCBfQ29tcG9uZW50KTtcbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihVcGxvYWQpO1xuICBmdW5jdGlvbiBVcGxvYWQoKSB7XG4gICAgdmFyIF90aGlzO1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBVcGxvYWQpO1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbC5hcHBseShfc3VwZXIsIFt0aGlzXS5jb25jYXQoYXJncykpO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJ1cGxvYWRlclwiLCB2b2lkIDApO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJzYXZlVXBsb2FkZXJcIiwgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIF90aGlzLnVwbG9hZGVyID0gbm9kZTtcbiAgICB9KTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgX2NyZWF0ZUNsYXNzKFVwbG9hZCwgW3tcbiAgICBrZXk6IFwiYWJvcnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWJvcnQoZmlsZSkge1xuICAgICAgdGhpcy51cGxvYWRlci5hYm9ydChmaWxlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBamF4VXBsb2FkLCBfZXh0ZW5kcyh7fSwgdGhpcy5wcm9wcywge1xuICAgICAgICByZWY6IHRoaXMuc2F2ZVVwbG9hZGVyXG4gICAgICB9KSk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBVcGxvYWQ7XG59KENvbXBvbmVudCk7XG5fZGVmaW5lUHJvcGVydHkoVXBsb2FkLCBcImRlZmF1bHRQcm9wc1wiLCB7XG4gIGNvbXBvbmVudDogJ3NwYW4nLFxuICBwcmVmaXhDbHM6ICdyYy11cGxvYWQnLFxuICBkYXRhOiB7fSxcbiAgaGVhZGVyczoge30sXG4gIG5hbWU6ICdmaWxlJyxcbiAgbXVsdGlwYXJ0OiBmYWxzZSxcbiAgb25TdGFydDogZW1wdHksXG4gIG9uRXJyb3I6IGVtcHR5LFxuICBvblN1Y2Nlc3M6IGVtcHR5LFxuICBtdWx0aXBsZTogZmFsc2UsXG4gIGJlZm9yZVVwbG9hZDogbnVsbCxcbiAgY3VzdG9tUmVxdWVzdDogbnVsbCxcbiAgd2l0aENyZWRlbnRpYWxzOiBmYWxzZSxcbiAgb3BlbkZpbGVEaWFsb2dPbkNsaWNrOiB0cnVlLFxuICBoYXNDb250cm9sSW5zaWRlOiBmYWxzZVxufSk7XG5leHBvcnQgZGVmYXVsdCBVcGxvYWQ7IiwgImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX3JlZ2VuZXJhdG9yUnVudGltZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vcmVnZW5lcmF0b3JSdW50aW1lXCI7XG5pbXBvcnQgX2FzeW5jVG9HZW5lcmF0b3IgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2FzeW5jVG9HZW5lcmF0b3JcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3NlcnRUaGlzSW5pdGlhbGl6ZWRcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzXCI7XG5pbXBvcnQgX2NyZWF0ZVN1cGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVTdXBlclwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJjb21wb25lbnRcIiwgXCJwcmVmaXhDbHNcIiwgXCJjbGFzc05hbWVcIiwgXCJjbGFzc05hbWVzXCIsIFwiZGlzYWJsZWRcIiwgXCJpZFwiLCBcIm5hbWVcIiwgXCJzdHlsZVwiLCBcInN0eWxlc1wiLCBcIm11bHRpcGxlXCIsIFwiYWNjZXB0XCIsIFwiY2FwdHVyZVwiLCBcImNoaWxkcmVuXCIsIFwiZGlyZWN0b3J5XCIsIFwib3BlbkZpbGVEaWFsb2dPbkNsaWNrXCIsIFwib25Nb3VzZUVudGVyXCIsIFwib25Nb3VzZUxlYXZlXCIsIFwiaGFzQ29udHJvbEluc2lkZVwiXTtcbi8qIGVzbGludCByZWFjdC9uby1pcy1tb3VudGVkOjAscmVhY3Qvc29ydC1jb21wOjAscmVhY3QvcHJvcC10eXBlczowICovXG5pbXBvcnQgY2xzeCBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBwaWNrQXR0cnMgZnJvbSBcInJjLXV0aWwvZXMvcGlja0F0dHJzXCI7XG5pbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGF0dHJBY2NlcHQgZnJvbSBcIi4vYXR0ci1hY2NlcHRcIjtcbmltcG9ydCBkZWZhdWx0UmVxdWVzdCBmcm9tIFwiLi9yZXF1ZXN0XCI7XG5pbXBvcnQgdHJhdmVyc2VGaWxlVHJlZSBmcm9tIFwiLi90cmF2ZXJzZUZpbGVUcmVlXCI7XG5pbXBvcnQgZ2V0VWlkIGZyb20gXCIuL3VpZFwiO1xudmFyIEFqYXhVcGxvYWRlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoQWpheFVwbG9hZGVyLCBfQ29tcG9uZW50KTtcbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihBamF4VXBsb2FkZXIpO1xuICBmdW5jdGlvbiBBamF4VXBsb2FkZXIoKSB7XG4gICAgdmFyIF90aGlzO1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBamF4VXBsb2FkZXIpO1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbC5hcHBseShfc3VwZXIsIFt0aGlzXS5jb25jYXQoYXJncykpO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJzdGF0ZVwiLCB7XG4gICAgICB1aWQ6IGdldFVpZCgpXG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInJlcXNcIiwge30pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJmaWxlSW5wdXRcIiwgdm9pZCAwKTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiX2lzTW91bnRlZFwiLCB2b2lkIDApO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvbkNoYW5nZVwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMsXG4gICAgICAgIGFjY2VwdCA9IF90aGlzJHByb3BzLmFjY2VwdCxcbiAgICAgICAgZGlyZWN0b3J5ID0gX3RoaXMkcHJvcHMuZGlyZWN0b3J5O1xuICAgICAgdmFyIGZpbGVzID0gZS50YXJnZXQuZmlsZXM7XG4gICAgICB2YXIgYWNjZXB0ZWRGaWxlcyA9IF90b0NvbnN1bWFibGVBcnJheShmaWxlcykuZmlsdGVyKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgIHJldHVybiAhZGlyZWN0b3J5IHx8IGF0dHJBY2NlcHQoZmlsZSwgYWNjZXB0KTtcbiAgICAgIH0pO1xuICAgICAgX3RoaXMudXBsb2FkRmlsZXMoYWNjZXB0ZWRGaWxlcyk7XG4gICAgICBfdGhpcy5yZXNldCgpO1xuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvbkNsaWNrXCIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgdmFyIGVsID0gX3RoaXMuZmlsZUlucHV0O1xuICAgICAgaWYgKCFlbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgdmFyIG9uQ2xpY2sgPSBfdGhpcy5wcm9wcy5vbkNsaWNrO1xuICAgICAgaWYgKHRhcmdldCAmJiB0YXJnZXQudGFnTmFtZSA9PT0gJ0JVVFRPTicpIHtcbiAgICAgICAgdmFyIHBhcmVudCA9IGVsLnBhcmVudE5vZGU7XG4gICAgICAgIHBhcmVudC5mb2N1cygpO1xuICAgICAgICB0YXJnZXQuYmx1cigpO1xuICAgICAgfVxuICAgICAgZWwuY2xpY2soKTtcbiAgICAgIGlmIChvbkNsaWNrKSB7XG4gICAgICAgIG9uQ2xpY2soZXZlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvbktleURvd25cIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgICBfdGhpcy5vbkNsaWNrKGUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvbkZpbGVEcm9wT3JQYXN0ZVwiLCAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9yZWYgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoZSkge1xuICAgICAgICB2YXIgX3RoaXMkcHJvcHMyLCBtdWx0aXBsZSwgYWNjZXB0LCBkaXJlY3RvcnksIGl0ZW1zLCBmaWxlcywgZGF0YVRyYW5zZmVyLCBjbGlwYm9hcmREYXRhLCBhY2NlcHRGaWxlcztcbiAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICBpZiAoIShlLnR5cGUgPT09ICdkcmFnb3ZlcicpKSB7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdChcInJldHVyblwiKTtcbiAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgX3RoaXMkcHJvcHMyID0gX3RoaXMucHJvcHMsIG11bHRpcGxlID0gX3RoaXMkcHJvcHMyLm11bHRpcGxlLCBhY2NlcHQgPSBfdGhpcyRwcm9wczIuYWNjZXB0LCBkaXJlY3RvcnkgPSBfdGhpcyRwcm9wczIuZGlyZWN0b3J5O1xuICAgICAgICAgICAgICBpdGVtcyA9IFtdO1xuICAgICAgICAgICAgICBmaWxlcyA9IFtdO1xuICAgICAgICAgICAgICBpZiAoZS50eXBlID09PSAnZHJvcCcpIHtcbiAgICAgICAgICAgICAgICBkYXRhVHJhbnNmZXIgPSBlLmRhdGFUcmFuc2ZlcjtcbiAgICAgICAgICAgICAgICBpdGVtcyA9IF90b0NvbnN1bWFibGVBcnJheShkYXRhVHJhbnNmZXIuaXRlbXMgfHwgW10pO1xuICAgICAgICAgICAgICAgIGZpbGVzID0gX3RvQ29uc3VtYWJsZUFycmF5KGRhdGFUcmFuc2Zlci5maWxlcyB8fCBbXSk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS50eXBlID09PSAncGFzdGUnKSB7XG4gICAgICAgICAgICAgICAgY2xpcGJvYXJkRGF0YSA9IGUuY2xpcGJvYXJkRGF0YTtcbiAgICAgICAgICAgICAgICBpdGVtcyA9IF90b0NvbnN1bWFibGVBcnJheShjbGlwYm9hcmREYXRhLml0ZW1zIHx8IFtdKTtcbiAgICAgICAgICAgICAgICBmaWxlcyA9IF90b0NvbnN1bWFibGVBcnJheShjbGlwYm9hcmREYXRhLmZpbGVzIHx8IFtdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoIWRpcmVjdG9yeSkge1xuICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxNDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTA7XG4gICAgICAgICAgICAgIHJldHVybiB0cmF2ZXJzZUZpbGVUcmVlKEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGl0ZW1zKSwgZnVuY3Rpb24gKF9maWxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF0dHJBY2NlcHQoX2ZpbGUsIF90aGlzLnByb3BzLmFjY2VwdCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgZmlsZXMgPSBfY29udGV4dC5zZW50O1xuICAgICAgICAgICAgICBfdGhpcy51cGxvYWRGaWxlcyhmaWxlcyk7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxNztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgICBhY2NlcHRGaWxlcyA9IF90b0NvbnN1bWFibGVBcnJheShmaWxlcykuZmlsdGVyKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF0dHJBY2NlcHQoZmlsZSwgYWNjZXB0KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGlmIChtdWx0aXBsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBhY2NlcHRGaWxlcyA9IGZpbGVzLnNsaWNlKDAsIDEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIF90aGlzLnVwbG9hZEZpbGVzKGFjY2VwdEZpbGVzKTtcbiAgICAgICAgICAgIGNhc2UgMTc6XG4gICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBfY2FsbGVlKTtcbiAgICAgIH0pKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoX3gpIHtcbiAgICAgICAgcmV0dXJuIF9yZWYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgfSgpKTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25QcmVQYXN0ZVwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHBhc3RhYmxlID0gX3RoaXMucHJvcHMucGFzdGFibGU7XG4gICAgICBpZiAocGFzdGFibGUpIHtcbiAgICAgICAgX3RoaXMub25GaWxlRHJvcE9yUGFzdGUoZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInVwbG9hZEZpbGVzXCIsIGZ1bmN0aW9uIChmaWxlcykge1xuICAgICAgdmFyIG9yaWdpbkZpbGVzID0gX3RvQ29uc3VtYWJsZUFycmF5KGZpbGVzKTtcbiAgICAgIHZhciBwb3N0RmlsZXMgPSBvcmlnaW5GaWxlcy5tYXAoZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIGZpbGUudWlkID0gZ2V0VWlkKCk7XG4gICAgICAgIHJldHVybiBfdGhpcy5wcm9jZXNzRmlsZShmaWxlLCBvcmlnaW5GaWxlcyk7XG4gICAgICB9KTtcblxuICAgICAgLy8gQmF0Y2ggdXBsb2FkIGZpbGVzXG4gICAgICBQcm9taXNlLmFsbChwb3N0RmlsZXMpLnRoZW4oZnVuY3Rpb24gKGZpbGVMaXN0KSB7XG4gICAgICAgIHZhciBvbkJhdGNoU3RhcnQgPSBfdGhpcy5wcm9wcy5vbkJhdGNoU3RhcnQ7XG4gICAgICAgIG9uQmF0Y2hTdGFydCA9PT0gbnVsbCB8fCBvbkJhdGNoU3RhcnQgPT09IHZvaWQgMCB8fCBvbkJhdGNoU3RhcnQoZmlsZUxpc3QubWFwKGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgICAgIHZhciBvcmlnaW4gPSBfcmVmMi5vcmlnaW4sXG4gICAgICAgICAgICBwYXJzZWRGaWxlID0gX3JlZjIucGFyc2VkRmlsZTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZmlsZTogb3JpZ2luLFxuICAgICAgICAgICAgcGFyc2VkRmlsZTogcGFyc2VkRmlsZVxuICAgICAgICAgIH07XG4gICAgICAgIH0pKTtcbiAgICAgICAgZmlsZUxpc3QuZmlsdGVyKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgICAgcmV0dXJuIGZpbGUucGFyc2VkRmlsZSAhPT0gbnVsbDtcbiAgICAgICAgfSkuZm9yRWFjaChmdW5jdGlvbiAoZmlsZSkge1xuICAgICAgICAgIF90aGlzLnBvc3QoZmlsZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgLyoqXG4gICAgICogUHJvY2VzcyBmaWxlIGJlZm9yZSB1cGxvYWQuIFdoZW4gYWxsIHRoZSBmaWxlIGlzIHJlYWR5LCB3ZSBzdGFydCB1cGxvYWQuXG4gICAgICovXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInByb2Nlc3NGaWxlXCIsIC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3JlZjMgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKGZpbGUsIGZpbGVMaXN0KSB7XG4gICAgICAgIHZhciBiZWZvcmVVcGxvYWQsIHRyYW5zZm9ybWVkRmlsZSwgYWN0aW9uLCBtZXJnZWRBY3Rpb24sIGRhdGEsIG1lcmdlZERhdGEsIHBhcnNlZERhdGEsIHBhcnNlZEZpbGUsIG1lcmdlZFBhcnNlZEZpbGU7XG4gICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lKCkud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7XG4gICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICBiZWZvcmVVcGxvYWQgPSBfdGhpcy5wcm9wcy5iZWZvcmVVcGxvYWQ7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybWVkRmlsZSA9IGZpbGU7XG4gICAgICAgICAgICAgIGlmICghYmVmb3JlVXBsb2FkKSB7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxNDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBfY29udGV4dDIucHJldiA9IDM7XG4gICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gNjtcbiAgICAgICAgICAgICAgcmV0dXJuIGJlZm9yZVVwbG9hZChmaWxlLCBmaWxlTGlzdCk7XG4gICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgIHRyYW5zZm9ybWVkRmlsZSA9IF9jb250ZXh0Mi5zZW50O1xuICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDEyO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgX2NvbnRleHQyLnByZXYgPSA5O1xuICAgICAgICAgICAgICBfY29udGV4dDIudDAgPSBfY29udGV4dDJbXCJjYXRjaFwiXSgzKTtcbiAgICAgICAgICAgICAgLy8gUmVqZWN0aW9uIHdpbGwgYWxzbyB0cmFkZSBhcyBmYWxzZVxuICAgICAgICAgICAgICB0cmFuc2Zvcm1lZEZpbGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICAgIGlmICghKHRyYW5zZm9ybWVkRmlsZSA9PT0gZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxNDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdChcInJldHVyblwiLCB7XG4gICAgICAgICAgICAgICAgb3JpZ2luOiBmaWxlLFxuICAgICAgICAgICAgICAgIHBhcnNlZEZpbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgYWN0aW9uOiBudWxsLFxuICAgICAgICAgICAgICAgIGRhdGE6IG51bGxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgICAvLyBHZXQgbGF0ZXN0IGFjdGlvblxuICAgICAgICAgICAgICBhY3Rpb24gPSBfdGhpcy5wcm9wcy5hY3Rpb247XG4gICAgICAgICAgICAgIGlmICghKHR5cGVvZiBhY3Rpb24gPT09ICdmdW5jdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDE4O1xuICAgICAgICAgICAgICByZXR1cm4gYWN0aW9uKGZpbGUpO1xuICAgICAgICAgICAgY2FzZSAxODpcbiAgICAgICAgICAgICAgbWVyZ2VkQWN0aW9uID0gX2NvbnRleHQyLnNlbnQ7XG4gICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAyMTpcbiAgICAgICAgICAgICAgbWVyZ2VkQWN0aW9uID0gYWN0aW9uO1xuICAgICAgICAgICAgY2FzZSAyMjpcbiAgICAgICAgICAgICAgLy8gR2V0IGxhdGVzdCBkYXRhXG4gICAgICAgICAgICAgIGRhdGEgPSBfdGhpcy5wcm9wcy5kYXRhO1xuICAgICAgICAgICAgICBpZiAoISh0eXBlb2YgZGF0YSA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDI5O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjY7XG4gICAgICAgICAgICAgIHJldHVybiBkYXRhKGZpbGUpO1xuICAgICAgICAgICAgY2FzZSAyNjpcbiAgICAgICAgICAgICAgbWVyZ2VkRGF0YSA9IF9jb250ZXh0Mi5zZW50O1xuICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDMwO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMjk6XG4gICAgICAgICAgICAgIG1lcmdlZERhdGEgPSBkYXRhO1xuICAgICAgICAgICAgY2FzZSAzMDpcbiAgICAgICAgICAgICAgcGFyc2VkRGF0YSA9XG4gICAgICAgICAgICAgIC8vIHN0cmluZyB0eXBlIGlzIGZyb20gbGVnYWN5IGB0cmFuc2Zvcm1GaWxlYC5cbiAgICAgICAgICAgICAgLy8gTm90IHN1cmUgaWYgdGhpcyB3aWxsIHdvcmsgc2luY2Ugbm8gcmVsYXRlZCB0ZXN0IGNhc2Ugd29ya3Mgd2l0aCBpdFxuICAgICAgICAgICAgICAoX3R5cGVvZih0cmFuc2Zvcm1lZEZpbGUpID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgdHJhbnNmb3JtZWRGaWxlID09PSAnc3RyaW5nJykgJiYgdHJhbnNmb3JtZWRGaWxlID8gdHJhbnNmb3JtZWRGaWxlIDogZmlsZTtcbiAgICAgICAgICAgICAgaWYgKHBhcnNlZERhdGEgaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgICAgICAgICAgICAgcGFyc2VkRmlsZSA9IHBhcnNlZERhdGE7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFyc2VkRmlsZSA9IG5ldyBGaWxlKFtwYXJzZWREYXRhXSwgZmlsZS5uYW1lLCB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBmaWxlLnR5cGVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBtZXJnZWRQYXJzZWRGaWxlID0gcGFyc2VkRmlsZTtcbiAgICAgICAgICAgICAgbWVyZ2VkUGFyc2VkRmlsZS51aWQgPSBmaWxlLnVpZDtcbiAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoXCJyZXR1cm5cIiwge1xuICAgICAgICAgICAgICAgIG9yaWdpbjogZmlsZSxcbiAgICAgICAgICAgICAgICBkYXRhOiBtZXJnZWREYXRhLFxuICAgICAgICAgICAgICAgIHBhcnNlZEZpbGU6IG1lcmdlZFBhcnNlZEZpbGUsXG4gICAgICAgICAgICAgICAgYWN0aW9uOiBtZXJnZWRBY3Rpb25cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjYXNlIDM1OlxuICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWUyLCBudWxsLCBbWzMsIDldXSk7XG4gICAgICB9KSk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKF94MiwgX3gzKSB7XG4gICAgICAgIHJldHVybiBfcmVmMy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICB9KCkpO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJzYXZlRmlsZUlucHV0XCIsIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICBfdGhpcy5maWxlSW5wdXQgPSBub2RlO1xuICAgIH0pO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICBfY3JlYXRlQ2xhc3MoQWpheFVwbG9hZGVyLCBbe1xuICAgIGtleTogXCJjb21wb25lbnREaWRNb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIHRoaXMuX2lzTW91bnRlZCA9IHRydWU7XG4gICAgICB2YXIgcGFzdGFibGUgPSB0aGlzLnByb3BzLnBhc3RhYmxlO1xuICAgICAgaWYgKHBhc3RhYmxlKSB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Bhc3RlJywgdGhpcy5vblByZVBhc3RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50V2lsbFVubW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICB0aGlzLl9pc01vdW50ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuYWJvcnQoKTtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Bhc3RlJywgdGhpcy5vblByZVBhc3RlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkVXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICAgIHZhciBwYXN0YWJsZSA9IHRoaXMucHJvcHMucGFzdGFibGU7XG4gICAgICBpZiAocGFzdGFibGUgJiYgIXByZXZQcm9wcy5wYXN0YWJsZSkge1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdwYXN0ZScsIHRoaXMub25QcmVQYXN0ZSk7XG4gICAgICB9IGVsc2UgaWYgKCFwYXN0YWJsZSAmJiBwcmV2UHJvcHMucGFzdGFibGUpIHtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncGFzdGUnLCB0aGlzLm9uUHJlUGFzdGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwb3N0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBvc3QoX3JlZjQpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuICAgICAgdmFyIGRhdGEgPSBfcmVmNC5kYXRhLFxuICAgICAgICBvcmlnaW4gPSBfcmVmNC5vcmlnaW4sXG4gICAgICAgIGFjdGlvbiA9IF9yZWY0LmFjdGlvbixcbiAgICAgICAgcGFyc2VkRmlsZSA9IF9yZWY0LnBhcnNlZEZpbGU7XG4gICAgICBpZiAoIXRoaXMuX2lzTW91bnRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgX3RoaXMkcHJvcHMzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgb25TdGFydCA9IF90aGlzJHByb3BzMy5vblN0YXJ0LFxuICAgICAgICBjdXN0b21SZXF1ZXN0ID0gX3RoaXMkcHJvcHMzLmN1c3RvbVJlcXVlc3QsXG4gICAgICAgIG5hbWUgPSBfdGhpcyRwcm9wczMubmFtZSxcbiAgICAgICAgaGVhZGVycyA9IF90aGlzJHByb3BzMy5oZWFkZXJzLFxuICAgICAgICB3aXRoQ3JlZGVudGlhbHMgPSBfdGhpcyRwcm9wczMud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICBtZXRob2QgPSBfdGhpcyRwcm9wczMubWV0aG9kO1xuICAgICAgdmFyIHVpZCA9IG9yaWdpbi51aWQ7XG4gICAgICB2YXIgcmVxdWVzdCA9IGN1c3RvbVJlcXVlc3QgfHwgZGVmYXVsdFJlcXVlc3Q7XG4gICAgICB2YXIgcmVxdWVzdE9wdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiBhY3Rpb24sXG4gICAgICAgIGZpbGVuYW1lOiBuYW1lLFxuICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICBmaWxlOiBwYXJzZWRGaWxlLFxuICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHdpdGhDcmVkZW50aWFscyxcbiAgICAgICAgbWV0aG9kOiBtZXRob2QgfHwgJ3Bvc3QnLFxuICAgICAgICBvblByb2dyZXNzOiBmdW5jdGlvbiBvblByb2dyZXNzKGUpIHtcbiAgICAgICAgICB2YXIgb25Qcm9ncmVzcyA9IF90aGlzMi5wcm9wcy5vblByb2dyZXNzO1xuICAgICAgICAgIG9uUHJvZ3Jlc3MgPT09IG51bGwgfHwgb25Qcm9ncmVzcyA9PT0gdm9pZCAwIHx8IG9uUHJvZ3Jlc3MoZSwgcGFyc2VkRmlsZSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uU3VjY2VzczogZnVuY3Rpb24gb25TdWNjZXNzKHJldCwgeGhyKSB7XG4gICAgICAgICAgdmFyIG9uU3VjY2VzcyA9IF90aGlzMi5wcm9wcy5vblN1Y2Nlc3M7XG4gICAgICAgICAgb25TdWNjZXNzID09PSBudWxsIHx8IG9uU3VjY2VzcyA9PT0gdm9pZCAwIHx8IG9uU3VjY2VzcyhyZXQsIHBhcnNlZEZpbGUsIHhocik7XG4gICAgICAgICAgZGVsZXRlIF90aGlzMi5yZXFzW3VpZF07XG4gICAgICAgIH0sXG4gICAgICAgIG9uRXJyb3I6IGZ1bmN0aW9uIG9uRXJyb3IoZXJyLCByZXQpIHtcbiAgICAgICAgICB2YXIgb25FcnJvciA9IF90aGlzMi5wcm9wcy5vbkVycm9yO1xuICAgICAgICAgIG9uRXJyb3IgPT09IG51bGwgfHwgb25FcnJvciA9PT0gdm9pZCAwIHx8IG9uRXJyb3IoZXJyLCByZXQsIHBhcnNlZEZpbGUpO1xuICAgICAgICAgIGRlbGV0ZSBfdGhpczIucmVxc1t1aWRdO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgb25TdGFydChvcmlnaW4pO1xuICAgICAgdGhpcy5yZXFzW3VpZF0gPSByZXF1ZXN0KHJlcXVlc3RPcHRpb24pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZXNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNldCgpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICB1aWQ6IGdldFVpZCgpXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWJvcnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWJvcnQoZmlsZSkge1xuICAgICAgdmFyIHJlcXMgPSB0aGlzLnJlcXM7XG4gICAgICBpZiAoZmlsZSkge1xuICAgICAgICB2YXIgdWlkID0gZmlsZS51aWQgPyBmaWxlLnVpZCA6IGZpbGU7XG4gICAgICAgIGlmIChyZXFzW3VpZF0gJiYgcmVxc1t1aWRdLmFib3J0KSB7XG4gICAgICAgICAgcmVxc1t1aWRdLmFib3J0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIHJlcXNbdWlkXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIE9iamVjdC5rZXlzKHJlcXMpLmZvckVhY2goZnVuY3Rpb24gKHVpZCkge1xuICAgICAgICAgIGlmIChyZXFzW3VpZF0gJiYgcmVxc1t1aWRdLmFib3J0KSB7XG4gICAgICAgICAgICByZXFzW3VpZF0uYWJvcnQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVsZXRlIHJlcXNbdWlkXTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM0ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgVGFnID0gX3RoaXMkcHJvcHM0LmNvbXBvbmVudCxcbiAgICAgICAgcHJlZml4Q2xzID0gX3RoaXMkcHJvcHM0LnByZWZpeENscyxcbiAgICAgICAgY2xhc3NOYW1lID0gX3RoaXMkcHJvcHM0LmNsYXNzTmFtZSxcbiAgICAgICAgX3RoaXMkcHJvcHM0JGNsYXNzTmFtID0gX3RoaXMkcHJvcHM0LmNsYXNzTmFtZXMsXG4gICAgICAgIGNsYXNzTmFtZXMgPSBfdGhpcyRwcm9wczQkY2xhc3NOYW0gPT09IHZvaWQgMCA/IHt9IDogX3RoaXMkcHJvcHM0JGNsYXNzTmFtLFxuICAgICAgICBkaXNhYmxlZCA9IF90aGlzJHByb3BzNC5kaXNhYmxlZCxcbiAgICAgICAgaWQgPSBfdGhpcyRwcm9wczQuaWQsXG4gICAgICAgIG5hbWUgPSBfdGhpcyRwcm9wczQubmFtZSxcbiAgICAgICAgc3R5bGUgPSBfdGhpcyRwcm9wczQuc3R5bGUsXG4gICAgICAgIF90aGlzJHByb3BzNCRzdHlsZXMgPSBfdGhpcyRwcm9wczQuc3R5bGVzLFxuICAgICAgICBzdHlsZXMgPSBfdGhpcyRwcm9wczQkc3R5bGVzID09PSB2b2lkIDAgPyB7fSA6IF90aGlzJHByb3BzNCRzdHlsZXMsXG4gICAgICAgIG11bHRpcGxlID0gX3RoaXMkcHJvcHM0Lm11bHRpcGxlLFxuICAgICAgICBhY2NlcHQgPSBfdGhpcyRwcm9wczQuYWNjZXB0LFxuICAgICAgICBjYXB0dXJlID0gX3RoaXMkcHJvcHM0LmNhcHR1cmUsXG4gICAgICAgIGNoaWxkcmVuID0gX3RoaXMkcHJvcHM0LmNoaWxkcmVuLFxuICAgICAgICBkaXJlY3RvcnkgPSBfdGhpcyRwcm9wczQuZGlyZWN0b3J5LFxuICAgICAgICBvcGVuRmlsZURpYWxvZ09uQ2xpY2sgPSBfdGhpcyRwcm9wczQub3BlbkZpbGVEaWFsb2dPbkNsaWNrLFxuICAgICAgICBvbk1vdXNlRW50ZXIgPSBfdGhpcyRwcm9wczQub25Nb3VzZUVudGVyLFxuICAgICAgICBvbk1vdXNlTGVhdmUgPSBfdGhpcyRwcm9wczQub25Nb3VzZUxlYXZlLFxuICAgICAgICBoYXNDb250cm9sSW5zaWRlID0gX3RoaXMkcHJvcHM0Lmhhc0NvbnRyb2xJbnNpZGUsXG4gICAgICAgIG90aGVyUHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3RoaXMkcHJvcHM0LCBfZXhjbHVkZWQpO1xuICAgICAgdmFyIGNscyA9IGNsc3goX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoe30sIHByZWZpeENscywgdHJ1ZSksIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZGlzYWJsZWRcIiksIGRpc2FibGVkKSwgY2xhc3NOYW1lLCBjbGFzc05hbWUpKTtcbiAgICAgIC8vIGJlY2F1c2UgaW5wdXQgZG9uJ3QgaGF2ZSBkaXJlY3Rvcnkvd2Via2l0ZGlyZWN0b3J5IHR5cGUgZGVjbGFyYXRpb25cbiAgICAgIHZhciBkaXJQcm9wcyA9IGRpcmVjdG9yeSA/IHtcbiAgICAgICAgZGlyZWN0b3J5OiAnZGlyZWN0b3J5JyxcbiAgICAgICAgd2Via2l0ZGlyZWN0b3J5OiAnd2Via2l0ZGlyZWN0b3J5J1xuICAgICAgfSA6IHt9O1xuICAgICAgdmFyIGV2ZW50cyA9IGRpc2FibGVkID8ge30gOiB7XG4gICAgICAgIG9uQ2xpY2s6IG9wZW5GaWxlRGlhbG9nT25DbGljayA/IHRoaXMub25DbGljayA6IGZ1bmN0aW9uICgpIHt9LFxuICAgICAgICBvbktleURvd246IG9wZW5GaWxlRGlhbG9nT25DbGljayA/IHRoaXMub25LZXlEb3duIDogZnVuY3Rpb24gKCkge30sXG4gICAgICAgIG9uTW91c2VFbnRlcjogb25Nb3VzZUVudGVyLFxuICAgICAgICBvbk1vdXNlTGVhdmU6IG9uTW91c2VMZWF2ZSxcbiAgICAgICAgb25Ecm9wOiB0aGlzLm9uRmlsZURyb3BPclBhc3RlLFxuICAgICAgICBvbkRyYWdPdmVyOiB0aGlzLm9uRmlsZURyb3BPclBhc3RlLFxuICAgICAgICB0YWJJbmRleDogaGFzQ29udHJvbEluc2lkZSA/IHVuZGVmaW5lZCA6ICcwJ1xuICAgICAgfTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUYWcsIF9leHRlbmRzKHt9LCBldmVudHMsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBjbHMsXG4gICAgICAgIHJvbGU6IGhhc0NvbnRyb2xJbnNpZGUgPyB1bmRlZmluZWQgOiAnYnV0dG9uJyxcbiAgICAgICAgc3R5bGU6IHN0eWxlXG4gICAgICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLCBfZXh0ZW5kcyh7fSwgcGlja0F0dHJzKG90aGVyUHJvcHMsIHtcbiAgICAgICAgYXJpYTogdHJ1ZSxcbiAgICAgICAgZGF0YTogdHJ1ZVxuICAgICAgfSksIHtcbiAgICAgICAgaWQ6IGlkXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy81MDY0MyxcbiAgICAgICAgICogaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LWNvbXBvbmVudC91cGxvYWQvcHVsbC81NzUjaXNzdWVjb21tZW50LTIzMjA2NDY1NTJcbiAgICAgICAgICovLFxuICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAgIHR5cGU6IFwiZmlsZVwiLFxuICAgICAgICByZWY6IHRoaXMuc2F2ZUZpbGVJbnB1dCxcbiAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljayhlKSB7XG4gICAgICAgICAgcmV0dXJuIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH0gLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMTk5NDhcbiAgICAgICAgLFxuICAgICAgICBrZXk6IHRoaXMuc3RhdGUudWlkLFxuICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZCh7XG4gICAgICAgICAgZGlzcGxheTogJ25vbmUnXG4gICAgICAgIH0sIHN0eWxlcy5pbnB1dCksXG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcy5pbnB1dCxcbiAgICAgICAgYWNjZXB0OiBhY2NlcHRcbiAgICAgIH0sIGRpclByb3BzLCB7XG4gICAgICAgIG11bHRpcGxlOiBtdWx0aXBsZSxcbiAgICAgICAgb25DaGFuZ2U6IHRoaXMub25DaGFuZ2VcbiAgICAgIH0sIGNhcHR1cmUgIT0gbnVsbCA/IHtcbiAgICAgICAgY2FwdHVyZTogY2FwdHVyZVxuICAgICAgfSA6IHt9KSksIGNoaWxkcmVuKTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIEFqYXhVcGxvYWRlcjtcbn0oQ29tcG9uZW50KTtcbmV4cG9ydCBkZWZhdWx0IEFqYXhVcGxvYWRlcjsiLCAiaW1wb3J0IHdhcm5pbmcgZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIChmaWxlLCBhY2NlcHRlZEZpbGVzKSB7XG4gIGlmIChmaWxlICYmIGFjY2VwdGVkRmlsZXMpIHtcbiAgICB2YXIgYWNjZXB0ZWRGaWxlc0FycmF5ID0gQXJyYXkuaXNBcnJheShhY2NlcHRlZEZpbGVzKSA/IGFjY2VwdGVkRmlsZXMgOiBhY2NlcHRlZEZpbGVzLnNwbGl0KCcsJyk7XG4gICAgdmFyIGZpbGVOYW1lID0gZmlsZS5uYW1lIHx8ICcnO1xuICAgIHZhciBtaW1lVHlwZSA9IGZpbGUudHlwZSB8fCAnJztcbiAgICB2YXIgYmFzZU1pbWVUeXBlID0gbWltZVR5cGUucmVwbGFjZSgvXFwvLiokLywgJycpO1xuICAgIHJldHVybiBhY2NlcHRlZEZpbGVzQXJyYXkuc29tZShmdW5jdGlvbiAodHlwZSkge1xuICAgICAgdmFyIHZhbGlkVHlwZSA9IHR5cGUudHJpbSgpO1xuICAgICAgLy8gVGhpcyBpcyBzb21ldGhpbmcgbGlrZSAqLyosKiAgYWxsb3cgYWxsIGZpbGVzXG4gICAgICBpZiAoL15cXCooXFwvXFwqKT8kLy50ZXN0KHR5cGUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBsaWtlIC5qcGcsIC5wbmdcbiAgICAgIGlmICh2YWxpZFR5cGUuY2hhckF0KDApID09PSAnLicpIHtcbiAgICAgICAgdmFyIGxvd2VyRmlsZU5hbWUgPSBmaWxlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB2YXIgbG93ZXJUeXBlID0gdmFsaWRUeXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHZhciBhZmZpeExpc3QgPSBbbG93ZXJUeXBlXTtcbiAgICAgICAgaWYgKGxvd2VyVHlwZSA9PT0gJy5qcGcnIHx8IGxvd2VyVHlwZSA9PT0gJy5qcGVnJykge1xuICAgICAgICAgIGFmZml4TGlzdCA9IFsnLmpwZycsICcuanBlZyddO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhZmZpeExpc3Quc29tZShmdW5jdGlvbiAoYWZmaXgpIHtcbiAgICAgICAgICByZXR1cm4gbG93ZXJGaWxlTmFtZS5lbmRzV2l0aChhZmZpeCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGlzIGlzIHNvbWV0aGluZyBsaWtlIGEgaW1hZ2UvKiBtaW1lIHR5cGVcbiAgICAgIGlmICgvXFwvXFwqJC8udGVzdCh2YWxpZFR5cGUpKSB7XG4gICAgICAgIHJldHVybiBiYXNlTWltZVR5cGUgPT09IHZhbGlkVHlwZS5yZXBsYWNlKC9cXC8uKiQvLCAnJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIEZ1bGwgbWF0Y2hcbiAgICAgIGlmIChtaW1lVHlwZSA9PT0gdmFsaWRUeXBlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBJbnZhbGlkYXRlIHR5cGUgc2hvdWxkIHNraXBcbiAgICAgIGlmICgvXlxcdyskLy50ZXN0KHZhbGlkVHlwZSkpIHtcbiAgICAgICAgd2FybmluZyhmYWxzZSwgXCJVcGxvYWQgdGFrZXMgYW4gaW52YWxpZGF0ZSAnYWNjZXB0JyB0eXBlICdcIi5jb25jYXQodmFsaWRUeXBlLCBcIicuU2tpcCBmb3IgY2hlY2suXCIpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59KTsiLCAiZnVuY3Rpb24gZ2V0RXJyb3Iob3B0aW9uLCB4aHIpIHtcbiAgdmFyIG1zZyA9IFwiY2Fubm90IFwiLmNvbmNhdChvcHRpb24ubWV0aG9kLCBcIiBcIikuY29uY2F0KG9wdGlvbi5hY3Rpb24sIFwiIFwiKS5jb25jYXQoeGhyLnN0YXR1cywgXCInXCIpO1xuICB2YXIgZXJyID0gbmV3IEVycm9yKG1zZyk7XG4gIGVyci5zdGF0dXMgPSB4aHIuc3RhdHVzO1xuICBlcnIubWV0aG9kID0gb3B0aW9uLm1ldGhvZDtcbiAgZXJyLnVybCA9IG9wdGlvbi5hY3Rpb247XG4gIHJldHVybiBlcnI7XG59XG5mdW5jdGlvbiBnZXRCb2R5KHhocikge1xuICB2YXIgdGV4dCA9IHhoci5yZXNwb25zZVRleHQgfHwgeGhyLnJlc3BvbnNlO1xuICBpZiAoIXRleHQpIHtcbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHRleHQpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVwbG9hZChvcHRpb24pIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgaWYgKG9wdGlvbi5vblByb2dyZXNzICYmIHhoci51cGxvYWQpIHtcbiAgICB4aHIudXBsb2FkLm9ucHJvZ3Jlc3MgPSBmdW5jdGlvbiBwcm9ncmVzcyhlKSB7XG4gICAgICBpZiAoZS50b3RhbCA+IDApIHtcbiAgICAgICAgZS5wZXJjZW50ID0gZS5sb2FkZWQgLyBlLnRvdGFsICogMTAwO1xuICAgICAgfVxuICAgICAgb3B0aW9uLm9uUHJvZ3Jlc3MoZSk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICB2YXIgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgaWYgKG9wdGlvbi5kYXRhKSB7XG4gICAgT2JqZWN0LmtleXMob3B0aW9uLmRhdGEpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgdmFyIHZhbHVlID0gb3B0aW9uLmRhdGFba2V5XTtcbiAgICAgIC8vIHN1cHBvcnQga2V5LXZhbHVlIGFycmF5IGRhdGFcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgLy8geyBsaXN0OiBbIDExLCAyMiBdIH1cbiAgICAgICAgICAvLyBmb3JtRGF0YS5hcHBlbmQoJ2xpc3RbXScsIDExKTtcbiAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoXCJcIi5jb25jYXQoa2V5LCBcIltdXCIpLCBpdGVtKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIHZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICBpZiAob3B0aW9uLmZpbGUgaW5zdGFuY2VvZiBCbG9iKSB7XG4gICAgZm9ybURhdGEuYXBwZW5kKG9wdGlvbi5maWxlbmFtZSwgb3B0aW9uLmZpbGUsIG9wdGlvbi5maWxlLm5hbWUpO1xuICB9IGVsc2Uge1xuICAgIGZvcm1EYXRhLmFwcGVuZChvcHRpb24uZmlsZW5hbWUsIG9wdGlvbi5maWxlKTtcbiAgfVxuICB4aHIub25lcnJvciA9IGZ1bmN0aW9uIGVycm9yKGUpIHtcbiAgICBvcHRpb24ub25FcnJvcihlKTtcbiAgfTtcbiAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uIG9ubG9hZCgpIHtcbiAgICAvLyBhbGxvdyBzdWNjZXNzIHdoZW4gMnh4IHN0YXR1c1xuICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vcmVhY3QtY29tcG9uZW50L3VwbG9hZC9pc3N1ZXMvMzRcbiAgICBpZiAoeGhyLnN0YXR1cyA8IDIwMCB8fCB4aHIuc3RhdHVzID49IDMwMCkge1xuICAgICAgcmV0dXJuIG9wdGlvbi5vbkVycm9yKGdldEVycm9yKG9wdGlvbiwgeGhyKSwgZ2V0Qm9keSh4aHIpKTtcbiAgICB9XG4gICAgcmV0dXJuIG9wdGlvbi5vblN1Y2Nlc3MoZ2V0Qm9keSh4aHIpLCB4aHIpO1xuICB9O1xuICB4aHIub3BlbihvcHRpb24ubWV0aG9kLCBvcHRpb24uYWN0aW9uLCB0cnVlKTtcblxuICAvLyBIYXMgdG8gYmUgYWZ0ZXIgYC5vcGVuKClgLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VueW8vZHJvcHpvbmUvaXNzdWVzLzE3OVxuICBpZiAob3B0aW9uLndpdGhDcmVkZW50aWFscyAmJiAnd2l0aENyZWRlbnRpYWxzJyBpbiB4aHIpIHtcbiAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gdHJ1ZTtcbiAgfVxuICB2YXIgaGVhZGVycyA9IG9wdGlvbi5oZWFkZXJzIHx8IHt9O1xuXG4gIC8vIHdoZW4gc2V0IGhlYWRlcnNbJ1gtUmVxdWVzdGVkLVdpdGgnXSA9IG51bGwgLCBjYW4gY2xvc2UgZGVmYXVsdCBYSFIgaGVhZGVyXG4gIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vcmVhY3QtY29tcG9uZW50L3VwbG9hZC9pc3N1ZXMvMzNcbiAgaWYgKGhlYWRlcnNbJ1gtUmVxdWVzdGVkLVdpdGgnXSAhPT0gbnVsbCkge1xuICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdYLVJlcXVlc3RlZC1XaXRoJywgJ1hNTEh0dHBSZXF1ZXN0Jyk7XG4gIH1cbiAgT2JqZWN0LmtleXMoaGVhZGVycykuZm9yRWFjaChmdW5jdGlvbiAoaCkge1xuICAgIGlmIChoZWFkZXJzW2hdICE9PSBudWxsKSB7XG4gICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoLCBoZWFkZXJzW2hdKTtcbiAgICB9XG4gIH0pO1xuICB4aHIuc2VuZChmb3JtRGF0YSk7XG4gIHJldHVybiB7XG4gICAgYWJvcnQ6IGZ1bmN0aW9uIGFib3J0KCkge1xuICAgICAgeGhyLmFib3J0KCk7XG4gICAgfVxuICB9O1xufSIsICJpbXBvcnQgX3JlZ2VuZXJhdG9yUnVudGltZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vcmVnZW5lcmF0b3JSdW50aW1lXCI7XG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF9hc3luY1RvR2VuZXJhdG9yIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3luY1RvR2VuZXJhdG9yXCI7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy81MDA4MFxudmFyIHRyYXZlcnNlRmlsZVRyZWUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZiA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZSgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTQoZmlsZXMsIGlzQWNjZXB0ZWQpIHtcbiAgICB2YXIgZmxhdHRlbkZpbGVMaXN0LCBwcm9ncmVzc0ZpbGVMaXN0LCByZWFkRGlyZWN0b3J5LCBfcmVhZERpcmVjdG9yeSwgcmVhZEZpbGUsIF9yZWFkRmlsZSwgX3RyYXZlcnNlRmlsZVRyZWUsIHdpcEluZGV4O1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lKCkud3JhcChmdW5jdGlvbiBfY2FsbGVlNCQoX2NvbnRleHQ0KSB7XG4gICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDQucHJldiA9IF9jb250ZXh0NC5uZXh0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBfcmVhZEZpbGUgPSBmdW5jdGlvbiBfcmVhZEZpbGUzKCkge1xuICAgICAgICAgICAgX3JlYWRGaWxlID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lKCkubWFyayhmdW5jdGlvbiBfY2FsbGVlMyhpdGVtKSB7XG4gICAgICAgICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lKCkud3JhcChmdW5jdGlvbiBfY2FsbGVlMyQoX2NvbnRleHQzKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQzLnByZXYgPSBfY29udGV4dDMubmV4dCkge1xuICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLmFicnVwdChcInJldHVyblwiLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzbG92ZSkge1xuICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uZmlsZShmdW5jdGlvbiAoZmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQWNjZXB0ZWQoZmlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMTY0MjZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uZnVsbFBhdGggJiYgIWZpbGUud2Via2l0UmVsYXRpdmVQYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZmlsZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Via2l0UmVsYXRpdmVQYXRoOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS53ZWJraXRSZWxhdGl2ZVBhdGggPSBpdGVtLmZ1bGxQYXRoLnJlcGxhY2UoL15cXC8vLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZmlsZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Via2l0UmVsYXRpdmVQYXRoOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2xvdmUoZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXNsb3ZlKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuc3RvcCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSwgX2NhbGxlZTMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgcmV0dXJuIF9yZWFkRmlsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgcmVhZEZpbGUgPSBmdW5jdGlvbiBfcmVhZEZpbGUyKF94NCkge1xuICAgICAgICAgICAgcmV0dXJuIF9yZWFkRmlsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgX3JlYWREaXJlY3RvcnkgPSBmdW5jdGlvbiBfcmVhZERpcmVjdG9yeTMoKSB7XG4gICAgICAgICAgICBfcmVhZERpcmVjdG9yeSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZSgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIoZGlyZWN0b3J5KSB7XG4gICAgICAgICAgICAgIHZhciBkaXJSZWFkZXIsIGVudHJpZXMsIHJlc3VsdHMsIG4sIGk7XG4gICAgICAgICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lKCkud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkge1xuICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICBkaXJSZWFkZXIgPSBkaXJlY3RvcnkuY3JlYXRlUmVhZGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIGVudHJpZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxMjtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgICAgICAgICAgICAgIGRpclJlYWRlci5yZWFkRW50cmllcyhyZXNvbHZlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShbXSk7XG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gX2NvbnRleHQyLnNlbnQ7XG4gICAgICAgICAgICAgICAgICAgIG4gPSByZXN1bHRzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG4pIHtcbiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDk7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoXCJicmVha1wiLCAxMik7XG4gICAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzLnB1c2gocmVzdWx0c1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KFwicmV0dXJuXCIsIGVudHJpZXMpO1xuICAgICAgICAgICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9LCBfY2FsbGVlMik7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICByZXR1cm4gX3JlYWREaXJlY3RvcnkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJlYWREaXJlY3RvcnkgPSBmdW5jdGlvbiBfcmVhZERpcmVjdG9yeTIoX3gzKSB7XG4gICAgICAgICAgICByZXR1cm4gX3JlYWREaXJlY3RvcnkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGZsYXR0ZW5GaWxlTGlzdCA9IFtdO1xuICAgICAgICAgIHByb2dyZXNzRmlsZUxpc3QgPSBbXTtcbiAgICAgICAgICBmaWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvZ3Jlc3NGaWxlTGlzdC5wdXNoKGZpbGUud2Via2l0R2V0QXNFbnRyeSgpKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAgICAgICBfdHJhdmVyc2VGaWxlVHJlZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX3JlZjIgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoaXRlbSwgcGF0aCkge1xuICAgICAgICAgICAgICB2YXIgX2ZpbGUsIGVudHJpZXM7XG4gICAgICAgICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lKCkud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdChcInJldHVyblwiKTtcbiAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0ucGF0aCA9IHBhdGggfHwgJyc7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXRlbS5pc0ZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTA7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDY7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFkRmlsZShpdGVtKTtcbiAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgX2ZpbGUgPSBfY29udGV4dC5zZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAoX2ZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBmbGF0dGVuRmlsZUxpc3QucHVzaChfZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE1O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXRlbS5pc0RpcmVjdG9yeSkge1xuICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxNTtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTM7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFkRGlyZWN0b3J5KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgICAgICAgICAgZW50cmllcyA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzRmlsZUxpc3QucHVzaC5hcHBseShwcm9ncmVzc0ZpbGVMaXN0LCBfdG9Db25zdW1hYmxlQXJyYXkoZW50cmllcykpO1xuICAgICAgICAgICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0sIF9jYWxsZWUpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIF90cmF2ZXJzZUZpbGVUcmVlKF94NSwgX3g2KSB7XG4gICAgICAgICAgICAgIHJldHVybiBfcmVmMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KCk7XG4gICAgICAgICAgd2lwSW5kZXggPSAwO1xuICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgaWYgKCEod2lwSW5kZXggPCBwcm9ncmVzc0ZpbGVMaXN0Lmxlbmd0aCkpIHtcbiAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gMTU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSAxMjtcbiAgICAgICAgICByZXR1cm4gX3RyYXZlcnNlRmlsZVRyZWUocHJvZ3Jlc3NGaWxlTGlzdFt3aXBJbmRleF0pO1xuICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgIHdpcEluZGV4Kys7XG4gICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSA5O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgIHJldHVybiBfY29udGV4dDQuYWJydXB0KFwicmV0dXJuXCIsIGZsYXR0ZW5GaWxlTGlzdCk7XG4gICAgICAgIGNhc2UgMTY6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0LnN0b3AoKTtcbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlNCk7XG4gIH0pKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIHRyYXZlcnNlRmlsZVRyZWUoX3gsIF94Mikge1xuICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG5leHBvcnQgZGVmYXVsdCB0cmF2ZXJzZUZpbGVUcmVlOyIsICJ2YXIgbm93ID0gK25ldyBEYXRlKCk7XG52YXIgaW5kZXggPSAwO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdWlkKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGx1c3BsdXNcbiAgcmV0dXJuIFwicmMtdXBsb2FkLVwiLmNvbmNhdChub3csIFwiLVwiKS5jb25jYXQoKytpbmRleCk7XG59IiwgImltcG9ydCBVcGxvYWQgZnJvbSBcIi4vVXBsb2FkXCI7XG5leHBvcnQgZGVmYXVsdCBVcGxvYWQ7IiwgImltcG9ydCB7IHVuaXQgfSBmcm9tICdAYW50LWRlc2lnbi9jc3NpbmpzJztcbmNvbnN0IGdlbkRyYWdnZXJTdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENscyxcbiAgICBpY29uQ2xzXG4gIH0gPSB0b2tlbjtcbiAgcmV0dXJuIHtcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS13cmFwcGVyYF06IHtcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWRyYWdgXToge1xuICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAgIGJhY2tncm91bmQ6IHRva2VuLmNvbG9yRmlsbEFsdGVyLFxuICAgICAgICBib3JkZXI6IGAke3VuaXQodG9rZW4ubGluZVdpZHRoKX0gZGFzaGVkICR7dG9rZW4uY29sb3JCb3JkZXJ9YCxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiB0b2tlbi5ib3JkZXJSYWRpdXNMRyxcbiAgICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgICAgIHRyYW5zaXRpb246IGBib3JkZXItY29sb3IgJHt0b2tlbi5tb3Rpb25EdXJhdGlvblNsb3d9YCxcbiAgICAgICAgW2NvbXBvbmVudENsc106IHtcbiAgICAgICAgICBwYWRkaW5nOiB0b2tlbi5wYWRkaW5nXG4gICAgICAgIH0sXG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LWJ0bmBdOiB7XG4gICAgICAgICAgZGlzcGxheTogJ3RhYmxlJyxcbiAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgICAgIG91dGxpbmU6ICdub25lJyxcbiAgICAgICAgICBib3JkZXJSYWRpdXM6IHRva2VuLmJvcmRlclJhZGl1c0xHLFxuICAgICAgICAgICcmOmZvY3VzLXZpc2libGUnOiB7XG4gICAgICAgICAgICBvdXRsaW5lOiBgJHt1bml0KHRva2VuLmxpbmVXaWR0aEZvY3VzKX0gc29saWQgJHt0b2tlbi5jb2xvclByaW1hcnlCb3JkZXJ9YFxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30tZHJhZy1jb250YWluZXJgXToge1xuICAgICAgICAgIGRpc3BsYXk6ICd0YWJsZS1jZWxsJyxcbiAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiAnbWlkZGxlJ1xuICAgICAgICB9LFxuICAgICAgICBbYFxuICAgICAgICAgICY6bm90KCR7Y29tcG9uZW50Q2xzfS1kaXNhYmxlZCk6aG92ZXIsXG4gICAgICAgICAgJi1ob3Zlcjpub3QoJHtjb21wb25lbnRDbHN9LWRpc2FibGVkKVxuICAgICAgICBgXToge1xuICAgICAgICAgIGJvcmRlckNvbG9yOiB0b2tlbi5jb2xvclByaW1hcnlIb3ZlclxuICAgICAgICB9LFxuICAgICAgICBbYHAke2NvbXBvbmVudENsc30tZHJhZy1pY29uYF06IHtcbiAgICAgICAgICBtYXJnaW5Cb3R0b206IHRva2VuLm1hcmdpbixcbiAgICAgICAgICBbaWNvbkNsc106IHtcbiAgICAgICAgICAgIGNvbG9yOiB0b2tlbi5jb2xvclByaW1hcnksXG4gICAgICAgICAgICBmb250U2l6ZTogdG9rZW4udXBsb2FkVGh1bWJuYWlsU2l6ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgW2BwJHtjb21wb25lbnRDbHN9LXRleHRgXToge1xuICAgICAgICAgIG1hcmdpbjogYDAgMCAke3VuaXQodG9rZW4ubWFyZ2luWFhTKX1gLFxuICAgICAgICAgIGNvbG9yOiB0b2tlbi5jb2xvclRleHRIZWFkaW5nLFxuICAgICAgICAgIGZvbnRTaXplOiB0b2tlbi5mb250U2l6ZUxHXG4gICAgICAgIH0sXG4gICAgICAgIFtgcCR7Y29tcG9uZW50Q2xzfS1oaW50YF06IHtcbiAgICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JUZXh0RGVzY3JpcHRpb24sXG4gICAgICAgICAgZm9udFNpemU6IHRva2VuLmZvbnRTaXplXG4gICAgICAgIH0sXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PSBEaXNhYmxlZCA9PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgW2AmJHtjb21wb25lbnRDbHN9LWRpc2FibGVkYF06IHtcbiAgICAgICAgICBbYHAke2NvbXBvbmVudENsc30tZHJhZy1pY29uICR7aWNvbkNsc30sXG4gICAgICAgICAgICBwJHtjb21wb25lbnRDbHN9LXRleHQsXG4gICAgICAgICAgICBwJHtjb21wb25lbnRDbHN9LWhpbnRcbiAgICAgICAgICBgXToge1xuICAgICAgICAgICAgY29sb3I6IHRva2VuLmNvbG9yVGV4dERpc2FibGVkXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbmV4cG9ydCBkZWZhdWx0IGdlbkRyYWdnZXJTdHlsZTsiLCAiaW1wb3J0IHsgdW5pdCB9IGZyb20gJ0BhbnQtZGVzaWduL2Nzc2luanMnO1xuaW1wb3J0IHsgY2xlYXJGaXgsIHRleHRFbGxpcHNpcyB9IGZyb20gJy4uLy4uL3N0eWxlJztcbmNvbnN0IGdlbkxpc3RTdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENscyxcbiAgICBpY29uQ2xzLFxuICAgIGZvbnRTaXplLFxuICAgIGxpbmVIZWlnaHQsXG4gICAgY2FsY1xuICB9ID0gdG9rZW47XG4gIGNvbnN0IGl0ZW1DbHMgPSBgJHtjb21wb25lbnRDbHN9LWxpc3QtaXRlbWA7XG4gIGNvbnN0IGFjdGlvbnNDbHMgPSBgJHtpdGVtQ2xzfS1hY3Rpb25zYDtcbiAgY29uc3QgYWN0aW9uQ2xzID0gYCR7aXRlbUNsc30tYWN0aW9uYDtcbiAgcmV0dXJuIHtcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS13cmFwcGVyYF06IHtcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWxpc3RgXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjbGVhckZpeCgpKSwge1xuICAgICAgICBsaW5lSGVpZ2h0OiB0b2tlbi5saW5lSGVpZ2h0LFxuICAgICAgICBbaXRlbUNsc106IHtcbiAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgICBoZWlnaHQ6IGNhbGModG9rZW4ubGluZUhlaWdodCkubXVsKGZvbnRTaXplKS5lcXVhbCgpLFxuICAgICAgICAgIG1hcmdpblRvcDogdG9rZW4ubWFyZ2luWFMsXG4gICAgICAgICAgZm9udFNpemUsXG4gICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICAgIHRyYW5zaXRpb246IGBiYWNrZ3JvdW5kLWNvbG9yICR7dG9rZW4ubW90aW9uRHVyYXRpb25TbG93fWAsXG4gICAgICAgICAgYm9yZGVyUmFkaXVzOiB0b2tlbi5ib3JkZXJSYWRpdXNTTSxcbiAgICAgICAgICAnJjpob3Zlcic6IHtcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdG9rZW4uY29udHJvbEl0ZW1CZ0hvdmVyXG4gICAgICAgICAgfSxcbiAgICAgICAgICBbYCR7aXRlbUNsc30tbmFtZWBdOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRleHRFbGxpcHNpcyksIHtcbiAgICAgICAgICAgIHBhZGRpbmc6IGAwICR7dW5pdCh0b2tlbi5wYWRkaW5nWFMpfWAsXG4gICAgICAgICAgICBsaW5lSGVpZ2h0LFxuICAgICAgICAgICAgZmxleDogJ2F1dG8nLFxuICAgICAgICAgICAgdHJhbnNpdGlvbjogYGFsbCAke3Rva2VuLm1vdGlvbkR1cmF0aW9uU2xvd31gXG4gICAgICAgICAgfSksXG4gICAgICAgICAgW2FjdGlvbnNDbHNdOiB7XG4gICAgICAgICAgICB3aGl0ZVNwYWNlOiAnbm93cmFwJyxcbiAgICAgICAgICAgIFthY3Rpb25DbHNdOiB7XG4gICAgICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbaWNvbkNsc106IHtcbiAgICAgICAgICAgICAgY29sb3I6IHRva2VuLmFjdGlvbnNDb2xvcixcbiAgICAgICAgICAgICAgdHJhbnNpdGlvbjogYGFsbCAke3Rva2VuLm1vdGlvbkR1cmF0aW9uU2xvd31gXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW2BcbiAgICAgICAgICAgICAgJHthY3Rpb25DbHN9OmZvY3VzLXZpc2libGUsXG4gICAgICAgICAgICAgICYucGljdHVyZSAke2FjdGlvbkNsc31cbiAgICAgICAgICAgIGBdOiB7XG4gICAgICAgICAgICAgIG9wYWNpdHk6IDFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFtgJHtjb21wb25lbnRDbHN9LWljb24gJHtpY29uQ2xzfWBdOiB7XG4gICAgICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JJY29uLFxuICAgICAgICAgICAgZm9udFNpemVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFtgJHtpdGVtQ2xzfS1wcm9ncmVzc2BdOiB7XG4gICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgIGJvdHRvbTogdG9rZW4uY2FsYyh0b2tlbi51cGxvYWRQcm9ncmVzc09mZnNldCkubXVsKC0xKS5lcXVhbCgpLFxuICAgICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICAgIHBhZGRpbmdJbmxpbmVTdGFydDogY2FsYyhmb250U2l6ZSkuYWRkKHRva2VuLnBhZGRpbmdYUykuZXF1YWwoKSxcbiAgICAgICAgICAgIGZvbnRTaXplLFxuICAgICAgICAgICAgbGluZUhlaWdodDogMCxcbiAgICAgICAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICAgICAgICAgICc+IGRpdic6IHtcbiAgICAgICAgICAgICAgbWFyZ2luOiAwXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbYCR7aXRlbUNsc306aG92ZXIgJHthY3Rpb25DbHN9YF06IHtcbiAgICAgICAgICBvcGFjaXR5OiAxXG4gICAgICAgIH0sXG4gICAgICAgIFtgJHtpdGVtQ2xzfS1lcnJvcmBdOiB7XG4gICAgICAgICAgY29sb3I6IHRva2VuLmNvbG9yRXJyb3IsXG4gICAgICAgICAgW2Ake2l0ZW1DbHN9LW5hbWUsICR7Y29tcG9uZW50Q2xzfS1pY29uICR7aWNvbkNsc31gXToge1xuICAgICAgICAgICAgY29sb3I6IHRva2VuLmNvbG9yRXJyb3JcbiAgICAgICAgICB9LFxuICAgICAgICAgIFthY3Rpb25zQ2xzXToge1xuICAgICAgICAgICAgW2Ake2ljb25DbHN9LCAke2ljb25DbHN9OmhvdmVyYF06IHtcbiAgICAgICAgICAgICAgY29sb3I6IHRva2VuLmNvbG9yRXJyb3JcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbYWN0aW9uQ2xzXToge1xuICAgICAgICAgICAgICBvcGFjaXR5OiAxXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1saXN0LWl0ZW0tY29udGFpbmVyYF06IHtcbiAgICAgICAgICB0cmFuc2l0aW9uOiBgb3BhY2l0eSAke3Rva2VuLm1vdGlvbkR1cmF0aW9uU2xvd30sIGhlaWdodCAke3Rva2VuLm1vdGlvbkR1cmF0aW9uU2xvd31gLFxuICAgICAgICAgIC8vIEZvciBzbW9vdGggcmVtb3ZpbmcgYW5pbWF0aW9uXG4gICAgICAgICAgJyY6OmJlZm9yZSc6IHtcbiAgICAgICAgICAgIGRpc3BsYXk6ICd0YWJsZScsXG4gICAgICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgICAgIGhlaWdodDogMCxcbiAgICAgICAgICAgIGNvbnRlbnQ6ICdcIlwiJ1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH07XG59O1xuZXhwb3J0IGRlZmF1bHQgZ2VuTGlzdFN0eWxlOyIsICJpbXBvcnQgeyBLZXlmcmFtZXMgfSBmcm9tICdAYW50LWRlc2lnbi9jc3NpbmpzJztcbmltcG9ydCB7IGluaXRGYWRlTW90aW9uIH0gZnJvbSAnLi4vLi4vc3R5bGUvbW90aW9uJztcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBNb3Rpb24gPT09PT09PT09PT09PT09PT09PT09PT09PT09XG5jb25zdCBnZW5Nb3Rpb25TdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENsc1xuICB9ID0gdG9rZW47XG4gIGNvbnN0IHVwbG9hZEFuaW1hdGVJbmxpbmVJbiA9IG5ldyBLZXlmcmFtZXMoJ3VwbG9hZEFuaW1hdGVJbmxpbmVJbicsIHtcbiAgICBmcm9tOiB7XG4gICAgICB3aWR0aDogMCxcbiAgICAgIGhlaWdodDogMCxcbiAgICAgIHBhZGRpbmc6IDAsXG4gICAgICBvcGFjaXR5OiAwLFxuICAgICAgbWFyZ2luOiB0b2tlbi5jYWxjKHRva2VuLm1hcmdpblhTKS5kaXYoLTIpLmVxdWFsKClcbiAgICB9XG4gIH0pO1xuICBjb25zdCB1cGxvYWRBbmltYXRlSW5saW5lT3V0ID0gbmV3IEtleWZyYW1lcygndXBsb2FkQW5pbWF0ZUlubGluZU91dCcsIHtcbiAgICB0bzoge1xuICAgICAgd2lkdGg6IDAsXG4gICAgICBoZWlnaHQ6IDAsXG4gICAgICBwYWRkaW5nOiAwLFxuICAgICAgb3BhY2l0eTogMCxcbiAgICAgIG1hcmdpbjogdG9rZW4uY2FsYyh0b2tlbi5tYXJnaW5YUykuZGl2KC0yKS5lcXVhbCgpXG4gICAgfVxuICB9KTtcbiAgY29uc3QgaW5saW5lQ2xzID0gYCR7Y29tcG9uZW50Q2xzfS1hbmltYXRlLWlubGluZWA7XG4gIHJldHVybiBbe1xuICAgIFtgJHtjb21wb25lbnRDbHN9LXdyYXBwZXJgXToge1xuICAgICAgW2Ake2lubGluZUNsc30tYXBwZWFyLCAke2lubGluZUNsc30tZW50ZXIsICR7aW5saW5lQ2xzfS1sZWF2ZWBdOiB7XG4gICAgICAgIGFuaW1hdGlvbkR1cmF0aW9uOiB0b2tlbi5tb3Rpb25EdXJhdGlvblNsb3csXG4gICAgICAgIGFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uOiB0b2tlbi5tb3Rpb25FYXNlSW5PdXRDaXJjLFxuICAgICAgICBhbmltYXRpb25GaWxsTW9kZTogJ2ZvcndhcmRzJ1xuICAgICAgfSxcbiAgICAgIFtgJHtpbmxpbmVDbHN9LWFwcGVhciwgJHtpbmxpbmVDbHN9LWVudGVyYF06IHtcbiAgICAgICAgYW5pbWF0aW9uTmFtZTogdXBsb2FkQW5pbWF0ZUlubGluZUluXG4gICAgICB9LFxuICAgICAgW2Ake2lubGluZUNsc30tbGVhdmVgXToge1xuICAgICAgICBhbmltYXRpb25OYW1lOiB1cGxvYWRBbmltYXRlSW5saW5lT3V0XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAgW2Ake2NvbXBvbmVudENsc30td3JhcHBlcmBdOiBpbml0RmFkZU1vdGlvbih0b2tlbilcbiAgfSwgdXBsb2FkQW5pbWF0ZUlubGluZUluLCB1cGxvYWRBbmltYXRlSW5saW5lT3V0XTtcbn07XG5leHBvcnQgZGVmYXVsdCBnZW5Nb3Rpb25TdHlsZTsiLCAiaW1wb3J0IHsgYmx1ZSB9IGZyb20gJ0BhbnQtZGVzaWduL2NvbG9ycyc7XG5pbXBvcnQgeyB1bml0IH0gZnJvbSAnQGFudC1kZXNpZ24vY3NzaW5qcyc7XG5pbXBvcnQgeyBjbGVhckZpeCwgdGV4dEVsbGlwc2lzIH0gZnJvbSAnLi4vLi4vc3R5bGUnO1xuY29uc3QgZ2VuUGljdHVyZVN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzLFxuICAgIGljb25DbHMsXG4gICAgdXBsb2FkVGh1bWJuYWlsU2l6ZSxcbiAgICB1cGxvYWRQcm9ncmVzc09mZnNldCxcbiAgICBjYWxjXG4gIH0gPSB0b2tlbjtcbiAgY29uc3QgbGlzdENscyA9IGAke2NvbXBvbmVudENsc30tbGlzdGA7XG4gIGNvbnN0IGl0ZW1DbHMgPSBgJHtsaXN0Q2xzfS1pdGVtYDtcbiAgcmV0dXJuIHtcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS13cmFwcGVyYF06IHtcbiAgICAgIC8vICR7bGlzdENsc30gXHU1ODlFXHU1MkEwXHU0RjE4XHU1MTQ4XHU3RUE3XG4gICAgICBbYFxuICAgICAgICAke2xpc3RDbHN9JHtsaXN0Q2xzfS1waWN0dXJlLFxuICAgICAgICAke2xpc3RDbHN9JHtsaXN0Q2xzfS1waWN0dXJlLWNhcmQsXG4gICAgICAgICR7bGlzdENsc30ke2xpc3RDbHN9LXBpY3R1cmUtY2lyY2xlXG4gICAgICBgXToge1xuICAgICAgICBbaXRlbUNsc106IHtcbiAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgICBoZWlnaHQ6IGNhbGModXBsb2FkVGh1bWJuYWlsU2l6ZSkuYWRkKGNhbGModG9rZW4ubGluZVdpZHRoKS5tdWwoMikpLmFkZChjYWxjKHRva2VuLnBhZGRpbmdYUykubXVsKDIpKS5lcXVhbCgpLFxuICAgICAgICAgIHBhZGRpbmc6IHRva2VuLnBhZGRpbmdYUyxcbiAgICAgICAgICBib3JkZXI6IGAke3VuaXQodG9rZW4ubGluZVdpZHRoKX0gJHt0b2tlbi5saW5lVHlwZX0gJHt0b2tlbi5jb2xvckJvcmRlcn1gLFxuICAgICAgICAgIGJvcmRlclJhZGl1czogdG9rZW4uYm9yZGVyUmFkaXVzTEcsXG4gICAgICAgICAgJyY6aG92ZXInOiB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnXG4gICAgICAgICAgfSxcbiAgICAgICAgICBbYCR7aXRlbUNsc30tdGh1bWJuYWlsYF06IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGV4dEVsbGlwc2lzKSwge1xuICAgICAgICAgICAgd2lkdGg6IHVwbG9hZFRodW1ibmFpbFNpemUsXG4gICAgICAgICAgICBoZWlnaHQ6IHVwbG9hZFRodW1ibmFpbFNpemUsXG4gICAgICAgICAgICBsaW5lSGVpZ2h0OiB1bml0KGNhbGModXBsb2FkVGh1bWJuYWlsU2l6ZSkuYWRkKHRva2VuLnBhZGRpbmdTTSkuZXF1YWwoKSksXG4gICAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgICAgICAgZmxleDogJ25vbmUnLFxuICAgICAgICAgICAgW2ljb25DbHNdOiB7XG4gICAgICAgICAgICAgIGZvbnRTaXplOiB0b2tlbi5mb250U2l6ZUhlYWRpbmcyLFxuICAgICAgICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JQcmltYXJ5XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW1nOiB7XG4gICAgICAgICAgICAgIGRpc3BsYXk6ICdibG9jaycsXG4gICAgICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgICAgICAgICBvdmVyZmxvdzogJ2hpZGRlbidcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSxcbiAgICAgICAgICBbYCR7aXRlbUNsc30tcHJvZ3Jlc3NgXToge1xuICAgICAgICAgICAgYm90dG9tOiB1cGxvYWRQcm9ncmVzc09mZnNldCxcbiAgICAgICAgICAgIHdpZHRoOiBgY2FsYygxMDAlIC0gJHt1bml0KGNhbGModG9rZW4ucGFkZGluZ1NNKS5tdWwoMikuZXF1YWwoKSl9KWAsXG4gICAgICAgICAgICBtYXJnaW5Ub3A6IDAsXG4gICAgICAgICAgICBwYWRkaW5nSW5saW5lU3RhcnQ6IGNhbGModXBsb2FkVGh1bWJuYWlsU2l6ZSkuYWRkKHRva2VuLnBhZGRpbmdYUykuZXF1YWwoKVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgW2Ake2l0ZW1DbHN9LWVycm9yYF06IHtcbiAgICAgICAgICBib3JkZXJDb2xvcjogdG9rZW4uY29sb3JFcnJvcixcbiAgICAgICAgICAvLyBBZGp1c3QgdGhlIGNvbG9yIG9mIHRoZSBlcnJvciBpY29uIDogaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9wdWxsLzI0MTYwXG4gICAgICAgICAgW2Ake2l0ZW1DbHN9LXRodW1ibmFpbCAke2ljb25DbHN9YF06IHtcbiAgICAgICAgICAgIFtgc3ZnIHBhdGhbZmlsbD0nJHtibHVlWzBdfSddYF06IHtcbiAgICAgICAgICAgICAgZmlsbDogdG9rZW4uY29sb3JFcnJvckJnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW2BzdmcgcGF0aFtmaWxsPScke2JsdWUucHJpbWFyeX0nXWBdOiB7XG4gICAgICAgICAgICAgIGZpbGw6IHRva2VuLmNvbG9yRXJyb3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtgJHtpdGVtQ2xzfS11cGxvYWRpbmdgXToge1xuICAgICAgICAgIGJvcmRlclN0eWxlOiAnZGFzaGVkJyxcbiAgICAgICAgICBbYCR7aXRlbUNsc30tbmFtZWBdOiB7XG4gICAgICAgICAgICBtYXJnaW5Cb3R0b206IHVwbG9hZFByb2dyZXNzT2Zmc2V0XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2Ake2xpc3RDbHN9JHtsaXN0Q2xzfS1waWN0dXJlLWNpcmNsZSAke2l0ZW1DbHN9YF06IHtcbiAgICAgICAgW2AmLCAmOjpiZWZvcmUsICR7aXRlbUNsc30tdGh1bWJuYWlsYF06IHtcbiAgICAgICAgICBib3JkZXJSYWRpdXM6ICc1MCUnXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xuY29uc3QgZ2VuUGljdHVyZUNhcmRTdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENscyxcbiAgICBpY29uQ2xzLFxuICAgIGZvbnRTaXplTEcsXG4gICAgY29sb3JUZXh0TGlnaHRTb2xpZCxcbiAgICBjYWxjXG4gIH0gPSB0b2tlbjtcbiAgY29uc3QgbGlzdENscyA9IGAke2NvbXBvbmVudENsc30tbGlzdGA7XG4gIGNvbnN0IGl0ZW1DbHMgPSBgJHtsaXN0Q2xzfS1pdGVtYDtcbiAgY29uc3QgdXBsb2FkUGljdHVyZUNhcmRTaXplID0gdG9rZW4udXBsb2FkUGljQ2FyZFNpemU7XG4gIHJldHVybiB7XG4gICAgW2BcbiAgICAgICR7Y29tcG9uZW50Q2xzfS13cmFwcGVyJHtjb21wb25lbnRDbHN9LXBpY3R1cmUtY2FyZC13cmFwcGVyLFxuICAgICAgJHtjb21wb25lbnRDbHN9LXdyYXBwZXIke2NvbXBvbmVudENsc30tcGljdHVyZS1jaXJjbGUtd3JhcHBlclxuICAgIGBdOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGNsZWFyRml4KCkpLCB7XG4gICAgICBkaXNwbGF5OiAnYmxvY2snLFxuICAgICAgW2Ake2NvbXBvbmVudENsc30ke2NvbXBvbmVudENsc30tc2VsZWN0YF06IHtcbiAgICAgICAgd2lkdGg6IHVwbG9hZFBpY3R1cmVDYXJkU2l6ZSxcbiAgICAgICAgaGVpZ2h0OiB1cGxvYWRQaWN0dXJlQ2FyZFNpemUsXG4gICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAgIHZlcnRpY2FsQWxpZ246ICd0b3AnLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRva2VuLmNvbG9yRmlsbEFsdGVyLFxuICAgICAgICBib3JkZXI6IGAke3VuaXQodG9rZW4ubGluZVdpZHRoKX0gZGFzaGVkICR7dG9rZW4uY29sb3JCb3JkZXJ9YCxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiB0b2tlbi5ib3JkZXJSYWRpdXNMRyxcbiAgICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgICAgIHRyYW5zaXRpb246IGBib3JkZXItY29sb3IgJHt0b2tlbi5tb3Rpb25EdXJhdGlvblNsb3d9YCxcbiAgICAgICAgW2A+ICR7Y29tcG9uZW50Q2xzfWBdOiB7XG4gICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJyxcbiAgICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInXG4gICAgICAgIH0sXG4gICAgICAgIFtgJjpub3QoJHtjb21wb25lbnRDbHN9LWRpc2FibGVkKTpob3ZlcmBdOiB7XG4gICAgICAgICAgYm9yZGVyQ29sb3I6IHRva2VuLmNvbG9yUHJpbWFyeVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gbGlzdFxuICAgICAgW2Ake2xpc3RDbHN9JHtsaXN0Q2xzfS1waWN0dXJlLWNhcmQsICR7bGlzdENsc30ke2xpc3RDbHN9LXBpY3R1cmUtY2lyY2xlYF06IHtcbiAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICBmbGV4V3JhcDogJ3dyYXAnLFxuICAgICAgICAnQHN1cHBvcnRzIG5vdCAoZ2FwOiAxcHgpJzoge1xuICAgICAgICAgICcmID4gKic6IHtcbiAgICAgICAgICAgIG1hcmdpbkJsb2NrRW5kOiB0b2tlbi5tYXJnaW5YUyxcbiAgICAgICAgICAgIG1hcmdpbklubGluZUVuZDogdG9rZW4ubWFyZ2luWFNcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICdAc3VwcG9ydHMgKGdhcDogMXB4KSc6IHtcbiAgICAgICAgICBnYXA6IHRva2VuLm1hcmdpblhTXG4gICAgICAgIH0sXG4gICAgICAgIFtgJHtsaXN0Q2xzfS1pdGVtLWNvbnRhaW5lcmBdOiB7XG4gICAgICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICAgICAgd2lkdGg6IHVwbG9hZFBpY3R1cmVDYXJkU2l6ZSxcbiAgICAgICAgICBoZWlnaHQ6IHVwbG9hZFBpY3R1cmVDYXJkU2l6ZSxcbiAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiAndG9wJ1xuICAgICAgICB9LFxuICAgICAgICAnJjo6YWZ0ZXInOiB7XG4gICAgICAgICAgZGlzcGxheTogJ25vbmUnXG4gICAgICAgIH0sXG4gICAgICAgICcmOjpiZWZvcmUnOiB7XG4gICAgICAgICAgZGlzcGxheTogJ25vbmUnXG4gICAgICAgIH0sXG4gICAgICAgIFtpdGVtQ2xzXToge1xuICAgICAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgICAgIG1hcmdpbjogMCxcbiAgICAgICAgICAnJjo6YmVmb3JlJzoge1xuICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICB6SW5kZXg6IDEsXG4gICAgICAgICAgICB3aWR0aDogYGNhbGMoMTAwJSAtICR7dW5pdChjYWxjKHRva2VuLnBhZGRpbmdYUykubXVsKDIpLmVxdWFsKCkpfSlgLFxuICAgICAgICAgICAgaGVpZ2h0OiBgY2FsYygxMDAlIC0gJHt1bml0KGNhbGModG9rZW4ucGFkZGluZ1hTKS5tdWwoMikuZXF1YWwoKSl9KWAsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRva2VuLmNvbG9yQmdNYXNrLFxuICAgICAgICAgICAgb3BhY2l0eTogMCxcbiAgICAgICAgICAgIHRyYW5zaXRpb246IGBhbGwgJHt0b2tlbi5tb3Rpb25EdXJhdGlvblNsb3d9YCxcbiAgICAgICAgICAgIGNvbnRlbnQ6ICdcIiBcIidcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtgJHtpdGVtQ2xzfTpob3ZlcmBdOiB7XG4gICAgICAgICAgW2AmOjpiZWZvcmUsICR7aXRlbUNsc30tYWN0aW9uc2BdOiB7XG4gICAgICAgICAgICBvcGFjaXR5OiAxXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbYCR7aXRlbUNsc30tYWN0aW9uc2BdOiB7XG4gICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgaW5zZXRJbmxpbmVTdGFydDogMCxcbiAgICAgICAgICB6SW5kZXg6IDEwLFxuICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgd2hpdGVTcGFjZTogJ25vd3JhcCcsXG4gICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICBvcGFjaXR5OiAwLFxuICAgICAgICAgIHRyYW5zaXRpb246IGBhbGwgJHt0b2tlbi5tb3Rpb25EdXJhdGlvblNsb3d9YCxcbiAgICAgICAgICBbYFxuICAgICAgICAgICAgJHtpY29uQ2xzfS1leWUsXG4gICAgICAgICAgICAke2ljb25DbHN9LWRvd25sb2FkLFxuICAgICAgICAgICAgJHtpY29uQ2xzfS1kZWxldGVcbiAgICAgICAgICBgXToge1xuICAgICAgICAgICAgekluZGV4OiAxMCxcbiAgICAgICAgICAgIHdpZHRoOiBmb250U2l6ZUxHLFxuICAgICAgICAgICAgbWFyZ2luOiBgMCAke3VuaXQodG9rZW4ubWFyZ2luWFhTKX1gLFxuICAgICAgICAgICAgZm9udFNpemU6IGZvbnRTaXplTEcsXG4gICAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgICAgICAgIHRyYW5zaXRpb246IGBhbGwgJHt0b2tlbi5tb3Rpb25EdXJhdGlvblNsb3d9YCxcbiAgICAgICAgICAgIGNvbG9yOiBjb2xvclRleHRMaWdodFNvbGlkLFxuICAgICAgICAgICAgJyY6aG92ZXInOiB7XG4gICAgICAgICAgICAgIGNvbG9yOiBjb2xvclRleHRMaWdodFNvbGlkXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3ZnOiB7XG4gICAgICAgICAgICAgIHZlcnRpY2FsQWxpZ246ICdiYXNlbGluZSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtgJHtpdGVtQ2xzfS10aHVtYm5haWwsICR7aXRlbUNsc30tdGh1bWJuYWlsIGltZ2BdOiB7XG4gICAgICAgICAgcG9zaXRpb246ICdzdGF0aWMnLFxuICAgICAgICAgIGRpc3BsYXk6ICdibG9jaycsXG4gICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAgICBvYmplY3RGaXQ6ICdjb250YWluJ1xuICAgICAgICB9LFxuICAgICAgICBbYCR7aXRlbUNsc30tbmFtZWBdOiB7XG4gICAgICAgICAgZGlzcGxheTogJ25vbmUnLFxuICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcidcbiAgICAgICAgfSxcbiAgICAgICAgW2Ake2l0ZW1DbHN9LWZpbGUgKyAke2l0ZW1DbHN9LW5hbWVgXToge1xuICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgIGJvdHRvbTogdG9rZW4ubWFyZ2luLFxuICAgICAgICAgIGRpc3BsYXk6ICdibG9jaycsXG4gICAgICAgICAgd2lkdGg6IGBjYWxjKDEwMCUgLSAke3VuaXQoY2FsYyh0b2tlbi5wYWRkaW5nWFMpLm11bCgyKS5lcXVhbCgpKX0pYFxuICAgICAgICB9LFxuICAgICAgICBbYCR7aXRlbUNsc30tdXBsb2FkaW5nYF06IHtcbiAgICAgICAgICBbYCYke2l0ZW1DbHN9YF06IHtcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdG9rZW4uY29sb3JGaWxsQWx0ZXJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFtgJjo6YmVmb3JlLCAke2ljb25DbHN9LWV5ZSwgJHtpY29uQ2xzfS1kb3dubG9hZCwgJHtpY29uQ2xzfS1kZWxldGVgXToge1xuICAgICAgICAgICAgZGlzcGxheTogJ25vbmUnXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbYCR7aXRlbUNsc30tcHJvZ3Jlc3NgXToge1xuICAgICAgICAgIGJvdHRvbTogdG9rZW4ubWFyZ2luWEwsXG4gICAgICAgICAgd2lkdGg6IGBjYWxjKDEwMCUgLSAke3VuaXQoY2FsYyh0b2tlbi5wYWRkaW5nWFMpLm11bCgyKS5lcXVhbCgpKX0pYCxcbiAgICAgICAgICBwYWRkaW5nSW5saW5lU3RhcnQ6IDBcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pLFxuICAgIFtgJHtjb21wb25lbnRDbHN9LXdyYXBwZXIke2NvbXBvbmVudENsc30tcGljdHVyZS1jaXJjbGUtd3JhcHBlcmBdOiB7XG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfSR7Y29tcG9uZW50Q2xzfS1zZWxlY3RgXToge1xuICAgICAgICBib3JkZXJSYWRpdXM6ICc1MCUnXG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbmV4cG9ydCB7IGdlblBpY3R1cmVTdHlsZSwgZ2VuUGljdHVyZUNhcmRTdHlsZSB9OyIsICIvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gTW90aW9uID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuY29uc3QgZ2VuUnRsU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHNcbiAgfSA9IHRva2VuO1xuICByZXR1cm4ge1xuICAgIFtgJHtjb21wb25lbnRDbHN9LXJ0bGBdOiB7XG4gICAgICBkaXJlY3Rpb246ICdydGwnXG4gICAgfVxuICB9O1xufTtcbmV4cG9ydCBkZWZhdWx0IGdlblJ0bFN0eWxlOyIsICJpbXBvcnQgeyByZXNldENvbXBvbmVudCB9IGZyb20gJy4uLy4uL3N0eWxlJztcbmltcG9ydCB7IGdlbkNvbGxhcHNlTW90aW9uIH0gZnJvbSAnLi4vLi4vc3R5bGUvbW90aW9uJztcbmltcG9ydCB7IGdlblN0eWxlSG9va3MsIG1lcmdlVG9rZW4gfSBmcm9tICcuLi8uLi90aGVtZS9pbnRlcm5hbCc7XG5pbXBvcnQgZ2VuRHJhZ2dlclN0eWxlIGZyb20gJy4vZHJhZ2dlcic7XG5pbXBvcnQgZ2VuTGlzdFN0eWxlIGZyb20gJy4vbGlzdCc7XG5pbXBvcnQgZ2VuTW90aW9uU3R5bGUgZnJvbSAnLi9tb3Rpb24nO1xuaW1wb3J0IHsgZ2VuUGljdHVyZUNhcmRTdHlsZSwgZ2VuUGljdHVyZVN0eWxlIH0gZnJvbSAnLi9waWN0dXJlJztcbmltcG9ydCBnZW5SdGxTdHlsZSBmcm9tICcuL3J0bCc7XG5jb25zdCBnZW5CYXNlU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHMsXG4gICAgY29sb3JUZXh0RGlzYWJsZWRcbiAgfSA9IHRva2VuO1xuICByZXR1cm4ge1xuICAgIFtgJHtjb21wb25lbnRDbHN9LXdyYXBwZXJgXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXNldENvbXBvbmVudCh0b2tlbikpLCB7XG4gICAgICBbY29tcG9uZW50Q2xzXToge1xuICAgICAgICBvdXRsaW5lOiAwLFxuICAgICAgICBcImlucHV0W3R5cGU9J2ZpbGUnXVwiOiB7XG4gICAgICAgICAgY3Vyc29yOiAncG9pbnRlcidcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LXNlbGVjdGBdOiB7XG4gICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snXG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30taGlkZGVuYF06IHtcbiAgICAgICAgZGlzcGxheTogJ25vbmUnXG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tZGlzYWJsZWRgXToge1xuICAgICAgICBjb2xvcjogY29sb3JUZXh0RGlzYWJsZWQsXG4gICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkJ1xuICAgICAgfVxuICAgIH0pXG4gIH07XG59O1xuZXhwb3J0IGNvbnN0IHByZXBhcmVDb21wb25lbnRUb2tlbiA9IHRva2VuID0+ICh7XG4gIGFjdGlvbnNDb2xvcjogdG9rZW4uY29sb3JJY29uXG59KTtcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFeHBvcnQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgZGVmYXVsdCBnZW5TdHlsZUhvb2tzKCdVcGxvYWQnLCB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBmb250U2l6ZUhlYWRpbmczLFxuICAgIGZvbnRIZWlnaHQsXG4gICAgbGluZVdpZHRoLFxuICAgIGNvbnRyb2xIZWlnaHRMRyxcbiAgICBjYWxjXG4gIH0gPSB0b2tlbjtcbiAgY29uc3QgdXBsb2FkVG9rZW4gPSBtZXJnZVRva2VuKHRva2VuLCB7XG4gICAgdXBsb2FkVGh1bWJuYWlsU2l6ZTogY2FsYyhmb250U2l6ZUhlYWRpbmczKS5tdWwoMikuZXF1YWwoKSxcbiAgICB1cGxvYWRQcm9ncmVzc09mZnNldDogY2FsYyhjYWxjKGZvbnRIZWlnaHQpLmRpdigyKSkuYWRkKGxpbmVXaWR0aCkuZXF1YWwoKSxcbiAgICB1cGxvYWRQaWNDYXJkU2l6ZTogY2FsYyhjb250cm9sSGVpZ2h0TEcpLm11bCgyLjU1KS5lcXVhbCgpXG4gIH0pO1xuICByZXR1cm4gW2dlbkJhc2VTdHlsZSh1cGxvYWRUb2tlbiksIGdlbkRyYWdnZXJTdHlsZSh1cGxvYWRUb2tlbiksIGdlblBpY3R1cmVTdHlsZSh1cGxvYWRUb2tlbiksIGdlblBpY3R1cmVDYXJkU3R5bGUodXBsb2FkVG9rZW4pLCBnZW5MaXN0U3R5bGUodXBsb2FkVG9rZW4pLCBnZW5Nb3Rpb25TdHlsZSh1cGxvYWRUb2tlbiksIGdlblJ0bFN0eWxlKHVwbG9hZFRva2VuKSwgZ2VuQ29sbGFwc2VNb3Rpb24odXBsb2FkVG9rZW4pXTtcbn0sIHByZXBhcmVDb21wb25lbnRUb2tlbik7IiwgIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEZpbGVUd29Ub25lIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9GaWxlVHdvVG9uZVwiO1xuaW1wb3J0IExvYWRpbmdPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvTG9hZGluZ091dGxpbmVkXCI7XG5pbXBvcnQgUGFwZXJDbGlwT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL1BhcGVyQ2xpcE91dGxpbmVkXCI7XG5pbXBvcnQgUGljdHVyZVR3b1RvbmUgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL1BpY3R1cmVUd29Ub25lXCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBDU1NNb3Rpb24sIHsgQ1NTTW90aW9uTGlzdCB9IGZyb20gJ3JjLW1vdGlvbic7XG5pbXBvcnQgb21pdCBmcm9tIFwicmMtdXRpbC9lcy9vbWl0XCI7XG5pbXBvcnQgdXNlRm9yY2VVcGRhdGUgZnJvbSAnLi4vLi4vX3V0aWwvaG9va3MvdXNlRm9yY2VVcGRhdGUnO1xuaW1wb3J0IGluaXRDb2xsYXBzZU1vdGlvbiBmcm9tICcuLi8uLi9fdXRpbC9tb3Rpb24nO1xuaW1wb3J0IHsgY2xvbmVFbGVtZW50IH0gZnJvbSAnLi4vLi4vX3V0aWwvcmVhY3ROb2RlJztcbmltcG9ydCBCdXR0b24gZnJvbSAnLi4vLi4vYnV0dG9uJztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi8uLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHsgaXNJbWFnZVVybCwgcHJldmlld0ltYWdlIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IExpc3RJdGVtIGZyb20gJy4vTGlzdEl0ZW0nO1xuY29uc3QgSW50ZXJuYWxVcGxvYWRMaXN0ID0gKHByb3BzLCByZWYpID0+IHtcbiAgY29uc3Qge1xuICAgIGxpc3RUeXBlID0gJ3RleHQnLFxuICAgIHByZXZpZXdGaWxlID0gcHJldmlld0ltYWdlLFxuICAgIG9uUHJldmlldyxcbiAgICBvbkRvd25sb2FkLFxuICAgIG9uUmVtb3ZlLFxuICAgIGxvY2FsZSxcbiAgICBpY29uUmVuZGVyLFxuICAgIGlzSW1hZ2VVcmw6IGlzSW1nVXJsID0gaXNJbWFnZVVybCxcbiAgICBwcmVmaXhDbHM6IGN1c3RvbWl6ZVByZWZpeENscyxcbiAgICBpdGVtcyA9IFtdLFxuICAgIHNob3dQcmV2aWV3SWNvbiA9IHRydWUsXG4gICAgc2hvd1JlbW92ZUljb24gPSB0cnVlLFxuICAgIHNob3dEb3dubG9hZEljb24gPSBmYWxzZSxcbiAgICByZW1vdmVJY29uLFxuICAgIHByZXZpZXdJY29uLFxuICAgIGRvd25sb2FkSWNvbixcbiAgICBleHRyYSxcbiAgICBwcm9ncmVzcyA9IHtcbiAgICAgIHNpemU6IFstMSwgMl0sXG4gICAgICBzaG93SW5mbzogZmFsc2VcbiAgICB9LFxuICAgIGFwcGVuZEFjdGlvbixcbiAgICBhcHBlbmRBY3Rpb25WaXNpYmxlID0gdHJ1ZSxcbiAgICBpdGVtUmVuZGVyLFxuICAgIGRpc2FibGVkXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgZm9yY2VVcGRhdGUgPSB1c2VGb3JjZVVwZGF0ZSgpO1xuICBjb25zdCBbbW90aW9uQXBwZWFyLCBzZXRNb3Rpb25BcHBlYXJdID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBpc1BpY3R1cmVDYXJkT3JDaXJsZSA9IFsncGljdHVyZS1jYXJkJywgJ3BpY3R1cmUtY2lyY2xlJ10uaW5jbHVkZXMobGlzdFR5cGUpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFZmZlY3QgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWxpc3RUeXBlLnN0YXJ0c1dpdGgoJ3BpY3R1cmUnKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAoaXRlbXMgfHwgW10pLmZvckVhY2goZmlsZSA9PiB7XG4gICAgICBpZiAoIShmaWxlLm9yaWdpbkZpbGVPYmogaW5zdGFuY2VvZiBGaWxlIHx8IGZpbGUub3JpZ2luRmlsZU9iaiBpbnN0YW5jZW9mIEJsb2IpIHx8IGZpbGUudGh1bWJVcmwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmaWxlLnRodW1iVXJsID0gJyc7XG4gICAgICBwcmV2aWV3RmlsZSA9PT0gbnVsbCB8fCBwcmV2aWV3RmlsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHJldmlld0ZpbGUoZmlsZS5vcmlnaW5GaWxlT2JqKS50aGVuKHByZXZpZXdEYXRhVXJsID0+IHtcbiAgICAgICAgLy8gTmVlZCBhcHBlbmQgJycgdG8gYXZvaWQgZGVhZCBsb29wXG4gICAgICAgIGZpbGUudGh1bWJVcmwgPSBwcmV2aWV3RGF0YVVybCB8fCAnJztcbiAgICAgICAgZm9yY2VVcGRhdGUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9LCBbbGlzdFR5cGUsIGl0ZW1zLCBwcmV2aWV3RmlsZV0pO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIHNldE1vdGlvbkFwcGVhcih0cnVlKTtcbiAgfSwgW10pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFdmVudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3Qgb25JbnRlcm5hbFByZXZpZXcgPSAoZmlsZSwgZSkgPT4ge1xuICAgIGlmICghb25QcmV2aWV3KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGUgPT09IG51bGwgfHwgZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHJldHVybiBvblByZXZpZXcoZmlsZSk7XG4gIH07XG4gIGNvbnN0IG9uSW50ZXJuYWxEb3dubG9hZCA9IGZpbGUgPT4ge1xuICAgIGlmICh0eXBlb2Ygb25Eb3dubG9hZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb25Eb3dubG9hZChmaWxlKTtcbiAgICB9IGVsc2UgaWYgKGZpbGUudXJsKSB7XG4gICAgICB3aW5kb3cub3BlbihmaWxlLnVybCk7XG4gICAgfVxuICB9O1xuICBjb25zdCBvbkludGVybmFsQ2xvc2UgPSBmaWxlID0+IHtcbiAgICBvblJlbW92ZSA9PT0gbnVsbCB8fCBvblJlbW92ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25SZW1vdmUoZmlsZSk7XG4gIH07XG4gIGNvbnN0IGludGVybmFsSWNvblJlbmRlciA9IGZpbGUgPT4ge1xuICAgIGlmIChpY29uUmVuZGVyKSB7XG4gICAgICByZXR1cm4gaWNvblJlbmRlcihmaWxlLCBsaXN0VHlwZSk7XG4gICAgfVxuICAgIGNvbnN0IGlzTG9hZGluZyA9IGZpbGUuc3RhdHVzID09PSAndXBsb2FkaW5nJztcbiAgICBpZiAobGlzdFR5cGUuc3RhcnRzV2l0aCgncGljdHVyZScpKSB7XG4gICAgICBjb25zdCBsb2FkaW5nSWNvbiA9IGxpc3RUeXBlID09PSAncGljdHVyZScgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMb2FkaW5nT3V0bGluZWQsIG51bGwpIDogbG9jYWxlLnVwbG9hZGluZztcbiAgICAgIGNvbnN0IGZpbGVJY29uID0gKGlzSW1nVXJsID09PSBudWxsIHx8IGlzSW1nVXJsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBpc0ltZ1VybChmaWxlKSkgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQaWN0dXJlVHdvVG9uZSwgbnVsbCkgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGaWxlVHdvVG9uZSwgbnVsbCk7XG4gICAgICByZXR1cm4gaXNMb2FkaW5nID8gbG9hZGluZ0ljb24gOiBmaWxlSWNvbjtcbiAgICB9XG4gICAgcmV0dXJuIGlzTG9hZGluZyA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExvYWRpbmdPdXRsaW5lZCwgbnVsbCkgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQYXBlckNsaXBPdXRsaW5lZCwgbnVsbCk7XG4gIH07XG4gIGNvbnN0IGFjdGlvbkljb25SZW5kZXIgPSAoY3VzdG9tSWNvbiwgY2FsbGJhY2ssIHByZWZpeENscywgdGl0bGUsIGFjY2VwdFVwbG9hZERpc2FibGVkKSA9PiB7XG4gICAgY29uc3QgYnRuUHJvcHMgPSB7XG4gICAgICB0eXBlOiAndGV4dCcsXG4gICAgICBzaXplOiAnc21hbGwnLFxuICAgICAgdGl0bGUsXG4gICAgICBvbkNsaWNrOiBlID0+IHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgaWYgKC8qI19fUFVSRV9fKi9SZWFjdC5pc1ZhbGlkRWxlbWVudChjdXN0b21JY29uKSkge1xuICAgICAgICAgIChfYiA9IChfYSA9IGN1c3RvbUljb24ucHJvcHMpLm9uQ2xpY2spID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hLCBlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGNsYXNzTmFtZTogYCR7cHJlZml4Q2xzfS1saXN0LWl0ZW0tYWN0aW9uYCxcbiAgICAgIGRpc2FibGVkOiBhY2NlcHRVcGxvYWREaXNhYmxlZCA/IGRpc2FibGVkIDogZmFsc2VcbiAgICB9O1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoY3VzdG9tSWNvbikgPyAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQnV0dG9uLCBPYmplY3QuYXNzaWduKHt9LCBidG5Qcm9wcywge1xuICAgICAgaWNvbjogY2xvbmVFbGVtZW50KGN1c3RvbUljb24sIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY3VzdG9tSWNvbi5wcm9wcyksIHtcbiAgICAgICAgb25DbGljazogKCkgPT4ge31cbiAgICAgIH0pKVxuICAgIH0pKSkgOiAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQnV0dG9uLCBPYmplY3QuYXNzaWduKHt9LCBidG5Qcm9wcyksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBjdXN0b21JY29uKSkpO1xuICB9O1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVmID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVGVzdCBuZWVkc1xuICBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgKCkgPT4gKHtcbiAgICBoYW5kbGVQcmV2aWV3OiBvbkludGVybmFsUHJldmlldyxcbiAgICBoYW5kbGVEb3dubG9hZDogb25JbnRlcm5hbERvd25sb2FkXG4gIH0pKTtcbiAgY29uc3Qge1xuICAgIGdldFByZWZpeENsc1xuICB9ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IHByZWZpeENscyA9IGdldFByZWZpeENscygndXBsb2FkJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgY29uc3Qgcm9vdFByZWZpeENscyA9IGdldFByZWZpeENscygpO1xuICBjb25zdCBsaXN0Q2xhc3NOYW1lcyA9IGNsYXNzTmFtZXMoYCR7cHJlZml4Q2xzfS1saXN0YCwgYCR7cHJlZml4Q2xzfS1saXN0LSR7bGlzdFR5cGV9YCk7XG4gIGNvbnN0IGxpc3RJdGVtTW90aW9uID0gUmVhY3QudXNlTWVtbygoKSA9PiBvbWl0KGluaXRDb2xsYXBzZU1vdGlvbihyb290UHJlZml4Q2xzKSwgWydvbkFwcGVhckVuZCcsICdvbkVudGVyRW5kJywgJ29uTGVhdmVFbmQnXSksIFtyb290UHJlZml4Q2xzXSk7XG4gIGNvbnN0IG1vdGlvbkNvbmZpZyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgaXNQaWN0dXJlQ2FyZE9yQ2lybGUgPyB7fSA6IGxpc3RJdGVtTW90aW9uKSwge1xuICAgIG1vdGlvbkRlYWRsaW5lOiAyMDAwLFxuICAgIG1vdGlvbk5hbWU6IGAke3ByZWZpeENsc30tJHtpc1BpY3R1cmVDYXJkT3JDaXJsZSA/ICdhbmltYXRlLWlubGluZScgOiAnYW5pbWF0ZSd9YCxcbiAgICBrZXlzOiBfdG9Db25zdW1hYmxlQXJyYXkoaXRlbXMubWFwKGZpbGUgPT4gKHtcbiAgICAgIGtleTogZmlsZS51aWQsXG4gICAgICBmaWxlXG4gICAgfSkpKSxcbiAgICBtb3Rpb25BcHBlYXJcbiAgfSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBsaXN0Q2xhc3NOYW1lc1xuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDU1NNb3Rpb25MaXN0LCBPYmplY3QuYXNzaWduKHt9LCBtb3Rpb25Db25maWcsIHtcbiAgICBjb21wb25lbnQ6IGZhbHNlXG4gIH0pLCBfcmVmID0+IHtcbiAgICBsZXQge1xuICAgICAga2V5LFxuICAgICAgZmlsZSxcbiAgICAgIGNsYXNzTmFtZTogbW90aW9uQ2xhc3NOYW1lLFxuICAgICAgc3R5bGU6IG1vdGlvblN0eWxlXG4gICAgfSA9IF9yZWY7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExpc3RJdGVtLCB7XG4gICAgICBrZXk6IGtleSxcbiAgICAgIGxvY2FsZTogbG9jYWxlLFxuICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICBjbGFzc05hbWU6IG1vdGlvbkNsYXNzTmFtZSxcbiAgICAgIHN0eWxlOiBtb3Rpb25TdHlsZSxcbiAgICAgIGZpbGU6IGZpbGUsXG4gICAgICBpdGVtczogaXRlbXMsXG4gICAgICBwcm9ncmVzczogcHJvZ3Jlc3MsXG4gICAgICBsaXN0VHlwZTogbGlzdFR5cGUsXG4gICAgICBpc0ltZ1VybDogaXNJbWdVcmwsXG4gICAgICBzaG93UHJldmlld0ljb246IHNob3dQcmV2aWV3SWNvbixcbiAgICAgIHNob3dSZW1vdmVJY29uOiBzaG93UmVtb3ZlSWNvbixcbiAgICAgIHNob3dEb3dubG9hZEljb246IHNob3dEb3dubG9hZEljb24sXG4gICAgICByZW1vdmVJY29uOiByZW1vdmVJY29uLFxuICAgICAgcHJldmlld0ljb246IHByZXZpZXdJY29uLFxuICAgICAgZG93bmxvYWRJY29uOiBkb3dubG9hZEljb24sXG4gICAgICBleHRyYTogZXh0cmEsXG4gICAgICBpY29uUmVuZGVyOiBpbnRlcm5hbEljb25SZW5kZXIsXG4gICAgICBhY3Rpb25JY29uUmVuZGVyOiBhY3Rpb25JY29uUmVuZGVyLFxuICAgICAgaXRlbVJlbmRlcjogaXRlbVJlbmRlcixcbiAgICAgIG9uUHJldmlldzogb25JbnRlcm5hbFByZXZpZXcsXG4gICAgICBvbkRvd25sb2FkOiBvbkludGVybmFsRG93bmxvYWQsXG4gICAgICBvbkNsb3NlOiBvbkludGVybmFsQ2xvc2VcbiAgICB9KTtcbiAgfSksIGFwcGVuZEFjdGlvbiAmJiAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ1NTTW90aW9uLCBPYmplY3QuYXNzaWduKHt9LCBtb3Rpb25Db25maWcsIHtcbiAgICB2aXNpYmxlOiBhcHBlbmRBY3Rpb25WaXNpYmxlLFxuICAgIGZvcmNlUmVuZGVyOiB0cnVlXG4gIH0pLCBfcmVmMiA9PiB7XG4gICAgbGV0IHtcbiAgICAgIGNsYXNzTmFtZTogbW90aW9uQ2xhc3NOYW1lLFxuICAgICAgc3R5bGU6IG1vdGlvblN0eWxlXG4gICAgfSA9IF9yZWYyO1xuICAgIHJldHVybiBjbG9uZUVsZW1lbnQoYXBwZW5kQWN0aW9uLCBvcmlQcm9wcyA9PiAoe1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKG9yaVByb3BzLmNsYXNzTmFtZSwgbW90aW9uQ2xhc3NOYW1lKSxcbiAgICAgIHN0eWxlOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgbW90aW9uU3R5bGUpLCB7XG4gICAgICAgIC8vIHByZXZlbnQgdGhlIGVsZW1lbnQgaGFzIGhvdmVyIGNzcyBwc2V1ZG8tY2xhc3MgdGhhdCBtYXkgY2F1c2UgYW5pbWF0aW9uIHRvIGVuZCBwcmVtYXR1cmVseS5cbiAgICAgICAgcG9pbnRlckV2ZW50czogbW90aW9uQ2xhc3NOYW1lID8gJ25vbmUnIDogdW5kZWZpbmVkXG4gICAgICB9KSwgb3JpUHJvcHMuc3R5bGUpXG4gICAgfSkpO1xuICB9KSkpO1xufTtcbmNvbnN0IFVwbG9hZExpc3QgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihJbnRlcm5hbFVwbG9hZExpc3QpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgVXBsb2FkTGlzdC5kaXNwbGF5TmFtZSA9ICdVcGxvYWRMaXN0Jztcbn1cbmV4cG9ydCBkZWZhdWx0IFVwbG9hZExpc3Q7IiwgImltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5leHBvcnQgZnVuY3Rpb24gZmlsZTJPYmooZmlsZSkge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBmaWxlKSwge1xuICAgIGxhc3RNb2RpZmllZDogZmlsZS5sYXN0TW9kaWZpZWQsXG4gICAgbGFzdE1vZGlmaWVkRGF0ZTogZmlsZS5sYXN0TW9kaWZpZWREYXRlLFxuICAgIG5hbWU6IGZpbGUubmFtZSxcbiAgICBzaXplOiBmaWxlLnNpemUsXG4gICAgdHlwZTogZmlsZS50eXBlLFxuICAgIHVpZDogZmlsZS51aWQsXG4gICAgcGVyY2VudDogMCxcbiAgICBvcmlnaW5GaWxlT2JqOiBmaWxlXG4gIH0pO1xufVxuLyoqIFVwbG9hZCBmaWxlTGlzdC4gUmVwbGFjZSBmaWxlIGlmIGV4aXN0IG9yIGp1c3QgcHVzaCBpbnRvIGl0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUZpbGVMaXN0KGZpbGUsIGZpbGVMaXN0KSB7XG4gIGNvbnN0IG5leHRGaWxlTGlzdCA9IF90b0NvbnN1bWFibGVBcnJheShmaWxlTGlzdCk7XG4gIGNvbnN0IGZpbGVJbmRleCA9IG5leHRGaWxlTGlzdC5maW5kSW5kZXgoX3JlZiA9PiB7XG4gICAgbGV0IHtcbiAgICAgIHVpZFxuICAgIH0gPSBfcmVmO1xuICAgIHJldHVybiB1aWQgPT09IGZpbGUudWlkO1xuICB9KTtcbiAgaWYgKGZpbGVJbmRleCA9PT0gLTEpIHtcbiAgICBuZXh0RmlsZUxpc3QucHVzaChmaWxlKTtcbiAgfSBlbHNlIHtcbiAgICBuZXh0RmlsZUxpc3RbZmlsZUluZGV4XSA9IGZpbGU7XG4gIH1cbiAgcmV0dXJuIG5leHRGaWxlTGlzdDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWxlSXRlbShmaWxlLCBmaWxlTGlzdCkge1xuICBjb25zdCBtYXRjaEtleSA9IGZpbGUudWlkICE9PSB1bmRlZmluZWQgPyAndWlkJyA6ICduYW1lJztcbiAgcmV0dXJuIGZpbGVMaXN0LmZpbHRlcihpdGVtID0+IGl0ZW1bbWF0Y2hLZXldID09PSBmaWxlW21hdGNoS2V5XSlbMF07XG59XG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRmlsZUl0ZW0oZmlsZSwgZmlsZUxpc3QpIHtcbiAgY29uc3QgbWF0Y2hLZXkgPSBmaWxlLnVpZCAhPT0gdW5kZWZpbmVkID8gJ3VpZCcgOiAnbmFtZSc7XG4gIGNvbnN0IHJlbW92ZWQgPSBmaWxlTGlzdC5maWx0ZXIoaXRlbSA9PiBpdGVtW21hdGNoS2V5XSAhPT0gZmlsZVttYXRjaEtleV0pO1xuICBpZiAocmVtb3ZlZC5sZW5ndGggPT09IGZpbGVMaXN0Lmxlbmd0aCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiByZW1vdmVkO1xufVxuLy8gPT09PT09PT09PT09PT09PT09PT0gRGVmYXVsdCBJbWFnZSBQcmV2aWV3ID09PT09PT09PT09PT09PT09PT09XG5jb25zdCBleHRuYW1lID0gZnVuY3Rpb24gKCkge1xuICBsZXQgdXJsID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnJztcbiAgY29uc3QgdGVtcCA9IHVybC5zcGxpdCgnLycpO1xuICBjb25zdCBmaWxlbmFtZSA9IHRlbXBbdGVtcC5sZW5ndGggLSAxXTtcbiAgY29uc3QgZmlsZW5hbWVXaXRob3V0U3VmZml4ID0gZmlsZW5hbWUuc3BsaXQoLyN8XFw/LylbMF07XG4gIHJldHVybiAoL1xcLlteLi9cXFxcXSokLy5leGVjKGZpbGVuYW1lV2l0aG91dFN1ZmZpeCkgfHwgWycnXSlbMF07XG59O1xuY29uc3QgaXNJbWFnZUZpbGVUeXBlID0gdHlwZSA9PiB0eXBlLmluZGV4T2YoJ2ltYWdlLycpID09PSAwO1xuZXhwb3J0IGNvbnN0IGlzSW1hZ2VVcmwgPSBmaWxlID0+IHtcbiAgaWYgKGZpbGUudHlwZSAmJiAhZmlsZS50aHVtYlVybCkge1xuICAgIHJldHVybiBpc0ltYWdlRmlsZVR5cGUoZmlsZS50eXBlKTtcbiAgfVxuICBjb25zdCB1cmwgPSBmaWxlLnRodW1iVXJsIHx8IGZpbGUudXJsIHx8ICcnO1xuICBjb25zdCBleHRlbnNpb24gPSBleHRuYW1lKHVybCk7XG4gIGlmICgvXmRhdGE6aW1hZ2VcXC8vLnRlc3QodXJsKSB8fCAvKHdlYnB8c3ZnfHBuZ3xnaWZ8anBnfGpwZWd8amZpZnxibXB8ZHBnfGljb3xoZWljfGhlaWYpJC9pLnRlc3QoZXh0ZW5zaW9uKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICgvXmRhdGE6Ly50ZXN0KHVybCkpIHtcbiAgICAvLyBvdGhlciBmaWxlIHR5cGVzIG9mIGJhc2U2NFxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoZXh0ZW5zaW9uKSB7XG4gICAgLy8gb3RoZXIgZmlsZSB0eXBlcyB3aGljaCBoYXZlIGV4dGVuc2lvblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5jb25zdCBNRUFTVVJFX1NJWkUgPSAyMDA7XG5leHBvcnQgZnVuY3Rpb24gcHJldmlld0ltYWdlKGZpbGUpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgIGlmICghZmlsZS50eXBlIHx8ICFpc0ltYWdlRmlsZVR5cGUoZmlsZS50eXBlKSkge1xuICAgICAgcmVzb2x2ZSgnJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy53aWR0aCA9IE1FQVNVUkVfU0laRTtcbiAgICBjYW52YXMuaGVpZ2h0ID0gTUVBU1VSRV9TSVpFO1xuICAgIGNhbnZhcy5zdHlsZS5jc3NUZXh0ID0gYHBvc2l0aW9uOiBmaXhlZDsgbGVmdDogMDsgdG9wOiAwOyB3aWR0aDogJHtNRUFTVVJFX1NJWkV9cHg7IGhlaWdodDogJHtNRUFTVVJFX1NJWkV9cHg7IHotaW5kZXg6IDk5OTk7IGRpc3BsYXk6IG5vbmU7YDtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNhbnZhcyk7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XG4gICAgaW1nLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodFxuICAgICAgfSA9IGltZztcbiAgICAgIGxldCBkcmF3V2lkdGggPSBNRUFTVVJFX1NJWkU7XG4gICAgICBsZXQgZHJhd0hlaWdodCA9IE1FQVNVUkVfU0laRTtcbiAgICAgIGxldCBvZmZzZXRYID0gMDtcbiAgICAgIGxldCBvZmZzZXRZID0gMDtcbiAgICAgIGlmICh3aWR0aCA+IGhlaWdodCkge1xuICAgICAgICBkcmF3SGVpZ2h0ID0gaGVpZ2h0ICogKE1FQVNVUkVfU0laRSAvIHdpZHRoKTtcbiAgICAgICAgb2Zmc2V0WSA9IC0oZHJhd0hlaWdodCAtIGRyYXdXaWR0aCkgLyAyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZHJhd1dpZHRoID0gd2lkdGggKiAoTUVBU1VSRV9TSVpFIC8gaGVpZ2h0KTtcbiAgICAgICAgb2Zmc2V0WCA9IC0oZHJhd1dpZHRoIC0gZHJhd0hlaWdodCkgLyAyO1xuICAgICAgfVxuICAgICAgY3R4LmRyYXdJbWFnZShpbWcsIG9mZnNldFgsIG9mZnNldFksIGRyYXdXaWR0aCwgZHJhd0hlaWdodCk7XG4gICAgICBjb25zdCBkYXRhVVJMID0gY2FudmFzLnRvRGF0YVVSTCgpO1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChjYW52YXMpO1xuICAgICAgd2luZG93LlVSTC5yZXZva2VPYmplY3RVUkwoaW1nLnNyYyk7XG4gICAgICByZXNvbHZlKGRhdGFVUkwpO1xuICAgIH07XG4gICAgaW1nLmNyb3NzT3JpZ2luID0gJ2Fub255bW91cyc7XG4gICAgaWYgKGZpbGUudHlwZS5zdGFydHNXaXRoKCdpbWFnZS9zdmcreG1sJykpIHtcbiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xuICAgICAgICBpZiAocmVhZGVyLnJlc3VsdCAmJiB0eXBlb2YgcmVhZGVyLnJlc3VsdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBpbWcuc3JjID0gcmVhZGVyLnJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICAgIH0gZWxzZSBpZiAoZmlsZS50eXBlLnN0YXJ0c1dpdGgoJ2ltYWdlL2dpZicpKSB7XG4gICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgaWYgKHJlYWRlci5yZXN1bHQpIHtcbiAgICAgICAgICByZXNvbHZlKHJlYWRlci5yZXN1bHQpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGltZy5zcmMgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChmaWxlKTtcbiAgICB9XG4gIH0pO1xufSIsICJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IERlbGV0ZU91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9EZWxldGVPdXRsaW5lZFwiO1xuaW1wb3J0IERvd25sb2FkT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0Rvd25sb2FkT3V0bGluZWRcIjtcbmltcG9ydCBFeWVPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvRXllT3V0bGluZWRcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IENTU01vdGlvbiBmcm9tICdyYy1tb3Rpb24nO1xuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uLy4uL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgUHJvZ3Jlc3MgZnJvbSAnLi4vLi4vcHJvZ3Jlc3MnO1xuaW1wb3J0IFRvb2x0aXAgZnJvbSAnLi4vLi4vdG9vbHRpcCc7XG5jb25zdCBMaXN0SXRlbSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKChfcmVmLCByZWYpID0+IHtcbiAgbGV0IHtcbiAgICBwcmVmaXhDbHMsXG4gICAgY2xhc3NOYW1lLFxuICAgIHN0eWxlLFxuICAgIGxvY2FsZSxcbiAgICBsaXN0VHlwZSxcbiAgICBmaWxlLFxuICAgIGl0ZW1zLFxuICAgIHByb2dyZXNzOiBwcm9ncmVzc1Byb3BzLFxuICAgIGljb25SZW5kZXIsXG4gICAgYWN0aW9uSWNvblJlbmRlcixcbiAgICBpdGVtUmVuZGVyLFxuICAgIGlzSW1nVXJsLFxuICAgIHNob3dQcmV2aWV3SWNvbixcbiAgICBzaG93UmVtb3ZlSWNvbixcbiAgICBzaG93RG93bmxvYWRJY29uLFxuICAgIHByZXZpZXdJY29uOiBjdXN0b21QcmV2aWV3SWNvbixcbiAgICByZW1vdmVJY29uOiBjdXN0b21SZW1vdmVJY29uLFxuICAgIGRvd25sb2FkSWNvbjogY3VzdG9tRG93bmxvYWRJY29uLFxuICAgIGV4dHJhOiBjdXN0b21FeHRyYSxcbiAgICBvblByZXZpZXcsXG4gICAgb25Eb3dubG9hZCxcbiAgICBvbkNsb3NlXG4gIH0gPSBfcmVmO1xuICB2YXIgX2EsIF9iO1xuICAvLyBTdGF0dXM6IHdoaWNoIHdpbGwgaWdub3JlIGByZW1vdmVkYCBzdGF0dXNcbiAgY29uc3Qge1xuICAgIHN0YXR1c1xuICB9ID0gZmlsZTtcbiAgY29uc3QgW21lcmdlZFN0YXR1cywgc2V0TWVyZ2VkU3RhdHVzXSA9IFJlYWN0LnVzZVN0YXRlKHN0YXR1cyk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHN0YXR1cyAhPT0gJ3JlbW92ZWQnKSB7XG4gICAgICBzZXRNZXJnZWRTdGF0dXMoc3RhdHVzKTtcbiAgICB9XG4gIH0sIFtzdGF0dXNdKTtcbiAgLy8gRGVsYXkgdG8gc2hvdyB0aGUgcHJvZ3Jlc3MgYmFyXG4gIGNvbnN0IFtzaG93UHJvZ3Jlc3MsIHNldFNob3dQcm9ncmVzc10gPSBSZWFjdC51c2VTdGF0ZShmYWxzZSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHNldFNob3dQcm9ncmVzcyh0cnVlKTtcbiAgICB9LCAzMDApO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgY29uc3QgaWNvbk5vZGUgPSBpY29uUmVuZGVyKGZpbGUpO1xuICBsZXQgaWNvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGAke3ByZWZpeENsc30taWNvbmBcbiAgfSwgaWNvbk5vZGUpO1xuICBpZiAobGlzdFR5cGUgPT09ICdwaWN0dXJlJyB8fCBsaXN0VHlwZSA9PT0gJ3BpY3R1cmUtY2FyZCcgfHwgbGlzdFR5cGUgPT09ICdwaWN0dXJlLWNpcmNsZScpIHtcbiAgICBpZiAobWVyZ2VkU3RhdHVzID09PSAndXBsb2FkaW5nJyB8fCAhZmlsZS50aHVtYlVybCAmJiAhZmlsZS51cmwpIHtcbiAgICAgIGNvbnN0IHVwbG9hZGluZ0NsYXNzTmFtZSA9IGNsYXNzTmFtZXMoYCR7cHJlZml4Q2xzfS1saXN0LWl0ZW0tdGh1bWJuYWlsYCwge1xuICAgICAgICBbYCR7cHJlZml4Q2xzfS1saXN0LWl0ZW0tZmlsZWBdOiBtZXJnZWRTdGF0dXMgIT09ICd1cGxvYWRpbmcnXG4gICAgICB9KTtcbiAgICAgIGljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogdXBsb2FkaW5nQ2xhc3NOYW1lXG4gICAgICB9LCBpY29uTm9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRodW1ibmFpbCA9IChpc0ltZ1VybCA9PT0gbnVsbCB8fCBpc0ltZ1VybCA9PT0gdm9pZCAwID8gdm9pZCAwIDogaXNJbWdVcmwoZmlsZSkpID8gKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiaW1nXCIsIHtcbiAgICAgICAgc3JjOiBmaWxlLnRodW1iVXJsIHx8IGZpbGUudXJsLFxuICAgICAgICBhbHQ6IGZpbGUubmFtZSxcbiAgICAgICAgY2xhc3NOYW1lOiBgJHtwcmVmaXhDbHN9LWxpc3QtaXRlbS1pbWFnZWAsXG4gICAgICAgIGNyb3NzT3JpZ2luOiBmaWxlLmNyb3NzT3JpZ2luXG4gICAgICB9KSkgOiBpY29uTm9kZTtcbiAgICAgIGNvbnN0IGFDbGFzc05hbWUgPSBjbGFzc05hbWVzKGAke3ByZWZpeENsc30tbGlzdC1pdGVtLXRodW1ibmFpbGAsIHtcbiAgICAgICAgW2Ake3ByZWZpeENsc30tbGlzdC1pdGVtLWZpbGVgXTogaXNJbWdVcmwgJiYgIWlzSW1nVXJsKGZpbGUpXG4gICAgICB9KTtcbiAgICAgIGljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImFcIiwge1xuICAgICAgICBjbGFzc05hbWU6IGFDbGFzc05hbWUsXG4gICAgICAgIG9uQ2xpY2s6IGUgPT4gb25QcmV2aWV3KGZpbGUsIGUpLFxuICAgICAgICBocmVmOiBmaWxlLnVybCB8fCBmaWxlLnRodW1iVXJsLFxuICAgICAgICB0YXJnZXQ6IFwiX2JsYW5rXCIsXG4gICAgICAgIHJlbDogXCJub29wZW5lciBub3JlZmVycmVyXCJcbiAgICAgIH0sIHRodW1ibmFpbCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IGxpc3RJdGVtQ2xhc3NOYW1lID0gY2xhc3NOYW1lcyhgJHtwcmVmaXhDbHN9LWxpc3QtaXRlbWAsIGAke3ByZWZpeENsc30tbGlzdC1pdGVtLSR7bWVyZ2VkU3RhdHVzfWApO1xuICBjb25zdCBsaW5rUHJvcHMgPSB0eXBlb2YgZmlsZS5saW5rUHJvcHMgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShmaWxlLmxpbmtQcm9wcykgOiBmaWxlLmxpbmtQcm9wcztcbiAgY29uc3QgcmVtb3ZlSWNvbiA9ICh0eXBlb2Ygc2hvd1JlbW92ZUljb24gPT09ICdmdW5jdGlvbicgPyBzaG93UmVtb3ZlSWNvbihmaWxlKSA6IHNob3dSZW1vdmVJY29uKSA/IGFjdGlvbkljb25SZW5kZXIoKHR5cGVvZiBjdXN0b21SZW1vdmVJY29uID09PSAnZnVuY3Rpb24nID8gY3VzdG9tUmVtb3ZlSWNvbihmaWxlKSA6IGN1c3RvbVJlbW92ZUljb24pIHx8ICgvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEZWxldGVPdXRsaW5lZCwgbnVsbCkpLCAoKSA9PiBvbkNsb3NlKGZpbGUpLCBwcmVmaXhDbHMsIGxvY2FsZS5yZW1vdmVGaWxlLFxuICAvLyBhY2NlcHRVcGxvYWREaXNhYmxlZCBpcyB0cnVlLCBvbmx5IHJlbW92ZSBpY29uIHdpbGwgZm9sbG93IFVwbG9hZCBkaXNhYmxlZCBwcm9wXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzQ2MTcxXG4gIHRydWUpIDogbnVsbDtcbiAgY29uc3QgZG93bmxvYWRJY29uID0gKHR5cGVvZiBzaG93RG93bmxvYWRJY29uID09PSAnZnVuY3Rpb24nID8gc2hvd0Rvd25sb2FkSWNvbihmaWxlKSA6IHNob3dEb3dubG9hZEljb24pICYmIG1lcmdlZFN0YXR1cyA9PT0gJ2RvbmUnID8gYWN0aW9uSWNvblJlbmRlcigodHlwZW9mIGN1c3RvbURvd25sb2FkSWNvbiA9PT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbURvd25sb2FkSWNvbihmaWxlKSA6IGN1c3RvbURvd25sb2FkSWNvbikgfHwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRG93bmxvYWRPdXRsaW5lZCwgbnVsbCksICgpID0+IG9uRG93bmxvYWQoZmlsZSksIHByZWZpeENscywgbG9jYWxlLmRvd25sb2FkRmlsZSkgOiBudWxsO1xuICBjb25zdCBkb3dubG9hZE9yRGVsZXRlID0gbGlzdFR5cGUgIT09ICdwaWN0dXJlLWNhcmQnICYmIGxpc3RUeXBlICE9PSAncGljdHVyZS1jaXJjbGUnICYmICgvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGtleTogXCJkb3dubG9hZC1kZWxldGVcIixcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoYCR7cHJlZml4Q2xzfS1saXN0LWl0ZW0tYWN0aW9uc2AsIHtcbiAgICAgIHBpY3R1cmU6IGxpc3RUeXBlID09PSAncGljdHVyZSdcbiAgICB9KVxuICB9LCBkb3dubG9hZEljb24sIHJlbW92ZUljb24pKTtcbiAgY29uc3QgZXh0cmFDb250ZW50ID0gdHlwZW9mIGN1c3RvbUV4dHJhID09PSAnZnVuY3Rpb24nID8gY3VzdG9tRXh0cmEoZmlsZSkgOiBjdXN0b21FeHRyYTtcbiAgY29uc3QgZXh0cmEgPSBleHRyYUNvbnRlbnQgJiYgKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBgJHtwcmVmaXhDbHN9LWxpc3QtaXRlbS1leHRyYWBcbiAgfSwgZXh0cmFDb250ZW50KSk7XG4gIGNvbnN0IGxpc3RJdGVtTmFtZUNsYXNzID0gY2xhc3NOYW1lcyhgJHtwcmVmaXhDbHN9LWxpc3QtaXRlbS1uYW1lYCk7XG4gIGNvbnN0IGZpbGVOYW1lID0gZmlsZS51cmwgPyAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJhXCIsIE9iamVjdC5hc3NpZ24oe1xuICAgIGtleTogXCJ2aWV3XCIsXG4gICAgdGFyZ2V0OiBcIl9ibGFua1wiLFxuICAgIHJlbDogXCJub29wZW5lciBub3JlZmVycmVyXCIsXG4gICAgY2xhc3NOYW1lOiBsaXN0SXRlbU5hbWVDbGFzcyxcbiAgICB0aXRsZTogZmlsZS5uYW1lXG4gIH0sIGxpbmtQcm9wcywge1xuICAgIGhyZWY6IGZpbGUudXJsLFxuICAgIG9uQ2xpY2s6IGUgPT4gb25QcmV2aWV3KGZpbGUsIGUpXG4gIH0pLCBmaWxlLm5hbWUsIGV4dHJhKSkgOiAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBrZXk6IFwidmlld1wiLFxuICAgIGNsYXNzTmFtZTogbGlzdEl0ZW1OYW1lQ2xhc3MsXG4gICAgb25DbGljazogZSA9PiBvblByZXZpZXcoZmlsZSwgZSksXG4gICAgdGl0bGU6IGZpbGUubmFtZVxuICB9LCBmaWxlLm5hbWUsIGV4dHJhKSk7XG4gIGNvbnN0IHByZXZpZXdJY29uID0gKHR5cGVvZiBzaG93UHJldmlld0ljb24gPT09ICdmdW5jdGlvbicgPyBzaG93UHJldmlld0ljb24oZmlsZSkgOiBzaG93UHJldmlld0ljb24pICYmIChmaWxlLnVybCB8fCBmaWxlLnRodW1iVXJsKSA/ICgvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImFcIiwge1xuICAgIGhyZWY6IGZpbGUudXJsIHx8IGZpbGUudGh1bWJVcmwsXG4gICAgdGFyZ2V0OiBcIl9ibGFua1wiLFxuICAgIHJlbDogXCJub29wZW5lciBub3JlZmVycmVyXCIsXG4gICAgb25DbGljazogZSA9PiBvblByZXZpZXcoZmlsZSwgZSksXG4gICAgdGl0bGU6IGxvY2FsZS5wcmV2aWV3RmlsZVxuICB9LCB0eXBlb2YgY3VzdG9tUHJldmlld0ljb24gPT09ICdmdW5jdGlvbicgPyBjdXN0b21QcmV2aWV3SWNvbihmaWxlKSA6IGN1c3RvbVByZXZpZXdJY29uIHx8IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEV5ZU91dGxpbmVkLCBudWxsKSkpIDogbnVsbDtcbiAgY29uc3QgcGljdHVyZUNhcmRBY3Rpb25zID0gKGxpc3RUeXBlID09PSAncGljdHVyZS1jYXJkJyB8fCBsaXN0VHlwZSA9PT0gJ3BpY3R1cmUtY2lyY2xlJykgJiYgbWVyZ2VkU3RhdHVzICE9PSAndXBsb2FkaW5nJyAmJiAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IGAke3ByZWZpeENsc30tbGlzdC1pdGVtLWFjdGlvbnNgXG4gIH0sIHByZXZpZXdJY29uLCBtZXJnZWRTdGF0dXMgPT09ICdkb25lJyAmJiBkb3dubG9hZEljb24sIHJlbW92ZUljb24pKTtcbiAgY29uc3Qge1xuICAgIGdldFByZWZpeENsc1xuICB9ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KTtcbiAgY29uc3Qgcm9vdFByZWZpeENscyA9IGdldFByZWZpeENscygpO1xuICBjb25zdCBkb20gPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBsaXN0SXRlbUNsYXNzTmFtZVxuICB9LCBpY29uLCBmaWxlTmFtZSwgZG93bmxvYWRPckRlbGV0ZSwgcGljdHVyZUNhcmRBY3Rpb25zLCBzaG93UHJvZ3Jlc3MgJiYgKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENTU01vdGlvbiwge1xuICAgIG1vdGlvbk5hbWU6IGAke3Jvb3RQcmVmaXhDbHN9LWZhZGVgLFxuICAgIHZpc2libGU6IG1lcmdlZFN0YXR1cyA9PT0gJ3VwbG9hZGluZycsXG4gICAgbW90aW9uRGVhZGxpbmU6IDIwMDBcbiAgfSwgX3JlZjIgPT4ge1xuICAgIGxldCB7XG4gICAgICBjbGFzc05hbWU6IG1vdGlvbkNsYXNzTmFtZVxuICAgIH0gPSBfcmVmMjtcbiAgICAvLyBzaG93IGxvYWRpbmcgaWNvbiBpZiB1cGxvYWQgcHJvZ3Jlc3MgbGlzdGVuZXIgaXMgZGlzYWJsZWRcbiAgICBjb25zdCBsb2FkaW5nUHJvZ3Jlc3MgPSAncGVyY2VudCcgaW4gZmlsZSA/ICgvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQcm9ncmVzcywgT2JqZWN0LmFzc2lnbih7fSwgcHJvZ3Jlc3NQcm9wcywge1xuICAgICAgdHlwZTogXCJsaW5lXCIsXG4gICAgICBwZXJjZW50OiBmaWxlLnBlcmNlbnQsXG4gICAgICBcImFyaWEtbGFiZWxcIjogZmlsZVsnYXJpYS1sYWJlbCddLFxuICAgICAgXCJhcmlhLWxhYmVsbGVkYnlcIjogZmlsZVsnYXJpYS1sYWJlbGxlZGJ5J11cbiAgICB9KSkpIDogbnVsbDtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGAke3ByZWZpeENsc30tbGlzdC1pdGVtLXByb2dyZXNzYCwgbW90aW9uQ2xhc3NOYW1lKVxuICAgIH0sIGxvYWRpbmdQcm9ncmVzcyk7XG4gIH0pKSk7XG4gIGNvbnN0IG1lc3NhZ2UgPSBmaWxlLnJlc3BvbnNlICYmIHR5cGVvZiBmaWxlLnJlc3BvbnNlID09PSAnc3RyaW5nJyA/IGZpbGUucmVzcG9uc2UgOiAoKF9hID0gZmlsZS5lcnJvcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnN0YXR1c1RleHQpIHx8ICgoX2IgPSBmaWxlLmVycm9yKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubWVzc2FnZSkgfHwgbG9jYWxlLnVwbG9hZEVycm9yO1xuICBjb25zdCBpdGVtID0gbWVyZ2VkU3RhdHVzID09PSAnZXJyb3InID8gKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXAsIHtcbiAgICB0aXRsZTogbWVzc2FnZSxcbiAgICBnZXRQb3B1cENvbnRhaW5lcjogbm9kZSA9PiBub2RlLnBhcmVudE5vZGVcbiAgfSwgZG9tKSkgOiBkb207XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGAke3ByZWZpeENsc30tbGlzdC1pdGVtLWNvbnRhaW5lcmAsIGNsYXNzTmFtZSksXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIHJlZjogcmVmXG4gIH0sIGl0ZW1SZW5kZXIgPyBpdGVtUmVuZGVyKGl0ZW0sIGZpbGUsIGl0ZW1zLCB7XG4gICAgZG93bmxvYWQ6IG9uRG93bmxvYWQuYmluZChudWxsLCBmaWxlKSxcbiAgICBwcmV2aWV3OiBvblByZXZpZXcuYmluZChudWxsLCBmaWxlKSxcbiAgICByZW1vdmU6IG9uQ2xvc2UuYmluZChudWxsLCBmaWxlKVxuICB9KSA6IGl0ZW0pO1xufSk7XG5leHBvcnQgZGVmYXVsdCBMaXN0SXRlbTsiLCAiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCBEcmFnZ2VyIGZyb20gJy4vRHJhZ2dlcic7XG5pbXBvcnQgSW50ZXJuYWxVcGxvYWQsIHsgTElTVF9JR05PUkUgfSBmcm9tICcuL1VwbG9hZCc7XG5jb25zdCBVcGxvYWQgPSBJbnRlcm5hbFVwbG9hZDtcblVwbG9hZC5EcmFnZ2VyID0gRHJhZ2dlcjtcblVwbG9hZC5MSVNUX0lHTk9SRSA9IExJU1RfSUdOT1JFO1xuZXhwb3J0IGRlZmF1bHQgVXBsb2FkOyIsICJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCJcbmltcG9ydCBXb3JrZmxvd0VkaXQgZnJvbSBcIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21tb24vV29ya2Zsb3dFZGl0XCJcbmltcG9ydCB7IHNldFdpZGdldFZhbHVlIH0gZnJvbSBcIi4uLy4uL2dyYXBoLXRvLWZvcm0ubWpzXCI7XG5pbXBvcnQgeyBOdW1iZXJXaWRnZXQgfSBmcm9tIFwiLi93aWRnZXRzL251bWJlclwiO1xuaW1wb3J0IHsgQ29tYm9XaWRnZXQgfSBmcm9tIFwiLi93aWRnZXRzL2NvbWJvXCI7XG5pbXBvcnQgeyBUb2dnbGVXaWRnZXQgfSBmcm9tIFwiLi93aWRnZXRzL3RvZ2dsZVwiO1xuaW1wb3J0IHsgU3RyaW5nV2lkZ2V0IH0gZnJvbSBcIi4vd2lkZ2V0cy9zdHJpbmdcIjtcbmltcG9ydCBpMThuIGZyb20gXCIuLi8uLi8uLi8uLi8uLi9zcmMvY29tbW9uL2kxOG4ubXRzXCI7XG5pbXBvcnQgeyBDb25maWdQcm92aWRlciwgSW5wdXQgfSBmcm9tIFwiYW50ZFwiO1xuaW1wb3J0IHsgRWRpdGFibGVUaXRsZSB9IGZyb20gXCIuL3dpZGdldHMvRWRpdGFibGVUaXRsZVwiO1xuaW1wb3J0IHsgQ29tZnlTb2NrZXQgfSBmcm9tIFwiLi4vLi4vc29ja2V0L0NvbWZ5U29ja2V0Lm10c1wiO1xuaW1wb3J0IHsgSW1hZ2VXaWRnZXQgfSBmcm9tIFwiLi93aWRnZXRzL2ltYWdlX21hc2tfcGF0aFwiO1xuaW1wb3J0IHsgV2lkZ2V0VGFibGVTdHJ1Y3R1cmUsIFdpZGdldFRhYmxlU3RydWN0dXJlTm9kZSwgV2lkZ2V0VGFibGVWYWx1ZSB9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9zcmMvdHlwZXMvc2RwcHBcIjtcbmltcG9ydCB7IHBhZ2VTdG9yZSB9IGZyb20gXCJwaG90b3Nob3BNb2RlbHMubWpzXCI7XG5kZWNsYXJlIGNvbnN0IGFwcDogYW55O1xuY29uc3QgYXBpID0gKHdpbmRvdyBhcyBhbnkpLmNvbWZ5QVBJLmFwaS5hcGk7XG5leHBvcnQgY2xhc3MgV29ya2Zsb3dFZGl0V3JhcCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDx7XG59LCB7XG4gICAgd2lkZ2V0VGFibGVTdHJ1Y3R1cmU6IFdpZGdldFRhYmxlU3RydWN0dXJlLFxuICAgIHdpZGdldFRhYmxlVmFsdWU6IFdpZGdldFRhYmxlVmFsdWUsXG4gICAgd2lkZ2V0VGFibGVFcnJvcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgY29tZnlTdGF0dXM6IHtcbiAgICAgICAgc2lkOiBzdHJpbmcsXG4gICAgICAgIHNzaWQ6IHN0cmluZyxcbiAgICAgICAgcHJvZ3Jlc3M6IG51bWJlcixcbiAgICAgICAgcXVldWVTaXplOiBudW1iZXIsXG4gICAgICAgIGxhc3RFcnJvcjogc3RyaW5nLFxuICAgICAgICBleGVjdXRpbmdOb2RlVGl0bGU6IHN0cmluZyxcbiAgICB9LFxufT4ge1xuICAgIHN0YXRlID0ge1xuICAgICAgICBjb21meVN0YXR1czoge1xuICAgICAgICAgICAgc2lkOiAnJyxcbiAgICAgICAgICAgIHNzaWQ6ICcnLFxuICAgICAgICAgICAgcHJvZ3Jlc3M6IDAsXG4gICAgICAgICAgICBxdWV1ZVNpemU6IDAsXG4gICAgICAgICAgICBsYXN0RXJyb3I6ICcnLFxuICAgICAgICAgICAgZXhlY3V0aW5nTm9kZVRpdGxlOiAnJyxcbiAgICAgICAgfSxcbiAgICAgICAgd2lkZ2V0VGFibGVTdHJ1Y3R1cmU6IHBhZ2VTdG9yZS5kYXRhLndpZGdldFRhYmxlU3RydWN0dXJlLFxuICAgICAgICB3aWRnZXRUYWJsZVZhbHVlOiBwYWdlU3RvcmUuZGF0YS53aWRnZXRUYWJsZVZhbHVlLFxuICAgICAgICB3aWRnZXRUYWJsZUVycm9yczogcGFnZVN0b3JlLmRhdGEud2lkZ2V0VGFibGVFcnJvcnMsXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBldmVudExpc3RlbmVyczogeyBldmVudDogc3RyaW5nOyBoYW5kbGVyOiAoZTogYW55KSA9PiB2b2lkIH1bXSA9IFtdO1xuICAgIHByaXZhdGUgdW5zdWJzY3JpYmVzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuXG4gICAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgICAgICBzdXBlcihwcm9wcylcblxuICAgICAgICBjb25zdCBhZGRMaXN0ZW5lciA9IChldmVudDogc3RyaW5nLCBoYW5kbGVyOiAoZTogYW55KSA9PiB2b2lkKSA9PiB7XG4gICAgICAgICAgICBhcGkuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlcik7XG4gICAgICAgICAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLnB1c2goeyBldmVudCwgaGFuZGxlciB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBhZGRMaXN0ZW5lcihcInByb2dyZXNzXCIsICh7IGRldGFpbCB9OiB7IGRldGFpbDogeyB2YWx1ZTogbnVtYmVyLCBtYXg6IG51bWJlciB9IH0pID0+IHtcbiAgICAgICAgICAgIGlmICghZGV0YWlsIHx8IGlzTmFOKGRldGFpbC52YWx1ZSAvIGRldGFpbC5tYXgpKSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBwcm9ncmVzcyA9IE1hdGgucm91bmQoKGRldGFpbC52YWx1ZSAvIGRldGFpbC5tYXgpICogMTAwKTtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIGNvbWZ5U3RhdHVzOiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUuY29tZnlTdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzOiBwcm9ncmVzc1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBhZGRMaXN0ZW5lcihcInN0YXR1c1wiLCAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoIWUuZGV0YWlsPy5leGVjX2luZm8pIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIGNvbWZ5U3RhdHVzOiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUuY29tZnlTdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlU2l6ZTogZS5kZXRhaWwuZXhlY19pbmZvLnF1ZXVlX3JlbWFpbmluZ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBhZGRMaXN0ZW5lcihcImV4ZWN1dGlvbl9lcnJvclwiLCAoeyBkZXRhaWwgfTogeyBkZXRhaWw6IHsgZXhjZXB0aW9uX21lc3NhZ2U6IHN0cmluZyB9IH0pID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIGNvbWZ5U3RhdHVzOiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUuY29tZnlTdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgIGxhc3RFcnJvcjogZGV0YWlsLmV4Y2VwdGlvbl9tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICBleGVjdXRpbmdOb2RlVGl0bGU6ICcnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGFkZExpc3RlbmVyKFwiZXhlY3V0aW9uX3N0YXJ0XCIsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIGNvbWZ5U3RhdHVzOiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUuY29tZnlTdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgIGxhc3RFcnJvcjogJycsXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzOiAwLFxuICAgICAgICAgICAgICAgICAgICBleGVjdXRpbmdOb2RlVGl0bGU6ICcnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGFkZExpc3RlbmVyKFwiZXhlY3V0aW5nXCIsIChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGluZ05vZGVJRCA9IGUuZGV0YWlsXG4gICAgICAgICAgICBjb25zdCBub2RlID0gYXBwLmdyYXBoLm5vZGVzLmZpbmQoKG46IGFueSkgPT4gbi5pZCA9PSBleGVjdXRpbmdOb2RlSUQpXG4gICAgICAgICAgICBpZiAobm9kZSlcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgY29tZnlTdGF0dXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUuY29tZnlTdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpbmdOb2RlVGl0bGU6IG5vZGUudGl0bGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuXG4gICAgICAgIGFkZExpc3RlbmVyKFwiZXhlY3V0aW9uX3N1Y2Nlc3NcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgY29tZnlTdGF0dXM6IHtcbiAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5zdGF0ZS5jb21meVN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3M6IDAsXG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGluZ05vZGVUaXRsZTogJydcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYWRkTGlzdGVuZXIoXCJleGVjdXRpb25faW50ZXJydXB0ZWRcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgY29tZnlTdGF0dXM6IHtcbiAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5zdGF0ZS5jb21meVN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3M6IDAsXG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGluZ05vZGVUaXRsZTogJydcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgc3RydWN0dXJlQ2FsbGJhY2sgPSAod3RTdHJ1Y3R1cmU6IFdpZGdldFRhYmxlU3RydWN0dXJlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICB3aWRnZXRUYWJsZVN0cnVjdHVyZTogd3RTdHJ1Y3R1cmVcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgcGFnZVN0b3JlLnN1YnNjcmliZSgnL3dpZGdldFRhYmxlU3RydWN0dXJlJywgc3RydWN0dXJlQ2FsbGJhY2spXG4gICAgICAgIGNvbnN0IHZhbHVlQ2FsbGJhY2sgPSAod3RWYWx1ZTogV2lkZ2V0VGFibGVWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgd2lkZ2V0VGFibGVWYWx1ZTogd3RWYWx1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBwYWdlU3RvcmUuc3Vic2NyaWJlKCcvd2lkZ2V0VGFibGVWYWx1ZScsIHZhbHVlQ2FsbGJhY2spXG4gICAgICAgIGNvbnN0IGVycm9yc0NhbGxiYWNrID0gKHd0RXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICB3aWRnZXRUYWJsZUVycm9yczogd3RFcnJvcnNcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgcGFnZVN0b3JlLnN1YnNjcmliZSgnL3dpZGdldFRhYmxlRXJyb3JzJywgZXJyb3JzQ2FsbGJhY2spXG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmVzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgcGFnZVN0b3JlLnVuc3Vic2NyaWJlKHN0cnVjdHVyZUNhbGxiYWNrKVxuICAgICAgICAgICAgcGFnZVN0b3JlLnVuc3Vic2NyaWJlKHZhbHVlQ2FsbGJhY2spXG4gICAgICAgICAgICBwYWdlU3RvcmUudW5zdWJzY3JpYmUoZXJyb3JzQ2FsbGJhY2spXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMuZm9yRWFjaCgoeyBldmVudCwgaGFuZGxlciB9KSA9PiB7XG4gICAgICAgICAgICBhcGkucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlcik7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnVuc3Vic2NyaWJlcy5mb3JFYWNoKCh1bnN1YnNjcmliZSkgPT4gdW5zdWJzY3JpYmUoKSlcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IGVkaXRQcm9wcyA9IHtcbiAgICAgICAgICAgIHdpZGdldFRhYmxlU3RydWN0dXJlOiB0aGlzLnN0YXRlLndpZGdldFRhYmxlU3RydWN0dXJlLFxuICAgICAgICAgICAgd2lkZ2V0VGFibGVWYWx1ZTogdGhpcy5zdGF0ZS53aWRnZXRUYWJsZVZhbHVlLFxuICAgICAgICAgICAgd2lkZ2V0VGFibGVFcnJvcnM6IHRoaXMuc3RhdGUud2lkZ2V0VGFibGVFcnJvcnMsXG4gICAgICAgICAgICAvLyBjb21meVN0YXR1czoge1xuICAgICAgICAgICAgLy8gICAgIHNpZDogdGhpcy5zdGF0ZS5jb21meVN0YXR1cy5zaWQsXG4gICAgICAgICAgICAvLyAgICAgc3NpZDogdGhpcy5zdGF0ZS5jb21meVN0YXR1cy5zc2lkLFxuICAgICAgICAgICAgLy8gICAgIHByb2dyZXNzOiB0aGlzLnN0YXRlLmNvbWZ5U3RhdHVzLnByb2dyZXNzLFxuICAgICAgICAgICAgLy8gICAgIHF1ZXVlU2l6ZTogdGhpcy5zdGF0ZS5jb21meVN0YXR1cy5xdWV1ZVNpemUsXG4gICAgICAgICAgICAvLyAgICAgbGFzdEVycm9yOiB0aGlzLnN0YXRlLmNvbWZ5U3RhdHVzLmxhc3RFcnJvcixcbiAgICAgICAgICAgIC8vICAgICBleGVjdXRpbmdOb2RlVGl0bGU6IHRoaXMuc3RhdGUuY29tZnlTdGF0dXMuZXhlY3V0aW5nTm9kZVRpdGxlLFxuICAgICAgICAgICAgLy8gfSxcbiAgICAgICAgICAgIG9uV2lkZ2V0Q2hhbmdlOiBhc3luYyAobm9kZWlkOiBudW1iZXIsIHdpZGdldEluZGV4OiBudW1iZXIsIHZhbHVlOiBhbnksIGZpZWxkSW5mbzogV2lkZ2V0VGFibGVTdHJ1Y3R1cmVOb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IGFwcC5ncmFwaC5ub2Rlcy5maW5kKChuOiBhbnkpID0+IG4uaWQgPT0gbm9kZWlkKTtcbiAgICAgICAgICAgICAgICBpZiAoIW5vZGUpIHJldHVybjtcbiAgICAgICAgICAgICAgICBzZXRXaWRnZXRWYWx1ZShub2RlLCB3aWRnZXRJbmRleCwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIC8vIH0sXG4gICAgICAgICAgICAgICAgLy8gb25SdW46IGFzeW5jIChzaXplOiBudW1iZXIgPSAxKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKVxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgYXBwLnF1ZXVlUHJvbXB0KCk7XG4gICAgICAgICAgICAgICAgLy8gfSxcbiAgICAgICAgICAgICAgICAvLyBvblNhdmU6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyAgICAgY29uc3Qgd29ya2Zsb3dNYW5hZ2VyID0gYXBwLndvcmtmbG93TWFuYWdlciB8fCBhcHAuZXh0ZW5zaW9uTWFuYWdlci53b3JrZmxvd1xuICAgICAgICAgICAgICAgIC8vICAgICBjb25zdCB3b3JrZmxvdyA9IHdvcmtmbG93TWFuYWdlci5hY3RpdmVXb3JrZmxvd1xuICAgICAgICAgICAgICAgIC8vICAgICB3b3JrZmxvdy5jaGFuZ2VUcmFja2VyLmNoZWNrU3RhdGUoKVxuICAgICAgICAgICAgICAgIC8vICAgICBhd2FpdCB3b3JrZmxvd01hbmFnZXIuc2F2ZVdvcmtmbG93KHdvcmtmbG93KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbldpZGdldFJlbmRlcjogKGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICBrZWVwUmVuZGVyOiBib29sZWFuO1xuICAgICAgICAgICAgICAgIHJlc3VsdDogYW55W107XG4gICAgICAgICAgICB9LCBmaWVsZEluZm86IFdpZGdldFRhYmxlU3RydWN0dXJlTm9kZSwgd2lkZ2V0OiBXaWRnZXRUYWJsZVN0cnVjdHVyZU5vZGVbJ3dpZGdldHMnXVswXSwgd2lkZ2V0SW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh3aWRnZXQub3V0cHV0VHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWluID0gd2lkZ2V0Lm9wdGlvbnM/Lm1pbiA/PyAwO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXggPSB3aWRnZXQub3B0aW9ucz8ubWF4ID8/IDEwMDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RlcCA9IHdpZGdldC5vcHRpb25zPy5zdGVwID8/IDE7XG5cbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5yZXN1bHQucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxOdW1iZXJXaWRnZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aVdlaWdodD17d2lkZ2V0LnVpV2VpZ2h0IHx8IDEyfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT17d2lkZ2V0SW5kZXh9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRNaW49e21pbn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dE1heD17bWF4fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U3RlcD17c3RlcH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPXt3aWRnZXQubmFtZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cGFyc2VGbG9hdCh0aGlzLnN0YXRlLndpZGdldFRhYmxlVmFsdWVbZmllbGRJbmZvLmlkXVt3aWRnZXRJbmRleF0pfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyh2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRQcm9wcy5vbldpZGdldENoYW5nZShmaWVsZEluZm8uaWQsIHdpZGdldEluZGV4LCB2LCBmaWVsZEluZm8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFPcHRpb25zPXt0aGlzLnN0YXRlLndpZGdldFRhYmxlU3RydWN0dXJlLmV4dHJhT3B0aW9uc31cbiAgICAgICAgICAgICAgICAgICAgICAgIC8+KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2lkZ2V0Lm91dHB1dFR5cGUgPT09ICdjb21ibycpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5yZXN1bHQucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxDb21ib1dpZGdldFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpV2VpZ2h0PXt3aWRnZXQudWlXZWlnaHQgfHwgMTJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PXt3aWRnZXRJbmRleH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zPXt3aWRnZXQub3B0aW9ucz8udmFsdWVzIHx8IFtdfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9e3dpZGdldC5uYW1lfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uU2VsZWN0VXBkYXRlPXsodikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0UHJvcHMub25XaWRnZXRDaGFuZ2UoZmllbGRJbmZvLmlkLCB3aWRnZXRJbmRleCwgdiwgZmllbGRJbmZvKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLndpZGdldFRhYmxlVmFsdWVbZmllbGRJbmZvLmlkXVt3aWRnZXRJbmRleF19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFPcHRpb25zPXt0aGlzLnN0YXRlLndpZGdldFRhYmxlU3RydWN0dXJlLmV4dHJhT3B0aW9uc31cbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdpZGdldC5vdXRwdXRUeXBlID09PSAndG9nZ2xlJykge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnJlc3VsdC5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgPFRvZ2dsZVdpZGdldFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpV2VpZ2h0PXt3aWRnZXQudWlXZWlnaHQgfHwgMTJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PXt3aWRnZXRJbmRleH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPXt3aWRnZXQubmFtZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5zdGF0ZS53aWRnZXRUYWJsZVZhbHVlW2ZpZWxkSW5mby5pZF1bd2lkZ2V0SW5kZXhdfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyh2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRQcm9wcy5vbldpZGdldENoYW5nZShmaWVsZEluZm8uaWQsIHdpZGdldEluZGV4LCB2LCBmaWVsZEluZm8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFPcHRpb25zPXt0aGlzLnN0YXRlLndpZGdldFRhYmxlU3RydWN0dXJlLmV4dHJhT3B0aW9uc31cbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2lkZ2V0Lm91dHB1dFR5cGUgPT09ICdzdHJpbmcnIHx8IHdpZGdldC5vdXRwdXRUeXBlID09PSAnY3VzdG9tdGV4dCcgfHwgd2lkZ2V0Lm91dHB1dFR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnJlc3VsdC5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgPFN0cmluZ1dpZGdldFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpV2VpZ2h0PXt3aWRnZXQudWlXZWlnaHQgfHwgMTJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PXt3aWRnZXRJbmRleH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5zdGF0ZS53aWRnZXRUYWJsZVZhbHVlW2ZpZWxkSW5mby5pZF1bd2lkZ2V0SW5kZXhdfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyh2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRQcm9wcy5vbldpZGdldENoYW5nZShmaWVsZEluZm8uaWQsIHdpZGdldEluZGV4LCB2LCBmaWVsZEluZm8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFPcHRpb25zPXt0aGlzLnN0YXRlLndpZGdldFRhYmxlU3RydWN0dXJlLmV4dHJhT3B0aW9uc31cbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdpZGdldC5vdXRwdXRUeXBlID09PSAnUFNfTEFZRVInIHx8IHdpZGdldC5vdXRwdXRUeXBlID09PSAnUFNfRE9DVU1FTlQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQucmVzdWx0LnB1c2goPHA+e2kxOG4oJ29ubHkgc3VwcG9ydGVkIGluIFBob3Rvc2hvcCcpfTwvcD4pXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aWRnZXQub3V0cHV0VHlwZSA9PSAnSU1BR0VfUEFUSCcgfHwgd2lkZ2V0Lm91dHB1dFR5cGUgPT0gJ01BU0tfUEFUSCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5yZXN1bHQucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxJbWFnZVdpZGdldFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpV2VpZ2h0PXt3aWRnZXQudWlXZWlnaHQgfHwgMTJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUud2lkZ2V0VGFibGVWYWx1ZVtmaWVsZEluZm8uaWRdW3dpZGdldEluZGV4XX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zPXt3aWRnZXQub3B0aW9ucz8udmFsdWVzIHx8IFtdfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT17d2lkZ2V0SW5kZXh9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT17YXN5bmMgKHYpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdFByb3BzLm9uV2lkZ2V0Q2hhbmdlKGZpZWxkSW5mby5pZCwgd2lkZ2V0SW5kZXgsIHYsIGZpZWxkSW5mbyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYU9wdGlvbnM9e3RoaXMuc3RhdGUud2lkZ2V0VGFibGVTdHJ1Y3R1cmUuZXh0cmFPcHRpb25zfVxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25UaXRsZVJlbmRlcjogKHRpdGxlOiBzdHJpbmcsIGZpZWxkSW5mbzogV2lkZ2V0VGFibGVTdHJ1Y3R1cmVOb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDxFZGl0YWJsZVRpdGxlXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPXt0aXRsZX1cbiAgICAgICAgICAgICAgICAgICAgb25UaXRsZUNoYW5nZT17KG5ld1RpdGxlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBDb21meVNvY2tldC5pbnN0YW5jZS5zZXROb2RlVGl0bGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVfaWQ6IGZpZWxkSW5mby5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogbmV3VGl0bGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgLz47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmb250U2l6ZSA9IDEyXG4gICAgICAgIHJldHVybiA8Q29uZmlnUHJvdmlkZXIgdGhlbWU9e3tcbiAgICAgICAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgICAgICAgICBJbnB1dDoge1xuICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yQmdDb250YWluZXI6ICd2YXIoLS1wLWZvcm0tZmllbGQtYmFja2dyb3VuZCknLFxuICAgICAgICAgICAgICAgICAgICBjb2xvclRleHQ6ICd2YXIoLS1wLWZvcm0tZmllbGQtY29sb3IpJyxcbiAgICAgICAgICAgICAgICAgICAgY29sb3JCb3JkZXI6ICd2YXIoLS1wLWZvcm0tZmllbGQtYm9yZGVyLWNvbG9yKSdcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFNlbGVjdDoge1xuICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yQmdDb250YWluZXI6ICd2YXIoLS1wLWZvcm0tZmllbGQtYmFja2dyb3VuZCknLFxuICAgICAgICAgICAgICAgICAgICBjb2xvclRleHQ6ICd2YXIoLS1wLWZvcm0tZmllbGQtY29sb3IpJyxcbiAgICAgICAgICAgICAgICAgICAgY29sb3JCb3JkZXI6ICd2YXIoLS1wLWZvcm0tZmllbGQtYm9yZGVyLWNvbG9yKScsXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yQmdFbGV2YXRlZDogJ3ZhcigtLXAtZm9ybS1maWVsZC1iYWNrZ3JvdW5kKScsXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yVGV4dERlc2NyaXB0aW9uOiAndmFyKC0tcC1mb3JtLWZpZWxkLWNvbG9yKScsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xJdGVtQmdBY3RpdmU6ICd2YXIoLS1wLWZvcm0tZmllbGQtYmFja2dyb3VuZCknLFxuICAgICAgICAgICAgICAgICAgICBjb250cm9sSXRlbUJnSG92ZXI6ICd2YXIoLS1wLWZvcm0tZmllbGQtYm9yZGVyLWNvbG9yKSdcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIENoZWNrYm94OiB7XG4gICAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiBmb250U2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgY29sb3JUZXh0OiAndmFyKC0tcC1mb3JtLWZpZWxkLWNvbG9yKScsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBSYWRpbzoge1xuICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBTbGlkZXI6IHtcbiAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgU3dpdGNoOiB7XG4gICAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiBmb250U2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgY29sb3JCZ0NvbnRhaW5lcjogJ3ZhcigtLXAtZm9ybS1maWVsZC1iYWNrZ3JvdW5kKScsXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yVGV4dDogJ3ZhcigtLXAtZm9ybS1maWVsZC1jb2xvciknXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBJbnB1dE51bWJlcjoge1xuICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yQmdDb250YWluZXI6ICd2YXIoLS1wLWZvcm0tZmllbGQtYmFja2dyb3VuZCknLFxuICAgICAgICAgICAgICAgICAgICBjb2xvclRleHQ6ICd2YXIoLS1wLWZvcm0tZmllbGQtY29sb3IpJyxcbiAgICAgICAgICAgICAgICAgICAgY29sb3JCb3JkZXI6ICd2YXIoLS1wLWZvcm0tZmllbGQtYm9yZGVyLWNvbG9yKSdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH19PlxuICAgICAgICAgICAgPFdvcmtmbG93RWRpdCB7Li4uZWRpdFByb3BzfSAvPlxuICAgICAgICA8L0NvbmZpZ1Byb3ZpZGVyPlxuICAgIH1cbn1cbiIsICJpbXBvcnQgUmVhY3QsIHsgUmVhY3ROb2RlLCB1c2VNZW1vIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgaTE4biBmcm9tIFwiLi9pMThuLm1qc1wiO1xuXG5pbXBvcnQgdHlwZSB7IFdpZGdldFRhYmxlU3RydWN0dXJlLCBXaWRnZXRUYWJsZVN0cnVjdHVyZU5vZGUsIFdpZGdldFRhYmxlVmFsdWUgfSBmcm9tIFwiLi4vdHlwZXMvc2RwcHAvaW5kZXguanNcIjtcbmltcG9ydCB7IGNvbXB1dGVVSVdlaWdodENTUywgdXNlVHJhY2VVcGRhdGUgfSBmcm9tIFwiLi90c3gvdXRpbC5qc1wiO1xuXG5pbnRlcmZhY2UgV29ya2Zsb3dFZGl0UHJvcHMge1xuICAgIHdpZGdldFRhYmxlU3RydWN0dXJlOiBXaWRnZXRUYWJsZVN0cnVjdHVyZTtcbiAgICB3aWRnZXRUYWJsZVZhbHVlOiBXaWRnZXRUYWJsZVZhbHVlO1xuICAgIHdpZGdldFRhYmxlRXJyb3JzOiBSZWNvcmQ8bnVtYmVyLCBzdHJpbmc+O1xuXG4gICAgb25XaWRnZXRSZW5kZXI/OiAoY29udGV4dDoge1xuICAgICAgICBrZWVwUmVuZGVyOiBib29sZWFuO1xuICAgICAgICByZXN1bHQ6IGFueVtdO1xuICAgIH0sIGZpZWxkSW5mbzogV2lkZ2V0VGFibGVTdHJ1Y3R1cmVOb2RlLCB3aWRnZXQ6IFdpZGdldFRhYmxlU3RydWN0dXJlTm9kZVsnd2lkZ2V0cyddWzBdLCB3aWRnZXRJbmRleDogbnVtYmVyKSA9PiBib29sZWFuO1xuICAgIG9uVGl0bGVSZW5kZXI/OiAodGl0bGU6IHN0cmluZywgZmllbGRJbmZvOiBXaWRnZXRUYWJsZVN0cnVjdHVyZU5vZGUpID0+IFJlYWN0Tm9kZTtcblxuICAgIG9uV2lkZ2V0Q2hhbmdlOiAobm9kZUlEOiBudW1iZXIsIHdpZGdldEluZGV4OiBudW1iZXIsIHZhbHVlOiBhbnksIG9yaWdpbk5vZGVEYXRhOiBXaWRnZXRUYWJsZVN0cnVjdHVyZU5vZGUpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFdvcmtmbG93RWRpdCh7XG4gICAgd2lkZ2V0VGFibGVTdHJ1Y3R1cmUsXG4gICAgd2lkZ2V0VGFibGVWYWx1ZSxcbiAgICB3aWRnZXRUYWJsZUVycm9ycyxcbiAgICBvbldpZGdldFJlbmRlcixcbiAgICBvbldpZGdldENoYW5nZSxcbiAgICBvblRpdGxlUmVuZGVyXG59OiBXb3JrZmxvd0VkaXRQcm9wcykge1xuICAgIGNvbnN0IGFsbFJlbmRlcmVkRmllbGRzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICAgIHJldHVybiB3aWRnZXRUYWJsZVN0cnVjdHVyZS5ub2RlSW5kZXhlcy5tYXAobm9kZUlEID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkSW5mbyA9IHdpZGdldFRhYmxlU3RydWN0dXJlLm5vZGVzW25vZGVJRF1cbiAgICAgICAgICAgIGNvbnN0IHJlZHVjZVdpZGdldFJlbmRlciA9IChjb250ZXh0OiB7XG4gICAgICAgICAgICAgICAga2VlcFJlbmRlcjogYm9vbGVhbjtcbiAgICAgICAgICAgICAgICByZXN1bHQ6IGFueVtdO1xuICAgICAgICAgICAgfSwgd2lkZ2V0OiBXaWRnZXRUYWJsZVN0cnVjdHVyZU5vZGVbJ3dpZGdldHMnXVswXSwgd2lkZ2V0SW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghY29udGV4dC5rZWVwUmVuZGVyKSByZXR1cm4gY29udGV4dDtcblxuICAgICAgICAgICAgICAgIGlmICh3aWRnZXQub3V0cHV0VHlwZSA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnJlc3VsdC5wdXNoKDxzcGFuIGNsYXNzTmFtZT1cImxpc3QtZXJyb3ItbGFiZWxcIj57d2lkZ2V0VGFibGVWYWx1ZVtmaWVsZEluZm8uaWRdW3dpZGdldEluZGV4XX08L3NwYW4+KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dDtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob25XaWRnZXRSZW5kZXI/Lihjb250ZXh0LCBmaWVsZEluZm8sIHdpZGdldCwgd2lkZ2V0SW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSBPYmplY3QudmFsdWVzKHdpZGdldFRhYmxlU3RydWN0dXJlLmdyb3VwcykuZmluZChncm91cCA9PiBncm91cC5ub2RlSURzLmluY2x1ZGVzKGZpZWxkSW5mby5pZCkpXG4gICAgICAgICAgICBjb25zdCBncm91cENvbG9yID0gZ3JvdXA/LmNvbG9yIHx8ICdyZ2JhKDEyNywgMTI3LCAxMjcsIC40KSdcblxuICAgICAgICAgICAgY29uc3QgdXNlU2hvcnRUaXRsZSA9IGZpZWxkSW5mby51aVdlaWdodFN1bSA8PSA4ICYmIGZpZWxkSW5mby53aWRnZXRzLmxlbmd0aCA9PSAxICYmIChcbiAgICAgICAgICAgICAgICBmaWVsZEluZm8ud2lkZ2V0c1swXS5vdXRwdXRUeXBlICE9PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICAgICAgICF3aWRnZXRUYWJsZVN0cnVjdHVyZS5leHRyYU9wdGlvbnM/LnVzZVNsaWRlckZvck51bWJlcldpZGdldFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIndvcmtmbG93LWVkaXQtZmllbGRcIiBrZXk9e2ZpZWxkSW5mby5pZH0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwid29ya2Zsb3ctZWRpdC1maWVsZC10aXRsZVwiIHRpdGxlPXtmaWVsZEluZm8udGl0bGV9IHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5jb21wdXRlVUlXZWlnaHRDU1ModXNlU2hvcnRUaXRsZSA/IDQgOiAxMiksXG4gICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJDb2xvcjogZ3JvdXBDb2xvclxuICAgICAgICAgICAgICAgICAgICB9fT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtvblRpdGxlUmVuZGVyID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblRpdGxlUmVuZGVyKGZpZWxkSW5mby50aXRsZSwgZmllbGRJbmZvKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e2ZpZWxkSW5mby50aXRsZX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZEluZm8ud2lkZ2V0cy5yZWR1Y2UocmVkdWNlV2lkZ2V0UmVuZGVyLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2VlcFJlbmRlcjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IFtdIGFzIGFueVtdXG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5yZXN1bHQubWFwKChpdGVtOiBSZWFjdE5vZGUsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gPFdpZGdldFJlbmRlckVycm9yQm91bmRhcnkga2V5PXtpbmRleH0+e2l0ZW19PC9XaWRnZXRSZW5kZXJFcnJvckJvdW5kYXJ5PlxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aWRnZXRUYWJsZUVycm9yc1tmaWVsZEluZm8uaWRdID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJsaXN0LWVycm9yLWxhYmVsXCI+e3dpZGdldFRhYmxlRXJyb3JzW2ZpZWxkSW5mby5pZF19PC9zcGFuPiA6ICcnXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIClcbiAgICAgICAgfSlcbiAgICB9LCBbd2lkZ2V0VGFibGVTdHJ1Y3R1cmUsIHdpZGdldFRhYmxlVmFsdWUsIHdpZGdldFRhYmxlRXJyb3JzLCBvbldpZGdldFJlbmRlciwgb25XaWRnZXRDaGFuZ2UsIG9uVGl0bGVSZW5kZXJdKVxuXG4gICAgY29uc3Qgbm9kZUVycm9yc05vdEluV2lkZ2V0VGFibGUgPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHdpZGdldFRhYmxlRXJyb3JzKS5maWx0ZXIoKGtleTogYW55KSA9PiAhd2lkZ2V0VGFibGVTdHJ1Y3R1cmUubm9kZXNbcGFyc2VJbnQoa2V5KV0pO1xuICAgIH0sIFt3aWRnZXRUYWJsZUVycm9ycywgd2lkZ2V0VGFibGVTdHJ1Y3R1cmVdKTtcblxuICAgIHJldHVybiAoXG4gICAgICAgIDw+XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbm9kZUVycm9yc05vdEluV2lkZ2V0VGFibGUubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgICAgIG5vZGVFcnJvcnNOb3RJbldpZGdldFRhYmxlLm1hcCgoa2V5OiBhbnkpID0+IChcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4ga2V5PXtrZXl9IGNsYXNzTmFtZT1cImxpc3QtZXJyb3ItbGFiZWxcIj57d2lkZ2V0VGFibGVFcnJvcnNba2V5XX08L3NwYW4+XG4gICAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAhT2JqZWN0LmtleXMod2lkZ2V0VGFibGVTdHJ1Y3R1cmUubm9kZXMpLmxlbmd0aCA/XG4gICAgICAgICAgICAgICAgICAgICg8c3BhbiBjbGFzc05hbWU9XCJsaXN0LWVycm9yLWxhYmVsXCI+e2kxOG4oJ25vIHN1aXRhYmxlIG5vZGUgdG8gY29udHJvbCBpbiB0aGlzIHdvcmtmbG93Jyl9PC9zcGFuPikgOiAnJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3b3JrZmxvdy1lZGl0LWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGFsbFJlbmRlcmVkRmllbGRzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvPlxuICAgICk7XG59XG5cblxuY2xhc3MgV2lkZ2V0UmVuZGVyRXJyb3JCb3VuZGFyeSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDx7XG4gICAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZTtcbn0sIHtcbiAgICBoYXNFcnJvcjogYm9vbGVhbjtcbiAgICBlcnJvcjogRXJyb3IgfCBudWxsO1xufT4ge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzOiB7XG4gICAgICAgIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGU7XG4gICAgfSkge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7IGhhc0Vycm9yOiBmYWxzZSwgZXJyb3I6IG51bGwgfTtcbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRDYXRjaChlcnJvcjogRXJyb3IsIGVycm9ySW5mbzogUmVhY3QuRXJyb3JJbmZvKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBoYXNFcnJvcjogdHJ1ZSwgZXJyb3IgfSk7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5oYXNFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIDxzcGFuIGNsYXNzTmFtZT1cImxpc3QtZXJyb3ItbGFiZWxcIj57dGhpcy5zdGF0ZS5lcnJvcj8uc3RhY2sgfHwgdGhpcy5zdGF0ZS5lcnJvcj8ubWVzc2FnZSB8fCB0aGlzLnN0YXRlLmVycm9yPy50b1N0cmluZygpfTwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbjtcbiAgICB9XG59XG5cbiIsICJpbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVJlZiB9IGZyb20gXCJyZWFjdFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVVJV2VpZ2h0Q1NTKHVpV2VpZ2h0OiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB1aVdlaWdodCA9IHVpV2VpZ2h0IHx8IDEyO1xuICAgIHJldHVybiB7IFxuICAgICAgICBmbGV4OiBgJHt1aVdlaWdodH0gMCBjYWxjKCR7dWlXZWlnaHQgLyAxMiAqIDEwMH0lIC0gMTBweClgLFxuICAgICAgICBtYXhXaWR0aDogYDEwMCVgXG4gICAgfVxufVxuXG5cbi8vIFx1NkRGQlx1NTJBMFx1OEZEOVx1NEUyQVx1ODFFQVx1NUI5QVx1NEU0OSBob29rIFx1Njc2NVx1OERERlx1OEUyQVx1NEY5RFx1OEQ1Nlx1OTg3OVx1NTNEOFx1NTMxNlxuZXhwb3J0IGZ1bmN0aW9uIHVzZVRyYWNlVXBkYXRlKG5hbWU6IHN0cmluZywgcHJvcHM6IGFueSkge1xuICAgIGNvbnN0IHByZXYgPSB1c2VSZWYocHJvcHMpO1xuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNoYW5nZWRQcm9wcyA9IE9iamVjdC5lbnRyaWVzKHByb3BzKS5yZWR1Y2UoKHBzOiBhbnksIFtrLCB2XSkgPT4ge1xuICAgICAgICAgICAgaWYgKHByZXYuY3VycmVudFtrXSAhPT0gdikge1xuICAgICAgICAgICAgICAgIHBzW2tdID0gW3ByZXYuY3VycmVudFtrXSwgdl07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcHM7XG4gICAgICAgIH0sIHt9KTtcbiAgICAgICAgXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhjaGFuZ2VkUHJvcHMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAke25hbWV9IENoYW5nZWQgcHJvcHM6YCwgY2hhbmdlZFByb3BzKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcHJldi5jdXJyZW50ID0gcHJvcHM7XG4gICAgfSk7XG59IiwgImltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjaywgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEZsZXgsIElucHV0TnVtYmVyLCBTbGlkZXIsIFNwYWNlLCBUeXBvZ3JhcGh5IH0gZnJvbSAnYW50ZCc7XG5pbXBvcnQgeyB1c2VVSVdlaWdodENTUyB9IGZyb20gJy4vaG9va3MubXRzJztcbmltcG9ydCB7IEJhc2VXaWRnZXRQcm9wcyB9IGZyb20gJy4vX2Jhc2UnO1xuXG5pbnRlcmZhY2UgTnVtYmVyV2lkZ2V0UHJvcHMgZXh0ZW5kcyBCYXNlV2lkZ2V0UHJvcHMge1xuICAgIGlucHV0TWluOiBudW1iZXI7XG4gICAgaW5wdXRNYXg6IG51bWJlcjtcbiAgICBpbnB1dFN0ZXA6IG51bWJlcjtcbiAgICB2YWx1ZT86IG51bWJlcjtcbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIG9uVmFsdWVDaGFuZ2U6ICh2YWx1ZTogbnVtYmVyKSA9PiB2b2lkO1xuICAgIGV4dHJhT3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT47XG59XG5cbmV4cG9ydCBjb25zdCBOdW1iZXJXaWRnZXQ6IFJlYWN0LkZDPE51bWJlcldpZGdldFByb3BzPiA9ICh7XG4gICAgaW5wdXRNaW4sXG4gICAgaW5wdXRNYXgsXG4gICAgaW5wdXRTdGVwLFxuICAgIG5hbWUsXG4gICAgdmFsdWUgPSAwLFxuICAgIHVpV2VpZ2h0ID0gMSxcbiAgICBleHRyYU9wdGlvbnMsXG4gICAgb25WYWx1ZUNoYW5nZVxufSkgPT4ge1xuICAgIGNvbnN0IHVpV2VpZ2h0Q1NTID0gdXNlVUlXZWlnaHRDU1ModWlXZWlnaHQgfHwgMTIpO1xuICAgIGNvbnN0IFtsb2NhbFZhbHVlLCBzZXRMb2NhbFZhbHVlXSA9IHVzZVN0YXRlPG51bWJlcj4oK3ZhbHVlLnRvRml4ZWQoMykpO1xuXG4gICAgLy8gVXBkYXRlIGxvY2FsIHN0YXRlIHdoZW4gcHJvcHMgdmFsdWUgY2hhbmdlc1xuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIHNldExvY2FsVmFsdWUoK3ZhbHVlLnRvRml4ZWQoMykpO1xuICAgIH0sIFt2YWx1ZV0pO1xuXG4gICAgY29uc3QgaGFuZGxlVmFsdWVDaGFuZ2UgPSB1c2VDYWxsYmFjaygobmV3VmFsdWU6IG51bWJlciB8IG51bGwpID0+IHtcbiAgICAgICAgaWYgKG5ld1ZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBcdTRGRERcdTc1NTkzXHU0RjREXHU1QzBGXHU2NTcwXG4gICAgICAgICAgICBjb25zdCByb3VuZGVkVmFsdWUgPSArbmV3VmFsdWUudG9GaXhlZCgzKTtcbiAgICAgICAgICAgIHNldExvY2FsVmFsdWUocm91bmRlZFZhbHVlKTtcbiAgICAgICAgfVxuICAgIH0sIFtdKTtcblxuICAgIGNvbnN0IGhhbmRsZUJsdXIgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgICAgIC8vIE9ubHkgY2FsbCBvblZhbHVlQ2hhbmdlIHdoZW4gaW5wdXQgbG9zZXMgZm9jdXNcbiAgICAgICAgb25WYWx1ZUNoYW5nZShsb2NhbFZhbHVlKTtcbiAgICB9LCBbbG9jYWxWYWx1ZSwgb25WYWx1ZUNoYW5nZV0pO1xuXG4gICAgLy8gXHU2OEMwXHU2N0U1XHU2QjY1XHU5NTdGXHU4MzAzXHU1NkY0XHU2NjJGXHU1NDI2XHU4RkM3XHU1OTI3XG4gICAgY29uc3QgaXNTdGVwUmFuZ2VUb29CaWcgPSAoKGlucHV0TWF4IC0gaW5wdXRNaW4pIC8gaW5wdXRTdGVwKSA+IDEwMDA7XG5cbiAgICBpZiAoIWlzU3RlcFJhbmdlVG9vQmlnICYmIHVpV2VpZ2h0ID49IDEgJiYgZXh0cmFPcHRpb25zPy51c2VTbGlkZXJGb3JOdW1iZXJXaWRnZXQpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxGbGV4XG4gICAgICAgICAgICAgICAgc3R5bGU9e3sgd2lkdGg6ICcxMDAlJywgLi4udWlXZWlnaHRDU1MgfX1cbiAgICAgICAgICAgICAgICBhbGlnbj0nY2VudGVyJ1xuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxTbGlkZXJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgZmxleDogMSB9fVxuICAgICAgICAgICAgICAgICAgICBtaW49e2lucHV0TWlufVxuICAgICAgICAgICAgICAgICAgICBtYXg9e2lucHV0TWF4fVxuICAgICAgICAgICAgICAgICAgICBzdGVwPXtpbnB1dFN0ZXB9XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtsb2NhbFZhbHVlfVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlVmFsdWVDaGFuZ2V9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlQ29tcGxldGU9e2hhbmRsZUJsdXJ9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8SW5wdXROdW1iZXJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgd2lkdGg6IDgwIH19XG4gICAgICAgICAgICAgICAgICAgIG1pbj17aW5wdXRNaW59XG4gICAgICAgICAgICAgICAgICAgIG1heD17aW5wdXRNYXh9XG4gICAgICAgICAgICAgICAgICAgIHN0ZXA9e2lucHV0U3RlcH0gXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtsb2NhbFZhbHVlfVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlVmFsdWVDaGFuZ2V9XG4gICAgICAgICAgICAgICAgICAgIG9uQmx1cj17aGFuZGxlQmx1cn1cbiAgICAgICAgICAgICAgICAgICAgY29udHJvbHM9e2ZhbHNlfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L0ZsZXg+XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPEZsZXhcbiAgICAgICAgICAgIHN0eWxlPXt7IHdpZHRoOiAnMTAwJScsIC4uLnVpV2VpZ2h0Q1NTIH19XG4gICAgICAgICAgICBhbGlnbj0nY2VudGVyJ1xuICAgICAgICA+XG4gICAgICAgICAgICB7bmFtZSAmJiA8c3BhbiBzdHlsZT17eyBmbGV4OiAxIH19PntuYW1lfTwvc3Bhbj59XG4gICAgICAgICAgICA8SW5wdXROdW1iZXJcbiAgICAgICAgICAgICAgICBzdHlsZT17eyB3aWR0aDogJzEwMCUnLCBmbGV4OiAyIH19XG4gICAgICAgICAgICAgICAgbWluPXtpbnB1dE1pbn1cbiAgICAgICAgICAgICAgICBtYXg9e2lucHV0TWF4fVxuICAgICAgICAgICAgICAgIHN0ZXA9e2lucHV0U3RlcH1cbiAgICAgICAgICAgICAgICB2YWx1ZT17bG9jYWxWYWx1ZX1cbiAgICAgICAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlVmFsdWVDaGFuZ2V9XG4gICAgICAgICAgICAgICAgb25CbHVyPXtoYW5kbGVCbHVyfVxuICAgICAgICAgICAgICAgIGNvbnRyb2xzPXtmYWxzZX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgIDwvRmxleD5cbiAgICApO1xufTtcbiIsICJpbXBvcnQgeyB1c2VNZW1vIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBjb21wdXRlVUlXZWlnaHRDU1MgfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2NvbW1vbi90c3gvdXRpbFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlVUlXZWlnaHRDU1ModWlXZWlnaHQ6IG51bWJlcikge1xuICAgIHJldHVybiB1c2VNZW1vKCgpID0+IGNvbXB1dGVVSVdlaWdodENTUyh1aVdlaWdodCksIFt1aVdlaWdodF0pO1xufSIsICJpbXBvcnQgeyBGbGV4LCBTZWxlY3QsIFR5cG9ncmFwaHkgfSBmcm9tICdhbnRkJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgaTE4biBmcm9tICcuLi8uLi8uLi8uLi8uLi8uLi9zcmMvY29tbW9uL2kxOG4ubXRzJztcbmltcG9ydCB7IHVzZVVJV2VpZ2h0Q1NTIH0gZnJvbSAnLi9ob29rcy5tdHMnO1xuaW1wb3J0IHsgQmFzZVdpZGdldFByb3BzIH0gZnJvbSAnLi9fYmFzZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHJvcGRvd25XaWRnZXRQcm9wcyBleHRlbmRzIEJhc2VXaWRnZXRQcm9wcyB7XG4gICAgb25TZWxlY3RVcGRhdGU6IChpZGVudGlmeTogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiB2b2lkO1xuICAgIG9wdGlvbnM6IHN0cmluZ1tdO1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gICAgbmFtZT86IHN0cmluZztcbiAgICBleHRyYU9wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG5leHBvcnQgY29uc3QgQ29tYm9XaWRnZXQ6IFJlYWN0LkZDPERyb3Bkb3duV2lkZ2V0UHJvcHM+ID0gKHtcbiAgICBvblNlbGVjdFVwZGF0ZSxcbiAgICBvcHRpb25zLFxuICAgIHZhbHVlLFxuICAgIG5hbWUsXG4gICAgdWlXZWlnaHRcbn0pID0+IHtcbiAgICAvLyBcdTU5MDRcdTc0MDZcdTkwMDlcdTYyRTlcdTUzRDhcdTUzMTZcbiAgICBjb25zdCBoYW5kbGVTZWxlY3QgPSAoc2VsZWN0ZWRWYWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSW5kZXggPSBvcHRpb25zLmluZGV4T2Yoc2VsZWN0ZWRWYWx1ZSk7XG4gICAgICAgIG9uU2VsZWN0VXBkYXRlKHNlbGVjdGVkVmFsdWUsIHNlbGVjdGVkSW5kZXgpO1xuICAgIH07XG4gICAgY29uc3QgdWlXZWlnaHRDU1MgPSB1c2VVSVdlaWdodENTUyh1aVdlaWdodCB8fCAxMik7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8RmxleFxuICAgICAgICAgICAgc3R5bGU9e3sgd2lkdGg6ICcxMDAlJywgLi4udWlXZWlnaHRDU1MgfX1cbiAgICAgICAgICAgIGFsaWduPSdjZW50ZXInXG4gICAgICAgID5cbiAgICAgICAgICAgIHtuYW1lICYmIDxzcGFuIHN0eWxlPXt7IGZsZXg6IDEgfX0+e25hbWV9PC9zcGFuPn1cbiAgICAgICAgICAgIDxTZWxlY3RcbiAgICAgICAgICAgICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICAgICAgICAgICAgb3B0aW9ucz17b3B0aW9ucy5tYXAob3B0aW9uID0+ICh7IHZhbHVlOiBvcHRpb24sIGxhYmVsOiBvcHRpb24gfSkpfVxuICAgICAgICAgICAgICAgIHN0eWxlPXt7IGZsZXg6IDIsIG1pbldpZHRoOiAnMTAwJScgfX1cbiAgICAgICAgICAgICAgICBvblNlbGVjdD17aGFuZGxlU2VsZWN0fVxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtpMThuKFwic2VsZWN0Li4uXCIpfVxuICAgICAgICAgICAgICAgIHNob3dTZWFyY2hcbiAgICAgICAgICAgICAgICBmaWx0ZXJPcHRpb249eyhpbnB1dCwgb3B0aW9uKSA9PlxuICAgICAgICAgICAgICAgICAgICAob3B0aW9uPy5sYWJlbCA/PyAnJykudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhpbnB1dC50b0xvd2VyQ2FzZSgpKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgIDwvRmxleD5cbiAgICApO1xufTtcblxuXG4iLCAiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENoZWNrYm94IH0gZnJvbSAnYW50ZCc7XG5pbXBvcnQgdHlwZSB7IENoZWNrYm94UHJvcHMgfSBmcm9tICdhbnRkJztcbmltcG9ydCB7IHVzZVVJV2VpZ2h0Q1NTIH0gZnJvbSAnLi9ob29rcy5tdHMnO1xuaW1wb3J0IHsgQmFzZVdpZGdldFByb3BzIH0gZnJvbSAnLi9fYmFzZSc7XG5cbmludGVyZmFjZSBUb2dnbGVQcm9wcyBleHRlbmRzIEJhc2VXaWRnZXRQcm9wcyB7XG4gICAgdmFsdWU/OiBhbnk7XG4gICAgbmFtZT86IHN0cmluZztcbiAgICBvblZhbHVlQ2hhbmdlOiAodmFsdWU6IGJvb2xlYW4pID0+IHZvaWQ7XG4gICAgZXh0cmFPcHRpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pjtcbn1cblxuZXhwb3J0IGNvbnN0IFRvZ2dsZVdpZGdldDogUmVhY3QuRkM8VG9nZ2xlUHJvcHM+ID0gKHtcbiAgICB2YWx1ZSxcbiAgICBuYW1lLFxuICAgIG9uVmFsdWVDaGFuZ2UsXG4gICAgdWlXZWlnaHRcbn0pID0+IHtcbiAgICBjb25zdCBoYW5kbGVDaGFuZ2U6IENoZWNrYm94UHJvcHNbJ29uQ2hhbmdlJ10gPSAoZSkgPT4ge1xuICAgICAgICBvblZhbHVlQ2hhbmdlKGUudGFyZ2V0LmNoZWNrZWQpO1xuICAgIH07XG5cbiAgICBjb25zdCB1aVdlaWdodENTUyA9IHVzZVVJV2VpZ2h0Q1NTKHVpV2VpZ2h0IHx8IDEyKTtcblxuICAgIHJldHVybiAoXG4gICAgICAgIDxDaGVja2JveFxuICAgICAgICAgICAgY2hlY2tlZD17ISF2YWx1ZX1cbiAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICAgICAgICBzdHlsZT17eyAuLi51aVdlaWdodENTUyB9fVxuICAgICAgICA+XG4gICAgICAgICAgICB7bmFtZSB8fCAnJ31cbiAgICAgICAgPC9DaGVja2JveD5cbiAgICApO1xufTtcbiIsICJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgSW5wdXQgfSBmcm9tICdhbnRkJztcbmltcG9ydCB0eXBlIHsgVGV4dEFyZWFQcm9wcyB9IGZyb20gJ2FudGQvZXMvaW5wdXQnO1xuaW1wb3J0IHsgdXNlVUlXZWlnaHRDU1MgfSBmcm9tICcuL2hvb2tzLm10cyc7XG5pbXBvcnQgeyBCYXNlV2lkZ2V0UHJvcHMgfSBmcm9tICcuL19iYXNlJztcblxuY29uc3QgeyBUZXh0QXJlYSB9ID0gSW5wdXQ7XG5cbmludGVyZmFjZSBTdHJpbmdXaWRnZXRQcm9wcyBleHRlbmRzIEJhc2VXaWRnZXRQcm9wcyB7XG4gICAgdmFsdWU/OiBzdHJpbmc7XG4gICAgb25WYWx1ZUNoYW5nZTogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgZXh0cmFPcHRpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pjtcbn1cblxuZXhwb3J0IGNvbnN0IFN0cmluZ1dpZGdldDogUmVhY3QuRkM8U3RyaW5nV2lkZ2V0UHJvcHM+ID0gKHtcbiAgICB2YWx1ZSA9ICcnLFxuICAgIG9uVmFsdWVDaGFuZ2UsXG4gICAgdWlXZWlnaHRcbn0pID0+IHtcbiAgICBjb25zdCB1aVdlaWdodENTUyA9IHVzZVVJV2VpZ2h0Q1NTKHVpV2VpZ2h0IHx8IDEyKTtcblxuICAgIGNvbnN0IGhhbmRsZUNoYW5nZTogVGV4dEFyZWFQcm9wc1snb25DaGFuZ2UnXSA9IChlKSA9PiB7XG4gICAgICAgIG9uVmFsdWVDaGFuZ2UoZS50YXJnZXQudmFsdWUpO1xuICAgIH07XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJ3aWRnZXQtY29udGFpbmVyXCJcbiAgICAgICAgICAgIHN0eWxlPXt1aVdlaWdodENTU31cbiAgICAgICAgPlxuICAgICAgICAgICAgPFRleHRBcmVhXG4gICAgICAgICAgICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICAgICAgICAgICAgYXV0b1NpemU9e3sgbWluUm93czogMSB9fVxuICAgICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgKTtcbn07XG4iLCAiaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgSW5wdXQsIFRvb2x0aXAgfSBmcm9tIFwiYW50ZFwiO1xuaW1wb3J0IGkxOG4gZnJvbSBcIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jb21tb24vaTE4bi5tdHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBFZGl0YWJsZVRpdGxlUHJvcHMge1xuICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgb25UaXRsZUNoYW5nZT86IChuZXdUaXRsZTogc3RyaW5nKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRWRpdGFibGVUaXRsZSh7IHRpdGxlLCBvblRpdGxlQ2hhbmdlIH06IEVkaXRhYmxlVGl0bGVQcm9wcykge1xuICAgIGNvbnN0IFtlZGl0aW5nLCBzZXRFZGl0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgICBjb25zdCBbZWRpdGVkVGl0bGUsIHNldEVkaXRlZFRpdGxlXSA9IHVzZVN0YXRlKHRpdGxlKTtcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIHNldEVkaXRlZFRpdGxlKHRpdGxlKTtcbiAgICB9LCBbdGl0bGVdKTtcblxuICAgIGNvbnN0IGhhbmRsZUNsaWNrID0gKCkgPT4ge1xuICAgICAgICBzZXRFZGl0aW5nKHRydWUpO1xuICAgIH07XG4gICAgXG4gICAgY29uc3QgaGFuZGxlQmx1ciA9ICgpID0+IHtcbiAgICAgICAgc2V0RWRpdGluZyhmYWxzZSk7XG4gICAgICAgIGlmIChlZGl0ZWRUaXRsZSAhPT0gdGl0bGUgJiYgb25UaXRsZUNoYW5nZSkge1xuICAgICAgICAgICAgb25UaXRsZUNoYW5nZShlZGl0ZWRUaXRsZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFxuICAgIGNvbnN0IGhhbmRsZUNoYW5nZSA9IChlOiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgICAgICBzZXRFZGl0ZWRUaXRsZShlLnRhcmdldC52YWx1ZSk7XG4gICAgfTtcbiAgICBcbiAgICBjb25zdCBoYW5kbGVLZXlEb3duID0gKGU6IFJlYWN0LktleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgICAgICBzZXRFZGl0aW5nKGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChlZGl0ZWRUaXRsZSAhPT0gdGl0bGUgJiYgb25UaXRsZUNoYW5nZSkge1xuICAgICAgICAgICAgICAgIG9uVGl0bGVDaGFuZ2UoZWRpdGVkVGl0bGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICAgICAgc2V0RWRpdGluZyhmYWxzZSk7XG4gICAgICAgICAgICBzZXRFZGl0ZWRUaXRsZSh0aXRsZSk7IC8vIFJlc2V0IHRvIG9yaWdpbmFsIHRpdGxlXG4gICAgICAgIH1cbiAgICB9O1xuICAgIFxuICAgIHJldHVybiBlZGl0aW5nID8gKFxuICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgIGF1dG9Gb2N1c1xuICAgICAgICAgICAgdmFsdWU9e2VkaXRlZFRpdGxlfVxuICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgICAgICAgIG9uQmx1cj17aGFuZGxlQmx1cn1cbiAgICAgICAgICAgIG9uS2V5RG93bj17aGFuZGxlS2V5RG93bn1cbiAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJ3b3JrZmxvdy1lZGl0LWZpZWxkLXRpdGxlLWlucHV0XCJcbiAgICAgICAgLz5cbiAgICApIDogKFxuICAgICAgICA8VG9vbHRpcCB0aXRsZT17aTE4bignY2xpY2sgdG8gZWRpdCcpfT5cbiAgICAgICAgICAgIDxzcGFuIFxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZUNsaWNrfVxuICAgICAgICAgICAgICAgIHN0eWxlPXt7IGN1cnNvcjogJ3BvaW50ZXInIH19XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge2VkaXRlZFRpdGxlfVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L1Rvb2x0aXA+XG4gICAgKTtcbn07IiwgImltcG9ydCB7IEJhc2VXaWRnZXRQcm9wcyB9IGZyb20gJy4vX2Jhc2UnO1xuaW1wb3J0IHsgU2VsZWN0LCBVcGxvYWQsIEltYWdlLCBGbGV4IH0gZnJvbSAnYW50ZCc7XG5pbXBvcnQgeyBVcGxvYWRPdXRsaW5lZCB9IGZyb20gJ0BhbnQtZGVzaWduL2ljb25zJztcbmltcG9ydCBpMThuIGZyb20gJy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jb21tb24vaTE4bi5tdHMnO1xuXG5pbnRlcmZhY2UgSW1hZ2VXaWRnZXRQcm9wcyBleHRlbmRzIEJhc2VXaWRnZXRQcm9wcyB7XG4gICAgdmFsdWU6IHN0cmluZztcbiAgICBvcHRpb25zOiBzdHJpbmdbXTtcbiAgICBvblZhbHVlQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4gdm9pZDtcbiAgICBleHRyYU9wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG5leHBvcnQgY29uc3QgSW1hZ2VXaWRnZXQgPSAoeyB2YWx1ZSwgb25WYWx1ZUNoYW5nZSwgb3B0aW9ucyB9OiBJbWFnZVdpZGdldFByb3BzKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlVXBsb2FkID0gKGluZm86IGFueSkgPT4ge1xuICAgICAgICBpZiAoaW5mby5maWxlLnN0YXR1cyA9PT0gJ2RvbmUnKSB7XG4gICAgICAgICAgICBjb25zdCB1cGxvYWRlZFBhdGggPSBpbmZvLmZpbGUucmVzcG9uc2UubmFtZTsgLy8gXHU1MDQ3XHU4QkJFXHU2NzBEXHU1MkExXHU1NjY4XHU4RkQ0XHU1NkRFXHU3Njg0XHU4REVGXHU1Rjg0XHU1NzI4cmVzcG9uc2UucGF0aFx1NEUyRFxuICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT8uKHVwbG9hZGVkUGF0aCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPEZsZXggZ2FwPXs1fSBhbGlnbj0nc3RyZXRjaCcgdmVydGljYWw+XG4gICAgICAgICAgICA8RmxleCBnYXA9ezV9PlxuICAgICAgICAgICAgICAgIDxTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgZmxleDogMSB9fVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsobmV3VmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U/LihuZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9e29wdGlvbnMubWFwKGZpbGUgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBmaWxlLnNwbGl0KCcvJykucG9wKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZmlsZVxuICAgICAgICAgICAgICAgICAgICB9KSl9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8VXBsb2FkXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbj1cIi4vYXBpL3VwbG9hZC9pbWFnZVwiXG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVVcGxvYWR9XG4gICAgICAgICAgICAgICAgICAgIHNob3dVcGxvYWRMaXN0PXtmYWxzZX1cbiAgICAgICAgICAgICAgICAgICAgZGF0YT17KGZpbGUpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbWFnZTogZmlsZSAgLy8gXHU1QzA2XHU2NTg3XHU0RUY2XHU1QjU3XHU2QkI1XHU1NDBEXHU4QkJFXHU3RjZFXHU0RTNBICdpbWFnZSdcbiAgICAgICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzc05hbWU9XCJhbnQtYnRuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8VXBsb2FkT3V0bGluZWQgLz4ge2kxOG4oJ3VwbG9hZCcpfVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L1VwbG9hZD5cbiAgICAgICAgICAgIDwvRmxleD5cbiAgICAgICAgICAgIHt2YWx1ZSAmJiAoXG4gICAgICAgICAgICAgICAgPEltYWdlXG4gICAgICAgICAgICAgICAgICAgIHNyYz17YC4vYXBpL3ZpZXc/ZmlsZW5hbWU9JHt2YWx1ZX0mdHlwZT1pbnB1dCZzdWJmb2xkZXI9JnJhbmQ9YCArIE1hdGgucmFuZG9tKCl9XG4gICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3BlY3RSYXRpbzogJzEvMScsXG4gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RGaXQ6ICdjb250YWluJ1xuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApfVxuICAgICAgICA8L0ZsZXg+XG4gICAgKTtcbn07IiwgImltcG9ydCB7IFdvcmtmbG93RWRpdFdyYXAgfSBmcm9tIFwiLi9Xb3JrZmxvd0VkaXRXZWJcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQ29tZnlTaWRlYmFyKHtcbiAgICBvbk1heGltaXplLFxuICAgIG9uUGhvdG9zaG9wLFxufToge1xuICAgIG9uTWF4aW1pemU6ICgpID0+IHZvaWQsXG4gICAgb25QaG90b3Nob3A6ICgpID0+IHZvaWRcbn0pIHtcbiAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNkcHBwLXNpZGUtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNkcHBwLXNpZGUtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJzZHBwcC1waG90b3Nob3AtaWNvblwiIG9uQ2xpY2s9e29uUGhvdG9zaG9wfT48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT1cInBpIHBpLXdpbmRvdy1tYXhpbWl6ZVwiIG9uQ2xpY2s9e29uTWF4aW1pemV9PjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8V29ya2Zsb3dFZGl0V3JhcCAvPlxuICAgICAgICA8L2Rpdj5cbiAgICApXG59IiwgImltcG9ydCB7IGFwaSwgYXBwIH0gZnJvbSBcIi4vY29tZnktZ2xvYmFscy5tdHNcIjtcbmltcG9ydCB7IHBhZ2VTdG9yZSB9IGZyb20gXCIuLi9waG90b3Nob3BNb2RlbHMubXRzXCI7XG5pbXBvcnQgeyBtYWtlV2lkZ2V0VGFibGVTdHJ1Y3R1cmUsIGdldFdpZGdldFRhYmxlVmFsdWUgfSBmcm9tIFwiLi9ncmFwaC10by1mb3JtLm10c1wiO1xuaW1wb3J0IHsgV2lkZ2V0VGFibGVTdHJ1Y3R1cmUgfSBmcm9tIFwiLi4vLi4vLi4vc3JjL3R5cGVzL3NkcHBwXCI7XG5cblxuYXBpLmFkZEV2ZW50TGlzdGVuZXIoXCJncmFwaENoYW5nZWRcIiwgKGV2ZW50OiB7IGRldGFpbDogYW55IH0pID0+IHtcbiAgICBjb25zdCB3b3JrZmxvd01hbmFnZXIgPSBhcHAud29ya2Zsb3dNYW5hZ2VyIHx8IGFwcC5leHRlbnNpb25NYW5hZ2VyLndvcmtmbG93XG4gICAgY29uc3QgYWN0aXZlV29ya2Zsb3cgPSB3b3JrZmxvd01hbmFnZXIuYWN0aXZlV29ya2Zsb3c7XG4gICAgaWYgKGV2ZW50LmRldGFpbC5pZCAhPT0gYWN0aXZlV29ya2Zsb3cuYWN0aXZlU3RhdGUuaWQpIHJldHVyblxuICAgIGNvbnN0IG9yaWdpbmFsV1RTdHJ1Y3R1cmUgPSBwYWdlU3RvcmUuZGF0YS53aWRnZXRUYWJsZVN0cnVjdHVyZTtcbiAgICBjb25zdCBuZXdXVFN0cnVjdHVyZSA9IG1ha2VXaWRnZXRUYWJsZVN0cnVjdHVyZShhcHAuZ3JhcGgsIGFjdGl2ZVdvcmtmbG93KTtcbiAgICBpZiAoaXNTdHJ1Y3R1cmVEaWZmKG5ld1dUU3RydWN0dXJlLCBvcmlnaW5hbFdUU3RydWN0dXJlKSkge1xuICAgICAgICBwYWdlU3RvcmUuc2V0V2lkZ2V0VGFibGVTdHJ1Y3R1cmUobmV3V1RTdHJ1Y3R1cmUpO1xuICAgIH1cbiAgICBwYWdlU3RvcmUuc2V0V2lkZ2V0VGFibGVWYWx1ZShnZXRXaWRnZXRUYWJsZVZhbHVlKGFwcC5ncmFwaCkpO1xufSlcbmFwaS5hZGRFdmVudExpc3RlbmVyKFwiZXhlY3V0ZWRcIiwgKCkgPT4ge1xuICAgIHBhZ2VTdG9yZS5zZXRXaWRnZXRUYWJsZVZhbHVlKGdldFdpZGdldFRhYmxlVmFsdWUoYXBwLmdyYXBoKSk7XG59KVxuXG5cbmxldCBsYXN0QWN0aXZlV29ya2Zsb3dJRDogbnVtYmVyID0gMDtcbmxldCBsYXN0QWN0aXZlUGVyc2lzdGVkOiBib29sZWFuID0gdHJ1ZTtcbmxldCBsYXN0QWN0aXZlV29ya2Zsb3dQYXRoOiBzdHJpbmcgPSAnJztcblxuZnVuY3Rpb24gY2hlY2tHcmFwaFVwZGF0ZSgpIHtcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoY2hlY2tHcmFwaFVwZGF0ZSlcbiAgICBjb25zdCB3b3JrZmxvd01hbmFnZXIgPSBhcHAud29ya2Zsb3dNYW5hZ2VyIHx8IGFwcC5leHRlbnNpb25NYW5hZ2VyLndvcmtmbG93XG4gICAgY29uc3QgYWN0aXZlV29ya2Zsb3cgPSB3b3JrZmxvd01hbmFnZXIuYWN0aXZlV29ya2Zsb3c7XG4gICAgY29uc3QgY3VycmVudFdvcmtmbG93SUQgPSBhY3RpdmVXb3JrZmxvdz8uaWQgfHwgMFxuICAgIGNvbnN0IGN1cnJlbnRXb3JrZmxvd1BhdGggPSBhY3RpdmVXb3JrZmxvdz8ucGF0aCB8fCAnJ1xuICAgIGNvbnN0IGN1cnJlbnRQZXJzaXN0ZWQgPSBhY3RpdmVXb3JrZmxvdz8uaXNQZXJzaXN0ZWQgfHwgdHJ1ZVxuICAgIGlmIChcbiAgICAgICAgY3VycmVudFdvcmtmbG93SUQgPT09IGxhc3RBY3RpdmVXb3JrZmxvd0lEICYmXG4gICAgICAgIGN1cnJlbnRXb3JrZmxvd1BhdGggPT09IGxhc3RBY3RpdmVXb3JrZmxvd1BhdGggJiZcbiAgICAgICAgY3VycmVudFBlcnNpc3RlZCA9PT0gbGFzdEFjdGl2ZVBlcnNpc3RlZFxuICAgICkgcmV0dXJuO1xuICAgIGxhc3RBY3RpdmVXb3JrZmxvd0lEID0gY3VycmVudFdvcmtmbG93SUQ7XG4gICAgbGFzdEFjdGl2ZVdvcmtmbG93UGF0aCA9IGN1cnJlbnRXb3JrZmxvd1BhdGg7XG4gICAgbGFzdEFjdGl2ZVBlcnNpc3RlZCA9IGN1cnJlbnRQZXJzaXN0ZWQ7XG5cbiAgICBjb25zdCB3dFN0cnVjdHVyZSA9IG1ha2VXaWRnZXRUYWJsZVN0cnVjdHVyZShhcHAuZ3JhcGgsIGFjdGl2ZVdvcmtmbG93KTtcbiAgICBjb25zdCB3dFZhbHVlID0gZ2V0V2lkZ2V0VGFibGVWYWx1ZShhcHAuZ3JhcGgpO1xuICAgIHBhZ2VTdG9yZS5zZXRXaWRnZXRUYWJsZVN0cnVjdHVyZSh3dFN0cnVjdHVyZSk7XG4gICAgcGFnZVN0b3JlLnNldFdpZGdldFRhYmxlVmFsdWUod3RWYWx1ZSk7XG4gICAgLy8gcmd0aHJlZSBtYXkgaGF2ZSBzb21lIGRlbGF5XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmIChhY3RpdmVXb3JrZmxvdyAhPT0gIHdvcmtmbG93TWFuYWdlci5hY3RpdmVXb3JrZmxvdykgcmV0dXJuXG4gICAgICAgIGNvbnN0IG5ld1dUU3RydWN0dXJlID0gbWFrZVdpZGdldFRhYmxlU3RydWN0dXJlKGFwcC5ncmFwaCwgYWN0aXZlV29ya2Zsb3cpO1xuICAgICAgICBjb25zdCBuZXdXVFZhbHVlID0gZ2V0V2lkZ2V0VGFibGVWYWx1ZShhcHAuZ3JhcGgpO1xuICAgICAgICBpZiAoaXNTdHJ1Y3R1cmVEaWZmKG5ld1dUU3RydWN0dXJlLCB3dFN0cnVjdHVyZSkpIHtcbiAgICAgICAgICAgIHBhZ2VTdG9yZS5zZXRXaWRnZXRUYWJsZVN0cnVjdHVyZShuZXdXVFN0cnVjdHVyZSk7XG4gICAgICAgIH1cbiAgICAgICAgcGFnZVN0b3JlLnNldFdpZGdldFRhYmxlVmFsdWUobmV3V1RWYWx1ZSk7XG4gICAgfSwgODAwKVxufVxucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGNoZWNrR3JhcGhVcGRhdGUpXG5cblxuZnVuY3Rpb24gaXNTdHJ1Y3R1cmVEaWZmKHN0cnVjdHVyZTE6IFdpZGdldFRhYmxlU3RydWN0dXJlLCBzdHJ1Y3R1cmUyOiBXaWRnZXRUYWJsZVN0cnVjdHVyZSkge1xuICAgIGlmIChzdHJ1Y3R1cmUxLm5vZGVJbmRleGVzLmxlbmd0aCAhPT0gc3RydWN0dXJlMi5ub2RlSW5kZXhlcy5sZW5ndGgpIHJldHVybiB0cnVlO1xuICAgIGlmIChKU09OLnN0cmluZ2lmeShzdHJ1Y3R1cmUxLm5vZGVJbmRleGVzKSAhPT0gSlNPTi5zdHJpbmdpZnkoc3RydWN0dXJlMi5ub2RlSW5kZXhlcykpIHJldHVybiB0cnVlO1xuICAgIGlmIChKU09OLnN0cmluZ2lmeShzdHJ1Y3R1cmUxLmdyb3VwcykgIT09IEpTT04uc3RyaW5naWZ5KHN0cnVjdHVyZTIuZ3JvdXBzKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKEpTT04uc3RyaW5naWZ5KHN0cnVjdHVyZTEubm9kZXMpICE9PSBKU09OLnN0cmluZ2lmeShzdHJ1Y3R1cmUyLm5vZGVzKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xufSIsICJpbXBvcnQgJ3NkcHBwLXRlc3QvY29tZnknO1xuaW1wb3J0IHsgU3BlaWNpYWxJRE1hbmFnZXIgfSBmcm9tICcuLi8uLi8uLi9zcmMvY29tbW9uL3Bob3Rvc2hvcC9zcGVjaWFsTGF5ZXIubWpzJztcbmltcG9ydCB7IHdyYXBOb2RlIH0gZnJvbSAnLi9saXRlZ3JhcGgvbm9kZS13cmFwcGVyLm1qcyc7XG5pbXBvcnQgeyBDb21meVNvY2tldCB9IGZyb20gJy4vc29ja2V0L0NvbWZ5U29ja2V0Lm1qcyc7XG5pbXBvcnQgeyBwYWdlU3RvcmUsIHdhaXRNb2RlbEluaXRlZCB9IGZyb20gJy4uL3Bob3Rvc2hvcE1vZGVscy5tdHMnO1xuaW1wb3J0IGluaXRQb3B1cCBmcm9tICcuL3BvcHVwL3NkcHBwUG9wdXAubWpzJztcbmltcG9ydCBQcmV2aWV3U2VuZGVyIGZyb20gJy4vUHJldmlld1NlbmRlci5tanMnO1xuaW1wb3J0IHsgc2RwcHBYIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2NvbW1vbi9zZHBwcFgubWpzJztcbmltcG9ydCAnLi93aWRnZXR0YWJsZS1lbnRyeS5tanMnXG5pbXBvcnQgeyBzaW1wbGlmeVdvcmtmbG93UGF0aCB9IGZyb20gJy4uLy4uLy4uL3NyYy9jb21tb24vc3RyaW5nLXV0aWwubXRzJztcbmRlY2xhcmUgY29uc3QgZ3JhcGg6IGFueTtcblxuYXN5bmMgZnVuY3Rpb24gX2luaXQoYXBwOiBhbnksIGFwaTogYW55LCAkZWw6IGFueSkge1xuXHRhcGkuYWRkRXZlbnRMaXN0ZW5lcihcInByb2dyZXNzXCIsICh7IGRldGFpbCB9OiB7IGRldGFpbDogeyB2YWx1ZTogbnVtYmVyLCBtYXg6IG51bWJlciB9IH0pID0+IHtcblx0XHRpZiAoIWRldGFpbCB8fCBpc05hTihkZXRhaWwudmFsdWUgLyBkZXRhaWwubWF4KSkgcmV0dXJuO1xuXHRcdGNvbnN0IHByb2dyZXNzID0gTWF0aC5yb3VuZCgoZGV0YWlsLnZhbHVlIC8gZGV0YWlsLm1heCkgKiAxMDApO1xuXHRcdHBhZ2VTdG9yZS5zZXRQcm9ncmVzcyhwcm9ncmVzcyk7XG5cdH0pO1xuXHRhcGkuYWRkRXZlbnRMaXN0ZW5lcihcInN0YXR1c1wiLCAoZTogYW55KSA9PiB7XG5cdFx0aWYgKCFlLmRldGFpbD8uZXhlY19pbmZvKSByZXR1cm47XG5cdFx0cGFnZVN0b3JlLnNldFF1ZXVlU2l6ZShlLmRldGFpbC5leGVjX2luZm8ucXVldWVfcmVtYWluaW5nKTtcblx0fSk7XG5cdGFwaS5hZGRFdmVudExpc3RlbmVyKFwiZXhlY3V0aW9uX2Vycm9yXCIsICh7IGRldGFpbCB9OiB7IGRldGFpbDogeyBub2RlX2lkOiBudW1iZXIsIGV4Y2VwdGlvbl9tZXNzYWdlOiBzdHJpbmcgfSB9KSA9PiB7XG5cdFx0cGFnZVN0b3JlLnNldEV4ZWN1dGluZ05vZGVUaXRsZSgnJyk7XG5cdFx0cGFnZVN0b3JlLnNldExhc3RFcnJvcihkZXRhaWwuZXhjZXB0aW9uX21lc3NhZ2UpO1xuXHRcdGlmIChkZXRhaWwubm9kZV9pZCkge1xuXHRcdFx0cGFnZVN0b3JlLnNldFdpZGdldFRhYmxlRXJyb3JzKHtcblx0XHRcdFx0W2RldGFpbC5ub2RlX2lkXTogZGV0YWlsLmV4Y2VwdGlvbl9tZXNzYWdlXG5cdFx0XHR9KTtcblx0XHR9XG5cdH0pO1xuXHRsZXQgY2FwdHVyZU5leHRQcm9tcHRCeVNJRDogc3RyaW5nW10gPSBbXVxuXHRhcGkuYWRkRXZlbnRMaXN0ZW5lcihcImV4ZWN1dGlvbl9zdGFydFwiLCAoeyBkZXRhaWwgfTogeyBkZXRhaWw6IHsgcHJvbXB0X2lkOiBzdHJpbmcgfSB9KSA9PiB7XG5cdFx0cGFnZVN0b3JlLnNldExhc3RFcnJvcignJyk7XG5cdFx0cGFnZVN0b3JlLnNldFByb2dyZXNzKDApO1xuXHRcdHBhZ2VTdG9yZS5zZXRXaWRnZXRUYWJsZUVycm9ycyh7fSk7XG5cdFx0cGFnZVN0b3JlLnNldEV4ZWN1dGluZ05vZGVUaXRsZSgnJyk7XG5cdFx0aWYgKGNhcHR1cmVOZXh0UHJvbXB0QnlTSUQubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCBieVNJRCA9IGNhcHR1cmVOZXh0UHJvbXB0QnlTSUQuc2hpZnQoKTtcblx0XHRcdGJ5U0lEICYmIHByb21wdHNGcm9tU0RQUFBCYWNrZW5kLnNldChkZXRhaWwucHJvbXB0X2lkLCBieVNJRCk7XG5cdFx0fVxuXHR9KTtcblx0YXBpLmFkZEV2ZW50TGlzdGVuZXIoXCJleGVjdXRpbmdcIiwgKGU6IGFueSkgPT4ge1xuXHRcdGNvbnN0IGV4ZWN1dGluZ05vZGVJRCA9IGUuZGV0YWlsXG5cdFx0Y29uc3Qgbm9kZSA9IGdyYXBoLm5vZGVzLmZpbmQoKG46IGFueSkgPT4gbi5pZCA9PSBleGVjdXRpbmdOb2RlSUQpXG5cdFx0aWYgKG5vZGUpXG5cdFx0XHRwYWdlU3RvcmUuc2V0RXhlY3V0aW5nTm9kZVRpdGxlKG5vZGUudGl0bGUpO1xuXHR9KVxuXHRhcGkuYWRkRXZlbnRMaXN0ZW5lcihcImV4ZWN1dGlvbl9zdWNjZXNzXCIsIChldjogYW55KSA9PiB7XG5cdFx0cGFnZVN0b3JlLnNldFByb2dyZXNzKDApO1xuXHRcdHBhZ2VTdG9yZS5zZXRFeGVjdXRpbmdOb2RlVGl0bGUoJycpO1xuXHRcdGlmIChQcmV2aWV3U2VuZGVyLmdldChldi5kZXRhaWwucHJvbXB0X2lkKSkge1xuXHRcdFx0UHJldmlld1NlbmRlci5kZWxldGUoZXYuZGV0YWlsLnByb21wdF9pZCk7XG5cdFx0fVxuXHR9KTtcblx0YXBpLmFkZEV2ZW50TGlzdGVuZXIoXCJleGVjdXRpb25faW50ZXJydXB0ZWRcIiwgKCkgPT4ge1xuXHRcdHBhZ2VTdG9yZS5zZXRQcm9ncmVzcygwKTtcblx0XHRwYWdlU3RvcmUuc2V0RXhlY3V0aW5nTm9kZVRpdGxlKCcnKTtcblx0fSk7XG5cdGNvbnN0IHByb21wdHNGcm9tU0RQUFBCYWNrZW5kID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblx0YXBpLmFkZEV2ZW50TGlzdGVuZXIoXCJleGVjdXRlZFwiLCAoZXY6IGFueSkgPT4ge1xuXHRcdGlmIChldi5kZXRhaWwub3V0cHV0ICYmIEFycmF5LmlzQXJyYXkoZXYuZGV0YWlsLm91dHB1dC5pbWFnZXMpICYmIGV2LmRldGFpbC5vdXRwdXQuaW1hZ2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdGxldCBmcm9tU0lEID0gbnVsbDtcblx0XHRcdGlmIChQcmV2aWV3U2VuZGVyLmdldChldi5kZXRhaWwucHJvbXB0X2lkKSkge1xuXHRcdFx0XHRmcm9tU0lEID0gUHJldmlld1NlbmRlci5nZXQoZXYuZGV0YWlsLnByb21wdF9pZCk7XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIGNvbnNpZGVyIGlmIGl0IG5lY2Nlc2FyeVxuXHRcdFx0XHRmcm9tU0lEID0gbG9jYXRpb24uc2VhcmNoLm1hdGNoKC93ZWJ2aWV3X2Zyb21zaWQ9KFteJl0rKS8pPy5bMV0gfHwgJyc7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWZyb21TSUQpIHJldHVybjtcblx0XHRcdGlmIChcblx0XHRcdFx0IWFwcC5ncmFwaC5ub2Rlc1xuXHRcdFx0XHRcdC5maWx0ZXIoKG5vZGU6IGFueSkgPT4gbm9kZS50eXBlID09ICdTZW5kIEltYWdlcyBUbyBQaG90b3Nob3AnKVxuXHRcdFx0XHRcdC5maWx0ZXIoKG5vZGU6IGFueSkgPT4geyByZXR1cm4gbm9kZS5tb2RlID09IDAgfSlcblx0XHRcdFx0XHQubGVuZ3RoXG5cdFx0XHQpIHtcblx0XHRcdFx0c29ja2V0Py5zZW5kSW1hZ2UoZnJvbVNJRCwge1xuXHRcdFx0XHRcdGRvY3VtZW50X2lkZW50aWZ5OiBTcGVpY2lhbElETWFuYWdlci5nZXRTcGVjaWFsRG9jdW1lbnRGb3JQcmV2aWV3KCksXG5cdFx0XHRcdFx0bGF5ZXJfaWRlbnRpZmllczogZXYuZGV0YWlsLm91dHB1dC5pbWFnZXMubWFwKCgpID0+IFNwZWljaWFsSURNYW5hZ2VyLmdldFNwZWNpYWxMYXllckZvclNlbmQoKVswXSksXG5cdFx0XHRcdFx0Ym91bmRhcmllczogZXYuZGV0YWlsLm91dHB1dC5pbWFnZXMubWFwKCgpID0+ICcnKSxcblx0XHRcdFx0XHRpbWFnZV91cmxzOiBldi5kZXRhaWwub3V0cHV0LmltYWdlcy5tYXAoKGltYWdlOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiBsb2NhdGlvbi5vcmlnaW4gKyAnL2FwaS92aWV3P3R5cGU9JyArIGltYWdlLnR5cGUgKyAnJmZpbGVuYW1lPScgKyBpbWFnZS5maWxlbmFtZVxuXHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdG5ld19sYXllcl9uYW1lOiBzaW1wbGlmeVdvcmtmbG93UGF0aChwYWdlU3RvcmUuZGF0YS53aWRnZXRUYWJsZVN0cnVjdHVyZS53aWRnZXRUYWJsZVBhdGgpXG5cdFx0XHRcdH0pXG5cdFx0XHR9XG5cdFx0fVxuXHR9KVxuXG5cdGluaXRQb3B1cChhcHApO1xuXG5cdHZhciBzb2NrZXQgPSBuZXcgQ29tZnlTb2NrZXQoKTtcblx0c29ja2V0LmNvbm5lY3QoKTtcblxuXHRjb25zdCBpZCA9IFwiQ29tZnkuU0QtUFBQXCJcblxuXHRhcHAucmVnaXN0ZXJFeHRlbnNpb24oe1xuXHRcdG5hbWU6IGlkLFxuXHRcdGFzeW5jIHNldHVwKCkge1xuXHRcdH0sXG5cdFx0YXN5bmMgYmVmb3JlUmVnaXN0ZXJOb2RlRGVmKG5vZGVUeXBlOiBhbnksIG5vZGVEYXRhOiBhbnksIGFwcDogYW55KSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHR3cmFwTm9kZShub2RlVHlwZSwgbm9kZURhdGEpO1xuXHRcdFx0fSBjYXRjaCAoZTogYW55KSB7XG5cdFx0XHRcdGluaXRFcnJvcnMucHVzaChlLnN0YWNrIHx8IGUubWVzc2FnZSB8fCBlKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG5sZXQgaW5pdEVycm9yczogc3RyaW5nW10gPSBbXTtcbjsgKGFzeW5jIGZ1bmN0aW9uICgpIHtcblx0Ly8gQHRzLWlnbm9yZVxuXHRpZiAodHlwZW9mIGdyYWRpb0FwcCAhPSAndW5kZWZpbmVkJykgcmV0dXJuO1xuXG5cdHRyeSB7XG5cdFx0Y29uc3QgYXBwID0gKHdpbmRvdyBhcyBhbnkpLmNvbWZ5QVBJPy5hcHA/LmFwcDtcblx0XHRjb25zdCAkZWwgPSAod2luZG93IGFzIGFueSkuY29tZnlBUEk/LnVpPy4kZWw7XG5cdFx0Y29uc3QgYXBpID0gKHdpbmRvdyBhcyBhbnkpLmNvbWZ5QVBJPy5hcGk/LmFwaTtcblx0XHRpZiAoIWFwcCB8fCAhYXBpIHx8ICEkZWwpIHRocm93IG5ldyBFcnJvcignY29tZnlBUEkgaXMgbm90IGluaXRpYWxpemVkLCBtYXliZSBjb21meVVJIGlzIHRvbyBvbGQnKTtcblx0XHRhd2FpdCB3YWl0TW9kZWxJbml0ZWQoKTtcblx0XHRhd2FpdCBfaW5pdChhcHAsIGFwaSwgJGVsKTtcblxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRpbXBvcnQoJy4vc2RwcHAtY3VzdG9tLmpzJykudGhlbigobW9kdWxlKSA9PiB7XG5cdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRtb2R1bGUuZGVmYXVsdChzZHBwcFgpXG5cdFx0fSlcblxuXHR9IGNhdGNoIChlOiBhbnkpIHtcblx0XHRpbml0RXJyb3JzLnB1c2goZS5zdGFjayB8fCBlLm1lc3NhZ2UgfHwgZSk7XG5cdH1cblxuXHRhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAyMDAwKSk7XG5cdGlmIChpbml0RXJyb3JzLmxlbmd0aCkge1xuXHRcdGNvbnNvbGUuZXJyb3IoaW5pdEVycm9yc1swXSk7XG5cdFx0YWxlcnQoJ3NkLXBwcCBpbml0IGZhaWxlZDogXFxuJyArIGluaXRFcnJvcnMuam9pbign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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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UyxRQUFPLFFBQU8sVUFBUyxLQUFLLFFBQU8sVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsVUFBUyxLQUFJLFFBQU8sVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsUUFBTyxTQUFRLFFBQU8sU0FBUSxLQUFJLFFBQU8sS0FBSSxRQUFPLEtBQUksUUFBTyxLQUFJLFFBQU8sS0FBSSxRQUFPLEtBQUksUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsV0FBVSxVQUFTLFdBQVUsVUFBUyxXQUFVLFVBQVMsV0FBVSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxRQUFPLFFBQU8sUUFBTyxRQUFPLFFBQU8sS0FBSSxVQUFTLEtBQUksT0FBTSxLQUFJLE9BQU0sYUFBWSxNQUFLLEtBQUksT0FBTSxLQUFJLE9BQU0sS0FBSSxVQUFTLFVBQVMsVUFBUyxVQUFTLFdBQVUsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFFBQU8sVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxTQUFRLEtBQUksU0FBUSxRQUFPLFNBQVEsVUFBUyxTQUFRLEtBQUksT0FBTSxRQUFPLFFBQU8sVUFBUyxTQUFRLFVBQVMsT0FBTSxRQUFPLE9BQU0sVUFBUyxRQUFPLFVBQVMsU0FBUSxRQUFPLFNBQVEsVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFNBQVEsUUFBTyxPQUFNLFFBQU8sUUFBTyxRQUFPLE9BQU0sVUFBUyxVQUFTLFVBQVMsTUFBSyxVQUFTLE1BQUssVUFBUyxPQUFNLFVBQVMsU0FBUSxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLGdCQUFlLFVBQVMsVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxjQUFhLFVBQVMsWUFBVyxVQUFTLE9BQU0sVUFBUyxjQUFhLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLE9BQU0sVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFdBQVUsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsUUFBTyxVQUFTLFFBQU8sZ0JBQWUsU0FBUSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLE9BQU0sVUFBUyxNQUFLLFVBQVMsU0FBUSxVQUFTLE1BQUssVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFFBQU8sVUFBUyxVQUFTLFVBQVMsT0FBTSxLQUFJLFFBQU8sUUFBTyxNQUFLLFFBQU8sT0FBTSxRQUFPLFNBQVEsS0FBSSxNQUFLLFVBQVMsT0FBTSxXQUFVLFFBQU8sS0FBSSxVQUFTLFVBQVMsTUFBSyxXQUFVLE9BQU0sVUFBUyxTQUFRLEtBQUksTUFBSyxVQUFTLE9BQU0sV0FBVSxRQUFPLFFBQU8sT0FBTSxLQUFJLFFBQU8sUUFBTyxVQUFTLFVBQVMsU0FBUSxVQUFTLE1BQUssVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxPQUFNLGdCQUFlLFFBQU8sVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLE9BQU0sVUFBUyxRQUFPLFVBQVMsT0FBTSxVQUFTLFFBQU8sVUFBUyxPQUFNLFVBQVMsTUFBSyxVQUFTLE9BQU0sZ0JBQWUsUUFBTyxVQUFTLE9BQU0sZ0JBQWUsUUFBTyxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsVUFBUyxVQUFTLFdBQVUsVUFBUyxTQUFRLFVBQVMsWUFBVyxVQUFTLFlBQVcsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsT0FBTSxVQUFTLFFBQU8sZ0JBQWUsU0FBUSxVQUFTLFFBQU8sZ0JBQWUsUUFBTyxVQUFTLE1BQUssZ0JBQWUsT0FBTSxVQUFTLE9BQU0sVUFBUyxNQUFLLFVBQVMsUUFBTyxnQkFBZSxTQUFRLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxNQUFLLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxRQUFPLGdCQUFlLFNBQVEsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLGFBQVksZ0JBQWUsUUFBTyxVQUFTLFFBQU8sZ0JBQWUsU0FBUSxVQUFTLFNBQVEsZ0JBQWUsVUFBUyxVQUFTLFNBQVEsZ0JBQWUsU0FBUSxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFFBQU8sVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFVBQVMsZ0JBQWUsV0FBVSxVQUFTLE1BQUssVUFBUyxPQUFNLGdCQUFlLFFBQU8sVUFBUyxNQUFLLFVBQVMsT0FBTSxnQkFBZSxRQUFPLFVBQVMsTUFBSyxnQkFBZSxPQUFNLFVBQVMsTUFBSyxnQkFBZSxPQUFNLGdCQUFlLFFBQU8sVUFBUyxPQUFNLFVBQVMsT0FBTSxnQkFBZSxRQUFPLFVBQVMsTUFBSyxnQkFBZSxRQUFPLGdCQUFlLE9BQU0sVUFBUyxNQUFLLGdCQUFlLFFBQU8sZ0JBQWUsT0FBTSxVQUFTLFNBQVEsVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsTUFBSyxVQUFTLFFBQU8sVUFBUyxNQUFLLFVBQVMsUUFBTyxVQUFTLE1BQUssVUFBUyxPQUFNLFVBQVMsTUFBSyxVQUFTLE9BQU0sVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFNBQVEsZ0JBQWUsb0JBQW1CLFVBQVMsT0FBTSxVQUFTLFFBQU8sZ0JBQWUsU0FBUSxVQUFTLE9BQU0sVUFBUyxRQUFPLGdCQUFlLFNBQVEsVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFFBQU8sVUFBUyxTQUFRLGdCQUFlLFVBQVMsVUFBUyxTQUFRLGdCQUFlLFVBQVMsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxTQUFRLGdCQUFlLG1CQUFrQixVQUFTLFNBQVEsZ0JBQWUscUJBQW9CLFVBQVMsVUFBUyxVQUFTLFdBQVUsVUFBUyxVQUFTLFVBQVMsV0FBVSxVQUFTLFNBQVEsZ0JBQWUsVUFBUyxVQUFTLFNBQVEsZ0JBQWUsVUFBUyxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxVQUFTLGdCQUFlLFdBQVUsVUFBUyxTQUFRLFVBQVMsVUFBUyxnQkFBZSxXQUFVLFVBQVMsVUFBUyxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFdBQVUsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLE9BQU0sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsTUFBSyxnQkFBZSxPQUFNLFVBQVMsTUFBSyxnQkFBZSxPQUFNLGdCQUFlLFFBQU8sVUFBUyxPQUFNLFVBQVMsT0FBTSxnQkFBZSxRQUFPLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFdBQVUsZ0JBQWUsWUFBVyxVQUFTLFdBQVUsVUFBUyxXQUFVLFVBQVMsU0FBUSxnQkFBZSxVQUFTLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxPQUFNLFVBQVMsV0FBVSxVQUFTLFdBQVUsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxRQUFPLFVBQVMsWUFBVyxVQUFTLFlBQVcsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxZQUFXLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsV0FBVSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxZQUFXLFVBQVMsbUJBQWtCLFVBQVMsb0JBQW1CLFVBQVMsYUFBWSxVQUFTLGNBQWEsVUFBUyxZQUFXLFVBQVMsWUFBVyxVQUFTLFNBQVEsVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsT0FBTSxVQUFTLFFBQU8sVUFBUyx3QkFBdUIsVUFBUyxRQUFPLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxRQUFPLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLG9CQUFtQixVQUFTLHFCQUFvQixVQUFTLFNBQVEsVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxRQUFPLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMscUJBQW9CLFVBQVMsWUFBVyxVQUFTLFdBQVUsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxRQUFPLFVBQVMsWUFBVyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLE9BQU0sVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFlBQVcsVUFBUyxjQUFhLFVBQVMsZ0JBQWUsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsV0FBVSxVQUFTLFdBQVUsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsVUFBUyxVQUFTLFNBQVEsZ0JBQWUsVUFBUyxVQUFTLFdBQVUsVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFdBQVUsVUFBUyxVQUFTLFVBQVMsV0FBVSxVQUFTLFdBQVUsVUFBUyxVQUFTLFVBQVMsV0FBVSxVQUFTLFlBQVcsVUFBUyxZQUFXLFVBQVMsWUFBVyxVQUFTLG1CQUFrQixVQUFTLHFCQUFvQixVQUFTLHVCQUFzQixVQUFTLG9CQUFtQixVQUFTLGlCQUFnQixVQUFTLGtCQUFpQixVQUFTLG9CQUFtQixVQUFTLHNCQUFxQixVQUFTLHFCQUFvQixVQUFTLHNCQUFxQixVQUFTLG1CQUFrQixVQUFTLHFCQUFvQixVQUFTLGlCQUFnQixVQUFTLGtCQUFpQixVQUFTLG9CQUFtQixVQUFTLHNCQUFxQixVQUFTLHFCQUFvQixVQUFTLHNCQUFxQixVQUFTLG1CQUFrQixVQUFTLHFCQUFvQixVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxXQUFVLFVBQVMsV0FBVSxVQUFTLFdBQVUsVUFBUyxXQUFVLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsZ0JBQWUsVUFBUyxTQUFRLFVBQVMsV0FBVSxVQUFTLFdBQVUsVUFBUyxXQUFVLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsV0FBVSxVQUFTLFdBQVUsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsV0FBVSxVQUFTLFVBQVMsVUFBUyxZQUFXLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxXQUFVLFVBQVMsV0FBVSxVQUFTLFlBQVcsVUFBUyxZQUFXLFVBQVMsWUFBVyxVQUFTLFlBQVcsVUFBUyxZQUFXLFVBQVMsWUFBVyxVQUFTLFlBQVcsVUFBUyxZQUFXLFVBQVMsV0FBVSxVQUFTLFdBQVUsVUFBUyxXQUFVLFVBQVMsWUFBVyxVQUFTLFlBQVcsVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsV0FBVSxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsV0FBVSxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsWUFBVyxVQUFTLG1CQUFrQixnQkFBZSxzQkFBcUIsVUFBUyxvQkFBbUIsZ0JBQWUsdUJBQXNCLFVBQVMsVUFBUyxVQUFTLFlBQVcsVUFBUyxXQUFVLFVBQVMsVUFBUyxVQUFTLFlBQVcsVUFBUyxZQUFXLFVBQVMsUUFBTyxVQUFTLGVBQWMsVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxZQUFXLFVBQVMsWUFBVyxVQUFTLFNBQVEsVUFBUyxZQUFXLFVBQVMsWUFBVyxVQUFTLFdBQVUsVUFBUyxZQUFXLFVBQVMsV0FBVSxVQUFTLFlBQVcsVUFBUyxXQUFVLFVBQVMsWUFBVyxVQUFTLFdBQVUsVUFBUyxVQUFTLFVBQVMsV0FBVSxVQUFTLFdBQVUsVUFBUyxVQUFTLFVBQVMsV0FBVSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxZQUFXLFVBQVMsVUFBUyxVQUFTLFdBQVUsVUFBUyxXQUFVLFVBQVMsWUFBVyxVQUFTLFVBQVMsVUFBUyxRQUFPLFVBQVMsV0FBVSxVQUFTLFlBQVcsVUFBUyxXQUFVLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsWUFBVyxVQUFTLFlBQVcsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsV0FBVSxVQUFTLE9BQU0sVUFBUyxNQUFLLFVBQVMsVUFBUyxVQUFTLFFBQU8sVUFBUyxXQUFVLFVBQVMsWUFBVyxVQUFTLFFBQU8sVUFBUyxPQUFNLFVBQVMsUUFBTyxVQUFTLE9BQU0sVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxXQUFVLGdCQUFlLFlBQVcsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLE9BQU0sZ0JBQWUsUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxXQUFVLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxXQUFVLFVBQVMsV0FBVSxVQUFTLE9BQU0sZ0JBQWUsUUFBTyxVQUFTLE9BQU0sZ0JBQWUsUUFBTyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsV0FBVSxVQUFTLFdBQVUsVUFBUyxZQUFXLFVBQVMsWUFBVyxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsTUFBSyxVQUFTLE1BQUssVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsWUFBVyxnQkFBZSxxQkFBb0IsVUFBUyxrQkFBaUIsZ0JBQWUsMkJBQTBCLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxRQUFPLGdCQUFlLFNBQVEsVUFBUyxRQUFPLGdCQUFlLFNBQVEsVUFBUyxTQUFRLFVBQVMsT0FBTSxnQkFBZSxRQUFPLFVBQVMsT0FBTSxnQkFBZSxRQUFPLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxNQUFLLFVBQVMsTUFBSyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsV0FBVSxVQUFTLFdBQVUsVUFBUyxXQUFVLFVBQVMsV0FBVSxVQUFTLFdBQVUsVUFBUyxXQUFVLFVBQVMsUUFBTyxnQkFBZSxTQUFRLFVBQVMsUUFBTyxnQkFBZSxTQUFRLFVBQVMsVUFBUyxVQUFTLFVBQVMsZ0JBQWUsVUFBUyxVQUFTLFNBQVEsZ0JBQWUsVUFBUyxVQUFTLFNBQVEsVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFdBQVUsVUFBUyxXQUFVLFVBQVMsU0FBUSxVQUFTLFdBQVUsVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxRQUFPLFVBQVMsT0FBTSxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxTQUFRLGdCQUFlLFVBQVMsVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFNBQVEsUUFBTyxVQUFTLFFBQU8sUUFBTyxLQUFJLFVBQVMsUUFBTyxTQUFRLFFBQU8sT0FBTSxVQUFTLFFBQU8sUUFBTyxRQUFPLFFBQU8sUUFBTyxVQUFTLFVBQVMsUUFBTyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFFBQU8sUUFBTyxVQUFTLFVBQVMsVUFBUyxVQUFTLFFBQU8sUUFBTyxRQUFPLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsYUFBZSxRQUFPLGFBQWUsUUFBTyxhQUFlLE9BQU0sYUFBZSxRQUFPLGFBQWUsT0FBTSxhQUFlLFFBQU8sUUFBTyxRQUFPLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFFBQU8sU0FBUSxRQUFPLFNBQVEsUUFBTyxTQUFRLFFBQU8sU0FBUSxRQUFPLFFBQU8sUUFBTyxRQUFPLFFBQU8sVUFBUyxRQUFPLFVBQVMsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFFBQU8sU0FBUSxRQUFPLFNBQVEsYUFBZSxRQUFPLGFBQWUsUUFBTyxhQUFlLE9BQU0sYUFBZSxRQUFPLFVBQVMsUUFBTyxhQUFlLE9BQU0sYUFBZSxPQUFNLGFBQWUsUUFBTyxhQUFlLFFBQU8sVUFBUyxPQUFNLGFBQWUsUUFBTyxVQUFTLFFBQU8sVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxRQUFPLFVBQVMsUUFBTyxRQUFPLFVBQVMsUUFBTyxVQUFTLFVBQVMsVUFBUyxhQUFlLE9BQU0sVUFBUyxNQUFLLGFBQWUsUUFBTyxhQUFlLFFBQU8sYUFBZSxRQUFPLGFBQWUsT0FBTSxVQUFTLE1BQUssYUFBZSxRQUFPLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxRQUFPLE9BQU0sUUFBTyxPQUFNLFVBQVMsTUFBSyxVQUFTLFFBQU8sYUFBZSxPQUFNLGFBQWUsUUFBTyxVQUFTLFFBQU8sYUFBZSxPQUFNLGFBQWUsUUFBTyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxTQUFRLFFBQU8sU0FBUSxVQUFTLFVBQVMsVUFBUyxVQUFTLFFBQU8sUUFBTyxRQUFPLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsYUFBZSxPQUFNLGFBQWUsUUFBTyxhQUFlLFFBQU8sYUFBZSxPQUFNLGFBQWUsUUFBTyxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxTQUFRLE1BQUssU0FBUSxVQUFTLFNBQVEsVUFBUyxRQUFPLFVBQVMsUUFBTyxhQUFlLFFBQU8sYUFBZSxPQUFNLGFBQWUsUUFBTyxhQUFlLFFBQU8sYUFBZSxPQUFNLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFVBQVMsYUFBZSxPQUFNLFVBQVMsV0FBVSxhQUFlLFFBQU8sYUFBZSxRQUFPLFVBQVMsUUFBTyxVQUFTLE9BQU0sVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxRQUFPLFVBQVMsVUFBUyxVQUFTLFVBQVMsYUFBZSxRQUFPLGFBQWUsT0FBTSxhQUFlLFFBQU8sVUFBUyxNQUFLLGFBQWUsUUFBTyxVQUFTLFFBQU8sVUFBUyxNQUFLLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFNBQVEsUUFBTyxTQUFRLFFBQU8sUUFBTyxRQUFPLFFBQU8sVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLGFBQWUsUUFBTyxhQUFlLFFBQU8sYUFBZSxPQUFNLGFBQWUsUUFBTyxhQUFlLE9BQU0sYUFBZSxRQUFPLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLGFBQWUsUUFBTyxhQUFlLFFBQU8sYUFBZSxPQUFNLGFBQWUsUUFBTyxhQUFlLFFBQU8sYUFBZSxPQUFNLFVBQVMsVUFBUyxVQUFTLFVBQVMsYUFBZSxPQUFNLGFBQWUsUUFBTyxVQUFTLE9BQU0sYUFBZSxRQUFPLFVBQVMsUUFBTyxhQUFlLE9BQU0sYUFBZSxRQUFPLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxhQUFlLE9BQU0sYUFBZSxRQUFPLGFBQWUsUUFBTyxhQUFlLE9BQU0sYUFBZSxRQUFPLFVBQVMsUUFBTyxhQUFlLE9BQU0sYUFBZSxRQUFPLGFBQWUsUUFBTyxVQUFTLFFBQU8sYUFBZSxRQUFPLGFBQWUsT0FBTSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLE9BQU0sVUFBUyxPQUFNLGFBQWUsUUFBTyxhQUFlLE9BQU0sVUFBUyxRQUFPLGFBQWUsUUFBTyxhQUFlLE9BQU0sYUFBZSxRQUFPLFFBQU8sUUFBTyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxTQUFRLFFBQU8sU0FBUSxRQUFPLFFBQU8sUUFBTyxRQUFPLFVBQVMsVUFBUyxVQUFTLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxhQUFlLE9BQU0sYUFBZSxRQUFPLGFBQWUsUUFBTyxVQUFTLFFBQU8sYUFBZSxPQUFNLGFBQWUsUUFBTyxhQUFlLFFBQU8sYUFBZSxPQUFNLGFBQWUsUUFBTyxhQUFlLFFBQU8sYUFBZSxPQUFNLFVBQVMsUUFBTyxVQUFTLFVBQVMsYUFBZSxPQUFNLGFBQWUsUUFBTyxhQUFlLFFBQU8sVUFBUyxRQUFPLFVBQVMsTUFBSyxVQUFTLFFBQU8sVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsYUFBZSxRQUFPLGFBQWUsUUFBTyxhQUFlLE9BQU0sYUFBZSxRQUFPLGFBQWUsT0FBTSxhQUFlLFFBQU8sVUFBUyxNQUFLLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsUUFBTyxTQUFRLGFBQWUsT0FBTSxhQUFlLFFBQU8sYUFBZSxRQUFPLGFBQWUsUUFBTyxhQUFlLE9BQU0sYUFBZSxRQUFPLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsVUFBUyxhQUFlLFFBQU8sYUFBZSxRQUFPLGFBQWUsT0FBTSxhQUFlLFFBQU8sYUFBZSxPQUFNLGFBQWUsUUFBTyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxRQUFPLFNBQVEsUUFBTyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsUUFBTyxRQUFPLFFBQU8sUUFBTyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLGFBQWUsT0FBTSxhQUFlLFFBQU8sYUFBZSxRQUFPLGFBQWUsT0FBTSxhQUFlLFFBQU8sYUFBZSxRQUFPLGFBQWUsUUFBTyxhQUFlLFFBQU8sYUFBZSxPQUFNLGFBQWUsUUFBTyxhQUFlLFFBQU8sYUFBZSxPQUFNLFVBQVMsU0FBUSxVQUFTLFNBQVEsYUFBZSxPQUFNLGFBQWUsUUFBTyxhQUFlLFFBQU8sYUFBZSxRQUFPLGFBQWUsT0FBTSxhQUFlLFFBQU8sYUFBZSxPQUFNLGFBQWUsUUFBTyxhQUFlLFFBQU8sYUFBZSxRQUFPLGFBQWUsT0FBTSxhQUFlLFFBQU8sUUFBTyxVQUFTLFFBQU8sVUFBUyxVQUFTLFNBQVEsVUFBUyxTQUFRLFFBQU8sUUFBTyxVQUFTLFFBQU8sYUFBZSxRQUFPLGFBQWUsT0FBTSxhQUFlLFFBQU8sVUFBUyxPQUFNLFVBQVMsUUFBTyxhQUFlLFFBQU8sVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxTQUFRLFFBQU8sU0FBUSxRQUFPLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFdBQVUsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsTUFBSyxRQUFPLFNBQVEsVUFBUyxNQUFLLFVBQVMsTUFBSyxVQUFTLE1BQUssVUFBUyxNQUFLLFVBQVMsTUFBSyxVQUFTLFdBQVUsVUFBUyxXQUFVLFVBQVMsTUFBSyxVQUFTLE9BQU0sVUFBUyxNQUFLLFVBQVMsT0FBTSxVQUFTLFFBQU8sVUFBUyxPQUFNLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxRQUFPLFVBQVMsV0FBVSxVQUFTLFFBQU8sVUFBUyxPQUFNLFVBQVMsUUFBTyxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsU0FBUSxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFNBQVE7QUFFaG4wQixjQUFJLGNBQWM7QUFDbEIsY0FBSSxZQUFZO1lBQ2YsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFNO1lBQ04sS0FBSzs7Ozs7WUFLTCxLQUFLOzs7OztZQUtMLEtBQUs7VUFDUDtBQUVDLGNBQUkscUJBQXFCO0FBQ3pCLGNBQUksMkJBQTJCO0FBQy9CLGNBQUksY0FBYztBQUNsQixjQUFJLFlBQVksRUFBQyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsVUFBUyxVQUFTLFVBQVMsTUFBSyxVQUFTLE9BQU0sVUFBUyxPQUFNLGdCQUFlLFNBQVEsUUFBTyxTQUFRLFFBQU8sU0FBUSxRQUFPLE9BQU0sVUFBUyxPQUFNLFVBQVMsU0FBUSxRQUFPLFNBQVEsUUFBTyxNQUFLLFVBQVMsT0FBTSxhQUFlLE9BQU0sYUFBZSxVQUFTLFFBQU8sVUFBUyxRQUFPLFdBQVUsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxPQUFNLEtBQUksT0FBTSxLQUFJLE9BQU0sVUFBUyxPQUFNLFVBQVMsVUFBUyxVQUFTLFFBQU8sVUFBUyxZQUFXLFVBQVMsUUFBTyxVQUFTLE9BQU0sVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxZQUFXLFVBQVMsWUFBVyxVQUFTLFlBQVcsVUFBUyxZQUFXLFVBQVMsWUFBVyxVQUFTLFlBQVcsVUFBUyxZQUFXLFVBQVMsWUFBVyxVQUFTLFNBQVEsVUFBUyxXQUFVLFVBQVMsWUFBVyxVQUFTLFVBQVMsVUFBUyxTQUFRLFFBQU8sV0FBVSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsUUFBTyxhQUFlLFFBQU8sYUFBZSxNQUFLLFVBQVMsVUFBUyxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsUUFBTyxVQUFTLFFBQU8sS0FBSyxpQkFBZ0IsVUFBUyxVQUFTLFVBQVMsWUFBVyxVQUFTLFNBQVEsUUFBTyxTQUFRLFFBQU8sUUFBTyxhQUFlLFFBQU8sYUFBZSxVQUFTLFVBQVMsT0FBTSxLQUFJLFNBQVEsVUFBUyxXQUFVLFVBQVMsVUFBUyxRQUFPLFVBQVMsUUFBTyxRQUFPLFFBQU8sUUFBTyxRQUFPLFlBQVcsVUFBUyxTQUFRLFVBQVMsWUFBVyxVQUFTLGVBQWMsVUFBUyxhQUFZLFVBQVMsV0FBVSxVQUFTLGFBQVksVUFBUyxhQUFZLFVBQVMsUUFBTyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFlBQVcsVUFBUyxRQUFPLFVBQVMsWUFBVyxVQUFTLFNBQVEsVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsV0FBVSxVQUFTLFdBQVUsVUFBUyxXQUFVLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxjQUFhLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsV0FBVSxVQUFTLE9BQU0sYUFBZSxPQUFNLGFBQWUsVUFBUyxVQUFTLFdBQVUsVUFBUyxVQUFTLFVBQVMsV0FBVSxVQUFTLFlBQVcsVUFBUyxhQUFZLFVBQVMsWUFBVyxVQUFTLFdBQVUsVUFBUyxtQkFBa0IsVUFBUyxpQkFBZ0IsVUFBUyxZQUFXLFVBQVMsVUFBUyxVQUFTLFlBQVcsVUFBUyxVQUFTLFVBQVMsZ0JBQWUsVUFBUyxlQUFjLFVBQVMsaUJBQWdCLFVBQVMscUJBQW9CLFVBQVMscUJBQW9CLFVBQVMsc0JBQXFCLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxPQUFNLFdBQVUsV0FBVSxnQkFBZSxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sYUFBZSxRQUFPLGFBQWUsT0FBTSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFlBQVcsVUFBUyxXQUFVLFVBQVMsWUFBVyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxVQUFTLFFBQU8sUUFBTyxhQUFlLFFBQU8sVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxRQUFPLE1BQUssU0FBUSxVQUFTLFlBQVcsVUFBUyxRQUFPLFVBQVMsVUFBUyxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxPQUFNLFVBQVMsT0FB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QVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLEtBQUksUUFBTyxhQUFlLFFBQU8sYUFBZSxPQUFNLFVBQVMsT0FBTSxRQUFPLFVBQVMsVUFBUyxTQUFRLFVBQVMsWUFBVyxVQUFTLFlBQVcsVUFBUyxZQUFXLFVBQVMsV0FBVSxVQUFTLGFBQVksVUFBUyxrQkFBaUIsVUFBUyx5QkFBd0IsVUFBUyxhQUFZLFFBQU8sbUJBQWtCLFVBQVMsbUJBQWtCLFVBQVMsd0JBQXVCLFVBQVMsaUJBQWdCLFVBQVMsdUJBQXNCLFVBQVMsNEJBQTJCLFVBQVMsd0JBQXVCLFVBQVMsb0JBQW1CLFVBQVMsa0JBQWlCLFVBQVMsaUJBQWdCLFVBQVMscUJBQW9CLFVBQVMscUJBQW9CLFVBQVMsYUFBWSxVQUFTLGFBQVksVUFBUyxhQUFZLFVBQVMsZ0JBQWUsVUFBUyxvQkFBbUIsVUFBUyxhQUFZLFVBQVMsa0JBQWlCLFVBQVMsbUJBQWtCLFVBQVMsb0JBQW1CLFVBQVMsdUJBQXNCLFVBQVMscUJBQW9CLFVBQVMsa0JBQWlCLFVBQVMscUJBQW9CLFVBQVMsc0JBQXFCLFVBQVMsbUJBQWtCLFVBQVMsc0JBQXFCLFVBQVMsV0FBVSxVQUFTLGdCQUFlLFVBQVMsWUFBVyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsUUFBTyxhQUFlLFFBQU8sYUFBZSxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsV0FBVSxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsWUFBVyxVQUFTLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsUUFBTyxVQUFTLFNBQVEsUUFBTyxTQUFRLFFBQU8sVUFBUyxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsU0FBUSxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLE1BQUssVUFBUyxTQUFRLFVBQVMsT0FBTSxhQUFlLE9BQU0sYUFBZSxNQUFLLFVBQVMsVUFBUyxRQUFPLFVBQVMsUUFBTyxPQUFNLFVBQVMsVUFBUyxVQUFTLE1BQUssVUFBUyxXQUFVLFVBQVMsWUFBVyxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFlBQVcsVUFBUyxvQkFBbUIsVUFBUyxVQUFTLFVBQVMsd0JBQXVCLFVBQVMsUUFBTyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxRQUFPLGFBQWUsUUFBTyxhQUFlLFFBQU8sVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFFBQU8sVUFBUyxXQUFVLFVBQVMsV0FBVSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsV0FBVSxVQUFTLFNBQVEsVUFBUyxjQUFhLFVBQVMsZUFBYyxVQUFTLFNBQVEsVUFBUyxVQUFTLEtBQUksY0FBYSxVQUFTLFVBQVMsVUFBUyxlQUFjLFVBQVMsU0FBUSxVQUFTLFdBQVUsVUFBUyxZQUFXLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsT0FBTSxRQUFPLE9BQU0sUUFBTyxRQUFPLFFBQU8sUUFBTyxRQUFPLFFBQU8sVUFBUyxRQUFPLEtBQUksU0FBUSxVQUFTLFVBQVMsVUFBUyxlQUFjLFVBQVMsZ0JBQWUsVUFBUyxnQkFBZSxVQUFTLGlCQUFnQixVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLE9BQU0sYUFBZSxPQUFNLGFBQWUsU0FBUSxVQUFTLHFCQUFvQixVQUFTLHlCQUF3QixVQUFTLFNBQVEsTUFBSyxRQUFPLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxRQUFPLFVBQVMsUUFBTyxhQUFlLFFBQU8sYUFBZSxVQUFTLFVBQVMsVUFBUyxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsY0FBYSxVQUFTLFlBQVcsVUFBUyxVQUFTLFFBQU8sVUFBUyxVQUFTLFVBQVMsUUFBTyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsUUFBTyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFFBQU8sYUFBZSxRQUFPLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxPQUFNLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsTUFBSyxVQUFTLE1BQUssVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxRQUFPLFVBQVMsWUFBVyxVQUFTLE9BQU0sVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFdBQVUsVUFBUyxZQUFXLFVBQVMsUUFBTyxnQkFBZSxVQUFTLFVBQVMsT0FBTSxhQUFlLE9BQU0sYUFBZSxNQUFLLFVBQVMsTUFBSyxVQUFTLE9BQU0sVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxNQUFLLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsUUFBTyxVQUFTLFlBQVcsVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFFBQU8sYUFBZSxRQUFPLGFBQWUsU0FBUSxLQUFJLGdCQUFlLFVBQVMsb0JBQW1CLFVBQVMsb0JBQW1CLFVBQVMsa0JBQWlCLFVBQVMsZUFBYyxVQUFTLHFCQUFvQixVQUFTLGdCQUFlLFVBQVMsUUFBTyxVQUFTLFFBQU8sYUFBZSxRQUFPLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxNQUFLLEtBQUksTUFBSyxVQUFTLE1BQUssS0FBSSxRQUFPLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsV0FBVSxVQUFTLGFBQVksVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLGFBQVksVUFBUyxjQUFhLFVBQVMsV0FBVSxVQUFTLFVBQVMsVUFBUyxhQUFZLGdCQUFlLFFBQU8sZ0JBQWUsU0FBUSxVQUFTLFVBQVMsVUFBUyxRQUFPLFFBQU8sVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxXQUFVLFVBQVMsU0FBUSxVQUFTLE9BQU0sS0FBSSxRQUFPLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsYUFBWSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsT0FBTSxhQUFlLE9BQU0sVUFBUyxnQkFBZSxVQUFTLFlBQVcsVUFBUyxZQUFXLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxpQkFBZ0IsVUFBUyxrQkFBaUIsVUFBUyxRQUFPLGFBQWUsUUFBTyxVQUFTLFVBQVMsVUFBUyxrQkFBaUIsVUFBUyxRQUFPLGFBQWUsUUFBTyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLGdCQUFlLFVBQVMsYUFBWSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxRQUFPLFVBQVMsUUFBTyxNQUFLLFVBQVMsU0FBUSxRQUFPLFNBQVEsUUFBTyxPQUFNLFVBQVMsT0FBTSxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFNBQVEsUUFBTyxPQUFNLFVBQVMsT0FBTSxhQUFlLE9BQU0sVUFBUyxVQUFTLFFBQU8sVUFBUyxRQUFPLE1BQUssVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxNQUFLLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsY0FBYSxVQUFTLFlBQVcsVUFBUyxZQUFXLFVBQVMsU0FBUSxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsV0FBVSxVQUFTLE1BQUssVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFlBQVcsVUFBUyxVQUFTLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxVQUFTLFVBQVMsWUFBVyxVQUFTLFlBQVcsVUFBUyxZQUFXLFVBQVMsZ0JBQWUsVUFBUyxZQUFXLFVBQVMsV0FBVSxVQUFTLGtCQUFpQixVQUFTLGtCQUFpQixVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxRQUFPLGFBQWUsUUFBTyxhQUFlLFFBQU8sVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFVBQVMsUUFBTyxRQUFPLGFBQWUsUUFBTyxVQUFTLFFBQU8sVUFBUyxXQUFVLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLE1BQUssVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsUUFBTyxRQUFPLFFBQU8sUUFBTyxTQUFRLFVBQVMsU0FBUSxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsT0FBTSxhQUFlLE9BQU0sYUFBZSxTQUFRLFVBQVMsUUFBTyxhQUFlLFFBQU8sYUFBZSxRQUFPLGFBQWUsUUFBTyxhQUFlLFVBQVMsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsT0FBTSxhQUFlLE9BQU0sYUFBZSxVQUFTLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sYUFBZSxRQUFPLGFBQWUsUUFBTyxhQUFlLFFBQU8sYUFBZSxTQUFRLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxZQUFXLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLE9BQU0sVUFBUyxjQUFhLFVBQVMsU0FBUSxRQUFPLFFBQU8sVUFBUyxRQUFPLFVB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LFNBQVEsVUFBUyxRQUFPLEtBQUksU0FBUSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLE1BQUssS0FBSSxNQUFLLFVBQVMsTUFBSyxLQUFJLFFBQU8sVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFdBQVUsVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsWUFBVyxVQUFTLFdBQVUsVUFBUyxhQUFZLGdCQUFlLFFBQU8sZ0JBQWUsUUFBTyxRQUFPLFFBQU8sVUFBUyxRQUFPLFVBQVMsV0FBVSxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsVUFBUyxVQUFTLGNBQWEsVUFBUyxjQUFhLFVBQVMsWUFBVyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLGlCQUFnQixVQUFTLGVBQWMsVUFBUyxhQUFZLFVBQVMsT0FBTSxhQUFlLE9BQU0sYUFBZSxPQUFNLFVBQVMsU0FBUSxRQUFPLE9BQU0sVUFBUyxVQUFTLEtBQUksVUFBUyxVQUFTLFVBQVMsUUFBTyxTQUFRLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxXQUFVLFVBQVMsYUFBWSxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxRQUFPLGFBQWUsUUFBTyxhQUFlLE1BQUssVUFBUyxRQUFPLGFBQWUsUUFBTyxVQUFTLFVBQVMsVUFBUyxNQUFLLFVBQVMsTUFBSyxVQUFTLFlBQVcsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsUUFBTyxnQkFBZSxPQUFNLFVBQVMsUUFBTyxnQkFBZSxTQUFRLGdCQUFlLFNBQVEsVUFBUyxXQUFVLFVBQVMsU0FBUSxVQUFTLFdBQVUsVUFBUyxZQUFXLFVBQVMsUUFBTyxRQUFPLFNBQVEsZ0JBQWUsVUFBUyxnQkFBZSxRQUFPLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMs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QUFRLFVBQVMsV0FBVSxVQUFTLFdBQVUsVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFNBQVEsZ0JBQWUsV0FBVSxnQkFBZSxhQUFZLFVBQVMsY0FBYSxnQkFBZSxTQUFRLFVBQVMsV0FBVSxnQkFBZSxRQUFPLFVBQVMsU0FBUSxVQUFTLFNBQVEsZ0JBQWUsV0FBVSxnQkFBZSxhQUFZLFVBQVMsY0FBYSxnQkFBZSxRQUFPLFVBQVMsVUFBUyxRQUFPLFVBQVMsUUFBTyxRQUFPLFVBQVMsaUJBQWdCLFVBQVMsbUJBQWtCLFVBQVMsa0JBQWlCLFVBQVMsb0JBQW1CLFVBQVMsTUFBSyxVQUFTLE1BQUssVUFBUyxPQUFNLEtBQUksVUFBUyxVQUFTLFNBQVEsVUFBUyxRQUFPLGdCQUFlLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxRQUFPLGdCQUFlLFFBQU8sV0FBVSxVQUFTLFVBQVMsV0FBVSxVQUFTLFVBQVMsVUFBUyxRQUFPLGdCQUFlLFFBQU8sV0FBVSxXQUFVLGdCQUFlLFVBQVMsVUFBUyxXQUFVLGdCQUFlLFNBQVEsZ0JBQWUsVUFBUyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsV0FBVSxVQUFTLFVBQVMsVUFBUyxVQUFTLFFBQU8sVUFBUyxRQUFPLFFBQU8sVUFBUyxRQUFPLFVBQVMsU0FBUSxRQUFPLFNBQVEsUUFBTyxPQUFNLFVBQVMsT0FBTSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLE9BQU0sYUFBZSxPQUFNLGFBQWUsUUFBTyxVQUFTLFVBQVMsUUFBTyxVQUFTLFFBQU8sT0FBTSxVQUFTLFNBQVEsVUFBUyxPQUFNLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsV0FBVSxVQUFTLFNBQVEsVUFBUyxPQUFNLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFdBQVUsVUFBUyxXQUFVLFVBQVMsUUFBTyxVQUFTLFVBQVMsVUFBUyxRQUFPLGFBQWUsUUFBTyxhQUFlLFFBQU8sVUFBUyx3QkFBdUIsVUFBUyxrQkFBaUIsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLE1BQUssVUFBUyxNQUFLLFVBQVMsU0FBUSxVQUFTLE9BQU0sVUFBUyxTQUFRLFVBQVMsV0FBVSxVQUFTLFFBQU8sUUFBTyxRQUFPLFFBQU8sVUFBUyxVQUFTLFFBQU8sVUFBUyxXQUFVLFVBQVMsT0FBTSxVQUFTLE1BQUssVUFBUyxRQUFPLFVBQVMsUUFBTyxhQUFlLFVBQVMsUUFBTyxVQUFTLFFBQU8sUUFBTyxVQUFTLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxVQUFTLFVBQVMsVUFBUyxZQUFXLFVBQVMsUUFBTyxRQUFPLFFBQU8sUUFBTyxTQUFRLFVBQVMsV0FBVSxVQUFTLGFBQVksVUFBUyxlQUFjLFVBQVMsbUJBQWtCLFVBQVMsT0FBTSxVQUFTLFFBQU8sUUFBTyxZQUFXLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxRQUFPLFVBQVMsWUFBVyxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsVUFBUyxLQUFJLFVBQVMsS0FBSSxVQUFTLFVBQVMsUUFBTyxVQUFTLFdBQVUsVUFBUyxPQUFNLGFBQWUsT0FBTSxhQUFlLE9BQU0sVUFBUyxPQUFNLFVBQVMsUUFBTyxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsTUFBSyxVQUFTLE1BQUssVUFBUyxhQUFZLFVBQVMsT0FBTSxVQUFTLFVBQVMsVUFBUyxXQUFVLFVBQVMsVUFBUyxVQUFTLFFBQU8sS0FBSSxZQUFXLFVBQVMsU0FBUSxVQUFTLFdBQVUsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxhQUFZLFFBQU8sVUFBUyxRQUFPLFdBQVUsVUFBUyxXQUFVLFVBQVMsTUFBSyxRQUFPLGlCQUFnQixVQUFTLFlBQVcsVUFBUyxRQUFPLGFBQWUsUUFBTyxVQUFTLFNBQVEsUUFBTyxNQUFLLFVBQVMsTUFBSyxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxRQUFPLFVBQVMsY0FBYSxVQUFTLGVBQWMsVUFBUyxZQUFXLFVBQVMsaUJBQWdCLFVBQVMsc0JBQXFCLFVBQVMsaUJBQWdCLFVBQVMsVUFBUyxVQUFTLGVBQWMsVUFBUyxZQUFXLFVBQVMsWUFBVyxVQUFTLFdBQVUsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLFVBQVMsVUFBUyxRQUFPLFVBQVMsV0FBVSxVQUFTLFlBQVcsVUFBUyxZQUFXLFVBQVMsWUFBVyxVQUFTLFFBQU8sVUFBUyxjQUFhLFVBQVMsZ0JBQWUsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxRQUFPLGFBQWUsUUFBTyxhQUFlLE9BQU0sVUFBUyxPQUFNLFVBQVMsVUFBUyxVQUFTLE9BQU0sYUFBZSxPQUFNLGFBQWUsUUFBTyxVQUFTLFFBQU8sYUFBZSxRQUFPLFVBQVMsVUFBUyxVQUFTLFFBQU8sYUFBZSxRQUFPLGFBQWUsZUFBYyxVQUFTLFdBQVUsVUFBUyxTQUFRLEtBQUksV0FBVSxVQUFTLFFBQU8sS0FBSSxRQUFPLEtBQUksU0FBUSxVQUFTLFFBQU8sZ0JBQWUsVUFBUyxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsWUFBVyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsU0FBUSxRQUFPLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsV0FBVSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsV0FBVSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLGFBQVksVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsVUFBUyxLQUFJLFVBQVMsS0FBSSxTQUFRLFVBQVMsV0FBVSxVQUFTLFdBQVUsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFFBQU8sS0FBSSxPQUFNLFVBQVMsT0FBTSxVQUFTLFFBQU8sVUFBUyxXQUFVLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxRQUFPLFVBQVMsTUFBSyxVQUFTLFFBQU8sVUFBUyxXQUFVLFVBQVMsWUFBVyxVQUFTLFNBQVEsVUFBUyxRQUFPLFVBQVMsT0FBTSxRQUFPLE9BQU0sUUFBTyxrQkFBaUIsVUFBUyxzQkFBcUIsVUFBUyx3QkFBdUIsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLE9BQU0sYUFBZSxPQUFNLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsUUFBTyxVQUFTLHFCQUFvQixVQUFTLGNBQWEsVUFBUyxjQUFhLFVBQVMsY0FBYSxVQUFTLGlCQUFnQixVQUFTLHVCQUFzQixVQUFTLGtCQUFpQixVQUFTLGdCQUFlLFVBQVMsc0JBQXFCLFVBQVMsc0JBQXFCLFVBQVMsbUJBQWtCLFVBQVMsc0JBQXFCLFVBQVMsY0FBYSxVQUFTLG9CQUFtQixVQUFTLGtCQUFpQixVQUFTLG1CQUFrQixVQUFTLHFCQUFvQixVQUFTLG9CQUFtQixVQUFTLG1CQUFrQixVQUFTLFlBQVcsVUFBUyxpQkFBZ0IsVUFBUyxrQkFBaUIsVUFBUyxtQkFBa0IsVUFBUyxpQkFBZ0IsVUFBUyxvQkFBbUIsVUFBUyxzQkFBcUIsVUFBUyxxQkFBb0IsVUFBUyxvQkFBbUIsVUFBUyxpQkFBZ0IsVUFBUyxvQkFBbUIsVUFBUyxlQUFjLFVBQVMsa0JBQWlCLFVBQVMsUUFBTyxVQUFTLGdCQUFlLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxPQUFNLFVBQVMsVUFBUyxVQUFTLGNBQWEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFFBQU8sYUFBZSxRQUFPLFVBQVMsVUFBUyxVQUFTLFdBQVUsVUFBUyxnQkFBZSxVQUFTLFFBQU8sS0FBSSxVQUFTLFVBQVMsWUFBVyxVQUFTLFNBQVEsVUFBUyxlQUFjLFVBQVMsVUFBUyxVQUFTLFFBQU8sYUFBZSxRQUFPLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxRQUFPLEtBQUksU0FBUSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFlBQVcsVUFBUyxlQUFjLFVBQVMsV0FBVSxVQUFTLE1BQUssVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxNQUFLLFVBQVMsTUFBSyxVQUFTLFFBQU8sVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLFVBQVMsVUFBUyxZQUFXLFVBQVMsU0FBUSxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsV0FBVSxVQUFTLFFBQU8sUUFBTyxRQUFPLEtBQUksVUFBUyxVQUFTLFlBQVcsVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLE9BQU0sYUFBZSxPQUFNLGFBQWUsVUFBUyxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsa0JBQWlCLFVBQVMsa0JBQWlCLFVBQVMsWUFBVyxVQUFTLGlCQUFnQixVQUFTLG1CQUFrQixVQUFTLGdCQUFlLFVBQVMsT0FBTSxRQUFPLFNBQVEsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxPQUFNLFVBQVMsVUFBUyxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxXQUFVLFVBQVMsV0FBVSxVQUFTLFNBQVEsVUFBUyxlQUFjLFVBQVMsaUJBQWdCLFVBQVMsVUFBUyxVQUFTLFlBQVcsVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLE9BQU0sVUFBUyxRQUFPLFVBQVMsU0FBUSxnQkFBZSxVQUFTLFVBQVMsVUFBUyxVQUFTLE9BQU0sS0FBSSxRQUFPLFVBQVMsVUFBUyxVQUFTLFFBQU8sYUFBZSxRQUFPLGFBQWUsVUFBUyxVQUFTLGFBQVksVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFVBQVMsZ0JBQWUsU0FBUSxVQUFTLFVBQVMsZ0JBQWUsUUFBTyxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsWUFBVyxVQUFTLGNBQWEsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFlBQVcsVUFBUyxjQUFhLFVBQVMsT0FBTSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsc0JBQXFCLFVBQVMsZ0JBQWUsVUFBUyxxQkFBb0IsVUFBUyxrQkFBaUIsVUFBUyx1QkFBc0IsVUFBUyxlQUFjLFVBQVMsVUFBUyxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsUUFBTyxhQUFlLFFBQU8sYUFBZSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxtQkFBa0IsVUFBUyxlQUFjLFVBQVMsU0FBUSxRQUFPLE9BQU0sVUFBUyxPQUFNLFVBQVMsVUFBUyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsV0FBVSxVQUFTLFdBQVUsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFdBQVUsVUFBUyxXQUFVLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxZQUFXLFVBQVMsYUFBWSxVQUFTLGVBQWMsVUFBUyxhQUFZLFVBQVMsY0FBYSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFFBQU8sVUFBUyxjQUFhLFVBQVMsZUFBYyxVQUFTLFlBQVcsVUFBUyxpQkFBZ0IsVUFBUyxzQkFBcUIsVUFBUyxpQkFBZ0IsVUFBUyxVQUFTLFVBQVMsZUFBYyxVQUFTLFlBQVcsVUFBUyxZQUFXLFVBQVMsV0FBVSxVQUFTLFlBQVcsVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLFFBQU8sVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLFFBQU8sUUFBTyxRQUFPLFFBQU8sUUFBTyxRQUFPLFVBQVMsVUFBUyxXQUFVLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxXQUFVLFVBQVMsWUFBVyxVQUFTLGlCQUFnQixVQUFTLFdBQVUsVUFBUyxXQUFVLFVBQVMsV0FBVSxVQUFTLFdBQVUsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFdBQVUsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFlBQVcsVUFBUyxhQUFZLFVBQVMsYUFBWSxVQUFTLGNBQWEsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxXQUFVLFVBQVMsVUFBUyxVQUFTLFNBQVEsUUFBTyxPQUFNLEtBQUssVUFBUyxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsUUFBTyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLFFBQU8sVUFBUyxVQUFTLFVBQVMsT0FBTSxhQUFlLE9BQU0sYUFBZSxVQUFTLFVBQVMsYUFBWSxVQUFTLGFBQVksVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFlBQVcsVUFBUyxVQUFTLFVBQVMsZUFBYyxVQUFTLFlBQVcsVUFBUyxjQUFhLGdCQUFlLFVBQVMsVUFBUyxhQUFZLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxTQUFRLFFBQU8sU0FBUSxRQUFPLFNBQVEsVUFBUyxTQUFRLFVBQVMsY0FBYSxVQUFTLGtCQUFpQixVQUFTLGNBQWEsVUFBUyxTQUFRLFFBQU8sVUFBUyxVQUFTLFlBQVcsVUFBUyxVQUFTLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxPQUFNLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxRQUFPLGFBQWUsUUFBTyxhQUFlLFdBQVUsVUFBUyxRQUFPLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsWUFBVyxVQUFTLGdCQUFlLFVBQVMsZ0JBQWUsVUFBUyxrQkFBaUIsVUFBUyxhQUFZLFVBQVMsaUJBQWdCLFVBQVMsbUJBQWtCLFVBQVMsVUFBUyxVQUFTLFFBQU8sVUFBUyxZQUFXLFVBQVMsYUFBWSxVQUFTLFdBQVUsVUFBUyxTQUFRLFVBQVMsV0FBVSxVQUFTLFlBQVcsVUFBUyxRQUFPLGFBQWUsUUFBTyxhQUFlLFFBQU8sVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxvQkFBbUIsVUFBUyxxQkFBb0IsVUFBUyxVQUFTLFFBQU8sVUFBUyxRQUFPLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFlBQVcsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsU0FBUSxRQUFPLFNBQVEsUUFBTyxPQUFNLFVBQVMsT0FBTSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsT0FBTSxhQUFlLE9BQU0sYUFBZSxVQUFTLFFBQU8sVUFBUyxRQUFPLFFBQU8sVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsWUFBVyxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxPQUFNLFFBQU8sWUFBVyxLQUFJLGNBQWEsVUFBUyxnQkFBZSxVQUFTLG9CQUFtQixVQUFTLFNBQVEsVUFBUyxhQUFZLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxRQUFPLGFBQWUsUUFBTyxhQUFlLFdBQVUsVUFBUyxXQUFVLFVBQVMsV0FBVSxVQUFTLGNBQWEsVUFBUyxvQkFBbUIsVUFBUyxlQUFjLFVBQVMsZUFBYyxVQUFTLGVBQWMsVUFBUyxpQkFBZ0IsVUFBUyxpQkFBZ0IsVUFBUyxrQkFBaUIsVUFBUyxTQUFRLFVBQVMsa0JBQWlCLFVBQVMsbUJBQWtCLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsV0FBVSxVQUFTLFdBQVUsVUFBUyxTQUFRLFVBQVMsY0FBYSxVQUFTLGNBQWEsVUFBUyxVQUFTLFVBQVMsWUFBVyxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxRQUFPLGFBQWUsUUFBTyxhQUFlLFNBQVEsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFFBQU8sUUFBTyxRQUFPLFFBQU8sV0FBVSxVQUFTLFVBQVMsVUFBUyxjQUFhLFVBQVMsWUFBVyxVQUFTLGNBQWEsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLGFBQVksVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFVBQVMsVUFBUyxZQUFXLFVBQVMsZ0JBQWUsZ0JBQWUsaUJBQWdCLGdCQUFlLGdCQUFlLGdCQUFlLGlCQUFnQixnQkFBZSxZQUFXLFVBQVMsbUJBQWtCLFVBQVMsb0JBQW1CLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsVUFBUyxLQUFJLFVBQVMsVUFBUyxRQUFPLEtBQUksUUFBTyxVQUFTLGVBQWMsVUFBUyxnQkFBZSxLQUFJLHFCQUFvQixVQUFTLGlCQUFnQixVQUFTLGlCQUFnQixVQUFTLE9BQU0sYUFBZSxPQUFNLGFBQWUsU0FBUSxVQUFTLFNBQVEsZ0JBQWUsU0FBUSxnQkFBZSxRQUFPLGFBQWUsUUFBTyxhQUFlLFNBQVEsVUFBUyxTQUFRLFVBQVMsUUFBTyxhQUFlLFFBQU8sYUFBZSxVQUFTLGdCQUFlLFVBQVMsZ0JBQWUsVUFBUyxnQkFBZSxVQUFTLGdCQUFlLFVBQVMsVUFBUyxXQUFVLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLE9BQU0sYUFBZSxPQUFNLGFBQWUsUUFBTyxhQUFlLFFBQU8sYUFBZSxNQUFLLFVBQVMsTUFBSyxVQUFTLFVBQVMsVUFBUyxRQUFPLGFBQWUsUUFBTyxhQUFlLFFBQU8sVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxPQUFNLGFBQWUsT0FBTSxhQUFlLFNBQVEsVUFBUyxTQUFRLFVBQVMsTUFBSyxVQUFTLE1BQUssVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFFBQU8sYUFBZSxRQUFPLGFBQWUsVUFBUyxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFFBQU8sYUFBZSxRQUFPLGFBQWUsVUFBUyxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLFVBQVMsVUFBUyxVQUFTLFFBQU8sVUFBUyxRQUFPLFFBQU8sVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLE9BQU0sUUFBTyxPQUFNLGFBQWUsT0FBTSxhQUFlLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxhQUFlLFFBQU8sYUFBZSxRQUFPLGFBQWUsUUFBTyxhQUFlLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxRQUFPLFFBQU8sVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFVBQVMsVUFBUyxrQkFBaUIsVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLE9BQU0sYUFBZSxPQUFNLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxXQUFVLFVBQVMsUUFBTyxhQUFlLFFBQU8sVUFBUyxRQUFPLGFBQWUsUUFBTyxhQUFlLE9BQU0sVUFBUyxRQUFPLFNBQVE7QUFDcDl1QyxjQUFJLGtCQUFrQixFQUFDLFVBQVMsUUFBTyxVQUFTLFFBQU8sU0FBUSxRQUFPLFNBQVEsUUFBTyxTQUFRLFFBQU8sU0FBUSxRQUFPLFNBQVEsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLE9BQU0sS0FBSSxPQUFNLEtBQUksU0FBUSxRQUFPLFNBQVEsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFFBQU8sUUFBTyxRQUFPLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sU0FBUSxRQUFPLFFBQU8sUUFBTyxRQUFPLFFBQU8sUUFBTyxRQUFPLFVBQVMsUUFBTyxPQUFNLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sU0FBUSxRQUFPLFNBQVEsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLE9BQU0sUUFBTyxPQUFNLFFBQU8sUUFBTyxRQUFPLFFBQU8sUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxNQUFLLEtBQUksTUFBSyxLQUFJLFVBQVMsUUFBTyxVQUFTLFFBQU8sU0FBUSxRQUFPLFNBQVEsUUFBTyxTQUFRLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sUUFBTyxRQUFPLFFBQU8sUUFBTyxTQUFRLFFBQU8sTUFBSyxLQUFJLE1BQUssS0FBSSxRQUFPLFFBQU8sU0FBUSxRQUFPLFVBQVMsUUFBTyxRQUFPLFFBQU8sT0FBTSxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxTQUFRLFFBQU8sU0FBUSxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sUUFBTyxRQUFPLFFBQU8sUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sUUFBTyxRQUFPLFFBQU8sUUFBTyxRQUFPLFFBQU8sVUFBUyxRQUFPLFNBQVEsUUFBTyxRQUFPLEtBQUksUUFBTyxLQUFJLFNBQVEsUUFBTyxPQUFNLFFBQU8sT0FBTSxRQUFPLFFBQU8sUUFBTyxPQUFNLFFBQU8sUUFBTyxRQUFPLFFBQU8sUUFBTyxRQUFPLFFBQU8sU0FBUSxRQUFPLFNBQVEsUUFBTyxTQUFRLFFBQU8sU0FBUSxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sU0FBUSxRQUFPLFNBQVEsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLE9BQU0sUUFBTyxRQUFPLFFBQU8sUUFBTyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sT0FBTSxRQUFPLFFBQU8sT0FBTTtBQUNsaUQsY0FBSSxtQkFBbUIsRUFBQyxLQUFJLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxPQUFNLFNBQVE7QUFDemIsY0FBSSw2QkFBNkIsQ0FBQyxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsSUFBRyxJQUFHLElBQUcsSUFBRyxJQUFHLElBQUcsSUFBRyxJQUFHLElBQUcsSUFBRyxJQUFHLElBQUcsSUFBRyxJQUFHLElBQUcsSUFBRyxJQUFHLElBQUcsSUFBRyxJQUFHLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLE9BQU0sT0FBTSxPQUFNLE9BQU0sT0FBTSxPQUFNLE9BQU0sT0FBTSxPQUFNLE9BQU0sT0FBTSxPQUFNLE9BQU0sT0FBTSxPQUFNLE9BQU0sT0FBTSxPQUFNLE9BQU0sT0FBTSxPQUFNLE9BQU0sT0FBTSxPQUFNLE1BQU0sT0FBTSxPQUFNLE9BQU0sT0FBTSxPQUFNLE9BQU0sT0FBTSxPQUFNLE9BQU0sUUFBTyxR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Y0FBYztBQUFBLFVBQ2QsUUFBUTtBQUFBLFVBQ1IsYUFBYTtBQUFBLFVBQ2IseUJBQXlCO0FBQUEsVUFDekIsTUFBTTtBQUFBLFVBQ04sVUFBVTtBQUFBLFVBQ1YsU0FBUztBQUFBLFVBQ1QsZ0JBQWdCO0FBQUEsVUFDaEIsY0FBYztBQUFBLFVBQ2QsT0FBTztBQUFBLFVBQ1AsS0FBSztBQUFBLFVBQ0wsVUFBVTtBQUFBLFVBQ1YseUJBQXlCO0FBQUEsVUFDekIsdUJBQXVCO0FBQUEsVUFDdkIsVUFBVTtBQUFBLFVBQ1YsV0FBVztBQUFBLFVBQ1gsU0FBUztBQUFBLFVBQ1QsY0FBYztBQUFBLFVBQ2QsS0FBSztBQUFBLFVBQ0wsTUFBTTtBQUFBLFVBQ04sWUFBWTtBQUFBLFVBQ1osWUFBWTtBQUFBLFVBQ1osYUFBYTtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsWUFBWTtBQUFBLFVBQ1osYUFBYTtBQUFBLFVBQ2IsU0FBUztBQUFBLFVBQ1QsUUFBUTtBQUFBLFVBQ1IsUUFBUTtBQUFBLFVBQ1IsTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFVBQ04sVUFBVTtBQUFBLFVBQ1YsU0FBUztBQUFBLFVBQ1QsV0FBVztBQUFBLFVBQ1gsY0FBYztBQUFBLFVBQ2QsTUFBTTtBQUFBLFVBQ04sSUFBSTtBQUFBLFVBQ0osWUFBWTtBQUFBLFVBQ1osYUFBYTtBQUFBLFVBQ2IsV0FBVztBQUFBLFVBQ1gsV0FBVztBQUFBLFVBQ1gsV0FBVztBQUFBLFVBQ1gsSUFBSTtBQUFBLFVBQ0osUUFBUTtBQUFBLFVBQ1IsVUFBVTtBQUFBLFVBQ1YsU0FBUztBQUFBLFVBQ1QsV0FBVztBQUFBLFVBQ1gsVUFBVTtBQUFBLFVBQ1YsV0FBVztBQUFBLFVBQ1gsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFVBQ04sT0FBTztBQUFBLFVBQ1AsTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFVBQ04sS0FBSztBQUFBLFVBQ0wsVUFBVTtBQUFBLFVBQ1YsYUFBYTtBQUFBLFVBQ2IsY0FBYztBQUFBLFVBQ2QsS0FBSztBQUFBLFVBQ0wsV0FBVztBQUFBLFVBQ1gsT0FBTztBQUFBLFVBQ1AsWUFBWTtBQUFBLFVBQ1osUUFBUTtBQUFBLFVBQ1IsS0FBSztBQUFBLFVBQ0wsV0FBVztBQUFBLFVBQ1gsVUFBVTtBQUFBLFVBQ1YsT0FBTztBQUFBLFVBQ1AsTUFBTTtBQUFBLFVBQ04sVUFBVTtBQUFBLFVBQ1YsT0FBTztBQUFBLFVBQ1AsWUFBWTtBQUFBLFVBQ1osTUFBTTtBQUFBLFVBQ04sU0FBUztBQUFBLFVBQ1QsU0FBUztBQUFBLFVBQ1QsYUFBYTtBQUFBLFVBQ2IsYUFBYTtBQUFBLFVBQ2IsUUFBUTtBQUFBLFVBQ1IsU0FBUztBQUFBLFVBQ1QsU0FBUztBQUFBLFVBQ1QsWUFBWTtBQUFBLFVBQ1osVUFBVTtBQUFBLFVBQ1YsZ0JBQWdCO0FBQUEsVUFDaEIsS0FBSztBQUFBLFVBQ0wsVUFBVTtBQUFBLFVBQ1YsVUFBVTtBQUFBLFVBQ1YsTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFVBQ04sU0FBUztBQUFBLFVBQ1QsU0FBUztBQUFBLFVBQ1QsT0FBTztBQUFBLFVBQ1AsUUFBUTtBQUFBLFVBQ1IsV0FBVztBQUFBLFVBQ1gsVUFBVTtBQUFBLFVBQ1YsVUFBVTtBQUFBLFVBQ1YsT0FBTztBQUFBLFVBQ1AsTUFBTTtBQUFBLFVBQ04sT0FBTztBQUFBLFVBQ1AsTUFBTTtBQUFBLFVBQ04sWUFBWTtBQUFBLFVBQ1osS0FBSztBQUFBLFVBQ0wsUUFBUTtBQUFBLFVBQ1IsU0FBUztBQUFBLFVBQ1QsUUFBUTtBQUFBLFVBQ1IsT0FBTztBQUFBLFVBQ1AsTUFBTTtBQUFBLFVBQ04sT0FBTztBQUFBLFVBQ1AsU0FBUztBQUFBLFVBQ1QsVUFBVTtBQUFBLFVBQ1YsUUFBUTtBQUFBLFVBQ1IsT0FBTztBQUFBLFVBQ1AsTUFBTTtBQUFBLFVBQ04sUUFBUTtBQUFBLFVBQ1IsT0FBTztBQUFBLFVBQ1AsT0FBTztBQUFBLFVBQ1AsT0FBTztBQUFBLFVBQ1AsTUFBTTtBQUFBO0FBQUEsVUFFTixPQUFPO0FBQUEsVUFDUCxjQUFjO0FB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Q0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBO0FBQUE7QUFBQSxZQUdMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQTtBQUFBO0FBQUEsWUFHTCxLQUFLO0FBQUEsWUFDTCxLQUFLO0FBQUE7QUFBQTtBQUFBLFlBR0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUNILHFCQUFPO0FBQUEsWUFFVCxLQUFLO0FBQUEsWUFDTCxLQUFLO0FBQUEsWUFDTCxLQUFLO0FBQUEsWUFDTCxLQUFLO0FBQUEsWUFDTCxLQUFLO0FBQUEsWUFDTCxLQUFLO0FBQUEsWUFDTCxLQUFLO0FBQUEsWUFDTCxLQUFLO0FBQUEsWUFDTCxLQUFLO0FBQUEsWUFDTCxLQUFLO0FBQUEsWUFDTCxLQUFLO0FBQUEsWUFDTCxLQUFLO0FBQUEsWUFDTCxLQUFLO0FBQUEsWUFDTCxLQUFLO0FBQUEsWUFDTCxLQUFLO0FBQUE7QUFBQTtBQUFBLFlBR0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztB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QkFBbUIsR0FBRyxLQUFLO0FBQUEsSUFDM0MsT0FBTztBQUNMLG9CQUFjO0FBQUEsSUFDaEI7QUFBQSxFQUNGO0FBQ0Y7QUFvQkEsSUFBTSxtQkFBbUIsV0FBUztBQUNoQyxRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0EsS0FBSztBQUFBLElBQ0w7QUFBQSxJQUNBLE9BQUFDO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBLFFBQUFDO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EsZUFBZTtBQUFBLElBQ2Y7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EsV0FBQUM7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQSxPQUFBQztBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EsUUFBUTtBQUFBLElBQ1I7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EsUUFBQUM7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EsU0FBUztBQUFBLElBQ1Q7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElB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QUFZO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtaLE9BQU87QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlQLE9BQU87QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlQLE1BQU07QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlOLEtBQUs7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlMLE9BQU87QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlQLFdBQVc7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlYLEtBQUs7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlMLE9BQU87QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlQLFNBQVM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS1QsV0FBVztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLWCxLQUFLO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtMLE1BQU07QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS04sTUFBTTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTixJQUFJO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtKLE9BQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS1AsTUFBTTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTixjQUFjO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJZCxRQUFRO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtSLFFBQVE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS1IsTUFBTTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSU4sS0FBSztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUwsS0FBSztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUwsT0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVAsTUFBTTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSU4sTUFBTTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSU4sS0FBSztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUwsT0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVAsT0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVAsTUFBTTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSU4sZUFBZTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLZixHQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJSCxHQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJSCxHQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJSCxHQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJSCxHQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJSCxHQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJSCxHQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJSCxHQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJSCxHQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJSCxHQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJSCxHQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJSCxHQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJSCxHQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJSCxHQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJSCxHQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJSCxHQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJSCxHQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJSCxHQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJSCxHQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJSCxHQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJSCxHQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJSCxHQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJSCxHQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJSCxHQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJSCxHQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJSCxHQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJSCxNQUFNO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtOLGVBQWU7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlmLGNBQWM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlkLFVBQVU7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlWLFNBQVM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlULFNBQVM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlULFdBQVc7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlYLFVBQVU7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlWLFVBQVU7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlWLFNBQVM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlULFdBQVc7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlYLFdBQVc7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlYLFVBQVU7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlWLGNBQWM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlkLFVBQVU7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlWLFdBQVc7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlYLFlBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlaLGNBQWM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlkLElBQUk7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlKLElBQUk7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlKLElBQUk7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlKLElBQUk7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlKLElBQUk7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlKLElBQUk7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlKLElBQUk7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlKLElBQUk7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlKLElBQUk7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlKLEtBQUs7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlMLEtBQUs7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlMLEtBQUs7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlMLFNBQVM7QUFBQTtBQUFBO0FBQUE7QUFBQSxF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VSxRQUFRO0FBQUEsTUFDNUIsU0FBUyxHQUFRO0FBQ2hCLG1CQUFXLEtBQUssRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDO0FBQUEsTUFDMUM7QUFBQSxJQUNEO0FBQUEsRUFDRCxDQUFDO0FBQ0Y7QUFFQSxJQUFJLGFBQXVCLENBQUM7Q0FDekIsaUJBQWtCO0FBRXBCLE1BQUksT0FBTyxhQUFhLFlBQWE7QUFFckMsTUFBSTtBQUNILFVBQU1LLE9BQU8sT0FBZSxVQUFVLEtBQUs7QUFDM0MsVUFBTUMsT0FBTyxPQUFlLFVBQVUsSUFBSTtBQUMxQyxVQUFNQyxPQUFPLE9BQWUsVUFBVSxLQUFLO0FBQzNDLFFBQUksQ0FBQ0YsUUFBTyxDQUFDRSxRQUFPLENBQUNELEtBQUssT0FBTSxJQUFJLE1BQU0sdURBQXVEO0FBQ2pHLFVBQU0sZ0JBQWdCO0FBQ3RCLFVBQU0sTUFBTUQsTUFBS0UsTUFBS0QsSUFBRztBQUd6QixXQUFPLG1CQUFtQixFQUFFLEtBQUssQ0FBQ0UsWUFBVztBQUU1QyxNQUFBQSxRQUFPLFFBQVEsTUFBTTtBQUFBLElBQ3RCLENBQUM7QUFBQSxFQUVGLFNBQVMsR0FBUTtBQUNoQixlQUFXLEtBQUssRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDO0FBQUEsRUFDMUM7QUFFQSxRQUFNLElBQUksUUFBUSxDQUFDLFlBQVksV0FBVyxTQUFTLEdBQUksQ0FBQztBQUN4RCxNQUFJLFdBQVcsUUFBUTtBQUN0QixZQUFRLE1BQU0sV0FBVyxDQUFDLENBQUM7QUFDM0IsVUFBTSwyQkFBMkIsV0FBVyxLQUFLLElBQUksQ0FBQztBQUFBLEVBQ3ZEO0FBQ0QsR0FBRzsiLAogICJuYW1lcyI6IFsiZ2xvYmFsJDEiLCAiZ2xvYmFsIiwgImRlZmF1bHRTZXRUaW1vdXQiLCAiZGVmYXVsdENsZWFyVGltZW91dCIsICJjYWNoZWRTZXRUaW1lb3V0IiwgImNhY2hlZENsZWFyVGltZW91dCIsICJydW5UaW1lb3V0IiwgImUiLCAicnVuQ2xlYXJUaW1lb3V0IiwgInF1ZXVlIiwgImRyYWluaW5nIiwgImN1cnJlbnRRdWV1ZSIsICJxdWV1ZUluZGV4IiwgImNsZWFuVXBOZXh0VGljayIsICJkcmFpblF1ZXVlIiwgInRpbWVvdXQiLCAibmV4dFRpY2siLCAiSXRlbSIsICJhcnJheSIsICJ0aXRsZSIsICJwbGF0Zm9ybSIsICJicm93c2VyIiwgImVudiIsICJhcmd2IiwgInZlcnNpb24iLCAidmVyc2lvbnMiLCAicmVsZWFzZSIsICJjb25maWciLCAibm9vcCIsICJvbiIsICJhZGRMaXN0ZW5lciIsICJvbmNlIiwgIm9mZiIsICJyZW1vdmVMaXN0ZW5lciIsICJyZW1vdmVBbGxMaXN0ZW5lcnMiLCAiZW1pdCIsICJiaW5kaW5nIiwgIm5hbWUiLCAiY3dkIiwgImNoZGlyIiwgInVtYXNrIiwgInBlcmZvcm1hbmNlIiwgInBlcmZvcm1hbmNlTm93IiwgImhydGltZSIsICJzdGFydFRpbWUiLCAidXB0aW1lIiwgInByb2Nlc3MiLCAicmVxdWlyZSQkMCIsICJpbmhlcml0cyIsICJyZXF1aXJlJCQxIiwgInByb2Nlc3MubmV4dFRpY2siLCAicGFyc2VRdWVyeSIsICJoaWdobGlnaHRUYWdzIiwgInN0cmluZyIsICJleHBvcnRzIiwgImRpZmYiLCAic2VsZiIsICJkb25lIiwgInZhbHVlIiwgImpvaW4iLCAiY2hhcnMiLCAiY2hhcmFjdGVyIiwgIl9iYXNlIiwgIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCAiX3BhcmFtcyIsICJsaW5lIiwgImpzb24iLCAiX2xpbmUiLCAiX3R5cGVvZiIsICJvYmoiLCAidiIsICJwYXJzZSIsICJsaXN0IiwgImluZGV4IiwgImFwcGx5UGF0Y2giLCAiX3BhcnNlIiwgIm9wZXJhdGlvbiIsICJvZmZzZXQiLCAiaHVuayIsICJ0b1BvcyIsICJqIiwgImNvbnRlbnQiLCAiZGVsaW1pdGVyIiwgImVyciIsICJfdG9Db25zdW1hYmxlQXJyYXkiLCAiX2FycmF5V2l0aG91dEhvbGVzIiwgIl9pdGVyYWJsZVRvQXJyYXkiLCAiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwgIl9ub25JdGVyYWJsZVNwcmVhZCIsICJfYXJyYXlMaWtlVG9BcnJheSIsICJfbG9vcCIsICJpIiwgInByZXYiLCAibWVyZ2VfMSIsICJtZXJnZSIsICJyZXF1aXJlJCQyIiwgImJhc2UiLCAidGVzdCIsICJzd2FwIiwgIm1hdGNoIiwgIm93bktleXMiLCAib2JqZWN0IiwgImtleXMiLCAiX2RlZmluZVByb3BlcnR5IiwgInN0cnVjdHVyZWRQYXRjaCIsICJzIiwgImdldCIsICJfYXJyYXkiLCAiX2NyZWF0ZSIsICJyZXF1aXJlJCQzIiwgInJlcXVpcmUkJDQiLCAicmVxdWlyZSQkNSIsICJyZXF1aXJlJCQ2IiwgInJlcXVpcmUkJDciLCAicmVxdWlyZSQkOCIsICJyZXF1aXJlJCQ5IiwgInJlcXVpcmUkJDEwIiwgInJlcXVpcmUkJDExIiwgInJlcXVpcmUkJDEyIiwgInJlcXVpcmUkJDEzIiwgInJlcXVpcmUkJDE0IiwgIm0iLCAiaCIsICJkIiwgInciLCAieSIsICJtcyIsICJ0eXBlIiwgImZtdExvbmciLCAiZm10U2hvcnQiLCAicGx1cmFsIiwgImxvb2t1cCIsICJwYXJ0cyIsICJ0b1N0cmluZyIsICJCdWZmZXIiLCAibGVuZ3RoIiwgImZyb20iLCAiYWxsb2MiLCAiYnl0ZUxlbmd0aCIsICJjb21wYXJlIiwgImluc3BlY3QiLCAicmVhZCIsICJpbmNsdWRlcyIsICJpbmRleE9mIiwgIndyaXRlIiwgImJhc2U2NC5mcm9tQnl0ZUFycmF5IiwgInNsaWNlIiwgImllZWU3NTQucmVhZCIsICJtaW4iLCAiaWVlZTc1NC53cml0ZSIsICJiYXNlNjQudG9CeXRlQXJyYXkiLCAibW9kdWxlIiwgImhhc093blByb3BlcnR5IiwgImNvbnRhaW5zIiwgImtleSIsICJlbmNvZGUiLCAiZGVjb2RlIiwgImh0bWwiLCAibmV4dCIsICJoZSIsICJ0aGlzIiwgIk1PQ0hBX0lEX1BST1BfTkFNRSIsICJyZSIsICJjYW5vbmljYWxUeXBlIiwgIkJ1ZmZlci5pc0J1ZmZlciIsICJjaGFyIiwgImNhbm9uaWNhbGl6ZSIsICJyYW5nZSIsICJpc0Jyb3dzZXIiLCAicHJvY2Vzcy5icm93c2VyIiwgIlBlbmRpbmciLCAiZGVidWciLCAiZm9ybWF0IiwgInJlZ2V4cCIsICJjb21tb24iLCAid2FybmVkIiwgImNvbnN0YW50cyIsICJwYXR0ZXJuIiwgInJlcG9ydGVyIiwgInVpIiwgImNyZWF0ZVVuc3VwcG9ydGVkRXJyb3IiLCAiY3JlYXRlTWlzc2luZ0FyZ3VtZW50RXJyb3IiLCAiY3JlYXRlSW52YWxpZEFyZ3VtZW50VHlwZUVycm9yIiwgImNyZWF0ZUludmFsaWRFeGNlcHRpb25FcnJvciIsICJjcmVhdGVGYXRhbEVycm9yIiwgImNyZWF0ZU11bHRpcGxlRG9uZUVycm9yIiwgInJ1bm5hYmxlIiwgImNyZWF0ZUZvcmJpZGRlbkV4Y2x1c2l2aXR5RXJyb3IiLCAibW9jaGEiLCAiY3JlYXRlVGltZW91dEVycm9yIiwgImlzTW9jaGFFcnJvciIsICJlcnJvcnMiLCAiRXZlbnRFbWl0dGVyIiwgInV0aWxzIiwgIkRhdGUiLCAic2V0VGltZW91dCIsICJjbGVhclRpbWVvdXQiLCAiUnVubmFibGUiLCAiZ2xvYmFscyIsICJmbiIsICJzZXJpYWxpemUiLCAiSG9vayIsICJpc1N0cmluZyIsICJtaWxsaXNlY29uZHMiLCAiU3VpdGUiLCAic3VpdGUiLCAiQ29udGV4dCIsICJob29rIiwgInN0cmluZ2lmeSIsICJpZ25vcmUiLCAiZXJyU3VpdGUiLCAicHJlcGFyZSIsICJyZXNvbHZlIiwgIm9rIiwgIkVWRU5UX1RFU1RfUEFTUyIsICJFVkVOVF9URVNUX0ZBSUwiLCAicnVubmVyIiwgInBhZCIsICJzdHIiLCAiRVZFTlRfUlVOX0JFR0lOIiwgIkVWRU5UX1RFU1RfUEVORElORyIsICJFVkVOVF9SVU5fRU5EIiwgIkRvdCIsICJFVkVOVF9TVUlURV9CRUdJTiIsICJFVkVOVF9URVNUX0VORCIsICJwZW5kaW5nIiwgImNhY2hlIiwgInVybCIsICJMaXN0IiwgIlNUQVRFX0ZBSUxFRCIsICJ0YWciLCAibGV2ZWwiLCAiYnVmIiwgIlByb2dyZXNzIiwgIlRlc3QiLCAiY29udGV4dCIsICJjcmVhdGUiLCAiRVZFTlRfRklMRV9QUkVfUkVRVUlSRSIsICJiZGRNb2R1bGUiLCAiYmRkIiwgInRkZE1vZHVsZSIsICJ0ZGQiLCAicXVuaXRNb2R1bGUiLCAicXVuaXQiLCAiZXhwb3J0c01vZHVsZSIsICJjcmVhdGVTdGF0c0NvbGxlY3RvciIsICJjcmVhdGVJbnZhbGlkUmVwb3J0ZXJFcnJvciIsICJjcmVhdGVJbnZhbGlkSW50ZXJmYWNlRXJyb3IiLCAiY3JlYXRlTW9jaGFJbnN0YW5jZUFscmVhZHlEaXNwb3NlZEVycm9yIiwgImNyZWF0ZU1vY2hhSW5zdGFuY2VBbHJlYWR5UnVubmluZ0Vycm9yIiwgIk1vY2hhIiwgInJlcXVpcmUkJDE1IiwgInJlcXVpcmUiLCAicmVxdWlyZSQkMTYiLCAiZG9jdW1lbnQiLCAibW9kdWxlIiwgIlJFQUNUX0ZSQUdNRU5UX1RZUEUiLCAiZm9ybWF0IiwgIlJlYWN0RGVidWdDdXJyZW50RnJhbWUiLCAiYXNzaWduIiwgIkNvbXBvbmVudCIsICJ2YWx1ZSIsICJ0eXBlIiwgImhhc093blByb3BlcnR5IiwgInNlbGYiLCAiY3JlYXRlRWxlbWVudCIsICJkZWZhdWx0UHJvcHMiLCAiY2xvbmVFbGVtZW50IiwgImlzVmFsaWRFbGVtZW50IiwgIm9iamVjdCIsICJTRVBBUkFUT1IiLCAibWF0Y2giLCAiaW5kZXgiLCAiYXJyYXkiLCAidG9BcnJheSIsICJjcmVhdGVDb250ZXh0IiwgIm1vZHVsZU9iamVjdCIsICJlcnJvciIsICJmb3J3YXJkUmVmIiwgInJlbmRlciIsICJtZW1vIiwgImNvbXBhcmUiLCAidXNlQ29udGV4dCIsICJDb250ZXh0IiwgInVzZVN0YXRlIiwgInVzZVJlZHVjZXIiLCAidXNlUmVmIiwgInVzZUVmZmVjdCIsICJ1c2VJbnNlcnRpb25FZmZlY3QiLCAidXNlTGF5b3V0RWZmZWN0IiwgInVzZUNhbGxiYWNrIiwgInVzZU1lbW8iLCAidXNlSW1wZXJhdGl2ZUhhbmRsZSIsICJ1c2VJZCIsICJsb2NhdGlvbiIsICJub2RlIiwgImtleXMiLCAicmV0dXJuVmFsdWUiLCAiQ2hpbGRyZW4iLCAibW9kdWxlIiwgIm5vZGUiLCAiaW5kZXgiLCAicGVlayIsICJjb21wYXJlIiwgImxlbmd0aCIsICJpbml0aWFsVGltZSIsICJzdGFydFRpbWUiLCAibW9kdWxlIiwgIlJlYWN0IiwgImZvcm1hdCIsICJSZWFjdERlYnVnQ3VycmVudEZyYW1lIiwgIkZyYWdtZW50IiwgIkZvcndhcmRSZWYiLCAiaGFzT3duUHJvcGVydHkiLCAidmFsdWUiLCAidHlwZSIsICJwcmVmaXgiLCAic2FuaXRpemVVUkwiLCAidG9rZW4iLCAidXJsIiwgIm5vZGUiLCAiUkVBQ1RfRlJBR01FTlRfVFlQRSIsICJhc3NpZ24iLCAibWF0Y2giLCAiQ29tcG9uZW50IiwgIndvcmtJblByb2dyZXNzIiwgInRvU3RyaW5nIiwgImdldCIsICJzZXQiLCAiaXNIeWRyYXRpbmciLCAib3B0aW9ucyIsICJpc0VtcHR5IiwgInN0cmluZyIsICJjaGFyYWN0ZXIiLCAiZGVsaW1pdGVyIiwgInN0eWxlIiwgInJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMiLCAicG9zc2libGVSZWdpc3RyYXRpb25OYW1lcyIsICJlcnJvciIsICJjYWxsQ2FsbGJhY2siLCAiY3VycmVudCIsICJub3ciLCAicm9vdCIsICJpbmRleCIsICJyZW5kZXJMYW5lcyIsICJxdWV1ZWRFdmVudCIsICJub3JtYWxpemUiLCAiY2hhcnMiLCAiZnJvbSIsICJvZmZzZXQiLCAibGVuZ3RoIiwgIm5leHQiLCAicmFuZ2UiLCAibWFrZVByZWZpeE1hcCIsICJwcmVmaXhlcyIsICJ2ZW5kb3JQcmVmaXhlcyIsICJwcmVmaXhlZEV2ZW50TmFtZXMiLCAiZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUiLCAibm9vcCIsICJjcmVhdGVFbGVtZW50IiwgImF0dHJpYnV0ZXMiLCAibG9jYXRpb24iLCAiaGFzIiwgIm51bWJlciIsICJhcnJheSIsICJ1cGRhdGVGcmFnbWVudCIsICJjaGlsZCIsICJyZWNvbmNpbGVDaGlsZEZpYmVycyIsICJ2ZXJzaW9uIiwgImRlZmF1bHRQcm9wcyIsICJlcnJvciQxIiwgInJlbmRlciIsICJjb21wYXJlIiwgInN1YnRyZWVSZW5kZXJMYW5lcyIsICJoYXNDb250ZXh0Q2hhbmdlZCIsICJjb21taXRUaW1lIiwgImZsdXNoU3luYyIsICJzaG91bGRGaXJlQWZ0ZXJBY3RpdmVJbnN0YW5jZUJsdXIiLCAidHlwZXMiLCAiaHlkcmF0ZSIsICJjcmVhdGVQb3J0YWwiLCAia2V5cyIsICJjdXJyZW50SG9vayIsICJSZWFjdEN1cnJlbnREaXNwYXRjaGVyIiwgImNyZWF0ZVJvb3QiLCAiZmluZERPTU5vZGUiLCAidW5tb3VudENvbXBvbmVudEF0Tm9kZSIsICJwcm90b2NvbCIsICJtb2R1bGUiLCAibW9kdWxlIiwgImNsYXNzTmFtZXMiLCAidmFsdWUiLCAiUkVBQ1RfRlJBR01FTlRfVFlQRSIsICJ0eXBlIiwgIm9iamVjdCIsICJFbGVtZW50IiwgIkZvcndhcmRSZWYiLCAiRnJhZ21lbnQiLCAiUG9ydGFsIiwgImlzRnJhZ21lbnQiLCAiaXNNZW1vIiwgIm1vZHVsZSIsICJSZWFjdCIsICJSRUFDVF9GUkFHTUVOVF9UWVBFIiwgImZvcm1hdCIsICJSZWFjdERlYnVnQ3VycmVudEZyYW1lIiwgInR5cGUiLCAiYXNzaWduIiwgIm1hdGNoIiwgIkNvbXBvbmVudCIsICJoYXNPd25Qcm9wZXJ0eSIsICJsb2NhdGlvbiIsICJ2YWx1ZSIsICJzZWxmIiwgImRlZmF1bHRQcm9wcyIsICJpc1ZhbGlkRWxlbWVudCIsICJvYmplY3QiLCAibm9kZSIsICJrZXlzIiwgImpzeCIsICJqc3hzIiwgIm1vZHVsZSIsICJkIiwgImIiLCAia2V5cyIsICJ2YWx1ZSIsICJQYXRjaEVycm9yIiwgImluZGV4IiwgImRvY3VtZW50IiwgImluZGV4IiwgImtleXMiLCAibGVuZ3RoIiwgIk1pcnJvciIsICJPYnNlcnZlckluZm8iLCAidmVyc2lvbiIsICJ2ZXJzaW9uIiwgInZlcnNpb24iLCAidWlkIiwgInZlcnNpb24iLCAiYXBwIiwgInZlcnNpb24iLCAibWF0Y2giLCAibnVtYmVyIiwgImRvY3VtZW50IiwgImxheWVyIiwgInZhbHVlIiwgImFwcCIsICJub2RlIiwgInJlc3VsdCIsICJyZXNvbHZlIiwgInR5cGUiLCAidXJsIiwgInVybCIsICJwYXlsb2FkIiwgInR5cGUiLCAid2l0aE5hdGl2ZUFycmF5QnVmZmVyIiwgInR5cGUiLCAibGVuZ3RoIiwgImlzQmluYXJ5IiwgIm9uIiwgImxlbmd0aCIsICJkZWNvZGUiLCAiX2EiLCAidmFsdWUiLCAiZGVjb2RlIiwgInR5cGUiLCAiY2xlYW51cCIsICJwcm90b2NvbCIsICJwcm90b2NvbCIsICJ3aXRoTmF0aXZlQXJyYXlCdWZmZXIiLCAiaXNWaWV3IiwgIndpdGhOYXRpdmVCbG9iIiwgInByb3RvY29sIiwgIlBhY2tldFR5cGUiLCAidmFsdWUiLCAibmV4dCIsICJ0eXBlIiwgIlJFU0VSVkVEX0VWRU5UUyIsICJTb2NrZXQiLCAic2VsZiIsICJzZWxmIiwgIlNvY2tldCIsICJzb2NrZXQiLCAibG9va3VwIiwgIlNvY2tldCIsICJTb2NrZXQiLCAidXJsIiwgImxvb2t1cCIsICJtaXhpbiIsICJ1cmwiLCAiYXBwIiwgIm5vZGUiLCAibm9kZSIsICJ2YWx1ZSIsICJhcHAiLCAiZ3JhcGgiLCAiY29udmVydGVkIiwgInBhdHRlcm4iLCAidXJsIiwgImFwcCIsICJ2YWx1ZSIsICJub2RlIiwgIm5vZGUiLCAic2VsZiIsICJ2YWx1ZSIsICJkb2N1bWVudCIsICJ0eXBlIiwgImluZGV4IiwgIm5vZGUiLCAibm9kZSIsICJub2RlIiwgImluZGV4IiwgIm5vZGUiLCAiaW5kZXgiLCAibm9kZSIsICJub2RlIiwgImluZGV4IiwgIm5vZGUiLCAiaW5kZXgiLCAiaW1wb3J0X3JlYWN0IiwgImltcG9ydF9yZWFjdCIsICJpbXBvcnRfcmVhY3QiLCAiUmVhY3QiLCAibyIsICJvYmplY3QiLCAidG9BcnJheSIsICJSZWFjdCIsICJwcmVNZXNzYWdlIiwgIm1ldGhvZCIsICJyIiwgImltcG9ydF9yZWFjdCIsICJub2RlIiwgIlJlYWN0IiwgIlJlYWN0RE9NIiwgImltcG9ydF9yZWFjdCIsICJSZWFjdCIsICJnZXRWYWx1ZSIsICJmaWxsUmVmIiwgIm5vZGUiLCAiY29tcG9zZVJlZiIsICJ1c2VDb21wb3NlUmVmIiwgInByZXYiLCAibmV4dCIsICJzdXBwb3J0UmVmIiwgInR5cGUiLCAiZ2V0Tm9kZVJlZiIsICJub2RlIiwgIlJlYWN0IiwgIlJlYWN0IiwgIm9uUmVzaXplIiwgImdldEluZGV4IiwgImluZGV4IiwgInZhbHVlIiwgIlJlc2l6ZU9ic2VydmVyQ29udHJvbGxlciIsICJvYnNlcnZlcnMiLCAicG9zaXRpb24iLCAiUmVzaXplT2JzZXJ2YXRpb24iLCAiUmVzaXplT2JzZXJ2ZXJFbnRyeSIsICJSZXNpemVPYnNlcnZlclNQSSIsICJSZXNpemVPYnNlcnZlciIsICJtZXRob2QiLCAib2JzZXJ2ZSIsICJ1bm9ic2VydmUiLCAidCIsICJlIiwgInQiLCAidCIsICJfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwgIlJlYWN0IiwgIkRvbVdyYXBwZXIiLCAicmVuZGVyIiwgImdldERvbSIsICJvblJlc2l6ZSIsICJvYnNlcnZlIiwgInVub2JzZXJ2ZSIsICJSZXNpemVPYnNlcnZlciIsICJ0b0FycmF5IiwgImluZGV4IiwgInJhZiIsICJjYWYiLCAid3JhcHBlclJhZiIsICJSZWFjdCIsICJyIiwgIm5vZGUiLCAibm9kZSIsICJpbXBvcnRfcmVhY3QiLCAia2V5cyIsICJSZWFjdCIsICJrZXlzIiwgIkVudGl0eSIsICJnZXQiLCAic3R5bGUiLCAiVGhlbWVDYWNoZSIsICJjYWNoZSIsICJkZXJpdmF0aXZlIiwgImdldCIsICJzZXQiLCAidmFsdWUiLCAiaW5kZXgiLCAiVGhlbWUiLCAidG9rZW4iLCAiZGVyaXZhdGl2ZSIsICJ0b2tlbiIsICJ2YWx1ZSIsICJzdHlsZSIsICJfb2JqZWN0U3ByZWFkMiIsICJ0b2tlbjJDU1NWYXIiLCAidG9rZW4iLCAic2VyaWFsaXplQ1NTVmFyIiwgInZhbHVlIiwgInRyYW5zZm9ybVRva2VuIiwgIlJlYWN0IiwgIlJlYWN0IiwgInVzZUxheW91dEVmZmVjdCIsICJ1c2VMYXlvdXRVcGRhdGVFZmZlY3QiLCAiUmVhY3QiLCAidXNlSW5zZXJ0aW9uRWZmZWN0UG9seWZpbGwiLCAiUmVhY3QiLCAiZnVsbENsb25lIiwgInVzZUluc2VydGlvbkVmZmVjdCIsICJ1c2VDbGVhbnVwUmVnaXN0ZXIiLCAicmVnaXN0ZXIiLCAidXNlUnVuIiwgInJlZ2lzdGVyIiwgImJ1aWxkQ2FjaGUiLCAiY2FjaGUiLCAic3R5bGUiLCAiZ2V0Q29tcHV0ZWRUb2tlbiIsICJmb3JtYXQiLCAiZm9ybWF0VG9rZW4iLCAiY2FjaGUiLCAidG9rZW4iLCAiZXh0cmFjdCIsICJpbXBvcnRfcmVhY3QiLCAiUmVhY3QiLCAidmFsdWUiLCAidmFsdWUiLCAicGF0dGVybiIsICJwb3NpdGlvbiIsICJpbmRleCIsICJhcnJheSIsICJ2YWx1ZSIsICJ0eXBlIiwgImxlbmd0aCIsICJ0eXBlIiwgInZhbHVlIiwgInR5cGUiLCAiaW5kZXgiLCAidHlwZSIsICJ2YWx1ZSIsICJwYXJzZSIsICJpbmRleCIsICJvZmZzZXQiLCAibGVuZ3RoIiwgImNoYXJhY3RlciIsICJ0eXBlIiwgImNoYXJhY3RlcnMiLCAiaW5kZXgiLCAibGludGVyIiwgInZhbHVlIiwgImxpbnRlciIsICJ2YWx1ZSIsICJ2YWx1ZSIsICJrZXlzIiwgInBhcnNlU3R5bGUiLCAic3R5bGUiLCAicHJldiIsICJhcHBlbmRTdHlsZSIsICJsaW50ZXIiLCAibWF0Y2giLCAidG9rZW4iLCAiY2FjaGUiLCAibm9kZSIsICJleHRyYWN0IiwgInVzZUNTU1ZhclJlZ2lzdGVyIiwgInVuaXRsZXNzIiwgImlnbm9yZSIsICJ0b2tlbiIsICJjYWNoZSIsICJzdHlsZSIsICJleHRyYWN0IiwgImV4dHJhY3QiLCAiS2V5ZnJhbWUiLCAic3R5bGUiLCAiaW1wb3J0X3JlYWN0IiwgInZhbHVlIiwgImlzT2JqZWN0IiwgIlJlYWN0IiwgIndhcm5pbmciLCAidHlwZSIsICJ3YXJuaW5nX2RlZmF1bHQiLCAiaW1wb3J0X3JlYWN0IiwgIlJlYWN0IiwgImxvY2FsZSIsICJsb2NhbGUiLCAiZW5fVVNfZGVmYXVsdCIsICJsb2NhbGUiLCAiZW5fVVNfZGVmYXVsdCIsICJsb2NhbGUiLCAiZW5fVVNfZGVmYXVsdCIsICJlbl9VU19kZWZhdWx0IiwgImVuX1VTX2RlZmF1bHQiLCAiZW5fVVNfZGVmYXVsdCIsICJsb2NhbGUiLCAiaW1wb3J0X3JlYWN0IiwgIlJlYWN0IiwgImxvY2FsZSIsICJlbl9VU19kZWZhdWx0IiwgImxvY2FsZSIsICJ3YXJuaW5nIiwgImltcG9ydF9yZWFjdCIsICJtYXRjaCIsICJpbmRleCIsICJ2YWx1ZSIsICJtYXRjaFByZWZpeCIsICJoZXgiLCAiaW5kZXgyIiwgInZhbHVlIiwgImdlbmVyYXRlIiwgImluZGV4IiwgImMiLCAiZ2VuZXJhdGVDb2xvclBhbGV0dGVzIiwgImdlbmVyYXRlTmV1dHJhbENvbG9yUGFsZXR0ZXMiLCAidG9rZW4iLCAidG9rZW4iLCAiaW5kZXgiLCAidG9rZW4iLCAiZ2VuZXJhdGUiLCAidG9rZW4iLCAiZ2VuZXJhdGUiLCAicHJldiIsICJSZWFjdCIsICJSZWFjdCIsICJnbG9iYWxQcmVmaXhDbHMiLCAidHlwZSIsICJnZW5lcmF0ZSIsICJpbmRleCIsICJzdHlsZSIsICJ3YXJuaW5nX2RlZmF1bHQiLCAiUmVhY3QiLCAiaW1wb3J0X3JlYWN0IiwgIlJlYWN0IiwgImltcG9ydF9yZWFjdCIsICJBYnN0cmFjdENhbGN1bGF0b3IiLCAiY2FsY3VsYXRvcl9kZWZhdWx0IiwgIkNBTENfVU5JVCIsICJyZWdleHAiLCAidW5pdCIsICJ2YWx1ZSIsICJDU1NDYWxjdWxhdG9yIiwgImNhbGN1bGF0b3JfZGVmYXVsdCIsICJOdW1DYWxjdWxhdG9yIiwgImNhbGN1bGF0b3JfZGVmYXVsdCIsICJnZW5DYWxjIiwgInR5cGUiLCAiQ1NTQ2FsY3VsYXRvciIsICJjYWxjX2RlZmF1bHQiLCAiZ2V0Q29tcFZhclByZWZpeCIsICJSZWFjdCIsICJSZWFjdCIsICJ2YWx1ZSIsICJ2YWx1ZSIsICJwcmV2IiwgInRva2VuIiwgIm1lcmdlIiwgImtleXMiLCAiZ2V0IiwgIm5vb3AiLCAic3RhdGlzdGljVG9rZW4iLCAidG9rZW4iLCAidG9rZW5LZXlzIiwgImdldCIsICJmbHVzaCIsICJ0b2tlbiIsICJtZXJnZSIsICJ0eXBlIiwgInZhbHVlIiwgImltcG9ydF9yZWFjdCIsICJBcnJheUtleU1hcCIsICJzZXQiLCAia2V5cyIsICJ2YWx1ZSIsICJnZXQiLCAiY2FjaGUiLCAibm93IiwgIlJlYWN0IiwgInVzZURlZmF1bHRDU1AiLCAidXNlVG9rZW4iLCAiZ2VuU3R5bGVIb29rcyIsICJnZW5Db21wb25lbnRTdHlsZUhvb2siLCAiaWdub3JlIiwgIkNTU1ZhclJlZ2lzdGVyIiwgInVzZUNTU1ZhciIsICJub2RlIiwgIlJlYWN0IiwgInRva2VuIiwgInR5cGUiLCAiY2FsY19kZWZhdWx0IiwgIm1lcmdlIiwgImdlblN1YlN0eWxlQ29tcG9uZW50IiwgIlN0eWxlZENvbXBvbmVudCIsICJpbXBvcnRfcmVhY3QiLCAidmVyc2lvbl9kZWZhdWx0IiwgInZlcnNpb25fZGVmYXVsdCIsICJnZXRBbHBoYUNvbG9yIiwgInRva2VuIiwgIl9fcmVzdCIsICJnZXRDb21wdXRlZFRva2VuIiwgInZhbHVlIiwgIlJlYWN0IiwgInZlcnNpb25fZGVmYXVsdCIsICJ0b2tlbiIsICJpbXBvcnRfcmVhY3QiLCAidG9rZW4iLCAib2Zmc2V0IiwgInRva2VuIiwgInRva2VuIiwgInByZXYiLCAidG9rZW4iLCAiUmVhY3QiLCAiZnVsbENsb25lIiwgIndhcm5pbmciLCAiX2EiLCAiX2IiLCAicHJldiIsICJuZXh0IiwgImluZGV4IiwgIlJlYWN0IiwgIlJlYWN0IiwgImltcG9ydF9yZWFjdCIsICJSZWFjdCIsICJSZWFjdCIsICJEb21XcmFwcGVyIiwgInJlbmRlciIsICJSZWFjdCIsICJnZXRWYWx1ZSIsICJSZWFjdCIsICJpbXBvcnRfcmVhY3QiLCAiUmVhY3QiLCAiaW1wb3J0X3JlYWN0IiwgInR5cGUiLCAibWF0Y2giLCAiaW1wb3J0X3JlYWN0IiwgIlJlYWN0IiwgIlJlYWN0IiwgImluZGV4IiwgInN0eWxlIiwgImdldEV2ZW50SGFuZGxlcnMiLCAibm9kZSIsICJjbGFzc05hbWVzIiwgIlJlYWN0IiwgImtleXMiLCAibm9kZSIsICJfZXhjbHVkZWQiLCAiX2V4Y2x1ZGVkMiIsICJDU1NNb3Rpb25MaXN0IiwgInJlbmRlciIsICJDb21wb25lbnQiLCAiaW5kZXgiLCAia2V5cyIsICJlc19kZWZhdWx0IiwgInRva2VuIiwgIlJlYWN0IiwgIndhcm5pbmciLCAiX19yZXN0IiwgIndhcm5pbmdfZGVmYXVsdCIsICJhbGVydCIsICJsb2NhbGUiLCAic3RhdGlzdGljIiwgImVtcHR5IiwgInVwbG9hZCIsICJlbl9VU19kZWZhdWx0IiwgInRva2VuIiwgIl9fcmVzdCIsICJ3YXJuaW5nX2RlZmF1bHQiLCAiUmVhY3QiLCAiUmVhY3QiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiUmVhY3QiLCAiaW1wb3J0X3JlYWN0IiwgIm1hdGNoIiwgIndhcm5pbmciLCAiZ2VuZXJhdGUiLCAibm9kZSIsICJSZWFjdCIsICJpbmRleCIsICJ1c2VJbnNlcnRTdHlsZXMiLCAiX2V4Y2x1ZGVkIiwgIkljb25CYXNlIiwgInN0eWxlIiwgIndhcm5pbmciLCAiZ2VuZXJhdGUiLCAiX2V4Y2x1ZGVkIiwgImNsYXNzTmFtZXMiLCAiQ2hlY2tDaXJjbGVGaWxsZWQiLCAiQ2hlY2tDaXJjbGVGaWxsZWRfZGVmYXVsdCIsICJSZWFjdCIsICJDbG9zZUNpcmNsZUZpbGxlZCIsICJSZWZJY29uIiwgIkNsb3NlQ2lyY2xlRmlsbGVkX2RlZmF1bHQiLCAiUmVhY3QiLCAiQ2xvc2VPdXRsaW5lZCIsICJSZWZJY29uIiwgIkNsb3NlT3V0bGluZWRfZGVmYXVsdCIsICJpbXBvcnRfcmVhY3QiLCAiaXNGcmFnbWVudCIsICJSZWFjdCIsICJjbG9uZUVsZW1lbnQiLCAiUmVhY3QiLCAiTG9hZGluZ091dGxpbmVkIiwgIlJlZkljb24iLCAiTG9hZGluZ091dGxpbmVkX2RlZmF1bHQiLCAiaW1wb3J0X3JlYWN0IiwgImltcG9ydF9yZWFjdCIsICJSZWFjdCIsICJ0eXBlIiwgInRva2VuIiwgIlJlYWN0IiwgIndhcm5pbmciLCAiUmVhY3QiLCAiUmVhY3RET00iLCAiX3JlZ2VuZXJhdG9yUnVudGltZSIsICJ0IiwgInIiLCAiZSIsICJuIiwgImMiLCAibyIsICJpIiwgImEiLCAidSIsICJoIiwgIkNvbnRleHQiLCAiZiIsICJuIiwgIlJlYWN0RE9NIiwgImZ1bGxDbG9uZSIsICJ2ZXJzaW9uIiwgIm5vZGUiLCAibm9kZSIsICJub2RlIiwgIlJlYWN0RE9NIiwgIndhcm5pbmdfZGVmYXVsdCIsICJyZW5kZXIiLCAibm9kZSIsICJnZXRUcmFuc2l0aW9uTmFtZSIsICJpbXBvcnRfcmVhY3QiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiaW1wb3J0X3JlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgInRva2VuIiwgIlJlYWN0IiwgIlJlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgIm5vZGUiLCAidmFsdWUiLCAicmVzaXplT2JzZXJ2ZXIiLCAiZXNfZGVmYXVsdCIsICJjbGFzc05hbWVzIiwgInJlYWN0UmVuZGVyIiwgInRva2VuIiwgIm5vZGUiLCAiY2xhc3NOYW1lcyIsICJSZWFjdCIsICJub2RlIiwgImNsb25lRWxlbWVudCIsICJpbXBvcnRfcmVhY3QiLCAiUmVhY3QiLCAiUmVhY3QiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiY2xhc3NOYW1lcyIsICJSZWFjdCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJfX3Jlc3QiLCAid2FybmluZyIsICJjbGFzc05hbWVzIiwgImltcG9ydF9yZWFjdCIsICJ0eXBlIiwgImNsb25lRWxlbWVudCIsICJSZWFjdCIsICJpc0ZyYWdtZW50IiwgImltcG9ydF9yZWFjdCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJpbXBvcnRfcmVhY3QiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAic3R5bGUiLCAiY2xhc3NOYW1lcyIsICJSZWFjdCIsICJzdHlsZSIsICJjbGFzc05hbWVzIiwgIlJlYWN0IiwgIkxvYWRpbmdPdXRsaW5lZF9kZWZhdWx0IiwgIm5vZGUiLCAiZXNfZGVmYXVsdCIsICJ0b2tlbiIsICJpbXBvcnRfcmVhY3QiLCAiX2V4Y2x1ZGVkIiwgIl9leGNsdWRlZDIiLCAiZ2V0Um91bmROdW1iZXIiLCAidmFsdWUiLCAiY29udmVydEhzYjJIc3YiLCAiQ29sb3IiLCAiZ2VuZXJhdGVDb2xvciIsICJjYWxjdWxhdGVDb2xvciIsICJvZmZzZXQiLCAidHlwZSIsICJjYWxjT2Zmc2V0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgImltcG9ydF9jbGFzc25hbWVzIiwgImltcG9ydF9yZWFjdCIsICJDb2xvckJsb2NrIiwgInN0eWxlIiwgIlJlYWN0IiwgImNsYXNzTmFtZXMiLCAiaW1wb3J0X3JlYWN0IiwgImltcG9ydF9yZWFjdCIsICJ1cGRhdGVPZmZzZXQiLCAiY2FsY09mZnNldCIsICJvbkRyYWdNb3ZlIiwgIm9uRHJhZ1N0b3AiLCAib25EcmFnU3RhcnQiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiaW1wb3J0X3JlYWN0IiwgIkhhbmRsZXIiLCAiUmVhY3QiLCAiY2xhc3NOYW1lcyIsICJpbXBvcnRfcmVhY3QiLCAiUGFsZXR0ZSIsICJzdHlsZSIsICJSZWFjdCIsICJpbXBvcnRfcmVhY3QiLCAiUmVhY3QiLCAiUGlja2VyIiwgIm9mZnNldCIsICJSZWFjdCIsICJpbXBvcnRfcmVhY3QiLCAidXNlQ29sb3JTdGF0ZSIsICJ2YWx1ZSIsICJSZWFjdCIsICJpbXBvcnRfcmVhY3QiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiaW1wb3J0X3JlYWN0IiwgIkdyYWRpZW50IiwgInR5cGUiLCAiUmVhY3QiLCAiU2xpZGVyIiwgInR5cGUiLCAiZ2V0VmFsdWUiLCAib2Zmc2V0IiwgIlJlYWN0IiwgImNsYXNzTmFtZXMiLCAidmFsdWUiLCAic3R5bGUiLCAiU2xpZGVyIiwgImhhbmRsZUNoYW5nZSIsICJ0eXBlIiwgImdldEh1ZUNvbG9yIiwgImdldEFscGhhQ29sb3IiLCAib25IdWVDaGFuZ2UiLCAib25BbHBoYUNoYW5nZSIsICJvbkh1ZUNoYW5nZUNvbXBsZXRlIiwgIm9uQWxwaGFDaGFuZ2VDb21wbGV0ZSIsICJjbGFzc05hbWVzIiwgIlJlYWN0IiwgInZhbHVlIiwgIkFnZ3JlZ2F0aW9uQ29sb3IiLCAiaW1wb3J0X3JlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgIlJlYWN0IiwgIlJpZ2h0T3V0bGluZWQiLCAiUmVmSWNvbiIsICJSaWdodE91dGxpbmVkX2RlZmF1bHQiLCAidG9rZW4iLCAidG9rZW4iLCAidG9rZW4iLCAidG9rZW4iLCAidG9rZW4iLCAidmFsdWUiLCAidG9rZW4iLCAibWVyZ2UiLCAicHJldiIsICJ0b2tlbiIsICJwcmV2IiwgImdlbkxpbmtTdHlsZSIsICJtZXJnZSIsICJzdHlsZV9kZWZhdWx0IiwgInRva2VuIiwgInRva2VuIiwgInRva2VuIiwgIl9fcmVzdCIsICJSZWFjdCIsICJ0eXBlIiwgInN0eWxlX2RlZmF1bHQiLCAiX2EiLCAid2FybmluZyIsICJfYiIsICJjbGFzc05hbWVzIiwgImJ1dHRvbl9kZWZhdWx0IiwgIlJlYWN0IiwgImltcG9ydF9yZWFjdF9kb20iLCAiUmVhY3QiLCAiQ29udGV4dF9kZWZhdWx0IiwgIlJlYWN0IiwgInJlbmRlciIsICJDb250ZXh0X2RlZmF1bHQiLCAiYXBwZW5kIiwgImNsZWFudXAiLCAiUmVhY3QiLCAidXVpZCIsICJnZXRQb3J0YWxDb250YWluZXIiLCAiZ2V0Q29udGFpbmVyIiwgIkNvbnRleHRfZGVmYXVsdCIsICJlc19kZWZhdWx0IiwgIlJlYWN0IiwgIlJlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgIlJlYWN0IiwgImZ1bGxDbG9uZSIsICJ1dWlkIiwgInVzZUlkIiwgInV1aWQiLCAiUmVhY3QiLCAiaW1wb3J0X3JlYWN0IiwgIm1ldGhvZCIsICJSZWFjdCIsICJpbXBvcnRfcmVhY3QiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiaW1wb3J0X3JlYWN0IiwgIlJlYWN0IiwgIlJlYWN0IiwgInN0eWxlIiwgIm5leHQiLCAiY2xhc3NOYW1lcyIsICJzdHlsZSIsICJlc19kZWZhdWx0IiwgImNsYXNzTmFtZXMiLCAiUmVhY3QiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiTWFzayIsICJzdHlsZSIsICJlc19kZWZhdWx0IiwgImNsYXNzTmFtZXMiLCAiRGlhbG9nIiwgIm9uQ29udGVudE1vdXNlRG93biIsICJvbkNvbnRlbnRNb3VzZVVwIiwgIm9uV3JhcHBlckNsaWNrIiwgImNsYXNzTmFtZXMiLCAiRGlhbG9nV3JhcCIsICJnZXRDb250YWluZXIiLCAiZXNfZGVmYXVsdCIsICJlc19kZWZhdWx0IiwgImltcG9ydF9yZWFjdCIsICJSZWFjdCIsICJSZWFjdCIsICJSZWFjdCIsICJSZWFjdCIsICJ3YXJuaW5nRnVuYyIsICJDb250ZXh0IiwgIlJlYWN0IiwgInRvQXJyYXkiLCAidmFsdWUiLCAiX3dyYXBOYXRpdmVTdXBlciIsICJ0IiwgIndhcm5pbmciLCAidHlwZSIsICJ2YWx1ZSIsICJpbmRleCIsICJuZXh0IiwgIkFzeW5jVmFsaWRhdGlvbkVycm9yIiwgImdldFZhbHVlIiwgInZhbHVlIiwgImVudW1lcmFibGUiLCAidmFsdWUiLCAicGF0dGVybiIsICJ2YWx1ZSIsICJyYW5nZSIsICJ2YWx1ZSIsICJyZXF1aXJlZCIsICJ2YWx1ZSIsICJ0eXBlIiwgImIiLCAiaXAiLCAicHJvdG9jb2wiLCAicGF0dGVybiIsICJ2YWx1ZSIsICJyZWdleHAiLCAidXJsIiwgInR5cGUiLCAid2hpdGVzcGFjZSIsICJ2YWx1ZSIsICJhbnkiLCAidmFsdWUiLCAidmFsaWRhdGUiLCAiYXJyYXkiLCAidmFsdWUiLCAidmFsaWRhdGUiLCAiYm9vbGVhbiIsICJ2YWx1ZSIsICJ2YWxpZGF0ZSIsICJkYXRlIiwgInZhbHVlIiwgInZhbGlkYXRlIiwgIkVOVU0iLCAiZW51bWVyYWJsZSIsICJ2YWx1ZSIsICJ2YWxpZGF0ZSIsICJlbnVtX2RlZmF1bHQiLCAiZmxvYXRGbiIsICJ2YWx1ZSIsICJ2YWxpZGF0ZSIsICJpbnRlZ2VyIiwgInZhbHVlIiwgInZhbGlkYXRlIiwgIm1ldGhvZCIsICJ2YWx1ZSIsICJ2YWxpZGF0ZSIsICJudW1iZXIiLCAidmFsdWUiLCAidmFsaWRhdGUiLCAib2JqZWN0IiwgInZhbHVlIiwgInZhbGlkYXRlIiwgInBhdHRlcm4iLCAidmFsdWUiLCAidmFsaWRhdGUiLCAicGF0dGVybl9kZWZhdWx0IiwgInJlZ2V4cCIsICJ2YWx1ZSIsICJ2YWxpZGF0ZSIsICJyZXF1aXJlZCIsICJ2YWx1ZSIsICJ0eXBlIiwgInJlcXVpcmVkX2RlZmF1bHQiLCAic3RyaW5nIiwgInZhbHVlIiwgInZhbGlkYXRlIiwgInR5cGUiLCAidmFsdWUiLCAidmFsaWRhdGUiLCAidHlwZV9kZWZhdWx0IiwgImVudW1fZGVmYXVsdCIsICJwYXR0ZXJuX2RlZmF1bHQiLCAidHlwZV9kZWZhdWx0IiwgInJlcXVpcmVkX2RlZmF1bHQiLCAiU2NoZW1hIiwgImRlZmluZSIsICJtZXNzYWdlcyIsICJ2YWxpZGF0ZSIsICJrZXlzIiwgInZhbHVlIiwgInR5cGUiLCAidmFsaWRhdG9yIiwgIndhcm5pbmciLCAiZXNfZGVmYXVsdCIsICJSZWFjdCIsICJ0eXBlVGVtcGxhdGUiLCAiZXNfZGVmYXVsdCIsICJ2YWx1ZSIsICJ2YWxpZGF0b3IiLCAibWVzc2FnZXMiLCAiaW5kZXgiLCAicHJldiIsICJ3cmFwcGVkQ2FsbGJhY2siLCAidG9BcnJheSIsICJ2YWx1ZSIsICJrZXlzIiwgImFycmF5IiwgImxlbmd0aCIsICJfZXhjbHVkZWQiLCAicHJldiIsICJuZXh0IiwgIkZpZWxkIiwgInByZXNlcnZlIiwgInRvQXJyYXkiLCAibm9ybWFsaXplIiwgImdldEludGVybmFsSG9va3MiLCAidmFsdWUiLCAicmVuZGVyIiwgIlJlYWN0IiwgImdldEtleSIsICJzaG91bGRVcGRhdGUiLCAidmFsdWUiLCAiZ2V0TmV3VmFsdWUiLCAiaW5kZXgiLCAibW92ZSIsICJmcm9tIiwgIlJlYWN0IiwgImluZGV4IiwgIlNQTElUIiwgIk5hbWVNYXAiLCAic2V0IiwgInZhbHVlIiwgImdldCIsICJuZXh0IiwgInR5cGUiLCAidW5pdCIsICJfZXhjbHVkZWQiLCAiRm9ybVN0b3JlIiwgInByZXNlcnZlIiwgImNhY2hlIiwgImluZGV4IiwgImlzRmllbGRUb3VjaGVkIiwgImlzTmFtZVBhdGhMaXN0VG91Y2hlZCIsICJ2YWx1ZSIsICJyZXNldFdpdGhGaWVsZHMiLCAiZmlsbENoaWxkcmVuIiwgImZvcmNlUmVSZW5kZXIiLCAiUmVhY3QiLCAiUmVhY3QiLCAiRm9ybVByb3ZpZGVyIiwgInRyaWdnZXJGb3JtQ2hhbmdlIiwgInRyaWdnZXJGb3JtRmluaXNoIiwgInJlZ2lzdGVyRm9ybSIsICJ1bnJlZ2lzdGVyRm9ybSIsICJfZXhjbHVkZWQiLCAiRm9ybSIsICJwcmVzZXJ2ZSIsICJDb21wb25lbnQiLCAiaW1wb3J0X3JlYWN0IiwgInN0cmluZ2lmeSIsICJ2YWx1ZSIsICJnZXRJbnRlcm5hbEhvb2tzIiwgImdldFdhdGNoVmFsdWUiLCAiUmVhY3QiLCAidG9rZW4iLCAibWVyZ2UiLCAicG9zaXRpb24iLCAidG9rZW4iLCAicHJlcGFyZVRva2VuIiwgIm1lcmdlIiwgInByZXBhcmVDb21wb25lbnRUb2tlbiIsICJzdHlsZV9kZWZhdWx0IiwgIlJlYWN0IiwgIkNvbXBvbmVudCIsICJkZWZhdWx0UHJlZml4Q2xzIiwgIlB1cmVQYW5lbCIsICJzdHlsZSIsICJyZXNpemVPYnNlcnZlciIsICJSZWFjdCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJSZWFjdCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJSZWFjdCIsICJSZWFjdCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJUcmFuc0J0biIsICJjbGFzc05hbWVzIiwgImNscyIsICJpbXBvcnRfcmVhY3QiLCAidXNlQWxsb3dDbGVhciIsICJSZWFjdCIsICJSZWFjdCIsICJSZWFjdCIsICJjYW5jZWxMYXRlc3QiLCAiZGVsYXlTZXRCb29sIiwgInZhbHVlIiwgIlJlYWN0IiwgIlJlYWN0IiwgIlJlYWN0IiwgImltcG9ydF9yZWFjdCIsICJSZWFjdCIsICJpbXBvcnRfcmVhY3QiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiUmVhY3QiLCAiaW1wb3J0X3JlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgIlJlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgIl9leGNsdWRlZCIsICJpdGVtS2V5IiwgInN0eWxlIiwgIkNvbXBvbmVudCIsICJjbGFzc05hbWVzIiwgIm9uUmVzaXplIiwgIlJlYWN0IiwgImltcG9ydF9yZWFjdF9kb20iLCAibm90aWZ5RWZmZWN0VXBkYXRlIiwgIlJlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgImltcG9ydF9yZWFjdCIsICJSZWFjdCIsICJfZXhjbHVkZWQiLCAiX2V4Y2x1ZGVkMiIsICJfZXhjbHVkZWQzIiwgIkludGVybmFsUmF3SXRlbSIsICJDb21wb25lbnQiLCAiY2xhc3NOYW1lcyIsICJfZXhjbHVkZWQiLCAiaXRlbUtleSIsICJzdHlsZSIsICJDb21wb25lbnQiLCAiZ2V0S2V5IiwgImluZGV4IiwgImNsYXNzTmFtZXMiLCAiZXNfZGVmYXVsdCIsICJSZWFjdCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJJbnB1dCIsICJ2YWx1ZSIsICJzdHlsZSIsICJjbGFzc05hbWVzIiwgIlJlYWN0IiwgInRvQXJyYXkiLCAidmFsdWUiLCAiaGFzVmFsdWUiLCAiZ2V0VGl0bGUiLCAidXNlTGF5b3V0RWZmZWN0IiwgInZhbHVlIiwgIm9uUHJldmVudE1vdXNlRG93biIsICJTZWxlY3RTZWxlY3RvciIsICJ1c2VMYXlvdXRFZmZlY3QiLCAiZGVmYXVsdFJlbmRlclNlbGVjdG9yIiwgImdldFRpdGxlIiwgImNsYXNzTmFtZXMiLCAiY3VzdG9taXplUmVuZGVyU2VsZWN0b3IiLCAib25Nb3VzZURvd24iLCAicmVuZGVySXRlbSIsICJvbkNsb3NlIiwgInJlbmRlclJlc3QiLCAiZXNfZGVmYXVsdCIsICJSZWFjdCIsICJTaW5nbGVTZWxlY3RvciIsICJnZXRUaXRsZSIsICJTZWxlY3RvciIsICJvbkludGVybmFsSW5wdXRLZXlEb3duIiwgIm9uSW50ZXJuYWxJbnB1dE1vdXNlRG93biIsICJ0cmlnZ2VyT25TZWFyY2giLCAidmFsdWUiLCAib25JbnB1dENvbXBvc2l0aW9uU3RhcnQiLCAib25JbnB1dENvbXBvc2l0aW9uRW5kIiwgIm9uSW5wdXRDaGFuZ2UiLCAib25JbnB1dFBhc3RlIiwgIm9uQ2xpY2siLCAib25Nb3VzZURvd24iLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiUmVhY3QiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiUmVhY3QiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiUmVhY3QiLCAiY2xhc3NOYW1lcyIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJSZWFjdCIsICJNYXNrIiwgImVzX2RlZmF1bHQiLCAiY2xhc3NOYW1lcyIsICJSZWFjdCIsICJuZXh0IiwgInN0eWxlIiwgIlBvcnRhbCIsICJNYXNrIiwgImVzX2RlZmF1bHQiLCAiY2xzIiwgImNsYXNzTmFtZXMiLCAiUmVhY3QiLCAibm9kZSIsICJSZWFjdCIsICJjb250ZXh0X2RlZmF1bHQiLCAiUmVhY3QiLCAidG9BcnJheSIsICJSZWFjdCIsICJwbGFjZW1lbnRzIiwgIm9mZnNldCIsICJpbmRleCIsICJyZXNldEZsaXBDYWNoZSIsICJnZXRJbnRlcnNlY3Rpb25WaXNpYmxlQXJlYSIsICJzeW5jTmV4dFBvcHVwUG9zaXRpb24iLCAidGFyZ2V0T2Zmc2V0IiwgInN1cHBvcnRBZGp1c3QiLCAidHJpZ2dlckFsaWduIiwgInJlc2V0UmVhZHkiLCAidXNlV2F0Y2giLCAibm90aWZ5U2Nyb2xsIiwgIlJlYWN0IiwgIm9uUG9pbnRlckRvd24iLCAib25UcmlnZ2VyQ2xvc2UiLCAiX2V4Y2x1ZGVkIiwgImVzX2RlZmF1bHQiLCAiY29udGV4dF9kZWZhdWx0IiwgImlkIiwgIm5vZGUiLCAiY2xlYXJEZWxheSIsICJ0cmlnZ2VyT3BlbiIsICJzZXRNb3VzZVBvc0J5RXZlbnQiLCAib25TY3JvbGwiLCAidXNlV2F0Y2giLCAiY2xhc3NOYW1lcyIsICJzeW5jVGFyZ2V0U2l6ZSIsICJvblRhcmdldFJlc2l6ZSIsICJvblZpc2libGVDaGFuZ2VkIiwgIm9uUHJlcGFyZSIsICJvblBvcHVwTW91c2VFbnRlciIsICJvblBvcHVwTW91c2VMZWF2ZSIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJSZWFjdCIsICJfZXhjbHVkZWQiLCAiZ2V0QnVpbHRJblBsYWNlbWVudHMiLCAiU2VsZWN0VHJpZ2dlciIsICJlbXB0eSIsICJtZXJnZWRCdWlsdGluUGxhY2VtZW50cyIsICJlc19kZWZhdWx0IiwgImNsYXNzTmFtZXMiLCAiaW5kZXgiLCAidmFsdWUiLCAiZ2V0IiwgImdldFNlcGFyYXRlZENvbnRlbnQiLCAibWF0Y2giLCAic2VwYXJhdGUiLCAidG9rZW4iLCAibGlzdCIsICJSZWFjdCIsICJSZWFjdCIsICJ2YWx1ZSIsICJfZXhjbHVkZWQiLCAiaXNNdWx0aXBsZSIsICJPcHRpb25MaXN0IiwgIm9uSW50ZXJuYWxTZWFyY2giLCAib25JbnRlcm5hbFNlYXJjaFN1Ym1pdCIsICJvbkludGVybmFsS2V5RG93biIsICJvbkludGVybmFsS2V5VXAiLCAib25TZWxlY3RvclJlbW92ZSIsICJvbklucHV0Qmx1ciIsICJvbkNvbnRhaW5lckZvY3VzIiwgIm9uQ29udGFpbmVyQmx1ciIsICJvbkludGVybmFsTW91c2VEb3duIiwgImluZGV4IiwgIm9uVHJpZ2dlclZpc2libGVDaGFuZ2UiLCAiY2xhc3NOYW1lcyIsICJvbkNsZWFyTW91c2VEb3duIiwgIm5vZGUiLCAiT3B0R3JvdXAiLCAiT3B0aW9uIiwgImltcG9ydF9jbGFzc25hbWVzIiwgImltcG9ydF9jbGFzc25hbWVzIiwgIlJlYWN0IiwgImltcG9ydF9yZWFjdCIsICJpbXBvcnRfcmVhY3RfZG9tIiwgIlJlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgIm9uUmVzaXplIiwgImNsYXNzTmFtZXMiLCAiUmVhY3QiLCAiUmVhY3QiLCAiSXRlbSIsICJub2RlIiwgImdldEtleSIsICJpbmRleCIsICJub2RlIiwgIkl0ZW0iLCAiUmVhY3QiLCAiZ2V0S2V5IiwgImdldEtleSIsICJpbXBvcnRfcmVhY3QiLCAiaW1wb3J0X3JlYWN0IiwgIlJlYWN0IiwgImdldEtleSIsICJnZXRTaXplIiwgIlJlYWN0IiwgImltcG9ydF9yZWFjdCIsICJDYWNoZU1hcCIsICJzZXQiLCAidmFsdWUiLCAiZ2V0IiwgInZhbHVlIiwgImdldEtleSIsICJkb0NvbGxlY3QiLCAiaW1wb3J0X3JlYWN0IiwgIm9uVG91Y2hNb3ZlIiwgIm9mZnNldCIsICJvblRvdWNoRW5kIiwgIm9uVG91Y2hTdGFydCIsICJjbGVhblVwRXZlbnRzIiwgIlJlYWN0IiwgIm9mZnNldCIsICJzdG9wU2Nyb2xsIiwgImNvbnRpbnVlU2Nyb2xsIiwgIm9uTW91c2VEb3duIiwgIm9uTW91c2VVcCIsICJvbk1vdXNlTW92ZSIsICJSZWFjdCIsICJnZXRLZXkiLCAiaW5kZXgiLCAib2Zmc2V0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgIlJlYWN0IiwgInN0eWxlIiwgImRlbGF5SGlkZGVuIiwgIm9uQ29udGFpbmVyTW91c2VEb3duIiwgIm9uVGh1bWJNb3VzZURvd24iLCAib25TY3JvbGxiYXJUb3VjaFN0YXJ0IiwgIm9uTW91c2VNb3ZlIiwgIm9mZnNldCIsICJvbk1vdXNlVXAiLCAiY2xhc3NOYW1lcyIsICJfZXhjbHVkZWQiLCAic3R5bGUiLCAiaXRlbUtleSIsICJDb21wb25lbnQiLCAiZ2V0S2V5IiwgImNsYXNzTmFtZXMiLCAib25TY3JvbGxiYXJTdGFydE1vdmUiLCAib25TY3JvbGxiYXJTdG9wTW92ZSIsICJ2YWx1ZSIsICJvbkhvbGRlclJlc2l6ZSIsICJnZXRWaXJ0dWFsU2Nyb2xsSW5mbyIsICJrZWVwSW5Ib3Jpem9udGFsUmFuZ2UiLCAib2Zmc2V0IiwgImRlbGF5SGlkZVNjcm9sbEJhciIsICJnZXRTaXplIiwgIkxpc3QiLCAiTGlzdF9kZWZhdWx0IiwgImVzX2RlZmF1bHQiLCAiTGlzdF9kZWZhdWx0IiwgIlJlYWN0IiwgImltcG9ydF9yZWFjdCIsICJfZXhjbHVkZWQiLCAiaXNUaXRsZVR5cGUiLCAiT3B0aW9uTGlzdCIsICJmbGF0dGVuT3B0aW9ucyIsICJwcmV2IiwgIm5leHQiLCAib25MaXN0TW91c2VEb3duIiwgInNjcm9sbEludG9WaWV3IiwgInZhbHVlIiwgImdldEVuYWJsZWRBY3RpdmVJbmRleCIsICJpbmRleCIsICJvZmZzZXQiLCAic2V0QWN0aXZlIiwgIm9uU2VsZWN0VmFsdWUiLCAiZ2V0TGFiZWwiLCAicmVuZGVySXRlbSIsICJlc19kZWZhdWx0IiwgImNsYXNzTmFtZXMiLCAic3R5bGUiLCAiUmVhY3QiLCAiUmVhY3QiLCAidG9BcnJheSIsICJSZWFjdCIsICJ1dWlkIiwgImlzQnJvd3NlckNsaWVudCIsICJ1c2VJZCIsICJSZWFjdCIsICJSZWFjdCIsICJfZXhjbHVkZWQiLCAiX2V4Y2x1ZGVkMiIsICJub2RlIiwgInZhbHVlIiwgInRvQXJyYXkiLCAiaW5kZXgiLCAidXNlT3B0aW9ucyIsICJzZXRMYWJlbE9wdGlvbnMiLCAiZGlnIiwgIlJlYWN0IiwgIlJlYWN0IiwgInZhbHVlIiwgInRvQXJyYXkiLCAibm9kZSIsICJ0eXBlIiwgInJlY3Vyc2l2ZU9wdGlvbnMiLCAiX2V4Y2x1ZGVkIiwgInZhbHVlIiwgInVzZUlkIiwgInRvQXJyYXkiLCAiaGFzVmFsdWUiLCAiZXhpc3RPcHRpb25zIiwgInNvcnRlciIsICJ0cmlnZ2VyQ2hhbmdlIiwgImluZGV4IiwgInRyaWdnZXJTZWxlY3QiLCAidHlwZSIsICJnZXRTZWxlY3RFbnQiLCAib25EaXNwbGF5VmFsdWVzQ2hhbmdlIiwgIm9uSW50ZXJuYWxTZWFyY2giLCAib25JbnRlcm5hbFNlYXJjaFNwbGl0IiwgImVzX2RlZmF1bHQiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiY2xhc3NOYW1lcyIsICJpbXBvcnRfcmVhY3QiLCAiUmVhY3QiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiUmVhY3QiLCAiRW1wdHkiLCAidG9rZW4iLCAibG9jYWxlIiwgIlJlYWN0IiwgImltcG9ydF9yZWFjdCIsICJ0b2tlbiIsICJsb2NhbGUiLCAidG9rZW4iLCAic3R5bGVfZGVmYXVsdCIsICJtZXJnZSIsICJfX3Jlc3QiLCAiRW1wdHkiLCAic3R5bGUiLCAic3R5bGVfZGVmYXVsdCIsICJsb2NhbGUiLCAid2FybmluZyIsICJjbGFzc05hbWVzIiwgImVtcHR5X2RlZmF1bHQiLCAiUmVhY3QiLCAiZW1wdHlfZGVmYXVsdCIsICJSZWFjdCIsICJnZXRCdWlsdEluUGxhY2VtZW50cyIsICJ0b2tlbiIsICJ0b2tlbiIsICJtZXJnZSIsICJnZW5TaXplU3R5bGUiLCAidG9rZW4iLCAiZ2VuU2luZ2xlU3R5bGUiLCAibWVyZ2UiLCAicHJlcGFyZUNvbXBvbmVudFRva2VuIiwgInRva2VuIiwgInRva2VuIiwgInRva2VuIiwgImdlblNpbmdsZVN0eWxlIiwgInN0eWxlX2RlZmF1bHQiLCAibWVyZ2UiLCAicHJlcGFyZUNvbXBvbmVudFRva2VuIiwgIlJlYWN0IiwgIlJlYWN0IiwgIkNoZWNrT3V0bGluZWQiLCAiUmVmSWNvbiIsICJDaGVja091dGxpbmVkX2RlZmF1bHQiLCAiUmVhY3QiLCAiRG93bk91dGxpbmVkIiwgIlJlZkljb24iLCAiRG93bk91dGxpbmVkX2RlZmF1bHQiLCAiUmVhY3QiLCAiU2VhcmNoT3V0bGluZWQiLCAiUmVmSWNvbiIsICJTZWFyY2hPdXRsaW5lZF9kZWZhdWx0IiwgIndhcm5pbmciLCAiQ2xvc2VDaXJjbGVGaWxsZWRfZGVmYXVsdCIsICJMb2FkaW5nT3V0bGluZWRfZGVmYXVsdCIsICJTZWFyY2hPdXRsaW5lZF9kZWZhdWx0IiwgIkRvd25PdXRsaW5lZF9kZWZhdWx0IiwgIkNoZWNrT3V0bGluZWRfZGVmYXVsdCIsICJDbG9zZU91dGxpbmVkX2RlZmF1bHQiLCAiX19yZXN0IiwgInN0eWxlIiwgImNsYXNzTmFtZXMiLCAidG9rZW4iLCAic3R5bGVfZGVmYXVsdCIsICJpc011bHRpcGxlIiwgImNscyIsICJfYSIsICJ3YXJuaW5nIiwgImVzX2RlZmF1bHQiLCAiZ2V0VHJhbnNpdGlvbk5hbWUiLCAiU2VsZWN0IiwgIlJlYWN0IiwgIlJlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgImltcG9ydF9jbGFzc25hbWVzIiwgIlJlYWN0IiwgIlBvcHVwIiwgInN0eWxlIiwgImNsYXNzTmFtZXMiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiUmVhY3QiLCAiaW1wb3J0X3JlYWN0IiwgIl9leGNsdWRlZCIsICJUb29sdGlwIiwgImdldFBvcHVwRWxlbWVudCIsICJQb3B1cCIsICJnZXRDaGlsZHJlbiIsICJlc19kZWZhdWx0IiwgImNsYXNzTmFtZXMiLCAiZXNfZGVmYXVsdCIsICJ0b2tlbiIsICJ0b2tlbiIsICJvZmZzZXQiLCAiUmVhY3QiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAidG9rZW4iLCAicHJlcGFyZUNvbXBvbmVudFRva2VuIiwgIm1lcmdlIiwgInN0eWxlX2RlZmF1bHQiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiY2xhc3NOYW1lcyIsICJQdXJlUGFuZWwiLCAic3R5bGVfZGVmYXVsdCIsICJjbHMiLCAiY2xhc3NOYW1lcyIsICJQb3B1cCIsICJQdXJlUGFuZWxfZGVmYXVsdCIsICJfX3Jlc3QiLCAidG9rZW4iLCAid2FybmluZyIsICJfYSIsICJfYiIsICJpc0ZyYWdtZW50IiwgImNsYXNzTmFtZXMiLCAic3R5bGVfZGVmYXVsdCIsICJlc19kZWZhdWx0IiwgImdldFRyYW5zaXRpb25OYW1lIiwgImNsb25lRWxlbWVudCIsICJUb29sdGlwIiwgIlB1cmVQYW5lbF9kZWZhdWx0IiwgIlJlYWN0IiwgIkxlZnRPdXRsaW5lZCIsICJSZWZJY29uIiwgIkxlZnRPdXRsaW5lZF9kZWZhdWx0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgIlJlYWN0IiwgImltcG9ydF9yZWFjdCIsICJfZXhjbHVkZWQiLCAic3R5bGUiLCAidHlwZSIsICJjbGFzc05hbWVzIiwgImhhbmRsZUNoYW5nZSIsICJlc19kZWZhdWx0IiwgImltcG9ydF9yZWFjdCIsICJSZWFjdCIsICJ0b2tlbiIsICJtZXJnZSIsICJ0b2tlbiIsICJnZW5EaXNhYmxlZFN0eWxlIiwgIm1lcmdlIiwgImdlbkJhc2VPdXRsaW5lZFN0eWxlIiwgImdlbk91dGxpbmVkU3RhdHVzU3R5bGUiLCAiZ2VuT3V0bGluZWRTdHlsZSIsICJnZW5Cb3JkZXJsZXNzU3R5bGUiLCAiZ2VuQmFzZUZpbGxlZFN0eWxlIiwgImdlbkZpbGxlZFN0YXR1c1N0eWxlIiwgImdlbkZpbGxlZFN0eWxlIiwgImdlbkJhc2VVbmRlcmxpbmVkU3R5bGUiLCAiZ2VuVW5kZXJsaW5lZFN0YXR1c1N0eWxlIiwgImdlblVuZGVybGluZWRTdHlsZSIsICJ0b2tlbiIsICJnZW5PdXRsaW5lZFN0eWxlIiwgImdlbkZpbGxlZFN0eWxlIiwgImdlbkJvcmRlcmxlc3NTdHlsZSIsICJnZW5VbmRlcmxpbmVkU3R5bGUiLCAiZ2VuR3JvdXBTdHlsZSIsICJtZXJnZSIsICJzdHlsZV9kZWZhdWx0IiwgInRva2VuIiwgImdldFN0eWxlIiwgIm1lcmdlIiwgInN0eWxlX2RlZmF1bHQiLCAiUmVhY3QiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiaW1wb3J0X3JlYWN0IiwgIlJlYWN0IiwgIl9fcmVzdCIsICJzdHlsZSIsICJ3YXJuaW5nIiwgIl9hIiwgInN0eWxlX2RlZmF1bHQiLCAiY2xhc3NOYW1lcyIsICJlc19kZWZhdWx0IiwgIkNoZWNrYm94IiwgIlJlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgIl9fcmVzdCIsICJzdHlsZSIsICJ2YWx1ZSIsICJzdHlsZV9kZWZhdWx0IiwgImNsYXNzTmFtZXMiLCAiQ2hlY2tib3giLCAiUmVhY3QiLCAiUmVhY3QiLCAiVXBPdXRsaW5lZCIsICJSZWZJY29uIiwgIlVwT3V0bGluZWRfZGVmYXVsdCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJ2YWx1ZSIsICJudW1iZXIiLCAiQmlnSW50RGVjaW1hbCIsICJ2YWx1ZSIsICJnZXRNYXJrIiwgIm9mZnNldCIsICJpc0VtcHR5IiwgImlzTmFOIiwgInRvU3RyaW5nIiwgIk51bWJlckRlY2ltYWwiLCAidmFsdWUiLCAibnVtYmVyIiwgImlzRW1wdHkiLCAiaXNOYU4iLCAidG9TdHJpbmciLCAidmFsdWUiLCAiZXNfZGVmYXVsdCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJpbXBvcnRfcmVhY3QiLCAidmFsdWUiLCAiUmVhY3QiLCAic3R5bGUiLCAidHJpZ2dlckZvY3VzIiwgInZhbHVlIiwgImNsYXNzTmFtZXMiLCAib25JbnB1dENsaWNrIiwgImNsc3giLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiaW1wb3J0X3JlYWN0IiwgIlJlYWN0IiwgIl9leGNsdWRlZCIsICJfZXhjbHVkZWQiLCAidmFsdWUiLCAiX2V4Y2x1ZGVkIiwgIklucHV0IiwgInR5cGUiLCAiY2xhc3NOYW1lcyIsICJmb2N1cyIsICJ2YWx1ZSIsICJwcmV2IiwgInRyaWdnZXJDaGFuZ2UiLCAib25JbnRlcm5hbENoYW5nZSIsICJvbkludGVybmFsQ29tcG9zaXRpb25FbmQiLCAiaGFuZGxlS2V5RG93biIsICJoYW5kbGVLZXlVcCIsICJoYW5kbGVGb2N1cyIsICJoYW5kbGVCbHVyIiwgImhhbmRsZVJlc2V0IiwgImdldElucHV0RWxlbWVudCIsICJSZWFjdCIsICJjbHN4IiwgImdldFN1ZmZpeCIsICJJbnB1dF9kZWZhdWx0IiwgImVzX2RlZmF1bHQiLCAiSW5wdXRfZGVmYXVsdCIsICJnZXQiLCAiUmVhY3QiLCAiaW1wb3J0X3JlYWN0IiwgInZhbHVlIiwgIlJlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgImltcG9ydF9yZWFjdCIsICJ1c2VNb2JpbGUiLCAib25TdG9wU3RlcCIsICJvblN0ZXBNb3VzZURvd24iLCAiY2xhc3NOYW1lcyIsICJzYWZlT25TdG9wU3RlcCIsICJpbXBvcnRfcmVhY3QiLCAiY2xlYW5VcCIsICJfZXhjbHVkZWQiLCAiX2V4Y2x1ZGVkMiIsICJnZXREZWNpbWFsVmFsdWUiLCAiZ2V0RGVjaW1hbElmVmFsaWRhdGUiLCAidmFsdWUiLCAiZXNfZGVmYXVsdCIsICJzdHlsZSIsICJjbGFzc05hbWVzIiwgIm51bWJlciIsICJnZXRSYW5nZVZhbHVlIiwgImlzSW5SYW5nZSIsICJ0cmlnZ2VyVmFsdWVVcGRhdGUiLCAiY29sbGVjdElucHV0VmFsdWUiLCAib25Db21wb3NpdGlvblN0YXJ0IiwgIm9uQ29tcG9zaXRpb25FbmQiLCAib25JbnRlcm5hbElucHV0IiwgIm9uSW50ZXJuYWxTdGVwIiwgImZsdXNoSW5wdXRWYWx1ZSIsICJvbkJlZm9yZUlucHV0IiwgIm9uS2V5RG93biIsICJvbktleVVwIiwgIm9uV2hlZWwiLCAib25CbHVyIiwgImNsc3giLCAiZm9jdXMiLCAiZXNfZGVmYXVsdCIsICJwcmVwYXJlQ29tcG9uZW50VG9rZW4iLCAidG9rZW4iLCAidG9rZW4iLCAiZ2VuT3V0bGluZWRTdHlsZSIsICJnZW5GaWxsZWRTdHlsZSIsICJnZW5VbmRlcmxpbmVkU3R5bGUiLCAiZ2VuQm9yZGVybGVzc1N0eWxlIiwgInN0eWxlX2RlZmF1bHQiLCAibWVyZ2UiLCAicHJlcGFyZUNvbXBvbmVudFRva2VuIiwgIl9fcmVzdCIsICJJbnB1dE51bWJlciIsICJzdHlsZV9kZWZhdWx0IiwgIlVwT3V0bGluZWRfZGVmYXVsdCIsICJEb3duT3V0bGluZWRfZGVmYXVsdCIsICJjbGFzc05hbWVzIiwgImVzX2RlZmF1bHQiLCAiaW1wb3J0X3JlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgImltcG9ydF9yZWFjdCIsICJSZWFjdCIsICJDbG9zZUNpcmNsZUZpbGxlZF9kZWZhdWx0IiwgImltcG9ydF9yZWFjdCIsICJoYXNQcmVmaXhTdWZmaXgiLCAiX19yZXN0IiwgIklucHV0IiwgInN0eWxlIiwgIl9fcmVzdCIsICJzdHlsZV9kZWZhdWx0IiwgIlJlYWN0IiwgImhhc1ByZWZpeFN1ZmZpeCIsICJ3YXJuaW5nIiwgImVzX2RlZmF1bHQiLCAiY2xhc3NOYW1lcyIsICJJbnB1dF9kZWZhdWx0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgIlJlYWN0IiwgIlJlYWN0IiwgImltcG9ydF9yZWFjdF9kb20iLCAidmFsdWUiLCAib2Zmc2V0IiwgImluZGV4IiwgImltcG9ydF9jbGFzc25hbWVzIiwgIlJlYWN0IiwgIlJlYWN0IiwgImNvbnRleHRfZGVmYXVsdCIsICJfZXhjbHVkZWQiLCAidmFsdWUiLCAic3R5bGUiLCAicmVuZGVyIiwgImNvbnRleHRfZGVmYXVsdCIsICJyYW5nZSIsICJjbGFzc05hbWVzIiwgIm9uSW50ZXJuYWxTdGFydE1vdmUiLCAib25JbnRlcm5hbEZvY3VzIiwgIm9uSW50ZXJuYWxNb3VzZUVudGVyIiwgIm9uS2V5RG93biIsICJvZmZzZXQiLCAiaGFuZGxlS2V5VXAiLCAiY2xzIiwgIl9leGNsdWRlZCIsICJzdHlsZSIsICJvbkFjdGl2ZSIsICJpbmRleCIsICJvbkhhbmRsZUZvY3VzIiwgIm9uSGFuZGxlTW91c2VFbnRlciIsICJ2YWx1ZSIsICJyZWYiLCAibm9kZSIsICJSZWFjdCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJSZWFjdCIsICJNYXJrIiwgInN0eWxlIiwgInZhbHVlIiwgImNvbnRleHRfZGVmYXVsdCIsICJjbGFzc05hbWVzIiwgIk1hcmtzIiwgInZhbHVlIiwgInN0eWxlIiwgIlJlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgIlJlYWN0IiwgIkRvdCIsICJ2YWx1ZSIsICJzdHlsZSIsICJjb250ZXh0X2RlZmF1bHQiLCAiY2xhc3NOYW1lcyIsICJTdGVwcyIsICJzdHlsZSIsICJjb250ZXh0X2RlZmF1bHQiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiUmVhY3QiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiUmVhY3QiLCAiVHJhY2siLCAic3R5bGUiLCAiaW5kZXgiLCAiY29udGV4dF9kZWZhdWx0IiwgInJhbmdlIiwgImNsYXNzTmFtZXMiLCAib25JbnRlcm5hbFN0YXJ0TW92ZSIsICJjbHMiLCAiVHJhY2tzIiwgInN0eWxlIiwgImNvbnRleHRfZGVmYXVsdCIsICJyYW5nZSIsICJjbGFzc05hbWVzIiwgImNscyIsICJpbmRleCIsICJSZWFjdCIsICJnZXRQb3NpdGlvbiIsICJmbHVzaFZhbHVlcyIsICJvZmZzZXQiLCAibmV4dCIsICJvblN0YXJ0TW92ZSIsICJvbk1vdXNlTW92ZSIsICJvbk1vdXNlVXAiLCAicHJldiIsICJSZWFjdCIsICJnZXREZWNpbWFsIiwgIm9mZnNldFZhbHVlIiwgIm9mZnNldCIsICJvZmZzZXRDaGFuZ2VkVmFsdWUiLCAibmVlZFB1c2giLCAib2Zmc2V0VmFsdWVzIiwgImltcG9ydF9yZWFjdCIsICJyYW5nZSIsICJTbGlkZXIiLCAic3R5bGUiLCAiY2xhc3NOYW1lcyIsICJ2YWx1ZSIsICJyYW5nZSIsICJpbmRleCIsICJnZXRUcmlnZ2VyVmFsdWUiLCAiZHJhZ2dpbmdEZWxldGUiLCAib25EZWxldGUiLCAiY2hhbmdlVG9DbG9zZVZhbHVlIiwgIm9uU2xpZGVyTW91c2VEb3duIiwgIm9uSGFuZGxlT2Zmc2V0Q2hhbmdlIiwgIm9mZnNldCIsICJuZXh0IiwgImNvbnRleHRfZGVmYXVsdCIsICJjbHMiLCAiU2xpZGVyX2RlZmF1bHQiLCAiZXNfZGVmYXVsdCIsICJTbGlkZXJfZGVmYXVsdCIsICJpbXBvcnRfcmVhY3QiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiaW1wb3J0X3JlYWN0IiwgIkNvbnRleHRfZGVmYXVsdCIsICJSZWFjdCIsICJpbXBvcnRfcmVhY3QiLCAidmFsdWUiLCAiZ2VuQmFzZVN0eWxlIiwgInRva2VuIiwgInByZXBhcmVDb21wb25lbnRUb2tlbiIsICJzdHlsZV9kZWZhdWx0IiwgIm1lcmdlIiwgIlJlYWN0IiwgImNsZWFudXAiLCAiX19yZXN0IiwgIlNsaWRlciIsICJSZWFjdCIsICJyYW5nZSIsICJzdHlsZSIsICJDb250ZXh0X2RlZmF1bHQiLCAic3R5bGVfZGVmYXVsdCIsICJjbGFzc05hbWVzIiwgIndhcm5pbmciLCAibm9kZSIsICJpbmRleCIsICJlc19kZWZhdWx0IiwgImltcG9ydF9yZWFjdCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJjbGFzc05hbWVzIiwgInRva2VuIiwgInZhbHVlIiwgInByZXBhcmVDb21wb25lbnRUb2tlbiIsICJzdHlsZV9kZWZhdWx0IiwgIm1lcmdlIiwgIl9fcmVzdCIsICJSZWFjdCIsICJzdHlsZSIsICJDb21wb25lbnQiLCAic3R5bGVfZGVmYXVsdCIsICJjbGFzc05hbWVzIiwgIlJlYWN0IiwgIlJlYWN0IiwgIkV5ZU91dGxpbmVkIiwgIlJlZkljb24iLCAiRXllT3V0bGluZWRfZGVmYXVsdCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJnZXRPZmZzZXQiLCAibm9kZSIsICJib3giLCAiUmVhY3QiLCAiaW1wb3J0X3JlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgImltcG9ydF9yZWFjdF9kb20iLCAiUmVhY3RET00iLCAiaW1wb3J0X3JlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgIlJlYWN0IiwgImltcG9ydF9yZWFjdCIsICJSZWFjdCIsICJPcGVyYXRpb25zIiwgImdldENvbnRhaW5lciIsICJpY29ucyIsICJ6b29tSW4iLCAiem9vbU91dCIsICJvbktleURvd24iLCAiaGFuZGxlQWN0aXZlIiwgIm9mZnNldCIsICJ0eXBlIiwgImNsYXNzbmFtZXMiLCAiZXNfZGVmYXVsdCIsICJzdHlsZSIsICJpbXBvcnRfcmVhY3QiLCAicmVzZXRUcmFuc2Zvcm0iLCAidXBkYXRlVHJhbnNmb3JtIiwgImRpc3BhdGNoWm9vbUNoYW5nZSIsICJpbXBvcnRfcmVhY3QiLCAib25Nb3VzZURvd24iLCAib25Nb3VzZU1vdmUiLCAib25Nb3VzZVVwIiwgIm9uV2hlZWwiLCAiaW1wb3J0X3JlYWN0IiwgInVzZVN0YXR1cyIsICJvbkxvYWQiLCAiZ2V0SW1nUmVmIiwgImltcG9ydF9yZWFjdCIsICJ1cGRhdGVUb3VjaFBvaW50SW5mbyIsICJvblRvdWNoU3RhcnQiLCAib25Ub3VjaE1vdmUiLCAib25Ub3VjaEVuZCIsICJfZXhjbHVkZWQiLCAiX2V4Y2x1ZGVkMiIsICJQcmV2aWV3SW1hZ2UiLCAidXNlU3RhdHVzIiwgIlJlYWN0IiwgIlByZXZpZXciLCAiaWNvbnMiLCAiZ2V0Q29udGFpbmVyIiwgImNsYXNzbmFtZXMiLCAib25BZnRlckNsb3NlIiwgIm9uWm9vbUluIiwgIm9uWm9vbU91dCIsICJvblJvdGF0ZVJpZ2h0IiwgIm9uUm90YXRlTGVmdCIsICJvbkZsaXBYIiwgIm9uRmxpcFkiLCAib25SZXNldCIsICJvbkFjdGl2ZSIsICJvZmZzZXQiLCAicG9zaXRpb24iLCAib25LZXlEb3duIiwgIm9uRG91YmxlQ2xpY2siLCAiZXNfZGVmYXVsdCIsICJSZWFjdCIsICJpbXBvcnRfcmVhY3QiLCAiUmVhY3QiLCAiX2V4Y2x1ZGVkIiwgIl9leGNsdWRlZDIiLCAiR3JvdXAiLCAiaWNvbnMiLCAiZ2V0Q29udGFpbmVyIiwgInJlZ2lzdGVyIiwgIm9uQ2hhbmdlIiwgImluZGV4IiwgIm9uSW50ZXJuYWxDaGFuZ2UiLCAibmV4dCIsICJwcmV2IiwgIm9uUHJldmlld0Nsb3NlIiwgIlJlYWN0IiwgIl9leGNsdWRlZCIsICJfZXhjbHVkZWQyIiwgIkltYWdlSW50ZXJuYWwiLCAic3R5bGUiLCAiaWNvbnMiLCAidXNlU3RhdHVzIiwgIm9uUHJldmlld0Nsb3NlIiwgImNuIiwgIm9uUHJldmlldyIsICJnZXRPZmZzZXQiLCAiZXNfZGVmYXVsdCIsICJSZWFjdCIsICJSZWFjdCIsICJSb3RhdGVMZWZ0T3V0bGluZWQiLCAiUmVmSWNvbiIsICJSb3RhdGVMZWZ0T3V0bGluZWRfZGVmYXVsdCIsICJSZWFjdCIsICJSb3RhdGVSaWdodE91dGxpbmVkIiwgIlJlZkljb24iLCAiUm90YXRlUmlnaHRPdXRsaW5lZF9kZWZhdWx0IiwgIlJlYWN0IiwgIlN3YXBPdXRsaW5lZCIsICJSZWZJY29uIiwgIlN3YXBPdXRsaW5lZF9kZWZhdWx0IiwgIlJlYWN0IiwgIlpvb21Jbk91dGxpbmVkIiwgIlJlZkljb24iLCAiWm9vbUluT3V0bGluZWRfZGVmYXVsdCIsICJSZWFjdCIsICJab29tT3V0T3V0bGluZWQiLCAiUmVmSWNvbiIsICJab29tT3V0T3V0bGluZWRfZGVmYXVsdCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJwb3NpdGlvbiIsICJ0b2tlbiIsICJwcmVwYXJlQ29tcG9uZW50VG9rZW4iLCAic3R5bGVfZGVmYXVsdCIsICJtZXJnZSIsICJfX3Jlc3QiLCAiUm90YXRlTGVmdE91dGxpbmVkX2RlZmF1bHQiLCAiUm90YXRlUmlnaHRPdXRsaW5lZF9kZWZhdWx0IiwgIlpvb21Jbk91dGxpbmVkX2RlZmF1bHQiLCAiWm9vbU91dE91dGxpbmVkX2RlZmF1bHQiLCAiQ2xvc2VPdXRsaW5lZF9kZWZhdWx0IiwgIkxlZnRPdXRsaW5lZF9kZWZhdWx0IiwgIlJpZ2h0T3V0bGluZWRfZGVmYXVsdCIsICJTd2FwT3V0bGluZWRfZGVmYXVsdCIsICJzdHlsZV9kZWZhdWx0IiwgIl9hIiwgImNsYXNzTmFtZXMiLCAiZ2V0VHJhbnNpdGlvbk5hbWUiLCAiZXNfZGVmYXVsdCIsICJQcmV2aWV3R3JvdXBfZGVmYXVsdCIsICJfX3Jlc3QiLCAiSW1hZ2UiLCAic3R5bGUiLCAid2FybmluZyIsICJzdHlsZV9kZWZhdWx0IiwgImNsYXNzTmFtZXMiLCAiZ2V0Q29udGFpbmVyIiwgInJvb3RDbGFzc05hbWUiLCAiRXllT3V0bGluZWRfZGVmYXVsdCIsICJnZXRUcmFuc2l0aW9uTmFtZSIsICJlc19kZWZhdWx0IiwgIlByZXZpZXdHcm91cF9kZWZhdWx0IiwgIlJlYWN0IiwgImltcG9ydF9yZWFjdCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJHcm91cCIsICJzdHlsZV9kZWZhdWx0IiwgImNscyIsICJjbGFzc05hbWVzIiwgIndhcm5pbmciLCAiR3JvdXBfZGVmYXVsdCIsICJSZWFjdCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJ0b2tlbiIsICJtZXJnZSIsICJSZWFjdCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJfX3Jlc3QiLCAidmFsdWUiLCAiaW5kZXgiLCAiSW5wdXRfZGVmYXVsdCIsICJjbGFzc05hbWVzIiwgIl9fcmVzdCIsICJpbmRleCIsICJsZW5ndGgiLCAidmFsdWUiLCAidHlwZSIsICJ3YXJuaW5nIiwgImNsYXNzTmFtZXMiLCAiUmVhY3QiLCAiaW1wb3J0X3JlYWN0IiwgIlJlYWN0IiwgIkV5ZUludmlzaWJsZU91dGxpbmVkIiwgIlJlZkljb24iLCAiRXllSW52aXNpYmxlT3V0bGluZWRfZGVmYXVsdCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJfX3Jlc3QiLCAiRXllT3V0bGluZWRfZGVmYXVsdCIsICJFeWVJbnZpc2libGVPdXRsaW5lZF9kZWZhdWx0IiwgInByZWZpeENscyIsICJjbGFzc05hbWVzIiwgIklucHV0X2RlZmF1bHQiLCAiUmVhY3QiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiX19yZXN0IiwgIlNlYXJjaE91dGxpbmVkX2RlZmF1bHQiLCAiY2xvbmVFbGVtZW50IiwgImJ1dHRvbl9kZWZhdWx0IiwgImNscyIsICJjbGFzc05hbWVzIiwgIklucHV0X2RlZmF1bHQiLCAiUmVhY3QiLCAiaW1wb3J0X3JlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgImltcG9ydF9jbGFzc25hbWVzIiwgImltcG9ydF9yZWFjdCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJSZWFjdCIsICJub2RlIiwgInN0eWxlIiwgIl9leGNsdWRlZCIsICJ2YWx1ZSIsICJvblJlc2l6ZSIsICJzdHlsZSIsICJvbkludGVybmFsQ2hhbmdlIiwgImZpeEZpcmVmb3hBdXRvU2Nyb2xsIiwgInN0YXJ0UmVzaXplIiwgImNsZWFuUmFmIiwgIm9uSW50ZXJuYWxSZXNpemUiLCAiY2xhc3NOYW1lcyIsICJfZXhjbHVkZWQiLCAiUmVhY3QiLCAic3R5bGUiLCAiY2xhc3NOYW1lcyIsICJvblJlc2l6ZSIsICJ2YWx1ZSIsICJnZXRUZXh0QXJlYSIsICJmb2N1cyIsICJwcmV2IiwgInRyaWdnZXJDaGFuZ2UiLCAib25JbnRlcm5hbENvbXBvc2l0aW9uU3RhcnQiLCAib25JbnRlcm5hbENvbXBvc2l0aW9uRW5kIiwgIm9uSW50ZXJuYWxDaGFuZ2UiLCAiaGFuZGxlS2V5RG93biIsICJoYW5kbGVGb2N1cyIsICJoYW5kbGVCbHVyIiwgImhhbmRsZVJlc2V0IiwgImNsc3giLCAiaGFuZGxlUmVzaXplIiwgImVzX2RlZmF1bHQiLCAidG9rZW4iLCAibWVyZ2UiLCAiX19yZXN0IiwgIlRleHRBcmVhIiwgInN0eWxlIiwgIm9uUmVzaXplIiwgIl9hIiwgImVzX2RlZmF1bHQiLCAiY2xhc3NOYW1lcyIsICJUZXh0QXJlYV9kZWZhdWx0IiwgIklucHV0IiwgIklucHV0X2RlZmF1bHQiLCAiR3JvdXBfZGVmYXVsdCIsICJUZXh0QXJlYV9kZWZhdWx0IiwgIlJlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgIlJlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgIlJlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgImltcG9ydF9yZWFjdCIsICJ1c2VUcmFuc2l0aW9uRHVyYXRpb24iLCAibm93IiwgIl9leGNsdWRlZCIsICJMaW5lIiwgInN0eWxlIiwgImNsYXNzTmFtZXMiLCAiaW5kZXgiLCAiUmVhY3QiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiUmVhY3QiLCAidXVpZCIsICJpc0Jyb3dzZXJDbGllbnQiLCAiZ2V0VVVJRCIsICJ1c2VJZF9kZWZhdWx0IiwgIlJlYWN0IiwgIkJsb2NrIiwgImdldENpcmNsZVN0eWxlIiwgIm9mZnNldCIsICJfZXhjbHVkZWQiLCAidG9BcnJheSIsICJ2YWx1ZSIsICJDaXJjbGUiLCAic3R5bGUiLCAidXNlSWRfZGVmYXVsdCIsICJnZXRTdG9rZUxpc3QiLCAiaW5kZXgiLCAiZ2V0U3RlcFN0b2tlTGlzdCIsICJjbGFzc05hbWVzIiwgInR5cGUiLCAiQ2lyY2xlIiwgInR5cGUiLCAiY2xhc3NOYW1lcyIsICJub2RlIiwgIkNpcmNsZV9kZWZhdWx0IiwgIlJlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgImdlbkJhc2VTdHlsZSIsICJ0b2tlbiIsICJwcmVwYXJlQ29tcG9uZW50VG9rZW4iLCAic3R5bGVfZGVmYXVsdCIsICJtZXJnZSIsICJfX3Jlc3QiLCAidmFsdWUiLCAiZnJvbSIsICJiYWNrZ3JvdW5kIiwgIkxpbmUiLCAid2FybmluZyIsICJjbGFzc05hbWVzIiwgIkxpbmVfZGVmYXVsdCIsICJSZWFjdCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJTdGVwcyIsICJjbGFzc05hbWVzIiwgIlN0ZXBzX2RlZmF1bHQiLCAiX19yZXN0IiwgInR5cGUiLCAiZm9ybWF0IiwgInN0eWxlIiwgIl9fcmVzdCIsICJzdHlsZV9kZWZhdWx0IiwgIm51bWJlciIsICJDbG9zZUNpcmNsZUZpbGxlZF9kZWZhdWx0IiwgIkNsb3NlT3V0bGluZWRfZGVmYXVsdCIsICJDaGVja0NpcmNsZUZpbGxlZF9kZWZhdWx0IiwgIkNoZWNrT3V0bGluZWRfZGVmYXVsdCIsICJjbGFzc05hbWVzIiwgIndhcm5pbmciLCAiU3RlcHNfZGVmYXVsdCIsICJMaW5lX2RlZmF1bHQiLCAiQ2lyY2xlX2RlZmF1bHQiLCAicHJvZ3Jlc3NfZGVmYXVsdCIsICJSZWFjdCIsICJEZWxldGVPdXRsaW5lZCIsICJSZWZJY29uIiwgIkRlbGV0ZU91dGxpbmVkX2RlZmF1bHQiLCAiUmVhY3QiLCAiRG93bmxvYWRPdXRsaW5lZCIsICJSZWZJY29uIiwgIkRvd25sb2FkT3V0bGluZWRfZGVmYXVsdCIsICJSZWFjdCIsICJyZW5kZXIiLCAiRmlsZVR3b1RvbmUiLCAiUmVmSWNvbiIsICJGaWxlVHdvVG9uZV9kZWZhdWx0IiwgIlJlYWN0IiwgIlBhcGVyQ2xpcE91dGxpbmVkIiwgIlJlZkljb24iLCAiUGFwZXJDbGlwT3V0bGluZWRfZGVmYXVsdCIsICJSZWFjdCIsICJyZW5kZXIiLCAiUGljdHVyZVR3b1RvbmUiLCAiUmVmSWNvbiIsICJQaWN0dXJlVHdvVG9uZV9kZWZhdWx0IiwgIlJlYWN0IiwgIlVwbG9hZE91dGxpbmVkIiwgIlJlZkljb24iLCAiVXBsb2FkT3V0bGluZWRfZGVmYXVsdCIsICJSZWFjdCIsICJSZWFjdCIsICJpbXBvcnRfcmVhY3RfZG9tIiwgImltcG9ydF9jbGFzc25hbWVzIiwgImltcG9ydF9yZWFjdCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJpbXBvcnRfcmVhY3QiLCAidHlwZSIsICJ2YWx1ZSIsICJfdHJhdmVyc2VGaWxlVHJlZSIsICJ0cmF2ZXJzZUZpbGVUcmVlIiwgImluZGV4IiwgInVpZCIsICJfZXhjbHVkZWQiLCAiQWpheFVwbG9hZGVyIiwgInVpZCIsICJub2RlIiwgIm1ldGhvZCIsICJvblByb2dyZXNzIiwgIm9uU3VjY2VzcyIsICJvbkVycm9yIiwgInJlbmRlciIsICJjbGFzc05hbWVzIiwgInN0eWxlIiwgImNscyIsICJjbHN4IiwgIlJlYWN0IiwgImVtcHR5IiwgIlVwbG9hZCIsICJub2RlIiwgInJlbmRlciIsICJSZWFjdCIsICJlc19kZWZhdWx0IiwgInRva2VuIiwgInRva2VuIiwgInRva2VuIiwgIm1vdGlvbl9kZWZhdWx0IiwgInRva2VuIiwgInRva2VuIiwgImdlbkJhc2VTdHlsZSIsICJ0b2tlbiIsICJwcmVwYXJlQ29tcG9uZW50VG9rZW4iLCAic3R5bGVfZGVmYXVsdCIsICJtZXJnZSIsICJtb3Rpb25fZGVmYXVsdCIsICJSZWFjdCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJ1aWQiLCAidXJsIiwgInR5cGUiLCAiUmVhY3QiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAic3R5bGUiLCAibG9jYWxlIiwgImNsYXNzTmFtZXMiLCAiRGVsZXRlT3V0bGluZWRfZGVmYXVsdCIsICJEb3dubG9hZE91dGxpbmVkX2RlZmF1bHQiLCAiRXllT3V0bGluZWRfZGVmYXVsdCIsICJlc19kZWZhdWx0IiwgInByb2dyZXNzX2RlZmF1bHQiLCAibm9kZSIsICJsb2NhbGUiLCAiTG9hZGluZ091dGxpbmVkX2RlZmF1bHQiLCAiUGljdHVyZVR3b1RvbmVfZGVmYXVsdCIsICJGaWxlVHdvVG9uZV9kZWZhdWx0IiwgIlBhcGVyQ2xpcE91dGxpbmVkX2RlZmF1bHQiLCAicHJlZml4Q2xzIiwgImJ1dHRvbl9kZWZhdWx0IiwgImNsb25lRWxlbWVudCIsICJjbGFzc05hbWVzIiwgImVzX2RlZmF1bHQiLCAidmFsdWUiLCAiaXNJbWFnZVVybCIsICJ0eXBlIiwgInN0eWxlIiwgInVwbG9hZCIsICJ3YXJuaW5nIiwgImluZGV4IiwgInN0eWxlX2RlZmF1bHQiLCAiZW5fVVNfZGVmYXVsdCIsICJjbGFzc05hbWVzIiwgImVzX2RlZmF1bHQiLCAiVXBsb2FkIiwgIlVwbG9hZF9kZWZhdWx0IiwgIl9fcmVzdCIsICJzdHlsZSIsICJVcGxvYWRfZGVmYXVsdCIsICJVcGxvYWQiLCAiVXBsb2FkX2RlZmF1bHQiLCAiaW1wb3J0X3JlYWN0IiwgImltcG9ydF9yZWFjdCIsICJpbXBvcnRfcmVhY3QiLCAiaW1wb3J0X2pzeF9ydW50aW1lIiwgImdyb3VwIiwgImluZGV4IiwgIlJlYWN0IiwgImltcG9ydF9yZWFjdCIsICJpbXBvcnRfcmVhY3QiLCAiaW1wb3J0X2pzeF9ydW50aW1lIiwgInZhbHVlIiwgImltcG9ydF9qc3hfcnVudGltZSIsICJ2YWx1ZSIsICJpbXBvcnRfanN4X3J1bnRpbWUiLCAidmFsdWUiLCAiaW1wb3J0X2pzeF9ydW50aW1lIiwgIlRleHRBcmVhIiwgInZhbHVlIiwgImltcG9ydF9yZWFjdCIsICJpbXBvcnRfanN4X3J1bnRpbWUiLCAiaW1wb3J0X2pzeF9ydW50aW1lIiwgInZhbHVlIiwgIlVwbG9hZE91dGxpbmVkX2RlZmF1bHQiLCAiaW1wb3J0X2pzeF9ydW50aW1lIiwgImFwaSIsICJSZWFjdCIsICJub2RlIiwgInZhbHVlIiwgImltcG9ydF9qc3hfcnVudGltZSIsICJDbG9zZU91dGxpbmVkX2RlZmF1bHQiLCAiaW1wb3J0X2pzeF9ydW50aW1lIiwgImFwcCIsICJhcHAiLCAiYXBwIiwgImFwaSIsICIkZWwiLCAicHJvbXB0c0Zyb21TRFBQUEJhY2tlbmQiLCAibm9kZSIsICJhcHAiLCAiJGVsIiwgImFwaSIsICJtb2R1bGUiXQp9Cg== +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzL21vY2hhL25vZGVfbW9kdWxlcy9yb2xsdXAtcGx1Z2luLW5vZGUtZ2xvYmFscy9zcmMvZ2xvYmFsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9ub2RlX21vZHVsZXMvcHJvY2Vzcy1lczYvYnJvd3Nlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbm9kZV9tb2R1bGVzL2Jyb3dzZXItc3Rkb3V0L2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9saWIvYnJvd3Nlci9wYXJzZS1xdWVyeS5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbGliL2Jyb3dzZXIvaGlnaGxpZ2h0LXRhZ3MuanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL25vZGVfbW9kdWxlcy9lc2NhcGUtc3RyaW5nLXJlZ2V4cC9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbm9kZV9tb2R1bGVzL2RpZmYvbGliL2RpZmYvYmFzZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbm9kZV9tb2R1bGVzL2RpZmYvbGliL2RpZmYvY2hhcmFjdGVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9ub2RlX21vZHVsZXMvZGlmZi9saWIvdXRpbC9wYXJhbXMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL25vZGVfbW9kdWxlcy9kaWZmL2xpYi9kaWZmL3dvcmQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL25vZGVfbW9kdWxlcy9kaWZmL2xpYi9kaWZmL2xpbmUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL25vZGVfbW9kdWxlcy9kaWZmL2xpYi9kaWZmL3NlbnRlbmNlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9ub2RlX21vZHVsZXMvZGlmZi9saWIvZGlmZi9jc3MuanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL25vZGVfbW9kdWxlcy9kaWZmL2xpYi9kaWZmL2pzb24uanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL25vZGVfbW9kdWxlcy9kaWZmL2xpYi9kaWZmL2FycmF5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9ub2RlX21vZHVsZXMvZGlmZi9saWIvcGF0Y2gvcGFyc2UuanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL25vZGVfbW9kdWxlcy9kaWZmL2xpYi91dGlsL2Rpc3RhbmNlLWl0ZXJhdG9yLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9ub2RlX21vZHVsZXMvZGlmZi9saWIvcGF0Y2gvYXBwbHkuanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL25vZGVfbW9kdWxlcy9kaWZmL2xpYi9wYXRjaC9jcmVhdGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL25vZGVfbW9kdWxlcy9kaWZmL2xpYi91dGlsL2FycmF5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9ub2RlX21vZHVsZXMvZGlmZi9saWIvcGF0Y2gvbWVyZ2UuanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL25vZGVfbW9kdWxlcy9kaWZmL2xpYi9wYXRjaC9yZXZlcnNlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9ub2RlX21vZHVsZXMvZGlmZi9saWIvY29udmVydC9kbXAuanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL25vZGVfbW9kdWxlcy9kaWZmL2xpYi9jb252ZXJ0L3htbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbm9kZV9tb2R1bGVzL2RpZmYvbGliL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9ub2RlX21vZHVsZXMvbXMvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL25vZGVfbW9kdWxlcy9idWZmZXItZXM2L2Jhc2U2NC5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbm9kZV9tb2R1bGVzL2J1ZmZlci1lczYvaWVlZTc1NC5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbm9kZV9tb2R1bGVzL2J1ZmZlci1lczYvaXNBcnJheS5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbm9kZV9tb2R1bGVzL2J1ZmZlci1lczYvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL25vZGVfbW9kdWxlcy9yb2xsdXAtcGx1Z2luLW5vZGUtZ2xvYmFscy9zcmMvYnJvd3Nlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbm9kZV9tb2R1bGVzL2hlL2hlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9saWIvdXRpbHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL25vZGVfbW9kdWxlcy9sb2ctc3ltYm9scy9icm93c2VyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9saWIvcGVuZGluZy5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbm9kZV9tb2R1bGVzL2RlYnVnL25vZGVfbW9kdWxlcy9tcy9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9jb21tb24uanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvYnJvd3Nlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbGliL2Vycm9ycy5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbGliL3J1bm5hYmxlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9saWIvaG9vay5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbGliL3N1aXRlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9saWIvcnVubmVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9saWIvcmVwb3J0ZXJzL2Jhc2UuanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL2xpYi9yZXBvcnRlcnMvZG90LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9saWIvcmVwb3J0ZXJzL2RvYy5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbGliL3JlcG9ydGVycy90YXAuanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL2xpYi9yZXBvcnRlcnMvanNvbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbGliL3JlcG9ydGVycy9odG1sLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9saWIvcmVwb3J0ZXJzL2xpc3QuanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL2xpYi9yZXBvcnRlcnMvbWluLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9saWIvcmVwb3J0ZXJzL3NwZWMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL2xpYi9yZXBvcnRlcnMvbnlhbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbGliL3JlcG9ydGVycy94dW5pdC5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbGliL3JlcG9ydGVycy9tYXJrZG93bi5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbGliL3JlcG9ydGVycy9wcm9ncmVzcy5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbGliL3JlcG9ydGVycy9sYW5kaW5nLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9saWIvcmVwb3J0ZXJzL2pzb24tc3RyZWFtLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9saWIvcmVwb3J0ZXJzL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9saWIvc3RhdHMtY29sbGVjdG9yLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9saWIvdGVzdC5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbGliL2ludGVyZmFjZXMvY29tbW9uLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9saWIvaW50ZXJmYWNlcy9iZGQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL2xpYi9pbnRlcmZhY2VzL3RkZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbGliL2ludGVyZmFjZXMvcXVuaXQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL2xpYi9pbnRlcmZhY2VzL2V4cG9ydHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL21vY2hhL2xpYi9pbnRlcmZhY2VzL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9saWIvY29udGV4dC5qcyIsICIuLi9ub2RlX21vZHVsZXMvbW9jaGEvbGliL21vY2hhLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tb2NoYS9icm93c2VyLWVudHJ5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yZWFjdC9janMvcmVhY3QuZGV2ZWxvcG1lbnQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JlYWN0L2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9zY2hlZHVsZXIvY2pzL3NjaGVkdWxlci5kZXZlbG9wbWVudC5qcyIsICIuLi9ub2RlX21vZHVsZXMvc2NoZWR1bGVyL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vY2pzL3JlYWN0LWRvbS5kZXZlbG9wbWVudC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vY2xpZW50LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9jbGFzc25hbWVzL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1pcy9janMvcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWlzL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yZWFjdC9janMvcmVhY3QtanN4LXJ1bnRpbWUuZGV2ZWxvcG1lbnQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JlYWN0L2pzeC1ydW50aW1lLmpzIiwgIi4uL3R5cGVzY3JpcHRzL3Rlc3QvbW9jaGEvY29tZnkvY29tZnkudGVzdC5tdHMiLCAiLi4vbm9kZV9tb2R1bGVzL2Zhc3QtanNvbi1wYXRjaC9tb2R1bGUvY29yZS5tanMiLCAiLi4vbm9kZV9tb2R1bGVzL2Zhc3QtanNvbi1wYXRjaC9tb2R1bGUvaGVscGVycy5tanMiLCAiLi4vbm9kZV9tb2R1bGVzL2Zhc3QtanNvbi1wYXRjaC9tb2R1bGUvZHVwbGV4Lm1qcyIsICIuLi9ub2RlX21vZHVsZXMvZmFzdC1qc29uLXBhdGNoL2luZGV4Lm1qcyIsICIuLi90eXBlc2NyaXB0cy9zcmMvY29tbW9uL3N0b3JlL3N0b3JlLm10cyIsICIuLi90eXBlc2NyaXB0cy9zcmMvc3RvcmUvcGFnZS5tdHMiLCAiLi4vdHlwZXNjcmlwdHMvc3JjL3N0b3JlL3Bob3Rvc2hvcC5tdHMiLCAiLi4vdHlwZXNjcmlwdHMvc3JjL2NvbW1vbi9zdG9yZS9zdG9yZS1tYXAubXRzIiwgIi4uL3R5cGVzY3JpcHRzL21vZHVsZXMvY29tZnkvc3JjL2NvbWZ5LWdsb2JhbHMubXRzIiwgIi4uL3R5cGVzY3JpcHRzL21vZHVsZXMvY29tZnkvcGhvdG9zaG9wTW9kZWxzLm10cyIsICIuLi90eXBlc2NyaXB0cy9zcmMvY29tbW9uL2VuLm10cyIsICIuLi90eXBlc2NyaXB0cy9zcmMvY29tbW9uL3poLWNuLm10cyIsICIuLi90eXBlc2NyaXB0cy9zcmMvY29tbW9uL2kxOG4ubXRzIiwgIi4uL3R5cGVzY3JpcHRzL3NyYy9jb21tb24vcGhvdG9zaG9wL3NwZWNpYWxMYXllci5tdHMiLCAiLi4vdHlwZXNjcmlwdHMvc3JjL2NvbW1vbi9waG90b3Nob3AvaWRlbnRpZnkubXRzIiwgIi4uL3R5cGVzY3JpcHRzL3NyYy9jb21tb24vc2RwcHBYLm10cyIsICIuLi90eXBlc2NyaXB0cy9zcmMvc3RvcmUvaGVscGVycy5tdHMiLCAiLi4vdHlwZXNjcmlwdHMvbW9kdWxlcy9jb21meS9zcmMvdXRpbC5tdHMiLCAiLi4vdHlwZXNjcmlwdHMvc3JjL2NvbW1vbi9mbHVzaGVyLm10cyIsICIuLi90eXBlc2NyaXB0cy9zcmMvY29tbW9uL3NvY2tldC9taXhpbnMvTWFpblN0b3JlSG9sZGVyLm10cyIsICIuLi90eXBlc2NyaXB0cy9zcmMvY29tbW9uL3NvY2tldC9taXhpbnMvU3RvcmVNYXBIb2xkZXIubXRzIiwgIi4uL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tcGFyc2VyL2J1aWxkL2VzbS9jb21tb25zLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tcGFyc2VyL2J1aWxkL2VzbS9lbmNvZGVQYWNrZXQuYnJvd3Nlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvZW5naW5lLmlvLXBhcnNlci9idWlsZC9lc20vY29udHJpYi9iYXNlNjQtYXJyYXlidWZmZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2VuZ2luZS5pby1wYXJzZXIvYnVpbGQvZXNtL2RlY29kZVBhY2tldC5icm93c2VyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tcGFyc2VyL2J1aWxkL2VzbS9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHNvY2tldC5pby9jb21wb25lbnQtZW1pdHRlci9saWIvZXNtL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2J1aWxkL2VzbS9nbG9iYWxzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2J1aWxkL2VzbS91dGlsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2J1aWxkL2VzbS9jb250cmliL3BhcnNlcXMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2VuZ2luZS5pby1jbGllbnQvYnVpbGQvZXNtL3RyYW5zcG9ydC5qcyIsICIuLi9ub2RlX21vZHVsZXMvZW5naW5lLmlvLWNsaWVudC9idWlsZC9lc20vdHJhbnNwb3J0cy9wb2xsaW5nLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2J1aWxkL2VzbS9jb250cmliL2hhcy1jb3JzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2J1aWxkL2VzbS90cmFuc3BvcnRzL3BvbGxpbmcteGhyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2J1aWxkL2VzbS90cmFuc3BvcnRzL3dlYnNvY2tldC5qcyIsICIuLi9ub2RlX21vZHVsZXMvZW5naW5lLmlvLWNsaWVudC9idWlsZC9lc20vdHJhbnNwb3J0cy93ZWJ0cmFuc3BvcnQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2VuZ2luZS5pby1jbGllbnQvYnVpbGQvZXNtL3RyYW5zcG9ydHMvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL2VuZ2luZS5pby1jbGllbnQvYnVpbGQvZXNtL2NvbnRyaWIvcGFyc2V1cmkuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2VuZ2luZS5pby1jbGllbnQvYnVpbGQvZXNtL3NvY2tldC5qcyIsICIuLi9ub2RlX21vZHVsZXMvZW5naW5lLmlvLWNsaWVudC9idWlsZC9lc20vaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL3NvY2tldC5pby1jbGllbnQvYnVpbGQvZXNtL3VybC5qcyIsICIuLi9ub2RlX21vZHVsZXMvc29ja2V0LmlvLXBhcnNlci9idWlsZC9lc20vaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL3NvY2tldC5pby1wYXJzZXIvYnVpbGQvZXNtL2lzLWJpbmFyeS5qcyIsICIuLi9ub2RlX21vZHVsZXMvc29ja2V0LmlvLXBhcnNlci9idWlsZC9lc20vYmluYXJ5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9zb2NrZXQuaW8tY2xpZW50L2J1aWxkL2VzbS9vbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvc29ja2V0LmlvLWNsaWVudC9idWlsZC9lc20vc29ja2V0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9zb2NrZXQuaW8tY2xpZW50L2J1aWxkL2VzbS9jb250cmliL2JhY2tvMi5qcyIsICIuLi9ub2RlX21vZHVsZXMvc29ja2V0LmlvLWNsaWVudC9idWlsZC9lc20vbWFuYWdlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvc29ja2V0LmlvLWNsaWVudC9idWlsZC9lc20vaW5kZXguanMiLCAiLi4vc2RwcHBfcHl0aG9uL3ZlcnNpb24udHh0IiwgIi4uL3R5cGVzY3JpcHRzL3NyYy9jb21tb24vdmVyc2lvbi5tdHMiLCAiLi4vdHlwZXNjcmlwdHMvc3JjL2NvbW1vbi9zb2NrZXQvU29ja2V0Lm10cyIsICIuLi90eXBlc2NyaXB0cy9zcmMvc29ja2V0L1Bob3Rvc2hvcENhbGxlci5tdHMiLCAiLi4vdHlwZXNjcmlwdHMvbW9kdWxlcy9jb21meS9zcmMvZGVmYXVsdEdyYXBoLm10cyIsICIuLi90eXBlc2NyaXB0cy9tb2R1bGVzL2NvbWZ5L3NyYy9ncmFwaC10by1mb3JtLm10cyIsICIuLi90eXBlc2NyaXB0cy9tb2R1bGVzL2NvbWZ5L3NyYy9QcmV2aWV3U2VuZGVyLm10cyIsICIuLi90eXBlc2NyaXB0cy9tb2R1bGVzL2NvbWZ5L3NyYy9zb2NrZXQvV29ya2Zsb3dDYWxsZWUubXRzIiwgIi4uL3R5cGVzY3JpcHRzL21vZHVsZXMvY29tZnkvc3JjL3NvY2tldC9Db21meVNvY2tldC5tdHMiLCAiLi4vdHlwZXNjcmlwdHMvc3JjL2NvbW1vbi9zdHJpbmctdXRpbC5tdHMiLCAiLi4vdHlwZXNjcmlwdHMvbW9kdWxlcy9jb21meS9zcmMvbGl0ZWdyYXBoL2ZlLXdpZGdldHMubXRzIiwgIi4uL3R5cGVzY3JpcHRzL21vZHVsZXMvY29tZnkvc3JjL2NvbWZ5LW5vZGVzL1NEUFBQTm9kZS5tdHMiLCAiLi4vdHlwZXNjcmlwdHMvbW9kdWxlcy9jb21meS9zcmMvY29tZnktbm9kZXMvU0RQUFBEb3dubG9hZGFibGVOb2RlLm10cyIsICIuLi90eXBlc2NyaXB0cy9tb2R1bGVzL2NvbWZ5L3NyYy9jb21meS1ub2Rlcy9JbnB1dHMubXRzIiwgIi4uL3R5cGVzY3JpcHRzL21vZHVsZXMvY29tZnkvc3JjL2NvbWZ5LW5vZGVzL1NEUFBQTm9kZVdpdGhJbnB1dC5tdHMiLCAiLi4vdHlwZXNjcmlwdHMvbW9kdWxlcy9jb21meS9zcmMvY29tZnktbm9kZXMvbm9kZXMubXRzIiwgIi4uL3R5cGVzY3JpcHRzL21vZHVsZXMvY29tZnkvc3JjL2NvbWZ5LW5vZGVzL2xlZ2FjeS1ub2Rlcy5tdHMiLCAiLi4vdHlwZXNjcmlwdHMvbW9kdWxlcy9jb21meS9zcmMvbGl0ZWdyYXBoL25vZGUtd3JhcHBlci5tdHMiLCAiLi4vdHlwZXNjcmlwdHMvbW9kdWxlcy9jb21meS9zcmMvcG9wdXAvc2RwcHBQb3B1cC5tdHMiLCAiLi4vdHlwZXNjcmlwdHMvbW9kdWxlcy9jb21meS9zcmMvcG9wdXAvQ29tZnlQb3B1cC5jc3MiLCAiLi4vdHlwZXNjcmlwdHMvbW9kdWxlcy9jb21meS9zcmMvcG9wdXAvdHN4L0NvbWZ5UG9wdXAudHN4IiwgIi4uL3R5cGVzY3JpcHRzL21vZHVsZXMvY29tZnkvc3JjL3BvcHVwL3RzeC9TZXR0aW5ncy50c3giLCAiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXJlc2l6ZS1vYnNlcnZlci9lcy9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy11dGlsL2VzL1JlYWN0L2lzRnJhZ21lbnQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvQ2hpbGRyZW4vdG9BcnJheS5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdXRpbC9lcy93YXJuaW5nLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b1ByaW1pdGl2ZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Qcm9wZXJ0eUtleS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHkuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvRG9tL2ZpbmRET01Ob2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy11dGlsL2VzL3JlZi5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9ob29rcy91c2VNZW1vLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1yZXNpemUtb2JzZXJ2ZXIvZXMvU2luZ2xlT2JzZXJ2ZXIvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXJlc2l6ZS1vYnNlcnZlci9lcy9Db2xsZWN0aW9uLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yZXNpemUtb2JzZXJ2ZXItcG9seWZpbGwvZGlzdC9SZXNpemVPYnNlcnZlci5lcy5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtcmVzaXplLW9ic2VydmVyL2VzL3V0aWxzL29ic2VydmVyVXRpbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2suanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zZXRQcm90b3R5cGVPZi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2dldFByb3RvdHlwZU9mLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2Fzc2VydFRoaXNJbml0aWFsaXplZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vcG9zc2libGVDb25zdHJ1Y3RvclJldHVybi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlU3VwZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXJlc2l6ZS1vYnNlcnZlci9lcy9TaW5nbGVPYnNlcnZlci9Eb21XcmFwcGVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hcnJheUxpa2VUb0FycmF5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hcnJheVdpdGhvdXRIb2xlcy5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaXRlcmFibGVUb0FycmF5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vbm9uSXRlcmFibGVTcHJlYWQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy11dGlsL2VzL3JhZi5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9jb25maWctcHJvdmlkZXIvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2FycmF5V2l0aEhvbGVzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pdGVyYWJsZVRvQXJyYXlMaW1pdC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vbm9uSXRlcmFibGVSZXN0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZW1vdGlvbi9oYXNoL2Rpc3QvaGFzaC5icm93c2VyLmVzbS5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9Eb20vY2FuVXNlRG9tLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy11dGlsL2VzL0RvbS9jb250YWlucy5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9Eb20vZHluYW1pY0NTUy5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vY3NzaW5qcy9lcy9ob29rcy91c2VDYWNoZVRva2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllcy5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9pc0VxdWFsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9jc3NpbmpzL2VzL1N0eWxlQ29udGV4dC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vY3NzaW5qcy9lcy9DYWNoZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vY3NzaW5qcy9lcy90aGVtZS9jYWxjL0NTU0NhbGN1bGF0b3IuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2Nzc2luanMvZXMvdGhlbWUvVGhlbWVDYWNoZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vY3NzaW5qcy9lcy90aGVtZS9UaGVtZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vY3NzaW5qcy9lcy90aGVtZS9jcmVhdGVUaGVtZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vY3NzaW5qcy9lcy91dGlsL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9jc3NpbmpzL2VzL3V0aWwvY3NzLXZhcmlhYmxlcy5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vY3NzaW5qcy9lcy9ob29rcy91c2VHbG9iYWxDYWNoZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9ob29rcy91c2VMYXlvdXRFZmZlY3QuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2Nzc2luanMvZXMvaG9va3MvdXNlQ29tcGF0aWJsZUluc2VydGlvbkVmZmVjdC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vY3NzaW5qcy9lcy9ob29rcy91c2VFZmZlY3RDbGVhbnVwUmVnaXN0ZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2Nzc2luanMvZXMvaG9va3MvdXNlSE1SLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9jc3NpbmpzL2VzL2hvb2tzL3VzZUNTU1ZhclJlZ2lzdGVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9jc3NpbmpzL2VzL2hvb2tzL3VzZVN0eWxlUmVnaXN0ZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BlbW90aW9uL3VuaXRsZXNzL2Rpc3QvdW5pdGxlc3MuYnJvd3Nlci5lc20uanMiLCAiLi4vbm9kZV9tb2R1bGVzL3N0eWxpcy9zcmMvRW51bS5qcyIsICIuLi9ub2RlX21vZHVsZXMvc3R5bGlzL3NyYy9VdGlsaXR5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9zdHlsaXMvc3JjL1Rva2VuaXplci5qcyIsICIuLi9ub2RlX21vZHVsZXMvc3R5bGlzL3NyYy9QYXJzZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3N0eWxpcy9zcmMvU2VyaWFsaXplci5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vY3NzaW5qcy9lcy9saW50ZXJzL3V0aWxzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9jc3NpbmpzL2VzL2xpbnRlcnMvY29udGVudFF1b3Rlc0xpbnRlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vY3NzaW5qcy9lcy9saW50ZXJzL2hhc2hlZEFuaW1hdGlvbkxpbnRlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vY3NzaW5qcy9lcy91dGlsL2NhY2hlTWFwVXRpbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vY3NzaW5qcy9lcy9leHRyYWN0U3R5bGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2Nzc2luanMvZXMvS2V5ZnJhbWVzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9jc3NpbmpzL2VzL3RyYW5zZm9ybWVycy9sZWdhY3lMb2dpY2FsUHJvcGVydGllcy5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvY29tcG9uZW50cy9Db250ZXh0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0FycmF5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy11dGlsL2VzL3V0aWxzL2dldC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdXRpbC9lcy91dGlscy9zZXQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvX3V0aWwvd2FybmluZy5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9mb3JtL3ZhbGlkYXRlTWVzc2FnZXNDb250ZXh0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2xvY2FsZS9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtcGFnaW5hdGlvbi9lcy9sb2NhbGUvZW5fVVMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXBpY2tlci9lcy9sb2NhbGUvY29tbW9uLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1waWNrZXIvZXMvbG9jYWxlL2VuX1VTLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3RpbWUtcGlja2VyL2xvY2FsZS9lbl9VUy5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9kYXRlLXBpY2tlci9sb2NhbGUvZW5fVVMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvY2FsZW5kYXIvbG9jYWxlL2VuX1VTLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2xvY2FsZS9lbl9VUy5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9tb2RhbC9sb2NhbGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvbG9jYWxlL2NvbnRleHQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvbG9jYWxlL3VzZUxvY2FsZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy90aGVtZS9jb250ZXh0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3RoZW1lL3RoZW1lcy9zZWVkLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9mYXN0LWNvbG9yL2VzL0Zhc3RDb2xvci5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vY29sb3JzL2VzL2dlbmVyYXRlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9jb2xvcnMvZXMvcHJlc2V0cy5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy90aGVtZS90aGVtZXMvc2hhcmVkL2dlbkNvbG9yTWFwVG9rZW4uanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvdGhlbWUvdGhlbWVzL3NoYXJlZC9nZW5SYWRpdXMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvdGhlbWUvdGhlbWVzL3NoYXJlZC9nZW5Db21tb25NYXBUb2tlbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy90aGVtZS90aGVtZXMvc2hhcmVkL2dlbkNvbnRyb2xIZWlnaHQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvdGhlbWUvdGhlbWVzL3NoYXJlZC9nZW5Gb250U2l6ZXMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvdGhlbWUvdGhlbWVzL3NoYXJlZC9nZW5Gb250TWFwVG9rZW4uanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvdGhlbWUvdGhlbWVzL3NoYXJlZC9nZW5TaXplTWFwVG9rZW4uanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvdGhlbWUvdGhlbWVzL2RlZmF1bHQvY29sb3JBbGdvcml0aG0uanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvdGhlbWUvdGhlbWVzL2RlZmF1bHQvY29sb3JzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3RoZW1lL3RoZW1lcy9kZWZhdWx0L2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3RoZW1lL3RoZW1lcy9kZWZhdWx0L3RoZW1lLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2NvbmZpZy1wcm92aWRlci9jb250ZXh0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2NvbmZpZy1wcm92aWRlci9jc3NWYXJpYWJsZXMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvY29uZmlnLXByb3ZpZGVyL0Rpc2FibGVkQ29udGV4dC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9jb25maWctcHJvdmlkZXIvaG9va3MvdXNlQ29uZmlnLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2NvbmZpZy1wcm92aWRlci9TaXplQ29udGV4dC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vY3NzaW5qcy11dGlscy9lcy91dGlsL2dlblN0eWxlVXRpbHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2Nzc2luanMtdXRpbHMvZXMvdXRpbC9jYWxjL2NhbGN1bGF0b3IuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2Nzc2luanMtdXRpbHMvZXMvdXRpbC9jYWxjL0NTU0NhbGN1bGF0b3IuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2Nzc2luanMtdXRpbHMvZXMvdXRpbC9jYWxjL051bUNhbGN1bGF0b3IuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2Nzc2luanMtdXRpbHMvZXMvdXRpbC9jYWxjL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9jc3NpbmpzLXV0aWxzL2VzL3V0aWwvZ2V0Q29tcFZhclByZWZpeC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9ob29rcy91c2VFdmVudC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9ob29rcy91c2VTdGF0ZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9ob29rcy91c2VNZXJnZWRTdGF0ZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vY3NzaW5qcy11dGlscy9lcy91dGlsL2dldENvbXBvbmVudFRva2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9jc3NpbmpzLXV0aWxzL2VzL3V0aWwvc3RhdGlzdGljLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9jc3NpbmpzLXV0aWxzL2VzL3V0aWwvZ2V0RGVmYXVsdENvbXBvbmVudFRva2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9jc3NpbmpzLXV0aWxzL2VzL3V0aWwvbWF4bWluLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9jc3NpbmpzLXV0aWxzL2VzL191dGlsL2hvb2tzL3VzZVVuaXF1ZU1lbW8uanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2Nzc2luanMtdXRpbHMvZXMvaG9va3MvdXNlQ1NQLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3RoZW1lL2ludGVyZmFjZS9wcmVzZXRDb2xvcnMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvdGhlbWUvdXNlVG9rZW4uanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvdmVyc2lvbi92ZXJzaW9uLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3ZlcnNpb24vaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvdGhlbWUvdXRpbC9nZXRBbHBoYUNvbG9yLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3RoZW1lL3V0aWwvYWxpYXMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvdGhlbWUvdXRpbC9nZW5TdHlsZVV0aWxzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3N0eWxlL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3RoZW1lL3V0aWwvZ2VuUHJlc2V0Q29sb3IuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvdGhlbWUvdXRpbC91c2VSZXNldEljb25TdHlsZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9jb25maWctcHJvdmlkZXIvaG9va3MvdXNlVGhlbWVLZXkuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvY29uZmlnLXByb3ZpZGVyL2hvb2tzL3VzZVRoZW1lLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2NvbmZpZy1wcm92aWRlci9Nb3Rpb25XcmFwcGVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1tb3Rpb24vZXMvQ1NTTW90aW9uLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1tb3Rpb24vZXMvY29udGV4dC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtbW90aW9uL2VzL0RvbVdyYXBwZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvaG9va3MvdXNlU3luY1N0YXRlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1tb3Rpb24vZXMvaG9va3MvdXNlU3RhdHVzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1tb3Rpb24vZXMvaW50ZXJmYWNlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1tb3Rpb24vZXMvaG9va3MvdXNlRG9tTW90aW9uRXZlbnRzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1tb3Rpb24vZXMvdXRpbC9tb3Rpb24uanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLW1vdGlvbi9lcy9ob29rcy91c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1tb3Rpb24vZXMvaG9va3MvdXNlU3RlcFF1ZXVlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1tb3Rpb24vZXMvaG9va3MvdXNlTmV4dEZyYW1lLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1tb3Rpb24vZXMvQ1NTTW90aW9uTGlzdC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtbW90aW9uL2VzL3V0aWwvZGlmZi5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtbW90aW9uL2VzL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2NvbmZpZy1wcm92aWRlci9Qcm9wV2FybmluZy5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvQ2hlY2tDaXJjbGVGaWxsZWQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vQ2hlY2tDaXJjbGVGaWxsZWQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2NvbXBvbmVudHMvQW50ZEljb24uanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2NvbXBvbmVudHMvSWNvbkJhc2UuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvRG9tL3NoYWRvdy5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvdXRpbHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2NvbXBvbmVudHMvdHdvVG9uZVByaW1hcnlDb2xvci5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvQ2xvc2VDaXJjbGVGaWxsZWQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vQ2xvc2VDaXJjbGVGaWxsZWQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0Nsb3NlT3V0bGluZWQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vQ2xvc2VPdXRsaW5lZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9waWNrQXR0cnMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvX3V0aWwvcmVhY3ROb2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2NvbmZpZy1wcm92aWRlci9ob29rcy91c2VDU1NWYXJDbHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvS2V5Q29kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvTG9hZGluZ091dGxpbmVkLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL0xvYWRpbmdPdXRsaW5lZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9fdXRpbC9ob29rcy91c2VaSW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvX3V0aWwvemluZGV4Q29udGV4dC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9jb25maWctcHJvdmlkZXIvVW5zdGFibGVDb250ZXh0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9yZWdlbmVyYXRvclJ1bnRpbWUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2FzeW5jVG9HZW5lcmF0b3IuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvUmVhY3QvcmVuZGVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL191dGlsL21vdGlvbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9idXR0b24vYnV0dG9uLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy11dGlsL2VzL29taXQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvX3V0aWwvd2F2ZS9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9Eb20vaXNWaXNpYmxlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL191dGlsL3dhdmUvc3R5bGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvX3V0aWwvd2F2ZS91c2VXYXZlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL191dGlsL3dhdmUvaW50ZXJmYWNlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL191dGlsL3dhdmUvV2F2ZUVmZmVjdC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9fdXRpbC93YXZlL3V0aWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvY29uZmlnLXByb3ZpZGVyL2hvb2tzL3VzZVNpemUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvc3BhY2UvQ29tcGFjdC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9idXR0b24vYnV0dG9uLWdyb3VwLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2J1dHRvbi9idXR0b25IZWxwZXJzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2J1dHRvbi9EZWZhdWx0TG9hZGluZ0ljb24uanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvYnV0dG9uL0ljb25XcmFwcGVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2J1dHRvbi9zdHlsZS9ncm91cC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9jb2xvci1waWNrZXIvZXMvQ29sb3JQaWNrZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvY29sb3ItcGlja2VyL2VzL2NvbG9yLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L2NvbG9yLXBpY2tlci9lcy91dGlsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L2NvbG9yLXBpY2tlci9lcy9jb21wb25lbnRzL0NvbG9yQmxvY2suanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvY29sb3ItcGlja2VyL2VzL2NvbXBvbmVudHMvUGlja2VyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L2NvbG9yLXBpY2tlci9lcy9ob29rcy91c2VDb2xvckRyYWcuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvY29sb3ItcGlja2VyL2VzL2NvbXBvbmVudHMvSGFuZGxlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9jb2xvci1waWNrZXIvZXMvY29tcG9uZW50cy9QYWxldHRlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L2NvbG9yLXBpY2tlci9lcy9jb21wb25lbnRzL1RyYW5zZm9ybS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9jb2xvci1waWNrZXIvZXMvaG9va3MvdXNlQ29sb3JTdGF0ZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9jb2xvci1waWNrZXIvZXMvaG9va3MvdXNlQ29tcG9uZW50LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L2NvbG9yLXBpY2tlci9lcy9jb21wb25lbnRzL1NsaWRlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9jb2xvci1waWNrZXIvZXMvY29tcG9uZW50cy9HcmFkaWVudC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9jb2xvci1waWNrZXIvY29sb3IuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvY29sb3ItcGlja2VyL2NvbXBvbmVudHMvQ29sb3JQcmVzZXRzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9SaWdodE91dGxpbmVkLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL1JpZ2h0T3V0bGluZWQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvc3R5bGUvbW90aW9uL2NvbGxhcHNlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3N0eWxlL21vdGlvbi9tb3Rpb24uanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvc3R5bGUvbW90aW9uL2ZhZGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvc3R5bGUvbW90aW9uL21vdmUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvc3R5bGUvbW90aW9uL3NsaWRlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3N0eWxlL21vdGlvbi96b29tLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2J1dHRvbi9zdHlsZS90b2tlbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9idXR0b24vc3R5bGUvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvc3R5bGUvY29tcGFjdC1pdGVtLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3N0eWxlL2NvbXBhY3QtaXRlbS12ZXJ0aWNhbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9idXR0b24vc3R5bGUvY29tcGFjdC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9idXR0b24vaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvcG9ydGFsL2VzL1BvcnRhbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9wb3J0YWwvZXMvQ29udGV4dC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9wb3J0YWwvZXMvdXNlRG9tLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L3BvcnRhbC9lcy91c2VTY3JvbGxMb2NrZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvZ2V0U2Nyb2xsQmFyU2l6ZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9wb3J0YWwvZXMvdXRpbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9wb3J0YWwvZXMvbW9jay5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9wb3J0YWwvZXMvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLWRpYWxvZy9lcy9EaWFsb2dXcmFwLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1kaWFsb2cvZXMvY29udGV4dC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtZGlhbG9nL2VzL0RpYWxvZy9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9ob29rcy91c2VJZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtZGlhbG9nL2VzL3V0aWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLWRpYWxvZy9lcy9EaWFsb2cvQ29udGVudC9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtZGlhbG9nL2VzL0RpYWxvZy9Db250ZW50L1BhbmVsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1kaWFsb2cvZXMvRGlhbG9nL0NvbnRlbnQvTWVtb0NoaWxkcmVuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1kaWFsb2cvZXMvRGlhbG9nL01hc2suanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLWRpYWxvZy9lcy9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9fdXRpbC9Db250ZXh0SXNvbGF0b3IuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvZm9ybS9jb250ZXh0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1maWVsZC1mb3JtL2VzL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1maWVsZC1mb3JtL2VzL0ZpZWxkLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1maWVsZC1mb3JtL2VzL0ZpZWxkQ29udGV4dC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtZmllbGQtZm9ybS9lcy9MaXN0Q29udGV4dC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtZmllbGQtZm9ybS9lcy91dGlscy90eXBlVXRpbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9hc3luYy12YWxpZGF0b3IvZXMvbWVzc2FnZXMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2lzTmF0aXZlRnVuY3Rpb24uanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NvbnN0cnVjdC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vd3JhcE5hdGl2ZVN1cGVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L2FzeW5jLXZhbGlkYXRvci9lcy91dGlsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L2FzeW5jLXZhbGlkYXRvci9lcy9ydWxlL2VudW0uanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvYXN5bmMtdmFsaWRhdG9yL2VzL3J1bGUvcGF0dGVybi5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9hc3luYy12YWxpZGF0b3IvZXMvcnVsZS9yYW5nZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9hc3luYy12YWxpZGF0b3IvZXMvcnVsZS9yZXF1aXJlZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9hc3luYy12YWxpZGF0b3IvZXMvcnVsZS91cmwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvYXN5bmMtdmFsaWRhdG9yL2VzL3J1bGUvdHlwZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9hc3luYy12YWxpZGF0b3IvZXMvcnVsZS93aGl0ZXNwYWNlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L2FzeW5jLXZhbGlkYXRvci9lcy9ydWxlL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L2FzeW5jLXZhbGlkYXRvci9lcy92YWxpZGF0b3IvYW55LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L2FzeW5jLXZhbGlkYXRvci9lcy92YWxpZGF0b3IvYXJyYXkuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvYXN5bmMtdmFsaWRhdG9yL2VzL3ZhbGlkYXRvci9ib29sZWFuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L2FzeW5jLXZhbGlkYXRvci9lcy92YWxpZGF0b3IvZGF0ZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9hc3luYy12YWxpZGF0b3IvZXMvdmFsaWRhdG9yL2VudW0uanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvYXN5bmMtdmFsaWRhdG9yL2VzL3ZhbGlkYXRvci9mbG9hdC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9hc3luYy12YWxpZGF0b3IvZXMvdmFsaWRhdG9yL2ludGVnZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvYXN5bmMtdmFsaWRhdG9yL2VzL3ZhbGlkYXRvci9tZXRob2QuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvYXN5bmMtdmFsaWRhdG9yL2VzL3ZhbGlkYXRvci9udW1iZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvYXN5bmMtdmFsaWRhdG9yL2VzL3ZhbGlkYXRvci9vYmplY3QuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvYXN5bmMtdmFsaWRhdG9yL2VzL3ZhbGlkYXRvci9wYXR0ZXJuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L2FzeW5jLXZhbGlkYXRvci9lcy92YWxpZGF0b3IvcmVnZXhwLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L2FzeW5jLXZhbGlkYXRvci9lcy92YWxpZGF0b3IvcmVxdWlyZWQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvYXN5bmMtdmFsaWRhdG9yL2VzL3ZhbGlkYXRvci9zdHJpbmcuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvYXN5bmMtdmFsaWRhdG9yL2VzL3ZhbGlkYXRvci90eXBlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L2FzeW5jLXZhbGlkYXRvci9lcy92YWxpZGF0b3IvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvYXN5bmMtdmFsaWRhdG9yL2VzL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1maWVsZC1mb3JtL2VzL3V0aWxzL3ZhbGlkYXRlVXRpbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtZmllbGQtZm9ybS9lcy91dGlscy9tZXNzYWdlcy5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtZmllbGQtZm9ybS9lcy91dGlscy92YWx1ZVV0aWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLWZpZWxkLWZvcm0vZXMvTGlzdC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtZmllbGQtZm9ybS9lcy91c2VGb3JtLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1maWVsZC1mb3JtL2VzL3V0aWxzL2FzeW5jVXRpbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtZmllbGQtZm9ybS9lcy91dGlscy9OYW1lTWFwLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1maWVsZC1mb3JtL2VzL0Zvcm0uanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLWZpZWxkLWZvcm0vZXMvRm9ybUNvbnRleHQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLWZpZWxkLWZvcm0vZXMvdXNlV2F0Y2guanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvZ3JpZC9zdHlsZS9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9tb2RhbC9zdHlsZS9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9fdXRpbC9QdXJlUGFuZWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvc2VsZWN0L2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1zZWxlY3QvZXMvU2VsZWN0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1zZWxlY3QvZXMvQmFzZVNlbGVjdC9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9pc01vYmlsZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL1RyYW5zQnRuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1zZWxlY3QvZXMvaG9va3MvdXNlQWxsb3dDbGVhci5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL2hvb2tzL3VzZUJhc2VQcm9wcy5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL2hvb2tzL3VzZURlbGF5UmVzZXQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy9ob29rcy91c2VMb2NrLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1zZWxlY3QvZXMvaG9va3MvdXNlU2VsZWN0VHJpZ2dlckNvbnRyb2wuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy9TZWxlY3Rvci9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL3V0aWxzL2tleVV0aWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy9TZWxlY3Rvci9NdWx0aXBsZVNlbGVjdG9yLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1vdmVyZmxvdy9lcy9PdmVyZmxvdy5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtb3ZlcmZsb3cvZXMvSXRlbS5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtb3ZlcmZsb3cvZXMvaG9va3MvdXNlRWZmZWN0U3RhdGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLW92ZXJmbG93L2VzL2hvb2tzL2NoYW5uZWxVcGRhdGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLW92ZXJmbG93L2VzL1Jhd0l0ZW0uanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLW92ZXJmbG93L2VzL2NvbnRleHQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLW92ZXJmbG93L2VzL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1zZWxlY3QvZXMvU2VsZWN0b3IvSW5wdXQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy9ob29rcy91c2VMYXlvdXRFZmZlY3QuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy91dGlscy9jb21tb25VdGlsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1zZWxlY3QvZXMvU2VsZWN0b3IvU2luZ2xlU2VsZWN0b3IuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvdHJpZ2dlci9lcy9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC90cmlnZ2VyL2VzL1BvcHVwL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L3RyaWdnZXIvZXMvUG9wdXAvQXJyb3cuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvdHJpZ2dlci9lcy9Qb3B1cC9NYXNrLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L3RyaWdnZXIvZXMvUG9wdXAvUG9wdXBDb250ZW50LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L3RyaWdnZXIvZXMvVHJpZ2dlcldyYXBwZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvdHJpZ2dlci9lcy9jb250ZXh0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L3RyaWdnZXIvZXMvaG9va3MvdXNlQWN0aW9uLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L3RyaWdnZXIvZXMvaG9va3MvdXNlQWxpZ24uanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvdHJpZ2dlci9lcy91dGlsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L3RyaWdnZXIvZXMvaG9va3MvdXNlV2F0Y2guanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvdHJpZ2dlci9lcy9ob29rcy91c2VXaW5DbGljay5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL1NlbGVjdFRyaWdnZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy91dGlscy92YWx1ZVV0aWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy9TZWxlY3RDb250ZXh0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1zZWxlY3QvZXMvQmFzZVNlbGVjdC9Qb2xpdGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy9PcHRHcm91cC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL09wdGlvbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL09wdGlvbkxpc3QuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9lcy9MaXN0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvZXMvRmlsbGVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvZXMvaG9va3MvdXNlQ2hpbGRyZW4uanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9lcy9JdGVtLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvZXMvaG9va3MvdXNlRGlmZkl0ZW0uanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9lcy91dGlscy9hbGdvcml0aG1VdGlsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvZXMvaG9va3MvdXNlRnJhbWVXaGVlbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdmlydHVhbC1saXN0L2VzL3V0aWxzL2lzRmlyZWZveC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdmlydHVhbC1saXN0L2VzL2hvb2tzL3VzZU9yaWdpblNjcm9sbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdmlydHVhbC1saXN0L2VzL2hvb2tzL3VzZUdldFNpemUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9lcy9ob29rcy91c2VIZWlnaHRzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvZXMvdXRpbHMvQ2FjaGVNYXAuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9lcy9ob29rcy91c2VNb2JpbGVUb3VjaE1vdmUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9lcy9ob29rcy91c2VTY3JvbGxEcmFnLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvZXMvaG9va3MvdXNlU2Nyb2xsVG8uanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9lcy9TY3JvbGxCYXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9lcy91dGlscy9zY3JvbGxiYXJVdGlsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvZXMvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy91dGlscy9wbGF0Zm9ybVV0aWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy9ob29rcy91c2VDYWNoZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL2hvb2tzL3VzZUZpbHRlck9wdGlvbnMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy9ob29rcy91c2VJZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL2hvb2tzL3VzZU9wdGlvbnMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy91dGlscy9sZWdhY3lVdGlsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1zZWxlY3QvZXMvaG9va3MvdXNlUmVmRnVuYy5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL3V0aWxzL3dhcm5pbmdQcm9wc1V0aWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9fdXRpbC9zdGF0dXNVdGlscy5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9jb25maWctcHJvdmlkZXIvZGVmYXVsdFJlbmRlckVtcHR5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2VtcHR5L2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2VtcHR5L2VtcHR5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2VtcHR5L3NpbXBsZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9lbXB0eS9zdHlsZS9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9mb3JtL2hvb2tzL3VzZVZhcmlhbnRzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3NlbGVjdC9tZXJnZWRCdWlsdGluUGxhY2VtZW50cy5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9zZWxlY3Qvc3R5bGUvZHJvcGRvd24uanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvc2VsZWN0L3N0eWxlL211bHRpcGxlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3NlbGVjdC9zdHlsZS9zaW5nbGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvc2VsZWN0L3N0eWxlL3Rva2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3NlbGVjdC9zdHlsZS92YXJpYW50cy5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9zZWxlY3Qvc3R5bGUvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvc2VsZWN0L3VzZUljb25zLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9DaGVja091dGxpbmVkLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL0NoZWNrT3V0bGluZWQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0Rvd25PdXRsaW5lZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9Eb3duT3V0bGluZWQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL1NlYXJjaE91dGxpbmVkLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL1NlYXJjaE91dGxpbmVkLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3NlbGVjdC91c2VTaG93QXJyb3cuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvX3V0aWwvaG9va3MvdXNlRm9yY2VVcGRhdGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvdG9vbHRpcC9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdG9vbHRpcC9lcy9Qb3B1cC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdG9vbHRpcC9lcy9Ub29sdGlwLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy10b29sdGlwL2VzL3BsYWNlbWVudHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXRvb2x0aXAvZXMvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvc3R5bGUvcm91bmRlZEFycm93LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3N0eWxlL3BsYWNlbWVudEFycm93LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL191dGlsL3BsYWNlbWVudHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvdG9vbHRpcC9QdXJlUGFuZWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvdG9vbHRpcC9zdHlsZS9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy90b29sdGlwL3V0aWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvX3V0aWwvY29sb3JzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9MZWZ0T3V0bGluZWQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vTGVmdE91dGxpbmVkLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1jaGVja2JveC9lcy9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9jaGVja2JveC91c2VCdWJibGVMb2NrLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2lucHV0L3N0eWxlL3Rva2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2lucHV0L3N0eWxlL3ZhcmlhbnRzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2lucHV0L3N0eWxlL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2NoZWNrYm94L3N0eWxlL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2NoZWNrYm94L0NoZWNrYm94LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2NoZWNrYm94L0dyb3VwQ29udGV4dC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9jaGVja2JveC9Hcm91cC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9jaGVja2JveC9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9pbnB1dC1udW1iZXIvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL1VwT3V0bGluZWQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vVXBPdXRsaW5lZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9taW5pLWRlY2ltYWwvZXMvc3VwcG9ydFV0aWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvbWluaS1kZWNpbWFsL2VzL251bWJlclV0aWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvbWluaS1kZWNpbWFsL2VzL0JpZ0ludERlY2ltYWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvbWluaS1kZWNpbWFsL2VzL051bWJlckRlY2ltYWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvbWluaS1kZWNpbWFsL2VzL01pbmlEZWNpbWFsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L21pbmktZGVjaW1hbC9lcy9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtaW5wdXQtbnVtYmVyL2VzL0lucHV0TnVtYmVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1pbnB1dC9lcy9CYXNlSW5wdXQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLWlucHV0L2VzL3V0aWxzL2NvbW1vblV0aWxzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1pbnB1dC9lcy9JbnB1dC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtaW5wdXQvZXMvaG9va3MvdXNlQ291bnQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLWlucHV0L2VzL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy11dGlsL2VzL3Byb3h5T2JqZWN0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1pbnB1dC1udW1iZXIvZXMvaG9va3MvdXNlQ3Vyc29yLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1pbnB1dC1udW1iZXIvZXMvU3RlcEhhbmRsZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvaG9va3MvdXNlTW9iaWxlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1pbnB1dC1udW1iZXIvZXMvdXRpbHMvbnVtYmVyVXRpbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtaW5wdXQtbnVtYmVyL2VzL2hvb2tzL3VzZUZyYW1lLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1pbnB1dC1udW1iZXIvZXMvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvaW5wdXQtbnVtYmVyL3N0eWxlL3Rva2VuLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2lucHV0LW51bWJlci9zdHlsZS9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9pbnB1dC9JbnB1dC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9fdXRpbC9nZXRBbGxvd0NsZWFyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2lucHV0L2hvb2tzL3VzZVJlbW92ZVBhc3N3b3JkVGltZW91dC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9pbnB1dC91dGlscy5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtc2xpZGVyL2VzL1NsaWRlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtc2xpZGVyL2VzL0hhbmRsZXMvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNsaWRlci9lcy91dGlsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1zbGlkZXIvZXMvSGFuZGxlcy9IYW5kbGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNsaWRlci9lcy9jb250ZXh0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1zbGlkZXIvZXMvTWFya3MvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNsaWRlci9lcy9NYXJrcy9NYXJrLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1zbGlkZXIvZXMvU3RlcHMvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNsaWRlci9lcy9TdGVwcy9Eb3QuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNsaWRlci9lcy9UcmFja3MvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNsaWRlci9lcy9UcmFja3MvVHJhY2suanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNsaWRlci9lcy9ob29rcy91c2VEcmFnLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1zbGlkZXIvZXMvaG9va3MvdXNlT2Zmc2V0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1zbGlkZXIvZXMvaG9va3MvdXNlUmFuZ2UuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXNsaWRlci9lcy9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9zbGlkZXIvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvc2xpZGVyL0NvbnRleHQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvc2xpZGVyL1NsaWRlclRvb2x0aXAuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvc2xpZGVyL3N0eWxlL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3NsaWRlci91c2VSYWZMb2NrLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL191dGlsL2dhcFNpemUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvZmxleC9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9mbGV4L3V0aWxzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2ZsZXgvc3R5bGUvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvaW1hZ2UvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0V5ZU91dGxpbmVkLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL0V5ZU91dGxpbmVkLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1pbWFnZS9lcy9JbWFnZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9Eb20vY3NzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1pbWFnZS9lcy9QcmV2aWV3LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy11dGlsL2VzL0RvbS9hZGRFdmVudExpc3RlbmVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1pbWFnZS9lcy9PcGVyYXRpb25zLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1pbWFnZS9lcy9jb250ZXh0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1pbWFnZS9lcy9ob29rcy91c2VJbWFnZVRyYW5zZm9ybS5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtaW1hZ2UvZXMvaG9va3MvdXNlTW91c2VFdmVudC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtaW1hZ2UvZXMvZ2V0Rml4U2NhbGVFbGVUcmFuc1Bvc2l0aW9uLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1pbWFnZS9lcy9wcmV2aWV3Q29uZmlnLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1pbWFnZS9lcy9ob29rcy91c2VTdGF0dXMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLWltYWdlL2VzL3V0aWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLWltYWdlL2VzL2hvb2tzL3VzZVRvdWNoRXZlbnQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLWltYWdlL2VzL1ByZXZpZXdHcm91cC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtaW1hZ2UvZXMvaG9va3MvdXNlUHJldmlld0l0ZW1zLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1pbWFnZS9lcy9jb21tb24uanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLWltYWdlL2VzL2hvb2tzL3VzZVJlZ2lzdGVySW1hZ2UuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLWltYWdlL2VzL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2ltYWdlL1ByZXZpZXdHcm91cC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvUm90YXRlTGVmdE91dGxpbmVkLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL1JvdGF0ZUxlZnRPdXRsaW5lZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvUm90YXRlUmlnaHRPdXRsaW5lZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9Sb3RhdGVSaWdodE91dGxpbmVkLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9Td2FwT3V0bGluZWQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vU3dhcE91dGxpbmVkLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9ab29tSW5PdXRsaW5lZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9ab29tSW5PdXRsaW5lZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvWm9vbU91dE91dGxpbmVkLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL1pvb21PdXRPdXRsaW5lZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9pbWFnZS9zdHlsZS9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9pbnB1dC9Hcm91cC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9pbnB1dC9PVFAvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvaW5wdXQvc3R5bGUvb3RwLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2lucHV0L09UUC9PVFBJbnB1dC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9pbnB1dC9QYXNzd29yZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvRXllSW52aXNpYmxlT3V0bGluZWQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vRXllSW52aXNpYmxlT3V0bGluZWQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvaW5wdXQvU2VhcmNoLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2lucHV0L1RleHRBcmVhLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy10ZXh0YXJlYS9lcy9UZXh0QXJlYS5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdGV4dGFyZWEvZXMvUmVzaXphYmxlVGV4dEFyZWEuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXRleHRhcmVhL2VzL2NhbGN1bGF0ZU5vZGVIZWlnaHQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXRleHRhcmVhL2VzL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2lucHV0L3N0eWxlL3RleHRhcmVhLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL2lucHV0L2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3Byb2dyZXNzL3Byb2dyZXNzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3Byb2dyZXNzL0NpcmNsZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtcHJvZ3Jlc3MvZXMvTGluZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtcHJvZ3Jlc3MvZXMvY29tbW9uLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1wcm9ncmVzcy9lcy9DaXJjbGUvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXByb2dyZXNzL2VzL2hvb2tzL3VzZUlkLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1wcm9ncmVzcy9lcy9DaXJjbGUvUHRnQ2lyY2xlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy1wcm9ncmVzcy9lcy9DaXJjbGUvdXRpbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9wcm9ncmVzcy91dGlscy5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy9wcm9ncmVzcy9MaW5lLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3Byb2dyZXNzL3N0eWxlL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3Byb2dyZXNzL1N0ZXBzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3Byb2dyZXNzL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9EZWxldGVPdXRsaW5lZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9EZWxldGVPdXRsaW5lZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvRG93bmxvYWRPdXRsaW5lZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9Eb3dubG9hZE91dGxpbmVkLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9GaWxlVHdvVG9uZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9GaWxlVHdvVG9uZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvUGFwZXJDbGlwT3V0bGluZWQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vUGFwZXJDbGlwT3V0bGluZWQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL1BpY3R1cmVUd29Ub25lLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL1BpY3R1cmVUd29Ub25lLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9VcGxvYWRPdXRsaW5lZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9VcGxvYWRPdXRsaW5lZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy91cGxvYWQvRHJhZ2dlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy91cGxvYWQvVXBsb2FkLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy11cGxvYWQvZXMvVXBsb2FkLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy11cGxvYWQvZXMvQWpheFVwbG9hZGVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy11cGxvYWQvZXMvYXR0ci1hY2NlcHQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3JjLXVwbG9hZC9lcy9yZXF1ZXN0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9yYy11cGxvYWQvZXMvdHJhdmVyc2VGaWxlVHJlZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdXBsb2FkL2VzL3VpZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvcmMtdXBsb2FkL2VzL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3VwbG9hZC9zdHlsZS9kcmFnZ2VyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3VwbG9hZC9zdHlsZS9saXN0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3VwbG9hZC9zdHlsZS9tb3Rpb24uanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvdXBsb2FkL3N0eWxlL3BpY3R1cmUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvdXBsb2FkL3N0eWxlL3J0bC5qcyIsICIuLi9ub2RlX21vZHVsZXMvYW50ZC9lcy91cGxvYWQvc3R5bGUvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvdXBsb2FkL1VwbG9hZExpc3QvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL2FudGQvZXMvdXBsb2FkL3V0aWxzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3VwbG9hZC9VcGxvYWRMaXN0L0xpc3RJdGVtLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hbnRkL2VzL3VwbG9hZC9pbmRleC5qcyIsICIuLi90eXBlc2NyaXB0cy9tb2R1bGVzL2NvbWZ5L3NyYy9wb3B1cC90c3gvV29ya2Zsb3dFZGl0V2ViLnRzeCIsICIuLi90eXBlc2NyaXB0cy9zcmMvY29tbW9uL1dvcmtmbG93RWRpdC50c3giLCAiLi4vdHlwZXNjcmlwdHMvc3JjL2NvbW1vbi90c3gvdXRpbC50cyIsICIuLi90eXBlc2NyaXB0cy9tb2R1bGVzL2NvbWZ5L3NyYy9wb3B1cC90c3gvd2lkZ2V0cy9udW1iZXIudHN4IiwgIi4uL3R5cGVzY3JpcHRzL21vZHVsZXMvY29tZnkvc3JjL3BvcHVwL3RzeC93aWRnZXRzL2hvb2tzLm10cyIsICIuLi90eXBlc2NyaXB0cy9tb2R1bGVzL2NvbWZ5L3NyYy9wb3B1cC90c3gvd2lkZ2V0cy9jb21iby50c3giLCAiLi4vdHlwZXNjcmlwdHMvbW9kdWxlcy9jb21meS9zcmMvcG9wdXAvdHN4L3dpZGdldHMvdG9nZ2xlLnRzeCIsICIuLi90eXBlc2NyaXB0cy9tb2R1bGVzL2NvbWZ5L3NyYy9wb3B1cC90c3gvd2lkZ2V0cy9zdHJpbmcudHN4IiwgIi4uL3R5cGVzY3JpcHRzL21vZHVsZXMvY29tZnkvc3JjL3BvcHVwL3RzeC93aWRnZXRzL0VkaXRhYmxlVGl0bGUudHN4IiwgIi4uL3R5cGVzY3JpcHRzL21vZHVsZXMvY29tZnkvc3JjL3BvcHVwL3RzeC93aWRnZXRzL2ltYWdlX21hc2tfcGF0aC50c3giLCAiLi4vdHlwZXNjcmlwdHMvbW9kdWxlcy9jb21meS9zcmMvcG9wdXAvdHN4L0NvbWZ5U2lkZWJhci50c3giLCAiLi4vdHlwZXNjcmlwdHMvbW9kdWxlcy9jb21meS9zcmMvd2lkZ2V0dGFibGUtZW50cnkubXRzIiwgIi4uL3R5cGVzY3JpcHRzL21vZHVsZXMvY29tZnkvc3JjL2NvbWZ5LWVudHJ5Lm10cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IGRlZmF1bHQgKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOlxuICAgICAgICAgICAgdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDpcbiAgICAgICAgICAgIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB7fSk7XG4iLCAiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG4vLyBiYXNlZCBvZmYgaHR0cHM6Ly9naXRodWIuY29tL2RlZnVuY3R6b21iaWUvbm9kZS1wcm9jZXNzL2Jsb2IvbWFzdGVyL2Jyb3dzZXIuanNcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG52YXIgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbmlmICh0eXBlb2YgZ2xvYmFsLnNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbn1cbmlmICh0eXBlb2YgZ2xvYmFsLmNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbn1cblxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG5leHRUaWNrKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59XG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xuZXhwb3J0IHZhciB0aXRsZSA9ICdicm93c2VyJztcbmV4cG9ydCB2YXIgcGxhdGZvcm0gPSAnYnJvd3Nlcic7XG5leHBvcnQgdmFyIGJyb3dzZXIgPSB0cnVlO1xuZXhwb3J0IHZhciBlbnYgPSB7fTtcbmV4cG9ydCB2YXIgYXJndiA9IFtdO1xuZXhwb3J0IHZhciB2ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5leHBvcnQgdmFyIHZlcnNpb25zID0ge307XG5leHBvcnQgdmFyIHJlbGVhc2UgPSB7fTtcbmV4cG9ydCB2YXIgY29uZmlnID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5leHBvcnQgdmFyIG9uID0gbm9vcDtcbmV4cG9ydCB2YXIgYWRkTGlzdGVuZXIgPSBub29wO1xuZXhwb3J0IHZhciBvbmNlID0gbm9vcDtcbmV4cG9ydCB2YXIgb2ZmID0gbm9vcDtcbmV4cG9ydCB2YXIgcmVtb3ZlTGlzdGVuZXIgPSBub29wO1xuZXhwb3J0IHZhciByZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xuZXhwb3J0IHZhciBlbWl0ID0gbm9vcDtcblxuZXhwb3J0IGZ1bmN0aW9uIGJpbmRpbmcobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGN3ZCAoKSB7IHJldHVybiAnLycgfVxuZXhwb3J0IGZ1bmN0aW9uIGNoZGlyIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiB1bWFzaygpIHsgcmV0dXJuIDA7IH1cblxuLy8gZnJvbSBodHRwczovL2dpdGh1Yi5jb20va3VtYXZpcy9icm93c2VyLXByb2Nlc3MtaHJ0aW1lL2Jsb2IvbWFzdGVyL2luZGV4LmpzXG52YXIgcGVyZm9ybWFuY2UgPSBnbG9iYWwucGVyZm9ybWFuY2UgfHwge31cbnZhciBwZXJmb3JtYW5jZU5vdyA9XG4gIHBlcmZvcm1hbmNlLm5vdyAgICAgICAgfHxcbiAgcGVyZm9ybWFuY2UubW96Tm93ICAgICB8fFxuICBwZXJmb3JtYW5jZS5tc05vdyAgICAgIHx8XG4gIHBlcmZvcm1hbmNlLm9Ob3cgICAgICAgfHxcbiAgcGVyZm9ybWFuY2Uud2Via2l0Tm93ICB8fFxuICBmdW5jdGlvbigpeyByZXR1cm4gKG5ldyBEYXRlKCkpLmdldFRpbWUoKSB9XG5cbi8vIGdlbmVyYXRlIHRpbWVzdGFtcCBvciBkZWx0YVxuLy8gc2VlIGh0dHA6Ly9ub2RlanMub3JnL2FwaS9wcm9jZXNzLmh0bWwjcHJvY2Vzc19wcm9jZXNzX2hydGltZVxuZXhwb3J0IGZ1bmN0aW9uIGhydGltZShwcmV2aW91c1RpbWVzdGFtcCl7XG4gIHZhciBjbG9ja3RpbWUgPSBwZXJmb3JtYW5jZU5vdy5jYWxsKHBlcmZvcm1hbmNlKSoxZS0zXG4gIHZhciBzZWNvbmRzID0gTWF0aC5mbG9vcihjbG9ja3RpbWUpXG4gIHZhciBuYW5vc2Vjb25kcyA9IE1hdGguZmxvb3IoKGNsb2NrdGltZSUxKSoxZTkpXG4gIGlmIChwcmV2aW91c1RpbWVzdGFtcCkge1xuICAgIHNlY29uZHMgPSBzZWNvbmRzIC0gcHJldmlvdXNUaW1lc3RhbXBbMF1cbiAgICBuYW5vc2Vjb25kcyA9IG5hbm9zZWNvbmRzIC0gcHJldmlvdXNUaW1lc3RhbXBbMV1cbiAgICBpZiAobmFub3NlY29uZHM8MCkge1xuICAgICAgc2Vjb25kcy0tXG4gICAgICBuYW5vc2Vjb25kcyArPSAxZTlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtzZWNvbmRzLG5hbm9zZWNvbmRzXVxufVxuXG52YXIgc3RhcnRUaW1lID0gbmV3IERhdGUoKTtcbmV4cG9ydCBmdW5jdGlvbiB1cHRpbWUoKSB7XG4gIHZhciBjdXJyZW50VGltZSA9IG5ldyBEYXRlKCk7XG4gIHZhciBkaWYgPSBjdXJyZW50VGltZSAtIHN0YXJ0VGltZTtcbiAgcmV0dXJuIGRpZiAvIDEwMDA7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmV4dFRpY2s6IG5leHRUaWNrLFxuICB0aXRsZTogdGl0bGUsXG4gIGJyb3dzZXI6IGJyb3dzZXIsXG4gIGVudjogZW52LFxuICBhcmd2OiBhcmd2LFxuICB2ZXJzaW9uOiB2ZXJzaW9uLFxuICB2ZXJzaW9uczogdmVyc2lvbnMsXG4gIG9uOiBvbixcbiAgYWRkTGlzdGVuZXI6IGFkZExpc3RlbmVyLFxuICBvbmNlOiBvbmNlLFxuICBvZmY6IG9mZixcbiAgcmVtb3ZlTGlzdGVuZXI6IHJlbW92ZUxpc3RlbmVyLFxuICByZW1vdmVBbGxMaXN0ZW5lcnM6IHJlbW92ZUFsbExpc3RlbmVycyxcbiAgZW1pdDogZW1pdCxcbiAgYmluZGluZzogYmluZGluZyxcbiAgY3dkOiBjd2QsXG4gIGNoZGlyOiBjaGRpcixcbiAgdW1hc2s6IHVtYXNrLFxuICBocnRpbWU6IGhydGltZSxcbiAgcGxhdGZvcm06IHBsYXRmb3JtLFxuICByZWxlYXNlOiByZWxlYXNlLFxuICBjb25maWc6IGNvbmZpZyxcbiAgdXB0aW1lOiB1cHRpbWVcbn07XG4iLCAidmFyIFdyaXRhYmxlU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJykuV3JpdGFibGVcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ3V0aWwnKS5pbmhlcml0c1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJyb3dzZXJTdGRvdXRcblxuXG5pbmhlcml0cyhCcm93c2VyU3Rkb3V0LCBXcml0YWJsZVN0cmVhbSlcblxuZnVuY3Rpb24gQnJvd3NlclN0ZG91dChvcHRzKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBCcm93c2VyU3Rkb3V0KSkgcmV0dXJuIG5ldyBCcm93c2VyU3Rkb3V0KG9wdHMpXG5cbiAgb3B0cyA9IG9wdHMgfHwge31cbiAgV3JpdGFibGVTdHJlYW0uY2FsbCh0aGlzLCBvcHRzKVxuICB0aGlzLmxhYmVsID0gKG9wdHMubGFiZWwgIT09IHVuZGVmaW5lZCkgPyBvcHRzLmxhYmVsIDogJ3N0ZG91dCdcbn1cblxuQnJvd3NlclN0ZG91dC5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24oY2h1bmtzLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIG91dHB1dCA9IGNodW5rcy50b1N0cmluZyA/IGNodW5rcy50b1N0cmluZygpIDogY2h1bmtzXG4gIGlmICh0aGlzLmxhYmVsID09PSBmYWxzZSkge1xuICAgIGNvbnNvbGUubG9nKG91dHB1dClcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZyh0aGlzLmxhYmVsKyc6Jywgb3V0cHV0KVxuICB9XG4gIHByb2Nlc3MubmV4dFRpY2soY2IpXG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBgcXNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gcXNcbiAqIEByZXR1cm4ge09iamVjdDxzdHJpbmcsIHN0cmluZz59XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcGFyc2VRdWVyeShxcykge1xuICByZXR1cm4gcXNcbiAgICAucmVwbGFjZSgnPycsICcnKVxuICAgIC5zcGxpdCgnJicpXG4gICAgLnJlZHVjZShmdW5jdGlvbiAob2JqLCBwYWlyKSB7XG4gICAgICB2YXIgaSA9IHBhaXIuaW5kZXhPZignPScpO1xuICAgICAgdmFyIGtleSA9IHBhaXIuc2xpY2UoMCwgaSk7XG4gICAgICB2YXIgdmFsID0gcGFpci5zbGljZSgrK2kpO1xuXG4gICAgICAvLyBEdWUgdG8gaG93IHRoZSBVUkxTZWFyY2hQYXJhbXMgQVBJIHRyZWF0cyBzcGFjZXNcbiAgICAgIG9ialtrZXldID0gZGVjb2RlVVJJQ29tcG9uZW50KHZhbC5yZXBsYWNlKC9cXCsvZywgJyUyMCcpKTtcblxuICAgICAgcmV0dXJuIG9iajtcbiAgICB9LCB7fSk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBIaWdobGlnaHQgdGhlIGdpdmVuIHN0cmluZyBvZiBganNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30ganNcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gaGlnaGxpZ2h0KGpzKSB7XG4gIHJldHVybiBqc1xuICAgIC5yZXBsYWNlKC88L2csICcmbHQ7JylcbiAgICAucmVwbGFjZSgvPi9nLCAnJmd0OycpXG4gICAgLnJlcGxhY2UoL1xcL1xcLyguKikvZ20sICc8c3BhbiBjbGFzcz1cImNvbW1lbnRcIj4vLyQxPC9zcGFuPicpXG4gICAgLnJlcGxhY2UoLygnLio/JykvZ20sICc8c3BhbiBjbGFzcz1cInN0cmluZ1wiPiQxPC9zcGFuPicpXG4gICAgLnJlcGxhY2UoLyhcXGQrXFwuXFxkKykvZ20sICc8c3BhbiBjbGFzcz1cIm51bWJlclwiPiQxPC9zcGFuPicpXG4gICAgLnJlcGxhY2UoLyhcXGQrKS9nbSwgJzxzcGFuIGNsYXNzPVwibnVtYmVyXCI+JDE8L3NwYW4+JylcbiAgICAucmVwbGFjZShcbiAgICAgIC9cXGJuZXdbIFxcdF0rKFxcdyspL2dtLFxuICAgICAgJzxzcGFuIGNsYXNzPVwia2V5d29yZFwiPm5ldzwvc3Bhbj4gPHNwYW4gY2xhc3M9XCJpbml0XCI+JDE8L3NwYW4+J1xuICAgIClcbiAgICAucmVwbGFjZShcbiAgICAgIC9cXGIoZnVuY3Rpb258bmV3fHRocm93fHJldHVybnx2YXJ8aWZ8ZWxzZSlcXGIvZ20sXG4gICAgICAnPHNwYW4gY2xhc3M9XCJrZXl3b3JkXCI+JDE8L3NwYW4+J1xuICAgICk7XG59XG5cbi8qKlxuICogSGlnaGxpZ2h0IHRoZSBjb250ZW50cyBvZiB0YWcgYG5hbWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGhpZ2hsaWdodFRhZ3MobmFtZSkge1xuICB2YXIgY29kZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NoYScpLmdldEVsZW1lbnRzQnlUYWdOYW1lKG5hbWUpO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gY29kZS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgIGNvZGVbaV0uaW5uZXJIVE1MID0gaGlnaGxpZ2h0KGNvZGVbaV0uaW5uZXJIVE1MKTtcbiAgfVxufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gc3RyaW5nID0+IHtcblx0aWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBzdHJpbmcnKTtcblx0fVxuXG5cdC8vIEVzY2FwZSBjaGFyYWN0ZXJzIHdpdGggc3BlY2lhbCBtZWFuaW5nIGVpdGhlciBpbnNpZGUgb3Igb3V0c2lkZSBjaGFyYWN0ZXIgc2V0cy5cblx0Ly8gVXNlIGEgc2ltcGxlIGJhY2tzbGFzaCBlc2NhcGUgd2hlbiBpdOKAmXMgYWx3YXlzIHZhbGlkLCBhbmQgYSBcXHVubm5uIGVzY2FwZSB3aGVuIHRoZSBzaW1wbGVyIGZvcm0gd291bGQgYmUgZGlzYWxsb3dlZCBieSBVbmljb2RlIHBhdHRlcm5z4oCZIHN0cmljdGVyIGdyYW1tYXIuXG5cdHJldHVybiBzdHJpbmdcblx0XHQucmVwbGFjZSgvW3xcXFxce30oKVtcXF1eJCsqPy5dL2csICdcXFxcJCYnKVxuXHRcdC5yZXBsYWNlKC8tL2csICdcXFxceDJkJyk7XG59O1xuIiwgIi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cblwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBEaWZmO1xuXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuZnVuY3Rpb24gRGlmZigpIHt9XG5cbkRpZmYucHJvdG90eXBlID0ge1xuICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5cbiAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgZGlmZjogZnVuY3Rpb24gZGlmZihvbGRTdHJpbmcsIG5ld1N0cmluZykge1xuICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICB2YXIgX29wdGlvbnMkdGltZW91dDtcblxuICAgIHZhclxuICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gICAgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG4gICAgdmFyIGNhbGxiYWNrID0gb3B0aW9ucy5jYWxsYmFjaztcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgZnVuY3Rpb24gZG9uZSh2YWx1ZSkge1xuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNhbGxiYWNrKHVuZGVmaW5lZCwgdmFsdWUpO1xuICAgICAgICB9LCAwKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgfSAvLyBBbGxvdyBzdWJjbGFzc2VzIHRvIG1hc3NhZ2UgdGhlIGlucHV0IHByaW9yIHRvIHJ1bm5pbmdcblxuXG4gICAgb2xkU3RyaW5nID0gdGhpcy5jYXN0SW5wdXQob2xkU3RyaW5nKTtcbiAgICBuZXdTdHJpbmcgPSB0aGlzLmNhc3RJbnB1dChuZXdTdHJpbmcpO1xuICAgIG9sZFN0cmluZyA9IHRoaXMucmVtb3ZlRW1wdHkodGhpcy50b2tlbml6ZShvbGRTdHJpbmcpKTtcbiAgICBuZXdTdHJpbmcgPSB0aGlzLnJlbW92ZUVtcHR5KHRoaXMudG9rZW5pemUobmV3U3RyaW5nKSk7XG4gICAgdmFyIG5ld0xlbiA9IG5ld1N0cmluZy5sZW5ndGgsXG4gICAgICAgIG9sZExlbiA9IG9sZFN0cmluZy5sZW5ndGg7XG4gICAgdmFyIGVkaXRMZW5ndGggPSAxO1xuICAgIHZhciBtYXhFZGl0TGVuZ3RoID0gbmV3TGVuICsgb2xkTGVuO1xuXG4gICAgaWYgKG9wdGlvbnMubWF4RWRpdExlbmd0aCkge1xuICAgICAgbWF4RWRpdExlbmd0aCA9IE1hdGgubWluKG1heEVkaXRMZW5ndGgsIG9wdGlvbnMubWF4RWRpdExlbmd0aCk7XG4gICAgfVxuXG4gICAgdmFyIG1heEV4ZWN1dGlvblRpbWUgPVxuICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICAoX29wdGlvbnMkdGltZW91dCA9XG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgICBvcHRpb25zLnRpbWVvdXQpICE9PSBudWxsICYmIF9vcHRpb25zJHRpbWVvdXQgIT09IHZvaWQgMCA/IF9vcHRpb25zJHRpbWVvdXQgOiBJbmZpbml0eTtcbiAgICB2YXIgYWJvcnRBZnRlclRpbWVzdGFtcCA9IERhdGUubm93KCkgKyBtYXhFeGVjdXRpb25UaW1lO1xuICAgIHZhciBiZXN0UGF0aCA9IFt7XG4gICAgICBvbGRQb3M6IC0xLFxuICAgICAgbGFzdENvbXBvbmVudDogdW5kZWZpbmVkXG4gICAgfV07IC8vIFNlZWQgZWRpdExlbmd0aCA9IDAsIGkuZS4gdGhlIGNvbnRlbnQgc3RhcnRzIHdpdGggdGhlIHNhbWUgdmFsdWVzXG5cbiAgICB2YXIgbmV3UG9zID0gdGhpcy5leHRyYWN0Q29tbW9uKGJlc3RQYXRoWzBdLCBuZXdTdHJpbmcsIG9sZFN0cmluZywgMCk7XG5cbiAgICBpZiAoYmVzdFBhdGhbMF0ub2xkUG9zICsgMSA+PSBvbGRMZW4gJiYgbmV3UG9zICsgMSA+PSBuZXdMZW4pIHtcbiAgICAgIC8vIElkZW50aXR5IHBlciB0aGUgZXF1YWxpdHkgYW5kIHRva2VuaXplclxuICAgICAgcmV0dXJuIGRvbmUoW3tcbiAgICAgICAgdmFsdWU6IHRoaXMuam9pbihuZXdTdHJpbmcpLFxuICAgICAgICBjb3VudDogbmV3U3RyaW5nLmxlbmd0aFxuICAgICAgfV0pO1xuICAgIH0gLy8gT25jZSB3ZSBoaXQgdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIGVkaXQgZ3JhcGggb24gc29tZSBkaWFnb25hbCBrLCB3ZSBjYW5cbiAgICAvLyBkZWZpbml0ZWx5IHJlYWNoIHRoZSBlbmQgb2YgdGhlIGVkaXQgZ3JhcGggaW4gbm8gbW9yZSB0aGFuIGsgZWRpdHMsIHNvXG4gICAgLy8gdGhlcmUncyBubyBwb2ludCBpbiBjb25zaWRlcmluZyBhbnkgbW92ZXMgdG8gZGlhZ29uYWwgaysxIGFueSBtb3JlIChmcm9tXG4gICAgLy8gd2hpY2ggd2UncmUgZ3VhcmFudGVlZCB0byBuZWVkIGF0IGxlYXN0IGsrMSBtb3JlIGVkaXRzKS5cbiAgICAvLyBTaW1pbGFybHksIG9uY2Ugd2UndmUgcmVhY2hlZCB0aGUgYm90dG9tIG9mIHRoZSBlZGl0IGdyYXBoLCB0aGVyZSdzIG5vXG4gICAgLy8gcG9pbnQgY29uc2lkZXJpbmcgbW92ZXMgdG8gbG93ZXIgZGlhZ29uYWxzLlxuICAgIC8vIFdlIHJlY29yZCB0aGlzIGZhY3QgYnkgc2V0dGluZyBtaW5EaWFnb25hbFRvQ29uc2lkZXIgYW5kXG4gICAgLy8gbWF4RGlhZ29uYWxUb0NvbnNpZGVyIHRvIHNvbWUgZmluaXRlIHZhbHVlIG9uY2Ugd2UndmUgaGl0IHRoZSBlZGdlIG9mXG4gICAgLy8gdGhlIGVkaXQgZ3JhcGguXG4gICAgLy8gVGhpcyBvcHRpbWl6YXRpb24gaXMgbm90IGZhaXRoZnVsIHRvIHRoZSBvcmlnaW5hbCBhbGdvcml0aG0gcHJlc2VudGVkIGluXG4gICAgLy8gTXllcnMncyBwYXBlciwgd2hpY2ggaW5zdGVhZCBwb2ludGxlc3NseSBleHRlbmRzIEQtcGF0aHMgb2ZmIHRoZSBlbmQgb2ZcbiAgICAvLyB0aGUgZWRpdCBncmFwaCAtIHNlZSBwYWdlIDcgb2YgTXllcnMncyBwYXBlciB3aGljaCBub3RlcyB0aGlzIHBvaW50XG4gICAgLy8gZXhwbGljaXRseSBhbmQgaWxsdXN0cmF0ZXMgaXQgd2l0aCBhIGRpYWdyYW0uIFRoaXMgaGFzIG1ham9yIHBlcmZvcm1hbmNlXG4gICAgLy8gaW1wbGljYXRpb25zIGZvciBzb21lIGNvbW1vbiBzY2VuYXJpb3MuIEZvciBpbnN0YW5jZSwgdG8gY29tcHV0ZSBhIGRpZmZcbiAgICAvLyB3aGVyZSB0aGUgbmV3IHRleHQgc2ltcGx5IGFwcGVuZHMgZCBjaGFyYWN0ZXJzIG9uIHRoZSBlbmQgb2YgdGhlXG4gICAgLy8gb3JpZ2luYWwgdGV4dCBvZiBsZW5ndGggbiwgdGhlIHRydWUgTXllcnMgYWxnb3JpdGhtIHdpbGwgdGFrZSBPKG4rZF4yKVxuICAgIC8vIHRpbWUgd2hpbGUgdGhpcyBvcHRpbWl6YXRpb24gbmVlZHMgb25seSBPKG4rZCkgdGltZS5cblxuXG4gICAgdmFyIG1pbkRpYWdvbmFsVG9Db25zaWRlciA9IC1JbmZpbml0eSxcbiAgICAgICAgbWF4RGlhZ29uYWxUb0NvbnNpZGVyID0gSW5maW5pdHk7IC8vIE1haW4gd29ya2VyIG1ldGhvZC4gY2hlY2tzIGFsbCBwZXJtdXRhdGlvbnMgb2YgYSBnaXZlbiBlZGl0IGxlbmd0aCBmb3IgYWNjZXB0YW5jZS5cblxuICAgIGZ1bmN0aW9uIGV4ZWNFZGl0TGVuZ3RoKCkge1xuICAgICAgZm9yICh2YXIgZGlhZ29uYWxQYXRoID0gTWF0aC5tYXgobWluRGlhZ29uYWxUb0NvbnNpZGVyLCAtZWRpdExlbmd0aCk7IGRpYWdvbmFsUGF0aCA8PSBNYXRoLm1pbihtYXhEaWFnb25hbFRvQ29uc2lkZXIsIGVkaXRMZW5ndGgpOyBkaWFnb25hbFBhdGggKz0gMikge1xuICAgICAgICB2YXIgYmFzZVBhdGggPVxuICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICAgICAgIHZvaWQgMFxuICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgICAgICA7XG4gICAgICAgIHZhciByZW1vdmVQYXRoID0gYmVzdFBhdGhbZGlhZ29uYWxQYXRoIC0gMV0sXG4gICAgICAgICAgICBhZGRQYXRoID0gYmVzdFBhdGhbZGlhZ29uYWxQYXRoICsgMV07XG5cbiAgICAgICAgaWYgKHJlbW92ZVBhdGgpIHtcbiAgICAgICAgICAvLyBObyBvbmUgZWxzZSBpcyBnb2luZyB0byBhdHRlbXB0IHRvIHVzZSB0aGlzIHZhbHVlLCBjbGVhciBpdFxuICAgICAgICAgIGJlc3RQYXRoW2RpYWdvbmFsUGF0aCAtIDFdID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNhbkFkZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChhZGRQYXRoKSB7XG4gICAgICAgICAgLy8gd2hhdCBuZXdQb3Mgd2lsbCBiZSBhZnRlciB3ZSBkbyBhbiBpbnNlcnRpb246XG4gICAgICAgICAgdmFyIGFkZFBhdGhOZXdQb3MgPSBhZGRQYXRoLm9sZFBvcyAtIGRpYWdvbmFsUGF0aDtcbiAgICAgICAgICBjYW5BZGQgPSBhZGRQYXRoICYmIDAgPD0gYWRkUGF0aE5ld1BvcyAmJiBhZGRQYXRoTmV3UG9zIDwgbmV3TGVuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNhblJlbW92ZSA9IHJlbW92ZVBhdGggJiYgcmVtb3ZlUGF0aC5vbGRQb3MgKyAxIDwgb2xkTGVuO1xuXG4gICAgICAgIGlmICghY2FuQWRkICYmICFjYW5SZW1vdmUpIHtcbiAgICAgICAgICAvLyBJZiB0aGlzIHBhdGggaXMgYSB0ZXJtaW5hbCB0aGVuIHBydW5lXG4gICAgICAgICAgYmVzdFBhdGhbZGlhZ29uYWxQYXRoXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSAvLyBTZWxlY3QgdGhlIGRpYWdvbmFsIHRoYXQgd2Ugd2FudCB0byBicmFuY2ggZnJvbS4gV2Ugc2VsZWN0IHRoZSBwcmlvclxuICAgICAgICAvLyBwYXRoIHdob3NlIHBvc2l0aW9uIGluIHRoZSBvbGQgc3RyaW5nIGlzIHRoZSBmYXJ0aGVzdCBmcm9tIHRoZSBvcmlnaW5cbiAgICAgICAgLy8gYW5kIGRvZXMgbm90IHBhc3MgdGhlIGJvdW5kcyBvZiB0aGUgZGlmZiBncmFwaFxuICAgICAgICAvLyBUT0RPOiBSZW1vdmUgdGhlIGArIDFgIGhlcmUgdG8gbWFrZSBiZWhhdmlvciBtYXRjaCBNeWVycyBhbGdvcml0aG1cbiAgICAgICAgLy8gICAgICAgYW5kIHByZWZlciB0byBvcmRlciByZW1vdmFscyBiZWZvcmUgaW5zZXJ0aW9ucy5cblxuXG4gICAgICAgIGlmICghY2FuUmVtb3ZlIHx8IGNhbkFkZCAmJiByZW1vdmVQYXRoLm9sZFBvcyArIDEgPCBhZGRQYXRoLm9sZFBvcykge1xuICAgICAgICAgIGJhc2VQYXRoID0gc2VsZi5hZGRUb1BhdGgoYWRkUGF0aCwgdHJ1ZSwgdW5kZWZpbmVkLCAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBiYXNlUGF0aCA9IHNlbGYuYWRkVG9QYXRoKHJlbW92ZVBhdGgsIHVuZGVmaW5lZCwgdHJ1ZSwgMSk7XG4gICAgICAgIH1cblxuICAgICAgICBuZXdQb3MgPSBzZWxmLmV4dHJhY3RDb21tb24oYmFzZVBhdGgsIG5ld1N0cmluZywgb2xkU3RyaW5nLCBkaWFnb25hbFBhdGgpO1xuXG4gICAgICAgIGlmIChiYXNlUGF0aC5vbGRQb3MgKyAxID49IG9sZExlbiAmJiBuZXdQb3MgKyAxID49IG5ld0xlbikge1xuICAgICAgICAgIC8vIElmIHdlIGhhdmUgaGl0IHRoZSBlbmQgb2YgYm90aCBzdHJpbmdzLCB0aGVuIHdlIGFyZSBkb25lXG4gICAgICAgICAgcmV0dXJuIGRvbmUoYnVpbGRWYWx1ZXMoc2VsZiwgYmFzZVBhdGgubGFzdENvbXBvbmVudCwgbmV3U3RyaW5nLCBvbGRTdHJpbmcsIHNlbGYudXNlTG9uZ2VzdFRva2VuKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYmVzdFBhdGhbZGlhZ29uYWxQYXRoXSA9IGJhc2VQYXRoO1xuXG4gICAgICAgICAgaWYgKGJhc2VQYXRoLm9sZFBvcyArIDEgPj0gb2xkTGVuKSB7XG4gICAgICAgICAgICBtYXhEaWFnb25hbFRvQ29uc2lkZXIgPSBNYXRoLm1pbihtYXhEaWFnb25hbFRvQ29uc2lkZXIsIGRpYWdvbmFsUGF0aCAtIDEpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChuZXdQb3MgKyAxID49IG5ld0xlbikge1xuICAgICAgICAgICAgbWluRGlhZ29uYWxUb0NvbnNpZGVyID0gTWF0aC5tYXgobWluRGlhZ29uYWxUb0NvbnNpZGVyLCBkaWFnb25hbFBhdGggKyAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZWRpdExlbmd0aCsrO1xuICAgIH0gLy8gUGVyZm9ybXMgdGhlIGxlbmd0aCBvZiBlZGl0IGl0ZXJhdGlvbi4gSXMgYSBiaXQgZnVnbHkgYXMgdGhpcyBoYXMgdG8gc3VwcG9ydCB0aGVcbiAgICAvLyBzeW5jIGFuZCBhc3luYyBtb2RlIHdoaWNoIGlzIG5ldmVyIGZ1bi4gTG9vcHMgb3ZlciBleGVjRWRpdExlbmd0aCB1bnRpbCBhIHZhbHVlXG4gICAgLy8gaXMgcHJvZHVjZWQsIG9yIHVudGlsIHRoZSBlZGl0IGxlbmd0aCBleGNlZWRzIG9wdGlvbnMubWF4RWRpdExlbmd0aCAoaWYgZ2l2ZW4pLFxuICAgIC8vIGluIHdoaWNoIGNhc2UgaXQgd2lsbCByZXR1cm4gdW5kZWZpbmVkLlxuXG5cbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIChmdW5jdGlvbiBleGVjKCkge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoZWRpdExlbmd0aCA+IG1heEVkaXRMZW5ndGggfHwgRGF0ZS5ub3coKSA+IGFib3J0QWZ0ZXJUaW1lc3RhbXApIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghZXhlY0VkaXRMZW5ndGgoKSkge1xuICAgICAgICAgICAgZXhlYygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgMCk7XG4gICAgICB9KSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aGlsZSAoZWRpdExlbmd0aCA8PSBtYXhFZGl0TGVuZ3RoICYmIERhdGUubm93KCkgPD0gYWJvcnRBZnRlclRpbWVzdGFtcCkge1xuICAgICAgICB2YXIgcmV0ID0gZXhlY0VkaXRMZW5ndGgoKTtcblxuICAgICAgICBpZiAocmV0KSB7XG4gICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5cbiAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgYWRkVG9QYXRoOiBmdW5jdGlvbiBhZGRUb1BhdGgocGF0aCwgYWRkZWQsIHJlbW92ZWQsIG9sZFBvc0luYykge1xuICAgIHZhciBsYXN0ID0gcGF0aC5sYXN0Q29tcG9uZW50O1xuXG4gICAgaWYgKGxhc3QgJiYgbGFzdC5hZGRlZCA9PT0gYWRkZWQgJiYgbGFzdC5yZW1vdmVkID09PSByZW1vdmVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvbGRQb3M6IHBhdGgub2xkUG9zICsgb2xkUG9zSW5jLFxuICAgICAgICBsYXN0Q29tcG9uZW50OiB7XG4gICAgICAgICAgY291bnQ6IGxhc3QuY291bnQgKyAxLFxuICAgICAgICAgIGFkZGVkOiBhZGRlZCxcbiAgICAgICAgICByZW1vdmVkOiByZW1vdmVkLFxuICAgICAgICAgIHByZXZpb3VzQ29tcG9uZW50OiBsYXN0LnByZXZpb3VzQ29tcG9uZW50XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9sZFBvczogcGF0aC5vbGRQb3MgKyBvbGRQb3NJbmMsXG4gICAgICAgIGxhc3RDb21wb25lbnQ6IHtcbiAgICAgICAgICBjb3VudDogMSxcbiAgICAgICAgICBhZGRlZDogYWRkZWQsXG4gICAgICAgICAgcmVtb3ZlZDogcmVtb3ZlZCxcbiAgICAgICAgICBwcmV2aW91c0NvbXBvbmVudDogbGFzdFxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfSxcblxuICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5cbiAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgZXh0cmFjdENvbW1vbjogZnVuY3Rpb24gZXh0cmFjdENvbW1vbihiYXNlUGF0aCwgbmV3U3RyaW5nLCBvbGRTdHJpbmcsIGRpYWdvbmFsUGF0aCkge1xuICAgIHZhciBuZXdMZW4gPSBuZXdTdHJpbmcubGVuZ3RoLFxuICAgICAgICBvbGRMZW4gPSBvbGRTdHJpbmcubGVuZ3RoLFxuICAgICAgICBvbGRQb3MgPSBiYXNlUGF0aC5vbGRQb3MsXG4gICAgICAgIG5ld1BvcyA9IG9sZFBvcyAtIGRpYWdvbmFsUGF0aCxcbiAgICAgICAgY29tbW9uQ291bnQgPSAwO1xuXG4gICAgd2hpbGUgKG5ld1BvcyArIDEgPCBuZXdMZW4gJiYgb2xkUG9zICsgMSA8IG9sZExlbiAmJiB0aGlzLmVxdWFscyhuZXdTdHJpbmdbbmV3UG9zICsgMV0sIG9sZFN0cmluZ1tvbGRQb3MgKyAxXSkpIHtcbiAgICAgIG5ld1BvcysrO1xuICAgICAgb2xkUG9zKys7XG4gICAgICBjb21tb25Db3VudCsrO1xuICAgIH1cblxuICAgIGlmIChjb21tb25Db3VudCkge1xuICAgICAgYmFzZVBhdGgubGFzdENvbXBvbmVudCA9IHtcbiAgICAgICAgY291bnQ6IGNvbW1vbkNvdW50LFxuICAgICAgICBwcmV2aW91c0NvbXBvbmVudDogYmFzZVBhdGgubGFzdENvbXBvbmVudFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBiYXNlUGF0aC5vbGRQb3MgPSBvbGRQb3M7XG4gICAgcmV0dXJuIG5ld1BvcztcbiAgfSxcblxuICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5cbiAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgZXF1YWxzOiBmdW5jdGlvbiBlcXVhbHMobGVmdCwgcmlnaHQpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmNvbXBhcmF0b3IpIHtcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuY29tcGFyYXRvcihsZWZ0LCByaWdodCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBsZWZ0ID09PSByaWdodCB8fCB0aGlzLm9wdGlvbnMuaWdub3JlQ2FzZSAmJiBsZWZ0LnRvTG93ZXJDYXNlKCkgPT09IHJpZ2h0LnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICB9LFxuXG4gIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cblxuICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICByZW1vdmVFbXB0eTogZnVuY3Rpb24gcmVtb3ZlRW1wdHkoYXJyYXkpIHtcbiAgICB2YXIgcmV0ID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYXJyYXlbaV0pIHtcbiAgICAgICAgcmV0LnB1c2goYXJyYXlbaV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXQ7XG4gIH0sXG5cbiAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuXG4gIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gIGNhc3RJbnB1dDogZnVuY3Rpb24gY2FzdElucHV0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9LFxuXG4gIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cblxuICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICB0b2tlbml6ZTogZnVuY3Rpb24gdG9rZW5pemUodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUuc3BsaXQoJycpO1xuICB9LFxuXG4gIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cblxuICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICBqb2luOiBmdW5jdGlvbiBqb2luKGNoYXJzKSB7XG4gICAgcmV0dXJuIGNoYXJzLmpvaW4oJycpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBidWlsZFZhbHVlcyhkaWZmLCBsYXN0Q29tcG9uZW50LCBuZXdTdHJpbmcsIG9sZFN0cmluZywgdXNlTG9uZ2VzdFRva2VuKSB7XG4gIC8vIEZpcnN0IHdlIGNvbnZlcnQgb3VyIGxpbmtlZCBsaXN0IG9mIGNvbXBvbmVudHMgaW4gcmV2ZXJzZSBvcmRlciB0byBhblxuICAvLyBhcnJheSBpbiB0aGUgcmlnaHQgb3JkZXI6XG4gIHZhciBjb21wb25lbnRzID0gW107XG4gIHZhciBuZXh0Q29tcG9uZW50O1xuXG4gIHdoaWxlIChsYXN0Q29tcG9uZW50KSB7XG4gICAgY29tcG9uZW50cy5wdXNoKGxhc3RDb21wb25lbnQpO1xuICAgIG5leHRDb21wb25lbnQgPSBsYXN0Q29tcG9uZW50LnByZXZpb3VzQ29tcG9uZW50O1xuICAgIGRlbGV0ZSBsYXN0Q29tcG9uZW50LnByZXZpb3VzQ29tcG9uZW50O1xuICAgIGxhc3RDb21wb25lbnQgPSBuZXh0Q29tcG9uZW50O1xuICB9XG5cbiAgY29tcG9uZW50cy5yZXZlcnNlKCk7XG4gIHZhciBjb21wb25lbnRQb3MgPSAwLFxuICAgICAgY29tcG9uZW50TGVuID0gY29tcG9uZW50cy5sZW5ndGgsXG4gICAgICBuZXdQb3MgPSAwLFxuICAgICAgb2xkUG9zID0gMDtcblxuICBmb3IgKDsgY29tcG9uZW50UG9zIDwgY29tcG9uZW50TGVuOyBjb21wb25lbnRQb3MrKykge1xuICAgIHZhciBjb21wb25lbnQgPSBjb21wb25lbnRzW2NvbXBvbmVudFBvc107XG5cbiAgICBpZiAoIWNvbXBvbmVudC5yZW1vdmVkKSB7XG4gICAgICBpZiAoIWNvbXBvbmVudC5hZGRlZCAmJiB1c2VMb25nZXN0VG9rZW4pIHtcbiAgICAgICAgdmFyIHZhbHVlID0gbmV3U3RyaW5nLnNsaWNlKG5ld1BvcywgbmV3UG9zICsgY29tcG9uZW50LmNvdW50KTtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5tYXAoZnVuY3Rpb24gKHZhbHVlLCBpKSB7XG4gICAgICAgICAgdmFyIG9sZFZhbHVlID0gb2xkU3RyaW5nW29sZFBvcyArIGldO1xuICAgICAgICAgIHJldHVybiBvbGRWYWx1ZS5sZW5ndGggPiB2YWx1ZS5sZW5ndGggPyBvbGRWYWx1ZSA6IHZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgICAgY29tcG9uZW50LnZhbHVlID0gZGlmZi5qb2luKHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBvbmVudC52YWx1ZSA9IGRpZmYuam9pbihuZXdTdHJpbmcuc2xpY2UobmV3UG9zLCBuZXdQb3MgKyBjb21wb25lbnQuY291bnQpKTtcbiAgICAgIH1cblxuICAgICAgbmV3UG9zICs9IGNvbXBvbmVudC5jb3VudDsgLy8gQ29tbW9uIGNhc2VcblxuICAgICAgaWYgKCFjb21wb25lbnQuYWRkZWQpIHtcbiAgICAgICAgb2xkUG9zICs9IGNvbXBvbmVudC5jb3VudDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29tcG9uZW50LnZhbHVlID0gZGlmZi5qb2luKG9sZFN0cmluZy5zbGljZShvbGRQb3MsIG9sZFBvcyArIGNvbXBvbmVudC5jb3VudCkpO1xuICAgICAgb2xkUG9zICs9IGNvbXBvbmVudC5jb3VudDsgLy8gUmV2ZXJzZSBhZGQgYW5kIHJlbW92ZSBzbyByZW1vdmVzIGFyZSBvdXRwdXQgZmlyc3QgdG8gbWF0Y2ggY29tbW9uIGNvbnZlbnRpb25cbiAgICAgIC8vIFRoZSBkaWZmaW5nIGFsZ29yaXRobSBpcyB0aWVkIHRvIGFkZCB0aGVuIHJlbW92ZSBvdXRwdXQgYW5kIHRoaXMgaXMgdGhlIHNpbXBsZXN0XG4gICAgICAvLyByb3V0ZSB0byBnZXQgdGhlIGRlc2lyZWQgb3V0cHV0IHdpdGggbWluaW1hbCBvdmVyaGVhZC5cblxuICAgICAgaWYgKGNvbXBvbmVudFBvcyAmJiBjb21wb25lbnRzW2NvbXBvbmVudFBvcyAtIDFdLmFkZGVkKSB7XG4gICAgICAgIHZhciB0bXAgPSBjb21wb25lbnRzW2NvbXBvbmVudFBvcyAtIDFdO1xuICAgICAgICBjb21wb25lbnRzW2NvbXBvbmVudFBvcyAtIDFdID0gY29tcG9uZW50c1tjb21wb25lbnRQb3NdO1xuICAgICAgICBjb21wb25lbnRzW2NvbXBvbmVudFBvc10gPSB0bXA7XG4gICAgICB9XG4gICAgfVxuICB9IC8vIFNwZWNpYWwgY2FzZSBoYW5kbGUgZm9yIHdoZW4gb25lIHRlcm1pbmFsIGlzIGlnbm9yZWQgKGkuZS4gd2hpdGVzcGFjZSkuXG4gIC8vIEZvciB0aGlzIGNhc2Ugd2UgbWVyZ2UgdGhlIHRlcm1pbmFsIGludG8gdGhlIHByaW9yIHN0cmluZyBhbmQgZHJvcCB0aGUgY2hhbmdlLlxuICAvLyBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBzdHJpbmcgbW9kZS5cblxuXG4gIHZhciBmaW5hbENvbXBvbmVudCA9IGNvbXBvbmVudHNbY29tcG9uZW50TGVuIC0gMV07XG5cbiAgaWYgKGNvbXBvbmVudExlbiA+IDEgJiYgdHlwZW9mIGZpbmFsQ29tcG9uZW50LnZhbHVlID09PSAnc3RyaW5nJyAmJiAoZmluYWxDb21wb25lbnQuYWRkZWQgfHwgZmluYWxDb21wb25lbnQucmVtb3ZlZCkgJiYgZGlmZi5lcXVhbHMoJycsIGZpbmFsQ29tcG9uZW50LnZhbHVlKSkge1xuICAgIGNvbXBvbmVudHNbY29tcG9uZW50TGVuIC0gMl0udmFsdWUgKz0gZmluYWxDb21wb25lbnQudmFsdWU7XG4gICAgY29tcG9uZW50cy5wb3AoKTtcbiAgfVxuXG4gIHJldHVybiBjb21wb25lbnRzO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMM055WXk5a2FXWm1MMkpoYzJVdWFuTWlYU3dpYm1GdFpYTWlPbHNpUkdsbVppSXNJbkJ5YjNSdmRIbHdaU0lzSW1ScFptWWlMQ0p2YkdSVGRISnBibWNpTENKdVpYZFRkSEpwYm1jaUxDSnZjSFJwYjI1eklpd2lZMkZzYkdKaFkyc2lMQ0p6Wld4bUlpd2laRzl1WlNJc0luWmhiSFZsSWl3aWMyVjBWR2x0Wlc5MWRDSXNJblZ1WkdWbWFXNWxaQ0lzSW1OaGMzUkpibkIxZENJc0luSmxiVzkyWlVWdGNIUjVJaXdpZEc5clpXNXBlbVVpTENKdVpYZE1aVzRpTENKc1pXNW5kR2dpTENKdmJHUk1aVzRpTENKbFpHbDBUR1Z1WjNSb0lpd2liV0Y0UldScGRFeGxibWQwYUNJc0lrMWhkR2dpTENKdGFXNGlMQ0p0WVhoRmVHVmpkWFJwYjI1VWFXMWxJaXdpZEdsdFpXOTFkQ0lzSWtsdVptbHVhWFI1SWl3aVlXSnZjblJCWm5SbGNsUnBiV1Z6ZEdGdGNDSXNJa1JoZEdVaUxDSnViM2NpTENKaVpYTjBVR0YwYUNJc0ltOXNaRkJ2Y3lJc0lteGhjM1JEYjIxd2IyNWxiblFpTENKdVpYZFFiM01pTENKbGVIUnlZV04wUTI5dGJXOXVJaXdpYW05cGJpSXNJbU52ZFc1MElpd2liV2x1UkdsaFoyOXVZV3hVYjBOdmJuTnBaR1Z5SWl3aWJXRjRSR2xoWjI5dVlXeFViME52Ym5OcFpHVnlJaXdpWlhobFkwVmthWFJNWlc1bmRHZ2lMQ0prYVdGbmIyNWhiRkJoZEdnaUxDSnRZWGdpTENKaVlYTmxVR0YwYUNJc0luSmxiVzkyWlZCaGRHZ2lMQ0poWkdSUVlYUm9JaXdpWTJGdVFXUmtJaXdpWVdSa1VHRjBhRTVsZDFCdmN5SXNJbU5oYmxKbGJXOTJaU0lzSW1Ga1pGUnZVR0YwYUNJc0ltSjFhV3hrVm1Gc2RXVnpJaXdpZFhObFRHOXVaMlZ6ZEZSdmEyVnVJaXdpWlhobFl5SXNJbkpsZENJc0luQmhkR2dpTENKaFpHUmxaQ0lzSW5KbGJXOTJaV1FpTENKdmJHUlFiM05KYm1NaUxDSnNZWE4wSWl3aWNISmxkbWx2ZFhORGIyMXdiMjVsYm5RaUxDSmpiMjF0YjI1RGIzVnVkQ0lzSW1WeGRXRnNjeUlzSW14bFpuUWlMQ0p5YVdkb2RDSXNJbU52YlhCaGNtRjBiM0lpTENKcFoyNXZjbVZEWVhObElpd2lkRzlNYjNkbGNrTmhjMlVpTENKaGNuSmhlU0lzSW1raUxDSndkWE5vSWl3aWMzQnNhWFFpTENKamFHRnljeUlzSW1OdmJYQnZibVZ1ZEhNaUxDSnVaWGgwUTI5dGNHOXVaVzUwSWl3aWNtVjJaWEp6WlNJc0ltTnZiWEJ2Ym1WdWRGQnZjeUlzSW1OdmJYQnZibVZ1ZEV4bGJpSXNJbU52YlhCdmJtVnVkQ0lzSW5Oc2FXTmxJaXdpYldGd0lpd2liMnhrVm1Gc2RXVWlMQ0owYlhBaUxDSm1hVzVoYkVOdmJYQnZibVZ1ZENJc0luQnZjQ0pkTENKdFlYQndhVzVuY3lJNklqczdPenM3T3pzN08wRkJRV1VzVTBGQlUwRXNTVUZCVkN4SFFVRm5RaXhEUVVGRk96dEJRVVZxUTBFc1NVRkJTU3hEUVVGRFF5eFRRVUZNTEVkQlFXbENPMEZCUVVFN08wRkJRVUU3UVVGRFprTXNSVUZCUVVFc1NVRkVaU3huUWtGRFZrTXNVMEZFVlN4RlFVTkRReXhUUVVSRUxFVkJRekJDTzBGQlFVRTdRVUZCUVRzN1FVRkJRVHRCUVVGQk8wRkJRV1JETEVsQlFVRkJMRTlCUVdNc2RVVkJRVW9zUlVGQlNUdEJRVU4yUXl4UlFVRkpReXhSUVVGUkxFZEJRVWRFTEU5QlFVOHNRMEZCUTBNc1VVRkJka0k3TzBGQlEwRXNVVUZCU1N4UFFVRlBSQ3hQUVVGUUxFdEJRVzFDTEZWQlFYWkNMRVZCUVcxRE8wRkJRMnBEUXl4TlFVRkJRU3hSUVVGUkxFZEJRVWRFTEU5QlFWZzdRVUZEUVVFc1RVRkJRVUVzVDBGQlR5eEhRVUZITEVWQlFWWTdRVUZEUkRzN1FVRkRSQ3hUUVVGTFFTeFBRVUZNTEVkQlFXVkJMRTlCUVdZN1FVRkZRU3hSUVVGSlJTeEpRVUZKTEVkQlFVY3NTVUZCV0RzN1FVRkZRU3hoUVVGVFF5eEpRVUZVTEVOQlFXTkRMRXRCUVdRc1JVRkJjVUk3UVVGRGJrSXNWVUZCU1Vnc1VVRkJTaXhGUVVGak8wRkJRMXBKTEZGQlFVRkJMRlZCUVZVc1EwRkJReXhaUVVGWE8wRkJRVVZLTEZWQlFVRkJMRkZCUVZFc1EwRkJRMHNzVTBGQlJDeEZRVUZaUml4TFFVRmFMRU5CUVZJN1FVRkJOa0lzVTBGQk0wTXNSVUZCTmtNc1EwRkJOME1zUTBGQlZqdEJRVU5CTEdWQlFVOHNTVUZCVUR0QlFVTkVMRTlCU0VRc1RVRkhUenRCUVVOTUxHVkJRVTlCTEV0QlFWQTdRVUZEUkR0QlFVTkdMRXRCYWtKelF5eERRVzFDZGtNN096dEJRVU5CVGl4SlFVRkJRU3hUUVVGVExFZEJRVWNzUzBGQlMxTXNVMEZCVEN4RFFVRmxWQ3hUUVVGbUxFTkJRVm83UVVGRFFVTXNTVUZCUVVFc1UwRkJVeXhIUVVGSExFdEJRVXRSTEZOQlFVd3NRMEZCWlZJc1UwRkJaaXhEUVVGYU8wRkJSVUZFTEVsQlFVRkJMRk5CUVZNc1IwRkJSeXhMUVVGTFZTeFhRVUZNTEVOQlFXbENMRXRCUVV0RExGRkJRVXdzUTBGQlkxZ3NVMEZCWkN4RFFVRnFRaXhEUVVGYU8wRkJRMEZETEVsQlFVRkJMRk5CUVZNc1IwRkJSeXhMUVVGTFV5eFhRVUZNTEVOQlFXbENMRXRCUVV0RExGRkJRVXdzUTBGQlkxWXNVMEZCWkN4RFFVRnFRaXhEUVVGYU8wRkJSVUVzVVVGQlNWY3NUVUZCVFN4SFFVRkhXQ3hUUVVGVExFTkJRVU5aTEUxQlFYWkNPMEZCUVVFc1VVRkJLMEpETEUxQlFVMHNSMEZCUjJRc1UwRkJVeXhEUVVGRFlTeE5RVUZzUkR0QlFVTkJMRkZCUVVsRkxGVkJRVlVzUjBGQlJ5eERRVUZxUWp0QlFVTkJMRkZCUVVsRExHRkJRV0VzUjBGQlIwb3NUVUZCVFN4SFFVRkhSU3hOUVVFM1FqczdRVUZEUVN4UlFVRkhXaXhQUVVGUExFTkJRVU5qTEdGQlFWZ3NSVUZCTUVJN1FVRkRlRUpCTEUxQlFVRkJMR0ZCUVdFc1IwRkJSME1zU1VGQlNTeERRVUZEUXl4SFFVRk1MRU5CUVZOR0xHRkJRVlFzUlVGQmQwSmtMRTlCUVU4c1EwRkJRMk1zWVVGQmFFTXNRMEZCYUVJN1FVRkRSRHM3UVVGRFJDeFJRVUZOUnl4blFrRkJaMEk3UVVGQlFUdEJRVUZCTzBGQlFVRTdRVUZCUjJwQ0xFbEJRVUZCTEU5QlFVOHNRMEZCUTJ0Q0xFOUJRVmdzSzBSQlFYTkNReXhSUVVFMVF6dEJRVU5CTEZGQlFVMURMRzFDUVVGdFFpeEhRVUZIUXl4SlFVRkpMRU5CUVVORExFZEJRVXdzUzBGQllVd3NaMEpCUVhwRE8wRkJSVUVzVVVGQlNVMHNVVUZCVVN4SFFVRkhMRU5CUVVNN1FVRkJSVU1zVFVGQlFVRXNUVUZCVFN4RlFVRkZMRU5CUVVNc1EwRkJXRHRCUVVGalF5eE5RVUZCUVN4aFFVRmhMRVZCUVVWdVFqdEJRVUUzUWl4TFFVRkVMRU5CUVdZc1EwRnVRM1ZETEVOQmNVTjJRenM3UVVGRFFTeFJRVUZKYjBJc1RVRkJUU3hIUVVGSExFdEJRVXRETEdGQlFVd3NRMEZCYlVKS0xGRkJRVkVzUTBGQlF5eERRVUZFTEVOQlFUTkNMRVZCUVdkRGVFSXNVMEZCYUVNc1JVRkJNa05FTEZOQlFUTkRMRVZCUVhORUxFTkJRWFJFTEVOQlFXSTdPMEZCUTBFc1VVRkJTWGxDTEZGQlFWRXNRMEZCUXl4RFFVRkVMRU5CUVZJc1EwRkJXVU1zVFVGQldpeEhRVUZ4UWl4RFFVRnlRaXhKUVVFd1Fsb3NUVUZCTVVJc1NVRkJiME5qTEUxQlFVMHNSMEZCUnl4RFFVRlVMRWxCUVdOb1FpeE5RVUYwUkN4RlFVRTRSRHRCUVVNMVJEdEJRVU5CTEdGQlFVOVFMRWxCUVVrc1EwRkJReXhEUVVGRE8wRkJRVU5ETEZGQlFVRkJMRXRCUVVzc1JVRkJSU3hMUVVGTGQwSXNTVUZCVEN4RFFVRlZOMElzVTBGQlZpeERRVUZTTzBGQlFUaENPRUlzVVVGQlFVRXNTMEZCU3l4RlFVRkZPVUlzVTBGQlV5eERRVUZEV1R0QlFVRXZReXhQUVVGRUxFTkJRVVFzUTBGQldEdEJRVU5FTEV0Qk1VTnpReXhEUVRSRGRrTTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUczdPMEZCUTBFc1VVRkJTVzFDTEhGQ1FVRnhRaXhIUVVGSExFTkJRVU5ZTEZGQlFUZENPMEZCUVVFc1VVRkJkVU5aTEhGQ1FVRnhRaXhIUVVGSFdpeFJRVUV2UkN4RFFUZEVkVU1zUTBFclJIWkRPenRCUVVOQkxHRkJRVk5oTEdOQlFWUXNSMEZCTUVJN1FVRkRlRUlzVjBGRFJTeEpRVUZKUXl4WlFVRlpMRWRCUVVkc1FpeEpRVUZKTEVOQlFVTnRRaXhIUVVGTUxFTkJRVk5LTEhGQ1FVRlVMRVZCUVdkRExFTkJRVU5xUWl4VlFVRnFReXhEUVVSeVFpeEZRVVZGYjBJc1dVRkJXU3hKUVVGSmJFSXNTVUZCU1N4RFFVRkRReXhIUVVGTUxFTkJRVk5sTEhGQ1FVRlVMRVZCUVdkRGJFSXNWVUZCYUVNc1EwRkdiRUlzUlVGSFJXOUNMRmxCUVZrc1NVRkJTU3hEUVVoc1FpeEZRVWxGTzBGQlEwRXNXVUZCU1VVc1VVRkJVVHRCUVVGQk8wRkJRVUU3UVVGQldqdEJRVUZCTzBGQlEwRXNXVUZCU1VNc1ZVRkJWU3hIUVVGSFlpeFJRVUZSTEVOQlFVTlZMRmxCUVZrc1IwRkJSeXhEUVVGb1FpeERRVUY2UWp0QlFVRkJMRmxCUTBsSkxFOUJRVThzUjBGQlIyUXNVVUZCVVN4RFFVRkRWU3haUVVGWkxFZEJRVWNzUTBGQmFFSXNRMEZFZEVJN08wRkJSVUVzV1VGQlNVY3NWVUZCU2l4RlFVRm5RanRCUVVOa08wRkJRMEZpTEZWQlFVRkJMRkZCUVZFc1EwRkJRMVVzV1VGQldTeEhRVUZITEVOQlFXaENMRU5CUVZJc1IwRkJOa0l6UWl4VFFVRTNRanRCUVVORU96dEJRVVZFTEZsQlFVbG5ReXhOUVVGTkxFZEJRVWNzUzBGQllqczdRVUZEUVN4WlFVRkpSQ3hQUVVGS0xFVkJRV0U3UVVGRFdEdEJRVU5CTEdOQlFVMUZMR0ZCUVdFc1IwRkJSMFlzVDBGQlR5eERRVUZEWWl4TlFVRlNMRWRCUVdsQ1V5eFpRVUYyUXp0QlFVTkJTeXhWUVVGQlFTeE5RVUZOTEVkQlFVZEVMRTlCUVU4c1NVRkJTU3hMUVVGTFJTeGhRVUZvUWl4SlFVRnBRMEVzWVVGQllTeEhRVUZITjBJc1RVRkJNVVE3UVVGRFJEczdRVUZGUkN4WlFVRkpPRUlzVTBGQlV5eEhRVUZIU2l4VlFVRlZMRWxCUVVsQkxGVkJRVlVzUTBGQlExb3NUVUZCV0N4SFFVRnZRaXhEUVVGd1FpeEhRVUYzUWxvc1RVRkJkRVE3TzBGQlEwRXNXVUZCU1N4RFFVRkRNRUlzVFVGQlJDeEpRVUZYTEVOQlFVTkZMRk5CUVdoQ0xFVkJRVEpDTzBGQlEzcENPMEZCUTBGcVFpeFZRVUZCUVN4UlFVRlJMRU5CUVVOVkxGbEJRVVFzUTBGQlVpeEhRVUY1UWpOQ0xGTkJRWHBDTzBGQlEwRTdRVUZEUkN4VFFYSkNSQ3hEUVhWQ1FUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPenM3UVVGRFFTeFpRVUZKTEVOQlFVTnJReXhUUVVGRUxFbEJRV1ZHTEUxQlFVMHNTVUZCU1VZc1ZVRkJWU3hEUVVGRFdpeE5RVUZZTEVkQlFXOUNMRU5CUVhCQ0xFZEJRWGRDWVN4UFFVRlBMRU5CUVVOaUxFMUJRVGRFTEVWQlFYTkZPMEZCUTNCRlZ5eFZRVUZCUVN4UlFVRlJMRWRCUVVkcVF5eEpRVUZKTEVOQlFVTjFReXhUUVVGTUxFTkJRV1ZLTEU5QlFXWXNSVUZCZDBJc1NVRkJlRUlzUlVGQk9FSXZRaXhUUVVFNVFpeEZRVUY1UXl4RFFVRjZReXhEUVVGWU8wRkJRMFFzVTBGR1JDeE5RVVZQTzBGQlEwdzJRaXhWUVVGQlFTeFJRVUZSTEVkQlFVZHFReXhKUVVGSkxFTkJRVU4xUXl4VFFVRk1MRU5CUVdWTUxGVkJRV1lzUlVGQk1rSTVRaXhUUVVFelFpeEZRVUZ6UXl4SlFVRjBReXhGUVVFMFF5eERRVUUxUXl4RFFVRllPMEZCUTBRN08wRkJSVVJ2UWl4UlFVRkJRU3hOUVVGTkxFZEJRVWQ0UWl4SlFVRkpMRU5CUVVONVFpeGhRVUZNTEVOQlFXMUNVU3hSUVVGdVFpeEZRVUUyUW5CRExGTkJRVGRDTEVWQlFYZERSQ3hUUVVGNFF5eEZRVUZ0UkcxRExGbEJRVzVFTEVOQlFWUTdPMEZCUlVFc1dVRkJTVVVzVVVGQlVTeERRVUZEV0N4TlFVRlVMRWRCUVd0Q0xFTkJRV3hDTEVsQlFYVkNXaXhOUVVGMlFpeEpRVUZwUTJNc1RVRkJUU3hIUVVGSExFTkJRVlFzU1VGQlkyaENMRTFCUVc1RUxFVkJRVEpFTzBGQlEzcEVPMEZCUTBFc2FVSkJRVTlRTEVsQlFVa3NRMEZCUTNWRExGZEJRVmNzUTBGQlEzaERMRWxCUVVRc1JVRkJUMmxETEZGQlFWRXNRMEZCUTFZc1lVRkJhRUlzUlVGQkswSXhRaXhUUVVFdlFpeEZRVUV3UTBRc1UwRkJNVU1zUlVGQmNVUkpMRWxCUVVrc1EwRkJRM2xETEdWQlFURkVMRU5CUVZvc1EwRkJXRHRCUVVORUxGTkJTRVFzVFVGSFR6dEJRVU5NY0VJc1ZVRkJRVUVzVVVGQlVTeERRVUZEVlN4WlFVRkVMRU5CUVZJc1IwRkJlVUpGTEZGQlFYcENPenRCUVVOQkxHTkJRVWxCTEZGQlFWRXNRMEZCUTFnc1RVRkJWQ3hIUVVGclFpeERRVUZzUWl4SlFVRjFRbG9zVFVGQk0wSXNSVUZCYlVNN1FVRkRha050UWl4WlFVRkJRU3h4UWtGQmNVSXNSMEZCUjJoQ0xFbEJRVWtzUTBGQlEwTXNSMEZCVEN4RFFVRlRaU3h4UWtGQlZDeEZRVUZuUTBVc1dVRkJXU3hIUVVGSExFTkJRUzlETEVOQlFYaENPMEZCUTBRN08wRkJRMFFzWTBGQlNWQXNUVUZCVFN4SFFVRkhMRU5CUVZRc1NVRkJZMmhDTEUxQlFXeENMRVZCUVRCQ08wRkJRM2hDYjBJc1dVRkJRVUVzY1VKQlFYRkNMRWRCUVVkbUxFbEJRVWtzUTBGQlEyMUNMRWRCUVV3c1EwRkJVMG9zY1VKQlFWUXNSVUZCWjBOSExGbEJRVmtzUjBGQlJ5eERRVUV2UXl4RFFVRjRRanRCUVVORU8wRkJRMFk3UVVGRFJqczdRVUZGUkhCQ0xFMUJRVUZCTEZWQlFWVTdRVUZEV0N4TFFYaEljME1zUTBFd1NIWkRPMEZCUTBFN1FVRkRRVHRCUVVOQk96czdRVUZEUVN4UlFVRkpXaXhSUVVGS0xFVkJRV003UVVGRFdDeG5Ra0ZCVXpKRExFbEJRVlFzUjBGQlowSTdRVUZEWm5aRExGRkJRVUZCTEZWQlFWVXNRMEZCUXl4WlFVRlhPMEZCUTNCQ0xHTkJRVWxSTEZWQlFWVXNSMEZCUjBNc1lVRkJZaXhKUVVFNFFrOHNTVUZCU1N4RFFVRkRReXhIUVVGTUxFdEJRV0ZHTEcxQ1FVRXZReXhGUVVGdlJUdEJRVU5zUlN4dFFrRkJUMjVDTEZGQlFWRXNSVUZCWmp0QlFVTkVPenRCUVVWRUxHTkJRVWtzUTBGQlF5dENMR05CUVdNc1JVRkJia0lzUlVGQmRVSTdRVUZEY2tKWkxGbEJRVUZCTEVsQlFVazdRVUZEVER0QlFVTkdMRk5CVWxNc1JVRlJVQ3hEUVZKUExFTkJRVlk3UVVGVFJDeFBRVlpCTEVkQlFVUTdRVUZYUkN4TFFWcEVMRTFCV1U4N1FVRkRUQ3hoUVVGUEwwSXNWVUZCVlN4SlFVRkpReXhoUVVGa0xFbEJRU3RDVHl4SlFVRkpMRU5CUVVORExFZEJRVXdzVFVGQlkwWXNiVUpCUVhCRUxFVkJRWGxGTzBGQlEzWkZMRmxCUVVsNVFpeEhRVUZITEVkQlFVZGlMR05CUVdNc1JVRkJlRUk3TzBGQlEwRXNXVUZCU1dFc1IwRkJTaXhGUVVGVE8wRkJRMUFzYVVKQlFVOUJMRWRCUVZBN1FVRkRSRHRCUVVOR08wRkJRMFk3UVVGRFJpeEhRVzVLWXpzN1FVRkJRVHM3UVVGQlFUdEJRWEZLWmtvc1JVRkJRVUVzVTBGeVNtVXNjVUpCY1VwTVN5eEpRWEpLU3l4RlFYRktRME1zUzBGeVNrUXNSVUZ4U2xGRExFOUJja3BTTEVWQmNVcHBRa01zVTBGeVNtcENMRVZCY1VvMFFqdEJRVU42UXl4UlFVRkpReXhKUVVGSkxFZEJRVWRLTEVsQlFVa3NRMEZCUTNKQ0xHRkJRV2hDT3p0QlFVTkJMRkZCUVVsNVFpeEpRVUZKTEVsQlFVbEJMRWxCUVVrc1EwRkJRMGdzUzBGQlRDeExRVUZsUVN4TFFVRjJRaXhKUVVGblEwY3NTVUZCU1N4RFFVRkRSaXhQUVVGTUxFdEJRV2xDUVN4UFFVRnlSQ3hGUVVFNFJEdEJRVU0xUkN4aFFVRlBPMEZCUTB4NFFpeFJRVUZCUVN4TlFVRk5MRVZCUVVWelFpeEpRVUZKTEVOQlFVTjBRaXhOUVVGTUxFZEJRV041UWl4VFFVUnFRanRCUVVWTWVFSXNVVUZCUVVFc1lVRkJZU3hGUVVGRk8wRkJRVU5KTEZWQlFVRkJMRXRCUVVzc1JVRkJSWEZDTEVsQlFVa3NRMEZCUTNKQ0xFdEJRVXdzUjBGQllTeERRVUZ5UWp0QlFVRjNRbXRDTEZWQlFVRkJMRXRCUVVzc1JVRkJSVUVzUzBGQkwwSTdRVUZCYzBORExGVkJRVUZCTEU5QlFVOHNSVUZCUlVFc1QwRkJMME03UVVGQmQwUkhMRlZCUVVGQkxHbENRVUZwUWl4RlFVRkZSQ3hKUVVGSkxFTkJRVU5ETzBGQlFXaEdPMEZCUmxZc1QwRkJVRHRCUVVsRUxFdEJURVFzVFVGTFR6dEJRVU5NTEdGQlFVODdRVUZEVEROQ0xGRkJRVUZCTEUxQlFVMHNSVUZCUlhOQ0xFbEJRVWtzUTBGQlEzUkNMRTFCUVV3c1IwRkJZM2xDTEZOQlJHcENPMEZCUlV4NFFpeFJRVUZCUVN4aFFVRmhMRVZCUVVVN1FVRkJRMGtzVlVGQlFVRXNTMEZCU3l4RlFVRkZMRU5CUVZJN1FVRkJWMnRDTEZWQlFVRkJMRXRCUVVzc1JVRkJSVUVzUzBGQmJFSTdRVUZCZVVKRExGVkJRVUZCTEU5QlFVOHNSVUZCUlVFc1QwRkJiRU03UVVGQk1rTkhMRlZCUVVGQkxHbENRVUZwUWl4RlFVRkZSRHRCUVVFNVJEdEJRVVpXTEU5QlFWQTdRVUZKUkR0QlFVTkdMRWRCYkV0ak96dEJRVUZCT3p0QlFVRkJPMEZCYlV0bWRrSXNSVUZCUVVFc1lVRnVTMlVzZVVKQmJVdEVVU3hSUVc1TFF5eEZRVzFMVTNCRExGTkJia3RVTEVWQmJVdHZRa1FzVTBGdVMzQkNMRVZCYlVzclFtMURMRmxCYmtzdlFpeEZRVzFMTmtNN1FVRkRNVVFzVVVGQlNYWkNMRTFCUVUwc1IwRkJSMWdzVTBGQlV5eERRVUZEV1N4TlFVRjJRanRCUVVGQkxGRkJRMGxETEUxQlFVMHNSMEZCUjJRc1UwRkJVeXhEUVVGRFlTeE5RVVIyUWp0QlFVRkJMRkZCUlVsaExFMUJRVTBzUjBGQlIxY3NVVUZCVVN4RFFVRkRXQ3hOUVVaMFFqdEJRVUZCTEZGQlIwbEZMRTFCUVUwc1IwRkJSMFlzVFVGQlRTeEhRVUZIVXl4WlFVaDBRanRCUVVGQkxGRkJTMGx0UWl4WFFVRlhMRWRCUVVjc1EwRk1iRUk3TzBGQlRVRXNWMEZCVHpGQ0xFMUJRVTBzUjBGQlJ5eERRVUZVTEVkQlFXRm9RaXhOUVVGaUxFbEJRWFZDWXl4TlFVRk5MRWRCUVVjc1EwRkJWQ3hIUVVGaFdpeE5RVUZ3UXl4SlFVRTRReXhMUVVGTGVVTXNUVUZCVEN4RFFVRlpkRVFzVTBGQlV5eERRVUZETWtJc1RVRkJUU3hIUVVGSExFTkJRVllzUTBGQmNrSXNSVUZCYlVNMVFpeFRRVUZUTEVOQlFVTXdRaXhOUVVGTkxFZEJRVWNzUTBGQlZpeERRVUUxUXl4RFFVRnlSQ3hGUVVGblNEdEJRVU01UjBVc1RVRkJRVUVzVFVGQlRUdEJRVU5PUml4TlFVRkJRU3hOUVVGTk8wRkJRMDQwUWl4TlFVRkJRU3hYUVVGWE8wRkJRMW83TzBGQlJVUXNVVUZCU1VFc1YwRkJTaXhGUVVGcFFqdEJRVU5tYWtJc1RVRkJRVUVzVVVGQlVTeERRVUZEVml4aFFVRlVMRWRCUVhsQ08wRkJRVU5KTEZGQlFVRkJMRXRCUVVzc1JVRkJSWFZDTEZkQlFWSTdRVUZCY1VKRUxGRkJRVUZCTEdsQ1FVRnBRaXhGUVVGRmFFSXNVVUZCVVN4RFFVRkRWanRCUVVGcVJDeFBRVUY2UWp0QlFVTkVPenRCUVVWRVZTeEpRVUZCUVN4UlFVRlJMRU5CUVVOWUxFMUJRVlFzUjBGQmEwSkJMRTFCUVd4Q08wRkJRMEVzVjBGQlQwVXNUVUZCVUR0QlFVTkVMRWRCZEV4ak96dEJRVUZCT3p0QlFVRkJPMEZCZDB4bU1rSXNSVUZCUVVFc1RVRjRUR1VzYTBKQmQweFNReXhKUVhoTVVTeEZRWGRNUmtNc1MwRjRURVVzUlVGM1RFczdRVUZEYkVJc1VVRkJTU3hMUVVGTGRrUXNUMEZCVEN4RFFVRmhkMFFzVlVGQmFrSXNSVUZCTmtJN1FVRkRNMElzWVVGQlR5eExRVUZMZUVRc1QwRkJUQ3hEUVVGaGQwUXNWVUZCWWl4RFFVRjNRa1lzU1VGQmVFSXNSVUZCT0VKRExFdEJRVGxDTEVOQlFWQTdRVUZEUkN4TFFVWkVMRTFCUlU4N1FVRkRUQ3hoUVVGUFJDeEpRVUZKTEV0QlFVdERMRXRCUVZRc1NVRkRSQ3hMUVVGTGRrUXNUMEZCVEN4RFFVRmhlVVFzVlVGQllpeEpRVUV5UWtnc1NVRkJTU3hEUVVGRFNTeFhRVUZNTEU5QlFYVkNTQ3hMUVVGTExFTkJRVU5ITEZkQlFVNHNSVUZFZUVRN1FVRkZSRHRCUVVOR0xFZEJMMHhqT3p0QlFVRkJPenRCUVVGQk8wRkJaMDFtYkVRc1JVRkJRVUVzVjBGb1RXVXNkVUpCWjAxSWJVUXNTMEZvVFVjc1JVRm5UVWs3UVVGRGFrSXNVVUZCU1dRc1IwRkJSeXhIUVVGSExFVkJRVlk3TzBGQlEwRXNVMEZCU3l4SlFVRkpaU3hEUVVGRExFZEJRVWNzUTBGQllpeEZRVUZuUWtFc1EwRkJReXhIUVVGSFJDeExRVUZMTEVOQlFVTm9SQ3hOUVVFeFFpeEZRVUZyUTJsRUxFTkJRVU1zUlVGQmJrTXNSVUZCZFVNN1FVRkRja01zVlVGQlNVUXNTMEZCU3l4RFFVRkRReXhEUVVGRUxFTkJRVlFzUlVGQll6dEJRVU5hWml4UlFVRkJRU3hIUVVGSExFTkJRVU5uUWl4SlFVRktMRU5CUVZOR0xFdEJRVXNzUTBGQlEwTXNRMEZCUkN4RFFVRmtPMEZCUTBRN1FVRkRSanM3UVVGRFJDeFhRVUZQWml4SFFVRlFPMEZCUTBRc1IwRjRUV003TzBGQlFVRTdPMEZCUVVFN1FVRjVUV1owUXl4RlFVRkJRU3hUUVhwTlpTeHhRa0Y1VFV4SUxFdEJlazFMTEVWQmVVMUZPMEZCUTJZc1YwRkJUMEVzUzBGQlVEdEJRVU5FTEVkQk0wMWpPenRCUVVGQk96dEJRVUZCTzBGQk5FMW1TeXhGUVVGQlFTeFJRVFZOWlN4dlFrRTBUVTVNTEV0Qk5VMU5MRVZCTkUxRE8wRkJRMlFzVjBGQlQwRXNTMEZCU3l4RFFVRkRNRVFzUzBGQlRpeERRVUZaTEVWQlFWb3NRMEZCVUR0QlFVTkVMRWRCT1Uxak96dEJRVUZCT3p0QlFVRkJPMEZCSzAxbWJFTXNSVUZCUVVFc1NVRXZUV1VzWjBKQkswMVdiVU1zUzBFdlRWVXNSVUVyVFVnN1FVRkRWaXhYUVVGUFFTeExRVUZMTEVOQlFVTnVReXhKUVVGT0xFTkJRVmNzUlVGQldDeERRVUZRTzBGQlEwUTdRVUZxVG1Nc1EwRkJha0k3TzBGQmIwNUJMRk5CUVZOakxGZEJRVlFzUTBGQmNVSTNReXhKUVVGeVFpeEZRVUV5UWpSQ0xHRkJRVE5DTEVWQlFUQkRNVUlzVTBGQk1VTXNSVUZCY1VSRUxGTkJRWEpFTEVWQlFXZEZOa01zWlVGQmFFVXNSVUZCYVVZN1FVRkRMMFU3UVVGRFFUdEJRVU5CTEUxQlFVMXhRaXhWUVVGVkxFZEJRVWNzUlVGQmJrSTdRVUZEUVN4TlFVRkpReXhoUVVGS096dEJRVU5CTEZOQlFVOTRReXhoUVVGUUxFVkJRWE5DTzBGQlEzQkNkVU1zU1VGQlFVRXNWVUZCVlN4RFFVRkRTQ3hKUVVGWUxFTkJRV2RDY0VNc1lVRkJhRUk3UVVGRFFYZERMRWxCUVVGQkxHRkJRV0VzUjBGQlIzaERMR0ZCUVdFc1EwRkJRekJDTEdsQ1FVRTVRanRCUVVOQkxGZEJRVTh4UWl4aFFVRmhMRU5CUVVNd1FpeHBRa0ZCY2tJN1FVRkRRVEZDTEVsQlFVRkJMR0ZCUVdFc1IwRkJSM2RETEdGQlFXaENPMEZCUTBRN08wRkJRMFJFTEVWQlFVRkJMRlZCUVZVc1EwRkJRMFVzVDBGQldEdEJRVVZCTEUxQlFVbERMRmxCUVZrc1IwRkJSeXhEUVVGdVFqdEJRVUZCTEUxQlEwbERMRmxCUVZrc1IwRkJSMG9zVlVGQlZTeERRVUZEY2tRc1RVRkVPVUk3UVVGQlFTeE5RVVZKWlN4TlFVRk5MRWRCUVVjc1EwRkdZanRCUVVGQkxFMUJSMGxHTEUxQlFVMHNSMEZCUnl4RFFVaGlPenRCUVV0QkxGTkJRVTh5UXl4WlFVRlpMRWRCUVVkRExGbEJRWFJDTEVWQlFXOURSQ3haUVVGWkxFVkJRV2hFTEVWQlFXOUVPMEZCUTJ4RUxGRkJRVWxGTEZOQlFWTXNSMEZCUjB3c1ZVRkJWU3hEUVVGRFJ5eFpRVUZFTEVOQlFURkNPenRCUVVOQkxGRkJRVWtzUTBGQlEwVXNVMEZCVXl4RFFVRkRja0lzVDBGQlppeEZRVUYzUWp0QlFVTjBRaXhWUVVGSkxFTkJRVU54UWl4VFFVRlRMRU5CUVVOMFFpeExRVUZZTEVsQlFXOUNTaXhsUVVGNFFpeEZRVUY1UXp0QlFVTjJReXhaUVVGSmRrTXNTMEZCU3l4SFFVRkhUQ3hUUVVGVExFTkJRVU4xUlN4TFFVRldMRU5CUVdkQ05VTXNUVUZCYUVJc1JVRkJkMEpCTEUxQlFVMHNSMEZCUnpKRExGTkJRVk1zUTBGQlEzaERMRXRCUVRORExFTkJRVm83UVVGRFFYcENMRkZCUVVGQkxFdEJRVXNzUjBGQlIwRXNTMEZCU3l4RFFVRkRiVVVzUjBGQlRpeERRVUZWTEZWQlFWTnVSU3hMUVVGVUxFVkJRV2RDZDBRc1EwRkJhRUlzUlVGQmJVSTdRVUZEYmtNc1kwRkJTVmtzVVVGQlVTeEhRVUZITVVVc1UwRkJVeXhEUVVGRE1FSXNUVUZCVFN4SFFVRkhiME1zUTBGQlZpeERRVUY0UWp0QlFVTkJMR2xDUVVGUFdTeFJRVUZSTEVOQlFVTTNSQ3hOUVVGVUxFZEJRV3RDVUN4TFFVRkxMRU5CUVVOUExFMUJRWGhDTEVkQlFXbEROa1FzVVVGQmFrTXNSMEZCTkVOd1JTeExRVUZ1UkR0QlFVTkVMRk5CU0U4c1EwRkJVanRCUVV0QmFVVXNVVUZCUVVFc1UwRkJVeXhEUVVGRGFrVXNTMEZCVml4SFFVRnJRbEFzU1VGQlNTeERRVUZESzBJc1NVRkJUQ3hEUVVGVmVFSXNTMEZCVml4RFFVRnNRanRCUVVORUxFOUJVa1FzVFVGUlR6dEJRVU5NYVVVc1VVRkJRVUVzVTBGQlV5eERRVUZEYWtVc1MwRkJWaXhIUVVGclFsQXNTVUZCU1N4RFFVRkRLMElzU1VGQlRDeERRVUZWTjBJc1UwRkJVeXhEUVVGRGRVVXNTMEZCVml4RFFVRm5RalZETEUxQlFXaENMRVZCUVhkQ1FTeE5RVUZOTEVkQlFVY3lReXhUUVVGVExFTkJRVU40UXl4TFFVRXpReXhEUVVGV0xFTkJRV3hDTzBGQlEwUTdPMEZCUTBSSUxFMUJRVUZCTEUxQlFVMHNTVUZCU1RKRExGTkJRVk1zUTBGQlEzaERMRXRCUVhCQ0xFTkJXbk5DTEVOQlkzUkNPenRCUVVOQkxGVkJRVWtzUTBGQlEzZERMRk5CUVZNc1EwRkJRM1JDTEV0QlFXWXNSVUZCYzBJN1FVRkRjRUoyUWl4UlFVRkJRU3hOUVVGTkxFbEJRVWsyUXl4VFFVRlRMRU5CUVVONFF5eExRVUZ3UWp0QlFVTkVPMEZCUTBZc1MwRnNRa1FzVFVGclFrODdRVUZEVEhkRExFMUJRVUZCTEZOQlFWTXNRMEZCUTJwRkxFdEJRVllzUjBGQmEwSlFMRWxCUVVrc1EwRkJReXRDTEVsQlFVd3NRMEZCVlRsQ0xGTkJRVk1zUTBGQlEzZEZMRXRCUVZZc1EwRkJaMEk1UXl4TlFVRm9RaXhGUVVGM1FrRXNUVUZCVFN4SFFVRkhOa01zVTBGQlV5eERRVUZEZUVNc1MwRkJNME1zUTBGQlZpeERRVUZzUWp0QlFVTkJUQ3hOUVVGQlFTeE5RVUZOTEVsQlFVazJReXhUUVVGVExFTkJRVU40UXl4TFFVRndRaXhEUVVaTExFTkJTVXc3UVVGRFFUdEJRVU5CT3p0QlFVTkJMRlZCUVVselF5eFpRVUZaTEVsQlFVbElMRlZCUVZVc1EwRkJRMGNzV1VGQldTeEhRVUZITEVOQlFXaENMRU5CUVZZc1EwRkJOa0p3UWl4TFFVRnFSQ3hGUVVGM1JEdEJRVU4wUkN4WlFVRkpNRUlzUjBGQlJ5eEhRVUZIVkN4VlFVRlZMRU5CUVVOSExGbEJRVmtzUjBGQlJ5eERRVUZvUWl4RFFVRndRanRCUVVOQlNDeFJRVUZCUVN4VlFVRlZMRU5CUVVOSExGbEJRVmtzUjBGQlJ5eERRVUZvUWl4RFFVRldMRWRCUVN0Q1NDeFZRVUZWTEVOQlFVTkhMRmxCUVVRc1EwRkJla003UVVGRFFVZ3NVVUZCUVVFc1ZVRkJWU3hEUVVGRFJ5eFpRVUZFTEVOQlFWWXNSMEZCTWtKTkxFZEJRVE5DTzBGQlEwUTdRVUZEUmp0QlFVTkdMRWRCYmtRNFJTeERRWEZFTDBVN1FVRkRRVHRCUVVOQk96czdRVUZEUVN4TlFVRkpReXhqUVVGakxFZEJRVWRXTEZWQlFWVXNRMEZCUTBrc1dVRkJXU3hIUVVGSExFTkJRV2hDTEVOQlFTOUNPenRCUVVOQkxFMUJRVWxCTEZsQlFWa3NSMEZCUnl4RFFVRm1MRWxCUTBjc1QwRkJUMDBzWTBGQll5eERRVUZEZEVVc1MwRkJkRUlzUzBGQlowTXNVVUZFYmtNc1MwRkZTWE5GTEdOQlFXTXNRMEZCUXpOQ0xFdEJRV1lzU1VGQmQwSXlRaXhqUVVGakxFTkJRVU14UWl4UFFVWXpReXhMUVVkSGJrUXNTVUZCU1N4RFFVRkRkMFFzVFVGQlRDeERRVUZaTEVWQlFWb3NSVUZCWjBKeFFpeGpRVUZqTEVOQlFVTjBSU3hMUVVFdlFpeERRVWhRTEVWQlJ6aERPMEZCUXpWRE5FUXNTVUZCUVVFc1ZVRkJWU3hEUVVGRFNTeFpRVUZaTEVkQlFVY3NRMEZCYUVJc1EwRkJWaXhEUVVFMlFtaEZMRXRCUVRkQ0xFbEJRWE5EYzBVc1kwRkJZeXhEUVVGRGRFVXNTMEZCY2tRN1FVRkRRVFJFTEVsQlFVRkJMRlZCUVZVc1EwRkJRMWNzUjBGQldEdEJRVU5FT3p0QlFVVkVMRk5CUVU5WUxGVkJRVkE3UVVGRFJDSXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJbVY0Y0c5eWRDQmtaV1poZFd4MElHWjFibU4wYVc5dUlFUnBabVlvS1NCN2ZWeHVYRzVFYVdabUxuQnliM1J2ZEhsd1pTQTlJSHRjYmlBZ1pHbG1aaWh2YkdSVGRISnBibWNzSUc1bGQxTjBjbWx1Wnl3Z2IzQjBhVzl1Y3lBOUlIdDlLU0I3WEc0Z0lDQWdiR1YwSUdOaGJHeGlZV05ySUQwZ2IzQjBhVzl1Y3k1allXeHNZbUZqYXp0Y2JpQWdJQ0JwWmlBb2RIbHdaVzltSUc5d2RHbHZibk1nUFQwOUlDZG1kVzVqZEdsdmJpY3BJSHRjYmlBZ0lDQWdJR05oYkd4aVlXTnJJRDBnYjNCMGFXOXVjenRjYmlBZ0lDQWdJRzl3ZEdsdmJuTWdQU0I3ZlR0Y2JpQWdJQ0I5WEc0Z0lDQWdkR2hwY3k1dmNIUnBiMjV6SUQwZ2IzQjBhVzl1Y3p0Y2JseHVJQ0FnSUd4bGRDQnpaV3htSUQwZ2RHaHBjenRjYmx4dUlDQWdJR1oxYm1OMGFXOXVJR1J2Ym1Vb2RtRnNkV1VwSUh0Y2JpQWdJQ0FnSUdsbUlDaGpZV3hzWW1GamF5a2dlMXh1SUNBZ0lDQWdJQ0J6WlhSVWFXMWxiM1YwS0daMWJtTjBhVzl1S0NrZ2V5QmpZV3hzWW1GamF5aDFibVJsWm1sdVpXUXNJSFpoYkhWbEtUc2dmU3dnTUNrN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCMGNuVmxPMXh1SUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlIWmhiSFZsTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmx4dUlDQWdJQzh2SUVGc2JHOTNJSE4xWW1Oc1lYTnpaWE1nZEc4Z2JXRnpjMkZuWlNCMGFHVWdhVzV3ZFhRZ2NISnBiM0lnZEc4Z2NuVnVibWx1WjF4dUlDQWdJRzlzWkZOMGNtbHVaeUE5SUhSb2FYTXVZMkZ6ZEVsdWNIVjBLRzlzWkZOMGNtbHVaeWs3WEc0Z0lDQWdibVYzVTNSeWFXNW5JRDBnZEdocGN5NWpZWE4wU1c1d2RYUW9ibVYzVTNSeWFXNW5LVHRjYmx4dUlDQWdJRzlzWkZOMGNtbHVaeUE5SUhSb2FYTXVjbVZ0YjNabFJXMXdkSGtvZEdocGN5NTBiMnRsYm1sNlpTaHZiR1JUZEhKcGJtY3BLVHRjYmlBZ0lDQnVaWGRUZEhKcGJtY2dQU0IwYUdsekxuSmxiVzkyWlVWdGNIUjVLSFJvYVhNdWRHOXJaVzVwZW1Vb2JtVjNVM1J5YVc1bktTazdYRzVjYmlBZ0lDQnNaWFFnYm1WM1RHVnVJRDBnYm1WM1UzUnlhVzVuTG14bGJtZDBhQ3dnYjJ4a1RHVnVJRDBnYjJ4a1UzUnlhVzVuTG14bGJtZDBhRHRjYmlBZ0lDQnNaWFFnWldScGRFeGxibWQwYUNBOUlERTdYRzRnSUNBZ2JHVjBJRzFoZUVWa2FYUk1aVzVuZEdnZ1BTQnVaWGRNWlc0Z0t5QnZiR1JNWlc0N1hHNGdJQ0FnYVdZb2IzQjBhVzl1Y3k1dFlYaEZaR2wwVEdWdVozUm9LU0I3WEc0Z0lDQWdJQ0J0WVhoRlpHbDBUR1Z1WjNSb0lEMGdUV0YwYUM1dGFXNG9iV0Y0UldScGRFeGxibWQwYUN3Z2IzQjBhVzl1Y3k1dFlYaEZaR2wwVEdWdVozUm9LVHRjYmlBZ0lDQjlYRzRnSUNBZ1kyOXVjM1FnYldGNFJYaGxZM1YwYVc5dVZHbHRaU0E5SUc5d2RHbHZibk11ZEdsdFpXOTFkQ0EvUHlCSmJtWnBibWwwZVR0Y2JpQWdJQ0JqYjI1emRDQmhZbTl5ZEVGbWRHVnlWR2x0WlhOMFlXMXdJRDBnUkdGMFpTNXViM2NvS1NBcklHMWhlRVY0WldOMWRHbHZibFJwYldVN1hHNWNiaUFnSUNCc1pYUWdZbVZ6ZEZCaGRHZ2dQU0JiZXlCdmJHUlFiM002SUMweExDQnNZWE4wUTI5dGNHOXVaVzUwT2lCMWJtUmxabWx1WldRZ2ZWMDdYRzVjYmlBZ0lDQXZMeUJUWldWa0lHVmthWFJNWlc1bmRHZ2dQU0F3TENCcExtVXVJSFJvWlNCamIyNTBaVzUwSUhOMFlYSjBjeUIzYVhSb0lIUm9aU0J6WVcxbElIWmhiSFZsYzF4dUlDQWdJR3hsZENCdVpYZFFiM01nUFNCMGFHbHpMbVY0ZEhKaFkzUkRiMjF0YjI0b1ltVnpkRkJoZEdoYk1GMHNJRzVsZDFOMGNtbHVaeXdnYjJ4a1UzUnlhVzVuTENBd0tUdGNiaUFnSUNCcFppQW9ZbVZ6ZEZCaGRHaGJNRjB1YjJ4a1VHOXpJQ3NnTVNBK1BTQnZiR1JNWlc0Z0ppWWdibVYzVUc5eklDc2dNU0ErUFNCdVpYZE1aVzRwSUh0Y2JpQWdJQ0FnSUM4dklFbGtaVzUwYVhSNUlIQmxjaUIwYUdVZ1pYRjFZV3hwZEhrZ1lXNWtJSFJ2YTJWdWFYcGxjbHh1SUNBZ0lDQWdjbVYwZFhKdUlHUnZibVVvVzN0MllXeDFaVG9nZEdocGN5NXFiMmx1S0c1bGQxTjBjbWx1Wnlrc0lHTnZkVzUwT2lCdVpYZFRkSEpwYm1jdWJHVnVaM1JvZlYwcE8xeHVJQ0FnSUgxY2JseHVJQ0FnSUM4dklFOXVZMlVnZDJVZ2FHbDBJSFJvWlNCeWFXZG9kQ0JsWkdkbElHOW1JSFJvWlNCbFpHbDBJR2R5WVhCb0lHOXVJSE52YldVZ1pHbGhaMjl1WVd3Z2F5d2dkMlVnWTJGdVhHNGdJQ0FnTHk4Z1pHVm1hVzVwZEdWc2VTQnlaV0ZqYUNCMGFHVWdaVzVrSUc5bUlIUm9aU0JsWkdsMElHZHlZWEJvSUdsdUlHNXZJRzF2Y21VZ2RHaGhiaUJySUdWa2FYUnpMQ0J6YjF4dUlDQWdJQzh2SUhSb1pYSmxKM01nYm04Z2NHOXBiblFnYVc0Z1kyOXVjMmxrWlhKcGJtY2dZVzU1SUcxdmRtVnpJSFJ2SUdScFlXZHZibUZzSUdzck1TQmhibmtnYlc5eVpTQW9abkp2YlZ4dUlDQWdJQzh2SUhkb2FXTm9JSGRsSjNKbElHZDFZWEpoYm5SbFpXUWdkRzhnYm1WbFpDQmhkQ0JzWldGemRDQnJLekVnYlc5eVpTQmxaR2wwY3lrdVhHNGdJQ0FnTHk4Z1UybHRhV3hoY214NUxDQnZibU5sSUhkbEozWmxJSEpsWVdOb1pXUWdkR2hsSUdKdmRIUnZiU0J2WmlCMGFHVWdaV1JwZENCbmNtRndhQ3dnZEdobGNtVW5jeUJ1YjF4dUlDQWdJQzh2SUhCdmFXNTBJR052Ym5OcFpHVnlhVzVuSUcxdmRtVnpJSFJ2SUd4dmQyVnlJR1JwWVdkdmJtRnNjeTVjYmlBZ0lDQXZMeUJYWlNCeVpXTnZjbVFnZEdocGN5Qm1ZV04wSUdKNUlITmxkSFJwYm1jZ2JXbHVSR2xoWjI5dVlXeFViME52Ym5OcFpHVnlJR0Z1WkZ4dUlDQWdJQzh2SUcxaGVFUnBZV2R2Ym1Gc1ZHOURiMjV6YVdSbGNpQjBieUJ6YjIxbElHWnBibWwwWlNCMllXeDFaU0J2Ym1ObElIZGxKM1psSUdocGRDQjBhR1VnWldSblpTQnZabHh1SUNBZ0lDOHZJSFJvWlNCbFpHbDBJR2R5WVhCb0xseHVJQ0FnSUM4dklGUm9hWE1nYjNCMGFXMXBlbUYwYVc5dUlHbHpJRzV2ZENCbVlXbDBhR1oxYkNCMGJ5QjBhR1VnYjNKcFoybHVZV3dnWVd4bmIzSnBkR2h0SUhCeVpYTmxiblJsWkNCcGJseHVJQ0FnSUM4dklFMTVaWEp6SjNNZ2NHRndaWElzSUhkb2FXTm9JR2x1YzNSbFlXUWdjRzlwYm5Sc1pYTnpiSGtnWlhoMFpXNWtjeUJFTFhCaGRHaHpJRzltWmlCMGFHVWdaVzVrSUc5bVhHNGdJQ0FnTHk4Z2RHaGxJR1ZrYVhRZ1ozSmhjR2dnTFNCelpXVWdjR0ZuWlNBM0lHOW1JRTE1WlhKekozTWdjR0Z3WlhJZ2QyaHBZMmdnYm05MFpYTWdkR2hwY3lCd2IybHVkRnh1SUNBZ0lDOHZJR1Y0Y0d4cFkybDBiSGtnWVc1a0lHbHNiSFZ6ZEhKaGRHVnpJR2wwSUhkcGRHZ2dZU0JrYVdGbmNtRnRMaUJVYUdseklHaGhjeUJ0WVdwdmNpQndaWEptYjNKdFlXNWpaVnh1SUNBZ0lDOHZJR2x0Y0d4cFkyRjBhVzl1Y3lCbWIzSWdjMjl0WlNCamIyMXRiMjRnYzJObGJtRnlhVzl6TGlCR2IzSWdhVzV6ZEdGdVkyVXNJSFJ2SUdOdmJYQjFkR1VnWVNCa2FXWm1YRzRnSUNBZ0x5OGdkMmhsY21VZ2RHaGxJRzVsZHlCMFpYaDBJSE5wYlhCc2VTQmhjSEJsYm1SeklHUWdZMmhoY21GamRHVnljeUJ2YmlCMGFHVWdaVzVrSUc5bUlIUm9aVnh1SUNBZ0lDOHZJRzl5YVdkcGJtRnNJSFJsZUhRZ2IyWWdiR1Z1WjNSb0lHNHNJSFJvWlNCMGNuVmxJRTE1WlhKeklHRnNaMjl5YVhSb2JTQjNhV3hzSUhSaGEyVWdUeWh1SzJSZU1pbGNiaUFnSUNBdkx5QjBhVzFsSUhkb2FXeGxJSFJvYVhNZ2IzQjBhVzFwZW1GMGFXOXVJRzVsWldSeklHOXViSGtnVHlodUsyUXBJSFJwYldVdVhHNGdJQ0FnYkdWMElHMXBia1JwWVdkdmJtRnNWRzlEYjI1emFXUmxjaUE5SUMxSmJtWnBibWwwZVN3Z2JXRjRSR2xoWjI5dVlXeFViME52Ym5OcFpHVnlJRDBnU1c1bWFXNXBkSGs3WEc1Y2JpQWdJQ0F2THlCTllXbHVJSGR2Y210bGNpQnRaWFJvYjJRdUlHTm9aV05yY3lCaGJHd2djR1Z5YlhWMFlYUnBiMjV6SUc5bUlHRWdaMmwyWlc0Z1pXUnBkQ0JzWlc1bmRHZ2dabTl5SUdGalkyVndkR0Z1WTJVdVhHNGdJQ0FnWm5WdVkzUnBiMjRnWlhobFkwVmthWFJNWlc1bmRHZ29LU0I3WEc0Z0lDQWdJQ0JtYjNJZ0tGeHVJQ0FnSUNBZ0lDQnNaWFFnWkdsaFoyOXVZV3hRWVhSb0lEMGdUV0YwYUM1dFlYZ29iV2x1UkdsaFoyOXVZV3hVYjBOdmJuTnBaR1Z5TENBdFpXUnBkRXhsYm1kMGFDazdYRzRnSUNBZ0lDQWdJR1JwWVdkdmJtRnNVR0YwYUNBOFBTQk5ZWFJvTG0xcGJpaHRZWGhFYVdGbmIyNWhiRlJ2UTI5dWMybGtaWElzSUdWa2FYUk1aVzVuZEdncE8xeHVJQ0FnSUNBZ0lDQmthV0ZuYjI1aGJGQmhkR2dnS3owZ01seHVJQ0FnSUNBZ0tTQjdYRzRnSUNBZ0lDQWdJR3hsZENCaVlYTmxVR0YwYUR0Y2JpQWdJQ0FnSUNBZ2JHVjBJSEpsYlc5MlpWQmhkR2dnUFNCaVpYTjBVR0YwYUZ0a2FXRm5iMjVoYkZCaGRHZ2dMU0F4WFN4Y2JpQWdJQ0FnSUNBZ0lDQWdJR0ZrWkZCaGRHZ2dQU0JpWlhOMFVHRjBhRnRrYVdGbmIyNWhiRkJoZEdnZ0t5QXhYVHRjYmlBZ0lDQWdJQ0FnYVdZZ0tISmxiVzkyWlZCaGRHZ3BJSHRjYmlBZ0lDQWdJQ0FnSUNBdkx5Qk9ieUJ2Ym1VZ1pXeHpaU0JwY3lCbmIybHVaeUIwYnlCaGRIUmxiWEIwSUhSdklIVnpaU0IwYUdseklIWmhiSFZsTENCamJHVmhjaUJwZEZ4dUlDQWdJQ0FnSUNBZ0lHSmxjM1JRWVhSb1cyUnBZV2R2Ym1Gc1VHRjBhQ0F0SURGZElEMGdkVzVrWldacGJtVmtPMXh1SUNBZ0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUNBZ2JHVjBJR05oYmtGa1pDQTlJR1poYkhObE8xeHVJQ0FnSUNBZ0lDQnBaaUFvWVdSa1VHRjBhQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDOHZJSGRvWVhRZ2JtVjNVRzl6SUhkcGJHd2dZbVVnWVdaMFpYSWdkMlVnWkc4Z1lXNGdhVzV6WlhKMGFXOXVPbHh1SUNBZ0lDQWdJQ0FnSUdOdmJuTjBJR0ZrWkZCaGRHaE9aWGRRYjNNZ1BTQmhaR1JRWVhSb0xtOXNaRkJ2Y3lBdElHUnBZV2R2Ym1Gc1VHRjBhRHRjYmlBZ0lDQWdJQ0FnSUNCallXNUJaR1FnUFNCaFpHUlFZWFJvSUNZbUlEQWdQRDBnWVdSa1VHRjBhRTVsZDFCdmN5QW1KaUJoWkdSUVlYUm9UbVYzVUc5eklEd2dibVYzVEdWdU8xeHVJQ0FnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQ0FnYkdWMElHTmhibEpsYlc5MlpTQTlJSEpsYlc5MlpWQmhkR2dnSmlZZ2NtVnRiM1psVUdGMGFDNXZiR1JRYjNNZ0t5QXhJRHdnYjJ4a1RHVnVPMXh1SUNBZ0lDQWdJQ0JwWmlBb0lXTmhia0ZrWkNBbUppQWhZMkZ1VW1WdGIzWmxLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0x5OGdTV1lnZEdocGN5QndZWFJvSUdseklHRWdkR1Z5YldsdVlXd2dkR2hsYmlCd2NuVnVaVnh1SUNBZ0lDQWdJQ0FnSUdKbGMzUlFZWFJvVzJScFlXZHZibUZzVUdGMGFGMGdQU0IxYm1SbFptbHVaV1E3WEc0Z0lDQWdJQ0FnSUNBZ1kyOXVkR2x1ZFdVN1hHNGdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0F2THlCVFpXeGxZM1FnZEdobElHUnBZV2R2Ym1Gc0lIUm9ZWFFnZDJVZ2QyRnVkQ0IwYnlCaWNtRnVZMmdnWm5KdmJTNGdWMlVnYzJWc1pXTjBJSFJvWlNCd2NtbHZjbHh1SUNBZ0lDQWdJQ0F2THlCd1lYUm9JSGRvYjNObElIQnZjMmwwYVc5dUlHbHVJSFJvWlNCdmJHUWdjM1J5YVc1bklHbHpJSFJvWlNCbVlYSjBhR1Z6ZENCbWNtOXRJSFJvWlNCdmNtbG5hVzVjYmlBZ0lDQWdJQ0FnTHk4Z1lXNWtJR1J2WlhNZ2JtOTBJSEJoYzNNZ2RHaGxJR0p2ZFc1a2N5QnZaaUIwYUdVZ1pHbG1aaUJuY21Gd2FGeHVJQ0FnSUNBZ0lDQXZMeUJVVDBSUE9pQlNaVzF2ZG1VZ2RHaGxJR0FySURGZ0lHaGxjbVVnZEc4Z2JXRnJaU0JpWldoaGRtbHZjaUJ0WVhSamFDQk5lV1Z5Y3lCaGJHZHZjbWwwYUcxY2JpQWdJQ0FnSUNBZ0x5OGdJQ0FnSUNBZ1lXNWtJSEJ5WldabGNpQjBieUJ2Y21SbGNpQnlaVzF2ZG1Gc2N5QmlaV1p2Y21VZ2FXNXpaWEowYVc5dWN5NWNiaUFnSUNBZ0lDQWdhV1lnS0NGallXNVNaVzF2ZG1VZ2ZId2dLR05oYmtGa1pDQW1KaUJ5WlcxdmRtVlFZWFJvTG05c1pGQnZjeUFySURFZ1BDQmhaR1JRWVhSb0xtOXNaRkJ2Y3lrcElIdGNiaUFnSUNBZ0lDQWdJQ0JpWVhObFVHRjBhQ0E5SUhObGJHWXVZV1JrVkc5UVlYUm9LR0ZrWkZCaGRHZ3NJSFJ5ZFdVc0lIVnVaR1ZtYVc1bFpDd2dNQ2s3WEc0Z0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUNBZ1ltRnpaVkJoZEdnZ1BTQnpaV3htTG1Ga1pGUnZVR0YwYUNoeVpXMXZkbVZRWVhSb0xDQjFibVJsWm1sdVpXUXNJSFJ5ZFdVc0lERXBPMXh1SUNBZ0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUNBZ2JtVjNVRzl6SUQwZ2MyVnNaaTVsZUhSeVlXTjBRMjl0Ylc5dUtHSmhjMlZRWVhSb0xDQnVaWGRUZEhKcGJtY3NJRzlzWkZOMGNtbHVaeXdnWkdsaFoyOXVZV3hRWVhSb0tUdGNibHh1SUNBZ0lDQWdJQ0JwWmlBb1ltRnpaVkJoZEdndWIyeGtVRzl6SUNzZ01TQStQU0J2YkdSTVpXNGdKaVlnYm1WM1VHOXpJQ3NnTVNBK1BTQnVaWGRNWlc0cElIdGNiaUFnSUNBZ0lDQWdJQ0F2THlCSlppQjNaU0JvWVhabElHaHBkQ0IwYUdVZ1pXNWtJRzltSUdKdmRHZ2djM1J5YVc1bmN5d2dkR2hsYmlCM1pTQmhjbVVnWkc5dVpWeHVJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQmtiMjVsS0dKMWFXeGtWbUZzZFdWektITmxiR1lzSUdKaGMyVlFZWFJvTG14aGMzUkRiMjF3YjI1bGJuUXNJRzVsZDFOMGNtbHVaeXdnYjJ4a1UzUnlhVzVuTENCelpXeG1MblZ6WlV4dmJtZGxjM1JVYjJ0bGJpa3BPMXh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0FnSUdKbGMzUlFZWFJvVzJScFlXZHZibUZzVUdGMGFGMGdQU0JpWVhObFVHRjBhRHRjYmlBZ0lDQWdJQ0FnSUNCcFppQW9ZbUZ6WlZCaGRHZ3ViMnhrVUc5eklDc2dNU0ErUFNCdmJHUk1aVzRwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJRzFoZUVScFlXZHZibUZzVkc5RGIyNXphV1JsY2lBOUlFMWhkR2d1YldsdUtHMWhlRVJwWVdkdmJtRnNWRzlEYjI1emFXUmxjaXdnWkdsaFoyOXVZV3hRWVhSb0lDMGdNU2s3WEc0Z0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQWdJR2xtSUNodVpYZFFiM01nS3lBeElENDlJRzVsZDB4bGJpa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2JXbHVSR2xoWjI5dVlXeFViME52Ym5OcFpHVnlJRDBnVFdGMGFDNXRZWGdvYldsdVJHbGhaMjl1WVd4VWIwTnZibk5wWkdWeUxDQmthV0ZuYjI1aGJGQmhkR2dnS3lBeEtUdGNiaUFnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ1pXUnBkRXhsYm1kMGFDc3JPMXh1SUNBZ0lIMWNibHh1SUNBZ0lDOHZJRkJsY21admNtMXpJSFJvWlNCc1pXNW5kR2dnYjJZZ1pXUnBkQ0JwZEdWeVlYUnBiMjR1SUVseklHRWdZbWwwSUdaMVoyeDVJR0Z6SUhSb2FYTWdhR0Z6SUhSdklITjFjSEJ2Y25RZ2RHaGxYRzRnSUNBZ0x5OGdjM2x1WXlCaGJtUWdZWE41Ym1NZ2JXOWtaU0IzYUdsamFDQnBjeUJ1WlhabGNpQm1kVzR1SUV4dmIzQnpJRzkyWlhJZ1pYaGxZMFZrYVhSTVpXNW5kR2dnZFc1MGFXd2dZU0IyWVd4MVpWeHVJQ0FnSUM4dklHbHpJSEJ5YjJSMVkyVmtMQ0J2Y2lCMWJuUnBiQ0IwYUdVZ1pXUnBkQ0JzWlc1bmRHZ2daWGhqWldWa2N5QnZjSFJwYjI1ekxtMWhlRVZrYVhSTVpXNW5kR2dnS0dsbUlHZHBkbVZ1S1N4Y2JpQWdJQ0F2THlCcGJpQjNhR2xqYUNCallYTmxJR2wwSUhkcGJHd2djbVYwZFhKdUlIVnVaR1ZtYVc1bFpDNWNiaUFnSUNCcFppQW9ZMkZzYkdKaFkyc3BJSHRjYmlBZ0lDQWdJQ2htZFc1amRHbHZiaUJsZUdWaktDa2dlMXh1SUNBZ0lDQWdJQ0J6WlhSVWFXMWxiM1YwS0daMWJtTjBhVzl1S0NrZ2UxeHVJQ0FnSUNBZ0lDQWdJR2xtSUNobFpHbDBUR1Z1WjNSb0lENGdiV0Y0UldScGRFeGxibWQwYUNCOGZDQkVZWFJsTG01dmR5Z3BJRDRnWVdKdmNuUkJablJsY2xScGJXVnpkR0Z0Y0NrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJR05oYkd4aVlXTnJLQ2s3WEc0Z0lDQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQWdJQ0FnYVdZZ0tDRmxlR1ZqUldScGRFeGxibWQwYUNncEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCbGVHVmpLQ2s3WEc0Z0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQjlMQ0F3S1R0Y2JpQWdJQ0FnSUgwb0tTazdYRzRnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUhkb2FXeGxJQ2hsWkdsMFRHVnVaM1JvSUR3OUlHMWhlRVZrYVhSTVpXNW5kR2dnSmlZZ1JHRjBaUzV1YjNjb0tTQThQU0JoWW05eWRFRm1kR1Z5VkdsdFpYTjBZVzF3S1NCN1hHNGdJQ0FnSUNBZ0lHeGxkQ0J5WlhRZ1BTQmxlR1ZqUldScGRFeGxibWQwYUNncE8xeHVJQ0FnSUNBZ0lDQnBaaUFvY21WMEtTQjdYRzRnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJSEpsZER0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgxY2JpQWdmU3hjYmx4dUlDQmhaR1JVYjFCaGRHZ29jR0YwYUN3Z1lXUmtaV1FzSUhKbGJXOTJaV1FzSUc5c1pGQnZjMGx1WXlrZ2UxeHVJQ0FnSUd4bGRDQnNZWE4wSUQwZ2NHRjBhQzVzWVhOMFEyOXRjRzl1Wlc1ME8xeHVJQ0FnSUdsbUlDaHNZWE4wSUNZbUlHeGhjM1F1WVdSa1pXUWdQVDA5SUdGa1pHVmtJQ1ltSUd4aGMzUXVjbVZ0YjNabFpDQTlQVDBnY21WdGIzWmxaQ2tnZTF4dUlDQWdJQ0FnY21WMGRYSnVJSHRjYmlBZ0lDQWdJQ0FnYjJ4a1VHOXpPaUJ3WVhSb0xtOXNaRkJ2Y3lBcklHOXNaRkJ2YzBsdVl5eGNiaUFnSUNBZ0lDQWdiR0Z6ZEVOdmJYQnZibVZ1ZERvZ2UyTnZkVzUwT2lCc1lYTjBMbU52ZFc1MElDc2dNU3dnWVdSa1pXUTZJR0ZrWkdWa0xDQnlaVzF2ZG1Wa09pQnlaVzF2ZG1Wa0xDQndjbVYyYVc5MWMwTnZiWEJ2Ym1WdWREb2diR0Z6ZEM1d2NtVjJhVzkxYzBOdmJYQnZibVZ1ZENCOVhHNGdJQ0FnSUNCOU8xeHVJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdlMXh1SUNBZ0lDQWdJQ0J2YkdSUWIzTTZJSEJoZEdndWIyeGtVRzl6SUNzZ2IyeGtVRzl6U1c1akxGeHVJQ0FnSUNBZ0lDQnNZWE4wUTI5dGNHOXVaVzUwT2lCN1kyOTFiblE2SURFc0lHRmtaR1ZrT2lCaFpHUmxaQ3dnY21WdGIzWmxaRG9nY21WdGIzWmxaQ3dnY0hKbGRtbHZkWE5EYjIxd2IyNWxiblE2SUd4aGMzUWdmVnh1SUNBZ0lDQWdmVHRjYmlBZ0lDQjlYRzRnSUgwc1hHNGdJR1Y0ZEhKaFkzUkRiMjF0YjI0b1ltRnpaVkJoZEdnc0lHNWxkMU4wY21sdVp5d2diMnhrVTNSeWFXNW5MQ0JrYVdGbmIyNWhiRkJoZEdncElIdGNiaUFnSUNCc1pYUWdibVYzVEdWdUlEMGdibVYzVTNSeWFXNW5MbXhsYm1kMGFDeGNiaUFnSUNBZ0lDQWdiMnhrVEdWdUlEMGdiMnhrVTNSeWFXNW5MbXhsYm1kMGFDeGNiaUFnSUNBZ0lDQWdiMnhrVUc5eklEMGdZbUZ6WlZCaGRHZ3ViMnhrVUc5ekxGeHVJQ0FnSUNBZ0lDQnVaWGRRYjNNZ1BTQnZiR1JRYjNNZ0xTQmthV0ZuYjI1aGJGQmhkR2dzWEc1Y2JpQWdJQ0FnSUNBZ1kyOXRiVzl1UTI5MWJuUWdQU0F3TzF4dUlDQWdJSGRvYVd4bElDaHVaWGRRYjNNZ0t5QXhJRHdnYm1WM1RHVnVJQ1ltSUc5c1pGQnZjeUFySURFZ1BDQnZiR1JNWlc0Z0ppWWdkR2hwY3k1bGNYVmhiSE1vYm1WM1UzUnlhVzVuVzI1bGQxQnZjeUFySURGZExDQnZiR1JUZEhKcGJtZGJiMnhrVUc5eklDc2dNVjBwS1NCN1hHNGdJQ0FnSUNCdVpYZFFiM01yS3p0Y2JpQWdJQ0FnSUc5c1pGQnZjeXNyTzF4dUlDQWdJQ0FnWTI5dGJXOXVRMjkxYm5Rckt6dGNiaUFnSUNCOVhHNWNiaUFnSUNCcFppQW9ZMjl0Ylc5dVEyOTFiblFwSUh0Y2JpQWdJQ0FnSUdKaGMyVlFZWFJvTG14aGMzUkRiMjF3YjI1bGJuUWdQU0I3WTI5MWJuUTZJR052YlcxdmJrTnZkVzUwTENCd2NtVjJhVzkxYzBOdmJYQnZibVZ1ZERvZ1ltRnpaVkJoZEdndWJHRnpkRU52YlhCdmJtVnVkSDA3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdZbUZ6WlZCaGRHZ3ViMnhrVUc5eklEMGdiMnhrVUc5ek8xeHVJQ0FnSUhKbGRIVnliaUJ1WlhkUWIzTTdYRzRnSUgwc1hHNWNiaUFnWlhGMVlXeHpLR3hsWm5Rc0lISnBaMmgwS1NCN1hHNGdJQ0FnYVdZZ0tIUm9hWE11YjNCMGFXOXVjeTVqYjIxd1lYSmhkRzl5S1NCN1hHNGdJQ0FnSUNCeVpYUjFjbTRnZEdocGN5NXZjSFJwYjI1ekxtTnZiWEJoY21GMGIzSW9iR1ZtZEN3Z2NtbG5hSFFwTzF4dUlDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z2JHVm1kQ0E5UFQwZ2NtbG5hSFJjYmlBZ0lDQWdJQ0FnZkh3Z0tIUm9hWE11YjNCMGFXOXVjeTVwWjI1dmNtVkRZWE5sSUNZbUlHeGxablF1ZEc5TWIzZGxja05oYzJVb0tTQTlQVDBnY21sbmFIUXVkRzlNYjNkbGNrTmhjMlVvS1NrN1hHNGdJQ0FnZlZ4dUlDQjlMRnh1SUNCeVpXMXZkbVZGYlhCMGVTaGhjbkpoZVNrZ2UxeHVJQ0FnSUd4bGRDQnlaWFFnUFNCYlhUdGNiaUFnSUNCbWIzSWdLR3hsZENCcElEMGdNRHNnYVNBOElHRnljbUY1TG14bGJtZDBhRHNnYVNzcktTQjdYRzRnSUNBZ0lDQnBaaUFvWVhKeVlYbGJhVjBwSUh0Y2JpQWdJQ0FnSUNBZ2NtVjBMbkIxYzJnb1lYSnlZWGxiYVYwcE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgxY2JpQWdJQ0J5WlhSMWNtNGdjbVYwTzF4dUlDQjlMRnh1SUNCallYTjBTVzV3ZFhRb2RtRnNkV1VwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdkbUZzZFdVN1hHNGdJSDBzWEc0Z0lIUnZhMlZ1YVhwbEtIWmhiSFZsS1NCN1hHNGdJQ0FnY21WMGRYSnVJSFpoYkhWbExuTndiR2wwS0NjbktUdGNiaUFnZlN4Y2JpQWdhbTlwYmloamFHRnljeWtnZTF4dUlDQWdJSEpsZEhWeWJpQmphR0Z5Y3k1cWIybHVLQ2NuS1R0Y2JpQWdmVnh1ZlR0Y2JseHVablZ1WTNScGIyNGdZblZwYkdSV1lXeDFaWE1vWkdsbVppd2diR0Z6ZEVOdmJYQnZibVZ1ZEN3Z2JtVjNVM1J5YVc1bkxDQnZiR1JUZEhKcGJtY3NJSFZ6WlV4dmJtZGxjM1JVYjJ0bGJpa2dlMXh1SUNBdkx5QkdhWEp6ZENCM1pTQmpiMjUyWlhKMElHOTFjaUJzYVc1clpXUWdiR2x6ZENCdlppQmpiMjF3YjI1bGJuUnpJR2x1SUhKbGRtVnljMlVnYjNKa1pYSWdkRzhnWVc1Y2JpQWdMeThnWVhKeVlYa2dhVzRnZEdobElISnBaMmgwSUc5eVpHVnlPbHh1SUNCamIyNXpkQ0JqYjIxd2IyNWxiblJ6SUQwZ1cxMDdYRzRnSUd4bGRDQnVaWGgwUTI5dGNHOXVaVzUwTzF4dUlDQjNhR2xzWlNBb2JHRnpkRU52YlhCdmJtVnVkQ2tnZTF4dUlDQWdJR052YlhCdmJtVnVkSE11Y0hWemFDaHNZWE4wUTI5dGNHOXVaVzUwS1R0Y2JpQWdJQ0J1WlhoMFEyOXRjRzl1Wlc1MElEMGdiR0Z6ZEVOdmJYQnZibVZ1ZEM1d2NtVjJhVzkxYzBOdmJYQnZibVZ1ZER0Y2JpQWdJQ0JrWld4bGRHVWdiR0Z6ZEVOdmJYQnZibVZ1ZEM1d2NtVjJhVzkxYzBOdmJYQnZibVZ1ZER0Y2JpQWdJQ0JzWVhOMFEyOXRjRzl1Wlc1MElEMGdibVY0ZEVOdmJYQnZibVZ1ZER0Y2JpQWdmVnh1SUNCamIyMXdiMjVsYm5SekxuSmxkbVZ5YzJVb0tUdGNibHh1SUNCc1pYUWdZMjl0Y0c5dVpXNTBVRzl6SUQwZ01DeGNiaUFnSUNBZ0lHTnZiWEJ2Ym1WdWRFeGxiaUE5SUdOdmJYQnZibVZ1ZEhNdWJHVnVaM1JvTEZ4dUlDQWdJQ0FnYm1WM1VHOXpJRDBnTUN4Y2JpQWdJQ0FnSUc5c1pGQnZjeUE5SURBN1hHNWNiaUFnWm05eUlDZzdJR052YlhCdmJtVnVkRkJ2Y3lBOElHTnZiWEJ2Ym1WdWRFeGxianNnWTI5dGNHOXVaVzUwVUc5ekt5c3BJSHRjYmlBZ0lDQnNaWFFnWTI5dGNHOXVaVzUwSUQwZ1kyOXRjRzl1Wlc1MGMxdGpiMjF3YjI1bGJuUlFiM05kTzF4dUlDQWdJR2xtSUNnaFkyOXRjRzl1Wlc1MExuSmxiVzkyWldRcElIdGNiaUFnSUNBZ0lHbG1JQ2doWTI5dGNHOXVaVzUwTG1Ga1pHVmtJQ1ltSUhWelpVeHZibWRsYzNSVWIydGxiaWtnZTF4dUlDQWdJQ0FnSUNCc1pYUWdkbUZzZFdVZ1BTQnVaWGRUZEhKcGJtY3VjMnhwWTJVb2JtVjNVRzl6TENCdVpYZFFiM01nS3lCamIyMXdiMjVsYm5RdVkyOTFiblFwTzF4dUlDQWdJQ0FnSUNCMllXeDFaU0E5SUhaaGJIVmxMbTFoY0NobWRXNWpkR2x2YmloMllXeDFaU3dnYVNrZ2UxeHVJQ0FnSUNBZ0lDQWdJR3hsZENCdmJHUldZV3gxWlNBOUlHOXNaRk4wY21sdVoxdHZiR1JRYjNNZ0t5QnBYVHRjYmlBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnYjJ4a1ZtRnNkV1V1YkdWdVozUm9JRDRnZG1Gc2RXVXViR1Z1WjNSb0lEOGdiMnhrVm1Gc2RXVWdPaUIyWVd4MVpUdGNiaUFnSUNBZ0lDQWdmU2s3WEc1Y2JpQWdJQ0FnSUNBZ1kyOXRjRzl1Wlc1MExuWmhiSFZsSUQwZ1pHbG1aaTVxYjJsdUtIWmhiSFZsS1R0Y2JpQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUdOdmJYQnZibVZ1ZEM1MllXeDFaU0E5SUdScFptWXVhbTlwYmlodVpYZFRkSEpwYm1jdWMyeHBZMlVvYm1WM1VHOXpMQ0J1WlhkUWIzTWdLeUJqYjIxd2IyNWxiblF1WTI5MWJuUXBLVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQWdJRzVsZDFCdmN5QXJQU0JqYjIxd2IyNWxiblF1WTI5MWJuUTdYRzVjYmlBZ0lDQWdJQzh2SUVOdmJXMXZiaUJqWVhObFhHNGdJQ0FnSUNCcFppQW9JV052YlhCdmJtVnVkQzVoWkdSbFpDa2dlMXh1SUNBZ0lDQWdJQ0J2YkdSUWIzTWdLejBnWTI5dGNHOXVaVzUwTG1OdmRXNTBPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNCamIyMXdiMjVsYm5RdWRtRnNkV1VnUFNCa2FXWm1MbXB2YVc0b2IyeGtVM1J5YVc1bkxuTnNhV05sS0c5c1pGQnZjeXdnYjJ4a1VHOXpJQ3NnWTI5dGNHOXVaVzUwTG1OdmRXNTBLU2s3WEc0Z0lDQWdJQ0J2YkdSUWIzTWdLejBnWTI5dGNHOXVaVzUwTG1OdmRXNTBPMXh1WEc0Z0lDQWdJQ0F2THlCU1pYWmxjbk5sSUdGa1pDQmhibVFnY21WdGIzWmxJSE52SUhKbGJXOTJaWE1nWVhKbElHOTFkSEIxZENCbWFYSnpkQ0IwYnlCdFlYUmphQ0JqYjIxdGIyNGdZMjl1ZG1WdWRHbHZibHh1SUNBZ0lDQWdMeThnVkdobElHUnBabVpwYm1jZ1lXeG5iM0pwZEdodElHbHpJSFJwWldRZ2RHOGdZV1JrSUhSb1pXNGdjbVZ0YjNabElHOTFkSEIxZENCaGJtUWdkR2hwY3lCcGN5QjBhR1VnYzJsdGNHeGxjM1JjYmlBZ0lDQWdJQzh2SUhKdmRYUmxJSFJ2SUdkbGRDQjBhR1VnWkdWemFYSmxaQ0J2ZFhSd2RYUWdkMmwwYUNCdGFXNXBiV0ZzSUc5MlpYSm9aV0ZrTGx4dUlDQWdJQ0FnYVdZZ0tHTnZiWEJ2Ym1WdWRGQnZjeUFtSmlCamIyMXdiMjVsYm5SelcyTnZiWEJ2Ym1WdWRGQnZjeUF0SURGZExtRmtaR1ZrS1NCN1hHNGdJQ0FnSUNBZ0lHeGxkQ0IwYlhBZ1BTQmpiMjF3YjI1bGJuUnpXMk52YlhCdmJtVnVkRkJ2Y3lBdElERmRPMXh1SUNBZ0lDQWdJQ0JqYjIxd2IyNWxiblJ6VzJOdmJYQnZibVZ1ZEZCdmN5QXRJREZkSUQwZ1kyOXRjRzl1Wlc1MGMxdGpiMjF3YjI1bGJuUlFiM05kTzF4dUlDQWdJQ0FnSUNCamIyMXdiMjVsYm5SelcyTnZiWEJ2Ym1WdWRGQnZjMTBnUFNCMGJYQTdYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZWeHVJQ0I5WEc1Y2JpQWdMeThnVTNCbFkybGhiQ0JqWVhObElHaGhibVJzWlNCbWIzSWdkMmhsYmlCdmJtVWdkR1Z5YldsdVlXd2dhWE1nYVdkdWIzSmxaQ0FvYVM1bExpQjNhR2wwWlhOd1lXTmxLUzVjYmlBZ0x5OGdSbTl5SUhSb2FYTWdZMkZ6WlNCM1pTQnRaWEpuWlNCMGFHVWdkR1Z5YldsdVlXd2dhVzUwYnlCMGFHVWdjSEpwYjNJZ2MzUnlhVzVuSUdGdVpDQmtjbTl3SUhSb1pTQmphR0Z1WjJVdVhHNGdJQzh2SUZSb2FYTWdhWE1nYjI1c2VTQmhkbUZwYkdGaWJHVWdabTl5SUhOMGNtbHVaeUJ0YjJSbExseHVJQ0JzWlhRZ1ptbHVZV3hEYjIxd2IyNWxiblFnUFNCamIyMXdiMjVsYm5SelcyTnZiWEJ2Ym1WdWRFeGxiaUF0SURGZE8xeHVJQ0JwWmlBb1kyOXRjRzl1Wlc1MFRHVnVJRDRnTVZ4dUlDQWdJQ0FnSmlZZ2RIbHdaVzltSUdacGJtRnNRMjl0Y0c5dVpXNTBMblpoYkhWbElEMDlQU0FuYzNSeWFXNW5KMXh1SUNBZ0lDQWdKaVlnS0dacGJtRnNRMjl0Y0c5dVpXNTBMbUZrWkdWa0lIeDhJR1pwYm1Gc1EyOXRjRzl1Wlc1MExuSmxiVzkyWldRcFhHNGdJQ0FnSUNBbUppQmthV1ptTG1WeGRXRnNjeWduSnl3Z1ptbHVZV3hEYjIxd2IyNWxiblF1ZG1Gc2RXVXBLU0I3WEc0Z0lDQWdZMjl0Y0c5dVpXNTBjMXRqYjIxd2IyNWxiblJNWlc0Z0xTQXlYUzUyWVd4MVpTQXJQU0JtYVc1aGJFTnZiWEJ2Ym1WdWRDNTJZV3gxWlR0Y2JpQWdJQ0JqYjIxd2IyNWxiblJ6TG5CdmNDZ3BPMXh1SUNCOVhHNWNiaUFnY21WMGRYSnVJR052YlhCdmJtVnVkSE03WEc1OVhHNGlYWDA9XG4iLCAiLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRpZmZDaGFycyA9IGRpZmZDaGFycztcbmV4cG9ydHMuY2hhcmFjdGVyRGlmZiA9IHZvaWQgMDtcblxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbnZhclxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuX2Jhc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2Jhc2VcIikpXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuO1xuXG4vKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovIGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xudmFyIGNoYXJhY3RlckRpZmYgPSBuZXdcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl9iYXNlXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuW1xuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuXCJkZWZhdWx0XCJcbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG5dKCk7XG5cbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbmV4cG9ydHMuY2hhcmFjdGVyRGlmZiA9IGNoYXJhY3RlckRpZmY7XG5cbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG5mdW5jdGlvbiBkaWZmQ2hhcnMob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGNoYXJhY3RlckRpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTlrYVdabUwyTm9ZWEpoWTNSbGNpNXFjeUpkTENKdVlXMWxjeUk2V3lKamFHRnlZV04wWlhKRWFXWm1JaXdpUkdsbVppSXNJbVJwWm1aRGFHRnljeUlzSW05c1pGTjBjaUlzSW01bGQxTjBjaUlzSW05d2RHbHZibk1pTENKa2FXWm1JbDBzSW0xaGNIQnBibWR6SWpvaU96czdPenM3T3pzN08wRkJRVUU3UVVGQlFUdEJRVUZCTzBGQlFVRTdRVUZCUVRzN096czdRVUZGVHl4SlFVRk5RU3hoUVVGaExFZEJRVWM3UVVGQlNVTTdRVUZCUVVFN1FVRkJRVUU3UVVGQlFVRTdRVUZCUVVFN1FVRkJRVUU3UVVGQlFVRTdRVUZCUVVFc1EwRkJTaXhGUVVGMFFqczdPenM3TzBGQlEwRXNVMEZCVTBNc1UwRkJWQ3hEUVVGdFFrTXNUVUZCYmtJc1JVRkJNa0pETEUxQlFUTkNMRVZCUVcxRFF5eFBRVUZ1UXl4RlFVRTBRenRCUVVGRkxGTkJRVTlNTEdGQlFXRXNRMEZCUTAwc1NVRkJaQ3hEUVVGdFFrZ3NUVUZCYmtJc1JVRkJNa0pETEUxQlFUTkNMRVZCUVcxRFF5eFBRVUZ1UXl4RFFVRlFPMEZCUVhGRUlpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lhVzF3YjNKMElFUnBabVlnWm5KdmJTQW5MaTlpWVhObEp6dGNibHh1Wlhod2IzSjBJR052Ym5OMElHTm9ZWEpoWTNSbGNrUnBabVlnUFNCdVpYY2dSR2xtWmlncE8xeHVaWGh3YjNKMElHWjFibU4wYVc5dUlHUnBabVpEYUdGeWN5aHZiR1JUZEhJc0lHNWxkMU4wY2l3Z2IzQjBhVzl1Y3lrZ2V5QnlaWFIxY200Z1kyaGhjbUZqZEdWeVJHbG1aaTVrYVdabUtHOXNaRk4wY2l3Z2JtVjNVM1J5TENCdmNIUnBiMjV6S1RzZ2ZWeHVJbDE5XG4iLCAiLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmdlbmVyYXRlT3B0aW9ucyA9IGdlbmVyYXRlT3B0aW9ucztcblxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbmZ1bmN0aW9uIGdlbmVyYXRlT3B0aW9ucyhvcHRpb25zLCBkZWZhdWx0cykge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBkZWZhdWx0cy5jYWxsYmFjayA9IG9wdGlvbnM7XG4gIH0gZWxzZSBpZiAob3B0aW9ucykge1xuICAgIGZvciAodmFyIG5hbWUgaW4gb3B0aW9ucykge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgIGRlZmF1bHRzW25hbWVdID0gb3B0aW9uc1tuYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGVmYXVsdHM7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTkxZEdsc0wzQmhjbUZ0Y3k1cWN5SmRMQ0p1WVcxbGN5STZXeUpuWlc1bGNtRjBaVTl3ZEdsdmJuTWlMQ0p2Y0hScGIyNXpJaXdpWkdWbVlYVnNkSE1pTENKallXeHNZbUZqYXlJc0ltNWhiV1VpTENKb1lYTlBkMjVRY205d1pYSjBlU0pkTENKdFlYQndhVzVuY3lJNklqczdPenM3T3pzN08wRkJRVThzVTBGQlUwRXNaVUZCVkN4RFFVRjVRa01zVDBGQmVrSXNSVUZCYTBORExGRkJRV3hETEVWQlFUUkRPMEZCUTJwRUxFMUJRVWtzVDBGQlQwUXNUMEZCVUN4TFFVRnRRaXhWUVVGMlFpeEZRVUZ0UXp0QlFVTnFRME1zU1VGQlFVRXNVVUZCVVN4RFFVRkRReXhSUVVGVUxFZEJRVzlDUml4UFFVRndRanRCUVVORUxFZEJSa1FzVFVGRlR5eEpRVUZKUVN4UFFVRktMRVZCUVdFN1FVRkRiRUlzVTBGQlN5eEpRVUZKUnl4SlFVRlVMRWxCUVdsQ1NDeFBRVUZxUWl4RlFVRXdRanRCUVVONFFqdEJRVU5CTEZWQlFVbEJMRTlCUVU4c1EwRkJRMGtzWTBGQlVpeERRVUYxUWtRc1NVRkJka0lzUTBGQlNpeEZRVUZyUXp0QlFVTm9RMFlzVVVGQlFVRXNVVUZCVVN4RFFVRkRSU3hKUVVGRUxFTkJRVklzUjBGQmFVSklMRTlCUVU4c1EwRkJRMGNzU1VGQlJDeERRVUY0UWp0QlFVTkVPMEZCUTBZN1FVRkRSanM3UVVGRFJDeFRRVUZQUml4UlFVRlFPMEZCUTBRaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SmxlSEJ2Y25RZ1puVnVZM1JwYjI0Z1oyVnVaWEpoZEdWUGNIUnBiMjV6S0c5d2RHbHZibk1zSUdSbFptRjFiSFJ6S1NCN1hHNGdJR2xtSUNoMGVYQmxiMllnYjNCMGFXOXVjeUE5UFQwZ0oyWjFibU4wYVc5dUp5a2dlMXh1SUNBZ0lHUmxabUYxYkhSekxtTmhiR3hpWVdOcklEMGdiM0IwYVc5dWN6dGNiaUFnZlNCbGJITmxJR2xtSUNodmNIUnBiMjV6S1NCN1hHNGdJQ0FnWm05eUlDaHNaWFFnYm1GdFpTQnBiaUJ2Y0hScGIyNXpLU0I3WEc0Z0lDQWdJQ0F2S2lCcGMzUmhibUoxYkNCcFoyNXZjbVVnWld4elpTQXFMMXh1SUNBZ0lDQWdhV1lnS0c5d2RHbHZibk11YUdGelQzZHVVSEp2Y0dWeWRIa29ibUZ0WlNrcElIdGNiaUFnSUNBZ0lDQWdaR1ZtWVhWc2RITmJibUZ0WlYwZ1BTQnZjSFJwYjI1elcyNWhiV1ZkTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmlBZ2ZWeHVJQ0J5WlhSMWNtNGdaR1ZtWVhWc2RITTdYRzU5WEc0aVhYMD1cbiIsICIvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5cInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGlmZldvcmRzID0gZGlmZldvcmRzO1xuZXhwb3J0cy5kaWZmV29yZHNXaXRoU3BhY2UgPSBkaWZmV29yZHNXaXRoU3BhY2U7XG5leHBvcnRzLndvcmREaWZmID0gdm9pZCAwO1xuXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xudmFyXG4vKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5fYmFzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vYmFzZVwiKSlcbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG47XG5cbnZhclxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuX3BhcmFtcyA9IHJlcXVpcmUoXCIuLi91dGlsL3BhcmFtc1wiKVxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbjtcblxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbi8vIEJhc2VkIG9uIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xhdGluX3NjcmlwdF9pbl9Vbmljb2RlXG4vL1xuLy8gUmFuZ2VzIGFuZCBleGNlcHRpb25zOlxuLy8gTGF0aW4tMSBTdXBwbGVtZW50LCAwMDgw4oCTMDBGRlxuLy8gIC0gVSswMEQ3ICDDlyBNdWx0aXBsaWNhdGlvbiBzaWduXG4vLyAgLSBVKzAwRjcgIMO3IERpdmlzaW9uIHNpZ25cbi8vIExhdGluIEV4dGVuZGVkLUEsIDAxMDDigJMwMTdGXG4vLyBMYXRpbiBFeHRlbmRlZC1CLCAwMTgw4oCTMDI0RlxuLy8gSVBBIEV4dGVuc2lvbnMsIDAyNTDigJMwMkFGXG4vLyBTcGFjaW5nIE1vZGlmaWVyIExldHRlcnMsIDAyQjDigJMwMkZGXG4vLyAgLSBVKzAyQzcgIMuHICYjNzExOyAgQ2Fyb25cbi8vICAtIFUrMDJEOCAgy5ggJiM3Mjg7ICBCcmV2ZVxuLy8gIC0gVSswMkQ5ICDLmSAmIzcyOTsgIERvdCBBYm92ZVxuLy8gIC0gVSswMkRBICDLmiAmIzczMDsgIFJpbmcgQWJvdmVcbi8vICAtIFUrMDJEQiAgy5sgJiM3MzE7ICBPZ29uZWtcbi8vICAtIFUrMDJEQyAgy5wgJiM3MzI7ICBTbWFsbCBUaWxkZVxuLy8gIC0gVSswMkREICDLnSAmIzczMzsgIERvdWJsZSBBY3V0ZSBBY2NlbnRcbi8vIExhdGluIEV4dGVuZGVkIEFkZGl0aW9uYWwsIDFFMDDigJMxRUZGXG52YXIgZXh0ZW5kZWRXb3JkQ2hhcnMgPSAvXltBLVphLXpcXHhDMC1cXHUwMkM2XFx1MDJDOC1cXHUwMkQ3XFx1MDJERS1cXHUwMkZGXFx1MUUwMC1cXHUxRUZGXSskLztcbnZhciByZVdoaXRlc3BhY2UgPSAvXFxTLztcbnZhciB3b3JkRGlmZiA9IG5ld1xuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuX2Jhc2Vcbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG5bXG4vKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5cImRlZmF1bHRcIlxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbl0oKTtcblxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuZXhwb3J0cy53b3JkRGlmZiA9IHdvcmREaWZmO1xuXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xud29yZERpZmYuZXF1YWxzID0gZnVuY3Rpb24gKGxlZnQsIHJpZ2h0KSB7XG4gIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlQ2FzZSkge1xuICAgIGxlZnQgPSBsZWZ0LnRvTG93ZXJDYXNlKCk7XG4gICAgcmlnaHQgPSByaWdodC50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgcmV0dXJuIGxlZnQgPT09IHJpZ2h0IHx8IHRoaXMub3B0aW9ucy5pZ25vcmVXaGl0ZXNwYWNlICYmICFyZVdoaXRlc3BhY2UudGVzdChsZWZ0KSAmJiAhcmVXaGl0ZXNwYWNlLnRlc3QocmlnaHQpO1xufTtcblxud29yZERpZmYudG9rZW5pemUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgLy8gQWxsIHdoaXRlc3BhY2Ugc3ltYm9scyBleGNlcHQgbmV3bGluZSBncm91cCBpbnRvIG9uZSB0b2tlbiwgZWFjaCBuZXdsaW5lIC0gaW4gc2VwYXJhdGUgdG9rZW5cbiAgdmFyIHRva2VucyA9IHZhbHVlLnNwbGl0KC8oW15cXFNcXHJcXG5dK3xbKClbXFxde30nXCJcXHJcXG5dfFxcYikvKTsgLy8gSm9pbiB0aGUgYm91bmRhcnkgc3BsaXRzIHRoYXQgd2UgZG8gbm90IGNvbnNpZGVyIHRvIGJlIGJvdW5kYXJpZXMuIFRoaXMgaXMgcHJpbWFyaWx5IHRoZSBleHRlbmRlZCBMYXRpbiBjaGFyYWN0ZXIgc2V0LlxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIC8vIElmIHdlIGhhdmUgYW4gZW1wdHkgc3RyaW5nIGluIHRoZSBuZXh0IGZpZWxkIGFuZCB3ZSBoYXZlIG9ubHkgd29yZCBjaGFycyBiZWZvcmUgYW5kIGFmdGVyLCBtZXJnZVxuICAgIGlmICghdG9rZW5zW2kgKyAxXSAmJiB0b2tlbnNbaSArIDJdICYmIGV4dGVuZGVkV29yZENoYXJzLnRlc3QodG9rZW5zW2ldKSAmJiBleHRlbmRlZFdvcmRDaGFycy50ZXN0KHRva2Vuc1tpICsgMl0pKSB7XG4gICAgICB0b2tlbnNbaV0gKz0gdG9rZW5zW2kgKyAyXTtcbiAgICAgIHRva2Vucy5zcGxpY2UoaSArIDEsIDIpO1xuICAgICAgaS0tO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0b2tlbnM7XG59O1xuXG5mdW5jdGlvbiBkaWZmV29yZHMob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9XG4gIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgKDAsXG4gIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG5cbiAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICBfcGFyYW1zXG4gIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gIC5cbiAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICBnZW5lcmF0ZU9wdGlvbnMpXG4gIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gIChvcHRpb25zLCB7XG4gICAgaWdub3JlV2hpdGVzcGFjZTogdHJ1ZVxuICB9KTtcbiAgcmV0dXJuIHdvcmREaWZmLmRpZmYob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBkaWZmV29yZHNXaXRoU3BhY2Uob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHdvcmREaWZmLmRpZmYob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMM055WXk5a2FXWm1MM2R2Y21RdWFuTWlYU3dpYm1GdFpYTWlPbHNpWlhoMFpXNWtaV1JYYjNKa1EyaGhjbk1pTENKeVpWZG9hWFJsYzNCaFkyVWlMQ0ozYjNKa1JHbG1aaUlzSWtScFptWWlMQ0psY1hWaGJITWlMQ0pzWldaMElpd2ljbWxuYUhRaUxDSnZjSFJwYjI1eklpd2lhV2R1YjNKbFEyRnpaU0lzSW5SdlRHOTNaWEpEWVhObElpd2lhV2R1YjNKbFYyaHBkR1Z6Y0dGalpTSXNJblJsYzNRaUxDSjBiMnRsYm1sNlpTSXNJblpoYkhWbElpd2lkRzlyWlc1eklpd2ljM0JzYVhRaUxDSnBJaXdpYkdWdVozUm9JaXdpYzNCc2FXTmxJaXdpWkdsbVpsZHZjbVJ6SWl3aWIyeGtVM1J5SWl3aWJtVjNVM1J5SWl3aVoyVnVaWEpoZEdWUGNIUnBiMjV6SWl3aVpHbG1aaUlzSW1ScFptWlhiM0prYzFkcGRHaFRjR0ZqWlNKZExDSnRZWEJ3YVc1bmN5STZJanM3T3pzN096czdPenM3UVVGQlFUdEJRVUZCTzBGQlFVRTdRVUZCUVR0QlFVRkJPenRCUVVOQk8wRkJRVUU3UVVGQlFUdEJRVUZCTzBGQlFVRTdPenM3TzBGQlJVRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRXNTVUZCVFVFc2FVSkJRV2xDTEVkQlFVY3NLMFJCUVRGQ08wRkJSVUVzU1VGQlRVTXNXVUZCV1N4SFFVRkhMRWxCUVhKQ08wRkJSVThzU1VGQlRVTXNVVUZCVVN4SFFVRkhPMEZCUVVsRE8wRkJRVUZCTzBGQlFVRkJPMEZCUVVGQk8wRkJRVUZCTzBGQlFVRkJPMEZCUVVGQk8wRkJRVUZCTEVOQlFVb3NSVUZCYWtJN096czdPenRCUVVOUVJDeFJRVUZSTEVOQlFVTkZMRTFCUVZRc1IwRkJhMElzVlVGQlUwTXNTVUZCVkN4RlFVRmxReXhMUVVGbUxFVkJRWE5DTzBGQlEzUkRMRTFCUVVrc1MwRkJTME1zVDBGQlRDeERRVUZoUXl4VlFVRnFRaXhGUVVFMlFqdEJRVU16UWtnc1NVRkJRVUVzU1VGQlNTeEhRVUZIUVN4SlFVRkpMRU5CUVVOSkxGZEJRVXdzUlVGQlVEdEJRVU5CU0N4SlFVRkJRU3hMUVVGTExFZEJRVWRCTEV0QlFVc3NRMEZCUTBjc1YwRkJUaXhGUVVGU08wRkJRMFE3TzBGQlEwUXNVMEZCVDBvc1NVRkJTU3hMUVVGTFF5eExRVUZVTEVsQlFXMUNMRXRCUVV0RExFOUJRVXdzUTBGQllVY3NaMEpCUVdJc1NVRkJhVU1zUTBGQlExUXNXVUZCV1N4RFFVRkRWU3hKUVVGaUxFTkJRV3RDVGl4SlFVRnNRaXhEUVVGc1F5eEpRVUUyUkN4RFFVRkRTaXhaUVVGWkxFTkJRVU5WTEVsQlFXSXNRMEZCYTBKTUxFdEJRV3hDTEVOQlFYaEdPMEZCUTBRc1EwRk9SRHM3UVVGUFFVb3NVVUZCVVN4RFFVRkRWU3hSUVVGVUxFZEJRVzlDTEZWQlFWTkRMRXRCUVZRc1JVRkJaMEk3UVVGRGJFTTdRVUZEUVN4TlFVRkpReXhOUVVGTkxFZEJRVWRFTEV0QlFVc3NRMEZCUTBVc1MwRkJUaXhEUVVGWkxHbERRVUZhTEVOQlFXSXNRMEZHYTBNc1EwRkpiRU03TzBGQlEwRXNUMEZCU3l4SlFVRkpReXhEUVVGRExFZEJRVWNzUTBGQllpeEZRVUZuUWtFc1EwRkJReXhIUVVGSFJpeE5RVUZOTEVOQlFVTkhMRTFCUVZBc1IwRkJaMElzUTBGQmNFTXNSVUZCZFVORUxFTkJRVU1zUlVGQmVFTXNSVUZCTkVNN1FVRkRNVU03UVVGRFFTeFJRVUZKTEVOQlFVTkdMRTFCUVUwc1EwRkJRMFVzUTBGQlF5eEhRVUZITEVOQlFVd3NRMEZCVUN4SlFVRnJRa1lzVFVGQlRTeERRVUZEUlN4RFFVRkRMRWRCUVVjc1EwRkJUQ3hEUVVGNFFpeEpRVU5MYUVJc2FVSkJRV2xDTEVOQlFVTlhMRWxCUVd4Q0xFTkJRWFZDUnl4TlFVRk5MRU5CUVVORkxFTkJRVVFzUTBGQk4wSXNRMEZFVEN4SlFVVkxhRUlzYVVKQlFXbENMRU5CUVVOWExFbEJRV3hDTEVOQlFYVkNSeXhOUVVGTkxFTkJRVU5GTEVOQlFVTXNSMEZCUnl4RFFVRk1MRU5CUVRkQ0xFTkJSbFFzUlVGRlowUTdRVUZET1VOR0xFMUJRVUZCTEUxQlFVMHNRMEZCUTBVc1EwRkJSQ3hEUVVGT0xFbEJRV0ZHTEUxQlFVMHNRMEZCUTBVc1EwRkJReXhIUVVGSExFTkJRVXdzUTBGQmJrSTdRVUZEUVVZc1RVRkJRVUVzVFVGQlRTeERRVUZEU1N4TlFVRlFMRU5CUVdOR0xFTkJRVU1zUjBGQlJ5eERRVUZzUWl4RlFVRnhRaXhEUVVGeVFqdEJRVU5CUVN4TlFVRkJRU3hEUVVGRE8wRkJRMFk3UVVGRFJqczdRVUZGUkN4VFFVRlBSaXhOUVVGUU8wRkJRMFFzUTBGcVFrUTdPMEZCYlVKUExGTkJRVk5MTEZOQlFWUXNRMEZCYlVKRExFMUJRVzVDTEVWQlFUSkNReXhOUVVFelFpeEZRVUZ0UTJRc1QwRkJia01zUlVGQk5FTTdRVUZEYWtSQkxFVkJRVUZCTEU5QlFVODdRVUZCUnp0QlFVRkJPMEZCUVVFN08wRkJRVUZsTzBGQlFVRkJPMEZCUVVGQk8wRkJRVUZCTzBGQlFVRkJPMEZCUVVGQk8wRkJRVUU3UVVGQlFTeEhRVUZuUW1Zc1QwRkJhRUlzUlVGQmVVSTdRVUZCUTBjc1NVRkJRVUVzWjBKQlFXZENMRVZCUVVVN1FVRkJia0lzUjBGQmVrSXNRMEZCVmp0QlFVTkJMRk5CUVU5U0xGRkJRVkVzUTBGQlEzRkNMRWxCUVZRc1EwRkJZMGdzVFVGQlpDeEZRVUZ6UWtNc1RVRkJkRUlzUlVGQk9FSmtMRTlCUVRsQ0xFTkJRVkE3UVVGRFJEczdRVUZGVFN4VFFVRlRhVUlzYTBKQlFWUXNRMEZCTkVKS0xFMUJRVFZDTEVWQlFXOURReXhOUVVGd1F5eEZRVUUwUTJRc1QwRkJOVU1zUlVGQmNVUTdRVUZETVVRc1UwRkJUMHdzVVVGQlVTeERRVUZEY1VJc1NVRkJWQ3hEUVVGalNDeE5RVUZrTEVWQlFYTkNReXhOUVVGMFFpeEZRVUU0UW1Rc1QwRkJPVUlzUTBGQlVEdEJRVU5FSWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaWFXMXdiM0owSUVScFptWWdabkp2YlNBbkxpOWlZWE5sSnp0Y2JtbHRjRzl5ZENCN1oyVnVaWEpoZEdWUGNIUnBiMjV6ZlNCbWNtOXRJQ2N1TGk5MWRHbHNMM0JoY21GdGN5YzdYRzVjYmk4dklFSmhjMlZrSUc5dUlHaDBkSEJ6T2k4dlpXNHVkMmxyYVhCbFpHbGhMbTl5Wnk5M2FXdHBMMHhoZEdsdVgzTmpjbWx3ZEY5cGJsOVZibWxqYjJSbFhHNHZMMXh1THk4Z1VtRnVaMlZ6SUdGdVpDQmxlR05sY0hScGIyNXpPbHh1THk4Z1RHRjBhVzR0TVNCVGRYQndiR1Z0Wlc1MExDQXdNRGd3NG9DVE1EQkdSbHh1THk4Z0lDMGdWU3N3TUVRM0lDRERseUJOZFd4MGFYQnNhV05oZEdsdmJpQnphV2R1WEc0dkx5QWdMU0JWS3pBd1JqY2dJTU8zSUVScGRtbHphVzl1SUhOcFoyNWNiaTh2SUV4aGRHbHVJRVY0ZEdWdVpHVmtMVUVzSURBeE1ERGlnSk13TVRkR1hHNHZMeUJNWVhScGJpQkZlSFJsYm1SbFpDMUNMQ0F3TVRndzRvQ1RNREkwUmx4dUx5OGdTVkJCSUVWNGRHVnVjMmx2Ym5Nc0lEQXlOVERpZ0pNd01rRkdYRzR2THlCVGNHRmphVzVuSUUxdlpHbG1hV1Z5SUV4bGRIUmxjbk1zSURBeVFqRGlnSk13TWtaR1hHNHZMeUFnTFNCVkt6QXlRemNnSU11SElDWWpOekV4T3lBZ1EyRnliMjVjYmk4dklDQXRJRlVyTURKRU9DQWd5NWdnSmlNM01qZzdJQ0JDY21WMlpWeHVMeThnSUMwZ1ZTc3dNa1E1SUNETG1TQW1JemN5T1RzZ0lFUnZkQ0JCWW05MlpWeHVMeThnSUMwZ1ZTc3dNa1JCSUNETG1pQW1JemN6TURzZ0lGSnBibWNnUVdKdmRtVmNiaTh2SUNBdElGVXJNREpFUWlBZ3k1c2dKaU0zTXpFN0lDQlBaMjl1Wld0Y2JpOHZJQ0F0SUZVck1ESkVReUFneTV3Z0ppTTNNekk3SUNCVGJXRnNiQ0JVYVd4a1pWeHVMeThnSUMwZ1ZTc3dNa1JFSUNETG5TQW1JemN6TXpzZ0lFUnZkV0pzWlNCQlkzVjBaU0JCWTJObGJuUmNiaTh2SUV4aGRHbHVJRVY0ZEdWdVpHVmtJRUZrWkdsMGFXOXVZV3dzSURGRk1ERGlnSk14UlVaR1hHNWpiMjV6ZENCbGVIUmxibVJsWkZkdmNtUkRhR0Z5Y3lBOUlDOWVXMkV0ZWtFdFdseGNkWHRETUgwdFhGeDFlMFpHZlZ4Y2RYdEVPSDB0WEZ4MWUwWTJmVnhjZFh0R09IMHRYRngxZXpKRE5uMWNYSFY3TWtNNGZTMWNYSFY3TWtRM2ZWeGNkWHN5UkVWOUxWeGNkWHN5UmtaOVhGeDFlekZGTURCOUxWeGNkWHN4UlVaR2ZWMHJKQzkxTzF4dVhHNWpiMjV6ZENCeVpWZG9hWFJsYzNCaFkyVWdQU0F2WEZ4VEx6dGNibHh1Wlhod2IzSjBJR052Ym5OMElIZHZjbVJFYVdabUlEMGdibVYzSUVScFptWW9LVHRjYm5kdmNtUkVhV1ptTG1WeGRXRnNjeUE5SUdaMWJtTjBhVzl1S0d4bFpuUXNJSEpwWjJoMEtTQjdYRzRnSUdsbUlDaDBhR2x6TG05d2RHbHZibk11YVdkdWIzSmxRMkZ6WlNrZ2UxeHVJQ0FnSUd4bFpuUWdQU0JzWldaMExuUnZURzkzWlhKRFlYTmxLQ2s3WEc0Z0lDQWdjbWxuYUhRZ1BTQnlhV2RvZEM1MGIweHZkMlZ5UTJGelpTZ3BPMXh1SUNCOVhHNGdJSEpsZEhWeWJpQnNaV1owSUQwOVBTQnlhV2RvZENCOGZDQW9kR2hwY3k1dmNIUnBiMjV6TG1sbmJtOXlaVmRvYVhSbGMzQmhZMlVnSmlZZ0lYSmxWMmhwZEdWemNHRmpaUzUwWlhOMEtHeGxablFwSUNZbUlDRnlaVmRvYVhSbGMzQmhZMlV1ZEdWemRDaHlhV2RvZENrcE8xeHVmVHRjYm5kdmNtUkVhV1ptTG5SdmEyVnVhWHBsSUQwZ1puVnVZM1JwYjI0b2RtRnNkV1VwSUh0Y2JpQWdMeThnUVd4c0lIZG9hWFJsYzNCaFkyVWdjM2x0WW05c2N5QmxlR05sY0hRZ2JtVjNiR2x1WlNCbmNtOTFjQ0JwYm5SdklHOXVaU0IwYjJ0bGJpd2daV0ZqYUNCdVpYZHNhVzVsSUMwZ2FXNGdjMlZ3WVhKaGRHVWdkRzlyWlc1Y2JpQWdiR1YwSUhSdmEyVnVjeUE5SUhaaGJIVmxMbk53YkdsMEtDOG9XMTVjWEZOY1hISmNYRzVkSzN4YktDbGJYRnhkZTMwblhDSmNYSEpjWEc1ZGZGeGNZaWt2S1R0Y2JseHVJQ0F2THlCS2IybHVJSFJvWlNCaWIzVnVaR0Z5ZVNCemNHeHBkSE1nZEdoaGRDQjNaU0JrYnlCdWIzUWdZMjl1YzJsa1pYSWdkRzhnWW1VZ1ltOTFibVJoY21sbGN5NGdWR2hwY3lCcGN5QndjbWx0WVhKcGJIa2dkR2hsSUdWNGRHVnVaR1ZrSUV4aGRHbHVJR05vWVhKaFkzUmxjaUJ6WlhRdVhHNGdJR1p2Y2lBb2JHVjBJR2tnUFNBd095QnBJRHdnZEc5clpXNXpMbXhsYm1kMGFDQXRJREU3SUdrckt5a2dlMXh1SUNBZ0lDOHZJRWxtSUhkbElHaGhkbVVnWVc0Z1pXMXdkSGtnYzNSeWFXNW5JR2x1SUhSb1pTQnVaWGgwSUdacFpXeGtJR0Z1WkNCM1pTQm9ZWFpsSUc5dWJIa2dkMjl5WkNCamFHRnljeUJpWldadmNtVWdZVzVrSUdGbWRHVnlMQ0J0WlhKblpWeHVJQ0FnSUdsbUlDZ2hkRzlyWlc1elcya2dLeUF4WFNBbUppQjBiMnRsYm5OYmFTQXJJREpkWEc0Z0lDQWdJQ0FnSUNBZ0ppWWdaWGgwWlc1a1pXUlhiM0prUTJoaGNuTXVkR1Z6ZENoMGIydGxibk5iYVYwcFhHNGdJQ0FnSUNBZ0lDQWdKaVlnWlhoMFpXNWtaV1JYYjNKa1EyaGhjbk11ZEdWemRDaDBiMnRsYm5OYmFTQXJJREpkS1NrZ2UxeHVJQ0FnSUNBZ2RHOXJaVzV6VzJsZElDczlJSFJ2YTJWdWMxdHBJQ3NnTWwwN1hHNGdJQ0FnSUNCMGIydGxibk11YzNCc2FXTmxLR2tnS3lBeExDQXlLVHRjYmlBZ0lDQWdJR2t0TFR0Y2JpQWdJQ0I5WEc0Z0lIMWNibHh1SUNCeVpYUjFjbTRnZEc5clpXNXpPMXh1ZlR0Y2JseHVaWGh3YjNKMElHWjFibU4wYVc5dUlHUnBabVpYYjNKa2N5aHZiR1JUZEhJc0lHNWxkMU4wY2l3Z2IzQjBhVzl1Y3lrZ2UxeHVJQ0J2Y0hScGIyNXpJRDBnWjJWdVpYSmhkR1ZQY0hScGIyNXpLRzl3ZEdsdmJuTXNJSHRwWjI1dmNtVlhhR2wwWlhOd1lXTmxPaUIwY25WbGZTazdYRzRnSUhKbGRIVnliaUIzYjNKa1JHbG1aaTVrYVdabUtHOXNaRk4wY2l3Z2JtVjNVM1J5TENCdmNIUnBiMjV6S1R0Y2JuMWNibHh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJR1JwWm1aWGIzSmtjMWRwZEdoVGNHRmpaU2h2YkdSVGRISXNJRzVsZDFOMGNpd2diM0IwYVc5dWN5a2dlMXh1SUNCeVpYUjFjbTRnZDI5eVpFUnBabVl1WkdsbVppaHZiR1JUZEhJc0lHNWxkMU4wY2l3Z2IzQjBhVzl1Y3lrN1hHNTlYRzRpWFgwPVxuIiwgIi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cblwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kaWZmTGluZXMgPSBkaWZmTGluZXM7XG5leHBvcnRzLmRpZmZUcmltbWVkTGluZXMgPSBkaWZmVHJpbW1lZExpbmVzO1xuZXhwb3J0cy5saW5lRGlmZiA9IHZvaWQgMDtcblxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbnZhclxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuX2Jhc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2Jhc2VcIikpXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuO1xuXG52YXJcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl9wYXJhbXMgPSByZXF1aXJlKFwiLi4vdXRpbC9wYXJhbXNcIilcbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG47XG5cbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8gZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG52YXIgbGluZURpZmYgPSBuZXdcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl9iYXNlXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuW1xuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuXCJkZWZhdWx0XCJcbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG5dKCk7XG5cbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbmV4cG9ydHMubGluZURpZmYgPSBsaW5lRGlmZjtcblxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbmxpbmVEaWZmLnRva2VuaXplID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIGlmICh0aGlzLm9wdGlvbnMuc3RyaXBUcmFpbGluZ0NyKSB7XG4gICAgLy8gcmVtb3ZlIG9uZSBcXHIgYmVmb3JlIFxcbiB0byBtYXRjaCBHTlUgZGlmZidzIC0tc3RyaXAtdHJhaWxpbmctY3IgYmVoYXZpb3JcbiAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1xcclxcbi9nLCAnXFxuJyk7XG4gIH1cblxuICB2YXIgcmV0TGluZXMgPSBbXSxcbiAgICAgIGxpbmVzQW5kTmV3bGluZXMgPSB2YWx1ZS5zcGxpdCgvKFxcbnxcXHJcXG4pLyk7IC8vIElnbm9yZSB0aGUgZmluYWwgZW1wdHkgdG9rZW4gdGhhdCBvY2N1cnMgaWYgdGhlIHN0cmluZyBlbmRzIHdpdGggYSBuZXcgbGluZVxuXG4gIGlmICghbGluZXNBbmROZXdsaW5lc1tsaW5lc0FuZE5ld2xpbmVzLmxlbmd0aCAtIDFdKSB7XG4gICAgbGluZXNBbmROZXdsaW5lcy5wb3AoKTtcbiAgfSAvLyBNZXJnZSB0aGUgY29udGVudCBhbmQgbGluZSBzZXBhcmF0b3JzIGludG8gc2luZ2xlIHRva2Vuc1xuXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lc0FuZE5ld2xpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGxpbmUgPSBsaW5lc0FuZE5ld2xpbmVzW2ldO1xuXG4gICAgaWYgKGkgJSAyICYmICF0aGlzLm9wdGlvbnMubmV3bGluZUlzVG9rZW4pIHtcbiAgICAgIHJldExpbmVzW3JldExpbmVzLmxlbmd0aCAtIDFdICs9IGxpbmU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlV2hpdGVzcGFjZSkge1xuICAgICAgICBsaW5lID0gbGluZS50cmltKCk7XG4gICAgICB9XG5cbiAgICAgIHJldExpbmVzLnB1c2gobGluZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldExpbmVzO1xufTtcblxuZnVuY3Rpb24gZGlmZkxpbmVzKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjaykge1xuICByZXR1cm4gbGluZURpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spO1xufVxuXG5mdW5jdGlvbiBkaWZmVHJpbW1lZExpbmVzKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjaykge1xuICB2YXIgb3B0aW9ucyA9XG4gIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgKDAsXG4gIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG5cbiAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICBfcGFyYW1zXG4gIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gIC5cbiAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICBnZW5lcmF0ZU9wdGlvbnMpXG4gIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gIChjYWxsYmFjaywge1xuICAgIGlnbm9yZVdoaXRlc3BhY2U6IHRydWVcbiAgfSk7XG4gIHJldHVybiBsaW5lRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OWthV1ptTDJ4cGJtVXVhbk1pWFN3aWJtRnRaWE1pT2xzaWJHbHVaVVJwWm1ZaUxDSkVhV1ptSWl3aWRHOXJaVzVwZW1VaUxDSjJZV3gxWlNJc0ltOXdkR2x2Ym5NaUxDSnpkSEpwY0ZSeVlXbHNhVzVuUTNJaUxDSnlaWEJzWVdObElpd2ljbVYwVEdsdVpYTWlMQ0pzYVc1bGMwRnVaRTVsZDJ4cGJtVnpJaXdpYzNCc2FYUWlMQ0pzWlc1bmRHZ2lMQ0p3YjNBaUxDSnBJaXdpYkdsdVpTSXNJbTVsZDJ4cGJtVkpjMVJ2YTJWdUlpd2lhV2R1YjNKbFYyaHBkR1Z6Y0dGalpTSXNJblJ5YVcwaUxDSndkWE5vSWl3aVpHbG1aa3hwYm1Weklpd2liMnhrVTNSeUlpd2libVYzVTNSeUlpd2lZMkZzYkdKaFkyc2lMQ0prYVdabUlpd2laR2xtWmxSeWFXMXRaV1JNYVc1bGN5SXNJbWRsYm1WeVlYUmxUM0IwYVc5dWN5SmRMQ0p0WVhCd2FXNW5jeUk2SWpzN096czdPenM3T3pzN1FVRkJRVHRCUVVGQk8wRkJRVUU3UVVGQlFUdEJRVUZCT3p0QlFVTkJPMEZCUVVFN1FVRkJRVHRCUVVGQk8wRkJRVUU3T3pzN08wRkJSVThzU1VGQlRVRXNVVUZCVVN4SFFVRkhPMEZCUVVsRE8wRkJRVUZCTzBGQlFVRkJPMEZCUVVGQk8wRkJRVUZCTzBGQlFVRkJPMEZCUVVGQk8wRkJRVUZCTEVOQlFVb3NSVUZCYWtJN096czdPenRCUVVOUVJDeFJRVUZSTEVOQlFVTkZMRkZCUVZRc1IwRkJiMElzVlVGQlUwTXNTMEZCVkN4RlFVRm5RanRCUVVOc1F5eE5RVUZITEV0QlFVdERMRTlCUVV3c1EwRkJZVU1zWlVGQmFFSXNSVUZCYVVNN1FVRkRMMEk3UVVGRFFVWXNTVUZCUVVFc1MwRkJTeXhIUVVGSFFTeExRVUZMTEVOQlFVTkhMRTlCUVU0c1EwRkJZeXhQUVVGa0xFVkJRWFZDTEVsQlFYWkNMRU5CUVZJN1FVRkRSRHM3UVVGRlJDeE5RVUZKUXl4UlFVRlJMRWRCUVVjc1JVRkJaanRCUVVGQkxFMUJRMGxETEdkQ1FVRm5RaXhIUVVGSFRDeExRVUZMTEVOQlFVTk5MRXRCUVU0c1EwRkJXU3hYUVVGYUxFTkJSSFpDTEVOQlRtdERMRU5CVTJ4RE96dEJRVU5CTEUxQlFVa3NRMEZCUTBRc1owSkJRV2RDTEVOQlFVTkJMR2RDUVVGblFpeERRVUZEUlN4TlFVRnFRaXhIUVVFd1FpeERRVUV6UWl4RFFVRnlRaXhGUVVGdlJEdEJRVU5zUkVZc1NVRkJRVUVzWjBKQlFXZENMRU5CUVVOSExFZEJRV3BDTzBGQlEwUXNSMEZhYVVNc1EwRmpiRU03T3p0QlFVTkJMRTlCUVVzc1NVRkJTVU1zUTBGQlF5eEhRVUZITEVOQlFXSXNSVUZCWjBKQkxFTkJRVU1zUjBGQlIwb3NaMEpCUVdkQ0xFTkJRVU5GTEUxQlFYSkRMRVZCUVRaRFJTeERRVUZETEVWQlFUbERMRVZCUVd0RU8wRkJRMmhFTEZGQlFVbERMRWxCUVVrc1IwRkJSMHdzWjBKQlFXZENMRU5CUVVOSkxFTkJRVVFzUTBGQk0wSTdPMEZCUlVFc1VVRkJTVUVzUTBGQlF5eEhRVUZITEVOQlFVb3NTVUZCVXl4RFFVRkRMRXRCUVV0U0xFOUJRVXdzUTBGQllWVXNZMEZCTTBJc1JVRkJNa003UVVGRGVrTlFMRTFCUVVGQkxGRkJRVkVzUTBGQlEwRXNVVUZCVVN4RFFVRkRSeXhOUVVGVUxFZEJRV3RDTEVOQlFXNUNMRU5CUVZJc1NVRkJhVU5ITEVsQlFXcERPMEZCUTBRc1MwRkdSQ3hOUVVWUE8wRkJRMHdzVlVGQlNTeExRVUZMVkN4UFFVRk1MRU5CUVdGWExHZENRVUZxUWl4RlFVRnRRenRCUVVOcVEwWXNVVUZCUVVFc1NVRkJTU3hIUVVGSFFTeEpRVUZKTEVOQlFVTkhMRWxCUVV3c1JVRkJVRHRCUVVORU96dEJRVU5FVkN4TlFVRkJRU3hSUVVGUkxFTkJRVU5WTEVsQlFWUXNRMEZCWTBvc1NVRkJaRHRCUVVORU8wRkJRMFk3TzBGQlJVUXNVMEZCVDA0c1VVRkJVRHRCUVVORUxFTkJOMEpFT3p0QlFTdENUeXhUUVVGVFZ5eFRRVUZVTEVOQlFXMUNReXhOUVVGdVFpeEZRVUV5UWtNc1RVRkJNMElzUlVGQmJVTkRMRkZCUVc1RExFVkJRVFpETzBGQlFVVXNVMEZCVDNKQ0xGRkJRVkVzUTBGQlEzTkNMRWxCUVZRc1EwRkJZMGdzVFVGQlpDeEZRVUZ6UWtNc1RVRkJkRUlzUlVGQk9FSkRMRkZCUVRsQ0xFTkJRVkE3UVVGQmFVUTdPMEZCUTJoSExGTkJRVk5GTEdkQ1FVRlVMRU5CUVRCQ1NpeE5RVUV4UWl4RlFVRnJRME1zVFVGQmJFTXNSVUZCTUVORExGRkJRVEZETEVWQlFXOUVPMEZCUTNwRUxFMUJRVWxxUWl4UFFVRlBPMEZCUVVjN1FVRkJRVHRCUVVGQk96dEJRVUZCYjBJN1FVRkJRVUU3UVVGQlFVRTdRVUZCUVVFN1FVRkJRVUU3UVVGQlFVRTdRVUZCUVR0QlFVRkJMRWRCUVdkQ1NDeFJRVUZvUWl4RlFVRXdRanRCUVVGRFRpeEpRVUZCUVN4blFrRkJaMElzUlVGQlJUdEJRVUZ1UWl4SFFVRXhRaXhEUVVGa08wRkJRMEVzVTBGQlQyWXNVVUZCVVN4RFFVRkRjMElzU1VGQlZDeERRVUZqU0N4TlFVRmtMRVZCUVhOQ1F5eE5RVUYwUWl4RlFVRTRRbWhDTEU5QlFUbENMRU5CUVZBN1FVRkRSQ0lzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSW1sdGNHOXlkQ0JFYVdabUlHWnliMjBnSnk0dlltRnpaU2M3WEc1cGJYQnZjblFnZTJkbGJtVnlZWFJsVDNCMGFXOXVjMzBnWm5KdmJTQW5MaTR2ZFhScGJDOXdZWEpoYlhNbk8xeHVYRzVsZUhCdmNuUWdZMjl1YzNRZ2JHbHVaVVJwWm1ZZ1BTQnVaWGNnUkdsbVppZ3BPMXh1YkdsdVpVUnBabVl1ZEc5clpXNXBlbVVnUFNCbWRXNWpkR2x2YmloMllXeDFaU2tnZTF4dUlDQnBaaWgwYUdsekxtOXdkR2x2Ym5NdWMzUnlhWEJVY21GcGJHbHVaME55S1NCN1hHNGdJQ0FnTHk4Z2NtVnRiM1psSUc5dVpTQmNYSElnWW1WbWIzSmxJRnhjYmlCMGJ5QnRZWFJqYUNCSFRsVWdaR2xtWmlkeklDMHRjM1J5YVhBdGRISmhhV3hwYm1jdFkzSWdZbVZvWVhacGIzSmNiaUFnSUNCMllXeDFaU0E5SUhaaGJIVmxMbkpsY0d4aFkyVW9MMXhjY2x4Y2JpOW5MQ0FuWEZ4dUp5azdYRzRnSUgxY2JseHVJQ0JzWlhRZ2NtVjBUR2x1WlhNZ1BTQmJYU3hjYmlBZ0lDQWdJR3hwYm1WelFXNWtUbVYzYkdsdVpYTWdQU0IyWVd4MVpTNXpjR3hwZENndktGeGNibnhjWEhKY1hHNHBMeWs3WEc1Y2JpQWdMeThnU1dkdWIzSmxJSFJvWlNCbWFXNWhiQ0JsYlhCMGVTQjBiMnRsYmlCMGFHRjBJRzlqWTNWeWN5QnBaaUIwYUdVZ2MzUnlhVzVuSUdWdVpITWdkMmwwYUNCaElHNWxkeUJzYVc1bFhHNGdJR2xtSUNnaGJHbHVaWE5CYm1ST1pYZHNhVzVsYzF0c2FXNWxjMEZ1WkU1bGQyeHBibVZ6TG14bGJtZDBhQ0F0SURGZEtTQjdYRzRnSUNBZ2JHbHVaWE5CYm1ST1pYZHNhVzVsY3k1d2IzQW9LVHRjYmlBZ2ZWeHVYRzRnSUM4dklFMWxjbWRsSUhSb1pTQmpiMjUwWlc1MElHRnVaQ0JzYVc1bElITmxjR0Z5WVhSdmNuTWdhVzUwYnlCemFXNW5iR1VnZEc5clpXNXpYRzRnSUdadmNpQW9iR1YwSUdrZ1BTQXdPeUJwSUR3Z2JHbHVaWE5CYm1ST1pYZHNhVzVsY3k1c1pXNW5kR2c3SUdrckt5a2dlMXh1SUNBZ0lHeGxkQ0JzYVc1bElEMGdiR2x1WlhOQmJtUk9aWGRzYVc1bGMxdHBYVHRjYmx4dUlDQWdJR2xtSUNocElDVWdNaUFtSmlBaGRHaHBjeTV2Y0hScGIyNXpMbTVsZDJ4cGJtVkpjMVJ2YTJWdUtTQjdYRzRnSUNBZ0lDQnlaWFJNYVc1bGMxdHlaWFJNYVc1bGN5NXNaVzVuZEdnZ0xTQXhYU0FyUFNCc2FXNWxPMXh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNCcFppQW9kR2hwY3k1dmNIUnBiMjV6TG1sbmJtOXlaVmRvYVhSbGMzQmhZMlVwSUh0Y2JpQWdJQ0FnSUNBZ2JHbHVaU0E5SUd4cGJtVXVkSEpwYlNncE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2NtVjBUR2x1WlhNdWNIVnphQ2hzYVc1bEtUdGNiaUFnSUNCOVhHNGdJSDFjYmx4dUlDQnlaWFIxY200Z2NtVjBUR2x1WlhNN1hHNTlPMXh1WEc1bGVIQnZjblFnWm5WdVkzUnBiMjRnWkdsbVpreHBibVZ6S0c5c1pGTjBjaXdnYm1WM1UzUnlMQ0JqWVd4c1ltRmpheWtnZXlCeVpYUjFjbTRnYkdsdVpVUnBabVl1WkdsbVppaHZiR1JUZEhJc0lHNWxkMU4wY2l3Z1kyRnNiR0poWTJzcE95QjlYRzVsZUhCdmNuUWdablZ1WTNScGIyNGdaR2xtWmxSeWFXMXRaV1JNYVc1bGN5aHZiR1JUZEhJc0lHNWxkMU4wY2l3Z1kyRnNiR0poWTJzcElIdGNiaUFnYkdWMElHOXdkR2x2Ym5NZ1BTQm5aVzVsY21GMFpVOXdkR2x2Ym5Nb1kyRnNiR0poWTJzc0lIdHBaMjV2Y21WWGFHbDBaWE53WVdObE9pQjBjblZsZlNrN1hHNGdJSEpsZEhWeWJpQnNhVzVsUkdsbVppNWthV1ptS0c5c1pGTjBjaXdnYm1WM1UzUnlMQ0J2Y0hScGIyNXpLVHRjYm4xY2JpSmRmUT09XG4iLCAiLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRpZmZTZW50ZW5jZXMgPSBkaWZmU2VudGVuY2VzO1xuZXhwb3J0cy5zZW50ZW5jZURpZmYgPSB2b2lkIDA7XG5cbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG52YXJcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl9iYXNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9iYXNlXCIpKVxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbjtcblxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbnZhciBzZW50ZW5jZURpZmYgPSBuZXdcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl9iYXNlXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuW1xuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuXCJkZWZhdWx0XCJcbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG5dKCk7XG5cbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbmV4cG9ydHMuc2VudGVuY2VEaWZmID0gc2VudGVuY2VEaWZmO1xuXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuc2VudGVuY2VEaWZmLnRva2VuaXplID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZS5zcGxpdCgvKFxcUy4rP1suIT9dKSg/PVxccyt8JCkvKTtcbn07XG5cbmZ1bmN0aW9uIGRpZmZTZW50ZW5jZXMob2xkU3RyLCBuZXdTdHIsIGNhbGxiYWNrKSB7XG4gIHJldHVybiBzZW50ZW5jZURpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMM055WXk5a2FXWm1MM05sYm5SbGJtTmxMbXB6SWwwc0ltNWhiV1Z6SWpwYkluTmxiblJsYm1ObFJHbG1aaUlzSWtScFptWWlMQ0owYjJ0bGJtbDZaU0lzSW5aaGJIVmxJaXdpYzNCc2FYUWlMQ0prYVdabVUyVnVkR1Z1WTJWeklpd2liMnhrVTNSeUlpd2libVYzVTNSeUlpd2lZMkZzYkdKaFkyc2lMQ0prYVdabUlsMHNJbTFoY0hCcGJtZHpJam9pT3pzN096czdPenM3TzBGQlFVRTdRVUZCUVR0QlFVRkJPMEZCUVVFN1FVRkJRVHM3T3pzN1FVRkhUeXhKUVVGTlFTeFpRVUZaTEVkQlFVYzdRVUZCU1VNN1FVRkJRVUU3UVVGQlFVRTdRVUZCUVVFN1FVRkJRVUU3UVVGQlFVRTdRVUZCUVVFN1FVRkJRVUVzUTBGQlNpeEZRVUZ5UWpzN096czdPMEZCUTFCRUxGbEJRVmtzUTBGQlEwVXNVVUZCWWl4SFFVRjNRaXhWUVVGVFF5eExRVUZVTEVWQlFXZENPMEZCUTNSRExGTkJRVTlCTEV0QlFVc3NRMEZCUTBNc1MwRkJUaXhEUVVGWkxIVkNRVUZhTEVOQlFWQTdRVUZEUkN4RFFVWkVPenRCUVVsUExGTkJRVk5ETEdGQlFWUXNRMEZCZFVKRExFMUJRWFpDTEVWQlFTdENReXhOUVVFdlFpeEZRVUYxUTBNc1VVRkJka01zUlVGQmFVUTdRVUZCUlN4VFFVRlBVaXhaUVVGWkxFTkJRVU5UTEVsQlFXSXNRMEZCYTBKSUxFMUJRV3hDTEVWQlFUQkNReXhOUVVFeFFpeEZRVUZyUTBNc1VVRkJiRU1zUTBGQlVEdEJRVUZ4UkNJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYkltbHRjRzl5ZENCRWFXWm1JR1p5YjIwZ0p5NHZZbUZ6WlNjN1hHNWNibHh1Wlhod2IzSjBJR052Ym5OMElITmxiblJsYm1ObFJHbG1aaUE5SUc1bGR5QkVhV1ptS0NrN1hHNXpaVzUwWlc1alpVUnBabVl1ZEc5clpXNXBlbVVnUFNCbWRXNWpkR2x2YmloMllXeDFaU2tnZTF4dUlDQnlaWFIxY200Z2RtRnNkV1V1YzNCc2FYUW9MeWhjWEZNdUt6OWJMaUUvWFNrb1B6MWNYSE1yZkNRcEx5azdYRzU5TzF4dVhHNWxlSEJ2Y25RZ1puVnVZM1JwYjI0Z1pHbG1abE5sYm5SbGJtTmxjeWh2YkdSVGRISXNJRzVsZDFOMGNpd2dZMkZzYkdKaFkyc3BJSHNnY21WMGRYSnVJSE5sYm5SbGJtTmxSR2xtWmk1a2FXWm1LRzlzWkZOMGNpd2dibVYzVTNSeUxDQmpZV3hzWW1GamF5azdJSDFjYmlKZGZRPT1cbiIsICIvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5cInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGlmZkNzcyA9IGRpZmZDc3M7XG5leHBvcnRzLmNzc0RpZmYgPSB2b2lkIDA7XG5cbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG52YXJcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl9iYXNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9iYXNlXCIpKVxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbjtcblxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbnZhciBjc3NEaWZmID0gbmV3XG4vKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5fYmFzZVxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbltcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cblwiZGVmYXVsdFwiXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuXSgpO1xuXG4vKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5leHBvcnRzLmNzc0RpZmYgPSBjc3NEaWZmO1xuXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuY3NzRGlmZi50b2tlbml6ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUuc3BsaXQoLyhbe306OyxdfFxccyspLyk7XG59O1xuXG5mdW5jdGlvbiBkaWZmQ3NzKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjaykge1xuICByZXR1cm4gY3NzRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjayk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTlrYVdabUwyTnpjeTVxY3lKZExDSnVZVzFsY3lJNld5SmpjM05FYVdabUlpd2lSR2xtWmlJc0luUnZhMlZ1YVhwbElpd2lkbUZzZFdVaUxDSnpjR3hwZENJc0ltUnBabVpEYzNNaUxDSnZiR1JUZEhJaUxDSnVaWGRUZEhJaUxDSmpZV3hzWW1GamF5SXNJbVJwWm1ZaVhTd2liV0Z3Y0dsdVozTWlPaUk3T3pzN096czdPenM3UVVGQlFUdEJRVUZCTzBGQlFVRTdRVUZCUVR0QlFVRkJPenM3T3p0QlFVVlBMRWxCUVUxQkxFOUJRVThzUjBGQlJ6dEJRVUZKUXp0QlFVRkJRVHRCUVVGQlFUdEJRVUZCUVR0QlFVRkJRVHRCUVVGQlFUdEJRVUZCUVR0QlFVRkJRU3hEUVVGS0xFVkJRV2hDT3pzN096czdRVUZEVUVRc1QwRkJUeXhEUVVGRFJTeFJRVUZTTEVkQlFXMUNMRlZCUVZORExFdEJRVlFzUlVGQlowSTdRVUZEYWtNc1UwRkJUMEVzUzBGQlN5eERRVUZEUXl4TFFVRk9MRU5CUVZrc1pVRkJXaXhEUVVGUU8wRkJRMFFzUTBGR1JEczdRVUZKVHl4VFFVRlRReXhQUVVGVUxFTkJRV2xDUXl4TlFVRnFRaXhGUVVGNVFrTXNUVUZCZWtJc1JVRkJhVU5ETEZGQlFXcERMRVZCUVRKRE8wRkJRVVVzVTBGQlQxSXNUMEZCVHl4RFFVRkRVeXhKUVVGU0xFTkJRV0ZJTEUxQlFXSXNSVUZCY1VKRExFMUJRWEpDTEVWQlFUWkNReXhSUVVFM1FpeERRVUZRTzBGQlFXZEVJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpYVcxd2IzSjBJRVJwWm1ZZ1puSnZiU0FuTGk5aVlYTmxKenRjYmx4dVpYaHdiM0owSUdOdmJuTjBJR056YzBScFptWWdQU0J1WlhjZ1JHbG1aaWdwTzF4dVkzTnpSR2xtWmk1MGIydGxibWw2WlNBOUlHWjFibU4wYVc5dUtIWmhiSFZsS1NCN1hHNGdJSEpsZEhWeWJpQjJZV3gxWlM1emNHeHBkQ2d2S0Z0N2ZUbzdMRjE4WEZ4ekt5a3ZLVHRjYm4wN1hHNWNibVY0Y0c5eWRDQm1kVzVqZEdsdmJpQmthV1ptUTNOektHOXNaRk4wY2l3Z2JtVjNVM1J5TENCallXeHNZbUZqYXlrZ2V5QnlaWFIxY200Z1kzTnpSR2xtWmk1a2FXWm1LRzlzWkZOMGNpd2dibVYzVTNSeUxDQmpZV3hzWW1GamF5azdJSDFjYmlKZGZRPT1cbiIsICIvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5cInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGlmZkpzb24gPSBkaWZmSnNvbjtcbmV4cG9ydHMuY2Fub25pY2FsaXplID0gY2Fub25pY2FsaXplO1xuZXhwb3J0cy5qc29uRGlmZiA9IHZvaWQgMDtcblxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbnZhclxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuX2Jhc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2Jhc2VcIikpXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuO1xuXG52YXJcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl9saW5lID0gcmVxdWlyZShcIi4vbGluZVwiKVxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbjtcblxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfVxuXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xudmFyIG9iamVjdFByb3RvdHlwZVRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBqc29uRGlmZiA9IG5ld1xuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuX2Jhc2Vcbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG5bXG4vKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5cImRlZmF1bHRcIlxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbl0oKTsgLy8gRGlzY3JpbWluYXRlIGJldHdlZW4gdHdvIGxpbmVzIG9mIHByZXR0eS1wcmludGVkLCBzZXJpYWxpemVkIEpTT04gd2hlcmUgb25lIG9mIHRoZW0gaGFzIGFcbi8vIGRhbmdsaW5nIGNvbW1hIGFuZCB0aGUgb3RoZXIgZG9lc24ndC4gVHVybnMgb3V0IGluY2x1ZGluZyB0aGUgZGFuZ2xpbmcgY29tbWEgeWllbGRzIHRoZSBuaWNlc3Qgb3V0cHV0OlxuXG4vKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5leHBvcnRzLmpzb25EaWZmID0ganNvbkRpZmY7XG5cbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG5qc29uRGlmZi51c2VMb25nZXN0VG9rZW4gPSB0cnVlO1xuanNvbkRpZmYudG9rZW5pemUgPVxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuX2xpbmVcbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4uXG4vKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5saW5lRGlmZlxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbi50b2tlbml6ZTtcblxuanNvbkRpZmYuY2FzdElucHV0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgdmFyIF90aGlzJG9wdGlvbnMgPVxuICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICB0aGlzLm9wdGlvbnMsXG4gICAgICB1bmRlZmluZWRSZXBsYWNlbWVudCA9IF90aGlzJG9wdGlvbnMudW5kZWZpbmVkUmVwbGFjZW1lbnQsXG4gICAgICBfdGhpcyRvcHRpb25zJHN0cmluZ2kgPSBfdGhpcyRvcHRpb25zLnN0cmluZ2lmeVJlcGxhY2VyLFxuICAgICAgc3RyaW5naWZ5UmVwbGFjZXIgPSBfdGhpcyRvcHRpb25zJHN0cmluZ2kgPT09IHZvaWQgMCA/IGZ1bmN0aW9uIChrLCB2KVxuICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gIHtcbiAgICByZXR1cm4gKFxuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgICAgIHR5cGVvZiB2ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZFJlcGxhY2VtZW50IDogdlxuICAgICk7XG4gIH0gOiBfdGhpcyRvcHRpb25zJHN0cmluZ2k7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiBKU09OLnN0cmluZ2lmeShjYW5vbmljYWxpemUodmFsdWUsIG51bGwsIG51bGwsIHN0cmluZ2lmeVJlcGxhY2VyKSwgc3RyaW5naWZ5UmVwbGFjZXIsICcgICcpO1xufTtcblxuanNvbkRpZmYuZXF1YWxzID0gZnVuY3Rpb24gKGxlZnQsIHJpZ2h0KSB7XG4gIHJldHVybiAoXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgIF9iYXNlXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgICBbXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgIFwiZGVmYXVsdFwiXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgICBdLnByb3RvdHlwZS5lcXVhbHMuY2FsbChqc29uRGlmZiwgbGVmdC5yZXBsYWNlKC8sKFtcXHJcXG5dKS9nLCAnJDEnKSwgcmlnaHQucmVwbGFjZSgvLChbXFxyXFxuXSkvZywgJyQxJykpXG4gICk7XG59O1xuXG5mdW5jdGlvbiBkaWZmSnNvbihvbGRPYmosIG5ld09iaiwgb3B0aW9ucykge1xuICByZXR1cm4ganNvbkRpZmYuZGlmZihvbGRPYmosIG5ld09iaiwgb3B0aW9ucyk7XG59IC8vIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgcHJlc2VuY2Ugb2YgY2lyY3VsYXIgcmVmZXJlbmNlcyBieSBiYWlsaW5nIG91dCB3aGVuIGVuY291bnRlcmluZyBhblxuLy8gb2JqZWN0IHRoYXQgaXMgYWxyZWFkeSBvbiB0aGUgXCJzdGFja1wiIG9mIGl0ZW1zIGJlaW5nIHByb2Nlc3NlZC4gQWNjZXB0cyBhbiBvcHRpb25hbCByZXBsYWNlclxuXG5cbmZ1bmN0aW9uIGNhbm9uaWNhbGl6ZShvYmosIHN0YWNrLCByZXBsYWNlbWVudFN0YWNrLCByZXBsYWNlciwga2V5KSB7XG4gIHN0YWNrID0gc3RhY2sgfHwgW107XG4gIHJlcGxhY2VtZW50U3RhY2sgPSByZXBsYWNlbWVudFN0YWNrIHx8IFtdO1xuXG4gIGlmIChyZXBsYWNlcikge1xuICAgIG9iaiA9IHJlcGxhY2VyKGtleSwgb2JqKTtcbiAgfVxuXG4gIHZhciBpO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBzdGFjay5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGlmIChzdGFja1tpXSA9PT0gb2JqKSB7XG4gICAgICByZXR1cm4gcmVwbGFjZW1lbnRTdGFja1tpXTtcbiAgICB9XG4gIH1cblxuICB2YXIgY2Fub25pY2FsaXplZE9iajtcblxuICBpZiAoJ1tvYmplY3QgQXJyYXldJyA9PT0gb2JqZWN0UHJvdG90eXBlVG9TdHJpbmcuY2FsbChvYmopKSB7XG4gICAgc3RhY2sucHVzaChvYmopO1xuICAgIGNhbm9uaWNhbGl6ZWRPYmogPSBuZXcgQXJyYXkob2JqLmxlbmd0aCk7XG4gICAgcmVwbGFjZW1lbnRTdGFjay5wdXNoKGNhbm9uaWNhbGl6ZWRPYmopO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgY2Fub25pY2FsaXplZE9ialtpXSA9IGNhbm9uaWNhbGl6ZShvYmpbaV0sIHN0YWNrLCByZXBsYWNlbWVudFN0YWNrLCByZXBsYWNlciwga2V5KTtcbiAgICB9XG5cbiAgICBzdGFjay5wb3AoKTtcbiAgICByZXBsYWNlbWVudFN0YWNrLnBvcCgpO1xuICAgIHJldHVybiBjYW5vbmljYWxpemVkT2JqO1xuICB9XG5cbiAgaWYgKG9iaiAmJiBvYmoudG9KU09OKSB7XG4gICAgb2JqID0gb2JqLnRvSlNPTigpO1xuICB9XG5cbiAgaWYgKFxuICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gIF90eXBlb2YoXG4gIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gIG9iaikgPT09ICdvYmplY3QnICYmIG9iaiAhPT0gbnVsbCkge1xuICAgIHN0YWNrLnB1c2gob2JqKTtcbiAgICBjYW5vbmljYWxpemVkT2JqID0ge307XG4gICAgcmVwbGFjZW1lbnRTdGFjay5wdXNoKGNhbm9uaWNhbGl6ZWRPYmopO1xuXG4gICAgdmFyIHNvcnRlZEtleXMgPSBbXSxcbiAgICAgICAgX2tleTtcblxuICAgIGZvciAoX2tleSBpbiBvYmopIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KF9rZXkpKSB7XG4gICAgICAgIHNvcnRlZEtleXMucHVzaChfa2V5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzb3J0ZWRLZXlzLnNvcnQoKTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBzb3J0ZWRLZXlzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBfa2V5ID0gc29ydGVkS2V5c1tpXTtcbiAgICAgIGNhbm9uaWNhbGl6ZWRPYmpbX2tleV0gPSBjYW5vbmljYWxpemUob2JqW19rZXldLCBzdGFjaywgcmVwbGFjZW1lbnRTdGFjaywgcmVwbGFjZXIsIF9rZXkpO1xuICAgIH1cblxuICAgIHN0YWNrLnBvcCgpO1xuICAgIHJlcGxhY2VtZW50U3RhY2sucG9wKCk7XG4gIH0gZWxzZSB7XG4gICAgY2Fub25pY2FsaXplZE9iaiA9IG9iajtcbiAgfVxuXG4gIHJldHVybiBjYW5vbmljYWxpemVkT2JqO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMM055WXk5a2FXWm1MMnB6YjI0dWFuTWlYU3dpYm1GdFpYTWlPbHNpYjJKcVpXTjBVSEp2ZEc5MGVYQmxWRzlUZEhKcGJtY2lMQ0pQWW1wbFkzUWlMQ0p3Y205MGIzUjVjR1VpTENKMGIxTjBjbWx1WnlJc0ltcHpiMjVFYVdabUlpd2lSR2xtWmlJc0luVnpaVXh2Ym1kbGMzUlViMnRsYmlJc0luUnZhMlZ1YVhwbElpd2liR2x1WlVScFptWWlMQ0pqWVhOMFNXNXdkWFFpTENKMllXeDFaU0lzSW05d2RHbHZibk1pTENKMWJtUmxabWx1WldSU1pYQnNZV05sYldWdWRDSXNJbk4wY21sdVoybG1lVkpsY0d4aFkyVnlJaXdpYXlJc0luWWlMQ0pLVTA5T0lpd2ljM1J5YVc1bmFXWjVJaXdpWTJGdWIyNXBZMkZzYVhwbElpd2laWEYxWVd4eklpd2liR1ZtZENJc0luSnBaMmgwSWl3aVkyRnNiQ0lzSW5KbGNHeGhZMlVpTENKa2FXWm1Tbk52YmlJc0ltOXNaRTlpYWlJc0ltNWxkMDlpYWlJc0ltUnBabVlpTENKdlltb2lMQ0p6ZEdGamF5SXNJbkpsY0d4aFkyVnRaVzUwVTNSaFkyc2lMQ0p5WlhCc1lXTmxjaUlzSW10bGVTSXNJbWtpTENKc1pXNW5kR2dpTENKallXNXZibWxqWVd4cGVtVmtUMkpxSWl3aWNIVnphQ0lzSWtGeWNtRjVJaXdpY0c5d0lpd2lkRzlLVTA5T0lpd2ljMjl5ZEdWa1MyVjVjeUlzSW1oaGMwOTNibEJ5YjNCbGNuUjVJaXdpYzI5eWRDSmRMQ0p0WVhCd2FXNW5jeUk2SWpzN096czdPenM3T3pzN1FVRkJRVHRCUVVGQk8wRkJRVUU3UVVGQlFUdEJRVUZCT3p0QlFVTkJPMEZCUVVFN1FVRkJRVHRCUVVGQk8wRkJRVUU3T3pzN096czdRVUZGUVN4SlFVRk5RU3gxUWtGQmRVSXNSMEZCUjBNc1RVRkJUU3hEUVVGRFF5eFRRVUZRTEVOQlFXbENReXhSUVVGcVJEdEJRVWRQTEVsQlFVMURMRkZCUVZFc1IwRkJSenRCUVVGSlF6dEJRVUZCUVR0QlFVRkJRVHRCUVVGQlFUdEJRVUZCUVR0QlFVRkJRVHRCUVVGQlFUdEJRVUZCUVN4RFFVRktMRVZCUVdwQ0xFTXNRMEZEVUR0QlFVTkJPenM3T3pzN1FVRkRRVVFzVVVGQlVTeERRVUZEUlN4bFFVRlVMRWRCUVRKQ0xFbEJRVE5DTzBGQlJVRkdMRkZCUVZFc1EwRkJRMGNzVVVGQlZEdEJRVUZ2UWtNN1FVRkJRVUU3UVVGQlFVRTdRVUZCUVVFN1FVRkJRVUU3UVVGQlFVRTdRVUZCUVR0QlFVRkJMRU5CUVZORUxGRkJRVGRDT3p0QlFVTkJTQ3hSUVVGUkxFTkJRVU5MTEZOQlFWUXNSMEZCY1VJc1ZVRkJVME1zUzBGQlZDeEZRVUZuUWp0QlFVRkJPMEZCUVVFN1FVRkJRVHRCUVVNclJTeFBRVUZMUXl4UFFVUndSanRCUVVGQkxFMUJRelZDUXl4dlFrRkVORUlzYVVKQlF6VkNRU3h2UWtGRU5FSTdRVUZCUVN3MFEwRkRUa01zYVVKQlJFMDdRVUZCUVN4TlFVTk9RU3hwUWtGRVRTeHpRMEZEWXl4VlFVRkRReXhEUVVGRUxFVkJRVWxETEVOQlFVbzdRVUZCUVR0QlFVRkJPMEZCUVVFN1FVRkJRVHRCUVVGVkxHRkJRVTlCTEVOQlFWQXNTMEZCWVN4WFFVRmlMRWRCUVRKQ1NDeHZRa0ZCTTBJc1IwRkJhMFJITzBGQlFUVkVPMEZCUVVFc1IwRkVaRHRCUVVkdVF5eFRRVUZQTEU5QlFVOU1MRXRCUVZBc1MwRkJhVUlzVVVGQmFrSXNSMEZCTkVKQkxFdEJRVFZDTEVkQlFXOURUU3hKUVVGSkxFTkJRVU5ETEZOQlFVd3NRMEZCWlVNc1dVRkJXU3hEUVVGRFVpeExRVUZFTEVWQlFWRXNTVUZCVWl4RlFVRmpMRWxCUVdRc1JVRkJiMEpITEdsQ1FVRndRaXhEUVVFelFpeEZRVUZ0UlVFc2FVSkJRVzVGTEVWQlFYTkdMRWxCUVhSR0xFTkJRVE5ETzBGQlEwUXNRMEZLUkRzN1FVRkxRVlFzVVVGQlVTeERRVUZEWlN4TlFVRlVMRWRCUVd0Q0xGVkJRVk5ETEVsQlFWUXNSVUZCWlVNc1MwRkJaaXhGUVVGelFqdEJRVU4wUXl4VFFVRlBhRUk3UVVGQlFVRTdRVUZCUVVFN1FVRkJRVUU3UVVGQlFVRTdRVUZCUVVFN1FVRkJRVUU3UVVGQlFVRTdRVUZCUVVFc1RVRkJTMGdzVTBGQlRDeERRVUZsYVVJc1RVRkJaaXhEUVVGelFrY3NTVUZCZEVJc1EwRkJNa0pzUWl4UlFVRXpRaXhGUVVGeFEyZENMRWxCUVVrc1EwRkJRMGNzVDBGQlRDeERRVUZoTEZsQlFXSXNSVUZCTWtJc1NVRkJNMElzUTBGQmNrTXNSVUZCZFVWR0xFdEJRVXNzUTBGQlEwVXNUMEZCVGl4RFFVRmpMRmxCUVdRc1JVRkJORUlzU1VGQk5VSXNRMEZCZGtVN1FVRkJVRHRCUVVORUxFTkJSa1E3TzBGQlNVOHNVMEZCVTBNc1VVRkJWQ3hEUVVGclFrTXNUVUZCYkVJc1JVRkJNRUpETEUxQlFURkNMRVZCUVd0RFppeFBRVUZzUXl4RlFVRXlRenRCUVVGRkxGTkJRVTlRTEZGQlFWRXNRMEZCUTNWQ0xFbEJRVlFzUTBGQlkwWXNUVUZCWkN4RlFVRnpRa01zVFVGQmRFSXNSVUZCT0VKbUxFOUJRVGxDTEVOQlFWQTdRVUZCWjBRc1F5eERRVVZ3Unp0QlFVTkJPenM3UVVGRFR5eFRRVUZUVHl4WlFVRlVMRU5CUVhOQ1ZTeEhRVUYwUWl4RlFVRXlRa01zUzBGQk0wSXNSVUZCYTBORExHZENRVUZzUXl4RlFVRnZSRU1zVVVGQmNFUXNSVUZCT0VSRExFZEJRVGxFTEVWQlFXMUZPMEZCUTNoRlNDeEZRVUZCUVN4TFFVRkxMRWRCUVVkQkxFdEJRVXNzU1VGQlNTeEZRVUZxUWp0QlFVTkJReXhGUVVGQlFTeG5Ra0ZCWjBJc1IwRkJSMEVzWjBKQlFXZENMRWxCUVVrc1JVRkJka003TzBGQlJVRXNUVUZCU1VNc1VVRkJTaXhGUVVGak8wRkJRMXBJTEVsQlFVRkJMRWRCUVVjc1IwRkJSMGNzVVVGQlVTeERRVUZEUXl4SFFVRkVMRVZCUVUxS0xFZEJRVTRzUTBGQlpEdEJRVU5FT3p0QlFVVkVMRTFCUVVsTExFTkJRVW83TzBGQlJVRXNUMEZCUzBFc1EwRkJReXhIUVVGSExFTkJRVlFzUlVGQldVRXNRMEZCUXl4SFFVRkhTaXhMUVVGTExFTkJRVU5MTEUxQlFYUkNMRVZCUVRoQ1JDeERRVUZETEVsQlFVa3NRMEZCYmtNc1JVRkJjME03UVVGRGNFTXNVVUZCU1Vvc1MwRkJTeXhEUVVGRFNTeERRVUZFTEVOQlFVd3NTMEZCWVV3c1IwRkJha0lzUlVGQmMwSTdRVUZEY0VJc1lVRkJUMFVzWjBKQlFXZENMRU5CUVVOSExFTkJRVVFzUTBGQmRrSTdRVUZEUkR0QlFVTkdPenRCUVVWRUxFMUJRVWxGTEdkQ1FVRktPenRCUVVWQkxFMUJRVWtzY1VKQlFYRkNia01zZFVKQlFYVkNMRU5CUVVOelFpeEpRVUY0UWl4RFFVRTJRazBzUjBGQk4wSXNRMEZCZWtJc1JVRkJORVE3UVVGRE1VUkRMRWxCUVVGQkxFdEJRVXNzUTBGQlEwOHNTVUZCVGl4RFFVRlhVaXhIUVVGWU8wRkJRMEZQTEVsQlFVRkJMR2RDUVVGblFpeEhRVUZITEVsQlFVbEZMRXRCUVVvc1EwRkJWVlFzUjBGQlJ5eERRVUZEVFN4TlFVRmtMRU5CUVc1Q08wRkJRMEZLTEVsQlFVRkJMR2RDUVVGblFpeERRVUZEVFN4SlFVRnFRaXhEUVVGelFrUXNaMEpCUVhSQ096dEJRVU5CTEZOQlFVdEdMRU5CUVVNc1IwRkJSeXhEUVVGVUxFVkJRVmxCTEVOQlFVTXNSMEZCUjB3c1IwRkJSeXhEUVVGRFRTeE5RVUZ3UWl4RlFVRTBRa1FzUTBGQlF5eEpRVUZKTEVOQlFXcERMRVZCUVc5RE8wRkJRMnhEUlN4TlFVRkJRU3huUWtGQlowSXNRMEZCUTBZc1EwRkJSQ3hEUVVGb1FpeEhRVUZ6UW1Zc1dVRkJXU3hEUVVGRFZTeEhRVUZITEVOQlFVTkxMRU5CUVVRc1EwRkJTaXhGUVVGVFNpeExRVUZVTEVWQlFXZENReXhuUWtGQmFFSXNSVUZCYTBORExGRkJRV3hETEVWQlFUUkRReXhIUVVFMVF5eERRVUZzUXp0QlFVTkVPenRCUVVORVNDeEpRVUZCUVN4TFFVRkxMRU5CUVVOVExFZEJRVTQ3UVVGRFFWSXNTVUZCUVVFc1owSkJRV2RDTEVOQlFVTlJMRWRCUVdwQ08wRkJRMEVzVjBGQlQwZ3NaMEpCUVZBN1FVRkRSRHM3UVVGRlJDeE5RVUZKVUN4SFFVRkhMRWxCUVVsQkxFZEJRVWNzUTBGQlExY3NUVUZCWml4RlFVRjFRanRCUVVOeVFsZ3NTVUZCUVVFc1IwRkJSeXhIUVVGSFFTeEhRVUZITEVOQlFVTlhMRTFCUVVvc1JVRkJUanRCUVVORU96dEJRVVZFTzBGQlFVazdRVUZCUVR0QlFVRkJPMEZCUVU5WUxFVkJRVUZCTEVkQlFWQXNUVUZCWlN4UlFVRm1MRWxCUVRKQ1FTeEhRVUZITEV0QlFVc3NTVUZCZGtNc1JVRkJOa003UVVGRE0wTkRMRWxCUVVGQkxFdEJRVXNzUTBGQlEwOHNTVUZCVGl4RFFVRlhVaXhIUVVGWU8wRkJRMEZQTEVsQlFVRkJMR2RDUVVGblFpeEhRVUZITEVWQlFXNUNPMEZCUTBGTUxFbEJRVUZCTEdkQ1FVRm5RaXhEUVVGRFRTeEpRVUZxUWl4RFFVRnpRa1FzWjBKQlFYUkNPenRCUVVOQkxGRkJRVWxMTEZWQlFWVXNSMEZCUnl4RlFVRnFRanRCUVVGQkxGRkJRMGxTTEVsQlJFbzdPMEZCUlVFc1UwRkJTMEVzU1VGQlRDeEpRVUZaU2l4SFFVRmFMRVZCUVdsQ08wRkJRMlk3UVVGRFFTeFZRVUZKUVN4SFFVRkhMRU5CUVVOaExHTkJRVW9zUTBGQmJVSlVMRWxCUVc1Q0xFTkJRVW9zUlVGQk5rSTdRVUZETTBKUkxGRkJRVUZCTEZWQlFWVXNRMEZCUTBvc1NVRkJXQ3hEUVVGblFrb3NTVUZCYUVJN1FVRkRSRHRCUVVOR096dEJRVU5FVVN4SlFVRkJRU3hWUVVGVkxFTkJRVU5GTEVsQlFWZzdPMEZCUTBFc1UwRkJTMVFzUTBGQlF5eEhRVUZITEVOQlFWUXNSVUZCV1VFc1EwRkJReXhIUVVGSFR5eFZRVUZWTEVOQlFVTk9MRTFCUVROQ0xFVkJRVzFEUkN4RFFVRkRMRWxCUVVrc1EwRkJlRU1zUlVGQk1rTTdRVUZEZWtORUxFMUJRVUZCTEVsQlFVY3NSMEZCUjFFc1ZVRkJWU3hEUVVGRFVDeERRVUZFTEVOQlFXaENPMEZCUTBGRkxFMUJRVUZCTEdkQ1FVRm5RaXhEUVVGRFNDeEpRVUZFTEVOQlFXaENMRWRCUVhkQ1pDeFpRVUZaTEVOQlFVTlZMRWRCUVVjc1EwRkJRMGtzU1VGQlJDeERRVUZLTEVWQlFWZElMRXRCUVZnc1JVRkJhMEpETEdkQ1FVRnNRaXhGUVVGdlEwTXNVVUZCY0VNc1JVRkJPRU5ETEVsQlFUbERMRU5CUVhCRE8wRkJRMFE3TzBGQlEwUklMRWxCUVVGQkxFdEJRVXNzUTBGQlExTXNSMEZCVGp0QlFVTkJVaXhKUVVGQlFTeG5Ra0ZCWjBJc1EwRkJRMUVzUjBGQmFrSTdRVUZEUkN4SFFXNUNSQ3hOUVcxQ1R6dEJRVU5NU0N4SlFVRkJRU3huUWtGQlowSXNSMEZCUjFBc1IwRkJia0k3UVVGRFJEczdRVUZEUkN4VFFVRlBUeXhuUWtGQlVEdEJRVU5FSWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaWFXMXdiM0owSUVScFptWWdabkp2YlNBbkxpOWlZWE5sSnp0Y2JtbHRjRzl5ZENCN2JHbHVaVVJwWm1aOUlHWnliMjBnSnk0dmJHbHVaU2M3WEc1Y2JtTnZibk4wSUc5aWFtVmpkRkJ5YjNSdmRIbHdaVlJ2VTNSeWFXNW5JRDBnVDJKcVpXTjBMbkJ5YjNSdmRIbHdaUzUwYjFOMGNtbHVaenRjYmx4dVhHNWxlSEJ2Y25RZ1kyOXVjM1FnYW5OdmJrUnBabVlnUFNCdVpYY2dSR2xtWmlncE8xeHVMeThnUkdselkzSnBiV2x1WVhSbElHSmxkSGRsWlc0Z2RIZHZJR3hwYm1WeklHOW1JSEJ5WlhSMGVTMXdjbWx1ZEdWa0xDQnpaWEpwWVd4cGVtVmtJRXBUVDA0Z2QyaGxjbVVnYjI1bElHOW1JSFJvWlcwZ2FHRnpJR0ZjYmk4dklHUmhibWRzYVc1bklHTnZiVzFoSUdGdVpDQjBhR1VnYjNSb1pYSWdaRzlsYzI0bmRDNGdWSFZ5Ym5NZ2IzVjBJR2x1WTJ4MVpHbHVaeUIwYUdVZ1pHRnVaMnhwYm1jZ1kyOXRiV0VnZVdsbGJHUnpJSFJvWlNCdWFXTmxjM1FnYjNWMGNIVjBPbHh1YW5OdmJrUnBabVl1ZFhObFRHOXVaMlZ6ZEZSdmEyVnVJRDBnZEhKMVpUdGNibHh1YW5OdmJrUnBabVl1ZEc5clpXNXBlbVVnUFNCc2FXNWxSR2xtWmk1MGIydGxibWw2WlR0Y2JtcHpiMjVFYVdabUxtTmhjM1JKYm5CMWRDQTlJR1oxYm1OMGFXOXVLSFpoYkhWbEtTQjdYRzRnSUdOdmJuTjBJSHQxYm1SbFptbHVaV1JTWlhCc1lXTmxiV1Z1ZEN3Z2MzUnlhVzVuYVdaNVVtVndiR0ZqWlhJZ1BTQW9heXdnZGlrZ1BUNGdkSGx3Wlc5bUlIWWdQVDA5SUNkMWJtUmxabWx1WldRbklEOGdkVzVrWldacGJtVmtVbVZ3YkdGalpXMWxiblFnT2lCMmZTQTlJSFJvYVhNdWIzQjBhVzl1Y3p0Y2JseHVJQ0J5WlhSMWNtNGdkSGx3Wlc5bUlIWmhiSFZsSUQwOVBTQW5jM1J5YVc1bkp5QS9JSFpoYkhWbElEb2dTbE5QVGk1emRISnBibWRwWm5rb1kyRnViMjVwWTJGc2FYcGxLSFpoYkhWbExDQnVkV3hzTENCdWRXeHNMQ0J6ZEhKcGJtZHBabmxTWlhCc1lXTmxjaWtzSUhOMGNtbHVaMmxtZVZKbGNHeGhZMlZ5TENBbklDQW5LVHRjYm4wN1hHNXFjMjl1UkdsbVppNWxjWFZoYkhNZ1BTQm1kVzVqZEdsdmJpaHNaV1owTENCeWFXZG9kQ2tnZTF4dUlDQnlaWFIxY200Z1JHbG1aaTV3Y205MGIzUjVjR1V1WlhGMVlXeHpMbU5oYkd3b2FuTnZia1JwWm1Zc0lHeGxablF1Y21Wd2JHRmpaU2d2TENoYlhGeHlYRnh1WFNrdlp5d2dKeVF4Snlrc0lISnBaMmgwTG5KbGNHeGhZMlVvTHl3b1cxeGNjbHhjYmwwcEwyY3NJQ2NrTVNjcEtUdGNibjA3WEc1Y2JtVjRjRzl5ZENCbWRXNWpkR2x2YmlCa2FXWm1Tbk52YmlodmJHUlBZbW9zSUc1bGQwOWlhaXdnYjNCMGFXOXVjeWtnZXlCeVpYUjFjbTRnYW5OdmJrUnBabVl1WkdsbVppaHZiR1JQWW1vc0lHNWxkMDlpYWl3Z2IzQjBhVzl1Y3lrN0lIMWNibHh1THk4Z1ZHaHBjeUJtZFc1amRHbHZiaUJvWVc1a2JHVnpJSFJvWlNCd2NtVnpaVzVqWlNCdlppQmphWEpqZFd4aGNpQnlaV1psY21WdVkyVnpJR0o1SUdKaGFXeHBibWNnYjNWMElIZG9aVzRnWlc1amIzVnVkR1Z5YVc1bklHRnVYRzR2THlCdlltcGxZM1FnZEdoaGRDQnBjeUJoYkhKbFlXUjVJRzl1SUhSb1pTQmNJbk4wWVdOclhDSWdiMllnYVhSbGJYTWdZbVZwYm1jZ2NISnZZMlZ6YzJWa0xpQkJZMk5sY0hSeklHRnVJRzl3ZEdsdmJtRnNJSEpsY0d4aFkyVnlYRzVsZUhCdmNuUWdablZ1WTNScGIyNGdZMkZ1YjI1cFkyRnNhWHBsS0c5aWFpd2djM1JoWTJzc0lISmxjR3hoWTJWdFpXNTBVM1JoWTJzc0lISmxjR3hoWTJWeUxDQnJaWGtwSUh0Y2JpQWdjM1JoWTJzZ1BTQnpkR0ZqYXlCOGZDQmJYVHRjYmlBZ2NtVndiR0ZqWlcxbGJuUlRkR0ZqYXlBOUlISmxjR3hoWTJWdFpXNTBVM1JoWTJzZ2ZId2dXMTA3WEc1Y2JpQWdhV1lnS0hKbGNHeGhZMlZ5S1NCN1hHNGdJQ0FnYjJKcUlEMGdjbVZ3YkdGalpYSW9hMlY1TENCdlltb3BPMXh1SUNCOVhHNWNiaUFnYkdWMElHazdYRzVjYmlBZ1ptOXlJQ2hwSUQwZ01Ec2dhU0E4SUhOMFlXTnJMbXhsYm1kMGFEc2dhU0FyUFNBeEtTQjdYRzRnSUNBZ2FXWWdLSE4wWVdOclcybGRJRDA5UFNCdlltb3BJSHRjYmlBZ0lDQWdJSEpsZEhWeWJpQnlaWEJzWVdObGJXVnVkRk4wWVdOclcybGRPMXh1SUNBZ0lIMWNiaUFnZlZ4dVhHNGdJR3hsZENCallXNXZibWxqWVd4cGVtVmtUMkpxTzF4dVhHNGdJR2xtSUNnblcyOWlhbVZqZENCQmNuSmhlVjBuSUQwOVBTQnZZbXBsWTNSUWNtOTBiM1I1Y0dWVWIxTjBjbWx1Wnk1allXeHNLRzlpYWlrcElIdGNiaUFnSUNCemRHRmpheTV3ZFhOb0tHOWlhaWs3WEc0Z0lDQWdZMkZ1YjI1cFkyRnNhWHBsWkU5aWFpQTlJRzVsZHlCQmNuSmhlU2h2WW1vdWJHVnVaM1JvS1R0Y2JpQWdJQ0J5WlhCc1lXTmxiV1Z1ZEZOMFlXTnJMbkIxYzJnb1kyRnViMjVwWTJGc2FYcGxaRTlpYWlrN1hHNGdJQ0FnWm05eUlDaHBJRDBnTURzZ2FTQThJRzlpYWk1c1pXNW5kR2c3SUdrZ0t6MGdNU2tnZTF4dUlDQWdJQ0FnWTJGdWIyNXBZMkZzYVhwbFpFOWlhbHRwWFNBOUlHTmhibTl1YVdOaGJHbDZaU2h2WW1wYmFWMHNJSE4wWVdOckxDQnlaWEJzWVdObGJXVnVkRk4wWVdOckxDQnlaWEJzWVdObGNpd2dhMlY1S1R0Y2JpQWdJQ0I5WEc0Z0lDQWdjM1JoWTJzdWNHOXdLQ2s3WEc0Z0lDQWdjbVZ3YkdGalpXMWxiblJUZEdGamF5NXdiM0FvS1R0Y2JpQWdJQ0J5WlhSMWNtNGdZMkZ1YjI1cFkyRnNhWHBsWkU5aWFqdGNiaUFnZlZ4dVhHNGdJR2xtSUNodlltb2dKaVlnYjJKcUxuUnZTbE5QVGlrZ2UxeHVJQ0FnSUc5aWFpQTlJRzlpYWk1MGIwcFRUMDRvS1R0Y2JpQWdmVnh1WEc0Z0lHbG1JQ2gwZVhCbGIyWWdiMkpxSUQwOVBTQW5iMkpxWldOMEp5QW1KaUJ2WW1vZ0lUMDlJRzUxYkd3cElIdGNiaUFnSUNCemRHRmpheTV3ZFhOb0tHOWlhaWs3WEc0Z0lDQWdZMkZ1YjI1cFkyRnNhWHBsWkU5aWFpQTlJSHQ5TzF4dUlDQWdJSEpsY0d4aFkyVnRaVzUwVTNSaFkyc3VjSFZ6YUNoallXNXZibWxqWVd4cGVtVmtUMkpxS1R0Y2JpQWdJQ0JzWlhRZ2MyOXlkR1ZrUzJWNWN5QTlJRnRkTEZ4dUlDQWdJQ0FnSUNCclpYazdYRzRnSUNBZ1ptOXlJQ2hyWlhrZ2FXNGdiMkpxS1NCN1hHNGdJQ0FnSUNBdktpQnBjM1JoYm1KMWJDQnBaMjV2Y21VZ1pXeHpaU0FxTDF4dUlDQWdJQ0FnYVdZZ0tHOWlhaTVvWVhOUGQyNVFjbTl3WlhKMGVTaHJaWGtwS1NCN1hHNGdJQ0FnSUNBZ0lITnZjblJsWkV0bGVYTXVjSFZ6YUNoclpYa3BPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lIMWNiaUFnSUNCemIzSjBaV1JMWlhsekxuTnZjblFvS1R0Y2JpQWdJQ0JtYjNJZ0tHa2dQU0F3T3lCcElEd2djMjl5ZEdWa1MyVjVjeTVzWlc1bmRHZzdJR2tnS3owZ01Ta2dlMXh1SUNBZ0lDQWdhMlY1SUQwZ2MyOXlkR1ZrUzJWNWMxdHBYVHRjYmlBZ0lDQWdJR05oYm05dWFXTmhiR2w2WldSUFltcGJhMlY1WFNBOUlHTmhibTl1YVdOaGJHbDZaU2h2WW1wYmEyVjVYU3dnYzNSaFkyc3NJSEpsY0d4aFkyVnRaVzUwVTNSaFkyc3NJSEpsY0d4aFkyVnlMQ0JyWlhrcE8xeHVJQ0FnSUgxY2JpQWdJQ0J6ZEdGamF5NXdiM0FvS1R0Y2JpQWdJQ0J5WlhCc1lXTmxiV1Z1ZEZOMFlXTnJMbkJ2Y0NncE8xeHVJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lHTmhibTl1YVdOaGJHbDZaV1JQWW1vZ1BTQnZZbW83WEc0Z0lIMWNiaUFnY21WMGRYSnVJR05oYm05dWFXTmhiR2w2WldSUFltbzdYRzU5WEc0aVhYMD1cbiIsICIvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5cInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGlmZkFycmF5cyA9IGRpZmZBcnJheXM7XG5leHBvcnRzLmFycmF5RGlmZiA9IHZvaWQgMDtcblxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbnZhclxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuX2Jhc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2Jhc2VcIikpXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuO1xuXG4vKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovIGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xudmFyIGFycmF5RGlmZiA9IG5ld1xuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuX2Jhc2Vcbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG5bXG4vKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5cImRlZmF1bHRcIlxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbl0oKTtcblxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuZXhwb3J0cy5hcnJheURpZmYgPSBhcnJheURpZmY7XG5cbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG5hcnJheURpZmYudG9rZW5pemUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlLnNsaWNlKCk7XG59O1xuXG5hcnJheURpZmYuam9pbiA9IGFycmF5RGlmZi5yZW1vdmVFbXB0eSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWU7XG59O1xuXG5mdW5jdGlvbiBkaWZmQXJyYXlzKG9sZEFyciwgbmV3QXJyLCBjYWxsYmFjaykge1xuICByZXR1cm4gYXJyYXlEaWZmLmRpZmYob2xkQXJyLCBuZXdBcnIsIGNhbGxiYWNrKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OWthV1ptTDJGeWNtRjVMbXB6SWwwc0ltNWhiV1Z6SWpwYkltRnljbUY1UkdsbVppSXNJa1JwWm1ZaUxDSjBiMnRsYm1sNlpTSXNJblpoYkhWbElpd2ljMnhwWTJVaUxDSnFiMmx1SWl3aWNtVnRiM1psUlcxd2RIa2lMQ0prYVdabVFYSnlZWGx6SWl3aWIyeGtRWEp5SWl3aWJtVjNRWEp5SWl3aVkyRnNiR0poWTJzaUxDSmthV1ptSWwwc0ltMWhjSEJwYm1keklqb2lPenM3T3pzN096czdPMEZCUVVFN1FVRkJRVHRCUVVGQk8wRkJRVUU3UVVGQlFUczdPenM3UVVGRlR5eEpRVUZOUVN4VFFVRlRMRWRCUVVjN1FVRkJTVU03UVVGQlFVRTdRVUZCUVVFN1FVRkJRVUU3UVVGQlFVRTdRVUZCUVVFN1FVRkJRVUU3UVVGQlFVRXNRMEZCU2l4RlFVRnNRanM3T3pzN08wRkJRMUJFTEZOQlFWTXNRMEZCUTBVc1VVRkJWaXhIUVVGeFFpeFZRVUZUUXl4TFFVRlVMRVZCUVdkQ08wRkJRMjVETEZOQlFVOUJMRXRCUVVzc1EwRkJRME1zUzBGQlRpeEZRVUZRTzBGQlEwUXNRMEZHUkRzN1FVRkhRVW9zVTBGQlV5eERRVUZEU3l4SlFVRldMRWRCUVdsQ1RDeFRRVUZUTEVOQlFVTk5MRmRCUVZZc1IwRkJkMElzVlVGQlUwZ3NTMEZCVkN4RlFVRm5RanRCUVVOMlJDeFRRVUZQUVN4TFFVRlFPMEZCUTBRc1EwRkdSRHM3UVVGSlR5eFRRVUZUU1N4VlFVRlVMRU5CUVc5Q1F5eE5RVUZ3UWl4RlFVRTBRa01zVFVGQk5VSXNSVUZCYjBORExGRkJRWEJETEVWQlFUaERPMEZCUVVVc1UwRkJUMVlzVTBGQlV5eERRVUZEVnl4SlFVRldMRU5CUVdWSUxFMUJRV1lzUlVGQmRVSkRMRTFCUVhaQ0xFVkJRU3RDUXl4UlFVRXZRaXhEUVVGUU8wRkJRV3RFSWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaWFXMXdiM0owSUVScFptWWdabkp2YlNBbkxpOWlZWE5sSnp0Y2JseHVaWGh3YjNKMElHTnZibk4wSUdGeWNtRjVSR2xtWmlBOUlHNWxkeUJFYVdabUtDazdYRzVoY25KaGVVUnBabVl1ZEc5clpXNXBlbVVnUFNCbWRXNWpkR2x2YmloMllXeDFaU2tnZTF4dUlDQnlaWFIxY200Z2RtRnNkV1V1YzJ4cFkyVW9LVHRjYm4wN1hHNWhjbkpoZVVScFptWXVhbTlwYmlBOUlHRnljbUY1UkdsbVppNXlaVzF2ZG1WRmJYQjBlU0E5SUdaMWJtTjBhVzl1S0haaGJIVmxLU0I3WEc0Z0lISmxkSFZ5YmlCMllXeDFaVHRjYm4wN1hHNWNibVY0Y0c5eWRDQm1kVzVqZEdsdmJpQmthV1ptUVhKeVlYbHpLRzlzWkVGeWNpd2dibVYzUVhKeUxDQmpZV3hzWW1GamF5a2dleUJ5WlhSMWNtNGdZWEp5WVhsRWFXWm1MbVJwWm1Zb2IyeGtRWEp5TENCdVpYZEJjbklzSUdOaGJHeGlZV05yS1RzZ2ZWeHVJbDE5XG4iLCAiLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLnBhcnNlUGF0Y2ggPSBwYXJzZVBhdGNoO1xuXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuZnVuY3Rpb24gcGFyc2VQYXRjaCh1bmlEaWZmKSB7XG4gIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgdmFyXG4gIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICB2YXIgZGlmZnN0ciA9IHVuaURpZmYuc3BsaXQoL1xcclxcbnxbXFxuXFx2XFxmXFxyXFx4ODVdLyksXG4gICAgICBkZWxpbWl0ZXJzID0gdW5pRGlmZi5tYXRjaCgvXFxyXFxufFtcXG5cXHZcXGZcXHJcXHg4NV0vZykgfHwgW10sXG4gICAgICBsaXN0ID0gW10sXG4gICAgICBpID0gMDtcblxuICBmdW5jdGlvbiBwYXJzZUluZGV4KCkge1xuICAgIHZhciBpbmRleCA9IHt9O1xuICAgIGxpc3QucHVzaChpbmRleCk7IC8vIFBhcnNlIGRpZmYgbWV0YWRhdGFcblxuICAgIHdoaWxlIChpIDwgZGlmZnN0ci5sZW5ndGgpIHtcbiAgICAgIHZhciBsaW5lID0gZGlmZnN0cltpXTsgLy8gRmlsZSBoZWFkZXIgZm91bmQsIGVuZCBwYXJzaW5nIGRpZmYgbWV0YWRhdGFcblxuICAgICAgaWYgKC9eKFxcLVxcLVxcLXxcXCtcXCtcXCt8QEApXFxzLy50ZXN0KGxpbmUpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSAvLyBEaWZmIGluZGV4XG5cblxuICAgICAgdmFyIGhlYWRlciA9IC9eKD86SW5kZXg6fGRpZmYoPzogLXIgXFx3KykrKVxccysoLis/KVxccyokLy5leGVjKGxpbmUpO1xuXG4gICAgICBpZiAoaGVhZGVyKSB7XG4gICAgICAgIGluZGV4LmluZGV4ID0gaGVhZGVyWzFdO1xuICAgICAgfVxuXG4gICAgICBpKys7XG4gICAgfSAvLyBQYXJzZSBmaWxlIGhlYWRlcnMgaWYgdGhleSBhcmUgZGVmaW5lZC4gVW5pZmllZCBkaWZmIHJlcXVpcmVzIHRoZW0sIGJ1dFxuICAgIC8vIHRoZXJlJ3Mgbm8gdGVjaG5pY2FsIGlzc3VlcyB0byBoYXZlIGFuIGlzb2xhdGVkIGh1bmsgd2l0aG91dCBmaWxlIGhlYWRlclxuXG5cbiAgICBwYXJzZUZpbGVIZWFkZXIoaW5kZXgpO1xuICAgIHBhcnNlRmlsZUhlYWRlcihpbmRleCk7IC8vIFBhcnNlIGh1bmtzXG5cbiAgICBpbmRleC5odW5rcyA9IFtdO1xuXG4gICAgd2hpbGUgKGkgPCBkaWZmc3RyLmxlbmd0aCkge1xuICAgICAgdmFyIF9saW5lID0gZGlmZnN0cltpXTtcblxuICAgICAgaWYgKC9eKEluZGV4OnxkaWZmfFxcLVxcLVxcLXxcXCtcXCtcXCspXFxzLy50ZXN0KF9saW5lKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSBpZiAoL15AQC8udGVzdChfbGluZSkpIHtcbiAgICAgICAgaW5kZXguaHVua3MucHVzaChwYXJzZUh1bmsoKSk7XG4gICAgICB9IGVsc2UgaWYgKF9saW5lICYmIG9wdGlvbnMuc3RyaWN0KSB7XG4gICAgICAgIC8vIElnbm9yZSB1bmV4cGVjdGVkIGNvbnRlbnQgdW5sZXNzIGluIHN0cmljdCBtb2RlXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBsaW5lICcgKyAoaSArIDEpICsgJyAnICsgSlNPTi5zdHJpbmdpZnkoX2xpbmUpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGkrKztcbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gUGFyc2VzIHRoZSAtLS0gYW5kICsrKyBoZWFkZXJzLCBpZiBub25lIGFyZSBmb3VuZCwgbm8gbGluZXNcbiAgLy8gYXJlIGNvbnN1bWVkLlxuXG5cbiAgZnVuY3Rpb24gcGFyc2VGaWxlSGVhZGVyKGluZGV4KSB7XG4gICAgdmFyIGZpbGVIZWFkZXIgPSAvXigtLS18XFwrXFwrXFwrKVxccysoLiopJC8uZXhlYyhkaWZmc3RyW2ldKTtcblxuICAgIGlmIChmaWxlSGVhZGVyKSB7XG4gICAgICB2YXIga2V5UHJlZml4ID0gZmlsZUhlYWRlclsxXSA9PT0gJy0tLScgPyAnb2xkJyA6ICduZXcnO1xuICAgICAgdmFyIGRhdGEgPSBmaWxlSGVhZGVyWzJdLnNwbGl0KCdcXHQnLCAyKTtcbiAgICAgIHZhciBmaWxlTmFtZSA9IGRhdGFbMF0ucmVwbGFjZSgvXFxcXFxcXFwvZywgJ1xcXFwnKTtcblxuICAgICAgaWYgKC9eXCIuKlwiJC8udGVzdChmaWxlTmFtZSkpIHtcbiAgICAgICAgZmlsZU5hbWUgPSBmaWxlTmFtZS5zdWJzdHIoMSwgZmlsZU5hbWUubGVuZ3RoIC0gMik7XG4gICAgICB9XG5cbiAgICAgIGluZGV4W2tleVByZWZpeCArICdGaWxlTmFtZSddID0gZmlsZU5hbWU7XG4gICAgICBpbmRleFtrZXlQcmVmaXggKyAnSGVhZGVyJ10gPSAoZGF0YVsxXSB8fCAnJykudHJpbSgpO1xuICAgICAgaSsrO1xuICAgIH1cbiAgfSAvLyBQYXJzZXMgYSBodW5rXG4gIC8vIFRoaXMgYXNzdW1lcyB0aGF0IHdlIGFyZSBhdCB0aGUgc3RhcnQgb2YgYSBodW5rLlxuXG5cbiAgZnVuY3Rpb24gcGFyc2VIdW5rKCkge1xuICAgIHZhciBjaHVua0hlYWRlckluZGV4ID0gaSxcbiAgICAgICAgY2h1bmtIZWFkZXJMaW5lID0gZGlmZnN0cltpKytdLFxuICAgICAgICBjaHVua0hlYWRlciA9IGNodW5rSGVhZGVyTGluZS5zcGxpdCgvQEAgLShcXGQrKSg/OiwoXFxkKykpPyBcXCsoXFxkKykoPzosKFxcZCspKT8gQEAvKTtcbiAgICB2YXIgaHVuayA9IHtcbiAgICAgIG9sZFN0YXJ0OiArY2h1bmtIZWFkZXJbMV0sXG4gICAgICBvbGRMaW5lczogdHlwZW9mIGNodW5rSGVhZGVyWzJdID09PSAndW5kZWZpbmVkJyA/IDEgOiArY2h1bmtIZWFkZXJbMl0sXG4gICAgICBuZXdTdGFydDogK2NodW5rSGVhZGVyWzNdLFxuICAgICAgbmV3TGluZXM6IHR5cGVvZiBjaHVua0hlYWRlcls0XSA9PT0gJ3VuZGVmaW5lZCcgPyAxIDogK2NodW5rSGVhZGVyWzRdLFxuICAgICAgbGluZXM6IFtdLFxuICAgICAgbGluZWRlbGltaXRlcnM6IFtdXG4gICAgfTsgLy8gVW5pZmllZCBEaWZmIEZvcm1hdCBxdWlyazogSWYgdGhlIGNodW5rIHNpemUgaXMgMCxcbiAgICAvLyB0aGUgZmlyc3QgbnVtYmVyIGlzIG9uZSBsb3dlciB0aGFuIG9uZSB3b3VsZCBleHBlY3QuXG4gICAgLy8gaHR0cHM6Ly93d3cuYXJ0aW1hLmNvbS93ZWJsb2dzL3ZpZXdwb3N0LmpzcD90aHJlYWQ9MTY0MjkzXG5cbiAgICBpZiAoaHVuay5vbGRMaW5lcyA9PT0gMCkge1xuICAgICAgaHVuay5vbGRTdGFydCArPSAxO1xuICAgIH1cblxuICAgIGlmIChodW5rLm5ld0xpbmVzID09PSAwKSB7XG4gICAgICBodW5rLm5ld1N0YXJ0ICs9IDE7XG4gICAgfVxuXG4gICAgdmFyIGFkZENvdW50ID0gMCxcbiAgICAgICAgcmVtb3ZlQ291bnQgPSAwO1xuXG4gICAgZm9yICg7IGkgPCBkaWZmc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBMaW5lcyBzdGFydGluZyB3aXRoICctLS0nIGNvdWxkIGJlIG1pc3Rha2VuIGZvciB0aGUgXCJyZW1vdmUgbGluZVwiIG9wZXJhdGlvblxuICAgICAgLy8gQnV0IHRoZXkgY291bGQgYmUgdGhlIGhlYWRlciBmb3IgdGhlIG5leHQgZmlsZS4gVGhlcmVmb3JlIHBydW5lIHN1Y2ggY2FzZXMgb3V0LlxuICAgICAgaWYgKGRpZmZzdHJbaV0uaW5kZXhPZignLS0tICcpID09PSAwICYmIGkgKyAyIDwgZGlmZnN0ci5sZW5ndGggJiYgZGlmZnN0cltpICsgMV0uaW5kZXhPZignKysrICcpID09PSAwICYmIGRpZmZzdHJbaSArIDJdLmluZGV4T2YoJ0BAJykgPT09IDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHZhciBvcGVyYXRpb24gPSBkaWZmc3RyW2ldLmxlbmd0aCA9PSAwICYmIGkgIT0gZGlmZnN0ci5sZW5ndGggLSAxID8gJyAnIDogZGlmZnN0cltpXVswXTtcblxuICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJysnIHx8IG9wZXJhdGlvbiA9PT0gJy0nIHx8IG9wZXJhdGlvbiA9PT0gJyAnIHx8IG9wZXJhdGlvbiA9PT0gJ1xcXFwnKSB7XG4gICAgICAgIGh1bmsubGluZXMucHVzaChkaWZmc3RyW2ldKTtcbiAgICAgICAgaHVuay5saW5lZGVsaW1pdGVycy5wdXNoKGRlbGltaXRlcnNbaV0gfHwgJ1xcbicpO1xuXG4gICAgICAgIGlmIChvcGVyYXRpb24gPT09ICcrJykge1xuICAgICAgICAgIGFkZENvdW50Kys7XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uID09PSAnLScpIHtcbiAgICAgICAgICByZW1vdmVDb3VudCsrO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJyAnKSB7XG4gICAgICAgICAgYWRkQ291bnQrKztcbiAgICAgICAgICByZW1vdmVDb3VudCsrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IC8vIEhhbmRsZSB0aGUgZW1wdHkgYmxvY2sgY291bnQgY2FzZVxuXG5cbiAgICBpZiAoIWFkZENvdW50ICYmIGh1bmsubmV3TGluZXMgPT09IDEpIHtcbiAgICAgIGh1bmsubmV3TGluZXMgPSAwO1xuICAgIH1cblxuICAgIGlmICghcmVtb3ZlQ291bnQgJiYgaHVuay5vbGRMaW5lcyA9PT0gMSkge1xuICAgICAgaHVuay5vbGRMaW5lcyA9IDA7XG4gICAgfSAvLyBQZXJmb3JtIG9wdGlvbmFsIHNhbml0eSBjaGVja2luZ1xuXG5cbiAgICBpZiAob3B0aW9ucy5zdHJpY3QpIHtcbiAgICAgIGlmIChhZGRDb3VudCAhPT0gaHVuay5uZXdMaW5lcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FkZGVkIGxpbmUgY291bnQgZGlkIG5vdCBtYXRjaCBmb3IgaHVuayBhdCBsaW5lICcgKyAoY2h1bmtIZWFkZXJJbmRleCArIDEpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlbW92ZUNvdW50ICE9PSBodW5rLm9sZExpbmVzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUmVtb3ZlZCBsaW5lIGNvdW50IGRpZCBub3QgbWF0Y2ggZm9yIGh1bmsgYXQgbGluZSAnICsgKGNodW5rSGVhZGVySW5kZXggKyAxKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGh1bms7XG4gIH1cblxuICB3aGlsZSAoaSA8IGRpZmZzdHIubGVuZ3RoKSB7XG4gICAgcGFyc2VJbmRleCgpO1xuICB9XG5cbiAgcmV0dXJuIGxpc3Q7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTl3WVhSamFDOXdZWEp6WlM1cWN5SmRMQ0p1WVcxbGN5STZXeUp3WVhKelpWQmhkR05vSWl3aWRXNXBSR2xtWmlJc0ltOXdkR2x2Ym5NaUxDSmthV1ptYzNSeUlpd2ljM0JzYVhRaUxDSmtaV3hwYldsMFpYSnpJaXdpYldGMFkyZ2lMQ0pzYVhOMElpd2lhU0lzSW5CaGNuTmxTVzVrWlhnaUxDSnBibVJsZUNJc0luQjFjMmdpTENKc1pXNW5kR2dpTENKc2FXNWxJaXdpZEdWemRDSXNJbWhsWVdSbGNpSXNJbVY0WldNaUxDSndZWEp6WlVacGJHVklaV0ZrWlhJaUxDSm9kVzVyY3lJc0luQmhjbk5sU0hWdWF5SXNJbk4wY21samRDSXNJa1Z5Y205eUlpd2lTbE5QVGlJc0luTjBjbWx1WjJsbWVTSXNJbVpwYkdWSVpXRmtaWElpTENKclpYbFFjbVZtYVhnaUxDSmtZWFJoSWl3aVptbHNaVTVoYldVaUxDSnlaWEJzWVdObElpd2ljM1ZpYzNSeUlpd2lkSEpwYlNJc0ltTm9kVzVyU0dWaFpHVnlTVzVrWlhnaUxDSmphSFZ1YTBobFlXUmxja3hwYm1VaUxDSmphSFZ1YTBobFlXUmxjaUlzSW1oMWJtc2lMQ0p2YkdSVGRHRnlkQ0lzSW05c1pFeHBibVZ6SWl3aWJtVjNVM1JoY25RaUxDSnVaWGRNYVc1bGN5SXNJbXhwYm1Weklpd2liR2x1WldSbGJHbHRhWFJsY25NaUxDSmhaR1JEYjNWdWRDSXNJbkpsYlc5MlpVTnZkVzUwSWl3aWFXNWtaWGhQWmlJc0ltOXdaWEpoZEdsdmJpSmRMQ0p0WVhCd2FXNW5jeUk2SWpzN096czdPenM3TzBGQlFVOHNVMEZCVTBFc1ZVRkJWQ3hEUVVGdlFrTXNUMEZCY0VJc1JVRkJNa003UVVGQlFUdEJRVUZCTzBGQlFVRTdRVUZCWkVNc1JVRkJRVUVzVDBGQll5eDFSVUZCU2l4RlFVRkpPMEZCUTJoRUxFMUJRVWxETEU5QlFVOHNSMEZCUjBZc1QwRkJUeXhEUVVGRFJ5eExRVUZTTEVOQlFXTXNjVUpCUVdRc1EwRkJaRHRCUVVGQkxFMUJRMGxETEZWQlFWVXNSMEZCUjBvc1QwRkJUeXhEUVVGRFN5eExRVUZTTEVOQlFXTXNjMEpCUVdRc1MwRkJlVU1zUlVGRU1VUTdRVUZCUVN4TlFVVkpReXhKUVVGSkxFZEJRVWNzUlVGR1dEdEJRVUZCTEUxQlIwbERMRU5CUVVNc1IwRkJSeXhEUVVoU096dEJRVXRCTEZkQlFWTkRMRlZCUVZRc1IwRkJjMEk3UVVGRGNFSXNVVUZCU1VNc1MwRkJTeXhIUVVGSExFVkJRVm83UVVGRFFVZ3NTVUZCUVVFc1NVRkJTU3hEUVVGRFNTeEpRVUZNTEVOQlFWVkVMRXRCUVZZc1JVRkdiMElzUTBGSmNFSTdPMEZCUTBFc1YwRkJUMFlzUTBGQlF5eEhRVUZIVEN4UFFVRlBMRU5CUVVOVExFMUJRVzVDTEVWQlFUSkNPMEZCUTNwQ0xGVkJRVWxETEVsQlFVa3NSMEZCUjFZc1QwRkJUeXhEUVVGRFN5eERRVUZFTEVOQlFXeENMRU5CUkhsQ0xFTkJSM3BDT3p0QlFVTkJMRlZCUVVzc2RVSkJRVVFzUTBGQk1FSk5MRWxCUVRGQ0xFTkJRU3RDUkN4SlFVRXZRaXhEUVVGS0xFVkJRVEJETzBGQlEzaERPMEZCUTBRc1QwRk9kMElzUTBGUmVrSTdPenRCUVVOQkxGVkJRVWxGTEUxQlFVMHNSMEZCU1N3d1EwRkJSQ3hEUVVFMlEwTXNTVUZCTjBNc1EwRkJhMFJJTEVsQlFXeEVMRU5CUVdJN08wRkJRMEVzVlVGQlNVVXNUVUZCU2l4RlFVRlpPMEZCUTFaTUxGRkJRVUZCTEV0QlFVc3NRMEZCUTBFc1MwRkJUaXhIUVVGalN5eE5RVUZOTEVOQlFVTXNRMEZCUkN4RFFVRndRanRCUVVORU96dEJRVVZFVUN4TlFVRkJRU3hEUVVGRE8wRkJRMFlzUzBGd1FtMUNMRU5CYzBKd1FqdEJRVU5CT3pzN1FVRkRRVk1zU1VGQlFVRXNaVUZCWlN4RFFVRkRVQ3hMUVVGRUxFTkJRV1k3UVVGRFFVOHNTVUZCUVVFc1pVRkJaU3hEUVVGRFVDeExRVUZFTEVOQlFXWXNRMEY2UW05Q0xFTkJNa0p3UWpzN1FVRkRRVUVzU1VGQlFVRXNTMEZCU3l4RFFVRkRVU3hMUVVGT0xFZEJRV01zUlVGQlpEczdRVUZGUVN4WFFVRlBWaXhEUVVGRExFZEJRVWRNTEU5QlFVOHNRMEZCUTFNc1RVRkJia0lzUlVGQk1rSTdRVUZEZWtJc1ZVRkJTVU1zUzBGQlNTeEhRVUZIVml4UFFVRlBMRU5CUVVOTExFTkJRVVFzUTBGQmJFSTdPMEZCUlVFc1ZVRkJTeXhuUTBGQlJDeERRVUZ0UTAwc1NVRkJia01zUTBGQmQwTkVMRXRCUVhoRExFTkJRVW9zUlVGQmJVUTdRVUZEYWtRN1FVRkRSQ3hQUVVaRUxFMUJSVThzU1VGQlN5eExRVUZFTEVOQlFWRkRMRWxCUVZJc1EwRkJZVVFzUzBGQllpeERRVUZLTEVWQlFYZENPMEZCUXpkQ1NDeFJRVUZCUVN4TFFVRkxMRU5CUVVOUkxFdEJRVTRzUTBGQldWQXNTVUZCV2l4RFFVRnBRbEVzVTBGQlV5eEZRVUV4UWp0QlFVTkVMRTlCUmswc1RVRkZRU3hKUVVGSlRpeExRVUZKTEVsQlFVbFlMRTlCUVU4c1EwRkJRMnRDTEUxQlFYQkNMRVZCUVRSQ08wRkJRMnBETzBGQlEwRXNZMEZCVFN4SlFVRkpReXhMUVVGS0xFTkJRVlVzYlVKQlFXMUNZaXhEUVVGRExFZEJRVWNzUTBGQmRrSXNTVUZCTkVJc1IwRkJOVUlzUjBGQmEwTmpMRWxCUVVrc1EwRkJRME1zVTBGQlRDeERRVUZsVml4TFFVRm1MRU5CUVRWRExFTkJRVTQ3UVVGRFJDeFBRVWhOTEUxQlIwRTdRVUZEVEV3c1VVRkJRVUVzUTBGQlF6dEJRVU5HTzBGQlEwWTdRVUZEUml4SFFXeEVLME1zUTBGdlJHaEVPMEZCUTBFN096dEJRVU5CTEZkQlFWTlRMR1ZCUVZRc1EwRkJlVUpRTEV0QlFYcENMRVZCUVdkRE8wRkJRemxDTEZGQlFVMWpMRlZCUVZVc1IwRkJTU3gxUWtGQlJDeERRVUV3UWxJc1NVRkJNVUlzUTBGQkswSmlMRTlCUVU4c1EwRkJRMHNzUTBGQlJDeERRVUYwUXl4RFFVRnVRanM3UVVGRFFTeFJRVUZKWjBJc1ZVRkJTaXhGUVVGblFqdEJRVU5rTEZWQlFVbERMRk5CUVZNc1IwRkJSMFFzVlVGQlZTeERRVUZETEVOQlFVUXNRMEZCVml4TFFVRnJRaXhMUVVGc1FpeEhRVUV3UWl4TFFVRXhRaXhIUVVGclF5eExRVUZzUkR0QlFVTkJMRlZCUVUxRkxFbEJRVWtzUjBGQlIwWXNWVUZCVlN4RFFVRkRMRU5CUVVRc1EwRkJWaXhEUVVGamNFSXNTMEZCWkN4RFFVRnZRaXhKUVVGd1FpeEZRVUV3UWl4RFFVRXhRaXhEUVVGaU8wRkJRMEVzVlVGQlNYVkNMRkZCUVZFc1IwRkJSMFFzU1VGQlNTeERRVUZETEVOQlFVUXNRMEZCU2l4RFFVRlJSU3hQUVVGU0xFTkJRV2RDTEU5QlFXaENMRVZCUVhsQ0xFbEJRWHBDTEVOQlFXWTdPMEZCUTBFc1ZVRkJTeXhSUVVGRUxFTkJRVmRrTEVsQlFWZ3NRMEZCWjBKaExGRkJRV2hDTEVOQlFVb3NSVUZCSzBJN1FVRkROMEpCTEZGQlFVRkJMRkZCUVZFc1IwRkJSMEVzVVVGQlVTeERRVUZEUlN4TlFVRlVMRU5CUVdkQ0xFTkJRV2hDTEVWQlFXMUNSaXhSUVVGUkxFTkJRVU5tTEUxQlFWUXNSMEZCYTBJc1EwRkJja01zUTBGQldEdEJRVU5FT3p0QlFVTkVSaXhOUVVGQlFTeExRVUZMTEVOQlFVTmxMRk5CUVZNc1IwRkJSeXhWUVVGaUxFTkJRVXdzUjBGQlowTkZMRkZCUVdoRE8wRkJRMEZxUWl4TlFVRkJRU3hMUVVGTExFTkJRVU5sTEZOQlFWTXNSMEZCUnl4UlFVRmlMRU5CUVV3c1IwRkJPRUlzUTBGQlEwTXNTVUZCU1N4RFFVRkRMRU5CUVVRc1EwRkJTaXhKUVVGWExFVkJRVm9zUlVGQlowSkpMRWxCUVdoQ0xFVkJRVGxDTzBGQlJVRjBRaXhOUVVGQlFTeERRVUZETzBGQlEwWTdRVUZEUml4SFFYQkZLME1zUTBGelJXaEVPMEZCUTBFN096dEJRVU5CTEZkQlFWTlhMRk5CUVZRc1IwRkJjVUk3UVVGRGJrSXNVVUZCU1Zrc1owSkJRV2RDTEVkQlFVZDJRaXhEUVVGMlFqdEJRVUZCTEZGQlEwbDNRaXhsUVVGbExFZEJRVWMzUWl4UFFVRlBMRU5CUVVOTExFTkJRVU1zUlVGQlJpeERRVVEzUWp0QlFVRkJMRkZCUlVsNVFpeFhRVUZYTEVkQlFVZEVMR1ZCUVdVc1EwRkJRelZDTEV0QlFXaENMRU5CUVhOQ0xEUkRRVUYwUWl4RFFVWnNRanRCUVVsQkxGRkJRVWs0UWl4SlFVRkpMRWRCUVVjN1FVRkRWRU1zVFVGQlFVRXNVVUZCVVN4RlFVRkZMRU5CUVVOR0xGZEJRVmNzUTBGQlF5eERRVUZFTEVOQlJHSTdRVUZGVkVjc1RVRkJRVUVzVVVGQlVTeEZRVUZGTEU5QlFVOUlMRmRCUVZjc1EwRkJReXhEUVVGRUxFTkJRV3hDTEV0QlFUQkNMRmRCUVRGQ0xFZEJRWGRETEVOQlFYaERMRWRCUVRSRExFTkJRVU5CTEZkQlFWY3NRMEZCUXl4RFFVRkVMRU5CUm5wRU8wRkJSMVJKTEUxQlFVRkJMRkZCUVZFc1JVRkJSU3hEUVVGRFNpeFhRVUZYTEVOQlFVTXNRMEZCUkN4RFFVaGlPMEZCU1ZSTExFMUJRVUZCTEZGQlFWRXNSVUZCUlN4UFFVRlBUQ3hYUVVGWExFTkJRVU1zUTBGQlJDeERRVUZzUWl4TFFVRXdRaXhYUVVFeFFpeEhRVUYzUXl4RFFVRjRReXhIUVVFMFF5eERRVUZEUVN4WFFVRlhMRU5CUVVNc1EwRkJSQ3hEUVVwNlJEdEJRVXRVVFN4TlFVRkJRU3hMUVVGTExFVkJRVVVzUlVGTVJUdEJRVTFVUXl4TlFVRkJRU3hqUVVGakxFVkJRVVU3UVVGT1VDeExRVUZZTEVOQlRHMUNMRU5CWTI1Q08wRkJRMEU3UVVGRFFUczdRVUZEUVN4UlFVRkpUaXhKUVVGSkxFTkJRVU5GTEZGQlFVd3NTMEZCYTBJc1EwRkJkRUlzUlVGQmVVSTdRVUZEZGtKR0xFMUJRVUZCTEVsQlFVa3NRMEZCUTBNc1VVRkJUQ3hKUVVGcFFpeERRVUZxUWp0QlFVTkVPenRCUVVORUxGRkJRVWxFTEVsQlFVa3NRMEZCUTBrc1VVRkJUQ3hMUVVGclFpeERRVUYwUWl4RlFVRjVRanRCUVVOMlFrb3NUVUZCUVVFc1NVRkJTU3hEUVVGRFJ5eFJRVUZNTEVsQlFXbENMRU5CUVdwQ08wRkJRMFE3TzBGQlJVUXNVVUZCU1Vrc1VVRkJVU3hIUVVGSExFTkJRV1k3UVVGQlFTeFJRVU5KUXl4WFFVRlhMRWRCUVVjc1EwRkViRUk3TzBGQlJVRXNWMEZCVDJ4RExFTkJRVU1zUjBGQlIwd3NUMEZCVHl4RFFVRkRVeXhOUVVGdVFpeEZRVUV5UWtvc1EwRkJReXhGUVVFMVFpeEZRVUZuUXp0QlFVTTVRanRCUVVOQk8wRkJRMEVzVlVGQlNVd3NUMEZCVHl4RFFVRkRTeXhEUVVGRUxFTkJRVkFzUTBGQlYyMURMRTlCUVZnc1EwRkJiVUlzVFVGQmJrSXNUVUZCSzBJc1EwRkJMMElzU1VGRFRXNURMRU5CUVVNc1IwRkJSeXhEUVVGS0xFZEJRVkZNTEU5QlFVOHNRMEZCUTFNc1RVRkVkRUlzU1VGRlMxUXNUMEZCVHl4RFFVRkRTeXhEUVVGRExFZEJRVWNzUTBGQlRDeERRVUZRTEVOQlFXVnRReXhQUVVGbUxFTkJRWFZDTEUxQlFYWkNMRTFCUVcxRExFTkJSbmhETEVsQlIwdDRReXhQUVVGUExFTkJRVU5MTEVOQlFVTXNSMEZCUnl4RFFVRk1MRU5CUVZBc1EwRkJaVzFETEU5QlFXWXNRMEZCZFVJc1NVRkJka0lzVFVGQmFVTXNRMEZJTVVNc1JVRkhOa003UVVGRGVrTTdRVUZEU0RzN1FVRkRSQ3hWUVVGSlF5eFRRVUZUTEVkQlFVbDZReXhQUVVGUExFTkJRVU5MTEVOQlFVUXNRMEZCVUN4RFFVRlhTU3hOUVVGWUxFbEJRWEZDTEVOQlFYSkNMRWxCUVRCQ1NpeERRVUZETEVsQlFVdE1MRTlCUVU4c1EwRkJRMU1zVFVGQlVpeEhRVUZwUWl4RFFVRnNSQ3hIUVVGM1JDeEhRVUY0UkN4SFFVRTRSRlFzVDBGQlR5eERRVUZEU3l4RFFVRkVMRU5CUVZBc1EwRkJWeXhEUVVGWUxFTkJRVGxGT3p0QlFVVkJMRlZCUVVsdlF5eFRRVUZUTEV0QlFVc3NSMEZCWkN4SlFVRnhRa0VzVTBGQlV5eExRVUZMTEVkQlFXNURMRWxCUVRCRFFTeFRRVUZUTEV0QlFVc3NSMEZCZUVRc1NVRkJLMFJCTEZOQlFWTXNTMEZCU3l4SlFVRnFSaXhGUVVGMVJqdEJRVU55UmxZc1VVRkJRVUVzU1VGQlNTeERRVUZEU3l4TFFVRk1MRU5CUVZjMVFpeEpRVUZZTEVOQlFXZENVaXhQUVVGUExFTkJRVU5MTEVOQlFVUXNRMEZCZGtJN1FVRkRRVEJDTEZGQlFVRkJMRWxCUVVrc1EwRkJRMDBzWTBGQlRDeERRVUZ2UWpkQ0xFbEJRWEJDTEVOQlFYbENUaXhWUVVGVkxFTkJRVU5ITEVOQlFVUXNRMEZCVml4SlFVRnBRaXhKUVVFeFF6czdRVUZGUVN4WlFVRkpiME1zVTBGQlV5eExRVUZMTEVkQlFXeENMRVZCUVhWQ08wRkJRM0pDU0N4VlFVRkJRU3hSUVVGUk8wRkJRMVFzVTBGR1JDeE5RVVZQTEVsQlFVbEhMRk5CUVZNc1MwRkJTeXhIUVVGc1FpeEZRVUYxUWp0QlFVTTFRa1lzVlVGQlFVRXNWMEZCVnp0QlFVTmFMRk5CUmswc1RVRkZRU3hKUVVGSlJTeFRRVUZUTEV0QlFVc3NSMEZCYkVJc1JVRkJkVUk3UVVGRE5VSklMRlZCUVVGQkxGRkJRVkU3UVVGRFVrTXNWVUZCUVVFc1YwRkJWenRCUVVOYU8wRkJRMFlzVDBGYVJDeE5RVmxQTzBGQlEwdzdRVUZEUkR0QlFVTkdMRXRCY0VSclFpeERRWE5FYmtJN096dEJRVU5CTEZGQlFVa3NRMEZCUTBRc1VVRkJSQ3hKUVVGaFVDeEpRVUZKTEVOQlFVTkpMRkZCUVV3c1MwRkJhMElzUTBGQmJrTXNSVUZCYzBNN1FVRkRjRU5LTEUxQlFVRkJMRWxCUVVrc1EwRkJRMGtzVVVGQlRDeEhRVUZuUWl4RFFVRm9RanRCUVVORU96dEJRVU5FTEZGQlFVa3NRMEZCUTBrc1YwRkJSQ3hKUVVGblFsSXNTVUZCU1N4RFFVRkRSU3hSUVVGTUxFdEJRV3RDTEVOQlFYUkRMRVZCUVhsRE8wRkJRM1pEUml4TlFVRkJRU3hKUVVGSkxFTkJRVU5GTEZGQlFVd3NSMEZCWjBJc1EwRkJhRUk3UVVGRFJDeExRVFZFYTBJc1EwRTRSRzVDT3pzN1FVRkRRU3hSUVVGSmJFTXNUMEZCVHl4RFFVRkRhMElzVFVGQldpeEZRVUZ2UWp0QlFVTnNRaXhWUVVGSmNVSXNVVUZCVVN4TFFVRkxVQ3hKUVVGSkxFTkJRVU5KTEZGQlFYUkNMRVZCUVdkRE8wRkJRemxDTEdOQlFVMHNTVUZCU1dwQ0xFdEJRVW9zUTBGQlZTeHpSRUZCYzBSVkxHZENRVUZuUWl4SFFVRkhMRU5CUVhwRkxFTkJRVllzUTBGQlRqdEJRVU5FT3p0QlFVTkVMRlZCUVVsWExGZEJRVmNzUzBGQlMxSXNTVUZCU1N4RFFVRkRSU3hSUVVGNlFpeEZRVUZ0UXp0QlFVTnFReXhqUVVGTkxFbEJRVWxtTEV0QlFVb3NRMEZCVlN4M1JFRkJkMFJWTEdkQ1FVRm5RaXhIUVVGSExFTkJRVE5GTEVOQlFWWXNRMEZCVGp0QlFVTkVPMEZCUTBZN08wRkJSVVFzVjBGQlQwY3NTVUZCVUR0QlFVTkVPenRCUVVWRUxGTkJRVTh4UWl4RFFVRkRMRWRCUVVkTUxFOUJRVThzUTBGQlExTXNUVUZCYmtJc1JVRkJNa0k3UVVGRGVrSklMRWxCUVVGQkxGVkJRVlU3UVVGRFdEczdRVUZGUkN4VFFVRlBSaXhKUVVGUU8wRkJRMFFpTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lKbGVIQnZjblFnWm5WdVkzUnBiMjRnY0dGeWMyVlFZWFJqYUNoMWJtbEVhV1ptTENCdmNIUnBiMjV6SUQwZ2UzMHBJSHRjYmlBZ2JHVjBJR1JwWm1aemRISWdQU0IxYm1sRWFXWm1Mbk53YkdsMEtDOWNYSEpjWEc1OFcxeGNibHhjZGx4Y1pseGNjbHhjZURnMVhTOHBMRnh1SUNBZ0lDQWdaR1ZzYVcxcGRHVnljeUE5SUhWdWFVUnBabVl1YldGMFkyZ29MMXhjY2x4Y2JueGJYRnh1WEZ4MlhGeG1YRnh5WEZ4NE9EVmRMMmNwSUh4OElGdGRMRnh1SUNBZ0lDQWdiR2x6ZENBOUlGdGRMRnh1SUNBZ0lDQWdhU0E5SURBN1hHNWNiaUFnWm5WdVkzUnBiMjRnY0dGeWMyVkpibVJsZUNncElIdGNiaUFnSUNCc1pYUWdhVzVrWlhnZ1BTQjdmVHRjYmlBZ0lDQnNhWE4wTG5CMWMyZ29hVzVrWlhncE8xeHVYRzRnSUNBZ0x5OGdVR0Z5YzJVZ1pHbG1aaUJ0WlhSaFpHRjBZVnh1SUNBZ0lIZG9hV3hsSUNocElEd2daR2xtWm5OMGNpNXNaVzVuZEdncElIdGNiaUFnSUNBZ0lHeGxkQ0JzYVc1bElEMGdaR2xtWm5OMGNsdHBYVHRjYmx4dUlDQWdJQ0FnTHk4Z1JtbHNaU0JvWldGa1pYSWdabTkxYm1Rc0lHVnVaQ0J3WVhKemFXNW5JR1JwWm1ZZ2JXVjBZV1JoZEdGY2JpQWdJQ0FnSUdsbUlDZ29MMTRvWEZ3dFhGd3RYRnd0ZkZ4Y0sxeGNLMXhjSzN4QVFDbGNYSE12S1M1MFpYTjBLR3hwYm1VcEtTQjdYRzRnSUNBZ0lDQWdJR0p5WldGck8xeHVJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQXZMeUJFYVdabUlHbHVaR1Y0WEc0Z0lDQWdJQ0JzWlhRZ2FHVmhaR1Z5SUQwZ0tDOWVLRDg2U1c1a1pYZzZmR1JwWm1Zb1B6b2dMWElnWEZ4M0t5a3JLVnhjY3lzb0xpcy9LVnhjY3lva0x5a3VaWGhsWXloc2FXNWxLVHRjYmlBZ0lDQWdJR2xtSUNob1pXRmtaWElwSUh0Y2JpQWdJQ0FnSUNBZ2FXNWtaWGd1YVc1a1pYZ2dQU0JvWldGa1pYSmJNVjA3WEc0Z0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUdrckt6dGNiaUFnSUNCOVhHNWNiaUFnSUNBdkx5QlFZWEp6WlNCbWFXeGxJR2hsWVdSbGNuTWdhV1lnZEdobGVTQmhjbVVnWkdWbWFXNWxaQzRnVlc1cFptbGxaQ0JrYVdabUlISmxjWFZwY21WeklIUm9aVzBzSUdKMWRGeHVJQ0FnSUM4dklIUm9aWEpsSjNNZ2JtOGdkR1ZqYUc1cFkyRnNJR2x6YzNWbGN5QjBieUJvWVhabElHRnVJR2x6YjJ4aGRHVmtJR2gxYm1zZ2QybDBhRzkxZENCbWFXeGxJR2hsWVdSbGNseHVJQ0FnSUhCaGNuTmxSbWxzWlVobFlXUmxjaWhwYm1SbGVDazdYRzRnSUNBZ2NHRnljMlZHYVd4bFNHVmhaR1Z5S0dsdVpHVjRLVHRjYmx4dUlDQWdJQzh2SUZCaGNuTmxJR2gxYm10elhHNGdJQ0FnYVc1a1pYZ3VhSFZ1YTNNZ1BTQmJYVHRjYmx4dUlDQWdJSGRvYVd4bElDaHBJRHdnWkdsbVpuTjBjaTVzWlc1bmRHZ3BJSHRjYmlBZ0lDQWdJR3hsZENCc2FXNWxJRDBnWkdsbVpuTjBjbHRwWFR0Y2JseHVJQ0FnSUNBZ2FXWWdLQ2d2WGloSmJtUmxlRHA4WkdsbVpueGNYQzFjWEMxY1hDMThYRndyWEZ3clhGd3JLVnhjY3k4cExuUmxjM1FvYkdsdVpTa3BJSHRjYmlBZ0lDQWdJQ0FnWW5KbFlXczdYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2FXWWdLQ2d2WGtCQUx5a3VkR1Z6ZENoc2FXNWxLU2tnZTF4dUlDQWdJQ0FnSUNCcGJtUmxlQzVvZFc1cmN5NXdkWE5vS0hCaGNuTmxTSFZ1YXlncEtUdGNiaUFnSUNBZ0lIMGdaV3h6WlNCcFppQW9iR2x1WlNBbUppQnZjSFJwYjI1ekxuTjBjbWxqZENrZ2UxeHVJQ0FnSUNBZ0lDQXZMeUJKWjI1dmNtVWdkVzVsZUhCbFkzUmxaQ0JqYjI1MFpXNTBJSFZ1YkdWemN5QnBiaUJ6ZEhKcFkzUWdiVzlrWlZ4dUlDQWdJQ0FnSUNCMGFISnZkeUJ1WlhjZ1JYSnliM0lvSjFWdWEyNXZkMjRnYkdsdVpTQW5JQ3NnS0drZ0t5QXhLU0FySUNjZ0p5QXJJRXBUVDA0dWMzUnlhVzVuYVdaNUtHeHBibVVwS1R0Y2JpQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUdrckt6dGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNGdJSDFjYmx4dUlDQXZMeUJRWVhKelpYTWdkR2hsSUMwdExTQmhibVFnS3lzcklHaGxZV1JsY25Nc0lHbG1JRzV2Ym1VZ1lYSmxJR1p2ZFc1a0xDQnVieUJzYVc1bGMxeHVJQ0F2THlCaGNtVWdZMjl1YzNWdFpXUXVYRzRnSUdaMWJtTjBhVzl1SUhCaGNuTmxSbWxzWlVobFlXUmxjaWhwYm1SbGVDa2dlMXh1SUNBZ0lHTnZibk4wSUdacGJHVklaV0ZrWlhJZ1BTQW9MMTRvTFMwdGZGeGNLMXhjSzF4Y0t5bGNYSE1yS0M0cUtTUXZLUzVsZUdWaktHUnBabVp6ZEhKYmFWMHBPMXh1SUNBZ0lHbG1JQ2htYVd4bFNHVmhaR1Z5S1NCN1hHNGdJQ0FnSUNCc1pYUWdhMlY1VUhKbFptbDRJRDBnWm1sc1pVaGxZV1JsY2xzeFhTQTlQVDBnSnkwdExTY2dQeUFuYjJ4a0p5QTZJQ2R1Wlhjbk8xeHVJQ0FnSUNBZ1kyOXVjM1FnWkdGMFlTQTlJR1pwYkdWSVpXRmtaWEpiTWwwdWMzQnNhWFFvSjF4Y2RDY3NJRElwTzF4dUlDQWdJQ0FnYkdWMElHWnBiR1ZPWVcxbElEMGdaR0YwWVZzd1hTNXlaWEJzWVdObEtDOWNYRnhjWEZ4Y1hDOW5MQ0FuWEZ4Y1hDY3BPMXh1SUNBZ0lDQWdhV1lnS0Nndlhsd2lMaXBjSWlRdktTNTBaWE4wS0dacGJHVk9ZVzFsS1NrZ2UxeHVJQ0FnSUNBZ0lDQm1hV3hsVG1GdFpTQTlJR1pwYkdWT1lXMWxMbk4xWW5OMGNpZ3hMQ0JtYVd4bFRtRnRaUzVzWlc1bmRHZ2dMU0F5S1R0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0FnSUdsdVpHVjRXMnRsZVZCeVpXWnBlQ0FySUNkR2FXeGxUbUZ0WlNkZElEMGdabWxzWlU1aGJXVTdYRzRnSUNBZ0lDQnBibVJsZUZ0clpYbFFjbVZtYVhnZ0t5QW5TR1ZoWkdWeUoxMGdQU0FvWkdGMFlWc3hYU0I4ZkNBbkp5a3VkSEpwYlNncE8xeHVYRzRnSUNBZ0lDQnBLeXM3WEc0Z0lDQWdmVnh1SUNCOVhHNWNiaUFnTHk4Z1VHRnljMlZ6SUdFZ2FIVnVhMXh1SUNBdkx5QlVhR2x6SUdGemMzVnRaWE1nZEdoaGRDQjNaU0JoY21VZ1lYUWdkR2hsSUhOMFlYSjBJRzltSUdFZ2FIVnVheTVjYmlBZ1puVnVZM1JwYjI0Z2NHRnljMlZJZFc1cktDa2dlMXh1SUNBZ0lHeGxkQ0JqYUhWdWEwaGxZV1JsY2tsdVpHVjRJRDBnYVN4Y2JpQWdJQ0FnSUNBZ1kyaDFibXRJWldGa1pYSk1hVzVsSUQwZ1pHbG1abk4wY2x0cEt5dGRMRnh1SUNBZ0lDQWdJQ0JqYUhWdWEwaGxZV1JsY2lBOUlHTm9kVzVyU0dWaFpHVnlUR2x1WlM1emNHeHBkQ2d2UUVBZ0xTaGNYR1FyS1NnL09pd29YRnhrS3lrcFB5QmNYQ3NvWEZ4a0t5a29Qem9zS0Z4Y1pDc3BLVDhnUUVBdktUdGNibHh1SUNBZ0lHeGxkQ0JvZFc1cklEMGdlMXh1SUNBZ0lDQWdiMnhrVTNSaGNuUTZJQ3RqYUhWdWEwaGxZV1JsY2xzeFhTeGNiaUFnSUNBZ0lHOXNaRXhwYm1Wek9pQjBlWEJsYjJZZ1kyaDFibXRJWldGa1pYSmJNbDBnUFQwOUlDZDFibVJsWm1sdVpXUW5JRDhnTVNBNklDdGphSFZ1YTBobFlXUmxjbHN5WFN4Y2JpQWdJQ0FnSUc1bGQxTjBZWEowT2lBclkyaDFibXRJWldGa1pYSmJNMTBzWEc0Z0lDQWdJQ0J1WlhkTWFXNWxjem9nZEhsd1pXOW1JR05vZFc1clNHVmhaR1Z5V3pSZElEMDlQU0FuZFc1a1pXWnBibVZrSnlBL0lERWdPaUFyWTJoMWJtdElaV0ZrWlhKYk5GMHNYRzRnSUNBZ0lDQnNhVzVsY3pvZ1cxMHNYRzRnSUNBZ0lDQnNhVzVsWkdWc2FXMXBkR1Z5Y3pvZ1cxMWNiaUFnSUNCOU8xeHVYRzRnSUNBZ0x5OGdWVzVwWm1sbFpDQkVhV1ptSUVadmNtMWhkQ0J4ZFdseWF6b2dTV1lnZEdobElHTm9kVzVySUhOcGVtVWdhWE1nTUN4Y2JpQWdJQ0F2THlCMGFHVWdabWx5YzNRZ2JuVnRZbVZ5SUdseklHOXVaU0JzYjNkbGNpQjBhR0Z1SUc5dVpTQjNiM1ZzWkNCbGVIQmxZM1F1WEc0Z0lDQWdMeThnYUhSMGNITTZMeTkzZDNjdVlYSjBhVzFoTG1OdmJTOTNaV0pzYjJkekwzWnBaWGR3YjNOMExtcHpjRDkwYUhKbFlXUTlNVFkwTWprelhHNGdJQ0FnYVdZZ0tHaDFibXN1YjJ4a1RHbHVaWE1nUFQwOUlEQXBJSHRjYmlBZ0lDQWdJR2gxYm1zdWIyeGtVM1JoY25RZ0t6MGdNVHRjYmlBZ0lDQjlYRzRnSUNBZ2FXWWdLR2gxYm1zdWJtVjNUR2x1WlhNZ1BUMDlJREFwSUh0Y2JpQWdJQ0FnSUdoMWJtc3VibVYzVTNSaGNuUWdLejBnTVR0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0JzWlhRZ1lXUmtRMjkxYm5RZ1BTQXdMRnh1SUNBZ0lDQWdJQ0J5WlcxdmRtVkRiM1Z1ZENBOUlEQTdYRzRnSUNBZ1ptOXlJQ2c3SUdrZ1BDQmthV1ptYzNSeUxteGxibWQwYURzZ2FTc3JLU0I3WEc0Z0lDQWdJQ0F2THlCTWFXNWxjeUJ6ZEdGeWRHbHVaeUIzYVhSb0lDY3RMUzBuSUdOdmRXeGtJR0psSUcxcGMzUmhhMlZ1SUdadmNpQjBhR1VnWENKeVpXMXZkbVVnYkdsdVpWd2lJRzl3WlhKaGRHbHZibHh1SUNBZ0lDQWdMeThnUW5WMElIUm9aWGtnWTI5MWJHUWdZbVVnZEdobElHaGxZV1JsY2lCbWIzSWdkR2hsSUc1bGVIUWdabWxzWlM0Z1ZHaGxjbVZtYjNKbElIQnlkVzVsSUhOMVkyZ2dZMkZ6WlhNZ2IzVjBMbHh1SUNBZ0lDQWdhV1lnS0dScFptWnpkSEpiYVYwdWFXNWtaWGhQWmlnbkxTMHRJQ2NwSUQwOVBTQXdYRzRnSUNBZ0lDQWdJQ0FnSUNBbUppQW9hU0FySURJZ1BDQmthV1ptYzNSeUxteGxibWQwYUNsY2JpQWdJQ0FnSUNBZ0lDQWdJQ1ltSUdScFptWnpkSEpiYVNBcklERmRMbWx1WkdWNFQyWW9KeXNyS3lBbktTQTlQVDBnTUZ4dUlDQWdJQ0FnSUNBZ0lDQWdKaVlnWkdsbVpuTjBjbHRwSUNzZ01sMHVhVzVrWlhoUFppZ25RRUFuS1NBOVBUMGdNQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lHSnlaV0ZyTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJQ0FnYkdWMElHOXdaWEpoZEdsdmJpQTlJQ2hrYVdabWMzUnlXMmxkTG14bGJtZDBhQ0E5UFNBd0lDWW1JR2tnSVQwZ0tHUnBabVp6ZEhJdWJHVnVaM1JvSUMwZ01Ta3BJRDhnSnlBbklEb2daR2xtWm5OMGNsdHBYVnN3WFR0Y2JseHVJQ0FnSUNBZ2FXWWdLRzl3WlhKaGRHbHZiaUE5UFQwZ0p5c25JSHg4SUc5d1pYSmhkR2x2YmlBOVBUMGdKeTBuSUh4OElHOXdaWEpoZEdsdmJpQTlQVDBnSnlBbklIeDhJRzl3WlhKaGRHbHZiaUE5UFQwZ0oxeGNYRnduS1NCN1hHNGdJQ0FnSUNBZ0lHaDFibXN1YkdsdVpYTXVjSFZ6YUNoa2FXWm1jM1J5VzJsZEtUdGNiaUFnSUNBZ0lDQWdhSFZ1YXk1c2FXNWxaR1ZzYVcxcGRHVnljeTV3ZFhOb0tHUmxiR2x0YVhSbGNuTmJhVjBnZkh3Z0oxeGNiaWNwTzF4dVhHNGdJQ0FnSUNBZ0lHbG1JQ2h2Y0dWeVlYUnBiMjRnUFQwOUlDY3JKeWtnZTF4dUlDQWdJQ0FnSUNBZ0lHRmtaRU52ZFc1MEt5czdYRzRnSUNBZ0lDQWdJSDBnWld4elpTQnBaaUFvYjNCbGNtRjBhVzl1SUQwOVBTQW5MU2NwSUh0Y2JpQWdJQ0FnSUNBZ0lDQnlaVzF2ZG1WRGIzVnVkQ3NyTzF4dUlDQWdJQ0FnSUNCOUlHVnNjMlVnYVdZZ0tHOXdaWEpoZEdsdmJpQTlQVDBnSnlBbktTQjdYRzRnSUNBZ0lDQWdJQ0FnWVdSa1EyOTFiblFyS3p0Y2JpQWdJQ0FnSUNBZ0lDQnlaVzF2ZG1WRGIzVnVkQ3NyTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNCaWNtVmhhenRjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlYRzVjYmlBZ0lDQXZMeUJJWVc1a2JHVWdkR2hsSUdWdGNIUjVJR0pzYjJOcklHTnZkVzUwSUdOaGMyVmNiaUFnSUNCcFppQW9JV0ZrWkVOdmRXNTBJQ1ltSUdoMWJtc3VibVYzVEdsdVpYTWdQVDA5SURFcElIdGNiaUFnSUNBZ0lHaDFibXN1Ym1WM1RHbHVaWE1nUFNBd08xeHVJQ0FnSUgxY2JpQWdJQ0JwWmlBb0lYSmxiVzkyWlVOdmRXNTBJQ1ltSUdoMWJtc3ViMnhrVEdsdVpYTWdQVDA5SURFcElIdGNiaUFnSUNBZ0lHaDFibXN1YjJ4a1RHbHVaWE1nUFNBd08xeHVJQ0FnSUgxY2JseHVJQ0FnSUM4dklGQmxjbVp2Y20wZ2IzQjBhVzl1WVd3Z2MyRnVhWFI1SUdOb1pXTnJhVzVuWEc0Z0lDQWdhV1lnS0c5d2RHbHZibk11YzNSeWFXTjBLU0I3WEc0Z0lDQWdJQ0JwWmlBb1lXUmtRMjkxYm5RZ0lUMDlJR2gxYm1zdWJtVjNUR2x1WlhNcElIdGNiaUFnSUNBZ0lDQWdkR2h5YjNjZ2JtVjNJRVZ5Y205eUtDZEJaR1JsWkNCc2FXNWxJR052ZFc1MElHUnBaQ0J1YjNRZ2JXRjBZMmdnWm05eUlHaDFibXNnWVhRZ2JHbHVaU0FuSUNzZ0tHTm9kVzVyU0dWaFpHVnlTVzVrWlhnZ0t5QXhLU2s3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdJQ0JwWmlBb2NtVnRiM1psUTI5MWJuUWdJVDA5SUdoMWJtc3ViMnhrVEdsdVpYTXBJSHRjYmlBZ0lDQWdJQ0FnZEdoeWIzY2dibVYzSUVWeWNtOXlLQ2RTWlcxdmRtVmtJR3hwYm1VZ1kyOTFiblFnWkdsa0lHNXZkQ0J0WVhSamFDQm1iM0lnYUhWdWF5QmhkQ0JzYVc1bElDY2dLeUFvWTJoMWJtdElaV0ZrWlhKSmJtUmxlQ0FySURFcEtUdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNWNiaUFnSUNCeVpYUjFjbTRnYUhWdWF6dGNiaUFnZlZ4dVhHNGdJSGRvYVd4bElDaHBJRHdnWkdsbVpuTjBjaTVzWlc1bmRHZ3BJSHRjYmlBZ0lDQndZWEp6WlVsdVpHVjRLQ2s3WEc0Z0lIMWNibHh1SUNCeVpYUjFjbTRnYkdsemREdGNibjFjYmlKZGZRPT1cbiIsICIvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5cInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7XG5cbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4vLyBJdGVyYXRvciB0aGF0IHRyYXZlcnNlcyBpbiB0aGUgcmFuZ2Ugb2YgW21pbiwgbWF4XSwgc3RlcHBpbmdcbi8vIGJ5IGRpc3RhbmNlIGZyb20gYSBnaXZlbiBzdGFydCBwb3NpdGlvbi4gSS5lLiBmb3IgWzAsIDRdLCB3aXRoXG4vLyBzdGFydCBvZiAyLCB0aGlzIHdpbGwgaXRlcmF0ZSAyLCAzLCAxLCA0LCAwLlxuZnVuY3Rpb25cbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl9kZWZhdWx0XG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuKHN0YXJ0LCBtaW5MaW5lLCBtYXhMaW5lKSB7XG4gIHZhciB3YW50Rm9yd2FyZCA9IHRydWUsXG4gICAgICBiYWNrd2FyZEV4aGF1c3RlZCA9IGZhbHNlLFxuICAgICAgZm9yd2FyZEV4aGF1c3RlZCA9IGZhbHNlLFxuICAgICAgbG9jYWxPZmZzZXQgPSAxO1xuICByZXR1cm4gZnVuY3Rpb24gaXRlcmF0b3IoKSB7XG4gICAgaWYgKHdhbnRGb3J3YXJkICYmICFmb3J3YXJkRXhoYXVzdGVkKSB7XG4gICAgICBpZiAoYmFja3dhcmRFeGhhdXN0ZWQpIHtcbiAgICAgICAgbG9jYWxPZmZzZXQrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdhbnRGb3J3YXJkID0gZmFsc2U7XG4gICAgICB9IC8vIENoZWNrIGlmIHRyeWluZyB0byBmaXQgYmV5b25kIHRleHQgbGVuZ3RoLCBhbmQgaWYgbm90LCBjaGVjayBpdCBmaXRzXG4gICAgICAvLyBhZnRlciBvZmZzZXQgbG9jYXRpb24gKG9yIGRlc2lyZWQgbG9jYXRpb24gb24gZmlyc3QgaXRlcmF0aW9uKVxuXG5cbiAgICAgIGlmIChzdGFydCArIGxvY2FsT2Zmc2V0IDw9IG1heExpbmUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsT2Zmc2V0O1xuICAgICAgfVxuXG4gICAgICBmb3J3YXJkRXhoYXVzdGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIWJhY2t3YXJkRXhoYXVzdGVkKSB7XG4gICAgICBpZiAoIWZvcndhcmRFeGhhdXN0ZWQpIHtcbiAgICAgICAgd2FudEZvcndhcmQgPSB0cnVlO1xuICAgICAgfSAvLyBDaGVjayBpZiB0cnlpbmcgdG8gZml0IGJlZm9yZSB0ZXh0IGJlZ2lubmluZywgYW5kIGlmIG5vdCwgY2hlY2sgaXQgZml0c1xuICAgICAgLy8gYmVmb3JlIG9mZnNldCBsb2NhdGlvblxuXG5cbiAgICAgIGlmIChtaW5MaW5lIDw9IHN0YXJ0IC0gbG9jYWxPZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIC1sb2NhbE9mZnNldCsrO1xuICAgICAgfVxuXG4gICAgICBiYWNrd2FyZEV4aGF1c3RlZCA9IHRydWU7XG4gICAgICByZXR1cm4gaXRlcmF0b3IoKTtcbiAgICB9IC8vIFdlIHRyaWVkIHRvIGZpdCBodW5rIGJlZm9yZSB0ZXh0IGJlZ2lubmluZyBhbmQgYmV5b25kIHRleHQgbGVuZ3RoLCB0aGVuXG4gICAgLy8gaHVuayBjYW4ndCBmaXQgb24gdGhlIHRleHQuIFJldHVybiB1bmRlZmluZWRcblxuICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMM055WXk5MWRHbHNMMlJwYzNSaGJtTmxMV2wwWlhKaGRHOXlMbXB6SWwwc0ltNWhiV1Z6SWpwYkluTjBZWEowSWl3aWJXbHVUR2x1WlNJc0ltMWhlRXhwYm1VaUxDSjNZVzUwUm05eWQyRnlaQ0lzSW1KaFkydDNZWEprUlhob1lYVnpkR1ZrSWl3aVptOXlkMkZ5WkVWNGFHRjFjM1JsWkNJc0lteHZZMkZzVDJabWMyVjBJaXdpYVhSbGNtRjBiM0lpWFN3aWJXRndjR2x1WjNNaU9pSTdPenM3T3pzN096dEJRVUZCTzBGQlEwRTdRVUZEUVR0QlFVTmxPMEZCUVVFN1FVRkJRVHRCUVVGQk8wRkJRVUVzUTBGQlUwRXNTMEZCVkN4RlFVRm5Ra01zVDBGQmFFSXNSVUZCZVVKRExFOUJRWHBDTEVWQlFXdERPMEZCUXk5RExFMUJRVWxETEZkQlFWY3NSMEZCUnl4SlFVRnNRanRCUVVGQkxFMUJRMGxETEdsQ1FVRnBRaXhIUVVGSExFdEJSSGhDTzBGQlFVRXNUVUZGU1VNc1owSkJRV2RDTEVkQlFVY3NTMEZHZGtJN1FVRkJRU3hOUVVkSlF5eFhRVUZYTEVkQlFVY3NRMEZJYkVJN1FVRkxRU3hUUVVGUExGTkJRVk5ETEZGQlFWUXNSMEZCYjBJN1FVRkRla0lzVVVGQlNVb3NWMEZCVnl4SlFVRkpMRU5CUVVORkxHZENRVUZ3UWl4RlFVRnpRenRCUVVOd1F5eFZRVUZKUkN4cFFrRkJTaXhGUVVGMVFqdEJRVU55UWtVc1VVRkJRVUVzVjBGQlZ6dEJRVU5hTEU5QlJrUXNUVUZGVHp0QlFVTk1TQ3hSUVVGQlFTeFhRVUZYTEVkQlFVY3NTMEZCWkR0QlFVTkVMRTlCVEcxRExFTkJUM0JETzBGQlEwRTdPenRCUVVOQkxGVkJRVWxJTEV0QlFVc3NSMEZCUjAwc1YwRkJVaXhKUVVGMVFrb3NUMEZCTTBJc1JVRkJiME03UVVGRGJFTXNaVUZCVDBrc1YwRkJVRHRCUVVORU96dEJRVVZFUkN4TlFVRkJRU3huUWtGQlowSXNSMEZCUnl4SlFVRnVRanRCUVVORU96dEJRVVZFTEZGQlFVa3NRMEZCUTBRc2FVSkJRVXdzUlVGQmQwSTdRVUZEZEVJc1ZVRkJTU3hEUVVGRFF5eG5Ra0ZCVEN4RlFVRjFRanRCUVVOeVFrWXNVVUZCUVVFc1YwRkJWeXhIUVVGSExFbEJRV1E3UVVGRFJDeFBRVWh4UWl4RFFVdDBRanRCUVVOQk96czdRVUZEUVN4VlFVRkpSaXhQUVVGUExFbEJRVWxFTEV0QlFVc3NSMEZCUjAwc1YwRkJka0lzUlVGQmIwTTdRVUZEYkVNc1pVRkJUeXhEUVVGRFFTeFhRVUZYTEVWQlFXNUNPMEZCUTBRN08wRkJSVVJHTEUxQlFVRkJMR2xDUVVGcFFpeEhRVUZITEVsQlFYQkNPMEZCUTBFc1lVRkJUMGNzVVVGQlVTeEZRVUZtTzBGQlEwUXNTMEU1UW5kQ0xFTkJaME42UWp0QlFVTkJPenRCUVVORUxFZEJiRU5FTzBGQmJVTkVJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpTHk4Z1NYUmxjbUYwYjNJZ2RHaGhkQ0IwY21GMlpYSnpaWE1nYVc0Z2RHaGxJSEpoYm1kbElHOW1JRnR0YVc0c0lHMWhlRjBzSUhOMFpYQndhVzVuWEc0dkx5QmllU0JrYVhOMFlXNWpaU0JtY205dElHRWdaMmwyWlc0Z2MzUmhjblFnY0c5emFYUnBiMjR1SUVrdVpTNGdabTl5SUZzd0xDQTBYU3dnZDJsMGFGeHVMeThnYzNSaGNuUWdiMllnTWl3Z2RHaHBjeUIzYVd4c0lHbDBaWEpoZEdVZ01pd2dNeXdnTVN3Z05Dd2dNQzVjYm1WNGNHOXlkQ0JrWldaaGRXeDBJR1oxYm1OMGFXOXVLSE4wWVhKMExDQnRhVzVNYVc1bExDQnRZWGhNYVc1bEtTQjdYRzRnSUd4bGRDQjNZVzUwUm05eWQyRnlaQ0E5SUhSeWRXVXNYRzRnSUNBZ0lDQmlZV05yZDJGeVpFVjRhR0YxYzNSbFpDQTlJR1poYkhObExGeHVJQ0FnSUNBZ1ptOXlkMkZ5WkVWNGFHRjFjM1JsWkNBOUlHWmhiSE5sTEZ4dUlDQWdJQ0FnYkc5allXeFBabVp6WlhRZ1BTQXhPMXh1WEc0Z0lISmxkSFZ5YmlCbWRXNWpkR2x2YmlCcGRHVnlZWFJ2Y2lncElIdGNiaUFnSUNCcFppQW9kMkZ1ZEVadmNuZGhjbVFnSmlZZ0lXWnZjbmRoY21SRmVHaGhkWE4wWldRcElIdGNiaUFnSUNBZ0lHbG1JQ2hpWVdOcmQyRnlaRVY0YUdGMWMzUmxaQ2tnZTF4dUlDQWdJQ0FnSUNCc2IyTmhiRTltWm5ObGRDc3JPMXh1SUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdkMkZ1ZEVadmNuZGhjbVFnUFNCbVlXeHpaVHRjYmlBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnTHk4Z1EyaGxZMnNnYVdZZ2RISjVhVzVuSUhSdklHWnBkQ0JpWlhsdmJtUWdkR1Y0ZENCc1pXNW5kR2dzSUdGdVpDQnBaaUJ1YjNRc0lHTm9aV05ySUdsMElHWnBkSE5jYmlBZ0lDQWdJQzh2SUdGbWRHVnlJRzltWm5ObGRDQnNiMk5oZEdsdmJpQW9iM0lnWkdWemFYSmxaQ0JzYjJOaGRHbHZiaUJ2YmlCbWFYSnpkQ0JwZEdWeVlYUnBiMjRwWEc0Z0lDQWdJQ0JwWmlBb2MzUmhjblFnS3lCc2IyTmhiRTltWm5ObGRDQThQU0J0WVhoTWFXNWxLU0I3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJzYjJOaGJFOW1abk5sZER0Y2JpQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ1ptOXlkMkZ5WkVWNGFHRjFjM1JsWkNBOUlIUnlkV1U3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdhV1lnS0NGaVlXTnJkMkZ5WkVWNGFHRjFjM1JsWkNrZ2UxeHVJQ0FnSUNBZ2FXWWdLQ0ZtYjNKM1lYSmtSWGhvWVhWemRHVmtLU0I3WEc0Z0lDQWdJQ0FnSUhkaGJuUkdiM0ozWVhKa0lEMGdkSEoxWlR0Y2JpQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0x5OGdRMmhsWTJzZ2FXWWdkSEo1YVc1bklIUnZJR1pwZENCaVpXWnZjbVVnZEdWNGRDQmlaV2RwYm01cGJtY3NJR0Z1WkNCcFppQnViM1FzSUdOb1pXTnJJR2wwSUdacGRITmNiaUFnSUNBZ0lDOHZJR0psWm05eVpTQnZabVp6WlhRZ2JHOWpZWFJwYjI1Y2JpQWdJQ0FnSUdsbUlDaHRhVzVNYVc1bElEdzlJSE4wWVhKMElDMGdiRzlqWVd4UFptWnpaWFFwSUh0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUMxc2IyTmhiRTltWm5ObGRDc3JPMXh1SUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0JpWVdOcmQyRnlaRVY0YUdGMWMzUmxaQ0E5SUhSeWRXVTdYRzRnSUNBZ0lDQnlaWFIxY200Z2FYUmxjbUYwYjNJb0tUdGNiaUFnSUNCOVhHNWNiaUFnSUNBdkx5QlhaU0IwY21sbFpDQjBieUJtYVhRZ2FIVnVheUJpWldadmNtVWdkR1Y0ZENCaVpXZHBibTVwYm1jZ1lXNWtJR0psZVc5dVpDQjBaWGgwSUd4bGJtZDBhQ3dnZEdobGJseHVJQ0FnSUM4dklHaDFibXNnWTJGdUozUWdabWwwSUc5dUlIUm9aU0IwWlhoMExpQlNaWFIxY200Z2RXNWtaV1pwYm1Wa1hHNGdJSDA3WEc1OVhHNGlYWDA9XG4iLCAiLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmFwcGx5UGF0Y2ggPSBhcHBseVBhdGNoO1xuZXhwb3J0cy5hcHBseVBhdGNoZXMgPSBhcHBseVBhdGNoZXM7XG5cbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG52YXJcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl9wYXJzZSA9IHJlcXVpcmUoXCIuL3BhcnNlXCIpXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuO1xuXG52YXJcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl9kaXN0YW5jZUl0ZXJhdG9yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vdXRpbC9kaXN0YW5jZS1pdGVyYXRvclwiKSlcbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG47XG5cbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki8gZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG5mdW5jdGlvbiBhcHBseVBhdGNoKHNvdXJjZSwgdW5pRGlmZikge1xuICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gIHZhclxuICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcblxuICBpZiAodHlwZW9mIHVuaURpZmYgPT09ICdzdHJpbmcnKSB7XG4gICAgdW5pRGlmZiA9XG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgICgwLFxuICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG5cbiAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICAgX3BhcnNlXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgICAuXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgIHBhcnNlUGF0Y2gpXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgICAodW5pRGlmZik7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh1bmlEaWZmKSkge1xuICAgIGlmICh1bmlEaWZmLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYXBwbHlQYXRjaCBvbmx5IHdvcmtzIHdpdGggYSBzaW5nbGUgaW5wdXQuJyk7XG4gICAgfVxuXG4gICAgdW5pRGlmZiA9IHVuaURpZmZbMF07XG4gIH0gLy8gQXBwbHkgdGhlIGRpZmYgdG8gdGhlIGlucHV0XG5cblxuICB2YXIgbGluZXMgPSBzb3VyY2Uuc3BsaXQoL1xcclxcbnxbXFxuXFx2XFxmXFxyXFx4ODVdLyksXG4gICAgICBkZWxpbWl0ZXJzID0gc291cmNlLm1hdGNoKC9cXHJcXG58W1xcblxcdlxcZlxcclxceDg1XS9nKSB8fCBbXSxcbiAgICAgIGh1bmtzID0gdW5pRGlmZi5odW5rcyxcbiAgICAgIGNvbXBhcmVMaW5lID0gb3B0aW9ucy5jb21wYXJlTGluZSB8fCBmdW5jdGlvbiAobGluZU51bWJlciwgbGluZSwgb3BlcmF0aW9uLCBwYXRjaENvbnRlbnQpXG4gIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAge1xuICAgIHJldHVybiAoXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgICAgbGluZSA9PT0gcGF0Y2hDb250ZW50XG4gICAgKTtcbiAgfSxcbiAgICAgIGVycm9yQ291bnQgPSAwLFxuICAgICAgZnV6ekZhY3RvciA9IG9wdGlvbnMuZnV6ekZhY3RvciB8fCAwLFxuICAgICAgbWluTGluZSA9IDAsXG4gICAgICBvZmZzZXQgPSAwLFxuICAgICAgcmVtb3ZlRU9GTkwsXG4gICAgICBhZGRFT0ZOTDtcbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgaHVuayBleGFjdGx5IGZpdHMgb24gdGhlIHByb3ZpZGVkIGxvY2F0aW9uXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gaHVua0ZpdHMoaHVuaywgdG9Qb3MpIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGh1bmsubGluZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBsaW5lID0gaHVuay5saW5lc1tqXSxcbiAgICAgICAgICBvcGVyYXRpb24gPSBsaW5lLmxlbmd0aCA+IDAgPyBsaW5lWzBdIDogJyAnLFxuICAgICAgICAgIGNvbnRlbnQgPSBsaW5lLmxlbmd0aCA+IDAgPyBsaW5lLnN1YnN0cigxKSA6IGxpbmU7XG5cbiAgICAgIGlmIChvcGVyYXRpb24gPT09ICcgJyB8fCBvcGVyYXRpb24gPT09ICctJykge1xuICAgICAgICAvLyBDb250ZXh0IHNhbml0eSBjaGVja1xuICAgICAgICBpZiAoIWNvbXBhcmVMaW5lKHRvUG9zICsgMSwgbGluZXNbdG9Qb3NdLCBvcGVyYXRpb24sIGNvbnRlbnQpKSB7XG4gICAgICAgICAgZXJyb3JDb3VudCsrO1xuXG4gICAgICAgICAgaWYgKGVycm9yQ291bnQgPiBmdXp6RmFjdG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdG9Qb3MrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyBTZWFyY2ggYmVzdCBmaXQgb2Zmc2V0cyBmb3IgZWFjaCBodW5rIGJhc2VkIG9uIHRoZSBwcmV2aW91cyBvbmVzXG5cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGh1bmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGh1bmsgPSBodW5rc1tpXSxcbiAgICAgICAgbWF4TGluZSA9IGxpbmVzLmxlbmd0aCAtIGh1bmsub2xkTGluZXMsXG4gICAgICAgIGxvY2FsT2Zmc2V0ID0gMCxcbiAgICAgICAgdG9Qb3MgPSBvZmZzZXQgKyBodW5rLm9sZFN0YXJ0IC0gMTtcbiAgICB2YXIgaXRlcmF0b3IgPVxuICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICAoMCxcbiAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgIF9kaXN0YW5jZUl0ZXJhdG9yXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgICBbXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgIFwiZGVmYXVsdFwiXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgICBdKSh0b1BvcywgbWluTGluZSwgbWF4TGluZSk7XG5cbiAgICBmb3IgKDsgbG9jYWxPZmZzZXQgIT09IHVuZGVmaW5lZDsgbG9jYWxPZmZzZXQgPSBpdGVyYXRvcigpKSB7XG4gICAgICBpZiAoaHVua0ZpdHMoaHVuaywgdG9Qb3MgKyBsb2NhbE9mZnNldCkpIHtcbiAgICAgICAgaHVuay5vZmZzZXQgPSBvZmZzZXQgKz0gbG9jYWxPZmZzZXQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChsb2NhbE9mZnNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBTZXQgbG93ZXIgdGV4dCBsaW1pdCB0byBlbmQgb2YgdGhlIGN1cnJlbnQgaHVuaywgc28gbmV4dCBvbmVzIGRvbid0IHRyeVxuICAgIC8vIHRvIGZpdCBvdmVyIGFscmVhZHkgcGF0Y2hlZCB0ZXh0XG5cblxuICAgIG1pbkxpbmUgPSBodW5rLm9mZnNldCArIGh1bmsub2xkU3RhcnQgKyBodW5rLm9sZExpbmVzO1xuICB9IC8vIEFwcGx5IHBhdGNoIGh1bmtzXG5cblxuICB2YXIgZGlmZk9mZnNldCA9IDA7XG5cbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGh1bmtzLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBfaHVuayA9IGh1bmtzW19pXSxcbiAgICAgICAgX3RvUG9zID0gX2h1bmsub2xkU3RhcnQgKyBfaHVuay5vZmZzZXQgKyBkaWZmT2Zmc2V0IC0gMTtcblxuICAgIGRpZmZPZmZzZXQgKz0gX2h1bmsubmV3TGluZXMgLSBfaHVuay5vbGRMaW5lcztcblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgX2h1bmsubGluZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBsaW5lID0gX2h1bmsubGluZXNbal0sXG4gICAgICAgICAgb3BlcmF0aW9uID0gbGluZS5sZW5ndGggPiAwID8gbGluZVswXSA6ICcgJyxcbiAgICAgICAgICBjb250ZW50ID0gbGluZS5sZW5ndGggPiAwID8gbGluZS5zdWJzdHIoMSkgOiBsaW5lLFxuICAgICAgICAgIGRlbGltaXRlciA9IF9odW5rLmxpbmVkZWxpbWl0ZXJzICYmIF9odW5rLmxpbmVkZWxpbWl0ZXJzW2pdIHx8ICdcXG4nO1xuXG4gICAgICBpZiAob3BlcmF0aW9uID09PSAnICcpIHtcbiAgICAgICAgX3RvUG9zKys7XG4gICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJy0nKSB7XG4gICAgICAgIGxpbmVzLnNwbGljZShfdG9Qb3MsIDEpO1xuICAgICAgICBkZWxpbWl0ZXJzLnNwbGljZShfdG9Qb3MsIDEpO1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT09ICcrJykge1xuICAgICAgICBsaW5lcy5zcGxpY2UoX3RvUG9zLCAwLCBjb250ZW50KTtcbiAgICAgICAgZGVsaW1pdGVycy5zcGxpY2UoX3RvUG9zLCAwLCBkZWxpbWl0ZXIpO1xuICAgICAgICBfdG9Qb3MrKztcbiAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uID09PSAnXFxcXCcpIHtcbiAgICAgICAgdmFyIHByZXZpb3VzT3BlcmF0aW9uID0gX2h1bmsubGluZXNbaiAtIDFdID8gX2h1bmsubGluZXNbaiAtIDFdWzBdIDogbnVsbDtcblxuICAgICAgICBpZiAocHJldmlvdXNPcGVyYXRpb24gPT09ICcrJykge1xuICAgICAgICAgIHJlbW92ZUVPRk5MID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChwcmV2aW91c09wZXJhdGlvbiA9PT0gJy0nKSB7XG4gICAgICAgICAgYWRkRU9GTkwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IC8vIEhhbmRsZSBFT0ZOTCBpbnNlcnRpb24vcmVtb3ZhbFxuXG5cbiAgaWYgKHJlbW92ZUVPRk5MKSB7XG4gICAgd2hpbGUgKCFsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSkge1xuICAgICAgbGluZXMucG9wKCk7XG4gICAgICBkZWxpbWl0ZXJzLnBvcCgpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChhZGRFT0ZOTCkge1xuICAgIGxpbmVzLnB1c2goJycpO1xuICAgIGRlbGltaXRlcnMucHVzaCgnXFxuJyk7XG4gIH1cblxuICBmb3IgKHZhciBfayA9IDA7IF9rIDwgbGluZXMubGVuZ3RoIC0gMTsgX2srKykge1xuICAgIGxpbmVzW19rXSA9IGxpbmVzW19rXSArIGRlbGltaXRlcnNbX2tdO1xuICB9XG5cbiAgcmV0dXJuIGxpbmVzLmpvaW4oJycpO1xufSAvLyBXcmFwcGVyIHRoYXQgc3VwcG9ydHMgbXVsdGlwbGUgZmlsZSBwYXRjaGVzIHZpYSBjYWxsYmFja3MuXG5cblxuZnVuY3Rpb24gYXBwbHlQYXRjaGVzKHVuaURpZmYsIG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiB1bmlEaWZmID09PSAnc3RyaW5nJykge1xuICAgIHVuaURpZmYgPVxuICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICAoMCxcbiAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgIF9wYXJzZVxuICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gICAgLlxuICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICBwYXJzZVBhdGNoKVxuICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gICAgKHVuaURpZmYpO1xuICB9XG5cbiAgdmFyIGN1cnJlbnRJbmRleCA9IDA7XG5cbiAgZnVuY3Rpb24gcHJvY2Vzc0luZGV4KCkge1xuICAgIHZhciBpbmRleCA9IHVuaURpZmZbY3VycmVudEluZGV4KytdO1xuXG4gICAgaWYgKCFpbmRleCkge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBvcHRpb25zLmxvYWRGaWxlKGluZGV4LCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLmNvbXBsZXRlKGVycik7XG4gICAgICB9XG5cbiAgICAgIHZhciB1cGRhdGVkQ29udGVudCA9IGFwcGx5UGF0Y2goZGF0YSwgaW5kZXgsIG9wdGlvbnMpO1xuICAgICAgb3B0aW9ucy5wYXRjaGVkKGluZGV4LCB1cGRhdGVkQ29udGVudCwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGxldGUoZXJyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByb2Nlc3NJbmRleCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcm9jZXNzSW5kZXgoKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OXdZWFJqYUM5aGNIQnNlUzVxY3lKZExDSnVZVzFsY3lJNld5SmhjSEJzZVZCaGRHTm9JaXdpYzI5MWNtTmxJaXdpZFc1cFJHbG1aaUlzSW05d2RHbHZibk1pTENKd1lYSnpaVkJoZEdOb0lpd2lRWEp5WVhraUxDSnBjMEZ5Y21GNUlpd2liR1Z1WjNSb0lpd2lSWEp5YjNJaUxDSnNhVzVsY3lJc0luTndiR2wwSWl3aVpHVnNhVzFwZEdWeWN5SXNJbTFoZEdOb0lpd2lhSFZ1YTNNaUxDSmpiMjF3WVhKbFRHbHVaU0lzSW14cGJtVk9kVzFpWlhJaUxDSnNhVzVsSWl3aWIzQmxjbUYwYVc5dUlpd2ljR0YwWTJoRGIyNTBaVzUwSWl3aVpYSnliM0pEYjNWdWRDSXNJbVoxZW5wR1lXTjBiM0lpTENKdGFXNU1hVzVsSWl3aWIyWm1jMlYwSWl3aWNtVnRiM1psUlU5R1Rrd2lMQ0poWkdSRlQwWk9UQ0lzSW1oMWJtdEdhWFJ6SWl3aWFIVnVheUlzSW5SdlVHOXpJaXdpYWlJc0ltTnZiblJsYm5RaUxDSnpkV0p6ZEhJaUxDSnBJaXdpYldGNFRHbHVaU0lzSW05c1pFeHBibVZ6SWl3aWJHOWpZV3hQWm1aelpYUWlMQ0p2YkdSVGRHRnlkQ0lzSW1sMFpYSmhkRzl5SWl3aVpHbHpkR0Z1WTJWSmRHVnlZWFJ2Y2lJc0luVnVaR1ZtYVc1bFpDSXNJbVJwWm1aUFptWnpaWFFpTENKdVpYZE1hVzVsY3lJc0ltUmxiR2x0YVhSbGNpSXNJbXhwYm1Wa1pXeHBiV2wwWlhKeklpd2ljM0JzYVdObElpd2ljSEpsZG1sdmRYTlBjR1Z5WVhScGIyNGlMQ0p3YjNBaUxDSndkWE5vSWl3aVgyc2lMQ0pxYjJsdUlpd2lZWEJ3YkhsUVlYUmphR1Z6SWl3aVkzVnljbVZ1ZEVsdVpHVjRJaXdpY0hKdlkyVnpjMGx1WkdWNElpd2lhVzVrWlhnaUxDSmpiMjF3YkdWMFpTSXNJbXh2WVdSR2FXeGxJaXdpWlhKeUlpd2laR0YwWVNJc0luVndaR0YwWldSRGIyNTBaVzUwSWl3aWNHRjBZMmhsWkNKZExDSnRZWEJ3YVc1bmN5STZJanM3T3pzN096czdPenRCUVVGQk8wRkJRVUU3UVVGQlFUdEJRVUZCTzBGQlFVRTdPMEZCUTBFN1FVRkJRVHRCUVVGQk8wRkJRVUU3UVVGQlFUczdPenM3UVVGRlR5eFRRVUZUUVN4VlFVRlVMRU5CUVc5Q1F5eE5RVUZ3UWl4RlFVRTBRa01zVDBGQk5VSXNSVUZCYlVRN1FVRkJRVHRCUVVGQk8wRkJRVUU3UVVGQlpFTXNSVUZCUVVFc1QwRkJZeXgxUlVGQlNpeEZRVUZKT3p0QlFVTjRSQ3hOUVVGSkxFOUJRVTlFTEU5QlFWQXNTMEZCYlVJc1VVRkJka0lzUlVGQmFVTTdRVUZETDBKQkxFbEJRVUZCTEU5QlFVODdRVUZCUnp0QlFVRkJPMEZCUVVFN08wRkJRVUZGTzBGQlFVRkJPMEZCUVVGQk8wRkJRVUZCTzBGQlFVRkJPMEZCUVVGQk8wRkJRVUU3UVVGQlFTeExRVUZYUml4UFFVRllMRU5CUVZZN1FVRkRSRHM3UVVGRlJDeE5RVUZKUnl4TFFVRkxMRU5CUVVORExFOUJRVTRzUTBGQlkwb3NUMEZCWkN4RFFVRktMRVZCUVRSQ08wRkJRekZDTEZGQlFVbEJMRTlCUVU4c1EwRkJRMHNzVFVGQlVpeEhRVUZwUWl4RFFVRnlRaXhGUVVGM1FqdEJRVU4wUWl4WlFVRk5MRWxCUVVsRExFdEJRVW9zUTBGQlZTdzBRMEZCVml4RFFVRk9PMEZCUTBRN08wRkJSVVJPTEVsQlFVRkJMRTlCUVU4c1IwRkJSMEVzVDBGQlR5eERRVUZETEVOQlFVUXNRMEZCYWtJN1FVRkRSQ3hIUVZoMVJDeERRV0Y0UkRzN08wRkJRMEVzVFVGQlNVOHNTMEZCU3l4SFFVRkhVaXhOUVVGTkxFTkJRVU5UTEV0QlFWQXNRMEZCWVN4eFFrRkJZaXhEUVVGYU8wRkJRVUVzVFVGRFNVTXNWVUZCVlN4SFFVRkhWaXhOUVVGTkxFTkJRVU5YTEV0QlFWQXNRMEZCWVN4elFrRkJZaXhMUVVGM1F5eEZRVVI2UkR0QlFVRkJMRTFCUlVsRExFdEJRVXNzUjBGQlIxZ3NUMEZCVHl4RFFVRkRWeXhMUVVad1FqdEJRVUZCTEUxQlNVbERMRmRCUVZjc1IwRkJSMWdzVDBGQlR5eERRVUZEVnl4WFFVRlNMRWxCUVhkQ0xGVkJRVU5ETEZWQlFVUXNSVUZCWVVNc1NVRkJZaXhGUVVGdFFrTXNVMEZCYmtJc1JVRkJPRUpETEZsQlFUbENPMEZCUVVFN1FVRkJRVHRCUVVGQk8wRkJRVUU3UVVGQkswTkdMRTFCUVVGQkxFbEJRVWtzUzBGQlMwVTdRVUZCZUVRN1FVRkJRU3hIUVVveFF6dEJRVUZCTEUxQlMwbERMRlZCUVZVc1IwRkJSeXhEUVV4cVFqdEJRVUZCTEUxQlRVbERMRlZCUVZVc1IwRkJSMnBDTEU5QlFVOHNRMEZCUTJsQ0xGVkJRVklzU1VGQmMwSXNRMEZPZGtNN1FVRkJRU3hOUVU5SlF5eFBRVUZQTEVkQlFVY3NRMEZRWkR0QlFVRkJMRTFCVVVsRExFMUJRVTBzUjBGQlJ5eERRVkppTzBGQlFVRXNUVUZWU1VNc1YwRldTanRCUVVGQkxFMUJWMGxETEZGQldFbzdRVUZoUVRzN096czdRVUZIUVN4WFFVRlRReXhSUVVGVUxFTkJRV3RDUXl4SlFVRnNRaXhGUVVGM1FrTXNTMEZCZUVJc1JVRkJLMEk3UVVGRE4wSXNVMEZCU3l4SlFVRkpReXhEUVVGRExFZEJRVWNzUTBGQllpeEZRVUZuUWtFc1EwRkJReXhIUVVGSFJpeEpRVUZKTEVOQlFVTnFRaXhMUVVGTUxFTkJRVmRHTEUxQlFTOUNMRVZCUVhWRGNVSXNRMEZCUXl4RlFVRjRReXhGUVVFMFF6dEJRVU14UXl4VlFVRkpXaXhKUVVGSkxFZEJRVWRWTEVsQlFVa3NRMEZCUTJwQ0xFdEJRVXdzUTBGQlYyMUNMRU5CUVZnc1EwRkJXRHRCUVVGQkxGVkJRMGxZTEZOQlFWTXNSMEZCU1VRc1NVRkJTU3hEUVVGRFZDeE5RVUZNTEVkQlFXTXNRMEZCWkN4SFFVRnJRbE1zU1VGQlNTeERRVUZETEVOQlFVUXNRMEZCZEVJc1IwRkJORUlzUjBGRU4wTTdRVUZCUVN4VlFVVkpZU3hQUVVGUExFZEJRVWxpTEVsQlFVa3NRMEZCUTFRc1RVRkJUQ3hIUVVGakxFTkJRV1FzUjBGQmEwSlRMRWxCUVVrc1EwRkJRMk1zVFVGQlRDeERRVUZaTEVOQlFWb3NRMEZCYkVJc1IwRkJiVU5rTEVsQlJteEVPenRCUVVsQkxGVkJRVWxETEZOQlFWTXNTMEZCU3l4SFFVRmtMRWxCUVhGQ1FTeFRRVUZUTEV0QlFVc3NSMEZCZGtNc1JVRkJORU03UVVGRE1VTTdRVUZEUVN4WlFVRkpMRU5CUVVOSUxGZEJRVmNzUTBGQlEyRXNTMEZCU3l4SFFVRkhMRU5CUVZRc1JVRkJXV3hDTEV0QlFVc3NRMEZCUTJ0Q0xFdEJRVVFzUTBGQmFrSXNSVUZCTUVKV0xGTkJRVEZDTEVWQlFYRkRXU3hQUVVGeVF5eERRVUZvUWl4RlFVRXJSRHRCUVVNM1JGWXNWVUZCUVVFc1ZVRkJWVHM3UVVGRlZpeGpRVUZKUVN4VlFVRlZMRWRCUVVkRExGVkJRV3BDTEVWQlFUWkNPMEZCUXpOQ0xHMUNRVUZQTEV0QlFWQTdRVUZEUkR0QlFVTkdPenRCUVVORVR5eFJRVUZCUVN4TFFVRkxPMEZCUTA0N1FVRkRSanM3UVVGRlJDeFhRVUZQTEVsQlFWQTdRVUZEUkN4SFFXeEVkVVFzUTBGdlJIaEVPenM3UVVGRFFTeFBRVUZMTEVsQlFVbEpMRU5CUVVNc1IwRkJSeXhEUVVGaUxFVkJRV2RDUVN4RFFVRkRMRWRCUVVkc1FpeExRVUZMTEVOQlFVTk9MRTFCUVRGQ0xFVkJRV3REZDBJc1EwRkJReXhGUVVGdVF5eEZRVUYxUXp0QlFVTnlReXhSUVVGSlRDeEpRVUZKTEVkQlFVZGlMRXRCUVVzc1EwRkJRMnRDTEVOQlFVUXNRMEZCYUVJN1FVRkJRU3hSUVVOSlF5eFBRVUZQTEVkQlFVZDJRaXhMUVVGTExFTkJRVU5HTEUxQlFVNHNSMEZCWlcxQ0xFbEJRVWtzUTBGQlEwOHNVVUZFYkVNN1FVRkJRU3hSUVVWSlF5eFhRVUZYTEVkQlFVY3NRMEZHYkVJN1FVRkJRU3hSUVVkSlVDeExRVUZMTEVkQlFVZE1MRTFCUVUwc1IwRkJSMGtzU1VGQlNTeERRVUZEVXl4UlFVRmtMRWRCUVhsQ0xFTkJTSEpETzBGQlMwRXNVVUZCU1VNc1VVRkJVVHRCUVVGSE8wRkJRVUU3UVVGQlFUczdRVUZCUVVNN1FVRkJRVUU3UVVGQlFVRTdRVUZCUVVFN1FVRkJRVUU3UVVGQlFVRTdRVUZCUVVFN1FVRkJRVUVzVDBGQmFVSldMRXRCUVdwQ0xFVkJRWGRDVGl4UFFVRjRRaXhGUVVGcFExY3NUMEZCYWtNc1EwRkJaanM3UVVGRlFTeFhRVUZQUlN4WFFVRlhMRXRCUVV0SkxGTkJRWFpDTEVWQlFXdERTaXhYUVVGWExFZEJRVWRGTEZGQlFWRXNSVUZCZUVRc1JVRkJORVE3UVVGRE1VUXNWVUZCU1Znc1VVRkJVU3hEUVVGRFF5eEpRVUZFTEVWQlFVOURMRXRCUVVzc1IwRkJSMDhzVjBGQlppeERRVUZhTEVWQlFYbERPMEZCUTNaRFVpeFJRVUZCUVN4SlFVRkpMRU5CUVVOS0xFMUJRVXdzUjBGQlkwRXNUVUZCVFN4SlFVRkpXU3hYUVVGNFFqdEJRVU5CTzBGQlEwUTdRVUZEUmpzN1FVRkZSQ3hSUVVGSlFTeFhRVUZYTEV0QlFVdEpMRk5CUVhCQ0xFVkJRU3RDTzBGQlF6ZENMR0ZCUVU4c1MwRkJVRHRCUVVORUxFdEJha0p2UXl4RFFXMUNja003UVVGRFFUczdPMEZCUTBGcVFpeEpRVUZCUVN4UFFVRlBMRWRCUVVkTExFbEJRVWtzUTBGQlEwb3NUVUZCVEN4SFFVRmpTU3hKUVVGSkxFTkJRVU5UTEZGQlFXNUNMRWRCUVRoQ1ZDeEpRVUZKTEVOQlFVTlBMRkZCUVRkRE8wRkJRMFFzUjBFelJYVkVMRU5CTmtWNFJEczdPMEZCUTBFc1RVRkJTVTBzVlVGQlZTeEhRVUZITEVOQlFXcENPenRCUVVOQkxFOUJRVXNzU1VGQlNWSXNSVUZCUXl4SFFVRkhMRU5CUVdJc1JVRkJaMEpCTEVWQlFVTXNSMEZCUjJ4Q0xFdEJRVXNzUTBGQlEwNHNUVUZCTVVJc1JVRkJhME4zUWl4RlFVRkRMRVZCUVc1RExFVkJRWFZETzBGQlEzSkRMRkZCUVVsTUxFdEJRVWtzUjBGQlIySXNTMEZCU3l4RFFVRkRhMElzUlVGQlJDeERRVUZvUWp0QlFVRkJMRkZCUTBsS0xFMUJRVXNzUjBGQlIwUXNTMEZCU1N4RFFVRkRVeXhSUVVGTUxFZEJRV2RDVkN4TFFVRkpMRU5CUVVOS0xFMUJRWEpDTEVkQlFUaENhVUlzVlVGQk9VSXNSMEZCTWtNc1EwRkVka1E3TzBGQlJVRkJMRWxCUVVGQkxGVkJRVlVzU1VGQlNXSXNTMEZCU1N4RFFVRkRZeXhSUVVGTUxFZEJRV2RDWkN4TFFVRkpMRU5CUVVOUExGRkJRVzVET3p0QlFVVkJMRk5CUVVzc1NVRkJTVXdzUTBGQlF5eEhRVUZITEVOQlFXSXNSVUZCWjBKQkxFTkJRVU1zUjBGQlIwWXNTMEZCU1N4RFFVRkRha0lzUzBGQlRDeERRVUZYUml4TlFVRXZRaXhGUVVGMVEzRkNMRU5CUVVNc1JVRkJlRU1zUlVGQk5FTTdRVUZETVVNc1ZVRkJTVm9zU1VGQlNTeEhRVUZIVlN4TFFVRkpMRU5CUVVOcVFpeExRVUZNTEVOQlFWZHRRaXhEUVVGWUxFTkJRVmc3UVVGQlFTeFZRVU5KV0N4VFFVRlRMRWRCUVVsRUxFbEJRVWtzUTBGQlExUXNUVUZCVEN4SFFVRmpMRU5CUVdRc1IwRkJhMEpUTEVsQlFVa3NRMEZCUXl4RFFVRkVMRU5CUVhSQ0xFZEJRVFJDTEVkQlJEZERPMEZCUVVFc1ZVRkZTV0VzVDBGQlR5eEhRVUZKWWl4SlFVRkpMRU5CUVVOVUxFMUJRVXdzUjBGQll5eERRVUZrTEVkQlFXdENVeXhKUVVGSkxFTkJRVU5qTEUxQlFVd3NRMEZCV1N4RFFVRmFMRU5CUVd4Q0xFZEJRVzFEWkN4SlFVWnNSRHRCUVVGQkxGVkJSMGw1UWl4VFFVRlRMRWRCUVVkbUxFdEJRVWtzUTBGQlEyZENMR05CUVV3c1NVRkJkVUpvUWl4TFFVRkpMRU5CUVVOblFpeGpRVUZNTEVOQlFXOUNaQ3hEUVVGd1FpeERRVUYyUWl4SlFVRnBSQ3hKUVVocVJUczdRVUZMUVN4VlFVRkpXQ3hUUVVGVExFdEJRVXNzUjBGQmJFSXNSVUZCZFVJN1FVRkRja0pWTEZGQlFVRkJMRTFCUVVzN1FVRkRUaXhQUVVaRUxFMUJSVThzU1VGQlNWWXNVMEZCVXl4TFFVRkxMRWRCUVd4Q0xFVkJRWFZDTzBGQlF6VkNVaXhSUVVGQlFTeExRVUZMTEVOQlFVTnJReXhOUVVGT0xFTkJRV0ZvUWl4TlFVRmlMRVZCUVc5Q0xFTkJRWEJDTzBGQlEwRm9RaXhSUVVGQlFTeFZRVUZWTEVOQlFVTm5ReXhOUVVGWUxFTkJRV3RDYUVJc1RVRkJiRUlzUlVGQmVVSXNRMEZCZWtJN1FVRkRSanRCUVVORExFOUJTazBzVFVGSlFTeEpRVUZKVml4VFFVRlRMRXRCUVVzc1IwRkJiRUlzUlVGQmRVSTdRVUZETlVKU0xGRkJRVUZCTEV0QlFVc3NRMEZCUTJ0RExFMUJRVTRzUTBGQllXaENMRTFCUVdJc1JVRkJiMElzUTBGQmNFSXNSVUZCZFVKRkxFOUJRWFpDTzBGQlEwRnNRaXhSUVVGQlFTeFZRVUZWTEVOQlFVTm5ReXhOUVVGWUxFTkJRV3RDYUVJc1RVRkJiRUlzUlVGQmVVSXNRMEZCZWtJc1JVRkJORUpqTEZOQlFUVkNPMEZCUTBGa0xGRkJRVUZCTEUxQlFVczdRVUZEVGl4UFFVcE5MRTFCU1VFc1NVRkJTVllzVTBGQlV5eExRVUZMTEVsQlFXeENMRVZCUVhkQ08wRkJRemRDTEZsQlFVa3lRaXhwUWtGQmFVSXNSMEZCUjJ4Q0xFdEJRVWtzUTBGQlEycENMRXRCUVV3c1EwRkJWMjFDTEVOQlFVTXNSMEZCUnl4RFFVRm1MRWxCUVc5Q1JpeExRVUZKTEVOQlFVTnFRaXhMUVVGTUxFTkJRVmR0UWl4RFFVRkRMRWRCUVVjc1EwRkJaaXhGUVVGclFpeERRVUZzUWl4RFFVRndRaXhIUVVFeVF5eEpRVUZ1UlRzN1FVRkRRU3haUVVGSlowSXNhVUpCUVdsQ0xFdEJRVXNzUjBGQk1VSXNSVUZCSzBJN1FVRkROMEp5UWl4VlFVRkJRU3hYUVVGWExFZEJRVWNzU1VGQlpEdEJRVU5FTEZOQlJrUXNUVUZGVHl4SlFVRkpjVUlzYVVKQlFXbENMRXRCUVVzc1IwRkJNVUlzUlVGQkswSTdRVUZEY0VOd1FpeFZRVUZCUVN4UlFVRlJMRWRCUVVjc1NVRkJXRHRCUVVORU8wRkJRMFk3UVVGRFJqdEJRVU5HTEVkQk4wZDFSQ3hEUVN0SGVFUTdPenRCUVVOQkxFMUJRVWxFTEZkQlFVb3NSVUZCYVVJN1FVRkRaaXhYUVVGUExFTkJRVU5rTEV0QlFVc3NRMEZCUTBFc1MwRkJTeXhEUVVGRFJpeE5RVUZPTEVkQlFXVXNRMEZCYUVJc1EwRkJZaXhGUVVGcFF6dEJRVU12UWtVc1RVRkJRVUVzUzBGQlN5eERRVUZEYjBNc1IwRkJUanRCUVVOQmJFTXNUVUZCUVVFc1ZVRkJWU3hEUVVGRGEwTXNSMEZCV0R0QlFVTkVPMEZCUTBZc1IwRk1SQ3hOUVV0UExFbEJRVWx5UWl4UlFVRktMRVZCUVdNN1FVRkRia0ptTEVsQlFVRkJMRXRCUVVzc1EwRkJRM0ZETEVsQlFVNHNRMEZCVnl4RlFVRllPMEZCUTBGdVF5eEpRVUZCUVN4VlFVRlZMRU5CUVVOdFF5eEpRVUZZTEVOQlFXZENMRWxCUVdoQ08wRkJRMFE3TzBGQlEwUXNUMEZCU3l4SlFVRkpReXhGUVVGRkxFZEJRVWNzUTBGQlpDeEZRVUZwUWtFc1JVRkJSU3hIUVVGSGRFTXNTMEZCU3l4RFFVRkRSaXhOUVVGT0xFZEJRV1VzUTBGQmNrTXNSVUZCZDBOM1F5eEZRVUZGTEVWQlFURkRMRVZCUVRoRE8wRkJRelZEZEVNc1NVRkJRVUVzUzBGQlN5eERRVUZEYzBNc1JVRkJSQ3hEUVVGTUxFZEJRVmwwUXl4TFFVRkxMRU5CUVVOelF5eEZRVUZFTEVOQlFVd3NSMEZCV1hCRExGVkJRVlVzUTBGQlEyOURMRVZCUVVRc1EwRkJiRU03UVVGRFJEczdRVUZEUkN4VFFVRlBkRU1zUzBGQlN5eERRVUZEZFVNc1NVRkJUaXhEUVVGWExFVkJRVmdzUTBGQlVEdEJRVU5FTEVNc1EwRkZSRHM3TzBGQlEwOHNVMEZCVTBNc1dVRkJWQ3hEUVVGelFpOURMRTlCUVhSQ0xFVkJRU3RDUXl4UFFVRXZRaXhGUVVGM1F6dEJRVU0zUXl4TlFVRkpMRTlCUVU5RUxFOUJRVkFzUzBGQmJVSXNVVUZCZGtJc1JVRkJhVU03UVVGREwwSkJMRWxCUVVGQkxFOUJRVTg3UVVGQlJ6dEJRVUZCTzBGQlFVRTdPMEZCUVVGRk8wRkJRVUZCTzBGQlFVRkJPMEZCUVVGQk8wRkJRVUZCTzBGQlFVRkJPMEZCUVVFN1FVRkJRU3hMUVVGWFJpeFBRVUZZTEVOQlFWWTdRVUZEUkRzN1FVRkZSQ3hOUVVGSlowUXNXVUZCV1N4SFFVRkhMRU5CUVc1Q096dEJRVU5CTEZkQlFWTkRMRmxCUVZRc1IwRkJkMEk3UVVGRGRFSXNVVUZCU1VNc1MwRkJTeXhIUVVGSGJFUXNUMEZCVHl4RFFVRkRaMFFzV1VGQldTeEZRVUZpTEVOQlFXNUNPenRCUVVOQkxGRkJRVWtzUTBGQlEwVXNTMEZCVEN4RlFVRlpPMEZCUTFZc1lVRkJUMnBFTEU5QlFVOHNRMEZCUTJ0RUxGRkJRVklzUlVGQlVEdEJRVU5FT3p0QlFVVkViRVFzU1VGQlFVRXNUMEZCVHl4RFFVRkRiVVFzVVVGQlVpeERRVUZwUWtZc1MwRkJha0lzUlVGQmQwSXNWVUZCVTBjc1IwRkJWQ3hGUVVGalF5eEpRVUZrTEVWQlFXOUNPMEZCUXpGRExGVkJRVWxFTEVkQlFVb3NSVUZCVXp0QlFVTlFMR1ZCUVU5d1JDeFBRVUZQTEVOQlFVTnJSQ3hSUVVGU0xFTkJRV2xDUlN4SFFVRnFRaXhEUVVGUU8wRkJRMFE3TzBGQlJVUXNWVUZCU1VVc1kwRkJZeXhIUVVGSGVrUXNWVUZCVlN4RFFVRkRkMFFzU1VGQlJDeEZRVUZQU2l4TFFVRlFMRVZCUVdOcVJDeFBRVUZrTEVOQlFTOUNPMEZCUTBGQkxFMUJRVUZCTEU5QlFVOHNRMEZCUTNWRUxFOUJRVklzUTBGQlowSk9MRXRCUVdoQ0xFVkJRWFZDU3l4alFVRjJRaXhGUVVGMVF5eFZRVUZUUml4SFFVRlVMRVZCUVdNN1FVRkRia1FzV1VGQlNVRXNSMEZCU2l4RlFVRlRPMEZCUTFBc2FVSkJRVTl3UkN4UFFVRlBMRU5CUVVOclJDeFJRVUZTTEVOQlFXbENSU3hIUVVGcVFpeERRVUZRTzBGQlEwUTdPMEZCUlVSS0xGRkJRVUZCTEZsQlFWazdRVUZEWWl4UFFVNUVPMEZCVDBRc1MwRmlSRHRCUVdORU96dEJRVU5FUVN4RlFVRkJRU3haUVVGWk8wRkJRMklpTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lKcGJYQnZjblFnZTNCaGNuTmxVR0YwWTJoOUlHWnliMjBnSnk0dmNHRnljMlVuTzF4dWFXMXdiM0owSUdScGMzUmhibU5sU1hSbGNtRjBiM0lnWm5KdmJTQW5MaTR2ZFhScGJDOWthWE4wWVc1alpTMXBkR1Z5WVhSdmNpYzdYRzVjYm1WNGNHOXlkQ0JtZFc1amRHbHZiaUJoY0hCc2VWQmhkR05vS0hOdmRYSmpaU3dnZFc1cFJHbG1aaXdnYjNCMGFXOXVjeUE5SUh0OUtTQjdYRzRnSUdsbUlDaDBlWEJsYjJZZ2RXNXBSR2xtWmlBOVBUMGdKM04wY21sdVp5Y3BJSHRjYmlBZ0lDQjFibWxFYVdabUlEMGdjR0Z5YzJWUVlYUmphQ2gxYm1sRWFXWm1LVHRjYmlBZ2ZWeHVYRzRnSUdsbUlDaEJjbkpoZVM1cGMwRnljbUY1S0hWdWFVUnBabVlwS1NCN1hHNGdJQ0FnYVdZZ0tIVnVhVVJwWm1ZdWJHVnVaM1JvSUQ0Z01Ta2dlMXh1SUNBZ0lDQWdkR2h5YjNjZ2JtVjNJRVZ5Y205eUtDZGhjSEJzZVZCaGRHTm9JRzl1YkhrZ2QyOXlhM01nZDJsMGFDQmhJSE5wYm1kc1pTQnBibkIxZEM0bktUdGNiaUFnSUNCOVhHNWNiaUFnSUNCMWJtbEVhV1ptSUQwZ2RXNXBSR2xtWmxzd1hUdGNiaUFnZlZ4dVhHNGdJQzh2SUVGd2NHeDVJSFJvWlNCa2FXWm1JSFJ2SUhSb1pTQnBibkIxZEZ4dUlDQnNaWFFnYkdsdVpYTWdQU0J6YjNWeVkyVXVjM0JzYVhRb0wxeGNjbHhjYm54YlhGeHVYRngyWEZ4bVhGeHlYRng0T0RWZEx5a3NYRzRnSUNBZ0lDQmtaV3hwYldsMFpYSnpJRDBnYzI5MWNtTmxMbTFoZEdOb0tDOWNYSEpjWEc1OFcxeGNibHhjZGx4Y1pseGNjbHhjZURnMVhTOW5LU0I4ZkNCYlhTeGNiaUFnSUNBZ0lHaDFibXR6SUQwZ2RXNXBSR2xtWmk1b2RXNXJjeXhjYmx4dUlDQWdJQ0FnWTI5dGNHRnlaVXhwYm1VZ1BTQnZjSFJwYjI1ekxtTnZiWEJoY21WTWFXNWxJSHg4SUNnb2JHbHVaVTUxYldKbGNpd2diR2x1WlN3Z2IzQmxjbUYwYVc5dUxDQndZWFJqYUVOdmJuUmxiblFwSUQwK0lHeHBibVVnUFQwOUlIQmhkR05vUTI5dWRHVnVkQ2tzWEc0Z0lDQWdJQ0JsY25KdmNrTnZkVzUwSUQwZ01DeGNiaUFnSUNBZ0lHWjFlbnBHWVdOMGIzSWdQU0J2Y0hScGIyNXpMbVoxZW5wR1lXTjBiM0lnZkh3Z01DeGNiaUFnSUNBZ0lHMXBia3hwYm1VZ1BTQXdMRnh1SUNBZ0lDQWdiMlptYzJWMElEMGdNQ3hjYmx4dUlDQWdJQ0FnY21WdGIzWmxSVTlHVGt3c1hHNGdJQ0FnSUNCaFpHUkZUMFpPVER0Y2JseHVJQ0F2S2lwY2JpQWdJQ29nUTJobFkydHpJR2xtSUhSb1pTQm9kVzVySUdWNFlXTjBiSGtnWm1sMGN5QnZiaUIwYUdVZ2NISnZkbWxrWldRZ2JHOWpZWFJwYjI1Y2JpQWdJQ292WEc0Z0lHWjFibU4wYVc5dUlHaDFibXRHYVhSektHaDFibXNzSUhSdlVHOXpLU0I3WEc0Z0lDQWdabTl5SUNoc1pYUWdhaUE5SURBN0lHb2dQQ0JvZFc1ckxteHBibVZ6TG14bGJtZDBhRHNnYWlzcktTQjdYRzRnSUNBZ0lDQnNaWFFnYkdsdVpTQTlJR2gxYm1zdWJHbHVaWE5iYWwwc1hHNGdJQ0FnSUNBZ0lDQWdiM0JsY21GMGFXOXVJRDBnS0d4cGJtVXViR1Z1WjNSb0lENGdNQ0EvSUd4cGJtVmJNRjBnT2lBbklDY3BMRnh1SUNBZ0lDQWdJQ0FnSUdOdmJuUmxiblFnUFNBb2JHbHVaUzVzWlc1bmRHZ2dQaUF3SUQ4Z2JHbHVaUzV6ZFdKemRISW9NU2tnT2lCc2FXNWxLVHRjYmx4dUlDQWdJQ0FnYVdZZ0tHOXdaWEpoZEdsdmJpQTlQVDBnSnlBbklIeDhJRzl3WlhKaGRHbHZiaUE5UFQwZ0p5MG5LU0I3WEc0Z0lDQWdJQ0FnSUM4dklFTnZiblJsZUhRZ2MyRnVhWFI1SUdOb1pXTnJYRzRnSUNBZ0lDQWdJR2xtSUNnaFkyOXRjR0Z5WlV4cGJtVW9kRzlRYjNNZ0t5QXhMQ0JzYVc1bGMxdDBiMUJ2YzEwc0lHOXdaWEpoZEdsdmJpd2dZMjl1ZEdWdWRDa3BJSHRjYmlBZ0lDQWdJQ0FnSUNCbGNuSnZja052ZFc1MEt5czdYRzVjYmlBZ0lDQWdJQ0FnSUNCcFppQW9aWEp5YjNKRGIzVnVkQ0ErSUdaMWVucEdZV04wYjNJcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJtWVd4elpUdGNiaUFnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ2RHOVFiM01yS3p0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc1Y2JpQWdJQ0J5WlhSMWNtNGdkSEoxWlR0Y2JpQWdmVnh1WEc0Z0lDOHZJRk5sWVhKamFDQmlaWE4wSUdacGRDQnZabVp6WlhSeklHWnZjaUJsWVdOb0lHaDFibXNnWW1GelpXUWdiMjRnZEdobElIQnlaWFpwYjNWeklHOXVaWE5jYmlBZ1ptOXlJQ2hzWlhRZ2FTQTlJREE3SUdrZ1BDQm9kVzVyY3k1c1pXNW5kR2c3SUdrckt5a2dlMXh1SUNBZ0lHeGxkQ0JvZFc1cklEMGdhSFZ1YTNOYmFWMHNYRzRnSUNBZ0lDQWdJRzFoZUV4cGJtVWdQU0JzYVc1bGN5NXNaVzVuZEdnZ0xTQm9kVzVyTG05c1pFeHBibVZ6TEZ4dUlDQWdJQ0FnSUNCc2IyTmhiRTltWm5ObGRDQTlJREFzWEc0Z0lDQWdJQ0FnSUhSdlVHOXpJRDBnYjJabWMyVjBJQ3NnYUhWdWF5NXZiR1JUZEdGeWRDQXRJREU3WEc1Y2JpQWdJQ0JzWlhRZ2FYUmxjbUYwYjNJZ1BTQmthWE4wWVc1alpVbDBaWEpoZEc5eUtIUnZVRzl6TENCdGFXNU1hVzVsTENCdFlYaE1hVzVsS1R0Y2JseHVJQ0FnSUdadmNpQW9PeUJzYjJOaGJFOW1abk5sZENBaFBUMGdkVzVrWldacGJtVmtPeUJzYjJOaGJFOW1abk5sZENBOUlHbDBaWEpoZEc5eUtDa3BJSHRjYmlBZ0lDQWdJR2xtSUNob2RXNXJSbWwwY3lob2RXNXJMQ0IwYjFCdmN5QXJJR3h2WTJGc1QyWm1jMlYwS1NrZ2UxeHVJQ0FnSUNBZ0lDQm9kVzVyTG05bVpuTmxkQ0E5SUc5bVpuTmxkQ0FyUFNCc2IyTmhiRTltWm5ObGREdGNiaUFnSUNBZ0lDQWdZbkpsWVdzN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dVhHNGdJQ0FnYVdZZ0tHeHZZMkZzVDJabWMyVjBJRDA5UFNCMWJtUmxabWx1WldRcElIdGNiaUFnSUNBZ0lISmxkSFZ5YmlCbVlXeHpaVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQXZMeUJUWlhRZ2JHOTNaWElnZEdWNGRDQnNhVzFwZENCMGJ5QmxibVFnYjJZZ2RHaGxJR04xY25KbGJuUWdhSFZ1YXl3Z2MyOGdibVY0ZENCdmJtVnpJR1J2YmlkMElIUnllVnh1SUNBZ0lDOHZJSFJ2SUdacGRDQnZkbVZ5SUdGc2NtVmhaSGtnY0dGMFkyaGxaQ0IwWlhoMFhHNGdJQ0FnYldsdVRHbHVaU0E5SUdoMWJtc3ViMlptYzJWMElDc2dhSFZ1YXk1dmJHUlRkR0Z5ZENBcklHaDFibXN1YjJ4a1RHbHVaWE03WEc0Z0lIMWNibHh1SUNBdkx5QkJjSEJzZVNCd1lYUmphQ0JvZFc1cmMxeHVJQ0JzWlhRZ1pHbG1aazltWm5ObGRDQTlJREE3WEc0Z0lHWnZjaUFvYkdWMElHa2dQU0F3T3lCcElEd2dhSFZ1YTNNdWJHVnVaM1JvT3lCcEt5c3BJSHRjYmlBZ0lDQnNaWFFnYUhWdWF5QTlJR2gxYm10elcybGRMRnh1SUNBZ0lDQWdJQ0IwYjFCdmN5QTlJR2gxYm1zdWIyeGtVM1JoY25RZ0t5Qm9kVzVyTG05bVpuTmxkQ0FySUdScFptWlBabVp6WlhRZ0xTQXhPMXh1SUNBZ0lHUnBabVpQWm1aelpYUWdLejBnYUhWdWF5NXVaWGRNYVc1bGN5QXRJR2gxYm1zdWIyeGtUR2x1WlhNN1hHNWNiaUFnSUNCbWIzSWdLR3hsZENCcUlEMGdNRHNnYWlBOElHaDFibXN1YkdsdVpYTXViR1Z1WjNSb095QnFLeXNwSUh0Y2JpQWdJQ0FnSUd4bGRDQnNhVzVsSUQwZ2FIVnVheTVzYVc1bGMxdHFYU3hjYmlBZ0lDQWdJQ0FnSUNCdmNHVnlZWFJwYjI0Z1BTQW9iR2x1WlM1c1pXNW5kR2dnUGlBd0lEOGdiR2x1WlZzd1hTQTZJQ2NnSnlrc1hHNGdJQ0FnSUNBZ0lDQWdZMjl1ZEdWdWRDQTlJQ2hzYVc1bExteGxibWQwYUNBK0lEQWdQeUJzYVc1bExuTjFZbk4wY2lneEtTQTZJR3hwYm1VcExGeHVJQ0FnSUNBZ0lDQWdJR1JsYkdsdGFYUmxjaUE5SUdoMWJtc3ViR2x1WldSbGJHbHRhWFJsY25NZ0ppWWdhSFZ1YXk1c2FXNWxaR1ZzYVcxcGRHVnljMXRxWFNCOGZDQW5YRnh1Snp0Y2JseHVJQ0FnSUNBZ2FXWWdLRzl3WlhKaGRHbHZiaUE5UFQwZ0p5QW5LU0I3WEc0Z0lDQWdJQ0FnSUhSdlVHOXpLeXM3WEc0Z0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0c5d1pYSmhkR2x2YmlBOVBUMGdKeTBuS1NCN1hHNGdJQ0FnSUNBZ0lHeHBibVZ6TG5Od2JHbGpaU2gwYjFCdmN5d2dNU2s3WEc0Z0lDQWdJQ0FnSUdSbGJHbHRhWFJsY25NdWMzQnNhV05sS0hSdlVHOXpMQ0F4S1R0Y2JpQWdJQ0FnSUM4cUlHbHpkR0Z1WW5Wc0lHbG5ibTl5WlNCbGJITmxJQ292WEc0Z0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0c5d1pYSmhkR2x2YmlBOVBUMGdKeXNuS1NCN1hHNGdJQ0FnSUNBZ0lHeHBibVZ6TG5Od2JHbGpaU2gwYjFCdmN5d2dNQ3dnWTI5dWRHVnVkQ2s3WEc0Z0lDQWdJQ0FnSUdSbGJHbHRhWFJsY25NdWMzQnNhV05sS0hSdlVHOXpMQ0F3TENCa1pXeHBiV2wwWlhJcE8xeHVJQ0FnSUNBZ0lDQjBiMUJ2Y3lzck8xeHVJQ0FnSUNBZ2ZTQmxiSE5sSUdsbUlDaHZjR1Z5WVhScGIyNGdQVDA5SUNkY1hGeGNKeWtnZTF4dUlDQWdJQ0FnSUNCc1pYUWdjSEpsZG1sdmRYTlBjR1Z5WVhScGIyNGdQU0JvZFc1ckxteHBibVZ6VzJvZ0xTQXhYU0EvSUdoMWJtc3ViR2x1WlhOYmFpQXRJREZkV3pCZElEb2diblZzYkR0Y2JpQWdJQ0FnSUNBZ2FXWWdLSEJ5WlhacGIzVnpUM0JsY21GMGFXOXVJRDA5UFNBbkt5Y3BJSHRjYmlBZ0lDQWdJQ0FnSUNCeVpXMXZkbVZGVDBaT1RDQTlJSFJ5ZFdVN1hHNGdJQ0FnSUNBZ0lIMGdaV3h6WlNCcFppQW9jSEpsZG1sdmRYTlBjR1Z5WVhScGIyNGdQVDA5SUNjdEp5a2dlMXh1SUNBZ0lDQWdJQ0FnSUdGa1pFVlBSazVNSUQwZ2RISjFaVHRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmlBZ2ZWeHVYRzRnSUM4dklFaGhibVJzWlNCRlQwWk9UQ0JwYm5ObGNuUnBiMjR2Y21WdGIzWmhiRnh1SUNCcFppQW9jbVZ0YjNabFJVOUdUa3dwSUh0Y2JpQWdJQ0IzYUdsc1pTQW9JV3hwYm1WelcyeHBibVZ6TG14bGJtZDBhQ0F0SURGZEtTQjdYRzRnSUNBZ0lDQnNhVzVsY3k1d2IzQW9LVHRjYmlBZ0lDQWdJR1JsYkdsdGFYUmxjbk11Y0c5d0tDazdYRzRnSUNBZ2ZWeHVJQ0I5SUdWc2MyVWdhV1lnS0dGa1pFVlBSazVNS1NCN1hHNGdJQ0FnYkdsdVpYTXVjSFZ6YUNnbkp5azdYRzRnSUNBZ1pHVnNhVzFwZEdWeWN5NXdkWE5vS0NkY1hHNG5LVHRjYmlBZ2ZWeHVJQ0JtYjNJZ0tHeGxkQ0JmYXlBOUlEQTdJRjlySUR3Z2JHbHVaWE11YkdWdVozUm9JQzBnTVRzZ1gyc3JLeWtnZTF4dUlDQWdJR3hwYm1WelcxOXJYU0E5SUd4cGJtVnpXMTlyWFNBcklHUmxiR2x0YVhSbGNuTmJYMnRkTzF4dUlDQjlYRzRnSUhKbGRIVnliaUJzYVc1bGN5NXFiMmx1S0NjbktUdGNibjFjYmx4dUx5OGdWM0poY0hCbGNpQjBhR0YwSUhOMWNIQnZjblJ6SUcxMWJIUnBjR3hsSUdacGJHVWdjR0YwWTJobGN5QjJhV0VnWTJGc2JHSmhZMnR6TGx4dVpYaHdiM0owSUdaMWJtTjBhVzl1SUdGd2NHeDVVR0YwWTJobGN5aDFibWxFYVdabUxDQnZjSFJwYjI1ektTQjdYRzRnSUdsbUlDaDBlWEJsYjJZZ2RXNXBSR2xtWmlBOVBUMGdKM04wY21sdVp5Y3BJSHRjYmlBZ0lDQjFibWxFYVdabUlEMGdjR0Z5YzJWUVlYUmphQ2gxYm1sRWFXWm1LVHRjYmlBZ2ZWeHVYRzRnSUd4bGRDQmpkWEp5Wlc1MFNXNWtaWGdnUFNBd08xeHVJQ0JtZFc1amRHbHZiaUJ3Y205alpYTnpTVzVrWlhnb0tTQjdYRzRnSUNBZ2JHVjBJR2x1WkdWNElEMGdkVzVwUkdsbVpsdGpkWEp5Wlc1MFNXNWtaWGdySzEwN1hHNGdJQ0FnYVdZZ0tDRnBibVJsZUNrZ2UxeHVJQ0FnSUNBZ2NtVjBkWEp1SUc5d2RHbHZibk11WTI5dGNHeGxkR1VvS1R0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0J2Y0hScGIyNXpMbXh2WVdSR2FXeGxLR2x1WkdWNExDQm1kVzVqZEdsdmJpaGxjbklzSUdSaGRHRXBJSHRjYmlBZ0lDQWdJR2xtSUNobGNuSXBJSHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJRzl3ZEdsdmJuTXVZMjl0Y0d4bGRHVW9aWEp5S1R0Y2JpQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ2JHVjBJSFZ3WkdGMFpXUkRiMjUwWlc1MElEMGdZWEJ3YkhsUVlYUmphQ2hrWVhSaExDQnBibVJsZUN3Z2IzQjBhVzl1Y3lrN1hHNGdJQ0FnSUNCdmNIUnBiMjV6TG5CaGRHTm9aV1FvYVc1a1pYZ3NJSFZ3WkdGMFpXUkRiMjUwWlc1MExDQm1kVzVqZEdsdmJpaGxjbklwSUh0Y2JpQWdJQ0FnSUNBZ2FXWWdLR1Z5Y2lrZ2UxeHVJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQnZjSFJwYjI1ekxtTnZiWEJzWlhSbEtHVnljaWs3WEc0Z0lDQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0lDQndjbTlqWlhOelNXNWtaWGdvS1R0Y2JpQWdJQ0FnSUgwcE8xeHVJQ0FnSUgwcE8xeHVJQ0I5WEc0Z0lIQnliMk5sYzNOSmJtUmxlQ2dwTzF4dWZWeHVJbDE5XG4iLCAiLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLnN0cnVjdHVyZWRQYXRjaCA9IHN0cnVjdHVyZWRQYXRjaDtcbmV4cG9ydHMuZm9ybWF0UGF0Y2ggPSBmb3JtYXRQYXRjaDtcbmV4cG9ydHMuY3JlYXRlVHdvRmlsZXNQYXRjaCA9IGNyZWF0ZVR3b0ZpbGVzUGF0Y2g7XG5leHBvcnRzLmNyZWF0ZVBhdGNoID0gY3JlYXRlUGF0Y2g7XG5cbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG52YXJcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl9saW5lID0gcmVxdWlyZShcIi4uL2RpZmYvbGluZVwiKVxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbjtcblxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyBmdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7IH1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7IGlmICh0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoaXRlcikpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpOyB9XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KGFycik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG5mdW5jdGlvbiBzdHJ1Y3R1cmVkUGF0Y2gob2xkRmlsZU5hbWUsIG5ld0ZpbGVOYW1lLCBvbGRTdHIsIG5ld1N0ciwgb2xkSGVhZGVyLCBuZXdIZWFkZXIsIG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zLmNvbnRleHQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgb3B0aW9ucy5jb250ZXh0ID0gNDtcbiAgfVxuXG4gIHZhciBkaWZmID1cbiAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAoMCxcbiAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cblxuICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gIF9saW5lXG4gIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gIC5cbiAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICBkaWZmTGluZXMpXG4gIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gIChvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucyk7XG5cbiAgaWYgKCFkaWZmKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZGlmZi5wdXNoKHtcbiAgICB2YWx1ZTogJycsXG4gICAgbGluZXM6IFtdXG4gIH0pOyAvLyBBcHBlbmQgYW4gZW1wdHkgdmFsdWUgdG8gbWFrZSBjbGVhbnVwIGVhc2llclxuXG4gIGZ1bmN0aW9uIGNvbnRleHRMaW5lcyhsaW5lcykge1xuICAgIHJldHVybiBsaW5lcy5tYXAoZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICByZXR1cm4gJyAnICsgZW50cnk7XG4gICAgfSk7XG4gIH1cblxuICB2YXIgaHVua3MgPSBbXTtcbiAgdmFyIG9sZFJhbmdlU3RhcnQgPSAwLFxuICAgICAgbmV3UmFuZ2VTdGFydCA9IDAsXG4gICAgICBjdXJSYW5nZSA9IFtdLFxuICAgICAgb2xkTGluZSA9IDEsXG4gICAgICBuZXdMaW5lID0gMTtcblxuICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKFxuICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICBpKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBkaWZmW2ldLFxuICAgICAgICBsaW5lcyA9IGN1cnJlbnQubGluZXMgfHwgY3VycmVudC52YWx1ZS5yZXBsYWNlKC9cXG4kLywgJycpLnNwbGl0KCdcXG4nKTtcbiAgICBjdXJyZW50LmxpbmVzID0gbGluZXM7XG5cbiAgICBpZiAoY3VycmVudC5hZGRlZCB8fCBjdXJyZW50LnJlbW92ZWQpIHtcbiAgICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICAgIHZhciBfY3VyUmFuZ2U7XG5cbiAgICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gICAgICAvLyBJZiB3ZSBoYXZlIHByZXZpb3VzIGNvbnRleHQsIHN0YXJ0IHdpdGggdGhhdFxuICAgICAgaWYgKCFvbGRSYW5nZVN0YXJ0KSB7XG4gICAgICAgIHZhciBwcmV2ID0gZGlmZltpIC0gMV07XG4gICAgICAgIG9sZFJhbmdlU3RhcnQgPSBvbGRMaW5lO1xuICAgICAgICBuZXdSYW5nZVN0YXJ0ID0gbmV3TGluZTtcblxuICAgICAgICBpZiAocHJldikge1xuICAgICAgICAgIGN1clJhbmdlID0gb3B0aW9ucy5jb250ZXh0ID4gMCA/IGNvbnRleHRMaW5lcyhwcmV2LmxpbmVzLnNsaWNlKC1vcHRpb25zLmNvbnRleHQpKSA6IFtdO1xuICAgICAgICAgIG9sZFJhbmdlU3RhcnQgLT0gY3VyUmFuZ2UubGVuZ3RoO1xuICAgICAgICAgIG5ld1JhbmdlU3RhcnQgLT0gY3VyUmFuZ2UubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICB9IC8vIE91dHB1dCBvdXIgY2hhbmdlc1xuXG5cbiAgICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cblxuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cblxuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgICAgKF9jdXJSYW5nZSA9XG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgICAgY3VyUmFuZ2UpLnB1c2guYXBwbHkoXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICAgICBfY3VyUmFuZ2VcbiAgICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gICAgICAsXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICAgICBfdG9Db25zdW1hYmxlQXJyYXkoXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgICAgbGluZXMubWFwKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICByZXR1cm4gKGN1cnJlbnQuYWRkZWQgPyAnKycgOiAnLScpICsgZW50cnk7XG4gICAgICB9KSkpOyAvLyBUcmFjayB0aGUgdXBkYXRlZCBmaWxlIHBvc2l0aW9uXG5cblxuICAgICAgaWYgKGN1cnJlbnQuYWRkZWQpIHtcbiAgICAgICAgbmV3TGluZSArPSBsaW5lcy5sZW5ndGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbGRMaW5lICs9IGxpbmVzLmxlbmd0aDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWRlbnRpY2FsIGNvbnRleHQgbGluZXMuIFRyYWNrIGxpbmUgY2hhbmdlc1xuICAgICAgaWYgKG9sZFJhbmdlU3RhcnQpIHtcbiAgICAgICAgLy8gQ2xvc2Ugb3V0IGFueSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIG91dHB1dCAob3Igam9pbiBvdmVybGFwcGluZylcbiAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA8PSBvcHRpb25zLmNvbnRleHQgKiAyICYmIGkgPCBkaWZmLmxlbmd0aCAtIDIpIHtcbiAgICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICAgICAgICAgdmFyIF9jdXJSYW5nZTI7XG5cbiAgICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgICAgICAgIC8vIE92ZXJsYXBwaW5nXG5cbiAgICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5cbiAgICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuXG4gICAgICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgICAgICAgIChfY3VyUmFuZ2UyID1cbiAgICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgICAgICAgIGN1clJhbmdlKS5wdXNoLmFwcGx5KFxuICAgICAgICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICAgICAgICBfY3VyUmFuZ2UyXG4gICAgICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgICAgICAgICAsXG4gICAgICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgICAgICAgIF90b0NvbnN1bWFibGVBcnJheShcbiAgICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgICAgICAgIGNvbnRleHRMaW5lcyhsaW5lcykpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICAgICAgICAgdmFyIF9jdXJSYW5nZTM7XG5cbiAgICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgICAgICAgIC8vIGVuZCB0aGUgcmFuZ2UgYW5kIG91dHB1dFxuICAgICAgICAgIHZhciBjb250ZXh0U2l6ZSA9IE1hdGgubWluKGxpbmVzLmxlbmd0aCwgb3B0aW9ucy5jb250ZXh0KTtcblxuICAgICAgICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cblxuICAgICAgICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG5cbiAgICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICAgICAgICAgKF9jdXJSYW5nZTMgPVxuICAgICAgICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gICAgICAgICAgY3VyUmFuZ2UpLnB1c2guYXBwbHkoXG4gICAgICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgICAgICAgIF9jdXJSYW5nZTNcbiAgICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgICAgICAgICxcbiAgICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICAgICAgICAgX3RvQ29uc3VtYWJsZUFycmF5KFxuICAgICAgICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gICAgICAgICAgY29udGV4dExpbmVzKGxpbmVzLnNsaWNlKDAsIGNvbnRleHRTaXplKSkpKTtcblxuICAgICAgICAgIHZhciBodW5rID0ge1xuICAgICAgICAgICAgb2xkU3RhcnQ6IG9sZFJhbmdlU3RhcnQsXG4gICAgICAgICAgICBvbGRMaW5lczogb2xkTGluZSAtIG9sZFJhbmdlU3RhcnQgKyBjb250ZXh0U2l6ZSxcbiAgICAgICAgICAgIG5ld1N0YXJ0OiBuZXdSYW5nZVN0YXJ0LFxuICAgICAgICAgICAgbmV3TGluZXM6IG5ld0xpbmUgLSBuZXdSYW5nZVN0YXJ0ICsgY29udGV4dFNpemUsXG4gICAgICAgICAgICBsaW5lczogY3VyUmFuZ2VcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgaWYgKGkgPj0gZGlmZi5sZW5ndGggLSAyICYmIGxpbmVzLmxlbmd0aCA8PSBvcHRpb25zLmNvbnRleHQpIHtcbiAgICAgICAgICAgIC8vIEVPRiBpcyBpbnNpZGUgdGhpcyBodW5rXG4gICAgICAgICAgICB2YXIgb2xkRU9GTmV3bGluZSA9IC9cXG4kLy50ZXN0KG9sZFN0cik7XG4gICAgICAgICAgICB2YXIgbmV3RU9GTmV3bGluZSA9IC9cXG4kLy50ZXN0KG5ld1N0cik7XG4gICAgICAgICAgICB2YXIgbm9ObEJlZm9yZUFkZHMgPSBsaW5lcy5sZW5ndGggPT0gMCAmJiBjdXJSYW5nZS5sZW5ndGggPiBodW5rLm9sZExpbmVzO1xuXG4gICAgICAgICAgICBpZiAoIW9sZEVPRk5ld2xpbmUgJiYgbm9ObEJlZm9yZUFkZHMgJiYgb2xkU3RyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlOiBvbGQgaGFzIG5vIGVvbCBhbmQgbm8gdHJhaWxpbmcgY29udGV4dDsgbm8tbmwgY2FuIGVuZCB1cCBiZWZvcmUgYWRkc1xuICAgICAgICAgICAgICAvLyBob3dldmVyLCBpZiB0aGUgb2xkIGZpbGUgaXMgZW1wdHksIGRvIG5vdCBvdXRwdXQgdGhlIG5vLW5sIGxpbmVcbiAgICAgICAgICAgICAgY3VyUmFuZ2Uuc3BsaWNlKGh1bmsub2xkTGluZXMsIDAsICdcXFxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFvbGRFT0ZOZXdsaW5lICYmICFub05sQmVmb3JlQWRkcyB8fCAhbmV3RU9GTmV3bGluZSkge1xuICAgICAgICAgICAgICBjdXJSYW5nZS5wdXNoKCdcXFxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBodW5rcy5wdXNoKGh1bmspO1xuICAgICAgICAgIG9sZFJhbmdlU3RhcnQgPSAwO1xuICAgICAgICAgIG5ld1JhbmdlU3RhcnQgPSAwO1xuICAgICAgICAgIGN1clJhbmdlID0gW107XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgb2xkTGluZSArPSBsaW5lcy5sZW5ndGg7XG4gICAgICBuZXdMaW5lICs9IGxpbmVzLmxlbmd0aDtcbiAgICB9XG4gIH07XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaWZmLmxlbmd0aDsgaSsrKSB7XG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgIF9sb29wKFxuICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gICAgaSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG9sZEZpbGVOYW1lOiBvbGRGaWxlTmFtZSxcbiAgICBuZXdGaWxlTmFtZTogbmV3RmlsZU5hbWUsXG4gICAgb2xkSGVhZGVyOiBvbGRIZWFkZXIsXG4gICAgbmV3SGVhZGVyOiBuZXdIZWFkZXIsXG4gICAgaHVua3M6IGh1bmtzXG4gIH07XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFBhdGNoKGRpZmYpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZGlmZikpIHtcbiAgICByZXR1cm4gZGlmZi5tYXAoZm9ybWF0UGF0Y2gpLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgdmFyIHJldCA9IFtdO1xuXG4gIGlmIChkaWZmLm9sZEZpbGVOYW1lID09IGRpZmYubmV3RmlsZU5hbWUpIHtcbiAgICByZXQucHVzaCgnSW5kZXg6ICcgKyBkaWZmLm9sZEZpbGVOYW1lKTtcbiAgfVxuXG4gIHJldC5wdXNoKCc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Jyk7XG4gIHJldC5wdXNoKCctLS0gJyArIGRpZmYub2xkRmlsZU5hbWUgKyAodHlwZW9mIGRpZmYub2xkSGVhZGVyID09PSAndW5kZWZpbmVkJyA/ICcnIDogJ1xcdCcgKyBkaWZmLm9sZEhlYWRlcikpO1xuICByZXQucHVzaCgnKysrICcgKyBkaWZmLm5ld0ZpbGVOYW1lICsgKHR5cGVvZiBkaWZmLm5ld0hlYWRlciA9PT0gJ3VuZGVmaW5lZCcgPyAnJyA6ICdcXHQnICsgZGlmZi5uZXdIZWFkZXIpKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGRpZmYuaHVua3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaHVuayA9IGRpZmYuaHVua3NbaV07IC8vIFVuaWZpZWQgRGlmZiBGb3JtYXQgcXVpcms6IElmIHRoZSBjaHVuayBzaXplIGlzIDAsXG4gICAgLy8gdGhlIGZpcnN0IG51bWJlciBpcyBvbmUgbG93ZXIgdGhhbiBvbmUgd291bGQgZXhwZWN0LlxuICAgIC8vIGh0dHBzOi8vd3d3LmFydGltYS5jb20vd2VibG9ncy92aWV3cG9zdC5qc3A/dGhyZWFkPTE2NDI5M1xuXG4gICAgaWYgKGh1bmsub2xkTGluZXMgPT09IDApIHtcbiAgICAgIGh1bmsub2xkU3RhcnQgLT0gMTtcbiAgICB9XG5cbiAgICBpZiAoaHVuay5uZXdMaW5lcyA9PT0gMCkge1xuICAgICAgaHVuay5uZXdTdGFydCAtPSAxO1xuICAgIH1cblxuICAgIHJldC5wdXNoKCdAQCAtJyArIGh1bmsub2xkU3RhcnQgKyAnLCcgKyBodW5rLm9sZExpbmVzICsgJyArJyArIGh1bmsubmV3U3RhcnQgKyAnLCcgKyBodW5rLm5ld0xpbmVzICsgJyBAQCcpO1xuICAgIHJldC5wdXNoLmFwcGx5KHJldCwgaHVuay5saW5lcyk7XG4gIH1cblxuICByZXR1cm4gcmV0LmpvaW4oJ1xcbicpICsgJ1xcbic7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVR3b0ZpbGVzUGF0Y2gob2xkRmlsZU5hbWUsIG5ld0ZpbGVOYW1lLCBvbGRTdHIsIG5ld1N0ciwgb2xkSGVhZGVyLCBuZXdIZWFkZXIsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGZvcm1hdFBhdGNoKHN0cnVjdHVyZWRQYXRjaChvbGRGaWxlTmFtZSwgbmV3RmlsZU5hbWUsIG9sZFN0ciwgbmV3U3RyLCBvbGRIZWFkZXIsIG5ld0hlYWRlciwgb3B0aW9ucykpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVQYXRjaChmaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKSB7XG4gIHJldHVybiBjcmVhdGVUd29GaWxlc1BhdGNoKGZpbGVOYW1lLCBmaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OXdZWFJqYUM5amNtVmhkR1V1YW5NaVhTd2libUZ0WlhNaU9sc2ljM1J5ZFdOMGRYSmxaRkJoZEdOb0lpd2liMnhrUm1sc1pVNWhiV1VpTENKdVpYZEdhV3hsVG1GdFpTSXNJbTlzWkZOMGNpSXNJbTVsZDFOMGNpSXNJbTlzWkVobFlXUmxjaUlzSW01bGQwaGxZV1JsY2lJc0ltOXdkR2x2Ym5NaUxDSmpiMjUwWlhoMElpd2laR2xtWmlJc0ltUnBabVpNYVc1bGN5SXNJbkIxYzJnaUxDSjJZV3gxWlNJc0lteHBibVZ6SWl3aVkyOXVkR1Y0ZEV4cGJtVnpJaXdpYldGd0lpd2laVzUwY25raUxDSm9kVzVyY3lJc0ltOXNaRkpoYm1kbFUzUmhjblFpTENKdVpYZFNZVzVuWlZOMFlYSjBJaXdpWTNWeVVtRnVaMlVpTENKdmJHUk1hVzVsSWl3aWJtVjNUR2x1WlNJc0lta2lMQ0pqZFhKeVpXNTBJaXdpY21Wd2JHRmpaU0lzSW5Od2JHbDBJaXdpWVdSa1pXUWlMQ0p5WlcxdmRtVmtJaXdpY0hKbGRpSXNJbk5zYVdObElpd2liR1Z1WjNSb0lpd2lZMjl1ZEdWNGRGTnBlbVVpTENKTllYUm9JaXdpYldsdUlpd2lhSFZ1YXlJc0ltOXNaRk4wWVhKMElpd2liMnhrVEdsdVpYTWlMQ0p1WlhkVGRHRnlkQ0lzSW01bGQweHBibVZ6SWl3aWIyeGtSVTlHVG1WM2JHbHVaU0lzSW5SbGMzUWlMQ0p1WlhkRlQwWk9aWGRzYVc1bElpd2libTlPYkVKbFptOXlaVUZrWkhNaUxDSnpjR3hwWTJVaUxDSm1iM0p0WVhSUVlYUmphQ0lzSWtGeWNtRjVJaXdpYVhOQmNuSmhlU0lzSW1wdmFXNGlMQ0p5WlhRaUxDSmhjSEJzZVNJc0ltTnlaV0YwWlZSM2IwWnBiR1Z6VUdGMFkyZ2lMQ0pqY21WaGRHVlFZWFJqYUNJc0ltWnBiR1ZPWVcxbElsMHNJbTFoY0hCcGJtZHpJam9pT3pzN096czdPenM3T3pzN1FVRkJRVHRCUVVGQk8wRkJRVUU3UVVGQlFUdEJRVUZCT3pzN096czdPenM3T3pzN096czdRVUZGVHl4VFFVRlRRU3hsUVVGVUxFTkJRWGxDUXl4WFFVRjZRaXhGUVVGelEwTXNWMEZCZEVNc1JVRkJiVVJETEUxQlFXNUVMRVZCUVRKRVF5eE5RVUV6UkN4RlFVRnRSVU1zVTBGQmJrVXNSVUZCT0VWRExGTkJRVGxGTEVWQlFYbEdReXhQUVVGNlJpeEZRVUZyUnp0QlFVTjJSeXhOUVVGSkxFTkJRVU5CTEU5QlFVd3NSVUZCWXp0QlFVTmFRU3hKUVVGQlFTeFBRVUZQTEVkQlFVY3NSVUZCVmp0QlFVTkVPenRCUVVORUxFMUJRVWtzVDBGQlQwRXNUMEZCVHl4RFFVRkRReXhQUVVGbUxFdEJRVEpDTEZkQlFTOUNMRVZCUVRSRE8wRkJRekZEUkN4SlFVRkJRU3hQUVVGUExFTkJRVU5ETEU5QlFWSXNSMEZCYTBJc1EwRkJiRUk3UVVGRFJEczdRVUZGUkN4TlFVRk5ReXhKUVVGSk8wRkJRVWM3UVVGQlFUdEJRVUZCT3p0QlFVRkJRenRCUVVGQlFUdEJRVUZCUVR0QlFVRkJRVHRCUVVGQlFUdEJRVUZCUVR0QlFVRkJPMEZCUVVFc1IwRkJWVkFzVFVGQlZpeEZRVUZyUWtNc1RVRkJiRUlzUlVGQk1FSkhMRTlCUVRGQ0xFTkJRV0k3TzBGQlEwRXNUVUZCUnl4RFFVRkRSU3hKUVVGS0xFVkJRVlU3UVVGRFVqdEJRVU5FT3p0QlFVVkVRU3hGUVVGQlFTeEpRVUZKTEVOQlFVTkZMRWxCUVV3c1EwRkJWVHRCUVVGRFF5eEpRVUZCUVN4TFFVRkxMRVZCUVVVc1JVRkJVanRCUVVGWlF5eEpRVUZCUVN4TFFVRkxMRVZCUVVVN1FVRkJia0lzUjBGQlZpeEZRV0oxUnl4RFFXRndSVHM3UVVGRmJrTXNWMEZCVTBNc1dVRkJWQ3hEUVVGelFrUXNTMEZCZEVJc1JVRkJOa0k3UVVGRE0wSXNWMEZCVDBFc1MwRkJTeXhEUVVGRFJTeEhRVUZPTEVOQlFWVXNWVUZCVTBNc1MwRkJWQ3hGUVVGblFqdEJRVUZGTEdGQlFVOHNUVUZCVFVFc1MwRkJZanRCUVVGeFFpeExRVUZxUkN4RFFVRlFPMEZCUTBRN08wRkJSVVFzVFVGQlNVTXNTMEZCU3l4SFFVRkhMRVZCUVZvN1FVRkRRU3hOUVVGSlF5eGhRVUZoTEVkQlFVY3NRMEZCY0VJN1FVRkJRU3hOUVVGMVFrTXNZVUZCWVN4SFFVRkhMRU5CUVhaRE8wRkJRVUVzVFVGQk1FTkRMRkZCUVZFc1IwRkJSeXhGUVVGeVJEdEJRVUZCTEUxQlEwbERMRTlCUVU4c1IwRkJSeXhEUVVSa08wRkJRVUVzVFVGRGFVSkRMRTlCUVU4c1IwRkJSeXhEUVVRelFqczdRVUZ3UW5WSE8wRkJRVUU3UVVGQlFUdEJRWE5DT1VaRExFVkJRVUZCTEVOQmRFSTRSanRCUVhWQ2NrY3NVVUZCVFVNc1QwRkJUeXhIUVVGSFppeEpRVUZKTEVOQlFVTmpMRU5CUVVRc1EwRkJjRUk3UVVGQlFTeFJRVU5OVml4TFFVRkxMRWRCUVVkWExFOUJRVThzUTBGQlExZ3NTMEZCVWl4SlFVRnBRbGNzVDBGQlR5eERRVUZEV2l4TFFVRlNMRU5CUVdOaExFOUJRV1FzUTBGQmMwSXNTMEZCZEVJc1JVRkJOa0lzUlVGQk4wSXNSVUZCYVVORExFdEJRV3BETEVOQlFYVkRMRWxCUVhaRExFTkJSQzlDTzBGQlJVRkdMRWxCUVVGQkxFOUJRVThzUTBGQlExZ3NTMEZCVWl4SFFVRm5Ra0VzUzBGQmFFSTdPMEZCUlVFc1VVRkJTVmNzVDBGQlR5eERRVUZEUnl4TFFVRlNMRWxCUVdsQ1NDeFBRVUZQTEVOQlFVTkpMRTlCUVRkQ0xFVkJRWE5ETzBGQlFVRTdRVUZCUVRzN1FVRkJRVHRCUVVOd1F6dEJRVU5CTEZWQlFVa3NRMEZCUTFZc1lVRkJUQ3hGUVVGdlFqdEJRVU5zUWl4WlFVRk5WeXhKUVVGSkxFZEJRVWR3UWl4SlFVRkpMRU5CUVVOakxFTkJRVU1zUjBGQlJ5eERRVUZNTEVOQlFXcENPMEZCUTBGTUxGRkJRVUZCTEdGQlFXRXNSMEZCUjBjc1QwRkJhRUk3UVVGRFFVWXNVVUZCUVVFc1lVRkJZU3hIUVVGSFJ5eFBRVUZvUWpzN1FVRkZRU3haUVVGSlR5eEpRVUZLTEVWQlFWVTdRVUZEVWxRc1ZVRkJRVUVzVVVGQlVTeEhRVUZIWWl4UFFVRlBMRU5CUVVORExFOUJRVklzUjBGQmEwSXNRMEZCYkVJc1IwRkJjMEpOTEZsQlFWa3NRMEZCUTJVc1NVRkJTU3hEUVVGRGFFSXNTMEZCVEN4RFFVRlhhVUlzUzBGQldDeERRVUZwUWl4RFFVRkRka0lzVDBGQlR5eERRVUZEUXl4UFFVRXhRaXhEUVVGRUxFTkJRV3hETEVkQlFYbEZMRVZCUVhCR08wRkJRMEZWTEZWQlFVRkJMR0ZCUVdFc1NVRkJTVVVzVVVGQlVTeERRVUZEVnl4TlFVRXhRanRCUVVOQldpeFZRVUZCUVN4aFFVRmhMRWxCUVVsRExGRkJRVkVzUTBGQlExY3NUVUZCTVVJN1FVRkRSRHRCUVVOR0xFOUJXbTFETEVOQlkzQkRPenM3UVVGRFFUczdRVUZCUVRzN1FVRkJRVHRCUVVGQk8wRkJRVUU3UVVGQlFWZ3NUVUZCUVVFc1VVRkJVU3hGUVVGRFZDeEpRVUZVTzBGQlFVRTdRVUZCUVR0QlFVRkJPMEZCUVVFN1FVRkJRVHRCUVVGQk8wRkJRVUU3UVVGQmEwSkZMRTFCUVVGQkxFdEJRVXNzUTBGQlEwVXNSMEZCVGl4RFFVRlZMRlZCUVZORExFdEJRVlFzUlVGQlowSTdRVUZETVVNc1pVRkJUeXhEUVVGRFVTeFBRVUZQTEVOQlFVTkhMRXRCUVZJc1IwRkJaMElzUjBGQmFFSXNSMEZCYzBJc1IwRkJka0lzU1VGQk9FSllMRXRCUVhKRE8wRkJRMFFzVDBGR2FVSXNRMEZCYkVJc1IwRm1iME1zUTBGdFFuQkRPenM3UVVGRFFTeFZRVUZKVVN4UFFVRlBMRU5CUVVOSExFdEJRVm9zUlVGQmJVSTdRVUZEYWtKTUxGRkJRVUZCTEU5QlFVOHNTVUZCU1ZRc1MwRkJTeXhEUVVGRGEwSXNUVUZCYWtJN1FVRkRSQ3hQUVVaRUxFMUJSVTg3UVVGRFRGWXNVVUZCUVVFc1QwRkJUeXhKUVVGSlVpeExRVUZMTEVOQlFVTnJRaXhOUVVGcVFqdEJRVU5FTzBGQlEwWXNTMEY2UWtRc1RVRjVRazg3UVVGRFREdEJRVU5CTEZWQlFVbGlMR0ZCUVVvc1JVRkJiVUk3UVVGRGFrSTdRVUZEUVN4WlFVRkpUQ3hMUVVGTExFTkJRVU5yUWl4TlFVRk9MRWxCUVdkQ2VFSXNUMEZCVHl4RFFVRkRReXhQUVVGU0xFZEJRV3RDTEVOQlFXeERMRWxCUVhWRFpTeERRVUZETEVkQlFVZGtMRWxCUVVrc1EwRkJRM05DTEUxQlFVd3NSMEZCWXl4RFFVRTNSQ3hGUVVGblJUdEJRVUZCTzBGQlFVRTdPMEZCUVVFN1FVRkRPVVE3TzBGQlEwRTdPMEZCUVVFN08wRkJRVUU3UVVGQlFUdEJRVUZCTzBGQlFVRllMRlZCUVVGQkxGRkJRVkVzUlVGQlExUXNTVUZCVkR0QlFVRkJPMEZCUVVFN1FVRkJRVHRCUVVGQk8wRkJRVUU3UVVGQlFUdEJRVUZCTzBGQlFXdENSeXhWUVVGQlFTeFpRVUZaTEVOQlFVTkVMRXRCUVVRc1EwRkJPVUk3UVVGRFJDeFRRVWhFTEUxQlIwODdRVUZCUVR0QlFVRkJPenRCUVVGQk8wRkJRMHc3UVVGRFFTeGpRVUZKYlVJc1YwRkJWeXhIUVVGSFF5eEpRVUZKTEVOQlFVTkRMRWRCUVV3c1EwRkJVM0pDTEV0QlFVc3NRMEZCUTJ0Q0xFMUJRV1lzUlVGQmRVSjRRaXhQUVVGUExFTkJRVU5ETEU5QlFTOUNMRU5CUVd4Q096dEJRVU5CT3p0QlFVRkJPenRCUVVGQk8wRkJRVUU3UVVGQlFUdEJRVUZCV1N4VlFVRkJRU3hSUVVGUkxFVkJRVU5VTEVsQlFWUTdRVUZCUVR0QlFVRkJPMEZCUVVFN1FVRkJRVHRCUVVGQk8wRkJRVUU3UVVGQlFUdEJRVUZyUWtjc1ZVRkJRVUVzV1VGQldTeERRVUZEUkN4TFFVRkxMRU5CUVVOcFFpeExRVUZPTEVOQlFWa3NRMEZCV2l4RlFVRmxSU3hYUVVGbUxFTkJRVVFzUTBGQk9VSTdPMEZCUlVFc1kwRkJTVWNzU1VGQlNTeEhRVUZITzBGQlExUkRMRmxCUVVGQkxGRkJRVkVzUlVGQlJXeENMR0ZCUkVRN1FVRkZWRzFDTEZsQlFVRkJMRkZCUVZFc1JVRkJSMmhDTEU5QlFVOHNSMEZCUjBnc1lVRkJWaXhIUVVFd1FtTXNWMEZHTlVJN1FVRkhWRTBzV1VGQlFVRXNVVUZCVVN4RlFVRkZia0lzWVVGSVJEdEJRVWxVYjBJc1dVRkJRVUVzVVVGQlVTeEZRVUZIYWtJc1QwRkJUeXhIUVVGSFNDeGhRVUZXTEVkQlFUQkNZU3hYUVVvMVFqdEJRVXRVYmtJc1dVRkJRVUVzUzBGQlN5eEZRVUZGVHp0QlFVeEZMRmRCUVZnN08wRkJUMEVzWTBGQlNVY3NRMEZCUXl4SlFVRkpaQ3hKUVVGSkxFTkJRVU56UWl4TlFVRk1MRWRCUVdNc1EwRkJia0lzU1VGQmQwSnNRaXhMUVVGTExFTkJRVU5yUWl4TlFVRk9MRWxCUVdkQ2VFSXNUMEZCVHl4RFFVRkRReXhQUVVGd1JDeEZRVUUyUkR0QlFVTXpSRHRCUVVOQkxHZENRVUZKWjBNc1lVRkJZU3hIUVVGTExFdEJRVVFzUTBGQlVVTXNTVUZCVWl4RFFVRmhkRU1zVFVGQllpeERRVUZ5UWp0QlFVTkJMR2RDUVVGSmRVTXNZVUZCWVN4SFFVRkxMRXRCUVVRc1EwRkJVVVFzU1VGQlVpeERRVUZoY2tNc1RVRkJZaXhEUVVGeVFqdEJRVU5CTEdkQ1FVRkpkVU1zWTBGQll5eEhRVUZIT1VJc1MwRkJTeXhEUVVGRGEwSXNUVUZCVGl4SlFVRm5RaXhEUVVGb1FpeEpRVUZ4UWxnc1VVRkJVU3hEUVVGRFZ5eE5RVUZVTEVkQlFXdENTU3hKUVVGSkxFTkJRVU5GTEZGQlFXcEZPenRCUVVOQkxHZENRVUZKTEVOQlFVTkhMR0ZCUVVRc1NVRkJhMEpITEdOQlFXeENMRWxCUVc5RGVFTXNUVUZCVFN4RFFVRkRORUlzVFVGQlVDeEhRVUZuUWl4RFFVRjRSQ3hGUVVFeVJEdEJRVU42UkR0QlFVTkJPMEZCUTBGWUxHTkJRVUZCTEZGQlFWRXNRMEZCUTNkQ0xFMUJRVlFzUTBGQlowSlVMRWxCUVVrc1EwRkJRMFVzVVVGQmNrSXNSVUZCSzBJc1EwRkJMMElzUlVGQmEwTXNPRUpCUVd4RE8wRkJRMFE3TzBGQlEwUXNaMEpCUVVzc1EwRkJRMGNzWVVGQlJDeEpRVUZyUWl4RFFVRkRSeXhqUVVGd1FpeEpRVUYxUXl4RFFVRkRSQ3hoUVVFMVF5eEZRVUV5UkR0QlFVTjZSSFJDTEdOQlFVRkJMRkZCUVZFc1EwRkJRMVFzU1VGQlZDeERRVUZqTERoQ1FVRmtPMEZCUTBRN1FVRkRSanM3UVVGRFJFMHNWVUZCUVVFc1MwRkJTeXhEUVVGRFRpeEpRVUZPTEVOQlFWZDNRaXhKUVVGWU8wRkJSVUZxUWl4VlFVRkJRU3hoUVVGaExFZEJRVWNzUTBGQmFFSTdRVUZEUVVNc1ZVRkJRVUVzWVVGQllTeEhRVUZITEVOQlFXaENPMEZCUTBGRExGVkJRVUZCTEZGQlFWRXNSMEZCUnl4RlFVRllPMEZCUTBRN1FVRkRSanM3UVVGRFJFTXNUVUZCUVVFc1QwRkJUeXhKUVVGSlVpeExRVUZMTEVOQlFVTnJRaXhOUVVGcVFqdEJRVU5CVkN4TlFVRkJRU3hQUVVGUExFbEJRVWxVTEV0QlFVc3NRMEZCUTJ0Q0xFMUJRV3BDTzBGQlEwUTdRVUU1Um05SE96dEJRWE5DZGtjc1QwRkJTeXhKUVVGSlVpeERRVUZETEVkQlFVY3NRMEZCWWl4RlFVRm5Ra0VzUTBGQlF5eEhRVUZIWkN4SlFVRkpMRU5CUVVOelFpeE5RVUY2UWl4RlFVRnBRMUlzUTBGQlF5eEZRVUZzUXl4RlFVRnpRenRCUVVGQk8wRkJRVUU3UVVGQlFUdEJRVUUzUWtFc1NVRkJRVUVzUTBGQk5rSTdRVUY1UlhKRE96dEJRVVZFTEZOQlFVODdRVUZEVEhSQ0xFbEJRVUZCTEZkQlFWY3NSVUZCUlVFc1YwRkVVanRCUVVOeFFrTXNTVUZCUVVFc1YwRkJWeXhGUVVGRlFTeFhRVVJzUXp0QlFVVk1SeXhKUVVGQlFTeFRRVUZUTEVWQlFVVkJMRk5CUms0N1FVRkZhVUpETEVsQlFVRkJMRk5CUVZNc1JVRkJSVUVzVTBGR05VSTdRVUZIVEZjc1NVRkJRVUVzUzBGQlN5eEZRVUZGUVR0QlFVaEdMRWRCUVZBN1FVRkxSRHM3UVVGRlRTeFRRVUZUTkVJc1YwRkJWQ3hEUVVGeFFuQkRMRWxCUVhKQ0xFVkJRVEpDTzBGQlEyaERMRTFCUVVseFF5eExRVUZMTEVOQlFVTkRMRTlCUVU0c1EwRkJZM1JETEVsQlFXUXNRMEZCU2l4RlFVRjVRanRCUVVOMlFpeFhRVUZQUVN4SlFVRkpMRU5CUVVOTkxFZEJRVXdzUTBGQlV6aENMRmRCUVZRc1JVRkJjMEpITEVsQlFYUkNMRU5CUVRKQ0xFbEJRVE5DTEVOQlFWQTdRVUZEUkRzN1FVRkZSQ3hOUVVGTlF5eEhRVUZITEVkQlFVY3NSVUZCV2pzN1FVRkRRU3hOUVVGSmVFTXNTVUZCU1N4RFFVRkRVaXhYUVVGTUxFbEJRVzlDVVN4SlFVRkpMRU5CUVVOUUxGZEJRVGRDTEVWQlFUQkRPMEZCUTNoREswTXNTVUZCUVVFc1IwRkJSeXhEUVVGRGRFTXNTVUZCU2l4RFFVRlRMRmxCUVZsR0xFbEJRVWtzUTBGQlExSXNWMEZCTVVJN1FVRkRSRHM3UVVGRFJHZEVMRVZCUVVGQkxFZEJRVWNzUTBGQlEzUkRMRWxCUVVvc1EwRkJVeXh4UlVGQlZEdEJRVU5CYzBNc1JVRkJRVUVzUjBGQlJ5eERRVUZEZEVNc1NVRkJTaXhEUVVGVExGTkJRVk5HTEVsQlFVa3NRMEZCUTFJc1YwRkJaQ3hKUVVFMlFpeFBRVUZQVVN4SlFVRkpMRU5CUVVOS0xGTkJRVm9zUzBGQk1FSXNWMEZCTVVJc1IwRkJkME1zUlVGQmVFTXNSMEZCTmtNc1QwRkJUMGtzU1VGQlNTeERRVUZEU2l4VFFVRjBSaXhEUVVGVU8wRkJRMEUwUXl4RlFVRkJRU3hIUVVGSExFTkJRVU4wUXl4SlFVRktMRU5CUVZNc1UwRkJVMFlzU1VGQlNTeERRVUZEVUN4WFFVRmtMRWxCUVRaQ0xFOUJRVTlQTEVsQlFVa3NRMEZCUTBnc1UwRkJXaXhMUVVFd1FpeFhRVUV4UWl4SFFVRjNReXhGUVVGNFF5eEhRVUUyUXl4UFFVRlBSeXhKUVVGSkxFTkJRVU5JTEZOQlFYUkdMRU5CUVZRN08wRkJSVUVzVDBGQlN5eEpRVUZKYVVJc1EwRkJReXhIUVVGSExFTkJRV0lzUlVGQlowSkJMRU5CUVVNc1IwRkJSMlFzU1VGQlNTeERRVUZEVVN4TFFVRk1MRU5CUVZkakxFMUJRUzlDTEVWQlFYVkRVaXhEUVVGRExFVkJRWGhETEVWQlFUUkRPMEZCUXpGRExGRkJRVTFaTEVsQlFVa3NSMEZCUnpGQ0xFbEJRVWtzUTBGQlExRXNTMEZCVEN4RFFVRlhUU3hEUVVGWUxFTkJRV0lzUTBGRU1FTXNRMEZGTVVNN1FVRkRRVHRCUVVOQk96dEJRVU5CTEZGQlFVbFpMRWxCUVVrc1EwRkJRMFVzVVVGQlRDeExRVUZyUWl4RFFVRjBRaXhGUVVGNVFqdEJRVU4yUWtZc1RVRkJRVUVzU1VGQlNTeERRVUZEUXl4UlFVRk1MRWxCUVdsQ0xFTkJRV3BDTzBGQlEwUTdPMEZCUTBRc1VVRkJTVVFzU1VGQlNTeERRVUZEU1N4UlFVRk1MRXRCUVd0Q0xFTkJRWFJDTEVWQlFYbENPMEZCUTNaQ1NpeE5RVUZCUVN4SlFVRkpMRU5CUVVOSExGRkJRVXdzU1VGQmFVSXNRMEZCYWtJN1FVRkRSRHM3UVVGRFJGY3NTVUZCUVVFc1IwRkJSeXhEUVVGRGRFTXNTVUZCU2l4RFFVTkZMRk5CUVZOM1FpeEpRVUZKTEVOQlFVTkRMRkZCUVdRc1IwRkJlVUlzUjBGQmVrSXNSMEZCSzBKRUxFbEJRVWtzUTBGQlEwVXNVVUZCY0VNc1IwRkRSU3hKUVVSR0xFZEJRMU5HTEVsQlFVa3NRMEZCUTBjc1VVRkVaQ3hIUVVONVFpeEhRVVI2UWl4SFFVTXJRa2dzU1VGQlNTeERRVUZEU1N4UlFVUndReXhIUVVWRkxFdEJTRW83UVVGTFFWVXNTVUZCUVVFc1IwRkJSeXhEUVVGRGRFTXNTVUZCU2l4RFFVRlRkVU1zUzBGQlZDeERRVUZsUkN4SFFVRm1MRVZCUVc5Q1pDeEpRVUZKTEVOQlFVTjBRaXhMUVVGNlFqdEJRVU5FT3p0QlFVVkVMRk5CUVU5dlF5eEhRVUZITEVOQlFVTkVMRWxCUVVvc1EwRkJVeXhKUVVGVUxFbEJRV2xDTEVsQlFYaENPMEZCUTBRN08wRkJSVTBzVTBGQlUwY3NiVUpCUVZRc1EwRkJOa0pzUkN4WFFVRTNRaXhGUVVFd1EwTXNWMEZCTVVNc1JVRkJkVVJETEUxQlFYWkVMRVZCUVN0RVF5eE5RVUV2UkN4RlFVRjFSVU1zVTBGQmRrVXNSVUZCYTBaRExGTkJRV3hHTEVWQlFUWkdReXhQUVVFM1JpeEZRVUZ6Unp0QlFVTXpSeXhUUVVGUGMwTXNWMEZCVnl4RFFVRkROME1zWlVGQlpTeERRVUZEUXl4WFFVRkVMRVZCUVdORExGZEJRV1FzUlVGQk1rSkRMRTFCUVROQ0xFVkJRVzFEUXl4TlFVRnVReXhGUVVFeVEwTXNVMEZCTTBNc1JVRkJjMFJETEZOQlFYUkVMRVZCUVdsRlF5eFBRVUZxUlN4RFFVRm9RaXhEUVVGc1FqdEJRVU5FT3p0QlFVVk5MRk5CUVZNMlF5eFhRVUZVTEVOQlFYRkNReXhSUVVGeVFpeEZRVUVyUW14RUxFMUJRUzlDTEVWQlFYVkRReXhOUVVGMlF5eEZRVUVyUTBNc1UwRkJMME1zUlVGQk1FUkRMRk5CUVRGRUxFVkJRWEZGUXl4UFFVRnlSU3hGUVVFNFJUdEJRVU51Uml4VFFVRlBORU1zYlVKQlFXMUNMRU5CUVVORkxGRkJRVVFzUlVGQlYwRXNVVUZCV0N4RlFVRnhRbXhFTEUxQlFYSkNMRVZCUVRaQ1F5eE5RVUUzUWl4RlFVRnhRME1zVTBGQmNrTXNSVUZCWjBSRExGTkJRV2hFTEVWQlFUSkVReXhQUVVFelJDeERRVUV4UWp0QlFVTkVJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpYVcxd2IzSjBJSHRrYVdabVRHbHVaWE45SUdaeWIyMGdKeTR1TDJScFptWXZiR2x1WlNjN1hHNWNibVY0Y0c5eWRDQm1kVzVqZEdsdmJpQnpkSEoxWTNSMWNtVmtVR0YwWTJnb2IyeGtSbWxzWlU1aGJXVXNJRzVsZDBacGJHVk9ZVzFsTENCdmJHUlRkSElzSUc1bGQxTjBjaXdnYjJ4a1NHVmhaR1Z5TENCdVpYZElaV0ZrWlhJc0lHOXdkR2x2Ym5NcElIdGNiaUFnYVdZZ0tDRnZjSFJwYjI1ektTQjdYRzRnSUNBZ2IzQjBhVzl1Y3lBOUlIdDlPMXh1SUNCOVhHNGdJR2xtSUNoMGVYQmxiMllnYjNCMGFXOXVjeTVqYjI1MFpYaDBJRDA5UFNBbmRXNWtaV1pwYm1Wa0p5a2dlMXh1SUNBZ0lHOXdkR2x2Ym5NdVkyOXVkR1Y0ZENBOUlEUTdYRzRnSUgxY2JseHVJQ0JqYjI1emRDQmthV1ptSUQwZ1pHbG1aa3hwYm1WektHOXNaRk4wY2l3Z2JtVjNVM1J5TENCdmNIUnBiMjV6S1R0Y2JpQWdhV1lvSVdScFptWXBJSHRjYmlBZ0lDQnlaWFIxY200N1hHNGdJSDFjYmx4dUlDQmthV1ptTG5CMWMyZ29lM1poYkhWbE9pQW5KeXdnYkdsdVpYTTZJRnRkZlNrN0lDOHZJRUZ3Y0dWdVpDQmhiaUJsYlhCMGVTQjJZV3gxWlNCMGJ5QnRZV3RsSUdOc1pXRnVkWEFnWldGemFXVnlYRzVjYmlBZ1puVnVZM1JwYjI0Z1kyOXVkR1Y0ZEV4cGJtVnpLR3hwYm1WektTQjdYRzRnSUNBZ2NtVjBkWEp1SUd4cGJtVnpMbTFoY0NobWRXNWpkR2x2YmlobGJuUnllU2tnZXlCeVpYUjFjbTRnSnlBbklDc2daVzUwY25rN0lIMHBPMXh1SUNCOVhHNWNiaUFnYkdWMElHaDFibXR6SUQwZ1cxMDdYRzRnSUd4bGRDQnZiR1JTWVc1blpWTjBZWEowSUQwZ01Dd2dibVYzVW1GdVoyVlRkR0Z5ZENBOUlEQXNJR04xY2xKaGJtZGxJRDBnVzEwc1hHNGdJQ0FnSUNCdmJHUk1hVzVsSUQwZ01Td2dibVYzVEdsdVpTQTlJREU3WEc0Z0lHWnZjaUFvYkdWMElHa2dQU0F3T3lCcElEd2daR2xtWmk1c1pXNW5kR2c3SUdrckt5a2dlMXh1SUNBZ0lHTnZibk4wSUdOMWNuSmxiblFnUFNCa2FXWm1XMmxkTEZ4dUlDQWdJQ0FnSUNBZ0lHeHBibVZ6SUQwZ1kzVnljbVZ1ZEM1c2FXNWxjeUI4ZkNCamRYSnlaVzUwTG5aaGJIVmxMbkpsY0d4aFkyVW9MMXhjYmlRdkxDQW5KeWt1YzNCc2FYUW9KMXhjYmljcE8xeHVJQ0FnSUdOMWNuSmxiblF1YkdsdVpYTWdQU0JzYVc1bGN6dGNibHh1SUNBZ0lHbG1JQ2hqZFhKeVpXNTBMbUZrWkdWa0lIeDhJR04xY25KbGJuUXVjbVZ0YjNabFpDa2dlMXh1SUNBZ0lDQWdMeThnU1dZZ2QyVWdhR0YyWlNCd2NtVjJhVzkxY3lCamIyNTBaWGgwTENCemRHRnlkQ0IzYVhSb0lIUm9ZWFJjYmlBZ0lDQWdJR2xtSUNnaGIyeGtVbUZ1WjJWVGRHRnlkQ2tnZTF4dUlDQWdJQ0FnSUNCamIyNXpkQ0J3Y21WMklEMGdaR2xtWmx0cElDMGdNVjA3WEc0Z0lDQWdJQ0FnSUc5c1pGSmhibWRsVTNSaGNuUWdQU0J2YkdSTWFXNWxPMXh1SUNBZ0lDQWdJQ0J1WlhkU1lXNW5aVk4wWVhKMElEMGdibVYzVEdsdVpUdGNibHh1SUNBZ0lDQWdJQ0JwWmlBb2NISmxkaWtnZTF4dUlDQWdJQ0FnSUNBZ0lHTjFjbEpoYm1kbElEMGdiM0IwYVc5dWN5NWpiMjUwWlhoMElENGdNQ0EvSUdOdmJuUmxlSFJNYVc1bGN5aHdjbVYyTG14cGJtVnpMbk5zYVdObEtDMXZjSFJwYjI1ekxtTnZiblJsZUhRcEtTQTZJRnRkTzF4dUlDQWdJQ0FnSUNBZ0lHOXNaRkpoYm1kbFUzUmhjblFnTFQwZ1kzVnlVbUZ1WjJVdWJHVnVaM1JvTzF4dUlDQWdJQ0FnSUNBZ0lHNWxkMUpoYm1kbFUzUmhjblFnTFQwZ1kzVnlVbUZ1WjJVdWJHVnVaM1JvTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDOHZJRTkxZEhCMWRDQnZkWElnWTJoaGJtZGxjMXh1SUNBZ0lDQWdZM1Z5VW1GdVoyVXVjSFZ6YUNndUxpNGdiR2x1WlhNdWJXRndLR1oxYm1OMGFXOXVLR1Z1ZEhKNUtTQjdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQW9ZM1Z5Y21WdWRDNWhaR1JsWkNBL0lDY3JKeUE2SUNjdEp5a2dLeUJsYm5SeWVUdGNiaUFnSUNBZ0lIMHBLVHRjYmx4dUlDQWdJQ0FnTHk4Z1ZISmhZMnNnZEdobElIVndaR0YwWldRZ1ptbHNaU0J3YjNOcGRHbHZibHh1SUNBZ0lDQWdhV1lnS0dOMWNuSmxiblF1WVdSa1pXUXBJSHRjYmlBZ0lDQWdJQ0FnYm1WM1RHbHVaU0FyUFNCc2FXNWxjeTVzWlc1bmRHZzdYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQnZiR1JNYVc1bElDczlJR3hwYm1WekxteGxibWQwYUR0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdMeThnU1dSbGJuUnBZMkZzSUdOdmJuUmxlSFFnYkdsdVpYTXVJRlJ5WVdOcklHeHBibVVnWTJoaGJtZGxjMXh1SUNBZ0lDQWdhV1lnS0c5c1pGSmhibWRsVTNSaGNuUXBJSHRjYmlBZ0lDQWdJQ0FnTHk4Z1EyeHZjMlVnYjNWMElHRnVlU0JqYUdGdVoyVnpJSFJvWVhRZ2FHRjJaU0JpWldWdUlHOTFkSEIxZENBb2IzSWdhbTlwYmlCdmRtVnliR0Z3Y0dsdVp5bGNiaUFnSUNBZ0lDQWdhV1lnS0d4cGJtVnpMbXhsYm1kMGFDQThQU0J2Y0hScGIyNXpMbU52Ym5SbGVIUWdLaUF5SUNZbUlHa2dQQ0JrYVdabUxteGxibWQwYUNBdElESXBJSHRjYmlBZ0lDQWdJQ0FnSUNBdkx5QlBkbVZ5YkdGd2NHbHVaMXh1SUNBZ0lDQWdJQ0FnSUdOMWNsSmhibWRsTG5CMWMyZ29MaTR1SUdOdmJuUmxlSFJNYVc1bGN5aHNhVzVsY3lrcE8xeHVJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQWdJQzh2SUdWdVpDQjBhR1VnY21GdVoyVWdZVzVrSUc5MWRIQjFkRnh1SUNBZ0lDQWdJQ0FnSUd4bGRDQmpiMjUwWlhoMFUybDZaU0E5SUUxaGRHZ3ViV2x1S0d4cGJtVnpMbXhsYm1kMGFDd2diM0IwYVc5dWN5NWpiMjUwWlhoMEtUdGNiaUFnSUNBZ0lDQWdJQ0JqZFhKU1lXNW5aUzV3ZFhOb0tDNHVMaUJqYjI1MFpYaDBUR2x1WlhNb2JHbHVaWE11YzJ4cFkyVW9NQ3dnWTI5dWRHVjRkRk5wZW1VcEtTazdYRzVjYmlBZ0lDQWdJQ0FnSUNCc1pYUWdhSFZ1YXlBOUlIdGNiaUFnSUNBZ0lDQWdJQ0FnSUc5c1pGTjBZWEowT2lCdmJHUlNZVzVuWlZOMFlYSjBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ2IyeGtUR2x1WlhNNklDaHZiR1JNYVc1bElDMGdiMnhrVW1GdVoyVlRkR0Z5ZENBcklHTnZiblJsZUhSVGFYcGxLU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lHNWxkMU4wWVhKME9pQnVaWGRTWVc1blpWTjBZWEowTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdibVYzVEdsdVpYTTZJQ2h1WlhkTWFXNWxJQzBnYm1WM1VtRnVaMlZUZEdGeWRDQXJJR052Ym5SbGVIUlRhWHBsS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJR3hwYm1Wek9pQmpkWEpTWVc1blpWeHVJQ0FnSUNBZ0lDQWdJSDA3WEc0Z0lDQWdJQ0FnSUNBZ2FXWWdLR2tnUGowZ1pHbG1aaTVzWlc1bmRHZ2dMU0F5SUNZbUlHeHBibVZ6TG14bGJtZDBhQ0E4UFNCdmNIUnBiMjV6TG1OdmJuUmxlSFFwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQzh2SUVWUFJpQnBjeUJwYm5OcFpHVWdkR2hwY3lCb2RXNXJYRzRnSUNBZ0lDQWdJQ0FnSUNCc1pYUWdiMnhrUlU5R1RtVjNiR2x1WlNBOUlDZ29MMXhjYmlRdktTNTBaWE4wS0c5c1pGTjBjaWtwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdiR1YwSUc1bGQwVlBSazVsZDJ4cGJtVWdQU0FvS0M5Y1hHNGtMeWt1ZEdWemRDaHVaWGRUZEhJcEtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUd4bGRDQnViMDVzUW1WbWIzSmxRV1JrY3lBOUlHeHBibVZ6TG14bGJtZDBhQ0E5UFNBd0lDWW1JR04xY2xKaGJtZGxMbXhsYm1kMGFDQStJR2gxYm1zdWIyeGtUR2x1WlhNN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb0lXOXNaRVZQUms1bGQyeHBibVVnSmlZZ2JtOU9iRUpsWm05eVpVRmtaSE1nSmlZZ2IyeGtVM1J5TG14bGJtZDBhQ0ErSURBcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0x5OGdjM0JsWTJsaGJDQmpZWE5sT2lCdmJHUWdhR0Z6SUc1dklHVnZiQ0JoYm1RZ2JtOGdkSEpoYVd4cGJtY2dZMjl1ZEdWNGREc2dibTh0Ym13Z1kyRnVJR1Z1WkNCMWNDQmlaV1p2Y21VZ1lXUmtjMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQXZMeUJvYjNkbGRtVnlMQ0JwWmlCMGFHVWdiMnhrSUdacGJHVWdhWE1nWlcxd2RIa3NJR1J2SUc1dmRDQnZkWFJ3ZFhRZ2RHaGxJRzV2TFc1c0lHeHBibVZjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdZM1Z5VW1GdVoyVXVjM0JzYVdObEtHaDFibXN1YjJ4a1RHbHVaWE1zSURBc0lDZGNYRnhjSUU1dklHNWxkMnhwYm1VZ1lYUWdaVzVrSUc5bUlHWnBiR1VuS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2dvSVc5c1pFVlBSazVsZDJ4cGJtVWdKaVlnSVc1dlRteENaV1p2Y21WQlpHUnpLU0I4ZkNBaGJtVjNSVTlHVG1WM2JHbHVaU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0JqZFhKU1lXNW5aUzV3ZFhOb0tDZGNYRnhjSUU1dklHNWxkMnhwYm1VZ1lYUWdaVzVrSUc5bUlHWnBiR1VuS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdhSFZ1YTNNdWNIVnphQ2hvZFc1cktUdGNibHh1SUNBZ0lDQWdJQ0FnSUc5c1pGSmhibWRsVTNSaGNuUWdQU0F3TzF4dUlDQWdJQ0FnSUNBZ0lHNWxkMUpoYm1kbFUzUmhjblFnUFNBd08xeHVJQ0FnSUNBZ0lDQWdJR04xY2xKaGJtZGxJRDBnVzEwN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lIMWNiaUFnSUNBZ0lHOXNaRXhwYm1VZ0t6MGdiR2x1WlhNdWJHVnVaM1JvTzF4dUlDQWdJQ0FnYm1WM1RHbHVaU0FyUFNCc2FXNWxjeTVzWlc1bmRHZzdYRzRnSUNBZ2ZWeHVJQ0I5WEc1Y2JpQWdjbVYwZFhKdUlIdGNiaUFnSUNCdmJHUkdhV3hsVG1GdFpUb2diMnhrUm1sc1pVNWhiV1VzSUc1bGQwWnBiR1ZPWVcxbE9pQnVaWGRHYVd4bFRtRnRaU3hjYmlBZ0lDQnZiR1JJWldGa1pYSTZJRzlzWkVobFlXUmxjaXdnYm1WM1NHVmhaR1Z5T2lCdVpYZElaV0ZrWlhJc1hHNGdJQ0FnYUhWdWEzTTZJR2gxYm10elhHNGdJSDA3WEc1OVhHNWNibVY0Y0c5eWRDQm1kVzVqZEdsdmJpQm1iM0p0WVhSUVlYUmphQ2hrYVdabUtTQjdYRzRnSUdsbUlDaEJjbkpoZVM1cGMwRnljbUY1S0dScFptWXBLU0I3WEc0Z0lDQWdjbVYwZFhKdUlHUnBabVl1YldGd0tHWnZjbTFoZEZCaGRHTm9LUzVxYjJsdUtDZGNYRzRuS1R0Y2JpQWdmVnh1WEc0Z0lHTnZibk4wSUhKbGRDQTlJRnRkTzF4dUlDQnBaaUFvWkdsbVppNXZiR1JHYVd4bFRtRnRaU0E5UFNCa2FXWm1MbTVsZDBacGJHVk9ZVzFsS1NCN1hHNGdJQ0FnY21WMExuQjFjMmdvSjBsdVpHVjRPaUFuSUNzZ1pHbG1aaTV2YkdSR2FXeGxUbUZ0WlNrN1hHNGdJSDFjYmlBZ2NtVjBMbkIxYzJnb0p6MDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDBuS1R0Y2JpQWdjbVYwTG5CMWMyZ29KeTB0TFNBbklDc2daR2xtWmk1dmJHUkdhV3hsVG1GdFpTQXJJQ2gwZVhCbGIyWWdaR2xtWmk1dmJHUklaV0ZrWlhJZ1BUMDlJQ2QxYm1SbFptbHVaV1FuSUQ4Z0p5Y2dPaUFuWEZ4MEp5QXJJR1JwWm1ZdWIyeGtTR1ZoWkdWeUtTazdYRzRnSUhKbGRDNXdkWE5vS0Njckt5c2dKeUFySUdScFptWXVibVYzUm1sc1pVNWhiV1VnS3lBb2RIbHdaVzltSUdScFptWXVibVYzU0dWaFpHVnlJRDA5UFNBbmRXNWtaV1pwYm1Wa0p5QS9JQ2NuSURvZ0oxeGNkQ2NnS3lCa2FXWm1MbTVsZDBobFlXUmxjaWtwTzF4dVhHNGdJR1p2Y2lBb2JHVjBJR2tnUFNBd095QnBJRHdnWkdsbVppNW9kVzVyY3k1c1pXNW5kR2c3SUdrckt5a2dlMXh1SUNBZ0lHTnZibk4wSUdoMWJtc2dQU0JrYVdabUxtaDFibXR6VzJsZE8xeHVJQ0FnSUM4dklGVnVhV1pwWldRZ1JHbG1aaUJHYjNKdFlYUWdjWFZwY21zNklFbG1JSFJvWlNCamFIVnVheUJ6YVhwbElHbHpJREFzWEc0Z0lDQWdMeThnZEdobElHWnBjbk4wSUc1MWJXSmxjaUJwY3lCdmJtVWdiRzkzWlhJZ2RHaGhiaUJ2Ym1VZ2QyOTFiR1FnWlhod1pXTjBMbHh1SUNBZ0lDOHZJR2gwZEhCek9pOHZkM2QzTG1GeWRHbHRZUzVqYjIwdmQyVmliRzluY3k5MmFXVjNjRzl6ZEM1cWMzQS9kR2h5WldGa1BURTJOREk1TTF4dUlDQWdJR2xtSUNob2RXNXJMbTlzWkV4cGJtVnpJRDA5UFNBd0tTQjdYRzRnSUNBZ0lDQm9kVzVyTG05c1pGTjBZWEowSUMwOUlERTdYRzRnSUNBZ2ZWeHVJQ0FnSUdsbUlDaG9kVzVyTG01bGQweHBibVZ6SUQwOVBTQXdLU0I3WEc0Z0lDQWdJQ0JvZFc1ckxtNWxkMU4wWVhKMElDMDlJREU3WEc0Z0lDQWdmVnh1SUNBZ0lISmxkQzV3ZFhOb0tGeHVJQ0FnSUNBZ0owQkFJQzBuSUNzZ2FIVnVheTV2YkdSVGRHRnlkQ0FySUNjc0p5QXJJR2gxYm1zdWIyeGtUR2x1WlhOY2JpQWdJQ0FnSUNzZ0p5QXJKeUFySUdoMWJtc3VibVYzVTNSaGNuUWdLeUFuTENjZ0t5Qm9kVzVyTG01bGQweHBibVZ6WEc0Z0lDQWdJQ0FySUNjZ1FFQW5YRzRnSUNBZ0tUdGNiaUFnSUNCeVpYUXVjSFZ6YUM1aGNIQnNlU2h5WlhRc0lHaDFibXN1YkdsdVpYTXBPMXh1SUNCOVhHNWNiaUFnY21WMGRYSnVJSEpsZEM1cWIybHVLQ2RjWEc0bktTQXJJQ2RjWEc0bk8xeHVmVnh1WEc1bGVIQnZjblFnWm5WdVkzUnBiMjRnWTNKbFlYUmxWSGR2Um1sc1pYTlFZWFJqYUNodmJHUkdhV3hsVG1GdFpTd2dibVYzUm1sc1pVNWhiV1VzSUc5c1pGTjBjaXdnYm1WM1UzUnlMQ0J2YkdSSVpXRmtaWElzSUc1bGQwaGxZV1JsY2l3Z2IzQjBhVzl1Y3lrZ2UxeHVJQ0J5WlhSMWNtNGdabTl5YldGMFVHRjBZMmdvYzNSeWRXTjBkWEpsWkZCaGRHTm9LRzlzWkVacGJHVk9ZVzFsTENCdVpYZEdhV3hsVG1GdFpTd2diMnhrVTNSeUxDQnVaWGRUZEhJc0lHOXNaRWhsWVdSbGNpd2dibVYzU0dWaFpHVnlMQ0J2Y0hScGIyNXpLU2s3WEc1OVhHNWNibVY0Y0c5eWRDQm1kVzVqZEdsdmJpQmpjbVZoZEdWUVlYUmphQ2htYVd4bFRtRnRaU3dnYjJ4a1UzUnlMQ0J1WlhkVGRISXNJRzlzWkVobFlXUmxjaXdnYm1WM1NHVmhaR1Z5TENCdmNIUnBiMjV6S1NCN1hHNGdJSEpsZEhWeWJpQmpjbVZoZEdWVWQyOUdhV3hsYzFCaGRHTm9LR1pwYkdWT1lXMWxMQ0JtYVd4bFRtRnRaU3dnYjJ4a1UzUnlMQ0J1WlhkVGRISXNJRzlzWkVobFlXUmxjaXdnYm1WM1NHVmhaR1Z5TENCdmNIUnBiMjV6S1R0Y2JuMWNiaUpkZlE9PVxuIiwgIi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cblwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5hcnJheUVxdWFsID0gYXJyYXlFcXVhbDtcbmV4cG9ydHMuYXJyYXlTdGFydHNXaXRoID0gYXJyYXlTdGFydHNXaXRoO1xuXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuZnVuY3Rpb24gYXJyYXlFcXVhbChhLCBiKSB7XG4gIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gYXJyYXlTdGFydHNXaXRoKGEsIGIpO1xufVxuXG5mdW5jdGlvbiBhcnJheVN0YXJ0c1dpdGgoYXJyYXksIHN0YXJ0KSB7XG4gIGlmIChzdGFydC5sZW5ndGggPiBhcnJheS5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0YXJ0Lmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHN0YXJ0W2ldICE9PSBhcnJheVtpXSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMM055WXk5MWRHbHNMMkZ5Y21GNUxtcHpJbDBzSW01aGJXVnpJanBiSW1GeWNtRjVSWEYxWVd3aUxDSmhJaXdpWWlJc0lteGxibWQwYUNJc0ltRnljbUY1VTNSaGNuUnpWMmwwYUNJc0ltRnljbUY1SWl3aWMzUmhjblFpTENKcElsMHNJbTFoY0hCcGJtZHpJam9pT3pzN096czdPenM3TzBGQlFVOHNVMEZCVTBFc1ZVRkJWQ3hEUVVGdlFrTXNRMEZCY0VJc1JVRkJkVUpETEVOQlFYWkNMRVZCUVRCQ08wRkJReTlDTEUxQlFVbEVMRU5CUVVNc1EwRkJRMFVzVFVGQlJpeExRVUZoUkN4RFFVRkRMRU5CUVVORExFMUJRVzVDTEVWQlFUSkNPMEZCUTNwQ0xGZEJRVThzUzBGQlVEdEJRVU5FT3p0QlFVVkVMRk5CUVU5RExHVkJRV1VzUTBGQlEwZ3NRMEZCUkN4RlFVRkpReXhEUVVGS0xFTkJRWFJDTzBGQlEwUTdPMEZCUlUwc1UwRkJVMFVzWlVGQlZDeERRVUY1UWtNc1MwRkJla0lzUlVGQlowTkRMRXRCUVdoRExFVkJRWFZETzBGQlF6VkRMRTFCUVVsQkxFdEJRVXNzUTBGQlEwZ3NUVUZCVGl4SFFVRmxSU3hMUVVGTExFTkJRVU5HTEUxQlFYcENMRVZCUVdsRE8wRkJReTlDTEZkQlFVOHNTMEZCVUR0QlFVTkVPenRCUVVWRUxFOUJRVXNzU1VGQlNVa3NRMEZCUXl4SFFVRkhMRU5CUVdJc1JVRkJaMEpCTEVOQlFVTXNSMEZCUjBRc1MwRkJTeXhEUVVGRFNDeE5RVUV4UWl4RlFVRnJRMGtzUTBGQlF5eEZRVUZ1UXl4RlFVRjFRenRCUVVOeVF5eFJRVUZKUkN4TFFVRkxMRU5CUVVORExFTkJRVVFzUTBGQlRDeExRVUZoUml4TFFVRkxMRU5CUVVORkxFTkJRVVFzUTBGQmRFSXNSVUZCTWtJN1FVRkRla0lzWVVGQlR5eExRVUZRTzBGQlEwUTdRVUZEUmpzN1FVRkZSQ3hUUVVGUExFbEJRVkE3UVVGRFJDSXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJbVY0Y0c5eWRDQm1kVzVqZEdsdmJpQmhjbkpoZVVWeGRXRnNLR0VzSUdJcElIdGNiaUFnYVdZZ0tHRXViR1Z1WjNSb0lDRTlQU0JpTG14bGJtZDBhQ2tnZTF4dUlDQWdJSEpsZEhWeWJpQm1ZV3h6WlR0Y2JpQWdmVnh1WEc0Z0lISmxkSFZ5YmlCaGNuSmhlVk4wWVhKMGMxZHBkR2dvWVN3Z1lpazdYRzU5WEc1Y2JtVjRjRzl5ZENCbWRXNWpkR2x2YmlCaGNuSmhlVk4wWVhKMGMxZHBkR2dvWVhKeVlYa3NJSE4wWVhKMEtTQjdYRzRnSUdsbUlDaHpkR0Z5ZEM1c1pXNW5kR2dnUGlCaGNuSmhlUzVzWlc1bmRHZ3BJSHRjYmlBZ0lDQnlaWFIxY200Z1ptRnNjMlU3WEc0Z0lIMWNibHh1SUNCbWIzSWdLR3hsZENCcElEMGdNRHNnYVNBOElITjBZWEowTG14bGJtZDBhRHNnYVNzcktTQjdYRzRnSUNBZ2FXWWdLSE4wWVhKMFcybGRJQ0U5UFNCaGNuSmhlVnRwWFNrZ2UxeHVJQ0FnSUNBZ2NtVjBkWEp1SUdaaGJITmxPMXh1SUNBZ0lIMWNiaUFnZlZ4dVhHNGdJSEpsZEhWeWJpQjBjblZsTzF4dWZWeHVJbDE5XG4iLCAiLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmNhbGNMaW5lQ291bnQgPSBjYWxjTGluZUNvdW50O1xuZXhwb3J0cy5tZXJnZSA9IG1lcmdlO1xuXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xudmFyXG4vKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5fY3JlYXRlID0gcmVxdWlyZShcIi4vY3JlYXRlXCIpXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuO1xuXG52YXJcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl9wYXJzZSA9IHJlcXVpcmUoXCIuL3BhcnNlXCIpXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuO1xuXG52YXJcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl9hcnJheSA9IHJlcXVpcmUoXCIuLi91dGlsL2FycmF5XCIpXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuO1xuXG4vKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovIGZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgcmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfbm9uSXRlcmFibGVTcHJlYWQoKTsgfVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHsgaWYgKHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChpdGVyKSkgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7IH1cblxuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkoYXJyKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbmZ1bmN0aW9uIGNhbGNMaW5lQ291bnQoaHVuaykge1xuICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gIHZhciBfY2FsY09sZE5ld0xpbmVDb3VudCA9XG4gIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gIGNhbGNPbGROZXdMaW5lQ291bnQoaHVuay5saW5lcyksXG4gICAgICBvbGRMaW5lcyA9IF9jYWxjT2xkTmV3TGluZUNvdW50Lm9sZExpbmVzLFxuICAgICAgbmV3TGluZXMgPSBfY2FsY09sZE5ld0xpbmVDb3VudC5uZXdMaW5lcztcblxuICBpZiAob2xkTGluZXMgIT09IHVuZGVmaW5lZCkge1xuICAgIGh1bmsub2xkTGluZXMgPSBvbGRMaW5lcztcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgaHVuay5vbGRMaW5lcztcbiAgfVxuXG4gIGlmIChuZXdMaW5lcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaHVuay5uZXdMaW5lcyA9IG5ld0xpbmVzO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBodW5rLm5ld0xpbmVzO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1lcmdlKG1pbmUsIHRoZWlycywgYmFzZSkge1xuICBtaW5lID0gbG9hZFBhdGNoKG1pbmUsIGJhc2UpO1xuICB0aGVpcnMgPSBsb2FkUGF0Y2godGhlaXJzLCBiYXNlKTtcbiAgdmFyIHJldCA9IHt9OyAvLyBGb3IgaW5kZXggd2UganVzdCBsZXQgaXQgcGFzcyB0aHJvdWdoIGFzIGl0IGRvZXNuJ3QgaGF2ZSBhbnkgbmVjZXNzYXJ5IG1lYW5pbmcuXG4gIC8vIExlYXZpbmcgc2FuaXR5IGNoZWNrcyBvbiB0aGlzIHRvIHRoZSBBUEkgY29uc3VtZXIgdGhhdCBtYXkga25vdyBtb3JlIGFib3V0IHRoZVxuICAvLyBtZWFuaW5nIGluIHRoZWlyIG93biBjb250ZXh0LlxuXG4gIGlmIChtaW5lLmluZGV4IHx8IHRoZWlycy5pbmRleCkge1xuICAgIHJldC5pbmRleCA9IG1pbmUuaW5kZXggfHwgdGhlaXJzLmluZGV4O1xuICB9XG5cbiAgaWYgKG1pbmUubmV3RmlsZU5hbWUgfHwgdGhlaXJzLm5ld0ZpbGVOYW1lKSB7XG4gICAgaWYgKCFmaWxlTmFtZUNoYW5nZWQobWluZSkpIHtcbiAgICAgIC8vIE5vIGhlYWRlciBvciBubyBjaGFuZ2UgaW4gb3VycywgdXNlIHRoZWlycyAoYW5kIG91cnMgaWYgdGhlaXJzIGRvZXMgbm90IGV4aXN0KVxuICAgICAgcmV0Lm9sZEZpbGVOYW1lID0gdGhlaXJzLm9sZEZpbGVOYW1lIHx8IG1pbmUub2xkRmlsZU5hbWU7XG4gICAgICByZXQubmV3RmlsZU5hbWUgPSB0aGVpcnMubmV3RmlsZU5hbWUgfHwgbWluZS5uZXdGaWxlTmFtZTtcbiAgICAgIHJldC5vbGRIZWFkZXIgPSB0aGVpcnMub2xkSGVhZGVyIHx8IG1pbmUub2xkSGVhZGVyO1xuICAgICAgcmV0Lm5ld0hlYWRlciA9IHRoZWlycy5uZXdIZWFkZXIgfHwgbWluZS5uZXdIZWFkZXI7XG4gICAgfSBlbHNlIGlmICghZmlsZU5hbWVDaGFuZ2VkKHRoZWlycykpIHtcbiAgICAgIC8vIE5vIGhlYWRlciBvciBubyBjaGFuZ2UgaW4gdGhlaXJzLCB1c2Ugb3Vyc1xuICAgICAgcmV0Lm9sZEZpbGVOYW1lID0gbWluZS5vbGRGaWxlTmFtZTtcbiAgICAgIHJldC5uZXdGaWxlTmFtZSA9IG1pbmUubmV3RmlsZU5hbWU7XG4gICAgICByZXQub2xkSGVhZGVyID0gbWluZS5vbGRIZWFkZXI7XG4gICAgICByZXQubmV3SGVhZGVyID0gbWluZS5uZXdIZWFkZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEJvdGggY2hhbmdlZC4uLiBmaWd1cmUgaXQgb3V0XG4gICAgICByZXQub2xkRmlsZU5hbWUgPSBzZWxlY3RGaWVsZChyZXQsIG1pbmUub2xkRmlsZU5hbWUsIHRoZWlycy5vbGRGaWxlTmFtZSk7XG4gICAgICByZXQubmV3RmlsZU5hbWUgPSBzZWxlY3RGaWVsZChyZXQsIG1pbmUubmV3RmlsZU5hbWUsIHRoZWlycy5uZXdGaWxlTmFtZSk7XG4gICAgICByZXQub2xkSGVhZGVyID0gc2VsZWN0RmllbGQocmV0LCBtaW5lLm9sZEhlYWRlciwgdGhlaXJzLm9sZEhlYWRlcik7XG4gICAgICByZXQubmV3SGVhZGVyID0gc2VsZWN0RmllbGQocmV0LCBtaW5lLm5ld0hlYWRlciwgdGhlaXJzLm5ld0hlYWRlcik7XG4gICAgfVxuICB9XG5cbiAgcmV0Lmh1bmtzID0gW107XG4gIHZhciBtaW5lSW5kZXggPSAwLFxuICAgICAgdGhlaXJzSW5kZXggPSAwLFxuICAgICAgbWluZU9mZnNldCA9IDAsXG4gICAgICB0aGVpcnNPZmZzZXQgPSAwO1xuXG4gIHdoaWxlIChtaW5lSW5kZXggPCBtaW5lLmh1bmtzLmxlbmd0aCB8fCB0aGVpcnNJbmRleCA8IHRoZWlycy5odW5rcy5sZW5ndGgpIHtcbiAgICB2YXIgbWluZUN1cnJlbnQgPSBtaW5lLmh1bmtzW21pbmVJbmRleF0gfHwge1xuICAgICAgb2xkU3RhcnQ6IEluZmluaXR5XG4gICAgfSxcbiAgICAgICAgdGhlaXJzQ3VycmVudCA9IHRoZWlycy5odW5rc1t0aGVpcnNJbmRleF0gfHwge1xuICAgICAgb2xkU3RhcnQ6IEluZmluaXR5XG4gICAgfTtcblxuICAgIGlmIChodW5rQmVmb3JlKG1pbmVDdXJyZW50LCB0aGVpcnNDdXJyZW50KSkge1xuICAgICAgLy8gVGhpcyBwYXRjaCBkb2VzIG5vdCBvdmVybGFwIHdpdGggYW55IG9mIHRoZSBvdGhlcnMsIHlheS5cbiAgICAgIHJldC5odW5rcy5wdXNoKGNsb25lSHVuayhtaW5lQ3VycmVudCwgbWluZU9mZnNldCkpO1xuICAgICAgbWluZUluZGV4Kys7XG4gICAgICB0aGVpcnNPZmZzZXQgKz0gbWluZUN1cnJlbnQubmV3TGluZXMgLSBtaW5lQ3VycmVudC5vbGRMaW5lcztcbiAgICB9IGVsc2UgaWYgKGh1bmtCZWZvcmUodGhlaXJzQ3VycmVudCwgbWluZUN1cnJlbnQpKSB7XG4gICAgICAvLyBUaGlzIHBhdGNoIGRvZXMgbm90IG92ZXJsYXAgd2l0aCBhbnkgb2YgdGhlIG90aGVycywgeWF5LlxuICAgICAgcmV0Lmh1bmtzLnB1c2goY2xvbmVIdW5rKHRoZWlyc0N1cnJlbnQsIHRoZWlyc09mZnNldCkpO1xuICAgICAgdGhlaXJzSW5kZXgrKztcbiAgICAgIG1pbmVPZmZzZXQgKz0gdGhlaXJzQ3VycmVudC5uZXdMaW5lcyAtIHRoZWlyc0N1cnJlbnQub2xkTGluZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE92ZXJsYXAsIG1lcmdlIGFzIGJlc3Qgd2UgY2FuXG4gICAgICB2YXIgbWVyZ2VkSHVuayA9IHtcbiAgICAgICAgb2xkU3RhcnQ6IE1hdGgubWluKG1pbmVDdXJyZW50Lm9sZFN0YXJ0LCB0aGVpcnNDdXJyZW50Lm9sZFN0YXJ0KSxcbiAgICAgICAgb2xkTGluZXM6IDAsXG4gICAgICAgIG5ld1N0YXJ0OiBNYXRoLm1pbihtaW5lQ3VycmVudC5uZXdTdGFydCArIG1pbmVPZmZzZXQsIHRoZWlyc0N1cnJlbnQub2xkU3RhcnQgKyB0aGVpcnNPZmZzZXQpLFxuICAgICAgICBuZXdMaW5lczogMCxcbiAgICAgICAgbGluZXM6IFtdXG4gICAgICB9O1xuICAgICAgbWVyZ2VMaW5lcyhtZXJnZWRIdW5rLCBtaW5lQ3VycmVudC5vbGRTdGFydCwgbWluZUN1cnJlbnQubGluZXMsIHRoZWlyc0N1cnJlbnQub2xkU3RhcnQsIHRoZWlyc0N1cnJlbnQubGluZXMpO1xuICAgICAgdGhlaXJzSW5kZXgrKztcbiAgICAgIG1pbmVJbmRleCsrO1xuICAgICAgcmV0Lmh1bmtzLnB1c2gobWVyZ2VkSHVuayk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gbG9hZFBhdGNoKHBhcmFtLCBiYXNlKSB7XG4gIGlmICh0eXBlb2YgcGFyYW0gPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKC9eQEAvbS50ZXN0KHBhcmFtKSB8fCAvXkluZGV4Oi9tLnRlc3QocGFyYW0pKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICAgICAgICgwLFxuICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuXG4gICAgICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICAgICAgX3BhcnNlXG4gICAgICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gICAgICAgIC5cbiAgICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgICAgICBwYXJzZVBhdGNoKVxuICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgICAgICAocGFyYW0pWzBdXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghYmFzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdXN0IHByb3ZpZGUgYSBiYXNlIHJlZmVyZW5jZSBvciBwYXNzIGluIGEgcGF0Y2gnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgICAgKDAsXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICAgICBfY3JlYXRlXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgICAgLlxuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgICAgc3RydWN0dXJlZFBhdGNoKVxuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgICAgICh1bmRlZmluZWQsIHVuZGVmaW5lZCwgYmFzZSwgcGFyYW0pXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBwYXJhbTtcbn1cblxuZnVuY3Rpb24gZmlsZU5hbWVDaGFuZ2VkKHBhdGNoKSB7XG4gIHJldHVybiBwYXRjaC5uZXdGaWxlTmFtZSAmJiBwYXRjaC5uZXdGaWxlTmFtZSAhPT0gcGF0Y2gub2xkRmlsZU5hbWU7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdEZpZWxkKGluZGV4LCBtaW5lLCB0aGVpcnMpIHtcbiAgaWYgKG1pbmUgPT09IHRoZWlycykge1xuICAgIHJldHVybiBtaW5lO1xuICB9IGVsc2Uge1xuICAgIGluZGV4LmNvbmZsaWN0ID0gdHJ1ZTtcbiAgICByZXR1cm4ge1xuICAgICAgbWluZTogbWluZSxcbiAgICAgIHRoZWlyczogdGhlaXJzXG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBodW5rQmVmb3JlKHRlc3QsIGNoZWNrKSB7XG4gIHJldHVybiB0ZXN0Lm9sZFN0YXJ0IDwgY2hlY2sub2xkU3RhcnQgJiYgdGVzdC5vbGRTdGFydCArIHRlc3Qub2xkTGluZXMgPCBjaGVjay5vbGRTdGFydDtcbn1cblxuZnVuY3Rpb24gY2xvbmVIdW5rKGh1bmssIG9mZnNldCkge1xuICByZXR1cm4ge1xuICAgIG9sZFN0YXJ0OiBodW5rLm9sZFN0YXJ0LFxuICAgIG9sZExpbmVzOiBodW5rLm9sZExpbmVzLFxuICAgIG5ld1N0YXJ0OiBodW5rLm5ld1N0YXJ0ICsgb2Zmc2V0LFxuICAgIG5ld0xpbmVzOiBodW5rLm5ld0xpbmVzLFxuICAgIGxpbmVzOiBodW5rLmxpbmVzXG4gIH07XG59XG5cbmZ1bmN0aW9uIG1lcmdlTGluZXMoaHVuaywgbWluZU9mZnNldCwgbWluZUxpbmVzLCB0aGVpck9mZnNldCwgdGhlaXJMaW5lcykge1xuICAvLyBUaGlzIHdpbGwgZ2VuZXJhbGx5IHJlc3VsdCBpbiBhIGNvbmZsaWN0ZWQgaHVuaywgYnV0IHRoZXJlIGFyZSBjYXNlcyB3aGVyZSB0aGUgY29udGV4dFxuICAvLyBpcyB0aGUgb25seSBvdmVybGFwIHdoZXJlIHdlIGNhbiBzdWNjZXNzZnVsbHkgbWVyZ2UgdGhlIGNvbnRlbnQgaGVyZS5cbiAgdmFyIG1pbmUgPSB7XG4gICAgb2Zmc2V0OiBtaW5lT2Zmc2V0LFxuICAgIGxpbmVzOiBtaW5lTGluZXMsXG4gICAgaW5kZXg6IDBcbiAgfSxcbiAgICAgIHRoZWlyID0ge1xuICAgIG9mZnNldDogdGhlaXJPZmZzZXQsXG4gICAgbGluZXM6IHRoZWlyTGluZXMsXG4gICAgaW5kZXg6IDBcbiAgfTsgLy8gSGFuZGxlIGFueSBsZWFkaW5nIGNvbnRlbnRcblxuICBpbnNlcnRMZWFkaW5nKGh1bmssIG1pbmUsIHRoZWlyKTtcbiAgaW5zZXJ0TGVhZGluZyhodW5rLCB0aGVpciwgbWluZSk7IC8vIE5vdyBpbiB0aGUgb3ZlcmxhcCBjb250ZW50LiBTY2FuIHRocm91Z2ggYW5kIHNlbGVjdCB0aGUgYmVzdCBjaGFuZ2VzIGZyb20gZWFjaC5cblxuICB3aGlsZSAobWluZS5pbmRleCA8IG1pbmUubGluZXMubGVuZ3RoICYmIHRoZWlyLmluZGV4IDwgdGhlaXIubGluZXMubGVuZ3RoKSB7XG4gICAgdmFyIG1pbmVDdXJyZW50ID0gbWluZS5saW5lc1ttaW5lLmluZGV4XSxcbiAgICAgICAgdGhlaXJDdXJyZW50ID0gdGhlaXIubGluZXNbdGhlaXIuaW5kZXhdO1xuXG4gICAgaWYgKChtaW5lQ3VycmVudFswXSA9PT0gJy0nIHx8IG1pbmVDdXJyZW50WzBdID09PSAnKycpICYmICh0aGVpckN1cnJlbnRbMF0gPT09ICctJyB8fCB0aGVpckN1cnJlbnRbMF0gPT09ICcrJykpIHtcbiAgICAgIC8vIEJvdGggbW9kaWZpZWQgLi4uXG4gICAgICBtdXR1YWxDaGFuZ2UoaHVuaywgbWluZSwgdGhlaXIpO1xuICAgIH0gZWxzZSBpZiAobWluZUN1cnJlbnRbMF0gPT09ICcrJyAmJiB0aGVpckN1cnJlbnRbMF0gPT09ICcgJykge1xuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgICAgdmFyIF9odW5rJGxpbmVzO1xuXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgICAgLy8gTWluZSBpbnNlcnRlZFxuXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5cbiAgICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG5cbiAgICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICAgIChfaHVuayRsaW5lcyA9XG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgICAgaHVuay5saW5lcykucHVzaC5hcHBseShcbiAgICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICAgIF9odW5rJGxpbmVzXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgICAgLFxuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgICAgX3RvQ29uc3VtYWJsZUFycmF5KFxuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgICAgIGNvbGxlY3RDaGFuZ2UobWluZSkpKTtcbiAgICB9IGVsc2UgaWYgKHRoZWlyQ3VycmVudFswXSA9PT0gJysnICYmIG1pbmVDdXJyZW50WzBdID09PSAnICcpIHtcbiAgICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICAgIHZhciBfaHVuayRsaW5lczI7XG5cbiAgICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gICAgICAvLyBUaGVpcnMgaW5zZXJ0ZWRcblxuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICAgICAoX2h1bmskbGluZXMyID1cbiAgICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gICAgICBodW5rLmxpbmVzKS5wdXNoLmFwcGx5KFxuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgICAgX2h1bmskbGluZXMyXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgICAgLFxuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgICAgX3RvQ29uc3VtYWJsZUFycmF5KFxuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgICAgIGNvbGxlY3RDaGFuZ2UodGhlaXIpKSk7XG4gICAgfSBlbHNlIGlmIChtaW5lQ3VycmVudFswXSA9PT0gJy0nICYmIHRoZWlyQ3VycmVudFswXSA9PT0gJyAnKSB7XG4gICAgICAvLyBNaW5lIHJlbW92ZWQgb3IgZWRpdGVkXG4gICAgICByZW1vdmFsKGh1bmssIG1pbmUsIHRoZWlyKTtcbiAgICB9IGVsc2UgaWYgKHRoZWlyQ3VycmVudFswXSA9PT0gJy0nICYmIG1pbmVDdXJyZW50WzBdID09PSAnICcpIHtcbiAgICAgIC8vIFRoZWlyIHJlbW92ZWQgb3IgZWRpdGVkXG4gICAgICByZW1vdmFsKGh1bmssIHRoZWlyLCBtaW5lLCB0cnVlKTtcbiAgICB9IGVsc2UgaWYgKG1pbmVDdXJyZW50ID09PSB0aGVpckN1cnJlbnQpIHtcbiAgICAgIC8vIENvbnRleHQgaWRlbnRpdHlcbiAgICAgIGh1bmsubGluZXMucHVzaChtaW5lQ3VycmVudCk7XG4gICAgICBtaW5lLmluZGV4Kys7XG4gICAgICB0aGVpci5pbmRleCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDb250ZXh0IG1pc21hdGNoXG4gICAgICBjb25mbGljdChodW5rLCBjb2xsZWN0Q2hhbmdlKG1pbmUpLCBjb2xsZWN0Q2hhbmdlKHRoZWlyKSk7XG4gICAgfVxuICB9IC8vIE5vdyBwdXNoIGFueXRoaW5nIHRoYXQgbWF5IGJlIHJlbWFpbmluZ1xuXG5cbiAgaW5zZXJ0VHJhaWxpbmcoaHVuaywgbWluZSk7XG4gIGluc2VydFRyYWlsaW5nKGh1bmssIHRoZWlyKTtcbiAgY2FsY0xpbmVDb3VudChodW5rKTtcbn1cblxuZnVuY3Rpb24gbXV0dWFsQ2hhbmdlKGh1bmssIG1pbmUsIHRoZWlyKSB7XG4gIHZhciBteUNoYW5nZXMgPSBjb2xsZWN0Q2hhbmdlKG1pbmUpLFxuICAgICAgdGhlaXJDaGFuZ2VzID0gY29sbGVjdENoYW5nZSh0aGVpcik7XG5cbiAgaWYgKGFsbFJlbW92ZXMobXlDaGFuZ2VzKSAmJiBhbGxSZW1vdmVzKHRoZWlyQ2hhbmdlcykpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIHJlbW92ZSBjaGFuZ2VzIHRoYXQgYXJlIHN1cGVyc2V0cyBvZiBvbmUgYW5vdGhlclxuICAgIGlmIChcbiAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICAgKDAsXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cblxuICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICBfYXJyYXlcbiAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgIC5cbiAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICAgYXJyYXlTdGFydHNXaXRoKVxuICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gICAgKG15Q2hhbmdlcywgdGhlaXJDaGFuZ2VzKSAmJiBza2lwUmVtb3ZlU3VwZXJzZXQodGhlaXIsIG15Q2hhbmdlcywgbXlDaGFuZ2VzLmxlbmd0aCAtIHRoZWlyQ2hhbmdlcy5sZW5ndGgpKSB7XG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICAgICB2YXIgX2h1bmskbGluZXMzO1xuXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5cbiAgICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG5cbiAgICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICAgIChfaHVuayRsaW5lczMgPVxuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgICAgIGh1bmsubGluZXMpLnB1c2guYXBwbHkoXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICAgICBfaHVuayRsaW5lczNcbiAgICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gICAgICAsXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICAgICBfdG9Db25zdW1hYmxlQXJyYXkoXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgICAgbXlDaGFuZ2VzKSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKFxuICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICAoMCxcbiAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgIF9hcnJheVxuICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gICAgLlxuICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICBhcnJheVN0YXJ0c1dpdGgpXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgICAodGhlaXJDaGFuZ2VzLCBteUNoYW5nZXMpICYmIHNraXBSZW1vdmVTdXBlcnNldChtaW5lLCB0aGVpckNoYW5nZXMsIHRoZWlyQ2hhbmdlcy5sZW5ndGggLSBteUNoYW5nZXMubGVuZ3RoKSkge1xuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgICAgdmFyIF9odW5rJGxpbmVzNDtcblxuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cblxuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuXG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICAgICAoX2h1bmskbGluZXM0ID1cbiAgICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gICAgICBodW5rLmxpbmVzKS5wdXNoLmFwcGx5KFxuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgICAgX2h1bmskbGluZXM0XG4gICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgICAgLFxuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgICAgX3RvQ29uc3VtYWJsZUFycmF5KFxuICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgICAgIHRoZWlyQ2hhbmdlcykpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICB9IGVsc2UgaWYgKFxuICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICgwLFxuICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuXG4gIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgX2FycmF5XG4gIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gIC5cbiAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICBhcnJheUVxdWFsKVxuICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAobXlDaGFuZ2VzLCB0aGVpckNoYW5nZXMpKSB7XG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgIHZhciBfaHVuayRsaW5lczU7XG5cbiAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cblxuICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICAoX2h1bmskbGluZXM1ID1cbiAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgIGh1bmsubGluZXMpLnB1c2guYXBwbHkoXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgIF9odW5rJGxpbmVzNVxuICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gICAgLFxuICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICBfdG9Db25zdW1hYmxlQXJyYXkoXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgICBteUNoYW5nZXMpKTtcblxuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbmZsaWN0KGh1bmssIG15Q2hhbmdlcywgdGhlaXJDaGFuZ2VzKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZhbChodW5rLCBtaW5lLCB0aGVpciwgc3dhcCkge1xuICB2YXIgbXlDaGFuZ2VzID0gY29sbGVjdENoYW5nZShtaW5lKSxcbiAgICAgIHRoZWlyQ2hhbmdlcyA9IGNvbGxlY3RDb250ZXh0KHRoZWlyLCBteUNoYW5nZXMpO1xuXG4gIGlmICh0aGVpckNoYW5nZXMubWVyZ2VkKSB7XG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgIHZhciBfaHVuayRsaW5lczY7XG5cbiAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cblxuICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICAoX2h1bmskbGluZXM2ID1cbiAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuICAgIGh1bmsubGluZXMpLnB1c2guYXBwbHkoXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuICAgIF9odW5rJGxpbmVzNlxuICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gICAgLFxuICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICBfdG9Db25zdW1hYmxlQXJyYXkoXG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgICB0aGVpckNoYW5nZXMubWVyZ2VkKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uZmxpY3QoaHVuaywgc3dhcCA/IHRoZWlyQ2hhbmdlcyA6IG15Q2hhbmdlcywgc3dhcCA/IG15Q2hhbmdlcyA6IHRoZWlyQ2hhbmdlcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29uZmxpY3QoaHVuaywgbWluZSwgdGhlaXIpIHtcbiAgaHVuay5jb25mbGljdCA9IHRydWU7XG4gIGh1bmsubGluZXMucHVzaCh7XG4gICAgY29uZmxpY3Q6IHRydWUsXG4gICAgbWluZTogbWluZSxcbiAgICB0aGVpcnM6IHRoZWlyXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpbnNlcnRMZWFkaW5nKGh1bmssIGluc2VydCwgdGhlaXIpIHtcbiAgd2hpbGUgKGluc2VydC5vZmZzZXQgPCB0aGVpci5vZmZzZXQgJiYgaW5zZXJ0LmluZGV4IDwgaW5zZXJ0LmxpbmVzLmxlbmd0aCkge1xuICAgIHZhciBsaW5lID0gaW5zZXJ0LmxpbmVzW2luc2VydC5pbmRleCsrXTtcbiAgICBodW5rLmxpbmVzLnB1c2gobGluZSk7XG4gICAgaW5zZXJ0Lm9mZnNldCsrO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluc2VydFRyYWlsaW5nKGh1bmssIGluc2VydCkge1xuICB3aGlsZSAoaW5zZXJ0LmluZGV4IDwgaW5zZXJ0LmxpbmVzLmxlbmd0aCkge1xuICAgIHZhciBsaW5lID0gaW5zZXJ0LmxpbmVzW2luc2VydC5pbmRleCsrXTtcbiAgICBodW5rLmxpbmVzLnB1c2gobGluZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29sbGVjdENoYW5nZShzdGF0ZSkge1xuICB2YXIgcmV0ID0gW10sXG4gICAgICBvcGVyYXRpb24gPSBzdGF0ZS5saW5lc1tzdGF0ZS5pbmRleF1bMF07XG5cbiAgd2hpbGUgKHN0YXRlLmluZGV4IDwgc3RhdGUubGluZXMubGVuZ3RoKSB7XG4gICAgdmFyIGxpbmUgPSBzdGF0ZS5saW5lc1tzdGF0ZS5pbmRleF07IC8vIEdyb3VwIGFkZGl0aW9ucyB0aGF0IGFyZSBpbW1lZGlhdGVseSBhZnRlciBzdWJ0cmFjdGlvbnMgYW5kIHRyZWF0IHRoZW0gYXMgb25lIFwiYXRvbWljXCIgbW9kaWZ5IGNoYW5nZS5cblxuICAgIGlmIChvcGVyYXRpb24gPT09ICctJyAmJiBsaW5lWzBdID09PSAnKycpIHtcbiAgICAgIG9wZXJhdGlvbiA9ICcrJztcbiAgICB9XG5cbiAgICBpZiAob3BlcmF0aW9uID09PSBsaW5lWzBdKSB7XG4gICAgICByZXQucHVzaChsaW5lKTtcbiAgICAgIHN0YXRlLmluZGV4Kys7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RDb250ZXh0KHN0YXRlLCBtYXRjaENoYW5nZXMpIHtcbiAgdmFyIGNoYW5nZXMgPSBbXSxcbiAgICAgIG1lcmdlZCA9IFtdLFxuICAgICAgbWF0Y2hJbmRleCA9IDAsXG4gICAgICBjb250ZXh0Q2hhbmdlcyA9IGZhbHNlLFxuICAgICAgY29uZmxpY3RlZCA9IGZhbHNlO1xuXG4gIHdoaWxlIChtYXRjaEluZGV4IDwgbWF0Y2hDaGFuZ2VzLmxlbmd0aCAmJiBzdGF0ZS5pbmRleCA8IHN0YXRlLmxpbmVzLmxlbmd0aCkge1xuICAgIHZhciBjaGFuZ2UgPSBzdGF0ZS5saW5lc1tzdGF0ZS5pbmRleF0sXG4gICAgICAgIG1hdGNoID0gbWF0Y2hDaGFuZ2VzW21hdGNoSW5kZXhdOyAvLyBPbmNlIHdlJ3ZlIGhpdCBvdXIgYWRkLCB0aGVuIHdlIGFyZSBkb25lXG5cbiAgICBpZiAobWF0Y2hbMF0gPT09ICcrJykge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgY29udGV4dENoYW5nZXMgPSBjb250ZXh0Q2hhbmdlcyB8fCBjaGFuZ2VbMF0gIT09ICcgJztcbiAgICBtZXJnZWQucHVzaChtYXRjaCk7XG4gICAgbWF0Y2hJbmRleCsrOyAvLyBDb25zdW1lIGFueSBhZGRpdGlvbnMgaW4gdGhlIG90aGVyIGJsb2NrIGFzIGEgY29uZmxpY3QgdG8gYXR0ZW1wdFxuICAgIC8vIHRvIHB1bGwgaW4gdGhlIHJlbWFpbmluZyBjb250ZXh0IGFmdGVyIHRoaXNcblxuICAgIGlmIChjaGFuZ2VbMF0gPT09ICcrJykge1xuICAgICAgY29uZmxpY3RlZCA9IHRydWU7XG5cbiAgICAgIHdoaWxlIChjaGFuZ2VbMF0gPT09ICcrJykge1xuICAgICAgICBjaGFuZ2VzLnB1c2goY2hhbmdlKTtcbiAgICAgICAgY2hhbmdlID0gc3RhdGUubGluZXNbKytzdGF0ZS5pbmRleF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1hdGNoLnN1YnN0cigxKSA9PT0gY2hhbmdlLnN1YnN0cigxKSkge1xuICAgICAgY2hhbmdlcy5wdXNoKGNoYW5nZSk7XG4gICAgICBzdGF0ZS5pbmRleCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25mbGljdGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoKG1hdGNoQ2hhbmdlc1ttYXRjaEluZGV4XSB8fCAnJylbMF0gPT09ICcrJyAmJiBjb250ZXh0Q2hhbmdlcykge1xuICAgIGNvbmZsaWN0ZWQgPSB0cnVlO1xuICB9XG5cbiAgaWYgKGNvbmZsaWN0ZWQpIHtcbiAgICByZXR1cm4gY2hhbmdlcztcbiAgfVxuXG4gIHdoaWxlIChtYXRjaEluZGV4IDwgbWF0Y2hDaGFuZ2VzLmxlbmd0aCkge1xuICAgIG1lcmdlZC5wdXNoKG1hdGNoQ2hhbmdlc1ttYXRjaEluZGV4KytdKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbWVyZ2VkOiBtZXJnZWQsXG4gICAgY2hhbmdlczogY2hhbmdlc1xuICB9O1xufVxuXG5mdW5jdGlvbiBhbGxSZW1vdmVzKGNoYW5nZXMpIHtcbiAgcmV0dXJuIGNoYW5nZXMucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCBjaGFuZ2UpIHtcbiAgICByZXR1cm4gcHJldiAmJiBjaGFuZ2VbMF0gPT09ICctJztcbiAgfSwgdHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIHNraXBSZW1vdmVTdXBlcnNldChzdGF0ZSwgcmVtb3ZlQ2hhbmdlcywgZGVsdGEpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWx0YTsgaSsrKSB7XG4gICAgdmFyIGNoYW5nZUNvbnRlbnQgPSByZW1vdmVDaGFuZ2VzW3JlbW92ZUNoYW5nZXMubGVuZ3RoIC0gZGVsdGEgKyBpXS5zdWJzdHIoMSk7XG5cbiAgICBpZiAoc3RhdGUubGluZXNbc3RhdGUuaW5kZXggKyBpXSAhPT0gJyAnICsgY2hhbmdlQ29udGVudCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRlLmluZGV4ICs9IGRlbHRhO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY2FsY09sZE5ld0xpbmVDb3VudChsaW5lcykge1xuICB2YXIgb2xkTGluZXMgPSAwO1xuICB2YXIgbmV3TGluZXMgPSAwO1xuICBsaW5lcy5mb3JFYWNoKGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgaWYgKHR5cGVvZiBsaW5lICE9PSAnc3RyaW5nJykge1xuICAgICAgdmFyIG15Q291bnQgPSBjYWxjT2xkTmV3TGluZUNvdW50KGxpbmUubWluZSk7XG4gICAgICB2YXIgdGhlaXJDb3VudCA9IGNhbGNPbGROZXdMaW5lQ291bnQobGluZS50aGVpcnMpO1xuXG4gICAgICBpZiAob2xkTGluZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAobXlDb3VudC5vbGRMaW5lcyA9PT0gdGhlaXJDb3VudC5vbGRMaW5lcykge1xuICAgICAgICAgIG9sZExpbmVzICs9IG15Q291bnQub2xkTGluZXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2xkTGluZXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG5ld0xpbmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKG15Q291bnQubmV3TGluZXMgPT09IHRoZWlyQ291bnQubmV3TGluZXMpIHtcbiAgICAgICAgICBuZXdMaW5lcyArPSBteUNvdW50Lm5ld0xpbmVzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld0xpbmVzID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChuZXdMaW5lcyAhPT0gdW5kZWZpbmVkICYmIChsaW5lWzBdID09PSAnKycgfHwgbGluZVswXSA9PT0gJyAnKSkge1xuICAgICAgICBuZXdMaW5lcysrO1xuICAgICAgfVxuXG4gICAgICBpZiAob2xkTGluZXMgIT09IHVuZGVmaW5lZCAmJiAobGluZVswXSA9PT0gJy0nIHx8IGxpbmVbMF0gPT09ICcgJykpIHtcbiAgICAgICAgb2xkTGluZXMrKztcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZXR1cm4ge1xuICAgIG9sZExpbmVzOiBvbGRMaW5lcyxcbiAgICBuZXdMaW5lczogbmV3TGluZXNcbiAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OXdZWFJqYUM5dFpYSm5aUzVxY3lKZExDSnVZVzFsY3lJNld5SmpZV3hqVEdsdVpVTnZkVzUwSWl3aWFIVnVheUlzSW1OaGJHTlBiR1JPWlhkTWFXNWxRMjkxYm5RaUxDSnNhVzVsY3lJc0ltOXNaRXhwYm1Weklpd2libVYzVEdsdVpYTWlMQ0oxYm1SbFptbHVaV1FpTENKdFpYSm5aU0lzSW0xcGJtVWlMQ0owYUdWcGNuTWlMQ0ppWVhObElpd2liRzloWkZCaGRHTm9JaXdpY21WMElpd2lhVzVrWlhnaUxDSnVaWGRHYVd4bFRtRnRaU0lzSW1acGJHVk9ZVzFsUTJoaGJtZGxaQ0lzSW05c1pFWnBiR1ZPWVcxbElpd2liMnhrU0dWaFpHVnlJaXdpYm1WM1NHVmhaR1Z5SWl3aWMyVnNaV04wUm1sbGJHUWlMQ0pvZFc1cmN5SXNJbTFwYm1WSmJtUmxlQ0lzSW5Sb1pXbHljMGx1WkdWNElpd2liV2x1WlU5bVpuTmxkQ0lzSW5Sb1pXbHljMDltWm5ObGRDSXNJbXhsYm1kMGFDSXNJbTFwYm1WRGRYSnlaVzUwSWl3aWIyeGtVM1JoY25RaUxDSkpibVpwYm1sMGVTSXNJblJvWldseWMwTjFjbkpsYm5RaUxDSm9kVzVyUW1WbWIzSmxJaXdpY0hWemFDSXNJbU5zYjI1bFNIVnVheUlzSW0xbGNtZGxaRWgxYm1zaUxDSk5ZWFJvSWl3aWJXbHVJaXdpYm1WM1UzUmhjblFpTENKdFpYSm5aVXhwYm1Weklpd2ljR0Z5WVcwaUxDSjBaWE4wSWl3aWNHRnljMlZRWVhSamFDSXNJa1Z5Y205eUlpd2ljM1J5ZFdOMGRYSmxaRkJoZEdOb0lpd2ljR0YwWTJnaUxDSmpiMjVtYkdsamRDSXNJbU5vWldOcklpd2liMlptYzJWMElpd2liV2x1WlV4cGJtVnpJaXdpZEdobGFYSlBabVp6WlhRaUxDSjBhR1ZwY2t4cGJtVnpJaXdpZEdobGFYSWlMQ0pwYm5ObGNuUk1aV0ZrYVc1bklpd2lkR2hsYVhKRGRYSnlaVzUwSWl3aWJYVjBkV0ZzUTJoaGJtZGxJaXdpWTI5c2JHVmpkRU5vWVc1blpTSXNJbkpsYlc5MllXd2lMQ0pwYm5ObGNuUlVjbUZwYkdsdVp5SXNJbTE1UTJoaGJtZGxjeUlzSW5Sb1pXbHlRMmhoYm1kbGN5SXNJbUZzYkZKbGJXOTJaWE1pTENKaGNuSmhlVk4wWVhKMGMxZHBkR2dpTENKemEybHdVbVZ0YjNabFUzVndaWEp6WlhRaUxDSmhjbkpoZVVWeGRXRnNJaXdpYzNkaGNDSXNJbU52Ykd4bFkzUkRiMjUwWlhoMElpd2liV1Z5WjJWa0lpd2lhVzV6WlhKMElpd2liR2x1WlNJc0luTjBZWFJsSWl3aWIzQmxjbUYwYVc5dUlpd2liV0YwWTJoRGFHRnVaMlZ6SWl3aVkyaGhibWRsY3lJc0ltMWhkR05vU1c1a1pYZ2lMQ0pqYjI1MFpYaDBRMmhoYm1kbGN5SXNJbU52Ym1ac2FXTjBaV1FpTENKamFHRnVaMlVpTENKdFlYUmphQ0lzSW5OMVluTjBjaUlzSW5KbFpIVmpaU0lzSW5CeVpYWWlMQ0p5WlcxdmRtVkRhR0Z1WjJWeklpd2laR1ZzZEdFaUxDSnBJaXdpWTJoaGJtZGxRMjl1ZEdWdWRDSXNJbVp2Y2tWaFkyZ2lMQ0p0ZVVOdmRXNTBJaXdpZEdobGFYSkRiM1Z1ZENKZExDSnRZWEJ3YVc1bmN5STZJanM3T3pzN096czdPenRCUVVGQk8wRkJRVUU3UVVGQlFUdEJRVUZCTzBGQlFVRTdPMEZCUTBFN1FVRkJRVHRCUVVGQk8wRkJRVUU3UVVGQlFUczdRVUZGUVR0QlFVRkJPMEZCUVVFN1FVRkJRVHRCUVVGQk96czdPenM3T3pzN096czdPenM3UVVGRlR5eFRRVUZUUVN4aFFVRlVMRU5CUVhWQ1F5eEpRVUYyUWl4RlFVRTJRanRCUVVGQk8wRkJRVUU3UVVGQlFUdEJRVU5NUXl4RlFVRkJRU3h0UWtGQmJVSXNRMEZCUTBRc1NVRkJTU3hEUVVGRFJTeExRVUZPTEVOQlJHUTdRVUZCUVN4TlFVTXpRa01zVVVGRU1rSXNkMEpCUXpOQ1FTeFJRVVF5UWp0QlFVRkJMRTFCUTJwQ1F5eFJRVVJwUWl4M1FrRkRha0pCTEZGQlJHbENPenRCUVVkc1F5eE5RVUZKUkN4UlFVRlJMRXRCUVV0RkxGTkJRV3BDTEVWQlFUUkNPMEZCUXpGQ1RDeEpRVUZCUVN4SlFVRkpMRU5CUVVOSExGRkJRVXdzUjBGQlowSkJMRkZCUVdoQ08wRkJRMFFzUjBGR1JDeE5RVVZQTzBGQlEwd3NWMEZCVDBnc1NVRkJTU3hEUVVGRFJ5eFJRVUZhTzBGQlEwUTdPMEZCUlVRc1RVRkJTVU1zVVVGQlVTeExRVUZMUXl4VFFVRnFRaXhGUVVFMFFqdEJRVU14UWt3c1NVRkJRVUVzU1VGQlNTeERRVUZEU1N4UlFVRk1MRWRCUVdkQ1FTeFJRVUZvUWp0QlFVTkVMRWRCUmtRc1RVRkZUenRCUVVOTUxGZEJRVTlLTEVsQlFVa3NRMEZCUTBrc1VVRkJXanRCUVVORU8wRkJRMFk3TzBGQlJVMHNVMEZCVTBVc1MwRkJWQ3hEUVVGbFF5eEpRVUZtTEVWQlFYRkNReXhOUVVGeVFpeEZRVUUyUWtNc1NVRkJOMElzUlVGQmJVTTdRVUZEZUVOR0xFVkJRVUZCTEVsQlFVa3NSMEZCUjBjc1UwRkJVeXhEUVVGRFNDeEpRVUZFTEVWQlFVOUZMRWxCUVZBc1EwRkJhRUk3UVVGRFFVUXNSVUZCUVVFc1RVRkJUU3hIUVVGSFJTeFRRVUZUTEVOQlFVTkdMRTFCUVVRc1JVRkJVME1zU1VGQlZDeERRVUZzUWp0QlFVVkJMRTFCUVVsRkxFZEJRVWNzUjBGQlJ5eEZRVUZXTEVOQlNuZERMRU5CVFhoRE8wRkJRMEU3UVVGRFFUczdRVUZEUVN4TlFVRkpTaXhKUVVGSkxFTkJRVU5MTEV0QlFVd3NTVUZCWTBvc1RVRkJUU3hEUVVGRFNTeExRVUY2UWl4RlFVRm5RenRCUVVNNVFrUXNTVUZCUVVFc1IwRkJSeXhEUVVGRFF5eExRVUZLTEVkQlFWbE1MRWxCUVVrc1EwRkJRMHNzUzBGQlRDeEpRVUZqU2l4TlFVRk5MRU5CUVVOSkxFdEJRV3BETzBGQlEwUTdPMEZCUlVRc1RVRkJTVXdzU1VGQlNTeERRVUZEVFN4WFFVRk1MRWxCUVc5Q1RDeE5RVUZOTEVOQlFVTkxMRmRCUVM5Q0xFVkJRVFJETzBGQlF6RkRMRkZCUVVrc1EwRkJRME1zWlVGQlpTeERRVUZEVUN4SlFVRkVMRU5CUVhCQ0xFVkJRVFJDTzBGQlF6RkNPMEZCUTBGSkxFMUJRVUZCTEVkQlFVY3NRMEZCUTBrc1YwRkJTaXhIUVVGclFsQXNUVUZCVFN4RFFVRkRUeXhYUVVGUUxFbEJRWE5DVWl4SlFVRkpMRU5CUVVOUkxGZEJRVGRETzBGQlEwRktMRTFCUVVGQkxFZEJRVWNzUTBGQlEwVXNWMEZCU2l4SFFVRnJRa3dzVFVGQlRTeERRVUZEU3l4WFFVRlFMRWxCUVhOQ1RpeEpRVUZKTEVOQlFVTk5MRmRCUVRkRE8wRkJRMEZHTEUxQlFVRkJMRWRCUVVjc1EwRkJRMHNzVTBGQlNpeEhRVUZuUWxJc1RVRkJUU3hEUVVGRFVTeFRRVUZRTEVsQlFXOUNWQ3hKUVVGSkxFTkJRVU5UTEZOQlFYcERPMEZCUTBGTUxFMUJRVUZCTEVkQlFVY3NRMEZCUTAwc1UwRkJTaXhIUVVGblFsUXNUVUZCVFN4RFFVRkRVeXhUUVVGUUxFbEJRVzlDVml4SlFVRkpMRU5CUVVOVkxGTkJRWHBETzBGQlEwUXNTMEZPUkN4TlFVMVBMRWxCUVVrc1EwRkJRMGdzWlVGQlpTeERRVUZEVGl4TlFVRkVMRU5CUVhCQ0xFVkJRVGhDTzBGQlEyNURPMEZCUTBGSExFMUJRVUZCTEVkQlFVY3NRMEZCUTBrc1YwRkJTaXhIUVVGclFsSXNTVUZCU1N4RFFVRkRVU3hYUVVGMlFqdEJRVU5CU2l4TlFVRkJRU3hIUVVGSExFTkJRVU5GTEZkQlFVb3NSMEZCYTBKT0xFbEJRVWtzUTBGQlEwMHNWMEZCZGtJN1FVRkRRVVlzVFVGQlFVRXNSMEZCUnl4RFFVRkRTeXhUUVVGS0xFZEJRV2RDVkN4SlFVRkpMRU5CUVVOVExGTkJRWEpDTzBGQlEwRk1MRTFCUVVGQkxFZEJRVWNzUTBGQlEwMHNVMEZCU2l4SFFVRm5RbFlzU1VGQlNTeERRVUZEVlN4VFFVRnlRanRCUVVORUxFdEJUazBzVFVGTlFUdEJRVU5NTzBGQlEwRk9MRTFCUVVGQkxFZEJRVWNzUTBGQlEwa3NWMEZCU2l4SFFVRnJRa2NzVjBGQlZ5eERRVUZEVUN4SFFVRkVMRVZCUVUxS0xFbEJRVWtzUTBGQlExRXNWMEZCV0N4RlFVRjNRbEFzVFVGQlRTeERRVUZEVHl4WFFVRXZRaXhEUVVFM1FqdEJRVU5CU2l4TlFVRkJRU3hIUVVGSExFTkJRVU5GTEZkQlFVb3NSMEZCYTBKTExGZEJRVmNzUTBGQlExQXNSMEZCUkN4RlFVRk5TaXhKUVVGSkxFTkJRVU5OTEZkQlFWZ3NSVUZCZDBKTUxFMUJRVTBzUTBGQlEwc3NWMEZCTDBJc1EwRkJOMEk3UVVGRFFVWXNUVUZCUVVFc1IwRkJSeXhEUVVGRFN5eFRRVUZLTEVkQlFXZENSU3hYUVVGWExFTkJRVU5RTEVkQlFVUXNSVUZCVFVvc1NVRkJTU3hEUVVGRFV5eFRRVUZZTEVWQlFYTkNVaXhOUVVGTkxFTkJRVU5STEZOQlFUZENMRU5CUVROQ08wRkJRMEZNTEUxQlFVRkJMRWRCUVVjc1EwRkJRMDBzVTBGQlNpeEhRVUZuUWtNc1YwRkJWeXhEUVVGRFVDeEhRVUZFTEVWQlFVMUtMRWxCUVVrc1EwRkJRMVVzVTBGQldDeEZRVUZ6UWxRc1RVRkJUU3hEUVVGRFV5eFRRVUUzUWl4RFFVRXpRanRCUVVORU8wRkJRMFk3TzBGQlJVUk9MRVZCUVVGQkxFZEJRVWNzUTBGQlExRXNTMEZCU2l4SFFVRlpMRVZCUVZvN1FVRkZRU3hOUVVGSlF5eFRRVUZUTEVkQlFVY3NRMEZCYUVJN1FVRkJRU3hOUVVOSlF5eFhRVUZYTEVkQlFVY3NRMEZFYkVJN1FVRkJRU3hOUVVWSlF5eFZRVUZWTEVkQlFVY3NRMEZHYWtJN1FVRkJRU3hOUVVkSlF5eFpRVUZaTEVkQlFVY3NRMEZJYmtJN08wRkJTMEVzVTBGQlQwZ3NVMEZCVXl4SFFVRkhZaXhKUVVGSkxFTkJRVU5aTEV0QlFVd3NRMEZCVjBzc1RVRkJka0lzU1VGQmFVTklMRmRCUVZjc1IwRkJSMklzVFVGQlRTeERRVUZEVnl4TFFVRlFMRU5CUVdGTExFMUJRVzVGTEVWQlFUSkZPMEZCUTNwRkxGRkJRVWxETEZkQlFWY3NSMEZCUjJ4Q0xFbEJRVWtzUTBGQlExa3NTMEZCVEN4RFFVRlhReXhUUVVGWUxFdEJRWGxDTzBGQlFVTk5MRTFCUVVGQkxGRkJRVkVzUlVGQlJVTTdRVUZCV0N4TFFVRXpRenRCUVVGQkxGRkJRMGxETEdGQlFXRXNSMEZCUjNCQ0xFMUJRVTBzUTBGQlExY3NTMEZCVUN4RFFVRmhSU3hYUVVGaUxFdEJRVFpDTzBGQlFVTkxMRTFCUVVGQkxGRkJRVkVzUlVGQlJVTTdRVUZCV0N4TFFVUnFSRHM3UVVGSFFTeFJRVUZKUlN4VlFVRlZMRU5CUVVOS0xGZEJRVVFzUlVGQlkwY3NZVUZCWkN4RFFVRmtMRVZCUVRSRE8wRkJRekZETzBGQlEwRnFRaXhOUVVGQlFTeEhRVUZITEVOQlFVTlJMRXRCUVVvc1EwRkJWVmNzU1VGQlZpeERRVUZsUXl4VFFVRlRMRU5CUVVOT0xGZEJRVVFzUlVGQlkwZ3NWVUZCWkN4RFFVRjRRanRCUVVOQlJpeE5RVUZCUVN4VFFVRlRPMEZCUTFSSExFMUJRVUZCTEZsQlFWa3NTVUZCU1VVc1YwRkJWeXhEUVVGRGNrSXNVVUZCV2l4SFFVRjFRbkZDTEZkQlFWY3NRMEZCUTNSQ0xGRkJRVzVFTzBGQlEwUXNTMEZNUkN4TlFVdFBMRWxCUVVrd1FpeFZRVUZWTEVOQlFVTkVMR0ZCUVVRc1JVRkJaMEpJTEZkQlFXaENMRU5CUVdRc1JVRkJORU03UVVGRGFrUTdRVUZEUVdRc1RVRkJRVUVzUjBGQlJ5eERRVUZEVVN4TFFVRktMRU5CUVZWWExFbEJRVllzUTBGQlpVTXNVMEZCVXl4RFFVRkRTQ3hoUVVGRUxFVkJRV2RDVEN4WlFVRm9RaXhEUVVGNFFqdEJRVU5CUml4TlFVRkJRU3hYUVVGWE8wRkJRMWhETEUxQlFVRkJMRlZCUVZVc1NVRkJTVTBzWVVGQllTeERRVUZEZUVJc1VVRkJaQ3hIUVVGNVFuZENMR0ZCUVdFc1EwRkJRM3BDTEZGQlFYSkVPMEZCUTBRc1MwRk1UU3hOUVV0Qk8wRkJRMHc3UVVGRFFTeFZRVUZKTmtJc1ZVRkJWU3hIUVVGSE8wRkJRMlpPTEZGQlFVRkJMRkZCUVZFc1JVRkJSVThzU1VGQlNTeERRVUZEUXl4SFFVRk1MRU5CUVZOVUxGZEJRVmNzUTBGQlEwTXNVVUZCY2tJc1JVRkJLMEpGTEdGQlFXRXNRMEZCUTBZc1VVRkJOME1zUTBGRVN6dEJRVVZtZGtJc1VVRkJRVUVzVVVGQlVTeEZRVUZGTEVOQlJrczdRVUZIWm1kRExGRkJRVUZCTEZGQlFWRXNSVUZCUlVZc1NVRkJTU3hEUVVGRFF5eEhRVUZNTEVOQlFWTlVMRmRCUVZjc1EwRkJRMVVzVVVGQldpeEhRVUYxUW1Jc1ZVRkJhRU1zUlVGQk5FTk5MR0ZCUVdFc1EwRkJRMFlzVVVGQlpDeEhRVUY1UWtnc1dVRkJja1VzUTBGSVN6dEJRVWxtYmtJc1VVRkJRVUVzVVVGQlVTeEZRVUZGTEVOQlNrczdRVUZMWmtZc1VVRkJRVUVzUzBGQlN5eEZRVUZGTzBGQlRGRXNUMEZCYWtJN1FVRlBRV3RETEUxQlFVRkJMRlZCUVZVc1EwRkJRMG9zVlVGQlJDeEZRVUZoVUN4WFFVRlhMRU5CUVVORExGRkJRWHBDTEVWQlFXMURSQ3hYUVVGWExFTkJRVU4yUWl4TFFVRXZReXhGUVVGelJEQkNMR0ZCUVdFc1EwRkJRMFlzVVVGQmNFVXNSVUZCT0VWRkxHRkJRV0VzUTBGQlF6RkNMRXRCUVRWR0xFTkJRVlk3UVVGRFFXMUNMRTFCUVVGQkxGZEJRVmM3UVVGRFdFUXNUVUZCUVVFc1UwRkJVenRCUVVWVVZDeE5RVUZCUVN4SFFVRkhMRU5CUVVOUkxFdEJRVW9zUTBGQlZWY3NTVUZCVml4RFFVRmxSU3hWUVVGbU8wRkJRMFE3UVVGRFJqczdRVUZGUkN4VFFVRlBja0lzUjBGQlVEdEJRVU5FT3p0QlFVVkVMRk5CUVZORUxGTkJRVlFzUTBGQmJVSXlRaXhMUVVGdVFpeEZRVUV3UWpWQ0xFbEJRVEZDTEVWQlFXZERPMEZCUXpsQ0xFMUJRVWtzVDBGQlR6UkNMRXRCUVZBc1MwRkJhVUlzVVVGQmNrSXNSVUZCSzBJN1FVRkROMElzVVVGQlN5eE5RVUZFTEVOQlFWTkRMRWxCUVZRc1EwRkJZMFFzUzBGQlpDeExRVUV3UWl4VlFVRkVMRU5CUVdGRExFbEJRV0lzUTBGQmEwSkVMRXRCUVd4Q0xFTkJRVGRDTEVWQlFYZEVPMEZCUTNSRUxHRkJRVTg3UVVGQlFUdEJRVUZCTzBGQlFVRTdPMEZCUVVGRk8wRkJRVUZCTzBGQlFVRkJPMEZCUVVGQk8wRkJRVUZCTzBGQlFVRkJPMEZCUVVFN1FVRkJRU3hUUVVGWFJpeExRVUZZTEVWQlFXdENMRU5CUVd4Q08wRkJRVkE3UVVGRFJEczdRVUZGUkN4UlFVRkpMRU5CUVVNMVFpeEpRVUZNTEVWQlFWYzdRVUZEVkN4WlFVRk5MRWxCUVVrclFpeExRVUZLTEVOQlFWVXNhMFJCUVZZc1EwRkJUanRCUVVORU96dEJRVU5FTEZkQlFVODdRVUZCUVR0QlFVRkJPMEZCUVVFN08wRkJRVUZETzBGQlFVRkJPMEZCUVVGQk8wRkJRVUZCTzBGQlFVRkJPMEZCUVVGQk8wRkJRVUU3UVVGQlFTeFBRVUZuUW5CRExGTkJRV2hDTEVWQlFUSkNRU3hUUVVFelFpeEZRVUZ6UTBrc1NVRkJkRU1zUlVGQk5FTTBRaXhMUVVFMVF6dEJRVUZRTzBGQlEwUTdPMEZCUlVRc1UwRkJUMEVzUzBGQlVEdEJRVU5FT3p0QlFVVkVMRk5CUVZOMlFpeGxRVUZVTEVOQlFYbENORUlzUzBGQmVrSXNSVUZCWjBNN1FVRkRPVUlzVTBGQlQwRXNTMEZCU3l4RFFVRkROMElzVjBGQlRpeEpRVUZ4UWpaQ0xFdEJRVXNzUTBGQlF6ZENMRmRCUVU0c1MwRkJjMEkyUWl4TFFVRkxMRU5CUVVNelFpeFhRVUY0UkR0QlFVTkVPenRCUVVWRUxGTkJRVk5ITEZkQlFWUXNRMEZCY1VKT0xFdEJRWEpDTEVWQlFUUkNUQ3hKUVVFMVFpeEZRVUZyUTBNc1RVRkJiRU1zUlVGQk1FTTdRVUZEZUVNc1RVRkJTVVFzU1VGQlNTeExRVUZMUXl4TlFVRmlMRVZCUVhGQ08wRkJRMjVDTEZkQlFVOUVMRWxCUVZBN1FVRkRSQ3hIUVVaRUxFMUJSVTg3UVVGRFRFc3NTVUZCUVVFc1MwRkJTeXhEUVVGREswSXNVVUZCVGl4SFFVRnBRaXhKUVVGcVFqdEJRVU5CTEZkQlFVODdRVUZCUTNCRExFMUJRVUZCTEVsQlFVa3NSVUZCU2tFc1NVRkJSRHRCUVVGUFF5eE5RVUZCUVN4TlFVRk5MRVZCUVU1Qk8wRkJRVkFzUzBGQlVEdEJRVU5FTzBGQlEwWTdPMEZCUlVRc1UwRkJVM0ZDTEZWQlFWUXNRMEZCYjBKVExFbEJRWEJDTEVWQlFUQkNUU3hMUVVFeFFpeEZRVUZwUXp0QlFVTXZRaXhUUVVGUFRpeEpRVUZKTEVOQlFVTmFMRkZCUVV3c1IwRkJaMEpyUWl4TFFVRkxMRU5CUVVOc1FpeFJRVUYwUWl4SlFVTkVXU3hKUVVGSkxFTkJRVU5hTEZGQlFVd3NSMEZCWjBKWkxFbEJRVWtzUTBGQlEyNURMRkZCUVhSQ0xFZEJRV3REZVVNc1MwRkJTeXhEUVVGRGJFSXNVVUZFTjBNN1FVRkZSRHM3UVVGRlJDeFRRVUZUU3l4VFFVRlVMRU5CUVcxQ0wwSXNTVUZCYmtJc1JVRkJlVUkyUXl4TlFVRjZRaXhGUVVGcFF6dEJRVU12UWl4VFFVRlBPMEZCUTB4dVFpeEpRVUZCUVN4UlFVRlJMRVZCUVVVeFFpeEpRVUZKTEVOQlFVTXdRaXhSUVVSV08wRkJRMjlDZGtJc1NVRkJRVUVzVVVGQlVTeEZRVUZGU0N4SlFVRkpMRU5CUVVOSExGRkJSRzVETzBGQlJVeG5ReXhKUVVGQlFTeFJRVUZSTEVWQlFVVnVReXhKUVVGSkxFTkJRVU50UXl4UlFVRk1MRWRCUVdkQ1ZTeE5RVVp5UWp0QlFVVTJRbnBETEVsQlFVRkJMRkZCUVZFc1JVRkJSVW9zU1VGQlNTeERRVUZEU1N4UlFVWTFRenRCUVVkTVJpeEpRVUZCUVN4TFFVRkxMRVZCUVVWR0xFbEJRVWtzUTBGQlEwVTdRVUZJVUN4SFFVRlFPMEZCUzBRN08wRkJSVVFzVTBGQlUydERMRlZCUVZRc1EwRkJiMEp3UXl4SlFVRndRaXhGUVVFd1FuTkNMRlZCUVRGQ0xFVkJRWE5EZDBJc1UwRkJkRU1zUlVGQmFVUkRMRmRCUVdwRUxFVkJRVGhFUXl4VlFVRTVSQ3hGUVVFd1JUdEJRVU40UlR0QlFVTkJPMEZCUTBFc1RVRkJTWHBETEVsQlFVa3NSMEZCUnp0QlFVRkRjME1zU1VGQlFVRXNUVUZCVFN4RlFVRkZka0lzVlVGQlZEdEJRVUZ4UW5CQ0xFbEJRVUZCTEV0QlFVc3NSVUZCUlRSRExGTkJRVFZDTzBGQlFYVkRiRU1zU1VGQlFVRXNTMEZCU3l4RlFVRkZPMEZCUVRsRExFZEJRVmc3UVVGQlFTeE5RVU5KY1VNc1MwRkJTeXhIUVVGSE8wRkJRVU5LTEVsQlFVRkJMRTFCUVUwc1JVRkJSVVVzVjBGQlZEdEJRVUZ6UWpkRExFbEJRVUZCTEV0QlFVc3NSVUZCUlRoRExGVkJRVGRDTzBGQlFYbERjRU1zU1VGQlFVRXNTMEZCU3l4RlFVRkZPMEZCUVdoRUxFZEJSRm9zUTBGSWQwVXNRMEZOZUVVN08wRkJRMEZ6UXl4RlFVRkJRU3hoUVVGaExFTkJRVU5zUkN4SlFVRkVMRVZCUVU5UExFbEJRVkFzUlVGQllUQkRMRXRCUVdJc1EwRkJZanRCUVVOQlF5eEZRVUZCUVN4aFFVRmhMRU5CUVVOc1JDeEpRVUZFTEVWQlFVOXBSQ3hMUVVGUUxFVkJRV014UXl4SlFVRmtMRU5CUVdJc1EwRlNkMFVzUTBGVmVFVTdPMEZCUTBFc1UwRkJUMEVzU1VGQlNTeERRVUZEU3l4TFFVRk1MRWRCUVdGTUxFbEJRVWtzUTBGQlEwd3NTMEZCVEN4RFFVRlhjMElzVFVGQmVFSXNTVUZCYTBONVFpeExRVUZMTEVOQlFVTnlReXhMUVVGT0xFZEJRV054UXl4TFFVRkxMRU5CUVVNdlF5eExRVUZPTEVOQlFWbHpRaXhOUVVGdVJTeEZRVUV5UlR0QlFVTjZSU3hSUVVGSlF5eFhRVUZYTEVkQlFVZHNRaXhKUVVGSkxFTkJRVU5NTEV0QlFVd3NRMEZCVjBzc1NVRkJTU3hEUVVGRFN5eExRVUZvUWl4RFFVRnNRanRCUVVGQkxGRkJRMGwxUXl4WlFVRlpMRWRCUVVkR0xFdEJRVXNzUTBGQlF5OURMRXRCUVU0c1EwRkJXU3RETEV0QlFVc3NRMEZCUTNKRExFdEJRV3hDTEVOQlJHNUNPenRCUVVkQkxGRkJRVWtzUTBGQlEyRXNWMEZCVnl4RFFVRkRMRU5CUVVRc1EwRkJXQ3hMUVVGdFFpeEhRVUZ1UWl4SlFVRXdRa0VzVjBGQlZ5eERRVUZETEVOQlFVUXNRMEZCV0N4TFFVRnRRaXhIUVVFNVF5eE5RVU5KTUVJc1dVRkJXU3hEUVVGRExFTkJRVVFzUTBGQldpeExRVUZ2UWl4SFFVRndRaXhKUVVFeVFrRXNXVUZCV1N4RFFVRkRMRU5CUVVRc1EwRkJXaXhMUVVGdlFpeEhRVVJ1UkN4RFFVRktMRVZCUXpaRU8wRkJRek5FTzBGQlEwRkRMRTFCUVVGQkxGbEJRVmtzUTBGQlEzQkVMRWxCUVVRc1JVRkJUMDhzU1VGQlVDeEZRVUZoTUVNc1MwRkJZaXhEUVVGYU8wRkJRMFFzUzBGS1JDeE5RVWxQTEVsQlFVbDRRaXhYUVVGWExFTkJRVU1zUTBGQlJDeERRVUZZTEV0QlFXMUNMRWRCUVc1Q0xFbEJRVEJDTUVJc1dVRkJXU3hEUVVGRExFTkJRVVFzUTBGQldpeExRVUZ2UWl4SFFVRnNSQ3hGUVVGMVJEdEJRVUZCTzBGQlFVRTdPMEZCUVVFN1FVRkROVVE3TzBGQlEwRTdPMEZCUVVFN08wRkJRVUU3UVVGQlFUdEJRVUZCTzBGQlFVRnVSQ3hOUVVGQlFTeEpRVUZKTEVOQlFVTkZMRXRCUVV3c1JVRkJWelJDTEVsQlFWZzdRVUZCUVR0QlFVRkJPMEZCUVVFN1FVRkJRVHRCUVVGQk8wRkJRVUU3UVVGQlFUdEJRVUZ2UW5WQ0xFMUJRVUZCTEdGQlFXRXNRMEZCUXpsRExFbEJRVVFzUTBGQmFrTTdRVUZEUkN4TFFVaE5MRTFCUjBFc1NVRkJTVFJETEZsQlFWa3NRMEZCUXl4RFFVRkVMRU5CUVZvc1MwRkJiMElzUjBGQmNFSXNTVUZCTWtJeFFpeFhRVUZYTEVOQlFVTXNRMEZCUkN4RFFVRllMRXRCUVcxQ0xFZEJRV3hFTEVWQlFYVkVPMEZCUVVFN1FVRkJRVHM3UVVGQlFUdEJRVU0xUkRzN1FVRkRRVHM3UVVGQlFUczdRVUZCUVR0QlFVRkJPMEZCUVVFN1FVRkJRWHBDTEUxQlFVRkJMRWxCUVVrc1EwRkJRMFVzUzBGQlRDeEZRVUZYTkVJc1NVRkJXRHRCUVVGQk8wRkJRVUU3UVVGQlFUdEJRVUZCTzBGQlFVRTdRVUZCUVR0QlFVRkJPMEZCUVc5Q2RVSXNUVUZCUVVFc1lVRkJZU3hEUVVGRFNpeExRVUZFTEVOQlFXcERPMEZCUTBRc1MwRklUU3hOUVVkQkxFbEJRVWw0UWl4WFFVRlhMRU5CUVVNc1EwRkJSQ3hEUVVGWUxFdEJRVzFDTEVkQlFXNUNMRWxCUVRCQ01FSXNXVUZCV1N4RFFVRkRMRU5CUVVRc1EwRkJXaXhMUVVGdlFpeEhRVUZzUkN4RlFVRjFSRHRCUVVNMVJEdEJRVU5CUnl4TlFVRkJRU3hQUVVGUExFTkJRVU4wUkN4SlFVRkVMRVZCUVU5UExFbEJRVkFzUlVGQllUQkRMRXRCUVdJc1EwRkJVRHRCUVVORUxFdEJTRTBzVFVGSFFTeEpRVUZKUlN4WlFVRlpMRU5CUVVNc1EwRkJSQ3hEUVVGYUxFdEJRVzlDTEVkQlFYQkNMRWxCUVRKQ01VSXNWMEZCVnl4RFFVRkRMRU5CUVVRc1EwRkJXQ3hMUVVGdFFpeEhRVUZzUkN4RlFVRjFSRHRCUVVNMVJEdEJRVU5CTmtJc1RVRkJRVUVzVDBGQlR5eERRVUZEZEVRc1NVRkJSQ3hGUVVGUGFVUXNTMEZCVUN4RlFVRmpNVU1zU1VGQlpDeEZRVUZ2UWl4SlFVRndRaXhEUVVGUU8wRkJRMFFzUzBGSVRTeE5RVWRCTEVsQlFVbHJRaXhYUVVGWExFdEJRVXN3UWl4WlFVRndRaXhGUVVGclF6dEJRVU4yUXp0QlFVTkJia1FzVFVGQlFVRXNTVUZCU1N4RFFVRkRSU3hMUVVGTUxFTkJRVmMwUWl4SlFVRllMRU5CUVdkQ1RDeFhRVUZvUWp0QlFVTkJiRUlzVFVGQlFVRXNTVUZCU1N4RFFVRkRTeXhMUVVGTU8wRkJRMEZ4UXl4TlFVRkJRU3hMUVVGTExFTkJRVU55UXl4TFFVRk9PMEZCUTBRc1MwRk1UU3hOUVV0Qk8wRkJRMHc3UVVGRFFTdENMRTFCUVVGQkxGRkJRVkVzUTBGQlF6TkRMRWxCUVVRc1JVRkJUM0ZFTEdGQlFXRXNRMEZCUXpsRExFbEJRVVFzUTBGQmNFSXNSVUZCTkVJNFF5eGhRVUZoTEVOQlFVTktMRXRCUVVRc1EwRkJla01zUTBGQlVqdEJRVU5FTzBGQlEwWXNSMEY0UTNWRkxFTkJNRU40UlRzN08wRkJRMEZOTEVWQlFVRkJMR05CUVdNc1EwRkJRM1pFTEVsQlFVUXNSVUZCVDA4c1NVRkJVQ3hEUVVGa08wRkJRMEZuUkN4RlFVRkJRU3hqUVVGakxFTkJRVU4yUkN4SlFVRkVMRVZCUVU5cFJDeExRVUZRTEVOQlFXUTdRVUZGUVd4RUxFVkJRVUZCTEdGQlFXRXNRMEZCUTBNc1NVRkJSQ3hEUVVGaU8wRkJRMFE3TzBGQlJVUXNVMEZCVTI5RUxGbEJRVlFzUTBGQmMwSndSQ3hKUVVGMFFpeEZRVUUwUWs4c1NVRkJOVUlzUlVGQmEwTXdReXhMUVVGc1F5eEZRVUY1UXp0QlFVTjJReXhOUVVGSlR5eFRRVUZUTEVkQlFVZElMR0ZCUVdFc1EwRkJRemxETEVsQlFVUXNRMEZCTjBJN1FVRkJRU3hOUVVOSmEwUXNXVUZCV1N4SFFVRkhTaXhoUVVGaExFTkJRVU5LTEV0QlFVUXNRMEZFYUVNN08wRkJSMEVzVFVGQlNWTXNWVUZCVlN4RFFVRkRSaXhUUVVGRUxFTkJRVllzU1VGQmVVSkZMRlZCUVZVc1EwRkJRMFFzV1VGQlJDeERRVUYyUXl4RlFVRjFSRHRCUVVOeVJEdEJRVU5CTzBGQlFVazdRVUZCUVR0QlFVRkJPenRCUVVGQlJUdEJRVUZCUVR0QlFVRkJRVHRCUVVGQlFUdEJRVUZCUVR0QlFVRkJRVHRCUVVGQk8wRkJRVUVzUzBGQlowSklMRk5CUVdoQ0xFVkJRVEpDUXl4WlFVRXpRaXhMUVVOSFJ5eHJRa0ZCYTBJc1EwRkJRMWdzUzBGQlJDeEZRVUZSVHl4VFFVRlNMRVZCUVcxQ1FTeFRRVUZUTEVOQlFVTm9ReXhOUVVGV0xFZEJRVzFDYVVNc1dVRkJXU3hEUVVGRGFrTXNUVUZCYmtRc1EwRkVla0lzUlVGRGNVWTdRVUZCUVR0QlFVRkJPenRCUVVGQk96dEJRVU51UmpzN1FVRkJRVHM3UVVGQlFUdEJRVUZCTzBGQlFVRTdRVUZCUVhoQ0xFMUJRVUZCTEVsQlFVa3NRMEZCUTBVc1MwRkJUQ3hGUVVGWE5FSXNTVUZCV0R0QlFVRkJPMEZCUVVFN1FVRkJRVHRCUVVGQk8wRkJRVUU3UVVGQlFUdEJRVUZCTzBGQlFXOUNNRUlzVFVGQlFVRXNVMEZCY0VJN08wRkJRMEU3UVVGRFJDeExRVXBFTEUxQlNVODdRVUZCU1R0QlFVRkJPMEZCUVVFN08wRkJRVUZITzBGQlFVRkJPMEZCUVVGQk8wRkJRVUZCTzBGQlFVRkJPMEZCUVVGQk8wRkJRVUU3UVVGQlFTeExRVUZuUWtZc1dVRkJhRUlzUlVGQk9FSkVMRk5CUVRsQ0xFdEJRMHBKTEd0Q1FVRnJRaXhEUVVGRGNrUXNTVUZCUkN4RlFVRlBhMFFzV1VGQlVDeEZRVUZ4UWtFc1dVRkJXU3hEUVVGRGFrTXNUVUZCWWl4SFFVRnpRbWRETEZOQlFWTXNRMEZCUTJoRExFMUJRWEpFTEVOQlJHeENMRVZCUTJkR08wRkJRVUU3UVVGQlFUczdRVUZCUVRzN1FVRkRja1k3TzBGQlFVRTdPMEZCUVVFN1FVRkJRVHRCUVVGQk8wRkJRVUY0UWl4TlFVRkJRU3hKUVVGSkxFTkJRVU5GTEV0QlFVd3NSVUZCVnpSQ0xFbEJRVmc3UVVGQlFUdEJRVUZCTzBGQlFVRTdRVUZCUVR0QlFVRkJPMEZCUVVFN1FVRkJRVHRCUVVGdlFqSkNMRTFCUVVGQkxGbEJRWEJDT3p0QlFVTkJPMEZCUTBRN1FVRkRSaXhIUVZoRUxFMUJWMDg3UVVGQlNUdEJRVUZCTzBGQlFVRTdPMEZCUVVGSk8wRkJRVUZCTzBGQlFVRkJPMEZCUVVGQk8wRkJRVUZCTzBGQlFVRkJPMEZCUVVFN1FVRkJRU3hIUVVGWFRDeFRRVUZZTEVWQlFYTkNReXhaUVVGMFFpeERRVUZLTEVWQlFYbERPMEZCUVVFN1FVRkJRVHM3UVVGQlFUczdRVUZET1VNN08wRkJRVUU3TzBGQlFVRTdRVUZCUVR0QlFVRkJPMEZCUVVGNlJDeEpRVUZCUVN4SlFVRkpMRU5CUVVORkxFdEJRVXdzUlVGQlZ6UkNMRWxCUVZnN1FVRkJRVHRCUVVGQk8wRkJRVUU3UVVGQlFUdEJRVUZCTzBGQlFVRTdRVUZCUVR0QlFVRnZRakJDTEVsQlFVRkJMRk5CUVhCQ096dEJRVU5CTzBGQlEwUTdPMEZCUlVSaUxFVkJRVUZCTEZGQlFWRXNRMEZCUXpORExFbEJRVVFzUlVGQlQzZEVMRk5CUVZBc1JVRkJhMEpETEZsQlFXeENMRU5CUVZJN1FVRkRSRHM3UVVGRlJDeFRRVUZUU0N4UFFVRlVMRU5CUVdsQ2RFUXNTVUZCYWtJc1JVRkJkVUpQTEVsQlFYWkNMRVZCUVRaQ01FTXNTMEZCTjBJc1JVRkJiME5oTEVsQlFYQkRMRVZCUVRCRE8wRkJRM2hETEUxQlFVbE9MRk5CUVZNc1IwRkJSMGdzWVVGQllTeERRVUZET1VNc1NVRkJSQ3hEUVVFM1FqdEJRVUZCTEUxQlEwbHJSQ3haUVVGWkxFZEJRVWROTEdOQlFXTXNRMEZCUTJRc1MwRkJSQ3hGUVVGUlR5eFRRVUZTTEVOQlJHcERPenRCUVVWQkxFMUJRVWxETEZsQlFWa3NRMEZCUTA4c1RVRkJha0lzUlVGQmVVSTdRVUZCUVR0QlFVRkJPenRCUVVGQk96dEJRVU4yUWpzN1FVRkJRVHM3UVVGQlFUdEJRVUZCTzBGQlFVRTdRVUZCUVdoRkxFbEJRVUZCTEVsQlFVa3NRMEZCUTBVc1MwRkJUQ3hGUVVGWE5FSXNTVUZCV0R0QlFVRkJPMEZCUVVFN1FVRkJRVHRCUVVGQk8wRkJRVUU3UVVGQlFUdEJRVUZCTzBGQlFXOUNNa0lzU1VGQlFVRXNXVUZCV1N4RFFVRkRUeXhOUVVGcVF6dEJRVU5FTEVkQlJrUXNUVUZGVHp0QlFVTk1ja0lzU1VGQlFVRXNVVUZCVVN4RFFVRkRNME1zU1VGQlJDeEZRVUZQT0VRc1NVRkJTU3hIUVVGSFRDeFpRVUZJTEVkQlFXdENSQ3hUUVVFM1FpeEZRVUYzUTAwc1NVRkJTU3hIUVVGSFRpeFRRVUZJTEVkQlFXVkRMRmxCUVRORUxFTkJRVkk3UVVGRFJEdEJRVU5HT3p0QlFVVkVMRk5CUVZOa0xGRkJRVlFzUTBGQmEwSXpReXhKUVVGc1FpeEZRVUYzUWs4c1NVRkJlRUlzUlVGQk9FSXdReXhMUVVFNVFpeEZRVUZ4UXp0QlFVTnVRMnBFTEVWQlFVRkJMRWxCUVVrc1EwRkJRekpETEZGQlFVd3NSMEZCWjBJc1NVRkJhRUk3UVVGRFFUTkRMRVZCUVVGQkxFbEJRVWtzUTBGQlEwVXNTMEZCVEN4RFFVRlhORUlzU1VGQldDeERRVUZuUWp0QlFVTmtZU3hKUVVGQlFTeFJRVUZSTEVWQlFVVXNTVUZFU1R0QlFVVmtjRU1zU1VGQlFVRXNTVUZCU1N4RlFVRkZRU3hKUVVaUk8wRkJSMlJETEVsQlFVRkJMRTFCUVUwc1JVRkJSWGxETzBGQlNFMHNSMEZCYUVJN1FVRkxSRHM3UVVGRlJDeFRRVUZUUXl4aFFVRlVMRU5CUVhWQ2JFUXNTVUZCZGtJc1JVRkJOa0pwUlN4TlFVRTNRaXhGUVVGeFEyaENMRXRCUVhKRExFVkJRVFJETzBGQlF6RkRMRk5CUVU5blFpeE5RVUZOTEVOQlFVTndRaXhOUVVGUUxFZEJRV2RDU1N4TFFVRkxMRU5CUVVOS0xFMUJRWFJDTEVsQlFXZERiMElzVFVGQlRTeERRVUZEY2tRc1MwRkJVQ3hIUVVGbGNVUXNUVUZCVFN4RFFVRkRMMFFzUzBGQlVDeERRVUZoYzBJc1RVRkJia1VzUlVGQk1rVTdRVUZEZWtVc1VVRkJTVEJETEVsQlFVa3NSMEZCUjBRc1RVRkJUU3hEUVVGREwwUXNTMEZCVUN4RFFVRmhLMFFzVFVGQlRTeERRVUZEY2tRc1MwRkJVQ3hGUVVGaUxFTkJRVmc3UVVGRFFWb3NTVUZCUVVFc1NVRkJTU3hEUVVGRFJTeExRVUZNTEVOQlFWYzBRaXhKUVVGWUxFTkJRV2RDYjBNc1NVRkJhRUk3UVVGRFFVUXNTVUZCUVVFc1RVRkJUU3hEUVVGRGNFSXNUVUZCVUR0QlFVTkVPMEZCUTBZN08wRkJRMFFzVTBGQlUxVXNZMEZCVkN4RFFVRjNRblpFTEVsQlFYaENMRVZCUVRoQ2FVVXNUVUZCT1VJc1JVRkJjME03UVVGRGNFTXNVMEZCVDBFc1RVRkJUU3hEUVVGRGNrUXNTMEZCVUN4SFFVRmxjVVFzVFVGQlRTeERRVUZETDBRc1MwRkJVQ3hEUVVGaGMwSXNUVUZCYmtNc1JVRkJNa003UVVGRGVrTXNVVUZCU1RCRExFbEJRVWtzUjBGQlIwUXNUVUZCVFN4RFFVRkRMMFFzUzBGQlVDeERRVUZoSzBRc1RVRkJUU3hEUVVGRGNrUXNTMEZCVUN4RlFVRmlMRU5CUVZnN1FVRkRRVm9zU1VGQlFVRXNTVUZCU1N4RFFVRkRSU3hMUVVGTUxFTkJRVmMwUWl4SlFVRllMRU5CUVdkQ2IwTXNTVUZCYUVJN1FVRkRSRHRCUVVOR096dEJRVVZFTEZOQlFWTmlMR0ZCUVZRc1EwRkJkVUpqTEV0QlFYWkNMRVZCUVRoQ08wRkJRelZDTEUxQlFVbDRSQ3hIUVVGSExFZEJRVWNzUlVGQlZqdEJRVUZCTEUxQlEwbDVSQ3hUUVVGVExFZEJRVWRFTEV0QlFVc3NRMEZCUTJwRkxFdEJRVTRzUTBGQldXbEZMRXRCUVVzc1EwRkJRM1pFTEV0QlFXeENMRVZCUVhsQ0xFTkJRWHBDTEVOQlJHaENPenRCUVVWQkxGTkJRVTkxUkN4TFFVRkxMRU5CUVVOMlJDeExRVUZPTEVkQlFXTjFSQ3hMUVVGTExFTkJRVU5xUlN4TFFVRk9MRU5CUVZselFpeE5RVUZxUXl4RlFVRjVRenRCUVVOMlF5eFJRVUZKTUVNc1NVRkJTU3hIUVVGSFF5eExRVUZMTEVOQlFVTnFSU3hMUVVGT0xFTkJRVmxwUlN4TFFVRkxMRU5CUVVOMlJDeExRVUZzUWl4RFFVRllMRU5CUkhWRExFTkJSM1pET3p0QlFVTkJMRkZCUVVsM1JDeFRRVUZUTEV0QlFVc3NSMEZCWkN4SlFVRnhRa1lzU1VGQlNTeERRVUZETEVOQlFVUXNRMEZCU2l4TFFVRlpMRWRCUVhKRExFVkJRVEJETzBGQlEzaERSU3hOUVVGQlFTeFRRVUZUTEVkQlFVY3NSMEZCV2p0QlFVTkVPenRCUVVWRUxGRkJRVWxCTEZOQlFWTXNTMEZCUzBZc1NVRkJTU3hEUVVGRExFTkJRVVFzUTBGQmRFSXNSVUZCTWtJN1FVRkRla0oyUkN4TlFVRkJRU3hIUVVGSExFTkJRVU50UWl4SlFVRktMRU5CUVZOdlF5eEpRVUZVTzBGQlEwRkRMRTFCUVVGQkxFdEJRVXNzUTBGQlEzWkVMRXRCUVU0N1FVRkRSQ3hMUVVoRUxFMUJSMDg3UVVGRFREdEJRVU5FTzBGQlEwWTdPMEZCUlVRc1UwRkJUMFFzUjBGQlVEdEJRVU5FT3p0QlFVTkVMRk5CUVZOdlJDeGpRVUZVTEVOQlFYZENTU3hMUVVGNFFpeEZRVUVyUWtVc1dVRkJMMElzUlVGQk5rTTdRVUZETTBNc1RVRkJTVU1zVDBGQlR5eEhRVUZITEVWQlFXUTdRVUZCUVN4TlFVTkpUaXhOUVVGTkxFZEJRVWNzUlVGRVlqdEJRVUZCTEUxQlJVbFBMRlZCUVZVc1IwRkJSeXhEUVVacVFqdEJRVUZCTEUxQlIwbERMR05CUVdNc1IwRkJSeXhMUVVoeVFqdEJRVUZCTEUxQlNVbERMRlZCUVZVc1IwRkJSeXhMUVVwcVFqczdRVUZMUVN4VFFVRlBSaXhWUVVGVkxFZEJRVWRHTEZsQlFWa3NRMEZCUXpkRExFMUJRVEZDTEVsQlEwVXlReXhMUVVGTExFTkJRVU4yUkN4TFFVRk9MRWRCUVdOMVJDeExRVUZMTEVOQlFVTnFSU3hMUVVGT0xFTkJRVmx6UWl4TlFVUnVReXhGUVVNeVF6dEJRVU42UXl4UlFVRkphMFFzVFVGQlRTeEhRVUZIVUN4TFFVRkxMRU5CUVVOcVJTeExRVUZPTEVOQlFWbHBSU3hMUVVGTExFTkJRVU4yUkN4TFFVRnNRaXhEUVVGaU8wRkJRVUVzVVVGRFNTdEVMRXRCUVVzc1IwRkJSMDRzV1VGQldTeERRVUZEUlN4VlFVRkVMRU5CUkhoQ0xFTkJSSGxETEVOQlNYcERPenRCUVVOQkxGRkJRVWxKTEV0QlFVc3NRMEZCUXl4RFFVRkVMRU5CUVV3c1MwRkJZU3hIUVVGcVFpeEZRVUZ6UWp0QlFVTndRanRCUVVORU96dEJRVVZFU0N4SlFVRkJRU3hqUVVGakxFZEJRVWRCTEdOQlFXTXNTVUZCU1VVc1RVRkJUU3hEUVVGRExFTkJRVVFzUTBGQlRpeExRVUZqTEVkQlFXcEVPMEZCUlVGV0xFbEJRVUZCTEUxQlFVMHNRMEZCUTJ4RExFbEJRVkFzUTBGQldUWkRMRXRCUVZvN1FVRkRRVW9zU1VGQlFVRXNWVUZCVlN4SFFWb3JRaXhEUVdONlF6dEJRVU5CT3p0QlFVTkJMRkZCUVVsSExFMUJRVTBzUTBGQlF5eERRVUZFTEVOQlFVNHNTMEZCWXl4SFFVRnNRaXhGUVVGMVFqdEJRVU55UWtRc1RVRkJRVUVzVlVGQlZTeEhRVUZITEVsQlFXSTdPMEZCUlVFc1lVRkJUME1zVFVGQlRTeERRVUZETEVOQlFVUXNRMEZCVGl4TFFVRmpMRWRCUVhKQ0xFVkJRVEJDTzBGQlEzaENTaXhSUVVGQlFTeFBRVUZQTEVOQlFVTjRReXhKUVVGU0xFTkJRV0UwUXl4TlFVRmlPMEZCUTBGQkxGRkJRVUZCTEUxQlFVMHNSMEZCUjFBc1MwRkJTeXhEUVVGRGFrVXNTMEZCVGl4RFFVRlpMRVZCUVVWcFJTeExRVUZMTEVOQlFVTjJSQ3hMUVVGd1FpeERRVUZVTzBGQlEwUTdRVUZEUmpzN1FVRkZSQ3hSUVVGSkswUXNTMEZCU3l4RFFVRkRReXhOUVVGT0xFTkJRV0VzUTBGQllpeE5RVUZ2UWtZc1RVRkJUU3hEUVVGRFJTeE5RVUZRTEVOQlFXTXNRMEZCWkN4RFFVRjRRaXhGUVVFd1F6dEJRVU40UTA0c1RVRkJRVUVzVDBGQlR5eERRVUZEZUVNc1NVRkJVaXhEUVVGaE5FTXNUVUZCWWp0QlFVTkJVQ3hOUVVGQlFTeExRVUZMTEVOQlFVTjJSQ3hMUVVGT08wRkJRMFFzUzBGSVJDeE5RVWRQTzBGQlEwdzJSQ3hOUVVGQlFTeFZRVUZWTEVkQlFVY3NTVUZCWWp0QlFVTkVPMEZCUTBZN08wRkJSVVFzVFVGQlNTeERRVUZEU2l4WlFVRlpMRU5CUVVORkxGVkJRVVFzUTBGQldpeEpRVUUwUWl4RlFVRTNRaXhGUVVGcFF5eERRVUZxUXl4TlFVRjNReXhIUVVGNFF5eEpRVU5IUXl4alFVUlFMRVZCUTNWQ08wRkJRM0pDUXl4SlFVRkJRU3hWUVVGVkxFZEJRVWNzU1VGQllqdEJRVU5FT3p0QlFVVkVMRTFCUVVsQkxGVkJRVW9zUlVGQlowSTdRVUZEWkN4WFFVRlBTQ3hQUVVGUU8wRkJRMFE3TzBGQlJVUXNVMEZCVDBNc1ZVRkJWU3hIUVVGSFJpeFpRVUZaTEVOQlFVTTNReXhOUVVGcVF5eEZRVUY1UXp0QlFVTjJRM2RETEVsQlFVRkJMRTFCUVUwc1EwRkJRMnhETEVsQlFWQXNRMEZCV1hWRExGbEJRVmtzUTBGQlEwVXNWVUZCVlN4RlFVRllMRU5CUVhoQ08wRkJRMFE3TzBGQlJVUXNVMEZCVHp0QlFVTk1VQ3hKUVVGQlFTeE5RVUZOTEVWQlFVNUJMRTFCUkVzN1FVRkZURTBzU1VGQlFVRXNUMEZCVHl4RlFVRlFRVHRCUVVaTExFZEJRVkE3UVVGSlJEczdRVUZGUkN4VFFVRlRXaXhWUVVGVUxFTkJRVzlDV1N4UFFVRndRaXhGUVVFMlFqdEJRVU16UWl4VFFVRlBRU3hQUVVGUExFTkJRVU5QTEUxQlFWSXNRMEZCWlN4VlFVRlRReXhKUVVGVUxFVkJRV1ZLTEUxQlFXWXNSVUZCZFVJN1FVRkRNME1zVjBGQlQwa3NTVUZCU1N4SlFVRkpTaXhOUVVGTkxFTkJRVU1zUTBGQlJDeERRVUZPTEV0QlFXTXNSMEZCTjBJN1FVRkRSQ3hIUVVaTkxFVkJSVW9zU1VGR1NTeERRVUZRTzBGQlIwUTdPMEZCUTBRc1UwRkJVMlFzYTBKQlFWUXNRMEZCTkVKUExFdEJRVFZDTEVWQlFXMURXU3hoUVVGdVF5eEZRVUZyUkVNc1MwRkJiRVFzUlVGQmVVUTdRVUZEZGtRc1QwRkJTeXhKUVVGSlF5eERRVUZETEVkQlFVY3NRMEZCWWl4RlFVRm5Ra0VzUTBGQlF5eEhRVUZIUkN4TFFVRndRaXhGUVVFeVFrTXNRMEZCUXl4RlFVRTFRaXhGUVVGblF6dEJRVU01UWl4UlFVRkpReXhoUVVGaExFZEJRVWRJTEdGQlFXRXNRMEZCUTBFc1lVRkJZU3hEUVVGRGRrUXNUVUZCWkN4SFFVRjFRbmRFTEV0QlFYWkNMRWRCUVN0Q1F5eERRVUZvUXl4RFFVRmlMRU5CUVdkRVRDeE5RVUZvUkN4RFFVRjFSQ3hEUVVGMlJDeERRVUZ3UWpzN1FVRkRRU3hSUVVGSlZDeExRVUZMTEVOQlFVTnFSU3hMUVVGT0xFTkJRVmxwUlN4TFFVRkxMRU5CUVVOMlJDeExRVUZPTEVkQlFXTnhSU3hEUVVFeFFpeE5RVUZwUXl4TlFVRk5ReXhoUVVFelF5eEZRVUV3UkR0QlFVTjRSQ3hoUVVGUExFdEJRVkE3UVVGRFJEdEJRVU5HT3p0QlFVVkVaaXhGUVVGQlFTeExRVUZMTEVOQlFVTjJSQ3hMUVVGT0xFbEJRV1Z2UlN4TFFVRm1PMEZCUTBFc1UwRkJUeXhKUVVGUU8wRkJRMFE3TzBGQlJVUXNVMEZCVXk5RkxHMUNRVUZVTEVOQlFUWkNReXhMUVVFM1FpeEZRVUZ2UXp0QlFVTnNReXhOUVVGSlF5eFJRVUZSTEVkQlFVY3NRMEZCWmp0QlFVTkJMRTFCUVVsRExGRkJRVkVzUjBGQlJ5eERRVUZtTzBGQlJVRkdMRVZCUVVGQkxFdEJRVXNzUTBGQlEybEdMRTlCUVU0c1EwRkJZeXhWUVVGVGFrSXNTVUZCVkN4RlFVRmxPMEZCUXpOQ0xGRkJRVWtzVDBGQlQwRXNTVUZCVUN4TFFVRm5RaXhSUVVGd1FpeEZRVUU0UWp0QlFVTTFRaXhWUVVGSmEwSXNUMEZCVHl4SFFVRkhia1lzYlVKQlFXMUNMRU5CUVVOcFJTeEpRVUZKTEVOQlFVTXpSQ3hKUVVGT0xFTkJRV3BETzBGQlEwRXNWVUZCU1RoRkxGVkJRVlVzUjBGQlIzQkdMRzFDUVVGdFFpeERRVUZEYVVVc1NVRkJTU3hEUVVGRE1VUXNUVUZCVGl4RFFVRndRenM3UVVGRlFTeFZRVUZKVEN4UlFVRlJMRXRCUVV0RkxGTkJRV3BDTEVWQlFUUkNPMEZCUXpGQ0xGbEJRVWtyUlN4UFFVRlBMRU5CUVVOcVJpeFJRVUZTTEV0QlFYRkNhMFlzVlVGQlZTeERRVUZEYkVZc1VVRkJjRU1zUlVGQk9FTTdRVUZETlVOQkxGVkJRVUZCTEZGQlFWRXNTVUZCU1dsR0xFOUJRVThzUTBGQlEycEdMRkZCUVhCQ08wRkJRMFFzVTBGR1JDeE5RVVZQTzBGQlEweEJMRlZCUVVGQkxGRkJRVkVzUjBGQlIwVXNVMEZCV0R0QlFVTkVPMEZCUTBZN08wRkJSVVFzVlVGQlNVUXNVVUZCVVN4TFFVRkxReXhUUVVGcVFpeEZRVUUwUWp0QlFVTXhRaXhaUVVGSkswVXNUMEZCVHl4RFFVRkRhRVlzVVVGQlVpeExRVUZ4UW1sR0xGVkJRVlVzUTBGQlEycEdMRkZCUVhCRExFVkJRVGhETzBGQlF6VkRRU3hWUVVGQlFTeFJRVUZSTEVsQlFVbG5SaXhQUVVGUExFTkJRVU5vUml4UlFVRndRanRCUVVORUxGTkJSa1FzVFVGRlR6dEJRVU5NUVN4VlFVRkJRU3hSUVVGUkxFZEJRVWRETEZOQlFWZzdRVUZEUkR0QlFVTkdPMEZCUTBZc1MwRnVRa1FzVFVGdFFrODdRVUZEVEN4VlFVRkpSQ3hSUVVGUkxFdEJRVXRETEZOQlFXSXNTMEZCTWtJMlJDeEpRVUZKTEVOQlFVTXNRMEZCUkN4RFFVRktMRXRCUVZrc1IwRkJXaXhKUVVGdFFrRXNTVUZCU1N4RFFVRkRMRU5CUVVRc1EwRkJTaXhMUVVGWkxFZEJRVEZFTEVOQlFVb3NSVUZCYjBVN1FVRkRiRVU1UkN4UlFVRkJRU3hSUVVGUk8wRkJRMVE3TzBGQlEwUXNWVUZCU1VRc1VVRkJVU3hMUVVGTFJTeFRRVUZpTEV0QlFUSkNOa1FzU1VGQlNTeERRVUZETEVOQlFVUXNRMEZCU2l4TFFVRlpMRWRCUVZvc1NVRkJiVUpCTEVsQlFVa3NRMEZCUXl4RFFVRkVMRU5CUVVvc1MwRkJXU3hIUVVFeFJDeERRVUZLTEVWQlFXOUZPMEZCUTJ4RkwwUXNVVUZCUVVFc1VVRkJVVHRCUVVOVU8wRkJRMFk3UVVGRFJpeEhRVFZDUkR0QlFUaENRU3hUUVVGUE8wRkJRVU5CTEVsQlFVRkJMRkZCUVZFc1JVRkJVa0VzVVVGQlJEdEJRVUZYUXl4SlFVRkJRU3hSUVVGUkxFVkJRVkpCTzBGQlFWZ3NSMEZCVUR0QlFVTkVJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpYVcxd2IzSjBJSHR6ZEhKMVkzUjFjbVZrVUdGMFkyaDlJR1p5YjIwZ0p5NHZZM0psWVhSbEp6dGNibWx0Y0c5eWRDQjdjR0Z5YzJWUVlYUmphSDBnWm5KdmJTQW5MaTl3WVhKelpTYzdYRzVjYm1sdGNHOXlkQ0I3WVhKeVlYbEZjWFZoYkN3Z1lYSnlZWGxUZEdGeWRITlhhWFJvZlNCbWNtOXRJQ2N1TGk5MWRHbHNMMkZ5Y21GNUp6dGNibHh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJR05oYkdOTWFXNWxRMjkxYm5Rb2FIVnVheWtnZTF4dUlDQmpiMjV6ZENCN2IyeGtUR2x1WlhNc0lHNWxkMHhwYm1WemZTQTlJR05oYkdOUGJHUk9aWGRNYVc1bFEyOTFiblFvYUhWdWF5NXNhVzVsY3lrN1hHNWNiaUFnYVdZZ0tHOXNaRXhwYm1WeklDRTlQU0IxYm1SbFptbHVaV1FwSUh0Y2JpQWdJQ0JvZFc1ckxtOXNaRXhwYm1WeklEMGdiMnhrVEdsdVpYTTdYRzRnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdaR1ZzWlhSbElHaDFibXN1YjJ4a1RHbHVaWE03WEc0Z0lIMWNibHh1SUNCcFppQW9ibVYzVEdsdVpYTWdJVDA5SUhWdVpHVm1hVzVsWkNrZ2UxeHVJQ0FnSUdoMWJtc3VibVYzVEdsdVpYTWdQU0J1WlhkTWFXNWxjenRjYmlBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0JrWld4bGRHVWdhSFZ1YXk1dVpYZE1hVzVsY3p0Y2JpQWdmVnh1ZlZ4dVhHNWxlSEJ2Y25RZ1puVnVZM1JwYjI0Z2JXVnlaMlVvYldsdVpTd2dkR2hsYVhKekxDQmlZWE5sS1NCN1hHNGdJRzFwYm1VZ1BTQnNiMkZrVUdGMFkyZ29iV2x1WlN3Z1ltRnpaU2s3WEc0Z0lIUm9aV2x5Y3lBOUlHeHZZV1JRWVhSamFDaDBhR1ZwY25Nc0lHSmhjMlVwTzF4dVhHNGdJR3hsZENCeVpYUWdQU0I3ZlR0Y2JseHVJQ0F2THlCR2IzSWdhVzVrWlhnZ2QyVWdhblZ6ZENCc1pYUWdhWFFnY0dGemN5QjBhSEp2ZFdkb0lHRnpJR2wwSUdSdlpYTnVKM1FnYUdGMlpTQmhibmtnYm1WalpYTnpZWEo1SUcxbFlXNXBibWN1WEc0Z0lDOHZJRXhsWVhacGJtY2djMkZ1YVhSNUlHTm9aV05yY3lCdmJpQjBhR2x6SUhSdklIUm9aU0JCVUVrZ1kyOXVjM1Z0WlhJZ2RHaGhkQ0J0WVhrZ2EyNXZkeUJ0YjNKbElHRmliM1YwSUhSb1pWeHVJQ0F2THlCdFpXRnVhVzVuSUdsdUlIUm9aV2x5SUc5M2JpQmpiMjUwWlhoMExseHVJQ0JwWmlBb2JXbHVaUzVwYm1SbGVDQjhmQ0IwYUdWcGNuTXVhVzVrWlhncElIdGNiaUFnSUNCeVpYUXVhVzVrWlhnZ1BTQnRhVzVsTG1sdVpHVjRJSHg4SUhSb1pXbHljeTVwYm1SbGVEdGNiaUFnZlZ4dVhHNGdJR2xtSUNodGFXNWxMbTVsZDBacGJHVk9ZVzFsSUh4OElIUm9aV2x5Y3k1dVpYZEdhV3hsVG1GdFpTa2dlMXh1SUNBZ0lHbG1JQ2doWm1sc1pVNWhiV1ZEYUdGdVoyVmtLRzFwYm1VcEtTQjdYRzRnSUNBZ0lDQXZMeUJPYnlCb1pXRmtaWElnYjNJZ2JtOGdZMmhoYm1kbElHbHVJRzkxY25Nc0lIVnpaU0IwYUdWcGNuTWdLR0Z1WkNCdmRYSnpJR2xtSUhSb1pXbHljeUJrYjJWeklHNXZkQ0JsZUdsemRDbGNiaUFnSUNBZ0lISmxkQzV2YkdSR2FXeGxUbUZ0WlNBOUlIUm9aV2x5Y3k1dmJHUkdhV3hsVG1GdFpTQjhmQ0J0YVc1bExtOXNaRVpwYkdWT1lXMWxPMXh1SUNBZ0lDQWdjbVYwTG01bGQwWnBiR1ZPWVcxbElEMGdkR2hsYVhKekxtNWxkMFpwYkdWT1lXMWxJSHg4SUcxcGJtVXVibVYzUm1sc1pVNWhiV1U3WEc0Z0lDQWdJQ0J5WlhRdWIyeGtTR1ZoWkdWeUlEMGdkR2hsYVhKekxtOXNaRWhsWVdSbGNpQjhmQ0J0YVc1bExtOXNaRWhsWVdSbGNqdGNiaUFnSUNBZ0lISmxkQzV1WlhkSVpXRmtaWElnUFNCMGFHVnBjbk11Ym1WM1NHVmhaR1Z5SUh4OElHMXBibVV1Ym1WM1NHVmhaR1Z5TzF4dUlDQWdJSDBnWld4elpTQnBaaUFvSVdacGJHVk9ZVzFsUTJoaGJtZGxaQ2gwYUdWcGNuTXBLU0I3WEc0Z0lDQWdJQ0F2THlCT2J5Qm9aV0ZrWlhJZ2IzSWdibThnWTJoaGJtZGxJR2x1SUhSb1pXbHljeXdnZFhObElHOTFjbk5jYmlBZ0lDQWdJSEpsZEM1dmJHUkdhV3hsVG1GdFpTQTlJRzFwYm1VdWIyeGtSbWxzWlU1aGJXVTdYRzRnSUNBZ0lDQnlaWFF1Ym1WM1JtbHNaVTVoYldVZ1BTQnRhVzVsTG01bGQwWnBiR1ZPWVcxbE8xeHVJQ0FnSUNBZ2NtVjBMbTlzWkVobFlXUmxjaUE5SUcxcGJtVXViMnhrU0dWaFpHVnlPMXh1SUNBZ0lDQWdjbVYwTG01bGQwaGxZV1JsY2lBOUlHMXBibVV1Ym1WM1NHVmhaR1Z5TzF4dUlDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQXZMeUJDYjNSb0lHTm9ZVzVuWldRdUxpNGdabWxuZFhKbElHbDBJRzkxZEZ4dUlDQWdJQ0FnY21WMExtOXNaRVpwYkdWT1lXMWxJRDBnYzJWc1pXTjBSbWxsYkdRb2NtVjBMQ0J0YVc1bExtOXNaRVpwYkdWT1lXMWxMQ0IwYUdWcGNuTXViMnhrUm1sc1pVNWhiV1VwTzF4dUlDQWdJQ0FnY21WMExtNWxkMFpwYkdWT1lXMWxJRDBnYzJWc1pXTjBSbWxsYkdRb2NtVjBMQ0J0YVc1bExtNWxkMFpwYkdWT1lXMWxMQ0IwYUdWcGNuTXVibVYzUm1sc1pVNWhiV1VwTzF4dUlDQWdJQ0FnY21WMExtOXNaRWhsWVdSbGNpQTlJSE5sYkdWamRFWnBaV3hrS0hKbGRDd2diV2x1WlM1dmJHUklaV0ZrWlhJc0lIUm9aV2x5Y3k1dmJHUklaV0ZrWlhJcE8xeHVJQ0FnSUNBZ2NtVjBMbTVsZDBobFlXUmxjaUE5SUhObGJHVmpkRVpwWld4a0tISmxkQ3dnYldsdVpTNXVaWGRJWldGa1pYSXNJSFJvWldseWN5NXVaWGRJWldGa1pYSXBPMXh1SUNBZ0lIMWNiaUFnZlZ4dVhHNGdJSEpsZEM1b2RXNXJjeUE5SUZ0ZE8xeHVYRzRnSUd4bGRDQnRhVzVsU1c1a1pYZ2dQU0F3TEZ4dUlDQWdJQ0FnZEdobGFYSnpTVzVrWlhnZ1BTQXdMRnh1SUNBZ0lDQWdiV2x1WlU5bVpuTmxkQ0E5SURBc1hHNGdJQ0FnSUNCMGFHVnBjbk5QWm1aelpYUWdQU0F3TzF4dVhHNGdJSGRvYVd4bElDaHRhVzVsU1c1a1pYZ2dQQ0J0YVc1bExtaDFibXR6TG14bGJtZDBhQ0I4ZkNCMGFHVnBjbk5KYm1SbGVDQThJSFJvWldseWN5NW9kVzVyY3k1c1pXNW5kR2dwSUh0Y2JpQWdJQ0JzWlhRZ2JXbHVaVU4xY25KbGJuUWdQU0J0YVc1bExtaDFibXR6VzIxcGJtVkpibVJsZUYwZ2ZId2dlMjlzWkZOMFlYSjBPaUJKYm1acGJtbDBlWDBzWEc0Z0lDQWdJQ0FnSUhSb1pXbHljME4xY25KbGJuUWdQU0IwYUdWcGNuTXVhSFZ1YTNOYmRHaGxhWEp6U1c1a1pYaGRJSHg4SUh0dmJHUlRkR0Z5ZERvZ1NXNW1hVzVwZEhsOU8xeHVYRzRnSUNBZ2FXWWdLR2gxYm10Q1pXWnZjbVVvYldsdVpVTjFjbkpsYm5Rc0lIUm9aV2x5YzBOMWNuSmxiblFwS1NCN1hHNGdJQ0FnSUNBdkx5QlVhR2x6SUhCaGRHTm9JR1J2WlhNZ2JtOTBJRzkyWlhKc1lYQWdkMmwwYUNCaGJua2diMllnZEdobElHOTBhR1Z5Y3l3Z2VXRjVMbHh1SUNBZ0lDQWdjbVYwTG1oMWJtdHpMbkIxYzJnb1kyeHZibVZJZFc1cktHMXBibVZEZFhKeVpXNTBMQ0J0YVc1bFQyWm1jMlYwS1NrN1hHNGdJQ0FnSUNCdGFXNWxTVzVrWlhnckt6dGNiaUFnSUNBZ0lIUm9aV2x5YzA5bVpuTmxkQ0FyUFNCdGFXNWxRM1Z5Y21WdWRDNXVaWGRNYVc1bGN5QXRJRzFwYm1WRGRYSnlaVzUwTG05c1pFeHBibVZ6TzF4dUlDQWdJSDBnWld4elpTQnBaaUFvYUhWdWEwSmxabTl5WlNoMGFHVnBjbk5EZFhKeVpXNTBMQ0J0YVc1bFEzVnljbVZ1ZENrcElIdGNiaUFnSUNBZ0lDOHZJRlJvYVhNZ2NHRjBZMmdnWkc5bGN5QnViM1FnYjNabGNteGhjQ0IzYVhSb0lHRnVlU0J2WmlCMGFHVWdiM1JvWlhKekxDQjVZWGt1WEc0Z0lDQWdJQ0J5WlhRdWFIVnVhM011Y0hWemFDaGpiRzl1WlVoMWJtc29kR2hsYVhKelEzVnljbVZ1ZEN3Z2RHaGxhWEp6VDJabWMyVjBLU2s3WEc0Z0lDQWdJQ0IwYUdWcGNuTkpibVJsZUNzck8xeHVJQ0FnSUNBZ2JXbHVaVTltWm5ObGRDQXJQU0IwYUdWcGNuTkRkWEp5Wlc1MExtNWxkMHhwYm1WeklDMGdkR2hsYVhKelEzVnljbVZ1ZEM1dmJHUk1hVzVsY3p0Y2JpQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdMeThnVDNabGNteGhjQ3dnYldWeVoyVWdZWE1nWW1WemRDQjNaU0JqWVc1Y2JpQWdJQ0FnSUd4bGRDQnRaWEpuWldSSWRXNXJJRDBnZTF4dUlDQWdJQ0FnSUNCdmJHUlRkR0Z5ZERvZ1RXRjBhQzV0YVc0b2JXbHVaVU4xY25KbGJuUXViMnhrVTNSaGNuUXNJSFJvWldseWMwTjFjbkpsYm5RdWIyeGtVM1JoY25RcExGeHVJQ0FnSUNBZ0lDQnZiR1JNYVc1bGN6b2dNQ3hjYmlBZ0lDQWdJQ0FnYm1WM1UzUmhjblE2SUUxaGRHZ3ViV2x1S0cxcGJtVkRkWEp5Wlc1MExtNWxkMU4wWVhKMElDc2diV2x1WlU5bVpuTmxkQ3dnZEdobGFYSnpRM1Z5Y21WdWRDNXZiR1JUZEdGeWRDQXJJSFJvWldseWMwOW1abk5sZENrc1hHNGdJQ0FnSUNBZ0lHNWxkMHhwYm1Wek9pQXdMRnh1SUNBZ0lDQWdJQ0JzYVc1bGN6b2dXMTFjYmlBZ0lDQWdJSDA3WEc0Z0lDQWdJQ0J0WlhKblpVeHBibVZ6S0cxbGNtZGxaRWgxYm1zc0lHMXBibVZEZFhKeVpXNTBMbTlzWkZOMFlYSjBMQ0J0YVc1bFEzVnljbVZ1ZEM1c2FXNWxjeXdnZEdobGFYSnpRM1Z5Y21WdWRDNXZiR1JUZEdGeWRDd2dkR2hsYVhKelEzVnljbVZ1ZEM1c2FXNWxjeWs3WEc0Z0lDQWdJQ0IwYUdWcGNuTkpibVJsZUNzck8xeHVJQ0FnSUNBZ2JXbHVaVWx1WkdWNEt5czdYRzVjYmlBZ0lDQWdJSEpsZEM1b2RXNXJjeTV3ZFhOb0tHMWxjbWRsWkVoMWJtc3BPMXh1SUNBZ0lIMWNiaUFnZlZ4dVhHNGdJSEpsZEhWeWJpQnlaWFE3WEc1OVhHNWNibVoxYm1OMGFXOXVJR3h2WVdSUVlYUmphQ2h3WVhKaGJTd2dZbUZ6WlNrZ2UxeHVJQ0JwWmlBb2RIbHdaVzltSUhCaGNtRnRJRDA5UFNBbmMzUnlhVzVuSnlrZ2UxeHVJQ0FnSUdsbUlDZ29MMTVBUUM5dEtTNTBaWE4wS0hCaGNtRnRLU0I4ZkNBb0tDOWVTVzVrWlhnNkwyMHBMblJsYzNRb2NHRnlZVzBwS1NrZ2UxeHVJQ0FnSUNBZ2NtVjBkWEp1SUhCaGNuTmxVR0YwWTJnb2NHRnlZVzBwV3pCZE8xeHVJQ0FnSUgxY2JseHVJQ0FnSUdsbUlDZ2hZbUZ6WlNrZ2UxeHVJQ0FnSUNBZ2RHaHliM2NnYm1WM0lFVnljbTl5S0NkTmRYTjBJSEJ5YjNacFpHVWdZU0JpWVhObElISmxabVZ5Wlc1alpTQnZjaUJ3WVhOeklHbHVJR0VnY0dGMFkyZ25LVHRjYmlBZ0lDQjlYRzRnSUNBZ2NtVjBkWEp1SUhOMGNuVmpkSFZ5WldSUVlYUmphQ2gxYm1SbFptbHVaV1FzSUhWdVpHVm1hVzVsWkN3Z1ltRnpaU3dnY0dGeVlXMHBPMXh1SUNCOVhHNWNiaUFnY21WMGRYSnVJSEJoY21GdE8xeHVmVnh1WEc1bWRXNWpkR2x2YmlCbWFXeGxUbUZ0WlVOb1lXNW5aV1FvY0dGMFkyZ3BJSHRjYmlBZ2NtVjBkWEp1SUhCaGRHTm9MbTVsZDBacGJHVk9ZVzFsSUNZbUlIQmhkR05vTG01bGQwWnBiR1ZPWVcxbElDRTlQU0J3WVhSamFDNXZiR1JHYVd4bFRtRnRaVHRjYm4xY2JseHVablZ1WTNScGIyNGdjMlZzWldOMFJtbGxiR1FvYVc1a1pYZ3NJRzFwYm1Vc0lIUm9aV2x5Y3lrZ2UxeHVJQ0JwWmlBb2JXbHVaU0E5UFQwZ2RHaGxhWEp6S1NCN1hHNGdJQ0FnY21WMGRYSnVJRzFwYm1VN1hHNGdJSDBnWld4elpTQjdYRzRnSUNBZ2FXNWtaWGd1WTI5dVpteHBZM1FnUFNCMGNuVmxPMXh1SUNBZ0lISmxkSFZ5YmlCN2JXbHVaU3dnZEdobGFYSnpmVHRjYmlBZ2ZWeHVmVnh1WEc1bWRXNWpkR2x2YmlCb2RXNXJRbVZtYjNKbEtIUmxjM1FzSUdOb1pXTnJLU0I3WEc0Z0lISmxkSFZ5YmlCMFpYTjBMbTlzWkZOMFlYSjBJRHdnWTJobFkyc3ViMnhrVTNSaGNuUmNiaUFnSUNBbUppQW9kR1Z6ZEM1dmJHUlRkR0Z5ZENBcklIUmxjM1F1YjJ4a1RHbHVaWE1wSUR3Z1kyaGxZMnN1YjJ4a1UzUmhjblE3WEc1OVhHNWNibVoxYm1OMGFXOXVJR05zYjI1bFNIVnVheWhvZFc1ckxDQnZabVp6WlhRcElIdGNiaUFnY21WMGRYSnVJSHRjYmlBZ0lDQnZiR1JUZEdGeWREb2dhSFZ1YXk1dmJHUlRkR0Z5ZEN3Z2IyeGtUR2x1WlhNNklHaDFibXN1YjJ4a1RHbHVaWE1zWEc0Z0lDQWdibVYzVTNSaGNuUTZJR2gxYm1zdWJtVjNVM1JoY25RZ0t5QnZabVp6WlhRc0lHNWxkMHhwYm1Wek9pQm9kVzVyTG01bGQweHBibVZ6TEZ4dUlDQWdJR3hwYm1Wek9pQm9kVzVyTG14cGJtVnpYRzRnSUgwN1hHNTlYRzVjYm1aMWJtTjBhVzl1SUcxbGNtZGxUR2x1WlhNb2FIVnVheXdnYldsdVpVOW1abk5sZEN3Z2JXbHVaVXhwYm1WekxDQjBhR1ZwY2s5bVpuTmxkQ3dnZEdobGFYSk1hVzVsY3lrZ2UxeHVJQ0F2THlCVWFHbHpJSGRwYkd3Z1oyVnVaWEpoYkd4NUlISmxjM1ZzZENCcGJpQmhJR052Ym1ac2FXTjBaV1FnYUhWdWF5d2dZblYwSUhSb1pYSmxJR0Z5WlNCallYTmxjeUIzYUdWeVpTQjBhR1VnWTI5dWRHVjRkRnh1SUNBdkx5QnBjeUIwYUdVZ2IyNXNlU0J2ZG1WeWJHRndJSGRvWlhKbElIZGxJR05oYmlCemRXTmpaWE56Wm5Wc2JIa2diV1Z5WjJVZ2RHaGxJR052Ym5SbGJuUWdhR1Z5WlM1Y2JpQWdiR1YwSUcxcGJtVWdQU0I3YjJabWMyVjBPaUJ0YVc1bFQyWm1jMlYwTENCc2FXNWxjem9nYldsdVpVeHBibVZ6TENCcGJtUmxlRG9nTUgwc1hHNGdJQ0FnSUNCMGFHVnBjaUE5SUh0dlptWnpaWFE2SUhSb1pXbHlUMlptYzJWMExDQnNhVzVsY3pvZ2RHaGxhWEpNYVc1bGN5d2dhVzVrWlhnNklEQjlPMXh1WEc0Z0lDOHZJRWhoYm1Sc1pTQmhibmtnYkdWaFpHbHVaeUJqYjI1MFpXNTBYRzRnSUdsdWMyVnlkRXhsWVdScGJtY29hSFZ1YXl3Z2JXbHVaU3dnZEdobGFYSXBPMXh1SUNCcGJuTmxjblJNWldGa2FXNW5LR2gxYm1zc0lIUm9aV2x5TENCdGFXNWxLVHRjYmx4dUlDQXZMeUJPYjNjZ2FXNGdkR2hsSUc5MlpYSnNZWEFnWTI5dWRHVnVkQzRnVTJOaGJpQjBhSEp2ZFdkb0lHRnVaQ0J6Wld4bFkzUWdkR2hsSUdKbGMzUWdZMmhoYm1kbGN5Qm1jbTl0SUdWaFkyZ3VYRzRnSUhkb2FXeGxJQ2h0YVc1bExtbHVaR1Y0SUR3Z2JXbHVaUzVzYVc1bGN5NXNaVzVuZEdnZ0ppWWdkR2hsYVhJdWFXNWtaWGdnUENCMGFHVnBjaTVzYVc1bGN5NXNaVzVuZEdncElIdGNiaUFnSUNCc1pYUWdiV2x1WlVOMWNuSmxiblFnUFNCdGFXNWxMbXhwYm1WelcyMXBibVV1YVc1a1pYaGRMRnh1SUNBZ0lDQWdJQ0IwYUdWcGNrTjFjbkpsYm5RZ1BTQjBhR1ZwY2k1c2FXNWxjMXQwYUdWcGNpNXBibVJsZUYwN1hHNWNiaUFnSUNCcFppQW9LRzFwYm1WRGRYSnlaVzUwV3pCZElEMDlQU0FuTFNjZ2ZId2diV2x1WlVOMWNuSmxiblJiTUYwZ1BUMDlJQ2NySnlsY2JpQWdJQ0FnSUNBZ0ppWWdLSFJvWldseVEzVnljbVZ1ZEZzd1hTQTlQVDBnSnkwbklIeDhJSFJvWldseVEzVnljbVZ1ZEZzd1hTQTlQVDBnSnlzbktTa2dlMXh1SUNBZ0lDQWdMeThnUW05MGFDQnRiMlJwWm1sbFpDQXVMaTVjYmlBZ0lDQWdJRzExZEhWaGJFTm9ZVzVuWlNob2RXNXJMQ0J0YVc1bExDQjBhR1ZwY2lrN1hHNGdJQ0FnZlNCbGJITmxJR2xtSUNodGFXNWxRM1Z5Y21WdWRGc3dYU0E5UFQwZ0p5c25JQ1ltSUhSb1pXbHlRM1Z5Y21WdWRGc3dYU0E5UFQwZ0p5QW5LU0I3WEc0Z0lDQWdJQ0F2THlCTmFXNWxJR2x1YzJWeWRHVmtYRzRnSUNBZ0lDQm9kVzVyTG14cGJtVnpMbkIxYzJnb0xpNHVJR052Ykd4bFkzUkRhR0Z1WjJVb2JXbHVaU2twTzF4dUlDQWdJSDBnWld4elpTQnBaaUFvZEdobGFYSkRkWEp5Wlc1MFd6QmRJRDA5UFNBbkt5Y2dKaVlnYldsdVpVTjFjbkpsYm5SYk1GMGdQVDA5SUNjZ0p5a2dlMXh1SUNBZ0lDQWdMeThnVkdobGFYSnpJR2x1YzJWeWRHVmtYRzRnSUNBZ0lDQm9kVzVyTG14cGJtVnpMbkIxYzJnb0xpNHVJR052Ykd4bFkzUkRhR0Z1WjJVb2RHaGxhWElwS1R0Y2JpQWdJQ0I5SUdWc2MyVWdhV1lnS0cxcGJtVkRkWEp5Wlc1MFd6QmRJRDA5UFNBbkxTY2dKaVlnZEdobGFYSkRkWEp5Wlc1MFd6QmRJRDA5UFNBbklDY3BJSHRjYmlBZ0lDQWdJQzh2SUUxcGJtVWdjbVZ0YjNabFpDQnZjaUJsWkdsMFpXUmNiaUFnSUNBZ0lISmxiVzkyWVd3b2FIVnVheXdnYldsdVpTd2dkR2hsYVhJcE8xeHVJQ0FnSUgwZ1pXeHpaU0JwWmlBb2RHaGxhWEpEZFhKeVpXNTBXekJkSUQwOVBTQW5MU2NnSmlZZ2JXbHVaVU4xY25KbGJuUmJNRjBnUFQwOUlDY2dKeWtnZTF4dUlDQWdJQ0FnTHk4Z1ZHaGxhWElnY21WdGIzWmxaQ0J2Y2lCbFpHbDBaV1JjYmlBZ0lDQWdJSEpsYlc5MllXd29hSFZ1YXl3Z2RHaGxhWElzSUcxcGJtVXNJSFJ5ZFdVcE8xeHVJQ0FnSUgwZ1pXeHpaU0JwWmlBb2JXbHVaVU4xY25KbGJuUWdQVDA5SUhSb1pXbHlRM1Z5Y21WdWRDa2dlMXh1SUNBZ0lDQWdMeThnUTI5dWRHVjRkQ0JwWkdWdWRHbDBlVnh1SUNBZ0lDQWdhSFZ1YXk1c2FXNWxjeTV3ZFhOb0tHMXBibVZEZFhKeVpXNTBLVHRjYmlBZ0lDQWdJRzFwYm1VdWFXNWtaWGdyS3p0Y2JpQWdJQ0FnSUhSb1pXbHlMbWx1WkdWNEt5czdYRzRnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUM4dklFTnZiblJsZUhRZ2JXbHpiV0YwWTJoY2JpQWdJQ0FnSUdOdmJtWnNhV04wS0doMWJtc3NJR052Ykd4bFkzUkRhR0Z1WjJVb2JXbHVaU2tzSUdOdmJHeGxZM1JEYUdGdVoyVW9kR2hsYVhJcEtUdGNiaUFnSUNCOVhHNGdJSDFjYmx4dUlDQXZMeUJPYjNjZ2NIVnphQ0JoYm5sMGFHbHVaeUIwYUdGMElHMWhlU0JpWlNCeVpXMWhhVzVwYm1kY2JpQWdhVzV6WlhKMFZISmhhV3hwYm1jb2FIVnVheXdnYldsdVpTazdYRzRnSUdsdWMyVnlkRlJ5WVdsc2FXNW5LR2gxYm1zc0lIUm9aV2x5S1R0Y2JseHVJQ0JqWVd4alRHbHVaVU52ZFc1MEtHaDFibXNwTzF4dWZWeHVYRzVtZFc1amRHbHZiaUJ0ZFhSMVlXeERhR0Z1WjJVb2FIVnVheXdnYldsdVpTd2dkR2hsYVhJcElIdGNiaUFnYkdWMElHMTVRMmhoYm1kbGN5QTlJR052Ykd4bFkzUkRhR0Z1WjJVb2JXbHVaU2tzWEc0Z0lDQWdJQ0IwYUdWcGNrTm9ZVzVuWlhNZ1BTQmpiMnhzWldOMFEyaGhibWRsS0hSb1pXbHlLVHRjYmx4dUlDQnBaaUFvWVd4c1VtVnRiM1psY3lodGVVTm9ZVzVuWlhNcElDWW1JR0ZzYkZKbGJXOTJaWE1vZEdobGFYSkRhR0Z1WjJWektTa2dlMXh1SUNBZ0lDOHZJRk53WldOcFlXd2dZMkZ6WlNCbWIzSWdjbVZ0YjNabElHTm9ZVzVuWlhNZ2RHaGhkQ0JoY21VZ2MzVndaWEp6WlhSeklHOW1JRzl1WlNCaGJtOTBhR1Z5WEc0Z0lDQWdhV1lnS0dGeWNtRjVVM1JoY25SelYybDBhQ2h0ZVVOb1lXNW5aWE1zSUhSb1pXbHlRMmhoYm1kbGN5bGNiaUFnSUNBZ0lDQWdKaVlnYzJ0cGNGSmxiVzkyWlZOMWNHVnljMlYwS0hSb1pXbHlMQ0J0ZVVOb1lXNW5aWE1zSUcxNVEyaGhibWRsY3k1c1pXNW5kR2dnTFNCMGFHVnBja05vWVc1blpYTXViR1Z1WjNSb0tTa2dlMXh1SUNBZ0lDQWdhSFZ1YXk1c2FXNWxjeTV3ZFhOb0tDNHVMaUJ0ZVVOb1lXNW5aWE1wTzF4dUlDQWdJQ0FnY21WMGRYSnVPMXh1SUNBZ0lIMGdaV3h6WlNCcFppQW9ZWEp5WVhsVGRHRnlkSE5YYVhSb0tIUm9aV2x5UTJoaGJtZGxjeXdnYlhsRGFHRnVaMlZ6S1Z4dUlDQWdJQ0FnSUNBbUppQnphMmx3VW1WdGIzWmxVM1Z3WlhKelpYUW9iV2x1WlN3Z2RHaGxhWEpEYUdGdVoyVnpMQ0IwYUdWcGNrTm9ZVzVuWlhNdWJHVnVaM1JvSUMwZ2JYbERhR0Z1WjJWekxteGxibWQwYUNrcElIdGNiaUFnSUNBZ0lHaDFibXN1YkdsdVpYTXVjSFZ6YUNndUxpNGdkR2hsYVhKRGFHRnVaMlZ6S1R0Y2JpQWdJQ0FnSUhKbGRIVnlianRjYmlBZ0lDQjlYRzRnSUgwZ1pXeHpaU0JwWmlBb1lYSnlZWGxGY1hWaGJDaHRlVU5vWVc1blpYTXNJSFJvWldseVEyaGhibWRsY3lrcElIdGNiaUFnSUNCb2RXNXJMbXhwYm1WekxuQjFjMmdvTGk0dUlHMTVRMmhoYm1kbGN5azdYRzRnSUNBZ2NtVjBkWEp1TzF4dUlDQjlYRzVjYmlBZ1kyOXVabXhwWTNRb2FIVnVheXdnYlhsRGFHRnVaMlZ6TENCMGFHVnBja05vWVc1blpYTXBPMXh1ZlZ4dVhHNW1kVzVqZEdsdmJpQnlaVzF2ZG1Gc0tHaDFibXNzSUcxcGJtVXNJSFJvWldseUxDQnpkMkZ3S1NCN1hHNGdJR3hsZENCdGVVTm9ZVzVuWlhNZ1BTQmpiMnhzWldOMFEyaGhibWRsS0cxcGJtVXBMRnh1SUNBZ0lDQWdkR2hsYVhKRGFHRnVaMlZ6SUQwZ1kyOXNiR1ZqZEVOdmJuUmxlSFFvZEdobGFYSXNJRzE1UTJoaGJtZGxjeWs3WEc0Z0lHbG1JQ2gwYUdWcGNrTm9ZVzVuWlhNdWJXVnlaMlZrS1NCN1hHNGdJQ0FnYUhWdWF5NXNhVzVsY3k1d2RYTm9LQzR1TGlCMGFHVnBja05vWVc1blpYTXViV1Z5WjJWa0tUdGNiaUFnZlNCbGJITmxJSHRjYmlBZ0lDQmpiMjVtYkdsamRDaG9kVzVyTENCemQyRndJRDhnZEdobGFYSkRhR0Z1WjJWeklEb2diWGxEYUdGdVoyVnpMQ0J6ZDJGd0lEOGdiWGxEYUdGdVoyVnpJRG9nZEdobGFYSkRhR0Z1WjJWektUdGNiaUFnZlZ4dWZWeHVYRzVtZFc1amRHbHZiaUJqYjI1bWJHbGpkQ2hvZFc1ckxDQnRhVzVsTENCMGFHVnBjaWtnZTF4dUlDQm9kVzVyTG1OdmJtWnNhV04wSUQwZ2RISjFaVHRjYmlBZ2FIVnVheTVzYVc1bGN5NXdkWE5vS0h0Y2JpQWdJQ0JqYjI1bWJHbGpkRG9nZEhKMVpTeGNiaUFnSUNCdGFXNWxPaUJ0YVc1bExGeHVJQ0FnSUhSb1pXbHljem9nZEdobGFYSmNiaUFnZlNrN1hHNTlYRzVjYm1aMWJtTjBhVzl1SUdsdWMyVnlkRXhsWVdScGJtY29hSFZ1YXl3Z2FXNXpaWEowTENCMGFHVnBjaWtnZTF4dUlDQjNhR2xzWlNBb2FXNXpaWEowTG05bVpuTmxkQ0E4SUhSb1pXbHlMbTltWm5ObGRDQW1KaUJwYm5ObGNuUXVhVzVrWlhnZ1BDQnBibk5sY25RdWJHbHVaWE11YkdWdVozUm9LU0I3WEc0Z0lDQWdiR1YwSUd4cGJtVWdQU0JwYm5ObGNuUXViR2x1WlhOYmFXNXpaWEowTG1sdVpHVjRLeXRkTzF4dUlDQWdJR2gxYm1zdWJHbHVaWE11Y0hWemFDaHNhVzVsS1R0Y2JpQWdJQ0JwYm5ObGNuUXViMlptYzJWMEt5czdYRzRnSUgxY2JuMWNibVoxYm1OMGFXOXVJR2x1YzJWeWRGUnlZV2xzYVc1bktHaDFibXNzSUdsdWMyVnlkQ2tnZTF4dUlDQjNhR2xzWlNBb2FXNXpaWEowTG1sdVpHVjRJRHdnYVc1elpYSjBMbXhwYm1WekxteGxibWQwYUNrZ2UxeHVJQ0FnSUd4bGRDQnNhVzVsSUQwZ2FXNXpaWEowTG14cGJtVnpXMmx1YzJWeWRDNXBibVJsZUNzclhUdGNiaUFnSUNCb2RXNXJMbXhwYm1WekxuQjFjMmdvYkdsdVpTazdYRzRnSUgxY2JuMWNibHh1Wm5WdVkzUnBiMjRnWTI5c2JHVmpkRU5vWVc1blpTaHpkR0YwWlNrZ2UxeHVJQ0JzWlhRZ2NtVjBJRDBnVzEwc1hHNGdJQ0FnSUNCdmNHVnlZWFJwYjI0Z1BTQnpkR0YwWlM1c2FXNWxjMXR6ZEdGMFpTNXBibVJsZUYxYk1GMDdYRzRnSUhkb2FXeGxJQ2h6ZEdGMFpTNXBibVJsZUNBOElITjBZWFJsTG14cGJtVnpMbXhsYm1kMGFDa2dlMXh1SUNBZ0lHeGxkQ0JzYVc1bElEMGdjM1JoZEdVdWJHbHVaWE5iYzNSaGRHVXVhVzVrWlhoZE8xeHVYRzRnSUNBZ0x5OGdSM0p2ZFhBZ1lXUmthWFJwYjI1eklIUm9ZWFFnWVhKbElHbHRiV1ZrYVdGMFpXeDVJR0ZtZEdWeUlITjFZblJ5WVdOMGFXOXVjeUJoYm1RZ2RISmxZWFFnZEdobGJTQmhjeUJ2Ym1VZ1hDSmhkRzl0YVdOY0lpQnRiMlJwWm5rZ1kyaGhibWRsTGx4dUlDQWdJR2xtSUNodmNHVnlZWFJwYjI0Z1BUMDlJQ2N0SnlBbUppQnNhVzVsV3pCZElEMDlQU0FuS3ljcElIdGNiaUFnSUNBZ0lHOXdaWEpoZEdsdmJpQTlJQ2NySnp0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0JwWmlBb2IzQmxjbUYwYVc5dUlEMDlQU0JzYVc1bFd6QmRLU0I3WEc0Z0lDQWdJQ0J5WlhRdWNIVnphQ2hzYVc1bEtUdGNiaUFnSUNBZ0lITjBZWFJsTG1sdVpHVjRLeXM3WEc0Z0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lHSnlaV0ZyTzF4dUlDQWdJSDFjYmlBZ2ZWeHVYRzRnSUhKbGRIVnliaUJ5WlhRN1hHNTlYRzVtZFc1amRHbHZiaUJqYjJ4c1pXTjBRMjl1ZEdWNGRDaHpkR0YwWlN3Z2JXRjBZMmhEYUdGdVoyVnpLU0I3WEc0Z0lHeGxkQ0JqYUdGdVoyVnpJRDBnVzEwc1hHNGdJQ0FnSUNCdFpYSm5aV1FnUFNCYlhTeGNiaUFnSUNBZ0lHMWhkR05vU1c1a1pYZ2dQU0F3TEZ4dUlDQWdJQ0FnWTI5dWRHVjRkRU5vWVc1blpYTWdQU0JtWVd4elpTeGNiaUFnSUNBZ0lHTnZibVpzYVdOMFpXUWdQU0JtWVd4elpUdGNiaUFnZDJocGJHVWdLRzFoZEdOb1NXNWtaWGdnUENCdFlYUmphRU5vWVc1blpYTXViR1Z1WjNSb1hHNGdJQ0FnSUNBZ0lDWW1JSE4wWVhSbExtbHVaR1Y0SUR3Z2MzUmhkR1V1YkdsdVpYTXViR1Z1WjNSb0tTQjdYRzRnSUNBZ2JHVjBJR05vWVc1blpTQTlJSE4wWVhSbExteHBibVZ6VzNOMFlYUmxMbWx1WkdWNFhTeGNiaUFnSUNBZ0lDQWdiV0YwWTJnZ1BTQnRZWFJqYUVOb1lXNW5aWE5iYldGMFkyaEpibVJsZUYwN1hHNWNiaUFnSUNBdkx5QlBibU5sSUhkbEozWmxJR2hwZENCdmRYSWdZV1JrTENCMGFHVnVJSGRsSUdGeVpTQmtiMjVsWEc0Z0lDQWdhV1lnS0cxaGRHTm9XekJkSUQwOVBTQW5LeWNwSUh0Y2JpQWdJQ0FnSUdKeVpXRnJPMXh1SUNBZ0lIMWNibHh1SUNBZ0lHTnZiblJsZUhSRGFHRnVaMlZ6SUQwZ1kyOXVkR1Y0ZEVOb1lXNW5aWE1nZkh3Z1kyaGhibWRsV3pCZElDRTlQU0FuSUNjN1hHNWNiaUFnSUNCdFpYSm5aV1F1Y0hWemFDaHRZWFJqYUNrN1hHNGdJQ0FnYldGMFkyaEpibVJsZUNzck8xeHVYRzRnSUNBZ0x5OGdRMjl1YzNWdFpTQmhibmtnWVdSa2FYUnBiMjV6SUdsdUlIUm9aU0J2ZEdobGNpQmliRzlqYXlCaGN5QmhJR052Ym1ac2FXTjBJSFJ2SUdGMGRHVnRjSFJjYmlBZ0lDQXZMeUIwYnlCd2RXeHNJR2x1SUhSb1pTQnlaVzFoYVc1cGJtY2dZMjl1ZEdWNGRDQmhablJsY2lCMGFHbHpYRzRnSUNBZ2FXWWdLR05vWVc1blpWc3dYU0E5UFQwZ0p5c25LU0I3WEc0Z0lDQWdJQ0JqYjI1bWJHbGpkR1ZrSUQwZ2RISjFaVHRjYmx4dUlDQWdJQ0FnZDJocGJHVWdLR05vWVc1blpWc3dYU0E5UFQwZ0p5c25LU0I3WEc0Z0lDQWdJQ0FnSUdOb1lXNW5aWE11Y0hWemFDaGphR0Z1WjJVcE8xeHVJQ0FnSUNBZ0lDQmphR0Z1WjJVZ1BTQnpkR0YwWlM1c2FXNWxjMXNySzNOMFlYUmxMbWx1WkdWNFhUdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNWNiaUFnSUNCcFppQW9iV0YwWTJndWMzVmljM1J5S0RFcElEMDlQU0JqYUdGdVoyVXVjM1ZpYzNSeUtERXBLU0I3WEc0Z0lDQWdJQ0JqYUdGdVoyVnpMbkIxYzJnb1kyaGhibWRsS1R0Y2JpQWdJQ0FnSUhOMFlYUmxMbWx1WkdWNEt5czdYRzRnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUdOdmJtWnNhV04wWldRZ1BTQjBjblZsTzF4dUlDQWdJSDFjYmlBZ2ZWeHVYRzRnSUdsbUlDZ29iV0YwWTJoRGFHRnVaMlZ6VzIxaGRHTm9TVzVrWlhoZElIeDhJQ2NuS1Zzd1hTQTlQVDBnSnlzblhHNGdJQ0FnSUNBbUppQmpiMjUwWlhoMFEyaGhibWRsY3lrZ2UxeHVJQ0FnSUdOdmJtWnNhV04wWldRZ1BTQjBjblZsTzF4dUlDQjlYRzVjYmlBZ2FXWWdLR052Ym1ac2FXTjBaV1FwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdZMmhoYm1kbGN6dGNiaUFnZlZ4dVhHNGdJSGRvYVd4bElDaHRZWFJqYUVsdVpHVjRJRHdnYldGMFkyaERhR0Z1WjJWekxteGxibWQwYUNrZ2UxeHVJQ0FnSUcxbGNtZGxaQzV3ZFhOb0tHMWhkR05vUTJoaGJtZGxjMXR0WVhSamFFbHVaR1Y0S3l0ZEtUdGNiaUFnZlZ4dVhHNGdJSEpsZEhWeWJpQjdYRzRnSUNBZ2JXVnlaMlZrTEZ4dUlDQWdJR05vWVc1blpYTmNiaUFnZlR0Y2JuMWNibHh1Wm5WdVkzUnBiMjRnWVd4c1VtVnRiM1psY3loamFHRnVaMlZ6S1NCN1hHNGdJSEpsZEhWeWJpQmphR0Z1WjJWekxuSmxaSFZqWlNobWRXNWpkR2x2Ymlod2NtVjJMQ0JqYUdGdVoyVXBJSHRjYmlBZ0lDQnlaWFIxY200Z2NISmxkaUFtSmlCamFHRnVaMlZiTUYwZ1BUMDlJQ2N0Snp0Y2JpQWdmU3dnZEhKMVpTazdYRzU5WEc1bWRXNWpkR2x2YmlCemEybHdVbVZ0YjNabFUzVndaWEp6WlhRb2MzUmhkR1VzSUhKbGJXOTJaVU5vWVc1blpYTXNJR1JsYkhSaEtTQjdYRzRnSUdadmNpQW9iR1YwSUdrZ1BTQXdPeUJwSUR3Z1pHVnNkR0U3SUdrckt5a2dlMXh1SUNBZ0lHeGxkQ0JqYUdGdVoyVkRiMjUwWlc1MElEMGdjbVZ0YjNabFEyaGhibWRsYzF0eVpXMXZkbVZEYUdGdVoyVnpMbXhsYm1kMGFDQXRJR1JsYkhSaElDc2dhVjB1YzNWaWMzUnlLREVwTzF4dUlDQWdJR2xtSUNoemRHRjBaUzVzYVc1bGMxdHpkR0YwWlM1cGJtUmxlQ0FySUdsZElDRTlQU0FuSUNjZ0t5QmphR0Z1WjJWRGIyNTBaVzUwS1NCN1hHNGdJQ0FnSUNCeVpYUjFjbTRnWm1Gc2MyVTdYRzRnSUNBZ2ZWeHVJQ0I5WEc1Y2JpQWdjM1JoZEdVdWFXNWtaWGdnS3owZ1pHVnNkR0U3WEc0Z0lISmxkSFZ5YmlCMGNuVmxPMXh1ZlZ4dVhHNW1kVzVqZEdsdmJpQmpZV3hqVDJ4a1RtVjNUR2x1WlVOdmRXNTBLR3hwYm1WektTQjdYRzRnSUd4bGRDQnZiR1JNYVc1bGN5QTlJREE3WEc0Z0lHeGxkQ0J1WlhkTWFXNWxjeUE5SURBN1hHNWNiaUFnYkdsdVpYTXVabTl5UldGamFDaG1kVzVqZEdsdmJpaHNhVzVsS1NCN1hHNGdJQ0FnYVdZZ0tIUjVjR1Z2WmlCc2FXNWxJQ0U5UFNBbmMzUnlhVzVuSnlrZ2UxeHVJQ0FnSUNBZ2JHVjBJRzE1UTI5MWJuUWdQU0JqWVd4alQyeGtUbVYzVEdsdVpVTnZkVzUwS0d4cGJtVXViV2x1WlNrN1hHNGdJQ0FnSUNCc1pYUWdkR2hsYVhKRGIzVnVkQ0E5SUdOaGJHTlBiR1JPWlhkTWFXNWxRMjkxYm5Rb2JHbHVaUzUwYUdWcGNuTXBPMXh1WEc0Z0lDQWdJQ0JwWmlBb2IyeGtUR2x1WlhNZ0lUMDlJSFZ1WkdWbWFXNWxaQ2tnZTF4dUlDQWdJQ0FnSUNCcFppQW9iWGxEYjNWdWRDNXZiR1JNYVc1bGN5QTlQVDBnZEdobGFYSkRiM1Z1ZEM1dmJHUk1hVzVsY3lrZ2UxeHVJQ0FnSUNBZ0lDQWdJRzlzWkV4cGJtVnpJQ3M5SUcxNVEyOTFiblF1YjJ4a1RHbHVaWE03WEc0Z0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUNBZ2IyeGtUR2x1WlhNZ1BTQjFibVJsWm1sdVpXUTdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnYVdZZ0tHNWxkMHhwYm1WeklDRTlQU0IxYm1SbFptbHVaV1FwSUh0Y2JpQWdJQ0FnSUNBZ2FXWWdLRzE1UTI5MWJuUXVibVYzVEdsdVpYTWdQVDA5SUhSb1pXbHlRMjkxYm5RdWJtVjNUR2x1WlhNcElIdGNiaUFnSUNBZ0lDQWdJQ0J1WlhkTWFXNWxjeUFyUFNCdGVVTnZkVzUwTG01bGQweHBibVZ6TzF4dUlDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNBZ0lHNWxkMHhwYm1WeklEMGdkVzVrWldacGJtVmtPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lHbG1JQ2h1WlhkTWFXNWxjeUFoUFQwZ2RXNWtaV1pwYm1Wa0lDWW1JQ2hzYVc1bFd6QmRJRDA5UFNBbkt5Y2dmSHdnYkdsdVpWc3dYU0E5UFQwZ0p5QW5LU2tnZTF4dUlDQWdJQ0FnSUNCdVpYZE1hVzVsY3lzck8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2FXWWdLRzlzWkV4cGJtVnpJQ0U5UFNCMWJtUmxabWx1WldRZ0ppWWdLR3hwYm1WYk1GMGdQVDA5SUNjdEp5QjhmQ0JzYVc1bFd6QmRJRDA5UFNBbklDY3BLU0I3WEc0Z0lDQWdJQ0FnSUc5c1pFeHBibVZ6S3lzN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dUlDQjlLVHRjYmx4dUlDQnlaWFIxY200Z2UyOXNaRXhwYm1WekxDQnVaWGRNYVc1bGMzMDdYRzU5WEc0aVhYMD1cbiIsICIvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG5cInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMucmV2ZXJzZVBhdGNoID0gcmV2ZXJzZVBhdGNoO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgaWYgKGVudW1lcmFibGVPbmx5KSBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSk7IGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgaWYgKGkgJSAyKSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHsgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTsgfSBlbHNlIHsgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbmZ1bmN0aW9uIHJldmVyc2VQYXRjaChzdHJ1Y3R1cmVkUGF0Y2gpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoc3RydWN0dXJlZFBhdGNoKSkge1xuICAgIHJldHVybiBzdHJ1Y3R1cmVkUGF0Y2gubWFwKHJldmVyc2VQYXRjaCkucmV2ZXJzZSgpO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICAgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LFxuICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gICAgc3RydWN0dXJlZFBhdGNoKSwge30sIHtcbiAgICAgIG9sZEZpbGVOYW1lOiBzdHJ1Y3R1cmVkUGF0Y2gubmV3RmlsZU5hbWUsXG4gICAgICBvbGRIZWFkZXI6IHN0cnVjdHVyZWRQYXRjaC5uZXdIZWFkZXIsXG4gICAgICBuZXdGaWxlTmFtZTogc3RydWN0dXJlZFBhdGNoLm9sZEZpbGVOYW1lLFxuICAgICAgbmV3SGVhZGVyOiBzdHJ1Y3R1cmVkUGF0Y2gub2xkSGVhZGVyLFxuICAgICAgaHVua3M6IHN0cnVjdHVyZWRQYXRjaC5odW5rcy5tYXAoZnVuY3Rpb24gKGh1bmspIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBvbGRMaW5lczogaHVuay5uZXdMaW5lcyxcbiAgICAgICAgICBvbGRTdGFydDogaHVuay5uZXdTdGFydCxcbiAgICAgICAgICBuZXdMaW5lczogaHVuay5vbGRMaW5lcyxcbiAgICAgICAgICBuZXdTdGFydDogaHVuay5vbGRTdGFydCxcbiAgICAgICAgICBsaW5lZGVsaW1pdGVyczogaHVuay5saW5lZGVsaW1pdGVycyxcbiAgICAgICAgICBsaW5lczogaHVuay5saW5lcy5tYXAoZnVuY3Rpb24gKGwpIHtcbiAgICAgICAgICAgIGlmIChsLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIC8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbiAgICAgICAgICAgICAgICBcIitcIi5jb25jYXQoXG4gICAgICAgICAgICAgICAgLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbiAgICAgICAgICAgICAgICBsLnNsaWNlKDEpKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobC5zdGFydHNXaXRoKCcrJykpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBzdGFydCovXG4gICAgICAgICAgICAgICAgXCItXCIuY29uY2F0KFxuICAgICAgICAgICAgICAgIC8qaXN0YW5idWwgaWdub3JlIGVuZCovXG4gICAgICAgICAgICAgICAgbC5zbGljZSgxKSlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGw7XG4gICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgfSlcbiAgKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OXdZWFJqYUM5eVpYWmxjbk5sTG1weklsMHNJbTVoYldWeklqcGJJbkpsZG1WeWMyVlFZWFJqYUNJc0luTjBjblZqZEhWeVpXUlFZWFJqYUNJc0lrRnljbUY1SWl3aWFYTkJjbkpoZVNJc0ltMWhjQ0lzSW5KbGRtVnljMlVpTENKdmJHUkdhV3hsVG1GdFpTSXNJbTVsZDBacGJHVk9ZVzFsSWl3aWIyeGtTR1ZoWkdWeUlpd2libVYzU0dWaFpHVnlJaXdpYUhWdWEzTWlMQ0pvZFc1cklpd2liMnhrVEdsdVpYTWlMQ0p1WlhkTWFXNWxjeUlzSW05c1pGTjBZWEowSWl3aWJtVjNVM1JoY25RaUxDSnNhVzVsWkdWc2FXMXBkR1Z5Y3lJc0lteHBibVZ6SWl3aWJDSXNJbk4wWVhKMGMxZHBkR2dpTENKemJHbGpaU0pkTENKdFlYQndhVzVuY3lJNklqczdPenM3T3pzN096czdPenM3TzBGQlFVOHNVMEZCVTBFc1dVRkJWQ3hEUVVGelFrTXNaVUZCZEVJc1JVRkJkVU03UVVGRE5VTXNUVUZCU1VNc1MwRkJTeXhEUVVGRFF5eFBRVUZPTEVOQlFXTkdMR1ZCUVdRc1EwRkJTaXhGUVVGdlF6dEJRVU5zUXl4WFFVRlBRU3hsUVVGbExFTkJRVU5ITEVkQlFXaENMRU5CUVc5Q1NpeFpRVUZ3UWl4RlFVRnJRMHNzVDBGQmJFTXNSVUZCVUR0QlFVTkVPenRCUVVWRU8wRkJRVUU3UVVGQlFUdEJRVUZCTzBGQlEwdEtMRWxCUVVGQkxHVkJSRXc3UVVGRlJVc3NUVUZCUVVFc1YwRkJWeXhGUVVGRlRDeGxRVUZsTEVOQlFVTk5MRmRCUmk5Q08wRkJSMFZETEUxQlFVRkJMRk5CUVZNc1JVRkJSVkFzWlVGQlpTeERRVUZEVVN4VFFVZzNRanRCUVVsRlJpeE5RVUZCUVN4WFFVRlhMRVZCUVVWT0xHVkJRV1VzUTBGQlEwc3NWMEZLTDBJN1FVRkxSVWNzVFVGQlFVRXNVMEZCVXl4RlFVRkZVaXhsUVVGbExFTkJRVU5QTEZOQlREZENPMEZCVFVWRkxFMUJRVUZCTEV0QlFVc3NSVUZCUlZRc1pVRkJaU3hEUVVGRFV5eExRVUZvUWl4RFFVRnpRazRzUjBGQmRFSXNRMEZCTUVJc1ZVRkJRVThzU1VGQlNTeEZRVUZKTzBGQlEzWkRMR1ZCUVU4N1FVRkRURU1zVlVGQlFVRXNVVUZCVVN4RlFVRkZSQ3hKUVVGSkxFTkJRVU5GTEZGQlJGWTdRVUZGVEVNc1ZVRkJRVUVzVVVGQlVTeEZRVUZGU0N4SlFVRkpMRU5CUVVOSkxGRkJSbFk3UVVGSFRFWXNWVUZCUVVFc1VVRkJVU3hGUVVGRlJpeEpRVUZKTEVOQlFVTkRMRkZCU0ZZN1FVRkpURWNzVlVGQlFVRXNVVUZCVVN4RlFVRkZTaXhKUVVGSkxFTkJRVU5ITEZGQlNsWTdRVUZMVEVVc1ZVRkJRVUVzWTBGQll5eEZRVUZGVEN4SlFVRkpMRU5CUVVOTExHTkJUR2hDTzBGQlRVeERMRlZCUVVGQkxFdEJRVXNzUlVGQlJVNHNTVUZCU1N4RFFVRkRUU3hMUVVGTUxFTkJRVmRpTEVkQlFWZ3NRMEZCWlN4VlFVRkJZeXhEUVVGRExFVkJRVWs3UVVGRGVrSXNaMEpCUVVsQkxFTkJRVU1zUTBGQlEwTXNWVUZCUml4RFFVRmhMRWRCUVdJc1EwRkJTaXhGUVVGMVFqdEJRVUZGTzBGQlFVRTdRVUZCUVR0QlFVRkJPMEZCUVZkRUxHZENRVUZCUVN4RFFVRkRMRU5CUVVORkxFdEJRVVlzUTBGQlVTeERRVUZTTEVOQlFWZzdRVUZCUVR0QlFVRXdRanM3UVVGRGJrUXNaMEpCUVVsR0xFTkJRVU1zUTBGQlEwTXNWVUZCUml4RFFVRmhMRWRCUVdJc1EwRkJTaXhGUVVGMVFqdEJRVUZGTzBGQlFVRTdRVUZCUVR0QlFVRkJPMEZCUVZkRUxHZENRVUZCUVN4RFFVRkRMRU5CUVVORkxFdEJRVVlzUTBGQlVTeERRVUZTTEVOQlFWZzdRVUZCUVR0QlFVRXdRanM3UVVGRGJrUXNiVUpCUVU5R0xFTkJRVkE3UVVGRFJDeFhRVXBOTzBGQlRrWXNVMEZCVUR0QlFWbEVMRTlCWWswN1FVRk9WRHRCUVVGQk8wRkJjVUpFSWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaVpYaHdiM0owSUdaMWJtTjBhVzl1SUhKbGRtVnljMlZRWVhSamFDaHpkSEoxWTNSMWNtVmtVR0YwWTJncElIdGNiaUFnYVdZZ0tFRnljbUY1TG1selFYSnlZWGtvYzNSeWRXTjBkWEpsWkZCaGRHTm9LU2tnZTF4dUlDQWdJSEpsZEhWeWJpQnpkSEoxWTNSMWNtVmtVR0YwWTJndWJXRndLSEpsZG1WeWMyVlFZWFJqYUNrdWNtVjJaWEp6WlNncE8xeHVJQ0I5WEc1Y2JpQWdjbVYwZFhKdUlIdGNiaUFnSUNBdUxpNXpkSEoxWTNSMWNtVmtVR0YwWTJnc1hHNGdJQ0FnYjJ4a1JtbHNaVTVoYldVNklITjBjblZqZEhWeVpXUlFZWFJqYUM1dVpYZEdhV3hsVG1GdFpTeGNiaUFnSUNCdmJHUklaV0ZrWlhJNklITjBjblZqZEhWeVpXUlFZWFJqYUM1dVpYZElaV0ZrWlhJc1hHNGdJQ0FnYm1WM1JtbHNaVTVoYldVNklITjBjblZqZEhWeVpXUlFZWFJqYUM1dmJHUkdhV3hsVG1GdFpTeGNiaUFnSUNCdVpYZElaV0ZrWlhJNklITjBjblZqZEhWeVpXUlFZWFJqYUM1dmJHUklaV0ZrWlhJc1hHNGdJQ0FnYUhWdWEzTTZJSE4wY25WamRIVnlaV1JRWVhSamFDNW9kVzVyY3k1dFlYQW9hSFZ1YXlBOVBpQjdYRzRnSUNBZ0lDQnlaWFIxY200Z2UxeHVJQ0FnSUNBZ0lDQnZiR1JNYVc1bGN6b2dhSFZ1YXk1dVpYZE1hVzVsY3l4Y2JpQWdJQ0FnSUNBZ2IyeGtVM1JoY25RNklHaDFibXN1Ym1WM1UzUmhjblFzWEc0Z0lDQWdJQ0FnSUc1bGQweHBibVZ6T2lCb2RXNXJMbTlzWkV4cGJtVnpMRnh1SUNBZ0lDQWdJQ0J1WlhkVGRHRnlkRG9nYUhWdWF5NXZiR1JUZEdGeWRDeGNiaUFnSUNBZ0lDQWdiR2x1WldSbGJHbHRhWFJsY25NNklHaDFibXN1YkdsdVpXUmxiR2x0YVhSbGNuTXNYRzRnSUNBZ0lDQWdJR3hwYm1Wek9pQm9kVzVyTG14cGJtVnpMbTFoY0Noc0lEMCtJSHRjYmlBZ0lDQWdJQ0FnSUNCcFppQW9iQzV6ZEdGeWRITlhhWFJvS0NjdEp5a3BJSHNnY21WMGRYSnVJR0FySkh0c0xuTnNhV05sS0RFcGZXQTdJSDFjYmlBZ0lDQWdJQ0FnSUNCcFppQW9iQzV6ZEdGeWRITlhhWFJvS0Njckp5a3BJSHNnY21WMGRYSnVJR0F0Skh0c0xuTnNhV05sS0RFcGZXQTdJSDFjYmlBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnYkR0Y2JpQWdJQ0FnSUNBZ2ZTbGNiaUFnSUNBZ0lIMDdYRzRnSUNBZ2ZTbGNiaUFnZlR0Y2JuMWNiaUpkZlE9PVxuIiwgIi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cblwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5jb252ZXJ0Q2hhbmdlc1RvRE1QID0gY29udmVydENoYW5nZXNUb0RNUDtcblxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbi8vIFNlZTogaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZS1kaWZmLW1hdGNoLXBhdGNoL3dpa2kvQVBJXG5mdW5jdGlvbiBjb252ZXJ0Q2hhbmdlc1RvRE1QKGNoYW5nZXMpIHtcbiAgdmFyIHJldCA9IFtdLFxuICAgICAgY2hhbmdlLFxuICAgICAgb3BlcmF0aW9uO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2hhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgIGNoYW5nZSA9IGNoYW5nZXNbaV07XG5cbiAgICBpZiAoY2hhbmdlLmFkZGVkKSB7XG4gICAgICBvcGVyYXRpb24gPSAxO1xuICAgIH0gZWxzZSBpZiAoY2hhbmdlLnJlbW92ZWQpIHtcbiAgICAgIG9wZXJhdGlvbiA9IC0xO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcGVyYXRpb24gPSAwO1xuICAgIH1cblxuICAgIHJldC5wdXNoKFtvcGVyYXRpb24sIGNoYW5nZS52YWx1ZV0pO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OWpiMjUyWlhKMEwyUnRjQzVxY3lKZExDSnVZVzFsY3lJNld5SmpiMjUyWlhKMFEyaGhibWRsYzFSdlJFMVFJaXdpWTJoaGJtZGxjeUlzSW5KbGRDSXNJbU5vWVc1blpTSXNJbTl3WlhKaGRHbHZiaUlzSW1raUxDSnNaVzVuZEdnaUxDSmhaR1JsWkNJc0luSmxiVzkyWldRaUxDSndkWE5vSWl3aWRtRnNkV1VpWFN3aWJXRndjR2x1WjNNaU9pSTdPenM3T3pzN096dEJRVUZCTzBGQlEwOHNVMEZCVTBFc2JVSkJRVlFzUTBGQk5rSkRMRTlCUVRkQ0xFVkJRWE5ETzBGQlF6TkRMRTFCUVVsRExFZEJRVWNzUjBGQlJ5eEZRVUZXTzBGQlFVRXNUVUZEU1VNc1RVRkVTanRCUVVGQkxFMUJSVWxETEZOQlJrbzdPMEZCUjBFc1QwRkJTeXhKUVVGSlF5eERRVUZETEVkQlFVY3NRMEZCWWl4RlFVRm5Ra0VzUTBGQlF5eEhRVUZIU2l4UFFVRlBMRU5CUVVOTExFMUJRVFZDTEVWQlFXOURSQ3hEUVVGRExFVkJRWEpETEVWQlFYbERPMEZCUTNaRFJpeEpRVUZCUVN4TlFVRk5MRWRCUVVkR0xFOUJRVThzUTBGQlEwa3NRMEZCUkN4RFFVRm9RanM3UVVGRFFTeFJRVUZKUml4TlFVRk5MRU5CUVVOSkxFdEJRVmdzUlVGQmEwSTdRVUZEYUVKSUxFMUJRVUZCTEZOQlFWTXNSMEZCUnl4RFFVRmFPMEZCUTBRc1MwRkdSQ3hOUVVWUExFbEJRVWxFTEUxQlFVMHNRMEZCUTBzc1QwRkJXQ3hGUVVGdlFqdEJRVU42UWtvc1RVRkJRVUVzVTBGQlV5eEhRVUZITEVOQlFVTXNRMEZCWWp0QlFVTkVMRXRCUmswc1RVRkZRVHRCUVVOTVFTeE5RVUZCUVN4VFFVRlRMRWRCUVVjc1EwRkJXanRCUVVORU96dEJRVVZFUml4SlFVRkJRU3hIUVVGSExFTkJRVU5QTEVsQlFVb3NRMEZCVXl4RFFVRkRUQ3hUUVVGRUxFVkJRVmxFTEUxQlFVMHNRMEZCUTA4c1MwRkJia0lzUTBGQlZEdEJRVU5FT3p0QlFVTkVMRk5CUVU5U0xFZEJRVkE3UVVGRFJDSXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJaTh2SUZObFpUb2dhSFIwY0RvdkwyTnZaR1V1WjI5dloyeGxMbU52YlM5d0wyZHZiMmRzWlMxa2FXWm1MVzFoZEdOb0xYQmhkR05vTDNkcGEya3ZRVkJKWEc1bGVIQnZjblFnWm5WdVkzUnBiMjRnWTI5dWRtVnlkRU5vWVc1blpYTlViMFJOVUNoamFHRnVaMlZ6S1NCN1hHNGdJR3hsZENCeVpYUWdQU0JiWFN4Y2JpQWdJQ0FnSUdOb1lXNW5aU3hjYmlBZ0lDQWdJRzl3WlhKaGRHbHZianRjYmlBZ1ptOXlJQ2hzWlhRZ2FTQTlJREE3SUdrZ1BDQmphR0Z1WjJWekxteGxibWQwYURzZ2FTc3JLU0I3WEc0Z0lDQWdZMmhoYm1kbElEMGdZMmhoYm1kbGMxdHBYVHRjYmlBZ0lDQnBaaUFvWTJoaGJtZGxMbUZrWkdWa0tTQjdYRzRnSUNBZ0lDQnZjR1Z5WVhScGIyNGdQU0F4TzF4dUlDQWdJSDBnWld4elpTQnBaaUFvWTJoaGJtZGxMbkpsYlc5MlpXUXBJSHRjYmlBZ0lDQWdJRzl3WlhKaGRHbHZiaUE5SUMweE8xeHVJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0J2Y0dWeVlYUnBiMjRnUFNBd08xeHVJQ0FnSUgxY2JseHVJQ0FnSUhKbGRDNXdkWE5vS0Z0dmNHVnlZWFJwYjI0c0lHTm9ZVzVuWlM1MllXeDFaVjBwTzF4dUlDQjlYRzRnSUhKbGRIVnliaUJ5WlhRN1hHNTlYRzRpWFgwPVxuIiwgIi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cblwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5jb252ZXJ0Q2hhbmdlc1RvWE1MID0gY29udmVydENoYW5nZXNUb1hNTDtcblxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbmZ1bmN0aW9uIGNvbnZlcnRDaGFuZ2VzVG9YTUwoY2hhbmdlcykge1xuICB2YXIgcmV0ID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNoYW5nZSA9IGNoYW5nZXNbaV07XG5cbiAgICBpZiAoY2hhbmdlLmFkZGVkKSB7XG4gICAgICByZXQucHVzaCgnPGlucz4nKTtcbiAgICB9IGVsc2UgaWYgKGNoYW5nZS5yZW1vdmVkKSB7XG4gICAgICByZXQucHVzaCgnPGRlbD4nKTtcbiAgICB9XG5cbiAgICByZXQucHVzaChlc2NhcGVIVE1MKGNoYW5nZS52YWx1ZSkpO1xuXG4gICAgaWYgKGNoYW5nZS5hZGRlZCkge1xuICAgICAgcmV0LnB1c2goJzwvaW5zPicpO1xuICAgIH0gZWxzZSBpZiAoY2hhbmdlLnJlbW92ZWQpIHtcbiAgICAgIHJldC5wdXNoKCc8L2RlbD4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmV0LmpvaW4oJycpO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVIVE1MKHMpIHtcbiAgdmFyIG4gPSBzO1xuICBuID0gbi5yZXBsYWNlKC8mL2csICcmYW1wOycpO1xuICBuID0gbi5yZXBsYWNlKC88L2csICcmbHQ7Jyk7XG4gIG4gPSBuLnJlcGxhY2UoLz4vZywgJyZndDsnKTtcbiAgbiA9IG4ucmVwbGFjZSgvXCIvZywgJyZxdW90OycpO1xuICByZXR1cm4gbjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OWpiMjUyWlhKMEwzaHRiQzVxY3lKZExDSnVZVzFsY3lJNld5SmpiMjUyWlhKMFEyaGhibWRsYzFSdldFMU1JaXdpWTJoaGJtZGxjeUlzSW5KbGRDSXNJbWtpTENKc1pXNW5kR2dpTENKamFHRnVaMlVpTENKaFpHUmxaQ0lzSW5CMWMyZ2lMQ0p5WlcxdmRtVmtJaXdpWlhOallYQmxTRlJOVENJc0luWmhiSFZsSWl3aWFtOXBiaUlzSW5NaUxDSnVJaXdpY21Wd2JHRmpaU0pkTENKdFlYQndhVzVuY3lJNklqczdPenM3T3pzN08wRkJRVThzVTBGQlUwRXNiVUpCUVZRc1EwRkJOa0pETEU5QlFUZENMRVZCUVhORE8wRkJRek5ETEUxQlFVbERMRWRCUVVjc1IwRkJSeXhGUVVGV096dEJRVU5CTEU5QlFVc3NTVUZCU1VNc1EwRkJReXhIUVVGSExFTkJRV0lzUlVGQlowSkJMRU5CUVVNc1IwRkJSMFlzVDBGQlR5eERRVUZEUnl4TlFVRTFRaXhGUVVGdlEwUXNRMEZCUXl4RlFVRnlReXhGUVVGNVF6dEJRVU4yUXl4UlFVRkpSU3hOUVVGTkxFZEJRVWRLTEU5QlFVOHNRMEZCUTBVc1EwRkJSQ3hEUVVGd1FqczdRVUZEUVN4UlFVRkpSU3hOUVVGTkxFTkJRVU5ETEV0QlFWZ3NSVUZCYTBJN1FVRkRhRUpLTEUxQlFVRkJMRWRCUVVjc1EwRkJRMHNzU1VGQlNpeERRVUZUTEU5QlFWUTdRVUZEUkN4TFFVWkVMRTFCUlU4c1NVRkJTVVlzVFVGQlRTeERRVUZEUnl4UFFVRllMRVZCUVc5Q08wRkJRM3BDVGl4TlFVRkJRU3hIUVVGSExFTkJRVU5MTEVsQlFVb3NRMEZCVXl4UFFVRlVPMEZCUTBRN08wRkJSVVJNTEVsQlFVRkJMRWRCUVVjc1EwRkJRMHNzU1VGQlNpeERRVUZUUlN4VlFVRlZMRU5CUVVOS0xFMUJRVTBzUTBGQlEwc3NTMEZCVWl4RFFVRnVRanM3UVVGRlFTeFJRVUZKVEN4TlFVRk5MRU5CUVVORExFdEJRVmdzUlVGQmEwSTdRVUZEYUVKS0xFMUJRVUZCTEVkQlFVY3NRMEZCUTBzc1NVRkJTaXhEUVVGVExGRkJRVlE3UVVGRFJDeExRVVpFTEUxQlJVOHNTVUZCU1VZc1RVRkJUU3hEUVVGRFJ5eFBRVUZZTEVWQlFXOUNPMEZCUTNwQ1RpeE5RVUZCUVN4SFFVRkhMRU5CUVVOTExFbEJRVW9zUTBGQlV5eFJRVUZVTzBGQlEwUTdRVUZEUmpzN1FVRkRSQ3hUUVVGUFRDeEhRVUZITEVOQlFVTlRMRWxCUVVvc1EwRkJVeXhGUVVGVUxFTkJRVkE3UVVGRFJEczdRVUZGUkN4VFFVRlRSaXhWUVVGVUxFTkJRVzlDUnl4RFFVRndRaXhGUVVGMVFqdEJRVU55UWl4TlFVRkpReXhEUVVGRExFZEJRVWRFTEVOQlFWSTdRVUZEUVVNc1JVRkJRVUVzUTBGQlF5eEhRVUZIUVN4RFFVRkRMRU5CUVVORExFOUJRVVlzUTBGQlZTeEpRVUZXTEVWQlFXZENMRTlCUVdoQ0xFTkJRVW83UVVGRFFVUXNSVUZCUVVFc1EwRkJReXhIUVVGSFFTeERRVUZETEVOQlFVTkRMRTlCUVVZc1EwRkJWU3hKUVVGV0xFVkJRV2RDTEUxQlFXaENMRU5CUVVvN1FVRkRRVVFzUlVGQlFVRXNRMEZCUXl4SFFVRkhRU3hEUVVGRExFTkJRVU5ETEU5QlFVWXNRMEZCVlN4SlFVRldMRVZCUVdkQ0xFMUJRV2hDTEVOQlFVbzdRVUZEUVVRc1JVRkJRVUVzUTBGQlF5eEhRVUZIUVN4RFFVRkRMRU5CUVVORExFOUJRVVlzUTBGQlZTeEpRVUZXTEVWQlFXZENMRkZCUVdoQ0xFTkJRVW83UVVGRlFTeFRRVUZQUkN4RFFVRlFPMEZCUTBRaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SmxlSEJ2Y25RZ1puVnVZM1JwYjI0Z1kyOXVkbVZ5ZEVOb1lXNW5aWE5VYjFoTlRDaGphR0Z1WjJWektTQjdYRzRnSUd4bGRDQnlaWFFnUFNCYlhUdGNiaUFnWm05eUlDaHNaWFFnYVNBOUlEQTdJR2tnUENCamFHRnVaMlZ6TG14bGJtZDBhRHNnYVNzcktTQjdYRzRnSUNBZ2JHVjBJR05vWVc1blpTQTlJR05vWVc1blpYTmJhVjA3WEc0Z0lDQWdhV1lnS0dOb1lXNW5aUzVoWkdSbFpDa2dlMXh1SUNBZ0lDQWdjbVYwTG5CMWMyZ29KenhwYm5NK0p5azdYRzRnSUNBZ2ZTQmxiSE5sSUdsbUlDaGphR0Z1WjJVdWNtVnRiM1psWkNrZ2UxeHVJQ0FnSUNBZ2NtVjBMbkIxYzJnb0p6eGtaV3crSnlrN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnY21WMExuQjFjMmdvWlhOallYQmxTRlJOVENoamFHRnVaMlV1ZG1Gc2RXVXBLVHRjYmx4dUlDQWdJR2xtSUNoamFHRnVaMlV1WVdSa1pXUXBJSHRjYmlBZ0lDQWdJSEpsZEM1d2RYTm9LQ2M4TDJsdWN6NG5LVHRjYmlBZ0lDQjlJR1ZzYzJVZ2FXWWdLR05vWVc1blpTNXlaVzF2ZG1Wa0tTQjdYRzRnSUNBZ0lDQnlaWFF1Y0hWemFDZ25QQzlrWld3K0p5azdYRzRnSUNBZ2ZWeHVJQ0I5WEc0Z0lISmxkSFZ5YmlCeVpYUXVhbTlwYmlnbkp5azdYRzU5WEc1Y2JtWjFibU4wYVc5dUlHVnpZMkZ3WlVoVVRVd29jeWtnZTF4dUlDQnNaWFFnYmlBOUlITTdYRzRnSUc0Z1BTQnVMbkpsY0d4aFkyVW9MeVl2Wnl3Z0p5WmhiWEE3SnlrN1hHNGdJRzRnUFNCdUxuSmxjR3hoWTJVb0x6d3ZaeXdnSnlac2REc25LVHRjYmlBZ2JpQTlJRzR1Y21Wd2JHRmpaU2d2UGk5bkxDQW5KbWQwT3ljcE8xeHVJQ0J1SUQwZ2JpNXlaWEJzWVdObEtDOWNJaTluTENBbkpuRjFiM1E3SnlrN1hHNWNiaUFnY21WMGRYSnVJRzQ3WEc1OVhHNGlYWDA9XG4iLCAiLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJEaWZmXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9iYXNlW1wiZGVmYXVsdFwiXTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJkaWZmQ2hhcnNcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2NoYXJhY3Rlci5kaWZmQ2hhcnM7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZGlmZldvcmRzXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF93b3JkLmRpZmZXb3JkcztcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJkaWZmV29yZHNXaXRoU3BhY2VcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3dvcmQuZGlmZldvcmRzV2l0aFNwYWNlO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImRpZmZMaW5lc1wiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfbGluZS5kaWZmTGluZXM7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZGlmZlRyaW1tZWRMaW5lc1wiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfbGluZS5kaWZmVHJpbW1lZExpbmVzO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImRpZmZTZW50ZW5jZXNcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3NlbnRlbmNlLmRpZmZTZW50ZW5jZXM7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZGlmZkNzc1wiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfY3NzLmRpZmZDc3M7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZGlmZkpzb25cIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2pzb24uZGlmZkpzb247XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiY2Fub25pY2FsaXplXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9qc29uLmNhbm9uaWNhbGl6ZTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJkaWZmQXJyYXlzXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9hcnJheS5kaWZmQXJyYXlzO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImFwcGx5UGF0Y2hcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2FwcGx5LmFwcGx5UGF0Y2g7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiYXBwbHlQYXRjaGVzXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9hcHBseS5hcHBseVBhdGNoZXM7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwicGFyc2VQYXRjaFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfcGFyc2UucGFyc2VQYXRjaDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJtZXJnZVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfbWVyZ2UubWVyZ2U7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwicmV2ZXJzZVBhdGNoXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9yZXZlcnNlLnJldmVyc2VQYXRjaDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJzdHJ1Y3R1cmVkUGF0Y2hcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2NyZWF0ZS5zdHJ1Y3R1cmVkUGF0Y2g7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiY3JlYXRlVHdvRmlsZXNQYXRjaFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfY3JlYXRlLmNyZWF0ZVR3b0ZpbGVzUGF0Y2g7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiY3JlYXRlUGF0Y2hcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2NyZWF0ZS5jcmVhdGVQYXRjaDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJmb3JtYXRQYXRjaFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfY3JlYXRlLmZvcm1hdFBhdGNoO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImNvbnZlcnRDaGFuZ2VzVG9ETVBcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2RtcC5jb252ZXJ0Q2hhbmdlc1RvRE1QO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImNvbnZlcnRDaGFuZ2VzVG9YTUxcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3htbC5jb252ZXJ0Q2hhbmdlc1RvWE1MO1xuICB9XG59KTtcblxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbnZhclxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuX2Jhc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2RpZmYvYmFzZVwiKSlcbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG47XG5cbnZhclxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuX2NoYXJhY3RlciA9IHJlcXVpcmUoXCIuL2RpZmYvY2hhcmFjdGVyXCIpXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuO1xuXG52YXJcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl93b3JkID0gcmVxdWlyZShcIi4vZGlmZi93b3JkXCIpXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuO1xuXG52YXJcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl9saW5lID0gcmVxdWlyZShcIi4vZGlmZi9saW5lXCIpXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuO1xuXG52YXJcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl9zZW50ZW5jZSA9IHJlcXVpcmUoXCIuL2RpZmYvc2VudGVuY2VcIilcbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG47XG5cbnZhclxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuX2NzcyA9IHJlcXVpcmUoXCIuL2RpZmYvY3NzXCIpXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuO1xuXG52YXJcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl9qc29uID0gcmVxdWlyZShcIi4vZGlmZi9qc29uXCIpXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuO1xuXG52YXJcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl9hcnJheSA9IHJlcXVpcmUoXCIuL2RpZmYvYXJyYXlcIilcbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG47XG5cbnZhclxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuX2FwcGx5ID0gcmVxdWlyZShcIi4vcGF0Y2gvYXBwbHlcIilcbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG47XG5cbnZhclxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuX3BhcnNlID0gcmVxdWlyZShcIi4vcGF0Y2gvcGFyc2VcIilcbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG47XG5cbnZhclxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuX21lcmdlID0gcmVxdWlyZShcIi4vcGF0Y2gvbWVyZ2VcIilcbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG47XG5cbnZhclxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuX3JldmVyc2UgPSByZXF1aXJlKFwiLi9wYXRjaC9yZXZlcnNlXCIpXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuO1xuXG52YXJcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl9jcmVhdGUgPSByZXF1aXJlKFwiLi9wYXRjaC9jcmVhdGVcIilcbi8qaXN0YW5idWwgaWdub3JlIGVuZCovXG47XG5cbnZhclxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqL1xuX2RtcCA9IHJlcXVpcmUoXCIuL2NvbnZlcnQvZG1wXCIpXG4vKmlzdGFuYnVsIGlnbm9yZSBlbmQqL1xuO1xuXG52YXJcbi8qaXN0YW5idWwgaWdub3JlIHN0YXJ0Ki9cbl94bWwgPSByZXF1aXJlKFwiLi9jb252ZXJ0L3htbFwiKVxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbjtcblxuLyppc3RhbmJ1bCBpZ25vcmUgc3RhcnQqLyBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuLyppc3RhbmJ1bCBpZ25vcmUgZW5kKi9cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMM055WXk5cGJtUmxlQzVxY3lKZExDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pT3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096dEJRV2RDUVR0QlFVRkJPMEZCUVVFN1FVRkJRVHRCUVVGQk96dEJRVU5CTzBGQlFVRTdRVUZCUVR0QlFVRkJPMEZCUVVFN08wRkJRMEU3UVVGQlFUdEJRVUZCTzBGQlFVRTdRVUZCUVRzN1FVRkRRVHRCUVVGQk8wRkJRVUU3UVVGQlFUdEJRVUZCT3p0QlFVTkJPMEZCUVVFN1FVRkJRVHRCUVVGQk8wRkJRVUU3TzBGQlJVRTdRVUZCUVR0QlFVRkJPMEZCUVVFN1FVRkJRVHM3UVVGRFFUdEJRVUZCTzBGQlFVRTdRVUZCUVR0QlFVRkJPenRCUVVWQk8wRkJRVUU3UVVGQlFUdEJRVUZCTzBGQlFVRTdPMEZCUlVFN1FVRkJRVHRCUVVGQk8wRkJRVUU3UVVGQlFUczdRVUZEUVR0QlFVRkJPMEZCUVVFN1FVRkJRVHRCUVVGQk96dEJRVU5CTzBGQlFVRTdRVUZCUVR0QlFVRkJPMEZCUVVFN08wRkJRMEU3UVVGQlFUdEJRVUZCTzBGQlFVRTdRVUZCUVRzN1FVRkRRVHRCUVVGQk8wRkJRVUU3UVVGQlFUdEJRVUZCT3p0QlFVVkJPMEZCUVVFN1FVRkJRVHRCUVVGQk8wRkJRVUU3TzBGQlEwRTdRVUZCUVR0QlFVRkJPMEZCUVVFN1FVRkJRU0lzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSWk4cUlGTmxaU0JNU1VORlRsTkZJR1pwYkdVZ1ptOXlJSFJsY20xeklHOW1JSFZ6WlNBcUwxeHVYRzR2S2x4dUlDb2dWR1Y0ZENCa2FXWm1JR2x0Y0d4bGJXVnVkR0YwYVc5dUxseHVJQ3BjYmlBcUlGUm9hWE1nYkdsaWNtRnllU0J6ZFhCd2IzSjBjeUIwYUdVZ1ptOXNiRzkzYVc1bklFRlFTWE02WEc0Z0tpQkVhV1ptTG1ScFptWkRhR0Z5Y3pvZ1EyaGhjbUZqZEdWeUlHSjVJR05vWVhKaFkzUmxjaUJrYVdabVhHNGdLaUJFYVdabUxtUnBabVpYYjNKa2N6b2dWMjl5WkNBb1lYTWdaR1ZtYVc1bFpDQmllU0JjWEdJZ2NtVm5aWGdwSUdScFptWWdkMmhwWTJnZ2FXZHViM0psY3lCM2FHbDBaWE53WVdObFhHNGdLaUJFYVdabUxtUnBabVpNYVc1bGN6b2dUR2x1WlNCaVlYTmxaQ0JrYVdabVhHNGdLbHh1SUNvZ1JHbG1aaTVrYVdabVEzTnpPaUJFYVdabUlIUmhjbWRsZEdWa0lHRjBJRU5UVXlCamIyNTBaVzUwWEc0Z0tseHVJQ29nVkdobGMyVWdiV1YwYUc5a2N5QmhjbVVnWW1GelpXUWdiMjRnZEdobElHbHRjR3hsYldWdWRHRjBhVzl1SUhCeWIzQnZjMlZrSUdsdVhHNGdLaUJjSWtGdUlFOG9Ua1FwSUVScFptWmxjbVZ1WTJVZ1FXeG5iM0pwZEdodElHRnVaQ0JwZEhNZ1ZtRnlhV0YwYVc5dWMxd2lJQ2hOZVdWeWN5d2dNVGs0TmlrdVhHNGdLaUJvZEhSd09pOHZZMmwwWlhObFpYSjRMbWx6ZEM1d2MzVXVaV1IxTDNacFpYZGtiMk12YzNWdGJXRnllVDlrYjJrOU1UQXVNUzR4TGpRdU5qa3lOMXh1SUNvdlhHNXBiWEJ2Y25RZ1JHbG1aaUJtY205dElDY3VMMlJwWm1ZdlltRnpaU2M3WEc1cGJYQnZjblFnZTJScFptWkRhR0Z5YzMwZ1puSnZiU0FuTGk5a2FXWm1MMk5vWVhKaFkzUmxjaWM3WEc1cGJYQnZjblFnZTJScFptWlhiM0prY3l3Z1pHbG1abGR2Y21SelYybDBhRk53WVdObGZTQm1jbTl0SUNjdUwyUnBabVl2ZDI5eVpDYzdYRzVwYlhCdmNuUWdlMlJwWm1aTWFXNWxjeXdnWkdsbVpsUnlhVzF0WldSTWFXNWxjMzBnWm5KdmJTQW5MaTlrYVdabUwyeHBibVVuTzF4dWFXMXdiM0owSUh0a2FXWm1VMlZ1ZEdWdVkyVnpmU0JtY205dElDY3VMMlJwWm1ZdmMyVnVkR1Z1WTJVbk8xeHVYRzVwYlhCdmNuUWdlMlJwWm1aRGMzTjlJR1p5YjIwZ0p5NHZaR2xtWmk5amMzTW5PMXh1YVcxd2IzSjBJSHRrYVdabVNuTnZiaXdnWTJGdWIyNXBZMkZzYVhwbGZTQm1jbTl0SUNjdUwyUnBabVl2YW5OdmJpYzdYRzVjYm1sdGNHOXlkQ0I3WkdsbVprRnljbUY1YzMwZ1puSnZiU0FuTGk5a2FXWm1MMkZ5Y21GNUp6dGNibHh1YVcxd2IzSjBJSHRoY0hCc2VWQmhkR05vTENCaGNIQnNlVkJoZEdOb1pYTjlJR1p5YjIwZ0p5NHZjR0YwWTJndllYQndiSGtuTzF4dWFXMXdiM0owSUh0d1lYSnpaVkJoZEdOb2ZTQm1jbTl0SUNjdUwzQmhkR05vTDNCaGNuTmxKenRjYm1sdGNHOXlkQ0I3YldWeVoyVjlJR1p5YjIwZ0p5NHZjR0YwWTJndmJXVnlaMlVuTzF4dWFXMXdiM0owSUh0eVpYWmxjbk5sVUdGMFkyaDlJR1p5YjIwZ0p5NHZjR0YwWTJndmNtVjJaWEp6WlNjN1hHNXBiWEJ2Y25RZ2UzTjBjblZqZEhWeVpXUlFZWFJqYUN3Z1kzSmxZWFJsVkhkdlJtbHNaWE5RWVhSamFDd2dZM0psWVhSbFVHRjBZMmdzSUdadmNtMWhkRkJoZEdOb2ZTQm1jbTl0SUNjdUwzQmhkR05vTDJOeVpXRjBaU2M3WEc1Y2JtbHRjRzl5ZENCN1kyOXVkbVZ5ZEVOb1lXNW5aWE5VYjBSTlVIMGdabkp2YlNBbkxpOWpiMjUyWlhKMEwyUnRjQ2M3WEc1cGJYQnZjblFnZTJOdmJuWmxjblJEYUdGdVoyVnpWRzlZVFV4OUlHWnliMjBnSnk0dlkyOXVkbVZ5ZEM5NGJXd25PMXh1WEc1bGVIQnZjblFnZTF4dUlDQkVhV1ptTEZ4dVhHNGdJR1JwWm1aRGFHRnljeXhjYmlBZ1pHbG1abGR2Y21SekxGeHVJQ0JrYVdabVYyOXlaSE5YYVhSb1UzQmhZMlVzWEc0Z0lHUnBabVpNYVc1bGN5eGNiaUFnWkdsbVpsUnlhVzF0WldSTWFXNWxjeXhjYmlBZ1pHbG1abE5sYm5SbGJtTmxjeXhjYmx4dUlDQmthV1ptUTNOekxGeHVJQ0JrYVdabVNuTnZiaXhjYmx4dUlDQmthV1ptUVhKeVlYbHpMRnh1WEc0Z0lITjBjblZqZEhWeVpXUlFZWFJqYUN4Y2JpQWdZM0psWVhSbFZIZHZSbWxzWlhOUVlYUmphQ3hjYmlBZ1kzSmxZWFJsVUdGMFkyZ3NYRzRnSUdadmNtMWhkRkJoZEdOb0xGeHVJQ0JoY0hCc2VWQmhkR05vTEZ4dUlDQmhjSEJzZVZCaGRHTm9aWE1zWEc0Z0lIQmhjbk5sVUdGMFkyZ3NYRzRnSUcxbGNtZGxMRnh1SUNCeVpYWmxjbk5sVUdGMFkyZ3NYRzRnSUdOdmJuWmxjblJEYUdGdVoyVnpWRzlFVFZBc1hHNGdJR052Ym5abGNuUkRhR0Z1WjJWelZHOVlUVXdzWEc0Z0lHTmhibTl1YVdOaGJHbDZaVnh1ZlR0Y2JpSmRmUT09XG4iLCAiLyoqXG4gKiBIZWxwZXJzLlxuICovXG5cbnZhciBzID0gMTAwMDtcbnZhciBtID0gcyAqIDYwO1xudmFyIGggPSBtICogNjA7XG52YXIgZCA9IGggKiAyNDtcbnZhciB3ID0gZCAqIDc7XG52YXIgeSA9IGQgKiAzNjUuMjU7XG5cbi8qKlxuICogUGFyc2Ugb3IgZm9ybWF0IHRoZSBnaXZlbiBgdmFsYC5cbiAqXG4gKiBPcHRpb25zOlxuICpcbiAqICAtIGBsb25nYCB2ZXJib3NlIGZvcm1hdHRpbmcgW2ZhbHNlXVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gdmFsXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhyb3cgYW4gZXJyb3IgaWYgdmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSBudW1iZXJcbiAqIEByZXR1cm4ge1N0cmluZ3xOdW1iZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHZhbCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsO1xuICBpZiAodHlwZSA9PT0gJ3N0cmluZycgJiYgdmFsLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gcGFyc2UodmFsKTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZSh2YWwpKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMubG9uZyA/IGZtdExvbmcodmFsKSA6IGZtdFNob3J0KHZhbCk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgICd2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIHZhbGlkIG51bWJlci4gdmFsPScgK1xuICAgICAgSlNPTi5zdHJpbmdpZnkodmFsKVxuICApO1xufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gYHN0cmAgYW5kIHJldHVybiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2Uoc3RyKSB7XG4gIHN0ciA9IFN0cmluZyhzdHIpO1xuICBpZiAoc3RyLmxlbmd0aCA+IDEwMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbWF0Y2ggPSAvXigtPyg/OlxcZCspP1xcLj9cXGQrKSAqKG1pbGxpc2Vjb25kcz98bXNlY3M/fG1zfHNlY29uZHM/fHNlY3M/fHN8bWludXRlcz98bWlucz98bXxob3Vycz98aHJzP3xofGRheXM/fGR8d2Vla3M/fHd8eWVhcnM/fHlycz98eSk/JC9pLmV4ZWMoXG4gICAgc3RyXG4gICk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG4gPSBwYXJzZUZsb2F0KG1hdGNoWzFdKTtcbiAgdmFyIHR5cGUgPSAobWF0Y2hbMl0gfHwgJ21zJykudG9Mb3dlckNhc2UoKTtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAneWVhcnMnOlxuICAgIGNhc2UgJ3llYXInOlxuICAgIGNhc2UgJ3lycyc6XG4gICAgY2FzZSAneXInOlxuICAgIGNhc2UgJ3knOlxuICAgICAgcmV0dXJuIG4gKiB5O1xuICAgIGNhc2UgJ3dlZWtzJzpcbiAgICBjYXNlICd3ZWVrJzpcbiAgICBjYXNlICd3JzpcbiAgICAgIHJldHVybiBuICogdztcbiAgICBjYXNlICdkYXlzJzpcbiAgICBjYXNlICdkYXknOlxuICAgIGNhc2UgJ2QnOlxuICAgICAgcmV0dXJuIG4gKiBkO1xuICAgIGNhc2UgJ2hvdXJzJzpcbiAgICBjYXNlICdob3VyJzpcbiAgICBjYXNlICdocnMnOlxuICAgIGNhc2UgJ2hyJzpcbiAgICBjYXNlICdoJzpcbiAgICAgIHJldHVybiBuICogaDtcbiAgICBjYXNlICdtaW51dGVzJzpcbiAgICBjYXNlICdtaW51dGUnOlxuICAgIGNhc2UgJ21pbnMnOlxuICAgIGNhc2UgJ21pbic6XG4gICAgY2FzZSAnbSc6XG4gICAgICByZXR1cm4gbiAqIG07XG4gICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgY2FzZSAnc2Vjb25kJzpcbiAgICBjYXNlICdzZWNzJzpcbiAgICBjYXNlICdzZWMnOlxuICAgIGNhc2UgJ3MnOlxuICAgICAgcmV0dXJuIG4gKiBzO1xuICAgIGNhc2UgJ21pbGxpc2Vjb25kcyc6XG4gICAgY2FzZSAnbWlsbGlzZWNvbmQnOlxuICAgIGNhc2UgJ21zZWNzJzpcbiAgICBjYXNlICdtc2VjJzpcbiAgICBjYXNlICdtcyc6XG4gICAgICByZXR1cm4gbjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFNob3J0IGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZtdFNob3J0KG1zKSB7XG4gIHZhciBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgaWYgKG1zQWJzID49IGQpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGQpICsgJ2QnO1xuICB9XG4gIGlmIChtc0FicyA+PSBoKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBoKSArICdoJztcbiAgfVxuICBpZiAobXNBYnMgPj0gbSkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbSkgKyAnbSc7XG4gIH1cbiAgaWYgKG1zQWJzID49IHMpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIHMpICsgJ3MnO1xuICB9XG4gIHJldHVybiBtcyArICdtcyc7XG59XG5cbi8qKlxuICogTG9uZyBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmbXRMb25nKG1zKSB7XG4gIHZhciBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgaWYgKG1zQWJzID49IGQpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgZCwgJ2RheScpO1xuICB9XG4gIGlmIChtc0FicyA+PSBoKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGgsICdob3VyJyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IG0pIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgbSwgJ21pbnV0ZScpO1xuICB9XG4gIGlmIChtc0FicyA+PSBzKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIHMsICdzZWNvbmQnKTtcbiAgfVxuICByZXR1cm4gbXMgKyAnIG1zJztcbn1cblxuLyoqXG4gKiBQbHVyYWxpemF0aW9uIGhlbHBlci5cbiAqL1xuXG5mdW5jdGlvbiBwbHVyYWwobXMsIG1zQWJzLCBuLCBuYW1lKSB7XG4gIHZhciBpc1BsdXJhbCA9IG1zQWJzID49IG4gKiAxLjU7XG4gIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbikgKyAnICcgKyBuYW1lICsgKGlzUGx1cmFsID8gJ3MnIDogJycpO1xufVxuIiwgIlxudmFyIGxvb2t1cCA9IFtdXG52YXIgcmV2TG9va3VwID0gW11cbnZhciBBcnIgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBVaW50OEFycmF5IDogQXJyYXlcbnZhciBpbml0ZWQgPSBmYWxzZTtcbmZ1bmN0aW9uIGluaXQgKCkge1xuICBpbml0ZWQgPSB0cnVlO1xuICB2YXIgY29kZSA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJ1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gY29kZS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgIGxvb2t1cFtpXSA9IGNvZGVbaV1cbiAgICByZXZMb29rdXBbY29kZS5jaGFyQ29kZUF0KGkpXSA9IGlcbiAgfVxuXG4gIHJldkxvb2t1cFsnLScuY2hhckNvZGVBdCgwKV0gPSA2MlxuICByZXZMb29rdXBbJ18nLmNoYXJDb2RlQXQoMCldID0gNjNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvQnl0ZUFycmF5IChiNjQpIHtcbiAgaWYgKCFpbml0ZWQpIHtcbiAgICBpbml0KCk7XG4gIH1cbiAgdmFyIGksIGosIGwsIHRtcCwgcGxhY2VIb2xkZXJzLCBhcnJcbiAgdmFyIGxlbiA9IGI2NC5sZW5ndGhcblxuICBpZiAobGVuICUgNCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQnKVxuICB9XG5cbiAgLy8gdGhlIG51bWJlciBvZiBlcXVhbCBzaWducyAocGxhY2UgaG9sZGVycylcbiAgLy8gaWYgdGhlcmUgYXJlIHR3byBwbGFjZWhvbGRlcnMsIHRoYW4gdGhlIHR3byBjaGFyYWN0ZXJzIGJlZm9yZSBpdFxuICAvLyByZXByZXNlbnQgb25lIGJ5dGVcbiAgLy8gaWYgdGhlcmUgaXMgb25seSBvbmUsIHRoZW4gdGhlIHRocmVlIGNoYXJhY3RlcnMgYmVmb3JlIGl0IHJlcHJlc2VudCAyIGJ5dGVzXG4gIC8vIHRoaXMgaXMganVzdCBhIGNoZWFwIGhhY2sgdG8gbm90IGRvIGluZGV4T2YgdHdpY2VcbiAgcGxhY2VIb2xkZXJzID0gYjY0W2xlbiAtIDJdID09PSAnPScgPyAyIDogYjY0W2xlbiAtIDFdID09PSAnPScgPyAxIDogMFxuXG4gIC8vIGJhc2U2NCBpcyA0LzMgKyB1cCB0byB0d28gY2hhcmFjdGVycyBvZiB0aGUgb3JpZ2luYWwgZGF0YVxuICBhcnIgPSBuZXcgQXJyKGxlbiAqIDMgLyA0IC0gcGxhY2VIb2xkZXJzKVxuXG4gIC8vIGlmIHRoZXJlIGFyZSBwbGFjZWhvbGRlcnMsIG9ubHkgZ2V0IHVwIHRvIHRoZSBsYXN0IGNvbXBsZXRlIDQgY2hhcnNcbiAgbCA9IHBsYWNlSG9sZGVycyA+IDAgPyBsZW4gLSA0IDogbGVuXG5cbiAgdmFyIEwgPSAwXG5cbiAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBsOyBpICs9IDQsIGogKz0gMykge1xuICAgIHRtcCA9IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDE4KSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCAxMikgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPDwgNikgfCByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDMpXVxuICAgIGFycltMKytdID0gKHRtcCA+PiAxNikgJiAweEZGXG4gICAgYXJyW0wrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltMKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVycyA9PT0gMikge1xuICAgIHRtcCA9IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDIpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldID4+IDQpXG4gICAgYXJyW0wrK10gPSB0bXAgJiAweEZGXG4gIH0gZWxzZSBpZiAocGxhY2VIb2xkZXJzID09PSAxKSB7XG4gICAgdG1wID0gKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTApIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDQpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildID4+IDIpXG4gICAgYXJyW0wrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltMKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuICByZXR1cm4gbG9va3VwW251bSA+PiAxOCAmIDB4M0ZdICsgbG9va3VwW251bSA+PiAxMiAmIDB4M0ZdICsgbG9va3VwW251bSA+PiA2ICYgMHgzRl0gKyBsb29rdXBbbnVtICYgMHgzRl1cbn1cblxuZnVuY3Rpb24gZW5jb2RlQ2h1bmsgKHVpbnQ4LCBzdGFydCwgZW5kKSB7XG4gIHZhciB0bXBcbiAgdmFyIG91dHB1dCA9IFtdXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSAzKSB7XG4gICAgdG1wID0gKHVpbnQ4W2ldIDw8IDE2KSArICh1aW50OFtpICsgMV0gPDwgOCkgKyAodWludDhbaSArIDJdKVxuICAgIG91dHB1dC5wdXNoKHRyaXBsZXRUb0Jhc2U2NCh0bXApKVxuICB9XG4gIHJldHVybiBvdXRwdXQuam9pbignJylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21CeXRlQXJyYXkgKHVpbnQ4KSB7XG4gIGlmICghaW5pdGVkKSB7XG4gICAgaW5pdCgpO1xuICB9XG4gIHZhciB0bXBcbiAgdmFyIGxlbiA9IHVpbnQ4Lmxlbmd0aFxuICB2YXIgZXh0cmFCeXRlcyA9IGxlbiAlIDMgLy8gaWYgd2UgaGF2ZSAxIGJ5dGUgbGVmdCwgcGFkIDIgYnl0ZXNcbiAgdmFyIG91dHB1dCA9ICcnXG4gIHZhciBwYXJ0cyA9IFtdXG4gIHZhciBtYXhDaHVua0xlbmd0aCA9IDE2MzgzIC8vIG11c3QgYmUgbXVsdGlwbGUgb2YgM1xuXG4gIC8vIGdvIHRocm91Z2ggdGhlIGFycmF5IGV2ZXJ5IHRocmVlIGJ5dGVzLCB3ZSdsbCBkZWFsIHdpdGggdHJhaWxpbmcgc3R1ZmYgbGF0ZXJcbiAgZm9yICh2YXIgaSA9IDAsIGxlbjIgPSBsZW4gLSBleHRyYUJ5dGVzOyBpIDwgbGVuMjsgaSArPSBtYXhDaHVua0xlbmd0aCkge1xuICAgIHBhcnRzLnB1c2goZW5jb2RlQ2h1bmsodWludDgsIGksIChpICsgbWF4Q2h1bmtMZW5ndGgpID4gbGVuMiA/IGxlbjIgOiAoaSArIG1heENodW5rTGVuZ3RoKSkpXG4gIH1cblxuICAvLyBwYWQgdGhlIGVuZCB3aXRoIHplcm9zLCBidXQgbWFrZSBzdXJlIHRvIG5vdCBmb3JnZXQgdGhlIGV4dHJhIGJ5dGVzXG4gIGlmIChleHRyYUJ5dGVzID09PSAxKSB7XG4gICAgdG1wID0gdWludDhbbGVuIC0gMV1cbiAgICBvdXRwdXQgKz0gbG9va3VwW3RtcCA+PiAyXVxuICAgIG91dHB1dCArPSBsb29rdXBbKHRtcCA8PCA0KSAmIDB4M0ZdXG4gICAgb3V0cHV0ICs9ICc9PSdcbiAgfSBlbHNlIGlmIChleHRyYUJ5dGVzID09PSAyKSB7XG4gICAgdG1wID0gKHVpbnQ4W2xlbiAtIDJdIDw8IDgpICsgKHVpbnQ4W2xlbiAtIDFdKVxuICAgIG91dHB1dCArPSBsb29rdXBbdG1wID4+IDEwXVxuICAgIG91dHB1dCArPSBsb29rdXBbKHRtcCA+PiA0KSAmIDB4M0ZdXG4gICAgb3V0cHV0ICs9IGxvb2t1cFsodG1wIDw8IDIpICYgMHgzRl1cbiAgICBvdXRwdXQgKz0gJz0nXG4gIH1cblxuICBwYXJ0cy5wdXNoKG91dHB1dClcblxuICByZXR1cm4gcGFydHMuam9pbignJylcbn1cbiIsICJcbmV4cG9ydCBmdW5jdGlvbiByZWFkIChidWZmZXIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtXG4gIHZhciBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgbkJpdHMgPSAtN1xuICB2YXIgaSA9IGlzTEUgPyAobkJ5dGVzIC0gMSkgOiAwXG4gIHZhciBkID0gaXNMRSA/IC0xIDogMVxuICB2YXIgcyA9IGJ1ZmZlcltvZmZzZXQgKyBpXVxuXG4gIGkgKz0gZFxuXG4gIGUgPSBzICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIHMgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IGVMZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgZSA9IGUgKiAyNTYgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBtID0gZSAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBlID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBtTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IG0gPSBtICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzXG4gIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkge1xuICAgIHJldHVybiBtID8gTmFOIDogKChzID8gLTEgOiAxKSAqIEluZmluaXR5KVxuICB9IGVsc2Uge1xuICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbilcbiAgICBlID0gZSAtIGVCaWFzXG4gIH1cbiAgcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBNYXRoLnBvdygyLCBlIC0gbUxlbilcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlIChidWZmZXIsIHZhbHVlLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbSwgY1xuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIHJ0ID0gKG1MZW4gPT09IDIzID8gTWF0aC5wb3coMiwgLTI0KSAtIE1hdGgucG93KDIsIC03NykgOiAwKVxuICB2YXIgaSA9IGlzTEUgPyAwIDogKG5CeXRlcyAtIDEpXG4gIHZhciBkID0gaXNMRSA/IDEgOiAtMVxuICB2YXIgcyA9IHZhbHVlIDwgMCB8fCAodmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCkgPyAxIDogMFxuXG4gIHZhbHVlID0gTWF0aC5hYnModmFsdWUpXG5cbiAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpIHtcbiAgICBtID0gaXNOYU4odmFsdWUpID8gMSA6IDBcbiAgICBlID0gZU1heFxuICB9IGVsc2Uge1xuICAgIGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKVxuICAgIGlmICh2YWx1ZSAqIChjID0gTWF0aC5wb3coMiwgLWUpKSA8IDEpIHtcbiAgICAgIGUtLVxuICAgICAgYyAqPSAyXG4gICAgfVxuICAgIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgdmFsdWUgKz0gcnQgLyBjXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlICs9IHJ0ICogTWF0aC5wb3coMiwgMSAtIGVCaWFzKVxuICAgIH1cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrK1xuICAgICAgYyAvPSAyXG4gICAgfVxuXG4gICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XG4gICAgICBtID0gMFxuICAgICAgZSA9IGVNYXhcbiAgICB9IGVsc2UgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICBtID0gKHZhbHVlICogYyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSBlICsgZUJpYXNcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHZhbHVlICogTWF0aC5wb3coMiwgZUJpYXMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gMFxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBtTGVuID49IDg7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IG0gJiAweGZmLCBpICs9IGQsIG0gLz0gMjU2LCBtTGVuIC09IDgpIHt9XG5cbiAgZSA9IChlIDw8IG1MZW4pIHwgbVxuICBlTGVuICs9IG1MZW5cbiAgZm9yICg7IGVMZW4gPiAwOyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBlICYgMHhmZiwgaSArPSBkLCBlIC89IDI1NiwgZUxlbiAtPSA4KSB7fVxuXG4gIGJ1ZmZlcltvZmZzZXQgKyBpIC0gZF0gfD0gcyAqIDEyOFxufVxuIiwgInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5leHBvcnQgZGVmYXVsdCBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIChhcnIpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoYXJyKSA9PSAnW29iamVjdCBBcnJheV0nO1xufTtcbiIsICIvKiFcbiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxmZXJvc3NAZmVyb3NzLm9yZz4gPGh0dHA6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xuXG5cbmltcG9ydCAqIGFzIGJhc2U2NCBmcm9tICcuL2Jhc2U2NCdcbmltcG9ydCAqIGFzIGllZWU3NTQgZnJvbSAnLi9pZWVlNzU0J1xuaW1wb3J0IGlzQXJyYXkgZnJvbSAnLi9pc0FycmF5J1xuXG5leHBvcnQgdmFyIElOU1BFQ1RfTUFYX0JZVEVTID0gNTBcblxuLyoqXG4gKiBJZiBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgOlxuICogICA9PT0gdHJ1ZSAgICBVc2UgVWludDhBcnJheSBpbXBsZW1lbnRhdGlvbiAoZmFzdGVzdClcbiAqICAgPT09IGZhbHNlICAgVXNlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiAobW9zdCBjb21wYXRpYmxlLCBldmVuIElFNilcbiAqXG4gKiBCcm93c2VycyB0aGF0IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGFyZSBJRSAxMCssIEZpcmVmb3ggNCssIENocm9tZSA3KywgU2FmYXJpIDUuMSssXG4gKiBPcGVyYSAxMS42KywgaU9TIDQuMisuXG4gKlxuICogRHVlIHRvIHZhcmlvdXMgYnJvd3NlciBidWdzLCBzb21ldGltZXMgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIHVzZWQgZXZlblxuICogd2hlbiB0aGUgYnJvd3NlciBzdXBwb3J0cyB0eXBlZCBhcnJheXMuXG4gKlxuICogTm90ZTpcbiAqXG4gKiAgIC0gRmlyZWZveCA0LTI5IGxhY2tzIHN1cHBvcnQgZm9yIGFkZGluZyBuZXcgcHJvcGVydGllcyB0byBgVWludDhBcnJheWAgaW5zdGFuY2VzLFxuICogICAgIFNlZTogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk1NDM4LlxuICpcbiAqICAgLSBDaHJvbWUgOS0xMCBpcyBtaXNzaW5nIHRoZSBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uLlxuICpcbiAqICAgLSBJRTEwIGhhcyBhIGJyb2tlbiBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYXJyYXlzIG9mXG4gKiAgICAgaW5jb3JyZWN0IGxlbmd0aCBpbiBzb21lIHNpdHVhdGlvbnMuXG5cbiAqIFdlIGRldGVjdCB0aGVzZSBidWdneSBicm93c2VycyBhbmQgc2V0IGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGAgdG8gYGZhbHNlYCBzbyB0aGV5XG4gKiBnZXQgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaXMgc2xvd2VyIGJ1dCBiZWhhdmVzIGNvcnJlY3RseS5cbiAqL1xuQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgPSBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVCAhPT0gdW5kZWZpbmVkXG4gID8gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgOiB0cnVlXG5cbi8qXG4gKiBFeHBvcnQga01heExlbmd0aCBhZnRlciB0eXBlZCBhcnJheSBzdXBwb3J0IGlzIGRldGVybWluZWQuXG4gKi9cbnZhciBfa01heExlbmd0aCA9IGtNYXhMZW5ndGgoKVxuZXhwb3J0IHtfa01heExlbmd0aCBhcyBrTWF4TGVuZ3RofTtcbmZ1bmN0aW9uIHR5cGVkQXJyYXlTdXBwb3J0ICgpIHtcbiAgcmV0dXJuIHRydWU7XG4gIC8vIHJvbGx1cCBpc3N1ZXNcbiAgLy8gdHJ5IHtcbiAgLy8gICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMSlcbiAgLy8gICBhcnIuX19wcm90b19fID0ge1xuICAvLyAgICAgX19wcm90b19fOiBVaW50OEFycmF5LnByb3RvdHlwZSxcbiAgLy8gICAgIGZvbzogZnVuY3Rpb24gKCkgeyByZXR1cm4gNDIgfVxuICAvLyAgIH1cbiAgLy8gICByZXR1cm4gYXJyLmZvbygpID09PSA0MiAmJiAvLyB0eXBlZCBhcnJheSBpbnN0YW5jZXMgY2FuIGJlIGF1Z21lbnRlZFxuICAvLyAgICAgICB0eXBlb2YgYXJyLnN1YmFycmF5ID09PSAnZnVuY3Rpb24nICYmIC8vIGNocm9tZSA5LTEwIGxhY2sgYHN1YmFycmF5YFxuICAvLyAgICAgICBhcnIuc3ViYXJyYXkoMSwgMSkuYnl0ZUxlbmd0aCA9PT0gMCAvLyBpZTEwIGhhcyBicm9rZW4gYHN1YmFycmF5YFxuICAvLyB9IGNhdGNoIChlKSB7XG4gIC8vICAgcmV0dXJuIGZhbHNlXG4gIC8vIH1cbn1cblxuZnVuY3Rpb24ga01heExlbmd0aCAoKSB7XG4gIHJldHVybiBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVFxuICAgID8gMHg3ZmZmZmZmZlxuICAgIDogMHgzZmZmZmZmZlxufVxuXG5mdW5jdGlvbiBjcmVhdGVCdWZmZXIgKHRoYXQsIGxlbmd0aCkge1xuICBpZiAoa01heExlbmd0aCgpIDwgbGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgdHlwZWQgYXJyYXkgbGVuZ3RoJylcbiAgfVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSwgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICB0aGF0ID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKVxuICAgIHRoYXQuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrOiBSZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBCdWZmZXIgY2xhc3NcbiAgICBpZiAodGhhdCA9PT0gbnVsbCkge1xuICAgICAgdGhhdCA9IG5ldyBCdWZmZXIobGVuZ3RoKVxuICAgIH1cbiAgICB0aGF0Lmxlbmd0aCA9IGxlbmd0aFxuICB9XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuLyoqXG4gKiBUaGUgQnVmZmVyIGNvbnN0cnVjdG9yIHJldHVybnMgaW5zdGFuY2VzIG9mIGBVaW50OEFycmF5YCB0aGF0IGhhdmUgdGhlaXJcbiAqIHByb3RvdHlwZSBjaGFuZ2VkIHRvIGBCdWZmZXIucHJvdG90eXBlYC4gRnVydGhlcm1vcmUsIGBCdWZmZXJgIGlzIGEgc3ViY2xhc3Mgb2ZcbiAqIGBVaW50OEFycmF5YCwgc28gdGhlIHJldHVybmVkIGluc3RhbmNlcyB3aWxsIGhhdmUgYWxsIHRoZSBub2RlIGBCdWZmZXJgIG1ldGhvZHNcbiAqIGFuZCB0aGUgYFVpbnQ4QXJyYXlgIG1ldGhvZHMuIFNxdWFyZSBicmFja2V0IG5vdGF0aW9uIHdvcmtzIGFzIGV4cGVjdGVkIC0tIGl0XG4gKiByZXR1cm5zIGEgc2luZ2xlIG9jdGV0LlxuICpcbiAqIFRoZSBgVWludDhBcnJheWAgcHJvdG90eXBlIHJlbWFpbnMgdW5tb2RpZmllZC5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gQnVmZmVyIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmICEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlcikpIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIC8vIENvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nT3JPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZydcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIGFsbG9jVW5zYWZlKHRoaXMsIGFyZylcbiAgfVxuICByZXR1cm4gZnJvbSh0aGlzLCBhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnBvb2xTaXplID0gODE5MiAvLyBub3QgdXNlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uXG5cbi8vIFRPRE86IExlZ2FjeSwgbm90IG5lZWRlZCBhbnltb3JlLiBSZW1vdmUgaW4gbmV4dCBtYWpvciB2ZXJzaW9uLlxuQnVmZmVyLl9hdWdtZW50ID0gZnVuY3Rpb24gKGFycikge1xuICBhcnIuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICByZXR1cm4gYXJyXG59XG5cbmZ1bmN0aW9uIGZyb20gKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpXG4gIH1cblxuICByZXR1cm4gZnJvbU9iamVjdCh0aGF0LCB2YWx1ZSlcbn1cblxuLyoqXG4gKiBGdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBCdWZmZXIoYXJnLCBlbmNvZGluZykgYnV0IHRocm93cyBhIFR5cGVFcnJvclxuICogaWYgdmFsdWUgaXMgYSBudW1iZXIuXG4gKiBCdWZmZXIuZnJvbShzdHJbLCBlbmNvZGluZ10pXG4gKiBCdWZmZXIuZnJvbShhcnJheSlcbiAqIEJ1ZmZlci5mcm9tKGJ1ZmZlcilcbiAqIEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyWywgYnl0ZU9mZnNldFssIGxlbmd0aF1dKVxuICoqL1xuQnVmZmVyLmZyb20gPSBmdW5jdGlvbiAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gZnJvbShudWxsLCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5pZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgQnVmZmVyLnByb3RvdHlwZS5fX3Byb3RvX18gPSBVaW50OEFycmF5LnByb3RvdHlwZVxuICBCdWZmZXIuX19wcm90b19fID0gVWludDhBcnJheVxuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnNwZWNpZXMgJiZcbiAgICAgIEJ1ZmZlcltTeW1ib2wuc3BlY2llc10gPT09IEJ1ZmZlcikge1xuICAgIC8vIEZpeCBzdWJhcnJheSgpIGluIEVTMjAxNi4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9wdWxsLzk3XG4gICAgLy8gT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlciwgU3ltYm9sLnNwZWNpZXMsIHtcbiAgICAvLyAgIHZhbHVlOiBudWxsLFxuICAgIC8vICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgLy8gfSlcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRTaXplIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfSBlbHNlIGlmIChzaXplIDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWxsb2MgKHRoYXQsIHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgaWYgKHNpemUgPD0gMCkge1xuICAgIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbiAgfVxuICBpZiAoZmlsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT25seSBwYXkgYXR0ZW50aW9uIHRvIGVuY29kaW5nIGlmIGl0J3MgYSBzdHJpbmcuIFRoaXNcbiAgICAvLyBwcmV2ZW50cyBhY2NpZGVudGFsbHkgc2VuZGluZyBpbiBhIG51bWJlciB0aGF0IHdvdWxkXG4gICAgLy8gYmUgaW50ZXJwcmV0dGVkIGFzIGEgc3RhcnQgb2Zmc2V0LlxuICAgIHJldHVybiB0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnXG4gICAgICA/IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKS5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgICAgOiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSkuZmlsbChmaWxsKVxuICB9XG4gIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiBhbGxvYyhzaXplWywgZmlsbFssIGVuY29kaW5nXV0pXG4gKiovXG5CdWZmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGFsbG9jKG51bGwsIHNpemUsIGZpbGwsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBhbGxvY1Vuc2FmZSAodGhhdCwgc2l6ZSkge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSA8IDAgPyAwIDogY2hlY2tlZChzaXplKSB8IDApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7ICsraSkge1xuICAgICAgdGhhdFtpXSA9IDBcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIEJ1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIFNsb3dCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nICh0aGF0LCBzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnIHx8IGVuY29kaW5nID09PSAnJykge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gIH1cblxuICBpZiAoIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiZW5jb2RpbmdcIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJylcbiAgfVxuXG4gIHZhciBsZW5ndGggPSBieXRlTGVuZ3RoKHN0cmluZywgZW5jb2RpbmcpIHwgMFxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aClcblxuICB2YXIgYWN0dWFsID0gdGhhdC53cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuXG4gIGlmIChhY3R1YWwgIT09IGxlbmd0aCkge1xuICAgIC8vIFdyaXRpbmcgYSBoZXggc3RyaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgd2lsbFxuICAgIC8vIGNhdXNlIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZpcnN0IGludmFsaWQgY2hhcmFjdGVyIHRvIGJlIGlnbm9yZWQuIChlLmcuXG4gICAgLy8gJ2FieHhjZCcgd2lsbCBiZSB0cmVhdGVkIGFzICdhYicpXG4gICAgdGhhdCA9IHRoYXQuc2xpY2UoMCwgYWN0dWFsKVxuICB9XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5TGlrZSAodGhhdCwgYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCA8IDAgPyAwIDogY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIHRoYXRbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUJ1ZmZlciAodGhhdCwgYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICBhcnJheS5ieXRlTGVuZ3RoIC8vIHRoaXMgdGhyb3dzIGlmIGBhcnJheWAgaXMgbm90IGEgdmFsaWQgQXJyYXlCdWZmZXJcblxuICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXFwnb2Zmc2V0XFwnIGlzIG91dCBvZiBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0ICsgKGxlbmd0aCB8fCAwKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcXCdsZW5ndGhcXCcgaXMgb3V0IG9mIGJvdW5kcycpXG4gIH1cblxuICBpZiAoYnl0ZU9mZnNldCA9PT0gdW5kZWZpbmVkICYmIGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSlcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQpXG4gIH0gZWxzZSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IGFycmF5XG4gICAgdGhhdC5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIHRoYXQgPSBmcm9tQXJyYXlMaWtlKHRoYXQsIGFycmF5KVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21PYmplY3QgKHRoYXQsIG9iaikge1xuICBpZiAoaW50ZXJuYWxJc0J1ZmZlcihvYmopKSB7XG4gICAgdmFyIGxlbiA9IGNoZWNrZWQob2JqLmxlbmd0aCkgfCAwXG4gICAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW4pXG5cbiAgICBpZiAodGhhdC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGF0XG4gICAgfVxuXG4gICAgb2JqLmNvcHkodGhhdCwgMCwgMCwgbGVuKVxuICAgIHJldHVybiB0aGF0XG4gIH1cblxuICBpZiAob2JqKSB7XG4gICAgaWYgKCh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIG9iai5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgfHwgJ2xlbmd0aCcgaW4gb2JqKSB7XG4gICAgICBpZiAodHlwZW9mIG9iai5sZW5ndGggIT09ICdudW1iZXInIHx8IGlzbmFuKG9iai5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgMClcbiAgICAgIH1cbiAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKHRoYXQsIG9iailcbiAgICB9XG5cbiAgICBpZiAob2JqLnR5cGUgPT09ICdCdWZmZXInICYmIGlzQXJyYXkob2JqLmRhdGEpKSB7XG4gICAgICByZXR1cm4gZnJvbUFycmF5TGlrZSh0aGF0LCBvYmouZGF0YSlcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCdGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuJylcbn1cblxuZnVuY3Rpb24gY2hlY2tlZCAobGVuZ3RoKSB7XG4gIC8vIE5vdGU6IGNhbm5vdCB1c2UgYGxlbmd0aCA8IGtNYXhMZW5ndGgoKWAgaGVyZSBiZWNhdXNlIHRoYXQgZmFpbHMgd2hlblxuICAvLyBsZW5ndGggaXMgTmFOICh3aGljaCBpcyBvdGhlcndpc2UgY29lcmNlZCB0byB6ZXJvLilcbiAgaWYgKGxlbmd0aCA+PSBrTWF4TGVuZ3RoKCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAnc2l6ZTogMHgnICsga01heExlbmd0aCgpLnRvU3RyaW5nKDE2KSArICcgYnl0ZXMnKVxuICB9XG4gIHJldHVybiBsZW5ndGggfCAwXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBTbG93QnVmZmVyIChsZW5ndGgpIHtcbiAgaWYgKCtsZW5ndGggIT0gbGVuZ3RoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZXFlcWVxXG4gICAgbGVuZ3RoID0gMFxuICB9XG4gIHJldHVybiBCdWZmZXIuYWxsb2MoK2xlbmd0aClcbn1cbkJ1ZmZlci5pc0J1ZmZlciA9IGlzQnVmZmVyO1xuZnVuY3Rpb24gaW50ZXJuYWxJc0J1ZmZlciAoYikge1xuICByZXR1cm4gISEoYiAhPSBudWxsICYmIGIuX2lzQnVmZmVyKVxufVxuXG5CdWZmZXIuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKGEsIGIpIHtcbiAgaWYgKCFpbnRlcm5hbElzQnVmZmVyKGEpIHx8ICFpbnRlcm5hbElzQnVmZmVyKGIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycycpXG4gIH1cblxuICBpZiAoYSA9PT0gYikgcmV0dXJuIDBcblxuICB2YXIgeCA9IGEubGVuZ3RoXG4gIHZhciB5ID0gYi5sZW5ndGhcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXVxuICAgICAgeSA9IGJbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5CdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0IChsaXN0LCBsZW5ndGgpIHtcbiAgaWYgKCFpc0FycmF5KGxpc3QpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBCdWZmZXIuYWxsb2MoMClcbiAgfVxuXG4gIHZhciBpXG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGxlbmd0aCA9IDBcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoXG4gICAgfVxuICB9XG5cbiAgdmFyIGJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShsZW5ndGgpXG4gIHZhciBwb3MgPSAwXG4gIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGJ1ZiA9IGxpc3RbaV1cbiAgICBpZiAoIWludGVybmFsSXNCdWZmZXIoYnVmKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgICB9XG4gICAgYnVmLmNvcHkoYnVmZmVyLCBwb3MpXG4gICAgcG9zICs9IGJ1Zi5sZW5ndGhcbiAgfVxuICByZXR1cm4gYnVmZmVyXG59XG5cbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKGludGVybmFsSXNCdWZmZXIoc3RyaW5nKSkge1xuICAgIHJldHVybiBzdHJpbmcubGVuZ3RoXG4gIH1cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgKEFycmF5QnVmZmVyLmlzVmlldyhzdHJpbmcpIHx8IHN0cmluZyBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSkge1xuICAgIHJldHVybiBzdHJpbmcuYnl0ZUxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuICAgIHN0cmluZyA9ICcnICsgc3RyaW5nXG4gIH1cblxuICB2YXIgbGVuID0gc3RyaW5nLmxlbmd0aFxuICBpZiAobGVuID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIFVzZSBhIGZvciBsb29wIHRvIGF2b2lkIHJlY3Vyc2lvblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsZW5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIGxlbiAqIDJcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBsZW4gPj4+IDFcbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aCAvLyBhc3N1bWUgdXRmOFxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuQnVmZmVyLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5cbmZ1bmN0aW9uIHNsb3dUb1N0cmluZyAoZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcblxuICAvLyBObyBuZWVkIHRvIHZlcmlmeSB0aGF0IFwidGhpcy5sZW5ndGggPD0gTUFYX1VJTlQzMlwiIHNpbmNlIGl0J3MgYSByZWFkLW9ubHlcbiAgLy8gcHJvcGVydHkgb2YgYSB0eXBlZCBhcnJheS5cblxuICAvLyBUaGlzIGJlaGF2ZXMgbmVpdGhlciBsaWtlIFN0cmluZyBub3IgVWludDhBcnJheSBpbiB0aGF0IHdlIHNldCBzdGFydC9lbmRcbiAgLy8gdG8gdGhlaXIgdXBwZXIvbG93ZXIgYm91bmRzIGlmIHRoZSB2YWx1ZSBwYXNzZWQgaXMgb3V0IG9mIHJhbmdlLlxuICAvLyB1bmRlZmluZWQgaXMgaGFuZGxlZCBzcGVjaWFsbHkgYXMgcGVyIEVDTUEtMjYyIDZ0aCBFZGl0aW9uLFxuICAvLyBTZWN0aW9uIDEzLjMuMy43IFJ1bnRpbWUgU2VtYW50aWNzOiBLZXllZEJpbmRpbmdJbml0aWFsaXphdGlvbi5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQgfHwgc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgLy8gUmV0dXJuIGVhcmx5IGlmIHN0YXJ0ID4gdGhpcy5sZW5ndGguIERvbmUgaGVyZSB0byBwcmV2ZW50IHBvdGVudGlhbCB1aW50MzJcbiAgLy8gY29lcmNpb24gZmFpbCBiZWxvdy5cbiAgaWYgKHN0YXJ0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCB8fCBlbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoZW5kIDw9IDApIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIC8vIEZvcmNlIGNvZXJzaW9uIHRvIHVpbnQzMi4gVGhpcyB3aWxsIGFsc28gY29lcmNlIGZhbHNleS9OYU4gdmFsdWVzIHRvIDAuXG4gIGVuZCA+Pj49IDBcbiAgc3RhcnQgPj4+PSAwXG5cbiAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGF0aW4xU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1dGYxNmxlU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKGVuY29kaW5nICsgJycpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbi8vIFRoZSBwcm9wZXJ0eSBpcyB1c2VkIGJ5IGBCdWZmZXIuaXNCdWZmZXJgIGFuZCBgaXMtYnVmZmVyYCAoaW4gU2FmYXJpIDUtNykgdG8gZGV0ZWN0XG4vLyBCdWZmZXIgaW5zdGFuY2VzLlxuQnVmZmVyLnByb3RvdHlwZS5faXNCdWZmZXIgPSB0cnVlXG5cbmZ1bmN0aW9uIHN3YXAgKGIsIG4sIG0pIHtcbiAgdmFyIGkgPSBiW25dXG4gIGJbbl0gPSBiW21dXG4gIGJbbV0gPSBpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDE2ID0gZnVuY3Rpb24gc3dhcDE2ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSAyICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSAyKSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgMSlcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAzMiA9IGZ1bmN0aW9uIHN3YXAzMiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgNCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDMpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDIpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwNjQgPSBmdW5jdGlvbiBzd2FwNjQgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDggIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDgpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyA3KVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyA2KVxuICAgIHN3YXAodGhpcywgaSArIDIsIGkgKyA1KVxuICAgIHN3YXAodGhpcywgaSArIDMsIGkgKyA0KVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoKSB7XG4gIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aCB8IDBcbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuICcnXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIDAsIGxlbmd0aClcbiAgcmV0dXJuIHNsb3dUb1N0cmluZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzIChiKSB7XG4gIGlmICghaW50ZXJuYWxJc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIGlmICh0aGlzID09PSBiKSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYikgPT09IDBcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gIHZhciBzdHIgPSAnJ1xuICB2YXIgbWF4ID0gSU5TUEVDVF9NQVhfQllURVNcbiAgaWYgKHRoaXMubGVuZ3RoID4gMCkge1xuICAgIHN0ciA9IHRoaXMudG9TdHJpbmcoJ2hleCcsIDAsIG1heCkubWF0Y2goLy57Mn0vZykuam9pbignICcpXG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbWF4KSBzdHIgKz0gJyAuLi4gJ1xuICB9XG4gIHJldHVybiAnPEJ1ZmZlciAnICsgc3RyICsgJz4nXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKHRhcmdldCwgc3RhcnQsIGVuZCwgdGhpc1N0YXJ0LCB0aGlzRW5kKSB7XG4gIGlmICghaW50ZXJuYWxJc0J1ZmZlcih0YXJnZXQpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIH1cblxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuZCA9IHRhcmdldCA/IHRhcmdldC5sZW5ndGggOiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc1N0YXJ0ID0gMFxuICB9XG4gIGlmICh0aGlzRW5kID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzRW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChzdGFydCA8IDAgfHwgZW5kID4gdGFyZ2V0Lmxlbmd0aCB8fCB0aGlzU3RhcnQgPCAwIHx8IHRoaXNFbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdvdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICB9XG5cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kICYmIHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kKSB7XG4gICAgcmV0dXJuIC0xXG4gIH1cbiAgaWYgKHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAxXG4gIH1cblxuICBzdGFydCA+Pj49IDBcbiAgZW5kID4+Pj0gMFxuICB0aGlzU3RhcnQgPj4+PSAwXG4gIHRoaXNFbmQgPj4+PSAwXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCkgcmV0dXJuIDBcblxuICB2YXIgeCA9IHRoaXNFbmQgLSB0aGlzU3RhcnRcbiAgdmFyIHkgPSBlbmQgLSBzdGFydFxuICB2YXIgbGVuID0gTWF0aC5taW4oeCwgeSlcblxuICB2YXIgdGhpc0NvcHkgPSB0aGlzLnNsaWNlKHRoaXNTdGFydCwgdGhpc0VuZClcbiAgdmFyIHRhcmdldENvcHkgPSB0YXJnZXQuc2xpY2Uoc3RhcnQsIGVuZClcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKHRoaXNDb3B5W2ldICE9PSB0YXJnZXRDb3B5W2ldKSB7XG4gICAgICB4ID0gdGhpc0NvcHlbaV1cbiAgICAgIHkgPSB0YXJnZXRDb3B5W2ldXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuLy8gRmluZHMgZWl0aGVyIHRoZSBmaXJzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPj0gYGJ5dGVPZmZzZXRgLFxuLy8gT1IgdGhlIGxhc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0IDw9IGBieXRlT2Zmc2V0YC5cbi8vXG4vLyBBcmd1bWVudHM6XG4vLyAtIGJ1ZmZlciAtIGEgQnVmZmVyIHRvIHNlYXJjaFxuLy8gLSB2YWwgLSBhIHN0cmluZywgQnVmZmVyLCBvciBudW1iZXJcbi8vIC0gYnl0ZU9mZnNldCAtIGFuIGluZGV4IGludG8gYGJ1ZmZlcmA7IHdpbGwgYmUgY2xhbXBlZCB0byBhbiBpbnQzMlxuLy8gLSBlbmNvZGluZyAtIGFuIG9wdGlvbmFsIGVuY29kaW5nLCByZWxldmFudCBpcyB2YWwgaXMgYSBzdHJpbmdcbi8vIC0gZGlyIC0gdHJ1ZSBmb3IgaW5kZXhPZiwgZmFsc2UgZm9yIGxhc3RJbmRleE9mXG5mdW5jdGlvbiBiaWRpcmVjdGlvbmFsSW5kZXhPZiAoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgLy8gRW1wdHkgYnVmZmVyIG1lYW5zIG5vIG1hdGNoXG4gIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSByZXR1cm4gLTFcblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldFxuICBpZiAodHlwZW9mIGJ5dGVPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBieXRlT2Zmc2V0XG4gICAgYnl0ZU9mZnNldCA9IDBcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0ID4gMHg3ZmZmZmZmZikge1xuICAgIGJ5dGVPZmZzZXQgPSAweDdmZmZmZmZmXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IC0weDgwMDAwMDAwKSB7XG4gICAgYnl0ZU9mZnNldCA9IC0weDgwMDAwMDAwXG4gIH1cbiAgYnl0ZU9mZnNldCA9ICtieXRlT2Zmc2V0ICAvLyBDb2VyY2UgdG8gTnVtYmVyLlxuICBpZiAoaXNOYU4oYnl0ZU9mZnNldCkpIHtcbiAgICAvLyBieXRlT2Zmc2V0OiBpdCBpdCdzIHVuZGVmaW5lZCwgbnVsbCwgTmFOLCBcImZvb1wiLCBldGMsIHNlYXJjaCB3aG9sZSBidWZmZXJcbiAgICBieXRlT2Zmc2V0ID0gZGlyID8gMCA6IChidWZmZXIubGVuZ3RoIC0gMSlcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0OiBuZWdhdGl2ZSBvZmZzZXRzIHN0YXJ0IGZyb20gdGhlIGVuZCBvZiB0aGUgYnVmZmVyXG4gIGlmIChieXRlT2Zmc2V0IDwgMCkgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggKyBieXRlT2Zmc2V0XG4gIGlmIChieXRlT2Zmc2V0ID49IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICBpZiAoZGlyKSByZXR1cm4gLTFcbiAgICBlbHNlIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoIC0gMVxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAwKSB7XG4gICAgaWYgKGRpcikgYnl0ZU9mZnNldCA9IDBcbiAgICBlbHNlIHJldHVybiAtMVxuICB9XG5cbiAgLy8gTm9ybWFsaXplIHZhbFxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICB2YWwgPSBCdWZmZXIuZnJvbSh2YWwsIGVuY29kaW5nKVxuICB9XG5cbiAgLy8gRmluYWxseSwgc2VhcmNoIGVpdGhlciBpbmRleE9mIChpZiBkaXIgaXMgdHJ1ZSkgb3IgbGFzdEluZGV4T2ZcbiAgaWYgKGludGVybmFsSXNCdWZmZXIodmFsKSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nL2J1ZmZlciBhbHdheXMgZmFpbHNcbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAweEZGIC8vIFNlYXJjaCBmb3IgYSBieXRlIHZhbHVlIFswLTI1NV1cbiAgICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiZcbiAgICAgICAgdHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmIChkaXIpIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgWyB2YWwgXSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlcicpXG59XG5cbmZ1bmN0aW9uIGFycmF5SW5kZXhPZiAoYXJyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgdmFyIGluZGV4U2l6ZSA9IDFcbiAgdmFyIGFyckxlbmd0aCA9IGFyci5sZW5ndGhcbiAgdmFyIHZhbExlbmd0aCA9IHZhbC5sZW5ndGhcblxuICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgaWYgKGVuY29kaW5nID09PSAndWNzMicgfHwgZW5jb2RpbmcgPT09ICd1Y3MtMicgfHxcbiAgICAgICAgZW5jb2RpbmcgPT09ICd1dGYxNmxlJyB8fCBlbmNvZGluZyA9PT0gJ3V0Zi0xNmxlJykge1xuICAgICAgaWYgKGFyci5sZW5ndGggPCAyIHx8IHZhbC5sZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfVxuICAgICAgaW5kZXhTaXplID0gMlxuICAgICAgYXJyTGVuZ3RoIC89IDJcbiAgICAgIHZhbExlbmd0aCAvPSAyXG4gICAgICBieXRlT2Zmc2V0IC89IDJcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWFkIChidWYsIGkpIHtcbiAgICBpZiAoaW5kZXhTaXplID09PSAxKSB7XG4gICAgICByZXR1cm4gYnVmW2ldXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidWYucmVhZFVJbnQxNkJFKGkgKiBpbmRleFNpemUpXG4gICAgfVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGRpcikge1xuICAgIHZhciBmb3VuZEluZGV4ID0gLTFcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpIDwgYXJyTGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChyZWFkKGFyciwgaSkgPT09IHJlYWQodmFsLCBmb3VuZEluZGV4ID09PSAtMSA/IDAgOiBpIC0gZm91bmRJbmRleCkpIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKSBmb3VuZEluZGV4ID0gaVxuICAgICAgICBpZiAoaSAtIGZvdW5kSW5kZXggKyAxID09PSB2YWxMZW5ndGgpIHJldHVybiBmb3VuZEluZGV4ICogaW5kZXhTaXplXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZm91bmRJbmRleCAhPT0gLTEpIGkgLT0gaSAtIGZvdW5kSW5kZXhcbiAgICAgICAgZm91bmRJbmRleCA9IC0xXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChieXRlT2Zmc2V0ICsgdmFsTGVuZ3RoID4gYXJyTGVuZ3RoKSBieXRlT2Zmc2V0ID0gYXJyTGVuZ3RoIC0gdmFsTGVuZ3RoXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBmb3VuZCA9IHRydWVcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmFsTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKHJlYWQoYXJyLCBpICsgaikgIT09IHJlYWQodmFsLCBqKSkge1xuICAgICAgICAgIGZvdW5kID0gZmFsc2VcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZm91bmQpIHJldHVybiBpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gdGhpcy5pbmRleE9mKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpICE9PSAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCB0cnVlKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmxhc3RJbmRleE9mID0gZnVuY3Rpb24gbGFzdEluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGZhbHNlKVxufVxuXG5mdW5jdGlvbiBoZXhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIG9mZnNldCA9IE51bWJlcihvZmZzZXQpIHx8IDBcbiAgdmFyIHJlbWFpbmluZyA9IGJ1Zi5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKVxuICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICAgIH1cbiAgfVxuXG4gIC8vIG11c3QgYmUgYW4gZXZlbiBudW1iZXIgb2YgZGlnaXRzXG4gIHZhciBzdHJMZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGlmIChzdHJMZW4gJSAyICE9PSAwKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGhleCBzdHJpbmcnKVxuXG4gIGlmIChsZW5ndGggPiBzdHJMZW4gLyAyKSB7XG4gICAgbGVuZ3RoID0gc3RyTGVuIC8gMlxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KVxuICAgIGlmIChpc05hTihwYXJzZWQpKSByZXR1cm4gaVxuICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHBhcnNlZFxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIHV0ZjhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjhUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGFzY2lpV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihhc2NpaVRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gbGF0aW4xV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYXNjaWlXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGJhc2U2NFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYmFzZTY0VG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiB1Y3MyV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGYxNmxlVG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gd3JpdGUgKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKSB7XG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcpXG4gIGlmIChvZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBvZmZzZXRcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgb2Zmc2V0WywgbGVuZ3RoXVssIGVuY29kaW5nXSlcbiAgfSBlbHNlIGlmIChpc0Zpbml0ZShvZmZzZXQpKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICBsZW5ndGggPSBsZW5ndGggfCAwXG4gICAgICBpZiAoZW5jb2RpbmcgPT09IHVuZGVmaW5lZCkgZW5jb2RpbmcgPSAndXRmOCdcbiAgICB9IGVsc2Uge1xuICAgICAgZW5jb2RpbmcgPSBsZW5ndGhcbiAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZFxuICAgIH1cbiAgLy8gbGVnYWN5IHdyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldCwgbGVuZ3RoKSAtIHJlbW92ZSBpbiB2MC4xM1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCdcbiAgICApXG4gIH1cblxuICB2YXIgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IGxlbmd0aCA+IHJlbWFpbmluZykgbGVuZ3RoID0gcmVtYWluaW5nXG5cbiAgaWYgKChzdHJpbmcubGVuZ3RoID4gMCAmJiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwKSkgfHwgb2Zmc2V0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsYXRpbjFXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAvLyBXYXJuaW5nOiBtYXhMZW5ndGggbm90IHRha2VuIGludG8gYWNjb3VudCBpbiBiYXNlNjRXcml0ZVxuICAgICAgICByZXR1cm4gYmFzZTY0V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHVjczJXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04gKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdCdWZmZXInLFxuICAgIGRhdGE6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2FyciB8fCB0aGlzLCAwKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gYnVmLmxlbmd0aCkge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1Zi5zbGljZShzdGFydCwgZW5kKSlcbiAgfVxufVxuXG5mdW5jdGlvbiB1dGY4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG4gIHZhciByZXMgPSBbXVxuXG4gIHZhciBpID0gc3RhcnRcbiAgd2hpbGUgKGkgPCBlbmQpIHtcbiAgICB2YXIgZmlyc3RCeXRlID0gYnVmW2ldXG4gICAgdmFyIGNvZGVQb2ludCA9IG51bGxcbiAgICB2YXIgYnl0ZXNQZXJTZXF1ZW5jZSA9IChmaXJzdEJ5dGUgPiAweEVGKSA/IDRcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4REYpID8gM1xuICAgICAgOiAoZmlyc3RCeXRlID4gMHhCRikgPyAyXG4gICAgICA6IDFcblxuICAgIGlmIChpICsgYnl0ZXNQZXJTZXF1ZW5jZSA8PSBlbmQpIHtcbiAgICAgIHZhciBzZWNvbmRCeXRlLCB0aGlyZEJ5dGUsIGZvdXJ0aEJ5dGUsIHRlbXBDb2RlUG9pbnRcblxuICAgICAgc3dpdGNoIChieXRlc1BlclNlcXVlbmNlKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBpZiAoZmlyc3RCeXRlIDwgMHg4MCkge1xuICAgICAgICAgICAgY29kZVBvaW50ID0gZmlyc3RCeXRlXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4MUYpIDw8IDB4NiB8IChzZWNvbmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3Rikge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweEMgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4NiB8ICh0aGlyZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGRiAmJiAodGVtcENvZGVQb2ludCA8IDB4RDgwMCB8fCB0ZW1wQ29kZVBvaW50ID4gMHhERkZGKSkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBmb3VydGhCeXRlID0gYnVmW2kgKyAzXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAoZm91cnRoQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHgxMiB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHhDIHwgKHRoaXJkQnl0ZSAmIDB4M0YpIDw8IDB4NiB8IChmb3VydGhCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHhGRkZGICYmIHRlbXBDb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2RlUG9pbnQgPT09IG51bGwpIHtcbiAgICAgIC8vIHdlIGRpZCBub3QgZ2VuZXJhdGUgYSB2YWxpZCBjb2RlUG9pbnQgc28gaW5zZXJ0IGFcbiAgICAgIC8vIHJlcGxhY2VtZW50IGNoYXIgKFUrRkZGRCkgYW5kIGFkdmFuY2Ugb25seSAxIGJ5dGVcbiAgICAgIGNvZGVQb2ludCA9IDB4RkZGRFxuICAgICAgYnl0ZXNQZXJTZXF1ZW5jZSA9IDFcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA+IDB4RkZGRikge1xuICAgICAgLy8gZW5jb2RlIHRvIHV0ZjE2IChzdXJyb2dhdGUgcGFpciBkYW5jZSlcbiAgICAgIGNvZGVQb2ludCAtPSAweDEwMDAwXG4gICAgICByZXMucHVzaChjb2RlUG9pbnQgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApXG4gICAgICBjb2RlUG9pbnQgPSAweERDMDAgfCBjb2RlUG9pbnQgJiAweDNGRlxuICAgIH1cblxuICAgIHJlcy5wdXNoKGNvZGVQb2ludClcbiAgICBpICs9IGJ5dGVzUGVyU2VxdWVuY2VcbiAgfVxuXG4gIHJldHVybiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkocmVzKVxufVxuXG4vLyBCYXNlZCBvbiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMjc0NzI3Mi82ODA3NDIsIHRoZSBicm93c2VyIHdpdGhcbi8vIHRoZSBsb3dlc3QgbGltaXQgaXMgQ2hyb21lLCB3aXRoIDB4MTAwMDAgYXJncy5cbi8vIFdlIGdvIDEgbWFnbml0dWRlIGxlc3MsIGZvciBzYWZldHlcbnZhciBNQVhfQVJHVU1FTlRTX0xFTkdUSCA9IDB4MTAwMFxuXG5mdW5jdGlvbiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkgKGNvZGVQb2ludHMpIHtcbiAgdmFyIGxlbiA9IGNvZGVQb2ludHMubGVuZ3RoXG4gIGlmIChsZW4gPD0gTUFYX0FSR1VNRU5UU19MRU5HVEgpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNvZGVQb2ludHMpIC8vIGF2b2lkIGV4dHJhIHNsaWNlKClcbiAgfVxuXG4gIC8vIERlY29kZSBpbiBjaHVua3MgdG8gYXZvaWQgXCJjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIi5cbiAgdmFyIHJlcyA9ICcnXG4gIHZhciBpID0gMFxuICB3aGlsZSAoaSA8IGxlbikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFxuICAgICAgU3RyaW5nLFxuICAgICAgY29kZVBvaW50cy5zbGljZShpLCBpICs9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKVxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldICYgMHg3RilcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGxhdGluMVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGhleFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGhcblxuICBpZiAoIXN0YXJ0IHx8IHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIGlmICghZW5kIHx8IGVuZCA8IDAgfHwgZW5kID4gbGVuKSBlbmQgPSBsZW5cblxuICB2YXIgb3V0ID0gJydcbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICBvdXQgKz0gdG9IZXgoYnVmW2ldKVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGJ5dGVzID0gYnVmLnNsaWNlKHN0YXJ0LCBlbmQpXG4gIHZhciByZXMgPSAnJ1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0gKyBieXRlc1tpICsgMV0gKiAyNTYpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIHN0YXJ0ID0gfn5zdGFydFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IH5+ZW5kXG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ICs9IGxlblxuICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMFxuICB9IGVsc2UgaWYgKHN0YXJ0ID4gbGVuKSB7XG4gICAgc3RhcnQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IGxlblxuICAgIGlmIChlbmQgPCAwKSBlbmQgPSAwXG4gIH0gZWxzZSBpZiAoZW5kID4gbGVuKSB7XG4gICAgZW5kID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgdmFyIG5ld0J1ZlxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBuZXdCdWYgPSB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpXG4gICAgbmV3QnVmLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2xpY2VMZW4gPSBlbmQgLSBzdGFydFxuICAgIG5ld0J1ZiA9IG5ldyBCdWZmZXIoc2xpY2VMZW4sIHVuZGVmaW5lZClcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWNlTGVuOyArK2kpIHtcbiAgICAgIG5ld0J1ZltpXSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdCdWZcbn1cblxuLypcbiAqIE5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYnVmZmVyIGlzbid0IHRyeWluZyB0byB3cml0ZSBvdXQgb2YgYm91bmRzLlxuICovXG5mdW5jdGlvbiBjaGVja09mZnNldCAob2Zmc2V0LCBleHQsIGxlbmd0aCkge1xuICBpZiAoKG9mZnNldCAlIDEpICE9PSAwIHx8IG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdvZmZzZXQgaXMgbm90IHVpbnQnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gbGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRMRSA9IGZ1bmN0aW9uIHJlYWRVSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRCRSA9IGZ1bmN0aW9uIHJlYWRVSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG4gIH1cblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdXG4gIHZhciBtdWwgPSAxXG4gIHdoaWxlIChieXRlTGVuZ3RoID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDggPSBmdW5jdGlvbiByZWFkVUludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkUgPSBmdW5jdGlvbiByZWFkVUludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgOCkgfCB0aGlzW29mZnNldCArIDFdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkxFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICgodGhpc1tvZmZzZXRdKSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikpICtcbiAgICAgICh0aGlzW29mZnNldCArIDNdICogMHgxMDAwMDAwKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdICogMHgxMDAwMDAwKSArXG4gICAgKCh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgIHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludExFID0gZnVuY3Rpb24gcmVhZEludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludEJFID0gZnVuY3Rpb24gcmVhZEludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoXG4gIHZhciBtdWwgPSAxXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0taV1cbiAgd2hpbGUgKGkgPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1pXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDggPSBmdW5jdGlvbiByZWFkSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICBpZiAoISh0aGlzW29mZnNldF0gJiAweDgwKSkgcmV0dXJuICh0aGlzW29mZnNldF0pXG4gIHJldHVybiAoKDB4ZmYgLSB0aGlzW29mZnNldF0gKyAxKSAqIC0xKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIDFdIHwgKHRoaXNbb2Zmc2V0XSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiByZWFkSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdKSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10gPDwgMjQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyQkUgPSBmdW5jdGlvbiByZWFkSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDI0KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0TEUgPSBmdW5jdGlvbiByZWFkRmxvYXRMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0QkUgPSBmdW5jdGlvbiByZWFkRmxvYXRCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgNTIsIDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUJFID0gZnVuY3Rpb24gcmVhZERvdWJsZUJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgNTIsIDgpXG59XG5cbmZ1bmN0aW9uIGNoZWNrSW50IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKCFpbnRlcm5hbElzQnVmZmVyKGJ1ZikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiYnVmZmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpXG4gIGlmICh2YWx1ZSA+IG1heCB8fCB2YWx1ZSA8IG1pbikgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1widmFsdWVcIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludExFID0gZnVuY3Rpb24gd3JpdGVVSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludEJFID0gZnVuY3Rpb24gd3JpdGVVSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDggPSBmdW5jdGlvbiB3cml0ZVVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4ZmYsIDApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSlcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuZnVuY3Rpb24gb2JqZWN0V3JpdGVVSW50MTYgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuKSB7XG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmICsgdmFsdWUgKyAxXG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgMik7IGkgPCBqOyArK2kpIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgJiAoMHhmZiA8PCAoOCAqIChsaXR0bGVFbmRpYW4gPyBpIDogMSAtIGkpKSkpID4+PlxuICAgICAgKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkgKiA4XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuZnVuY3Rpb24gb2JqZWN0V3JpdGVVSW50MzIgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuKSB7XG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBvZmZzZXQsIDQpOyBpIDwgajsgKytpKSB7XG4gICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlID4+PiAobGl0dGxlRW5kaWFuID8gaSA6IDMgLSBpKSAqIDgpICYgMHhmZlxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludExFID0gZnVuY3Rpb24gd3JpdGVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGggLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICB2YXIgaSA9IDBcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpIC0gMV0gIT09IDApIHtcbiAgICAgIHN1YiA9IDFcbiAgICB9XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludEJFID0gZnVuY3Rpb24gd3JpdGVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGggLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpICsgMV0gIT09IDApIHtcbiAgICAgIHN1YiA9IDFcbiAgICB9XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDggPSBmdW5jdGlvbiB3cml0ZUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHg3ZiwgLTB4ODApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSlcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmICsgdmFsdWUgKyAxXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbmZ1bmN0aW9uIGNoZWNrSUVFRTc1NCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbiAgaWYgKG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5mdW5jdGlvbiB3cml0ZUZsb2F0IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDQsIDMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgsIC0zLjQwMjgyMzQ2NjM4NTI4ODZlKzM4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDIzLCA0KVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRMRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdEJFID0gZnVuY3Rpb24gd3JpdGVGbG9hdEJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRG91YmxlIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDgsIDEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4LCAtMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgNTIsIDgpXG4gIHJldHVybiBvZmZzZXQgKyA4XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVMRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUJFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuLy8gY29weSh0YXJnZXRCdWZmZXIsIHRhcmdldFN0YXJ0PTAsIHNvdXJjZVN0YXJ0PTAsIHNvdXJjZUVuZD1idWZmZXIubGVuZ3RoKVxuQnVmZmVyLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gY29weSAodGFyZ2V0LCB0YXJnZXRTdGFydCwgc3RhcnQsIGVuZCkge1xuICBpZiAoIXN0YXJ0KSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgJiYgZW5kICE9PSAwKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0U3RhcnQgPj0gdGFyZ2V0Lmxlbmd0aCkgdGFyZ2V0U3RhcnQgPSB0YXJnZXQubGVuZ3RoXG4gIGlmICghdGFyZ2V0U3RhcnQpIHRhcmdldFN0YXJ0ID0gMFxuICBpZiAoZW5kID4gMCAmJiBlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICAvLyBDb3B5IDAgYnl0ZXM7IHdlJ3JlIGRvbmVcbiAgaWYgKGVuZCA9PT0gc3RhcnQpIHJldHVybiAwXG4gIGlmICh0YXJnZXQubGVuZ3RoID09PSAwIHx8IHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIEZhdGFsIGVycm9yIGNvbmRpdGlvbnNcbiAgaWYgKHRhcmdldFN0YXJ0IDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgfVxuICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlU3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChlbmQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlRW5kIG91dCBvZiBib3VuZHMnKVxuXG4gIC8vIEFyZSB3ZSBvb2I/XG4gIGlmIChlbmQgPiB0aGlzLmxlbmd0aCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCA8IGVuZCAtIHN0YXJ0KSB7XG4gICAgZW5kID0gdGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0ICsgc3RhcnRcbiAgfVxuXG4gIHZhciBsZW4gPSBlbmQgLSBzdGFydFxuICB2YXIgaVxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQgJiYgc3RhcnQgPCB0YXJnZXRTdGFydCAmJiB0YXJnZXRTdGFydCA8IGVuZCkge1xuICAgIC8vIGRlc2NlbmRpbmcgY29weSBmcm9tIGVuZFxuICAgIGZvciAoaSA9IGxlbiAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfSBlbHNlIGlmIChsZW4gPCAxMDAwIHx8ICFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIGFzY2VuZGluZyBjb3B5IGZyb20gc3RhcnRcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKFxuICAgICAgdGFyZ2V0LFxuICAgICAgdGhpcy5zdWJhcnJheShzdGFydCwgc3RhcnQgKyBsZW4pLFxuICAgICAgdGFyZ2V0U3RhcnRcbiAgICApXG4gIH1cblxuICByZXR1cm4gbGVuXG59XG5cbi8vIFVzYWdlOlxuLy8gICAgYnVmZmVyLmZpbGwobnVtYmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChidWZmZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKHN0cmluZ1ssIG9mZnNldFssIGVuZF1dWywgZW5jb2RpbmddKVxuQnVmZmVyLnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gZmlsbCAodmFsLCBzdGFydCwgZW5kLCBlbmNvZGluZykge1xuICAvLyBIYW5kbGUgc3RyaW5nIGNhc2VzOlxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAodHlwZW9mIHN0YXJ0ID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBzdGFydFxuICAgICAgc3RhcnQgPSAwXG4gICAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGVuZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gZW5kXG4gICAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICAgIH1cbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdmFyIGNvZGUgPSB2YWwuY2hhckNvZGVBdCgwKVxuICAgICAgaWYgKGNvZGUgPCAyNTYpIHtcbiAgICAgICAgdmFsID0gY29kZVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nJylcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycgJiYgIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHZhbCA9IHZhbCAmIDI1NVxuICB9XG5cbiAgLy8gSW52YWxpZCByYW5nZXMgYXJlIG5vdCBzZXQgdG8gYSBkZWZhdWx0LCBzbyBjYW4gcmFuZ2UgY2hlY2sgZWFybHkuXG4gIGlmIChzdGFydCA8IDAgfHwgdGhpcy5sZW5ndGggPCBzdGFydCB8fCB0aGlzLmxlbmd0aCA8IGVuZCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdPdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICB9XG5cbiAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBzdGFydCA9IHN0YXJ0ID4+PiAwXG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gdGhpcy5sZW5ndGggOiBlbmQgPj4+IDBcblxuICBpZiAoIXZhbCkgdmFsID0gMFxuXG4gIHZhciBpXG4gIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICAgIHRoaXNbaV0gPSB2YWxcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGJ5dGVzID0gaW50ZXJuYWxJc0J1ZmZlcih2YWwpXG4gICAgICA/IHZhbFxuICAgICAgOiB1dGY4VG9CeXRlcyhuZXcgQnVmZmVyKHZhbCwgZW5jb2RpbmcpLnRvU3RyaW5nKCkpXG4gICAgdmFyIGxlbiA9IGJ5dGVzLmxlbmd0aFxuICAgIGZvciAoaSA9IDA7IGkgPCBlbmQgLSBzdGFydDsgKytpKSB7XG4gICAgICB0aGlzW2kgKyBzdGFydF0gPSBieXRlc1tpICUgbGVuXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbi8vIEhFTFBFUiBGVU5DVElPTlNcbi8vID09PT09PT09PT09PT09PT1cblxudmFyIElOVkFMSURfQkFTRTY0X1JFID0gL1teK1xcLzAtOUEtWmEtei1fXS9nXG5cbmZ1bmN0aW9uIGJhc2U2NGNsZWFuIChzdHIpIHtcbiAgLy8gTm9kZSBzdHJpcHMgb3V0IGludmFsaWQgY2hhcmFjdGVycyBsaWtlIFxcbiBhbmQgXFx0IGZyb20gdGhlIHN0cmluZywgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHN0ciA9IHN0cmluZ3RyaW0oc3RyKS5yZXBsYWNlKElOVkFMSURfQkFTRTY0X1JFLCAnJylcbiAgLy8gTm9kZSBjb252ZXJ0cyBzdHJpbmdzIHdpdGggbGVuZ3RoIDwgMiB0byAnJ1xuICBpZiAoc3RyLmxlbmd0aCA8IDIpIHJldHVybiAnJ1xuICAvLyBOb2RlIGFsbG93cyBmb3Igbm9uLXBhZGRlZCBiYXNlNjQgc3RyaW5ncyAobWlzc2luZyB0cmFpbGluZyA9PT0pLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgd2hpbGUgKHN0ci5sZW5ndGggJSA0ICE9PSAwKSB7XG4gICAgc3RyID0gc3RyICsgJz0nXG4gIH1cbiAgcmV0dXJuIHN0clxufVxuXG5mdW5jdGlvbiBzdHJpbmd0cmltIChzdHIpIHtcbiAgaWYgKHN0ci50cmltKSByZXR1cm4gc3RyLnRyaW0oKVxuICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMrfFxccyskL2csICcnKVxufVxuXG5mdW5jdGlvbiB0b0hleCAobikge1xuICBpZiAobiA8IDE2KSByZXR1cm4gJzAnICsgbi50b1N0cmluZygxNilcbiAgcmV0dXJuIG4udG9TdHJpbmcoMTYpXG59XG5cbmZ1bmN0aW9uIHV0ZjhUb0J5dGVzIChzdHJpbmcsIHVuaXRzKSB7XG4gIHVuaXRzID0gdW5pdHMgfHwgSW5maW5pdHlcbiAgdmFyIGNvZGVQb2ludFxuICB2YXIgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aFxuICB2YXIgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcbiAgdmFyIGJ5dGVzID0gW11cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgY29kZVBvaW50ID0gc3RyaW5nLmNoYXJDb2RlQXQoaSlcblxuICAgIC8vIGlzIHN1cnJvZ2F0ZSBjb21wb25lbnRcbiAgICBpZiAoY29kZVBvaW50ID4gMHhEN0ZGICYmIGNvZGVQb2ludCA8IDB4RTAwMCkge1xuICAgICAgLy8gbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICghbGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgICAvLyBubyBsZWFkIHlldFxuICAgICAgICBpZiAoY29kZVBvaW50ID4gMHhEQkZGKSB7XG4gICAgICAgICAgLy8gdW5leHBlY3RlZCB0cmFpbFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH0gZWxzZSBpZiAoaSArIDEgPT09IGxlbmd0aCkge1xuICAgICAgICAgIC8vIHVucGFpcmVkIGxlYWRcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdmFsaWQgbGVhZFxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gMiBsZWFkcyBpbiBhIHJvd1xuICAgICAgaWYgKGNvZGVQb2ludCA8IDB4REMwMCkge1xuICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyB2YWxpZCBzdXJyb2dhdGUgcGFpclxuICAgICAgY29kZVBvaW50ID0gKGxlYWRTdXJyb2dhdGUgLSAweEQ4MDAgPDwgMTAgfCBjb2RlUG9pbnQgLSAweERDMDApICsgMHgxMDAwMFxuICAgIH0gZWxzZSBpZiAobGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgLy8gdmFsaWQgYm1wIGNoYXIsIGJ1dCBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgfVxuXG4gICAgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcblxuICAgIC8vIGVuY29kZSB1dGY4XG4gICAgaWYgKGNvZGVQb2ludCA8IDB4ODApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMSkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChjb2RlUG9pbnQpXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDgwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2IHwgMHhDMCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyB8IDB4RTAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDQpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDEyIHwgMHhGMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb2RlIHBvaW50JylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnl0ZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlUb0J5dGVzIChzdHIpIHtcbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgLy8gTm9kZSdzIGNvZGUgc2VlbXMgdG8gYmUgZG9pbmcgdGhpcyBhbmQgbm90ICYgMHg3Ri4uXG4gICAgYnl0ZUFycmF5LnB1c2goc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGKVxuICB9XG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVRvQnl0ZXMgKHN0ciwgdW5pdHMpIHtcbiAgdmFyIGMsIGhpLCBsb1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcblxuICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKVxuICAgIGhpID0gYyA+PiA4XG4gICAgbG8gPSBjICUgMjU2XG4gICAgYnl0ZUFycmF5LnB1c2gobG8pXG4gICAgYnl0ZUFycmF5LnB1c2goaGkpXG4gIH1cblxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cblxuZnVuY3Rpb24gYmFzZTY0VG9CeXRlcyAoc3RyKSB7XG4gIHJldHVybiBiYXNlNjQudG9CeXRlQXJyYXkoYmFzZTY0Y2xlYW4oc3RyKSlcbn1cblxuZnVuY3Rpb24gYmxpdEJ1ZmZlciAoc3JjLCBkc3QsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKGkgKyBvZmZzZXQgPj0gZHN0Lmxlbmd0aCkgfHwgKGkgPj0gc3JjLmxlbmd0aCkpIGJyZWFrXG4gICAgZHN0W2kgKyBvZmZzZXRdID0gc3JjW2ldXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gaXNuYW4gKHZhbCkge1xuICByZXR1cm4gdmFsICE9PSB2YWwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWNvbXBhcmVcbn1cblxuXG4vLyB0aGUgZm9sbG93aW5nIGlzIGZyb20gaXMtYnVmZmVyLCBhbHNvIGJ5IEZlcm9zcyBBYm91a2hhZGlqZWggYW5kIHdpdGggc2FtZSBsaXNlbmNlXG4vLyBUaGUgX2lzQnVmZmVyIGNoZWNrIGlzIGZvciBTYWZhcmkgNS03IHN1cHBvcnQsIGJlY2F1c2UgaXQncyBtaXNzaW5nXG4vLyBPYmplY3QucHJvdG90eXBlLmNvbnN0cnVjdG9yLiBSZW1vdmUgdGhpcyBldmVudHVhbGx5XG5leHBvcnQgZnVuY3Rpb24gaXNCdWZmZXIob2JqKSB7XG4gIHJldHVybiBvYmogIT0gbnVsbCAmJiAoISFvYmouX2lzQnVmZmVyIHx8IGlzRmFzdEJ1ZmZlcihvYmopIHx8IGlzU2xvd0J1ZmZlcihvYmopKVxufVxuXG5mdW5jdGlvbiBpc0Zhc3RCdWZmZXIgKG9iaikge1xuICByZXR1cm4gISFvYmouY29uc3RydWN0b3IgJiYgdHlwZW9mIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlciA9PT0gJ2Z1bmN0aW9uJyAmJiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIob2JqKVxufVxuXG4vLyBGb3IgTm9kZSB2MC4xMCBzdXBwb3J0LiBSZW1vdmUgdGhpcyBldmVudHVhbGx5LlxuZnVuY3Rpb24gaXNTbG93QnVmZmVyIChvYmopIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmoucmVhZEZsb2F0TEUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG9iai5zbGljZSA9PT0gJ2Z1bmN0aW9uJyAmJiBpc0Zhc3RCdWZmZXIob2JqLnNsaWNlKDAsIDApKVxufVxuIiwgImV4cG9ydCB2YXIgYnJvd3NlciA9IHRydWU7XG4iLCAiLyohIGh0dHBzOi8vbXRocy5iZS9oZSB2MS4yLjAgYnkgQG1hdGhpYXMgfCBNSVQgbGljZW5zZSAqL1xuOyhmdW5jdGlvbihyb290KSB7XG5cblx0Ly8gRGV0ZWN0IGZyZWUgdmFyaWFibGVzIGBleHBvcnRzYC5cblx0dmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cztcblxuXHQvLyBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC5cblx0dmFyIGZyZWVNb2R1bGUgPSB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJlxuXHRcdG1vZHVsZS5leHBvcnRzID09IGZyZWVFeHBvcnRzICYmIG1vZHVsZTtcblxuXHQvLyBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZ2xvYmFsYCwgZnJvbSBOb2RlLmpzIG9yIEJyb3dzZXJpZmllZCBjb2RlLFxuXHQvLyBhbmQgdXNlIGl0IGFzIGByb290YC5cblx0dmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbDtcblx0aWYgKGZyZWVHbG9iYWwuZ2xvYmFsID09PSBmcmVlR2xvYmFsIHx8IGZyZWVHbG9iYWwud2luZG93ID09PSBmcmVlR2xvYmFsKSB7XG5cdFx0cm9vdCA9IGZyZWVHbG9iYWw7XG5cdH1cblxuXHQvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuXHQvLyBBbGwgYXN0cmFsIHN5bWJvbHMuXG5cdHZhciByZWdleEFzdHJhbFN5bWJvbHMgPSAvW1xcdUQ4MDAtXFx1REJGRl1bXFx1REMwMC1cXHVERkZGXS9nO1xuXHQvLyBBbGwgQVNDSUkgc3ltYm9scyAobm90IGp1c3QgcHJpbnRhYmxlIEFTQ0lJKSBleGNlcHQgdGhvc2UgbGlzdGVkIGluIHRoZVxuXHQvLyBmaXJzdCBjb2x1bW4gb2YgdGhlIG92ZXJyaWRlcyB0YWJsZS5cblx0Ly8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjdGFibGUtY2hhcnJlZi1vdmVycmlkZXNcblx0dmFyIHJlZ2V4QXNjaWlXaGl0ZWxpc3QgPSAvW1xceDAxLVxceDdGXS9nO1xuXHQvLyBBbGwgQk1QIHN5bWJvbHMgdGhhdCBhcmUgbm90IEFTQ0lJIG5ld2xpbmVzLCBwcmludGFibGUgQVNDSUkgc3ltYm9scywgb3Jcblx0Ly8gY29kZSBwb2ludHMgbGlzdGVkIGluIHRoZSBmaXJzdCBjb2x1bW4gb2YgdGhlIG92ZXJyaWRlcyB0YWJsZSBvblxuXHQvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCN0YWJsZS1jaGFycmVmLW92ZXJyaWRlcy5cblx0dmFyIHJlZ2V4Qm1wV2hpdGVsaXN0ID0gL1tcXHgwMS1cXHRcXHgwQlxcZlxceDBFLVxceDFGXFx4N0ZcXHg4MVxceDhEXFx4OEZcXHg5MFxceDlEXFx4QTAtXFx1RkZGRl0vZztcblxuXHR2YXIgcmVnZXhFbmNvZGVOb25Bc2NpaSA9IC88XFx1MjBEMnw9XFx1MjBFNXw+XFx1MjBEMnxcXHUyMDVGXFx1MjAwQXxcXHUyMTlEXFx1MDMzOHxcXHUyMjAyXFx1MDMzOHxcXHUyMjIwXFx1MjBEMnxcXHUyMjI5XFx1RkUwMHxcXHUyMjJBXFx1RkUwMHxcXHUyMjNDXFx1MjBEMnxcXHUyMjNEXFx1MDMzMXxcXHUyMjNFXFx1MDMzM3xcXHUyMjQyXFx1MDMzOHxcXHUyMjRCXFx1MDMzOHxcXHUyMjREXFx1MjBEMnxcXHUyMjRFXFx1MDMzOHxcXHUyMjRGXFx1MDMzOHxcXHUyMjUwXFx1MDMzOHxcXHUyMjYxXFx1MjBFNXxcXHUyMjY0XFx1MjBEMnxcXHUyMjY1XFx1MjBEMnxcXHUyMjY2XFx1MDMzOHxcXHUyMjY3XFx1MDMzOHxcXHUyMjY4XFx1RkUwMHxcXHUyMjY5XFx1RkUwMHxcXHUyMjZBXFx1MDMzOHxcXHUyMjZBXFx1MjBEMnxcXHUyMjZCXFx1MDMzOHxcXHUyMjZCXFx1MjBEMnxcXHUyMjdGXFx1MDMzOHxcXHUyMjgyXFx1MjBEMnxcXHUyMjgzXFx1MjBEMnxcXHUyMjhBXFx1RkUwMHxcXHUyMjhCXFx1RkUwMHxcXHUyMjhGXFx1MDMzOHxcXHUyMjkwXFx1MDMzOHxcXHUyMjkzXFx1RkUwMHxcXHUyMjk0XFx1RkUwMHxcXHUyMkI0XFx1MjBEMnxcXHUyMkI1XFx1MjBEMnxcXHUyMkQ4XFx1MDMzOHxcXHUyMkQ5XFx1MDMzOHxcXHUyMkRBXFx1RkUwMHxcXHUyMkRCXFx1RkUwMHxcXHUyMkY1XFx1MDMzOHxcXHUyMkY5XFx1MDMzOHxcXHUyOTMzXFx1MDMzOHxcXHUyOUNGXFx1MDMzOHxcXHUyOUQwXFx1MDMzOHxcXHUyQTZEXFx1MDMzOHxcXHUyQTcwXFx1MDMzOHxcXHUyQTdEXFx1MDMzOHxcXHUyQTdFXFx1MDMzOHxcXHUyQUExXFx1MDMzOHxcXHUyQUEyXFx1MDMzOHxcXHUyQUFDXFx1RkUwMHxcXHUyQUFEXFx1RkUwMHxcXHUyQUFGXFx1MDMzOHxcXHUyQUIwXFx1MDMzOHxcXHUyQUM1XFx1MDMzOHxcXHUyQUM2XFx1MDMzOHxcXHUyQUNCXFx1RkUwMHxcXHUyQUNDXFx1RkUwMHxcXHUyQUZEXFx1MjBFNXxbXFx4QTAtXFx1MDExM1xcdTAxMTYtXFx1MDEyMlxcdTAxMjQtXFx1MDEyQlxcdTAxMkUtXFx1MDE0RFxcdTAxNTAtXFx1MDE3RVxcdTAxOTJcXHUwMUI1XFx1MDFGNVxcdTAyMzdcXHUwMkM2XFx1MDJDN1xcdTAyRDgtXFx1MDJERFxcdTAzMTFcXHUwMzkxLVxcdTAzQTFcXHUwM0EzLVxcdTAzQTlcXHUwM0IxLVxcdTAzQzlcXHUwM0QxXFx1MDNEMlxcdTAzRDVcXHUwM0Q2XFx1MDNEQ1xcdTAzRERcXHUwM0YwXFx1MDNGMVxcdTAzRjVcXHUwM0Y2XFx1MDQwMS1cXHUwNDBDXFx1MDQwRS1cXHUwNDRGXFx1MDQ1MS1cXHUwNDVDXFx1MDQ1RVxcdTA0NUZcXHUyMDAyLVxcdTIwMDVcXHUyMDA3LVxcdTIwMTBcXHUyMDEzLVxcdTIwMTZcXHUyMDE4LVxcdTIwMUFcXHUyMDFDLVxcdTIwMUVcXHUyMDIwLVxcdTIwMjJcXHUyMDI1XFx1MjAyNlxcdTIwMzAtXFx1MjAzNVxcdTIwMzlcXHUyMDNBXFx1MjAzRVxcdTIwNDFcXHUyMDQzXFx1MjA0NFxcdTIwNEZcXHUyMDU3XFx1MjA1Ri1cXHUyMDYzXFx1MjBBQ1xcdTIwREJcXHUyMERDXFx1MjEwMlxcdTIxMDVcXHUyMTBBLVxcdTIxMTNcXHUyMTE1LVxcdTIxMUVcXHUyMTIyXFx1MjEyNFxcdTIxMjctXFx1MjEyOVxcdTIxMkNcXHUyMTJEXFx1MjEyRi1cXHUyMTMxXFx1MjEzMy1cXHUyMTM4XFx1MjE0NS1cXHUyMTQ4XFx1MjE1My1cXHUyMTVFXFx1MjE5MC1cXHUyMTlCXFx1MjE5RC1cXHUyMUE3XFx1MjFBOS1cXHUyMUFFXFx1MjFCMC1cXHUyMUIzXFx1MjFCNS1cXHUyMUI3XFx1MjFCQS1cXHUyMURCXFx1MjFERFxcdTIxRTRcXHUyMUU1XFx1MjFGNVxcdTIxRkQtXFx1MjIwNVxcdTIyMDctXFx1MjIwOVxcdTIyMEJcXHUyMjBDXFx1MjIwRi1cXHUyMjE0XFx1MjIxNi1cXHUyMjE4XFx1MjIxQVxcdTIyMUQtXFx1MjIzOFxcdTIyM0EtXFx1MjI1N1xcdTIyNTlcXHUyMjVBXFx1MjI1Q1xcdTIyNUYtXFx1MjI2MlxcdTIyNjQtXFx1MjI4QlxcdTIyOEQtXFx1MjI5QlxcdTIyOUQtXFx1MjJBNVxcdTIyQTctXFx1MjJCMFxcdTIyQjItXFx1MjJCQlxcdTIyQkQtXFx1MjJEQlxcdTIyREUtXFx1MjJFM1xcdTIyRTYtXFx1MjJGN1xcdTIyRjktXFx1MjJGRVxcdTIzMDVcXHUyMzA2XFx1MjMwOC1cXHUyMzEwXFx1MjMxMlxcdTIzMTNcXHUyMzE1XFx1MjMxNlxcdTIzMUMtXFx1MjMxRlxcdTIzMjJcXHUyMzIzXFx1MjMyRFxcdTIzMkVcXHUyMzM2XFx1MjMzRFxcdTIzM0ZcXHUyMzdDXFx1MjNCMFxcdTIzQjFcXHUyM0I0LVxcdTIzQjZcXHUyM0RDLVxcdTIzREZcXHUyM0UyXFx1MjNFN1xcdTI0MjNcXHUyNEM4XFx1MjUwMFxcdTI1MDJcXHUyNTBDXFx1MjUxMFxcdTI1MTRcXHUyNTE4XFx1MjUxQ1xcdTI1MjRcXHUyNTJDXFx1MjUzNFxcdTI1M0NcXHUyNTUwLVxcdTI1NkNcXHUyNTgwXFx1MjU4NFxcdTI1ODhcXHUyNTkxLVxcdTI1OTNcXHUyNUExXFx1MjVBQVxcdTI1QUJcXHUyNUFEXFx1MjVBRVxcdTI1QjFcXHUyNUIzLVxcdTI1QjVcXHUyNUI4XFx1MjVCOVxcdTI1QkQtXFx1MjVCRlxcdTI1QzJcXHUyNUMzXFx1MjVDQVxcdTI1Q0JcXHUyNUVDXFx1MjVFRlxcdTI1RjgtXFx1MjVGQ1xcdTI2MDVcXHUyNjA2XFx1MjYwRVxcdTI2NDBcXHUyNjQyXFx1MjY2MFxcdTI2NjNcXHUyNjY1XFx1MjY2NlxcdTI2NkFcXHUyNjZELVxcdTI2NkZcXHUyNzEzXFx1MjcxN1xcdTI3MjBcXHUyNzM2XFx1Mjc1OFxcdTI3NzJcXHUyNzczXFx1MjdDOFxcdTI3QzlcXHUyN0U2LVxcdTI3RURcXHUyN0Y1LVxcdTI3RkFcXHUyN0ZDXFx1MjdGRlxcdTI5MDItXFx1MjkwNVxcdTI5MEMtXFx1MjkxM1xcdTI5MTZcXHUyOTE5LVxcdTI5MjBcXHUyOTIzLVxcdTI5MkFcXHUyOTMzXFx1MjkzNS1cXHUyOTM5XFx1MjkzQ1xcdTI5M0RcXHUyOTQ1XFx1Mjk0OC1cXHUyOTRCXFx1Mjk0RS1cXHUyOTc2XFx1Mjk3OFxcdTI5NzlcXHUyOTdCLVxcdTI5N0ZcXHUyOTg1XFx1Mjk4NlxcdTI5OEItXFx1Mjk5NlxcdTI5OUFcXHUyOTlDXFx1Mjk5RFxcdTI5QTQtXFx1MjlCN1xcdTI5QjlcXHUyOUJCXFx1MjlCQ1xcdTI5QkUtXFx1MjlDNVxcdTI5QzlcXHUyOUNELVxcdTI5RDBcXHUyOURDLVxcdTI5REVcXHUyOUUzLVxcdTI5RTVcXHUyOUVCXFx1MjlGNFxcdTI5RjZcXHUyQTAwLVxcdTJBMDJcXHUyQTA0XFx1MkEwNlxcdTJBMENcXHUyQTBEXFx1MkExMC1cXHUyQTE3XFx1MkEyMi1cXHUyQTI3XFx1MkEyOVxcdTJBMkFcXHUyQTJELVxcdTJBMzFcXHUyQTMzLVxcdTJBM0NcXHUyQTNGXFx1MkE0MFxcdTJBNDItXFx1MkE0RFxcdTJBNTBcXHUyQTUzLVxcdTJBNThcXHUyQTVBLVxcdTJBNURcXHUyQTVGXFx1MkE2NlxcdTJBNkFcXHUyQTZELVxcdTJBNzVcXHUyQTc3LVxcdTJBOUFcXHUyQTlELVxcdTJBQTJcXHUyQUE0LVxcdTJBQjBcXHUyQUIzLVxcdTJBQzhcXHUyQUNCXFx1MkFDQ1xcdTJBQ0YtXFx1MkFEQlxcdTJBRTRcXHUyQUU2LVxcdTJBRTlcXHUyQUVCLVxcdTJBRjNcXHUyQUZEXFx1RkIwMC1cXHVGQjA0XXxcXHVEODM1W1xcdURDOUNcXHVEQzlFXFx1REM5RlxcdURDQTJcXHVEQ0E1XFx1RENBNlxcdURDQTktXFx1RENBQ1xcdURDQUUtXFx1RENCOVxcdURDQkJcXHVEQ0JELVxcdURDQzNcXHVEQ0M1LVxcdURDQ0ZcXHVERDA0XFx1REQwNVxcdUREMDctXFx1REQwQVxcdUREMEQtXFx1REQxNFxcdUREMTYtXFx1REQxQ1xcdUREMUUtXFx1REQzOVxcdUREM0ItXFx1REQzRVxcdURENDAtXFx1REQ0NFxcdURENDZcXHVERDRBLVxcdURENTBcXHVERDUyLVxcdURENkJdL2c7XG5cdHZhciBlbmNvZGVNYXAgPSB7J1xceEFEJzonc2h5JywnXFx1MjAwQyc6J3p3bmonLCdcXHUyMDBEJzonendqJywnXFx1MjAwRSc6J2xybScsJ1xcdTIwNjMnOidpYycsJ1xcdTIwNjInOidpdCcsJ1xcdTIwNjEnOidhZicsJ1xcdTIwMEYnOidybG0nLCdcXHUyMDBCJzonWmVyb1dpZHRoU3BhY2UnLCdcXHUyMDYwJzonTm9CcmVhaycsJ1xcdTAzMTEnOidEb3duQnJldmUnLCdcXHUyMERCJzondGRvdCcsJ1xcdTIwREMnOidEb3REb3QnLCdcXHQnOidUYWInLCdcXG4nOidOZXdMaW5lJywnXFx1MjAwOCc6J3B1bmNzcCcsJ1xcdTIwNUYnOidNZWRpdW1TcGFjZScsJ1xcdTIwMDknOid0aGluc3AnLCdcXHUyMDBBJzonaGFpcnNwJywnXFx1MjAwNCc6J2Vtc3AxMycsJ1xcdTIwMDInOidlbnNwJywnXFx1MjAwNSc6J2Vtc3AxNCcsJ1xcdTIwMDMnOidlbXNwJywnXFx1MjAwNyc6J251bXNwJywnXFx4QTAnOiduYnNwJywnXFx1MjA1RlxcdTIwMEEnOidUaGlja1NwYWNlJywnXFx1MjAzRSc6J29saW5lJywnXyc6J2xvd2JhcicsJ1xcdTIwMTAnOidkYXNoJywnXFx1MjAxMyc6J25kYXNoJywnXFx1MjAxNCc6J21kYXNoJywnXFx1MjAxNSc6J2hvcmJhcicsJywnOidjb21tYScsJzsnOidzZW1pJywnXFx1MjA0Ric6J2JzZW1pJywnOic6J2NvbG9uJywnXFx1MkE3NCc6J0NvbG9uZScsJyEnOidleGNsJywnXFx4QTEnOidpZXhjbCcsJz8nOidxdWVzdCcsJ1xceEJGJzonaXF1ZXN0JywnLic6J3BlcmlvZCcsJ1xcdTIwMjUnOidubGRyJywnXFx1MjAyNic6J21sZHInLCdcXHhCNyc6J21pZGRvdCcsJ1xcJyc6J2Fwb3MnLCdcXHUyMDE4JzonbHNxdW8nLCdcXHUyMDE5JzoncnNxdW8nLCdcXHUyMDFBJzonc2JxdW8nLCdcXHUyMDM5JzonbHNhcXVvJywnXFx1MjAzQSc6J3JzYXF1bycsJ1wiJzoncXVvdCcsJ1xcdTIwMUMnOidsZHF1bycsJ1xcdTIwMUQnOidyZHF1bycsJ1xcdTIwMUUnOidiZHF1bycsJ1xceEFCJzonbGFxdW8nLCdcXHhCQic6J3JhcXVvJywnKCc6J2xwYXInLCcpJzoncnBhcicsJ1snOidsc3FiJywnXSc6J3JzcWInLCd7JzonbGN1YicsJ30nOidyY3ViJywnXFx1MjMwOCc6J2xjZWlsJywnXFx1MjMwOSc6J3JjZWlsJywnXFx1MjMwQSc6J2xmbG9vcicsJ1xcdTIzMEInOidyZmxvb3InLCdcXHUyOTg1JzonbG9wYXInLCdcXHUyOTg2Jzoncm9wYXInLCdcXHUyOThCJzonbGJya2UnLCdcXHUyOThDJzoncmJya2UnLCdcXHUyOThEJzonbGJya3NsdScsJ1xcdTI5OEUnOidyYnJrc2xkJywnXFx1Mjk4Ric6J2xicmtzbGQnLCdcXHUyOTkwJzoncmJya3NsdScsJ1xcdTI5OTEnOidsYW5nZCcsJ1xcdTI5OTInOidyYW5nZCcsJ1xcdTI5OTMnOidscGFybHQnLCdcXHUyOTk0JzoncnBhcmd0JywnXFx1Mjk5NSc6J2d0bFBhcicsJ1xcdTI5OTYnOidsdHJQYXInLCdcXHUyN0U2JzonbG9icmsnLCdcXHUyN0U3Jzoncm9icmsnLCdcXHUyN0U4JzonbGFuZycsJ1xcdTI3RTknOidyYW5nJywnXFx1MjdFQSc6J0xhbmcnLCdcXHUyN0VCJzonUmFuZycsJ1xcdTI3RUMnOidsb2FuZycsJ1xcdTI3RUQnOidyb2FuZycsJ1xcdTI3NzInOidsYmJyaycsJ1xcdTI3NzMnOidyYmJyaycsJ1xcdTIwMTYnOidWZXJ0JywnXFx4QTcnOidzZWN0JywnXFx4QjYnOidwYXJhJywnQCc6J2NvbW1hdCcsJyonOidhc3QnLCcvJzonc29sJywndW5kZWZpbmVkJzpudWxsLCcmJzonYW1wJywnIyc6J251bScsJyUnOidwZXJjbnQnLCdcXHUyMDMwJzoncGVybWlsJywnXFx1MjAzMSc6J3BlcnRlbmsnLCdcXHUyMDIwJzonZGFnZ2VyJywnXFx1MjAyMSc6J0RhZ2dlcicsJ1xcdTIwMjInOididWxsJywnXFx1MjA0Myc6J2h5YnVsbCcsJ1xcdTIwMzInOidwcmltZScsJ1xcdTIwMzMnOidQcmltZScsJ1xcdTIwMzQnOid0cHJpbWUnLCdcXHUyMDU3JzoncXByaW1lJywnXFx1MjAzNSc6J2JwcmltZScsJ1xcdTIwNDEnOidjYXJldCcsJ2AnOidncmF2ZScsJ1xceEI0JzonYWN1dGUnLCdcXHUwMkRDJzondGlsZGUnLCdeJzonSGF0JywnXFx4QUYnOidtYWNyJywnXFx1MDJEOCc6J2JyZXZlJywnXFx1MDJEOSc6J2RvdCcsJ1xceEE4JzonZGllJywnXFx1MDJEQSc6J3JpbmcnLCdcXHUwMkREJzonZGJsYWMnLCdcXHhCOCc6J2NlZGlsJywnXFx1MDJEQic6J29nb24nLCdcXHUwMkM2JzonY2lyYycsJ1xcdTAyQzcnOidjYXJvbicsJ1xceEIwJzonZGVnJywnXFx4QTknOidjb3B5JywnXFx4QUUnOidyZWcnLCdcXHUyMTE3JzonY29weXNyJywnXFx1MjExOCc6J3dwJywnXFx1MjExRSc6J3J4JywnXFx1MjEyNyc6J21obycsJ1xcdTIxMjknOidpaW90YScsJ1xcdTIxOTAnOidsYXJyJywnXFx1MjE5QSc6J25sYXJyJywnXFx1MjE5Mic6J3JhcnInLCdcXHUyMTlCJzonbnJhcnInLCdcXHUyMTkxJzondWFycicsJ1xcdTIxOTMnOidkYXJyJywnXFx1MjE5NCc6J2hhcnInLCdcXHUyMUFFJzonbmhhcnInLCdcXHUyMTk1JzondmFycicsJ1xcdTIxOTYnOidud2FycicsJ1xcdTIxOTcnOiduZWFycicsJ1xcdTIxOTgnOidzZWFycicsJ1xcdTIxOTknOidzd2FycicsJ1xcdTIxOUQnOidyYXJydycsJ1xcdTIxOURcXHUwMzM4JzonbnJhcnJ3JywnXFx1MjE5RSc6J0xhcnInLCdcXHUyMTlGJzonVWFycicsJ1xcdTIxQTAnOidSYXJyJywnXFx1MjFBMSc6J0RhcnInLCdcXHUyMUEyJzonbGFycnRsJywnXFx1MjFBMyc6J3JhcnJ0bCcsJ1xcdTIxQTQnOidtYXBzdG9sZWZ0JywnXFx1MjFBNSc6J21hcHN0b3VwJywnXFx1MjFBNic6J21hcCcsJ1xcdTIxQTcnOidtYXBzdG9kb3duJywnXFx1MjFBOSc6J2xhcnJoaycsJ1xcdTIxQUEnOidyYXJyaGsnLCdcXHUyMUFCJzonbGFycmxwJywnXFx1MjFBQyc6J3JhcnJscCcsJ1xcdTIxQUQnOidoYXJydycsJ1xcdTIxQjAnOidsc2gnLCdcXHUyMUIxJzoncnNoJywnXFx1MjFCMic6J2xkc2gnLCdcXHUyMUIzJzoncmRzaCcsJ1xcdTIxQjUnOidjcmFycicsJ1xcdTIxQjYnOidjdWxhcnInLCdcXHUyMUI3JzonY3VyYXJyJywnXFx1MjFCQSc6J29sYXJyJywnXFx1MjFCQic6J29yYXJyJywnXFx1MjFCQyc6J2xoYXJ1JywnXFx1MjFCRCc6J2xoYXJkJywnXFx1MjFCRSc6J3VoYXJyJywnXFx1MjFCRic6J3VoYXJsJywnXFx1MjFDMCc6J3JoYXJ1JywnXFx1MjFDMSc6J3JoYXJkJywnXFx1MjFDMic6J2RoYXJyJywnXFx1MjFDMyc6J2RoYXJsJywnXFx1MjFDNCc6J3JsYXJyJywnXFx1MjFDNSc6J3VkYXJyJywnXFx1MjFDNic6J2xyYXJyJywnXFx1MjFDNyc6J2xsYXJyJywnXFx1MjFDOCc6J3V1YXJyJywnXFx1MjFDOSc6J3JyYXJyJywnXFx1MjFDQSc6J2RkYXJyJywnXFx1MjFDQic6J2xyaGFyJywnXFx1MjFDQyc6J3JsaGFyJywnXFx1MjFEMCc6J2xBcnInLCdcXHUyMUNEJzonbmxBcnInLCdcXHUyMUQxJzondUFycicsJ1xcdTIxRDInOidyQXJyJywnXFx1MjFDRic6J25yQXJyJywnXFx1MjFEMyc6J2RBcnInLCdcXHUyMUQ0JzonaWZmJywnXFx1MjFDRSc6J25oQXJyJywnXFx1MjFENSc6J3ZBcnInLCdcXHUyMUQ2JzonbndBcnInLCdcXHUyMUQ3JzonbmVBcnInLCdcXHUyMUQ4Jzonc2VBcnInLCdcXHUyMUQ5Jzonc3dBcnInLCdcXHUyMURBJzonbEFhcnInLCdcXHUyMURCJzonckFhcnInLCdcXHUyMUREJzonemlncmFycicsJ1xcdTIxRTQnOidsYXJyYicsJ1xcdTIxRTUnOidyYXJyYicsJ1xcdTIxRjUnOidkdWFycicsJ1xcdTIxRkQnOidsb2FycicsJ1xcdTIxRkUnOidyb2FycicsJ1xcdTIxRkYnOidob2FycicsJ1xcdTIyMDAnOidmb3JhbGwnLCdcXHUyMjAxJzonY29tcCcsJ1xcdTIyMDInOidwYXJ0JywnXFx1MjIwMlxcdTAzMzgnOiducGFydCcsJ1xcdTIyMDMnOidleGlzdCcsJ1xcdTIyMDQnOiduZXhpc3QnLCdcXHUyMjA1JzonZW1wdHknLCdcXHUyMjA3JzonRGVsJywnXFx1MjIwOCc6J2luJywnXFx1MjIwOSc6J25vdGluJywnXFx1MjIwQic6J25pJywnXFx1MjIwQyc6J25vdG5pJywnXFx1MDNGNic6J2JlcHNpJywnXFx1MjIwRic6J3Byb2QnLCdcXHUyMjEwJzonY29wcm9kJywnXFx1MjIxMSc6J3N1bScsJysnOidwbHVzJywnXFx4QjEnOidwbScsJ1xceEY3JzonZGl2JywnXFx4RDcnOid0aW1lcycsJzwnOidsdCcsJ1xcdTIyNkUnOidubHQnLCc8XFx1MjBEMic6J252bHQnLCc9JzonZXF1YWxzJywnXFx1MjI2MCc6J25lJywnPVxcdTIwRTUnOidibmUnLCdcXHUyQTc1JzonRXF1YWwnLCc+JzonZ3QnLCdcXHUyMjZGJzonbmd0JywnPlxcdTIwRDInOidudmd0JywnXFx4QUMnOidub3QnLCd8JzondmVydCcsJ1xceEE2JzonYnJ2YmFyJywnXFx1MjIxMic6J21pbnVzJywnXFx1MjIxMyc6J21wJywnXFx1MjIxNCc6J3BsdXNkbycsJ1xcdTIwNDQnOidmcmFzbCcsJ1xcdTIyMTYnOidzZXRtbicsJ1xcdTIyMTcnOidsb3dhc3QnLCdcXHUyMjE4JzonY29tcGZuJywnXFx1MjIxQSc6J1NxcnQnLCdcXHUyMjFEJzoncHJvcCcsJ1xcdTIyMUUnOidpbmZpbicsJ1xcdTIyMUYnOidhbmdydCcsJ1xcdTIyMjAnOidhbmcnLCdcXHUyMjIwXFx1MjBEMic6J25hbmcnLCdcXHUyMjIxJzonYW5nbXNkJywnXFx1MjIyMic6J2FuZ3NwaCcsJ1xcdTIyMjMnOidtaWQnLCdcXHUyMjI0Jzonbm1pZCcsJ1xcdTIyMjUnOidwYXInLCdcXHUyMjI2JzonbnBhcicsJ1xcdTIyMjcnOidhbmQnLCdcXHUyMjI4Jzonb3InLCdcXHUyMjI5JzonY2FwJywnXFx1MjIyOVxcdUZFMDAnOidjYXBzJywnXFx1MjIyQSc6J2N1cCcsJ1xcdTIyMkFcXHVGRTAwJzonY3VwcycsJ1xcdTIyMkInOidpbnQnLCdcXHUyMjJDJzonSW50JywnXFx1MjIyRCc6J3RpbnQnLCdcXHUyQTBDJzoncWludCcsJ1xcdTIyMkUnOidvaW50JywnXFx1MjIyRic6J0NvbmludCcsJ1xcdTIyMzAnOidDY29uaW50JywnXFx1MjIzMSc6J2N3aW50JywnXFx1MjIzMic6J2N3Y29uaW50JywnXFx1MjIzMyc6J2F3Y29uaW50JywnXFx1MjIzNCc6J3RoZXJlNCcsJ1xcdTIyMzUnOidiZWNhdXMnLCdcXHUyMjM2JzoncmF0aW8nLCdcXHUyMjM3JzonQ29sb24nLCdcXHUyMjM4JzonbWludXNkJywnXFx1MjIzQSc6J21ERG90JywnXFx1MjIzQic6J2hvbXRodCcsJ1xcdTIyM0MnOidzaW0nLCdcXHUyMjQxJzonbnNpbScsJ1xcdTIyM0NcXHUyMEQyJzonbnZzaW0nLCdcXHUyMjNEJzonYnNpbScsJ1xcdTIyM0RcXHUwMzMxJzoncmFjZScsJ1xcdTIyM0UnOidhYycsJ1xcdTIyM0VcXHUwMzMzJzonYWNFJywnXFx1MjIzRic6J2FjZCcsJ1xcdTIyNDAnOid3cicsJ1xcdTIyNDInOidlc2ltJywnXFx1MjI0MlxcdTAzMzgnOiduZXNpbScsJ1xcdTIyNDMnOidzaW1lJywnXFx1MjI0NCc6J25zaW1lJywnXFx1MjI0NSc6J2NvbmcnLCdcXHUyMjQ3JzonbmNvbmcnLCdcXHUyMjQ2Jzonc2ltbmUnLCdcXHUyMjQ4JzonYXAnLCdcXHUyMjQ5JzonbmFwJywnXFx1MjI0QSc6J2FwZScsJ1xcdTIyNEInOidhcGlkJywnXFx1MjI0QlxcdTAzMzgnOiduYXBpZCcsJ1xcdTIyNEMnOidiY29uZycsJ1xcdTIyNEQnOidDdXBDYXAnLCdcXHUyMjZEJzonTm90Q3VwQ2FwJywnXFx1MjI0RFxcdTIwRDInOidudmFwJywnXFx1MjI0RSc6J2J1bXAnLCdcXHUyMjRFXFx1MDMzOCc6J25idW1wJywnXFx1MjI0Ric6J2J1bXBlJywnXFx1MjI0RlxcdTAzMzgnOiduYnVtcGUnLCdcXHUyMjUwJzonZG90ZXEnLCdcXHUyMjUwXFx1MDMzOCc6J25lZG90JywnXFx1MjI1MSc6J2VEb3QnLCdcXHUyMjUyJzonZWZEb3QnLCdcXHUyMjUzJzonZXJEb3QnLCdcXHUyMjU0JzonY29sb25lJywnXFx1MjI1NSc6J2Vjb2xvbicsJ1xcdTIyNTYnOidlY2lyJywnXFx1MjI1Nyc6J2NpcmUnLCdcXHUyMjU5Jzond2VkZ2VxJywnXFx1MjI1QSc6J3ZlZWVxJywnXFx1MjI1Qyc6J3RyaWUnLCdcXHUyMjVGJzonZXF1ZXN0JywnXFx1MjI2MSc6J2VxdWl2JywnXFx1MjI2Mic6J25lcXVpdicsJ1xcdTIyNjFcXHUyMEU1JzonYm5lcXVpdicsJ1xcdTIyNjQnOidsZScsJ1xcdTIyNzAnOidubGUnLCdcXHUyMjY0XFx1MjBEMic6J252bGUnLCdcXHUyMjY1JzonZ2UnLCdcXHUyMjcxJzonbmdlJywnXFx1MjI2NVxcdTIwRDInOidudmdlJywnXFx1MjI2Nic6J2xFJywnXFx1MjI2NlxcdTAzMzgnOidubEUnLCdcXHUyMjY3JzonZ0UnLCdcXHUyMjY3XFx1MDMzOCc6J25nRScsJ1xcdTIyNjhcXHVGRTAwJzonbHZuRScsJ1xcdTIyNjgnOidsbkUnLCdcXHUyMjY5JzonZ25FJywnXFx1MjI2OVxcdUZFMDAnOidndm5FJywnXFx1MjI2QSc6J2xsJywnXFx1MjI2QVxcdTAzMzgnOiduTHR2JywnXFx1MjI2QVxcdTIwRDInOiduTHQnLCdcXHUyMjZCJzonZ2cnLCdcXHUyMjZCXFx1MDMzOCc6J25HdHYnLCdcXHUyMjZCXFx1MjBEMic6J25HdCcsJ1xcdTIyNkMnOid0d2l4dCcsJ1xcdTIyNzInOidsc2ltJywnXFx1MjI3NCc6J25sc2ltJywnXFx1MjI3Myc6J2dzaW0nLCdcXHUyMjc1JzonbmdzaW0nLCdcXHUyMjc2JzonbGcnLCdcXHUyMjc4JzonbnRsZycsJ1xcdTIyNzcnOidnbCcsJ1xcdTIyNzknOidudGdsJywnXFx1MjI3QSc6J3ByJywnXFx1MjI4MCc6J25wcicsJ1xcdTIyN0InOidzYycsJ1xcdTIyODEnOiduc2MnLCdcXHUyMjdDJzoncHJjdWUnLCdcXHUyMkUwJzonbnByY3VlJywnXFx1MjI3RCc6J3NjY3VlJywnXFx1MjJFMSc6J25zY2N1ZScsJ1xcdTIyN0UnOidwcnNpbScsJ1xcdTIyN0YnOidzY3NpbScsJ1xcdTIyN0ZcXHUwMzM4JzonTm90U3VjY2VlZHNUaWxkZScsJ1xcdTIyODInOidzdWInLCdcXHUyMjg0JzonbnN1YicsJ1xcdTIyODJcXHUyMEQyJzondm5zdWInLCdcXHUyMjgzJzonc3VwJywnXFx1MjI4NSc6J25zdXAnLCdcXHUyMjgzXFx1MjBEMic6J3Zuc3VwJywnXFx1MjI4Nic6J3N1YmUnLCdcXHUyMjg4JzonbnN1YmUnLCdcXHUyMjg3Jzonc3VwZScsJ1xcdTIyODknOiduc3VwZScsJ1xcdTIyOEFcXHVGRTAwJzondnN1Ym5lJywnXFx1MjI4QSc6J3N1Ym5lJywnXFx1MjI4QlxcdUZFMDAnOid2c3VwbmUnLCdcXHUyMjhCJzonc3VwbmUnLCdcXHUyMjhEJzonY3VwZG90JywnXFx1MjI4RSc6J3VwbHVzJywnXFx1MjI4Ric6J3Nxc3ViJywnXFx1MjI4RlxcdTAzMzgnOidOb3RTcXVhcmVTdWJzZXQnLCdcXHUyMjkwJzonc3FzdXAnLCdcXHUyMjkwXFx1MDMzOCc6J05vdFNxdWFyZVN1cGVyc2V0JywnXFx1MjI5MSc6J3Nxc3ViZScsJ1xcdTIyRTInOiduc3FzdWJlJywnXFx1MjI5Mic6J3Nxc3VwZScsJ1xcdTIyRTMnOiduc3FzdXBlJywnXFx1MjI5Myc6J3NxY2FwJywnXFx1MjI5M1xcdUZFMDAnOidzcWNhcHMnLCdcXHUyMjk0Jzonc3FjdXAnLCdcXHUyMjk0XFx1RkUwMCc6J3NxY3VwcycsJ1xcdTIyOTUnOidvcGx1cycsJ1xcdTIyOTYnOidvbWludXMnLCdcXHUyMjk3Jzonb3RpbWVzJywnXFx1MjI5OCc6J29zb2wnLCdcXHUyMjk5Jzonb2RvdCcsJ1xcdTIyOUEnOidvY2lyJywnXFx1MjI5Qic6J29hc3QnLCdcXHUyMjlEJzonb2Rhc2gnLCdcXHUyMjlFJzoncGx1c2InLCdcXHUyMjlGJzonbWludXNiJywnXFx1MjJBMCc6J3RpbWVzYicsJ1xcdTIyQTEnOidzZG90YicsJ1xcdTIyQTInOid2ZGFzaCcsJ1xcdTIyQUMnOidudmRhc2gnLCdcXHUyMkEzJzonZGFzaHYnLCdcXHUyMkE0JzondG9wJywnXFx1MjJBNSc6J2JvdCcsJ1xcdTIyQTcnOidtb2RlbHMnLCdcXHUyMkE4JzondkRhc2gnLCdcXHUyMkFEJzonbnZEYXNoJywnXFx1MjJBOSc6J1ZkYXNoJywnXFx1MjJBRSc6J25WZGFzaCcsJ1xcdTIyQUEnOidWdmRhc2gnLCdcXHUyMkFCJzonVkRhc2gnLCdcXHUyMkFGJzonblZEYXNoJywnXFx1MjJCMCc6J3BydXJlbCcsJ1xcdTIyQjInOid2bHRyaScsJ1xcdTIyRUEnOidubHRyaScsJ1xcdTIyQjMnOid2cnRyaScsJ1xcdTIyRUInOiducnRyaScsJ1xcdTIyQjQnOidsdHJpZScsJ1xcdTIyRUMnOidubHRyaWUnLCdcXHUyMkI0XFx1MjBEMic6J252bHRyaWUnLCdcXHUyMkI1JzoncnRyaWUnLCdcXHUyMkVEJzonbnJ0cmllJywnXFx1MjJCNVxcdTIwRDInOidudnJ0cmllJywnXFx1MjJCNic6J29yaWdvZicsJ1xcdTIyQjcnOidpbW9mJywnXFx1MjJCOCc6J211bWFwJywnXFx1MjJCOSc6J2hlcmNvbicsJ1xcdTIyQkEnOidpbnRjYWwnLCdcXHUyMkJCJzondmVlYmFyJywnXFx1MjJCRCc6J2JhcnZlZScsJ1xcdTIyQkUnOidhbmdydHZiJywnXFx1MjJCRic6J2xydHJpJywnXFx1MjJDMCc6J1dlZGdlJywnXFx1MjJDMSc6J1ZlZScsJ1xcdTIyQzInOid4Y2FwJywnXFx1MjJDMyc6J3hjdXAnLCdcXHUyMkM0JzonZGlhbScsJ1xcdTIyQzUnOidzZG90JywnXFx1MjJDNic6J1N0YXInLCdcXHUyMkM3JzonZGl2b254JywnXFx1MjJDOCc6J2Jvd3RpZScsJ1xcdTIyQzknOidsdGltZXMnLCdcXHUyMkNBJzoncnRpbWVzJywnXFx1MjJDQic6J2x0aHJlZScsJ1xcdTIyQ0MnOidydGhyZWUnLCdcXHUyMkNEJzonYnNpbWUnLCdcXHUyMkNFJzonY3V2ZWUnLCdcXHUyMkNGJzonY3V3ZWQnLCdcXHUyMkQwJzonU3ViJywnXFx1MjJEMSc6J1N1cCcsJ1xcdTIyRDInOidDYXAnLCdcXHUyMkQzJzonQ3VwJywnXFx1MjJENCc6J2ZvcmsnLCdcXHUyMkQ1JzonZXBhcicsJ1xcdTIyRDYnOidsdGRvdCcsJ1xcdTIyRDcnOidndGRvdCcsJ1xcdTIyRDgnOidMbCcsJ1xcdTIyRDhcXHUwMzM4JzonbkxsJywnXFx1MjJEOSc6J0dnJywnXFx1MjJEOVxcdTAzMzgnOiduR2cnLCdcXHUyMkRBXFx1RkUwMCc6J2xlc2cnLCdcXHUyMkRBJzonbGVnJywnXFx1MjJEQic6J2dlbCcsJ1xcdTIyREJcXHVGRTAwJzonZ2VzbCcsJ1xcdTIyREUnOidjdWVwcicsJ1xcdTIyREYnOidjdWVzYycsJ1xcdTIyRTYnOidsbnNpbScsJ1xcdTIyRTcnOidnbnNpbScsJ1xcdTIyRTgnOidwcm5zaW0nLCdcXHUyMkU5Jzonc2Nuc2ltJywnXFx1MjJFRSc6J3ZlbGxpcCcsJ1xcdTIyRUYnOidjdGRvdCcsJ1xcdTIyRjAnOid1dGRvdCcsJ1xcdTIyRjEnOidkdGRvdCcsJ1xcdTIyRjInOidkaXNpbicsJ1xcdTIyRjMnOidpc2luc3YnLCdcXHUyMkY0JzonaXNpbnMnLCdcXHUyMkY1JzonaXNpbmRvdCcsJ1xcdTIyRjVcXHUwMzM4Jzonbm90aW5kb3QnLCdcXHUyMkY2Jzonbm90aW52YycsJ1xcdTIyRjcnOidub3RpbnZiJywnXFx1MjJGOSc6J2lzaW5FJywnXFx1MjJGOVxcdTAzMzgnOidub3RpbkUnLCdcXHUyMkZBJzonbmlzZCcsJ1xcdTIyRkInOid4bmlzJywnXFx1MjJGQyc6J25pcycsJ1xcdTIyRkQnOidub3RuaXZjJywnXFx1MjJGRSc6J25vdG5pdmInLCdcXHUyMzA1JzonYmFyd2VkJywnXFx1MjMwNic6J0JhcndlZCcsJ1xcdTIzMEMnOidkcmNyb3AnLCdcXHUyMzBEJzonZGxjcm9wJywnXFx1MjMwRSc6J3VyY3JvcCcsJ1xcdTIzMEYnOid1bGNyb3AnLCdcXHUyMzEwJzonYm5vdCcsJ1xcdTIzMTInOidwcm9mbGluZScsJ1xcdTIzMTMnOidwcm9mc3VyZicsJ1xcdTIzMTUnOid0ZWxyZWMnLCdcXHUyMzE2JzondGFyZ2V0JywnXFx1MjMxQyc6J3VsY29ybicsJ1xcdTIzMUQnOid1cmNvcm4nLCdcXHUyMzFFJzonZGxjb3JuJywnXFx1MjMxRic6J2RyY29ybicsJ1xcdTIzMjInOidmcm93bicsJ1xcdTIzMjMnOidzbWlsZScsJ1xcdTIzMkQnOidjeWxjdHknLCdcXHUyMzJFJzoncHJvZmFsYXInLCdcXHUyMzM2JzondG9wYm90JywnXFx1MjMzRCc6J292YmFyJywnXFx1MjMzRic6J3NvbGJhcicsJ1xcdTIzN0MnOidhbmd6YXJyJywnXFx1MjNCMCc6J2xtb3VzdCcsJ1xcdTIzQjEnOidybW91c3QnLCdcXHUyM0I0JzondGJyaycsJ1xcdTIzQjUnOidiYnJrJywnXFx1MjNCNic6J2Jicmt0YnJrJywnXFx1MjNEQyc6J092ZXJQYXJlbnRoZXNpcycsJ1xcdTIzREQnOidVbmRlclBhcmVudGhlc2lzJywnXFx1MjNERSc6J092ZXJCcmFjZScsJ1xcdTIzREYnOidVbmRlckJyYWNlJywnXFx1MjNFMic6J3RycGV6aXVtJywnXFx1MjNFNyc6J2VsaW50ZXJzJywnXFx1MjQyMyc6J2JsYW5rJywnXFx1MjUwMCc6J2JveGgnLCdcXHUyNTAyJzonYm94dicsJ1xcdTI1MEMnOidib3hkcicsJ1xcdTI1MTAnOidib3hkbCcsJ1xcdTI1MTQnOidib3h1cicsJ1xcdTI1MTgnOidib3h1bCcsJ1xcdTI1MUMnOidib3h2cicsJ1xcdTI1MjQnOidib3h2bCcsJ1xcdTI1MkMnOidib3hoZCcsJ1xcdTI1MzQnOidib3hodScsJ1xcdTI1M0MnOidib3h2aCcsJ1xcdTI1NTAnOidib3hIJywnXFx1MjU1MSc6J2JveFYnLCdcXHUyNTUyJzonYm94ZFInLCdcXHUyNTUzJzonYm94RHInLCdcXHUyNTU0JzonYm94RFInLCdcXHUyNTU1JzonYm94ZEwnLCdcXHUyNTU2JzonYm94RGwnLCdcXHUyNTU3JzonYm94REwnLCdcXHUyNTU4JzonYm94dVInLCdcXHUyNTU5JzonYm94VXInLCdcXHUyNTVBJzonYm94VVInLCdcXHUyNTVCJzonYm94dUwnLCdcXHUyNTVDJzonYm94VWwnLCdcXHUyNTVEJzonYm94VUwnLCdcXHUyNTVFJzonYm94dlInLCdcXHUyNTVGJzonYm94VnInLCdcXHUyNTYwJzonYm94VlInLCdcXHUyNTYxJzonYm94dkwnLCdcXHUyNTYyJzonYm94VmwnLCdcXHUyNTYzJzonYm94VkwnLCdcXHUyNTY0JzonYm94SGQnLCdcXHUyNTY1JzonYm94aEQnLCdcXHUyNTY2JzonYm94SEQnLCdcXHUyNTY3JzonYm94SHUnLCdcXHUyNTY4JzonYm94aFUnLCdcXHUyNTY5JzonYm94SFUnLCdcXHUyNTZBJzonYm94dkgnLCdcXHUyNTZCJzonYm94VmgnLCdcXHUyNTZDJzonYm94VkgnLCdcXHUyNTgwJzondWhibGsnLCdcXHUyNTg0JzonbGhibGsnLCdcXHUyNTg4JzonYmxvY2snLCdcXHUyNTkxJzonYmxrMTQnLCdcXHUyNTkyJzonYmxrMTInLCdcXHUyNTkzJzonYmxrMzQnLCdcXHUyNUExJzonc3F1JywnXFx1MjVBQSc6J3NxdWYnLCdcXHUyNUFCJzonRW1wdHlWZXJ5U21hbGxTcXVhcmUnLCdcXHUyNUFEJzoncmVjdCcsJ1xcdTI1QUUnOidtYXJrZXInLCdcXHUyNUIxJzonZmx0bnMnLCdcXHUyNUIzJzoneHV0cmknLCdcXHUyNUI0JzondXRyaWYnLCdcXHUyNUI1JzondXRyaScsJ1xcdTI1QjgnOidydHJpZicsJ1xcdTI1QjknOidydHJpJywnXFx1MjVCRCc6J3hkdHJpJywnXFx1MjVCRSc6J2R0cmlmJywnXFx1MjVCRic6J2R0cmknLCdcXHUyNUMyJzonbHRyaWYnLCdcXHUyNUMzJzonbHRyaScsJ1xcdTI1Q0EnOidsb3onLCdcXHUyNUNCJzonY2lyJywnXFx1MjVFQyc6J3RyaWRvdCcsJ1xcdTI1RUYnOid4Y2lyYycsJ1xcdTI1RjgnOid1bHRyaScsJ1xcdTI1RjknOid1cnRyaScsJ1xcdTI1RkEnOidsbHRyaScsJ1xcdTI1RkInOidFbXB0eVNtYWxsU3F1YXJlJywnXFx1MjVGQyc6J0ZpbGxlZFNtYWxsU3F1YXJlJywnXFx1MjYwNSc6J3N0YXJmJywnXFx1MjYwNic6J3N0YXInLCdcXHUyNjBFJzoncGhvbmUnLCdcXHUyNjQwJzonZmVtYWxlJywnXFx1MjY0Mic6J21hbGUnLCdcXHUyNjYwJzonc3BhZGVzJywnXFx1MjY2Myc6J2NsdWJzJywnXFx1MjY2NSc6J2hlYXJ0cycsJ1xcdTI2NjYnOidkaWFtcycsJ1xcdTI2NkEnOidzdW5nJywnXFx1MjcxMyc6J2NoZWNrJywnXFx1MjcxNyc6J2Nyb3NzJywnXFx1MjcyMCc6J21hbHQnLCdcXHUyNzM2Jzonc2V4dCcsJ1xcdTI3NTgnOidWZXJ0aWNhbFNlcGFyYXRvcicsJ1xcdTI3QzgnOidic29saHN1YicsJ1xcdTI3QzknOidzdXBoc29sJywnXFx1MjdGNSc6J3hsYXJyJywnXFx1MjdGNic6J3hyYXJyJywnXFx1MjdGNyc6J3hoYXJyJywnXFx1MjdGOCc6J3hsQXJyJywnXFx1MjdGOSc6J3hyQXJyJywnXFx1MjdGQSc6J3hoQXJyJywnXFx1MjdGQyc6J3htYXAnLCdcXHUyN0ZGJzonZHppZ3JhcnInLCdcXHUyOTAyJzonbnZsQXJyJywnXFx1MjkwMyc6J252ckFycicsJ1xcdTI5MDQnOidudkhhcnInLCdcXHUyOTA1JzonTWFwJywnXFx1MjkwQyc6J2xiYXJyJywnXFx1MjkwRCc6J3JiYXJyJywnXFx1MjkwRSc6J2xCYXJyJywnXFx1MjkwRic6J3JCYXJyJywnXFx1MjkxMCc6J1JCYXJyJywnXFx1MjkxMSc6J0REb3RyYWhkJywnXFx1MjkxMic6J1VwQXJyb3dCYXInLCdcXHUyOTEzJzonRG93bkFycm93QmFyJywnXFx1MjkxNic6J1JhcnJ0bCcsJ1xcdTI5MTknOidsYXRhaWwnLCdcXHUyOTFBJzoncmF0YWlsJywnXFx1MjkxQic6J2xBdGFpbCcsJ1xcdTI5MUMnOidyQXRhaWwnLCdcXHUyOTFEJzonbGFycmZzJywnXFx1MjkxRSc6J3JhcnJmcycsJ1xcdTI5MUYnOidsYXJyYmZzJywnXFx1MjkyMCc6J3JhcnJiZnMnLCdcXHUyOTIzJzonbndhcmhrJywnXFx1MjkyNCc6J25lYXJoaycsJ1xcdTI5MjUnOidzZWFyaGsnLCdcXHUyOTI2Jzonc3dhcmhrJywnXFx1MjkyNyc6J253bmVhcicsJ1xcdTI5MjgnOid0b2VhJywnXFx1MjkyOSc6J3Rvc2EnLCdcXHUyOTJBJzonc3dud2FyJywnXFx1MjkzMyc6J3JhcnJjJywnXFx1MjkzM1xcdTAzMzgnOiducmFycmMnLCdcXHUyOTM1JzonY3VkYXJycicsJ1xcdTI5MzYnOidsZGNhJywnXFx1MjkzNyc6J3JkY2EnLCdcXHUyOTM4JzonY3VkYXJybCcsJ1xcdTI5MzknOidsYXJycGwnLCdcXHUyOTNDJzonY3VyYXJybScsJ1xcdTI5M0QnOidjdWxhcnJwJywnXFx1Mjk0NSc6J3JhcnJwbCcsJ1xcdTI5NDgnOidoYXJyY2lyJywnXFx1Mjk0OSc6J1VhcnJvY2lyJywnXFx1Mjk0QSc6J2x1cmRzaGFyJywnXFx1Mjk0Qic6J2xkcnVzaGFyJywnXFx1Mjk0RSc6J0xlZnRSaWdodFZlY3RvcicsJ1xcdTI5NEYnOidSaWdodFVwRG93blZlY3RvcicsJ1xcdTI5NTAnOidEb3duTGVmdFJpZ2h0VmVjdG9yJywnXFx1Mjk1MSc6J0xlZnRVcERvd25WZWN0b3InLCdcXHUyOTUyJzonTGVmdFZlY3RvckJhcicsJ1xcdTI5NTMnOidSaWdodFZlY3RvckJhcicsJ1xcdTI5NTQnOidSaWdodFVwVmVjdG9yQmFyJywnXFx1Mjk1NSc6J1JpZ2h0RG93blZlY3RvckJhcicsJ1xcdTI5NTYnOidEb3duTGVmdFZlY3RvckJhcicsJ1xcdTI5NTcnOidEb3duUmlnaHRWZWN0b3JCYXInLCdcXHUyOTU4JzonTGVmdFVwVmVjdG9yQmFyJywnXFx1Mjk1OSc6J0xlZnREb3duVmVjdG9yQmFyJywnXFx1Mjk1QSc6J0xlZnRUZWVWZWN0b3InLCdcXHUyOTVCJzonUmlnaHRUZWVWZWN0b3InLCdcXHUyOTVDJzonUmlnaHRVcFRlZVZlY3RvcicsJ1xcdTI5NUQnOidSaWdodERvd25UZWVWZWN0b3InLCdcXHUyOTVFJzonRG93bkxlZnRUZWVWZWN0b3InLCdcXHUyOTVGJzonRG93blJpZ2h0VGVlVmVjdG9yJywnXFx1Mjk2MCc6J0xlZnRVcFRlZVZlY3RvcicsJ1xcdTI5NjEnOidMZWZ0RG93blRlZVZlY3RvcicsJ1xcdTI5NjInOidsSGFyJywnXFx1Mjk2Myc6J3VIYXInLCdcXHUyOTY0JzonckhhcicsJ1xcdTI5NjUnOidkSGFyJywnXFx1Mjk2Nic6J2x1cnVoYXInLCdcXHUyOTY3JzonbGRyZGhhcicsJ1xcdTI5NjgnOidydWx1aGFyJywnXFx1Mjk2OSc6J3JkbGRoYXInLCdcXHUyOTZBJzonbGhhcnVsJywnXFx1Mjk2Qic6J2xsaGFyZCcsJ1xcdTI5NkMnOidyaGFydWwnLCdcXHUyOTZEJzonbHJoYXJkJywnXFx1Mjk2RSc6J3VkaGFyJywnXFx1Mjk2Ric6J2R1aGFyJywnXFx1Mjk3MCc6J1JvdW5kSW1wbGllcycsJ1xcdTI5NzEnOidlcmFycicsJ1xcdTI5NzInOidzaW1yYXJyJywnXFx1Mjk3Myc6J2xhcnJzaW0nLCdcXHUyOTc0JzoncmFycnNpbScsJ1xcdTI5NzUnOidyYXJyYXAnLCdcXHUyOTc2JzonbHRsYXJyJywnXFx1Mjk3OCc6J2d0cmFycicsJ1xcdTI5NzknOidzdWJyYXJyJywnXFx1Mjk3Qic6J3N1cGxhcnInLCdcXHUyOTdDJzonbGZpc2h0JywnXFx1Mjk3RCc6J3JmaXNodCcsJ1xcdTI5N0UnOid1ZmlzaHQnLCdcXHUyOTdGJzonZGZpc2h0JywnXFx1Mjk5QSc6J3Z6aWd6YWcnLCdcXHUyOTlDJzondmFuZ3J0JywnXFx1Mjk5RCc6J2FuZ3J0dmJkJywnXFx1MjlBNCc6J2FuZ2UnLCdcXHUyOUE1JzoncmFuZ2UnLCdcXHUyOUE2JzonZHdhbmdsZScsJ1xcdTI5QTcnOid1d2FuZ2xlJywnXFx1MjlBOCc6J2FuZ21zZGFhJywnXFx1MjlBOSc6J2FuZ21zZGFiJywnXFx1MjlBQSc6J2FuZ21zZGFjJywnXFx1MjlBQic6J2FuZ21zZGFkJywnXFx1MjlBQyc6J2FuZ21zZGFlJywnXFx1MjlBRCc6J2FuZ21zZGFmJywnXFx1MjlBRSc6J2FuZ21zZGFnJywnXFx1MjlBRic6J2FuZ21zZGFoJywnXFx1MjlCMCc6J2JlbXB0eXYnLCdcXHUyOUIxJzonZGVtcHR5dicsJ1xcdTI5QjInOidjZW1wdHl2JywnXFx1MjlCMyc6J3JhZW1wdHl2JywnXFx1MjlCNCc6J2xhZW1wdHl2JywnXFx1MjlCNSc6J29oYmFyJywnXFx1MjlCNic6J29taWQnLCdcXHUyOUI3Jzonb3BhcicsJ1xcdTI5QjknOidvcGVycCcsJ1xcdTI5QkInOidvbGNyb3NzJywnXFx1MjlCQyc6J29kc29sZCcsJ1xcdTI5QkUnOidvbGNpcicsJ1xcdTI5QkYnOidvZmNpcicsJ1xcdTI5QzAnOidvbHQnLCdcXHUyOUMxJzonb2d0JywnXFx1MjlDMic6J2NpcnNjaXInLCdcXHUyOUMzJzonY2lyRScsJ1xcdTI5QzQnOidzb2xiJywnXFx1MjlDNSc6J2Jzb2xiJywnXFx1MjlDOSc6J2JveGJveCcsJ1xcdTI5Q0QnOid0cmlzYicsJ1xcdTI5Q0UnOidydHJpbHRyaScsJ1xcdTI5Q0YnOidMZWZ0VHJpYW5nbGVCYXInLCdcXHUyOUNGXFx1MDMzOCc6J05vdExlZnRUcmlhbmdsZUJhcicsJ1xcdTI5RDAnOidSaWdodFRyaWFuZ2xlQmFyJywnXFx1MjlEMFxcdTAzMzgnOidOb3RSaWdodFRyaWFuZ2xlQmFyJywnXFx1MjlEQyc6J2lpbmZpbicsJ1xcdTI5REQnOidpbmZpbnRpZScsJ1xcdTI5REUnOidudmluZmluJywnXFx1MjlFMyc6J2VwYXJzbCcsJ1xcdTI5RTQnOidzbWVwYXJzbCcsJ1xcdTI5RTUnOidlcXZwYXJzbCcsJ1xcdTI5RUInOidsb3pmJywnXFx1MjlGNCc6J1J1bGVEZWxheWVkJywnXFx1MjlGNic6J2Rzb2wnLCdcXHUyQTAwJzoneG9kb3QnLCdcXHUyQTAxJzoneG9wbHVzJywnXFx1MkEwMic6J3hvdGltZScsJ1xcdTJBMDQnOid4dXBsdXMnLCdcXHUyQTA2JzoneHNxY3VwJywnXFx1MkEwRCc6J2ZwYXJ0aW50JywnXFx1MkExMCc6J2NpcmZuaW50JywnXFx1MkExMSc6J2F3aW50JywnXFx1MkExMic6J3JwcG9saW50JywnXFx1MkExMyc6J3NjcG9saW50JywnXFx1MkExNCc6J25wb2xpbnQnLCdcXHUyQTE1JzoncG9pbnRpbnQnLCdcXHUyQTE2JzoncXVhdGludCcsJ1xcdTJBMTcnOidpbnRsYXJoaycsJ1xcdTJBMjInOidwbHVzY2lyJywnXFx1MkEyMyc6J3BsdXNhY2lyJywnXFx1MkEyNCc6J3NpbXBsdXMnLCdcXHUyQTI1JzoncGx1c2R1JywnXFx1MkEyNic6J3BsdXNzaW0nLCdcXHUyQTI3JzoncGx1c3R3bycsJ1xcdTJBMjknOidtY29tbWEnLCdcXHUyQTJBJzonbWludXNkdScsJ1xcdTJBMkQnOidsb3BsdXMnLCdcXHUyQTJFJzoncm9wbHVzJywnXFx1MkEyRic6J0Nyb3NzJywnXFx1MkEzMCc6J3RpbWVzZCcsJ1xcdTJBMzEnOid0aW1lc2JhcicsJ1xcdTJBMzMnOidzbWFzaHAnLCdcXHUyQTM0JzonbG90aW1lcycsJ1xcdTJBMzUnOidyb3RpbWVzJywnXFx1MkEzNic6J290aW1lc2FzJywnXFx1MkEzNyc6J090aW1lcycsJ1xcdTJBMzgnOidvZGl2JywnXFx1MkEzOSc6J3RyaXBsdXMnLCdcXHUyQTNBJzondHJpbWludXMnLCdcXHUyQTNCJzondHJpdGltZScsJ1xcdTJBM0MnOidpcHJvZCcsJ1xcdTJBM0YnOidhbWFsZycsJ1xcdTJBNDAnOidjYXBkb3QnLCdcXHUyQTQyJzonbmN1cCcsJ1xcdTJBNDMnOiduY2FwJywnXFx1MkE0NCc6J2NhcGFuZCcsJ1xcdTJBNDUnOidjdXBvcicsJ1xcdTJBNDYnOidjdXBjYXAnLCdcXHUyQTQ3JzonY2FwY3VwJywnXFx1MkE0OCc6J2N1cGJyY2FwJywnXFx1MkE0OSc6J2NhcGJyY3VwJywnXFx1MkE0QSc6J2N1cGN1cCcsJ1xcdTJBNEInOidjYXBjYXAnLCdcXHUyQTRDJzonY2N1cHMnLCdcXHUyQTREJzonY2NhcHMnLCdcXHUyQTUwJzonY2N1cHNzbScsJ1xcdTJBNTMnOidBbmQnLCdcXHUyQTU0JzonT3InLCdcXHUyQTU1JzonYW5kYW5kJywnXFx1MkE1Nic6J29yb3InLCdcXHUyQTU3Jzonb3JzbG9wZScsJ1xcdTJBNTgnOidhbmRzbG9wZScsJ1xcdTJBNUEnOidhbmR2JywnXFx1MkE1Qic6J29ydicsJ1xcdTJBNUMnOidhbmRkJywnXFx1MkE1RCc6J29yZCcsJ1xcdTJBNUYnOid3ZWRiYXInLCdcXHUyQTY2Jzonc2RvdGUnLCdcXHUyQTZBJzonc2ltZG90JywnXFx1MkE2RCc6J2Nvbmdkb3QnLCdcXHUyQTZEXFx1MDMzOCc6J25jb25nZG90JywnXFx1MkE2RSc6J2Vhc3RlcicsJ1xcdTJBNkYnOidhcGFjaXInLCdcXHUyQTcwJzonYXBFJywnXFx1MkE3MFxcdTAzMzgnOiduYXBFJywnXFx1MkE3MSc6J2VwbHVzJywnXFx1MkE3Mic6J3BsdXNlJywnXFx1MkE3Myc6J0VzaW0nLCdcXHUyQTc3JzonZUREb3QnLCdcXHUyQTc4JzonZXF1aXZERCcsJ1xcdTJBNzknOidsdGNpcicsJ1xcdTJBN0EnOidndGNpcicsJ1xcdTJBN0InOidsdHF1ZXN0JywnXFx1MkE3Qyc6J2d0cXVlc3QnLCdcXHUyQTdEJzonbGVzJywnXFx1MkE3RFxcdTAzMzgnOidubGVzJywnXFx1MkE3RSc6J2dlcycsJ1xcdTJBN0VcXHUwMzM4JzonbmdlcycsJ1xcdTJBN0YnOidsZXNkb3QnLCdcXHUyQTgwJzonZ2VzZG90JywnXFx1MkE4MSc6J2xlc2RvdG8nLCdcXHUyQTgyJzonZ2VzZG90bycsJ1xcdTJBODMnOidsZXNkb3RvcicsJ1xcdTJBODQnOidnZXNkb3RvbCcsJ1xcdTJBODUnOidsYXAnLCdcXHUyQTg2JzonZ2FwJywnXFx1MkE4Nyc6J2xuZScsJ1xcdTJBODgnOidnbmUnLCdcXHUyQTg5JzonbG5hcCcsJ1xcdTJBOEEnOidnbmFwJywnXFx1MkE4Qic6J2xFZycsJ1xcdTJBOEMnOidnRWwnLCdcXHUyQThEJzonbHNpbWUnLCdcXHUyQThFJzonZ3NpbWUnLCdcXHUyQThGJzonbHNpbWcnLCdcXHUyQTkwJzonZ3NpbWwnLCdcXHUyQTkxJzonbGdFJywnXFx1MkE5Mic6J2dsRScsJ1xcdTJBOTMnOidsZXNnZXMnLCdcXHUyQTk0JzonZ2VzbGVzJywnXFx1MkE5NSc6J2VscycsJ1xcdTJBOTYnOidlZ3MnLCdcXHUyQTk3JzonZWxzZG90JywnXFx1MkE5OCc6J2Vnc2RvdCcsJ1xcdTJBOTknOidlbCcsJ1xcdTJBOUEnOidlZycsJ1xcdTJBOUQnOidzaW1sJywnXFx1MkE5RSc6J3NpbWcnLCdcXHUyQTlGJzonc2ltbEUnLCdcXHUyQUEwJzonc2ltZ0UnLCdcXHUyQUExJzonTGVzc0xlc3MnLCdcXHUyQUExXFx1MDMzOCc6J05vdE5lc3RlZExlc3NMZXNzJywnXFx1MkFBMic6J0dyZWF0ZXJHcmVhdGVyJywnXFx1MkFBMlxcdTAzMzgnOidOb3ROZXN0ZWRHcmVhdGVyR3JlYXRlcicsJ1xcdTJBQTQnOidnbGonLCdcXHUyQUE1JzonZ2xhJywnXFx1MkFBNic6J2x0Y2MnLCdcXHUyQUE3JzonZ3RjYycsJ1xcdTJBQTgnOidsZXNjYycsJ1xcdTJBQTknOidnZXNjYycsJ1xcdTJBQUEnOidzbXQnLCdcXHUyQUFCJzonbGF0JywnXFx1MkFBQyc6J3NtdGUnLCdcXHUyQUFDXFx1RkUwMCc6J3NtdGVzJywnXFx1MkFBRCc6J2xhdGUnLCdcXHUyQUFEXFx1RkUwMCc6J2xhdGVzJywnXFx1MkFBRSc6J2J1bXBFJywnXFx1MkFBRic6J3ByZScsJ1xcdTJBQUZcXHUwMzM4JzonbnByZScsJ1xcdTJBQjAnOidzY2UnLCdcXHUyQUIwXFx1MDMzOCc6J25zY2UnLCdcXHUyQUIzJzoncHJFJywnXFx1MkFCNCc6J3NjRScsJ1xcdTJBQjUnOidwcm5FJywnXFx1MkFCNic6J3NjbkUnLCdcXHUyQUI3JzoncHJhcCcsJ1xcdTJBQjgnOidzY2FwJywnXFx1MkFCOSc6J3BybmFwJywnXFx1MkFCQSc6J3NjbmFwJywnXFx1MkFCQic6J1ByJywnXFx1MkFCQyc6J1NjJywnXFx1MkFCRCc6J3N1YmRvdCcsJ1xcdTJBQkUnOidzdXBkb3QnLCdcXHUyQUJGJzonc3VicGx1cycsJ1xcdTJBQzAnOidzdXBwbHVzJywnXFx1MkFDMSc6J3N1Ym11bHQnLCdcXHUyQUMyJzonc3VwbXVsdCcsJ1xcdTJBQzMnOidzdWJlZG90JywnXFx1MkFDNCc6J3N1cGVkb3QnLCdcXHUyQUM1Jzonc3ViRScsJ1xcdTJBQzVcXHUwMzM4JzonbnN1YkUnLCdcXHUyQUM2Jzonc3VwRScsJ1xcdTJBQzZcXHUwMzM4JzonbnN1cEUnLCdcXHUyQUM3Jzonc3Vic2ltJywnXFx1MkFDOCc6J3N1cHNpbScsJ1xcdTJBQ0JcXHVGRTAwJzondnN1Ym5FJywnXFx1MkFDQic6J3N1Ym5FJywnXFx1MkFDQ1xcdUZFMDAnOid2c3VwbkUnLCdcXHUyQUNDJzonc3VwbkUnLCdcXHUyQUNGJzonY3N1YicsJ1xcdTJBRDAnOidjc3VwJywnXFx1MkFEMSc6J2NzdWJlJywnXFx1MkFEMic6J2NzdXBlJywnXFx1MkFEMyc6J3N1YnN1cCcsJ1xcdTJBRDQnOidzdXBzdWInLCdcXHUyQUQ1Jzonc3Vic3ViJywnXFx1MkFENic6J3N1cHN1cCcsJ1xcdTJBRDcnOidzdXBoc3ViJywnXFx1MkFEOCc6J3N1cGRzdWInLCdcXHUyQUQ5JzonZm9ya3YnLCdcXHUyQURBJzondG9wZm9yaycsJ1xcdTJBREInOidtbGNwJywnXFx1MkFFNCc6J0Rhc2h2JywnXFx1MkFFNic6J1ZkYXNobCcsJ1xcdTJBRTcnOidCYXJ2JywnXFx1MkFFOCc6J3ZCYXInLCdcXHUyQUU5JzondkJhcnYnLCdcXHUyQUVCJzonVmJhcicsJ1xcdTJBRUMnOidOb3QnLCdcXHUyQUVEJzonYk5vdCcsJ1xcdTJBRUUnOidybm1pZCcsJ1xcdTJBRUYnOidjaXJtaWQnLCdcXHUyQUYwJzonbWlkY2lyJywnXFx1MkFGMSc6J3RvcGNpcicsJ1xcdTJBRjInOiduaHBhcicsJ1xcdTJBRjMnOidwYXJzaW0nLCdcXHUyQUZEJzoncGFyc2wnLCdcXHUyQUZEXFx1MjBFNSc6J25wYXJzbCcsJ1xcdTI2NkQnOidmbGF0JywnXFx1MjY2RSc6J25hdHVyJywnXFx1MjY2Ric6J3NoYXJwJywnXFx4QTQnOidjdXJyZW4nLCdcXHhBMic6J2NlbnQnLCckJzonZG9sbGFyJywnXFx4QTMnOidwb3VuZCcsJ1xceEE1JzoneWVuJywnXFx1MjBBQyc6J2V1cm8nLCdcXHhCOSc6J3N1cDEnLCdcXHhCRCc6J2hhbGYnLCdcXHUyMTUzJzonZnJhYzEzJywnXFx4QkMnOidmcmFjMTQnLCdcXHUyMTU1JzonZnJhYzE1JywnXFx1MjE1OSc6J2ZyYWMxNicsJ1xcdTIxNUInOidmcmFjMTgnLCdcXHhCMic6J3N1cDInLCdcXHUyMTU0JzonZnJhYzIzJywnXFx1MjE1Nic6J2ZyYWMyNScsJ1xceEIzJzonc3VwMycsJ1xceEJFJzonZnJhYzM0JywnXFx1MjE1Nyc6J2ZyYWMzNScsJ1xcdTIxNUMnOidmcmFjMzgnLCdcXHUyMTU4JzonZnJhYzQ1JywnXFx1MjE1QSc6J2ZyYWM1NicsJ1xcdTIxNUQnOidmcmFjNTgnLCdcXHUyMTVFJzonZnJhYzc4JywnXFx1RDgzNVxcdURDQjYnOidhc2NyJywnXFx1RDgzNVxcdURENTInOidhb3BmJywnXFx1RDgzNVxcdUREMUUnOidhZnInLCdcXHVEODM1XFx1REQzOCc6J0FvcGYnLCdcXHVEODM1XFx1REQwNCc6J0FmcicsJ1xcdUQ4MzVcXHVEQzlDJzonQXNjcicsJ1xceEFBJzonb3JkZicsJ1xceEUxJzonYWFjdXRlJywnXFx4QzEnOidBYWN1dGUnLCdcXHhFMCc6J2FncmF2ZScsJ1xceEMwJzonQWdyYXZlJywnXFx1MDEwMyc6J2FicmV2ZScsJ1xcdTAxMDInOidBYnJldmUnLCdcXHhFMic6J2FjaXJjJywnXFx4QzInOidBY2lyYycsJ1xceEU1JzonYXJpbmcnLCdcXHhDNSc6J2FuZ3N0JywnXFx4RTQnOidhdW1sJywnXFx4QzQnOidBdW1sJywnXFx4RTMnOidhdGlsZGUnLCdcXHhDMyc6J0F0aWxkZScsJ1xcdTAxMDUnOidhb2dvbicsJ1xcdTAxMDQnOidBb2dvbicsJ1xcdTAxMDEnOidhbWFjcicsJ1xcdTAxMDAnOidBbWFjcicsJ1xceEU2JzonYWVsaWcnLCdcXHhDNic6J0FFbGlnJywnXFx1RDgzNVxcdURDQjcnOidic2NyJywnXFx1RDgzNVxcdURENTMnOidib3BmJywnXFx1RDgzNVxcdUREMUYnOidiZnInLCdcXHVEODM1XFx1REQzOSc6J0JvcGYnLCdcXHUyMTJDJzonQnNjcicsJ1xcdUQ4MzVcXHVERDA1JzonQmZyJywnXFx1RDgzNVxcdUREMjAnOidjZnInLCdcXHVEODM1XFx1RENCOCc6J2NzY3InLCdcXHVEODM1XFx1REQ1NCc6J2NvcGYnLCdcXHUyMTJEJzonQ2ZyJywnXFx1RDgzNVxcdURDOUUnOidDc2NyJywnXFx1MjEwMic6J0NvcGYnLCdcXHUwMTA3JzonY2FjdXRlJywnXFx1MDEwNic6J0NhY3V0ZScsJ1xcdTAxMDknOidjY2lyYycsJ1xcdTAxMDgnOidDY2lyYycsJ1xcdTAxMEQnOidjY2Fyb24nLCdcXHUwMTBDJzonQ2Nhcm9uJywnXFx1MDEwQic6J2Nkb3QnLCdcXHUwMTBBJzonQ2RvdCcsJ1xceEU3JzonY2NlZGlsJywnXFx4QzcnOidDY2VkaWwnLCdcXHUyMTA1JzonaW5jYXJlJywnXFx1RDgzNVxcdUREMjEnOidkZnInLCdcXHUyMTQ2JzonZGQnLCdcXHVEODM1XFx1REQ1NSc6J2RvcGYnLCdcXHVEODM1XFx1RENCOSc6J2RzY3InLCdcXHVEODM1XFx1REM5Ric6J0RzY3InLCdcXHVEODM1XFx1REQwNyc6J0RmcicsJ1xcdTIxNDUnOidERCcsJ1xcdUQ4MzVcXHVERDNCJzonRG9wZicsJ1xcdTAxMEYnOidkY2Fyb24nLCdcXHUwMTBFJzonRGNhcm9uJywnXFx1MDExMSc6J2RzdHJvaycsJ1xcdTAxMTAnOidEc3Ryb2snLCdcXHhGMCc6J2V0aCcsJ1xceEQwJzonRVRIJywnXFx1MjE0Nyc6J2VlJywnXFx1MjEyRic6J2VzY3InLCdcXHVEODM1XFx1REQyMic6J2VmcicsJ1xcdUQ4MzVcXHVERDU2JzonZW9wZicsJ1xcdTIxMzAnOidFc2NyJywnXFx1RDgzNVxcdUREMDgnOidFZnInLCdcXHVEODM1XFx1REQzQyc6J0VvcGYnLCdcXHhFOSc6J2VhY3V0ZScsJ1xceEM5JzonRWFjdXRlJywnXFx4RTgnOidlZ3JhdmUnLCdcXHhDOCc6J0VncmF2ZScsJ1xceEVBJzonZWNpcmMnLCdcXHhDQSc6J0VjaXJjJywnXFx1MDExQic6J2VjYXJvbicsJ1xcdTAxMUEnOidFY2Fyb24nLCdcXHhFQic6J2V1bWwnLCdcXHhDQic6J0V1bWwnLCdcXHUwMTE3JzonZWRvdCcsJ1xcdTAxMTYnOidFZG90JywnXFx1MDExOSc6J2VvZ29uJywnXFx1MDExOCc6J0VvZ29uJywnXFx1MDExMyc6J2VtYWNyJywnXFx1MDExMic6J0VtYWNyJywnXFx1RDgzNVxcdUREMjMnOidmZnInLCdcXHVEODM1XFx1REQ1Nyc6J2ZvcGYnLCdcXHVEODM1XFx1RENCQic6J2ZzY3InLCdcXHVEODM1XFx1REQwOSc6J0ZmcicsJ1xcdUQ4MzVcXHVERDNEJzonRm9wZicsJ1xcdTIxMzEnOidGc2NyJywnXFx1RkIwMCc6J2ZmbGlnJywnXFx1RkIwMyc6J2ZmaWxpZycsJ1xcdUZCMDQnOidmZmxsaWcnLCdcXHVGQjAxJzonZmlsaWcnLCdmaic6J2ZqbGlnJywnXFx1RkIwMic6J2ZsbGlnJywnXFx1MDE5Mic6J2Zub2YnLCdcXHUyMTBBJzonZ3NjcicsJ1xcdUQ4MzVcXHVERDU4JzonZ29wZicsJ1xcdUQ4MzVcXHVERDI0JzonZ2ZyJywnXFx1RDgzNVxcdURDQTInOidHc2NyJywnXFx1RDgzNVxcdUREM0UnOidHb3BmJywnXFx1RDgzNVxcdUREMEEnOidHZnInLCdcXHUwMUY1JzonZ2FjdXRlJywnXFx1MDExRic6J2dicmV2ZScsJ1xcdTAxMUUnOidHYnJldmUnLCdcXHUwMTFEJzonZ2NpcmMnLCdcXHUwMTFDJzonR2NpcmMnLCdcXHUwMTIxJzonZ2RvdCcsJ1xcdTAxMjAnOidHZG90JywnXFx1MDEyMic6J0djZWRpbCcsJ1xcdUQ4MzVcXHVERDI1JzonaGZyJywnXFx1MjEwRSc6J3BsYW5ja2gnLCdcXHVEODM1XFx1RENCRCc6J2hzY3InLCdcXHVEODM1XFx1REQ1OSc6J2hvcGYnLCdcXHUyMTBCJzonSHNjcicsJ1xcdTIxMEMnOidIZnInLCdcXHUyMTBEJzonSG9wZicsJ1xcdTAxMjUnOidoY2lyYycsJ1xcdTAxMjQnOidIY2lyYycsJ1xcdTIxMEYnOidoYmFyJywnXFx1MDEyNyc6J2hzdHJvaycsJ1xcdTAxMjYnOidIc3Ryb2snLCdcXHVEODM1XFx1REQ1QSc6J2lvcGYnLCdcXHVEODM1XFx1REQyNic6J2lmcicsJ1xcdUQ4MzVcXHVEQ0JFJzonaXNjcicsJ1xcdTIxNDgnOidpaScsJ1xcdUQ4MzVcXHVERDQwJzonSW9wZicsJ1xcdTIxMTAnOidJc2NyJywnXFx1MjExMSc6J0ltJywnXFx4RUQnOidpYWN1dGUnLCdcXHhDRCc6J0lhY3V0ZScsJ1xceEVDJzonaWdyYXZlJywnXFx4Q0MnOidJZ3JhdmUnLCdcXHhFRSc6J2ljaXJjJywnXFx4Q0UnOidJY2lyYycsJ1xceEVGJzonaXVtbCcsJ1xceENGJzonSXVtbCcsJ1xcdTAxMjknOidpdGlsZGUnLCdcXHUwMTI4JzonSXRpbGRlJywnXFx1MDEzMCc6J0lkb3QnLCdcXHUwMTJGJzonaW9nb24nLCdcXHUwMTJFJzonSW9nb24nLCdcXHUwMTJCJzonaW1hY3InLCdcXHUwMTJBJzonSW1hY3InLCdcXHUwMTMzJzonaWpsaWcnLCdcXHUwMTMyJzonSUpsaWcnLCdcXHUwMTMxJzonaW1hdGgnLCdcXHVEODM1XFx1RENCRic6J2pzY3InLCdcXHVEODM1XFx1REQ1Qic6J2pvcGYnLCdcXHVEODM1XFx1REQyNyc6J2pmcicsJ1xcdUQ4MzVcXHVEQ0E1JzonSnNjcicsJ1xcdUQ4MzVcXHVERDBEJzonSmZyJywnXFx1RDgzNVxcdURENDEnOidKb3BmJywnXFx1MDEzNSc6J2pjaXJjJywnXFx1MDEzNCc6J0pjaXJjJywnXFx1MDIzNyc6J2ptYXRoJywnXFx1RDgzNVxcdURENUMnOidrb3BmJywnXFx1RDgzNVxcdURDQzAnOidrc2NyJywnXFx1RDgzNVxcdUREMjgnOidrZnInLCdcXHVEODM1XFx1RENBNic6J0tzY3InLCdcXHVEODM1XFx1REQ0Mic6J0tvcGYnLCdcXHVEODM1XFx1REQwRSc6J0tmcicsJ1xcdTAxMzcnOidrY2VkaWwnLCdcXHUwMTM2JzonS2NlZGlsJywnXFx1RDgzNVxcdUREMjknOidsZnInLCdcXHVEODM1XFx1RENDMSc6J2xzY3InLCdcXHUyMTEzJzonZWxsJywnXFx1RDgzNVxcdURENUQnOidsb3BmJywnXFx1MjExMic6J0xzY3InLCdcXHVEODM1XFx1REQwRic6J0xmcicsJ1xcdUQ4MzVcXHVERDQzJzonTG9wZicsJ1xcdTAxM0EnOidsYWN1dGUnLCdcXHUwMTM5JzonTGFjdXRlJywnXFx1MDEzRSc6J2xjYXJvbicsJ1xcdTAxM0QnOidMY2Fyb24nLCdcXHUwMTNDJzonbGNlZGlsJywnXFx1MDEzQic6J0xjZWRpbCcsJ1xcdTAxNDInOidsc3Ryb2snLCdcXHUwMTQxJzonTHN0cm9rJywnXFx1MDE0MCc6J2xtaWRvdCcsJ1xcdTAxM0YnOidMbWlkb3QnLCdcXHVEODM1XFx1REQyQSc6J21mcicsJ1xcdUQ4MzVcXHVERDVFJzonbW9wZicsJ1xcdUQ4MzVcXHVEQ0MyJzonbXNjcicsJ1xcdUQ4MzVcXHVERDEwJzonTWZyJywnXFx1RDgzNVxcdURENDQnOidNb3BmJywnXFx1MjEzMyc6J01zY3InLCdcXHVEODM1XFx1REQyQic6J25mcicsJ1xcdUQ4MzVcXHVERDVGJzonbm9wZicsJ1xcdUQ4MzVcXHVEQ0MzJzonbnNjcicsJ1xcdTIxMTUnOidOb3BmJywnXFx1RDgzNVxcdURDQTknOidOc2NyJywnXFx1RDgzNVxcdUREMTEnOidOZnInLCdcXHUwMTQ0JzonbmFjdXRlJywnXFx1MDE0Myc6J05hY3V0ZScsJ1xcdTAxNDgnOiduY2Fyb24nLCdcXHUwMTQ3JzonTmNhcm9uJywnXFx4RjEnOidudGlsZGUnLCdcXHhEMSc6J050aWxkZScsJ1xcdTAxNDYnOiduY2VkaWwnLCdcXHUwMTQ1JzonTmNlZGlsJywnXFx1MjExNic6J251bWVybycsJ1xcdTAxNEInOidlbmcnLCdcXHUwMTRBJzonRU5HJywnXFx1RDgzNVxcdURENjAnOidvb3BmJywnXFx1RDgzNVxcdUREMkMnOidvZnInLCdcXHUyMTM0Jzonb3NjcicsJ1xcdUQ4MzVcXHVEQ0FBJzonT3NjcicsJ1xcdUQ4MzVcXHVERDEyJzonT2ZyJywnXFx1RDgzNVxcdURENDYnOidPb3BmJywnXFx4QkEnOidvcmRtJywnXFx4RjMnOidvYWN1dGUnLCdcXHhEMyc6J09hY3V0ZScsJ1xceEYyJzonb2dyYXZlJywnXFx4RDInOidPZ3JhdmUnLCdcXHhGNCc6J29jaXJjJywnXFx4RDQnOidPY2lyYycsJ1xceEY2Jzonb3VtbCcsJ1xceEQ2JzonT3VtbCcsJ1xcdTAxNTEnOidvZGJsYWMnLCdcXHUwMTUwJzonT2RibGFjJywnXFx4RjUnOidvdGlsZGUnLCdcXHhENSc6J090aWxkZScsJ1xceEY4Jzonb3NsYXNoJywnXFx4RDgnOidPc2xhc2gnLCdcXHUwMTREJzonb21hY3InLCdcXHUwMTRDJzonT21hY3InLCdcXHUwMTUzJzonb2VsaWcnLCdcXHUwMTUyJzonT0VsaWcnLCdcXHVEODM1XFx1REQyRCc6J3BmcicsJ1xcdUQ4MzVcXHVEQ0M1JzoncHNjcicsJ1xcdUQ4MzVcXHVERDYxJzoncG9wZicsJ1xcdTIxMTknOidQb3BmJywnXFx1RDgzNVxcdUREMTMnOidQZnInLCdcXHVEODM1XFx1RENBQic6J1BzY3InLCdcXHVEODM1XFx1REQ2Mic6J3FvcGYnLCdcXHVEODM1XFx1REQyRSc6J3FmcicsJ1xcdUQ4MzVcXHVEQ0M2JzoncXNjcicsJ1xcdUQ4MzVcXHVEQ0FDJzonUXNjcicsJ1xcdUQ4MzVcXHVERDE0JzonUWZyJywnXFx1MjExQSc6J1FvcGYnLCdcXHUwMTM4Jzona2dyZWVuJywnXFx1RDgzNVxcdUREMkYnOidyZnInLCdcXHVEODM1XFx1REQ2Myc6J3JvcGYnLCdcXHVEODM1XFx1RENDNyc6J3JzY3InLCdcXHUyMTFCJzonUnNjcicsJ1xcdTIxMUMnOidSZScsJ1xcdTIxMUQnOidSb3BmJywnXFx1MDE1NSc6J3JhY3V0ZScsJ1xcdTAxNTQnOidSYWN1dGUnLCdcXHUwMTU5JzoncmNhcm9uJywnXFx1MDE1OCc6J1JjYXJvbicsJ1xcdTAxNTcnOidyY2VkaWwnLCdcXHUwMTU2JzonUmNlZGlsJywnXFx1RDgzNVxcdURENjQnOidzb3BmJywnXFx1RDgzNVxcdURDQzgnOidzc2NyJywnXFx1RDgzNVxcdUREMzAnOidzZnInLCdcXHVEODM1XFx1REQ0QSc6J1NvcGYnLCdcXHVEODM1XFx1REQxNic6J1NmcicsJ1xcdUQ4MzVcXHVEQ0FFJzonU3NjcicsJ1xcdTI0QzgnOidvUycsJ1xcdTAxNUInOidzYWN1dGUnLCdcXHUwMTVBJzonU2FjdXRlJywnXFx1MDE1RCc6J3NjaXJjJywnXFx1MDE1Qyc6J1NjaXJjJywnXFx1MDE2MSc6J3NjYXJvbicsJ1xcdTAxNjAnOidTY2Fyb24nLCdcXHUwMTVGJzonc2NlZGlsJywnXFx1MDE1RSc6J1NjZWRpbCcsJ1xceERGJzonc3psaWcnLCdcXHVEODM1XFx1REQzMSc6J3RmcicsJ1xcdUQ4MzVcXHVEQ0M5JzondHNjcicsJ1xcdUQ4MzVcXHVERDY1JzondG9wZicsJ1xcdUQ4MzVcXHVEQ0FGJzonVHNjcicsJ1xcdUQ4MzVcXHVERDE3JzonVGZyJywnXFx1RDgzNVxcdURENEInOidUb3BmJywnXFx1MDE2NSc6J3RjYXJvbicsJ1xcdTAxNjQnOidUY2Fyb24nLCdcXHUwMTYzJzondGNlZGlsJywnXFx1MDE2Mic6J1RjZWRpbCcsJ1xcdTIxMjInOid0cmFkZScsJ1xcdTAxNjcnOid0c3Ryb2snLCdcXHUwMTY2JzonVHN0cm9rJywnXFx1RDgzNVxcdURDQ0EnOid1c2NyJywnXFx1RDgzNVxcdURENjYnOid1b3BmJywnXFx1RDgzNVxcdUREMzInOid1ZnInLCdcXHVEODM1XFx1REQ0Qyc6J1VvcGYnLCdcXHVEODM1XFx1REQxOCc6J1VmcicsJ1xcdUQ4MzVcXHVEQ0IwJzonVXNjcicsJ1xceEZBJzondWFjdXRlJywnXFx4REEnOidVYWN1dGUnLCdcXHhGOSc6J3VncmF2ZScsJ1xceEQ5JzonVWdyYXZlJywnXFx1MDE2RCc6J3VicmV2ZScsJ1xcdTAxNkMnOidVYnJldmUnLCdcXHhGQic6J3VjaXJjJywnXFx4REInOidVY2lyYycsJ1xcdTAxNkYnOid1cmluZycsJ1xcdTAxNkUnOidVcmluZycsJ1xceEZDJzondXVtbCcsJ1xceERDJzonVXVtbCcsJ1xcdTAxNzEnOid1ZGJsYWMnLCdcXHUwMTcwJzonVWRibGFjJywnXFx1MDE2OSc6J3V0aWxkZScsJ1xcdTAxNjgnOidVdGlsZGUnLCdcXHUwMTczJzondW9nb24nLCdcXHUwMTcyJzonVW9nb24nLCdcXHUwMTZCJzondW1hY3InLCdcXHUwMTZBJzonVW1hY3InLCdcXHVEODM1XFx1REQzMyc6J3ZmcicsJ1xcdUQ4MzVcXHVERDY3Jzondm9wZicsJ1xcdUQ4MzVcXHVEQ0NCJzondnNjcicsJ1xcdUQ4MzVcXHVERDE5JzonVmZyJywnXFx1RDgzNVxcdURENEQnOidWb3BmJywnXFx1RDgzNVxcdURDQjEnOidWc2NyJywnXFx1RDgzNVxcdURENjgnOid3b3BmJywnXFx1RDgzNVxcdURDQ0MnOid3c2NyJywnXFx1RDgzNVxcdUREMzQnOid3ZnInLCdcXHVEODM1XFx1RENCMic6J1dzY3InLCdcXHVEODM1XFx1REQ0RSc6J1dvcGYnLCdcXHVEODM1XFx1REQxQSc6J1dmcicsJ1xcdTAxNzUnOid3Y2lyYycsJ1xcdTAxNzQnOidXY2lyYycsJ1xcdUQ4MzVcXHVERDM1JzoneGZyJywnXFx1RDgzNVxcdURDQ0QnOid4c2NyJywnXFx1RDgzNVxcdURENjknOid4b3BmJywnXFx1RDgzNVxcdURENEYnOidYb3BmJywnXFx1RDgzNVxcdUREMUInOidYZnInLCdcXHVEODM1XFx1RENCMyc6J1hzY3InLCdcXHVEODM1XFx1REQzNic6J3lmcicsJ1xcdUQ4MzVcXHVEQ0NFJzoneXNjcicsJ1xcdUQ4MzVcXHVERDZBJzoneW9wZicsJ1xcdUQ4MzVcXHVEQ0I0JzonWXNjcicsJ1xcdUQ4MzVcXHVERDFDJzonWWZyJywnXFx1RDgzNVxcdURENTAnOidZb3BmJywnXFx4RkQnOid5YWN1dGUnLCdcXHhERCc6J1lhY3V0ZScsJ1xcdTAxNzcnOid5Y2lyYycsJ1xcdTAxNzYnOidZY2lyYycsJ1xceEZGJzoneXVtbCcsJ1xcdTAxNzgnOidZdW1sJywnXFx1RDgzNVxcdURDQ0YnOid6c2NyJywnXFx1RDgzNVxcdUREMzcnOid6ZnInLCdcXHVEODM1XFx1REQ2Qic6J3pvcGYnLCdcXHUyMTI4JzonWmZyJywnXFx1MjEyNCc6J1pvcGYnLCdcXHVEODM1XFx1RENCNSc6J1pzY3InLCdcXHUwMTdBJzonemFjdXRlJywnXFx1MDE3OSc6J1phY3V0ZScsJ1xcdTAxN0UnOid6Y2Fyb24nLCdcXHUwMTdEJzonWmNhcm9uJywnXFx1MDE3Qyc6J3pkb3QnLCdcXHUwMTdCJzonWmRvdCcsJ1xcdTAxQjUnOidpbXBlZCcsJ1xceEZFJzondGhvcm4nLCdcXHhERSc6J1RIT1JOJywnXFx1MDE0OSc6J25hcG9zJywnXFx1MDNCMSc6J2FscGhhJywnXFx1MDM5MSc6J0FscGhhJywnXFx1MDNCMic6J2JldGEnLCdcXHUwMzkyJzonQmV0YScsJ1xcdTAzQjMnOidnYW1tYScsJ1xcdTAzOTMnOidHYW1tYScsJ1xcdTAzQjQnOidkZWx0YScsJ1xcdTAzOTQnOidEZWx0YScsJ1xcdTAzQjUnOidlcHNpJywnXFx1MDNGNSc6J2Vwc2l2JywnXFx1MDM5NSc6J0Vwc2lsb24nLCdcXHUwM0REJzonZ2FtbWFkJywnXFx1MDNEQyc6J0dhbW1hZCcsJ1xcdTAzQjYnOid6ZXRhJywnXFx1MDM5Nic6J1pldGEnLCdcXHUwM0I3JzonZXRhJywnXFx1MDM5Nyc6J0V0YScsJ1xcdTAzQjgnOid0aGV0YScsJ1xcdTAzRDEnOid0aGV0YXYnLCdcXHUwMzk4JzonVGhldGEnLCdcXHUwM0I5JzonaW90YScsJ1xcdTAzOTknOidJb3RhJywnXFx1MDNCQSc6J2thcHBhJywnXFx1MDNGMCc6J2thcHBhdicsJ1xcdTAzOUEnOidLYXBwYScsJ1xcdTAzQkInOidsYW1iZGEnLCdcXHUwMzlCJzonTGFtYmRhJywnXFx1MDNCQyc6J211JywnXFx4QjUnOidtaWNybycsJ1xcdTAzOUMnOidNdScsJ1xcdTAzQkQnOidudScsJ1xcdTAzOUQnOidOdScsJ1xcdTAzQkUnOid4aScsJ1xcdTAzOUUnOidYaScsJ1xcdTAzQkYnOidvbWljcm9uJywnXFx1MDM5Ric6J09taWNyb24nLCdcXHUwM0MwJzoncGknLCdcXHUwM0Q2JzoncGl2JywnXFx1MDNBMCc6J1BpJywnXFx1MDNDMSc6J3JobycsJ1xcdTAzRjEnOidyaG92JywnXFx1MDNBMSc6J1JobycsJ1xcdTAzQzMnOidzaWdtYScsJ1xcdTAzQTMnOidTaWdtYScsJ1xcdTAzQzInOidzaWdtYWYnLCdcXHUwM0M0JzondGF1JywnXFx1MDNBNCc6J1RhdScsJ1xcdTAzQzUnOid1cHNpJywnXFx1MDNBNSc6J1Vwc2lsb24nLCdcXHUwM0QyJzonVXBzaScsJ1xcdTAzQzYnOidwaGknLCdcXHUwM0Q1JzoncGhpdicsJ1xcdTAzQTYnOidQaGknLCdcXHUwM0M3JzonY2hpJywnXFx1MDNBNyc6J0NoaScsJ1xcdTAzQzgnOidwc2knLCdcXHUwM0E4JzonUHNpJywnXFx1MDNDOSc6J29tZWdhJywnXFx1MDNBOSc6J29obScsJ1xcdTA0MzAnOidhY3knLCdcXHUwNDEwJzonQWN5JywnXFx1MDQzMSc6J2JjeScsJ1xcdTA0MTEnOidCY3knLCdcXHUwNDMyJzondmN5JywnXFx1MDQxMic6J1ZjeScsJ1xcdTA0MzMnOidnY3knLCdcXHUwNDEzJzonR2N5JywnXFx1MDQ1Myc6J2dqY3knLCdcXHUwNDAzJzonR0pjeScsJ1xcdTA0MzQnOidkY3knLCdcXHUwNDE0JzonRGN5JywnXFx1MDQ1Mic6J2RqY3knLCdcXHUwNDAyJzonREpjeScsJ1xcdTA0MzUnOidpZWN5JywnXFx1MDQxNSc6J0lFY3knLCdcXHUwNDUxJzonaW9jeScsJ1xcdTA0MDEnOidJT2N5JywnXFx1MDQ1NCc6J2p1a2N5JywnXFx1MDQwNCc6J0p1a2N5JywnXFx1MDQzNic6J3poY3knLCdcXHUwNDE2JzonWkhjeScsJ1xcdTA0MzcnOid6Y3knLCdcXHUwNDE3JzonWmN5JywnXFx1MDQ1NSc6J2RzY3knLCdcXHUwNDA1JzonRFNjeScsJ1xcdTA0MzgnOidpY3knLCdcXHUwNDE4JzonSWN5JywnXFx1MDQ1Nic6J2l1a2N5JywnXFx1MDQwNic6J0l1a2N5JywnXFx1MDQ1Nyc6J3lpY3knLCdcXHUwNDA3JzonWUljeScsJ1xcdTA0MzknOidqY3knLCdcXHUwNDE5JzonSmN5JywnXFx1MDQ1OCc6J2pzZXJjeScsJ1xcdTA0MDgnOidKc2VyY3knLCdcXHUwNDNBJzona2N5JywnXFx1MDQxQSc6J0tjeScsJ1xcdTA0NUMnOidramN5JywnXFx1MDQwQyc6J0tKY3knLCdcXHUwNDNCJzonbGN5JywnXFx1MDQxQic6J0xjeScsJ1xcdTA0NTknOidsamN5JywnXFx1MDQwOSc6J0xKY3knLCdcXHUwNDNDJzonbWN5JywnXFx1MDQxQyc6J01jeScsJ1xcdTA0M0QnOiduY3knLCdcXHUwNDFEJzonTmN5JywnXFx1MDQ1QSc6J25qY3knLCdcXHUwNDBBJzonTkpjeScsJ1xcdTA0M0UnOidvY3knLCdcXHUwNDFFJzonT2N5JywnXFx1MDQzRic6J3BjeScsJ1xcdTA0MUYnOidQY3knLCdcXHUwNDQwJzoncmN5JywnXFx1MDQyMCc6J1JjeScsJ1xcdTA0NDEnOidzY3knLCdcXHUwNDIxJzonU2N5JywnXFx1MDQ0Mic6J3RjeScsJ1xcdTA0MjInOidUY3knLCdcXHUwNDVCJzondHNoY3knLCdcXHUwNDBCJzonVFNIY3knLCdcXHUwNDQzJzondWN5JywnXFx1MDQyMyc6J1VjeScsJ1xcdTA0NUUnOid1YnJjeScsJ1xcdTA0MEUnOidVYnJjeScsJ1xcdTA0NDQnOidmY3knLCdcXHUwNDI0JzonRmN5JywnXFx1MDQ0NSc6J2toY3knLCdcXHUwNDI1JzonS0hjeScsJ1xcdTA0NDYnOid0c2N5JywnXFx1MDQyNic6J1RTY3knLCdcXHUwNDQ3JzonY2hjeScsJ1xcdTA0MjcnOidDSGN5JywnXFx1MDQ1Ric6J2R6Y3knLCdcXHUwNDBGJzonRFpjeScsJ1xcdTA0NDgnOidzaGN5JywnXFx1MDQyOCc6J1NIY3knLCdcXHUwNDQ5Jzonc2hjaGN5JywnXFx1MDQyOSc6J1NIQ0hjeScsJ1xcdTA0NEEnOidoYXJkY3knLCdcXHUwNDJBJzonSEFSRGN5JywnXFx1MDQ0Qic6J3ljeScsJ1xcdTA0MkInOidZY3knLCdcXHUwNDRDJzonc29mdGN5JywnXFx1MDQyQyc6J1NPRlRjeScsJ1xcdTA0NEQnOidlY3knLCdcXHUwNDJEJzonRWN5JywnXFx1MDQ0RSc6J3l1Y3knLCdcXHUwNDJFJzonWVVjeScsJ1xcdTA0NEYnOid5YWN5JywnXFx1MDQyRic6J1lBY3knLCdcXHUyMTM1JzonYWxlcGgnLCdcXHUyMTM2JzonYmV0aCcsJ1xcdTIxMzcnOidnaW1lbCcsJ1xcdTIxMzgnOidkYWxldGgnfTtcblxuXHR2YXIgcmVnZXhFc2NhcGUgPSAvW1wiJic8PmBdL2c7XG5cdHZhciBlc2NhcGVNYXAgPSB7XG5cdFx0J1wiJzogJyZxdW90OycsXG5cdFx0JyYnOiAnJmFtcDsnLFxuXHRcdCdcXCcnOiAnJiN4Mjc7Jyxcblx0XHQnPCc6ICcmbHQ7Jyxcblx0XHQvLyBTZWUgaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2FtYmlndW91cy1hbXBlcnNhbmRzOiBpbiBIVE1MLCB0aGVcblx0XHQvLyBmb2xsb3dpbmcgaXMgbm90IHN0cmljdGx5IG5lY2Vzc2FyeSB1bmxlc3MgaXTigJlzIHBhcnQgb2YgYSB0YWcgb3IgYW5cblx0XHQvLyB1bnF1b3RlZCBhdHRyaWJ1dGUgdmFsdWUuIFdl4oCZcmUgb25seSBlc2NhcGluZyBpdCB0byBzdXBwb3J0IHRob3NlXG5cdFx0Ly8gc2l0dWF0aW9ucywgYW5kIGZvciBYTUwgc3VwcG9ydC5cblx0XHQnPic6ICcmZ3Q7Jyxcblx0XHQvLyBJbiBJbnRlcm5ldCBFeHBsb3JlciDiiaQgOCwgdGhlIGJhY2t0aWNrIGNoYXJhY3RlciBjYW4gYmUgdXNlZFxuXHRcdC8vIHRvIGJyZWFrIG91dCBvZiAodW4pcXVvdGVkIGF0dHJpYnV0ZSB2YWx1ZXMgb3IgSFRNTCBjb21tZW50cy5cblx0XHQvLyBTZWUgaHR0cDovL2h0bWw1c2VjLm9yZy8jMTAyLCBodHRwOi8vaHRtbDVzZWMub3JnLyMxMDgsIGFuZFxuXHRcdC8vIGh0dHA6Ly9odG1sNXNlYy5vcmcvIzEzMy5cblx0XHQnYCc6ICcmI3g2MDsnXG5cdH07XG5cblx0dmFyIHJlZ2V4SW52YWxpZEVudGl0eSA9IC8mIyg/Olt4WF1bXmEtZkEtRjAtOV18W14wLTl4WF0pLztcblx0dmFyIHJlZ2V4SW52YWxpZFJhd0NvZGVQb2ludCA9IC9bXFwwLVxceDA4XFx4MEJcXHgwRS1cXHgxRlxceDdGLVxceDlGXFx1RkREMC1cXHVGREVGXFx1RkZGRVxcdUZGRkZdfFtcXHVEODNGXFx1RDg3RlxcdUQ4QkZcXHVEOEZGXFx1RDkzRlxcdUQ5N0ZcXHVEOUJGXFx1RDlGRlxcdURBM0ZcXHVEQTdGXFx1REFCRlxcdURBRkZcXHVEQjNGXFx1REI3RlxcdURCQkZcXHVEQkZGXVtcXHVERkZFXFx1REZGRl18W1xcdUQ4MDAtXFx1REJGRl0oPyFbXFx1REMwMC1cXHVERkZGXSl8KD86W15cXHVEODAwLVxcdURCRkZdfF4pW1xcdURDMDAtXFx1REZGRl0vO1xuXHR2YXIgcmVnZXhEZWNvZGUgPSAvJihDb3VudGVyQ2xvY2t3aXNlQ29udG91ckludGVncmFsfERvdWJsZUxvbmdMZWZ0UmlnaHRBcnJvd3xDbG9ja3dpc2VDb250b3VySW50ZWdyYWx8Tm90TmVzdGVkR3JlYXRlckdyZWF0ZXJ8Tm90U3F1YXJlU3VwZXJzZXRFcXVhbHxEaWFjcml0aWNhbERvdWJsZUFjdXRlfE5vdFJpZ2h0VHJpYW5nbGVFcXVhbHxOb3RTdWNjZWVkc1NsYW50RXF1YWx8Tm90UHJlY2VkZXNTbGFudEVxdWFsfENsb3NlQ3VybHlEb3VibGVRdW90ZXxOZWdhdGl2ZVZlcnlUaGluU3BhY2V8RG91YmxlQ29udG91ckludGVncmFsfEZpbGxlZFZlcnlTbWFsbFNxdWFyZXxDYXBpdGFsRGlmZmVyZW50aWFsRHxPcGVuQ3VybHlEb3VibGVRdW90ZXxFbXB0eVZlcnlTbWFsbFNxdWFyZXxOZXN0ZWRHcmVhdGVyR3JlYXRlcnxEb3VibGVMb25nUmlnaHRBcnJvd3xOb3RMZWZ0VHJpYW5nbGVFcXVhbHxOb3RHcmVhdGVyU2xhbnRFcXVhbHxSZXZlcnNlVXBFcXVpbGlicml1bXxEb3VibGVMZWZ0UmlnaHRBcnJvd3xOb3RTcXVhcmVTdWJzZXRFcXVhbHxOb3REb3VibGVWZXJ0aWNhbEJhcnxSaWdodEFycm93TGVmdEFycm93fE5vdEdyZWF0ZXJGdWxsRXF1YWx8Tm90UmlnaHRUcmlhbmdsZUJhcnxTcXVhcmVTdXBlcnNldEVxdWFsfERvd25MZWZ0UmlnaHRWZWN0b3J8RG91YmxlTG9uZ0xlZnRBcnJvd3xsZWZ0cmlnaHRzcXVpZ2Fycm93fExlZnRBcnJvd1JpZ2h0QXJyb3d8TmVnYXRpdmVNZWRpdW1TcGFjZXxibGFja3RyaWFuZ2xlcmlnaHR8UmlnaHREb3duVmVjdG9yQmFyfFByZWNlZGVzU2xhbnRFcXVhbHxSaWdodERvdWJsZUJyYWNrZXR8U3VjY2VlZHNTbGFudEVxdWFsfE5vdExlZnRUcmlhbmdsZUJhcnxSaWdodFRyaWFuZ2xlRXF1YWx8U3F1YXJlSW50ZXJzZWN0aW9ufFJpZ2h0RG93blRlZVZlY3RvcnxSZXZlcnNlRXF1aWxpYnJpdW18TmVnYXRpdmVUaGlja1NwYWNlfGxvbmdsZWZ0cmlnaHRhcnJvd3xMb25nbGVmdHJpZ2h0YXJyb3d8TG9uZ0xlZnRSaWdodEFycm93fERvd25SaWdodFRlZVZlY3RvcnxEb3duUmlnaHRWZWN0b3JCYXJ8R3JlYXRlclNsYW50RXF1YWx8U3F1YXJlU3Vic2V0RXF1YWx8TGVmdERvd25WZWN0b3JCYXJ8TGVmdERvdWJsZUJyYWNrZXR8VmVydGljYWxTZXBhcmF0b3J8cmlnaHRsZWZ0aGFycG9vbnN8Tm90R3JlYXRlckdyZWF0ZXJ8Tm90U3F1YXJlU3VwZXJzZXR8YmxhY2t0cmlhbmdsZWxlZnR8YmxhY2t0cmlhbmdsZWRvd258TmVnYXRpdmVUaGluU3BhY2V8TGVmdERvd25UZWVWZWN0b3J8Tm90TGVzc1NsYW50RXF1YWx8bGVmdHJpZ2h0aGFycG9vbnN8RG91YmxlVXBEb3duQXJyb3d8RG91YmxlVmVydGljYWxCYXJ8TGVmdFRyaWFuZ2xlRXF1YWx8RmlsbGVkU21hbGxTcXVhcmV8dHdvaGVhZHJpZ2h0YXJyb3d8Tm90TmVzdGVkTGVzc0xlc3N8RG93bkxlZnRUZWVWZWN0b3J8RG93bkxlZnRWZWN0b3JCYXJ8UmlnaHRBbmdsZUJyYWNrZXR8Tm90VGlsZGVGdWxsRXF1YWx8Tm90UmV2ZXJzZUVsZW1lbnR8UmlnaHRVcERvd25WZWN0b3J8RGlhY3JpdGljYWxUaWxkZXxOb3RTdWNjZWVkc1RpbGRlfGNpcmNsZWFycm93cmlnaHR8Tm90UHJlY2VkZXNFcXVhbHxyaWdodGhhcnBvb25kb3dufERvdWJsZVJpZ2h0QXJyb3d8Tm90U3VjY2VlZHNFcXVhbHxOb25CcmVha2luZ1NwYWNlfE5vdFJpZ2h0VHJpYW5nbGV8TGVzc0VxdWFsR3JlYXRlcnxSaWdodFVwVGVlVmVjdG9yfExlZnRBbmdsZUJyYWNrZXR8R3JlYXRlckZ1bGxFcXVhbHxEb3duQXJyb3dVcEFycm93fFJpZ2h0VXBWZWN0b3JCYXJ8dHdvaGVhZGxlZnRhcnJvd3xHcmVhdGVyRXF1YWxMZXNzfGRvd25oYXJwb29ucmlnaHR8UmlnaHRUcmlhbmdsZUJhcnxudHJpYW5nbGVyaWdodGVxfE5vdFN1cGVyc2V0RXF1YWx8TGVmdFVwRG93blZlY3RvcnxEaWFjcml0aWNhbEFjdXRlfHJpZ2h0cmlnaHRhcnJvd3N8dmFydHJpYW5nbGVyaWdodHxVcEFycm93RG93bkFycm93fERpYWNyaXRpY2FsR3JhdmV8VW5kZXJQYXJlbnRoZXNpc3xFbXB0eVNtYWxsU3F1YXJlfExlZnRVcFZlY3RvckJhcnxsZWZ0cmlnaHRhcnJvd3N8RG93blJpZ2h0VmVjdG9yfGRvd25oYXJwb29ubGVmdHx0cmlhbmdsZXJpZ2h0ZXF8U2hvcnRSaWdodEFycm93fE92ZXJQYXJlbnRoZXNpc3xEb3VibGVMZWZ0QXJyb3d8RG91YmxlRG93bkFycm93fE5vdFNxdWFyZVN1YnNldHxiaWd0cmlhbmdsZWRvd258bnRyaWFuZ2xlbGVmdGVxfFVwcGVyUmlnaHRBcnJvd3xjdXJ2ZWFycm93cmlnaHR8dmFydHJpYW5nbGVsZWZ0fE5vdExlZnRUcmlhbmdsZXxubGVmdHJpZ2h0YXJyb3d8TG93ZXJSaWdodEFycm93fE5vdEh1bXBEb3duSHVtcHxOb3RHcmVhdGVyVGlsZGV8cmlnaHR0aHJlZXRpbWVzfExlZnRVcFRlZVZlY3RvcnxOb3RHcmVhdGVyRXF1YWx8c3RyYWlnaHRlcHNpbG9ufExlZnRUcmlhbmdsZUJhcnxyaWdodHNxdWlnYXJyb3d8Q29udG91ckludGVncmFsfHJpZ2h0bGVmdGFycm93c3xDbG9zZUN1cmx5UXVvdGV8UmlnaHREb3duVmVjdG9yfExlZnRSaWdodFZlY3RvcnxuTGVmdHJpZ2h0YXJyb3d8bGVmdGhhcnBvb25kb3dufGNpcmNsZWFycm93bGVmdHxTcXVhcmVTdXBlcnNldHxPcGVuQ3VybHlRdW90ZXxob29rcmlnaHRhcnJvd3xIb3Jpem9udGFsTGluZXxEaWFjcml0aWNhbERvdHxOb3RMZXNzR3JlYXRlcnxudHJpYW5nbGVyaWdodHxEb3VibGVSaWdodFRlZXxJbnZpc2libGVDb21tYXxJbnZpc2libGVUaW1lc3xMb3dlckxlZnRBcnJvd3xEb3duTGVmdFZlY3RvcnxOb3RTdWJzZXRFcXVhbHxjdXJ2ZWFycm93bGVmdHx0cmlhbmdsZWxlZnRlcXxOb3RWZXJ0aWNhbEJhcnxUaWxkZUZ1bGxFcXVhbHxkb3duZG93bmFycm93c3xOb3RHcmVhdGVyTGVzc3xSaWdodFRlZVZlY3RvcnxaZXJvV2lkdGhTcGFjZXxsb29wYXJyb3dyaWdodHxMb25nUmlnaHRBcnJvd3xkb3VibGViYXJ3ZWRnZXxTaG9ydExlZnRBcnJvd3xTaG9ydERvd25BcnJvd3xSaWdodFZlY3RvckJhcnxHcmVhdGVyR3JlYXRlcnxSZXZlcnNlRWxlbWVudHxyaWdodGhhcnBvb251cHxMZXNzU2xhbnRFcXVhbHxsZWZ0dGhyZWV0aW1lc3x1cGhhcnBvb25yaWdodHxyaWdodGFycm93dGFpbHxMZWZ0RG93blZlY3RvcnxMb25ncmlnaHRhcnJvd3xOZXN0ZWRMZXNzTGVzc3xVcHBlckxlZnRBcnJvd3xuc2hvcnRwYXJhbGxlbHxsZWZ0bGVmdGFycm93c3xsZWZ0cmlnaHRhcnJvd3xMZWZ0cmlnaHRhcnJvd3xMZWZ0UmlnaHRBcnJvd3xsb25ncmlnaHRhcnJvd3x1cGhhcnBvb25sZWZ0fFJpZ2h0QXJyb3dCYXJ8QXBwbHlGdW5jdGlvbnxMZWZ0VGVlVmVjdG9yfGxlZnRhcnJvd3RhaWx8Tm90RXF1YWxUaWxkZXx2YXJzdWJzZXRuZXFxfHZhcnN1cHNldG5lcXF8UmlnaHRUZWVBcnJvd3xTdWNjZWVkc0VxdWFsfFN1Y2NlZWRzVGlsZGV8TGVmdFZlY3RvckJhcnxTdXBlcnNldEVxdWFsfGhvb2tsZWZ0YXJyb3d8RGlmZmVyZW50aWFsRHxWZXJ0aWNhbFRpbGRlfFZlcnlUaGluU3BhY2V8YmxhY2t0cmlhbmdsZXxiaWd0cmlhbmdsZXVwfExlc3NGdWxsRXF1YWx8ZGl2aWRlb250aW1lc3xsZWZ0aGFycG9vbnVwfFVwRXF1aWxpYnJpdW18bnRyaWFuZ2xlbGVmdHxSaWdodFRyaWFuZ2xlfG1lYXN1cmVkYW5nbGV8c2hvcnRwYXJhbGxlbHxsb25nbGVmdGFycm93fExvbmdsZWZ0YXJyb3d8TG9uZ0xlZnRBcnJvd3xEb3VibGVMZWZ0VGVlfFBvaW5jYXJlcGxhbmV8UHJlY2VkZXNFcXVhbHx0cmlhbmdsZXJpZ2h0fERvdWJsZVVwQXJyb3d8UmlnaHRVcFZlY3RvcnxmYWxsaW5nZG90c2VxfGxvb3BhcnJvd2xlZnR8UHJlY2VkZXNUaWxkZXxOb3RUaWxkZUVxdWFsfE5vdFRpbGRlVGlsZGV8c21hbGxzZXRtaW51c3xQcm9wb3J0aW9uYWx8dHJpYW5nbGVsZWZ0fHRyaWFuZ2xlZG93bnxVbmRlckJyYWNrZXR8Tm90SHVtcEVxdWFsfGV4cG9uZW50aWFsZXxFeHBvbmVudGlhbEV8Tm90TGVzc1RpbGRlfEhpbGJlcnRTcGFjZXxSaWdodENlaWxpbmd8YmxhY2tsb3plbmdlfHZhcnN1cHNldG5lcXxIdW1wRG93bkh1bXB8R3JlYXRlckVxdWFsfFZlcnRpY2FsTGluZXxMZWZ0VGVlQXJyb3d8Tm90TGVzc0VxdWFsfERvd25UZWVBcnJvd3xMZWZ0VHJpYW5nbGV8dmFyc3Vic2V0bmVxfEludGVyc2VjdGlvbnxOb3RDb25ncnVlbnR8RG93bkFycm93QmFyfExlZnRVcFZlY3RvcnxMZWZ0QXJyb3dCYXJ8cmlzaW5nZG90c2VxfEdyZWF0ZXJUaWxkZXxSb3VuZEltcGxpZXN8U3F1YXJlU3Vic2V0fFNob3J0VXBBcnJvd3xOb3RTdXBlcnNldHxxdWF0ZXJuaW9uc3xwcmVjbmFwcHJveHxiYWNrZXBzaWxvbnxwcmVjY3VybHllcXxPdmVyQnJhY2tldHxibGFja3NxdWFyZXxNZWRpdW1TcGFjZXxWZXJ0aWNhbEJhcnxjaXJjbGVkY2lyY3xjaXJjbGVkZGFzaHxDaXJjbGVNaW51c3xDaXJjbGVUaW1lc3xMZXNzR3JlYXRlcnxjdXJseWVxcHJlY3xjdXJseWVxc3VjY3xkaWFtb25kc3VpdHxVcERvd25BcnJvd3xVcGRvd25hcnJvd3xSdWxlRGVsYXllZHxScmlnaHRhcnJvd3x1cGRvd25hcnJvd3xSaWdodFZlY3RvcnxuUmlnaHRhcnJvd3xucmlnaHRhcnJvd3xlcXNsYW50bGVzc3xMZWZ0Q2VpbGluZ3xFcXVpbGlicml1bXxTbWFsbENpcmNsZXxleHBlY3RhdGlvbnxOb3RTdWNjZWVkc3x0aGlja2FwcHJveHxHcmVhdGVyTGVzc3xTcXVhcmVVbmlvbnxOb3RQcmVjZWRlc3xOb3RMZXNzTGVzc3xzdHJhaWdodHBoaXxzdWNjbmFwcHJveHxzdWNjY3VybHllcXxTdWJzZXRFcXVhbHxzcXN1cHNldGVxfFByb3BvcnRpb258TGFwbGFjZXRyZnxJbWFnaW5hcnlJfHN1cHNldG5lcXF8Tm90R3JlYXRlcnxndHJlcXFsZXNzfE5vdEVsZW1lbnR8VGhpY2tTcGFjZXxUaWxkZUVxdWFsfFRpbGRlVGlsZGV8Rm91cmllcnRyZnxybW91c3RhY2hlfEVxdWFsVGlsZGV8ZXFzbGFudGd0cnxVbmRlckJyYWNlfExlZnRWZWN0b3J8VXBBcnJvd0JhcnxuTGVmdGFycm93fG5zdWJzZXRlcXF8c3Vic2V0bmVxcXxuc3Vwc2V0ZXFxfG5sZWZ0YXJyb3d8c3VjY2FwcHJveHxsZXNzYXBwcm94fFVwVGVlQXJyb3d8dXB1cGFycm93c3xjdXJseXdlZGdlfGxlc3NlcXFndHJ8dmFyZXBzaWxvbnx2YXJub3RoaW5nfFJpZ2h0Rmxvb3J8Y29tcGxlbWVudHxDaXJjbGVQbHVzfHNxc3Vic2V0ZXF8TGxlZnRhcnJvd3xjaXJjbGVkYXN0fFJpZ2h0QXJyb3d8UmlnaHRhcnJvd3xyaWdodGFycm93fGxtb3VzdGFjaGV8QmVybm91bGxpc3xwcmVjYXBwcm94fG1hcHN0b2xlZnR8bWFwc3RvZG93bnxsb25nbWFwc3RvfGRvdHNxdWFyZXxkb3duYXJyb3d8RG91YmxlRG90fG5zdWJzZXRlcXxzdXBzZXRuZXF8bGVmdGFycm93fG5zdXBzZXRlcXxzdWJzZXRuZXF8VGhpblNwYWNlfG5nZXFzbGFudHxzdWJzZXRlcXF8SHVtcEVxdWFsfE5vdFN1YnNldHx0cmlhbmdsZXF8Tm90Q3VwQ2FwfGxlc3NlcWd0cnxoZWFydHN1aXR8VHJpcGxlRG90fExlZnRhcnJvd3xDb3Byb2R1Y3R8Q29uZ3J1ZW50fHZhcnByb3B0b3xjb21wbGV4ZXN8Z3ZlcnRuZXFxfExlZnRBcnJvd3xMZXNzVGlsZGV8c3Vwc2V0ZXFxfE1pbnVzUGx1c3xDaXJjbGVEb3R8bmxlcXNsYW50fE5vdEV4aXN0c3xndHJlcWxlc3N8bnBhcmFsbGVsfFVuaW9uUGx1c3xMZWZ0Rmxvb3J8Y2hlY2ttYXJrfENlbnRlckRvdHxjZW50ZXJkb3R8TWVsbGludHJmfGd0cmFwcHJveHxiaWdvdGltZXN8T3ZlckJyYWNlfHNwYWRlc3VpdHx0aGVyZWZvcmV8cGl0Y2hmb3JrfHJhdGlvbmFsc3xQbHVzTWludXN8QmFja3NsYXNofFRoZXJlZm9yZXxEb3duQnJldmV8YmFja3NpbWVxfGJhY2twcmltZXxEb3duQXJyb3d8bnNob3J0bWlkfERvd25hcnJvd3xsdmVydG5lcXF8ZXF2cGFyc2x8aW1hZ2xpbmV8aW1hZ3BhcnR8aW5maW50aWV8aW50ZWdlcnN8SW50ZWdyYWx8aW50ZXJjYWx8TGVzc0xlc3N8VWFycm9jaXJ8aW50bGFyaGt8c3FzdXBzZXR8YW5nbXNkYWZ8c3FzdWJzZXR8bGxjb3JuZXJ8dmFydGhldGF8Y3VwYnJjYXB8bG5hcHByb3h8U3VwZXJzZXR8U3VjaFRoYXR8c3VjY25zaW18c3VjY25lcXF8YW5nbXNkYWd8YmlndXBsdXN8Y3VybHl2ZWV8dHJwZXppdW18U3VjY2VlZHN8Tm90VGlsZGV8Ymlnd2VkZ2V8YW5nbXNkYWh8YW5ncnR2YmR8dHJpbWludXN8Y3djb25pbnR8ZnBhcnRpbnR8bHJjb3JuZXJ8c21lcGFyc2x8c3Vic2V0ZXF8dXJjb3JuZXJ8bHVyZHNoYXJ8bGFlbXB0eXZ8RERvdHJhaGR8YXBwcm94ZXF8bGRydXNoYXJ8YXdjb25pbnR8bWFwc3RvdXB8YmFja2Nvbmd8c2hvcnRtaWR8dHJpYW5nbGV8Z2Vxc2xhbnR8Z2VzZG90b2x8dGltZXNiYXJ8Y2lyY2xlZFJ8Y2lyY2xlZFN8c2V0bWludXN8bXVsdGltYXB8bmF0dXJhbHN8c2Nwb2xpbnR8bmNvbmdkb3R8UmlnaHRUZWV8Ym94bWludXN8Z25hcHByb3h8Ym94dGltZXN8YW5kc2xvcGV8dGhpY2tzaW18YW5nbXNkYWF8dmFyc2lnbWF8Y2lyZm5pbnR8cnRyaWx0cml8YW5nbXNkYWJ8cnBwb2xpbnR8YW5nbXNkYWN8YmFyd2VkZ2V8ZHJia2Fyb3d8Y2x1YnN1aXR8dGhldGFzeW18YnNvbGhzdWJ8Y2FwYnJjdXB8ZHppZ3JhcnJ8ZG90ZXFkb3R8RG90RXF1YWx8ZG90bWludXN8VW5kZXJCYXJ8Tm90RXF1YWx8cmVhbHBhcnR8b3RpbWVzYXN8dWxjb3JuZXJ8aGtzZWFyb3d8aGtzd2Fyb3d8cGFyYWxsZWx8UGFydGlhbER8ZWxpbnRlcnN8ZW1wdHlzZXR8cGx1c2FjaXJ8YmJya3Ricmt8YW5nbXNkYWR8cG9pbnRpbnR8Ymlnb3BsdXN8YW5nbXNkYWV8UHJlY2VkZXN8Ymlnc3FjdXB8dmFya2FwcGF8bm90aW5kb3R8c3Vwc2V0ZXF8cHJlY25lcXF8cHJlY25zaW18cHJvZmFsYXJ8cHJvZmxpbmV8cHJvZnN1cmZ8bGVxc2xhbnR8bGVzZG90b3J8cmFlbXB0eXZ8c3VicGx1c3xub3RuaXZifG5vdG5pdmN8c3VicmFycnx6aWdyYXJyfHZ6aWd6YWd8c3VibXVsdHxzdWJlZG90fEVsZW1lbnR8YmV0d2VlbnxjaXJzY2lyfGxhcnJiZnN8bGFycnNpbXxsb3RpbWVzfGxicmtzbGR8bGJya3NsdXxsb3plbmdlfGxkcmRoYXJ8ZGJrYXJvd3xiaWdjaXJjfGVwc2lsb258c2ltcmFycnxzaW1wbHVzfGx0cXVlc3R8RXBzaWxvbnxsdXJ1aGFyfGd0cXVlc3R8bWFsdGVzZXxucG9saW50fGVxY29sb258bnByZWNlcXxiaWdvZG90fGRkYWdnZXJ8Z3RybGVzc3xibmVxdWl2fGhhcnJjaXJ8ZGRvdHNlcXxlcXVpdkREfGJhY2tzaW18ZGVtcHR5dnxuc3FzdWJlfG5zcXN1cGV8VXBzaWxvbnxuc3Vic2V0fHVwc2lsb258bWludXNkdXxuc3VjY2VxfHN3YXJyb3d8bnN1cHNldHxjb2xvbmVxfHNlYXJyb3d8Ym94cGx1c3xuYXBwcm94fG5hdHVyYWx8YXN5bXBlcXxhbGVmc3ltfGNvbmdkb3R8bmVhcnJvd3xiaWdzdGFyfGRpYW1vbmR8c3VwcGx1c3x0cml0aW1lfExlZnRUZWV8bnZpbmZpbnx0cmlwbHVzfE5ld0xpbmV8bnZsdHJpZXxudnJ0cmllfG53YXJyb3d8bmV4aXN0c3xEaWFtb25kfHJ1bHVoYXJ8SW1wbGllc3xzdXBtdWx0fGFuZ3phcnJ8c3VwbGFycnxzdXBoc3VifHF1ZXN0ZXF8YmVjYXVzZXxkaWdhbW1hfEJlY2F1c2V8b2xjcm9zc3xiZW1wdHl2fG9taWNyb258T21pY3Jvbnxyb3RpbWVzfE5vQnJlYWt8aW50cHJvZHxhbmdydHZifG9yZGVyb2Z8dXdhbmdsZXxzdXBoc29sfGxlc2RvdG98b3JzbG9wZXxEb3duVGVlfHJlYWxpbmV8Y3VkYXJybHxyZGxkaGFyfE92ZXJCYXJ8c3VwZWRvdHxsZXNzZG90fHN1cGRzdWJ8dG9wZm9ya3xzdWNjc2ltfHJicmtzbHV8cmJya3NsZHxwZXJ0ZW5rfGN1ZGFycnJ8aXNpbmRvdHxwbGFuY2tofGxlc3NndHJ8cGx1c2NpcnxnZXNkb3RvfHBsdXNzaW18cGx1c3R3b3xsZXNzc2ltfGN1bGFycnB8cmFycnNpbXxDYXlsZXlzfG5vdGludmF8bm90aW52Ynxub3RpbnZjfFVwQXJyb3d8VXBhcnJvd3x1cGFycm93fE5vdExlc3N8ZHdhbmdsZXxwcmVjc2ltfFByb2R1Y3R8Y3VyYXJybXxDY29uaW50fGRvdHBsdXN8cmFycmJmc3xjY3Vwc3NtfENlZGlsbGF8Y2VtcHR5dnxub3RuaXZhfHF1YXRpbnR8ZnJhYzM1fGZyYWMzOHxmcmFjNDV8ZnJhYzU2fGZyYWM1OHxmcmFjNzh8dHJpZG90fHhvcGx1c3xnYWN1dGV8Z2FtbWFkfEdhbW1hZHxsZmlzaHR8bGZsb29yfGJpZ2N1cHxzcXN1cGV8Z2JyZXZlfEdicmV2ZXxsaGFydWx8c3FzdWJlfHNxY3Vwc3xHY2VkaWx8YXBhY2lyfGxsaGFyZHxsbWlkb3R8TG1pZG90fGxtb3VzdHxhbmRhbmR8c3FjYXBzfGFwcHJveHxBYnJldmV8c3BhZGVzfGNpcmNlcXx0cHJpbWV8ZGl2aWRlfHRvcGNpcnxBc3NpZ258dG9wYm90fGdlc2RvdHxkaXZvbnh8eHVwbHVzfHRpbWVzZHxnZXNsZXN8YXRpbGRlfHNvbGJhcnxTT0ZUY3l8bG9wbHVzfHRpbWVzYnxsb3dhc3R8bG93YmFyfGRsY29ybnxkbGNyb3B8c29mdGN5fGRvbGxhcnxscGFybHR8dGhrc2ltfGxyaGFyZHxBdGlsZGV8bHNhcXVvfHNtYXNocHxiaWd2ZWV8dGhpbnNwfHdyZWF0aHxia2Fyb3d8bHNxdW9yfGxzdHJva3xMc3Ryb2t8bHRocmVlfGx0aW1lc3xsdGxhcnJ8RG90RG90fHNpbWRvdHxsdHJQYXJ8d2VpZXJwfHhzcWN1cHxhbmdtc2R8c2lnbWF2fHNpZ21hZnx6ZWV0cmZ8WmNhcm9ufHpjYXJvbnxtYXBzdG98dnN1cG5lfHRoZXRhdnxjaXJtaWR8bWFya2VyfG1jb21tYXxaYWN1dGV8dnN1Ym5FfHRoZXJlNHxndGxQYXJ8dnN1Ym5lfGJvdHRvbXxndHJhcnJ8U0hDSGN5fHNoY2hjeXxtaWRhc3R8bWlkY2lyfG1pZGRvdHxtaW51c2J8bWludXNkfGd0cmRvdHxib3d0aWV8c2Zyb3dufG1ucGx1c3xtb2RlbHN8Y29sb25lfHNlc3dhcnxDb2xvbmV8bXN0cG9zfHNlYXJoa3xndHJzaW18bmFjdXRlfE5hY3V0ZXxib3hib3h8dGVscmVjfGhhaXJzcHxUY2VkaWx8bmJ1bXBlfHNjbnNpbXxuY2Fyb258TmNhcm9ufG5jZWRpbHxOY2VkaWx8aGFtaWx0fFNjZWRpbHxuZWFyaGt8aGFyZGN5fEhBUkRjeXx0Y2VkaWx8VGNhcm9ufGNvbW1hdHxuZXF1aXZ8bmVzZWFyfHRjYXJvbnx0YXJnZXR8aGVhcnRzfG5leGlzdHx2YXJyaG98c2NlZGlsfFNjYXJvbnxzY2Fyb258aGVsbGlwfFNhY3V0ZXxzYWN1dGV8aGVyY29ufHN3bndhcnxjb21wZm58cnRpbWVzfHJ0aHJlZXxyc3F1b3J8cnNhcXVvfHphY3V0ZXx3ZWRnZXF8aG9tdGh0fGJhcnZlZXxiYXJ3ZWR8QmFyd2VkfHJwYXJndHxob3JiYXJ8Y29uaW50fHN3YXJoa3xyb3BsdXN8bmx0cmllfGhzbGFzaHxoc3Ryb2t8SHN0cm9rfHJtb3VzdHxDb25pbnR8YnByaW1lfGh5YnVsbHxoeXBoZW58aWFjdXRlfElhY3V0ZXxzdXBzdXB8c3Vwc3VifHN1cHNpbXx2YXJwaGl8Y29wcm9kfGJydmJhcnxhZ3JhdmV8U3Vwc2V0fHN1cHNldHxpZ3JhdmV8SWdyYXZlfG5vdGluRXxBZ3JhdmV8aWlpaW50fGlpbmZpbnxjb3B5c3J8d2VkYmFyfFZlcmJhcnx2YW5ncnR8YmVjYXVzfGluY2FyZXx2ZXJiYXJ8aW5vZG90fGJ1bGxldHxkcmNvcm58aW50Y2FsfGRyY3JvcHxjdWxhcnJ8dmVsbGlwfFV0aWxkZXxidW1wZXF8Y3VwY2FwfGRzdHJva3xEc3Ryb2t8Q3VwQ2FwfGN1cGN1cHxjdXBkb3R8ZWFjdXRlfEVhY3V0ZXxzdXBkb3R8aXF1ZXN0fGVhc3RlcnxlY2Fyb258RWNhcm9ufGVjb2xvbnxpc2luc3Z8dXRpbGRlfGl0aWxkZXxJdGlsZGV8Y3VyYXJyfHN1Y2NlcXxCdW1wZXF8Y2FjdXRlfHVsY3JvcHxucGFyc2x8Q2FjdXRlfG5wcmN1ZXxlZ3JhdmV8RWdyYXZlfG5yYXJyY3xucmFycnd8c3Vic3VwfHN1YnN1YnxucnRyaWV8anNlcmN5fG5zY2N1ZXxKc2VyY3l8a2FwcGF2fGtjZWRpbHxLY2VkaWx8c3Vic2ltfHVsY29ybnxuc2ltZXF8ZWdzZG90fHZlZWJhcnxrZ3JlZW58Y2FwYW5kfGVsc2RvdHxTdWJzZXR8c3Vic2V0fGN1cnJlbnxhYWN1dGV8bGFjdXRlfExhY3V0ZXxlbXB0eXZ8bnRpbGRlfE50aWxkZXxsYWdyYW58bGFtYmRhfExhbWJkYXxjYXBjYXB8VWdyYXZlfGxhbmdsZXxzdWJkb3R8ZW1zcDEzfG51bWVyb3xlbXNwMTR8bnZkYXNofG52RGFzaHxuVmRhc2h8blZEYXNofHVncmF2ZXx1ZmlzaHR8bnZIYXJyfGxhcnJmc3xudmxBcnJ8bGFycmhrfGxhcnJscHxsYXJycGx8bnZyQXJyfFVkYmxhY3xud2FyaGt8bGFycnRsfG53bmVhcnxvYWN1dGV8T2FjdXRlfGxhdGFpbHxsQXRhaWx8c3N0YXJmfGxicmFjZXxvZGJsYWN8T2RibGFjfGxicmFja3x1ZGJsYWN8b2Rzb2xkfGVwYXJzbHxsY2Fyb258TGNhcm9ufG9ncmF2ZXxPZ3JhdmV8bGNlZGlsfExjZWRpbHxBYWN1dGV8c3NtaWxlfHNzZXRtbnxzcXVhcmZ8bGRxdW9yfGNhcGN1cHxvbWludXN8Y3lsY3R5fHJoYXJ1bHxlcWNpcmN8ZGFnZ2VyfHJmbG9vcnxyZmlzaHR8RGFnZ2VyfGRhbGV0aHxlcXVhbHN8b3JpZ29mfGNhcGRvdHxlcXVlc3R8ZGNhcm9ufERjYXJvbnxyZHF1b3J8b3NsYXNofE9zbGFzaHxvdGlsZGV8T3RpbGRlfG90aW1lc3xPdGltZXN8dXJjcm9wfFVicmV2ZXx1YnJldmV8WWFjdXRlfFVhY3V0ZXx1YWN1dGV8UmNlZGlsfHJjZWRpbHx1cmNvcm58cGFyc2ltfFJjYXJvbnxWZGFzaGx8cmNhcm9ufFRzdHJva3xwZXJjbnR8cGVyaW9kfHBlcm1pbHxFeGlzdHN8eWFjdXRlfHJicmFja3xyYnJhY2V8cGhtbWF0fGNjYXJvbnxDY2Fyb258cGxhbmNrfGNjZWRpbHxwbGFua3Z8dHN0cm9rfGZlbWFsZXxwbHVzZG98cGx1c2R1fGZmaWxpZ3xwbHVzbW58ZmZsbGlnfENjZWRpbHxyQXRhaWx8ZGZpc2h0fGJlcm5vdXxyYXRhaWx8UmFycnRsfHJhcnJ0bHxhbmdzcGh8cmFycnBsfHJhcnJscHxyYXJyaGt8eHdlZGdlfHhvdGltZXxmb3JhbGx8Rm9yQWxsfFZ2ZGFzaHx2c3VwbkV8cHJlY2VxfGJpZ2NhcHxmcmFjMTJ8ZnJhYzEzfGZyYWMxNHxwcmltZXN8cmFycmZzfHBybnNpbXxmcmFjMTV8U3F1YXJlfGZyYWMxNnxzcXVhcmV8bGVzZG90fGZyYWMxOHxmcmFjMjN8cHJvcHRvfHBydXJlbHxyYXJyYXB8cmFuZ2xlfHB1bmNzcHxmcmFjMjV8UmFjdXRlfHFwcmltZXxyYWN1dGV8bGVzZ2VzfGZyYWMzNHxhYnJldmV8QUVsaWd8ZXFzaW18dXRkb3R8c2V0bW58dXJ0cml8RXF1YWx8VXJpbmd8c2VBcnJ8dXJpbmd8c2VhcnJ8ZGFzaHZ8RGFzaHZ8bXVtYXB8bmFibGF8aW9nb258SW9nb258c2RvdGV8c2RvdGJ8c2NzaW18bmFwaWR8bmFwb3N8ZXF1aXZ8bmF0dXJ8QWNpcmN8ZGJsYWN8ZXJhcnJ8bmJ1bXB8aXByb2R8ZXJEb3R8dWNpcmN8YXdpbnR8ZXNkb3R8YW5ncnR8bmNvbmd8aXNpbkV8c2NuYXB8U2NpcmN8c2NpcmN8bmRhc2h8aXNpbnN8VWJyY3l8bmVhcnJ8bmVBcnJ8aXNpbnZ8bmVkb3R8dWJyY3l8YWN1dGV8WWNpcmN8aXVrY3l8SXVrY3l8eHV0cml8bmVzaW18Y2FyZXR8amNpcmN8SmNpcmN8Y2Fyb258dHdpeHR8ZGRhcnJ8c2NjdWV8ZXhpc3R8am1hdGh8c2JxdW98bmdlcXF8YW5nc3R8Y2NhcHN8bGNlaWx8bmdzaW18VXBUZWV8ZGVsdGF8RGVsdGF8cnRyaWZ8bmhhcnJ8bmhBcnJ8bmhwYXJ8cnRyaWV8anVrY3l8SnVrY3l8a2FwcGF8cnNxdW98S2FwcGF8bmxhcnJ8bmxBcnJ8VFNIY3l8cnJhcnJ8YW9nb258QW9nb258ZmZsaWd8eHJhcnJ8dHNoY3l8Y2NpcmN8bmxlcXF8ZmlsaWd8dXBzaWh8bmxlc3N8ZGhhcmx8bmxzaW18ZmpsaWd8cm9wYXJ8bmx0cml8ZGhhcnJ8cm9icmt8cm9hcnJ8ZmxsaWd8Zmx0bnN8cm9hbmd8cm5taWR8c3VibkV8c3VibmV8bEFhcnJ8dHJpc2J8Q2NpcmN8YWNpcmN8Y2N1cHN8Ymxhbmt8VkRhc2h8Zm9ya3Z8VmRhc2h8bGFuZ2R8Y2VkaWx8YmxrMTJ8YmxrMTR8bGFxdW98c3RybnN8ZGlhbXN8bm90aW58dkRhc2h8bGFycmJ8YmxrMzR8YmxvY2t8ZGlzaW58dXBsdXN8dmRhc2h8dkJhcnZ8YWVsaWd8c3RhcmZ8V2VkZ2V8Y2hlY2t8eHJBcnJ8bGF0ZXN8bGJhcnJ8bEJhcnJ8bm90bml8bGJicmt8YmNvbmd8ZnJhc2x8bGJya2V8ZnJvd258dnJ0cml8dnByb3B8dm5zdXB8Z2FtbWF8R2FtbWF8d2VkZ2V8eG9kb3R8YmRxdW98c3JhcnJ8ZG90ZXF8bGRxdW98Ym94ZGx8Ym94ZEx8Z2NpcmN8R2NpcmN8Ym94RGx8Ym94REx8Ym94ZHJ8Ym94ZFJ8Ym94RHJ8VFJBREV8dHJhZGV8cmxoYXJ8Ym94RFJ8dm5zdWJ8bnBhcnR8dmx0cml8cmxhcnJ8Ym94aGR8Ym94aER8bnByZWN8Z2VzY2N8bnJhcnJ8bnJBcnJ8Ym94SGR8Ym94SER8Ym94aHV8Ym94aFV8bnJ0cml8Ym94SHV8Y2x1YnN8Ym94SFV8dGltZXN8Y29sb258Q29sb258Z2ltZWx8eGxBcnJ8VGlsZGV8bnNpbWV8dGlsZGV8bnNtaWR8bnNwYXJ8VEhPUk58dGhvcm58eGxhcnJ8bnN1YmV8bnN1YkV8dGhrYXB8eGhBcnJ8Y29tbWF8bnN1Y2N8Ym94dWx8Ym94dUx8bnN1cGV8bnN1cEV8Z25lcXF8Z25zaW18Ym94VWx8Ym94VUx8Z3JhdmV8Ym94dXJ8Ym94dVJ8Ym94VXJ8Ym94VVJ8bGVzY2N8YW5nbGV8YmVwc2l8Ym94dmh8dmFycGl8Ym94dkh8bnVtc3B8VGhldGF8Z3NpbWV8Z3NpbWx8dGhldGF8Ym94Vmh8Ym94Vkh8Ym94dmx8Z3RjaXJ8Z3Rkb3R8Ym94dkx8Ym94Vmx8Ym94Vkx8Y3JhcnJ8Y3Jvc3N8Q3Jvc3N8bnZzaW18Ym94dnJ8bndhcnJ8bndBcnJ8c3FzdXB8ZHRkb3R8VW9nb258bGhhcmR8bGhhcnV8ZHRyaWZ8b2NpcmN8T2NpcmN8bGhibGt8ZHVhcnJ8b2Rhc2h8c3FzdWJ8SGFjZWt8c3FjdXB8bGxhcnJ8ZHVoYXJ8b2VsaWd8T0VsaWd8b2ZjaXJ8Ym94dlJ8dW9nb258bGx0cml8Ym94VnJ8Y3N1YmV8dXVhcnJ8b2hiYXJ8Y3N1cGV8Y3Rkb3R8b2xhcnJ8b2xjaXJ8aGFycnd8b2xpbmV8c3FjYXB8b21hY3J8T21hY3J8b21lZ2F8T21lZ2F8Ym94VlJ8YWxlcGh8bG5lcXF8bG5zaW18bG9hbmd8bG9hcnJ8cmhhcnV8bG9icmt8aGNpcmN8b3BlcnB8b3BsdXN8cmhhcmR8SGNpcmN8b3JhcnJ8VW5pb258b3JkZXJ8ZWNpcmN8RWNpcmN8Y3VlcHJ8c3psaWd8Y3Vlc2N8YnJldmV8cmVhbHN8ZUREb3R8QnJldmV8aG9hcnJ8bG9wYXJ8dXRyaWZ8cmRxdW98VW1hY3J8dW1hY3J8ZWZEb3R8c3dBcnJ8dWx0cml8YWxwaGF8cmNlaWx8b3ZiYXJ8c3dhcnJ8V2NpcmN8d2NpcmN8c210ZXN8c21pbGV8YnNlbWl8bHJhcnJ8YXJpbmd8cGFyc2x8bHJoYXJ8YnNpbWV8dWhibGt8bHJ0cml8Y3Vwb3J8QXJpbmd8dWhhcnJ8dWhhcmx8c2xhcnJ8cmJya2V8YnNvbGJ8bHNpbWV8cmJicmt8UkJhcnJ8bHNpbWd8cGhvbmV8ckJhcnJ8cmJhcnJ8aWNpcmN8bHNxdW98SWNpcmN8ZW1hY3J8RW1hY3J8cmF0aW98c2ltbmV8cGx1c2J8c2ltbEV8c2ltZ0V8c2ltZXF8cGx1c2V8bHRjaXJ8bHRkb3R8ZW1wdHl8eGhhcnJ8eGR0cml8aWV4Y2x8QWxwaGF8bHRyaWV8cmFycnd8cG91bmR8bHRyaWZ8eGNpcmN8YnVtcGV8cHJjdWV8YnVtcEV8YXN5bXB8YW1hY3J8Y3V2ZWV8U2lnbWF8c2lnbWF8aWlpbnR8dWRoYXJ8aWlvdGF8aWpsaWd8SUpsaWd8c3VwbkV8aW1hY3J8SW1hY3J8cHJpbWV8UHJpbWV8aW1hZ2V8cHJuYXB8ZW9nb258RW9nb258cmFycmN8bWRhc2h8bUREb3R8Y3V3ZWR8aW1hdGh8c3VwbmV8aW1wZWR8QW1hY3J8dWRhcnJ8cHJzaW18bWljcm98cmFycmJ8Y3dpbnR8cmFxdW98aW5maW58ZXBsdXN8cmFuZ2V8cmFuZ2R8VWNpcmN8cmFkaWN8bWludXN8YW1hbGd8dmVlZXF8ckFhcnJ8ZXBzaXZ8eWNpcmN8cXVlc3R8c2hhcnB8cXVvdHx6d25qfFFzY3J8cmFjZXxxc2NyfFFvcGZ8cW9wZnxxaW50fHJhbmd8UmFuZ3xac2NyfHpzY3J8Wm9wZnx6b3BmfHJhcnJ8ckFycnxSYXJyfFBzY3J8cHNjcnxwcm9wfHByb2R8cHJuRXxwcmVjfFpIY3l8emhjeXxwcmFwfFpldGF8emV0YXxQb3BmfHBvcGZ8WmRvdHxwbHVzfHpkb3R8WXVtbHx5dW1sfHBoaXZ8WVVjeXx5dWN5fFlzY3J8eXNjcnxwZXJwfFlvcGZ8eW9wZnxwYXJ0fHBhcmF8WUljeXxPdW1sfHJjdWJ8eWljeXxZQWN5fHJkY2F8b3VtbHxvc29sfE9zY3J8cmRzaHx5YWN5fHJlYWx8b3Njcnx4dmVlfGFuZGR8cmVjdHxhbmR2fFhzY3J8b3JvcnxvcmRtfG9yZGZ8eHNjcnxhbmdlfGFvcGZ8QW9wZnxySGFyfFhvcGZ8b3BhcnxPb3BmfHhvcGZ8eG5pc3xyaG92fG9vcGZ8b21pZHx4bWFwfG9pbnR8YXBpZHxhcG9zfG9nb258YXNjcnxBc2NyfG9kb3R8b2Rpdnx4Y3VwfHhjYXB8b2NpcnxvYXN0fG52bHR8bnZsZXxudmd0fG52Z2V8bnZhcHxXc2NyfHdzY3J8YXVtbHxudGxnfG50Z2x8bnN1cHxuc3VifG5zaW18TnNjcnxuc2NyfG5zY2V8V29wZnxyaW5nfG5wcmV8d29wZnxucGFyfEF1bWx8QmFydnxiYnJrfE5vcGZ8bm9wZnxubWlkfG5MdHZ8YmV0YXxyb3BmfFJvcGZ8QmV0YXxiZXRofG5sZXN8cnBhcnxubGVxfGJub3R8Yk5vdHxubGRyfE5KY3l8cnNjcnxSc2NyfFZzY3J8dnNjcnxyc3FifG5qY3l8Ym9wZnxuaXNkfEJvcGZ8cnRyaXxWb3BmfG5HdHZ8bmd0cnx2b3BmfGJveGh8Ym94SHxib3h2fG5nZXN8bmdlcXxib3hWfGJzY3J8c2NhcHxCc2NyfGJzaW18VmVydHx2ZXJ0fGJzb2x8YnVsbHxidW1wfGNhcHN8Y2RvdHxuY3VwfHNjbkV8bmNhcHxuYnNwfG5hcEV8Q2RvdHxjZW50fHNkb3R8VmJhcnxuYW5nfHZCYXJ8Y2hjeXxNc2NyfG1zY3J8c2VjdHxzZW1pfENIY3l8TW9wZnxtb3BmfHNleHR8Y2lyY3xjaXJlfG1sZHJ8bWxjcHxjaXJFfGNvbXB8c2hjeXxTSGN5fHZBcnJ8dmFycnxjb25nfGNvcGZ8Q29wZnxjb3B5fENPUFl8bWFsdHxtYWxlfG1hY3J8bHZuRXxjc2NyfGx0cml8c2ltZXxsdGNjfHNpbWd8Q3NjcnxzaW1sfGNzdWJ8VXVtbHxsc3FifGxzaW18dXVtbHxjc3VwfExzY3J8bHNjcnx1dHJpfHNtaWR8bHBhcnxjdXBzfHNtdGV8bG96ZnxkYXJyfExvcGZ8VXNjcnxzb2xifGxvcGZ8c29wZnxTb3BmfGxuZXF8dXNjcnxzcGFyfGRBcnJ8bG5hcHxEYXJyfGRhc2h8U3FydHxMSmN5fGxqY3l8bEhhcnxkSGFyfFVwc2l8dXBzaXxkaWFtfGxlc2d8ZGpjeXxESmN5fGxlcXF8ZG9wZnxEb3BmfGRzY3J8RHNjcnxkc2N5fGxkc2h8bGRjYXxzcXVmfERTY3l8c3NjcnxTc2NyfGRzb2x8bGN1YnxsYXRlfHN0YXJ8U3RhcnxVb3BmfExhcnJ8bEFycnxsYXJyfHVvcGZ8ZHRyaXxkemN5fHN1YmV8c3ViRXxMYW5nfGxhbmd8S3Njcnxrc2NyfEtvcGZ8a29wZnxLSmN5fGtqY3l8S0hjeXxraGN5fERaY3l8ZWNpcnxlZG90fGVEb3R8SnNjcnxqc2NyfHN1Y2N8Sm9wZnxqb3BmfEVkb3R8dUhhcnxlbXNwfGVuc3B8SXVtbHxpdW1sfGVvcGZ8aXNpbnxJc2NyfGlzY3J8RW9wZnxlcGFyfHN1bmd8ZXBzaXxlc2NyfHN1cDF8c3VwMnxzdXAzfElvdGF8aW90YXxzdXBlfHN1cEV8SW9wZnxpb3BmfElPY3l8aW9jeXxFc2NyfGVzaW18RXNpbXxpbW9mfFVhcnJ8UVVPVHx1QXJyfHVhcnJ8ZXVtbHxJRWN5fGllY3l8SWRvdHxFdW1sfGV1cm98ZXhjbHxIc2NyfGhzY3J8SG9wZnxob3BmfFRTY3l8dHNjeXxUc2NyfGhiYXJ8dHNjcnxmbGF0fHRicmt8Zm5vZnxoQXJyfGhhcnJ8aGFsZnxmb3BmfEZvcGZ8dGRvdHxndm5FfGZvcmt8dHJpZXxndGNjfGZzY3J8RnNjcnxnZG90fGdzaW18R3Njcnxnc2NyfEdvcGZ8Z29wZnxnbmVxfEdkb3R8dG9zYXxnbmFwfFRvcGZ8dG9wZnxnZXFxfHRvZWF8R0pjeXxnamN5fHRpbnR8Z2VzbHxtaWR8U2ZyfGdnZ3x0b3B8Z2VzfGdsYXxnbEV8Z2xqfGdlcXxnbmV8Z0VsfGdlbHxnbkV8R2N5fGdjeXxnYXB8VGZyfHRmcnxUY3l8dGN5fEhhdHxUYXV8RmZyfHRhdXxUYWJ8aGZyfEhmcnxmZnJ8RmN5fGZjeXxpY3l8SWN5fGlmZnxFVEh8ZXRofGlmcnxJZnJ8RXRhfGV0YXxpbnR8SW50fFN1cHxzdXB8dWN5fFVjeXxTdW18c3VtfGpjeXxFTkd8dWZyfFVmcnxlbmd8SmN5fGpmcnxlbHN8ZWxsfGVnc3xFZnJ8ZWZyfEpmcnx1bWx8a2N5fEtjeXxFY3l8ZWN5fGtmcnxLZnJ8bGFwfFN1YnxzdWJ8bGF0fGxjeXxMY3l8bGVnfERvdHxkb3R8bEVnfGxlcXxsZXN8c3F1fGRpdnxkaWV8bGZyfExmcnxsZ0V8RGZyfGRmcnxEZWx8ZGVnfERjeXxkY3l8bG5lfGxuRXxzb2x8bG96fHNtdHxDdXB8bHJtfGN1cHxsc2h8THNofHNpbXxzaHl8bWFwfE1hcHxtY3l8TWN5fG1mcnxNZnJ8bWhvfGdmcnxHZnJ8c2ZyfGNpcnxDaGl8Y2hpfG5hcHxDZnJ8dmN5fFZjeXxjZnJ8U2N5fHNjeXxuY3l8TmN5fHZlZXxWZWV8Q2FwfGNhcHxuZnJ8c2NFfHNjZXxOZnJ8bmdlfG5nRXxuR2d8dmZyfFZmcnxuZ3R8Ym90fG5HdHxuaXN8bml2fFJzaHxyc2h8bmxlfG5sRXxibmV8QmZyfGJmcnxuTGx8bmx0fG5MdHxCY3l8YmN5fG5vdHxOb3R8cmxtfHdmcnxXZnJ8bnByfG5zY3xudW18b2N5fGFzdHxPY3l8b2ZyfHhmcnxYZnJ8T2ZyfG9ndHxvaG18YXBFfG9sdHxSaG98YXBlfHJob3xSZnJ8cmZyfG9yZHxSRUd8YW5nfHJlZ3xvcnZ8QW5kfGFuZHxBTVB8UmN5fGFtcHxBZnJ8eWN5fFljeXx5ZW58eWZyfFlmcnxyY3l8cGFyfHBjeXxQY3l8cGZyfFBmcnxwaGl8UGhpfGFmcnxBY3l8YWN5fHpjeXxaY3l8cGl2fGFjRXxhY2R8emZyfFpmcnxwcmV8cHJFfHBzaXxQc2l8cWZyfFFmcnx6d2p8T3J8Z2V8R2d8Z3R8Z2d8ZWx8b1N8bHR8THR8TFR8UmV8bGd8Z2x8ZWd8bmV8SW18aXR8bGV8RER8d3B8d3J8bnV8TnV8ZGR8bEV8U2N8c2N8cGl8UGl8ZWV8YWZ8bGx8TGx8cnh8Z0V8eGl8cG18WGl8aWN8cHJ8UHJ8aW58bml8bXB8bXV8YWN8TXV8b3J8YXB8R3R8R1R8aWkpO3wmKEFhY3V0ZXxBZ3JhdmV8QXRpbGRlfENjZWRpbHxFYWN1dGV8RWdyYXZlfElhY3V0ZXxJZ3JhdmV8TnRpbGRlfE9hY3V0ZXxPZ3JhdmV8T3NsYXNofE90aWxkZXxVYWN1dGV8VWdyYXZlfFlhY3V0ZXxhYWN1dGV8YWdyYXZlfGF0aWxkZXxicnZiYXJ8Y2NlZGlsfGN1cnJlbnxkaXZpZGV8ZWFjdXRlfGVncmF2ZXxmcmFjMTJ8ZnJhYzE0fGZyYWMzNHxpYWN1dGV8aWdyYXZlfGlxdWVzdHxtaWRkb3R8bnRpbGRlfG9hY3V0ZXxvZ3JhdmV8b3NsYXNofG90aWxkZXxwbHVzbW58dWFjdXRlfHVncmF2ZXx5YWN1dGV8QUVsaWd8QWNpcmN8QXJpbmd8RWNpcmN8SWNpcmN8T2NpcmN8VEhPUk58VWNpcmN8YWNpcmN8YWN1dGV8YWVsaWd8YXJpbmd8Y2VkaWx8ZWNpcmN8aWNpcmN8aWV4Y2x8bGFxdW98bWljcm98b2NpcmN8cG91bmR8cmFxdW98c3psaWd8dGhvcm58dGltZXN8dWNpcmN8QXVtbHxDT1BZfEV1bWx8SXVtbHxPdW1sfFFVT1R8VXVtbHxhdW1sfGNlbnR8Y29weXxldW1sfGl1bWx8bWFjcnxuYnNwfG9yZGZ8b3JkbXxvdW1sfHBhcmF8cXVvdHxzZWN0fHN1cDF8c3VwMnxzdXAzfHV1bWx8eXVtbHxBTVB8RVRIfFJFR3xhbXB8ZGVnfGV0aHxub3R8cmVnfHNoeXx1bWx8eWVufEdUfExUfGd0fGx0KSg/ITspKFs9YS16QS1aMC05XT8pfCYjKFswLTldKykoOz8pfCYjW3hYXShbYS1mQS1GMC05XSspKDs/KXwmKFswLTlhLXpBLVpdKykvZztcblx0dmFyIGRlY29kZU1hcCA9IHsnYWFjdXRlJzonXFx4RTEnLCdBYWN1dGUnOidcXHhDMScsJ2FicmV2ZSc6J1xcdTAxMDMnLCdBYnJldmUnOidcXHUwMTAyJywnYWMnOidcXHUyMjNFJywnYWNkJzonXFx1MjIzRicsJ2FjRSc6J1xcdTIyM0VcXHUwMzMzJywnYWNpcmMnOidcXHhFMicsJ0FjaXJjJzonXFx4QzInLCdhY3V0ZSc6J1xceEI0JywnYWN5JzonXFx1MDQzMCcsJ0FjeSc6J1xcdTA0MTAnLCdhZWxpZyc6J1xceEU2JywnQUVsaWcnOidcXHhDNicsJ2FmJzonXFx1MjA2MScsJ2Fmcic6J1xcdUQ4MzVcXHVERDFFJywnQWZyJzonXFx1RDgzNVxcdUREMDQnLCdhZ3JhdmUnOidcXHhFMCcsJ0FncmF2ZSc6J1xceEMwJywnYWxlZnN5bSc6J1xcdTIxMzUnLCdhbGVwaCc6J1xcdTIxMzUnLCdhbHBoYSc6J1xcdTAzQjEnLCdBbHBoYSc6J1xcdTAzOTEnLCdhbWFjcic6J1xcdTAxMDEnLCdBbWFjcic6J1xcdTAxMDAnLCdhbWFsZyc6J1xcdTJBM0YnLCdhbXAnOicmJywnQU1QJzonJicsJ2FuZCc6J1xcdTIyMjcnLCdBbmQnOidcXHUyQTUzJywnYW5kYW5kJzonXFx1MkE1NScsJ2FuZGQnOidcXHUyQTVDJywnYW5kc2xvcGUnOidcXHUyQTU4JywnYW5kdic6J1xcdTJBNUEnLCdhbmcnOidcXHUyMjIwJywnYW5nZSc6J1xcdTI5QTQnLCdhbmdsZSc6J1xcdTIyMjAnLCdhbmdtc2QnOidcXHUyMjIxJywnYW5nbXNkYWEnOidcXHUyOUE4JywnYW5nbXNkYWInOidcXHUyOUE5JywnYW5nbXNkYWMnOidcXHUyOUFBJywnYW5nbXNkYWQnOidcXHUyOUFCJywnYW5nbXNkYWUnOidcXHUyOUFDJywnYW5nbXNkYWYnOidcXHUyOUFEJywnYW5nbXNkYWcnOidcXHUyOUFFJywnYW5nbXNkYWgnOidcXHUyOUFGJywnYW5ncnQnOidcXHUyMjFGJywnYW5ncnR2Yic6J1xcdTIyQkUnLCdhbmdydHZiZCc6J1xcdTI5OUQnLCdhbmdzcGgnOidcXHUyMjIyJywnYW5nc3QnOidcXHhDNScsJ2FuZ3phcnInOidcXHUyMzdDJywnYW9nb24nOidcXHUwMTA1JywnQW9nb24nOidcXHUwMTA0JywnYW9wZic6J1xcdUQ4MzVcXHVERDUyJywnQW9wZic6J1xcdUQ4MzVcXHVERDM4JywnYXAnOidcXHUyMjQ4JywnYXBhY2lyJzonXFx1MkE2RicsJ2FwZSc6J1xcdTIyNEEnLCdhcEUnOidcXHUyQTcwJywnYXBpZCc6J1xcdTIyNEInLCdhcG9zJzonXFwnJywnQXBwbHlGdW5jdGlvbic6J1xcdTIwNjEnLCdhcHByb3gnOidcXHUyMjQ4JywnYXBwcm94ZXEnOidcXHUyMjRBJywnYXJpbmcnOidcXHhFNScsJ0FyaW5nJzonXFx4QzUnLCdhc2NyJzonXFx1RDgzNVxcdURDQjYnLCdBc2NyJzonXFx1RDgzNVxcdURDOUMnLCdBc3NpZ24nOidcXHUyMjU0JywnYXN0JzonKicsJ2FzeW1wJzonXFx1MjI0OCcsJ2FzeW1wZXEnOidcXHUyMjREJywnYXRpbGRlJzonXFx4RTMnLCdBdGlsZGUnOidcXHhDMycsJ2F1bWwnOidcXHhFNCcsJ0F1bWwnOidcXHhDNCcsJ2F3Y29uaW50JzonXFx1MjIzMycsJ2F3aW50JzonXFx1MkExMScsJ2JhY2tjb25nJzonXFx1MjI0QycsJ2JhY2tlcHNpbG9uJzonXFx1MDNGNicsJ2JhY2twcmltZSc6J1xcdTIwMzUnLCdiYWNrc2ltJzonXFx1MjIzRCcsJ2JhY2tzaW1lcSc6J1xcdTIyQ0QnLCdCYWNrc2xhc2gnOidcXHUyMjE2JywnQmFydic6J1xcdTJBRTcnLCdiYXJ2ZWUnOidcXHUyMkJEJywnYmFyd2VkJzonXFx1MjMwNScsJ0JhcndlZCc6J1xcdTIzMDYnLCdiYXJ3ZWRnZSc6J1xcdTIzMDUnLCdiYnJrJzonXFx1MjNCNScsJ2Jicmt0YnJrJzonXFx1MjNCNicsJ2Jjb25nJzonXFx1MjI0QycsJ2JjeSc6J1xcdTA0MzEnLCdCY3knOidcXHUwNDExJywnYmRxdW8nOidcXHUyMDFFJywnYmVjYXVzJzonXFx1MjIzNScsJ2JlY2F1c2UnOidcXHUyMjM1JywnQmVjYXVzZSc6J1xcdTIyMzUnLCdiZW1wdHl2JzonXFx1MjlCMCcsJ2JlcHNpJzonXFx1MDNGNicsJ2Jlcm5vdSc6J1xcdTIxMkMnLCdCZXJub3VsbGlzJzonXFx1MjEyQycsJ2JldGEnOidcXHUwM0IyJywnQmV0YSc6J1xcdTAzOTInLCdiZXRoJzonXFx1MjEzNicsJ2JldHdlZW4nOidcXHUyMjZDJywnYmZyJzonXFx1RDgzNVxcdUREMUYnLCdCZnInOidcXHVEODM1XFx1REQwNScsJ2JpZ2NhcCc6J1xcdTIyQzInLCdiaWdjaXJjJzonXFx1MjVFRicsJ2JpZ2N1cCc6J1xcdTIyQzMnLCdiaWdvZG90JzonXFx1MkEwMCcsJ2JpZ29wbHVzJzonXFx1MkEwMScsJ2JpZ290aW1lcyc6J1xcdTJBMDInLCdiaWdzcWN1cCc6J1xcdTJBMDYnLCdiaWdzdGFyJzonXFx1MjYwNScsJ2JpZ3RyaWFuZ2xlZG93bic6J1xcdTI1QkQnLCdiaWd0cmlhbmdsZXVwJzonXFx1MjVCMycsJ2JpZ3VwbHVzJzonXFx1MkEwNCcsJ2JpZ3ZlZSc6J1xcdTIyQzEnLCdiaWd3ZWRnZSc6J1xcdTIyQzAnLCdia2Fyb3cnOidcXHUyOTBEJywnYmxhY2tsb3plbmdlJzonXFx1MjlFQicsJ2JsYWNrc3F1YXJlJzonXFx1MjVBQScsJ2JsYWNrdHJpYW5nbGUnOidcXHUyNUI0JywnYmxhY2t0cmlhbmdsZWRvd24nOidcXHUyNUJFJywnYmxhY2t0cmlhbmdsZWxlZnQnOidcXHUyNUMyJywnYmxhY2t0cmlhbmdsZXJpZ2h0JzonXFx1MjVCOCcsJ2JsYW5rJzonXFx1MjQyMycsJ2JsazEyJzonXFx1MjU5MicsJ2JsazE0JzonXFx1MjU5MScsJ2JsazM0JzonXFx1MjU5MycsJ2Jsb2NrJzonXFx1MjU4OCcsJ2JuZSc6Jz1cXHUyMEU1JywnYm5lcXVpdic6J1xcdTIyNjFcXHUyMEU1JywnYm5vdCc6J1xcdTIzMTAnLCdiTm90JzonXFx1MkFFRCcsJ2JvcGYnOidcXHVEODM1XFx1REQ1MycsJ0JvcGYnOidcXHVEODM1XFx1REQzOScsJ2JvdCc6J1xcdTIyQTUnLCdib3R0b20nOidcXHUyMkE1JywnYm93dGllJzonXFx1MjJDOCcsJ2JveGJveCc6J1xcdTI5QzknLCdib3hkbCc6J1xcdTI1MTAnLCdib3hkTCc6J1xcdTI1NTUnLCdib3hEbCc6J1xcdTI1NTYnLCdib3hETCc6J1xcdTI1NTcnLCdib3hkcic6J1xcdTI1MEMnLCdib3hkUic6J1xcdTI1NTInLCdib3hEcic6J1xcdTI1NTMnLCdib3hEUic6J1xcdTI1NTQnLCdib3hoJzonXFx1MjUwMCcsJ2JveEgnOidcXHUyNTUwJywnYm94aGQnOidcXHUyNTJDJywnYm94aEQnOidcXHUyNTY1JywnYm94SGQnOidcXHUyNTY0JywnYm94SEQnOidcXHUyNTY2JywnYm94aHUnOidcXHUyNTM0JywnYm94aFUnOidcXHUyNTY4JywnYm94SHUnOidcXHUyNTY3JywnYm94SFUnOidcXHUyNTY5JywnYm94bWludXMnOidcXHUyMjlGJywnYm94cGx1cyc6J1xcdTIyOUUnLCdib3h0aW1lcyc6J1xcdTIyQTAnLCdib3h1bCc6J1xcdTI1MTgnLCdib3h1TCc6J1xcdTI1NUInLCdib3hVbCc6J1xcdTI1NUMnLCdib3hVTCc6J1xcdTI1NUQnLCdib3h1cic6J1xcdTI1MTQnLCdib3h1Uic6J1xcdTI1NTgnLCdib3hVcic6J1xcdTI1NTknLCdib3hVUic6J1xcdTI1NUEnLCdib3h2JzonXFx1MjUwMicsJ2JveFYnOidcXHUyNTUxJywnYm94dmgnOidcXHUyNTNDJywnYm94dkgnOidcXHUyNTZBJywnYm94VmgnOidcXHUyNTZCJywnYm94VkgnOidcXHUyNTZDJywnYm94dmwnOidcXHUyNTI0JywnYm94dkwnOidcXHUyNTYxJywnYm94VmwnOidcXHUyNTYyJywnYm94VkwnOidcXHUyNTYzJywnYm94dnInOidcXHUyNTFDJywnYm94dlInOidcXHUyNTVFJywnYm94VnInOidcXHUyNTVGJywnYm94VlInOidcXHUyNTYwJywnYnByaW1lJzonXFx1MjAzNScsJ2JyZXZlJzonXFx1MDJEOCcsJ0JyZXZlJzonXFx1MDJEOCcsJ2JydmJhcic6J1xceEE2JywnYnNjcic6J1xcdUQ4MzVcXHVEQ0I3JywnQnNjcic6J1xcdTIxMkMnLCdic2VtaSc6J1xcdTIwNEYnLCdic2ltJzonXFx1MjIzRCcsJ2JzaW1lJzonXFx1MjJDRCcsJ2Jzb2wnOidcXFxcJywnYnNvbGInOidcXHUyOUM1JywnYnNvbGhzdWInOidcXHUyN0M4JywnYnVsbCc6J1xcdTIwMjInLCdidWxsZXQnOidcXHUyMDIyJywnYnVtcCc6J1xcdTIyNEUnLCdidW1wZSc6J1xcdTIyNEYnLCdidW1wRSc6J1xcdTJBQUUnLCdidW1wZXEnOidcXHUyMjRGJywnQnVtcGVxJzonXFx1MjI0RScsJ2NhY3V0ZSc6J1xcdTAxMDcnLCdDYWN1dGUnOidcXHUwMTA2JywnY2FwJzonXFx1MjIyOScsJ0NhcCc6J1xcdTIyRDInLCdjYXBhbmQnOidcXHUyQTQ0JywnY2FwYnJjdXAnOidcXHUyQTQ5JywnY2FwY2FwJzonXFx1MkE0QicsJ2NhcGN1cCc6J1xcdTJBNDcnLCdjYXBkb3QnOidcXHUyQTQwJywnQ2FwaXRhbERpZmZlcmVudGlhbEQnOidcXHUyMTQ1JywnY2Fwcyc6J1xcdTIyMjlcXHVGRTAwJywnY2FyZXQnOidcXHUyMDQxJywnY2Fyb24nOidcXHUwMkM3JywnQ2F5bGV5cyc6J1xcdTIxMkQnLCdjY2Fwcyc6J1xcdTJBNEQnLCdjY2Fyb24nOidcXHUwMTBEJywnQ2Nhcm9uJzonXFx1MDEwQycsJ2NjZWRpbCc6J1xceEU3JywnQ2NlZGlsJzonXFx4QzcnLCdjY2lyYyc6J1xcdTAxMDknLCdDY2lyYyc6J1xcdTAxMDgnLCdDY29uaW50JzonXFx1MjIzMCcsJ2NjdXBzJzonXFx1MkE0QycsJ2NjdXBzc20nOidcXHUyQTUwJywnY2RvdCc6J1xcdTAxMEInLCdDZG90JzonXFx1MDEwQScsJ2NlZGlsJzonXFx4QjgnLCdDZWRpbGxhJzonXFx4QjgnLCdjZW1wdHl2JzonXFx1MjlCMicsJ2NlbnQnOidcXHhBMicsJ2NlbnRlcmRvdCc6J1xceEI3JywnQ2VudGVyRG90JzonXFx4QjcnLCdjZnInOidcXHVEODM1XFx1REQyMCcsJ0Nmcic6J1xcdTIxMkQnLCdjaGN5JzonXFx1MDQ0NycsJ0NIY3knOidcXHUwNDI3JywnY2hlY2snOidcXHUyNzEzJywnY2hlY2ttYXJrJzonXFx1MjcxMycsJ2NoaSc6J1xcdTAzQzcnLCdDaGknOidcXHUwM0E3JywnY2lyJzonXFx1MjVDQicsJ2NpcmMnOidcXHUwMkM2JywnY2lyY2VxJzonXFx1MjI1NycsJ2NpcmNsZWFycm93bGVmdCc6J1xcdTIxQkEnLCdjaXJjbGVhcnJvd3JpZ2h0JzonXFx1MjFCQicsJ2NpcmNsZWRhc3QnOidcXHUyMjlCJywnY2lyY2xlZGNpcmMnOidcXHUyMjlBJywnY2lyY2xlZGRhc2gnOidcXHUyMjlEJywnQ2lyY2xlRG90JzonXFx1MjI5OScsJ2NpcmNsZWRSJzonXFx4QUUnLCdjaXJjbGVkUyc6J1xcdTI0QzgnLCdDaXJjbGVNaW51cyc6J1xcdTIyOTYnLCdDaXJjbGVQbHVzJzonXFx1MjI5NScsJ0NpcmNsZVRpbWVzJzonXFx1MjI5NycsJ2NpcmUnOidcXHUyMjU3JywnY2lyRSc6J1xcdTI5QzMnLCdjaXJmbmludCc6J1xcdTJBMTAnLCdjaXJtaWQnOidcXHUyQUVGJywnY2lyc2Npcic6J1xcdTI5QzInLCdDbG9ja3dpc2VDb250b3VySW50ZWdyYWwnOidcXHUyMjMyJywnQ2xvc2VDdXJseURvdWJsZVF1b3RlJzonXFx1MjAxRCcsJ0Nsb3NlQ3VybHlRdW90ZSc6J1xcdTIwMTknLCdjbHVicyc6J1xcdTI2NjMnLCdjbHVic3VpdCc6J1xcdTI2NjMnLCdjb2xvbic6JzonLCdDb2xvbic6J1xcdTIyMzcnLCdjb2xvbmUnOidcXHUyMjU0JywnQ29sb25lJzonXFx1MkE3NCcsJ2NvbG9uZXEnOidcXHUyMjU0JywnY29tbWEnOicsJywnY29tbWF0JzonQCcsJ2NvbXAnOidcXHUyMjAxJywnY29tcGZuJzonXFx1MjIxOCcsJ2NvbXBsZW1lbnQnOidcXHUyMjAxJywnY29tcGxleGVzJzonXFx1MjEwMicsJ2NvbmcnOidcXHUyMjQ1JywnY29uZ2RvdCc6J1xcdTJBNkQnLCdDb25ncnVlbnQnOidcXHUyMjYxJywnY29uaW50JzonXFx1MjIyRScsJ0NvbmludCc6J1xcdTIyMkYnLCdDb250b3VySW50ZWdyYWwnOidcXHUyMjJFJywnY29wZic6J1xcdUQ4MzVcXHVERDU0JywnQ29wZic6J1xcdTIxMDInLCdjb3Byb2QnOidcXHUyMjEwJywnQ29wcm9kdWN0JzonXFx1MjIxMCcsJ2NvcHknOidcXHhBOScsJ0NPUFknOidcXHhBOScsJ2NvcHlzcic6J1xcdTIxMTcnLCdDb3VudGVyQ2xvY2t3aXNlQ29udG91ckludGVncmFsJzonXFx1MjIzMycsJ2NyYXJyJzonXFx1MjFCNScsJ2Nyb3NzJzonXFx1MjcxNycsJ0Nyb3NzJzonXFx1MkEyRicsJ2NzY3InOidcXHVEODM1XFx1RENCOCcsJ0NzY3InOidcXHVEODM1XFx1REM5RScsJ2NzdWInOidcXHUyQUNGJywnY3N1YmUnOidcXHUyQUQxJywnY3N1cCc6J1xcdTJBRDAnLCdjc3VwZSc6J1xcdTJBRDInLCdjdGRvdCc6J1xcdTIyRUYnLCdjdWRhcnJsJzonXFx1MjkzOCcsJ2N1ZGFycnInOidcXHUyOTM1JywnY3VlcHInOidcXHUyMkRFJywnY3Vlc2MnOidcXHUyMkRGJywnY3VsYXJyJzonXFx1MjFCNicsJ2N1bGFycnAnOidcXHUyOTNEJywnY3VwJzonXFx1MjIyQScsJ0N1cCc6J1xcdTIyRDMnLCdjdXBicmNhcCc6J1xcdTJBNDgnLCdjdXBjYXAnOidcXHUyQTQ2JywnQ3VwQ2FwJzonXFx1MjI0RCcsJ2N1cGN1cCc6J1xcdTJBNEEnLCdjdXBkb3QnOidcXHUyMjhEJywnY3Vwb3InOidcXHUyQTQ1JywnY3Vwcyc6J1xcdTIyMkFcXHVGRTAwJywnY3VyYXJyJzonXFx1MjFCNycsJ2N1cmFycm0nOidcXHUyOTNDJywnY3VybHllcXByZWMnOidcXHUyMkRFJywnY3VybHllcXN1Y2MnOidcXHUyMkRGJywnY3VybHl2ZWUnOidcXHUyMkNFJywnY3VybHl3ZWRnZSc6J1xcdTIyQ0YnLCdjdXJyZW4nOidcXHhBNCcsJ2N1cnZlYXJyb3dsZWZ0JzonXFx1MjFCNicsJ2N1cnZlYXJyb3dyaWdodCc6J1xcdTIxQjcnLCdjdXZlZSc6J1xcdTIyQ0UnLCdjdXdlZCc6J1xcdTIyQ0YnLCdjd2NvbmludCc6J1xcdTIyMzInLCdjd2ludCc6J1xcdTIyMzEnLCdjeWxjdHknOidcXHUyMzJEJywnZGFnZ2VyJzonXFx1MjAyMCcsJ0RhZ2dlcic6J1xcdTIwMjEnLCdkYWxldGgnOidcXHUyMTM4JywnZGFycic6J1xcdTIxOTMnLCdkQXJyJzonXFx1MjFEMycsJ0RhcnInOidcXHUyMUExJywnZGFzaCc6J1xcdTIwMTAnLCdkYXNodic6J1xcdTIyQTMnLCdEYXNodic6J1xcdTJBRTQnLCdkYmthcm93JzonXFx1MjkwRicsJ2RibGFjJzonXFx1MDJERCcsJ2RjYXJvbic6J1xcdTAxMEYnLCdEY2Fyb24nOidcXHUwMTBFJywnZGN5JzonXFx1MDQzNCcsJ0RjeSc6J1xcdTA0MTQnLCdkZCc6J1xcdTIxNDYnLCdERCc6J1xcdTIxNDUnLCdkZGFnZ2VyJzonXFx1MjAyMScsJ2RkYXJyJzonXFx1MjFDQScsJ0REb3RyYWhkJzonXFx1MjkxMScsJ2Rkb3RzZXEnOidcXHUyQTc3JywnZGVnJzonXFx4QjAnLCdEZWwnOidcXHUyMjA3JywnZGVsdGEnOidcXHUwM0I0JywnRGVsdGEnOidcXHUwMzk0JywnZGVtcHR5dic6J1xcdTI5QjEnLCdkZmlzaHQnOidcXHUyOTdGJywnZGZyJzonXFx1RDgzNVxcdUREMjEnLCdEZnInOidcXHVEODM1XFx1REQwNycsJ2RIYXInOidcXHUyOTY1JywnZGhhcmwnOidcXHUyMUMzJywnZGhhcnInOidcXHUyMUMyJywnRGlhY3JpdGljYWxBY3V0ZSc6J1xceEI0JywnRGlhY3JpdGljYWxEb3QnOidcXHUwMkQ5JywnRGlhY3JpdGljYWxEb3VibGVBY3V0ZSc6J1xcdTAyREQnLCdEaWFjcml0aWNhbEdyYXZlJzonYCcsJ0RpYWNyaXRpY2FsVGlsZGUnOidcXHUwMkRDJywnZGlhbSc6J1xcdTIyQzQnLCdkaWFtb25kJzonXFx1MjJDNCcsJ0RpYW1vbmQnOidcXHUyMkM0JywnZGlhbW9uZHN1aXQnOidcXHUyNjY2JywnZGlhbXMnOidcXHUyNjY2JywnZGllJzonXFx4QTgnLCdEaWZmZXJlbnRpYWxEJzonXFx1MjE0NicsJ2RpZ2FtbWEnOidcXHUwM0REJywnZGlzaW4nOidcXHUyMkYyJywnZGl2JzonXFx4RjcnLCdkaXZpZGUnOidcXHhGNycsJ2RpdmlkZW9udGltZXMnOidcXHUyMkM3JywnZGl2b254JzonXFx1MjJDNycsJ2RqY3knOidcXHUwNDUyJywnREpjeSc6J1xcdTA0MDInLCdkbGNvcm4nOidcXHUyMzFFJywnZGxjcm9wJzonXFx1MjMwRCcsJ2RvbGxhcic6JyQnLCdkb3BmJzonXFx1RDgzNVxcdURENTUnLCdEb3BmJzonXFx1RDgzNVxcdUREM0InLCdkb3QnOidcXHUwMkQ5JywnRG90JzonXFx4QTgnLCdEb3REb3QnOidcXHUyMERDJywnZG90ZXEnOidcXHUyMjUwJywnZG90ZXFkb3QnOidcXHUyMjUxJywnRG90RXF1YWwnOidcXHUyMjUwJywnZG90bWludXMnOidcXHUyMjM4JywnZG90cGx1cyc6J1xcdTIyMTQnLCdkb3RzcXVhcmUnOidcXHUyMkExJywnZG91YmxlYmFyd2VkZ2UnOidcXHUyMzA2JywnRG91YmxlQ29udG91ckludGVncmFsJzonXFx1MjIyRicsJ0RvdWJsZURvdCc6J1xceEE4JywnRG91YmxlRG93bkFycm93JzonXFx1MjFEMycsJ0RvdWJsZUxlZnRBcnJvdyc6J1xcdTIxRDAnLCdEb3VibGVMZWZ0UmlnaHRBcnJvdyc6J1xcdTIxRDQnLCdEb3VibGVMZWZ0VGVlJzonXFx1MkFFNCcsJ0RvdWJsZUxvbmdMZWZ0QXJyb3cnOidcXHUyN0Y4JywnRG91YmxlTG9uZ0xlZnRSaWdodEFycm93JzonXFx1MjdGQScsJ0RvdWJsZUxvbmdSaWdodEFycm93JzonXFx1MjdGOScsJ0RvdWJsZVJpZ2h0QXJyb3cnOidcXHUyMUQyJywnRG91YmxlUmlnaHRUZWUnOidcXHUyMkE4JywnRG91YmxlVXBBcnJvdyc6J1xcdTIxRDEnLCdEb3VibGVVcERvd25BcnJvdyc6J1xcdTIxRDUnLCdEb3VibGVWZXJ0aWNhbEJhcic6J1xcdTIyMjUnLCdkb3duYXJyb3cnOidcXHUyMTkzJywnRG93bmFycm93JzonXFx1MjFEMycsJ0Rvd25BcnJvdyc6J1xcdTIxOTMnLCdEb3duQXJyb3dCYXInOidcXHUyOTEzJywnRG93bkFycm93VXBBcnJvdyc6J1xcdTIxRjUnLCdEb3duQnJldmUnOidcXHUwMzExJywnZG93bmRvd25hcnJvd3MnOidcXHUyMUNBJywnZG93bmhhcnBvb25sZWZ0JzonXFx1MjFDMycsJ2Rvd25oYXJwb29ucmlnaHQnOidcXHUyMUMyJywnRG93bkxlZnRSaWdodFZlY3Rvcic6J1xcdTI5NTAnLCdEb3duTGVmdFRlZVZlY3Rvcic6J1xcdTI5NUUnLCdEb3duTGVmdFZlY3Rvcic6J1xcdTIxQkQnLCdEb3duTGVmdFZlY3RvckJhcic6J1xcdTI5NTYnLCdEb3duUmlnaHRUZWVWZWN0b3InOidcXHUyOTVGJywnRG93blJpZ2h0VmVjdG9yJzonXFx1MjFDMScsJ0Rvd25SaWdodFZlY3RvckJhcic6J1xcdTI5NTcnLCdEb3duVGVlJzonXFx1MjJBNCcsJ0Rvd25UZWVBcnJvdyc6J1xcdTIxQTcnLCdkcmJrYXJvdyc6J1xcdTI5MTAnLCdkcmNvcm4nOidcXHUyMzFGJywnZHJjcm9wJzonXFx1MjMwQycsJ2RzY3InOidcXHVEODM1XFx1RENCOScsJ0RzY3InOidcXHVEODM1XFx1REM5RicsJ2RzY3knOidcXHUwNDU1JywnRFNjeSc6J1xcdTA0MDUnLCdkc29sJzonXFx1MjlGNicsJ2RzdHJvayc6J1xcdTAxMTEnLCdEc3Ryb2snOidcXHUwMTEwJywnZHRkb3QnOidcXHUyMkYxJywnZHRyaSc6J1xcdTI1QkYnLCdkdHJpZic6J1xcdTI1QkUnLCdkdWFycic6J1xcdTIxRjUnLCdkdWhhcic6J1xcdTI5NkYnLCdkd2FuZ2xlJzonXFx1MjlBNicsJ2R6Y3knOidcXHUwNDVGJywnRFpjeSc6J1xcdTA0MEYnLCdkemlncmFycic6J1xcdTI3RkYnLCdlYWN1dGUnOidcXHhFOScsJ0VhY3V0ZSc6J1xceEM5JywnZWFzdGVyJzonXFx1MkE2RScsJ2VjYXJvbic6J1xcdTAxMUInLCdFY2Fyb24nOidcXHUwMTFBJywnZWNpcic6J1xcdTIyNTYnLCdlY2lyYyc6J1xceEVBJywnRWNpcmMnOidcXHhDQScsJ2Vjb2xvbic6J1xcdTIyNTUnLCdlY3knOidcXHUwNDREJywnRWN5JzonXFx1MDQyRCcsJ2VERG90JzonXFx1MkE3NycsJ2Vkb3QnOidcXHUwMTE3JywnZURvdCc6J1xcdTIyNTEnLCdFZG90JzonXFx1MDExNicsJ2VlJzonXFx1MjE0NycsJ2VmRG90JzonXFx1MjI1MicsJ2Vmcic6J1xcdUQ4MzVcXHVERDIyJywnRWZyJzonXFx1RDgzNVxcdUREMDgnLCdlZyc6J1xcdTJBOUEnLCdlZ3JhdmUnOidcXHhFOCcsJ0VncmF2ZSc6J1xceEM4JywnZWdzJzonXFx1MkE5NicsJ2Vnc2RvdCc6J1xcdTJBOTgnLCdlbCc6J1xcdTJBOTknLCdFbGVtZW50JzonXFx1MjIwOCcsJ2VsaW50ZXJzJzonXFx1MjNFNycsJ2VsbCc6J1xcdTIxMTMnLCdlbHMnOidcXHUyQTk1JywnZWxzZG90JzonXFx1MkE5NycsJ2VtYWNyJzonXFx1MDExMycsJ0VtYWNyJzonXFx1MDExMicsJ2VtcHR5JzonXFx1MjIwNScsJ2VtcHR5c2V0JzonXFx1MjIwNScsJ0VtcHR5U21hbGxTcXVhcmUnOidcXHUyNUZCJywnZW1wdHl2JzonXFx1MjIwNScsJ0VtcHR5VmVyeVNtYWxsU3F1YXJlJzonXFx1MjVBQicsJ2Vtc3AnOidcXHUyMDAzJywnZW1zcDEzJzonXFx1MjAwNCcsJ2Vtc3AxNCc6J1xcdTIwMDUnLCdlbmcnOidcXHUwMTRCJywnRU5HJzonXFx1MDE0QScsJ2Vuc3AnOidcXHUyMDAyJywnZW9nb24nOidcXHUwMTE5JywnRW9nb24nOidcXHUwMTE4JywnZW9wZic6J1xcdUQ4MzVcXHVERDU2JywnRW9wZic6J1xcdUQ4MzVcXHVERDNDJywnZXBhcic6J1xcdTIyRDUnLCdlcGFyc2wnOidcXHUyOUUzJywnZXBsdXMnOidcXHUyQTcxJywnZXBzaSc6J1xcdTAzQjUnLCdlcHNpbG9uJzonXFx1MDNCNScsJ0Vwc2lsb24nOidcXHUwMzk1JywnZXBzaXYnOidcXHUwM0Y1JywnZXFjaXJjJzonXFx1MjI1NicsJ2VxY29sb24nOidcXHUyMjU1JywnZXFzaW0nOidcXHUyMjQyJywnZXFzbGFudGd0cic6J1xcdTJBOTYnLCdlcXNsYW50bGVzcyc6J1xcdTJBOTUnLCdFcXVhbCc6J1xcdTJBNzUnLCdlcXVhbHMnOic9JywnRXF1YWxUaWxkZSc6J1xcdTIyNDInLCdlcXVlc3QnOidcXHUyMjVGJywnRXF1aWxpYnJpdW0nOidcXHUyMUNDJywnZXF1aXYnOidcXHUyMjYxJywnZXF1aXZERCc6J1xcdTJBNzgnLCdlcXZwYXJzbCc6J1xcdTI5RTUnLCdlcmFycic6J1xcdTI5NzEnLCdlckRvdCc6J1xcdTIyNTMnLCdlc2NyJzonXFx1MjEyRicsJ0VzY3InOidcXHUyMTMwJywnZXNkb3QnOidcXHUyMjUwJywnZXNpbSc6J1xcdTIyNDInLCdFc2ltJzonXFx1MkE3MycsJ2V0YSc6J1xcdTAzQjcnLCdFdGEnOidcXHUwMzk3JywnZXRoJzonXFx4RjAnLCdFVEgnOidcXHhEMCcsJ2V1bWwnOidcXHhFQicsJ0V1bWwnOidcXHhDQicsJ2V1cm8nOidcXHUyMEFDJywnZXhjbCc6JyEnLCdleGlzdCc6J1xcdTIyMDMnLCdFeGlzdHMnOidcXHUyMjAzJywnZXhwZWN0YXRpb24nOidcXHUyMTMwJywnZXhwb25lbnRpYWxlJzonXFx1MjE0NycsJ0V4cG9uZW50aWFsRSc6J1xcdTIxNDcnLCdmYWxsaW5nZG90c2VxJzonXFx1MjI1MicsJ2ZjeSc6J1xcdTA0NDQnLCdGY3knOidcXHUwNDI0JywnZmVtYWxlJzonXFx1MjY0MCcsJ2ZmaWxpZyc6J1xcdUZCMDMnLCdmZmxpZyc6J1xcdUZCMDAnLCdmZmxsaWcnOidcXHVGQjA0JywnZmZyJzonXFx1RDgzNVxcdUREMjMnLCdGZnInOidcXHVEODM1XFx1REQwOScsJ2ZpbGlnJzonXFx1RkIwMScsJ0ZpbGxlZFNtYWxsU3F1YXJlJzonXFx1MjVGQycsJ0ZpbGxlZFZlcnlTbWFsbFNxdWFyZSc6J1xcdTI1QUEnLCdmamxpZyc6J2ZqJywnZmxhdCc6J1xcdTI2NkQnLCdmbGxpZyc6J1xcdUZCMDInLCdmbHRucyc6J1xcdTI1QjEnLCdmbm9mJzonXFx1MDE5MicsJ2ZvcGYnOidcXHVEODM1XFx1REQ1NycsJ0ZvcGYnOidcXHVEODM1XFx1REQzRCcsJ2ZvcmFsbCc6J1xcdTIyMDAnLCdGb3JBbGwnOidcXHUyMjAwJywnZm9yayc6J1xcdTIyRDQnLCdmb3Jrdic6J1xcdTJBRDknLCdGb3VyaWVydHJmJzonXFx1MjEzMScsJ2ZwYXJ0aW50JzonXFx1MkEwRCcsJ2ZyYWMxMic6J1xceEJEJywnZnJhYzEzJzonXFx1MjE1MycsJ2ZyYWMxNCc6J1xceEJDJywnZnJhYzE1JzonXFx1MjE1NScsJ2ZyYWMxNic6J1xcdTIxNTknLCdmcmFjMTgnOidcXHUyMTVCJywnZnJhYzIzJzonXFx1MjE1NCcsJ2ZyYWMyNSc6J1xcdTIxNTYnLCdmcmFjMzQnOidcXHhCRScsJ2ZyYWMzNSc6J1xcdTIxNTcnLCdmcmFjMzgnOidcXHUyMTVDJywnZnJhYzQ1JzonXFx1MjE1OCcsJ2ZyYWM1Nic6J1xcdTIxNUEnLCdmcmFjNTgnOidcXHUyMTVEJywnZnJhYzc4JzonXFx1MjE1RScsJ2ZyYXNsJzonXFx1MjA0NCcsJ2Zyb3duJzonXFx1MjMyMicsJ2ZzY3InOidcXHVEODM1XFx1RENCQicsJ0ZzY3InOidcXHUyMTMxJywnZ2FjdXRlJzonXFx1MDFGNScsJ2dhbW1hJzonXFx1MDNCMycsJ0dhbW1hJzonXFx1MDM5MycsJ2dhbW1hZCc6J1xcdTAzREQnLCdHYW1tYWQnOidcXHUwM0RDJywnZ2FwJzonXFx1MkE4NicsJ2dicmV2ZSc6J1xcdTAxMUYnLCdHYnJldmUnOidcXHUwMTFFJywnR2NlZGlsJzonXFx1MDEyMicsJ2djaXJjJzonXFx1MDExRCcsJ0djaXJjJzonXFx1MDExQycsJ2djeSc6J1xcdTA0MzMnLCdHY3knOidcXHUwNDEzJywnZ2RvdCc6J1xcdTAxMjEnLCdHZG90JzonXFx1MDEyMCcsJ2dlJzonXFx1MjI2NScsJ2dFJzonXFx1MjI2NycsJ2dlbCc6J1xcdTIyREInLCdnRWwnOidcXHUyQThDJywnZ2VxJzonXFx1MjI2NScsJ2dlcXEnOidcXHUyMjY3JywnZ2Vxc2xhbnQnOidcXHUyQTdFJywnZ2VzJzonXFx1MkE3RScsJ2dlc2NjJzonXFx1MkFBOScsJ2dlc2RvdCc6J1xcdTJBODAnLCdnZXNkb3RvJzonXFx1MkE4MicsJ2dlc2RvdG9sJzonXFx1MkE4NCcsJ2dlc2wnOidcXHUyMkRCXFx1RkUwMCcsJ2dlc2xlcyc6J1xcdTJBOTQnLCdnZnInOidcXHVEODM1XFx1REQyNCcsJ0dmcic6J1xcdUQ4MzVcXHVERDBBJywnZ2cnOidcXHUyMjZCJywnR2cnOidcXHUyMkQ5JywnZ2dnJzonXFx1MjJEOScsJ2dpbWVsJzonXFx1MjEzNycsJ2dqY3knOidcXHUwNDUzJywnR0pjeSc6J1xcdTA0MDMnLCdnbCc6J1xcdTIyNzcnLCdnbGEnOidcXHUyQUE1JywnZ2xFJzonXFx1MkE5MicsJ2dsaic6J1xcdTJBQTQnLCdnbmFwJzonXFx1MkE4QScsJ2duYXBwcm94JzonXFx1MkE4QScsJ2duZSc6J1xcdTJBODgnLCdnbkUnOidcXHUyMjY5JywnZ25lcSc6J1xcdTJBODgnLCdnbmVxcSc6J1xcdTIyNjknLCdnbnNpbSc6J1xcdTIyRTcnLCdnb3BmJzonXFx1RDgzNVxcdURENTgnLCdHb3BmJzonXFx1RDgzNVxcdUREM0UnLCdncmF2ZSc6J2AnLCdHcmVhdGVyRXF1YWwnOidcXHUyMjY1JywnR3JlYXRlckVxdWFsTGVzcyc6J1xcdTIyREInLCdHcmVhdGVyRnVsbEVxdWFsJzonXFx1MjI2NycsJ0dyZWF0ZXJHcmVhdGVyJzonXFx1MkFBMicsJ0dyZWF0ZXJMZXNzJzonXFx1MjI3NycsJ0dyZWF0ZXJTbGFudEVxdWFsJzonXFx1MkE3RScsJ0dyZWF0ZXJUaWxkZSc6J1xcdTIyNzMnLCdnc2NyJzonXFx1MjEwQScsJ0dzY3InOidcXHVEODM1XFx1RENBMicsJ2dzaW0nOidcXHUyMjczJywnZ3NpbWUnOidcXHUyQThFJywnZ3NpbWwnOidcXHUyQTkwJywnZ3QnOic+JywnR3QnOidcXHUyMjZCJywnR1QnOic+JywnZ3RjYyc6J1xcdTJBQTcnLCdndGNpcic6J1xcdTJBN0EnLCdndGRvdCc6J1xcdTIyRDcnLCdndGxQYXInOidcXHUyOTk1JywnZ3RxdWVzdCc6J1xcdTJBN0MnLCdndHJhcHByb3gnOidcXHUyQTg2JywnZ3RyYXJyJzonXFx1Mjk3OCcsJ2d0cmRvdCc6J1xcdTIyRDcnLCdndHJlcWxlc3MnOidcXHUyMkRCJywnZ3RyZXFxbGVzcyc6J1xcdTJBOEMnLCdndHJsZXNzJzonXFx1MjI3NycsJ2d0cnNpbSc6J1xcdTIyNzMnLCdndmVydG5lcXEnOidcXHUyMjY5XFx1RkUwMCcsJ2d2bkUnOidcXHUyMjY5XFx1RkUwMCcsJ0hhY2VrJzonXFx1MDJDNycsJ2hhaXJzcCc6J1xcdTIwMEEnLCdoYWxmJzonXFx4QkQnLCdoYW1pbHQnOidcXHUyMTBCJywnaGFyZGN5JzonXFx1MDQ0QScsJ0hBUkRjeSc6J1xcdTA0MkEnLCdoYXJyJzonXFx1MjE5NCcsJ2hBcnInOidcXHUyMUQ0JywnaGFycmNpcic6J1xcdTI5NDgnLCdoYXJydyc6J1xcdTIxQUQnLCdIYXQnOideJywnaGJhcic6J1xcdTIxMEYnLCdoY2lyYyc6J1xcdTAxMjUnLCdIY2lyYyc6J1xcdTAxMjQnLCdoZWFydHMnOidcXHUyNjY1JywnaGVhcnRzdWl0JzonXFx1MjY2NScsJ2hlbGxpcCc6J1xcdTIwMjYnLCdoZXJjb24nOidcXHUyMkI5JywnaGZyJzonXFx1RDgzNVxcdUREMjUnLCdIZnInOidcXHUyMTBDJywnSGlsYmVydFNwYWNlJzonXFx1MjEwQicsJ2hrc2Vhcm93JzonXFx1MjkyNScsJ2hrc3dhcm93JzonXFx1MjkyNicsJ2hvYXJyJzonXFx1MjFGRicsJ2hvbXRodCc6J1xcdTIyM0InLCdob29rbGVmdGFycm93JzonXFx1MjFBOScsJ2hvb2tyaWdodGFycm93JzonXFx1MjFBQScsJ2hvcGYnOidcXHVEODM1XFx1REQ1OScsJ0hvcGYnOidcXHUyMTBEJywnaG9yYmFyJzonXFx1MjAxNScsJ0hvcml6b250YWxMaW5lJzonXFx1MjUwMCcsJ2hzY3InOidcXHVEODM1XFx1RENCRCcsJ0hzY3InOidcXHUyMTBCJywnaHNsYXNoJzonXFx1MjEwRicsJ2hzdHJvayc6J1xcdTAxMjcnLCdIc3Ryb2snOidcXHUwMTI2JywnSHVtcERvd25IdW1wJzonXFx1MjI0RScsJ0h1bXBFcXVhbCc6J1xcdTIyNEYnLCdoeWJ1bGwnOidcXHUyMDQzJywnaHlwaGVuJzonXFx1MjAxMCcsJ2lhY3V0ZSc6J1xceEVEJywnSWFjdXRlJzonXFx4Q0QnLCdpYyc6J1xcdTIwNjMnLCdpY2lyYyc6J1xceEVFJywnSWNpcmMnOidcXHhDRScsJ2ljeSc6J1xcdTA0MzgnLCdJY3knOidcXHUwNDE4JywnSWRvdCc6J1xcdTAxMzAnLCdpZWN5JzonXFx1MDQzNScsJ0lFY3knOidcXHUwNDE1JywnaWV4Y2wnOidcXHhBMScsJ2lmZic6J1xcdTIxRDQnLCdpZnInOidcXHVEODM1XFx1REQyNicsJ0lmcic6J1xcdTIxMTEnLCdpZ3JhdmUnOidcXHhFQycsJ0lncmF2ZSc6J1xceENDJywnaWknOidcXHUyMTQ4JywnaWlpaW50JzonXFx1MkEwQycsJ2lpaW50JzonXFx1MjIyRCcsJ2lpbmZpbic6J1xcdTI5REMnLCdpaW90YSc6J1xcdTIxMjknLCdpamxpZyc6J1xcdTAxMzMnLCdJSmxpZyc6J1xcdTAxMzInLCdJbSc6J1xcdTIxMTEnLCdpbWFjcic6J1xcdTAxMkInLCdJbWFjcic6J1xcdTAxMkEnLCdpbWFnZSc6J1xcdTIxMTEnLCdJbWFnaW5hcnlJJzonXFx1MjE0OCcsJ2ltYWdsaW5lJzonXFx1MjExMCcsJ2ltYWdwYXJ0JzonXFx1MjExMScsJ2ltYXRoJzonXFx1MDEzMScsJ2ltb2YnOidcXHUyMkI3JywnaW1wZWQnOidcXHUwMUI1JywnSW1wbGllcyc6J1xcdTIxRDInLCdpbic6J1xcdTIyMDgnLCdpbmNhcmUnOidcXHUyMTA1JywnaW5maW4nOidcXHUyMjFFJywnaW5maW50aWUnOidcXHUyOUREJywnaW5vZG90JzonXFx1MDEzMScsJ2ludCc6J1xcdTIyMkInLCdJbnQnOidcXHUyMjJDJywnaW50Y2FsJzonXFx1MjJCQScsJ2ludGVnZXJzJzonXFx1MjEyNCcsJ0ludGVncmFsJzonXFx1MjIyQicsJ2ludGVyY2FsJzonXFx1MjJCQScsJ0ludGVyc2VjdGlvbic6J1xcdTIyQzInLCdpbnRsYXJoayc6J1xcdTJBMTcnLCdpbnRwcm9kJzonXFx1MkEzQycsJ0ludmlzaWJsZUNvbW1hJzonXFx1MjA2MycsJ0ludmlzaWJsZVRpbWVzJzonXFx1MjA2MicsJ2lvY3knOidcXHUwNDUxJywnSU9jeSc6J1xcdTA0MDEnLCdpb2dvbic6J1xcdTAxMkYnLCdJb2dvbic6J1xcdTAxMkUnLCdpb3BmJzonXFx1RDgzNVxcdURENUEnLCdJb3BmJzonXFx1RDgzNVxcdURENDAnLCdpb3RhJzonXFx1MDNCOScsJ0lvdGEnOidcXHUwMzk5JywnaXByb2QnOidcXHUyQTNDJywnaXF1ZXN0JzonXFx4QkYnLCdpc2NyJzonXFx1RDgzNVxcdURDQkUnLCdJc2NyJzonXFx1MjExMCcsJ2lzaW4nOidcXHUyMjA4JywnaXNpbmRvdCc6J1xcdTIyRjUnLCdpc2luRSc6J1xcdTIyRjknLCdpc2lucyc6J1xcdTIyRjQnLCdpc2luc3YnOidcXHUyMkYzJywnaXNpbnYnOidcXHUyMjA4JywnaXQnOidcXHUyMDYyJywnaXRpbGRlJzonXFx1MDEyOScsJ0l0aWxkZSc6J1xcdTAxMjgnLCdpdWtjeSc6J1xcdTA0NTYnLCdJdWtjeSc6J1xcdTA0MDYnLCdpdW1sJzonXFx4RUYnLCdJdW1sJzonXFx4Q0YnLCdqY2lyYyc6J1xcdTAxMzUnLCdKY2lyYyc6J1xcdTAxMzQnLCdqY3knOidcXHUwNDM5JywnSmN5JzonXFx1MDQxOScsJ2pmcic6J1xcdUQ4MzVcXHVERDI3JywnSmZyJzonXFx1RDgzNVxcdUREMEQnLCdqbWF0aCc6J1xcdTAyMzcnLCdqb3BmJzonXFx1RDgzNVxcdURENUInLCdKb3BmJzonXFx1RDgzNVxcdURENDEnLCdqc2NyJzonXFx1RDgzNVxcdURDQkYnLCdKc2NyJzonXFx1RDgzNVxcdURDQTUnLCdqc2VyY3knOidcXHUwNDU4JywnSnNlcmN5JzonXFx1MDQwOCcsJ2p1a2N5JzonXFx1MDQ1NCcsJ0p1a2N5JzonXFx1MDQwNCcsJ2thcHBhJzonXFx1MDNCQScsJ0thcHBhJzonXFx1MDM5QScsJ2thcHBhdic6J1xcdTAzRjAnLCdrY2VkaWwnOidcXHUwMTM3JywnS2NlZGlsJzonXFx1MDEzNicsJ2tjeSc6J1xcdTA0M0EnLCdLY3knOidcXHUwNDFBJywna2ZyJzonXFx1RDgzNVxcdUREMjgnLCdLZnInOidcXHVEODM1XFx1REQwRScsJ2tncmVlbic6J1xcdTAxMzgnLCdraGN5JzonXFx1MDQ0NScsJ0tIY3knOidcXHUwNDI1Jywna2pjeSc6J1xcdTA0NUMnLCdLSmN5JzonXFx1MDQwQycsJ2tvcGYnOidcXHVEODM1XFx1REQ1QycsJ0tvcGYnOidcXHVEODM1XFx1REQ0MicsJ2tzY3InOidcXHVEODM1XFx1RENDMCcsJ0tzY3InOidcXHVEODM1XFx1RENBNicsJ2xBYXJyJzonXFx1MjFEQScsJ2xhY3V0ZSc6J1xcdTAxM0EnLCdMYWN1dGUnOidcXHUwMTM5JywnbGFlbXB0eXYnOidcXHUyOUI0JywnbGFncmFuJzonXFx1MjExMicsJ2xhbWJkYSc6J1xcdTAzQkInLCdMYW1iZGEnOidcXHUwMzlCJywnbGFuZyc6J1xcdTI3RTgnLCdMYW5nJzonXFx1MjdFQScsJ2xhbmdkJzonXFx1Mjk5MScsJ2xhbmdsZSc6J1xcdTI3RTgnLCdsYXAnOidcXHUyQTg1JywnTGFwbGFjZXRyZic6J1xcdTIxMTInLCdsYXF1byc6J1xceEFCJywnbGFycic6J1xcdTIxOTAnLCdsQXJyJzonXFx1MjFEMCcsJ0xhcnInOidcXHUyMTlFJywnbGFycmInOidcXHUyMUU0JywnbGFycmJmcyc6J1xcdTI5MUYnLCdsYXJyZnMnOidcXHUyOTFEJywnbGFycmhrJzonXFx1MjFBOScsJ2xhcnJscCc6J1xcdTIxQUInLCdsYXJycGwnOidcXHUyOTM5JywnbGFycnNpbSc6J1xcdTI5NzMnLCdsYXJydGwnOidcXHUyMUEyJywnbGF0JzonXFx1MkFBQicsJ2xhdGFpbCc6J1xcdTI5MTknLCdsQXRhaWwnOidcXHUyOTFCJywnbGF0ZSc6J1xcdTJBQUQnLCdsYXRlcyc6J1xcdTJBQURcXHVGRTAwJywnbGJhcnInOidcXHUyOTBDJywnbEJhcnInOidcXHUyOTBFJywnbGJicmsnOidcXHUyNzcyJywnbGJyYWNlJzoneycsJ2xicmFjayc6J1snLCdsYnJrZSc6J1xcdTI5OEInLCdsYnJrc2xkJzonXFx1Mjk4RicsJ2xicmtzbHUnOidcXHUyOThEJywnbGNhcm9uJzonXFx1MDEzRScsJ0xjYXJvbic6J1xcdTAxM0QnLCdsY2VkaWwnOidcXHUwMTNDJywnTGNlZGlsJzonXFx1MDEzQicsJ2xjZWlsJzonXFx1MjMwOCcsJ2xjdWInOid7JywnbGN5JzonXFx1MDQzQicsJ0xjeSc6J1xcdTA0MUInLCdsZGNhJzonXFx1MjkzNicsJ2xkcXVvJzonXFx1MjAxQycsJ2xkcXVvcic6J1xcdTIwMUUnLCdsZHJkaGFyJzonXFx1Mjk2NycsJ2xkcnVzaGFyJzonXFx1Mjk0QicsJ2xkc2gnOidcXHUyMUIyJywnbGUnOidcXHUyMjY0JywnbEUnOidcXHUyMjY2JywnTGVmdEFuZ2xlQnJhY2tldCc6J1xcdTI3RTgnLCdsZWZ0YXJyb3cnOidcXHUyMTkwJywnTGVmdGFycm93JzonXFx1MjFEMCcsJ0xlZnRBcnJvdyc6J1xcdTIxOTAnLCdMZWZ0QXJyb3dCYXInOidcXHUyMUU0JywnTGVmdEFycm93UmlnaHRBcnJvdyc6J1xcdTIxQzYnLCdsZWZ0YXJyb3d0YWlsJzonXFx1MjFBMicsJ0xlZnRDZWlsaW5nJzonXFx1MjMwOCcsJ0xlZnREb3VibGVCcmFja2V0JzonXFx1MjdFNicsJ0xlZnREb3duVGVlVmVjdG9yJzonXFx1Mjk2MScsJ0xlZnREb3duVmVjdG9yJzonXFx1MjFDMycsJ0xlZnREb3duVmVjdG9yQmFyJzonXFx1Mjk1OScsJ0xlZnRGbG9vcic6J1xcdTIzMEEnLCdsZWZ0aGFycG9vbmRvd24nOidcXHUyMUJEJywnbGVmdGhhcnBvb251cCc6J1xcdTIxQkMnLCdsZWZ0bGVmdGFycm93cyc6J1xcdTIxQzcnLCdsZWZ0cmlnaHRhcnJvdyc6J1xcdTIxOTQnLCdMZWZ0cmlnaHRhcnJvdyc6J1xcdTIxRDQnLCdMZWZ0UmlnaHRBcnJvdyc6J1xcdTIxOTQnLCdsZWZ0cmlnaHRhcnJvd3MnOidcXHUyMUM2JywnbGVmdHJpZ2h0aGFycG9vbnMnOidcXHUyMUNCJywnbGVmdHJpZ2h0c3F1aWdhcnJvdyc6J1xcdTIxQUQnLCdMZWZ0UmlnaHRWZWN0b3InOidcXHUyOTRFJywnTGVmdFRlZSc6J1xcdTIyQTMnLCdMZWZ0VGVlQXJyb3cnOidcXHUyMUE0JywnTGVmdFRlZVZlY3Rvcic6J1xcdTI5NUEnLCdsZWZ0dGhyZWV0aW1lcyc6J1xcdTIyQ0InLCdMZWZ0VHJpYW5nbGUnOidcXHUyMkIyJywnTGVmdFRyaWFuZ2xlQmFyJzonXFx1MjlDRicsJ0xlZnRUcmlhbmdsZUVxdWFsJzonXFx1MjJCNCcsJ0xlZnRVcERvd25WZWN0b3InOidcXHUyOTUxJywnTGVmdFVwVGVlVmVjdG9yJzonXFx1Mjk2MCcsJ0xlZnRVcFZlY3Rvcic6J1xcdTIxQkYnLCdMZWZ0VXBWZWN0b3JCYXInOidcXHUyOTU4JywnTGVmdFZlY3Rvcic6J1xcdTIxQkMnLCdMZWZ0VmVjdG9yQmFyJzonXFx1Mjk1MicsJ2xlZyc6J1xcdTIyREEnLCdsRWcnOidcXHUyQThCJywnbGVxJzonXFx1MjI2NCcsJ2xlcXEnOidcXHUyMjY2JywnbGVxc2xhbnQnOidcXHUyQTdEJywnbGVzJzonXFx1MkE3RCcsJ2xlc2NjJzonXFx1MkFBOCcsJ2xlc2RvdCc6J1xcdTJBN0YnLCdsZXNkb3RvJzonXFx1MkE4MScsJ2xlc2RvdG9yJzonXFx1MkE4MycsJ2xlc2cnOidcXHUyMkRBXFx1RkUwMCcsJ2xlc2dlcyc6J1xcdTJBOTMnLCdsZXNzYXBwcm94JzonXFx1MkE4NScsJ2xlc3Nkb3QnOidcXHUyMkQ2JywnbGVzc2VxZ3RyJzonXFx1MjJEQScsJ2xlc3NlcXFndHInOidcXHUyQThCJywnTGVzc0VxdWFsR3JlYXRlcic6J1xcdTIyREEnLCdMZXNzRnVsbEVxdWFsJzonXFx1MjI2NicsJ0xlc3NHcmVhdGVyJzonXFx1MjI3NicsJ2xlc3NndHInOidcXHUyMjc2JywnTGVzc0xlc3MnOidcXHUyQUExJywnbGVzc3NpbSc6J1xcdTIyNzInLCdMZXNzU2xhbnRFcXVhbCc6J1xcdTJBN0QnLCdMZXNzVGlsZGUnOidcXHUyMjcyJywnbGZpc2h0JzonXFx1Mjk3QycsJ2xmbG9vcic6J1xcdTIzMEEnLCdsZnInOidcXHVEODM1XFx1REQyOScsJ0xmcic6J1xcdUQ4MzVcXHVERDBGJywnbGcnOidcXHUyMjc2JywnbGdFJzonXFx1MkE5MScsJ2xIYXInOidcXHUyOTYyJywnbGhhcmQnOidcXHUyMUJEJywnbGhhcnUnOidcXHUyMUJDJywnbGhhcnVsJzonXFx1Mjk2QScsJ2xoYmxrJzonXFx1MjU4NCcsJ2xqY3knOidcXHUwNDU5JywnTEpjeSc6J1xcdTA0MDknLCdsbCc6J1xcdTIyNkEnLCdMbCc6J1xcdTIyRDgnLCdsbGFycic6J1xcdTIxQzcnLCdsbGNvcm5lcic6J1xcdTIzMUUnLCdMbGVmdGFycm93JzonXFx1MjFEQScsJ2xsaGFyZCc6J1xcdTI5NkInLCdsbHRyaSc6J1xcdTI1RkEnLCdsbWlkb3QnOidcXHUwMTQwJywnTG1pZG90JzonXFx1MDEzRicsJ2xtb3VzdCc6J1xcdTIzQjAnLCdsbW91c3RhY2hlJzonXFx1MjNCMCcsJ2xuYXAnOidcXHUyQTg5JywnbG5hcHByb3gnOidcXHUyQTg5JywnbG5lJzonXFx1MkE4NycsJ2xuRSc6J1xcdTIyNjgnLCdsbmVxJzonXFx1MkE4NycsJ2xuZXFxJzonXFx1MjI2OCcsJ2xuc2ltJzonXFx1MjJFNicsJ2xvYW5nJzonXFx1MjdFQycsJ2xvYXJyJzonXFx1MjFGRCcsJ2xvYnJrJzonXFx1MjdFNicsJ2xvbmdsZWZ0YXJyb3cnOidcXHUyN0Y1JywnTG9uZ2xlZnRhcnJvdyc6J1xcdTI3RjgnLCdMb25nTGVmdEFycm93JzonXFx1MjdGNScsJ2xvbmdsZWZ0cmlnaHRhcnJvdyc6J1xcdTI3RjcnLCdMb25nbGVmdHJpZ2h0YXJyb3cnOidcXHUyN0ZBJywnTG9uZ0xlZnRSaWdodEFycm93JzonXFx1MjdGNycsJ2xvbmdtYXBzdG8nOidcXHUyN0ZDJywnbG9uZ3JpZ2h0YXJyb3cnOidcXHUyN0Y2JywnTG9uZ3JpZ2h0YXJyb3cnOidcXHUyN0Y5JywnTG9uZ1JpZ2h0QXJyb3cnOidcXHUyN0Y2JywnbG9vcGFycm93bGVmdCc6J1xcdTIxQUInLCdsb29wYXJyb3dyaWdodCc6J1xcdTIxQUMnLCdsb3Bhcic6J1xcdTI5ODUnLCdsb3BmJzonXFx1RDgzNVxcdURENUQnLCdMb3BmJzonXFx1RDgzNVxcdURENDMnLCdsb3BsdXMnOidcXHUyQTJEJywnbG90aW1lcyc6J1xcdTJBMzQnLCdsb3dhc3QnOidcXHUyMjE3JywnbG93YmFyJzonXycsJ0xvd2VyTGVmdEFycm93JzonXFx1MjE5OScsJ0xvd2VyUmlnaHRBcnJvdyc6J1xcdTIxOTgnLCdsb3onOidcXHUyNUNBJywnbG96ZW5nZSc6J1xcdTI1Q0EnLCdsb3pmJzonXFx1MjlFQicsJ2xwYXInOicoJywnbHBhcmx0JzonXFx1Mjk5MycsJ2xyYXJyJzonXFx1MjFDNicsJ2xyY29ybmVyJzonXFx1MjMxRicsJ2xyaGFyJzonXFx1MjFDQicsJ2xyaGFyZCc6J1xcdTI5NkQnLCdscm0nOidcXHUyMDBFJywnbHJ0cmknOidcXHUyMkJGJywnbHNhcXVvJzonXFx1MjAzOScsJ2xzY3InOidcXHVEODM1XFx1RENDMScsJ0xzY3InOidcXHUyMTEyJywnbHNoJzonXFx1MjFCMCcsJ0xzaCc6J1xcdTIxQjAnLCdsc2ltJzonXFx1MjI3MicsJ2xzaW1lJzonXFx1MkE4RCcsJ2xzaW1nJzonXFx1MkE4RicsJ2xzcWInOidbJywnbHNxdW8nOidcXHUyMDE4JywnbHNxdW9yJzonXFx1MjAxQScsJ2xzdHJvayc6J1xcdTAxNDInLCdMc3Ryb2snOidcXHUwMTQxJywnbHQnOic8JywnTHQnOidcXHUyMjZBJywnTFQnOic8JywnbHRjYyc6J1xcdTJBQTYnLCdsdGNpcic6J1xcdTJBNzknLCdsdGRvdCc6J1xcdTIyRDYnLCdsdGhyZWUnOidcXHUyMkNCJywnbHRpbWVzJzonXFx1MjJDOScsJ2x0bGFycic6J1xcdTI5NzYnLCdsdHF1ZXN0JzonXFx1MkE3QicsJ2x0cmknOidcXHUyNUMzJywnbHRyaWUnOidcXHUyMkI0JywnbHRyaWYnOidcXHUyNUMyJywnbHRyUGFyJzonXFx1Mjk5NicsJ2x1cmRzaGFyJzonXFx1Mjk0QScsJ2x1cnVoYXInOidcXHUyOTY2JywnbHZlcnRuZXFxJzonXFx1MjI2OFxcdUZFMDAnLCdsdm5FJzonXFx1MjI2OFxcdUZFMDAnLCdtYWNyJzonXFx4QUYnLCdtYWxlJzonXFx1MjY0MicsJ21hbHQnOidcXHUyNzIwJywnbWFsdGVzZSc6J1xcdTI3MjAnLCdtYXAnOidcXHUyMUE2JywnTWFwJzonXFx1MjkwNScsJ21hcHN0byc6J1xcdTIxQTYnLCdtYXBzdG9kb3duJzonXFx1MjFBNycsJ21hcHN0b2xlZnQnOidcXHUyMUE0JywnbWFwc3RvdXAnOidcXHUyMUE1JywnbWFya2VyJzonXFx1MjVBRScsJ21jb21tYSc6J1xcdTJBMjknLCdtY3knOidcXHUwNDNDJywnTWN5JzonXFx1MDQxQycsJ21kYXNoJzonXFx1MjAxNCcsJ21ERG90JzonXFx1MjIzQScsJ21lYXN1cmVkYW5nbGUnOidcXHUyMjIxJywnTWVkaXVtU3BhY2UnOidcXHUyMDVGJywnTWVsbGludHJmJzonXFx1MjEzMycsJ21mcic6J1xcdUQ4MzVcXHVERDJBJywnTWZyJzonXFx1RDgzNVxcdUREMTAnLCdtaG8nOidcXHUyMTI3JywnbWljcm8nOidcXHhCNScsJ21pZCc6J1xcdTIyMjMnLCdtaWRhc3QnOicqJywnbWlkY2lyJzonXFx1MkFGMCcsJ21pZGRvdCc6J1xceEI3JywnbWludXMnOidcXHUyMjEyJywnbWludXNiJzonXFx1MjI5RicsJ21pbnVzZCc6J1xcdTIyMzgnLCdtaW51c2R1JzonXFx1MkEyQScsJ01pbnVzUGx1cyc6J1xcdTIyMTMnLCdtbGNwJzonXFx1MkFEQicsJ21sZHInOidcXHUyMDI2JywnbW5wbHVzJzonXFx1MjIxMycsJ21vZGVscyc6J1xcdTIyQTcnLCdtb3BmJzonXFx1RDgzNVxcdURENUUnLCdNb3BmJzonXFx1RDgzNVxcdURENDQnLCdtcCc6J1xcdTIyMTMnLCdtc2NyJzonXFx1RDgzNVxcdURDQzInLCdNc2NyJzonXFx1MjEzMycsJ21zdHBvcyc6J1xcdTIyM0UnLCdtdSc6J1xcdTAzQkMnLCdNdSc6J1xcdTAzOUMnLCdtdWx0aW1hcCc6J1xcdTIyQjgnLCdtdW1hcCc6J1xcdTIyQjgnLCduYWJsYSc6J1xcdTIyMDcnLCduYWN1dGUnOidcXHUwMTQ0JywnTmFjdXRlJzonXFx1MDE0MycsJ25hbmcnOidcXHUyMjIwXFx1MjBEMicsJ25hcCc6J1xcdTIyNDknLCduYXBFJzonXFx1MkE3MFxcdTAzMzgnLCduYXBpZCc6J1xcdTIyNEJcXHUwMzM4JywnbmFwb3MnOidcXHUwMTQ5JywnbmFwcHJveCc6J1xcdTIyNDknLCduYXR1cic6J1xcdTI2NkUnLCduYXR1cmFsJzonXFx1MjY2RScsJ25hdHVyYWxzJzonXFx1MjExNScsJ25ic3AnOidcXHhBMCcsJ25idW1wJzonXFx1MjI0RVxcdTAzMzgnLCduYnVtcGUnOidcXHUyMjRGXFx1MDMzOCcsJ25jYXAnOidcXHUyQTQzJywnbmNhcm9uJzonXFx1MDE0OCcsJ05jYXJvbic6J1xcdTAxNDcnLCduY2VkaWwnOidcXHUwMTQ2JywnTmNlZGlsJzonXFx1MDE0NScsJ25jb25nJzonXFx1MjI0NycsJ25jb25nZG90JzonXFx1MkE2RFxcdTAzMzgnLCduY3VwJzonXFx1MkE0MicsJ25jeSc6J1xcdTA0M0QnLCdOY3knOidcXHUwNDFEJywnbmRhc2gnOidcXHUyMDEzJywnbmUnOidcXHUyMjYwJywnbmVhcmhrJzonXFx1MjkyNCcsJ25lYXJyJzonXFx1MjE5NycsJ25lQXJyJzonXFx1MjFENycsJ25lYXJyb3cnOidcXHUyMTk3JywnbmVkb3QnOidcXHUyMjUwXFx1MDMzOCcsJ05lZ2F0aXZlTWVkaXVtU3BhY2UnOidcXHUyMDBCJywnTmVnYXRpdmVUaGlja1NwYWNlJzonXFx1MjAwQicsJ05lZ2F0aXZlVGhpblNwYWNlJzonXFx1MjAwQicsJ05lZ2F0aXZlVmVyeVRoaW5TcGFjZSc6J1xcdTIwMEInLCduZXF1aXYnOidcXHUyMjYyJywnbmVzZWFyJzonXFx1MjkyOCcsJ25lc2ltJzonXFx1MjI0MlxcdTAzMzgnLCdOZXN0ZWRHcmVhdGVyR3JlYXRlcic6J1xcdTIyNkInLCdOZXN0ZWRMZXNzTGVzcyc6J1xcdTIyNkEnLCdOZXdMaW5lJzonXFxuJywnbmV4aXN0JzonXFx1MjIwNCcsJ25leGlzdHMnOidcXHUyMjA0JywnbmZyJzonXFx1RDgzNVxcdUREMkInLCdOZnInOidcXHVEODM1XFx1REQxMScsJ25nZSc6J1xcdTIyNzEnLCduZ0UnOidcXHUyMjY3XFx1MDMzOCcsJ25nZXEnOidcXHUyMjcxJywnbmdlcXEnOidcXHUyMjY3XFx1MDMzOCcsJ25nZXFzbGFudCc6J1xcdTJBN0VcXHUwMzM4Jywnbmdlcyc6J1xcdTJBN0VcXHUwMzM4JywnbkdnJzonXFx1MjJEOVxcdTAzMzgnLCduZ3NpbSc6J1xcdTIyNzUnLCduZ3QnOidcXHUyMjZGJywnbkd0JzonXFx1MjI2QlxcdTIwRDInLCduZ3RyJzonXFx1MjI2RicsJ25HdHYnOidcXHUyMjZCXFx1MDMzOCcsJ25oYXJyJzonXFx1MjFBRScsJ25oQXJyJzonXFx1MjFDRScsJ25ocGFyJzonXFx1MkFGMicsJ25pJzonXFx1MjIwQicsJ25pcyc6J1xcdTIyRkMnLCduaXNkJzonXFx1MjJGQScsJ25pdic6J1xcdTIyMEInLCduamN5JzonXFx1MDQ1QScsJ05KY3knOidcXHUwNDBBJywnbmxhcnInOidcXHUyMTlBJywnbmxBcnInOidcXHUyMUNEJywnbmxkcic6J1xcdTIwMjUnLCdubGUnOidcXHUyMjcwJywnbmxFJzonXFx1MjI2NlxcdTAzMzgnLCdubGVmdGFycm93JzonXFx1MjE5QScsJ25MZWZ0YXJyb3cnOidcXHUyMUNEJywnbmxlZnRyaWdodGFycm93JzonXFx1MjFBRScsJ25MZWZ0cmlnaHRhcnJvdyc6J1xcdTIxQ0UnLCdubGVxJzonXFx1MjI3MCcsJ25sZXFxJzonXFx1MjI2NlxcdTAzMzgnLCdubGVxc2xhbnQnOidcXHUyQTdEXFx1MDMzOCcsJ25sZXMnOidcXHUyQTdEXFx1MDMzOCcsJ25sZXNzJzonXFx1MjI2RScsJ25MbCc6J1xcdTIyRDhcXHUwMzM4JywnbmxzaW0nOidcXHUyMjc0Jywnbmx0JzonXFx1MjI2RScsJ25MdCc6J1xcdTIyNkFcXHUyMEQyJywnbmx0cmknOidcXHUyMkVBJywnbmx0cmllJzonXFx1MjJFQycsJ25MdHYnOidcXHUyMjZBXFx1MDMzOCcsJ25taWQnOidcXHUyMjI0JywnTm9CcmVhayc6J1xcdTIwNjAnLCdOb25CcmVha2luZ1NwYWNlJzonXFx4QTAnLCdub3BmJzonXFx1RDgzNVxcdURENUYnLCdOb3BmJzonXFx1MjExNScsJ25vdCc6J1xceEFDJywnTm90JzonXFx1MkFFQycsJ05vdENvbmdydWVudCc6J1xcdTIyNjInLCdOb3RDdXBDYXAnOidcXHUyMjZEJywnTm90RG91YmxlVmVydGljYWxCYXInOidcXHUyMjI2JywnTm90RWxlbWVudCc6J1xcdTIyMDknLCdOb3RFcXVhbCc6J1xcdTIyNjAnLCdOb3RFcXVhbFRpbGRlJzonXFx1MjI0MlxcdTAzMzgnLCdOb3RFeGlzdHMnOidcXHUyMjA0JywnTm90R3JlYXRlcic6J1xcdTIyNkYnLCdOb3RHcmVhdGVyRXF1YWwnOidcXHUyMjcxJywnTm90R3JlYXRlckZ1bGxFcXVhbCc6J1xcdTIyNjdcXHUwMzM4JywnTm90R3JlYXRlckdyZWF0ZXInOidcXHUyMjZCXFx1MDMzOCcsJ05vdEdyZWF0ZXJMZXNzJzonXFx1MjI3OScsJ05vdEdyZWF0ZXJTbGFudEVxdWFsJzonXFx1MkE3RVxcdTAzMzgnLCdOb3RHcmVhdGVyVGlsZGUnOidcXHUyMjc1JywnTm90SHVtcERvd25IdW1wJzonXFx1MjI0RVxcdTAzMzgnLCdOb3RIdW1wRXF1YWwnOidcXHUyMjRGXFx1MDMzOCcsJ25vdGluJzonXFx1MjIwOScsJ25vdGluZG90JzonXFx1MjJGNVxcdTAzMzgnLCdub3RpbkUnOidcXHUyMkY5XFx1MDMzOCcsJ25vdGludmEnOidcXHUyMjA5Jywnbm90aW52Yic6J1xcdTIyRjcnLCdub3RpbnZjJzonXFx1MjJGNicsJ05vdExlZnRUcmlhbmdsZSc6J1xcdTIyRUEnLCdOb3RMZWZ0VHJpYW5nbGVCYXInOidcXHUyOUNGXFx1MDMzOCcsJ05vdExlZnRUcmlhbmdsZUVxdWFsJzonXFx1MjJFQycsJ05vdExlc3MnOidcXHUyMjZFJywnTm90TGVzc0VxdWFsJzonXFx1MjI3MCcsJ05vdExlc3NHcmVhdGVyJzonXFx1MjI3OCcsJ05vdExlc3NMZXNzJzonXFx1MjI2QVxcdTAzMzgnLCdOb3RMZXNzU2xhbnRFcXVhbCc6J1xcdTJBN0RcXHUwMzM4JywnTm90TGVzc1RpbGRlJzonXFx1MjI3NCcsJ05vdE5lc3RlZEdyZWF0ZXJHcmVhdGVyJzonXFx1MkFBMlxcdTAzMzgnLCdOb3ROZXN0ZWRMZXNzTGVzcyc6J1xcdTJBQTFcXHUwMzM4Jywnbm90bmknOidcXHUyMjBDJywnbm90bml2YSc6J1xcdTIyMEMnLCdub3RuaXZiJzonXFx1MjJGRScsJ25vdG5pdmMnOidcXHUyMkZEJywnTm90UHJlY2VkZXMnOidcXHUyMjgwJywnTm90UHJlY2VkZXNFcXVhbCc6J1xcdTJBQUZcXHUwMzM4JywnTm90UHJlY2VkZXNTbGFudEVxdWFsJzonXFx1MjJFMCcsJ05vdFJldmVyc2VFbGVtZW50JzonXFx1MjIwQycsJ05vdFJpZ2h0VHJpYW5nbGUnOidcXHUyMkVCJywnTm90UmlnaHRUcmlhbmdsZUJhcic6J1xcdTI5RDBcXHUwMzM4JywnTm90UmlnaHRUcmlhbmdsZUVxdWFsJzonXFx1MjJFRCcsJ05vdFNxdWFyZVN1YnNldCc6J1xcdTIyOEZcXHUwMzM4JywnTm90U3F1YXJlU3Vic2V0RXF1YWwnOidcXHUyMkUyJywnTm90U3F1YXJlU3VwZXJzZXQnOidcXHUyMjkwXFx1MDMzOCcsJ05vdFNxdWFyZVN1cGVyc2V0RXF1YWwnOidcXHUyMkUzJywnTm90U3Vic2V0JzonXFx1MjI4MlxcdTIwRDInLCdOb3RTdWJzZXRFcXVhbCc6J1xcdTIyODgnLCdOb3RTdWNjZWVkcyc6J1xcdTIyODEnLCdOb3RTdWNjZWVkc0VxdWFsJzonXFx1MkFCMFxcdTAzMzgnLCdOb3RTdWNjZWVkc1NsYW50RXF1YWwnOidcXHUyMkUxJywnTm90U3VjY2VlZHNUaWxkZSc6J1xcdTIyN0ZcXHUwMzM4JywnTm90U3VwZXJzZXQnOidcXHUyMjgzXFx1MjBEMicsJ05vdFN1cGVyc2V0RXF1YWwnOidcXHUyMjg5JywnTm90VGlsZGUnOidcXHUyMjQxJywnTm90VGlsZGVFcXVhbCc6J1xcdTIyNDQnLCdOb3RUaWxkZUZ1bGxFcXVhbCc6J1xcdTIyNDcnLCdOb3RUaWxkZVRpbGRlJzonXFx1MjI0OScsJ05vdFZlcnRpY2FsQmFyJzonXFx1MjIyNCcsJ25wYXInOidcXHUyMjI2JywnbnBhcmFsbGVsJzonXFx1MjIyNicsJ25wYXJzbCc6J1xcdTJBRkRcXHUyMEU1JywnbnBhcnQnOidcXHUyMjAyXFx1MDMzOCcsJ25wb2xpbnQnOidcXHUyQTE0JywnbnByJzonXFx1MjI4MCcsJ25wcmN1ZSc6J1xcdTIyRTAnLCducHJlJzonXFx1MkFBRlxcdTAzMzgnLCducHJlYyc6J1xcdTIyODAnLCducHJlY2VxJzonXFx1MkFBRlxcdTAzMzgnLCducmFycic6J1xcdTIxOUInLCduckFycic6J1xcdTIxQ0YnLCducmFycmMnOidcXHUyOTMzXFx1MDMzOCcsJ25yYXJydyc6J1xcdTIxOURcXHUwMzM4JywnbnJpZ2h0YXJyb3cnOidcXHUyMTlCJywnblJpZ2h0YXJyb3cnOidcXHUyMUNGJywnbnJ0cmknOidcXHUyMkVCJywnbnJ0cmllJzonXFx1MjJFRCcsJ25zYyc6J1xcdTIyODEnLCduc2NjdWUnOidcXHUyMkUxJywnbnNjZSc6J1xcdTJBQjBcXHUwMzM4JywnbnNjcic6J1xcdUQ4MzVcXHVEQ0MzJywnTnNjcic6J1xcdUQ4MzVcXHVEQ0E5JywnbnNob3J0bWlkJzonXFx1MjIyNCcsJ25zaG9ydHBhcmFsbGVsJzonXFx1MjIyNicsJ25zaW0nOidcXHUyMjQxJywnbnNpbWUnOidcXHUyMjQ0JywnbnNpbWVxJzonXFx1MjI0NCcsJ25zbWlkJzonXFx1MjIyNCcsJ25zcGFyJzonXFx1MjIyNicsJ25zcXN1YmUnOidcXHUyMkUyJywnbnNxc3VwZSc6J1xcdTIyRTMnLCduc3ViJzonXFx1MjI4NCcsJ25zdWJlJzonXFx1MjI4OCcsJ25zdWJFJzonXFx1MkFDNVxcdTAzMzgnLCduc3Vic2V0JzonXFx1MjI4MlxcdTIwRDInLCduc3Vic2V0ZXEnOidcXHUyMjg4JywnbnN1YnNldGVxcSc6J1xcdTJBQzVcXHUwMzM4JywnbnN1Y2MnOidcXHUyMjgxJywnbnN1Y2NlcSc6J1xcdTJBQjBcXHUwMzM4JywnbnN1cCc6J1xcdTIyODUnLCduc3VwZSc6J1xcdTIyODknLCduc3VwRSc6J1xcdTJBQzZcXHUwMzM4JywnbnN1cHNldCc6J1xcdTIyODNcXHUyMEQyJywnbnN1cHNldGVxJzonXFx1MjI4OScsJ25zdXBzZXRlcXEnOidcXHUyQUM2XFx1MDMzOCcsJ250Z2wnOidcXHUyMjc5JywnbnRpbGRlJzonXFx4RjEnLCdOdGlsZGUnOidcXHhEMScsJ250bGcnOidcXHUyMjc4JywnbnRyaWFuZ2xlbGVmdCc6J1xcdTIyRUEnLCdudHJpYW5nbGVsZWZ0ZXEnOidcXHUyMkVDJywnbnRyaWFuZ2xlcmlnaHQnOidcXHUyMkVCJywnbnRyaWFuZ2xlcmlnaHRlcSc6J1xcdTIyRUQnLCdudSc6J1xcdTAzQkQnLCdOdSc6J1xcdTAzOUQnLCdudW0nOicjJywnbnVtZXJvJzonXFx1MjExNicsJ251bXNwJzonXFx1MjAwNycsJ252YXAnOidcXHUyMjREXFx1MjBEMicsJ252ZGFzaCc6J1xcdTIyQUMnLCdudkRhc2gnOidcXHUyMkFEJywnblZkYXNoJzonXFx1MjJBRScsJ25WRGFzaCc6J1xcdTIyQUYnLCdudmdlJzonXFx1MjI2NVxcdTIwRDInLCdudmd0JzonPlxcdTIwRDInLCdudkhhcnInOidcXHUyOTA0JywnbnZpbmZpbic6J1xcdTI5REUnLCdudmxBcnInOidcXHUyOTAyJywnbnZsZSc6J1xcdTIyNjRcXHUyMEQyJywnbnZsdCc6JzxcXHUyMEQyJywnbnZsdHJpZSc6J1xcdTIyQjRcXHUyMEQyJywnbnZyQXJyJzonXFx1MjkwMycsJ252cnRyaWUnOidcXHUyMkI1XFx1MjBEMicsJ252c2ltJzonXFx1MjIzQ1xcdTIwRDInLCdud2FyaGsnOidcXHUyOTIzJywnbndhcnInOidcXHUyMTk2JywnbndBcnInOidcXHUyMUQ2JywnbndhcnJvdyc6J1xcdTIxOTYnLCdud25lYXInOidcXHUyOTI3Jywnb2FjdXRlJzonXFx4RjMnLCdPYWN1dGUnOidcXHhEMycsJ29hc3QnOidcXHUyMjlCJywnb2Npcic6J1xcdTIyOUEnLCdvY2lyYyc6J1xceEY0JywnT2NpcmMnOidcXHhENCcsJ29jeSc6J1xcdTA0M0UnLCdPY3knOidcXHUwNDFFJywnb2Rhc2gnOidcXHUyMjlEJywnb2RibGFjJzonXFx1MDE1MScsJ09kYmxhYyc6J1xcdTAxNTAnLCdvZGl2JzonXFx1MkEzOCcsJ29kb3QnOidcXHUyMjk5Jywnb2Rzb2xkJzonXFx1MjlCQycsJ29lbGlnJzonXFx1MDE1MycsJ09FbGlnJzonXFx1MDE1MicsJ29mY2lyJzonXFx1MjlCRicsJ29mcic6J1xcdUQ4MzVcXHVERDJDJywnT2ZyJzonXFx1RDgzNVxcdUREMTInLCdvZ29uJzonXFx1MDJEQicsJ29ncmF2ZSc6J1xceEYyJywnT2dyYXZlJzonXFx4RDInLCdvZ3QnOidcXHUyOUMxJywnb2hiYXInOidcXHUyOUI1Jywnb2htJzonXFx1MDNBOScsJ29pbnQnOidcXHUyMjJFJywnb2xhcnInOidcXHUyMUJBJywnb2xjaXInOidcXHUyOUJFJywnb2xjcm9zcyc6J1xcdTI5QkInLCdvbGluZSc6J1xcdTIwM0UnLCdvbHQnOidcXHUyOUMwJywnb21hY3InOidcXHUwMTREJywnT21hY3InOidcXHUwMTRDJywnb21lZ2EnOidcXHUwM0M5JywnT21lZ2EnOidcXHUwM0E5Jywnb21pY3Jvbic6J1xcdTAzQkYnLCdPbWljcm9uJzonXFx1MDM5RicsJ29taWQnOidcXHUyOUI2Jywnb21pbnVzJzonXFx1MjI5NicsJ29vcGYnOidcXHVEODM1XFx1REQ2MCcsJ09vcGYnOidcXHVEODM1XFx1REQ0NicsJ29wYXInOidcXHUyOUI3JywnT3BlbkN1cmx5RG91YmxlUXVvdGUnOidcXHUyMDFDJywnT3BlbkN1cmx5UXVvdGUnOidcXHUyMDE4Jywnb3BlcnAnOidcXHUyOUI5Jywnb3BsdXMnOidcXHUyMjk1Jywnb3InOidcXHUyMjI4JywnT3InOidcXHUyQTU0Jywnb3JhcnInOidcXHUyMUJCJywnb3JkJzonXFx1MkE1RCcsJ29yZGVyJzonXFx1MjEzNCcsJ29yZGVyb2YnOidcXHUyMTM0Jywnb3JkZic6J1xceEFBJywnb3JkbSc6J1xceEJBJywnb3JpZ29mJzonXFx1MjJCNicsJ29yb3InOidcXHUyQTU2Jywnb3JzbG9wZSc6J1xcdTJBNTcnLCdvcnYnOidcXHUyQTVCJywnb1MnOidcXHUyNEM4Jywnb3Njcic6J1xcdTIxMzQnLCdPc2NyJzonXFx1RDgzNVxcdURDQUEnLCdvc2xhc2gnOidcXHhGOCcsJ09zbGFzaCc6J1xceEQ4Jywnb3NvbCc6J1xcdTIyOTgnLCdvdGlsZGUnOidcXHhGNScsJ090aWxkZSc6J1xceEQ1Jywnb3RpbWVzJzonXFx1MjI5NycsJ090aW1lcyc6J1xcdTJBMzcnLCdvdGltZXNhcyc6J1xcdTJBMzYnLCdvdW1sJzonXFx4RjYnLCdPdW1sJzonXFx4RDYnLCdvdmJhcic6J1xcdTIzM0QnLCdPdmVyQmFyJzonXFx1MjAzRScsJ092ZXJCcmFjZSc6J1xcdTIzREUnLCdPdmVyQnJhY2tldCc6J1xcdTIzQjQnLCdPdmVyUGFyZW50aGVzaXMnOidcXHUyM0RDJywncGFyJzonXFx1MjIyNScsJ3BhcmEnOidcXHhCNicsJ3BhcmFsbGVsJzonXFx1MjIyNScsJ3BhcnNpbSc6J1xcdTJBRjMnLCdwYXJzbCc6J1xcdTJBRkQnLCdwYXJ0JzonXFx1MjIwMicsJ1BhcnRpYWxEJzonXFx1MjIwMicsJ3BjeSc6J1xcdTA0M0YnLCdQY3knOidcXHUwNDFGJywncGVyY250JzonJScsJ3BlcmlvZCc6Jy4nLCdwZXJtaWwnOidcXHUyMDMwJywncGVycCc6J1xcdTIyQTUnLCdwZXJ0ZW5rJzonXFx1MjAzMScsJ3Bmcic6J1xcdUQ4MzVcXHVERDJEJywnUGZyJzonXFx1RDgzNVxcdUREMTMnLCdwaGknOidcXHUwM0M2JywnUGhpJzonXFx1MDNBNicsJ3BoaXYnOidcXHUwM0Q1JywncGhtbWF0JzonXFx1MjEzMycsJ3Bob25lJzonXFx1MjYwRScsJ3BpJzonXFx1MDNDMCcsJ1BpJzonXFx1MDNBMCcsJ3BpdGNoZm9yayc6J1xcdTIyRDQnLCdwaXYnOidcXHUwM0Q2JywncGxhbmNrJzonXFx1MjEwRicsJ3BsYW5ja2gnOidcXHUyMTBFJywncGxhbmt2JzonXFx1MjEwRicsJ3BsdXMnOicrJywncGx1c2FjaXInOidcXHUyQTIzJywncGx1c2InOidcXHUyMjlFJywncGx1c2Npcic6J1xcdTJBMjInLCdwbHVzZG8nOidcXHUyMjE0JywncGx1c2R1JzonXFx1MkEyNScsJ3BsdXNlJzonXFx1MkE3MicsJ1BsdXNNaW51cyc6J1xceEIxJywncGx1c21uJzonXFx4QjEnLCdwbHVzc2ltJzonXFx1MkEyNicsJ3BsdXN0d28nOidcXHUyQTI3JywncG0nOidcXHhCMScsJ1BvaW5jYXJlcGxhbmUnOidcXHUyMTBDJywncG9pbnRpbnQnOidcXHUyQTE1JywncG9wZic6J1xcdUQ4MzVcXHVERDYxJywnUG9wZic6J1xcdTIxMTknLCdwb3VuZCc6J1xceEEzJywncHInOidcXHUyMjdBJywnUHInOidcXHUyQUJCJywncHJhcCc6J1xcdTJBQjcnLCdwcmN1ZSc6J1xcdTIyN0MnLCdwcmUnOidcXHUyQUFGJywncHJFJzonXFx1MkFCMycsJ3ByZWMnOidcXHUyMjdBJywncHJlY2FwcHJveCc6J1xcdTJBQjcnLCdwcmVjY3VybHllcSc6J1xcdTIyN0MnLCdQcmVjZWRlcyc6J1xcdTIyN0EnLCdQcmVjZWRlc0VxdWFsJzonXFx1MkFBRicsJ1ByZWNlZGVzU2xhbnRFcXVhbCc6J1xcdTIyN0MnLCdQcmVjZWRlc1RpbGRlJzonXFx1MjI3RScsJ3ByZWNlcSc6J1xcdTJBQUYnLCdwcmVjbmFwcHJveCc6J1xcdTJBQjknLCdwcmVjbmVxcSc6J1xcdTJBQjUnLCdwcmVjbnNpbSc6J1xcdTIyRTgnLCdwcmVjc2ltJzonXFx1MjI3RScsJ3ByaW1lJzonXFx1MjAzMicsJ1ByaW1lJzonXFx1MjAzMycsJ3ByaW1lcyc6J1xcdTIxMTknLCdwcm5hcCc6J1xcdTJBQjknLCdwcm5FJzonXFx1MkFCNScsJ3BybnNpbSc6J1xcdTIyRTgnLCdwcm9kJzonXFx1MjIwRicsJ1Byb2R1Y3QnOidcXHUyMjBGJywncHJvZmFsYXInOidcXHUyMzJFJywncHJvZmxpbmUnOidcXHUyMzEyJywncHJvZnN1cmYnOidcXHUyMzEzJywncHJvcCc6J1xcdTIyMUQnLCdQcm9wb3J0aW9uJzonXFx1MjIzNycsJ1Byb3BvcnRpb25hbCc6J1xcdTIyMUQnLCdwcm9wdG8nOidcXHUyMjFEJywncHJzaW0nOidcXHUyMjdFJywncHJ1cmVsJzonXFx1MjJCMCcsJ3BzY3InOidcXHVEODM1XFx1RENDNScsJ1BzY3InOidcXHVEODM1XFx1RENBQicsJ3BzaSc6J1xcdTAzQzgnLCdQc2knOidcXHUwM0E4JywncHVuY3NwJzonXFx1MjAwOCcsJ3Fmcic6J1xcdUQ4MzVcXHVERDJFJywnUWZyJzonXFx1RDgzNVxcdUREMTQnLCdxaW50JzonXFx1MkEwQycsJ3FvcGYnOidcXHVEODM1XFx1REQ2MicsJ1FvcGYnOidcXHUyMTFBJywncXByaW1lJzonXFx1MjA1NycsJ3FzY3InOidcXHVEODM1XFx1RENDNicsJ1FzY3InOidcXHVEODM1XFx1RENBQycsJ3F1YXRlcm5pb25zJzonXFx1MjEwRCcsJ3F1YXRpbnQnOidcXHUyQTE2JywncXVlc3QnOic/JywncXVlc3RlcSc6J1xcdTIyNUYnLCdxdW90JzonXCInLCdRVU9UJzonXCInLCdyQWFycic6J1xcdTIxREInLCdyYWNlJzonXFx1MjIzRFxcdTAzMzEnLCdyYWN1dGUnOidcXHUwMTU1JywnUmFjdXRlJzonXFx1MDE1NCcsJ3JhZGljJzonXFx1MjIxQScsJ3JhZW1wdHl2JzonXFx1MjlCMycsJ3JhbmcnOidcXHUyN0U5JywnUmFuZyc6J1xcdTI3RUInLCdyYW5nZCc6J1xcdTI5OTInLCdyYW5nZSc6J1xcdTI5QTUnLCdyYW5nbGUnOidcXHUyN0U5JywncmFxdW8nOidcXHhCQicsJ3JhcnInOidcXHUyMTkyJywnckFycic6J1xcdTIxRDInLCdSYXJyJzonXFx1MjFBMCcsJ3JhcnJhcCc6J1xcdTI5NzUnLCdyYXJyYic6J1xcdTIxRTUnLCdyYXJyYmZzJzonXFx1MjkyMCcsJ3JhcnJjJzonXFx1MjkzMycsJ3JhcnJmcyc6J1xcdTI5MUUnLCdyYXJyaGsnOidcXHUyMUFBJywncmFycmxwJzonXFx1MjFBQycsJ3JhcnJwbCc6J1xcdTI5NDUnLCdyYXJyc2ltJzonXFx1Mjk3NCcsJ3JhcnJ0bCc6J1xcdTIxQTMnLCdSYXJydGwnOidcXHUyOTE2JywncmFycncnOidcXHUyMTlEJywncmF0YWlsJzonXFx1MjkxQScsJ3JBdGFpbCc6J1xcdTI5MUMnLCdyYXRpbyc6J1xcdTIyMzYnLCdyYXRpb25hbHMnOidcXHUyMTFBJywncmJhcnInOidcXHUyOTBEJywnckJhcnInOidcXHUyOTBGJywnUkJhcnInOidcXHUyOTEwJywncmJicmsnOidcXHUyNzczJywncmJyYWNlJzonfScsJ3JicmFjayc6J10nLCdyYnJrZSc6J1xcdTI5OEMnLCdyYnJrc2xkJzonXFx1Mjk4RScsJ3JicmtzbHUnOidcXHUyOTkwJywncmNhcm9uJzonXFx1MDE1OScsJ1JjYXJvbic6J1xcdTAxNTgnLCdyY2VkaWwnOidcXHUwMTU3JywnUmNlZGlsJzonXFx1MDE1NicsJ3JjZWlsJzonXFx1MjMwOScsJ3JjdWInOid9JywncmN5JzonXFx1MDQ0MCcsJ1JjeSc6J1xcdTA0MjAnLCdyZGNhJzonXFx1MjkzNycsJ3JkbGRoYXInOidcXHUyOTY5JywncmRxdW8nOidcXHUyMDFEJywncmRxdW9yJzonXFx1MjAxRCcsJ3Jkc2gnOidcXHUyMUIzJywnUmUnOidcXHUyMTFDJywncmVhbCc6J1xcdTIxMUMnLCdyZWFsaW5lJzonXFx1MjExQicsJ3JlYWxwYXJ0JzonXFx1MjExQycsJ3JlYWxzJzonXFx1MjExRCcsJ3JlY3QnOidcXHUyNUFEJywncmVnJzonXFx4QUUnLCdSRUcnOidcXHhBRScsJ1JldmVyc2VFbGVtZW50JzonXFx1MjIwQicsJ1JldmVyc2VFcXVpbGlicml1bSc6J1xcdTIxQ0InLCdSZXZlcnNlVXBFcXVpbGlicml1bSc6J1xcdTI5NkYnLCdyZmlzaHQnOidcXHUyOTdEJywncmZsb29yJzonXFx1MjMwQicsJ3Jmcic6J1xcdUQ4MzVcXHVERDJGJywnUmZyJzonXFx1MjExQycsJ3JIYXInOidcXHUyOTY0JywncmhhcmQnOidcXHUyMUMxJywncmhhcnUnOidcXHUyMUMwJywncmhhcnVsJzonXFx1Mjk2QycsJ3Jobyc6J1xcdTAzQzEnLCdSaG8nOidcXHUwM0ExJywncmhvdic6J1xcdTAzRjEnLCdSaWdodEFuZ2xlQnJhY2tldCc6J1xcdTI3RTknLCdyaWdodGFycm93JzonXFx1MjE5MicsJ1JpZ2h0YXJyb3cnOidcXHUyMUQyJywnUmlnaHRBcnJvdyc6J1xcdTIxOTInLCdSaWdodEFycm93QmFyJzonXFx1MjFFNScsJ1JpZ2h0QXJyb3dMZWZ0QXJyb3cnOidcXHUyMUM0JywncmlnaHRhcnJvd3RhaWwnOidcXHUyMUEzJywnUmlnaHRDZWlsaW5nJzonXFx1MjMwOScsJ1JpZ2h0RG91YmxlQnJhY2tldCc6J1xcdTI3RTcnLCdSaWdodERvd25UZWVWZWN0b3InOidcXHUyOTVEJywnUmlnaHREb3duVmVjdG9yJzonXFx1MjFDMicsJ1JpZ2h0RG93blZlY3RvckJhcic6J1xcdTI5NTUnLCdSaWdodEZsb29yJzonXFx1MjMwQicsJ3JpZ2h0aGFycG9vbmRvd24nOidcXHUyMUMxJywncmlnaHRoYXJwb29udXAnOidcXHUyMUMwJywncmlnaHRsZWZ0YXJyb3dzJzonXFx1MjFDNCcsJ3JpZ2h0bGVmdGhhcnBvb25zJzonXFx1MjFDQycsJ3JpZ2h0cmlnaHRhcnJvd3MnOidcXHUyMUM5JywncmlnaHRzcXVpZ2Fycm93JzonXFx1MjE5RCcsJ1JpZ2h0VGVlJzonXFx1MjJBMicsJ1JpZ2h0VGVlQXJyb3cnOidcXHUyMUE2JywnUmlnaHRUZWVWZWN0b3InOidcXHUyOTVCJywncmlnaHR0aHJlZXRpbWVzJzonXFx1MjJDQycsJ1JpZ2h0VHJpYW5nbGUnOidcXHUyMkIzJywnUmlnaHRUcmlhbmdsZUJhcic6J1xcdTI5RDAnLCdSaWdodFRyaWFuZ2xlRXF1YWwnOidcXHUyMkI1JywnUmlnaHRVcERvd25WZWN0b3InOidcXHUyOTRGJywnUmlnaHRVcFRlZVZlY3Rvcic6J1xcdTI5NUMnLCdSaWdodFVwVmVjdG9yJzonXFx1MjFCRScsJ1JpZ2h0VXBWZWN0b3JCYXInOidcXHUyOTU0JywnUmlnaHRWZWN0b3InOidcXHUyMUMwJywnUmlnaHRWZWN0b3JCYXInOidcXHUyOTUzJywncmluZyc6J1xcdTAyREEnLCdyaXNpbmdkb3RzZXEnOidcXHUyMjUzJywncmxhcnInOidcXHUyMUM0JywncmxoYXInOidcXHUyMUNDJywncmxtJzonXFx1MjAwRicsJ3Jtb3VzdCc6J1xcdTIzQjEnLCdybW91c3RhY2hlJzonXFx1MjNCMScsJ3JubWlkJzonXFx1MkFFRScsJ3JvYW5nJzonXFx1MjdFRCcsJ3JvYXJyJzonXFx1MjFGRScsJ3JvYnJrJzonXFx1MjdFNycsJ3JvcGFyJzonXFx1Mjk4NicsJ3JvcGYnOidcXHVEODM1XFx1REQ2MycsJ1JvcGYnOidcXHUyMTFEJywncm9wbHVzJzonXFx1MkEyRScsJ3JvdGltZXMnOidcXHUyQTM1JywnUm91bmRJbXBsaWVzJzonXFx1Mjk3MCcsJ3JwYXInOicpJywncnBhcmd0JzonXFx1Mjk5NCcsJ3JwcG9saW50JzonXFx1MkExMicsJ3JyYXJyJzonXFx1MjFDOScsJ1JyaWdodGFycm93JzonXFx1MjFEQicsJ3JzYXF1byc6J1xcdTIwM0EnLCdyc2NyJzonXFx1RDgzNVxcdURDQzcnLCdSc2NyJzonXFx1MjExQicsJ3JzaCc6J1xcdTIxQjEnLCdSc2gnOidcXHUyMUIxJywncnNxYic6J10nLCdyc3F1byc6J1xcdTIwMTknLCdyc3F1b3InOidcXHUyMDE5JywncnRocmVlJzonXFx1MjJDQycsJ3J0aW1lcyc6J1xcdTIyQ0EnLCdydHJpJzonXFx1MjVCOScsJ3J0cmllJzonXFx1MjJCNScsJ3J0cmlmJzonXFx1MjVCOCcsJ3J0cmlsdHJpJzonXFx1MjlDRScsJ1J1bGVEZWxheWVkJzonXFx1MjlGNCcsJ3J1bHVoYXInOidcXHUyOTY4JywncngnOidcXHUyMTFFJywnc2FjdXRlJzonXFx1MDE1QicsJ1NhY3V0ZSc6J1xcdTAxNUEnLCdzYnF1byc6J1xcdTIwMUEnLCdzYyc6J1xcdTIyN0InLCdTYyc6J1xcdTJBQkMnLCdzY2FwJzonXFx1MkFCOCcsJ3NjYXJvbic6J1xcdTAxNjEnLCdTY2Fyb24nOidcXHUwMTYwJywnc2NjdWUnOidcXHUyMjdEJywnc2NlJzonXFx1MkFCMCcsJ3NjRSc6J1xcdTJBQjQnLCdzY2VkaWwnOidcXHUwMTVGJywnU2NlZGlsJzonXFx1MDE1RScsJ3NjaXJjJzonXFx1MDE1RCcsJ1NjaXJjJzonXFx1MDE1QycsJ3NjbmFwJzonXFx1MkFCQScsJ3NjbkUnOidcXHUyQUI2Jywnc2Nuc2ltJzonXFx1MjJFOScsJ3NjcG9saW50JzonXFx1MkExMycsJ3Njc2ltJzonXFx1MjI3RicsJ3NjeSc6J1xcdTA0NDEnLCdTY3knOidcXHUwNDIxJywnc2RvdCc6J1xcdTIyQzUnLCdzZG90Yic6J1xcdTIyQTEnLCdzZG90ZSc6J1xcdTJBNjYnLCdzZWFyaGsnOidcXHUyOTI1Jywnc2VhcnInOidcXHUyMTk4Jywnc2VBcnInOidcXHUyMUQ4Jywnc2VhcnJvdyc6J1xcdTIxOTgnLCdzZWN0JzonXFx4QTcnLCdzZW1pJzonOycsJ3Nlc3dhcic6J1xcdTI5MjknLCdzZXRtaW51cyc6J1xcdTIyMTYnLCdzZXRtbic6J1xcdTIyMTYnLCdzZXh0JzonXFx1MjczNicsJ3Nmcic6J1xcdUQ4MzVcXHVERDMwJywnU2ZyJzonXFx1RDgzNVxcdUREMTYnLCdzZnJvd24nOidcXHUyMzIyJywnc2hhcnAnOidcXHUyNjZGJywnc2hjaGN5JzonXFx1MDQ0OScsJ1NIQ0hjeSc6J1xcdTA0MjknLCdzaGN5JzonXFx1MDQ0OCcsJ1NIY3knOidcXHUwNDI4JywnU2hvcnREb3duQXJyb3cnOidcXHUyMTkzJywnU2hvcnRMZWZ0QXJyb3cnOidcXHUyMTkwJywnc2hvcnRtaWQnOidcXHUyMjIzJywnc2hvcnRwYXJhbGxlbCc6J1xcdTIyMjUnLCdTaG9ydFJpZ2h0QXJyb3cnOidcXHUyMTkyJywnU2hvcnRVcEFycm93JzonXFx1MjE5MScsJ3NoeSc6J1xceEFEJywnc2lnbWEnOidcXHUwM0MzJywnU2lnbWEnOidcXHUwM0EzJywnc2lnbWFmJzonXFx1MDNDMicsJ3NpZ21hdic6J1xcdTAzQzInLCdzaW0nOidcXHUyMjNDJywnc2ltZG90JzonXFx1MkE2QScsJ3NpbWUnOidcXHUyMjQzJywnc2ltZXEnOidcXHUyMjQzJywnc2ltZyc6J1xcdTJBOUUnLCdzaW1nRSc6J1xcdTJBQTAnLCdzaW1sJzonXFx1MkE5RCcsJ3NpbWxFJzonXFx1MkE5RicsJ3NpbW5lJzonXFx1MjI0NicsJ3NpbXBsdXMnOidcXHUyQTI0Jywnc2ltcmFycic6J1xcdTI5NzInLCdzbGFycic6J1xcdTIxOTAnLCdTbWFsbENpcmNsZSc6J1xcdTIyMTgnLCdzbWFsbHNldG1pbnVzJzonXFx1MjIxNicsJ3NtYXNocCc6J1xcdTJBMzMnLCdzbWVwYXJzbCc6J1xcdTI5RTQnLCdzbWlkJzonXFx1MjIyMycsJ3NtaWxlJzonXFx1MjMyMycsJ3NtdCc6J1xcdTJBQUEnLCdzbXRlJzonXFx1MkFBQycsJ3NtdGVzJzonXFx1MkFBQ1xcdUZFMDAnLCdzb2Z0Y3knOidcXHUwNDRDJywnU09GVGN5JzonXFx1MDQyQycsJ3NvbCc6Jy8nLCdzb2xiJzonXFx1MjlDNCcsJ3NvbGJhcic6J1xcdTIzM0YnLCdzb3BmJzonXFx1RDgzNVxcdURENjQnLCdTb3BmJzonXFx1RDgzNVxcdURENEEnLCdzcGFkZXMnOidcXHUyNjYwJywnc3BhZGVzdWl0JzonXFx1MjY2MCcsJ3NwYXInOidcXHUyMjI1Jywnc3FjYXAnOidcXHUyMjkzJywnc3FjYXBzJzonXFx1MjI5M1xcdUZFMDAnLCdzcWN1cCc6J1xcdTIyOTQnLCdzcWN1cHMnOidcXHUyMjk0XFx1RkUwMCcsJ1NxcnQnOidcXHUyMjFBJywnc3FzdWInOidcXHUyMjhGJywnc3FzdWJlJzonXFx1MjI5MScsJ3Nxc3Vic2V0JzonXFx1MjI4RicsJ3Nxc3Vic2V0ZXEnOidcXHUyMjkxJywnc3FzdXAnOidcXHUyMjkwJywnc3FzdXBlJzonXFx1MjI5MicsJ3Nxc3Vwc2V0JzonXFx1MjI5MCcsJ3Nxc3Vwc2V0ZXEnOidcXHUyMjkyJywnc3F1JzonXFx1MjVBMScsJ3NxdWFyZSc6J1xcdTI1QTEnLCdTcXVhcmUnOidcXHUyNUExJywnU3F1YXJlSW50ZXJzZWN0aW9uJzonXFx1MjI5MycsJ1NxdWFyZVN1YnNldCc6J1xcdTIyOEYnLCdTcXVhcmVTdWJzZXRFcXVhbCc6J1xcdTIyOTEnLCdTcXVhcmVTdXBlcnNldCc6J1xcdTIyOTAnLCdTcXVhcmVTdXBlcnNldEVxdWFsJzonXFx1MjI5MicsJ1NxdWFyZVVuaW9uJzonXFx1MjI5NCcsJ3NxdWFyZic6J1xcdTI1QUEnLCdzcXVmJzonXFx1MjVBQScsJ3NyYXJyJzonXFx1MjE5MicsJ3NzY3InOidcXHVEODM1XFx1RENDOCcsJ1NzY3InOidcXHVEODM1XFx1RENBRScsJ3NzZXRtbic6J1xcdTIyMTYnLCdzc21pbGUnOidcXHUyMzIzJywnc3N0YXJmJzonXFx1MjJDNicsJ3N0YXInOidcXHUyNjA2JywnU3Rhcic6J1xcdTIyQzYnLCdzdGFyZic6J1xcdTI2MDUnLCdzdHJhaWdodGVwc2lsb24nOidcXHUwM0Y1Jywnc3RyYWlnaHRwaGknOidcXHUwM0Q1Jywnc3RybnMnOidcXHhBRicsJ3N1Yic6J1xcdTIyODInLCdTdWInOidcXHUyMkQwJywnc3ViZG90JzonXFx1MkFCRCcsJ3N1YmUnOidcXHUyMjg2Jywnc3ViRSc6J1xcdTJBQzUnLCdzdWJlZG90JzonXFx1MkFDMycsJ3N1Ym11bHQnOidcXHUyQUMxJywnc3VibmUnOidcXHUyMjhBJywnc3VibkUnOidcXHUyQUNCJywnc3VicGx1cyc6J1xcdTJBQkYnLCdzdWJyYXJyJzonXFx1Mjk3OScsJ3N1YnNldCc6J1xcdTIyODInLCdTdWJzZXQnOidcXHUyMkQwJywnc3Vic2V0ZXEnOidcXHUyMjg2Jywnc3Vic2V0ZXFxJzonXFx1MkFDNScsJ1N1YnNldEVxdWFsJzonXFx1MjI4NicsJ3N1YnNldG5lcSc6J1xcdTIyOEEnLCdzdWJzZXRuZXFxJzonXFx1MkFDQicsJ3N1YnNpbSc6J1xcdTJBQzcnLCdzdWJzdWInOidcXHUyQUQ1Jywnc3Vic3VwJzonXFx1MkFEMycsJ3N1Y2MnOidcXHUyMjdCJywnc3VjY2FwcHJveCc6J1xcdTJBQjgnLCdzdWNjY3VybHllcSc6J1xcdTIyN0QnLCdTdWNjZWVkcyc6J1xcdTIyN0InLCdTdWNjZWVkc0VxdWFsJzonXFx1MkFCMCcsJ1N1Y2NlZWRzU2xhbnRFcXVhbCc6J1xcdTIyN0QnLCdTdWNjZWVkc1RpbGRlJzonXFx1MjI3RicsJ3N1Y2NlcSc6J1xcdTJBQjAnLCdzdWNjbmFwcHJveCc6J1xcdTJBQkEnLCdzdWNjbmVxcSc6J1xcdTJBQjYnLCdzdWNjbnNpbSc6J1xcdTIyRTknLCdzdWNjc2ltJzonXFx1MjI3RicsJ1N1Y2hUaGF0JzonXFx1MjIwQicsJ3N1bSc6J1xcdTIyMTEnLCdTdW0nOidcXHUyMjExJywnc3VuZyc6J1xcdTI2NkEnLCdzdXAnOidcXHUyMjgzJywnU3VwJzonXFx1MjJEMScsJ3N1cDEnOidcXHhCOScsJ3N1cDInOidcXHhCMicsJ3N1cDMnOidcXHhCMycsJ3N1cGRvdCc6J1xcdTJBQkUnLCdzdXBkc3ViJzonXFx1MkFEOCcsJ3N1cGUnOidcXHUyMjg3Jywnc3VwRSc6J1xcdTJBQzYnLCdzdXBlZG90JzonXFx1MkFDNCcsJ1N1cGVyc2V0JzonXFx1MjI4MycsJ1N1cGVyc2V0RXF1YWwnOidcXHUyMjg3Jywnc3VwaHNvbCc6J1xcdTI3QzknLCdzdXBoc3ViJzonXFx1MkFENycsJ3N1cGxhcnInOidcXHUyOTdCJywnc3VwbXVsdCc6J1xcdTJBQzInLCdzdXBuZSc6J1xcdTIyOEInLCdzdXBuRSc6J1xcdTJBQ0MnLCdzdXBwbHVzJzonXFx1MkFDMCcsJ3N1cHNldCc6J1xcdTIyODMnLCdTdXBzZXQnOidcXHUyMkQxJywnc3Vwc2V0ZXEnOidcXHUyMjg3Jywnc3Vwc2V0ZXFxJzonXFx1MkFDNicsJ3N1cHNldG5lcSc6J1xcdTIyOEInLCdzdXBzZXRuZXFxJzonXFx1MkFDQycsJ3N1cHNpbSc6J1xcdTJBQzgnLCdzdXBzdWInOidcXHUyQUQ0Jywnc3Vwc3VwJzonXFx1MkFENicsJ3N3YXJoayc6J1xcdTI5MjYnLCdzd2Fycic6J1xcdTIxOTknLCdzd0Fycic6J1xcdTIxRDknLCdzd2Fycm93JzonXFx1MjE5OScsJ3N3bndhcic6J1xcdTI5MkEnLCdzemxpZyc6J1xceERGJywnVGFiJzonXFx0JywndGFyZ2V0JzonXFx1MjMxNicsJ3RhdSc6J1xcdTAzQzQnLCdUYXUnOidcXHUwM0E0JywndGJyayc6J1xcdTIzQjQnLCd0Y2Fyb24nOidcXHUwMTY1JywnVGNhcm9uJzonXFx1MDE2NCcsJ3RjZWRpbCc6J1xcdTAxNjMnLCdUY2VkaWwnOidcXHUwMTYyJywndGN5JzonXFx1MDQ0MicsJ1RjeSc6J1xcdTA0MjInLCd0ZG90JzonXFx1MjBEQicsJ3RlbHJlYyc6J1xcdTIzMTUnLCd0ZnInOidcXHVEODM1XFx1REQzMScsJ1Rmcic6J1xcdUQ4MzVcXHVERDE3JywndGhlcmU0JzonXFx1MjIzNCcsJ3RoZXJlZm9yZSc6J1xcdTIyMzQnLCdUaGVyZWZvcmUnOidcXHUyMjM0JywndGhldGEnOidcXHUwM0I4JywnVGhldGEnOidcXHUwMzk4JywndGhldGFzeW0nOidcXHUwM0QxJywndGhldGF2JzonXFx1MDNEMScsJ3RoaWNrYXBwcm94JzonXFx1MjI0OCcsJ3RoaWNrc2ltJzonXFx1MjIzQycsJ1RoaWNrU3BhY2UnOidcXHUyMDVGXFx1MjAwQScsJ3RoaW5zcCc6J1xcdTIwMDknLCdUaGluU3BhY2UnOidcXHUyMDA5JywndGhrYXAnOidcXHUyMjQ4JywndGhrc2ltJzonXFx1MjIzQycsJ3Rob3JuJzonXFx4RkUnLCdUSE9STic6J1xceERFJywndGlsZGUnOidcXHUwMkRDJywnVGlsZGUnOidcXHUyMjNDJywnVGlsZGVFcXVhbCc6J1xcdTIyNDMnLCdUaWxkZUZ1bGxFcXVhbCc6J1xcdTIyNDUnLCdUaWxkZVRpbGRlJzonXFx1MjI0OCcsJ3RpbWVzJzonXFx4RDcnLCd0aW1lc2InOidcXHUyMkEwJywndGltZXNiYXInOidcXHUyQTMxJywndGltZXNkJzonXFx1MkEzMCcsJ3RpbnQnOidcXHUyMjJEJywndG9lYSc6J1xcdTI5MjgnLCd0b3AnOidcXHUyMkE0JywndG9wYm90JzonXFx1MjMzNicsJ3RvcGNpcic6J1xcdTJBRjEnLCd0b3BmJzonXFx1RDgzNVxcdURENjUnLCdUb3BmJzonXFx1RDgzNVxcdURENEInLCd0b3Bmb3JrJzonXFx1MkFEQScsJ3Rvc2EnOidcXHUyOTI5JywndHByaW1lJzonXFx1MjAzNCcsJ3RyYWRlJzonXFx1MjEyMicsJ1RSQURFJzonXFx1MjEyMicsJ3RyaWFuZ2xlJzonXFx1MjVCNScsJ3RyaWFuZ2xlZG93bic6J1xcdTI1QkYnLCd0cmlhbmdsZWxlZnQnOidcXHUyNUMzJywndHJpYW5nbGVsZWZ0ZXEnOidcXHUyMkI0JywndHJpYW5nbGVxJzonXFx1MjI1QycsJ3RyaWFuZ2xlcmlnaHQnOidcXHUyNUI5JywndHJpYW5nbGVyaWdodGVxJzonXFx1MjJCNScsJ3RyaWRvdCc6J1xcdTI1RUMnLCd0cmllJzonXFx1MjI1QycsJ3RyaW1pbnVzJzonXFx1MkEzQScsJ1RyaXBsZURvdCc6J1xcdTIwREInLCd0cmlwbHVzJzonXFx1MkEzOScsJ3RyaXNiJzonXFx1MjlDRCcsJ3RyaXRpbWUnOidcXHUyQTNCJywndHJwZXppdW0nOidcXHUyM0UyJywndHNjcic6J1xcdUQ4MzVcXHVEQ0M5JywnVHNjcic6J1xcdUQ4MzVcXHVEQ0FGJywndHNjeSc6J1xcdTA0NDYnLCdUU2N5JzonXFx1MDQyNicsJ3RzaGN5JzonXFx1MDQ1QicsJ1RTSGN5JzonXFx1MDQwQicsJ3RzdHJvayc6J1xcdTAxNjcnLCdUc3Ryb2snOidcXHUwMTY2JywndHdpeHQnOidcXHUyMjZDJywndHdvaGVhZGxlZnRhcnJvdyc6J1xcdTIxOUUnLCd0d29oZWFkcmlnaHRhcnJvdyc6J1xcdTIxQTAnLCd1YWN1dGUnOidcXHhGQScsJ1VhY3V0ZSc6J1xceERBJywndWFycic6J1xcdTIxOTEnLCd1QXJyJzonXFx1MjFEMScsJ1VhcnInOidcXHUyMTlGJywnVWFycm9jaXInOidcXHUyOTQ5JywndWJyY3knOidcXHUwNDVFJywnVWJyY3knOidcXHUwNDBFJywndWJyZXZlJzonXFx1MDE2RCcsJ1VicmV2ZSc6J1xcdTAxNkMnLCd1Y2lyYyc6J1xceEZCJywnVWNpcmMnOidcXHhEQicsJ3VjeSc6J1xcdTA0NDMnLCdVY3knOidcXHUwNDIzJywndWRhcnInOidcXHUyMUM1JywndWRibGFjJzonXFx1MDE3MScsJ1VkYmxhYyc6J1xcdTAxNzAnLCd1ZGhhcic6J1xcdTI5NkUnLCd1ZmlzaHQnOidcXHUyOTdFJywndWZyJzonXFx1RDgzNVxcdUREMzInLCdVZnInOidcXHVEODM1XFx1REQxOCcsJ3VncmF2ZSc6J1xceEY5JywnVWdyYXZlJzonXFx4RDknLCd1SGFyJzonXFx1Mjk2MycsJ3VoYXJsJzonXFx1MjFCRicsJ3VoYXJyJzonXFx1MjFCRScsJ3VoYmxrJzonXFx1MjU4MCcsJ3VsY29ybic6J1xcdTIzMUMnLCd1bGNvcm5lcic6J1xcdTIzMUMnLCd1bGNyb3AnOidcXHUyMzBGJywndWx0cmknOidcXHUyNUY4JywndW1hY3InOidcXHUwMTZCJywnVW1hY3InOidcXHUwMTZBJywndW1sJzonXFx4QTgnLCdVbmRlckJhcic6J18nLCdVbmRlckJyYWNlJzonXFx1MjNERicsJ1VuZGVyQnJhY2tldCc6J1xcdTIzQjUnLCdVbmRlclBhcmVudGhlc2lzJzonXFx1MjNERCcsJ1VuaW9uJzonXFx1MjJDMycsJ1VuaW9uUGx1cyc6J1xcdTIyOEUnLCd1b2dvbic6J1xcdTAxNzMnLCdVb2dvbic6J1xcdTAxNzInLCd1b3BmJzonXFx1RDgzNVxcdURENjYnLCdVb3BmJzonXFx1RDgzNVxcdURENEMnLCd1cGFycm93JzonXFx1MjE5MScsJ1VwYXJyb3cnOidcXHUyMUQxJywnVXBBcnJvdyc6J1xcdTIxOTEnLCdVcEFycm93QmFyJzonXFx1MjkxMicsJ1VwQXJyb3dEb3duQXJyb3cnOidcXHUyMUM1JywndXBkb3duYXJyb3cnOidcXHUyMTk1JywnVXBkb3duYXJyb3cnOidcXHUyMUQ1JywnVXBEb3duQXJyb3cnOidcXHUyMTk1JywnVXBFcXVpbGlicml1bSc6J1xcdTI5NkUnLCd1cGhhcnBvb25sZWZ0JzonXFx1MjFCRicsJ3VwaGFycG9vbnJpZ2h0JzonXFx1MjFCRScsJ3VwbHVzJzonXFx1MjI4RScsJ1VwcGVyTGVmdEFycm93JzonXFx1MjE5NicsJ1VwcGVyUmlnaHRBcnJvdyc6J1xcdTIxOTcnLCd1cHNpJzonXFx1MDNDNScsJ1Vwc2knOidcXHUwM0QyJywndXBzaWgnOidcXHUwM0QyJywndXBzaWxvbic6J1xcdTAzQzUnLCdVcHNpbG9uJzonXFx1MDNBNScsJ1VwVGVlJzonXFx1MjJBNScsJ1VwVGVlQXJyb3cnOidcXHUyMUE1JywndXB1cGFycm93cyc6J1xcdTIxQzgnLCd1cmNvcm4nOidcXHUyMzFEJywndXJjb3JuZXInOidcXHUyMzFEJywndXJjcm9wJzonXFx1MjMwRScsJ3VyaW5nJzonXFx1MDE2RicsJ1VyaW5nJzonXFx1MDE2RScsJ3VydHJpJzonXFx1MjVGOScsJ3VzY3InOidcXHVEODM1XFx1RENDQScsJ1VzY3InOidcXHVEODM1XFx1RENCMCcsJ3V0ZG90JzonXFx1MjJGMCcsJ3V0aWxkZSc6J1xcdTAxNjknLCdVdGlsZGUnOidcXHUwMTY4JywndXRyaSc6J1xcdTI1QjUnLCd1dHJpZic6J1xcdTI1QjQnLCd1dWFycic6J1xcdTIxQzgnLCd1dW1sJzonXFx4RkMnLCdVdW1sJzonXFx4REMnLCd1d2FuZ2xlJzonXFx1MjlBNycsJ3ZhbmdydCc6J1xcdTI5OUMnLCd2YXJlcHNpbG9uJzonXFx1MDNGNScsJ3ZhcmthcHBhJzonXFx1MDNGMCcsJ3Zhcm5vdGhpbmcnOidcXHUyMjA1JywndmFycGhpJzonXFx1MDNENScsJ3ZhcnBpJzonXFx1MDNENicsJ3ZhcnByb3B0byc6J1xcdTIyMUQnLCd2YXJyJzonXFx1MjE5NScsJ3ZBcnInOidcXHUyMUQ1JywndmFycmhvJzonXFx1MDNGMScsJ3ZhcnNpZ21hJzonXFx1MDNDMicsJ3ZhcnN1YnNldG5lcSc6J1xcdTIyOEFcXHVGRTAwJywndmFyc3Vic2V0bmVxcSc6J1xcdTJBQ0JcXHVGRTAwJywndmFyc3Vwc2V0bmVxJzonXFx1MjI4QlxcdUZFMDAnLCd2YXJzdXBzZXRuZXFxJzonXFx1MkFDQ1xcdUZFMDAnLCd2YXJ0aGV0YSc6J1xcdTAzRDEnLCd2YXJ0cmlhbmdsZWxlZnQnOidcXHUyMkIyJywndmFydHJpYW5nbGVyaWdodCc6J1xcdTIyQjMnLCd2QmFyJzonXFx1MkFFOCcsJ1ZiYXInOidcXHUyQUVCJywndkJhcnYnOidcXHUyQUU5JywndmN5JzonXFx1MDQzMicsJ1ZjeSc6J1xcdTA0MTInLCd2ZGFzaCc6J1xcdTIyQTInLCd2RGFzaCc6J1xcdTIyQTgnLCdWZGFzaCc6J1xcdTIyQTknLCdWRGFzaCc6J1xcdTIyQUInLCdWZGFzaGwnOidcXHUyQUU2JywndmVlJzonXFx1MjIyOCcsJ1ZlZSc6J1xcdTIyQzEnLCd2ZWViYXInOidcXHUyMkJCJywndmVlZXEnOidcXHUyMjVBJywndmVsbGlwJzonXFx1MjJFRScsJ3ZlcmJhcic6J3wnLCdWZXJiYXInOidcXHUyMDE2JywndmVydCc6J3wnLCdWZXJ0JzonXFx1MjAxNicsJ1ZlcnRpY2FsQmFyJzonXFx1MjIyMycsJ1ZlcnRpY2FsTGluZSc6J3wnLCdWZXJ0aWNhbFNlcGFyYXRvcic6J1xcdTI3NTgnLCdWZXJ0aWNhbFRpbGRlJzonXFx1MjI0MCcsJ1ZlcnlUaGluU3BhY2UnOidcXHUyMDBBJywndmZyJzonXFx1RDgzNVxcdUREMzMnLCdWZnInOidcXHVEODM1XFx1REQxOScsJ3ZsdHJpJzonXFx1MjJCMicsJ3Zuc3ViJzonXFx1MjI4MlxcdTIwRDInLCd2bnN1cCc6J1xcdTIyODNcXHUyMEQyJywndm9wZic6J1xcdUQ4MzVcXHVERDY3JywnVm9wZic6J1xcdUQ4MzVcXHVERDREJywndnByb3AnOidcXHUyMjFEJywndnJ0cmknOidcXHUyMkIzJywndnNjcic6J1xcdUQ4MzVcXHVEQ0NCJywnVnNjcic6J1xcdUQ4MzVcXHVEQ0IxJywndnN1Ym5lJzonXFx1MjI4QVxcdUZFMDAnLCd2c3VibkUnOidcXHUyQUNCXFx1RkUwMCcsJ3ZzdXBuZSc6J1xcdTIyOEJcXHVGRTAwJywndnN1cG5FJzonXFx1MkFDQ1xcdUZFMDAnLCdWdmRhc2gnOidcXHUyMkFBJywndnppZ3phZyc6J1xcdTI5OUEnLCd3Y2lyYyc6J1xcdTAxNzUnLCdXY2lyYyc6J1xcdTAxNzQnLCd3ZWRiYXInOidcXHUyQTVGJywnd2VkZ2UnOidcXHUyMjI3JywnV2VkZ2UnOidcXHUyMkMwJywnd2VkZ2VxJzonXFx1MjI1OScsJ3dlaWVycCc6J1xcdTIxMTgnLCd3ZnInOidcXHVEODM1XFx1REQzNCcsJ1dmcic6J1xcdUQ4MzVcXHVERDFBJywnd29wZic6J1xcdUQ4MzVcXHVERDY4JywnV29wZic6J1xcdUQ4MzVcXHVERDRFJywnd3AnOidcXHUyMTE4Jywnd3InOidcXHUyMjQwJywnd3JlYXRoJzonXFx1MjI0MCcsJ3dzY3InOidcXHVEODM1XFx1RENDQycsJ1dzY3InOidcXHVEODM1XFx1RENCMicsJ3hjYXAnOidcXHUyMkMyJywneGNpcmMnOidcXHUyNUVGJywneGN1cCc6J1xcdTIyQzMnLCd4ZHRyaSc6J1xcdTI1QkQnLCd4ZnInOidcXHVEODM1XFx1REQzNScsJ1hmcic6J1xcdUQ4MzVcXHVERDFCJywneGhhcnInOidcXHUyN0Y3JywneGhBcnInOidcXHUyN0ZBJywneGknOidcXHUwM0JFJywnWGknOidcXHUwMzlFJywneGxhcnInOidcXHUyN0Y1JywneGxBcnInOidcXHUyN0Y4JywneG1hcCc6J1xcdTI3RkMnLCd4bmlzJzonXFx1MjJGQicsJ3hvZG90JzonXFx1MkEwMCcsJ3hvcGYnOidcXHVEODM1XFx1REQ2OScsJ1hvcGYnOidcXHVEODM1XFx1REQ0RicsJ3hvcGx1cyc6J1xcdTJBMDEnLCd4b3RpbWUnOidcXHUyQTAyJywneHJhcnInOidcXHUyN0Y2JywneHJBcnInOidcXHUyN0Y5JywneHNjcic6J1xcdUQ4MzVcXHVEQ0NEJywnWHNjcic6J1xcdUQ4MzVcXHVEQ0IzJywneHNxY3VwJzonXFx1MkEwNicsJ3h1cGx1cyc6J1xcdTJBMDQnLCd4dXRyaSc6J1xcdTI1QjMnLCd4dmVlJzonXFx1MjJDMScsJ3h3ZWRnZSc6J1xcdTIyQzAnLCd5YWN1dGUnOidcXHhGRCcsJ1lhY3V0ZSc6J1xceEREJywneWFjeSc6J1xcdTA0NEYnLCdZQWN5JzonXFx1MDQyRicsJ3ljaXJjJzonXFx1MDE3NycsJ1ljaXJjJzonXFx1MDE3NicsJ3ljeSc6J1xcdTA0NEInLCdZY3knOidcXHUwNDJCJywneWVuJzonXFx4QTUnLCd5ZnInOidcXHVEODM1XFx1REQzNicsJ1lmcic6J1xcdUQ4MzVcXHVERDFDJywneWljeSc6J1xcdTA0NTcnLCdZSWN5JzonXFx1MDQwNycsJ3lvcGYnOidcXHVEODM1XFx1REQ2QScsJ1lvcGYnOidcXHVEODM1XFx1REQ1MCcsJ3lzY3InOidcXHVEODM1XFx1RENDRScsJ1lzY3InOidcXHVEODM1XFx1RENCNCcsJ3l1Y3knOidcXHUwNDRFJywnWVVjeSc6J1xcdTA0MkUnLCd5dW1sJzonXFx4RkYnLCdZdW1sJzonXFx1MDE3OCcsJ3phY3V0ZSc6J1xcdTAxN0EnLCdaYWN1dGUnOidcXHUwMTc5JywnemNhcm9uJzonXFx1MDE3RScsJ1pjYXJvbic6J1xcdTAxN0QnLCd6Y3knOidcXHUwNDM3JywnWmN5JzonXFx1MDQxNycsJ3pkb3QnOidcXHUwMTdDJywnWmRvdCc6J1xcdTAxN0InLCd6ZWV0cmYnOidcXHUyMTI4JywnWmVyb1dpZHRoU3BhY2UnOidcXHUyMDBCJywnemV0YSc6J1xcdTAzQjYnLCdaZXRhJzonXFx1MDM5NicsJ3pmcic6J1xcdUQ4MzVcXHVERDM3JywnWmZyJzonXFx1MjEyOCcsJ3poY3knOidcXHUwNDM2JywnWkhjeSc6J1xcdTA0MTYnLCd6aWdyYXJyJzonXFx1MjFERCcsJ3pvcGYnOidcXHVEODM1XFx1REQ2QicsJ1pvcGYnOidcXHUyMTI0JywnenNjcic6J1xcdUQ4MzVcXHVEQ0NGJywnWnNjcic6J1xcdUQ4MzVcXHVEQ0I1JywnendqJzonXFx1MjAwRCcsJ3p3bmonOidcXHUyMDBDJ307XG5cdHZhciBkZWNvZGVNYXBMZWdhY3kgPSB7J2FhY3V0ZSc6J1xceEUxJywnQWFjdXRlJzonXFx4QzEnLCdhY2lyYyc6J1xceEUyJywnQWNpcmMnOidcXHhDMicsJ2FjdXRlJzonXFx4QjQnLCdhZWxpZyc6J1xceEU2JywnQUVsaWcnOidcXHhDNicsJ2FncmF2ZSc6J1xceEUwJywnQWdyYXZlJzonXFx4QzAnLCdhbXAnOicmJywnQU1QJzonJicsJ2FyaW5nJzonXFx4RTUnLCdBcmluZyc6J1xceEM1JywnYXRpbGRlJzonXFx4RTMnLCdBdGlsZGUnOidcXHhDMycsJ2F1bWwnOidcXHhFNCcsJ0F1bWwnOidcXHhDNCcsJ2JydmJhcic6J1xceEE2JywnY2NlZGlsJzonXFx4RTcnLCdDY2VkaWwnOidcXHhDNycsJ2NlZGlsJzonXFx4QjgnLCdjZW50JzonXFx4QTInLCdjb3B5JzonXFx4QTknLCdDT1BZJzonXFx4QTknLCdjdXJyZW4nOidcXHhBNCcsJ2RlZyc6J1xceEIwJywnZGl2aWRlJzonXFx4RjcnLCdlYWN1dGUnOidcXHhFOScsJ0VhY3V0ZSc6J1xceEM5JywnZWNpcmMnOidcXHhFQScsJ0VjaXJjJzonXFx4Q0EnLCdlZ3JhdmUnOidcXHhFOCcsJ0VncmF2ZSc6J1xceEM4JywnZXRoJzonXFx4RjAnLCdFVEgnOidcXHhEMCcsJ2V1bWwnOidcXHhFQicsJ0V1bWwnOidcXHhDQicsJ2ZyYWMxMic6J1xceEJEJywnZnJhYzE0JzonXFx4QkMnLCdmcmFjMzQnOidcXHhCRScsJ2d0JzonPicsJ0dUJzonPicsJ2lhY3V0ZSc6J1xceEVEJywnSWFjdXRlJzonXFx4Q0QnLCdpY2lyYyc6J1xceEVFJywnSWNpcmMnOidcXHhDRScsJ2lleGNsJzonXFx4QTEnLCdpZ3JhdmUnOidcXHhFQycsJ0lncmF2ZSc6J1xceENDJywnaXF1ZXN0JzonXFx4QkYnLCdpdW1sJzonXFx4RUYnLCdJdW1sJzonXFx4Q0YnLCdsYXF1byc6J1xceEFCJywnbHQnOic8JywnTFQnOic8JywnbWFjcic6J1xceEFGJywnbWljcm8nOidcXHhCNScsJ21pZGRvdCc6J1xceEI3JywnbmJzcCc6J1xceEEwJywnbm90JzonXFx4QUMnLCdudGlsZGUnOidcXHhGMScsJ050aWxkZSc6J1xceEQxJywnb2FjdXRlJzonXFx4RjMnLCdPYWN1dGUnOidcXHhEMycsJ29jaXJjJzonXFx4RjQnLCdPY2lyYyc6J1xceEQ0Jywnb2dyYXZlJzonXFx4RjInLCdPZ3JhdmUnOidcXHhEMicsJ29yZGYnOidcXHhBQScsJ29yZG0nOidcXHhCQScsJ29zbGFzaCc6J1xceEY4JywnT3NsYXNoJzonXFx4RDgnLCdvdGlsZGUnOidcXHhGNScsJ090aWxkZSc6J1xceEQ1Jywnb3VtbCc6J1xceEY2JywnT3VtbCc6J1xceEQ2JywncGFyYSc6J1xceEI2JywncGx1c21uJzonXFx4QjEnLCdwb3VuZCc6J1xceEEzJywncXVvdCc6J1wiJywnUVVPVCc6J1wiJywncmFxdW8nOidcXHhCQicsJ3JlZyc6J1xceEFFJywnUkVHJzonXFx4QUUnLCdzZWN0JzonXFx4QTcnLCdzaHknOidcXHhBRCcsJ3N1cDEnOidcXHhCOScsJ3N1cDInOidcXHhCMicsJ3N1cDMnOidcXHhCMycsJ3N6bGlnJzonXFx4REYnLCd0aG9ybic6J1xceEZFJywnVEhPUk4nOidcXHhERScsJ3RpbWVzJzonXFx4RDcnLCd1YWN1dGUnOidcXHhGQScsJ1VhY3V0ZSc6J1xceERBJywndWNpcmMnOidcXHhGQicsJ1VjaXJjJzonXFx4REInLCd1Z3JhdmUnOidcXHhGOScsJ1VncmF2ZSc6J1xceEQ5JywndW1sJzonXFx4QTgnLCd1dW1sJzonXFx4RkMnLCdVdW1sJzonXFx4REMnLCd5YWN1dGUnOidcXHhGRCcsJ1lhY3V0ZSc6J1xceEREJywneWVuJzonXFx4QTUnLCd5dW1sJzonXFx4RkYnfTtcblx0dmFyIGRlY29kZU1hcE51bWVyaWMgPSB7JzAnOidcXHVGRkZEJywnMTI4JzonXFx1MjBBQycsJzEzMCc6J1xcdTIwMUEnLCcxMzEnOidcXHUwMTkyJywnMTMyJzonXFx1MjAxRScsJzEzMyc6J1xcdTIwMjYnLCcxMzQnOidcXHUyMDIwJywnMTM1JzonXFx1MjAyMScsJzEzNic6J1xcdTAyQzYnLCcxMzcnOidcXHUyMDMwJywnMTM4JzonXFx1MDE2MCcsJzEzOSc6J1xcdTIwMzknLCcxNDAnOidcXHUwMTUyJywnMTQyJzonXFx1MDE3RCcsJzE0NSc6J1xcdTIwMTgnLCcxNDYnOidcXHUyMDE5JywnMTQ3JzonXFx1MjAxQycsJzE0OCc6J1xcdTIwMUQnLCcxNDknOidcXHUyMDIyJywnMTUwJzonXFx1MjAxMycsJzE1MSc6J1xcdTIwMTQnLCcxNTInOidcXHUwMkRDJywnMTUzJzonXFx1MjEyMicsJzE1NCc6J1xcdTAxNjEnLCcxNTUnOidcXHUyMDNBJywnMTU2JzonXFx1MDE1MycsJzE1OCc6J1xcdTAxN0UnLCcxNTknOidcXHUwMTc4J307XG5cdHZhciBpbnZhbGlkUmVmZXJlbmNlQ29kZVBvaW50cyA9IFsxLDIsMyw0LDUsNiw3LDgsMTEsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMTI3LDEyOCwxMjksMTMwLDEzMSwxMzIsMTMzLDEzNCwxMzUsMTM2LDEzNywxMzgsMTM5LDE0MCwxNDEsMTQyLDE0MywxNDQsMTQ1LDE0NiwxNDcsMTQ4LDE0OSwxNTAsMTUxLDE1MiwxNTMsMTU0LDE1NSwxNTYsMTU3LDE1OCwxNTksNjQ5NzYsNjQ5NzcsNjQ5NzgsNjQ5NzksNjQ5ODAsNjQ5ODEsNjQ5ODIsNjQ5ODMsNjQ5ODQsNjQ5ODUsNjQ5ODYsNjQ5ODcsNjQ5ODgsNjQ5ODksNjQ5OTAsNjQ5OTEsNjQ5OTIsNjQ5OTMsNjQ5OTQsNjQ5OTUsNjQ5OTYsNjQ5OTcsNjQ5OTgsNjQ5OTksNjUwMDAsNjUwMDEsNjUwMDIsNjUwMDMsNjUwMDQsNjUwMDUsNjUwMDYsNjUwMDcsNjU1MzQsNjU1MzUsMTMxMDcwLDEzMTA3MSwxOTY2MDYsMTk2NjA3LDI2MjE0MiwyNjIxNDMsMzI3Njc4LDMyNzY3OSwzOTMyMTQsMzkzMjE1LDQ1ODc1MCw0NTg3NTEsNTI0Mjg2LDUyNDI4Nyw1ODk4MjIsNTg5ODIzLDY1NTM1OCw2NTUzNTksNzIwODk0LDcyMDg5NSw3ODY0MzAsNzg2NDMxLDg1MTk2Niw4NTE5NjcsOTE3NTAyLDkxNzUwMyw5ODMwMzgsOTgzMDM5LDEwNDg1NzQsMTA0ODU3NSwxMTE0MTEwLDExMTQxMTFdO1xuXG5cdC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5cdHZhciBzdHJpbmdGcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlO1xuXG5cdHZhciBvYmplY3QgPSB7fTtcblx0dmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0Lmhhc093blByb3BlcnR5O1xuXHR2YXIgaGFzID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eU5hbWUpIHtcblx0XHRyZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5TmFtZSk7XG5cdH07XG5cblx0dmFyIGNvbnRhaW5zID0gZnVuY3Rpb24oYXJyYXksIHZhbHVlKSB7XG5cdFx0dmFyIGluZGV4ID0gLTE7XG5cdFx0dmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblx0XHR3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuXHRcdFx0aWYgKGFycmF5W2luZGV4XSA9PSB2YWx1ZSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9O1xuXG5cdHZhciBtZXJnZSA9IGZ1bmN0aW9uKG9wdGlvbnMsIGRlZmF1bHRzKSB7XG5cdFx0aWYgKCFvcHRpb25zKSB7XG5cdFx0XHRyZXR1cm4gZGVmYXVsdHM7XG5cdFx0fVxuXHRcdHZhciByZXN1bHQgPSB7fTtcblx0XHR2YXIga2V5O1xuXHRcdGZvciAoa2V5IGluIGRlZmF1bHRzKSB7XG5cdFx0XHQvLyBBIGBoYXNPd25Qcm9wZXJ0eWAgY2hlY2sgaXMgbm90IG5lZWRlZCBoZXJlLCBzaW5jZSBvbmx5IHJlY29nbml6ZWRcblx0XHRcdC8vIG9wdGlvbiBuYW1lcyBhcmUgdXNlZCBhbnl3YXkuIEFueSBvdGhlcnMgYXJlIGlnbm9yZWQuXG5cdFx0XHRyZXN1bHRba2V5XSA9IGhhcyhvcHRpb25zLCBrZXkpID8gb3B0aW9uc1trZXldIDogZGVmYXVsdHNba2V5XTtcblx0XHR9XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fTtcblxuXHQvLyBNb2RpZmllZCB2ZXJzaW9uIG9mIGB1Y3MyZW5jb2RlYDsgc2VlIGh0dHBzOi8vbXRocy5iZS9wdW55Y29kZS5cblx0dmFyIGNvZGVQb2ludFRvU3ltYm9sID0gZnVuY3Rpb24oY29kZVBvaW50LCBzdHJpY3QpIHtcblx0XHR2YXIgb3V0cHV0ID0gJyc7XG5cdFx0aWYgKChjb2RlUG9pbnQgPj0gMHhEODAwICYmIGNvZGVQb2ludCA8PSAweERGRkYpIHx8IGNvZGVQb2ludCA+IDB4MTBGRkZGKSB7XG5cdFx0XHQvLyBTZWUgaXNzdWUgIzQ6XG5cdFx0XHQvLyDigJxPdGhlcndpc2UsIGlmIHRoZSBudW1iZXIgaXMgaW4gdGhlIHJhbmdlIDB4RDgwMCB0byAweERGRkYgb3IgaXNcblx0XHRcdC8vIGdyZWF0ZXIgdGhhbiAweDEwRkZGRiwgdGhlbiB0aGlzIGlzIGEgcGFyc2UgZXJyb3IuIFJldHVybiBhIFUrRkZGRFxuXHRcdFx0Ly8gUkVQTEFDRU1FTlQgQ0hBUkFDVEVSLuKAnVxuXHRcdFx0aWYgKHN0cmljdCkge1xuXHRcdFx0XHRwYXJzZUVycm9yKCdjaGFyYWN0ZXIgcmVmZXJlbmNlIG91dHNpZGUgdGhlIHBlcm1pc3NpYmxlIFVuaWNvZGUgcmFuZ2UnKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiAnXFx1RkZGRCc7XG5cdFx0fVxuXHRcdGlmIChoYXMoZGVjb2RlTWFwTnVtZXJpYywgY29kZVBvaW50KSkge1xuXHRcdFx0aWYgKHN0cmljdCkge1xuXHRcdFx0XHRwYXJzZUVycm9yKCdkaXNhbGxvd2VkIGNoYXJhY3RlciByZWZlcmVuY2UnKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBkZWNvZGVNYXBOdW1lcmljW2NvZGVQb2ludF07XG5cdFx0fVxuXHRcdGlmIChzdHJpY3QgJiYgY29udGFpbnMoaW52YWxpZFJlZmVyZW5jZUNvZGVQb2ludHMsIGNvZGVQb2ludCkpIHtcblx0XHRcdHBhcnNlRXJyb3IoJ2Rpc2FsbG93ZWQgY2hhcmFjdGVyIHJlZmVyZW5jZScpO1xuXHRcdH1cblx0XHRpZiAoY29kZVBvaW50ID4gMHhGRkZGKSB7XG5cdFx0XHRjb2RlUG9pbnQgLT0gMHgxMDAwMDtcblx0XHRcdG91dHB1dCArPSBzdHJpbmdGcm9tQ2hhckNvZGUoY29kZVBvaW50ID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKTtcblx0XHRcdGNvZGVQb2ludCA9IDB4REMwMCB8IGNvZGVQb2ludCAmIDB4M0ZGO1xuXHRcdH1cblx0XHRvdXRwdXQgKz0gc3RyaW5nRnJvbUNoYXJDb2RlKGNvZGVQb2ludCk7XG5cdFx0cmV0dXJuIG91dHB1dDtcblx0fTtcblxuXHR2YXIgaGV4RXNjYXBlID0gZnVuY3Rpb24oY29kZVBvaW50KSB7XG5cdFx0cmV0dXJuICcmI3gnICsgY29kZVBvaW50LnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpICsgJzsnO1xuXHR9O1xuXG5cdHZhciBkZWNFc2NhcGUgPSBmdW5jdGlvbihjb2RlUG9pbnQpIHtcblx0XHRyZXR1cm4gJyYjJyArIGNvZGVQb2ludCArICc7Jztcblx0fTtcblxuXHR2YXIgcGFyc2VFcnJvciA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHtcblx0XHR0aHJvdyBFcnJvcignUGFyc2UgZXJyb3I6ICcgKyBtZXNzYWdlKTtcblx0fTtcblxuXHQvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuXHR2YXIgZW5jb2RlID0gZnVuY3Rpb24oc3RyaW5nLCBvcHRpb25zKSB7XG5cdFx0b3B0aW9ucyA9IG1lcmdlKG9wdGlvbnMsIGVuY29kZS5vcHRpb25zKTtcblx0XHR2YXIgc3RyaWN0ID0gb3B0aW9ucy5zdHJpY3Q7XG5cdFx0aWYgKHN0cmljdCAmJiByZWdleEludmFsaWRSYXdDb2RlUG9pbnQudGVzdChzdHJpbmcpKSB7XG5cdFx0XHRwYXJzZUVycm9yKCdmb3JiaWRkZW4gY29kZSBwb2ludCcpO1xuXHRcdH1cblx0XHR2YXIgZW5jb2RlRXZlcnl0aGluZyA9IG9wdGlvbnMuZW5jb2RlRXZlcnl0aGluZztcblx0XHR2YXIgdXNlTmFtZWRSZWZlcmVuY2VzID0gb3B0aW9ucy51c2VOYW1lZFJlZmVyZW5jZXM7XG5cdFx0dmFyIGFsbG93VW5zYWZlU3ltYm9scyA9IG9wdGlvbnMuYWxsb3dVbnNhZmVTeW1ib2xzO1xuXHRcdHZhciBlc2NhcGVDb2RlUG9pbnQgPSBvcHRpb25zLmRlY2ltYWwgPyBkZWNFc2NhcGUgOiBoZXhFc2NhcGU7XG5cblx0XHR2YXIgZXNjYXBlQm1wU3ltYm9sID0gZnVuY3Rpb24oc3ltYm9sKSB7XG5cdFx0XHRyZXR1cm4gZXNjYXBlQ29kZVBvaW50KHN5bWJvbC5jaGFyQ29kZUF0KDApKTtcblx0XHR9O1xuXG5cdFx0aWYgKGVuY29kZUV2ZXJ5dGhpbmcpIHtcblx0XHRcdC8vIEVuY29kZSBBU0NJSSBzeW1ib2xzLlxuXHRcdFx0c3RyaW5nID0gc3RyaW5nLnJlcGxhY2UocmVnZXhBc2NpaVdoaXRlbGlzdCwgZnVuY3Rpb24oc3ltYm9sKSB7XG5cdFx0XHRcdC8vIFVzZSBuYW1lZCByZWZlcmVuY2VzIGlmIHJlcXVlc3RlZCAmIHBvc3NpYmxlLlxuXHRcdFx0XHRpZiAodXNlTmFtZWRSZWZlcmVuY2VzICYmIGhhcyhlbmNvZGVNYXAsIHN5bWJvbCkpIHtcblx0XHRcdFx0XHRyZXR1cm4gJyYnICsgZW5jb2RlTWFwW3N5bWJvbF0gKyAnOyc7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGVzY2FwZUJtcFN5bWJvbChzeW1ib2wpO1xuXHRcdFx0fSk7XG5cdFx0XHQvLyBTaG9ydGVuIGEgZmV3IGVzY2FwZXMgdGhhdCByZXByZXNlbnQgdHdvIHN5bWJvbHMsIG9mIHdoaWNoIGF0IGxlYXN0IG9uZVxuXHRcdFx0Ly8gaXMgd2l0aGluIHRoZSBBU0NJSSByYW5nZS5cblx0XHRcdGlmICh1c2VOYW1lZFJlZmVyZW5jZXMpIHtcblx0XHRcdFx0c3RyaW5nID0gc3RyaW5nXG5cdFx0XHRcdFx0LnJlcGxhY2UoLyZndDtcXHUyMEQyL2csICcmbnZndDsnKVxuXHRcdFx0XHRcdC5yZXBsYWNlKC8mbHQ7XFx1MjBEMi9nLCAnJm52bHQ7Jylcblx0XHRcdFx0XHQucmVwbGFjZSgvJiN4NjY7JiN4NkE7L2csICcmZmpsaWc7Jyk7XG5cdFx0XHR9XG5cdFx0XHQvLyBFbmNvZGUgbm9uLUFTQ0lJIHN5bWJvbHMuXG5cdFx0XHRpZiAodXNlTmFtZWRSZWZlcmVuY2VzKSB7XG5cdFx0XHRcdC8vIEVuY29kZSBub24tQVNDSUkgc3ltYm9scyB0aGF0IGNhbiBiZSByZXBsYWNlZCB3aXRoIGEgbmFtZWQgcmVmZXJlbmNlLlxuXHRcdFx0XHRzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShyZWdleEVuY29kZU5vbkFzY2lpLCBmdW5jdGlvbihzdHJpbmcpIHtcblx0XHRcdFx0XHQvLyBOb3RlOiB0aGVyZSBpcyBubyBuZWVkIHRvIGNoZWNrIGBoYXMoZW5jb2RlTWFwLCBzdHJpbmcpYCBoZXJlLlxuXHRcdFx0XHRcdHJldHVybiAnJicgKyBlbmNvZGVNYXBbc3RyaW5nXSArICc7Jztcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHQvLyBOb3RlOiBhbnkgcmVtYWluaW5nIG5vbi1BU0NJSSBzeW1ib2xzIGFyZSBoYW5kbGVkIG91dHNpZGUgb2YgdGhlIGBpZmAuXG5cdFx0fSBlbHNlIGlmICh1c2VOYW1lZFJlZmVyZW5jZXMpIHtcblx0XHRcdC8vIEFwcGx5IG5hbWVkIGNoYXJhY3RlciByZWZlcmVuY2VzLlxuXHRcdFx0Ly8gRW5jb2RlIGA8PlwiJyZgIHVzaW5nIG5hbWVkIGNoYXJhY3RlciByZWZlcmVuY2VzLlxuXHRcdFx0aWYgKCFhbGxvd1Vuc2FmZVN5bWJvbHMpIHtcblx0XHRcdFx0c3RyaW5nID0gc3RyaW5nLnJlcGxhY2UocmVnZXhFc2NhcGUsIGZ1bmN0aW9uKHN0cmluZykge1xuXHRcdFx0XHRcdHJldHVybiAnJicgKyBlbmNvZGVNYXBbc3RyaW5nXSArICc7JzsgLy8gbm8gbmVlZCB0byBjaGVjayBgaGFzKClgIGhlcmVcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHQvLyBTaG9ydGVuIGVzY2FwZXMgdGhhdCByZXByZXNlbnQgdHdvIHN5bWJvbHMsIG9mIHdoaWNoIGF0IGxlYXN0IG9uZSBpc1xuXHRcdFx0Ly8gYDw+XCInJmAuXG5cdFx0XHRzdHJpbmcgPSBzdHJpbmdcblx0XHRcdFx0LnJlcGxhY2UoLyZndDtcXHUyMEQyL2csICcmbnZndDsnKVxuXHRcdFx0XHQucmVwbGFjZSgvJmx0O1xcdTIwRDIvZywgJyZudmx0OycpO1xuXHRcdFx0Ly8gRW5jb2RlIG5vbi1BU0NJSSBzeW1ib2xzIHRoYXQgY2FuIGJlIHJlcGxhY2VkIHdpdGggYSBuYW1lZCByZWZlcmVuY2UuXG5cdFx0XHRzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShyZWdleEVuY29kZU5vbkFzY2lpLCBmdW5jdGlvbihzdHJpbmcpIHtcblx0XHRcdFx0Ly8gTm90ZTogdGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayBgaGFzKGVuY29kZU1hcCwgc3RyaW5nKWAgaGVyZS5cblx0XHRcdFx0cmV0dXJuICcmJyArIGVuY29kZU1hcFtzdHJpbmddICsgJzsnO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIGlmICghYWxsb3dVbnNhZmVTeW1ib2xzKSB7XG5cdFx0XHQvLyBFbmNvZGUgYDw+XCInJmAgdXNpbmcgaGV4YWRlY2ltYWwgZXNjYXBlcywgbm93IHRoYXQgdGhleeKAmXJlIG5vdCBoYW5kbGVkXG5cdFx0XHQvLyB1c2luZyBuYW1lZCBjaGFyYWN0ZXIgcmVmZXJlbmNlcy5cblx0XHRcdHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKHJlZ2V4RXNjYXBlLCBlc2NhcGVCbXBTeW1ib2wpO1xuXHRcdH1cblx0XHRyZXR1cm4gc3RyaW5nXG5cdFx0XHQvLyBFbmNvZGUgYXN0cmFsIHN5bWJvbHMuXG5cdFx0XHQucmVwbGFjZShyZWdleEFzdHJhbFN5bWJvbHMsIGZ1bmN0aW9uKCQwKSB7XG5cdFx0XHRcdC8vIGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nI3N1cnJvZ2F0ZS1mb3JtdWxhZVxuXHRcdFx0XHR2YXIgaGlnaCA9ICQwLmNoYXJDb2RlQXQoMCk7XG5cdFx0XHRcdHZhciBsb3cgPSAkMC5jaGFyQ29kZUF0KDEpO1xuXHRcdFx0XHR2YXIgY29kZVBvaW50ID0gKGhpZ2ggLSAweEQ4MDApICogMHg0MDAgKyBsb3cgLSAweERDMDAgKyAweDEwMDAwO1xuXHRcdFx0XHRyZXR1cm4gZXNjYXBlQ29kZVBvaW50KGNvZGVQb2ludCk7XG5cdFx0XHR9KVxuXHRcdFx0Ly8gRW5jb2RlIGFueSByZW1haW5pbmcgQk1QIHN5bWJvbHMgdGhhdCBhcmUgbm90IHByaW50YWJsZSBBU0NJSSBzeW1ib2xzXG5cdFx0XHQvLyB1c2luZyBhIGhleGFkZWNpbWFsIGVzY2FwZS5cblx0XHRcdC5yZXBsYWNlKHJlZ2V4Qm1wV2hpdGVsaXN0LCBlc2NhcGVCbXBTeW1ib2wpO1xuXHR9O1xuXHQvLyBFeHBvc2UgZGVmYXVsdCBvcHRpb25zIChzbyB0aGV5IGNhbiBiZSBvdmVycmlkZGVuIGdsb2JhbGx5KS5cblx0ZW5jb2RlLm9wdGlvbnMgPSB7XG5cdFx0J2FsbG93VW5zYWZlU3ltYm9scyc6IGZhbHNlLFxuXHRcdCdlbmNvZGVFdmVyeXRoaW5nJzogZmFsc2UsXG5cdFx0J3N0cmljdCc6IGZhbHNlLFxuXHRcdCd1c2VOYW1lZFJlZmVyZW5jZXMnOiBmYWxzZSxcblx0XHQnZGVjaW1hbCcgOiBmYWxzZVxuXHR9O1xuXG5cdHZhciBkZWNvZGUgPSBmdW5jdGlvbihodG1sLCBvcHRpb25zKSB7XG5cdFx0b3B0aW9ucyA9IG1lcmdlKG9wdGlvbnMsIGRlY29kZS5vcHRpb25zKTtcblx0XHR2YXIgc3RyaWN0ID0gb3B0aW9ucy5zdHJpY3Q7XG5cdFx0aWYgKHN0cmljdCAmJiByZWdleEludmFsaWRFbnRpdHkudGVzdChodG1sKSkge1xuXHRcdFx0cGFyc2VFcnJvcignbWFsZm9ybWVkIGNoYXJhY3RlciByZWZlcmVuY2UnKTtcblx0XHR9XG5cdFx0cmV0dXJuIGh0bWwucmVwbGFjZShyZWdleERlY29kZSwgZnVuY3Rpb24oJDAsICQxLCAkMiwgJDMsICQ0LCAkNSwgJDYsICQ3LCAkOCkge1xuXHRcdFx0dmFyIGNvZGVQb2ludDtcblx0XHRcdHZhciBzZW1pY29sb247XG5cdFx0XHR2YXIgZGVjRGlnaXRzO1xuXHRcdFx0dmFyIGhleERpZ2l0cztcblx0XHRcdHZhciByZWZlcmVuY2U7XG5cdFx0XHR2YXIgbmV4dDtcblxuXHRcdFx0aWYgKCQxKSB7XG5cdFx0XHRcdHJlZmVyZW5jZSA9ICQxO1xuXHRcdFx0XHQvLyBOb3RlOiB0aGVyZSBpcyBubyBuZWVkIHRvIGNoZWNrIGBoYXMoZGVjb2RlTWFwLCByZWZlcmVuY2UpYC5cblx0XHRcdFx0cmV0dXJuIGRlY29kZU1hcFtyZWZlcmVuY2VdO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoJDIpIHtcblx0XHRcdFx0Ly8gRGVjb2RlIG5hbWVkIGNoYXJhY3RlciByZWZlcmVuY2VzIHdpdGhvdXQgdHJhaWxpbmcgYDtgLCBlLmcuIGAmYW1wYC5cblx0XHRcdFx0Ly8gVGhpcyBpcyBvbmx5IGEgcGFyc2UgZXJyb3IgaWYgaXQgZ2V0cyBjb252ZXJ0ZWQgdG8gYCZgLCBvciBpZiBpdCBpc1xuXHRcdFx0XHQvLyBmb2xsb3dlZCBieSBgPWAgaW4gYW4gYXR0cmlidXRlIGNvbnRleHQuXG5cdFx0XHRcdHJlZmVyZW5jZSA9ICQyO1xuXHRcdFx0XHRuZXh0ID0gJDM7XG5cdFx0XHRcdGlmIChuZXh0ICYmIG9wdGlvbnMuaXNBdHRyaWJ1dGVWYWx1ZSkge1xuXHRcdFx0XHRcdGlmIChzdHJpY3QgJiYgbmV4dCA9PSAnPScpIHtcblx0XHRcdFx0XHRcdHBhcnNlRXJyb3IoJ2AmYCBkaWQgbm90IHN0YXJ0IGEgY2hhcmFjdGVyIHJlZmVyZW5jZScpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gJDA7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aWYgKHN0cmljdCkge1xuXHRcdFx0XHRcdFx0cGFyc2VFcnJvcihcblx0XHRcdFx0XHRcdFx0J25hbWVkIGNoYXJhY3RlciByZWZlcmVuY2Ugd2FzIG5vdCB0ZXJtaW5hdGVkIGJ5IGEgc2VtaWNvbG9uJ1xuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gTm90ZTogdGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayBgaGFzKGRlY29kZU1hcExlZ2FjeSwgcmVmZXJlbmNlKWAuXG5cdFx0XHRcdFx0cmV0dXJuIGRlY29kZU1hcExlZ2FjeVtyZWZlcmVuY2VdICsgKG5leHQgfHwgJycpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICgkNCkge1xuXHRcdFx0XHQvLyBEZWNvZGUgZGVjaW1hbCBlc2NhcGVzLCBlLmcuIGAmIzExOTU1ODtgLlxuXHRcdFx0XHRkZWNEaWdpdHMgPSAkNDtcblx0XHRcdFx0c2VtaWNvbG9uID0gJDU7XG5cdFx0XHRcdGlmIChzdHJpY3QgJiYgIXNlbWljb2xvbikge1xuXHRcdFx0XHRcdHBhcnNlRXJyb3IoJ2NoYXJhY3RlciByZWZlcmVuY2Ugd2FzIG5vdCB0ZXJtaW5hdGVkIGJ5IGEgc2VtaWNvbG9uJyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29kZVBvaW50ID0gcGFyc2VJbnQoZGVjRGlnaXRzLCAxMCk7XG5cdFx0XHRcdHJldHVybiBjb2RlUG9pbnRUb1N5bWJvbChjb2RlUG9pbnQsIHN0cmljdCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICgkNikge1xuXHRcdFx0XHQvLyBEZWNvZGUgaGV4YWRlY2ltYWwgZXNjYXBlcywgZS5nLiBgJiN4MUQzMDY7YC5cblx0XHRcdFx0aGV4RGlnaXRzID0gJDY7XG5cdFx0XHRcdHNlbWljb2xvbiA9ICQ3O1xuXHRcdFx0XHRpZiAoc3RyaWN0ICYmICFzZW1pY29sb24pIHtcblx0XHRcdFx0XHRwYXJzZUVycm9yKCdjaGFyYWN0ZXIgcmVmZXJlbmNlIHdhcyBub3QgdGVybWluYXRlZCBieSBhIHNlbWljb2xvbicpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvZGVQb2ludCA9IHBhcnNlSW50KGhleERpZ2l0cywgMTYpO1xuXHRcdFx0XHRyZXR1cm4gY29kZVBvaW50VG9TeW1ib2woY29kZVBvaW50LCBzdHJpY3QpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiB3ZeKAmXJlIHN0aWxsIGhlcmUsIGBpZiAoJDcpYCBpcyBpbXBsaWVkOyBpdOKAmXMgYW4gYW1iaWd1b3VzXG5cdFx0XHQvLyBhbXBlcnNhbmQgZm9yIHN1cmUuIGh0dHBzOi8vbXRocy5iZS9ub3Rlcy9hbWJpZ3VvdXMtYW1wZXJzYW5kc1xuXHRcdFx0aWYgKHN0cmljdCkge1xuXHRcdFx0XHRwYXJzZUVycm9yKFxuXHRcdFx0XHRcdCduYW1lZCBjaGFyYWN0ZXIgcmVmZXJlbmNlIHdhcyBub3QgdGVybWluYXRlZCBieSBhIHNlbWljb2xvbidcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdHJldHVybiAkMDtcblx0XHR9KTtcblx0fTtcblx0Ly8gRXhwb3NlIGRlZmF1bHQgb3B0aW9ucyAoc28gdGhleSBjYW4gYmUgb3ZlcnJpZGRlbiBnbG9iYWxseSkuXG5cdGRlY29kZS5vcHRpb25zID0ge1xuXHRcdCdpc0F0dHJpYnV0ZVZhbHVlJzogZmFsc2UsXG5cdFx0J3N0cmljdCc6IGZhbHNlXG5cdH07XG5cblx0dmFyIGVzY2FwZSA9IGZ1bmN0aW9uKHN0cmluZykge1xuXHRcdHJldHVybiBzdHJpbmcucmVwbGFjZShyZWdleEVzY2FwZSwgZnVuY3Rpb24oJDApIHtcblx0XHRcdC8vIE5vdGU6IHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sgYGhhcyhlc2NhcGVNYXAsICQwKWAgaGVyZS5cblx0XHRcdHJldHVybiBlc2NhcGVNYXBbJDBdO1xuXHRcdH0pO1xuXHR9O1xuXG5cdC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5cdHZhciBoZSA9IHtcblx0XHQndmVyc2lvbic6ICcxLjIuMCcsXG5cdFx0J2VuY29kZSc6IGVuY29kZSxcblx0XHQnZGVjb2RlJzogZGVjb2RlLFxuXHRcdCdlc2NhcGUnOiBlc2NhcGUsXG5cdFx0J3VuZXNjYXBlJzogZGVjb2RlXG5cdH07XG5cblx0Ly8gU29tZSBBTUQgYnVpbGQgb3B0aW1pemVycywgbGlrZSByLmpzLCBjaGVjayBmb3Igc3BlY2lmaWMgY29uZGl0aW9uIHBhdHRlcm5zXG5cdC8vIGxpa2UgdGhlIGZvbGxvd2luZzpcblx0aWYgKFxuXHRcdHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdHR5cGVvZiBkZWZpbmUuYW1kID09ICdvYmplY3QnICYmXG5cdFx0ZGVmaW5lLmFtZFxuXHQpIHtcblx0XHRkZWZpbmUoZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gaGU7XG5cdFx0fSk7XG5cdH1cdGVsc2UgaWYgKGZyZWVFeHBvcnRzICYmICFmcmVlRXhwb3J0cy5ub2RlVHlwZSkge1xuXHRcdGlmIChmcmVlTW9kdWxlKSB7IC8vIGluIE5vZGUuanMsIGlvLmpzLCBvciBSaW5nb0pTIHYwLjguMCtcblx0XHRcdGZyZWVNb2R1bGUuZXhwb3J0cyA9IGhlO1xuXHRcdH0gZWxzZSB7IC8vIGluIE5hcndoYWwgb3IgUmluZ29KUyB2MC43LjAtXG5cdFx0XHRmb3IgKHZhciBrZXkgaW4gaGUpIHtcblx0XHRcdFx0aGFzKGhlLCBrZXkpICYmIChmcmVlRXhwb3J0c1trZXldID0gaGVba2V5XSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2UgeyAvLyBpbiBSaGlubyBvciBhIHdlYiBicm93c2VyXG5cdFx0cm9vdC5oZSA9IGhlO1xuXHR9XG5cbn0odGhpcykpO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBWYXJpb3VzIHV0aWxpdHkgZnVuY3Rpb25zIHVzZWQgdGhyb3VnaG91dCBNb2NoYSdzIGNvZGViYXNlLlxuICogQG1vZHVsZSB1dGlsc1xuICovXG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xudmFyIHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBoZSA9IHJlcXVpcmUoJ2hlJyk7XG5cbmNvbnN0IE1PQ0hBX0lEX1BST1BfTkFNRSA9ICdfX21vY2hhX2lkX18nO1xuXG4vKipcbiAqIEluaGVyaXQgdGhlIHByb3RvdHlwZSBtZXRob2RzIGZyb20gb25lIGNvbnN0cnVjdG9yIGludG8gYW5vdGhlci5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjdG9yIC0gQ29uc3RydWN0b3IgZnVuY3Rpb24gd2hpY2ggbmVlZHMgdG8gaW5oZXJpdCB0aGVcbiAqICAgICBwcm90b3R5cGUuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBzdXBlckN0b3IgLSBDb25zdHJ1Y3RvciBmdW5jdGlvbiB0byBpbmhlcml0IHByb3RvdHlwZSBmcm9tLlxuICogQHRocm93cyB7VHlwZUVycm9yfSBpZiBlaXRoZXIgY29uc3RydWN0b3IgaXMgbnVsbCwgb3IgaWYgc3VwZXIgY29uc3RydWN0b3JcbiAqICAgICBsYWNrcyBhIHByb3RvdHlwZS5cbiAqL1xuZXhwb3J0cy5pbmhlcml0cyA9IHV0aWwuaW5oZXJpdHM7XG5cbi8qKlxuICogRXNjYXBlIHNwZWNpYWwgY2hhcmFjdGVycyBpbiB0aGUgZ2l2ZW4gc3RyaW5nIG9mIGh0bWwuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAge3N0cmluZ30gaHRtbFxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5leHBvcnRzLmVzY2FwZSA9IGZ1bmN0aW9uIChodG1sKSB7XG4gIHJldHVybiBoZS5lbmNvZGUoU3RyaW5nKGh0bWwpLCB7dXNlTmFtZWRSZWZlcmVuY2VzOiBmYWxzZX0pO1xufTtcblxuLyoqXG4gKiBUZXN0IGlmIHRoZSBnaXZlbiBvYmogaXMgdHlwZSBvZiBzdHJpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmV4cG9ydHMuaXNTdHJpbmcgPSBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqID09PSAnc3RyaW5nJztcbn07XG5cbi8qKlxuICogQ29tcHV0ZSBhIHNsdWcgZnJvbSB0aGUgZ2l2ZW4gYHN0cmAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZXhwb3J0cy5zbHVnID0gZnVuY3Rpb24gKHN0cikge1xuICByZXR1cm4gc3RyXG4gICAgLnRvTG93ZXJDYXNlKClcbiAgICAucmVwbGFjZSgvXFxzKy9nLCAnLScpXG4gICAgLnJlcGxhY2UoL1teLVxcd10vZywgJycpXG4gICAgLnJlcGxhY2UoLy17Mix9L2csICctJyk7XG59O1xuXG4vKipcbiAqIFN0cmlwIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uIGZyb20gYHN0cmAsIGFuZCByZS1pbmRlbnQgZm9yIHByZSB3aGl0ZXNwYWNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZXhwb3J0cy5jbGVhbiA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgc3RyID0gc3RyXG4gICAgLnJlcGxhY2UoL1xcclxcbj98W1xcblxcdTIwMjhcXHUyMDI5XS9nLCAnXFxuJylcbiAgICAucmVwbGFjZSgvXlxcdUZFRkYvLCAnJylcbiAgICAvLyAodHJhZGl0aW9uYWwpLT4gIHNwYWNlL25hbWUgICAgIHBhcmFtZXRlcnMgICAgYm9keSAgICAgKGxhbWJkYSktPiBwYXJhbWV0ZXJzICAgICAgIGJvZHkgICBtdWx0aS1zdGF0ZW1lbnQvc2luZ2xlICAgICAgICAgIGtlZXAgYm9keSBjb250ZW50XG4gICAgLnJlcGxhY2UoXG4gICAgICAvXmZ1bmN0aW9uKD86XFxzKnxcXHNbXihdKilcXChbXildKlxcKVxccypcXHsoKD86LnxcXG4pKj8pXFx9JHxeXFwoW14pXSpcXClcXHMqPT5cXHMqKD86XFx7KCg/Oi58XFxuKSo/KVxcfXwoKD86LnxcXG4pKikpJC8sXG4gICAgICAnJDEkMiQzJ1xuICAgICk7XG5cbiAgdmFyIHNwYWNlcyA9IHN0ci5tYXRjaCgvXlxcbj8oICopLylbMV0ubGVuZ3RoO1xuICB2YXIgdGFicyA9IHN0ci5tYXRjaCgvXlxcbj8oXFx0KikvKVsxXS5sZW5ndGg7XG4gIHZhciByZSA9IG5ldyBSZWdFeHAoXG4gICAgJ15cXG4/JyArICh0YWJzID8gJ1xcdCcgOiAnICcpICsgJ3snICsgKHRhYnMgfHwgc3BhY2VzKSArICd9JyxcbiAgICAnZ20nXG4gICk7XG5cbiAgc3RyID0gc3RyLnJlcGxhY2UocmUsICcnKTtcblxuICByZXR1cm4gc3RyLnRyaW0oKTtcbn07XG5cbi8qKlxuICogSWYgYSB2YWx1ZSBjb3VsZCBoYXZlIHByb3BlcnRpZXMsIGFuZCBoYXMgbm9uZSwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsXG4gKiB3aGljaCByZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlbXB0eSB2YWx1ZS5cbiAqXG4gKiBGdW5jdGlvbnMgdy8gbm8gcHJvcGVydGllcyByZXR1cm4gYCdbRnVuY3Rpb25dJ2BcbiAqIEFycmF5cyB3LyBsZW5ndGggPT09IDAgcmV0dXJuIGAnW10nYFxuICogT2JqZWN0cyB3LyBubyBwcm9wZXJ0aWVzIHJldHVybiBgJ3t9J2BcbiAqIEFsbCBlbHNlOiByZXR1cm4gcmVzdWx0IG9mIGB2YWx1ZS50b1N0cmluZygpYFxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVIaW50IFRoZSB0eXBlIG9mIHRoZSB2YWx1ZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZW1wdHlSZXByZXNlbnRhdGlvbih2YWx1ZSwgdHlwZUhpbnQpIHtcbiAgc3dpdGNoICh0eXBlSGludCkge1xuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgIHJldHVybiAnW0Z1bmN0aW9uXSc7XG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgIHJldHVybiAne30nO1xuICAgIGNhc2UgJ2FycmF5JzpcbiAgICAgIHJldHVybiAnW10nO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcbiAgfVxufVxuXG4vKipcbiAqIFRha2VzIHNvbWUgdmFyaWFibGUgYW5kIGFza3MgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcoKWAgd2hhdCBpdCB0aGlua3MgaXRcbiAqIGlzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC90b1N0cmluZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gdGVzdC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IENvbXB1dGVkIHR5cGVcbiAqIEBleGFtcGxlXG4gKiBjYW5vbmljYWxUeXBlKHt9KSAvLyAnb2JqZWN0J1xuICogY2Fub25pY2FsVHlwZShbXSkgLy8gJ2FycmF5J1xuICogY2Fub25pY2FsVHlwZSgxKSAvLyAnbnVtYmVyJ1xuICogY2Fub25pY2FsVHlwZShmYWxzZSkgLy8gJ2Jvb2xlYW4nXG4gKiBjYW5vbmljYWxUeXBlKEluZmluaXR5KSAvLyAnbnVtYmVyJ1xuICogY2Fub25pY2FsVHlwZShudWxsKSAvLyAnbnVsbCdcbiAqIGNhbm9uaWNhbFR5cGUobmV3IERhdGUoKSkgLy8gJ2RhdGUnXG4gKiBjYW5vbmljYWxUeXBlKC9mb28vKSAvLyAncmVnZXhwJ1xuICogY2Fub25pY2FsVHlwZSgndHlwZScpIC8vICdzdHJpbmcnXG4gKiBjYW5vbmljYWxUeXBlKGdsb2JhbCkgLy8gJ2dsb2JhbCdcbiAqIGNhbm9uaWNhbFR5cGUobmV3IFN0cmluZygnZm9vJykgLy8gJ29iamVjdCdcbiAqIGNhbm9uaWNhbFR5cGUoYXN5bmMgZnVuY3Rpb24oKSB7fSkgLy8gJ2FzeW5jZnVuY3Rpb24nXG4gKiBjYW5vbmljYWxUeXBlKE9iamVjdC5jcmVhdGUobnVsbCkpIC8vICdudWxsLXByb3RvdHlwZSdcbiAqL1xudmFyIGNhbm9uaWNhbFR5cGUgPSAoZXhwb3J0cy5jYW5vbmljYWxUeXBlID0gZnVuY3Rpb24gY2Fub25pY2FsVHlwZSh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAndW5kZWZpbmVkJztcbiAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiAnbnVsbCc7XG4gIH0gZWxzZSBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbHVlKSkge1xuICAgIHJldHVybiAnYnVmZmVyJztcbiAgfSBlbHNlIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpID09PSBudWxsKSB7XG4gICAgcmV0dXJuICdudWxsLXByb3RvdHlwZSc7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ1xuICAgIC5jYWxsKHZhbHVlKVxuICAgIC5yZXBsYWNlKC9eXFxbLitcXHMoLis/KV0kLywgJyQxJylcbiAgICAudG9Mb3dlckNhc2UoKTtcbn0pO1xuXG4vKipcbiAqXG4gKiBSZXR1cm5zIGEgZ2VuZXJhbCB0eXBlIG9yIGRhdGEgc3RydWN0dXJlIG9mIGEgdmFyaWFibGVcbiAqIEBwcml2YXRlXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvRGF0YV9zdHJ1Y3R1cmVzXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB0ZXN0LlxuICogQHJldHVybnMge3N0cmluZ30gT25lIG9mIHVuZGVmaW5lZCwgYm9vbGVhbiwgbnVtYmVyLCBzdHJpbmcsIGJpZ2ludCwgc3ltYm9sLCBvYmplY3RcbiAqIEBleGFtcGxlXG4gKiB0eXBlKHt9KSAvLyAnb2JqZWN0J1xuICogdHlwZShbXSkgLy8gJ2FycmF5J1xuICogdHlwZSgxKSAvLyAnbnVtYmVyJ1xuICogdHlwZShmYWxzZSkgLy8gJ2Jvb2xlYW4nXG4gKiB0eXBlKEluZmluaXR5KSAvLyAnbnVtYmVyJ1xuICogdHlwZShudWxsKSAvLyAnbnVsbCdcbiAqIHR5cGUobmV3IERhdGUoKSkgLy8gJ29iamVjdCdcbiAqIHR5cGUoL2Zvby8pIC8vICdvYmplY3QnXG4gKiB0eXBlKCd0eXBlJykgLy8gJ3N0cmluZydcbiAqIHR5cGUoZ2xvYmFsKSAvLyAnb2JqZWN0J1xuICogdHlwZShuZXcgU3RyaW5nKCdmb28nKSAvLyAnc3RyaW5nJ1xuICovXG5leHBvcnRzLnR5cGUgPSBmdW5jdGlvbiB0eXBlKHZhbHVlKSB7XG4gIC8vIE51bGwgaXMgc3BlY2lhbFxuICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiAnbnVsbCc7XG4gIGNvbnN0IHByaW1pdGl2ZXMgPSBuZXcgU2V0KFtcbiAgICAndW5kZWZpbmVkJyxcbiAgICAnYm9vbGVhbicsXG4gICAgJ251bWJlcicsXG4gICAgJ3N0cmluZycsXG4gICAgJ2JpZ2ludCcsXG4gICAgJ3N5bWJvbCdcbiAgXSk7XG4gIGNvbnN0IF90eXBlID0gdHlwZW9mIHZhbHVlO1xuICBpZiAoX3R5cGUgPT09ICdmdW5jdGlvbicpIHJldHVybiBfdHlwZTtcbiAgaWYgKHByaW1pdGl2ZXMuaGFzKF90eXBlKSkgcmV0dXJuIF90eXBlO1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHJldHVybiAnc3RyaW5nJztcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiAnZXJyb3InO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiAnYXJyYXknO1xuXG4gIHJldHVybiBfdHlwZTtcbn07XG5cbi8qKlxuICogU3RyaW5naWZ5IGB2YWx1ZWAuIERpZmZlcmVudCBiZWhhdmlvciBkZXBlbmRpbmcgb24gdHlwZSBvZiB2YWx1ZTpcbiAqXG4gKiAtIElmIGB2YWx1ZWAgaXMgdW5kZWZpbmVkIG9yIG51bGwsIHJldHVybiBgJ1t1bmRlZmluZWRdJ2Agb3IgYCdbbnVsbF0nYCwgcmVzcGVjdGl2ZWx5LlxuICogLSBJZiBgdmFsdWVgIGlzIG5vdCBhbiBvYmplY3QsIGZ1bmN0aW9uIG9yIGFycmF5LCByZXR1cm4gcmVzdWx0IG9mIGB2YWx1ZS50b1N0cmluZygpYCB3cmFwcGVkIGluIGRvdWJsZS1xdW90ZXMuXG4gKiAtIElmIGB2YWx1ZWAgaXMgYW4gKmVtcHR5KiBvYmplY3QsIGZ1bmN0aW9uLCBvciBhcnJheSwgcmV0dXJuIHJlc3VsdCBvZiBmdW5jdGlvblxuICogICB7QGxpbmsgZW1wdHlSZXByZXNlbnRhdGlvbn0uXG4gKiAtIElmIGB2YWx1ZWAgaGFzIHByb3BlcnRpZXMsIGNhbGwge0BsaW5rIGV4cG9ydHMuY2Fub25pY2FsaXplfSBvbiBpdCwgdGhlbiByZXR1cm4gcmVzdWx0IG9mXG4gKiAgIEpTT04uc3RyaW5naWZ5KCkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBzZWUgZXhwb3J0cy50eXBlXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmV4cG9ydHMuc3RyaW5naWZ5ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHZhciB0eXBlSGludCA9IGNhbm9uaWNhbFR5cGUodmFsdWUpO1xuXG4gIGlmICghflsnb2JqZWN0JywgJ2FycmF5JywgJ2Z1bmN0aW9uJywgJ251bGwtcHJvdG90eXBlJ10uaW5kZXhPZih0eXBlSGludCkpIHtcbiAgICBpZiAodHlwZUhpbnQgPT09ICdidWZmZXInKSB7XG4gICAgICB2YXIganNvbiA9IEJ1ZmZlci5wcm90b3R5cGUudG9KU09OLmNhbGwodmFsdWUpO1xuICAgICAgLy8gQmFzZWQgb24gdGhlIHRvSlNPTiByZXN1bHRcbiAgICAgIHJldHVybiBqc29uU3RyaW5naWZ5KFxuICAgICAgICBqc29uLmRhdGEgJiYganNvbi50eXBlID8ganNvbi5kYXRhIDoganNvbixcbiAgICAgICAgMlxuICAgICAgKS5yZXBsYWNlKC8sKFxcbnwkKS9nLCAnJDEnKTtcbiAgICB9XG5cbiAgICAvLyBJRTcvSUU4IGhhcyBhIGJpemFycmUgU3RyaW5nIGNvbnN0cnVjdG9yOyBuZWVkcyB0byBiZSBjb2VyY2VkXG4gICAgLy8gaW50byBhbiBhcnJheSBhbmQgYmFjayB0byBvYmouXG4gICAgaWYgKHR5cGVIaW50ID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnNwbGl0KCcnKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgY2hhciwgaWR4KSB7XG4gICAgICAgIGFjY1tpZHhdID0gY2hhcjtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIHt9KTtcbiAgICAgIHR5cGVIaW50ID0gJ29iamVjdCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBqc29uU3RyaW5naWZ5KHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKHZhciBwcm9wIGluIHZhbHVlKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgcHJvcCkpIHtcbiAgICAgIHJldHVybiBqc29uU3RyaW5naWZ5KFxuICAgICAgICBleHBvcnRzLmNhbm9uaWNhbGl6ZSh2YWx1ZSwgbnVsbCwgdHlwZUhpbnQpLFxuICAgICAgICAyXG4gICAgICApLnJlcGxhY2UoLywoXFxufCQpL2csICckMScpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlbXB0eVJlcHJlc2VudGF0aW9uKHZhbHVlLCB0eXBlSGludCk7XG59O1xuXG4vKipcbiAqIGxpa2UgSlNPTi5zdHJpbmdpZnkgYnV0IG1vcmUgc2Vuc2UuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSAgb2JqZWN0XG4gKiBAcGFyYW0ge251bWJlcj19IHNwYWNlc1xuICogQHBhcmFtIHtudW1iZXI9fSBkZXB0aFxuICogQHJldHVybnMgeyp9XG4gKi9cbmZ1bmN0aW9uIGpzb25TdHJpbmdpZnkob2JqZWN0LCBzcGFjZXMsIGRlcHRoKSB7XG4gIGlmICh0eXBlb2Ygc3BhY2VzID09PSAndW5kZWZpbmVkJykge1xuICAgIC8vIHByaW1pdGl2ZSB0eXBlc1xuICAgIHJldHVybiBfc3RyaW5naWZ5KG9iamVjdCk7XG4gIH1cblxuICBkZXB0aCA9IGRlcHRoIHx8IDE7XG4gIHZhciBzcGFjZSA9IHNwYWNlcyAqIGRlcHRoO1xuICB2YXIgc3RyID0gQXJyYXkuaXNBcnJheShvYmplY3QpID8gJ1snIDogJ3snO1xuICB2YXIgZW5kID0gQXJyYXkuaXNBcnJheShvYmplY3QpID8gJ10nIDogJ30nO1xuICB2YXIgbGVuZ3RoID1cbiAgICB0eXBlb2Ygb2JqZWN0Lmxlbmd0aCA9PT0gJ251bWJlcidcbiAgICAgID8gb2JqZWN0Lmxlbmd0aFxuICAgICAgOiBPYmplY3Qua2V5cyhvYmplY3QpLmxlbmd0aDtcbiAgLy8gYC5yZXBlYXQoKWAgcG9seWZpbGxcbiAgZnVuY3Rpb24gcmVwZWF0KHMsIG4pIHtcbiAgICByZXR1cm4gbmV3IEFycmF5KG4pLmpvaW4ocyk7XG4gIH1cblxuICBmdW5jdGlvbiBfc3RyaW5naWZ5KHZhbCkge1xuICAgIHN3aXRjaCAoY2Fub25pY2FsVHlwZSh2YWwpKSB7XG4gICAgICBjYXNlICdudWxsJzpcbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgIHZhbCA9ICdbJyArIHZhbCArICddJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhcnJheSc6XG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICB2YWwgPSBqc29uU3RyaW5naWZ5KHZhbCwgc3BhY2VzLCBkZXB0aCArIDEpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgY2FzZSAncmVnZXhwJzpcbiAgICAgIGNhc2UgJ3N5bWJvbCc6XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICB2YWwgPVxuICAgICAgICAgIHZhbCA9PT0gMCAmJiAxIC8gdmFsID09PSAtSW5maW5pdHkgLy8gYC0wYFxuICAgICAgICAgICAgPyAnLTAnXG4gICAgICAgICAgICA6IHZhbC50b1N0cmluZygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2JpZ2ludCc6XG4gICAgICAgIHZhbCA9IHZhbC50b1N0cmluZygpICsgJ24nO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICB2YXIgc0RhdGUgPSBpc05hTih2YWwuZ2V0VGltZSgpKSA/IHZhbC50b1N0cmluZygpIDogdmFsLnRvSVNPU3RyaW5nKCk7XG4gICAgICAgIHZhbCA9ICdbRGF0ZTogJyArIHNEYXRlICsgJ10nO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2J1ZmZlcic6XG4gICAgICAgIHZhciBqc29uID0gdmFsLnRvSlNPTigpO1xuICAgICAgICAvLyBCYXNlZCBvbiB0aGUgdG9KU09OIHJlc3VsdFxuICAgICAgICBqc29uID0ganNvbi5kYXRhICYmIGpzb24udHlwZSA/IGpzb24uZGF0YSA6IGpzb247XG4gICAgICAgIHZhbCA9ICdbQnVmZmVyOiAnICsganNvblN0cmluZ2lmeShqc29uLCAyLCBkZXB0aCArIDEpICsgJ10nO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHZhbCA9XG4gICAgICAgICAgdmFsID09PSAnW0Z1bmN0aW9uXScgfHwgdmFsID09PSAnW0NpcmN1bGFyXSdcbiAgICAgICAgICAgID8gdmFsXG4gICAgICAgICAgICA6IEpTT04uc3RyaW5naWZ5KHZhbCk7IC8vIHN0cmluZ1xuICAgIH1cbiAgICByZXR1cm4gdmFsO1xuICB9XG5cbiAgZm9yICh2YXIgaSBpbiBvYmplY3QpIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGkpKSB7XG4gICAgICBjb250aW51ZTsgLy8gbm90IG15IGJ1c2luZXNzXG4gICAgfVxuICAgIC0tbGVuZ3RoO1xuICAgIHN0ciArPVxuICAgICAgJ1xcbiAnICtcbiAgICAgIHJlcGVhdCgnICcsIHNwYWNlKSArXG4gICAgICAoQXJyYXkuaXNBcnJheShvYmplY3QpID8gJycgOiAnXCInICsgaSArICdcIjogJykgKyAvLyBrZXlcbiAgICAgIF9zdHJpbmdpZnkob2JqZWN0W2ldKSArIC8vIHZhbHVlXG4gICAgICAobGVuZ3RoID8gJywnIDogJycpOyAvLyBjb21tYVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICBzdHIgK1xuICAgIC8vIFtdLCB7fVxuICAgIChzdHIubGVuZ3RoICE9PSAxID8gJ1xcbicgKyByZXBlYXQoJyAnLCAtLXNwYWNlKSArIGVuZCA6IGVuZClcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gYSBuZXcgVGhpbmcgdGhhdCBoYXMgdGhlIGtleXMgaW4gc29ydGVkIG9yZGVyLiBSZWN1cnNpdmUuXG4gKlxuICogSWYgdGhlIFRoaW5nLi4uXG4gKiAtIGhhcyBhbHJlYWR5IGJlZW4gc2VlbiwgcmV0dXJuIHN0cmluZyBgJ1tDaXJjdWxhcl0nYFxuICogLSBpcyBgdW5kZWZpbmVkYCwgcmV0dXJuIHN0cmluZyBgJ1t1bmRlZmluZWRdJ2BcbiAqIC0gaXMgYG51bGxgLCByZXR1cm4gdmFsdWUgYG51bGxgXG4gKiAtIGlzIHNvbWUgb3RoZXIgcHJpbWl0aXZlLCByZXR1cm4gdGhlIHZhbHVlXG4gKiAtIGlzIG5vdCBhIHByaW1pdGl2ZSBvciBhbiBgQXJyYXlgLCBgT2JqZWN0YCwgb3IgYEZ1bmN0aW9uYCwgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgVGhpbmcncyBgdG9TdHJpbmcoKWAgbWV0aG9kXG4gKiAtIGlzIGEgbm9uLWVtcHR5IGBBcnJheWAsIGBPYmplY3RgLCBvciBgRnVuY3Rpb25gLCByZXR1cm4gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gYWdhaW4uXG4gKiAtIGlzIGFuIGVtcHR5IGBBcnJheWAsIGBPYmplY3RgLCBvciBgRnVuY3Rpb25gLCByZXR1cm4gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIGBlbXB0eVJlcHJlc2VudGF0aW9uKClgXG4gKlxuICogQHByaXZhdGVcbiAqIEBzZWUge0BsaW5rIGV4cG9ydHMuc3RyaW5naWZ5fVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGluZyB0byBpbnNwZWN0LiAgTWF5IG9yIG1heSBub3QgaGF2ZSBwcm9wZXJ0aWVzLlxuICogQHBhcmFtIHtBcnJheX0gW3N0YWNrPVtdXSBTdGFjayBvZiBzZWVuIHZhbHVlc1xuICogQHBhcmFtIHtzdHJpbmd9IFt0eXBlSGludF0gVHlwZSBoaW50XG4gKiBAcmV0dXJuIHsoT2JqZWN0fEFycmF5fEZ1bmN0aW9ufHN0cmluZ3x1bmRlZmluZWQpfVxuICovXG5leHBvcnRzLmNhbm9uaWNhbGl6ZSA9IGZ1bmN0aW9uIGNhbm9uaWNhbGl6ZSh2YWx1ZSwgc3RhY2ssIHR5cGVIaW50KSB7XG4gIHZhciBjYW5vbmljYWxpemVkT2JqO1xuICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuICB2YXIgcHJvcDtcbiAgLyogZXNsaW50LWVuYWJsZSBuby11bnVzZWQtdmFycyAqL1xuICB0eXBlSGludCA9IHR5cGVIaW50IHx8IGNhbm9uaWNhbFR5cGUodmFsdWUpO1xuICBmdW5jdGlvbiB3aXRoU3RhY2sodmFsdWUsIGZuKSB7XG4gICAgc3RhY2sucHVzaCh2YWx1ZSk7XG4gICAgZm4oKTtcbiAgICBzdGFjay5wb3AoKTtcbiAgfVxuXG4gIHN0YWNrID0gc3RhY2sgfHwgW107XG5cbiAgaWYgKHN0YWNrLmluZGV4T2YodmFsdWUpICE9PSAtMSkge1xuICAgIHJldHVybiAnW0NpcmN1bGFyXSc7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGVIaW50KSB7XG4gICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICBjYXNlICdidWZmZXInOlxuICAgIGNhc2UgJ251bGwnOlxuICAgICAgY2Fub25pY2FsaXplZE9iaiA9IHZhbHVlO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYXJyYXknOlxuICAgICAgd2l0aFN0YWNrKHZhbHVlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNhbm9uaWNhbGl6ZWRPYmogPSB2YWx1ZS5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICByZXR1cm4gZXhwb3J0cy5jYW5vbmljYWxpemUoaXRlbSwgc3RhY2spO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzLCBuby11bnJlYWNoYWJsZS1sb29wICovXG4gICAgICBmb3IgKHByb3AgaW4gdmFsdWUpIHtcbiAgICAgICAgY2Fub25pY2FsaXplZE9iaiA9IHt9O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8qIGVzbGludC1lbmFibGUgZ3VhcmQtZm9yLWluICovXG4gICAgICBpZiAoIWNhbm9uaWNhbGl6ZWRPYmopIHtcbiAgICAgICAgY2Fub25pY2FsaXplZE9iaiA9IGVtcHR5UmVwcmVzZW50YXRpb24odmFsdWUsIHR5cGVIaW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgJ251bGwtcHJvdG90eXBlJzpcbiAgICBjYXNlICdvYmplY3QnOlxuICAgICAgY2Fub25pY2FsaXplZE9iaiA9IGNhbm9uaWNhbGl6ZWRPYmogfHwge307XG4gICAgICBpZiAodHlwZUhpbnQgPT09ICdudWxsLXByb3RvdHlwZScgJiYgU3ltYm9sLnRvU3RyaW5nVGFnIGluIHZhbHVlKSB7XG4gICAgICAgIGNhbm9uaWNhbGl6ZWRPYmpbJ1tTeW1ib2wudG9TdHJpbmdUYWddJ10gPSB2YWx1ZVtTeW1ib2wudG9TdHJpbmdUYWddO1xuICAgICAgfVxuICAgICAgd2l0aFN0YWNrKHZhbHVlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKHZhbHVlKVxuICAgICAgICAgIC5zb3J0KClcbiAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBjYW5vbmljYWxpemVkT2JqW2tleV0gPSBleHBvcnRzLmNhbm9uaWNhbGl6ZSh2YWx1ZVtrZXldLCBzdGFjayk7XG4gICAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2RhdGUnOlxuICAgIGNhc2UgJ251bWJlcic6XG4gICAgY2FzZSAncmVnZXhwJzpcbiAgICBjYXNlICdib29sZWFuJzpcbiAgICBjYXNlICdzeW1ib2wnOlxuICAgICAgY2Fub25pY2FsaXplZE9iaiA9IHZhbHVlO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGNhbm9uaWNhbGl6ZWRPYmogPSB2YWx1ZSArICcnO1xuICB9XG5cbiAgcmV0dXJuIGNhbm9uaWNhbGl6ZWRPYmo7XG59O1xuXG4vKipcbiAqIEBzdW1tYXJ5XG4gKiBUaGlzIEZpbHRlciBiYXNlZCBvbiBgbW9jaGEtY2xlYW5gIG1vZHVsZS4oc2VlOiBgZ2l0aHViLmNvbS9yc3RhY3J1ei9tb2NoYS1jbGVhbmApXG4gKiBAZGVzY3JpcHRpb25cbiAqIFdoZW4gaW52b2tpbmcgdGhpcyBmdW5jdGlvbiB5b3UgZ2V0IGEgZmlsdGVyIGZ1bmN0aW9uIHRoYXQgZ2V0IHRoZSBFcnJvci5zdGFjayBhcyBhbiBpbnB1dCxcbiAqIGFuZCByZXR1cm4gYSBwcmV0dGlmeSBvdXRwdXQuXG4gKiAoaS5lOiBzdHJpcCBNb2NoYSBhbmQgaW50ZXJuYWwgbm9kZSBmdW5jdGlvbnMgZnJvbSBzdGFjayB0cmFjZSkuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259XG4gKi9cbmV4cG9ydHMuc3RhY2tUcmFjZUZpbHRlciA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gVE9ETzogUmVwbGFjZSB3aXRoIGBwcm9jZXNzLmJyb3dzZXJgXG4gIHZhciBpcyA9IHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcgPyB7bm9kZTogdHJ1ZX0gOiB7YnJvd3NlcjogdHJ1ZX07XG4gIHZhciBzbGFzaCA9IHBhdGguc2VwO1xuICB2YXIgY3dkO1xuICBpZiAoaXMubm9kZSkge1xuICAgIGN3ZCA9IGV4cG9ydHMuY3dkKCkgKyBzbGFzaDtcbiAgfSBlbHNlIHtcbiAgICBjd2QgPSAoXG4gICAgICB0eXBlb2YgbG9jYXRpb24gPT09ICd1bmRlZmluZWQnID8gd2luZG93LmxvY2F0aW9uIDogbG9jYXRpb25cbiAgICApLmhyZWYucmVwbGFjZSgvXFwvW14vXSokLywgJy8nKTtcbiAgICBzbGFzaCA9ICcvJztcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzTW9jaGFJbnRlcm5hbChsaW5lKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIH5saW5lLmluZGV4T2YoJ25vZGVfbW9kdWxlcycgKyBzbGFzaCArICdtb2NoYScgKyBzbGFzaCkgfHxcbiAgICAgIH5saW5lLmluZGV4T2Yoc2xhc2ggKyAnbW9jaGEuanMnKSB8fFxuICAgICAgfmxpbmUuaW5kZXhPZihzbGFzaCArICdtb2NoYS5taW4uanMnKVxuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiBpc05vZGVJbnRlcm5hbChsaW5lKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIH5saW5lLmluZGV4T2YoJyh0aW1lcnMuanM6JykgfHxcbiAgICAgIH5saW5lLmluZGV4T2YoJyhldmVudHMuanM6JykgfHxcbiAgICAgIH5saW5lLmluZGV4T2YoJyhub2RlLmpzOicpIHx8XG4gICAgICB+bGluZS5pbmRleE9mKCcobW9kdWxlLmpzOicpIHx8XG4gICAgICB+bGluZS5pbmRleE9mKCdHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5uZXh0IChuYXRpdmUpJykgfHxcbiAgICAgIGZhbHNlXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoc3RhY2spIHtcbiAgICBzdGFjayA9IHN0YWNrLnNwbGl0KCdcXG4nKTtcblxuICAgIHN0YWNrID0gc3RhY2sucmVkdWNlKGZ1bmN0aW9uIChsaXN0LCBsaW5lKSB7XG4gICAgICBpZiAoaXNNb2NoYUludGVybmFsKGxpbmUpKSB7XG4gICAgICAgIHJldHVybiBsaXN0O1xuICAgICAgfVxuXG4gICAgICBpZiAoaXMubm9kZSAmJiBpc05vZGVJbnRlcm5hbChsaW5lKSkge1xuICAgICAgICByZXR1cm4gbGlzdDtcbiAgICAgIH1cblxuICAgICAgLy8gQ2xlYW4gdXAgY3dkKGFic29sdXRlKVxuICAgICAgaWYgKC86XFxkKzpcXGQrXFwpPyQvLnRlc3QobGluZSkpIHtcbiAgICAgICAgbGluZSA9IGxpbmUucmVwbGFjZSgnKCcgKyBjd2QsICcoJyk7XG4gICAgICB9XG5cbiAgICAgIGxpc3QucHVzaChsaW5lKTtcbiAgICAgIHJldHVybiBsaXN0O1xuICAgIH0sIFtdKTtcblxuICAgIHJldHVybiBzdGFjay5qb2luKCdcXG4nKTtcbiAgfTtcbn07XG5cbi8qKlxuICogQ3J1ZGUsIGJ1dCBlZmZlY3RpdmUuXG4gKiBAcHVibGljXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBvciBub3QgYHZhbHVlYCBpcyBhIFByb21pc2VcbiAqL1xuZXhwb3J0cy5pc1Byb21pc2UgPSBmdW5jdGlvbiBpc1Byb21pc2UodmFsdWUpIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJ1xuICApO1xufTtcblxuLyoqXG4gKiBDbGFtcHMgYSBudW1lcmljIHZhbHVlIHRvIGFuIGluY2x1c2l2ZSByYW5nZS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBWYWx1ZSB0byBiZSBjbGFtcGVkLlxuICogQHBhcmFtIHtudW1iZXJbXX0gcmFuZ2UgLSBUd28gZWxlbWVudCBhcnJheSBzcGVjaWZ5aW5nIFttaW4sIG1heF0gcmFuZ2UuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBjbGFtcGVkIHZhbHVlXG4gKi9cbmV4cG9ydHMuY2xhbXAgPSBmdW5jdGlvbiBjbGFtcCh2YWx1ZSwgcmFuZ2UpIHtcbiAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KHZhbHVlLCByYW5nZVswXSksIHJhbmdlWzFdKTtcbn07XG5cbi8qKlxuICogSXQncyBhIG5vb3AuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydHMubm9vcCA9IGZ1bmN0aW9uICgpIHt9O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXAtbGlrZSBvYmplY3QuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBIFwibWFwXCIgaXMgYW4gb2JqZWN0IHdpdGggbm8gcHJvdG90eXBlLCBmb3Igb3VyIHB1cnBvc2VzLiBJbiBzb21lIGNhc2VzXG4gKiB0aGlzIHdvdWxkIGJlIG1vcmUgYXBwcm9wcmlhdGUgdGhhbiBhIGBNYXBgLCBlc3BlY2lhbGx5IGlmIHlvdXIgZW52aXJvbm1lbnRcbiAqIGRvZXNuJ3Qgc3VwcG9ydCBpdC4gUmVjb21tZW5kZWQgZm9yIHVzZSBpbiBNb2NoYSdzIHB1YmxpYyBBUElzLlxuICpcbiAqIEBwdWJsaWNcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL01hcCNDdXN0b21fYW5kX051bGxfb2JqZWN0c3xNRE46TWFwfVxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2NyZWF0ZSNDdXN0b21fYW5kX051bGxfb2JqZWN0c3xNRE46T2JqZWN0LmNyZWF0ZSAtIEN1c3RvbSBvYmplY3RzfVxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2Fzc2lnbiNDdXN0b21fYW5kX051bGxfb2JqZWN0c3xNRE46T2JqZWN0LmFzc2lnbn1cbiAqIEBwYXJhbSB7Li4uKn0gW29ial0gLSBBcmd1bWVudHMgdG8gYE9iamVjdC5hc3NpZ24oKWAuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBBbiBvYmplY3Qgd2l0aCBubyBwcm90b3R5cGUsIGhhdmluZyBgLi4ub2JqYCBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydHMuY3JlYXRlTWFwID0gZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbi5hcHBseShcbiAgICBudWxsLFxuICAgIFtPYmplY3QuY3JlYXRlKG51bGwpXS5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSlcbiAgKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJlYWQtb25seSBtYXAtbGlrZSBvYmplY3QuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGlzIGRpZmZlcnMgZnJvbSB7QGxpbmsgbW9kdWxlOnV0aWxzLmNyZWF0ZU1hcCBjcmVhdGVNYXB9IG9ubHkgaW4gdGhhdFxuICogdGhlIGFyZ3VtZW50IG11c3QgYmUgbm9uLWVtcHR5LCBiZWNhdXNlIHRoZSByZXN1bHQgaXMgZnJvemVuLlxuICpcbiAqIEBzZWUge0BsaW5rIG1vZHVsZTp1dGlscy5jcmVhdGVNYXAgY3JlYXRlTWFwfVxuICogQHBhcmFtIHsuLi4qfSBbb2JqXSAtIEFyZ3VtZW50cyB0byBgT2JqZWN0LmFzc2lnbigpYC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IEEgZnJvemVuIG9iamVjdCB3aXRoIG5vIHByb3RvdHlwZSwgaGF2aW5nIGAuLi5vYmpgIHByb3BlcnRpZXNcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gaWYgYXJndW1lbnQgaXMgbm90IGEgbm9uLWVtcHR5IG9iamVjdC5cbiAqL1xuZXhwb3J0cy5kZWZpbmVDb25zdGFudHMgPSBmdW5jdGlvbiAob2JqKSB7XG4gIGlmIChjYW5vbmljYWxUeXBlKG9iaikgIT09ICdvYmplY3QnIHx8ICFPYmplY3Qua2V5cyhvYmopLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgYXJndW1lbnQ7IGV4cGVjdGVkIGEgbm9uLWVtcHR5IG9iamVjdCcpO1xuICB9XG4gIHJldHVybiBPYmplY3QuZnJlZXplKGV4cG9ydHMuY3JlYXRlTWFwKG9iaikpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnlcbiAqXG4gKiBXcmFwcGVyIGFyb3VuZCBgcHJvY2Vzcy5jd2QoKWAgZm9yIGlzb2xhdGlvblxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0cy5jd2QgPSBmdW5jdGlvbiBjd2QoKSB7XG4gIHJldHVybiBwcm9jZXNzLmN3ZCgpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiBNb2NoYSBpcyBydW5uaW5nIGluIGEgYnJvd3Nlci5cbiAqIENoZWNrcyBmb3IgYHByb2Nlc3MuYnJvd3NlcmAuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydHMuaXNCcm93c2VyID0gZnVuY3Rpb24gaXNCcm93c2VyKCkge1xuICByZXR1cm4gQm9vbGVhbihwcm9jZXNzLmJyb3dzZXIpO1xufTtcblxuLypcbiAqIENhc3RzIGB2YWx1ZWAgdG8gYW4gYXJyYXk7IHVzZWZ1bCBmb3Igb3B0aW9uYWxseSBhY2NlcHRpbmcgYXJyYXkgcGFyYW1ldGVyc1xuICpcbiAqIEl0IGZvbGxvd3MgdGhlc2UgcnVsZXMsIGRlcGVuZGluZyBvbiBgdmFsdWVgLiAgSWYgYHZhbHVlYCBpcy4uLlxuICogMS4gYHVuZGVmaW5lZGA6IHJldHVybiBhbiBlbXB0eSBBcnJheVxuICogMi4gYG51bGxgOiByZXR1cm4gYW4gYXJyYXkgd2l0aCBhIHNpbmdsZSBgbnVsbGAgZWxlbWVudFxuICogMy4gQW55IG90aGVyIG9iamVjdDogcmV0dXJuIHRoZSB2YWx1ZSBvZiBgQXJyYXkuZnJvbSgpYCBfaWZfIHRoZSBvYmplY3QgaXMgaXRlcmFibGVcbiAqIDQuIG90aGVyd2lzZTogcmV0dXJuIGFuIGFycmF5IHdpdGggYSBzaW5nbGUgZWxlbWVudCwgYHZhbHVlYFxuICogQHBhcmFtIHsqfSB2YWx1ZSAtIFNvbWV0aGluZyB0byBjYXN0IHRvIGFuIEFycmF5XG4gKiBAcmV0dXJucyB7QXJyYXk8Kj59XG4gKi9cbmV4cG9ydHMuY2FzdEFycmF5ID0gZnVuY3Rpb24gY2FzdEFycmF5KHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBbbnVsbF07XG4gIH1cbiAgaWYgKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAodHlwZW9mIHZhbHVlW1N5bWJvbC5pdGVyYXRvcl0gPT09ICdmdW5jdGlvbicgfHwgdmFsdWUubGVuZ3RoICE9PSB1bmRlZmluZWQpXG4gICkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHZhbHVlKTtcbiAgfVxuICByZXR1cm4gW3ZhbHVlXTtcbn07XG5cbmV4cG9ydHMuY29uc3RhbnRzID0gZXhwb3J0cy5kZWZpbmVDb25zdGFudHMoe1xuICBNT0NIQV9JRF9QUk9QX05BTUVcbn0pO1xuXG5jb25zdCB1bmlxdWVJREJhc2UgPVxuICAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODktXyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB1bmlxdWUgaWRlbnRpZmllclxuICogRG9lcyBub3QgY3JlYXRlIGNyeXB0b2dyYXBoaWNhbGx5IHNhZmUgaWRzLlxuICogVHJpdmlhbCBjb3B5IG9mIG5hbm9pZC9ub24tc2VjdXJlXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBVbmlxdWUgaWRlbnRpZmllclxuICovXG5leHBvcnRzLnVuaXF1ZUlEID0gKCkgPT4ge1xuICBsZXQgaWQgPSAnJztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAyMTsgaSsrKSB7XG4gICAgaWQgKz0gdW5pcXVlSURCYXNlWyhNYXRoLnJhbmRvbSgpICogNjQpIHwgMF07XG4gIH1cbiAgcmV0dXJuIGlkO1xufTtcblxuZXhwb3J0cy5hc3NpZ25OZXdNb2NoYUlEID0gb2JqID0+IHtcbiAgY29uc3QgaWQgPSBleHBvcnRzLnVuaXF1ZUlEKCk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIE1PQ0hBX0lEX1BST1BfTkFNRSwge1xuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiBpZDtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gb2JqO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgYSBNb2NoYSBJRCBmcm9tIGFuIG9iamVjdCwgaWYgcHJlc2VudC5cbiAqIEBwYXJhbSB7Kn0gW29ial0gLSBPYmplY3RcbiAqIEByZXR1cm5zIHtzdHJpbmd8dm9pZH1cbiAqL1xuZXhwb3J0cy5nZXRNb2NoYUlEID0gb2JqID0+XG4gIG9iaiAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyA/IG9ialtNT0NIQV9JRF9QUk9QX05BTUVdIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIFJlcGxhY2VzIGFueSBkZXRlY3RlZCBjaXJjdWxhciBkZXBlbmRlbmN5IHdpdGggdGhlIHN0cmluZyAnW0NpcmN1bGFyXSdcbiAqIE11dGF0ZXMgb3JpZ2luYWwgb2JqZWN0XG4gKiBAcGFyYW0gaW5wdXRPYmogeyp9XG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuZXhwb3J0cy5icmVha0NpcmN1bGFyRGVwcyA9IGlucHV0T2JqID0+IHtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKTtcblxuICBmdW5jdGlvbiBfYnJlYWtDaXJjdWxhckRlcHMob2JqKSB7XG4gICAgaWYgKG9iaiAmJiB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG5cbiAgICBpZiAoc2Vlbi5oYXMob2JqKSkge1xuICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICB9XG5cbiAgICBzZWVuLmFkZChvYmopO1xuICAgIGZvciAoY29uc3QgayBpbiBvYmopIHtcbiAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgayk7XG5cbiAgICAgIGlmIChkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3Iud3JpdGFibGUpIHtcbiAgICAgICAgb2JqW2tdID0gX2JyZWFrQ2lyY3VsYXJEZXBzKG9ialtrXSwgayk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZGVsZXRpbmcgbWVhbnMgb25seSBhIHNlZW4gb2JqZWN0IHRoYXQgaXMgaXRzIG93biBjaGlsZCB3aWxsIGJlIGRldGVjdGVkXG4gICAgc2Vlbi5kZWxldGUob2JqKTtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgcmV0dXJuIF9icmVha0NpcmN1bGFyRGVwcyhpbnB1dE9iaik7XG59O1xuXG4vKipcbiAqIENoZWNrcyBpZiBwcm92aWRlZCBpbnB1dCBjYW4gYmUgcGFyc2VkIGFzIGEgSmF2YVNjcmlwdCBOdW1iZXIuXG4gKi9cbmV4cG9ydHMuaXNOdW1lcmljID0gaW5wdXQgPT4ge1xuICByZXR1cm4gIWlzTmFOKHBhcnNlRmxvYXQoaW5wdXQpKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0aW5mbzogJ+KEue+4jycsXG5cdHN1Y2Nlc3M6ICfinIUnLFxuXHR3YXJuaW5nOiAn4pqg77iPJyxcblx0ZXJyb3I6ICfinYzvuI8nXG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gQG1vZHVsZSBQZW5kaW5nXG4qL1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBlbmRpbmc7XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIG5ldyBgUGVuZGluZ2AgZXJyb3Igd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICovXG5mdW5jdGlvbiBQZW5kaW5nKG1lc3NhZ2UpIHtcbiAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbn1cbiIsICIvKipcbiAqIEhlbHBlcnMuXG4gKi9cblxudmFyIHMgPSAxMDAwO1xudmFyIG0gPSBzICogNjA7XG52YXIgaCA9IG0gKiA2MDtcbnZhciBkID0gaCAqIDI0O1xudmFyIHcgPSBkICogNztcbnZhciB5ID0gZCAqIDM2NS4yNTtcblxuLyoqXG4gKiBQYXJzZSBvciBmb3JtYXQgdGhlIGdpdmVuIGB2YWxgLlxuICpcbiAqIE9wdGlvbnM6XG4gKlxuICogIC0gYGxvbmdgIHZlcmJvc2UgZm9ybWF0dGluZyBbZmFsc2VdXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSB2YWxcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEB0aHJvd3Mge0Vycm9yfSB0aHJvdyBhbiBlcnJvciBpZiB2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIG51bWJlclxuICogQHJldHVybiB7U3RyaW5nfE51bWJlcn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbih2YWwsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbDtcbiAgaWYgKHR5cGUgPT09ICdzdHJpbmcnICYmIHZhbC5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHBhcnNlKHZhbCk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUodmFsKSkge1xuICAgIHJldHVybiBvcHRpb25zLmxvbmcgPyBmbXRMb25nKHZhbCkgOiBmbXRTaG9ydCh2YWwpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICAndmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSB2YWxpZCBudW1iZXIuIHZhbD0nICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KHZhbClcbiAgKTtcbn07XG5cbi8qKlxuICogUGFyc2UgdGhlIGdpdmVuIGBzdHJgIGFuZCByZXR1cm4gbWlsbGlzZWNvbmRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlKHN0cikge1xuICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgaWYgKHN0ci5sZW5ndGggPiAxMDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG1hdGNoID0gL14oLT8oPzpcXGQrKT9cXC4/XFxkKykgKihtaWxsaXNlY29uZHM/fG1zZWNzP3xtc3xzZWNvbmRzP3xzZWNzP3xzfG1pbnV0ZXM/fG1pbnM/fG18aG91cnM/fGhycz98aHxkYXlzP3xkfHdlZWtzP3x3fHllYXJzP3x5cnM/fHkpPyQvaS5leGVjKFxuICAgIHN0clxuICApO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBuID0gcGFyc2VGbG9hdChtYXRjaFsxXSk7XG4gIHZhciB0eXBlID0gKG1hdGNoWzJdIHx8ICdtcycpLnRvTG93ZXJDYXNlKCk7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3llYXJzJzpcbiAgICBjYXNlICd5ZWFyJzpcbiAgICBjYXNlICd5cnMnOlxuICAgIGNhc2UgJ3lyJzpcbiAgICBjYXNlICd5JzpcbiAgICAgIHJldHVybiBuICogeTtcbiAgICBjYXNlICd3ZWVrcyc6XG4gICAgY2FzZSAnd2Vlayc6XG4gICAgY2FzZSAndyc6XG4gICAgICByZXR1cm4gbiAqIHc7XG4gICAgY2FzZSAnZGF5cyc6XG4gICAgY2FzZSAnZGF5JzpcbiAgICBjYXNlICdkJzpcbiAgICAgIHJldHVybiBuICogZDtcbiAgICBjYXNlICdob3Vycyc6XG4gICAgY2FzZSAnaG91cic6XG4gICAgY2FzZSAnaHJzJzpcbiAgICBjYXNlICdocic6XG4gICAgY2FzZSAnaCc6XG4gICAgICByZXR1cm4gbiAqIGg7XG4gICAgY2FzZSAnbWludXRlcyc6XG4gICAgY2FzZSAnbWludXRlJzpcbiAgICBjYXNlICdtaW5zJzpcbiAgICBjYXNlICdtaW4nOlxuICAgIGNhc2UgJ20nOlxuICAgICAgcmV0dXJuIG4gKiBtO1xuICAgIGNhc2UgJ3NlY29uZHMnOlxuICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgY2FzZSAnc2Vjcyc6XG4gICAgY2FzZSAnc2VjJzpcbiAgICBjYXNlICdzJzpcbiAgICAgIHJldHVybiBuICogcztcbiAgICBjYXNlICdtaWxsaXNlY29uZHMnOlxuICAgIGNhc2UgJ21pbGxpc2Vjb25kJzpcbiAgICBjYXNlICdtc2Vjcyc6XG4gICAgY2FzZSAnbXNlYyc6XG4gICAgY2FzZSAnbXMnOlxuICAgICAgcmV0dXJuIG47XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBTaG9ydCBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmbXRTaG9ydChtcykge1xuICB2YXIgbXNBYnMgPSBNYXRoLmFicyhtcyk7XG4gIGlmIChtc0FicyA+PSBkKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBkKSArICdkJztcbiAgfVxuICBpZiAobXNBYnMgPj0gaCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gaCkgKyAnaCc7XG4gIH1cbiAgaWYgKG1zQWJzID49IG0pIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIG0pICsgJ20nO1xuICB9XG4gIGlmIChtc0FicyA+PSBzKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBzKSArICdzJztcbiAgfVxuICByZXR1cm4gbXMgKyAnbXMnO1xufVxuXG4vKipcbiAqIExvbmcgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZm10TG9uZyhtcykge1xuICB2YXIgbXNBYnMgPSBNYXRoLmFicyhtcyk7XG4gIGlmIChtc0FicyA+PSBkKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGQsICdkYXknKTtcbiAgfVxuICBpZiAobXNBYnMgPj0gaCkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBoLCAnaG91cicpO1xuICB9XG4gIGlmIChtc0FicyA+PSBtKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIG0sICdtaW51dGUnKTtcbiAgfVxuICBpZiAobXNBYnMgPj0gcykge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBzLCAnc2Vjb25kJyk7XG4gIH1cbiAgcmV0dXJuIG1zICsgJyBtcyc7XG59XG5cbi8qKlxuICogUGx1cmFsaXphdGlvbiBoZWxwZXIuXG4gKi9cblxuZnVuY3Rpb24gcGx1cmFsKG1zLCBtc0FicywgbiwgbmFtZSkge1xuICB2YXIgaXNQbHVyYWwgPSBtc0FicyA+PSBuICogMS41O1xuICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIG4pICsgJyAnICsgbmFtZSArIChpc1BsdXJhbCA/ICdzJyA6ICcnKTtcbn1cbiIsICJcbi8qKlxuICogVGhpcyBpcyB0aGUgY29tbW9uIGxvZ2ljIGZvciBib3RoIHRoZSBOb2RlLmpzIGFuZCB3ZWIgYnJvd3NlclxuICogaW1wbGVtZW50YXRpb25zIG9mIGBkZWJ1ZygpYC5cbiAqL1xuXG5mdW5jdGlvbiBzZXR1cChlbnYpIHtcblx0Y3JlYXRlRGVidWcuZGVidWcgPSBjcmVhdGVEZWJ1Zztcblx0Y3JlYXRlRGVidWcuZGVmYXVsdCA9IGNyZWF0ZURlYnVnO1xuXHRjcmVhdGVEZWJ1Zy5jb2VyY2UgPSBjb2VyY2U7XG5cdGNyZWF0ZURlYnVnLmRpc2FibGUgPSBkaXNhYmxlO1xuXHRjcmVhdGVEZWJ1Zy5lbmFibGUgPSBlbmFibGU7XG5cdGNyZWF0ZURlYnVnLmVuYWJsZWQgPSBlbmFibGVkO1xuXHRjcmVhdGVEZWJ1Zy5odW1hbml6ZSA9IHJlcXVpcmUoJ21zJyk7XG5cdGNyZWF0ZURlYnVnLmRlc3Ryb3kgPSBkZXN0cm95O1xuXG5cdE9iamVjdC5rZXlzKGVudikuZm9yRWFjaChrZXkgPT4ge1xuXHRcdGNyZWF0ZURlYnVnW2tleV0gPSBlbnZba2V5XTtcblx0fSk7XG5cblx0LyoqXG5cdCogVGhlIGN1cnJlbnRseSBhY3RpdmUgZGVidWcgbW9kZSBuYW1lcywgYW5kIG5hbWVzIHRvIHNraXAuXG5cdCovXG5cblx0Y3JlYXRlRGVidWcubmFtZXMgPSBbXTtcblx0Y3JlYXRlRGVidWcuc2tpcHMgPSBbXTtcblxuXHQvKipcblx0KiBNYXAgb2Ygc3BlY2lhbCBcIiVuXCIgaGFuZGxpbmcgZnVuY3Rpb25zLCBmb3IgdGhlIGRlYnVnIFwiZm9ybWF0XCIgYXJndW1lbnQuXG5cdCpcblx0KiBWYWxpZCBrZXkgbmFtZXMgYXJlIGEgc2luZ2xlLCBsb3dlciBvciB1cHBlci1jYXNlIGxldHRlciwgaS5lLiBcIm5cIiBhbmQgXCJOXCIuXG5cdCovXG5cdGNyZWF0ZURlYnVnLmZvcm1hdHRlcnMgPSB7fTtcblxuXHQvKipcblx0KiBTZWxlY3RzIGEgY29sb3IgZm9yIGEgZGVidWcgbmFtZXNwYWNlXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIHN0cmluZyBmb3IgdGhlIGRlYnVnIGluc3RhbmNlIHRvIGJlIGNvbG9yZWRcblx0KiBAcmV0dXJuIHtOdW1iZXJ8U3RyaW5nfSBBbiBBTlNJIGNvbG9yIGNvZGUgZm9yIHRoZSBnaXZlbiBuYW1lc3BhY2Vcblx0KiBAYXBpIHByaXZhdGVcblx0Ki9cblx0ZnVuY3Rpb24gc2VsZWN0Q29sb3IobmFtZXNwYWNlKSB7XG5cdFx0bGV0IGhhc2ggPSAwO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lc3BhY2UubGVuZ3RoOyBpKyspIHtcblx0XHRcdGhhc2ggPSAoKGhhc2ggPDwgNSkgLSBoYXNoKSArIG5hbWVzcGFjZS5jaGFyQ29kZUF0KGkpO1xuXHRcdFx0aGFzaCB8PSAwOyAvLyBDb252ZXJ0IHRvIDMyYml0IGludGVnZXJcblx0XHR9XG5cblx0XHRyZXR1cm4gY3JlYXRlRGVidWcuY29sb3JzW01hdGguYWJzKGhhc2gpICUgY3JlYXRlRGVidWcuY29sb3JzLmxlbmd0aF07XG5cdH1cblx0Y3JlYXRlRGVidWcuc2VsZWN0Q29sb3IgPSBzZWxlY3RDb2xvcjtcblxuXHQvKipcblx0KiBDcmVhdGUgYSBkZWJ1Z2dlciB3aXRoIHRoZSBnaXZlbiBgbmFtZXNwYWNlYC5cblx0KlxuXHQqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2Vcblx0KiBAcmV0dXJuIHtGdW5jdGlvbn1cblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBjcmVhdGVEZWJ1ZyhuYW1lc3BhY2UpIHtcblx0XHRsZXQgcHJldlRpbWU7XG5cdFx0bGV0IGVuYWJsZU92ZXJyaWRlID0gbnVsbDtcblx0XHRsZXQgbmFtZXNwYWNlc0NhY2hlO1xuXHRcdGxldCBlbmFibGVkQ2FjaGU7XG5cblx0XHRmdW5jdGlvbiBkZWJ1ZyguLi5hcmdzKSB7XG5cdFx0XHQvLyBEaXNhYmxlZD9cblx0XHRcdGlmICghZGVidWcuZW5hYmxlZCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHNlbGYgPSBkZWJ1ZztcblxuXHRcdFx0Ly8gU2V0IGBkaWZmYCB0aW1lc3RhbXBcblx0XHRcdGNvbnN0IGN1cnIgPSBOdW1iZXIobmV3IERhdGUoKSk7XG5cdFx0XHRjb25zdCBtcyA9IGN1cnIgLSAocHJldlRpbWUgfHwgY3Vycik7XG5cdFx0XHRzZWxmLmRpZmYgPSBtcztcblx0XHRcdHNlbGYucHJldiA9IHByZXZUaW1lO1xuXHRcdFx0c2VsZi5jdXJyID0gY3Vycjtcblx0XHRcdHByZXZUaW1lID0gY3VycjtcblxuXHRcdFx0YXJnc1swXSA9IGNyZWF0ZURlYnVnLmNvZXJjZShhcmdzWzBdKTtcblxuXHRcdFx0aWYgKHR5cGVvZiBhcmdzWzBdICE9PSAnc3RyaW5nJykge1xuXHRcdFx0XHQvLyBBbnl0aGluZyBlbHNlIGxldCdzIGluc3BlY3Qgd2l0aCAlT1xuXHRcdFx0XHRhcmdzLnVuc2hpZnQoJyVPJyk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFwcGx5IGFueSBgZm9ybWF0dGVyc2AgdHJhbnNmb3JtYXRpb25zXG5cdFx0XHRsZXQgaW5kZXggPSAwO1xuXHRcdFx0YXJnc1swXSA9IGFyZ3NbMF0ucmVwbGFjZSgvJShbYS16QS1aJV0pL2csIChtYXRjaCwgZm9ybWF0KSA9PiB7XG5cdFx0XHRcdC8vIElmIHdlIGVuY291bnRlciBhbiBlc2NhcGVkICUgdGhlbiBkb24ndCBpbmNyZWFzZSB0aGUgYXJyYXkgaW5kZXhcblx0XHRcdFx0aWYgKG1hdGNoID09PSAnJSUnKSB7XG5cdFx0XHRcdFx0cmV0dXJuICclJztcblx0XHRcdFx0fVxuXHRcdFx0XHRpbmRleCsrO1xuXHRcdFx0XHRjb25zdCBmb3JtYXR0ZXIgPSBjcmVhdGVEZWJ1Zy5mb3JtYXR0ZXJzW2Zvcm1hdF07XG5cdFx0XHRcdGlmICh0eXBlb2YgZm9ybWF0dGVyID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdFx0Y29uc3QgdmFsID0gYXJnc1tpbmRleF07XG5cdFx0XHRcdFx0bWF0Y2ggPSBmb3JtYXR0ZXIuY2FsbChzZWxmLCB2YWwpO1xuXG5cdFx0XHRcdFx0Ly8gTm93IHdlIG5lZWQgdG8gcmVtb3ZlIGBhcmdzW2luZGV4XWAgc2luY2UgaXQncyBpbmxpbmVkIGluIHRoZSBgZm9ybWF0YFxuXHRcdFx0XHRcdGFyZ3Muc3BsaWNlKGluZGV4LCAxKTtcblx0XHRcdFx0XHRpbmRleC0tO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBtYXRjaDtcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBBcHBseSBlbnYtc3BlY2lmaWMgZm9ybWF0dGluZyAoY29sb3JzLCBldGMuKVxuXHRcdFx0Y3JlYXRlRGVidWcuZm9ybWF0QXJncy5jYWxsKHNlbGYsIGFyZ3MpO1xuXG5cdFx0XHRjb25zdCBsb2dGbiA9IHNlbGYubG9nIHx8IGNyZWF0ZURlYnVnLmxvZztcblx0XHRcdGxvZ0ZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuXHRcdH1cblxuXHRcdGRlYnVnLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTtcblx0XHRkZWJ1Zy51c2VDb2xvcnMgPSBjcmVhdGVEZWJ1Zy51c2VDb2xvcnMoKTtcblx0XHRkZWJ1Zy5jb2xvciA9IGNyZWF0ZURlYnVnLnNlbGVjdENvbG9yKG5hbWVzcGFjZSk7XG5cdFx0ZGVidWcuZXh0ZW5kID0gZXh0ZW5kO1xuXHRcdGRlYnVnLmRlc3Ryb3kgPSBjcmVhdGVEZWJ1Zy5kZXN0cm95OyAvLyBYWFggVGVtcG9yYXJ5LiBXaWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS5cblxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkZWJ1ZywgJ2VuYWJsZWQnLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcblx0XHRcdGdldDogKCkgPT4ge1xuXHRcdFx0XHRpZiAoZW5hYmxlT3ZlcnJpZGUgIT09IG51bGwpIHtcblx0XHRcdFx0XHRyZXR1cm4gZW5hYmxlT3ZlcnJpZGU7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG5hbWVzcGFjZXNDYWNoZSAhPT0gY3JlYXRlRGVidWcubmFtZXNwYWNlcykge1xuXHRcdFx0XHRcdG5hbWVzcGFjZXNDYWNoZSA9IGNyZWF0ZURlYnVnLm5hbWVzcGFjZXM7XG5cdFx0XHRcdFx0ZW5hYmxlZENhY2hlID0gY3JlYXRlRGVidWcuZW5hYmxlZChuYW1lc3BhY2UpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGVuYWJsZWRDYWNoZTtcblx0XHRcdH0sXG5cdFx0XHRzZXQ6IHYgPT4ge1xuXHRcdFx0XHRlbmFibGVPdmVycmlkZSA9IHY7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBFbnYtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gbG9naWMgZm9yIGRlYnVnIGluc3RhbmNlc1xuXHRcdGlmICh0eXBlb2YgY3JlYXRlRGVidWcuaW5pdCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0Y3JlYXRlRGVidWcuaW5pdChkZWJ1Zyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRlYnVnO1xuXHR9XG5cblx0ZnVuY3Rpb24gZXh0ZW5kKG5hbWVzcGFjZSwgZGVsaW1pdGVyKSB7XG5cdFx0Y29uc3QgbmV3RGVidWcgPSBjcmVhdGVEZWJ1Zyh0aGlzLm5hbWVzcGFjZSArICh0eXBlb2YgZGVsaW1pdGVyID09PSAndW5kZWZpbmVkJyA/ICc6JyA6IGRlbGltaXRlcikgKyBuYW1lc3BhY2UpO1xuXHRcdG5ld0RlYnVnLmxvZyA9IHRoaXMubG9nO1xuXHRcdHJldHVybiBuZXdEZWJ1Zztcblx0fVxuXG5cdC8qKlxuXHQqIEVuYWJsZXMgYSBkZWJ1ZyBtb2RlIGJ5IG5hbWVzcGFjZXMuIFRoaXMgY2FuIGluY2x1ZGUgbW9kZXNcblx0KiBzZXBhcmF0ZWQgYnkgYSBjb2xvbiBhbmQgd2lsZGNhcmRzLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBlbmFibGUobmFtZXNwYWNlcykge1xuXHRcdGNyZWF0ZURlYnVnLnNhdmUobmFtZXNwYWNlcyk7XG5cdFx0Y3JlYXRlRGVidWcubmFtZXNwYWNlcyA9IG5hbWVzcGFjZXM7XG5cblx0XHRjcmVhdGVEZWJ1Zy5uYW1lcyA9IFtdO1xuXHRcdGNyZWF0ZURlYnVnLnNraXBzID0gW107XG5cblx0XHRsZXQgaTtcblx0XHRjb25zdCBzcGxpdCA9ICh0eXBlb2YgbmFtZXNwYWNlcyA9PT0gJ3N0cmluZycgPyBuYW1lc3BhY2VzIDogJycpLnNwbGl0KC9bXFxzLF0rLyk7XG5cdFx0Y29uc3QgbGVuID0gc3BsaXQubGVuZ3RoO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRpZiAoIXNwbGl0W2ldKSB7XG5cdFx0XHRcdC8vIGlnbm9yZSBlbXB0eSBzdHJpbmdzXG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRuYW1lc3BhY2VzID0gc3BsaXRbaV0ucmVwbGFjZSgvXFwqL2csICcuKj8nKTtcblxuXHRcdFx0aWYgKG5hbWVzcGFjZXNbMF0gPT09ICctJykge1xuXHRcdFx0XHRjcmVhdGVEZWJ1Zy5za2lwcy5wdXNoKG5ldyBSZWdFeHAoJ14nICsgbmFtZXNwYWNlcy5zbGljZSgxKSArICckJykpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y3JlYXRlRGVidWcubmFtZXMucHVzaChuZXcgUmVnRXhwKCdeJyArIG5hbWVzcGFjZXMgKyAnJCcpKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0KiBEaXNhYmxlIGRlYnVnIG91dHB1dC5cblx0KlxuXHQqIEByZXR1cm4ge1N0cmluZ30gbmFtZXNwYWNlc1xuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGRpc2FibGUoKSB7XG5cdFx0Y29uc3QgbmFtZXNwYWNlcyA9IFtcblx0XHRcdC4uLmNyZWF0ZURlYnVnLm5hbWVzLm1hcCh0b05hbWVzcGFjZSksXG5cdFx0XHQuLi5jcmVhdGVEZWJ1Zy5za2lwcy5tYXAodG9OYW1lc3BhY2UpLm1hcChuYW1lc3BhY2UgPT4gJy0nICsgbmFtZXNwYWNlKVxuXHRcdF0uam9pbignLCcpO1xuXHRcdGNyZWF0ZURlYnVnLmVuYWJsZSgnJyk7XG5cdFx0cmV0dXJuIG5hbWVzcGFjZXM7XG5cdH1cblxuXHQvKipcblx0KiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIG1vZGUgbmFtZSBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuXG5cdCpcblx0KiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuXHQqIEByZXR1cm4ge0Jvb2xlYW59XG5cdCogQGFwaSBwdWJsaWNcblx0Ki9cblx0ZnVuY3Rpb24gZW5hYmxlZChuYW1lKSB7XG5cdFx0aWYgKG5hbWVbbmFtZS5sZW5ndGggLSAxXSA9PT0gJyonKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRsZXQgaTtcblx0XHRsZXQgbGVuO1xuXG5cdFx0Zm9yIChpID0gMCwgbGVuID0gY3JlYXRlRGVidWcuc2tpcHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGlmIChjcmVhdGVEZWJ1Zy5za2lwc1tpXS50ZXN0KG5hbWUpKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmb3IgKGkgPSAwLCBsZW4gPSBjcmVhdGVEZWJ1Zy5uYW1lcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0aWYgKGNyZWF0ZURlYnVnLm5hbWVzW2ldLnRlc3QobmFtZSkpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCogQ29udmVydCByZWdleHAgdG8gbmFtZXNwYWNlXG5cdCpcblx0KiBAcGFyYW0ge1JlZ0V4cH0gcmVneGVwXG5cdCogQHJldHVybiB7U3RyaW5nfSBuYW1lc3BhY2Vcblx0KiBAYXBpIHByaXZhdGVcblx0Ki9cblx0ZnVuY3Rpb24gdG9OYW1lc3BhY2UocmVnZXhwKSB7XG5cdFx0cmV0dXJuIHJlZ2V4cC50b1N0cmluZygpXG5cdFx0XHQuc3Vic3RyaW5nKDIsIHJlZ2V4cC50b1N0cmluZygpLmxlbmd0aCAtIDIpXG5cdFx0XHQucmVwbGFjZSgvXFwuXFwqXFw/JC8sICcqJyk7XG5cdH1cblxuXHQvKipcblx0KiBDb2VyY2UgYHZhbGAuXG5cdCpcblx0KiBAcGFyYW0ge01peGVkfSB2YWxcblx0KiBAcmV0dXJuIHtNaXhlZH1cblx0KiBAYXBpIHByaXZhdGVcblx0Ki9cblx0ZnVuY3Rpb24gY29lcmNlKHZhbCkge1xuXHRcdGlmICh2YWwgaW5zdGFuY2VvZiBFcnJvcikge1xuXHRcdFx0cmV0dXJuIHZhbC5zdGFjayB8fCB2YWwubWVzc2FnZTtcblx0XHR9XG5cdFx0cmV0dXJuIHZhbDtcblx0fVxuXG5cdC8qKlxuXHQqIFhYWCBETyBOT1QgVVNFLiBUaGlzIGlzIGEgdGVtcG9yYXJ5IHN0dWIgZnVuY3Rpb24uXG5cdCogWFhYIEl0IFdJTEwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlLlxuXHQqL1xuXHRmdW5jdGlvbiBkZXN0cm95KCkge1xuXHRcdGNvbnNvbGUud2FybignSW5zdGFuY2UgbWV0aG9kIGBkZWJ1Zy5kZXN0cm95KClgIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBkb2VzIGFueXRoaW5nLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBgZGVidWdgLicpO1xuXHR9XG5cblx0Y3JlYXRlRGVidWcuZW5hYmxlKGNyZWF0ZURlYnVnLmxvYWQoKSk7XG5cblx0cmV0dXJuIGNyZWF0ZURlYnVnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldHVwO1xuIiwgIi8qIGVzbGludC1lbnYgYnJvd3NlciAqL1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIHdlYiBicm93c2VyIGltcGxlbWVudGF0aW9uIG9mIGBkZWJ1ZygpYC5cbiAqL1xuXG5leHBvcnRzLmZvcm1hdEFyZ3MgPSBmb3JtYXRBcmdzO1xuZXhwb3J0cy5zYXZlID0gc2F2ZTtcbmV4cG9ydHMubG9hZCA9IGxvYWQ7XG5leHBvcnRzLnVzZUNvbG9ycyA9IHVzZUNvbG9ycztcbmV4cG9ydHMuc3RvcmFnZSA9IGxvY2Fsc3RvcmFnZSgpO1xuZXhwb3J0cy5kZXN0cm95ID0gKCgpID0+IHtcblx0bGV0IHdhcm5lZCA9IGZhbHNlO1xuXG5cdHJldHVybiAoKSA9PiB7XG5cdFx0aWYgKCF3YXJuZWQpIHtcblx0XHRcdHdhcm5lZCA9IHRydWU7XG5cdFx0XHRjb25zb2xlLndhcm4oJ0luc3RhbmNlIG1ldGhvZCBgZGVidWcuZGVzdHJveSgpYCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgYGRlYnVnYC4nKTtcblx0XHR9XG5cdH07XG59KSgpO1xuXG4vKipcbiAqIENvbG9ycy5cbiAqL1xuXG5leHBvcnRzLmNvbG9ycyA9IFtcblx0JyMwMDAwQ0MnLFxuXHQnIzAwMDBGRicsXG5cdCcjMDAzM0NDJyxcblx0JyMwMDMzRkYnLFxuXHQnIzAwNjZDQycsXG5cdCcjMDA2NkZGJyxcblx0JyMwMDk5Q0MnLFxuXHQnIzAwOTlGRicsXG5cdCcjMDBDQzAwJyxcblx0JyMwMENDMzMnLFxuXHQnIzAwQ0M2NicsXG5cdCcjMDBDQzk5Jyxcblx0JyMwMENDQ0MnLFxuXHQnIzAwQ0NGRicsXG5cdCcjMzMwMENDJyxcblx0JyMzMzAwRkYnLFxuXHQnIzMzMzNDQycsXG5cdCcjMzMzM0ZGJyxcblx0JyMzMzY2Q0MnLFxuXHQnIzMzNjZGRicsXG5cdCcjMzM5OUNDJyxcblx0JyMzMzk5RkYnLFxuXHQnIzMzQ0MwMCcsXG5cdCcjMzNDQzMzJyxcblx0JyMzM0NDNjYnLFxuXHQnIzMzQ0M5OScsXG5cdCcjMzNDQ0NDJyxcblx0JyMzM0NDRkYnLFxuXHQnIzY2MDBDQycsXG5cdCcjNjYwMEZGJyxcblx0JyM2NjMzQ0MnLFxuXHQnIzY2MzNGRicsXG5cdCcjNjZDQzAwJyxcblx0JyM2NkNDMzMnLFxuXHQnIzk5MDBDQycsXG5cdCcjOTkwMEZGJyxcblx0JyM5OTMzQ0MnLFxuXHQnIzk5MzNGRicsXG5cdCcjOTlDQzAwJyxcblx0JyM5OUNDMzMnLFxuXHQnI0NDMDAwMCcsXG5cdCcjQ0MwMDMzJyxcblx0JyNDQzAwNjYnLFxuXHQnI0NDMDA5OScsXG5cdCcjQ0MwMENDJyxcblx0JyNDQzAwRkYnLFxuXHQnI0NDMzMwMCcsXG5cdCcjQ0MzMzMzJyxcblx0JyNDQzMzNjYnLFxuXHQnI0NDMzM5OScsXG5cdCcjQ0MzM0NDJyxcblx0JyNDQzMzRkYnLFxuXHQnI0NDNjYwMCcsXG5cdCcjQ0M2NjMzJyxcblx0JyNDQzk5MDAnLFxuXHQnI0NDOTkzMycsXG5cdCcjQ0NDQzAwJyxcblx0JyNDQ0NDMzMnLFxuXHQnI0ZGMDAwMCcsXG5cdCcjRkYwMDMzJyxcblx0JyNGRjAwNjYnLFxuXHQnI0ZGMDA5OScsXG5cdCcjRkYwMENDJyxcblx0JyNGRjAwRkYnLFxuXHQnI0ZGMzMwMCcsXG5cdCcjRkYzMzMzJyxcblx0JyNGRjMzNjYnLFxuXHQnI0ZGMzM5OScsXG5cdCcjRkYzM0NDJyxcblx0JyNGRjMzRkYnLFxuXHQnI0ZGNjYwMCcsXG5cdCcjRkY2NjMzJyxcblx0JyNGRjk5MDAnLFxuXHQnI0ZGOTkzMycsXG5cdCcjRkZDQzAwJyxcblx0JyNGRkNDMzMnXG5dO1xuXG4vKipcbiAqIEN1cnJlbnRseSBvbmx5IFdlYktpdC1iYXNlZCBXZWIgSW5zcGVjdG9ycywgRmlyZWZveCA+PSB2MzEsXG4gKiBhbmQgdGhlIEZpcmVidWcgZXh0ZW5zaW9uIChhbnkgRmlyZWZveCB2ZXJzaW9uKSBhcmUga25vd25cbiAqIHRvIHN1cHBvcnQgXCIlY1wiIENTUyBjdXN0b21pemF0aW9ucy5cbiAqXG4gKiBUT0RPOiBhZGQgYSBgbG9jYWxTdG9yYWdlYCB2YXJpYWJsZSB0byBleHBsaWNpdGx5IGVuYWJsZS9kaXNhYmxlIGNvbG9yc1xuICovXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5mdW5jdGlvbiB1c2VDb2xvcnMoKSB7XG5cdC8vIE5COiBJbiBhbiBFbGVjdHJvbiBwcmVsb2FkIHNjcmlwdCwgZG9jdW1lbnQgd2lsbCBiZSBkZWZpbmVkIGJ1dCBub3QgZnVsbHlcblx0Ly8gaW5pdGlhbGl6ZWQuIFNpbmNlIHdlIGtub3cgd2UncmUgaW4gQ2hyb21lLCB3ZSdsbCBqdXN0IGRldGVjdCB0aGlzIGNhc2Vcblx0Ly8gZXhwbGljaXRseVxuXHRpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LnByb2Nlc3MgJiYgKHdpbmRvdy5wcm9jZXNzLnR5cGUgPT09ICdyZW5kZXJlcicgfHwgd2luZG93LnByb2Nlc3MuX19ud2pzKSkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Ly8gSW50ZXJuZXQgRXhwbG9yZXIgYW5kIEVkZ2UgZG8gbm90IHN1cHBvcnQgY29sb3JzLlxuXHRpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goLyhlZGdlfHRyaWRlbnQpXFwvKFxcZCspLykpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvLyBJcyB3ZWJraXQ/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE2NDU5NjA2LzM3Njc3M1xuXHQvLyBkb2N1bWVudCBpcyB1bmRlZmluZWQgaW4gcmVhY3QtbmF0aXZlOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QtbmF0aXZlL3B1bGwvMTYzMlxuXHRyZXR1cm4gKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuV2Via2l0QXBwZWFyYW5jZSkgfHxcblx0XHQvLyBJcyBmaXJlYnVnPyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zOTgxMjAvMzc2NzczXG5cdFx0KHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jb25zb2xlICYmICh3aW5kb3cuY29uc29sZS5maXJlYnVnIHx8ICh3aW5kb3cuY29uc29sZS5leGNlcHRpb24gJiYgd2luZG93LmNvbnNvbGUudGFibGUpKSkgfHxcblx0XHQvLyBJcyBmaXJlZm94ID49IHYzMT9cblx0XHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1Rvb2xzL1dlYl9Db25zb2xlI1N0eWxpbmdfbWVzc2FnZXNcblx0XHQodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2ZpcmVmb3hcXC8oXFxkKykvKSAmJiBwYXJzZUludChSZWdFeHAuJDEsIDEwKSA+PSAzMSkgfHxcblx0XHQvLyBEb3VibGUgY2hlY2sgd2Via2l0IGluIHVzZXJBZ2VudCBqdXN0IGluIGNhc2Ugd2UgYXJlIGluIGEgd29ya2VyXG5cdFx0KHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9hcHBsZXdlYmtpdFxcLyhcXGQrKS8pKTtcbn1cblxuLyoqXG4gKiBDb2xvcml6ZSBsb2cgYXJndW1lbnRzIGlmIGVuYWJsZWQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXRBcmdzKGFyZ3MpIHtcblx0YXJnc1swXSA9ICh0aGlzLnVzZUNvbG9ycyA/ICclYycgOiAnJykgK1xuXHRcdHRoaXMubmFtZXNwYWNlICtcblx0XHQodGhpcy51c2VDb2xvcnMgPyAnICVjJyA6ICcgJykgK1xuXHRcdGFyZ3NbMF0gK1xuXHRcdCh0aGlzLnVzZUNvbG9ycyA/ICclYyAnIDogJyAnKSArXG5cdFx0JysnICsgbW9kdWxlLmV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKTtcblxuXHRpZiAoIXRoaXMudXNlQ29sb3JzKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgYyA9ICdjb2xvcjogJyArIHRoaXMuY29sb3I7XG5cdGFyZ3Muc3BsaWNlKDEsIDAsIGMsICdjb2xvcjogaW5oZXJpdCcpO1xuXG5cdC8vIFRoZSBmaW5hbCBcIiVjXCIgaXMgc29tZXdoYXQgdHJpY2t5LCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG90aGVyXG5cdC8vIGFyZ3VtZW50cyBwYXNzZWQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgJWMsIHNvIHdlIG5lZWQgdG9cblx0Ly8gZmlndXJlIG91dCB0aGUgY29ycmVjdCBpbmRleCB0byBpbnNlcnQgdGhlIENTUyBpbnRvXG5cdGxldCBpbmRleCA9IDA7XG5cdGxldCBsYXN0QyA9IDA7XG5cdGFyZ3NbMF0ucmVwbGFjZSgvJVthLXpBLVolXS9nLCBtYXRjaCA9PiB7XG5cdFx0aWYgKG1hdGNoID09PSAnJSUnKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGluZGV4Kys7XG5cdFx0aWYgKG1hdGNoID09PSAnJWMnKSB7XG5cdFx0XHQvLyBXZSBvbmx5IGFyZSBpbnRlcmVzdGVkIGluIHRoZSAqbGFzdCogJWNcblx0XHRcdC8vICh0aGUgdXNlciBtYXkgaGF2ZSBwcm92aWRlZCB0aGVpciBvd24pXG5cdFx0XHRsYXN0QyA9IGluZGV4O1xuXHRcdH1cblx0fSk7XG5cblx0YXJncy5zcGxpY2UobGFzdEMsIDAsIGMpO1xufVxuXG4vKipcbiAqIEludm9rZXMgYGNvbnNvbGUuZGVidWcoKWAgd2hlbiBhdmFpbGFibGUuXG4gKiBOby1vcCB3aGVuIGBjb25zb2xlLmRlYnVnYCBpcyBub3QgYSBcImZ1bmN0aW9uXCIuXG4gKiBJZiBgY29uc29sZS5kZWJ1Z2AgaXMgbm90IGF2YWlsYWJsZSwgZmFsbHMgYmFja1xuICogdG8gYGNvbnNvbGUubG9nYC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5leHBvcnRzLmxvZyA9IGNvbnNvbGUuZGVidWcgfHwgY29uc29sZS5sb2cgfHwgKCgpID0+IHt9KTtcblxuLyoqXG4gKiBTYXZlIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNhdmUobmFtZXNwYWNlcykge1xuXHR0cnkge1xuXHRcdGlmIChuYW1lc3BhY2VzKSB7XG5cdFx0XHRleHBvcnRzLnN0b3JhZ2Uuc2V0SXRlbSgnZGVidWcnLCBuYW1lc3BhY2VzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZXhwb3J0cy5zdG9yYWdlLnJlbW92ZUl0ZW0oJ2RlYnVnJyk7XG5cdFx0fVxuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIFN3YWxsb3dcblx0XHQvLyBYWFggKEBRaXgtKSBzaG91bGQgd2UgYmUgbG9nZ2luZyB0aGVzZT9cblx0fVxufVxuXG4vKipcbiAqIExvYWQgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcHJldmlvdXNseSBwZXJzaXN0ZWQgZGVidWcgbW9kZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBsb2FkKCkge1xuXHRsZXQgcjtcblx0dHJ5IHtcblx0XHRyID0gZXhwb3J0cy5zdG9yYWdlLmdldEl0ZW0oJ2RlYnVnJyk7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gU3dhbGxvd1xuXHRcdC8vIFhYWCAoQFFpeC0pIHNob3VsZCB3ZSBiZSBsb2dnaW5nIHRoZXNlP1xuXHR9XG5cblx0Ly8gSWYgZGVidWcgaXNuJ3Qgc2V0IGluIExTLCBhbmQgd2UncmUgaW4gRWxlY3Ryb24sIHRyeSB0byBsb2FkICRERUJVR1xuXHRpZiAoIXIgJiYgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmICdlbnYnIGluIHByb2Nlc3MpIHtcblx0XHRyID0gcHJvY2Vzcy5lbnYuREVCVUc7XG5cdH1cblxuXHRyZXR1cm4gcjtcbn1cblxuLyoqXG4gKiBMb2NhbHN0b3JhZ2UgYXR0ZW1wdHMgdG8gcmV0dXJuIHRoZSBsb2NhbHN0b3JhZ2UuXG4gKlxuICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzYWZhcmkgdGhyb3dzXG4gKiB3aGVuIGEgdXNlciBkaXNhYmxlcyBjb29raWVzL2xvY2Fsc3RvcmFnZVxuICogYW5kIHlvdSBhdHRlbXB0IHRvIGFjY2VzcyBpdC5cbiAqXG4gKiBAcmV0dXJuIHtMb2NhbFN0b3JhZ2V9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2NhbHN0b3JhZ2UoKSB7XG5cdHRyeSB7XG5cdFx0Ly8gVFZNTEtpdCAoQXBwbGUgVFYgSlMgUnVudGltZSkgZG9lcyBub3QgaGF2ZSBhIHdpbmRvdyBvYmplY3QsIGp1c3QgbG9jYWxTdG9yYWdlIGluIHRoZSBnbG9iYWwgY29udGV4dFxuXHRcdC8vIFRoZSBCcm93c2VyIGFsc28gaGFzIGxvY2FsU3RvcmFnZSBpbiB0aGUgZ2xvYmFsIGNvbnRleHQuXG5cdFx0cmV0dXJuIGxvY2FsU3RvcmFnZTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBTd2FsbG93XG5cdFx0Ly8gWFhYIChAUWl4LSkgc2hvdWxkIHdlIGJlIGxvZ2dpbmcgdGhlc2U/XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2NvbW1vbicpKGV4cG9ydHMpO1xuXG5jb25zdCB7Zm9ybWF0dGVyc30gPSBtb2R1bGUuZXhwb3J0cztcblxuLyoqXG4gKiBNYXAgJWogdG8gYEpTT04uc3RyaW5naWZ5KClgLCBzaW5jZSBubyBXZWIgSW5zcGVjdG9ycyBkbyB0aGF0IGJ5IGRlZmF1bHQuXG4gKi9cblxuZm9ybWF0dGVycy5qID0gZnVuY3Rpb24gKHYpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkodik7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0cmV0dXJuICdbVW5leHBlY3RlZEpTT05QYXJzZUVycm9yXTogJyArIGVycm9yLm1lc3NhZ2U7XG5cdH1cbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB7Zm9ybWF0fSA9IHJlcXVpcmUoJ3V0aWwnKTtcblxuLyoqXG4gKiBDb250YWlucyBlcnJvciBjb2RlcywgZmFjdG9yeSBmdW5jdGlvbnMgdG8gY3JlYXRlIHRocm93YWJsZSBlcnJvciBvYmplY3RzLFxuICogYW5kIHdhcm5pbmcvZGVwcmVjYXRpb24gZnVuY3Rpb25zLlxuICogQG1vZHVsZVxuICovXG5cbi8qKlxuICogcHJvY2Vzcy5lbWl0V2FybmluZyBvciBhIHBvbHlmaWxsXG4gKiBAc2VlIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvcHJvY2Vzcy5odG1sI3Byb2Nlc3NfcHJvY2Vzc19lbWl0d2FybmluZ193YXJuaW5nX29wdGlvbnNcbiAqIEBpZ25vcmVcbiAqL1xuY29uc3QgZW1pdFdhcm5pbmcgPSAobXNnLCB0eXBlKSA9PiB7XG4gIGlmIChwcm9jZXNzLmVtaXRXYXJuaW5nKSB7XG4gICAgcHJvY2Vzcy5lbWl0V2FybmluZyhtc2csIHR5cGUpO1xuICB9IGVsc2Uge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zb2xlLndhcm4odHlwZSArICc6ICcgKyBtc2cpO1xuICAgIH0pO1xuICB9XG59O1xuXG4vKipcbiAqIFNob3cgYSBkZXByZWNhdGlvbiB3YXJuaW5nLiBFYWNoIGRpc3RpbmN0IG1lc3NhZ2UgaXMgb25seSBkaXNwbGF5ZWQgb25jZS5cbiAqIElnbm9yZXMgZW1wdHkgbWVzc2FnZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttc2ddIC0gV2FybmluZyB0byBwcmludFxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgZGVwcmVjYXRlID0gbXNnID0+IHtcbiAgbXNnID0gU3RyaW5nKG1zZyk7XG4gIGlmIChtc2cgJiYgIWRlcHJlY2F0ZS5jYWNoZVttc2ddKSB7XG4gICAgZGVwcmVjYXRlLmNhY2hlW21zZ10gPSB0cnVlO1xuICAgIGVtaXRXYXJuaW5nKG1zZywgJ0RlcHJlY2F0aW9uV2FybmluZycpO1xuICB9XG59O1xuZGVwcmVjYXRlLmNhY2hlID0ge307XG5cbi8qKlxuICogU2hvdyBhIGdlbmVyaWMgd2FybmluZy5cbiAqIElnbm9yZXMgZW1wdHkgbWVzc2FnZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttc2ddIC0gV2FybmluZyB0byBwcmludFxuICogQHByaXZhdGVcbiAqL1xuY29uc3Qgd2FybiA9IG1zZyA9PiB7XG4gIGlmIChtc2cpIHtcbiAgICBlbWl0V2FybmluZyhtc2cpO1xuICB9XG59O1xuXG4vKipcbiAqIFdoZW4gTW9jaGEgdGhyb3dzIGV4Y2VwdGlvbnMgKG9yIHJlamVjdHMgYFByb21pc2VgcyksIGl0IGF0dGVtcHRzIHRvIGFzc2lnbiBhIGBjb2RlYCBwcm9wZXJ0eSB0byB0aGUgYEVycm9yYCBvYmplY3QsIGZvciBlYXNpZXIgaGFuZGxpbmcuIFRoZXNlIGFyZSB0aGUgcG90ZW50aWFsIHZhbHVlcyBvZiBgY29kZWAuXG4gKiBAcHVibGljXG4gKiBAbmFtZXNwYWNlXG4gKiBAbWVtYmVyb2YgbW9kdWxlOmxpYi9lcnJvcnNcbiAqL1xudmFyIGNvbnN0YW50cyA9IHtcbiAgLyoqXG4gICAqIEFuIHVucmVjb3ZlcmFibGUgZXJyb3IuXG4gICAqIEBjb25zdGFudFxuICAgKiBAZGVmYXVsdFxuICAgKi9cbiAgRkFUQUw6ICdFUlJfTU9DSEFfRkFUQUwnLFxuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBhbiBhcmd1bWVudCB0byBhIGZ1bmN0aW9uIGNhbGwgaXMgaW52YWxpZFxuICAgKiBAY29uc3RhbnRcbiAgICogQGRlZmF1bHRcbiAgICovXG4gIElOVkFMSURfQVJHX1RZUEU6ICdFUlJfTU9DSEFfSU5WQUxJRF9BUkdfVFlQRScsXG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiBhbiBhcmd1bWVudCB0byBhIGZ1bmN0aW9uIGNhbGwgaXMgaW52YWxpZFxuICAgKiBAY29uc3RhbnRcbiAgICogQGRlZmF1bHRcbiAgICovXG4gIElOVkFMSURfQVJHX1ZBTFVFOiAnRVJSX01PQ0hBX0lOVkFMSURfQVJHX1ZBTFVFJyxcblxuICAvKipcbiAgICogU29tZXRoaW5nIHdhcyB0aHJvd24sIGJ1dCBpdCB3YXNuJ3QgYW4gYEVycm9yYFxuICAgKiBAY29uc3RhbnRcbiAgICogQGRlZmF1bHRcbiAgICovXG4gIElOVkFMSURfRVhDRVBUSU9OOiAnRVJSX01PQ0hBX0lOVkFMSURfRVhDRVBUSU9OJyxcblxuICAvKipcbiAgICogQW4gaW50ZXJmYWNlIChlLmcuLCBgTW9jaGEuaW50ZXJmYWNlc2ApIGlzIHVua25vd24gb3IgaW52YWxpZFxuICAgKiBAY29uc3RhbnRcbiAgICogQGRlZmF1bHRcbiAgICovXG4gIElOVkFMSURfSU5URVJGQUNFOiAnRVJSX01PQ0hBX0lOVkFMSURfSU5URVJGQUNFJyxcblxuICAvKipcbiAgICogQSByZXBvcnRlciAoLmUuZywgYE1vY2hhLnJlcG9ydGVyc2ApIGlzIHVua25vd24gb3IgaW52YWxpZFxuICAgKiBAY29uc3RhbnRcbiAgICogQGRlZmF1bHRcbiAgICovXG4gIElOVkFMSURfUkVQT1JURVI6ICdFUlJfTU9DSEFfSU5WQUxJRF9SRVBPUlRFUicsXG5cbiAgLyoqXG4gICAqIGBkb25lKClgIHdhcyBjYWxsZWQgdHdpY2UgaW4gYSBgVGVzdGAgb3IgYEhvb2tgIGNhbGxiYWNrXG4gICAqIEBjb25zdGFudFxuICAgKiBAZGVmYXVsdFxuICAgKi9cbiAgTVVMVElQTEVfRE9ORTogJ0VSUl9NT0NIQV9NVUxUSVBMRV9ET05FJyxcblxuICAvKipcbiAgICogTm8gZmlsZXMgbWF0Y2hlZCB0aGUgcGF0dGVybiBwcm92aWRlZCBieSB0aGUgdXNlclxuICAgKiBAY29uc3RhbnRcbiAgICogQGRlZmF1bHRcbiAgICovXG4gIE5PX0ZJTEVTX01BVENIX1BBVFRFUk46ICdFUlJfTU9DSEFfTk9fRklMRVNfTUFUQ0hfUEFUVEVSTicsXG5cbiAgLyoqXG4gICAqIEtub3duLCBidXQgdW5zdXBwb3J0ZWQgYmVoYXZpb3Igb2Ygc29tZSBraW5kXG4gICAqIEBjb25zdGFudFxuICAgKiBAZGVmYXVsdFxuICAgKi9cbiAgVU5TVVBQT1JURUQ6ICdFUlJfTU9DSEFfVU5TVVBQT1JURUQnLFxuXG4gIC8qKlxuICAgKiBJbnZhbGlkIHN0YXRlIHRyYW5zaXRpb24gb2NjdXJyaW5nIGluIGBNb2NoYWAgaW5zdGFuY2VcbiAgICogQGNvbnN0YW50XG4gICAqIEBkZWZhdWx0XG4gICAqL1xuICBJTlNUQU5DRV9BTFJFQURZX1JVTk5JTkc6ICdFUlJfTU9DSEFfSU5TVEFOQ0VfQUxSRUFEWV9SVU5OSU5HJyxcblxuICAvKipcbiAgICogSW52YWxpZCBzdGF0ZSB0cmFuc2l0aW9uIG9jY3VycmluZyBpbiBgTW9jaGFgIGluc3RhbmNlXG4gICAqIEBjb25zdGFudFxuICAgKiBAZGVmYXVsdFxuICAgKi9cbiAgSU5TVEFOQ0VfQUxSRUFEWV9ESVNQT1NFRDogJ0VSUl9NT0NIQV9JTlNUQU5DRV9BTFJFQURZX0RJU1BPU0VEJyxcblxuICAvKipcbiAgICogVXNlIG9mIGBvbmx5KClgIHcvIGAtLWZvcmJpZC1vbmx5YCByZXN1bHRzIGluIHRoaXMgZXJyb3IuXG4gICAqIEBjb25zdGFudFxuICAgKiBAZGVmYXVsdFxuICAgKi9cbiAgRk9SQklEREVOX0VYQ0xVU0lWSVRZOiAnRVJSX01PQ0hBX0ZPUkJJRERFTl9FWENMVVNJVklUWScsXG5cbiAgLyoqXG4gICAqIFRvIGJlIHRocm93biB3aGVuIGEgdXNlci1kZWZpbmVkIHBsdWdpbiBpbXBsZW1lbnRhdGlvbiAoZS5nLiwgYG1vY2hhSG9va3NgKSBpcyBpbnZhbGlkXG4gICAqIEBjb25zdGFudFxuICAgKiBAZGVmYXVsdFxuICAgKi9cbiAgSU5WQUxJRF9QTFVHSU5fSU1QTEVNRU5UQVRJT046ICdFUlJfTU9DSEFfSU5WQUxJRF9QTFVHSU5fSU1QTEVNRU5UQVRJT04nLFxuXG4gIC8qKlxuICAgKiBUbyBiZSB0aHJvd24gd2hlbiBhIGJ1aWx0aW4gb3IgdGhpcmQtcGFydHkgcGx1Z2luIGRlZmluaXRpb24gKHRoZSBfZGVmaW5pdGlvbl8gb2YgYG1vY2hhSG9va3NgKSBpcyBpbnZhbGlkXG4gICAqIEBjb25zdGFudFxuICAgKiBAZGVmYXVsdFxuICAgKi9cbiAgSU5WQUxJRF9QTFVHSU5fREVGSU5JVElPTjogJ0VSUl9NT0NIQV9JTlZBTElEX1BMVUdJTl9ERUZJTklUSU9OJyxcblxuICAvKipcbiAgICogV2hlbiBhIHJ1bm5hYmxlIGV4Y2VlZHMgaXRzIGFsbG93ZWQgcnVuIHRpbWUuXG4gICAqIEBjb25zdGFudFxuICAgKiBAZGVmYXVsdFxuICAgKi9cbiAgVElNRU9VVDogJ0VSUl9NT0NIQV9USU1FT1VUJyxcblxuICAvKipcbiAgICogSW5wdXQgZmlsZSBpcyBub3QgYWJsZSB0byBiZSBwYXJzZWRcbiAgICogQGNvbnN0YW50XG4gICAqIEBkZWZhdWx0XG4gICAqL1xuICBVTlBBUlNBQkxFX0ZJTEU6ICdFUlJfTU9DSEFfVU5QQVJTQUJMRV9GSUxFJ1xufTtcblxuLyoqXG4gKiBBIHNldCBjb250YWluaW5nIGFsbCBzdHJpbmcgdmFsdWVzIG9mIGFsbCBNb2NoYSBlcnJvciBjb25zdGFudHMsIGZvciB1c2UgYnkge0BsaW5rIGlzTW9jaGFFcnJvcn0uXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBNT0NIQV9FUlJPUlMgPSBuZXcgU2V0KE9iamVjdC52YWx1ZXMoY29uc3RhbnRzKSk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBlcnJvciBvYmplY3QgdG8gYmUgdGhyb3duIHdoZW4gbm8gZmlsZXMgdG8gYmUgdGVzdGVkIGNvdWxkIGJlIGZvdW5kIHVzaW5nIHNwZWNpZmllZCBwYXR0ZXJuLlxuICpcbiAqIEBwdWJsaWNcbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gRXJyb3IgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0dGVybiAtIFVzZXItc3BlY2lmaWVkIGFyZ3VtZW50IHZhbHVlLlxuICogQHJldHVybnMge0Vycm9yfSBpbnN0YW5jZSBkZXRhaWxpbmcgdGhlIGVycm9yIGNvbmRpdGlvblxuICovXG5mdW5jdGlvbiBjcmVhdGVOb0ZpbGVzTWF0Y2hQYXR0ZXJuRXJyb3IobWVzc2FnZSwgcGF0dGVybikge1xuICB2YXIgZXJyID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICBlcnIuY29kZSA9IGNvbnN0YW50cy5OT19GSUxFU19NQVRDSF9QQVRURVJOO1xuICBlcnIucGF0dGVybiA9IHBhdHRlcm47XG4gIHJldHVybiBlcnI7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBlcnJvciBvYmplY3QgdG8gYmUgdGhyb3duIHdoZW4gdGhlIHJlcG9ydGVyIHNwZWNpZmllZCBpbiB0aGUgb3B0aW9ucyB3YXMgbm90IGZvdW5kLlxuICpcbiAqIEBwdWJsaWNcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gRXJyb3IgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVwb3J0ZXIgLSBVc2VyLXNwZWNpZmllZCByZXBvcnRlciB2YWx1ZS5cbiAqIEByZXR1cm5zIHtFcnJvcn0gaW5zdGFuY2UgZGV0YWlsaW5nIHRoZSBlcnJvciBjb25kaXRpb25cbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW52YWxpZFJlcG9ydGVyRXJyb3IobWVzc2FnZSwgcmVwb3J0ZXIpIHtcbiAgdmFyIGVyciA9IG5ldyBUeXBlRXJyb3IobWVzc2FnZSk7XG4gIGVyci5jb2RlID0gY29uc3RhbnRzLklOVkFMSURfUkVQT1JURVI7XG4gIGVyci5yZXBvcnRlciA9IHJlcG9ydGVyO1xuICByZXR1cm4gZXJyO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gZXJyb3Igb2JqZWN0IHRvIGJlIHRocm93biB3aGVuIHRoZSBpbnRlcmZhY2Ugc3BlY2lmaWVkIGluIHRoZSBvcHRpb25zIHdhcyBub3QgZm91bmQuXG4gKlxuICogQHB1YmxpY1xuICogQHN0YXRpY1xuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBFcnJvciBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB1aSAtIFVzZXItc3BlY2lmaWVkIGludGVyZmFjZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHtFcnJvcn0gaW5zdGFuY2UgZGV0YWlsaW5nIHRoZSBlcnJvciBjb25kaXRpb25cbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW52YWxpZEludGVyZmFjZUVycm9yKG1lc3NhZ2UsIHVpKSB7XG4gIHZhciBlcnIgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIGVyci5jb2RlID0gY29uc3RhbnRzLklOVkFMSURfSU5URVJGQUNFO1xuICBlcnIuaW50ZXJmYWNlID0gdWk7XG4gIHJldHVybiBlcnI7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBlcnJvciBvYmplY3QgdG8gYmUgdGhyb3duIHdoZW4gYSBiZWhhdmlvciwgb3B0aW9uLCBvciBwYXJhbWV0ZXIgaXMgdW5zdXBwb3J0ZWQuXG4gKlxuICogQHB1YmxpY1xuICogQHN0YXRpY1xuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBFcnJvciBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZC5cbiAqIEByZXR1cm5zIHtFcnJvcn0gaW5zdGFuY2UgZGV0YWlsaW5nIHRoZSBlcnJvciBjb25kaXRpb25cbiAqL1xuZnVuY3Rpb24gY3JlYXRlVW5zdXBwb3J0ZWRFcnJvcihtZXNzYWdlKSB7XG4gIHZhciBlcnIgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIGVyci5jb2RlID0gY29uc3RhbnRzLlVOU1VQUE9SVEVEO1xuICByZXR1cm4gZXJyO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gZXJyb3Igb2JqZWN0IHRvIGJlIHRocm93biB3aGVuIGFuIGFyZ3VtZW50IGlzIG1pc3NpbmcuXG4gKlxuICogQHB1YmxpY1xuICogQHN0YXRpY1xuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBFcnJvciBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmd1bWVudCAtIEFyZ3VtZW50IG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWQgLSBFeHBlY3RlZCBhcmd1bWVudCBkYXRhdHlwZS5cbiAqIEByZXR1cm5zIHtFcnJvcn0gaW5zdGFuY2UgZGV0YWlsaW5nIHRoZSBlcnJvciBjb25kaXRpb25cbiAqL1xuZnVuY3Rpb24gY3JlYXRlTWlzc2luZ0FyZ3VtZW50RXJyb3IobWVzc2FnZSwgYXJndW1lbnQsIGV4cGVjdGVkKSB7XG4gIHJldHVybiBjcmVhdGVJbnZhbGlkQXJndW1lbnRUeXBlRXJyb3IobWVzc2FnZSwgYXJndW1lbnQsIGV4cGVjdGVkKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGVycm9yIG9iamVjdCB0byBiZSB0aHJvd24gd2hlbiBhbiBhcmd1bWVudCBkaWQgbm90IHVzZSB0aGUgc3VwcG9ydGVkIHR5cGVcbiAqXG4gKiBAcHVibGljXG4gKiBAc3RhdGljXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIEVycm9yIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3VtZW50IC0gQXJndW1lbnQgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZCAtIEV4cGVjdGVkIGFyZ3VtZW50IGRhdGF0eXBlLlxuICogQHJldHVybnMge0Vycm9yfSBpbnN0YW5jZSBkZXRhaWxpbmcgdGhlIGVycm9yIGNvbmRpdGlvblxuICovXG5mdW5jdGlvbiBjcmVhdGVJbnZhbGlkQXJndW1lbnRUeXBlRXJyb3IobWVzc2FnZSwgYXJndW1lbnQsIGV4cGVjdGVkKSB7XG4gIHZhciBlcnIgPSBuZXcgVHlwZUVycm9yKG1lc3NhZ2UpO1xuICBlcnIuY29kZSA9IGNvbnN0YW50cy5JTlZBTElEX0FSR19UWVBFO1xuICBlcnIuYXJndW1lbnQgPSBhcmd1bWVudDtcbiAgZXJyLmV4cGVjdGVkID0gZXhwZWN0ZWQ7XG4gIGVyci5hY3R1YWwgPSB0eXBlb2YgYXJndW1lbnQ7XG4gIHJldHVybiBlcnI7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBlcnJvciBvYmplY3QgdG8gYmUgdGhyb3duIHdoZW4gYW4gYXJndW1lbnQgZGlkIG5vdCB1c2UgdGhlIHN1cHBvcnRlZCB2YWx1ZVxuICpcbiAqIEBwdWJsaWNcbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gRXJyb3IgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJndW1lbnQgLSBBcmd1bWVudCBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gQXJndW1lbnQgdmFsdWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3JlYXNvbl0gLSBXaHkgdmFsdWUgaXMgaW52YWxpZC5cbiAqIEByZXR1cm5zIHtFcnJvcn0gaW5zdGFuY2UgZGV0YWlsaW5nIHRoZSBlcnJvciBjb25kaXRpb25cbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW52YWxpZEFyZ3VtZW50VmFsdWVFcnJvcihtZXNzYWdlLCBhcmd1bWVudCwgdmFsdWUsIHJlYXNvbikge1xuICB2YXIgZXJyID0gbmV3IFR5cGVFcnJvcihtZXNzYWdlKTtcbiAgZXJyLmNvZGUgPSBjb25zdGFudHMuSU5WQUxJRF9BUkdfVkFMVUU7XG4gIGVyci5hcmd1bWVudCA9IGFyZ3VtZW50O1xuICBlcnIudmFsdWUgPSB2YWx1ZTtcbiAgZXJyLnJlYXNvbiA9IHR5cGVvZiByZWFzb24gIT09ICd1bmRlZmluZWQnID8gcmVhc29uIDogJ2lzIGludmFsaWQnO1xuICByZXR1cm4gZXJyO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gZXJyb3Igb2JqZWN0IHRvIGJlIHRocm93biB3aGVuIGFuIGV4Y2VwdGlvbiB3YXMgY2F1Z2h0LCBidXQgdGhlIGBFcnJvcmAgaXMgZmFsc3kgb3IgdW5kZWZpbmVkLlxuICpcbiAqIEBwdWJsaWNcbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gRXJyb3IgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQuXG4gKiBAcmV0dXJucyB7RXJyb3J9IGluc3RhbmNlIGRldGFpbGluZyB0aGUgZXJyb3IgY29uZGl0aW9uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUludmFsaWRFeGNlcHRpb25FcnJvcihtZXNzYWdlLCB2YWx1ZSkge1xuICB2YXIgZXJyID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICBlcnIuY29kZSA9IGNvbnN0YW50cy5JTlZBTElEX0VYQ0VQVElPTjtcbiAgZXJyLnZhbHVlVHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgZXJyLnZhbHVlID0gdmFsdWU7XG4gIHJldHVybiBlcnI7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBlcnJvciBvYmplY3QgdG8gYmUgdGhyb3duIHdoZW4gYW4gdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cnMuXG4gKlxuICogQHB1YmxpY1xuICogQHN0YXRpY1xuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBFcnJvciBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZC5cbiAqIEByZXR1cm5zIHtFcnJvcn0gaW5zdGFuY2UgZGV0YWlsaW5nIHRoZSBlcnJvciBjb25kaXRpb25cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRmF0YWxFcnJvcihtZXNzYWdlLCB2YWx1ZSkge1xuICB2YXIgZXJyID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICBlcnIuY29kZSA9IGNvbnN0YW50cy5GQVRBTDtcbiAgZXJyLnZhbHVlVHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgZXJyLnZhbHVlID0gdmFsdWU7XG4gIHJldHVybiBlcnI7XG59XG5cbi8qKlxuICogRHluYW1pY2FsbHkgY3JlYXRlcyBhIHBsdWdpbi10eXBlLXNwZWNpZmljIGVycm9yIGJhc2VkIG9uIHBsdWdpbiB0eXBlXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIEVycm9yIG1lc3NhZ2VcbiAqIEBwYXJhbSB7XCJyZXBvcnRlclwifFwidWlcIn0gcGx1Z2luVHlwZSAtIFBsdWdpbiB0eXBlLiBGdXR1cmU6IGV4cGFuZCBhcyBuZWVkZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcGx1Z2luSWRdIC0gTmFtZS9wYXRoIG9mIHBsdWdpbiwgaWYgYW55XG4gKiBAdGhyb3dzIFdoZW4gYHBsdWdpblR5cGVgIGlzIG5vdCBrbm93blxuICogQHB1YmxpY1xuICogQHN0YXRpY1xuICogQHJldHVybnMge0Vycm9yfVxuICovXG5mdW5jdGlvbiBjcmVhdGVJbnZhbGlkTGVnYWN5UGx1Z2luRXJyb3IobWVzc2FnZSwgcGx1Z2luVHlwZSwgcGx1Z2luSWQpIHtcbiAgc3dpdGNoIChwbHVnaW5UeXBlKSB7XG4gICAgY2FzZSAncmVwb3J0ZXInOlxuICAgICAgcmV0dXJuIGNyZWF0ZUludmFsaWRSZXBvcnRlckVycm9yKG1lc3NhZ2UsIHBsdWdpbklkKTtcbiAgICBjYXNlICd1aSc6XG4gICAgICByZXR1cm4gY3JlYXRlSW52YWxpZEludGVyZmFjZUVycm9yKG1lc3NhZ2UsIHBsdWdpbklkKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIHBsdWdpblR5cGUgXCInICsgcGx1Z2luVHlwZSArICdcIicpO1xuICB9XG59XG5cbi8qKlxuICogKipERVBSRUNBVEVEKiouICBVc2Uge0BsaW5rIGNyZWF0ZUludmFsaWRMZWdhY3lQbHVnaW5FcnJvcn0gaW5zdGVhZCAgRHluYW1pY2FsbHkgY3JlYXRlcyBhIHBsdWdpbi10eXBlLXNwZWNpZmljIGVycm9yIGJhc2VkIG9uIHBsdWdpbiB0eXBlXG4gKiBAZGVwcmVjYXRlZFxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBFcnJvciBtZXNzYWdlXG4gKiBAcGFyYW0ge1wicmVwb3J0ZXJcInxcImludGVyZmFjZVwifSBwbHVnaW5UeXBlIC0gUGx1Z2luIHR5cGUuIEZ1dHVyZTogZXhwYW5kIGFzIG5lZWRlZFxuICogQHBhcmFtIHtzdHJpbmd9IFtwbHVnaW5JZF0gLSBOYW1lL3BhdGggb2YgcGx1Z2luLCBpZiBhbnlcbiAqIEB0aHJvd3MgV2hlbiBgcGx1Z2luVHlwZWAgaXMgbm90IGtub3duXG4gKiBAcHVibGljXG4gKiBAc3RhdGljXG4gKiBAcmV0dXJucyB7RXJyb3J9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUludmFsaWRQbHVnaW5FcnJvciguLi5hcmdzKSB7XG4gIGRlcHJlY2F0ZSgnVXNlIGNyZWF0ZUludmFsaWRMZWdhY3lQbHVnaW5FcnJvcigpIGluc3RlYWQnKTtcbiAgcmV0dXJuIGNyZWF0ZUludmFsaWRMZWdhY3lQbHVnaW5FcnJvciguLi5hcmdzKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGVycm9yIG9iamVjdCB0byBiZSB0aHJvd24gd2hlbiBhIG1vY2hhIG9iamVjdCdzIGBydW5gIG1ldGhvZCBpcyBleGVjdXRlZCB3aGlsZSBpdCBpcyBhbHJlYWR5IGRpc3Bvc2VkLlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgVGhlIGVycm9yIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkLlxuICogQHBhcmFtIHtib29sZWFufSBjbGVhblJlZmVyZW5jZXNBZnRlclJ1biB0aGUgdmFsdWUgb2YgYGNsZWFuUmVmZXJlbmNlc0FmdGVyUnVuYFxuICogQHBhcmFtIHtNb2NoYX0gaW5zdGFuY2UgdGhlIG1vY2hhIGluc3RhbmNlIHRoYXQgdGhyb3cgdGhpcyBlcnJvclxuICogQHN0YXRpY1xuICovXG5mdW5jdGlvbiBjcmVhdGVNb2NoYUluc3RhbmNlQWxyZWFkeURpc3Bvc2VkRXJyb3IoXG4gIG1lc3NhZ2UsXG4gIGNsZWFuUmVmZXJlbmNlc0FmdGVyUnVuLFxuICBpbnN0YW5jZVxuKSB7XG4gIHZhciBlcnIgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIGVyci5jb2RlID0gY29uc3RhbnRzLklOU1RBTkNFX0FMUkVBRFlfRElTUE9TRUQ7XG4gIGVyci5jbGVhblJlZmVyZW5jZXNBZnRlclJ1biA9IGNsZWFuUmVmZXJlbmNlc0FmdGVyUnVuO1xuICBlcnIuaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgcmV0dXJuIGVycjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGVycm9yIG9iamVjdCB0byBiZSB0aHJvd24gd2hlbiBhIG1vY2hhIG9iamVjdCdzIGBydW5gIG1ldGhvZCBpcyBjYWxsZWQgd2hpbGUgYSB0ZXN0IHJ1biBpcyBpbiBwcm9ncmVzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIFRoZSBlcnJvciBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZC5cbiAqIEBzdGF0aWNcbiAqIEBwdWJsaWNcbiAqL1xuZnVuY3Rpb24gY3JlYXRlTW9jaGFJbnN0YW5jZUFscmVhZHlSdW5uaW5nRXJyb3IobWVzc2FnZSwgaW5zdGFuY2UpIHtcbiAgdmFyIGVyciA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgZXJyLmNvZGUgPSBjb25zdGFudHMuSU5TVEFOQ0VfQUxSRUFEWV9SVU5OSU5HO1xuICBlcnIuaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgcmV0dXJuIGVycjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGVycm9yIG9iamVjdCB0byBiZSB0aHJvd24gd2hlbiBkb25lKCkgaXMgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGluIGEgdGVzdFxuICpcbiAqIEBwdWJsaWNcbiAqIEBwYXJhbSB7UnVubmFibGV9IHJ1bm5hYmxlIC0gT3JpZ2luYWwgcnVubmFibGVcbiAqIEBwYXJhbSB7RXJyb3J9IFtvcmlnaW5hbEVycl0gLSBPcmlnaW5hbCBlcnJvciwgaWYgYW55XG4gKiBAcmV0dXJucyB7RXJyb3J9IGluc3RhbmNlIGRldGFpbGluZyB0aGUgZXJyb3IgY29uZGl0aW9uXG4gKiBAc3RhdGljXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU11bHRpcGxlRG9uZUVycm9yKHJ1bm5hYmxlLCBvcmlnaW5hbEVycikge1xuICB2YXIgdGl0bGU7XG4gIHRyeSB7XG4gICAgdGl0bGUgPSBmb3JtYXQoJzwlcz4nLCBydW5uYWJsZS5mdWxsVGl0bGUoKSk7XG4gICAgaWYgKHJ1bm5hYmxlLnBhcmVudC5yb290KSB7XG4gICAgICB0aXRsZSArPSAnIChvZiByb290IHN1aXRlKSc7XG4gICAgfVxuICB9IGNhdGNoIChpZ25vcmVkKSB7XG4gICAgdGl0bGUgPSBmb3JtYXQoJzwlcz4gKG9mIHVua25vd24gc3VpdGUpJywgcnVubmFibGUudGl0bGUpO1xuICB9XG4gIHZhciBtZXNzYWdlID0gZm9ybWF0KFxuICAgICdkb25lKCkgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGluICVzICVzJyxcbiAgICBydW5uYWJsZS50eXBlID8gcnVubmFibGUudHlwZSA6ICd1bmtub3duIHJ1bm5hYmxlJyxcbiAgICB0aXRsZVxuICApO1xuICBpZiAocnVubmFibGUuZmlsZSkge1xuICAgIG1lc3NhZ2UgKz0gZm9ybWF0KCcgb2YgZmlsZSAlcycsIHJ1bm5hYmxlLmZpbGUpO1xuICB9XG4gIGlmIChvcmlnaW5hbEVycikge1xuICAgIG1lc3NhZ2UgKz0gZm9ybWF0KCc7IGluIGFkZGl0aW9uLCBkb25lKCkgcmVjZWl2ZWQgZXJyb3I6ICVzJywgb3JpZ2luYWxFcnIpO1xuICB9XG5cbiAgdmFyIGVyciA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgZXJyLmNvZGUgPSBjb25zdGFudHMuTVVMVElQTEVfRE9ORTtcbiAgZXJyLnZhbHVlVHlwZSA9IHR5cGVvZiBvcmlnaW5hbEVycjtcbiAgZXJyLnZhbHVlID0gb3JpZ2luYWxFcnI7XG4gIHJldHVybiBlcnI7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBlcnJvciBvYmplY3QgdG8gYmUgdGhyb3duIHdoZW4gYC5vbmx5KClgIGlzIHVzZWQgd2l0aFxuICogYC0tZm9yYmlkLW9ubHlgLlxuICogQHN0YXRpY1xuICogQHB1YmxpY1xuICogQHBhcmFtIHtNb2NoYX0gbW9jaGEgLSBNb2NoYSBpbnN0YW5jZVxuICogQHJldHVybnMge0Vycm9yfSBFcnJvciB3aXRoIGNvZGUge0BsaW5rIGNvbnN0YW50cy5GT1JCSURERU5fRVhDTFVTSVZJVFl9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUZvcmJpZGRlbkV4Y2x1c2l2aXR5RXJyb3IobW9jaGEpIHtcbiAgdmFyIGVyciA9IG5ldyBFcnJvcihcbiAgICBtb2NoYS5pc1dvcmtlclxuICAgICAgPyAnYC5vbmx5YCBpcyBub3Qgc3VwcG9ydGVkIGluIHBhcmFsbGVsIG1vZGUnXG4gICAgICA6ICdgLm9ubHlgIGZvcmJpZGRlbiBieSAtLWZvcmJpZC1vbmx5J1xuICApO1xuICBlcnIuY29kZSA9IGNvbnN0YW50cy5GT1JCSURERU5fRVhDTFVTSVZJVFk7XG4gIHJldHVybiBlcnI7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBlcnJvciBvYmplY3QgdG8gYmUgdGhyb3duIHdoZW4gYSBwbHVnaW4gZGVmaW5pdGlvbiBpcyBpbnZhbGlkXG4gKiBAc3RhdGljXG4gKiBAcGFyYW0ge3N0cmluZ30gbXNnIC0gRXJyb3IgbWVzc2FnZVxuICogQHBhcmFtIHtQbHVnaW5EZWZpbml0aW9ufSBbcGx1Z2luRGVmXSAtIFByb2JsZW1hdGljIHBsdWdpbiBkZWZpbml0aW9uXG4gKiBAcHVibGljXG4gKiBAcmV0dXJucyB7RXJyb3J9IEVycm9yIHdpdGggY29kZSB7QGxpbmsgY29uc3RhbnRzLklOVkFMSURfUExVR0lOX0RFRklOSVRJT059XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUludmFsaWRQbHVnaW5EZWZpbml0aW9uRXJyb3IobXNnLCBwbHVnaW5EZWYpIHtcbiAgY29uc3QgZXJyID0gbmV3IEVycm9yKG1zZyk7XG4gIGVyci5jb2RlID0gY29uc3RhbnRzLklOVkFMSURfUExVR0lOX0RFRklOSVRJT047XG4gIGVyci5wbHVnaW5EZWYgPSBwbHVnaW5EZWY7XG4gIHJldHVybiBlcnI7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBlcnJvciBvYmplY3QgdG8gYmUgdGhyb3duIHdoZW4gYSBwbHVnaW4gaW1wbGVtZW50YXRpb24gKHVzZXIgY29kZSkgaXMgaW52YWxpZFxuICogQHN0YXRpY1xuICogQHBhcmFtIHtzdHJpbmd9IG1zZyAtIEVycm9yIG1lc3NhZ2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0c10gLSBQbHVnaW4gZGVmaW5pdGlvbiBhbmQgdXNlci1zdXBwbGllZCBpbXBsZW1lbnRhdGlvblxuICogQHBhcmFtIHtQbHVnaW5EZWZpbml0aW9ufSBbb3B0cy5wbHVnaW5EZWZdIC0gUGx1Z2luIERlZmluaXRpb25cbiAqIEBwYXJhbSB7Kn0gW29wdHMucGx1Z2luSW1wbF0gLSBQbHVnaW4gSW1wbGVtZW50YXRpb24gKHVzZXItc3VwcGxpZWQpXG4gKiBAcHVibGljXG4gKiBAcmV0dXJucyB7RXJyb3J9IEVycm9yIHdpdGggY29kZSB7QGxpbmsgY29uc3RhbnRzLklOVkFMSURfUExVR0lOX0RFRklOSVRJT059XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUludmFsaWRQbHVnaW5JbXBsZW1lbnRhdGlvbkVycm9yKFxuICBtc2csXG4gIHtwbHVnaW5EZWYsIHBsdWdpbkltcGx9ID0ge31cbikge1xuICBjb25zdCBlcnIgPSBuZXcgRXJyb3IobXNnKTtcbiAgZXJyLmNvZGUgPSBjb25zdGFudHMuSU5WQUxJRF9QTFVHSU5fSU1QTEVNRU5UQVRJT047XG4gIGVyci5wbHVnaW5EZWYgPSBwbHVnaW5EZWY7XG4gIGVyci5wbHVnaW5JbXBsID0gcGx1Z2luSW1wbDtcbiAgcmV0dXJuIGVycjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGVycm9yIG9iamVjdCB0byBiZSB0aHJvd24gd2hlbiBhIHJ1bm5hYmxlIGV4Y2VlZHMgaXRzIGFsbG93ZWQgcnVuIHRpbWUuXG4gKiBAc3RhdGljXG4gKiBAcGFyYW0ge3N0cmluZ30gbXNnIC0gRXJyb3IgbWVzc2FnZVxuICogQHBhcmFtIHtudW1iZXJ9IFt0aW1lb3V0XSAtIFRpbWVvdXQgaW4gbXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBbZmlsZV0gLSBGaWxlLCBpZiBnaXZlblxuICogQHJldHVybnMge01vY2hhVGltZW91dEVycm9yfVxuICovXG5mdW5jdGlvbiBjcmVhdGVUaW1lb3V0RXJyb3IobXNnLCB0aW1lb3V0LCBmaWxlKSB7XG4gIGNvbnN0IGVyciA9IG5ldyBFcnJvcihtc2cpO1xuICBlcnIuY29kZSA9IGNvbnN0YW50cy5USU1FT1VUO1xuICBlcnIudGltZW91dCA9IHRpbWVvdXQ7XG4gIGVyci5maWxlID0gZmlsZTtcbiAgcmV0dXJuIGVycjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGVycm9yIG9iamVjdCB0byBiZSB0aHJvd24gd2hlbiBmaWxlIGlzIHVucGFyc2FibGVcbiAqIEBwdWJsaWNcbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gRXJyb3IgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBGaWxlIG5hbWVcbiAqIEByZXR1cm5zIHtFcnJvcn0gRXJyb3Igd2l0aCBjb2RlIHtAbGluayBjb25zdGFudHMuVU5QQVJTQUJMRV9GSUxFfVxuICovXG5mdW5jdGlvbiBjcmVhdGVVbnBhcnNhYmxlRmlsZUVycm9yKG1lc3NhZ2UsIGZpbGVuYW1lKSB7XG4gIHZhciBlcnIgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIGVyci5jb2RlID0gY29uc3RhbnRzLlVOUEFSU0FCTEVfRklMRTtcbiAgcmV0dXJuIGVycjtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlcnJvciBjYW1lIG91dCBvZiBNb2NoYS5cbiAqIF9DYW4gc3VmZmVyIGZyb20gZmFsc2UgbmVnYXRpdmVzLCBidXQgbm90IGZhbHNlIHBvc2l0aXZlcy5fXG4gKiBAc3RhdGljXG4gKiBAcHVibGljXG4gKiBAcGFyYW0geyp9IGVyciAtIEVycm9yLCBvciBhbnl0aGluZ1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGlzTW9jaGFFcnJvciA9IGVyciA9PlxuICBCb29sZWFuKGVyciAmJiB0eXBlb2YgZXJyID09PSAnb2JqZWN0JyAmJiBNT0NIQV9FUlJPUlMuaGFzKGVyci5jb2RlKSk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBjb25zdGFudHMsXG4gIGNyZWF0ZUZhdGFsRXJyb3IsXG4gIGNyZWF0ZUZvcmJpZGRlbkV4Y2x1c2l2aXR5RXJyb3IsXG4gIGNyZWF0ZUludmFsaWRBcmd1bWVudFR5cGVFcnJvcixcbiAgY3JlYXRlSW52YWxpZEFyZ3VtZW50VmFsdWVFcnJvcixcbiAgY3JlYXRlSW52YWxpZEV4Y2VwdGlvbkVycm9yLFxuICBjcmVhdGVJbnZhbGlkSW50ZXJmYWNlRXJyb3IsXG4gIGNyZWF0ZUludmFsaWRMZWdhY3lQbHVnaW5FcnJvcixcbiAgY3JlYXRlSW52YWxpZFBsdWdpbkRlZmluaXRpb25FcnJvcixcbiAgY3JlYXRlSW52YWxpZFBsdWdpbkVycm9yLFxuICBjcmVhdGVJbnZhbGlkUGx1Z2luSW1wbGVtZW50YXRpb25FcnJvcixcbiAgY3JlYXRlSW52YWxpZFJlcG9ydGVyRXJyb3IsXG4gIGNyZWF0ZU1pc3NpbmdBcmd1bWVudEVycm9yLFxuICBjcmVhdGVNb2NoYUluc3RhbmNlQWxyZWFkeURpc3Bvc2VkRXJyb3IsXG4gIGNyZWF0ZU1vY2hhSW5zdGFuY2VBbHJlYWR5UnVubmluZ0Vycm9yLFxuICBjcmVhdGVNdWx0aXBsZURvbmVFcnJvcixcbiAgY3JlYXRlTm9GaWxlc01hdGNoUGF0dGVybkVycm9yLFxuICBjcmVhdGVUaW1lb3V0RXJyb3IsXG4gIGNyZWF0ZVVucGFyc2FibGVGaWxlRXJyb3IsXG4gIGNyZWF0ZVVuc3VwcG9ydGVkRXJyb3IsXG4gIGRlcHJlY2F0ZSxcbiAgaXNNb2NoYUVycm9yLFxuICB3YXJuXG59O1xuXG4vKipcbiAqIFRoZSBlcnJvciB0aHJvd24gd2hlbiBhIFJ1bm5hYmxlIHRpbWVzIG91dFxuICogQG1lbWJlcm9mIG1vZHVsZTpsaWIvZXJyb3JzXG4gKiBAdHlwZWRlZiB7RXJyb3J9IE1vY2hhVGltZW91dEVycm9yXG4gKiBAcHJvcGVydHkge2NvbnN0YW50cy5USU1FT1VUfSBjb2RlIC0gRXJyb3IgY29kZVxuICogQHByb3BlcnR5IHtudW1iZXI/fSB0aW1lb3V0IFRpbWVvdXQgaW4gbXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nP30gZmlsZSBGaWxlcGF0aCwgaWYgZ2l2ZW5cbiAqL1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlcjtcbnZhciBQZW5kaW5nID0gcmVxdWlyZSgnLi9wZW5kaW5nJyk7XG52YXIgZGVidWcgPSByZXF1aXJlKCdkZWJ1ZycpKCdtb2NoYTpydW5uYWJsZScpO1xudmFyIG1pbGxpc2Vjb25kcyA9IHJlcXVpcmUoJ21zJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5jb25zdCB7XG4gIGNyZWF0ZUludmFsaWRFeGNlcHRpb25FcnJvcixcbiAgY3JlYXRlTXVsdGlwbGVEb25lRXJyb3IsXG4gIGNyZWF0ZVRpbWVvdXRFcnJvclxufSA9IHJlcXVpcmUoJy4vZXJyb3JzJyk7XG5cbi8qKlxuICogU2F2ZSB0aW1lciByZWZlcmVuY2VzIHRvIGF2b2lkIFNpbm9uIGludGVyZmVyaW5nIChzZWUgR0gtMjM3KS5cbiAqIEBwcml2YXRlXG4gKi9cbnZhciBEYXRlID0gZ2xvYmFsLkRhdGU7XG52YXIgc2V0VGltZW91dCA9IGdsb2JhbC5zZXRUaW1lb3V0O1xudmFyIGNsZWFyVGltZW91dCA9IGdsb2JhbC5jbGVhclRpbWVvdXQ7XG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG52YXIgTUFYX1RJTUVPVVQgPSBNYXRoLnBvdygyLCAzMSkgLSAxO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJ1bm5hYmxlO1xuXG4vKipcbiAqIEluaXRpYWxpemUgYSBuZXcgYFJ1bm5hYmxlYCB3aXRoIHRoZSBnaXZlbiBgdGl0bGVgIGFuZCBjYWxsYmFjayBgZm5gLlxuICpcbiAqIEBjbGFzc1xuICogQGV4dGVuZHMgZXh0ZXJuYWw6RXZlbnRFbWl0dGVyXG4gKiBAcHVibGljXG4gKiBAcGFyYW0ge1N0cmluZ30gdGl0bGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKi9cbmZ1bmN0aW9uIFJ1bm5hYmxlKHRpdGxlLCBmbikge1xuICB0aGlzLnRpdGxlID0gdGl0bGU7XG4gIHRoaXMuZm4gPSBmbjtcbiAgdGhpcy5ib2R5ID0gKGZuIHx8ICcnKS50b1N0cmluZygpO1xuICB0aGlzLmFzeW5jID0gZm4gJiYgZm4ubGVuZ3RoO1xuICB0aGlzLnN5bmMgPSAhdGhpcy5hc3luYztcbiAgdGhpcy5fdGltZW91dCA9IDIwMDA7XG4gIHRoaXMuX3Nsb3cgPSA3NTtcbiAgdGhpcy5fcmV0cmllcyA9IC0xO1xuICB1dGlscy5hc3NpZ25OZXdNb2NoYUlEKHRoaXMpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2lkJywge1xuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiB1dGlscy5nZXRNb2NoYUlEKHRoaXMpO1xuICAgIH1cbiAgfSk7XG4gIHRoaXMucmVzZXQoKTtcbn1cblxuLyoqXG4gKiBJbmhlcml0IGZyb20gYEV2ZW50RW1pdHRlci5wcm90b3R5cGVgLlxuICovXG51dGlscy5pbmhlcml0cyhSdW5uYWJsZSwgRXZlbnRFbWl0dGVyKTtcblxuLyoqXG4gKiBSZXNldHMgdGhlIHN0YXRlIGluaXRpYWxseSBvciBmb3IgYSBuZXh0IHJ1bi5cbiAqL1xuUnVubmFibGUucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLnRpbWVkT3V0ID0gZmFsc2U7XG4gIHRoaXMuX2N1cnJlbnRSZXRyeSA9IDA7XG4gIHRoaXMucGVuZGluZyA9IGZhbHNlO1xuICBkZWxldGUgdGhpcy5zdGF0ZTtcbiAgZGVsZXRlIHRoaXMuZXJyO1xufTtcblxuLyoqXG4gKiBHZXQgY3VycmVudCB0aW1lb3V0IHZhbHVlIGluIG1zZWNzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBjdXJyZW50IHRpbWVvdXQgdGhyZXNob2xkIHZhbHVlXG4gKi9cbi8qKlxuICogQHN1bW1hcnlcbiAqIFNldCB0aW1lb3V0IHRocmVzaG9sZCB2YWx1ZSAobXNlY3MpLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQSBzdHJpbmcgYXJndW1lbnQgY2FuIHVzZSBzaG9ydGhhbmQgKGUuZy4sIFwiMnNcIikgYW5kIHdpbGwgYmUgY29udmVydGVkLlxuICogVGhlIHZhbHVlIHdpbGwgYmUgY2xhbXBlZCB0byByYW5nZSBbPGNvZGU+MDwvY29kZT4sIDxjb2RlPjJePHN1cD4zMTwvc3VwPi0xPC9jb2RlPl0uXG4gKiBJZiBjbGFtcGVkIHZhbHVlIG1hdGNoZXMgZWl0aGVyIHJhbmdlIGVuZHBvaW50LCB0aW1lb3V0cyB3aWxsIGJlIGRpc2FibGVkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAc2VlIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93T3JXb3JrZXJHbG9iYWxTY29wZS9zZXRUaW1lb3V0I01heGltdW1fZGVsYXlfdmFsdWV9XG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IG1zIC0gVGltZW91dCB0aHJlc2hvbGQgdmFsdWUuXG4gKiBAcmV0dXJucyB7UnVubmFibGV9IHRoaXNcbiAqIEBjaGFpbmFibGVcbiAqL1xuUnVubmFibGUucHJvdG90eXBlLnRpbWVvdXQgPSBmdW5jdGlvbiAobXMpIHtcbiAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RpbWVvdXQ7XG4gIH1cbiAgaWYgKHR5cGVvZiBtcyA9PT0gJ3N0cmluZycpIHtcbiAgICBtcyA9IG1pbGxpc2Vjb25kcyhtcyk7XG4gIH1cblxuICAvLyBDbGFtcCB0byByYW5nZVxuICB2YXIgcmFuZ2UgPSBbMCwgTUFYX1RJTUVPVVRdO1xuICBtcyA9IHV0aWxzLmNsYW1wKG1zLCByYW5nZSk7XG5cbiAgLy8gc2VlICMxNjUyIGZvciByZWFzb25pbmdcbiAgaWYgKG1zID09PSByYW5nZVswXSB8fCBtcyA9PT0gcmFuZ2VbMV0pIHtcbiAgICB0aGlzLl90aW1lb3V0ID0gMDtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl90aW1lb3V0ID0gbXM7XG4gIH1cbiAgZGVidWcoJ3RpbWVvdXQgJWQnLCB0aGlzLl90aW1lb3V0KTtcblxuICBpZiAodGhpcy50aW1lcikge1xuICAgIHRoaXMucmVzZXRUaW1lb3V0KCk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCBvciBnZXQgc2xvdyBgbXNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IG1zXG4gKiBAcmV0dXJuIHtSdW5uYWJsZXxudW1iZXJ9IG1zIG9yIFJ1bm5hYmxlIGluc3RhbmNlLlxuICovXG5SdW5uYWJsZS5wcm90b3R5cGUuc2xvdyA9IGZ1bmN0aW9uIChtcykge1xuICBpZiAoIWFyZ3VtZW50cy5sZW5ndGggfHwgdHlwZW9mIG1zID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiB0aGlzLl9zbG93O1xuICB9XG4gIGlmICh0eXBlb2YgbXMgPT09ICdzdHJpbmcnKSB7XG4gICAgbXMgPSBtaWxsaXNlY29uZHMobXMpO1xuICB9XG4gIGRlYnVnKCdzbG93ICVkJywgbXMpO1xuICB0aGlzLl9zbG93ID0gbXM7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBIYWx0IGFuZCBtYXJrIGFzIHBlbmRpbmcuXG4gKlxuICogQG1lbWJlcm9mIE1vY2hhLlJ1bm5hYmxlXG4gKiBAcHVibGljXG4gKi9cblJ1bm5hYmxlLnByb3RvdHlwZS5za2lwID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLnBlbmRpbmcgPSB0cnVlO1xuICB0aHJvdyBuZXcgUGVuZGluZygnc3luYyBza2lwOyBhYm9ydGluZyBleGVjdXRpb24nKTtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhpcyBydW5uYWJsZSBvciBpdHMgcGFyZW50IHN1aXRlIGlzIG1hcmtlZCBhcyBwZW5kaW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cblJ1bm5hYmxlLnByb3RvdHlwZS5pc1BlbmRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnBlbmRpbmcgfHwgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LmlzUGVuZGluZygpKTtcbn07XG5cbi8qKlxuICogUmV0dXJuIGB0cnVlYCBpZiB0aGlzIFJ1bm5hYmxlIGhhcyBmYWlsZWQuXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogQHByaXZhdGVcbiAqL1xuUnVubmFibGUucHJvdG90eXBlLmlzRmFpbGVkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gIXRoaXMuaXNQZW5kaW5nKCkgJiYgdGhpcy5zdGF0ZSA9PT0gY29uc3RhbnRzLlNUQVRFX0ZBSUxFRDtcbn07XG5cbi8qKlxuICogUmV0dXJuIGB0cnVlYCBpZiB0aGlzIFJ1bm5hYmxlIGhhcyBwYXNzZWQuXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogQHByaXZhdGVcbiAqL1xuUnVubmFibGUucHJvdG90eXBlLmlzUGFzc2VkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gIXRoaXMuaXNQZW5kaW5nKCkgJiYgdGhpcy5zdGF0ZSA9PT0gY29uc3RhbnRzLlNUQVRFX1BBU1NFRDtcbn07XG5cbi8qKlxuICogU2V0IG9yIGdldCBudW1iZXIgb2YgcmV0cmllcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5SdW5uYWJsZS5wcm90b3R5cGUucmV0cmllcyA9IGZ1bmN0aW9uIChuKSB7XG4gIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIHJldHVybiB0aGlzLl9yZXRyaWVzO1xuICB9XG4gIHRoaXMuX3JldHJpZXMgPSBuO1xufTtcblxuLyoqXG4gKiBTZXQgb3IgZ2V0IGN1cnJlbnQgcmV0cnlcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5SdW5uYWJsZS5wcm90b3R5cGUuY3VycmVudFJldHJ5ID0gZnVuY3Rpb24gKG4pIHtcbiAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRSZXRyeTtcbiAgfVxuICB0aGlzLl9jdXJyZW50UmV0cnkgPSBuO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIGZ1bGwgdGl0bGUgZ2VuZXJhdGVkIGJ5IHJlY3Vyc2l2ZWx5IGNvbmNhdGVuYXRpbmcgdGhlIHBhcmVudCdzXG4gKiBmdWxsIHRpdGxlLlxuICpcbiAqIEBtZW1iZXJvZiBNb2NoYS5SdW5uYWJsZVxuICogQHB1YmxpY1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5SdW5uYWJsZS5wcm90b3R5cGUuZnVsbFRpdGxlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy50aXRsZVBhdGgoKS5qb2luKCcgJyk7XG59O1xuXG4vKipcbiAqIFJldHVybiB0aGUgdGl0bGUgcGF0aCBnZW5lcmF0ZWQgYnkgY29uY2F0ZW5hdGluZyB0aGUgcGFyZW50J3MgdGl0bGUgcGF0aCB3aXRoIHRoZSB0aXRsZS5cbiAqXG4gKiBAbWVtYmVyb2YgTW9jaGEuUnVubmFibGVcbiAqIEBwdWJsaWNcbiAqIEByZXR1cm4ge3N0cmluZ1tdfVxuICovXG5SdW5uYWJsZS5wcm90b3R5cGUudGl0bGVQYXRoID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5wYXJlbnQudGl0bGVQYXRoKCkuY29uY2F0KFt0aGlzLnRpdGxlXSk7XG59O1xuXG4vKipcbiAqIENsZWFyIHRoZSB0aW1lb3V0LlxuICpcbiAqIEBwcml2YXRlXG4gKi9cblJ1bm5hYmxlLnByb3RvdHlwZS5jbGVhclRpbWVvdXQgPSBmdW5jdGlvbiAoKSB7XG4gIGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTtcbn07XG5cbi8qKlxuICogUmVzZXQgdGhlIHRpbWVvdXQuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuUnVubmFibGUucHJvdG90eXBlLnJlc2V0VGltZW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgbXMgPSB0aGlzLnRpbWVvdXQoKSB8fCBNQVhfVElNRU9VVDtcblxuICB0aGlzLmNsZWFyVGltZW91dCgpO1xuICB0aGlzLnRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHNlbGYudGltZW91dCgpID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNlbGYuY2FsbGJhY2soc2VsZi5fdGltZW91dEVycm9yKG1zKSk7XG4gICAgc2VsZi50aW1lZE91dCA9IHRydWU7XG4gIH0sIG1zKTtcbn07XG5cbi8qKlxuICogU2V0IG9yIGdldCBhIGxpc3Qgb2Ygd2hpdGVsaXN0ZWQgZ2xvYmFscyBmb3IgdGhpcyB0ZXN0IHJ1bi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmdbXX0gZ2xvYmFsc1xuICovXG5SdW5uYWJsZS5wcm90b3R5cGUuZ2xvYmFscyA9IGZ1bmN0aW9uIChnbG9iYWxzKSB7XG4gIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIHJldHVybiB0aGlzLl9hbGxvd2VkR2xvYmFscztcbiAgfVxuICB0aGlzLl9hbGxvd2VkR2xvYmFscyA9IGdsb2JhbHM7XG59O1xuXG4vKipcbiAqIFJ1biB0aGUgdGVzdCBhbmQgaW52b2tlIGBmbihlcnIpYC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHByaXZhdGVcbiAqL1xuUnVubmFibGUucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uIChmbikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBzdGFydCA9IG5ldyBEYXRlKCk7XG4gIHZhciBjdHggPSB0aGlzLmN0eDtcbiAgdmFyIGZpbmlzaGVkO1xuICB2YXIgZXJyb3JXYXNIYW5kbGVkID0gZmFsc2U7XG5cbiAgaWYgKHRoaXMuaXNQZW5kaW5nKCkpIHJldHVybiBmbigpO1xuXG4gIC8vIFNvbWV0aW1lcyB0aGUgY3R4IGV4aXN0cywgYnV0IGl0IGlzIG5vdCBydW5uYWJsZVxuICBpZiAoY3R4ICYmIGN0eC5ydW5uYWJsZSkge1xuICAgIGN0eC5ydW5uYWJsZSh0aGlzKTtcbiAgfVxuXG4gIC8vIGNhbGxlZCBtdWx0aXBsZSB0aW1lc1xuICBmdW5jdGlvbiBtdWx0aXBsZShlcnIpIHtcbiAgICBpZiAoZXJyb3JXYXNIYW5kbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVycm9yV2FzSGFuZGxlZCA9IHRydWU7XG4gICAgc2VsZi5lbWl0KCdlcnJvcicsIGNyZWF0ZU11bHRpcGxlRG9uZUVycm9yKHNlbGYsIGVycikpO1xuICB9XG5cbiAgLy8gZmluaXNoZWRcbiAgZnVuY3Rpb24gZG9uZShlcnIpIHtcbiAgICB2YXIgbXMgPSBzZWxmLnRpbWVvdXQoKTtcbiAgICBpZiAoc2VsZi50aW1lZE91dCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChmaW5pc2hlZCkge1xuICAgICAgcmV0dXJuIG11bHRpcGxlKGVycik7XG4gICAgfVxuXG4gICAgc2VsZi5jbGVhclRpbWVvdXQoKTtcbiAgICBzZWxmLmR1cmF0aW9uID0gbmV3IERhdGUoKSAtIHN0YXJ0O1xuICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgICBpZiAoIWVyciAmJiBzZWxmLmR1cmF0aW9uID4gbXMgJiYgbXMgPiAwKSB7XG4gICAgICBlcnIgPSBzZWxmLl90aW1lb3V0RXJyb3IobXMpO1xuICAgIH1cbiAgICBmbihlcnIpO1xuICB9XG5cbiAgLy8gZm9yIC5yZXNldFRpbWVvdXQoKSBhbmQgUnVubmVyI3VuY2F1Z2h0KClcbiAgdGhpcy5jYWxsYmFjayA9IGRvbmU7XG5cbiAgaWYgKHRoaXMuZm4gJiYgdHlwZW9mIHRoaXMuZm4uY2FsbCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIGRvbmUoXG4gICAgICBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnQSBydW5uYWJsZSBtdXN0IGJlIHBhc3NlZCBhIGZ1bmN0aW9uIGFzIGl0cyBzZWNvbmQgYXJndW1lbnQuJ1xuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gZXhwbGljaXQgYXN5bmMgd2l0aCBgZG9uZWAgYXJndW1lbnRcbiAgaWYgKHRoaXMuYXN5bmMpIHtcbiAgICB0aGlzLnJlc2V0VGltZW91dCgpO1xuXG4gICAgLy8gYWxsb3dzIHNraXAoKSB0byBiZSB1c2VkIGluIGFuIGV4cGxpY2l0IGFzeW5jIGNvbnRleHRcbiAgICB0aGlzLnNraXAgPSBmdW5jdGlvbiBhc3luY1NraXAoKSB7XG4gICAgICB0aGlzLnBlbmRpbmcgPSB0cnVlO1xuICAgICAgZG9uZSgpO1xuICAgICAgLy8gaGFsdCBleGVjdXRpb24sIHRoZSB1bmNhdWdodCBoYW5kbGVyIHdpbGwgaWdub3JlIHRoZSBmYWlsdXJlLlxuICAgICAgdGhyb3cgbmV3IFBlbmRpbmcoJ2FzeW5jIHNraXA7IGFib3J0aW5nIGV4ZWN1dGlvbicpO1xuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgY2FsbEZuQXN5bmModGhpcy5mbik7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBoYW5kbGVzIGFzeW5jIHJ1bm5hYmxlcyB3aGljaCBhY3R1YWxseSBydW4gc3luY2hyb25vdXNseVxuICAgICAgZXJyb3JXYXNIYW5kbGVkID0gdHJ1ZTtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBQZW5kaW5nKSB7XG4gICAgICAgIHJldHVybjsgLy8gZG9uZSgpIGlzIGFscmVhZHkgY2FsbGVkIGluIHRoaXMuc2tpcCgpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuYWxsb3dVbmNhdWdodCkge1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICBkb25lKFJ1bm5hYmxlLnRvVmFsdWVPckVycm9yKGVycikpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBzeW5jIG9yIHByb21pc2UtcmV0dXJuaW5nXG4gIHRyeSB7XG4gICAgY2FsbEZuKHRoaXMuZm4pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlcnJvcldhc0hhbmRsZWQgPSB0cnVlO1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBQZW5kaW5nKSB7XG4gICAgICByZXR1cm4gZG9uZSgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5hbGxvd1VuY2F1Z2h0KSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIGRvbmUoUnVubmFibGUudG9WYWx1ZU9yRXJyb3IoZXJyKSk7XG4gIH1cblxuICBmdW5jdGlvbiBjYWxsRm4oZm4pIHtcbiAgICB2YXIgcmVzdWx0ID0gZm4uY2FsbChjdHgpO1xuICAgIGlmIChyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdC50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBzZWxmLnJlc2V0VGltZW91dCgpO1xuICAgICAgcmVzdWx0LnRoZW4oXG4gICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgLy8gUmV0dXJuIG51bGwgc28gbGlicmFyaWVzIGxpa2UgYmx1ZWJpcmQgZG8gbm90IHdhcm4gYWJvdXRcbiAgICAgICAgICAvLyBzdWJzZXF1ZW50bHkgY29uc3RydWN0ZWQgUHJvbWlzZXMuXG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0sXG4gICAgICAgIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgICBkb25lKHJlYXNvbiB8fCBuZXcgRXJyb3IoJ1Byb21pc2UgcmVqZWN0ZWQgd2l0aCBubyBvciBmYWxzeSByZWFzb24nKSk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzZWxmLmFzeW5jT25seSkge1xuICAgICAgICByZXR1cm4gZG9uZShcbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnLS1hc3luYy1vbmx5IG9wdGlvbiBpbiB1c2Ugd2l0aG91dCBkZWNsYXJpbmcgYGRvbmUoKWAgb3IgcmV0dXJuaW5nIGEgcHJvbWlzZSdcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGRvbmUoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjYWxsRm5Bc3luYyhmbikge1xuICAgIHZhciByZXN1bHQgPSBmbi5jYWxsKGN0eCwgZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yIHx8IHRvU3RyaW5nLmNhbGwoZXJyKSA9PT0gJ1tvYmplY3QgRXJyb3JdJykge1xuICAgICAgICByZXR1cm4gZG9uZShlcnIpO1xuICAgICAgfVxuICAgICAgaWYgKGVycikge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGVycikgPT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgICAgICAgcmV0dXJuIGRvbmUoXG4gICAgICAgICAgICBuZXcgRXJyb3IoJ2RvbmUoKSBpbnZva2VkIHdpdGggbm9uLUVycm9yOiAnICsgSlNPTi5zdHJpbmdpZnkoZXJyKSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBFcnJvcignZG9uZSgpIGludm9rZWQgd2l0aCBub24tRXJyb3I6ICcgKyBlcnIpKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQgJiYgdXRpbHMuaXNQcm9taXNlKHJlc3VsdCkpIHtcbiAgICAgICAgcmV0dXJuIGRvbmUoXG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ1Jlc29sdXRpb24gbWV0aG9kIGlzIG92ZXJzcGVjaWZpZWQuIFNwZWNpZnkgYSBjYWxsYmFjayAqb3IqIHJldHVybiBhIFByb21pc2U7IG5vdCBib3RoLidcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGRvbmUoKTtcbiAgICB9KTtcbiAgfVxufTtcblxuLyoqXG4gKiBJbnN0YW50aWF0ZXMgYSBcInRpbWVvdXRcIiBlcnJvclxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBtcyAtIFRpbWVvdXQgKGluIG1pbGxpc2Vjb25kcylcbiAqIEByZXR1cm5zIHtFcnJvcn0gYSBcInRpbWVvdXRcIiBlcnJvclxuICogQHByaXZhdGVcbiAqL1xuUnVubmFibGUucHJvdG90eXBlLl90aW1lb3V0RXJyb3IgPSBmdW5jdGlvbiAobXMpIHtcbiAgbGV0IG1zZyA9IGBUaW1lb3V0IG9mICR7bXN9bXMgZXhjZWVkZWQuIEZvciBhc3luYyB0ZXN0cyBhbmQgaG9va3MsIGVuc3VyZSBcImRvbmUoKVwiIGlzIGNhbGxlZDsgaWYgcmV0dXJuaW5nIGEgUHJvbWlzZSwgZW5zdXJlIGl0IHJlc29sdmVzLmA7XG4gIGlmICh0aGlzLmZpbGUpIHtcbiAgICBtc2cgKz0gJyAoJyArIHRoaXMuZmlsZSArICcpJztcbiAgfVxuICByZXR1cm4gY3JlYXRlVGltZW91dEVycm9yKG1zZywgbXMsIHRoaXMuZmlsZSk7XG59O1xuXG52YXIgY29uc3RhbnRzID0gdXRpbHMuZGVmaW5lQ29uc3RhbnRzKFxuICAvKipcbiAgICoge0BsaW5rIFJ1bm5hYmxlfS1yZWxhdGVkIGNvbnN0YW50cy5cbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgUnVubmFibGVcbiAgICogQHJlYWRvbmx5XG4gICAqIEBzdGF0aWNcbiAgICogQGFsaWFzIGNvbnN0YW50c1xuICAgKiBAZW51bSB7c3RyaW5nfVxuICAgKi9cbiAge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGBzdGF0ZWAgcHJvcCB3aGVuIGEgYFJ1bm5hYmxlYCBoYXMgZmFpbGVkXG4gICAgICovXG4gICAgU1RBVEVfRkFJTEVEOiAnZmFpbGVkJyxcbiAgICAvKipcbiAgICAgKiBWYWx1ZSBvZiBgc3RhdGVgIHByb3Agd2hlbiBhIGBSdW5uYWJsZWAgaGFzIHBhc3NlZFxuICAgICAqL1xuICAgIFNUQVRFX1BBU1NFRDogJ3Bhc3NlZCcsXG4gICAgLyoqXG4gICAgICogVmFsdWUgb2YgYHN0YXRlYCBwcm9wIHdoZW4gYSBgUnVubmFibGVgIGhhcyBiZWVuIHNraXBwZWQgYnkgdXNlclxuICAgICAqL1xuICAgIFNUQVRFX1BFTkRJTkc6ICdwZW5kaW5nJ1xuICB9XG4pO1xuXG4vKipcbiAqIEdpdmVuIGB2YWx1ZWAsIHJldHVybiBpZGVudGl0eSBpZiB0cnV0aHksIG90aGVyd2lzZSBjcmVhdGUgYW4gXCJpbnZhbGlkIGV4Y2VwdGlvblwiIGVycm9yIGFuZCByZXR1cm4gdGhhdC5cbiAqIEBwYXJhbSB7Kn0gW3ZhbHVlXSAtIFZhbHVlIHRvIHJldHVybiwgaWYgcHJlc2VudFxuICogQHJldHVybnMgeyp8RXJyb3J9IGB2YWx1ZWAsIG90aGVyd2lzZSBhbiBgRXJyb3JgXG4gKiBAcHJpdmF0ZVxuICovXG5SdW5uYWJsZS50b1ZhbHVlT3JFcnJvciA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gKFxuICAgIHZhbHVlIHx8XG4gICAgY3JlYXRlSW52YWxpZEV4Y2VwdGlvbkVycm9yKFxuICAgICAgJ1J1bm5hYmxlIGZhaWxlZCB3aXRoIGZhbHN5IG9yIHVuZGVmaW5lZCBleGNlcHRpb24uIFBsZWFzZSB0aHJvdyBhbiBFcnJvciBpbnN0ZWFkLicsXG4gICAgICB2YWx1ZVxuICAgIClcbiAgKTtcbn07XG5cblJ1bm5hYmxlLmNvbnN0YW50cyA9IGNvbnN0YW50cztcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBSdW5uYWJsZSA9IHJlcXVpcmUoJy4vcnVubmFibGUnKTtcbmNvbnN0IHtpbmhlcml0cywgY29uc3RhbnRzfSA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbmNvbnN0IHtNT0NIQV9JRF9QUk9QX05BTUV9ID0gY29uc3RhbnRzO1xuXG4vKipcbiAqIEV4cG9zZSBgSG9va2AuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBIb29rO1xuXG4vKipcbiAqIEluaXRpYWxpemUgYSBuZXcgYEhvb2tgIHdpdGggdGhlIGdpdmVuIGB0aXRsZWAgYW5kIGNhbGxiYWNrIGBmbmBcbiAqXG4gKiBAY2xhc3NcbiAqIEBleHRlbmRzIFJ1bm5hYmxlXG4gKiBAcGFyYW0ge1N0cmluZ30gdGl0bGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKi9cbmZ1bmN0aW9uIEhvb2sodGl0bGUsIGZuKSB7XG4gIFJ1bm5hYmxlLmNhbGwodGhpcywgdGl0bGUsIGZuKTtcbiAgdGhpcy50eXBlID0gJ2hvb2snO1xufVxuXG4vKipcbiAqIEluaGVyaXQgZnJvbSBgUnVubmFibGUucHJvdG90eXBlYC5cbiAqL1xuaW5oZXJpdHMoSG9vaywgUnVubmFibGUpO1xuXG4vKipcbiAqIFJlc2V0cyB0aGUgc3RhdGUgZm9yIGEgbmV4dCBydW4uXG4gKi9cbkhvb2sucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xuICBSdW5uYWJsZS5wcm90b3R5cGUucmVzZXQuY2FsbCh0aGlzKTtcbiAgZGVsZXRlIHRoaXMuX2Vycm9yO1xufTtcblxuLyoqXG4gKiBHZXQgb3Igc2V0IHRoZSB0ZXN0IGBlcnJgLlxuICpcbiAqIEBtZW1iZXJvZiBIb29rXG4gKiBAcHVibGljXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEByZXR1cm4ge0Vycm9yfVxuICovXG5Ib29rLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgZXJyID0gdGhpcy5fZXJyb3I7XG4gICAgdGhpcy5fZXJyb3IgPSBudWxsO1xuICAgIHJldHVybiBlcnI7XG4gIH1cblxuICB0aGlzLl9lcnJvciA9IGVycjtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhbiBvYmplY3Qgc3VpdGFibGUgZm9yIElQQy5cbiAqIEZ1bmN0aW9ucyBhcmUgcmVwcmVzZW50ZWQgYnkga2V5cyBiZWdpbm5pbmcgd2l0aCBgJCRgLlxuICogQHByaXZhdGVcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbkhvb2sucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uIHNlcmlhbGl6ZSgpIHtcbiAgcmV0dXJuIHtcbiAgICAkJGN1cnJlbnRSZXRyeTogdGhpcy5jdXJyZW50UmV0cnkoKSxcbiAgICAkJGZ1bGxUaXRsZTogdGhpcy5mdWxsVGl0bGUoKSxcbiAgICAkJGlzUGVuZGluZzogQm9vbGVhbih0aGlzLmlzUGVuZGluZygpKSxcbiAgICAkJHRpdGxlUGF0aDogdGhpcy50aXRsZVBhdGgoKSxcbiAgICBjdHg6XG4gICAgICB0aGlzLmN0eCAmJiB0aGlzLmN0eC5jdXJyZW50VGVzdFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIGN1cnJlbnRUZXN0OiB7XG4gICAgICAgICAgICAgIHRpdGxlOiB0aGlzLmN0eC5jdXJyZW50VGVzdC50aXRsZSxcbiAgICAgICAgICAgICAgW01PQ0hBX0lEX1BST1BfTkFNRV06IHRoaXMuY3R4LmN1cnJlbnRUZXN0LmlkXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA6IHt9LFxuICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgIGZpbGU6IHRoaXMuZmlsZSxcbiAgICBwYXJlbnQ6IHtcbiAgICAgICQkZnVsbFRpdGxlOiB0aGlzLnBhcmVudC5mdWxsVGl0bGUoKSxcbiAgICAgIFtNT0NIQV9JRF9QUk9QX05BTUVdOiB0aGlzLnBhcmVudC5pZFxuICAgIH0sXG4gICAgc3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgdHlwZTogdGhpcy50eXBlLFxuICAgIFtNT0NIQV9JRF9QUk9QX05BTUVdOiB0aGlzLmlkXG4gIH07XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICogQHByaXZhdGVcbiAqL1xuY29uc3Qge0V2ZW50RW1pdHRlcn0gPSByZXF1aXJlKCdldmVudHMnKTtcbmNvbnN0IEhvb2sgPSByZXF1aXJlKCcuL2hvb2snKTtcbnZhciB7XG4gIGFzc2lnbk5ld01vY2hhSUQsXG4gIGNsYW1wLFxuICBjb25zdGFudHM6IHV0aWxzQ29uc3RhbnRzLFxuICBkZWZpbmVDb25zdGFudHMsXG4gIGdldE1vY2hhSUQsXG4gIGluaGVyaXRzLFxuICBpc1N0cmluZ1xufSA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbmNvbnN0IGRlYnVnID0gcmVxdWlyZSgnZGVidWcnKSgnbW9jaGE6c3VpdGUnKTtcbmNvbnN0IG1pbGxpc2Vjb25kcyA9IHJlcXVpcmUoJ21zJyk7XG5jb25zdCBlcnJvcnMgPSByZXF1aXJlKCcuL2Vycm9ycycpO1xuXG5jb25zdCB7TU9DSEFfSURfUFJPUF9OQU1FfSA9IHV0aWxzQ29uc3RhbnRzO1xuXG4vKipcbiAqIEV4cG9zZSBgU3VpdGVgLlxuICovXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IFN1aXRlO1xuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBgU3VpdGVgIHdpdGggdGhlIGdpdmVuIGB0aXRsZWAgYW5kIHBhcmVudCBgU3VpdGVgLlxuICpcbiAqIEBwdWJsaWNcbiAqIEBwYXJhbSB7U3VpdGV9IHBhcmVudCAtIFBhcmVudCBzdWl0ZSAocmVxdWlyZWQhKVxuICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlIC0gVGl0bGVcbiAqIEByZXR1cm4ge1N1aXRlfVxuICovXG5TdWl0ZS5jcmVhdGUgPSBmdW5jdGlvbiAocGFyZW50LCB0aXRsZSkge1xuICB2YXIgc3VpdGUgPSBuZXcgU3VpdGUodGl0bGUsIHBhcmVudC5jdHgpO1xuICBzdWl0ZS5wYXJlbnQgPSBwYXJlbnQ7XG4gIHRpdGxlID0gc3VpdGUuZnVsbFRpdGxlKCk7XG4gIHBhcmVudC5hZGRTdWl0ZShzdWl0ZSk7XG4gIHJldHVybiBzdWl0ZTtcbn07XG5cbi8qKlxuICogQ29uc3RydWN0cyBhIG5ldyBgU3VpdGVgIGluc3RhbmNlIHdpdGggdGhlIGdpdmVuIGB0aXRsZWAsIGBjdHhgLCBhbmQgYGlzUm9vdGAuXG4gKlxuICogQHB1YmxpY1xuICogQGNsYXNzXG4gKiBAZXh0ZW5kcyBFdmVudEVtaXR0ZXJcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvZXZlbnRzLmh0bWwjZXZlbnRzX2NsYXNzX2V2ZW50ZW1pdHRlcnxFdmVudEVtaXR0ZXJ9XG4gKiBAcGFyYW0ge3N0cmluZ30gdGl0bGUgLSBTdWl0ZSB0aXRsZS5cbiAqIEBwYXJhbSB7Q29udGV4dH0gcGFyZW50Q29udGV4dCAtIFBhcmVudCBjb250ZXh0IGluc3RhbmNlLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNSb290PWZhbHNlXSAtIFdoZXRoZXIgdGhpcyBpcyB0aGUgcm9vdCBzdWl0ZS5cbiAqL1xuZnVuY3Rpb24gU3VpdGUodGl0bGUsIHBhcmVudENvbnRleHQsIGlzUm9vdCkge1xuICBpZiAoIWlzU3RyaW5nKHRpdGxlKSkge1xuICAgIHRocm93IGVycm9ycy5jcmVhdGVJbnZhbGlkQXJndW1lbnRUeXBlRXJyb3IoXG4gICAgICAnU3VpdGUgYXJndW1lbnQgXCJ0aXRsZVwiIG11c3QgYmUgYSBzdHJpbmcuIFJlY2VpdmVkIHR5cGUgXCInICtcbiAgICAgICAgdHlwZW9mIHRpdGxlICtcbiAgICAgICAgJ1wiJyxcbiAgICAgICd0aXRsZScsXG4gICAgICAnc3RyaW5nJ1xuICAgICk7XG4gIH1cbiAgdGhpcy50aXRsZSA9IHRpdGxlO1xuICBmdW5jdGlvbiBDb250ZXh0KCkge31cbiAgQ29udGV4dC5wcm90b3R5cGUgPSBwYXJlbnRDb250ZXh0O1xuICB0aGlzLmN0eCA9IG5ldyBDb250ZXh0KCk7XG4gIHRoaXMuc3VpdGVzID0gW107XG4gIHRoaXMudGVzdHMgPSBbXTtcbiAgdGhpcy5yb290ID0gaXNSb290ID09PSB0cnVlO1xuICB0aGlzLnBlbmRpbmcgPSBmYWxzZTtcbiAgdGhpcy5fcmV0cmllcyA9IC0xO1xuICB0aGlzLl9iZWZvcmVFYWNoID0gW107XG4gIHRoaXMuX2JlZm9yZUFsbCA9IFtdO1xuICB0aGlzLl9hZnRlckVhY2ggPSBbXTtcbiAgdGhpcy5fYWZ0ZXJBbGwgPSBbXTtcbiAgdGhpcy5fdGltZW91dCA9IDIwMDA7XG4gIHRoaXMuX3Nsb3cgPSA3NTtcbiAgdGhpcy5fYmFpbCA9IGZhbHNlO1xuICB0aGlzLl9vbmx5VGVzdHMgPSBbXTtcbiAgdGhpcy5fb25seVN1aXRlcyA9IFtdO1xuICBhc3NpZ25OZXdNb2NoYUlEKHRoaXMpO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnaWQnLCB7XG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIGdldE1vY2hhSUQodGhpcyk7XG4gICAgfVxuICB9KTtcblxuICB0aGlzLnJlc2V0KCk7XG59XG5cbi8qKlxuICogSW5oZXJpdCBmcm9tIGBFdmVudEVtaXR0ZXIucHJvdG90eXBlYC5cbiAqL1xuaW5oZXJpdHMoU3VpdGUsIEV2ZW50RW1pdHRlcik7XG5cbi8qKlxuICogUmVzZXRzIHRoZSBzdGF0ZSBpbml0aWFsbHkgb3IgZm9yIGEgbmV4dCBydW4uXG4gKi9cblN1aXRlLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5kZWxheWVkID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGRvUmVzZXQodGhpbmdUb1Jlc2V0KSB7XG4gICAgdGhpbmdUb1Jlc2V0LnJlc2V0KCk7XG4gIH1cbiAgdGhpcy5zdWl0ZXMuZm9yRWFjaChkb1Jlc2V0KTtcbiAgdGhpcy50ZXN0cy5mb3JFYWNoKGRvUmVzZXQpO1xuICB0aGlzLl9iZWZvcmVFYWNoLmZvckVhY2goZG9SZXNldCk7XG4gIHRoaXMuX2FmdGVyRWFjaC5mb3JFYWNoKGRvUmVzZXQpO1xuICB0aGlzLl9iZWZvcmVBbGwuZm9yRWFjaChkb1Jlc2V0KTtcbiAgdGhpcy5fYWZ0ZXJBbGwuZm9yRWFjaChkb1Jlc2V0KTtcbn07XG5cbi8qKlxuICogUmV0dXJuIGEgY2xvbmUgb2YgdGhpcyBgU3VpdGVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHtTdWl0ZX1cbiAqL1xuU3VpdGUucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3VpdGUgPSBuZXcgU3VpdGUodGhpcy50aXRsZSk7XG4gIGRlYnVnKCdjbG9uZScpO1xuICBzdWl0ZS5jdHggPSB0aGlzLmN0eDtcbiAgc3VpdGUucm9vdCA9IHRoaXMucm9vdDtcbiAgc3VpdGUudGltZW91dCh0aGlzLnRpbWVvdXQoKSk7XG4gIHN1aXRlLnJldHJpZXModGhpcy5yZXRyaWVzKCkpO1xuICBzdWl0ZS5zbG93KHRoaXMuc2xvdygpKTtcbiAgc3VpdGUuYmFpbCh0aGlzLmJhaWwoKSk7XG4gIHJldHVybiBzdWl0ZTtcbn07XG5cbi8qKlxuICogU2V0IG9yIGdldCB0aW1lb3V0IGBtc2Agb3Igc2hvcnQtaGFuZCBzdWNoIGFzIFwiMnNcIi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHRvZG8gRG8gbm90IGF0dGVtcHQgdG8gc2V0IHZhbHVlIGlmIGBtc2AgaXMgdW5kZWZpbmVkXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IG1zXG4gKiBAcmV0dXJuIHtTdWl0ZXxudW1iZXJ9IGZvciBjaGFpbmluZ1xuICovXG5TdWl0ZS5wcm90b3R5cGUudGltZW91dCA9IGZ1bmN0aW9uIChtcykge1xuICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGltZW91dDtcbiAgfVxuICBpZiAodHlwZW9mIG1zID09PSAnc3RyaW5nJykge1xuICAgIG1zID0gbWlsbGlzZWNvbmRzKG1zKTtcbiAgfVxuXG4gIC8vIENsYW1wIHRvIHJhbmdlXG4gIHZhciBJTlRfTUFYID0gTWF0aC5wb3coMiwgMzEpIC0gMTtcbiAgdmFyIHJhbmdlID0gWzAsIElOVF9NQVhdO1xuICBtcyA9IGNsYW1wKG1zLCByYW5nZSk7XG5cbiAgZGVidWcoJ3RpbWVvdXQgJWQnLCBtcyk7XG4gIHRoaXMuX3RpbWVvdXQgPSBwYXJzZUludChtcywgMTApO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IG9yIGdldCBudW1iZXIgb2YgdGltZXMgdG8gcmV0cnkgYSBmYWlsZWQgdGVzdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSBuXG4gKiBAcmV0dXJuIHtTdWl0ZXxudW1iZXJ9IGZvciBjaGFpbmluZ1xuICovXG5TdWl0ZS5wcm90b3R5cGUucmV0cmllcyA9IGZ1bmN0aW9uIChuKSB7XG4gIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIHJldHVybiB0aGlzLl9yZXRyaWVzO1xuICB9XG4gIGRlYnVnKCdyZXRyaWVzICVkJywgbik7XG4gIHRoaXMuX3JldHJpZXMgPSBwYXJzZUludChuLCAxMCkgfHwgMDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCBvciBnZXQgc2xvdyBgbXNgIG9yIHNob3J0LWhhbmQgc3VjaCBhcyBcIjJzXCIuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gbXNcbiAqIEByZXR1cm4ge1N1aXRlfG51bWJlcn0gZm9yIGNoYWluaW5nXG4gKi9cblN1aXRlLnByb3RvdHlwZS5zbG93ID0gZnVuY3Rpb24gKG1zKSB7XG4gIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIHJldHVybiB0aGlzLl9zbG93O1xuICB9XG4gIGlmICh0eXBlb2YgbXMgPT09ICdzdHJpbmcnKSB7XG4gICAgbXMgPSBtaWxsaXNlY29uZHMobXMpO1xuICB9XG4gIGRlYnVnKCdzbG93ICVkJywgbXMpO1xuICB0aGlzLl9zbG93ID0gbXM7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXQgb3IgZ2V0IHdoZXRoZXIgdG8gYmFpbCBhZnRlciBmaXJzdCBlcnJvci5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtib29sZWFufSBiYWlsXG4gKiBAcmV0dXJuIHtTdWl0ZXxudW1iZXJ9IGZvciBjaGFpbmluZ1xuICovXG5TdWl0ZS5wcm90b3R5cGUuYmFpbCA9IGZ1bmN0aW9uIChiYWlsKSB7XG4gIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIHJldHVybiB0aGlzLl9iYWlsO1xuICB9XG4gIGRlYnVnKCdiYWlsICVzJywgYmFpbCk7XG4gIHRoaXMuX2JhaWwgPSBiYWlsO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhpcyBzdWl0ZSBvciBpdHMgcGFyZW50IHN1aXRlIGlzIG1hcmtlZCBhcyBwZW5kaW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cblN1aXRlLnByb3RvdHlwZS5pc1BlbmRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnBlbmRpbmcgfHwgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LmlzUGVuZGluZygpKTtcbn07XG5cbi8qKlxuICogR2VuZXJpYyBob29rLWNyZWF0b3IuXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlIC0gVGl0bGUgb2YgaG9va1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSBIb29rIGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7SG9va30gQSBuZXcgaG9va1xuICovXG5TdWl0ZS5wcm90b3R5cGUuX2NyZWF0ZUhvb2sgPSBmdW5jdGlvbiAodGl0bGUsIGZuKSB7XG4gIHZhciBob29rID0gbmV3IEhvb2sodGl0bGUsIGZuKTtcbiAgaG9vay5wYXJlbnQgPSB0aGlzO1xuICBob29rLnRpbWVvdXQodGhpcy50aW1lb3V0KCkpO1xuICBob29rLnJldHJpZXModGhpcy5yZXRyaWVzKCkpO1xuICBob29rLnNsb3codGhpcy5zbG93KCkpO1xuICBob29rLmN0eCA9IHRoaXMuY3R4O1xuICBob29rLmZpbGUgPSB0aGlzLmZpbGU7XG4gIHJldHVybiBob29rO1xufTtcblxuLyoqXG4gKiBSdW4gYGZuKHRlc3RbLCBkb25lXSlgIGJlZm9yZSBydW5uaW5nIHRlc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gdGl0bGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtTdWl0ZX0gZm9yIGNoYWluaW5nXG4gKi9cblN1aXRlLnByb3RvdHlwZS5iZWZvcmVBbGwgPSBmdW5jdGlvbiAodGl0bGUsIGZuKSB7XG4gIGlmICh0aGlzLmlzUGVuZGluZygpKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgaWYgKHR5cGVvZiB0aXRsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGZuID0gdGl0bGU7XG4gICAgdGl0bGUgPSBmbi5uYW1lO1xuICB9XG4gIHRpdGxlID0gJ1wiYmVmb3JlIGFsbFwiIGhvb2snICsgKHRpdGxlID8gJzogJyArIHRpdGxlIDogJycpO1xuXG4gIHZhciBob29rID0gdGhpcy5fY3JlYXRlSG9vayh0aXRsZSwgZm4pO1xuICB0aGlzLl9iZWZvcmVBbGwucHVzaChob29rKTtcbiAgdGhpcy5lbWl0KGNvbnN0YW50cy5FVkVOVF9TVUlURV9BRERfSE9PS19CRUZPUkVfQUxMLCBob29rKTtcbiAgcmV0dXJuIGhvb2s7XG59O1xuXG4vKipcbiAqIFJ1biBgZm4odGVzdFssIGRvbmVdKWAgYWZ0ZXIgcnVubmluZyB0ZXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHJldHVybiB7U3VpdGV9IGZvciBjaGFpbmluZ1xuICovXG5TdWl0ZS5wcm90b3R5cGUuYWZ0ZXJBbGwgPSBmdW5jdGlvbiAodGl0bGUsIGZuKSB7XG4gIGlmICh0aGlzLmlzUGVuZGluZygpKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgaWYgKHR5cGVvZiB0aXRsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGZuID0gdGl0bGU7XG4gICAgdGl0bGUgPSBmbi5uYW1lO1xuICB9XG4gIHRpdGxlID0gJ1wiYWZ0ZXIgYWxsXCIgaG9vaycgKyAodGl0bGUgPyAnOiAnICsgdGl0bGUgOiAnJyk7XG5cbiAgdmFyIGhvb2sgPSB0aGlzLl9jcmVhdGVIb29rKHRpdGxlLCBmbik7XG4gIHRoaXMuX2FmdGVyQWxsLnB1c2goaG9vayk7XG4gIHRoaXMuZW1pdChjb25zdGFudHMuRVZFTlRfU1VJVEVfQUREX0hPT0tfQUZURVJfQUxMLCBob29rKTtcbiAgcmV0dXJuIGhvb2s7XG59O1xuXG4vKipcbiAqIFJ1biBgZm4odGVzdFssIGRvbmVdKWAgYmVmb3JlIGVhY2ggdGVzdCBjYXNlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gdGl0bGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtTdWl0ZX0gZm9yIGNoYWluaW5nXG4gKi9cblN1aXRlLnByb3RvdHlwZS5iZWZvcmVFYWNoID0gZnVuY3Rpb24gKHRpdGxlLCBmbikge1xuICBpZiAodGhpcy5pc1BlbmRpbmcoKSkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGlmICh0eXBlb2YgdGl0bGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBmbiA9IHRpdGxlO1xuICAgIHRpdGxlID0gZm4ubmFtZTtcbiAgfVxuICB0aXRsZSA9ICdcImJlZm9yZSBlYWNoXCIgaG9vaycgKyAodGl0bGUgPyAnOiAnICsgdGl0bGUgOiAnJyk7XG5cbiAgdmFyIGhvb2sgPSB0aGlzLl9jcmVhdGVIb29rKHRpdGxlLCBmbik7XG4gIHRoaXMuX2JlZm9yZUVhY2gucHVzaChob29rKTtcbiAgdGhpcy5lbWl0KGNvbnN0YW50cy5FVkVOVF9TVUlURV9BRERfSE9PS19CRUZPUkVfRUFDSCwgaG9vayk7XG4gIHJldHVybiBob29rO1xufTtcblxuLyoqXG4gKiBSdW4gYGZuKHRlc3RbLCBkb25lXSlgIGFmdGVyIGVhY2ggdGVzdCBjYXNlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gdGl0bGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtTdWl0ZX0gZm9yIGNoYWluaW5nXG4gKi9cblN1aXRlLnByb3RvdHlwZS5hZnRlckVhY2ggPSBmdW5jdGlvbiAodGl0bGUsIGZuKSB7XG4gIGlmICh0aGlzLmlzUGVuZGluZygpKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgaWYgKHR5cGVvZiB0aXRsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGZuID0gdGl0bGU7XG4gICAgdGl0bGUgPSBmbi5uYW1lO1xuICB9XG4gIHRpdGxlID0gJ1wiYWZ0ZXIgZWFjaFwiIGhvb2snICsgKHRpdGxlID8gJzogJyArIHRpdGxlIDogJycpO1xuXG4gIHZhciBob29rID0gdGhpcy5fY3JlYXRlSG9vayh0aXRsZSwgZm4pO1xuICB0aGlzLl9hZnRlckVhY2gucHVzaChob29rKTtcbiAgdGhpcy5lbWl0KGNvbnN0YW50cy5FVkVOVF9TVUlURV9BRERfSE9PS19BRlRFUl9FQUNILCBob29rKTtcbiAgcmV0dXJuIGhvb2s7XG59O1xuXG4vKipcbiAqIEFkZCBhIHRlc3QgYHN1aXRlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtTdWl0ZX0gc3VpdGVcbiAqIEByZXR1cm4ge1N1aXRlfSBmb3IgY2hhaW5pbmdcbiAqL1xuU3VpdGUucHJvdG90eXBlLmFkZFN1aXRlID0gZnVuY3Rpb24gKHN1aXRlKSB7XG4gIHN1aXRlLnBhcmVudCA9IHRoaXM7XG4gIHN1aXRlLnJvb3QgPSBmYWxzZTtcbiAgc3VpdGUudGltZW91dCh0aGlzLnRpbWVvdXQoKSk7XG4gIHN1aXRlLnJldHJpZXModGhpcy5yZXRyaWVzKCkpO1xuICBzdWl0ZS5zbG93KHRoaXMuc2xvdygpKTtcbiAgc3VpdGUuYmFpbCh0aGlzLmJhaWwoKSk7XG4gIHRoaXMuc3VpdGVzLnB1c2goc3VpdGUpO1xuICB0aGlzLmVtaXQoY29uc3RhbnRzLkVWRU5UX1NVSVRFX0FERF9TVUlURSwgc3VpdGUpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQWRkIGEgYHRlc3RgIHRvIHRoaXMgc3VpdGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7VGVzdH0gdGVzdFxuICogQHJldHVybiB7U3VpdGV9IGZvciBjaGFpbmluZ1xuICovXG5TdWl0ZS5wcm90b3R5cGUuYWRkVGVzdCA9IGZ1bmN0aW9uICh0ZXN0KSB7XG4gIHRlc3QucGFyZW50ID0gdGhpcztcbiAgdGVzdC50aW1lb3V0KHRoaXMudGltZW91dCgpKTtcbiAgdGVzdC5yZXRyaWVzKHRoaXMucmV0cmllcygpKTtcbiAgdGVzdC5zbG93KHRoaXMuc2xvdygpKTtcbiAgdGVzdC5jdHggPSB0aGlzLmN0eDtcbiAgdGhpcy50ZXN0cy5wdXNoKHRlc3QpO1xuICB0aGlzLmVtaXQoY29uc3RhbnRzLkVWRU5UX1NVSVRFX0FERF9URVNULCB0ZXN0KTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJldHVybiB0aGUgZnVsbCB0aXRsZSBnZW5lcmF0ZWQgYnkgcmVjdXJzaXZlbHkgY29uY2F0ZW5hdGluZyB0aGUgcGFyZW50J3NcbiAqIGZ1bGwgdGl0bGUuXG4gKlxuICogQG1lbWJlcm9mIFN1aXRlXG4gKiBAcHVibGljXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cblN1aXRlLnByb3RvdHlwZS5mdWxsVGl0bGUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnRpdGxlUGF0aCgpLmpvaW4oJyAnKTtcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSB0aXRsZSBwYXRoIGdlbmVyYXRlZCBieSByZWN1cnNpdmVseSBjb25jYXRlbmF0aW5nIHRoZSBwYXJlbnQnc1xuICogdGl0bGUgcGF0aC5cbiAqXG4gKiBAbWVtYmVyb2YgU3VpdGVcbiAqIEBwdWJsaWNcbiAqIEByZXR1cm4ge3N0cmluZ1tdfVxuICovXG5TdWl0ZS5wcm90b3R5cGUudGl0bGVQYXRoID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGlmICh0aGlzLnBhcmVudCkge1xuICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQodGhpcy5wYXJlbnQudGl0bGVQYXRoKCkpO1xuICB9XG4gIGlmICghdGhpcy5yb290KSB7XG4gICAgcmVzdWx0LnB1c2godGhpcy50aXRsZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgdGVzdHMuXG4gKlxuICogQG1lbWJlcm9mIFN1aXRlXG4gKiBAcHVibGljXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cblN1aXRlLnByb3RvdHlwZS50b3RhbCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIChcbiAgICB0aGlzLnN1aXRlcy5yZWR1Y2UoZnVuY3Rpb24gKHN1bSwgc3VpdGUpIHtcbiAgICAgIHJldHVybiBzdW0gKyBzdWl0ZS50b3RhbCgpO1xuICAgIH0sIDApICsgdGhpcy50ZXN0cy5sZW5ndGhcbiAgKTtcbn07XG5cbi8qKlxuICogSXRlcmF0ZXMgdGhyb3VnaCBlYWNoIHN1aXRlIHJlY3Vyc2l2ZWx5IHRvIGZpbmQgYWxsIHRlc3RzLiBBcHBsaWVzIGFcbiAqIGZ1bmN0aW9uIGluIHRoZSBmb3JtYXQgYGZuKHRlc3QpYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEByZXR1cm4ge1N1aXRlfVxuICovXG5TdWl0ZS5wcm90b3R5cGUuZWFjaFRlc3QgPSBmdW5jdGlvbiAoZm4pIHtcbiAgdGhpcy50ZXN0cy5mb3JFYWNoKGZuKTtcbiAgdGhpcy5zdWl0ZXMuZm9yRWFjaChmdW5jdGlvbiAoc3VpdGUpIHtcbiAgICBzdWl0ZS5lYWNoVGVzdChmbik7XG4gIH0pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogVGhpcyB3aWxsIHJ1biB0aGUgcm9vdCBzdWl0ZSBpZiB3ZSBoYXBwZW4gdG8gYmUgcnVubmluZyBpbiBkZWxheWVkIG1vZGUuXG4gKiBAcHJpdmF0ZVxuICovXG5TdWl0ZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gcnVuKCkge1xuICBpZiAodGhpcy5yb290KSB7XG4gICAgdGhpcy5lbWl0KGNvbnN0YW50cy5FVkVOVF9ST09UX1NVSVRFX1JVTik7XG4gIH1cbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgc3VpdGUgaGFzIGFuIGBvbmx5YCB0ZXN0IG9yIHN1aXRlIGFzIGEgZGVzY2VuZGFudC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybnMge0Jvb2xlYW59XG4gKi9cblN1aXRlLnByb3RvdHlwZS5oYXNPbmx5ID0gZnVuY3Rpb24gaGFzT25seSgpIHtcbiAgcmV0dXJuIChcbiAgICB0aGlzLl9vbmx5VGVzdHMubGVuZ3RoID4gMCB8fFxuICAgIHRoaXMuX29ubHlTdWl0ZXMubGVuZ3RoID4gMCB8fFxuICAgIHRoaXMuc3VpdGVzLnNvbWUoZnVuY3Rpb24gKHN1aXRlKSB7XG4gICAgICByZXR1cm4gc3VpdGUuaGFzT25seSgpO1xuICAgIH0pXG4gICk7XG59O1xuXG4vKipcbiAqIEZpbHRlciBzdWl0ZXMgYmFzZWQgb24gYGlzT25seWAgbG9naWMuXG4gKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICovXG5TdWl0ZS5wcm90b3R5cGUuZmlsdGVyT25seSA9IGZ1bmN0aW9uIGZpbHRlck9ubHkoKSB7XG4gIGlmICh0aGlzLl9vbmx5VGVzdHMubGVuZ3RoKSB7XG4gICAgLy8gSWYgdGhlIHN1aXRlIGNvbnRhaW5zIGBvbmx5YCB0ZXN0cywgcnVuIHRob3NlIGFuZCBpZ25vcmUgYW55IG5lc3RlZCBzdWl0ZXMuXG4gICAgdGhpcy50ZXN0cyA9IHRoaXMuX29ubHlUZXN0cztcbiAgICB0aGlzLnN1aXRlcyA9IFtdO1xuICB9IGVsc2Uge1xuICAgIC8vIE90aGVyd2lzZSwgZG8gbm90IHJ1biBhbnkgb2YgdGhlIHRlc3RzIGluIHRoaXMgc3VpdGUuXG4gICAgdGhpcy50ZXN0cyA9IFtdO1xuICAgIHRoaXMuX29ubHlTdWl0ZXMuZm9yRWFjaChmdW5jdGlvbiAob25seVN1aXRlKSB7XG4gICAgICAvLyBJZiB0aGVyZSBhcmUgb3RoZXIgYG9ubHlgIHRlc3RzL3N1aXRlcyBuZXN0ZWQgaW4gdGhlIGN1cnJlbnQgYG9ubHlgIHN1aXRlLCB0aGVuIGZpbHRlciB0aGF0IGBvbmx5YCBzdWl0ZS5cbiAgICAgIC8vIE90aGVyd2lzZSwgYWxsIG9mIHRoZSB0ZXN0cyBvbiB0aGlzIGBvbmx5YCBzdWl0ZSBzaG91bGQgYmUgcnVuLCBzbyBkb24ndCBmaWx0ZXIgaXQuXG4gICAgICBpZiAob25seVN1aXRlLmhhc09ubHkoKSkge1xuICAgICAgICBvbmx5U3VpdGUuZmlsdGVyT25seSgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIFJ1biB0aGUgYG9ubHlgIHN1aXRlcywgYXMgd2VsbCBhcyBhbnkgb3RoZXIgc3VpdGVzIHRoYXQgaGF2ZSBgb25seWAgdGVzdHMvc3VpdGVzIGFzIGRlc2NlbmRhbnRzLlxuICAgIHZhciBvbmx5U3VpdGVzID0gdGhpcy5fb25seVN1aXRlcztcbiAgICB0aGlzLnN1aXRlcyA9IHRoaXMuc3VpdGVzLmZpbHRlcihmdW5jdGlvbiAoY2hpbGRTdWl0ZSkge1xuICAgICAgcmV0dXJuIG9ubHlTdWl0ZXMuaW5kZXhPZihjaGlsZFN1aXRlKSAhPT0gLTEgfHwgY2hpbGRTdWl0ZS5maWx0ZXJPbmx5KCk7XG4gICAgfSk7XG4gIH1cbiAgLy8gS2VlcCB0aGUgc3VpdGUgb25seSBpZiB0aGVyZSBpcyBzb21ldGhpbmcgdG8gcnVuXG4gIHJldHVybiB0aGlzLnRlc3RzLmxlbmd0aCA+IDAgfHwgdGhpcy5zdWl0ZXMubGVuZ3RoID4gMDtcbn07XG5cbi8qKlxuICogQWRkcyBhIHN1aXRlIHRvIHRoZSBsaXN0IG9mIHN1YnN1aXRlcyBtYXJrZWQgYG9ubHlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N1aXRlfSBzdWl0ZVxuICovXG5TdWl0ZS5wcm90b3R5cGUuYXBwZW5kT25seVN1aXRlID0gZnVuY3Rpb24gKHN1aXRlKSB7XG4gIHRoaXMuX29ubHlTdWl0ZXMucHVzaChzdWl0ZSk7XG59O1xuXG4vKipcbiAqIE1hcmtzIGEgc3VpdGUgdG8gYmUgYG9ubHlgLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cblN1aXRlLnByb3RvdHlwZS5tYXJrT25seSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQuYXBwZW5kT25seVN1aXRlKHRoaXMpO1xufTtcblxuLyoqXG4gKiBBZGRzIGEgdGVzdCB0byB0aGUgbGlzdCBvZiB0ZXN0cyBtYXJrZWQgYG9ubHlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1Rlc3R9IHRlc3RcbiAqL1xuU3VpdGUucHJvdG90eXBlLmFwcGVuZE9ubHlUZXN0ID0gZnVuY3Rpb24gKHRlc3QpIHtcbiAgdGhpcy5fb25seVRlc3RzLnB1c2godGVzdCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGFycmF5IG9mIGhvb2tzIGJ5IGhvb2sgbmFtZTsgc2VlIGBIT09LX1RZUEVfKmAgY29uc3RhbnRzLlxuICogQHByaXZhdGVcbiAqL1xuU3VpdGUucHJvdG90eXBlLmdldEhvb2tzID0gZnVuY3Rpb24gZ2V0SG9va3MobmFtZSkge1xuICByZXR1cm4gdGhpc1snXycgKyBuYW1lXTtcbn07XG5cbi8qKlxuICogY2xlYW5zIGFsbCByZWZlcmVuY2VzIGZyb20gdGhpcyBzdWl0ZSBhbmQgYWxsIGNoaWxkIHN1aXRlcy5cbiAqL1xuU3VpdGUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuc3VpdGVzLmZvckVhY2goZnVuY3Rpb24gKHN1aXRlKSB7XG4gICAgc3VpdGUuZGlzcG9zZSgpO1xuICB9KTtcbiAgdGhpcy5jbGVhblJlZmVyZW5jZXMoKTtcbn07XG5cbi8qKlxuICogQ2xlYW5zIHVwIHRoZSByZWZlcmVuY2VzIHRvIGFsbCB0aGUgZGVmZXJyZWQgZnVuY3Rpb25zXG4gKiAoYmVmb3JlL2FmdGVyL2JlZm9yZUVhY2gvYWZ0ZXJFYWNoKSBhbmQgdGVzdHMgb2YgYSBTdWl0ZS5cbiAqIFRoZXNlIG11c3QgYmUgZGVsZXRlZCBvdGhlcndpc2UgYSBtZW1vcnkgbGVhayBjYW4gaGFwcGVuLFxuICogYXMgdGhvc2UgZnVuY3Rpb25zIG1heSByZWZlcmVuY2UgdmFyaWFibGVzIGZyb20gY2xvc3VyZXMsXG4gKiB0aHVzIHRob3NlIHZhcmlhYmxlcyBjYW4gbmV2ZXIgYmUgZ2FyYmFnZSBjb2xsZWN0ZWQgYXMgbG9uZ1xuICogYXMgdGhlIGRlZmVycmVkIGZ1bmN0aW9ucyBleGlzdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5TdWl0ZS5wcm90b3R5cGUuY2xlYW5SZWZlcmVuY2VzID0gZnVuY3Rpb24gY2xlYW5SZWZlcmVuY2VzKCkge1xuICBmdW5jdGlvbiBjbGVhbkFyclJlZmVyZW5jZXMoYXJyKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGRlbGV0ZSBhcnJbaV0uZm47XG4gICAgfVxuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5fYmVmb3JlQWxsKSkge1xuICAgIGNsZWFuQXJyUmVmZXJlbmNlcyh0aGlzLl9iZWZvcmVBbGwpO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5fYmVmb3JlRWFjaCkpIHtcbiAgICBjbGVhbkFyclJlZmVyZW5jZXModGhpcy5fYmVmb3JlRWFjaCk7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLl9hZnRlckFsbCkpIHtcbiAgICBjbGVhbkFyclJlZmVyZW5jZXModGhpcy5fYWZ0ZXJBbGwpO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5fYWZ0ZXJFYWNoKSkge1xuICAgIGNsZWFuQXJyUmVmZXJlbmNlcyh0aGlzLl9hZnRlckVhY2gpO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnRlc3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgZGVsZXRlIHRoaXMudGVzdHNbaV0uZm47XG4gIH1cbn07XG5cbi8qKlxuICogUmV0dXJucyBhbiBvYmplY3Qgc3VpdGFibGUgZm9yIElQQy5cbiAqIEZ1bmN0aW9ucyBhcmUgcmVwcmVzZW50ZWQgYnkga2V5cyBiZWdpbm5pbmcgd2l0aCBgJCRgLlxuICogQHByaXZhdGVcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cblN1aXRlLnByb3RvdHlwZS5zZXJpYWxpemUgPSBmdW5jdGlvbiBzZXJpYWxpemUoKSB7XG4gIHJldHVybiB7XG4gICAgX2JhaWw6IHRoaXMuX2JhaWwsXG4gICAgJCRmdWxsVGl0bGU6IHRoaXMuZnVsbFRpdGxlKCksXG4gICAgJCRpc1BlbmRpbmc6IEJvb2xlYW4odGhpcy5pc1BlbmRpbmcoKSksXG4gICAgcm9vdDogdGhpcy5yb290LFxuICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgIFtNT0NIQV9JRF9QUk9QX05BTUVdOiB0aGlzLmlkLFxuICAgIHBhcmVudDogdGhpcy5wYXJlbnQgPyB7W01PQ0hBX0lEX1BST1BfTkFNRV06IHRoaXMucGFyZW50LmlkfSA6IG51bGxcbiAgfTtcbn07XG5cbnZhciBjb25zdGFudHMgPSBkZWZpbmVDb25zdGFudHMoXG4gIC8qKlxuICAgKiB7QGxpbmsgU3VpdGV9LXJlbGF0ZWQgY29uc3RhbnRzLlxuICAgKiBAcHVibGljXG4gICAqIEBtZW1iZXJvZiBTdWl0ZVxuICAgKiBAYWxpYXMgY29uc3RhbnRzXG4gICAqIEByZWFkb25seVxuICAgKiBAc3RhdGljXG4gICAqIEBlbnVtIHtzdHJpbmd9XG4gICAqL1xuICB7XG4gICAgLyoqXG4gICAgICogRXZlbnQgZW1pdHRlZCBhZnRlciBhIHRlc3QgZmlsZSBoYXMgYmVlbiBsb2FkZWQuIE5vdCBlbWl0dGVkIGluIGJyb3dzZXIuXG4gICAgICovXG4gICAgRVZFTlRfRklMRV9QT1NUX1JFUVVJUkU6ICdwb3N0LXJlcXVpcmUnLFxuICAgIC8qKlxuICAgICAqIEV2ZW50IGVtaXR0ZWQgYmVmb3JlIGEgdGVzdCBmaWxlIGhhcyBiZWVuIGxvYWRlZC4gSW4gYnJvd3NlciwgdGhpcyBpcyBlbWl0dGVkIG9uY2UgYW4gaW50ZXJmYWNlIGhhcyBiZWVuIHNlbGVjdGVkLlxuICAgICAqL1xuICAgIEVWRU5UX0ZJTEVfUFJFX1JFUVVJUkU6ICdwcmUtcmVxdWlyZScsXG4gICAgLyoqXG4gICAgICogRXZlbnQgZW1pdHRlZCBpbW1lZGlhdGVseSBhZnRlciBhIHRlc3QgZmlsZSBoYXMgYmVlbiBsb2FkZWQuIE5vdCBlbWl0dGVkIGluIGJyb3dzZXIuXG4gICAgICovXG4gICAgRVZFTlRfRklMRV9SRVFVSVJFOiAncmVxdWlyZScsXG4gICAgLyoqXG4gICAgICogRXZlbnQgZW1pdHRlZCB3aGVuIGBnbG9iYWwucnVuKClgIGlzIGNhbGxlZCAodXNlIHdpdGggYGRlbGF5YCBvcHRpb24pLlxuICAgICAqL1xuICAgIEVWRU5UX1JPT1RfU1VJVEVfUlVOOiAncnVuJyxcblxuICAgIC8qKlxuICAgICAqIE5hbWVzcGFjZSBmb3IgY29sbGVjdGlvbiBvZiBhIGBTdWl0ZWAncyBcImFmdGVyIGFsbFwiIGhvb2tzLlxuICAgICAqL1xuICAgIEhPT0tfVFlQRV9BRlRFUl9BTEw6ICdhZnRlckFsbCcsXG4gICAgLyoqXG4gICAgICogTmFtZXNwYWNlIGZvciBjb2xsZWN0aW9uIG9mIGEgYFN1aXRlYCdzIFwiYWZ0ZXIgZWFjaFwiIGhvb2tzLlxuICAgICAqL1xuICAgIEhPT0tfVFlQRV9BRlRFUl9FQUNIOiAnYWZ0ZXJFYWNoJyxcbiAgICAvKipcbiAgICAgKiBOYW1lc3BhY2UgZm9yIGNvbGxlY3Rpb24gb2YgYSBgU3VpdGVgJ3MgXCJiZWZvcmUgYWxsXCIgaG9va3MuXG4gICAgICovXG4gICAgSE9PS19UWVBFX0JFRk9SRV9BTEw6ICdiZWZvcmVBbGwnLFxuICAgIC8qKlxuICAgICAqIE5hbWVzcGFjZSBmb3IgY29sbGVjdGlvbiBvZiBhIGBTdWl0ZWAncyBcImJlZm9yZSBlYWNoXCIgaG9va3MuXG4gICAgICovXG4gICAgSE9PS19UWVBFX0JFRk9SRV9FQUNIOiAnYmVmb3JlRWFjaCcsXG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGFmdGVyIGEgY2hpbGQgYFN1aXRlYCBoYXMgYmVlbiBhZGRlZCB0byBhIGBTdWl0ZWAuXG4gICAgICovXG4gICAgRVZFTlRfU1VJVEVfQUREX1NVSVRFOiAnc3VpdGUnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgYW4gXCJhZnRlciBhbGxcIiBgSG9va2AgaGFzIGJlZW4gYWRkZWQgdG8gYSBgU3VpdGVgLlxuICAgICAqL1xuICAgIEVWRU5UX1NVSVRFX0FERF9IT09LX0FGVEVSX0FMTDogJ2FmdGVyQWxsJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGFmdGVyIGFuIFwiYWZ0ZXIgZWFjaFwiIGBIb29rYCBoYXMgYmVlbiBhZGRlZCB0byBhIGBTdWl0ZWAuXG4gICAgICovXG4gICAgRVZFTlRfU1VJVEVfQUREX0hPT0tfQUZURVJfRUFDSDogJ2FmdGVyRWFjaCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBhZnRlciBhbiBcImJlZm9yZSBhbGxcIiBgSG9va2AgaGFzIGJlZW4gYWRkZWQgdG8gYSBgU3VpdGVgLlxuICAgICAqL1xuICAgIEVWRU5UX1NVSVRFX0FERF9IT09LX0JFRk9SRV9BTEw6ICdiZWZvcmVBbGwnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgYW4gXCJiZWZvcmUgZWFjaFwiIGBIb29rYCBoYXMgYmVlbiBhZGRlZCB0byBhIGBTdWl0ZWAuXG4gICAgICovXG4gICAgRVZFTlRfU1VJVEVfQUREX0hPT0tfQkVGT1JFX0VBQ0g6ICdiZWZvcmVFYWNoJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGFmdGVyIGEgYFRlc3RgIGhhcyBiZWVuIGFkZGVkIHRvIGEgYFN1aXRlYC5cbiAgICAgKi9cbiAgICBFVkVOVF9TVUlURV9BRERfVEVTVDogJ3Rlc3QnXG4gIH1cbik7XG5cblN1aXRlLmNvbnN0YW50cyA9IGNvbnN0YW50cztcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqIEBwcml2YXRlXG4gKi9cbnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG52YXIgUGVuZGluZyA9IHJlcXVpcmUoJy4vcGVuZGluZycpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIGRlYnVnID0gcmVxdWlyZSgnZGVidWcnKSgnbW9jaGE6cnVubmVyJyk7XG52YXIgUnVubmFibGUgPSByZXF1aXJlKCcuL3J1bm5hYmxlJyk7XG52YXIgU3VpdGUgPSByZXF1aXJlKCcuL3N1aXRlJyk7XG52YXIgSE9PS19UWVBFX0JFRk9SRV9FQUNIID0gU3VpdGUuY29uc3RhbnRzLkhPT0tfVFlQRV9CRUZPUkVfRUFDSDtcbnZhciBIT09LX1RZUEVfQUZURVJfRUFDSCA9IFN1aXRlLmNvbnN0YW50cy5IT09LX1RZUEVfQUZURVJfRUFDSDtcbnZhciBIT09LX1RZUEVfQUZURVJfQUxMID0gU3VpdGUuY29uc3RhbnRzLkhPT0tfVFlQRV9BRlRFUl9BTEw7XG52YXIgSE9PS19UWVBFX0JFRk9SRV9BTEwgPSBTdWl0ZS5jb25zdGFudHMuSE9PS19UWVBFX0JFRk9SRV9BTEw7XG52YXIgRVZFTlRfUk9PVF9TVUlURV9SVU4gPSBTdWl0ZS5jb25zdGFudHMuRVZFTlRfUk9PVF9TVUlURV9SVU47XG52YXIgU1RBVEVfRkFJTEVEID0gUnVubmFibGUuY29uc3RhbnRzLlNUQVRFX0ZBSUxFRDtcbnZhciBTVEFURV9QQVNTRUQgPSBSdW5uYWJsZS5jb25zdGFudHMuU1RBVEVfUEFTU0VEO1xudmFyIFNUQVRFX1BFTkRJTkcgPSBSdW5uYWJsZS5jb25zdGFudHMuU1RBVEVfUEVORElORztcbnZhciBzdGFja0ZpbHRlciA9IHV0aWxzLnN0YWNrVHJhY2VGaWx0ZXIoKTtcbnZhciBzdHJpbmdpZnkgPSB1dGlscy5zdHJpbmdpZnk7XG5cbmNvbnN0IHtcbiAgY3JlYXRlSW52YWxpZEV4Y2VwdGlvbkVycm9yLFxuICBjcmVhdGVVbnN1cHBvcnRlZEVycm9yLFxuICBjcmVhdGVGYXRhbEVycm9yLFxuICBpc01vY2hhRXJyb3IsXG4gIGNvbnN0YW50czogZXJyb3JDb25zdGFudHNcbn0gPSByZXF1aXJlKCcuL2Vycm9ycycpO1xuXG4vKipcbiAqIE5vbi1lbnVtZXJhYmxlIGdsb2JhbHMuXG4gKiBAcHJpdmF0ZVxuICogQHJlYWRvbmx5XG4gKi9cbnZhciBnbG9iYWxzID0gW1xuICAnc2V0VGltZW91dCcsXG4gICdjbGVhclRpbWVvdXQnLFxuICAnc2V0SW50ZXJ2YWwnLFxuICAnY2xlYXJJbnRlcnZhbCcsXG4gICdYTUxIdHRwUmVxdWVzdCcsXG4gICdEYXRlJyxcbiAgJ3NldEltbWVkaWF0ZScsXG4gICdjbGVhckltbWVkaWF0ZSdcbl07XG5cbnZhciBjb25zdGFudHMgPSB1dGlscy5kZWZpbmVDb25zdGFudHMoXG4gIC8qKlxuICAgKiB7QGxpbmsgUnVubmVyfS1yZWxhdGVkIGNvbnN0YW50cy5cbiAgICogQHB1YmxpY1xuICAgKiBAbWVtYmVyb2YgUnVubmVyXG4gICAqIEByZWFkb25seVxuICAgKiBAYWxpYXMgY29uc3RhbnRzXG4gICAqIEBzdGF0aWNcbiAgICogQGVudW0ge3N0cmluZ31cbiAgICovXG4gIHtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4ge0BsaW5rIEhvb2t9IGV4ZWN1dGlvbiBiZWdpbnNcbiAgICAgKi9cbiAgICBFVkVOVF9IT09LX0JFR0lOOiAnaG9vaycsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHtAbGluayBIb29rfSBleGVjdXRpb24gZW5kc1xuICAgICAqL1xuICAgIEVWRU5UX0hPT0tfRU5EOiAnaG9vayBlbmQnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBSb290IHtAbGluayBTdWl0ZX0gZXhlY3V0aW9uIGJlZ2lucyAoYWxsIGZpbGVzIGhhdmUgYmVlbiBwYXJzZWQgYW5kIGhvb2tzL3Rlc3RzIGFyZSByZWFkeSBmb3IgZXhlY3V0aW9uKVxuICAgICAqL1xuICAgIEVWRU5UX1JVTl9CRUdJTjogJ3N0YXJ0JyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gUm9vdCB7QGxpbmsgU3VpdGV9IGV4ZWN1dGlvbiBoYXMgYmVlbiBkZWxheWVkIHZpYSBgZGVsYXlgIG9wdGlvblxuICAgICAqL1xuICAgIEVWRU5UX0RFTEFZX0JFR0lOOiAnd2FpdGluZycsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGRlbGF5ZWQgUm9vdCB7QGxpbmsgU3VpdGV9IGV4ZWN1dGlvbiBpcyB0cmlnZ2VyZWQgYnkgdXNlciB2aWEgYGdsb2JhbC5ydW4oKWBcbiAgICAgKi9cbiAgICBFVkVOVF9ERUxBWV9FTkQ6ICdyZWFkeScsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIFJvb3Qge0BsaW5rIFN1aXRlfSBleGVjdXRpb24gZW5kc1xuICAgICAqL1xuICAgIEVWRU5UX1JVTl9FTkQ6ICdlbmQnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB7QGxpbmsgU3VpdGV9IGV4ZWN1dGlvbiBiZWdpbnNcbiAgICAgKi9cbiAgICBFVkVOVF9TVUlURV9CRUdJTjogJ3N1aXRlJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4ge0BsaW5rIFN1aXRlfSBleGVjdXRpb24gZW5kc1xuICAgICAqL1xuICAgIEVWRU5UX1NVSVRFX0VORDogJ3N1aXRlIGVuZCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHtAbGluayBUZXN0fSBleGVjdXRpb24gYmVnaW5zXG4gICAgICovXG4gICAgRVZFTlRfVEVTVF9CRUdJTjogJ3Rlc3QnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB7QGxpbmsgVGVzdH0gZXhlY3V0aW9uIGVuZHNcbiAgICAgKi9cbiAgICBFVkVOVF9URVNUX0VORDogJ3Rlc3QgZW5kJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4ge0BsaW5rIFRlc3R9IGV4ZWN1dGlvbiBmYWlsc1xuICAgICAqL1xuICAgIEVWRU5UX1RFU1RfRkFJTDogJ2ZhaWwnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB7QGxpbmsgVGVzdH0gZXhlY3V0aW9uIHN1Y2NlZWRzXG4gICAgICovXG4gICAgRVZFTlRfVEVTVF9QQVNTOiAncGFzcycsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHtAbGluayBUZXN0fSBiZWNvbWVzIHBlbmRpbmdcbiAgICAgKi9cbiAgICBFVkVOVF9URVNUX1BFTkRJTkc6ICdwZW5kaW5nJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4ge0BsaW5rIFRlc3R9IGV4ZWN1dGlvbiBoYXMgZmFpbGVkLCBidXQgd2lsbCByZXRyeVxuICAgICAqL1xuICAgIEVWRU5UX1RFU1RfUkVUUlk6ICdyZXRyeScsXG4gICAgLyoqXG4gICAgICogSW5pdGlhbCBzdGF0ZSBvZiBSdW5uZXJcbiAgICAgKi9cbiAgICBTVEFURV9JRExFOiAnaWRsZScsXG4gICAgLyoqXG4gICAgICogU3RhdGUgc2V0IHRvIHRoaXMgdmFsdWUgd2hlbiB0aGUgUnVubmVyIGhhcyBzdGFydGVkIHJ1bm5pbmdcbiAgICAgKi9cbiAgICBTVEFURV9SVU5OSU5HOiAncnVubmluZycsXG4gICAgLyoqXG4gICAgICogU3RhdGUgc2V0IHRvIHRoaXMgdmFsdWUgd2hlbiB0aGUgUnVubmVyIGhhcyBzdG9wcGVkXG4gICAgICovXG4gICAgU1RBVEVfU1RPUFBFRDogJ3N0b3BwZWQnXG4gIH1cbik7XG5cbmNsYXNzIFJ1bm5lciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGEgYFJ1bm5lcmAgYXQgdGhlIFJvb3Qge0BsaW5rIFN1aXRlfSwgd2hpY2ggcmVwcmVzZW50cyBhIGhpZXJhcmNoeSBvZiB7QGxpbmsgU3VpdGV8U3VpdGVzfSBhbmQge0BsaW5rIFRlc3R8VGVzdHN9LlxuICAgKlxuICAgKiBAZXh0ZW5kcyBleHRlcm5hbDpFdmVudEVtaXR0ZXJcbiAgICogQHB1YmxpY1xuICAgKiBAY2xhc3NcbiAgICogQHBhcmFtIHtTdWl0ZX0gc3VpdGUgLSBSb290IHN1aXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0c10gLSBTZXR0aW5ncyBvYmplY3RcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5jbGVhblJlZmVyZW5jZXNBZnRlclJ1bl0gLSBXaGV0aGVyIHRvIGNsZWFuIHJlZmVyZW5jZXMgdG8gdGVzdCBmbnMgYW5kIGhvb2tzIHdoZW4gYSBzdWl0ZSBpcyBkb25lLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmRlbGF5XSAtIFdoZXRoZXIgdG8gZGVsYXkgZXhlY3V0aW9uIG9mIHJvb3Qgc3VpdGUgdW50aWwgcmVhZHkuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuZHJ5UnVuXSAtIFdoZXRoZXIgdG8gcmVwb3J0IHRlc3RzIHdpdGhvdXQgcnVubmluZyB0aGVtLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmZhaWxaZXJvXSAtIFdoZXRoZXIgdG8gZmFpbCB0ZXN0IHJ1biBpZiB6ZXJvIHRlc3RzIGVuY291bnRlcmVkLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioc3VpdGUsIG9wdHMgPSB7fSkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5fZ2xvYmFscyA9IFtdO1xuICAgIHRoaXMuX2Fib3J0ID0gZmFsc2U7XG4gICAgdGhpcy5zdWl0ZSA9IHN1aXRlO1xuICAgIHRoaXMuX29wdHMgPSBvcHRzO1xuICAgIHRoaXMuc3RhdGUgPSBjb25zdGFudHMuU1RBVEVfSURMRTtcbiAgICB0aGlzLnRvdGFsID0gc3VpdGUudG90YWwoKTtcbiAgICB0aGlzLmZhaWx1cmVzID0gMDtcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7TWFwPEV2ZW50RW1pdHRlcixNYXA8c3RyaW5nLFNldDxFdmVudExpc3RlbmVyPj4+fVxuICAgICAqL1xuICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJzID0gbmV3IE1hcCgpO1xuICAgIHRoaXMub24oY29uc3RhbnRzLkVWRU5UX1RFU1RfRU5ELCBmdW5jdGlvbiAodGVzdCkge1xuICAgICAgaWYgKHRlc3QudHlwZSA9PT0gJ3Rlc3QnICYmIHRlc3QucmV0cmllZFRlc3QoKSAmJiB0ZXN0LnBhcmVudCkge1xuICAgICAgICB2YXIgaWR4ID1cbiAgICAgICAgICB0ZXN0LnBhcmVudC50ZXN0cyAmJiB0ZXN0LnBhcmVudC50ZXN0cy5pbmRleE9mKHRlc3QucmV0cmllZFRlc3QoKSk7XG4gICAgICAgIGlmIChpZHggPiAtMSkgdGVzdC5wYXJlbnQudGVzdHNbaWR4XSA9IHRlc3Q7XG4gICAgICB9XG4gICAgICBzZWxmLmNoZWNrR2xvYmFscyh0ZXN0KTtcbiAgICB9KTtcbiAgICB0aGlzLm9uKGNvbnN0YW50cy5FVkVOVF9IT09LX0VORCwgZnVuY3Rpb24gKGhvb2spIHtcbiAgICAgIHNlbGYuY2hlY2tHbG9iYWxzKGhvb2spO1xuICAgIH0pO1xuICAgIHRoaXMuX2RlZmF1bHRHcmVwID0gLy4qLztcbiAgICB0aGlzLmdyZXAodGhpcy5fZGVmYXVsdEdyZXApO1xuICAgIHRoaXMuZ2xvYmFscyh0aGlzLmdsb2JhbFByb3BzKCkpO1xuXG4gICAgdGhpcy51bmNhdWdodCA9IHRoaXMuX3VuY2F1Z2h0LmJpbmQodGhpcyk7XG4gICAgdGhpcy51bmhhbmRsZWQgPSAocmVhc29uLCBwcm9taXNlKSA9PiB7XG4gICAgICBpZiAoaXNNb2NoYUVycm9yKHJlYXNvbikpIHtcbiAgICAgICAgZGVidWcoXG4gICAgICAgICAgJ3RyYXBwZWQgdW5oYW5kbGVkIHJlamVjdGlvbiBjb21pbmcgb3V0IG9mIE1vY2hhOyBmb3J3YXJkaW5nIHRvIHVuY2F1Z2h0IGhhbmRsZXI6JyxcbiAgICAgICAgICByZWFzb25cbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy51bmNhdWdodChyZWFzb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVidWcoXG4gICAgICAgICAgJ3RyYXBwZWQgdW5oYW5kbGVkIHJlamVjdGlvbiBmcm9tIChwcm9iYWJseSkgdXNlciBjb2RlOyByZS1lbWl0dGluZyBvbiBwcm9jZXNzJ1xuICAgICAgICApO1xuICAgICAgICB0aGlzLl9yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgICAgIHByb2Nlc3MsXG4gICAgICAgICAgJ3VuaGFuZGxlZFJlamVjdGlvbicsXG4gICAgICAgICAgdGhpcy51bmhhbmRsZWRcbiAgICAgICAgKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwcm9jZXNzLmVtaXQoJ3VuaGFuZGxlZFJlamVjdGlvbicsIHJlYXNvbiwgcHJvbWlzZSk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdGhpcy5fYWRkRXZlbnRMaXN0ZW5lcihwcm9jZXNzLCAndW5oYW5kbGVkUmVqZWN0aW9uJywgdGhpcy51bmhhbmRsZWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFdyYXBwZXIgZm9yIHNldEltbWVkaWF0ZSwgcHJvY2Vzcy5uZXh0VGljaywgb3IgYnJvd3NlciBwb2x5ZmlsbC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHByaXZhdGVcbiAqL1xuUnVubmVyLmltbWVkaWF0ZWx5ID0gZ2xvYmFsLnNldEltbWVkaWF0ZSB8fCBwcm9jZXNzLm5leHRUaWNrO1xuXG4vKipcbiAqIFJlcGxhY2VtZW50IGZvciBgdGFyZ2V0Lm9uKGV2ZW50TmFtZSwgbGlzdGVuZXIpYCB0aGF0IGRvZXMgYm9va2tlZXBpbmcgdG8gcmVtb3ZlIHRoZW0gd2hlbiB0aGlzIHJ1bm5lciBpbnN0YW5jZSBpcyBkaXNwb3NlZC5cbiAqIEBwYXJhbSB7RXZlbnRFbWl0dGVyfSB0YXJnZXQgLSBUaGUgYEV2ZW50RW1pdHRlcmBcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgLSBUaGUgZXZlbnQgbmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IGZuIC0gTGlzdGVuZXIgZnVuY3Rpb25cbiAqIEBwcml2YXRlXG4gKi9cblJ1bm5lci5wcm90b3R5cGUuX2FkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAodGFyZ2V0LCBldmVudE5hbWUsIGxpc3RlbmVyKSB7XG4gIGRlYnVnKFxuICAgICdfYWRkRXZlbnRMaXN0ZW5lcigpOiBhZGRpbmcgZm9yIGV2ZW50ICVzOyAlZCBjdXJyZW50IGxpc3RlbmVycycsXG4gICAgZXZlbnROYW1lLFxuICAgIHRhcmdldC5saXN0ZW5lckNvdW50KGV2ZW50TmFtZSlcbiAgKTtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgaWYgKFxuICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJzLmhhcyh0YXJnZXQpICYmXG4gICAgdGhpcy5fZXZlbnRMaXN0ZW5lcnMuZ2V0KHRhcmdldCkuaGFzKGV2ZW50TmFtZSkgJiZcbiAgICB0aGlzLl9ldmVudExpc3RlbmVycy5nZXQodGFyZ2V0KS5nZXQoZXZlbnROYW1lKS5oYXMobGlzdGVuZXIpXG4gICkge1xuICAgIGRlYnVnKFxuICAgICAgJ3dhcm5pbmc6IHRyaWVkIHRvIGF0dGFjaCBkdXBsaWNhdGUgZXZlbnQgbGlzdGVuZXIgZm9yICVzJyxcbiAgICAgIGV2ZW50TmFtZVxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRhcmdldC5vbihldmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgY29uc3QgdGFyZ2V0TGlzdGVuZXJzID0gdGhpcy5fZXZlbnRMaXN0ZW5lcnMuaGFzKHRhcmdldClcbiAgICA/IHRoaXMuX2V2ZW50TGlzdGVuZXJzLmdldCh0YXJnZXQpXG4gICAgOiBuZXcgTWFwKCk7XG4gIGNvbnN0IHRhcmdldEV2ZW50TGlzdGVuZXJzID0gdGFyZ2V0TGlzdGVuZXJzLmhhcyhldmVudE5hbWUpXG4gICAgPyB0YXJnZXRMaXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSlcbiAgICA6IG5ldyBTZXQoKTtcbiAgdGFyZ2V0RXZlbnRMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgdGFyZ2V0TGlzdGVuZXJzLnNldChldmVudE5hbWUsIHRhcmdldEV2ZW50TGlzdGVuZXJzKTtcbiAgdGhpcy5fZXZlbnRMaXN0ZW5lcnMuc2V0KHRhcmdldCwgdGFyZ2V0TGlzdGVuZXJzKTtcbn07XG5cbi8qKlxuICogUmVwbGFjZW1lbnQgZm9yIGB0YXJnZXQucmVtb3ZlTGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lcilgIHRoYXQgYWxzbyB1cGRhdGVzIHRoZSBib29ra2VlcGluZy5cbiAqIEBwYXJhbSB7RXZlbnRFbWl0dGVyfSB0YXJnZXQgLSBUaGUgYEV2ZW50RW1pdHRlcmBcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgLSBUaGUgZXZlbnQgbmFtZVxuICogQHBhcmFtIHtmdW5jdGlvbn0gbGlzdGVuZXIgLSBMaXN0ZW5lciBmdW5jdGlvblxuICogQHByaXZhdGVcbiAqL1xuUnVubmVyLnByb3RvdHlwZS5fcmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uICh0YXJnZXQsIGV2ZW50TmFtZSwgbGlzdGVuZXIpIHtcbiAgdGFyZ2V0LnJlbW92ZUxpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXIpO1xuXG4gIGlmICh0aGlzLl9ldmVudExpc3RlbmVycy5oYXModGFyZ2V0KSkge1xuICAgIGNvbnN0IHRhcmdldExpc3RlbmVycyA9IHRoaXMuX2V2ZW50TGlzdGVuZXJzLmdldCh0YXJnZXQpO1xuICAgIGlmICh0YXJnZXRMaXN0ZW5lcnMuaGFzKGV2ZW50TmFtZSkpIHtcbiAgICAgIGNvbnN0IHRhcmdldEV2ZW50TGlzdGVuZXJzID0gdGFyZ2V0TGlzdGVuZXJzLmdldChldmVudE5hbWUpO1xuICAgICAgdGFyZ2V0RXZlbnRMaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcbiAgICAgIGlmICghdGFyZ2V0RXZlbnRMaXN0ZW5lcnMuc2l6ZSkge1xuICAgICAgICB0YXJnZXRMaXN0ZW5lcnMuZGVsZXRlKGV2ZW50TmFtZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghdGFyZ2V0TGlzdGVuZXJzLnNpemUpIHtcbiAgICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJzLmRlbGV0ZSh0YXJnZXQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkZWJ1ZygndHJ5aW5nIHRvIHJlbW92ZSBsaXN0ZW5lciBmb3IgdW50cmFja2VkIG9iamVjdCAlcycsIHRhcmdldCk7XG4gIH1cbn07XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwgZXZlbnQgaGFuZGxlcnMgc2V0IGR1cmluZyBhIHJ1biBvbiB0aGlzIGluc3RhbmNlLlxuICogUmVtYXJrOiB0aGlzIGRvZXMgX25vdF8gY2xlYW4vZGlzcG9zZSB0aGUgdGVzdHMgb3Igc3VpdGVzIHRoZW1zZWx2ZXMuXG4gKi9cblJ1bm5lci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgdGhpcy5fZXZlbnRMaXN0ZW5lcnMuZm9yRWFjaCgodGFyZ2V0TGlzdGVuZXJzLCB0YXJnZXQpID0+IHtcbiAgICB0YXJnZXRMaXN0ZW5lcnMuZm9yRWFjaCgodGFyZ2V0RXZlbnRMaXN0ZW5lcnMsIGV2ZW50TmFtZSkgPT4ge1xuICAgICAgdGFyZ2V0RXZlbnRMaXN0ZW5lcnMuZm9yRWFjaChsaXN0ZW5lciA9PiB7XG4gICAgICAgIHRhcmdldC5yZW1vdmVMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbiAgdGhpcy5fZXZlbnRMaXN0ZW5lcnMuY2xlYXIoKTtcbn07XG5cbi8qKlxuICogUnVuIHRlc3RzIHdpdGggZnVsbCB0aXRsZXMgbWF0Y2hpbmcgYHJlYC4gVXBkYXRlcyBydW5uZXIudG90YWxcbiAqIHdpdGggbnVtYmVyIG9mIHRlc3RzIG1hdGNoZWQuXG4gKlxuICogQHB1YmxpY1xuICogQG1lbWJlcm9mIFJ1bm5lclxuICogQHBhcmFtIHtSZWdFeHB9IHJlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGludmVydFxuICogQHJldHVybiB7UnVubmVyfSBSdW5uZXIgaW5zdGFuY2UuXG4gKi9cblJ1bm5lci5wcm90b3R5cGUuZ3JlcCA9IGZ1bmN0aW9uIChyZSwgaW52ZXJ0KSB7XG4gIGRlYnVnKCdncmVwKCk6IHNldHRpbmcgdG8gJXMnLCByZSk7XG4gIHRoaXMuX2dyZXAgPSByZTtcbiAgdGhpcy5faW52ZXJ0ID0gaW52ZXJ0O1xuICB0aGlzLnRvdGFsID0gdGhpcy5ncmVwVG90YWwodGhpcy5zdWl0ZSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGVzdHMgbWF0Y2hpbmcgdGhlIGdyZXAgc2VhcmNoIGZvciB0aGVcbiAqIGdpdmVuIHN1aXRlLlxuICpcbiAqIEBtZW1iZXJvZiBSdW5uZXJcbiAqIEBwdWJsaWNcbiAqIEBwYXJhbSB7U3VpdGV9IHN1aXRlXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cblJ1bm5lci5wcm90b3R5cGUuZ3JlcFRvdGFsID0gZnVuY3Rpb24gKHN1aXRlKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHRvdGFsID0gMDtcblxuICBzdWl0ZS5lYWNoVGVzdChmdW5jdGlvbiAodGVzdCkge1xuICAgIHZhciBtYXRjaCA9IHNlbGYuX2dyZXAudGVzdCh0ZXN0LmZ1bGxUaXRsZSgpKTtcbiAgICBpZiAoc2VsZi5faW52ZXJ0KSB7XG4gICAgICBtYXRjaCA9ICFtYXRjaDtcbiAgICB9XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICB0b3RhbCsrO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHRvdGFsO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gYSBsaXN0IG9mIGdsb2JhbCBwcm9wZXJ0aWVzLlxuICpcbiAqIEByZXR1cm4ge0FycmF5fVxuICogQHByaXZhdGVcbiAqL1xuUnVubmVyLnByb3RvdHlwZS5nbG9iYWxQcm9wcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHByb3BzID0gT2JqZWN0LmtleXMoZ2xvYmFsKTtcblxuICAvLyBub24tZW51bWVyYWJsZXNcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBnbG9iYWxzLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKH5wcm9wcy5pbmRleE9mKGdsb2JhbHNbaV0pKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcHJvcHMucHVzaChnbG9iYWxzW2ldKTtcbiAgfVxuXG4gIHJldHVybiBwcm9wcztcbn07XG5cbi8qKlxuICogQWxsb3cgdGhlIGdpdmVuIGBhcnJgIG9mIGdsb2JhbHMuXG4gKlxuICogQHB1YmxpY1xuICogQG1lbWJlcm9mIFJ1bm5lclxuICogQHBhcmFtIHtBcnJheX0gYXJyXG4gKiBAcmV0dXJuIHtSdW5uZXJ9IFJ1bm5lciBpbnN0YW5jZS5cbiAqL1xuUnVubmVyLnByb3RvdHlwZS5nbG9iYWxzID0gZnVuY3Rpb24gKGFycikge1xuICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2xvYmFscztcbiAgfVxuICBkZWJ1ZygnZ2xvYmFscygpOiBzZXR0aW5nIHRvICVPJywgYXJyKTtcbiAgdGhpcy5fZ2xvYmFscyA9IHRoaXMuX2dsb2JhbHMuY29uY2F0KGFycik7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBDaGVjayBmb3IgZ2xvYmFsIHZhcmlhYmxlIGxlYWtzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cblJ1bm5lci5wcm90b3R5cGUuY2hlY2tHbG9iYWxzID0gZnVuY3Rpb24gKHRlc3QpIHtcbiAgaWYgKCF0aGlzLmNoZWNrTGVha3MpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG9rID0gdGhpcy5fZ2xvYmFscztcblxuICB2YXIgZ2xvYmFscyA9IHRoaXMuZ2xvYmFsUHJvcHMoKTtcbiAgdmFyIGxlYWtzO1xuXG4gIGlmICh0ZXN0KSB7XG4gICAgb2sgPSBvay5jb25jYXQodGVzdC5fYWxsb3dlZEdsb2JhbHMgfHwgW10pO1xuICB9XG5cbiAgaWYgKHRoaXMucHJldkdsb2JhbHNMZW5ndGggPT09IGdsb2JhbHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMucHJldkdsb2JhbHNMZW5ndGggPSBnbG9iYWxzLmxlbmd0aDtcblxuICBsZWFrcyA9IGZpbHRlckxlYWtzKG9rLCBnbG9iYWxzKTtcbiAgdGhpcy5fZ2xvYmFscyA9IHRoaXMuX2dsb2JhbHMuY29uY2F0KGxlYWtzKTtcblxuICBpZiAobGVha3MubGVuZ3RoKSB7XG4gICAgdmFyIG1zZyA9IGBnbG9iYWwgbGVhayhzKSBkZXRlY3RlZDogJHtsZWFrcy5tYXAoZSA9PiBgJyR7ZX0nYCkuam9pbignLCAnKX1gO1xuICAgIHRoaXMuZmFpbCh0ZXN0LCBuZXcgRXJyb3IobXNnKSk7XG4gIH1cbn07XG5cbi8qKlxuICogRmFpbCB0aGUgZ2l2ZW4gYHRlc3RgLlxuICpcbiAqIElmIGB0ZXN0YCBpcyBhIGhvb2ssIGZhaWx1cmVzIHdvcmsgaW4gdGhlIGZvbGxvd2luZyBwYXR0ZXJuOlxuICogLSBJZiBiYWlsLCBydW4gY29ycmVzcG9uZGluZyBgYWZ0ZXIgZWFjaGAgYW5kIGBhZnRlcmAgaG9va3MsXG4gKiAgIHRoZW4gZXhpdFxuICogLSBGYWlsZWQgYGJlZm9yZWAgaG9vayBza2lwcyBhbGwgdGVzdHMgaW4gYSBzdWl0ZSBhbmQgc3Vic3VpdGVzLFxuICogICBidXQganVtcHMgdG8gY29ycmVzcG9uZGluZyBgYWZ0ZXJgIGhvb2tcbiAqIC0gRmFpbGVkIGBiZWZvcmUgZWFjaGAgaG9vayBza2lwcyByZW1haW5pbmcgdGVzdHMgaW4gYVxuICogICBzdWl0ZSBhbmQganVtcHMgdG8gY29ycmVzcG9uZGluZyBgYWZ0ZXIgZWFjaGAgaG9vayxcbiAqICAgd2hpY2ggaXMgcnVuIG9ubHkgb25jZVxuICogLSBGYWlsZWQgYGFmdGVyYCBob29rIGRvZXMgbm90IGFsdGVyIGV4ZWN1dGlvbiBvcmRlclxuICogLSBGYWlsZWQgYGFmdGVyIGVhY2hgIGhvb2sgc2tpcHMgcmVtYWluaW5nIHRlc3RzIGluIGFcbiAqICAgc3VpdGUgYW5kIHN1YnN1aXRlcywgYnV0IGV4ZWN1dGVzIG90aGVyIGBhZnRlciBlYWNoYFxuICogICBob29rc1xuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1J1bm5hYmxlfSB0ZXN0XG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ZvcmNlPWZhbHNlXSAtIFdoZXRoZXIgdG8gZmFpbCBhIHBlbmRpbmcgdGVzdC5cbiAqL1xuUnVubmVyLnByb3RvdHlwZS5mYWlsID0gZnVuY3Rpb24gKHRlc3QsIGVyciwgZm9yY2UpIHtcbiAgZm9yY2UgPSBmb3JjZSA9PT0gdHJ1ZTtcbiAgaWYgKHRlc3QuaXNQZW5kaW5nKCkgJiYgIWZvcmNlKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICh0aGlzLnN0YXRlID09PSBjb25zdGFudHMuU1RBVEVfU1RPUFBFRCkge1xuICAgIGlmIChlcnIuY29kZSA9PT0gZXJyb3JDb25zdGFudHMuTVVMVElQTEVfRE9ORSkge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICB0aHJvdyBjcmVhdGVGYXRhbEVycm9yKFxuICAgICAgJ1Rlc3QgZmFpbGVkIGFmdGVyIHJvb3Qgc3VpdGUgZXhlY3V0aW9uIGNvbXBsZXRlZCEnLFxuICAgICAgZXJyXG4gICAgKTtcbiAgfVxuXG4gICsrdGhpcy5mYWlsdXJlcztcbiAgZGVidWcoJ3RvdGFsIG51bWJlciBvZiBmYWlsdXJlczogJWQnLCB0aGlzLmZhaWx1cmVzKTtcbiAgdGVzdC5zdGF0ZSA9IFNUQVRFX0ZBSUxFRDtcblxuICBpZiAoIWlzRXJyb3IoZXJyKSkge1xuICAgIGVyciA9IHRocm93bjJFcnJvcihlcnIpO1xuICB9XG5cbiAgLy8gRmlsdGVyIHRoZSBzdGFjayB0cmFjZXNcbiAgaWYgKCF0aGlzLmZ1bGxTdGFja1RyYWNlKSB7XG4gICAgY29uc3QgYWxyZWFkeUZpbHRlcmVkID0gbmV3IFNldCgpO1xuICAgIGxldCBjdXJyZW50RXJyID0gZXJyO1xuXG4gICAgd2hpbGUgKGN1cnJlbnRFcnIgJiYgY3VycmVudEVyci5zdGFjayAmJiAhYWxyZWFkeUZpbHRlcmVkLmhhcyhjdXJyZW50RXJyKSkge1xuICAgICAgYWxyZWFkeUZpbHRlcmVkLmFkZChjdXJyZW50RXJyKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY3VycmVudEVyci5zdGFjayA9IHN0YWNrRmlsdGVyKGN1cnJlbnRFcnIuc3RhY2spO1xuICAgICAgfSBjYXRjaCAoaWdub3JlKSB7XG4gICAgICAgIC8vIHNvbWUgZW52aXJvbm1lbnRzIGRvIG5vdCB0YWtlIGtpbmRseSB0byBtb25rZXlpbmcgd2l0aCB0aGUgc3RhY2tcbiAgICAgIH1cblxuICAgICAgY3VycmVudEVyciA9IGN1cnJlbnRFcnIuY2F1c2U7XG4gICAgfVxuICB9XG5cbiAgdGhpcy5lbWl0KGNvbnN0YW50cy5FVkVOVF9URVNUX0ZBSUwsIHRlc3QsIGVycik7XG59O1xuXG4vKipcbiAqIFJ1biBob29rIGBuYW1lYCBjYWxsYmFja3MgYW5kIHRoZW4gaW52b2tlIGBmbigpYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKi9cblxuUnVubmVyLnByb3RvdHlwZS5ob29rID0gZnVuY3Rpb24gKG5hbWUsIGZuKSB7XG4gIGlmICh0aGlzLl9vcHRzLmRyeVJ1bikgcmV0dXJuIGZuKCk7XG5cbiAgdmFyIHN1aXRlID0gdGhpcy5zdWl0ZTtcbiAgdmFyIGhvb2tzID0gc3VpdGUuZ2V0SG9va3MobmFtZSk7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICBmdW5jdGlvbiBuZXh0KGkpIHtcbiAgICB2YXIgaG9vayA9IGhvb2tzW2ldO1xuICAgIGlmICghaG9vaykge1xuICAgICAgcmV0dXJuIGZuKCk7XG4gICAgfVxuICAgIHNlbGYuY3VycmVudFJ1bm5hYmxlID0gaG9vaztcblxuICAgIGlmIChuYW1lID09PSBIT09LX1RZUEVfQkVGT1JFX0FMTCkge1xuICAgICAgaG9vay5jdHguY3VycmVudFRlc3QgPSBob29rLnBhcmVudC50ZXN0c1swXTtcbiAgICB9IGVsc2UgaWYgKG5hbWUgPT09IEhPT0tfVFlQRV9BRlRFUl9BTEwpIHtcbiAgICAgIGhvb2suY3R4LmN1cnJlbnRUZXN0ID0gaG9vay5wYXJlbnQudGVzdHNbaG9vay5wYXJlbnQudGVzdHMubGVuZ3RoIC0gMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGhvb2suY3R4LmN1cnJlbnRUZXN0ID0gc2VsZi50ZXN0O1xuICAgIH1cblxuICAgIHNldEhvb2tUaXRsZShob29rKTtcblxuICAgIGhvb2suYWxsb3dVbmNhdWdodCA9IHNlbGYuYWxsb3dVbmNhdWdodDtcblxuICAgIHNlbGYuZW1pdChjb25zdGFudHMuRVZFTlRfSE9PS19CRUdJTiwgaG9vayk7XG5cbiAgICBpZiAoIWhvb2subGlzdGVuZXJzKCdlcnJvcicpLmxlbmd0aCkge1xuICAgICAgc2VsZi5fYWRkRXZlbnRMaXN0ZW5lcihob29rLCAnZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIHNlbGYuZmFpbChob29rLCBlcnIpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaG9vay5ydW4oZnVuY3Rpb24gY2JIb29rUnVuKGVycikge1xuICAgICAgdmFyIHRlc3RFcnJvciA9IGhvb2suZXJyb3IoKTtcbiAgICAgIGlmICh0ZXN0RXJyb3IpIHtcbiAgICAgICAgc2VsZi5mYWlsKHNlbGYudGVzdCwgdGVzdEVycm9yKTtcbiAgICAgIH1cbiAgICAgIC8vIGNvbmRpdGlvbmFsIHNraXBcbiAgICAgIGlmIChob29rLnBlbmRpbmcpIHtcbiAgICAgICAgaWYgKG5hbWUgPT09IEhPT0tfVFlQRV9BRlRFUl9FQUNIKSB7XG4gICAgICAgICAgLy8gVE9ETyBkZWZpbmUgYW5kIGltcGxlbWVudCB1c2UgY2FzZVxuICAgICAgICAgIGlmIChzZWxmLnRlc3QpIHtcbiAgICAgICAgICAgIHNlbGYudGVzdC5wZW5kaW5nID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gSE9PS19UWVBFX0JFRk9SRV9FQUNIKSB7XG4gICAgICAgICAgaWYgKHNlbGYudGVzdCkge1xuICAgICAgICAgICAgc2VsZi50ZXN0LnBlbmRpbmcgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZWxmLmVtaXQoY29uc3RhbnRzLkVWRU5UX0hPT0tfRU5ELCBob29rKTtcbiAgICAgICAgICBob29rLnBlbmRpbmcgPSBmYWxzZTsgLy8gYWN0aXZhdGVzIGhvb2sgZm9yIG5leHQgdGVzdFxuICAgICAgICAgIHJldHVybiBmbihuZXcgRXJyb3IoJ2Fib3J0IGhvb2tEb3duJykpO1xuICAgICAgICB9IGVsc2UgaWYgKG5hbWUgPT09IEhPT0tfVFlQRV9CRUZPUkVfQUxMKSB7XG4gICAgICAgICAgc3VpdGUudGVzdHMuZm9yRWFjaChmdW5jdGlvbiAodGVzdCkge1xuICAgICAgICAgICAgdGVzdC5wZW5kaW5nID0gdHJ1ZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBzdWl0ZS5zdWl0ZXMuZm9yRWFjaChmdW5jdGlvbiAoc3VpdGUpIHtcbiAgICAgICAgICAgIHN1aXRlLnBlbmRpbmcgPSB0cnVlO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGhvb2tzID0gW107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaG9vay5wZW5kaW5nID0gZmFsc2U7XG4gICAgICAgICAgdmFyIGVyckZvcmJpZCA9IGNyZWF0ZVVuc3VwcG9ydGVkRXJyb3IoJ2B0aGlzLnNraXBgIGZvcmJpZGRlbicpO1xuICAgICAgICAgIHNlbGYuZmFpbChob29rLCBlcnJGb3JiaWQpO1xuICAgICAgICAgIHJldHVybiBmbihlcnJGb3JiaWQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGVycikge1xuICAgICAgICBzZWxmLmZhaWwoaG9vaywgZXJyKTtcbiAgICAgICAgLy8gc3RvcCBleGVjdXRpbmcgaG9va3MsIG5vdGlmeSBjYWxsZWUgb2YgaG9vayBlcnJcbiAgICAgICAgcmV0dXJuIGZuKGVycik7XG4gICAgICB9XG4gICAgICBzZWxmLmVtaXQoY29uc3RhbnRzLkVWRU5UX0hPT0tfRU5ELCBob29rKTtcbiAgICAgIGRlbGV0ZSBob29rLmN0eC5jdXJyZW50VGVzdDtcbiAgICAgIHNldEhvb2tUaXRsZShob29rKTtcbiAgICAgIG5leHQoKytpKTtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIHNldEhvb2tUaXRsZShob29rKSB7XG4gICAgICBob29rLm9yaWdpbmFsVGl0bGUgPSBob29rLm9yaWdpbmFsVGl0bGUgfHwgaG9vay50aXRsZTtcbiAgICAgIGlmIChob29rLmN0eCAmJiBob29rLmN0eC5jdXJyZW50VGVzdCkge1xuICAgICAgICBob29rLnRpdGxlID0gYCR7aG9vay5vcmlnaW5hbFRpdGxlfSBmb3IgXCIke2hvb2suY3R4LmN1cnJlbnRUZXN0LnRpdGxlfVwiYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBwYXJlbnRUaXRsZTtcbiAgICAgICAgaWYgKGhvb2sucGFyZW50LnRpdGxlKSB7XG4gICAgICAgICAgcGFyZW50VGl0bGUgPSBob29rLnBhcmVudC50aXRsZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXJlbnRUaXRsZSA9IGhvb2sucGFyZW50LnJvb3QgPyAne3Jvb3R9JyA6ICcnO1xuICAgICAgICB9XG4gICAgICAgIGhvb2sudGl0bGUgPSBgJHtob29rLm9yaWdpbmFsVGl0bGV9IGluIFwiJHtwYXJlbnRUaXRsZX1cImA7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgUnVubmVyLmltbWVkaWF0ZWx5KGZ1bmN0aW9uICgpIHtcbiAgICBuZXh0KDApO1xuICB9KTtcbn07XG5cbi8qKlxuICogUnVuIGhvb2sgYG5hbWVgIGZvciB0aGUgZ2l2ZW4gYXJyYXkgb2YgYHN1aXRlc2BcbiAqIGluIG9yZGVyLCBhbmQgY2FsbGJhY2sgYGZuKGVyciwgZXJyU3VpdGUpYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7QXJyYXl9IHN1aXRlc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqL1xuUnVubmVyLnByb3RvdHlwZS5ob29rcyA9IGZ1bmN0aW9uIChuYW1lLCBzdWl0ZXMsIGZuKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIG9yaWcgPSB0aGlzLnN1aXRlO1xuXG4gIGZ1bmN0aW9uIG5leHQoc3VpdGUpIHtcbiAgICBzZWxmLnN1aXRlID0gc3VpdGU7XG5cbiAgICBpZiAoIXN1aXRlKSB7XG4gICAgICBzZWxmLnN1aXRlID0gb3JpZztcbiAgICAgIHJldHVybiBmbigpO1xuICAgIH1cblxuICAgIHNlbGYuaG9vayhuYW1lLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHZhciBlcnJTdWl0ZSA9IHNlbGYuc3VpdGU7XG4gICAgICAgIHNlbGYuc3VpdGUgPSBvcmlnO1xuICAgICAgICByZXR1cm4gZm4oZXJyLCBlcnJTdWl0ZSk7XG4gICAgICB9XG5cbiAgICAgIG5leHQoc3VpdGVzLnBvcCgpKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5leHQoc3VpdGVzLnBvcCgpKTtcbn07XG5cbi8qKlxuICogUnVuICdhZnRlckVhY2gnIGhvb2tzIGZyb20gYm90dG9tIHVwLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHByaXZhdGVcbiAqL1xuUnVubmVyLnByb3RvdHlwZS5ob29rVXAgPSBmdW5jdGlvbiAobmFtZSwgZm4pIHtcbiAgdmFyIHN1aXRlcyA9IFt0aGlzLnN1aXRlXS5jb25jYXQodGhpcy5wYXJlbnRzKCkpLnJldmVyc2UoKTtcbiAgdGhpcy5ob29rcyhuYW1lLCBzdWl0ZXMsIGZuKTtcbn07XG5cbi8qKlxuICogUnVuICdiZWZvcmVFYWNoJyBob29rcyBmcm9tIHRvcCBsZXZlbCBkb3duLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHByaXZhdGVcbiAqL1xuUnVubmVyLnByb3RvdHlwZS5ob29rRG93biA9IGZ1bmN0aW9uIChuYW1lLCBmbikge1xuICB2YXIgc3VpdGVzID0gW3RoaXMuc3VpdGVdLmNvbmNhdCh0aGlzLnBhcmVudHMoKSk7XG4gIHRoaXMuaG9va3MobmFtZSwgc3VpdGVzLCBmbik7XG59O1xuXG4vKipcbiAqIFJldHVybiBhbiBhcnJheSBvZiBwYXJlbnQgU3VpdGVzIGZyb21cbiAqIGNsb3Nlc3QgdG8gZnVydGhlc3QuXG4gKlxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAcHJpdmF0ZVxuICovXG5SdW5uZXIucHJvdG90eXBlLnBhcmVudHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdWl0ZSA9IHRoaXMuc3VpdGU7XG4gIHZhciBzdWl0ZXMgPSBbXTtcbiAgd2hpbGUgKHN1aXRlLnBhcmVudCkge1xuICAgIHN1aXRlID0gc3VpdGUucGFyZW50O1xuICAgIHN1aXRlcy5wdXNoKHN1aXRlKTtcbiAgfVxuICByZXR1cm4gc3VpdGVzO1xufTtcblxuLyoqXG4gKiBSdW4gdGhlIGN1cnJlbnQgdGVzdCBhbmQgY2FsbGJhY2sgYGZuKGVycilgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcHJpdmF0ZVxuICovXG5SdW5uZXIucHJvdG90eXBlLnJ1blRlc3QgPSBmdW5jdGlvbiAoZm4pIHtcbiAgaWYgKHRoaXMuX29wdHMuZHJ5UnVuKSByZXR1cm4gUnVubmVyLmltbWVkaWF0ZWx5KGZuKTtcblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciB0ZXN0ID0gdGhpcy50ZXN0O1xuXG4gIGlmICghdGVzdCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh0aGlzLmFzeW5jT25seSkge1xuICAgIHRlc3QuYXN5bmNPbmx5ID0gdHJ1ZTtcbiAgfVxuICB0aGlzLl9hZGRFdmVudExpc3RlbmVyKHRlc3QsICdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICBzZWxmLmZhaWwodGVzdCwgZXJyKTtcbiAgfSk7XG4gIGlmICh0aGlzLmFsbG93VW5jYXVnaHQpIHtcbiAgICB0ZXN0LmFsbG93VW5jYXVnaHQgPSB0cnVlO1xuICAgIHJldHVybiB0ZXN0LnJ1bihmbik7XG4gIH1cbiAgdHJ5IHtcbiAgICB0ZXN0LnJ1bihmbik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGZuKGVycik7XG4gIH1cbn07XG5cbi8qKlxuICogUnVuIHRlc3RzIGluIHRoZSBnaXZlbiBgc3VpdGVgIGFuZCBpbnZva2UgdGhlIGNhbGxiYWNrIGBmbigpYCB3aGVuIGNvbXBsZXRlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N1aXRlfSBzdWl0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqL1xuUnVubmVyLnByb3RvdHlwZS5ydW5UZXN0cyA9IGZ1bmN0aW9uIChzdWl0ZSwgZm4pIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgdGVzdHMgPSBzdWl0ZS50ZXN0cy5zbGljZSgpO1xuICB2YXIgdGVzdDtcblxuICBmdW5jdGlvbiBob29rRXJyKF8sIGVyclN1aXRlLCBhZnRlcikge1xuICAgIC8vIGJlZm9yZS9hZnRlciBFYWNoIGhvb2sgZm9yIGVyclN1aXRlIGZhaWxlZDpcbiAgICB2YXIgb3JpZyA9IHNlbGYuc3VpdGU7XG5cbiAgICAvLyBmb3IgZmFpbGVkICdhZnRlciBlYWNoJyBob29rIHN0YXJ0IGZyb20gZXJyU3VpdGUgcGFyZW50LFxuICAgIC8vIG90aGVyd2lzZSBzdGFydCBmcm9tIGVyclN1aXRlIGl0c2VsZlxuICAgIHNlbGYuc3VpdGUgPSBhZnRlciA/IGVyclN1aXRlLnBhcmVudCA6IGVyclN1aXRlO1xuXG4gICAgaWYgKHNlbGYuc3VpdGUpIHtcbiAgICAgIHNlbGYuaG9va1VwKEhPT0tfVFlQRV9BRlRFUl9FQUNILCBmdW5jdGlvbiAoZXJyMiwgZXJyU3VpdGUyKSB7XG4gICAgICAgIHNlbGYuc3VpdGUgPSBvcmlnO1xuICAgICAgICAvLyBzb21lIGhvb2tzIG1heSBmYWlsIGV2ZW4gbm93XG4gICAgICAgIGlmIChlcnIyKSB7XG4gICAgICAgICAgcmV0dXJuIGhvb2tFcnIoZXJyMiwgZXJyU3VpdGUyLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyByZXBvcnQgZXJyb3Igc3VpdGVcbiAgICAgICAgZm4oZXJyU3VpdGUpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoZXJlIGlzIG5vIG5lZWQgY2FsbGluZyBvdGhlciAnYWZ0ZXIgZWFjaCcgaG9va3NcbiAgICAgIHNlbGYuc3VpdGUgPSBvcmlnO1xuICAgICAgZm4oZXJyU3VpdGUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG5leHQoZXJyLCBlcnJTdWl0ZSkge1xuICAgIC8vIGlmIHdlIGJhaWwgYWZ0ZXIgZmlyc3QgZXJyXG4gICAgaWYgKHNlbGYuZmFpbHVyZXMgJiYgc3VpdGUuX2JhaWwpIHtcbiAgICAgIHRlc3RzID0gW107XG4gICAgfVxuXG4gICAgaWYgKHNlbGYuX2Fib3J0KSB7XG4gICAgICByZXR1cm4gZm4oKTtcbiAgICB9XG5cbiAgICBpZiAoZXJyKSB7XG4gICAgICByZXR1cm4gaG9va0VycihlcnIsIGVyclN1aXRlLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvLyBuZXh0IHRlc3RcbiAgICB0ZXN0ID0gdGVzdHMuc2hpZnQoKTtcblxuICAgIC8vIGFsbCBkb25lXG4gICAgaWYgKCF0ZXN0KSB7XG4gICAgICByZXR1cm4gZm4oKTtcbiAgICB9XG5cbiAgICAvLyBncmVwXG4gICAgdmFyIG1hdGNoID0gc2VsZi5fZ3JlcC50ZXN0KHRlc3QuZnVsbFRpdGxlKCkpO1xuICAgIGlmIChzZWxmLl9pbnZlcnQpIHtcbiAgICAgIG1hdGNoID0gIW1hdGNoO1xuICAgIH1cbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAvLyBSdW4gaW1tZWRpYXRlbHkgb25seSBpZiB3ZSBoYXZlIGRlZmluZWQgYSBncmVwLiBXaGVuIHdlXG4gICAgICAvLyBkZWZpbmUgYSBncmVwIOKAlCBJdCBjYW4gY2F1c2UgbWF4aW11bSBjYWxsc3RhY2sgZXJyb3IgaWZcbiAgICAgIC8vIHRoZSBncmVwIGlzIGRvaW5nIGEgbGFyZ2UgcmVjdXJzaXZlIGxvb3AgYnkgbmVnbGVjdGluZ1xuICAgICAgLy8gYWxsIHRlc3RzLiBUaGUgcnVuIGltbWVkaWF0ZWx5IGZ1bmN0aW9uIGFsc28gY29tZXMgd2l0aFxuICAgICAgLy8gYSBwZXJmb3JtYW5jZSBjb3N0LiBTbyB3ZSBkb24ndCB3YW50IHRvIHJ1biBpbW1lZGlhdGVseVxuICAgICAgLy8gaWYgd2UgcnVuIHRoZSB3aG9sZSB0ZXN0IHN1aXRlLCBiZWNhdXNlIHJ1bm5pbmcgdGhlIHdob2xlXG4gICAgICAvLyB0ZXN0IHN1aXRlIGRvbid0IGRvIGFueSBpbW1lZGlhdGUgcmVjdXJzaXZlIGxvb3BzLiBUaHVzLFxuICAgICAgLy8gYWxsb3dpbmcgYSBKUyBydW50aW1lIHRvIGJyZWF0aGUuXG4gICAgICBpZiAoc2VsZi5fZ3JlcCAhPT0gc2VsZi5fZGVmYXVsdEdyZXApIHtcbiAgICAgICAgUnVubmVyLmltbWVkaWF0ZWx5KG5leHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHN0YXRpYyBza2lwLCBubyBob29rcyBhcmUgZXhlY3V0ZWRcbiAgICBpZiAodGVzdC5pc1BlbmRpbmcoKSkge1xuICAgICAgaWYgKHNlbGYuZm9yYmlkUGVuZGluZykge1xuICAgICAgICBzZWxmLmZhaWwodGVzdCwgbmV3IEVycm9yKCdQZW5kaW5nIHRlc3QgZm9yYmlkZGVuJyksIHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGVzdC5zdGF0ZSA9IFNUQVRFX1BFTkRJTkc7XG4gICAgICAgIHNlbGYuZW1pdChjb25zdGFudHMuRVZFTlRfVEVTVF9QRU5ESU5HLCB0ZXN0KTtcbiAgICAgIH1cbiAgICAgIHNlbGYuZW1pdChjb25zdGFudHMuRVZFTlRfVEVTVF9FTkQsIHRlc3QpO1xuICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICB9XG5cbiAgICAvLyBleGVjdXRlIHRlc3QgYW5kIGhvb2socylcbiAgICBzZWxmLmVtaXQoY29uc3RhbnRzLkVWRU5UX1RFU1RfQkVHSU4sIChzZWxmLnRlc3QgPSB0ZXN0KSk7XG4gICAgc2VsZi5ob29rRG93bihIT09LX1RZUEVfQkVGT1JFX0VBQ0gsIGZ1bmN0aW9uIChlcnIsIGVyclN1aXRlKSB7XG4gICAgICAvLyBjb25kaXRpb25hbCBza2lwIHdpdGhpbiBiZWZvcmVFYWNoXG4gICAgICBpZiAodGVzdC5pc1BlbmRpbmcoKSkge1xuICAgICAgICBpZiAoc2VsZi5mb3JiaWRQZW5kaW5nKSB7XG4gICAgICAgICAgc2VsZi5mYWlsKHRlc3QsIG5ldyBFcnJvcignUGVuZGluZyB0ZXN0IGZvcmJpZGRlbicpLCB0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ZXN0LnN0YXRlID0gU1RBVEVfUEVORElORztcbiAgICAgICAgICBzZWxmLmVtaXQoY29uc3RhbnRzLkVWRU5UX1RFU1RfUEVORElORywgdGVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgc2VsZi5lbWl0KGNvbnN0YW50cy5FVkVOVF9URVNUX0VORCwgdGVzdCk7XG4gICAgICAgIC8vIHNraXAgaW5uZXIgYWZ0ZXJFYWNoIGhvb2tzIGJlbG93IGVyclN1aXRlIGxldmVsXG4gICAgICAgIHZhciBvcmlnU3VpdGUgPSBzZWxmLnN1aXRlO1xuICAgICAgICBzZWxmLnN1aXRlID0gZXJyU3VpdGUgfHwgc2VsZi5zdWl0ZTtcbiAgICAgICAgcmV0dXJuIHNlbGYuaG9va1VwKEhPT0tfVFlQRV9BRlRFUl9FQUNILCBmdW5jdGlvbiAoZSwgZVN1aXRlKSB7XG4gICAgICAgICAgc2VsZi5zdWl0ZSA9IG9yaWdTdWl0ZTtcbiAgICAgICAgICBuZXh0KGUsIGVTdWl0ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGVycikge1xuICAgICAgICByZXR1cm4gaG9va0VycihlcnIsIGVyclN1aXRlLCBmYWxzZSk7XG4gICAgICB9XG4gICAgICBzZWxmLmN1cnJlbnRSdW5uYWJsZSA9IHNlbGYudGVzdDtcbiAgICAgIHNlbGYucnVuVGVzdChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIHRlc3QgPSBzZWxmLnRlc3Q7XG4gICAgICAgIC8vIGNvbmRpdGlvbmFsIHNraXAgd2l0aGluIGl0XG4gICAgICAgIGlmICh0ZXN0LnBlbmRpbmcpIHtcbiAgICAgICAgICBpZiAoc2VsZi5mb3JiaWRQZW5kaW5nKSB7XG4gICAgICAgICAgICBzZWxmLmZhaWwodGVzdCwgbmV3IEVycm9yKCdQZW5kaW5nIHRlc3QgZm9yYmlkZGVuJyksIHRydWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0ZXN0LnN0YXRlID0gU1RBVEVfUEVORElORztcbiAgICAgICAgICAgIHNlbGYuZW1pdChjb25zdGFudHMuRVZFTlRfVEVTVF9QRU5ESU5HLCB0ZXN0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VsZi5lbWl0KGNvbnN0YW50cy5FVkVOVF9URVNUX0VORCwgdGVzdCk7XG4gICAgICAgICAgcmV0dXJuIHNlbGYuaG9va1VwKEhPT0tfVFlQRV9BRlRFUl9FQUNILCBuZXh0KTtcbiAgICAgICAgfSBlbHNlIGlmIChlcnIpIHtcbiAgICAgICAgICB2YXIgcmV0cnkgPSB0ZXN0LmN1cnJlbnRSZXRyeSgpO1xuICAgICAgICAgIGlmIChyZXRyeSA8IHRlc3QucmV0cmllcygpKSB7XG4gICAgICAgICAgICB2YXIgY2xvbmVkVGVzdCA9IHRlc3QuY2xvbmUoKTtcbiAgICAgICAgICAgIGNsb25lZFRlc3QuY3VycmVudFJldHJ5KHJldHJ5ICsgMSk7XG4gICAgICAgICAgICB0ZXN0cy51bnNoaWZ0KGNsb25lZFRlc3QpO1xuXG4gICAgICAgICAgICBzZWxmLmVtaXQoY29uc3RhbnRzLkVWRU5UX1RFU1RfUkVUUlksIHRlc3QsIGVycik7XG5cbiAgICAgICAgICAgIC8vIEVhcmx5IHJldHVybiArIGhvb2sgdHJpZ2dlciBzbyB0aGF0IGl0IGRvZXNuJ3RcbiAgICAgICAgICAgIC8vIGluY3JlbWVudCB0aGUgY291bnQgd3JvbmdcbiAgICAgICAgICAgIHJldHVybiBzZWxmLmhvb2tVcChIT09LX1RZUEVfQUZURVJfRUFDSCwgbmV4dCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbGYuZmFpbCh0ZXN0LCBlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZWxmLmVtaXQoY29uc3RhbnRzLkVWRU5UX1RFU1RfRU5ELCB0ZXN0KTtcbiAgICAgICAgICByZXR1cm4gc2VsZi5ob29rVXAoSE9PS19UWVBFX0FGVEVSX0VBQ0gsIG5leHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGVzdC5zdGF0ZSA9IFNUQVRFX1BBU1NFRDtcbiAgICAgICAgc2VsZi5lbWl0KGNvbnN0YW50cy5FVkVOVF9URVNUX1BBU1MsIHRlc3QpO1xuICAgICAgICBzZWxmLmVtaXQoY29uc3RhbnRzLkVWRU5UX1RFU1RfRU5ELCB0ZXN0KTtcbiAgICAgICAgc2VsZi5ob29rVXAoSE9PS19UWVBFX0FGVEVSX0VBQ0gsIG5leHQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICB0aGlzLm5leHQgPSBuZXh0O1xuICB0aGlzLmhvb2tFcnIgPSBob29rRXJyO1xuICBuZXh0KCk7XG59O1xuXG4vKipcbiAqIFJ1biB0aGUgZ2l2ZW4gYHN1aXRlYCBhbmQgaW52b2tlIHRoZSBjYWxsYmFjayBgZm4oKWAgd2hlbiBjb21wbGV0ZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtTdWl0ZX0gc3VpdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKi9cblJ1bm5lci5wcm90b3R5cGUucnVuU3VpdGUgPSBmdW5jdGlvbiAoc3VpdGUsIGZuKSB7XG4gIHZhciBpID0gMDtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgdG90YWwgPSB0aGlzLmdyZXBUb3RhbChzdWl0ZSk7XG5cbiAgZGVidWcoJ3J1blN1aXRlKCk6IHJ1bm5pbmcgJXMnLCBzdWl0ZS5mdWxsVGl0bGUoKSk7XG5cbiAgaWYgKCF0b3RhbCB8fCAoc2VsZi5mYWlsdXJlcyAmJiBzdWl0ZS5fYmFpbCkpIHtcbiAgICBkZWJ1ZygncnVuU3VpdGUoKTogYmFpbGluZycpO1xuICAgIHJldHVybiBmbigpO1xuICB9XG5cbiAgdGhpcy5lbWl0KGNvbnN0YW50cy5FVkVOVF9TVUlURV9CRUdJTiwgKHRoaXMuc3VpdGUgPSBzdWl0ZSkpO1xuXG4gIGZ1bmN0aW9uIG5leHQoZXJyU3VpdGUpIHtcbiAgICBpZiAoZXJyU3VpdGUpIHtcbiAgICAgIC8vIGN1cnJlbnQgc3VpdGUgZmFpbGVkIG9uIGEgaG9vayBmcm9tIGVyclN1aXRlXG4gICAgICBpZiAoZXJyU3VpdGUgPT09IHN1aXRlKSB7XG4gICAgICAgIC8vIGlmIGVyclN1aXRlIGlzIGN1cnJlbnQgc3VpdGVcbiAgICAgICAgLy8gY29udGludWUgdG8gdGhlIG5leHQgc2libGluZyBzdWl0ZVxuICAgICAgICByZXR1cm4gZG9uZSgpO1xuICAgICAgfVxuICAgICAgLy8gZXJyU3VpdGUgaXMgYW1vbmcgdGhlIHBhcmVudHMgb2YgY3VycmVudCBzdWl0ZVxuICAgICAgLy8gc3RvcCBleGVjdXRpb24gb2YgZXJyU3VpdGUgYW5kIGFsbCBzdWItc3VpdGVzXG4gICAgICByZXR1cm4gZG9uZShlcnJTdWl0ZSk7XG4gICAgfVxuXG4gICAgaWYgKHNlbGYuX2Fib3J0KSB7XG4gICAgICByZXR1cm4gZG9uZSgpO1xuICAgIH1cblxuICAgIHZhciBjdXJyID0gc3VpdGUuc3VpdGVzW2krK107XG4gICAgaWYgKCFjdXJyKSB7XG4gICAgICByZXR1cm4gZG9uZSgpO1xuICAgIH1cblxuICAgIC8vIEF2b2lkIGdyZXAgbmVnbGVjdGluZyBsYXJnZSBudW1iZXIgb2YgdGVzdHMgY2F1c2luZyBhXG4gICAgLy8gaHVnZSByZWN1cnNpdmUgbG9vcCBhbmQgdGh1cyBhIG1heGltdW0gY2FsbCBzdGFjayBlcnJvci5cbiAgICAvLyBTZWUgY29tbWVudCBpbiBgdGhpcy5ydW5UZXN0cygpYCBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICBpZiAoc2VsZi5fZ3JlcCAhPT0gc2VsZi5fZGVmYXVsdEdyZXApIHtcbiAgICAgIFJ1bm5lci5pbW1lZGlhdGVseShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYucnVuU3VpdGUoY3VyciwgbmV4dCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5ydW5TdWl0ZShjdXJyLCBuZXh0KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBkb25lKGVyclN1aXRlKSB7XG4gICAgc2VsZi5zdWl0ZSA9IHN1aXRlO1xuICAgIHNlbGYubmV4dFN1aXRlID0gbmV4dDtcblxuICAgIC8vIHJlbW92ZSByZWZlcmVuY2UgdG8gdGVzdFxuICAgIGRlbGV0ZSBzZWxmLnRlc3Q7XG5cbiAgICBzZWxmLmhvb2soSE9PS19UWVBFX0FGVEVSX0FMTCwgZnVuY3Rpb24gKCkge1xuICAgICAgc2VsZi5lbWl0KGNvbnN0YW50cy5FVkVOVF9TVUlURV9FTkQsIHN1aXRlKTtcbiAgICAgIGZuKGVyclN1aXRlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHRoaXMubmV4dFN1aXRlID0gbmV4dDtcblxuICB0aGlzLmhvb2soSE9PS19UWVBFX0JFRk9SRV9BTEwsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICByZXR1cm4gZG9uZSgpO1xuICAgIH1cbiAgICBzZWxmLnJ1blRlc3RzKHN1aXRlLCBuZXh0KTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIEhhbmRsZSB1bmNhdWdodCBleGNlcHRpb25zIHdpdGhpbiBydW5uZXIuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBpcyBib3VuZCB0byB0aGUgaW5zdGFuY2UgYXMgYFJ1bm5lciN1bmNhdWdodGAgYXQgaW5zdGFudGlhdGlvblxuICogdGltZS4gSXQncyBpbnRlbmRlZCB0byBiZSBsaXN0ZW5pbmcgb24gdGhlIGBQcm9jZXNzLnVuY2F1Z2h0RXhjZXB0aW9uYCBldmVudC5cbiAqIEluIG9yZGVyIHRvIG5vdCBsZWFrIEVFIGxpc3RlbmVycywgd2UgbmVlZCB0byBlbnN1cmUgbm8gbW9yZSB0aGFuIGEgc2luZ2xlXG4gKiBgdW5jYXVnaHRFeGNlcHRpb25gIGxpc3RlbmVyIGV4aXN0cyBwZXIgYFJ1bm5lcmAuICBUaGUgb25seSB3YXkgdG8gZG9cbiAqIHRoaXMtLWJlY2F1c2UgdGhpcyBmdW5jdGlvbiBuZWVkcyB0aGUgY29udGV4dCAoYW5kIHdlIGRvbid0IGhhdmUgbGFtYmRhcyktLWlzXG4gKiB0byB1c2UgYEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kYC4gV2UgbmVlZCBzdHJpY3QgZXF1YWxpdHkgdG8gdW5yZWdpc3RlciBhbmRcbiAqIF9vbmx5XyB1bnJlZ2lzdGVyIHRoZSBfb25lXyBsaXN0ZW5lciB3ZSBzZXQgZnJvbSB0aGVcbiAqIGBQcm9jZXNzLnVuY2F1Z2h0RXhjZXB0aW9uYCBldmVudDsgd291bGQgYmUgcG9vciBmb3JtIHRvIGp1c3QgcmVtb3ZlXG4gKiBldmVyeXRoaW5nLiBTZWUge0BsaW5rIFJ1bm5lciNydW59IGZvciB3aGVyZSB0aGUgZXZlbnQgbGlzdGVuZXIgaXMgcmVnaXN0ZXJlZFxuICogYW5kIHVucmVnaXN0ZXJlZC5cbiAqIEBwYXJhbSB7RXJyb3J9IGVyciAtIFNvbWUgdW5jYXVnaHQgZXJyb3JcbiAqIEBwcml2YXRlXG4gKi9cblJ1bm5lci5wcm90b3R5cGUuX3VuY2F1Z2h0ID0gZnVuY3Rpb24gKGVycikge1xuICAvLyB0aGlzIGlzIGRlZmVuc2l2ZSB0byBwcmV2ZW50IGZ1dHVyZSBkZXZlbG9wZXJzIGZyb20gbWlzLWNhbGxpbmcgdGhpcyBmdW5jdGlvbi5cbiAgLy8gaXQncyBtb3JlIGxpa2VseSB0aGF0IGl0J2QgYmUgY2FsbGVkIHdpdGggdGhlIGluY29ycmVjdCBjb250ZXh0LS1zYXksIHRoZSBnbG9iYWxcbiAgLy8gYHByb2Nlc3NgIG9iamVjdC0tdGhhbiBpdCB3b3VsZCB0byBiZSBjYWxsZWQgd2l0aCBhIGNvbnRleHQgdGhhdCBpcyBub3QgYSBcInN1YmNsYXNzXCJcbiAgLy8gb2YgYFJ1bm5lcmAuXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSdW5uZXIpKSB7XG4gICAgdGhyb3cgY3JlYXRlRmF0YWxFcnJvcihcbiAgICAgICdSdW5uZXIjdW5jYXVnaHQoKSBjYWxsZWQgd2l0aCBpbnZhbGlkIGNvbnRleHQnLFxuICAgICAgdGhpc1xuICAgICk7XG4gIH1cbiAgaWYgKGVyciBpbnN0YW5jZW9mIFBlbmRpbmcpIHtcbiAgICBkZWJ1ZygndW5jYXVnaHQoKTogY2F1Z2h0IGEgUGVuZGluZycpO1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBicm93c2VyIGRvZXMgbm90IGV4aXQgc2NyaXB0IHdoZW4gdGhyb3dpbmcgaW4gZ2xvYmFsLm9uZXJyb3IoKVxuICBpZiAodGhpcy5hbGxvd1VuY2F1Z2h0ICYmICF1dGlscy5pc0Jyb3dzZXIoKSkge1xuICAgIGRlYnVnKCd1bmNhdWdodCgpOiBidWJibGluZyBleGNlcHRpb24gZHVlIHRvIC0tYWxsb3ctdW5jYXVnaHQnKTtcbiAgICB0aHJvdyBlcnI7XG4gIH1cblxuICBpZiAodGhpcy5zdGF0ZSA9PT0gY29uc3RhbnRzLlNUQVRFX1NUT1BQRUQpIHtcbiAgICBkZWJ1ZygndW5jYXVnaHQoKTogdGhyb3dpbmcgYWZ0ZXIgcnVuIGhhcyBjb21wbGV0ZWQhJyk7XG4gICAgdGhyb3cgZXJyO1xuICB9XG5cbiAgaWYgKGVycikge1xuICAgIGRlYnVnKCd1bmNhdWdodCgpOiBnb3QgdHJ1dGh5IGV4Y2VwdGlvbiAlTycsIGVycik7XG4gIH0gZWxzZSB7XG4gICAgZGVidWcoJ3VuY2F1Z2h0KCk6IHVuZGVmaW5lZC9mYWxzeSBleGNlcHRpb24nKTtcbiAgICBlcnIgPSBjcmVhdGVJbnZhbGlkRXhjZXB0aW9uRXJyb3IoXG4gICAgICAnQ2F1Z2h0IGZhbHN5L3VuZGVmaW5lZCBleGNlcHRpb24gd2hpY2ggd291bGQgb3RoZXJ3aXNlIGJlIHVuY2F1Z2h0LiBObyBzdGFjayB0cmFjZSBmb3VuZDsgdHJ5IGEgZGVidWdnZXInLFxuICAgICAgZXJyXG4gICAgKTtcbiAgfVxuXG4gIGlmICghaXNFcnJvcihlcnIpKSB7XG4gICAgZXJyID0gdGhyb3duMkVycm9yKGVycik7XG4gICAgZGVidWcoJ3VuY2F1Z2h0KCk6IGNvbnZlcnRlZCBcImVycm9yXCIgJW8gdG8gRXJyb3InLCBlcnIpO1xuICB9XG4gIGVyci51bmNhdWdodCA9IHRydWU7XG5cbiAgdmFyIHJ1bm5hYmxlID0gdGhpcy5jdXJyZW50UnVubmFibGU7XG5cbiAgaWYgKCFydW5uYWJsZSkge1xuICAgIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCdVbmNhdWdodCBlcnJvciBvdXRzaWRlIHRlc3Qgc3VpdGUnKTtcbiAgICBkZWJ1ZygndW5jYXVnaHQoKTogbm8gY3VycmVudCBSdW5uYWJsZTsgY3JlYXRlZCBhIHBob255IG9uZScpO1xuICAgIHJ1bm5hYmxlLnBhcmVudCA9IHRoaXMuc3VpdGU7XG5cbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gY29uc3RhbnRzLlNUQVRFX1JVTk5JTkcpIHtcbiAgICAgIGRlYnVnKCd1bmNhdWdodCgpOiBmYWlsaW5nIGdyYWNlZnVsbHknKTtcbiAgICAgIHRoaXMuZmFpbChydW5uYWJsZSwgZXJyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ2FuJ3QgcmVjb3ZlciBmcm9tIHRoaXMgZmFpbHVyZVxuICAgICAgZGVidWcoJ3VuY2F1Z2h0KCk6IHRlc3QgcnVuIGhhcyBub3QgeWV0IHN0YXJ0ZWQ7IHVucmVjb3ZlcmFibGUnKTtcbiAgICAgIHRoaXMuZW1pdChjb25zdGFudHMuRVZFTlRfUlVOX0JFR0lOKTtcbiAgICAgIHRoaXMuZmFpbChydW5uYWJsZSwgZXJyKTtcbiAgICAgIHRoaXMuZW1pdChjb25zdGFudHMuRVZFTlRfUlVOX0VORCk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcnVubmFibGUuY2xlYXJUaW1lb3V0KCk7XG5cbiAgaWYgKHJ1bm5hYmxlLmlzRmFpbGVkKCkpIHtcbiAgICBkZWJ1ZygndW5jYXVnaHQoKTogUnVubmFibGUgaGFzIGFscmVhZHkgZmFpbGVkJyk7XG4gICAgLy8gSWdub3JlIGVycm9yIGlmIGFscmVhZHkgZmFpbGVkXG4gICAgcmV0dXJuO1xuICB9IGVsc2UgaWYgKHJ1bm5hYmxlLmlzUGVuZGluZygpKSB7XG4gICAgZGVidWcoJ3VuY2F1Z2h0KCk6IHBlbmRpbmcgUnVubmFibGUgd291bmQgdXAgZmFpbGluZyEnKTtcbiAgICAvLyByZXBvcnQgJ3BlbmRpbmcgdGVzdCcgcmV0cm9zcGVjdGl2ZWx5IGFzIGZhaWxlZFxuICAgIHRoaXMuZmFpbChydW5uYWJsZSwgZXJyLCB0cnVlKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyB3ZSBjYW5ub3QgcmVjb3ZlciBncmFjZWZ1bGx5IGlmIGEgUnVubmFibGUgaGFzIGFscmVhZHkgcGFzc2VkXG4gIC8vIHRoZW4gZmFpbHMgYXN5bmNocm9ub3VzbHlcbiAgaWYgKHJ1bm5hYmxlLmlzUGFzc2VkKCkpIHtcbiAgICBkZWJ1ZygndW5jYXVnaHQoKTogUnVubmFibGUgaGFzIGFscmVhZHkgcGFzc2VkOyBiYWlsaW5nIGdyYWNlZnVsbHknKTtcbiAgICB0aGlzLmZhaWwocnVubmFibGUsIGVycik7XG4gICAgdGhpcy5hYm9ydCgpO1xuICB9IGVsc2Uge1xuICAgIGRlYnVnKCd1bmNhdWdodCgpOiBmb3JjaW5nIFJ1bm5hYmxlIHRvIGNvbXBsZXRlIHdpdGggRXJyb3InKTtcbiAgICByZXR1cm4gcnVubmFibGUuY2FsbGJhY2soZXJyKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSdW4gdGhlIHJvb3Qgc3VpdGUgYW5kIGludm9rZSBgZm4oZmFpbHVyZXMpYFxuICogb24gY29tcGxldGlvbi5cbiAqXG4gKiBAcHVibGljXG4gKiBAbWVtYmVyb2YgUnVubmVyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIENhbGxiYWNrIHdoZW4gZmluaXNoZWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0c10gLSBGb3Igc3ViY2xhc3Nlc1xuICogQHBhcmFtIHtzdHJpbmdbXX0gb3B0cy5maWxlcyAtIEZpbGVzIHRvIHJ1blxuICogQHBhcmFtIHtPcHRpb25zfSBvcHRzLm9wdGlvbnMgLSBjb21tYW5kLWxpbmUgb3B0aW9uc1xuICogQHJldHVybnMge1J1bm5lcn0gUnVubmVyIGluc3RhbmNlLlxuICovXG5SdW5uZXIucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uIChmbiwgb3B0cyA9IHt9KSB7XG4gIHZhciByb290U3VpdGUgPSB0aGlzLnN1aXRlO1xuICB2YXIgb3B0aW9ucyA9IG9wdHMub3B0aW9ucyB8fCB7fTtcblxuICBkZWJ1ZygncnVuKCk6IGdvdCBvcHRpb25zOiAlTycsIG9wdGlvbnMpO1xuICBmbiA9IGZuIHx8IGZ1bmN0aW9uICgpIHt9O1xuXG4gIGNvbnN0IGVuZCA9ICgpID0+IHtcbiAgICBpZiAoIXRoaXMudG90YWwgJiYgdGhpcy5fb3B0cy5mYWlsWmVybykgdGhpcy5mYWlsdXJlcyA9IDE7XG5cbiAgICBkZWJ1ZygncnVuKCk6IHJvb3Qgc3VpdGUgY29tcGxldGVkOyBlbWl0dGluZyAlcycsIGNvbnN0YW50cy5FVkVOVF9SVU5fRU5EKTtcbiAgICB0aGlzLmVtaXQoY29uc3RhbnRzLkVWRU5UX1JVTl9FTkQpO1xuICB9O1xuXG4gIGNvbnN0IGJlZ2luID0gKCkgPT4ge1xuICAgIGRlYnVnKCdydW4oKTogZW1pdHRpbmcgJXMnLCBjb25zdGFudHMuRVZFTlRfUlVOX0JFR0lOKTtcbiAgICB0aGlzLmVtaXQoY29uc3RhbnRzLkVWRU5UX1JVTl9CRUdJTik7XG4gICAgZGVidWcoJ3J1bigpOiBlbWl0dGVkICVzJywgY29uc3RhbnRzLkVWRU5UX1JVTl9CRUdJTik7XG5cbiAgICB0aGlzLnJ1blN1aXRlKHJvb3RTdWl0ZSwgZW5kKTtcbiAgfTtcblxuICBjb25zdCBwcmVwYXJlID0gKCkgPT4ge1xuICAgIGRlYnVnKCdydW4oKTogc3RhcnRpbmcnKTtcbiAgICAvLyBJZiB0aGVyZSBpcyBhbiBgb25seWAgZmlsdGVyXG4gICAgaWYgKHJvb3RTdWl0ZS5oYXNPbmx5KCkpIHtcbiAgICAgIHJvb3RTdWl0ZS5maWx0ZXJPbmx5KCk7XG4gICAgICBkZWJ1ZygncnVuKCk6IGZpbHRlcmVkIGV4Y2x1c2l2ZSBSdW5uYWJsZXMnKTtcbiAgICB9XG4gICAgdGhpcy5zdGF0ZSA9IGNvbnN0YW50cy5TVEFURV9SVU5OSU5HO1xuICAgIGlmICh0aGlzLl9vcHRzLmRlbGF5KSB7XG4gICAgICB0aGlzLmVtaXQoY29uc3RhbnRzLkVWRU5UX0RFTEFZX0VORCk7XG4gICAgICBkZWJ1ZygncnVuKCk6IFwiZGVsYXlcIiBlbmRlZCcpO1xuICAgIH1cblxuICAgIHJldHVybiBiZWdpbigpO1xuICB9O1xuXG4gIC8vIHJlZmVyZW5jZXMgY2xlYW51cCB0byBhdm9pZCBtZW1vcnkgbGVha3NcbiAgaWYgKHRoaXMuX29wdHMuY2xlYW5SZWZlcmVuY2VzQWZ0ZXJSdW4pIHtcbiAgICB0aGlzLm9uKGNvbnN0YW50cy5FVkVOVF9TVUlURV9FTkQsIHN1aXRlID0+IHtcbiAgICAgIHN1aXRlLmNsZWFuUmVmZXJlbmNlcygpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gY2FsbGJhY2tcbiAgdGhpcy5vbihjb25zdGFudHMuRVZFTlRfUlVOX0VORCwgZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuc3RhdGUgPSBjb25zdGFudHMuU1RBVEVfU1RPUFBFRDtcbiAgICBkZWJ1ZygncnVuKCk6IGVtaXR0ZWQgJXMnLCBjb25zdGFudHMuRVZFTlRfUlVOX0VORCk7XG4gICAgZm4odGhpcy5mYWlsdXJlcyk7XG4gIH0pO1xuXG4gIHRoaXMuX3JlbW92ZUV2ZW50TGlzdGVuZXIocHJvY2VzcywgJ3VuY2F1Z2h0RXhjZXB0aW9uJywgdGhpcy51bmNhdWdodCk7XG4gIHRoaXMuX3JlbW92ZUV2ZW50TGlzdGVuZXIocHJvY2VzcywgJ3VuaGFuZGxlZFJlamVjdGlvbicsIHRoaXMudW5oYW5kbGVkKTtcbiAgdGhpcy5fYWRkRXZlbnRMaXN0ZW5lcihwcm9jZXNzLCAndW5jYXVnaHRFeGNlcHRpb24nLCB0aGlzLnVuY2F1Z2h0KTtcbiAgdGhpcy5fYWRkRXZlbnRMaXN0ZW5lcihwcm9jZXNzLCAndW5oYW5kbGVkUmVqZWN0aW9uJywgdGhpcy51bmhhbmRsZWQpO1xuXG4gIGlmICh0aGlzLl9vcHRzLmRlbGF5KSB7XG4gICAgLy8gZm9yIHJlcG9ydGVycywgSSBndWVzcy5cbiAgICAvLyBtaWdodCBiZSBuaWNlIHRvIGRlYm91bmNlIHNvbWUgZG90cyB3aGlsZSB3ZSB3YWl0LlxuICAgIHRoaXMuZW1pdChjb25zdGFudHMuRVZFTlRfREVMQVlfQkVHSU4sIHJvb3RTdWl0ZSk7XG4gICAgcm9vdFN1aXRlLm9uY2UoRVZFTlRfUk9PVF9TVUlURV9SVU4sIHByZXBhcmUpO1xuICAgIGRlYnVnKCdydW4oKTogd2FpdGluZyBmb3IgZ3JlZW4gbGlnaHQgZHVlIHRvIC0tZGVsYXknKTtcbiAgfSBlbHNlIHtcbiAgICBSdW5uZXIuaW1tZWRpYXRlbHkocHJlcGFyZSk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogVG9nZ2xlIHBhcnRpYWwgb2JqZWN0IGxpbmtpbmcgYmVoYXZpb3I7IHVzZWQgZm9yIGJ1aWxkaW5nIG9iamVjdCByZWZlcmVuY2VzIGZyb21cbiAqIHVuaXF1ZSBJRCdzLiBEb2VzIG5vdGhpbmcgaW4gc2VyaWFsIG1vZGUsIGJlY2F1c2UgdGhlIG9iamVjdCByZWZlcmVuY2VzIGFscmVhZHkgZXhpc3QuXG4gKiBTdWJjbGFzc2VzIGNhbiBpbXBsZW1lbnQgdGhpcyAoZS5nLiwgYFBhcmFsbGVsQnVmZmVyZWRSdW5uZXJgKVxuICogQGFic3RyYWN0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFt2YWx1ZV0gLSBJZiBgdHJ1ZWAsIGVuYWJsZSBwYXJ0aWFsIG9iamVjdCBsaW5raW5nLCBvdGhlcndpc2UgZGlzYWJsZVxuICogQHJldHVybnMge1J1bm5lcn1cbiAqIEBjaGFpbmFibGVcbiAqIEBwdWJsaWNcbiAqIEBleGFtcGxlXG4gKiAvLyB0aGlzIHJlcG9ydGVyIG5lZWRzIHByb3BlciBvYmplY3QgcmVmZXJlbmNlcyB3aGVuIHJ1biBpbiBwYXJhbGxlbCBtb2RlXG4gKiBjbGFzcyBNeVJlcG9ydGVyIHtcbiAqICAgY29uc3RydWN0b3IocnVubmVyKSB7XG4gKiAgICAgcnVubmVyLmxpbmtQYXJ0aWFsT2JqZWN0cyh0cnVlKVxuICogICAgICAgLm9uKEVWRU5UX1NVSVRFX0JFR0lOLCBzdWl0ZSA9PiB7XG4gKiAgICAgICAgIC8vIHRoaXMgU3VpdGUgbWF5IGJlIHRoZSBzYW1lIG9iamVjdC4uLlxuICogICAgICAgfSlcbiAqICAgICAgIC5vbihFVkVOVF9URVNUX0JFR0lOLCB0ZXN0ID0+IHtcbiAqICAgICAgICAgLy8gLi4uYXMgdGhlIGB0ZXN0LnBhcmVudGAgcHJvcGVydHlcbiAqICAgICAgIH0pO1xuICogICB9XG4gKiB9XG4gKi9cblJ1bm5lci5wcm90b3R5cGUubGlua1BhcnRpYWxPYmplY3RzID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLypcbiAqIExpa2Uge0BsaW5rIFJ1bm5lciNydW59LCBidXQgZG9lcyBub3QgYWNjZXB0IGEgY2FsbGJhY2sgYW5kIHJldHVybnMgYSBgUHJvbWlzZWAgaW5zdGVhZCBvZiBhIGBSdW5uZXJgLlxuICogVGhpcyBmdW5jdGlvbiBjYW5ub3QgcmVqZWN0OyBhbiBgdW5oYW5kbGVkUmVqZWN0aW9uYCBldmVudCB3aWxsIGJ1YmJsZSB1cCB0byB0aGUgYHByb2Nlc3NgIG9iamVjdCBpbnN0ZWFkLlxuICogQHB1YmxpY1xuICogQG1lbWJlcm9mIFJ1bm5lclxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRzXSAtIE9wdGlvbnMgZm9yIHtAbGluayBSdW5uZXIjcnVufVxuICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gRmFpbHVyZSBjb3VudFxuICovXG5SdW5uZXIucHJvdG90eXBlLnJ1bkFzeW5jID0gYXN5bmMgZnVuY3Rpb24gcnVuQXN5bmMob3B0cyA9IHt9KSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICB0aGlzLnJ1bihyZXNvbHZlLCBvcHRzKTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIENsZWFubHkgYWJvcnQgZXhlY3V0aW9uLlxuICpcbiAqIEBtZW1iZXJvZiBSdW5uZXJcbiAqIEBwdWJsaWNcbiAqIEByZXR1cm4ge1J1bm5lcn0gUnVubmVyIGluc3RhbmNlLlxuICovXG5SdW5uZXIucHJvdG90eXBlLmFib3J0ID0gZnVuY3Rpb24gKCkge1xuICBkZWJ1ZygnYWJvcnQoKTogYWJvcnRpbmcnKTtcbiAgdGhpcy5fYWJvcnQgPSB0cnVlO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiBNb2NoYSBpcyBydW5uaW5nIGluIHBhcmFsbGVsIG1vZGUuICBGb3IgcmVwb3J0ZXJzLlxuICpcbiAqIFN1YmNsYXNzZXMgc2hvdWxkIHJldHVybiBhbiBhcHByb3ByaWF0ZSB2YWx1ZS5cbiAqIEBwdWJsaWNcbiAqIEByZXR1cm5zIHtmYWxzZX1cbiAqL1xuUnVubmVyLnByb3RvdHlwZS5pc1BhcmFsbGVsTW9kZSA9IGZ1bmN0aW9uIGlzUGFyYWxsZWxNb2RlKCkge1xuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIENvbmZpZ3VyZXMgYW4gYWx0ZXJuYXRlIHJlcG9ydGVyIGZvciB3b3JrZXIgcHJvY2Vzc2VzIHRvIHVzZS4gU3ViY2xhc3Nlc1xuICogdXNpbmcgd29ya2VyIHByb2Nlc3NlcyBzaG91bGQgaW1wbGVtZW50IHRoaXMuXG4gKiBAcHVibGljXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIEFic29sdXRlIHBhdGggdG8gYWx0ZXJuYXRlIHJlcG9ydGVyIGZvciB3b3JrZXIgcHJvY2Vzc2VzIHRvIHVzZVxuICogQHJldHVybnMge1J1bm5lcn1cbiAqIEB0aHJvd3MgV2hlbiBpbiBzZXJpYWwgbW9kZVxuICogQGNoYWluYWJsZVxuICogQGFic3RyYWN0XG4gKi9cblJ1bm5lci5wcm90b3R5cGUud29ya2VyUmVwb3J0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHRocm93IGNyZWF0ZVVuc3VwcG9ydGVkRXJyb3IoJ3dvcmtlclJlcG9ydGVyKCkgbm90IHN1cHBvcnRlZCBpbiBzZXJpYWwgbW9kZScpO1xufTtcblxuLyoqXG4gKiBGaWx0ZXIgbGVha3Mgd2l0aCB0aGUgZ2l2ZW4gZ2xvYmFscyBmbGFnZ2VkIGFzIGBva2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IG9rXG4gKiBAcGFyYW0ge0FycmF5fSBnbG9iYWxzXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xuZnVuY3Rpb24gZmlsdGVyTGVha3Mob2ssIGdsb2JhbHMpIHtcbiAgcmV0dXJuIGdsb2JhbHMuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAvLyBGaXJlZm94IGFuZCBDaHJvbWUgZXhwb3NlcyBpZnJhbWVzIGFzIGluZGV4IGluc2lkZSB0aGUgd2luZG93IG9iamVjdFxuICAgIGlmICgvXlxcZCsvLnRlc3Qoa2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIGluIGZpcmVmb3hcbiAgICAvLyBpZiBydW5uZXIgcnVucyBpbiBhbiBpZnJhbWUsIHRoaXMgaWZyYW1lJ3Mgd2luZG93LmdldEludGVyZmFjZSBtZXRob2RcbiAgICAvLyBub3QgaW5pdCBhdCBmaXJzdCBpdCBpcyBhc3NpZ25lZCBpbiBzb21lIHNlY29uZHNcbiAgICBpZiAoZ2xvYmFsLm5hdmlnYXRvciAmJiAvXmdldEludGVyZmFjZS8udGVzdChrZXkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gYW4gaWZyYW1lIGNvdWxkIGJlIGFwcHJvYWNoZWQgYnkgd2luZG93W2lmcmFtZUluZGV4XVxuICAgIC8vIGluIGllNiw3LDggYW5kIG9wZXJhLCBpZnJhbWVJbmRleCBpcyBlbnVtZXJhYmxlLCB0aGlzIGNvdWxkIGNhdXNlIGxlYWtcbiAgICBpZiAoZ2xvYmFsLm5hdmlnYXRvciAmJiAvXlxcZCsvLnRlc3Qoa2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIE9wZXJhIGFuZCBJRSBleHBvc2UgZ2xvYmFsIHZhcmlhYmxlcyBmb3IgSFRNTCBlbGVtZW50IElEcyAoaXNzdWUgIzI0MylcbiAgICBpZiAoL15tb2NoYS0vLnRlc3Qoa2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBtYXRjaGVkID0gb2suZmlsdGVyKGZ1bmN0aW9uIChvaykge1xuICAgICAgaWYgKH5vay5pbmRleE9mKCcqJykpIHtcbiAgICAgICAgcmV0dXJuIGtleS5pbmRleE9mKG9rLnNwbGl0KCcqJylbMF0pID09PSAwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGtleSA9PT0gb2s7XG4gICAgfSk7XG4gICAgcmV0dXJuICFtYXRjaGVkLmxlbmd0aCAmJiAoIWdsb2JhbC5uYXZpZ2F0b3IgfHwga2V5ICE9PSAnb25lcnJvcicpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhcmd1bWVudCBpcyBhbiBpbnN0YW5jZSBvZiBFcnJvciBvYmplY3Qgb3IgYSBkdWNrLXR5cGVkIGVxdWl2YWxlbnQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBlcnIgLSBvYmplY3QgdG8gY2hlY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBlcnIubWVzc2FnZSAtIGVycm9yIG1lc3NhZ2VcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0Vycm9yKGVycikge1xuICByZXR1cm4gZXJyIGluc3RhbmNlb2YgRXJyb3IgfHwgKGVyciAmJiB0eXBlb2YgZXJyLm1lc3NhZ2UgPT09ICdzdHJpbmcnKTtcbn1cblxuLyoqXG4gKlxuICogQ29udmVydHMgdGhyb3duIG5vbi1leHRlbnNpYmxlIHR5cGUgaW50byBwcm9wZXIgRXJyb3IuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdGhyb3duIC0gTm9uLWV4dGVuc2libGUgdHlwZSB0aHJvd24gYnkgY29kZVxuICogQHJldHVybiB7RXJyb3J9XG4gKi9cbmZ1bmN0aW9uIHRocm93bjJFcnJvcihlcnIpIHtcbiAgcmV0dXJuIG5ldyBFcnJvcihcbiAgICBgdGhlICR7dXRpbHMuY2Fub25pY2FsVHlwZShlcnIpfSAke3N0cmluZ2lmeShcbiAgICAgIGVyclxuICAgICl9IHdhcyB0aHJvd24sIHRocm93IGFuIEVycm9yIDopYFxuICApO1xufVxuXG5SdW5uZXIuY29uc3RhbnRzID0gY29uc3RhbnRzO1xuXG4vKipcbiAqIE5vZGUuanMnIGBFdmVudEVtaXR0ZXJgXG4gKiBAZXh0ZXJuYWwgRXZlbnRFbWl0dGVyXG4gKiBAc2VlIHtAbGluayBodHRwczovL25vZGVqcy5vcmcvYXBpL2V2ZW50cy5odG1sI2V2ZW50c19jbGFzc19ldmVudGVtaXR0ZXJ9XG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBSdW5uZXI7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuLyoqXG4gKiBAbW9kdWxlIEJhc2VcbiAqL1xuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICovXG5cbnZhciBkaWZmID0gcmVxdWlyZSgnZGlmZicpO1xudmFyIG1pbGxpc2Vjb25kcyA9IHJlcXVpcmUoJ21zJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIHN1cHBvcnRzQ29sb3IgPSByZXF1aXJlKCdzdXBwb3J0cy1jb2xvcicpO1xudmFyIHN5bWJvbHMgPSByZXF1aXJlKCdsb2ctc3ltYm9scycpO1xudmFyIGNvbnN0YW50cyA9IHJlcXVpcmUoJy4uL3J1bm5lcicpLmNvbnN0YW50cztcbnZhciBFVkVOVF9URVNUX1BBU1MgPSBjb25zdGFudHMuRVZFTlRfVEVTVF9QQVNTO1xudmFyIEVWRU5UX1RFU1RfRkFJTCA9IGNvbnN0YW50cy5FVkVOVF9URVNUX0ZBSUw7XG5cbmNvbnN0IGlzQnJvd3NlciA9IHV0aWxzLmlzQnJvd3NlcigpO1xuXG5mdW5jdGlvbiBnZXRCcm93c2VyV2luZG93U2l6ZSgpIHtcbiAgaWYgKCdpbm5lckhlaWdodCcgaW4gZ2xvYmFsKSB7XG4gICAgcmV0dXJuIFtnbG9iYWwuaW5uZXJIZWlnaHQsIGdsb2JhbC5pbm5lcldpZHRoXTtcbiAgfVxuICAvLyBJbiBhIFdlYiBXb3JrZXIsIHRoZSBET00gV2luZG93IGlzIG5vdCBhdmFpbGFibGUuXG4gIHJldHVybiBbNjQwLCA0ODBdO1xufVxuXG4vKipcbiAqIEV4cG9zZSBgQmFzZWAuXG4gKi9cblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gQmFzZTtcblxuLyoqXG4gKiBDaGVjayBpZiBib3RoIHN0ZGlvIHN0cmVhbXMgYXJlIGFzc29jaWF0ZWQgd2l0aCBhIHR0eS5cbiAqL1xuXG52YXIgaXNhdHR5ID0gaXNCcm93c2VyIHx8IChwcm9jZXNzLnN0ZG91dC5pc1RUWSAmJiBwcm9jZXNzLnN0ZGVyci5pc1RUWSk7XG5cbi8qKlxuICogU2F2ZSBsb2cgcmVmZXJlbmNlcyB0byBhdm9pZCB0ZXN0cyBpbnRlcmZlcmluZyAoc2VlIEdILTM2MDQpLlxuICovXG52YXIgY29uc29sZUxvZyA9IGNvbnNvbGUubG9nO1xuXG4vKipcbiAqIEVuYWJsZSBjb2xvcmluZyBieSBkZWZhdWx0LCBleGNlcHQgaW4gdGhlIGJyb3dzZXIgaW50ZXJmYWNlLlxuICovXG5cbmV4cG9ydHMudXNlQ29sb3JzID1cbiAgIWlzQnJvd3NlciAmJlxuICAoc3VwcG9ydHNDb2xvci5zdGRvdXQgfHwgcHJvY2Vzcy5lbnYuTU9DSEFfQ09MT1JTICE9PSB1bmRlZmluZWQpO1xuXG4vKipcbiAqIElubGluZSBkaWZmcyBpbnN0ZWFkIG9mICsvLVxuICovXG5cbmV4cG9ydHMuaW5saW5lRGlmZnMgPSBmYWxzZTtcblxuLyoqXG4gKiBUcnVuY2F0ZSBkaWZmcyBsb25nZXIgdGhhbiB0aGlzIHZhbHVlIHRvIGF2b2lkIHNsb3cgcGVyZm9ybWFuY2VcbiAqL1xuZXhwb3J0cy5tYXhEaWZmU2l6ZSA9IDgxOTI7XG5cbi8qKlxuICogRGVmYXVsdCBjb2xvciBtYXAuXG4gKi9cblxuZXhwb3J0cy5jb2xvcnMgPSB7XG4gIHBhc3M6IDkwLFxuICBmYWlsOiAzMSxcbiAgJ2JyaWdodCBwYXNzJzogOTIsXG4gICdicmlnaHQgZmFpbCc6IDkxLFxuICAnYnJpZ2h0IHllbGxvdyc6IDkzLFxuICBwZW5kaW5nOiAzNixcbiAgc3VpdGU6IDAsXG4gICdlcnJvciB0aXRsZSc6IDAsXG4gICdlcnJvciBtZXNzYWdlJzogMzEsXG4gICdlcnJvciBzdGFjayc6IDkwLFxuICBjaGVja21hcms6IDMyLFxuICBmYXN0OiA5MCxcbiAgbWVkaXVtOiAzMyxcbiAgc2xvdzogMzEsXG4gIGdyZWVuOiAzMixcbiAgbGlnaHQ6IDkwLFxuICAnZGlmZiBndXR0ZXInOiA5MCxcbiAgJ2RpZmYgYWRkZWQnOiAzMixcbiAgJ2RpZmYgcmVtb3ZlZCc6IDMxLFxuICAnZGlmZiBhZGRlZCBpbmxpbmUnOiAnMzA7NDInLFxuICAnZGlmZiByZW1vdmVkIGlubGluZSc6ICczMDs0MSdcbn07XG5cbi8qKlxuICogRGVmYXVsdCBzeW1ib2wgbWFwLlxuICovXG5cbmV4cG9ydHMuc3ltYm9scyA9IHtcbiAgb2s6IHN5bWJvbHMuc3VjY2VzcyxcbiAgZXJyOiBzeW1ib2xzLmVycm9yLFxuICBkb3Q6ICcuJyxcbiAgY29tbWE6ICcsJyxcbiAgYmFuZzogJyEnXG59O1xuXG4vKipcbiAqIENvbG9yIGBzdHJgIHdpdGggdGhlIGdpdmVuIGB0eXBlYCxcbiAqIGFsbG93aW5nIGNvbG9ycyB0byBiZSBkaXNhYmxlZCxcbiAqIGFzIHdlbGwgYXMgdXNlci1kZWZpbmVkIGNvbG9yXG4gKiBzY2hlbWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG52YXIgY29sb3IgPSAoZXhwb3J0cy5jb2xvciA9IGZ1bmN0aW9uICh0eXBlLCBzdHIpIHtcbiAgaWYgKCFleHBvcnRzLnVzZUNvbG9ycykge1xuICAgIHJldHVybiBTdHJpbmcoc3RyKTtcbiAgfVxuICByZXR1cm4gJ1xcdTAwMWJbJyArIGV4cG9ydHMuY29sb3JzW3R5cGVdICsgJ20nICsgc3RyICsgJ1xcdTAwMWJbMG0nO1xufSk7XG5cbi8qKlxuICogRXhwb3NlIHRlcm0gd2luZG93IHNpemUsIHdpdGggc29tZSBkZWZhdWx0cyBmb3Igd2hlbiBzdGRlcnIgaXMgbm90IGEgdHR5LlxuICovXG5cbmV4cG9ydHMud2luZG93ID0ge1xuICB3aWR0aDogNzVcbn07XG5cbmlmIChpc2F0dHkpIHtcbiAgaWYgKGlzQnJvd3Nlcikge1xuICAgIGV4cG9ydHMud2luZG93LndpZHRoID0gZ2V0QnJvd3NlcldpbmRvd1NpemUoKVsxXTtcbiAgfSBlbHNlIHtcbiAgICBleHBvcnRzLndpbmRvdy53aWR0aCA9IHByb2Nlc3Muc3Rkb3V0LmdldFdpbmRvd1NpemUoMSlbMF07XG4gIH1cbn1cblxuLyoqXG4gKiBFeHBvc2Ugc29tZSBiYXNpYyBjdXJzb3IgaW50ZXJhY3Rpb25zIHRoYXQgYXJlIGNvbW1vbiBhbW9uZyByZXBvcnRlcnMuXG4gKi9cblxuZXhwb3J0cy5jdXJzb3IgPSB7XG4gIGhpZGU6IGZ1bmN0aW9uICgpIHtcbiAgICBpc2F0dHkgJiYgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcdTAwMWJbPzI1bCcpO1xuICB9LFxuXG4gIHNob3c6IGZ1bmN0aW9uICgpIHtcbiAgICBpc2F0dHkgJiYgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcdTAwMWJbPzI1aCcpO1xuICB9LFxuXG4gIGRlbGV0ZUxpbmU6IGZ1bmN0aW9uICgpIHtcbiAgICBpc2F0dHkgJiYgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcdTAwMWJbMksnKTtcbiAgfSxcblxuICBiZWdpbm5pbmdPZkxpbmU6IGZ1bmN0aW9uICgpIHtcbiAgICBpc2F0dHkgJiYgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcdTAwMWJbMEcnKTtcbiAgfSxcblxuICBDUjogZnVuY3Rpb24gKCkge1xuICAgIGlmIChpc2F0dHkpIHtcbiAgICAgIGV4cG9ydHMuY3Vyc29yLmRlbGV0ZUxpbmUoKTtcbiAgICAgIGV4cG9ydHMuY3Vyc29yLmJlZ2lubmluZ09mTGluZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxyJyk7XG4gICAgfVxuICB9XG59O1xuXG52YXIgc2hvd0RpZmYgPSAoZXhwb3J0cy5zaG93RGlmZiA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgcmV0dXJuIChcbiAgICBlcnIgJiZcbiAgICBlcnIuc2hvd0RpZmYgIT09IGZhbHNlICYmXG4gICAgc2FtZVR5cGUoZXJyLmFjdHVhbCwgZXJyLmV4cGVjdGVkKSAmJlxuICAgIGVyci5leHBlY3RlZCAhPT0gdW5kZWZpbmVkXG4gICk7XG59KTtcblxuZnVuY3Rpb24gc3RyaW5naWZ5RGlmZk9ianMoZXJyKSB7XG4gIGlmICghdXRpbHMuaXNTdHJpbmcoZXJyLmFjdHVhbCkgfHwgIXV0aWxzLmlzU3RyaW5nKGVyci5leHBlY3RlZCkpIHtcbiAgICBlcnIuYWN0dWFsID0gdXRpbHMuc3RyaW5naWZ5KGVyci5hY3R1YWwpO1xuICAgIGVyci5leHBlY3RlZCA9IHV0aWxzLnN0cmluZ2lmeShlcnIuZXhwZWN0ZWQpO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGRpZmYgYmV0d2VlbiAyIHN0cmluZ3Mgd2l0aCBjb2xvdXJlZCBBTlNJIG91dHB1dC5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoZSBkaWZmIHdpbGwgYmUgZWl0aGVyIGlubGluZSBvciB1bmlmaWVkIGRlcGVuZGVudCBvbiB0aGUgdmFsdWVcbiAqIG9mIGBCYXNlLmlubGluZURpZmZgLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhY3R1YWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZFxuICogQHJldHVybiB7c3RyaW5nfSBEaWZmXG4gKi9cblxudmFyIGdlbmVyYXRlRGlmZiA9IChleHBvcnRzLmdlbmVyYXRlRGlmZiA9IGZ1bmN0aW9uIChhY3R1YWwsIGV4cGVjdGVkKSB7XG4gIHRyeSB7XG4gICAgdmFyIG1heExlbiA9IGV4cG9ydHMubWF4RGlmZlNpemU7XG4gICAgdmFyIHNraXBwZWQgPSAwO1xuICAgIGlmIChtYXhMZW4gPiAwKSB7XG4gICAgICBza2lwcGVkID0gTWF0aC5tYXgoYWN0dWFsLmxlbmd0aCAtIG1heExlbiwgZXhwZWN0ZWQubGVuZ3RoIC0gbWF4TGVuKTtcbiAgICAgIGFjdHVhbCA9IGFjdHVhbC5zbGljZSgwLCBtYXhMZW4pO1xuICAgICAgZXhwZWN0ZWQgPSBleHBlY3RlZC5zbGljZSgwLCBtYXhMZW4pO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0ID0gZXhwb3J0cy5pbmxpbmVEaWZmc1xuICAgICAgPyBpbmxpbmVEaWZmKGFjdHVhbCwgZXhwZWN0ZWQpXG4gICAgICA6IHVuaWZpZWREaWZmKGFjdHVhbCwgZXhwZWN0ZWQpO1xuICAgIGlmIChza2lwcGVkID4gMCkge1xuICAgICAgcmVzdWx0ID0gYCR7cmVzdWx0fVxcbiAgICAgIFttb2NoYV0gb3V0cHV0IHRydW5jYXRlZCB0byAke21heExlbn0gY2hhcmFjdGVycywgc2VlIFwibWF4RGlmZlNpemVcIiByZXBvcnRlci1vcHRpb25cXG5gO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB2YXIgbXNnID1cbiAgICAgICdcXG4gICAgICAnICtcbiAgICAgIGNvbG9yKCdkaWZmIGFkZGVkJywgJysgZXhwZWN0ZWQnKSArXG4gICAgICAnICcgK1xuICAgICAgY29sb3IoJ2RpZmYgcmVtb3ZlZCcsICctIGFjdHVhbDogIGZhaWxlZCB0byBnZW5lcmF0ZSBNb2NoYSBkaWZmJykgK1xuICAgICAgJ1xcbic7XG4gICAgcmV0dXJuIG1zZztcbiAgfVxufSk7XG5cbi8qKlxuICogVHJhdmVyc2VzIGVyci5jYXVzZSBhbmQgcmV0dXJucyBhbGwgc3RhY2sgdHJhY2VzXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHBhcmFtIHtTZXQ8RXJyb3I+fSBbc2Vlbl1cbiAqIEByZXR1cm4ge0Z1bGxFcnJvclN0YWNrfVxuICovXG52YXIgZ2V0RnVsbEVycm9yU3RhY2sgPSBmdW5jdGlvbiAoZXJyLCBzZWVuKSB7XG4gIGlmIChzZWVuICYmIHNlZW4uaGFzKGVycikpIHtcbiAgICByZXR1cm4geyBtZXNzYWdlOiAnJywgbXNnOiAnPGNpcmN1bGFyPicsIHN0YWNrOiAnJyB9O1xuICB9XG5cbiAgdmFyIG1lc3NhZ2U7XG5cbiAgaWYgKHR5cGVvZiBlcnIuaW5zcGVjdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIG1lc3NhZ2UgPSBlcnIuaW5zcGVjdCgpICsgJyc7XG4gIH0gZWxzZSBpZiAoZXJyLm1lc3NhZ2UgJiYgdHlwZW9mIGVyci5tZXNzYWdlLnRvU3RyaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgbWVzc2FnZSA9IGVyci5tZXNzYWdlICsgJyc7XG4gIH0gZWxzZSB7XG4gICAgbWVzc2FnZSA9ICcnO1xuICB9XG5cbiAgdmFyIG1zZztcbiAgdmFyIHN0YWNrID0gZXJyLnN0YWNrIHx8IG1lc3NhZ2U7XG4gIHZhciBpbmRleCA9IG1lc3NhZ2UgPyBzdGFjay5pbmRleE9mKG1lc3NhZ2UpIDogLTE7XG5cbiAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgIG1zZyA9IG1lc3NhZ2U7XG4gIH0gZWxzZSB7XG4gICAgaW5kZXggKz0gbWVzc2FnZS5sZW5ndGg7XG4gICAgbXNnID0gc3RhY2suc2xpY2UoMCwgaW5kZXgpO1xuICAgIC8vIHJlbW92ZSBtc2cgZnJvbSBzdGFja1xuICAgIHN0YWNrID0gc3RhY2suc2xpY2UoaW5kZXggKyAxKTtcblxuICAgIGlmIChlcnIuY2F1c2UpIHtcbiAgICAgIHNlZW4gPSBzZWVuIHx8IG5ldyBTZXQoKTtcbiAgICAgIHNlZW4uYWRkKGVycik7XG4gICAgICBjb25zdCBjYXVzZVN0YWNrID0gZ2V0RnVsbEVycm9yU3RhY2soZXJyLmNhdXNlLCBzZWVuKVxuICAgICAgc3RhY2sgKz0gJ1xcbiAgIENhdXNlZCBieTogJyArIGNhdXNlU3RhY2subXNnICsgKGNhdXNlU3RhY2suc3RhY2sgPyAnXFxuJyArIGNhdXNlU3RhY2suc3RhY2sgOiAnJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtZXNzYWdlLFxuICAgIG1zZyxcbiAgICBzdGFja1xuICB9O1xufTtcblxuLyoqXG4gKiBPdXRwdXRzIHRoZSBnaXZlbiBgZmFpbHVyZXNgIGFzIGEgbGlzdC5cbiAqXG4gKiBAcHVibGljXG4gKiBAbWVtYmVyb2YgTW9jaGEucmVwb3J0ZXJzLkJhc2VcbiAqIEB2YXJpYXRpb24gMVxuICogQHBhcmFtIHtPYmplY3RbXX0gZmFpbHVyZXMgLSBFYWNoIGlzIFRlc3QgaW5zdGFuY2Ugd2l0aCBjb3JyZXNwb25kaW5nXG4gKiAgICAgRXJyb3IgcHJvcGVydHlcbiAqL1xuZXhwb3J0cy5saXN0ID0gZnVuY3Rpb24gKGZhaWx1cmVzKSB7XG4gIHZhciBtdWx0aXBsZUVyciwgbXVsdGlwbGVUZXN0O1xuICBCYXNlLmNvbnNvbGVMb2coKTtcbiAgZmFpbHVyZXMuZm9yRWFjaChmdW5jdGlvbiAodGVzdCwgaSkge1xuICAgIC8vIGZvcm1hdFxuICAgIHZhciBmbXQgPVxuICAgICAgY29sb3IoJ2Vycm9yIHRpdGxlJywgJyAgJXMpICVzOlxcbicpICtcbiAgICAgIGNvbG9yKCdlcnJvciBtZXNzYWdlJywgJyAgICAgJXMnKSArXG4gICAgICBjb2xvcignZXJyb3Igc3RhY2snLCAnXFxuJXNcXG4nKTtcblxuICAgIC8vIG1zZ1xuICAgIHZhciBlcnI7XG4gICAgaWYgKHRlc3QuZXJyICYmIHRlc3QuZXJyLm11bHRpcGxlKSB7XG4gICAgICBpZiAobXVsdGlwbGVUZXN0ICE9PSB0ZXN0KSB7XG4gICAgICAgIG11bHRpcGxlVGVzdCA9IHRlc3Q7XG4gICAgICAgIG11bHRpcGxlRXJyID0gW3Rlc3QuZXJyXS5jb25jYXQodGVzdC5lcnIubXVsdGlwbGUpO1xuICAgICAgfVxuICAgICAgZXJyID0gbXVsdGlwbGVFcnIuc2hpZnQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXJyID0gdGVzdC5lcnI7XG4gICAgfVxuXG4gICAgdmFyIHsgbWVzc2FnZSwgbXNnLCBzdGFjayB9ID0gZ2V0RnVsbEVycm9yU3RhY2soZXJyKTtcblxuICAgIC8vIHVuY2F1Z2h0XG4gICAgaWYgKGVyci51bmNhdWdodCkge1xuICAgICAgbXNnID0gJ1VuY2F1Z2h0ICcgKyBtc2c7XG4gICAgfVxuICAgIC8vIGV4cGxpY2l0bHkgc2hvdyBkaWZmXG4gICAgaWYgKCFleHBvcnRzLmhpZGVEaWZmICYmIHNob3dEaWZmKGVycikpIHtcbiAgICAgIHN0cmluZ2lmeURpZmZPYmpzKGVycik7XG4gICAgICBmbXQgPVxuICAgICAgICBjb2xvcignZXJyb3IgdGl0bGUnLCAnICAlcykgJXM6XFxuJXMnKSArIGNvbG9yKCdlcnJvciBzdGFjaycsICdcXG4lc1xcbicpO1xuICAgICAgdmFyIG1hdGNoID0gbWVzc2FnZS5tYXRjaCgvXihbXjpdKyk6IGV4cGVjdGVkLyk7XG4gICAgICBtc2cgPSAnXFxuICAgICAgJyArIGNvbG9yKCdlcnJvciBtZXNzYWdlJywgbWF0Y2ggPyBtYXRjaFsxXSA6IG1zZyk7XG5cbiAgICAgIG1zZyArPSBnZW5lcmF0ZURpZmYoZXJyLmFjdHVhbCwgZXJyLmV4cGVjdGVkKTtcbiAgICB9XG5cbiAgICAvLyBpbmRlbnQgc3RhY2sgdHJhY2VcbiAgICBzdGFjayA9IHN0YWNrLnJlcGxhY2UoL14vZ20sICcgICcpO1xuXG4gICAgLy8gaW5kZW50ZWQgdGVzdCB0aXRsZVxuICAgIHZhciB0ZXN0VGl0bGUgPSAnJztcbiAgICB0ZXN0LnRpdGxlUGF0aCgpLmZvckVhY2goZnVuY3Rpb24gKHN0ciwgaW5kZXgpIHtcbiAgICAgIGlmIChpbmRleCAhPT0gMCkge1xuICAgICAgICB0ZXN0VGl0bGUgKz0gJ1xcbiAgICAgJztcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5kZXg7IGkrKykge1xuICAgICAgICB0ZXN0VGl0bGUgKz0gJyAgJztcbiAgICAgIH1cbiAgICAgIHRlc3RUaXRsZSArPSBzdHI7XG4gICAgfSk7XG5cbiAgICBCYXNlLmNvbnNvbGVMb2coZm10LCBpICsgMSwgdGVzdFRpdGxlLCBtc2csIHN0YWNrKTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBuZXcgYEJhc2VgIHJlcG9ydGVyIGluc3RhbmNlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQWxsIG90aGVyIHJlcG9ydGVycyBnZW5lcmFsbHkgaW5oZXJpdCBmcm9tIHRoaXMgcmVwb3J0ZXIuXG4gKlxuICogQHB1YmxpY1xuICogQGNsYXNzXG4gKiBAbWVtYmVyb2YgTW9jaGEucmVwb3J0ZXJzXG4gKiBAcGFyYW0ge1J1bm5lcn0gcnVubmVyIC0gSW5zdGFuY2UgdHJpZ2dlcnMgcmVwb3J0ZXIgYWN0aW9ucy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBydW5uZXIgb3B0aW9uc1xuICovXG5mdW5jdGlvbiBCYXNlKHJ1bm5lciwgb3B0aW9ucykge1xuICB2YXIgZmFpbHVyZXMgPSAodGhpcy5mYWlsdXJlcyA9IFtdKTtcblxuICBpZiAoIXJ1bm5lcikge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ01pc3NpbmcgcnVubmVyIGFyZ3VtZW50Jyk7XG4gIH1cbiAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdGhpcy5ydW5uZXIgPSBydW5uZXI7XG4gIHRoaXMuc3RhdHMgPSBydW5uZXIuc3RhdHM7IC8vIGFzc2lnbmVkIHNvIFJlcG9ydGVycyBrZWVwIGEgY2xvc2VyIHJlZmVyZW5jZVxuXG4gIHZhciBtYXhEaWZmU2l6ZU9wdCA9XG4gICAgdGhpcy5vcHRpb25zLnJlcG9ydGVyT3B0aW9uICYmIHRoaXMub3B0aW9ucy5yZXBvcnRlck9wdGlvbi5tYXhEaWZmU2l6ZTtcbiAgaWYgKG1heERpZmZTaXplT3B0ICE9PSB1bmRlZmluZWQgJiYgIWlzTmFOKE51bWJlcihtYXhEaWZmU2l6ZU9wdCkpKSB7XG4gICAgZXhwb3J0cy5tYXhEaWZmU2l6ZSA9IE51bWJlcihtYXhEaWZmU2l6ZU9wdCk7XG4gIH1cblxuICBydW5uZXIub24oRVZFTlRfVEVTVF9QQVNTLCBmdW5jdGlvbiAodGVzdCkge1xuICAgIGlmICh0ZXN0LmR1cmF0aW9uID4gdGVzdC5zbG93KCkpIHtcbiAgICAgIHRlc3Quc3BlZWQgPSAnc2xvdyc7XG4gICAgfSBlbHNlIGlmICh0ZXN0LmR1cmF0aW9uID4gdGVzdC5zbG93KCkgLyAyKSB7XG4gICAgICB0ZXN0LnNwZWVkID0gJ21lZGl1bSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRlc3Quc3BlZWQgPSAnZmFzdCc7XG4gICAgfVxuICB9KTtcblxuICBydW5uZXIub24oRVZFTlRfVEVTVF9GQUlMLCBmdW5jdGlvbiAodGVzdCwgZXJyKSB7XG4gICAgaWYgKHNob3dEaWZmKGVycikpIHtcbiAgICAgIHN0cmluZ2lmeURpZmZPYmpzKGVycik7XG4gICAgfVxuICAgIC8vIG1vcmUgdGhhbiBvbmUgZXJyb3IgcGVyIHRlc3RcbiAgICBpZiAodGVzdC5lcnIgJiYgZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHRlc3QuZXJyLm11bHRpcGxlID0gKHRlc3QuZXJyLm11bHRpcGxlIHx8IFtdKS5jb25jYXQoZXJyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGVzdC5lcnIgPSBlcnI7XG4gICAgfVxuICAgIGZhaWx1cmVzLnB1c2godGVzdCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIE91dHB1dHMgY29tbW9uIGVwaWxvZ3VlIHVzZWQgYnkgbWFueSBvZiB0aGUgYnVuZGxlZCByZXBvcnRlcnMuXG4gKlxuICogQHB1YmxpY1xuICogQG1lbWJlcm9mIE1vY2hhLnJlcG9ydGVyc1xuICovXG5CYXNlLnByb3RvdHlwZS5lcGlsb2d1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRzID0gdGhpcy5zdGF0cztcbiAgdmFyIGZtdDtcblxuICBCYXNlLmNvbnNvbGVMb2coKTtcblxuICAvLyBwYXNzZXNcbiAgZm10ID1cbiAgICBjb2xvcignYnJpZ2h0IHBhc3MnLCAnICcpICtcbiAgICBjb2xvcignZ3JlZW4nLCAnICVkIHBhc3NpbmcnKSArXG4gICAgY29sb3IoJ2xpZ2h0JywgJyAoJXMpJyk7XG5cbiAgQmFzZS5jb25zb2xlTG9nKGZtdCwgc3RhdHMucGFzc2VzIHx8IDAsIG1pbGxpc2Vjb25kcyhzdGF0cy5kdXJhdGlvbikpO1xuXG4gIC8vIHBlbmRpbmdcbiAgaWYgKHN0YXRzLnBlbmRpbmcpIHtcbiAgICBmbXQgPSBjb2xvcigncGVuZGluZycsICcgJykgKyBjb2xvcigncGVuZGluZycsICcgJWQgcGVuZGluZycpO1xuXG4gICAgQmFzZS5jb25zb2xlTG9nKGZtdCwgc3RhdHMucGVuZGluZyk7XG4gIH1cblxuICAvLyBmYWlsdXJlc1xuICBpZiAoc3RhdHMuZmFpbHVyZXMpIHtcbiAgICBmbXQgPSBjb2xvcignZmFpbCcsICcgICVkIGZhaWxpbmcnKTtcblxuICAgIEJhc2UuY29uc29sZUxvZyhmbXQsIHN0YXRzLmZhaWx1cmVzKTtcblxuICAgIEJhc2UubGlzdCh0aGlzLmZhaWx1cmVzKTtcbiAgICBCYXNlLmNvbnNvbGVMb2coKTtcbiAgfVxuXG4gIEJhc2UuY29uc29sZUxvZygpO1xufTtcblxuLyoqXG4gKiBQYWRzIHRoZSBnaXZlbiBgc3RyYCB0byBgbGVuYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHBhcmFtIHtzdHJpbmd9IGxlblxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBwYWQoc3RyLCBsZW4pIHtcbiAgc3RyID0gU3RyaW5nKHN0cik7XG4gIHJldHVybiBBcnJheShsZW4gLSBzdHIubGVuZ3RoICsgMSkuam9pbignICcpICsgc3RyO1xufVxuXG4vKipcbiAqIFJldHVybnMgaW5saW5lIGRpZmYgYmV0d2VlbiAyIHN0cmluZ3Mgd2l0aCBjb2xvdXJlZCBBTlNJIG91dHB1dC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtTdHJpbmd9IGFjdHVhbFxuICogQHBhcmFtIHtTdHJpbmd9IGV4cGVjdGVkXG4gKiBAcmV0dXJuIHtzdHJpbmd9IERpZmZcbiAqL1xuZnVuY3Rpb24gaW5saW5lRGlmZihhY3R1YWwsIGV4cGVjdGVkKSB7XG4gIHZhciBtc2cgPSBlcnJvckRpZmYoYWN0dWFsLCBleHBlY3RlZCk7XG5cbiAgLy8gbGluZW5vc1xuICB2YXIgbGluZXMgPSBtc2cuc3BsaXQoJ1xcbicpO1xuICBpZiAobGluZXMubGVuZ3RoID4gNCkge1xuICAgIHZhciB3aWR0aCA9IFN0cmluZyhsaW5lcy5sZW5ndGgpLmxlbmd0aDtcbiAgICBtc2cgPSBsaW5lc1xuICAgICAgLm1hcChmdW5jdGlvbiAoc3RyLCBpKSB7XG4gICAgICAgIHJldHVybiBwYWQoKytpLCB3aWR0aCkgKyAnIHwnICsgJyAnICsgc3RyO1xuICAgICAgfSlcbiAgICAgIC5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8vIGxlZ2VuZFxuICBtc2cgPVxuICAgICdcXG4nICtcbiAgICBjb2xvcignZGlmZiByZW1vdmVkIGlubGluZScsICdhY3R1YWwnKSArXG4gICAgJyAnICtcbiAgICBjb2xvcignZGlmZiBhZGRlZCBpbmxpbmUnLCAnZXhwZWN0ZWQnKSArXG4gICAgJ1xcblxcbicgK1xuICAgIG1zZyArXG4gICAgJ1xcbic7XG5cbiAgLy8gaW5kZW50XG4gIG1zZyA9IG1zZy5yZXBsYWNlKC9eL2dtLCAnICAgICAgJyk7XG4gIHJldHVybiBtc2c7XG59XG5cbi8qKlxuICogUmV0dXJucyB1bmlmaWVkIGRpZmYgYmV0d2VlbiB0d28gc3RyaW5ncyB3aXRoIGNvbG91cmVkIEFOU0kgb3V0cHV0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gYWN0dWFsXG4gKiBAcGFyYW0ge1N0cmluZ30gZXhwZWN0ZWRcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGRpZmYuXG4gKi9cbmZ1bmN0aW9uIHVuaWZpZWREaWZmKGFjdHVhbCwgZXhwZWN0ZWQpIHtcbiAgdmFyIGluZGVudCA9ICcgICAgICAnO1xuICBmdW5jdGlvbiBjbGVhblVwKGxpbmUpIHtcbiAgICBpZiAobGluZVswXSA9PT0gJysnKSB7XG4gICAgICByZXR1cm4gaW5kZW50ICsgY29sb3JMaW5lcygnZGlmZiBhZGRlZCcsIGxpbmUpO1xuICAgIH1cbiAgICBpZiAobGluZVswXSA9PT0gJy0nKSB7XG4gICAgICByZXR1cm4gaW5kZW50ICsgY29sb3JMaW5lcygnZGlmZiByZW1vdmVkJywgbGluZSk7XG4gICAgfVxuICAgIGlmIChsaW5lLm1hdGNoKC9AQC8pKSB7XG4gICAgICByZXR1cm4gJy0tJztcbiAgICB9XG4gICAgaWYgKGxpbmUubWF0Y2goL1xcXFwgTm8gbmV3bGluZS8pKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGluZGVudCArIGxpbmU7XG4gIH1cbiAgZnVuY3Rpb24gbm90QmxhbmsobGluZSkge1xuICAgIHJldHVybiB0eXBlb2YgbGluZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbGluZSAhPT0gbnVsbDtcbiAgfVxuICB2YXIgbXNnID0gZGlmZi5jcmVhdGVQYXRjaCgnc3RyaW5nJywgYWN0dWFsLCBleHBlY3RlZCk7XG4gIHZhciBsaW5lcyA9IG1zZy5zcGxpdCgnXFxuJykuc3BsaWNlKDUpO1xuICByZXR1cm4gKFxuICAgICdcXG4gICAgICAnICtcbiAgICBjb2xvckxpbmVzKCdkaWZmIGFkZGVkJywgJysgZXhwZWN0ZWQnKSArXG4gICAgJyAnICtcbiAgICBjb2xvckxpbmVzKCdkaWZmIHJlbW92ZWQnLCAnLSBhY3R1YWwnKSArXG4gICAgJ1xcblxcbicgK1xuICAgIGxpbmVzLm1hcChjbGVhblVwKS5maWx0ZXIobm90QmxhbmspLmpvaW4oJ1xcbicpXG4gICk7XG59XG5cbi8qKlxuICogUmV0dXJucyBjaGFyYWN0ZXIgZGlmZiBmb3IgYGVycmAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBhY3R1YWxcbiAqIEBwYXJhbSB7U3RyaW5nfSBleHBlY3RlZFxuICogQHJldHVybiB7c3RyaW5nfSB0aGUgZGlmZlxuICovXG5mdW5jdGlvbiBlcnJvckRpZmYoYWN0dWFsLCBleHBlY3RlZCkge1xuICByZXR1cm4gZGlmZlxuICAgIC5kaWZmV29yZHNXaXRoU3BhY2UoYWN0dWFsLCBleHBlY3RlZClcbiAgICAubWFwKGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgIGlmIChzdHIuYWRkZWQpIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yTGluZXMoJ2RpZmYgYWRkZWQgaW5saW5lJywgc3RyLnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdHIucmVtb3ZlZCkge1xuICAgICAgICByZXR1cm4gY29sb3JMaW5lcygnZGlmZiByZW1vdmVkIGlubGluZScsIHN0ci52YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RyLnZhbHVlO1xuICAgIH0pXG4gICAgLmpvaW4oJycpO1xufVxuXG4vKipcbiAqIENvbG9ycyBsaW5lcyBmb3IgYHN0cmAsIHVzaW5nIHRoZSBjb2xvciBgbmFtZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGNvbG9yTGluZXMobmFtZSwgc3RyKSB7XG4gIHJldHVybiBzdHJcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLm1hcChmdW5jdGlvbiAoc3RyKSB7XG4gICAgICByZXR1cm4gY29sb3IobmFtZSwgc3RyKTtcbiAgICB9KVxuICAgIC5qb2luKCdcXG4nKTtcbn1cblxuLyoqXG4gKiBPYmplY3QjdG9TdHJpbmcgcmVmZXJlbmNlLlxuICovXG52YXIgb2JqVG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vKipcbiAqIENoZWNrcyB0aGF0IGEgLyBiIGhhdmUgdGhlIHNhbWUgdHlwZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGFcbiAqIEBwYXJhbSB7T2JqZWN0fSBiXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBzYW1lVHlwZShhLCBiKSB7XG4gIHJldHVybiBvYmpUb1N0cmluZy5jYWxsKGEpID09PSBvYmpUb1N0cmluZy5jYWxsKGIpO1xufVxuXG5CYXNlLmNvbnNvbGVMb2cgPSBjb25zb2xlTG9nO1xuXG5CYXNlLmFic3RyYWN0ID0gdHJ1ZTtcblxuLyoqXG4gKiBBbiBvYmplY3Qgd2l0aCBhbGwgc3RhY2sgdHJhY2VzIHJlY3Vyc2l2ZWx5IG1vdW50ZWQgZnJvbSBlYWNoIGVyci5jYXVzZVxuICogQG1lbWJlcm9mIG1vZHVsZTpsaWIvcmVwb3J0ZXJzL2Jhc2VcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEZ1bGxFcnJvclN0YWNrXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1zZ1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0YWNrXG4gKi9cbiIsICIndXNlIHN0cmljdCc7XG4vKipcbiAqIEBtb2R1bGUgRG90XG4gKi9cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgQmFzZSA9IHJlcXVpcmUoJy4vYmFzZScpO1xudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnLi4vdXRpbHMnKS5pbmhlcml0cztcbnZhciBjb25zdGFudHMgPSByZXF1aXJlKCcuLi9ydW5uZXInKS5jb25zdGFudHM7XG52YXIgRVZFTlRfVEVTVF9QQVNTID0gY29uc3RhbnRzLkVWRU5UX1RFU1RfUEFTUztcbnZhciBFVkVOVF9URVNUX0ZBSUwgPSBjb25zdGFudHMuRVZFTlRfVEVTVF9GQUlMO1xudmFyIEVWRU5UX1JVTl9CRUdJTiA9IGNvbnN0YW50cy5FVkVOVF9SVU5fQkVHSU47XG52YXIgRVZFTlRfVEVTVF9QRU5ESU5HID0gY29uc3RhbnRzLkVWRU5UX1RFU1RfUEVORElORztcbnZhciBFVkVOVF9SVU5fRU5EID0gY29uc3RhbnRzLkVWRU5UX1JVTl9FTkQ7XG5cbi8qKlxuICogRXhwb3NlIGBEb3RgLlxuICovXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IERvdDtcblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgbmV3IGBEb3RgIHJlcG9ydGVyIGluc3RhbmNlLlxuICpcbiAqIEBwdWJsaWNcbiAqIEBjbGFzc1xuICogQG1lbWJlcm9mIE1vY2hhLnJlcG9ydGVyc1xuICogQGV4dGVuZHMgTW9jaGEucmVwb3J0ZXJzLkJhc2VcbiAqIEBwYXJhbSB7UnVubmVyfSBydW5uZXIgLSBJbnN0YW5jZSB0cmlnZ2VycyByZXBvcnRlciBhY3Rpb25zLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIHJ1bm5lciBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIERvdChydW5uZXIsIG9wdGlvbnMpIHtcbiAgQmFzZS5jYWxsKHRoaXMsIHJ1bm5lciwgb3B0aW9ucyk7XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgd2lkdGggPSAoQmFzZS53aW5kb3cud2lkdGggKiAwLjc1KSB8IDA7XG4gIHZhciBuID0gLTE7XG5cbiAgcnVubmVyLm9uKEVWRU5UX1JVTl9CRUdJTiwgZnVuY3Rpb24gKCkge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgfSk7XG5cbiAgcnVubmVyLm9uKEVWRU5UX1RFU1RfUEVORElORywgZnVuY3Rpb24gKCkge1xuICAgIGlmICgrK24gJSB3aWR0aCA9PT0gMCkge1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbiAgJyk7XG4gICAgfVxuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKEJhc2UuY29sb3IoJ3BlbmRpbmcnLCBCYXNlLnN5bWJvbHMuY29tbWEpKTtcbiAgfSk7XG5cbiAgcnVubmVyLm9uKEVWRU5UX1RFU1RfUEFTUywgZnVuY3Rpb24gKHRlc3QpIHtcbiAgICBpZiAoKytuICUgd2lkdGggPT09IDApIHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4gICcpO1xuICAgIH1cbiAgICBpZiAodGVzdC5zcGVlZCA9PT0gJ3Nsb3cnKSB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShCYXNlLmNvbG9yKCdicmlnaHQgeWVsbG93JywgQmFzZS5zeW1ib2xzLmRvdCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShCYXNlLmNvbG9yKHRlc3Quc3BlZWQsIEJhc2Uuc3ltYm9scy5kb3QpKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJ1bm5lci5vbihFVkVOVF9URVNUX0ZBSUwsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoKytuICUgd2lkdGggPT09IDApIHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4gICcpO1xuICAgIH1cbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShCYXNlLmNvbG9yKCdmYWlsJywgQmFzZS5zeW1ib2xzLmJhbmcpKTtcbiAgfSk7XG5cbiAgcnVubmVyLm9uY2UoRVZFTlRfUlVOX0VORCwgZnVuY3Rpb24gKCkge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgICBzZWxmLmVwaWxvZ3VlKCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEluaGVyaXQgZnJvbSBgQmFzZS5wcm90b3R5cGVgLlxuICovXG5pbmhlcml0cyhEb3QsIEJhc2UpO1xuXG5Eb3QuZGVzY3JpcHRpb24gPSAnZG90IG1hdHJpeCByZXByZXNlbnRhdGlvbic7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuLyoqXG4gKiBAbW9kdWxlIERvY1xuICovXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIEJhc2UgPSByZXF1aXJlKCcuL2Jhc2UnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgY29uc3RhbnRzID0gcmVxdWlyZSgnLi4vcnVubmVyJykuY29uc3RhbnRzO1xudmFyIEVWRU5UX1RFU1RfUEFTUyA9IGNvbnN0YW50cy5FVkVOVF9URVNUX1BBU1M7XG52YXIgRVZFTlRfVEVTVF9GQUlMID0gY29uc3RhbnRzLkVWRU5UX1RFU1RfRkFJTDtcbnZhciBFVkVOVF9TVUlURV9CRUdJTiA9IGNvbnN0YW50cy5FVkVOVF9TVUlURV9CRUdJTjtcbnZhciBFVkVOVF9TVUlURV9FTkQgPSBjb25zdGFudHMuRVZFTlRfU1VJVEVfRU5EO1xuXG4vKipcbiAqIEV4cG9zZSBgRG9jYC5cbiAqL1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBEb2M7XG5cbi8qKlxuICogQ29uc3RydWN0cyBhIG5ldyBgRG9jYCByZXBvcnRlciBpbnN0YW5jZS5cbiAqXG4gKiBAcHVibGljXG4gKiBAY2xhc3NcbiAqIEBtZW1iZXJvZiBNb2NoYS5yZXBvcnRlcnNcbiAqIEBleHRlbmRzIE1vY2hhLnJlcG9ydGVycy5CYXNlXG4gKiBAcGFyYW0ge1J1bm5lcn0gcnVubmVyIC0gSW5zdGFuY2UgdHJpZ2dlcnMgcmVwb3J0ZXIgYWN0aW9ucy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBydW5uZXIgb3B0aW9uc1xuICovXG5mdW5jdGlvbiBEb2MocnVubmVyLCBvcHRpb25zKSB7XG4gIEJhc2UuY2FsbCh0aGlzLCBydW5uZXIsIG9wdGlvbnMpO1xuXG4gIHZhciBpbmRlbnRzID0gMjtcblxuICBmdW5jdGlvbiBpbmRlbnQoKSB7XG4gICAgcmV0dXJuIEFycmF5KGluZGVudHMpLmpvaW4oJyAgJyk7XG4gIH1cblxuICBydW5uZXIub24oRVZFTlRfU1VJVEVfQkVHSU4sIGZ1bmN0aW9uIChzdWl0ZSkge1xuICAgIGlmIChzdWl0ZS5yb290KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgICsraW5kZW50cztcbiAgICBCYXNlLmNvbnNvbGVMb2coJyVzPHNlY3Rpb24gY2xhc3M9XCJzdWl0ZVwiPicsIGluZGVudCgpKTtcbiAgICArK2luZGVudHM7XG4gICAgQmFzZS5jb25zb2xlTG9nKCclczxoMT4lczwvaDE+JywgaW5kZW50KCksIHV0aWxzLmVzY2FwZShzdWl0ZS50aXRsZSkpO1xuICAgIEJhc2UuY29uc29sZUxvZygnJXM8ZGw+JywgaW5kZW50KCkpO1xuICB9KTtcblxuICBydW5uZXIub24oRVZFTlRfU1VJVEVfRU5ELCBmdW5jdGlvbiAoc3VpdGUpIHtcbiAgICBpZiAoc3VpdGUucm9vdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBCYXNlLmNvbnNvbGVMb2coJyVzPC9kbD4nLCBpbmRlbnQoKSk7XG4gICAgLS1pbmRlbnRzO1xuICAgIEJhc2UuY29uc29sZUxvZygnJXM8L3NlY3Rpb24+JywgaW5kZW50KCkpO1xuICAgIC0taW5kZW50cztcbiAgfSk7XG5cbiAgcnVubmVyLm9uKEVWRU5UX1RFU1RfUEFTUywgZnVuY3Rpb24gKHRlc3QpIHtcbiAgICBCYXNlLmNvbnNvbGVMb2coJyVzICA8ZHQ+JXM8L2R0PicsIGluZGVudCgpLCB1dGlscy5lc2NhcGUodGVzdC50aXRsZSkpO1xuICAgIEJhc2UuY29uc29sZUxvZygnJXMgIDxkdD4lczwvZHQ+JywgaW5kZW50KCksIHV0aWxzLmVzY2FwZSh0ZXN0LmZpbGUpKTtcbiAgICB2YXIgY29kZSA9IHV0aWxzLmVzY2FwZSh1dGlscy5jbGVhbih0ZXN0LmJvZHkpKTtcbiAgICBCYXNlLmNvbnNvbGVMb2coJyVzICA8ZGQ+PHByZT48Y29kZT4lczwvY29kZT48L3ByZT48L2RkPicsIGluZGVudCgpLCBjb2RlKTtcbiAgfSk7XG5cbiAgcnVubmVyLm9uKEVWRU5UX1RFU1RfRkFJTCwgZnVuY3Rpb24gKHRlc3QsIGVycikge1xuICAgIEJhc2UuY29uc29sZUxvZyhcbiAgICAgICclcyAgPGR0IGNsYXNzPVwiZXJyb3JcIj4lczwvZHQ+JyxcbiAgICAgIGluZGVudCgpLFxuICAgICAgdXRpbHMuZXNjYXBlKHRlc3QudGl0bGUpXG4gICAgKTtcbiAgICBCYXNlLmNvbnNvbGVMb2coXG4gICAgICAnJXMgIDxkdCBjbGFzcz1cImVycm9yXCI+JXM8L2R0PicsXG4gICAgICBpbmRlbnQoKSxcbiAgICAgIHV0aWxzLmVzY2FwZSh0ZXN0LmZpbGUpXG4gICAgKTtcbiAgICB2YXIgY29kZSA9IHV0aWxzLmVzY2FwZSh1dGlscy5jbGVhbih0ZXN0LmJvZHkpKTtcbiAgICBCYXNlLmNvbnNvbGVMb2coXG4gICAgICAnJXMgIDxkZCBjbGFzcz1cImVycm9yXCI+PHByZT48Y29kZT4lczwvY29kZT48L3ByZT48L2RkPicsXG4gICAgICBpbmRlbnQoKSxcbiAgICAgIGNvZGVcbiAgICApO1xuICAgIEJhc2UuY29uc29sZUxvZyhcbiAgICAgICclcyAgPGRkIGNsYXNzPVwiZXJyb3JcIj4lczwvZGQ+JyxcbiAgICAgIGluZGVudCgpLFxuICAgICAgdXRpbHMuZXNjYXBlKGVycilcbiAgICApO1xuICB9KTtcbn1cblxuRG9jLmRlc2NyaXB0aW9uID0gJ0hUTUwgZG9jdW1lbnRhdGlvbic7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuLyoqXG4gKiBAbW9kdWxlIFRBUFxuICovXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG52YXIgQmFzZSA9IHJlcXVpcmUoJy4vYmFzZScpO1xudmFyIGNvbnN0YW50cyA9IHJlcXVpcmUoJy4uL3J1bm5lcicpLmNvbnN0YW50cztcbnZhciBFVkVOVF9URVNUX1BBU1MgPSBjb25zdGFudHMuRVZFTlRfVEVTVF9QQVNTO1xudmFyIEVWRU5UX1RFU1RfRkFJTCA9IGNvbnN0YW50cy5FVkVOVF9URVNUX0ZBSUw7XG52YXIgRVZFTlRfUlVOX0JFR0lOID0gY29uc3RhbnRzLkVWRU5UX1JVTl9CRUdJTjtcbnZhciBFVkVOVF9SVU5fRU5EID0gY29uc3RhbnRzLkVWRU5UX1JVTl9FTkQ7XG52YXIgRVZFTlRfVEVTVF9QRU5ESU5HID0gY29uc3RhbnRzLkVWRU5UX1RFU1RfUEVORElORztcbnZhciBFVkVOVF9URVNUX0VORCA9IGNvbnN0YW50cy5FVkVOVF9URVNUX0VORDtcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJy4uL3V0aWxzJykuaW5oZXJpdHM7XG52YXIgc3ByaW50ZiA9IHV0aWwuZm9ybWF0O1xuXG4vKipcbiAqIEV4cG9zZSBgVEFQYC5cbiAqL1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBUQVA7XG5cbi8qKlxuICogQ29uc3RydWN0cyBhIG5ldyBgVEFQYCByZXBvcnRlciBpbnN0YW5jZS5cbiAqXG4gKiBAcHVibGljXG4gKiBAY2xhc3NcbiAqIEBtZW1iZXJvZiBNb2NoYS5yZXBvcnRlcnNcbiAqIEBleHRlbmRzIE1vY2hhLnJlcG9ydGVycy5CYXNlXG4gKiBAcGFyYW0ge1J1bm5lcn0gcnVubmVyIC0gSW5zdGFuY2UgdHJpZ2dlcnMgcmVwb3J0ZXIgYWN0aW9ucy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBydW5uZXIgb3B0aW9uc1xuICovXG5mdW5jdGlvbiBUQVAocnVubmVyLCBvcHRpb25zKSB7XG4gIEJhc2UuY2FsbCh0aGlzLCBydW5uZXIsIG9wdGlvbnMpO1xuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIG4gPSAxO1xuXG4gIHZhciB0YXBWZXJzaW9uID0gJzEyJztcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5yZXBvcnRlck9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5yZXBvcnRlck9wdGlvbnMudGFwVmVyc2lvbikge1xuICAgICAgdGFwVmVyc2lvbiA9IG9wdGlvbnMucmVwb3J0ZXJPcHRpb25zLnRhcFZlcnNpb24udG9TdHJpbmcoKTtcbiAgICB9XG4gIH1cblxuICB0aGlzLl9wcm9kdWNlciA9IGNyZWF0ZVByb2R1Y2VyKHRhcFZlcnNpb24pO1xuXG4gIHJ1bm5lci5vbmNlKEVWRU5UX1JVTl9CRUdJTiwgZnVuY3Rpb24gKCkge1xuICAgIHNlbGYuX3Byb2R1Y2VyLndyaXRlVmVyc2lvbigpO1xuICB9KTtcblxuICBydW5uZXIub24oRVZFTlRfVEVTVF9FTkQsIGZ1bmN0aW9uICgpIHtcbiAgICArK247XG4gIH0pO1xuXG4gIHJ1bm5lci5vbihFVkVOVF9URVNUX1BFTkRJTkcsIGZ1bmN0aW9uICh0ZXN0KSB7XG4gICAgc2VsZi5fcHJvZHVjZXIud3JpdGVQZW5kaW5nKG4sIHRlc3QpO1xuICB9KTtcblxuICBydW5uZXIub24oRVZFTlRfVEVTVF9QQVNTLCBmdW5jdGlvbiAodGVzdCkge1xuICAgIHNlbGYuX3Byb2R1Y2VyLndyaXRlUGFzcyhuLCB0ZXN0KTtcbiAgfSk7XG5cbiAgcnVubmVyLm9uKEVWRU5UX1RFU1RfRkFJTCwgZnVuY3Rpb24gKHRlc3QsIGVycikge1xuICAgIHNlbGYuX3Byb2R1Y2VyLndyaXRlRmFpbChuLCB0ZXN0LCBlcnIpO1xuICB9KTtcblxuICBydW5uZXIub25jZShFVkVOVF9SVU5fRU5ELCBmdW5jdGlvbiAoKSB7XG4gICAgc2VsZi5fcHJvZHVjZXIud3JpdGVFcGlsb2d1ZShydW5uZXIuc3RhdHMpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBJbmhlcml0IGZyb20gYEJhc2UucHJvdG90eXBlYC5cbiAqL1xuaW5oZXJpdHMoVEFQLCBCYXNlKTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgVEFQLXNhZmUgdGl0bGUgb2YgYHRlc3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1Rlc3R9IHRlc3QgLSBUZXN0IGluc3RhbmNlLlxuICogQHJldHVybiB7U3RyaW5nfSB0aXRsZSB3aXRoIGFueSBoYXNoIGNoYXJhY3RlciByZW1vdmVkXG4gKi9cbmZ1bmN0aW9uIHRpdGxlKHRlc3QpIHtcbiAgcmV0dXJuIHRlc3QuZnVsbFRpdGxlKCkucmVwbGFjZSgvIy9nLCAnJyk7XG59XG5cbi8qKlxuICogV3JpdGVzIG5ld2xpbmUtdGVybWluYXRlZCBmb3JtYXR0ZWQgc3RyaW5nIHRvIHJlcG9ydGVyIG91dHB1dCBzdHJlYW0uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXQgLSBgcHJpbnRmYC1saWtlIGZvcm1hdCBzdHJpbmdcbiAqIEBwYXJhbSB7Li4uKn0gW3ZhckFyZ3NdIC0gRm9ybWF0IHN0cmluZyBhcmd1bWVudHNcbiAqL1xuZnVuY3Rpb24gcHJpbnRsbihmb3JtYXQsIHZhckFyZ3MpIHtcbiAgdmFyIHZhcmdzID0gQXJyYXkuZnJvbShhcmd1bWVudHMpO1xuICB2YXJnc1swXSArPSAnXFxuJztcbiAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoc3ByaW50Zi5hcHBseShudWxsLCB2YXJncykpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBgdGFwVmVyc2lvbmAtYXBwcm9wcmlhdGUgVEFQIHByb2R1Y2VyIGluc3RhbmNlLCBpZiBwb3NzaWJsZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHRhcFZlcnNpb24gLSBWZXJzaW9uIG9mIFRBUCBzcGVjaWZpY2F0aW9uIHRvIHByb2R1Y2UuXG4gKiBAcmV0dXJucyB7VEFQUHJvZHVjZXJ9IHNwZWNpZmljYXRpb24tYXBwcm9wcmlhdGUgaW5zdGFuY2VcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaGFzIG5vIGFzc29jaWF0ZWQgcHJvZHVjZXIuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVByb2R1Y2VyKHRhcFZlcnNpb24pIHtcbiAgdmFyIHByb2R1Y2VycyA9IHtcbiAgICAxMjogbmV3IFRBUDEyUHJvZHVjZXIoKSxcbiAgICAxMzogbmV3IFRBUDEzUHJvZHVjZXIoKVxuICB9O1xuICB2YXIgcHJvZHVjZXIgPSBwcm9kdWNlcnNbdGFwVmVyc2lvbl07XG5cbiAgaWYgKCFwcm9kdWNlcikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdpbnZhbGlkIG9yIHVuc3VwcG9ydGVkIFRBUCB2ZXJzaW9uOiAnICsgSlNPTi5zdHJpbmdpZnkodGFwVmVyc2lvbilcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHByb2R1Y2VyO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5XG4gKiBDb25zdHJ1Y3RzIGEgbmV3IFRBUFByb2R1Y2VyLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogPGVtPk9ubHk8L2VtPiB0byBiZSB1c2VkIGFzIGFuIGFic3RyYWN0IGJhc2UgY2xhc3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBUQVBQcm9kdWNlcigpIHt9XG5cbi8qKlxuICogV3JpdGVzIHRoZSBUQVAgdmVyc2lvbiB0byByZXBvcnRlciBvdXRwdXQgc3RyZWFtLlxuICpcbiAqIEBhYnN0cmFjdFxuICovXG5UQVBQcm9kdWNlci5wcm90b3R5cGUud3JpdGVWZXJzaW9uID0gZnVuY3Rpb24gKCkge307XG5cbi8qKlxuICogV3JpdGVzIHRoZSBwbGFuIHRvIHJlcG9ydGVyIG91dHB1dCBzdHJlYW0uXG4gKlxuICogQGFic3RyYWN0XG4gKiBAcGFyYW0ge251bWJlcn0gbnRlc3RzIC0gTnVtYmVyIG9mIHRlc3RzIHRoYXQgYXJlIHBsYW5uZWQgdG8gcnVuLlxuICovXG5UQVBQcm9kdWNlci5wcm90b3R5cGUud3JpdGVQbGFuID0gZnVuY3Rpb24gKG50ZXN0cykge1xuICBwcmludGxuKCclZC4uJWQnLCAxLCBudGVzdHMpO1xufTtcblxuLyoqXG4gKiBXcml0ZXMgdGhhdCB0ZXN0IHBhc3NlZCB0byByZXBvcnRlciBvdXRwdXQgc3RyZWFtLlxuICpcbiAqIEBhYnN0cmFjdFxuICogQHBhcmFtIHtudW1iZXJ9IG4gLSBJbmRleCBvZiB0ZXN0IHRoYXQgcGFzc2VkLlxuICogQHBhcmFtIHtUZXN0fSB0ZXN0IC0gSW5zdGFuY2UgY29udGFpbmluZyB0ZXN0IGluZm9ybWF0aW9uLlxuICovXG5UQVBQcm9kdWNlci5wcm90b3R5cGUud3JpdGVQYXNzID0gZnVuY3Rpb24gKG4sIHRlc3QpIHtcbiAgcHJpbnRsbignb2sgJWQgJXMnLCBuLCB0aXRsZSh0ZXN0KSk7XG59O1xuXG4vKipcbiAqIFdyaXRlcyB0aGF0IHRlc3Qgd2FzIHNraXBwZWQgdG8gcmVwb3J0ZXIgb3V0cHV0IHN0cmVhbS5cbiAqXG4gKiBAYWJzdHJhY3RcbiAqIEBwYXJhbSB7bnVtYmVyfSBuIC0gSW5kZXggb2YgdGVzdCB0aGF0IHdhcyBza2lwcGVkLlxuICogQHBhcmFtIHtUZXN0fSB0ZXN0IC0gSW5zdGFuY2UgY29udGFpbmluZyB0ZXN0IGluZm9ybWF0aW9uLlxuICovXG5UQVBQcm9kdWNlci5wcm90b3R5cGUud3JpdGVQZW5kaW5nID0gZnVuY3Rpb24gKG4sIHRlc3QpIHtcbiAgcHJpbnRsbignb2sgJWQgJXMgIyBTS0lQIC0nLCBuLCB0aXRsZSh0ZXN0KSk7XG59O1xuXG4vKipcbiAqIFdyaXRlcyB0aGF0IHRlc3QgZmFpbGVkIHRvIHJlcG9ydGVyIG91dHB1dCBzdHJlYW0uXG4gKlxuICogQGFic3RyYWN0XG4gKiBAcGFyYW0ge251bWJlcn0gbiAtIEluZGV4IG9mIHRlc3QgdGhhdCBmYWlsZWQuXG4gKiBAcGFyYW0ge1Rlc3R9IHRlc3QgLSBJbnN0YW5jZSBjb250YWluaW5nIHRlc3QgaW5mb3JtYXRpb24uXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnIgLSBSZWFzb24gdGhlIHRlc3QgZmFpbGVkLlxuICovXG5UQVBQcm9kdWNlci5wcm90b3R5cGUud3JpdGVGYWlsID0gZnVuY3Rpb24gKG4sIHRlc3QsIGVycikge1xuICBwcmludGxuKCdub3Qgb2sgJWQgJXMnLCBuLCB0aXRsZSh0ZXN0KSk7XG59O1xuXG4vKipcbiAqIFdyaXRlcyB0aGUgc3VtbWFyeSBlcGlsb2d1ZSB0byByZXBvcnRlciBvdXRwdXQgc3RyZWFtLlxuICpcbiAqIEBhYnN0cmFjdFxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRzIC0gT2JqZWN0IGNvbnRhaW5pbmcgcnVuIHN0YXRpc3RpY3MuXG4gKi9cblRBUFByb2R1Y2VyLnByb3RvdHlwZS53cml0ZUVwaWxvZ3VlID0gZnVuY3Rpb24gKHN0YXRzKSB7XG4gIC8vIDpUQkQ6IFdoeSBpcyB0aGlzIG5vdCBjb3VudGluZyBwZW5kaW5nIHRlc3RzP1xuICBwcmludGxuKCcjIHRlc3RzICcgKyAoc3RhdHMucGFzc2VzICsgc3RhdHMuZmFpbHVyZXMpKTtcbiAgcHJpbnRsbignIyBwYXNzICcgKyBzdGF0cy5wYXNzZXMpO1xuICAvLyA6VEJEOiBXaHkgYXJlIHdlIG5vdCBzaG93aW5nIHBlbmRpbmcgcmVzdWx0cz9cbiAgcHJpbnRsbignIyBmYWlsICcgKyBzdGF0cy5mYWlsdXJlcyk7XG4gIHRoaXMud3JpdGVQbGFuKHN0YXRzLnBhc3NlcyArIHN0YXRzLmZhaWx1cmVzICsgc3RhdHMucGVuZGluZyk7XG59O1xuXG4vKipcbiAqIEBzdW1tYXJ5XG4gKiBDb25zdHJ1Y3RzIGEgbmV3IFRBUDEyUHJvZHVjZXIuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBQcm9kdWNlcyBvdXRwdXQgY29uZm9ybWluZyB0byB0aGUgVEFQMTIgc3BlY2lmaWNhdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBUQVBQcm9kdWNlclxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly90ZXN0YW55dGhpbmcub3JnL3RhcC1zcGVjaWZpY2F0aW9uLmh0bWx8U3BlY2lmaWNhdGlvbn1cbiAqL1xuZnVuY3Rpb24gVEFQMTJQcm9kdWNlcigpIHtcbiAgLyoqXG4gICAqIFdyaXRlcyB0aGF0IHRlc3QgZmFpbGVkIHRvIHJlcG9ydGVyIG91dHB1dCBzdHJlYW0sIHdpdGggZXJyb3IgZm9ybWF0dGluZy5cbiAgICogQG92ZXJyaWRlXG4gICAqL1xuICB0aGlzLndyaXRlRmFpbCA9IGZ1bmN0aW9uIChuLCB0ZXN0LCBlcnIpIHtcbiAgICBUQVBQcm9kdWNlci5wcm90b3R5cGUud3JpdGVGYWlsLmNhbGwodGhpcywgbiwgdGVzdCwgZXJyKTtcbiAgICBpZiAoZXJyLm1lc3NhZ2UpIHtcbiAgICAgIHByaW50bG4oZXJyLm1lc3NhZ2UucmVwbGFjZSgvXi9nbSwgJyAgJykpO1xuICAgIH1cbiAgICBpZiAoZXJyLnN0YWNrKSB7XG4gICAgICBwcmludGxuKGVyci5zdGFjay5yZXBsYWNlKC9eL2dtLCAnICAnKSk7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIEluaGVyaXQgZnJvbSBgVEFQUHJvZHVjZXIucHJvdG90eXBlYC5cbiAqL1xuaW5oZXJpdHMoVEFQMTJQcm9kdWNlciwgVEFQUHJvZHVjZXIpO1xuXG4vKipcbiAqIEBzdW1tYXJ5XG4gKiBDb25zdHJ1Y3RzIGEgbmV3IFRBUDEzUHJvZHVjZXIuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBQcm9kdWNlcyBvdXRwdXQgY29uZm9ybWluZyB0byB0aGUgVEFQMTMgc3BlY2lmaWNhdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBUQVBQcm9kdWNlclxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly90ZXN0YW55dGhpbmcub3JnL3RhcC12ZXJzaW9uLTEzLXNwZWNpZmljYXRpb24uaHRtbHxTcGVjaWZpY2F0aW9ufVxuICovXG5mdW5jdGlvbiBUQVAxM1Byb2R1Y2VyKCkge1xuICAvKipcbiAgICogV3JpdGVzIHRoZSBUQVAgdmVyc2lvbiB0byByZXBvcnRlciBvdXRwdXQgc3RyZWFtLlxuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIHRoaXMud3JpdGVWZXJzaW9uID0gZnVuY3Rpb24gKCkge1xuICAgIHByaW50bG4oJ1RBUCB2ZXJzaW9uIDEzJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFdyaXRlcyB0aGF0IHRlc3QgZmFpbGVkIHRvIHJlcG9ydGVyIG91dHB1dCBzdHJlYW0sIHdpdGggZXJyb3IgZm9ybWF0dGluZy5cbiAgICogQG92ZXJyaWRlXG4gICAqL1xuICB0aGlzLndyaXRlRmFpbCA9IGZ1bmN0aW9uIChuLCB0ZXN0LCBlcnIpIHtcbiAgICBUQVBQcm9kdWNlci5wcm90b3R5cGUud3JpdGVGYWlsLmNhbGwodGhpcywgbiwgdGVzdCwgZXJyKTtcbiAgICB2YXIgZW1pdFlhbWxCbG9jayA9IGVyci5tZXNzYWdlICE9IG51bGwgfHwgZXJyLnN0YWNrICE9IG51bGw7XG4gICAgaWYgKGVtaXRZYW1sQmxvY2spIHtcbiAgICAgIHByaW50bG4oaW5kZW50KDEpICsgJy0tLScpO1xuICAgICAgaWYgKGVyci5tZXNzYWdlKSB7XG4gICAgICAgIHByaW50bG4oaW5kZW50KDIpICsgJ21lc3NhZ2U6IHwtJyk7XG4gICAgICAgIHByaW50bG4oZXJyLm1lc3NhZ2UucmVwbGFjZSgvXi9nbSwgaW5kZW50KDMpKSk7XG4gICAgICB9XG4gICAgICBpZiAoZXJyLnN0YWNrKSB7XG4gICAgICAgIHByaW50bG4oaW5kZW50KDIpICsgJ3N0YWNrOiB8LScpO1xuICAgICAgICBwcmludGxuKGVyci5zdGFjay5yZXBsYWNlKC9eL2dtLCBpbmRlbnQoMykpKTtcbiAgICAgIH1cbiAgICAgIHByaW50bG4oaW5kZW50KDEpICsgJy4uLicpO1xuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiBpbmRlbnQobGV2ZWwpIHtcbiAgICByZXR1cm4gQXJyYXkobGV2ZWwgKyAxKS5qb2luKCcgICcpO1xuICB9XG59XG5cbi8qKlxuICogSW5oZXJpdCBmcm9tIGBUQVBQcm9kdWNlci5wcm90b3R5cGVgLlxuICovXG5pbmhlcml0cyhUQVAxM1Byb2R1Y2VyLCBUQVBQcm9kdWNlcik7XG5cblRBUC5kZXNjcmlwdGlvbiA9ICdUQVAtY29tcGF0aWJsZSBvdXRwdXQnO1xuIiwgIid1c2Ugc3RyaWN0Jztcbi8qKlxuICogQG1vZHVsZSBKU09OXG4gKi9cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgQmFzZSA9IHJlcXVpcmUoJy4vYmFzZScpO1xudmFyIGZzID0gcmVxdWlyZSgnZnMnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuY29uc3QgY3JlYXRlVW5zdXBwb3J0ZWRFcnJvciA9IHJlcXVpcmUoJy4uL2Vycm9ycycpLmNyZWF0ZVVuc3VwcG9ydGVkRXJyb3I7XG5jb25zdCB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgY29uc3RhbnRzID0gcmVxdWlyZSgnLi4vcnVubmVyJykuY29uc3RhbnRzO1xudmFyIEVWRU5UX1RFU1RfUEFTUyA9IGNvbnN0YW50cy5FVkVOVF9URVNUX1BBU1M7XG52YXIgRVZFTlRfVEVTVF9QRU5ESU5HID0gY29uc3RhbnRzLkVWRU5UX1RFU1RfUEVORElORztcbnZhciBFVkVOVF9URVNUX0ZBSUwgPSBjb25zdGFudHMuRVZFTlRfVEVTVF9GQUlMO1xudmFyIEVWRU5UX1RFU1RfRU5EID0gY29uc3RhbnRzLkVWRU5UX1RFU1RfRU5EO1xudmFyIEVWRU5UX1JVTl9FTkQgPSBjb25zdGFudHMuRVZFTlRfUlVOX0VORDtcblxuLyoqXG4gKiBFeHBvc2UgYEpTT05gLlxuICovXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IEpTT05SZXBvcnRlcjtcblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgbmV3IGBKU09OYCByZXBvcnRlciBpbnN0YW5jZS5cbiAqXG4gKiBAcHVibGljXG4gKiBAY2xhc3MgSlNPTlxuICogQG1lbWJlcm9mIE1vY2hhLnJlcG9ydGVyc1xuICogQGV4dGVuZHMgTW9jaGEucmVwb3J0ZXJzLkJhc2VcbiAqIEBwYXJhbSB7UnVubmVyfSBydW5uZXIgLSBJbnN0YW5jZSB0cmlnZ2VycyByZXBvcnRlciBhY3Rpb25zLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIHJ1bm5lciBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIEpTT05SZXBvcnRlcihydW5uZXIsIG9wdGlvbnMgPSB7fSkge1xuICBCYXNlLmNhbGwodGhpcywgcnVubmVyLCBvcHRpb25zKTtcblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciB0ZXN0cyA9IFtdO1xuICB2YXIgcGVuZGluZyA9IFtdO1xuICB2YXIgZmFpbHVyZXMgPSBbXTtcbiAgdmFyIHBhc3NlcyA9IFtdO1xuICB2YXIgb3V0cHV0O1xuXG4gIGlmIChvcHRpb25zLnJlcG9ydGVyT3B0aW9uICYmIG9wdGlvbnMucmVwb3J0ZXJPcHRpb24ub3V0cHV0KSB7XG4gICAgaWYgKHV0aWxzLmlzQnJvd3NlcigpKSB7XG4gICAgICB0aHJvdyBjcmVhdGVVbnN1cHBvcnRlZEVycm9yKCdmaWxlIG91dHB1dCBub3Qgc3VwcG9ydGVkIGluIGJyb3dzZXInKTtcbiAgICB9XG4gICAgb3V0cHV0ID0gb3B0aW9ucy5yZXBvcnRlck9wdGlvbi5vdXRwdXQ7XG4gIH1cblxuICBydW5uZXIub24oRVZFTlRfVEVTVF9FTkQsIGZ1bmN0aW9uICh0ZXN0KSB7XG4gICAgdGVzdHMucHVzaCh0ZXN0KTtcbiAgfSk7XG5cbiAgcnVubmVyLm9uKEVWRU5UX1RFU1RfUEFTUywgZnVuY3Rpb24gKHRlc3QpIHtcbiAgICBwYXNzZXMucHVzaCh0ZXN0KTtcbiAgfSk7XG5cbiAgcnVubmVyLm9uKEVWRU5UX1RFU1RfRkFJTCwgZnVuY3Rpb24gKHRlc3QpIHtcbiAgICBmYWlsdXJlcy5wdXNoKHRlc3QpO1xuICB9KTtcblxuICBydW5uZXIub24oRVZFTlRfVEVTVF9QRU5ESU5HLCBmdW5jdGlvbiAodGVzdCkge1xuICAgIHBlbmRpbmcucHVzaCh0ZXN0KTtcbiAgfSk7XG5cbiAgcnVubmVyLm9uY2UoRVZFTlRfUlVOX0VORCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBvYmogPSB7XG4gICAgICBzdGF0czogc2VsZi5zdGF0cyxcbiAgICAgIHRlc3RzOiB0ZXN0cy5tYXAoY2xlYW4pLFxuICAgICAgcGVuZGluZzogcGVuZGluZy5tYXAoY2xlYW4pLFxuICAgICAgZmFpbHVyZXM6IGZhaWx1cmVzLm1hcChjbGVhbiksXG4gICAgICBwYXNzZXM6IHBhc3Nlcy5tYXAoY2xlYW4pXG4gICAgfTtcblxuICAgIHJ1bm5lci50ZXN0UmVzdWx0cyA9IG9iajtcblxuICAgIHZhciBqc29uID0gSlNPTi5zdHJpbmdpZnkob2JqLCBudWxsLCAyKTtcbiAgICBpZiAob3V0cHV0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBmcy5ta2RpclN5bmMocGF0aC5kaXJuYW1lKG91dHB1dCksIHtyZWN1cnNpdmU6IHRydWV9KTtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhvdXRwdXQsIGpzb24pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgYCR7QmFzZS5zeW1ib2xzLmVycn0gW21vY2hhXSB3cml0aW5nIG91dHB1dCB0byBcIiR7b3V0cHV0fVwiIGZhaWxlZDogJHtlcnIubWVzc2FnZX1cXG5gXG4gICAgICAgICk7XG4gICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGpzb24pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShqc29uKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFJldHVybiBhIHBsYWluLW9iamVjdCByZXByZXNlbnRhdGlvbiBvZiBgdGVzdGBcbiAqIGZyZWUgb2YgY3ljbGljIHByb3BlcnRpZXMgZXRjLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gdGVzdFxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBjbGVhbih0ZXN0KSB7XG4gIHZhciBlcnIgPSB0ZXN0LmVyciB8fCB7fTtcbiAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgZXJyID0gZXJyb3JKU09OKGVycik7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHRpdGxlOiB0ZXN0LnRpdGxlLFxuICAgIGZ1bGxUaXRsZTogdGVzdC5mdWxsVGl0bGUoKSxcbiAgICBmaWxlOiB0ZXN0LmZpbGUsXG4gICAgZHVyYXRpb246IHRlc3QuZHVyYXRpb24sXG4gICAgY3VycmVudFJldHJ5OiB0ZXN0LmN1cnJlbnRSZXRyeSgpLFxuICAgIHNwZWVkOiB0ZXN0LnNwZWVkLFxuICAgIGVycjogY2xlYW5DeWNsZXMoZXJyKVxuICB9O1xufVxuXG4vKipcbiAqIFJlcGxhY2VzIGFueSBjaXJjdWxhciByZWZlcmVuY2VzIGluc2lkZSBgb2JqYCB3aXRoICdbb2JqZWN0IE9iamVjdF0nXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gY2xlYW5DeWNsZXMob2JqKSB7XG4gIHZhciBjYWNoZSA9IFtdO1xuICByZXR1cm4gSlNPTi5wYXJzZShcbiAgICBKU09OLnN0cmluZ2lmeShvYmosIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoY2FjaGUuaW5kZXhPZih2YWx1ZSkgIT09IC0xKSB7XG4gICAgICAgICAgLy8gSW5zdGVhZCBvZiBnb2luZyBpbiBhIGNpcmNsZSwgd2UnbGwgcHJpbnQgW29iamVjdCBPYmplY3RdXG4gICAgICAgICAgcmV0dXJuICcnICsgdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgY2FjaGUucHVzaCh2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIFRyYW5zZm9ybSBhbiBFcnJvciBvYmplY3QgaW50byBhIEpTT04gb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gZXJyb3JKU09OKGVycikge1xuICB2YXIgcmVzID0ge307XG4gIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGVycikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmVzW2tleV0gPSBlcnJba2V5XTtcbiAgfSwgZXJyKTtcbiAgcmV0dXJuIHJlcztcbn1cblxuSlNPTlJlcG9ydGVyLmRlc2NyaXB0aW9uID0gJ3NpbmdsZSBKU09OIG9iamVjdCc7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKiBlc2xpbnQtZW52IGJyb3dzZXIgKi9cbi8qKlxuICogQG1vZHVsZSBIVE1MXG4gKi9cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgQmFzZSA9IHJlcXVpcmUoJy4vYmFzZScpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBlc2NhcGVSZSA9IHJlcXVpcmUoJ2VzY2FwZS1zdHJpbmctcmVnZXhwJyk7XG52YXIgY29uc3RhbnRzID0gcmVxdWlyZSgnLi4vcnVubmVyJykuY29uc3RhbnRzO1xudmFyIEVWRU5UX1RFU1RfUEFTUyA9IGNvbnN0YW50cy5FVkVOVF9URVNUX1BBU1M7XG52YXIgRVZFTlRfVEVTVF9GQUlMID0gY29uc3RhbnRzLkVWRU5UX1RFU1RfRkFJTDtcbnZhciBFVkVOVF9TVUlURV9CRUdJTiA9IGNvbnN0YW50cy5FVkVOVF9TVUlURV9CRUdJTjtcbnZhciBFVkVOVF9TVUlURV9FTkQgPSBjb25zdGFudHMuRVZFTlRfU1VJVEVfRU5EO1xudmFyIEVWRU5UX1RFU1RfUEVORElORyA9IGNvbnN0YW50cy5FVkVOVF9URVNUX1BFTkRJTkc7XG52YXIgZXNjYXBlID0gdXRpbHMuZXNjYXBlO1xuXG4vKipcbiAqIFNhdmUgdGltZXIgcmVmZXJlbmNlcyB0byBhdm9pZCBTaW5vbiBpbnRlcmZlcmluZyAoc2VlIEdILTIzNykuXG4gKi9cblxudmFyIERhdGUgPSBnbG9iYWwuRGF0ZTtcblxuLyoqXG4gKiBFeHBvc2UgYEhUTUxgLlxuICovXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IEhUTUw7XG5cbi8qKlxuICogU3RhdHMgdGVtcGxhdGU6IFJlc3VsdCwgcHJvZ3Jlc3MsIHBhc3NlcywgZmFpbHVyZXMsIGFuZCBkdXJhdGlvbi5cbiAqL1xuXG52YXIgc3RhdHNUZW1wbGF0ZSA9XG4gICc8dWwgaWQ9XCJtb2NoYS1zdGF0c1wiPicgK1xuICAnPGxpIGNsYXNzPVwicmVzdWx0XCI+PC9saT4nICtcbiAgJzxsaSBjbGFzcz1cInByb2dyZXNzLWNvbnRhaW5cIj48cHJvZ3Jlc3MgY2xhc3M9XCJwcm9ncmVzcy1lbGVtZW50XCIgbWF4PVwiMTAwXCIgdmFsdWU9XCIwXCI+PC9wcm9ncmVzcz48c3ZnIGNsYXNzPVwicHJvZ3Jlc3MtcmluZ1wiPjxjaXJjbGUgY2xhc3M9XCJyaW5nLWZsYXRsaWdodFwiIHN0cm9rZS1kYXNoYXJyYXk9XCIxMDAlLDAlXCIvPjxjaXJjbGUgY2xhc3M9XCJyaW5nLWhpZ2hsaWdodFwiIHN0cm9rZS1kYXNoYXJyYXk9XCIwJSwxMDAlXCIvPjwvc3ZnPjxkaXYgY2xhc3M9XCJwcm9ncmVzcy10ZXh0XCI+MCU8L2Rpdj48L2xpPicgK1xuICAnPGxpIGNsYXNzPVwicGFzc2VzXCI+PGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKTtcIj5wYXNzZXM6PC9hPiA8ZW0+MDwvZW0+PC9saT4nICtcbiAgJzxsaSBjbGFzcz1cImZhaWx1cmVzXCI+PGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKTtcIj5mYWlsdXJlczo8L2E+IDxlbT4wPC9lbT48L2xpPicgK1xuICAnPGxpIGNsYXNzPVwiZHVyYXRpb25cIj5kdXJhdGlvbjogPGVtPjA8L2VtPnM8L2xpPicgK1xuICAnPC91bD4nO1xuXG52YXIgcGxheUljb24gPSAnJiN4MjAyMzsnO1xuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBuZXcgYEhUTUxgIHJlcG9ydGVyIGluc3RhbmNlLlxuICpcbiAqIEBwdWJsaWNcbiAqIEBjbGFzc1xuICogQG1lbWJlcm9mIE1vY2hhLnJlcG9ydGVyc1xuICogQGV4dGVuZHMgTW9jaGEucmVwb3J0ZXJzLkJhc2VcbiAqIEBwYXJhbSB7UnVubmVyfSBydW5uZXIgLSBJbnN0YW5jZSB0cmlnZ2VycyByZXBvcnRlciBhY3Rpb25zLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIHJ1bm5lciBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIEhUTUwocnVubmVyLCBvcHRpb25zKSB7XG4gIEJhc2UuY2FsbCh0aGlzLCBydW5uZXIsIG9wdGlvbnMpO1xuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHN0YXRzID0gdGhpcy5zdGF0cztcbiAgdmFyIHN0YXQgPSBmcmFnbWVudChzdGF0c1RlbXBsYXRlKTtcbiAgdmFyIGl0ZW1zID0gc3RhdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnbGknKTtcbiAgY29uc3QgcmVzdWx0SW5kZXggPSAwO1xuICBjb25zdCBwcm9ncmVzc0luZGV4ID0gMTtcbiAgY29uc3QgcGFzc2VzSW5kZXggPSAyO1xuICBjb25zdCBmYWlsdXJlc0luZGV4ID0gMztcbiAgY29uc3QgZHVyYXRpb25JbmRleCA9IDQ7XG4gIC8qKiBTdGF0IGl0ZW0gY29udGFpbmluZyB0aGUgcm9vdCBzdWl0ZSBwYXNzIG9yIGZhaWwgaW5kaWNhdG9yIChoYXNGYWlsdXJlcyA/ICfinJYnIDogJ+KckycpICovXG4gIHZhciByZXN1bHRJbmRpY2F0b3IgPSBpdGVtc1tyZXN1bHRJbmRleF07XG4gIC8qKiBQYXNzZXMgdGV4dCBhbmQgY291bnQgKi9cbiAgY29uc3QgcGFzc2VzU3RhdCA9IGl0ZW1zW3Bhc3Nlc0luZGV4XTtcbiAgLyoqIFN0YXQgaXRlbSBjb250YWluaW5nIHRoZSBwYXNzIGNvdW50IChub3QgdGhlIHdvcmQsIGp1c3QgdGhlIG51bWJlcikgKi9cbiAgY29uc3QgcGFzc2VzQ291bnQgPSBwYXNzZXNTdGF0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdlbScpWzBdO1xuICAvKiogU3RhdCBpdGVtIGxpbmtpbmcgdG8gZmlsdGVyIHRvIHNob3cgb25seSBwYXNzaW5nIHRlc3RzICovXG4gIGNvbnN0IHBhc3Nlc0xpbmsgPSBwYXNzZXNTdGF0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdhJylbMF07XG4gIC8qKiBGYWlsdXJlcyB0ZXh0IGFuZCBjb3VudCAqL1xuICBjb25zdCBmYWlsdXJlc1N0YXQgPSBpdGVtc1tmYWlsdXJlc0luZGV4XTtcbiAgLyoqIFN0YXQgaXRlbSBjb250YWluaW5nIHRoZSBmYWlsdXJlIGNvdW50IChub3QgdGhlIHdvcmQsIGp1c3QgdGhlIG51bWJlcikgKi9cbiAgY29uc3QgZmFpbHVyZXNDb3VudCA9IGZhaWx1cmVzU3RhdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnZW0nKVswXTtcbiAgLyoqIFN0YXQgaXRlbSBsaW5raW5nIHRvIGZpbHRlciB0byBzaG93IG9ubHkgZmFpbGluZyB0ZXN0cyAqL1xuICBjb25zdCBmYWlsdXJlc0xpbmsgPSBmYWlsdXJlc1N0YXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2EnKVswXTtcbiAgLyoqIFN0YXQgaXRlbSBsaW5raW5nIHRvIHRoZSBkdXJhdGlvbiB0aW1lIChub3QgdGhlIHdvcmQgb3IgdW5pdCwganVzdCB0aGUgbnVtYmVyKSAqL1xuICB2YXIgZHVyYXRpb24gPSBpdGVtc1tkdXJhdGlvbkluZGV4XS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnZW0nKVswXTtcbiAgdmFyIHJlcG9ydCA9IGZyYWdtZW50KCc8dWwgaWQ9XCJtb2NoYS1yZXBvcnRcIj48L3VsPicpO1xuICB2YXIgc3RhY2sgPSBbcmVwb3J0XTtcbiAgdmFyIHByb2dyZXNzVGV4dCA9IGl0ZW1zW3Byb2dyZXNzSW5kZXhdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdkaXYnKVswXTtcbiAgdmFyIHByb2dyZXNzQmFyID0gaXRlbXNbcHJvZ3Jlc3NJbmRleF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3Byb2dyZXNzJylbMF07XG4gIHZhciBwcm9ncmVzc1JpbmcgPSBbXG4gICAgaXRlbXNbcHJvZ3Jlc3NJbmRleF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgncmluZy1mbGF0bGlnaHQnKVswXSxcbiAgICBpdGVtc1twcm9ncmVzc0luZGV4XS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdyaW5nLWhpZ2hsaWdodCcpWzBdXG4gIF07XG4gIHZhciBwcm9ncmVzc1JpbmdSYWRpdXMgPSBudWxsOyAvLyBjb21wdXRlZCBDU1MgdW5hdmFpbGFibGUgbm93LCBzbyBzZXQgbGF0ZXJcbiAgdmFyIHJvb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9jaGEnKTtcblxuICBpZiAoIXJvb3QpIHtcbiAgICByZXR1cm4gZXJyb3IoJyNtb2NoYSBkaXYgbWlzc2luZywgYWRkIGl0IHRvIHlvdXIgZG9jdW1lbnQnKTtcbiAgfVxuXG4gIC8vIHBhc3MgdG9nZ2xlXG4gIG9uKHBhc3Nlc0xpbmssICdjbGljaycsIGZ1bmN0aW9uIChldnQpIHtcbiAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICB1bmhpZGUoKTtcbiAgICB2YXIgbmFtZSA9IC9wYXNzLy50ZXN0KHJlcG9ydC5jbGFzc05hbWUpID8gJycgOiAnIHBhc3MnO1xuICAgIHJlcG9ydC5jbGFzc05hbWUgPSByZXBvcnQuY2xhc3NOYW1lLnJlcGxhY2UoL2ZhaWx8cGFzcy9nLCAnJykgKyBuYW1lO1xuICAgIGlmIChyZXBvcnQuY2xhc3NOYW1lLnRyaW0oKSkge1xuICAgICAgaGlkZVN1aXRlc1dpdGhvdXQoJ3Rlc3QgcGFzcycpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gZmFpbHVyZSB0b2dnbGVcbiAgb24oZmFpbHVyZXNMaW5rLCAnY2xpY2snLCBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdW5oaWRlKCk7XG4gICAgdmFyIG5hbWUgPSAvZmFpbC8udGVzdChyZXBvcnQuY2xhc3NOYW1lKSA/ICcnIDogJyBmYWlsJztcbiAgICByZXBvcnQuY2xhc3NOYW1lID0gcmVwb3J0LmNsYXNzTmFtZS5yZXBsYWNlKC9mYWlsfHBhc3MvZywgJycpICsgbmFtZTtcbiAgICBpZiAocmVwb3J0LmNsYXNzTmFtZS50cmltKCkpIHtcbiAgICAgIGhpZGVTdWl0ZXNXaXRob3V0KCd0ZXN0IGZhaWwnKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJvb3QuYXBwZW5kQ2hpbGQoc3RhdCk7XG4gIHJvb3QuYXBwZW5kQ2hpbGQocmVwb3J0KTtcblxuICBydW5uZXIub24oRVZFTlRfU1VJVEVfQkVHSU4sIGZ1bmN0aW9uIChzdWl0ZSkge1xuICAgIGlmIChzdWl0ZS5yb290KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gc3VpdGVcbiAgICB2YXIgdXJsID0gc2VsZi5zdWl0ZVVSTChzdWl0ZSk7XG4gICAgdmFyIGVsID0gZnJhZ21lbnQoXG4gICAgICAnPGxpIGNsYXNzPVwic3VpdGVcIj48aDE+PGEgaHJlZj1cIiVzXCI+JXM8L2E+PC9oMT48L2xpPicsXG4gICAgICB1cmwsXG4gICAgICBlc2NhcGUoc3VpdGUudGl0bGUpXG4gICAgKTtcblxuICAgIC8vIGNvbnRhaW5lclxuICAgIHN0YWNrWzBdLmFwcGVuZENoaWxkKGVsKTtcbiAgICBzdGFjay51bnNoaWZ0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJykpO1xuICAgIGVsLmFwcGVuZENoaWxkKHN0YWNrWzBdKTtcbiAgfSk7XG5cbiAgcnVubmVyLm9uKEVWRU5UX1NVSVRFX0VORCwgZnVuY3Rpb24gKHN1aXRlKSB7XG4gICAgaWYgKHN1aXRlLnJvb3QpIHtcbiAgICAgIGlmIChzdGF0cy5mYWlsdXJlcyA9PT0gMCkge1xuICAgICAgICB0ZXh0KHJlc3VsdEluZGljYXRvciwgJ+KckycpO1xuICAgICAgICBzdGF0LmNsYXNzTmFtZSArPSAnIHBhc3MnO1xuICAgICAgfVxuICAgICAgdXBkYXRlU3RhdHMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3RhY2suc2hpZnQoKTtcbiAgfSk7XG5cbiAgcnVubmVyLm9uKEVWRU5UX1RFU1RfUEFTUywgZnVuY3Rpb24gKHRlc3QpIHtcbiAgICB2YXIgdXJsID0gc2VsZi50ZXN0VVJMKHRlc3QpO1xuICAgIHZhciBtYXJrdXAgPVxuICAgICAgJzxsaSBjbGFzcz1cInRlc3QgcGFzcyAlZVwiPjxoMj4lZTxzcGFuIGNsYXNzPVwiZHVyYXRpb25cIj4lZW1zPC9zcGFuPiAnICtcbiAgICAgICc8YSBocmVmPVwiJXNcIiBjbGFzcz1cInJlcGxheVwiPicgK1xuICAgICAgcGxheUljb24gK1xuICAgICAgJzwvYT48L2gyPjwvbGk+JztcbiAgICB2YXIgZWwgPSBmcmFnbWVudChtYXJrdXAsIHRlc3Quc3BlZWQsIHRlc3QudGl0bGUsIHRlc3QuZHVyYXRpb24sIHVybCk7XG4gICAgc2VsZi5hZGRDb2RlVG9nZ2xlKGVsLCB0ZXN0LmJvZHkpO1xuICAgIGFwcGVuZFRvU3RhY2soZWwpO1xuICAgIHVwZGF0ZVN0YXRzKCk7XG4gIH0pO1xuXG4gIHJ1bm5lci5vbihFVkVOVF9URVNUX0ZBSUwsIGZ1bmN0aW9uICh0ZXN0KSB7XG4gICAgLy8gVXBkYXRlIHN0YXQgaXRlbXNcbiAgICB0ZXh0KHJlc3VsdEluZGljYXRvciwgJ+KclicpO1xuICAgIHN0YXQuY2xhc3NOYW1lICs9ICcgZmFpbCc7XG5cbiAgICB2YXIgZWwgPSBmcmFnbWVudChcbiAgICAgICc8bGkgY2xhc3M9XCJ0ZXN0IGZhaWxcIj48aDI+JWUgPGEgaHJlZj1cIiVlXCIgY2xhc3M9XCJyZXBsYXlcIj4nICtcbiAgICAgICAgcGxheUljb24gK1xuICAgICAgICAnPC9hPjwvaDI+PC9saT4nLFxuICAgICAgdGVzdC50aXRsZSxcbiAgICAgIHNlbGYudGVzdFVSTCh0ZXN0KVxuICAgICk7XG4gICAgdmFyIHN0YWNrU3RyaW5nOyAvLyBOb3RlOiBJbmNsdWRlcyBsZWFkaW5nIG5ld2xpbmVcbiAgICB2YXIgbWVzc2FnZSA9IHRlc3QuZXJyLnRvU3RyaW5nKCk7XG5cbiAgICAvLyA8PUlFNyBzdHJpbmdpZmllcyB0byBbT2JqZWN0IEVycm9yXS4gU2luY2UgaXQgY2FuIGJlIG92ZXJsb2FkZWQsIHdlXG4gICAgLy8gY2hlY2sgZm9yIHRoZSByZXN1bHQgb2YgdGhlIHN0cmluZ2lmeWluZy5cbiAgICBpZiAobWVzc2FnZSA9PT0gJ1tvYmplY3QgRXJyb3JdJykge1xuICAgICAgbWVzc2FnZSA9IHRlc3QuZXJyLm1lc3NhZ2U7XG4gICAgfVxuXG4gICAgaWYgKHRlc3QuZXJyLnN0YWNrKSB7XG4gICAgICB2YXIgaW5kZXhPZk1lc3NhZ2UgPSB0ZXN0LmVyci5zdGFjay5pbmRleE9mKHRlc3QuZXJyLm1lc3NhZ2UpO1xuICAgICAgaWYgKGluZGV4T2ZNZXNzYWdlID09PSAtMSkge1xuICAgICAgICBzdGFja1N0cmluZyA9IHRlc3QuZXJyLnN0YWNrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhY2tTdHJpbmcgPSB0ZXN0LmVyci5zdGFjay5zbGljZShcbiAgICAgICAgICB0ZXN0LmVyci5tZXNzYWdlLmxlbmd0aCArIGluZGV4T2ZNZXNzYWdlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0ZXN0LmVyci5zb3VyY2VVUkwgJiYgdGVzdC5lcnIubGluZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBTYWZhcmkgZG9lc24ndCBnaXZlIHlvdSBhIHN0YWNrLiBMZXQncyBhdCBsZWFzdCBwcm92aWRlIGEgc291cmNlIGxpbmUuXG4gICAgICBzdGFja1N0cmluZyA9ICdcXG4oJyArIHRlc3QuZXJyLnNvdXJjZVVSTCArICc6JyArIHRlc3QuZXJyLmxpbmUgKyAnKSc7XG4gICAgfVxuXG4gICAgc3RhY2tTdHJpbmcgPSBzdGFja1N0cmluZyB8fCAnJztcblxuICAgIGlmICh0ZXN0LmVyci5odG1sTWVzc2FnZSAmJiBzdGFja1N0cmluZykge1xuICAgICAgZWwuYXBwZW5kQ2hpbGQoXG4gICAgICAgIGZyYWdtZW50KFxuICAgICAgICAgICc8ZGl2IGNsYXNzPVwiaHRtbC1lcnJvclwiPiVzXFxuPHByZSBjbGFzcz1cImVycm9yXCI+JWU8L3ByZT48L2Rpdj4nLFxuICAgICAgICAgIHRlc3QuZXJyLmh0bWxNZXNzYWdlLFxuICAgICAgICAgIHN0YWNrU3RyaW5nXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICh0ZXN0LmVyci5odG1sTWVzc2FnZSkge1xuICAgICAgZWwuYXBwZW5kQ2hpbGQoXG4gICAgICAgIGZyYWdtZW50KCc8ZGl2IGNsYXNzPVwiaHRtbC1lcnJvclwiPiVzPC9kaXY+JywgdGVzdC5lcnIuaHRtbE1lc3NhZ2UpXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbC5hcHBlbmRDaGlsZChcbiAgICAgICAgZnJhZ21lbnQoJzxwcmUgY2xhc3M9XCJlcnJvclwiPiVlJWU8L3ByZT4nLCBtZXNzYWdlLCBzdGFja1N0cmluZylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgc2VsZi5hZGRDb2RlVG9nZ2xlKGVsLCB0ZXN0LmJvZHkpO1xuICAgIGFwcGVuZFRvU3RhY2soZWwpO1xuICAgIHVwZGF0ZVN0YXRzKCk7XG4gIH0pO1xuXG4gIHJ1bm5lci5vbihFVkVOVF9URVNUX1BFTkRJTkcsIGZ1bmN0aW9uICh0ZXN0KSB7XG4gICAgdmFyIGVsID0gZnJhZ21lbnQoXG4gICAgICAnPGxpIGNsYXNzPVwidGVzdCBwYXNzIHBlbmRpbmdcIj48aDI+JWU8L2gyPjwvbGk+JyxcbiAgICAgIHRlc3QudGl0bGVcbiAgICApO1xuICAgIGFwcGVuZFRvU3RhY2soZWwpO1xuICAgIHVwZGF0ZVN0YXRzKCk7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGFwcGVuZFRvU3RhY2soZWwpIHtcbiAgICAvLyBEb24ndCBjYWxsIC5hcHBlbmRDaGlsZCBpZiAjbW9jaGEtcmVwb3J0IHdhcyBhbHJlYWR5IC5zaGlmdCgpJ2VkIG9mZiB0aGUgc3RhY2suXG4gICAgaWYgKHN0YWNrWzBdKSB7XG4gICAgICBzdGFja1swXS5hcHBlbmRDaGlsZChlbCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlU3RhdHMoKSB7XG4gICAgdmFyIHBlcmNlbnQgPSAoKHN0YXRzLnRlc3RzIC8gcnVubmVyLnRvdGFsKSAqIDEwMCkgfCAwO1xuICAgIHByb2dyZXNzQmFyLnZhbHVlID0gcGVyY2VudDtcbiAgICBpZiAocHJvZ3Jlc3NUZXh0KSB7XG4gICAgICAvLyBzZXR0aW5nIGEgdG9GaXhlZCB0aGF0IGlzIHRvbyBsb3csIG1ha2VzIHNtYWxsIGNoYW5nZXMgdG8gcHJvZ3Jlc3Mgbm90IHNob3duXG4gICAgICAvLyBzZXR0aW5nIGl0IHRvbyBoaWdoLCBtYWtlcyB0aGUgcHJvZ3Jlc3MgdGV4dCBsb25nZXIgdGhlbiBpdCBuZWVkcyB0b1xuICAgICAgLy8gdG8gYWRkcmVzcyB0aGlzLCBjYWxjdWxhdGUgdGhlIHRvRml4ZWQgYmFzZWQgb24gdGhlIG1hZ25pdHVkZSBvZiB0b3RhbFxuICAgICAgdmFyIGRlY2ltYWxQbGFjZXMgPSBNYXRoLmNlaWwoTWF0aC5sb2cxMChydW5uZXIudG90YWwgLyAxMDApKTtcbiAgICAgIHRleHQoXG4gICAgICAgIHByb2dyZXNzVGV4dCxcbiAgICAgICAgcGVyY2VudC50b0ZpeGVkKE1hdGgubWluKE1hdGgubWF4KGRlY2ltYWxQbGFjZXMsIDApLCAxMDApKSArICclJ1xuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHByb2dyZXNzUmluZykge1xuICAgICAgdmFyIHJhZGl1cyA9IHBhcnNlRmxvYXQoZ2V0Q29tcHV0ZWRTdHlsZShwcm9ncmVzc1JpbmdbMF0pLmdldFByb3BlcnR5VmFsdWUoJ3InKSk7XG4gICAgICB2YXIgd2hvbGVBcmMgPSBNYXRoLlBJICogMiAqIHJhZGl1cztcbiAgICAgIHZhciBoaWdobGlnaHRBcmMgPSBwZXJjZW50ICogKHdob2xlQXJjIC8gMTAwKTtcbiAgICAgIC8vIFRoZSBwcm9ncmVzcyByaW5nIGlzIGluIDIgcGFydHMsIHRoZSBmbGF0bGlnaHQgY29sb3IgYW5kIGhpZ2hsaWdodCBjb2xvci5cbiAgICAgIC8vIFJlbmRlcmluZyBib3RoIG9uIHRvcCBvZiB0aGUgb3RoZXIsIHNlZW1zIHRvIG1ha2UgYSAzcmQgY29sb3Igb24gdGhlIGVkZ2VzLlxuICAgICAgLy8gVG8gY3JlYXRlIDEgd2hvbGUgcmluZyB3aXRoIDIgY29sb3JzLCBib3RoIHBhcnRzIGFyZSBpbnZlcnNlIG9mIHRoZSBvdGhlci5cbiAgICAgIHByb2dyZXNzUmluZ1swXS5zdHlsZVsnc3Ryb2tlLWRhc2hhcnJheSddID0gYDAsJHtoaWdobGlnaHRBcmN9cHgsJHt3aG9sZUFyY31weGA7XG4gICAgICBwcm9ncmVzc1JpbmdbMV0uc3R5bGVbJ3N0cm9rZS1kYXNoYXJyYXknXSA9IGAke2hpZ2hsaWdodEFyY31weCwke3dob2xlQXJjfXB4YDtcbiAgICB9XG5cbiAgICAvLyB1cGRhdGUgc3RhdHNcbiAgICB2YXIgbXMgPSBuZXcgRGF0ZSgpIC0gc3RhdHMuc3RhcnQ7XG4gICAgdGV4dChwYXNzZXNDb3VudCwgc3RhdHMucGFzc2VzKTtcbiAgICB0ZXh0KGZhaWx1cmVzQ291bnQsIHN0YXRzLmZhaWx1cmVzKTtcbiAgICB0ZXh0KGR1cmF0aW9uLCAobXMgLyAxMDAwKS50b0ZpeGVkKDIpKTtcbiAgfVxufVxuXG4vKipcbiAqIE1ha2VzIGEgVVJMLCBwcmVzZXJ2aW5nIHF1ZXJ5c3RyaW5nIChcInNlYXJjaFwiKSBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEEgbmV3IFVSTC5cbiAqL1xuZnVuY3Rpb24gbWFrZVVybChzKSB7XG4gIHZhciBzZWFyY2ggPSB3aW5kb3cubG9jYXRpb24uc2VhcmNoO1xuXG4gIC8vIFJlbW92ZSBwcmV2aW91cyB7Z3JlcCwgZmdyZXAsIGludmVydH0gcXVlcnkgcGFyYW1ldGVycyBpZiBwcmVzZW50XG4gIGlmIChzZWFyY2gpIHtcbiAgICBzZWFyY2ggPSBzZWFyY2gucmVwbGFjZSgvWz8mXSg/OmY/Z3JlcHxpbnZlcnQpPVteJlxcc10qL2csICcnKS5yZXBsYWNlKC9eJi8sICc/Jyk7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSArXG4gICAgKHNlYXJjaCA/IHNlYXJjaCArICcmJyA6ICc/JykgK1xuICAgICdncmVwPScgK1xuICAgIGVuY29kZVVSSUNvbXBvbmVudChzKVxuICApO1xufVxuXG4vKipcbiAqIFByb3ZpZGUgc3VpdGUgVVJMLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbc3VpdGVdXG4gKi9cbkhUTUwucHJvdG90eXBlLnN1aXRlVVJMID0gZnVuY3Rpb24gKHN1aXRlKSB7XG4gIHJldHVybiBtYWtlVXJsKCdeJyArIGVzY2FwZVJlKHN1aXRlLmZ1bGxUaXRsZSgpKSArICcgJyk7XG59O1xuXG4vKipcbiAqIFByb3ZpZGUgdGVzdCBVUkwuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFt0ZXN0XVxuICovXG5IVE1MLnByb3RvdHlwZS50ZXN0VVJMID0gZnVuY3Rpb24gKHRlc3QpIHtcbiAgcmV0dXJuIG1ha2VVcmwoJ14nICsgZXNjYXBlUmUodGVzdC5mdWxsVGl0bGUoKSkgKyAnJCcpO1xufTtcblxuLyoqXG4gKiBBZGRzIGNvZGUgdG9nZ2xlIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZSBwcm92aWRlZCB0ZXN0J3MgbGlzdCBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7SFRNTExJRWxlbWVudH0gZWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50c1xuICovXG5IVE1MLnByb3RvdHlwZS5hZGRDb2RlVG9nZ2xlID0gZnVuY3Rpb24gKGVsLCBjb250ZW50cykge1xuICB2YXIgaDIgPSBlbC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaDInKVswXTtcblxuICBvbihoMiwgJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIHByZS5zdHlsZS5kaXNwbGF5ID0gcHJlLnN0eWxlLmRpc3BsYXkgPT09ICdub25lJyA/ICdibG9jaycgOiAnbm9uZSc7XG4gIH0pO1xuXG4gIHZhciBwcmUgPSBmcmFnbWVudCgnPHByZT48Y29kZT4lZTwvY29kZT48L3ByZT4nLCB1dGlscy5jbGVhbihjb250ZW50cykpO1xuICBlbC5hcHBlbmRDaGlsZChwcmUpO1xuICBwcmUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbn07XG5cbi8qKlxuICogRGlzcGxheSBlcnJvciBgbXNnYC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbXNnXG4gKi9cbmZ1bmN0aW9uIGVycm9yKG1zZykge1xuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGZyYWdtZW50KCc8ZGl2IGlkPVwibW9jaGEtZXJyb3JcIj4lczwvZGl2PicsIG1zZykpO1xufVxuXG4vKipcbiAqIFJldHVybiBhIERPTSBmcmFnbWVudCBmcm9tIGBodG1sYC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaHRtbFxuICovXG5mdW5jdGlvbiBmcmFnbWVudChodG1sKSB7XG4gIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHZhciBpID0gMTtcblxuICBkaXYuaW5uZXJIVE1MID0gaHRtbC5yZXBsYWNlKC8lKFtzZV0pL2csIGZ1bmN0aW9uIChfLCB0eXBlKSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdzJzpcbiAgICAgICAgcmV0dXJuIFN0cmluZyhhcmdzW2krK10pO1xuICAgICAgY2FzZSAnZSc6XG4gICAgICAgIHJldHVybiBlc2NhcGUoYXJnc1tpKytdKTtcbiAgICAgIC8vIG5vIGRlZmF1bHRcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBkaXYuZmlyc3RDaGlsZDtcbn1cblxuLyoqXG4gKiBDaGVjayBmb3Igc3VpdGVzIHRoYXQgZG8gbm90IGhhdmUgZWxlbWVudHNcbiAqIHdpdGggYGNsYXNzbmFtZWAsIGFuZCBoaWRlIHRoZW0uXG4gKlxuICogQHBhcmFtIHt0ZXh0fSBjbGFzc25hbWVcbiAqL1xuZnVuY3Rpb24gaGlkZVN1aXRlc1dpdGhvdXQoY2xhc3NuYW1lKSB7XG4gIHZhciBzdWl0ZXMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdzdWl0ZScpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHN1aXRlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbHMgPSBzdWl0ZXNbaV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbGFzc25hbWUpO1xuICAgIGlmICghZWxzLmxlbmd0aCkge1xuICAgICAgc3VpdGVzW2ldLmNsYXNzTmFtZSArPSAnIGhpZGRlbic7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVW5oaWRlIC5oaWRkZW4gc3VpdGVzLlxuICovXG5mdW5jdGlvbiB1bmhpZGUoKSB7XG4gIHZhciBlbHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdzdWl0ZSBoaWRkZW4nKTtcbiAgd2hpbGUgKGVscy5sZW5ndGggPiAwKSB7XG4gICAgZWxzWzBdLmNsYXNzTmFtZSA9IGVsc1swXS5jbGFzc05hbWUucmVwbGFjZSgnc3VpdGUgaGlkZGVuJywgJ3N1aXRlJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBTZXQgYW4gZWxlbWVudCdzIHRleHQgY29udGVudHMuXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50c1xuICovXG5mdW5jdGlvbiB0ZXh0KGVsLCBjb250ZW50cykge1xuICBpZiAoZWwudGV4dENvbnRlbnQpIHtcbiAgICBlbC50ZXh0Q29udGVudCA9IGNvbnRlbnRzO1xuICB9IGVsc2Uge1xuICAgIGVsLmlubmVyVGV4dCA9IGNvbnRlbnRzO1xuICB9XG59XG5cbi8qKlxuICogTGlzdGVuIG9uIGBldmVudGAgd2l0aCBjYWxsYmFjayBgZm5gLlxuICovXG5mdW5jdGlvbiBvbihlbCwgZXZlbnQsIGZuKSB7XG4gIGlmIChlbC5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgZm4sIGZhbHNlKTtcbiAgfSBlbHNlIHtcbiAgICBlbC5hdHRhY2hFdmVudCgnb24nICsgZXZlbnQsIGZuKTtcbiAgfVxufVxuXG5IVE1MLmJyb3dzZXJPbmx5ID0gdHJ1ZTtcbiIsICIndXNlIHN0cmljdCc7XG4vKipcbiAqIEBtb2R1bGUgTGlzdFxuICovXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIEJhc2UgPSByZXF1aXJlKCcuL2Jhc2UnKTtcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJy4uL3V0aWxzJykuaW5oZXJpdHM7XG52YXIgY29uc3RhbnRzID0gcmVxdWlyZSgnLi4vcnVubmVyJykuY29uc3RhbnRzO1xudmFyIEVWRU5UX1JVTl9CRUdJTiA9IGNvbnN0YW50cy5FVkVOVF9SVU5fQkVHSU47XG52YXIgRVZFTlRfUlVOX0VORCA9IGNvbnN0YW50cy5FVkVOVF9SVU5fRU5EO1xudmFyIEVWRU5UX1RFU1RfQkVHSU4gPSBjb25zdGFudHMuRVZFTlRfVEVTVF9CRUdJTjtcbnZhciBFVkVOVF9URVNUX0ZBSUwgPSBjb25zdGFudHMuRVZFTlRfVEVTVF9GQUlMO1xudmFyIEVWRU5UX1RFU1RfUEFTUyA9IGNvbnN0YW50cy5FVkVOVF9URVNUX1BBU1M7XG52YXIgRVZFTlRfVEVTVF9QRU5ESU5HID0gY29uc3RhbnRzLkVWRU5UX1RFU1RfUEVORElORztcbnZhciBjb2xvciA9IEJhc2UuY29sb3I7XG52YXIgY3Vyc29yID0gQmFzZS5jdXJzb3I7XG5cbi8qKlxuICogRXhwb3NlIGBMaXN0YC5cbiAqL1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBMaXN0O1xuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBuZXcgYExpc3RgIHJlcG9ydGVyIGluc3RhbmNlLlxuICpcbiAqIEBwdWJsaWNcbiAqIEBjbGFzc1xuICogQG1lbWJlcm9mIE1vY2hhLnJlcG9ydGVyc1xuICogQGV4dGVuZHMgTW9jaGEucmVwb3J0ZXJzLkJhc2VcbiAqIEBwYXJhbSB7UnVubmVyfSBydW5uZXIgLSBJbnN0YW5jZSB0cmlnZ2VycyByZXBvcnRlciBhY3Rpb25zLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIHJ1bm5lciBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIExpc3QocnVubmVyLCBvcHRpb25zKSB7XG4gIEJhc2UuY2FsbCh0aGlzLCBydW5uZXIsIG9wdGlvbnMpO1xuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIG4gPSAwO1xuXG4gIHJ1bm5lci5vbihFVkVOVF9SVU5fQkVHSU4sIGZ1bmN0aW9uICgpIHtcbiAgICBCYXNlLmNvbnNvbGVMb2coKTtcbiAgfSk7XG5cbiAgcnVubmVyLm9uKEVWRU5UX1RFU1RfQkVHSU4sIGZ1bmN0aW9uICh0ZXN0KSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoY29sb3IoJ3Bhc3MnLCAnICAgICcgKyB0ZXN0LmZ1bGxUaXRsZSgpICsgJzogJykpO1xuICB9KTtcblxuICBydW5uZXIub24oRVZFTlRfVEVTVF9QRU5ESU5HLCBmdW5jdGlvbiAodGVzdCkge1xuICAgIHZhciBmbXQgPSBjb2xvcignY2hlY2ttYXJrJywgJyAgLScpICsgY29sb3IoJ3BlbmRpbmcnLCAnICVzJyk7XG4gICAgQmFzZS5jb25zb2xlTG9nKGZtdCwgdGVzdC5mdWxsVGl0bGUoKSk7XG4gIH0pO1xuXG4gIHJ1bm5lci5vbihFVkVOVF9URVNUX1BBU1MsIGZ1bmN0aW9uICh0ZXN0KSB7XG4gICAgdmFyIGZtdCA9XG4gICAgICBjb2xvcignY2hlY2ttYXJrJywgJyAgJyArIEJhc2Uuc3ltYm9scy5vaykgK1xuICAgICAgY29sb3IoJ3Bhc3MnLCAnICVzOiAnKSArXG4gICAgICBjb2xvcih0ZXN0LnNwZWVkLCAnJWRtcycpO1xuICAgIGN1cnNvci5DUigpO1xuICAgIEJhc2UuY29uc29sZUxvZyhmbXQsIHRlc3QuZnVsbFRpdGxlKCksIHRlc3QuZHVyYXRpb24pO1xuICB9KTtcblxuICBydW5uZXIub24oRVZFTlRfVEVTVF9GQUlMLCBmdW5jdGlvbiAodGVzdCkge1xuICAgIGN1cnNvci5DUigpO1xuICAgIEJhc2UuY29uc29sZUxvZyhjb2xvcignZmFpbCcsICcgICVkKSAlcycpLCArK24sIHRlc3QuZnVsbFRpdGxlKCkpO1xuICB9KTtcblxuICBydW5uZXIub25jZShFVkVOVF9SVU5fRU5ELCBzZWxmLmVwaWxvZ3VlLmJpbmQoc2VsZikpO1xufVxuXG4vKipcbiAqIEluaGVyaXQgZnJvbSBgQmFzZS5wcm90b3R5cGVgLlxuICovXG5pbmhlcml0cyhMaXN0LCBCYXNlKTtcblxuTGlzdC5kZXNjcmlwdGlvbiA9ICdsaWtlIFwic3BlY1wiIHJlcG9ydGVyIGJ1dCBmbGF0JztcbiIsICIndXNlIHN0cmljdCc7XG4vKipcbiAqIEBtb2R1bGUgTWluXG4gKi9cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgQmFzZSA9IHJlcXVpcmUoJy4vYmFzZScpO1xudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnLi4vdXRpbHMnKS5pbmhlcml0cztcbnZhciBjb25zdGFudHMgPSByZXF1aXJlKCcuLi9ydW5uZXInKS5jb25zdGFudHM7XG52YXIgRVZFTlRfUlVOX0VORCA9IGNvbnN0YW50cy5FVkVOVF9SVU5fRU5EO1xudmFyIEVWRU5UX1JVTl9CRUdJTiA9IGNvbnN0YW50cy5FVkVOVF9SVU5fQkVHSU47XG5cbi8qKlxuICogRXhwb3NlIGBNaW5gLlxuICovXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IE1pbjtcblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgbmV3IGBNaW5gIHJlcG9ydGVyIGluc3RhbmNlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVGhpcyBtaW5pbWFsIHRlc3QgcmVwb3J0ZXIgaXMgYmVzdCB1c2VkIHdpdGggJy0td2F0Y2gnLlxuICpcbiAqIEBwdWJsaWNcbiAqIEBjbGFzc1xuICogQG1lbWJlcm9mIE1vY2hhLnJlcG9ydGVyc1xuICogQGV4dGVuZHMgTW9jaGEucmVwb3J0ZXJzLkJhc2VcbiAqIEBwYXJhbSB7UnVubmVyfSBydW5uZXIgLSBJbnN0YW5jZSB0cmlnZ2VycyByZXBvcnRlciBhY3Rpb25zLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIHJ1bm5lciBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIE1pbihydW5uZXIsIG9wdGlvbnMpIHtcbiAgQmFzZS5jYWxsKHRoaXMsIHJ1bm5lciwgb3B0aW9ucyk7XG5cbiAgcnVubmVyLm9uKEVWRU5UX1JVTl9CRUdJTiwgZnVuY3Rpb24gKCkge1xuICAgIC8vIGNsZWFyIHNjcmVlblxuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXHUwMDFiWzJKJyk7XG4gICAgLy8gc2V0IGN1cnNvciBwb3NpdGlvblxuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXHUwMDFiWzE7M0gnKTtcbiAgfSk7XG5cbiAgcnVubmVyLm9uY2UoRVZFTlRfUlVOX0VORCwgdGhpcy5lcGlsb2d1ZS5iaW5kKHRoaXMpKTtcbn1cblxuLyoqXG4gKiBJbmhlcml0IGZyb20gYEJhc2UucHJvdG90eXBlYC5cbiAqL1xuaW5oZXJpdHMoTWluLCBCYXNlKTtcblxuTWluLmRlc2NyaXB0aW9uID0gJ2Vzc2VudGlhbGx5IGp1c3QgYSBzdW1tYXJ5JztcbiIsICIndXNlIHN0cmljdCc7XG4vKipcbiAqIEBtb2R1bGUgU3BlY1xuICovXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIEJhc2UgPSByZXF1aXJlKCcuL2Jhc2UnKTtcbnZhciBjb25zdGFudHMgPSByZXF1aXJlKCcuLi9ydW5uZXInKS5jb25zdGFudHM7XG52YXIgRVZFTlRfUlVOX0JFR0lOID0gY29uc3RhbnRzLkVWRU5UX1JVTl9CRUdJTjtcbnZhciBFVkVOVF9SVU5fRU5EID0gY29uc3RhbnRzLkVWRU5UX1JVTl9FTkQ7XG52YXIgRVZFTlRfU1VJVEVfQkVHSU4gPSBjb25zdGFudHMuRVZFTlRfU1VJVEVfQkVHSU47XG52YXIgRVZFTlRfU1VJVEVfRU5EID0gY29uc3RhbnRzLkVWRU5UX1NVSVRFX0VORDtcbnZhciBFVkVOVF9URVNUX0ZBSUwgPSBjb25zdGFudHMuRVZFTlRfVEVTVF9GQUlMO1xudmFyIEVWRU5UX1RFU1RfUEFTUyA9IGNvbnN0YW50cy5FVkVOVF9URVNUX1BBU1M7XG52YXIgRVZFTlRfVEVTVF9QRU5ESU5HID0gY29uc3RhbnRzLkVWRU5UX1RFU1RfUEVORElORztcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJy4uL3V0aWxzJykuaW5oZXJpdHM7XG52YXIgY29sb3IgPSBCYXNlLmNvbG9yO1xuXG4vKipcbiAqIEV4cG9zZSBgU3BlY2AuXG4gKi9cblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gU3BlYztcblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgbmV3IGBTcGVjYCByZXBvcnRlciBpbnN0YW5jZS5cbiAqXG4gKiBAcHVibGljXG4gKiBAY2xhc3NcbiAqIEBtZW1iZXJvZiBNb2NoYS5yZXBvcnRlcnNcbiAqIEBleHRlbmRzIE1vY2hhLnJlcG9ydGVycy5CYXNlXG4gKiBAcGFyYW0ge1J1bm5lcn0gcnVubmVyIC0gSW5zdGFuY2UgdHJpZ2dlcnMgcmVwb3J0ZXIgYWN0aW9ucy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBydW5uZXIgb3B0aW9uc1xuICovXG5mdW5jdGlvbiBTcGVjKHJ1bm5lciwgb3B0aW9ucykge1xuICBCYXNlLmNhbGwodGhpcywgcnVubmVyLCBvcHRpb25zKTtcblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBpbmRlbnRzID0gMDtcbiAgdmFyIG4gPSAwO1xuXG4gIGZ1bmN0aW9uIGluZGVudCgpIHtcbiAgICByZXR1cm4gQXJyYXkoaW5kZW50cykuam9pbignICAnKTtcbiAgfVxuXG4gIHJ1bm5lci5vbihFVkVOVF9SVU5fQkVHSU4sIGZ1bmN0aW9uICgpIHtcbiAgICBCYXNlLmNvbnNvbGVMb2coKTtcbiAgfSk7XG5cbiAgcnVubmVyLm9uKEVWRU5UX1NVSVRFX0JFR0lOLCBmdW5jdGlvbiAoc3VpdGUpIHtcbiAgICArK2luZGVudHM7XG4gICAgQmFzZS5jb25zb2xlTG9nKGNvbG9yKCdzdWl0ZScsICclcyVzJyksIGluZGVudCgpLCBzdWl0ZS50aXRsZSk7XG4gIH0pO1xuXG4gIHJ1bm5lci5vbihFVkVOVF9TVUlURV9FTkQsIGZ1bmN0aW9uICgpIHtcbiAgICAtLWluZGVudHM7XG4gICAgaWYgKGluZGVudHMgPT09IDEpIHtcbiAgICAgIEJhc2UuY29uc29sZUxvZygpO1xuICAgIH1cbiAgfSk7XG5cbiAgcnVubmVyLm9uKEVWRU5UX1RFU1RfUEVORElORywgZnVuY3Rpb24gKHRlc3QpIHtcbiAgICB2YXIgZm10ID0gaW5kZW50KCkgKyBjb2xvcigncGVuZGluZycsICcgIC0gJXMnKTtcbiAgICBCYXNlLmNvbnNvbGVMb2coZm10LCB0ZXN0LnRpdGxlKTtcbiAgfSk7XG5cbiAgcnVubmVyLm9uKEVWRU5UX1RFU1RfUEFTUywgZnVuY3Rpb24gKHRlc3QpIHtcbiAgICB2YXIgZm10O1xuICAgIGlmICh0ZXN0LnNwZWVkID09PSAnZmFzdCcpIHtcbiAgICAgIGZtdCA9XG4gICAgICAgIGluZGVudCgpICtcbiAgICAgICAgY29sb3IoJ2NoZWNrbWFyaycsICcgICcgKyBCYXNlLnN5bWJvbHMub2spICtcbiAgICAgICAgY29sb3IoJ3Bhc3MnLCAnICVzJyk7XG4gICAgICBCYXNlLmNvbnNvbGVMb2coZm10LCB0ZXN0LnRpdGxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm10ID1cbiAgICAgICAgaW5kZW50KCkgK1xuICAgICAgICBjb2xvcignY2hlY2ttYXJrJywgJyAgJyArIEJhc2Uuc3ltYm9scy5vaykgK1xuICAgICAgICBjb2xvcigncGFzcycsICcgJXMnKSArXG4gICAgICAgIGNvbG9yKHRlc3Quc3BlZWQsICcgKCVkbXMpJyk7XG4gICAgICBCYXNlLmNvbnNvbGVMb2coZm10LCB0ZXN0LnRpdGxlLCB0ZXN0LmR1cmF0aW9uKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJ1bm5lci5vbihFVkVOVF9URVNUX0ZBSUwsIGZ1bmN0aW9uICh0ZXN0KSB7XG4gICAgQmFzZS5jb25zb2xlTG9nKGluZGVudCgpICsgY29sb3IoJ2ZhaWwnLCAnICAlZCkgJXMnKSwgKytuLCB0ZXN0LnRpdGxlKTtcbiAgfSk7XG5cbiAgcnVubmVyLm9uY2UoRVZFTlRfUlVOX0VORCwgc2VsZi5lcGlsb2d1ZS5iaW5kKHNlbGYpKTtcbn1cblxuLyoqXG4gKiBJbmhlcml0IGZyb20gYEJhc2UucHJvdG90eXBlYC5cbiAqL1xuaW5oZXJpdHMoU3BlYywgQmFzZSk7XG5cblNwZWMuZGVzY3JpcHRpb24gPSAnaGllcmFyY2hpY2FsICYgdmVyYm9zZSBbZGVmYXVsdF0nO1xuIiwgIid1c2Ugc3RyaWN0Jztcbi8qKlxuICogQG1vZHVsZSBOeWFuXG4gKi9cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgQmFzZSA9IHJlcXVpcmUoJy4vYmFzZScpO1xudmFyIGNvbnN0YW50cyA9IHJlcXVpcmUoJy4uL3J1bm5lcicpLmNvbnN0YW50cztcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJy4uL3V0aWxzJykuaW5oZXJpdHM7XG52YXIgRVZFTlRfUlVOX0JFR0lOID0gY29uc3RhbnRzLkVWRU5UX1JVTl9CRUdJTjtcbnZhciBFVkVOVF9URVNUX1BFTkRJTkcgPSBjb25zdGFudHMuRVZFTlRfVEVTVF9QRU5ESU5HO1xudmFyIEVWRU5UX1RFU1RfUEFTUyA9IGNvbnN0YW50cy5FVkVOVF9URVNUX1BBU1M7XG52YXIgRVZFTlRfUlVOX0VORCA9IGNvbnN0YW50cy5FVkVOVF9SVU5fRU5EO1xudmFyIEVWRU5UX1RFU1RfRkFJTCA9IGNvbnN0YW50cy5FVkVOVF9URVNUX0ZBSUw7XG5cbi8qKlxuICogRXhwb3NlIGBEb3RgLlxuICovXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IE55YW5DYXQ7XG5cbi8qKlxuICogQ29uc3RydWN0cyBhIG5ldyBgTnlhbmAgcmVwb3J0ZXIgaW5zdGFuY2UuXG4gKlxuICogQHB1YmxpY1xuICogQGNsYXNzIE55YW5cbiAqIEBtZW1iZXJvZiBNb2NoYS5yZXBvcnRlcnNcbiAqIEBleHRlbmRzIE1vY2hhLnJlcG9ydGVycy5CYXNlXG4gKiBAcGFyYW0ge1J1bm5lcn0gcnVubmVyIC0gSW5zdGFuY2UgdHJpZ2dlcnMgcmVwb3J0ZXIgYWN0aW9ucy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBydW5uZXIgb3B0aW9uc1xuICovXG5mdW5jdGlvbiBOeWFuQ2F0KHJ1bm5lciwgb3B0aW9ucykge1xuICBCYXNlLmNhbGwodGhpcywgcnVubmVyLCBvcHRpb25zKTtcblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciB3aWR0aCA9IChCYXNlLndpbmRvdy53aWR0aCAqIDAuNzUpIHwgMDtcbiAgdmFyIG55YW5DYXRXaWR0aCA9ICh0aGlzLm55YW5DYXRXaWR0aCA9IDExKTtcblxuICB0aGlzLmNvbG9ySW5kZXggPSAwO1xuICB0aGlzLm51bWJlck9mTGluZXMgPSA0O1xuICB0aGlzLnJhaW5ib3dDb2xvcnMgPSBzZWxmLmdlbmVyYXRlQ29sb3JzKCk7XG4gIHRoaXMuc2NvcmVib2FyZFdpZHRoID0gNTtcbiAgdGhpcy50aWNrID0gMDtcbiAgdGhpcy50cmFqZWN0b3JpZXMgPSBbW10sIFtdLCBbXSwgW11dO1xuICB0aGlzLnRyYWplY3RvcnlXaWR0aE1heCA9IHdpZHRoIC0gbnlhbkNhdFdpZHRoO1xuXG4gIHJ1bm5lci5vbihFVkVOVF9SVU5fQkVHSU4sIGZ1bmN0aW9uICgpIHtcbiAgICBCYXNlLmN1cnNvci5oaWRlKCk7XG4gICAgc2VsZi5kcmF3KCk7XG4gIH0pO1xuXG4gIHJ1bm5lci5vbihFVkVOVF9URVNUX1BFTkRJTkcsIGZ1bmN0aW9uICgpIHtcbiAgICBzZWxmLmRyYXcoKTtcbiAgfSk7XG5cbiAgcnVubmVyLm9uKEVWRU5UX1RFU1RfUEFTUywgZnVuY3Rpb24gKCkge1xuICAgIHNlbGYuZHJhdygpO1xuICB9KTtcblxuICBydW5uZXIub24oRVZFTlRfVEVTVF9GQUlMLCBmdW5jdGlvbiAoKSB7XG4gICAgc2VsZi5kcmF3KCk7XG4gIH0pO1xuXG4gIHJ1bm5lci5vbmNlKEVWRU5UX1JVTl9FTkQsIGZ1bmN0aW9uICgpIHtcbiAgICBCYXNlLmN1cnNvci5zaG93KCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLm51bWJlck9mTGluZXM7IGkrKykge1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICAgIH1cbiAgICBzZWxmLmVwaWxvZ3VlKCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEluaGVyaXQgZnJvbSBgQmFzZS5wcm90b3R5cGVgLlxuICovXG5pbmhlcml0cyhOeWFuQ2F0LCBCYXNlKTtcblxuLyoqXG4gKiBEcmF3IHRoZSBueWFuIGNhdFxuICpcbiAqIEBwcml2YXRlXG4gKi9cblxuTnlhbkNhdC5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5hcHBlbmRSYWluYm93KCk7XG4gIHRoaXMuZHJhd1Njb3JlYm9hcmQoKTtcbiAgdGhpcy5kcmF3UmFpbmJvdygpO1xuICB0aGlzLmRyYXdOeWFuQ2F0KCk7XG4gIHRoaXMudGljayA9ICF0aGlzLnRpY2s7XG59O1xuXG4vKipcbiAqIERyYXcgdGhlIFwic2NvcmVib2FyZFwiIHNob3dpbmcgdGhlIG51bWJlclxuICogb2YgcGFzc2VzLCBmYWlsdXJlcyBhbmQgcGVuZGluZyB0ZXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5cbk55YW5DYXQucHJvdG90eXBlLmRyYXdTY29yZWJvYXJkID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdHMgPSB0aGlzLnN0YXRzO1xuXG4gIGZ1bmN0aW9uIGRyYXcodHlwZSwgbikge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgJyk7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoQmFzZS5jb2xvcih0eXBlLCBuKSk7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICB9XG5cbiAgZHJhdygnZ3JlZW4nLCBzdGF0cy5wYXNzZXMpO1xuICBkcmF3KCdmYWlsJywgc3RhdHMuZmFpbHVyZXMpO1xuICBkcmF3KCdwZW5kaW5nJywgc3RhdHMucGVuZGluZyk7XG4gIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcblxuICB0aGlzLmN1cnNvclVwKHRoaXMubnVtYmVyT2ZMaW5lcyk7XG59O1xuXG4vKipcbiAqIEFwcGVuZCB0aGUgcmFpbmJvdy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5cbk55YW5DYXQucHJvdG90eXBlLmFwcGVuZFJhaW5ib3cgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWdtZW50ID0gdGhpcy50aWNrID8gJ18nIDogJy0nO1xuICB2YXIgcmFpbmJvd2lmaWVkID0gdGhpcy5yYWluYm93aWZ5KHNlZ21lbnQpO1xuXG4gIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLm51bWJlck9mTGluZXM7IGluZGV4KyspIHtcbiAgICB2YXIgdHJhamVjdG9yeSA9IHRoaXMudHJhamVjdG9yaWVzW2luZGV4XTtcbiAgICBpZiAodHJhamVjdG9yeS5sZW5ndGggPj0gdGhpcy50cmFqZWN0b3J5V2lkdGhNYXgpIHtcbiAgICAgIHRyYWplY3Rvcnkuc2hpZnQoKTtcbiAgICB9XG4gICAgdHJhamVjdG9yeS5wdXNoKHJhaW5ib3dpZmllZCk7XG4gIH1cbn07XG5cbi8qKlxuICogRHJhdyB0aGUgcmFpbmJvdy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5cbk55YW5DYXQucHJvdG90eXBlLmRyYXdSYWluYm93ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgdGhpcy50cmFqZWN0b3JpZXMuZm9yRWFjaChmdW5jdGlvbiAobGluZSkge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXHUwMDFiWycgKyBzZWxmLnNjb3JlYm9hcmRXaWR0aCArICdDJyk7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUobGluZS5qb2luKCcnKSk7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICB9KTtcblxuICB0aGlzLmN1cnNvclVwKHRoaXMubnVtYmVyT2ZMaW5lcyk7XG59O1xuXG4vKipcbiAqIERyYXcgdGhlIG55YW4gY2F0XG4gKlxuICogQHByaXZhdGVcbiAqL1xuTnlhbkNhdC5wcm90b3R5cGUuZHJhd055YW5DYXQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHN0YXJ0V2lkdGggPSB0aGlzLnNjb3JlYm9hcmRXaWR0aCArIHRoaXMudHJhamVjdG9yaWVzWzBdLmxlbmd0aDtcbiAgdmFyIGRpc3QgPSAnXFx1MDAxYlsnICsgc3RhcnRXaWR0aCArICdDJztcbiAgdmFyIHBhZGRpbmcgPSAnJztcblxuICBwcm9jZXNzLnN0ZG91dC53cml0ZShkaXN0KTtcbiAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ18sLS0tLS0tLCcpO1xuICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG5cbiAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoZGlzdCk7XG4gIHBhZGRpbmcgPSBzZWxmLnRpY2sgPyAnICAnIDogJyAgICc7XG4gIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdffCcgKyBwYWRkaW5nICsgJy9cXFxcXy9cXFxcICcpO1xuICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG5cbiAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoZGlzdCk7XG4gIHBhZGRpbmcgPSBzZWxmLnRpY2sgPyAnXycgOiAnX18nO1xuICB2YXIgdGFpbCA9IHNlbGYudGljayA/ICd+JyA6ICdeJztcbiAgcHJvY2Vzcy5zdGRvdXQud3JpdGUodGFpbCArICd8JyArIHBhZGRpbmcgKyB0aGlzLmZhY2UoKSArICcgJyk7XG4gIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcblxuICBwcm9jZXNzLnN0ZG91dC53cml0ZShkaXN0KTtcbiAgcGFkZGluZyA9IHNlbGYudGljayA/ICcgJyA6ICcgICc7XG4gIHByb2Nlc3Muc3Rkb3V0LndyaXRlKHBhZGRpbmcgKyAnXCJcIiAgXCJcIiAnKTtcbiAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuXG4gIHRoaXMuY3Vyc29yVXAodGhpcy5udW1iZXJPZkxpbmVzKTtcbn07XG5cbi8qKlxuICogRHJhdyBueWFuIGNhdCBmYWNlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cblxuTnlhbkNhdC5wcm90b3R5cGUuZmFjZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRzID0gdGhpcy5zdGF0cztcbiAgaWYgKHN0YXRzLmZhaWx1cmVzKSB7XG4gICAgcmV0dXJuICcoIHggLngpJztcbiAgfSBlbHNlIGlmIChzdGF0cy5wZW5kaW5nKSB7XG4gICAgcmV0dXJuICcoIG8gLm8pJztcbiAgfSBlbHNlIGlmIChzdGF0cy5wYXNzZXMpIHtcbiAgICByZXR1cm4gJyggXiAuXiknO1xuICB9XG4gIHJldHVybiAnKCAtIC4tKSc7XG59O1xuXG4vKipcbiAqIE1vdmUgY3Vyc29yIHVwIGBuYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IG5cbiAqL1xuXG5OeWFuQ2F0LnByb3RvdHlwZS5jdXJzb3JVcCA9IGZ1bmN0aW9uIChuKSB7XG4gIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXHUwMDFiWycgKyBuICsgJ0EnKTtcbn07XG5cbi8qKlxuICogTW92ZSBjdXJzb3IgZG93biBgbmAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBuXG4gKi9cblxuTnlhbkNhdC5wcm90b3R5cGUuY3Vyc29yRG93biA9IGZ1bmN0aW9uIChuKSB7XG4gIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXHUwMDFiWycgKyBuICsgJ0InKTtcbn07XG5cbi8qKlxuICogR2VuZXJhdGUgcmFpbmJvdyBjb2xvcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5OeWFuQ2F0LnByb3RvdHlwZS5nZW5lcmF0ZUNvbG9ycyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGNvbG9ycyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgNiAqIDc7IGkrKykge1xuICAgIHZhciBwaTMgPSBNYXRoLmZsb29yKE1hdGguUEkgLyAzKTtcbiAgICB2YXIgbiA9IGkgKiAoMS4wIC8gNik7XG4gICAgdmFyIHIgPSBNYXRoLmZsb29yKDMgKiBNYXRoLnNpbihuKSArIDMpO1xuICAgIHZhciBnID0gTWF0aC5mbG9vcigzICogTWF0aC5zaW4obiArIDIgKiBwaTMpICsgMyk7XG4gICAgdmFyIGIgPSBNYXRoLmZsb29yKDMgKiBNYXRoLnNpbihuICsgNCAqIHBpMykgKyAzKTtcbiAgICBjb2xvcnMucHVzaCgzNiAqIHIgKyA2ICogZyArIGIgKyAxNik7XG4gIH1cblxuICByZXR1cm4gY29sb3JzO1xufTtcblxuLyoqXG4gKiBBcHBseSByYWluYm93IHRvIHRoZSBnaXZlbiBgc3RyYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5OeWFuQ2F0LnByb3RvdHlwZS5yYWluYm93aWZ5ID0gZnVuY3Rpb24gKHN0cikge1xuICBpZiAoIUJhc2UudXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuICB2YXIgY29sb3IgPSB0aGlzLnJhaW5ib3dDb2xvcnNbdGhpcy5jb2xvckluZGV4ICUgdGhpcy5yYWluYm93Q29sb3JzLmxlbmd0aF07XG4gIHRoaXMuY29sb3JJbmRleCArPSAxO1xuICByZXR1cm4gJ1xcdTAwMWJbMzg7NTsnICsgY29sb3IgKyAnbScgKyBzdHIgKyAnXFx1MDAxYlswbSc7XG59O1xuXG5OeWFuQ2F0LmRlc2NyaXB0aW9uID0gJ1wibnlhbiBjYXRcIic7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuLyoqXG4gKiBAbW9kdWxlIFhVbml0XG4gKi9cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgQmFzZSA9IHJlcXVpcmUoJy4vYmFzZScpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbnZhciBlcnJvcnMgPSByZXF1aXJlKCcuLi9lcnJvcnMnKTtcbnZhciBjcmVhdGVVbnN1cHBvcnRlZEVycm9yID0gZXJyb3JzLmNyZWF0ZVVuc3VwcG9ydGVkRXJyb3I7XG52YXIgY29uc3RhbnRzID0gcmVxdWlyZSgnLi4vcnVubmVyJykuY29uc3RhbnRzO1xudmFyIEVWRU5UX1RFU1RfUEFTUyA9IGNvbnN0YW50cy5FVkVOVF9URVNUX1BBU1M7XG52YXIgRVZFTlRfVEVTVF9GQUlMID0gY29uc3RhbnRzLkVWRU5UX1RFU1RfRkFJTDtcbnZhciBFVkVOVF9SVU5fRU5EID0gY29uc3RhbnRzLkVWRU5UX1JVTl9FTkQ7XG52YXIgRVZFTlRfVEVTVF9QRU5ESU5HID0gY29uc3RhbnRzLkVWRU5UX1RFU1RfUEVORElORztcbnZhciBTVEFURV9GQUlMRUQgPSByZXF1aXJlKCcuLi9ydW5uYWJsZScpLmNvbnN0YW50cy5TVEFURV9GQUlMRUQ7XG52YXIgaW5oZXJpdHMgPSB1dGlscy5pbmhlcml0cztcbnZhciBlc2NhcGUgPSB1dGlscy5lc2NhcGU7XG5cbi8qKlxuICogU2F2ZSB0aW1lciByZWZlcmVuY2VzIHRvIGF2b2lkIFNpbm9uIGludGVyZmVyaW5nIChzZWUgR0gtMjM3KS5cbiAqL1xudmFyIERhdGUgPSBnbG9iYWwuRGF0ZTtcblxuLyoqXG4gKiBFeHBvc2UgYFhVbml0YC5cbiAqL1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBYVW5pdDtcblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgbmV3IGBYVW5pdGAgcmVwb3J0ZXIgaW5zdGFuY2UuXG4gKlxuICogQHB1YmxpY1xuICogQGNsYXNzXG4gKiBAbWVtYmVyb2YgTW9jaGEucmVwb3J0ZXJzXG4gKiBAZXh0ZW5kcyBNb2NoYS5yZXBvcnRlcnMuQmFzZVxuICogQHBhcmFtIHtSdW5uZXJ9IHJ1bm5lciAtIEluc3RhbmNlIHRyaWdnZXJzIHJlcG9ydGVyIGFjdGlvbnMuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gcnVubmVyIG9wdGlvbnNcbiAqL1xuZnVuY3Rpb24gWFVuaXQocnVubmVyLCBvcHRpb25zKSB7XG4gIEJhc2UuY2FsbCh0aGlzLCBydW5uZXIsIG9wdGlvbnMpO1xuXG4gIHZhciBzdGF0cyA9IHRoaXMuc3RhdHM7XG4gIHZhciB0ZXN0cyA9IFtdO1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgLy8gdGhlIG5hbWUgb2YgdGhlIHRlc3Qgc3VpdGUsIGFzIGl0IHdpbGwgYXBwZWFyIGluIHRoZSByZXN1bHRpbmcgWE1MIGZpbGVcbiAgdmFyIHN1aXRlTmFtZTtcblxuICAvLyB0aGUgZGVmYXVsdCBuYW1lIG9mIHRoZSB0ZXN0IHN1aXRlIGlmIG5vbmUgaXMgcHJvdmlkZWRcbiAgdmFyIERFRkFVTFRfU1VJVEVfTkFNRSA9ICdNb2NoYSBUZXN0cyc7XG5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5yZXBvcnRlck9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5yZXBvcnRlck9wdGlvbnMub3V0cHV0KSB7XG4gICAgICBpZiAoIWZzLmNyZWF0ZVdyaXRlU3RyZWFtKSB7XG4gICAgICAgIHRocm93IGNyZWF0ZVVuc3VwcG9ydGVkRXJyb3IoJ2ZpbGUgb3V0cHV0IG5vdCBzdXBwb3J0ZWQgaW4gYnJvd3NlcicpO1xuICAgICAgfVxuXG4gICAgICBmcy5ta2RpclN5bmMocGF0aC5kaXJuYW1lKG9wdGlvbnMucmVwb3J0ZXJPcHRpb25zLm91dHB1dCksIHtcbiAgICAgICAgcmVjdXJzaXZlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHNlbGYuZmlsZVN0cmVhbSA9IGZzLmNyZWF0ZVdyaXRlU3RyZWFtKG9wdGlvbnMucmVwb3J0ZXJPcHRpb25zLm91dHB1dCk7XG4gICAgfVxuXG4gICAgLy8gZ2V0IHRoZSBzdWl0ZSBuYW1lIGZyb20gdGhlIHJlcG9ydGVyIG9wdGlvbnMgKGlmIHByb3ZpZGVkKVxuICAgIHN1aXRlTmFtZSA9IG9wdGlvbnMucmVwb3J0ZXJPcHRpb25zLnN1aXRlTmFtZTtcbiAgfVxuXG4gIC8vIGZhbGwgYmFjayB0byB0aGUgZGVmYXVsdCBzdWl0ZSBuYW1lXG4gIHN1aXRlTmFtZSA9IHN1aXRlTmFtZSB8fCBERUZBVUxUX1NVSVRFX05BTUU7XG5cbiAgcnVubmVyLm9uKEVWRU5UX1RFU1RfUEVORElORywgZnVuY3Rpb24gKHRlc3QpIHtcbiAgICB0ZXN0cy5wdXNoKHRlc3QpO1xuICB9KTtcblxuICBydW5uZXIub24oRVZFTlRfVEVTVF9QQVNTLCBmdW5jdGlvbiAodGVzdCkge1xuICAgIHRlc3RzLnB1c2godGVzdCk7XG4gIH0pO1xuXG4gIHJ1bm5lci5vbihFVkVOVF9URVNUX0ZBSUwsIGZ1bmN0aW9uICh0ZXN0KSB7XG4gICAgdGVzdHMucHVzaCh0ZXN0KTtcbiAgfSk7XG5cbiAgcnVubmVyLm9uY2UoRVZFTlRfUlVOX0VORCwgZnVuY3Rpb24gKCkge1xuICAgIHNlbGYud3JpdGUoXG4gICAgICB0YWcoXG4gICAgICAgICd0ZXN0c3VpdGUnLFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogc3VpdGVOYW1lLFxuICAgICAgICAgIHRlc3RzOiBzdGF0cy50ZXN0cyxcbiAgICAgICAgICBmYWlsdXJlczogMCxcbiAgICAgICAgICBlcnJvcnM6IHN0YXRzLmZhaWx1cmVzLFxuICAgICAgICAgIHNraXBwZWQ6IHN0YXRzLnRlc3RzIC0gc3RhdHMuZmFpbHVyZXMgLSBzdGF0cy5wYXNzZXMsXG4gICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvVVRDU3RyaW5nKCksXG4gICAgICAgICAgdGltZTogc3RhdHMuZHVyYXRpb24gLyAxMDAwIHx8IDBcbiAgICAgICAgfSxcbiAgICAgICAgZmFsc2VcbiAgICAgIClcbiAgICApO1xuXG4gICAgdGVzdHMuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgc2VsZi50ZXN0KHQpO1xuICAgIH0pO1xuXG4gICAgc2VsZi53cml0ZSgnPC90ZXN0c3VpdGU+Jyk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEluaGVyaXQgZnJvbSBgQmFzZS5wcm90b3R5cGVgLlxuICovXG5pbmhlcml0cyhYVW5pdCwgQmFzZSk7XG5cbi8qKlxuICogT3ZlcnJpZGUgZG9uZSB0byBjbG9zZSB0aGUgc3RyZWFtIChpZiBpdCdzIGEgZmlsZSkuXG4gKlxuICogQHBhcmFtIGZhaWx1cmVzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICovXG5YVW5pdC5wcm90b3R5cGUuZG9uZSA9IGZ1bmN0aW9uIChmYWlsdXJlcywgZm4pIHtcbiAgaWYgKHRoaXMuZmlsZVN0cmVhbSkge1xuICAgIHRoaXMuZmlsZVN0cmVhbS5lbmQoZnVuY3Rpb24gKCkge1xuICAgICAgZm4oZmFpbHVyZXMpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGZuKGZhaWx1cmVzKTtcbiAgfVxufTtcblxuLyoqXG4gKiBXcml0ZSBvdXQgdGhlIGdpdmVuIGxpbmUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGxpbmVcbiAqL1xuWFVuaXQucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGxpbmUpIHtcbiAgaWYgKHRoaXMuZmlsZVN0cmVhbSkge1xuICAgIHRoaXMuZmlsZVN0cmVhbS53cml0ZShsaW5lICsgJ1xcbicpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJiBwcm9jZXNzLnN0ZG91dCkge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGxpbmUgKyAnXFxuJyk7XG4gIH0gZWxzZSB7XG4gICAgQmFzZS5jb25zb2xlTG9nKGxpbmUpO1xuICB9XG59O1xuXG4vKipcbiAqIE91dHB1dCB0YWcgZm9yIHRoZSBnaXZlbiBgdGVzdC5gXG4gKlxuICogQHBhcmFtIHtUZXN0fSB0ZXN0XG4gKi9cblhVbml0LnByb3RvdHlwZS50ZXN0ID0gZnVuY3Rpb24gKHRlc3QpIHtcbiAgQmFzZS51c2VDb2xvcnMgPSBmYWxzZTtcblxuICB2YXIgYXR0cnMgPSB7XG4gICAgY2xhc3NuYW1lOiB0ZXN0LnBhcmVudC5mdWxsVGl0bGUoKSxcbiAgICBuYW1lOiB0ZXN0LnRpdGxlLFxuICAgIGZpbGU6IHRlc3QuZmlsZSxcbiAgICB0aW1lOiB0ZXN0LmR1cmF0aW9uIC8gMTAwMCB8fCAwXG4gIH07XG5cbiAgaWYgKHRlc3Quc3RhdGUgPT09IFNUQVRFX0ZBSUxFRCkge1xuICAgIHZhciBlcnIgPSB0ZXN0LmVycjtcbiAgICB2YXIgZGlmZiA9XG4gICAgICAhQmFzZS5oaWRlRGlmZiAmJiBCYXNlLnNob3dEaWZmKGVycilcbiAgICAgICAgPyAnXFxuJyArIEJhc2UuZ2VuZXJhdGVEaWZmKGVyci5hY3R1YWwsIGVyci5leHBlY3RlZClcbiAgICAgICAgOiAnJztcbiAgICB0aGlzLndyaXRlKFxuICAgICAgdGFnKFxuICAgICAgICAndGVzdGNhc2UnLFxuICAgICAgICBhdHRycyxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIHRhZyhcbiAgICAgICAgICAnZmFpbHVyZScsXG4gICAgICAgICAge30sXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgZXNjYXBlKGVyci5tZXNzYWdlKSArIGVzY2FwZShkaWZmKSArICdcXG4nICsgZXNjYXBlKGVyci5zdGFjaylcbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG4gIH0gZWxzZSBpZiAodGVzdC5pc1BlbmRpbmcoKSkge1xuICAgIHRoaXMud3JpdGUodGFnKCd0ZXN0Y2FzZScsIGF0dHJzLCBmYWxzZSwgdGFnKCdza2lwcGVkJywge30sIHRydWUpKSk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy53cml0ZSh0YWcoJ3Rlc3RjYXNlJywgYXR0cnMsIHRydWUpKTtcbiAgfVxufTtcblxuLyoqXG4gKiBIVE1MIHRhZyBoZWxwZXIuXG4gKlxuICogQHBhcmFtIG5hbWVcbiAqIEBwYXJhbSBhdHRyc1xuICogQHBhcmFtIGNsb3NlXG4gKiBAcGFyYW0gY29udGVudFxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiB0YWcobmFtZSwgYXR0cnMsIGNsb3NlLCBjb250ZW50KSB7XG4gIHZhciBlbmQgPSBjbG9zZSA/ICcvPicgOiAnPic7XG4gIHZhciBwYWlycyA9IFtdO1xuICB2YXIgdGFnO1xuXG4gIGZvciAodmFyIGtleSBpbiBhdHRycykge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXR0cnMsIGtleSkpIHtcbiAgICAgIHBhaXJzLnB1c2goa2V5ICsgJz1cIicgKyBlc2NhcGUoYXR0cnNba2V5XSkgKyAnXCInKTtcbiAgICB9XG4gIH1cblxuICB0YWcgPSAnPCcgKyBuYW1lICsgKHBhaXJzLmxlbmd0aCA/ICcgJyArIHBhaXJzLmpvaW4oJyAnKSA6ICcnKSArIGVuZDtcbiAgaWYgKGNvbnRlbnQpIHtcbiAgICB0YWcgKz0gY29udGVudCArICc8LycgKyBuYW1lICsgZW5kO1xuICB9XG4gIHJldHVybiB0YWc7XG59XG5cblhVbml0LmRlc2NyaXB0aW9uID0gJ1hVbml0LWNvbXBhdGlibGUgWE1MIG91dHB1dCc7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuLyoqXG4gKiBAbW9kdWxlIE1hcmtkb3duXG4gKi9cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgQmFzZSA9IHJlcXVpcmUoJy4vYmFzZScpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBjb25zdGFudHMgPSByZXF1aXJlKCcuLi9ydW5uZXInKS5jb25zdGFudHM7XG52YXIgRVZFTlRfUlVOX0VORCA9IGNvbnN0YW50cy5FVkVOVF9SVU5fRU5EO1xudmFyIEVWRU5UX1NVSVRFX0JFR0lOID0gY29uc3RhbnRzLkVWRU5UX1NVSVRFX0JFR0lOO1xudmFyIEVWRU5UX1NVSVRFX0VORCA9IGNvbnN0YW50cy5FVkVOVF9TVUlURV9FTkQ7XG52YXIgRVZFTlRfVEVTVF9QQVNTID0gY29uc3RhbnRzLkVWRU5UX1RFU1RfUEFTUztcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG52YXIgU1VJVEVfUFJFRklYID0gJyQnO1xuXG4vKipcbiAqIEV4cG9zZSBgTWFya2Rvd25gLlxuICovXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IE1hcmtkb3duO1xuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBuZXcgYE1hcmtkb3duYCByZXBvcnRlciBpbnN0YW5jZS5cbiAqXG4gKiBAcHVibGljXG4gKiBAY2xhc3NcbiAqIEBtZW1iZXJvZiBNb2NoYS5yZXBvcnRlcnNcbiAqIEBleHRlbmRzIE1vY2hhLnJlcG9ydGVycy5CYXNlXG4gKiBAcGFyYW0ge1J1bm5lcn0gcnVubmVyIC0gSW5zdGFuY2UgdHJpZ2dlcnMgcmVwb3J0ZXIgYWN0aW9ucy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBydW5uZXIgb3B0aW9uc1xuICovXG5mdW5jdGlvbiBNYXJrZG93bihydW5uZXIsIG9wdGlvbnMpIHtcbiAgQmFzZS5jYWxsKHRoaXMsIHJ1bm5lciwgb3B0aW9ucyk7XG5cbiAgdmFyIGxldmVsID0gMDtcbiAgdmFyIGJ1ZiA9ICcnO1xuXG4gIGZ1bmN0aW9uIHRpdGxlKHN0cikge1xuICAgIHJldHVybiBBcnJheShsZXZlbCkuam9pbignIycpICsgJyAnICsgc3RyO1xuICB9XG5cbiAgZnVuY3Rpb24gbWFwVE9DKHN1aXRlLCBvYmopIHtcbiAgICB2YXIgcmV0ID0gb2JqO1xuICAgIHZhciBrZXkgPSBTVUlURV9QUkVGSVggKyBzdWl0ZS50aXRsZTtcblxuICAgIG9iaiA9IG9ialtrZXldID0gb2JqW2tleV0gfHwge3N1aXRlfTtcbiAgICBzdWl0ZS5zdWl0ZXMuZm9yRWFjaChmdW5jdGlvbiAoc3VpdGUpIHtcbiAgICAgIG1hcFRPQyhzdWl0ZSwgb2JqKTtcbiAgICB9KTtcblxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBmdW5jdGlvbiBzdHJpbmdpZnlUT0Mob2JqLCBsZXZlbCkge1xuICAgICsrbGV2ZWw7XG4gICAgdmFyIGJ1ZiA9ICcnO1xuICAgIHZhciBsaW5rO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChrZXkgPT09ICdzdWl0ZScpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoa2V5ICE9PSBTVUlURV9QUkVGSVgpIHtcbiAgICAgICAgbGluayA9ICcgLSBbJyArIGtleS5zdWJzdHJpbmcoMSkgKyAnXSc7XG4gICAgICAgIGxpbmsgKz0gJygjJyArIHV0aWxzLnNsdWcob2JqW2tleV0uc3VpdGUuZnVsbFRpdGxlKCkpICsgJylcXG4nO1xuICAgICAgICBidWYgKz0gQXJyYXkobGV2ZWwpLmpvaW4oJyAgJykgKyBsaW5rO1xuICAgICAgfVxuICAgICAgYnVmICs9IHN0cmluZ2lmeVRPQyhvYmpba2V5XSwgbGV2ZWwpO1xuICAgIH1cbiAgICByZXR1cm4gYnVmO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2VuZXJhdGVUT0Moc3VpdGUpIHtcbiAgICB2YXIgb2JqID0gbWFwVE9DKHN1aXRlLCB7fSk7XG4gICAgcmV0dXJuIHN0cmluZ2lmeVRPQyhvYmosIDApO1xuICB9XG5cbiAgZ2VuZXJhdGVUT0MocnVubmVyLnN1aXRlKTtcblxuICBydW5uZXIub24oRVZFTlRfU1VJVEVfQkVHSU4sIGZ1bmN0aW9uIChzdWl0ZSkge1xuICAgICsrbGV2ZWw7XG4gICAgdmFyIHNsdWcgPSB1dGlscy5zbHVnKHN1aXRlLmZ1bGxUaXRsZSgpKTtcbiAgICBidWYgKz0gJzxhIG5hbWU9XCInICsgc2x1ZyArICdcIj48L2E+JyArICdcXG4nO1xuICAgIGJ1ZiArPSB0aXRsZShzdWl0ZS50aXRsZSkgKyAnXFxuJztcbiAgfSk7XG5cbiAgcnVubmVyLm9uKEVWRU5UX1NVSVRFX0VORCwgZnVuY3Rpb24gKCkge1xuICAgIC0tbGV2ZWw7XG4gIH0pO1xuXG4gIHJ1bm5lci5vbihFVkVOVF9URVNUX1BBU1MsIGZ1bmN0aW9uICh0ZXN0KSB7XG4gICAgdmFyIGNvZGUgPSB1dGlscy5jbGVhbih0ZXN0LmJvZHkpO1xuICAgIGJ1ZiArPSB0ZXN0LnRpdGxlICsgJy5cXG4nO1xuICAgIGJ1ZiArPSAnXFxuYGBganNcXG4nO1xuICAgIGJ1ZiArPSBjb2RlICsgJ1xcbic7XG4gICAgYnVmICs9ICdgYGBcXG5cXG4nO1xuICB9KTtcblxuICBydW5uZXIub25jZShFVkVOVF9SVU5fRU5ELCBmdW5jdGlvbiAoKSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyMgVE9DXFxuJyk7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoZ2VuZXJhdGVUT0MocnVubmVyLnN1aXRlKSk7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoYnVmKTtcbiAgfSk7XG59XG5cbk1hcmtkb3duLmRlc2NyaXB0aW9uID0gJ0dpdEh1YiBGbGF2b3JlZCBNYXJrZG93bic7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuLyoqXG4gKiBAbW9kdWxlIFByb2dyZXNzXG4gKi9cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgQmFzZSA9IHJlcXVpcmUoJy4vYmFzZScpO1xudmFyIGNvbnN0YW50cyA9IHJlcXVpcmUoJy4uL3J1bm5lcicpLmNvbnN0YW50cztcbnZhciBFVkVOVF9SVU5fQkVHSU4gPSBjb25zdGFudHMuRVZFTlRfUlVOX0JFR0lOO1xudmFyIEVWRU5UX1RFU1RfRU5EID0gY29uc3RhbnRzLkVWRU5UX1RFU1RfRU5EO1xudmFyIEVWRU5UX1JVTl9FTkQgPSBjb25zdGFudHMuRVZFTlRfUlVOX0VORDtcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJy4uL3V0aWxzJykuaW5oZXJpdHM7XG52YXIgY29sb3IgPSBCYXNlLmNvbG9yO1xudmFyIGN1cnNvciA9IEJhc2UuY3Vyc29yO1xuXG4vKipcbiAqIEV4cG9zZSBgUHJvZ3Jlc3NgLlxuICovXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IFByb2dyZXNzO1xuXG4vKipcbiAqIEdlbmVyYWwgcHJvZ3Jlc3MgYmFyIGNvbG9yLlxuICovXG5cbkJhc2UuY29sb3JzLnByb2dyZXNzID0gOTA7XG5cbi8qKlxuICogQ29uc3RydWN0cyBhIG5ldyBgUHJvZ3Jlc3NgIHJlcG9ydGVyIGluc3RhbmNlLlxuICpcbiAqIEBwdWJsaWNcbiAqIEBjbGFzc1xuICogQG1lbWJlcm9mIE1vY2hhLnJlcG9ydGVyc1xuICogQGV4dGVuZHMgTW9jaGEucmVwb3J0ZXJzLkJhc2VcbiAqIEBwYXJhbSB7UnVubmVyfSBydW5uZXIgLSBJbnN0YW5jZSB0cmlnZ2VycyByZXBvcnRlciBhY3Rpb25zLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIHJ1bm5lciBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIFByb2dyZXNzKHJ1bm5lciwgb3B0aW9ucykge1xuICBCYXNlLmNhbGwodGhpcywgcnVubmVyLCBvcHRpb25zKTtcblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciB3aWR0aCA9IChCYXNlLndpbmRvdy53aWR0aCAqIDAuNSkgfCAwO1xuICB2YXIgdG90YWwgPSBydW5uZXIudG90YWw7XG4gIHZhciBjb21wbGV0ZSA9IDA7XG4gIHZhciBsYXN0TiA9IC0xO1xuXG4gIC8vIGRlZmF1bHQgY2hhcnNcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciByZXBvcnRlck9wdGlvbnMgPSBvcHRpb25zLnJlcG9ydGVyT3B0aW9ucyB8fCB7fTtcblxuICBvcHRpb25zLm9wZW4gPSByZXBvcnRlck9wdGlvbnMub3BlbiB8fCAnWyc7XG4gIG9wdGlvbnMuY29tcGxldGUgPSByZXBvcnRlck9wdGlvbnMuY29tcGxldGUgfHwgJ+KWrCc7XG4gIG9wdGlvbnMuaW5jb21wbGV0ZSA9IHJlcG9ydGVyT3B0aW9ucy5pbmNvbXBsZXRlIHx8IEJhc2Uuc3ltYm9scy5kb3Q7XG4gIG9wdGlvbnMuY2xvc2UgPSByZXBvcnRlck9wdGlvbnMuY2xvc2UgfHwgJ10nO1xuICBvcHRpb25zLnZlcmJvc2UgPSByZXBvcnRlck9wdGlvbnMudmVyYm9zZSB8fCBmYWxzZTtcblxuICAvLyB0ZXN0cyBzdGFydGVkXG4gIHJ1bm5lci5vbihFVkVOVF9SVU5fQkVHSU4sIGZ1bmN0aW9uICgpIHtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gICAgY3Vyc29yLmhpZGUoKTtcbiAgfSk7XG5cbiAgLy8gdGVzdHMgY29tcGxldGVcbiAgcnVubmVyLm9uKEVWRU5UX1RFU1RfRU5ELCBmdW5jdGlvbiAoKSB7XG4gICAgY29tcGxldGUrKztcblxuICAgIHZhciBwZXJjZW50ID0gY29tcGxldGUgLyB0b3RhbDtcbiAgICB2YXIgbiA9ICh3aWR0aCAqIHBlcmNlbnQpIHwgMDtcbiAgICB2YXIgaSA9IHdpZHRoIC0gbjtcblxuICAgIGlmIChuID09PSBsYXN0TiAmJiAhb3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAvLyBEb24ndCByZS1yZW5kZXIgdGhlIGxpbmUgaWYgaXQgaGFzbid0IGNoYW5nZWRcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGFzdE4gPSBuO1xuXG4gICAgY3Vyc29yLkNSKCk7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcdTAwMWJbSicpO1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGNvbG9yKCdwcm9ncmVzcycsICcgICcgKyBvcHRpb25zLm9wZW4pKTtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShBcnJheShuKS5qb2luKG9wdGlvbnMuY29tcGxldGUpKTtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShBcnJheShpKS5qb2luKG9wdGlvbnMuaW5jb21wbGV0ZSkpO1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGNvbG9yKCdwcm9ncmVzcycsIG9wdGlvbnMuY2xvc2UpKTtcbiAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShjb2xvcigncHJvZ3Jlc3MnLCAnICcgKyBjb21wbGV0ZSArICcgb2YgJyArIHRvdGFsKSk7XG4gICAgfVxuICB9KTtcblxuICAvLyB0ZXN0cyBhcmUgY29tcGxldGUsIG91dHB1dCBzb21lIHN0YXRzXG4gIC8vIGFuZCB0aGUgZmFpbHVyZXMgaWYgYW55XG4gIHJ1bm5lci5vbmNlKEVWRU5UX1JVTl9FTkQsIGZ1bmN0aW9uICgpIHtcbiAgICBjdXJzb3Iuc2hvdygpO1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgICBzZWxmLmVwaWxvZ3VlKCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEluaGVyaXQgZnJvbSBgQmFzZS5wcm90b3R5cGVgLlxuICovXG5pbmhlcml0cyhQcm9ncmVzcywgQmFzZSk7XG5cblByb2dyZXNzLmRlc2NyaXB0aW9uID0gJ2EgcHJvZ3Jlc3MgYmFyJztcbiIsICIndXNlIHN0cmljdCc7XG4vKipcbiAqIEBtb2R1bGUgTGFuZGluZ1xuICovXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIEJhc2UgPSByZXF1aXJlKCcuL2Jhc2UnKTtcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJy4uL3V0aWxzJykuaW5oZXJpdHM7XG52YXIgY29uc3RhbnRzID0gcmVxdWlyZSgnLi4vcnVubmVyJykuY29uc3RhbnRzO1xudmFyIEVWRU5UX1JVTl9CRUdJTiA9IGNvbnN0YW50cy5FVkVOVF9SVU5fQkVHSU47XG52YXIgRVZFTlRfUlVOX0VORCA9IGNvbnN0YW50cy5FVkVOVF9SVU5fRU5EO1xudmFyIEVWRU5UX1RFU1RfRU5EID0gY29uc3RhbnRzLkVWRU5UX1RFU1RfRU5EO1xudmFyIFNUQVRFX0ZBSUxFRCA9IHJlcXVpcmUoJy4uL3J1bm5hYmxlJykuY29uc3RhbnRzLlNUQVRFX0ZBSUxFRDtcblxudmFyIGN1cnNvciA9IEJhc2UuY3Vyc29yO1xudmFyIGNvbG9yID0gQmFzZS5jb2xvcjtcblxuLyoqXG4gKiBFeHBvc2UgYExhbmRpbmdgLlxuICovXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IExhbmRpbmc7XG5cbi8qKlxuICogQWlycGxhbmUgY29sb3IuXG4gKi9cblxuQmFzZS5jb2xvcnMucGxhbmUgPSAwO1xuXG4vKipcbiAqIEFpcnBsYW5lIGNyYXNoIGNvbG9yLlxuICovXG5cbkJhc2UuY29sb3JzWydwbGFuZSBjcmFzaCddID0gMzE7XG5cbi8qKlxuICogUnVud2F5IGNvbG9yLlxuICovXG5cbkJhc2UuY29sb3JzLnJ1bndheSA9IDkwO1xuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBuZXcgYExhbmRpbmdgIHJlcG9ydGVyIGluc3RhbmNlLlxuICpcbiAqIEBwdWJsaWNcbiAqIEBjbGFzc1xuICogQG1lbWJlcm9mIE1vY2hhLnJlcG9ydGVyc1xuICogQGV4dGVuZHMgTW9jaGEucmVwb3J0ZXJzLkJhc2VcbiAqIEBwYXJhbSB7UnVubmVyfSBydW5uZXIgLSBJbnN0YW5jZSB0cmlnZ2VycyByZXBvcnRlciBhY3Rpb25zLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIHJ1bm5lciBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIExhbmRpbmcocnVubmVyLCBvcHRpb25zKSB7XG4gIEJhc2UuY2FsbCh0aGlzLCBydW5uZXIsIG9wdGlvbnMpO1xuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHdpZHRoID0gKEJhc2Uud2luZG93LndpZHRoICogMC43NSkgfCAwO1xuICB2YXIgc3RyZWFtID0gcHJvY2Vzcy5zdGRvdXQ7XG5cbiAgdmFyIHBsYW5lID0gY29sb3IoJ3BsYW5lJywgJ+KciCcpO1xuICB2YXIgY3Jhc2hlZCA9IC0xO1xuICB2YXIgbiA9IDA7XG4gIHZhciB0b3RhbCA9IDA7XG5cbiAgZnVuY3Rpb24gcnVud2F5KCkge1xuICAgIHZhciBidWYgPSBBcnJheSh3aWR0aCkuam9pbignLScpO1xuICAgIHJldHVybiAnICAnICsgY29sb3IoJ3J1bndheScsIGJ1Zik7XG4gIH1cblxuICBydW5uZXIub24oRVZFTlRfUlVOX0JFR0lOLCBmdW5jdGlvbiAoKSB7XG4gICAgc3RyZWFtLndyaXRlKCdcXG5cXG5cXG4gICcpO1xuICAgIGN1cnNvci5oaWRlKCk7XG4gIH0pO1xuXG4gIHJ1bm5lci5vbihFVkVOVF9URVNUX0VORCwgZnVuY3Rpb24gKHRlc3QpIHtcbiAgICAvLyBjaGVjayBpZiB0aGUgcGxhbmUgY3Jhc2hlZFxuICAgIHZhciBjb2wgPSBjcmFzaGVkID09PSAtMSA/ICgod2lkdGggKiArK24pIC8gKyt0b3RhbCkgfCAwIDogY3Jhc2hlZDtcbiAgICAvLyBzaG93IHRoZSBjcmFzaFxuICAgIGlmICh0ZXN0LnN0YXRlID09PSBTVEFURV9GQUlMRUQpIHtcbiAgICAgIHBsYW5lID0gY29sb3IoJ3BsYW5lIGNyYXNoJywgJ+KciCcpO1xuICAgICAgY3Jhc2hlZCA9IGNvbDtcbiAgICB9XG5cbiAgICAvLyByZW5kZXIgbGFuZGluZyBzdHJpcFxuICAgIHN0cmVhbS53cml0ZSgnXFx1MDAxYlsnICsgKHdpZHRoICsgMSkgKyAnRFxcdTAwMWJbMkEnKTtcbiAgICBzdHJlYW0ud3JpdGUocnVud2F5KCkpO1xuICAgIHN0cmVhbS53cml0ZSgnXFxuICAnKTtcbiAgICBzdHJlYW0ud3JpdGUoY29sb3IoJ3J1bndheScsIEFycmF5KGNvbCkuam9pbign4ouFJykpKTtcbiAgICBzdHJlYW0ud3JpdGUocGxhbmUpO1xuICAgIHN0cmVhbS53cml0ZShjb2xvcigncnVud2F5JywgQXJyYXkod2lkdGggLSBjb2wpLmpvaW4oJ+KLhScpICsgJ1xcbicpKTtcbiAgICBzdHJlYW0ud3JpdGUocnVud2F5KCkpO1xuICAgIHN0cmVhbS53cml0ZSgnXFx1MDAxYlswbScpO1xuICB9KTtcblxuICBydW5uZXIub25jZShFVkVOVF9SVU5fRU5ELCBmdW5jdGlvbiAoKSB7XG4gICAgY3Vyc29yLnNob3coKTtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gICAgc2VsZi5lcGlsb2d1ZSgpO1xuICB9KTtcblxuICAvLyBpZiBjdXJzb3IgaXMgaGlkZGVuIHdoZW4gd2UgY3RybC1DLCB0aGVuIGl0IHdpbGwgcmVtYWluIGhpZGRlbiB1bmxlc3MuLi5cbiAgcHJvY2Vzcy5vbmNlKCdTSUdJTlQnLCBmdW5jdGlvbiAoKSB7XG4gICAgY3Vyc29yLnNob3coKTtcbiAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgJ1NJR0lOVCcpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBJbmhlcml0IGZyb20gYEJhc2UucHJvdG90eXBlYC5cbiAqL1xuaW5oZXJpdHMoTGFuZGluZywgQmFzZSk7XG5cbkxhbmRpbmcuZGVzY3JpcHRpb24gPSAnVW5pY29kZSBsYW5kaW5nIHN0cmlwJztcbiIsICIndXNlIHN0cmljdCc7XG4vKipcbiAqIEBtb2R1bGUgSlNPTlN0cmVhbVxuICovXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIEJhc2UgPSByZXF1aXJlKCcuL2Jhc2UnKTtcbnZhciBjb25zdGFudHMgPSByZXF1aXJlKCcuLi9ydW5uZXInKS5jb25zdGFudHM7XG52YXIgRVZFTlRfVEVTVF9QQVNTID0gY29uc3RhbnRzLkVWRU5UX1RFU1RfUEFTUztcbnZhciBFVkVOVF9URVNUX0ZBSUwgPSBjb25zdGFudHMuRVZFTlRfVEVTVF9GQUlMO1xudmFyIEVWRU5UX1JVTl9CRUdJTiA9IGNvbnN0YW50cy5FVkVOVF9SVU5fQkVHSU47XG52YXIgRVZFTlRfUlVOX0VORCA9IGNvbnN0YW50cy5FVkVOVF9SVU5fRU5EO1xuXG4vKipcbiAqIEV4cG9zZSBgSlNPTlN0cmVhbWAuXG4gKi9cblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gSlNPTlN0cmVhbTtcblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgbmV3IGBKU09OU3RyZWFtYCByZXBvcnRlciBpbnN0YW5jZS5cbiAqXG4gKiBAcHVibGljXG4gKiBAY2xhc3NcbiAqIEBtZW1iZXJvZiBNb2NoYS5yZXBvcnRlcnNcbiAqIEBleHRlbmRzIE1vY2hhLnJlcG9ydGVycy5CYXNlXG4gKiBAcGFyYW0ge1J1bm5lcn0gcnVubmVyIC0gSW5zdGFuY2UgdHJpZ2dlcnMgcmVwb3J0ZXIgYWN0aW9ucy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBydW5uZXIgb3B0aW9uc1xuICovXG5mdW5jdGlvbiBKU09OU3RyZWFtKHJ1bm5lciwgb3B0aW9ucykge1xuICBCYXNlLmNhbGwodGhpcywgcnVubmVyLCBvcHRpb25zKTtcblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciB0b3RhbCA9IHJ1bm5lci50b3RhbDtcblxuICBydW5uZXIub25jZShFVkVOVF9SVU5fQkVHSU4sIGZ1bmN0aW9uICgpIHtcbiAgICB3cml0ZUV2ZW50KFsnc3RhcnQnLCB7dG90YWx9XSk7XG4gIH0pO1xuXG4gIHJ1bm5lci5vbihFVkVOVF9URVNUX1BBU1MsIGZ1bmN0aW9uICh0ZXN0KSB7XG4gICAgd3JpdGVFdmVudChbJ3Bhc3MnLCBjbGVhbih0ZXN0KV0pO1xuICB9KTtcblxuICBydW5uZXIub24oRVZFTlRfVEVTVF9GQUlMLCBmdW5jdGlvbiAodGVzdCwgZXJyKSB7XG4gICAgdGVzdCA9IGNsZWFuKHRlc3QpO1xuICAgIHRlc3QuZXJyID0gZXJyLm1lc3NhZ2U7XG4gICAgdGVzdC5zdGFjayA9IGVyci5zdGFjayB8fCBudWxsO1xuICAgIHdyaXRlRXZlbnQoWydmYWlsJywgdGVzdF0pO1xuICB9KTtcblxuICBydW5uZXIub25jZShFVkVOVF9SVU5fRU5ELCBmdW5jdGlvbiAoKSB7XG4gICAgd3JpdGVFdmVudChbJ2VuZCcsIHNlbGYuc3RhdHNdKTtcbiAgfSk7XG59XG5cbi8qKlxuICogTW9jaGEgZXZlbnQgdG8gYmUgd3JpdHRlbiB0byB0aGUgb3V0cHV0IHN0cmVhbS5cbiAqIEB0eXBlZGVmIHtBcnJheX0gSlNPTlN0cmVhbX5Nb2NoYUV2ZW50XG4gKi9cblxuLyoqXG4gKiBXcml0ZXMgTW9jaGEgZXZlbnQgdG8gcmVwb3J0ZXIgb3V0cHV0IHN0cmVhbS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtKU09OU3RyZWFtfk1vY2hhRXZlbnR9IGV2ZW50IC0gTW9jaGEgZXZlbnQgdG8gYmUgb3V0cHV0LlxuICovXG5mdW5jdGlvbiB3cml0ZUV2ZW50KGV2ZW50KSB7XG4gIHByb2Nlc3Muc3Rkb3V0LndyaXRlKEpTT04uc3RyaW5naWZ5KGV2ZW50KSArICdcXG4nKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFuIG9iamVjdCBsaXRlcmFsIHJlcHJlc2VudGF0aW9uIG9mIGB0ZXN0YFxuICogZnJlZSBvZiBjeWNsaWMgcHJvcGVydGllcywgZXRjLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1Rlc3R9IHRlc3QgLSBJbnN0YW5jZSB1c2VkIGFzIGRhdGEgc291cmNlLlxuICogQHJldHVybiB7T2JqZWN0fSBvYmplY3QgY29udGFpbmluZyBwYXJlZC1kb3duIHRlc3QgaW5zdGFuY2UgZGF0YVxuICovXG5mdW5jdGlvbiBjbGVhbih0ZXN0KSB7XG4gIHJldHVybiB7XG4gICAgdGl0bGU6IHRlc3QudGl0bGUsXG4gICAgZnVsbFRpdGxlOiB0ZXN0LmZ1bGxUaXRsZSgpLFxuICAgIGZpbGU6IHRlc3QuZmlsZSxcbiAgICBkdXJhdGlvbjogdGVzdC5kdXJhdGlvbixcbiAgICBjdXJyZW50UmV0cnk6IHRlc3QuY3VycmVudFJldHJ5KCksXG4gICAgc3BlZWQ6IHRlc3Quc3BlZWRcbiAgfTtcbn1cblxuSlNPTlN0cmVhbS5kZXNjcmlwdGlvbiA9ICduZXdsaW5lIGRlbGltaXRlZCBKU09OIGV2ZW50cyc7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vLyBBbGlhcyBleHBvcnRzIHRvIGEgdGhlaXIgbm9ybWFsaXplZCBmb3JtYXQgTW9jaGEjcmVwb3J0ZXIgdG8gcHJldmVudCBhIG5lZWRcbi8vIGZvciBkeW5hbWljICh0cnkvY2F0Y2gpIHJlcXVpcmVzLCB3aGljaCBCcm93c2VyaWZ5IGRvZXNuJ3QgaGFuZGxlLlxuZXhwb3J0cy5CYXNlID0gZXhwb3J0cy5iYXNlID0gcmVxdWlyZSgnLi9iYXNlJyk7XG5leHBvcnRzLkRvdCA9IGV4cG9ydHMuZG90ID0gcmVxdWlyZSgnLi9kb3QnKTtcbmV4cG9ydHMuRG9jID0gZXhwb3J0cy5kb2MgPSByZXF1aXJlKCcuL2RvYycpO1xuZXhwb3J0cy5UQVAgPSBleHBvcnRzLnRhcCA9IHJlcXVpcmUoJy4vdGFwJyk7XG5leHBvcnRzLkpTT04gPSBleHBvcnRzLmpzb24gPSByZXF1aXJlKCcuL2pzb24nKTtcbmV4cG9ydHMuSFRNTCA9IGV4cG9ydHMuaHRtbCA9IHJlcXVpcmUoJy4vaHRtbCcpO1xuZXhwb3J0cy5MaXN0ID0gZXhwb3J0cy5saXN0ID0gcmVxdWlyZSgnLi9saXN0Jyk7XG5leHBvcnRzLk1pbiA9IGV4cG9ydHMubWluID0gcmVxdWlyZSgnLi9taW4nKTtcbmV4cG9ydHMuU3BlYyA9IGV4cG9ydHMuc3BlYyA9IHJlcXVpcmUoJy4vc3BlYycpO1xuZXhwb3J0cy5OeWFuID0gZXhwb3J0cy5ueWFuID0gcmVxdWlyZSgnLi9ueWFuJyk7XG5leHBvcnRzLlhVbml0ID0gZXhwb3J0cy54dW5pdCA9IHJlcXVpcmUoJy4veHVuaXQnKTtcbmV4cG9ydHMuTWFya2Rvd24gPSBleHBvcnRzLm1hcmtkb3duID0gcmVxdWlyZSgnLi9tYXJrZG93bicpO1xuZXhwb3J0cy5Qcm9ncmVzcyA9IGV4cG9ydHMucHJvZ3Jlc3MgPSByZXF1aXJlKCcuL3Byb2dyZXNzJyk7XG5leHBvcnRzLkxhbmRpbmcgPSBleHBvcnRzLmxhbmRpbmcgPSByZXF1aXJlKCcuL2xhbmRpbmcnKTtcbmV4cG9ydHMuSlNPTlN0cmVhbSA9IGV4cG9ydHNbJ2pzb24tc3RyZWFtJ10gPSByZXF1aXJlKCcuL2pzb24tc3RyZWFtJyk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFByb3ZpZGVzIGEgZmFjdG9yeSBmdW5jdGlvbiBmb3IgYSB7QGxpbmsgU3RhdHNDb2xsZWN0b3J9IG9iamVjdC5cbiAqIEBtb2R1bGVcbiAqL1xuXG52YXIgY29uc3RhbnRzID0gcmVxdWlyZSgnLi9ydW5uZXInKS5jb25zdGFudHM7XG52YXIgRVZFTlRfVEVTVF9QQVNTID0gY29uc3RhbnRzLkVWRU5UX1RFU1RfUEFTUztcbnZhciBFVkVOVF9URVNUX0ZBSUwgPSBjb25zdGFudHMuRVZFTlRfVEVTVF9GQUlMO1xudmFyIEVWRU5UX1NVSVRFX0JFR0lOID0gY29uc3RhbnRzLkVWRU5UX1NVSVRFX0JFR0lOO1xudmFyIEVWRU5UX1JVTl9CRUdJTiA9IGNvbnN0YW50cy5FVkVOVF9SVU5fQkVHSU47XG52YXIgRVZFTlRfVEVTVF9QRU5ESU5HID0gY29uc3RhbnRzLkVWRU5UX1RFU1RfUEVORElORztcbnZhciBFVkVOVF9SVU5fRU5EID0gY29uc3RhbnRzLkVWRU5UX1JVTl9FTkQ7XG52YXIgRVZFTlRfVEVTVF9FTkQgPSBjb25zdGFudHMuRVZFTlRfVEVTVF9FTkQ7XG5cbi8qKlxuICogVGVzdCBzdGF0aXN0aWNzIGNvbGxlY3Rvci5cbiAqXG4gKiBAcHVibGljXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTdGF0c0NvbGxlY3RvclxuICogQHByb3BlcnR5IHtudW1iZXJ9IHN1aXRlcyAtIGludGVnZXIgY291bnQgb2Ygc3VpdGVzIHJ1bi5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0ZXN0cyAtIGludGVnZXIgY291bnQgb2YgdGVzdHMgcnVuLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHBhc3NlcyAtIGludGVnZXIgY291bnQgb2YgcGFzc2luZyB0ZXN0cy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBwZW5kaW5nIC0gaW50ZWdlciBjb3VudCBvZiBwZW5kaW5nIHRlc3RzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGZhaWx1cmVzIC0gaW50ZWdlciBjb3VudCBvZiBmYWlsZWQgdGVzdHMuXG4gKiBAcHJvcGVydHkge0RhdGV9IHN0YXJ0IC0gdGltZSB3aGVuIHRlc3RpbmcgYmVnYW4uXG4gKiBAcHJvcGVydHkge0RhdGV9IGVuZCAtIHRpbWUgd2hlbiB0ZXN0aW5nIGNvbmNsdWRlZC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBkdXJhdGlvbiAtIG51bWJlciBvZiBtc2VjcyB0aGF0IHRlc3RpbmcgdG9vay5cbiAqL1xuXG52YXIgRGF0ZSA9IGdsb2JhbC5EYXRlO1xuXG4vKipcbiAqIFByb3ZpZGVzIHN0YXRzIHN1Y2ggYXMgdGVzdCBkdXJhdGlvbiwgbnVtYmVyIG9mIHRlc3RzIHBhc3NlZCAvIGZhaWxlZCBldGMuLCBieSBsaXN0ZW5pbmcgZm9yIGV2ZW50cyBlbWl0dGVkIGJ5IGBydW5uZXJgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1J1bm5lcn0gcnVubmVyIC0gUnVubmVyIGluc3RhbmNlXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIGZhbHN5IGBydW5uZXJgXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVN0YXRzQ29sbGVjdG9yKHJ1bm5lcikge1xuICAvKipcbiAgICogQHR5cGUgU3RhdHNDb2xsZWN0b3JcbiAgICovXG4gIHZhciBzdGF0cyA9IHtcbiAgICBzdWl0ZXM6IDAsXG4gICAgdGVzdHM6IDAsXG4gICAgcGFzc2VzOiAwLFxuICAgIHBlbmRpbmc6IDAsXG4gICAgZmFpbHVyZXM6IDBcbiAgfTtcblxuICBpZiAoIXJ1bm5lcikge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ01pc3NpbmcgcnVubmVyIGFyZ3VtZW50Jyk7XG4gIH1cblxuICBydW5uZXIuc3RhdHMgPSBzdGF0cztcblxuICBydW5uZXIub25jZShFVkVOVF9SVU5fQkVHSU4sIGZ1bmN0aW9uICgpIHtcbiAgICBzdGF0cy5zdGFydCA9IG5ldyBEYXRlKCk7XG4gIH0pO1xuICBydW5uZXIub24oRVZFTlRfU1VJVEVfQkVHSU4sIGZ1bmN0aW9uIChzdWl0ZSkge1xuICAgIHN1aXRlLnJvb3QgfHwgc3RhdHMuc3VpdGVzKys7XG4gIH0pO1xuICBydW5uZXIub24oRVZFTlRfVEVTVF9QQVNTLCBmdW5jdGlvbiAoKSB7XG4gICAgc3RhdHMucGFzc2VzKys7XG4gIH0pO1xuICBydW5uZXIub24oRVZFTlRfVEVTVF9GQUlMLCBmdW5jdGlvbiAoKSB7XG4gICAgc3RhdHMuZmFpbHVyZXMrKztcbiAgfSk7XG4gIHJ1bm5lci5vbihFVkVOVF9URVNUX1BFTkRJTkcsIGZ1bmN0aW9uICgpIHtcbiAgICBzdGF0cy5wZW5kaW5nKys7XG4gIH0pO1xuICBydW5uZXIub24oRVZFTlRfVEVTVF9FTkQsIGZ1bmN0aW9uICgpIHtcbiAgICBzdGF0cy50ZXN0cysrO1xuICB9KTtcbiAgcnVubmVyLm9uY2UoRVZFTlRfUlVOX0VORCwgZnVuY3Rpb24gKCkge1xuICAgIHN0YXRzLmVuZCA9IG5ldyBEYXRlKCk7XG4gICAgc3RhdHMuZHVyYXRpb24gPSBzdGF0cy5lbmQgLSBzdGF0cy5zdGFydDtcbiAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlU3RhdHNDb2xsZWN0b3I7XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIFJ1bm5hYmxlID0gcmVxdWlyZSgnLi9ydW5uYWJsZScpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIGVycm9ycyA9IHJlcXVpcmUoJy4vZXJyb3JzJyk7XG52YXIgY3JlYXRlSW52YWxpZEFyZ3VtZW50VHlwZUVycm9yID0gZXJyb3JzLmNyZWF0ZUludmFsaWRBcmd1bWVudFR5cGVFcnJvcjtcbnZhciBpc1N0cmluZyA9IHV0aWxzLmlzU3RyaW5nO1xuXG5jb25zdCB7TU9DSEFfSURfUFJPUF9OQU1FfSA9IHV0aWxzLmNvbnN0YW50cztcblxubW9kdWxlLmV4cG9ydHMgPSBUZXN0O1xuXG4vKipcbiAqIEluaXRpYWxpemUgYSBuZXcgYFRlc3RgIHdpdGggdGhlIGdpdmVuIGB0aXRsZWAgYW5kIGNhbGxiYWNrIGBmbmAuXG4gKlxuICogQHB1YmxpY1xuICogQGNsYXNzXG4gKiBAZXh0ZW5kcyBSdW5uYWJsZVxuICogQHBhcmFtIHtTdHJpbmd9IHRpdGxlIC0gVGVzdCB0aXRsZSAocmVxdWlyZWQpXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZm5dIC0gVGVzdCBjYWxsYmFjay4gIElmIG9taXR0ZWQsIHRoZSBUZXN0IGlzIGNvbnNpZGVyZWQgXCJwZW5kaW5nXCJcbiAqL1xuZnVuY3Rpb24gVGVzdCh0aXRsZSwgZm4pIHtcbiAgaWYgKCFpc1N0cmluZyh0aXRsZSkpIHtcbiAgICB0aHJvdyBjcmVhdGVJbnZhbGlkQXJndW1lbnRUeXBlRXJyb3IoXG4gICAgICAnVGVzdCBhcmd1bWVudCBcInRpdGxlXCIgc2hvdWxkIGJlIGEgc3RyaW5nLiBSZWNlaXZlZCB0eXBlIFwiJyArXG4gICAgICAgIHR5cGVvZiB0aXRsZSArXG4gICAgICAgICdcIicsXG4gICAgICAndGl0bGUnLFxuICAgICAgJ3N0cmluZydcbiAgICApO1xuICB9XG4gIHRoaXMudHlwZSA9ICd0ZXN0JztcbiAgUnVubmFibGUuY2FsbCh0aGlzLCB0aXRsZSwgZm4pO1xuICB0aGlzLnJlc2V0KCk7XG59XG5cbi8qKlxuICogSW5oZXJpdCBmcm9tIGBSdW5uYWJsZS5wcm90b3R5cGVgLlxuICovXG51dGlscy5pbmhlcml0cyhUZXN0LCBSdW5uYWJsZSk7XG5cbi8qKlxuICogUmVzZXRzIHRoZSBzdGF0ZSBpbml0aWFsbHkgb3IgZm9yIGEgbmV4dCBydW4uXG4gKi9cblRlc3QucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xuICBSdW5uYWJsZS5wcm90b3R5cGUucmVzZXQuY2FsbCh0aGlzKTtcbiAgdGhpcy5wZW5kaW5nID0gIXRoaXMuZm47XG4gIGRlbGV0ZSB0aGlzLnN0YXRlO1xufTtcblxuLyoqXG4gKiBTZXQgb3IgZ2V0IHJldHJpZWQgdGVzdFxuICpcbiAqIEBwcml2YXRlXG4gKi9cblRlc3QucHJvdG90eXBlLnJldHJpZWRUZXN0ID0gZnVuY3Rpb24gKG4pIHtcbiAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JldHJpZWRUZXN0O1xuICB9XG4gIHRoaXMuX3JldHJpZWRUZXN0ID0gbjtcbn07XG5cbi8qKlxuICogQWRkIHRlc3QgdG8gdGhlIGxpc3Qgb2YgdGVzdHMgbWFya2VkIGBvbmx5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5UZXN0LnByb3RvdHlwZS5tYXJrT25seSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5wYXJlbnQuYXBwZW5kT25seVRlc3QodGhpcyk7XG59O1xuXG5UZXN0LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRlc3QgPSBuZXcgVGVzdCh0aGlzLnRpdGxlLCB0aGlzLmZuKTtcbiAgdGVzdC50aW1lb3V0KHRoaXMudGltZW91dCgpKTtcbiAgdGVzdC5zbG93KHRoaXMuc2xvdygpKTtcbiAgdGVzdC5yZXRyaWVzKHRoaXMucmV0cmllcygpKTtcbiAgdGVzdC5jdXJyZW50UmV0cnkodGhpcy5jdXJyZW50UmV0cnkoKSk7XG4gIHRlc3QucmV0cmllZFRlc3QodGhpcy5yZXRyaWVkVGVzdCgpIHx8IHRoaXMpO1xuICB0ZXN0Lmdsb2JhbHModGhpcy5nbG9iYWxzKCkpO1xuICB0ZXN0LnBhcmVudCA9IHRoaXMucGFyZW50O1xuICB0ZXN0LmZpbGUgPSB0aGlzLmZpbGU7XG4gIHRlc3QuY3R4ID0gdGhpcy5jdHg7XG4gIHJldHVybiB0ZXN0O1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIG1pbmltYWwgb2JqZWN0IHN1aXRhYmxlIGZvciB0cmFuc21pc3Npb24gb3ZlciBJUEMuXG4gKiBGdW5jdGlvbnMgYXJlIHJlcHJlc2VudGVkIGJ5IGtleXMgYmVnaW5uaW5nIHdpdGggYCQkYC5cbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG5UZXN0LnByb3RvdHlwZS5zZXJpYWxpemUgPSBmdW5jdGlvbiBzZXJpYWxpemUoKSB7XG4gIHJldHVybiB7XG4gICAgJCRjdXJyZW50UmV0cnk6IHRoaXMuX2N1cnJlbnRSZXRyeSxcbiAgICAkJGZ1bGxUaXRsZTogdGhpcy5mdWxsVGl0bGUoKSxcbiAgICAkJGlzUGVuZGluZzogQm9vbGVhbih0aGlzLnBlbmRpbmcpLFxuICAgICQkcmV0cmllZFRlc3Q6IHRoaXMuX3JldHJpZWRUZXN0IHx8IG51bGwsXG4gICAgJCRzbG93OiB0aGlzLl9zbG93LFxuICAgICQkdGl0bGVQYXRoOiB0aGlzLnRpdGxlUGF0aCgpLFxuICAgIGJvZHk6IHRoaXMuYm9keSxcbiAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICBlcnI6IHRoaXMuZXJyLFxuICAgIHBhcmVudDoge1xuICAgICAgJCRmdWxsVGl0bGU6IHRoaXMucGFyZW50LmZ1bGxUaXRsZSgpLFxuICAgICAgW01PQ0hBX0lEX1BST1BfTkFNRV06IHRoaXMucGFyZW50LmlkXG4gICAgfSxcbiAgICBzcGVlZDogdGhpcy5zcGVlZCxcbiAgICBzdGF0ZTogdGhpcy5zdGF0ZSxcbiAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgZmlsZTogdGhpcy5maWxlLFxuICAgIFtNT0NIQV9JRF9QUk9QX05BTUVdOiB0aGlzLmlkXG4gIH07XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gQG1vZHVsZSBpbnRlcmZhY2VzL2NvbW1vblxuKi9cblxudmFyIFN1aXRlID0gcmVxdWlyZSgnLi4vc3VpdGUnKTtcbnZhciBlcnJvcnMgPSByZXF1aXJlKCcuLi9lcnJvcnMnKTtcbnZhciBjcmVhdGVNaXNzaW5nQXJndW1lbnRFcnJvciA9IGVycm9ycy5jcmVhdGVNaXNzaW5nQXJndW1lbnRFcnJvcjtcbnZhciBjcmVhdGVVbnN1cHBvcnRlZEVycm9yID0gZXJyb3JzLmNyZWF0ZVVuc3VwcG9ydGVkRXJyb3I7XG52YXIgY3JlYXRlRm9yYmlkZGVuRXhjbHVzaXZpdHlFcnJvciA9IGVycm9ycy5jcmVhdGVGb3JiaWRkZW5FeGNsdXNpdml0eUVycm9yO1xuXG4vKipcbiAqIEZ1bmN0aW9ucyBjb21tb24gdG8gbW9yZSB0aGFuIG9uZSBpbnRlcmZhY2UuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3VpdGVbXX0gc3VpdGVzXG4gKiBAcGFyYW0ge0NvbnRleHR9IGNvbnRleHRcbiAqIEBwYXJhbSB7TW9jaGF9IG1vY2hhXG4gKiBAcmV0dXJuIHtPYmplY3R9IEFuIG9iamVjdCBjb250YWluaW5nIGNvbW1vbiBmdW5jdGlvbnMuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHN1aXRlcywgY29udGV4dCwgbW9jaGEpIHtcbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSBzdWl0ZSBzaG91bGQgYmUgdGVzdGVkLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge1N1aXRlfSBzdWl0ZSAtIHN1aXRlIHRvIGNoZWNrXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkQmVUZXN0ZWQoc3VpdGUpIHtcbiAgICByZXR1cm4gKFxuICAgICAgIW1vY2hhLm9wdGlvbnMuZ3JlcCB8fFxuICAgICAgKG1vY2hhLm9wdGlvbnMuZ3JlcCAmJlxuICAgICAgICBtb2NoYS5vcHRpb25zLmdyZXAudGVzdChzdWl0ZS5mdWxsVGl0bGUoKSkgJiZcbiAgICAgICAgIW1vY2hhLm9wdGlvbnMuaW52ZXJ0KVxuICAgICk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgb25seSBwcmVzZW50IGlmIGZsYWcgLS1kZWxheSBpcyBwYXNzZWQgaW50byBNb2NoYS4gSXQgdHJpZ2dlcnNcbiAgICAgKiByb290IHN1aXRlIGV4ZWN1dGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3VpdGV9IHN1aXRlIFRoZSByb290IHN1aXRlLlxuICAgICAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHdoaWNoIHJ1bnMgdGhlIHJvb3Qgc3VpdGVcbiAgICAgKi9cbiAgICBydW5XaXRoU3VpdGU6IGZ1bmN0aW9uIHJ1bldpdGhTdWl0ZShzdWl0ZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIHJ1bigpIHtcbiAgICAgICAgc3VpdGUucnVuKCk7XG4gICAgICB9O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlIGJlZm9yZSBydW5uaW5nIHRlc3RzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICAgICAqL1xuICAgIGJlZm9yZTogZnVuY3Rpb24gKG5hbWUsIGZuKSB7XG4gICAgICByZXR1cm4gc3VpdGVzWzBdLmJlZm9yZUFsbChuYW1lLCBmbik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGUgYWZ0ZXIgcnVubmluZyB0ZXN0cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAgICAgKi9cbiAgICBhZnRlcjogZnVuY3Rpb24gKG5hbWUsIGZuKSB7XG4gICAgICByZXR1cm4gc3VpdGVzWzBdLmFmdGVyQWxsKG5hbWUsIGZuKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZSBiZWZvcmUgZWFjaCB0ZXN0IGNhc2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gICAgICovXG4gICAgYmVmb3JlRWFjaDogZnVuY3Rpb24gKG5hbWUsIGZuKSB7XG4gICAgICByZXR1cm4gc3VpdGVzWzBdLmJlZm9yZUVhY2gobmFtZSwgZm4pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlIGFmdGVyIGVhY2ggdGVzdCBjYXNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICAgICAqL1xuICAgIGFmdGVyRWFjaDogZnVuY3Rpb24gKG5hbWUsIGZuKSB7XG4gICAgICByZXR1cm4gc3VpdGVzWzBdLmFmdGVyRWFjaChuYW1lLCBmbik7XG4gICAgfSxcblxuICAgIHN1aXRlOiB7XG4gICAgICAvKipcbiAgICAgICAqIENyZWF0ZSBhbiBleGNsdXNpdmUgU3VpdGU7IGNvbnZlbmllbmNlIGZ1bmN0aW9uXG4gICAgICAgKiBTZWUgZG9jc3RyaW5nIGZvciBjcmVhdGUoKSBiZWxvdy5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0c1xuICAgICAgICogQHJldHVybnMge1N1aXRlfVxuICAgICAgICovXG4gICAgICBvbmx5OiBmdW5jdGlvbiBvbmx5KG9wdHMpIHtcbiAgICAgICAgaWYgKG1vY2hhLm9wdGlvbnMuZm9yYmlkT25seSkge1xuICAgICAgICAgIHRocm93IGNyZWF0ZUZvcmJpZGRlbkV4Y2x1c2l2aXR5RXJyb3IobW9jaGEpO1xuICAgICAgICB9XG4gICAgICAgIG9wdHMuaXNPbmx5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlKG9wdHMpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDcmVhdGUgYSBTdWl0ZSwgYnV0IHNraXAgaXQ7IGNvbnZlbmllbmNlIGZ1bmN0aW9uXG4gICAgICAgKiBTZWUgZG9jc3RyaW5nIGZvciBjcmVhdGUoKSBiZWxvdy5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0c1xuICAgICAgICogQHJldHVybnMge1N1aXRlfVxuICAgICAgICovXG4gICAgICBza2lwOiBmdW5jdGlvbiBza2lwKG9wdHMpIHtcbiAgICAgICAgb3B0cy5wZW5kaW5nID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlKG9wdHMpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDcmVhdGVzIGEgc3VpdGUuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgT3B0aW9uc1xuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMudGl0bGUgVGl0bGUgb2YgU3VpdGVcbiAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRzLmZuXSBTdWl0ZSBGdW5jdGlvbiAobm90IGFsd2F5cyBhcHBsaWNhYmxlKVxuICAgICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5wZW5kaW5nXSBJcyBTdWl0ZSBwZW5kaW5nP1xuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmZpbGVdIEZpbGVwYXRoIHdoZXJlIHRoaXMgU3VpdGUgcmVzaWRlc1xuICAgICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pc09ubHldIElzIFN1aXRlIGV4Y2x1c2l2ZT9cbiAgICAgICAqIEByZXR1cm5zIHtTdWl0ZX1cbiAgICAgICAqL1xuICAgICAgY3JlYXRlOiBmdW5jdGlvbiBjcmVhdGUob3B0cykge1xuICAgICAgICB2YXIgc3VpdGUgPSBTdWl0ZS5jcmVhdGUoc3VpdGVzWzBdLCBvcHRzLnRpdGxlKTtcbiAgICAgICAgc3VpdGUucGVuZGluZyA9IEJvb2xlYW4ob3B0cy5wZW5kaW5nKTtcbiAgICAgICAgc3VpdGUuZmlsZSA9IG9wdHMuZmlsZTtcbiAgICAgICAgc3VpdGVzLnVuc2hpZnQoc3VpdGUpO1xuICAgICAgICBpZiAob3B0cy5pc09ubHkpIHtcbiAgICAgICAgICBzdWl0ZS5tYXJrT25seSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBzdWl0ZS5wZW5kaW5nICYmXG4gICAgICAgICAgbW9jaGEub3B0aW9ucy5mb3JiaWRQZW5kaW5nICYmXG4gICAgICAgICAgc2hvdWxkQmVUZXN0ZWQoc3VpdGUpXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IGNyZWF0ZVVuc3VwcG9ydGVkRXJyb3IoJ1BlbmRpbmcgdGVzdCBmb3JiaWRkZW4nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG9wdHMuZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvcHRzLmZuLmNhbGwoc3VpdGUpO1xuICAgICAgICAgIHN1aXRlcy5zaGlmdCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvcHRzLmZuID09PSAndW5kZWZpbmVkJyAmJiAhc3VpdGUucGVuZGluZykge1xuICAgICAgICAgIHRocm93IGNyZWF0ZU1pc3NpbmdBcmd1bWVudEVycm9yKFxuICAgICAgICAgICAgJ1N1aXRlIFwiJyArXG4gICAgICAgICAgICAgIHN1aXRlLmZ1bGxUaXRsZSgpICtcbiAgICAgICAgICAgICAgJ1wiIHdhcyBkZWZpbmVkIGJ1dCBubyBjYWxsYmFjayB3YXMgc3VwcGxpZWQuICcgK1xuICAgICAgICAgICAgICAnU3VwcGx5IGEgY2FsbGJhY2sgb3IgZXhwbGljaXRseSBza2lwIHRoZSBzdWl0ZS4nLFxuICAgICAgICAgICAgJ2NhbGxiYWNrJyxcbiAgICAgICAgICAgICdmdW5jdGlvbidcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKCFvcHRzLmZuICYmIHN1aXRlLnBlbmRpbmcpIHtcbiAgICAgICAgICBzdWl0ZXMuc2hpZnQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdWl0ZTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgdGVzdDoge1xuICAgICAgLyoqXG4gICAgICAgKiBFeGNsdXNpdmUgdGVzdC1jYXNlLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBtb2NoYVxuICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdGVzdFxuICAgICAgICogQHJldHVybnMgeyp9XG4gICAgICAgKi9cbiAgICAgIG9ubHk6IGZ1bmN0aW9uIChtb2NoYSwgdGVzdCkge1xuICAgICAgICBpZiAobW9jaGEub3B0aW9ucy5mb3JiaWRPbmx5KSB7XG4gICAgICAgICAgdGhyb3cgY3JlYXRlRm9yYmlkZGVuRXhjbHVzaXZpdHlFcnJvcihtb2NoYSk7XG4gICAgICAgIH1cbiAgICAgICAgdGVzdC5tYXJrT25seSgpO1xuICAgICAgICByZXR1cm4gdGVzdDtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogUGVuZGluZyB0ZXN0IGNhc2UuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlXG4gICAgICAgKi9cbiAgICAgIHNraXA6IGZ1bmN0aW9uICh0aXRsZSkge1xuICAgICAgICBjb250ZXh0LnRlc3QodGl0bGUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVGVzdCA9IHJlcXVpcmUoJy4uL3Rlc3QnKTtcbnZhciBFVkVOVF9GSUxFX1BSRV9SRVFVSVJFID1cbiAgcmVxdWlyZSgnLi4vc3VpdGUnKS5jb25zdGFudHMuRVZFTlRfRklMRV9QUkVfUkVRVUlSRTtcblxuLyoqXG4gKiBCREQtc3R5bGUgaW50ZXJmYWNlOlxuICpcbiAqICAgICAgZGVzY3JpYmUoJ0FycmF5JywgZnVuY3Rpb24oKSB7XG4gKiAgICAgICAgZGVzY3JpYmUoJyNpbmRleE9mKCknLCBmdW5jdGlvbigpIHtcbiAqICAgICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIC0xIHdoZW4gbm90IHByZXNlbnQnLCBmdW5jdGlvbigpIHtcbiAqICAgICAgICAgICAgLy8gLi4uXG4gKiAgICAgICAgICB9KTtcbiAqXG4gKiAgICAgICAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgaW5kZXggd2hlbiBwcmVzZW50JywgZnVuY3Rpb24oKSB7XG4gKiAgICAgICAgICAgIC8vIC4uLlxuICogICAgICAgICAgfSk7XG4gKiAgICAgICAgfSk7XG4gKiAgICAgIH0pO1xuICpcbiAqIEBwYXJhbSB7U3VpdGV9IHN1aXRlIFJvb3Qgc3VpdGUuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYmRkSW50ZXJmYWNlKHN1aXRlKSB7XG4gIHZhciBzdWl0ZXMgPSBbc3VpdGVdO1xuXG4gIHN1aXRlLm9uKEVWRU5UX0ZJTEVfUFJFX1JFUVVJUkUsIGZ1bmN0aW9uIChjb250ZXh0LCBmaWxlLCBtb2NoYSkge1xuICAgIHZhciBjb21tb24gPSByZXF1aXJlKCcuL2NvbW1vbicpKHN1aXRlcywgY29udGV4dCwgbW9jaGEpO1xuXG4gICAgY29udGV4dC5iZWZvcmUgPSBjb21tb24uYmVmb3JlO1xuICAgIGNvbnRleHQuYWZ0ZXIgPSBjb21tb24uYWZ0ZXI7XG4gICAgY29udGV4dC5iZWZvcmVFYWNoID0gY29tbW9uLmJlZm9yZUVhY2g7XG4gICAgY29udGV4dC5hZnRlckVhY2ggPSBjb21tb24uYWZ0ZXJFYWNoO1xuICAgIGNvbnRleHQucnVuID0gbW9jaGEub3B0aW9ucy5kZWxheSAmJiBjb21tb24ucnVuV2l0aFN1aXRlKHN1aXRlKTtcbiAgICAvKipcbiAgICAgKiBEZXNjcmliZSBhIFwic3VpdGVcIiB3aXRoIHRoZSBnaXZlbiBgdGl0bGVgXG4gICAgICogYW5kIGNhbGxiYWNrIGBmbmAgY29udGFpbmluZyBuZXN0ZWQgc3VpdGVzXG4gICAgICogYW5kL29yIHRlc3RzLlxuICAgICAqL1xuXG4gICAgY29udGV4dC5kZXNjcmliZSA9IGNvbnRleHQuY29udGV4dCA9IGZ1bmN0aW9uICh0aXRsZSwgZm4pIHtcbiAgICAgIHJldHVybiBjb21tb24uc3VpdGUuY3JlYXRlKHtcbiAgICAgICAgdGl0bGUsXG4gICAgICAgIGZpbGUsXG4gICAgICAgIGZuXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUGVuZGluZyBkZXNjcmliZS5cbiAgICAgKi9cblxuICAgIGNvbnRleHQueGRlc2NyaWJlID1cbiAgICAgIGNvbnRleHQueGNvbnRleHQgPVxuICAgICAgY29udGV4dC5kZXNjcmliZS5za2lwID1cbiAgICAgICAgZnVuY3Rpb24gKHRpdGxlLCBmbikge1xuICAgICAgICAgIHJldHVybiBjb21tb24uc3VpdGUuc2tpcCh7XG4gICAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgICBmblxuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRXhjbHVzaXZlIHN1aXRlLlxuICAgICAqL1xuXG4gICAgY29udGV4dC5kZXNjcmliZS5vbmx5ID0gZnVuY3Rpb24gKHRpdGxlLCBmbikge1xuICAgICAgcmV0dXJuIGNvbW1vbi5zdWl0ZS5vbmx5KHtcbiAgICAgICAgdGl0bGUsXG4gICAgICAgIGZpbGUsXG4gICAgICAgIGZuXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRGVzY3JpYmUgYSBzcGVjaWZpY2F0aW9uIG9yIHRlc3QtY2FzZVxuICAgICAqIHdpdGggdGhlIGdpdmVuIGB0aXRsZWAgYW5kIGNhbGxiYWNrIGBmbmBcbiAgICAgKiBhY3RpbmcgYXMgYSB0aHVuay5cbiAgICAgKi9cblxuICAgIGNvbnRleHQuaXQgPSBjb250ZXh0LnNwZWNpZnkgPSBmdW5jdGlvbiAodGl0bGUsIGZuKSB7XG4gICAgICB2YXIgc3VpdGUgPSBzdWl0ZXNbMF07XG4gICAgICBpZiAoc3VpdGUuaXNQZW5kaW5nKCkpIHtcbiAgICAgICAgZm4gPSBudWxsO1xuICAgICAgfVxuICAgICAgdmFyIHRlc3QgPSBuZXcgVGVzdCh0aXRsZSwgZm4pO1xuICAgICAgdGVzdC5maWxlID0gZmlsZTtcbiAgICAgIHN1aXRlLmFkZFRlc3QodGVzdCk7XG4gICAgICByZXR1cm4gdGVzdDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRXhjbHVzaXZlIHRlc3QtY2FzZS5cbiAgICAgKi9cblxuICAgIGNvbnRleHQuaXQub25seSA9IGZ1bmN0aW9uICh0aXRsZSwgZm4pIHtcbiAgICAgIHJldHVybiBjb21tb24udGVzdC5vbmx5KG1vY2hhLCBjb250ZXh0Lml0KHRpdGxlLCBmbikpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBQZW5kaW5nIHRlc3QgY2FzZS5cbiAgICAgKi9cblxuICAgIGNvbnRleHQueGl0ID1cbiAgICAgIGNvbnRleHQueHNwZWNpZnkgPVxuICAgICAgY29udGV4dC5pdC5za2lwID1cbiAgICAgICAgZnVuY3Rpb24gKHRpdGxlKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuaXQodGl0bGUpO1xuICAgICAgICB9O1xuICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzLmRlc2NyaXB0aW9uID0gJ0JERCBvciBSU3BlYyBzdHlsZSBbZGVmYXVsdF0nO1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIFRlc3QgPSByZXF1aXJlKCcuLi90ZXN0Jyk7XG52YXIgRVZFTlRfRklMRV9QUkVfUkVRVUlSRSA9XG4gIHJlcXVpcmUoJy4uL3N1aXRlJykuY29uc3RhbnRzLkVWRU5UX0ZJTEVfUFJFX1JFUVVJUkU7XG5cbi8qKlxuICogVERELXN0eWxlIGludGVyZmFjZTpcbiAqXG4gKiAgICAgIHN1aXRlKCdBcnJheScsIGZ1bmN0aW9uKCkge1xuICogICAgICAgIHN1aXRlKCcjaW5kZXhPZigpJywgZnVuY3Rpb24oKSB7XG4gKiAgICAgICAgICBzdWl0ZVNldHVwKGZ1bmN0aW9uKCkge1xuICpcbiAqICAgICAgICAgIH0pO1xuICpcbiAqICAgICAgICAgIHRlc3QoJ3Nob3VsZCByZXR1cm4gLTEgd2hlbiBub3QgcHJlc2VudCcsIGZ1bmN0aW9uKCkge1xuICpcbiAqICAgICAgICAgIH0pO1xuICpcbiAqICAgICAgICAgIHRlc3QoJ3Nob3VsZCByZXR1cm4gdGhlIGluZGV4IHdoZW4gcHJlc2VudCcsIGZ1bmN0aW9uKCkge1xuICpcbiAqICAgICAgICAgIH0pO1xuICpcbiAqICAgICAgICAgIHN1aXRlVGVhcmRvd24oZnVuY3Rpb24oKSB7XG4gKlxuICogICAgICAgICAgfSk7XG4gKiAgICAgICAgfSk7XG4gKiAgICAgIH0pO1xuICpcbiAqIEBwYXJhbSB7U3VpdGV9IHN1aXRlIFJvb3Qgc3VpdGUuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHN1aXRlKSB7XG4gIHZhciBzdWl0ZXMgPSBbc3VpdGVdO1xuXG4gIHN1aXRlLm9uKEVWRU5UX0ZJTEVfUFJFX1JFUVVJUkUsIGZ1bmN0aW9uIChjb250ZXh0LCBmaWxlLCBtb2NoYSkge1xuICAgIHZhciBjb21tb24gPSByZXF1aXJlKCcuL2NvbW1vbicpKHN1aXRlcywgY29udGV4dCwgbW9jaGEpO1xuXG4gICAgY29udGV4dC5zZXR1cCA9IGNvbW1vbi5iZWZvcmVFYWNoO1xuICAgIGNvbnRleHQudGVhcmRvd24gPSBjb21tb24uYWZ0ZXJFYWNoO1xuICAgIGNvbnRleHQuc3VpdGVTZXR1cCA9IGNvbW1vbi5iZWZvcmU7XG4gICAgY29udGV4dC5zdWl0ZVRlYXJkb3duID0gY29tbW9uLmFmdGVyO1xuICAgIGNvbnRleHQucnVuID0gbW9jaGEub3B0aW9ucy5kZWxheSAmJiBjb21tb24ucnVuV2l0aFN1aXRlKHN1aXRlKTtcblxuICAgIC8qKlxuICAgICAqIERlc2NyaWJlIGEgXCJzdWl0ZVwiIHdpdGggdGhlIGdpdmVuIGB0aXRsZWAgYW5kIGNhbGxiYWNrIGBmbmAgY29udGFpbmluZ1xuICAgICAqIG5lc3RlZCBzdWl0ZXMgYW5kL29yIHRlc3RzLlxuICAgICAqL1xuICAgIGNvbnRleHQuc3VpdGUgPSBmdW5jdGlvbiAodGl0bGUsIGZuKSB7XG4gICAgICByZXR1cm4gY29tbW9uLnN1aXRlLmNyZWF0ZSh7XG4gICAgICAgIHRpdGxlLFxuICAgICAgICBmaWxlLFxuICAgICAgICBmblxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFBlbmRpbmcgc3VpdGUuXG4gICAgICovXG4gICAgY29udGV4dC5zdWl0ZS5za2lwID0gZnVuY3Rpb24gKHRpdGxlLCBmbikge1xuICAgICAgcmV0dXJuIGNvbW1vbi5zdWl0ZS5za2lwKHtcbiAgICAgICAgdGl0bGUsXG4gICAgICAgIGZpbGUsXG4gICAgICAgIGZuXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRXhjbHVzaXZlIHRlc3QtY2FzZS5cbiAgICAgKi9cbiAgICBjb250ZXh0LnN1aXRlLm9ubHkgPSBmdW5jdGlvbiAodGl0bGUsIGZuKSB7XG4gICAgICByZXR1cm4gY29tbW9uLnN1aXRlLm9ubHkoe1xuICAgICAgICB0aXRsZSxcbiAgICAgICAgZmlsZSxcbiAgICAgICAgZm5cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBEZXNjcmliZSBhIHNwZWNpZmljYXRpb24gb3IgdGVzdC1jYXNlIHdpdGggdGhlIGdpdmVuIGB0aXRsZWAgYW5kXG4gICAgICogY2FsbGJhY2sgYGZuYCBhY3RpbmcgYXMgYSB0aHVuay5cbiAgICAgKi9cbiAgICBjb250ZXh0LnRlc3QgPSBmdW5jdGlvbiAodGl0bGUsIGZuKSB7XG4gICAgICB2YXIgc3VpdGUgPSBzdWl0ZXNbMF07XG4gICAgICBpZiAoc3VpdGUuaXNQZW5kaW5nKCkpIHtcbiAgICAgICAgZm4gPSBudWxsO1xuICAgICAgfVxuICAgICAgdmFyIHRlc3QgPSBuZXcgVGVzdCh0aXRsZSwgZm4pO1xuICAgICAgdGVzdC5maWxlID0gZmlsZTtcbiAgICAgIHN1aXRlLmFkZFRlc3QodGVzdCk7XG4gICAgICByZXR1cm4gdGVzdDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRXhjbHVzaXZlIHRlc3QtY2FzZS5cbiAgICAgKi9cblxuICAgIGNvbnRleHQudGVzdC5vbmx5ID0gZnVuY3Rpb24gKHRpdGxlLCBmbikge1xuICAgICAgcmV0dXJuIGNvbW1vbi50ZXN0Lm9ubHkobW9jaGEsIGNvbnRleHQudGVzdCh0aXRsZSwgZm4pKTtcbiAgICB9O1xuXG4gICAgY29udGV4dC50ZXN0LnNraXAgPSBjb21tb24udGVzdC5za2lwO1xuICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzLmRlc2NyaXB0aW9uID1cbiAgJ3RyYWRpdGlvbmFsIFwic3VpdGVcIi9cInRlc3RcIiBpbnN0ZWFkIG9mIEJERFxcJ3MgXCJkZXNjcmliZVwiL1wiaXRcIic7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVGVzdCA9IHJlcXVpcmUoJy4uL3Rlc3QnKTtcbnZhciBFVkVOVF9GSUxFX1BSRV9SRVFVSVJFID1cbiAgcmVxdWlyZSgnLi4vc3VpdGUnKS5jb25zdGFudHMuRVZFTlRfRklMRV9QUkVfUkVRVUlSRTtcblxuLyoqXG4gKiBRVW5pdC1zdHlsZSBpbnRlcmZhY2U6XG4gKlxuICogICAgIHN1aXRlKCdBcnJheScpO1xuICpcbiAqICAgICB0ZXN0KCcjbGVuZ3RoJywgZnVuY3Rpb24oKSB7XG4gKiAgICAgICB2YXIgYXJyID0gWzEsMiwzXTtcbiAqICAgICAgIG9rKGFyci5sZW5ndGggPT0gMyk7XG4gKiAgICAgfSk7XG4gKlxuICogICAgIHRlc3QoJyNpbmRleE9mKCknLCBmdW5jdGlvbigpIHtcbiAqICAgICAgIHZhciBhcnIgPSBbMSwyLDNdO1xuICogICAgICAgb2soYXJyLmluZGV4T2YoMSkgPT0gMCk7XG4gKiAgICAgICBvayhhcnIuaW5kZXhPZigyKSA9PSAxKTtcbiAqICAgICAgIG9rKGFyci5pbmRleE9mKDMpID09IDIpO1xuICogICAgIH0pO1xuICpcbiAqICAgICBzdWl0ZSgnU3RyaW5nJyk7XG4gKlxuICogICAgIHRlc3QoJyNsZW5ndGgnLCBmdW5jdGlvbigpIHtcbiAqICAgICAgIG9rKCdmb28nLmxlbmd0aCA9PSAzKTtcbiAqICAgICB9KTtcbiAqXG4gKiBAcGFyYW0ge1N1aXRlfSBzdWl0ZSBSb290IHN1aXRlLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHFVbml0SW50ZXJmYWNlKHN1aXRlKSB7XG4gIHZhciBzdWl0ZXMgPSBbc3VpdGVdO1xuXG4gIHN1aXRlLm9uKEVWRU5UX0ZJTEVfUFJFX1JFUVVJUkUsIGZ1bmN0aW9uIChjb250ZXh0LCBmaWxlLCBtb2NoYSkge1xuICAgIHZhciBjb21tb24gPSByZXF1aXJlKCcuL2NvbW1vbicpKHN1aXRlcywgY29udGV4dCwgbW9jaGEpO1xuXG4gICAgY29udGV4dC5iZWZvcmUgPSBjb21tb24uYmVmb3JlO1xuICAgIGNvbnRleHQuYWZ0ZXIgPSBjb21tb24uYWZ0ZXI7XG4gICAgY29udGV4dC5iZWZvcmVFYWNoID0gY29tbW9uLmJlZm9yZUVhY2g7XG4gICAgY29udGV4dC5hZnRlckVhY2ggPSBjb21tb24uYWZ0ZXJFYWNoO1xuICAgIGNvbnRleHQucnVuID0gbW9jaGEub3B0aW9ucy5kZWxheSAmJiBjb21tb24ucnVuV2l0aFN1aXRlKHN1aXRlKTtcbiAgICAvKipcbiAgICAgKiBEZXNjcmliZSBhIFwic3VpdGVcIiB3aXRoIHRoZSBnaXZlbiBgdGl0bGVgLlxuICAgICAqL1xuXG4gICAgY29udGV4dC5zdWl0ZSA9IGZ1bmN0aW9uICh0aXRsZSkge1xuICAgICAgaWYgKHN1aXRlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHN1aXRlcy5zaGlmdCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbW1vbi5zdWl0ZS5jcmVhdGUoe1xuICAgICAgICB0aXRsZSxcbiAgICAgICAgZmlsZSxcbiAgICAgICAgZm46IGZhbHNlXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRXhjbHVzaXZlIFN1aXRlLlxuICAgICAqL1xuXG4gICAgY29udGV4dC5zdWl0ZS5vbmx5ID0gZnVuY3Rpb24gKHRpdGxlKSB7XG4gICAgICBpZiAoc3VpdGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgc3VpdGVzLnNoaWZ0KCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29tbW9uLnN1aXRlLm9ubHkoe1xuICAgICAgICB0aXRsZSxcbiAgICAgICAgZmlsZSxcbiAgICAgICAgZm46IGZhbHNlXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRGVzY3JpYmUgYSBzcGVjaWZpY2F0aW9uIG9yIHRlc3QtY2FzZVxuICAgICAqIHdpdGggdGhlIGdpdmVuIGB0aXRsZWAgYW5kIGNhbGxiYWNrIGBmbmBcbiAgICAgKiBhY3RpbmcgYXMgYSB0aHVuay5cbiAgICAgKi9cblxuICAgIGNvbnRleHQudGVzdCA9IGZ1bmN0aW9uICh0aXRsZSwgZm4pIHtcbiAgICAgIHZhciB0ZXN0ID0gbmV3IFRlc3QodGl0bGUsIGZuKTtcbiAgICAgIHRlc3QuZmlsZSA9IGZpbGU7XG4gICAgICBzdWl0ZXNbMF0uYWRkVGVzdCh0ZXN0KTtcbiAgICAgIHJldHVybiB0ZXN0O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBFeGNsdXNpdmUgdGVzdC1jYXNlLlxuICAgICAqL1xuXG4gICAgY29udGV4dC50ZXN0Lm9ubHkgPSBmdW5jdGlvbiAodGl0bGUsIGZuKSB7XG4gICAgICByZXR1cm4gY29tbW9uLnRlc3Qub25seShtb2NoYSwgY29udGV4dC50ZXN0KHRpdGxlLCBmbikpO1xuICAgIH07XG5cbiAgICBjb250ZXh0LnRlc3Quc2tpcCA9IGNvbW1vbi50ZXN0LnNraXA7XG4gIH0pO1xufTtcblxubW9kdWxlLmV4cG9ydHMuZGVzY3JpcHRpb24gPSAnUVVuaXQgc3R5bGUnO1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBTdWl0ZSA9IHJlcXVpcmUoJy4uL3N1aXRlJyk7XG52YXIgVGVzdCA9IHJlcXVpcmUoJy4uL3Rlc3QnKTtcblxuLyoqXG4gKiBFeHBvcnRzLXN0eWxlIChhcyBOb2RlLmpzIG1vZHVsZSkgaW50ZXJmYWNlOlxuICpcbiAqICAgICBleHBvcnRzLkFycmF5ID0ge1xuICogICAgICAgJyNpbmRleE9mKCknOiB7XG4gKiAgICAgICAgICdzaG91bGQgcmV0dXJuIC0xIHdoZW4gdGhlIHZhbHVlIGlzIG5vdCBwcmVzZW50JzogZnVuY3Rpb24oKSB7XG4gKlxuICogICAgICAgICB9LFxuICpcbiAqICAgICAgICAgJ3Nob3VsZCByZXR1cm4gdGhlIGNvcnJlY3QgaW5kZXggd2hlbiB0aGUgdmFsdWUgaXMgcHJlc2VudCc6IGZ1bmN0aW9uKCkge1xuICpcbiAqICAgICAgICAgfVxuICogICAgICAgfVxuICogICAgIH07XG4gKlxuICogQHBhcmFtIHtTdWl0ZX0gc3VpdGUgUm9vdCBzdWl0ZS5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc3VpdGUpIHtcbiAgdmFyIHN1aXRlcyA9IFtzdWl0ZV07XG5cbiAgc3VpdGUub24oU3VpdGUuY29uc3RhbnRzLkVWRU5UX0ZJTEVfUkVRVUlSRSwgdmlzaXQpO1xuXG4gIGZ1bmN0aW9uIHZpc2l0KG9iaiwgZmlsZSkge1xuICAgIHZhciBzdWl0ZTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICBpZiAodHlwZW9mIG9ialtrZXldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhciBmbiA9IG9ialtrZXldO1xuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgIGNhc2UgJ2JlZm9yZSc6XG4gICAgICAgICAgICBzdWl0ZXNbMF0uYmVmb3JlQWxsKGZuKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2FmdGVyJzpcbiAgICAgICAgICAgIHN1aXRlc1swXS5hZnRlckFsbChmbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdiZWZvcmVFYWNoJzpcbiAgICAgICAgICAgIHN1aXRlc1swXS5iZWZvcmVFYWNoKGZuKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2FmdGVyRWFjaCc6XG4gICAgICAgICAgICBzdWl0ZXNbMF0uYWZ0ZXJFYWNoKGZuKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB2YXIgdGVzdCA9IG5ldyBUZXN0KGtleSwgZm4pO1xuICAgICAgICAgICAgdGVzdC5maWxlID0gZmlsZTtcbiAgICAgICAgICAgIHN1aXRlc1swXS5hZGRUZXN0KHRlc3QpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdWl0ZSA9IFN1aXRlLmNyZWF0ZShzdWl0ZXNbMF0sIGtleSk7XG4gICAgICAgIHN1aXRlcy51bnNoaWZ0KHN1aXRlKTtcbiAgICAgICAgdmlzaXQob2JqW2tleV0sIGZpbGUpO1xuICAgICAgICBzdWl0ZXMuc2hpZnQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzLmRlc2NyaXB0aW9uID0gJ05vZGUuanMgbW9kdWxlIChcImV4cG9ydHNcIikgc3R5bGUnO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5iZGQgPSByZXF1aXJlKCcuL2JkZCcpO1xuZXhwb3J0cy50ZGQgPSByZXF1aXJlKCcuL3RkZCcpO1xuZXhwb3J0cy5xdW5pdCA9IHJlcXVpcmUoJy4vcXVuaXQnKTtcbmV4cG9ydHMuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZXhwb3J0cycpO1xuIiwgIid1c2Ugc3RyaWN0Jztcbi8qKlxuICogQG1vZHVsZSBDb250ZXh0XG4gKi9cbi8qKlxuICogRXhwb3NlIGBDb250ZXh0YC5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvbnRleHQ7XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIG5ldyBgQ29udGV4dGAuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gQ29udGV4dCgpIHt9XG5cbi8qKlxuICogU2V0IG9yIGdldCB0aGUgY29udGV4dCBgUnVubmFibGVgIHRvIGBydW5uYWJsZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7UnVubmFibGV9IHJ1bm5hYmxlXG4gKiBAcmV0dXJuIHtDb250ZXh0fSBjb250ZXh0XG4gKi9cbkNvbnRleHQucHJvdG90eXBlLnJ1bm5hYmxlID0gZnVuY3Rpb24gKHJ1bm5hYmxlKSB7XG4gIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIHJldHVybiB0aGlzLl9ydW5uYWJsZTtcbiAgfVxuICB0aGlzLnRlc3QgPSB0aGlzLl9ydW5uYWJsZSA9IHJ1bm5hYmxlO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IG9yIGdldCB0ZXN0IHRpbWVvdXQgYG1zYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtDb250ZXh0fSBzZWxmXG4gKi9cbkNvbnRleHQucHJvdG90eXBlLnRpbWVvdXQgPSBmdW5jdGlvbiAobXMpIHtcbiAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHRoaXMucnVubmFibGUoKS50aW1lb3V0KCk7XG4gIH1cbiAgdGhpcy5ydW5uYWJsZSgpLnRpbWVvdXQobXMpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IG9yIGdldCB0ZXN0IHNsb3duZXNzIHRocmVzaG9sZCBgbXNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge251bWJlcn0gbXNcbiAqIEByZXR1cm4ge0NvbnRleHR9IHNlbGZcbiAqL1xuQ29udGV4dC5wcm90b3R5cGUuc2xvdyA9IGZ1bmN0aW9uIChtcykge1xuICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gdGhpcy5ydW5uYWJsZSgpLnNsb3coKTtcbiAgfVxuICB0aGlzLnJ1bm5hYmxlKCkuc2xvdyhtcyk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBNYXJrIGEgdGVzdCBhcyBza2lwcGVkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAdGhyb3dzIFBlbmRpbmdcbiAqL1xuQ29udGV4dC5wcm90b3R5cGUuc2tpcCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5ydW5uYWJsZSgpLnNraXAoKTtcbn07XG5cbi8qKlxuICogU2V0IG9yIGdldCBhIG51bWJlciBvZiBhbGxvd2VkIHJldHJpZXMgb24gZmFpbGVkIHRlc3RzXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBuXG4gKiBAcmV0dXJuIHtDb250ZXh0fSBzZWxmXG4gKi9cbkNvbnRleHQucHJvdG90eXBlLnJldHJpZXMgPSBmdW5jdGlvbiAobikge1xuICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gdGhpcy5ydW5uYWJsZSgpLnJldHJpZXMoKTtcbiAgfVxuICB0aGlzLnJ1bm5hYmxlKCkucmV0cmllcyhuKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyohXG4gKiBtb2NoYVxuICogQ29weXJpZ2h0KGMpIDIwMTEgVEogSG9sb3dheWNodWsgPHRqQHZpc2lvbi1tZWRpYS5jYT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbnZhciBlc2NhcGVSZSA9IHJlcXVpcmUoJ2VzY2FwZS1zdHJpbmctcmVnZXhwJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbnZhciBidWlsdGluUmVwb3J0ZXJzID0gcmVxdWlyZSgnLi9yZXBvcnRlcnMnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBtb2NoYXJjID0gcmVxdWlyZSgnLi9tb2NoYXJjLmpzb24nKTtcbnZhciBTdWl0ZSA9IHJlcXVpcmUoJy4vc3VpdGUnKTtcbnZhciBlc21VdGlscyA9IHJlcXVpcmUoJy4vbm9kZWpzL2VzbS11dGlscycpO1xudmFyIGNyZWF0ZVN0YXRzQ29sbGVjdG9yID0gcmVxdWlyZSgnLi9zdGF0cy1jb2xsZWN0b3InKTtcbmNvbnN0IHtcbiAgY3JlYXRlSW52YWxpZFJlcG9ydGVyRXJyb3IsXG4gIGNyZWF0ZUludmFsaWRJbnRlcmZhY2VFcnJvcixcbiAgY3JlYXRlTW9jaGFJbnN0YW5jZUFscmVhZHlEaXNwb3NlZEVycm9yLFxuICBjcmVhdGVNb2NoYUluc3RhbmNlQWxyZWFkeVJ1bm5pbmdFcnJvcixcbiAgY3JlYXRlVW5zdXBwb3J0ZWRFcnJvclxufSA9IHJlcXVpcmUoJy4vZXJyb3JzJyk7XG5jb25zdCB7RVZFTlRfRklMRV9QUkVfUkVRVUlSRSwgRVZFTlRfRklMRV9QT1NUX1JFUVVJUkUsIEVWRU5UX0ZJTEVfUkVRVUlSRX0gPVxuICBTdWl0ZS5jb25zdGFudHM7XG52YXIgZGVidWcgPSByZXF1aXJlKCdkZWJ1ZycpKCdtb2NoYTptb2NoYScpO1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBNb2NoYTtcblxuLyoqXG4gKiBBIE1vY2hhIGluc3RhbmNlIGlzIGEgZmluaXRlIHN0YXRlIG1hY2hpbmUuXG4gKiBUaGVzZSBhcmUgdGhlIHN0YXRlcyBpdCBjYW4gYmUgaW4uXG4gKiBAcHJpdmF0ZVxuICovXG52YXIgbW9jaGFTdGF0ZXMgPSB1dGlscy5kZWZpbmVDb25zdGFudHMoe1xuICAvKipcbiAgICogSW5pdGlhbCBzdGF0ZSBvZiB0aGUgbW9jaGEgaW5zdGFuY2VcbiAgICogQHByaXZhdGVcbiAgICovXG4gIElOSVQ6ICdpbml0JyxcbiAgLyoqXG4gICAqIE1vY2hhIGluc3RhbmNlIGlzIHJ1bm5pbmcgdGVzdHNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIFJVTk5JTkc6ICdydW5uaW5nJyxcbiAgLyoqXG4gICAqIE1vY2hhIGluc3RhbmNlIGlzIGRvbmUgcnVubmluZyB0ZXN0cyBhbmQgcmVmZXJlbmNlcyB0byB0ZXN0IGZ1bmN0aW9ucyBhbmQgaG9va3MgYXJlIGNsZWFuZWQuXG4gICAqIFlvdSBjYW4gcmVzZXQgdGhpcyBzdGF0ZSBieSB1bmxvYWRpbmcgdGhlIHRlc3QgZmlsZXMuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBSRUZFUkVOQ0VTX0NMRUFORUQ6ICdyZWZlcmVuY2VzQ2xlYW5lZCcsXG4gIC8qKlxuICAgKiBNb2NoYSBpbnN0YW5jZSBpcyBkaXNwb3NlZCBhbmQgY2FuIG5vIGxvbmdlciBiZSB1c2VkLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgRElTUE9TRUQ6ICdkaXNwb3NlZCdcbn0pO1xuXG4vKipcbiAqIFRvIHJlcXVpcmUgbG9jYWwgVUlzIGFuZCByZXBvcnRlcnMgd2hlbiBydW5uaW5nIGluIG5vZGUuXG4gKi9cblxuaWYgKCF1dGlscy5pc0Jyb3dzZXIoKSAmJiB0eXBlb2YgbW9kdWxlLnBhdGhzICE9PSAndW5kZWZpbmVkJykge1xuICB2YXIgY3dkID0gdXRpbHMuY3dkKCk7XG4gIG1vZHVsZS5wYXRocy5wdXNoKGN3ZCwgcGF0aC5qb2luKGN3ZCwgJ25vZGVfbW9kdWxlcycpKTtcbn1cblxuLyoqXG4gKiBFeHBvc2UgaW50ZXJuYWxzLlxuICogQHByaXZhdGVcbiAqL1xuXG5leHBvcnRzLnV0aWxzID0gdXRpbHM7XG5leHBvcnRzLmludGVyZmFjZXMgPSByZXF1aXJlKCcuL2ludGVyZmFjZXMnKTtcbi8qKlxuICogQHB1YmxpY1xuICogQG1lbWJlcm9mIE1vY2hhXG4gKi9cbmV4cG9ydHMucmVwb3J0ZXJzID0gYnVpbHRpblJlcG9ydGVycztcbmV4cG9ydHMuUnVubmFibGUgPSByZXF1aXJlKCcuL3J1bm5hYmxlJyk7XG5leHBvcnRzLkNvbnRleHQgPSByZXF1aXJlKCcuL2NvbnRleHQnKTtcbi8qKlxuICpcbiAqIEBtZW1iZXJvZiBNb2NoYVxuICovXG5leHBvcnRzLlJ1bm5lciA9IHJlcXVpcmUoJy4vcnVubmVyJyk7XG5leHBvcnRzLlN1aXRlID0gU3VpdGU7XG5leHBvcnRzLkhvb2sgPSByZXF1aXJlKCcuL2hvb2snKTtcbmV4cG9ydHMuVGVzdCA9IHJlcXVpcmUoJy4vdGVzdCcpO1xuXG5sZXQgY3VycmVudENvbnRleHQ7XG5leHBvcnRzLmFmdGVyRWFjaCA9IGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gIHJldHVybiAoY3VycmVudENvbnRleHQuYWZ0ZXJFYWNoIHx8IGN1cnJlbnRDb250ZXh0LnRlYXJkb3duKS5hcHBseShcbiAgICB0aGlzLFxuICAgIGFyZ3NcbiAgKTtcbn07XG5leHBvcnRzLmFmdGVyID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgcmV0dXJuIChjdXJyZW50Q29udGV4dC5hZnRlciB8fCBjdXJyZW50Q29udGV4dC5zdWl0ZVRlYXJkb3duKS5hcHBseShcbiAgICB0aGlzLFxuICAgIGFyZ3NcbiAgKTtcbn07XG5leHBvcnRzLmJlZm9yZUVhY2ggPSBmdW5jdGlvbiAoLi4uYXJncykge1xuICByZXR1cm4gKGN1cnJlbnRDb250ZXh0LmJlZm9yZUVhY2ggfHwgY3VycmVudENvbnRleHQuc2V0dXApLmFwcGx5KHRoaXMsIGFyZ3MpO1xufTtcbmV4cG9ydHMuYmVmb3JlID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgcmV0dXJuIChjdXJyZW50Q29udGV4dC5iZWZvcmUgfHwgY3VycmVudENvbnRleHQuc3VpdGVTZXR1cCkuYXBwbHkodGhpcywgYXJncyk7XG59O1xuZXhwb3J0cy5kZXNjcmliZSA9IGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gIHJldHVybiAoY3VycmVudENvbnRleHQuZGVzY3JpYmUgfHwgY3VycmVudENvbnRleHQuc3VpdGUpLmFwcGx5KHRoaXMsIGFyZ3MpO1xufTtcbmV4cG9ydHMuZGVzY3JpYmUub25seSA9IGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gIHJldHVybiAoY3VycmVudENvbnRleHQuZGVzY3JpYmUgfHwgY3VycmVudENvbnRleHQuc3VpdGUpLm9ubHkuYXBwbHkoXG4gICAgdGhpcyxcbiAgICBhcmdzXG4gICk7XG59O1xuZXhwb3J0cy5kZXNjcmliZS5za2lwID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgcmV0dXJuIChjdXJyZW50Q29udGV4dC5kZXNjcmliZSB8fCBjdXJyZW50Q29udGV4dC5zdWl0ZSkuc2tpcC5hcHBseShcbiAgICB0aGlzLFxuICAgIGFyZ3NcbiAgKTtcbn07XG5leHBvcnRzLml0ID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgcmV0dXJuIChjdXJyZW50Q29udGV4dC5pdCB8fCBjdXJyZW50Q29udGV4dC50ZXN0KS5hcHBseSh0aGlzLCBhcmdzKTtcbn07XG5leHBvcnRzLml0Lm9ubHkgPSBmdW5jdGlvbiAoLi4uYXJncykge1xuICByZXR1cm4gKGN1cnJlbnRDb250ZXh0Lml0IHx8IGN1cnJlbnRDb250ZXh0LnRlc3QpLm9ubHkuYXBwbHkodGhpcywgYXJncyk7XG59O1xuZXhwb3J0cy5pdC5za2lwID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgcmV0dXJuIChjdXJyZW50Q29udGV4dC5pdCB8fCBjdXJyZW50Q29udGV4dC50ZXN0KS5za2lwLmFwcGx5KHRoaXMsIGFyZ3MpO1xufTtcbmV4cG9ydHMueGRlc2NyaWJlID0gZXhwb3J0cy5kZXNjcmliZS5za2lwO1xuZXhwb3J0cy54aXQgPSBleHBvcnRzLml0LnNraXA7XG5leHBvcnRzLnNldHVwID0gZXhwb3J0cy5iZWZvcmVFYWNoO1xuZXhwb3J0cy5zdWl0ZVNldHVwID0gZXhwb3J0cy5iZWZvcmU7XG5leHBvcnRzLnN1aXRlVGVhcmRvd24gPSBleHBvcnRzLmFmdGVyO1xuZXhwb3J0cy5zdWl0ZSA9IGV4cG9ydHMuZGVzY3JpYmU7XG5leHBvcnRzLnRlYXJkb3duID0gZXhwb3J0cy5hZnRlckVhY2g7XG5leHBvcnRzLnRlc3QgPSBleHBvcnRzLml0O1xuZXhwb3J0cy5ydW4gPSBmdW5jdGlvbiAoLi4uYXJncykge1xuICByZXR1cm4gY3VycmVudENvbnRleHQucnVuLmFwcGx5KHRoaXMsIGFyZ3MpO1xufTtcblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgbmV3IE1vY2hhIGluc3RhbmNlIHdpdGggYG9wdGlvbnNgLlxuICpcbiAqIEBwdWJsaWNcbiAqIEBjbGFzcyBNb2NoYVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIFNldHRpbmdzIG9iamVjdC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuYWxsb3dVbmNhdWdodF0gLSBQcm9wYWdhdGUgdW5jYXVnaHQgZXJyb3JzP1xuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5hc3luY09ubHldIC0gRm9yY2UgYGRvbmVgIGNhbGxiYWNrIG9yIHByb21pc2U/XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmJhaWxdIC0gQmFpbCBhZnRlciBmaXJzdCB0ZXN0IGZhaWx1cmU/XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmNoZWNrTGVha3NdIC0gQ2hlY2sgZm9yIGdsb2JhbCB2YXJpYWJsZSBsZWFrcz9cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuY29sb3JdIC0gQ29sb3IgVFRZIG91dHB1dCBmcm9tIHJlcG9ydGVyP1xuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5kZWxheV0gLSBEZWxheSByb290IHN1aXRlIGV4ZWN1dGlvbj9cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZGlmZl0gLSBTaG93IGRpZmYgb24gZmFpbHVyZT9cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZHJ5UnVuXSAtIFJlcG9ydCB0ZXN0cyB3aXRob3V0IHJ1bm5pbmcgdGhlbT9cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucGFzc09uRmFpbGluZ1Rlc3RTdWl0ZV0gLSBGYWlsIHRlc3QgcnVuIGlmIHRlc3RzIHdlcmUgZmFpbGVkP1xuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5mYWlsWmVyb10gLSBGYWlsIHRlc3QgcnVuIGlmIHplcm8gdGVzdHM/XG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuZmdyZXBdIC0gVGVzdCBmaWx0ZXIgZ2l2ZW4gc3RyaW5nLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5mb3JiaWRPbmx5XSAtIFRlc3RzIG1hcmtlZCBgb25seWAgZmFpbCB0aGUgc3VpdGU/XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmZvcmJpZFBlbmRpbmddIC0gUGVuZGluZyB0ZXN0cyBmYWlsIHRoZSBzdWl0ZT9cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZnVsbFRyYWNlXSAtIEZ1bGwgc3RhY2t0cmFjZSB1cG9uIGZhaWx1cmU/XG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBbb3B0aW9ucy5nbG9iYWxdIC0gVmFyaWFibGVzIGV4cGVjdGVkIGluIGdsb2JhbCBzY29wZS5cbiAqIEBwYXJhbSB7UmVnRXhwfHN0cmluZ30gW29wdGlvbnMuZ3JlcF0gLSBUZXN0IGZpbHRlciBnaXZlbiByZWd1bGFyIGV4cHJlc3Npb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmlubGluZURpZmZzXSAtIERpc3BsYXkgaW5saW5lIGRpZmZzP1xuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5pbnZlcnRdIC0gSW52ZXJ0IHRlc3QgZmlsdGVyIG1hdGNoZXM/XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLm5vSGlnaGxpZ2h0aW5nXSAtIERpc2FibGUgc3ludGF4IGhpZ2hsaWdodGluZz9cbiAqIEBwYXJhbSB7c3RyaW5nfGNvbnN0cnVjdG9yfSBbb3B0aW9ucy5yZXBvcnRlcl0gLSBSZXBvcnRlciBuYW1lIG9yIGNvbnN0cnVjdG9yLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnJlcG9ydGVyT3B0aW9uXSAtIFJlcG9ydGVyIHNldHRpbmdzIG9iamVjdC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5yZXRyaWVzXSAtIE51bWJlciBvZiB0aW1lcyB0byByZXRyeSBmYWlsZWQgdGVzdHMuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuc2xvd10gLSBTbG93IHRocmVzaG9sZCB2YWx1ZS5cbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gW29wdGlvbnMudGltZW91dF0gLSBUaW1lb3V0IHRocmVzaG9sZCB2YWx1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy51aV0gLSBJbnRlcmZhY2UgbmFtZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucGFyYWxsZWxdIC0gUnVuIGpvYnMgaW4gcGFyYWxsZWwuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuam9ic10gLSBNYXggbnVtYmVyIG9mIHdvcmtlciBwcm9jZXNzZXMgZm9yIHBhcmFsbGVsIHJ1bnMuXG4gKiBAcGFyYW0ge01vY2hhUm9vdEhvb2tPYmplY3R9IFtvcHRpb25zLnJvb3RIb29rc10gLSBIb29rcyB0byBib290c3RyYXAgdGhlIHJvb3Qgc3VpdGUgd2l0aC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IFtvcHRpb25zLnJlcXVpcmVdIC0gUGF0aG5hbWUgb2YgYHJvb3RIb29rc2AgcGx1Z2luIGZvciBwYXJhbGxlbCBydW5zLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5pc1dvcmtlcl0gLSBTaG91bGQgYmUgYHRydWVgIGlmIGBNb2NoYWAgcHJvY2VzcyBpcyBydW5uaW5nIGluIGEgd29ya2VyIHByb2Nlc3MuXG4gKi9cbmZ1bmN0aW9uIE1vY2hhKG9wdGlvbnMgPSB7fSkge1xuICBvcHRpb25zID0gey4uLm1vY2hhcmMsIC4uLm9wdGlvbnN9O1xuICB0aGlzLmZpbGVzID0gW107XG4gIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gIC8vIHJvb3Qgc3VpdGVcbiAgdGhpcy5zdWl0ZSA9IG5ldyBleHBvcnRzLlN1aXRlKCcnLCBuZXcgZXhwb3J0cy5Db250ZXh0KCksIHRydWUpO1xuICB0aGlzLl9jbGVhblJlZmVyZW5jZXNBZnRlclJ1biA9IHRydWU7XG4gIHRoaXMuX3N0YXRlID0gbW9jaGFTdGF0ZXMuSU5JVDtcblxuICB0aGlzLmdyZXAob3B0aW9ucy5ncmVwKVxuICAgIC5mZ3JlcChvcHRpb25zLmZncmVwKVxuICAgIC51aShvcHRpb25zLnVpKVxuICAgIC5yZXBvcnRlcihcbiAgICAgIG9wdGlvbnMucmVwb3J0ZXIsXG4gICAgICBvcHRpb25zWydyZXBvcnRlci1vcHRpb24nXSB8fFxuICAgICAgICBvcHRpb25zLnJlcG9ydGVyT3B0aW9uIHx8XG4gICAgICAgIG9wdGlvbnMucmVwb3J0ZXJPcHRpb25zIC8vIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgIClcbiAgICAuc2xvdyhvcHRpb25zLnNsb3cpXG4gICAgLmdsb2JhbChvcHRpb25zLmdsb2JhbCk7XG5cbiAgLy8gdGhpcyBndWFyZCBleGlzdHMgYmVjYXVzZSBTdWl0ZSN0aW1lb3V0IGRvZXMgbm90IGNvbnNpZGVyIGB1bmRlZmluZWRgIHRvIGJlIHZhbGlkIGlucHV0XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy50aW1lb3V0ICE9PSAndW5kZWZpbmVkJykge1xuICAgIHRoaXMudGltZW91dChvcHRpb25zLnRpbWVvdXQgPT09IGZhbHNlID8gMCA6IG9wdGlvbnMudGltZW91dCk7XG4gIH1cblxuICBpZiAoJ3JldHJpZXMnIGluIG9wdGlvbnMpIHtcbiAgICB0aGlzLnJldHJpZXMob3B0aW9ucy5yZXRyaWVzKTtcbiAgfVxuXG4gIFtcbiAgICAnYWxsb3dVbmNhdWdodCcsXG4gICAgJ2FzeW5jT25seScsXG4gICAgJ2JhaWwnLFxuICAgICdjaGVja0xlYWtzJyxcbiAgICAnY29sb3InLFxuICAgICdkZWxheScsXG4gICAgJ2RpZmYnLFxuICAgICdkcnlSdW4nLFxuICAgICdwYXNzT25GYWlsaW5nVGVzdFN1aXRlJyxcbiAgICAnZmFpbFplcm8nLFxuICAgICdmb3JiaWRPbmx5JyxcbiAgICAnZm9yYmlkUGVuZGluZycsXG4gICAgJ2Z1bGxUcmFjZScsXG4gICAgJ2lubGluZURpZmZzJyxcbiAgICAnaW52ZXJ0J1xuICBdLmZvckVhY2goZnVuY3Rpb24gKG9wdCkge1xuICAgIGlmIChvcHRpb25zW29wdF0pIHtcbiAgICAgIHRoaXNbb3B0XSgpO1xuICAgIH1cbiAgfSwgdGhpcyk7XG5cbiAgaWYgKG9wdGlvbnMucm9vdEhvb2tzKSB7XG4gICAgdGhpcy5yb290SG9va3Mob3B0aW9ucy5yb290SG9va3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjbGFzcyB3aGljaCB3ZSdsbCBpbnN0YW50aWF0ZSBpbiB7QGxpbmsgTW9jaGEjcnVufS4gIERlZmF1bHRzIHRvXG4gICAqIHtAbGluayBSdW5uZXJ9IGluIHNlcmlhbCBtb2RlOyBjaGFuZ2VzIGluIHBhcmFsbGVsIG1vZGUuXG4gICAqIEBtZW1iZXJvZiBNb2NoYVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgdGhpcy5fcnVubmVyQ2xhc3MgPSBleHBvcnRzLlJ1bm5lcjtcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdG8gY2FsbCB7QGxpbmsgTW9jaGEjbG9hZEZpbGVzfSBpbXBsaWNpdGx5IHdoZW4gY2FsbGluZ1xuICAgKiB7QGxpbmsgTW9jaGEjcnVufS4gIElmIHRoaXMgaXMgYHRydWVgLCB0aGVuIGl0J3MgdXAgdG8gdGhlIGNvbnN1bWVyIHRvIGNhbGxcbiAgICoge0BsaW5rIE1vY2hhI2xvYWRGaWxlc30gX29yXyB7QGxpbmsgTW9jaGEjbG9hZEZpbGVzQXN5bmN9LlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyb2YgTW9jaGFcbiAgICovXG4gIHRoaXMuX2xhenlMb2FkRmlsZXMgPSBmYWxzZTtcblxuICAvKipcbiAgICogSXQncyB1c2VmdWwgZm9yIGEgTW9jaGEgaW5zdGFuY2UgdG8ga25vdyBpZiBpdCdzIHJ1bm5pbmcgaW4gYSB3b3JrZXIgcHJvY2Vzcy5cbiAgICogV2UgY291bGQgZGVyaXZlIHRoaXMgdmlhIG90aGVyIG1lYW5zLCBidXQgaXQncyBoZWxwZnVsIHRvIGhhdmUgYSBmbGFnIHRvIHJlZmVyIHRvLlxuICAgKiBAbWVtYmVyb2YgTW9jaGFcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHRoaXMuaXNXb3JrZXIgPSBCb29sZWFuKG9wdGlvbnMuaXNXb3JrZXIpO1xuXG4gIHRoaXMuZ2xvYmFsU2V0dXAob3B0aW9ucy5nbG9iYWxTZXR1cClcbiAgICAuZ2xvYmFsVGVhcmRvd24ob3B0aW9ucy5nbG9iYWxUZWFyZG93bilcbiAgICAuZW5hYmxlR2xvYmFsU2V0dXAob3B0aW9ucy5lbmFibGVHbG9iYWxTZXR1cClcbiAgICAuZW5hYmxlR2xvYmFsVGVhcmRvd24ob3B0aW9ucy5lbmFibGVHbG9iYWxUZWFyZG93bik7XG5cbiAgaWYgKFxuICAgIG9wdGlvbnMucGFyYWxsZWwgJiZcbiAgICAodHlwZW9mIG9wdGlvbnMuam9icyA9PT0gJ3VuZGVmaW5lZCcgfHwgb3B0aW9ucy5qb2JzID4gMSlcbiAgKSB7XG4gICAgZGVidWcoJ2F0dGVtcHRpbmcgdG8gZW5hYmxlIHBhcmFsbGVsIG1vZGUnKTtcbiAgICB0aGlzLnBhcmFsbGVsTW9kZSh0cnVlKTtcbiAgfVxufVxuXG4vKipcbiAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgYmFpbGluZyBvbiB0aGUgZmlyc3QgZmFpbHVyZS5cbiAqXG4gKiBAcHVibGljXG4gKiBAc2VlIFtDTEkgb3B0aW9uXSguLi8jLWJhaWwtYilcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2JhaWw9dHJ1ZV0gLSBXaGV0aGVyIHRvIGJhaWwgb24gZmlyc3QgZXJyb3IuXG4gKiBAcmV0dXJucyB7TW9jaGF9IHRoaXNcbiAqIEBjaGFpbmFibGVcbiAqL1xuTW9jaGEucHJvdG90eXBlLmJhaWwgPSBmdW5jdGlvbiAoYmFpbCkge1xuICB0aGlzLnN1aXRlLmJhaWwoYmFpbCAhPT0gZmFsc2UpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQHN1bW1hcnlcbiAqIEFkZHMgYGZpbGVgIHRvIGJlIGxvYWRlZCBmb3IgZXhlY3V0aW9uLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVXNlZnVsIGZvciBnZW5lcmljIHNldHVwIGNvZGUgdGhhdCBtdXN0IGJlIGluY2x1ZGVkIHdpdGhpbiB0ZXN0IHN1aXRlLlxuICpcbiAqIEBwdWJsaWNcbiAqIEBzZWUgW0NMSSBvcHRpb25dKC4uLyMtZmlsZS1maWxlZGlyZWN0b3J5Z2xvYilcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlIC0gUGF0aG5hbWUgb2YgZmlsZSB0byBiZSBsb2FkZWQuXG4gKiBAcmV0dXJucyB7TW9jaGF9IHRoaXNcbiAqIEBjaGFpbmFibGVcbiAqL1xuTW9jaGEucHJvdG90eXBlLmFkZEZpbGUgPSBmdW5jdGlvbiAoZmlsZSkge1xuICB0aGlzLmZpbGVzLnB1c2goZmlsZSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXRzIHJlcG9ydGVyIHRvIGByZXBvcnRlcmAsIGRlZmF1bHRzIHRvIFwic3BlY1wiLlxuICpcbiAqIEBwdWJsaWNcbiAqIEBzZWUgW0NMSSBvcHRpb25dKC4uLyMtcmVwb3J0ZXItbmFtZS1yLW5hbWUpXG4gKiBAc2VlIFtSZXBvcnRlcnNdKC4uLyNyZXBvcnRlcnMpXG4gKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gcmVwb3J0ZXJOYW1lIC0gUmVwb3J0ZXIgbmFtZSBvciBjb25zdHJ1Y3Rvci5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVwb3J0ZXJPcHRpb25zXSAtIE9wdGlvbnMgdXNlZCB0byBjb25maWd1cmUgdGhlIHJlcG9ydGVyLlxuICogQHJldHVybnMge01vY2hhfSB0aGlzXG4gKiBAY2hhaW5hYmxlXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgcmVxdWVzdGVkIHJlcG9ydGVyIGNhbm5vdCBiZSBsb2FkZWRcbiAqIEBleGFtcGxlXG4gKlxuICogLy8gVXNlIFhVbml0IHJlcG9ydGVyIGFuZCBkaXJlY3QgaXRzIG91dHB1dCB0byBmaWxlXG4gKiBtb2NoYS5yZXBvcnRlcigneHVuaXQnLCB7IG91dHB1dDogJy9wYXRoL3RvL3Rlc3RzcGVjLnh1bml0LnhtbCcgfSk7XG4gKi9cbk1vY2hhLnByb3RvdHlwZS5yZXBvcnRlciA9IGZ1bmN0aW9uIChyZXBvcnRlck5hbWUsIHJlcG9ydGVyT3B0aW9ucykge1xuICBpZiAodHlwZW9mIHJlcG9ydGVyTmFtZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRoaXMuX3JlcG9ydGVyID0gcmVwb3J0ZXJOYW1lO1xuICB9IGVsc2Uge1xuICAgIHJlcG9ydGVyTmFtZSA9IHJlcG9ydGVyTmFtZSB8fCAnc3BlYyc7XG4gICAgdmFyIHJlcG9ydGVyO1xuICAgIC8vIFRyeSB0byBsb2FkIGEgYnVpbHQtaW4gcmVwb3J0ZXIuXG4gICAgaWYgKGJ1aWx0aW5SZXBvcnRlcnNbcmVwb3J0ZXJOYW1lXSkge1xuICAgICAgcmVwb3J0ZXIgPSBidWlsdGluUmVwb3J0ZXJzW3JlcG9ydGVyTmFtZV07XG4gICAgfVxuICAgIC8vIFRyeSB0byBsb2FkIHJlcG9ydGVycyBmcm9tIHByb2Nlc3MuY3dkKCkgYW5kIG5vZGVfbW9kdWxlc1xuICAgIGlmICghcmVwb3J0ZXIpIHtcbiAgICAgIGxldCBmb3VuZFJlcG9ydGVyO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm91bmRSZXBvcnRlciA9IHJlcXVpcmUucmVzb2x2ZShyZXBvcnRlck5hbWUpO1xuICAgICAgICByZXBvcnRlciA9IHJlcXVpcmUoZm91bmRSZXBvcnRlcik7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGZvdW5kUmVwb3J0ZXIpIHtcbiAgICAgICAgICB0aHJvdyBjcmVhdGVJbnZhbGlkUmVwb3J0ZXJFcnJvcihlcnIubWVzc2FnZSwgZm91bmRSZXBvcnRlcik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVHJ5IHRvIGxvYWQgcmVwb3J0ZXJzIGZyb20gYSBjd2QtcmVsYXRpdmUgcGF0aFxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlcG9ydGVyID0gcmVxdWlyZShwYXRoLnJlc29sdmUocmVwb3J0ZXJOYW1lKSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0aHJvdyBjcmVhdGVJbnZhbGlkUmVwb3J0ZXJFcnJvcihlLm1lc3NhZ2UsIHJlcG9ydGVyTmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fcmVwb3J0ZXIgPSByZXBvcnRlcjtcbiAgfVxuICB0aGlzLm9wdGlvbnMucmVwb3J0ZXJPcHRpb24gPSByZXBvcnRlck9wdGlvbnM7XG4gIC8vIGFsaWFzIG9wdGlvbiBuYW1lIGlzIHVzZWQgaW4gYnVpbHQtaW4gcmVwb3J0ZXJzIHh1bml0L3RhcC9wcm9ncmVzc1xuICB0aGlzLm9wdGlvbnMucmVwb3J0ZXJPcHRpb25zID0gcmVwb3J0ZXJPcHRpb25zO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0cyB0ZXN0IFVJIGBuYW1lYCwgZGVmYXVsdHMgdG8gXCJiZGRcIi5cbiAqXG4gKiBAcHVibGljXG4gKiBAc2VlIFtDTEkgb3B0aW9uXSguLi8jLXVpLW5hbWUtdS1uYW1lKVxuICogQHNlZSBbSW50ZXJmYWNlIERTTHNdKC4uLyNpbnRlcmZhY2VzKVxuICogQHBhcmFtIHtzdHJpbmd8RnVuY3Rpb259IFt1aT1iZGRdIC0gSW50ZXJmYWNlIG5hbWUgb3IgY2xhc3MuXG4gKiBAcmV0dXJucyB7TW9jaGF9IHRoaXNcbiAqIEBjaGFpbmFibGVcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiByZXF1ZXN0ZWQgaW50ZXJmYWNlIGNhbm5vdCBiZSBsb2FkZWRcbiAqL1xuTW9jaGEucHJvdG90eXBlLnVpID0gZnVuY3Rpb24gKHVpKSB7XG4gIHZhciBiaW5kSW50ZXJmYWNlO1xuICBpZiAodHlwZW9mIHVpID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYmluZEludGVyZmFjZSA9IHVpO1xuICB9IGVsc2Uge1xuICAgIHVpID0gdWkgfHwgJ2JkZCc7XG4gICAgYmluZEludGVyZmFjZSA9IGV4cG9ydHMuaW50ZXJmYWNlc1t1aV07XG4gICAgaWYgKCFiaW5kSW50ZXJmYWNlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBiaW5kSW50ZXJmYWNlID0gcmVxdWlyZSh1aSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgY3JlYXRlSW52YWxpZEludGVyZmFjZUVycm9yKGBpbnZhbGlkIGludGVyZmFjZSAnJHt1aX0nYCwgdWkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBiaW5kSW50ZXJmYWNlKHRoaXMuc3VpdGUpO1xuXG4gIHRoaXMuc3VpdGUub24oRVZFTlRfRklMRV9QUkVfUkVRVUlSRSwgZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICBjdXJyZW50Q29udGV4dCA9IGNvbnRleHQ7XG4gIH0pO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBMb2FkcyBgZmlsZXNgIHByaW9yIHRvIGV4ZWN1dGlvbi4gRG9lcyBub3Qgc3VwcG9ydCBFUyBNb2R1bGVzLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVGhlIGltcGxlbWVudGF0aW9uIHJlbGllcyBvbiBOb2RlJ3MgYHJlcXVpcmVgIHRvIGV4ZWN1dGVcbiAqIHRoZSB0ZXN0IGludGVyZmFjZSBmdW5jdGlvbnMgYW5kIHdpbGwgYmUgc3ViamVjdCB0byBpdHMgY2FjaGUuXG4gKiBTdXBwb3J0cyBvbmx5IENvbW1vbkpTIG1vZHVsZXMuIFRvIGxvYWQgRVMgbW9kdWxlcywgdXNlIE1vY2hhI2xvYWRGaWxlc0FzeW5jLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAc2VlIHtAbGluayBNb2NoYSNhZGRGaWxlfVxuICogQHNlZSB7QGxpbmsgTW9jaGEjcnVufVxuICogQHNlZSB7QGxpbmsgTW9jaGEjdW5sb2FkRmlsZXN9XG4gKiBAc2VlIHtAbGluayBNb2NoYSNsb2FkRmlsZXNBc3luY31cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtmbl0gLSBDYWxsYmFjayBpbnZva2VkIHVwb24gY29tcGxldGlvbi5cbiAqL1xuTW9jaGEucHJvdG90eXBlLmxvYWRGaWxlcyA9IGZ1bmN0aW9uIChmbikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBzdWl0ZSA9IHRoaXMuc3VpdGU7XG4gIHRoaXMuZmlsZXMuZm9yRWFjaChmdW5jdGlvbiAoZmlsZSkge1xuICAgIGZpbGUgPSBwYXRoLnJlc29sdmUoZmlsZSk7XG4gICAgc3VpdGUuZW1pdChFVkVOVF9GSUxFX1BSRV9SRVFVSVJFLCBnbG9iYWwsIGZpbGUsIHNlbGYpO1xuICAgIHN1aXRlLmVtaXQoRVZFTlRfRklMRV9SRVFVSVJFLCByZXF1aXJlKGZpbGUpLCBmaWxlLCBzZWxmKTtcbiAgICBzdWl0ZS5lbWl0KEVWRU5UX0ZJTEVfUE9TVF9SRVFVSVJFLCBnbG9iYWwsIGZpbGUsIHNlbGYpO1xuICB9KTtcbiAgZm4gJiYgZm4oKTtcbn07XG5cbi8qKlxuICogTG9hZHMgYGZpbGVzYCBwcmlvciB0byBleGVjdXRpb24uIFN1cHBvcnRzIE5vZGUgRVMgTW9kdWxlcy5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoZSBpbXBsZW1lbnRhdGlvbiByZWxpZXMgb24gTm9kZSdzIGByZXF1aXJlYCBhbmQgYGltcG9ydGAgdG8gZXhlY3V0ZVxuICogdGhlIHRlc3QgaW50ZXJmYWNlIGZ1bmN0aW9ucyBhbmQgd2lsbCBiZSBzdWJqZWN0IHRvIGl0cyBjYWNoZS5cbiAqIFN1cHBvcnRzIGJvdGggQ0pTIGFuZCBFU00gbW9kdWxlcy5cbiAqXG4gKiBAcHVibGljXG4gKiBAc2VlIHtAbGluayBNb2NoYSNhZGRGaWxlfVxuICogQHNlZSB7QGxpbmsgTW9jaGEjcnVufVxuICogQHNlZSB7QGxpbmsgTW9jaGEjdW5sb2FkRmlsZXN9XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gU2V0dGluZ3Mgb2JqZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuZXNtRGVjb3JhdG9yXSAtIEZ1bmN0aW9uIGludm9rZWQgb24gZXNtIG1vZHVsZSBuYW1lIHJpZ2h0IGJlZm9yZSBpbXBvcnRpbmcgaXQuIEJ5IGRlZmF1bHQgd2lsbCBwYXNzdGhyb3VnaCBhcyBpcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlfVxuICogQGV4YW1wbGVcbiAqXG4gKiAvLyBsb2FkcyBFU00gKGFuZCBDSlMpIHRlc3QgZmlsZXMgYXN5bmNocm9ub3VzbHksIHRoZW4gcnVucyByb290IHN1aXRlXG4gKiBtb2NoYS5sb2FkRmlsZXNBc3luYygpXG4gKiAgIC50aGVuKCgpID0+IG1vY2hhLnJ1bihmYWlsdXJlcyA9PiBwcm9jZXNzLmV4aXRDb2RlID0gZmFpbHVyZXMgPyAxIDogMCkpXG4gKiAgIC5jYXRjaCgoKSA9PiBwcm9jZXNzLmV4aXRDb2RlID0gMSk7XG4gKi9cbk1vY2hhLnByb3RvdHlwZS5sb2FkRmlsZXNBc3luYyA9IGZ1bmN0aW9uICh7ZXNtRGVjb3JhdG9yfSA9IHt9KSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHN1aXRlID0gdGhpcy5zdWl0ZTtcbiAgdGhpcy5sYXp5TG9hZEZpbGVzKHRydWUpO1xuXG4gIHJldHVybiBlc21VdGlscy5sb2FkRmlsZXNBc3luYyhcbiAgICB0aGlzLmZpbGVzLFxuICAgIGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICBzdWl0ZS5lbWl0KEVWRU5UX0ZJTEVfUFJFX1JFUVVJUkUsIGdsb2JhbCwgZmlsZSwgc2VsZik7XG4gICAgfSxcbiAgICBmdW5jdGlvbiAoZmlsZSwgcmVzdWx0TW9kdWxlKSB7XG4gICAgICBzdWl0ZS5lbWl0KEVWRU5UX0ZJTEVfUkVRVUlSRSwgcmVzdWx0TW9kdWxlLCBmaWxlLCBzZWxmKTtcbiAgICAgIHN1aXRlLmVtaXQoRVZFTlRfRklMRV9QT1NUX1JFUVVJUkUsIGdsb2JhbCwgZmlsZSwgc2VsZik7XG4gICAgfSxcbiAgICBlc21EZWNvcmF0b3JcbiAgKTtcbn07XG5cbi8qKlxuICogUmVtb3ZlcyBhIHByZXZpb3VzbHkgbG9hZGVkIGZpbGUgZnJvbSBOb2RlJ3MgYHJlcXVpcmVgIGNhY2hlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAc3RhdGljXG4gKiBAc2VlIHtAbGluayBNb2NoYSN1bmxvYWRGaWxlc31cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlIC0gUGF0aG5hbWUgb2YgZmlsZSB0byBiZSB1bmxvYWRlZC5cbiAqL1xuTW9jaGEudW5sb2FkRmlsZSA9IGZ1bmN0aW9uIChmaWxlKSB7XG4gIGlmICh1dGlscy5pc0Jyb3dzZXIoKSkge1xuICAgIHRocm93IGNyZWF0ZVVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICAndW5sb2FkRmlsZSgpIGlzIG9ubHkgc3VwcG9ydGVkIGluIGEgTm9kZS5qcyBlbnZpcm9ubWVudCdcbiAgICApO1xuICB9XG4gIHJldHVybiByZXF1aXJlKCcuL25vZGVqcy9maWxlLXVubG9hZGVyJykudW5sb2FkRmlsZShmaWxlKTtcbn07XG5cbi8qKlxuICogVW5sb2FkcyBgZmlsZXNgIGZyb20gTm9kZSdzIGByZXF1aXJlYCBjYWNoZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoaXMgYWxsb3dzIHJlcXVpcmVkIGZpbGVzIHRvIGJlIFwiZnJlc2hseVwiIHJlbG9hZGVkLCBwcm92aWRpbmcgdGhlIGFiaWxpdHlcbiAqIHRvIHJldXNlIGEgTW9jaGEgaW5zdGFuY2UgcHJvZ3JhbW1hdGljYWxseS5cbiAqIE5vdGU6IGRvZXMgbm90IGNsZWFyIEVTTSBtb2R1bGUgZmlsZXMgZnJvbSB0aGUgY2FjaGVcbiAqXG4gKiA8c3Ryb25nPkludGVuZGVkIGZvciBjb25zdW1lcnMgJm1kYXNoOyBub3QgdXNlZCBpbnRlcm5hbGx5PC9zdHJvbmc+XG4gKlxuICogQHB1YmxpY1xuICogQHNlZSB7QGxpbmsgTW9jaGEjcnVufVxuICogQHJldHVybnMge01vY2hhfSB0aGlzXG4gKiBAY2hhaW5hYmxlXG4gKi9cbk1vY2hhLnByb3RvdHlwZS51bmxvYWRGaWxlcyA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuX3N0YXRlID09PSBtb2NoYVN0YXRlcy5ESVNQT1NFRCkge1xuICAgIHRocm93IGNyZWF0ZU1vY2hhSW5zdGFuY2VBbHJlYWR5RGlzcG9zZWRFcnJvcihcbiAgICAgICdNb2NoYSBpbnN0YW5jZSBpcyBhbHJlYWR5IGRpc3Bvc2VkLCBpdCBjYW5ub3QgYmUgdXNlZCBhZ2Fpbi4nLFxuICAgICAgdGhpcy5fY2xlYW5SZWZlcmVuY2VzQWZ0ZXJSdW4sXG4gICAgICB0aGlzXG4gICAgKTtcbiAgfVxuXG4gIHRoaXMuZmlsZXMuZm9yRWFjaChmdW5jdGlvbiAoZmlsZSkge1xuICAgIE1vY2hhLnVubG9hZEZpbGUoZmlsZSk7XG4gIH0pO1xuICB0aGlzLl9zdGF0ZSA9IG1vY2hhU3RhdGVzLklOSVQ7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXRzIGBncmVwYCBmaWx0ZXIgYWZ0ZXIgZXNjYXBpbmcgUmVnRXhwIHNwZWNpYWwgY2hhcmFjdGVycy5cbiAqXG4gKiBAcHVibGljXG4gKiBAc2VlIHtAbGluayBNb2NoYSNncmVwfVxuICogQHBhcmFtIHtzdHJpbmd9IHN0ciAtIFZhbHVlIHRvIGJlIGNvbnZlcnRlZCB0byBhIHJlZ2V4cC5cbiAqIEByZXR1cm5zIHtNb2NoYX0gdGhpc1xuICogQGNoYWluYWJsZVxuICogQGV4YW1wbGVcbiAqXG4gKiAvLyBTZWxlY3QgdGVzdHMgd2hvc2UgZnVsbCB0aXRsZSBiZWdpbnMgd2l0aCBgXCJmb29cImAgZm9sbG93ZWQgYnkgYSBwZXJpb2RcbiAqIG1vY2hhLmZncmVwKCdmb28uJyk7XG4gKi9cbk1vY2hhLnByb3RvdHlwZS5mZ3JlcCA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgaWYgKCFzdHIpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICByZXR1cm4gdGhpcy5ncmVwKG5ldyBSZWdFeHAoZXNjYXBlUmUoc3RyKSkpO1xufTtcblxuLyoqXG4gKiBAc3VtbWFyeVxuICogU2V0cyBgZ3JlcGAgZmlsdGVyIHVzZWQgdG8gc2VsZWN0IHNwZWNpZmljIHRlc3RzIGZvciBleGVjdXRpb24uXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBJZiBgcmVgIGlzIGEgcmVnZXhwLWxpa2Ugc3RyaW5nLCBpdCB3aWxsIGJlIGNvbnZlcnRlZCB0byByZWdleHAuXG4gKiBUaGUgcmVnZXhwIGlzIHRlc3RlZCBhZ2FpbnN0IHRoZSBmdWxsIHRpdGxlIG9mIGVhY2ggdGVzdCAoaS5lLiwgdGhlXG4gKiBuYW1lIG9mIHRoZSB0ZXN0IHByZWNlZGVkIGJ5IHRpdGxlcyBvZiBlYWNoIGl0cyBhbmNlc3RyYWwgc3VpdGVzKS5cbiAqIEFzIHN1Y2gsIHVzaW5nIGFuIDxlbT5leGFjdC1tYXRjaDwvZW0+IGZpeGVkIHBhdHRlcm4gYWdhaW5zdCB0aGVcbiAqIHRlc3QgbmFtZSBpdHNlbGYgd2lsbCBub3QgeWllbGQgYW55IG1hdGNoZXMuXG4gKiA8YnI+XG4gKiA8c3Ryb25nPlByZXZpb3VzIGZpbHRlciB2YWx1ZSB3aWxsIGJlIG92ZXJ3cml0dGVuIG9uIGVhY2ggY2FsbCE8L3N0cm9uZz5cbiAqXG4gKiBAcHVibGljXG4gKiBAc2VlIFtDTEkgb3B0aW9uXSguLi8jLWdyZXAtcmVnZXhwLWctcmVnZXhwKVxuICogQHNlZSB7QGxpbmsgTW9jaGEjZmdyZXB9XG4gKiBAc2VlIHtAbGluayBNb2NoYSNpbnZlcnR9XG4gKiBAcGFyYW0ge1JlZ0V4cHxTdHJpbmd9IHJlIC0gUmVndWxhciBleHByZXNzaW9uIHVzZWQgdG8gc2VsZWN0IHRlc3RzLlxuICogQHJldHVybiB7TW9jaGF9IHRoaXNcbiAqIEBjaGFpbmFibGVcbiAqIEBleGFtcGxlXG4gKlxuICogLy8gU2VsZWN0IHRlc3RzIHdob3NlIGZ1bGwgdGl0bGUgY29udGFpbnMgYFwibWF0Y2hcImAsIGlnbm9yaW5nIGNhc2VcbiAqIG1vY2hhLmdyZXAoL21hdGNoL2kpO1xuICogQGV4YW1wbGVcbiAqXG4gKiAvLyBTYW1lIGFzIGFib3ZlIGJ1dCB3aXRoIHJlZ2V4cC1saWtlIHN0cmluZyBhcmd1bWVudFxuICogbW9jaGEuZ3JlcCgnL21hdGNoL2knKTtcbiAqIEBleGFtcGxlXG4gKlxuICogLy8gIyMgQW50aS1leGFtcGxlXG4gKiAvLyBHaXZlbiBlbWJlZGRlZCB0ZXN0IGBpdCgnb25seS10aGlzLXRlc3QnKWAuLi5cbiAqIG1vY2hhLmdyZXAoJy9eb25seS10aGlzLXRlc3QkLycpOyAgICAvLyBOTyEgVXNlIGAub25seSgpYCB0byBkbyB0aGlzIVxuICovXG5Nb2NoYS5wcm90b3R5cGUuZ3JlcCA9IGZ1bmN0aW9uIChyZSkge1xuICBpZiAodXRpbHMuaXNTdHJpbmcocmUpKSB7XG4gICAgLy8gZXh0cmFjdCBhcmdzIGlmIGl0J3MgcmVnZXgtbGlrZSwgaS5lOiBbc3RyaW5nLCBwYXR0ZXJuLCBmbGFnXVxuICAgIHZhciBhcmcgPSByZS5tYXRjaCgvXlxcLyguKilcXC8oW2dpbXldezAsNH0pJHwuKi8pO1xuICAgIHRoaXMub3B0aW9ucy5ncmVwID0gbmV3IFJlZ0V4cChhcmdbMV0gfHwgYXJnWzBdLCBhcmdbMl0pO1xuICB9IGVsc2Uge1xuICAgIHRoaXMub3B0aW9ucy5ncmVwID0gcmU7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEludmVydHMgYGdyZXBgIG1hdGNoZXMuXG4gKlxuICogQHB1YmxpY1xuICogQHNlZSB7QGxpbmsgTW9jaGEjZ3JlcH1cbiAqIEByZXR1cm4ge01vY2hhfSB0aGlzXG4gKiBAY2hhaW5hYmxlXG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIFNlbGVjdCB0ZXN0cyB3aG9zZSBmdWxsIHRpdGxlIGRvZXMgKm5vdCogY29udGFpbiBgXCJtYXRjaFwiYCwgaWdub3JpbmcgY2FzZVxuICogbW9jaGEuZ3JlcCgvbWF0Y2gvaSkuaW52ZXJ0KCk7XG4gKi9cbk1vY2hhLnByb3RvdHlwZS5pbnZlcnQgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMub3B0aW9ucy5pbnZlcnQgPSB0cnVlO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogRW5hYmxlcyBvciBkaXNhYmxlcyBjaGVja2luZyBmb3IgZ2xvYmFsIHZhcmlhYmxlcyBsZWFrZWQgd2hpbGUgcnVubmluZyB0ZXN0cy5cbiAqXG4gKiBAcHVibGljXG4gKiBAc2VlIFtDTEkgb3B0aW9uXSguLi8jLWNoZWNrLWxlYWtzKVxuICogQHBhcmFtIHtib29sZWFufSBbY2hlY2tMZWFrcz10cnVlXSAtIFdoZXRoZXIgdG8gY2hlY2sgZm9yIGdsb2JhbCB2YXJpYWJsZSBsZWFrcy5cbiAqIEByZXR1cm4ge01vY2hhfSB0aGlzXG4gKiBAY2hhaW5hYmxlXG4gKi9cbk1vY2hhLnByb3RvdHlwZS5jaGVja0xlYWtzID0gZnVuY3Rpb24gKGNoZWNrTGVha3MpIHtcbiAgdGhpcy5vcHRpb25zLmNoZWNrTGVha3MgPSBjaGVja0xlYWtzICE9PSBmYWxzZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgd2hldGhlciBvciBub3QgdG8gZGlzcG9zZSBhZnRlciBlYWNoIHRlc3QgcnVuLlxuICogRGlzYWJsZSB0aGlzIHRvIGVuc3VyZSB5b3UgY2FuIHJ1biB0aGUgdGVzdCBzdWl0ZSBtdWx0aXBsZSB0aW1lcy5cbiAqIElmIGRpc2FibGVkLCBiZSBzdXJlIHRvIGRpc3Bvc2UgbW9jaGEgd2hlbiB5b3UncmUgZG9uZSB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy5cbiAqIEBwdWJsaWNcbiAqIEBzZWUge0BsaW5rIE1vY2hhI2Rpc3Bvc2V9XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGNsZWFuUmVmZXJlbmNlc0FmdGVyUnVuXG4gKiBAcmV0dXJuIHtNb2NoYX0gdGhpc1xuICogQGNoYWluYWJsZVxuICovXG5Nb2NoYS5wcm90b3R5cGUuY2xlYW5SZWZlcmVuY2VzQWZ0ZXJSdW4gPSBmdW5jdGlvbiAoY2xlYW5SZWZlcmVuY2VzQWZ0ZXJSdW4pIHtcbiAgdGhpcy5fY2xlYW5SZWZlcmVuY2VzQWZ0ZXJSdW4gPSBjbGVhblJlZmVyZW5jZXNBZnRlclJ1biAhPT0gZmFsc2U7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBNYW51YWxseSBkaXNwb3NlIHRoaXMgbW9jaGEgaW5zdGFuY2UuIE1hcmsgdGhpcyBpbnN0YW5jZSBhcyBgZGlzcG9zZWRgIGFuZCB1bmFibGUgdG8gcnVuIG1vcmUgdGVzdHMuXG4gKiBJdCBhbHNvIHJlbW92ZXMgZnVuY3Rpb24gcmVmZXJlbmNlcyB0byB0ZXN0cyBmdW5jdGlvbnMgYW5kIGhvb2tzLCBzbyB2YXJpYWJsZXMgdHJhcHBlZCBpbiBjbG9zdXJlcyBjYW4gYmUgY2xlYW5lZCBieSB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IuXG4gKiBAcHVibGljXG4gKi9cbk1vY2hhLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5fc3RhdGUgPT09IG1vY2hhU3RhdGVzLlJVTk5JTkcpIHtcbiAgICB0aHJvdyBjcmVhdGVNb2NoYUluc3RhbmNlQWxyZWFkeVJ1bm5pbmdFcnJvcihcbiAgICAgICdDYW5ub3QgZGlzcG9zZSB3aGlsZSB0aGUgbW9jaGEgaW5zdGFuY2UgaXMgc3RpbGwgcnVubmluZyB0ZXN0cy4nXG4gICAgKTtcbiAgfVxuICB0aGlzLnVubG9hZEZpbGVzKCk7XG4gIHRoaXMuX3ByZXZpb3VzUnVubmVyICYmIHRoaXMuX3ByZXZpb3VzUnVubmVyLmRpc3Bvc2UoKTtcbiAgdGhpcy5zdWl0ZS5kaXNwb3NlKCk7XG4gIHRoaXMuX3N0YXRlID0gbW9jaGFTdGF0ZXMuRElTUE9TRUQ7XG59O1xuXG4vKipcbiAqIERpc3BsYXlzIGZ1bGwgc3RhY2sgdHJhY2UgdXBvbiB0ZXN0IGZhaWx1cmUuXG4gKlxuICogQHB1YmxpY1xuICogQHNlZSBbQ0xJIG9wdGlvbl0oLi4vIy1mdWxsLXRyYWNlKVxuICogQHBhcmFtIHtib29sZWFufSBbZnVsbFRyYWNlPXRydWVdIC0gV2hldGhlciB0byBwcmludCBmdWxsIHN0YWNrdHJhY2UgdXBvbiBmYWlsdXJlLlxuICogQHJldHVybiB7TW9jaGF9IHRoaXNcbiAqIEBjaGFpbmFibGVcbiAqL1xuTW9jaGEucHJvdG90eXBlLmZ1bGxUcmFjZSA9IGZ1bmN0aW9uIChmdWxsVHJhY2UpIHtcbiAgdGhpcy5vcHRpb25zLmZ1bGxUcmFjZSA9IGZ1bGxUcmFjZSAhPT0gZmFsc2U7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTcGVjaWZpZXMgd2hpdGVsaXN0IG9mIHZhcmlhYmxlIG5hbWVzIHRvIGJlIGV4cGVjdGVkIGluIGdsb2JhbCBzY29wZS5cbiAqXG4gKiBAcHVibGljXG4gKiBAc2VlIFtDTEkgb3B0aW9uXSguLi8jLWdsb2JhbC12YXJpYWJsZS1uYW1lKVxuICogQHNlZSB7QGxpbmsgTW9jaGEjY2hlY2tMZWFrc31cbiAqIEBwYXJhbSB7U3RyaW5nW118U3RyaW5nfSBnbG9iYWwgLSBBY2NlcHRlZCBnbG9iYWwgdmFyaWFibGUgbmFtZShzKS5cbiAqIEByZXR1cm4ge01vY2hhfSB0aGlzXG4gKiBAY2hhaW5hYmxlXG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIFNwZWNpZnkgdmFyaWFibGVzIHRvIGJlIGV4cGVjdGVkIGluIGdsb2JhbCBzY29wZVxuICogbW9jaGEuZ2xvYmFsKFsnalF1ZXJ5JywgJ015TGliJ10pO1xuICovXG5Nb2NoYS5wcm90b3R5cGUuZ2xvYmFsID0gZnVuY3Rpb24gKGdsb2JhbCkge1xuICB0aGlzLm9wdGlvbnMuZ2xvYmFsID0gKHRoaXMub3B0aW9ucy5nbG9iYWwgfHwgW10pXG4gICAgLmNvbmNhdChnbG9iYWwpXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5maWx0ZXIoZnVuY3Rpb24gKGVsdCwgaWR4LCBhcnIpIHtcbiAgICAgIHJldHVybiBhcnIuaW5kZXhPZihlbHQpID09PSBpZHg7XG4gICAgfSk7XG4gIHJldHVybiB0aGlzO1xufTtcbi8vIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgJ2dsb2JhbHMnIGlzIGFuIGFsaWFzIG9mICdnbG9iYWwnXG5Nb2NoYS5wcm90b3R5cGUuZ2xvYmFscyA9IE1vY2hhLnByb3RvdHlwZS5nbG9iYWw7XG5cbi8qKlxuICogRW5hYmxlcyBvciBkaXNhYmxlcyBUVFkgY29sb3Igb3V0cHV0IGJ5IHNjcmVlbi1vcmllbnRlZCByZXBvcnRlcnMuXG4gKlxuICogQHB1YmxpY1xuICogQHNlZSBbQ0xJIG9wdGlvbl0oLi4vIy1jb2xvci1jLWNvbG9ycylcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NvbG9yPXRydWVdIC0gV2hldGhlciB0byBlbmFibGUgY29sb3Igb3V0cHV0LlxuICogQHJldHVybiB7TW9jaGF9IHRoaXNcbiAqIEBjaGFpbmFibGVcbiAqL1xuTW9jaGEucHJvdG90eXBlLmNvbG9yID0gZnVuY3Rpb24gKGNvbG9yKSB7XG4gIHRoaXMub3B0aW9ucy5jb2xvciA9IGNvbG9yICE9PSBmYWxzZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgcmVwb3J0ZXIgdG8gdXNlIGlubGluZSBkaWZmcyAocmF0aGVyIHRoYW4gKy8tKVxuICogaW4gdGVzdCBmYWlsdXJlIG91dHB1dC5cbiAqXG4gKiBAcHVibGljXG4gKiBAc2VlIFtDTEkgb3B0aW9uXSguLi8jLWlubGluZS1kaWZmcylcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lubGluZURpZmZzPXRydWVdIC0gV2hldGhlciB0byB1c2UgaW5saW5lIGRpZmZzLlxuICogQHJldHVybiB7TW9jaGF9IHRoaXNcbiAqIEBjaGFpbmFibGVcbiAqL1xuTW9jaGEucHJvdG90eXBlLmlubGluZURpZmZzID0gZnVuY3Rpb24gKGlubGluZURpZmZzKSB7XG4gIHRoaXMub3B0aW9ucy5pbmxpbmVEaWZmcyA9IGlubGluZURpZmZzICE9PSBmYWxzZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgcmVwb3J0ZXIgdG8gaW5jbHVkZSBkaWZmIGluIHRlc3QgZmFpbHVyZSBvdXRwdXQuXG4gKlxuICogQHB1YmxpY1xuICogQHNlZSBbQ0xJIG9wdGlvbl0oLi4vIy1kaWZmKVxuICogQHBhcmFtIHtib29sZWFufSBbZGlmZj10cnVlXSAtIFdoZXRoZXIgdG8gc2hvdyBkaWZmIG9uIGZhaWx1cmUuXG4gKiBAcmV0dXJuIHtNb2NoYX0gdGhpc1xuICogQGNoYWluYWJsZVxuICovXG5Nb2NoYS5wcm90b3R5cGUuZGlmZiA9IGZ1bmN0aW9uIChkaWZmKSB7XG4gIHRoaXMub3B0aW9ucy5kaWZmID0gZGlmZiAhPT0gZmFsc2U7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBAc3VtbWFyeVxuICogU2V0cyB0aW1lb3V0IHRocmVzaG9sZCB2YWx1ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEEgc3RyaW5nIGFyZ3VtZW50IGNhbiB1c2Ugc2hvcnRoYW5kIChzdWNoIGFzIFwiMnNcIikgYW5kIHdpbGwgYmUgY29udmVydGVkLlxuICogSWYgdGhlIHZhbHVlIGlzIGAwYCwgdGltZW91dHMgd2lsbCBiZSBkaXNhYmxlZC5cbiAqXG4gKiBAcHVibGljXG4gKiBAc2VlIFtDTEkgb3B0aW9uXSguLi8jLXRpbWVvdXQtbXMtdC1tcylcbiAqIEBzZWUgW1RpbWVvdXRzXSguLi8jdGltZW91dHMpXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IG1zZWNzIC0gVGltZW91dCB0aHJlc2hvbGQgdmFsdWUuXG4gKiBAcmV0dXJuIHtNb2NoYX0gdGhpc1xuICogQGNoYWluYWJsZVxuICogQGV4YW1wbGVcbiAqXG4gKiAvLyBTZXRzIHRpbWVvdXQgdG8gb25lIHNlY29uZFxuICogbW9jaGEudGltZW91dCgxMDAwKTtcbiAqIEBleGFtcGxlXG4gKlxuICogLy8gU2FtZSBhcyBhYm92ZSBidXQgdXNpbmcgc3RyaW5nIGFyZ3VtZW50XG4gKiBtb2NoYS50aW1lb3V0KCcxcycpO1xuICovXG5Nb2NoYS5wcm90b3R5cGUudGltZW91dCA9IGZ1bmN0aW9uIChtc2Vjcykge1xuICB0aGlzLnN1aXRlLnRpbWVvdXQobXNlY3MpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0cyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRvIHJldHJ5IGZhaWxlZCB0ZXN0cy5cbiAqXG4gKiBAcHVibGljXG4gKiBAc2VlIFtDTEkgb3B0aW9uXSguLi8jLXJldHJpZXMtbilcbiAqIEBzZWUgW1JldHJ5IFRlc3RzXSguLi8jcmV0cnktdGVzdHMpXG4gKiBAcGFyYW0ge251bWJlcn0gcmV0cnkgLSBOdW1iZXIgb2YgdGltZXMgdG8gcmV0cnkgZmFpbGVkIHRlc3RzLlxuICogQHJldHVybiB7TW9jaGF9IHRoaXNcbiAqIEBjaGFpbmFibGVcbiAqIEBleGFtcGxlXG4gKlxuICogLy8gQWxsb3cgYW55IGZhaWxlZCB0ZXN0IHRvIHJldHJ5IG9uZSBtb3JlIHRpbWVcbiAqIG1vY2hhLnJldHJpZXMoMSk7XG4gKi9cbk1vY2hhLnByb3RvdHlwZS5yZXRyaWVzID0gZnVuY3Rpb24gKHJldHJ5KSB7XG4gIHRoaXMuc3VpdGUucmV0cmllcyhyZXRyeSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXRzIHNsb3duZXNzIHRocmVzaG9sZCB2YWx1ZS5cbiAqXG4gKiBAcHVibGljXG4gKiBAc2VlIFtDTEkgb3B0aW9uXSguLi8jLXNsb3ctbXMtcy1tcylcbiAqIEBwYXJhbSB7bnVtYmVyfSBtc2VjcyAtIFNsb3duZXNzIHRocmVzaG9sZCB2YWx1ZS5cbiAqIEByZXR1cm4ge01vY2hhfSB0aGlzXG4gKiBAY2hhaW5hYmxlXG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIFNldHMgXCJzbG93XCIgdGhyZXNob2xkIHRvIGhhbGYgYSBzZWNvbmRcbiAqIG1vY2hhLnNsb3coNTAwKTtcbiAqIEBleGFtcGxlXG4gKlxuICogLy8gU2FtZSBhcyBhYm92ZSBidXQgdXNpbmcgc3RyaW5nIGFyZ3VtZW50XG4gKiBtb2NoYS5zbG93KCcwLjVzJyk7XG4gKi9cbk1vY2hhLnByb3RvdHlwZS5zbG93ID0gZnVuY3Rpb24gKG1zZWNzKSB7XG4gIHRoaXMuc3VpdGUuc2xvdyhtc2Vjcyk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBGb3JjZXMgYWxsIHRlc3RzIHRvIGVpdGhlciBhY2NlcHQgYSBgZG9uZWAgY2FsbGJhY2sgb3IgcmV0dXJuIGEgcHJvbWlzZS5cbiAqXG4gKiBAcHVibGljXG4gKiBAc2VlIFtDTEkgb3B0aW9uXSguLi8jLWFzeW5jLW9ubHktYSlcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FzeW5jT25seT10cnVlXSAtIFdoZXRoZXIgdG8gZm9yY2UgYGRvbmVgIGNhbGxiYWNrIG9yIHByb21pc2UuXG4gKiBAcmV0dXJuIHtNb2NoYX0gdGhpc1xuICogQGNoYWluYWJsZVxuICovXG5Nb2NoYS5wcm90b3R5cGUuYXN5bmNPbmx5ID0gZnVuY3Rpb24gKGFzeW5jT25seSkge1xuICB0aGlzLm9wdGlvbnMuYXN5bmNPbmx5ID0gYXN5bmNPbmx5ICE9PSBmYWxzZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIERpc2FibGVzIHN5bnRheCBoaWdobGlnaHRpbmcgKGluIGJyb3dzZXIpLlxuICpcbiAqIEBwdWJsaWNcbiAqIEByZXR1cm4ge01vY2hhfSB0aGlzXG4gKiBAY2hhaW5hYmxlXG4gKi9cbk1vY2hhLnByb3RvdHlwZS5ub0hpZ2hsaWdodGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5vcHRpb25zLm5vSGlnaGxpZ2h0aW5nID0gdHJ1ZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdW5jYXVnaHQgZXJyb3JzIHRvIHByb3BhZ2F0ZS5cbiAqXG4gKiBAcHVibGljXG4gKiBAc2VlIFtDTEkgb3B0aW9uXSguLi8jLWFsbG93LXVuY2F1Z2h0KVxuICogQHBhcmFtIHtib29sZWFufSBbYWxsb3dVbmNhdWdodD10cnVlXSAtIFdoZXRoZXIgdG8gcHJvcGFnYXRlIHVuY2F1Z2h0IGVycm9ycy5cbiAqIEByZXR1cm4ge01vY2hhfSB0aGlzXG4gKiBAY2hhaW5hYmxlXG4gKi9cbk1vY2hhLnByb3RvdHlwZS5hbGxvd1VuY2F1Z2h0ID0gZnVuY3Rpb24gKGFsbG93VW5jYXVnaHQpIHtcbiAgdGhpcy5vcHRpb25zLmFsbG93VW5jYXVnaHQgPSBhbGxvd1VuY2F1Z2h0ICE9PSBmYWxzZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEBzdW1tYXJ5XG4gKiBEZWxheXMgcm9vdCBzdWl0ZSBleGVjdXRpb24uXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBVc2VkIHRvIHBlcmZvcm0gYXN5bmMgb3BlcmF0aW9ucyBiZWZvcmUgYW55IHN1aXRlcyBhcmUgcnVuLlxuICpcbiAqIEBwdWJsaWNcbiAqIEBzZWUgW2RlbGF5ZWQgcm9vdCBzdWl0ZV0oLi4vI2RlbGF5ZWQtcm9vdC1zdWl0ZSlcbiAqIEByZXR1cm5zIHtNb2NoYX0gdGhpc1xuICogQGNoYWluYWJsZVxuICovXG5Nb2NoYS5wcm90b3R5cGUuZGVsYXkgPSBmdW5jdGlvbiBkZWxheSgpIHtcbiAgdGhpcy5vcHRpb25zLmRlbGF5ID0gdHJ1ZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgcnVubmluZyB0ZXN0cyBpbiBkcnktcnVuIG1vZGUuXG4gKlxuICogQHB1YmxpY1xuICogQHNlZSBbQ0xJIG9wdGlvbl0oLi4vIy1kcnktcnVuKVxuICogQHBhcmFtIHtib29sZWFufSBbZHJ5UnVuPXRydWVdIC0gV2hldGhlciB0byBhY3RpdmF0ZSBkcnktcnVuIG1vZGUuXG4gKiBAcmV0dXJuIHtNb2NoYX0gdGhpc1xuICogQGNoYWluYWJsZVxuICovXG5Nb2NoYS5wcm90b3R5cGUuZHJ5UnVuID0gZnVuY3Rpb24gKGRyeVJ1bikge1xuICB0aGlzLm9wdGlvbnMuZHJ5UnVuID0gZHJ5UnVuICE9PSBmYWxzZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEZhaWxzIHRlc3QgcnVuIGlmIG5vIHRlc3RzIGVuY291bnRlcmVkIHdpdGggZXhpdC1jb2RlIDEuXG4gKlxuICogQHB1YmxpY1xuICogQHNlZSBbQ0xJIG9wdGlvbl0oLi4vIy1mYWlsLXplcm8pXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmYWlsWmVybz10cnVlXSAtIFdoZXRoZXIgdG8gZmFpbCB0ZXN0IHJ1bi5cbiAqIEByZXR1cm4ge01vY2hhfSB0aGlzXG4gKiBAY2hhaW5hYmxlXG4gKi9cbk1vY2hhLnByb3RvdHlwZS5mYWlsWmVybyA9IGZ1bmN0aW9uIChmYWlsWmVybykge1xuICB0aGlzLm9wdGlvbnMuZmFpbFplcm8gPSBmYWlsWmVybyAhPT0gZmFsc2U7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBGYWlsIHRlc3QgcnVuIGlmIHRlc3RzIHdlcmUgZmFpbGVkLlxuICpcbiAqIEBwdWJsaWNcbiAqIEBzZWUgW0NMSSBvcHRpb25dKC4uLyMtcGFzcy1vbi1mYWlsaW5nLXRlc3Qtc3VpdGUpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwYXNzT25GYWlsaW5nVGVzdFN1aXRlPWZhbHNlXSAtIFdoZXRoZXIgdG8gZmFpbCB0ZXN0IHJ1bi5cbiAqIEByZXR1cm4ge01vY2hhfSB0aGlzXG4gKiBAY2hhaW5hYmxlXG4gKi9cbk1vY2hhLnByb3RvdHlwZS5wYXNzT25GYWlsaW5nVGVzdFN1aXRlID0gZnVuY3Rpb24ocGFzc09uRmFpbGluZ1Rlc3RTdWl0ZSkge1xuICB0aGlzLm9wdGlvbnMucGFzc09uRmFpbGluZ1Rlc3RTdWl0ZSA9IHBhc3NPbkZhaWxpbmdUZXN0U3VpdGUgPT09IHRydWU7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBDYXVzZXMgdGVzdHMgbWFya2VkIGBvbmx5YCB0byBmYWlsIHRoZSBzdWl0ZS5cbiAqXG4gKiBAcHVibGljXG4gKiBAc2VlIFtDTEkgb3B0aW9uXSguLi8jLWZvcmJpZC1vbmx5KVxuICogQHBhcmFtIHtib29sZWFufSBbZm9yYmlkT25seT10cnVlXSAtIFdoZXRoZXIgdGVzdHMgbWFya2VkIGBvbmx5YCBmYWlsIHRoZSBzdWl0ZS5cbiAqIEByZXR1cm5zIHtNb2NoYX0gdGhpc1xuICogQGNoYWluYWJsZVxuICovXG5Nb2NoYS5wcm90b3R5cGUuZm9yYmlkT25seSA9IGZ1bmN0aW9uIChmb3JiaWRPbmx5KSB7XG4gIHRoaXMub3B0aW9ucy5mb3JiaWRPbmx5ID0gZm9yYmlkT25seSAhPT0gZmFsc2U7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBDYXVzZXMgcGVuZGluZyB0ZXN0cyBhbmQgdGVzdHMgbWFya2VkIGBza2lwYCB0byBmYWlsIHRoZSBzdWl0ZS5cbiAqXG4gKiBAcHVibGljXG4gKiBAc2VlIFtDTEkgb3B0aW9uXSguLi8jLWZvcmJpZC1wZW5kaW5nKVxuICogQHBhcmFtIHtib29sZWFufSBbZm9yYmlkUGVuZGluZz10cnVlXSAtIFdoZXRoZXIgcGVuZGluZyB0ZXN0cyBmYWlsIHRoZSBzdWl0ZS5cbiAqIEByZXR1cm5zIHtNb2NoYX0gdGhpc1xuICogQGNoYWluYWJsZVxuICovXG5Nb2NoYS5wcm90b3R5cGUuZm9yYmlkUGVuZGluZyA9IGZ1bmN0aW9uIChmb3JiaWRQZW5kaW5nKSB7XG4gIHRoaXMub3B0aW9ucy5mb3JiaWRQZW5kaW5nID0gZm9yYmlkUGVuZGluZyAhPT0gZmFsc2U7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgbW9jaGEgaXMgaW4gdGhlIHdyb25nIHN0YXRlIHRvIGJlIGFibGUgdG8gdHJhbnNpdGlvbiB0byBhIFwicnVubmluZ1wiIHN0YXRlLlxuICogQHByaXZhdGVcbiAqL1xuTW9jaGEucHJvdG90eXBlLl9ndWFyZFJ1bm5pbmdTdGF0ZVRyYW5zaXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLl9zdGF0ZSA9PT0gbW9jaGFTdGF0ZXMuUlVOTklORykge1xuICAgIHRocm93IGNyZWF0ZU1vY2hhSW5zdGFuY2VBbHJlYWR5UnVubmluZ0Vycm9yKFxuICAgICAgJ01vY2hhIGluc3RhbmNlIGlzIGN1cnJlbnRseSBydW5uaW5nIHRlc3RzLCBjYW5ub3Qgc3RhcnQgYSBuZXh0IHRlc3QgcnVuIHVudGlsIHRoaXMgb25lIGlzIGRvbmUnLFxuICAgICAgdGhpc1xuICAgICk7XG4gIH1cbiAgaWYgKFxuICAgIHRoaXMuX3N0YXRlID09PSBtb2NoYVN0YXRlcy5ESVNQT1NFRCB8fFxuICAgIHRoaXMuX3N0YXRlID09PSBtb2NoYVN0YXRlcy5SRUZFUkVOQ0VTX0NMRUFORURcbiAgKSB7XG4gICAgdGhyb3cgY3JlYXRlTW9jaGFJbnN0YW5jZUFscmVhZHlEaXNwb3NlZEVycm9yKFxuICAgICAgJ01vY2hhIGluc3RhbmNlIGlzIGFscmVhZHkgZGlzcG9zZWQsIGNhbm5vdCBzdGFydCBhIG5ldyB0ZXN0IHJ1bi4gUGxlYXNlIGNyZWF0ZSBhIG5ldyBtb2NoYSBpbnN0YW5jZS4gQmUgc3VyZSB0byBzZXQgZGlzYWJsZSBgY2xlYW5SZWZlcmVuY2VzQWZ0ZXJSdW5gIHdoZW4geW91IHdhbnQgdG8gcmV1c2UgdGhlIHNhbWUgbW9jaGEgaW5zdGFuY2UgZm9yIG11bHRpcGxlIHRlc3QgcnVucy4nLFxuICAgICAgdGhpcy5fY2xlYW5SZWZlcmVuY2VzQWZ0ZXJSdW4sXG4gICAgICB0aGlzXG4gICAgKTtcbiAgfVxufTtcblxuLyoqXG4gKiBNb2NoYSB2ZXJzaW9uIGFzIHNwZWNpZmllZCBieSBcInBhY2thZ2UuanNvblwiLlxuICpcbiAqIEBuYW1lIE1vY2hhI3ZlcnNpb25cbiAqIEB0eXBlIHN0cmluZ1xuICogQHJlYWRvbmx5XG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShNb2NoYS5wcm90b3R5cGUsICd2ZXJzaW9uJywge1xuICB2YWx1ZTogcmVxdWlyZSgnLi4vcGFja2FnZS5qc29uJykudmVyc2lvbixcbiAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IGZhbHNlXG59KTtcblxuLyoqXG4gKiBDYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gdGVzdCBleGVjdXRpb24gaXMgY29tcGxldGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjYWxsYmFjayBEb25lQ0JcbiAqIEBwYXJhbSB7bnVtYmVyfSBmYWlsdXJlcyAtIE51bWJlciBvZiBmYWlsdXJlcyB0aGF0IG9jY3VycmVkLlxuICovXG5cbi8qKlxuICogUnVucyByb290IHN1aXRlIGFuZCBpbnZva2VzIGBmbigpYCB3aGVuIGNvbXBsZXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVG8gcnVuIHRlc3RzIG11bHRpcGxlIHRpbWVzIChvciB0byBydW4gdGVzdHMgaW4gZmlsZXMgdGhhdCBhcmVcbiAqIGFscmVhZHkgaW4gdGhlIGByZXF1aXJlYCBjYWNoZSksIG1ha2Ugc3VyZSB0byBjbGVhciB0aGVtIGZyb21cbiAqIHRoZSBjYWNoZSBmaXJzdCFcbiAqXG4gKiBAcHVibGljXG4gKiBAc2VlIHtAbGluayBNb2NoYSN1bmxvYWRGaWxlc31cbiAqIEBzZWUge0BsaW5rIFJ1bm5lciNydW59XG4gKiBAcGFyYW0ge0RvbmVDQn0gW2ZuXSAtIENhbGxiYWNrIGludm9rZWQgd2hlbiB0ZXN0IGV4ZWN1dGlvbiBjb21wbGV0ZWQuXG4gKiBAcmV0dXJucyB7UnVubmVyfSBydW5uZXIgaW5zdGFuY2VcbiAqIEBleGFtcGxlXG4gKlxuICogLy8gZXhpdCB3aXRoIG5vbi16ZXJvIHN0YXR1cyBpZiB0aGVyZSB3ZXJlIHRlc3QgZmFpbHVyZXNcbiAqIG1vY2hhLnJ1bihmYWlsdXJlcyA9PiBwcm9jZXNzLmV4aXRDb2RlID0gZmFpbHVyZXMgPyAxIDogMCk7XG4gKi9cbk1vY2hhLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoZm4pIHtcbiAgdGhpcy5fZ3VhcmRSdW5uaW5nU3RhdGVUcmFuc2l0aW9uKCk7XG4gIHRoaXMuX3N0YXRlID0gbW9jaGFTdGF0ZXMuUlVOTklORztcbiAgaWYgKHRoaXMuX3ByZXZpb3VzUnVubmVyKSB7XG4gICAgdGhpcy5fcHJldmlvdXNSdW5uZXIuZGlzcG9zZSgpO1xuICAgIHRoaXMuc3VpdGUucmVzZXQoKTtcbiAgfVxuICBpZiAodGhpcy5maWxlcy5sZW5ndGggJiYgIXRoaXMuX2xhenlMb2FkRmlsZXMpIHtcbiAgICB0aGlzLmxvYWRGaWxlcygpO1xuICB9XG4gIHZhciBzdWl0ZSA9IHRoaXMuc3VpdGU7XG4gIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICBvcHRpb25zLmZpbGVzID0gdGhpcy5maWxlcztcbiAgY29uc3QgcnVubmVyID0gbmV3IHRoaXMuX3J1bm5lckNsYXNzKHN1aXRlLCB7XG4gICAgY2xlYW5SZWZlcmVuY2VzQWZ0ZXJSdW46IHRoaXMuX2NsZWFuUmVmZXJlbmNlc0FmdGVyUnVuLFxuICAgIGRlbGF5OiBvcHRpb25zLmRlbGF5LFxuICAgIGRyeVJ1bjogb3B0aW9ucy5kcnlSdW4sXG4gICAgZmFpbFplcm86IG9wdGlvbnMuZmFpbFplcm9cbiAgfSk7XG4gIGNyZWF0ZVN0YXRzQ29sbGVjdG9yKHJ1bm5lcik7XG4gIHZhciByZXBvcnRlciA9IG5ldyB0aGlzLl9yZXBvcnRlcihydW5uZXIsIG9wdGlvbnMpO1xuICBydW5uZXIuY2hlY2tMZWFrcyA9IG9wdGlvbnMuY2hlY2tMZWFrcyA9PT0gdHJ1ZTtcbiAgcnVubmVyLmZ1bGxTdGFja1RyYWNlID0gb3B0aW9ucy5mdWxsVHJhY2U7XG4gIHJ1bm5lci5hc3luY09ubHkgPSBvcHRpb25zLmFzeW5jT25seTtcbiAgcnVubmVyLmFsbG93VW5jYXVnaHQgPSBvcHRpb25zLmFsbG93VW5jYXVnaHQ7XG4gIHJ1bm5lci5mb3JiaWRPbmx5ID0gb3B0aW9ucy5mb3JiaWRPbmx5O1xuICBydW5uZXIuZm9yYmlkUGVuZGluZyA9IG9wdGlvbnMuZm9yYmlkUGVuZGluZztcbiAgaWYgKG9wdGlvbnMuZ3JlcCkge1xuICAgIHJ1bm5lci5ncmVwKG9wdGlvbnMuZ3JlcCwgb3B0aW9ucy5pbnZlcnQpO1xuICB9XG4gIGlmIChvcHRpb25zLmdsb2JhbCkge1xuICAgIHJ1bm5lci5nbG9iYWxzKG9wdGlvbnMuZ2xvYmFsKTtcbiAgfVxuICBpZiAob3B0aW9ucy5jb2xvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZXhwb3J0cy5yZXBvcnRlcnMuQmFzZS51c2VDb2xvcnMgPSBvcHRpb25zLmNvbG9yO1xuICB9XG4gIGV4cG9ydHMucmVwb3J0ZXJzLkJhc2UuaW5saW5lRGlmZnMgPSBvcHRpb25zLmlubGluZURpZmZzO1xuICBleHBvcnRzLnJlcG9ydGVycy5CYXNlLmhpZGVEaWZmID0gIW9wdGlvbnMuZGlmZjtcblxuICBjb25zdCBkb25lID0gZmFpbHVyZXMgPT4ge1xuICAgIHRoaXMuX3ByZXZpb3VzUnVubmVyID0gcnVubmVyO1xuICAgIHRoaXMuX3N0YXRlID0gdGhpcy5fY2xlYW5SZWZlcmVuY2VzQWZ0ZXJSdW5cbiAgICAgID8gbW9jaGFTdGF0ZXMuUkVGRVJFTkNFU19DTEVBTkVEXG4gICAgICA6IG1vY2hhU3RhdGVzLklOSVQ7XG4gICAgZm4gPSBmbiB8fCB1dGlscy5ub29wO1xuICAgIGlmICh0eXBlb2YgcmVwb3J0ZXIuZG9uZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmVwb3J0ZXIuZG9uZShmYWlsdXJlcywgZm4pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmbihmYWlsdXJlcyk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHJ1bkFzeW5jID0gYXN5bmMgcnVubmVyID0+IHtcbiAgICBjb25zdCBjb250ZXh0ID1cbiAgICAgIHRoaXMub3B0aW9ucy5lbmFibGVHbG9iYWxTZXR1cCAmJiB0aGlzLmhhc0dsb2JhbFNldHVwRml4dHVyZXMoKVxuICAgICAgICA/IGF3YWl0IHRoaXMucnVuR2xvYmFsU2V0dXAocnVubmVyKVxuICAgICAgICA6IHt9O1xuICAgIGNvbnN0IGZhaWx1cmVDb3VudCA9IGF3YWl0IHJ1bm5lci5ydW5Bc3luYyh7XG4gICAgICBmaWxlczogdGhpcy5maWxlcyxcbiAgICAgIG9wdGlvbnNcbiAgICB9KTtcbiAgICBpZiAodGhpcy5vcHRpb25zLmVuYWJsZUdsb2JhbFRlYXJkb3duICYmIHRoaXMuaGFzR2xvYmFsVGVhcmRvd25GaXh0dXJlcygpKSB7XG4gICAgICBhd2FpdCB0aGlzLnJ1bkdsb2JhbFRlYXJkb3duKHJ1bm5lciwge2NvbnRleHR9KTtcbiAgICB9XG4gICAgcmV0dXJuIGZhaWx1cmVDb3VudDtcbiAgfTtcblxuICAvLyBubyBcImNhdGNoXCIgaGVyZSBpcyBpbnRlbnRpb25hbC4gZXJyb3JzIGNvbWluZyBvdXQgb2ZcbiAgLy8gUnVubmVyI3J1biBhcmUgY29uc2lkZXJlZCB1bmNhdWdodC91bmhhbmRsZWQgYW5kIGNhdWdodFxuICAvLyBieSB0aGUgYHByb2Nlc3NgIGV2ZW50IGxpc3RlbmVycy5cbiAgLy8gYWxzbzogcmV0dXJuaW5nIGFueXRoaW5nIG90aGVyIHRoYW4gYHJ1bm5lcmAgd291bGQgYmUgYSBicmVha2luZ1xuICAvLyBjaGFuZ2VcbiAgcnVuQXN5bmMocnVubmVyKS50aGVuKGRvbmUpO1xuXG4gIHJldHVybiBydW5uZXI7XG59O1xuXG4vKipcbiAqIEFzc2lnbnMgaG9va3MgdG8gdGhlIHJvb3Qgc3VpdGVcbiAqIEBwYXJhbSB7TW9jaGFSb290SG9va09iamVjdH0gW2hvb2tzXSAtIEhvb2tzIHRvIGFzc2lnbiB0byByb290IHN1aXRlXG4gKiBAY2hhaW5hYmxlXG4gKi9cbk1vY2hhLnByb3RvdHlwZS5yb290SG9va3MgPSBmdW5jdGlvbiByb290SG9va3Moe1xuICBiZWZvcmVBbGwgPSBbXSxcbiAgYmVmb3JlRWFjaCA9IFtdLFxuICBhZnRlckFsbCA9IFtdLFxuICBhZnRlckVhY2ggPSBbXVxufSA9IHt9KSB7XG4gIGJlZm9yZUFsbCA9IHV0aWxzLmNhc3RBcnJheShiZWZvcmVBbGwpO1xuICBiZWZvcmVFYWNoID0gdXRpbHMuY2FzdEFycmF5KGJlZm9yZUVhY2gpO1xuICBhZnRlckFsbCA9IHV0aWxzLmNhc3RBcnJheShhZnRlckFsbCk7XG4gIGFmdGVyRWFjaCA9IHV0aWxzLmNhc3RBcnJheShhZnRlckVhY2gpO1xuICBiZWZvcmVBbGwuZm9yRWFjaChob29rID0+IHtcbiAgICB0aGlzLnN1aXRlLmJlZm9yZUFsbChob29rKTtcbiAgfSk7XG4gIGJlZm9yZUVhY2guZm9yRWFjaChob29rID0+IHtcbiAgICB0aGlzLnN1aXRlLmJlZm9yZUVhY2goaG9vayk7XG4gIH0pO1xuICBhZnRlckFsbC5mb3JFYWNoKGhvb2sgPT4ge1xuICAgIHRoaXMuc3VpdGUuYWZ0ZXJBbGwoaG9vayk7XG4gIH0pO1xuICBhZnRlckVhY2guZm9yRWFjaChob29rID0+IHtcbiAgICB0aGlzLnN1aXRlLmFmdGVyRWFjaChob29rKTtcbiAgfSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBUb2dnbGVzIHBhcmFsbGVsIG1vZGUuXG4gKlxuICogTXVzdCBiZSBydW4gYmVmb3JlIGNhbGxpbmcge0BsaW5rIE1vY2hhI3J1bn0uIENoYW5nZXMgdGhlIGBSdW5uZXJgIGNsYXNzIHRvXG4gKiB1c2U7IGFsc28gZW5hYmxlcyBsYXp5IGZpbGUgbG9hZGluZyBpZiBub3QgYWxyZWFkeSBkb25lIHNvLlxuICpcbiAqIFdhcm5pbmc6IHdoZW4gcGFzc2VkIGBmYWxzZWAgYW5kIGxhenkgbG9hZGluZyBoYXMgYmVlbiBlbmFibGVkIF92aWEgYW55IG1lYW5zXyAoaW5jbHVkaW5nIGNhbGxpbmcgYHBhcmFsbGVsTW9kZSh0cnVlKWApLCB0aGlzIG1ldGhvZCB3aWxsIF9ub3RfIGRpc2FibGUgbGF6eSBsb2FkaW5nLiBMYXp5IGxvYWRpbmcgaXMgYSBwcmVyZXF1aXNpdGUgZm9yIHBhcmFsbGVsXG4gKiBtb2RlLCBidXQgcGFyYWxsZWwgbW9kZSBpcyBfbm90XyBhIHByZXJlcXVpc2l0ZSBmb3IgbGF6eSBsb2FkaW5nIVxuICogQHBhcmFtIHtib29sZWFufSBbZW5hYmxlXSAtIElmIGB0cnVlYCwgZW5hYmxlOyBvdGhlcndpc2UgZGlzYWJsZS5cbiAqIEB0aHJvd3MgSWYgcnVuIGluIGJyb3dzZXJcbiAqIEB0aHJvd3MgSWYgTW9jaGEgbm90IGluIGBJTklUYCBzdGF0ZVxuICogQHJldHVybnMge01vY2hhfVxuICogQGNoYWluYWJsZVxuICogQHB1YmxpY1xuICovXG5Nb2NoYS5wcm90b3R5cGUucGFyYWxsZWxNb2RlID0gZnVuY3Rpb24gcGFyYWxsZWxNb2RlKGVuYWJsZSA9IHRydWUpIHtcbiAgaWYgKHV0aWxzLmlzQnJvd3NlcigpKSB7XG4gICAgdGhyb3cgY3JlYXRlVW5zdXBwb3J0ZWRFcnJvcigncGFyYWxsZWwgbW9kZSBpcyBvbmx5IHN1cHBvcnRlZCBpbiBOb2RlLmpzJyk7XG4gIH1cbiAgY29uc3QgcGFyYWxsZWwgPSBCb29sZWFuKGVuYWJsZSk7XG4gIGlmIChcbiAgICBwYXJhbGxlbCA9PT0gdGhpcy5vcHRpb25zLnBhcmFsbGVsICYmXG4gICAgdGhpcy5fbGF6eUxvYWRGaWxlcyAmJlxuICAgIHRoaXMuX3J1bm5lckNsYXNzICE9PSBleHBvcnRzLlJ1bm5lclxuICApIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBpZiAodGhpcy5fc3RhdGUgIT09IG1vY2hhU3RhdGVzLklOSVQpIHtcbiAgICB0aHJvdyBjcmVhdGVVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgJ2Nhbm5vdCBjaGFuZ2UgcGFyYWxsZWwgbW9kZSBhZnRlciBoYXZpbmcgY2FsbGVkIHJ1bigpJ1xuICAgICk7XG4gIH1cbiAgdGhpcy5vcHRpb25zLnBhcmFsbGVsID0gcGFyYWxsZWw7XG5cbiAgLy8gc3dhcCBSdW5uZXIgY2xhc3NcbiAgdGhpcy5fcnVubmVyQ2xhc3MgPSBwYXJhbGxlbFxuICAgID8gcmVxdWlyZSgnLi9ub2RlanMvcGFyYWxsZWwtYnVmZmVyZWQtcnVubmVyJylcbiAgICA6IGV4cG9ydHMuUnVubmVyO1xuXG4gIC8vIGxhenlMb2FkRmlsZXMgbWF5IGhhdmUgYmVlbiBzZXQgYHRydWVgIG90aGVyd2lzZSAoZm9yIEVTTSBsb2FkaW5nKSxcbiAgLy8gc28ga2VlcCBgdHJ1ZWAgaWYgc28uXG4gIHJldHVybiB0aGlzLmxhenlMb2FkRmlsZXModGhpcy5fbGF6eUxvYWRGaWxlcyB8fCBwYXJhbGxlbCk7XG59O1xuXG4vKipcbiAqIERpc2FibGVzIGltcGxpY2l0IGNhbGwgdG8ge0BsaW5rIE1vY2hhI2xvYWRGaWxlc30gaW4ge0BsaW5rIE1vY2hhI3J1bn0uIFRoaXNcbiAqIHNldHRpbmcgaXMgdXNlZCBieSB3YXRjaCBtb2RlLCBwYXJhbGxlbCBtb2RlLCBhbmQgZm9yIGxvYWRpbmcgRVNNIGZpbGVzLlxuICogQHRvZG8gVGhpcyBzaG91bGQgdGhyb3cgaWYgd2UndmUgYWxyZWFkeSBsb2FkZWQgZmlsZXM7IHN1Y2ggYmVoYXZpb3JcbiAqIG5lY2Vzc2l0YXRlcyBhZGRpbmcgYSBuZXcgc3RhdGUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtlbmFibGVdIC0gSWYgYHRydWVgLCBkaXNhYmxlIGVhZ2VyIGxvYWRpbmcgb2YgZmlsZXMgaW5cbiAqIHtAbGluayBNb2NoYSNydW59XG4gKiBAY2hhaW5hYmxlXG4gKiBAcHVibGljXG4gKi9cbk1vY2hhLnByb3RvdHlwZS5sYXp5TG9hZEZpbGVzID0gZnVuY3Rpb24gbGF6eUxvYWRGaWxlcyhlbmFibGUpIHtcbiAgdGhpcy5fbGF6eUxvYWRGaWxlcyA9IGVuYWJsZSA9PT0gdHJ1ZTtcbiAgZGVidWcoJ3NldCBsYXp5IGxvYWQgdG8gJXMnLCBlbmFibGUpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQ29uZmlndXJlcyBvbmUgb3IgbW9yZSBnbG9iYWwgc2V0dXAgZml4dHVyZXMuXG4gKlxuICogSWYgZ2l2ZW4gbm8gcGFyYW1ldGVycywgX3Vuc2V0c18gYW55IHByZXZpb3VzbHktc2V0IGZpeHR1cmVzLlxuICogQGNoYWluYWJsZVxuICogQHB1YmxpY1xuICogQHBhcmFtIHtNb2NoYUdsb2JhbEZpeHR1cmV8TW9jaGFHbG9iYWxGaXh0dXJlW119IFtzZXR1cEZuc10gLSBHbG9iYWwgc2V0dXAgZml4dHVyZShzKVxuICogQHJldHVybnMge01vY2hhfVxuICovXG5Nb2NoYS5wcm90b3R5cGUuZ2xvYmFsU2V0dXAgPSBmdW5jdGlvbiBnbG9iYWxTZXR1cChzZXR1cEZucyA9IFtdKSB7XG4gIHNldHVwRm5zID0gdXRpbHMuY2FzdEFycmF5KHNldHVwRm5zKTtcbiAgdGhpcy5vcHRpb25zLmdsb2JhbFNldHVwID0gc2V0dXBGbnM7XG4gIGRlYnVnKCdjb25maWd1cmVkICVkIGdsb2JhbCBzZXR1cCBmdW5jdGlvbnMnLCBzZXR1cEZucy5sZW5ndGgpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQ29uZmlndXJlcyBvbmUgb3IgbW9yZSBnbG9iYWwgdGVhcmRvd24gZml4dHVyZXMuXG4gKlxuICogSWYgZ2l2ZW4gbm8gcGFyYW1ldGVycywgX3Vuc2V0c18gYW55IHByZXZpb3VzbHktc2V0IGZpeHR1cmVzLlxuICogQGNoYWluYWJsZVxuICogQHB1YmxpY1xuICogQHBhcmFtIHtNb2NoYUdsb2JhbEZpeHR1cmV8TW9jaGFHbG9iYWxGaXh0dXJlW119IFt0ZWFyZG93bkZuc10gLSBHbG9iYWwgdGVhcmRvd24gZml4dHVyZShzKVxuICogQHJldHVybnMge01vY2hhfVxuICovXG5Nb2NoYS5wcm90b3R5cGUuZ2xvYmFsVGVhcmRvd24gPSBmdW5jdGlvbiBnbG9iYWxUZWFyZG93bih0ZWFyZG93bkZucyA9IFtdKSB7XG4gIHRlYXJkb3duRm5zID0gdXRpbHMuY2FzdEFycmF5KHRlYXJkb3duRm5zKTtcbiAgdGhpcy5vcHRpb25zLmdsb2JhbFRlYXJkb3duID0gdGVhcmRvd25GbnM7XG4gIGRlYnVnKCdjb25maWd1cmVkICVkIGdsb2JhbCB0ZWFyZG93biBmdW5jdGlvbnMnLCB0ZWFyZG93bkZucy5sZW5ndGgpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUnVuIGFueSBnbG9iYWwgc2V0dXAgZml4dHVyZXMgc2VxdWVudGlhbGx5LCBpZiBhbnkuXG4gKlxuICogVGhpcyBpcyBfYXV0b21hdGljYWxseSBjYWxsZWRfIGJ5IHtAbGluayBNb2NoYSNydW59IF91bmxlc3NfIHRoZSBgcnVuR2xvYmFsU2V0dXBgIG9wdGlvbiBpcyBgZmFsc2VgOyBzZWUge0BsaW5rIE1vY2hhI2VuYWJsZUdsb2JhbFNldHVwfS5cbiAqXG4gKiBUaGUgY29udGV4dCBvYmplY3QgdGhpcyBmdW5jdGlvbiByZXNvbHZlcyB3aXRoIHNob3VsZCBiZSBjb25zdW1lZCBieSB7QGxpbmsgTW9jaGEjcnVuR2xvYmFsVGVhcmRvd259LlxuICogQHBhcmFtIHtvYmplY3R9IFtjb250ZXh0XSAtIENvbnRleHQgb2JqZWN0IGlmIGFscmVhZHkgaGF2ZSBvbmVcbiAqIEBwdWJsaWNcbiAqIEByZXR1cm5zIHtQcm9taXNlPG9iamVjdD59IENvbnRleHQgb2JqZWN0XG4gKi9cbk1vY2hhLnByb3RvdHlwZS5ydW5HbG9iYWxTZXR1cCA9IGFzeW5jIGZ1bmN0aW9uIHJ1bkdsb2JhbFNldHVwKGNvbnRleHQgPSB7fSkge1xuICBjb25zdCB7Z2xvYmFsU2V0dXB9ID0gdGhpcy5vcHRpb25zO1xuICBpZiAoZ2xvYmFsU2V0dXAgJiYgZ2xvYmFsU2V0dXAubGVuZ3RoKSB7XG4gICAgZGVidWcoJ3J1bigpOiBnbG9iYWwgc2V0dXAgc3RhcnRpbmcnKTtcbiAgICBhd2FpdCB0aGlzLl9ydW5HbG9iYWxGaXh0dXJlcyhnbG9iYWxTZXR1cCwgY29udGV4dCk7XG4gICAgZGVidWcoJ3J1bigpOiBnbG9iYWwgc2V0dXAgY29tcGxldGUnKTtcbiAgfVxuICByZXR1cm4gY29udGV4dDtcbn07XG5cbi8qKlxuICogUnVuIGFueSBnbG9iYWwgdGVhcmRvd24gZml4dHVyZXMgc2VxdWVudGlhbGx5LCBpZiBhbnkuXG4gKlxuICogVGhpcyBpcyBfYXV0b21hdGljYWxseSBjYWxsZWRfIGJ5IHtAbGluayBNb2NoYSNydW59IF91bmxlc3NfIHRoZSBgcnVuR2xvYmFsVGVhcmRvd25gIG9wdGlvbiBpcyBgZmFsc2VgOyBzZWUge0BsaW5rIE1vY2hhI2VuYWJsZUdsb2JhbFRlYXJkb3dufS5cbiAqXG4gKiBTaG91bGQgYmUgY2FsbGVkIHdpdGggY29udGV4dCBvYmplY3QgcmV0dXJuZWQgYnkge0BsaW5rIE1vY2hhI3J1bkdsb2JhbFNldHVwfSwgaWYgYXBwbGljYWJsZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBbY29udGV4dF0gLSBDb250ZXh0IG9iamVjdCBpZiBhbHJlYWR5IGhhdmUgb25lXG4gKiBAcHVibGljXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxvYmplY3Q+fSBDb250ZXh0IG9iamVjdFxuICovXG5Nb2NoYS5wcm90b3R5cGUucnVuR2xvYmFsVGVhcmRvd24gPSBhc3luYyBmdW5jdGlvbiBydW5HbG9iYWxUZWFyZG93bihcbiAgY29udGV4dCA9IHt9XG4pIHtcbiAgY29uc3Qge2dsb2JhbFRlYXJkb3dufSA9IHRoaXMub3B0aW9ucztcbiAgaWYgKGdsb2JhbFRlYXJkb3duICYmIGdsb2JhbFRlYXJkb3duLmxlbmd0aCkge1xuICAgIGRlYnVnKCdydW4oKTogZ2xvYmFsIHRlYXJkb3duIHN0YXJ0aW5nJyk7XG4gICAgYXdhaXQgdGhpcy5fcnVuR2xvYmFsRml4dHVyZXMoZ2xvYmFsVGVhcmRvd24sIGNvbnRleHQpO1xuICB9XG4gIGRlYnVnKCdydW4oKTogZ2xvYmFsIHRlYXJkb3duIGNvbXBsZXRlJyk7XG4gIHJldHVybiBjb250ZXh0O1xufTtcblxuLyoqXG4gKiBSdW4gZ2xvYmFsIGZpeHR1cmVzIHNlcXVlbnRpYWxseSB3aXRoIGNvbnRleHQgYGNvbnRleHRgXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtNb2NoYUdsb2JhbEZpeHR1cmVbXX0gW2ZpeHR1cmVGbnNdIC0gRml4dHVyZXMgdG8gcnVuXG4gKiBAcGFyYW0ge29iamVjdH0gW2NvbnRleHRdIC0gY29udGV4dCBvYmplY3RcbiAqIEByZXR1cm5zIHtQcm9taXNlPG9iamVjdD59IGNvbnRleHQgb2JqZWN0XG4gKi9cbk1vY2hhLnByb3RvdHlwZS5fcnVuR2xvYmFsRml4dHVyZXMgPSBhc3luYyBmdW5jdGlvbiBfcnVuR2xvYmFsRml4dHVyZXMoXG4gIGZpeHR1cmVGbnMgPSBbXSxcbiAgY29udGV4dCA9IHt9XG4pIHtcbiAgZm9yIGF3YWl0IChjb25zdCBmaXh0dXJlRm4gb2YgZml4dHVyZUZucykge1xuICAgIGF3YWl0IGZpeHR1cmVGbi5jYWxsKGNvbnRleHQpO1xuICB9XG4gIHJldHVybiBjb250ZXh0O1xufTtcblxuLyoqXG4gKiBUb2dnbGUgZXhlY3V0aW9uIG9mIGFueSBnbG9iYWwgc2V0dXAgZml4dHVyZShzKVxuICpcbiAqIEBjaGFpbmFibGVcbiAqIEBwdWJsaWNcbiAqIEBwYXJhbSB7Ym9vbGVhbiB9IFtlbmFibGVkPXRydWVdIC0gSWYgYGZhbHNlYCwgZG8gbm90IHJ1biBnbG9iYWwgc2V0dXAgZml4dHVyZVxuICogQHJldHVybnMge01vY2hhfVxuICovXG5Nb2NoYS5wcm90b3R5cGUuZW5hYmxlR2xvYmFsU2V0dXAgPSBmdW5jdGlvbiBlbmFibGVHbG9iYWxTZXR1cChlbmFibGVkID0gdHJ1ZSkge1xuICB0aGlzLm9wdGlvbnMuZW5hYmxlR2xvYmFsU2V0dXAgPSBCb29sZWFuKGVuYWJsZWQpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogVG9nZ2xlIGV4ZWN1dGlvbiBvZiBhbnkgZ2xvYmFsIHRlYXJkb3duIGZpeHR1cmUocylcbiAqXG4gKiBAY2hhaW5hYmxlXG4gKiBAcHVibGljXG4gKiBAcGFyYW0ge2Jvb2xlYW4gfSBbZW5hYmxlZD10cnVlXSAtIElmIGBmYWxzZWAsIGRvIG5vdCBydW4gZ2xvYmFsIHRlYXJkb3duIGZpeHR1cmVcbiAqIEByZXR1cm5zIHtNb2NoYX1cbiAqL1xuTW9jaGEucHJvdG90eXBlLmVuYWJsZUdsb2JhbFRlYXJkb3duID0gZnVuY3Rpb24gZW5hYmxlR2xvYmFsVGVhcmRvd24oXG4gIGVuYWJsZWQgPSB0cnVlXG4pIHtcbiAgdGhpcy5vcHRpb25zLmVuYWJsZUdsb2JhbFRlYXJkb3duID0gQm9vbGVhbihlbmFibGVkKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIG9uZSBvciBtb3JlIGdsb2JhbCBzZXR1cCBmaXh0dXJlcyBoYXZlIGJlZW4gc3VwcGxpZWQuXG4gKiBAcHVibGljXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTW9jaGEucHJvdG90eXBlLmhhc0dsb2JhbFNldHVwRml4dHVyZXMgPSBmdW5jdGlvbiBoYXNHbG9iYWxTZXR1cEZpeHR1cmVzKCkge1xuICByZXR1cm4gQm9vbGVhbih0aGlzLm9wdGlvbnMuZ2xvYmFsU2V0dXAubGVuZ3RoKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgb25lIG9yIG1vcmUgZ2xvYmFsIHRlYXJkb3duIGZpeHR1cmVzIGhhdmUgYmVlbiBzdXBwbGllZC5cbiAqIEBwdWJsaWNcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5Nb2NoYS5wcm90b3R5cGUuaGFzR2xvYmFsVGVhcmRvd25GaXh0dXJlcyA9XG4gIGZ1bmN0aW9uIGhhc0dsb2JhbFRlYXJkb3duRml4dHVyZXMoKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odGhpcy5vcHRpb25zLmdsb2JhbFRlYXJkb3duLmxlbmd0aCk7XG4gIH07XG5cbi8qKlxuICogQW4gYWx0ZXJuYXRpdmUgd2F5IHRvIGRlZmluZSByb290IGhvb2tzIHRoYXQgd29ya3Mgd2l0aCBwYXJhbGxlbCBydW5zLlxuICogQHR5cGVkZWYge09iamVjdH0gTW9jaGFSb290SG9va09iamVjdFxuICogQHByb3BlcnR5IHtGdW5jdGlvbnxGdW5jdGlvbltdfSBbYmVmb3JlQWxsXSAtIFwiQmVmb3JlIGFsbFwiIGhvb2socylcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb258RnVuY3Rpb25bXX0gW2JlZm9yZUVhY2hdIC0gXCJCZWZvcmUgZWFjaFwiIGhvb2socylcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb258RnVuY3Rpb25bXX0gW2FmdGVyQWxsXSAtIFwiQWZ0ZXIgYWxsXCIgaG9vayhzKVxuICogQHByb3BlcnR5IHtGdW5jdGlvbnxGdW5jdGlvbltdfSBbYWZ0ZXJFYWNoXSAtIFwiQWZ0ZXIgZWFjaFwiIGhvb2socylcbiAqL1xuXG4vKipcbiAqIEFuIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHtAbGluayBNb2NoYVJvb3RIb29rT2JqZWN0fSwgZWl0aGVyIHN5bmMgb3IgYXN5bmMuXG4gICBAY2FsbGJhY2sgTW9jaGFSb290SG9va0Z1bmN0aW9uXG4gKiBAcmV0dXJucyB7TW9jaGFSb290SG9va09iamVjdHxQcm9taXNlPE1vY2hhUm9vdEhvb2tPYmplY3Q+fVxuICovXG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0J3MgaW52b2tlZCBfb25jZV8gd2hpY2ggaXMgZWl0aGVyIHN5bmMgb3IgYXN5bmMuXG4gKiBDYW4gYmUgYSBcInRlYXJkb3duXCIgb3IgXCJzZXR1cFwiLiAgVGhlc2Ugd2lsbCBhbGwgc2hhcmUgdGhlIHNhbWUgY29udGV4dC5cbiAqIEBjYWxsYmFjayBNb2NoYUdsb2JhbEZpeHR1cmVcbiAqIEByZXR1cm5zIHt2b2lkfFByb21pc2U8dm9pZD59XG4gKi9cblxuLyoqXG4gKiBBbiBvYmplY3QgbWFraW5nIHVwIGFsbCBuZWNlc3NhcnkgcGFydHMgb2YgYSBwbHVnaW4gbG9hZGVyIGFuZCBhZ2dyZWdhdG9yXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQbHVnaW5EZWZpbml0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZXhwb3J0TmFtZSAtIE5hbWVkIGV4cG9ydCB0byB1c2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbb3B0aW9uTmFtZV0gLSBPcHRpb24gbmFtZSBmb3IgTW9jaGEgY29uc3RydWN0b3IgKHVzZSBgZXhwb3J0TmFtZWAgaWYgb21pdHRlZClcbiAqIEBwcm9wZXJ0eSB7UGx1Z2luVmFsaWRhdG9yfSBbdmFsaWRhdGVdIC0gVmFsaWRhdG9yIGZ1bmN0aW9uXG4gKiBAcHJvcGVydHkge1BsdWdpbkZpbmFsaXplcn0gW2ZpbmFsaXplXSAtIEZpbmFsaXplci9hZ2dyZWdhdG9yIGZ1bmN0aW9uXG4gKi9cblxuLyoqXG4gKiBBIChzeW5jKSBmdW5jdGlvbiB0byBhc3NlcnQgYSB1c2VyLXN1cHBsaWVkIHBsdWdpbiBpbXBsZW1lbnRhdGlvbiBpcyB2YWxpZC5cbiAqXG4gKiBEZWZpbmVkIGluIGEge0BsaW5rIFBsdWdpbkRlZmluaXRpb259LlxuXG4gKiBAY2FsbGJhY2sgUGx1Z2luVmFsaWRhdG9yXG4gKiBAcGFyYW0geyp9IHZhbHVlIC0gVmFsdWUgdG8gY2hlY2tcbiAqIEB0aGlzIHtQbHVnaW5EZWZpbml0aW9ufVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRvIGZpbmFsaXplIHBsdWdpbnMgaW1wbHMgb2YgYSBwYXJ0aWN1bGFyIGlsa1xuICogQGNhbGxiYWNrIFBsdWdpbkZpbmFsaXplclxuICogQHBhcmFtIHtBcnJheTwqPn0gaW1wbHMgLSBVc2VyLXN1cHBsaWVkIGltcGxlbWVudGF0aW9uc1xuICogQHJldHVybnMge1Byb21pc2U8Kj58Kn1cbiAqL1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyogZXNsaW50IG5vLXVudXNlZC12YXJzOiBvZmYgKi9cbi8qIGVzbGludC1lbnYgY29tbW9uanMgKi9cblxuLyoqXG4gKiBTaGltIHByb2Nlc3Muc3Rkb3V0LlxuICovXG5cbnByb2Nlc3Muc3Rkb3V0ID0gcmVxdWlyZSgnYnJvd3Nlci1zdGRvdXQnKSh7bGFiZWw6IGZhbHNlfSk7XG5cbnZhciBwYXJzZVF1ZXJ5ID0gcmVxdWlyZSgnLi9saWIvYnJvd3Nlci9wYXJzZS1xdWVyeScpO1xudmFyIGhpZ2hsaWdodFRhZ3MgPSByZXF1aXJlKCcuL2xpYi9icm93c2VyL2hpZ2hsaWdodC10YWdzJyk7XG52YXIgTW9jaGEgPSByZXF1aXJlKCcuL2xpYi9tb2NoYScpO1xuXG4vKipcbiAqIENyZWF0ZSBhIE1vY2hhIGluc3RhbmNlLlxuICpcbiAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAqL1xuXG52YXIgbW9jaGEgPSBuZXcgTW9jaGEoe3JlcG9ydGVyOiAnaHRtbCd9KTtcblxuLyoqXG4gKiBTYXZlIHRpbWVyIHJlZmVyZW5jZXMgdG8gYXZvaWQgU2lub24gaW50ZXJmZXJpbmcgKHNlZSBHSC0yMzcpLlxuICovXG5cbnZhciBEYXRlID0gZ2xvYmFsLkRhdGU7XG52YXIgc2V0VGltZW91dCA9IGdsb2JhbC5zZXRUaW1lb3V0O1xudmFyIHNldEludGVydmFsID0gZ2xvYmFsLnNldEludGVydmFsO1xudmFyIGNsZWFyVGltZW91dCA9IGdsb2JhbC5jbGVhclRpbWVvdXQ7XG52YXIgY2xlYXJJbnRlcnZhbCA9IGdsb2JhbC5jbGVhckludGVydmFsO1xuXG52YXIgdW5jYXVnaHRFeGNlcHRpb25IYW5kbGVycyA9IFtdO1xuXG52YXIgb3JpZ2luYWxPbmVycm9ySGFuZGxlciA9IGdsb2JhbC5vbmVycm9yO1xuXG4vKipcbiAqIFJlbW92ZSB1bmNhdWdodEV4Y2VwdGlvbiBsaXN0ZW5lci5cbiAqIFJldmVydCB0byBvcmlnaW5hbCBvbmVycm9yIGhhbmRsZXIgaWYgcHJldmlvdXNseSBkZWZpbmVkLlxuICovXG5cbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbiAoZSwgZm4pIHtcbiAgaWYgKGUgPT09ICd1bmNhdWdodEV4Y2VwdGlvbicpIHtcbiAgICBpZiAob3JpZ2luYWxPbmVycm9ySGFuZGxlcikge1xuICAgICAgZ2xvYmFsLm9uZXJyb3IgPSBvcmlnaW5hbE9uZXJyb3JIYW5kbGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICBnbG9iYWwub25lcnJvciA9IGZ1bmN0aW9uICgpIHt9O1xuICAgIH1cbiAgICB2YXIgaSA9IHVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcnMuaW5kZXhPZihmbik7XG4gICAgaWYgKGkgIT09IC0xKSB7XG4gICAgICB1bmNhdWdodEV4Y2VwdGlvbkhhbmRsZXJzLnNwbGljZShpLCAxKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogSW1wbGVtZW50cyBsaXN0ZW5lckNvdW50IGZvciAndW5jYXVnaHRFeGNlcHRpb24nLlxuICovXG5cbnByb2Nlc3MubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIGlmIChuYW1lID09PSAndW5jYXVnaHRFeGNlcHRpb24nKSB7XG4gICAgcmV0dXJuIHVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcnMubGVuZ3RoO1xuICB9XG4gIHJldHVybiAwO1xufTtcblxuLyoqXG4gKiBJbXBsZW1lbnRzIHVuY2F1Z2h0RXhjZXB0aW9uIGxpc3RlbmVyLlxuICovXG5cbnByb2Nlc3Mub24gPSBmdW5jdGlvbiAoZSwgZm4pIHtcbiAgaWYgKGUgPT09ICd1bmNhdWdodEV4Y2VwdGlvbicpIHtcbiAgICBnbG9iYWwub25lcnJvciA9IGZ1bmN0aW9uIChtc2csIHVybCwgbGluZSwgY29sLCBlcnIpIHtcbiAgICAgIGZuKGVyciB8fCBuZXcgRXJyb3IobXNnICsgJyAoJyArIHVybCArICc6JyArIGxpbmUgKyAnOicgKyBjb2wgKyAnKScpKTtcbiAgICAgIHJldHVybiAhbW9jaGEub3B0aW9ucy5hbGxvd1VuY2F1Z2h0O1xuICAgIH07XG4gICAgdW5jYXVnaHRFeGNlcHRpb25IYW5kbGVycy5wdXNoKGZuKTtcbiAgfVxufTtcblxucHJvY2Vzcy5saXN0ZW5lcnMgPSBmdW5jdGlvbiAoZSkge1xuICBpZiAoZSA9PT0gJ3VuY2F1Z2h0RXhjZXB0aW9uJykge1xuICAgIHJldHVybiB1bmNhdWdodEV4Y2VwdGlvbkhhbmRsZXJzO1xuICB9XG4gIHJldHVybiBbXTtcbn07XG5cbi8vIFRoZSBCREQgVUkgaXMgcmVnaXN0ZXJlZCBieSBkZWZhdWx0LCBidXQgbm8gVUkgd2lsbCBiZSBmdW5jdGlvbmFsIGluIHRoZVxuLy8gYnJvd3NlciB3aXRob3V0IGFuIGV4cGxpY2l0IGNhbGwgdG8gdGhlIG92ZXJyaWRkZW4gYG1vY2hhLnVpYCAoc2VlIGJlbG93KS5cbi8vIEVuc3VyZSB0aGF0IHRoaXMgZGVmYXVsdCBVSSBkb2VzIG5vdCBleHBvc2UgaXRzIG1ldGhvZHMgdG8gdGhlIGdsb2JhbCBzY29wZS5cbm1vY2hhLnN1aXRlLnJlbW92ZUFsbExpc3RlbmVycygncHJlLXJlcXVpcmUnKTtcblxudmFyIGltbWVkaWF0ZVF1ZXVlID0gW107XG52YXIgaW1tZWRpYXRlVGltZW91dDtcblxuZnVuY3Rpb24gdGltZXNsaWNlKCkge1xuICB2YXIgaW1tZWRpYXRlU3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgd2hpbGUgKGltbWVkaWF0ZVF1ZXVlLmxlbmd0aCAmJiBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIGltbWVkaWF0ZVN0YXJ0IDwgMTAwKSB7XG4gICAgaW1tZWRpYXRlUXVldWUuc2hpZnQoKSgpO1xuICB9XG4gIGlmIChpbW1lZGlhdGVRdWV1ZS5sZW5ndGgpIHtcbiAgICBpbW1lZGlhdGVUaW1lb3V0ID0gc2V0VGltZW91dCh0aW1lc2xpY2UsIDApO1xuICB9IGVsc2Uge1xuICAgIGltbWVkaWF0ZVRpbWVvdXQgPSBudWxsO1xuICB9XG59XG5cbi8qKlxuICogSGlnaC1wZXJmb3JtYW5jZSBvdmVycmlkZSBvZiBSdW5uZXIuaW1tZWRpYXRlbHkuXG4gKi9cblxuTW9jaGEuUnVubmVyLmltbWVkaWF0ZWx5ID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gIGltbWVkaWF0ZVF1ZXVlLnB1c2goY2FsbGJhY2spO1xuICBpZiAoIWltbWVkaWF0ZVRpbWVvdXQpIHtcbiAgICBpbW1lZGlhdGVUaW1lb3V0ID0gc2V0VGltZW91dCh0aW1lc2xpY2UsIDApO1xuICB9XG59O1xuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGFsbG93IGFzc2VydGlvbiBsaWJyYXJpZXMgdG8gdGhyb3cgZXJyb3JzIGRpcmVjdGx5IGludG8gbW9jaGEuXG4gKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHJ1bm5pbmcgdGVzdHMgaW4gYSBicm93c2VyIGJlY2F1c2Ugd2luZG93Lm9uZXJyb3Igd2lsbFxuICogb25seSByZWNlaXZlIHRoZSAnbWVzc2FnZScgYXR0cmlidXRlIG9mIHRoZSBFcnJvci5cbiAqL1xubW9jaGEudGhyb3dFcnJvciA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgdW5jYXVnaHRFeGNlcHRpb25IYW5kbGVycy5mb3JFYWNoKGZ1bmN0aW9uIChmbikge1xuICAgIGZuKGVycik7XG4gIH0pO1xuICB0aHJvdyBlcnI7XG59O1xuXG4vKipcbiAqIE92ZXJyaWRlIHVpIHRvIGVuc3VyZSB0aGF0IHRoZSB1aSBmdW5jdGlvbnMgYXJlIGluaXRpYWxpemVkLlxuICogTm9ybWFsbHkgdGhpcyB3b3VsZCBoYXBwZW4gaW4gTW9jaGEucHJvdG90eXBlLmxvYWRGaWxlcy5cbiAqL1xuXG5tb2NoYS51aSA9IGZ1bmN0aW9uICh1aSkge1xuICBNb2NoYS5wcm90b3R5cGUudWkuY2FsbCh0aGlzLCB1aSk7XG4gIHRoaXMuc3VpdGUuZW1pdCgncHJlLXJlcXVpcmUnLCBnbG9iYWwsIG51bGwsIHRoaXMpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0dXAgbW9jaGEgd2l0aCB0aGUgZ2l2ZW4gc2V0dGluZyBvcHRpb25zLlxuICovXG5cbm1vY2hhLnNldHVwID0gZnVuY3Rpb24gKG9wdHMpIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnc3RyaW5nJykge1xuICAgIG9wdHMgPSB7dWk6IG9wdHN9O1xuICB9XG4gIGlmIChvcHRzLmRlbGF5ID09PSB0cnVlKSB7XG4gICAgdGhpcy5kZWxheSgpO1xuICB9XG4gIHZhciBzZWxmID0gdGhpcztcbiAgT2JqZWN0LmtleXMob3B0cylcbiAgICAuZmlsdGVyKGZ1bmN0aW9uIChvcHQpIHtcbiAgICAgIHJldHVybiBvcHQgIT09ICdkZWxheSc7XG4gICAgfSlcbiAgICAuZm9yRWFjaChmdW5jdGlvbiAob3B0KSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9wdHMsIG9wdCkpIHtcbiAgICAgICAgc2VsZltvcHRdKG9wdHNbb3B0XSk7XG4gICAgICB9XG4gICAgfSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBSdW4gbW9jaGEsIHJldHVybmluZyB0aGUgUnVubmVyLlxuICovXG5cbm1vY2hhLnJ1biA9IGZ1bmN0aW9uIChmbikge1xuICB2YXIgb3B0aW9ucyA9IG1vY2hhLm9wdGlvbnM7XG4gIG1vY2hhLmdsb2JhbHMoJ2xvY2F0aW9uJyk7XG5cbiAgdmFyIHF1ZXJ5ID0gcGFyc2VRdWVyeShnbG9iYWwubG9jYXRpb24uc2VhcmNoIHx8ICcnKTtcbiAgaWYgKHF1ZXJ5LmdyZXApIHtcbiAgICBtb2NoYS5ncmVwKHF1ZXJ5LmdyZXApO1xuICB9XG4gIGlmIChxdWVyeS5mZ3JlcCkge1xuICAgIG1vY2hhLmZncmVwKHF1ZXJ5LmZncmVwKTtcbiAgfVxuICBpZiAocXVlcnkuaW52ZXJ0KSB7XG4gICAgbW9jaGEuaW52ZXJ0KCk7XG4gIH1cblxuICByZXR1cm4gTW9jaGEucHJvdG90eXBlLnJ1bi5jYWxsKG1vY2hhLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgLy8gVGhlIERPTSBEb2N1bWVudCBpcyBub3QgYXZhaWxhYmxlIGluIFdlYiBXb3JrZXJzLlxuICAgIHZhciBkb2N1bWVudCA9IGdsb2JhbC5kb2N1bWVudDtcbiAgICBpZiAoXG4gICAgICBkb2N1bWVudCAmJlxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2hhJykgJiZcbiAgICAgIG9wdGlvbnMubm9IaWdobGlnaHRpbmcgIT09IHRydWVcbiAgICApIHtcbiAgICAgIGhpZ2hsaWdodFRhZ3MoJ2NvZGUnKTtcbiAgICB9XG4gICAgaWYgKGZuKSB7XG4gICAgICBmbihlcnIpO1xuICAgIH1cbiAgfSk7XG59O1xuXG4vKipcbiAqIEV4cG9zZSB0aGUgcHJvY2VzcyBzaGltLlxuICogaHR0cHM6Ly9naXRodWIuY29tL21vY2hhanMvbW9jaGEvcHVsbC85MTZcbiAqL1xuXG5Nb2NoYS5wcm9jZXNzID0gcHJvY2VzcztcblxuLyoqXG4gKiBFeHBvc2UgbW9jaGEuXG4gKi9cbmdsb2JhbC5Nb2NoYSA9IE1vY2hhO1xuZ2xvYmFsLm1vY2hhID0gbW9jaGE7XG5cbi8vIGZvciBidW5kbGVyczogZW5hYmxlIGBpbXBvcnQge2Rlc2NyaWJlLCBpdH0gZnJvbSAnbW9jaGEnYFxuLy8gYGJkZGAgaW50ZXJmYWNlIG9ubHlcbi8vIHByZXR0aWVyLWlnbm9yZVxuWyBcbiAgJ2Rlc2NyaWJlJywgJ2NvbnRleHQnLCAnaXQnLCAnc3BlY2lmeScsXG4gICd4ZGVzY3JpYmUnLCAneGNvbnRleHQnLCAneGl0JywgJ3hzcGVjaWZ5JyxcbiAgJ2JlZm9yZScsICdiZWZvcmVFYWNoJywgJ2FmdGVyRWFjaCcsICdhZnRlcidcbl0uZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgbW9jaGFba2V5XSA9IGdsb2JhbFtrZXldO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gbW9jaGE7XG4iLCAiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgJ3VzZSBzdHJpY3QnO1xuXG4vKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG5pZiAoXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0ID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0KG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgICB2YXIgUmVhY3RWZXJzaW9uID0gJzE4LjMuMSc7XG5cbi8vIEFUVEVOVElPTlxuLy8gV2hlbiBhZGRpbmcgbmV3IHN5bWJvbHMgdG8gdGhpcyBmaWxlLFxuLy8gUGxlYXNlIGNvbnNpZGVyIGFsc28gYWRkaW5nIHRvICdyZWFjdC1kZXZ0b29scy1zaGFyZWQvc3JjL2JhY2tlbmQvUmVhY3RTeW1ib2xzJ1xuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50LWxpa2UgdHlwZXMuXG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpO1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucG9ydGFsJyk7XG52YXIgUkVBQ1RfRlJBR01FTlRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmZyYWdtZW50Jyk7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN0cmljdF9tb2RlJyk7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnByb2ZpbGVyJyk7XG52YXIgUkVBQ1RfUFJPVklERVJfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnByb3ZpZGVyJyk7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuY29udGV4dCcpO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZScpO1xudmFyIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlX2xpc3QnKTtcbnZhciBSRUFDVF9NRU1PX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5tZW1vJyk7XG52YXIgUkVBQ1RfTEFaWV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubGF6eScpO1xudmFyIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Qub2Zmc2NyZWVuJyk7XG52YXIgTUFZQkVfSVRFUkFUT1JfU1lNQk9MID0gU3ltYm9sLml0ZXJhdG9yO1xudmFyIEZBVVhfSVRFUkFUT1JfU1lNQk9MID0gJ0BAaXRlcmF0b3InO1xuZnVuY3Rpb24gZ2V0SXRlcmF0b3JGbihtYXliZUl0ZXJhYmxlKSB7XG4gIGlmIChtYXliZUl0ZXJhYmxlID09PSBudWxsIHx8IHR5cGVvZiBtYXliZUl0ZXJhYmxlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIG1heWJlSXRlcmF0b3IgPSBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgJiYgbWF5YmVJdGVyYWJsZVtNQVlCRV9JVEVSQVRPUl9TWU1CT0xdIHx8IG1heWJlSXRlcmFibGVbRkFVWF9JVEVSQVRPUl9TWU1CT0xdO1xuXG4gIGlmICh0eXBlb2YgbWF5YmVJdGVyYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBtYXliZUl0ZXJhdG9yO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogS2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgZGlzcGF0Y2hlci5cbiAqL1xudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIgPSB7XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQHR5cGUge1JlYWN0Q29tcG9uZW50fVxuICAgKi9cbiAgY3VycmVudDogbnVsbFxufTtcblxuLyoqXG4gKiBLZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBiYXRjaCdzIGNvbmZpZ3VyYXRpb24gc3VjaCBhcyBob3cgbG9uZyBhbiB1cGRhdGVcbiAqIHNob3VsZCBzdXNwZW5kIGZvciBpZiBpdCBuZWVkcyB0by5cbiAqL1xudmFyIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnID0ge1xuICB0cmFuc2l0aW9uOiBudWxsXG59O1xuXG52YXIgUmVhY3RDdXJyZW50QWN0UXVldWUgPSB7XG4gIGN1cnJlbnQ6IG51bGwsXG4gIC8vIFVzZWQgdG8gcmVwcm9kdWNlIGJlaGF2aW9yIG9mIGBiYXRjaGVkVXBkYXRlc2AgaW4gbGVnYWN5IG1vZGUuXG4gIGlzQmF0Y2hpbmdMZWdhY3k6IGZhbHNlLFxuICBkaWRTY2hlZHVsZUxlZ2FjeVVwZGF0ZTogZmFsc2Vcbn07XG5cbi8qKlxuICogS2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgb3duZXIuXG4gKlxuICogVGhlIGN1cnJlbnQgb3duZXIgaXMgdGhlIGNvbXBvbmVudCB3aG8gc2hvdWxkIG93biBhbnkgY29tcG9uZW50cyB0aGF0IGFyZVxuICogY3VycmVudGx5IGJlaW5nIGNvbnN0cnVjdGVkLlxuICovXG52YXIgUmVhY3RDdXJyZW50T3duZXIgPSB7XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQHR5cGUge1JlYWN0Q29tcG9uZW50fVxuICAgKi9cbiAgY3VycmVudDogbnVsbFxufTtcblxudmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSB7fTtcbnZhciBjdXJyZW50RXh0cmFTdGFja0ZyYW1lID0gbnVsbDtcbmZ1bmN0aW9uIHNldEV4dHJhU3RhY2tGcmFtZShzdGFjaykge1xuICB7XG4gICAgY3VycmVudEV4dHJhU3RhY2tGcmFtZSA9IHN0YWNrO1xuICB9XG59XG5cbntcbiAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5zZXRFeHRyYVN0YWNrRnJhbWUgPSBmdW5jdGlvbiAoc3RhY2spIHtcbiAgICB7XG4gICAgICBjdXJyZW50RXh0cmFTdGFja0ZyYW1lID0gc3RhY2s7XG4gICAgfVxuICB9OyAvLyBTdGFjayBpbXBsZW1lbnRhdGlvbiBpbmplY3RlZCBieSB0aGUgY3VycmVudCByZW5kZXJlci5cblxuXG4gIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0Q3VycmVudFN0YWNrID0gbnVsbDtcblxuICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldFN0YWNrQWRkZW5kdW0gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHN0YWNrID0gJyc7IC8vIEFkZCBhbiBleHRyYSB0b3AgZnJhbWUgd2hpbGUgYW4gZWxlbWVudCBpcyBiZWluZyB2YWxpZGF0ZWRcblxuICAgIGlmIChjdXJyZW50RXh0cmFTdGFja0ZyYW1lKSB7XG4gICAgICBzdGFjayArPSBjdXJyZW50RXh0cmFTdGFja0ZyYW1lO1xuICAgIH0gLy8gRGVsZWdhdGUgdG8gdGhlIGluamVjdGVkIHJlbmRlcmVyLXNwZWNpZmljIGltcGxlbWVudGF0aW9uXG5cblxuICAgIHZhciBpbXBsID0gUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRDdXJyZW50U3RhY2s7XG5cbiAgICBpZiAoaW1wbCkge1xuICAgICAgc3RhY2sgKz0gaW1wbCgpIHx8ICcnO1xuICAgIH1cblxuICAgIHJldHVybiBzdGFjaztcbiAgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudmFyIGVuYWJsZVNjb3BlQVBJID0gZmFsc2U7IC8vIEV4cGVyaW1lbnRhbCBDcmVhdGUgRXZlbnQgSGFuZGxlIEFQSS5cbnZhciBlbmFibGVDYWNoZUVsZW1lbnQgPSBmYWxzZTtcbnZhciBlbmFibGVUcmFuc2l0aW9uVHJhY2luZyA9IGZhbHNlOyAvLyBObyBrbm93biBidWdzLCBidXQgbmVlZHMgcGVyZm9ybWFuY2UgdGVzdGluZ1xuXG52YXIgZW5hYmxlTGVnYWN5SGlkZGVuID0gZmFsc2U7IC8vIEVuYWJsZXMgdW5zdGFibGVfYXZvaWRUaGlzRmFsbGJhY2sgZmVhdHVyZSBpbiBGaWJlclxuLy8gc3R1ZmYuIEludGVuZGVkIHRvIGVuYWJsZSBSZWFjdCBjb3JlIG1lbWJlcnMgdG8gbW9yZSBlYXNpbHkgZGVidWcgc2NoZWR1bGluZ1xuLy8gaXNzdWVzIGluIERFViBidWlsZHMuXG5cbnZhciBlbmFibGVEZWJ1Z1RyYWNpbmcgPSBmYWxzZTsgLy8gVHJhY2sgd2hpY2ggRmliZXIocykgc2NoZWR1bGUgcmVuZGVyIHdvcmsuXG5cbnZhciBSZWFjdFNoYXJlZEludGVybmFscyA9IHtcbiAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjogUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixcbiAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWc6IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLFxuICBSZWFjdEN1cnJlbnRPd25lcjogUmVhY3RDdXJyZW50T3duZXJcbn07XG5cbntcbiAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG4gIFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEFjdFF1ZXVlID0gUmVhY3RDdXJyZW50QWN0UXVldWU7XG59XG5cbi8vIGJ5IGNhbGxzIHRvIHRoZXNlIG1ldGhvZHMgYnkgYSBCYWJlbCBwbHVnaW4uXG4vL1xuLy8gSW4gUFJPRCAob3IgaW4gcGFja2FnZXMgd2l0aG91dCBhY2Nlc3MgdG8gUmVhY3QgaW50ZXJuYWxzKSxcbi8vIHRoZXkgYXJlIGxlZnQgYXMgdGhleSBhcmUgaW5zdGVhZC5cblxuZnVuY3Rpb24gd2Fybihmb3JtYXQpIHtcbiAge1xuICAgIHtcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG5cbiAgICAgIHByaW50V2FybmluZygnd2FybicsIGZvcm1hdCwgYXJncyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBlcnJvcihmb3JtYXQpIHtcbiAge1xuICAgIHtcbiAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgIGFyZ3NbX2tleTIgLSAxXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICB9XG5cbiAgICAgIHByaW50V2FybmluZygnZXJyb3InLCBmb3JtYXQsIGFyZ3MpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludFdhcm5pbmcobGV2ZWwsIGZvcm1hdCwgYXJncykge1xuICAvLyBXaGVuIGNoYW5naW5nIHRoaXMgbG9naWMsIHlvdSBtaWdodCB3YW50IHRvIGFsc29cbiAgLy8gdXBkYXRlIGNvbnNvbGVXaXRoU3RhY2tEZXYud3d3LmpzIGFzIHdlbGwuXG4gIHtcbiAgICB2YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG4gICAgdmFyIHN0YWNrID0gUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRTdGFja0FkZGVuZHVtKCk7XG5cbiAgICBpZiAoc3RhY2sgIT09ICcnKSB7XG4gICAgICBmb3JtYXQgKz0gJyVzJztcbiAgICAgIGFyZ3MgPSBhcmdzLmNvbmNhdChbc3RhY2tdKTtcbiAgICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuXG5cbiAgICB2YXIgYXJnc1dpdGhGb3JtYXQgPSBhcmdzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIFN0cmluZyhpdGVtKTtcbiAgICB9KTsgLy8gQ2FyZWZ1bDogUk4gY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcmVmaXhcblxuICAgIGFyZ3NXaXRoRm9ybWF0LnVuc2hpZnQoJ1dhcm5pbmc6ICcgKyBmb3JtYXQpOyAvLyBXZSBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBzcHJlYWQgKG9yIC5hcHBseSkgZGlyZWN0bHkgYmVjYXVzZSBpdFxuICAgIC8vIGJyZWFrcyBJRTk6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTM2MTBcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nXG5cbiAgICBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChjb25zb2xlW2xldmVsXSwgY29uc29sZSwgYXJnc1dpdGhGb3JtYXQpO1xuICB9XG59XG5cbnZhciBkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnQgPSB7fTtcblxuZnVuY3Rpb24gd2Fybk5vb3AocHVibGljSW5zdGFuY2UsIGNhbGxlck5hbWUpIHtcbiAge1xuICAgIHZhciBfY29uc3RydWN0b3IgPSBwdWJsaWNJbnN0YW5jZS5jb25zdHJ1Y3RvcjtcbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IF9jb25zdHJ1Y3RvciAmJiAoX2NvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8IF9jb25zdHJ1Y3Rvci5uYW1lKSB8fCAnUmVhY3RDbGFzcyc7XG4gICAgdmFyIHdhcm5pbmdLZXkgPSBjb21wb25lbnROYW1lICsgXCIuXCIgKyBjYWxsZXJOYW1lO1xuXG4gICAgaWYgKGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudFt3YXJuaW5nS2V5XSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGVycm9yKFwiQ2FuJ3QgY2FsbCAlcyBvbiBhIGNvbXBvbmVudCB0aGF0IGlzIG5vdCB5ZXQgbW91bnRlZC4gXCIgKyAnVGhpcyBpcyBhIG5vLW9wLCBidXQgaXQgbWlnaHQgaW5kaWNhdGUgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4gJyArICdJbnN0ZWFkLCBhc3NpZ24gdG8gYHRoaXMuc3RhdGVgIGRpcmVjdGx5IG9yIGRlZmluZSBhIGBzdGF0ZSA9IHt9O2AgJyArICdjbGFzcyBwcm9wZXJ0eSB3aXRoIHRoZSBkZXNpcmVkIHN0YXRlIGluIHRoZSAlcyBjb21wb25lbnQuJywgY2FsbGVyTmFtZSwgY29tcG9uZW50TmFtZSk7XG5cbiAgICBkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnRbd2FybmluZ0tleV0gPSB0cnVlO1xuICB9XG59XG4vKipcbiAqIFRoaXMgaXMgdGhlIGFic3RyYWN0IEFQSSBmb3IgYW4gdXBkYXRlIHF1ZXVlLlxuICovXG5cblxudmFyIFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlID0ge1xuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoaXMgY29tcG9zaXRlIGNvbXBvbmVudCBpcyBtb3VudGVkLlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB3ZSB3YW50IHRvIHRlc3QuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgbW91bnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBmaW5hbFxuICAgKi9cbiAgaXNNb3VudGVkOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEZvcmNlcyBhbiB1cGRhdGUuIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHdpdGhcbiAgICogY2VydGFpbnR5IHRoYXQgd2UgYXJlICoqbm90KiogaW4gYSBET00gdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIFlvdSBtYXkgd2FudCB0byBjYWxsIHRoaXMgd2hlbiB5b3Uga25vdyB0aGF0IHNvbWUgZGVlcGVyIGFzcGVjdCBvZiB0aGVcbiAgICogY29tcG9uZW50J3Mgc3RhdGUgaGFzIGNoYW5nZWQgYnV0IGBzZXRTdGF0ZWAgd2FzIG5vdCBjYWxsZWQuXG4gICAqXG4gICAqIFRoaXMgd2lsbCBub3QgaW52b2tlIGBzaG91bGRDb21wb25lbnRVcGRhdGVgLCBidXQgaXQgd2lsbCBpbnZva2VcbiAgICogYGNvbXBvbmVudFdpbGxVcGRhdGVgIGFuZCBgY29tcG9uZW50RGlkVXBkYXRlYC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgY29tcG9uZW50IGlzIHVwZGF0ZWQuXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gY2FsbGVyTmFtZSBuYW1lIG9mIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGluIHRoZSBwdWJsaWMgQVBJLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVGb3JjZVVwZGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAnZm9yY2VVcGRhdGUnKTtcbiAgfSxcblxuICAvKipcbiAgICogUmVwbGFjZXMgYWxsIG9mIHRoZSBzdGF0ZS4gQWx3YXlzIHVzZSB0aGlzIG9yIGBzZXRTdGF0ZWAgdG8gbXV0YXRlIHN0YXRlLlxuICAgKiBZb3Ugc2hvdWxkIHRyZWF0IGB0aGlzLnN0YXRlYCBhcyBpbW11dGFibGUuXG4gICAqXG4gICAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGB0aGlzLnN0YXRlYCB3aWxsIGJlIGltbWVkaWF0ZWx5IHVwZGF0ZWQsIHNvXG4gICAqIGFjY2Vzc2luZyBgdGhpcy5zdGF0ZWAgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBvbGQgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gY29tcGxldGVTdGF0ZSBOZXh0IHN0YXRlLlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIGNvbXBvbmVudCBpcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0gez9zdHJpbmd9IGNhbGxlck5hbWUgbmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbiBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlUmVwbGFjZVN0YXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIGNvbXBsZXRlU3RhdGUsIGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdyZXBsYWNlU3RhdGUnKTtcbiAgfSxcblxuICAvKipcbiAgICogU2V0cyBhIHN1YnNldCBvZiB0aGUgc3RhdGUuIFRoaXMgb25seSBleGlzdHMgYmVjYXVzZSBfcGVuZGluZ1N0YXRlIGlzXG4gICAqIGludGVybmFsLiBUaGlzIHByb3ZpZGVzIGEgbWVyZ2luZyBzdHJhdGVneSB0aGF0IGlzIG5vdCBhdmFpbGFibGUgdG8gZGVlcFxuICAgKiBwcm9wZXJ0aWVzIHdoaWNoIGlzIGNvbmZ1c2luZy4gVE9ETzogRXhwb3NlIHBlbmRpbmdTdGF0ZSBvciBkb24ndCB1c2UgaXRcbiAgICogZHVyaW5nIHRoZSBtZXJnZS5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwYXJ0aWFsU3RhdGUgTmV4dCBwYXJ0aWFsIHN0YXRlIHRvIGJlIG1lcmdlZCB3aXRoIHN0YXRlLlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIGNvbXBvbmVudCBpcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0gez9zdHJpbmd9IE5hbWUgb2YgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaW4gdGhlIHB1YmxpYyBBUEkuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZVNldFN0YXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgJ3NldFN0YXRlJyk7XG4gIH1cbn07XG5cbnZhciBhc3NpZ24gPSBPYmplY3QuYXNzaWduO1xuXG52YXIgZW1wdHlPYmplY3QgPSB7fTtcblxue1xuICBPYmplY3QuZnJlZXplKGVtcHR5T2JqZWN0KTtcbn1cbi8qKlxuICogQmFzZSBjbGFzcyBoZWxwZXJzIGZvciB0aGUgdXBkYXRpbmcgc3RhdGUgb2YgYSBjb21wb25lbnQuXG4gKi9cblxuXG5mdW5jdGlvbiBDb21wb25lbnQocHJvcHMsIGNvbnRleHQsIHVwZGF0ZXIpIHtcbiAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OyAvLyBJZiBhIGNvbXBvbmVudCBoYXMgc3RyaW5nIHJlZnMsIHdlIHdpbGwgYXNzaWduIGEgZGlmZmVyZW50IG9iamVjdCBsYXRlci5cblxuICB0aGlzLnJlZnMgPSBlbXB0eU9iamVjdDsgLy8gV2UgaW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCB1cGRhdGVyIGJ1dCB0aGUgcmVhbCBvbmUgZ2V0cyBpbmplY3RlZCBieSB0aGVcbiAgLy8gcmVuZGVyZXIuXG5cbiAgdGhpcy51cGRhdGVyID0gdXBkYXRlciB8fCBSZWFjdE5vb3BVcGRhdGVRdWV1ZTtcbn1cblxuQ29tcG9uZW50LnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50ID0ge307XG4vKipcbiAqIFNldHMgYSBzdWJzZXQgb2YgdGhlIHN0YXRlLiBBbHdheXMgdXNlIHRoaXMgdG8gbXV0YXRlXG4gKiBzdGF0ZS4gWW91IHNob3VsZCB0cmVhdCBgdGhpcy5zdGF0ZWAgYXMgaW1tdXRhYmxlLlxuICpcbiAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGB0aGlzLnN0YXRlYCB3aWxsIGJlIGltbWVkaWF0ZWx5IHVwZGF0ZWQsIHNvXG4gKiBhY2Nlc3NpbmcgYHRoaXMuc3RhdGVgIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QgbWF5IHJldHVybiB0aGUgb2xkIHZhbHVlLlxuICpcbiAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGNhbGxzIHRvIGBzZXRTdGF0ZWAgd2lsbCBydW4gc3luY2hyb25vdXNseSxcbiAqIGFzIHRoZXkgbWF5IGV2ZW50dWFsbHkgYmUgYmF0Y2hlZCB0b2dldGhlci4gIFlvdSBjYW4gcHJvdmlkZSBhbiBvcHRpb25hbFxuICogY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIGNhbGwgdG8gc2V0U3RhdGUgaXMgYWN0dWFsbHlcbiAqIGNvbXBsZXRlZC5cbiAqXG4gKiBXaGVuIGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQgdG8gc2V0U3RhdGUsIGl0IHdpbGwgYmUgY2FsbGVkIGF0IHNvbWUgcG9pbnQgaW5cbiAqIHRoZSBmdXR1cmUgKG5vdCBzeW5jaHJvbm91c2x5KS4gSXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgdXAgdG8gZGF0ZVxuICogY29tcG9uZW50IGFyZ3VtZW50cyAoc3RhdGUsIHByb3BzLCBjb250ZXh0KS4gVGhlc2UgdmFsdWVzIGNhbiBiZSBkaWZmZXJlbnRcbiAqIGZyb20gdGhpcy4qIGJlY2F1c2UgeW91ciBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGFmdGVyIHJlY2VpdmVQcm9wcyBidXQgYmVmb3JlXG4gKiBzaG91bGRDb21wb25lbnRVcGRhdGUsIGFuZCB0aGlzIG5ldyBzdGF0ZSwgcHJvcHMsIGFuZCBjb250ZXh0IHdpbGwgbm90IHlldCBiZVxuICogYXNzaWduZWQgdG8gdGhpcy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdHxmdW5jdGlvbn0gcGFydGlhbFN0YXRlIE5leHQgcGFydGlhbCBzdGF0ZSBvciBmdW5jdGlvbiB0b1xuICogICAgICAgIHByb2R1Y2UgbmV4dCBwYXJ0aWFsIHN0YXRlIHRvIGJlIG1lcmdlZCB3aXRoIGN1cnJlbnQgc3RhdGUuXG4gKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIHN0YXRlIGlzIHVwZGF0ZWQuXG4gKiBAZmluYWxcbiAqIEBwcm90ZWN0ZWRcbiAqL1xuXG5Db21wb25lbnQucHJvdG90eXBlLnNldFN0YXRlID0gZnVuY3Rpb24gKHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBwYXJ0aWFsU3RhdGUgIT09ICdvYmplY3QnICYmIHR5cGVvZiBwYXJ0aWFsU3RhdGUgIT09ICdmdW5jdGlvbicgJiYgcGFydGlhbFN0YXRlICE9IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFN0YXRlKC4uLik6IHRha2VzIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMgdG8gdXBkYXRlIG9yIGEgJyArICdmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMuJyk7XG4gIH1cblxuICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZVNldFN0YXRlKHRoaXMsIHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2ssICdzZXRTdGF0ZScpO1xufTtcbi8qKlxuICogRm9yY2VzIGFuIHVwZGF0ZS4gVGhpcyBzaG91bGQgb25seSBiZSBpbnZva2VkIHdoZW4gaXQgaXMga25vd24gd2l0aFxuICogY2VydGFpbnR5IHRoYXQgd2UgYXJlICoqbm90KiogaW4gYSBET00gdHJhbnNhY3Rpb24uXG4gKlxuICogWW91IG1heSB3YW50IHRvIGNhbGwgdGhpcyB3aGVuIHlvdSBrbm93IHRoYXQgc29tZSBkZWVwZXIgYXNwZWN0IG9mIHRoZVxuICogY29tcG9uZW50J3Mgc3RhdGUgaGFzIGNoYW5nZWQgYnV0IGBzZXRTdGF0ZWAgd2FzIG5vdCBjYWxsZWQuXG4gKlxuICogVGhpcyB3aWxsIG5vdCBpbnZva2UgYHNob3VsZENvbXBvbmVudFVwZGF0ZWAsIGJ1dCBpdCB3aWxsIGludm9rZVxuICogYGNvbXBvbmVudFdpbGxVcGRhdGVgIGFuZCBgY29tcG9uZW50RGlkVXBkYXRlYC5cbiAqXG4gKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIHVwZGF0ZSBpcyBjb21wbGV0ZS5cbiAqIEBmaW5hbFxuICogQHByb3RlY3RlZFxuICovXG5cblxuQ29tcG9uZW50LnByb3RvdHlwZS5mb3JjZVVwZGF0ZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZUZvcmNlVXBkYXRlKHRoaXMsIGNhbGxiYWNrLCAnZm9yY2VVcGRhdGUnKTtcbn07XG4vKipcbiAqIERlcHJlY2F0ZWQgQVBJcy4gVGhlc2UgQVBJcyB1c2VkIHRvIGV4aXN0IG9uIGNsYXNzaWMgUmVhY3QgY2xhc3NlcyBidXQgc2luY2VcbiAqIHdlIHdvdWxkIGxpa2UgdG8gZGVwcmVjYXRlIHRoZW0sIHdlJ3JlIG5vdCBnb2luZyB0byBtb3ZlIHRoZW0gb3ZlciB0byB0aGlzXG4gKiBtb2Rlcm4gYmFzZSBjbGFzcy4gSW5zdGVhZCwgd2UgZGVmaW5lIGEgZ2V0dGVyIHRoYXQgd2FybnMgaWYgaXQncyBhY2Nlc3NlZC5cbiAqL1xuXG5cbntcbiAgdmFyIGRlcHJlY2F0ZWRBUElzID0ge1xuICAgIGlzTW91bnRlZDogWydpc01vdW50ZWQnLCAnSW5zdGVhZCwgbWFrZSBzdXJlIHRvIGNsZWFuIHVwIHN1YnNjcmlwdGlvbnMgYW5kIHBlbmRpbmcgcmVxdWVzdHMgaW4gJyArICdjb21wb25lbnRXaWxsVW5tb3VudCB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy4nXSxcbiAgICByZXBsYWNlU3RhdGU6IFsncmVwbGFjZVN0YXRlJywgJ1JlZmFjdG9yIHlvdXIgY29kZSB0byB1c2Ugc2V0U3RhdGUgaW5zdGVhZCAoc2VlICcgKyAnaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8zMjM2KS4nXVxuICB9O1xuXG4gIHZhciBkZWZpbmVEZXByZWNhdGlvbldhcm5pbmcgPSBmdW5jdGlvbiAobWV0aG9kTmFtZSwgaW5mbykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb21wb25lbnQucHJvdG90eXBlLCBtZXRob2ROYW1lLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2FybignJXMoLi4uKSBpcyBkZXByZWNhdGVkIGluIHBsYWluIEphdmFTY3JpcHQgUmVhY3QgY2xhc3Nlcy4gJXMnLCBpbmZvWzBdLCBpbmZvWzFdKTtcblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIGZvciAodmFyIGZuTmFtZSBpbiBkZXByZWNhdGVkQVBJcykge1xuICAgIGlmIChkZXByZWNhdGVkQVBJcy5oYXNPd25Qcm9wZXJ0eShmbk5hbWUpKSB7XG4gICAgICBkZWZpbmVEZXByZWNhdGlvbldhcm5pbmcoZm5OYW1lLCBkZXByZWNhdGVkQVBJc1tmbk5hbWVdKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gQ29tcG9uZW50RHVtbXkoKSB7fVxuXG5Db21wb25lbnREdW1teS5wcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuLyoqXG4gKiBDb252ZW5pZW5jZSBjb21wb25lbnQgd2l0aCBkZWZhdWx0IHNoYWxsb3cgZXF1YWxpdHkgY2hlY2sgZm9yIHNDVS5cbiAqL1xuXG5mdW5jdGlvbiBQdXJlQ29tcG9uZW50KHByb3BzLCBjb250ZXh0LCB1cGRhdGVyKSB7XG4gIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsgLy8gSWYgYSBjb21wb25lbnQgaGFzIHN0cmluZyByZWZzLCB3ZSB3aWxsIGFzc2lnbiBhIGRpZmZlcmVudCBvYmplY3QgbGF0ZXIuXG5cbiAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7XG4gIHRoaXMudXBkYXRlciA9IHVwZGF0ZXIgfHwgUmVhY3ROb29wVXBkYXRlUXVldWU7XG59XG5cbnZhciBwdXJlQ29tcG9uZW50UHJvdG90eXBlID0gUHVyZUNvbXBvbmVudC5wcm90b3R5cGUgPSBuZXcgQ29tcG9uZW50RHVtbXkoKTtcbnB1cmVDb21wb25lbnRQcm90b3R5cGUuY29uc3RydWN0b3IgPSBQdXJlQ29tcG9uZW50OyAvLyBBdm9pZCBhbiBleHRyYSBwcm90b3R5cGUganVtcCBmb3IgdGhlc2UgbWV0aG9kcy5cblxuYXNzaWduKHB1cmVDb21wb25lbnRQcm90b3R5cGUsIENvbXBvbmVudC5wcm90b3R5cGUpO1xucHVyZUNvbXBvbmVudFByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudCA9IHRydWU7XG5cbi8vIGFuIGltbXV0YWJsZSBvYmplY3Qgd2l0aCBhIHNpbmdsZSBtdXRhYmxlIHZhbHVlXG5mdW5jdGlvbiBjcmVhdGVSZWYoKSB7XG4gIHZhciByZWZPYmplY3QgPSB7XG4gICAgY3VycmVudDogbnVsbFxuICB9O1xuXG4gIHtcbiAgICBPYmplY3Quc2VhbChyZWZPYmplY3QpO1xuICB9XG5cbiAgcmV0dXJuIHJlZk9iamVjdDtcbn1cblxudmFyIGlzQXJyYXlJbXBsID0gQXJyYXkuaXNBcnJheTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlZGVjbGFyZVxuXG5mdW5jdGlvbiBpc0FycmF5KGEpIHtcbiAgcmV0dXJuIGlzQXJyYXlJbXBsKGEpO1xufVxuXG4vKlxuICogVGhlIGAnJyArIHZhbHVlYCBwYXR0ZXJuICh1c2VkIGluIGluIHBlcmYtc2Vuc2l0aXZlIGNvZGUpIHRocm93cyBmb3IgU3ltYm9sXG4gKiBhbmQgVGVtcG9yYWwuKiB0eXBlcy4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzIyMDY0LlxuICpcbiAqIFRoZSBmdW5jdGlvbnMgaW4gdGhpcyBtb2R1bGUgd2lsbCB0aHJvdyBhbiBlYXNpZXItdG8tdW5kZXJzdGFuZCxcbiAqIGVhc2llci10by1kZWJ1ZyBleGNlcHRpb24gd2l0aCBhIGNsZWFyIGVycm9ycyBtZXNzYWdlIG1lc3NhZ2UgZXhwbGFpbmluZyB0aGVcbiAqIHByb2JsZW0uIChJbnN0ZWFkIG9mIGEgY29uZnVzaW5nIGV4Y2VwdGlvbiB0aHJvd24gaW5zaWRlIHRoZSBpbXBsZW1lbnRhdGlvblxuICogb2YgdGhlIGB2YWx1ZWAgb2JqZWN0KS5cbiAqL1xuLy8gJEZsb3dGaXhNZSBvbmx5IGNhbGxlZCBpbiBERVYsIHNvIHZvaWQgcmV0dXJuIGlzIG5vdCBwb3NzaWJsZS5cbmZ1bmN0aW9uIHR5cGVOYW1lKHZhbHVlKSB7XG4gIHtcbiAgICAvLyB0b1N0cmluZ1RhZyBpcyBuZWVkZWQgZm9yIG5hbWVzcGFjZWQgdHlwZXMgbGlrZSBUZW1wb3JhbC5JbnN0YW50XG4gICAgdmFyIGhhc1RvU3RyaW5nVGFnID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wudG9TdHJpbmdUYWc7XG4gICAgdmFyIHR5cGUgPSBoYXNUb1N0cmluZ1RhZyAmJiB2YWx1ZVtTeW1ib2wudG9TdHJpbmdUYWddIHx8IHZhbHVlLmNvbnN0cnVjdG9yLm5hbWUgfHwgJ09iamVjdCc7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cbn0gLy8gJEZsb3dGaXhNZSBvbmx5IGNhbGxlZCBpbiBERVYsIHNvIHZvaWQgcmV0dXJuIGlzIG5vdCBwb3NzaWJsZS5cblxuXG5mdW5jdGlvbiB3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkge1xuICB7XG4gICAgdHJ5IHtcbiAgICAgIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICAvLyBJZiB5b3UgZW5kZWQgdXAgaGVyZSBieSBmb2xsb3dpbmcgYW4gZXhjZXB0aW9uIGNhbGwgc3RhY2ssIGhlcmUncyB3aGF0J3NcbiAgLy8gaGFwcGVuZWQ6IHlvdSBzdXBwbGllZCBhbiBvYmplY3Qgb3Igc3ltYm9sIHZhbHVlIHRvIFJlYWN0IChhcyBhIHByb3AsIGtleSxcbiAgLy8gRE9NIGF0dHJpYnV0ZSwgQ1NTIHByb3BlcnR5LCBzdHJpbmcgcmVmLCBldGMuKSBhbmQgd2hlbiBSZWFjdCB0cmllZCB0b1xuICAvLyBjb2VyY2UgaXQgdG8gYSBzdHJpbmcgdXNpbmcgYCcnICsgdmFsdWVgLCBhbiBleGNlcHRpb24gd2FzIHRocm93bi5cbiAgLy9cbiAgLy8gVGhlIG1vc3QgY29tbW9uIHR5cGVzIHRoYXQgd2lsbCBjYXVzZSB0aGlzIGV4Y2VwdGlvbiBhcmUgYFN5bWJvbGAgaW5zdGFuY2VzXG4gIC8vIGFuZCBUZW1wb3JhbCBvYmplY3RzIGxpa2UgYFRlbXBvcmFsLkluc3RhbnRgLiBCdXQgYW55IG9iamVjdCB0aGF0IGhhcyBhXG4gIC8vIGB2YWx1ZU9mYCBvciBgW1N5bWJvbC50b1ByaW1pdGl2ZV1gIG1ldGhvZCB0aGF0IHRocm93cyB3aWxsIGFsc28gY2F1c2UgdGhpc1xuICAvLyBleGNlcHRpb24uIChMaWJyYXJ5IGF1dGhvcnMgZG8gdGhpcyB0byBwcmV2ZW50IHVzZXJzIGZyb20gdXNpbmcgYnVpbHQtaW5cbiAgLy8gbnVtZXJpYyBvcGVyYXRvcnMgbGlrZSBgK2Agb3IgY29tcGFyaXNvbiBvcGVyYXRvcnMgbGlrZSBgPj1gIGJlY2F1c2UgY3VzdG9tXG4gIC8vIG1ldGhvZHMgYXJlIG5lZWRlZCB0byBwZXJmb3JtIGFjY3VyYXRlIGFyaXRobWV0aWMgb3IgY29tcGFyaXNvbi4pXG4gIC8vXG4gIC8vIFRvIGZpeCB0aGUgcHJvYmxlbSwgY29lcmNlIHRoaXMgb2JqZWN0IG9yIHN5bWJvbCB2YWx1ZSB0byBhIHN0cmluZyBiZWZvcmVcbiAgLy8gcGFzc2luZyBpdCB0byBSZWFjdC4gVGhlIG1vc3QgcmVsaWFibGUgd2F5IGlzIHVzdWFsbHkgYFN0cmluZyh2YWx1ZSlgLlxuICAvL1xuICAvLyBUbyBmaW5kIHdoaWNoIHZhbHVlIGlzIHRocm93aW5nLCBjaGVjayB0aGUgYnJvd3NlciBvciBkZWJ1Z2dlciBjb25zb2xlLlxuICAvLyBCZWZvcmUgdGhpcyBleGNlcHRpb24gd2FzIHRocm93biwgdGhlcmUgc2hvdWxkIGJlIGBjb25zb2xlLmVycm9yYCBvdXRwdXRcbiAgLy8gdGhhdCBzaG93cyB0aGUgdHlwZSAoU3ltYm9sLCBUZW1wb3JhbC5QbGFpbkRhdGUsIGV0Yy4pIHRoYXQgY2F1c2VkIHRoZVxuICAvLyBwcm9ibGVtIGFuZCBob3cgdGhhdCB0eXBlIHdhcyB1c2VkOiBrZXksIGF0cnJpYnV0ZSwgaW5wdXQgdmFsdWUgcHJvcCwgZXRjLlxuICAvLyBJbiBtb3N0IGNhc2VzLCB0aGlzIGNvbnNvbGUgb3V0cHV0IGFsc28gc2hvd3MgdGhlIGNvbXBvbmVudCBhbmQgaXRzXG4gIC8vIGFuY2VzdG9yIGNvbXBvbmVudHMgd2hlcmUgdGhlIGV4Y2VwdGlvbiBoYXBwZW5lZC5cbiAgLy9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG4gIHJldHVybiAnJyArIHZhbHVlO1xufVxuZnVuY3Rpb24gY2hlY2tLZXlTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICB7XG4gICAgaWYgKHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ1RoZSBwcm92aWRlZCBrZXkgaXMgYW4gdW5zdXBwb3J0ZWQgdHlwZSAlcy4nICsgJyBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgYmVmb3JlIHVzaW5nIGl0IGhlcmUuJywgdHlwZU5hbWUodmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7IC8vIHRocm93ICh0byBoZWxwIGNhbGxlcnMgZmluZCB0cm91Ymxlc2hvb3RpbmcgY29tbWVudHMpXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFdyYXBwZWROYW1lKG91dGVyVHlwZSwgaW5uZXJUeXBlLCB3cmFwcGVyTmFtZSkge1xuICB2YXIgZGlzcGxheU5hbWUgPSBvdXRlclR5cGUuZGlzcGxheU5hbWU7XG5cbiAgaWYgKGRpc3BsYXlOYW1lKSB7XG4gICAgcmV0dXJuIGRpc3BsYXlOYW1lO1xuICB9XG5cbiAgdmFyIGZ1bmN0aW9uTmFtZSA9IGlubmVyVHlwZS5kaXNwbGF5TmFtZSB8fCBpbm5lclR5cGUubmFtZSB8fCAnJztcbiAgcmV0dXJuIGZ1bmN0aW9uTmFtZSAhPT0gJycgPyB3cmFwcGVyTmFtZSArIFwiKFwiICsgZnVuY3Rpb25OYW1lICsgXCIpXCIgOiB3cmFwcGVyTmFtZTtcbn0gLy8gS2VlcCBpbiBzeW5jIHdpdGggcmVhY3QtcmVjb25jaWxlci9nZXRDb21wb25lbnROYW1lRnJvbUZpYmVyXG5cblxuZnVuY3Rpb24gZ2V0Q29udGV4dE5hbWUodHlwZSkge1xuICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCAnQ29udGV4dCc7XG59IC8vIE5vdGUgdGhhdCB0aGUgcmVjb25jaWxlciBwYWNrYWdlIHNob3VsZCBnZW5lcmFsbHkgcHJlZmVyIHRvIHVzZSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKCkgaW5zdGVhZC5cblxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSkge1xuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgLy8gSG9zdCByb290LCB0ZXh0IG5vZGUgb3IganVzdCBpbnZhbGlkIHR5cGUuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB7XG4gICAgaWYgKHR5cGVvZiB0eXBlLnRhZyA9PT0gJ251bWJlcicpIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCBhbiB1bmV4cGVjdGVkIG9iamVjdCBpbiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoKS4gJyArICdUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8IG51bGw7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICByZXR1cm4gJ0ZyYWdtZW50JztcblxuICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICByZXR1cm4gJ1BvcnRhbCc7XG5cbiAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICByZXR1cm4gJ1Byb2ZpbGVyJztcblxuICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgIHJldHVybiAnU3RyaWN0TW9kZSc7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlJztcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgcmV0dXJuICdTdXNwZW5zZUxpc3QnO1xuXG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUoY29udGV4dCkgKyAnLkNvbnN1bWVyJztcblxuICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICB2YXIgcHJvdmlkZXIgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUocHJvdmlkZXIuX2NvbnRleHQpICsgJy5Qcm92aWRlcic7XG5cbiAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgcmV0dXJuIGdldFdyYXBwZWROYW1lKHR5cGUsIHR5cGUucmVuZGVyLCAnRm9yd2FyZFJlZicpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgdmFyIG91dGVyTmFtZSA9IHR5cGUuZGlzcGxheU5hbWUgfHwgbnVsbDtcblxuICAgICAgICBpZiAob3V0ZXJOYW1lICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIG91dGVyTmFtZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZS50eXBlKSB8fCAnTWVtbyc7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSB0eXBlO1xuICAgICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShpbml0KHBheWxvYWQpKTtcbiAgICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciBSRVNFUlZFRF9QUk9QUyA9IHtcbiAga2V5OiB0cnVlLFxuICByZWY6IHRydWUsXG4gIF9fc2VsZjogdHJ1ZSxcbiAgX19zb3VyY2U6IHRydWVcbn07XG52YXIgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24sIHNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duLCBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzO1xuXG57XG4gIGRpZFdhcm5BYm91dFN0cmluZ1JlZnMgPSB7fTtcbn1cblxuZnVuY3Rpb24gaGFzVmFsaWRSZWYoY29uZmlnKSB7XG4gIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdyZWYnKSkge1xuICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCAncmVmJykuZ2V0O1xuXG4gICAgICBpZiAoZ2V0dGVyICYmIGdldHRlci5pc1JlYWN0V2FybmluZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvbmZpZy5yZWYgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gaGFzVmFsaWRLZXkoY29uZmlnKSB7XG4gIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdrZXknKSkge1xuICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCAna2V5JykuZ2V0O1xuXG4gICAgICBpZiAoZ2V0dGVyICYmIGdldHRlci5pc1JlYWN0V2FybmluZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvbmZpZy5rZXkgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHZhciB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkgPSBmdW5jdGlvbiAoKSB7XG4gICAge1xuICAgICAgaWYgKCFzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93bikge1xuICAgICAgICBzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93biA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJyVzOiBga2V5YCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3NwZWNpYWwtcHJvcHMpJywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkuaXNSZWFjdFdhcm5pbmcgPSB0cnVlO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvcHMsICdrZXknLCB7XG4gICAgZ2V0OiB3YXJuQWJvdXRBY2Nlc3NpbmdLZXksXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkZWZpbmVSZWZQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpIHtcbiAgdmFyIHdhcm5BYm91dEFjY2Vzc2luZ1JlZiA9IGZ1bmN0aW9uICgpIHtcbiAgICB7XG4gICAgICBpZiAoIXNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duKSB7XG4gICAgICAgIHNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignJXM6IGByZWZgIGlzIG5vdCBhIHByb3AuIFRyeWluZyB0byBhY2Nlc3MgaXQgd2lsbCByZXN1bHQgJyArICdpbiBgdW5kZWZpbmVkYCBiZWluZyByZXR1cm5lZC4gSWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBzYW1lICcgKyAndmFsdWUgd2l0aGluIHRoZSBjaGlsZCBjb21wb25lbnQsIHlvdSBzaG91bGQgcGFzcyBpdCBhcyBhIGRpZmZlcmVudCAnICsgJ3Byb3AuIChodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3BlY2lhbC1wcm9wcyknLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHdhcm5BYm91dEFjY2Vzc2luZ1JlZi5pc1JlYWN0V2FybmluZyA9IHRydWU7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgJ3JlZicsIHtcbiAgICBnZXQ6IHdhcm5BYm91dEFjY2Vzc2luZ1JlZixcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHdhcm5JZlN0cmluZ1JlZkNhbm5vdEJlQXV0b0NvbnZlcnRlZChjb25maWcpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgY29uZmlnLnJlZiA9PT0gJ3N0cmluZycgJiYgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCAmJiBjb25maWcuX19zZWxmICYmIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQuc3RhdGVOb2RlICE9PSBjb25maWcuX19zZWxmKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnR5cGUpO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZXJyb3IoJ0NvbXBvbmVudCBcIiVzXCIgY29udGFpbnMgdGhlIHN0cmluZyByZWYgXCIlc1wiLiAnICsgJ1N1cHBvcnQgZm9yIHN0cmluZyByZWZzIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiAnICsgJ1RoaXMgY2FzZSBjYW5ub3QgYmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gYW4gYXJyb3cgZnVuY3Rpb24uICcgKyAnV2UgYXNrIHlvdSB0byBtYW51YWxseSBmaXggdGhpcyBjYXNlIGJ5IHVzaW5nIHVzZVJlZigpIG9yIGNyZWF0ZVJlZigpIGluc3RlYWQuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1zdHJpbmctcmVmJywgY29tcG9uZW50TmFtZSwgY29uZmlnLnJlZik7XG5cbiAgICAgICAgZGlkV2FybkFib3V0U3RyaW5nUmVmc1tjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBSZWFjdCBlbGVtZW50LiBUaGlzIG5vIGxvbmdlciBhZGhlcmVzIHRvXG4gKiB0aGUgY2xhc3MgcGF0dGVybiwgc28gZG8gbm90IHVzZSBuZXcgdG8gY2FsbCBpdC4gQWxzbywgaW5zdGFuY2VvZiBjaGVja1xuICogd2lsbCBub3Qgd29yay4gSW5zdGVhZCB0ZXN0ICQkdHlwZW9mIGZpZWxkIGFnYWluc3QgU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpIHRvIGNoZWNrXG4gKiBpZiBzb21ldGhpbmcgaXMgYSBSZWFjdCBFbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7Kn0gdHlwZVxuICogQHBhcmFtIHsqfSBwcm9wc1xuICogQHBhcmFtIHsqfSBrZXlcbiAqIEBwYXJhbSB7c3RyaW5nfG9iamVjdH0gcmVmXG4gKiBAcGFyYW0geyp9IG93bmVyXG4gKiBAcGFyYW0geyp9IHNlbGYgQSAqdGVtcG9yYXJ5KiBoZWxwZXIgdG8gZGV0ZWN0IHBsYWNlcyB3aGVyZSBgdGhpc2AgaXNcbiAqIGRpZmZlcmVudCBmcm9tIHRoZSBgb3duZXJgIHdoZW4gUmVhY3QuY3JlYXRlRWxlbWVudCBpcyBjYWxsZWQsIHNvIHRoYXQgd2VcbiAqIGNhbiB3YXJuLiBXZSB3YW50IHRvIGdldCByaWQgb2Ygb3duZXIgYW5kIHJlcGxhY2Ugc3RyaW5nIGByZWZgcyB3aXRoIGFycm93XG4gKiBmdW5jdGlvbnMsIGFuZCBhcyBsb25nIGFzIGB0aGlzYCBhbmQgb3duZXIgYXJlIHRoZSBzYW1lLCB0aGVyZSB3aWxsIGJlIG5vXG4gKiBjaGFuZ2UgaW4gYmVoYXZpb3IuXG4gKiBAcGFyYW0geyp9IHNvdXJjZSBBbiBhbm5vdGF0aW9uIG9iamVjdCAoYWRkZWQgYnkgYSB0cmFuc3BpbGVyIG9yIG90aGVyd2lzZSlcbiAqIGluZGljYXRpbmcgZmlsZW5hbWUsIGxpbmUgbnVtYmVyLCBhbmQvb3Igb3RoZXIgaW5mb3JtYXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuXG5cbnZhciBSZWFjdEVsZW1lbnQgPSBmdW5jdGlvbiAodHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgb3duZXIsIHByb3BzKSB7XG4gIHZhciBlbGVtZW50ID0ge1xuICAgIC8vIFRoaXMgdGFnIGFsbG93cyB1cyB0byB1bmlxdWVseSBpZGVudGlmeSB0aGlzIGFzIGEgUmVhY3QgRWxlbWVudFxuICAgICQkdHlwZW9mOiBSRUFDVF9FTEVNRU5UX1RZUEUsXG4gICAgLy8gQnVpbHQtaW4gcHJvcGVydGllcyB0aGF0IGJlbG9uZyBvbiB0aGUgZWxlbWVudFxuICAgIHR5cGU6IHR5cGUsXG4gICAga2V5OiBrZXksXG4gICAgcmVmOiByZWYsXG4gICAgcHJvcHM6IHByb3BzLFxuICAgIC8vIFJlY29yZCB0aGUgY29tcG9uZW50IHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGlzIGVsZW1lbnQuXG4gICAgX293bmVyOiBvd25lclxuICB9O1xuXG4gIHtcbiAgICAvLyBUaGUgdmFsaWRhdGlvbiBmbGFnIGlzIGN1cnJlbnRseSBtdXRhdGl2ZS4gV2UgcHV0IGl0IG9uXG4gICAgLy8gYW4gZXh0ZXJuYWwgYmFja2luZyBzdG9yZSBzbyB0aGF0IHdlIGNhbiBmcmVlemUgdGhlIHdob2xlIG9iamVjdC5cbiAgICAvLyBUaGlzIGNhbiBiZSByZXBsYWNlZCB3aXRoIGEgV2Vha01hcCBvbmNlIHRoZXkgYXJlIGltcGxlbWVudGVkIGluXG4gICAgLy8gY29tbW9ubHkgdXNlZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMuXG4gICAgZWxlbWVudC5fc3RvcmUgPSB7fTsgLy8gVG8gbWFrZSBjb21wYXJpbmcgUmVhY3RFbGVtZW50cyBlYXNpZXIgZm9yIHRlc3RpbmcgcHVycG9zZXMsIHdlIG1ha2VcbiAgICAvLyB0aGUgdmFsaWRhdGlvbiBmbGFnIG5vbi1lbnVtZXJhYmxlICh3aGVyZSBwb3NzaWJsZSwgd2hpY2ggc2hvdWxkXG4gICAgLy8gaW5jbHVkZSBldmVyeSBlbnZpcm9ubWVudCB3ZSBydW4gdGVzdHMgaW4pLCBzbyB0aGUgdGVzdCBmcmFtZXdvcmtcbiAgICAvLyBpZ25vcmVzIGl0LlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQuX3N0b3JlLCAndmFsaWRhdGVkJywge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogZmFsc2VcbiAgICB9KTsgLy8gc2VsZiBhbmQgc291cmNlIGFyZSBERVYgb25seSBwcm9wZXJ0aWVzLlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdfc2VsZicsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBzZWxmXG4gICAgfSk7IC8vIFR3byBlbGVtZW50cyBjcmVhdGVkIGluIHR3byBkaWZmZXJlbnQgcGxhY2VzIHNob3VsZCBiZSBjb25zaWRlcmVkXG4gICAgLy8gZXF1YWwgZm9yIHRlc3RpbmcgcHVycG9zZXMgYW5kIHRoZXJlZm9yZSB3ZSBoaWRlIGl0IGZyb20gZW51bWVyYXRpb24uXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudCwgJ19zb3VyY2UnLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogc291cmNlXG4gICAgfSk7XG5cbiAgICBpZiAoT2JqZWN0LmZyZWV6ZSkge1xuICAgICAgT2JqZWN0LmZyZWV6ZShlbGVtZW50LnByb3BzKTtcbiAgICAgIE9iamVjdC5mcmVlemUoZWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59O1xuLyoqXG4gKiBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyBSZWFjdEVsZW1lbnQgb2YgdGhlIGdpdmVuIHR5cGUuXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI2NyZWF0ZWVsZW1lbnRcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KHR5cGUsIGNvbmZpZywgY2hpbGRyZW4pIHtcbiAgdmFyIHByb3BOYW1lOyAvLyBSZXNlcnZlZCBuYW1lcyBhcmUgZXh0cmFjdGVkXG5cbiAgdmFyIHByb3BzID0ge307XG4gIHZhciBrZXkgPSBudWxsO1xuICB2YXIgcmVmID0gbnVsbDtcbiAgdmFyIHNlbGYgPSBudWxsO1xuICB2YXIgc291cmNlID0gbnVsbDtcblxuICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICBpZiAoaGFzVmFsaWRSZWYoY29uZmlnKSkge1xuICAgICAgcmVmID0gY29uZmlnLnJlZjtcblxuICAgICAge1xuICAgICAgICB3YXJuSWZTdHJpbmdSZWZDYW5ub3RCZUF1dG9Db252ZXJ0ZWQoY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGFzVmFsaWRLZXkoY29uZmlnKSkge1xuICAgICAge1xuICAgICAgICBjaGVja0tleVN0cmluZ0NvZXJjaW9uKGNvbmZpZy5rZXkpO1xuICAgICAgfVxuXG4gICAgICBrZXkgPSAnJyArIGNvbmZpZy5rZXk7XG4gICAgfVxuXG4gICAgc2VsZiA9IGNvbmZpZy5fX3NlbGYgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb25maWcuX19zZWxmO1xuICAgIHNvdXJjZSA9IGNvbmZpZy5fX3NvdXJjZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGNvbmZpZy5fX3NvdXJjZTsgLy8gUmVtYWluaW5nIHByb3BlcnRpZXMgYXJlIGFkZGVkIHRvIGEgbmV3IHByb3BzIG9iamVjdFxuXG4gICAgZm9yIChwcm9wTmFtZSBpbiBjb25maWcpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgcHJvcE5hbWUpICYmICFSRVNFUlZFRF9QUk9QUy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gQ2hpbGRyZW4gY2FuIGJlIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQsIGFuZCB0aG9zZSBhcmUgdHJhbnNmZXJyZWQgb250b1xuICAvLyB0aGUgbmV3bHkgYWxsb2NhdGVkIHByb3BzIG9iamVjdC5cblxuXG4gIHZhciBjaGlsZHJlbkxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggLSAyO1xuXG4gIGlmIChjaGlsZHJlbkxlbmd0aCA9PT0gMSkge1xuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gIH0gZWxzZSBpZiAoY2hpbGRyZW5MZW5ndGggPiAxKSB7XG4gICAgdmFyIGNoaWxkQXJyYXkgPSBBcnJheShjaGlsZHJlbkxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkQXJyYXlbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmIChPYmplY3QuZnJlZXplKSB7XG4gICAgICAgIE9iamVjdC5mcmVlemUoY2hpbGRBcnJheSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZEFycmF5O1xuICB9IC8vIFJlc29sdmUgZGVmYXVsdCBwcm9wc1xuXG5cbiAgaWYgKHR5cGUgJiYgdHlwZS5kZWZhdWx0UHJvcHMpIHtcbiAgICB2YXIgZGVmYXVsdFByb3BzID0gdHlwZS5kZWZhdWx0UHJvcHM7XG5cbiAgICBmb3IgKHByb3BOYW1lIGluIGRlZmF1bHRQcm9wcykge1xuICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAge1xuICAgIGlmIChrZXkgfHwgcmVmKSB7XG4gICAgICB2YXIgZGlzcGxheU5hbWUgPSB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyA/IHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8ICdVbmtub3duJyA6IHR5cGU7XG5cbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlZikge1xuICAgICAgICBkZWZpbmVSZWZQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBSZWFjdEVsZW1lbnQodHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCwgcHJvcHMpO1xufVxuZnVuY3Rpb24gY2xvbmVBbmRSZXBsYWNlS2V5KG9sZEVsZW1lbnQsIG5ld0tleSkge1xuICB2YXIgbmV3RWxlbWVudCA9IFJlYWN0RWxlbWVudChvbGRFbGVtZW50LnR5cGUsIG5ld0tleSwgb2xkRWxlbWVudC5yZWYsIG9sZEVsZW1lbnQuX3NlbGYsIG9sZEVsZW1lbnQuX3NvdXJjZSwgb2xkRWxlbWVudC5fb3duZXIsIG9sZEVsZW1lbnQucHJvcHMpO1xuICByZXR1cm4gbmV3RWxlbWVudDtcbn1cbi8qKlxuICogQ2xvbmUgYW5kIHJldHVybiBhIG5ldyBSZWFjdEVsZW1lbnQgdXNpbmcgZWxlbWVudCBhcyB0aGUgc3RhcnRpbmcgcG9pbnQuXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI2Nsb25lZWxlbWVudFxuICovXG5cbmZ1bmN0aW9uIGNsb25lRWxlbWVudChlbGVtZW50LCBjb25maWcsIGNoaWxkcmVuKSB7XG4gIGlmIChlbGVtZW50ID09PSBudWxsIHx8IGVsZW1lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlJlYWN0LmNsb25lRWxlbWVudCguLi4pOiBUaGUgYXJndW1lbnQgbXVzdCBiZSBhIFJlYWN0IGVsZW1lbnQsIGJ1dCB5b3UgcGFzc2VkIFwiICsgZWxlbWVudCArIFwiLlwiKTtcbiAgfVxuXG4gIHZhciBwcm9wTmFtZTsgLy8gT3JpZ2luYWwgcHJvcHMgYXJlIGNvcGllZFxuXG4gIHZhciBwcm9wcyA9IGFzc2lnbih7fSwgZWxlbWVudC5wcm9wcyk7IC8vIFJlc2VydmVkIG5hbWVzIGFyZSBleHRyYWN0ZWRcblxuICB2YXIga2V5ID0gZWxlbWVudC5rZXk7XG4gIHZhciByZWYgPSBlbGVtZW50LnJlZjsgLy8gU2VsZiBpcyBwcmVzZXJ2ZWQgc2luY2UgdGhlIG93bmVyIGlzIHByZXNlcnZlZC5cblxuICB2YXIgc2VsZiA9IGVsZW1lbnQuX3NlbGY7IC8vIFNvdXJjZSBpcyBwcmVzZXJ2ZWQgc2luY2UgY2xvbmVFbGVtZW50IGlzIHVubGlrZWx5IHRvIGJlIHRhcmdldGVkIGJ5IGFcbiAgLy8gdHJhbnNwaWxlciwgYW5kIHRoZSBvcmlnaW5hbCBzb3VyY2UgaXMgcHJvYmFibHkgYSBiZXR0ZXIgaW5kaWNhdG9yIG9mIHRoZVxuICAvLyB0cnVlIG93bmVyLlxuXG4gIHZhciBzb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7IC8vIE93bmVyIHdpbGwgYmUgcHJlc2VydmVkLCB1bmxlc3MgcmVmIGlzIG92ZXJyaWRkZW5cblxuICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcblxuICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICBpZiAoaGFzVmFsaWRSZWYoY29uZmlnKSkge1xuICAgICAgLy8gU2lsZW50bHkgc3RlYWwgdGhlIHJlZiBmcm9tIHRoZSBwYXJlbnQuXG4gICAgICByZWYgPSBjb25maWcucmVmO1xuICAgICAgb3duZXIgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50O1xuICAgIH1cblxuICAgIGlmIChoYXNWYWxpZEtleShjb25maWcpKSB7XG4gICAgICB7XG4gICAgICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24oY29uZmlnLmtleSk7XG4gICAgICB9XG5cbiAgICAgIGtleSA9ICcnICsgY29uZmlnLmtleTtcbiAgICB9IC8vIFJlbWFpbmluZyBwcm9wZXJ0aWVzIG92ZXJyaWRlIGV4aXN0aW5nIHByb3BzXG5cblxuICAgIHZhciBkZWZhdWx0UHJvcHM7XG5cbiAgICBpZiAoZWxlbWVudC50eXBlICYmIGVsZW1lbnQudHlwZS5kZWZhdWx0UHJvcHMpIHtcbiAgICAgIGRlZmF1bHRQcm9wcyA9IGVsZW1lbnQudHlwZS5kZWZhdWx0UHJvcHM7XG4gICAgfVxuXG4gICAgZm9yIChwcm9wTmFtZSBpbiBjb25maWcpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgcHJvcE5hbWUpICYmICFSRVNFUlZFRF9QUk9QUy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgaWYgKGNvbmZpZ1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCAmJiBkZWZhdWx0UHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIFJlc29sdmUgZGVmYXVsdCBwcm9wc1xuICAgICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSAvLyBDaGlsZHJlbiBjYW4gYmUgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCwgYW5kIHRob3NlIGFyZSB0cmFuc2ZlcnJlZCBvbnRvXG4gIC8vIHRoZSBuZXdseSBhbGxvY2F0ZWQgcHJvcHMgb2JqZWN0LlxuXG5cbiAgdmFyIGNoaWxkcmVuTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCAtIDI7XG5cbiAgaWYgKGNoaWxkcmVuTGVuZ3RoID09PSAxKSB7XG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgfSBlbHNlIGlmIChjaGlsZHJlbkxlbmd0aCA+IDEpIHtcbiAgICB2YXIgY2hpbGRBcnJheSA9IEFycmF5KGNoaWxkcmVuTGVuZ3RoKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW5MZW5ndGg7IGkrKykge1xuICAgICAgY2hpbGRBcnJheVtpXSA9IGFyZ3VtZW50c1tpICsgMl07XG4gICAgfVxuXG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZEFycmF5O1xuICB9XG5cbiAgcmV0dXJuIFJlYWN0RWxlbWVudChlbGVtZW50LnR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIG93bmVyLCBwcm9wcyk7XG59XG4vKipcbiAqIFZlcmlmaWVzIHRoZSBvYmplY3QgaXMgYSBSZWFjdEVsZW1lbnQuXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI2lzdmFsaWRlbGVtZW50XG4gKiBAcGFyYW0gez9vYmplY3R9IG9iamVjdFxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBgb2JqZWN0YCBpcyBhIFJlYWN0RWxlbWVudC5cbiAqIEBmaW5hbFxuICovXG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50KG9iamVjdCkge1xuICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsICYmIG9iamVjdC4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xufVxuXG52YXIgU0VQQVJBVE9SID0gJy4nO1xudmFyIFNVQlNFUEFSQVRPUiA9ICc6Jztcbi8qKlxuICogRXNjYXBlIGFuZCB3cmFwIGtleSBzbyBpdCBpcyBzYWZlIHRvIHVzZSBhcyBhIHJlYWN0aWRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IHRvIGJlIGVzY2FwZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSBlc2NhcGVkIGtleS5cbiAqL1xuXG5mdW5jdGlvbiBlc2NhcGUoa2V5KSB7XG4gIHZhciBlc2NhcGVSZWdleCA9IC9bPTpdL2c7XG4gIHZhciBlc2NhcGVyTG9va3VwID0ge1xuICAgICc9JzogJz0wJyxcbiAgICAnOic6ICc9MidcbiAgfTtcbiAgdmFyIGVzY2FwZWRTdHJpbmcgPSBrZXkucmVwbGFjZShlc2NhcGVSZWdleCwgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgcmV0dXJuIGVzY2FwZXJMb29rdXBbbWF0Y2hdO1xuICB9KTtcbiAgcmV0dXJuICckJyArIGVzY2FwZWRTdHJpbmc7XG59XG4vKipcbiAqIFRPRE86IFRlc3QgdGhhdCBhIHNpbmdsZSBjaGlsZCBhbmQgYW4gYXJyYXkgd2l0aCBvbmUgaXRlbSBoYXZlIHRoZSBzYW1lIGtleVxuICogcGF0dGVybi5cbiAqL1xuXG5cbnZhciBkaWRXYXJuQWJvdXRNYXBzID0gZmFsc2U7XG52YXIgdXNlclByb3ZpZGVkS2V5RXNjYXBlUmVnZXggPSAvXFwvKy9nO1xuXG5mdW5jdGlvbiBlc2NhcGVVc2VyUHJvdmlkZWRLZXkodGV4dCkge1xuICByZXR1cm4gdGV4dC5yZXBsYWNlKHVzZXJQcm92aWRlZEtleUVzY2FwZVJlZ2V4LCAnJCYvJyk7XG59XG4vKipcbiAqIEdlbmVyYXRlIGEga2V5IHN0cmluZyB0aGF0IGlkZW50aWZpZXMgYSBlbGVtZW50IHdpdGhpbiBhIHNldC5cbiAqXG4gKiBAcGFyYW0geyp9IGVsZW1lbnQgQSBlbGVtZW50IHRoYXQgY291bGQgY29udGFpbiBhIG1hbnVhbCBrZXkuXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXggSW5kZXggdGhhdCBpcyB1c2VkIGlmIGEgbWFudWFsIGtleSBpcyBub3QgcHJvdmlkZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cblxuXG5mdW5jdGlvbiBnZXRFbGVtZW50S2V5KGVsZW1lbnQsIGluZGV4KSB7XG4gIC8vIERvIHNvbWUgdHlwZWNoZWNraW5nIGhlcmUgc2luY2Ugd2UgY2FsbCB0aGlzIGJsaW5kbHkuIFdlIHdhbnQgdG8gZW5zdXJlXG4gIC8vIHRoYXQgd2UgZG9uJ3QgYmxvY2sgcG90ZW50aWFsIGZ1dHVyZSBFUyBBUElzLlxuICBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdvYmplY3QnICYmIGVsZW1lbnQgIT09IG51bGwgJiYgZWxlbWVudC5rZXkgIT0gbnVsbCkge1xuICAgIC8vIEV4cGxpY2l0IGtleVxuICAgIHtcbiAgICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24oZWxlbWVudC5rZXkpO1xuICAgIH1cblxuICAgIHJldHVybiBlc2NhcGUoJycgKyBlbGVtZW50LmtleSk7XG4gIH0gLy8gSW1wbGljaXQga2V5IGRldGVybWluZWQgYnkgdGhlIGluZGV4IGluIHRoZSBzZXRcblxuXG4gIHJldHVybiBpbmRleC50b1N0cmluZygzNik7XG59XG5cbmZ1bmN0aW9uIG1hcEludG9BcnJheShjaGlsZHJlbiwgYXJyYXksIGVzY2FwZWRQcmVmaXgsIG5hbWVTb0ZhciwgY2FsbGJhY2spIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgY2hpbGRyZW47XG5cbiAgaWYgKHR5cGUgPT09ICd1bmRlZmluZWQnIHx8IHR5cGUgPT09ICdib29sZWFuJykge1xuICAgIC8vIEFsbCBvZiB0aGUgYWJvdmUgYXJlIHBlcmNlaXZlZCBhcyBudWxsLlxuICAgIGNoaWxkcmVuID0gbnVsbDtcbiAgfVxuXG4gIHZhciBpbnZva2VDYWxsYmFjayA9IGZhbHNlO1xuXG4gIGlmIChjaGlsZHJlbiA9PT0gbnVsbCkge1xuICAgIGludm9rZUNhbGxiYWNrID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICBpbnZva2VDYWxsYmFjayA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICBzd2l0Y2ggKGNoaWxkcmVuLiQkdHlwZW9mKSB7XG4gICAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICAgIGludm9rZUNhbGxiYWNrID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgfVxuICB9XG5cbiAgaWYgKGludm9rZUNhbGxiYWNrKSB7XG4gICAgdmFyIF9jaGlsZCA9IGNoaWxkcmVuO1xuICAgIHZhciBtYXBwZWRDaGlsZCA9IGNhbGxiYWNrKF9jaGlsZCk7IC8vIElmIGl0J3MgdGhlIG9ubHkgY2hpbGQsIHRyZWF0IHRoZSBuYW1lIGFzIGlmIGl0IHdhcyB3cmFwcGVkIGluIGFuIGFycmF5XG4gICAgLy8gc28gdGhhdCBpdCdzIGNvbnNpc3RlbnQgaWYgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBncm93czpcblxuICAgIHZhciBjaGlsZEtleSA9IG5hbWVTb0ZhciA9PT0gJycgPyBTRVBBUkFUT1IgKyBnZXRFbGVtZW50S2V5KF9jaGlsZCwgMCkgOiBuYW1lU29GYXI7XG5cbiAgICBpZiAoaXNBcnJheShtYXBwZWRDaGlsZCkpIHtcbiAgICAgIHZhciBlc2NhcGVkQ2hpbGRLZXkgPSAnJztcblxuICAgICAgaWYgKGNoaWxkS2V5ICE9IG51bGwpIHtcbiAgICAgICAgZXNjYXBlZENoaWxkS2V5ID0gZXNjYXBlVXNlclByb3ZpZGVkS2V5KGNoaWxkS2V5KSArICcvJztcbiAgICAgIH1cblxuICAgICAgbWFwSW50b0FycmF5KG1hcHBlZENoaWxkLCBhcnJheSwgZXNjYXBlZENoaWxkS2V5LCAnJywgZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgcmV0dXJuIGM7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKG1hcHBlZENoaWxkICE9IG51bGwpIHtcbiAgICAgIGlmIChpc1ZhbGlkRWxlbWVudChtYXBwZWRDaGlsZCkpIHtcbiAgICAgICAge1xuICAgICAgICAgIC8vIFRoZSBgaWZgIHN0YXRlbWVudCBoZXJlIHByZXZlbnRzIGF1dG8tZGlzYWJsaW5nIG9mIHRoZSBzYWZlXG4gICAgICAgICAgLy8gY29lcmNpb24gRVNMaW50IHJ1bGUsIHNvIHdlIG11c3QgbWFudWFsbHkgZGlzYWJsZSBpdCBiZWxvdy5cbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIFJlYWN0LlBvcnRhbCBkb2Vzbid0IGhhdmUgYSBrZXlcbiAgICAgICAgICBpZiAobWFwcGVkQ2hpbGQua2V5ICYmICghX2NoaWxkIHx8IF9jaGlsZC5rZXkgIT09IG1hcHBlZENoaWxkLmtleSkpIHtcbiAgICAgICAgICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24obWFwcGVkQ2hpbGQua2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBtYXBwZWRDaGlsZCA9IGNsb25lQW5kUmVwbGFjZUtleShtYXBwZWRDaGlsZCwgLy8gS2VlcCBib3RoIHRoZSAobWFwcGVkKSBhbmQgb2xkIGtleXMgaWYgdGhleSBkaWZmZXIsIGp1c3QgYXNcbiAgICAgICAgLy8gdHJhdmVyc2VBbGxDaGlsZHJlbiB1c2VkIHRvIGRvIGZvciBvYmplY3RzIGFzIGNoaWxkcmVuXG4gICAgICAgIGVzY2FwZWRQcmVmaXggKyAoIC8vICRGbG93Rml4TWUgRmxvdyBpbmNvcnJlY3RseSB0aGlua3MgUmVhY3QuUG9ydGFsIGRvZXNuJ3QgaGF2ZSBhIGtleVxuICAgICAgICBtYXBwZWRDaGlsZC5rZXkgJiYgKCFfY2hpbGQgfHwgX2NoaWxkLmtleSAhPT0gbWFwcGVkQ2hpbGQua2V5KSA/IC8vICRGbG93Rml4TWUgRmxvdyBpbmNvcnJlY3RseSB0aGlua3MgZXhpc3RpbmcgZWxlbWVudCdzIGtleSBjYW4gYmUgYSBudW1iZXJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG4gICAgICAgIGVzY2FwZVVzZXJQcm92aWRlZEtleSgnJyArIG1hcHBlZENoaWxkLmtleSkgKyAnLycgOiAnJykgKyBjaGlsZEtleSk7XG4gICAgICB9XG5cbiAgICAgIGFycmF5LnB1c2gobWFwcGVkQ2hpbGQpO1xuICAgIH1cblxuICAgIHJldHVybiAxO1xuICB9XG5cbiAgdmFyIGNoaWxkO1xuICB2YXIgbmV4dE5hbWU7XG4gIHZhciBzdWJ0cmVlQ291bnQgPSAwOyAvLyBDb3VudCBvZiBjaGlsZHJlbiBmb3VuZCBpbiB0aGUgY3VycmVudCBzdWJ0cmVlLlxuXG4gIHZhciBuZXh0TmFtZVByZWZpeCA9IG5hbWVTb0ZhciA9PT0gJycgPyBTRVBBUkFUT1IgOiBuYW1lU29GYXIgKyBTVUJTRVBBUkFUT1I7XG5cbiAgaWYgKGlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgIG5leHROYW1lID0gbmV4dE5hbWVQcmVmaXggKyBnZXRFbGVtZW50S2V5KGNoaWxkLCBpKTtcbiAgICAgIHN1YnRyZWVDb3VudCArPSBtYXBJbnRvQXJyYXkoY2hpbGQsIGFycmF5LCBlc2NhcGVkUHJlZml4LCBuZXh0TmFtZSwgY2FsbGJhY2spO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4oY2hpbGRyZW4pO1xuXG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgaXRlcmFibGVDaGlsZHJlbiA9IGNoaWxkcmVuO1xuXG4gICAgICB7XG4gICAgICAgIC8vIFdhcm4gYWJvdXQgdXNpbmcgTWFwcyBhcyBjaGlsZHJlblxuICAgICAgICBpZiAoaXRlcmF0b3JGbiA9PT0gaXRlcmFibGVDaGlsZHJlbi5lbnRyaWVzKSB7XG4gICAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRNYXBzKSB7XG4gICAgICAgICAgICB3YXJuKCdVc2luZyBNYXBzIGFzIGNoaWxkcmVuIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnVXNlIGFuIGFycmF5IG9mIGtleWVkIFJlYWN0RWxlbWVudHMgaW5zdGVhZC4nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkaWRXYXJuQWJvdXRNYXBzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwoaXRlcmFibGVDaGlsZHJlbik7XG4gICAgICB2YXIgc3RlcDtcbiAgICAgIHZhciBpaSA9IDA7XG5cbiAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgY2hpbGQgPSBzdGVwLnZhbHVlO1xuICAgICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgZ2V0RWxlbWVudEtleShjaGlsZCwgaWkrKyk7XG4gICAgICAgIHN1YnRyZWVDb3VudCArPSBtYXBJbnRvQXJyYXkoY2hpbGQsIGFycmF5LCBlc2NhcGVkUHJlZml4LCBuZXh0TmFtZSwgY2FsbGJhY2spO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICAgICAgdmFyIGNoaWxkcmVuU3RyaW5nID0gU3RyaW5nKGNoaWxkcmVuKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk9iamVjdHMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkIChmb3VuZDogXCIgKyAoY2hpbGRyZW5TdHJpbmcgPT09ICdbb2JqZWN0IE9iamVjdF0nID8gJ29iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhjaGlsZHJlbikuam9pbignLCAnKSArICd9JyA6IGNoaWxkcmVuU3RyaW5nKSArIFwiKS4gXCIgKyAnSWYgeW91IG1lYW50IHRvIHJlbmRlciBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4sIHVzZSBhbiBhcnJheSAnICsgJ2luc3RlYWQuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN1YnRyZWVDb3VudDtcbn1cblxuLyoqXG4gKiBNYXBzIGNoaWxkcmVuIHRoYXQgYXJlIHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI3JlYWN0Y2hpbGRyZW5tYXBcbiAqXG4gKiBUaGUgcHJvdmlkZWQgbWFwRnVuY3Rpb24oY2hpbGQsIGluZGV4KSB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaFxuICogbGVhZiBjaGlsZC5cbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKiwgaW50KX0gZnVuYyBUaGUgbWFwIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IENvbnRleHQgZm9yIG1hcEZ1bmN0aW9uLlxuICogQHJldHVybiB7b2JqZWN0fSBPYmplY3QgY29udGFpbmluZyB0aGUgb3JkZXJlZCBtYXAgb2YgcmVzdWx0cy5cbiAqL1xuZnVuY3Rpb24gbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmMsIGNvbnRleHQpIHtcbiAgaWYgKGNoaWxkcmVuID09IG51bGwpIHtcbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH1cblxuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBjb3VudCA9IDA7XG4gIG1hcEludG9BcnJheShjaGlsZHJlbiwgcmVzdWx0LCAnJywgJycsIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHJldHVybiBmdW5jLmNhbGwoY29udGV4dCwgY2hpbGQsIGNvdW50KyspO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuICogQ291bnQgdGhlIG51bWJlciBvZiBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzXG4gKiBgcHJvcHMuY2hpbGRyZW5gLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbmNvdW50XG4gKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBjb250YWluZXIuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBudW1iZXIgb2YgY2hpbGRyZW4uXG4gKi9cblxuXG5mdW5jdGlvbiBjb3VudENoaWxkcmVuKGNoaWxkcmVuKSB7XG4gIHZhciBuID0gMDtcbiAgbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmN0aW9uICgpIHtcbiAgICBuKys7IC8vIERvbid0IHJldHVybiBhbnl0aGluZ1xuICB9KTtcbiAgcmV0dXJuIG47XG59XG5cbi8qKlxuICogSXRlcmF0ZXMgdGhyb3VnaCBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmAuXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVuZm9yZWFjaFxuICpcbiAqIFRoZSBwcm92aWRlZCBmb3JFYWNoRnVuYyhjaGlsZCwgaW5kZXgpIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoXG4gKiBsZWFmIGNoaWxkLlxuICpcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHBhcmFtIHtmdW5jdGlvbigqLCBpbnQpfSBmb3JFYWNoRnVuY1xuICogQHBhcmFtIHsqfSBmb3JFYWNoQ29udGV4dCBDb250ZXh0IGZvciBmb3JFYWNoQ29udGV4dC5cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaENoaWxkcmVuKGNoaWxkcmVuLCBmb3JFYWNoRnVuYywgZm9yRWFjaENvbnRleHQpIHtcbiAgbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmN0aW9uICgpIHtcbiAgICBmb3JFYWNoRnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyAvLyBEb24ndCByZXR1cm4gYW55dGhpbmcuXG4gIH0sIGZvckVhY2hDb250ZXh0KTtcbn1cbi8qKlxuICogRmxhdHRlbiBhIGNoaWxkcmVuIG9iamVjdCAodHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gKSBhbmRcbiAqIHJldHVybiBhbiBhcnJheSB3aXRoIGFwcHJvcHJpYXRlbHkgcmUta2V5ZWQgY2hpbGRyZW4uXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVudG9hcnJheVxuICovXG5cblxuZnVuY3Rpb24gdG9BcnJheShjaGlsZHJlbikge1xuICByZXR1cm4gbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHJldHVybiBjaGlsZDtcbiAgfSkgfHwgW107XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGZpcnN0IGNoaWxkIGluIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiBhbmQgdmVyaWZpZXMgdGhhdCB0aGVyZVxuICogaXMgb25seSBvbmUgY2hpbGQgaW4gdGhlIGNvbGxlY3Rpb24uXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVub25seVxuICpcbiAqIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IGEgc2luZ2xlIGNoaWxkIGdldHNcbiAqIHBhc3NlZCB3aXRob3V0IGEgd3JhcHBlciwgYnV0IHRoZSBwdXJwb3NlIG9mIHRoaXMgaGVscGVyIGZ1bmN0aW9uIGlzIHRvXG4gKiBhYnN0cmFjdCBhd2F5IHRoZSBwYXJ0aWN1bGFyIHN0cnVjdHVyZSBvZiBjaGlsZHJlbi5cbiAqXG4gKiBAcGFyYW0gez9vYmplY3R9IGNoaWxkcmVuIENoaWxkIGNvbGxlY3Rpb24gc3RydWN0dXJlLlxuICogQHJldHVybiB7UmVhY3RFbGVtZW50fSBUaGUgZmlyc3QgYW5kIG9ubHkgYFJlYWN0RWxlbWVudGAgY29udGFpbmVkIGluIHRoZVxuICogc3RydWN0dXJlLlxuICovXG5cblxuZnVuY3Rpb24gb25seUNoaWxkKGNoaWxkcmVuKSB7XG4gIGlmICghaXNWYWxpZEVsZW1lbnQoY2hpbGRyZW4pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdSZWFjdC5DaGlsZHJlbi5vbmx5IGV4cGVjdGVkIHRvIHJlY2VpdmUgYSBzaW5nbGUgUmVhY3QgZWxlbWVudCBjaGlsZC4nKTtcbiAgfVxuXG4gIHJldHVybiBjaGlsZHJlbjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29udGV4dChkZWZhdWx0VmFsdWUpIHtcbiAgLy8gVE9ETzogU2Vjb25kIGFyZ3VtZW50IHVzZWQgdG8gYmUgYW4gb3B0aW9uYWwgYGNhbGN1bGF0ZUNoYW5nZWRCaXRzYFxuICAvLyBmdW5jdGlvbi4gV2FybiB0byByZXNlcnZlIGZvciBmdXR1cmUgdXNlP1xuICB2YXIgY29udGV4dCA9IHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfQ09OVEVYVF9UWVBFLFxuICAgIC8vIEFzIGEgd29ya2Fyb3VuZCB0byBzdXBwb3J0IG11bHRpcGxlIGNvbmN1cnJlbnQgcmVuZGVyZXJzLCB3ZSBjYXRlZ29yaXplXG4gICAgLy8gc29tZSByZW5kZXJlcnMgYXMgcHJpbWFyeSBhbmQgb3RoZXJzIGFzIHNlY29uZGFyeS4gV2Ugb25seSBleHBlY3RcbiAgICAvLyB0aGVyZSB0byBiZSB0d28gY29uY3VycmVudCByZW5kZXJlcnMgYXQgbW9zdDogUmVhY3QgTmF0aXZlIChwcmltYXJ5KSBhbmRcbiAgICAvLyBGYWJyaWMgKHNlY29uZGFyeSk7IFJlYWN0IERPTSAocHJpbWFyeSkgYW5kIFJlYWN0IEFSVCAoc2Vjb25kYXJ5KS5cbiAgICAvLyBTZWNvbmRhcnkgcmVuZGVyZXJzIHN0b3JlIHRoZWlyIGNvbnRleHQgdmFsdWVzIG9uIHNlcGFyYXRlIGZpZWxkcy5cbiAgICBfY3VycmVudFZhbHVlOiBkZWZhdWx0VmFsdWUsXG4gICAgX2N1cnJlbnRWYWx1ZTI6IGRlZmF1bHRWYWx1ZSxcbiAgICAvLyBVc2VkIHRvIHRyYWNrIGhvdyBtYW55IGNvbmN1cnJlbnQgcmVuZGVyZXJzIHRoaXMgY29udGV4dCBjdXJyZW50bHlcbiAgICAvLyBzdXBwb3J0cyB3aXRoaW4gaW4gYSBzaW5nbGUgcmVuZGVyZXIuIFN1Y2ggYXMgcGFyYWxsZWwgc2VydmVyIHJlbmRlcmluZy5cbiAgICBfdGhyZWFkQ291bnQ6IDAsXG4gICAgLy8gVGhlc2UgYXJlIGNpcmN1bGFyXG4gICAgUHJvdmlkZXI6IG51bGwsXG4gICAgQ29uc3VtZXI6IG51bGwsXG4gICAgLy8gQWRkIHRoZXNlIHRvIHVzZSBzYW1lIGhpZGRlbiBjbGFzcyBpbiBWTSBhcyBTZXJ2ZXJDb250ZXh0XG4gICAgX2RlZmF1bHRWYWx1ZTogbnVsbCxcbiAgICBfZ2xvYmFsTmFtZTogbnVsbFxuICB9O1xuICBjb250ZXh0LlByb3ZpZGVyID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9QUk9WSURFUl9UWVBFLFxuICAgIF9jb250ZXh0OiBjb250ZXh0XG4gIH07XG4gIHZhciBoYXNXYXJuZWRBYm91dFVzaW5nTmVzdGVkQ29udGV4dENvbnN1bWVycyA9IGZhbHNlO1xuICB2YXIgaGFzV2FybmVkQWJvdXRVc2luZ0NvbnN1bWVyUHJvdmlkZXIgPSBmYWxzZTtcbiAgdmFyIGhhc1dhcm5lZEFib3V0RGlzcGxheU5hbWVPbkNvbnN1bWVyID0gZmFsc2U7XG5cbiAge1xuICAgIC8vIEEgc2VwYXJhdGUgb2JqZWN0LCBidXQgcHJveGllcyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBjb250ZXh0IG9iamVjdCBmb3JcbiAgICAvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gSXQgaGFzIGEgZGlmZmVyZW50ICQkdHlwZW9mLCBzbyB3ZSBjYW4gcHJvcGVybHlcbiAgICAvLyB3YXJuIGZvciB0aGUgaW5jb3JyZWN0IHVzYWdlIG9mIENvbnRleHQgYXMgYSBDb25zdW1lci5cbiAgICB2YXIgQ29uc3VtZXIgPSB7XG4gICAgICAkJHR5cGVvZjogUkVBQ1RfQ09OVEVYVF9UWVBFLFxuICAgICAgX2NvbnRleHQ6IGNvbnRleHRcbiAgICB9OyAvLyAkRmxvd0ZpeE1lOiBGbG93IGNvbXBsYWlucyBhYm91dCBub3Qgc2V0dGluZyBhIHZhbHVlLCB3aGljaCBpcyBpbnRlbnRpb25hbCBoZXJlXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhDb25zdW1lciwge1xuICAgICAgUHJvdmlkZXI6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dFVzaW5nQ29uc3VtZXJQcm92aWRlcikge1xuICAgICAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ0NvbnN1bWVyUHJvdmlkZXIgPSB0cnVlO1xuXG4gICAgICAgICAgICBlcnJvcignUmVuZGVyaW5nIDxDb250ZXh0LkNvbnN1bWVyLlByb3ZpZGVyPiBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBEaWQgeW91IG1lYW4gdG8gcmVuZGVyIDxDb250ZXh0LlByb3ZpZGVyPiBpbnN0ZWFkPycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb250ZXh0LlByb3ZpZGVyO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfUHJvdmlkZXIpIHtcbiAgICAgICAgICBjb250ZXh0LlByb3ZpZGVyID0gX1Byb3ZpZGVyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgX2N1cnJlbnRWYWx1ZToge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5fY3VycmVudFZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgY29udGV4dC5fY3VycmVudFZhbHVlID0gX2N1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIF9jdXJyZW50VmFsdWUyOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9jdXJyZW50VmFsdWUyO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfY3VycmVudFZhbHVlMikge1xuICAgICAgICAgIGNvbnRleHQuX2N1cnJlbnRWYWx1ZTIgPSBfY3VycmVudFZhbHVlMjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIF90aHJlYWRDb3VudDoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5fdGhyZWFkQ291bnQ7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKF90aHJlYWRDb3VudCkge1xuICAgICAgICAgIGNvbnRleHQuX3RocmVhZENvdW50ID0gX3RocmVhZENvdW50O1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgQ29uc3VtZXI6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dFVzaW5nTmVzdGVkQ29udGV4dENvbnN1bWVycykge1xuICAgICAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ05lc3RlZENvbnRleHRDb25zdW1lcnMgPSB0cnVlO1xuXG4gICAgICAgICAgICBlcnJvcignUmVuZGVyaW5nIDxDb250ZXh0LkNvbnN1bWVyLkNvbnN1bWVyPiBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBEaWQgeW91IG1lYW4gdG8gcmVuZGVyIDxDb250ZXh0LkNvbnN1bWVyPiBpbnN0ZWFkPycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb250ZXh0LkNvbnN1bWVyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZGlzcGxheU5hbWU6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuZGlzcGxheU5hbWU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKGRpc3BsYXlOYW1lKSB7XG4gICAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dERpc3BsYXlOYW1lT25Db25zdW1lcikge1xuICAgICAgICAgICAgd2FybignU2V0dGluZyBgZGlzcGxheU5hbWVgIG9uIENvbnRleHQuQ29uc3VtZXIgaGFzIG5vIGVmZmVjdC4gJyArIFwiWW91IHNob3VsZCBzZXQgaXQgZGlyZWN0bHkgb24gdGhlIGNvbnRleHQgd2l0aCBDb250ZXh0LmRpc3BsYXlOYW1lID0gJyVzJy5cIiwgZGlzcGxheU5hbWUpO1xuXG4gICAgICAgICAgICBoYXNXYXJuZWRBYm91dERpc3BsYXlOYW1lT25Db25zdW1lciA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7IC8vICRGbG93Rml4TWU6IEZsb3cgY29tcGxhaW5zIGFib3V0IG1pc3NpbmcgcHJvcGVydGllcyBiZWNhdXNlIGl0IGRvZXNuJ3QgdW5kZXJzdGFuZCBkZWZpbmVQcm9wZXJ0eVxuXG4gICAgY29udGV4dC5Db25zdW1lciA9IENvbnN1bWVyO1xuICB9XG5cbiAge1xuICAgIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciA9IG51bGw7XG4gICAgY29udGV4dC5fY3VycmVudFJlbmRlcmVyMiA9IG51bGw7XG4gIH1cblxuICByZXR1cm4gY29udGV4dDtcbn1cblxudmFyIFVuaW5pdGlhbGl6ZWQgPSAtMTtcbnZhciBQZW5kaW5nID0gMDtcbnZhciBSZXNvbHZlZCA9IDE7XG52YXIgUmVqZWN0ZWQgPSAyO1xuXG5mdW5jdGlvbiBsYXp5SW5pdGlhbGl6ZXIocGF5bG9hZCkge1xuICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBVbmluaXRpYWxpemVkKSB7XG4gICAgdmFyIGN0b3IgPSBwYXlsb2FkLl9yZXN1bHQ7XG4gICAgdmFyIHRoZW5hYmxlID0gY3RvcigpOyAvLyBUcmFuc2l0aW9uIHRvIHRoZSBuZXh0IHN0YXRlLlxuICAgIC8vIFRoaXMgbWlnaHQgdGhyb3cgZWl0aGVyIGJlY2F1c2UgaXQncyBtaXNzaW5nIG9yIHRocm93cy4gSWYgc28sIHdlIHRyZWF0IGl0XG4gICAgLy8gYXMgc3RpbGwgdW5pbml0aWFsaXplZCBhbmQgdHJ5IGFnYWluIG5leHQgdGltZS4gV2hpY2ggaXMgdGhlIHNhbWUgYXMgd2hhdFxuICAgIC8vIGhhcHBlbnMgaWYgdGhlIGN0b3Igb3IgYW55IHdyYXBwZXJzIHByb2Nlc3NpbmcgdGhlIGN0b3IgdGhyb3dzLiBUaGlzIG1pZ2h0XG4gICAgLy8gZW5kIHVwIGZpeGluZyBpdCBpZiB0aGUgcmVzb2x1dGlvbiB3YXMgYSBjb25jdXJyZW5jeSBidWcuXG5cbiAgICB0aGVuYWJsZS50aGVuKGZ1bmN0aW9uIChtb2R1bGVPYmplY3QpIHtcbiAgICAgIGlmIChwYXlsb2FkLl9zdGF0dXMgPT09IFBlbmRpbmcgfHwgcGF5bG9hZC5fc3RhdHVzID09PSBVbmluaXRpYWxpemVkKSB7XG4gICAgICAgIC8vIFRyYW5zaXRpb24gdG8gdGhlIG5leHQgc3RhdGUuXG4gICAgICAgIHZhciByZXNvbHZlZCA9IHBheWxvYWQ7XG4gICAgICAgIHJlc29sdmVkLl9zdGF0dXMgPSBSZXNvbHZlZDtcbiAgICAgICAgcmVzb2x2ZWQuX3Jlc3VsdCA9IG1vZHVsZU9iamVjdDtcbiAgICAgIH1cbiAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgIGlmIChwYXlsb2FkLl9zdGF0dXMgPT09IFBlbmRpbmcgfHwgcGF5bG9hZC5fc3RhdHVzID09PSBVbmluaXRpYWxpemVkKSB7XG4gICAgICAgIC8vIFRyYW5zaXRpb24gdG8gdGhlIG5leHQgc3RhdGUuXG4gICAgICAgIHZhciByZWplY3RlZCA9IHBheWxvYWQ7XG4gICAgICAgIHJlamVjdGVkLl9zdGF0dXMgPSBSZWplY3RlZDtcbiAgICAgICAgcmVqZWN0ZWQuX3Jlc3VsdCA9IGVycm9yO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHBheWxvYWQuX3N0YXR1cyA9PT0gVW5pbml0aWFsaXplZCkge1xuICAgICAgLy8gSW4gY2FzZSwgd2UncmUgc3RpbGwgdW5pbml0aWFsaXplZCwgdGhlbiB3ZSdyZSB3YWl0aW5nIGZvciB0aGUgdGhlbmFibGVcbiAgICAgIC8vIHRvIHJlc29sdmUuIFNldCBpdCBhcyBwZW5kaW5nIGluIHRoZSBtZWFudGltZS5cbiAgICAgIHZhciBwZW5kaW5nID0gcGF5bG9hZDtcbiAgICAgIHBlbmRpbmcuX3N0YXR1cyA9IFBlbmRpbmc7XG4gICAgICBwZW5kaW5nLl9yZXN1bHQgPSB0aGVuYWJsZTtcbiAgICB9XG4gIH1cblxuICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBSZXNvbHZlZCkge1xuICAgIHZhciBtb2R1bGVPYmplY3QgPSBwYXlsb2FkLl9yZXN1bHQ7XG5cbiAgICB7XG4gICAgICBpZiAobW9kdWxlT2JqZWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3IoJ2xhenk6IEV4cGVjdGVkIHRoZSByZXN1bHQgb2YgYSBkeW5hbWljIGltcCcgKyAnb3J0KCkgY2FsbC4gJyArICdJbnN0ZWFkIHJlY2VpdmVkOiAlc1xcblxcbllvdXIgY29kZSBzaG91bGQgbG9vayBsaWtlOiBcXG4gICcgKyAvLyBCcmVhayB1cCBpbXBvcnRzIHRvIGF2b2lkIGFjY2lkZW50YWxseSBwYXJzaW5nIHRoZW0gYXMgZGVwZW5kZW5jaWVzLlxuICAgICAgICAnY29uc3QgTXlDb21wb25lbnQgPSBsYXp5KCgpID0+IGltcCcgKyBcIm9ydCgnLi9NeUNvbXBvbmVudCcpKVxcblxcblwiICsgJ0RpZCB5b3UgYWNjaWRlbnRhbGx5IHB1dCBjdXJseSBicmFjZXMgYXJvdW5kIHRoZSBpbXBvcnQ/JywgbW9kdWxlT2JqZWN0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAoISgnZGVmYXVsdCcgaW4gbW9kdWxlT2JqZWN0KSkge1xuICAgICAgICBlcnJvcignbGF6eTogRXhwZWN0ZWQgdGhlIHJlc3VsdCBvZiBhIGR5bmFtaWMgaW1wJyArICdvcnQoKSBjYWxsLiAnICsgJ0luc3RlYWQgcmVjZWl2ZWQ6ICVzXFxuXFxuWW91ciBjb2RlIHNob3VsZCBsb29rIGxpa2U6IFxcbiAgJyArIC8vIEJyZWFrIHVwIGltcG9ydHMgdG8gYXZvaWQgYWNjaWRlbnRhbGx5IHBhcnNpbmcgdGhlbSBhcyBkZXBlbmRlbmNpZXMuXG4gICAgICAgICdjb25zdCBNeUNvbXBvbmVudCA9IGxhenkoKCkgPT4gaW1wJyArIFwib3J0KCcuL015Q29tcG9uZW50JykpXCIsIG1vZHVsZU9iamVjdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZHVsZU9iamVjdC5kZWZhdWx0O1xuICB9IGVsc2Uge1xuICAgIHRocm93IHBheWxvYWQuX3Jlc3VsdDtcbiAgfVxufVxuXG5mdW5jdGlvbiBsYXp5KGN0b3IpIHtcbiAgdmFyIHBheWxvYWQgPSB7XG4gICAgLy8gV2UgdXNlIHRoZXNlIGZpZWxkcyB0byBzdG9yZSB0aGUgcmVzdWx0LlxuICAgIF9zdGF0dXM6IFVuaW5pdGlhbGl6ZWQsXG4gICAgX3Jlc3VsdDogY3RvclxuICB9O1xuICB2YXIgbGF6eVR5cGUgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX0xBWllfVFlQRSxcbiAgICBfcGF5bG9hZDogcGF5bG9hZCxcbiAgICBfaW5pdDogbGF6eUluaXRpYWxpemVyXG4gIH07XG5cbiAge1xuICAgIC8vIEluIHByb2R1Y3Rpb24sIHRoaXMgd291bGQganVzdCBzZXQgaXQgb24gdGhlIG9iamVjdC5cbiAgICB2YXIgZGVmYXVsdFByb3BzO1xuICAgIHZhciBwcm9wVHlwZXM7IC8vICRGbG93Rml4TWVcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGxhenlUeXBlLCB7XG4gICAgICBkZWZhdWx0UHJvcHM6IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdFByb3BzO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChuZXdEZWZhdWx0UHJvcHMpIHtcbiAgICAgICAgICBlcnJvcignUmVhY3QubGF6eSguLi4pOiBJdCBpcyBub3Qgc3VwcG9ydGVkIHRvIGFzc2lnbiBgZGVmYXVsdFByb3BzYCB0byAnICsgJ2EgbGF6eSBjb21wb25lbnQgaW1wb3J0LiBFaXRoZXIgc3BlY2lmeSB0aGVtIHdoZXJlIHRoZSBjb21wb25lbnQgJyArICdpcyBkZWZpbmVkLCBvciBjcmVhdGUgYSB3cmFwcGluZyBjb21wb25lbnQgYXJvdW5kIGl0LicpO1xuXG4gICAgICAgICAgZGVmYXVsdFByb3BzID0gbmV3RGVmYXVsdFByb3BzOyAvLyBNYXRjaCBwcm9kdWN0aW9uIGJlaGF2aW9yIG1vcmUgY2xvc2VseTpcbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lXG5cbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobGF6eVR5cGUsICdkZWZhdWx0UHJvcHMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBwcm9wVHlwZXM6IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gcHJvcFR5cGVzO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChuZXdQcm9wVHlwZXMpIHtcbiAgICAgICAgICBlcnJvcignUmVhY3QubGF6eSguLi4pOiBJdCBpcyBub3Qgc3VwcG9ydGVkIHRvIGFzc2lnbiBgcHJvcFR5cGVzYCB0byAnICsgJ2EgbGF6eSBjb21wb25lbnQgaW1wb3J0LiBFaXRoZXIgc3BlY2lmeSB0aGVtIHdoZXJlIHRoZSBjb21wb25lbnQgJyArICdpcyBkZWZpbmVkLCBvciBjcmVhdGUgYSB3cmFwcGluZyBjb21wb25lbnQgYXJvdW5kIGl0LicpO1xuXG4gICAgICAgICAgcHJvcFR5cGVzID0gbmV3UHJvcFR5cGVzOyAvLyBNYXRjaCBwcm9kdWN0aW9uIGJlaGF2aW9yIG1vcmUgY2xvc2VseTpcbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lXG5cbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobGF6eVR5cGUsICdwcm9wVHlwZXMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBsYXp5VHlwZTtcbn1cblxuZnVuY3Rpb24gZm9yd2FyZFJlZihyZW5kZXIpIHtcbiAge1xuICAgIGlmIChyZW5kZXIgIT0gbnVsbCAmJiByZW5kZXIuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSkge1xuICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVxdWlyZXMgYSByZW5kZXIgZnVuY3Rpb24gYnV0IHJlY2VpdmVkIGEgYG1lbW9gICcgKyAnY29tcG9uZW50LiBJbnN0ZWFkIG9mIGZvcndhcmRSZWYobWVtbyguLi4pKSwgdXNlICcgKyAnbWVtbyhmb3J3YXJkUmVmKC4uLikpLicpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlbmRlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVxdWlyZXMgYSByZW5kZXIgZnVuY3Rpb24gYnV0IHdhcyBnaXZlbiAlcy4nLCByZW5kZXIgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgcmVuZGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHJlbmRlci5sZW5ndGggIT09IDAgJiYgcmVuZGVyLmxlbmd0aCAhPT0gMikge1xuICAgICAgICBlcnJvcignZm9yd2FyZFJlZiByZW5kZXIgZnVuY3Rpb25zIGFjY2VwdCBleGFjdGx5IHR3byBwYXJhbWV0ZXJzOiBwcm9wcyBhbmQgcmVmLiAlcycsIHJlbmRlci5sZW5ndGggPT09IDEgPyAnRGlkIHlvdSBmb3JnZXQgdG8gdXNlIHRoZSByZWYgcGFyYW1ldGVyPycgOiAnQW55IGFkZGl0aW9uYWwgcGFyYW1ldGVyIHdpbGwgYmUgdW5kZWZpbmVkLicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZW5kZXIgIT0gbnVsbCkge1xuICAgICAgaWYgKHJlbmRlci5kZWZhdWx0UHJvcHMgIT0gbnVsbCB8fCByZW5kZXIucHJvcFR5cGVzICE9IG51bGwpIHtcbiAgICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVuZGVyIGZ1bmN0aW9ucyBkbyBub3Qgc3VwcG9ydCBwcm9wVHlwZXMgb3IgZGVmYXVsdFByb3BzLiAnICsgJ0RpZCB5b3UgYWNjaWRlbnRhbGx5IHBhc3MgYSBSZWFjdCBjb21wb25lbnQ/Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGVsZW1lbnRUeXBlID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFLFxuICAgIHJlbmRlcjogcmVuZGVyXG4gIH07XG5cbiAge1xuICAgIHZhciBvd25OYW1lO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50VHlwZSwgJ2Rpc3BsYXlOYW1lJywge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG93bk5hbWU7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBvd25OYW1lID0gbmFtZTsgLy8gVGhlIGlubmVyIGNvbXBvbmVudCBzaG91bGRuJ3QgaW5oZXJpdCB0aGlzIGRpc3BsYXkgbmFtZSBpbiBtb3N0IGNhc2VzLFxuICAgICAgICAvLyBiZWNhdXNlIHRoZSBjb21wb25lbnQgbWF5IGJlIHVzZWQgZWxzZXdoZXJlLlxuICAgICAgICAvLyBCdXQgaXQncyBuaWNlIGZvciBhbm9ueW1vdXMgZnVuY3Rpb25zIHRvIGluaGVyaXQgdGhlIG5hbWUsXG4gICAgICAgIC8vIHNvIHRoYXQgb3VyIGNvbXBvbmVudC1zdGFjayBnZW5lcmF0aW9uIGxvZ2ljIHdpbGwgZGlzcGxheSB0aGVpciBmcmFtZXMuXG4gICAgICAgIC8vIEFuIGFub255bW91cyBmdW5jdGlvbiBnZW5lcmFsbHkgc3VnZ2VzdHMgYSBwYXR0ZXJuIGxpa2U6XG4gICAgICAgIC8vICAgUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIHJlZikgPT4gey4uLn0pO1xuICAgICAgICAvLyBUaGlzIGtpbmQgb2YgaW5uZXIgZnVuY3Rpb24gaXMgbm90IHVzZWQgZWxzZXdoZXJlIHNvIHRoZSBzaWRlIGVmZmVjdCBpcyBva2F5LlxuXG4gICAgICAgIGlmICghcmVuZGVyLm5hbWUgJiYgIXJlbmRlci5kaXNwbGF5TmFtZSkge1xuICAgICAgICAgIHJlbmRlci5kaXNwbGF5TmFtZSA9IG5hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50VHlwZTtcbn1cblxudmFyIFJFQUNUX01PRFVMRV9SRUZFUkVOQ0U7XG5cbntcbiAgUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm1vZHVsZS5yZWZlcmVuY2UnKTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIE5vdGU6IHR5cGVvZiBtaWdodCBiZSBvdGhlciB0aGFuICdzeW1ib2wnIG9yICdudW1iZXInIChlLmcuIGlmIGl0J3MgYSBwb2x5ZmlsbCkuXG5cblxuICBpZiAodHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFIHx8IGVuYWJsZURlYnVnVHJhY2luZyAgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCBlbmFibGVMZWdhY3lIaWRkZW4gIHx8IHR5cGUgPT09IFJFQUNUX09GRlNDUkVFTl9UWVBFIHx8IGVuYWJsZVNjb3BlQVBJICB8fCBlbmFibGVDYWNoZUVsZW1lbnQgIHx8IGVuYWJsZVRyYW5zaXRpb25UcmFjaW5nICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCAvLyBUaGlzIG5lZWRzIHRvIGluY2x1ZGUgYWxsIHBvc3NpYmxlIG1vZHVsZSByZWZlcmVuY2Ugb2JqZWN0XG4gICAgLy8gdHlwZXMgc3VwcG9ydGVkIGJ5IGFueSBGbGlnaHQgY29uZmlndXJhdGlvbiBhbnl3aGVyZSBzaW5jZVxuICAgIC8vIHdlIGRvbid0IGtub3cgd2hpY2ggRmxpZ2h0IGJ1aWxkIHRoaXMgd2lsbCBlbmQgdXAgYmVpbmcgdXNlZFxuICAgIC8vIHdpdGguXG4gICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRSB8fCB0eXBlLmdldE1vZHVsZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbWVtbyh0eXBlLCBjb21wYXJlKSB7XG4gIHtcbiAgICBpZiAoIWlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSkge1xuICAgICAgZXJyb3IoJ21lbW86IFRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgY29tcG9uZW50LiBJbnN0ZWFkICcgKyAncmVjZWl2ZWQ6ICVzJywgdHlwZSA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiB0eXBlKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZWxlbWVudFR5cGUgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX01FTU9fVFlQRSxcbiAgICB0eXBlOiB0eXBlLFxuICAgIGNvbXBhcmU6IGNvbXBhcmUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb21wYXJlXG4gIH07XG5cbiAge1xuICAgIHZhciBvd25OYW1lO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50VHlwZSwgJ2Rpc3BsYXlOYW1lJywge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG93bk5hbWU7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBvd25OYW1lID0gbmFtZTsgLy8gVGhlIGlubmVyIGNvbXBvbmVudCBzaG91bGRuJ3QgaW5oZXJpdCB0aGlzIGRpc3BsYXkgbmFtZSBpbiBtb3N0IGNhc2VzLFxuICAgICAgICAvLyBiZWNhdXNlIHRoZSBjb21wb25lbnQgbWF5IGJlIHVzZWQgZWxzZXdoZXJlLlxuICAgICAgICAvLyBCdXQgaXQncyBuaWNlIGZvciBhbm9ueW1vdXMgZnVuY3Rpb25zIHRvIGluaGVyaXQgdGhlIG5hbWUsXG4gICAgICAgIC8vIHNvIHRoYXQgb3VyIGNvbXBvbmVudC1zdGFjayBnZW5lcmF0aW9uIGxvZ2ljIHdpbGwgZGlzcGxheSB0aGVpciBmcmFtZXMuXG4gICAgICAgIC8vIEFuIGFub255bW91cyBmdW5jdGlvbiBnZW5lcmFsbHkgc3VnZ2VzdHMgYSBwYXR0ZXJuIGxpa2U6XG4gICAgICAgIC8vICAgUmVhY3QubWVtbygocHJvcHMpID0+IHsuLi59KTtcbiAgICAgICAgLy8gVGhpcyBraW5kIG9mIGlubmVyIGZ1bmN0aW9uIGlzIG5vdCB1c2VkIGVsc2V3aGVyZSBzbyB0aGUgc2lkZSBlZmZlY3QgaXMgb2theS5cblxuICAgICAgICBpZiAoIXR5cGUubmFtZSAmJiAhdHlwZS5kaXNwbGF5TmFtZSkge1xuICAgICAgICAgIHR5cGUuZGlzcGxheU5hbWUgPSBuYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudFR5cGU7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVEaXNwYXRjaGVyKCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudDtcblxuICB7XG4gICAgaWYgKGRpc3BhdGNoZXIgPT09IG51bGwpIHtcbiAgICAgIGVycm9yKCdJbnZhbGlkIGhvb2sgY2FsbC4gSG9va3MgY2FuIG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uIGNvbXBvbmVudC4gVGhpcyBjb3VsZCBoYXBwZW4gZm9yJyArICcgb25lIG9mIHRoZSBmb2xsb3dpbmcgcmVhc29uczpcXG4nICsgJzEuIFlvdSBtaWdodCBoYXZlIG1pc21hdGNoaW5nIHZlcnNpb25zIG9mIFJlYWN0IGFuZCB0aGUgcmVuZGVyZXIgKHN1Y2ggYXMgUmVhY3QgRE9NKVxcbicgKyAnMi4gWW91IG1pZ2h0IGJlIGJyZWFraW5nIHRoZSBSdWxlcyBvZiBIb29rc1xcbicgKyAnMy4gWW91IG1pZ2h0IGhhdmUgbW9yZSB0aGFuIG9uZSBjb3B5IG9mIFJlYWN0IGluIHRoZSBzYW1lIGFwcFxcbicgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9pbnZhbGlkLWhvb2stY2FsbCBmb3IgdGlwcyBhYm91dCBob3cgdG8gZGVidWcgYW5kIGZpeCB0aGlzIHByb2JsZW0uJyk7XG4gICAgfVxuICB9IC8vIFdpbGwgcmVzdWx0IGluIGEgbnVsbCBhY2Nlc3MgZXJyb3IgaWYgYWNjZXNzZWQgb3V0c2lkZSByZW5kZXIgcGhhc2UuIFdlXG4gIC8vIGludGVudGlvbmFsbHkgZG9uJ3QgdGhyb3cgb3VyIG93biBlcnJvciBiZWNhdXNlIHRoaXMgaXMgaW4gYSBob3QgcGF0aC5cbiAgLy8gQWxzbyBoZWxwcyBlbnN1cmUgdGhpcyBpcyBpbmxpbmVkLlxuXG5cbiAgcmV0dXJuIGRpc3BhdGNoZXI7XG59XG5mdW5jdGlvbiB1c2VDb250ZXh0KENvbnRleHQpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuXG4gIHtcbiAgICAvLyBUT0RPOiBhZGQgYSBtb3JlIGdlbmVyaWMgd2FybmluZyBmb3IgaW52YWxpZCB2YWx1ZXMuXG4gICAgaWYgKENvbnRleHQuX2NvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIHJlYWxDb250ZXh0ID0gQ29udGV4dC5fY29udGV4dDsgLy8gRG9uJ3QgZGVkdXBsaWNhdGUgYmVjYXVzZSB0aGlzIGxlZ2l0aW1hdGVseSBjYXVzZXMgYnVnc1xuICAgICAgLy8gYW5kIG5vYm9keSBzaG91bGQgYmUgdXNpbmcgdGhpcyBpbiBleGlzdGluZyBjb2RlLlxuXG4gICAgICBpZiAocmVhbENvbnRleHQuQ29uc3VtZXIgPT09IENvbnRleHQpIHtcbiAgICAgICAgZXJyb3IoJ0NhbGxpbmcgdXNlQ29udGV4dChDb250ZXh0LkNvbnN1bWVyKSBpcyBub3Qgc3VwcG9ydGVkLCBtYXkgY2F1c2UgYnVncywgYW5kIHdpbGwgYmUgJyArICdyZW1vdmVkIGluIGEgZnV0dXJlIG1ham9yIHJlbGVhc2UuIERpZCB5b3UgbWVhbiB0byBjYWxsIHVzZUNvbnRleHQoQ29udGV4dCkgaW5zdGVhZD8nKTtcbiAgICAgIH0gZWxzZSBpZiAocmVhbENvbnRleHQuUHJvdmlkZXIgPT09IENvbnRleHQpIHtcbiAgICAgICAgZXJyb3IoJ0NhbGxpbmcgdXNlQ29udGV4dChDb250ZXh0LlByb3ZpZGVyKSBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBjYWxsIHVzZUNvbnRleHQoQ29udGV4dCkgaW5zdGVhZD8nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGlzcGF0Y2hlci51c2VDb250ZXh0KENvbnRleHQpO1xufVxuZnVuY3Rpb24gdXNlU3RhdGUoaW5pdGlhbFN0YXRlKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlU3RhdGUoaW5pdGlhbFN0YXRlKTtcbn1cbmZ1bmN0aW9uIHVzZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG59XG5mdW5jdGlvbiB1c2VSZWYoaW5pdGlhbFZhbHVlKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlUmVmKGluaXRpYWxWYWx1ZSk7XG59XG5mdW5jdGlvbiB1c2VFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VDYWxsYmFjayhjYWxsYmFjaywgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZU1lbW8oY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlTWVtbyhjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlRGVidWdWYWx1ZSh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAge1xuICAgIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgICByZXR1cm4gZGlzcGF0Y2hlci51c2VEZWJ1Z1ZhbHVlKHZhbHVlLCBmb3JtYXR0ZXJGbik7XG4gIH1cbn1cbmZ1bmN0aW9uIHVzZVRyYW5zaXRpb24oKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlVHJhbnNpdGlvbigpO1xufVxuZnVuY3Rpb24gdXNlRGVmZXJyZWRWYWx1ZSh2YWx1ZSkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZURlZmVycmVkVmFsdWUodmFsdWUpO1xufVxuZnVuY3Rpb24gdXNlSWQoKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlSWQoKTtcbn1cbmZ1bmN0aW9uIHVzZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpO1xufVxuXG4vLyBIZWxwZXJzIHRvIHBhdGNoIGNvbnNvbGUubG9ncyB0byBhdm9pZCBsb2dnaW5nIGR1cmluZyBzaWRlLWVmZmVjdCBmcmVlXG4vLyByZXBsYXlpbmcgb24gcmVuZGVyIGZ1bmN0aW9uLiBUaGlzIGN1cnJlbnRseSBvbmx5IHBhdGNoZXMgdGhlIG9iamVjdFxuLy8gbGF6aWx5IHdoaWNoIHdvbid0IGNvdmVyIGlmIHRoZSBsb2cgZnVuY3Rpb24gd2FzIGV4dHJhY3RlZCBlYWdlcmx5LlxuLy8gV2UgY291bGQgYWxzbyBlYWdlcmx5IHBhdGNoIHRoZSBtZXRob2QuXG52YXIgZGlzYWJsZWREZXB0aCA9IDA7XG52YXIgcHJldkxvZztcbnZhciBwcmV2SW5mbztcbnZhciBwcmV2V2FybjtcbnZhciBwcmV2RXJyb3I7XG52YXIgcHJldkdyb3VwO1xudmFyIHByZXZHcm91cENvbGxhcHNlZDtcbnZhciBwcmV2R3JvdXBFbmQ7XG5cbmZ1bmN0aW9uIGRpc2FibGVkTG9nKCkge31cblxuZGlzYWJsZWRMb2cuX19yZWFjdERpc2FibGVkTG9nID0gdHJ1ZTtcbmZ1bmN0aW9uIGRpc2FibGVMb2dzKCkge1xuICB7XG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgcHJldkxvZyA9IGNvbnNvbGUubG9nO1xuICAgICAgcHJldkluZm8gPSBjb25zb2xlLmluZm87XG4gICAgICBwcmV2V2FybiA9IGNvbnNvbGUud2FybjtcbiAgICAgIHByZXZFcnJvciA9IGNvbnNvbGUuZXJyb3I7XG4gICAgICBwcmV2R3JvdXAgPSBjb25zb2xlLmdyb3VwO1xuICAgICAgcHJldkdyb3VwQ29sbGFwc2VkID0gY29uc29sZS5ncm91cENvbGxhcHNlZDtcbiAgICAgIHByZXZHcm91cEVuZCA9IGNvbnNvbGUuZ3JvdXBFbmQ7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTkwOTlcblxuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBkaXNhYmxlZExvZyxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH07IC8vICRGbG93Rml4TWUgRmxvdyB0aGlua3MgY29uc29sZSBpcyBpbW11dGFibGUuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgaW5mbzogcHJvcHMsXG4gICAgICAgIGxvZzogcHJvcHMsXG4gICAgICAgIHdhcm46IHByb3BzLFxuICAgICAgICBlcnJvcjogcHJvcHMsXG4gICAgICAgIGdyb3VwOiBwcm9wcyxcbiAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IHByb3BzLFxuICAgICAgICBncm91cEVuZDogcHJvcHNcbiAgICAgIH0pO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICB9XG5cbiAgICBkaXNhYmxlZERlcHRoKys7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlZW5hYmxlTG9ncygpIHtcbiAge1xuICAgIGRpc2FibGVkRGVwdGgtLTtcblxuICAgIGlmIChkaXNhYmxlZERlcHRoID09PSAwKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBsb2c6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkxvZ1xuICAgICAgICB9KSxcbiAgICAgICAgaW5mbzogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2SW5mb1xuICAgICAgICB9KSxcbiAgICAgICAgd2FybjogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2V2FyblxuICAgICAgICB9KSxcbiAgICAgICAgZXJyb3I6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkVycm9yXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwQ29sbGFwc2VkOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cENvbGxhcHNlZFxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXBFbmQ6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwRW5kXG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgfVxuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPCAwKSB7XG4gICAgICBlcnJvcignZGlzYWJsZWREZXB0aCBmZWxsIGJlbG93IHplcm8uICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyO1xudmFyIHByZWZpeDtcbmZ1bmN0aW9uIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUsIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgaWYgKHByZWZpeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBFeHRyYWN0IHRoZSBWTSBzcGVjaWZpYyBwcmVmaXggdXNlZCBieSBlYWNoIGxpbmUuXG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICB2YXIgbWF0Y2ggPSB4LnN0YWNrLnRyaW0oKS5tYXRjaCgvXFxuKCAqKGF0ICk/KS8pO1xuICAgICAgICBwcmVmaXggPSBtYXRjaCAmJiBtYXRjaFsxXSB8fCAnJztcbiAgICAgIH1cbiAgICB9IC8vIFdlIHVzZSB0aGUgcHJlZml4IHRvIGVuc3VyZSBvdXIgc3RhY2tzIGxpbmUgdXAgd2l0aCBuYXRpdmUgc3RhY2sgZnJhbWVzLlxuXG5cbiAgICByZXR1cm4gJ1xcbicgKyBwcmVmaXggKyBuYW1lO1xuICB9XG59XG52YXIgcmVlbnRyeSA9IGZhbHNlO1xudmFyIGNvbXBvbmVudEZyYW1lQ2FjaGU7XG5cbntcbiAgdmFyIFBvc3NpYmx5V2Vha01hcCA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nID8gV2Vha01hcCA6IE1hcDtcbiAgY29tcG9uZW50RnJhbWVDYWNoZSA9IG5ldyBQb3NzaWJseVdlYWtNYXAoKTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShmbiwgY29uc3RydWN0KSB7XG4gIC8vIElmIHNvbWV0aGluZyBhc2tlZCBmb3IgYSBzdGFjayBpbnNpZGUgYSBmYWtlIHJlbmRlciwgaXQgc2hvdWxkIGdldCBpZ25vcmVkLlxuICBpZiAoICFmbiB8fCByZWVudHJ5KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAge1xuICAgIHZhciBmcmFtZSA9IGNvbXBvbmVudEZyYW1lQ2FjaGUuZ2V0KGZuKTtcblxuICAgIGlmIChmcmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZnJhbWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbnRyb2w7XG4gIHJlZW50cnkgPSB0cnVlO1xuICB2YXIgcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZSA9IEVycm9yLnByZXBhcmVTdGFja1RyYWNlOyAvLyAkRmxvd0ZpeE1lIEl0IGRvZXMgYWNjZXB0IHVuZGVmaW5lZC5cblxuICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHVuZGVmaW5lZDtcbiAgdmFyIHByZXZpb3VzRGlzcGF0Y2hlcjtcblxuICB7XG4gICAgcHJldmlvdXNEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7IC8vIFNldCB0aGUgZGlzcGF0Y2hlciBpbiBERVYgYmVjYXVzZSB0aGlzIG1pZ2h0IGJlIGNhbGwgaW4gdGhlIHJlbmRlciBmdW5jdGlvblxuICAgIC8vIGZvciB3YXJuaW5ncy5cblxuICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gbnVsbDtcbiAgICBkaXNhYmxlTG9ncygpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBUaGlzIHNob3VsZCB0aHJvdy5cbiAgICBpZiAoY29uc3RydWN0KSB7XG4gICAgICAvLyBTb21ldGhpbmcgc2hvdWxkIGJlIHNldHRpbmcgdGhlIHByb3BzIGluIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgIHZhciBGYWtlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfTsgLy8gJEZsb3dGaXhNZVxuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGYWtlLnByb3RvdHlwZSwgJ3Byb3BzJywge1xuICAgICAgICBzZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyBXZSB1c2UgYSB0aHJvd2luZyBzZXR0ZXIgaW5zdGVhZCBvZiBmcm96ZW4gb3Igbm9uLXdyaXRhYmxlIHByb3BzXG4gICAgICAgICAgLy8gYmVjYXVzZSB0aGF0IHdvbid0IHRocm93IGluIGEgbm9uLXN0cmljdCBtb2RlIGZ1bmN0aW9uLlxuICAgICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnICYmIFJlZmxlY3QuY29uc3RydWN0KSB7XG4gICAgICAgIC8vIFdlIGNvbnN0cnVjdCBhIGRpZmZlcmVudCBjb250cm9sIGZvciB0aGlzIGNhc2UgdG8gaW5jbHVkZSBhbnkgZXh0cmFcbiAgICAgICAgLy8gZnJhbWVzIGFkZGVkIGJ5IHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChGYWtlLCBbXSk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgfVxuXG4gICAgICAgIFJlZmxlY3QuY29uc3RydWN0KGZuLCBbXSwgRmFrZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIEZha2UuY2FsbCgpO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICAgIH1cblxuICAgICAgICBmbi5jYWxsKEZha2UucHJvdG90eXBlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICB9XG5cbiAgICAgIGZuKCk7XG4gICAgfVxuICB9IGNhdGNoIChzYW1wbGUpIHtcbiAgICAvLyBUaGlzIGlzIGlubGluZWQgbWFudWFsbHkgYmVjYXVzZSBjbG9zdXJlIGRvZXNuJ3QgZG8gaXQgZm9yIHVzLlxuICAgIGlmIChzYW1wbGUgJiYgY29udHJvbCAmJiB0eXBlb2Ygc2FtcGxlLnN0YWNrID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gVGhpcyBleHRyYWN0cyB0aGUgZmlyc3QgZnJhbWUgZnJvbSB0aGUgc2FtcGxlIHRoYXQgaXNuJ3QgYWxzbyBpbiB0aGUgY29udHJvbC5cbiAgICAgIC8vIFNraXBwaW5nIG9uZSBmcmFtZSB0aGF0IHdlIGFzc3VtZSBpcyB0aGUgZnJhbWUgdGhhdCBjYWxscyB0aGUgdHdvLlxuICAgICAgdmFyIHNhbXBsZUxpbmVzID0gc2FtcGxlLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBjb250cm9sTGluZXMgPSBjb250cm9sLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBzID0gc2FtcGxlTGluZXMubGVuZ3RoIC0gMTtcbiAgICAgIHZhciBjID0gY29udHJvbExpbmVzLmxlbmd0aCAtIDE7XG5cbiAgICAgIHdoaWxlIChzID49IDEgJiYgYyA+PSAwICYmIHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgLy8gV2UgZXhwZWN0IGF0IGxlYXN0IG9uZSBzdGFjayBmcmFtZSB0byBiZSBzaGFyZWQuXG4gICAgICAgIC8vIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgdGhlIHJvb3QgbW9zdCBvbmUuIEhvd2V2ZXIsIHN0YWNrIGZyYW1lcyBtYXkgYmVcbiAgICAgICAgLy8gY3V0IG9mZiBkdWUgdG8gbWF4aW11bSBzdGFjayBsaW1pdHMuIEluIHRoaXMgY2FzZSwgb25lIG1heWJlIGN1dCBvZmZcbiAgICAgICAgLy8gZWFybGllciB0aGFuIHRoZSBvdGhlci4gV2UgYXNzdW1lIHRoYXQgdGhlIHNhbXBsZSBpcyBsb25nZXIgb3IgdGhlIHNhbWVcbiAgICAgICAgLy8gYW5kIHRoZXJlIGZvciBjdXQgb2ZmIGVhcmxpZXIuIFNvIHdlIHNob3VsZCBmaW5kIHRoZSByb290IG1vc3QgZnJhbWUgaW5cbiAgICAgICAgLy8gdGhlIHNhbXBsZSBzb21ld2hlcmUgaW4gdGhlIGNvbnRyb2wuXG4gICAgICAgIGMtLTtcbiAgICAgIH1cblxuICAgICAgZm9yICg7IHMgPj0gMSAmJiBjID49IDA7IHMtLSwgYy0tKSB7XG4gICAgICAgIC8vIE5leHQgd2UgZmluZCB0aGUgZmlyc3Qgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgd2hpY2ggc2hvdWxkIGJlIHRoZVxuICAgICAgICAvLyBmcmFtZSB0aGF0IGNhbGxlZCBvdXIgc2FtcGxlIGZ1bmN0aW9uIGFuZCB0aGUgY29udHJvbC5cbiAgICAgICAgaWYgKHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAvLyBJbiBWOCwgdGhlIGZpcnN0IGxpbmUgaXMgZGVzY3JpYmluZyB0aGUgbWVzc2FnZSBidXQgb3RoZXIgVk1zIGRvbid0LlxuICAgICAgICAgIC8vIElmIHdlJ3JlIGFib3V0IHRvIHJldHVybiB0aGUgZmlyc3QgbGluZSwgYW5kIHRoZSBjb250cm9sIGlzIGFsc28gb24gdGhlIHNhbWVcbiAgICAgICAgICAvLyBsaW5lLCB0aGF0J3MgYSBwcmV0dHkgZ29vZCBpbmRpY2F0b3IgdGhhdCBvdXIgc2FtcGxlIHRocmV3IGF0IHNhbWUgbGluZSBhc1xuICAgICAgICAgIC8vIHRoZSBjb250cm9sLiBJLmUuIGJlZm9yZSB3ZSBlbnRlcmVkIHRoZSBzYW1wbGUgZnJhbWUuIFNvIHdlIGlnbm9yZSB0aGlzIHJlc3VsdC5cbiAgICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgeW91IHBhc3NlZCBhIGNsYXNzIHRvIGZ1bmN0aW9uIGNvbXBvbmVudCwgb3Igbm9uLWZ1bmN0aW9uLlxuICAgICAgICAgIGlmIChzICE9PSAxIHx8IGMgIT09IDEpIHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgcy0tO1xuICAgICAgICAgICAgICBjLS07IC8vIFdlIG1heSBzdGlsbCBoYXZlIHNpbWlsYXIgaW50ZXJtZWRpYXRlIGZyYW1lcyBmcm9tIHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgICAgICAgLy8gVGhlIG5leHQgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgc2hvdWxkIGJlIG91ciBtYXRjaCB0aG91Z2guXG5cbiAgICAgICAgICAgICAgaWYgKGMgPCAwIHx8IHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAgICAgICAvLyBWOCBhZGRzIGEgXCJuZXdcIiBwcmVmaXggZm9yIG5hdGl2ZSBjbGFzc2VzLiBMZXQncyByZW1vdmUgaXQgdG8gbWFrZSBpdCBwcmV0dGllci5cbiAgICAgICAgICAgICAgICB2YXIgX2ZyYW1lID0gJ1xcbicgKyBzYW1wbGVMaW5lc1tzXS5yZXBsYWNlKCcgYXQgbmV3ICcsICcgYXQgJyk7IC8vIElmIG91ciBjb21wb25lbnQgZnJhbWUgaXMgbGFiZWxlZCBcIjxhbm9ueW1vdXM+XCJcbiAgICAgICAgICAgICAgICAvLyBidXQgd2UgaGF2ZSBhIHVzZXItcHJvdmlkZWQgXCJkaXNwbGF5TmFtZVwiXG4gICAgICAgICAgICAgICAgLy8gc3BsaWNlIGl0IGluIHRvIG1ha2UgdGhlIHN0YWNrIG1vcmUgcmVhZGFibGUuXG5cblxuICAgICAgICAgICAgICAgIGlmIChmbi5kaXNwbGF5TmFtZSAmJiBfZnJhbWUuaW5jbHVkZXMoJzxhbm9ueW1vdXM+JykpIHtcbiAgICAgICAgICAgICAgICAgIF9mcmFtZSA9IF9mcmFtZS5yZXBsYWNlKCc8YW5vbnltb3VzPicsIGZuLmRpc3BsYXlOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEZyYW1lQ2FjaGUuc2V0KGZuLCBfZnJhbWUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gLy8gUmV0dXJuIHRoZSBsaW5lIHdlIGZvdW5kLlxuXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gX2ZyYW1lO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IHdoaWxlIChzID49IDEgJiYgYyA+PSAwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICByZWVudHJ5ID0gZmFsc2U7XG5cbiAgICB7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZpb3VzRGlzcGF0Y2hlcjtcbiAgICAgIHJlZW5hYmxlTG9ncygpO1xuICAgIH1cblxuICAgIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZTtcbiAgfSAvLyBGYWxsYmFjayB0byBqdXN0IHVzaW5nIHRoZSBuYW1lIGlmIHdlIGNvdWxkbid0IG1ha2UgaXQgdGhyb3cuXG5cblxuICB2YXIgbmFtZSA9IGZuID8gZm4uZGlzcGxheU5hbWUgfHwgZm4ubmFtZSA6ICcnO1xuICB2YXIgc3ludGhldGljRnJhbWUgPSBuYW1lID8gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSkgOiAnJztcblxuICB7XG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIHN5bnRoZXRpY0ZyYW1lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3ludGhldGljRnJhbWU7XG59XG5mdW5jdGlvbiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZm4sIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGZhbHNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QoQ29tcG9uZW50KSB7XG4gIHZhciBwcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICByZXR1cm4gISEocHJvdG90eXBlICYmIHByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUsIHNvdXJjZSwgb3duZXJGbikge1xuXG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB7XG4gICAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZSh0eXBlLCBzaG91bGRDb25zdHJ1Y3QodHlwZSkpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUodHlwZSk7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlJyk7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2VMaXN0Jyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUodHlwZS5yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgLy8gTWVtbyBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLnR5cGUsIHNvdXJjZSwgb3duZXJGbik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSB0eXBlO1xuICAgICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gTGF6eSBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgICAgIHJldHVybiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoaW5pdChwYXlsb2FkKSwgc291cmNlLCBvd25lckZuKTtcbiAgICAgICAgICB9IGNhdGNoICh4KSB7fVxuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG52YXIgbG9nZ2VkVHlwZUZhaWx1cmVzID0ge307XG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcblxuZnVuY3Rpb24gc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCkge1xuICB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSwgZWxlbWVudC5fc291cmNlLCBvd25lciA/IG93bmVyLnR5cGUgOiBudWxsKTtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMS5zZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja1Byb3BUeXBlcyh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24sIGNvbXBvbmVudE5hbWUsIGVsZW1lbnQpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWUgVGhpcyBpcyBva2F5IGJ1dCBGbG93IGRvZXNuJ3Qga25vdyBpdC5cbiAgICB2YXIgaGFzID0gRnVuY3Rpb24uY2FsbC5iaW5kKGhhc093blByb3BlcnR5KTtcblxuICAgIGZvciAodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHtcbiAgICAgIGlmIChoYXModHlwZVNwZWNzLCB0eXBlU3BlY05hbWUpKSB7XG4gICAgICAgIHZhciBlcnJvciQxID0gdm9pZCAwOyAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuXG4gICAgICAgIC8vIEFmdGVyIHRoZXNlIGhhdmUgYmVlbiBjbGVhbmVkIHVwLCB3ZSdsbCBsZXQgdGhlbSB0aHJvdy5cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhbiBpbnZhcmlhbnQgdGhhdCBnZXRzIGNhdWdodC4gSXQncyB0aGUgc2FtZVxuICAgICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS5cbiAgICAgICAgICBpZiAodHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgICAgICAgdmFyIGVyciA9IEVycm9yKChjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycpICsgJzogJyArIGxvY2F0aW9uICsgJyB0eXBlIGAnICsgdHlwZVNwZWNOYW1lICsgJ2AgaXMgaW52YWxpZDsgJyArICdpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UsIGJ1dCByZWNlaXZlZCBgJyArIHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSArICdgLicgKyAnVGhpcyBvZnRlbiBoYXBwZW5zIGJlY2F1c2Ugb2YgdHlwb3Mgc3VjaCBhcyBgUHJvcFR5cGVzLmZ1bmN0aW9uYCBpbnN0ZWFkIG9mIGBQcm9wVHlwZXMuZnVuY2AuJyk7XG4gICAgICAgICAgICBlcnIubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlcnJvciQxID0gdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0odmFsdWVzLCB0eXBlU3BlY05hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBudWxsLCAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnKTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICBlcnJvciQxID0gZXg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IkMSAmJiAhKGVycm9yJDEgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgIGVycm9yKCclczogdHlwZSBzcGVjaWZpY2F0aW9uIG9mICVzJyArICcgYCVzYCBpcyBpbnZhbGlkOyB0aGUgdHlwZSBjaGVja2VyICcgKyAnZnVuY3Rpb24gbXVzdCByZXR1cm4gYG51bGxgIG9yIGFuIGBFcnJvcmAgYnV0IHJldHVybmVkIGEgJXMuICcgKyAnWW91IG1heSBoYXZlIGZvcmdvdHRlbiB0byBwYXNzIGFuIGFyZ3VtZW50IHRvIHRoZSB0eXBlIGNoZWNrZXIgJyArICdjcmVhdG9yIChhcnJheU9mLCBpbnN0YW5jZU9mLCBvYmplY3RPZiwgb25lT2YsIG9uZU9mVHlwZSwgYW5kICcgKyAnc2hhcGUgYWxsIHJlcXVpcmUgYW4gYXJndW1lbnQpLicsIGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJywgbG9jYXRpb24sIHR5cGVTcGVjTmFtZSwgdHlwZW9mIGVycm9yJDEpO1xuXG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IkMSBpbnN0YW5jZW9mIEVycm9yICYmICEoZXJyb3IkMS5tZXNzYWdlIGluIGxvZ2dlZFR5cGVGYWlsdXJlcykpIHtcbiAgICAgICAgICAvLyBPbmx5IG1vbml0b3IgdGhpcyBmYWlsdXJlIG9uY2UgYmVjYXVzZSB0aGVyZSB0ZW5kcyB0byBiZSBhIGxvdCBvZiB0aGVcbiAgICAgICAgICAvLyBzYW1lIGVycm9yLlxuICAgICAgICAgIGxvZ2dlZFR5cGVGYWlsdXJlc1tlcnJvciQxLm1lc3NhZ2VdID0gdHJ1ZTtcbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgIGVycm9yKCdGYWlsZWQgJXMgdHlwZTogJXMnLCBsb2NhdGlvbiwgZXJyb3IkMS5tZXNzYWdlKTtcblxuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZWxlbWVudCkge1xuICB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSwgZWxlbWVudC5fc291cmNlLCBvd25lciA/IG93bmVyLnR5cGUgOiBudWxsKTtcbiAgICAgIHNldEV4dHJhU3RhY2tGcmFtZShzdGFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldEV4dHJhU3RhY2tGcmFtZShudWxsKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIHByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duO1xuXG57XG4gIHByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpIHtcbiAgaWYgKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQpIHtcbiAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnR5cGUpO1xuXG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIHJldHVybiAnXFxuXFxuQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBuYW1lICsgJ2AuJztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtKHNvdXJjZSkge1xuICBpZiAoc291cmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgZmlsZU5hbWUgPSBzb3VyY2UuZmlsZU5hbWUucmVwbGFjZSgvXi4qW1xcXFxcXC9dLywgJycpO1xuICAgIHZhciBsaW5lTnVtYmVyID0gc291cmNlLmxpbmVOdW1iZXI7XG4gICAgcmV0dXJuICdcXG5cXG5DaGVjayB5b3VyIGNvZGUgYXQgJyArIGZpbGVOYW1lICsgJzonICsgbGluZU51bWJlciArICcuJztcbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gZ2V0U291cmNlSW5mb0Vycm9yQWRkZW5kdW1Gb3JQcm9wcyhlbGVtZW50UHJvcHMpIHtcbiAgaWYgKGVsZW1lbnRQcm9wcyAhPT0gbnVsbCAmJiBlbGVtZW50UHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bShlbGVtZW50UHJvcHMuX19zb3VyY2UpO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuLyoqXG4gKiBXYXJuIGlmIHRoZXJlJ3Mgbm8ga2V5IGV4cGxpY2l0bHkgc2V0IG9uIGR5bmFtaWMgYXJyYXlzIG9mIGNoaWxkcmVuIG9yXG4gKiBvYmplY3Qga2V5cyBhcmUgbm90IHZhbGlkLiBUaGlzIGFsbG93cyB1cyB0byBrZWVwIHRyYWNrIG9mIGNoaWxkcmVuIGJldHdlZW5cbiAqIHVwZGF0ZXMuXG4gKi9cblxuXG52YXIgb3duZXJIYXNLZXlVc2VXYXJuaW5nID0ge307XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSkge1xuICB2YXIgaW5mbyA9IGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpO1xuXG4gIGlmICghaW5mbykge1xuICAgIHZhciBwYXJlbnROYW1lID0gdHlwZW9mIHBhcmVudFR5cGUgPT09ICdzdHJpbmcnID8gcGFyZW50VHlwZSA6IHBhcmVudFR5cGUuZGlzcGxheU5hbWUgfHwgcGFyZW50VHlwZS5uYW1lO1xuXG4gICAgaWYgKHBhcmVudE5hbWUpIHtcbiAgICAgIGluZm8gPSBcIlxcblxcbkNoZWNrIHRoZSB0b3AtbGV2ZWwgcmVuZGVyIGNhbGwgdXNpbmcgPFwiICsgcGFyZW50TmFtZSArIFwiPi5cIjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaW5mbztcbn1cbi8qKlxuICogV2FybiBpZiB0aGUgZWxlbWVudCBkb2Vzbid0IGhhdmUgYW4gZXhwbGljaXQga2V5IGFzc2lnbmVkIHRvIGl0LlxuICogVGhpcyBlbGVtZW50IGlzIGluIGFuIGFycmF5LiBUaGUgYXJyYXkgY291bGQgZ3JvdyBhbmQgc2hyaW5rIG9yIGJlXG4gKiByZW9yZGVyZWQuIEFsbCBjaGlsZHJlbiB0aGF0IGhhdmVuJ3QgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBhcmUgcmVxdWlyZWQgdG9cbiAqIGhhdmUgYSBcImtleVwiIHByb3BlcnR5IGFzc2lnbmVkIHRvIGl0LiBFcnJvciBzdGF0dXNlcyBhcmUgY2FjaGVkIHNvIGEgd2FybmluZ1xuICogd2lsbCBvbmx5IGJlIHNob3duIG9uY2UuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudCBFbGVtZW50IHRoYXQgcmVxdWlyZXMgYSBrZXkuXG4gKiBAcGFyYW0geyp9IHBhcmVudFR5cGUgZWxlbWVudCdzIHBhcmVudCdzIHR5cGUuXG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZUV4cGxpY2l0S2V5KGVsZW1lbnQsIHBhcmVudFR5cGUpIHtcbiAgaWYgKCFlbGVtZW50Ll9zdG9yZSB8fCBlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgfHwgZWxlbWVudC5rZXkgIT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG4gIHZhciBjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvID0gZ2V0Q3VycmVudENvbXBvbmVudEVycm9ySW5mbyhwYXJlbnRUeXBlKTtcblxuICBpZiAob3duZXJIYXNLZXlVc2VXYXJuaW5nW2N1cnJlbnRDb21wb25lbnRFcnJvckluZm9dKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgb3duZXJIYXNLZXlVc2VXYXJuaW5nW2N1cnJlbnRDb21wb25lbnRFcnJvckluZm9dID0gdHJ1ZTsgLy8gVXN1YWxseSB0aGUgY3VycmVudCBvd25lciBpcyB0aGUgb2ZmZW5kZXIsIGJ1dCBpZiBpdCBhY2NlcHRzIGNoaWxkcmVuIGFzIGFcbiAgLy8gcHJvcGVydHksIGl0IG1heSBiZSB0aGUgY3JlYXRvciBvZiB0aGUgY2hpbGQgdGhhdCdzIHJlc3BvbnNpYmxlIGZvclxuICAvLyBhc3NpZ25pbmcgaXQgYSBrZXkuXG5cbiAgdmFyIGNoaWxkT3duZXIgPSAnJztcblxuICBpZiAoZWxlbWVudCAmJiBlbGVtZW50Ll9vd25lciAmJiBlbGVtZW50Ll9vd25lciAhPT0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkge1xuICAgIC8vIEdpdmUgdGhlIGNvbXBvbmVudCB0aGF0IG9yaWdpbmFsbHkgY3JlYXRlZCB0aGlzIGNoaWxkLlxuICAgIGNoaWxkT3duZXIgPSBcIiBJdCB3YXMgcGFzc2VkIGEgY2hpbGQgZnJvbSBcIiArIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShlbGVtZW50Ll9vd25lci50eXBlKSArIFwiLlwiO1xuICB9XG5cbiAge1xuICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZWxlbWVudCk7XG5cbiAgICBlcnJvcignRWFjaCBjaGlsZCBpbiBhIGxpc3Qgc2hvdWxkIGhhdmUgYSB1bmlxdWUgXCJrZXlcIiBwcm9wLicgKyAnJXMlcyBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3dhcm5pbmcta2V5cyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nLCBjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvLCBjaGlsZE93bmVyKTtcblxuICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEobnVsbCk7XG4gIH1cbn1cbi8qKlxuICogRW5zdXJlIHRoYXQgZXZlcnkgZWxlbWVudCBlaXRoZXIgaXMgcGFzc2VkIGluIGEgc3RhdGljIGxvY2F0aW9uLCBpbiBhblxuICogYXJyYXkgd2l0aCBhbiBleHBsaWNpdCBrZXlzIHByb3BlcnR5IGRlZmluZWQsIG9yIGluIGFuIG9iamVjdCBsaXRlcmFsXG4gKiB3aXRoIHZhbGlkIGtleSBwcm9wZXJ0eS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqIEBwYXJhbSB7UmVhY3ROb2RlfSBub2RlIFN0YXRpY2FsbHkgcGFzc2VkIGNoaWxkIG9mIGFueSB0eXBlLlxuICogQHBhcmFtIHsqfSBwYXJlbnRUeXBlIG5vZGUncyBwYXJlbnQncyB0eXBlLlxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVDaGlsZEtleXMobm9kZSwgcGFyZW50VHlwZSkge1xuICBpZiAodHlwZW9mIG5vZGUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGlzQXJyYXkobm9kZSkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjaGlsZCA9IG5vZGVbaV07XG5cbiAgICAgIGlmIChpc1ZhbGlkRWxlbWVudChjaGlsZCkpIHtcbiAgICAgICAgdmFsaWRhdGVFeHBsaWNpdEtleShjaGlsZCwgcGFyZW50VHlwZSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzVmFsaWRFbGVtZW50KG5vZGUpKSB7XG4gICAgLy8gVGhpcyBlbGVtZW50IHdhcyBwYXNzZWQgaW4gYSB2YWxpZCBsb2NhdGlvbi5cbiAgICBpZiAobm9kZS5fc3RvcmUpIHtcbiAgICAgIG5vZGUuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG4gICAgfVxuICB9IGVsc2UgaWYgKG5vZGUpIHtcbiAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4obm9kZSk7XG5cbiAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIEVudHJ5IGl0ZXJhdG9ycyB1c2VkIHRvIHByb3ZpZGUgaW1wbGljaXQga2V5cyxcbiAgICAgIC8vIGJ1dCBub3cgd2UgcHJpbnQgYSBzZXBhcmF0ZSB3YXJuaW5nIGZvciB0aGVtIGxhdGVyLlxuICAgICAgaWYgKGl0ZXJhdG9yRm4gIT09IG5vZGUuZW50cmllcykge1xuICAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwobm9kZSk7XG4gICAgICAgIHZhciBzdGVwO1xuXG4gICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICBpZiAoaXNWYWxpZEVsZW1lbnQoc3RlcC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHZhbGlkYXRlRXhwbGljaXRLZXkoc3RlcC52YWx1ZSwgcGFyZW50VHlwZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEdpdmVuIGFuIGVsZW1lbnQsIHZhbGlkYXRlIHRoYXQgaXRzIHByb3BzIGZvbGxvdyB0aGUgcHJvcFR5cGVzIGRlZmluaXRpb24sXG4gKiBwcm92aWRlZCBieSB0aGUgdHlwZS5cbiAqXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudFxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wVHlwZXMoZWxlbWVudCkge1xuICB7XG4gICAgdmFyIHR5cGUgPSBlbGVtZW50LnR5cGU7XG5cbiAgICBpZiAodHlwZSA9PT0gbnVsbCB8fCB0eXBlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHByb3BUeXBlcztcblxuICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcHJvcFR5cGVzID0gdHlwZS5wcm9wVHlwZXM7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgLy8gTm90ZTogTWVtbyBvbmx5IGNoZWNrcyBvdXRlciBwcm9wcyBoZXJlLlxuICAgIC8vIElubmVyIHByb3BzIGFyZSBjaGVja2VkIGluIHRoZSByZWNvbmNpbGVyLlxuICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSkpIHtcbiAgICAgIHByb3BUeXBlcyA9IHR5cGUucHJvcFR5cGVzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHByb3BUeXBlcykge1xuICAgICAgLy8gSW50ZW50aW9uYWxseSBpbnNpZGUgdG8gYXZvaWQgdHJpZ2dlcmluZyBsYXp5IGluaXRpYWxpemVyczpcbiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpO1xuICAgICAgY2hlY2tQcm9wVHlwZXMocHJvcFR5cGVzLCBlbGVtZW50LnByb3BzLCAncHJvcCcsIG5hbWUsIGVsZW1lbnQpO1xuICAgIH0gZWxzZSBpZiAodHlwZS5Qcm9wVHlwZXMgIT09IHVuZGVmaW5lZCAmJiAhcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd24pIHtcbiAgICAgIHByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duID0gdHJ1ZTsgLy8gSW50ZW50aW9uYWxseSBpbnNpZGUgdG8gYXZvaWQgdHJpZ2dlcmluZyBsYXp5IGluaXRpYWxpemVyczpcblxuICAgICAgdmFyIF9uYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpO1xuXG4gICAgICBlcnJvcignQ29tcG9uZW50ICVzIGRlY2xhcmVkIGBQcm9wVHlwZXNgIGluc3RlYWQgb2YgYHByb3BUeXBlc2AuIERpZCB5b3UgbWlzc3BlbGwgdGhlIHByb3BlcnR5IGFzc2lnbm1lbnQ/JywgX25hbWUgfHwgJ1Vua25vd24nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHR5cGUuZ2V0RGVmYXVsdFByb3BzID09PSAnZnVuY3Rpb24nICYmICF0eXBlLmdldERlZmF1bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZCkge1xuICAgICAgZXJyb3IoJ2dldERlZmF1bHRQcm9wcyBpcyBvbmx5IHVzZWQgb24gY2xhc3NpYyBSZWFjdC5jcmVhdGVDbGFzcyAnICsgJ2RlZmluaXRpb25zLiBVc2UgYSBzdGF0aWMgcHJvcGVydHkgbmFtZWQgYGRlZmF1bHRQcm9wc2AgaW5zdGVhZC4nKTtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogR2l2ZW4gYSBmcmFnbWVudCwgdmFsaWRhdGUgdGhhdCBpdCBjYW4gb25seSBiZSBwcm92aWRlZCB3aXRoIGZyYWdtZW50IHByb3BzXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZnJhZ21lbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlRnJhZ21lbnRQcm9wcyhmcmFnbWVudCkge1xuICB7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhmcmFnbWVudC5wcm9wcyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuXG4gICAgICBpZiAoa2V5ICE9PSAnY2hpbGRyZW4nICYmIGtleSAhPT0gJ2tleScpIHtcbiAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShmcmFnbWVudCk7XG5cbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgcHJvcCBgJXNgIHN1cHBsaWVkIHRvIGBSZWFjdC5GcmFnbWVudGAuICcgKyAnUmVhY3QuRnJhZ21lbnQgY2FuIG9ubHkgaGF2ZSBga2V5YCBhbmQgYGNoaWxkcmVuYCBwcm9wcy4nLCBrZXkpO1xuXG4gICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEobnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmcmFnbWVudC5yZWYgIT09IG51bGwpIHtcbiAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZnJhZ21lbnQpO1xuXG4gICAgICBlcnJvcignSW52YWxpZCBhdHRyaWJ1dGUgYHJlZmAgc3VwcGxpZWQgdG8gYFJlYWN0LkZyYWdtZW50YC4nKTtcblxuICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShudWxsKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRXaXRoVmFsaWRhdGlvbih0eXBlLCBwcm9wcywgY2hpbGRyZW4pIHtcbiAgdmFyIHZhbGlkVHlwZSA9IGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKTsgLy8gV2Ugd2FybiBpbiB0aGlzIGNhc2UgYnV0IGRvbid0IHRocm93LiBXZSBleHBlY3QgdGhlIGVsZW1lbnQgY3JlYXRpb24gdG9cbiAgLy8gc3VjY2VlZCBhbmQgdGhlcmUgd2lsbCBsaWtlbHkgYmUgZXJyb3JzIGluIHJlbmRlci5cblxuICBpZiAoIXZhbGlkVHlwZSkge1xuICAgIHZhciBpbmZvID0gJyc7XG5cbiAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsICYmIE9iamVjdC5rZXlzKHR5cGUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaW5mbyArPSAnIFlvdSBsaWtlbHkgZm9yZ290IHRvIGV4cG9ydCB5b3VyIGNvbXBvbmVudCBmcm9tIHRoZSBmaWxlICcgKyBcIml0J3MgZGVmaW5lZCBpbiwgb3IgeW91IG1pZ2h0IGhhdmUgbWl4ZWQgdXAgZGVmYXVsdCBhbmQgbmFtZWQgaW1wb3J0cy5cIjtcbiAgICB9XG5cbiAgICB2YXIgc291cmNlSW5mbyA9IGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtRm9yUHJvcHMocHJvcHMpO1xuXG4gICAgaWYgKHNvdXJjZUluZm8pIHtcbiAgICAgIGluZm8gKz0gc291cmNlSW5mbztcbiAgICB9IGVsc2Uge1xuICAgICAgaW5mbyArPSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKTtcbiAgICB9XG5cbiAgICB2YXIgdHlwZVN0cmluZztcblxuICAgIGlmICh0eXBlID09PSBudWxsKSB7XG4gICAgICB0eXBlU3RyaW5nID0gJ251bGwnO1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheSh0eXBlKSkge1xuICAgICAgdHlwZVN0cmluZyA9ICdhcnJheSc7XG4gICAgfSBlbHNlIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFKSB7XG4gICAgICB0eXBlU3RyaW5nID0gXCI8XCIgKyAoZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUudHlwZSkgfHwgJ1Vua25vd24nKSArIFwiIC8+XCI7XG4gICAgICBpbmZvID0gJyBEaWQgeW91IGFjY2lkZW50YWxseSBleHBvcnQgYSBKU1ggbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgY29tcG9uZW50Pyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHR5cGVTdHJpbmcgPSB0eXBlb2YgdHlwZTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBlcnJvcignUmVhY3QuY3JlYXRlRWxlbWVudDogdHlwZSBpcyBpbnZhbGlkIC0tIGV4cGVjdGVkIGEgc3RyaW5nIChmb3IgJyArICdidWlsdC1pbiBjb21wb25lbnRzKSBvciBhIGNsYXNzL2Z1bmN0aW9uIChmb3IgY29tcG9zaXRlICcgKyAnY29tcG9uZW50cykgYnV0IGdvdDogJXMuJXMnLCB0eXBlU3RyaW5nLCBpbmZvKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gVGhlIHJlc3VsdCBjYW4gYmUgbnVsbGlzaCBpZiBhIG1vY2sgb3IgYSBjdXN0b20gZnVuY3Rpb24gaXMgdXNlZC5cbiAgLy8gVE9ETzogRHJvcCB0aGlzIHdoZW4gdGhlc2UgYXJlIG5vIGxvbmdlciBhbGxvd2VkIGFzIHRoZSB0eXBlIGFyZ3VtZW50LlxuXG4gIGlmIChlbGVtZW50ID09IG51bGwpIHtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfSAvLyBTa2lwIGtleSB3YXJuaW5nIGlmIHRoZSB0eXBlIGlzbid0IHZhbGlkIHNpbmNlIG91ciBrZXkgdmFsaWRhdGlvbiBsb2dpY1xuICAvLyBkb2Vzbid0IGV4cGVjdCBhIG5vbi1zdHJpbmcvZnVuY3Rpb24gdHlwZSBhbmQgY2FuIHRocm93IGNvbmZ1c2luZyBlcnJvcnMuXG4gIC8vIFdlIGRvbid0IHdhbnQgZXhjZXB0aW9uIGJlaGF2aW9yIHRvIGRpZmZlciBiZXR3ZWVuIGRldiBhbmQgcHJvZC5cbiAgLy8gKFJlbmRlcmluZyB3aWxsIHRocm93IHdpdGggYSBoZWxwZnVsIG1lc3NhZ2UgYW5kIGFzIHNvb24gYXMgdGhlIHR5cGUgaXNcbiAgLy8gZml4ZWQsIHRoZSBrZXkgd2FybmluZ3Mgd2lsbCBhcHBlYXIuKVxuXG5cbiAgaWYgKHZhbGlkVHlwZSkge1xuICAgIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWxpZGF0ZUNoaWxkS2V5cyhhcmd1bWVudHNbaV0sIHR5cGUpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFKSB7XG4gICAgdmFsaWRhdGVGcmFnbWVudFByb3BzKGVsZW1lbnQpO1xuICB9IGVsc2Uge1xuICAgIHZhbGlkYXRlUHJvcFR5cGVzKGVsZW1lbnQpO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG52YXIgZGlkV2FybkFib3V0RGVwcmVjYXRlZENyZWF0ZUZhY3RvcnkgPSBmYWxzZTtcbmZ1bmN0aW9uIGNyZWF0ZUZhY3RvcnlXaXRoVmFsaWRhdGlvbih0eXBlKSB7XG4gIHZhciB2YWxpZGF0ZWRGYWN0b3J5ID0gY3JlYXRlRWxlbWVudFdpdGhWYWxpZGF0aW9uLmJpbmQobnVsbCwgdHlwZSk7XG4gIHZhbGlkYXRlZEZhY3RvcnkudHlwZSA9IHR5cGU7XG5cbiAge1xuICAgIGlmICghZGlkV2FybkFib3V0RGVwcmVjYXRlZENyZWF0ZUZhY3RvcnkpIHtcbiAgICAgIGRpZFdhcm5BYm91dERlcHJlY2F0ZWRDcmVhdGVGYWN0b3J5ID0gdHJ1ZTtcblxuICAgICAgd2FybignUmVhY3QuY3JlYXRlRmFjdG9yeSgpIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAnICsgJ2EgZnV0dXJlIG1ham9yIHJlbGVhc2UuIENvbnNpZGVyIHVzaW5nIEpTWCAnICsgJ29yIHVzZSBSZWFjdC5jcmVhdGVFbGVtZW50KCkgZGlyZWN0bHkgaW5zdGVhZC4nKTtcbiAgICB9IC8vIExlZ2FjeSBob29rOiByZW1vdmUgaXRcblxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHZhbGlkYXRlZEZhY3RvcnksICd0eXBlJywge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2FybignRmFjdG9yeS50eXBlIGlzIGRlcHJlY2F0ZWQuIEFjY2VzcyB0aGUgY2xhc3MgZGlyZWN0bHkgJyArICdiZWZvcmUgcGFzc2luZyBpdCB0byBjcmVhdGVGYWN0b3J5LicpO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAndHlwZScsIHtcbiAgICAgICAgICB2YWx1ZTogdHlwZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVkRmFjdG9yeTtcbn1cbmZ1bmN0aW9uIGNsb25lRWxlbWVudFdpdGhWYWxpZGF0aW9uKGVsZW1lbnQsIHByb3BzLCBjaGlsZHJlbikge1xuICB2YXIgbmV3RWxlbWVudCA9IGNsb25lRWxlbWVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFsaWRhdGVDaGlsZEtleXMoYXJndW1lbnRzW2ldLCBuZXdFbGVtZW50LnR5cGUpO1xuICB9XG5cbiAgdmFsaWRhdGVQcm9wVHlwZXMobmV3RWxlbWVudCk7XG4gIHJldHVybiBuZXdFbGVtZW50O1xufVxuXG5mdW5jdGlvbiBzdGFydFRyYW5zaXRpb24oc2NvcGUsIG9wdGlvbnMpIHtcbiAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbjtcbiAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbiA9IHt9O1xuICB2YXIgY3VycmVudFRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uO1xuXG4gIHtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uLl91cGRhdGVkRmliZXJzID0gbmV3IFNldCgpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBzY29wZSgpO1xuICB9IGZpbmFsbHkge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcblxuICAgIHtcbiAgICAgIGlmIChwcmV2VHJhbnNpdGlvbiA9PT0gbnVsbCAmJiBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycykge1xuICAgICAgICB2YXIgdXBkYXRlZEZpYmVyc0NvdW50ID0gY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMuc2l6ZTtcblxuICAgICAgICBpZiAodXBkYXRlZEZpYmVyc0NvdW50ID4gMTApIHtcbiAgICAgICAgICB3YXJuKCdEZXRlY3RlZCBhIGxhcmdlIG51bWJlciBvZiB1cGRhdGVzIGluc2lkZSBzdGFydFRyYW5zaXRpb24uICcgKyAnSWYgdGhpcyBpcyBkdWUgdG8gYSBzdWJzY3JpcHRpb24gcGxlYXNlIHJlLXdyaXRlIGl0IHRvIHVzZSBSZWFjdCBwcm92aWRlZCBob29rcy4gJyArICdPdGhlcndpc2UgY29uY3VycmVudCBtb2RlIGd1YXJhbnRlZXMgYXJlIG9mZiB0aGUgdGFibGUuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycy5jbGVhcigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgZGlkV2FybkFib3V0TWVzc2FnZUNoYW5uZWwgPSBmYWxzZTtcbnZhciBlbnF1ZXVlVGFza0ltcGwgPSBudWxsO1xuZnVuY3Rpb24gZW5xdWV1ZVRhc2sodGFzaykge1xuICBpZiAoZW5xdWV1ZVRhc2tJbXBsID09PSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIHJlYWQgcmVxdWlyZSBvZmYgdGhlIG1vZHVsZSBvYmplY3QgdG8gZ2V0IGFyb3VuZCB0aGUgYnVuZGxlcnMuXG4gICAgICAvLyB3ZSBkb24ndCB3YW50IHRoZW0gdG8gZGV0ZWN0IGEgcmVxdWlyZSBhbmQgYnVuZGxlIGEgTm9kZSBwb2x5ZmlsbC5cbiAgICAgIHZhciByZXF1aXJlU3RyaW5nID0gKCdyZXF1aXJlJyArIE1hdGgucmFuZG9tKCkpLnNsaWNlKDAsIDcpO1xuICAgICAgdmFyIG5vZGVSZXF1aXJlID0gbW9kdWxlICYmIG1vZHVsZVtyZXF1aXJlU3RyaW5nXTsgLy8gYXNzdW1pbmcgd2UncmUgaW4gbm9kZSwgbGV0J3MgdHJ5IHRvIGdldCBub2RlJ3NcbiAgICAgIC8vIHZlcnNpb24gb2Ygc2V0SW1tZWRpYXRlLCBieXBhc3NpbmcgZmFrZSB0aW1lcnMgaWYgYW55LlxuXG4gICAgICBlbnF1ZXVlVGFza0ltcGwgPSBub2RlUmVxdWlyZS5jYWxsKG1vZHVsZSwgJ3RpbWVycycpLnNldEltbWVkaWF0ZTtcbiAgICB9IGNhdGNoIChfZXJyKSB7XG4gICAgICAvLyB3ZSdyZSBpbiBhIGJyb3dzZXJcbiAgICAgIC8vIHdlIGNhbid0IHVzZSByZWd1bGFyIHRpbWVycyBiZWNhdXNlIHRoZXkgbWF5IHN0aWxsIGJlIGZha2VkXG4gICAgICAvLyBzbyB3ZSB0cnkgTWVzc2FnZUNoYW5uZWwrcG9zdE1lc3NhZ2UgaW5zdGVhZFxuICAgICAgZW5xdWV1ZVRhc2tJbXBsID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoZGlkV2FybkFib3V0TWVzc2FnZUNoYW5uZWwgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBkaWRXYXJuQWJvdXRNZXNzYWdlQ2hhbm5lbCA9IHRydWU7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgTWVzc2FnZUNoYW5uZWwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIGVycm9yKCdUaGlzIGJyb3dzZXIgZG9lcyBub3QgaGF2ZSBhIE1lc3NhZ2VDaGFubmVsIGltcGxlbWVudGF0aW9uLCAnICsgJ3NvIGVucXVldWluZyB0YXNrcyB2aWEgYXdhaXQgYWN0KGFzeW5jICgpID0+IC4uLikgd2lsbCBmYWlsLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMgJyArICdpZiB5b3UgZW5jb3VudGVyIHRoaXMgd2FybmluZy4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgICAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGNhbGxiYWNrO1xuICAgICAgICBjaGFubmVsLnBvcnQyLnBvc3RNZXNzYWdlKHVuZGVmaW5lZCk7XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlbnF1ZXVlVGFza0ltcGwodGFzayk7XG59XG5cbnZhciBhY3RTY29wZURlcHRoID0gMDtcbnZhciBkaWRXYXJuTm9Bd2FpdEFjdCA9IGZhbHNlO1xuZnVuY3Rpb24gYWN0KGNhbGxiYWNrKSB7XG4gIHtcbiAgICAvLyBgYWN0YCBjYWxscyBjYW4gYmUgbmVzdGVkLCBzbyB3ZSB0cmFjayB0aGUgZGVwdGguIFRoaXMgcmVwcmVzZW50cyB0aGVcbiAgICAvLyBudW1iZXIgb2YgYGFjdGAgc2NvcGVzIG9uIHRoZSBzdGFjay5cbiAgICB2YXIgcHJldkFjdFNjb3BlRGVwdGggPSBhY3RTY29wZURlcHRoO1xuICAgIGFjdFNjb3BlRGVwdGgrKztcblxuICAgIGlmIChSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBvdXRlcm1vc3QgYGFjdGAgc2NvcGUuIEluaXRpYWxpemUgdGhlIHF1ZXVlLiBUaGUgcmVjb25jaWxlclxuICAgICAgLy8gd2lsbCBkZXRlY3QgdGhlIHF1ZXVlIGFuZCB1c2UgaXQgaW5zdGVhZCBvZiBTY2hlZHVsZXIuXG4gICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID0gW107XG4gICAgfVxuXG4gICAgdmFyIHByZXZJc0JhdGNoaW5nTGVnYWN5ID0gUmVhY3RDdXJyZW50QWN0UXVldWUuaXNCYXRjaGluZ0xlZ2FjeTtcbiAgICB2YXIgcmVzdWx0O1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFVzZWQgdG8gcmVwcm9kdWNlIGJlaGF2aW9yIG9mIGBiYXRjaGVkVXBkYXRlc2AgaW4gbGVnYWN5IG1vZGUuIE9ubHlcbiAgICAgIC8vIHNldCB0byBgdHJ1ZWAgd2hpbGUgdGhlIGdpdmVuIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLCBub3QgZm9yIHVwZGF0ZXNcbiAgICAgIC8vIHRyaWdnZXJlZCBkdXJpbmcgYW4gYXN5bmMgZXZlbnQsIGJlY2F1c2UgdGhpcyBpcyBob3cgdGhlIGxlZ2FjeVxuICAgICAgLy8gaW1wbGVtZW50YXRpb24gb2YgYGFjdGAgYmVoYXZlZC5cbiAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmlzQmF0Y2hpbmdMZWdhY3kgPSB0cnVlO1xuICAgICAgcmVzdWx0ID0gY2FsbGJhY2soKTsgLy8gUmVwbGljYXRlIGJlaGF2aW9yIG9mIG9yaWdpbmFsIGBhY3RgIGltcGxlbWVudGF0aW9uIGluIGxlZ2FjeSBtb2RlLFxuICAgICAgLy8gd2hpY2ggZmx1c2hlZCB1cGRhdGVzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBzY29wZSBmdW5jdGlvbiBleGl0cywgZXZlblxuICAgICAgLy8gaWYgaXQncyBhbiBhc3luYyBmdW5jdGlvbi5cblxuICAgICAgaWYgKCFwcmV2SXNCYXRjaGluZ0xlZ2FjeSAmJiBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5kaWRTY2hlZHVsZUxlZ2FjeVVwZGF0ZSkge1xuICAgICAgICB2YXIgcXVldWUgPSBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50O1xuXG4gICAgICAgIGlmIChxdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmRpZFNjaGVkdWxlTGVnYWN5VXBkYXRlID0gZmFsc2U7XG4gICAgICAgICAgZmx1c2hBY3RRdWV1ZShxdWV1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcG9wQWN0U2NvcGUocHJldkFjdFNjb3BlRGVwdGgpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmlzQmF0Y2hpbmdMZWdhY3kgPSBwcmV2SXNCYXRjaGluZ0xlZ2FjeTtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0ICE9PSBudWxsICYmIHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnICYmIHR5cGVvZiByZXN1bHQudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHRoZW5hYmxlUmVzdWx0ID0gcmVzdWx0OyAvLyBUaGUgY2FsbGJhY2sgaXMgYW4gYXN5bmMgZnVuY3Rpb24gKGkuZS4gcmV0dXJuZWQgYSBwcm9taXNlKS4gV2FpdFxuICAgICAgLy8gZm9yIGl0IHRvIHJlc29sdmUgYmVmb3JlIGV4aXRpbmcgdGhlIGN1cnJlbnQgc2NvcGUuXG5cbiAgICAgIHZhciB3YXNBd2FpdGVkID0gZmFsc2U7XG4gICAgICB2YXIgdGhlbmFibGUgPSB7XG4gICAgICAgIHRoZW46IGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICB3YXNBd2FpdGVkID0gdHJ1ZTtcbiAgICAgICAgICB0aGVuYWJsZVJlc3VsdC50aGVuKGZ1bmN0aW9uIChyZXR1cm5WYWx1ZSkge1xuICAgICAgICAgICAgcG9wQWN0U2NvcGUocHJldkFjdFNjb3BlRGVwdGgpO1xuXG4gICAgICAgICAgICBpZiAoYWN0U2NvcGVEZXB0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAvLyBXZSd2ZSBleGl0ZWQgdGhlIG91dGVybW9zdCBhY3Qgc2NvcGUuIFJlY3Vyc2l2ZWx5IGZsdXNoIHRoZVxuICAgICAgICAgICAgICAvLyBxdWV1ZSB1bnRpbCB0aGVyZSdzIG5vIHJlbWFpbmluZyB3b3JrLlxuICAgICAgICAgICAgICByZWN1cnNpdmVseUZsdXNoQXN5bmNBY3RXb3JrKHJldHVyblZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShyZXR1cm5WYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBUaGUgY2FsbGJhY2sgdGhyZXcgYW4gZXJyb3IuXG4gICAgICAgICAgICBwb3BBY3RTY29wZShwcmV2QWN0U2NvcGVEZXB0aCk7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB7XG4gICAgICAgIGlmICghZGlkV2Fybk5vQXdhaXRBY3QgJiYgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7fSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIXdhc0F3YWl0ZWQpIHtcbiAgICAgICAgICAgICAgZGlkV2Fybk5vQXdhaXRBY3QgPSB0cnVlO1xuXG4gICAgICAgICAgICAgIGVycm9yKCdZb3UgY2FsbGVkIGFjdChhc3luYyAoKSA9PiAuLi4pIHdpdGhvdXQgYXdhaXQuICcgKyAnVGhpcyBjb3VsZCBsZWFkIHRvIHVuZXhwZWN0ZWQgdGVzdGluZyBiZWhhdmlvdXIsICcgKyAnaW50ZXJsZWF2aW5nIG11bHRpcGxlIGFjdCBjYWxscyBhbmQgbWl4aW5nIHRoZWlyICcgKyAnc2NvcGVzLiAnICsgJ1lvdSBzaG91bGQgLSBhd2FpdCBhY3QoYXN5bmMgKCkgPT4gLi4uKTsnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhlbmFibGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciByZXR1cm5WYWx1ZSA9IHJlc3VsdDsgLy8gVGhlIGNhbGxiYWNrIGlzIG5vdCBhbiBhc3luYyBmdW5jdGlvbi4gRXhpdCB0aGUgY3VycmVudCBzY29wZVxuICAgICAgLy8gaW1tZWRpYXRlbHksIHdpdGhvdXQgYXdhaXRpbmcuXG5cbiAgICAgIHBvcEFjdFNjb3BlKHByZXZBY3RTY29wZURlcHRoKTtcblxuICAgICAgaWYgKGFjdFNjb3BlRGVwdGggPT09IDApIHtcbiAgICAgICAgLy8gRXhpdGluZyB0aGUgb3V0ZXJtb3N0IGFjdCBzY29wZS4gRmx1c2ggdGhlIHF1ZXVlLlxuICAgICAgICB2YXIgX3F1ZXVlID0gUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudDtcblxuICAgICAgICBpZiAoX3F1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgICAgZmx1c2hBY3RRdWV1ZShfcXVldWUpO1xuICAgICAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICB9IC8vIFJldHVybiBhIHRoZW5hYmxlLiBJZiB0aGUgdXNlciBhd2FpdHMgaXQsIHdlJ2xsIGZsdXNoIGFnYWluIGluXG4gICAgICAgIC8vIGNhc2UgYWRkaXRpb25hbCB3b3JrIHdhcyBzY2hlZHVsZWQgYnkgYSBtaWNyb3Rhc2suXG5cblxuICAgICAgICB2YXIgX3RoZW5hYmxlID0ge1xuICAgICAgICAgIHRoZW46IGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIC8vIENvbmZpcm0gd2UgaGF2ZW4ndCByZS1lbnRlcmVkIGFub3RoZXIgYGFjdGAgc2NvcGUsIGluIGNhc2VcbiAgICAgICAgICAgIC8vIHRoZSB1c2VyIGRvZXMgc29tZXRoaW5nIHdlaXJkIGxpa2UgYXdhaXQgdGhlIHRoZW5hYmxlXG4gICAgICAgICAgICAvLyBtdWx0aXBsZSB0aW1lcy5cbiAgICAgICAgICAgIGlmIChSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGZsdXNoIHRoZSBxdWV1ZSB1bnRpbCB0aGVyZSdzIG5vIHJlbWFpbmluZyB3b3JrLlxuICAgICAgICAgICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID0gW107XG4gICAgICAgICAgICAgIHJlY3Vyc2l2ZWx5Rmx1c2hBc3luY0FjdFdvcmsocmV0dXJuVmFsdWUsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXNvbHZlKHJldHVyblZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfdGhlbmFibGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBTaW5jZSB3ZSdyZSBpbnNpZGUgYSBuZXN0ZWQgYGFjdGAgc2NvcGUsIHRoZSByZXR1cm5lZCB0aGVuYWJsZVxuICAgICAgICAvLyBpbW1lZGlhdGVseSByZXNvbHZlcy4gVGhlIG91dGVyIHNjb3BlIHdpbGwgZmx1c2ggdGhlIHF1ZXVlLlxuICAgICAgICB2YXIgX3RoZW5hYmxlMiA9IHtcbiAgICAgICAgICB0aGVuOiBmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICByZXNvbHZlKHJldHVyblZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfdGhlbmFibGUyO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwb3BBY3RTY29wZShwcmV2QWN0U2NvcGVEZXB0aCkge1xuICB7XG4gICAgaWYgKHByZXZBY3RTY29wZURlcHRoICE9PSBhY3RTY29wZURlcHRoIC0gMSkge1xuICAgICAgZXJyb3IoJ1lvdSBzZWVtIHRvIGhhdmUgb3ZlcmxhcHBpbmcgYWN0KCkgY2FsbHMsIHRoaXMgaXMgbm90IHN1cHBvcnRlZC4gJyArICdCZSBzdXJlIHRvIGF3YWl0IHByZXZpb3VzIGFjdCgpIGNhbGxzIGJlZm9yZSBtYWtpbmcgYSBuZXcgb25lLiAnKTtcbiAgICB9XG5cbiAgICBhY3RTY29wZURlcHRoID0gcHJldkFjdFNjb3BlRGVwdGg7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVjdXJzaXZlbHlGbHVzaEFzeW5jQWN0V29yayhyZXR1cm5WYWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gIHtcbiAgICB2YXIgcXVldWUgPSBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50O1xuXG4gICAgaWYgKHF1ZXVlICE9PSBudWxsKSB7XG4gICAgICB0cnkge1xuICAgICAgICBmbHVzaEFjdFF1ZXVlKHF1ZXVlKTtcbiAgICAgICAgZW5xdWV1ZVRhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIE5vIGFkZGl0aW9uYWwgd29yayB3YXMgc2NoZWR1bGVkLiBGaW5pc2guXG4gICAgICAgICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc29sdmUocmV0dXJuVmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBLZWVwIGZsdXNoaW5nIHdvcmsgdW50aWwgdGhlcmUncyBub25lIGxlZnQuXG4gICAgICAgICAgICByZWN1cnNpdmVseUZsdXNoQXN5bmNBY3RXb3JrKHJldHVyblZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXNvbHZlKHJldHVyblZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIGlzRmx1c2hpbmcgPSBmYWxzZTtcblxuZnVuY3Rpb24gZmx1c2hBY3RRdWV1ZShxdWV1ZSkge1xuICB7XG4gICAgaWYgKCFpc0ZsdXNoaW5nKSB7XG4gICAgICAvLyBQcmV2ZW50IHJlLWVudHJhbmNlLlxuICAgICAgaXNGbHVzaGluZyA9IHRydWU7XG4gICAgICB2YXIgaSA9IDA7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBxdWV1ZVtpXTtcblxuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sodHJ1ZSk7XG4gICAgICAgICAgfSB3aGlsZSAoY2FsbGJhY2sgIT09IG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgcXVldWUubGVuZ3RoID0gMDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIElmIHNvbWV0aGluZyB0aHJvd3MsIGxlYXZlIHRoZSByZW1haW5pbmcgY2FsbGJhY2tzIG9uIHRoZSBxdWV1ZS5cbiAgICAgICAgcXVldWUgPSBxdWV1ZS5zbGljZShpICsgMSk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaXNGbHVzaGluZyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgY3JlYXRlRWxlbWVudCQxID0gIGNyZWF0ZUVsZW1lbnRXaXRoVmFsaWRhdGlvbiA7XG52YXIgY2xvbmVFbGVtZW50JDEgPSAgY2xvbmVFbGVtZW50V2l0aFZhbGlkYXRpb24gO1xudmFyIGNyZWF0ZUZhY3RvcnkgPSAgY3JlYXRlRmFjdG9yeVdpdGhWYWxpZGF0aW9uIDtcbnZhciBDaGlsZHJlbiA9IHtcbiAgbWFwOiBtYXBDaGlsZHJlbixcbiAgZm9yRWFjaDogZm9yRWFjaENoaWxkcmVuLFxuICBjb3VudDogY291bnRDaGlsZHJlbixcbiAgdG9BcnJheTogdG9BcnJheSxcbiAgb25seTogb25seUNoaWxkXG59O1xuXG5leHBvcnRzLkNoaWxkcmVuID0gQ2hpbGRyZW47XG5leHBvcnRzLkNvbXBvbmVudCA9IENvbXBvbmVudDtcbmV4cG9ydHMuRnJhZ21lbnQgPSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xuZXhwb3J0cy5Qcm9maWxlciA9IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG5leHBvcnRzLlB1cmVDb21wb25lbnQgPSBQdXJlQ29tcG9uZW50O1xuZXhwb3J0cy5TdHJpY3RNb2RlID0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbmV4cG9ydHMuU3VzcGVuc2UgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xuZXhwb3J0cy5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRCA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzO1xuZXhwb3J0cy5hY3QgPSBhY3Q7XG5leHBvcnRzLmNsb25lRWxlbWVudCA9IGNsb25lRWxlbWVudCQxO1xuZXhwb3J0cy5jcmVhdGVDb250ZXh0ID0gY3JlYXRlQ29udGV4dDtcbmV4cG9ydHMuY3JlYXRlRWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQkMTtcbmV4cG9ydHMuY3JlYXRlRmFjdG9yeSA9IGNyZWF0ZUZhY3Rvcnk7XG5leHBvcnRzLmNyZWF0ZVJlZiA9IGNyZWF0ZVJlZjtcbmV4cG9ydHMuZm9yd2FyZFJlZiA9IGZvcndhcmRSZWY7XG5leHBvcnRzLmlzVmFsaWRFbGVtZW50ID0gaXNWYWxpZEVsZW1lbnQ7XG5leHBvcnRzLmxhenkgPSBsYXp5O1xuZXhwb3J0cy5tZW1vID0gbWVtbztcbmV4cG9ydHMuc3RhcnRUcmFuc2l0aW9uID0gc3RhcnRUcmFuc2l0aW9uO1xuZXhwb3J0cy51bnN0YWJsZV9hY3QgPSBhY3Q7XG5leHBvcnRzLnVzZUNhbGxiYWNrID0gdXNlQ2FsbGJhY2s7XG5leHBvcnRzLnVzZUNvbnRleHQgPSB1c2VDb250ZXh0O1xuZXhwb3J0cy51c2VEZWJ1Z1ZhbHVlID0gdXNlRGVidWdWYWx1ZTtcbmV4cG9ydHMudXNlRGVmZXJyZWRWYWx1ZSA9IHVzZURlZmVycmVkVmFsdWU7XG5leHBvcnRzLnVzZUVmZmVjdCA9IHVzZUVmZmVjdDtcbmV4cG9ydHMudXNlSWQgPSB1c2VJZDtcbmV4cG9ydHMudXNlSW1wZXJhdGl2ZUhhbmRsZSA9IHVzZUltcGVyYXRpdmVIYW5kbGU7XG5leHBvcnRzLnVzZUluc2VydGlvbkVmZmVjdCA9IHVzZUluc2VydGlvbkVmZmVjdDtcbmV4cG9ydHMudXNlTGF5b3V0RWZmZWN0ID0gdXNlTGF5b3V0RWZmZWN0O1xuZXhwb3J0cy51c2VNZW1vID0gdXNlTWVtbztcbmV4cG9ydHMudXNlUmVkdWNlciA9IHVzZVJlZHVjZXI7XG5leHBvcnRzLnVzZVJlZiA9IHVzZVJlZjtcbmV4cG9ydHMudXNlU3RhdGUgPSB1c2VTdGF0ZTtcbmV4cG9ydHMudXNlU3luY0V4dGVybmFsU3RvcmUgPSB1c2VTeW5jRXh0ZXJuYWxTdG9yZTtcbmV4cG9ydHMudXNlVHJhbnNpdGlvbiA9IHVzZVRyYW5zaXRpb247XG5leHBvcnRzLnZlcnNpb24gPSBSZWFjdFZlcnNpb247XG4gICAgICAgICAgLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AobmV3IEVycm9yKCkpO1xufVxuICAgICAgICBcbiAgfSkoKTtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlIFJlYWN0XG4gKiBzY2hlZHVsZXIuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgJ3VzZSBzdHJpY3QnO1xuXG4vKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG5pZiAoXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0ID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0KG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgICB2YXIgZW5hYmxlU2NoZWR1bGVyRGVidWdnaW5nID0gZmFsc2U7XG52YXIgZW5hYmxlUHJvZmlsaW5nID0gZmFsc2U7XG52YXIgZnJhbWVZaWVsZE1zID0gNTtcblxuZnVuY3Rpb24gcHVzaChoZWFwLCBub2RlKSB7XG4gIHZhciBpbmRleCA9IGhlYXAubGVuZ3RoO1xuICBoZWFwLnB1c2gobm9kZSk7XG4gIHNpZnRVcChoZWFwLCBub2RlLCBpbmRleCk7XG59XG5mdW5jdGlvbiBwZWVrKGhlYXApIHtcbiAgcmV0dXJuIGhlYXAubGVuZ3RoID09PSAwID8gbnVsbCA6IGhlYXBbMF07XG59XG5mdW5jdGlvbiBwb3AoaGVhcCkge1xuICBpZiAoaGVhcC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBmaXJzdCA9IGhlYXBbMF07XG4gIHZhciBsYXN0ID0gaGVhcC5wb3AoKTtcblxuICBpZiAobGFzdCAhPT0gZmlyc3QpIHtcbiAgICBoZWFwWzBdID0gbGFzdDtcbiAgICBzaWZ0RG93bihoZWFwLCBsYXN0LCAwKTtcbiAgfVxuXG4gIHJldHVybiBmaXJzdDtcbn1cblxuZnVuY3Rpb24gc2lmdFVwKGhlYXAsIG5vZGUsIGkpIHtcbiAgdmFyIGluZGV4ID0gaTtcblxuICB3aGlsZSAoaW5kZXggPiAwKSB7XG4gICAgdmFyIHBhcmVudEluZGV4ID0gaW5kZXggLSAxID4+PiAxO1xuICAgIHZhciBwYXJlbnQgPSBoZWFwW3BhcmVudEluZGV4XTtcblxuICAgIGlmIChjb21wYXJlKHBhcmVudCwgbm9kZSkgPiAwKSB7XG4gICAgICAvLyBUaGUgcGFyZW50IGlzIGxhcmdlci4gU3dhcCBwb3NpdGlvbnMuXG4gICAgICBoZWFwW3BhcmVudEluZGV4XSA9IG5vZGU7XG4gICAgICBoZWFwW2luZGV4XSA9IHBhcmVudDtcbiAgICAgIGluZGV4ID0gcGFyZW50SW5kZXg7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSBwYXJlbnQgaXMgc21hbGxlci4gRXhpdC5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2lmdERvd24oaGVhcCwgbm9kZSwgaSkge1xuICB2YXIgaW5kZXggPSBpO1xuICB2YXIgbGVuZ3RoID0gaGVhcC5sZW5ndGg7XG4gIHZhciBoYWxmTGVuZ3RoID0gbGVuZ3RoID4+PiAxO1xuXG4gIHdoaWxlIChpbmRleCA8IGhhbGZMZW5ndGgpIHtcbiAgICB2YXIgbGVmdEluZGV4ID0gKGluZGV4ICsgMSkgKiAyIC0gMTtcbiAgICB2YXIgbGVmdCA9IGhlYXBbbGVmdEluZGV4XTtcbiAgICB2YXIgcmlnaHRJbmRleCA9IGxlZnRJbmRleCArIDE7XG4gICAgdmFyIHJpZ2h0ID0gaGVhcFtyaWdodEluZGV4XTsgLy8gSWYgdGhlIGxlZnQgb3IgcmlnaHQgbm9kZSBpcyBzbWFsbGVyLCBzd2FwIHdpdGggdGhlIHNtYWxsZXIgb2YgdGhvc2UuXG5cbiAgICBpZiAoY29tcGFyZShsZWZ0LCBub2RlKSA8IDApIHtcbiAgICAgIGlmIChyaWdodEluZGV4IDwgbGVuZ3RoICYmIGNvbXBhcmUocmlnaHQsIGxlZnQpIDwgMCkge1xuICAgICAgICBoZWFwW2luZGV4XSA9IHJpZ2h0O1xuICAgICAgICBoZWFwW3JpZ2h0SW5kZXhdID0gbm9kZTtcbiAgICAgICAgaW5kZXggPSByaWdodEluZGV4O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGVhcFtpbmRleF0gPSBsZWZ0O1xuICAgICAgICBoZWFwW2xlZnRJbmRleF0gPSBub2RlO1xuICAgICAgICBpbmRleCA9IGxlZnRJbmRleDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJpZ2h0SW5kZXggPCBsZW5ndGggJiYgY29tcGFyZShyaWdodCwgbm9kZSkgPCAwKSB7XG4gICAgICBoZWFwW2luZGV4XSA9IHJpZ2h0O1xuICAgICAgaGVhcFtyaWdodEluZGV4XSA9IG5vZGU7XG4gICAgICBpbmRleCA9IHJpZ2h0SW5kZXg7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5laXRoZXIgY2hpbGQgaXMgc21hbGxlci4gRXhpdC5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tcGFyZShhLCBiKSB7XG4gIC8vIENvbXBhcmUgc29ydCBpbmRleCBmaXJzdCwgdGhlbiB0YXNrIGlkLlxuICB2YXIgZGlmZiA9IGEuc29ydEluZGV4IC0gYi5zb3J0SW5kZXg7XG4gIHJldHVybiBkaWZmICE9PSAwID8gZGlmZiA6IGEuaWQgLSBiLmlkO1xufVxuXG4vLyBUT0RPOiBVc2Ugc3ltYm9scz9cbnZhciBJbW1lZGlhdGVQcmlvcml0eSA9IDE7XG52YXIgVXNlckJsb2NraW5nUHJpb3JpdHkgPSAyO1xudmFyIE5vcm1hbFByaW9yaXR5ID0gMztcbnZhciBMb3dQcmlvcml0eSA9IDQ7XG52YXIgSWRsZVByaW9yaXR5ID0gNTtcblxuZnVuY3Rpb24gbWFya1Rhc2tFcnJvcmVkKHRhc2ssIG1zKSB7XG59XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXZhciAqL1xuXG52YXIgaGFzUGVyZm9ybWFuY2VOb3cgPSB0eXBlb2YgcGVyZm9ybWFuY2UgPT09ICdvYmplY3QnICYmIHR5cGVvZiBwZXJmb3JtYW5jZS5ub3cgPT09ICdmdW5jdGlvbic7XG5cbmlmIChoYXNQZXJmb3JtYW5jZU5vdykge1xuICB2YXIgbG9jYWxQZXJmb3JtYW5jZSA9IHBlcmZvcm1hbmNlO1xuXG4gIGV4cG9ydHMudW5zdGFibGVfbm93ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBsb2NhbFBlcmZvcm1hbmNlLm5vdygpO1xuICB9O1xufSBlbHNlIHtcbiAgdmFyIGxvY2FsRGF0ZSA9IERhdGU7XG4gIHZhciBpbml0aWFsVGltZSA9IGxvY2FsRGF0ZS5ub3coKTtcblxuICBleHBvcnRzLnVuc3RhYmxlX25vdyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbG9jYWxEYXRlLm5vdygpIC0gaW5pdGlhbFRpbWU7XG4gIH07XG59IC8vIE1heCAzMSBiaXQgaW50ZWdlci4gVGhlIG1heCBpbnRlZ2VyIHNpemUgaW4gVjggZm9yIDMyLWJpdCBzeXN0ZW1zLlxuLy8gTWF0aC5wb3coMiwgMzApIC0gMVxuLy8gMGIxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFcblxuXG52YXIgbWF4U2lnbmVkMzFCaXRJbnQgPSAxMDczNzQxODIzOyAvLyBUaW1lcyBvdXQgaW1tZWRpYXRlbHlcblxudmFyIElNTUVESUFURV9QUklPUklUWV9USU1FT1VUID0gLTE7IC8vIEV2ZW50dWFsbHkgdGltZXMgb3V0XG5cbnZhciBVU0VSX0JMT0NLSU5HX1BSSU9SSVRZX1RJTUVPVVQgPSAyNTA7XG52YXIgTk9STUFMX1BSSU9SSVRZX1RJTUVPVVQgPSA1MDAwO1xudmFyIExPV19QUklPUklUWV9USU1FT1VUID0gMTAwMDA7IC8vIE5ldmVyIHRpbWVzIG91dFxuXG52YXIgSURMRV9QUklPUklUWV9USU1FT1VUID0gbWF4U2lnbmVkMzFCaXRJbnQ7IC8vIFRhc2tzIGFyZSBzdG9yZWQgb24gYSBtaW4gaGVhcFxuXG52YXIgdGFza1F1ZXVlID0gW107XG52YXIgdGltZXJRdWV1ZSA9IFtdOyAvLyBJbmNyZW1lbnRpbmcgaWQgY291bnRlci4gVXNlZCB0byBtYWludGFpbiBpbnNlcnRpb24gb3JkZXIuXG5cbnZhciB0YXNrSWRDb3VudGVyID0gMTsgLy8gUGF1c2luZyB0aGUgc2NoZWR1bGVyIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nLlxudmFyIGN1cnJlbnRUYXNrID0gbnVsbDtcbnZhciBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IE5vcm1hbFByaW9yaXR5OyAvLyBUaGlzIGlzIHNldCB3aGlsZSBwZXJmb3JtaW5nIHdvcmssIHRvIHByZXZlbnQgcmUtZW50cmFuY2UuXG5cbnZhciBpc1BlcmZvcm1pbmdXb3JrID0gZmFsc2U7XG52YXIgaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgPSBmYWxzZTtcbnZhciBpc0hvc3RUaW1lb3V0U2NoZWR1bGVkID0gZmFsc2U7IC8vIENhcHR1cmUgbG9jYWwgcmVmZXJlbmNlcyB0byBuYXRpdmUgQVBJcywgaW4gY2FzZSBhIHBvbHlmaWxsIG92ZXJyaWRlcyB0aGVtLlxuXG52YXIgbG9jYWxTZXRUaW1lb3V0ID0gdHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicgPyBzZXRUaW1lb3V0IDogbnVsbDtcbnZhciBsb2NhbENsZWFyVGltZW91dCA9IHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicgPyBjbGVhclRpbWVvdXQgOiBudWxsO1xudmFyIGxvY2FsU2V0SW1tZWRpYXRlID0gdHlwZW9mIHNldEltbWVkaWF0ZSAhPT0gJ3VuZGVmaW5lZCcgPyBzZXRJbW1lZGlhdGUgOiBudWxsOyAvLyBJRSBhbmQgTm9kZS5qcyArIGpzZG9tXG5cbnZhciBpc0lucHV0UGVuZGluZyA9IHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci5zY2hlZHVsaW5nICE9PSB1bmRlZmluZWQgJiYgbmF2aWdhdG9yLnNjaGVkdWxpbmcuaXNJbnB1dFBlbmRpbmcgIT09IHVuZGVmaW5lZCA/IG5hdmlnYXRvci5zY2hlZHVsaW5nLmlzSW5wdXRQZW5kaW5nLmJpbmQobmF2aWdhdG9yLnNjaGVkdWxpbmcpIDogbnVsbDtcblxuZnVuY3Rpb24gYWR2YW5jZVRpbWVycyhjdXJyZW50VGltZSkge1xuICAvLyBDaGVjayBmb3IgdGFza3MgdGhhdCBhcmUgbm8gbG9uZ2VyIGRlbGF5ZWQgYW5kIGFkZCB0aGVtIHRvIHRoZSBxdWV1ZS5cbiAgdmFyIHRpbWVyID0gcGVlayh0aW1lclF1ZXVlKTtcblxuICB3aGlsZSAodGltZXIgIT09IG51bGwpIHtcbiAgICBpZiAodGltZXIuY2FsbGJhY2sgPT09IG51bGwpIHtcbiAgICAgIC8vIFRpbWVyIHdhcyBjYW5jZWxsZWQuXG4gICAgICBwb3AodGltZXJRdWV1ZSk7XG4gICAgfSBlbHNlIGlmICh0aW1lci5zdGFydFRpbWUgPD0gY3VycmVudFRpbWUpIHtcbiAgICAgIC8vIFRpbWVyIGZpcmVkLiBUcmFuc2ZlciB0byB0aGUgdGFzayBxdWV1ZS5cbiAgICAgIHBvcCh0aW1lclF1ZXVlKTtcbiAgICAgIHRpbWVyLnNvcnRJbmRleCA9IHRpbWVyLmV4cGlyYXRpb25UaW1lO1xuICAgICAgcHVzaCh0YXNrUXVldWUsIHRpbWVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVtYWluaW5nIHRpbWVycyBhcmUgcGVuZGluZy5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aW1lciA9IHBlZWsodGltZXJRdWV1ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlVGltZW91dChjdXJyZW50VGltZSkge1xuICBpc0hvc3RUaW1lb3V0U2NoZWR1bGVkID0gZmFsc2U7XG4gIGFkdmFuY2VUaW1lcnMoY3VycmVudFRpbWUpO1xuXG4gIGlmICghaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQpIHtcbiAgICBpZiAocGVlayh0YXNrUXVldWUpICE9PSBudWxsKSB7XG4gICAgICBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9IHRydWU7XG4gICAgICByZXF1ZXN0SG9zdENhbGxiYWNrKGZsdXNoV29yayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBmaXJzdFRpbWVyID0gcGVlayh0aW1lclF1ZXVlKTtcblxuICAgICAgaWYgKGZpcnN0VGltZXIgIT09IG51bGwpIHtcbiAgICAgICAgcmVxdWVzdEhvc3RUaW1lb3V0KGhhbmRsZVRpbWVvdXQsIGZpcnN0VGltZXIuc3RhcnRUaW1lIC0gY3VycmVudFRpbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmbHVzaFdvcmsoaGFzVGltZVJlbWFpbmluZywgaW5pdGlhbFRpbWUpIHtcblxuXG4gIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gZmFsc2U7XG5cbiAgaWYgKGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQpIHtcbiAgICAvLyBXZSBzY2hlZHVsZWQgYSB0aW1lb3V0IGJ1dCBpdCdzIG5vIGxvbmdlciBuZWVkZWQuIENhbmNlbCBpdC5cbiAgICBpc0hvc3RUaW1lb3V0U2NoZWR1bGVkID0gZmFsc2U7XG4gICAgY2FuY2VsSG9zdFRpbWVvdXQoKTtcbiAgfVxuXG4gIGlzUGVyZm9ybWluZ1dvcmsgPSB0cnVlO1xuICB2YXIgcHJldmlvdXNQcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG5cbiAgdHJ5IHtcbiAgICBpZiAoZW5hYmxlUHJvZmlsaW5nKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gd29ya0xvb3AoaGFzVGltZVJlbWFpbmluZywgaW5pdGlhbFRpbWUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRUYXNrICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIGN1cnJlbnRUaW1lID0gZXhwb3J0cy51bnN0YWJsZV9ub3coKTtcbiAgICAgICAgICBtYXJrVGFza0Vycm9yZWQoY3VycmVudFRhc2ssIGN1cnJlbnRUaW1lKTtcbiAgICAgICAgICBjdXJyZW50VGFzay5pc1F1ZXVlZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIGNhdGNoIGluIHByb2QgY29kZSBwYXRoLlxuICAgICAgcmV0dXJuIHdvcmtMb29wKGhhc1RpbWVSZW1haW5pbmcsIGluaXRpYWxUaW1lKTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgY3VycmVudFRhc2sgPSBudWxsO1xuICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJldmlvdXNQcmlvcml0eUxldmVsO1xuICAgIGlzUGVyZm9ybWluZ1dvcmsgPSBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiB3b3JrTG9vcChoYXNUaW1lUmVtYWluaW5nLCBpbml0aWFsVGltZSkge1xuICB2YXIgY3VycmVudFRpbWUgPSBpbml0aWFsVGltZTtcbiAgYWR2YW5jZVRpbWVycyhjdXJyZW50VGltZSk7XG4gIGN1cnJlbnRUYXNrID0gcGVlayh0YXNrUXVldWUpO1xuXG4gIHdoaWxlIChjdXJyZW50VGFzayAhPT0gbnVsbCAmJiAhKGVuYWJsZVNjaGVkdWxlckRlYnVnZ2luZyApKSB7XG4gICAgaWYgKGN1cnJlbnRUYXNrLmV4cGlyYXRpb25UaW1lID4gY3VycmVudFRpbWUgJiYgKCFoYXNUaW1lUmVtYWluaW5nIHx8IHNob3VsZFlpZWxkVG9Ib3N0KCkpKSB7XG4gICAgICAvLyBUaGlzIGN1cnJlbnRUYXNrIGhhc24ndCBleHBpcmVkLCBhbmQgd2UndmUgcmVhY2hlZCB0aGUgZGVhZGxpbmUuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgY2FsbGJhY2sgPSBjdXJyZW50VGFzay5jYWxsYmFjaztcblxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGN1cnJlbnRUYXNrLmNhbGxiYWNrID0gbnVsbDtcbiAgICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gY3VycmVudFRhc2sucHJpb3JpdHlMZXZlbDtcbiAgICAgIHZhciBkaWRVc2VyQ2FsbGJhY2tUaW1lb3V0ID0gY3VycmVudFRhc2suZXhwaXJhdGlvblRpbWUgPD0gY3VycmVudFRpbWU7XG5cbiAgICAgIHZhciBjb250aW51YXRpb25DYWxsYmFjayA9IGNhbGxiYWNrKGRpZFVzZXJDYWxsYmFja1RpbWVvdXQpO1xuICAgICAgY3VycmVudFRpbWUgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpO1xuXG4gICAgICBpZiAodHlwZW9mIGNvbnRpbnVhdGlvbkNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGN1cnJlbnRUYXNrLmNhbGxiYWNrID0gY29udGludWF0aW9uQ2FsbGJhY2s7XG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIGlmIChjdXJyZW50VGFzayA9PT0gcGVlayh0YXNrUXVldWUpKSB7XG4gICAgICAgICAgcG9wKHRhc2tRdWV1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYWR2YW5jZVRpbWVycyhjdXJyZW50VGltZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvcCh0YXNrUXVldWUpO1xuICAgIH1cblxuICAgIGN1cnJlbnRUYXNrID0gcGVlayh0YXNrUXVldWUpO1xuICB9IC8vIFJldHVybiB3aGV0aGVyIHRoZXJlJ3MgYWRkaXRpb25hbCB3b3JrXG5cblxuICBpZiAoY3VycmVudFRhc2sgIT09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZmlyc3RUaW1lciA9IHBlZWsodGltZXJRdWV1ZSk7XG5cbiAgICBpZiAoZmlyc3RUaW1lciAhPT0gbnVsbCkge1xuICAgICAgcmVxdWVzdEhvc3RUaW1lb3V0KGhhbmRsZVRpbWVvdXQsIGZpcnN0VGltZXIuc3RhcnRUaW1lIC0gY3VycmVudFRpbWUpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9ydW5XaXRoUHJpb3JpdHkocHJpb3JpdHlMZXZlbCwgZXZlbnRIYW5kbGVyKSB7XG4gIHN3aXRjaCAocHJpb3JpdHlMZXZlbCkge1xuICAgIGNhc2UgSW1tZWRpYXRlUHJpb3JpdHk6XG4gICAgY2FzZSBVc2VyQmxvY2tpbmdQcmlvcml0eTpcbiAgICBjYXNlIE5vcm1hbFByaW9yaXR5OlxuICAgIGNhc2UgTG93UHJpb3JpdHk6XG4gICAgY2FzZSBJZGxlUHJpb3JpdHk6XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBwcmlvcml0eUxldmVsID0gTm9ybWFsUHJpb3JpdHk7XG4gIH1cblxuICB2YXIgcHJldmlvdXNQcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJpb3JpdHlMZXZlbDtcblxuICB0cnkge1xuICAgIHJldHVybiBldmVudEhhbmRsZXIoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByZXZpb3VzUHJpb3JpdHlMZXZlbDtcbiAgfVxufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9uZXh0KGV2ZW50SGFuZGxlcikge1xuICB2YXIgcHJpb3JpdHlMZXZlbDtcblxuICBzd2l0Y2ggKGN1cnJlbnRQcmlvcml0eUxldmVsKSB7XG4gICAgY2FzZSBJbW1lZGlhdGVQcmlvcml0eTpcbiAgICBjYXNlIFVzZXJCbG9ja2luZ1ByaW9yaXR5OlxuICAgIGNhc2UgTm9ybWFsUHJpb3JpdHk6XG4gICAgICAvLyBTaGlmdCBkb3duIHRvIG5vcm1hbCBwcmlvcml0eVxuICAgICAgcHJpb3JpdHlMZXZlbCA9IE5vcm1hbFByaW9yaXR5O1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgLy8gQW55dGhpbmcgbG93ZXIgdGhhbiBub3JtYWwgcHJpb3JpdHkgc2hvdWxkIHJlbWFpbiBhdCB0aGUgY3VycmVudCBsZXZlbC5cbiAgICAgIHByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgdmFyIHByZXZpb3VzUHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByaW9yaXR5TGV2ZWw7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZXZlbnRIYW5kbGVyKCk7XG4gIH0gZmluYWxseSB7XG4gICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmV2aW91c1ByaW9yaXR5TGV2ZWw7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfd3JhcENhbGxiYWNrKGNhbGxiYWNrKSB7XG4gIHZhciBwYXJlbnRQcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgLy8gVGhpcyBpcyBhIGZvcmsgb2YgcnVuV2l0aFByaW9yaXR5LCBpbmxpbmVkIGZvciBwZXJmb3JtYW5jZS5cbiAgICB2YXIgcHJldmlvdXNQcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwYXJlbnRQcmlvcml0eUxldmVsO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBjYWxsYmFjay5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByZXZpb3VzUHJpb3JpdHlMZXZlbDtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2socHJpb3JpdHlMZXZlbCwgY2FsbGJhY2ssIG9wdGlvbnMpIHtcbiAgdmFyIGN1cnJlbnRUaW1lID0gZXhwb3J0cy51bnN0YWJsZV9ub3coKTtcbiAgdmFyIHN0YXJ0VGltZTtcblxuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnICYmIG9wdGlvbnMgIT09IG51bGwpIHtcbiAgICB2YXIgZGVsYXkgPSBvcHRpb25zLmRlbGF5O1xuXG4gICAgaWYgKHR5cGVvZiBkZWxheSA9PT0gJ251bWJlcicgJiYgZGVsYXkgPiAwKSB7XG4gICAgICBzdGFydFRpbWUgPSBjdXJyZW50VGltZSArIGRlbGF5O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGFydFRpbWUgPSBjdXJyZW50VGltZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc3RhcnRUaW1lID0gY3VycmVudFRpbWU7XG4gIH1cblxuICB2YXIgdGltZW91dDtcblxuICBzd2l0Y2ggKHByaW9yaXR5TGV2ZWwpIHtcbiAgICBjYXNlIEltbWVkaWF0ZVByaW9yaXR5OlxuICAgICAgdGltZW91dCA9IElNTUVESUFURV9QUklPUklUWV9USU1FT1VUO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFVzZXJCbG9ja2luZ1ByaW9yaXR5OlxuICAgICAgdGltZW91dCA9IFVTRVJfQkxPQ0tJTkdfUFJJT1JJVFlfVElNRU9VVDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBJZGxlUHJpb3JpdHk6XG4gICAgICB0aW1lb3V0ID0gSURMRV9QUklPUklUWV9USU1FT1VUO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIExvd1ByaW9yaXR5OlxuICAgICAgdGltZW91dCA9IExPV19QUklPUklUWV9USU1FT1VUO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIE5vcm1hbFByaW9yaXR5OlxuICAgIGRlZmF1bHQ6XG4gICAgICB0aW1lb3V0ID0gTk9STUFMX1BSSU9SSVRZX1RJTUVPVVQ7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHZhciBleHBpcmF0aW9uVGltZSA9IHN0YXJ0VGltZSArIHRpbWVvdXQ7XG4gIHZhciBuZXdUYXNrID0ge1xuICAgIGlkOiB0YXNrSWRDb3VudGVyKyssXG4gICAgY2FsbGJhY2s6IGNhbGxiYWNrLFxuICAgIHByaW9yaXR5TGV2ZWw6IHByaW9yaXR5TGV2ZWwsXG4gICAgc3RhcnRUaW1lOiBzdGFydFRpbWUsXG4gICAgZXhwaXJhdGlvblRpbWU6IGV4cGlyYXRpb25UaW1lLFxuICAgIHNvcnRJbmRleDogLTFcbiAgfTtcblxuICBpZiAoc3RhcnRUaW1lID4gY3VycmVudFRpbWUpIHtcbiAgICAvLyBUaGlzIGlzIGEgZGVsYXllZCB0YXNrLlxuICAgIG5ld1Rhc2suc29ydEluZGV4ID0gc3RhcnRUaW1lO1xuICAgIHB1c2godGltZXJRdWV1ZSwgbmV3VGFzayk7XG5cbiAgICBpZiAocGVlayh0YXNrUXVldWUpID09PSBudWxsICYmIG5ld1Rhc2sgPT09IHBlZWsodGltZXJRdWV1ZSkpIHtcbiAgICAgIC8vIEFsbCB0YXNrcyBhcmUgZGVsYXllZCwgYW5kIHRoaXMgaXMgdGhlIHRhc2sgd2l0aCB0aGUgZWFybGllc3QgZGVsYXkuXG4gICAgICBpZiAoaXNIb3N0VGltZW91dFNjaGVkdWxlZCkge1xuICAgICAgICAvLyBDYW5jZWwgYW4gZXhpc3RpbmcgdGltZW91dC5cbiAgICAgICAgY2FuY2VsSG9zdFRpbWVvdXQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgfSAvLyBTY2hlZHVsZSBhIHRpbWVvdXQuXG5cblxuICAgICAgcmVxdWVzdEhvc3RUaW1lb3V0KGhhbmRsZVRpbWVvdXQsIHN0YXJ0VGltZSAtIGN1cnJlbnRUaW1lKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbmV3VGFzay5zb3J0SW5kZXggPSBleHBpcmF0aW9uVGltZTtcbiAgICBwdXNoKHRhc2tRdWV1ZSwgbmV3VGFzayk7XG4gICAgLy8gd2FpdCB1bnRpbCB0aGUgbmV4dCB0aW1lIHdlIHlpZWxkLlxuXG5cbiAgICBpZiAoIWlzSG9zdENhbGxiYWNrU2NoZWR1bGVkICYmICFpc1BlcmZvcm1pbmdXb3JrKSB7XG4gICAgICBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9IHRydWU7XG4gICAgICByZXF1ZXN0SG9zdENhbGxiYWNrKGZsdXNoV29yayk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld1Rhc2s7XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX3BhdXNlRXhlY3V0aW9uKCkge1xufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9jb250aW51ZUV4ZWN1dGlvbigpIHtcblxuICBpZiAoIWlzSG9zdENhbGxiYWNrU2NoZWR1bGVkICYmICFpc1BlcmZvcm1pbmdXb3JrKSB7XG4gICAgaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgPSB0cnVlO1xuICAgIHJlcXVlc3RIb3N0Q2FsbGJhY2soZmx1c2hXb3JrKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9nZXRGaXJzdENhbGxiYWNrTm9kZSgpIHtcbiAgcmV0dXJuIHBlZWsodGFza1F1ZXVlKTtcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfY2FuY2VsQ2FsbGJhY2sodGFzaykge1xuICAvLyByZW1vdmUgZnJvbSB0aGUgcXVldWUgYmVjYXVzZSB5b3UgY2FuJ3QgcmVtb3ZlIGFyYml0cmFyeSBub2RlcyBmcm9tIGFuXG4gIC8vIGFycmF5IGJhc2VkIGhlYXAsIG9ubHkgdGhlIGZpcnN0IG9uZS4pXG5cblxuICB0YXNrLmNhbGxiYWNrID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwoKSB7XG4gIHJldHVybiBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbn1cblxudmFyIGlzTWVzc2FnZUxvb3BSdW5uaW5nID0gZmFsc2U7XG52YXIgc2NoZWR1bGVkSG9zdENhbGxiYWNrID0gbnVsbDtcbnZhciB0YXNrVGltZW91dElEID0gLTE7IC8vIFNjaGVkdWxlciBwZXJpb2RpY2FsbHkgeWllbGRzIGluIGNhc2UgdGhlcmUgaXMgb3RoZXIgd29yayBvbiB0aGUgbWFpblxuLy8gdGhyZWFkLCBsaWtlIHVzZXIgZXZlbnRzLiBCeSBkZWZhdWx0LCBpdCB5aWVsZHMgbXVsdGlwbGUgdGltZXMgcGVyIGZyYW1lLlxuLy8gSXQgZG9lcyBub3QgYXR0ZW1wdCB0byBhbGlnbiB3aXRoIGZyYW1lIGJvdW5kYXJpZXMsIHNpbmNlIG1vc3QgdGFza3MgZG9uJ3Rcbi8vIG5lZWQgdG8gYmUgZnJhbWUgYWxpZ25lZDsgZm9yIHRob3NlIHRoYXQgZG8sIHVzZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUuXG5cbnZhciBmcmFtZUludGVydmFsID0gZnJhbWVZaWVsZE1zO1xudmFyIHN0YXJ0VGltZSA9IC0xO1xuXG5mdW5jdGlvbiBzaG91bGRZaWVsZFRvSG9zdCgpIHtcbiAgdmFyIHRpbWVFbGFwc2VkID0gZXhwb3J0cy51bnN0YWJsZV9ub3coKSAtIHN0YXJ0VGltZTtcblxuICBpZiAodGltZUVsYXBzZWQgPCBmcmFtZUludGVydmFsKSB7XG4gICAgLy8gVGhlIG1haW4gdGhyZWFkIGhhcyBvbmx5IGJlZW4gYmxvY2tlZCBmb3IgYSByZWFsbHkgc2hvcnQgYW1vdW50IG9mIHRpbWU7XG4gICAgLy8gc21hbGxlciB0aGFuIGEgc2luZ2xlIGZyYW1lLiBEb24ndCB5aWVsZCB5ZXQuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IC8vIFRoZSBtYWluIHRocmVhZCBoYXMgYmVlbiBibG9ja2VkIGZvciBhIG5vbi1uZWdsaWdpYmxlIGFtb3VudCBvZiB0aW1lLiBXZVxuXG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RQYWludCgpIHtcblxufVxuXG5mdW5jdGlvbiBmb3JjZUZyYW1lUmF0ZShmcHMpIHtcbiAgaWYgKGZwcyA8IDAgfHwgZnBzID4gMTI1KSB7XG4gICAgLy8gVXNpbmcgY29uc29sZVsnZXJyb3InXSB0byBldmFkZSBCYWJlbCBhbmQgRVNMaW50XG4gICAgY29uc29sZVsnZXJyb3InXSgnZm9yY2VGcmFtZVJhdGUgdGFrZXMgYSBwb3NpdGl2ZSBpbnQgYmV0d2VlbiAwIGFuZCAxMjUsICcgKyAnZm9yY2luZyBmcmFtZSByYXRlcyBoaWdoZXIgdGhhbiAxMjUgZnBzIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoZnBzID4gMCkge1xuICAgIGZyYW1lSW50ZXJ2YWwgPSBNYXRoLmZsb29yKDEwMDAgLyBmcHMpO1xuICB9IGVsc2Uge1xuICAgIC8vIHJlc2V0IHRoZSBmcmFtZXJhdGVcbiAgICBmcmFtZUludGVydmFsID0gZnJhbWVZaWVsZE1zO1xuICB9XG59XG5cbnZhciBwZXJmb3JtV29ya1VudGlsRGVhZGxpbmUgPSBmdW5jdGlvbiAoKSB7XG4gIGlmIChzY2hlZHVsZWRIb3N0Q2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICB2YXIgY3VycmVudFRpbWUgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpOyAvLyBLZWVwIHRyYWNrIG9mIHRoZSBzdGFydCB0aW1lIHNvIHdlIGNhbiBtZWFzdXJlIGhvdyBsb25nIHRoZSBtYWluIHRocmVhZFxuICAgIC8vIGhhcyBiZWVuIGJsb2NrZWQuXG5cbiAgICBzdGFydFRpbWUgPSBjdXJyZW50VGltZTtcbiAgICB2YXIgaGFzVGltZVJlbWFpbmluZyA9IHRydWU7IC8vIElmIGEgc2NoZWR1bGVyIHRhc2sgdGhyb3dzLCBleGl0IHRoZSBjdXJyZW50IGJyb3dzZXIgdGFzayBzbyB0aGVcbiAgICAvLyBlcnJvciBjYW4gYmUgb2JzZXJ2ZWQuXG4gICAgLy9cbiAgICAvLyBJbnRlbnRpb25hbGx5IG5vdCB1c2luZyBhIHRyeS1jYXRjaCwgc2luY2UgdGhhdCBtYWtlcyBzb21lIGRlYnVnZ2luZ1xuICAgIC8vIHRlY2huaXF1ZXMgaGFyZGVyLiBJbnN0ZWFkLCBpZiBgc2NoZWR1bGVkSG9zdENhbGxiYWNrYCBlcnJvcnMsIHRoZW5cbiAgICAvLyBgaGFzTW9yZVdvcmtgIHdpbGwgcmVtYWluIHRydWUsIGFuZCB3ZSdsbCBjb250aW51ZSB0aGUgd29yayBsb29wLlxuXG4gICAgdmFyIGhhc01vcmVXb3JrID0gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICBoYXNNb3JlV29yayA9IHNjaGVkdWxlZEhvc3RDYWxsYmFjayhoYXNUaW1lUmVtYWluaW5nLCBjdXJyZW50VGltZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChoYXNNb3JlV29yaykge1xuICAgICAgICAvLyBJZiB0aGVyZSdzIG1vcmUgd29yaywgc2NoZWR1bGUgdGhlIG5leHQgbWVzc2FnZSBldmVudCBhdCB0aGUgZW5kXG4gICAgICAgIC8vIG9mIHRoZSBwcmVjZWRpbmcgb25lLlxuICAgICAgICBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXNNZXNzYWdlTG9vcFJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgc2NoZWR1bGVkSG9zdENhbGxiYWNrID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaXNNZXNzYWdlTG9vcFJ1bm5pbmcgPSBmYWxzZTtcbiAgfSAvLyBZaWVsZGluZyB0byB0aGUgYnJvd3NlciB3aWxsIGdpdmUgaXQgYSBjaGFuY2UgdG8gcGFpbnQsIHNvIHdlIGNhblxufTtcblxudmFyIHNjaGVkdWxlUGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lO1xuXG5pZiAodHlwZW9mIGxvY2FsU2V0SW1tZWRpYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIE5vZGUuanMgYW5kIG9sZCBJRS5cbiAgLy8gVGhlcmUncyBhIGZldyByZWFzb25zIGZvciB3aHkgd2UgcHJlZmVyIHNldEltbWVkaWF0ZS5cbiAgLy9cbiAgLy8gVW5saWtlIE1lc3NhZ2VDaGFubmVsLCBpdCBkb2Vzbid0IHByZXZlbnQgYSBOb2RlLmpzIHByb2Nlc3MgZnJvbSBleGl0aW5nLlxuICAvLyAoRXZlbiB0aG91Z2ggdGhpcyBpcyBhIERPTSBmb3JrIG9mIHRoZSBTY2hlZHVsZXIsIHlvdSBjb3VsZCBnZXQgaGVyZVxuICAvLyB3aXRoIGEgbWl4IG9mIE5vZGUuanMgMTUrLCB3aGljaCBoYXMgYSBNZXNzYWdlQ2hhbm5lbCwgYW5kIGpzZG9tLilcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8yMDc1NlxuICAvL1xuICAvLyBCdXQgYWxzbywgaXQgcnVucyBlYXJsaWVyIHdoaWNoIGlzIHRoZSBzZW1hbnRpYyB3ZSB3YW50LlxuICAvLyBJZiBvdGhlciBicm93c2VycyBldmVyIGltcGxlbWVudCBpdCwgaXQncyBiZXR0ZXIgdG8gdXNlIGl0LlxuICAvLyBBbHRob3VnaCBib3RoIG9mIHRoZXNlIHdvdWxkIGJlIGluZmVyaW9yIHRvIG5hdGl2ZSBzY2hlZHVsaW5nLlxuICBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBsb2NhbFNldEltbWVkaWF0ZShwZXJmb3JtV29ya1VudGlsRGVhZGxpbmUpO1xuICB9O1xufSBlbHNlIGlmICh0eXBlb2YgTWVzc2FnZUNoYW5uZWwgIT09ICd1bmRlZmluZWQnKSB7XG4gIC8vIERPTSBhbmQgV29ya2VyIGVudmlyb25tZW50cy5cbiAgLy8gV2UgcHJlZmVyIE1lc3NhZ2VDaGFubmVsIGJlY2F1c2Ugb2YgdGhlIDRtcyBzZXRUaW1lb3V0IGNsYW1waW5nLlxuICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICB2YXIgcG9ydCA9IGNoYW5uZWwucG9ydDI7XG4gIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gcGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lO1xuXG4gIHNjaGVkdWxlUGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lID0gZnVuY3Rpb24gKCkge1xuICAgIHBvcnQucG9zdE1lc3NhZ2UobnVsbCk7XG4gIH07XG59IGVsc2Uge1xuICAvLyBXZSBzaG91bGQgb25seSBmYWxsYmFjayBoZXJlIGluIG5vbi1icm93c2VyIGVudmlyb25tZW50cy5cbiAgc2NoZWR1bGVQZXJmb3JtV29ya1VudGlsRGVhZGxpbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgbG9jYWxTZXRUaW1lb3V0KHBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSwgMCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RIb3N0Q2FsbGJhY2soY2FsbGJhY2spIHtcbiAgc2NoZWR1bGVkSG9zdENhbGxiYWNrID0gY2FsbGJhY2s7XG5cbiAgaWYgKCFpc01lc3NhZ2VMb29wUnVubmluZykge1xuICAgIGlzTWVzc2FnZUxvb3BSdW5uaW5nID0gdHJ1ZTtcbiAgICBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RIb3N0VGltZW91dChjYWxsYmFjaywgbXMpIHtcbiAgdGFza1RpbWVvdXRJRCA9IGxvY2FsU2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgY2FsbGJhY2soZXhwb3J0cy51bnN0YWJsZV9ub3coKSk7XG4gIH0sIG1zKTtcbn1cblxuZnVuY3Rpb24gY2FuY2VsSG9zdFRpbWVvdXQoKSB7XG4gIGxvY2FsQ2xlYXJUaW1lb3V0KHRhc2tUaW1lb3V0SUQpO1xuICB0YXNrVGltZW91dElEID0gLTE7XG59XG5cbnZhciB1bnN0YWJsZV9yZXF1ZXN0UGFpbnQgPSByZXF1ZXN0UGFpbnQ7XG52YXIgdW5zdGFibGVfUHJvZmlsaW5nID0gIG51bGw7XG5cbmV4cG9ydHMudW5zdGFibGVfSWRsZVByaW9yaXR5ID0gSWRsZVByaW9yaXR5O1xuZXhwb3J0cy51bnN0YWJsZV9JbW1lZGlhdGVQcmlvcml0eSA9IEltbWVkaWF0ZVByaW9yaXR5O1xuZXhwb3J0cy51bnN0YWJsZV9Mb3dQcmlvcml0eSA9IExvd1ByaW9yaXR5O1xuZXhwb3J0cy51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eSA9IE5vcm1hbFByaW9yaXR5O1xuZXhwb3J0cy51bnN0YWJsZV9Qcm9maWxpbmcgPSB1bnN0YWJsZV9Qcm9maWxpbmc7XG5leHBvcnRzLnVuc3RhYmxlX1VzZXJCbG9ja2luZ1ByaW9yaXR5ID0gVXNlckJsb2NraW5nUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrID0gdW5zdGFibGVfY2FuY2VsQ2FsbGJhY2s7XG5leHBvcnRzLnVuc3RhYmxlX2NvbnRpbnVlRXhlY3V0aW9uID0gdW5zdGFibGVfY29udGludWVFeGVjdXRpb247XG5leHBvcnRzLnVuc3RhYmxlX2ZvcmNlRnJhbWVSYXRlID0gZm9yY2VGcmFtZVJhdGU7XG5leHBvcnRzLnVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsID0gdW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWw7XG5leHBvcnRzLnVuc3RhYmxlX2dldEZpcnN0Q2FsbGJhY2tOb2RlID0gdW5zdGFibGVfZ2V0Rmlyc3RDYWxsYmFja05vZGU7XG5leHBvcnRzLnVuc3RhYmxlX25leHQgPSB1bnN0YWJsZV9uZXh0O1xuZXhwb3J0cy51bnN0YWJsZV9wYXVzZUV4ZWN1dGlvbiA9IHVuc3RhYmxlX3BhdXNlRXhlY3V0aW9uO1xuZXhwb3J0cy51bnN0YWJsZV9yZXF1ZXN0UGFpbnQgPSB1bnN0YWJsZV9yZXF1ZXN0UGFpbnQ7XG5leHBvcnRzLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eSA9IHVuc3RhYmxlX3J1bldpdGhQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayA9IHVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2s7XG5leHBvcnRzLnVuc3RhYmxlX3Nob3VsZFlpZWxkID0gc2hvdWxkWWllbGRUb0hvc3Q7XG5leHBvcnRzLnVuc3RhYmxlX3dyYXBDYWxsYmFjayA9IHVuc3RhYmxlX3dyYXBDYWxsYmFjaztcbiAgICAgICAgICAvKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG5pZiAoXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcChuZXcgRXJyb3IoKSk7XG59XG4gICAgICAgIFxuICB9KSgpO1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9zY2hlZHVsZXIucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvc2NoZWR1bGVyLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcblxuICAgICAgICAgICd1c2Ugc3RyaWN0JztcblxuLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydCA9PT1cbiAgICAnZnVuY3Rpb24nXG4pIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydChuZXcgRXJyb3IoKSk7XG59XG4gICAgICAgICAgdmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcbnZhciBTY2hlZHVsZXIgPSByZXF1aXJlKCdzY2hlZHVsZXInKTtcblxudmFyIFJlYWN0U2hhcmVkSW50ZXJuYWxzID0gUmVhY3QuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ7XG5cbnZhciBzdXBwcmVzc1dhcm5pbmcgPSBmYWxzZTtcbmZ1bmN0aW9uIHNldFN1cHByZXNzV2FybmluZyhuZXdTdXBwcmVzc1dhcm5pbmcpIHtcbiAge1xuICAgIHN1cHByZXNzV2FybmluZyA9IG5ld1N1cHByZXNzV2FybmluZztcbiAgfVxufSAvLyBJbiBERVYsIGNhbGxzIHRvIGNvbnNvbGUud2FybiBhbmQgY29uc29sZS5lcnJvciBnZXQgcmVwbGFjZWRcbi8vIGJ5IGNhbGxzIHRvIHRoZXNlIG1ldGhvZHMgYnkgYSBCYWJlbCBwbHVnaW4uXG4vL1xuLy8gSW4gUFJPRCAob3IgaW4gcGFja2FnZXMgd2l0aG91dCBhY2Nlc3MgdG8gUmVhY3QgaW50ZXJuYWxzKSxcbi8vIHRoZXkgYXJlIGxlZnQgYXMgdGhleSBhcmUgaW5zdGVhZC5cblxuZnVuY3Rpb24gd2Fybihmb3JtYXQpIHtcbiAge1xuICAgIGlmICghc3VwcHJlc3NXYXJuaW5nKSB7XG4gICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuXG4gICAgICBwcmludFdhcm5pbmcoJ3dhcm4nLCBmb3JtYXQsIGFyZ3MpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZXJyb3IoZm9ybWF0KSB7XG4gIHtcbiAgICBpZiAoIXN1cHByZXNzV2FybmluZykge1xuICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yID4gMSA/IF9sZW4yIC0gMSA6IDApLCBfa2V5MiA9IDE7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgICAgYXJnc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgIH1cblxuICAgICAgcHJpbnRXYXJuaW5nKCdlcnJvcicsIGZvcm1hdCwgYXJncyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHByaW50V2FybmluZyhsZXZlbCwgZm9ybWF0LCBhcmdzKSB7XG4gIC8vIFdoZW4gY2hhbmdpbmcgdGhpcyBsb2dpYywgeW91IG1pZ2h0IHdhbnQgdG8gYWxzb1xuICAvLyB1cGRhdGUgY29uc29sZVdpdGhTdGFja0Rldi53d3cuanMgYXMgd2VsbC5cbiAge1xuICAgIHZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcbiAgICB2YXIgc3RhY2sgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldFN0YWNrQWRkZW5kdW0oKTtcblxuICAgIGlmIChzdGFjayAhPT0gJycpIHtcbiAgICAgIGZvcm1hdCArPSAnJXMnO1xuICAgICAgYXJncyA9IGFyZ3MuY29uY2F0KFtzdGFja10pO1xuICAgIH0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG5cblxuICAgIHZhciBhcmdzV2l0aEZvcm1hdCA9IGFyZ3MubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKGl0ZW0pO1xuICAgIH0pOyAvLyBDYXJlZnVsOiBSTiBjdXJyZW50bHkgZGVwZW5kcyBvbiB0aGlzIHByZWZpeFxuXG4gICAgYXJnc1dpdGhGb3JtYXQudW5zaGlmdCgnV2FybmluZzogJyArIGZvcm1hdCk7IC8vIFdlIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIHNwcmVhZCAob3IgLmFwcGx5KSBkaXJlY3RseSBiZWNhdXNlIGl0XG4gICAgLy8gYnJlYWtzIElFOTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMzYxMFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmdcblxuICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKGNvbnNvbGVbbGV2ZWxdLCBjb25zb2xlLCBhcmdzV2l0aEZvcm1hdCk7XG4gIH1cbn1cblxudmFyIEZ1bmN0aW9uQ29tcG9uZW50ID0gMDtcbnZhciBDbGFzc0NvbXBvbmVudCA9IDE7XG52YXIgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudCA9IDI7IC8vIEJlZm9yZSB3ZSBrbm93IHdoZXRoZXIgaXQgaXMgZnVuY3Rpb24gb3IgY2xhc3NcblxudmFyIEhvc3RSb290ID0gMzsgLy8gUm9vdCBvZiBhIGhvc3QgdHJlZS4gQ291bGQgYmUgbmVzdGVkIGluc2lkZSBhbm90aGVyIG5vZGUuXG5cbnZhciBIb3N0UG9ydGFsID0gNDsgLy8gQSBzdWJ0cmVlLiBDb3VsZCBiZSBhbiBlbnRyeSBwb2ludCB0byBhIGRpZmZlcmVudCByZW5kZXJlci5cblxudmFyIEhvc3RDb21wb25lbnQgPSA1O1xudmFyIEhvc3RUZXh0ID0gNjtcbnZhciBGcmFnbWVudCA9IDc7XG52YXIgTW9kZSA9IDg7XG52YXIgQ29udGV4dENvbnN1bWVyID0gOTtcbnZhciBDb250ZXh0UHJvdmlkZXIgPSAxMDtcbnZhciBGb3J3YXJkUmVmID0gMTE7XG52YXIgUHJvZmlsZXIgPSAxMjtcbnZhciBTdXNwZW5zZUNvbXBvbmVudCA9IDEzO1xudmFyIE1lbW9Db21wb25lbnQgPSAxNDtcbnZhciBTaW1wbGVNZW1vQ29tcG9uZW50ID0gMTU7XG52YXIgTGF6eUNvbXBvbmVudCA9IDE2O1xudmFyIEluY29tcGxldGVDbGFzc0NvbXBvbmVudCA9IDE3O1xudmFyIERlaHlkcmF0ZWRGcmFnbWVudCA9IDE4O1xudmFyIFN1c3BlbnNlTGlzdENvbXBvbmVudCA9IDE5O1xudmFyIFNjb3BlQ29tcG9uZW50ID0gMjE7XG52YXIgT2Zmc2NyZWVuQ29tcG9uZW50ID0gMjI7XG52YXIgTGVnYWN5SGlkZGVuQ29tcG9uZW50ID0gMjM7XG52YXIgQ2FjaGVDb21wb25lbnQgPSAyNDtcbnZhciBUcmFjaW5nTWFya2VyQ29tcG9uZW50ID0gMjU7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnZhciBlbmFibGVDbGllbnRSZW5kZXJGYWxsYmFja09uVGV4dE1pc21hdGNoID0gdHJ1ZTsgLy8gVE9ETzogTmVlZCB0byByZXZpZXcgdGhpcyBjb2RlIG9uZSBtb3JlIHRpbWUgYmVmb3JlIGxhbmRpbmdcbi8vIHRoZSByZWFjdC1yZWNvbmNpbGVyIHBhY2thZ2UuXG5cbnZhciBlbmFibGVOZXdSZWNvbmNpbGVyID0gZmFsc2U7IC8vIFN1cHBvcnQgbGVnYWN5IFByaW1lciBzdXBwb3J0IG9uIGludGVybmFsIEZCIHd3d1xuXG52YXIgZW5hYmxlTGF6eUNvbnRleHRQcm9wYWdhdGlvbiA9IGZhbHNlOyAvLyBGQi1vbmx5IHVzYWdlLiBUaGUgbmV3IEFQSSBoYXMgZGlmZmVyZW50IHNlbWFudGljcy5cblxudmFyIGVuYWJsZUxlZ2FjeUhpZGRlbiA9IGZhbHNlOyAvLyBFbmFibGVzIHVuc3RhYmxlX2F2b2lkVGhpc0ZhbGxiYWNrIGZlYXR1cmUgaW4gRmliZXJcblxudmFyIGVuYWJsZVN1c3BlbnNlQXZvaWRUaGlzRmFsbGJhY2sgPSBmYWxzZTsgLy8gRW5hYmxlcyB1bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFjayBmZWF0dXJlIGluIEZpenpcbi8vIFJlYWN0IERPTSBDaG9wcGluZyBCbG9ja1xuLy9cbi8vIFNpbWlsYXIgdG8gbWFpbiBDaG9wcGluZyBCbG9jayBidXQgb25seSBmbGFncyByZWxhdGVkIHRvIFJlYWN0IERPTS4gVGhlc2UgYXJlXG4vLyBncm91cGVkIGJlY2F1c2Ugd2Ugd2lsbCBsaWtlbHkgYmF0Y2ggYWxsIG9mIHRoZW0gaW50byBhIHNpbmdsZSBtYWpvciByZWxlYXNlLlxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERpc2FibGUgc3VwcG9ydCBmb3IgY29tbWVudCBub2RlcyBhcyBSZWFjdCBET00gY29udGFpbmVycy4gQWxyZWFkeSBkaXNhYmxlZFxuLy8gaW4gb3BlbiBzb3VyY2UsIGJ1dCB3d3cgY29kZWJhc2Ugc3RpbGwgcmVsaWVzIG9uIGl0LiBOZWVkIHRvIHJlbW92ZS5cblxudmFyIGRpc2FibGVDb21tZW50c0FzRE9NQ29udGFpbmVycyA9IHRydWU7IC8vIERpc2FibGUgamF2YXNjcmlwdDogVVJMIHN0cmluZ3MgaW4gaHJlZiBmb3IgWFNTIHByb3RlY3Rpb24uXG4vLyBhbmQgY2xpZW50IHJlbmRlcmluZywgbW9zdGx5IHRvIGFsbG93IEpTWCBhdHRyaWJ1dGVzIHRvIGFwcGx5IHRvIHRoZSBjdXN0b21cbi8vIGVsZW1lbnQncyBvYmplY3QgcHJvcGVydGllcyBpbnN0ZWFkIG9mIG9ubHkgSFRNTCBhdHRyaWJ1dGVzLlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMTM0N1xuXG52YXIgZW5hYmxlQ3VzdG9tRWxlbWVudFByb3BlcnR5U3VwcG9ydCA9IGZhbHNlOyAvLyBEaXNhYmxlcyBjaGlsZHJlbiBmb3IgPHRleHRhcmVhPiBlbGVtZW50c1xudmFyIHdhcm5BYm91dFN0cmluZ1JlZnMgPSB0cnVlOyAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRGVidWdnaW5nIGFuZCBEZXZUb29sc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEFkZHMgdXNlciB0aW1pbmcgbWFya3MgZm9yIGUuZy4gc3RhdGUgdXBkYXRlcywgc3VzcGVuc2UsIGFuZCB3b3JrIGxvb3Agc3R1ZmYsXG4vLyBmb3IgYW4gZXhwZXJpbWVudGFsIHRpbWVsaW5lIHRvb2wuXG5cbnZhciBlbmFibGVTY2hlZHVsaW5nUHJvZmlsZXIgPSB0cnVlOyAvLyBIZWxwcyBpZGVudGlmeSBzaWRlIGVmZmVjdHMgaW4gcmVuZGVyLXBoYXNlIGxpZmVjeWNsZSBob29rcyBhbmQgc2V0U3RhdGVcblxudmFyIGVuYWJsZVByb2ZpbGVyVGltZXIgPSB0cnVlOyAvLyBSZWNvcmQgZHVyYXRpb25zIGZvciBjb21taXQgYW5kIHBhc3NpdmUgZWZmZWN0cyBwaGFzZXMuXG5cbnZhciBlbmFibGVQcm9maWxlckNvbW1pdEhvb2tzID0gdHJ1ZTsgLy8gUGhhc2UgcGFyYW0gcGFzc2VkIHRvIG9uUmVuZGVyIGNhbGxiYWNrIGRpZmZlcmVudGlhdGVzIGJldHdlZW4gYW4gXCJ1cGRhdGVcIiBhbmQgYSBcImNhc2NhZGluZy11cGRhdGVcIi5cblxudmFyIGFsbE5hdGl2ZUV2ZW50cyA9IG5ldyBTZXQoKTtcbi8qKlxuICogTWFwcGluZyBmcm9tIHJlZ2lzdHJhdGlvbiBuYW1lIHRvIGV2ZW50IG5hbWVcbiAqL1xuXG5cbnZhciByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzID0ge307XG4vKipcbiAqIE1hcHBpbmcgZnJvbSBsb3dlcmNhc2UgcmVnaXN0cmF0aW9uIG5hbWVzIHRvIHRoZSBwcm9wZXJseSBjYXNlZCB2ZXJzaW9uLFxuICogdXNlZCB0byB3YXJuIGluIHRoZSBjYXNlIG9mIG1pc3NpbmcgZXZlbnQgaGFuZGxlcnMuIEF2YWlsYWJsZVxuICogb25seSBpbiB0cnVlLlxuICogQHR5cGUge09iamVjdH1cbiAqL1xuXG52YXIgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lcyA9ICB7fSA7IC8vIFRydXN0IHRoZSBkZXZlbG9wZXIgdG8gb25seSB1c2UgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lcyBpbiB0cnVlXG5cbmZ1bmN0aW9uIHJlZ2lzdGVyVHdvUGhhc2VFdmVudChyZWdpc3RyYXRpb25OYW1lLCBkZXBlbmRlbmNpZXMpIHtcbiAgcmVnaXN0ZXJEaXJlY3RFdmVudChyZWdpc3RyYXRpb25OYW1lLCBkZXBlbmRlbmNpZXMpO1xuICByZWdpc3RlckRpcmVjdEV2ZW50KHJlZ2lzdHJhdGlvbk5hbWUgKyAnQ2FwdHVyZScsIGRlcGVuZGVuY2llcyk7XG59XG5mdW5jdGlvbiByZWdpc3RlckRpcmVjdEV2ZW50KHJlZ2lzdHJhdGlvbk5hbWUsIGRlcGVuZGVuY2llcykge1xuICB7XG4gICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXNbcmVnaXN0cmF0aW9uTmFtZV0pIHtcbiAgICAgIGVycm9yKCdFdmVudFJlZ2lzdHJ5OiBNb3JlIHRoYW4gb25lIHBsdWdpbiBhdHRlbXB0ZWQgdG8gcHVibGlzaCB0aGUgc2FtZSAnICsgJ3JlZ2lzdHJhdGlvbiBuYW1lLCBgJXNgLicsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXNbcmVnaXN0cmF0aW9uTmFtZV0gPSBkZXBlbmRlbmNpZXM7XG5cbiAge1xuICAgIHZhciBsb3dlckNhc2VkTmFtZSA9IHJlZ2lzdHJhdGlvbk5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzW2xvd2VyQ2FzZWROYW1lXSA9IHJlZ2lzdHJhdGlvbk5hbWU7XG5cbiAgICBpZiAocmVnaXN0cmF0aW9uTmFtZSA9PT0gJ29uRG91YmxlQ2xpY2snKSB7XG4gICAgICBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzLm9uZGJsY2xpY2sgPSByZWdpc3RyYXRpb25OYW1lO1xuICAgIH1cbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZGVwZW5kZW5jaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgYWxsTmF0aXZlRXZlbnRzLmFkZChkZXBlbmRlbmNpZXNbaV0pO1xuICB9XG59XG5cbnZhciBjYW5Vc2VET00gPSAhISh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgIT09ICd1bmRlZmluZWQnKTtcblxudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuLypcbiAqIFRoZSBgJycgKyB2YWx1ZWAgcGF0dGVybiAodXNlZCBpbiBpbiBwZXJmLXNlbnNpdGl2ZSBjb2RlKSB0aHJvd3MgZm9yIFN5bWJvbFxuICogYW5kIFRlbXBvcmFsLiogdHlwZXMuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8yMjA2NC5cbiAqXG4gKiBUaGUgZnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlIHdpbGwgdGhyb3cgYW4gZWFzaWVyLXRvLXVuZGVyc3RhbmQsXG4gKiBlYXNpZXItdG8tZGVidWcgZXhjZXB0aW9uIHdpdGggYSBjbGVhciBlcnJvcnMgbWVzc2FnZSBtZXNzYWdlIGV4cGxhaW5pbmcgdGhlXG4gKiBwcm9ibGVtLiAoSW5zdGVhZCBvZiBhIGNvbmZ1c2luZyBleGNlcHRpb24gdGhyb3duIGluc2lkZSB0aGUgaW1wbGVtZW50YXRpb25cbiAqIG9mIHRoZSBgdmFsdWVgIG9iamVjdCkuXG4gKi9cbi8vICRGbG93Rml4TWUgb25seSBjYWxsZWQgaW4gREVWLCBzbyB2b2lkIHJldHVybiBpcyBub3QgcG9zc2libGUuXG5mdW5jdGlvbiB0eXBlTmFtZSh2YWx1ZSkge1xuICB7XG4gICAgLy8gdG9TdHJpbmdUYWcgaXMgbmVlZGVkIGZvciBuYW1lc3BhY2VkIHR5cGVzIGxpa2UgVGVtcG9yYWwuSW5zdGFudFxuICAgIHZhciBoYXNUb1N0cmluZ1RhZyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLnRvU3RyaW5nVGFnO1xuICAgIHZhciB0eXBlID0gaGFzVG9TdHJpbmdUYWcgJiYgdmFsdWVbU3ltYm9sLnRvU3RyaW5nVGFnXSB8fCB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lIHx8ICdPYmplY3QnO1xuICAgIHJldHVybiB0eXBlO1xuICB9XG59IC8vICRGbG93Rml4TWUgb25seSBjYWxsZWQgaW4gREVWLCBzbyB2b2lkIHJldHVybiBpcyBub3QgcG9zc2libGUuXG5cblxuZnVuY3Rpb24gd2lsbENvZXJjaW9uVGhyb3codmFsdWUpIHtcbiAge1xuICAgIHRyeSB7XG4gICAgICB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAgLy8gSWYgeW91IGVuZGVkIHVwIGhlcmUgYnkgZm9sbG93aW5nIGFuIGV4Y2VwdGlvbiBjYWxsIHN0YWNrLCBoZXJlJ3Mgd2hhdCdzXG4gIC8vIGhhcHBlbmVkOiB5b3Ugc3VwcGxpZWQgYW4gb2JqZWN0IG9yIHN5bWJvbCB2YWx1ZSB0byBSZWFjdCAoYXMgYSBwcm9wLCBrZXksXG4gIC8vIERPTSBhdHRyaWJ1dGUsIENTUyBwcm9wZXJ0eSwgc3RyaW5nIHJlZiwgZXRjLikgYW5kIHdoZW4gUmVhY3QgdHJpZWQgdG9cbiAgLy8gY29lcmNlIGl0IHRvIGEgc3RyaW5nIHVzaW5nIGAnJyArIHZhbHVlYCwgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uXG4gIC8vXG4gIC8vIFRoZSBtb3N0IGNvbW1vbiB0eXBlcyB0aGF0IHdpbGwgY2F1c2UgdGhpcyBleGNlcHRpb24gYXJlIGBTeW1ib2xgIGluc3RhbmNlc1xuICAvLyBhbmQgVGVtcG9yYWwgb2JqZWN0cyBsaWtlIGBUZW1wb3JhbC5JbnN0YW50YC4gQnV0IGFueSBvYmplY3QgdGhhdCBoYXMgYVxuICAvLyBgdmFsdWVPZmAgb3IgYFtTeW1ib2wudG9QcmltaXRpdmVdYCBtZXRob2QgdGhhdCB0aHJvd3Mgd2lsbCBhbHNvIGNhdXNlIHRoaXNcbiAgLy8gZXhjZXB0aW9uLiAoTGlicmFyeSBhdXRob3JzIGRvIHRoaXMgdG8gcHJldmVudCB1c2VycyBmcm9tIHVzaW5nIGJ1aWx0LWluXG4gIC8vIG51bWVyaWMgb3BlcmF0b3JzIGxpa2UgYCtgIG9yIGNvbXBhcmlzb24gb3BlcmF0b3JzIGxpa2UgYD49YCBiZWNhdXNlIGN1c3RvbVxuICAvLyBtZXRob2RzIGFyZSBuZWVkZWQgdG8gcGVyZm9ybSBhY2N1cmF0ZSBhcml0aG1ldGljIG9yIGNvbXBhcmlzb24uKVxuICAvL1xuICAvLyBUbyBmaXggdGhlIHByb2JsZW0sIGNvZXJjZSB0aGlzIG9iamVjdCBvciBzeW1ib2wgdmFsdWUgdG8gYSBzdHJpbmcgYmVmb3JlXG4gIC8vIHBhc3NpbmcgaXQgdG8gUmVhY3QuIFRoZSBtb3N0IHJlbGlhYmxlIHdheSBpcyB1c3VhbGx5IGBTdHJpbmcodmFsdWUpYC5cbiAgLy9cbiAgLy8gVG8gZmluZCB3aGljaCB2YWx1ZSBpcyB0aHJvd2luZywgY2hlY2sgdGhlIGJyb3dzZXIgb3IgZGVidWdnZXIgY29uc29sZS5cbiAgLy8gQmVmb3JlIHRoaXMgZXhjZXB0aW9uIHdhcyB0aHJvd24sIHRoZXJlIHNob3VsZCBiZSBgY29uc29sZS5lcnJvcmAgb3V0cHV0XG4gIC8vIHRoYXQgc2hvd3MgdGhlIHR5cGUgKFN5bWJvbCwgVGVtcG9yYWwuUGxhaW5EYXRlLCBldGMuKSB0aGF0IGNhdXNlZCB0aGVcbiAgLy8gcHJvYmxlbSBhbmQgaG93IHRoYXQgdHlwZSB3YXMgdXNlZDoga2V5LCBhdHJyaWJ1dGUsIGlucHV0IHZhbHVlIHByb3AsIGV0Yy5cbiAgLy8gSW4gbW9zdCBjYXNlcywgdGhpcyBjb25zb2xlIG91dHB1dCBhbHNvIHNob3dzIHRoZSBjb21wb25lbnQgYW5kIGl0c1xuICAvLyBhbmNlc3RvciBjb21wb25lbnRzIHdoZXJlIHRoZSBleGNlcHRpb24gaGFwcGVuZWQuXG4gIC8vXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICByZXR1cm4gJycgKyB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbih2YWx1ZSwgYXR0cmlidXRlTmFtZSkge1xuICB7XG4gICAgaWYgKHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ1RoZSBwcm92aWRlZCBgJXNgIGF0dHJpYnV0ZSBpcyBhbiB1bnN1cHBvcnRlZCB0eXBlICVzLicgKyAnIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSBiZWZvcmUgdXNpbmcgaXQgaGVyZS4nLCBhdHRyaWJ1dGVOYW1lLCB0eXBlTmFtZSh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTsgLy8gdGhyb3cgKHRvIGhlbHAgY2FsbGVycyBmaW5kIHRyb3VibGVzaG9vdGluZyBjb21tZW50cylcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAge1xuICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdUaGUgcHJvdmlkZWQga2V5IGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY2hlY2tQcm9wU3RyaW5nQ29lcmNpb24odmFsdWUsIHByb3BOYW1lKSB7XG4gIHtcbiAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKSB7XG4gICAgICBlcnJvcignVGhlIHByb3ZpZGVkIGAlc2AgcHJvcCBpcyBhbiB1bnN1cHBvcnRlZCB0eXBlICVzLicgKyAnIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSBiZWZvcmUgdXNpbmcgaXQgaGVyZS4nLCBwcm9wTmFtZSwgdHlwZU5hbWUodmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7IC8vIHRocm93ICh0byBoZWxwIGNhbGxlcnMgZmluZCB0cm91Ymxlc2hvb3RpbmcgY29tbWVudHMpXG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjaGVja0NTU1Byb3BlcnR5U3RyaW5nQ29lcmNpb24odmFsdWUsIHByb3BOYW1lKSB7XG4gIHtcbiAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKSB7XG4gICAgICBlcnJvcignVGhlIHByb3ZpZGVkIGAlc2AgQ1NTIHByb3BlcnR5IGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIHByb3BOYW1lLCB0eXBlTmFtZSh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTsgLy8gdGhyb3cgKHRvIGhlbHAgY2FsbGVycyBmaW5kIHRyb3VibGVzaG9vdGluZyBjb21tZW50cylcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNoZWNrSHRtbFN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7XG4gIHtcbiAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKSB7XG4gICAgICBlcnJvcignVGhlIHByb3ZpZGVkIEhUTUwgbWFya3VwIHVzZXMgYSB2YWx1ZSBvZiB1bnN1cHBvcnRlZCB0eXBlICVzLicgKyAnIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSBiZWZvcmUgdXNpbmcgaXQgaGVyZS4nLCB0eXBlTmFtZSh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTsgLy8gdGhyb3cgKHRvIGhlbHAgY2FsbGVycyBmaW5kIHRyb3VibGVzaG9vdGluZyBjb21tZW50cylcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNoZWNrRm9ybUZpZWxkVmFsdWVTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICB7XG4gICAgaWYgKHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ0Zvcm0gZmllbGQgdmFsdWVzICh2YWx1ZSwgY2hlY2tlZCwgZGVmYXVsdFZhbHVlLCBvciBkZWZhdWx0Q2hlY2tlZCBwcm9wcyknICsgJyBtdXN0IGJlIHN0cmluZ3MsIG5vdCAlcy4nICsgJyBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgYmVmb3JlIHVzaW5nIGl0IGhlcmUuJywgdHlwZU5hbWUodmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7IC8vIHRocm93ICh0byBoZWxwIGNhbGxlcnMgZmluZCB0cm91Ymxlc2hvb3RpbmcgY29tbWVudHMpXG4gICAgfVxuICB9XG59XG5cbi8vIEEgcmVzZXJ2ZWQgYXR0cmlidXRlLlxuLy8gSXQgaXMgaGFuZGxlZCBieSBSZWFjdCBzZXBhcmF0ZWx5IGFuZCBzaG91bGRuJ3QgYmUgd3JpdHRlbiB0byB0aGUgRE9NLlxudmFyIFJFU0VSVkVEID0gMDsgLy8gQSBzaW1wbGUgc3RyaW5nIGF0dHJpYnV0ZS5cbi8vIEF0dHJpYnV0ZXMgdGhhdCBhcmVuJ3QgaW4gdGhlIGZpbHRlciBhcmUgcHJlc3VtZWQgdG8gaGF2ZSB0aGlzIHR5cGUuXG5cbnZhciBTVFJJTkcgPSAxOyAvLyBBIHN0cmluZyBhdHRyaWJ1dGUgdGhhdCBhY2NlcHRzIGJvb2xlYW5zIGluIFJlYWN0LiBJbiBIVE1MLCB0aGVzZSBhcmUgY2FsbGVkXG4vLyBcImVudW1lcmF0ZWRcIiBhdHRyaWJ1dGVzIHdpdGggXCJ0cnVlXCIgYW5kIFwiZmFsc2VcIiBhcyBwb3NzaWJsZSB2YWx1ZXMuXG4vLyBXaGVuIHRydWUsIGl0IHNob3VsZCBiZSBzZXQgdG8gYSBcInRydWVcIiBzdHJpbmcuXG4vLyBXaGVuIGZhbHNlLCBpdCBzaG91bGQgYmUgc2V0IHRvIGEgXCJmYWxzZVwiIHN0cmluZy5cblxudmFyIEJPT0xFQU5JU0hfU1RSSU5HID0gMjsgLy8gQSByZWFsIGJvb2xlYW4gYXR0cmlidXRlLlxuLy8gV2hlbiB0cnVlLCBpdCBzaG91bGQgYmUgcHJlc2VudCAoc2V0IGVpdGhlciB0byBhbiBlbXB0eSBzdHJpbmcgb3IgaXRzIG5hbWUpLlxuLy8gV2hlbiBmYWxzZSwgaXQgc2hvdWxkIGJlIG9taXR0ZWQuXG5cbnZhciBCT09MRUFOID0gMzsgLy8gQW4gYXR0cmlidXRlIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBmbGFnIGFzIHdlbGwgYXMgd2l0aCBhIHZhbHVlLlxuLy8gV2hlbiB0cnVlLCBpdCBzaG91bGQgYmUgcHJlc2VudCAoc2V0IGVpdGhlciB0byBhbiBlbXB0eSBzdHJpbmcgb3IgaXRzIG5hbWUpLlxuLy8gV2hlbiBmYWxzZSwgaXQgc2hvdWxkIGJlIG9taXR0ZWQuXG4vLyBGb3IgYW55IG90aGVyIHZhbHVlLCBzaG91bGQgYmUgcHJlc2VudCB3aXRoIHRoYXQgdmFsdWUuXG5cbnZhciBPVkVSTE9BREVEX0JPT0xFQU4gPSA0OyAvLyBBbiBhdHRyaWJ1dGUgdGhhdCBtdXN0IGJlIG51bWVyaWMgb3IgcGFyc2UgYXMgYSBudW1lcmljLlxuLy8gV2hlbiBmYWxzeSwgaXQgc2hvdWxkIGJlIHJlbW92ZWQuXG5cbnZhciBOVU1FUklDID0gNTsgLy8gQW4gYXR0cmlidXRlIHRoYXQgbXVzdCBiZSBwb3NpdGl2ZSBudW1lcmljIG9yIHBhcnNlIGFzIGEgcG9zaXRpdmUgbnVtZXJpYy5cbi8vIFdoZW4gZmFsc3ksIGl0IHNob3VsZCBiZSByZW1vdmVkLlxuXG52YXIgUE9TSVRJVkVfTlVNRVJJQyA9IDY7XG5cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbnZhciBBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSID0gXCI6QS1aX2EtelxcXFx1MDBDMC1cXFxcdTAwRDZcXFxcdTAwRDgtXFxcXHUwMEY2XFxcXHUwMEY4LVxcXFx1MDJGRlxcXFx1MDM3MC1cXFxcdTAzN0RcXFxcdTAzN0YtXFxcXHUxRkZGXFxcXHUyMDBDLVxcXFx1MjAwRFxcXFx1MjA3MC1cXFxcdTIxOEZcXFxcdTJDMDAtXFxcXHUyRkVGXFxcXHUzMDAxLVxcXFx1RDdGRlxcXFx1RjkwMC1cXFxcdUZEQ0ZcXFxcdUZERjAtXFxcXHVGRkZEXCI7XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4gKi9cblxudmFyIEFUVFJJQlVURV9OQU1FX0NIQVIgPSBBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSICsgXCJcXFxcLS4wLTlcXFxcdTAwQjdcXFxcdTAzMDAtXFxcXHUwMzZGXFxcXHUyMDNGLVxcXFx1MjA0MFwiO1xudmFyIFZBTElEX0FUVFJJQlVURV9OQU1FX1JFR0VYID0gbmV3IFJlZ0V4cCgnXlsnICsgQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUiArICddWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xudmFyIGlsbGVnYWxBdHRyaWJ1dGVOYW1lQ2FjaGUgPSB7fTtcbnZhciB2YWxpZGF0ZWRBdHRyaWJ1dGVOYW1lQ2FjaGUgPSB7fTtcbmZ1bmN0aW9uIGlzQXR0cmlidXRlTmFtZVNhZmUoYXR0cmlidXRlTmFtZSkge1xuICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh2YWxpZGF0ZWRBdHRyaWJ1dGVOYW1lQ2FjaGUsIGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChpbGxlZ2FsQXR0cmlidXRlTmFtZUNhY2hlLCBhdHRyaWJ1dGVOYW1lKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChWQUxJRF9BVFRSSUJVVEVfTkFNRV9SRUdFWC50ZXN0KGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgdmFsaWRhdGVkQXR0cmlidXRlTmFtZUNhY2hlW2F0dHJpYnV0ZU5hbWVdID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlsbGVnYWxBdHRyaWJ1dGVOYW1lQ2FjaGVbYXR0cmlidXRlTmFtZV0gPSB0cnVlO1xuXG4gIHtcbiAgICBlcnJvcignSW52YWxpZCBhdHRyaWJ1dGUgbmFtZTogYCVzYCcsIGF0dHJpYnV0ZU5hbWUpO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gc2hvdWxkSWdub3JlQXR0cmlidXRlKG5hbWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgaWYgKHByb3BlcnR5SW5mbyAhPT0gbnVsbCkge1xuICAgIHJldHVybiBwcm9wZXJ0eUluZm8udHlwZSA9PT0gUkVTRVJWRUQ7XG4gIH1cblxuICBpZiAoaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAobmFtZS5sZW5ndGggPiAyICYmIChuYW1lWzBdID09PSAnbycgfHwgbmFtZVswXSA9PT0gJ08nKSAmJiAobmFtZVsxXSA9PT0gJ24nIHx8IG5hbWVbMV0gPT09ICdOJykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHNob3VsZFJlbW92ZUF0dHJpYnV0ZVdpdGhXYXJuaW5nKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIGlmIChwcm9wZXJ0eUluZm8gIT09IG51bGwgJiYgcHJvcGVydHlJbmZvLnR5cGUgPT09IFJFU0VSVkVEKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICBjYXNlICdmdW5jdGlvbic6IC8vICRGbG93SXNzdWUgc3ltYm9sIGlzIHBlcmZlY3RseSB2YWxpZCBoZXJlXG5cbiAgICBjYXNlICdzeW1ib2wnOlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIHtcbiAgICAgICAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb3BlcnR5SW5mbyAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiAhcHJvcGVydHlJbmZvLmFjY2VwdHNCb29sZWFucztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgcHJlZml4ID0gbmFtZS50b0xvd2VyQ2FzZSgpLnNsaWNlKDAsIDUpO1xuICAgICAgICAgIHJldHVybiBwcmVmaXggIT09ICdkYXRhLScgJiYgcHJlZml4ICE9PSAnYXJpYS0nO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBzaG91bGRSZW1vdmVBdHRyaWJ1dGUobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGVXaXRoV2FybmluZyhuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHByb3BlcnR5SW5mbyAhPT0gbnVsbCkge1xuXG4gICAgc3dpdGNoIChwcm9wZXJ0eUluZm8udHlwZSkge1xuICAgICAgY2FzZSBCT09MRUFOOlxuICAgICAgICByZXR1cm4gIXZhbHVlO1xuXG4gICAgICBjYXNlIE9WRVJMT0FERURfQk9PTEVBTjpcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBmYWxzZTtcblxuICAgICAgY2FzZSBOVU1FUklDOlxuICAgICAgICByZXR1cm4gaXNOYU4odmFsdWUpO1xuXG4gICAgICBjYXNlIFBPU0lUSVZFX05VTUVSSUM6XG4gICAgICAgIHJldHVybiBpc05hTih2YWx1ZSkgfHwgdmFsdWUgPCAxO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGdldFByb3BlcnR5SW5mbyhuYW1lKSB7XG4gIHJldHVybiBwcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KG5hbWUpID8gcHJvcGVydGllc1tuYW1lXSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCB0eXBlLCBtdXN0VXNlUHJvcGVydHksIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZU5hbWVzcGFjZSwgc2FuaXRpemVVUkwsIHJlbW92ZUVtcHR5U3RyaW5nKSB7XG4gIHRoaXMuYWNjZXB0c0Jvb2xlYW5zID0gdHlwZSA9PT0gQk9PTEVBTklTSF9TVFJJTkcgfHwgdHlwZSA9PT0gQk9PTEVBTiB8fCB0eXBlID09PSBPVkVSTE9BREVEX0JPT0xFQU47XG4gIHRoaXMuYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZU5hbWU7XG4gIHRoaXMuYXR0cmlidXRlTmFtZXNwYWNlID0gYXR0cmlidXRlTmFtZXNwYWNlO1xuICB0aGlzLm11c3RVc2VQcm9wZXJ0eSA9IG11c3RVc2VQcm9wZXJ0eTtcbiAgdGhpcy5wcm9wZXJ0eU5hbWUgPSBuYW1lO1xuICB0aGlzLnR5cGUgPSB0eXBlO1xuICB0aGlzLnNhbml0aXplVVJMID0gc2FuaXRpemVVUkw7XG4gIHRoaXMucmVtb3ZlRW1wdHlTdHJpbmcgPSByZW1vdmVFbXB0eVN0cmluZztcbn0gLy8gV2hlbiBhZGRpbmcgYXR0cmlidXRlcyB0byB0aGlzIGxpc3QsIGJlIHN1cmUgdG8gYWxzbyBhZGQgdGhlbSB0b1xuLy8gdGhlIGBwb3NzaWJsZVN0YW5kYXJkTmFtZXNgIG1vZHVsZSB0byBlbnN1cmUgY2FzaW5nIGFuZCBpbmNvcnJlY3Rcbi8vIG5hbWUgd2FybmluZ3MuXG5cblxudmFyIHByb3BlcnRpZXMgPSB7fTsgLy8gVGhlc2UgcHJvcHMgYXJlIHJlc2VydmVkIGJ5IFJlYWN0LiBUaGV5IHNob3VsZG4ndCBiZSB3cml0dGVuIHRvIHRoZSBET00uXG5cbnZhciByZXNlcnZlZFByb3BzID0gWydjaGlsZHJlbicsICdkYW5nZXJvdXNseVNldElubmVySFRNTCcsIC8vIFRPRE86IFRoaXMgcHJldmVudHMgdGhlIGFzc2lnbm1lbnQgb2YgZGVmYXVsdFZhbHVlIHRvIHJlZ3VsYXJcbi8vIGVsZW1lbnRzIChub3QganVzdCBpbnB1dHMpLiBOb3cgdGhhdCBSZWFjdERPTUlucHV0IGFzc2lnbnMgdG8gdGhlXG4vLyBkZWZhdWx0VmFsdWUgcHJvcGVydHkgLS0gZG8gd2UgbmVlZCB0aGlzP1xuJ2RlZmF1bHRWYWx1ZScsICdkZWZhdWx0Q2hlY2tlZCcsICdpbm5lckhUTUwnLCAnc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nJywgJ3N1cHByZXNzSHlkcmF0aW9uV2FybmluZycsICdzdHlsZSddO1xuXG5yZXNlcnZlZFByb3BzLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgUkVTRVJWRUQsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBBIGZldyBSZWFjdCBzdHJpbmcgYXR0cmlidXRlcyBoYXZlIGEgZGlmZmVyZW50IG5hbWUuXG4vLyBUaGlzIGlzIGEgbWFwcGluZyBmcm9tIFJlYWN0IHByb3AgbmFtZXMgdG8gdGhlIGF0dHJpYnV0ZSBuYW1lcy5cblxuW1snYWNjZXB0Q2hhcnNldCcsICdhY2NlcHQtY2hhcnNldCddLCBbJ2NsYXNzTmFtZScsICdjbGFzcyddLCBbJ2h0bWxGb3InLCAnZm9yJ10sIFsnaHR0cEVxdWl2JywgJ2h0dHAtZXF1aXYnXV0uZm9yRWFjaChmdW5jdGlvbiAoX3JlZikge1xuICB2YXIgbmFtZSA9IF9yZWZbMF0sXG4gICAgICBhdHRyaWJ1dGVOYW1lID0gX3JlZlsxXTtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIFwiZW51bWVyYXRlZFwiIEhUTUwgYXR0cmlidXRlcyB0aGF0IGFjY2VwdCBcInRydWVcIiBhbmQgXCJmYWxzZVwiLlxuLy8gSW4gUmVhY3QsIHdlIGxldCB1c2VycyBwYXNzIGB0cnVlYCBhbmQgYGZhbHNlYCBldmVuIHRob3VnaCB0ZWNobmljYWxseVxuLy8gdGhlc2UgYXJlbid0IGJvb2xlYW4gYXR0cmlidXRlcyAodGhleSBhcmUgY29lcmNlZCB0byBzdHJpbmdzKS5cblxuWydjb250ZW50RWRpdGFibGUnLCAnZHJhZ2dhYmxlJywgJ3NwZWxsQ2hlY2snLCAndmFsdWUnXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIEJPT0xFQU5JU0hfU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgXCJlbnVtZXJhdGVkXCIgU1ZHIGF0dHJpYnV0ZXMgdGhhdCBhY2NlcHQgXCJ0cnVlXCIgYW5kIFwiZmFsc2VcIi5cbi8vIEluIFJlYWN0LCB3ZSBsZXQgdXNlcnMgcGFzcyBgdHJ1ZWAgYW5kIGBmYWxzZWAgZXZlbiB0aG91Z2ggdGVjaG5pY2FsbHlcbi8vIHRoZXNlIGFyZW4ndCBib29sZWFuIGF0dHJpYnV0ZXMgKHRoZXkgYXJlIGNvZXJjZWQgdG8gc3RyaW5ncykuXG4vLyBTaW5jZSB0aGVzZSBhcmUgU1ZHIGF0dHJpYnV0ZXMsIHRoZWlyIGF0dHJpYnV0ZSBuYW1lcyBhcmUgY2FzZS1zZW5zaXRpdmUuXG5cblsnYXV0b1JldmVyc2UnLCAnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCcsICdmb2N1c2FibGUnLCAncHJlc2VydmVBbHBoYSddLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgQk9PTEVBTklTSF9TVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgSFRNTCBib29sZWFuIGF0dHJpYnV0ZXMuXG5cblsnYWxsb3dGdWxsU2NyZWVuJywgJ2FzeW5jJywgLy8gTm90ZTogdGhlcmUgaXMgYSBzcGVjaWFsIGNhc2UgdGhhdCBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIHdyaXR0ZW4gdG8gdGhlIERPTVxuLy8gb24gdGhlIGNsaWVudCBzaWRlIGJlY2F1c2UgdGhlIGJyb3dzZXJzIGFyZSBpbmNvbnNpc3RlbnQuIEluc3RlYWQgd2UgY2FsbCBmb2N1cygpLlxuJ2F1dG9Gb2N1cycsICdhdXRvUGxheScsICdjb250cm9scycsICdkZWZhdWx0JywgJ2RlZmVyJywgJ2Rpc2FibGVkJywgJ2Rpc2FibGVQaWN0dXJlSW5QaWN0dXJlJywgJ2Rpc2FibGVSZW1vdGVQbGF5YmFjaycsICdmb3JtTm9WYWxpZGF0ZScsICdoaWRkZW4nLCAnbG9vcCcsICdub01vZHVsZScsICdub1ZhbGlkYXRlJywgJ29wZW4nLCAncGxheXNJbmxpbmUnLCAncmVhZE9ubHknLCAncmVxdWlyZWQnLCAncmV2ZXJzZWQnLCAnc2NvcGVkJywgJ3NlYW1sZXNzJywgLy8gTWljcm9kYXRhXG4naXRlbVNjb3BlJ10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBCT09MRUFOLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgdGhlIGZldyBSZWFjdCBwcm9wcyB0aGF0IHdlIHNldCBhcyBET00gcHJvcGVydGllc1xuLy8gcmF0aGVyIHRoYW4gYXR0cmlidXRlcy4gVGhlc2UgYXJlIGFsbCBib29sZWFucy5cblxuWydjaGVja2VkJywgLy8gTm90ZTogYG9wdGlvbi5zZWxlY3RlZGAgaXMgbm90IHVwZGF0ZWQgaWYgYHNlbGVjdC5tdWx0aXBsZWAgaXNcbi8vIGRpc2FibGVkIHdpdGggYHJlbW92ZUF0dHJpYnV0ZWAuIFdlIGhhdmUgc3BlY2lhbCBsb2dpYyBmb3IgaGFuZGxpbmcgdGhpcy5cbidtdWx0aXBsZScsICdtdXRlZCcsICdzZWxlY3RlZCcgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgQk9PTEVBTiwgdHJ1ZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIEhUTUwgYXR0cmlidXRlcyB0aGF0IGFyZSBcIm92ZXJsb2FkZWQgYm9vbGVhbnNcIjogdGhleSBiZWhhdmUgbGlrZVxuLy8gYm9vbGVhbnMsIGJ1dCBjYW4gYWxzbyBhY2NlcHQgYSBzdHJpbmcgdmFsdWUuXG5cblsnY2FwdHVyZScsICdkb3dubG9hZCcgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgT1ZFUkxPQURFRF9CT09MRUFOLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIEhUTUwgYXR0cmlidXRlcyB0aGF0IG11c3QgYmUgcG9zaXRpdmUgbnVtYmVycy5cblxuWydjb2xzJywgJ3Jvd3MnLCAnc2l6ZScsICdzcGFuJyAvLyBOT1RFOiBpZiB5b3UgYWRkIGEgY2FtZWxDYXNlZCBwcm9wIHRvIHRoaXMgbGlzdCxcbi8vIHlvdSdsbCBuZWVkIHRvIHNldCBhdHRyaWJ1dGVOYW1lIHRvIG5hbWUudG9Mb3dlckNhc2UoKVxuLy8gaW5zdGVhZCBpbiB0aGUgYXNzaWdubWVudCBiZWxvdy5cbl0uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBQT1NJVElWRV9OVU1FUklDLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIEhUTUwgYXR0cmlidXRlcyB0aGF0IG11c3QgYmUgbnVtYmVycy5cblxuWydyb3dTcGFuJywgJ3N0YXJ0J10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBOVU1FUklDLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pO1xudmFyIENBTUVMSVpFID0gL1tcXC1cXDpdKFthLXpdKS9nO1xuXG52YXIgY2FwaXRhbGl6ZSA9IGZ1bmN0aW9uICh0b2tlbikge1xuICByZXR1cm4gdG9rZW5bMV0udG9VcHBlckNhc2UoKTtcbn07IC8vIFRoaXMgaXMgYSBsaXN0IG9mIGFsbCBTVkcgYXR0cmlidXRlcyB0aGF0IG5lZWQgc3BlY2lhbCBjYXNpbmcsIG5hbWVzcGFjaW5nLFxuLy8gb3IgYm9vbGVhbiB2YWx1ZSBhc3NpZ25tZW50LiBSZWd1bGFyIGF0dHJpYnV0ZXMgdGhhdCBqdXN0IGFjY2VwdCBzdHJpbmdzXG4vLyBhbmQgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcmUgb21pdHRlZCwganVzdCBsaWtlIGluIHRoZSBIVE1MIGF0dHJpYnV0ZSBmaWx0ZXIuXG4vLyBTb21lIG9mIHRoZXNlIGF0dHJpYnV0ZXMgY2FuIGJlIGhhcmQgdG8gZmluZC4gVGhpcyBsaXN0IHdhcyBjcmVhdGVkIGJ5XG4vLyBzY3JhcGluZyB0aGUgTUROIGRvY3VtZW50YXRpb24uXG5cblxuWydhY2NlbnQtaGVpZ2h0JywgJ2FsaWdubWVudC1iYXNlbGluZScsICdhcmFiaWMtZm9ybScsICdiYXNlbGluZS1zaGlmdCcsICdjYXAtaGVpZ2h0JywgJ2NsaXAtcGF0aCcsICdjbGlwLXJ1bGUnLCAnY29sb3ItaW50ZXJwb2xhdGlvbicsICdjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnMnLCAnY29sb3ItcHJvZmlsZScsICdjb2xvci1yZW5kZXJpbmcnLCAnZG9taW5hbnQtYmFzZWxpbmUnLCAnZW5hYmxlLWJhY2tncm91bmQnLCAnZmlsbC1vcGFjaXR5JywgJ2ZpbGwtcnVsZScsICdmbG9vZC1jb2xvcicsICdmbG9vZC1vcGFjaXR5JywgJ2ZvbnQtZmFtaWx5JywgJ2ZvbnQtc2l6ZScsICdmb250LXNpemUtYWRqdXN0JywgJ2ZvbnQtc3RyZXRjaCcsICdmb250LXN0eWxlJywgJ2ZvbnQtdmFyaWFudCcsICdmb250LXdlaWdodCcsICdnbHlwaC1uYW1lJywgJ2dseXBoLW9yaWVudGF0aW9uLWhvcml6b250YWwnLCAnZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwnLCAnaG9yaXotYWR2LXgnLCAnaG9yaXotb3JpZ2luLXgnLCAnaW1hZ2UtcmVuZGVyaW5nJywgJ2xldHRlci1zcGFjaW5nJywgJ2xpZ2h0aW5nLWNvbG9yJywgJ21hcmtlci1lbmQnLCAnbWFya2VyLW1pZCcsICdtYXJrZXItc3RhcnQnLCAnb3ZlcmxpbmUtcG9zaXRpb24nLCAnb3ZlcmxpbmUtdGhpY2tuZXNzJywgJ3BhaW50LW9yZGVyJywgJ3Bhbm9zZS0xJywgJ3BvaW50ZXItZXZlbnRzJywgJ3JlbmRlcmluZy1pbnRlbnQnLCAnc2hhcGUtcmVuZGVyaW5nJywgJ3N0b3AtY29sb3InLCAnc3RvcC1vcGFjaXR5JywgJ3N0cmlrZXRocm91Z2gtcG9zaXRpb24nLCAnc3RyaWtldGhyb3VnaC10aGlja25lc3MnLCAnc3Ryb2tlLWRhc2hhcnJheScsICdzdHJva2UtZGFzaG9mZnNldCcsICdzdHJva2UtbGluZWNhcCcsICdzdHJva2UtbGluZWpvaW4nLCAnc3Ryb2tlLW1pdGVybGltaXQnLCAnc3Ryb2tlLW9wYWNpdHknLCAnc3Ryb2tlLXdpZHRoJywgJ3RleHQtYW5jaG9yJywgJ3RleHQtZGVjb3JhdGlvbicsICd0ZXh0LXJlbmRlcmluZycsICd1bmRlcmxpbmUtcG9zaXRpb24nLCAndW5kZXJsaW5lLXRoaWNrbmVzcycsICd1bmljb2RlLWJpZGknLCAndW5pY29kZS1yYW5nZScsICd1bml0cy1wZXItZW0nLCAndi1hbHBoYWJldGljJywgJ3YtaGFuZ2luZycsICd2LWlkZW9ncmFwaGljJywgJ3YtbWF0aGVtYXRpY2FsJywgJ3ZlY3Rvci1lZmZlY3QnLCAndmVydC1hZHYteScsICd2ZXJ0LW9yaWdpbi14JywgJ3ZlcnQtb3JpZ2luLXknLCAnd29yZC1zcGFjaW5nJywgJ3dyaXRpbmctbW9kZScsICd4bWxuczp4bGluaycsICd4LWhlaWdodCcgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUpIHtcbiAgdmFyIG5hbWUgPSBhdHRyaWJ1dGVOYW1lLnJlcGxhY2UoQ0FNRUxJWkUsIGNhcGl0YWxpemUpO1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZSwgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gU3RyaW5nIFNWRyBhdHRyaWJ1dGVzIHdpdGggdGhlIHhsaW5rIG5hbWVzcGFjZS5cblxuWyd4bGluazphY3R1YXRlJywgJ3hsaW5rOmFyY3JvbGUnLCAneGxpbms6cm9sZScsICd4bGluazpzaG93JywgJ3hsaW5rOnRpdGxlJywgJ3hsaW5rOnR5cGUnIC8vIE5PVEU6IGlmIHlvdSBhZGQgYSBjYW1lbENhc2VkIHByb3AgdG8gdGhpcyBsaXN0LFxuLy8geW91J2xsIG5lZWQgdG8gc2V0IGF0dHJpYnV0ZU5hbWUgdG8gbmFtZS50b0xvd2VyQ2FzZSgpXG4vLyBpbnN0ZWFkIGluIHRoZSBhc3NpZ25tZW50IGJlbG93LlxuXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHZhciBuYW1lID0gYXR0cmlidXRlTmFtZS5yZXBsYWNlKENBTUVMSVpFLCBjYXBpdGFsaXplKTtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUsICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBTdHJpbmcgU1ZHIGF0dHJpYnV0ZXMgd2l0aCB0aGUgeG1sIG5hbWVzcGFjZS5cblxuWyd4bWw6YmFzZScsICd4bWw6bGFuZycsICd4bWw6c3BhY2UnIC8vIE5PVEU6IGlmIHlvdSBhZGQgYSBjYW1lbENhc2VkIHByb3AgdG8gdGhpcyBsaXN0LFxuLy8geW91J2xsIG5lZWQgdG8gc2V0IGF0dHJpYnV0ZU5hbWUgdG8gbmFtZS50b0xvd2VyQ2FzZSgpXG4vLyBpbnN0ZWFkIGluIHRoZSBhc3NpZ25tZW50IGJlbG93LlxuXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHZhciBuYW1lID0gYXR0cmlidXRlTmFtZS5yZXBsYWNlKENBTUVMSVpFLCBjYXBpdGFsaXplKTtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUsICdodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UnLCBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGF0dHJpYnV0ZSBleGlzdHMgYm90aCBpbiBIVE1MIGFuZCBTVkcuXG4vLyBUaGUgYXR0cmlidXRlIG5hbWUgaXMgY2FzZS1zZW5zaXRpdmUgaW4gU1ZHIHNvIHdlIGNhbid0IGp1c3QgdXNlXG4vLyB0aGUgUmVhY3QgbmFtZSBsaWtlIHdlIGRvIGZvciBhdHRyaWJ1dGVzIHRoYXQgZXhpc3Qgb25seSBpbiBIVE1MLlxuXG5bJ3RhYkluZGV4JywgJ2Nyb3NzT3JpZ2luJ10uZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlTmFtZSkge1xuICBwcm9wZXJ0aWVzW2F0dHJpYnV0ZU5hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChhdHRyaWJ1dGVOYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZS50b0xvd2VyQ2FzZSgpLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGF0dHJpYnV0ZXMgYWNjZXB0IFVSTHMuIFRoZXNlIG11c3Qgbm90IGFsbG93IGphdmFzY3JpcHQ6IFVSTFMuXG4vLyBUaGVzZSB3aWxsIGFsc28gbmVlZCB0byBhY2NlcHQgVHJ1c3RlZCBUeXBlcyBvYmplY3QgaW4gdGhlIGZ1dHVyZS5cblxudmFyIHhsaW5rSHJlZiA9ICd4bGlua0hyZWYnO1xucHJvcGVydGllc1t4bGlua0hyZWZdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZCgneGxpbmtIcmVmJywgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4neGxpbms6aHJlZicsICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywgdHJ1ZSwgLy8gc2FuaXRpemVVUkxcbmZhbHNlKTtcblsnc3JjJywgJ2hyZWYnLCAnYWN0aW9uJywgJ2Zvcm1BY3Rpb24nXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHByb3BlcnRpZXNbYXR0cmlidXRlTmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKGF0dHJpYnV0ZU5hbWUsIFNUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBhdHRyaWJ1dGVOYW1lLnRvTG93ZXJDYXNlKCksIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIHRydWUsIC8vIHNhbml0aXplVVJMXG4gIHRydWUpO1xufSk7XG5cbi8vIGFuZCBhbnkgbmV3bGluZSBvciB0YWIgYXJlIGZpbHRlcmVkIG91dCBhcyBpZiB0aGV5J3JlIG5vdCBwYXJ0IG9mIHRoZSBVUkwuXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI3VybC1wYXJzaW5nXG4vLyBUYWIgb3IgbmV3bGluZSBhcmUgZGVmaW5lZCBhcyBcXHJcXG5cXHQ6XG4vLyBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jYXNjaWktdGFiLW9yLW5ld2xpbmVcbi8vIEEgQzAgY29udHJvbCBpcyBhIGNvZGUgcG9pbnQgaW4gdGhlIHJhbmdlIFxcdTAwMDAgTlVMTCB0byBcXHUwMDFGXG4vLyBJTkZPUk1BVElPTiBTRVBBUkFUT1IgT05FLCBpbmNsdXNpdmU6XG4vLyBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jYzAtY29udHJvbC1vci1zcGFjZVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG5cbnZhciBpc0phdmFTY3JpcHRQcm90b2NvbCA9IC9eW1xcdTAwMDAtXFx1MDAxRiBdKmpbXFxyXFxuXFx0XSphW1xcclxcblxcdF0qdltcXHJcXG5cXHRdKmFbXFxyXFxuXFx0XSpzW1xcclxcblxcdF0qY1tcXHJcXG5cXHRdKnJbXFxyXFxuXFx0XSppW1xcclxcblxcdF0qcFtcXHJcXG5cXHRdKnRbXFxyXFxuXFx0XSpcXDovaTtcbnZhciBkaWRXYXJuID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHNhbml0aXplVVJMKHVybCkge1xuICB7XG4gICAgaWYgKCFkaWRXYXJuICYmIGlzSmF2YVNjcmlwdFByb3RvY29sLnRlc3QodXJsKSkge1xuICAgICAgZGlkV2FybiA9IHRydWU7XG5cbiAgICAgIGVycm9yKCdBIGZ1dHVyZSB2ZXJzaW9uIG9mIFJlYWN0IHdpbGwgYmxvY2sgamF2YXNjcmlwdDogVVJMcyBhcyBhIHNlY3VyaXR5IHByZWNhdXRpb24uICcgKyAnVXNlIGV2ZW50IGhhbmRsZXJzIGluc3RlYWQgaWYgeW91IGNhbi4gSWYgeW91IG5lZWQgdG8gZ2VuZXJhdGUgdW5zYWZlIEhUTUwgdHJ5ICcgKyAndXNpbmcgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgaW5zdGVhZC4gUmVhY3Qgd2FzIHBhc3NlZCAlcy4nLCBKU09OLnN0cmluZ2lmeSh1cmwpKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIGZvciBhIHByb3BlcnR5IG9uIGEgbm9kZS4gT25seSB1c2VkIGluIERFViBmb3IgU1NSIHZhbGlkYXRpb24uXG4gKiBUaGUgXCJleHBlY3RlZFwiIGFyZ3VtZW50IGlzIHVzZWQgYXMgYSBoaW50IG9mIHdoYXQgdGhlIGV4cGVjdGVkIHZhbHVlIGlzLlxuICogU29tZSBwcm9wZXJ0aWVzIGhhdmUgbXVsdGlwbGUgZXF1aXZhbGVudCB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGdldFZhbHVlRm9yUHJvcGVydHkobm9kZSwgbmFtZSwgZXhwZWN0ZWQsIHByb3BlcnR5SW5mbykge1xuICB7XG4gICAgaWYgKHByb3BlcnR5SW5mby5tdXN0VXNlUHJvcGVydHkpIHtcbiAgICAgIHZhciBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eUluZm8ucHJvcGVydHlOYW1lO1xuICAgICAgcmV0dXJuIG5vZGVbcHJvcGVydHlOYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhpcyBjaGVjayBwcm90ZWN0cyBtdWx0aXBsZSB1c2VzIG9mIGBleHBlY3RlZGAsIHdoaWNoIGlzIHdoeSB0aGVcbiAgICAgIC8vIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uIHJ1bGUgaXMgZGlzYWJsZWQgaW4gc2V2ZXJhbCBzcG90c1xuICAgICAgLy8gYmVsb3cuXG4gICAgICB7XG4gICAgICAgIGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24oZXhwZWN0ZWQsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIHByb3BlcnR5SW5mby5zYW5pdGl6ZVVSTCkge1xuICAgICAgICAvLyBJZiB3ZSBoYXZlbid0IGZ1bGx5IGRpc2FibGVkIGphdmFzY3JpcHQ6IFVSTHMsIGFuZCBpZlxuICAgICAgICAvLyB0aGUgaHlkcmF0aW9uIGlzIHN1Y2Nlc3NmdWwgb2YgYSBqYXZhc2NyaXB0OiBVUkwsIHdlXG4gICAgICAgIC8vIHN0aWxsIHdhbnQgdG8gd2FybiBvbiB0aGUgY2xpZW50LlxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cbiAgICAgICAgc2FuaXRpemVVUkwoJycgKyBleHBlY3RlZCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBhdHRyaWJ1dGVOYW1lID0gcHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWU7XG4gICAgICB2YXIgc3RyaW5nVmFsdWUgPSBudWxsO1xuXG4gICAgICBpZiAocHJvcGVydHlJbmZvLnR5cGUgPT09IE9WRVJMT0FERURfQk9PTEVBTikge1xuICAgICAgICBpZiAobm9kZS5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkpIHtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBub2RlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGUobmFtZSwgZXhwZWN0ZWQsIHByb3BlcnR5SW5mbywgZmFsc2UpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cblxuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSAnJyArIGV4cGVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG5vZGUuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgICAgIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGUobmFtZSwgZXhwZWN0ZWQsIHByb3BlcnR5SW5mbywgZmFsc2UpKSB7XG4gICAgICAgICAgLy8gV2UgaGFkIGFuIGF0dHJpYnV0ZSBidXQgc2hvdWxkbid0IGhhdmUgaGFkIG9uZSwgc28gcmVhZCBpdFxuICAgICAgICAgIC8vIGZvciB0aGUgZXJyb3IgbWVzc2FnZS5cbiAgICAgICAgICByZXR1cm4gbm9kZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcGVydHlJbmZvLnR5cGUgPT09IEJPT0xFQU4pIHtcbiAgICAgICAgICAvLyBJZiB0aGlzIHdhcyBhIGJvb2xlYW4sIGl0IGRvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIHZhbHVlIGlzXG4gICAgICAgICAgLy8gdGhlIGZhY3QgdGhhdCB3ZSBoYXZlIGl0IGlzIHRoZSBzYW1lIGFzIHRoZSBleHBlY3RlZC5cbiAgICAgICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgICAgIH0gLy8gRXZlbiBpZiB0aGlzIHByb3BlcnR5IHVzZXMgYSBuYW1lc3BhY2Ugd2UgdXNlIGdldEF0dHJpYnV0ZVxuICAgICAgICAvLyBiZWNhdXNlIHdlIGFzc3VtZSBpdHMgbmFtZXNwYWNlZCBuYW1lIGlzIHRoZSBzYW1lIGFzIG91ciBjb25maWcuXG4gICAgICAgIC8vIFRvIHVzZSBnZXRBdHRyaWJ1dGVOUyB3ZSBuZWVkIHRoZSBsb2NhbCBuYW1lIHdoaWNoIHdlIGRvbid0IGhhdmVcbiAgICAgICAgLy8gaW4gb3VyIGNvbmZpZyBhdG0uXG5cblxuICAgICAgICBzdHJpbmdWYWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkUmVtb3ZlQXR0cmlidXRlKG5hbWUsIGV4cGVjdGVkLCBwcm9wZXJ0eUluZm8sIGZhbHNlKSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nVmFsdWUgPT09IG51bGwgPyBleHBlY3RlZCA6IHN0cmluZ1ZhbHVlOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cbiAgICAgIH0gZWxzZSBpZiAoc3RyaW5nVmFsdWUgPT09ICcnICsgZXhwZWN0ZWQpIHtcbiAgICAgICAgcmV0dXJuIGV4cGVjdGVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZ1ZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIGZvciBhIGF0dHJpYnV0ZSBvbiBhIG5vZGUuIE9ubHkgdXNlZCBpbiBERVYgZm9yIFNTUiB2YWxpZGF0aW9uLlxuICogVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHVzZWQgYXMgYSBoaW50IG9mIHdoYXQgdGhlIGV4cGVjdGVkIHZhbHVlIGlzLiBTb21lXG4gKiBhdHRyaWJ1dGVzIGhhdmUgbXVsdGlwbGUgZXF1aXZhbGVudCB2YWx1ZXMuXG4gKi9cblxuZnVuY3Rpb24gZ2V0VmFsdWVGb3JBdHRyaWJ1dGUobm9kZSwgbmFtZSwgZXhwZWN0ZWQsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIHtcbiAgICBpZiAoIWlzQXR0cmlidXRlTmFtZVNhZmUobmFtZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIW5vZGUuaGFzQXR0cmlidXRlKG5hbWUpKSB7XG4gICAgICByZXR1cm4gZXhwZWN0ZWQgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG51bGw7XG4gICAgfVxuXG4gICAgdmFyIHZhbHVlID0gbm9kZS5nZXRBdHRyaWJ1dGUobmFtZSk7XG5cbiAgICB7XG4gICAgICBjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKGV4cGVjdGVkLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT09ICcnICsgZXhwZWN0ZWQpIHtcbiAgICAgIHJldHVybiBleHBlY3RlZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cbi8qKlxuICogU2V0cyB0aGUgdmFsdWUgZm9yIGEgcHJvcGVydHkgb24gYSBub2RlLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqL1xuXG5mdW5jdGlvbiBzZXRWYWx1ZUZvclByb3BlcnR5KG5vZGUsIG5hbWUsIHZhbHVlLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICB2YXIgcHJvcGVydHlJbmZvID0gZ2V0UHJvcGVydHlJbmZvKG5hbWUpO1xuXG4gIGlmIChzaG91bGRJZ25vcmVBdHRyaWJ1dGUobmFtZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoc2hvdWxkUmVtb3ZlQXR0cmlidXRlKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSkge1xuICAgIHZhbHVlID0gbnVsbDtcbiAgfVxuXG5cbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnIHx8IHByb3BlcnR5SW5mbyA9PT0gbnVsbCkge1xuICAgIGlmIChpc0F0dHJpYnV0ZU5hbWVTYWZlKG5hbWUpKSB7XG4gICAgICB2YXIgX2F0dHJpYnV0ZU5hbWUgPSBuYW1lO1xuXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoX2F0dHJpYnV0ZU5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAge1xuICAgICAgICAgIGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24odmFsdWUsIG5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoX2F0dHJpYnV0ZU5hbWUsICAnJyArIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgbXVzdFVzZVByb3BlcnR5ID0gcHJvcGVydHlJbmZvLm11c3RVc2VQcm9wZXJ0eTtcblxuICBpZiAobXVzdFVzZVByb3BlcnR5KSB7XG4gICAgdmFyIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5SW5mby5wcm9wZXJ0eU5hbWU7XG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHZhciB0eXBlID0gcHJvcGVydHlJbmZvLnR5cGU7XG4gICAgICBub2RlW3Byb3BlcnR5TmFtZV0gPSB0eXBlID09PSBCT09MRUFOID8gZmFsc2UgOiAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ29udHJhcnkgdG8gYHNldEF0dHJpYnV0ZWAsIG9iamVjdCBwcm9wZXJ0aWVzIGFyZSBwcm9wZXJseVxuICAgICAgLy8gYHRvU3RyaW5nYGVkIGJ5IElFOC85LlxuICAgICAgbm9kZVtwcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9IC8vIFRoZSByZXN0IGFyZSB0cmVhdGVkIGFzIGF0dHJpYnV0ZXMgd2l0aCBzcGVjaWFsIGNhc2VzLlxuXG5cbiAgdmFyIGF0dHJpYnV0ZU5hbWUgPSBwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZSxcbiAgICAgIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lc3BhY2U7XG5cbiAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIF90eXBlID0gcHJvcGVydHlJbmZvLnR5cGU7XG4gICAgdmFyIGF0dHJpYnV0ZVZhbHVlO1xuXG4gICAgaWYgKF90eXBlID09PSBCT09MRUFOIHx8IF90eXBlID09PSBPVkVSTE9BREVEX0JPT0xFQU4gJiYgdmFsdWUgPT09IHRydWUpIHtcbiAgICAgIC8vIElmIGF0dHJpYnV0ZSB0eXBlIGlzIGJvb2xlYW4sIHdlIGtub3cgZm9yIHN1cmUgaXQgd29uJ3QgYmUgYW4gZXhlY3V0aW9uIHNpbmtcbiAgICAgIC8vIGFuZCB3ZSB3b24ndCByZXF1aXJlIFRydXN0ZWQgVHlwZSBoZXJlLlxuICAgICAgYXR0cmlidXRlVmFsdWUgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYHNldEF0dHJpYnV0ZWAgd2l0aCBvYmplY3RzIGJlY29tZXMgb25seSBgW29iamVjdF1gIGluIElFOC85LFxuICAgICAgLy8gKCcnICsgdmFsdWUpIG1ha2VzIGl0IG91dHB1dCB0aGUgY29ycmVjdCB0b1N0cmluZygpLXZhbHVlLlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbih2YWx1ZSwgYXR0cmlidXRlTmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9ICcnICsgdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9wZXJ0eUluZm8uc2FuaXRpemVVUkwpIHtcbiAgICAgICAgc2FuaXRpemVVUkwoYXR0cmlidXRlVmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGF0dHJpYnV0ZU5hbWVzcGFjZSkge1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGVOUyhhdHRyaWJ1dGVOYW1lc3BhY2UsIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBBVFRFTlRJT05cbi8vIFdoZW4gYWRkaW5nIG5ldyBzeW1ib2xzIHRvIHRoaXMgZmlsZSxcbi8vIFBsZWFzZSBjb25zaWRlciBhbHNvIGFkZGluZyB0byAncmVhY3QtZGV2dG9vbHMtc2hhcmVkL3NyYy9iYWNrZW5kL1JlYWN0U3ltYm9scydcbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLlxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKTtcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnBvcnRhbCcpO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mcmFnbWVudCcpO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpO1xudmFyIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm9maWxlcicpO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm92aWRlcicpO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbnRleHQnKTtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZm9yd2FyZF9yZWYnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2UnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0Jyk7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubWVtbycpO1xudmFyIFJFQUNUX0xBWllfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmxhenknKTtcbnZhciBSRUFDVF9TQ09QRV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc2NvcGUnKTtcbnZhciBSRUFDVF9ERUJVR19UUkFDSU5HX01PREVfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmRlYnVnX3RyYWNlX21vZGUnKTtcbnZhciBSRUFDVF9PRkZTQ1JFRU5fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm9mZnNjcmVlbicpO1xudmFyIFJFQUNUX0xFR0FDWV9ISURERU5fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmxlZ2FjeV9oaWRkZW4nKTtcbnZhciBSRUFDVF9DQUNIRV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuY2FjaGUnKTtcbnZhciBSRUFDVF9UUkFDSU5HX01BUktFUl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QudHJhY2luZ19tYXJrZXInKTtcbnZhciBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgPSBTeW1ib2wuaXRlcmF0b3I7XG52YXIgRkFVWF9JVEVSQVRPUl9TWU1CT0wgPSAnQEBpdGVyYXRvcic7XG5mdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHtcbiAgaWYgKG1heWJlSXRlcmFibGUgPT09IG51bGwgfHwgdHlwZW9mIG1heWJlSXRlcmFibGUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgbWF5YmVJdGVyYXRvciA9IE1BWUJFX0lURVJBVE9SX1NZTUJPTCAmJiBtYXliZUl0ZXJhYmxlW01BWUJFX0lURVJBVE9SX1NZTUJPTF0gfHwgbWF5YmVJdGVyYWJsZVtGQVVYX0lURVJBVE9SX1NZTUJPTF07XG5cbiAgaWYgKHR5cGVvZiBtYXliZUl0ZXJhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG1heWJlSXRlcmF0b3I7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxudmFyIGFzc2lnbiA9IE9iamVjdC5hc3NpZ247XG5cbi8vIEhlbHBlcnMgdG8gcGF0Y2ggY29uc29sZS5sb2dzIHRvIGF2b2lkIGxvZ2dpbmcgZHVyaW5nIHNpZGUtZWZmZWN0IGZyZWVcbi8vIHJlcGxheWluZyBvbiByZW5kZXIgZnVuY3Rpb24uIFRoaXMgY3VycmVudGx5IG9ubHkgcGF0Y2hlcyB0aGUgb2JqZWN0XG4vLyBsYXppbHkgd2hpY2ggd29uJ3QgY292ZXIgaWYgdGhlIGxvZyBmdW5jdGlvbiB3YXMgZXh0cmFjdGVkIGVhZ2VybHkuXG4vLyBXZSBjb3VsZCBhbHNvIGVhZ2VybHkgcGF0Y2ggdGhlIG1ldGhvZC5cbnZhciBkaXNhYmxlZERlcHRoID0gMDtcbnZhciBwcmV2TG9nO1xudmFyIHByZXZJbmZvO1xudmFyIHByZXZXYXJuO1xudmFyIHByZXZFcnJvcjtcbnZhciBwcmV2R3JvdXA7XG52YXIgcHJldkdyb3VwQ29sbGFwc2VkO1xudmFyIHByZXZHcm91cEVuZDtcblxuZnVuY3Rpb24gZGlzYWJsZWRMb2coKSB7fVxuXG5kaXNhYmxlZExvZy5fX3JlYWN0RGlzYWJsZWRMb2cgPSB0cnVlO1xuZnVuY3Rpb24gZGlzYWJsZUxvZ3MoKSB7XG4gIHtcbiAgICBpZiAoZGlzYWJsZWREZXB0aCA9PT0gMCkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgICBwcmV2TG9nID0gY29uc29sZS5sb2c7XG4gICAgICBwcmV2SW5mbyA9IGNvbnNvbGUuaW5mbztcbiAgICAgIHByZXZXYXJuID0gY29uc29sZS53YXJuO1xuICAgICAgcHJldkVycm9yID0gY29uc29sZS5lcnJvcjtcbiAgICAgIHByZXZHcm91cCA9IGNvbnNvbGUuZ3JvdXA7XG4gICAgICBwcmV2R3JvdXBDb2xsYXBzZWQgPSBjb25zb2xlLmdyb3VwQ29sbGFwc2VkO1xuICAgICAgcHJldkdyb3VwRW5kID0gY29uc29sZS5ncm91cEVuZDsgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xOTA5OVxuXG4gICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IGRpc2FibGVkTG9nLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBpbmZvOiBwcm9wcyxcbiAgICAgICAgbG9nOiBwcm9wcyxcbiAgICAgICAgd2FybjogcHJvcHMsXG4gICAgICAgIGVycm9yOiBwcm9wcyxcbiAgICAgICAgZ3JvdXA6IHByb3BzLFxuICAgICAgICBncm91cENvbGxhcHNlZDogcHJvcHMsXG4gICAgICAgIGdyb3VwRW5kOiBwcm9wc1xuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGRpc2FibGVkRGVwdGgrKztcbiAgfVxufVxuZnVuY3Rpb24gcmVlbmFibGVMb2dzKCkge1xuICB7XG4gICAgZGlzYWJsZWREZXB0aC0tO1xuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lIEZsb3cgdGhpbmtzIGNvbnNvbGUgaXMgaW1tdXRhYmxlLlxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjb25zb2xlLCB7XG4gICAgICAgIGxvZzogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2TG9nXG4gICAgICAgIH0pLFxuICAgICAgICBpbmZvOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZJbmZvXG4gICAgICAgIH0pLFxuICAgICAgICB3YXJuOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZXYXJuXG4gICAgICAgIH0pLFxuICAgICAgICBlcnJvcjogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2RXJyb3JcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cFxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwQ29sbGFwc2VkXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cEVuZDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBFbmRcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICB9XG5cbiAgICBpZiAoZGlzYWJsZWREZXB0aCA8IDApIHtcbiAgICAgIGVycm9yKCdkaXNhYmxlZERlcHRoIGZlbGwgYmVsb3cgemVyby4gJyArICdUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyO1xudmFyIHByZWZpeDtcbmZ1bmN0aW9uIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUsIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgaWYgKHByZWZpeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBFeHRyYWN0IHRoZSBWTSBzcGVjaWZpYyBwcmVmaXggdXNlZCBieSBlYWNoIGxpbmUuXG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICB2YXIgbWF0Y2ggPSB4LnN0YWNrLnRyaW0oKS5tYXRjaCgvXFxuKCAqKGF0ICk/KS8pO1xuICAgICAgICBwcmVmaXggPSBtYXRjaCAmJiBtYXRjaFsxXSB8fCAnJztcbiAgICAgIH1cbiAgICB9IC8vIFdlIHVzZSB0aGUgcHJlZml4IHRvIGVuc3VyZSBvdXIgc3RhY2tzIGxpbmUgdXAgd2l0aCBuYXRpdmUgc3RhY2sgZnJhbWVzLlxuXG5cbiAgICByZXR1cm4gJ1xcbicgKyBwcmVmaXggKyBuYW1lO1xuICB9XG59XG52YXIgcmVlbnRyeSA9IGZhbHNlO1xudmFyIGNvbXBvbmVudEZyYW1lQ2FjaGU7XG5cbntcbiAgdmFyIFBvc3NpYmx5V2Vha01hcCA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nID8gV2Vha01hcCA6IE1hcDtcbiAgY29tcG9uZW50RnJhbWVDYWNoZSA9IG5ldyBQb3NzaWJseVdlYWtNYXAoKTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShmbiwgY29uc3RydWN0KSB7XG4gIC8vIElmIHNvbWV0aGluZyBhc2tlZCBmb3IgYSBzdGFjayBpbnNpZGUgYSBmYWtlIHJlbmRlciwgaXQgc2hvdWxkIGdldCBpZ25vcmVkLlxuICBpZiAoICFmbiB8fCByZWVudHJ5KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAge1xuICAgIHZhciBmcmFtZSA9IGNvbXBvbmVudEZyYW1lQ2FjaGUuZ2V0KGZuKTtcblxuICAgIGlmIChmcmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZnJhbWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbnRyb2w7XG4gIHJlZW50cnkgPSB0cnVlO1xuICB2YXIgcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZSA9IEVycm9yLnByZXBhcmVTdGFja1RyYWNlOyAvLyAkRmxvd0ZpeE1lIEl0IGRvZXMgYWNjZXB0IHVuZGVmaW5lZC5cblxuICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHVuZGVmaW5lZDtcbiAgdmFyIHByZXZpb3VzRGlzcGF0Y2hlcjtcblxuICB7XG4gICAgcHJldmlvdXNEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50OyAvLyBTZXQgdGhlIGRpc3BhdGNoZXIgaW4gREVWIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBjYWxsIGluIHRoZSByZW5kZXIgZnVuY3Rpb25cbiAgICAvLyBmb3Igd2FybmluZ3MuXG5cbiAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQgPSBudWxsO1xuICAgIGRpc2FibGVMb2dzKCk7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIFRoaXMgc2hvdWxkIHRocm93LlxuICAgIGlmIChjb25zdHJ1Y3QpIHtcbiAgICAgIC8vIFNvbWV0aGluZyBzaG91bGQgYmUgc2V0dGluZyB0aGUgcHJvcHMgaW4gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAgdmFyIEZha2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lXG5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZha2UucHJvdG90eXBlLCAncHJvcHMnLCB7XG4gICAgICAgIHNldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIFdlIHVzZSBhIHRocm93aW5nIHNldHRlciBpbnN0ZWFkIG9mIGZyb3plbiBvciBub24td3JpdGFibGUgcHJvcHNcbiAgICAgICAgICAvLyBiZWNhdXNlIHRoYXQgd29uJ3QgdGhyb3cgaW4gYSBub24tc3RyaWN0IG1vZGUgZnVuY3Rpb24uXG4gICAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgJiYgUmVmbGVjdC5jb25zdHJ1Y3QpIHtcbiAgICAgICAgLy8gV2UgY29uc3RydWN0IGEgZGlmZmVyZW50IGNvbnRyb2wgZm9yIHRoaXMgY2FzZSB0byBpbmNsdWRlIGFueSBleHRyYVxuICAgICAgICAvLyBmcmFtZXMgYWRkZWQgYnkgdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICB0cnkge1xuICAgICAgICAgIFJlZmxlY3QuY29uc3RydWN0KEZha2UsIFtdKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgICB9XG5cbiAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoZm4sIFtdLCBGYWtlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgRmFrZS5jYWxsKCk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZuLmNhbGwoRmFrZS5wcm90b3R5cGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICBjb250cm9sID0geDtcbiAgICAgIH1cblxuICAgICAgZm4oKTtcbiAgICB9XG4gIH0gY2F0Y2ggKHNhbXBsZSkge1xuICAgIC8vIFRoaXMgaXMgaW5saW5lZCBtYW51YWxseSBiZWNhdXNlIGNsb3N1cmUgZG9lc24ndCBkbyBpdCBmb3IgdXMuXG4gICAgaWYgKHNhbXBsZSAmJiBjb250cm9sICYmIHR5cGVvZiBzYW1wbGUuc3RhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBUaGlzIGV4dHJhY3RzIHRoZSBmaXJzdCBmcmFtZSBmcm9tIHRoZSBzYW1wbGUgdGhhdCBpc24ndCBhbHNvIGluIHRoZSBjb250cm9sLlxuICAgICAgLy8gU2tpcHBpbmcgb25lIGZyYW1lIHRoYXQgd2UgYXNzdW1lIGlzIHRoZSBmcmFtZSB0aGF0IGNhbGxzIHRoZSB0d28uXG4gICAgICB2YXIgc2FtcGxlTGluZXMgPSBzYW1wbGUuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIGNvbnRyb2xMaW5lcyA9IGNvbnRyb2wuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIHMgPSBzYW1wbGVMaW5lcy5sZW5ndGggLSAxO1xuICAgICAgdmFyIGMgPSBjb250cm9sTGluZXMubGVuZ3RoIC0gMTtcblxuICAgICAgd2hpbGUgKHMgPj0gMSAmJiBjID49IDAgJiYgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAvLyBXZSBleHBlY3QgYXQgbGVhc3Qgb25lIHN0YWNrIGZyYW1lIHRvIGJlIHNoYXJlZC5cbiAgICAgICAgLy8gVHlwaWNhbGx5IHRoaXMgd2lsbCBiZSB0aGUgcm9vdCBtb3N0IG9uZS4gSG93ZXZlciwgc3RhY2sgZnJhbWVzIG1heSBiZVxuICAgICAgICAvLyBjdXQgb2ZmIGR1ZSB0byBtYXhpbXVtIHN0YWNrIGxpbWl0cy4gSW4gdGhpcyBjYXNlLCBvbmUgbWF5YmUgY3V0IG9mZlxuICAgICAgICAvLyBlYXJsaWVyIHRoYW4gdGhlIG90aGVyLiBXZSBhc3N1bWUgdGhhdCB0aGUgc2FtcGxlIGlzIGxvbmdlciBvciB0aGUgc2FtZVxuICAgICAgICAvLyBhbmQgdGhlcmUgZm9yIGN1dCBvZmYgZWFybGllci4gU28gd2Ugc2hvdWxkIGZpbmQgdGhlIHJvb3QgbW9zdCBmcmFtZSBpblxuICAgICAgICAvLyB0aGUgc2FtcGxlIHNvbWV3aGVyZSBpbiB0aGUgY29udHJvbC5cbiAgICAgICAgYy0tO1xuICAgICAgfVxuXG4gICAgICBmb3IgKDsgcyA+PSAxICYmIGMgPj0gMDsgcy0tLCBjLS0pIHtcbiAgICAgICAgLy8gTmV4dCB3ZSBmaW5kIHRoZSBmaXJzdCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSB3aGljaCBzaG91bGQgYmUgdGhlXG4gICAgICAgIC8vIGZyYW1lIHRoYXQgY2FsbGVkIG91ciBzYW1wbGUgZnVuY3Rpb24gYW5kIHRoZSBjb250cm9sLlxuICAgICAgICBpZiAoc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgIC8vIEluIFY4LCB0aGUgZmlyc3QgbGluZSBpcyBkZXNjcmliaW5nIHRoZSBtZXNzYWdlIGJ1dCBvdGhlciBWTXMgZG9uJ3QuXG4gICAgICAgICAgLy8gSWYgd2UncmUgYWJvdXQgdG8gcmV0dXJuIHRoZSBmaXJzdCBsaW5lLCBhbmQgdGhlIGNvbnRyb2wgaXMgYWxzbyBvbiB0aGUgc2FtZVxuICAgICAgICAgIC8vIGxpbmUsIHRoYXQncyBhIHByZXR0eSBnb29kIGluZGljYXRvciB0aGF0IG91ciBzYW1wbGUgdGhyZXcgYXQgc2FtZSBsaW5lIGFzXG4gICAgICAgICAgLy8gdGhlIGNvbnRyb2wuIEkuZS4gYmVmb3JlIHdlIGVudGVyZWQgdGhlIHNhbXBsZSBmcmFtZS4gU28gd2UgaWdub3JlIHRoaXMgcmVzdWx0LlxuICAgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiB5b3UgcGFzc2VkIGEgY2xhc3MgdG8gZnVuY3Rpb24gY29tcG9uZW50LCBvciBub24tZnVuY3Rpb24uXG4gICAgICAgICAgaWYgKHMgIT09IDEgfHwgYyAhPT0gMSkge1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBzLS07XG4gICAgICAgICAgICAgIGMtLTsgLy8gV2UgbWF5IHN0aWxsIGhhdmUgc2ltaWxhciBpbnRlcm1lZGlhdGUgZnJhbWVzIGZyb20gdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICAgICAgICAvLyBUaGUgbmV4dCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSBzaG91bGQgYmUgb3VyIG1hdGNoIHRob3VnaC5cblxuICAgICAgICAgICAgICBpZiAoYyA8IDAgfHwgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgICAgICAgIC8vIFY4IGFkZHMgYSBcIm5ld1wiIHByZWZpeCBmb3IgbmF0aXZlIGNsYXNzZXMuIExldCdzIHJlbW92ZSBpdCB0byBtYWtlIGl0IHByZXR0aWVyLlxuICAgICAgICAgICAgICAgIHZhciBfZnJhbWUgPSAnXFxuJyArIHNhbXBsZUxpbmVzW3NdLnJlcGxhY2UoJyBhdCBuZXcgJywgJyBhdCAnKTsgLy8gSWYgb3VyIGNvbXBvbmVudCBmcmFtZSBpcyBsYWJlbGVkIFwiPGFub255bW91cz5cIlxuICAgICAgICAgICAgICAgIC8vIGJ1dCB3ZSBoYXZlIGEgdXNlci1wcm92aWRlZCBcImRpc3BsYXlOYW1lXCJcbiAgICAgICAgICAgICAgICAvLyBzcGxpY2UgaXQgaW4gdG8gbWFrZSB0aGUgc3RhY2sgbW9yZSByZWFkYWJsZS5cblxuXG4gICAgICAgICAgICAgICAgaWYgKGZuLmRpc3BsYXlOYW1lICYmIF9mcmFtZS5pbmNsdWRlcygnPGFub255bW91cz4nKSkge1xuICAgICAgICAgICAgICAgICAgX2ZyYW1lID0gX2ZyYW1lLnJlcGxhY2UoJzxhbm9ueW1vdXM+JywgZm4uZGlzcGxheU5hbWUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIF9mcmFtZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSAvLyBSZXR1cm4gdGhlIGxpbmUgd2UgZm91bmQuXG5cblxuICAgICAgICAgICAgICAgIHJldHVybiBfZnJhbWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gd2hpbGUgKHMgPj0gMSAmJiBjID49IDApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHJlZW50cnkgPSBmYWxzZTtcblxuICAgIHtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudCA9IHByZXZpb3VzRGlzcGF0Y2hlcjtcbiAgICAgIHJlZW5hYmxlTG9ncygpO1xuICAgIH1cblxuICAgIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZTtcbiAgfSAvLyBGYWxsYmFjayB0byBqdXN0IHVzaW5nIHRoZSBuYW1lIGlmIHdlIGNvdWxkbid0IG1ha2UgaXQgdGhyb3cuXG5cblxuICB2YXIgbmFtZSA9IGZuID8gZm4uZGlzcGxheU5hbWUgfHwgZm4ubmFtZSA6ICcnO1xuICB2YXIgc3ludGhldGljRnJhbWUgPSBuYW1lID8gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSkgOiAnJztcblxuICB7XG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIHN5bnRoZXRpY0ZyYW1lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3ludGhldGljRnJhbWU7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlQ2xhc3NDb21wb25lbnRGcmFtZShjdG9yLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGN0b3IsIHRydWUpO1xuICB9XG59XG5mdW5jdGlvbiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZm4sIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGZhbHNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QoQ29tcG9uZW50KSB7XG4gIHZhciBwcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICByZXR1cm4gISEocHJvdG90eXBlICYmIHByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUsIHNvdXJjZSwgb3duZXJGbikge1xuXG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB7XG4gICAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZSh0eXBlLCBzaG91bGRDb25zdHJ1Y3QodHlwZSkpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUodHlwZSk7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlJyk7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2VMaXN0Jyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUodHlwZS5yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgLy8gTWVtbyBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLnR5cGUsIHNvdXJjZSwgb3duZXJGbik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSB0eXBlO1xuICAgICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gTGF6eSBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgICAgIHJldHVybiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoaW5pdChwYXlsb2FkKSwgc291cmNlLCBvd25lckZuKTtcbiAgICAgICAgICB9IGNhdGNoICh4KSB7fVxuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZUZpYmVyKGZpYmVyKSB7XG4gIHZhciBvd25lciA9ICBmaWJlci5fZGVidWdPd25lciA/IGZpYmVyLl9kZWJ1Z093bmVyLnR5cGUgOiBudWxsIDtcbiAgdmFyIHNvdXJjZSA9ICBmaWJlci5fZGVidWdTb3VyY2UgO1xuXG4gIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKGZpYmVyLnR5cGUpO1xuXG4gICAgY2FzZSBMYXp5Q29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdMYXp5Jyk7XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZScpO1xuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlTGlzdCcpO1xuXG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEluZGV0ZXJtaW5hdGVDb21wb25lbnQ6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZShmaWJlci50eXBlKTtcblxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZmliZXIudHlwZS5yZW5kZXIpO1xuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUNsYXNzQ29tcG9uZW50RnJhbWUoZmliZXIudHlwZSk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICcnO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFN0YWNrQnlGaWJlckluRGV2QW5kUHJvZCh3b3JrSW5Qcm9ncmVzcykge1xuICB0cnkge1xuICAgIHZhciBpbmZvID0gJyc7XG4gICAgdmFyIG5vZGUgPSB3b3JrSW5Qcm9ncmVzcztcblxuICAgIGRvIHtcbiAgICAgIGluZm8gKz0gZGVzY3JpYmVGaWJlcihub2RlKTtcbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9IHdoaWxlIChub2RlKTtcblxuICAgIHJldHVybiBpbmZvO1xuICB9IGNhdGNoICh4KSB7XG4gICAgcmV0dXJuICdcXG5FcnJvciBnZW5lcmF0aW5nIHN0YWNrOiAnICsgeC5tZXNzYWdlICsgJ1xcbicgKyB4LnN0YWNrO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFdyYXBwZWROYW1lKG91dGVyVHlwZSwgaW5uZXJUeXBlLCB3cmFwcGVyTmFtZSkge1xuICB2YXIgZGlzcGxheU5hbWUgPSBvdXRlclR5cGUuZGlzcGxheU5hbWU7XG5cbiAgaWYgKGRpc3BsYXlOYW1lKSB7XG4gICAgcmV0dXJuIGRpc3BsYXlOYW1lO1xuICB9XG5cbiAgdmFyIGZ1bmN0aW9uTmFtZSA9IGlubmVyVHlwZS5kaXNwbGF5TmFtZSB8fCBpbm5lclR5cGUubmFtZSB8fCAnJztcbiAgcmV0dXJuIGZ1bmN0aW9uTmFtZSAhPT0gJycgPyB3cmFwcGVyTmFtZSArIFwiKFwiICsgZnVuY3Rpb25OYW1lICsgXCIpXCIgOiB3cmFwcGVyTmFtZTtcbn0gLy8gS2VlcCBpbiBzeW5jIHdpdGggcmVhY3QtcmVjb25jaWxlci9nZXRDb21wb25lbnROYW1lRnJvbUZpYmVyXG5cblxuZnVuY3Rpb24gZ2V0Q29udGV4dE5hbWUodHlwZSkge1xuICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCAnQ29udGV4dCc7XG59IC8vIE5vdGUgdGhhdCB0aGUgcmVjb25jaWxlciBwYWNrYWdlIHNob3VsZCBnZW5lcmFsbHkgcHJlZmVyIHRvIHVzZSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKCkgaW5zdGVhZC5cblxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSkge1xuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgLy8gSG9zdCByb290LCB0ZXh0IG5vZGUgb3IganVzdCBpbnZhbGlkIHR5cGUuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB7XG4gICAgaWYgKHR5cGVvZiB0eXBlLnRhZyA9PT0gJ251bWJlcicpIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCBhbiB1bmV4cGVjdGVkIG9iamVjdCBpbiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoKS4gJyArICdUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8IG51bGw7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICByZXR1cm4gJ0ZyYWdtZW50JztcblxuICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICByZXR1cm4gJ1BvcnRhbCc7XG5cbiAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICByZXR1cm4gJ1Byb2ZpbGVyJztcblxuICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgIHJldHVybiAnU3RyaWN0TW9kZSc7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlJztcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgcmV0dXJuICdTdXNwZW5zZUxpc3QnO1xuXG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUoY29udGV4dCkgKyAnLkNvbnN1bWVyJztcblxuICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICB2YXIgcHJvdmlkZXIgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUocHJvdmlkZXIuX2NvbnRleHQpICsgJy5Qcm92aWRlcic7XG5cbiAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgcmV0dXJuIGdldFdyYXBwZWROYW1lKHR5cGUsIHR5cGUucmVuZGVyLCAnRm9yd2FyZFJlZicpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgdmFyIG91dGVyTmFtZSA9IHR5cGUuZGlzcGxheU5hbWUgfHwgbnVsbDtcblxuICAgICAgICBpZiAob3V0ZXJOYW1lICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIG91dGVyTmFtZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZS50eXBlKSB8fCAnTWVtbyc7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSB0eXBlO1xuICAgICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShpbml0KHBheWxvYWQpKTtcbiAgICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldFdyYXBwZWROYW1lJDEob3V0ZXJUeXBlLCBpbm5lclR5cGUsIHdyYXBwZXJOYW1lKSB7XG4gIHZhciBmdW5jdGlvbk5hbWUgPSBpbm5lclR5cGUuZGlzcGxheU5hbWUgfHwgaW5uZXJUeXBlLm5hbWUgfHwgJyc7XG4gIHJldHVybiBvdXRlclR5cGUuZGlzcGxheU5hbWUgfHwgKGZ1bmN0aW9uTmFtZSAhPT0gJycgPyB3cmFwcGVyTmFtZSArIFwiKFwiICsgZnVuY3Rpb25OYW1lICsgXCIpXCIgOiB3cmFwcGVyTmFtZSk7XG59IC8vIEtlZXAgaW4gc3luYyB3aXRoIHNoYXJlZC9nZXRDb21wb25lbnROYW1lRnJvbVR5cGVcblxuXG5mdW5jdGlvbiBnZXRDb250ZXh0TmFtZSQxKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgJ0NvbnRleHQnO1xufVxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB7XG4gIHZhciB0YWcgPSBmaWJlci50YWcsXG4gICAgICB0eXBlID0gZmliZXIudHlwZTtcblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgQ2FjaGVDb21wb25lbnQ6XG4gICAgICByZXR1cm4gJ0NhY2hlJztcblxuICAgIGNhc2UgQ29udGV4dENvbnN1bWVyOlxuICAgICAgdmFyIGNvbnRleHQgPSB0eXBlO1xuICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lJDEoY29udGV4dCkgKyAnLkNvbnN1bWVyJztcblxuICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgICAgdmFyIHByb3ZpZGVyID0gdHlwZTtcbiAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZSQxKHByb3ZpZGVyLl9jb250ZXh0KSArICcuUHJvdmlkZXInO1xuXG4gICAgY2FzZSBEZWh5ZHJhdGVkRnJhZ21lbnQ6XG4gICAgICByZXR1cm4gJ0RlaHlkcmF0ZWRGcmFnbWVudCc7XG5cbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICByZXR1cm4gZ2V0V3JhcHBlZE5hbWUkMSh0eXBlLCB0eXBlLnJlbmRlciwgJ0ZvcndhcmRSZWYnKTtcblxuICAgIGNhc2UgRnJhZ21lbnQ6XG4gICAgICByZXR1cm4gJ0ZyYWdtZW50JztcblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIC8vIEhvc3QgY29tcG9uZW50IHR5cGUgaXMgdGhlIGRpc3BsYXkgbmFtZSAoZS5nLiBcImRpdlwiLCBcIlZpZXdcIilcbiAgICAgIHJldHVybiB0eXBlO1xuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgcmV0dXJuICdQb3J0YWwnO1xuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHJldHVybiAnUm9vdCc7XG5cbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgcmV0dXJuICdUZXh0JztcblxuICAgIGNhc2UgTGF6eUNvbXBvbmVudDpcbiAgICAgIC8vIE5hbWUgY29tZXMgZnJvbSB0aGUgdHlwZSBpbiB0aGlzIGNhc2U7IHdlIGRvbid0IGhhdmUgYSB0YWcuXG4gICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpO1xuXG4gICAgY2FzZSBNb2RlOlxuICAgICAgaWYgKHR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEUpIHtcbiAgICAgICAgLy8gRG9uJ3QgYmUgbGVzcyBzcGVjaWZpYyB0aGFuIHNoYXJlZC9nZXRDb21wb25lbnROYW1lRnJvbVR5cGVcbiAgICAgICAgcmV0dXJuICdTdHJpY3RNb2RlJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICdNb2RlJztcblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgICAgcmV0dXJuICdPZmZzY3JlZW4nO1xuXG4gICAgY2FzZSBQcm9maWxlcjpcbiAgICAgIHJldHVybiAnUHJvZmlsZXInO1xuXG4gICAgY2FzZSBTY29wZUNvbXBvbmVudDpcbiAgICAgIHJldHVybiAnU2NvcGUnO1xuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHJldHVybiAnU3VzcGVuc2UnO1xuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlTGlzdCc7XG5cbiAgICBjYXNlIFRyYWNpbmdNYXJrZXJDb21wb25lbnQ6XG4gICAgICByZXR1cm4gJ1RyYWNpbmdNYXJrZXInO1xuICAgIC8vIFRoZSBkaXNwbGF5IG5hbWUgZm9yIHRoaXMgdGFncyBjb21lIGZyb20gdGhlIHVzZXItcHJvdmlkZWQgdHlwZTpcblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEluY29tcGxldGVDbGFzc0NvbXBvbmVudDpcbiAgICBjYXNlIEluZGV0ZXJtaW5hdGVDb21wb25lbnQ6XG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdHlwZTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG52YXIgY3VycmVudCA9IG51bGw7XG52YXIgaXNSZW5kZXJpbmcgPSBmYWxzZTtcbmZ1bmN0aW9uIGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCkge1xuICB7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBvd25lciA9IGN1cnJlbnQuX2RlYnVnT3duZXI7XG5cbiAgICBpZiAob3duZXIgIT09IG51bGwgJiYgdHlwZW9mIG93bmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIob3duZXIpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRDdXJyZW50RmliZXJTdGFja0luRGV2KCkge1xuICB7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9IC8vIFNhZmUgYmVjYXVzZSBpZiBjdXJyZW50IGZpYmVyIGV4aXN0cywgd2UgYXJlIHJlY29uY2lsaW5nLFxuICAgIC8vIGFuZCBpdCBpcyBndWFyYW50ZWVkIHRvIGJlIHRoZSB3b3JrLWluLXByb2dyZXNzIHZlcnNpb24uXG5cblxuICAgIHJldHVybiBnZXRTdGFja0J5RmliZXJJbkRldkFuZFByb2QoY3VycmVudCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzZXRDdXJyZW50RmliZXIoKSB7XG4gIHtcbiAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldEN1cnJlbnRTdGFjayA9IG51bGw7XG4gICAgY3VycmVudCA9IG51bGw7XG4gICAgaXNSZW5kZXJpbmcgPSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gc2V0Q3VycmVudEZpYmVyKGZpYmVyKSB7XG4gIHtcbiAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldEN1cnJlbnRTdGFjayA9IGZpYmVyID09PSBudWxsID8gbnVsbCA6IGdldEN1cnJlbnRGaWJlclN0YWNrSW5EZXY7XG4gICAgY3VycmVudCA9IGZpYmVyO1xuICAgIGlzUmVuZGVyaW5nID0gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldEN1cnJlbnRGaWJlcigpIHtcbiAge1xuICAgIHJldHVybiBjdXJyZW50O1xuICB9XG59XG5mdW5jdGlvbiBzZXRJc1JlbmRlcmluZyhyZW5kZXJpbmcpIHtcbiAge1xuICAgIGlzUmVuZGVyaW5nID0gcmVuZGVyaW5nO1xuICB9XG59XG5cbi8vIEZsb3cgZG9lcyBub3QgYWxsb3cgc3RyaW5nIGNvbmNhdGVuYXRpb24gb2YgbW9zdCBub24tc3RyaW5nIHR5cGVzLiBUbyB3b3JrXG4vLyBhcm91bmQgdGhpcyBsaW1pdGF0aW9uLCB3ZSB1c2UgYW4gb3BhcXVlIHR5cGUgdGhhdCBjYW4gb25seSBiZSBvYnRhaW5lZCBieVxuLy8gcGFzc2luZyB0aGUgdmFsdWUgdGhyb3VnaCBnZXRUb1N0cmluZ1ZhbHVlIGZpcnN0LlxuZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgLy8gVGhlIGNvZXJjaW9uIHNhZmV0eSBjaGVjayBpcyBwZXJmb3JtZWQgaW4gZ2V0VG9TdHJpbmdWYWx1ZSgpLlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cbiAgcmV0dXJuICcnICsgdmFsdWU7XG59XG5mdW5jdGlvbiBnZXRUb1N0cmluZ1ZhbHVlKHZhbHVlKSB7XG4gIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICByZXR1cm4gdmFsdWU7XG5cbiAgICBjYXNlICdvYmplY3QnOlxuICAgICAge1xuICAgICAgICBjaGVja0Zvcm1GaWVsZFZhbHVlU3RyaW5nQ29lcmNpb24odmFsdWUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdmFsdWU7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgLy8gZnVuY3Rpb24sIHN5bWJvbCBhcmUgYXNzaWduZWQgYXMgZW1wdHkgc3RyaW5nc1xuICAgICAgcmV0dXJuICcnO1xuICB9XG59XG5cbnZhciBoYXNSZWFkT25seVZhbHVlID0ge1xuICBidXR0b246IHRydWUsXG4gIGNoZWNrYm94OiB0cnVlLFxuICBpbWFnZTogdHJ1ZSxcbiAgaGlkZGVuOiB0cnVlLFxuICByYWRpbzogdHJ1ZSxcbiAgcmVzZXQ6IHRydWUsXG4gIHN1Ym1pdDogdHJ1ZVxufTtcbmZ1bmN0aW9uIGNoZWNrQ29udHJvbGxlZFZhbHVlUHJvcHModGFnTmFtZSwgcHJvcHMpIHtcbiAge1xuICAgIGlmICghKGhhc1JlYWRPbmx5VmFsdWVbcHJvcHMudHlwZV0gfHwgcHJvcHMub25DaGFuZ2UgfHwgcHJvcHMub25JbnB1dCB8fCBwcm9wcy5yZWFkT25seSB8fCBwcm9wcy5kaXNhYmxlZCB8fCBwcm9wcy52YWx1ZSA9PSBudWxsKSkge1xuICAgICAgZXJyb3IoJ1lvdSBwcm92aWRlZCBhIGB2YWx1ZWAgcHJvcCB0byBhIGZvcm0gZmllbGQgd2l0aG91dCBhbiAnICsgJ2BvbkNoYW5nZWAgaGFuZGxlci4gVGhpcyB3aWxsIHJlbmRlciBhIHJlYWQtb25seSBmaWVsZC4gSWYgJyArICd0aGUgZmllbGQgc2hvdWxkIGJlIG11dGFibGUgdXNlIGBkZWZhdWx0VmFsdWVgLiBPdGhlcndpc2UsICcgKyAnc2V0IGVpdGhlciBgb25DaGFuZ2VgIG9yIGByZWFkT25seWAuJyk7XG4gICAgfVxuXG4gICAgaWYgKCEocHJvcHMub25DaGFuZ2UgfHwgcHJvcHMucmVhZE9ubHkgfHwgcHJvcHMuZGlzYWJsZWQgfHwgcHJvcHMuY2hlY2tlZCA9PSBudWxsKSkge1xuICAgICAgZXJyb3IoJ1lvdSBwcm92aWRlZCBhIGBjaGVja2VkYCBwcm9wIHRvIGEgZm9ybSBmaWVsZCB3aXRob3V0IGFuICcgKyAnYG9uQ2hhbmdlYCBoYW5kbGVyLiBUaGlzIHdpbGwgcmVuZGVyIGEgcmVhZC1vbmx5IGZpZWxkLiBJZiAnICsgJ3RoZSBmaWVsZCBzaG91bGQgYmUgbXV0YWJsZSB1c2UgYGRlZmF1bHRDaGVja2VkYC4gT3RoZXJ3aXNlLCAnICsgJ3NldCBlaXRoZXIgYG9uQ2hhbmdlYCBvciBgcmVhZE9ubHlgLicpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc0NoZWNrYWJsZShlbGVtKSB7XG4gIHZhciB0eXBlID0gZWxlbS50eXBlO1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lO1xuICByZXR1cm4gbm9kZU5hbWUgJiYgbm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0JyAmJiAodHlwZSA9PT0gJ2NoZWNrYm94JyB8fCB0eXBlID09PSAncmFkaW8nKTtcbn1cblxuZnVuY3Rpb24gZ2V0VHJhY2tlcihub2RlKSB7XG4gIHJldHVybiBub2RlLl92YWx1ZVRyYWNrZXI7XG59XG5cbmZ1bmN0aW9uIGRldGFjaFRyYWNrZXIobm9kZSkge1xuICBub2RlLl92YWx1ZVRyYWNrZXIgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRWYWx1ZUZyb21Ob2RlKG5vZGUpIHtcbiAgdmFyIHZhbHVlID0gJyc7XG5cbiAgaWYgKCFub2RlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgaWYgKGlzQ2hlY2thYmxlKG5vZGUpKSB7XG4gICAgdmFsdWUgPSBub2RlLmNoZWNrZWQgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICB9IGVsc2Uge1xuICAgIHZhbHVlID0gbm9kZS52YWx1ZTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gdHJhY2tWYWx1ZU9uTm9kZShub2RlKSB7XG4gIHZhciB2YWx1ZUZpZWxkID0gaXNDaGVja2FibGUobm9kZSkgPyAnY2hlY2tlZCcgOiAndmFsdWUnO1xuICB2YXIgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobm9kZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHZhbHVlRmllbGQpO1xuXG4gIHtcbiAgICBjaGVja0Zvcm1GaWVsZFZhbHVlU3RyaW5nQ29lcmNpb24obm9kZVt2YWx1ZUZpZWxkXSk7XG4gIH1cblxuICB2YXIgY3VycmVudFZhbHVlID0gJycgKyBub2RlW3ZhbHVlRmllbGRdOyAvLyBpZiBzb21lb25lIGhhcyBhbHJlYWR5IGRlZmluZWQgYSB2YWx1ZSBvciBTYWZhcmksIHRoZW4gYmFpbFxuICAvLyBhbmQgZG9uJ3QgdHJhY2sgdmFsdWUgd2lsbCBjYXVzZSBvdmVyIHJlcG9ydGluZyBvZiBjaGFuZ2VzLFxuICAvLyBidXQgaXQncyBiZXR0ZXIgdGhlbiBhIGhhcmQgZmFpbHVyZVxuICAvLyAobmVlZGVkIGZvciBjZXJ0YWluIHRlc3RzIHRoYXQgc3B5T24gaW5wdXQgdmFsdWVzIGFuZCBTYWZhcmkpXG5cbiAgaWYgKG5vZGUuaGFzT3duUHJvcGVydHkodmFsdWVGaWVsZCkgfHwgdHlwZW9mIGRlc2NyaXB0b3IgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBkZXNjcmlwdG9yLmdldCAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgZGVzY3JpcHRvci5zZXQgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgZ2V0ID0gZGVzY3JpcHRvci5nZXQsXG4gICAgICBzZXQgPSBkZXNjcmlwdG9yLnNldDtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5vZGUsIHZhbHVlRmllbGQsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZ2V0LmNhbGwodGhpcyk7XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAge1xuICAgICAgICBjaGVja0Zvcm1GaWVsZFZhbHVlU3RyaW5nQ29lcmNpb24odmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50VmFsdWUgPSAnJyArIHZhbHVlO1xuICAgICAgc2V0LmNhbGwodGhpcywgdmFsdWUpO1xuICAgIH1cbiAgfSk7IC8vIFdlIGNvdWxkJ3ZlIHBhc3NlZCB0aGlzIHRoZSBmaXJzdCB0aW1lXG4gIC8vIGJ1dCBpdCB0cmlnZ2VycyBhIGJ1ZyBpbiBJRTExIGFuZCBFZGdlIDE0LzE1LlxuICAvLyBDYWxsaW5nIGRlZmluZVByb3BlcnR5KCkgYWdhaW4gc2hvdWxkIGJlIGVxdWl2YWxlbnQuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTE3NjhcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobm9kZSwgdmFsdWVGaWVsZCwge1xuICAgIGVudW1lcmFibGU6IGRlc2NyaXB0b3IuZW51bWVyYWJsZVxuICB9KTtcbiAgdmFyIHRyYWNrZXIgPSB7XG4gICAgZ2V0VmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBjdXJyZW50VmFsdWU7XG4gICAgfSxcbiAgICBzZXRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICB7XG4gICAgICAgIGNoZWNrRm9ybUZpZWxkVmFsdWVTdHJpbmdDb2VyY2lvbih2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnRWYWx1ZSA9ICcnICsgdmFsdWU7XG4gICAgfSxcbiAgICBzdG9wVHJhY2tpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGRldGFjaFRyYWNrZXIobm9kZSk7XG4gICAgICBkZWxldGUgbm9kZVt2YWx1ZUZpZWxkXTtcbiAgICB9XG4gIH07XG4gIHJldHVybiB0cmFja2VyO1xufVxuXG5mdW5jdGlvbiB0cmFjayhub2RlKSB7XG4gIGlmIChnZXRUcmFja2VyKG5vZGUpKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIFRPRE86IE9uY2UgaXQncyBqdXN0IEZpYmVyIHdlIGNhbiBtb3ZlIHRoaXMgdG8gbm9kZS5fd3JhcHBlclN0YXRlXG5cblxuICBub2RlLl92YWx1ZVRyYWNrZXIgPSB0cmFja1ZhbHVlT25Ob2RlKG5vZGUpO1xufVxuZnVuY3Rpb24gdXBkYXRlVmFsdWVJZkNoYW5nZWQobm9kZSkge1xuICBpZiAoIW5vZGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgdHJhY2tlciA9IGdldFRyYWNrZXIobm9kZSk7IC8vIGlmIHRoZXJlIGlzIG5vIHRyYWNrZXIgYXQgdGhpcyBwb2ludCBpdCdzIHVubGlrZWx5XG4gIC8vIHRoYXQgdHJ5aW5nIGFnYWluIHdpbGwgc3VjY2VlZFxuXG4gIGlmICghdHJhY2tlcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdmFyIGxhc3RWYWx1ZSA9IHRyYWNrZXIuZ2V0VmFsdWUoKTtcbiAgdmFyIG5leHRWYWx1ZSA9IGdldFZhbHVlRnJvbU5vZGUobm9kZSk7XG5cbiAgaWYgKG5leHRWYWx1ZSAhPT0gbGFzdFZhbHVlKSB7XG4gICAgdHJhY2tlci5zZXRWYWx1ZShuZXh0VmFsdWUpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRBY3RpdmVFbGVtZW50KGRvYykge1xuICBkb2MgPSBkb2MgfHwgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgPyBkb2N1bWVudCA6IHVuZGVmaW5lZCk7XG5cbiAgaWYgKHR5cGVvZiBkb2MgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBkb2MuYWN0aXZlRWxlbWVudCB8fCBkb2MuYm9keTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBkb2MuYm9keTtcbiAgfVxufVxuXG52YXIgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlID0gZmFsc2U7XG52YXIgZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZCA9IGZhbHNlO1xudmFyIGRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQgPSBmYWxzZTtcbnZhciBkaWRXYXJuVW5jb250cm9sbGVkVG9Db250cm9sbGVkID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGlzQ29udHJvbGxlZChwcm9wcykge1xuICB2YXIgdXNlc0NoZWNrZWQgPSBwcm9wcy50eXBlID09PSAnY2hlY2tib3gnIHx8IHByb3BzLnR5cGUgPT09ICdyYWRpbyc7XG4gIHJldHVybiB1c2VzQ2hlY2tlZCA/IHByb3BzLmNoZWNrZWQgIT0gbnVsbCA6IHByb3BzLnZhbHVlICE9IG51bGw7XG59XG4vKipcbiAqIEltcGxlbWVudHMgYW4gPGlucHV0PiBob3N0IGNvbXBvbmVudCB0aGF0IGFsbG93cyBzZXR0aW5nIHRoZXNlIG9wdGlvbmFsXG4gKiBwcm9wczogYGNoZWNrZWRgLCBgdmFsdWVgLCBgZGVmYXVsdENoZWNrZWRgLCBhbmQgYGRlZmF1bHRWYWx1ZWAuXG4gKlxuICogSWYgYGNoZWNrZWRgIG9yIGB2YWx1ZWAgYXJlIG5vdCBzdXBwbGllZCAob3IgbnVsbC91bmRlZmluZWQpLCB1c2VyIGFjdGlvbnNcbiAqIHRoYXQgYWZmZWN0IHRoZSBjaGVja2VkIHN0YXRlIG9yIHZhbHVlIHdpbGwgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LlxuICpcbiAqIElmIHRoZXkgYXJlIHN1cHBsaWVkIChhbmQgbm90IG51bGwvdW5kZWZpbmVkKSwgdGhlIHJlbmRlcmVkIGVsZW1lbnQgd2lsbCBub3RcbiAqIHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgZWxlbWVudC4gSW5zdGVhZCwgdGhlIHByb3BzIG11c3QgY2hhbmdlIGluIG9yZGVyIGZvclxuICogdGhlIHJlbmRlcmVkIGVsZW1lbnQgdG8gYmUgdXBkYXRlZC5cbiAqXG4gKiBUaGUgcmVuZGVyZWQgZWxlbWVudCB3aWxsIGJlIGluaXRpYWxpemVkIGFzIHVuY2hlY2tlZCAob3IgYGRlZmF1bHRDaGVja2VkYClcbiAqIHdpdGggYW4gZW1wdHkgdmFsdWUgKG9yIGBkZWZhdWx0VmFsdWVgKS5cbiAqXG4gKiBTZWUgaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMi9XRC1odG1sNS0yMDEyMTAyNS90aGUtaW5wdXQtZWxlbWVudC5odG1sXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRIb3N0UHJvcHMoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgY2hlY2tlZCA9IHByb3BzLmNoZWNrZWQ7XG4gIHZhciBob3N0UHJvcHMgPSBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgZGVmYXVsdENoZWNrZWQ6IHVuZGVmaW5lZCxcbiAgICBkZWZhdWx0VmFsdWU6IHVuZGVmaW5lZCxcbiAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgIGNoZWNrZWQ6IGNoZWNrZWQgIT0gbnVsbCA/IGNoZWNrZWQgOiBub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbENoZWNrZWRcbiAgfSk7XG4gIHJldHVybiBob3N0UHJvcHM7XG59XG5mdW5jdGlvbiBpbml0V3JhcHBlclN0YXRlKGVsZW1lbnQsIHByb3BzKSB7XG4gIHtcbiAgICBjaGVja0NvbnRyb2xsZWRWYWx1ZVByb3BzKCdpbnB1dCcsIHByb3BzKTtcblxuICAgIGlmIChwcm9wcy5jaGVja2VkICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZGVmYXVsdENoZWNrZWQgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZCkge1xuICAgICAgZXJyb3IoJyVzIGNvbnRhaW5zIGFuIGlucHV0IG9mIHR5cGUgJXMgd2l0aCBib3RoIGNoZWNrZWQgYW5kIGRlZmF1bHRDaGVja2VkIHByb3BzLiAnICsgJ0lucHV0IGVsZW1lbnRzIG11c3QgYmUgZWl0aGVyIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkICcgKyAnKHNwZWNpZnkgZWl0aGVyIHRoZSBjaGVja2VkIHByb3AsIG9yIHRoZSBkZWZhdWx0Q2hlY2tlZCBwcm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgJyArICdlbGVtZW50IGFuZCByZW1vdmUgb25lIG9mIHRoZXNlIHByb3BzLiBNb3JlIGluZm86ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2NvbnRyb2xsZWQtY29tcG9uZW50cycsIGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCkgfHwgJ0EgY29tcG9uZW50JywgcHJvcHMudHlwZSk7XG5cbiAgICAgIGRpZFdhcm5DaGVja2VkRGVmYXVsdENoZWNrZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUpIHtcbiAgICAgIGVycm9yKCclcyBjb250YWlucyBhbiBpbnB1dCBvZiB0eXBlICVzIHdpdGggYm90aCB2YWx1ZSBhbmQgZGVmYXVsdFZhbHVlIHByb3BzLiAnICsgJ0lucHV0IGVsZW1lbnRzIG11c3QgYmUgZWl0aGVyIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkICcgKyAnKHNwZWNpZnkgZWl0aGVyIHRoZSB2YWx1ZSBwcm9wLCBvciB0aGUgZGVmYXVsdFZhbHVlIHByb3AsIGJ1dCBub3QgJyArICdib3RoKS4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCAnICsgJ2VsZW1lbnQgYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzJywgZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKSB8fCAnQSBjb21wb25lbnQnLCBwcm9wcy50eXBlKTtcblxuICAgICAgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIHZhciBkZWZhdWx0VmFsdWUgPSBwcm9wcy5kZWZhdWx0VmFsdWUgPT0gbnVsbCA/ICcnIDogcHJvcHMuZGVmYXVsdFZhbHVlO1xuICBub2RlLl93cmFwcGVyU3RhdGUgPSB7XG4gICAgaW5pdGlhbENoZWNrZWQ6IHByb3BzLmNoZWNrZWQgIT0gbnVsbCA/IHByb3BzLmNoZWNrZWQgOiBwcm9wcy5kZWZhdWx0Q2hlY2tlZCxcbiAgICBpbml0aWFsVmFsdWU6IGdldFRvU3RyaW5nVmFsdWUocHJvcHMudmFsdWUgIT0gbnVsbCA/IHByb3BzLnZhbHVlIDogZGVmYXVsdFZhbHVlKSxcbiAgICBjb250cm9sbGVkOiBpc0NvbnRyb2xsZWQocHJvcHMpXG4gIH07XG59XG5mdW5jdGlvbiB1cGRhdGVDaGVja2VkKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIGNoZWNrZWQgPSBwcm9wcy5jaGVja2VkO1xuXG4gIGlmIChjaGVja2VkICE9IG51bGwpIHtcbiAgICBzZXRWYWx1ZUZvclByb3BlcnR5KG5vZGUsICdjaGVja2VkJywgY2hlY2tlZCwgZmFsc2UpO1xuICB9XG59XG5mdW5jdGlvbiB1cGRhdGVXcmFwcGVyKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcblxuICB7XG4gICAgdmFyIGNvbnRyb2xsZWQgPSBpc0NvbnRyb2xsZWQocHJvcHMpO1xuXG4gICAgaWYgKCFub2RlLl93cmFwcGVyU3RhdGUuY29udHJvbGxlZCAmJiBjb250cm9sbGVkICYmICFkaWRXYXJuVW5jb250cm9sbGVkVG9Db250cm9sbGVkKSB7XG4gICAgICBlcnJvcignQSBjb21wb25lbnQgaXMgY2hhbmdpbmcgYW4gdW5jb250cm9sbGVkIGlucHV0IHRvIGJlIGNvbnRyb2xsZWQuICcgKyAnVGhpcyBpcyBsaWtlbHkgY2F1c2VkIGJ5IHRoZSB2YWx1ZSBjaGFuZ2luZyBmcm9tIHVuZGVmaW5lZCB0byAnICsgJ2EgZGVmaW5lZCB2YWx1ZSwgd2hpY2ggc2hvdWxkIG5vdCBoYXBwZW4uICcgKyAnRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCAnICsgJ2VsZW1lbnQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgY29tcG9uZW50LiBNb3JlIGluZm86IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnKTtcblxuICAgICAgZGlkV2FyblVuY29udHJvbGxlZFRvQ29udHJvbGxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUuX3dyYXBwZXJTdGF0ZS5jb250cm9sbGVkICYmICFjb250cm9sbGVkICYmICFkaWRXYXJuQ29udHJvbGxlZFRvVW5jb250cm9sbGVkKSB7XG4gICAgICBlcnJvcignQSBjb21wb25lbnQgaXMgY2hhbmdpbmcgYSBjb250cm9sbGVkIGlucHV0IHRvIGJlIHVuY29udHJvbGxlZC4gJyArICdUaGlzIGlzIGxpa2VseSBjYXVzZWQgYnkgdGhlIHZhbHVlIGNoYW5naW5nIGZyb20gYSBkZWZpbmVkIHRvICcgKyAndW5kZWZpbmVkLCB3aGljaCBzaG91bGQgbm90IGhhcHBlbi4gJyArICdEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIGlucHV0ICcgKyAnZWxlbWVudCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBjb21wb25lbnQuIE1vcmUgaW5mbzogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2NvbnRyb2xsZWQtY29tcG9uZW50cycpO1xuXG4gICAgICBkaWRXYXJuQ29udHJvbGxlZFRvVW5jb250cm9sbGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVDaGVja2VkKGVsZW1lbnQsIHByb3BzKTtcbiAgdmFyIHZhbHVlID0gZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy52YWx1ZSk7XG4gIHZhciB0eXBlID0gcHJvcHMudHlwZTtcblxuICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgIGlmICh0eXBlID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKHZhbHVlID09PSAwICYmIG5vZGUudmFsdWUgPT09ICcnIHx8IC8vIFdlIGV4cGxpY2l0bHkgd2FudCB0byBjb2VyY2UgdG8gbnVtYmVyIGhlcmUgaWYgcG9zc2libGUuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgIG5vZGUudmFsdWUgIT0gdmFsdWUpIHtcbiAgICAgICAgbm9kZS52YWx1ZSA9IHRvU3RyaW5nKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vZGUudmFsdWUgIT09IHRvU3RyaW5nKHZhbHVlKSkge1xuICAgICAgbm9kZS52YWx1ZSA9IHRvU3RyaW5nKHZhbHVlKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3N1Ym1pdCcgfHwgdHlwZSA9PT0gJ3Jlc2V0Jykge1xuICAgIC8vIFN1Ym1pdC9yZXNldCBpbnB1dHMgbmVlZCB0aGUgYXR0cmlidXRlIHJlbW92ZWQgY29tcGxldGVseSB0byBhdm9pZFxuICAgIC8vIGJsYW5rLXRleHQgYnV0dG9ucy5cbiAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZSgndmFsdWUnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB7XG4gICAgLy8gV2hlbiBzeW5jaW5nIHRoZSB2YWx1ZSBhdHRyaWJ1dGUsIHRoZSB2YWx1ZSBjb21lcyBmcm9tIGEgY2FzY2FkZSBvZlxuICAgIC8vIHByb3BlcnRpZXM6XG4gICAgLy8gIDEuIFRoZSB2YWx1ZSBSZWFjdCBwcm9wZXJ0eVxuICAgIC8vICAyLiBUaGUgZGVmYXVsdFZhbHVlIFJlYWN0IHByb3BlcnR5XG4gICAgLy8gIDMuIE90aGVyd2lzZSB0aGVyZSBzaG91bGQgYmUgbm8gY2hhbmdlXG4gICAgaWYgKHByb3BzLmhhc093blByb3BlcnR5KCd2YWx1ZScpKSB7XG4gICAgICBzZXREZWZhdWx0VmFsdWUobm9kZSwgcHJvcHMudHlwZSwgdmFsdWUpO1xuICAgIH0gZWxzZSBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoJ2RlZmF1bHRWYWx1ZScpKSB7XG4gICAgICBzZXREZWZhdWx0VmFsdWUobm9kZSwgcHJvcHMudHlwZSwgZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy5kZWZhdWx0VmFsdWUpKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgLy8gV2hlbiBzeW5jaW5nIHRoZSBjaGVja2VkIGF0dHJpYnV0ZSwgaXQgb25seSBjaGFuZ2VzIHdoZW4gaXQgbmVlZHNcbiAgICAvLyB0byBiZSByZW1vdmVkLCBzdWNoIGFzIHRyYW5zaXRpb25pbmcgZnJvbSBhIGNoZWNrYm94IGludG8gYSB0ZXh0IGlucHV0XG4gICAgaWYgKHByb3BzLmNoZWNrZWQgPT0gbnVsbCAmJiBwcm9wcy5kZWZhdWx0Q2hlY2tlZCAhPSBudWxsKSB7XG4gICAgICBub2RlLmRlZmF1bHRDaGVja2VkID0gISFwcm9wcy5kZWZhdWx0Q2hlY2tlZDtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHBvc3RNb3VudFdyYXBwZXIoZWxlbWVudCwgcHJvcHMsIGlzSHlkcmF0aW5nKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDsgLy8gRG8gbm90IGFzc2lnbiB2YWx1ZSBpZiBpdCBpcyBhbHJlYWR5IHNldC4gVGhpcyBwcmV2ZW50cyB1c2VyIHRleHQgaW5wdXRcbiAgLy8gZnJvbSBiZWluZyBsb3N0IGR1cmluZyBTU1IgaHlkcmF0aW9uLlxuXG4gIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eSgndmFsdWUnKSB8fCBwcm9wcy5oYXNPd25Qcm9wZXJ0eSgnZGVmYXVsdFZhbHVlJykpIHtcbiAgICB2YXIgdHlwZSA9IHByb3BzLnR5cGU7XG4gICAgdmFyIGlzQnV0dG9uID0gdHlwZSA9PT0gJ3N1Ym1pdCcgfHwgdHlwZSA9PT0gJ3Jlc2V0JzsgLy8gQXZvaWQgc2V0dGluZyB2YWx1ZSBhdHRyaWJ1dGUgb24gc3VibWl0L3Jlc2V0IGlucHV0cyBhcyBpdCBvdmVycmlkZXMgdGhlXG4gICAgLy8gZGVmYXVsdCB2YWx1ZSBwcm92aWRlZCBieSB0aGUgYnJvd3Nlci4gU2VlOiAjMTI4NzJcblxuICAgIGlmIChpc0J1dHRvbiAmJiAocHJvcHMudmFsdWUgPT09IHVuZGVmaW5lZCB8fCBwcm9wcy52YWx1ZSA9PT0gbnVsbCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgaW5pdGlhbFZhbHVlID0gdG9TdHJpbmcobm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSk7IC8vIERvIG5vdCBhc3NpZ24gdmFsdWUgaWYgaXQgaXMgYWxyZWFkeSBzZXQuIFRoaXMgcHJldmVudHMgdXNlciB0ZXh0IGlucHV0XG4gICAgLy8gZnJvbSBiZWluZyBsb3N0IGR1cmluZyBTU1IgaHlkcmF0aW9uLlxuXG4gICAgaWYgKCFpc0h5ZHJhdGluZykge1xuICAgICAge1xuICAgICAgICAvLyBXaGVuIHN5bmNpbmcgdGhlIHZhbHVlIGF0dHJpYnV0ZSwgdGhlIHZhbHVlIHByb3BlcnR5IHNob3VsZCB1c2VcbiAgICAgICAgLy8gdGhlIHdyYXBwZXJTdGF0ZS5faW5pdGlhbFZhbHVlIHByb3BlcnR5LiBUaGlzIHVzZXM6XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgMS4gVGhlIHZhbHVlIFJlYWN0IHByb3BlcnR5IHdoZW4gcHJlc2VudFxuICAgICAgICAvLyAgIDIuIFRoZSBkZWZhdWx0VmFsdWUgUmVhY3QgcHJvcGVydHkgd2hlbiBwcmVzZW50XG4gICAgICAgIC8vICAgMy4gQW4gZW1wdHkgc3RyaW5nXG4gICAgICAgIGlmIChpbml0aWFsVmFsdWUgIT09IG5vZGUudmFsdWUpIHtcbiAgICAgICAgICBub2RlLnZhbHVlID0gaW5pdGlhbFZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAge1xuICAgICAgLy8gT3RoZXJ3aXNlLCB0aGUgdmFsdWUgYXR0cmlidXRlIGlzIHN5bmNocm9uaXplZCB0byB0aGUgcHJvcGVydHksXG4gICAgICAvLyBzbyB3ZSBhc3NpZ24gZGVmYXVsdFZhbHVlIHRvIHRoZSBzYW1lIHRoaW5nIGFzIHRoZSB2YWx1ZSBwcm9wZXJ0eVxuICAgICAgLy8gYXNzaWdubWVudCBzdGVwIGFib3ZlLlxuICAgICAgbm9kZS5kZWZhdWx0VmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gICAgfVxuICB9IC8vIE5vcm1hbGx5LCB3ZSdkIGp1c3QgZG8gYG5vZGUuY2hlY2tlZCA9IG5vZGUuY2hlY2tlZGAgdXBvbiBpbml0aWFsIG1vdW50LCBsZXNzIHRoaXMgYnVnXG4gIC8vIHRoaXMgaXMgbmVlZGVkIHRvIHdvcmsgYXJvdW5kIGEgY2hyb21lIGJ1ZyB3aGVyZSBzZXR0aW5nIGRlZmF1bHRDaGVja2VkXG4gIC8vIHdpbGwgc29tZXRpbWVzIGluZmx1ZW5jZSB0aGUgdmFsdWUgb2YgY2hlY2tlZCAoZXZlbiBhZnRlciBkZXRhY2htZW50KS5cbiAgLy8gUmVmZXJlbmNlOiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD02MDg0MTZcbiAgLy8gV2UgbmVlZCB0byB0ZW1wb3JhcmlseSB1bnNldCBuYW1lIHRvIGF2b2lkIGRpc3J1cHRpbmcgcmFkaW8gYnV0dG9uIGdyb3Vwcy5cblxuXG4gIHZhciBuYW1lID0gbm9kZS5uYW1lO1xuXG4gIGlmIChuYW1lICE9PSAnJykge1xuICAgIG5vZGUubmFtZSA9ICcnO1xuICB9XG5cbiAge1xuICAgIC8vIFdoZW4gc3luY2luZyB0aGUgY2hlY2tlZCBhdHRyaWJ1dGUsIGJvdGggdGhlIGNoZWNrZWQgcHJvcGVydHkgYW5kXG4gICAgLy8gYXR0cmlidXRlIGFyZSBhc3NpZ25lZCBhdCB0aGUgc2FtZSB0aW1lIHVzaW5nIGRlZmF1bHRDaGVja2VkLiBUaGlzIHVzZXM6XG4gICAgLy9cbiAgICAvLyAgIDEuIFRoZSBjaGVja2VkIFJlYWN0IHByb3BlcnR5IHdoZW4gcHJlc2VudFxuICAgIC8vICAgMi4gVGhlIGRlZmF1bHRDaGVja2VkIFJlYWN0IHByb3BlcnR5IHdoZW4gcHJlc2VudFxuICAgIC8vICAgMy4gT3RoZXJ3aXNlLCBmYWxzZVxuICAgIG5vZGUuZGVmYXVsdENoZWNrZWQgPSAhbm9kZS5kZWZhdWx0Q2hlY2tlZDtcbiAgICBub2RlLmRlZmF1bHRDaGVja2VkID0gISFub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbENoZWNrZWQ7XG4gIH1cblxuICBpZiAobmFtZSAhPT0gJycpIHtcbiAgICBub2RlLm5hbWUgPSBuYW1lO1xuICB9XG59XG5mdW5jdGlvbiByZXN0b3JlQ29udHJvbGxlZFN0YXRlKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdXBkYXRlV3JhcHBlcihub2RlLCBwcm9wcyk7XG4gIHVwZGF0ZU5hbWVkQ291c2lucyhub2RlLCBwcm9wcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU5hbWVkQ291c2lucyhyb290Tm9kZSwgcHJvcHMpIHtcbiAgdmFyIG5hbWUgPSBwcm9wcy5uYW1lO1xuXG4gIGlmIChwcm9wcy50eXBlID09PSAncmFkaW8nICYmIG5hbWUgIT0gbnVsbCkge1xuICAgIHZhciBxdWVyeVJvb3QgPSByb290Tm9kZTtcblxuICAgIHdoaWxlIChxdWVyeVJvb3QucGFyZW50Tm9kZSkge1xuICAgICAgcXVlcnlSb290ID0gcXVlcnlSb290LnBhcmVudE5vZGU7XG4gICAgfSAvLyBJZiBgcm9vdE5vZGUuZm9ybWAgd2FzIG5vbi1udWxsLCB0aGVuIHdlIGNvdWxkIHRyeSBgZm9ybS5lbGVtZW50c2AsXG4gICAgLy8gYnV0IHRoYXQgc29tZXRpbWVzIGJlaGF2ZXMgc3RyYW5nZWx5IGluIElFOC4gV2UgY291bGQgYWxzbyB0cnkgdXNpbmdcbiAgICAvLyBgZm9ybS5nZXRFbGVtZW50c0J5TmFtZWAsIGJ1dCB0aGF0IHdpbGwgb25seSByZXR1cm4gZGlyZWN0IGNoaWxkcmVuXG4gICAgLy8gYW5kIHdvbid0IGluY2x1ZGUgaW5wdXRzIHRoYXQgdXNlIHRoZSBIVE1MNSBgZm9ybT1gIGF0dHJpYnV0ZS4gU2luY2VcbiAgICAvLyB0aGUgaW5wdXQgbWlnaHQgbm90IGV2ZW4gYmUgaW4gYSBmb3JtLiBJdCBtaWdodCBub3QgZXZlbiBiZSBpbiB0aGVcbiAgICAvLyBkb2N1bWVudC4gTGV0J3MganVzdCB1c2UgdGhlIGxvY2FsIGBxdWVyeVNlbGVjdG9yQWxsYCB0byBlbnN1cmUgd2UgZG9uJ3RcbiAgICAvLyBtaXNzIGFueXRoaW5nLlxuXG5cbiAgICB7XG4gICAgICBjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKG5hbWUsICduYW1lJyk7XG4gICAgfVxuXG4gICAgdmFyIGdyb3VwID0gcXVlcnlSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W25hbWU9JyArIEpTT04uc3RyaW5naWZ5KCcnICsgbmFtZSkgKyAnXVt0eXBlPVwicmFkaW9cIl0nKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ3JvdXAubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBvdGhlck5vZGUgPSBncm91cFtpXTtcblxuICAgICAgaWYgKG90aGVyTm9kZSA9PT0gcm9vdE5vZGUgfHwgb3RoZXJOb2RlLmZvcm0gIT09IHJvb3ROb2RlLmZvcm0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IC8vIFRoaXMgd2lsbCB0aHJvdyBpZiByYWRpbyBidXR0b25zIHJlbmRlcmVkIGJ5IGRpZmZlcmVudCBjb3BpZXMgb2YgUmVhY3RcbiAgICAgIC8vIGFuZCB0aGUgc2FtZSBuYW1lIGFyZSByZW5kZXJlZCBpbnRvIHRoZSBzYW1lIGZvcm0gKHNhbWUgYXMgIzE5MzkpLlxuICAgICAgLy8gVGhhdCdzIHByb2JhYmx5IG9rYXk7IHdlIGRvbid0IHN1cHBvcnQgaXQganVzdCBhcyB3ZSBkb24ndCBzdXBwb3J0XG4gICAgICAvLyBtaXhpbmcgUmVhY3QgcmFkaW8gYnV0dG9ucyB3aXRoIG5vbi1SZWFjdCBvbmVzLlxuXG5cbiAgICAgIHZhciBvdGhlclByb3BzID0gZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZShvdGhlck5vZGUpO1xuXG4gICAgICBpZiAoIW90aGVyUHJvcHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWFjdERPTUlucHV0OiBNaXhpbmcgUmVhY3QgYW5kIG5vbi1SZWFjdCByYWRpbyBpbnB1dHMgd2l0aCB0aGUgJyArICdzYW1lIGBuYW1lYCBpcyBub3Qgc3VwcG9ydGVkLicpO1xuICAgICAgfSAvLyBXZSBuZWVkIHVwZGF0ZSB0aGUgdHJhY2tlZCB2YWx1ZSBvbiB0aGUgbmFtZWQgY291c2luIHNpbmNlIHRoZSB2YWx1ZVxuICAgICAgLy8gd2FzIGNoYW5nZWQgYnV0IHRoZSBpbnB1dCBzYXcgbm8gZXZlbnQgb3IgdmFsdWUgc2V0XG5cblxuICAgICAgdXBkYXRlVmFsdWVJZkNoYW5nZWQob3RoZXJOb2RlKTsgLy8gSWYgdGhpcyBpcyBhIGNvbnRyb2xsZWQgcmFkaW8gYnV0dG9uIGdyb3VwLCBmb3JjaW5nIHRoZSBpbnB1dCB0aGF0XG4gICAgICAvLyB3YXMgcHJldmlvdXNseSBjaGVja2VkIHRvIHVwZGF0ZSB3aWxsIGNhdXNlIGl0IHRvIGJlIGNvbWUgcmUtY2hlY2tlZFxuICAgICAgLy8gYXMgYXBwcm9wcmlhdGUuXG5cbiAgICAgIHVwZGF0ZVdyYXBwZXIob3RoZXJOb2RlLCBvdGhlclByb3BzKTtcbiAgICB9XG4gIH1cbn0gLy8gSW4gQ2hyb21lLCBhc3NpZ25pbmcgZGVmYXVsdFZhbHVlIHRvIGNlcnRhaW4gaW5wdXQgdHlwZXMgdHJpZ2dlcnMgaW5wdXQgdmFsaWRhdGlvbi5cbi8vIEZvciBudW1iZXIgaW5wdXRzLCB0aGUgZGlzcGxheSB2YWx1ZSBsb3NlcyB0cmFpbGluZyBkZWNpbWFsIHBvaW50cy4gRm9yIGVtYWlsIGlucHV0cyxcbi8vIENocm9tZSByYWlzZXMgXCJUaGUgc3BlY2lmaWVkIHZhbHVlIDx4PiBpcyBub3QgYSB2YWxpZCBlbWFpbCBhZGRyZXNzXCIuXG4vL1xuLy8gSGVyZSB3ZSBjaGVjayB0byBzZWUgaWYgdGhlIGRlZmF1bHRWYWx1ZSBoYXMgYWN0dWFsbHkgY2hhbmdlZCwgYXZvaWRpbmcgdGhlc2UgcHJvYmxlbXNcbi8vIHdoZW4gdGhlIHVzZXIgaXMgaW5wdXR0aW5nIHRleHRcbi8vXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcyNTNcblxuXG5mdW5jdGlvbiBzZXREZWZhdWx0VmFsdWUobm9kZSwgdHlwZSwgdmFsdWUpIHtcbiAgaWYgKCAvLyBGb2N1c2VkIG51bWJlciBpbnB1dHMgc3luY2hyb25pemUgb24gYmx1ci4gU2VlIENoYW5nZUV2ZW50UGx1Z2luLmpzXG4gIHR5cGUgIT09ICdudW1iZXInIHx8IGdldEFjdGl2ZUVsZW1lbnQobm9kZS5vd25lckRvY3VtZW50KSAhPT0gbm9kZSkge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IHRvU3RyaW5nKG5vZGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUpO1xuICAgIH0gZWxzZSBpZiAobm9kZS5kZWZhdWx0VmFsdWUgIT09IHRvU3RyaW5nKHZhbHVlKSkge1xuICAgICAgbm9kZS5kZWZhdWx0VmFsdWUgPSB0b1N0cmluZyh2YWx1ZSk7XG4gICAgfVxuICB9XG59XG5cbnZhciBkaWRXYXJuU2VsZWN0ZWRTZXRPbk9wdGlvbiA9IGZhbHNlO1xudmFyIGRpZFdhcm5JbnZhbGlkQ2hpbGQgPSBmYWxzZTtcbnZhciBkaWRXYXJuSW52YWxpZElubmVySFRNTCA9IGZhbHNlO1xuLyoqXG4gKiBJbXBsZW1lbnRzIGFuIDxvcHRpb24+IGhvc3QgY29tcG9uZW50IHRoYXQgd2FybnMgd2hlbiBgc2VsZWN0ZWRgIGlzIHNldC5cbiAqL1xuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BzKGVsZW1lbnQsIHByb3BzKSB7XG4gIHtcbiAgICAvLyBJZiBhIHZhbHVlIGlzIG5vdCBwcm92aWRlZCwgdGhlbiB0aGUgY2hpbGRyZW4gbXVzdCBiZSBzaW1wbGUuXG4gICAgaWYgKHByb3BzLnZhbHVlID09IG51bGwpIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcHMuY2hpbGRyZW4gPT09ICdvYmplY3QnICYmIHByb3BzLmNoaWxkcmVuICE9PSBudWxsKSB7XG4gICAgICAgIFJlYWN0LkNoaWxkcmVuLmZvckVhY2gocHJvcHMuY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICAgIGlmIChjaGlsZCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHR5cGVvZiBjaGlsZCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGNoaWxkID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghZGlkV2FybkludmFsaWRDaGlsZCkge1xuICAgICAgICAgICAgZGlkV2FybkludmFsaWRDaGlsZCA9IHRydWU7XG5cbiAgICAgICAgICAgIGVycm9yKCdDYW5ub3QgaW5mZXIgdGhlIG9wdGlvbiB2YWx1ZSBvZiBjb21wbGV4IGNoaWxkcmVuLiAnICsgJ1Bhc3MgYSBgdmFsdWVgIHByb3Agb3IgdXNlIGEgcGxhaW4gc3RyaW5nIGFzIGNoaWxkcmVuIHRvIDxvcHRpb24+LicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICE9IG51bGwpIHtcbiAgICAgICAgaWYgKCFkaWRXYXJuSW52YWxpZElubmVySFRNTCkge1xuICAgICAgICAgIGRpZFdhcm5JbnZhbGlkSW5uZXJIVE1MID0gdHJ1ZTtcblxuICAgICAgICAgIGVycm9yKCdQYXNzIGEgYHZhbHVlYCBwcm9wIGlmIHlvdSBzZXQgZGFuZ2Vyb3VzbHlJbm5lckhUTUwgc28gUmVhY3Qga25vd3MgJyArICd3aGljaCB2YWx1ZSBzaG91bGQgYmUgc2VsZWN0ZWQuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIFRPRE86IFJlbW92ZSBzdXBwb3J0IGZvciBgc2VsZWN0ZWRgIGluIDxvcHRpb24+LlxuXG5cbiAgICBpZiAocHJvcHMuc2VsZWN0ZWQgIT0gbnVsbCAmJiAhZGlkV2FyblNlbGVjdGVkU2V0T25PcHRpb24pIHtcbiAgICAgIGVycm9yKCdVc2UgdGhlIGBkZWZhdWx0VmFsdWVgIG9yIGB2YWx1ZWAgcHJvcHMgb24gPHNlbGVjdD4gaW5zdGVhZCBvZiAnICsgJ3NldHRpbmcgYHNlbGVjdGVkYCBvbiA8b3B0aW9uPi4nKTtcblxuICAgICAgZGlkV2FyblNlbGVjdGVkU2V0T25PcHRpb24gPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcG9zdE1vdW50V3JhcHBlciQxKGVsZW1lbnQsIHByb3BzKSB7XG4gIC8vIHZhbHVlPVwiXCIgc2hvdWxkIG1ha2UgYSB2YWx1ZSBhdHRyaWJ1dGUgKCM2MjE5KVxuICBpZiAocHJvcHMudmFsdWUgIT0gbnVsbCkge1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCd2YWx1ZScsIHRvU3RyaW5nKGdldFRvU3RyaW5nVmFsdWUocHJvcHMudmFsdWUpKSk7XG4gIH1cbn1cblxudmFyIGlzQXJyYXlJbXBsID0gQXJyYXkuaXNBcnJheTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlZGVjbGFyZVxuXG5mdW5jdGlvbiBpc0FycmF5KGEpIHtcbiAgcmV0dXJuIGlzQXJyYXlJbXBsKGEpO1xufVxuXG52YXIgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlJDE7XG5cbntcbiAgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlJDEgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkge1xuICB2YXIgb3duZXJOYW1lID0gZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKTtcblxuICBpZiAob3duZXJOYW1lKSB7XG4gICAgcmV0dXJuICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG93bmVyTmFtZSArICdgLic7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbnZhciB2YWx1ZVByb3BOYW1lcyA9IFsndmFsdWUnLCAnZGVmYXVsdFZhbHVlJ107XG4vKipcbiAqIFZhbGlkYXRpb24gZnVuY3Rpb24gZm9yIGB2YWx1ZWAgYW5kIGBkZWZhdWx0VmFsdWVgLlxuICovXG5cbmZ1bmN0aW9uIGNoZWNrU2VsZWN0UHJvcFR5cGVzKHByb3BzKSB7XG4gIHtcbiAgICBjaGVja0NvbnRyb2xsZWRWYWx1ZVByb3BzKCdzZWxlY3QnLCBwcm9wcyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlUHJvcE5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvcE5hbWUgPSB2YWx1ZVByb3BOYW1lc1tpXTtcblxuICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgcHJvcE5hbWVJc0FycmF5ID0gaXNBcnJheShwcm9wc1twcm9wTmFtZV0pO1xuXG4gICAgICBpZiAocHJvcHMubXVsdGlwbGUgJiYgIXByb3BOYW1lSXNBcnJheSkge1xuICAgICAgICBlcnJvcignVGhlIGAlc2AgcHJvcCBzdXBwbGllZCB0byA8c2VsZWN0PiBtdXN0IGJlIGFuIGFycmF5IGlmICcgKyAnYG11bHRpcGxlYCBpcyB0cnVlLiVzJywgcHJvcE5hbWUsIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpKTtcbiAgICAgIH0gZWxzZSBpZiAoIXByb3BzLm11bHRpcGxlICYmIHByb3BOYW1lSXNBcnJheSkge1xuICAgICAgICBlcnJvcignVGhlIGAlc2AgcHJvcCBzdXBwbGllZCB0byA8c2VsZWN0PiBtdXN0IGJlIGEgc2NhbGFyICcgKyAndmFsdWUgaWYgYG11bHRpcGxlYCBpcyBmYWxzZS4lcycsIHByb3BOYW1lLCBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU9wdGlvbnMobm9kZSwgbXVsdGlwbGUsIHByb3BWYWx1ZSwgc2V0RGVmYXVsdFNlbGVjdGVkKSB7XG4gIHZhciBvcHRpb25zID0gbm9kZS5vcHRpb25zO1xuXG4gIGlmIChtdWx0aXBsZSkge1xuICAgIHZhciBzZWxlY3RlZFZhbHVlcyA9IHByb3BWYWx1ZTtcbiAgICB2YXIgc2VsZWN0ZWRWYWx1ZSA9IHt9O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxlY3RlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gUHJlZml4IHRvIGF2b2lkIGNoYW9zIHdpdGggc3BlY2lhbCBrZXlzLlxuICAgICAgc2VsZWN0ZWRWYWx1ZVsnJCcgKyBzZWxlY3RlZFZhbHVlc1tpXV0gPSB0cnVlO1xuICAgIH1cblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBvcHRpb25zLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIHNlbGVjdGVkID0gc2VsZWN0ZWRWYWx1ZS5oYXNPd25Qcm9wZXJ0eSgnJCcgKyBvcHRpb25zW19pXS52YWx1ZSk7XG5cbiAgICAgIGlmIChvcHRpb25zW19pXS5zZWxlY3RlZCAhPT0gc2VsZWN0ZWQpIHtcbiAgICAgICAgb3B0aW9uc1tfaV0uc2VsZWN0ZWQgPSBzZWxlY3RlZDtcbiAgICAgIH1cblxuICAgICAgaWYgKHNlbGVjdGVkICYmIHNldERlZmF1bHRTZWxlY3RlZCkge1xuICAgICAgICBvcHRpb25zW19pXS5kZWZhdWx0U2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBEbyBub3Qgc2V0IGBzZWxlY3QudmFsdWVgIGFzIGV4YWN0IGJlaGF2aW9yIGlzbid0IGNvbnNpc3RlbnQgYWNyb3NzIGFsbFxuICAgIC8vIGJyb3dzZXJzIGZvciBhbGwgY2FzZXMuXG4gICAgdmFyIF9zZWxlY3RlZFZhbHVlID0gdG9TdHJpbmcoZ2V0VG9TdHJpbmdWYWx1ZShwcm9wVmFsdWUpKTtcblxuICAgIHZhciBkZWZhdWx0U2VsZWN0ZWQgPSBudWxsO1xuXG4gICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgb3B0aW9ucy5sZW5ndGg7IF9pMisrKSB7XG4gICAgICBpZiAob3B0aW9uc1tfaTJdLnZhbHVlID09PSBfc2VsZWN0ZWRWYWx1ZSkge1xuICAgICAgICBvcHRpb25zW19pMl0uc2VsZWN0ZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmIChzZXREZWZhdWx0U2VsZWN0ZWQpIHtcbiAgICAgICAgICBvcHRpb25zW19pMl0uZGVmYXVsdFNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGRlZmF1bHRTZWxlY3RlZCA9PT0gbnVsbCAmJiAhb3B0aW9uc1tfaTJdLmRpc2FibGVkKSB7XG4gICAgICAgIGRlZmF1bHRTZWxlY3RlZCA9IG9wdGlvbnNbX2kyXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGVmYXVsdFNlbGVjdGVkICE9PSBudWxsKSB7XG4gICAgICBkZWZhdWx0U2VsZWN0ZWQuc2VsZWN0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBJbXBsZW1lbnRzIGEgPHNlbGVjdD4gaG9zdCBjb21wb25lbnQgdGhhdCBhbGxvd3Mgb3B0aW9uYWxseSBzZXR0aW5nIHRoZVxuICogcHJvcHMgYHZhbHVlYCBhbmQgYGRlZmF1bHRWYWx1ZWAuIElmIGBtdWx0aXBsZWAgaXMgZmFsc2UsIHRoZSBwcm9wIG11c3QgYmUgYVxuICogc3RyaW5nYWJsZS4gSWYgYG11bHRpcGxlYCBpcyB0cnVlLCB0aGUgcHJvcCBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ2FibGVzLlxuICpcbiAqIElmIGB2YWx1ZWAgaXMgbm90IHN1cHBsaWVkIChvciBudWxsL3VuZGVmaW5lZCksIHVzZXIgYWN0aW9ucyB0aGF0IGNoYW5nZSB0aGVcbiAqIHNlbGVjdGVkIG9wdGlvbiB3aWxsIHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgcmVuZGVyZWQgb3B0aW9ucy5cbiAqXG4gKiBJZiBpdCBpcyBzdXBwbGllZCAoYW5kIG5vdCBudWxsL3VuZGVmaW5lZCksIHRoZSByZW5kZXJlZCBvcHRpb25zIHdpbGwgbm90XG4gKiB1cGRhdGUgaW4gcmVzcG9uc2UgdG8gdXNlciBhY3Rpb25zLiBJbnN0ZWFkLCB0aGUgYHZhbHVlYCBwcm9wIG11c3QgY2hhbmdlIGluXG4gKiBvcmRlciBmb3IgdGhlIHJlbmRlcmVkIG9wdGlvbnMgdG8gdXBkYXRlLlxuICpcbiAqIElmIGBkZWZhdWx0VmFsdWVgIGlzIHByb3ZpZGVkLCBhbnkgb3B0aW9ucyB3aXRoIHRoZSBzdXBwbGllZCB2YWx1ZXMgd2lsbCBiZVxuICogc2VsZWN0ZWQuXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRIb3N0UHJvcHMkMShlbGVtZW50LCBwcm9wcykge1xuICByZXR1cm4gYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHZhbHVlOiB1bmRlZmluZWRcbiAgfSk7XG59XG5mdW5jdGlvbiBpbml0V3JhcHBlclN0YXRlJDEoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuXG4gIHtcbiAgICBjaGVja1NlbGVjdFByb3BUeXBlcyhwcm9wcyk7XG4gIH1cblxuICBub2RlLl93cmFwcGVyU3RhdGUgPSB7XG4gICAgd2FzTXVsdGlwbGU6ICEhcHJvcHMubXVsdGlwbGVcbiAgfTtcblxuICB7XG4gICAgaWYgKHByb3BzLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSQxKSB7XG4gICAgICBlcnJvcignU2VsZWN0IGVsZW1lbnRzIG11c3QgYmUgZWl0aGVyIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkICcgKyAnKHNwZWNpZnkgZWl0aGVyIHRoZSB2YWx1ZSBwcm9wLCBvciB0aGUgZGVmYXVsdFZhbHVlIHByb3AsIGJ1dCBub3QgJyArICdib3RoKS4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBzZWxlY3QgJyArICdlbGVtZW50IGFuZCByZW1vdmUgb25lIG9mIHRoZXNlIHByb3BzLiBNb3JlIGluZm86ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2NvbnRyb2xsZWQtY29tcG9uZW50cycpO1xuXG4gICAgICBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUkMSA9IHRydWU7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBwb3N0TW91bnRXcmFwcGVyJDIoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICBub2RlLm11bHRpcGxlID0gISFwcm9wcy5tdWx0aXBsZTtcbiAgdmFyIHZhbHVlID0gcHJvcHMudmFsdWU7XG5cbiAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICB1cGRhdGVPcHRpb25zKG5vZGUsICEhcHJvcHMubXVsdGlwbGUsIHZhbHVlLCBmYWxzZSk7XG4gIH0gZWxzZSBpZiAocHJvcHMuZGVmYXVsdFZhbHVlICE9IG51bGwpIHtcbiAgICB1cGRhdGVPcHRpb25zKG5vZGUsICEhcHJvcHMubXVsdGlwbGUsIHByb3BzLmRlZmF1bHRWYWx1ZSwgdHJ1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHBvc3RVcGRhdGVXcmFwcGVyKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIHdhc011bHRpcGxlID0gbm9kZS5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlO1xuICBub2RlLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGUgPSAhIXByb3BzLm11bHRpcGxlO1xuICB2YXIgdmFsdWUgPSBwcm9wcy52YWx1ZTtcblxuICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgdmFsdWUsIGZhbHNlKTtcbiAgfSBlbHNlIGlmICh3YXNNdWx0aXBsZSAhPT0gISFwcm9wcy5tdWx0aXBsZSkge1xuICAgIC8vIEZvciBzaW1wbGljaXR5LCByZWFwcGx5IGBkZWZhdWx0VmFsdWVgIGlmIGBtdWx0aXBsZWAgaXMgdG9nZ2xlZC5cbiAgICBpZiAocHJvcHMuZGVmYXVsdFZhbHVlICE9IG51bGwpIHtcbiAgICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgcHJvcHMuZGVmYXVsdFZhbHVlLCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmV2ZXJ0IHRoZSBzZWxlY3QgYmFjayB0byBpdHMgZGVmYXVsdCB1bnNlbGVjdGVkIHN0YXRlLlxuICAgICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCBwcm9wcy5tdWx0aXBsZSA/IFtdIDogJycsIGZhbHNlKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc3RvcmVDb250cm9sbGVkU3RhdGUkMShlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIHZhciB2YWx1ZSA9IHByb3BzLnZhbHVlO1xuXG4gIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCB2YWx1ZSwgZmFsc2UpO1xuICB9XG59XG5cbnZhciBkaWRXYXJuVmFsRGVmYXVsdFZhbCA9IGZhbHNlO1xuXG4vKipcbiAqIEltcGxlbWVudHMgYSA8dGV4dGFyZWE+IGhvc3QgY29tcG9uZW50IHRoYXQgYWxsb3dzIHNldHRpbmcgYHZhbHVlYCwgYW5kXG4gKiBgZGVmYXVsdFZhbHVlYC4gVGhpcyBkaWZmZXJzIGZyb20gdGhlIHRyYWRpdGlvbmFsIERPTSBBUEkgYmVjYXVzZSB2YWx1ZSBpc1xuICogdXN1YWxseSBzZXQgYXMgUENEQVRBIGNoaWxkcmVuLlxuICpcbiAqIElmIGB2YWx1ZWAgaXMgbm90IHN1cHBsaWVkIChvciBudWxsL3VuZGVmaW5lZCksIHVzZXIgYWN0aW9ucyB0aGF0IGFmZmVjdCB0aGVcbiAqIHZhbHVlIHdpbGwgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LlxuICpcbiAqIElmIGB2YWx1ZWAgaXMgc3VwcGxpZWQgKGFuZCBub3QgbnVsbC91bmRlZmluZWQpLCB0aGUgcmVuZGVyZWQgZWxlbWVudCB3aWxsXG4gKiBub3QgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LiBJbnN0ZWFkLCB0aGUgYHZhbHVlYCBwcm9wIG11c3QgY2hhbmdlIGluXG4gKiBvcmRlciBmb3IgdGhlIHJlbmRlcmVkIGVsZW1lbnQgdG8gYmUgdXBkYXRlZC5cbiAqXG4gKiBUaGUgcmVuZGVyZWQgZWxlbWVudCB3aWxsIGJlIGluaXRpYWxpemVkIHdpdGggYW4gZW1wdHkgdmFsdWUsIHRoZSBwcm9wXG4gKiBgZGVmYXVsdFZhbHVlYCBpZiBzcGVjaWZpZWQsIG9yIHRoZSBjaGlsZHJlbiBjb250ZW50IChkZXByZWNhdGVkKS5cbiAqL1xuZnVuY3Rpb24gZ2V0SG9zdFByb3BzJDIoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuXG4gIGlmIChwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAhPSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgIGRvZXMgbm90IG1ha2Ugc2Vuc2Ugb24gPHRleHRhcmVhPi4nKTtcbiAgfSAvLyBBbHdheXMgc2V0IGNoaWxkcmVuIHRvIHRoZSBzYW1lIHRoaW5nLiBJbiBJRTksIHRoZSBzZWxlY3Rpb24gcmFuZ2Ugd2lsbFxuICAvLyBnZXQgcmVzZXQgaWYgYHRleHRDb250ZW50YCBpcyBtdXRhdGVkLiAgV2UgY291bGQgYWRkIGEgY2hlY2sgaW4gc2V0VGV4dENvbnRlbnRcbiAgLy8gdG8gb25seSBzZXQgdGhlIHZhbHVlIGlmL3doZW4gdGhlIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgbm9kZSB2YWx1ZSAod2hpY2ggd291bGRcbiAgLy8gY29tcGxldGVseSBzb2x2ZSB0aGlzIElFOSBidWcpLCBidXQgU2ViYXN0aWFuK1NvcGhpZSBzZWVtZWQgdG8gbGlrZSB0aGlzXG4gIC8vIHNvbHV0aW9uLiBUaGUgdmFsdWUgY2FuIGJlIGEgYm9vbGVhbiBvciBvYmplY3Qgc28gdGhhdCdzIHdoeSBpdCdzIGZvcmNlZFxuICAvLyB0byBiZSBhIHN0cmluZy5cblxuXG4gIHZhciBob3N0UHJvcHMgPSBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICBkZWZhdWx0VmFsdWU6IHVuZGVmaW5lZCxcbiAgICBjaGlsZHJlbjogdG9TdHJpbmcobm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSlcbiAgfSk7XG5cbiAgcmV0dXJuIGhvc3RQcm9wcztcbn1cbmZ1bmN0aW9uIGluaXRXcmFwcGVyU3RhdGUkMihlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG5cbiAge1xuICAgIGNoZWNrQ29udHJvbGxlZFZhbHVlUHJvcHMoJ3RleHRhcmVhJywgcHJvcHMpO1xuXG4gICAgaWYgKHByb3BzLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWxEZWZhdWx0VmFsKSB7XG4gICAgICBlcnJvcignJXMgY29udGFpbnMgYSB0ZXh0YXJlYSB3aXRoIGJvdGggdmFsdWUgYW5kIGRlZmF1bHRWYWx1ZSBwcm9wcy4gJyArICdUZXh0YXJlYSBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAnICsgJyhzcGVjaWZ5IGVpdGhlciB0aGUgdmFsdWUgcHJvcCwgb3IgdGhlIGRlZmF1bHRWYWx1ZSBwcm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgdGV4dGFyZWEgJyArICdhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnLCBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpIHx8ICdBIGNvbXBvbmVudCcpO1xuXG4gICAgICBkaWRXYXJuVmFsRGVmYXVsdFZhbCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGluaXRpYWxWYWx1ZSA9IHByb3BzLnZhbHVlOyAvLyBPbmx5IGJvdGhlciBmZXRjaGluZyBkZWZhdWx0IHZhbHVlIGlmIHdlJ3JlIGdvaW5nIHRvIHVzZSBpdFxuXG4gIGlmIChpbml0aWFsVmFsdWUgPT0gbnVsbCkge1xuICAgIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgICBkZWZhdWx0VmFsdWUgPSBwcm9wcy5kZWZhdWx0VmFsdWU7XG5cbiAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkge1xuICAgICAge1xuICAgICAgICBlcnJvcignVXNlIHRoZSBgZGVmYXVsdFZhbHVlYCBvciBgdmFsdWVgIHByb3BzIGluc3RlYWQgb2Ygc2V0dGluZyAnICsgJ2NoaWxkcmVuIG9uIDx0ZXh0YXJlYT4uJyk7XG4gICAgICB9XG5cbiAgICAgIHtcbiAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJZiB5b3Ugc3VwcGx5IGBkZWZhdWx0VmFsdWVgIG9uIGEgPHRleHRhcmVhPiwgZG8gbm90IHBhc3MgY2hpbGRyZW4uJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCc8dGV4dGFyZWE+IGNhbiBvbmx5IGhhdmUgYXQgbW9zdCBvbmUgY2hpbGQuJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlblswXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IGNoaWxkcmVuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkZWZhdWx0VmFsdWUgPT0gbnVsbCkge1xuICAgICAgZGVmYXVsdFZhbHVlID0gJyc7XG4gICAgfVxuXG4gICAgaW5pdGlhbFZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICB9XG5cbiAgbm9kZS5fd3JhcHBlclN0YXRlID0ge1xuICAgIGluaXRpYWxWYWx1ZTogZ2V0VG9TdHJpbmdWYWx1ZShpbml0aWFsVmFsdWUpXG4gIH07XG59XG5mdW5jdGlvbiB1cGRhdGVXcmFwcGVyJDEoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgdmFsdWUgPSBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLnZhbHVlKTtcbiAgdmFyIGRlZmF1bHRWYWx1ZSA9IGdldFRvU3RyaW5nVmFsdWUocHJvcHMuZGVmYXVsdFZhbHVlKTtcblxuICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgIC8vIENhc3QgYHZhbHVlYCB0byBhIHN0cmluZyB0byBlbnN1cmUgdGhlIHZhbHVlIGlzIHNldCBjb3JyZWN0bHkuIFdoaWxlXG4gICAgLy8gYnJvd3NlcnMgdHlwaWNhbGx5IGRvIHRoaXMgYXMgbmVjZXNzYXJ5LCBqc2RvbSBkb2Vzbid0LlxuICAgIHZhciBuZXdWYWx1ZSA9IHRvU3RyaW5nKHZhbHVlKTsgLy8gVG8gYXZvaWQgc2lkZSBlZmZlY3RzIChzdWNoIGFzIGxvc2luZyB0ZXh0IHNlbGVjdGlvbiksIG9ubHkgc2V0IHZhbHVlIGlmIGNoYW5nZWRcblxuICAgIGlmIChuZXdWYWx1ZSAhPT0gbm9kZS52YWx1ZSkge1xuICAgICAgbm9kZS52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5kZWZhdWx0VmFsdWUgPT0gbnVsbCAmJiBub2RlLmRlZmF1bHRWYWx1ZSAhPT0gbmV3VmFsdWUpIHtcbiAgICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gbmV3VmFsdWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7XG4gICAgbm9kZS5kZWZhdWx0VmFsdWUgPSB0b1N0cmluZyhkZWZhdWx0VmFsdWUpO1xuICB9XG59XG5mdW5jdGlvbiBwb3N0TW91bnRXcmFwcGVyJDMoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50OyAvLyBUaGlzIGlzIGluIHBvc3RNb3VudCBiZWNhdXNlIHdlIG5lZWQgYWNjZXNzIHRvIHRoZSBET00gbm9kZSwgd2hpY2ggaXMgbm90XG4gIC8vIGF2YWlsYWJsZSB1bnRpbCBhZnRlciB0aGUgY29tcG9uZW50IGhhcyBtb3VudGVkLlxuXG4gIHZhciB0ZXh0Q29udGVudCA9IG5vZGUudGV4dENvbnRlbnQ7IC8vIE9ubHkgc2V0IG5vZGUudmFsdWUgaWYgdGV4dENvbnRlbnQgaXMgZXF1YWwgdG8gdGhlIGV4cGVjdGVkXG4gIC8vIGluaXRpYWwgdmFsdWUuIEluIElFMTAvSUUxMSB0aGVyZSBpcyBhIGJ1ZyB3aGVyZSB0aGUgcGxhY2Vob2xkZXIgYXR0cmlidXRlXG4gIC8vIHdpbGwgcG9wdWxhdGUgdGV4dENvbnRlbnQgYXMgd2VsbC5cbiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubWljcm9zb2Z0LmNvbS9taWNyb3NvZnQtZWRnZS9wbGF0Zm9ybS9pc3N1ZXMvMTAxNTI1L1xuXG4gIGlmICh0ZXh0Q29udGVudCA9PT0gbm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSkge1xuICAgIGlmICh0ZXh0Q29udGVudCAhPT0gJycgJiYgdGV4dENvbnRlbnQgIT09IG51bGwpIHtcbiAgICAgIG5vZGUudmFsdWUgPSB0ZXh0Q29udGVudDtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc3RvcmVDb250cm9sbGVkU3RhdGUkMihlbGVtZW50LCBwcm9wcykge1xuICAvLyBET00gY29tcG9uZW50IGlzIHN0aWxsIG1vdW50ZWQ7IHVwZGF0ZVxuICB1cGRhdGVXcmFwcGVyJDEoZWxlbWVudCwgcHJvcHMpO1xufVxuXG52YXIgSFRNTF9OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCc7XG52YXIgTUFUSF9OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCc7XG52YXIgU1ZHX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7IC8vIEFzc3VtZXMgdGhlcmUgaXMgbm8gcGFyZW50IG5hbWVzcGFjZS5cblxuZnVuY3Rpb24gZ2V0SW50cmluc2ljTmFtZXNwYWNlKHR5cGUpIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnc3ZnJzpcbiAgICAgIHJldHVybiBTVkdfTkFNRVNQQUNFO1xuXG4gICAgY2FzZSAnbWF0aCc6XG4gICAgICByZXR1cm4gTUFUSF9OQU1FU1BBQ0U7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIEhUTUxfTkFNRVNQQUNFO1xuICB9XG59XG5mdW5jdGlvbiBnZXRDaGlsZE5hbWVzcGFjZShwYXJlbnROYW1lc3BhY2UsIHR5cGUpIHtcbiAgaWYgKHBhcmVudE5hbWVzcGFjZSA9PSBudWxsIHx8IHBhcmVudE5hbWVzcGFjZSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAvLyBObyAob3IgZGVmYXVsdCkgcGFyZW50IG5hbWVzcGFjZTogcG90ZW50aWFsIGVudHJ5IHBvaW50LlxuICAgIHJldHVybiBnZXRJbnRyaW5zaWNOYW1lc3BhY2UodHlwZSk7XG4gIH1cblxuICBpZiAocGFyZW50TmFtZXNwYWNlID09PSBTVkdfTkFNRVNQQUNFICYmIHR5cGUgPT09ICdmb3JlaWduT2JqZWN0Jykge1xuICAgIC8vIFdlJ3JlIGxlYXZpbmcgU1ZHLlxuICAgIHJldHVybiBIVE1MX05BTUVTUEFDRTtcbiAgfSAvLyBCeSBkZWZhdWx0LCBwYXNzIG5hbWVzcGFjZSBiZWxvdy5cblxuXG4gIHJldHVybiBwYXJlbnROYW1lc3BhY2U7XG59XG5cbi8qIGdsb2JhbHMgTVNBcHAgKi9cblxuLyoqXG4gKiBDcmVhdGUgYSBmdW5jdGlvbiB3aGljaCBoYXMgJ3Vuc2FmZScgcHJpdmlsZWdlcyAocmVxdWlyZWQgYnkgd2luZG93czggYXBwcylcbiAqL1xudmFyIGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24gPSBmdW5jdGlvbiAoZnVuYykge1xuICBpZiAodHlwZW9mIE1TQXBwICE9PSAndW5kZWZpbmVkJyAmJiBNU0FwcC5leGVjVW5zYWZlTG9jYWxGdW5jdGlvbikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMykge1xuICAgICAgTVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZnVuYyhhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZ1bmM7XG4gIH1cbn07XG5cbnZhciByZXVzYWJsZVNWR0NvbnRhaW5lcjtcbi8qKlxuICogU2V0IHRoZSBpbm5lckhUTUwgcHJvcGVydHkgb2YgYSBub2RlXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gKiBAcGFyYW0ge3N0cmluZ30gaHRtbFxuICogQGludGVybmFsXG4gKi9cblxudmFyIHNldElubmVySFRNTCA9IGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24gKG5vZGUsIGh0bWwpIHtcbiAgaWYgKG5vZGUubmFtZXNwYWNlVVJJID09PSBTVkdfTkFNRVNQQUNFKSB7XG5cbiAgICBpZiAoISgnaW5uZXJIVE1MJyBpbiBub2RlKSkge1xuICAgICAgLy8gSUUgZG9lcyBub3QgaGF2ZSBpbm5lckhUTUwgZm9yIFNWRyBub2Rlcywgc28gaW5zdGVhZCB3ZSBpbmplY3QgdGhlXG4gICAgICAvLyBuZXcgbWFya3VwIGluIGEgdGVtcCBub2RlIGFuZCB0aGVuIG1vdmUgdGhlIGNoaWxkIG5vZGVzIGFjcm9zcyBpbnRvXG4gICAgICAvLyB0aGUgdGFyZ2V0IG5vZGVcbiAgICAgIHJldXNhYmxlU1ZHQ29udGFpbmVyID0gcmV1c2FibGVTVkdDb250YWluZXIgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICByZXVzYWJsZVNWR0NvbnRhaW5lci5pbm5lckhUTUwgPSAnPHN2Zz4nICsgaHRtbC52YWx1ZU9mKCkudG9TdHJpbmcoKSArICc8L3N2Zz4nO1xuICAgICAgdmFyIHN2Z05vZGUgPSByZXVzYWJsZVNWR0NvbnRhaW5lci5maXJzdENoaWxkO1xuXG4gICAgICB3aGlsZSAobm9kZS5maXJzdENoaWxkKSB7XG4gICAgICAgIG5vZGUucmVtb3ZlQ2hpbGQobm9kZS5maXJzdENoaWxkKTtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKHN2Z05vZGUuZmlyc3RDaGlsZCkge1xuICAgICAgICBub2RlLmFwcGVuZENoaWxkKHN2Z05vZGUuZmlyc3RDaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBub2RlLmlubmVySFRNTCA9IGh0bWw7XG59KTtcblxuLyoqXG4gKiBIVE1MIG5vZGVUeXBlIHZhbHVlcyB0aGF0IHJlcHJlc2VudCB0aGUgdHlwZSBvZiB0aGUgbm9kZVxuICovXG52YXIgRUxFTUVOVF9OT0RFID0gMTtcbnZhciBURVhUX05PREUgPSAzO1xudmFyIENPTU1FTlRfTk9ERSA9IDg7XG52YXIgRE9DVU1FTlRfTk9ERSA9IDk7XG52YXIgRE9DVU1FTlRfRlJBR01FTlRfTk9ERSA9IDExO1xuXG4vKipcbiAqIFNldCB0aGUgdGV4dENvbnRlbnQgcHJvcGVydHkgb2YgYSBub2RlLiBGb3IgdGV4dCB1cGRhdGVzLCBpdCdzIGZhc3RlclxuICogdG8gc2V0IHRoZSBgbm9kZVZhbHVlYCBvZiB0aGUgVGV4dCBub2RlIGRpcmVjdGx5IGluc3RlYWQgb2YgdXNpbmdcbiAqIGAudGV4dENvbnRlbnRgIHdoaWNoIHdpbGwgcmVtb3ZlIHRoZSBleGlzdGluZyBub2RlIGFuZCBjcmVhdGUgYSBuZXcgb25lLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtzdHJpbmd9IHRleHRcbiAqIEBpbnRlcm5hbFxuICovXG5cbnZhciBzZXRUZXh0Q29udGVudCA9IGZ1bmN0aW9uIChub2RlLCB0ZXh0KSB7XG4gIGlmICh0ZXh0KSB7XG4gICAgdmFyIGZpcnN0Q2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQ7XG5cbiAgICBpZiAoZmlyc3RDaGlsZCAmJiBmaXJzdENoaWxkID09PSBub2RlLmxhc3RDaGlsZCAmJiBmaXJzdENoaWxkLm5vZGVUeXBlID09PSBURVhUX05PREUpIHtcbiAgICAgIGZpcnN0Q2hpbGQubm9kZVZhbHVlID0gdGV4dDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBub2RlLnRleHRDb250ZW50ID0gdGV4dDtcbn07XG5cbi8vIExpc3QgZGVyaXZlZCBmcm9tIEdlY2tvIHNvdXJjZSBjb2RlOlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvZ2Vja28tZGV2L2Jsb2IvNGU2MzhlZmM3MS9sYXlvdXQvc3R5bGUvdGVzdC9wcm9wZXJ0eV9kYXRhYmFzZS5qc1xudmFyIHNob3J0aGFuZFRvTG9uZ2hhbmQgPSB7XG4gIGFuaW1hdGlvbjogWydhbmltYXRpb25EZWxheScsICdhbmltYXRpb25EaXJlY3Rpb24nLCAnYW5pbWF0aW9uRHVyYXRpb24nLCAnYW5pbWF0aW9uRmlsbE1vZGUnLCAnYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQnLCAnYW5pbWF0aW9uTmFtZScsICdhbmltYXRpb25QbGF5U3RhdGUnLCAnYW5pbWF0aW9uVGltaW5nRnVuY3Rpb24nXSxcbiAgYmFja2dyb3VuZDogWydiYWNrZ3JvdW5kQXR0YWNobWVudCcsICdiYWNrZ3JvdW5kQ2xpcCcsICdiYWNrZ3JvdW5kQ29sb3InLCAnYmFja2dyb3VuZEltYWdlJywgJ2JhY2tncm91bmRPcmlnaW4nLCAnYmFja2dyb3VuZFBvc2l0aW9uWCcsICdiYWNrZ3JvdW5kUG9zaXRpb25ZJywgJ2JhY2tncm91bmRSZXBlYXQnLCAnYmFja2dyb3VuZFNpemUnXSxcbiAgYmFja2dyb3VuZFBvc2l0aW9uOiBbJ2JhY2tncm91bmRQb3NpdGlvblgnLCAnYmFja2dyb3VuZFBvc2l0aW9uWSddLFxuICBib3JkZXI6IFsnYm9yZGVyQm90dG9tQ29sb3InLCAnYm9yZGVyQm90dG9tU3R5bGUnLCAnYm9yZGVyQm90dG9tV2lkdGgnLCAnYm9yZGVySW1hZ2VPdXRzZXQnLCAnYm9yZGVySW1hZ2VSZXBlYXQnLCAnYm9yZGVySW1hZ2VTbGljZScsICdib3JkZXJJbWFnZVNvdXJjZScsICdib3JkZXJJbWFnZVdpZHRoJywgJ2JvcmRlckxlZnRDb2xvcicsICdib3JkZXJMZWZ0U3R5bGUnLCAnYm9yZGVyTGVmdFdpZHRoJywgJ2JvcmRlclJpZ2h0Q29sb3InLCAnYm9yZGVyUmlnaHRTdHlsZScsICdib3JkZXJSaWdodFdpZHRoJywgJ2JvcmRlclRvcENvbG9yJywgJ2JvcmRlclRvcFN0eWxlJywgJ2JvcmRlclRvcFdpZHRoJ10sXG4gIGJvcmRlckJsb2NrRW5kOiBbJ2JvcmRlckJsb2NrRW5kQ29sb3InLCAnYm9yZGVyQmxvY2tFbmRTdHlsZScsICdib3JkZXJCbG9ja0VuZFdpZHRoJ10sXG4gIGJvcmRlckJsb2NrU3RhcnQ6IFsnYm9yZGVyQmxvY2tTdGFydENvbG9yJywgJ2JvcmRlckJsb2NrU3RhcnRTdHlsZScsICdib3JkZXJCbG9ja1N0YXJ0V2lkdGgnXSxcbiAgYm9yZGVyQm90dG9tOiBbJ2JvcmRlckJvdHRvbUNvbG9yJywgJ2JvcmRlckJvdHRvbVN0eWxlJywgJ2JvcmRlckJvdHRvbVdpZHRoJ10sXG4gIGJvcmRlckNvbG9yOiBbJ2JvcmRlckJvdHRvbUNvbG9yJywgJ2JvcmRlckxlZnRDb2xvcicsICdib3JkZXJSaWdodENvbG9yJywgJ2JvcmRlclRvcENvbG9yJ10sXG4gIGJvcmRlckltYWdlOiBbJ2JvcmRlckltYWdlT3V0c2V0JywgJ2JvcmRlckltYWdlUmVwZWF0JywgJ2JvcmRlckltYWdlU2xpY2UnLCAnYm9yZGVySW1hZ2VTb3VyY2UnLCAnYm9yZGVySW1hZ2VXaWR0aCddLFxuICBib3JkZXJJbmxpbmVFbmQ6IFsnYm9yZGVySW5saW5lRW5kQ29sb3InLCAnYm9yZGVySW5saW5lRW5kU3R5bGUnLCAnYm9yZGVySW5saW5lRW5kV2lkdGgnXSxcbiAgYm9yZGVySW5saW5lU3RhcnQ6IFsnYm9yZGVySW5saW5lU3RhcnRDb2xvcicsICdib3JkZXJJbmxpbmVTdGFydFN0eWxlJywgJ2JvcmRlcklubGluZVN0YXJ0V2lkdGgnXSxcbiAgYm9yZGVyTGVmdDogWydib3JkZXJMZWZ0Q29sb3InLCAnYm9yZGVyTGVmdFN0eWxlJywgJ2JvcmRlckxlZnRXaWR0aCddLFxuICBib3JkZXJSYWRpdXM6IFsnYm9yZGVyQm90dG9tTGVmdFJhZGl1cycsICdib3JkZXJCb3R0b21SaWdodFJhZGl1cycsICdib3JkZXJUb3BMZWZ0UmFkaXVzJywgJ2JvcmRlclRvcFJpZ2h0UmFkaXVzJ10sXG4gIGJvcmRlclJpZ2h0OiBbJ2JvcmRlclJpZ2h0Q29sb3InLCAnYm9yZGVyUmlnaHRTdHlsZScsICdib3JkZXJSaWdodFdpZHRoJ10sXG4gIGJvcmRlclN0eWxlOiBbJ2JvcmRlckJvdHRvbVN0eWxlJywgJ2JvcmRlckxlZnRTdHlsZScsICdib3JkZXJSaWdodFN0eWxlJywgJ2JvcmRlclRvcFN0eWxlJ10sXG4gIGJvcmRlclRvcDogWydib3JkZXJUb3BDb2xvcicsICdib3JkZXJUb3BTdHlsZScsICdib3JkZXJUb3BXaWR0aCddLFxuICBib3JkZXJXaWR0aDogWydib3JkZXJCb3R0b21XaWR0aCcsICdib3JkZXJMZWZ0V2lkdGgnLCAnYm9yZGVyUmlnaHRXaWR0aCcsICdib3JkZXJUb3BXaWR0aCddLFxuICBjb2x1bW5SdWxlOiBbJ2NvbHVtblJ1bGVDb2xvcicsICdjb2x1bW5SdWxlU3R5bGUnLCAnY29sdW1uUnVsZVdpZHRoJ10sXG4gIGNvbHVtbnM6IFsnY29sdW1uQ291bnQnLCAnY29sdW1uV2lkdGgnXSxcbiAgZmxleDogWydmbGV4QmFzaXMnLCAnZmxleEdyb3cnLCAnZmxleFNocmluayddLFxuICBmbGV4RmxvdzogWydmbGV4RGlyZWN0aW9uJywgJ2ZsZXhXcmFwJ10sXG4gIGZvbnQ6IFsnZm9udEZhbWlseScsICdmb250RmVhdHVyZVNldHRpbmdzJywgJ2ZvbnRLZXJuaW5nJywgJ2ZvbnRMYW5ndWFnZU92ZXJyaWRlJywgJ2ZvbnRTaXplJywgJ2ZvbnRTaXplQWRqdXN0JywgJ2ZvbnRTdHJldGNoJywgJ2ZvbnRTdHlsZScsICdmb250VmFyaWFudCcsICdmb250VmFyaWFudEFsdGVybmF0ZXMnLCAnZm9udFZhcmlhbnRDYXBzJywgJ2ZvbnRWYXJpYW50RWFzdEFzaWFuJywgJ2ZvbnRWYXJpYW50TGlnYXR1cmVzJywgJ2ZvbnRWYXJpYW50TnVtZXJpYycsICdmb250VmFyaWFudFBvc2l0aW9uJywgJ2ZvbnRXZWlnaHQnLCAnbGluZUhlaWdodCddLFxuICBmb250VmFyaWFudDogWydmb250VmFyaWFudEFsdGVybmF0ZXMnLCAnZm9udFZhcmlhbnRDYXBzJywgJ2ZvbnRWYXJpYW50RWFzdEFzaWFuJywgJ2ZvbnRWYXJpYW50TGlnYXR1cmVzJywgJ2ZvbnRWYXJpYW50TnVtZXJpYycsICdmb250VmFyaWFudFBvc2l0aW9uJ10sXG4gIGdhcDogWydjb2x1bW5HYXAnLCAncm93R2FwJ10sXG4gIGdyaWQ6IFsnZ3JpZEF1dG9Db2x1bW5zJywgJ2dyaWRBdXRvRmxvdycsICdncmlkQXV0b1Jvd3MnLCAnZ3JpZFRlbXBsYXRlQXJlYXMnLCAnZ3JpZFRlbXBsYXRlQ29sdW1ucycsICdncmlkVGVtcGxhdGVSb3dzJ10sXG4gIGdyaWRBcmVhOiBbJ2dyaWRDb2x1bW5FbmQnLCAnZ3JpZENvbHVtblN0YXJ0JywgJ2dyaWRSb3dFbmQnLCAnZ3JpZFJvd1N0YXJ0J10sXG4gIGdyaWRDb2x1bW46IFsnZ3JpZENvbHVtbkVuZCcsICdncmlkQ29sdW1uU3RhcnQnXSxcbiAgZ3JpZENvbHVtbkdhcDogWydjb2x1bW5HYXAnXSxcbiAgZ3JpZEdhcDogWydjb2x1bW5HYXAnLCAncm93R2FwJ10sXG4gIGdyaWRSb3c6IFsnZ3JpZFJvd0VuZCcsICdncmlkUm93U3RhcnQnXSxcbiAgZ3JpZFJvd0dhcDogWydyb3dHYXAnXSxcbiAgZ3JpZFRlbXBsYXRlOiBbJ2dyaWRUZW1wbGF0ZUFyZWFzJywgJ2dyaWRUZW1wbGF0ZUNvbHVtbnMnLCAnZ3JpZFRlbXBsYXRlUm93cyddLFxuICBsaXN0U3R5bGU6IFsnbGlzdFN0eWxlSW1hZ2UnLCAnbGlzdFN0eWxlUG9zaXRpb24nLCAnbGlzdFN0eWxlVHlwZSddLFxuICBtYXJnaW46IFsnbWFyZ2luQm90dG9tJywgJ21hcmdpbkxlZnQnLCAnbWFyZ2luUmlnaHQnLCAnbWFyZ2luVG9wJ10sXG4gIG1hcmtlcjogWydtYXJrZXJFbmQnLCAnbWFya2VyTWlkJywgJ21hcmtlclN0YXJ0J10sXG4gIG1hc2s6IFsnbWFza0NsaXAnLCAnbWFza0NvbXBvc2l0ZScsICdtYXNrSW1hZ2UnLCAnbWFza01vZGUnLCAnbWFza09yaWdpbicsICdtYXNrUG9zaXRpb25YJywgJ21hc2tQb3NpdGlvblknLCAnbWFza1JlcGVhdCcsICdtYXNrU2l6ZSddLFxuICBtYXNrUG9zaXRpb246IFsnbWFza1Bvc2l0aW9uWCcsICdtYXNrUG9zaXRpb25ZJ10sXG4gIG91dGxpbmU6IFsnb3V0bGluZUNvbG9yJywgJ291dGxpbmVTdHlsZScsICdvdXRsaW5lV2lkdGgnXSxcbiAgb3ZlcmZsb3c6IFsnb3ZlcmZsb3dYJywgJ292ZXJmbG93WSddLFxuICBwYWRkaW5nOiBbJ3BhZGRpbmdCb3R0b20nLCAncGFkZGluZ0xlZnQnLCAncGFkZGluZ1JpZ2h0JywgJ3BhZGRpbmdUb3AnXSxcbiAgcGxhY2VDb250ZW50OiBbJ2FsaWduQ29udGVudCcsICdqdXN0aWZ5Q29udGVudCddLFxuICBwbGFjZUl0ZW1zOiBbJ2FsaWduSXRlbXMnLCAnanVzdGlmeUl0ZW1zJ10sXG4gIHBsYWNlU2VsZjogWydhbGlnblNlbGYnLCAnanVzdGlmeVNlbGYnXSxcbiAgdGV4dERlY29yYXRpb246IFsndGV4dERlY29yYXRpb25Db2xvcicsICd0ZXh0RGVjb3JhdGlvbkxpbmUnLCAndGV4dERlY29yYXRpb25TdHlsZSddLFxuICB0ZXh0RW1waGFzaXM6IFsndGV4dEVtcGhhc2lzQ29sb3InLCAndGV4dEVtcGhhc2lzU3R5bGUnXSxcbiAgdHJhbnNpdGlvbjogWyd0cmFuc2l0aW9uRGVsYXknLCAndHJhbnNpdGlvbkR1cmF0aW9uJywgJ3RyYW5zaXRpb25Qcm9wZXJ0eScsICd0cmFuc2l0aW9uVGltaW5nRnVuY3Rpb24nXSxcbiAgd29yZFdyYXA6IFsnb3ZlcmZsb3dXcmFwJ11cbn07XG5cbi8qKlxuICogQ1NTIHByb3BlcnRpZXMgd2hpY2ggYWNjZXB0IG51bWJlcnMgYnV0IGFyZSBub3QgaW4gdW5pdHMgb2YgXCJweFwiLlxuICovXG52YXIgaXNVbml0bGVzc051bWJlciA9IHtcbiAgYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6IHRydWUsXG4gIGFzcGVjdFJhdGlvOiB0cnVlLFxuICBib3JkZXJJbWFnZU91dHNldDogdHJ1ZSxcbiAgYm9yZGVySW1hZ2VTbGljZTogdHJ1ZSxcbiAgYm9yZGVySW1hZ2VXaWR0aDogdHJ1ZSxcbiAgYm94RmxleDogdHJ1ZSxcbiAgYm94RmxleEdyb3VwOiB0cnVlLFxuICBib3hPcmRpbmFsR3JvdXA6IHRydWUsXG4gIGNvbHVtbkNvdW50OiB0cnVlLFxuICBjb2x1bW5zOiB0cnVlLFxuICBmbGV4OiB0cnVlLFxuICBmbGV4R3JvdzogdHJ1ZSxcbiAgZmxleFBvc2l0aXZlOiB0cnVlLFxuICBmbGV4U2hyaW5rOiB0cnVlLFxuICBmbGV4TmVnYXRpdmU6IHRydWUsXG4gIGZsZXhPcmRlcjogdHJ1ZSxcbiAgZ3JpZEFyZWE6IHRydWUsXG4gIGdyaWRSb3c6IHRydWUsXG4gIGdyaWRSb3dFbmQ6IHRydWUsXG4gIGdyaWRSb3dTcGFuOiB0cnVlLFxuICBncmlkUm93U3RhcnQ6IHRydWUsXG4gIGdyaWRDb2x1bW46IHRydWUsXG4gIGdyaWRDb2x1bW5FbmQ6IHRydWUsXG4gIGdyaWRDb2x1bW5TcGFuOiB0cnVlLFxuICBncmlkQ29sdW1uU3RhcnQ6IHRydWUsXG4gIGZvbnRXZWlnaHQ6IHRydWUsXG4gIGxpbmVDbGFtcDogdHJ1ZSxcbiAgbGluZUhlaWdodDogdHJ1ZSxcbiAgb3BhY2l0eTogdHJ1ZSxcbiAgb3JkZXI6IHRydWUsXG4gIG9ycGhhbnM6IHRydWUsXG4gIHRhYlNpemU6IHRydWUsXG4gIHdpZG93czogdHJ1ZSxcbiAgekluZGV4OiB0cnVlLFxuICB6b29tOiB0cnVlLFxuICAvLyBTVkctcmVsYXRlZCBwcm9wZXJ0aWVzXG4gIGZpbGxPcGFjaXR5OiB0cnVlLFxuICBmbG9vZE9wYWNpdHk6IHRydWUsXG4gIHN0b3BPcGFjaXR5OiB0cnVlLFxuICBzdHJva2VEYXNoYXJyYXk6IHRydWUsXG4gIHN0cm9rZURhc2hvZmZzZXQ6IHRydWUsXG4gIHN0cm9rZU1pdGVybGltaXQ6IHRydWUsXG4gIHN0cm9rZU9wYWNpdHk6IHRydWUsXG4gIHN0cm9rZVdpZHRoOiB0cnVlXG59O1xuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4IHZlbmRvci1zcGVjaWZpYyBwcmVmaXgsIGVnOiBXZWJraXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgc3R5bGUgbmFtZSwgZWc6IHRyYW5zaXRpb25EdXJhdGlvblxuICogQHJldHVybiB7c3RyaW5nfSBzdHlsZSBuYW1lIHByZWZpeGVkIHdpdGggYHByZWZpeGAsIHByb3Blcmx5IGNhbWVsQ2FzZWQsIGVnOlxuICogV2Via2l0VHJhbnNpdGlvbkR1cmF0aW9uXG4gKi9cblxuZnVuY3Rpb24gcHJlZml4S2V5KHByZWZpeCwga2V5KSB7XG4gIHJldHVybiBwcmVmaXggKyBrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBrZXkuc3Vic3RyaW5nKDEpO1xufVxuLyoqXG4gKiBTdXBwb3J0IHN0eWxlIG5hbWVzIHRoYXQgbWF5IGNvbWUgcGFzc2VkIGluIHByZWZpeGVkIGJ5IGFkZGluZyBwZXJtdXRhdGlvbnNcbiAqIG9mIHZlbmRvciBwcmVmaXhlcy5cbiAqL1xuXG5cbnZhciBwcmVmaXhlcyA9IFsnV2Via2l0JywgJ21zJywgJ01veicsICdPJ107IC8vIFVzaW5nIE9iamVjdC5rZXlzIGhlcmUsIG9yIGVsc2UgdGhlIHZhbmlsbGEgZm9yLWluIGxvb3AgbWFrZXMgSUU4IGdvIGludG8gYW5cbi8vIGluZmluaXRlIGxvb3AsIGJlY2F1c2UgaXQgaXRlcmF0ZXMgb3ZlciB0aGUgbmV3bHkgYWRkZWQgcHJvcHMgdG9vLlxuXG5PYmplY3Qua2V5cyhpc1VuaXRsZXNzTnVtYmVyKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gIHByZWZpeGVzLmZvckVhY2goZnVuY3Rpb24gKHByZWZpeCkge1xuICAgIGlzVW5pdGxlc3NOdW1iZXJbcHJlZml4S2V5KHByZWZpeCwgcHJvcCldID0gaXNVbml0bGVzc051bWJlcltwcm9wXTtcbiAgfSk7XG59KTtcblxuLyoqXG4gKiBDb252ZXJ0IGEgdmFsdWUgaW50byB0aGUgcHJvcGVyIGNzcyB3cml0YWJsZSB2YWx1ZS4gVGhlIHN0eWxlIG5hbWUgYG5hbWVgXG4gKiBzaG91bGQgYmUgbG9naWNhbCAobm8gaHlwaGVucyksIGFzIHNwZWNpZmllZFxuICogaW4gYENTU1Byb3BlcnR5LmlzVW5pdGxlc3NOdW1iZXJgLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIENTUyBwcm9wZXJ0eSBuYW1lIHN1Y2ggYXMgYHRvcE1hcmdpbmAuXG4gKiBAcGFyYW0geyp9IHZhbHVlIENTUyBwcm9wZXJ0eSB2YWx1ZSBzdWNoIGFzIGAxMHB4YC5cbiAqIEByZXR1cm4ge3N0cmluZ30gTm9ybWFsaXplZCBzdHlsZSB2YWx1ZSB3aXRoIGRpbWVuc2lvbnMgYXBwbGllZC5cbiAqL1xuXG5mdW5jdGlvbiBkYW5nZXJvdXNTdHlsZVZhbHVlKG5hbWUsIHZhbHVlLCBpc0N1c3RvbVByb3BlcnR5KSB7XG4gIC8vIE5vdGUgdGhhdCB3ZSd2ZSByZW1vdmVkIGVzY2FwZVRleHRGb3JCcm93c2VyKCkgY2FsbHMgaGVyZSBzaW5jZSB0aGVcbiAgLy8gd2hvbGUgc3RyaW5nIHdpbGwgYmUgZXNjYXBlZCB3aGVuIHRoZSBhdHRyaWJ1dGUgaXMgaW5qZWN0ZWQgaW50b1xuICAvLyB0aGUgbWFya3VwLiBJZiB5b3UgcHJvdmlkZSB1bnNhZmUgdXNlciBkYXRhIGhlcmUgdGhleSBjYW4gaW5qZWN0XG4gIC8vIGFyYml0cmFyeSBDU1Mgd2hpY2ggbWF5IGJlIHByb2JsZW1hdGljIChJIGNvdWxkbid0IHJlcHJvIHRoaXMpOlxuICAvLyBodHRwczovL3d3dy5vd2FzcC5vcmcvaW5kZXgucGhwL1hTU19GaWx0ZXJfRXZhc2lvbl9DaGVhdF9TaGVldFxuICAvLyBodHRwOi8vd3d3LnRoZXNwYW5uZXIuY28udWsvMjAwNy8xMS8yNi91bHRpbWF0ZS14c3MtY3NzLWluamVjdGlvbi9cbiAgLy8gVGhpcyBpcyBub3QgYW4gWFNTIGhvbGUgYnV0IGluc3RlYWQgYSBwb3RlbnRpYWwgQ1NTIGluamVjdGlvbiBpc3N1ZVxuICAvLyB3aGljaCBoYXMgbGVhZCB0byBhIGdyZWF0ZXIgZGlzY3Vzc2lvbiBhYm91dCBob3cgd2UncmUgZ29pbmcgdG9cbiAgLy8gdHJ1c3QgVVJMcyBtb3ZpbmcgZm9yd2FyZC4gU2VlICMyMTE1OTAxXG4gIHZhciBpc0VtcHR5ID0gdmFsdWUgPT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyB8fCB2YWx1ZSA9PT0gJyc7XG5cbiAgaWYgKGlzRW1wdHkpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAoIWlzQ3VzdG9tUHJvcGVydHkgJiYgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiB2YWx1ZSAhPT0gMCAmJiAhKGlzVW5pdGxlc3NOdW1iZXIuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgaXNVbml0bGVzc051bWJlcltuYW1lXSkpIHtcbiAgICByZXR1cm4gdmFsdWUgKyAncHgnOyAvLyBQcmVzdW1lcyBpbXBsaWNpdCAncHgnIHN1ZmZpeCBmb3IgdW5pdGxlc3MgbnVtYmVyc1xuICB9XG5cbiAge1xuICAgIGNoZWNrQ1NTUHJvcGVydHlTdHJpbmdDb2VyY2lvbih2YWx1ZSwgbmFtZSk7XG4gIH1cblxuICByZXR1cm4gKCcnICsgdmFsdWUpLnRyaW0oKTtcbn1cblxudmFyIHVwcGVyY2FzZVBhdHRlcm4gPSAvKFtBLVpdKS9nO1xudmFyIG1zUGF0dGVybiA9IC9ebXMtLztcbi8qKlxuICogSHlwaGVuYXRlcyBhIGNhbWVsY2FzZWQgQ1NTIHByb3BlcnR5IG5hbWUsIGZvciBleGFtcGxlOlxuICpcbiAqICAgPiBoeXBoZW5hdGVTdHlsZU5hbWUoJ2JhY2tncm91bmRDb2xvcicpXG4gKiAgIDwgXCJiYWNrZ3JvdW5kLWNvbG9yXCJcbiAqICAgPiBoeXBoZW5hdGVTdHlsZU5hbWUoJ01velRyYW5zaXRpb24nKVxuICogICA8IFwiLW1vei10cmFuc2l0aW9uXCJcbiAqICAgPiBoeXBoZW5hdGVTdHlsZU5hbWUoJ21zVHJhbnNpdGlvbicpXG4gKiAgIDwgXCItbXMtdHJhbnNpdGlvblwiXG4gKlxuICogQXMgTW9kZXJuaXpyIHN1Z2dlc3RzIChodHRwOi8vbW9kZXJuaXpyLmNvbS9kb2NzLyNwcmVmaXhlZCksIGFuIGBtc2AgcHJlZml4XG4gKiBpcyBjb252ZXJ0ZWQgdG8gYC1tcy1gLlxuICovXG5cbmZ1bmN0aW9uIGh5cGhlbmF0ZVN0eWxlTmFtZShuYW1lKSB7XG4gIHJldHVybiBuYW1lLnJlcGxhY2UodXBwZXJjYXNlUGF0dGVybiwgJy0kMScpLnRvTG93ZXJDYXNlKCkucmVwbGFjZShtc1BhdHRlcm4sICctbXMtJyk7XG59XG5cbnZhciB3YXJuVmFsaWRTdHlsZSA9IGZ1bmN0aW9uICgpIHt9O1xuXG57XG4gIC8vICdtc1RyYW5zZm9ybScgaXMgY29ycmVjdCwgYnV0IHRoZSBvdGhlciBwcmVmaXhlcyBzaG91bGQgYmUgY2FwaXRhbGl6ZWRcbiAgdmFyIGJhZFZlbmRvcmVkU3R5bGVOYW1lUGF0dGVybiA9IC9eKD86d2Via2l0fG1venxvKVtBLVpdLztcbiAgdmFyIG1zUGF0dGVybiQxID0gL14tbXMtLztcbiAgdmFyIGh5cGhlblBhdHRlcm4gPSAvLSguKS9nOyAvLyBzdHlsZSB2YWx1ZXMgc2hvdWxkbid0IGNvbnRhaW4gYSBzZW1pY29sb25cblxuICB2YXIgYmFkU3R5bGVWYWx1ZVdpdGhTZW1pY29sb25QYXR0ZXJuID0gLztcXHMqJC87XG4gIHZhciB3YXJuZWRTdHlsZU5hbWVzID0ge307XG4gIHZhciB3YXJuZWRTdHlsZVZhbHVlcyA9IHt9O1xuICB2YXIgd2FybmVkRm9yTmFOVmFsdWUgPSBmYWxzZTtcbiAgdmFyIHdhcm5lZEZvckluZmluaXR5VmFsdWUgPSBmYWxzZTtcblxuICB2YXIgY2FtZWxpemUgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKGh5cGhlblBhdHRlcm4sIGZ1bmN0aW9uIChfLCBjaGFyYWN0ZXIpIHtcbiAgICAgIHJldHVybiBjaGFyYWN0ZXIudG9VcHBlckNhc2UoKTtcbiAgICB9KTtcbiAgfTtcblxuICB2YXIgd2Fybkh5cGhlbmF0ZWRTdHlsZU5hbWUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIGlmICh3YXJuZWRTdHlsZU5hbWVzLmhhc093blByb3BlcnR5KG5hbWUpICYmIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRTdHlsZU5hbWVzW25hbWVdID0gdHJ1ZTtcblxuICAgIGVycm9yKCdVbnN1cHBvcnRlZCBzdHlsZSBwcm9wZXJ0eSAlcy4gRGlkIHlvdSBtZWFuICVzPycsIG5hbWUsIC8vIEFzIEFuZGkgU21pdGggc3VnZ2VzdHNcbiAgICAvLyAoaHR0cDovL3d3dy5hbmRpc21pdGguY29tL2Jsb2cvMjAxMi8wMi9tb2Rlcm5penItcHJlZml4ZWQvKSwgYW4gYC1tc2AgcHJlZml4XG4gICAgLy8gaXMgY29udmVydGVkIHRvIGxvd2VyY2FzZSBgbXNgLlxuICAgIGNhbWVsaXplKG5hbWUucmVwbGFjZShtc1BhdHRlcm4kMSwgJ21zLScpKSk7XG4gIH07XG5cbiAgdmFyIHdhcm5CYWRWZW5kb3JlZFN0eWxlTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgaWYgKHdhcm5lZFN0eWxlTmFtZXMuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgd2FybmVkU3R5bGVOYW1lc1tuYW1lXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ1Vuc3VwcG9ydGVkIHZlbmRvci1wcmVmaXhlZCBzdHlsZSBwcm9wZXJ0eSAlcy4gRGlkIHlvdSBtZWFuICVzPycsIG5hbWUsIG5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpKTtcbiAgfTtcblxuICB2YXIgd2FyblN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKHdhcm5lZFN0eWxlVmFsdWVzLmhhc093blByb3BlcnR5KHZhbHVlKSAmJiB3YXJuZWRTdHlsZVZhbHVlc1t2YWx1ZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRTdHlsZVZhbHVlc1t2YWx1ZV0gPSB0cnVlO1xuXG4gICAgZXJyb3IoXCJTdHlsZSBwcm9wZXJ0eSB2YWx1ZXMgc2hvdWxkbid0IGNvbnRhaW4gYSBzZW1pY29sb24uIFwiICsgJ1RyeSBcIiVzOiAlc1wiIGluc3RlYWQuJywgbmFtZSwgdmFsdWUucmVwbGFjZShiYWRTdHlsZVZhbHVlV2l0aFNlbWljb2xvblBhdHRlcm4sICcnKSk7XG4gIH07XG5cbiAgdmFyIHdhcm5TdHlsZVZhbHVlSXNOYU4gPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICBpZiAod2FybmVkRm9yTmFOVmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRGb3JOYU5WYWx1ZSA9IHRydWU7XG5cbiAgICBlcnJvcignYE5hTmAgaXMgYW4gaW52YWxpZCB2YWx1ZSBmb3IgdGhlIGAlc2AgY3NzIHN0eWxlIHByb3BlcnR5LicsIG5hbWUpO1xuICB9O1xuXG4gIHZhciB3YXJuU3R5bGVWYWx1ZUlzSW5maW5pdHkgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICBpZiAod2FybmVkRm9ySW5maW5pdHlWYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdhcm5lZEZvckluZmluaXR5VmFsdWUgPSB0cnVlO1xuXG4gICAgZXJyb3IoJ2BJbmZpbml0eWAgaXMgYW4gaW52YWxpZCB2YWx1ZSBmb3IgdGhlIGAlc2AgY3NzIHN0eWxlIHByb3BlcnR5LicsIG5hbWUpO1xuICB9O1xuXG4gIHdhcm5WYWxpZFN0eWxlID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKG5hbWUuaW5kZXhPZignLScpID4gLTEpIHtcbiAgICAgIHdhcm5IeXBoZW5hdGVkU3R5bGVOYW1lKG5hbWUpO1xuICAgIH0gZWxzZSBpZiAoYmFkVmVuZG9yZWRTdHlsZU5hbWVQYXR0ZXJuLnRlc3QobmFtZSkpIHtcbiAgICAgIHdhcm5CYWRWZW5kb3JlZFN0eWxlTmFtZShuYW1lKTtcbiAgICB9IGVsc2UgaWYgKGJhZFN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uUGF0dGVybi50ZXN0KHZhbHVlKSkge1xuICAgICAgd2FyblN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uKG5hbWUsIHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKGlzTmFOKHZhbHVlKSkge1xuICAgICAgICB3YXJuU3R5bGVWYWx1ZUlzTmFOKG5hbWUsIHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoIWlzRmluaXRlKHZhbHVlKSkge1xuICAgICAgICB3YXJuU3R5bGVWYWx1ZUlzSW5maW5pdHkobmFtZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxudmFyIHdhcm5WYWxpZFN0eWxlJDEgPSB3YXJuVmFsaWRTdHlsZTtcblxuLyoqXG4gKiBPcGVyYXRpb25zIGZvciBkZWFsaW5nIHdpdGggQ1NTIHByb3BlcnRpZXMuXG4gKi9cblxuLyoqXG4gKiBUaGlzIGNyZWF0ZXMgYSBzdHJpbmcgdGhhdCBpcyBleHBlY3RlZCB0byBiZSBlcXVpdmFsZW50IHRvIHRoZSBzdHlsZVxuICogYXR0cmlidXRlIGdlbmVyYXRlZCBieSBzZXJ2ZXItc2lkZSByZW5kZXJpbmcuIEl0IGJ5LXBhc3NlcyB3YXJuaW5ncyBhbmRcbiAqIHNlY3VyaXR5IGNoZWNrcyBzbyBpdCdzIG5vdCBzYWZlIHRvIHVzZSB0aGlzIHZhbHVlIGZvciBhbnl0aGluZyBvdGhlciB0aGFuXG4gKiBjb21wYXJpc29uLiBJdCBpcyBvbmx5IHVzZWQgaW4gREVWIGZvciBTU1IgdmFsaWRhdGlvbi5cbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVEYW5nZXJvdXNTdHJpbmdGb3JTdHlsZXMoc3R5bGVzKSB7XG4gIHtcbiAgICB2YXIgc2VyaWFsaXplZCA9ICcnO1xuICAgIHZhciBkZWxpbWl0ZXIgPSAnJztcblxuICAgIGZvciAodmFyIHN0eWxlTmFtZSBpbiBzdHlsZXMpIHtcbiAgICAgIGlmICghc3R5bGVzLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBzdHlsZVZhbHVlID0gc3R5bGVzW3N0eWxlTmFtZV07XG5cbiAgICAgIGlmIChzdHlsZVZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgdmFyIGlzQ3VzdG9tUHJvcGVydHkgPSBzdHlsZU5hbWUuaW5kZXhPZignLS0nKSA9PT0gMDtcbiAgICAgICAgc2VyaWFsaXplZCArPSBkZWxpbWl0ZXIgKyAoaXNDdXN0b21Qcm9wZXJ0eSA/IHN0eWxlTmFtZSA6IGh5cGhlbmF0ZVN0eWxlTmFtZShzdHlsZU5hbWUpKSArICc6JztcbiAgICAgICAgc2VyaWFsaXplZCArPSBkYW5nZXJvdXNTdHlsZVZhbHVlKHN0eWxlTmFtZSwgc3R5bGVWYWx1ZSwgaXNDdXN0b21Qcm9wZXJ0eSk7XG4gICAgICAgIGRlbGltaXRlciA9ICc7JztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2VyaWFsaXplZCB8fCBudWxsO1xuICB9XG59XG4vKipcbiAqIFNldHMgdGhlIHZhbHVlIGZvciBtdWx0aXBsZSBzdHlsZXMgb24gYSBub2RlLiAgSWYgYSB2YWx1ZSBpcyBzcGVjaWZpZWQgYXNcbiAqICcnIChlbXB0eSBzdHJpbmcpLCB0aGUgY29ycmVzcG9uZGluZyBzdHlsZSBwcm9wZXJ0eSB3aWxsIGJlIHVuc2V0LlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtvYmplY3R9IHN0eWxlc1xuICovXG5cbmZ1bmN0aW9uIHNldFZhbHVlRm9yU3R5bGVzKG5vZGUsIHN0eWxlcykge1xuICB2YXIgc3R5bGUgPSBub2RlLnN0eWxlO1xuXG4gIGZvciAodmFyIHN0eWxlTmFtZSBpbiBzdHlsZXMpIHtcbiAgICBpZiAoIXN0eWxlcy5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgaXNDdXN0b21Qcm9wZXJ0eSA9IHN0eWxlTmFtZS5pbmRleE9mKCctLScpID09PSAwO1xuXG4gICAge1xuICAgICAgaWYgKCFpc0N1c3RvbVByb3BlcnR5KSB7XG4gICAgICAgIHdhcm5WYWxpZFN0eWxlJDEoc3R5bGVOYW1lLCBzdHlsZXNbc3R5bGVOYW1lXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHN0eWxlVmFsdWUgPSBkYW5nZXJvdXNTdHlsZVZhbHVlKHN0eWxlTmFtZSwgc3R5bGVzW3N0eWxlTmFtZV0sIGlzQ3VzdG9tUHJvcGVydHkpO1xuXG4gICAgaWYgKHN0eWxlTmFtZSA9PT0gJ2Zsb2F0Jykge1xuICAgICAgc3R5bGVOYW1lID0gJ2Nzc0Zsb2F0JztcbiAgICB9XG5cbiAgICBpZiAoaXNDdXN0b21Qcm9wZXJ0eSkge1xuICAgICAgc3R5bGUuc2V0UHJvcGVydHkoc3R5bGVOYW1lLCBzdHlsZVZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3R5bGVbc3R5bGVOYW1lXSA9IHN0eWxlVmFsdWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzVmFsdWVFbXB0eSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyB8fCB2YWx1ZSA9PT0gJyc7XG59XG4vKipcbiAqIEdpdmVuIHtjb2xvcjogJ3JlZCcsIG92ZXJmbG93OiAnaGlkZGVuJ30gcmV0dXJucyB7XG4gKiAgIGNvbG9yOiAnY29sb3InLFxuICogICBvdmVyZmxvd1g6ICdvdmVyZmxvdycsXG4gKiAgIG92ZXJmbG93WTogJ292ZXJmbG93JyxcbiAqIH0uIFRoaXMgY2FuIGJlIHJlYWQgYXMgXCJ0aGUgb3ZlcmZsb3dZIHByb3BlcnR5IHdhcyBzZXQgYnkgdGhlIG92ZXJmbG93XG4gKiBzaG9ydGhhbmRcIi4gVGhhdCBpcywgdGhlIHZhbHVlcyBhcmUgdGhlIHByb3BlcnR5IHRoYXQgZWFjaCB3YXMgZGVyaXZlZCBmcm9tLlxuICovXG5cblxuZnVuY3Rpb24gZXhwYW5kU2hvcnRoYW5kTWFwKHN0eWxlcykge1xuICB2YXIgZXhwYW5kZWQgPSB7fTtcblxuICBmb3IgKHZhciBrZXkgaW4gc3R5bGVzKSB7XG4gICAgdmFyIGxvbmdoYW5kcyA9IHNob3J0aGFuZFRvTG9uZ2hhbmRba2V5XSB8fCBba2V5XTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG9uZ2hhbmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBleHBhbmRlZFtsb25naGFuZHNbaV1dID0ga2V5O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleHBhbmRlZDtcbn1cbi8qKlxuICogV2hlbiBtaXhpbmcgc2hvcnRoYW5kIGFuZCBsb25naGFuZCBwcm9wZXJ0eSBuYW1lcywgd2Ugd2FybiBkdXJpbmcgdXBkYXRlcyBpZlxuICogd2UgZXhwZWN0IGFuIGluY29ycmVjdCByZXN1bHQgdG8gb2NjdXIuIEluIHBhcnRpY3VsYXIsIHdlIHdhcm4gZm9yOlxuICpcbiAqIFVwZGF0aW5nIGEgc2hvcnRoYW5kIHByb3BlcnR5IChsb25naGFuZCBnZXRzIG92ZXJ3cml0dGVuKTpcbiAqICAge2ZvbnQ6ICdmb28nLCBmb250VmFyaWFudDogJ2Jhcid9IC0+IHtmb250OiAnYmF6JywgZm9udFZhcmlhbnQ6ICdiYXInfVxuICogICBiZWNvbWVzIC5zdHlsZS5mb250ID0gJ2JheidcbiAqIFJlbW92aW5nIGEgc2hvcnRoYW5kIHByb3BlcnR5IChsb25naGFuZCBnZXRzIGxvc3QgdG9vKTpcbiAqICAge2ZvbnQ6ICdmb28nLCBmb250VmFyaWFudDogJ2Jhcid9IC0+IHtmb250VmFyaWFudDogJ2Jhcid9XG4gKiAgIGJlY29tZXMgLnN0eWxlLmZvbnQgPSAnJ1xuICogUmVtb3ZpbmcgYSBsb25naGFuZCBwcm9wZXJ0eSAoc2hvdWxkIHJldmVydCB0byBzaG9ydGhhbmQ7IGRvZXNuJ3QpOlxuICogICB7Zm9udDogJ2ZvbycsIGZvbnRWYXJpYW50OiAnYmFyJ30gLT4ge2ZvbnQ6ICdmb28nfVxuICogICBiZWNvbWVzIC5zdHlsZS5mb250VmFyaWFudCA9ICcnXG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZVNob3J0aGFuZFByb3BlcnR5Q29sbGlzaW9uSW5EZXYoc3R5bGVVcGRhdGVzLCBuZXh0U3R5bGVzKSB7XG4gIHtcbiAgICBpZiAoIW5leHRTdHlsZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZXhwYW5kZWRVcGRhdGVzID0gZXhwYW5kU2hvcnRoYW5kTWFwKHN0eWxlVXBkYXRlcyk7XG4gICAgdmFyIGV4cGFuZGVkU3R5bGVzID0gZXhwYW5kU2hvcnRoYW5kTWFwKG5leHRTdHlsZXMpO1xuICAgIHZhciB3YXJuZWRBYm91dCA9IHt9O1xuXG4gICAgZm9yICh2YXIga2V5IGluIGV4cGFuZGVkVXBkYXRlcykge1xuICAgICAgdmFyIG9yaWdpbmFsS2V5ID0gZXhwYW5kZWRVcGRhdGVzW2tleV07XG4gICAgICB2YXIgY29ycmVjdE9yaWdpbmFsS2V5ID0gZXhwYW5kZWRTdHlsZXNba2V5XTtcblxuICAgICAgaWYgKGNvcnJlY3RPcmlnaW5hbEtleSAmJiBvcmlnaW5hbEtleSAhPT0gY29ycmVjdE9yaWdpbmFsS2V5KSB7XG4gICAgICAgIHZhciB3YXJuaW5nS2V5ID0gb3JpZ2luYWxLZXkgKyAnLCcgKyBjb3JyZWN0T3JpZ2luYWxLZXk7XG5cbiAgICAgICAgaWYgKHdhcm5lZEFib3V0W3dhcm5pbmdLZXldKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB3YXJuZWRBYm91dFt3YXJuaW5nS2V5XSA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJyVzIGEgc3R5bGUgcHJvcGVydHkgZHVyaW5nIHJlcmVuZGVyICglcykgd2hlbiBhICcgKyAnY29uZmxpY3RpbmcgcHJvcGVydHkgaXMgc2V0ICglcykgY2FuIGxlYWQgdG8gc3R5bGluZyBidWdzLiBUbyAnICsgXCJhdm9pZCB0aGlzLCBkb24ndCBtaXggc2hvcnRoYW5kIGFuZCBub24tc2hvcnRoYW5kIHByb3BlcnRpZXMgXCIgKyAnZm9yIHRoZSBzYW1lIHZhbHVlOyBpbnN0ZWFkLCByZXBsYWNlIHRoZSBzaG9ydGhhbmQgd2l0aCAnICsgJ3NlcGFyYXRlIHZhbHVlcy4nLCBpc1ZhbHVlRW1wdHkoc3R5bGVVcGRhdGVzW29yaWdpbmFsS2V5XSkgPyAnUmVtb3ZpbmcnIDogJ1VwZGF0aW5nJywgb3JpZ2luYWxLZXksIGNvcnJlY3RPcmlnaW5hbEtleSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIEZvciBIVE1MLCBjZXJ0YWluIHRhZ3Mgc2hvdWxkIG9taXQgdGhlaXIgY2xvc2UgdGFnLiBXZSBrZWVwIGEgbGlzdCBmb3Jcbi8vIHRob3NlIHNwZWNpYWwtY2FzZSB0YWdzLlxudmFyIG9taXR0ZWRDbG9zZVRhZ3MgPSB7XG4gIGFyZWE6IHRydWUsXG4gIGJhc2U6IHRydWUsXG4gIGJyOiB0cnVlLFxuICBjb2w6IHRydWUsXG4gIGVtYmVkOiB0cnVlLFxuICBocjogdHJ1ZSxcbiAgaW1nOiB0cnVlLFxuICBpbnB1dDogdHJ1ZSxcbiAga2V5Z2VuOiB0cnVlLFxuICBsaW5rOiB0cnVlLFxuICBtZXRhOiB0cnVlLFxuICBwYXJhbTogdHJ1ZSxcbiAgc291cmNlOiB0cnVlLFxuICB0cmFjazogdHJ1ZSxcbiAgd2JyOiB0cnVlIC8vIE5PVEU6IG1lbnVpdGVtJ3MgY2xvc2UgdGFnIHNob3VsZCBiZSBvbWl0dGVkLCBidXQgdGhhdCBjYXVzZXMgcHJvYmxlbXMuXG5cbn07XG5cbi8vIGBvbWl0dGVkQ2xvc2VUYWdzYCBleGNlcHQgdGhhdCBgbWVudWl0ZW1gIHNob3VsZCBzdGlsbCBoYXZlIGl0cyBjbG9zaW5nIHRhZy5cblxudmFyIHZvaWRFbGVtZW50VGFncyA9IGFzc2lnbih7XG4gIG1lbnVpdGVtOiB0cnVlXG59LCBvbWl0dGVkQ2xvc2VUYWdzKTtcblxudmFyIEhUTUwgPSAnX19odG1sJztcblxuZnVuY3Rpb24gYXNzZXJ0VmFsaWRQcm9wcyh0YWcsIHByb3BzKSB7XG4gIGlmICghcHJvcHMpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gTm90ZSB0aGUgdXNlIG9mIGA9PWAgd2hpY2ggY2hlY2tzIGZvciBudWxsIG9yIHVuZGVmaW5lZC5cblxuXG4gIGlmICh2b2lkRWxlbWVudFRhZ3NbdGFnXSkge1xuICAgIGlmIChwcm9wcy5jaGlsZHJlbiAhPSBudWxsIHx8IHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICE9IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcih0YWcgKyBcIiBpcyBhIHZvaWQgZWxlbWVudCB0YWcgYW5kIG11c3QgbmVpdGhlciBoYXZlIGBjaGlsZHJlbmAgbm9yIFwiICsgJ3VzZSBgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgLicpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAhPSBudWxsKSB7XG4gICAgaWYgKHByb3BzLmNoaWxkcmVuICE9IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuIG9ubHkgc2V0IG9uZSBvZiBgY2hpbGRyZW5gIG9yIGBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTGAuJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAhPT0gJ29iamVjdCcgfHwgIShIVE1MIGluIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgIG11c3QgYmUgaW4gdGhlIGZvcm0gYHtfX2h0bWw6IC4uLn1gLiAnICsgJ1BsZWFzZSB2aXNpdCBodHRwczovL3JlYWN0anMub3JnL2xpbmsvZGFuZ2Vyb3VzbHktc2V0LWlubmVyLWh0bWwgJyArICdmb3IgbW9yZSBpbmZvcm1hdGlvbi4nKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgaWYgKCFwcm9wcy5zdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcgJiYgcHJvcHMuY29udGVudEVkaXRhYmxlICYmIHByb3BzLmNoaWxkcmVuICE9IG51bGwpIHtcbiAgICAgIGVycm9yKCdBIGNvbXBvbmVudCBpcyBgY29udGVudEVkaXRhYmxlYCBhbmQgY29udGFpbnMgYGNoaWxkcmVuYCBtYW5hZ2VkIGJ5ICcgKyAnUmVhY3QuIEl0IGlzIG5vdyB5b3VyIHJlc3BvbnNpYmlsaXR5IHRvIGd1YXJhbnRlZSB0aGF0IG5vbmUgb2YgJyArICd0aG9zZSBub2RlcyBhcmUgdW5leHBlY3RlZGx5IG1vZGlmaWVkIG9yIGR1cGxpY2F0ZWQuIFRoaXMgaXMgJyArICdwcm9iYWJseSBub3QgaW50ZW50aW9uYWwuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHByb3BzLnN0eWxlICE9IG51bGwgJiYgdHlwZW9mIHByb3BzLnN0eWxlICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIGBzdHlsZWAgcHJvcCBleHBlY3RzIGEgbWFwcGluZyBmcm9tIHN0eWxlIHByb3BlcnRpZXMgdG8gdmFsdWVzLCAnICsgXCJub3QgYSBzdHJpbmcuIEZvciBleGFtcGxlLCBzdHlsZT17e21hcmdpblJpZ2h0OiBzcGFjaW5nICsgJ2VtJ319IHdoZW4gXCIgKyAndXNpbmcgSlNYLicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzQ3VzdG9tQ29tcG9uZW50KHRhZ05hbWUsIHByb3BzKSB7XG4gIGlmICh0YWdOYW1lLmluZGV4T2YoJy0nKSA9PT0gLTEpIHtcbiAgICByZXR1cm4gdHlwZW9mIHByb3BzLmlzID09PSAnc3RyaW5nJztcbiAgfVxuXG4gIHN3aXRjaCAodGFnTmFtZSkge1xuICAgIC8vIFRoZXNlIGFyZSByZXNlcnZlZCBTVkcgYW5kIE1hdGhNTCBlbGVtZW50cy5cbiAgICAvLyBXZSBkb24ndCBtaW5kIHRoaXMgbGlzdCB0b28gbXVjaCBiZWNhdXNlIHdlIGV4cGVjdCBpdCB0byBuZXZlciBncm93LlxuICAgIC8vIFRoZSBhbHRlcm5hdGl2ZSBpcyB0byB0cmFjayB0aGUgbmFtZXNwYWNlIGluIGEgZmV3IHBsYWNlcyB3aGljaCBpcyBjb252b2x1dGVkLlxuICAgIC8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJjb21wb25lbnRzL3NwZWMvY3VzdG9tLyNjdXN0b20tZWxlbWVudHMtY29yZS1jb25jZXB0c1xuICAgIGNhc2UgJ2Fubm90YXRpb24teG1sJzpcbiAgICBjYXNlICdjb2xvci1wcm9maWxlJzpcbiAgICBjYXNlICdmb250LWZhY2UnOlxuICAgIGNhc2UgJ2ZvbnQtZmFjZS1zcmMnOlxuICAgIGNhc2UgJ2ZvbnQtZmFjZS11cmknOlxuICAgIGNhc2UgJ2ZvbnQtZmFjZS1mb3JtYXQnOlxuICAgIGNhc2UgJ2ZvbnQtZmFjZS1uYW1lJzpcbiAgICBjYXNlICdtaXNzaW5nLWdseXBoJzpcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vLyBXaGVuIGFkZGluZyBhdHRyaWJ1dGVzIHRvIHRoZSBIVE1MIG9yIFNWRyBhbGxvd2VkIGF0dHJpYnV0ZSBsaXN0LCBiZSBzdXJlIHRvXG4vLyBhbHNvIGFkZCB0aGVtIHRvIHRoaXMgbW9kdWxlIHRvIGVuc3VyZSBjYXNpbmcgYW5kIGluY29ycmVjdCBuYW1lXG4vLyB3YXJuaW5ncy5cbnZhciBwb3NzaWJsZVN0YW5kYXJkTmFtZXMgPSB7XG4gIC8vIEhUTUxcbiAgYWNjZXB0OiAnYWNjZXB0JyxcbiAgYWNjZXB0Y2hhcnNldDogJ2FjY2VwdENoYXJzZXQnLFxuICAnYWNjZXB0LWNoYXJzZXQnOiAnYWNjZXB0Q2hhcnNldCcsXG4gIGFjY2Vzc2tleTogJ2FjY2Vzc0tleScsXG4gIGFjdGlvbjogJ2FjdGlvbicsXG4gIGFsbG93ZnVsbHNjcmVlbjogJ2FsbG93RnVsbFNjcmVlbicsXG4gIGFsdDogJ2FsdCcsXG4gIGFzOiAnYXMnLFxuICBhc3luYzogJ2FzeW5jJyxcbiAgYXV0b2NhcGl0YWxpemU6ICdhdXRvQ2FwaXRhbGl6ZScsXG4gIGF1dG9jb21wbGV0ZTogJ2F1dG9Db21wbGV0ZScsXG4gIGF1dG9jb3JyZWN0OiAnYXV0b0NvcnJlY3QnLFxuICBhdXRvZm9jdXM6ICdhdXRvRm9jdXMnLFxuICBhdXRvcGxheTogJ2F1dG9QbGF5JyxcbiAgYXV0b3NhdmU6ICdhdXRvU2F2ZScsXG4gIGNhcHR1cmU6ICdjYXB0dXJlJyxcbiAgY2VsbHBhZGRpbmc6ICdjZWxsUGFkZGluZycsXG4gIGNlbGxzcGFjaW5nOiAnY2VsbFNwYWNpbmcnLFxuICBjaGFsbGVuZ2U6ICdjaGFsbGVuZ2UnLFxuICBjaGFyc2V0OiAnY2hhclNldCcsXG4gIGNoZWNrZWQ6ICdjaGVja2VkJyxcbiAgY2hpbGRyZW46ICdjaGlsZHJlbicsXG4gIGNpdGU6ICdjaXRlJyxcbiAgY2xhc3M6ICdjbGFzc05hbWUnLFxuICBjbGFzc2lkOiAnY2xhc3NJRCcsXG4gIGNsYXNzbmFtZTogJ2NsYXNzTmFtZScsXG4gIGNvbHM6ICdjb2xzJyxcbiAgY29sc3BhbjogJ2NvbFNwYW4nLFxuICBjb250ZW50OiAnY29udGVudCcsXG4gIGNvbnRlbnRlZGl0YWJsZTogJ2NvbnRlbnRFZGl0YWJsZScsXG4gIGNvbnRleHRtZW51OiAnY29udGV4dE1lbnUnLFxuICBjb250cm9sczogJ2NvbnRyb2xzJyxcbiAgY29udHJvbHNsaXN0OiAnY29udHJvbHNMaXN0JyxcbiAgY29vcmRzOiAnY29vcmRzJyxcbiAgY3Jvc3NvcmlnaW46ICdjcm9zc09yaWdpbicsXG4gIGRhbmdlcm91c2x5c2V0aW5uZXJodG1sOiAnZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwnLFxuICBkYXRhOiAnZGF0YScsXG4gIGRhdGV0aW1lOiAnZGF0ZVRpbWUnLFxuICBkZWZhdWx0OiAnZGVmYXVsdCcsXG4gIGRlZmF1bHRjaGVja2VkOiAnZGVmYXVsdENoZWNrZWQnLFxuICBkZWZhdWx0dmFsdWU6ICdkZWZhdWx0VmFsdWUnLFxuICBkZWZlcjogJ2RlZmVyJyxcbiAgZGlyOiAnZGlyJyxcbiAgZGlzYWJsZWQ6ICdkaXNhYmxlZCcsXG4gIGRpc2FibGVwaWN0dXJlaW5waWN0dXJlOiAnZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUnLFxuICBkaXNhYmxlcmVtb3RlcGxheWJhY2s6ICdkaXNhYmxlUmVtb3RlUGxheWJhY2snLFxuICBkb3dubG9hZDogJ2Rvd25sb2FkJyxcbiAgZHJhZ2dhYmxlOiAnZHJhZ2dhYmxlJyxcbiAgZW5jdHlwZTogJ2VuY1R5cGUnLFxuICBlbnRlcmtleWhpbnQ6ICdlbnRlcktleUhpbnQnLFxuICBmb3I6ICdodG1sRm9yJyxcbiAgZm9ybTogJ2Zvcm0nLFxuICBmb3JtbWV0aG9kOiAnZm9ybU1ldGhvZCcsXG4gIGZvcm1hY3Rpb246ICdmb3JtQWN0aW9uJyxcbiAgZm9ybWVuY3R5cGU6ICdmb3JtRW5jVHlwZScsXG4gIGZvcm1ub3ZhbGlkYXRlOiAnZm9ybU5vVmFsaWRhdGUnLFxuICBmb3JtdGFyZ2V0OiAnZm9ybVRhcmdldCcsXG4gIGZyYW1lYm9yZGVyOiAnZnJhbWVCb3JkZXInLFxuICBoZWFkZXJzOiAnaGVhZGVycycsXG4gIGhlaWdodDogJ2hlaWdodCcsXG4gIGhpZGRlbjogJ2hpZGRlbicsXG4gIGhpZ2g6ICdoaWdoJyxcbiAgaHJlZjogJ2hyZWYnLFxuICBocmVmbGFuZzogJ2hyZWZMYW5nJyxcbiAgaHRtbGZvcjogJ2h0bWxGb3InLFxuICBodHRwZXF1aXY6ICdodHRwRXF1aXYnLFxuICAnaHR0cC1lcXVpdic6ICdodHRwRXF1aXYnLFxuICBpY29uOiAnaWNvbicsXG4gIGlkOiAnaWQnLFxuICBpbWFnZXNpemVzOiAnaW1hZ2VTaXplcycsXG4gIGltYWdlc3Jjc2V0OiAnaW1hZ2VTcmNTZXQnLFxuICBpbm5lcmh0bWw6ICdpbm5lckhUTUwnLFxuICBpbnB1dG1vZGU6ICdpbnB1dE1vZGUnLFxuICBpbnRlZ3JpdHk6ICdpbnRlZ3JpdHknLFxuICBpczogJ2lzJyxcbiAgaXRlbWlkOiAnaXRlbUlEJyxcbiAgaXRlbXByb3A6ICdpdGVtUHJvcCcsXG4gIGl0ZW1yZWY6ICdpdGVtUmVmJyxcbiAgaXRlbXNjb3BlOiAnaXRlbVNjb3BlJyxcbiAgaXRlbXR5cGU6ICdpdGVtVHlwZScsXG4gIGtleXBhcmFtczogJ2tleVBhcmFtcycsXG4gIGtleXR5cGU6ICdrZXlUeXBlJyxcbiAga2luZDogJ2tpbmQnLFxuICBsYWJlbDogJ2xhYmVsJyxcbiAgbGFuZzogJ2xhbmcnLFxuICBsaXN0OiAnbGlzdCcsXG4gIGxvb3A6ICdsb29wJyxcbiAgbG93OiAnbG93JyxcbiAgbWFuaWZlc3Q6ICdtYW5pZmVzdCcsXG4gIG1hcmdpbndpZHRoOiAnbWFyZ2luV2lkdGgnLFxuICBtYXJnaW5oZWlnaHQ6ICdtYXJnaW5IZWlnaHQnLFxuICBtYXg6ICdtYXgnLFxuICBtYXhsZW5ndGg6ICdtYXhMZW5ndGgnLFxuICBtZWRpYTogJ21lZGlhJyxcbiAgbWVkaWFncm91cDogJ21lZGlhR3JvdXAnLFxuICBtZXRob2Q6ICdtZXRob2QnLFxuICBtaW46ICdtaW4nLFxuICBtaW5sZW5ndGg6ICdtaW5MZW5ndGgnLFxuICBtdWx0aXBsZTogJ211bHRpcGxlJyxcbiAgbXV0ZWQ6ICdtdXRlZCcsXG4gIG5hbWU6ICduYW1lJyxcbiAgbm9tb2R1bGU6ICdub01vZHVsZScsXG4gIG5vbmNlOiAnbm9uY2UnLFxuICBub3ZhbGlkYXRlOiAnbm9WYWxpZGF0ZScsXG4gIG9wZW46ICdvcGVuJyxcbiAgb3B0aW11bTogJ29wdGltdW0nLFxuICBwYXR0ZXJuOiAncGF0dGVybicsXG4gIHBsYWNlaG9sZGVyOiAncGxhY2Vob2xkZXInLFxuICBwbGF5c2lubGluZTogJ3BsYXlzSW5saW5lJyxcbiAgcG9zdGVyOiAncG9zdGVyJyxcbiAgcHJlbG9hZDogJ3ByZWxvYWQnLFxuICBwcm9maWxlOiAncHJvZmlsZScsXG4gIHJhZGlvZ3JvdXA6ICdyYWRpb0dyb3VwJyxcbiAgcmVhZG9ubHk6ICdyZWFkT25seScsXG4gIHJlZmVycmVycG9saWN5OiAncmVmZXJyZXJQb2xpY3knLFxuICByZWw6ICdyZWwnLFxuICByZXF1aXJlZDogJ3JlcXVpcmVkJyxcbiAgcmV2ZXJzZWQ6ICdyZXZlcnNlZCcsXG4gIHJvbGU6ICdyb2xlJyxcbiAgcm93czogJ3Jvd3MnLFxuICByb3dzcGFuOiAncm93U3BhbicsXG4gIHNhbmRib3g6ICdzYW5kYm94JyxcbiAgc2NvcGU6ICdzY29wZScsXG4gIHNjb3BlZDogJ3Njb3BlZCcsXG4gIHNjcm9sbGluZzogJ3Njcm9sbGluZycsXG4gIHNlYW1sZXNzOiAnc2VhbWxlc3MnLFxuICBzZWxlY3RlZDogJ3NlbGVjdGVkJyxcbiAgc2hhcGU6ICdzaGFwZScsXG4gIHNpemU6ICdzaXplJyxcbiAgc2l6ZXM6ICdzaXplcycsXG4gIHNwYW46ICdzcGFuJyxcbiAgc3BlbGxjaGVjazogJ3NwZWxsQ2hlY2snLFxuICBzcmM6ICdzcmMnLFxuICBzcmNkb2M6ICdzcmNEb2MnLFxuICBzcmNsYW5nOiAnc3JjTGFuZycsXG4gIHNyY3NldDogJ3NyY1NldCcsXG4gIHN0YXJ0OiAnc3RhcnQnLFxuICBzdGVwOiAnc3RlcCcsXG4gIHN0eWxlOiAnc3R5bGUnLFxuICBzdW1tYXJ5OiAnc3VtbWFyeScsXG4gIHRhYmluZGV4OiAndGFiSW5kZXgnLFxuICB0YXJnZXQ6ICd0YXJnZXQnLFxuICB0aXRsZTogJ3RpdGxlJyxcbiAgdHlwZTogJ3R5cGUnLFxuICB1c2VtYXA6ICd1c2VNYXAnLFxuICB2YWx1ZTogJ3ZhbHVlJyxcbiAgd2lkdGg6ICd3aWR0aCcsXG4gIHdtb2RlOiAnd21vZGUnLFxuICB3cmFwOiAnd3JhcCcsXG4gIC8vIFNWR1xuICBhYm91dDogJ2Fib3V0JyxcbiAgYWNjZW50aGVpZ2h0OiAnYWNjZW50SGVpZ2h0JyxcbiAgJ2FjY2VudC1oZWlnaHQnOiAnYWNjZW50SGVpZ2h0JyxcbiAgYWNjdW11bGF0ZTogJ2FjY3VtdWxhdGUnLFxuICBhZGRpdGl2ZTogJ2FkZGl0aXZlJyxcbiAgYWxpZ25tZW50YmFzZWxpbmU6ICdhbGlnbm1lbnRCYXNlbGluZScsXG4gICdhbGlnbm1lbnQtYmFzZWxpbmUnOiAnYWxpZ25tZW50QmFzZWxpbmUnLFxuICBhbGxvd3Jlb3JkZXI6ICdhbGxvd1Jlb3JkZXInLFxuICBhbHBoYWJldGljOiAnYWxwaGFiZXRpYycsXG4gIGFtcGxpdHVkZTogJ2FtcGxpdHVkZScsXG4gIGFyYWJpY2Zvcm06ICdhcmFiaWNGb3JtJyxcbiAgJ2FyYWJpYy1mb3JtJzogJ2FyYWJpY0Zvcm0nLFxuICBhc2NlbnQ6ICdhc2NlbnQnLFxuICBhdHRyaWJ1dGVuYW1lOiAnYXR0cmlidXRlTmFtZScsXG4gIGF0dHJpYnV0ZXR5cGU6ICdhdHRyaWJ1dGVUeXBlJyxcbiAgYXV0b3JldmVyc2U6ICdhdXRvUmV2ZXJzZScsXG4gIGF6aW11dGg6ICdhemltdXRoJyxcbiAgYmFzZWZyZXF1ZW5jeTogJ2Jhc2VGcmVxdWVuY3knLFxuICBiYXNlbGluZXNoaWZ0OiAnYmFzZWxpbmVTaGlmdCcsXG4gICdiYXNlbGluZS1zaGlmdCc6ICdiYXNlbGluZVNoaWZ0JyxcbiAgYmFzZXByb2ZpbGU6ICdiYXNlUHJvZmlsZScsXG4gIGJib3g6ICdiYm94JyxcbiAgYmVnaW46ICdiZWdpbicsXG4gIGJpYXM6ICdiaWFzJyxcbiAgYnk6ICdieScsXG4gIGNhbGNtb2RlOiAnY2FsY01vZGUnLFxuICBjYXBoZWlnaHQ6ICdjYXBIZWlnaHQnLFxuICAnY2FwLWhlaWdodCc6ICdjYXBIZWlnaHQnLFxuICBjbGlwOiAnY2xpcCcsXG4gIGNsaXBwYXRoOiAnY2xpcFBhdGgnLFxuICAnY2xpcC1wYXRoJzogJ2NsaXBQYXRoJyxcbiAgY2xpcHBhdGh1bml0czogJ2NsaXBQYXRoVW5pdHMnLFxuICBjbGlwcnVsZTogJ2NsaXBSdWxlJyxcbiAgJ2NsaXAtcnVsZSc6ICdjbGlwUnVsZScsXG4gIGNvbG9yOiAnY29sb3InLFxuICBjb2xvcmludGVycG9sYXRpb246ICdjb2xvckludGVycG9sYXRpb24nLFxuICAnY29sb3ItaW50ZXJwb2xhdGlvbic6ICdjb2xvckludGVycG9sYXRpb24nLFxuICBjb2xvcmludGVycG9sYXRpb25maWx0ZXJzOiAnY29sb3JJbnRlcnBvbGF0aW9uRmlsdGVycycsXG4gICdjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnMnOiAnY29sb3JJbnRlcnBvbGF0aW9uRmlsdGVycycsXG4gIGNvbG9ycHJvZmlsZTogJ2NvbG9yUHJvZmlsZScsXG4gICdjb2xvci1wcm9maWxlJzogJ2NvbG9yUHJvZmlsZScsXG4gIGNvbG9ycmVuZGVyaW5nOiAnY29sb3JSZW5kZXJpbmcnLFxuICAnY29sb3ItcmVuZGVyaW5nJzogJ2NvbG9yUmVuZGVyaW5nJyxcbiAgY29udGVudHNjcmlwdHR5cGU6ICdjb250ZW50U2NyaXB0VHlwZScsXG4gIGNvbnRlbnRzdHlsZXR5cGU6ICdjb250ZW50U3R5bGVUeXBlJyxcbiAgY3Vyc29yOiAnY3Vyc29yJyxcbiAgY3g6ICdjeCcsXG4gIGN5OiAnY3knLFxuICBkOiAnZCcsXG4gIGRhdGF0eXBlOiAnZGF0YXR5cGUnLFxuICBkZWNlbGVyYXRlOiAnZGVjZWxlcmF0ZScsXG4gIGRlc2NlbnQ6ICdkZXNjZW50JyxcbiAgZGlmZnVzZWNvbnN0YW50OiAnZGlmZnVzZUNvbnN0YW50JyxcbiAgZGlyZWN0aW9uOiAnZGlyZWN0aW9uJyxcbiAgZGlzcGxheTogJ2Rpc3BsYXknLFxuICBkaXZpc29yOiAnZGl2aXNvcicsXG4gIGRvbWluYW50YmFzZWxpbmU6ICdkb21pbmFudEJhc2VsaW5lJyxcbiAgJ2RvbWluYW50LWJhc2VsaW5lJzogJ2RvbWluYW50QmFzZWxpbmUnLFxuICBkdXI6ICdkdXInLFxuICBkeDogJ2R4JyxcbiAgZHk6ICdkeScsXG4gIGVkZ2Vtb2RlOiAnZWRnZU1vZGUnLFxuICBlbGV2YXRpb246ICdlbGV2YXRpb24nLFxuICBlbmFibGViYWNrZ3JvdW5kOiAnZW5hYmxlQmFja2dyb3VuZCcsXG4gICdlbmFibGUtYmFja2dyb3VuZCc6ICdlbmFibGVCYWNrZ3JvdW5kJyxcbiAgZW5kOiAnZW5kJyxcbiAgZXhwb25lbnQ6ICdleHBvbmVudCcsXG4gIGV4dGVybmFscmVzb3VyY2VzcmVxdWlyZWQ6ICdleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkJyxcbiAgZmlsbDogJ2ZpbGwnLFxuICBmaWxsb3BhY2l0eTogJ2ZpbGxPcGFjaXR5JyxcbiAgJ2ZpbGwtb3BhY2l0eSc6ICdmaWxsT3BhY2l0eScsXG4gIGZpbGxydWxlOiAnZmlsbFJ1bGUnLFxuICAnZmlsbC1ydWxlJzogJ2ZpbGxSdWxlJyxcbiAgZmlsdGVyOiAnZmlsdGVyJyxcbiAgZmlsdGVycmVzOiAnZmlsdGVyUmVzJyxcbiAgZmlsdGVydW5pdHM6ICdmaWx0ZXJVbml0cycsXG4gIGZsb29kb3BhY2l0eTogJ2Zsb29kT3BhY2l0eScsXG4gICdmbG9vZC1vcGFjaXR5JzogJ2Zsb29kT3BhY2l0eScsXG4gIGZsb29kY29sb3I6ICdmbG9vZENvbG9yJyxcbiAgJ2Zsb29kLWNvbG9yJzogJ2Zsb29kQ29sb3InLFxuICBmb2N1c2FibGU6ICdmb2N1c2FibGUnLFxuICBmb250ZmFtaWx5OiAnZm9udEZhbWlseScsXG4gICdmb250LWZhbWlseSc6ICdmb250RmFtaWx5JyxcbiAgZm9udHNpemU6ICdmb250U2l6ZScsXG4gICdmb250LXNpemUnOiAnZm9udFNpemUnLFxuICBmb250c2l6ZWFkanVzdDogJ2ZvbnRTaXplQWRqdXN0JyxcbiAgJ2ZvbnQtc2l6ZS1hZGp1c3QnOiAnZm9udFNpemVBZGp1c3QnLFxuICBmb250c3RyZXRjaDogJ2ZvbnRTdHJldGNoJyxcbiAgJ2ZvbnQtc3RyZXRjaCc6ICdmb250U3RyZXRjaCcsXG4gIGZvbnRzdHlsZTogJ2ZvbnRTdHlsZScsXG4gICdmb250LXN0eWxlJzogJ2ZvbnRTdHlsZScsXG4gIGZvbnR2YXJpYW50OiAnZm9udFZhcmlhbnQnLFxuICAnZm9udC12YXJpYW50JzogJ2ZvbnRWYXJpYW50JyxcbiAgZm9udHdlaWdodDogJ2ZvbnRXZWlnaHQnLFxuICAnZm9udC13ZWlnaHQnOiAnZm9udFdlaWdodCcsXG4gIGZvcm1hdDogJ2Zvcm1hdCcsXG4gIGZyb206ICdmcm9tJyxcbiAgZng6ICdmeCcsXG4gIGZ5OiAnZnknLFxuICBnMTogJ2cxJyxcbiAgZzI6ICdnMicsXG4gIGdseXBobmFtZTogJ2dseXBoTmFtZScsXG4gICdnbHlwaC1uYW1lJzogJ2dseXBoTmFtZScsXG4gIGdseXBob3JpZW50YXRpb25ob3Jpem9udGFsOiAnZ2x5cGhPcmllbnRhdGlvbkhvcml6b250YWwnLFxuICAnZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbCc6ICdnbHlwaE9yaWVudGF0aW9uSG9yaXpvbnRhbCcsXG4gIGdseXBob3JpZW50YXRpb252ZXJ0aWNhbDogJ2dseXBoT3JpZW50YXRpb25WZXJ0aWNhbCcsXG4gICdnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbCc6ICdnbHlwaE9yaWVudGF0aW9uVmVydGljYWwnLFxuICBnbHlwaHJlZjogJ2dseXBoUmVmJyxcbiAgZ3JhZGllbnR0cmFuc2Zvcm06ICdncmFkaWVudFRyYW5zZm9ybScsXG4gIGdyYWRpZW50dW5pdHM6ICdncmFkaWVudFVuaXRzJyxcbiAgaGFuZ2luZzogJ2hhbmdpbmcnLFxuICBob3JpemFkdng6ICdob3JpekFkdlgnLFxuICAnaG9yaXotYWR2LXgnOiAnaG9yaXpBZHZYJyxcbiAgaG9yaXpvcmlnaW54OiAnaG9yaXpPcmlnaW5YJyxcbiAgJ2hvcml6LW9yaWdpbi14JzogJ2hvcml6T3JpZ2luWCcsXG4gIGlkZW9ncmFwaGljOiAnaWRlb2dyYXBoaWMnLFxuICBpbWFnZXJlbmRlcmluZzogJ2ltYWdlUmVuZGVyaW5nJyxcbiAgJ2ltYWdlLXJlbmRlcmluZyc6ICdpbWFnZVJlbmRlcmluZycsXG4gIGluMjogJ2luMicsXG4gIGluOiAnaW4nLFxuICBpbmxpc3Q6ICdpbmxpc3QnLFxuICBpbnRlcmNlcHQ6ICdpbnRlcmNlcHQnLFxuICBrMTogJ2sxJyxcbiAgazI6ICdrMicsXG4gIGszOiAnazMnLFxuICBrNDogJ2s0JyxcbiAgazogJ2snLFxuICBrZXJuZWxtYXRyaXg6ICdrZXJuZWxNYXRyaXgnLFxuICBrZXJuZWx1bml0bGVuZ3RoOiAna2VybmVsVW5pdExlbmd0aCcsXG4gIGtlcm5pbmc6ICdrZXJuaW5nJyxcbiAga2V5cG9pbnRzOiAna2V5UG9pbnRzJyxcbiAga2V5c3BsaW5lczogJ2tleVNwbGluZXMnLFxuICBrZXl0aW1lczogJ2tleVRpbWVzJyxcbiAgbGVuZ3RoYWRqdXN0OiAnbGVuZ3RoQWRqdXN0JyxcbiAgbGV0dGVyc3BhY2luZzogJ2xldHRlclNwYWNpbmcnLFxuICAnbGV0dGVyLXNwYWNpbmcnOiAnbGV0dGVyU3BhY2luZycsXG4gIGxpZ2h0aW5nY29sb3I6ICdsaWdodGluZ0NvbG9yJyxcbiAgJ2xpZ2h0aW5nLWNvbG9yJzogJ2xpZ2h0aW5nQ29sb3InLFxuICBsaW1pdGluZ2NvbmVhbmdsZTogJ2xpbWl0aW5nQ29uZUFuZ2xlJyxcbiAgbG9jYWw6ICdsb2NhbCcsXG4gIG1hcmtlcmVuZDogJ21hcmtlckVuZCcsXG4gICdtYXJrZXItZW5kJzogJ21hcmtlckVuZCcsXG4gIG1hcmtlcmhlaWdodDogJ21hcmtlckhlaWdodCcsXG4gIG1hcmtlcm1pZDogJ21hcmtlck1pZCcsXG4gICdtYXJrZXItbWlkJzogJ21hcmtlck1pZCcsXG4gIG1hcmtlcnN0YXJ0OiAnbWFya2VyU3RhcnQnLFxuICAnbWFya2VyLXN0YXJ0JzogJ21hcmtlclN0YXJ0JyxcbiAgbWFya2VydW5pdHM6ICdtYXJrZXJVbml0cycsXG4gIG1hcmtlcndpZHRoOiAnbWFya2VyV2lkdGgnLFxuICBtYXNrOiAnbWFzaycsXG4gIG1hc2tjb250ZW50dW5pdHM6ICdtYXNrQ29udGVudFVuaXRzJyxcbiAgbWFza3VuaXRzOiAnbWFza1VuaXRzJyxcbiAgbWF0aGVtYXRpY2FsOiAnbWF0aGVtYXRpY2FsJyxcbiAgbW9kZTogJ21vZGUnLFxuICBudW1vY3RhdmVzOiAnbnVtT2N0YXZlcycsXG4gIG9mZnNldDogJ29mZnNldCcsXG4gIG9wYWNpdHk6ICdvcGFjaXR5JyxcbiAgb3BlcmF0b3I6ICdvcGVyYXRvcicsXG4gIG9yZGVyOiAnb3JkZXInLFxuICBvcmllbnQ6ICdvcmllbnQnLFxuICBvcmllbnRhdGlvbjogJ29yaWVudGF0aW9uJyxcbiAgb3JpZ2luOiAnb3JpZ2luJyxcbiAgb3ZlcmZsb3c6ICdvdmVyZmxvdycsXG4gIG92ZXJsaW5lcG9zaXRpb246ICdvdmVybGluZVBvc2l0aW9uJyxcbiAgJ292ZXJsaW5lLXBvc2l0aW9uJzogJ292ZXJsaW5lUG9zaXRpb24nLFxuICBvdmVybGluZXRoaWNrbmVzczogJ292ZXJsaW5lVGhpY2tuZXNzJyxcbiAgJ292ZXJsaW5lLXRoaWNrbmVzcyc6ICdvdmVybGluZVRoaWNrbmVzcycsXG4gIHBhaW50b3JkZXI6ICdwYWludE9yZGVyJyxcbiAgJ3BhaW50LW9yZGVyJzogJ3BhaW50T3JkZXInLFxuICBwYW5vc2UxOiAncGFub3NlMScsXG4gICdwYW5vc2UtMSc6ICdwYW5vc2UxJyxcbiAgcGF0aGxlbmd0aDogJ3BhdGhMZW5ndGgnLFxuICBwYXR0ZXJuY29udGVudHVuaXRzOiAncGF0dGVybkNvbnRlbnRVbml0cycsXG4gIHBhdHRlcm50cmFuc2Zvcm06ICdwYXR0ZXJuVHJhbnNmb3JtJyxcbiAgcGF0dGVybnVuaXRzOiAncGF0dGVyblVuaXRzJyxcbiAgcG9pbnRlcmV2ZW50czogJ3BvaW50ZXJFdmVudHMnLFxuICAncG9pbnRlci1ldmVudHMnOiAncG9pbnRlckV2ZW50cycsXG4gIHBvaW50czogJ3BvaW50cycsXG4gIHBvaW50c2F0eDogJ3BvaW50c0F0WCcsXG4gIHBvaW50c2F0eTogJ3BvaW50c0F0WScsXG4gIHBvaW50c2F0ejogJ3BvaW50c0F0WicsXG4gIHByZWZpeDogJ3ByZWZpeCcsXG4gIHByZXNlcnZlYWxwaGE6ICdwcmVzZXJ2ZUFscGhhJyxcbiAgcHJlc2VydmVhc3BlY3RyYXRpbzogJ3ByZXNlcnZlQXNwZWN0UmF0aW8nLFxuICBwcmltaXRpdmV1bml0czogJ3ByaW1pdGl2ZVVuaXRzJyxcbiAgcHJvcGVydHk6ICdwcm9wZXJ0eScsXG4gIHI6ICdyJyxcbiAgcmFkaXVzOiAncmFkaXVzJyxcbiAgcmVmeDogJ3JlZlgnLFxuICByZWZ5OiAncmVmWScsXG4gIHJlbmRlcmluZ2ludGVudDogJ3JlbmRlcmluZ0ludGVudCcsXG4gICdyZW5kZXJpbmctaW50ZW50JzogJ3JlbmRlcmluZ0ludGVudCcsXG4gIHJlcGVhdGNvdW50OiAncmVwZWF0Q291bnQnLFxuICByZXBlYXRkdXI6ICdyZXBlYXREdXInLFxuICByZXF1aXJlZGV4dGVuc2lvbnM6ICdyZXF1aXJlZEV4dGVuc2lvbnMnLFxuICByZXF1aXJlZGZlYXR1cmVzOiAncmVxdWlyZWRGZWF0dXJlcycsXG4gIHJlc291cmNlOiAncmVzb3VyY2UnLFxuICByZXN0YXJ0OiAncmVzdGFydCcsXG4gIHJlc3VsdDogJ3Jlc3VsdCcsXG4gIHJlc3VsdHM6ICdyZXN1bHRzJyxcbiAgcm90YXRlOiAncm90YXRlJyxcbiAgcng6ICdyeCcsXG4gIHJ5OiAncnknLFxuICBzY2FsZTogJ3NjYWxlJyxcbiAgc2VjdXJpdHk6ICdzZWN1cml0eScsXG4gIHNlZWQ6ICdzZWVkJyxcbiAgc2hhcGVyZW5kZXJpbmc6ICdzaGFwZVJlbmRlcmluZycsXG4gICdzaGFwZS1yZW5kZXJpbmcnOiAnc2hhcGVSZW5kZXJpbmcnLFxuICBzbG9wZTogJ3Nsb3BlJyxcbiAgc3BhY2luZzogJ3NwYWNpbmcnLFxuICBzcGVjdWxhcmNvbnN0YW50OiAnc3BlY3VsYXJDb25zdGFudCcsXG4gIHNwZWN1bGFyZXhwb25lbnQ6ICdzcGVjdWxhckV4cG9uZW50JyxcbiAgc3BlZWQ6ICdzcGVlZCcsXG4gIHNwcmVhZG1ldGhvZDogJ3NwcmVhZE1ldGhvZCcsXG4gIHN0YXJ0b2Zmc2V0OiAnc3RhcnRPZmZzZXQnLFxuICBzdGRkZXZpYXRpb246ICdzdGREZXZpYXRpb24nLFxuICBzdGVtaDogJ3N0ZW1oJyxcbiAgc3RlbXY6ICdzdGVtdicsXG4gIHN0aXRjaHRpbGVzOiAnc3RpdGNoVGlsZXMnLFxuICBzdG9wY29sb3I6ICdzdG9wQ29sb3InLFxuICAnc3RvcC1jb2xvcic6ICdzdG9wQ29sb3InLFxuICBzdG9wb3BhY2l0eTogJ3N0b3BPcGFjaXR5JyxcbiAgJ3N0b3Atb3BhY2l0eSc6ICdzdG9wT3BhY2l0eScsXG4gIHN0cmlrZXRocm91Z2hwb3NpdGlvbjogJ3N0cmlrZXRocm91Z2hQb3NpdGlvbicsXG4gICdzdHJpa2V0aHJvdWdoLXBvc2l0aW9uJzogJ3N0cmlrZXRocm91Z2hQb3NpdGlvbicsXG4gIHN0cmlrZXRocm91Z2h0aGlja25lc3M6ICdzdHJpa2V0aHJvdWdoVGhpY2tuZXNzJyxcbiAgJ3N0cmlrZXRocm91Z2gtdGhpY2tuZXNzJzogJ3N0cmlrZXRocm91Z2hUaGlja25lc3MnLFxuICBzdHJpbmc6ICdzdHJpbmcnLFxuICBzdHJva2U6ICdzdHJva2UnLFxuICBzdHJva2VkYXNoYXJyYXk6ICdzdHJva2VEYXNoYXJyYXknLFxuICAnc3Ryb2tlLWRhc2hhcnJheSc6ICdzdHJva2VEYXNoYXJyYXknLFxuICBzdHJva2VkYXNob2Zmc2V0OiAnc3Ryb2tlRGFzaG9mZnNldCcsXG4gICdzdHJva2UtZGFzaG9mZnNldCc6ICdzdHJva2VEYXNob2Zmc2V0JyxcbiAgc3Ryb2tlbGluZWNhcDogJ3N0cm9rZUxpbmVjYXAnLFxuICAnc3Ryb2tlLWxpbmVjYXAnOiAnc3Ryb2tlTGluZWNhcCcsXG4gIHN0cm9rZWxpbmVqb2luOiAnc3Ryb2tlTGluZWpvaW4nLFxuICAnc3Ryb2tlLWxpbmVqb2luJzogJ3N0cm9rZUxpbmVqb2luJyxcbiAgc3Ryb2tlbWl0ZXJsaW1pdDogJ3N0cm9rZU1pdGVybGltaXQnLFxuICAnc3Ryb2tlLW1pdGVybGltaXQnOiAnc3Ryb2tlTWl0ZXJsaW1pdCcsXG4gIHN0cm9rZXdpZHRoOiAnc3Ryb2tlV2lkdGgnLFxuICAnc3Ryb2tlLXdpZHRoJzogJ3N0cm9rZVdpZHRoJyxcbiAgc3Ryb2tlb3BhY2l0eTogJ3N0cm9rZU9wYWNpdHknLFxuICAnc3Ryb2tlLW9wYWNpdHknOiAnc3Ryb2tlT3BhY2l0eScsXG4gIHN1cHByZXNzY29udGVudGVkaXRhYmxld2FybmluZzogJ3N1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZycsXG4gIHN1cHByZXNzaHlkcmF0aW9ud2FybmluZzogJ3N1cHByZXNzSHlkcmF0aW9uV2FybmluZycsXG4gIHN1cmZhY2VzY2FsZTogJ3N1cmZhY2VTY2FsZScsXG4gIHN5c3RlbWxhbmd1YWdlOiAnc3lzdGVtTGFuZ3VhZ2UnLFxuICB0YWJsZXZhbHVlczogJ3RhYmxlVmFsdWVzJyxcbiAgdGFyZ2V0eDogJ3RhcmdldFgnLFxuICB0YXJnZXR5OiAndGFyZ2V0WScsXG4gIHRleHRhbmNob3I6ICd0ZXh0QW5jaG9yJyxcbiAgJ3RleHQtYW5jaG9yJzogJ3RleHRBbmNob3InLFxuICB0ZXh0ZGVjb3JhdGlvbjogJ3RleHREZWNvcmF0aW9uJyxcbiAgJ3RleHQtZGVjb3JhdGlvbic6ICd0ZXh0RGVjb3JhdGlvbicsXG4gIHRleHRsZW5ndGg6ICd0ZXh0TGVuZ3RoJyxcbiAgdGV4dHJlbmRlcmluZzogJ3RleHRSZW5kZXJpbmcnLFxuICAndGV4dC1yZW5kZXJpbmcnOiAndGV4dFJlbmRlcmluZycsXG4gIHRvOiAndG8nLFxuICB0cmFuc2Zvcm06ICd0cmFuc2Zvcm0nLFxuICB0eXBlb2Y6ICd0eXBlb2YnLFxuICB1MTogJ3UxJyxcbiAgdTI6ICd1MicsXG4gIHVuZGVybGluZXBvc2l0aW9uOiAndW5kZXJsaW5lUG9zaXRpb24nLFxuICAndW5kZXJsaW5lLXBvc2l0aW9uJzogJ3VuZGVybGluZVBvc2l0aW9uJyxcbiAgdW5kZXJsaW5ldGhpY2tuZXNzOiAndW5kZXJsaW5lVGhpY2tuZXNzJyxcbiAgJ3VuZGVybGluZS10aGlja25lc3MnOiAndW5kZXJsaW5lVGhpY2tuZXNzJyxcbiAgdW5pY29kZTogJ3VuaWNvZGUnLFxuICB1bmljb2RlYmlkaTogJ3VuaWNvZGVCaWRpJyxcbiAgJ3VuaWNvZGUtYmlkaSc6ICd1bmljb2RlQmlkaScsXG4gIHVuaWNvZGVyYW5nZTogJ3VuaWNvZGVSYW5nZScsXG4gICd1bmljb2RlLXJhbmdlJzogJ3VuaWNvZGVSYW5nZScsXG4gIHVuaXRzcGVyZW06ICd1bml0c1BlckVtJyxcbiAgJ3VuaXRzLXBlci1lbSc6ICd1bml0c1BlckVtJyxcbiAgdW5zZWxlY3RhYmxlOiAndW5zZWxlY3RhYmxlJyxcbiAgdmFscGhhYmV0aWM6ICd2QWxwaGFiZXRpYycsXG4gICd2LWFscGhhYmV0aWMnOiAndkFscGhhYmV0aWMnLFxuICB2YWx1ZXM6ICd2YWx1ZXMnLFxuICB2ZWN0b3JlZmZlY3Q6ICd2ZWN0b3JFZmZlY3QnLFxuICAndmVjdG9yLWVmZmVjdCc6ICd2ZWN0b3JFZmZlY3QnLFxuICB2ZXJzaW9uOiAndmVyc2lvbicsXG4gIHZlcnRhZHZ5OiAndmVydEFkdlknLFxuICAndmVydC1hZHYteSc6ICd2ZXJ0QWR2WScsXG4gIHZlcnRvcmlnaW54OiAndmVydE9yaWdpblgnLFxuICAndmVydC1vcmlnaW4teCc6ICd2ZXJ0T3JpZ2luWCcsXG4gIHZlcnRvcmlnaW55OiAndmVydE9yaWdpblknLFxuICAndmVydC1vcmlnaW4teSc6ICd2ZXJ0T3JpZ2luWScsXG4gIHZoYW5naW5nOiAndkhhbmdpbmcnLFxuICAndi1oYW5naW5nJzogJ3ZIYW5naW5nJyxcbiAgdmlkZW9ncmFwaGljOiAndklkZW9ncmFwaGljJyxcbiAgJ3YtaWRlb2dyYXBoaWMnOiAndklkZW9ncmFwaGljJyxcbiAgdmlld2JveDogJ3ZpZXdCb3gnLFxuICB2aWV3dGFyZ2V0OiAndmlld1RhcmdldCcsXG4gIHZpc2liaWxpdHk6ICd2aXNpYmlsaXR5JyxcbiAgdm1hdGhlbWF0aWNhbDogJ3ZNYXRoZW1hdGljYWwnLFxuICAndi1tYXRoZW1hdGljYWwnOiAndk1hdGhlbWF0aWNhbCcsXG4gIHZvY2FiOiAndm9jYWInLFxuICB3aWR0aHM6ICd3aWR0aHMnLFxuICB3b3Jkc3BhY2luZzogJ3dvcmRTcGFjaW5nJyxcbiAgJ3dvcmQtc3BhY2luZyc6ICd3b3JkU3BhY2luZycsXG4gIHdyaXRpbmdtb2RlOiAnd3JpdGluZ01vZGUnLFxuICAnd3JpdGluZy1tb2RlJzogJ3dyaXRpbmdNb2RlJyxcbiAgeDE6ICd4MScsXG4gIHgyOiAneDInLFxuICB4OiAneCcsXG4gIHhjaGFubmVsc2VsZWN0b3I6ICd4Q2hhbm5lbFNlbGVjdG9yJyxcbiAgeGhlaWdodDogJ3hIZWlnaHQnLFxuICAneC1oZWlnaHQnOiAneEhlaWdodCcsXG4gIHhsaW5rYWN0dWF0ZTogJ3hsaW5rQWN0dWF0ZScsXG4gICd4bGluazphY3R1YXRlJzogJ3hsaW5rQWN0dWF0ZScsXG4gIHhsaW5rYXJjcm9sZTogJ3hsaW5rQXJjcm9sZScsXG4gICd4bGluazphcmNyb2xlJzogJ3hsaW5rQXJjcm9sZScsXG4gIHhsaW5raHJlZjogJ3hsaW5rSHJlZicsXG4gICd4bGluazpocmVmJzogJ3hsaW5rSHJlZicsXG4gIHhsaW5rcm9sZTogJ3hsaW5rUm9sZScsXG4gICd4bGluazpyb2xlJzogJ3hsaW5rUm9sZScsXG4gIHhsaW5rc2hvdzogJ3hsaW5rU2hvdycsXG4gICd4bGluazpzaG93JzogJ3hsaW5rU2hvdycsXG4gIHhsaW5rdGl0bGU6ICd4bGlua1RpdGxlJyxcbiAgJ3hsaW5rOnRpdGxlJzogJ3hsaW5rVGl0bGUnLFxuICB4bGlua3R5cGU6ICd4bGlua1R5cGUnLFxuICAneGxpbms6dHlwZSc6ICd4bGlua1R5cGUnLFxuICB4bWxiYXNlOiAneG1sQmFzZScsXG4gICd4bWw6YmFzZSc6ICd4bWxCYXNlJyxcbiAgeG1sbGFuZzogJ3htbExhbmcnLFxuICAneG1sOmxhbmcnOiAneG1sTGFuZycsXG4gIHhtbG5zOiAneG1sbnMnLFxuICAneG1sOnNwYWNlJzogJ3htbFNwYWNlJyxcbiAgeG1sbnN4bGluazogJ3htbG5zWGxpbmsnLFxuICAneG1sbnM6eGxpbmsnOiAneG1sbnNYbGluaycsXG4gIHhtbHNwYWNlOiAneG1sU3BhY2UnLFxuICB5MTogJ3kxJyxcbiAgeTI6ICd5MicsXG4gIHk6ICd5JyxcbiAgeWNoYW5uZWxzZWxlY3RvcjogJ3lDaGFubmVsU2VsZWN0b3InLFxuICB6OiAneicsXG4gIHpvb21hbmRwYW46ICd6b29tQW5kUGFuJ1xufTtcblxudmFyIGFyaWFQcm9wZXJ0aWVzID0ge1xuICAnYXJpYS1jdXJyZW50JzogMCxcbiAgLy8gc3RhdGVcbiAgJ2FyaWEtZGVzY3JpcHRpb24nOiAwLFxuICAnYXJpYS1kZXRhaWxzJzogMCxcbiAgJ2FyaWEtZGlzYWJsZWQnOiAwLFxuICAvLyBzdGF0ZVxuICAnYXJpYS1oaWRkZW4nOiAwLFxuICAvLyBzdGF0ZVxuICAnYXJpYS1pbnZhbGlkJzogMCxcbiAgLy8gc3RhdGVcbiAgJ2FyaWEta2V5c2hvcnRjdXRzJzogMCxcbiAgJ2FyaWEtbGFiZWwnOiAwLFxuICAnYXJpYS1yb2xlZGVzY3JpcHRpb24nOiAwLFxuICAvLyBXaWRnZXQgQXR0cmlidXRlc1xuICAnYXJpYS1hdXRvY29tcGxldGUnOiAwLFxuICAnYXJpYS1jaGVja2VkJzogMCxcbiAgJ2FyaWEtZXhwYW5kZWQnOiAwLFxuICAnYXJpYS1oYXNwb3B1cCc6IDAsXG4gICdhcmlhLWxldmVsJzogMCxcbiAgJ2FyaWEtbW9kYWwnOiAwLFxuICAnYXJpYS1tdWx0aWxpbmUnOiAwLFxuICAnYXJpYS1tdWx0aXNlbGVjdGFibGUnOiAwLFxuICAnYXJpYS1vcmllbnRhdGlvbic6IDAsXG4gICdhcmlhLXBsYWNlaG9sZGVyJzogMCxcbiAgJ2FyaWEtcHJlc3NlZCc6IDAsXG4gICdhcmlhLXJlYWRvbmx5JzogMCxcbiAgJ2FyaWEtcmVxdWlyZWQnOiAwLFxuICAnYXJpYS1zZWxlY3RlZCc6IDAsXG4gICdhcmlhLXNvcnQnOiAwLFxuICAnYXJpYS12YWx1ZW1heCc6IDAsXG4gICdhcmlhLXZhbHVlbWluJzogMCxcbiAgJ2FyaWEtdmFsdWVub3cnOiAwLFxuICAnYXJpYS12YWx1ZXRleHQnOiAwLFxuICAvLyBMaXZlIFJlZ2lvbiBBdHRyaWJ1dGVzXG4gICdhcmlhLWF0b21pYyc6IDAsXG4gICdhcmlhLWJ1c3knOiAwLFxuICAnYXJpYS1saXZlJzogMCxcbiAgJ2FyaWEtcmVsZXZhbnQnOiAwLFxuICAvLyBEcmFnLWFuZC1Ecm9wIEF0dHJpYnV0ZXNcbiAgJ2FyaWEtZHJvcGVmZmVjdCc6IDAsXG4gICdhcmlhLWdyYWJiZWQnOiAwLFxuICAvLyBSZWxhdGlvbnNoaXAgQXR0cmlidXRlc1xuICAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JzogMCxcbiAgJ2FyaWEtY29sY291bnQnOiAwLFxuICAnYXJpYS1jb2xpbmRleCc6IDAsXG4gICdhcmlhLWNvbHNwYW4nOiAwLFxuICAnYXJpYS1jb250cm9scyc6IDAsXG4gICdhcmlhLWRlc2NyaWJlZGJ5JzogMCxcbiAgJ2FyaWEtZXJyb3JtZXNzYWdlJzogMCxcbiAgJ2FyaWEtZmxvd3RvJzogMCxcbiAgJ2FyaWEtbGFiZWxsZWRieSc6IDAsXG4gICdhcmlhLW93bnMnOiAwLFxuICAnYXJpYS1wb3NpbnNldCc6IDAsXG4gICdhcmlhLXJvd2NvdW50JzogMCxcbiAgJ2FyaWEtcm93aW5kZXgnOiAwLFxuICAnYXJpYS1yb3dzcGFuJzogMCxcbiAgJ2FyaWEtc2V0c2l6ZSc6IDBcbn07XG5cbnZhciB3YXJuZWRQcm9wZXJ0aWVzID0ge307XG52YXIgckFSSUEgPSBuZXcgUmVnRXhwKCdeKGFyaWEpLVsnICsgQVRUUklCVVRFX05BTUVfQ0hBUiArICddKiQnKTtcbnZhciByQVJJQUNhbWVsID0gbmV3IFJlZ0V4cCgnXihhcmlhKVtBLVpdWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnR5KHRhZ05hbWUsIG5hbWUpIHtcbiAge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHdhcm5lZFByb3BlcnRpZXMsIG5hbWUpICYmIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChyQVJJQUNhbWVsLnRlc3QobmFtZSkpIHtcbiAgICAgIHZhciBhcmlhTmFtZSA9ICdhcmlhLScgKyBuYW1lLnNsaWNlKDQpLnRvTG93ZXJDYXNlKCk7XG4gICAgICB2YXIgY29ycmVjdE5hbWUgPSBhcmlhUHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShhcmlhTmFtZSkgPyBhcmlhTmFtZSA6IG51bGw7IC8vIElmIHRoaXMgaXMgYW4gYXJpYS0qIGF0dHJpYnV0ZSwgYnV0IGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGtub3duIERPTVxuICAgICAgLy8gRE9NIHByb3BlcnRpZXMsIHRoZW4gaXQgaXMgYW4gaW52YWxpZCBhcmlhLSogYXR0cmlidXRlLlxuXG4gICAgICBpZiAoY29ycmVjdE5hbWUgPT0gbnVsbCkge1xuICAgICAgICBlcnJvcignSW52YWxpZCBBUklBIGF0dHJpYnV0ZSBgJXNgLiBBUklBIGF0dHJpYnV0ZXMgZm9sbG93IHRoZSBwYXR0ZXJuIGFyaWEtKiBhbmQgbXVzdCBiZSBsb3dlcmNhc2UuJywgbmFtZSk7XG5cbiAgICAgICAgd2FybmVkUHJvcGVydGllc1tuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSAvLyBhcmlhLSogYXR0cmlidXRlcyBzaG91bGQgYmUgbG93ZXJjYXNlOyBzdWdnZXN0IHRoZSBsb3dlcmNhc2UgdmVyc2lvbi5cblxuXG4gICAgICBpZiAobmFtZSAhPT0gY29ycmVjdE5hbWUpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgQVJJQSBhdHRyaWJ1dGUgYCVzYC4gRGlkIHlvdSBtZWFuIGAlc2A/JywgbmFtZSwgY29ycmVjdE5hbWUpO1xuXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAockFSSUEudGVzdChuYW1lKSkge1xuICAgICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgdmFyIHN0YW5kYXJkTmFtZSA9IGFyaWFQcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KGxvd2VyQ2FzZWROYW1lKSA/IGxvd2VyQ2FzZWROYW1lIDogbnVsbDsgLy8gSWYgdGhpcyBpcyBhbiBhcmlhLSogYXR0cmlidXRlLCBidXQgaXMgbm90IGxpc3RlZCBpbiB0aGUga25vd24gRE9NXG4gICAgICAvLyBET00gcHJvcGVydGllcywgdGhlbiBpdCBpcyBhbiBpbnZhbGlkIGFyaWEtKiBhdHRyaWJ1dGUuXG5cbiAgICAgIGlmIChzdGFuZGFyZE5hbWUgPT0gbnVsbCkge1xuICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSAvLyBhcmlhLSogYXR0cmlidXRlcyBzaG91bGQgYmUgbG93ZXJjYXNlOyBzdWdnZXN0IHRoZSBsb3dlcmNhc2UgdmVyc2lvbi5cblxuXG4gICAgICBpZiAobmFtZSAhPT0gc3RhbmRhcmROYW1lKSB7XG4gICAgICAgIGVycm9yKCdVbmtub3duIEFSSUEgYXR0cmlidXRlIGAlc2AuIERpZCB5b3UgbWVhbiBgJXNgPycsIG5hbWUsIHN0YW5kYXJkTmFtZSk7XG5cbiAgICAgICAgd2FybmVkUHJvcGVydGllc1tuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiB3YXJuSW52YWxpZEFSSUFQcm9wcyh0eXBlLCBwcm9wcykge1xuICB7XG4gICAgdmFyIGludmFsaWRQcm9wcyA9IFtdO1xuXG4gICAgZm9yICh2YXIga2V5IGluIHByb3BzKSB7XG4gICAgICB2YXIgaXNWYWxpZCA9IHZhbGlkYXRlUHJvcGVydHkodHlwZSwga2V5KTtcblxuICAgICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgIGludmFsaWRQcm9wcy5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHVua25vd25Qcm9wU3RyaW5nID0gaW52YWxpZFByb3BzLm1hcChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgcmV0dXJuICdgJyArIHByb3AgKyAnYCc7XG4gICAgfSkuam9pbignLCAnKTtcblxuICAgIGlmIChpbnZhbGlkUHJvcHMubGVuZ3RoID09PSAxKSB7XG4gICAgICBlcnJvcignSW52YWxpZCBhcmlhIHByb3AgJXMgb24gPCVzPiB0YWcuICcgKyAnRm9yIGRldGFpbHMsIHNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvaW52YWxpZC1hcmlhLXByb3BzJywgdW5rbm93blByb3BTdHJpbmcsIHR5cGUpO1xuICAgIH0gZWxzZSBpZiAoaW52YWxpZFByb3BzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGVycm9yKCdJbnZhbGlkIGFyaWEgcHJvcHMgJXMgb24gPCVzPiB0YWcuICcgKyAnRm9yIGRldGFpbHMsIHNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvaW52YWxpZC1hcmlhLXByb3BzJywgdW5rbm93blByb3BTdHJpbmcsIHR5cGUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnRpZXModHlwZSwgcHJvcHMpIHtcbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50KHR5cGUsIHByb3BzKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHdhcm5JbnZhbGlkQVJJQVByb3BzKHR5cGUsIHByb3BzKTtcbn1cblxudmFyIGRpZFdhcm5WYWx1ZU51bGwgPSBmYWxzZTtcbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydGllcyQxKHR5cGUsIHByb3BzKSB7XG4gIHtcbiAgICBpZiAodHlwZSAhPT0gJ2lucHV0JyAmJiB0eXBlICE9PSAndGV4dGFyZWEnICYmIHR5cGUgIT09ICdzZWxlY3QnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHByb3BzICE9IG51bGwgJiYgcHJvcHMudmFsdWUgPT09IG51bGwgJiYgIWRpZFdhcm5WYWx1ZU51bGwpIHtcbiAgICAgIGRpZFdhcm5WYWx1ZU51bGwgPSB0cnVlO1xuXG4gICAgICBpZiAodHlwZSA9PT0gJ3NlbGVjdCcgJiYgcHJvcHMubXVsdGlwbGUpIHtcbiAgICAgICAgZXJyb3IoJ2B2YWx1ZWAgcHJvcCBvbiBgJXNgIHNob3VsZCBub3QgYmUgbnVsbC4gJyArICdDb25zaWRlciB1c2luZyBhbiBlbXB0eSBhcnJheSB3aGVuIGBtdWx0aXBsZWAgaXMgc2V0IHRvIGB0cnVlYCAnICsgJ3RvIGNsZWFyIHRoZSBjb21wb25lbnQgb3IgYHVuZGVmaW5lZGAgZm9yIHVuY29udHJvbGxlZCBjb21wb25lbnRzLicsIHR5cGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IoJ2B2YWx1ZWAgcHJvcCBvbiBgJXNgIHNob3VsZCBub3QgYmUgbnVsbC4gJyArICdDb25zaWRlciB1c2luZyBhbiBlbXB0eSBzdHJpbmcgdG8gY2xlYXIgdGhlIGNvbXBvbmVudCBvciBgdW5kZWZpbmVkYCAnICsgJ2ZvciB1bmNvbnRyb2xsZWQgY29tcG9uZW50cy4nLCB0eXBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIHZhbGlkYXRlUHJvcGVydHkkMSA9IGZ1bmN0aW9uICgpIHt9O1xuXG57XG4gIHZhciB3YXJuZWRQcm9wZXJ0aWVzJDEgPSB7fTtcbiAgdmFyIEVWRU5UX05BTUVfUkVHRVggPSAvXm9uLi87XG4gIHZhciBJTlZBTElEX0VWRU5UX05BTUVfUkVHRVggPSAvXm9uW15BLVpdLztcbiAgdmFyIHJBUklBJDEgPSBuZXcgUmVnRXhwKCdeKGFyaWEpLVsnICsgQVRUUklCVVRFX05BTUVfQ0hBUiArICddKiQnKTtcbiAgdmFyIHJBUklBQ2FtZWwkMSA9IG5ldyBSZWdFeHAoJ14oYXJpYSlbQS1aXVsnICsgQVRUUklCVVRFX05BTUVfQ0hBUiArICddKiQnKTtcblxuICB2YWxpZGF0ZVByb3BlcnR5JDEgPSBmdW5jdGlvbiAodGFnTmFtZSwgbmFtZSwgdmFsdWUsIGV2ZW50UmVnaXN0cnkpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh3YXJuZWRQcm9wZXJ0aWVzJDEsIG5hbWUpICYmIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKGxvd2VyQ2FzZWROYW1lID09PSAnb25mb2N1c2luJyB8fCBsb3dlckNhc2VkTmFtZSA9PT0gJ29uZm9jdXNvdXQnKSB7XG4gICAgICBlcnJvcignUmVhY3QgdXNlcyBvbkZvY3VzIGFuZCBvbkJsdXIgaW5zdGVhZCBvZiBvbkZvY3VzSW4gYW5kIG9uRm9jdXNPdXQuICcgKyAnQWxsIFJlYWN0IGV2ZW50cyBhcmUgbm9ybWFsaXplZCB0byBidWJibGUsIHNvIG9uRm9jdXNJbiBhbmQgb25Gb2N1c091dCAnICsgJ2FyZSBub3QgbmVlZGVkL3N1cHBvcnRlZCBieSBSZWFjdC4nKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gLy8gV2UgY2FuJ3QgcmVseSBvbiB0aGUgZXZlbnQgc3lzdGVtIGJlaW5nIGluamVjdGVkIG9uIHRoZSBzZXJ2ZXIuXG5cblxuICAgIGlmIChldmVudFJlZ2lzdHJ5ICE9IG51bGwpIHtcbiAgICAgIHZhciByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzID0gZXZlbnRSZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLFxuICAgICAgICAgIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMgPSBldmVudFJlZ2lzdHJ5LnBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXM7XG5cbiAgICAgIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVnaXN0cmF0aW9uTmFtZSA9IHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMuaGFzT3duUHJvcGVydHkobG93ZXJDYXNlZE5hbWUpID8gcG9zc2libGVSZWdpc3RyYXRpb25OYW1lc1tsb3dlckNhc2VkTmFtZV0gOiBudWxsO1xuXG4gICAgICBpZiAocmVnaXN0cmF0aW9uTmFtZSAhPSBudWxsKSB7XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIGV2ZW50IGhhbmRsZXIgcHJvcGVydHkgYCVzYC4gRGlkIHlvdSBtZWFuIGAlc2A/JywgbmFtZSwgcmVnaXN0cmF0aW9uTmFtZSk7XG5cbiAgICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChFVkVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgICAgZXJyb3IoJ1Vua25vd24gZXZlbnQgaGFuZGxlciBwcm9wZXJ0eSBgJXNgLiBJdCB3aWxsIGJlIGlnbm9yZWQuJywgbmFtZSk7XG5cbiAgICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChFVkVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgIC8vIElmIG5vIGV2ZW50IHBsdWdpbnMgaGF2ZSBiZWVuIGluamVjdGVkLCB3ZSBhcmUgaW4gYSBzZXJ2ZXIgZW52aXJvbm1lbnQuXG4gICAgICAvLyBTbyB3ZSBjYW4ndCB0ZWxsIGlmIHRoZSBldmVudCBuYW1lIGlzIGNvcnJlY3QgZm9yIHN1cmUsIGJ1dCB3ZSBjYW4gZmlsdGVyXG4gICAgICAvLyBvdXQga25vd24gYmFkIG9uZXMgbGlrZSBgb25jbGlja2AuIFdlIGNhbid0IHN1Z2dlc3QgYSBzcGVjaWZpYyByZXBsYWNlbWVudCB0aG91Z2guXG4gICAgICBpZiAoSU5WQUxJRF9FVkVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgZXZlbnQgaGFuZGxlciBwcm9wZXJ0eSBgJXNgLiAnICsgJ1JlYWN0IGV2ZW50cyB1c2UgdGhlIGNhbWVsQ2FzZSBuYW1pbmcgY29udmVudGlvbiwgZm9yIGV4YW1wbGUgYG9uQ2xpY2tgLicsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSAvLyBMZXQgdGhlIEFSSUEgYXR0cmlidXRlIGhvb2sgdmFsaWRhdGUgQVJJQSBhdHRyaWJ1dGVzXG5cblxuICAgIGlmIChyQVJJQSQxLnRlc3QobmFtZSkgfHwgckFSSUFDYW1lbCQxLnRlc3QobmFtZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChsb3dlckNhc2VkTmFtZSA9PT0gJ2lubmVyaHRtbCcpIHtcbiAgICAgIGVycm9yKCdEaXJlY3RseSBzZXR0aW5nIHByb3BlcnR5IGBpbm5lckhUTUxgIGlzIG5vdCBwZXJtaXR0ZWQuICcgKyAnRm9yIG1vcmUgaW5mb3JtYXRpb24sIGxvb2t1cCBkb2N1bWVudGF0aW9uIG9uIGBkYW5nZXJvdXNseVNldElubmVySFRNTGAuJyk7XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAobG93ZXJDYXNlZE5hbWUgPT09ICdhcmlhJykge1xuICAgICAgZXJyb3IoJ1RoZSBgYXJpYWAgYXR0cmlidXRlIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlIGluIFJlYWN0LiAnICsgJ1Bhc3MgaW5kaXZpZHVhbCBgYXJpYS1gIGF0dHJpYnV0ZXMgaW5zdGVhZC4nKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChsb3dlckNhc2VkTmFtZSA9PT0gJ2lzJyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCBhIGAlc2AgZm9yIGEgc3RyaW5nIGF0dHJpYnV0ZSBgaXNgLiBJZiB0aGlzIGlzIGV4cGVjdGVkLCBjYXN0ICcgKyAndGhlIHZhbHVlIHRvIGEgc3RyaW5nLicsIHR5cGVvZiB2YWx1ZSk7XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpc05hTih2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCBOYU4gZm9yIHRoZSBgJXNgIGF0dHJpYnV0ZS4gSWYgdGhpcyBpcyBleHBlY3RlZCwgY2FzdCAnICsgJ3RoZSB2YWx1ZSB0byBhIHN0cmluZy4nLCBuYW1lKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciBwcm9wZXJ0eUluZm8gPSBnZXRQcm9wZXJ0eUluZm8obmFtZSk7XG4gICAgdmFyIGlzUmVzZXJ2ZWQgPSBwcm9wZXJ0eUluZm8gIT09IG51bGwgJiYgcHJvcGVydHlJbmZvLnR5cGUgPT09IFJFU0VSVkVEOyAvLyBLbm93biBhdHRyaWJ1dGVzIHNob3VsZCBtYXRjaCB0aGUgY2FzaW5nIHNwZWNpZmllZCBpbiB0aGUgcHJvcGVydHkgY29uZmlnLlxuXG4gICAgaWYgKHBvc3NpYmxlU3RhbmRhcmROYW1lcy5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkpIHtcbiAgICAgIHZhciBzdGFuZGFyZE5hbWUgPSBwb3NzaWJsZVN0YW5kYXJkTmFtZXNbbG93ZXJDYXNlZE5hbWVdO1xuXG4gICAgICBpZiAoc3RhbmRhcmROYW1lICE9PSBuYW1lKSB7XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIERPTSBwcm9wZXJ0eSBgJXNgLiBEaWQgeW91IG1lYW4gYCVzYD8nLCBuYW1lLCBzdGFuZGFyZE5hbWUpO1xuXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWlzUmVzZXJ2ZWQgJiYgbmFtZSAhPT0gbG93ZXJDYXNlZE5hbWUpIHtcbiAgICAgIC8vIFVua25vd24gYXR0cmlidXRlcyBzaG91bGQgaGF2ZSBsb3dlcmNhc2UgY2FzaW5nIHNpbmNlIHRoYXQncyBob3cgdGhleVxuICAgICAgLy8gd2lsbCBiZSBjYXNlZCBhbnl3YXkgd2l0aCBzZXJ2ZXIgcmVuZGVyaW5nLlxuICAgICAgZXJyb3IoJ1JlYWN0IGRvZXMgbm90IHJlY29nbml6ZSB0aGUgYCVzYCBwcm9wIG9uIGEgRE9NIGVsZW1lbnQuIElmIHlvdSAnICsgJ2ludGVudGlvbmFsbHkgd2FudCBpdCB0byBhcHBlYXIgaW4gdGhlIERPTSBhcyBhIGN1c3RvbSAnICsgJ2F0dHJpYnV0ZSwgc3BlbGwgaXQgYXMgbG93ZXJjYXNlIGAlc2AgaW5zdGVhZC4gJyArICdJZiB5b3UgYWNjaWRlbnRhbGx5IHBhc3NlZCBpdCBmcm9tIGEgcGFyZW50IGNvbXBvbmVudCwgcmVtb3ZlICcgKyAnaXQgZnJvbSB0aGUgRE9NIGVsZW1lbnQuJywgbmFtZSwgbG93ZXJDYXNlZE5hbWUpO1xuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nICYmIHNob3VsZFJlbW92ZUF0dHJpYnV0ZVdpdGhXYXJuaW5nKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGZhbHNlKSkge1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGVycm9yKCdSZWNlaXZlZCBgJXNgIGZvciBhIG5vbi1ib29sZWFuIGF0dHJpYnV0ZSBgJXNgLlxcblxcbicgKyAnSWYgeW91IHdhbnQgdG8gd3JpdGUgaXQgdG8gdGhlIERPTSwgcGFzcyBhIHN0cmluZyBpbnN0ZWFkOiAnICsgJyVzPVwiJXNcIiBvciAlcz17dmFsdWUudG9TdHJpbmcoKX0uJywgdmFsdWUsIG5hbWUsIG5hbWUsIHZhbHVlLCBuYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCdSZWNlaXZlZCBgJXNgIGZvciBhIG5vbi1ib29sZWFuIGF0dHJpYnV0ZSBgJXNgLlxcblxcbicgKyAnSWYgeW91IHdhbnQgdG8gd3JpdGUgaXQgdG8gdGhlIERPTSwgcGFzcyBhIHN0cmluZyBpbnN0ZWFkOiAnICsgJyVzPVwiJXNcIiBvciAlcz17dmFsdWUudG9TdHJpbmcoKX0uXFxuXFxuJyArICdJZiB5b3UgdXNlZCB0byBjb25kaXRpb25hbGx5IG9taXQgaXQgd2l0aCAlcz17Y29uZGl0aW9uICYmIHZhbHVlfSwgJyArICdwYXNzICVzPXtjb25kaXRpb24gPyB2YWx1ZSA6IHVuZGVmaW5lZH0gaW5zdGVhZC4nLCB2YWx1ZSwgbmFtZSwgbmFtZSwgdmFsdWUsIG5hbWUsIG5hbWUsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSAvLyBOb3cgdGhhdCB3ZSd2ZSB2YWxpZGF0ZWQgY2FzaW5nLCBkbyBub3QgdmFsaWRhdGVcbiAgICAvLyBkYXRhIHR5cGVzIGZvciByZXNlcnZlZCBwcm9wc1xuXG5cbiAgICBpZiAoaXNSZXNlcnZlZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSAvLyBXYXJuIHdoZW4gYSBrbm93biBhdHRyaWJ1dGUgaXMgYSBiYWQgdHlwZVxuXG5cbiAgICBpZiAoc2hvdWxkUmVtb3ZlQXR0cmlidXRlV2l0aFdhcm5pbmcobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgZmFsc2UpKSB7XG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gV2FybiB3aGVuIHBhc3NpbmcgdGhlIHN0cmluZ3MgJ2ZhbHNlJyBvciAndHJ1ZScgaW50byBhIGJvb2xlYW4gcHJvcFxuXG5cbiAgICBpZiAoKHZhbHVlID09PSAnZmFsc2UnIHx8IHZhbHVlID09PSAndHJ1ZScpICYmIHByb3BlcnR5SW5mbyAhPT0gbnVsbCAmJiBwcm9wZXJ0eUluZm8udHlwZSA9PT0gQk9PTEVBTikge1xuICAgICAgZXJyb3IoJ1JlY2VpdmVkIHRoZSBzdHJpbmcgYCVzYCBmb3IgdGhlIGJvb2xlYW4gYXR0cmlidXRlIGAlc2AuICcgKyAnJXMgJyArICdEaWQgeW91IG1lYW4gJXM9eyVzfT8nLCB2YWx1ZSwgbmFtZSwgdmFsdWUgPT09ICdmYWxzZScgPyAnVGhlIGJyb3dzZXIgd2lsbCBpbnRlcnByZXQgaXQgYXMgYSB0cnV0aHkgdmFsdWUuJyA6ICdBbHRob3VnaCB0aGlzIHdvcmtzLCBpdCB3aWxsIG5vdCB3b3JrIGFzIGV4cGVjdGVkIGlmIHlvdSBwYXNzIHRoZSBzdHJpbmcgXCJmYWxzZVwiLicsIG5hbWUsIHZhbHVlKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xufVxuXG52YXIgd2FyblVua25vd25Qcm9wZXJ0aWVzID0gZnVuY3Rpb24gKHR5cGUsIHByb3BzLCBldmVudFJlZ2lzdHJ5KSB7XG4gIHtcbiAgICB2YXIgdW5rbm93blByb3BzID0gW107XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gcHJvcHMpIHtcbiAgICAgIHZhciBpc1ZhbGlkID0gdmFsaWRhdGVQcm9wZXJ0eSQxKHR5cGUsIGtleSwgcHJvcHNba2V5XSwgZXZlbnRSZWdpc3RyeSk7XG5cbiAgICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgICB1bmtub3duUHJvcHMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciB1bmtub3duUHJvcFN0cmluZyA9IHVua25vd25Qcm9wcy5tYXAoZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgIHJldHVybiAnYCcgKyBwcm9wICsgJ2AnO1xuICAgIH0pLmpvaW4oJywgJyk7XG5cbiAgICBpZiAodW5rbm93blByb3BzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgZXJyb3IoJ0ludmFsaWQgdmFsdWUgZm9yIHByb3AgJXMgb24gPCVzPiB0YWcuIEVpdGhlciByZW1vdmUgaXQgZnJvbSB0aGUgZWxlbWVudCwgJyArICdvciBwYXNzIGEgc3RyaW5nIG9yIG51bWJlciB2YWx1ZSB0byBrZWVwIGl0IGluIHRoZSBET00uICcgKyAnRm9yIGRldGFpbHMsIHNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvYXR0cmlidXRlLWJlaGF2aW9yICcsIHVua25vd25Qcm9wU3RyaW5nLCB0eXBlKTtcbiAgICB9IGVsc2UgaWYgKHVua25vd25Qcm9wcy5sZW5ndGggPiAxKSB7XG4gICAgICBlcnJvcignSW52YWxpZCB2YWx1ZXMgZm9yIHByb3BzICVzIG9uIDwlcz4gdGFnLiBFaXRoZXIgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgZWxlbWVudCwgJyArICdvciBwYXNzIGEgc3RyaW5nIG9yIG51bWJlciB2YWx1ZSB0byBrZWVwIHRoZW0gaW4gdGhlIERPTS4gJyArICdGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9hdHRyaWJ1dGUtYmVoYXZpb3IgJywgdW5rbm93blByb3BTdHJpbmcsIHR5cGUpO1xuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0aWVzJDIodHlwZSwgcHJvcHMsIGV2ZW50UmVnaXN0cnkpIHtcbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50KHR5cGUsIHByb3BzKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHdhcm5Vbmtub3duUHJvcGVydGllcyh0eXBlLCBwcm9wcywgZXZlbnRSZWdpc3RyeSk7XG59XG5cbnZhciBJU19FVkVOVF9IQU5ETEVfTk9OX01BTkFHRURfTk9ERSA9IDE7XG52YXIgSVNfTk9OX0RFTEVHQVRFRCA9IDEgPDwgMTtcbnZhciBJU19DQVBUVVJFX1BIQVNFID0gMSA8PCAyO1xuLy8gc2V0IHRvIExFR0FDWV9GQl9TVVBQT1JULiBMRUdBQ1lfRkJfU1VQUE9SVCBvbmx5IGdldHMgc2V0IHdoZW5cbi8vIHdlIGNhbGwgd2lsbERlZmVyTGF0ZXJGb3JMZWdhY3lGQlN1cHBvcnQsIHRodXMgbm90IGJhaWxpbmcgb3V0XG4vLyB3aWxsIHJlc3VsdCBpbiBlbmRsZXNzIGN5Y2xlcyBsaWtlIGFuIGluZmluaXRlIGxvb3AuXG4vLyBXZSBhbHNvIGRvbid0IHdhbnQgdG8gZGVmZXIgZHVyaW5nIGV2ZW50IHJlcGxheWluZy5cblxudmFyIFNIT1VMRF9OT1RfUFJPQ0VTU19QT0xZRklMTF9FVkVOVF9QTFVHSU5TID0gSVNfRVZFTlRfSEFORExFX05PTl9NQU5BR0VEX05PREUgfCBJU19OT05fREVMRUdBVEVEIHwgSVNfQ0FQVFVSRV9QSEFTRTtcblxuLy8gVGhpcyBleGlzdHMgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jeSBiZXR3ZWVuIFJlYWN0RE9NRXZlbnRSZXBsYXlpbmdcbi8vIGFuZCBET01QbHVnaW5FdmVudFN5c3RlbS5cbnZhciBjdXJyZW50UmVwbGF5aW5nRXZlbnQgPSBudWxsO1xuZnVuY3Rpb24gc2V0UmVwbGF5aW5nRXZlbnQoZXZlbnQpIHtcbiAge1xuICAgIGlmIChjdXJyZW50UmVwbGF5aW5nRXZlbnQgIT09IG51bGwpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCBjdXJyZW50bHkgcmVwbGF5aW5nIGV2ZW50IHRvIGJlIG51bGwuIFRoaXMgZXJyb3IgJyArICdpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cblxuICBjdXJyZW50UmVwbGF5aW5nRXZlbnQgPSBldmVudDtcbn1cbmZ1bmN0aW9uIHJlc2V0UmVwbGF5aW5nRXZlbnQoKSB7XG4gIHtcbiAgICBpZiAoY3VycmVudFJlcGxheWluZ0V2ZW50ID09PSBudWxsKSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgY3VycmVudGx5IHJlcGxheWluZyBldmVudCB0byBub3QgYmUgbnVsbC4gVGhpcyBlcnJvciAnICsgJ2lzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxuXG4gIGN1cnJlbnRSZXBsYXlpbmdFdmVudCA9IG51bGw7XG59XG5mdW5jdGlvbiBpc1JlcGxheWluZ0V2ZW50KGV2ZW50KSB7XG4gIHJldHVybiBldmVudCA9PT0gY3VycmVudFJlcGxheWluZ0V2ZW50O1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHRhcmdldCBub2RlIGZyb20gYSBuYXRpdmUgYnJvd3NlciBldmVudCBieSBhY2NvdW50aW5nIGZvclxuICogaW5jb25zaXN0ZW5jaWVzIGluIGJyb3dzZXIgRE9NIEFQSXMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQHJldHVybiB7RE9NRXZlbnRUYXJnZXR9IFRhcmdldCBub2RlLlxuICovXG5cbmZ1bmN0aW9uIGdldEV2ZW50VGFyZ2V0KG5hdGl2ZUV2ZW50KSB7XG4gIC8vIEZhbGxiYWNrIHRvIG5hdGl2ZUV2ZW50LnNyY0VsZW1lbnQgZm9yIElFOVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEyNTA2XG4gIHZhciB0YXJnZXQgPSBuYXRpdmVFdmVudC50YXJnZXQgfHwgbmF0aXZlRXZlbnQuc3JjRWxlbWVudCB8fCB3aW5kb3c7IC8vIE5vcm1hbGl6ZSBTVkcgPHVzZT4gZWxlbWVudCBldmVudHMgIzQ5NjNcblxuICBpZiAodGFyZ2V0LmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50KSB7XG4gICAgdGFyZ2V0ID0gdGFyZ2V0LmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50O1xuICB9IC8vIFNhZmFyaSBtYXkgZmlyZSBldmVudHMgb24gdGV4dCBub2RlcyAoTm9kZS5URVhUX05PREUgaXMgMykuXG4gIC8vIEBzZWUgaHR0cDovL3d3dy5xdWlya3Ntb2RlLm9yZy9qcy9ldmVudHNfcHJvcGVydGllcy5odG1sXG5cblxuICByZXR1cm4gdGFyZ2V0Lm5vZGVUeXBlID09PSBURVhUX05PREUgPyB0YXJnZXQucGFyZW50Tm9kZSA6IHRhcmdldDtcbn1cblxudmFyIHJlc3RvcmVJbXBsID0gbnVsbDtcbnZhciByZXN0b3JlVGFyZ2V0ID0gbnVsbDtcbnZhciByZXN0b3JlUXVldWUgPSBudWxsO1xuXG5mdW5jdGlvbiByZXN0b3JlU3RhdGVPZlRhcmdldCh0YXJnZXQpIHtcbiAgLy8gV2UgcGVyZm9ybSB0aGlzIHRyYW5zbGF0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGV2ZW50IGxvb3Agc28gdGhhdCB3ZVxuICAvLyBhbHdheXMgcmVjZWl2ZSB0aGUgY29ycmVjdCBmaWJlciBoZXJlXG4gIHZhciBpbnRlcm5hbEluc3RhbmNlID0gZ2V0SW5zdGFuY2VGcm9tTm9kZSh0YXJnZXQpO1xuXG4gIGlmICghaW50ZXJuYWxJbnN0YW5jZSkge1xuICAgIC8vIFVubW91bnRlZFxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh0eXBlb2YgcmVzdG9yZUltcGwgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFJlc3RvcmVJbXBsZW1lbnRhdGlvbigpIG5lZWRzIHRvIGJlIGNhbGxlZCB0byBoYW5kbGUgYSB0YXJnZXQgZm9yIGNvbnRyb2xsZWQgJyArICdldmVudHMuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cblxuICB2YXIgc3RhdGVOb2RlID0gaW50ZXJuYWxJbnN0YW5jZS5zdGF0ZU5vZGU7IC8vIEd1YXJkIGFnYWluc3QgRmliZXIgYmVpbmcgdW5tb3VudGVkLlxuXG4gIGlmIChzdGF0ZU5vZGUpIHtcbiAgICB2YXIgX3Byb3BzID0gZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZShzdGF0ZU5vZGUpO1xuXG4gICAgcmVzdG9yZUltcGwoaW50ZXJuYWxJbnN0YW5jZS5zdGF0ZU5vZGUsIGludGVybmFsSW5zdGFuY2UudHlwZSwgX3Byb3BzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRSZXN0b3JlSW1wbGVtZW50YXRpb24oaW1wbCkge1xuICByZXN0b3JlSW1wbCA9IGltcGw7XG59XG5mdW5jdGlvbiBlbnF1ZXVlU3RhdGVSZXN0b3JlKHRhcmdldCkge1xuICBpZiAocmVzdG9yZVRhcmdldCkge1xuICAgIGlmIChyZXN0b3JlUXVldWUpIHtcbiAgICAgIHJlc3RvcmVRdWV1ZS5wdXNoKHRhcmdldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3RvcmVRdWV1ZSA9IFt0YXJnZXRdO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXN0b3JlVGFyZ2V0ID0gdGFyZ2V0O1xuICB9XG59XG5mdW5jdGlvbiBuZWVkc1N0YXRlUmVzdG9yZSgpIHtcbiAgcmV0dXJuIHJlc3RvcmVUYXJnZXQgIT09IG51bGwgfHwgcmVzdG9yZVF1ZXVlICE9PSBudWxsO1xufVxuZnVuY3Rpb24gcmVzdG9yZVN0YXRlSWZOZWVkZWQoKSB7XG4gIGlmICghcmVzdG9yZVRhcmdldCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciB0YXJnZXQgPSByZXN0b3JlVGFyZ2V0O1xuICB2YXIgcXVldWVkVGFyZ2V0cyA9IHJlc3RvcmVRdWV1ZTtcbiAgcmVzdG9yZVRhcmdldCA9IG51bGw7XG4gIHJlc3RvcmVRdWV1ZSA9IG51bGw7XG4gIHJlc3RvcmVTdGF0ZU9mVGFyZ2V0KHRhcmdldCk7XG5cbiAgaWYgKHF1ZXVlZFRhcmdldHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlZFRhcmdldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3RvcmVTdGF0ZU9mVGFyZ2V0KHF1ZXVlZFRhcmdldHNbaV0pO1xuICAgIH1cbiAgfVxufVxuXG4vLyB0aGUgcmVuZGVyZXIuIFN1Y2ggYXMgd2hlbiB3ZSdyZSBkaXNwYXRjaGluZyBldmVudHMgb3IgaWYgdGhpcmQgcGFydHlcbi8vIGxpYnJhcmllcyBuZWVkIHRvIGNhbGwgYmF0Y2hlZFVwZGF0ZXMuIEV2ZW50dWFsbHksIHRoaXMgQVBJIHdpbGwgZ28gYXdheSB3aGVuXG4vLyBldmVyeXRoaW5nIGlzIGJhdGNoZWQgYnkgZGVmYXVsdC4gV2UnbGwgdGhlbiBoYXZlIGEgc2ltaWxhciBBUEkgdG8gb3B0LW91dCBvZlxuLy8gc2NoZWR1bGVkIHdvcmsgYW5kIGluc3RlYWQgZG8gc3luY2hyb25vdXMgd29yay5cbi8vIERlZmF1bHRzXG5cbnZhciBiYXRjaGVkVXBkYXRlc0ltcGwgPSBmdW5jdGlvbiAoZm4sIGJvb2trZWVwaW5nKSB7XG4gIHJldHVybiBmbihib29ra2VlcGluZyk7XG59O1xuXG52YXIgZmx1c2hTeW5jSW1wbCA9IGZ1bmN0aW9uICgpIHt9O1xuXG52YXIgaXNJbnNpZGVFdmVudEhhbmRsZXIgPSBmYWxzZTtcblxuZnVuY3Rpb24gZmluaXNoRXZlbnRIYW5kbGVyKCkge1xuICAvLyBIZXJlIHdlIHdhaXQgdW50aWwgYWxsIHVwZGF0ZXMgaGF2ZSBwcm9wYWdhdGVkLCB3aGljaCBpcyBpbXBvcnRhbnRcbiAgLy8gd2hlbiB1c2luZyBjb250cm9sbGVkIGNvbXBvbmVudHMgd2l0aGluIGxheWVyczpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNjk4XG4gIC8vIFRoZW4gd2UgcmVzdG9yZSBzdGF0ZSBvZiBhbnkgY29udHJvbGxlZCBjb21wb25lbnQuXG4gIHZhciBjb250cm9sbGVkQ29tcG9uZW50c0hhdmVQZW5kaW5nVXBkYXRlcyA9IG5lZWRzU3RhdGVSZXN0b3JlKCk7XG5cbiAgaWYgKGNvbnRyb2xsZWRDb21wb25lbnRzSGF2ZVBlbmRpbmdVcGRhdGVzKSB7XG4gICAgLy8gSWYgYSBjb250cm9sbGVkIGV2ZW50IHdhcyBmaXJlZCwgd2UgbWF5IG5lZWQgdG8gcmVzdG9yZSB0aGUgc3RhdGUgb2ZcbiAgICAvLyB0aGUgRE9NIG5vZGUgYmFjayB0byB0aGUgY29udHJvbGxlZCB2YWx1ZS4gVGhpcyBpcyBuZWNlc3Nhcnkgd2hlbiBSZWFjdFxuICAgIC8vIGJhaWxzIG91dCBvZiB0aGUgdXBkYXRlIHdpdGhvdXQgdG91Y2hpbmcgdGhlIERPTS5cbiAgICAvLyBUT0RPOiBSZXN0b3JlIHN0YXRlIGluIHRoZSBtaWNyb3Rhc2ssIGFmdGVyIHRoZSBkaXNjcmV0ZSB1cGRhdGVzIGZsdXNoLFxuICAgIC8vIGluc3RlYWQgb2YgZWFybHkgZmx1c2hpbmcgdGhlbSBoZXJlLlxuICAgIGZsdXNoU3luY0ltcGwoKTtcbiAgICByZXN0b3JlU3RhdGVJZk5lZWRlZCgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJhdGNoZWRVcGRhdGVzKGZuLCBhLCBiKSB7XG4gIGlmIChpc0luc2lkZUV2ZW50SGFuZGxlcikge1xuICAgIC8vIElmIHdlIGFyZSBjdXJyZW50bHkgaW5zaWRlIGFub3RoZXIgYmF0Y2gsIHdlIG5lZWQgdG8gd2FpdCB1bnRpbCBpdFxuICAgIC8vIGZ1bGx5IGNvbXBsZXRlcyBiZWZvcmUgcmVzdG9yaW5nIHN0YXRlLlxuICAgIHJldHVybiBmbihhLCBiKTtcbiAgfVxuXG4gIGlzSW5zaWRlRXZlbnRIYW5kbGVyID0gdHJ1ZTtcblxuICB0cnkge1xuICAgIHJldHVybiBiYXRjaGVkVXBkYXRlc0ltcGwoZm4sIGEsIGIpO1xuICB9IGZpbmFsbHkge1xuICAgIGlzSW5zaWRlRXZlbnRIYW5kbGVyID0gZmFsc2U7XG4gICAgZmluaXNoRXZlbnRIYW5kbGVyKCk7XG4gIH1cbn0gLy8gVE9ETzogUmVwbGFjZSB3aXRoIGZsdXNoU3luY1xuZnVuY3Rpb24gc2V0QmF0Y2hpbmdJbXBsZW1lbnRhdGlvbihfYmF0Y2hlZFVwZGF0ZXNJbXBsLCBfZGlzY3JldGVVcGRhdGVzSW1wbCwgX2ZsdXNoU3luY0ltcGwpIHtcbiAgYmF0Y2hlZFVwZGF0ZXNJbXBsID0gX2JhdGNoZWRVcGRhdGVzSW1wbDtcbiAgZmx1c2hTeW5jSW1wbCA9IF9mbHVzaFN5bmNJbXBsO1xufVxuXG5mdW5jdGlvbiBpc0ludGVyYWN0aXZlKHRhZykge1xuICByZXR1cm4gdGFnID09PSAnYnV0dG9uJyB8fCB0YWcgPT09ICdpbnB1dCcgfHwgdGFnID09PSAnc2VsZWN0JyB8fCB0YWcgPT09ICd0ZXh0YXJlYSc7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFByZXZlbnRNb3VzZUV2ZW50KG5hbWUsIHR5cGUsIHByb3BzKSB7XG4gIHN3aXRjaCAobmFtZSkge1xuICAgIGNhc2UgJ29uQ2xpY2snOlxuICAgIGNhc2UgJ29uQ2xpY2tDYXB0dXJlJzpcbiAgICBjYXNlICdvbkRvdWJsZUNsaWNrJzpcbiAgICBjYXNlICdvbkRvdWJsZUNsaWNrQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Nb3VzZURvd24nOlxuICAgIGNhc2UgJ29uTW91c2VEb3duQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Nb3VzZU1vdmUnOlxuICAgIGNhc2UgJ29uTW91c2VNb3ZlQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Nb3VzZVVwJzpcbiAgICBjYXNlICdvbk1vdXNlVXBDYXB0dXJlJzpcbiAgICBjYXNlICdvbk1vdXNlRW50ZXInOlxuICAgICAgcmV0dXJuICEhKHByb3BzLmRpc2FibGVkICYmIGlzSW50ZXJhY3RpdmUodHlwZSkpO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gaW5zdCBUaGUgaW5zdGFuY2UsIHdoaWNoIGlzIHRoZSBzb3VyY2Ugb2YgZXZlbnRzLlxuICogQHBhcmFtIHtzdHJpbmd9IHJlZ2lzdHJhdGlvbk5hbWUgTmFtZSBvZiBsaXN0ZW5lciAoZS5nLiBgb25DbGlja2ApLlxuICogQHJldHVybiB7P2Z1bmN0aW9ufSBUaGUgc3RvcmVkIGNhbGxiYWNrLlxuICovXG5cblxuZnVuY3Rpb24gZ2V0TGlzdGVuZXIoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSkge1xuICB2YXIgc3RhdGVOb2RlID0gaW5zdC5zdGF0ZU5vZGU7XG5cbiAgaWYgKHN0YXRlTm9kZSA9PT0gbnVsbCkge1xuICAgIC8vIFdvcmsgaW4gcHJvZ3Jlc3MgKGV4OiBvbmxvYWQgZXZlbnRzIGluIGluY3JlbWVudGFsIG1vZGUpLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIHByb3BzID0gZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZShzdGF0ZU5vZGUpO1xuXG4gIGlmIChwcm9wcyA9PT0gbnVsbCkge1xuICAgIC8vIFdvcmsgaW4gcHJvZ3Jlc3MuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgbGlzdGVuZXIgPSBwcm9wc1tyZWdpc3RyYXRpb25OYW1lXTtcblxuICBpZiAoc2hvdWxkUHJldmVudE1vdXNlRXZlbnQocmVnaXN0cmF0aW9uTmFtZSwgaW5zdC50eXBlLCBwcm9wcykpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChsaXN0ZW5lciAmJiB0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBgXCIgKyByZWdpc3RyYXRpb25OYW1lICsgXCJgIGxpc3RlbmVyIHRvIGJlIGEgZnVuY3Rpb24sIGluc3RlYWQgZ290IGEgdmFsdWUgb2YgYFwiICsgdHlwZW9mIGxpc3RlbmVyICsgXCJgIHR5cGUuXCIpO1xuICB9XG5cbiAgcmV0dXJuIGxpc3RlbmVyO1xufVxuXG52YXIgcGFzc2l2ZUJyb3dzZXJFdmVudHNTdXBwb3J0ZWQgPSBmYWxzZTsgLy8gQ2hlY2sgaWYgYnJvd3NlciBzdXBwb3J0IGV2ZW50cyB3aXRoIHBhc3NpdmUgbGlzdGVuZXJzXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRXZlbnRUYXJnZXQvYWRkRXZlbnRMaXN0ZW5lciNTYWZlbHlfZGV0ZWN0aW5nX29wdGlvbl9zdXBwb3J0XG5cbmlmIChjYW5Vc2VET00pIHtcbiAgdHJ5IHtcbiAgICB2YXIgb3B0aW9ucyA9IHt9OyAvLyAkRmxvd0ZpeE1lOiBJZ25vcmUgRmxvdyBjb21wbGFpbmluZyBhYm91dCBuZWVkaW5nIGEgdmFsdWVcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvcHRpb25zLCAncGFzc2l2ZScsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICBwYXNzaXZlQnJvd3NlckV2ZW50c1N1cHBvcnRlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBvcHRpb25zLCBvcHRpb25zKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndGVzdCcsIG9wdGlvbnMsIG9wdGlvbnMpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcGFzc2l2ZUJyb3dzZXJFdmVudHNTdXBwb3J0ZWQgPSBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tQcm9kKG5hbWUsIGZ1bmMsIGNvbnRleHQsIGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgdmFyIGZ1bmNBcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAzKTtcblxuICB0cnkge1xuICAgIGZ1bmMuYXBwbHkoY29udGV4dCwgZnVuY0FyZ3MpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRoaXMub25FcnJvcihlcnJvcik7XG4gIH1cbn1cblxudmFyIGludm9rZUd1YXJkZWRDYWxsYmFja0ltcGwgPSBpbnZva2VHdWFyZGVkQ2FsbGJhY2tQcm9kO1xuXG57XG4gIC8vIEluIERFViBtb2RlLCB3ZSBzd2FwIG91dCBpbnZva2VHdWFyZGVkQ2FsbGJhY2sgZm9yIGEgc3BlY2lhbCB2ZXJzaW9uXG4gIC8vIHRoYXQgcGxheXMgbW9yZSBuaWNlbHkgd2l0aCB0aGUgYnJvd3NlcidzIERldlRvb2xzLiBUaGUgaWRlYSBpcyB0byBwcmVzZXJ2ZVxuICAvLyBcIlBhdXNlIG9uIGV4Y2VwdGlvbnNcIiBiZWhhdmlvci4gQmVjYXVzZSBSZWFjdCB3cmFwcyBhbGwgdXNlci1wcm92aWRlZFxuICAvLyBmdW5jdGlvbnMgaW4gaW52b2tlR3VhcmRlZENhbGxiYWNrLCBhbmQgdGhlIHByb2R1Y3Rpb24gdmVyc2lvbiBvZlxuICAvLyBpbnZva2VHdWFyZGVkQ2FsbGJhY2sgdXNlcyBhIHRyeS1jYXRjaCwgYWxsIHVzZXIgZXhjZXB0aW9ucyBhcmUgdHJlYXRlZFxuICAvLyBsaWtlIGNhdWdodCBleGNlcHRpb25zLCBhbmQgdGhlIERldlRvb2xzIHdvbid0IHBhdXNlIHVubGVzcyB0aGUgZGV2ZWxvcGVyXG4gIC8vIHRha2VzIHRoZSBleHRyYSBzdGVwIG9mIGVuYWJsaW5nIHBhdXNlIG9uIGNhdWdodCBleGNlcHRpb25zLiBUaGlzIGlzXG4gIC8vIHVuaW50dWl0aXZlLCB0aG91Z2gsIGJlY2F1c2UgZXZlbiB0aG91Z2ggUmVhY3QgaGFzIGNhdWdodCB0aGUgZXJyb3IsIGZyb21cbiAgLy8gdGhlIGRldmVsb3BlcidzIHBlcnNwZWN0aXZlLCB0aGUgZXJyb3IgaXMgdW5jYXVnaHQuXG4gIC8vXG4gIC8vIFRvIHByZXNlcnZlIHRoZSBleHBlY3RlZCBcIlBhdXNlIG9uIGV4Y2VwdGlvbnNcIiBiZWhhdmlvciwgd2UgZG9uJ3QgdXNlIGFcbiAgLy8gdHJ5LWNhdGNoIGluIERFVi4gSW5zdGVhZCwgd2Ugc3luY2hyb25vdXNseSBkaXNwYXRjaCBhIGZha2UgZXZlbnQgdG8gYSBmYWtlXG4gIC8vIERPTSBub2RlLCBhbmQgY2FsbCB0aGUgdXNlci1wcm92aWRlZCBjYWxsYmFjayBmcm9tIGluc2lkZSBhbiBldmVudCBoYW5kbGVyXG4gIC8vIGZvciB0aGF0IGZha2UgZXZlbnQuIElmIHRoZSBjYWxsYmFjayB0aHJvd3MsIHRoZSBlcnJvciBpcyBcImNhcHR1cmVkXCIgdXNpbmdcbiAgLy8gYSBnbG9iYWwgZXZlbnQgaGFuZGxlci4gQnV0IGJlY2F1c2UgdGhlIGVycm9yIGhhcHBlbnMgaW4gYSBkaWZmZXJlbnRcbiAgLy8gZXZlbnQgbG9vcCBjb250ZXh0LCBpdCBkb2VzIG5vdCBpbnRlcnJ1cHQgdGhlIG5vcm1hbCBwcm9ncmFtIGZsb3cuXG4gIC8vIEVmZmVjdGl2ZWx5LCB0aGlzIGdpdmVzIHVzIHRyeS1jYXRjaCBiZWhhdmlvciB3aXRob3V0IGFjdHVhbGx5IHVzaW5nXG4gIC8vIHRyeS1jYXRjaC4gTmVhdCFcbiAgLy8gQ2hlY2sgdGhhdCB0aGUgYnJvd3NlciBzdXBwb3J0cyB0aGUgQVBJcyB3ZSBuZWVkIHRvIGltcGxlbWVudCBvdXIgc3BlY2lhbFxuICAvLyBERVYgdmVyc2lvbiBvZiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZGlzcGF0Y2hFdmVudCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBmYWtlTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3JlYWN0Jyk7XG5cbiAgICBpbnZva2VHdWFyZGVkQ2FsbGJhY2tJbXBsID0gZnVuY3Rpb24gaW52b2tlR3VhcmRlZENhbGxiYWNrRGV2KG5hbWUsIGZ1bmMsIGNvbnRleHQsIGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgICAgIC8vIElmIGRvY3VtZW50IGRvZXNuJ3QgZXhpc3Qgd2Uga25vdyBmb3Igc3VyZSB3ZSB3aWxsIGNyYXNoIGluIHRoaXMgbWV0aG9kXG4gICAgICAvLyB3aGVuIHdlIGNhbGwgZG9jdW1lbnQuY3JlYXRlRXZlbnQoKS4gSG93ZXZlciB0aGlzIGNhbiBjYXVzZSBjb25mdXNpbmdcbiAgICAgIC8vIGVycm9yczogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2NyZWF0ZS1yZWFjdC1hcHAvaXNzdWVzLzM0ODJcbiAgICAgIC8vIFNvIHdlIHByZWVtcHRpdmVseSB0aHJvdyB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UgaW5zdGVhZC5cbiAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnIHx8IGRvY3VtZW50ID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGBkb2N1bWVudGAgZ2xvYmFsIHdhcyBkZWZpbmVkIHdoZW4gUmVhY3Qgd2FzIGluaXRpYWxpemVkLCBidXQgaXMgbm90ICcgKyAnZGVmaW5lZCBhbnltb3JlLiBUaGlzIGNhbiBoYXBwZW4gaW4gYSB0ZXN0IGVudmlyb25tZW50IGlmIGEgY29tcG9uZW50ICcgKyAnc2NoZWR1bGVzIGFuIHVwZGF0ZSBmcm9tIGFuIGFzeW5jaHJvbm91cyBjYWxsYmFjaywgYnV0IHRoZSB0ZXN0IGhhcyBhbHJlYWR5ICcgKyAnZmluaXNoZWQgcnVubmluZy4gVG8gc29sdmUgdGhpcywgeW91IGNhbiBlaXRoZXIgdW5tb3VudCB0aGUgY29tcG9uZW50IGF0ICcgKyAndGhlIGVuZCBvZiB5b3VyIHRlc3QgKGFuZCBlbnN1cmUgdGhhdCBhbnkgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgZ2V0ICcgKyAnY2FuY2VsZWQgaW4gYGNvbXBvbmVudFdpbGxVbm1vdW50YCksIG9yIHlvdSBjYW4gY2hhbmdlIHRoZSB0ZXN0IGl0c2VsZiAnICsgJ3RvIGJlIGFzeW5jaHJvbm91cy4nKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICAgICAgdmFyIGRpZENhbGwgPSBmYWxzZTsgLy8gS2VlcHMgdHJhY2sgb2Ygd2hldGhlciB0aGUgdXNlci1wcm92aWRlZCBjYWxsYmFjayB0aHJldyBhbiBlcnJvci4gV2VcbiAgICAgIC8vIHNldCB0aGlzIHRvIHRydWUgYXQgdGhlIGJlZ2lubmluZywgdGhlbiBzZXQgaXQgdG8gZmFsc2UgcmlnaHQgYWZ0ZXJcbiAgICAgIC8vIGNhbGxpbmcgdGhlIGZ1bmN0aW9uLiBJZiB0aGUgZnVuY3Rpb24gZXJyb3JzLCBgZGlkRXJyb3JgIHdpbGwgbmV2ZXIgYmVcbiAgICAgIC8vIHNldCB0byBmYWxzZS4gVGhpcyBzdHJhdGVneSB3b3JrcyBldmVuIGlmIHRoZSBicm93c2VyIGlzIGZsYWt5IGFuZFxuICAgICAgLy8gZmFpbHMgdG8gY2FsbCBvdXIgZ2xvYmFsIGVycm9yIGhhbmRsZXIsIGJlY2F1c2UgaXQgZG9lc24ndCByZWx5IG9uXG4gICAgICAvLyB0aGUgZXJyb3IgZXZlbnQgYXQgYWxsLlxuXG4gICAgICB2YXIgZGlkRXJyb3IgPSB0cnVlOyAvLyBLZWVwcyB0cmFjayBvZiB0aGUgdmFsdWUgb2Ygd2luZG93LmV2ZW50IHNvIHRoYXQgd2UgY2FuIHJlc2V0IGl0XG4gICAgICAvLyBkdXJpbmcgdGhlIGNhbGxiYWNrIHRvIGxldCB1c2VyIGNvZGUgYWNjZXNzIHdpbmRvdy5ldmVudCBpbiB0aGVcbiAgICAgIC8vIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBpdC5cblxuICAgICAgdmFyIHdpbmRvd0V2ZW50ID0gd2luZG93LmV2ZW50OyAvLyBLZWVwcyB0cmFjayBvZiB0aGUgZGVzY3JpcHRvciBvZiB3aW5kb3cuZXZlbnQgdG8gcmVzdG9yZSBpdCBhZnRlciBldmVudFxuICAgICAgLy8gZGlzcGF0Y2hpbmc6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTM2ODhcblxuICAgICAgdmFyIHdpbmRvd0V2ZW50RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnZXZlbnQnKTtcblxuICAgICAgZnVuY3Rpb24gcmVzdG9yZUFmdGVyRGlzcGF0Y2goKSB7XG4gICAgICAgIC8vIFdlIGltbWVkaWF0ZWx5IHJlbW92ZSB0aGUgY2FsbGJhY2sgZnJvbSBldmVudCBsaXN0ZW5lcnMgc28gdGhhdFxuICAgICAgICAvLyBuZXN0ZWQgYGludm9rZUd1YXJkZWRDYWxsYmFja2AgY2FsbHMgZG8gbm90IGNsYXNoLiBPdGhlcndpc2UsIGFcbiAgICAgICAgLy8gbmVzdGVkIGNhbGwgd291bGQgdHJpZ2dlciB0aGUgZmFrZSBldmVudCBoYW5kbGVycyBvZiBhbnkgY2FsbCBoaWdoZXJcbiAgICAgICAgLy8gaW4gdGhlIHN0YWNrLlxuICAgICAgICBmYWtlTm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2dFR5cGUsIGNhbGxDYWxsYmFjaywgZmFsc2UpOyAvLyBXZSBjaGVjayBmb3Igd2luZG93Lmhhc093blByb3BlcnR5KCdldmVudCcpIHRvIHByZXZlbnQgdGhlXG4gICAgICAgIC8vIHdpbmRvdy5ldmVudCBhc3NpZ25tZW50IGluIGJvdGggSUUgPD0gMTAgYXMgdGhleSB0aHJvdyBhbiBlcnJvclxuICAgICAgICAvLyBcIk1lbWJlciBub3QgZm91bmRcIiBpbiBzdHJpY3QgbW9kZSwgYW5kIGluIEZpcmVmb3ggd2hpY2ggZG9lcyBub3RcbiAgICAgICAgLy8gc3VwcG9ydCB3aW5kb3cuZXZlbnQuXG5cbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuZXZlbnQgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5oYXNPd25Qcm9wZXJ0eSgnZXZlbnQnKSkge1xuICAgICAgICAgIHdpbmRvdy5ldmVudCA9IHdpbmRvd0V2ZW50O1xuICAgICAgICB9XG4gICAgICB9IC8vIENyZWF0ZSBhbiBldmVudCBoYW5kbGVyIGZvciBvdXIgZmFrZSBldmVudC4gV2Ugd2lsbCBzeW5jaHJvbm91c2x5XG4gICAgICAvLyBkaXNwYXRjaCBvdXIgZmFrZSBldmVudCB1c2luZyBgZGlzcGF0Y2hFdmVudGAuIEluc2lkZSB0aGUgaGFuZGxlciwgd2VcbiAgICAgIC8vIGNhbGwgdGhlIHVzZXItcHJvdmlkZWQgY2FsbGJhY2suXG5cblxuICAgICAgdmFyIGZ1bmNBcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAzKTtcblxuICAgICAgZnVuY3Rpb24gY2FsbENhbGxiYWNrKCkge1xuICAgICAgICBkaWRDYWxsID0gdHJ1ZTtcbiAgICAgICAgcmVzdG9yZUFmdGVyRGlzcGF0Y2goKTtcbiAgICAgICAgZnVuYy5hcHBseShjb250ZXh0LCBmdW5jQXJncyk7XG4gICAgICAgIGRpZEVycm9yID0gZmFsc2U7XG4gICAgICB9IC8vIENyZWF0ZSBhIGdsb2JhbCBlcnJvciBldmVudCBoYW5kbGVyLiBXZSB1c2UgdGhpcyB0byBjYXB0dXJlIHRoZSB2YWx1ZVxuICAgICAgLy8gdGhhdCB3YXMgdGhyb3duLiBJdCdzIHBvc3NpYmxlIHRoYXQgdGhpcyBlcnJvciBoYW5kbGVyIHdpbGwgZmlyZSBtb3JlXG4gICAgICAvLyB0aGFuIG9uY2U7IGZvciBleGFtcGxlLCBpZiBub24tUmVhY3QgY29kZSBhbHNvIGNhbGxzIGBkaXNwYXRjaEV2ZW50YFxuICAgICAgLy8gYW5kIGEgaGFuZGxlciBmb3IgdGhhdCBldmVudCB0aHJvd3MuIFdlIHNob3VsZCBiZSByZXNpbGllbnQgdG8gbW9zdCBvZlxuICAgICAgLy8gdGhvc2UgY2FzZXMuIEV2ZW4gaWYgb3VyIGVycm9yIGV2ZW50IGhhbmRsZXIgZmlyZXMgbW9yZSB0aGFuIG9uY2UsIHRoZVxuICAgICAgLy8gbGFzdCBlcnJvciBldmVudCBpcyBhbHdheXMgdXNlZC4gSWYgdGhlIGNhbGxiYWNrIGFjdHVhbGx5IGRvZXMgZXJyb3IsXG4gICAgICAvLyB3ZSBrbm93IHRoYXQgdGhlIGxhc3QgZXJyb3IgZXZlbnQgaXMgdGhlIGNvcnJlY3Qgb25lLCBiZWNhdXNlIGl0J3Mgbm90XG4gICAgICAvLyBwb3NzaWJsZSBmb3IgYW55dGhpbmcgZWxzZSB0byBoYXZlIGhhcHBlbmVkIGluIGJldHdlZW4gb3VyIGNhbGxiYWNrXG4gICAgICAvLyBlcnJvcmluZyBhbmQgdGhlIGNvZGUgdGhhdCBmb2xsb3dzIHRoZSBgZGlzcGF0Y2hFdmVudGAgY2FsbCBiZWxvdy4gSWZcbiAgICAgIC8vIHRoZSBjYWxsYmFjayBkb2Vzbid0IGVycm9yLCBidXQgdGhlIGVycm9yIGV2ZW50IHdhcyBmaXJlZCwgd2Uga25vdyB0b1xuICAgICAgLy8gaWdub3JlIGl0IGJlY2F1c2UgYGRpZEVycm9yYCB3aWxsIGJlIGZhbHNlLCBhcyBkZXNjcmliZWQgYWJvdmUuXG5cblxuICAgICAgdmFyIGVycm9yOyAvLyBVc2UgdGhpcyB0byB0cmFjayB3aGV0aGVyIHRoZSBlcnJvciBldmVudCBpcyBldmVyIGNhbGxlZC5cblxuICAgICAgdmFyIGRpZFNldEVycm9yID0gZmFsc2U7XG4gICAgICB2YXIgaXNDcm9zc09yaWdpbkVycm9yID0gZmFsc2U7XG5cbiAgICAgIGZ1bmN0aW9uIGhhbmRsZVdpbmRvd0Vycm9yKGV2ZW50KSB7XG4gICAgICAgIGVycm9yID0gZXZlbnQuZXJyb3I7XG4gICAgICAgIGRpZFNldEVycm9yID0gdHJ1ZTtcblxuICAgICAgICBpZiAoZXJyb3IgPT09IG51bGwgJiYgZXZlbnQuY29sbm8gPT09IDAgJiYgZXZlbnQubGluZW5vID09PSAwKSB7XG4gICAgICAgICAgaXNDcm9zc09yaWdpbkVycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgLy8gU29tZSBvdGhlciBlcnJvciBoYW5kbGVyIGhhcyBwcmV2ZW50ZWQgZGVmYXVsdC5cbiAgICAgICAgICAvLyBCcm93c2VycyBzaWxlbmNlIHRoZSBlcnJvciByZXBvcnQgaWYgdGhpcyBoYXBwZW5zLlxuICAgICAgICAgIC8vIFdlJ2xsIHJlbWVtYmVyIHRoaXMgdG8gbGF0ZXIgZGVjaWRlIHdoZXRoZXIgdG8gbG9nIGl0IG9yIG5vdC5cbiAgICAgICAgICBpZiAoZXJyb3IgIT0gbnVsbCAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBlcnJvci5fc3VwcHJlc3NMb2dnaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGlubmVyKSB7Ly8gSWdub3JlLlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSAvLyBDcmVhdGUgYSBmYWtlIGV2ZW50IHR5cGUuXG5cblxuICAgICAgdmFyIGV2dFR5cGUgPSBcInJlYWN0LVwiICsgKG5hbWUgPyBuYW1lIDogJ2ludm9rZWd1YXJkZWRjYWxsYmFjaycpOyAvLyBBdHRhY2ggb3VyIGV2ZW50IGhhbmRsZXJzXG5cbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGhhbmRsZVdpbmRvd0Vycm9yKTtcbiAgICAgIGZha2VOb2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZ0VHlwZSwgY2FsbENhbGxiYWNrLCBmYWxzZSk7IC8vIFN5bmNocm9ub3VzbHkgZGlzcGF0Y2ggb3VyIGZha2UgZXZlbnQuIElmIHRoZSB1c2VyLXByb3ZpZGVkIGZ1bmN0aW9uXG4gICAgICAvLyBlcnJvcnMsIGl0IHdpbGwgdHJpZ2dlciBvdXIgZ2xvYmFsIGVycm9yIGhhbmRsZXIuXG5cbiAgICAgIGV2dC5pbml0RXZlbnQoZXZ0VHlwZSwgZmFsc2UsIGZhbHNlKTtcbiAgICAgIGZha2VOb2RlLmRpc3BhdGNoRXZlbnQoZXZ0KTtcblxuICAgICAgaWYgKHdpbmRvd0V2ZW50RGVzY3JpcHRvcikge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCAnZXZlbnQnLCB3aW5kb3dFdmVudERlc2NyaXB0b3IpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlkQ2FsbCAmJiBkaWRFcnJvcikge1xuICAgICAgICBpZiAoIWRpZFNldEVycm9yKSB7XG4gICAgICAgICAgLy8gVGhlIGNhbGxiYWNrIGVycm9yZWQsIGJ1dCB0aGUgZXJyb3IgZXZlbnQgbmV2ZXIgZmlyZWQuXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvcignQW4gZXJyb3Igd2FzIHRocm93biBpbnNpZGUgb25lIG9mIHlvdXIgY29tcG9uZW50cywgYnV0IFJlYWN0ICcgKyBcImRvZXNuJ3Qga25vdyB3aGF0IGl0IHdhcy4gVGhpcyBpcyBsaWtlbHkgZHVlIHRvIGJyb3dzZXIgXCIgKyAnZmxha2luZXNzLiBSZWFjdCBkb2VzIGl0cyBiZXN0IHRvIHByZXNlcnZlIHRoZSBcIlBhdXNlIG9uICcgKyAnZXhjZXB0aW9uc1wiIGJlaGF2aW9yIG9mIHRoZSBEZXZUb29scywgd2hpY2ggcmVxdWlyZXMgc29tZSAnICsgXCJERVYtbW9kZSBvbmx5IHRyaWNrcy4gSXQncyBwb3NzaWJsZSB0aGF0IHRoZXNlIGRvbid0IHdvcmsgaW4gXCIgKyAneW91ciBicm93c2VyLiBUcnkgdHJpZ2dlcmluZyB0aGUgZXJyb3IgaW4gcHJvZHVjdGlvbiBtb2RlLCAnICsgJ29yIHN3aXRjaGluZyB0byBhIG1vZGVybiBicm93c2VyLiBJZiB5b3Ugc3VzcGVjdCB0aGF0IHRoaXMgaXMgJyArICdhY3R1YWxseSBhbiBpc3N1ZSB3aXRoIFJlYWN0LCBwbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0Nyb3NzT3JpZ2luRXJyb3IpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKFwiQSBjcm9zcy1vcmlnaW4gZXJyb3Igd2FzIHRocm93bi4gUmVhY3QgZG9lc24ndCBoYXZlIGFjY2VzcyB0byBcIiArICd0aGUgYWN0dWFsIGVycm9yIG9iamVjdCBpbiBkZXZlbG9wbWVudC4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2Nyb3Nzb3JpZ2luLWVycm9yIGZvciBtb3JlIGluZm9ybWF0aW9uLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vbkVycm9yKGVycm9yKTtcbiAgICAgIH0gLy8gUmVtb3ZlIG91ciBldmVudCBsaXN0ZW5lcnNcblxuXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBoYW5kbGVXaW5kb3dFcnJvcik7XG5cbiAgICAgIGlmICghZGlkQ2FsbCkge1xuICAgICAgICAvLyBTb21ldGhpbmcgd2VudCByZWFsbHkgd3JvbmcsIGFuZCBvdXIgZXZlbnQgd2FzIG5vdCBkaXNwYXRjaGVkLlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE2NzM0XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTY1ODVcbiAgICAgICAgLy8gRmFsbCBiYWNrIHRvIHRoZSBwcm9kdWN0aW9uIGltcGxlbWVudGF0aW9uLlxuICAgICAgICByZXN0b3JlQWZ0ZXJEaXNwYXRjaCgpO1xuICAgICAgICByZXR1cm4gaW52b2tlR3VhcmRlZENhbGxiYWNrUHJvZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbn1cblxudmFyIGludm9rZUd1YXJkZWRDYWxsYmFja0ltcGwkMSA9IGludm9rZUd1YXJkZWRDYWxsYmFja0ltcGw7XG5cbnZhciBoYXNFcnJvciA9IGZhbHNlO1xudmFyIGNhdWdodEVycm9yID0gbnVsbDsgLy8gVXNlZCBieSBldmVudCBzeXN0ZW0gdG8gY2FwdHVyZS9yZXRocm93IHRoZSBmaXJzdCBlcnJvci5cblxudmFyIGhhc1JldGhyb3dFcnJvciA9IGZhbHNlO1xudmFyIHJldGhyb3dFcnJvciA9IG51bGw7XG52YXIgcmVwb3J0ZXIgPSB7XG4gIG9uRXJyb3I6IGZ1bmN0aW9uIChlcnJvcikge1xuICAgIGhhc0Vycm9yID0gdHJ1ZTtcbiAgICBjYXVnaHRFcnJvciA9IGVycm9yO1xuICB9XG59O1xuLyoqXG4gKiBDYWxsIGEgZnVuY3Rpb24gd2hpbGUgZ3VhcmRpbmcgYWdhaW5zdCBlcnJvcnMgdGhhdCBoYXBwZW5zIHdpdGhpbiBpdC5cbiAqIFJldHVybnMgYW4gZXJyb3IgaWYgaXQgdGhyb3dzLCBvdGhlcndpc2UgbnVsbC5cbiAqXG4gKiBJbiBwcm9kdWN0aW9uLCB0aGlzIGlzIGltcGxlbWVudGVkIHVzaW5nIGEgdHJ5LWNhdGNoLiBUaGUgcmVhc29uIHdlIGRvbid0XG4gKiB1c2UgYSB0cnktY2F0Y2ggZGlyZWN0bHkgaXMgc28gdGhhdCB3ZSBjYW4gc3dhcCBvdXQgYSBkaWZmZXJlbnRcbiAqIGltcGxlbWVudGF0aW9uIGluIERFViBtb2RlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIG9mIHRoZSBndWFyZCB0byB1c2UgZm9yIGxvZ2dpbmcgb3IgZGVidWdnaW5nXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnZva2VcbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBUaGUgY29udGV4dCB0byB1c2Ugd2hlbiBjYWxsaW5nIHRoZSBmdW5jdGlvblxuICogQHBhcmFtIHsuLi4qfSBhcmdzIEFyZ3VtZW50cyBmb3IgZnVuY3Rpb25cbiAqL1xuXG5mdW5jdGlvbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2sobmFtZSwgZnVuYywgY29udGV4dCwgYSwgYiwgYywgZCwgZSwgZikge1xuICBoYXNFcnJvciA9IGZhbHNlO1xuICBjYXVnaHRFcnJvciA9IG51bGw7XG4gIGludm9rZUd1YXJkZWRDYWxsYmFja0ltcGwkMS5hcHBseShyZXBvcnRlciwgYXJndW1lbnRzKTtcbn1cbi8qKlxuICogU2FtZSBhcyBpbnZva2VHdWFyZGVkQ2FsbGJhY2ssIGJ1dCBpbnN0ZWFkIG9mIHJldHVybmluZyBhbiBlcnJvciwgaXQgc3RvcmVzXG4gKiBpdCBpbiBhIGdsb2JhbCBzbyBpdCBjYW4gYmUgcmV0aHJvd24gYnkgYHJldGhyb3dDYXVnaHRFcnJvcmAgbGF0ZXIuXG4gKiBUT0RPOiBTZWUgaWYgY2F1Z2h0RXJyb3IgYW5kIHJldGhyb3dFcnJvciBjYW4gYmUgdW5pZmllZC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBvZiB0aGUgZ3VhcmQgdG8gdXNlIGZvciBsb2dnaW5nIG9yIGRlYnVnZ2luZ1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaW52b2tlXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgVGhlIGNvbnRleHQgdG8gdXNlIHdoZW4gY2FsbGluZyB0aGUgZnVuY3Rpb25cbiAqIEBwYXJhbSB7Li4uKn0gYXJncyBBcmd1bWVudHMgZm9yIGZ1bmN0aW9uXG4gKi9cblxuZnVuY3Rpb24gaW52b2tlR3VhcmRlZENhbGxiYWNrQW5kQ2F0Y2hGaXJzdEVycm9yKG5hbWUsIGZ1bmMsIGNvbnRleHQsIGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgaW52b2tlR3VhcmRlZENhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgaWYgKGhhc0Vycm9yKSB7XG4gICAgdmFyIGVycm9yID0gY2xlYXJDYXVnaHRFcnJvcigpO1xuXG4gICAgaWYgKCFoYXNSZXRocm93RXJyb3IpIHtcbiAgICAgIGhhc1JldGhyb3dFcnJvciA9IHRydWU7XG4gICAgICByZXRocm93RXJyb3IgPSBlcnJvcjtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogRHVyaW5nIGV4ZWN1dGlvbiBvZiBndWFyZGVkIGZ1bmN0aW9ucyB3ZSB3aWxsIGNhcHR1cmUgdGhlIGZpcnN0IGVycm9yIHdoaWNoXG4gKiB3ZSB3aWxsIHJldGhyb3cgdG8gYmUgaGFuZGxlZCBieSB0aGUgdG9wIGxldmVsIGVycm9yIGhhbmRsZXIuXG4gKi9cblxuZnVuY3Rpb24gcmV0aHJvd0NhdWdodEVycm9yKCkge1xuICBpZiAoaGFzUmV0aHJvd0Vycm9yKSB7XG4gICAgdmFyIGVycm9yID0gcmV0aHJvd0Vycm9yO1xuICAgIGhhc1JldGhyb3dFcnJvciA9IGZhbHNlO1xuICAgIHJldGhyb3dFcnJvciA9IG51bGw7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cbmZ1bmN0aW9uIGhhc0NhdWdodEVycm9yKCkge1xuICByZXR1cm4gaGFzRXJyb3I7XG59XG5mdW5jdGlvbiBjbGVhckNhdWdodEVycm9yKCkge1xuICBpZiAoaGFzRXJyb3IpIHtcbiAgICB2YXIgZXJyb3IgPSBjYXVnaHRFcnJvcjtcbiAgICBoYXNFcnJvciA9IGZhbHNlO1xuICAgIGNhdWdodEVycm9yID0gbnVsbDtcbiAgICByZXR1cm4gZXJyb3I7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhckNhdWdodEVycm9yIHdhcyBjYWxsZWQgYnV0IG5vIGVycm9yIHdhcyBjYXB0dXJlZC4gVGhpcyBlcnJvciAnICsgJ2lzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG59XG5cbi8qKlxuICogYFJlYWN0SW5zdGFuY2VNYXBgIG1haW50YWlucyBhIG1hcHBpbmcgZnJvbSBhIHB1YmxpYyBmYWNpbmcgc3RhdGVmdWxcbiAqIGluc3RhbmNlIChrZXkpIGFuZCB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gKHZhbHVlKS4gVGhpcyBhbGxvd3MgcHVibGljXG4gKiBtZXRob2RzIHRvIGFjY2VwdCB0aGUgdXNlciBmYWNpbmcgaW5zdGFuY2UgYXMgYW4gYXJndW1lbnQgYW5kIG1hcCB0aGVtIGJhY2tcbiAqIHRvIGludGVybmFsIG1ldGhvZHMuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgbW9kdWxlIGlzIGN1cnJlbnRseSBzaGFyZWQgYW5kIGFzc3VtZWQgdG8gYmUgc3RhdGVsZXNzLlxuICogSWYgdGhpcyBiZWNvbWVzIGFuIGFjdHVhbCBNYXAsIHRoYXQgd2lsbCBicmVhay5cbiAqL1xuZnVuY3Rpb24gZ2V0KGtleSkge1xuICByZXR1cm4ga2V5Ll9yZWFjdEludGVybmFscztcbn1cbmZ1bmN0aW9uIGhhcyhrZXkpIHtcbiAgcmV0dXJuIGtleS5fcmVhY3RJbnRlcm5hbHMgIT09IHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gIGtleS5fcmVhY3RJbnRlcm5hbHMgPSB2YWx1ZTtcbn1cblxuLy8gRG9uJ3QgY2hhbmdlIHRoZXNlIHR3byB2YWx1ZXMuIFRoZXkncmUgdXNlZCBieSBSZWFjdCBEZXYgVG9vbHMuXG52YXIgTm9GbGFncyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAqL1xuMDtcbnZhciBQZXJmb3JtZWRXb3JrID1cbi8qICAgICAgICAgICAgICAgICovXG4xOyAvLyBZb3UgY2FuIGNoYW5nZSB0aGUgcmVzdCAoYW5kIGFkZCBtb3JlKS5cblxudmFyIFBsYWNlbWVudCA9XG4vKiAgICAgICAgICAgICAgICAgICAgKi9cbjI7XG52YXIgVXBkYXRlID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuNDtcbnZhciBDaGlsZERlbGV0aW9uID1cbi8qICAgICAgICAgICAgICAgICovXG4xNjtcbnZhciBDb250ZW50UmVzZXQgPVxuLyogICAgICAgICAgICAgICAgICovXG4zMjtcbnZhciBDYWxsYmFjayA9XG4vKiAgICAgICAgICAgICAgICAgICAgICovXG42NDtcbnZhciBEaWRDYXB0dXJlID1cbi8qICAgICAgICAgICAgICAgICAgICovXG4xMjg7XG52YXIgRm9yY2VDbGllbnRSZW5kZXIgPVxuLyogICAgICAgICAgICAqL1xuMjU2O1xudmFyIFJlZiA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjUxMjtcbnZhciBTbmFwc2hvdCA9XG4vKiAgICAgICAgICAgICAgICAgICAgICovXG4xMDI0O1xudmFyIFBhc3NpdmUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbjIwNDg7XG52YXIgSHlkcmF0aW5nID1cbi8qICAgICAgICAgICAgICAgICAgICAqL1xuNDA5NjtcbnZhciBWaXNpYmlsaXR5ID1cbi8qICAgICAgICAgICAgICAgICAgICovXG44MTkyO1xudmFyIFN0b3JlQ29uc2lzdGVuY3kgPVxuLyogICAgICAgICAgICAgKi9cbjE2Mzg0O1xudmFyIExpZmVjeWNsZUVmZmVjdE1hc2sgPSBQYXNzaXZlIHwgVXBkYXRlIHwgQ2FsbGJhY2sgfCBSZWYgfCBTbmFwc2hvdCB8IFN0b3JlQ29uc2lzdGVuY3k7IC8vIFVuaW9uIG9mIGFsbCBjb21taXQgZmxhZ3MgKGZsYWdzIHdpdGggdGhlIGxpZmV0aW1lIG9mIGEgcGFydGljdWxhciBjb21taXQpXG5cbnZhciBIb3N0RWZmZWN0TWFzayA9XG4vKiAgICAgICAgICAgICAgICovXG4zMjc2NzsgLy8gVGhlc2UgYXJlIG5vdCByZWFsbHkgc2lkZSBlZmZlY3RzLCBidXQgd2Ugc3RpbGwgcmV1c2UgdGhpcyBmaWVsZC5cblxudmFyIEluY29tcGxldGUgPVxuLyogICAgICAgICAgICAgICAgICAgKi9cbjMyNzY4O1xudmFyIFNob3VsZENhcHR1cmUgPVxuLyogICAgICAgICAgICAgICAgKi9cbjY1NTM2O1xudmFyIEZvcmNlVXBkYXRlRm9yTGVnYWN5U3VzcGVuc2UgPVxuLyogKi9cbjEzMTA3MjtcbnZhciBGb3JrZWQgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG4xMDQ4NTc2OyAvLyBTdGF0aWMgdGFncyBkZXNjcmliZSBhc3BlY3RzIG9mIGEgZmliZXIgdGhhdCBhcmUgbm90IHNwZWNpZmljIHRvIGEgcmVuZGVyLFxuLy8gZS5nLiBhIGZpYmVyIHVzZXMgYSBwYXNzaXZlIGVmZmVjdCAoZXZlbiBpZiB0aGVyZSBhcmUgbm8gdXBkYXRlcyBvbiB0aGlzIHBhcnRpY3VsYXIgcmVuZGVyKS5cbi8vIFRoaXMgZW5hYmxlcyB1cyB0byBkZWZlciBtb3JlIHdvcmsgaW4gdGhlIHVubW91bnQgY2FzZSxcbi8vIHNpbmNlIHdlIGNhbiBkZWZlciB0cmF2ZXJzaW5nIHRoZSB0cmVlIGR1cmluZyBsYXlvdXQgdG8gbG9vayBmb3IgUGFzc2l2ZSBlZmZlY3RzLFxuLy8gYW5kIGluc3RlYWQgcmVseSBvbiB0aGUgc3RhdGljIGZsYWcgYXMgYSBzaWduYWwgdGhhdCB0aGVyZSBtYXkgYmUgY2xlYW51cCB3b3JrLlxuXG52YXIgUmVmU3RhdGljID1cbi8qICAgICAgICAgICAgICAgICAgICAqL1xuMjA5NzE1MjtcbnZhciBMYXlvdXRTdGF0aWMgPVxuLyogICAgICAgICAgICAgICAgICovXG40MTk0MzA0O1xudmFyIFBhc3NpdmVTdGF0aWMgPVxuLyogICAgICAgICAgICAgICAgKi9cbjgzODg2MDg7IC8vIFRoZXNlIGZsYWdzIGFsbG93IHVzIHRvIHRyYXZlcnNlIHRvIGZpYmVycyB0aGF0IGhhdmUgZWZmZWN0cyBvbiBtb3VudFxuLy8gd2l0aG91dCB0cmF2ZXJzaW5nIHRoZSBlbnRpcmUgdHJlZSBhZnRlciBldmVyeSBjb21taXQgZm9yXG4vLyBkb3VibGUgaW52b2tpbmdcblxudmFyIE1vdW50TGF5b3V0RGV2ID1cbi8qICAgICAgICAgICAgICAgKi9cbjE2Nzc3MjE2O1xudmFyIE1vdW50UGFzc2l2ZURldiA9XG4vKiAgICAgICAgICAgICAgKi9cbjMzNTU0NDMyOyAvLyBHcm91cHMgb2YgZmxhZ3MgdGhhdCBhcmUgdXNlZCBpbiB0aGUgY29tbWl0IHBoYXNlIHRvIHNraXAgb3ZlciB0cmVlcyB0aGF0XG4vLyBkb24ndCBjb250YWluIGVmZmVjdHMsIGJ5IGNoZWNraW5nIHN1YnRyZWVGbGFncy5cblxudmFyIEJlZm9yZU11dGF0aW9uTWFzayA9IC8vIFRPRE86IFJlbW92ZSBVcGRhdGUgZmxhZyBmcm9tIGJlZm9yZSBtdXRhdGlvbiBwaGFzZSBieSByZS1sYW5kaW5nIFZpc2liaWxpdHlcbi8vIGZsYWcgbG9naWMgKHNlZSAjMjAwNDMpXG5VcGRhdGUgfCBTbmFwc2hvdCB8ICggMCk7XG52YXIgTXV0YXRpb25NYXNrID0gUGxhY2VtZW50IHwgVXBkYXRlIHwgQ2hpbGREZWxldGlvbiB8IENvbnRlbnRSZXNldCB8IFJlZiB8IEh5ZHJhdGluZyB8IFZpc2liaWxpdHk7XG52YXIgTGF5b3V0TWFzayA9IFVwZGF0ZSB8IENhbGxiYWNrIHwgUmVmIHwgVmlzaWJpbGl0eTsgLy8gVE9ETzogU3BsaXQgaW50byBQYXNzaXZlTW91bnRNYXNrIGFuZCBQYXNzaXZlVW5tb3VudE1hc2tcblxudmFyIFBhc3NpdmVNYXNrID0gUGFzc2l2ZSB8IENoaWxkRGVsZXRpb247IC8vIFVuaW9uIG9mIHRhZ3MgdGhhdCBkb24ndCBnZXQgcmVzZXQgb24gY2xvbmVzLlxuLy8gVGhpcyBhbGxvd3MgY2VydGFpbiBjb25jZXB0cyB0byBwZXJzaXN0IHdpdGhvdXQgcmVjYWxjdWxhdGluZyB0aGVtLFxuLy8gZS5nLiB3aGV0aGVyIGEgc3VidHJlZSBjb250YWlucyBwYXNzaXZlIGVmZmVjdHMgb3IgcG9ydGFscy5cblxudmFyIFN0YXRpY01hc2sgPSBMYXlvdXRTdGF0aWMgfCBQYXNzaXZlU3RhdGljIHwgUmVmU3RhdGljO1xuXG52YXIgUmVhY3RDdXJyZW50T3duZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRPd25lcjtcbmZ1bmN0aW9uIGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpIHtcbiAgdmFyIG5vZGUgPSBmaWJlcjtcbiAgdmFyIG5lYXJlc3RNb3VudGVkID0gZmliZXI7XG5cbiAgaWYgKCFmaWJlci5hbHRlcm5hdGUpIHtcbiAgICAvLyBJZiB0aGVyZSBpcyBubyBhbHRlcm5hdGUsIHRoaXMgbWlnaHQgYmUgYSBuZXcgdHJlZSB0aGF0IGlzbid0IGluc2VydGVkXG4gICAgLy8geWV0LiBJZiBpdCBpcywgdGhlbiBpdCB3aWxsIGhhdmUgYSBwZW5kaW5nIGluc2VydGlvbiBlZmZlY3Qgb24gaXQuXG4gICAgdmFyIG5leHROb2RlID0gbm9kZTtcblxuICAgIGRvIHtcbiAgICAgIG5vZGUgPSBuZXh0Tm9kZTtcblxuICAgICAgaWYgKChub2RlLmZsYWdzICYgKFBsYWNlbWVudCB8IEh5ZHJhdGluZykpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYW4gaW5zZXJ0aW9uIG9yIGluLXByb2dyZXNzIGh5ZHJhdGlvbi4gVGhlIG5lYXJlc3QgcG9zc2libGVcbiAgICAgICAgLy8gbW91bnRlZCBmaWJlciBpcyB0aGUgcGFyZW50IGJ1dCB3ZSBuZWVkIHRvIGNvbnRpbnVlIHRvIGZpZ3VyZSBvdXRcbiAgICAgICAgLy8gaWYgdGhhdCBvbmUgaXMgc3RpbGwgbW91bnRlZC5cbiAgICAgICAgbmVhcmVzdE1vdW50ZWQgPSBub2RlLnJldHVybjtcbiAgICAgIH1cblxuICAgICAgbmV4dE5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9IHdoaWxlIChuZXh0Tm9kZSk7XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKG5vZGUucmV0dXJuKSB7XG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKG5vZGUudGFnID09PSBIb3N0Um9vdCkge1xuICAgIC8vIFRPRE86IENoZWNrIGlmIHRoaXMgd2FzIGEgbmVzdGVkIEhvc3RSb290IHdoZW4gdXNlZCB3aXRoXG4gICAgLy8gcmVuZGVyQ29udGFpbmVySW50b1N1YnRyZWUuXG4gICAgcmV0dXJuIG5lYXJlc3RNb3VudGVkO1xuICB9IC8vIElmIHdlIGRpZG4ndCBoaXQgdGhlIHJvb3QsIHRoYXQgbWVhbnMgdGhhdCB3ZSdyZSBpbiBhbiBkaXNjb25uZWN0ZWQgdHJlZVxuICAvLyB0aGF0IGhhcyBiZWVuIHVubW91bnRlZC5cblxuXG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZ2V0U3VzcGVuc2VJbnN0YW5jZUZyb21GaWJlcihmaWJlcikge1xuICBpZiAoZmliZXIudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIHZhciBzdXNwZW5zZVN0YXRlID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcblxuICAgIGlmIChzdXNwZW5zZVN0YXRlID09PSBudWxsKSB7XG4gICAgICB2YXIgY3VycmVudCA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgc3VzcGVuc2VTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGdldENvbnRhaW5lckZyb21GaWJlcihmaWJlcikge1xuICByZXR1cm4gZmliZXIudGFnID09PSBIb3N0Um9vdCA/IGZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvIDogbnVsbDtcbn1cbmZ1bmN0aW9uIGlzRmliZXJNb3VudGVkKGZpYmVyKSB7XG4gIHJldHVybiBnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKSA9PT0gZmliZXI7XG59XG5mdW5jdGlvbiBpc01vdW50ZWQoY29tcG9uZW50KSB7XG4gIHtcbiAgICB2YXIgb3duZXIgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50O1xuXG4gICAgaWYgKG93bmVyICE9PSBudWxsICYmIG93bmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgIHZhciBvd25lckZpYmVyID0gb3duZXI7XG4gICAgICB2YXIgaW5zdGFuY2UgPSBvd25lckZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgaWYgKCFpbnN0YW5jZS5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIpIHtcbiAgICAgICAgZXJyb3IoJyVzIGlzIGFjY2Vzc2luZyBpc01vdW50ZWQgaW5zaWRlIGl0cyByZW5kZXIoKSBmdW5jdGlvbi4gJyArICdyZW5kZXIoKSBzaG91bGQgYmUgYSBwdXJlIGZ1bmN0aW9uIG9mIHByb3BzIGFuZCBzdGF0ZS4gSXQgc2hvdWxkICcgKyAnbmV2ZXIgYWNjZXNzIHNvbWV0aGluZyB0aGF0IHJlcXVpcmVzIHN0YWxlIGRhdGEgZnJvbSB0aGUgcHJldmlvdXMgJyArICdyZW5kZXIsIHN1Y2ggYXMgcmVmcy4gTW92ZSB0aGlzIGxvZ2ljIHRvIGNvbXBvbmVudERpZE1vdW50IGFuZCAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZSBpbnN0ZWFkLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIob3duZXJGaWJlcikgfHwgJ0EgY29tcG9uZW50Jyk7XG4gICAgICB9XG5cbiAgICAgIGluc3RhbmNlLl93YXJuZWRBYm91dFJlZnNJblJlbmRlciA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGZpYmVyID0gZ2V0KGNvbXBvbmVudCk7XG5cbiAgaWYgKCFmaWJlcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKSA9PT0gZmliZXI7XG59XG5cbmZ1bmN0aW9uIGFzc2VydElzTW91bnRlZChmaWJlcikge1xuICBpZiAoZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcihmaWJlcikgIT09IGZpYmVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEN1cnJlbnRGaWJlclVzaW5nU2xvd1BhdGgoZmliZXIpIHtcbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoIWFsdGVybmF0ZSkge1xuICAgIC8vIElmIHRoZXJlIGlzIG5vIGFsdGVybmF0ZSwgdGhlbiB3ZSBvbmx5IG5lZWQgdG8gY2hlY2sgaWYgaXQgaXMgbW91bnRlZC5cbiAgICB2YXIgbmVhcmVzdE1vdW50ZWQgPSBnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKTtcblxuICAgIGlmIChuZWFyZXN0TW91bnRlZCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuJyk7XG4gICAgfVxuXG4gICAgaWYgKG5lYXJlc3RNb3VudGVkICE9PSBmaWJlcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpYmVyO1xuICB9IC8vIElmIHdlIGhhdmUgdHdvIHBvc3NpYmxlIGJyYW5jaGVzLCB3ZSdsbCB3YWxrIGJhY2t3YXJkcyB1cCB0byB0aGUgcm9vdFxuICAvLyB0byBzZWUgd2hhdCBwYXRoIHRoZSByb290IHBvaW50cyB0by4gT24gdGhlIHdheSB3ZSBtYXkgaGl0IG9uZSBvZiB0aGVcbiAgLy8gc3BlY2lhbCBjYXNlcyBhbmQgd2UnbGwgZGVhbCB3aXRoIHRoZW0uXG5cblxuICB2YXIgYSA9IGZpYmVyO1xuICB2YXIgYiA9IGFsdGVybmF0ZTtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIHZhciBwYXJlbnRBID0gYS5yZXR1cm47XG5cbiAgICBpZiAocGFyZW50QSA9PT0gbnVsbCkge1xuICAgICAgLy8gV2UncmUgYXQgdGhlIHJvb3QuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgcGFyZW50QiA9IHBhcmVudEEuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKHBhcmVudEIgPT09IG51bGwpIHtcbiAgICAgIC8vIFRoZXJlIGlzIG5vIGFsdGVybmF0ZS4gVGhpcyBpcyBhbiB1bnVzdWFsIGNhc2UuIEN1cnJlbnRseSwgaXQgb25seVxuICAgICAgLy8gaGFwcGVucyB3aGVuIGEgU3VzcGVuc2UgY29tcG9uZW50IGlzIGhpZGRlbi4gQW4gZXh0cmEgZnJhZ21lbnQgZmliZXJcbiAgICAgIC8vIGlzIGluc2VydGVkIGluIGJldHdlZW4gdGhlIFN1c3BlbnNlIGZpYmVyIGFuZCBpdHMgY2hpbGRyZW4uIFNraXBcbiAgICAgIC8vIG92ZXIgdGhpcyBleHRyYSBmcmFnbWVudCBmaWJlciBhbmQgcHJvY2VlZCB0byB0aGUgbmV4dCBwYXJlbnQuXG4gICAgICB2YXIgbmV4dFBhcmVudCA9IHBhcmVudEEucmV0dXJuO1xuXG4gICAgICBpZiAobmV4dFBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgICBhID0gYiA9IG5leHRQYXJlbnQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSAvLyBJZiB0aGVyZSdzIG5vIHBhcmVudCwgd2UncmUgYXQgdGhlIHJvb3QuXG5cblxuICAgICAgYnJlYWs7XG4gICAgfSAvLyBJZiBib3RoIGNvcGllcyBvZiB0aGUgcGFyZW50IGZpYmVyIHBvaW50IHRvIHRoZSBzYW1lIGNoaWxkLCB3ZSBjYW5cbiAgICAvLyBhc3N1bWUgdGhhdCB0aGUgY2hpbGQgaXMgY3VycmVudC4gVGhpcyBoYXBwZW5zIHdoZW4gd2UgYmFpbG91dCBvbiBsb3dcbiAgICAvLyBwcmlvcml0eTogdGhlIGJhaWxlZCBvdXQgZmliZXIncyBjaGlsZCByZXVzZXMgdGhlIGN1cnJlbnQgY2hpbGQuXG5cblxuICAgIGlmIChwYXJlbnRBLmNoaWxkID09PSBwYXJlbnRCLmNoaWxkKSB7XG4gICAgICB2YXIgY2hpbGQgPSBwYXJlbnRBLmNoaWxkO1xuXG4gICAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgICAgaWYgKGNoaWxkID09PSBhKSB7XG4gICAgICAgICAgLy8gV2UndmUgZGV0ZXJtaW5lZCB0aGF0IEEgaXMgdGhlIGN1cnJlbnQgYnJhbmNoLlxuICAgICAgICAgIGFzc2VydElzTW91bnRlZChwYXJlbnRBKTtcbiAgICAgICAgICByZXR1cm4gZmliZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hpbGQgPT09IGIpIHtcbiAgICAgICAgICAvLyBXZSd2ZSBkZXRlcm1pbmVkIHRoYXQgQiBpcyB0aGUgY3VycmVudCBicmFuY2guXG4gICAgICAgICAgYXNzZXJ0SXNNb3VudGVkKHBhcmVudEEpO1xuICAgICAgICAgIHJldHVybiBhbHRlcm5hdGU7XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgICB9IC8vIFdlIHNob3VsZCBuZXZlciBoYXZlIGFuIGFsdGVybmF0ZSBmb3IgYW55IG1vdW50aW5nIG5vZGUuIFNvIHRoZSBvbmx5XG4gICAgICAvLyB3YXkgdGhpcyBjb3VsZCBwb3NzaWJseSBoYXBwZW4gaXMgaWYgdGhpcyB3YXMgdW5tb3VudGVkLCBpZiBhdCBhbGwuXG5cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuJyk7XG4gICAgfVxuXG4gICAgaWYgKGEucmV0dXJuICE9PSBiLnJldHVybikge1xuICAgICAgLy8gVGhlIHJldHVybiBwb2ludGVyIG9mIEEgYW5kIHRoZSByZXR1cm4gcG9pbnRlciBvZiBCIHBvaW50IHRvIGRpZmZlcmVudFxuICAgICAgLy8gZmliZXJzLiBXZSBhc3N1bWUgdGhhdCByZXR1cm4gcG9pbnRlcnMgbmV2ZXIgY3Jpc3MtY3Jvc3MsIHNvIEEgbXVzdFxuICAgICAgLy8gYmVsb25nIHRvIHRoZSBjaGlsZCBzZXQgb2YgQS5yZXR1cm4sIGFuZCBCIG11c3QgYmVsb25nIHRvIHRoZSBjaGlsZFxuICAgICAgLy8gc2V0IG9mIEIucmV0dXJuLlxuICAgICAgYSA9IHBhcmVudEE7XG4gICAgICBiID0gcGFyZW50QjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIHJldHVybiBwb2ludGVycyBwb2ludCB0byB0aGUgc2FtZSBmaWJlci4gV2UnbGwgaGF2ZSB0byB1c2UgdGhlXG4gICAgICAvLyBkZWZhdWx0LCBzbG93IHBhdGg6IHNjYW4gdGhlIGNoaWxkIHNldHMgb2YgZWFjaCBwYXJlbnQgYWx0ZXJuYXRlIHRvIHNlZVxuICAgICAgLy8gd2hpY2ggY2hpbGQgYmVsb25ncyB0byB3aGljaCBzZXQuXG4gICAgICAvL1xuICAgICAgLy8gU2VhcmNoIHBhcmVudCBBJ3MgY2hpbGQgc2V0XG4gICAgICB2YXIgZGlkRmluZENoaWxkID0gZmFsc2U7XG4gICAgICB2YXIgX2NoaWxkID0gcGFyZW50QS5jaGlsZDtcblxuICAgICAgd2hpbGUgKF9jaGlsZCkge1xuICAgICAgICBpZiAoX2NoaWxkID09PSBhKSB7XG4gICAgICAgICAgZGlkRmluZENoaWxkID0gdHJ1ZTtcbiAgICAgICAgICBhID0gcGFyZW50QTtcbiAgICAgICAgICBiID0gcGFyZW50QjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChfY2hpbGQgPT09IGIpIHtcbiAgICAgICAgICBkaWRGaW5kQ2hpbGQgPSB0cnVlO1xuICAgICAgICAgIGIgPSBwYXJlbnRBO1xuICAgICAgICAgIGEgPSBwYXJlbnRCO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgX2NoaWxkID0gX2NoaWxkLnNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIGlmICghZGlkRmluZENoaWxkKSB7XG4gICAgICAgIC8vIFNlYXJjaCBwYXJlbnQgQidzIGNoaWxkIHNldFxuICAgICAgICBfY2hpbGQgPSBwYXJlbnRCLmNoaWxkO1xuXG4gICAgICAgIHdoaWxlIChfY2hpbGQpIHtcbiAgICAgICAgICBpZiAoX2NoaWxkID09PSBhKSB7XG4gICAgICAgICAgICBkaWRGaW5kQ2hpbGQgPSB0cnVlO1xuICAgICAgICAgICAgYSA9IHBhcmVudEI7XG4gICAgICAgICAgICBiID0gcGFyZW50QTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChfY2hpbGQgPT09IGIpIHtcbiAgICAgICAgICAgIGRpZEZpbmRDaGlsZCA9IHRydWU7XG4gICAgICAgICAgICBiID0gcGFyZW50QjtcbiAgICAgICAgICAgIGEgPSBwYXJlbnRBO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX2NoaWxkID0gX2NoaWxkLnNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWRpZEZpbmRDaGlsZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2hpbGQgd2FzIG5vdCBmb3VuZCBpbiBlaXRoZXIgcGFyZW50IHNldC4gVGhpcyBpbmRpY2F0ZXMgYSBidWcgJyArICdpbiBSZWFjdCByZWxhdGVkIHRvIHRoZSByZXR1cm4gcG9pbnRlci4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYS5hbHRlcm5hdGUgIT09IGIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlJldHVybiBmaWJlcnMgc2hvdWxkIGFsd2F5cyBiZSBlYWNoIG90aGVycycgYWx0ZXJuYXRlcy4gXCIgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH0gLy8gSWYgdGhlIHJvb3QgaXMgbm90IGEgaG9zdCBjb250YWluZXIsIHdlJ3JlIGluIGEgZGlzY29ubmVjdGVkIHRyZWUuIEkuZS5cbiAgLy8gdW5tb3VudGVkLlxuXG5cbiAgaWYgKGEudGFnICE9PSBIb3N0Um9vdCkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgbm9kZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LicpO1xuICB9XG5cbiAgaWYgKGEuc3RhdGVOb2RlLmN1cnJlbnQgPT09IGEpIHtcbiAgICAvLyBXZSd2ZSBkZXRlcm1pbmVkIHRoYXQgQSBpcyB0aGUgY3VycmVudCBicmFuY2guXG4gICAgcmV0dXJuIGZpYmVyO1xuICB9IC8vIE90aGVyd2lzZSBCIGhhcyB0byBiZSBjdXJyZW50IGJyYW5jaC5cblxuXG4gIHJldHVybiBhbHRlcm5hdGU7XG59XG5mdW5jdGlvbiBmaW5kQ3VycmVudEhvc3RGaWJlcihwYXJlbnQpIHtcbiAgdmFyIGN1cnJlbnRQYXJlbnQgPSBmaW5kQ3VycmVudEZpYmVyVXNpbmdTbG93UGF0aChwYXJlbnQpO1xuICByZXR1cm4gY3VycmVudFBhcmVudCAhPT0gbnVsbCA/IGZpbmRDdXJyZW50SG9zdEZpYmVySW1wbChjdXJyZW50UGFyZW50KSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGZpbmRDdXJyZW50SG9zdEZpYmVySW1wbChub2RlKSB7XG4gIC8vIE5leHQgd2UnbGwgZHJpbGwgZG93biB0aGlzIGNvbXBvbmVudCB0byBmaW5kIHRoZSBmaXJzdCBIb3N0Q29tcG9uZW50L1RleHQuXG4gIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBub2RlLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIHZhciBjaGlsZCA9IG5vZGUuY2hpbGQ7XG5cbiAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgdmFyIG1hdGNoID0gZmluZEN1cnJlbnRIb3N0RmliZXJJbXBsKGNoaWxkKTtcblxuICAgIGlmIChtYXRjaCAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG1hdGNoO1xuICAgIH1cblxuICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBmaW5kQ3VycmVudEhvc3RGaWJlcldpdGhOb1BvcnRhbHMocGFyZW50KSB7XG4gIHZhciBjdXJyZW50UGFyZW50ID0gZmluZEN1cnJlbnRGaWJlclVzaW5nU2xvd1BhdGgocGFyZW50KTtcbiAgcmV0dXJuIGN1cnJlbnRQYXJlbnQgIT09IG51bGwgPyBmaW5kQ3VycmVudEhvc3RGaWJlcldpdGhOb1BvcnRhbHNJbXBsKGN1cnJlbnRQYXJlbnQpIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gZmluZEN1cnJlbnRIb3N0RmliZXJXaXRoTm9Qb3J0YWxzSW1wbChub2RlKSB7XG4gIC8vIE5leHQgd2UnbGwgZHJpbGwgZG93biB0aGlzIGNvbXBvbmVudCB0byBmaW5kIHRoZSBmaXJzdCBIb3N0Q29tcG9uZW50L1RleHQuXG4gIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBub2RlLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIHZhciBjaGlsZCA9IG5vZGUuY2hpbGQ7XG5cbiAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgaWYgKGNoaWxkLnRhZyAhPT0gSG9zdFBvcnRhbCkge1xuICAgICAgdmFyIG1hdGNoID0gZmluZEN1cnJlbnRIb3N0RmliZXJXaXRoTm9Qb3J0YWxzSW1wbChjaGlsZCk7XG5cbiAgICAgIGlmIChtYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vIFRoaXMgbW9kdWxlIG9ubHkgZXhpc3RzIGFzIGFuIEVTTSB3cmFwcGVyIGFyb3VuZCB0aGUgZXh0ZXJuYWwgQ29tbW9uSlNcbnZhciBzY2hlZHVsZUNhbGxiYWNrID0gU2NoZWR1bGVyLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2s7XG52YXIgY2FuY2VsQ2FsbGJhY2sgPSBTY2hlZHVsZXIudW5zdGFibGVfY2FuY2VsQ2FsbGJhY2s7XG52YXIgc2hvdWxkWWllbGQgPSBTY2hlZHVsZXIudW5zdGFibGVfc2hvdWxkWWllbGQ7XG52YXIgcmVxdWVzdFBhaW50ID0gU2NoZWR1bGVyLnVuc3RhYmxlX3JlcXVlc3RQYWludDtcbnZhciBub3cgPSBTY2hlZHVsZXIudW5zdGFibGVfbm93O1xudmFyIGdldEN1cnJlbnRQcmlvcml0eUxldmVsID0gU2NoZWR1bGVyLnVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsO1xudmFyIEltbWVkaWF0ZVByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5O1xudmFyIFVzZXJCbG9ja2luZ1ByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX1VzZXJCbG9ja2luZ1ByaW9yaXR5O1xudmFyIE5vcm1hbFByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5O1xudmFyIExvd1ByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX0xvd1ByaW9yaXR5O1xudmFyIElkbGVQcmlvcml0eSA9IFNjaGVkdWxlci51bnN0YWJsZV9JZGxlUHJpb3JpdHk7XG4vLyB0aGlzIGRvZXNuJ3QgYWN0dWFsbHkgZXhpc3Qgb24gdGhlIHNjaGVkdWxlciwgYnV0IGl0ICpkb2VzKlxuLy8gb24gc2NoZWR1bGVyL3Vuc3RhYmxlX21vY2ssIHdoaWNoIHdlJ2xsIG5lZWQgZm9yIGludGVybmFsIHRlc3RpbmdcbnZhciB1bnN0YWJsZV95aWVsZFZhbHVlID0gU2NoZWR1bGVyLnVuc3RhYmxlX3lpZWxkVmFsdWU7XG52YXIgdW5zdGFibGVfc2V0RGlzYWJsZVlpZWxkVmFsdWUgPSBTY2hlZHVsZXIudW5zdGFibGVfc2V0RGlzYWJsZVlpZWxkVmFsdWU7XG5cbnZhciByZW5kZXJlcklEID0gbnVsbDtcbnZhciBpbmplY3RlZEhvb2sgPSBudWxsO1xudmFyIGluamVjdGVkUHJvZmlsaW5nSG9va3MgPSBudWxsO1xudmFyIGhhc0xvZ2dlZEVycm9yID0gZmFsc2U7XG52YXIgaXNEZXZUb29sc1ByZXNlbnQgPSB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJztcbmZ1bmN0aW9uIGluamVjdEludGVybmFscyhpbnRlcm5hbHMpIHtcbiAgaWYgKHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gTm8gRGV2VG9vbHNcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgaG9vayA9IF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztcblxuICBpZiAoaG9vay5pc0Rpc2FibGVkKSB7XG4gICAgLy8gVGhpcyBpc24ndCBhIHJlYWwgcHJvcGVydHkgb24gdGhlIGhvb2ssIGJ1dCBpdCBjYW4gYmUgc2V0IHRvIG9wdCBvdXRcbiAgICAvLyBvZiBEZXZUb29scyBpbnRlZ3JhdGlvbiBhbmQgYXNzb2NpYXRlZCB3YXJuaW5ncyBhbmQgbG9ncy5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzM4NzdcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICghaG9vay5zdXBwb3J0c0ZpYmVyKSB7XG4gICAge1xuICAgICAgZXJyb3IoJ1RoZSBpbnN0YWxsZWQgdmVyc2lvbiBvZiBSZWFjdCBEZXZUb29scyBpcyB0b28gb2xkIGFuZCB3aWxsIG5vdCB3b3JrICcgKyAnd2l0aCB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIFJlYWN0LiBQbGVhc2UgdXBkYXRlIFJlYWN0IERldlRvb2xzLiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWFjdC1kZXZ0b29scycpO1xuICAgIH0gLy8gRGV2VG9vbHMgZXhpc3RzLCBldmVuIHRob3VnaCBpdCBkb2Vzbid0IHN1cHBvcnQgRmliZXIuXG5cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBpZiAoZW5hYmxlU2NoZWR1bGluZ1Byb2ZpbGVyKSB7XG4gICAgICAvLyBDb25kaXRpb25hbGx5IGluamVjdCB0aGVzZSBob29rcyBvbmx5IGlmIFRpbWVsaW5lIHByb2ZpbGVyIGlzIHN1cHBvcnRlZCBieSB0aGlzIGJ1aWxkLlxuICAgICAgLy8gVGhpcyBnaXZlcyBEZXZUb29scyBhIHdheSB0byBmZWF0dXJlIGRldGVjdCB0aGF0IGlzbid0IHRpZWQgdG8gdmVyc2lvbiBudW1iZXJcbiAgICAgIC8vIChzaW5jZSBwcm9maWxpbmcgYW5kIHRpbWVsaW5lIGFyZSBjb250cm9sbGVkIGJ5IGRpZmZlcmVudCBmZWF0dXJlIGZsYWdzKS5cbiAgICAgIGludGVybmFscyA9IGFzc2lnbih7fSwgaW50ZXJuYWxzLCB7XG4gICAgICAgIGdldExhbmVMYWJlbE1hcDogZ2V0TGFuZUxhYmVsTWFwLFxuICAgICAgICBpbmplY3RQcm9maWxpbmdIb29rczogaW5qZWN0UHJvZmlsaW5nSG9va3NcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlbmRlcmVySUQgPSBob29rLmluamVjdChpbnRlcm5hbHMpOyAvLyBXZSBoYXZlIHN1Y2Nlc3NmdWxseSBpbmplY3RlZCwgc28gbm93IGl0IGlzIHNhZmUgdG8gc2V0IHVwIGhvb2tzLlxuXG4gICAgaW5qZWN0ZWRIb29rID0gaG9vaztcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gQ2F0Y2ggYWxsIGVycm9ycyBiZWNhdXNlIGl0IGlzIHVuc2FmZSB0byB0aHJvdyBkdXJpbmcgaW5pdGlhbGl6YXRpb24uXG4gICAge1xuICAgICAgZXJyb3IoJ1JlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJXMuJywgZXJyKTtcbiAgICB9XG4gIH1cblxuICBpZiAoaG9vay5jaGVja0RDRSkge1xuICAgIC8vIFRoaXMgaXMgdGhlIHJlYWwgRGV2VG9vbHMuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyBsaWtlbHkgYSBob29rIGluc3RhbGxlZCBieSBGYXN0IFJlZnJlc2ggcnVudGltZS5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIG9uU2NoZWR1bGVSb290KHJvb3QsIGNoaWxkcmVuKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRIb29rICYmIHR5cGVvZiBpbmplY3RlZEhvb2sub25TY2hlZHVsZUZpYmVyUm9vdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaW5qZWN0ZWRIb29rLm9uU2NoZWR1bGVGaWJlclJvb3QocmVuZGVyZXJJRCwgcm9vdCwgY2hpbGRyZW4pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmICggIWhhc0xvZ2dlZEVycm9yKSB7XG4gICAgICAgICAgaGFzTG9nZ2VkRXJyb3IgPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJ1JlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJXMnLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBvbkNvbW1pdFJvb3Qocm9vdCwgZXZlbnRQcmlvcml0eSkge1xuICBpZiAoaW5qZWN0ZWRIb29rICYmIHR5cGVvZiBpbmplY3RlZEhvb2sub25Db21taXRGaWJlclJvb3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0cnkge1xuICAgICAgdmFyIGRpZEVycm9yID0gKHJvb3QuY3VycmVudC5mbGFncyAmIERpZENhcHR1cmUpID09PSBEaWRDYXB0dXJlO1xuXG4gICAgICBpZiAoZW5hYmxlUHJvZmlsZXJUaW1lcikge1xuICAgICAgICB2YXIgc2NoZWR1bGVyUHJpb3JpdHk7XG5cbiAgICAgICAgc3dpdGNoIChldmVudFByaW9yaXR5KSB7XG4gICAgICAgICAgY2FzZSBEaXNjcmV0ZUV2ZW50UHJpb3JpdHk6XG4gICAgICAgICAgICBzY2hlZHVsZXJQcmlvcml0eSA9IEltbWVkaWF0ZVByaW9yaXR5O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIENvbnRpbnVvdXNFdmVudFByaW9yaXR5OlxuICAgICAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHkgPSBVc2VyQmxvY2tpbmdQcmlvcml0eTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBEZWZhdWx0RXZlbnRQcmlvcml0eTpcbiAgICAgICAgICAgIHNjaGVkdWxlclByaW9yaXR5ID0gTm9ybWFsUHJpb3JpdHk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgSWRsZUV2ZW50UHJpb3JpdHk6XG4gICAgICAgICAgICBzY2hlZHVsZXJQcmlvcml0eSA9IElkbGVQcmlvcml0eTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHNjaGVkdWxlclByaW9yaXR5ID0gTm9ybWFsUHJpb3JpdHk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGluamVjdGVkSG9vay5vbkNvbW1pdEZpYmVyUm9vdChyZW5kZXJlcklELCByb290LCBzY2hlZHVsZXJQcmlvcml0eSwgZGlkRXJyb3IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJSb290KHJlbmRlcmVySUQsIHJvb3QsIHVuZGVmaW5lZCwgZGlkRXJyb3IpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAge1xuICAgICAgICBpZiAoIWhhc0xvZ2dlZEVycm9yKSB7XG4gICAgICAgICAgaGFzTG9nZ2VkRXJyb3IgPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJ1JlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJXMnLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBvblBvc3RDb21taXRSb290KHJvb3QpIHtcbiAgaWYgKGluamVjdGVkSG9vayAmJiB0eXBlb2YgaW5qZWN0ZWRIb29rLm9uUG9zdENvbW1pdEZpYmVyUm9vdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICBpbmplY3RlZEhvb2sub25Qb3N0Q29tbWl0RmliZXJSb290KHJlbmRlcmVySUQsIHJvb3QpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAge1xuICAgICAgICBpZiAoIWhhc0xvZ2dlZEVycm9yKSB7XG4gICAgICAgICAgaGFzTG9nZ2VkRXJyb3IgPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJ1JlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJXMnLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBvbkNvbW1pdFVubW91bnQoZmliZXIpIHtcbiAgaWYgKGluamVjdGVkSG9vayAmJiB0eXBlb2YgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJVbm1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGluamVjdGVkSG9vay5vbkNvbW1pdEZpYmVyVW5tb3VudChyZW5kZXJlcklELCBmaWJlcik7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB7XG4gICAgICAgIGlmICghaGFzTG9nZ2VkRXJyb3IpIHtcbiAgICAgICAgICBoYXNMb2dnZWRFcnJvciA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignUmVhY3QgaW5zdHJ1bWVudGF0aW9uIGVuY291bnRlcmVkIGFuIGVycm9yOiAlcycsIGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKG5ld0lzU3RyaWN0TW9kZSkge1xuICB7XG4gICAgaWYgKHR5cGVvZiB1bnN0YWJsZV95aWVsZFZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBXZSdyZSBpbiBhIHRlc3QgYmVjYXVzZSBTY2hlZHVsZXIudW5zdGFibGVfeWllbGRWYWx1ZSBvbmx5IGV4aXN0c1xuICAgICAgLy8gaW4gU2NoZWR1bGVyTW9jay4gVG8gcmVkdWNlIHRoZSBub2lzZSBpbiBzdHJpY3QgbW9kZSB0ZXN0cyxcbiAgICAgIC8vIHN1cHByZXNzIHdhcm5pbmdzIGFuZCBkaXNhYmxlIHNjaGVkdWxlciB5aWVsZGluZyBkdXJpbmcgdGhlIGRvdWJsZSByZW5kZXJcbiAgICAgIHVuc3RhYmxlX3NldERpc2FibGVZaWVsZFZhbHVlKG5ld0lzU3RyaWN0TW9kZSk7XG4gICAgICBzZXRTdXBwcmVzc1dhcm5pbmcobmV3SXNTdHJpY3RNb2RlKTtcbiAgICB9XG5cbiAgICBpZiAoaW5qZWN0ZWRIb29rICYmIHR5cGVvZiBpbmplY3RlZEhvb2suc2V0U3RyaWN0TW9kZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaW5qZWN0ZWRIb29rLnNldFN0cmljdE1vZGUocmVuZGVyZXJJRCwgbmV3SXNTdHJpY3RNb2RlKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB7XG4gICAgICAgICAgaWYgKCFoYXNMb2dnZWRFcnJvcikge1xuICAgICAgICAgICAgaGFzTG9nZ2VkRXJyb3IgPSB0cnVlO1xuXG4gICAgICAgICAgICBlcnJvcignUmVhY3QgaW5zdHJ1bWVudGF0aW9uIGVuY291bnRlcmVkIGFuIGVycm9yOiAlcycsIGVycik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59IC8vIFByb2ZpbGVyIEFQSSBob29rc1xuXG5mdW5jdGlvbiBpbmplY3RQcm9maWxpbmdIb29rcyhwcm9maWxpbmdIb29rcykge1xuICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzID0gcHJvZmlsaW5nSG9va3M7XG59XG5cbmZ1bmN0aW9uIGdldExhbmVMYWJlbE1hcCgpIHtcbiAge1xuICAgIHZhciBtYXAgPSBuZXcgTWFwKCk7XG4gICAgdmFyIGxhbmUgPSAxO1xuXG4gICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IFRvdGFsTGFuZXM7IGluZGV4KyspIHtcbiAgICAgIHZhciBsYWJlbCA9IGdldExhYmVsRm9yTGFuZShsYW5lKTtcbiAgICAgIG1hcC5zZXQobGFuZSwgbGFiZWwpO1xuICAgICAgbGFuZSAqPSAyO1xuICAgIH1cblxuICAgIHJldHVybiBtYXA7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFya0NvbW1pdFN0YXJ0ZWQobGFuZXMpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21taXRTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21taXRTdGFydGVkKGxhbmVzKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21taXRTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbW1pdFN0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbW1pdFN0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UmVuZGVyU3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UmVuZGVyU3RhcnRlZChmaWJlcik7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RhcnRlZChmaWJlcikge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0YXJ0ZWQoZmliZXIpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RhcnRlZChmaWJlcikge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdGFydGVkKGZpYmVyKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0YXJ0ZWQoZmliZXIpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RhcnRlZChmaWJlcik7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0YXJ0ZWQoZmliZXIpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0YXJ0ZWQoZmliZXIpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudEVycm9yZWQoZmliZXIsIHRocm93blZhbHVlLCBsYW5lcykge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudEVycm9yZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudEVycm9yZWQoZmliZXIsIHRocm93blZhbHVlLCBsYW5lcyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50U3VzcGVuZGVkKGZpYmVyLCB3YWtlYWJsZSwgbGFuZXMpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRTdXNwZW5kZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFN1c3BlbmRlZChmaWJlciwgd2FrZWFibGUsIGxhbmVzKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtMYXlvdXRFZmZlY3RzU3RhcnRlZChsYW5lcykge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0xheW91dEVmZmVjdHNTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtMYXlvdXRFZmZlY3RzU3RhcnRlZChsYW5lcyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrTGF5b3V0RWZmZWN0c1N0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrTGF5b3V0RWZmZWN0c1N0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0xheW91dEVmZmVjdHNTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrUGFzc2l2ZUVmZmVjdHNTdGFydGVkKGxhbmVzKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUGFzc2l2ZUVmZmVjdHNTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtQYXNzaXZlRWZmZWN0c1N0YXJ0ZWQobGFuZXMpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya1Bhc3NpdmVFZmZlY3RzU3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtQYXNzaXZlRWZmZWN0c1N0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1Bhc3NpdmVFZmZlY3RzU3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya1JlbmRlclN0YXJ0ZWQobGFuZXMpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtSZW5kZXJTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtSZW5kZXJTdGFydGVkKGxhbmVzKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtSZW5kZXJZaWVsZGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlcllpZWxkZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlcllpZWxkZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtSZW5kZXJTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlclN0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlclN0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtSZW5kZXJTY2hlZHVsZWQobGFuZSkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlclNjaGVkdWxlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyU2NoZWR1bGVkKGxhbmUpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0ZvcmNlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrRm9yY2VVcGRhdGVTY2hlZHVsZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0ZvcmNlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtTdGF0ZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1N0YXRlVXBkYXRlU2NoZWR1bGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtTdGF0ZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSk7XG4gICAgfVxuICB9XG59XG5cbnZhciBOb01vZGUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjA7IC8vIFRPRE86IFJlbW92ZSBDb25jdXJyZW50TW9kZSBieSByZWFkaW5nIGZyb20gdGhlIHJvb3QgdGFnIGluc3RlYWRcblxudmFyIENvbmN1cnJlbnRNb2RlID1cbi8qICAgICAgICAgICAgICAgICAqL1xuMTtcbnZhciBQcm9maWxlTW9kZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgKi9cbjI7XG52YXIgU3RyaWN0TGVnYWN5TW9kZSA9XG4vKiAgICAgICAgICAgICAgICovXG44O1xudmFyIFN0cmljdEVmZmVjdHNNb2RlID1cbi8qICAgICAgICAgICAgICAqL1xuMTY7XG5cbi8vIFRPRE86IFRoaXMgaXMgcHJldHR5IHdlbGwgc3VwcG9ydGVkIGJ5IGJyb3dzZXJzLiBNYXliZSB3ZSBjYW4gZHJvcCBpdC5cbnZhciBjbHozMiA9IE1hdGguY2x6MzIgPyBNYXRoLmNsejMyIDogY2x6MzJGYWxsYmFjazsgLy8gQ291bnQgbGVhZGluZyB6ZXJvcy5cbi8vIEJhc2VkIG9uOlxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvTWF0aC9jbHozMlxuXG52YXIgbG9nID0gTWF0aC5sb2c7XG52YXIgTE4yID0gTWF0aC5MTjI7XG5cbmZ1bmN0aW9uIGNsejMyRmFsbGJhY2soeCkge1xuICB2YXIgYXNVaW50ID0geCA+Pj4gMDtcblxuICBpZiAoYXNVaW50ID09PSAwKSB7XG4gICAgcmV0dXJuIDMyO1xuICB9XG5cbiAgcmV0dXJuIDMxIC0gKGxvZyhhc1VpbnQpIC8gTE4yIHwgMCkgfCAwO1xufVxuXG4vLyBJZiB0aG9zZSB2YWx1ZXMgYXJlIGNoYW5nZWQgdGhhdCBwYWNrYWdlIHNob3VsZCBiZSByZWJ1aWx0IGFuZCByZWRlcGxveWVkLlxuXG52YXIgVG90YWxMYW5lcyA9IDMxO1xudmFyIE5vTGFuZXMgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuMDtcbnZhciBOb0xhbmUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICovXG4wO1xudmFyIFN5bmNMYW5lID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjE7XG52YXIgSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZSA9XG4vKiAgICAqL1xuMjtcbnZhciBJbnB1dENvbnRpbnVvdXNMYW5lID1cbi8qICAgICAgICAgICAgICovXG40O1xudmFyIERlZmF1bHRIeWRyYXRpb25MYW5lID1cbi8qICAgICAgICAgICAgKi9cbjg7XG52YXIgRGVmYXVsdExhbmUgPVxuLyogICAgICAgICAgICAgICAgICAgICAqL1xuMTY7XG52YXIgVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmUgPVxuLyogICAgICAgICAgICAgICAgKi9cbjMyO1xudmFyIFRyYW5zaXRpb25MYW5lcyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjQxOTQyNDA7XG52YXIgVHJhbnNpdGlvbkxhbmUxID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjY0O1xudmFyIFRyYW5zaXRpb25MYW5lMiA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4xMjg7XG52YXIgVHJhbnNpdGlvbkxhbmUzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjI1NjtcbnZhciBUcmFuc2l0aW9uTGFuZTQgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuNTEyO1xudmFyIFRyYW5zaXRpb25MYW5lNSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4xMDI0O1xudmFyIFRyYW5zaXRpb25MYW5lNiA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4yMDQ4O1xudmFyIFRyYW5zaXRpb25MYW5lNyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG40MDk2O1xudmFyIFRyYW5zaXRpb25MYW5lOCA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG44MTkyO1xudmFyIFRyYW5zaXRpb25MYW5lOSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4xNjM4NDtcbnZhciBUcmFuc2l0aW9uTGFuZTEwID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuMzI3Njg7XG52YXIgVHJhbnNpdGlvbkxhbmUxMSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjY1NTM2O1xudmFyIFRyYW5zaXRpb25MYW5lMTIgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG4xMzEwNzI7XG52YXIgVHJhbnNpdGlvbkxhbmUxMyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjI2MjE0NDtcbnZhciBUcmFuc2l0aW9uTGFuZTE0ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuNTI0Mjg4O1xudmFyIFRyYW5zaXRpb25MYW5lMTUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG4xMDQ4NTc2O1xudmFyIFRyYW5zaXRpb25MYW5lMTYgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG4yMDk3MTUyO1xudmFyIFJldHJ5TGFuZXMgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjEzMDAyMzQyNDtcbnZhciBSZXRyeUxhbmUxID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuNDE5NDMwNDtcbnZhciBSZXRyeUxhbmUyID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuODM4ODYwODtcbnZhciBSZXRyeUxhbmUzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTY3NzcyMTY7XG52YXIgUmV0cnlMYW5lNCA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjMzNTU0NDMyO1xudmFyIFJldHJ5TGFuZTUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG42NzEwODg2NDtcbnZhciBTb21lUmV0cnlMYW5lID0gUmV0cnlMYW5lMTtcbnZhciBTZWxlY3RpdmVIeWRyYXRpb25MYW5lID1cbi8qICAgICAgICAgICovXG4xMzQyMTc3Mjg7XG52YXIgTm9uSWRsZUxhbmVzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuMjY4NDM1NDU1O1xudmFyIElkbGVIeWRyYXRpb25MYW5lID1cbi8qICAgICAgICAgICAgICAgKi9cbjI2ODQzNTQ1NjtcbnZhciBJZGxlTGFuZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG41MzY4NzA5MTI7XG52YXIgT2Zmc2NyZWVuTGFuZSA9XG4vKiAgICAgICAgICAgICAgICAgICAqL1xuMTA3Mzc0MTgyNDsgLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciB0aGUgZXhwZXJpbWVudGFsIHRpbWVsaW5lIChyZWFjdC1kZXZ0b29scy10aW1lbGluZSlcbi8vIEl0IHNob3VsZCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgTGFuZXMgdmFsdWVzIGFib3ZlLlxuXG5mdW5jdGlvbiBnZXRMYWJlbEZvckxhbmUobGFuZSkge1xuICB7XG4gICAgaWYgKGxhbmUgJiBTeW5jTGFuZSkge1xuICAgICAgcmV0dXJuICdTeW5jJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIElucHV0Q29udGludW91c0h5ZHJhdGlvbkxhbmUpIHtcbiAgICAgIHJldHVybiAnSW5wdXRDb250aW51b3VzSHlkcmF0aW9uJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIElucHV0Q29udGludW91c0xhbmUpIHtcbiAgICAgIHJldHVybiAnSW5wdXRDb250aW51b3VzJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIERlZmF1bHRIeWRyYXRpb25MYW5lKSB7XG4gICAgICByZXR1cm4gJ0RlZmF1bHRIeWRyYXRpb24nO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgRGVmYXVsdExhbmUpIHtcbiAgICAgIHJldHVybiAnRGVmYXVsdCc7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBUcmFuc2l0aW9uSHlkcmF0aW9uTGFuZSkge1xuICAgICAgcmV0dXJuICdUcmFuc2l0aW9uSHlkcmF0aW9uJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIFRyYW5zaXRpb25MYW5lcykge1xuICAgICAgcmV0dXJuICdUcmFuc2l0aW9uJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIFJldHJ5TGFuZXMpIHtcbiAgICAgIHJldHVybiAnUmV0cnknO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgU2VsZWN0aXZlSHlkcmF0aW9uTGFuZSkge1xuICAgICAgcmV0dXJuICdTZWxlY3RpdmVIeWRyYXRpb24nO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgSWRsZUh5ZHJhdGlvbkxhbmUpIHtcbiAgICAgIHJldHVybiAnSWRsZUh5ZHJhdGlvbic7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBJZGxlTGFuZSkge1xuICAgICAgcmV0dXJuICdJZGxlJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIE9mZnNjcmVlbkxhbmUpIHtcbiAgICAgIHJldHVybiAnT2Zmc2NyZWVuJztcbiAgICB9XG4gIH1cbn1cbnZhciBOb1RpbWVzdGFtcCA9IC0xO1xudmFyIG5leHRUcmFuc2l0aW9uTGFuZSA9IFRyYW5zaXRpb25MYW5lMTtcbnZhciBuZXh0UmV0cnlMYW5lID0gUmV0cnlMYW5lMTtcblxuZnVuY3Rpb24gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMobGFuZXMpIHtcbiAgc3dpdGNoIChnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKGxhbmVzKSkge1xuICAgIGNhc2UgU3luY0xhbmU6XG4gICAgICByZXR1cm4gU3luY0xhbmU7XG5cbiAgICBjYXNlIElucHV0Q29udGludW91c0h5ZHJhdGlvbkxhbmU6XG4gICAgICByZXR1cm4gSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZTtcblxuICAgIGNhc2UgSW5wdXRDb250aW51b3VzTGFuZTpcbiAgICAgIHJldHVybiBJbnB1dENvbnRpbnVvdXNMYW5lO1xuXG4gICAgY2FzZSBEZWZhdWx0SHlkcmF0aW9uTGFuZTpcbiAgICAgIHJldHVybiBEZWZhdWx0SHlkcmF0aW9uTGFuZTtcblxuICAgIGNhc2UgRGVmYXVsdExhbmU6XG4gICAgICByZXR1cm4gRGVmYXVsdExhbmU7XG5cbiAgICBjYXNlIFRyYW5zaXRpb25IeWRyYXRpb25MYW5lOlxuICAgICAgcmV0dXJuIFRyYW5zaXRpb25IeWRyYXRpb25MYW5lO1xuXG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTI6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTM6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTQ6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTU6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTY6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTc6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTg6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTk6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEwOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTI6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEzOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTU6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE2OlxuICAgICAgcmV0dXJuIGxhbmVzICYgVHJhbnNpdGlvbkxhbmVzO1xuXG4gICAgY2FzZSBSZXRyeUxhbmUxOlxuICAgIGNhc2UgUmV0cnlMYW5lMjpcbiAgICBjYXNlIFJldHJ5TGFuZTM6XG4gICAgY2FzZSBSZXRyeUxhbmU0OlxuICAgIGNhc2UgUmV0cnlMYW5lNTpcbiAgICAgIHJldHVybiBsYW5lcyAmIFJldHJ5TGFuZXM7XG5cbiAgICBjYXNlIFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmU6XG4gICAgICByZXR1cm4gU2VsZWN0aXZlSHlkcmF0aW9uTGFuZTtcblxuICAgIGNhc2UgSWRsZUh5ZHJhdGlvbkxhbmU6XG4gICAgICByZXR1cm4gSWRsZUh5ZHJhdGlvbkxhbmU7XG5cbiAgICBjYXNlIElkbGVMYW5lOlxuICAgICAgcmV0dXJuIElkbGVMYW5lO1xuXG4gICAgY2FzZSBPZmZzY3JlZW5MYW5lOlxuICAgICAgcmV0dXJuIE9mZnNjcmVlbkxhbmU7XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICBlcnJvcignU2hvdWxkIGhhdmUgZm91bmQgbWF0Y2hpbmcgbGFuZXMuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuJyk7XG4gICAgICB9IC8vIFRoaXMgc2hvdWxkbid0IGJlIHJlYWNoYWJsZSwgYnV0IGFzIGEgZmFsbGJhY2ssIHJldHVybiB0aGUgZW50aXJlIGJpdG1hc2suXG5cblxuICAgICAgcmV0dXJuIGxhbmVzO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldE5leHRMYW5lcyhyb290LCB3aXBMYW5lcykge1xuICAvLyBFYXJseSBiYWlsb3V0IGlmIHRoZXJlJ3Mgbm8gcGVuZGluZyB3b3JrIGxlZnQuXG4gIHZhciBwZW5kaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lcztcblxuICBpZiAocGVuZGluZ0xhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgcmV0dXJuIE5vTGFuZXM7XG4gIH1cblxuICB2YXIgbmV4dExhbmVzID0gTm9MYW5lcztcbiAgdmFyIHN1c3BlbmRlZExhbmVzID0gcm9vdC5zdXNwZW5kZWRMYW5lcztcbiAgdmFyIHBpbmdlZExhbmVzID0gcm9vdC5waW5nZWRMYW5lczsgLy8gRG8gbm90IHdvcmsgb24gYW55IGlkbGUgd29yayB1bnRpbCBhbGwgdGhlIG5vbi1pZGxlIHdvcmsgaGFzIGZpbmlzaGVkLFxuICAvLyBldmVuIGlmIHRoZSB3b3JrIGlzIHN1c3BlbmRlZC5cblxuICB2YXIgbm9uSWRsZVBlbmRpbmdMYW5lcyA9IHBlbmRpbmdMYW5lcyAmIE5vbklkbGVMYW5lcztcblxuICBpZiAobm9uSWRsZVBlbmRpbmdMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgIHZhciBub25JZGxlVW5ibG9ja2VkTGFuZXMgPSBub25JZGxlUGVuZGluZ0xhbmVzICYgfnN1c3BlbmRlZExhbmVzO1xuXG4gICAgaWYgKG5vbklkbGVVbmJsb2NrZWRMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgbmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMobm9uSWRsZVVuYmxvY2tlZExhbmVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG5vbklkbGVQaW5nZWRMYW5lcyA9IG5vbklkbGVQZW5kaW5nTGFuZXMgJiBwaW5nZWRMYW5lcztcblxuICAgICAgaWYgKG5vbklkbGVQaW5nZWRMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgICBuZXh0TGFuZXMgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyhub25JZGxlUGluZ2VkTGFuZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBUaGUgb25seSByZW1haW5pbmcgd29yayBpcyBJZGxlLlxuICAgIHZhciB1bmJsb2NrZWRMYW5lcyA9IHBlbmRpbmdMYW5lcyAmIH5zdXNwZW5kZWRMYW5lcztcblxuICAgIGlmICh1bmJsb2NrZWRMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgbmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXModW5ibG9ja2VkTGFuZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocGluZ2VkTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgICAgbmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMocGluZ2VkTGFuZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChuZXh0TGFuZXMgPT09IE5vTGFuZXMpIHtcbiAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGJlIHJlYWNoYWJsZSBpZiB3ZSdyZSBzdXNwZW5kZWRcbiAgICAvLyBUT0RPOiBDb25zaWRlciB3YXJuaW5nIGluIHRoaXMgcGF0aCBpZiBhIGZhbGxiYWNrIHRpbWVyIGlzIG5vdCBzY2hlZHVsZWQuXG4gICAgcmV0dXJuIE5vTGFuZXM7XG4gIH0gLy8gSWYgd2UncmUgYWxyZWFkeSBpbiB0aGUgbWlkZGxlIG9mIGEgcmVuZGVyLCBzd2l0Y2hpbmcgbGFuZXMgd2lsbCBpbnRlcnJ1cHRcbiAgLy8gaXQgYW5kIHdlJ2xsIGxvc2Ugb3VyIHByb2dyZXNzLiBXZSBzaG91bGQgb25seSBkbyB0aGlzIGlmIHRoZSBuZXcgbGFuZXMgYXJlXG4gIC8vIGhpZ2hlciBwcmlvcml0eS5cblxuXG4gIGlmICh3aXBMYW5lcyAhPT0gTm9MYW5lcyAmJiB3aXBMYW5lcyAhPT0gbmV4dExhbmVzICYmIC8vIElmIHdlIGFscmVhZHkgc3VzcGVuZGVkIHdpdGggYSBkZWxheSwgdGhlbiBpbnRlcnJ1cHRpbmcgaXMgZmluZS4gRG9uJ3RcbiAgLy8gYm90aGVyIHdhaXRpbmcgdW50aWwgdGhlIHJvb3QgaXMgY29tcGxldGUuXG4gICh3aXBMYW5lcyAmIHN1c3BlbmRlZExhbmVzKSA9PT0gTm9MYW5lcykge1xuICAgIHZhciBuZXh0TGFuZSA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobmV4dExhbmVzKTtcbiAgICB2YXIgd2lwTGFuZSA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmUod2lwTGFuZXMpO1xuXG4gICAgaWYgKCAvLyBUZXN0cyB3aGV0aGVyIHRoZSBuZXh0IGxhbmUgaXMgZXF1YWwgb3IgbG93ZXIgcHJpb3JpdHkgdGhhbiB0aGUgd2lwXG4gICAgLy8gb25lLiBUaGlzIHdvcmtzIGJlY2F1c2UgdGhlIGJpdHMgZGVjcmVhc2UgaW4gcHJpb3JpdHkgYXMgeW91IGdvIGxlZnQuXG4gICAgbmV4dExhbmUgPj0gd2lwTGFuZSB8fCAvLyBEZWZhdWx0IHByaW9yaXR5IHVwZGF0ZXMgc2hvdWxkIG5vdCBpbnRlcnJ1cHQgdHJhbnNpdGlvbiB1cGRhdGVzLiBUaGVcbiAgICAvLyBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiBkZWZhdWx0IHVwZGF0ZXMgYW5kIHRyYW5zaXRpb24gdXBkYXRlcyBpcyB0aGF0XG4gICAgLy8gZGVmYXVsdCB1cGRhdGVzIGRvIG5vdCBzdXBwb3J0IHJlZnJlc2ggdHJhbnNpdGlvbnMuXG4gICAgbmV4dExhbmUgPT09IERlZmF1bHRMYW5lICYmICh3aXBMYW5lICYgVHJhbnNpdGlvbkxhbmVzKSAhPT0gTm9MYW5lcykge1xuICAgICAgLy8gS2VlcCB3b3JraW5nIG9uIHRoZSBleGlzdGluZyBpbi1wcm9ncmVzcyB0cmVlLiBEbyBub3QgaW50ZXJydXB0LlxuICAgICAgcmV0dXJuIHdpcExhbmVzO1xuICAgIH1cbiAgfVxuXG4gIGlmICgobmV4dExhbmVzICYgSW5wdXRDb250aW51b3VzTGFuZSkgIT09IE5vTGFuZXMpIHtcbiAgICAvLyBXaGVuIHVwZGF0ZXMgYXJlIHN5bmMgYnkgZGVmYXVsdCwgd2UgZW50YW5nbGUgY29udGludW91cyBwcmlvcml0eSB1cGRhdGVzXG4gICAgLy8gYW5kIGRlZmF1bHQgdXBkYXRlcywgc28gdGhleSByZW5kZXIgaW4gdGhlIHNhbWUgYmF0Y2guIFRoZSBvbmx5IHJlYXNvblxuICAgIC8vIHRoZXkgdXNlIHNlcGFyYXRlIGxhbmVzIGlzIGJlY2F1c2UgY29udGludW91cyB1cGRhdGVzIHNob3VsZCBpbnRlcnJ1cHRcbiAgICAvLyB0cmFuc2l0aW9ucywgYnV0IGRlZmF1bHQgdXBkYXRlcyBzaG91bGQgbm90LlxuICAgIG5leHRMYW5lcyB8PSBwZW5kaW5nTGFuZXMgJiBEZWZhdWx0TGFuZTtcbiAgfSAvLyBDaGVjayBmb3IgZW50YW5nbGVkIGxhbmVzIGFuZCBhZGQgdGhlbSB0byB0aGUgYmF0Y2guXG4gIC8vXG4gIC8vIEEgbGFuZSBpcyBzYWlkIHRvIGJlIGVudGFuZ2xlZCB3aXRoIGFub3RoZXIgd2hlbiBpdCdzIG5vdCBhbGxvd2VkIHRvIHJlbmRlclxuICAvLyBpbiBhIGJhdGNoIHRoYXQgZG9lcyBub3QgYWxzbyBpbmNsdWRlIHRoZSBvdGhlciBsYW5lLiBUeXBpY2FsbHkgd2UgZG8gdGhpc1xuICAvLyB3aGVuIG11bHRpcGxlIHVwZGF0ZXMgaGF2ZSB0aGUgc2FtZSBzb3VyY2UsIGFuZCB3ZSBvbmx5IHdhbnQgdG8gcmVzcG9uZCB0b1xuICAvLyB0aGUgbW9zdCByZWNlbnQgZXZlbnQgZnJvbSB0aGF0IHNvdXJjZS5cbiAgLy9cbiAgLy8gTm90ZSB0aGF0IHdlIGFwcGx5IGVudGFuZ2xlbWVudHMgKmFmdGVyKiBjaGVja2luZyBmb3IgcGFydGlhbCB3b3JrIGFib3ZlLlxuICAvLyBUaGlzIG1lYW5zIHRoYXQgaWYgYSBsYW5lIGlzIGVudGFuZ2xlZCBkdXJpbmcgYW4gaW50ZXJsZWF2ZWQgZXZlbnQgd2hpbGVcbiAgLy8gaXQncyBhbHJlYWR5IHJlbmRlcmluZywgd2Ugd29uJ3QgaW50ZXJydXB0IGl0LiBUaGlzIGlzIGludGVudGlvbmFsLCBzaW5jZVxuICAvLyBlbnRhbmdsZW1lbnQgaXMgdXN1YWxseSBcImJlc3QgZWZmb3J0XCI6IHdlJ2xsIHRyeSBvdXIgYmVzdCB0byByZW5kZXIgdGhlXG4gIC8vIGxhbmVzIGluIHRoZSBzYW1lIGJhdGNoLCBidXQgaXQncyBub3Qgd29ydGggdGhyb3dpbmcgb3V0IHBhcnRpYWxseVxuICAvLyBjb21wbGV0ZWQgd29yayBpbiBvcmRlciB0byBkbyBpdC5cbiAgLy8gVE9ETzogUmVjb25zaWRlciB0aGlzLiBUaGUgY291bnRlci1hcmd1bWVudCBpcyB0aGF0IHRoZSBwYXJ0aWFsIHdvcmtcbiAgLy8gcmVwcmVzZW50cyBhbiBpbnRlcm1lZGlhdGUgc3RhdGUsIHdoaWNoIHdlIGRvbid0IHdhbnQgdG8gc2hvdyB0byB0aGUgdXNlci5cbiAgLy8gQW5kIGJ5IHNwZW5kaW5nIGV4dHJhIHRpbWUgZmluaXNoaW5nIGl0LCB3ZSdyZSBpbmNyZWFzaW5nIHRoZSBhbW91bnQgb2ZcbiAgLy8gdGltZSBpdCB0YWtlcyB0byBzaG93IHRoZSBmaW5hbCBzdGF0ZSwgd2hpY2ggaXMgd2hhdCB0aGV5IGFyZSBhY3R1YWxseVxuICAvLyB3YWl0aW5nIGZvci5cbiAgLy9cbiAgLy8gRm9yIHRob3NlIGV4Y2VwdGlvbnMgd2hlcmUgZW50YW5nbGVtZW50IGlzIHNlbWFudGljYWxseSBpbXBvcnRhbnQsIGxpa2VcbiAgLy8gdXNlTXV0YWJsZVNvdXJjZSwgd2Ugc2hvdWxkIGVuc3VyZSB0aGF0IHRoZXJlIGlzIG5vIHBhcnRpYWwgd29yayBhdCB0aGVcbiAgLy8gdGltZSB3ZSBhcHBseSB0aGUgZW50YW5nbGVtZW50LlxuXG5cbiAgdmFyIGVudGFuZ2xlZExhbmVzID0gcm9vdC5lbnRhbmdsZWRMYW5lcztcblxuICBpZiAoZW50YW5nbGVkTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICB2YXIgZW50YW5nbGVtZW50cyA9IHJvb3QuZW50YW5nbGVtZW50cztcbiAgICB2YXIgbGFuZXMgPSBuZXh0TGFuZXMgJiBlbnRhbmdsZWRMYW5lcztcblxuICAgIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpO1xuICAgICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgICAgbmV4dExhbmVzIHw9IGVudGFuZ2xlbWVudHNbaW5kZXhdO1xuICAgICAgbGFuZXMgJj0gfmxhbmU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5leHRMYW5lcztcbn1cbmZ1bmN0aW9uIGdldE1vc3RSZWNlbnRFdmVudFRpbWUocm9vdCwgbGFuZXMpIHtcbiAgdmFyIGV2ZW50VGltZXMgPSByb290LmV2ZW50VGltZXM7XG4gIHZhciBtb3N0UmVjZW50RXZlbnRUaW1lID0gTm9UaW1lc3RhbXA7XG5cbiAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICB2YXIgZXZlbnRUaW1lID0gZXZlbnRUaW1lc1tpbmRleF07XG5cbiAgICBpZiAoZXZlbnRUaW1lID4gbW9zdFJlY2VudEV2ZW50VGltZSkge1xuICAgICAgbW9zdFJlY2VudEV2ZW50VGltZSA9IGV2ZW50VGltZTtcbiAgICB9XG5cbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxuXG4gIHJldHVybiBtb3N0UmVjZW50RXZlbnRUaW1lO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlRXhwaXJhdGlvblRpbWUobGFuZSwgY3VycmVudFRpbWUpIHtcbiAgc3dpdGNoIChsYW5lKSB7XG4gICAgY2FzZSBTeW5jTGFuZTpcbiAgICBjYXNlIElucHV0Q29udGludW91c0h5ZHJhdGlvbkxhbmU6XG4gICAgY2FzZSBJbnB1dENvbnRpbnVvdXNMYW5lOlxuICAgICAgLy8gVXNlciBpbnRlcmFjdGlvbnMgc2hvdWxkIGV4cGlyZSBzbGlnaHRseSBtb3JlIHF1aWNrbHkuXG4gICAgICAvL1xuICAgICAgLy8gTk9URTogVGhpcyBpcyBzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgY29uc3RhbnQgYXMgaW4gU2NoZWR1bGVyLmpzLlxuICAgICAgLy8gV2hlbiB3ZSBtYWRlIGl0IGxhcmdlciwgYSBwcm9kdWN0IG1ldHJpYyBpbiB3d3cgcmVncmVzc2VkLCBzdWdnZXN0aW5nXG4gICAgICAvLyB0aGVyZSdzIGEgdXNlciBpbnRlcmFjdGlvbiB0aGF0J3MgYmVpbmcgc3RhcnZlZCBieSBhIHNlcmllcyBvZlxuICAgICAgLy8gc3luY2hyb25vdXMgdXBkYXRlcy4gSWYgdGhhdCB0aGVvcnkgaXMgY29ycmVjdCwgdGhlIHByb3BlciBzb2x1dGlvbiBpc1xuICAgICAgLy8gdG8gZml4IHRoZSBzdGFydmF0aW9uLiBIb3dldmVyLCB0aGlzIHNjZW5hcmlvIHN1cHBvcnRzIHRoZSBpZGVhIHRoYXRcbiAgICAgIC8vIGV4cGlyYXRpb24gdGltZXMgYXJlIGFuIGltcG9ydGFudCBzYWZlZ3VhcmQgd2hlbiBzdGFydmF0aW9uXG4gICAgICAvLyBkb2VzIGhhcHBlbi5cbiAgICAgIHJldHVybiBjdXJyZW50VGltZSArIDI1MDtcblxuICAgIGNhc2UgRGVmYXVsdEh5ZHJhdGlvbkxhbmU6XG4gICAgY2FzZSBEZWZhdWx0TGFuZTpcbiAgICBjYXNlIFRyYW5zaXRpb25IeWRyYXRpb25MYW5lOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUyOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUzOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU0OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU1OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU2OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU3OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU4OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU5OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTE6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEyOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTQ6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE1OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNjpcbiAgICAgIHJldHVybiBjdXJyZW50VGltZSArIDUwMDA7XG5cbiAgICBjYXNlIFJldHJ5TGFuZTE6XG4gICAgY2FzZSBSZXRyeUxhbmUyOlxuICAgIGNhc2UgUmV0cnlMYW5lMzpcbiAgICBjYXNlIFJldHJ5TGFuZTQ6XG4gICAgY2FzZSBSZXRyeUxhbmU1OlxuICAgICAgLy8gVE9ETzogUmV0cmllcyBzaG91bGQgYmUgYWxsb3dlZCB0byBleHBpcmUgaWYgdGhleSBhcmUgQ1BVIGJvdW5kIGZvclxuICAgICAgLy8gdG9vIGxvbmcsIGJ1dCB3aGVuIEkgbWFkZSB0aGlzIGNoYW5nZSBpdCBjYXVzZWQgYSBzcGlrZSBpbiBicm93c2VyXG4gICAgICAvLyBjcmFzaGVzLiBUaGVyZSBtdXN0IGJlIHNvbWUgb3RoZXIgdW5kZXJseWluZyBidWc7IG5vdCBzdXBlciB1cmdlbnQgYnV0XG4gICAgICAvLyBpZGVhbGx5IHNob3VsZCBmaWd1cmUgb3V0IHdoeSBhbmQgZml4IGl0LiBVbmZvcnR1bmF0ZWx5IHdlIGRvbid0IGhhdmVcbiAgICAgIC8vIGEgcmVwcm8gZm9yIHRoZSBjcmFzaGVzLCBvbmx5IGRldGVjdGVkIHZpYSBwcm9kdWN0aW9uIG1ldHJpY3MuXG4gICAgICByZXR1cm4gTm9UaW1lc3RhbXA7XG5cbiAgICBjYXNlIFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmU6XG4gICAgY2FzZSBJZGxlSHlkcmF0aW9uTGFuZTpcbiAgICBjYXNlIElkbGVMYW5lOlxuICAgIGNhc2UgT2Zmc2NyZWVuTGFuZTpcbiAgICAgIC8vIEFueXRoaW5nIGlkbGUgcHJpb3JpdHkgb3IgbG93ZXIgc2hvdWxkIG5ldmVyIGV4cGlyZS5cbiAgICAgIHJldHVybiBOb1RpbWVzdGFtcDtcblxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIGVycm9yKCdTaG91bGQgaGF2ZSBmb3VuZCBtYXRjaGluZyBsYW5lcy4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIE5vVGltZXN0YW1wO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtTdGFydmVkTGFuZXNBc0V4cGlyZWQocm9vdCwgY3VycmVudFRpbWUpIHtcbiAgLy8gVE9ETzogVGhpcyBnZXRzIGNhbGxlZCBldmVyeSB0aW1lIHdlIHlpZWxkLiBXZSBjYW4gb3B0aW1pemUgYnkgc3RvcmluZ1xuICAvLyB0aGUgZWFybGllc3QgZXhwaXJhdGlvbiB0aW1lIG9uIHRoZSByb290LiBUaGVuIHVzZSB0aGF0IHRvIHF1aWNrbHkgYmFpbCBvdXRcbiAgLy8gb2YgdGhpcyBmdW5jdGlvbi5cbiAgdmFyIHBlbmRpbmdMYW5lcyA9IHJvb3QucGVuZGluZ0xhbmVzO1xuICB2YXIgc3VzcGVuZGVkTGFuZXMgPSByb290LnN1c3BlbmRlZExhbmVzO1xuICB2YXIgcGluZ2VkTGFuZXMgPSByb290LnBpbmdlZExhbmVzO1xuICB2YXIgZXhwaXJhdGlvblRpbWVzID0gcm9vdC5leHBpcmF0aW9uVGltZXM7IC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgcGVuZGluZyBsYW5lcyBhbmQgY2hlY2sgaWYgd2UndmUgcmVhY2hlZCB0aGVpclxuICAvLyBleHBpcmF0aW9uIHRpbWUuIElmIHNvLCB3ZSdsbCBhc3N1bWUgdGhlIHVwZGF0ZSBpcyBiZWluZyBzdGFydmVkIGFuZCBtYXJrXG4gIC8vIGl0IGFzIGV4cGlyZWQgdG8gZm9yY2UgaXQgdG8gZmluaXNoLlxuXG4gIHZhciBsYW5lcyA9IHBlbmRpbmdMYW5lcztcblxuICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgdmFyIGluZGV4ID0gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcyk7XG4gICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgIHZhciBleHBpcmF0aW9uVGltZSA9IGV4cGlyYXRpb25UaW1lc1tpbmRleF07XG5cbiAgICBpZiAoZXhwaXJhdGlvblRpbWUgPT09IE5vVGltZXN0YW1wKSB7XG4gICAgICAvLyBGb3VuZCBhIHBlbmRpbmcgbGFuZSB3aXRoIG5vIGV4cGlyYXRpb24gdGltZS4gSWYgaXQncyBub3Qgc3VzcGVuZGVkLCBvclxuICAgICAgLy8gaWYgaXQncyBwaW5nZWQsIGFzc3VtZSBpdCdzIENQVS1ib3VuZC4gQ29tcHV0ZSBhIG5ldyBleHBpcmF0aW9uIHRpbWVcbiAgICAgIC8vIHVzaW5nIHRoZSBjdXJyZW50IHRpbWUuXG4gICAgICBpZiAoKGxhbmUgJiBzdXNwZW5kZWRMYW5lcykgPT09IE5vTGFuZXMgfHwgKGxhbmUgJiBwaW5nZWRMYW5lcykgIT09IE5vTGFuZXMpIHtcbiAgICAgICAgLy8gQXNzdW1lcyB0aW1lc3RhbXBzIGFyZSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcuXG4gICAgICAgIGV4cGlyYXRpb25UaW1lc1tpbmRleF0gPSBjb21wdXRlRXhwaXJhdGlvblRpbWUobGFuZSwgY3VycmVudFRpbWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZXhwaXJhdGlvblRpbWUgPD0gY3VycmVudFRpbWUpIHtcbiAgICAgIC8vIFRoaXMgbGFuZSBleHBpcmVkXG4gICAgICByb290LmV4cGlyZWRMYW5lcyB8PSBsYW5lO1xuICAgIH1cblxuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG59IC8vIFRoaXMgcmV0dXJucyB0aGUgaGlnaGVzdCBwcmlvcml0eSBwZW5kaW5nIGxhbmVzIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGV5XG4vLyBhcmUgc3VzcGVuZGVkLlxuXG5mdW5jdGlvbiBnZXRIaWdoZXN0UHJpb3JpdHlQZW5kaW5nTGFuZXMocm9vdCkge1xuICByZXR1cm4gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMocm9vdC5wZW5kaW5nTGFuZXMpO1xufVxuZnVuY3Rpb24gZ2V0TGFuZXNUb1JldHJ5U3luY2hyb25vdXNseU9uRXJyb3Iocm9vdCkge1xuICB2YXIgZXZlcnl0aGluZ0J1dE9mZnNjcmVlbiA9IHJvb3QucGVuZGluZ0xhbmVzICYgfk9mZnNjcmVlbkxhbmU7XG5cbiAgaWYgKGV2ZXJ5dGhpbmdCdXRPZmZzY3JlZW4gIT09IE5vTGFuZXMpIHtcbiAgICByZXR1cm4gZXZlcnl0aGluZ0J1dE9mZnNjcmVlbjtcbiAgfVxuXG4gIGlmIChldmVyeXRoaW5nQnV0T2Zmc2NyZWVuICYgT2Zmc2NyZWVuTGFuZSkge1xuICAgIHJldHVybiBPZmZzY3JlZW5MYW5lO1xuICB9XG5cbiAgcmV0dXJuIE5vTGFuZXM7XG59XG5mdW5jdGlvbiBpbmNsdWRlc1N5bmNMYW5lKGxhbmVzKSB7XG4gIHJldHVybiAobGFuZXMgJiBTeW5jTGFuZSkgIT09IE5vTGFuZXM7XG59XG5mdW5jdGlvbiBpbmNsdWRlc05vbklkbGVXb3JrKGxhbmVzKSB7XG4gIHJldHVybiAobGFuZXMgJiBOb25JZGxlTGFuZXMpICE9PSBOb0xhbmVzO1xufVxuZnVuY3Rpb24gaW5jbHVkZXNPbmx5UmV0cmllcyhsYW5lcykge1xuICByZXR1cm4gKGxhbmVzICYgUmV0cnlMYW5lcykgPT09IGxhbmVzO1xufVxuZnVuY3Rpb24gaW5jbHVkZXNPbmx5Tm9uVXJnZW50TGFuZXMobGFuZXMpIHtcbiAgdmFyIFVyZ2VudExhbmVzID0gU3luY0xhbmUgfCBJbnB1dENvbnRpbnVvdXNMYW5lIHwgRGVmYXVsdExhbmU7XG4gIHJldHVybiAobGFuZXMgJiBVcmdlbnRMYW5lcykgPT09IE5vTGFuZXM7XG59XG5mdW5jdGlvbiBpbmNsdWRlc09ubHlUcmFuc2l0aW9ucyhsYW5lcykge1xuICByZXR1cm4gKGxhbmVzICYgVHJhbnNpdGlvbkxhbmVzKSA9PT0gbGFuZXM7XG59XG5mdW5jdGlvbiBpbmNsdWRlc0Jsb2NraW5nTGFuZShyb290LCBsYW5lcykge1xuXG4gIHZhciBTeW5jRGVmYXVsdExhbmVzID0gSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZSB8IElucHV0Q29udGludW91c0xhbmUgfCBEZWZhdWx0SHlkcmF0aW9uTGFuZSB8IERlZmF1bHRMYW5lO1xuICByZXR1cm4gKGxhbmVzICYgU3luY0RlZmF1bHRMYW5lcykgIT09IE5vTGFuZXM7XG59XG5mdW5jdGlvbiBpbmNsdWRlc0V4cGlyZWRMYW5lKHJvb3QsIGxhbmVzKSB7XG4gIC8vIFRoaXMgaXMgYSBzZXBhcmF0ZSBjaGVjayBmcm9tIGluY2x1ZGVzQmxvY2tpbmdMYW5lIGJlY2F1c2UgYSBsYW5lIGNhblxuICAvLyBleHBpcmUgYWZ0ZXIgYSByZW5kZXIgaGFzIGFscmVhZHkgc3RhcnRlZC5cbiAgcmV0dXJuIChsYW5lcyAmIHJvb3QuZXhwaXJlZExhbmVzKSAhPT0gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGlzVHJhbnNpdGlvbkxhbmUobGFuZSkge1xuICByZXR1cm4gKGxhbmUgJiBUcmFuc2l0aW9uTGFuZXMpICE9PSBOb0xhbmVzO1xufVxuZnVuY3Rpb24gY2xhaW1OZXh0VHJhbnNpdGlvbkxhbmUoKSB7XG4gIC8vIEN5Y2xlIHRocm91Z2ggdGhlIGxhbmVzLCBhc3NpZ25pbmcgZWFjaCBuZXcgdHJhbnNpdGlvbiB0byB0aGUgbmV4dCBsYW5lLlxuICAvLyBJbiBtb3N0IGNhc2VzLCB0aGlzIG1lYW5zIGV2ZXJ5IHRyYW5zaXRpb24gZ2V0cyBpdHMgb3duIGxhbmUsIHVudGlsIHdlXG4gIC8vIHJ1biBvdXQgb2YgbGFuZXMgYW5kIGN5Y2xlIGJhY2sgdG8gdGhlIGJlZ2lubmluZy5cbiAgdmFyIGxhbmUgPSBuZXh0VHJhbnNpdGlvbkxhbmU7XG4gIG5leHRUcmFuc2l0aW9uTGFuZSA8PD0gMTtcblxuICBpZiAoKG5leHRUcmFuc2l0aW9uTGFuZSAmIFRyYW5zaXRpb25MYW5lcykgPT09IE5vTGFuZXMpIHtcbiAgICBuZXh0VHJhbnNpdGlvbkxhbmUgPSBUcmFuc2l0aW9uTGFuZTE7XG4gIH1cblxuICByZXR1cm4gbGFuZTtcbn1cbmZ1bmN0aW9uIGNsYWltTmV4dFJldHJ5TGFuZSgpIHtcbiAgdmFyIGxhbmUgPSBuZXh0UmV0cnlMYW5lO1xuICBuZXh0UmV0cnlMYW5lIDw8PSAxO1xuXG4gIGlmICgobmV4dFJldHJ5TGFuZSAmIFJldHJ5TGFuZXMpID09PSBOb0xhbmVzKSB7XG4gICAgbmV4dFJldHJ5TGFuZSA9IFJldHJ5TGFuZTE7XG4gIH1cblxuICByZXR1cm4gbGFuZTtcbn1cbmZ1bmN0aW9uIGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobGFuZXMpIHtcbiAgcmV0dXJuIGxhbmVzICYgLWxhbmVzO1xufVxuZnVuY3Rpb24gcGlja0FyYml0cmFyeUxhbmUobGFuZXMpIHtcbiAgLy8gVGhpcyB3cmFwcGVyIGZ1bmN0aW9uIGdldHMgaW5saW5lZC4gT25seSBleGlzdHMgc28gdG8gY29tbXVuaWNhdGUgdGhhdCBpdFxuICAvLyBkb2Vzbid0IG1hdHRlciB3aGljaCBiaXQgaXMgc2VsZWN0ZWQ7IHlvdSBjYW4gcGljayBhbnkgYml0IHdpdGhvdXRcbiAgLy8gYWZmZWN0aW5nIHRoZSBhbGdvcml0aG1zIHdoZXJlIGl0cyB1c2VkLiBIZXJlIEknbSB1c2luZ1xuICAvLyBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lIGJlY2F1c2UgaXQgcmVxdWlyZXMgdGhlIGZld2VzdCBvcGVyYXRpb25zLlxuICByZXR1cm4gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZShsYW5lcyk7XG59XG5cbmZ1bmN0aW9uIHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpIHtcbiAgcmV0dXJuIDMxIC0gY2x6MzIobGFuZXMpO1xufVxuXG5mdW5jdGlvbiBsYW5lVG9JbmRleChsYW5lKSB7XG4gIHJldHVybiBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmUpO1xufVxuXG5mdW5jdGlvbiBpbmNsdWRlc1NvbWVMYW5lKGEsIGIpIHtcbiAgcmV0dXJuIChhICYgYikgIT09IE5vTGFuZXM7XG59XG5mdW5jdGlvbiBpc1N1YnNldE9mTGFuZXMoc2V0LCBzdWJzZXQpIHtcbiAgcmV0dXJuIChzZXQgJiBzdWJzZXQpID09PSBzdWJzZXQ7XG59XG5mdW5jdGlvbiBtZXJnZUxhbmVzKGEsIGIpIHtcbiAgcmV0dXJuIGEgfCBiO1xufVxuZnVuY3Rpb24gcmVtb3ZlTGFuZXMoc2V0LCBzdWJzZXQpIHtcbiAgcmV0dXJuIHNldCAmIH5zdWJzZXQ7XG59XG5mdW5jdGlvbiBpbnRlcnNlY3RMYW5lcyhhLCBiKSB7XG4gIHJldHVybiBhICYgYjtcbn0gLy8gU2VlbXMgcmVkdW5kYW50LCBidXQgaXQgY2hhbmdlcyB0aGUgdHlwZSBmcm9tIGEgc2luZ2xlIGxhbmUgKHVzZWQgZm9yXG4vLyB1cGRhdGVzKSB0byBhIGdyb3VwIG9mIGxhbmVzICh1c2VkIGZvciBmbHVzaGluZyB3b3JrKS5cblxuZnVuY3Rpb24gbGFuZVRvTGFuZXMobGFuZSkge1xuICByZXR1cm4gbGFuZTtcbn1cbmZ1bmN0aW9uIGhpZ2hlclByaW9yaXR5TGFuZShhLCBiKSB7XG4gIC8vIFRoaXMgd29ya3MgYmVjYXVzZSB0aGUgYml0IHJhbmdlcyBkZWNyZWFzZSBpbiBwcmlvcml0eSBhcyB5b3UgZ28gbGVmdC5cbiAgcmV0dXJuIGEgIT09IE5vTGFuZSAmJiBhIDwgYiA/IGEgOiBiO1xufVxuZnVuY3Rpb24gY3JlYXRlTGFuZU1hcChpbml0aWFsKSB7XG4gIC8vIEludGVudGlvbmFsbHkgcHVzaGluZyBvbmUgYnkgb25lLlxuICAvLyBodHRwczovL3Y4LmRldi9ibG9nL2VsZW1lbnRzLWtpbmRzI2F2b2lkLWNyZWF0aW5nLWhvbGVzXG4gIHZhciBsYW5lTWFwID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBUb3RhbExhbmVzOyBpKyspIHtcbiAgICBsYW5lTWFwLnB1c2goaW5pdGlhbCk7XG4gIH1cblxuICByZXR1cm4gbGFuZU1hcDtcbn1cbmZ1bmN0aW9uIG1hcmtSb290VXBkYXRlZChyb290LCB1cGRhdGVMYW5lLCBldmVudFRpbWUpIHtcbiAgcm9vdC5wZW5kaW5nTGFuZXMgfD0gdXBkYXRlTGFuZTsgLy8gSWYgdGhlcmUgYXJlIGFueSBzdXNwZW5kZWQgdHJhbnNpdGlvbnMsIGl0J3MgcG9zc2libGUgdGhpcyBuZXcgdXBkYXRlXG4gIC8vIGNvdWxkIHVuYmxvY2sgdGhlbS4gQ2xlYXIgdGhlIHN1c3BlbmRlZCBsYW5lcyBzbyB0aGF0IHdlIGNhbiB0cnkgcmVuZGVyaW5nXG4gIC8vIHRoZW0gYWdhaW4uXG4gIC8vXG4gIC8vIFRPRE86IFdlIHJlYWxseSBvbmx5IG5lZWQgdG8gdW5zdXNwZW5kIG9ubHkgbGFuZXMgdGhhdCBhcmUgaW4gdGhlXG4gIC8vIGBzdWJ0cmVlTGFuZXNgIG9mIHRoZSB1cGRhdGVkIGZpYmVyLCBvciB0aGUgdXBkYXRlIGxhbmVzIG9mIHRoZSByZXR1cm5cbiAgLy8gcGF0aC4gVGhpcyB3b3VsZCBleGNsdWRlIHN1c3BlbmRlZCB1cGRhdGVzIGluIGFuIHVucmVsYXRlZCBzaWJsaW5nIHRyZWUsXG4gIC8vIHNpbmNlIHRoZXJlJ3Mgbm8gd2F5IGZvciB0aGlzIHVwZGF0ZSB0byB1bmJsb2NrIGl0LlxuICAvL1xuICAvLyBXZSBkb24ndCBkbyB0aGlzIGlmIHRoZSBpbmNvbWluZyB1cGRhdGUgaXMgaWRsZSwgYmVjYXVzZSB3ZSBuZXZlciBwcm9jZXNzXG4gIC8vIGlkbGUgdXBkYXRlcyB1bnRpbCBhZnRlciBhbGwgdGhlIHJlZ3VsYXIgdXBkYXRlcyBoYXZlIGZpbmlzaGVkOyB0aGVyZSdzIG5vXG4gIC8vIHdheSBpdCBjb3VsZCB1bmJsb2NrIGEgdHJhbnNpdGlvbi5cblxuICBpZiAodXBkYXRlTGFuZSAhPT0gSWRsZUxhbmUpIHtcbiAgICByb290LnN1c3BlbmRlZExhbmVzID0gTm9MYW5lcztcbiAgICByb290LnBpbmdlZExhbmVzID0gTm9MYW5lcztcbiAgfVxuXG4gIHZhciBldmVudFRpbWVzID0gcm9vdC5ldmVudFRpbWVzO1xuICB2YXIgaW5kZXggPSBsYW5lVG9JbmRleCh1cGRhdGVMYW5lKTsgLy8gV2UgY2FuIGFsd2F5cyBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgdGltZXN0YW1wIGJlY2F1c2Ugd2UgcHJlZmVyIHRoZSBtb3N0XG4gIC8vIHJlY2VudCBldmVudCwgYW5kIHdlIGFzc3VtZSB0aW1lIGlzIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZy5cblxuICBldmVudFRpbWVzW2luZGV4XSA9IGV2ZW50VGltZTtcbn1cbmZ1bmN0aW9uIG1hcmtSb290U3VzcGVuZGVkKHJvb3QsIHN1c3BlbmRlZExhbmVzKSB7XG4gIHJvb3Quc3VzcGVuZGVkTGFuZXMgfD0gc3VzcGVuZGVkTGFuZXM7XG4gIHJvb3QucGluZ2VkTGFuZXMgJj0gfnN1c3BlbmRlZExhbmVzOyAvLyBUaGUgc3VzcGVuZGVkIGxhbmVzIGFyZSBubyBsb25nZXIgQ1BVLWJvdW5kLiBDbGVhciB0aGVpciBleHBpcmF0aW9uIHRpbWVzLlxuXG4gIHZhciBleHBpcmF0aW9uVGltZXMgPSByb290LmV4cGlyYXRpb25UaW1lcztcbiAgdmFyIGxhbmVzID0gc3VzcGVuZGVkTGFuZXM7XG5cbiAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICBleHBpcmF0aW9uVGltZXNbaW5kZXhdID0gTm9UaW1lc3RhbXA7XG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtSb290UGluZ2VkKHJvb3QsIHBpbmdlZExhbmVzLCBldmVudFRpbWUpIHtcbiAgcm9vdC5waW5nZWRMYW5lcyB8PSByb290LnN1c3BlbmRlZExhbmVzICYgcGluZ2VkTGFuZXM7XG59XG5mdW5jdGlvbiBtYXJrUm9vdEZpbmlzaGVkKHJvb3QsIHJlbWFpbmluZ0xhbmVzKSB7XG4gIHZhciBub0xvbmdlclBlbmRpbmdMYW5lcyA9IHJvb3QucGVuZGluZ0xhbmVzICYgfnJlbWFpbmluZ0xhbmVzO1xuICByb290LnBlbmRpbmdMYW5lcyA9IHJlbWFpbmluZ0xhbmVzOyAvLyBMZXQncyB0cnkgZXZlcnl0aGluZyBhZ2FpblxuXG4gIHJvb3Quc3VzcGVuZGVkTGFuZXMgPSBOb0xhbmVzO1xuICByb290LnBpbmdlZExhbmVzID0gTm9MYW5lcztcbiAgcm9vdC5leHBpcmVkTGFuZXMgJj0gcmVtYWluaW5nTGFuZXM7XG4gIHJvb3QubXV0YWJsZVJlYWRMYW5lcyAmPSByZW1haW5pbmdMYW5lcztcbiAgcm9vdC5lbnRhbmdsZWRMYW5lcyAmPSByZW1haW5pbmdMYW5lcztcbiAgdmFyIGVudGFuZ2xlbWVudHMgPSByb290LmVudGFuZ2xlbWVudHM7XG4gIHZhciBldmVudFRpbWVzID0gcm9vdC5ldmVudFRpbWVzO1xuICB2YXIgZXhwaXJhdGlvblRpbWVzID0gcm9vdC5leHBpcmF0aW9uVGltZXM7IC8vIENsZWFyIHRoZSBsYW5lcyB0aGF0IG5vIGxvbmdlciBoYXZlIHBlbmRpbmcgd29ya1xuXG4gIHZhciBsYW5lcyA9IG5vTG9uZ2VyUGVuZGluZ0xhbmVzO1xuXG4gIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgZW50YW5nbGVtZW50c1tpbmRleF0gPSBOb0xhbmVzO1xuICAgIGV2ZW50VGltZXNbaW5kZXhdID0gTm9UaW1lc3RhbXA7XG4gICAgZXhwaXJhdGlvblRpbWVzW2luZGV4XSA9IE5vVGltZXN0YW1wO1xuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG59XG5mdW5jdGlvbiBtYXJrUm9vdEVudGFuZ2xlZChyb290LCBlbnRhbmdsZWRMYW5lcykge1xuICAvLyBJbiBhZGRpdGlvbiB0byBlbnRhbmdsaW5nIGVhY2ggb2YgdGhlIGdpdmVuIGxhbmVzIHdpdGggZWFjaCBvdGhlciwgd2UgYWxzb1xuICAvLyBoYXZlIHRvIGNvbnNpZGVyIF90cmFuc2l0aXZlXyBlbnRhbmdsZW1lbnRzLiBGb3IgZWFjaCBsYW5lIHRoYXQgaXMgYWxyZWFkeVxuICAvLyBlbnRhbmdsZWQgd2l0aCAqYW55KiBvZiB0aGUgZ2l2ZW4gbGFuZXMsIHRoYXQgbGFuZSBpcyBub3cgdHJhbnNpdGl2ZWx5XG4gIC8vIGVudGFuZ2xlZCB3aXRoICphbGwqIHRoZSBnaXZlbiBsYW5lcy5cbiAgLy9cbiAgLy8gVHJhbnNsYXRlZDogSWYgQyBpcyBlbnRhbmdsZWQgd2l0aCBBLCB0aGVuIGVudGFuZ2xpbmcgQSB3aXRoIEIgYWxzb1xuICAvLyBlbnRhbmdsZXMgQyB3aXRoIEIuXG4gIC8vXG4gIC8vIElmIHRoaXMgaXMgaGFyZCB0byBncmFzcCwgaXQgbWlnaHQgaGVscCB0byBpbnRlbnRpb25hbGx5IGJyZWFrIHRoaXNcbiAgLy8gZnVuY3Rpb24gYW5kIGxvb2sgYXQgdGhlIHRlc3RzIHRoYXQgZmFpbCBpbiBSZWFjdFRyYW5zaXRpb24tdGVzdC5qcy4gVHJ5XG4gIC8vIGNvbW1lbnRpbmcgb3V0IG9uZSBvZiB0aGUgY29uZGl0aW9ucyBiZWxvdy5cbiAgdmFyIHJvb3RFbnRhbmdsZWRMYW5lcyA9IHJvb3QuZW50YW5nbGVkTGFuZXMgfD0gZW50YW5nbGVkTGFuZXM7XG4gIHZhciBlbnRhbmdsZW1lbnRzID0gcm9vdC5lbnRhbmdsZW1lbnRzO1xuICB2YXIgbGFuZXMgPSByb290RW50YW5nbGVkTGFuZXM7XG5cbiAgd2hpbGUgKGxhbmVzKSB7XG4gICAgdmFyIGluZGV4ID0gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcyk7XG4gICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuXG4gICAgaWYgKCAvLyBJcyB0aGlzIG9uZSBvZiB0aGUgbmV3bHkgZW50YW5nbGVkIGxhbmVzP1xuICAgIGxhbmUgJiBlbnRhbmdsZWRMYW5lcyB8IC8vIElzIHRoaXMgbGFuZSB0cmFuc2l0aXZlbHkgZW50YW5nbGVkIHdpdGggdGhlIG5ld2x5IGVudGFuZ2xlZCBsYW5lcz9cbiAgICBlbnRhbmdsZW1lbnRzW2luZGV4XSAmIGVudGFuZ2xlZExhbmVzKSB7XG4gICAgICBlbnRhbmdsZW1lbnRzW2luZGV4XSB8PSBlbnRhbmdsZWRMYW5lcztcbiAgICB9XG5cbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0QnVtcGVkTGFuZUZvckh5ZHJhdGlvbihyb290LCByZW5kZXJMYW5lcykge1xuICB2YXIgcmVuZGVyTGFuZSA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmUocmVuZGVyTGFuZXMpO1xuICB2YXIgbGFuZTtcblxuICBzd2l0Y2ggKHJlbmRlckxhbmUpIHtcbiAgICBjYXNlIElucHV0Q29udGludW91c0xhbmU6XG4gICAgICBsYW5lID0gSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBEZWZhdWx0TGFuZTpcbiAgICAgIGxhbmUgPSBEZWZhdWx0SHlkcmF0aW9uTGFuZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTI6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTM6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTQ6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTU6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTY6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTc6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTg6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTk6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEwOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTI6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEzOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTU6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE2OlxuICAgIGNhc2UgUmV0cnlMYW5lMTpcbiAgICBjYXNlIFJldHJ5TGFuZTI6XG4gICAgY2FzZSBSZXRyeUxhbmUzOlxuICAgIGNhc2UgUmV0cnlMYW5lNDpcbiAgICBjYXNlIFJldHJ5TGFuZTU6XG4gICAgICBsYW5lID0gVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmU7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgSWRsZUxhbmU6XG4gICAgICBsYW5lID0gSWRsZUh5ZHJhdGlvbkxhbmU7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBFdmVyeXRoaW5nIGVsc2UgaXMgYWxyZWFkeSBlaXRoZXIgYSBoeWRyYXRpb24gbGFuZSwgb3Igc2hvdWxkbid0XG4gICAgICAvLyBiZSByZXRyaWVkIGF0IGEgaHlkcmF0aW9uIGxhbmUuXG4gICAgICBsYW5lID0gTm9MYW5lO1xuICAgICAgYnJlYWs7XG4gIH0gLy8gQ2hlY2sgaWYgdGhlIGxhbmUgd2UgY2hvc2UgaXMgc3VzcGVuZGVkLiBJZiBzbywgdGhhdCBpbmRpY2F0ZXMgdGhhdCB3ZVxuICAvLyBhbHJlYWR5IGF0dGVtcHRlZCBhbmQgZmFpbGVkIHRvIGh5ZHJhdGUgYXQgdGhhdCBsZXZlbC4gQWxzbyBjaGVjayBpZiB3ZSdyZVxuICAvLyBhbHJlYWR5IHJlbmRlcmluZyB0aGF0IGxhbmUsIHdoaWNoIGlzIHJhcmUgYnV0IGNvdWxkIGhhcHBlbi5cblxuXG4gIGlmICgobGFuZSAmIChyb290LnN1c3BlbmRlZExhbmVzIHwgcmVuZGVyTGFuZXMpKSAhPT0gTm9MYW5lKSB7XG4gICAgLy8gR2l2ZSB1cCB0cnlpbmcgdG8gaHlkcmF0ZSBhbmQgZmFsbCBiYWNrIHRvIGNsaWVudCByZW5kZXIuXG4gICAgcmV0dXJuIE5vTGFuZTtcbiAgfVxuXG4gIHJldHVybiBsYW5lO1xufVxuZnVuY3Rpb24gYWRkRmliZXJUb0xhbmVzTWFwKHJvb3QsIGZpYmVyLCBsYW5lcykge1xuXG4gIGlmICghaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgcGVuZGluZ1VwZGF0ZXJzTGFuZU1hcCA9IHJvb3QucGVuZGluZ1VwZGF0ZXJzTGFuZU1hcDtcblxuICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgdmFyIGluZGV4ID0gbGFuZVRvSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICB2YXIgdXBkYXRlcnMgPSBwZW5kaW5nVXBkYXRlcnNMYW5lTWFwW2luZGV4XTtcbiAgICB1cGRhdGVycy5hZGQoZmliZXIpO1xuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG59XG5mdW5jdGlvbiBtb3ZlUGVuZGluZ0ZpYmVyc1RvTWVtb2l6ZWQocm9vdCwgbGFuZXMpIHtcblxuICBpZiAoIWlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHBlbmRpbmdVcGRhdGVyc0xhbmVNYXAgPSByb290LnBlbmRpbmdVcGRhdGVyc0xhbmVNYXA7XG4gIHZhciBtZW1vaXplZFVwZGF0ZXJzID0gcm9vdC5tZW1vaXplZFVwZGF0ZXJzO1xuXG4gIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICB2YXIgaW5kZXggPSBsYW5lVG9JbmRleChsYW5lcyk7XG4gICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgIHZhciB1cGRhdGVycyA9IHBlbmRpbmdVcGRhdGVyc0xhbmVNYXBbaW5kZXhdO1xuXG4gICAgaWYgKHVwZGF0ZXJzLnNpemUgPiAwKSB7XG4gICAgICB1cGRhdGVycy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgICAgIGlmIChhbHRlcm5hdGUgPT09IG51bGwgfHwgIW1lbW9pemVkVXBkYXRlcnMuaGFzKGFsdGVybmF0ZSkpIHtcbiAgICAgICAgICBtZW1vaXplZFVwZGF0ZXJzLmFkZChmaWJlcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdXBkYXRlcnMuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0VHJhbnNpdGlvbnNGb3JMYW5lcyhyb290LCBsYW5lcykge1xuICB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxudmFyIERpc2NyZXRlRXZlbnRQcmlvcml0eSA9IFN5bmNMYW5lO1xudmFyIENvbnRpbnVvdXNFdmVudFByaW9yaXR5ID0gSW5wdXRDb250aW51b3VzTGFuZTtcbnZhciBEZWZhdWx0RXZlbnRQcmlvcml0eSA9IERlZmF1bHRMYW5lO1xudmFyIElkbGVFdmVudFByaW9yaXR5ID0gSWRsZUxhbmU7XG52YXIgY3VycmVudFVwZGF0ZVByaW9yaXR5ID0gTm9MYW5lO1xuZnVuY3Rpb24gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCkge1xuICByZXR1cm4gY3VycmVudFVwZGF0ZVByaW9yaXR5O1xufVxuZnVuY3Rpb24gc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KG5ld1ByaW9yaXR5KSB7XG4gIGN1cnJlbnRVcGRhdGVQcmlvcml0eSA9IG5ld1ByaW9yaXR5O1xufVxuZnVuY3Rpb24gcnVuV2l0aFByaW9yaXR5KHByaW9yaXR5LCBmbikge1xuICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IGN1cnJlbnRVcGRhdGVQcmlvcml0eTtcblxuICB0cnkge1xuICAgIGN1cnJlbnRVcGRhdGVQcmlvcml0eSA9IHByaW9yaXR5O1xuICAgIHJldHVybiBmbigpO1xuICB9IGZpbmFsbHkge1xuICAgIGN1cnJlbnRVcGRhdGVQcmlvcml0eSA9IHByZXZpb3VzUHJpb3JpdHk7XG4gIH1cbn1cbmZ1bmN0aW9uIGhpZ2hlckV2ZW50UHJpb3JpdHkoYSwgYikge1xuICByZXR1cm4gYSAhPT0gMCAmJiBhIDwgYiA/IGEgOiBiO1xufVxuZnVuY3Rpb24gbG93ZXJFdmVudFByaW9yaXR5KGEsIGIpIHtcbiAgcmV0dXJuIGEgPT09IDAgfHwgYSA+IGIgPyBhIDogYjtcbn1cbmZ1bmN0aW9uIGlzSGlnaGVyRXZlbnRQcmlvcml0eShhLCBiKSB7XG4gIHJldHVybiBhICE9PSAwICYmIGEgPCBiO1xufVxuZnVuY3Rpb24gbGFuZXNUb0V2ZW50UHJpb3JpdHkobGFuZXMpIHtcbiAgdmFyIGxhbmUgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKGxhbmVzKTtcblxuICBpZiAoIWlzSGlnaGVyRXZlbnRQcmlvcml0eShEaXNjcmV0ZUV2ZW50UHJpb3JpdHksIGxhbmUpKSB7XG4gICAgcmV0dXJuIERpc2NyZXRlRXZlbnRQcmlvcml0eTtcbiAgfVxuXG4gIGlmICghaXNIaWdoZXJFdmVudFByaW9yaXR5KENvbnRpbnVvdXNFdmVudFByaW9yaXR5LCBsYW5lKSkge1xuICAgIHJldHVybiBDb250aW51b3VzRXZlbnRQcmlvcml0eTtcbiAgfVxuXG4gIGlmIChpbmNsdWRlc05vbklkbGVXb3JrKGxhbmUpKSB7XG4gICAgcmV0dXJuIERlZmF1bHRFdmVudFByaW9yaXR5O1xuICB9XG5cbiAgcmV0dXJuIElkbGVFdmVudFByaW9yaXR5O1xufVxuXG4vLyBUaGlzIGlzIGltcG9ydGVkIGJ5IHRoZSBldmVudCByZXBsYXlpbmcgaW1wbGVtZW50YXRpb24gaW4gUmVhY3QgRE9NLiBJdCdzXG4vLyBpbiBhIHNlcGFyYXRlIGZpbGUgdG8gYnJlYWsgYSBjaXJjdWxhciBkZXBlbmRlbmN5IGJldHdlZW4gdGhlIHJlbmRlcmVyIGFuZFxuLy8gdGhlIHJlY29uY2lsZXIuXG5mdW5jdGlvbiBpc1Jvb3REZWh5ZHJhdGVkKHJvb3QpIHtcbiAgdmFyIGN1cnJlbnRTdGF0ZSA9IHJvb3QuY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICByZXR1cm4gY3VycmVudFN0YXRlLmlzRGVoeWRyYXRlZDtcbn1cblxudmFyIF9hdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb247XG5cbmZ1bmN0aW9uIHNldEF0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbihmbikge1xuICBfYXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uID0gZm47XG59XG5mdW5jdGlvbiBhdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24oZmliZXIpIHtcbiAgX2F0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbihmaWJlcik7XG59XG52YXIgYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb247XG5mdW5jdGlvbiBzZXRBdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbihmbikge1xuICBhdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbiA9IGZuO1xufVxudmFyIGF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eTtcbmZ1bmN0aW9uIHNldEF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eShmbikge1xuICBhdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkgPSBmbjtcbn1cbnZhciBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkkMTtcbmZ1bmN0aW9uIHNldEdldEN1cnJlbnRVcGRhdGVQcmlvcml0eShmbikge1xuICBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkkMSA9IGZuO1xufVxudmFyIGF0dGVtcHRIeWRyYXRpb25BdFByaW9yaXR5O1xuZnVuY3Rpb24gc2V0QXR0ZW1wdEh5ZHJhdGlvbkF0UHJpb3JpdHkoZm4pIHtcbiAgYXR0ZW1wdEh5ZHJhdGlvbkF0UHJpb3JpdHkgPSBmbjtcbn0gLy8gVE9ETzogVXBncmFkZSB0aGlzIGRlZmluaXRpb24gb25jZSB3ZSdyZSBvbiBhIG5ld2VyIHZlcnNpb24gb2YgRmxvdyB0aGF0XG4vLyBoYXMgdGhpcyBkZWZpbml0aW9uIGJ1aWx0LWluLlxuXG52YXIgaGFzU2NoZWR1bGVkUmVwbGF5QXR0ZW1wdCA9IGZhbHNlOyAvLyBUaGUgcXVldWUgb2YgZGlzY3JldGUgZXZlbnRzIHRvIGJlIHJlcGxheWVkLlxuXG52YXIgcXVldWVkRGlzY3JldGVFdmVudHMgPSBbXTsgLy8gSW5kaWNhdGVzIGlmIGFueSBjb250aW51b3VzIGV2ZW50IHRhcmdldHMgYXJlIG5vbi1udWxsIGZvciBlYXJseSBiYWlsb3V0LlxuLy8gaWYgdGhlIGxhc3QgdGFyZ2V0IHdhcyBkZWh5ZHJhdGVkLlxuXG52YXIgcXVldWVkRm9jdXMgPSBudWxsO1xudmFyIHF1ZXVlZERyYWcgPSBudWxsO1xudmFyIHF1ZXVlZE1vdXNlID0gbnVsbDsgLy8gRm9yIHBvaW50ZXIgZXZlbnRzIHRoZXJlIGNhbiBiZSBvbmUgbGF0ZXN0IGV2ZW50IHBlciBwb2ludGVySWQuXG5cbnZhciBxdWV1ZWRQb2ludGVycyA9IG5ldyBNYXAoKTtcbnZhciBxdWV1ZWRQb2ludGVyQ2FwdHVyZXMgPSBuZXcgTWFwKCk7IC8vIFdlIGNvdWxkIGNvbnNpZGVyIHJlcGxheWluZyBzZWxlY3Rpb25jaGFuZ2UgYW5kIHRvdWNobW92ZXMgdG9vLlxuXG52YXIgcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzID0gW107XG52YXIgZGlzY3JldGVSZXBsYXlhYmxlRXZlbnRzID0gWydtb3VzZWRvd24nLCAnbW91c2V1cCcsICd0b3VjaGNhbmNlbCcsICd0b3VjaGVuZCcsICd0b3VjaHN0YXJ0JywgJ2F1eGNsaWNrJywgJ2RibGNsaWNrJywgJ3BvaW50ZXJjYW5jZWwnLCAncG9pbnRlcmRvd24nLCAncG9pbnRlcnVwJywgJ2RyYWdlbmQnLCAnZHJhZ3N0YXJ0JywgJ2Ryb3AnLCAnY29tcG9zaXRpb25lbmQnLCAnY29tcG9zaXRpb25zdGFydCcsICdrZXlkb3duJywgJ2tleXByZXNzJywgJ2tleXVwJywgJ2lucHV0JywgJ3RleHRJbnB1dCcsIC8vIEludGVudGlvbmFsbHkgY2FtZWxDYXNlXG4nY29weScsICdjdXQnLCAncGFzdGUnLCAnY2xpY2snLCAnY2hhbmdlJywgJ2NvbnRleHRtZW51JywgJ3Jlc2V0JywgJ3N1Ym1pdCddO1xuZnVuY3Rpb24gaXNEaXNjcmV0ZUV2ZW50VGhhdFJlcXVpcmVzSHlkcmF0aW9uKGV2ZW50VHlwZSkge1xuICByZXR1cm4gZGlzY3JldGVSZXBsYXlhYmxlRXZlbnRzLmluZGV4T2YoZXZlbnRUeXBlKSA+IC0xO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVRdWV1ZWRSZXBsYXlhYmxlRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIHtcbiAgICBibG9ja2VkT246IGJsb2NrZWRPbixcbiAgICBkb21FdmVudE5hbWU6IGRvbUV2ZW50TmFtZSxcbiAgICBldmVudFN5c3RlbUZsYWdzOiBldmVudFN5c3RlbUZsYWdzLFxuICAgIG5hdGl2ZUV2ZW50OiBuYXRpdmVFdmVudCxcbiAgICB0YXJnZXRDb250YWluZXJzOiBbdGFyZ2V0Q29udGFpbmVyXVxuICB9O1xufVxuXG5mdW5jdGlvbiBjbGVhcklmQ29udGludW91c0V2ZW50KGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpIHtcbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdmb2N1c2luJzpcbiAgICBjYXNlICdmb2N1c291dCc6XG4gICAgICBxdWV1ZWRGb2N1cyA9IG51bGw7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2RyYWdlbnRlcic6XG4gICAgY2FzZSAnZHJhZ2xlYXZlJzpcbiAgICAgIHF1ZXVlZERyYWcgPSBudWxsO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdtb3VzZW92ZXInOlxuICAgIGNhc2UgJ21vdXNlb3V0JzpcbiAgICAgIHF1ZXVlZE1vdXNlID0gbnVsbDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAncG9pbnRlcm92ZXInOlxuICAgIGNhc2UgJ3BvaW50ZXJvdXQnOlxuICAgICAge1xuICAgICAgICB2YXIgcG9pbnRlcklkID0gbmF0aXZlRXZlbnQucG9pbnRlcklkO1xuICAgICAgICBxdWV1ZWRQb2ludGVycy5kZWxldGUocG9pbnRlcklkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlICdnb3Rwb2ludGVyY2FwdHVyZSc6XG4gICAgY2FzZSAnbG9zdHBvaW50ZXJjYXB0dXJlJzpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9wb2ludGVySWQgPSBuYXRpdmVFdmVudC5wb2ludGVySWQ7XG4gICAgICAgIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5kZWxldGUoX3BvaW50ZXJJZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQoZXhpc3RpbmdRdWV1ZWRFdmVudCwgYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgaWYgKGV4aXN0aW5nUXVldWVkRXZlbnQgPT09IG51bGwgfHwgZXhpc3RpbmdRdWV1ZWRFdmVudC5uYXRpdmVFdmVudCAhPT0gbmF0aXZlRXZlbnQpIHtcbiAgICB2YXIgcXVldWVkRXZlbnQgPSBjcmVhdGVRdWV1ZWRSZXBsYXlhYmxlRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuXG4gICAgaWYgKGJsb2NrZWRPbiAhPT0gbnVsbCkge1xuICAgICAgdmFyIF9maWJlcjIgPSBnZXRJbnN0YW5jZUZyb21Ob2RlKGJsb2NrZWRPbik7XG5cbiAgICAgIGlmIChfZmliZXIyICE9PSBudWxsKSB7XG4gICAgICAgIC8vIEF0dGVtcHQgdG8gaW5jcmVhc2UgdGhlIHByaW9yaXR5IG9mIHRoaXMgdGFyZ2V0LlxuICAgICAgICBhdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbihfZmliZXIyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcXVldWVkRXZlbnQ7XG4gIH0gLy8gSWYgd2UgaGF2ZSBhbHJlYWR5IHF1ZXVlZCB0aGlzIGV4YWN0IGV2ZW50LCB0aGVuIGl0J3MgYmVjYXVzZVxuICAvLyB0aGUgZGlmZmVyZW50IGV2ZW50IHN5c3RlbXMgaGF2ZSBkaWZmZXJlbnQgRE9NIGV2ZW50IGxpc3RlbmVycy5cbiAgLy8gV2UgY2FuIGFjY3VtdWxhdGUgdGhlIGZsYWdzLCBhbmQgdGhlIHRhcmdldENvbnRhaW5lcnMsIGFuZFxuICAvLyBzdG9yZSBhIHNpbmdsZSBldmVudCB0byBiZSByZXBsYXllZC5cblxuXG4gIGV4aXN0aW5nUXVldWVkRXZlbnQuZXZlbnRTeXN0ZW1GbGFncyB8PSBldmVudFN5c3RlbUZsYWdzO1xuICB2YXIgdGFyZ2V0Q29udGFpbmVycyA9IGV4aXN0aW5nUXVldWVkRXZlbnQudGFyZ2V0Q29udGFpbmVycztcblxuICBpZiAodGFyZ2V0Q29udGFpbmVyICE9PSBudWxsICYmIHRhcmdldENvbnRhaW5lcnMuaW5kZXhPZih0YXJnZXRDb250YWluZXIpID09PSAtMSkge1xuICAgIHRhcmdldENvbnRhaW5lcnMucHVzaCh0YXJnZXRDb250YWluZXIpO1xuICB9XG5cbiAgcmV0dXJuIGV4aXN0aW5nUXVldWVkRXZlbnQ7XG59XG5cbmZ1bmN0aW9uIHF1ZXVlSWZDb250aW51b3VzRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgLy8gVGhlc2Ugc2V0IHJlbGF0ZWRUYXJnZXQgdG8gbnVsbCBiZWNhdXNlIHRoZSByZXBsYXllZCBldmVudCB3aWxsIGJlIHRyZWF0ZWQgYXMgaWYgd2VcbiAgLy8gbW92ZWQgZnJvbSBvdXRzaWRlIHRoZSB3aW5kb3cgKG5vIHRhcmdldCkgb250byB0aGUgdGFyZ2V0IG9uY2UgaXQgaHlkcmF0ZXMuXG4gIC8vIEluc3RlYWQgb2YgbXV0YXRpbmcgd2UgY291bGQgY2xvbmUgdGhlIGV2ZW50LlxuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ2ZvY3VzaW4nOlxuICAgICAge1xuICAgICAgICB2YXIgZm9jdXNFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgICAgICBxdWV1ZWRGb2N1cyA9IGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQocXVldWVkRm9jdXMsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIGZvY3VzRXZlbnQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgIGNhc2UgJ2RyYWdlbnRlcic6XG4gICAgICB7XG4gICAgICAgIHZhciBkcmFnRXZlbnQgPSBuYXRpdmVFdmVudDtcbiAgICAgICAgcXVldWVkRHJhZyA9IGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQocXVldWVkRHJhZywgYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgZHJhZ0V2ZW50KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICBjYXNlICdtb3VzZW92ZXInOlxuICAgICAge1xuICAgICAgICB2YXIgbW91c2VFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgICAgICBxdWV1ZWRNb3VzZSA9IGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQocXVldWVkTW91c2UsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG1vdXNlRXZlbnQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgIGNhc2UgJ3BvaW50ZXJvdmVyJzpcbiAgICAgIHtcbiAgICAgICAgdmFyIHBvaW50ZXJFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgICAgICB2YXIgcG9pbnRlcklkID0gcG9pbnRlckV2ZW50LnBvaW50ZXJJZDtcbiAgICAgICAgcXVldWVkUG9pbnRlcnMuc2V0KHBvaW50ZXJJZCwgYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChxdWV1ZWRQb2ludGVycy5nZXQocG9pbnRlcklkKSB8fCBudWxsLCBibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBwb2ludGVyRXZlbnQpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICBjYXNlICdnb3Rwb2ludGVyY2FwdHVyZSc6XG4gICAgICB7XG4gICAgICAgIHZhciBfcG9pbnRlckV2ZW50ID0gbmF0aXZlRXZlbnQ7XG4gICAgICAgIHZhciBfcG9pbnRlcklkMiA9IF9wb2ludGVyRXZlbnQucG9pbnRlcklkO1xuICAgICAgICBxdWV1ZWRQb2ludGVyQ2FwdHVyZXMuc2V0KF9wb2ludGVySWQyLCBhY2N1bXVsYXRlT3JDcmVhdGVDb250aW51b3VzUXVldWVkUmVwbGF5YWJsZUV2ZW50KHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5nZXQoX3BvaW50ZXJJZDIpIHx8IG51bGwsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIF9wb2ludGVyRXZlbnQpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59IC8vIENoZWNrIGlmIHRoaXMgdGFyZ2V0IGlzIHVuYmxvY2tlZC4gUmV0dXJucyB0cnVlIGlmIGl0J3MgdW5ibG9ja2VkLlxuXG5mdW5jdGlvbiBhdHRlbXB0RXhwbGljaXRIeWRyYXRpb25UYXJnZXQocXVldWVkVGFyZ2V0KSB7XG4gIC8vIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hhcmVzIGEgbG90IG9mIGxvZ2ljIHdpdGggZmluZEluc3RhbmNlQmxvY2tpbmdFdmVudC5cbiAgLy8gVHJ5IHRvIHVuaWZ5IHRoZW0uIEl0J3MgYSBiaXQgdHJpY2t5IHNpbmNlIGl0IHdvdWxkIHJlcXVpcmUgdHdvIHJldHVyblxuICAvLyB2YWx1ZXMuXG4gIHZhciB0YXJnZXRJbnN0ID0gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUocXVldWVkVGFyZ2V0LnRhcmdldCk7XG5cbiAgaWYgKHRhcmdldEluc3QgIT09IG51bGwpIHtcbiAgICB2YXIgbmVhcmVzdE1vdW50ZWQgPSBnZXROZWFyZXN0TW91bnRlZEZpYmVyKHRhcmdldEluc3QpO1xuXG4gICAgaWYgKG5lYXJlc3RNb3VudGVkICE9PSBudWxsKSB7XG4gICAgICB2YXIgdGFnID0gbmVhcmVzdE1vdW50ZWQudGFnO1xuXG4gICAgICBpZiAodGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBnZXRTdXNwZW5zZUluc3RhbmNlRnJvbUZpYmVyKG5lYXJlc3RNb3VudGVkKTtcblxuICAgICAgICBpZiAoaW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSdyZSBibG9ja2VkIG9uIGh5ZHJhdGluZyB0aGlzIGJvdW5kYXJ5LlxuICAgICAgICAgIC8vIEluY3JlYXNlIGl0cyBwcmlvcml0eS5cbiAgICAgICAgICBxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID0gaW5zdGFuY2U7XG4gICAgICAgICAgYXR0ZW1wdEh5ZHJhdGlvbkF0UHJpb3JpdHkocXVldWVkVGFyZ2V0LnByaW9yaXR5LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBhdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkobmVhcmVzdE1vdW50ZWQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0YWcgPT09IEhvc3RSb290KSB7XG4gICAgICAgIHZhciByb290ID0gbmVhcmVzdE1vdW50ZWQuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmIChpc1Jvb3REZWh5ZHJhdGVkKHJvb3QpKSB7XG4gICAgICAgICAgcXVldWVkVGFyZ2V0LmJsb2NrZWRPbiA9IGdldENvbnRhaW5lckZyb21GaWJlcihuZWFyZXN0TW91bnRlZCk7IC8vIFdlIGRvbid0IGN1cnJlbnRseSBoYXZlIGEgd2F5IHRvIGluY3JlYXNlIHRoZSBwcmlvcml0eSBvZlxuICAgICAgICAgIC8vIGEgcm9vdCBvdGhlciB0aGFuIHN5bmMuXG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gcXVldWVFeHBsaWNpdEh5ZHJhdGlvblRhcmdldCh0YXJnZXQpIHtcbiAgLy8gVE9ETzogVGhpcyB3aWxsIHJlYWQgdGhlIHByaW9yaXR5IGlmIGl0J3MgZGlzcGF0Y2hlZCBieSB0aGUgUmVhY3RcbiAgLy8gZXZlbnQgc3lzdGVtIGJ1dCBub3QgbmF0aXZlIGV2ZW50cy4gU2hvdWxkIHJlYWQgd2luZG93LmV2ZW50LnR5cGUsIGxpa2VcbiAgLy8gd2UgZG8gZm9yIHVwZGF0ZXMgKGdldEN1cnJlbnRFdmVudFByaW9yaXR5KS5cbiAgdmFyIHVwZGF0ZVByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5JDEoKTtcbiAgdmFyIHF1ZXVlZFRhcmdldCA9IHtcbiAgICBibG9ja2VkT246IG51bGwsXG4gICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgcHJpb3JpdHk6IHVwZGF0ZVByaW9yaXR5XG4gIH07XG4gIHZhciBpID0gMDtcblxuICBmb3IgKDsgaSA8IHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0cy5sZW5ndGg7IGkrKykge1xuICAgIC8vIFN0b3Agb25jZSB3ZSBoaXQgdGhlIGZpcnN0IHRhcmdldCB3aXRoIGxvd2VyIHByaW9yaXR5IHRoYW5cbiAgICBpZiAoIWlzSGlnaGVyRXZlbnRQcmlvcml0eSh1cGRhdGVQcmlvcml0eSwgcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzW2ldLnByaW9yaXR5KSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzLnNwbGljZShpLCAwLCBxdWV1ZWRUYXJnZXQpO1xuXG4gIGlmIChpID09PSAwKSB7XG4gICAgYXR0ZW1wdEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0KHF1ZXVlZFRhcmdldCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudChxdWV1ZWRFdmVudCkge1xuICBpZiAocXVldWVkRXZlbnQuYmxvY2tlZE9uICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIHRhcmdldENvbnRhaW5lcnMgPSBxdWV1ZWRFdmVudC50YXJnZXRDb250YWluZXJzO1xuXG4gIHdoaWxlICh0YXJnZXRDb250YWluZXJzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgdGFyZ2V0Q29udGFpbmVyID0gdGFyZ2V0Q29udGFpbmVyc1swXTtcbiAgICB2YXIgbmV4dEJsb2NrZWRPbiA9IGZpbmRJbnN0YW5jZUJsb2NraW5nRXZlbnQocXVldWVkRXZlbnQuZG9tRXZlbnROYW1lLCBxdWV1ZWRFdmVudC5ldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIHF1ZXVlZEV2ZW50Lm5hdGl2ZUV2ZW50KTtcblxuICAgIGlmIChuZXh0QmxvY2tlZE9uID09PSBudWxsKSB7XG4gICAgICB7XG4gICAgICAgIHZhciBuYXRpdmVFdmVudCA9IHF1ZXVlZEV2ZW50Lm5hdGl2ZUV2ZW50O1xuICAgICAgICB2YXIgbmF0aXZlRXZlbnRDbG9uZSA9IG5ldyBuYXRpdmVFdmVudC5jb25zdHJ1Y3RvcihuYXRpdmVFdmVudC50eXBlLCBuYXRpdmVFdmVudCk7XG4gICAgICAgIHNldFJlcGxheWluZ0V2ZW50KG5hdGl2ZUV2ZW50Q2xvbmUpO1xuICAgICAgICBuYXRpdmVFdmVudC50YXJnZXQuZGlzcGF0Y2hFdmVudChuYXRpdmVFdmVudENsb25lKTtcbiAgICAgICAgcmVzZXRSZXBsYXlpbmdFdmVudCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBXZSdyZSBzdGlsbCBibG9ja2VkLiBUcnkgYWdhaW4gbGF0ZXIuXG4gICAgICB2YXIgX2ZpYmVyMyA9IGdldEluc3RhbmNlRnJvbU5vZGUobmV4dEJsb2NrZWRPbik7XG5cbiAgICAgIGlmIChfZmliZXIzICE9PSBudWxsKSB7XG4gICAgICAgIGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uKF9maWJlcjMpO1xuICAgICAgfVxuXG4gICAgICBxdWV1ZWRFdmVudC5ibG9ja2VkT24gPSBuZXh0QmxvY2tlZE9uO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gVGhpcyB0YXJnZXQgY29udGFpbmVyIHdhcyBzdWNjZXNzZnVsbHkgZGlzcGF0Y2hlZC4gVHJ5IHRoZSBuZXh0LlxuXG5cbiAgICB0YXJnZXRDb250YWluZXJzLnNoaWZ0KCk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudEluTWFwKHF1ZXVlZEV2ZW50LCBrZXksIG1hcCkge1xuICBpZiAoYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudChxdWV1ZWRFdmVudCkpIHtcbiAgICBtYXAuZGVsZXRlKGtleSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVwbGF5VW5ibG9ja2VkRXZlbnRzKCkge1xuICBoYXNTY2hlZHVsZWRSZXBsYXlBdHRlbXB0ID0gZmFsc2U7XG5cblxuICBpZiAocXVldWVkRm9jdXMgIT09IG51bGwgJiYgYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudChxdWV1ZWRGb2N1cykpIHtcbiAgICBxdWV1ZWRGb2N1cyA9IG51bGw7XG4gIH1cblxuICBpZiAocXVldWVkRHJhZyAhPT0gbnVsbCAmJiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZERyYWcpKSB7XG4gICAgcXVldWVkRHJhZyA9IG51bGw7XG4gIH1cblxuICBpZiAocXVldWVkTW91c2UgIT09IG51bGwgJiYgYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudChxdWV1ZWRNb3VzZSkpIHtcbiAgICBxdWV1ZWRNb3VzZSA9IG51bGw7XG4gIH1cblxuICBxdWV1ZWRQb2ludGVycy5mb3JFYWNoKGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnRJbk1hcCk7XG4gIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5mb3JFYWNoKGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnRJbk1hcCk7XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWRFdmVudCwgdW5ibG9ja2VkKSB7XG4gIGlmIChxdWV1ZWRFdmVudC5ibG9ja2VkT24gPT09IHVuYmxvY2tlZCkge1xuICAgIHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiA9IG51bGw7XG5cbiAgICBpZiAoIWhhc1NjaGVkdWxlZFJlcGxheUF0dGVtcHQpIHtcbiAgICAgIGhhc1NjaGVkdWxlZFJlcGxheUF0dGVtcHQgPSB0cnVlOyAvLyBTY2hlZHVsZSBhIGNhbGxiYWNrIHRvIGF0dGVtcHQgcmVwbGF5aW5nIGFzIG1hbnkgZXZlbnRzIGFzIGFyZVxuICAgICAgLy8gbm93IHVuYmxvY2tlZC4gVGhpcyBmaXJzdCBtaWdodCBub3QgYWN0dWFsbHkgYmUgdW5ibG9ja2VkIHlldC5cbiAgICAgIC8vIFdlIGNvdWxkIGNoZWNrIGl0IGVhcmx5IHRvIGF2b2lkIHNjaGVkdWxpbmcgYW4gdW5uZWNlc3NhcnkgY2FsbGJhY2suXG5cbiAgICAgIFNjaGVkdWxlci51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrKFNjaGVkdWxlci51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eSwgcmVwbGF5VW5ibG9ja2VkRXZlbnRzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmV0cnlJZkJsb2NrZWRPbih1bmJsb2NrZWQpIHtcbiAgLy8gTWFyayBhbnl0aGluZyB0aGF0IHdhcyBibG9ja2VkIG9uIHRoaXMgYXMgbm8gbG9uZ2VyIGJsb2NrZWRcbiAgLy8gYW5kIGVsaWdpYmxlIGZvciBhIHJlcGxheS5cbiAgaWYgKHF1ZXVlZERpc2NyZXRlRXZlbnRzLmxlbmd0aCA+IDApIHtcbiAgICBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkRGlzY3JldGVFdmVudHNbMF0sIHVuYmxvY2tlZCk7IC8vIFRoaXMgaXMgYSBleHBvbmVudGlhbCBzZWFyY2ggZm9yIGVhY2ggYm91bmRhcnkgdGhhdCBjb21taXRzLiBJIHRoaW5rIGl0J3NcbiAgICAvLyB3b3J0aCBpdCBiZWNhdXNlIHdlIGV4cGVjdCB2ZXJ5IGZldyBkaXNjcmV0ZSBldmVudHMgdG8gcXVldWUgdXAgYW5kIG9uY2VcbiAgICAvLyB3ZSBhcmUgYWN0dWFsbHkgZnVsbHkgdW5ibG9ja2VkIGl0IHdpbGwgYmUgZmFzdCB0byByZXBsYXkgdGhlbS5cblxuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgcXVldWVkRGlzY3JldGVFdmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWV1ZWRFdmVudCA9IHF1ZXVlZERpc2NyZXRlRXZlbnRzW2ldO1xuXG4gICAgICBpZiAocXVldWVkRXZlbnQuYmxvY2tlZE9uID09PSB1bmJsb2NrZWQpIHtcbiAgICAgICAgcXVldWVkRXZlbnQuYmxvY2tlZE9uID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAocXVldWVkRm9jdXMgIT09IG51bGwpIHtcbiAgICBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkRm9jdXMsIHVuYmxvY2tlZCk7XG4gIH1cblxuICBpZiAocXVldWVkRHJhZyAhPT0gbnVsbCkge1xuICAgIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWREcmFnLCB1bmJsb2NrZWQpO1xuICB9XG5cbiAgaWYgKHF1ZXVlZE1vdXNlICE9PSBudWxsKSB7XG4gICAgc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZE1vdXNlLCB1bmJsb2NrZWQpO1xuICB9XG5cbiAgdmFyIHVuYmxvY2sgPSBmdW5jdGlvbiAocXVldWVkRXZlbnQpIHtcbiAgICByZXR1cm4gc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZEV2ZW50LCB1bmJsb2NrZWQpO1xuICB9O1xuXG4gIHF1ZXVlZFBvaW50ZXJzLmZvckVhY2godW5ibG9jayk7XG4gIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5mb3JFYWNoKHVuYmxvY2spO1xuXG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIHF1ZXVlZFRhcmdldCA9IHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0c1tfaV07XG5cbiAgICBpZiAocXVldWVkVGFyZ2V0LmJsb2NrZWRPbiA9PT0gdW5ibG9ja2VkKSB7XG4gICAgICBxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICB3aGlsZSAocXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgbmV4dEV4cGxpY2l0VGFyZ2V0ID0gcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzWzBdO1xuXG4gICAgaWYgKG5leHRFeHBsaWNpdFRhcmdldC5ibG9ja2VkT24gIT09IG51bGwpIHtcbiAgICAgIC8vIFdlJ3JlIHN0aWxsIGJsb2NrZWQuXG4gICAgICBicmVhaztcbiAgICB9IGVsc2Uge1xuICAgICAgYXR0ZW1wdEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0KG5leHRFeHBsaWNpdFRhcmdldCk7XG5cbiAgICAgIGlmIChuZXh0RXhwbGljaXRUYXJnZXQuYmxvY2tlZE9uID09PSBudWxsKSB7XG4gICAgICAgIC8vIFdlJ3JlIHVuYmxvY2tlZC5cbiAgICAgICAgcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzLnNoaWZ0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnOyAvLyBUT0RPOiBjYW4gd2Ugc3RvcCBleHBvcnRpbmcgdGhlc2U/XG5cbnZhciBfZW5hYmxlZCA9IHRydWU7IC8vIFRoaXMgaXMgZXhwb3J0ZWQgaW4gRkIgYnVpbGRzIGZvciB1c2UgYnkgbGVnYWN5IEZCIGxheWVyIGluZnJhLlxuLy8gV2UnZCBsaWtlIHRvIHJlbW92ZSB0aGlzIGJ1dCBpdCdzIG5vdCBjbGVhciBpZiB0aGlzIGlzIHNhZmUuXG5cbmZ1bmN0aW9uIHNldEVuYWJsZWQoZW5hYmxlZCkge1xuICBfZW5hYmxlZCA9ICEhZW5hYmxlZDtcbn1cbmZ1bmN0aW9uIGlzRW5hYmxlZCgpIHtcbiAgcmV0dXJuIF9lbmFibGVkO1xufVxuZnVuY3Rpb24gY3JlYXRlRXZlbnRMaXN0ZW5lcldyYXBwZXJXaXRoUHJpb3JpdHkodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MpIHtcbiAgdmFyIGV2ZW50UHJpb3JpdHkgPSBnZXRFdmVudFByaW9yaXR5KGRvbUV2ZW50TmFtZSk7XG4gIHZhciBsaXN0ZW5lcldyYXBwZXI7XG5cbiAgc3dpdGNoIChldmVudFByaW9yaXR5KSB7XG4gICAgY2FzZSBEaXNjcmV0ZUV2ZW50UHJpb3JpdHk6XG4gICAgICBsaXN0ZW5lcldyYXBwZXIgPSBkaXNwYXRjaERpc2NyZXRlRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgQ29udGludW91c0V2ZW50UHJpb3JpdHk6XG4gICAgICBsaXN0ZW5lcldyYXBwZXIgPSBkaXNwYXRjaENvbnRpbnVvdXNFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBEZWZhdWx0RXZlbnRQcmlvcml0eTpcbiAgICBkZWZhdWx0OlxuICAgICAgbGlzdGVuZXJXcmFwcGVyID0gZGlzcGF0Y2hFdmVudDtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIGxpc3RlbmVyV3JhcHBlci5iaW5kKG51bGwsIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hEaXNjcmV0ZUV2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgY29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uO1xuICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uID0gbnVsbDtcblxuICB0cnkge1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShEaXNjcmV0ZUV2ZW50UHJpb3JpdHkpO1xuICAgIGRpc3BhdGNoRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBjb250YWluZXIsIG5hdGl2ZUV2ZW50KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSk7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoQ29udGludW91c0V2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgY29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uO1xuICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uID0gbnVsbDtcblxuICB0cnkge1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShDb250aW51b3VzRXZlbnRQcmlvcml0eSk7XG4gICAgZGlzcGF0Y2hFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGNvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuICB9IGZpbmFsbHkge1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5KTtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgaWYgKCFfZW5hYmxlZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHtcbiAgICBkaXNwYXRjaEV2ZW50V2l0aEVuYWJsZUNhcHR1cmVQaGFzZVNlbGVjdGl2ZUh5ZHJhdGlvbldpdGhvdXREaXNjcmV0ZUV2ZW50UmVwbGF5KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hFdmVudFdpdGhFbmFibGVDYXB0dXJlUGhhc2VTZWxlY3RpdmVIeWRyYXRpb25XaXRob3V0RGlzY3JldGVFdmVudFJlcGxheShkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgdmFyIGJsb2NrZWRPbiA9IGZpbmRJbnN0YW5jZUJsb2NraW5nRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KTtcblxuICBpZiAoYmxvY2tlZE9uID09PSBudWxsKSB7XG4gICAgZGlzcGF0Y2hFdmVudEZvclBsdWdpbkV2ZW50U3lzdGVtKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIHJldHVybl90YXJnZXRJbnN0LCB0YXJnZXRDb250YWluZXIpO1xuICAgIGNsZWFySWZDb250aW51b3VzRXZlbnQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHF1ZXVlSWZDb250aW51b3VzRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpKSB7XG4gICAgbmF0aXZlRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgcmV0dXJuO1xuICB9IC8vIFdlIG5lZWQgdG8gY2xlYXIgb25seSBpZiB3ZSBkaWRuJ3QgcXVldWUgYmVjYXVzZVxuICAvLyBxdWV1ZWluZyBpcyBhY2N1bXVsYXRpdmUuXG5cblxuICBjbGVhcklmQ29udGludW91c0V2ZW50KGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpO1xuXG4gIGlmIChldmVudFN5c3RlbUZsYWdzICYgSVNfQ0FQVFVSRV9QSEFTRSAmJiBpc0Rpc2NyZXRlRXZlbnRUaGF0UmVxdWlyZXNIeWRyYXRpb24oZG9tRXZlbnROYW1lKSkge1xuICAgIHdoaWxlIChibG9ja2VkT24gIT09IG51bGwpIHtcbiAgICAgIHZhciBmaWJlciA9IGdldEluc3RhbmNlRnJvbU5vZGUoYmxvY2tlZE9uKTtcblxuICAgICAgaWYgKGZpYmVyICE9PSBudWxsKSB7XG4gICAgICAgIGF0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbihmaWJlcik7XG4gICAgICB9XG5cbiAgICAgIHZhciBuZXh0QmxvY2tlZE9uID0gZmluZEluc3RhbmNlQmxvY2tpbmdFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuXG4gICAgICBpZiAobmV4dEJsb2NrZWRPbiA9PT0gbnVsbCkge1xuICAgICAgICBkaXNwYXRjaEV2ZW50Rm9yUGx1Z2luRXZlbnRTeXN0ZW0oZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBuYXRpdmVFdmVudCwgcmV0dXJuX3RhcmdldEluc3QsIHRhcmdldENvbnRhaW5lcik7XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXh0QmxvY2tlZE9uID09PSBibG9ja2VkT24pIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGJsb2NrZWRPbiA9IG5leHRCbG9ja2VkT247XG4gICAgfVxuXG4gICAgaWYgKGJsb2NrZWRPbiAhPT0gbnVsbCkge1xuICAgICAgbmF0aXZlRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9IC8vIFRoaXMgaXMgbm90IHJlcGxheWFibGUgc28gd2UnbGwgaW52b2tlIGl0IGJ1dCB3aXRob3V0IGEgdGFyZ2V0LFxuICAvLyBpbiBjYXNlIHRoZSBldmVudCBzeXN0ZW0gbmVlZHMgdG8gdHJhY2UgaXQuXG5cblxuICBkaXNwYXRjaEV2ZW50Rm9yUGx1Z2luRXZlbnRTeXN0ZW0oZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBuYXRpdmVFdmVudCwgbnVsbCwgdGFyZ2V0Q29udGFpbmVyKTtcbn1cblxudmFyIHJldHVybl90YXJnZXRJbnN0ID0gbnVsbDsgLy8gUmV0dXJucyBhIFN1c3BlbnNlSW5zdGFuY2Ugb3IgQ29udGFpbmVyIGlmIGl0J3MgYmxvY2tlZC5cbi8vIFRoZSByZXR1cm5fdGFyZ2V0SW5zdCBmaWVsZCBhYm92ZSBpcyBjb25jZXB0dWFsbHkgcGFydCBvZiB0aGUgcmV0dXJuIHZhbHVlLlxuXG5mdW5jdGlvbiBmaW5kSW5zdGFuY2VCbG9ja2luZ0V2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICAvLyBUT0RPOiBXYXJuIGlmIF9lbmFibGVkIGlzIGZhbHNlLlxuICByZXR1cm5fdGFyZ2V0SW5zdCA9IG51bGw7XG4gIHZhciBuYXRpdmVFdmVudFRhcmdldCA9IGdldEV2ZW50VGFyZ2V0KG5hdGl2ZUV2ZW50KTtcbiAgdmFyIHRhcmdldEluc3QgPSBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShuYXRpdmVFdmVudFRhcmdldCk7XG5cbiAgaWYgKHRhcmdldEluc3QgIT09IG51bGwpIHtcbiAgICB2YXIgbmVhcmVzdE1vdW50ZWQgPSBnZXROZWFyZXN0TW91bnRlZEZpYmVyKHRhcmdldEluc3QpO1xuXG4gICAgaWYgKG5lYXJlc3RNb3VudGVkID09PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIHRyZWUgaGFzIGJlZW4gdW5tb3VudGVkIGFscmVhZHkuIERpc3BhdGNoIHdpdGhvdXQgYSB0YXJnZXQuXG4gICAgICB0YXJnZXRJbnN0ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHRhZyA9IG5lYXJlc3RNb3VudGVkLnRhZztcblxuICAgICAgaWYgKHRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZ2V0U3VzcGVuc2VJbnN0YW5jZUZyb21GaWJlcihuZWFyZXN0TW91bnRlZCk7XG5cbiAgICAgICAgaWYgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gUXVldWUgdGhlIGV2ZW50IHRvIGJlIHJlcGxheWVkIGxhdGVyLiBBYm9ydCBkaXNwYXRjaGluZyBzaW5jZSB3ZVxuICAgICAgICAgIC8vIGRvbid0IHdhbnQgdGhpcyBldmVudCBkaXNwYXRjaGVkIHR3aWNlIHRocm91Z2ggdGhlIGV2ZW50IHN5c3RlbS5cbiAgICAgICAgICAvLyBUT0RPOiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBkaXNjcmV0ZSBldmVudCBpbiB0aGUgcXVldWUuIFNjaGVkdWxlIGFuIGluY3JlYXNlZFxuICAgICAgICAgIC8vIHByaW9yaXR5IGZvciB0aGlzIGJvdW5kYXJ5LlxuICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgICAgfSAvLyBUaGlzIHNob3VsZG4ndCBoYXBwZW4sIHNvbWV0aGluZyB3ZW50IHdyb25nIGJ1dCB0byBhdm9pZCBibG9ja2luZ1xuICAgICAgICAvLyB0aGUgd2hvbGUgc3lzdGVtLCBkaXNwYXRjaCB0aGUgZXZlbnQgd2l0aG91dCBhIHRhcmdldC5cbiAgICAgICAgLy8gVE9ETzogV2Fybi5cblxuXG4gICAgICAgIHRhcmdldEluc3QgPSBudWxsO1xuICAgICAgfSBlbHNlIGlmICh0YWcgPT09IEhvc3RSb290KSB7XG4gICAgICAgIHZhciByb290ID0gbmVhcmVzdE1vdW50ZWQuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmIChpc1Jvb3REZWh5ZHJhdGVkKHJvb3QpKSB7XG4gICAgICAgICAgLy8gSWYgdGhpcyBoYXBwZW5zIGR1cmluZyBhIHJlcGxheSBzb21ldGhpbmcgd2VudCB3cm9uZyBhbmQgaXQgbWlnaHQgYmxvY2tcbiAgICAgICAgICAvLyB0aGUgd2hvbGUgc3lzdGVtLlxuICAgICAgICAgIHJldHVybiBnZXRDb250YWluZXJGcm9tRmliZXIobmVhcmVzdE1vdW50ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGFyZ2V0SW5zdCA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKG5lYXJlc3RNb3VudGVkICE9PSB0YXJnZXRJbnN0KSB7XG4gICAgICAgIC8vIElmIHdlIGdldCBhbiBldmVudCAoZXg6IGltZyBvbmxvYWQpIGJlZm9yZSBjb21taXR0aW5nIHRoYXRcbiAgICAgICAgLy8gY29tcG9uZW50J3MgbW91bnQsIGlnbm9yZSBpdCBmb3Igbm93ICh0aGF0IGlzLCB0cmVhdCBpdCBhcyBpZiBpdCB3YXMgYW5cbiAgICAgICAgLy8gZXZlbnQgb24gYSBub24tUmVhY3QgdHJlZSkuIFdlIG1pZ2h0IGFsc28gY29uc2lkZXIgcXVldWVpbmcgZXZlbnRzIGFuZFxuICAgICAgICAvLyBkaXNwYXRjaGluZyB0aGVtIGFmdGVyIHRoZSBtb3VudC5cbiAgICAgICAgdGFyZ2V0SW5zdCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuX3RhcmdldEluc3QgPSB0YXJnZXRJbnN0OyAvLyBXZSdyZSBub3QgYmxvY2tlZCBvbiBhbnl0aGluZy5cblxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGdldEV2ZW50UHJpb3JpdHkoZG9tRXZlbnROYW1lKSB7XG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgLy8gVXNlZCBieSBTaW1wbGVFdmVudFBsdWdpbjpcbiAgICBjYXNlICdjYW5jZWwnOlxuICAgIGNhc2UgJ2NsaWNrJzpcbiAgICBjYXNlICdjbG9zZSc6XG4gICAgY2FzZSAnY29udGV4dG1lbnUnOlxuICAgIGNhc2UgJ2NvcHknOlxuICAgIGNhc2UgJ2N1dCc6XG4gICAgY2FzZSAnYXV4Y2xpY2snOlxuICAgIGNhc2UgJ2RibGNsaWNrJzpcbiAgICBjYXNlICdkcmFnZW5kJzpcbiAgICBjYXNlICdkcmFnc3RhcnQnOlxuICAgIGNhc2UgJ2Ryb3AnOlxuICAgIGNhc2UgJ2ZvY3VzaW4nOlxuICAgIGNhc2UgJ2ZvY3Vzb3V0JzpcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgY2FzZSAnaW52YWxpZCc6XG4gICAgY2FzZSAna2V5ZG93bic6XG4gICAgY2FzZSAna2V5cHJlc3MnOlxuICAgIGNhc2UgJ2tleXVwJzpcbiAgICBjYXNlICdtb3VzZWRvd24nOlxuICAgIGNhc2UgJ21vdXNldXAnOlxuICAgIGNhc2UgJ3Bhc3RlJzpcbiAgICBjYXNlICdwYXVzZSc6XG4gICAgY2FzZSAncGxheSc6XG4gICAgY2FzZSAncG9pbnRlcmNhbmNlbCc6XG4gICAgY2FzZSAncG9pbnRlcmRvd24nOlxuICAgIGNhc2UgJ3BvaW50ZXJ1cCc6XG4gICAgY2FzZSAncmF0ZWNoYW5nZSc6XG4gICAgY2FzZSAncmVzZXQnOlxuICAgIGNhc2UgJ3Jlc2l6ZSc6XG4gICAgY2FzZSAnc2Vla2VkJzpcbiAgICBjYXNlICdzdWJtaXQnOlxuICAgIGNhc2UgJ3RvdWNoY2FuY2VsJzpcbiAgICBjYXNlICd0b3VjaGVuZCc6XG4gICAgY2FzZSAndG91Y2hzdGFydCc6XG4gICAgY2FzZSAndm9sdW1lY2hhbmdlJzogLy8gVXNlZCBieSBwb2x5ZmlsbHM6XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICBjYXNlICdjaGFuZ2UnOlxuICAgIGNhc2UgJ3NlbGVjdGlvbmNoYW5nZSc6XG4gICAgY2FzZSAndGV4dElucHV0JzpcbiAgICBjYXNlICdjb21wb3NpdGlvbnN0YXJ0JzpcbiAgICBjYXNlICdjb21wb3NpdGlvbmVuZCc6XG4gICAgY2FzZSAnY29tcG9zaXRpb251cGRhdGUnOiAvLyBPbmx5IGVuYWJsZUNyZWF0ZUV2ZW50SGFuZGxlQVBJOlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgY2FzZSAnYmVmb3JlYmx1cic6XG4gICAgY2FzZSAnYWZ0ZXJibHVyJzogLy8gTm90IHVzZWQgYnkgUmVhY3QgYnV0IGNvdWxkIGJlIGJ5IHVzZXIgY29kZTpcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgIGNhc2UgJ2JlZm9yZWlucHV0JzpcbiAgICBjYXNlICdibHVyJzpcbiAgICBjYXNlICdmdWxsc2NyZWVuY2hhbmdlJzpcbiAgICBjYXNlICdmb2N1cyc6XG4gICAgY2FzZSAnaGFzaGNoYW5nZSc6XG4gICAgY2FzZSAncG9wc3RhdGUnOlxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgY2FzZSAnc2VsZWN0c3RhcnQnOlxuICAgICAgcmV0dXJuIERpc2NyZXRlRXZlbnRQcmlvcml0eTtcblxuICAgIGNhc2UgJ2RyYWcnOlxuICAgIGNhc2UgJ2RyYWdlbnRlcic6XG4gICAgY2FzZSAnZHJhZ2V4aXQnOlxuICAgIGNhc2UgJ2RyYWdsZWF2ZSc6XG4gICAgY2FzZSAnZHJhZ292ZXInOlxuICAgIGNhc2UgJ21vdXNlbW92ZSc6XG4gICAgY2FzZSAnbW91c2VvdXQnOlxuICAgIGNhc2UgJ21vdXNlb3Zlcic6XG4gICAgY2FzZSAncG9pbnRlcm1vdmUnOlxuICAgIGNhc2UgJ3BvaW50ZXJvdXQnOlxuICAgIGNhc2UgJ3BvaW50ZXJvdmVyJzpcbiAgICBjYXNlICdzY3JvbGwnOlxuICAgIGNhc2UgJ3RvZ2dsZSc6XG4gICAgY2FzZSAndG91Y2htb3ZlJzpcbiAgICBjYXNlICd3aGVlbCc6IC8vIE5vdCB1c2VkIGJ5IFJlYWN0IGJ1dCBjb3VsZCBiZSBieSB1c2VyIGNvZGU6XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICBjYXNlICdtb3VzZWVudGVyJzpcbiAgICBjYXNlICdtb3VzZWxlYXZlJzpcbiAgICBjYXNlICdwb2ludGVyZW50ZXInOlxuICAgIGNhc2UgJ3BvaW50ZXJsZWF2ZSc6XG4gICAgICByZXR1cm4gQ29udGludW91c0V2ZW50UHJpb3JpdHk7XG5cbiAgICBjYXNlICdtZXNzYWdlJzpcbiAgICAgIHtcbiAgICAgICAgLy8gV2UgbWlnaHQgYmUgaW4gdGhlIFNjaGVkdWxlciBjYWxsYmFjay5cbiAgICAgICAgLy8gRXZlbnR1YWxseSB0aGlzIG1lY2hhbmlzbSB3aWxsIGJlIHJlcGxhY2VkIGJ5IGEgY2hlY2tcbiAgICAgICAgLy8gb2YgdGhlIGN1cnJlbnQgcHJpb3JpdHkgb24gdGhlIG5hdGl2ZSBzY2hlZHVsZXIuXG4gICAgICAgIHZhciBzY2hlZHVsZXJQcmlvcml0eSA9IGdldEN1cnJlbnRQcmlvcml0eUxldmVsKCk7XG5cbiAgICAgICAgc3dpdGNoIChzY2hlZHVsZXJQcmlvcml0eSkge1xuICAgICAgICAgIGNhc2UgSW1tZWRpYXRlUHJpb3JpdHk6XG4gICAgICAgICAgICByZXR1cm4gRGlzY3JldGVFdmVudFByaW9yaXR5O1xuXG4gICAgICAgICAgY2FzZSBVc2VyQmxvY2tpbmdQcmlvcml0eTpcbiAgICAgICAgICAgIHJldHVybiBDb250aW51b3VzRXZlbnRQcmlvcml0eTtcblxuICAgICAgICAgIGNhc2UgTm9ybWFsUHJpb3JpdHk6XG4gICAgICAgICAgY2FzZSBMb3dQcmlvcml0eTpcbiAgICAgICAgICAgIC8vIFRPRE86IEhhbmRsZSBMb3dTY2hlZHVsZXJQcmlvcml0eSwgc29tZWhvdy4gTWF5YmUgdGhlIHNhbWUgbGFuZSBhcyBoeWRyYXRpb24uXG4gICAgICAgICAgICByZXR1cm4gRGVmYXVsdEV2ZW50UHJpb3JpdHk7XG5cbiAgICAgICAgICBjYXNlIElkbGVQcmlvcml0eTpcbiAgICAgICAgICAgIHJldHVybiBJZGxlRXZlbnRQcmlvcml0eTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gRGVmYXVsdEV2ZW50UHJpb3JpdHk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gRGVmYXVsdEV2ZW50UHJpb3JpdHk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkRXZlbnRCdWJibGVMaXN0ZW5lcih0YXJnZXQsIGV2ZW50VHlwZSwgbGlzdGVuZXIpIHtcbiAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lciwgZmFsc2UpO1xuICByZXR1cm4gbGlzdGVuZXI7XG59XG5mdW5jdGlvbiBhZGRFdmVudENhcHR1cmVMaXN0ZW5lcih0YXJnZXQsIGV2ZW50VHlwZSwgbGlzdGVuZXIpIHtcbiAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lciwgdHJ1ZSk7XG4gIHJldHVybiBsaXN0ZW5lcjtcbn1cbmZ1bmN0aW9uIGFkZEV2ZW50Q2FwdHVyZUxpc3RlbmVyV2l0aFBhc3NpdmVGbGFnKHRhcmdldCwgZXZlbnRUeXBlLCBsaXN0ZW5lciwgcGFzc2l2ZSkge1xuICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyLCB7XG4gICAgY2FwdHVyZTogdHJ1ZSxcbiAgICBwYXNzaXZlOiBwYXNzaXZlXG4gIH0pO1xuICByZXR1cm4gbGlzdGVuZXI7XG59XG5mdW5jdGlvbiBhZGRFdmVudEJ1YmJsZUxpc3RlbmVyV2l0aFBhc3NpdmVGbGFnKHRhcmdldCwgZXZlbnRUeXBlLCBsaXN0ZW5lciwgcGFzc2l2ZSkge1xuICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyLCB7XG4gICAgcGFzc2l2ZTogcGFzc2l2ZVxuICB9KTtcbiAgcmV0dXJuIGxpc3RlbmVyO1xufVxuXG4vKipcbiAqIFRoZXNlIHZhcmlhYmxlcyBzdG9yZSBpbmZvcm1hdGlvbiBhYm91dCB0ZXh0IGNvbnRlbnQgb2YgYSB0YXJnZXQgbm9kZSxcbiAqIGFsbG93aW5nIGNvbXBhcmlzb24gb2YgY29udGVudCBiZWZvcmUgYW5kIGFmdGVyIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogSWRlbnRpZnkgdGhlIG5vZGUgd2hlcmUgc2VsZWN0aW9uIGN1cnJlbnRseSBiZWdpbnMsIHRoZW4gb2JzZXJ2ZVxuICogYm90aCBpdHMgdGV4dCBjb250ZW50IGFuZCBpdHMgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgRE9NLiBTaW5jZSB0aGVcbiAqIGJyb3dzZXIgbWF5IG5hdGl2ZWx5IHJlcGxhY2UgdGhlIHRhcmdldCBub2RlIGR1cmluZyBjb21wb3NpdGlvbiwgd2UgY2FuXG4gKiB1c2UgaXRzIHBvc2l0aW9uIHRvIGZpbmQgaXRzIHJlcGxhY2VtZW50LlxuICpcbiAqXG4gKi9cbnZhciByb290ID0gbnVsbDtcbnZhciBzdGFydFRleHQgPSBudWxsO1xudmFyIGZhbGxiYWNrVGV4dCA9IG51bGw7XG5mdW5jdGlvbiBpbml0aWFsaXplKG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHJvb3QgPSBuYXRpdmVFdmVudFRhcmdldDtcbiAgc3RhcnRUZXh0ID0gZ2V0VGV4dCgpO1xuICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHJlc2V0KCkge1xuICByb290ID0gbnVsbDtcbiAgc3RhcnRUZXh0ID0gbnVsbDtcbiAgZmFsbGJhY2tUZXh0ID0gbnVsbDtcbn1cbmZ1bmN0aW9uIGdldERhdGEoKSB7XG4gIGlmIChmYWxsYmFja1RleHQpIHtcbiAgICByZXR1cm4gZmFsbGJhY2tUZXh0O1xuICB9XG5cbiAgdmFyIHN0YXJ0O1xuICB2YXIgc3RhcnRWYWx1ZSA9IHN0YXJ0VGV4dDtcbiAgdmFyIHN0YXJ0TGVuZ3RoID0gc3RhcnRWYWx1ZS5sZW5ndGg7XG4gIHZhciBlbmQ7XG4gIHZhciBlbmRWYWx1ZSA9IGdldFRleHQoKTtcbiAgdmFyIGVuZExlbmd0aCA9IGVuZFZhbHVlLmxlbmd0aDtcblxuICBmb3IgKHN0YXJ0ID0gMDsgc3RhcnQgPCBzdGFydExlbmd0aDsgc3RhcnQrKykge1xuICAgIGlmIChzdGFydFZhbHVlW3N0YXJ0XSAhPT0gZW5kVmFsdWVbc3RhcnRdKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2YXIgbWluRW5kID0gc3RhcnRMZW5ndGggLSBzdGFydDtcblxuICBmb3IgKGVuZCA9IDE7IGVuZCA8PSBtaW5FbmQ7IGVuZCsrKSB7XG4gICAgaWYgKHN0YXJ0VmFsdWVbc3RhcnRMZW5ndGggLSBlbmRdICE9PSBlbmRWYWx1ZVtlbmRMZW5ndGggLSBlbmRdKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2YXIgc2xpY2VUYWlsID0gZW5kID4gMSA/IDEgLSBlbmQgOiB1bmRlZmluZWQ7XG4gIGZhbGxiYWNrVGV4dCA9IGVuZFZhbHVlLnNsaWNlKHN0YXJ0LCBzbGljZVRhaWwpO1xuICByZXR1cm4gZmFsbGJhY2tUZXh0O1xufVxuZnVuY3Rpb24gZ2V0VGV4dCgpIHtcbiAgaWYgKCd2YWx1ZScgaW4gcm9vdCkge1xuICAgIHJldHVybiByb290LnZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHJvb3QudGV4dENvbnRlbnQ7XG59XG5cbi8qKlxuICogYGNoYXJDb2RlYCByZXByZXNlbnRzIHRoZSBhY3R1YWwgXCJjaGFyYWN0ZXIgY29kZVwiIGFuZCBpcyBzYWZlIHRvIHVzZSB3aXRoXG4gKiBgU3RyaW5nLmZyb21DaGFyQ29kZWAuIEFzIHN1Y2gsIG9ubHkga2V5cyB0aGF0IGNvcnJlc3BvbmQgdG8gcHJpbnRhYmxlXG4gKiBjaGFyYWN0ZXJzIHByb2R1Y2UgYSB2YWxpZCBgY2hhckNvZGVgLCB0aGUgb25seSBleGNlcHRpb24gdG8gdGhpcyBpcyBFbnRlci5cbiAqIFRoZSBUYWIta2V5IGlzIGNvbnNpZGVyZWQgbm9uLXByaW50YWJsZSBhbmQgZG9lcyBub3QgaGF2ZSBhIGBjaGFyQ29kZWAsXG4gKiBwcmVzdW1hYmx5IGJlY2F1c2UgaXQgZG9lcyBub3QgcHJvZHVjZSBhIHRhYi1jaGFyYWN0ZXIgaW4gYnJvd3NlcnMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQHJldHVybiB7bnVtYmVyfSBOb3JtYWxpemVkIGBjaGFyQ29kZWAgcHJvcGVydHkuXG4gKi9cbmZ1bmN0aW9uIGdldEV2ZW50Q2hhckNvZGUobmF0aXZlRXZlbnQpIHtcbiAgdmFyIGNoYXJDb2RlO1xuICB2YXIga2V5Q29kZSA9IG5hdGl2ZUV2ZW50LmtleUNvZGU7XG5cbiAgaWYgKCdjaGFyQ29kZScgaW4gbmF0aXZlRXZlbnQpIHtcbiAgICBjaGFyQ29kZSA9IG5hdGl2ZUV2ZW50LmNoYXJDb2RlOyAvLyBGRiBkb2VzIG5vdCBzZXQgYGNoYXJDb2RlYCBmb3IgdGhlIEVudGVyLWtleSwgY2hlY2sgYWdhaW5zdCBga2V5Q29kZWAuXG5cbiAgICBpZiAoY2hhckNvZGUgPT09IDAgJiYga2V5Q29kZSA9PT0gMTMpIHtcbiAgICAgIGNoYXJDb2RlID0gMTM7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIElFOCBkb2VzIG5vdCBpbXBsZW1lbnQgYGNoYXJDb2RlYCwgYnV0IGBrZXlDb2RlYCBoYXMgdGhlIGNvcnJlY3QgdmFsdWUuXG4gICAgY2hhckNvZGUgPSBrZXlDb2RlO1xuICB9IC8vIElFIGFuZCBFZGdlIChvbiBXaW5kb3dzKSBhbmQgQ2hyb21lIC8gU2FmYXJpIChvbiBXaW5kb3dzIGFuZCBMaW51eClcbiAgLy8gcmVwb3J0IEVudGVyIGFzIGNoYXJDb2RlIDEwIHdoZW4gY3RybCBpcyBwcmVzc2VkLlxuXG5cbiAgaWYgKGNoYXJDb2RlID09PSAxMCkge1xuICAgIGNoYXJDb2RlID0gMTM7XG4gIH0gLy8gU29tZSBub24tcHJpbnRhYmxlIGtleXMgYXJlIHJlcG9ydGVkIGluIGBjaGFyQ29kZWAvYGtleUNvZGVgLCBkaXNjYXJkIHRoZW0uXG4gIC8vIE11c3Qgbm90IGRpc2NhcmQgdGhlIChub24tKXByaW50YWJsZSBFbnRlci1rZXkuXG5cblxuICBpZiAoY2hhckNvZGUgPj0gMzIgfHwgY2hhckNvZGUgPT09IDEzKSB7XG4gICAgcmV0dXJuIGNoYXJDb2RlO1xuICB9XG5cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGZ1bmN0aW9uVGhhdFJldHVybnNUcnVlKCkge1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZnVuY3Rpb25UaGF0UmV0dXJuc0ZhbHNlKCkge1xuICByZXR1cm4gZmFsc2U7XG59IC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhIGZhY3Rvcnkgc28gdGhhdCB3ZSBoYXZlIGRpZmZlcmVudCByZXR1cm5lZCBjb25zdHJ1Y3RvcnMuXG4vLyBJZiB3ZSBoYWQgYSBzaW5nbGUgY29uc3RydWN0b3IsIGl0IHdvdWxkIGJlIG1lZ2Ftb3JwaGljIGFuZCBlbmdpbmVzIHdvdWxkIGRlb3B0LlxuXG5cbmZ1bmN0aW9uIGNyZWF0ZVN5bnRoZXRpY0V2ZW50KEludGVyZmFjZSkge1xuICAvKipcbiAgICogU3ludGhldGljIGV2ZW50cyBhcmUgZGlzcGF0Y2hlZCBieSBldmVudCBwbHVnaW5zLCB0eXBpY2FsbHkgaW4gcmVzcG9uc2UgdG8gYVxuICAgKiB0b3AtbGV2ZWwgZXZlbnQgZGVsZWdhdGlvbiBoYW5kbGVyLlxuICAgKlxuICAgKiBUaGVzZSBzeXN0ZW1zIHNob3VsZCBnZW5lcmFsbHkgdXNlIHBvb2xpbmcgdG8gcmVkdWNlIHRoZSBmcmVxdWVuY3kgb2YgZ2FyYmFnZVxuICAgKiBjb2xsZWN0aW9uLiBUaGUgc3lzdGVtIHNob3VsZCBjaGVjayBgaXNQZXJzaXN0ZW50YCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGVcbiAgICogZXZlbnQgc2hvdWxkIGJlIHJlbGVhc2VkIGludG8gdGhlIHBvb2wgYWZ0ZXIgYmVpbmcgZGlzcGF0Y2hlZC4gVXNlcnMgdGhhdFxuICAgKiBuZWVkIGEgcGVyc2lzdGVkIGV2ZW50IHNob3VsZCBpbnZva2UgYHBlcnNpc3RgLlxuICAgKlxuICAgKiBTeW50aGV0aWMgZXZlbnRzIChhbmQgc3ViY2xhc3NlcykgaW1wbGVtZW50IHRoZSBET00gTGV2ZWwgMyBFdmVudHMgQVBJIGJ5XG4gICAqIG5vcm1hbGl6aW5nIGJyb3dzZXIgcXVpcmtzLiBTdWJjbGFzc2VzIGRvIG5vdCBuZWNlc3NhcmlseSBoYXZlIHRvIGltcGxlbWVudCBhXG4gICAqIERPTSBpbnRlcmZhY2U7IGN1c3RvbSBhcHBsaWNhdGlvbi1zcGVjaWZpYyBldmVudHMgY2FuIGFsc28gc3ViY2xhc3MgdGhpcy5cbiAgICovXG4gIGZ1bmN0aW9uIFN5bnRoZXRpY0Jhc2VFdmVudChyZWFjdE5hbWUsIHJlYWN0RXZlbnRUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgICB0aGlzLl9yZWFjdE5hbWUgPSByZWFjdE5hbWU7XG4gICAgdGhpcy5fdGFyZ2V0SW5zdCA9IHRhcmdldEluc3Q7XG4gICAgdGhpcy50eXBlID0gcmVhY3RFdmVudFR5cGU7XG4gICAgdGhpcy5uYXRpdmVFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgIHRoaXMudGFyZ2V0ID0gbmF0aXZlRXZlbnRUYXJnZXQ7XG4gICAgdGhpcy5jdXJyZW50VGFyZ2V0ID0gbnVsbDtcblxuICAgIGZvciAodmFyIF9wcm9wTmFtZSBpbiBJbnRlcmZhY2UpIHtcbiAgICAgIGlmICghSW50ZXJmYWNlLmhhc093blByb3BlcnR5KF9wcm9wTmFtZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBub3JtYWxpemUgPSBJbnRlcmZhY2VbX3Byb3BOYW1lXTtcblxuICAgICAgaWYgKG5vcm1hbGl6ZSkge1xuICAgICAgICB0aGlzW19wcm9wTmFtZV0gPSBub3JtYWxpemUobmF0aXZlRXZlbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpc1tfcHJvcE5hbWVdID0gbmF0aXZlRXZlbnRbX3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdFByZXZlbnRlZCA9IG5hdGl2ZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgIT0gbnVsbCA/IG5hdGl2ZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgOiBuYXRpdmVFdmVudC5yZXR1cm5WYWx1ZSA9PT0gZmFsc2U7XG5cbiAgICBpZiAoZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBmdW5jdGlvblRoYXRSZXR1cm5zRmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IGZ1bmN0aW9uVGhhdFJldHVybnNGYWxzZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFzc2lnbihTeW50aGV0aWNCYXNlRXZlbnQucHJvdG90eXBlLCB7XG4gICAgcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7XG4gICAgICB2YXIgZXZlbnQgPSB0aGlzLm5hdGl2ZUV2ZW50O1xuXG4gICAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LnByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IC8vICRGbG93Rml4TWUgLSBmbG93IGlzIG5vdCBhd2FyZSBvZiBgdW5rbm93bmAgaW4gSUVcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGV2ZW50LnJldHVyblZhbHVlICE9PSAndW5rbm93bicpIHtcbiAgICAgICAgZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZTtcbiAgICB9LFxuICAgIHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGV2ZW50ID0gdGhpcy5uYXRpdmVFdmVudDtcblxuICAgICAgaWYgKCFldmVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5zdG9wUHJvcGFnYXRpb24pIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IC8vICRGbG93Rml4TWUgLSBmbG93IGlzIG5vdCBhd2FyZSBvZiBgdW5rbm93bmAgaW4gSUVcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGV2ZW50LmNhbmNlbEJ1YmJsZSAhPT0gJ3Vua25vd24nKSB7XG4gICAgICAgIC8vIFRoZSBDaGFuZ2VFdmVudFBsdWdpbiByZWdpc3RlcnMgYSBcInByb3BlcnR5Y2hhbmdlXCIgZXZlbnQgZm9yXG4gICAgICAgIC8vIElFLiBUaGlzIGV2ZW50IGRvZXMgbm90IHN1cHBvcnQgYnViYmxpbmcgb3IgY2FuY2VsbGluZywgYW5kXG4gICAgICAgIC8vIGFueSByZWZlcmVuY2VzIHRvIGNhbmNlbEJ1YmJsZSB0aHJvdyBcIk1lbWJlciBub3QgZm91bmRcIi4gIEFcbiAgICAgICAgLy8gdHlwZW9mIGNoZWNrIG9mIFwidW5rbm93blwiIGNpcmN1bXZlbnRzIHRoaXMgaXNzdWUgKGFuZCBpcyBhbHNvXG4gICAgICAgIC8vIElFIHNwZWNpZmljKS5cbiAgICAgICAgZXZlbnQuY2FuY2VsQnViYmxlID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IGZ1bmN0aW9uVGhhdFJldHVybnNUcnVlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBXZSByZWxlYXNlIGFsbCBkaXNwYXRjaGVkIGBTeW50aGV0aWNFdmVudGBzIGFmdGVyIGVhY2ggZXZlbnQgbG9vcCwgYWRkaW5nXG4gICAgICogdGhlbSBiYWNrIGludG8gdGhlIHBvb2wuIFRoaXMgYWxsb3dzIGEgd2F5IHRvIGhvbGQgb250byBhIHJlZmVyZW5jZSB0aGF0XG4gICAgICogd29uJ3QgYmUgYWRkZWQgYmFjayBpbnRvIHRoZSBwb29sLlxuICAgICAqL1xuICAgIHBlcnNpc3Q6IGZ1bmN0aW9uICgpIHsvLyBNb2Rlcm4gZXZlbnQgc3lzdGVtIGRvZXNuJ3QgdXNlIHBvb2xpbmcuXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGlzIGV2ZW50IHNob3VsZCBiZSByZWxlYXNlZCBiYWNrIGludG8gdGhlIHBvb2wuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoaXMgc2hvdWxkIG5vdCBiZSByZWxlYXNlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGlzUGVyc2lzdGVudDogZnVuY3Rpb25UaGF0UmV0dXJuc1RydWVcbiAgfSk7XG4gIHJldHVybiBTeW50aGV0aWNCYXNlRXZlbnQ7XG59XG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG5cblxudmFyIEV2ZW50SW50ZXJmYWNlID0ge1xuICBldmVudFBoYXNlOiAwLFxuICBidWJibGVzOiAwLFxuICBjYW5jZWxhYmxlOiAwLFxuICB0aW1lU3RhbXA6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiBldmVudC50aW1lU3RhbXAgfHwgRGF0ZS5ub3coKTtcbiAgfSxcbiAgZGVmYXVsdFByZXZlbnRlZDogMCxcbiAgaXNUcnVzdGVkOiAwXG59O1xudmFyIFN5bnRoZXRpY0V2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoRXZlbnRJbnRlcmZhY2UpO1xuXG52YXIgVUlFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgRXZlbnRJbnRlcmZhY2UsIHtcbiAgdmlldzogMCxcbiAgZGV0YWlsOiAwXG59KTtcblxudmFyIFN5bnRoZXRpY1VJRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChVSUV2ZW50SW50ZXJmYWNlKTtcbnZhciBsYXN0TW92ZW1lbnRYO1xudmFyIGxhc3RNb3ZlbWVudFk7XG52YXIgbGFzdE1vdXNlRXZlbnQ7XG5cbmZ1bmN0aW9uIHVwZGF0ZU1vdXNlTW92ZW1lbnRQb2x5ZmlsbFN0YXRlKGV2ZW50KSB7XG4gIGlmIChldmVudCAhPT0gbGFzdE1vdXNlRXZlbnQpIHtcbiAgICBpZiAobGFzdE1vdXNlRXZlbnQgJiYgZXZlbnQudHlwZSA9PT0gJ21vdXNlbW92ZScpIHtcbiAgICAgIGxhc3RNb3ZlbWVudFggPSBldmVudC5zY3JlZW5YIC0gbGFzdE1vdXNlRXZlbnQuc2NyZWVuWDtcbiAgICAgIGxhc3RNb3ZlbWVudFkgPSBldmVudC5zY3JlZW5ZIC0gbGFzdE1vdXNlRXZlbnQuc2NyZWVuWTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGFzdE1vdmVtZW50WCA9IDA7XG4gICAgICBsYXN0TW92ZW1lbnRZID0gMDtcbiAgICB9XG5cbiAgICBsYXN0TW91c2VFdmVudCA9IGV2ZW50O1xuICB9XG59XG4vKipcbiAqIEBpbnRlcmZhY2UgTW91c2VFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxuXG52YXIgTW91c2VFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgVUlFdmVudEludGVyZmFjZSwge1xuICBzY3JlZW5YOiAwLFxuICBzY3JlZW5ZOiAwLFxuICBjbGllbnRYOiAwLFxuICBjbGllbnRZOiAwLFxuICBwYWdlWDogMCxcbiAgcGFnZVk6IDAsXG4gIGN0cmxLZXk6IDAsXG4gIHNoaWZ0S2V5OiAwLFxuICBhbHRLZXk6IDAsXG4gIG1ldGFLZXk6IDAsXG4gIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJTdGF0ZSxcbiAgYnV0dG9uOiAwLFxuICBidXR0b25zOiAwLFxuICByZWxhdGVkVGFyZ2V0OiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQucmVsYXRlZFRhcmdldCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZXZlbnQuZnJvbUVsZW1lbnQgPT09IGV2ZW50LnNyY0VsZW1lbnQgPyBldmVudC50b0VsZW1lbnQgOiBldmVudC5mcm9tRWxlbWVudDtcbiAgICByZXR1cm4gZXZlbnQucmVsYXRlZFRhcmdldDtcbiAgfSxcbiAgbW92ZW1lbnRYOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoJ21vdmVtZW50WCcgaW4gZXZlbnQpIHtcbiAgICAgIHJldHVybiBldmVudC5tb3ZlbWVudFg7XG4gICAgfVxuXG4gICAgdXBkYXRlTW91c2VNb3ZlbWVudFBvbHlmaWxsU3RhdGUoZXZlbnQpO1xuICAgIHJldHVybiBsYXN0TW92ZW1lbnRYO1xuICB9LFxuICBtb3ZlbWVudFk6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmICgnbW92ZW1lbnRZJyBpbiBldmVudCkge1xuICAgICAgcmV0dXJuIGV2ZW50Lm1vdmVtZW50WTtcbiAgICB9IC8vIERvbid0IG5lZWQgdG8gY2FsbCB1cGRhdGVNb3VzZU1vdmVtZW50UG9seWZpbGxTdGF0ZSgpIGhlcmVcbiAgICAvLyBiZWNhdXNlIGl0J3MgZ3VhcmFudGVlZCB0byBoYXZlIGFscmVhZHkgcnVuIHdoZW4gbW92ZW1lbnRYXG4gICAgLy8gd2FzIGNvcGllZC5cblxuXG4gICAgcmV0dXJuIGxhc3RNb3ZlbWVudFk7XG4gIH1cbn0pO1xuXG52YXIgU3ludGhldGljTW91c2VFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KE1vdXNlRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIERyYWdFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxudmFyIERyYWdFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgTW91c2VFdmVudEludGVyZmFjZSwge1xuICBkYXRhVHJhbnNmZXI6IDBcbn0pO1xuXG52YXIgU3ludGhldGljRHJhZ0V2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoRHJhZ0V2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBGb2N1c0V2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG52YXIgRm9jdXNFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgVUlFdmVudEludGVyZmFjZSwge1xuICByZWxhdGVkVGFyZ2V0OiAwXG59KTtcblxudmFyIFN5bnRoZXRpY0ZvY3VzRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChGb2N1c0V2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWFuaW1hdGlvbnMvI0FuaW1hdGlvbkV2ZW50LWludGVyZmFjZVxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQW5pbWF0aW9uRXZlbnRcbiAqL1xuXG52YXIgQW5pbWF0aW9uRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gIGFuaW1hdGlvbk5hbWU6IDAsXG4gIGVsYXBzZWRUaW1lOiAwLFxuICBwc2V1ZG9FbGVtZW50OiAwXG59KTtcblxudmFyIFN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoQW5pbWF0aW9uRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2NsaXBib2FyZC1hcGlzL1xuICovXG5cbnZhciBDbGlwYm9hcmRFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgRXZlbnRJbnRlcmZhY2UsIHtcbiAgY2xpcGJvYXJkRGF0YTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuICdjbGlwYm9hcmREYXRhJyBpbiBldmVudCA/IGV2ZW50LmNsaXBib2FyZERhdGEgOiB3aW5kb3cuY2xpcGJvYXJkRGF0YTtcbiAgfVxufSk7XG5cbnZhciBTeW50aGV0aWNDbGlwYm9hcmRFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KENsaXBib2FyZEV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvI2V2ZW50cy1jb21wb3NpdGlvbmV2ZW50c1xuICovXG5cbnZhciBDb21wb3NpdGlvbkV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwge1xuICBkYXRhOiAwXG59KTtcblxudmFyIFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChDb21wb3NpdGlvbkV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDEzL1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDEzMTEwNVxuICogICAgICAvI2V2ZW50cy1pbnB1dGV2ZW50c1xuICovXG4vLyBIYXBwZW5zIHRvIHNoYXJlIHRoZSBzYW1lIGxpc3QgZm9yIG5vdy5cblxudmFyIFN5bnRoZXRpY0lucHV0RXZlbnQgPSBTeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50O1xuLyoqXG4gKiBOb3JtYWxpemF0aW9uIG9mIGRlcHJlY2F0ZWQgSFRNTDUgYGtleWAgdmFsdWVzXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50I0tleV9uYW1lc1xuICovXG5cbnZhciBub3JtYWxpemVLZXkgPSB7XG4gIEVzYzogJ0VzY2FwZScsXG4gIFNwYWNlYmFyOiAnICcsXG4gIExlZnQ6ICdBcnJvd0xlZnQnLFxuICBVcDogJ0Fycm93VXAnLFxuICBSaWdodDogJ0Fycm93UmlnaHQnLFxuICBEb3duOiAnQXJyb3dEb3duJyxcbiAgRGVsOiAnRGVsZXRlJyxcbiAgV2luOiAnT1MnLFxuICBNZW51OiAnQ29udGV4dE1lbnUnLFxuICBBcHBzOiAnQ29udGV4dE1lbnUnLFxuICBTY3JvbGw6ICdTY3JvbGxMb2NrJyxcbiAgTW96UHJpbnRhYmxlS2V5OiAnVW5pZGVudGlmaWVkJ1xufTtcbi8qKlxuICogVHJhbnNsYXRpb24gZnJvbSBsZWdhY3kgYGtleUNvZGVgIHRvIEhUTUw1IGBrZXlgXG4gKiBPbmx5IHNwZWNpYWwga2V5cyBzdXBwb3J0ZWQsIGFsbCBvdGhlcnMgZGVwZW5kIG9uIGtleWJvYXJkIGxheW91dCBvciBicm93c2VyXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50I0tleV9uYW1lc1xuICovXG5cbnZhciB0cmFuc2xhdGVUb0tleSA9IHtcbiAgJzgnOiAnQmFja3NwYWNlJyxcbiAgJzknOiAnVGFiJyxcbiAgJzEyJzogJ0NsZWFyJyxcbiAgJzEzJzogJ0VudGVyJyxcbiAgJzE2JzogJ1NoaWZ0JyxcbiAgJzE3JzogJ0NvbnRyb2wnLFxuICAnMTgnOiAnQWx0JyxcbiAgJzE5JzogJ1BhdXNlJyxcbiAgJzIwJzogJ0NhcHNMb2NrJyxcbiAgJzI3JzogJ0VzY2FwZScsXG4gICczMic6ICcgJyxcbiAgJzMzJzogJ1BhZ2VVcCcsXG4gICczNCc6ICdQYWdlRG93bicsXG4gICczNSc6ICdFbmQnLFxuICAnMzYnOiAnSG9tZScsXG4gICczNyc6ICdBcnJvd0xlZnQnLFxuICAnMzgnOiAnQXJyb3dVcCcsXG4gICczOSc6ICdBcnJvd1JpZ2h0JyxcbiAgJzQwJzogJ0Fycm93RG93bicsXG4gICc0NSc6ICdJbnNlcnQnLFxuICAnNDYnOiAnRGVsZXRlJyxcbiAgJzExMic6ICdGMScsXG4gICcxMTMnOiAnRjInLFxuICAnMTE0JzogJ0YzJyxcbiAgJzExNSc6ICdGNCcsXG4gICcxMTYnOiAnRjUnLFxuICAnMTE3JzogJ0Y2JyxcbiAgJzExOCc6ICdGNycsXG4gICcxMTknOiAnRjgnLFxuICAnMTIwJzogJ0Y5JyxcbiAgJzEyMSc6ICdGMTAnLFxuICAnMTIyJzogJ0YxMScsXG4gICcxMjMnOiAnRjEyJyxcbiAgJzE0NCc6ICdOdW1Mb2NrJyxcbiAgJzE0NSc6ICdTY3JvbGxMb2NrJyxcbiAgJzIyNCc6ICdNZXRhJ1xufTtcbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQHJldHVybiB7c3RyaW5nfSBOb3JtYWxpemVkIGBrZXlgIHByb3BlcnR5LlxuICovXG5cbmZ1bmN0aW9uIGdldEV2ZW50S2V5KG5hdGl2ZUV2ZW50KSB7XG4gIGlmIChuYXRpdmVFdmVudC5rZXkpIHtcbiAgICAvLyBOb3JtYWxpemUgaW5jb25zaXN0ZW50IHZhbHVlcyByZXBvcnRlZCBieSBicm93c2VycyBkdWUgdG9cbiAgICAvLyBpbXBsZW1lbnRhdGlvbnMgb2YgYSB3b3JraW5nIGRyYWZ0IHNwZWNpZmljYXRpb24uXG4gICAgLy8gRmlyZUZveCBpbXBsZW1lbnRzIGBrZXlgIGJ1dCByZXR1cm5zIGBNb3pQcmludGFibGVLZXlgIGZvciBhbGxcbiAgICAvLyBwcmludGFibGUgY2hhcmFjdGVycyAobm9ybWFsaXplZCB0byBgVW5pZGVudGlmaWVkYCksIGlnbm9yZSBpdC5cbiAgICB2YXIga2V5ID0gbm9ybWFsaXplS2V5W25hdGl2ZUV2ZW50LmtleV0gfHwgbmF0aXZlRXZlbnQua2V5O1xuXG4gICAgaWYgKGtleSAhPT0gJ1VuaWRlbnRpZmllZCcpIHtcbiAgICAgIHJldHVybiBrZXk7XG4gICAgfVxuICB9IC8vIEJyb3dzZXIgZG9lcyBub3QgaW1wbGVtZW50IGBrZXlgLCBwb2x5ZmlsbCBhcyBtdWNoIG9mIGl0IGFzIHdlIGNhbi5cblxuXG4gIGlmIChuYXRpdmVFdmVudC50eXBlID09PSAna2V5cHJlc3MnKSB7XG4gICAgdmFyIGNoYXJDb2RlID0gZ2V0RXZlbnRDaGFyQ29kZShuYXRpdmVFdmVudCk7IC8vIFRoZSBlbnRlci1rZXkgaXMgdGVjaG5pY2FsbHkgYm90aCBwcmludGFibGUgYW5kIG5vbi1wcmludGFibGUgYW5kIGNhblxuICAgIC8vIHRodXMgYmUgY2FwdHVyZWQgYnkgYGtleXByZXNzYCwgbm8gb3RoZXIgbm9uLXByaW50YWJsZSBrZXkgc2hvdWxkLlxuXG4gICAgcmV0dXJuIGNoYXJDb2RlID09PSAxMyA/ICdFbnRlcicgOiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlKTtcbiAgfVxuXG4gIGlmIChuYXRpdmVFdmVudC50eXBlID09PSAna2V5ZG93bicgfHwgbmF0aXZlRXZlbnQudHlwZSA9PT0gJ2tleXVwJykge1xuICAgIC8vIFdoaWxlIHVzZXIga2V5Ym9hcmQgbGF5b3V0IGRldGVybWluZXMgdGhlIGFjdHVhbCBtZWFuaW5nIG9mIGVhY2hcbiAgICAvLyBga2V5Q29kZWAgdmFsdWUsIGFsbW9zdCBhbGwgZnVuY3Rpb24ga2V5cyBoYXZlIGEgdW5pdmVyc2FsIHZhbHVlLlxuICAgIHJldHVybiB0cmFuc2xhdGVUb0tleVtuYXRpdmVFdmVudC5rZXlDb2RlXSB8fCAnVW5pZGVudGlmaWVkJztcbiAgfVxuXG4gIHJldHVybiAnJztcbn1cbi8qKlxuICogVHJhbnNsYXRpb24gZnJvbSBtb2RpZmllciBrZXkgdG8gdGhlIGFzc29jaWF0ZWQgcHJvcGVydHkgaW4gdGhlIGV2ZW50LlxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvI2tleXMtTW9kaWZpZXJzXG4gKi9cblxuXG52YXIgbW9kaWZpZXJLZXlUb1Byb3AgPSB7XG4gIEFsdDogJ2FsdEtleScsXG4gIENvbnRyb2w6ICdjdHJsS2V5JyxcbiAgTWV0YTogJ21ldGFLZXknLFxuICBTaGlmdDogJ3NoaWZ0S2V5J1xufTsgLy8gT2xkZXIgYnJvd3NlcnMgKFNhZmFyaSA8PSAxMCwgaU9TIFNhZmFyaSA8PSAxMC4yKSBkbyBub3Qgc3VwcG9ydFxuLy8gZ2V0TW9kaWZpZXJTdGF0ZS4gSWYgZ2V0TW9kaWZpZXJTdGF0ZSBpcyBub3Qgc3VwcG9ydGVkLCB3ZSBtYXAgaXQgdG8gYSBzZXQgb2Zcbi8vIG1vZGlmaWVyIGtleXMgZXhwb3NlZCBieSB0aGUgZXZlbnQuIEluIHRoaXMgY2FzZSwgTG9jay1rZXlzIGFyZSBub3Qgc3VwcG9ydGVkLlxuXG5mdW5jdGlvbiBtb2RpZmllclN0YXRlR2V0dGVyKGtleUFyZykge1xuICB2YXIgc3ludGhldGljRXZlbnQgPSB0aGlzO1xuICB2YXIgbmF0aXZlRXZlbnQgPSBzeW50aGV0aWNFdmVudC5uYXRpdmVFdmVudDtcblxuICBpZiAobmF0aXZlRXZlbnQuZ2V0TW9kaWZpZXJTdGF0ZSkge1xuICAgIHJldHVybiBuYXRpdmVFdmVudC5nZXRNb2RpZmllclN0YXRlKGtleUFyZyk7XG4gIH1cblxuICB2YXIga2V5UHJvcCA9IG1vZGlmaWVyS2V5VG9Qcm9wW2tleUFyZ107XG4gIHJldHVybiBrZXlQcm9wID8gISFuYXRpdmVFdmVudFtrZXlQcm9wXSA6IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRFdmVudE1vZGlmaWVyU3RhdGUobmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIG1vZGlmaWVyU3RhdGVHZXR0ZXI7XG59XG4vKipcbiAqIEBpbnRlcmZhY2UgS2V5Ym9hcmRFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxuXG52YXIgS2V5Ym9hcmRFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgVUlFdmVudEludGVyZmFjZSwge1xuICBrZXk6IGdldEV2ZW50S2V5LFxuICBjb2RlOiAwLFxuICBsb2NhdGlvbjogMCxcbiAgY3RybEtleTogMCxcbiAgc2hpZnRLZXk6IDAsXG4gIGFsdEtleTogMCxcbiAgbWV0YUtleTogMCxcbiAgcmVwZWF0OiAwLFxuICBsb2NhbGU6IDAsXG4gIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJTdGF0ZSxcbiAgLy8gTGVnYWN5IEludGVyZmFjZVxuICBjaGFyQ29kZTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gYGNoYXJDb2RlYCBpcyB0aGUgcmVzdWx0IG9mIGEgS2V5UHJlc3MgZXZlbnQgYW5kIHJlcHJlc2VudHMgdGhlIHZhbHVlIG9mXG4gICAgLy8gdGhlIGFjdHVhbCBwcmludGFibGUgY2hhcmFjdGVyLlxuICAgIC8vIEtleVByZXNzIGlzIGRlcHJlY2F0ZWQsIGJ1dCBpdHMgcmVwbGFjZW1lbnQgaXMgbm90IHlldCBmaW5hbCBhbmQgbm90XG4gICAgLy8gaW1wbGVtZW50ZWQgaW4gYW55IG1ham9yIGJyb3dzZXIuIE9ubHkgS2V5UHJlc3MgaGFzIGNoYXJDb2RlLlxuICAgIGlmIChldmVudC50eXBlID09PSAna2V5cHJlc3MnKSB7XG4gICAgICByZXR1cm4gZ2V0RXZlbnRDaGFyQ29kZShldmVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH0sXG4gIGtleUNvZGU6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIGBrZXlDb2RlYCBpcyB0aGUgcmVzdWx0IG9mIGEgS2V5RG93bi9VcCBldmVudCBhbmQgcmVwcmVzZW50cyB0aGUgdmFsdWUgb2ZcbiAgICAvLyBwaHlzaWNhbCBrZXlib2FyZCBrZXkuXG4gICAgLy8gVGhlIGFjdHVhbCBtZWFuaW5nIG9mIHRoZSB2YWx1ZSBkZXBlbmRzIG9uIHRoZSB1c2Vycycga2V5Ym9hcmQgbGF5b3V0XG4gICAgLy8gd2hpY2ggY2Fubm90IGJlIGRldGVjdGVkLiBBc3N1bWluZyB0aGF0IGl0IGlzIGEgVVMga2V5Ym9hcmQgbGF5b3V0XG4gICAgLy8gcHJvdmlkZXMgYSBzdXJwcmlzaW5nbHkgYWNjdXJhdGUgbWFwcGluZyBmb3IgVVMgYW5kIEV1cm9wZWFuIHVzZXJzLlxuICAgIC8vIER1ZSB0byB0aGlzLCBpdCBpcyBsZWZ0IHRvIHRoZSB1c2VyIHRvIGltcGxlbWVudCBhdCB0aGlzIHRpbWUuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdrZXlkb3duJyB8fCBldmVudC50eXBlID09PSAna2V5dXAnKSB7XG4gICAgICByZXR1cm4gZXZlbnQua2V5Q29kZTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfSxcbiAgd2hpY2g6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIGB3aGljaGAgaXMgYW4gYWxpYXMgZm9yIGVpdGhlciBga2V5Q29kZWAgb3IgYGNoYXJDb2RlYCBkZXBlbmRpbmcgb24gdGhlXG4gICAgLy8gdHlwZSBvZiB0aGUgZXZlbnQuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdrZXlwcmVzcycpIHtcbiAgICAgIHJldHVybiBnZXRFdmVudENoYXJDb2RlKGV2ZW50KTtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleWRvd24nIHx8IGV2ZW50LnR5cGUgPT09ICdrZXl1cCcpIHtcbiAgICAgIHJldHVybiBldmVudC5rZXlDb2RlO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9XG59KTtcblxudmFyIFN5bnRoZXRpY0tleWJvYXJkRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChLZXlib2FyZEV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBQb2ludGVyRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvcG9pbnRlcmV2ZW50cy9cbiAqL1xuXG52YXIgUG9pbnRlckV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBNb3VzZUV2ZW50SW50ZXJmYWNlLCB7XG4gIHBvaW50ZXJJZDogMCxcbiAgd2lkdGg6IDAsXG4gIGhlaWdodDogMCxcbiAgcHJlc3N1cmU6IDAsXG4gIHRhbmdlbnRpYWxQcmVzc3VyZTogMCxcbiAgdGlsdFg6IDAsXG4gIHRpbHRZOiAwLFxuICB0d2lzdDogMCxcbiAgcG9pbnRlclR5cGU6IDAsXG4gIGlzUHJpbWFyeTogMFxufSk7XG5cbnZhciBTeW50aGV0aWNQb2ludGVyRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChQb2ludGVyRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIFRvdWNoRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvdG91Y2gtZXZlbnRzL1xuICovXG5cbnZhciBUb3VjaEV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBVSUV2ZW50SW50ZXJmYWNlLCB7XG4gIHRvdWNoZXM6IDAsXG4gIHRhcmdldFRvdWNoZXM6IDAsXG4gIGNoYW5nZWRUb3VjaGVzOiAwLFxuICBhbHRLZXk6IDAsXG4gIG1ldGFLZXk6IDAsXG4gIGN0cmxLZXk6IDAsXG4gIHNoaWZ0S2V5OiAwLFxuICBnZXRNb2RpZmllclN0YXRlOiBnZXRFdmVudE1vZGlmaWVyU3RhdGVcbn0pO1xuXG52YXIgU3ludGhldGljVG91Y2hFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFRvdWNoRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDkvV0QtY3NzMy10cmFuc2l0aW9ucy0yMDA5MDMyMC8jdHJhbnNpdGlvbi1ldmVudHMtXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9UcmFuc2l0aW9uRXZlbnRcbiAqL1xuXG52YXIgVHJhbnNpdGlvbkV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwge1xuICBwcm9wZXJ0eU5hbWU6IDAsXG4gIGVsYXBzZWRUaW1lOiAwLFxuICBwc2V1ZG9FbGVtZW50OiAwXG59KTtcblxudmFyIFN5bnRoZXRpY1RyYW5zaXRpb25FdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFRyYW5zaXRpb25FdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgV2hlZWxFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxudmFyIFdoZWVsRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIE1vdXNlRXZlbnRJbnRlcmZhY2UsIHtcbiAgZGVsdGFYOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gJ2RlbHRhWCcgaW4gZXZlbnQgPyBldmVudC5kZWx0YVggOiAvLyBGYWxsYmFjayB0byBgd2hlZWxEZWx0YVhgIGZvciBXZWJraXQgYW5kIG5vcm1hbGl6ZSAocmlnaHQgaXMgcG9zaXRpdmUpLlxuICAgICd3aGVlbERlbHRhWCcgaW4gZXZlbnQgPyAtZXZlbnQud2hlZWxEZWx0YVggOiAwO1xuICB9LFxuICBkZWx0YVk6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiAnZGVsdGFZJyBpbiBldmVudCA/IGV2ZW50LmRlbHRhWSA6IC8vIEZhbGxiYWNrIHRvIGB3aGVlbERlbHRhWWAgZm9yIFdlYmtpdCBhbmQgbm9ybWFsaXplIChkb3duIGlzIHBvc2l0aXZlKS5cbiAgICAnd2hlZWxEZWx0YVknIGluIGV2ZW50ID8gLWV2ZW50LndoZWVsRGVsdGFZIDogLy8gRmFsbGJhY2sgdG8gYHdoZWVsRGVsdGFgIGZvciBJRTw5IGFuZCBub3JtYWxpemUgKGRvd24gaXMgcG9zaXRpdmUpLlxuICAgICd3aGVlbERlbHRhJyBpbiBldmVudCA/IC1ldmVudC53aGVlbERlbHRhIDogMDtcbiAgfSxcbiAgZGVsdGFaOiAwLFxuICAvLyBCcm93c2VycyB3aXRob3V0IFwiZGVsdGFNb2RlXCIgaXMgcmVwb3J0aW5nIGluIHJhdyB3aGVlbCBkZWx0YSB3aGVyZSBvbmVcbiAgLy8gbm90Y2ggb24gdGhlIHNjcm9sbCBpcyBhbHdheXMgKy8tIDEyMCwgcm91Z2hseSBlcXVpdmFsZW50IHRvIHBpeGVscy5cbiAgLy8gQSBnb29kIGFwcHJveGltYXRpb24gb2YgRE9NX0RFTFRBX0xJTkUgKDEpIGlzIDUlIG9mIHZpZXdwb3J0IHNpemUgb3JcbiAgLy8gfjQwIHBpeGVscywgZm9yIERPTV9ERUxUQV9TQ1JFRU4gKDIpIGl0IGlzIDg3LjUlIG9mIHZpZXdwb3J0IHNpemUuXG4gIGRlbHRhTW9kZTogMFxufSk7XG5cbnZhciBTeW50aGV0aWNXaGVlbEV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoV2hlZWxFdmVudEludGVyZmFjZSk7XG5cbnZhciBFTkRfS0VZQ09ERVMgPSBbOSwgMTMsIDI3LCAzMl07IC8vIFRhYiwgUmV0dXJuLCBFc2MsIFNwYWNlXG5cbnZhciBTVEFSVF9LRVlDT0RFID0gMjI5O1xudmFyIGNhblVzZUNvbXBvc2l0aW9uRXZlbnQgPSBjYW5Vc2VET00gJiYgJ0NvbXBvc2l0aW9uRXZlbnQnIGluIHdpbmRvdztcbnZhciBkb2N1bWVudE1vZGUgPSBudWxsO1xuXG5pZiAoY2FuVXNlRE9NICYmICdkb2N1bWVudE1vZGUnIGluIGRvY3VtZW50KSB7XG4gIGRvY3VtZW50TW9kZSA9IGRvY3VtZW50LmRvY3VtZW50TW9kZTtcbn0gLy8gV2Via2l0IG9mZmVycyBhIHZlcnkgdXNlZnVsIGB0ZXh0SW5wdXRgIGV2ZW50IHRoYXQgY2FuIGJlIHVzZWQgdG9cbi8vIGRpcmVjdGx5IHJlcHJlc2VudCBgYmVmb3JlSW5wdXRgLiBUaGUgSUUgYHRleHRpbnB1dGAgZXZlbnQgaXMgbm90IGFzXG4vLyB1c2VmdWwsIHNvIHdlIGRvbid0IHVzZSBpdC5cblxuXG52YXIgY2FuVXNlVGV4dElucHV0RXZlbnQgPSBjYW5Vc2VET00gJiYgJ1RleHRFdmVudCcgaW4gd2luZG93ICYmICFkb2N1bWVudE1vZGU7IC8vIEluIElFOSssIHdlIGhhdmUgYWNjZXNzIHRvIGNvbXBvc2l0aW9uIGV2ZW50cywgYnV0IHRoZSBkYXRhIHN1cHBsaWVkXG4vLyBieSB0aGUgbmF0aXZlIGNvbXBvc2l0aW9uZW5kIGV2ZW50IG1heSBiZSBpbmNvcnJlY3QuIEphcGFuZXNlIGlkZW9ncmFwaGljXG4vLyBzcGFjZXMsIGZvciBpbnN0YW5jZSAoXFx1MzAwMCkgYXJlIG5vdCByZWNvcmRlZCBjb3JyZWN0bHkuXG5cbnZhciB1c2VGYWxsYmFja0NvbXBvc2l0aW9uRGF0YSA9IGNhblVzZURPTSAmJiAoIWNhblVzZUNvbXBvc2l0aW9uRXZlbnQgfHwgZG9jdW1lbnRNb2RlICYmIGRvY3VtZW50TW9kZSA+IDggJiYgZG9jdW1lbnRNb2RlIDw9IDExKTtcbnZhciBTUEFDRUJBUl9DT0RFID0gMzI7XG52YXIgU1BBQ0VCQVJfQ0hBUiA9IFN0cmluZy5mcm9tQ2hhckNvZGUoU1BBQ0VCQVJfQ09ERSk7XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyRXZlbnRzKCkge1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQoJ29uQmVmb3JlSW5wdXQnLCBbJ2NvbXBvc2l0aW9uZW5kJywgJ2tleXByZXNzJywgJ3RleHRJbnB1dCcsICdwYXN0ZSddKTtcbiAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KCdvbkNvbXBvc2l0aW9uRW5kJywgWydjb21wb3NpdGlvbmVuZCcsICdmb2N1c291dCcsICdrZXlkb3duJywgJ2tleXByZXNzJywgJ2tleXVwJywgJ21vdXNlZG93biddKTtcbiAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KCdvbkNvbXBvc2l0aW9uU3RhcnQnLCBbJ2NvbXBvc2l0aW9uc3RhcnQnLCAnZm9jdXNvdXQnLCAna2V5ZG93bicsICdrZXlwcmVzcycsICdrZXl1cCcsICdtb3VzZWRvd24nXSk7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25Db21wb3NpdGlvblVwZGF0ZScsIFsnY29tcG9zaXRpb251cGRhdGUnLCAnZm9jdXNvdXQnLCAna2V5ZG93bicsICdrZXlwcmVzcycsICdrZXl1cCcsICdtb3VzZWRvd24nXSk7XG59IC8vIFRyYWNrIHdoZXRoZXIgd2UndmUgZXZlciBoYW5kbGVkIGEga2V5cHJlc3Mgb24gdGhlIHNwYWNlIGtleS5cblxuXG52YXIgaGFzU3BhY2VLZXlwcmVzcyA9IGZhbHNlO1xuLyoqXG4gKiBSZXR1cm4gd2hldGhlciBhIG5hdGl2ZSBrZXlwcmVzcyBldmVudCBpcyBhc3N1bWVkIHRvIGJlIGEgY29tbWFuZC5cbiAqIFRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSBGaXJlZm94IGZpcmVzIGBrZXlwcmVzc2AgZXZlbnRzIGZvciBrZXkgY29tbWFuZHNcbiAqIChjdXQsIGNvcHksIHNlbGVjdC1hbGwsIGV0Yy4pIGV2ZW4gdGhvdWdoIG5vIGNoYXJhY3RlciBpcyBpbnNlcnRlZC5cbiAqL1xuXG5mdW5jdGlvbiBpc0tleXByZXNzQ29tbWFuZChuYXRpdmVFdmVudCkge1xuICByZXR1cm4gKG5hdGl2ZUV2ZW50LmN0cmxLZXkgfHwgbmF0aXZlRXZlbnQuYWx0S2V5IHx8IG5hdGl2ZUV2ZW50Lm1ldGFLZXkpICYmIC8vIGN0cmxLZXkgJiYgYWx0S2V5IGlzIGVxdWl2YWxlbnQgdG8gQWx0R3IsIGFuZCBpcyBub3QgYSBjb21tYW5kLlxuICAhKG5hdGl2ZUV2ZW50LmN0cmxLZXkgJiYgbmF0aXZlRXZlbnQuYWx0S2V5KTtcbn1cbi8qKlxuICogVHJhbnNsYXRlIG5hdGl2ZSB0b3AgbGV2ZWwgZXZlbnRzIGludG8gZXZlbnQgdHlwZXMuXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRDb21wb3NpdGlvbkV2ZW50VHlwZShkb21FdmVudE5hbWUpIHtcbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdjb21wb3NpdGlvbnN0YXJ0JzpcbiAgICAgIHJldHVybiAnb25Db21wb3NpdGlvblN0YXJ0JztcblxuICAgIGNhc2UgJ2NvbXBvc2l0aW9uZW5kJzpcbiAgICAgIHJldHVybiAnb25Db21wb3NpdGlvbkVuZCc7XG5cbiAgICBjYXNlICdjb21wb3NpdGlvbnVwZGF0ZSc6XG4gICAgICByZXR1cm4gJ29uQ29tcG9zaXRpb25VcGRhdGUnO1xuICB9XG59XG4vKipcbiAqIERvZXMgb3VyIGZhbGxiYWNrIGJlc3QtZ3Vlc3MgbW9kZWwgdGhpbmsgdGhpcyBldmVudCBzaWduaWZpZXMgdGhhdFxuICogY29tcG9zaXRpb24gaGFzIGJlZ3VuP1xuICovXG5cblxuZnVuY3Rpb24gaXNGYWxsYmFja0NvbXBvc2l0aW9uU3RhcnQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICByZXR1cm4gZG9tRXZlbnROYW1lID09PSAna2V5ZG93bicgJiYgbmF0aXZlRXZlbnQua2V5Q29kZSA9PT0gU1RBUlRfS0VZQ09ERTtcbn1cbi8qKlxuICogRG9lcyBvdXIgZmFsbGJhY2sgbW9kZSB0aGluayB0aGF0IHRoaXMgZXZlbnQgaXMgdGhlIGVuZCBvZiBjb21wb3NpdGlvbj9cbiAqL1xuXG5cbmZ1bmN0aW9uIGlzRmFsbGJhY2tDb21wb3NpdGlvbkVuZChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSB7XG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSAna2V5dXAnOlxuICAgICAgLy8gQ29tbWFuZCBrZXlzIGluc2VydCBvciBjbGVhciBJTUUgaW5wdXQuXG4gICAgICByZXR1cm4gRU5EX0tFWUNPREVTLmluZGV4T2YobmF0aXZlRXZlbnQua2V5Q29kZSkgIT09IC0xO1xuXG4gICAgY2FzZSAna2V5ZG93bic6XG4gICAgICAvLyBFeHBlY3QgSU1FIGtleUNvZGUgb24gZWFjaCBrZXlkb3duLiBJZiB3ZSBnZXQgYW55IG90aGVyXG4gICAgICAvLyBjb2RlIHdlIG11c3QgaGF2ZSBleGl0ZWQgZWFybGllci5cbiAgICAgIHJldHVybiBuYXRpdmVFdmVudC5rZXlDb2RlICE9PSBTVEFSVF9LRVlDT0RFO1xuXG4gICAgY2FzZSAna2V5cHJlc3MnOlxuICAgIGNhc2UgJ21vdXNlZG93bic6XG4gICAgY2FzZSAnZm9jdXNvdXQnOlxuICAgICAgLy8gRXZlbnRzIGFyZSBub3QgcG9zc2libGUgd2l0aG91dCBjYW5jZWxsaW5nIElNRS5cbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuLyoqXG4gKiBHb29nbGUgSW5wdXQgVG9vbHMgcHJvdmlkZXMgY29tcG9zaXRpb24gZGF0YSB2aWEgYSBDdXN0b21FdmVudCxcbiAqIHdpdGggdGhlIGBkYXRhYCBwcm9wZXJ0eSBwb3B1bGF0ZWQgaW4gdGhlIGBkZXRhaWxgIG9iamVjdC4gSWYgdGhpc1xuICogaXMgYXZhaWxhYmxlIG9uIHRoZSBldmVudCBvYmplY3QsIHVzZSBpdC4gSWYgbm90LCB0aGlzIGlzIGEgcGxhaW5cbiAqIGNvbXBvc2l0aW9uIGV2ZW50IGFuZCB3ZSBoYXZlIG5vdGhpbmcgc3BlY2lhbCB0byBleHRyYWN0LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudFxuICogQHJldHVybiB7P3N0cmluZ31cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldERhdGFGcm9tQ3VzdG9tRXZlbnQobmF0aXZlRXZlbnQpIHtcbiAgdmFyIGRldGFpbCA9IG5hdGl2ZUV2ZW50LmRldGFpbDtcblxuICBpZiAodHlwZW9mIGRldGFpbCA9PT0gJ29iamVjdCcgJiYgJ2RhdGEnIGluIGRldGFpbCkge1xuICAgIHJldHVybiBkZXRhaWwuZGF0YTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuLyoqXG4gKiBDaGVjayBpZiBhIGNvbXBvc2l0aW9uIGV2ZW50IHdhcyB0cmlnZ2VyZWQgYnkgS29yZWFuIElNRS5cbiAqIE91ciBmYWxsYmFjayBtb2RlIGRvZXMgbm90IHdvcmsgd2VsbCB3aXRoIElFJ3MgS29yZWFuIElNRSxcbiAqIHNvIGp1c3QgdXNlIG5hdGl2ZSBjb21wb3NpdGlvbiBldmVudHMgd2hlbiBLb3JlYW4gSU1FIGlzIHVzZWQuXG4gKiBBbHRob3VnaCBDb21wb3NpdGlvbkV2ZW50LmxvY2FsZSBwcm9wZXJ0eSBpcyBkZXByZWNhdGVkLFxuICogaXQgaXMgYXZhaWxhYmxlIGluIElFLCB3aGVyZSBvdXIgZmFsbGJhY2sgbW9kZSBpcyBlbmFibGVkLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudFxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuXG5cbmZ1bmN0aW9uIGlzVXNpbmdLb3JlYW5JTUUobmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIG5hdGl2ZUV2ZW50LmxvY2FsZSA9PT0gJ2tvJztcbn0gLy8gVHJhY2sgdGhlIGN1cnJlbnQgSU1FIGNvbXBvc2l0aW9uIHN0YXR1cywgaWYgYW55LlxuXG5cbnZhciBpc0NvbXBvc2luZyA9IGZhbHNlO1xuLyoqXG4gKiBAcmV0dXJuIHs/b2JqZWN0fSBBIFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQuXG4gKi9cblxuZnVuY3Rpb24gZXh0cmFjdENvbXBvc2l0aW9uRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgdmFyIGV2ZW50VHlwZTtcbiAgdmFyIGZhbGxiYWNrRGF0YTtcblxuICBpZiAoY2FuVXNlQ29tcG9zaXRpb25FdmVudCkge1xuICAgIGV2ZW50VHlwZSA9IGdldENvbXBvc2l0aW9uRXZlbnRUeXBlKGRvbUV2ZW50TmFtZSk7XG4gIH0gZWxzZSBpZiAoIWlzQ29tcG9zaW5nKSB7XG4gICAgaWYgKGlzRmFsbGJhY2tDb21wb3NpdGlvblN0YXJ0KGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpKSB7XG4gICAgICBldmVudFR5cGUgPSAnb25Db21wb3NpdGlvblN0YXJ0JztcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNGYWxsYmFja0NvbXBvc2l0aW9uRW5kKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpKSB7XG4gICAgZXZlbnRUeXBlID0gJ29uQ29tcG9zaXRpb25FbmQnO1xuICB9XG5cbiAgaWYgKCFldmVudFR5cGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmICh1c2VGYWxsYmFja0NvbXBvc2l0aW9uRGF0YSAmJiAhaXNVc2luZ0tvcmVhbklNRShuYXRpdmVFdmVudCkpIHtcbiAgICAvLyBUaGUgY3VycmVudCBjb21wb3NpdGlvbiBpcyBzdG9yZWQgc3RhdGljYWxseSBhbmQgbXVzdCBub3QgYmVcbiAgICAvLyBvdmVyd3JpdHRlbiB3aGlsZSBjb21wb3NpdGlvbiBjb250aW51ZXMuXG4gICAgaWYgKCFpc0NvbXBvc2luZyAmJiBldmVudFR5cGUgPT09ICdvbkNvbXBvc2l0aW9uU3RhcnQnKSB7XG4gICAgICBpc0NvbXBvc2luZyA9IGluaXRpYWxpemUobmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSAnb25Db21wb3NpdGlvbkVuZCcpIHtcbiAgICAgIGlmIChpc0NvbXBvc2luZykge1xuICAgICAgICBmYWxsYmFja0RhdGEgPSBnZXREYXRhKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGxpc3RlbmVycyA9IGFjY3VtdWxhdGVUd29QaGFzZUxpc3RlbmVycyh0YXJnZXRJbnN0LCBldmVudFR5cGUpO1xuXG4gIGlmIChsaXN0ZW5lcnMubGVuZ3RoID4gMCkge1xuICAgIHZhciBldmVudCA9IG5ldyBTeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50KGV2ZW50VHlwZSwgZG9tRXZlbnROYW1lLCBudWxsLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICBldmVudDogZXZlbnQsXG4gICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVyc1xuICAgIH0pO1xuXG4gICAgaWYgKGZhbGxiYWNrRGF0YSkge1xuICAgICAgLy8gSW5qZWN0IGRhdGEgZ2VuZXJhdGVkIGZyb20gZmFsbGJhY2sgcGF0aCBpbnRvIHRoZSBzeW50aGV0aWMgZXZlbnQuXG4gICAgICAvLyBUaGlzIG1hdGNoZXMgdGhlIHByb3BlcnR5IG9mIG5hdGl2ZSBDb21wb3NpdGlvbkV2ZW50SW50ZXJmYWNlLlxuICAgICAgZXZlbnQuZGF0YSA9IGZhbGxiYWNrRGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGN1c3RvbURhdGEgPSBnZXREYXRhRnJvbUN1c3RvbUV2ZW50KG5hdGl2ZUV2ZW50KTtcblxuICAgICAgaWYgKGN1c3RvbURhdGEgIT09IG51bGwpIHtcbiAgICAgICAgZXZlbnQuZGF0YSA9IGN1c3RvbURhdGE7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldE5hdGl2ZUJlZm9yZUlucHV0Q2hhcnMoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ2NvbXBvc2l0aW9uZW5kJzpcbiAgICAgIHJldHVybiBnZXREYXRhRnJvbUN1c3RvbUV2ZW50KG5hdGl2ZUV2ZW50KTtcblxuICAgIGNhc2UgJ2tleXByZXNzJzpcbiAgICAgIC8qKlxuICAgICAgICogSWYgbmF0aXZlIGB0ZXh0SW5wdXRgIGV2ZW50cyBhcmUgYXZhaWxhYmxlLCBvdXIgZ29hbCBpcyB0byBtYWtlXG4gICAgICAgKiB1c2Ugb2YgdGhlbS4gSG93ZXZlciwgdGhlcmUgaXMgYSBzcGVjaWFsIGNhc2U6IHRoZSBzcGFjZWJhciBrZXkuXG4gICAgICAgKiBJbiBXZWJraXQsIHByZXZlbnRpbmcgZGVmYXVsdCBvbiBhIHNwYWNlYmFyIGB0ZXh0SW5wdXRgIGV2ZW50XG4gICAgICAgKiBjYW5jZWxzIGNoYXJhY3RlciBpbnNlcnRpb24sIGJ1dCBpdCAqYWxzbyogY2F1c2VzIHRoZSBicm93c2VyXG4gICAgICAgKiB0byBmYWxsIGJhY2sgdG8gaXRzIGRlZmF1bHQgc3BhY2ViYXIgYmVoYXZpb3Igb2Ygc2Nyb2xsaW5nIHRoZVxuICAgICAgICogcGFnZS5cbiAgICAgICAqXG4gICAgICAgKiBUcmFja2luZyBhdDpcbiAgICAgICAqIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0zNTUxMDNcbiAgICAgICAqXG4gICAgICAgKiBUbyBhdm9pZCB0aGlzIGlzc3VlLCB1c2UgdGhlIGtleXByZXNzIGV2ZW50IGFzIGlmIG5vIGB0ZXh0SW5wdXRgXG4gICAgICAgKiBldmVudCBpcyBhdmFpbGFibGUuXG4gICAgICAgKi9cbiAgICAgIHZhciB3aGljaCA9IG5hdGl2ZUV2ZW50LndoaWNoO1xuXG4gICAgICBpZiAod2hpY2ggIT09IFNQQUNFQkFSX0NPREUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGhhc1NwYWNlS2V5cHJlc3MgPSB0cnVlO1xuICAgICAgcmV0dXJuIFNQQUNFQkFSX0NIQVI7XG5cbiAgICBjYXNlICd0ZXh0SW5wdXQnOlxuICAgICAgLy8gUmVjb3JkIHRoZSBjaGFyYWN0ZXJzIHRvIGJlIGFkZGVkIHRvIHRoZSBET00uXG4gICAgICB2YXIgY2hhcnMgPSBuYXRpdmVFdmVudC5kYXRhOyAvLyBJZiBpdCdzIGEgc3BhY2ViYXIgY2hhcmFjdGVyLCBhc3N1bWUgdGhhdCB3ZSBoYXZlIGFscmVhZHkgaGFuZGxlZFxuICAgICAgLy8gaXQgYXQgdGhlIGtleXByZXNzIGxldmVsIGFuZCBiYWlsIGltbWVkaWF0ZWx5LiBBbmRyb2lkIENocm9tZVxuICAgICAgLy8gZG9lc24ndCBnaXZlIHVzIGtleWNvZGVzLCBzbyB3ZSBuZWVkIHRvIGlnbm9yZSBpdC5cblxuICAgICAgaWYgKGNoYXJzID09PSBTUEFDRUJBUl9DSEFSICYmIGhhc1NwYWNlS2V5cHJlc3MpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjaGFycztcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBGb3Igb3RoZXIgbmF0aXZlIGV2ZW50IHR5cGVzLCBkbyBub3RoaW5nLlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbi8qKlxuICogRm9yIGJyb3dzZXJzIHRoYXQgZG8gbm90IHByb3ZpZGUgdGhlIGB0ZXh0SW5wdXRgIGV2ZW50LCBleHRyYWN0IHRoZVxuICogYXBwcm9wcmlhdGUgc3RyaW5nIHRvIHVzZSBmb3IgU3ludGhldGljSW5wdXRFdmVudC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEZhbGxiYWNrQmVmb3JlSW5wdXRDaGFycyhkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSB7XG4gIC8vIElmIHdlIGFyZSBjdXJyZW50bHkgY29tcG9zaW5nIChJTUUpIGFuZCB1c2luZyBhIGZhbGxiYWNrIHRvIGRvIHNvLFxuICAvLyB0cnkgdG8gZXh0cmFjdCB0aGUgY29tcG9zZWQgY2hhcmFjdGVycyBmcm9tIHRoZSBmYWxsYmFjayBvYmplY3QuXG4gIC8vIElmIGNvbXBvc2l0aW9uIGV2ZW50IGlzIGF2YWlsYWJsZSwgd2UgZXh0cmFjdCBhIHN0cmluZyBvbmx5IGF0XG4gIC8vIGNvbXBvc2l0aW9uZXZlbnQsIG90aGVyd2lzZSBleHRyYWN0IGl0IGF0IGZhbGxiYWNrIGV2ZW50cy5cbiAgaWYgKGlzQ29tcG9zaW5nKSB7XG4gICAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2NvbXBvc2l0aW9uZW5kJyB8fCAhY2FuVXNlQ29tcG9zaXRpb25FdmVudCAmJiBpc0ZhbGxiYWNrQ29tcG9zaXRpb25FbmQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkpIHtcbiAgICAgIHZhciBjaGFycyA9IGdldERhdGEoKTtcbiAgICAgIHJlc2V0KCk7XG4gICAgICBpc0NvbXBvc2luZyA9IGZhbHNlO1xuICAgICAgcmV0dXJuIGNoYXJzO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdwYXN0ZSc6XG4gICAgICAvLyBJZiBhIHBhc3RlIGV2ZW50IG9jY3VycyBhZnRlciBhIGtleXByZXNzLCB0aHJvdyBvdXQgdGhlIGlucHV0XG4gICAgICAvLyBjaGFycy4gUGFzdGUgZXZlbnRzIHNob3VsZCBub3QgbGVhZCB0byBCZWZvcmVJbnB1dCBldmVudHMuXG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgJ2tleXByZXNzJzpcbiAgICAgIC8qKlxuICAgICAgICogQXMgb2YgdjI3LCBGaXJlZm94IG1heSBmaXJlIGtleXByZXNzIGV2ZW50cyBldmVuIHdoZW4gbm8gY2hhcmFjdGVyXG4gICAgICAgKiB3aWxsIGJlIGluc2VydGVkLiBBIGZldyBwb3NzaWJpbGl0aWVzOlxuICAgICAgICpcbiAgICAgICAqIC0gYHdoaWNoYCBpcyBgMGAuIEFycm93IGtleXMsIEVzYyBrZXksIGV0Yy5cbiAgICAgICAqXG4gICAgICAgKiAtIGB3aGljaGAgaXMgdGhlIHByZXNzZWQga2V5IGNvZGUsIGJ1dCBubyBjaGFyIGlzIGF2YWlsYWJsZS5cbiAgICAgICAqICAgRXg6ICdBbHRHciArIGRgIGluIFBvbGlzaC4gVGhlcmUgaXMgbm8gbW9kaWZpZWQgY2hhcmFjdGVyIGZvclxuICAgICAgICogICB0aGlzIGtleSBjb21iaW5hdGlvbiBhbmQgbm8gY2hhcmFjdGVyIGlzIGluc2VydGVkIGludG8gdGhlXG4gICAgICAgKiAgIGRvY3VtZW50LCBidXQgRkYgZmlyZXMgdGhlIGtleXByZXNzIGZvciBjaGFyIGNvZGUgYDEwMGAgYW55d2F5LlxuICAgICAgICogICBObyBgaW5wdXRgIGV2ZW50IHdpbGwgb2NjdXIuXG4gICAgICAgKlxuICAgICAgICogLSBgd2hpY2hgIGlzIHRoZSBwcmVzc2VkIGtleSBjb2RlLCBidXQgYSBjb21tYW5kIGNvbWJpbmF0aW9uIGlzXG4gICAgICAgKiAgIGJlaW5nIHVzZWQuIEV4OiBgQ21kK0NgLiBObyBjaGFyYWN0ZXIgaXMgaW5zZXJ0ZWQsIGFuZCBub1xuICAgICAgICogICBgaW5wdXRgIGV2ZW50IHdpbGwgb2NjdXIuXG4gICAgICAgKi9cbiAgICAgIGlmICghaXNLZXlwcmVzc0NvbW1hbmQobmF0aXZlRXZlbnQpKSB7XG4gICAgICAgIC8vIElFIGZpcmVzIHRoZSBga2V5cHJlc3NgIGV2ZW50IHdoZW4gYSB1c2VyIHR5cGVzIGFuIGVtb2ppIHZpYVxuICAgICAgICAvLyBUb3VjaCBrZXlib2FyZCBvZiBXaW5kb3dzLiAgSW4gc3VjaCBhIGNhc2UsIHRoZSBgY2hhcmAgcHJvcGVydHlcbiAgICAgICAgLy8gaG9sZHMgYW4gZW1vamkgY2hhcmFjdGVyIGxpa2UgYFxcdUQ4M0RcXHVERTBBYC4gIEJlY2F1c2UgaXRzIGxlbmd0aFxuICAgICAgICAvLyBpcyAyLCB0aGUgcHJvcGVydHkgYHdoaWNoYCBkb2VzIG5vdCByZXByZXNlbnQgYW4gZW1vamkgY29ycmVjdGx5LlxuICAgICAgICAvLyBJbiBzdWNoIGEgY2FzZSwgd2UgZGlyZWN0bHkgcmV0dXJuIHRoZSBgY2hhcmAgcHJvcGVydHkgaW5zdGVhZCBvZlxuICAgICAgICAvLyB1c2luZyBgd2hpY2hgLlxuICAgICAgICBpZiAobmF0aXZlRXZlbnQuY2hhciAmJiBuYXRpdmVFdmVudC5jaGFyLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICByZXR1cm4gbmF0aXZlRXZlbnQuY2hhcjtcbiAgICAgICAgfSBlbHNlIGlmIChuYXRpdmVFdmVudC53aGljaCkge1xuICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKG5hdGl2ZUV2ZW50LndoaWNoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgJ2NvbXBvc2l0aW9uZW5kJzpcbiAgICAgIHJldHVybiB1c2VGYWxsYmFja0NvbXBvc2l0aW9uRGF0YSAmJiAhaXNVc2luZ0tvcmVhbklNRShuYXRpdmVFdmVudCkgPyBudWxsIDogbmF0aXZlRXZlbnQuZGF0YTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuLyoqXG4gKiBFeHRyYWN0IGEgU3ludGhldGljSW5wdXRFdmVudCBmb3IgYGJlZm9yZUlucHV0YCwgYmFzZWQgb24gZWl0aGVyIG5hdGl2ZVxuICogYHRleHRJbnB1dGAgb3IgZmFsbGJhY2sgYmVoYXZpb3IuXG4gKlxuICogQHJldHVybiB7P29iamVjdH0gQSBTeW50aGV0aWNJbnB1dEV2ZW50LlxuICovXG5cblxuZnVuY3Rpb24gZXh0cmFjdEJlZm9yZUlucHV0RXZlbnQoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgdmFyIGNoYXJzO1xuXG4gIGlmIChjYW5Vc2VUZXh0SW5wdXRFdmVudCkge1xuICAgIGNoYXJzID0gZ2V0TmF0aXZlQmVmb3JlSW5wdXRDaGFycyhkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KTtcbiAgfSBlbHNlIHtcbiAgICBjaGFycyA9IGdldEZhbGxiYWNrQmVmb3JlSW5wdXRDaGFycyhkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KTtcbiAgfSAvLyBJZiBubyBjaGFyYWN0ZXJzIGFyZSBiZWluZyBpbnNlcnRlZCwgbm8gQmVmb3JlSW5wdXQgZXZlbnQgc2hvdWxkXG4gIC8vIGJlIGZpcmVkLlxuXG5cbiAgaWYgKCFjaGFycykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGxpc3RlbmVycyA9IGFjY3VtdWxhdGVUd29QaGFzZUxpc3RlbmVycyh0YXJnZXRJbnN0LCAnb25CZWZvcmVJbnB1dCcpO1xuXG4gIGlmIChsaXN0ZW5lcnMubGVuZ3RoID4gMCkge1xuICAgIHZhciBldmVudCA9IG5ldyBTeW50aGV0aWNJbnB1dEV2ZW50KCdvbkJlZm9yZUlucHV0JywgJ2JlZm9yZWlucHV0JywgbnVsbCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBkaXNwYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgbGlzdGVuZXJzOiBsaXN0ZW5lcnNcbiAgICB9KTtcbiAgICBldmVudC5kYXRhID0gY2hhcnM7XG4gIH1cbn1cbi8qKlxuICogQ3JlYXRlIGFuIGBvbkJlZm9yZUlucHV0YCBldmVudCB0byBtYXRjaFxuICogaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAxMzExMDUvI2V2ZW50cy1pbnB1dGV2ZW50cy5cbiAqXG4gKiBUaGlzIGV2ZW50IHBsdWdpbiBpcyBiYXNlZCBvbiB0aGUgbmF0aXZlIGB0ZXh0SW5wdXRgIGV2ZW50XG4gKiBhdmFpbGFibGUgaW4gQ2hyb21lLCBTYWZhcmksIE9wZXJhLCBhbmQgSUUuIFRoaXMgZXZlbnQgZmlyZXMgYWZ0ZXJcbiAqIGBvbktleVByZXNzYCBhbmQgYG9uQ29tcG9zaXRpb25FbmRgLCBidXQgYmVmb3JlIGBvbklucHV0YC5cbiAqXG4gKiBgYmVmb3JlSW5wdXRgIGlzIHNwZWMnZCBidXQgbm90IGltcGxlbWVudGVkIGluIGFueSBicm93c2VycywgYW5kXG4gKiB0aGUgYGlucHV0YCBldmVudCBkb2VzIG5vdCBwcm92aWRlIGFueSB1c2VmdWwgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBoYXNcbiAqIGFjdHVhbGx5IGJlZW4gYWRkZWQsIGNvbnRyYXJ5IHRvIHRoZSBzcGVjLiBUaHVzLCBgdGV4dElucHV0YCBpcyB0aGUgYmVzdFxuICogYXZhaWxhYmxlIGV2ZW50IHRvIGlkZW50aWZ5IHRoZSBjaGFyYWN0ZXJzIHRoYXQgaGF2ZSBhY3R1YWxseSBiZWVuIGluc2VydGVkXG4gKiBpbnRvIHRoZSB0YXJnZXQgbm9kZS5cbiAqXG4gKiBUaGlzIHBsdWdpbiBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvciBlbWl0dGluZyBgY29tcG9zaXRpb25gIGV2ZW50cywgdGh1c1xuICogYWxsb3dpbmcgdXMgdG8gc2hhcmUgY29tcG9zaXRpb24gZmFsbGJhY2sgY29kZSBmb3IgYm90aCBgYmVmb3JlSW5wdXRgIGFuZFxuICogYGNvbXBvc2l0aW9uYCBldmVudCB0eXBlcy5cbiAqL1xuXG5cbmZ1bmN0aW9uIGV4dHJhY3RFdmVudHMoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuICBleHRyYWN0Q29tcG9zaXRpb25FdmVudChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gIGV4dHJhY3RCZWZvcmVJbnB1dEV2ZW50KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvbXVsdGlwYWdlL3RoZS1pbnB1dC1lbGVtZW50Lmh0bWwjaW5wdXQtdHlwZS1hdHRyLXN1bW1hcnlcbiAqL1xudmFyIHN1cHBvcnRlZElucHV0VHlwZXMgPSB7XG4gIGNvbG9yOiB0cnVlLFxuICBkYXRlOiB0cnVlLFxuICBkYXRldGltZTogdHJ1ZSxcbiAgJ2RhdGV0aW1lLWxvY2FsJzogdHJ1ZSxcbiAgZW1haWw6IHRydWUsXG4gIG1vbnRoOiB0cnVlLFxuICBudW1iZXI6IHRydWUsXG4gIHBhc3N3b3JkOiB0cnVlLFxuICByYW5nZTogdHJ1ZSxcbiAgc2VhcmNoOiB0cnVlLFxuICB0ZWw6IHRydWUsXG4gIHRleHQ6IHRydWUsXG4gIHRpbWU6IHRydWUsXG4gIHVybDogdHJ1ZSxcbiAgd2VlazogdHJ1ZVxufTtcblxuZnVuY3Rpb24gaXNUZXh0SW5wdXRFbGVtZW50KGVsZW0pIHtcbiAgdmFyIG5vZGVOYW1lID0gZWxlbSAmJiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICBpZiAobm9kZU5hbWUgPT09ICdpbnB1dCcpIHtcbiAgICByZXR1cm4gISFzdXBwb3J0ZWRJbnB1dFR5cGVzW2VsZW0udHlwZV07XG4gIH1cblxuICBpZiAobm9kZU5hbWUgPT09ICd0ZXh0YXJlYScpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYW4gZXZlbnQgaXMgc3VwcG9ydGVkIGluIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBlbnZpcm9ubWVudC5cbiAqXG4gKiBOT1RFOiBUaGlzIHdpbGwgbm90IHdvcmsgY29ycmVjdGx5IGZvciBub24tZ2VuZXJpYyBldmVudHMgc3VjaCBhcyBgY2hhbmdlYCxcbiAqIGByZXNldGAsIGBsb2FkYCwgYGVycm9yYCwgYW5kIGBzZWxlY3RgLlxuICpcbiAqIEJvcnJvd3MgZnJvbSBNb2Rlcm5penIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVN1ZmZpeCBFdmVudCBuYW1lLCBlLmcuIFwiY2xpY2tcIi5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGV2ZW50IGlzIHN1cHBvcnRlZC5cbiAqIEBpbnRlcm5hbFxuICogQGxpY2Vuc2UgTW9kZXJuaXpyIDMuMC4wcHJlIChDdXN0b20gQnVpbGQpIHwgTUlUXG4gKi9cblxuZnVuY3Rpb24gaXNFdmVudFN1cHBvcnRlZChldmVudE5hbWVTdWZmaXgpIHtcbiAgaWYgKCFjYW5Vc2VET00pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgZXZlbnROYW1lID0gJ29uJyArIGV2ZW50TmFtZVN1ZmZpeDtcbiAgdmFyIGlzU3VwcG9ydGVkID0gKGV2ZW50TmFtZSBpbiBkb2N1bWVudCk7XG5cbiAgaWYgKCFpc1N1cHBvcnRlZCkge1xuICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoZXZlbnROYW1lLCAncmV0dXJuOycpO1xuICAgIGlzU3VwcG9ydGVkID0gdHlwZW9mIGVsZW1lbnRbZXZlbnROYW1lXSA9PT0gJ2Z1bmN0aW9uJztcbiAgfVxuXG4gIHJldHVybiBpc1N1cHBvcnRlZDtcbn1cblxuZnVuY3Rpb24gcmVnaXN0ZXJFdmVudHMkMSgpIHtcbiAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KCdvbkNoYW5nZScsIFsnY2hhbmdlJywgJ2NsaWNrJywgJ2ZvY3VzaW4nLCAnZm9jdXNvdXQnLCAnaW5wdXQnLCAna2V5ZG93bicsICdrZXl1cCcsICdzZWxlY3Rpb25jaGFuZ2UnXSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUFuZEFjY3VtdWxhdGVDaGFuZ2VFdmVudChkaXNwYXRjaFF1ZXVlLCBpbnN0LCBuYXRpdmVFdmVudCwgdGFyZ2V0KSB7XG4gIC8vIEZsYWcgdGhpcyBldmVudCBsb29wIGFzIG5lZWRpbmcgc3RhdGUgcmVzdG9yZS5cbiAgZW5xdWV1ZVN0YXRlUmVzdG9yZSh0YXJnZXQpO1xuICB2YXIgbGlzdGVuZXJzID0gYWNjdW11bGF0ZVR3b1BoYXNlTGlzdGVuZXJzKGluc3QsICdvbkNoYW5nZScpO1xuXG4gIGlmIChsaXN0ZW5lcnMubGVuZ3RoID4gMCkge1xuICAgIHZhciBldmVudCA9IG5ldyBTeW50aGV0aWNFdmVudCgnb25DaGFuZ2UnLCAnY2hhbmdlJywgbnVsbCwgbmF0aXZlRXZlbnQsIHRhcmdldCk7XG4gICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgIGxpc3RlbmVyczogbGlzdGVuZXJzXG4gICAgfSk7XG4gIH1cbn1cbi8qKlxuICogRm9yIElFIHNoaW1zXG4gKi9cblxuXG52YXIgYWN0aXZlRWxlbWVudCA9IG51bGw7XG52YXIgYWN0aXZlRWxlbWVudEluc3QgPSBudWxsO1xuLyoqXG4gKiBTRUNUSU9OOiBoYW5kbGUgYGNoYW5nZWAgZXZlbnRcbiAqL1xuXG5mdW5jdGlvbiBzaG91bGRVc2VDaGFuZ2VFdmVudChlbGVtKSB7XG4gIHZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gbm9kZU5hbWUgPT09ICdzZWxlY3QnIHx8IG5vZGVOYW1lID09PSAnaW5wdXQnICYmIGVsZW0udHlwZSA9PT0gJ2ZpbGUnO1xufVxuXG5mdW5jdGlvbiBtYW51YWxEaXNwYXRjaENoYW5nZUV2ZW50KG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBkaXNwYXRjaFF1ZXVlID0gW107XG4gIGNyZWF0ZUFuZEFjY3VtdWxhdGVDaGFuZ2VFdmVudChkaXNwYXRjaFF1ZXVlLCBhY3RpdmVFbGVtZW50SW5zdCwgbmF0aXZlRXZlbnQsIGdldEV2ZW50VGFyZ2V0KG5hdGl2ZUV2ZW50KSk7IC8vIElmIGNoYW5nZSBhbmQgcHJvcGVydHljaGFuZ2UgYnViYmxlZCwgd2UnZCBqdXN0IGJpbmQgdG8gaXQgbGlrZSBhbGwgdGhlXG4gIC8vIG90aGVyIGV2ZW50cyBhbmQgaGF2ZSBpdCBnbyB0aHJvdWdoIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci4gU2luY2UgaXRcbiAgLy8gZG9lc24ndCwgd2UgbWFudWFsbHkgbGlzdGVuIGZvciB0aGUgZXZlbnRzIGFuZCBzbyB3ZSBoYXZlIHRvIGVucXVldWUgYW5kXG4gIC8vIHByb2Nlc3MgdGhlIGFic3RyYWN0IGV2ZW50IG1hbnVhbGx5LlxuICAvL1xuICAvLyBCYXRjaGluZyBpcyBuZWNlc3NhcnkgaGVyZSBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCBhbGwgZXZlbnQgaGFuZGxlcnMgcnVuXG4gIC8vIGJlZm9yZSB0aGUgbmV4dCByZXJlbmRlciAoaW5jbHVkaW5nIGV2ZW50IGhhbmRsZXJzIGF0dGFjaGVkIHRvIGFuY2VzdG9yXG4gIC8vIGVsZW1lbnRzIGluc3RlYWQgb2YgZGlyZWN0bHkgb24gdGhlIGlucHV0KS4gV2l0aG91dCB0aGlzLCBjb250cm9sbGVkXG4gIC8vIGNvbXBvbmVudHMgZG9uJ3Qgd29yayBwcm9wZXJseSBpbiBjb25qdW5jdGlvbiB3aXRoIGV2ZW50IGJ1YmJsaW5nIGJlY2F1c2VcbiAgLy8gdGhlIGNvbXBvbmVudCBpcyByZXJlbmRlcmVkIGFuZCB0aGUgdmFsdWUgcmV2ZXJ0ZWQgYmVmb3JlIGFsbCB0aGUgZXZlbnRcbiAgLy8gaGFuZGxlcnMgY2FuIHJ1bi4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNzA4LlxuXG4gIGJhdGNoZWRVcGRhdGVzKHJ1bkV2ZW50SW5CYXRjaCwgZGlzcGF0Y2hRdWV1ZSk7XG59XG5cbmZ1bmN0aW9uIHJ1bkV2ZW50SW5CYXRjaChkaXNwYXRjaFF1ZXVlKSB7XG4gIHByb2Nlc3NEaXNwYXRjaFF1ZXVlKGRpc3BhdGNoUXVldWUsIDApO1xufVxuXG5mdW5jdGlvbiBnZXRJbnN0SWZWYWx1ZUNoYW5nZWQodGFyZ2V0SW5zdCkge1xuICB2YXIgdGFyZ2V0Tm9kZSA9IGdldE5vZGVGcm9tSW5zdGFuY2UodGFyZ2V0SW5zdCk7XG5cbiAgaWYgKHVwZGF0ZVZhbHVlSWZDaGFuZ2VkKHRhcmdldE5vZGUpKSB7XG4gICAgcmV0dXJuIHRhcmdldEluc3Q7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvckNoYW5nZUV2ZW50KGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCkge1xuICBpZiAoZG9tRXZlbnROYW1lID09PSAnY2hhbmdlJykge1xuICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICB9XG59XG4vKipcbiAqIFNFQ1RJT046IGhhbmRsZSBgaW5wdXRgIGV2ZW50XG4gKi9cblxuXG52YXIgaXNJbnB1dEV2ZW50U3VwcG9ydGVkID0gZmFsc2U7XG5cbmlmIChjYW5Vc2VET00pIHtcbiAgLy8gSUU5IGNsYWltcyB0byBzdXBwb3J0IHRoZSBpbnB1dCBldmVudCBidXQgZmFpbHMgdG8gdHJpZ2dlciBpdCB3aGVuXG4gIC8vIGRlbGV0aW5nIHRleHQsIHNvIHdlIGlnbm9yZSBpdHMgaW5wdXQgZXZlbnRzLlxuICBpc0lucHV0RXZlbnRTdXBwb3J0ZWQgPSBpc0V2ZW50U3VwcG9ydGVkKCdpbnB1dCcpICYmICghZG9jdW1lbnQuZG9jdW1lbnRNb2RlIHx8IGRvY3VtZW50LmRvY3VtZW50TW9kZSA+IDkpO1xufVxuLyoqXG4gKiAoRm9yIElFIDw9OSkgU3RhcnRzIHRyYWNraW5nIHByb3BlcnR5Y2hhbmdlIGV2ZW50cyBvbiB0aGUgcGFzc2VkLWluIGVsZW1lbnRcbiAqIGFuZCBvdmVycmlkZSB0aGUgdmFsdWUgcHJvcGVydHkgc28gdGhhdCB3ZSBjYW4gZGlzdGluZ3Vpc2ggdXNlciBldmVudHMgZnJvbVxuICogdmFsdWUgY2hhbmdlcyBpbiBKUy5cbiAqL1xuXG5cbmZ1bmN0aW9uIHN0YXJ0V2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSh0YXJnZXQsIHRhcmdldEluc3QpIHtcbiAgYWN0aXZlRWxlbWVudCA9IHRhcmdldDtcbiAgYWN0aXZlRWxlbWVudEluc3QgPSB0YXJnZXRJbnN0O1xuICBhY3RpdmVFbGVtZW50LmF0dGFjaEV2ZW50KCdvbnByb3BlcnR5Y2hhbmdlJywgaGFuZGxlUHJvcGVydHlDaGFuZ2UpO1xufVxuLyoqXG4gKiAoRm9yIElFIDw9OSkgUmVtb3ZlcyB0aGUgZXZlbnQgbGlzdGVuZXJzIGZyb20gdGhlIGN1cnJlbnRseS10cmFja2VkIGVsZW1lbnQsXG4gKiBpZiBhbnkgZXhpc3RzLlxuICovXG5cblxuZnVuY3Rpb24gc3RvcFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UoKSB7XG4gIGlmICghYWN0aXZlRWxlbWVudCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGFjdGl2ZUVsZW1lbnQuZGV0YWNoRXZlbnQoJ29ucHJvcGVydHljaGFuZ2UnLCBoYW5kbGVQcm9wZXJ0eUNoYW5nZSk7XG4gIGFjdGl2ZUVsZW1lbnQgPSBudWxsO1xuICBhY3RpdmVFbGVtZW50SW5zdCA9IG51bGw7XG59XG4vKipcbiAqIChGb3IgSUUgPD05KSBIYW5kbGVzIGEgcHJvcGVydHljaGFuZ2UgZXZlbnQsIHNlbmRpbmcgYSBgY2hhbmdlYCBldmVudCBpZlxuICogdGhlIHZhbHVlIG9mIHRoZSBhY3RpdmUgZWxlbWVudCBoYXMgY2hhbmdlZC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGhhbmRsZVByb3BlcnR5Q2hhbmdlKG5hdGl2ZUV2ZW50KSB7XG4gIGlmIChuYXRpdmVFdmVudC5wcm9wZXJ0eU5hbWUgIT09ICd2YWx1ZScpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKGFjdGl2ZUVsZW1lbnRJbnN0KSkge1xuICAgIG1hbnVhbERpc3BhdGNoQ2hhbmdlRXZlbnQobmF0aXZlRXZlbnQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUV2ZW50c0ZvcklucHV0RXZlbnRQb2x5ZmlsbChkb21FdmVudE5hbWUsIHRhcmdldCwgdGFyZ2V0SW5zdCkge1xuICBpZiAoZG9tRXZlbnROYW1lID09PSAnZm9jdXNpbicpIHtcbiAgICAvLyBJbiBJRTksIHByb3BlcnR5Y2hhbmdlIGZpcmVzIGZvciBtb3N0IGlucHV0IGV2ZW50cyBidXQgaXMgYnVnZ3kgYW5kXG4gICAgLy8gZG9lc24ndCBmaXJlIHdoZW4gdGV4dCBpcyBkZWxldGVkLCBidXQgY29udmVuaWVudGx5LCBzZWxlY3Rpb25jaGFuZ2VcbiAgICAvLyBhcHBlYXJzIHRvIGZpcmUgaW4gYWxsIG9mIHRoZSByZW1haW5pbmcgY2FzZXMgc28gd2UgY2F0Y2ggdGhvc2UgYW5kXG4gICAgLy8gZm9yd2FyZCB0aGUgZXZlbnQgaWYgdGhlIHZhbHVlIGhhcyBjaGFuZ2VkXG4gICAgLy8gSW4gZWl0aGVyIGNhc2UsIHdlIGRvbid0IHdhbnQgdG8gY2FsbCB0aGUgZXZlbnQgaGFuZGxlciBpZiB0aGUgdmFsdWVcbiAgICAvLyBpcyBjaGFuZ2VkIGZyb20gSlMgc28gd2UgcmVkZWZpbmUgYSBzZXR0ZXIgZm9yIGAudmFsdWVgIHRoYXQgdXBkYXRlc1xuICAgIC8vIG91ciBhY3RpdmVFbGVtZW50VmFsdWUgdmFyaWFibGUsIGFsbG93aW5nIHVzIHRvIGlnbm9yZSB0aG9zZSBjaGFuZ2VzXG4gICAgLy9cbiAgICAvLyBzdG9wV2F0Y2hpbmcoKSBzaG91bGQgYmUgYSBub29wIGhlcmUgYnV0IHdlIGNhbGwgaXQganVzdCBpbiBjYXNlIHdlXG4gICAgLy8gbWlzc2VkIGEgYmx1ciBldmVudCBzb21laG93LlxuICAgIHN0b3BXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKCk7XG4gICAgc3RhcnRXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKHRhcmdldCwgdGFyZ2V0SW5zdCk7XG4gIH0gZWxzZSBpZiAoZG9tRXZlbnROYW1lID09PSAnZm9jdXNvdXQnKSB7XG4gICAgc3RvcFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UoKTtcbiAgfVxufSAvLyBGb3IgSUU4IGFuZCBJRTkuXG5cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvcklucHV0RXZlbnRQb2x5ZmlsbChkb21FdmVudE5hbWUsIHRhcmdldEluc3QpIHtcbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ3NlbGVjdGlvbmNoYW5nZScgfHwgZG9tRXZlbnROYW1lID09PSAna2V5dXAnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ2tleWRvd24nKSB7XG4gICAgLy8gT24gdGhlIHNlbGVjdGlvbmNoYW5nZSBldmVudCwgdGhlIHRhcmdldCBpcyBqdXN0IGRvY3VtZW50IHdoaWNoIGlzbid0XG4gICAgLy8gaGVscGZ1bCBmb3IgdXMgc28ganVzdCBjaGVjayBhY3RpdmVFbGVtZW50IGluc3RlYWQuXG4gICAgLy9cbiAgICAvLyA5OSUgb2YgdGhlIHRpbWUsIGtleWRvd24gYW5kIGtleXVwIGFyZW4ndCBuZWNlc3NhcnkuIElFOCBmYWlscyB0byBmaXJlXG4gICAgLy8gcHJvcGVydHljaGFuZ2Ugb24gdGhlIGZpcnN0IGlucHV0IGV2ZW50IGFmdGVyIHNldHRpbmcgYHZhbHVlYCBmcm9tIGFcbiAgICAvLyBzY3JpcHQgYW5kIGZpcmVzIG9ubHkga2V5ZG93biwga2V5cHJlc3MsIGtleXVwLiBDYXRjaGluZyBrZXl1cCB1c3VhbGx5XG4gICAgLy8gZ2V0cyBpdCBhbmQgY2F0Y2hpbmcga2V5ZG93biBsZXRzIHVzIGZpcmUgYW4gZXZlbnQgZm9yIHRoZSBmaXJzdFxuICAgIC8vIGtleXN0cm9rZSBpZiB1c2VyIGRvZXMgYSBrZXkgcmVwZWF0IChpdCdsbCBiZSBhIGxpdHRsZSBkZWxheWVkOiByaWdodFxuICAgIC8vIGJlZm9yZSB0aGUgc2Vjb25kIGtleXN0cm9rZSkuIE90aGVyIGlucHV0IG1ldGhvZHMgKGUuZy4sIHBhc3RlKSBzZWVtIHRvXG4gICAgLy8gZmlyZSBzZWxlY3Rpb25jaGFuZ2Ugbm9ybWFsbHkuXG4gICAgcmV0dXJuIGdldEluc3RJZlZhbHVlQ2hhbmdlZChhY3RpdmVFbGVtZW50SW5zdCk7XG4gIH1cbn1cbi8qKlxuICogU0VDVElPTjogaGFuZGxlIGBjbGlja2AgZXZlbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHNob3VsZFVzZUNsaWNrRXZlbnQoZWxlbSkge1xuICAvLyBVc2UgdGhlIGBjbGlja2AgZXZlbnQgdG8gZGV0ZWN0IGNoYW5nZXMgdG8gY2hlY2tib3ggYW5kIHJhZGlvIGlucHV0cy5cbiAgLy8gVGhpcyBhcHByb2FjaCB3b3JrcyBhY3Jvc3MgYWxsIGJyb3dzZXJzLCB3aGVyZWFzIGBjaGFuZ2VgIGRvZXMgbm90IGZpcmVcbiAgLy8gdW50aWwgYGJsdXJgIGluIElFOC5cbiAgdmFyIG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZTtcbiAgcmV0dXJuIG5vZGVOYW1lICYmIG5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpbnB1dCcgJiYgKGVsZW0udHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbGVtLnR5cGUgPT09ICdyYWRpbycpO1xufVxuXG5mdW5jdGlvbiBnZXRUYXJnZXRJbnN0Rm9yQ2xpY2tFdmVudChkb21FdmVudE5hbWUsIHRhcmdldEluc3QpIHtcbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2NsaWNrJykge1xuICAgIHJldHVybiBnZXRJbnN0SWZWYWx1ZUNoYW5nZWQodGFyZ2V0SW5zdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvcklucHV0T3JDaGFuZ2VFdmVudChkb21FdmVudE5hbWUsIHRhcmdldEluc3QpIHtcbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2lucHV0JyB8fCBkb21FdmVudE5hbWUgPT09ICdjaGFuZ2UnKSB7XG4gICAgcmV0dXJuIGdldEluc3RJZlZhbHVlQ2hhbmdlZCh0YXJnZXRJbnN0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVDb250cm9sbGVkSW5wdXRCbHVyKG5vZGUpIHtcbiAgdmFyIHN0YXRlID0gbm9kZS5fd3JhcHBlclN0YXRlO1xuXG4gIGlmICghc3RhdGUgfHwgIXN0YXRlLmNvbnRyb2xsZWQgfHwgbm9kZS50eXBlICE9PSAnbnVtYmVyJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHtcbiAgICAvLyBJZiBjb250cm9sbGVkLCBhc3NpZ24gdGhlIHZhbHVlIGF0dHJpYnV0ZSB0byB0aGUgY3VycmVudCB2YWx1ZSBvbiBibHVyXG4gICAgc2V0RGVmYXVsdFZhbHVlKG5vZGUsICdudW1iZXInLCBub2RlLnZhbHVlKTtcbiAgfVxufVxuLyoqXG4gKiBUaGlzIHBsdWdpbiBjcmVhdGVzIGFuIGBvbkNoYW5nZWAgZXZlbnQgdGhhdCBub3JtYWxpemVzIGNoYW5nZSBldmVudHNcbiAqIGFjcm9zcyBmb3JtIGVsZW1lbnRzLiBUaGlzIGV2ZW50IGZpcmVzIGF0IGEgdGltZSB3aGVuIGl0J3MgcG9zc2libGUgdG9cbiAqIGNoYW5nZSB0aGUgZWxlbWVudCdzIHZhbHVlIHdpdGhvdXQgc2VlaW5nIGEgZmxpY2tlci5cbiAqXG4gKiBTdXBwb3J0ZWQgZWxlbWVudHMgYXJlOlxuICogLSBpbnB1dCAoc2VlIGBpc1RleHRJbnB1dEVsZW1lbnRgKVxuICogLSB0ZXh0YXJlYVxuICogLSBzZWxlY3RcbiAqL1xuXG5cbmZ1bmN0aW9uIGV4dHJhY3RFdmVudHMkMShkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIHZhciB0YXJnZXROb2RlID0gdGFyZ2V0SW5zdCA/IGdldE5vZGVGcm9tSW5zdGFuY2UodGFyZ2V0SW5zdCkgOiB3aW5kb3c7XG4gIHZhciBnZXRUYXJnZXRJbnN0RnVuYywgaGFuZGxlRXZlbnRGdW5jO1xuXG4gIGlmIChzaG91bGRVc2VDaGFuZ2VFdmVudCh0YXJnZXROb2RlKSkge1xuICAgIGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvckNoYW5nZUV2ZW50O1xuICB9IGVsc2UgaWYgKGlzVGV4dElucHV0RWxlbWVudCh0YXJnZXROb2RlKSkge1xuICAgIGlmIChpc0lucHV0RXZlbnRTdXBwb3J0ZWQpIHtcbiAgICAgIGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvcklucHV0T3JDaGFuZ2VFdmVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2V0VGFyZ2V0SW5zdEZ1bmMgPSBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRFdmVudFBvbHlmaWxsO1xuICAgICAgaGFuZGxlRXZlbnRGdW5jID0gaGFuZGxlRXZlbnRzRm9ySW5wdXRFdmVudFBvbHlmaWxsO1xuICAgIH1cbiAgfSBlbHNlIGlmIChzaG91bGRVc2VDbGlja0V2ZW50KHRhcmdldE5vZGUpKSB7XG4gICAgZ2V0VGFyZ2V0SW5zdEZ1bmMgPSBnZXRUYXJnZXRJbnN0Rm9yQ2xpY2tFdmVudDtcbiAgfVxuXG4gIGlmIChnZXRUYXJnZXRJbnN0RnVuYykge1xuICAgIHZhciBpbnN0ID0gZ2V0VGFyZ2V0SW5zdEZ1bmMoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KTtcblxuICAgIGlmIChpbnN0KSB7XG4gICAgICBjcmVhdGVBbmRBY2N1bXVsYXRlQ2hhbmdlRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgaW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBpZiAoaGFuZGxlRXZlbnRGdW5jKSB7XG4gICAgaGFuZGxlRXZlbnRGdW5jKGRvbUV2ZW50TmFtZSwgdGFyZ2V0Tm9kZSwgdGFyZ2V0SW5zdCk7XG4gIH0gLy8gV2hlbiBibHVycmluZywgc2V0IHRoZSB2YWx1ZSBhdHRyaWJ1dGUgZm9yIG51bWJlciBpbnB1dHNcblxuXG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdmb2N1c291dCcpIHtcbiAgICBoYW5kbGVDb250cm9sbGVkSW5wdXRCbHVyKHRhcmdldE5vZGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyRXZlbnRzJDIoKSB7XG4gIHJlZ2lzdGVyRGlyZWN0RXZlbnQoJ29uTW91c2VFbnRlcicsIFsnbW91c2VvdXQnLCAnbW91c2VvdmVyJ10pO1xuICByZWdpc3RlckRpcmVjdEV2ZW50KCdvbk1vdXNlTGVhdmUnLCBbJ21vdXNlb3V0JywgJ21vdXNlb3ZlciddKTtcbiAgcmVnaXN0ZXJEaXJlY3RFdmVudCgnb25Qb2ludGVyRW50ZXInLCBbJ3BvaW50ZXJvdXQnLCAncG9pbnRlcm92ZXInXSk7XG4gIHJlZ2lzdGVyRGlyZWN0RXZlbnQoJ29uUG9pbnRlckxlYXZlJywgWydwb2ludGVyb3V0JywgJ3BvaW50ZXJvdmVyJ10pO1xufVxuLyoqXG4gKiBGb3IgYWxtb3N0IGV2ZXJ5IGludGVyYWN0aW9uIHdlIGNhcmUgYWJvdXQsIHRoZXJlIHdpbGwgYmUgYm90aCBhIHRvcC1sZXZlbFxuICogYG1vdXNlb3ZlcmAgYW5kIGBtb3VzZW91dGAgZXZlbnQgdGhhdCBvY2N1cnMuIE9ubHkgdXNlIGBtb3VzZW91dGAgc28gdGhhdFxuICogd2UgZG8gbm90IGV4dHJhY3QgZHVwbGljYXRlIGV2ZW50cy4gSG93ZXZlciwgbW92aW5nIHRoZSBtb3VzZSBpbnRvIHRoZVxuICogYnJvd3NlciBmcm9tIG91dHNpZGUgd2lsbCBub3QgZmlyZSBhIGBtb3VzZW91dGAgZXZlbnQuIEluIHRoaXMgY2FzZSwgd2UgdXNlXG4gKiB0aGUgYG1vdXNlb3ZlcmAgdG9wLWxldmVsIGV2ZW50LlxuICovXG5cblxuZnVuY3Rpb24gZXh0cmFjdEV2ZW50cyQyKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpIHtcbiAgdmFyIGlzT3ZlckV2ZW50ID0gZG9tRXZlbnROYW1lID09PSAnbW91c2VvdmVyJyB8fCBkb21FdmVudE5hbWUgPT09ICdwb2ludGVyb3Zlcic7XG4gIHZhciBpc091dEV2ZW50ID0gZG9tRXZlbnROYW1lID09PSAnbW91c2VvdXQnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ3BvaW50ZXJvdXQnO1xuXG4gIGlmIChpc092ZXJFdmVudCAmJiAhaXNSZXBsYXlpbmdFdmVudChuYXRpdmVFdmVudCkpIHtcbiAgICAvLyBJZiB0aGlzIGlzIGFuIG92ZXIgZXZlbnQgd2l0aCBhIHRhcmdldCwgd2UgbWlnaHQgaGF2ZSBhbHJlYWR5IGRpc3BhdGNoZWRcbiAgICAvLyB0aGUgZXZlbnQgaW4gdGhlIG91dCBldmVudCBvZiB0aGUgb3RoZXIgdGFyZ2V0LiBJZiB0aGlzIGlzIHJlcGxheWVkLFxuICAgIC8vIHRoZW4gaXQncyBiZWNhdXNlIHdlIGNvdWxkbid0IGRpc3BhdGNoIGFnYWluc3QgdGhpcyB0YXJnZXQgcHJldmlvdXNseVxuICAgIC8vIHNvIHdlIGhhdmUgdG8gZG8gaXQgbm93IGluc3RlYWQuXG4gICAgdmFyIHJlbGF0ZWQgPSBuYXRpdmVFdmVudC5yZWxhdGVkVGFyZ2V0IHx8IG5hdGl2ZUV2ZW50LmZyb21FbGVtZW50O1xuXG4gICAgaWYgKHJlbGF0ZWQpIHtcbiAgICAgIC8vIElmIHRoZSByZWxhdGVkIG5vZGUgaXMgbWFuYWdlZCBieSBSZWFjdCwgd2UgY2FuIGFzc3VtZSB0aGF0IHdlIGhhdmVcbiAgICAgIC8vIGFscmVhZHkgZGlzcGF0Y2hlZCB0aGUgY29ycmVzcG9uZGluZyBldmVudHMgZHVyaW5nIGl0cyBtb3VzZW91dC5cbiAgICAgIGlmIChnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShyZWxhdGVkKSB8fCBpc0NvbnRhaW5lck1hcmtlZEFzUm9vdChyZWxhdGVkKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCFpc091dEV2ZW50ICYmICFpc092ZXJFdmVudCkge1xuICAgIC8vIE11c3Qgbm90IGJlIGEgbW91c2Ugb3IgcG9pbnRlciBpbiBvciBvdXQgLSBpZ25vcmluZy5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgd2luOyAvLyBUT0RPOiB3aHkgaXMgdGhpcyBudWxsYWJsZSBpbiB0aGUgdHlwZXMgYnV0IHdlIHJlYWQgZnJvbSBpdD9cblxuICBpZiAobmF0aXZlRXZlbnRUYXJnZXQud2luZG93ID09PSBuYXRpdmVFdmVudFRhcmdldCkge1xuICAgIC8vIGBuYXRpdmVFdmVudFRhcmdldGAgaXMgcHJvYmFibHkgYSB3aW5kb3cgb2JqZWN0LlxuICAgIHdpbiA9IG5hdGl2ZUV2ZW50VGFyZ2V0O1xuICB9IGVsc2Uge1xuICAgIC8vIFRPRE86IEZpZ3VyZSBvdXQgd2h5IGBvd25lckRvY3VtZW50YCBpcyBzb21ldGltZXMgdW5kZWZpbmVkIGluIElFOC5cbiAgICB2YXIgZG9jID0gbmF0aXZlRXZlbnRUYXJnZXQub3duZXJEb2N1bWVudDtcblxuICAgIGlmIChkb2MpIHtcbiAgICAgIHdpbiA9IGRvYy5kZWZhdWx0VmlldyB8fCBkb2MucGFyZW50V2luZG93O1xuICAgIH0gZWxzZSB7XG4gICAgICB3aW4gPSB3aW5kb3c7XG4gICAgfVxuICB9XG5cbiAgdmFyIGZyb207XG4gIHZhciB0bztcblxuICBpZiAoaXNPdXRFdmVudCkge1xuICAgIHZhciBfcmVsYXRlZCA9IG5hdGl2ZUV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgbmF0aXZlRXZlbnQudG9FbGVtZW50O1xuXG4gICAgZnJvbSA9IHRhcmdldEluc3Q7XG4gICAgdG8gPSBfcmVsYXRlZCA/IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKF9yZWxhdGVkKSA6IG51bGw7XG5cbiAgICBpZiAodG8gIT09IG51bGwpIHtcbiAgICAgIHZhciBuZWFyZXN0TW91bnRlZCA9IGdldE5lYXJlc3RNb3VudGVkRmliZXIodG8pO1xuXG4gICAgICBpZiAodG8gIT09IG5lYXJlc3RNb3VudGVkIHx8IHRvLnRhZyAhPT0gSG9zdENvbXBvbmVudCAmJiB0by50YWcgIT09IEhvc3RUZXh0KSB7XG4gICAgICAgIHRvID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gTW92aW5nIHRvIGEgbm9kZSBmcm9tIG91dHNpZGUgdGhlIHdpbmRvdy5cbiAgICBmcm9tID0gbnVsbDtcbiAgICB0byA9IHRhcmdldEluc3Q7XG4gIH1cblxuICBpZiAoZnJvbSA9PT0gdG8pIHtcbiAgICAvLyBOb3RoaW5nIHBlcnRhaW5zIHRvIG91ciBtYW5hZ2VkIGNvbXBvbmVudHMuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY01vdXNlRXZlbnQ7XG4gIHZhciBsZWF2ZUV2ZW50VHlwZSA9ICdvbk1vdXNlTGVhdmUnO1xuICB2YXIgZW50ZXJFdmVudFR5cGUgPSAnb25Nb3VzZUVudGVyJztcbiAgdmFyIGV2ZW50VHlwZVByZWZpeCA9ICdtb3VzZSc7XG5cbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ3BvaW50ZXJvdXQnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ3BvaW50ZXJvdmVyJykge1xuICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1BvaW50ZXJFdmVudDtcbiAgICBsZWF2ZUV2ZW50VHlwZSA9ICdvblBvaW50ZXJMZWF2ZSc7XG4gICAgZW50ZXJFdmVudFR5cGUgPSAnb25Qb2ludGVyRW50ZXInO1xuICAgIGV2ZW50VHlwZVByZWZpeCA9ICdwb2ludGVyJztcbiAgfVxuXG4gIHZhciBmcm9tTm9kZSA9IGZyb20gPT0gbnVsbCA/IHdpbiA6IGdldE5vZGVGcm9tSW5zdGFuY2UoZnJvbSk7XG4gIHZhciB0b05vZGUgPSB0byA9PSBudWxsID8gd2luIDogZ2V0Tm9kZUZyb21JbnN0YW5jZSh0byk7XG4gIHZhciBsZWF2ZSA9IG5ldyBTeW50aGV0aWNFdmVudEN0b3IobGVhdmVFdmVudFR5cGUsIGV2ZW50VHlwZVByZWZpeCArICdsZWF2ZScsIGZyb20sIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gIGxlYXZlLnRhcmdldCA9IGZyb21Ob2RlO1xuICBsZWF2ZS5yZWxhdGVkVGFyZ2V0ID0gdG9Ob2RlO1xuICB2YXIgZW50ZXIgPSBudWxsOyAvLyBXZSBzaG91bGQgb25seSBwcm9jZXNzIHRoaXMgbmF0aXZlRXZlbnQgaWYgd2UgYXJlIHByb2Nlc3NpbmdcbiAgLy8gdGhlIGZpcnN0IGFuY2VzdG9yLiBOZXh0IHRpbWUsIHdlIHdpbGwgaWdub3JlIHRoZSBldmVudC5cblxuICB2YXIgbmF0aXZlVGFyZ2V0SW5zdCA9IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKG5hdGl2ZUV2ZW50VGFyZ2V0KTtcblxuICBpZiAobmF0aXZlVGFyZ2V0SW5zdCA9PT0gdGFyZ2V0SW5zdCkge1xuICAgIHZhciBlbnRlckV2ZW50ID0gbmV3IFN5bnRoZXRpY0V2ZW50Q3RvcihlbnRlckV2ZW50VHlwZSwgZXZlbnRUeXBlUHJlZml4ICsgJ2VudGVyJywgdG8sIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgZW50ZXJFdmVudC50YXJnZXQgPSB0b05vZGU7XG4gICAgZW50ZXJFdmVudC5yZWxhdGVkVGFyZ2V0ID0gZnJvbU5vZGU7XG4gICAgZW50ZXIgPSBlbnRlckV2ZW50O1xuICB9XG5cbiAgYWNjdW11bGF0ZUVudGVyTGVhdmVUd29QaGFzZUxpc3RlbmVycyhkaXNwYXRjaFF1ZXVlLCBsZWF2ZSwgZW50ZXIsIGZyb20sIHRvKTtcbn1cblxuLyoqXG4gKiBpbmxpbmVkIE9iamVjdC5pcyBwb2x5ZmlsbCB0byBhdm9pZCByZXF1aXJpbmcgY29uc3VtZXJzIHNoaXAgdGhlaXIgb3duXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNcbiAqL1xuZnVuY3Rpb24gaXMoeCwgeSkge1xuICByZXR1cm4geCA9PT0geSAmJiAoeCAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHkpIHx8IHggIT09IHggJiYgeSAhPT0geSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxuICA7XG59XG5cbnZhciBvYmplY3RJcyA9IHR5cGVvZiBPYmplY3QuaXMgPT09ICdmdW5jdGlvbicgPyBPYmplY3QuaXMgOiBpcztcblxuLyoqXG4gKiBQZXJmb3JtcyBlcXVhbGl0eSBieSBpdGVyYXRpbmcgdGhyb3VnaCBrZXlzIG9uIGFuIG9iamVjdCBhbmQgcmV0dXJuaW5nIGZhbHNlXG4gKiB3aGVuIGFueSBrZXkgaGFzIHZhbHVlcyB3aGljaCBhcmUgbm90IHN0cmljdGx5IGVxdWFsIGJldHdlZW4gdGhlIGFyZ3VtZW50cy5cbiAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSB2YWx1ZXMgb2YgYWxsIGtleXMgYXJlIHN0cmljdGx5IGVxdWFsLlxuICovXG5cbmZ1bmN0aW9uIHNoYWxsb3dFcXVhbChvYmpBLCBvYmpCKSB7XG4gIGlmIChvYmplY3RJcyhvYmpBLCBvYmpCKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmpBICE9PSAnb2JqZWN0JyB8fCBvYmpBID09PSBudWxsIHx8IHR5cGVvZiBvYmpCICE9PSAnb2JqZWN0JyB8fCBvYmpCID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGtleXNBID0gT2JqZWN0LmtleXMob2JqQSk7XG4gIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuXG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBUZXN0IGZvciBBJ3Mga2V5cyBkaWZmZXJlbnQgZnJvbSBCLlxuXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzQS5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjdXJyZW50S2V5ID0ga2V5c0FbaV07XG5cbiAgICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwob2JqQiwgY3VycmVudEtleSkgfHwgIW9iamVjdElzKG9iakFbY3VycmVudEtleV0sIG9iakJbY3VycmVudEtleV0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogR2l2ZW4gYW55IG5vZGUgcmV0dXJuIHRoZSBmaXJzdCBsZWFmIG5vZGUgd2l0aG91dCBjaGlsZHJlbi5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IG5vZGVcbiAqIEByZXR1cm4ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9XG4gKi9cblxuZnVuY3Rpb24gZ2V0TGVhZk5vZGUobm9kZSkge1xuICB3aGlsZSAobm9kZSAmJiBub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICBub2RlID0gbm9kZS5maXJzdENoaWxkO1xuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59XG4vKipcbiAqIEdldCB0aGUgbmV4dCBzaWJsaW5nIHdpdGhpbiBhIGNvbnRhaW5lci4gVGhpcyB3aWxsIHdhbGsgdXAgdGhlXG4gKiBET00gaWYgYSBub2RlJ3Mgc2libGluZ3MgaGF2ZSBiZWVuIGV4aGF1c3RlZC5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IG5vZGVcbiAqIEByZXR1cm4gez9ET01FbGVtZW50fERPTVRleHROb2RlfVxuICovXG5cblxuZnVuY3Rpb24gZ2V0U2libGluZ05vZGUobm9kZSkge1xuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlLm5leHRTaWJsaW5nKSB7XG4gICAgICByZXR1cm4gbm9kZS5uZXh0U2libGluZztcbiAgICB9XG5cbiAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICB9XG59XG4vKipcbiAqIEdldCBvYmplY3QgZGVzY3JpYmluZyB0aGUgbm9kZXMgd2hpY2ggY29udGFpbiBjaGFyYWN0ZXJzIGF0IG9mZnNldC5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IHJvb3RcbiAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXRcbiAqIEByZXR1cm4gez9vYmplY3R9XG4gKi9cblxuXG5mdW5jdGlvbiBnZXROb2RlRm9yQ2hhcmFjdGVyT2Zmc2V0KHJvb3QsIG9mZnNldCkge1xuICB2YXIgbm9kZSA9IGdldExlYWZOb2RlKHJvb3QpO1xuICB2YXIgbm9kZVN0YXJ0ID0gMDtcbiAgdmFyIG5vZGVFbmQgPSAwO1xuXG4gIHdoaWxlIChub2RlKSB7XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkge1xuICAgICAgbm9kZUVuZCA9IG5vZGVTdGFydCArIG5vZGUudGV4dENvbnRlbnQubGVuZ3RoO1xuXG4gICAgICBpZiAobm9kZVN0YXJ0IDw9IG9mZnNldCAmJiBub2RlRW5kID49IG9mZnNldCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICAgICAgb2Zmc2V0OiBvZmZzZXQgLSBub2RlU3RhcnRcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgbm9kZVN0YXJ0ID0gbm9kZUVuZDtcbiAgICB9XG5cbiAgICBub2RlID0gZ2V0TGVhZk5vZGUoZ2V0U2libGluZ05vZGUobm9kZSkpO1xuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBvdXRlck5vZGVcbiAqIEByZXR1cm4gez9vYmplY3R9XG4gKi9cblxuZnVuY3Rpb24gZ2V0T2Zmc2V0cyhvdXRlck5vZGUpIHtcbiAgdmFyIG93bmVyRG9jdW1lbnQgPSBvdXRlck5vZGUub3duZXJEb2N1bWVudDtcbiAgdmFyIHdpbiA9IG93bmVyRG9jdW1lbnQgJiYgb3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCB3aW5kb3c7XG4gIHZhciBzZWxlY3Rpb24gPSB3aW4uZ2V0U2VsZWN0aW9uICYmIHdpbi5nZXRTZWxlY3Rpb24oKTtcblxuICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGFuY2hvck5vZGUgPSBzZWxlY3Rpb24uYW5jaG9yTm9kZSxcbiAgICAgIGFuY2hvck9mZnNldCA9IHNlbGVjdGlvbi5hbmNob3JPZmZzZXQsXG4gICAgICBmb2N1c05vZGUgPSBzZWxlY3Rpb24uZm9jdXNOb2RlLFxuICAgICAgZm9jdXNPZmZzZXQgPSBzZWxlY3Rpb24uZm9jdXNPZmZzZXQ7IC8vIEluIEZpcmVmb3gsIGFuY2hvck5vZGUgYW5kIGZvY3VzTm9kZSBjYW4gYmUgXCJhbm9ueW1vdXMgZGl2c1wiLCBlLmcuIHRoZVxuICAvLyB1cC9kb3duIGJ1dHRvbnMgb24gYW4gPGlucHV0IHR5cGU9XCJudW1iZXJcIj4uIEFub255bW91cyBkaXZzIGRvIG5vdCBzZWVtIHRvXG4gIC8vIGV4cG9zZSBwcm9wZXJ0aWVzLCB0cmlnZ2VyaW5nIGEgXCJQZXJtaXNzaW9uIGRlbmllZCBlcnJvclwiIGlmIGFueSBvZiBpdHNcbiAgLy8gcHJvcGVydGllcyBhcmUgYWNjZXNzZWQuIFRoZSBvbmx5IHNlZW1pbmdseSBwb3NzaWJsZSB3YXkgdG8gYXZvaWQgZXJyb3JpbmdcbiAgLy8gaXMgdG8gYWNjZXNzIGEgcHJvcGVydHkgdGhhdCB0eXBpY2FsbHkgd29ya3MgZm9yIG5vbi1hbm9ueW1vdXMgZGl2cyBhbmRcbiAgLy8gY2F0Y2ggYW55IGVycm9yIHRoYXQgbWF5IG90aGVyd2lzZSBhcmlzZS4gU2VlXG4gIC8vIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTIwODQyN1xuXG4gIHRyeSB7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLWV4cHJlc3Npb25zICovXG4gICAgYW5jaG9yTm9kZS5ub2RlVHlwZTtcbiAgICBmb2N1c05vZGUubm9kZVR5cGU7XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby11bnVzZWQtZXhwcmVzc2lvbnMgKi9cbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGdldE1vZGVybk9mZnNldHNGcm9tUG9pbnRzKG91dGVyTm9kZSwgYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0LCBmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KTtcbn1cbi8qKlxuICogUmV0dXJucyB7c3RhcnQsIGVuZH0gd2hlcmUgYHN0YXJ0YCBpcyB0aGUgY2hhcmFjdGVyL2NvZGVwb2ludCBpbmRleCBvZlxuICogKGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCkgd2l0aGluIHRoZSB0ZXh0Q29udGVudCBvZiBgb3V0ZXJOb2RlYCwgYW5kXG4gKiBgZW5kYCBpcyB0aGUgaW5kZXggb2YgKGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQpLlxuICpcbiAqIFJldHVybnMgbnVsbCBpZiB5b3UgcGFzcyBpbiBnYXJiYWdlIGlucHV0IGJ1dCB3ZSBzaG91bGQgcHJvYmFibHkganVzdCBjcmFzaC5cbiAqXG4gKiBFeHBvcnRlZCBvbmx5IGZvciB0ZXN0aW5nLlxuICovXG5cbmZ1bmN0aW9uIGdldE1vZGVybk9mZnNldHNGcm9tUG9pbnRzKG91dGVyTm9kZSwgYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0LCBmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KSB7XG4gIHZhciBsZW5ndGggPSAwO1xuICB2YXIgc3RhcnQgPSAtMTtcbiAgdmFyIGVuZCA9IC0xO1xuICB2YXIgaW5kZXhXaXRoaW5BbmNob3IgPSAwO1xuICB2YXIgaW5kZXhXaXRoaW5Gb2N1cyA9IDA7XG4gIHZhciBub2RlID0gb3V0ZXJOb2RlO1xuICB2YXIgcGFyZW50Tm9kZSA9IG51bGw7XG5cbiAgb3V0ZXI6IHdoaWxlICh0cnVlKSB7XG4gICAgdmFyIG5leHQgPSBudWxsO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChub2RlID09PSBhbmNob3JOb2RlICYmIChhbmNob3JPZmZzZXQgPT09IDAgfHwgbm9kZS5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSkge1xuICAgICAgICBzdGFydCA9IGxlbmd0aCArIGFuY2hvck9mZnNldDtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUgPT09IGZvY3VzTm9kZSAmJiAoZm9jdXNPZmZzZXQgPT09IDAgfHwgbm9kZS5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSkge1xuICAgICAgICBlbmQgPSBsZW5ndGggKyBmb2N1c09mZnNldDtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkge1xuICAgICAgICBsZW5ndGggKz0gbm9kZS5ub2RlVmFsdWUubGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICBpZiAoKG5leHQgPSBub2RlLmZpcnN0Q2hpbGQpID09PSBudWxsKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSAvLyBNb3ZpbmcgZnJvbSBgbm9kZWAgdG8gaXRzIGZpcnN0IGNoaWxkIGBuZXh0YC5cblxuXG4gICAgICBwYXJlbnROb2RlID0gbm9kZTtcbiAgICAgIG5vZGUgPSBuZXh0O1xuICAgIH1cblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAobm9kZSA9PT0gb3V0ZXJOb2RlKSB7XG4gICAgICAgIC8vIElmIGBvdXRlck5vZGVgIGhhcyBjaGlsZHJlbiwgdGhpcyBpcyBhbHdheXMgdGhlIHNlY29uZCB0aW1lIHZpc2l0aW5nXG4gICAgICAgIC8vIGl0LiBJZiBpdCBoYXMgbm8gY2hpbGRyZW4sIHRoaXMgaXMgc3RpbGwgdGhlIGZpcnN0IGxvb3AsIGFuZCB0aGUgb25seVxuICAgICAgICAvLyB2YWxpZCBzZWxlY3Rpb24gaXMgYW5jaG9yTm9kZSBhbmQgZm9jdXNOb2RlIGJvdGggZXF1YWwgdG8gdGhpcyBub2RlXG4gICAgICAgIC8vIGFuZCBib3RoIG9mZnNldHMgMCwgaW4gd2hpY2ggY2FzZSB3ZSB3aWxsIGhhdmUgaGFuZGxlZCBhYm92ZS5cbiAgICAgICAgYnJlYWsgb3V0ZXI7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJlbnROb2RlID09PSBhbmNob3JOb2RlICYmICsraW5kZXhXaXRoaW5BbmNob3IgPT09IGFuY2hvck9mZnNldCkge1xuICAgICAgICBzdGFydCA9IGxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmVudE5vZGUgPT09IGZvY3VzTm9kZSAmJiArK2luZGV4V2l0aGluRm9jdXMgPT09IGZvY3VzT2Zmc2V0KSB7XG4gICAgICAgIGVuZCA9IGxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgaWYgKChuZXh0ID0gbm9kZS5uZXh0U2libGluZykgIT09IG51bGwpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBwYXJlbnROb2RlO1xuICAgICAgcGFyZW50Tm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICB9IC8vIE1vdmluZyBmcm9tIGBub2RlYCB0byBpdHMgbmV4dCBzaWJsaW5nIGBuZXh0YC5cblxuXG4gICAgbm9kZSA9IG5leHQ7XG4gIH1cblxuICBpZiAoc3RhcnQgPT09IC0xIHx8IGVuZCA9PT0gLTEpIHtcbiAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uIChXb3VsZCBoYXBwZW4gaWYgdGhlIGFuY2hvci9mb2N1cyBub2RlcyBhcmVuJ3RcbiAgICAvLyBhY3R1YWxseSBpbnNpZGUgdGhlIHBhc3NlZC1pbiBub2RlLilcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IHN0YXJ0LFxuICAgIGVuZDogZW5kXG4gIH07XG59XG4vKipcbiAqIEluIG1vZGVybiBub24tSUUgYnJvd3NlcnMsIHdlIGNhbiBzdXBwb3J0IGJvdGggZm9yd2FyZCBhbmQgYmFja3dhcmRcbiAqIHNlbGVjdGlvbnMuXG4gKlxuICogTm90ZTogSUUxMCsgc3VwcG9ydHMgdGhlIFNlbGVjdGlvbiBvYmplY3QsIGJ1dCBpdCBkb2VzIG5vdCBzdXBwb3J0XG4gKiB0aGUgYGV4dGVuZGAgbWV0aG9kLCB3aGljaCBtZWFucyB0aGF0IGV2ZW4gaW4gbW9kZXJuIElFLCBpdCdzIG5vdCBwb3NzaWJsZVxuICogdG8gcHJvZ3JhbW1hdGljYWxseSBjcmVhdGUgYSBiYWNrd2FyZCBzZWxlY3Rpb24uIFRodXMsIGZvciBhbGwgSUVcbiAqIHZlcnNpb25zLCB3ZSB1c2UgdGhlIG9sZCBJRSBBUEkgdG8gY3JlYXRlIG91ciBzZWxlY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX0gbm9kZVxuICogQHBhcmFtIHtvYmplY3R9IG9mZnNldHNcbiAqL1xuXG5mdW5jdGlvbiBzZXRPZmZzZXRzKG5vZGUsIG9mZnNldHMpIHtcbiAgdmFyIGRvYyA9IG5vZGUub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudDtcbiAgdmFyIHdpbiA9IGRvYyAmJiBkb2MuZGVmYXVsdFZpZXcgfHwgd2luZG93OyAvLyBFZGdlIGZhaWxzIHdpdGggXCJPYmplY3QgZXhwZWN0ZWRcIiBpbiBzb21lIHNjZW5hcmlvcy5cbiAgLy8gKEZvciBpbnN0YW5jZTogVGlueU1DRSBlZGl0b3IgdXNlZCBpbiBhIGxpc3QgY29tcG9uZW50IHRoYXQgc3VwcG9ydHMgcGFzdGluZyB0byBhZGQgbW9yZSxcbiAgLy8gZmFpbHMgd2hlbiBwYXN0aW5nIDEwMCsgaXRlbXMpXG5cbiAgaWYgKCF3aW4uZ2V0U2VsZWN0aW9uKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHNlbGVjdGlvbiA9IHdpbi5nZXRTZWxlY3Rpb24oKTtcbiAgdmFyIGxlbmd0aCA9IG5vZGUudGV4dENvbnRlbnQubGVuZ3RoO1xuICB2YXIgc3RhcnQgPSBNYXRoLm1pbihvZmZzZXRzLnN0YXJ0LCBsZW5ndGgpO1xuICB2YXIgZW5kID0gb2Zmc2V0cy5lbmQgPT09IHVuZGVmaW5lZCA/IHN0YXJ0IDogTWF0aC5taW4ob2Zmc2V0cy5lbmQsIGxlbmd0aCk7IC8vIElFIDExIHVzZXMgbW9kZXJuIHNlbGVjdGlvbiwgYnV0IGRvZXNuJ3Qgc3VwcG9ydCB0aGUgZXh0ZW5kIG1ldGhvZC5cbiAgLy8gRmxpcCBiYWNrd2FyZCBzZWxlY3Rpb25zLCBzbyB3ZSBjYW4gc2V0IHdpdGggYSBzaW5nbGUgcmFuZ2UuXG5cbiAgaWYgKCFzZWxlY3Rpb24uZXh0ZW5kICYmIHN0YXJ0ID4gZW5kKSB7XG4gICAgdmFyIHRlbXAgPSBlbmQ7XG4gICAgZW5kID0gc3RhcnQ7XG4gICAgc3RhcnQgPSB0ZW1wO1xuICB9XG5cbiAgdmFyIHN0YXJ0TWFya2VyID0gZ2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldChub2RlLCBzdGFydCk7XG4gIHZhciBlbmRNYXJrZXIgPSBnZXROb2RlRm9yQ2hhcmFjdGVyT2Zmc2V0KG5vZGUsIGVuZCk7XG5cbiAgaWYgKHN0YXJ0TWFya2VyICYmIGVuZE1hcmtlcikge1xuICAgIGlmIChzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMSAmJiBzZWxlY3Rpb24uYW5jaG9yTm9kZSA9PT0gc3RhcnRNYXJrZXIubm9kZSAmJiBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0ID09PSBzdGFydE1hcmtlci5vZmZzZXQgJiYgc2VsZWN0aW9uLmZvY3VzTm9kZSA9PT0gZW5kTWFya2VyLm5vZGUgJiYgc2VsZWN0aW9uLmZvY3VzT2Zmc2V0ID09PSBlbmRNYXJrZXIub2Zmc2V0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHJhbmdlID0gZG9jLmNyZWF0ZVJhbmdlKCk7XG4gICAgcmFuZ2Uuc2V0U3RhcnQoc3RhcnRNYXJrZXIubm9kZSwgc3RhcnRNYXJrZXIub2Zmc2V0KTtcbiAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG5cbiAgICBpZiAoc3RhcnQgPiBlbmQpIHtcbiAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgICBzZWxlY3Rpb24uZXh0ZW5kKGVuZE1hcmtlci5ub2RlLCBlbmRNYXJrZXIub2Zmc2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmFuZ2Uuc2V0RW5kKGVuZE1hcmtlci5ub2RlLCBlbmRNYXJrZXIub2Zmc2V0KTtcbiAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzVGV4dE5vZGUobm9kZSkge1xuICByZXR1cm4gbm9kZSAmJiBub2RlLm5vZGVUeXBlID09PSBURVhUX05PREU7XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zTm9kZShvdXRlck5vZGUsIGlubmVyTm9kZSkge1xuICBpZiAoIW91dGVyTm9kZSB8fCAhaW5uZXJOb2RlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2UgaWYgKG91dGVyTm9kZSA9PT0gaW5uZXJOb2RlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAoaXNUZXh0Tm9kZShvdXRlck5vZGUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2UgaWYgKGlzVGV4dE5vZGUoaW5uZXJOb2RlKSkge1xuICAgIHJldHVybiBjb250YWluc05vZGUob3V0ZXJOb2RlLCBpbm5lck5vZGUucGFyZW50Tm9kZSk7XG4gIH0gZWxzZSBpZiAoJ2NvbnRhaW5zJyBpbiBvdXRlck5vZGUpIHtcbiAgICByZXR1cm4gb3V0ZXJOb2RlLmNvbnRhaW5zKGlubmVyTm9kZSk7XG4gIH0gZWxzZSBpZiAob3V0ZXJOb2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSB7XG4gICAgcmV0dXJuICEhKG91dGVyTm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihpbm5lck5vZGUpICYgMTYpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0luRG9jdW1lbnQobm9kZSkge1xuICByZXR1cm4gbm9kZSAmJiBub2RlLm93bmVyRG9jdW1lbnQgJiYgY29udGFpbnNOb2RlKG5vZGUub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIG5vZGUpO1xufVxuXG5mdW5jdGlvbiBpc1NhbWVPcmlnaW5GcmFtZShpZnJhbWUpIHtcbiAgdHJ5IHtcbiAgICAvLyBBY2Nlc3NpbmcgdGhlIGNvbnRlbnREb2N1bWVudCBvZiBhIEhUTUxJZnJhbWVFbGVtZW50IGNhbiBjYXVzZSB0aGUgYnJvd3NlclxuICAgIC8vIHRvIHRocm93LCBlLmcuIGlmIGl0IGhhcyBhIGNyb3NzLW9yaWdpbiBzcmMgYXR0cmlidXRlLlxuICAgIC8vIFNhZmFyaSB3aWxsIHNob3cgYW4gZXJyb3IgaW4gdGhlIGNvbnNvbGUgd2hlbiB0aGUgYWNjZXNzIHJlc3VsdHMgaW4gXCJCbG9ja2VkIGEgZnJhbWUgd2l0aCBvcmlnaW5cIi4gZS5nOlxuICAgIC8vIGlmcmFtZS5jb250ZW50RG9jdW1lbnQuZGVmYXVsdFZpZXc7XG4gICAgLy8gQSBzYWZldHkgd2F5IGlzIHRvIGFjY2VzcyBvbmUgb2YgdGhlIGNyb3NzIG9yaWdpbiBwcm9wZXJ0aWVzOiBXaW5kb3cgb3IgTG9jYXRpb25cbiAgICAvLyBXaGljaCBtaWdodCByZXN1bHQgaW4gXCJTZWN1cml0eUVycm9yXCIgRE9NIEV4Y2VwdGlvbiBhbmQgaXQgaXMgY29tcGF0aWJsZSB0byBTYWZhcmkuXG4gICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvYnJvd3NlcnMuaHRtbCNpbnRlZ3JhdGlvbi13aXRoLWlkbFxuICAgIHJldHVybiB0eXBlb2YgaWZyYW1lLmNvbnRlbnRXaW5kb3cubG9jYXRpb24uaHJlZiA9PT0gJ3N0cmluZyc7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRBY3RpdmVFbGVtZW50RGVlcCgpIHtcbiAgdmFyIHdpbiA9IHdpbmRvdztcbiAgdmFyIGVsZW1lbnQgPSBnZXRBY3RpdmVFbGVtZW50KCk7XG5cbiAgd2hpbGUgKGVsZW1lbnQgaW5zdGFuY2VvZiB3aW4uSFRNTElGcmFtZUVsZW1lbnQpIHtcbiAgICBpZiAoaXNTYW1lT3JpZ2luRnJhbWUoZWxlbWVudCkpIHtcbiAgICAgIHdpbiA9IGVsZW1lbnQuY29udGVudFdpbmRvdztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgZWxlbWVudCA9IGdldEFjdGl2ZUVsZW1lbnQod2luLmRvY3VtZW50KTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufVxuLyoqXG4gKiBAUmVhY3RJbnB1dFNlbGVjdGlvbjogUmVhY3QgaW5wdXQgc2VsZWN0aW9uIG1vZHVsZS4gQmFzZWQgb24gU2VsZWN0aW9uLmpzLFxuICogYnV0IG1vZGlmaWVkIHRvIGJlIHN1aXRhYmxlIGZvciByZWFjdCBhbmQgaGFzIGEgY291cGxlIG9mIGJ1ZyBmaXhlcyAoZG9lc24ndFxuICogYXNzdW1lIGJ1dHRvbnMgaGF2ZSByYW5nZSBzZWxlY3Rpb25zIGFsbG93ZWQpLlxuICogSW5wdXQgc2VsZWN0aW9uIG1vZHVsZSBmb3IgUmVhY3QuXG4gKi9cblxuLyoqXG4gKiBAaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzOiB3ZSBnZXQgdGhlIGVsZW1lbnQgdHlwZXMgdGhhdCBzdXBwb3J0IHNlbGVjdGlvblxuICogZnJvbSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNkby1ub3QtYXBwbHksIGxvb2tpbmcgYXQgYHNlbGVjdGlvblN0YXJ0YFxuICogYW5kIGBzZWxlY3Rpb25FbmRgIHJvd3MuXG4gKi9cblxuXG5mdW5jdGlvbiBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMoZWxlbSkge1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtICYmIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gbm9kZU5hbWUgJiYgKG5vZGVOYW1lID09PSAnaW5wdXQnICYmIChlbGVtLnR5cGUgPT09ICd0ZXh0JyB8fCBlbGVtLnR5cGUgPT09ICdzZWFyY2gnIHx8IGVsZW0udHlwZSA9PT0gJ3RlbCcgfHwgZWxlbS50eXBlID09PSAndXJsJyB8fCBlbGVtLnR5cGUgPT09ICdwYXNzd29yZCcpIHx8IG5vZGVOYW1lID09PSAndGV4dGFyZWEnIHx8IGVsZW0uY29udGVudEVkaXRhYmxlID09PSAndHJ1ZScpO1xufVxuZnVuY3Rpb24gZ2V0U2VsZWN0aW9uSW5mb3JtYXRpb24oKSB7XG4gIHZhciBmb2N1c2VkRWxlbSA9IGdldEFjdGl2ZUVsZW1lbnREZWVwKCk7XG4gIHJldHVybiB7XG4gICAgZm9jdXNlZEVsZW06IGZvY3VzZWRFbGVtLFxuICAgIHNlbGVjdGlvblJhbmdlOiBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMoZm9jdXNlZEVsZW0pID8gZ2V0U2VsZWN0aW9uKGZvY3VzZWRFbGVtKSA6IG51bGxcbiAgfTtcbn1cbi8qKlxuICogQHJlc3RvcmVTZWxlY3Rpb246IElmIGFueSBzZWxlY3Rpb24gaW5mb3JtYXRpb24gd2FzIHBvdGVudGlhbGx5IGxvc3QsXG4gKiByZXN0b3JlIGl0LiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHBlcmZvcm1pbmcgb3BlcmF0aW9ucyB0aGF0IGNvdWxkIHJlbW92ZSBkb21cbiAqIG5vZGVzIGFuZCBwbGFjZSB0aGVtIGJhY2sgaW4sIHJlc3VsdGluZyBpbiBmb2N1cyBiZWluZyBsb3N0LlxuICovXG5cbmZ1bmN0aW9uIHJlc3RvcmVTZWxlY3Rpb24ocHJpb3JTZWxlY3Rpb25JbmZvcm1hdGlvbikge1xuICB2YXIgY3VyRm9jdXNlZEVsZW0gPSBnZXRBY3RpdmVFbGVtZW50RGVlcCgpO1xuICB2YXIgcHJpb3JGb2N1c2VkRWxlbSA9IHByaW9yU2VsZWN0aW9uSW5mb3JtYXRpb24uZm9jdXNlZEVsZW07XG4gIHZhciBwcmlvclNlbGVjdGlvblJhbmdlID0gcHJpb3JTZWxlY3Rpb25JbmZvcm1hdGlvbi5zZWxlY3Rpb25SYW5nZTtcblxuICBpZiAoY3VyRm9jdXNlZEVsZW0gIT09IHByaW9yRm9jdXNlZEVsZW0gJiYgaXNJbkRvY3VtZW50KHByaW9yRm9jdXNlZEVsZW0pKSB7XG4gICAgaWYgKHByaW9yU2VsZWN0aW9uUmFuZ2UgIT09IG51bGwgJiYgaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKHByaW9yRm9jdXNlZEVsZW0pKSB7XG4gICAgICBzZXRTZWxlY3Rpb24ocHJpb3JGb2N1c2VkRWxlbSwgcHJpb3JTZWxlY3Rpb25SYW5nZSk7XG4gICAgfSAvLyBGb2N1c2luZyBhIG5vZGUgY2FuIGNoYW5nZSB0aGUgc2Nyb2xsIHBvc2l0aW9uLCB3aGljaCBpcyB1bmRlc2lyYWJsZVxuXG5cbiAgICB2YXIgYW5jZXN0b3JzID0gW107XG4gICAgdmFyIGFuY2VzdG9yID0gcHJpb3JGb2N1c2VkRWxlbTtcblxuICAgIHdoaWxlIChhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudE5vZGUpIHtcbiAgICAgIGlmIChhbmNlc3Rvci5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIGFuY2VzdG9ycy5wdXNoKHtcbiAgICAgICAgICBlbGVtZW50OiBhbmNlc3RvcixcbiAgICAgICAgICBsZWZ0OiBhbmNlc3Rvci5zY3JvbGxMZWZ0LFxuICAgICAgICAgIHRvcDogYW5jZXN0b3Iuc2Nyb2xsVG9wXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcHJpb3JGb2N1c2VkRWxlbS5mb2N1cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcHJpb3JGb2N1c2VkRWxlbS5mb2N1cygpO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYW5jZXN0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaW5mbyA9IGFuY2VzdG9yc1tpXTtcbiAgICAgIGluZm8uZWxlbWVudC5zY3JvbGxMZWZ0ID0gaW5mby5sZWZ0O1xuICAgICAgaW5mby5lbGVtZW50LnNjcm9sbFRvcCA9IGluZm8udG9wO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBAZ2V0U2VsZWN0aW9uOiBHZXRzIHRoZSBzZWxlY3Rpb24gYm91bmRzIG9mIGEgZm9jdXNlZCB0ZXh0YXJlYSwgaW5wdXQgb3JcbiAqIGNvbnRlbnRFZGl0YWJsZSBub2RlLlxuICogLUBpbnB1dDogTG9vayB1cCBzZWxlY3Rpb24gYm91bmRzIG9mIHRoaXMgaW5wdXRcbiAqIC1AcmV0dXJuIHtzdGFydDogc2VsZWN0aW9uU3RhcnQsIGVuZDogc2VsZWN0aW9uRW5kfVxuICovXG5cbmZ1bmN0aW9uIGdldFNlbGVjdGlvbihpbnB1dCkge1xuICB2YXIgc2VsZWN0aW9uO1xuXG4gIGlmICgnc2VsZWN0aW9uU3RhcnQnIGluIGlucHV0KSB7XG4gICAgLy8gTW9kZXJuIGJyb3dzZXIgd2l0aCBpbnB1dCBvciB0ZXh0YXJlYS5cbiAgICBzZWxlY3Rpb24gPSB7XG4gICAgICBzdGFydDogaW5wdXQuc2VsZWN0aW9uU3RhcnQsXG4gICAgICBlbmQ6IGlucHV0LnNlbGVjdGlvbkVuZFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgLy8gQ29udGVudCBlZGl0YWJsZSBvciBvbGQgSUUgdGV4dGFyZWEuXG4gICAgc2VsZWN0aW9uID0gZ2V0T2Zmc2V0cyhpbnB1dCk7XG4gIH1cblxuICByZXR1cm4gc2VsZWN0aW9uIHx8IHtcbiAgICBzdGFydDogMCxcbiAgICBlbmQ6IDBcbiAgfTtcbn1cbi8qKlxuICogQHNldFNlbGVjdGlvbjogU2V0cyB0aGUgc2VsZWN0aW9uIGJvdW5kcyBvZiBhIHRleHRhcmVhIG9yIGlucHV0IGFuZCBmb2N1c2VzXG4gKiB0aGUgaW5wdXQuXG4gKiAtQGlucHV0ICAgICBTZXQgc2VsZWN0aW9uIGJvdW5kcyBvZiB0aGlzIGlucHV0IG9yIHRleHRhcmVhXG4gKiAtQG9mZnNldHMgICBPYmplY3Qgb2Ygc2FtZSBmb3JtIHRoYXQgaXMgcmV0dXJuZWQgZnJvbSBnZXQqXG4gKi9cblxuZnVuY3Rpb24gc2V0U2VsZWN0aW9uKGlucHV0LCBvZmZzZXRzKSB7XG4gIHZhciBzdGFydCA9IG9mZnNldHMuc3RhcnQ7XG4gIHZhciBlbmQgPSBvZmZzZXRzLmVuZDtcblxuICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmQgPSBzdGFydDtcbiAgfVxuXG4gIGlmICgnc2VsZWN0aW9uU3RhcnQnIGluIGlucHV0KSB7XG4gICAgaW5wdXQuc2VsZWN0aW9uU3RhcnQgPSBzdGFydDtcbiAgICBpbnB1dC5zZWxlY3Rpb25FbmQgPSBNYXRoLm1pbihlbmQsIGlucHV0LnZhbHVlLmxlbmd0aCk7XG4gIH0gZWxzZSB7XG4gICAgc2V0T2Zmc2V0cyhpbnB1dCwgb2Zmc2V0cyk7XG4gIH1cbn1cblxudmFyIHNraXBTZWxlY3Rpb25DaGFuZ2VFdmVudCA9IGNhblVzZURPTSAmJiAnZG9jdW1lbnRNb2RlJyBpbiBkb2N1bWVudCAmJiBkb2N1bWVudC5kb2N1bWVudE1vZGUgPD0gMTE7XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyRXZlbnRzJDMoKSB7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25TZWxlY3QnLCBbJ2ZvY3Vzb3V0JywgJ2NvbnRleHRtZW51JywgJ2RyYWdlbmQnLCAnZm9jdXNpbicsICdrZXlkb3duJywgJ2tleXVwJywgJ21vdXNlZG93bicsICdtb3VzZXVwJywgJ3NlbGVjdGlvbmNoYW5nZSddKTtcbn1cblxudmFyIGFjdGl2ZUVsZW1lbnQkMSA9IG51bGw7XG52YXIgYWN0aXZlRWxlbWVudEluc3QkMSA9IG51bGw7XG52YXIgbGFzdFNlbGVjdGlvbiA9IG51bGw7XG52YXIgbW91c2VEb3duID0gZmFsc2U7XG4vKipcbiAqIEdldCBhbiBvYmplY3Qgd2hpY2ggaXMgYSB1bmlxdWUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLlxuICpcbiAqIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBub3QgYmUgY29uc2lzdGVudCBhY3Jvc3Mgbm9kZXMgb3IgYnJvd3NlcnMsIGJ1dFxuICogdHdvIGlkZW50aWNhbCBzZWxlY3Rpb25zIG9uIHRoZSBzYW1lIG5vZGUgd2lsbCByZXR1cm4gaWRlbnRpY2FsIG9iamVjdHMuXG4gKi9cblxuZnVuY3Rpb24gZ2V0U2VsZWN0aW9uJDEobm9kZSkge1xuICBpZiAoJ3NlbGVjdGlvblN0YXJ0JyBpbiBub2RlICYmIGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhub2RlKSkge1xuICAgIHJldHVybiB7XG4gICAgICBzdGFydDogbm9kZS5zZWxlY3Rpb25TdGFydCxcbiAgICAgIGVuZDogbm9kZS5zZWxlY3Rpb25FbmRcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHZhciB3aW4gPSBub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHdpbmRvdztcbiAgICB2YXIgc2VsZWN0aW9uID0gd2luLmdldFNlbGVjdGlvbigpO1xuICAgIHJldHVybiB7XG4gICAgICBhbmNob3JOb2RlOiBzZWxlY3Rpb24uYW5jaG9yTm9kZSxcbiAgICAgIGFuY2hvck9mZnNldDogc2VsZWN0aW9uLmFuY2hvck9mZnNldCxcbiAgICAgIGZvY3VzTm9kZTogc2VsZWN0aW9uLmZvY3VzTm9kZSxcbiAgICAgIGZvY3VzT2Zmc2V0OiBzZWxlY3Rpb24uZm9jdXNPZmZzZXRcbiAgICB9O1xuICB9XG59XG4vKipcbiAqIEdldCBkb2N1bWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGV2ZW50IHRhcmdldC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEV2ZW50VGFyZ2V0RG9jdW1lbnQoZXZlbnRUYXJnZXQpIHtcbiAgcmV0dXJuIGV2ZW50VGFyZ2V0LndpbmRvdyA9PT0gZXZlbnRUYXJnZXQgPyBldmVudFRhcmdldC5kb2N1bWVudCA6IGV2ZW50VGFyZ2V0Lm5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFID8gZXZlbnRUYXJnZXQgOiBldmVudFRhcmdldC5vd25lckRvY3VtZW50O1xufVxuLyoqXG4gKiBQb2xsIHNlbGVjdGlvbiB0byBzZWUgd2hldGhlciBpdCdzIGNoYW5nZWQuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50XG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnRUYXJnZXRcbiAqIEByZXR1cm4gez9TeW50aGV0aWNFdmVudH1cbiAqL1xuXG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFNlbGVjdEV2ZW50KGRpc3BhdGNoUXVldWUsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICAvLyBFbnN1cmUgd2UgaGF2ZSB0aGUgcmlnaHQgZWxlbWVudCwgYW5kIHRoYXQgdGhlIHVzZXIgaXMgbm90IGRyYWdnaW5nIGFcbiAgLy8gc2VsZWN0aW9uICh0aGlzIG1hdGNoZXMgbmF0aXZlIGBzZWxlY3RgIGV2ZW50IGJlaGF2aW9yKS4gSW4gSFRNTDUsIHNlbGVjdFxuICAvLyBmaXJlcyBvbmx5IG9uIGlucHV0IGFuZCB0ZXh0YXJlYSB0aHVzIGlmIHRoZXJlJ3Mgbm8gZm9jdXNlZCBlbGVtZW50IHdlXG4gIC8vIHdvbid0IGRpc3BhdGNoLlxuICB2YXIgZG9jID0gZ2V0RXZlbnRUYXJnZXREb2N1bWVudChuYXRpdmVFdmVudFRhcmdldCk7XG5cbiAgaWYgKG1vdXNlRG93biB8fCBhY3RpdmVFbGVtZW50JDEgPT0gbnVsbCB8fCBhY3RpdmVFbGVtZW50JDEgIT09IGdldEFjdGl2ZUVsZW1lbnQoZG9jKSkge1xuICAgIHJldHVybjtcbiAgfSAvLyBPbmx5IGZpcmUgd2hlbiBzZWxlY3Rpb24gaGFzIGFjdHVhbGx5IGNoYW5nZWQuXG5cblxuICB2YXIgY3VycmVudFNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbiQxKGFjdGl2ZUVsZW1lbnQkMSk7XG5cbiAgaWYgKCFsYXN0U2VsZWN0aW9uIHx8ICFzaGFsbG93RXF1YWwobGFzdFNlbGVjdGlvbiwgY3VycmVudFNlbGVjdGlvbikpIHtcbiAgICBsYXN0U2VsZWN0aW9uID0gY3VycmVudFNlbGVjdGlvbjtcbiAgICB2YXIgbGlzdGVuZXJzID0gYWNjdW11bGF0ZVR3b1BoYXNlTGlzdGVuZXJzKGFjdGl2ZUVsZW1lbnRJbnN0JDEsICdvblNlbGVjdCcpO1xuXG4gICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgZXZlbnQgPSBuZXcgU3ludGhldGljRXZlbnQoJ29uU2VsZWN0JywgJ3NlbGVjdCcsIG51bGwsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgICBkaXNwYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgICBldmVudDogZXZlbnQsXG4gICAgICAgIGxpc3RlbmVyczogbGlzdGVuZXJzXG4gICAgICB9KTtcbiAgICAgIGV2ZW50LnRhcmdldCA9IGFjdGl2ZUVsZW1lbnQkMTtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogVGhpcyBwbHVnaW4gY3JlYXRlcyBhbiBgb25TZWxlY3RgIGV2ZW50IHRoYXQgbm9ybWFsaXplcyBzZWxlY3QgZXZlbnRzXG4gKiBhY3Jvc3MgZm9ybSBlbGVtZW50cy5cbiAqXG4gKiBTdXBwb3J0ZWQgZWxlbWVudHMgYXJlOlxuICogLSBpbnB1dCAoc2VlIGBpc1RleHRJbnB1dEVsZW1lbnRgKVxuICogLSB0ZXh0YXJlYVxuICogLSBjb250ZW50RWRpdGFibGVcbiAqXG4gKiBUaGlzIGRpZmZlcnMgZnJvbSBuYXRpdmUgYnJvd3NlciBpbXBsZW1lbnRhdGlvbnMgaW4gdGhlIGZvbGxvd2luZyB3YXlzOlxuICogLSBGaXJlcyBvbiBjb250ZW50RWRpdGFibGUgZmllbGRzIGFzIHdlbGwgYXMgaW5wdXRzLlxuICogLSBGaXJlcyBmb3IgY29sbGFwc2VkIHNlbGVjdGlvbi5cbiAqIC0gRmlyZXMgYWZ0ZXIgdXNlciBpbnB1dC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGV4dHJhY3RFdmVudHMkMyhkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIHZhciB0YXJnZXROb2RlID0gdGFyZ2V0SW5zdCA/IGdldE5vZGVGcm9tSW5zdGFuY2UodGFyZ2V0SW5zdCkgOiB3aW5kb3c7XG5cbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICAvLyBUcmFjayB0aGUgaW5wdXQgbm9kZSB0aGF0IGhhcyBmb2N1cy5cbiAgICBjYXNlICdmb2N1c2luJzpcbiAgICAgIGlmIChpc1RleHRJbnB1dEVsZW1lbnQodGFyZ2V0Tm9kZSkgfHwgdGFyZ2V0Tm9kZS5jb250ZW50RWRpdGFibGUgPT09ICd0cnVlJykge1xuICAgICAgICBhY3RpdmVFbGVtZW50JDEgPSB0YXJnZXROb2RlO1xuICAgICAgICBhY3RpdmVFbGVtZW50SW5zdCQxID0gdGFyZ2V0SW5zdDtcbiAgICAgICAgbGFzdFNlbGVjdGlvbiA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZm9jdXNvdXQnOlxuICAgICAgYWN0aXZlRWxlbWVudCQxID0gbnVsbDtcbiAgICAgIGFjdGl2ZUVsZW1lbnRJbnN0JDEgPSBudWxsO1xuICAgICAgbGFzdFNlbGVjdGlvbiA9IG51bGw7XG4gICAgICBicmVhaztcbiAgICAvLyBEb24ndCBmaXJlIHRoZSBldmVudCB3aGlsZSB0aGUgdXNlciBpcyBkcmFnZ2luZy4gVGhpcyBtYXRjaGVzIHRoZVxuICAgIC8vIHNlbWFudGljcyBvZiB0aGUgbmF0aXZlIHNlbGVjdCBldmVudC5cblxuICAgIGNhc2UgJ21vdXNlZG93bic6XG4gICAgICBtb3VzZURvd24gPSB0cnVlO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdjb250ZXh0bWVudSc6XG4gICAgY2FzZSAnbW91c2V1cCc6XG4gICAgY2FzZSAnZHJhZ2VuZCc6XG4gICAgICBtb3VzZURvd24gPSBmYWxzZTtcbiAgICAgIGNvbnN0cnVjdFNlbGVjdEV2ZW50KGRpc3BhdGNoUXVldWUsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgICBicmVhaztcbiAgICAvLyBDaHJvbWUgYW5kIElFIGZpcmUgbm9uLXN0YW5kYXJkIGV2ZW50IHdoZW4gc2VsZWN0aW9uIGlzIGNoYW5nZWQgKGFuZFxuICAgIC8vIHNvbWV0aW1lcyB3aGVuIGl0IGhhc24ndCkuIElFJ3MgZXZlbnQgZmlyZXMgb3V0IG9mIG9yZGVyIHdpdGggcmVzcGVjdFxuICAgIC8vIHRvIGtleSBhbmQgaW5wdXQgZXZlbnRzIG9uIGRlbGV0aW9uLCBzbyB3ZSBkaXNjYXJkIGl0LlxuICAgIC8vXG4gICAgLy8gRmlyZWZveCBkb2Vzbid0IHN1cHBvcnQgc2VsZWN0aW9uY2hhbmdlLCBzbyBjaGVjayBzZWxlY3Rpb24gc3RhdHVzXG4gICAgLy8gYWZ0ZXIgZWFjaCBrZXkgZW50cnkuIFRoZSBzZWxlY3Rpb24gY2hhbmdlcyBhZnRlciBrZXlkb3duIGFuZCBiZWZvcmVcbiAgICAvLyBrZXl1cCwgYnV0IHdlIGNoZWNrIG9uIGtleWRvd24gYXMgd2VsbCBpbiB0aGUgY2FzZSBvZiBob2xkaW5nIGRvd24gYVxuICAgIC8vIGtleSwgd2hlbiBtdWx0aXBsZSBrZXlkb3duIGV2ZW50cyBhcmUgZmlyZWQgYnV0IG9ubHkgb25lIGtleXVwIGlzLlxuICAgIC8vIFRoaXMgaXMgYWxzbyBvdXIgYXBwcm9hY2ggZm9yIElFIGhhbmRsaW5nLCBmb3IgdGhlIHJlYXNvbiBhYm92ZS5cblxuICAgIGNhc2UgJ3NlbGVjdGlvbmNoYW5nZSc6XG4gICAgICBpZiAoc2tpcFNlbGVjdGlvbkNoYW5nZUV2ZW50KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgLy8gZmFsbHMgdGhyb3VnaFxuXG4gICAgY2FzZSAna2V5ZG93bic6XG4gICAgY2FzZSAna2V5dXAnOlxuICAgICAgY29uc3RydWN0U2VsZWN0RXZlbnQoZGlzcGF0Y2hRdWV1ZSwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgfVxufVxuXG4vKipcbiAqIEdlbmVyYXRlIGEgbWFwcGluZyBvZiBzdGFuZGFyZCB2ZW5kb3IgcHJlZml4ZXMgdXNpbmcgdGhlIGRlZmluZWQgc3R5bGUgcHJvcGVydHkgYW5kIGV2ZW50IG5hbWUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0eWxlUHJvcFxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuXG5mdW5jdGlvbiBtYWtlUHJlZml4TWFwKHN0eWxlUHJvcCwgZXZlbnROYW1lKSB7XG4gIHZhciBwcmVmaXhlcyA9IHt9O1xuICBwcmVmaXhlc1tzdHlsZVByb3AudG9Mb3dlckNhc2UoKV0gPSBldmVudE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcHJlZml4ZXNbJ1dlYmtpdCcgKyBzdHlsZVByb3BdID0gJ3dlYmtpdCcgKyBldmVudE5hbWU7XG4gIHByZWZpeGVzWydNb3onICsgc3R5bGVQcm9wXSA9ICdtb3onICsgZXZlbnROYW1lO1xuICByZXR1cm4gcHJlZml4ZXM7XG59XG4vKipcbiAqIEEgbGlzdCBvZiBldmVudCBuYW1lcyB0byBhIGNvbmZpZ3VyYWJsZSBsaXN0IG9mIHZlbmRvciBwcmVmaXhlcy5cbiAqL1xuXG5cbnZhciB2ZW5kb3JQcmVmaXhlcyA9IHtcbiAgYW5pbWF0aW9uZW5kOiBtYWtlUHJlZml4TWFwKCdBbmltYXRpb24nLCAnQW5pbWF0aW9uRW5kJyksXG4gIGFuaW1hdGlvbml0ZXJhdGlvbjogbWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvbkl0ZXJhdGlvbicpLFxuICBhbmltYXRpb25zdGFydDogbWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvblN0YXJ0JyksXG4gIHRyYW5zaXRpb25lbmQ6IG1ha2VQcmVmaXhNYXAoJ1RyYW5zaXRpb24nLCAnVHJhbnNpdGlvbkVuZCcpXG59O1xuLyoqXG4gKiBFdmVudCBuYW1lcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGRldGVjdGVkIGFuZCBwcmVmaXhlZCAoaWYgYXBwbGljYWJsZSkuXG4gKi9cblxudmFyIHByZWZpeGVkRXZlbnROYW1lcyA9IHt9O1xuLyoqXG4gKiBFbGVtZW50IHRvIGNoZWNrIGZvciBwcmVmaXhlcyBvbi5cbiAqL1xuXG52YXIgc3R5bGUgPSB7fTtcbi8qKlxuICogQm9vdHN0cmFwIGlmIGEgRE9NIGV4aXN0cy5cbiAqL1xuXG5pZiAoY2FuVXNlRE9NKSB7XG4gIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jykuc3R5bGU7IC8vIE9uIHNvbWUgcGxhdGZvcm1zLCBpbiBwYXJ0aWN1bGFyIHNvbWUgcmVsZWFzZXMgb2YgQW5kcm9pZCA0LngsXG4gIC8vIHRoZSB1bi1wcmVmaXhlZCBcImFuaW1hdGlvblwiIGFuZCBcInRyYW5zaXRpb25cIiBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIG9uIHRoZVxuICAvLyBzdHlsZSBvYmplY3QgYnV0IHRoZSBldmVudHMgdGhhdCBmaXJlIHdpbGwgc3RpbGwgYmUgcHJlZml4ZWQsIHNvIHdlIG5lZWRcbiAgLy8gdG8gY2hlY2sgaWYgdGhlIHVuLXByZWZpeGVkIGV2ZW50cyBhcmUgdXNhYmxlLCBhbmQgaWYgbm90IHJlbW92ZSB0aGVtIGZyb20gdGhlIG1hcC5cblxuICBpZiAoISgnQW5pbWF0aW9uRXZlbnQnIGluIHdpbmRvdykpIHtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uZW5kLmFuaW1hdGlvbjtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uaXRlcmF0aW9uLmFuaW1hdGlvbjtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uc3RhcnQuYW5pbWF0aW9uO1xuICB9IC8vIFNhbWUgYXMgYWJvdmVcblxuXG4gIGlmICghKCdUcmFuc2l0aW9uRXZlbnQnIGluIHdpbmRvdykpIHtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMudHJhbnNpdGlvbmVuZC50cmFuc2l0aW9uO1xuICB9XG59XG4vKipcbiAqIEF0dGVtcHRzIHRvIGRldGVybWluZSB0aGUgY29ycmVjdCB2ZW5kb3IgcHJlZml4ZWQgZXZlbnQgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5cblxuZnVuY3Rpb24gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoZXZlbnROYW1lKSB7XG4gIGlmIChwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXSkge1xuICAgIHJldHVybiBwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXTtcbiAgfSBlbHNlIGlmICghdmVuZG9yUHJlZml4ZXNbZXZlbnROYW1lXSkge1xuICAgIHJldHVybiBldmVudE5hbWU7XG4gIH1cblxuICB2YXIgcHJlZml4TWFwID0gdmVuZG9yUHJlZml4ZXNbZXZlbnROYW1lXTtcblxuICBmb3IgKHZhciBzdHlsZVByb3AgaW4gcHJlZml4TWFwKSB7XG4gICAgaWYgKHByZWZpeE1hcC5oYXNPd25Qcm9wZXJ0eShzdHlsZVByb3ApICYmIHN0eWxlUHJvcCBpbiBzdHlsZSkge1xuICAgICAgcmV0dXJuIHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdID0gcHJlZml4TWFwW3N0eWxlUHJvcF07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV2ZW50TmFtZTtcbn1cblxudmFyIEFOSU1BVElPTl9FTkQgPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgnYW5pbWF0aW9uZW5kJyk7XG52YXIgQU5JTUFUSU9OX0lURVJBVElPTiA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCdhbmltYXRpb25pdGVyYXRpb24nKTtcbnZhciBBTklNQVRJT05fU1RBUlQgPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgnYW5pbWF0aW9uc3RhcnQnKTtcbnZhciBUUkFOU0lUSU9OX0VORCA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCd0cmFuc2l0aW9uZW5kJyk7XG5cbnZhciB0b3BMZXZlbEV2ZW50c1RvUmVhY3ROYW1lcyA9IG5ldyBNYXAoKTsgLy8gTk9URTogQ2FwaXRhbGl6YXRpb24gaXMgaW1wb3J0YW50IGluIHRoaXMgbGlzdCFcbi8vXG4vLyBFLmcuIGl0IG5lZWRzIFwicG9pbnRlckRvd25cIiwgbm90IFwicG9pbnRlcmRvd25cIi5cbi8vIFRoaXMgaXMgYmVjYXVzZSB3ZSBkZXJpdmUgYm90aCBSZWFjdCBuYW1lIChcIm9uUG9pbnRlckRvd25cIilcbi8vIGFuZCBET00gbmFtZSAoXCJwb2ludGVyZG93blwiKSBmcm9tIHRoZSBzYW1lIGxpc3QuXG4vL1xuLy8gRXhjZXB0aW9ucyB0aGF0IGRvbid0IG1hdGNoIHRoaXMgY29udmVudGlvbiBhcmUgbGlzdGVkIHNlcGFyYXRlbHkuXG4vL1xuLy8gcHJldHRpZXItaWdub3JlXG5cbnZhciBzaW1wbGVFdmVudFBsdWdpbkV2ZW50cyA9IFsnYWJvcnQnLCAnYXV4Q2xpY2snLCAnY2FuY2VsJywgJ2NhblBsYXknLCAnY2FuUGxheVRocm91Z2gnLCAnY2xpY2snLCAnY2xvc2UnLCAnY29udGV4dE1lbnUnLCAnY29weScsICdjdXQnLCAnZHJhZycsICdkcmFnRW5kJywgJ2RyYWdFbnRlcicsICdkcmFnRXhpdCcsICdkcmFnTGVhdmUnLCAnZHJhZ092ZXInLCAnZHJhZ1N0YXJ0JywgJ2Ryb3AnLCAnZHVyYXRpb25DaGFuZ2UnLCAnZW1wdGllZCcsICdlbmNyeXB0ZWQnLCAnZW5kZWQnLCAnZXJyb3InLCAnZ290UG9pbnRlckNhcHR1cmUnLCAnaW5wdXQnLCAnaW52YWxpZCcsICdrZXlEb3duJywgJ2tleVByZXNzJywgJ2tleVVwJywgJ2xvYWQnLCAnbG9hZGVkRGF0YScsICdsb2FkZWRNZXRhZGF0YScsICdsb2FkU3RhcnQnLCAnbG9zdFBvaW50ZXJDYXB0dXJlJywgJ21vdXNlRG93bicsICdtb3VzZU1vdmUnLCAnbW91c2VPdXQnLCAnbW91c2VPdmVyJywgJ21vdXNlVXAnLCAncGFzdGUnLCAncGF1c2UnLCAncGxheScsICdwbGF5aW5nJywgJ3BvaW50ZXJDYW5jZWwnLCAncG9pbnRlckRvd24nLCAncG9pbnRlck1vdmUnLCAncG9pbnRlck91dCcsICdwb2ludGVyT3ZlcicsICdwb2ludGVyVXAnLCAncHJvZ3Jlc3MnLCAncmF0ZUNoYW5nZScsICdyZXNldCcsICdyZXNpemUnLCAnc2Vla2VkJywgJ3NlZWtpbmcnLCAnc3RhbGxlZCcsICdzdWJtaXQnLCAnc3VzcGVuZCcsICd0aW1lVXBkYXRlJywgJ3RvdWNoQ2FuY2VsJywgJ3RvdWNoRW5kJywgJ3RvdWNoU3RhcnQnLCAndm9sdW1lQ2hhbmdlJywgJ3Njcm9sbCcsICd0b2dnbGUnLCAndG91Y2hNb3ZlJywgJ3dhaXRpbmcnLCAnd2hlZWwnXTtcblxuZnVuY3Rpb24gcmVnaXN0ZXJTaW1wbGVFdmVudChkb21FdmVudE5hbWUsIHJlYWN0TmFtZSkge1xuICB0b3BMZXZlbEV2ZW50c1RvUmVhY3ROYW1lcy5zZXQoZG9tRXZlbnROYW1lLCByZWFjdE5hbWUpO1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQocmVhY3ROYW1lLCBbZG9tRXZlbnROYW1lXSk7XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyU2ltcGxlRXZlbnRzKCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHNpbXBsZUV2ZW50UGx1Z2luRXZlbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGV2ZW50TmFtZSA9IHNpbXBsZUV2ZW50UGx1Z2luRXZlbnRzW2ldO1xuICAgIHZhciBkb21FdmVudE5hbWUgPSBldmVudE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgY2FwaXRhbGl6ZWRFdmVudCA9IGV2ZW50TmFtZVswXS50b1VwcGVyQ2FzZSgpICsgZXZlbnROYW1lLnNsaWNlKDEpO1xuICAgIHJlZ2lzdGVyU2ltcGxlRXZlbnQoZG9tRXZlbnROYW1lLCAnb24nICsgY2FwaXRhbGl6ZWRFdmVudCk7XG4gIH0gLy8gU3BlY2lhbCBjYXNlcyB3aGVyZSBldmVudCBuYW1lcyBkb24ndCBtYXRjaC5cblxuXG4gIHJlZ2lzdGVyU2ltcGxlRXZlbnQoQU5JTUFUSU9OX0VORCwgJ29uQW5pbWF0aW9uRW5kJyk7XG4gIHJlZ2lzdGVyU2ltcGxlRXZlbnQoQU5JTUFUSU9OX0lURVJBVElPTiwgJ29uQW5pbWF0aW9uSXRlcmF0aW9uJyk7XG4gIHJlZ2lzdGVyU2ltcGxlRXZlbnQoQU5JTUFUSU9OX1NUQVJULCAnb25BbmltYXRpb25TdGFydCcpO1xuICByZWdpc3RlclNpbXBsZUV2ZW50KCdkYmxjbGljaycsICdvbkRvdWJsZUNsaWNrJyk7XG4gIHJlZ2lzdGVyU2ltcGxlRXZlbnQoJ2ZvY3VzaW4nLCAnb25Gb2N1cycpO1xuICByZWdpc3RlclNpbXBsZUV2ZW50KCdmb2N1c291dCcsICdvbkJsdXInKTtcbiAgcmVnaXN0ZXJTaW1wbGVFdmVudChUUkFOU0lUSU9OX0VORCwgJ29uVHJhbnNpdGlvbkVuZCcpO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzJDQoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgcmVhY3ROYW1lID0gdG9wTGV2ZWxFdmVudHNUb1JlYWN0TmFtZXMuZ2V0KGRvbUV2ZW50TmFtZSk7XG5cbiAgaWYgKHJlYWN0TmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0V2ZW50O1xuICB2YXIgcmVhY3RFdmVudFR5cGUgPSBkb21FdmVudE5hbWU7XG5cbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdrZXlwcmVzcyc6XG4gICAgICAvLyBGaXJlZm94IGNyZWF0ZXMgYSBrZXlwcmVzcyBldmVudCBmb3IgZnVuY3Rpb24ga2V5cyB0b28uIFRoaXMgcmVtb3Zlc1xuICAgICAgLy8gdGhlIHVud2FudGVkIGtleXByZXNzIGV2ZW50cy4gRW50ZXIgaXMgaG93ZXZlciBib3RoIHByaW50YWJsZSBhbmRcbiAgICAgIC8vIG5vbi1wcmludGFibGUuIE9uZSB3b3VsZCBleHBlY3QgVGFiIHRvIGJlIGFzIHdlbGwgKGJ1dCBpdCBpc24ndCkuXG4gICAgICBpZiAoZ2V0RXZlbnRDaGFyQ29kZShuYXRpdmVFdmVudCkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuXG4gICAgY2FzZSAna2V5ZG93bic6XG4gICAgY2FzZSAna2V5dXAnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljS2V5Ym9hcmRFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZm9jdXNpbic6XG4gICAgICByZWFjdEV2ZW50VHlwZSA9ICdmb2N1cyc7XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNGb2N1c0V2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdmb2N1c291dCc6XG4gICAgICByZWFjdEV2ZW50VHlwZSA9ICdibHVyJztcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0ZvY3VzRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2JlZm9yZWJsdXInOlxuICAgIGNhc2UgJ2FmdGVyYmx1cic6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNGb2N1c0V2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdjbGljayc6XG4gICAgICAvLyBGaXJlZm94IGNyZWF0ZXMgYSBjbGljayBldmVudCBvbiByaWdodCBtb3VzZSBjbGlja3MuIFRoaXMgcmVtb3ZlcyB0aGVcbiAgICAgIC8vIHVud2FudGVkIGNsaWNrIGV2ZW50cy5cbiAgICAgIGlmIChuYXRpdmVFdmVudC5idXR0b24gPT09IDIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuXG4gICAgY2FzZSAnYXV4Y2xpY2snOlxuICAgIGNhc2UgJ2RibGNsaWNrJzpcbiAgICBjYXNlICdtb3VzZWRvd24nOlxuICAgIGNhc2UgJ21vdXNlbW92ZSc6XG4gICAgY2FzZSAnbW91c2V1cCc6IC8vIFRPRE86IERpc2FibGVkIGVsZW1lbnRzIHNob3VsZCBub3QgcmVzcG9uZCB0byBtb3VzZSBldmVudHNcblxuICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cblxuICAgIGNhc2UgJ21vdXNlb3V0JzpcbiAgICBjYXNlICdtb3VzZW92ZXInOlxuICAgIGNhc2UgJ2NvbnRleHRtZW51JzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY01vdXNlRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2RyYWcnOlxuICAgIGNhc2UgJ2RyYWdlbmQnOlxuICAgIGNhc2UgJ2RyYWdlbnRlcic6XG4gICAgY2FzZSAnZHJhZ2V4aXQnOlxuICAgIGNhc2UgJ2RyYWdsZWF2ZSc6XG4gICAgY2FzZSAnZHJhZ292ZXInOlxuICAgIGNhc2UgJ2RyYWdzdGFydCc6XG4gICAgY2FzZSAnZHJvcCc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNEcmFnRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RvdWNoY2FuY2VsJzpcbiAgICBjYXNlICd0b3VjaGVuZCc6XG4gICAgY2FzZSAndG91Y2htb3ZlJzpcbiAgICBjYXNlICd0b3VjaHN0YXJ0JzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1RvdWNoRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgQU5JTUFUSU9OX0VORDpcbiAgICBjYXNlIEFOSU1BVElPTl9JVEVSQVRJT046XG4gICAgY2FzZSBBTklNQVRJT05fU1RBUlQ6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNBbmltYXRpb25FdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBUUkFOU0lUSU9OX0VORDpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1RyYW5zaXRpb25FdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2Nyb2xsJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1VJRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3doZWVsJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1doZWVsRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2NvcHknOlxuICAgIGNhc2UgJ2N1dCc6XG4gICAgY2FzZSAncGFzdGUnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljQ2xpcGJvYXJkRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2dvdHBvaW50ZXJjYXB0dXJlJzpcbiAgICBjYXNlICdsb3N0cG9pbnRlcmNhcHR1cmUnOlxuICAgIGNhc2UgJ3BvaW50ZXJjYW5jZWwnOlxuICAgIGNhc2UgJ3BvaW50ZXJkb3duJzpcbiAgICBjYXNlICdwb2ludGVybW92ZSc6XG4gICAgY2FzZSAncG9pbnRlcm91dCc6XG4gICAgY2FzZSAncG9pbnRlcm92ZXInOlxuICAgIGNhc2UgJ3BvaW50ZXJ1cCc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNQb2ludGVyRXZlbnQ7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHZhciBpbkNhcHR1cmVQaGFzZSA9IChldmVudFN5c3RlbUZsYWdzICYgSVNfQ0FQVFVSRV9QSEFTRSkgIT09IDA7XG5cbiAge1xuICAgIC8vIFNvbWUgZXZlbnRzIGRvbid0IGJ1YmJsZSBpbiB0aGUgYnJvd3Nlci5cbiAgICAvLyBJbiB0aGUgcGFzdCwgUmVhY3QgaGFzIGFsd2F5cyBidWJibGVkIHRoZW0sIGJ1dCB0aGlzIGNhbiBiZSBzdXJwcmlzaW5nLlxuICAgIC8vIFdlJ3JlIGdvaW5nIHRvIHRyeSBhbGlnbmluZyBjbG9zZXIgdG8gdGhlIGJyb3dzZXIgYmVoYXZpb3IgYnkgbm90IGJ1YmJsaW5nXG4gICAgLy8gdGhlbSBpbiBSZWFjdCBlaXRoZXIuIFdlJ2xsIHN0YXJ0IGJ5IG5vdCBidWJibGluZyBvblNjcm9sbCwgYW5kIHRoZW4gZXhwYW5kLlxuICAgIHZhciBhY2N1bXVsYXRlVGFyZ2V0T25seSA9ICFpbkNhcHR1cmVQaGFzZSAmJiAvLyBUT0RPOiBpZGVhbGx5LCB3ZSdkIGV2ZW50dWFsbHkgYWRkIGFsbCBldmVudHMgZnJvbVxuICAgIC8vIG5vbkRlbGVnYXRlZEV2ZW50cyBsaXN0IGluIERPTVBsdWdpbkV2ZW50U3lzdGVtLlxuICAgIC8vIFRoZW4gd2UgY2FuIHJlbW92ZSB0aGlzIHNwZWNpYWwgbGlzdC5cbiAgICAvLyBUaGlzIGlzIGEgYnJlYWtpbmcgY2hhbmdlIHRoYXQgY2FuIHdhaXQgdW50aWwgUmVhY3QgMTguXG4gICAgZG9tRXZlbnROYW1lID09PSAnc2Nyb2xsJztcblxuICAgIHZhciBfbGlzdGVuZXJzID0gYWNjdW11bGF0ZVNpbmdsZVBoYXNlTGlzdGVuZXJzKHRhcmdldEluc3QsIHJlYWN0TmFtZSwgbmF0aXZlRXZlbnQudHlwZSwgaW5DYXB0dXJlUGhhc2UsIGFjY3VtdWxhdGVUYXJnZXRPbmx5KTtcblxuICAgIGlmIChfbGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIEludGVudGlvbmFsbHkgY3JlYXRlIGV2ZW50IGxhemlseS5cbiAgICAgIHZhciBfZXZlbnQgPSBuZXcgU3ludGhldGljRXZlbnRDdG9yKHJlYWN0TmFtZSwgcmVhY3RFdmVudFR5cGUsIG51bGwsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG5cbiAgICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICAgIGV2ZW50OiBfZXZlbnQsXG4gICAgICAgIGxpc3RlbmVyczogX2xpc3RlbmVyc1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbi8vIFRPRE86IHJlbW92ZSB0b3AtbGV2ZWwgc2lkZSBlZmZlY3QuXG5yZWdpc3RlclNpbXBsZUV2ZW50cygpO1xucmVnaXN0ZXJFdmVudHMkMigpO1xucmVnaXN0ZXJFdmVudHMkMSgpO1xucmVnaXN0ZXJFdmVudHMkMygpO1xucmVnaXN0ZXJFdmVudHMoKTtcblxuZnVuY3Rpb24gZXh0cmFjdEV2ZW50cyQ1KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpIHtcbiAgLy8gVE9ETzogd2Ugc2hvdWxkIHJlbW92ZSB0aGUgY29uY2VwdCBvZiBhIFwiU2ltcGxlRXZlbnRQbHVnaW5cIi5cbiAgLy8gVGhpcyBpcyB0aGUgYmFzaWMgZnVuY3Rpb25hbGl0eSBvZiB0aGUgZXZlbnQgc3lzdGVtLiBBbGxcbiAgLy8gdGhlIG90aGVyIHBsdWdpbnMgYXJlIGVzc2VudGlhbGx5IHBvbHlmaWxscy4gU28gdGhlIHBsdWdpblxuICAvLyBzaG91bGQgcHJvYmFibHkgYmUgaW5saW5lZCBzb21ld2hlcmUgYW5kIGhhdmUgaXRzIGxvZ2ljXG4gIC8vIGJlIGNvcmUgdGhlIHRvIGV2ZW50IHN5c3RlbS4gVGhpcyB3b3VsZCBwb3RlbnRpYWxseSBhbGxvd1xuICAvLyB1cyB0byBzaGlwIGJ1aWxkcyBvZiBSZWFjdCB3aXRob3V0IHRoZSBwb2x5ZmlsbGVkIHBsdWdpbnMgYmVsb3cuXG4gIGV4dHJhY3RFdmVudHMkNChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncyk7XG4gIHZhciBzaG91bGRQcm9jZXNzUG9seWZpbGxQbHVnaW5zID0gKGV2ZW50U3lzdGVtRmxhZ3MgJiBTSE9VTERfTk9UX1BST0NFU1NfUE9MWUZJTExfRVZFTlRfUExVR0lOUykgPT09IDA7IC8vIFdlIGRvbid0IHByb2Nlc3MgdGhlc2UgZXZlbnRzIHVubGVzcyB3ZSBhcmUgaW4gdGhlXG4gIC8vIGV2ZW50J3MgbmF0aXZlIFwiYnViYmxlXCIgcGhhc2UsIHdoaWNoIG1lYW5zIHRoYXQgd2UncmVcbiAgLy8gbm90IGluIHRoZSBjYXB0dXJlIHBoYXNlLiBUaGF0J3MgYmVjYXVzZSB3ZSBlbXVsYXRlXG4gIC8vIHRoZSBjYXB0dXJlIHBoYXNlIGhlcmUgc3RpbGwuIFRoaXMgaXMgYSB0cmFkZS1vZmYsXG4gIC8vIGJlY2F1c2UgaW4gYW4gaWRlYWwgd29ybGQgd2Ugd291bGQgbm90IGVtdWxhdGUgYW5kIHVzZVxuICAvLyB0aGUgcGhhc2VzIHByb3Blcmx5LCBsaWtlIHdlIGRvIHdpdGggdGhlIFNpbXBsZUV2ZW50XG4gIC8vIHBsdWdpbi4gSG93ZXZlciwgdGhlIHBsdWdpbnMgYmVsb3cgZWl0aGVyIGV4cGVjdFxuICAvLyBlbXVsYXRpb24gKEVudGVyTGVhdmUpIG9yIHVzZSBzdGF0ZSBsb2NhbGl6ZWQgdG8gdGhhdFxuICAvLyBwbHVnaW4gKEJlZm9yZUlucHV0LCBDaGFuZ2UsIFNlbGVjdCkuIFRoZSBzdGF0ZSBpblxuICAvLyB0aGVzZSBtb2R1bGVzIGNvbXBsaWNhdGVzIHRoaW5ncywgYXMgeW91J2xsIGVzc2VudGlhbGx5XG4gIC8vIGdldCB0aGUgY2FzZSB3aGVyZSB0aGUgY2FwdHVyZSBwaGFzZSBldmVudCBtaWdodCBjaGFuZ2VcbiAgLy8gc3RhdGUsIG9ubHkgZm9yIHRoZSBmb2xsb3dpbmcgYnViYmxlIGV2ZW50IHRvIGNvbWUgaW5cbiAgLy8gbGF0ZXIgYW5kIG5vdCB0cmlnZ2VyIGFueXRoaW5nIGFzIHRoZSBzdGF0ZSBub3dcbiAgLy8gaW52YWxpZGF0ZXMgdGhlIGhldXJpc3RpY3Mgb2YgdGhlIGV2ZW50IHBsdWdpbi4gV2VcbiAgLy8gY291bGQgYWx0ZXIgYWxsIHRoZXNlIHBsdWdpbnMgdG8gd29yayBpbiBzdWNoIHdheXMsIGJ1dFxuICAvLyB0aGF0IG1pZ2h0IGNhdXNlIG90aGVyIHVua25vd24gc2lkZS1lZmZlY3RzIHRoYXQgd2VcbiAgLy8gY2FuJ3QgZm9yZXNlZSByaWdodCBub3cuXG5cbiAgaWYgKHNob3VsZFByb2Nlc3NQb2x5ZmlsbFBsdWdpbnMpIHtcbiAgICBleHRyYWN0RXZlbnRzJDIoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIGV4dHJhY3RFdmVudHMkMShkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgZXh0cmFjdEV2ZW50cyQzKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBleHRyYWN0RXZlbnRzKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgfVxufSAvLyBMaXN0IG9mIGV2ZW50cyB0aGF0IG5lZWQgdG8gYmUgaW5kaXZpZHVhbGx5IGF0dGFjaGVkIHRvIG1lZGlhIGVsZW1lbnRzLlxuXG5cbnZhciBtZWRpYUV2ZW50VHlwZXMgPSBbJ2Fib3J0JywgJ2NhbnBsYXknLCAnY2FucGxheXRocm91Z2gnLCAnZHVyYXRpb25jaGFuZ2UnLCAnZW1wdGllZCcsICdlbmNyeXB0ZWQnLCAnZW5kZWQnLCAnZXJyb3InLCAnbG9hZGVkZGF0YScsICdsb2FkZWRtZXRhZGF0YScsICdsb2Fkc3RhcnQnLCAncGF1c2UnLCAncGxheScsICdwbGF5aW5nJywgJ3Byb2dyZXNzJywgJ3JhdGVjaGFuZ2UnLCAncmVzaXplJywgJ3NlZWtlZCcsICdzZWVraW5nJywgJ3N0YWxsZWQnLCAnc3VzcGVuZCcsICd0aW1ldXBkYXRlJywgJ3ZvbHVtZWNoYW5nZScsICd3YWl0aW5nJ107IC8vIFdlIHNob3VsZCBub3QgZGVsZWdhdGUgdGhlc2UgZXZlbnRzIHRvIHRoZSBjb250YWluZXIsIGJ1dCByYXRoZXJcbi8vIHNldCB0aGVtIG9uIHRoZSBhY3R1YWwgdGFyZ2V0IGVsZW1lbnQgaXRzZWxmLiBUaGlzIGlzIHByaW1hcmlseVxuLy8gYmVjYXVzZSB0aGVzZSBldmVudHMgZG8gbm90IGNvbnNpc3RlbnRseSBidWJibGUgaW4gdGhlIERPTS5cblxudmFyIG5vbkRlbGVnYXRlZEV2ZW50cyA9IG5ldyBTZXQoWydjYW5jZWwnLCAnY2xvc2UnLCAnaW52YWxpZCcsICdsb2FkJywgJ3Njcm9sbCcsICd0b2dnbGUnXS5jb25jYXQobWVkaWFFdmVudFR5cGVzKSk7XG5cbmZ1bmN0aW9uIGV4ZWN1dGVEaXNwYXRjaChldmVudCwgbGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpIHtcbiAgdmFyIHR5cGUgPSBldmVudC50eXBlIHx8ICd1bmtub3duLWV2ZW50JztcbiAgZXZlbnQuY3VycmVudFRhcmdldCA9IGN1cnJlbnRUYXJnZXQ7XG4gIGludm9rZUd1YXJkZWRDYWxsYmFja0FuZENhdGNoRmlyc3RFcnJvcih0eXBlLCBsaXN0ZW5lciwgdW5kZWZpbmVkLCBldmVudCk7XG4gIGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzRGlzcGF0Y2hRdWV1ZUl0ZW1zSW5PcmRlcihldmVudCwgZGlzcGF0Y2hMaXN0ZW5lcnMsIGluQ2FwdHVyZVBoYXNlKSB7XG4gIHZhciBwcmV2aW91c0luc3RhbmNlO1xuXG4gIGlmIChpbkNhcHR1cmVQaGFzZSkge1xuICAgIGZvciAodmFyIGkgPSBkaXNwYXRjaExpc3RlbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIF9kaXNwYXRjaExpc3RlbmVycyRpID0gZGlzcGF0Y2hMaXN0ZW5lcnNbaV0sXG4gICAgICAgICAgaW5zdGFuY2UgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkaS5pbnN0YW5jZSxcbiAgICAgICAgICBjdXJyZW50VGFyZ2V0ID0gX2Rpc3BhdGNoTGlzdGVuZXJzJGkuY3VycmVudFRhcmdldCxcbiAgICAgICAgICBsaXN0ZW5lciA9IF9kaXNwYXRjaExpc3RlbmVycyRpLmxpc3RlbmVyO1xuXG4gICAgICBpZiAoaW5zdGFuY2UgIT09IHByZXZpb3VzSW5zdGFuY2UgJiYgZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGV4ZWN1dGVEaXNwYXRjaChldmVudCwgbGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpO1xuICAgICAgcHJldmlvdXNJbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZGlzcGF0Y2hMaXN0ZW5lcnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgX2Rpc3BhdGNoTGlzdGVuZXJzJF9pID0gZGlzcGF0Y2hMaXN0ZW5lcnNbX2ldLFxuICAgICAgICAgIF9pbnN0YW5jZSA9IF9kaXNwYXRjaExpc3RlbmVycyRfaS5pbnN0YW5jZSxcbiAgICAgICAgICBfY3VycmVudFRhcmdldCA9IF9kaXNwYXRjaExpc3RlbmVycyRfaS5jdXJyZW50VGFyZ2V0LFxuICAgICAgICAgIF9saXN0ZW5lciA9IF9kaXNwYXRjaExpc3RlbmVycyRfaS5saXN0ZW5lcjtcblxuICAgICAgaWYgKF9pbnN0YW5jZSAhPT0gcHJldmlvdXNJbnN0YW5jZSAmJiBldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZXhlY3V0ZURpc3BhdGNoKGV2ZW50LCBfbGlzdGVuZXIsIF9jdXJyZW50VGFyZ2V0KTtcbiAgICAgIHByZXZpb3VzSW5zdGFuY2UgPSBfaW5zdGFuY2U7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NEaXNwYXRjaFF1ZXVlKGRpc3BhdGNoUXVldWUsIGV2ZW50U3lzdGVtRmxhZ3MpIHtcbiAgdmFyIGluQ2FwdHVyZVBoYXNlID0gKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19DQVBUVVJFX1BIQVNFKSAhPT0gMDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGRpc3BhdGNoUXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgX2Rpc3BhdGNoUXVldWUkaSA9IGRpc3BhdGNoUXVldWVbaV0sXG4gICAgICAgIGV2ZW50ID0gX2Rpc3BhdGNoUXVldWUkaS5ldmVudCxcbiAgICAgICAgbGlzdGVuZXJzID0gX2Rpc3BhdGNoUXVldWUkaS5saXN0ZW5lcnM7XG4gICAgcHJvY2Vzc0Rpc3BhdGNoUXVldWVJdGVtc0luT3JkZXIoZXZlbnQsIGxpc3RlbmVycywgaW5DYXB0dXJlUGhhc2UpOyAvLyAgZXZlbnQgc3lzdGVtIGRvZXNuJ3QgdXNlIHBvb2xpbmcuXG4gIH0gLy8gVGhpcyB3b3VsZCBiZSBhIGdvb2QgdGltZSB0byByZXRocm93IGlmIGFueSBvZiB0aGUgZXZlbnQgaGFuZGxlcnMgdGhyZXcuXG5cblxuICByZXRocm93Q2F1Z2h0RXJyb3IoKTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hFdmVudHNGb3JQbHVnaW5zKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIHRhcmdldEluc3QsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgbmF0aXZlRXZlbnRUYXJnZXQgPSBnZXRFdmVudFRhcmdldChuYXRpdmVFdmVudCk7XG4gIHZhciBkaXNwYXRjaFF1ZXVlID0gW107XG4gIGV4dHJhY3RFdmVudHMkNShkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncyk7XG4gIHByb2Nlc3NEaXNwYXRjaFF1ZXVlKGRpc3BhdGNoUXVldWUsIGV2ZW50U3lzdGVtRmxhZ3MpO1xufVxuXG5mdW5jdGlvbiBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KGRvbUV2ZW50TmFtZSwgdGFyZ2V0RWxlbWVudCkge1xuICB7XG4gICAgaWYgKCFub25EZWxlZ2F0ZWRFdmVudHMuaGFzKGRvbUV2ZW50TmFtZSkpIHtcbiAgICAgIGVycm9yKCdEaWQgbm90IGV4cGVjdCBhIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoKSBjYWxsIGZvciBcIiVzXCIuICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZG9tRXZlbnROYW1lKTtcbiAgICB9XG4gIH1cblxuICB2YXIgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lciA9IGZhbHNlO1xuICB2YXIgbGlzdGVuZXJTZXQgPSBnZXRFdmVudExpc3RlbmVyU2V0KHRhcmdldEVsZW1lbnQpO1xuICB2YXIgbGlzdGVuZXJTZXRLZXkgPSBnZXRMaXN0ZW5lclNldEtleShkb21FdmVudE5hbWUsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpO1xuXG4gIGlmICghbGlzdGVuZXJTZXQuaGFzKGxpc3RlbmVyU2V0S2V5KSkge1xuICAgIGFkZFRyYXBwZWRFdmVudExpc3RlbmVyKHRhcmdldEVsZW1lbnQsIGRvbUV2ZW50TmFtZSwgSVNfTk9OX0RFTEVHQVRFRCwgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lcik7XG4gICAgbGlzdGVuZXJTZXQuYWRkKGxpc3RlbmVyU2V0S2V5KTtcbiAgfVxufVxuZnVuY3Rpb24gbGlzdGVuVG9OYXRpdmVFdmVudChkb21FdmVudE5hbWUsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIsIHRhcmdldCkge1xuICB7XG4gICAgaWYgKG5vbkRlbGVnYXRlZEV2ZW50cy5oYXMoZG9tRXZlbnROYW1lKSAmJiAhaXNDYXB0dXJlUGhhc2VMaXN0ZW5lcikge1xuICAgICAgZXJyb3IoJ0RpZCBub3QgZXhwZWN0IGEgbGlzdGVuVG9OYXRpdmVFdmVudCgpIGNhbGwgZm9yIFwiJXNcIiBpbiB0aGUgYnViYmxlIHBoYXNlLiAnICsgJ1RoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGRvbUV2ZW50TmFtZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGV2ZW50U3lzdGVtRmxhZ3MgPSAwO1xuXG4gIGlmIChpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKSB7XG4gICAgZXZlbnRTeXN0ZW1GbGFncyB8PSBJU19DQVBUVVJFX1BIQVNFO1xuICB9XG5cbiAgYWRkVHJhcHBlZEV2ZW50TGlzdGVuZXIodGFyZ2V0LCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpO1xufSAvLyBUaGlzIGlzIG9ubHkgdXNlZCBieSBjcmVhdGVFdmVudEhhbmRsZSB3aGVuIHRoZVxudmFyIGxpc3RlbmluZ01hcmtlciA9ICdfcmVhY3RMaXN0ZW5pbmcnICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMik7XG5mdW5jdGlvbiBsaXN0ZW5Ub0FsbFN1cHBvcnRlZEV2ZW50cyhyb290Q29udGFpbmVyRWxlbWVudCkge1xuICBpZiAoIXJvb3RDb250YWluZXJFbGVtZW50W2xpc3RlbmluZ01hcmtlcl0pIHtcbiAgICByb290Q29udGFpbmVyRWxlbWVudFtsaXN0ZW5pbmdNYXJrZXJdID0gdHJ1ZTtcbiAgICBhbGxOYXRpdmVFdmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZG9tRXZlbnROYW1lKSB7XG4gICAgICAvLyBXZSBoYW5kbGUgc2VsZWN0aW9uY2hhbmdlIHNlcGFyYXRlbHkgYmVjYXVzZSBpdFxuICAgICAgLy8gZG9lc24ndCBidWJibGUgYW5kIG5lZWRzIHRvIGJlIG9uIHRoZSBkb2N1bWVudC5cbiAgICAgIGlmIChkb21FdmVudE5hbWUgIT09ICdzZWxlY3Rpb25jaGFuZ2UnKSB7XG4gICAgICAgIGlmICghbm9uRGVsZWdhdGVkRXZlbnRzLmhhcyhkb21FdmVudE5hbWUpKSB7XG4gICAgICAgICAgbGlzdGVuVG9OYXRpdmVFdmVudChkb21FdmVudE5hbWUsIGZhbHNlLCByb290Q29udGFpbmVyRWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBsaXN0ZW5Ub05hdGl2ZUV2ZW50KGRvbUV2ZW50TmFtZSwgdHJ1ZSwgcm9vdENvbnRhaW5lckVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHZhciBvd25lckRvY3VtZW50ID0gcm9vdENvbnRhaW5lckVsZW1lbnQubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgPyByb290Q29udGFpbmVyRWxlbWVudCA6IHJvb3RDb250YWluZXJFbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG5cbiAgICBpZiAob3duZXJEb2N1bWVudCAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhlIHNlbGVjdGlvbmNoYW5nZSBldmVudCBhbHNvIG5lZWRzIGRlZHVwbGljYXRpb25cbiAgICAgIC8vIGJ1dCBpdCBpcyBhdHRhY2hlZCB0byB0aGUgZG9jdW1lbnQuXG4gICAgICBpZiAoIW93bmVyRG9jdW1lbnRbbGlzdGVuaW5nTWFya2VyXSkge1xuICAgICAgICBvd25lckRvY3VtZW50W2xpc3RlbmluZ01hcmtlcl0gPSB0cnVlO1xuICAgICAgICBsaXN0ZW5Ub05hdGl2ZUV2ZW50KCdzZWxlY3Rpb25jaGFuZ2UnLCBmYWxzZSwgb3duZXJEb2N1bWVudCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkZFRyYXBwZWRFdmVudExpc3RlbmVyKHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBpc0NhcHR1cmVQaGFzZUxpc3RlbmVyLCBpc0RlZmVycmVkTGlzdGVuZXJGb3JMZWdhY3lGQlN1cHBvcnQpIHtcbiAgdmFyIGxpc3RlbmVyID0gY3JlYXRlRXZlbnRMaXN0ZW5lcldyYXBwZXJXaXRoUHJpb3JpdHkodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MpOyAvLyBJZiBwYXNzaXZlIG9wdGlvbiBpcyBub3Qgc3VwcG9ydGVkLCB0aGVuIHRoZSBldmVudCB3aWxsIGJlXG4gIC8vIGFjdGl2ZSBhbmQgbm90IHBhc3NpdmUuXG5cbiAgdmFyIGlzUGFzc2l2ZUxpc3RlbmVyID0gdW5kZWZpbmVkO1xuXG4gIGlmIChwYXNzaXZlQnJvd3NlckV2ZW50c1N1cHBvcnRlZCkge1xuICAgIC8vIEJyb3dzZXJzIGludHJvZHVjZWQgYW4gaW50ZXJ2ZW50aW9uLCBtYWtpbmcgdGhlc2UgZXZlbnRzXG4gICAgLy8gcGFzc2l2ZSBieSBkZWZhdWx0IG9uIGRvY3VtZW50LiBSZWFjdCBkb2Vzbid0IGJpbmQgdGhlbVxuICAgIC8vIHRvIGRvY3VtZW50IGFueW1vcmUsIGJ1dCBjaGFuZ2luZyB0aGlzIG5vdyB3b3VsZCB1bmRvXG4gICAgLy8gdGhlIHBlcmZvcm1hbmNlIHdpbnMgZnJvbSB0aGUgY2hhbmdlLiBTbyB3ZSBlbXVsYXRlXG4gICAgLy8gdGhlIGV4aXN0aW5nIGJlaGF2aW9yIG1hbnVhbGx5IG9uIHRoZSByb290cyBub3cuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xOTY1MVxuICAgIGlmIChkb21FdmVudE5hbWUgPT09ICd0b3VjaHN0YXJ0JyB8fCBkb21FdmVudE5hbWUgPT09ICd0b3VjaG1vdmUnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ3doZWVsJykge1xuICAgICAgaXNQYXNzaXZlTGlzdGVuZXIgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHRhcmdldENvbnRhaW5lciA9ICB0YXJnZXRDb250YWluZXI7XG4gIHZhciB1bnN1YnNjcmliZUxpc3RlbmVyOyAvLyBXaGVuIGxlZ2FjeUZCU3VwcG9ydCBpcyBlbmFibGVkLCBpdCdzIGZvciB3aGVuIHdlXG5cblxuICBpZiAoaXNDYXB0dXJlUGhhc2VMaXN0ZW5lcikge1xuICAgIGlmIChpc1Bhc3NpdmVMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB1bnN1YnNjcmliZUxpc3RlbmVyID0gYWRkRXZlbnRDYXB0dXJlTGlzdGVuZXJXaXRoUGFzc2l2ZUZsYWcodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGxpc3RlbmVyLCBpc1Bhc3NpdmVMaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVuc3Vic2NyaWJlTGlzdGVuZXIgPSBhZGRFdmVudENhcHR1cmVMaXN0ZW5lcih0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoaXNQYXNzaXZlTGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdW5zdWJzY3JpYmVMaXN0ZW5lciA9IGFkZEV2ZW50QnViYmxlTGlzdGVuZXJXaXRoUGFzc2l2ZUZsYWcodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGxpc3RlbmVyLCBpc1Bhc3NpdmVMaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVuc3Vic2NyaWJlTGlzdGVuZXIgPSBhZGRFdmVudEJ1YmJsZUxpc3RlbmVyKHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzTWF0Y2hpbmdSb290Q29udGFpbmVyKGdyYW5kQ29udGFpbmVyLCB0YXJnZXRDb250YWluZXIpIHtcbiAgcmV0dXJuIGdyYW5kQ29udGFpbmVyID09PSB0YXJnZXRDb250YWluZXIgfHwgZ3JhbmRDb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSAmJiBncmFuZENvbnRhaW5lci5wYXJlbnROb2RlID09PSB0YXJnZXRDb250YWluZXI7XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnRGb3JQbHVnaW5FdmVudFN5c3RlbShkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIG5hdGl2ZUV2ZW50LCB0YXJnZXRJbnN0LCB0YXJnZXRDb250YWluZXIpIHtcbiAgdmFyIGFuY2VzdG9ySW5zdCA9IHRhcmdldEluc3Q7XG5cbiAgaWYgKChldmVudFN5c3RlbUZsYWdzICYgSVNfRVZFTlRfSEFORExFX05PTl9NQU5BR0VEX05PREUpID09PSAwICYmIChldmVudFN5c3RlbUZsYWdzICYgSVNfTk9OX0RFTEVHQVRFRCkgPT09IDApIHtcbiAgICB2YXIgdGFyZ2V0Q29udGFpbmVyTm9kZSA9IHRhcmdldENvbnRhaW5lcjsgLy8gSWYgd2UgYXJlIHVzaW5nIHRoZSBsZWdhY3kgRkIgc3VwcG9ydCBmbGFnLCB3ZVxuXG4gICAgaWYgKHRhcmdldEluc3QgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoZSBiZWxvdyBsb2dpYyBhdHRlbXB0cyB0byB3b3JrIG91dCBpZiB3ZSBuZWVkIHRvIGNoYW5nZVxuICAgICAgLy8gdGhlIHRhcmdldCBmaWJlciB0byBhIGRpZmZlcmVudCBhbmNlc3Rvci4gV2UgaGFkIHNpbWlsYXIgbG9naWNcbiAgICAgIC8vIGluIHRoZSBsZWdhY3kgZXZlbnQgc3lzdGVtLCBleGNlcHQgdGhlIGJpZyBkaWZmZXJlbmNlIGJldHdlZW5cbiAgICAgIC8vIHN5c3RlbXMgaXMgdGhhdCB0aGUgbW9kZXJuIGV2ZW50IHN5c3RlbSBub3cgaGFzIGFuIGV2ZW50IGxpc3RlbmVyXG4gICAgICAvLyBhdHRhY2hlZCB0byBlYWNoIFJlYWN0IFJvb3QgYW5kIFJlYWN0IFBvcnRhbCBSb290LiBUb2dldGhlcixcbiAgICAgIC8vIHRoZSBET00gbm9kZXMgcmVwcmVzZW50aW5nIHRoZXNlIHJvb3RzIGFyZSB0aGUgXCJyb290Q29udGFpbmVyXCIuXG4gICAgICAvLyBUbyBmaWd1cmUgb3V0IHdoaWNoIGFuY2VzdG9yIGluc3RhbmNlIHdlIHNob3VsZCB1c2UsIHdlIHRyYXZlcnNlXG4gICAgICAvLyB1cCB0aGUgZmliZXIgdHJlZSBmcm9tIHRoZSB0YXJnZXQgaW5zdGFuY2UgYW5kIGF0dGVtcHQgdG8gZmluZFxuICAgICAgLy8gcm9vdCBib3VuZGFyaWVzIHRoYXQgbWF0Y2ggdGhhdCBvZiBvdXIgY3VycmVudCBcInJvb3RDb250YWluZXJcIi5cbiAgICAgIC8vIElmIHdlIGZpbmQgdGhhdCBcInJvb3RDb250YWluZXJcIiwgd2UgZmluZCB0aGUgcGFyZW50IGZpYmVyXG4gICAgICAvLyBzdWItdHJlZSBmb3IgdGhhdCByb290IGFuZCBtYWtlIHRoYXQgb3VyIGFuY2VzdG9yIGluc3RhbmNlLlxuICAgICAgdmFyIG5vZGUgPSB0YXJnZXRJbnN0O1xuXG4gICAgICBtYWluTG9vcDogd2hpbGUgKHRydWUpIHtcbiAgICAgICAgaWYgKG5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbm9kZVRhZyA9IG5vZGUudGFnO1xuXG4gICAgICAgIGlmIChub2RlVGFnID09PSBIb3N0Um9vdCB8fCBub2RlVGFnID09PSBIb3N0UG9ydGFsKSB7XG4gICAgICAgICAgdmFyIGNvbnRhaW5lciA9IG5vZGUuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG5cbiAgICAgICAgICBpZiAoaXNNYXRjaGluZ1Jvb3RDb250YWluZXIoY29udGFpbmVyLCB0YXJnZXRDb250YWluZXJOb2RlKSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG5vZGVUYWcgPT09IEhvc3RQb3J0YWwpIHtcbiAgICAgICAgICAgIC8vIFRoZSB0YXJnZXQgaXMgYSBwb3J0YWwsIGJ1dCBpdCdzIG5vdCB0aGUgcm9vdENvbnRhaW5lciB3ZSdyZSBsb29raW5nIGZvci5cbiAgICAgICAgICAgIC8vIE5vcm1hbGx5IHBvcnRhbHMgaGFuZGxlIHRoZWlyIG93biBldmVudHMgYWxsIHRoZSB3YXkgZG93biB0byB0aGUgcm9vdC5cbiAgICAgICAgICAgIC8vIFNvIHdlIHNob3VsZCBiZSBhYmxlIHRvIHN0b3Agbm93LiBIb3dldmVyLCB3ZSBkb24ndCBrbm93IGlmIHRoaXMgcG9ydGFsXG4gICAgICAgICAgICAvLyB3YXMgcGFydCBvZiAqb3VyKiByb290LlxuICAgICAgICAgICAgdmFyIGdyYW5kTm9kZSA9IG5vZGUucmV0dXJuO1xuXG4gICAgICAgICAgICB3aGlsZSAoZ3JhbmROb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHZhciBncmFuZFRhZyA9IGdyYW5kTm9kZS50YWc7XG5cbiAgICAgICAgICAgICAgaWYgKGdyYW5kVGFnID09PSBIb3N0Um9vdCB8fCBncmFuZFRhZyA9PT0gSG9zdFBvcnRhbCkge1xuICAgICAgICAgICAgICAgIHZhciBncmFuZENvbnRhaW5lciA9IGdyYW5kTm9kZS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcblxuICAgICAgICAgICAgICAgIGlmIChpc01hdGNoaW5nUm9vdENvbnRhaW5lcihncmFuZENvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHJvb3RDb250YWluZXIgd2UncmUgbG9va2luZyBmb3IgYW5kIHdlIGZvdW5kIGl0IGFzXG4gICAgICAgICAgICAgICAgICAvLyBhIHBhcmVudCBvZiB0aGUgUG9ydGFsLiBUaGF0IG1lYW5zIHdlIGNhbiBpZ25vcmUgaXQgYmVjYXVzZSB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIFBvcnRhbCB3aWxsIGJ1YmJsZSB0aHJvdWdoIHRvIHVzLlxuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGdyYW5kTm9kZSA9IGdyYW5kTm9kZS5yZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSAvLyBOb3cgd2UgbmVlZCB0byBmaW5kIGl0J3MgY29ycmVzcG9uZGluZyBob3N0IGZpYmVyIGluIHRoZSBvdGhlclxuICAgICAgICAgIC8vIHRyZWUuIFRvIGRvIHRoaXMgd2UgY2FuIHVzZSBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSwgYnV0IHdlXG4gICAgICAgICAgLy8gbmVlZCB0byB2YWxpZGF0ZSB0aGF0IHRoZSBmaWJlciBpcyBhIGhvc3QgaW5zdGFuY2UsIG90aGVyd2lzZVxuICAgICAgICAgIC8vIHdlIG5lZWQgdG8gdHJhdmVyc2UgdXAgdGhyb3VnaCB0aGUgRE9NIHRpbGwgd2UgZmluZCB0aGUgY29ycmVjdFxuICAgICAgICAgIC8vIG5vZGUgdGhhdCBpcyBmcm9tIHRoZSBvdGhlciB0cmVlLlxuXG5cbiAgICAgICAgICB3aGlsZSAoY29udGFpbmVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgcGFyZW50Tm9kZSA9IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKGNvbnRhaW5lcik7XG5cbiAgICAgICAgICAgIGlmIChwYXJlbnROb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHBhcmVudFRhZyA9IHBhcmVudE5vZGUudGFnO1xuXG4gICAgICAgICAgICBpZiAocGFyZW50VGFnID09PSBIb3N0Q29tcG9uZW50IHx8IHBhcmVudFRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAgICAgICAgICAgbm9kZSA9IGFuY2VzdG9ySW5zdCA9IHBhcmVudE5vZGU7XG4gICAgICAgICAgICAgIGNvbnRpbnVlIG1haW5Mb29wO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIucGFyZW50Tm9kZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBkaXNwYXRjaEV2ZW50c0ZvclBsdWdpbnMoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBuYXRpdmVFdmVudCwgYW5jZXN0b3JJbnN0KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KSB7XG4gIHJldHVybiB7XG4gICAgaW5zdGFuY2U6IGluc3RhbmNlLFxuICAgIGxpc3RlbmVyOiBsaXN0ZW5lcixcbiAgICBjdXJyZW50VGFyZ2V0OiBjdXJyZW50VGFyZ2V0XG4gIH07XG59XG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGVTaW5nbGVQaGFzZUxpc3RlbmVycyh0YXJnZXRGaWJlciwgcmVhY3ROYW1lLCBuYXRpdmVFdmVudFR5cGUsIGluQ2FwdHVyZVBoYXNlLCBhY2N1bXVsYXRlVGFyZ2V0T25seSwgbmF0aXZlRXZlbnQpIHtcbiAgdmFyIGNhcHR1cmVOYW1lID0gcmVhY3ROYW1lICE9PSBudWxsID8gcmVhY3ROYW1lICsgJ0NhcHR1cmUnIDogbnVsbDtcbiAgdmFyIHJlYWN0RXZlbnROYW1lID0gaW5DYXB0dXJlUGhhc2UgPyBjYXB0dXJlTmFtZSA6IHJlYWN0TmFtZTtcbiAgdmFyIGxpc3RlbmVycyA9IFtdO1xuICB2YXIgaW5zdGFuY2UgPSB0YXJnZXRGaWJlcjtcbiAgdmFyIGxhc3RIb3N0Q29tcG9uZW50ID0gbnVsbDsgLy8gQWNjdW11bGF0ZSBhbGwgaW5zdGFuY2VzIGFuZCBsaXN0ZW5lcnMgdmlhIHRoZSB0YXJnZXQgLT4gcm9vdCBwYXRoLlxuXG4gIHdoaWxlIChpbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgIHZhciBfaW5zdGFuY2UyID0gaW5zdGFuY2UsXG4gICAgICAgIHN0YXRlTm9kZSA9IF9pbnN0YW5jZTIuc3RhdGVOb2RlLFxuICAgICAgICB0YWcgPSBfaW5zdGFuY2UyLnRhZzsgLy8gSGFuZGxlIGxpc3RlbmVycyB0aGF0IGFyZSBvbiBIb3N0Q29tcG9uZW50cyAoaS5lLiA8ZGl2PilcblxuICAgIGlmICh0YWcgPT09IEhvc3RDb21wb25lbnQgJiYgc3RhdGVOb2RlICE9PSBudWxsKSB7XG4gICAgICBsYXN0SG9zdENvbXBvbmVudCA9IHN0YXRlTm9kZTsgLy8gY3JlYXRlRXZlbnRIYW5kbGUgbGlzdGVuZXJzXG5cblxuICAgICAgaWYgKHJlYWN0RXZlbnROYW1lICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBsaXN0ZW5lciA9IGdldExpc3RlbmVyKGluc3RhbmNlLCByZWFjdEV2ZW50TmFtZSk7XG5cbiAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpIHtcbiAgICAgICAgICBsaXN0ZW5lcnMucHVzaChjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBsaXN0ZW5lciwgbGFzdEhvc3RDb21wb25lbnQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gSWYgd2UgYXJlIG9ubHkgYWNjdW11bGF0aW5nIGV2ZW50cyBmb3IgdGhlIHRhcmdldCwgdGhlbiB3ZSBkb24ndFxuICAgIC8vIGNvbnRpbnVlIHRvIHByb3BhZ2F0ZSB0aHJvdWdoIHRoZSBSZWFjdCBmaWJlciB0cmVlIHRvIGZpbmQgb3RoZXJcbiAgICAvLyBsaXN0ZW5lcnMuXG5cblxuICAgIGlmIChhY2N1bXVsYXRlVGFyZ2V0T25seSkge1xuICAgICAgYnJlYWs7XG4gICAgfSAvLyBJZiB3ZSBhcmUgcHJvY2Vzc2luZyB0aGUgb25CZWZvcmVCbHVyIGV2ZW50LCB0aGVuIHdlIG5lZWQgdG8gdGFrZVxuXG4gICAgaW5zdGFuY2UgPSBpbnN0YW5jZS5yZXR1cm47XG4gIH1cblxuICByZXR1cm4gbGlzdGVuZXJzO1xufSAvLyBXZSBzaG91bGQgb25seSB1c2UgdGhpcyBmdW5jdGlvbiBmb3I6XG4vLyAtIEJlZm9yZUlucHV0RXZlbnRQbHVnaW5cbi8vIC0gQ2hhbmdlRXZlbnRQbHVnaW5cbi8vIC0gU2VsZWN0RXZlbnRQbHVnaW5cbi8vIFRoaXMgaXMgYmVjYXVzZSB3ZSBvbmx5IHByb2Nlc3MgdGhlc2UgcGx1Z2luc1xuLy8gaW4gdGhlIGJ1YmJsZSBwaGFzZSwgc28gd2UgbmVlZCB0byBhY2N1bXVsYXRlIHR3b1xuLy8gcGhhc2UgZXZlbnQgbGlzdGVuZXJzICh2aWEgZW11bGF0aW9uKS5cblxuZnVuY3Rpb24gYWNjdW11bGF0ZVR3b1BoYXNlTGlzdGVuZXJzKHRhcmdldEZpYmVyLCByZWFjdE5hbWUpIHtcbiAgdmFyIGNhcHR1cmVOYW1lID0gcmVhY3ROYW1lICsgJ0NhcHR1cmUnO1xuICB2YXIgbGlzdGVuZXJzID0gW107XG4gIHZhciBpbnN0YW5jZSA9IHRhcmdldEZpYmVyOyAvLyBBY2N1bXVsYXRlIGFsbCBpbnN0YW5jZXMgYW5kIGxpc3RlbmVycyB2aWEgdGhlIHRhcmdldCAtPiByb290IHBhdGguXG5cbiAgd2hpbGUgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgdmFyIF9pbnN0YW5jZTMgPSBpbnN0YW5jZSxcbiAgICAgICAgc3RhdGVOb2RlID0gX2luc3RhbmNlMy5zdGF0ZU5vZGUsXG4gICAgICAgIHRhZyA9IF9pbnN0YW5jZTMudGFnOyAvLyBIYW5kbGUgbGlzdGVuZXJzIHRoYXQgYXJlIG9uIEhvc3RDb21wb25lbnRzIChpLmUuIDxkaXY+KVxuXG4gICAgaWYgKHRhZyA9PT0gSG9zdENvbXBvbmVudCAmJiBzdGF0ZU5vZGUgIT09IG51bGwpIHtcbiAgICAgIHZhciBjdXJyZW50VGFyZ2V0ID0gc3RhdGVOb2RlO1xuICAgICAgdmFyIGNhcHR1cmVMaXN0ZW5lciA9IGdldExpc3RlbmVyKGluc3RhbmNlLCBjYXB0dXJlTmFtZSk7XG5cbiAgICAgIGlmIChjYXB0dXJlTGlzdGVuZXIgIT0gbnVsbCkge1xuICAgICAgICBsaXN0ZW5lcnMudW5zaGlmdChjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBjYXB0dXJlTGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGJ1YmJsZUxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoaW5zdGFuY2UsIHJlYWN0TmFtZSk7XG5cbiAgICAgIGlmIChidWJibGVMaXN0ZW5lciAhPSBudWxsKSB7XG4gICAgICAgIGxpc3RlbmVycy5wdXNoKGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGJ1YmJsZUxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5zdGFuY2UgPSBpbnN0YW5jZS5yZXR1cm47XG4gIH1cblxuICByZXR1cm4gbGlzdGVuZXJzO1xufVxuXG5mdW5jdGlvbiBnZXRQYXJlbnQoaW5zdCkge1xuICBpZiAoaW5zdCA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZG8ge1xuICAgIGluc3QgPSBpbnN0LnJldHVybjsgLy8gVE9ETzogSWYgdGhpcyBpcyBhIEhvc3RSb290IHdlIG1pZ2h0IHdhbnQgdG8gYmFpbCBvdXQuXG4gICAgLy8gVGhhdCBpcyBkZXBlbmRpbmcgb24gaWYgd2Ugd2FudCBuZXN0ZWQgc3VidHJlZXMgKGxheWVycykgdG8gYnViYmxlXG4gICAgLy8gZXZlbnRzIHRvIHRoZWlyIHBhcmVudC4gV2UgY291bGQgYWxzbyBnbyB0aHJvdWdoIHBhcmVudE5vZGUgb24gdGhlXG4gICAgLy8gaG9zdCBub2RlIGJ1dCB0aGF0IHdvdWxkbid0IHdvcmsgZm9yIFJlYWN0IE5hdGl2ZSBhbmQgZG9lc24ndCBsZXQgdXNcbiAgICAvLyBkbyB0aGUgcG9ydGFsIGZlYXR1cmUuXG4gIH0gd2hpbGUgKGluc3QgJiYgaW5zdC50YWcgIT09IEhvc3RDb21wb25lbnQpO1xuXG4gIGlmIChpbnN0KSB7XG4gICAgcmV0dXJuIGluc3Q7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogUmV0dXJuIHRoZSBsb3dlc3QgY29tbW9uIGFuY2VzdG9yIG9mIEEgYW5kIEIsIG9yIG51bGwgaWYgdGhleSBhcmUgaW5cbiAqIGRpZmZlcmVudCB0cmVlcy5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldExvd2VzdENvbW1vbkFuY2VzdG9yKGluc3RBLCBpbnN0Qikge1xuICB2YXIgbm9kZUEgPSBpbnN0QTtcbiAgdmFyIG5vZGVCID0gaW5zdEI7XG4gIHZhciBkZXB0aEEgPSAwO1xuXG4gIGZvciAodmFyIHRlbXBBID0gbm9kZUE7IHRlbXBBOyB0ZW1wQSA9IGdldFBhcmVudCh0ZW1wQSkpIHtcbiAgICBkZXB0aEErKztcbiAgfVxuXG4gIHZhciBkZXB0aEIgPSAwO1xuXG4gIGZvciAodmFyIHRlbXBCID0gbm9kZUI7IHRlbXBCOyB0ZW1wQiA9IGdldFBhcmVudCh0ZW1wQikpIHtcbiAgICBkZXB0aEIrKztcbiAgfSAvLyBJZiBBIGlzIGRlZXBlciwgY3Jhd2wgdXAuXG5cblxuICB3aGlsZSAoZGVwdGhBIC0gZGVwdGhCID4gMCkge1xuICAgIG5vZGVBID0gZ2V0UGFyZW50KG5vZGVBKTtcbiAgICBkZXB0aEEtLTtcbiAgfSAvLyBJZiBCIGlzIGRlZXBlciwgY3Jhd2wgdXAuXG5cblxuICB3aGlsZSAoZGVwdGhCIC0gZGVwdGhBID4gMCkge1xuICAgIG5vZGVCID0gZ2V0UGFyZW50KG5vZGVCKTtcbiAgICBkZXB0aEItLTtcbiAgfSAvLyBXYWxrIGluIGxvY2tzdGVwIHVudGlsIHdlIGZpbmQgYSBtYXRjaC5cblxuXG4gIHZhciBkZXB0aCA9IGRlcHRoQTtcblxuICB3aGlsZSAoZGVwdGgtLSkge1xuICAgIGlmIChub2RlQSA9PT0gbm9kZUIgfHwgbm9kZUIgIT09IG51bGwgJiYgbm9kZUEgPT09IG5vZGVCLmFsdGVybmF0ZSkge1xuICAgICAgcmV0dXJuIG5vZGVBO1xuICAgIH1cblxuICAgIG5vZGVBID0gZ2V0UGFyZW50KG5vZGVBKTtcbiAgICBub2RlQiA9IGdldFBhcmVudChub2RlQik7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gYWNjdW11bGF0ZUVudGVyTGVhdmVMaXN0ZW5lcnNGb3JFdmVudChkaXNwYXRjaFF1ZXVlLCBldmVudCwgdGFyZ2V0LCBjb21tb24sIGluQ2FwdHVyZVBoYXNlKSB7XG4gIHZhciByZWdpc3RyYXRpb25OYW1lID0gZXZlbnQuX3JlYWN0TmFtZTtcbiAgdmFyIGxpc3RlbmVycyA9IFtdO1xuICB2YXIgaW5zdGFuY2UgPSB0YXJnZXQ7XG5cbiAgd2hpbGUgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgaWYgKGluc3RhbmNlID09PSBjb21tb24pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBfaW5zdGFuY2U0ID0gaW5zdGFuY2UsXG4gICAgICAgIGFsdGVybmF0ZSA9IF9pbnN0YW5jZTQuYWx0ZXJuYXRlLFxuICAgICAgICBzdGF0ZU5vZGUgPSBfaW5zdGFuY2U0LnN0YXRlTm9kZSxcbiAgICAgICAgdGFnID0gX2luc3RhbmNlNC50YWc7XG5cbiAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsICYmIGFsdGVybmF0ZSA9PT0gY29tbW9uKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSBIb3N0Q29tcG9uZW50ICYmIHN0YXRlTm9kZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIGN1cnJlbnRUYXJnZXQgPSBzdGF0ZU5vZGU7XG5cbiAgICAgIGlmIChpbkNhcHR1cmVQaGFzZSkge1xuICAgICAgICB2YXIgY2FwdHVyZUxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoaW5zdGFuY2UsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuXG4gICAgICAgIGlmIChjYXB0dXJlTGlzdGVuZXIgIT0gbnVsbCkge1xuICAgICAgICAgIGxpc3RlbmVycy51bnNoaWZ0KGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGNhcHR1cmVMaXN0ZW5lciwgY3VycmVudFRhcmdldCkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFpbkNhcHR1cmVQaGFzZSkge1xuICAgICAgICB2YXIgYnViYmxlTGlzdGVuZXIgPSBnZXRMaXN0ZW5lcihpbnN0YW5jZSwgcmVnaXN0cmF0aW9uTmFtZSk7XG5cbiAgICAgICAgaWYgKGJ1YmJsZUxpc3RlbmVyICE9IG51bGwpIHtcbiAgICAgICAgICBsaXN0ZW5lcnMucHVzaChjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBidWJibGVMaXN0ZW5lciwgY3VycmVudFRhcmdldCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5zdGFuY2UgPSBpbnN0YW5jZS5yZXR1cm47XG4gIH1cblxuICBpZiAobGlzdGVuZXJzLmxlbmd0aCAhPT0gMCkge1xuICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICBldmVudDogZXZlbnQsXG4gICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVyc1xuICAgIH0pO1xuICB9XG59IC8vIFdlIHNob3VsZCBvbmx5IHVzZSB0aGlzIGZ1bmN0aW9uIGZvcjpcbi8vIC0gRW50ZXJMZWF2ZUV2ZW50UGx1Z2luXG4vLyBUaGlzIGlzIGJlY2F1c2Ugd2Ugb25seSBwcm9jZXNzIHRoaXMgcGx1Z2luXG4vLyBpbiB0aGUgYnViYmxlIHBoYXNlLCBzbyB3ZSBuZWVkIHRvIGFjY3VtdWxhdGUgdHdvXG4vLyBwaGFzZSBldmVudCBsaXN0ZW5lcnMuXG5cblxuZnVuY3Rpb24gYWNjdW11bGF0ZUVudGVyTGVhdmVUd29QaGFzZUxpc3RlbmVycyhkaXNwYXRjaFF1ZXVlLCBsZWF2ZUV2ZW50LCBlbnRlckV2ZW50LCBmcm9tLCB0bykge1xuICB2YXIgY29tbW9uID0gZnJvbSAmJiB0byA/IGdldExvd2VzdENvbW1vbkFuY2VzdG9yKGZyb20sIHRvKSA6IG51bGw7XG5cbiAgaWYgKGZyb20gIT09IG51bGwpIHtcbiAgICBhY2N1bXVsYXRlRW50ZXJMZWF2ZUxpc3RlbmVyc0ZvckV2ZW50KGRpc3BhdGNoUXVldWUsIGxlYXZlRXZlbnQsIGZyb20sIGNvbW1vbiwgZmFsc2UpO1xuICB9XG5cbiAgaWYgKHRvICE9PSBudWxsICYmIGVudGVyRXZlbnQgIT09IG51bGwpIHtcbiAgICBhY2N1bXVsYXRlRW50ZXJMZWF2ZUxpc3RlbmVyc0ZvckV2ZW50KGRpc3BhdGNoUXVldWUsIGVudGVyRXZlbnQsIHRvLCBjb21tb24sIHRydWUpO1xuICB9XG59XG5mdW5jdGlvbiBnZXRMaXN0ZW5lclNldEtleShkb21FdmVudE5hbWUsIGNhcHR1cmUpIHtcbiAgcmV0dXJuIGRvbUV2ZW50TmFtZSArIFwiX19cIiArIChjYXB0dXJlID8gJ2NhcHR1cmUnIDogJ2J1YmJsZScpO1xufVxuXG52YXIgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSBmYWxzZTtcbnZhciBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCA9ICdkYW5nZXJvdXNseVNldElubmVySFRNTCc7XG52YXIgU1VQUFJFU1NfQ09OVEVOVF9FRElUQUJMRV9XQVJOSU5HID0gJ3N1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyc7XG52YXIgU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcgPSAnc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJztcbnZhciBBVVRPRk9DVVMgPSAnYXV0b0ZvY3VzJztcbnZhciBDSElMRFJFTiA9ICdjaGlsZHJlbic7XG52YXIgU1RZTEUgPSAnc3R5bGUnO1xudmFyIEhUTUwkMSA9ICdfX2h0bWwnO1xudmFyIHdhcm5lZFVua25vd25UYWdzO1xudmFyIHZhbGlkYXRlUHJvcGVydGllc0luRGV2ZWxvcG1lbnQ7XG52YXIgd2FybkZvclByb3BEaWZmZXJlbmNlO1xudmFyIHdhcm5Gb3JFeHRyYUF0dHJpYnV0ZXM7XG52YXIgd2FybkZvckludmFsaWRFdmVudExpc3RlbmVyO1xudmFyIGNhbkRpZmZTdHlsZUZvckh5ZHJhdGlvbldhcm5pbmc7XG52YXIgbm9ybWFsaXplSFRNTDtcblxue1xuICB3YXJuZWRVbmtub3duVGFncyA9IHtcbiAgICAvLyBUaGVyZSBhcmUgd29ya2luZyBwb2x5ZmlsbHMgZm9yIDxkaWFsb2c+LiBMZXQgcGVvcGxlIHVzZSBpdC5cbiAgICBkaWFsb2c6IHRydWUsXG4gICAgLy8gRWxlY3Ryb24gc2hpcHMgYSBjdXN0b20gPHdlYnZpZXc+IHRhZyB0byBkaXNwbGF5IGV4dGVybmFsIHdlYiBjb250ZW50IGluXG4gICAgLy8gYW4gaXNvbGF0ZWQgZnJhbWUgYW5kIHByb2Nlc3MuXG4gICAgLy8gVGhpcyB0YWcgaXMgbm90IHByZXNlbnQgaW4gbm9uIEVsZWN0cm9uIGVudmlyb25tZW50cyBzdWNoIGFzIEpTRG9tIHdoaWNoXG4gICAgLy8gaXMgb2Z0ZW4gdXNlZCBmb3IgdGVzdGluZyBwdXJwb3Nlcy5cbiAgICAvLyBAc2VlIGh0dHBzOi8vZWxlY3Ryb25qcy5vcmcvZG9jcy9hcGkvd2Vidmlldy10YWdcbiAgICB3ZWJ2aWV3OiB0cnVlXG4gIH07XG5cbiAgdmFsaWRhdGVQcm9wZXJ0aWVzSW5EZXZlbG9wbWVudCA9IGZ1bmN0aW9uICh0eXBlLCBwcm9wcykge1xuICAgIHZhbGlkYXRlUHJvcGVydGllcyh0eXBlLCBwcm9wcyk7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzJDEodHlwZSwgcHJvcHMpO1xuICAgIHZhbGlkYXRlUHJvcGVydGllcyQyKHR5cGUsIHByb3BzLCB7XG4gICAgICByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzOiByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLFxuICAgICAgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lczogcG9zc2libGVSZWdpc3RyYXRpb25OYW1lc1xuICAgIH0pO1xuICB9OyAvLyBJRSAxMSBwYXJzZXMgJiBub3JtYWxpemVzIHRoZSBzdHlsZSBhdHRyaWJ1dGUgYXMgb3Bwb3NlZCB0byBvdGhlclxuICAvLyBicm93c2Vycy4gSXQgYWRkcyBzcGFjZXMgYW5kIHNvcnRzIHRoZSBwcm9wZXJ0aWVzIGluIHNvbWVcbiAgLy8gbm9uLWFscGhhYmV0aWNhbCBvcmRlci4gSGFuZGxpbmcgdGhhdCB3b3VsZCByZXF1aXJlIHNvcnRpbmcgQ1NTXG4gIC8vIHByb3BlcnRpZXMgaW4gdGhlIGNsaWVudCAmIHNlcnZlciB2ZXJzaW9ucyBvciBhcHBseWluZ1xuICAvLyBgZXhwZWN0ZWRTdHlsZWAgdG8gYSB0ZW1wb3JhcnkgRE9NIG5vZGUgdG8gcmVhZCBpdHMgYHN0eWxlYCBhdHRyaWJ1dGVcbiAgLy8gbm9ybWFsaXplZC4gU2luY2UgaXQgb25seSBhZmZlY3RzIElFLCB3ZSdyZSBza2lwcGluZyBzdHlsZSB3YXJuaW5nc1xuICAvLyBpbiB0aGF0IGJyb3dzZXIgY29tcGxldGVseSBpbiBmYXZvciBvZiBkb2luZyBhbGwgdGhhdCB3b3JrLlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMTgwN1xuXG5cbiAgY2FuRGlmZlN0eWxlRm9ySHlkcmF0aW9uV2FybmluZyA9IGNhblVzZURPTSAmJiAhZG9jdW1lbnQuZG9jdW1lbnRNb2RlO1xuXG4gIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZSA9IGZ1bmN0aW9uIChwcm9wTmFtZSwgc2VydmVyVmFsdWUsIGNsaWVudFZhbHVlKSB7XG4gICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG5vcm1hbGl6ZWRDbGllbnRWYWx1ZSA9IG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShjbGllbnRWYWx1ZSk7XG4gICAgdmFyIG5vcm1hbGl6ZWRTZXJ2ZXJWYWx1ZSA9IG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShzZXJ2ZXJWYWx1ZSk7XG5cbiAgICBpZiAobm9ybWFsaXplZFNlcnZlclZhbHVlID09PSBub3JtYWxpemVkQ2xpZW50VmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG5cbiAgICBlcnJvcignUHJvcCBgJXNgIGRpZCBub3QgbWF0Y2guIFNlcnZlcjogJXMgQ2xpZW50OiAlcycsIHByb3BOYW1lLCBKU09OLnN0cmluZ2lmeShub3JtYWxpemVkU2VydmVyVmFsdWUpLCBKU09OLnN0cmluZ2lmeShub3JtYWxpemVkQ2xpZW50VmFsdWUpKTtcbiAgfTtcblxuICB3YXJuRm9yRXh0cmFBdHRyaWJ1dGVzID0gZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWVzKSB7XG4gICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuICAgIHZhciBuYW1lcyA9IFtdO1xuICAgIGF0dHJpYnV0ZU5hbWVzLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIG5hbWVzLnB1c2gobmFtZSk7XG4gICAgfSk7XG5cbiAgICBlcnJvcignRXh0cmEgYXR0cmlidXRlcyBmcm9tIHRoZSBzZXJ2ZXI6ICVzJywgbmFtZXMpO1xuICB9O1xuXG4gIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uIChyZWdpc3RyYXRpb25OYW1lLCBsaXN0ZW5lcikge1xuICAgIGlmIChsaXN0ZW5lciA9PT0gZmFsc2UpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCBgJXNgIGxpc3RlbmVyIHRvIGJlIGEgZnVuY3Rpb24sIGluc3RlYWQgZ290IGBmYWxzZWAuXFxuXFxuJyArICdJZiB5b3UgdXNlZCB0byBjb25kaXRpb25hbGx5IG9taXQgaXQgd2l0aCAlcz17Y29uZGl0aW9uICYmIHZhbHVlfSwgJyArICdwYXNzICVzPXtjb25kaXRpb24gPyB2YWx1ZSA6IHVuZGVmaW5lZH0gaW5zdGVhZC4nLCByZWdpc3RyYXRpb25OYW1lLCByZWdpc3RyYXRpb25OYW1lLCByZWdpc3RyYXRpb25OYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIGAlc2AgbGlzdGVuZXIgdG8gYmUgYSBmdW5jdGlvbiwgaW5zdGVhZCBnb3QgYSB2YWx1ZSBvZiBgJXNgIHR5cGUuJywgcmVnaXN0cmF0aW9uTmFtZSwgdHlwZW9mIGxpc3RlbmVyKTtcbiAgICB9XG4gIH07IC8vIFBhcnNlIHRoZSBIVE1MIGFuZCByZWFkIGl0IGJhY2sgdG8gbm9ybWFsaXplIHRoZSBIVE1MIHN0cmluZyBzbyB0aGF0IGl0XG4gIC8vIGNhbiBiZSB1c2VkIGZvciBjb21wYXJpc29uLlxuXG5cbiAgbm9ybWFsaXplSFRNTCA9IGZ1bmN0aW9uIChwYXJlbnQsIGh0bWwpIHtcbiAgICAvLyBXZSBjb3VsZCBoYXZlIGNyZWF0ZWQgYSBzZXBhcmF0ZSBkb2N1bWVudCBoZXJlIHRvIGF2b2lkXG4gICAgLy8gcmUtaW5pdGlhbGl6aW5nIGN1c3RvbSBlbGVtZW50cyBpZiB0aGV5IGV4aXN0LiBCdXQgdGhpcyBicmVha3NcbiAgICAvLyBob3cgPG5vc2NyaXB0PiBpcyBiZWluZyBoYW5kbGVkLiBTbyB3ZSB1c2UgdGhlIHNhbWUgZG9jdW1lbnQuXG4gICAgLy8gU2VlIHRoZSBkaXNjdXNzaW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzExMTU3LlxuICAgIHZhciB0ZXN0RWxlbWVudCA9IHBhcmVudC5uYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFID8gcGFyZW50Lm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudChwYXJlbnQudGFnTmFtZSkgOiBwYXJlbnQub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMocGFyZW50Lm5hbWVzcGFjZVVSSSwgcGFyZW50LnRhZ05hbWUpO1xuICAgIHRlc3RFbGVtZW50LmlubmVySFRNTCA9IGh0bWw7XG4gICAgcmV0dXJuIHRlc3RFbGVtZW50LmlubmVySFRNTDtcbiAgfTtcbn0gLy8gSFRNTCBwYXJzaW5nIG5vcm1hbGl6ZXMgQ1IgYW5kIENSTEYgdG8gTEYuXG4vLyBJdCBhbHNvIGNhbiB0dXJuIFxcdTAwMDAgaW50byBcXHVGRkZEIGluc2lkZSBhdHRyaWJ1dGVzLlxuLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L3NpbmdsZS1wYWdlLmh0bWwjcHJlcHJvY2Vzc2luZy10aGUtaW5wdXQtc3RyZWFtXG4vLyBJZiB3ZSBoYXZlIGEgbWlzbWF0Y2gsIGl0IG1pZ2h0IGJlIGNhdXNlZCBieSB0aGF0LlxuLy8gV2Ugd2lsbCBzdGlsbCBwYXRjaCB1cCBpbiB0aGlzIGNhc2UgYnV0IG5vdCBmaXJlIHRoZSB3YXJuaW5nLlxuXG5cbnZhciBOT1JNQUxJWkVfTkVXTElORVNfUkVHRVggPSAvXFxyXFxuPy9nO1xudmFyIE5PUk1BTElaRV9OVUxMX0FORF9SRVBMQUNFTUVOVF9SRUdFWCA9IC9cXHUwMDAwfFxcdUZGRkQvZztcblxuZnVuY3Rpb24gbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlKG1hcmt1cCkge1xuICB7XG4gICAgY2hlY2tIdG1sU3RyaW5nQ29lcmNpb24obWFya3VwKTtcbiAgfVxuXG4gIHZhciBtYXJrdXBTdHJpbmcgPSB0eXBlb2YgbWFya3VwID09PSAnc3RyaW5nJyA/IG1hcmt1cCA6ICcnICsgbWFya3VwO1xuICByZXR1cm4gbWFya3VwU3RyaW5nLnJlcGxhY2UoTk9STUFMSVpFX05FV0xJTkVTX1JFR0VYLCAnXFxuJykucmVwbGFjZShOT1JNQUxJWkVfTlVMTF9BTkRfUkVQTEFDRU1FTlRfUkVHRVgsICcnKTtcbn1cblxuZnVuY3Rpb24gY2hlY2tGb3JVbm1hdGNoZWRUZXh0KHNlcnZlclRleHQsIGNsaWVudFRleHQsIGlzQ29uY3VycmVudE1vZGUsIHNob3VsZFdhcm5EZXYpIHtcbiAgdmFyIG5vcm1hbGl6ZWRDbGllbnRUZXh0ID0gbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlKGNsaWVudFRleHQpO1xuICB2YXIgbm9ybWFsaXplZFNlcnZlclRleHQgPSBub3JtYWxpemVNYXJrdXBGb3JUZXh0T3JBdHRyaWJ1dGUoc2VydmVyVGV4dCk7XG5cbiAgaWYgKG5vcm1hbGl6ZWRTZXJ2ZXJUZXh0ID09PSBub3JtYWxpemVkQ2xpZW50VGV4dCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChzaG91bGRXYXJuRGV2KSB7XG4gICAge1xuICAgICAgaWYgKCFkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJ1RleHQgY29udGVudCBkaWQgbm90IG1hdGNoLiBTZXJ2ZXI6IFwiJXNcIiBDbGllbnQ6IFwiJXNcIicsIG5vcm1hbGl6ZWRTZXJ2ZXJUZXh0LCBub3JtYWxpemVkQ2xpZW50VGV4dCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGlzQ29uY3VycmVudE1vZGUgJiYgZW5hYmxlQ2xpZW50UmVuZGVyRmFsbGJhY2tPblRleHRNaXNtYXRjaCkge1xuICAgIC8vIEluIGNvbmN1cnJlbnQgcm9vdHMsIHdlIHRocm93IHdoZW4gdGhlcmUncyBhIHRleHQgbWlzbWF0Y2ggYW5kIHJldmVydCB0b1xuICAgIC8vIGNsaWVudCByZW5kZXJpbmcsIHVwIHRvIHRoZSBuZWFyZXN0IFN1c3BlbnNlIGJvdW5kYXJ5LlxuICAgIHRocm93IG5ldyBFcnJvcignVGV4dCBjb250ZW50IGRvZXMgbm90IG1hdGNoIHNlcnZlci1yZW5kZXJlZCBIVE1MLicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldE93bmVyRG9jdW1lbnRGcm9tUm9vdENvbnRhaW5lcihyb290Q29udGFpbmVyRWxlbWVudCkge1xuICByZXR1cm4gcm9vdENvbnRhaW5lckVsZW1lbnQubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgPyByb290Q29udGFpbmVyRWxlbWVudCA6IHJvb3RDb250YWluZXJFbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG59XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5mdW5jdGlvbiB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChub2RlKSB7XG4gIC8vIE1vYmlsZSBTYWZhcmkgZG9lcyBub3QgZmlyZSBwcm9wZXJseSBidWJibGUgY2xpY2sgZXZlbnRzIG9uXG4gIC8vIG5vbi1pbnRlcmFjdGl2ZSBlbGVtZW50cywgd2hpY2ggbWVhbnMgZGVsZWdhdGVkIGNsaWNrIGxpc3RlbmVycyBkbyBub3RcbiAgLy8gZmlyZS4gVGhlIHdvcmthcm91bmQgZm9yIHRoaXMgYnVnIGludm9sdmVzIGF0dGFjaGluZyBhbiBlbXB0eSBjbGlja1xuICAvLyBsaXN0ZW5lciBvbiB0aGUgdGFyZ2V0IG5vZGUuXG4gIC8vIGh0dHBzOi8vd3d3LnF1aXJrc21vZGUub3JnL2Jsb2cvYXJjaGl2ZXMvMjAxMC8wOS9jbGlja19ldmVudF9kZWwuaHRtbFxuICAvLyBKdXN0IHNldCBpdCB1c2luZyB0aGUgb25jbGljayBwcm9wZXJ0eSBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gbWFuYWdlIGFueVxuICAvLyBib29ra2VlcGluZyBmb3IgaXQuIE5vdCBzdXJlIGlmIHdlIG5lZWQgdG8gY2xlYXIgaXQgd2hlbiB0aGUgbGlzdGVuZXIgaXNcbiAgLy8gcmVtb3ZlZC5cbiAgLy8gVE9ETzogT25seSBkbyB0aGlzIGZvciB0aGUgcmVsZXZhbnQgU2FmYXJpcyBtYXliZT9cbiAgbm9kZS5vbmNsaWNrID0gbm9vcDtcbn1cblxuZnVuY3Rpb24gc2V0SW5pdGlhbERPTVByb3BlcnRpZXModGFnLCBkb21FbGVtZW50LCByb290Q29udGFpbmVyRWxlbWVudCwgbmV4dFByb3BzLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICBmb3IgKHZhciBwcm9wS2V5IGluIG5leHRQcm9wcykge1xuICAgIGlmICghbmV4dFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgbmV4dFByb3AgPSBuZXh0UHJvcHNbcHJvcEtleV07XG5cbiAgICBpZiAocHJvcEtleSA9PT0gU1RZTEUpIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKG5leHRQcm9wKSB7XG4gICAgICAgICAgLy8gRnJlZXplIHRoZSBuZXh0IHN0eWxlIG9iamVjdCBzbyB0aGF0IHdlIGNhbiBhc3N1bWUgaXQgd29uJ3QgYmVcbiAgICAgICAgICAvLyBtdXRhdGVkLiBXZSBoYXZlIGFscmVhZHkgd2FybmVkIGZvciB0aGlzIGluIHRoZSBwYXN0LlxuICAgICAgICAgIE9iamVjdC5mcmVlemUobmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9IC8vIFJlbGllcyBvbiBgdXBkYXRlU3R5bGVzQnlJRGAgbm90IG11dGF0aW5nIGBzdHlsZVVwZGF0ZXNgLlxuXG5cbiAgICAgIHNldFZhbHVlRm9yU3R5bGVzKGRvbUVsZW1lbnQsIG5leHRQcm9wKTtcbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MKSB7XG4gICAgICB2YXIgbmV4dEh0bWwgPSBuZXh0UHJvcCA/IG5leHRQcm9wW0hUTUwkMV0gOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChuZXh0SHRtbCAhPSBudWxsKSB7XG4gICAgICAgIHNldElubmVySFRNTChkb21FbGVtZW50LCBuZXh0SHRtbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBDSElMRFJFTikge1xuICAgICAgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gQXZvaWQgc2V0dGluZyBpbml0aWFsIHRleHRDb250ZW50IHdoZW4gdGhlIHRleHQgaXMgZW1wdHkuIEluIElFMTEgc2V0dGluZ1xuICAgICAgICAvLyB0ZXh0Q29udGVudCBvbiBhIDx0ZXh0YXJlYT4gd2lsbCBjYXVzZSB0aGUgcGxhY2Vob2xkZXIgdG8gbm90XG4gICAgICAgIC8vIHNob3cgd2l0aGluIHRoZSA8dGV4dGFyZWE+IHVudGlsIGl0IGhhcyBiZWVuIGZvY3VzZWQgYW5kIGJsdXJyZWQgYWdhaW4uXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNjczMSNpc3N1ZWNvbW1lbnQtMjU0ODc0NTUzXG4gICAgICAgIHZhciBjYW5TZXRUZXh0Q29udGVudCA9IHRhZyAhPT0gJ3RleHRhcmVhJyB8fCBuZXh0UHJvcCAhPT0gJyc7XG5cbiAgICAgICAgaWYgKGNhblNldFRleHRDb250ZW50KSB7XG4gICAgICAgICAgc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCwgbmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCwgJycgKyBuZXh0UHJvcCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgfHwgcHJvcEtleSA9PT0gU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcpIDsgZWxzZSBpZiAocHJvcEtleSA9PT0gQVVUT0ZPQ1VTKSA7IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGlmIChuZXh0UHJvcCAhPSBudWxsKSB7XG4gICAgICAgIGlmICggdHlwZW9mIG5leHRQcm9wICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgd2FybkZvckludmFsaWRFdmVudExpc3RlbmVyKHByb3BLZXksIG5leHRQcm9wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wS2V5ID09PSAnb25TY3JvbGwnKSB7XG4gICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnc2Nyb2xsJywgZG9tRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5leHRQcm9wICE9IG51bGwpIHtcbiAgICAgIHNldFZhbHVlRm9yUHJvcGVydHkoZG9tRWxlbWVudCwgcHJvcEtleSwgbmV4dFByb3AsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlRE9NUHJvcGVydGllcyhkb21FbGVtZW50LCB1cGRhdGVQYXlsb2FkLCB3YXNDdXN0b21Db21wb25lbnRUYWcsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIC8vIFRPRE86IEhhbmRsZSB3YXNDdXN0b21Db21wb25lbnRUYWdcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB1cGRhdGVQYXlsb2FkLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgdmFyIHByb3BLZXkgPSB1cGRhdGVQYXlsb2FkW2ldO1xuICAgIHZhciBwcm9wVmFsdWUgPSB1cGRhdGVQYXlsb2FkW2kgKyAxXTtcblxuICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAgc2V0VmFsdWVGb3JTdHlsZXMoZG9tRWxlbWVudCwgcHJvcFZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MKSB7XG4gICAgICBzZXRJbm5lckhUTUwoZG9tRWxlbWVudCwgcHJvcFZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IENISUxEUkVOKSB7XG4gICAgICBzZXRUZXh0Q29udGVudChkb21FbGVtZW50LCBwcm9wVmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRWYWx1ZUZvclByb3BlcnR5KGRvbUVsZW1lbnQsIHByb3BLZXksIHByb3BWYWx1ZSwgaXNDdXN0b21Db21wb25lbnRUYWcpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KHR5cGUsIHByb3BzLCByb290Q29udGFpbmVyRWxlbWVudCwgcGFyZW50TmFtZXNwYWNlKSB7XG4gIHZhciBpc0N1c3RvbUNvbXBvbmVudFRhZzsgLy8gV2UgY3JlYXRlIHRhZ3MgaW4gdGhlIG5hbWVzcGFjZSBvZiB0aGVpciBwYXJlbnQgY29udGFpbmVyLCBleGNlcHQgSFRNTFxuICAvLyB0YWdzIGdldCBubyBuYW1lc3BhY2UuXG5cbiAgdmFyIG93bmVyRG9jdW1lbnQgPSBnZXRPd25lckRvY3VtZW50RnJvbVJvb3RDb250YWluZXIocm9vdENvbnRhaW5lckVsZW1lbnQpO1xuICB2YXIgZG9tRWxlbWVudDtcbiAgdmFyIG5hbWVzcGFjZVVSSSA9IHBhcmVudE5hbWVzcGFjZTtcblxuICBpZiAobmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgIG5hbWVzcGFjZVVSSSA9IGdldEludHJpbnNpY05hbWVzcGFjZSh0eXBlKTtcbiAgfVxuXG4gIGlmIChuYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAge1xuICAgICAgaXNDdXN0b21Db21wb25lbnRUYWcgPSBpc0N1c3RvbUNvbXBvbmVudCh0eXBlLCBwcm9wcyk7IC8vIFNob3VsZCB0aGlzIGNoZWNrIGJlIGdhdGVkIGJ5IHBhcmVudCBuYW1lc3BhY2U/IE5vdCBzdXJlIHdlIHdhbnQgdG9cbiAgICAgIC8vIGFsbG93IDxTVkc+IG9yIDxtQVRIPi5cblxuICAgICAgaWYgKCFpc0N1c3RvbUNvbXBvbmVudFRhZyAmJiB0eXBlICE9PSB0eXBlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgZXJyb3IoJzwlcyAvPiBpcyB1c2luZyBpbmNvcnJlY3QgY2FzaW5nLiAnICsgJ1VzZSBQYXNjYWxDYXNlIGZvciBSZWFjdCBjb21wb25lbnRzLCAnICsgJ29yIGxvd2VyY2FzZSBmb3IgSFRNTCBlbGVtZW50cy4nLCB0eXBlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gJ3NjcmlwdCcpIHtcbiAgICAgIC8vIENyZWF0ZSB0aGUgc2NyaXB0IHZpYSAuaW5uZXJIVE1MIHNvIGl0cyBcInBhcnNlci1pbnNlcnRlZFwiIGZsYWcgaXNcbiAgICAgIC8vIHNldCB0byB0cnVlIGFuZCBpdCBkb2VzIG5vdCBleGVjdXRlXG4gICAgICB2YXIgZGl2ID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgZGl2LmlubmVySFRNTCA9ICc8c2NyaXB0PjwnICsgJy9zY3JpcHQ+JzsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgLy8gVGhpcyBpcyBndWFyYW50ZWVkIHRvIHlpZWxkIGEgc2NyaXB0IGVsZW1lbnQuXG5cbiAgICAgIHZhciBmaXJzdENoaWxkID0gZGl2LmZpcnN0Q2hpbGQ7XG4gICAgICBkb21FbGVtZW50ID0gZGl2LnJlbW92ZUNoaWxkKGZpcnN0Q2hpbGQpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHByb3BzLmlzID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gJEZsb3dJc3N1ZSBgY3JlYXRlRWxlbWVudGAgc2hvdWxkIGJlIHVwZGF0ZWQgZm9yIFdlYiBDb21wb25lbnRzXG4gICAgICBkb21FbGVtZW50ID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KHR5cGUsIHtcbiAgICAgICAgaXM6IHByb3BzLmlzXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2VwYXJhdGUgZWxzZSBicmFuY2ggaW5zdGVhZCBvZiB1c2luZyBgcHJvcHMuaXMgfHwgdW5kZWZpbmVkYCBhYm92ZSBiZWNhdXNlIG9mIGEgRmlyZWZveCBidWcuXG4gICAgICAvLyBTZWUgZGlzY3Vzc2lvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC82ODk2XG4gICAgICAvLyBhbmQgZGlzY3Vzc2lvbiBpbiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjc2MjQwXG4gICAgICBkb21FbGVtZW50ID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KHR5cGUpOyAvLyBOb3JtYWxseSBhdHRyaWJ1dGVzIGFyZSBhc3NpZ25lZCBpbiBgc2V0SW5pdGlhbERPTVByb3BlcnRpZXNgLCBob3dldmVyIHRoZSBgbXVsdGlwbGVgIGFuZCBgc2l6ZWBcbiAgICAgIC8vIGF0dHJpYnV0ZXMgb24gYHNlbGVjdGBzIG5lZWRzIHRvIGJlIGFkZGVkIGJlZm9yZSBgb3B0aW9uYHMgYXJlIGluc2VydGVkLlxuICAgICAgLy8gVGhpcyBwcmV2ZW50czpcbiAgICAgIC8vIC0gYSBidWcgd2hlcmUgdGhlIGBzZWxlY3RgIGRvZXMgbm90IHNjcm9sbCB0byB0aGUgY29ycmVjdCBvcHRpb24gYmVjYXVzZSBzaW5ndWxhclxuICAgICAgLy8gIGBzZWxlY3RgIGVsZW1lbnRzIGF1dG9tYXRpY2FsbHkgcGljayB0aGUgZmlyc3QgaXRlbSAjMTMyMjJcbiAgICAgIC8vIC0gYSBidWcgd2hlcmUgdGhlIGBzZWxlY3RgIHNldCB0aGUgZmlyc3QgaXRlbSBhcyBzZWxlY3RlZCBkZXNwaXRlIHRoZSBgc2l6ZWAgYXR0cmlidXRlICMxNDIzOVxuICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTMyMjJcbiAgICAgIC8vIGFuZCBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE0MjM5XG5cbiAgICAgIGlmICh0eXBlID09PSAnc2VsZWN0Jykge1xuICAgICAgICB2YXIgbm9kZSA9IGRvbUVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKHByb3BzLm11bHRpcGxlKSB7XG4gICAgICAgICAgbm9kZS5tdWx0aXBsZSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAocHJvcHMuc2l6ZSkge1xuICAgICAgICAgIC8vIFNldHRpbmcgYSBzaXplIGdyZWF0ZXIgdGhhbiAxIGNhdXNlcyBhIHNlbGVjdCB0byBiZWhhdmUgbGlrZSBgbXVsdGlwbGU9dHJ1ZWAsIHdoZXJlXG4gICAgICAgICAgLy8gaXQgaXMgcG9zc2libGUgdGhhdCBubyBvcHRpb24gaXMgc2VsZWN0ZWQuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBUaGlzIGlzIG9ubHkgbmVjZXNzYXJ5IHdoZW4gYSBzZWxlY3QgaW4gXCJzaW5nbGUgc2VsZWN0aW9uIG1vZGVcIi5cbiAgICAgICAgICBub2RlLnNpemUgPSBwcm9wcy5zaXplO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGRvbUVsZW1lbnQgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2VVUkksIHR5cGUpO1xuICB9XG5cbiAge1xuICAgIGlmIChuYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICBpZiAoIWlzQ3VzdG9tQ29tcG9uZW50VGFnICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkb21FbGVtZW50KSA9PT0gJ1tvYmplY3QgSFRNTFVua25vd25FbGVtZW50XScgJiYgIWhhc093blByb3BlcnR5LmNhbGwod2FybmVkVW5rbm93blRhZ3MsIHR5cGUpKSB7XG4gICAgICAgIHdhcm5lZFVua25vd25UYWdzW3R5cGVdID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignVGhlIHRhZyA8JXM+IGlzIHVucmVjb2duaXplZCBpbiB0aGlzIGJyb3dzZXIuICcgKyAnSWYgeW91IG1lYW50IHRvIHJlbmRlciBhIFJlYWN0IGNvbXBvbmVudCwgc3RhcnQgaXRzIG5hbWUgd2l0aCAnICsgJ2FuIHVwcGVyY2FzZSBsZXR0ZXIuJywgdHlwZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRvbUVsZW1lbnQ7XG59XG5mdW5jdGlvbiBjcmVhdGVUZXh0Tm9kZSh0ZXh0LCByb290Q29udGFpbmVyRWxlbWVudCkge1xuICByZXR1cm4gZ2V0T3duZXJEb2N1bWVudEZyb21Sb290Q29udGFpbmVyKHJvb3RDb250YWluZXJFbGVtZW50KS5jcmVhdGVUZXh0Tm9kZSh0ZXh0KTtcbn1cbmZ1bmN0aW9uIHNldEluaXRpYWxQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHRhZywgcmF3UHJvcHMsIHJvb3RDb250YWluZXJFbGVtZW50KSB7XG4gIHZhciBpc0N1c3RvbUNvbXBvbmVudFRhZyA9IGlzQ3VzdG9tQ29tcG9uZW50KHRhZywgcmF3UHJvcHMpO1xuXG4gIHtcbiAgICB2YWxpZGF0ZVByb3BlcnRpZXNJbkRldmVsb3BtZW50KHRhZywgcmF3UHJvcHMpO1xuICB9IC8vIFRPRE86IE1ha2Ugc3VyZSB0aGF0IHdlIGNoZWNrIGlzTW91bnRlZCBiZWZvcmUgZmlyaW5nIGFueSBvZiB0aGVzZSBldmVudHMuXG5cblxuICB2YXIgcHJvcHM7XG5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdkaWFsb2cnOlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnY2FuY2VsJywgZG9tRWxlbWVudCk7XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdjbG9zZScsIGRvbUVsZW1lbnQpO1xuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnaWZyYW1lJzpcbiAgICBjYXNlICdvYmplY3QnOlxuICAgIGNhc2UgJ2VtYmVkJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBsb2FkIGV2ZW50LlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnbG9hZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndmlkZW8nOlxuICAgIGNhc2UgJ2F1ZGlvJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGVzZSBldmVudHMgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgYWxsIHRoZSBtZWRpYSBldmVudHMuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1lZGlhRXZlbnRUeXBlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KG1lZGlhRXZlbnRUeXBlc1tpXSwgZG9tRWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NvdXJjZSc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgZXJyb3IgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdlcnJvcicsIGRvbUVsZW1lbnQpO1xuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnaW1nJzpcbiAgICBjYXNlICdpbWFnZSc6XG4gICAgY2FzZSAnbGluayc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhlc2UgZXZlbnRzIGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIGVycm9yIGFuZCBsb2FkIGV2ZW50cy5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2Vycm9yJywgZG9tRWxlbWVudCk7XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdsb2FkJywgZG9tRWxlbWVudCk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdkZXRhaWxzJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSB0b2dnbGUgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCd0b2dnbGUnLCBkb21FbGVtZW50KTtcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIGluaXRXcmFwcGVyU3RhdGUoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgcHJvcHMgPSBnZXRIb3N0UHJvcHMoZG9tRWxlbWVudCwgcmF3UHJvcHMpOyAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgaW52YWxpZCBldmVudC5cblxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnaW52YWxpZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdvcHRpb24nOlxuICAgICAgdmFsaWRhdGVQcm9wcyhkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZSQxKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIHByb3BzID0gZ2V0SG9zdFByb3BzJDEoZG9tRWxlbWVudCwgcmF3UHJvcHMpOyAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgaW52YWxpZCBldmVudC5cblxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnaW52YWxpZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICBpbml0V3JhcHBlclN0YXRlJDIoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgcHJvcHMgPSBnZXRIb3N0UHJvcHMkMihkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LlxuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICB9XG5cbiAgYXNzZXJ0VmFsaWRQcm9wcyh0YWcsIHByb3BzKTtcbiAgc2V0SW5pdGlhbERPTVByb3BlcnRpZXModGFnLCBkb21FbGVtZW50LCByb290Q29udGFpbmVyRWxlbWVudCwgcHJvcHMsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKTtcblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB3ZSBjaGVjayBpZiB0aGlzIGlzIHN0aWxsIHVubW91bnRlZCBvciBkbyBhbnkgY2xlYW5cbiAgICAgIC8vIHVwIG5lY2Vzc2FyeSBzaW5jZSB3ZSBuZXZlciBzdG9wIHRyYWNraW5nIGFueW1vcmUuXG4gICAgICB0cmFjayhkb21FbGVtZW50KTtcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIoZG9tRWxlbWVudCwgcmF3UHJvcHMsIGZhbHNlKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgLy8gVE9ETzogTWFrZSBzdXJlIHdlIGNoZWNrIGlmIHRoaXMgaXMgc3RpbGwgdW5tb3VudGVkIG9yIGRvIGFueSBjbGVhblxuICAgICAgLy8gdXAgbmVjZXNzYXJ5IHNpbmNlIHdlIG5ldmVyIHN0b3AgdHJhY2tpbmcgYW55bW9yZS5cbiAgICAgIHRyYWNrKGRvbUVsZW1lbnQpO1xuICAgICAgcG9zdE1vdW50V3JhcHBlciQzKGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdvcHRpb24nOlxuICAgICAgcG9zdE1vdW50V3JhcHBlciQxKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIkMihkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAodHlwZW9mIHByb3BzLm9uQ2xpY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBjYXN0IG1heSBub3QgYmUgc291bmQgZm9yIFNWRywgTWF0aE1MIG9yIGN1c3RvbSBlbGVtZW50cy5cbiAgICAgICAgdHJhcENsaWNrT25Ob25JbnRlcmFjdGl2ZUVsZW1lbnQoZG9tRWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICB9XG59IC8vIENhbGN1bGF0ZSB0aGUgZGlmZiBiZXR3ZWVuIHRoZSB0d28gb2JqZWN0cy5cblxuZnVuY3Rpb24gZGlmZlByb3BlcnRpZXMoZG9tRWxlbWVudCwgdGFnLCBsYXN0UmF3UHJvcHMsIG5leHRSYXdQcm9wcywgcm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAge1xuICAgIHZhbGlkYXRlUHJvcGVydGllc0luRGV2ZWxvcG1lbnQodGFnLCBuZXh0UmF3UHJvcHMpO1xuICB9XG5cbiAgdmFyIHVwZGF0ZVBheWxvYWQgPSBudWxsO1xuICB2YXIgbGFzdFByb3BzO1xuICB2YXIgbmV4dFByb3BzO1xuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgbGFzdFByb3BzID0gZ2V0SG9zdFByb3BzKGRvbUVsZW1lbnQsIGxhc3RSYXdQcm9wcyk7XG4gICAgICBuZXh0UHJvcHMgPSBnZXRIb3N0UHJvcHMoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIGxhc3RQcm9wcyA9IGdldEhvc3RQcm9wcyQxKGRvbUVsZW1lbnQsIGxhc3RSYXdQcm9wcyk7XG4gICAgICBuZXh0UHJvcHMgPSBnZXRIb3N0UHJvcHMkMShkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICBsYXN0UHJvcHMgPSBnZXRIb3N0UHJvcHMkMihkb21FbGVtZW50LCBsYXN0UmF3UHJvcHMpO1xuICAgICAgbmV4dFByb3BzID0gZ2V0SG9zdFByb3BzJDIoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGxhc3RQcm9wcyA9IGxhc3RSYXdQcm9wcztcbiAgICAgIG5leHRQcm9wcyA9IG5leHRSYXdQcm9wcztcblxuICAgICAgaWYgKHR5cGVvZiBsYXN0UHJvcHMub25DbGljayAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgbmV4dFByb3BzLm9uQ2xpY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBjYXN0IG1heSBub3QgYmUgc291bmQgZm9yIFNWRywgTWF0aE1MIG9yIGN1c3RvbSBlbGVtZW50cy5cbiAgICAgICAgdHJhcENsaWNrT25Ob25JbnRlcmFjdGl2ZUVsZW1lbnQoZG9tRWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgYXNzZXJ0VmFsaWRQcm9wcyh0YWcsIG5leHRQcm9wcyk7XG4gIHZhciBwcm9wS2V5O1xuICB2YXIgc3R5bGVOYW1lO1xuICB2YXIgc3R5bGVVcGRhdGVzID0gbnVsbDtcblxuICBmb3IgKHByb3BLZXkgaW4gbGFzdFByb3BzKSB7XG4gICAgaWYgKG5leHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSB8fCAhbGFzdFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpIHx8IGxhc3RQcm9wc1twcm9wS2V5XSA9PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAocHJvcEtleSA9PT0gU1RZTEUpIHtcbiAgICAgIHZhciBsYXN0U3R5bGUgPSBsYXN0UHJvcHNbcHJvcEtleV07XG5cbiAgICAgIGZvciAoc3R5bGVOYW1lIGluIGxhc3RTdHlsZSkge1xuICAgICAgICBpZiAobGFzdFN0eWxlLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpIHtcbiAgICAgICAgICBpZiAoIXN0eWxlVXBkYXRlcykge1xuICAgICAgICAgICAgc3R5bGVVcGRhdGVzID0ge307XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc3R5bGVVcGRhdGVzW3N0eWxlTmFtZV0gPSAnJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gREFOR0VST1VTTFlfU0VUX0lOTkVSX0hUTUwgfHwgcHJvcEtleSA9PT0gQ0hJTERSRU4pIDsgZWxzZSBpZiAocHJvcEtleSA9PT0gU1VQUFJFU1NfQ09OVEVOVF9FRElUQUJMRV9XQVJOSU5HIHx8IHByb3BLZXkgPT09IFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HKSA7IGVsc2UgaWYgKHByb3BLZXkgPT09IEFVVE9GT0NVUykgOyBlbHNlIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlLiBJZiBhbnkgbGlzdGVuZXIgdXBkYXRlcyB3ZSBuZWVkIHRvIGVuc3VyZVxuICAgICAgLy8gdGhhdCB0aGUgXCJjdXJyZW50XCIgZmliZXIgcG9pbnRlciBnZXRzIHVwZGF0ZWQgc28gd2UgbmVlZCBhIGNvbW1pdFxuICAgICAgLy8gdG8gdXBkYXRlIHRoaXMgZWxlbWVudC5cbiAgICAgIGlmICghdXBkYXRlUGF5bG9hZCkge1xuICAgICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZvciBhbGwgb3RoZXIgZGVsZXRlZCBwcm9wZXJ0aWVzIHdlIGFkZCBpdCB0byB0aGUgcXVldWUuIFdlIHVzZVxuICAgICAgLy8gdGhlIGFsbG93ZWQgcHJvcGVydHkgbGlzdCBpbiB0aGUgY29tbWl0IHBoYXNlIGluc3RlYWQuXG4gICAgICAodXBkYXRlUGF5bG9hZCA9IHVwZGF0ZVBheWxvYWQgfHwgW10pLnB1c2gocHJvcEtleSwgbnVsbCk7XG4gICAgfVxuICB9XG5cbiAgZm9yIChwcm9wS2V5IGluIG5leHRQcm9wcykge1xuICAgIHZhciBuZXh0UHJvcCA9IG5leHRQcm9wc1twcm9wS2V5XTtcbiAgICB2YXIgbGFzdFByb3AgPSBsYXN0UHJvcHMgIT0gbnVsbCA/IGxhc3RQcm9wc1twcm9wS2V5XSA6IHVuZGVmaW5lZDtcblxuICAgIGlmICghbmV4dFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpIHx8IG5leHRQcm9wID09PSBsYXN0UHJvcCB8fCBuZXh0UHJvcCA9PSBudWxsICYmIGxhc3RQcm9wID09IG51bGwpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAge1xuICAgICAgICBpZiAobmV4dFByb3ApIHtcbiAgICAgICAgICAvLyBGcmVlemUgdGhlIG5leHQgc3R5bGUgb2JqZWN0IHNvIHRoYXQgd2UgY2FuIGFzc3VtZSBpdCB3b24ndCBiZVxuICAgICAgICAgIC8vIG11dGF0ZWQuIFdlIGhhdmUgYWxyZWFkeSB3YXJuZWQgZm9yIHRoaXMgaW4gdGhlIHBhc3QuXG4gICAgICAgICAgT2JqZWN0LmZyZWV6ZShuZXh0UHJvcCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGxhc3RQcm9wKSB7XG4gICAgICAgIC8vIFVuc2V0IHN0eWxlcyBvbiBgbGFzdFByb3BgIGJ1dCBub3Qgb24gYG5leHRQcm9wYC5cbiAgICAgICAgZm9yIChzdHlsZU5hbWUgaW4gbGFzdFByb3ApIHtcbiAgICAgICAgICBpZiAobGFzdFByb3AuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSAmJiAoIW5leHRQcm9wIHx8ICFuZXh0UHJvcC5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSkge1xuICAgICAgICAgICAgaWYgKCFzdHlsZVVwZGF0ZXMpIHtcbiAgICAgICAgICAgICAgc3R5bGVVcGRhdGVzID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN0eWxlVXBkYXRlc1tzdHlsZU5hbWVdID0gJyc7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIFVwZGF0ZSBzdHlsZXMgdGhhdCBjaGFuZ2VkIHNpbmNlIGBsYXN0UHJvcGAuXG5cblxuICAgICAgICBmb3IgKHN0eWxlTmFtZSBpbiBuZXh0UHJvcCkge1xuICAgICAgICAgIGlmIChuZXh0UHJvcC5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpICYmIGxhc3RQcm9wW3N0eWxlTmFtZV0gIT09IG5leHRQcm9wW3N0eWxlTmFtZV0pIHtcbiAgICAgICAgICAgIGlmICghc3R5bGVVcGRhdGVzKSB7XG4gICAgICAgICAgICAgIHN0eWxlVXBkYXRlcyA9IHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdHlsZVVwZGF0ZXNbc3R5bGVOYW1lXSA9IG5leHRQcm9wW3N0eWxlTmFtZV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBSZWxpZXMgb24gYHVwZGF0ZVN0eWxlc0J5SURgIG5vdCBtdXRhdGluZyBgc3R5bGVVcGRhdGVzYC5cbiAgICAgICAgaWYgKCFzdHlsZVVwZGF0ZXMpIHtcbiAgICAgICAgICBpZiAoIXVwZGF0ZVBheWxvYWQpIHtcbiAgICAgICAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB1cGRhdGVQYXlsb2FkLnB1c2gocHJvcEtleSwgc3R5bGVVcGRhdGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0eWxlVXBkYXRlcyA9IG5leHRQcm9wO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gREFOR0VST1VTTFlfU0VUX0lOTkVSX0hUTUwpIHtcbiAgICAgIHZhciBuZXh0SHRtbCA9IG5leHRQcm9wID8gbmV4dFByb3BbSFRNTCQxXSA6IHVuZGVmaW5lZDtcbiAgICAgIHZhciBsYXN0SHRtbCA9IGxhc3RQcm9wID8gbGFzdFByb3BbSFRNTCQxXSA6IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKG5leHRIdG1sICE9IG51bGwpIHtcbiAgICAgICAgaWYgKGxhc3RIdG1sICE9PSBuZXh0SHRtbCkge1xuICAgICAgICAgICh1cGRhdGVQYXlsb2FkID0gdXBkYXRlUGF5bG9hZCB8fCBbXSkucHVzaChwcm9wS2V5LCBuZXh0SHRtbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IENISUxEUkVOKSB7XG4gICAgICBpZiAodHlwZW9mIG5leHRQcm9wID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgbmV4dFByb3AgPT09ICdudW1iZXInKSB7XG4gICAgICAgICh1cGRhdGVQYXlsb2FkID0gdXBkYXRlUGF5bG9hZCB8fCBbXSkucHVzaChwcm9wS2V5LCAnJyArIG5leHRQcm9wKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IFNVUFBSRVNTX0NPTlRFTlRfRURJVEFCTEVfV0FSTklORyB8fCBwcm9wS2V5ID09PSBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORykgOyBlbHNlIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICBpZiAobmV4dFByb3AgIT0gbnVsbCkge1xuICAgICAgICAvLyBXZSBlYWdlcmx5IGxpc3RlbiB0byB0aGlzIGV2ZW4gdGhvdWdoIHdlIGhhdmVuJ3QgY29tbWl0dGVkIHlldC5cbiAgICAgICAgaWYgKCB0eXBlb2YgbmV4dFByb3AgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXIocHJvcEtleSwgbmV4dFByb3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb3BLZXkgPT09ICdvblNjcm9sbCcpIHtcbiAgICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdzY3JvbGwnLCBkb21FbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXVwZGF0ZVBheWxvYWQgJiYgbGFzdFByb3AgIT09IG5leHRQcm9wKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UuIElmIGFueSBsaXN0ZW5lciB1cGRhdGVzIHdlIG5lZWQgdG8gZW5zdXJlXG4gICAgICAgIC8vIHRoYXQgdGhlIFwiY3VycmVudFwiIHByb3BzIHBvaW50ZXIgZ2V0cyB1cGRhdGVkIHNvIHdlIG5lZWQgYSBjb21taXRcbiAgICAgICAgLy8gdG8gdXBkYXRlIHRoaXMgZWxlbWVudC5cbiAgICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGb3IgYW55IG90aGVyIHByb3BlcnR5IHdlIGFsd2F5cyBhZGQgaXQgdG8gdGhlIHF1ZXVlIGFuZCB0aGVuIHdlXG4gICAgICAvLyBmaWx0ZXIgaXQgb3V0IHVzaW5nIHRoZSBhbGxvd2VkIHByb3BlcnR5IGxpc3QgZHVyaW5nIHRoZSBjb21taXQuXG4gICAgICAodXBkYXRlUGF5bG9hZCA9IHVwZGF0ZVBheWxvYWQgfHwgW10pLnB1c2gocHJvcEtleSwgbmV4dFByb3ApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzdHlsZVVwZGF0ZXMpIHtcbiAgICB7XG4gICAgICB2YWxpZGF0ZVNob3J0aGFuZFByb3BlcnR5Q29sbGlzaW9uSW5EZXYoc3R5bGVVcGRhdGVzLCBuZXh0UHJvcHNbU1RZTEVdKTtcbiAgICB9XG5cbiAgICAodXBkYXRlUGF5bG9hZCA9IHVwZGF0ZVBheWxvYWQgfHwgW10pLnB1c2goU1RZTEUsIHN0eWxlVXBkYXRlcyk7XG4gIH1cblxuICByZXR1cm4gdXBkYXRlUGF5bG9hZDtcbn0gLy8gQXBwbHkgdGhlIGRpZmYuXG5cbmZ1bmN0aW9uIHVwZGF0ZVByb3BlcnRpZXMoZG9tRWxlbWVudCwgdXBkYXRlUGF5bG9hZCwgdGFnLCBsYXN0UmF3UHJvcHMsIG5leHRSYXdQcm9wcykge1xuICAvLyBVcGRhdGUgY2hlY2tlZCAqYmVmb3JlKiBuYW1lLlxuICAvLyBJbiB0aGUgbWlkZGxlIG9mIGFuIHVwZGF0ZSwgaXQgaXMgcG9zc2libGUgdG8gaGF2ZSBtdWx0aXBsZSBjaGVja2VkLlxuICAvLyBXaGVuIGEgY2hlY2tlZCByYWRpbyB0cmllcyB0byBjaGFuZ2UgbmFtZSwgYnJvd3NlciBtYWtlcyBhbm90aGVyIHJhZGlvJ3MgY2hlY2tlZCBmYWxzZS5cbiAgaWYgKHRhZyA9PT0gJ2lucHV0JyAmJiBuZXh0UmF3UHJvcHMudHlwZSA9PT0gJ3JhZGlvJyAmJiBuZXh0UmF3UHJvcHMubmFtZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlQ2hlY2tlZChkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICB9XG5cbiAgdmFyIHdhc0N1c3RvbUNvbXBvbmVudFRhZyA9IGlzQ3VzdG9tQ29tcG9uZW50KHRhZywgbGFzdFJhd1Byb3BzKTtcbiAgdmFyIGlzQ3VzdG9tQ29tcG9uZW50VGFnID0gaXNDdXN0b21Db21wb25lbnQodGFnLCBuZXh0UmF3UHJvcHMpOyAvLyBBcHBseSB0aGUgZGlmZi5cblxuICB1cGRhdGVET01Qcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHVwZGF0ZVBheWxvYWQsIHdhc0N1c3RvbUNvbXBvbmVudFRhZywgaXNDdXN0b21Db21wb25lbnRUYWcpOyAvLyBUT0RPOiBFbnN1cmUgdGhhdCBhbiB1cGRhdGUgZ2V0cyBzY2hlZHVsZWQgaWYgYW55IG9mIHRoZSBzcGVjaWFsIHByb3BzXG4gIC8vIGNoYW5nZWQuXG5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICAvLyBVcGRhdGUgdGhlIHdyYXBwZXIgYXJvdW5kIGlucHV0cyAqYWZ0ZXIqIHVwZGF0aW5nIHByb3BzLiBUaGlzIGhhcyB0b1xuICAgICAgLy8gaGFwcGVuIGFmdGVyIGB1cGRhdGVET01Qcm9wZXJ0aWVzYC4gT3RoZXJ3aXNlIEhUTUw1IGlucHV0IHZhbGlkYXRpb25zXG4gICAgICAvLyByYWlzZSB3YXJuaW5ncyBhbmQgcHJldmVudCB0aGUgbmV3IHZhbHVlIGZyb20gYmVpbmcgYXNzaWduZWQuXG4gICAgICB1cGRhdGVXcmFwcGVyKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIHVwZGF0ZVdyYXBwZXIkMShkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgLy8gPHNlbGVjdD4gdmFsdWUgdXBkYXRlIG5lZWRzIHRvIG9jY3VyIGFmdGVyIDxvcHRpb24+IGNoaWxkcmVuXG4gICAgICAvLyByZWNvbmNpbGlhdGlvblxuICAgICAgcG9zdFVwZGF0ZVdyYXBwZXIoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFBvc3NpYmxlU3RhbmRhcmROYW1lKHByb3BOYW1lKSB7XG4gIHtcbiAgICB2YXIgbG93ZXJDYXNlZE5hbWUgPSBwcm9wTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKCFwb3NzaWJsZVN0YW5kYXJkTmFtZXMuaGFzT3duUHJvcGVydHkobG93ZXJDYXNlZE5hbWUpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gcG9zc2libGVTdGFuZGFyZE5hbWVzW2xvd2VyQ2FzZWROYW1lXSB8fCBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpZmZIeWRyYXRlZFByb3BlcnRpZXMoZG9tRWxlbWVudCwgdGFnLCByYXdQcm9wcywgcGFyZW50TmFtZXNwYWNlLCByb290Q29udGFpbmVyRWxlbWVudCwgaXNDb25jdXJyZW50TW9kZSwgc2hvdWxkV2FybkRldikge1xuICB2YXIgaXNDdXN0b21Db21wb25lbnRUYWc7XG4gIHZhciBleHRyYUF0dHJpYnV0ZU5hbWVzO1xuXG4gIHtcbiAgICBpc0N1c3RvbUNvbXBvbmVudFRhZyA9IGlzQ3VzdG9tQ29tcG9uZW50KHRhZywgcmF3UHJvcHMpO1xuICAgIHZhbGlkYXRlUHJvcGVydGllc0luRGV2ZWxvcG1lbnQodGFnLCByYXdQcm9wcyk7XG4gIH0gLy8gVE9ETzogTWFrZSBzdXJlIHRoYXQgd2UgY2hlY2sgaXNNb3VudGVkIGJlZm9yZSBmaXJpbmcgYW55IG9mIHRoZXNlIGV2ZW50cy5cblxuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnZGlhbG9nJzpcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2NhbmNlbCcsIGRvbUVsZW1lbnQpO1xuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnY2xvc2UnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnaWZyYW1lJzpcbiAgICBjYXNlICdvYmplY3QnOlxuICAgIGNhc2UgJ2VtYmVkJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBsb2FkIGV2ZW50LlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnbG9hZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd2aWRlbyc6XG4gICAgY2FzZSAnYXVkaW8nOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoZXNlIGV2ZW50cyBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciBhbGwgdGhlIG1lZGlhIGV2ZW50cy5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWVkaWFFdmVudFR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQobWVkaWFFdmVudFR5cGVzW2ldLCBkb21FbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzb3VyY2UnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGVycm9yIGV2ZW50LlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnZXJyb3InLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnaW1nJzpcbiAgICBjYXNlICdpbWFnZSc6XG4gICAgY2FzZSAnbGluayc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhlc2UgZXZlbnRzIGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIGVycm9yIGFuZCBsb2FkIGV2ZW50cy5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2Vycm9yJywgZG9tRWxlbWVudCk7XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdsb2FkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2RldGFpbHMnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIHRvZ2dsZSBldmVudC5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ3RvZ2dsZScsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICBpbml0V3JhcHBlclN0YXRlKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTsgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGludmFsaWQgZXZlbnQuXG5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2ludmFsaWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgIHZhbGlkYXRlUHJvcHMoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZSQxKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTsgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGludmFsaWQgZXZlbnQuXG5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2ludmFsaWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZSQyKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTsgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGludmFsaWQgZXZlbnQuXG5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2ludmFsaWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgYXNzZXJ0VmFsaWRQcm9wcyh0YWcsIHJhd1Byb3BzKTtcblxuICB7XG4gICAgZXh0cmFBdHRyaWJ1dGVOYW1lcyA9IG5ldyBTZXQoKTtcbiAgICB2YXIgYXR0cmlidXRlcyA9IGRvbUVsZW1lbnQuYXR0cmlidXRlcztcblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIG5hbWUgPSBhdHRyaWJ1dGVzW19pXS5uYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgICAvLyBDb250cm9sbGVkIGF0dHJpYnV0ZXMgYXJlIG5vdCB2YWxpZGF0ZWRcbiAgICAgICAgLy8gVE9ETzogT25seSBpZ25vcmUgdGhlbSBvbiBjb250cm9sbGVkIHRhZ3MuXG4gICAgICAgIGNhc2UgJ3ZhbHVlJzpcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdjaGVja2VkJzpcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdzZWxlY3RlZCc6XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBJbnRlbnRpb25hbGx5IHVzZSB0aGUgb3JpZ2luYWwgbmFtZS5cbiAgICAgICAgICAvLyBTZWUgZGlzY3Vzc2lvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8xMDY3Ni5cbiAgICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmFkZChhdHRyaWJ1dGVzW19pXS5uYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgdXBkYXRlUGF5bG9hZCA9IG51bGw7XG5cbiAgZm9yICh2YXIgcHJvcEtleSBpbiByYXdQcm9wcykge1xuICAgIGlmICghcmF3UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciBuZXh0UHJvcCA9IHJhd1Byb3BzW3Byb3BLZXldO1xuXG4gICAgaWYgKHByb3BLZXkgPT09IENISUxEUkVOKSB7XG4gICAgICAvLyBGb3IgdGV4dCBjb250ZW50IGNoaWxkcmVuIHdlIGNvbXBhcmUgYWdhaW5zdCB0ZXh0Q29udGVudC4gVGhpc1xuICAgICAgLy8gbWlnaHQgbWF0Y2ggYWRkaXRpb25hbCBIVE1MIHRoYXQgaXMgaGlkZGVuIHdoZW4gd2UgcmVhZCBpdCB1c2luZ1xuICAgICAgLy8gdGV4dENvbnRlbnQuIEUuZy4gXCJmb29cIiB3aWxsIG1hdGNoIFwiZjxzcGFuPm9vPC9zcGFuPlwiIGJ1dCB0aGF0IHN0aWxsXG4gICAgICAvLyBzYXRpc2ZpZXMgb3VyIHJlcXVpcmVtZW50LiBPdXIgcmVxdWlyZW1lbnQgaXMgbm90IHRvIHByb2R1Y2UgcGVyZmVjdFxuICAgICAgLy8gSFRNTCBhbmQgYXR0cmlidXRlcy4gSWRlYWxseSB3ZSBzaG91bGQgcHJlc2VydmUgc3RydWN0dXJlIGJ1dCBpdCdzXG4gICAgICAvLyBvayBub3QgdG8gaWYgdGhlIHZpc2libGUgY29udGVudCBpcyBzdGlsbCBlbm91Z2ggdG8gaW5kaWNhdGUgd2hhdFxuICAgICAgLy8gZXZlbiBsaXN0ZW5lcnMgdGhlc2Ugbm9kZXMgbWlnaHQgYmUgd2lyZWQgdXAgdG8uXG4gICAgICAvLyBUT0RPOiBXYXJuIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBhIHNpbmdsZSB0ZXh0Tm9kZSBhcyBhIGNoaWxkLlxuICAgICAgLy8gVE9ETzogU2hvdWxkIHdlIHVzZSBkb21FbGVtZW50LmZpcnN0Q2hpbGQubm9kZVZhbHVlIHRvIGNvbXBhcmU/XG4gICAgICBpZiAodHlwZW9mIG5leHRQcm9wID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAoZG9tRWxlbWVudC50ZXh0Q29udGVudCAhPT0gbmV4dFByb3ApIHtcbiAgICAgICAgICBpZiAocmF3UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkddICE9PSB0cnVlKSB7XG4gICAgICAgICAgICBjaGVja0ZvclVubWF0Y2hlZFRleHQoZG9tRWxlbWVudC50ZXh0Q29udGVudCwgbmV4dFByb3AsIGlzQ29uY3VycmVudE1vZGUsIHNob3VsZFdhcm5EZXYpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZVBheWxvYWQgPSBbQ0hJTERSRU4sIG5leHRQcm9wXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbmV4dFByb3AgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGlmIChkb21FbGVtZW50LnRleHRDb250ZW50ICE9PSAnJyArIG5leHRQcm9wKSB7XG4gICAgICAgICAgaWYgKHJhd1Byb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HXSAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgY2hlY2tGb3JVbm1hdGNoZWRUZXh0KGRvbUVsZW1lbnQudGV4dENvbnRlbnQsIG5leHRQcm9wLCBpc0NvbmN1cnJlbnRNb2RlLCBzaG91bGRXYXJuRGV2KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB1cGRhdGVQYXlsb2FkID0gW0NISUxEUkVOLCAnJyArIG5leHRQcm9wXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkge1xuICAgICAgaWYgKG5leHRQcm9wICE9IG51bGwpIHtcbiAgICAgICAgaWYgKCB0eXBlb2YgbmV4dFByb3AgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXIocHJvcEtleSwgbmV4dFByb3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb3BLZXkgPT09ICdvblNjcm9sbCcpIHtcbiAgICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdzY3JvbGwnLCBkb21FbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc2hvdWxkV2FybkRldiAmJiB0cnVlICYmIC8vIENvbnZpbmNlIEZsb3cgd2UndmUgY2FsY3VsYXRlZCBpdCAoaXQncyBERVYtb25seSBpbiB0aGlzIG1ldGhvZC4pXG4gICAgdHlwZW9mIGlzQ3VzdG9tQ29tcG9uZW50VGFnID09PSAnYm9vbGVhbicpIHtcbiAgICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhlIHByb3BlcnRpZXMgY29ycmVzcG9uZCB0byB0aGVpciBleHBlY3RlZCB2YWx1ZXMuXG4gICAgICB2YXIgc2VydmVyVmFsdWUgPSB2b2lkIDA7XG4gICAgICB2YXIgcHJvcGVydHlJbmZvID0gaXNDdXN0b21Db21wb25lbnRUYWcgJiYgZW5hYmxlQ3VzdG9tRWxlbWVudFByb3BlcnR5U3VwcG9ydCA/IG51bGwgOiBnZXRQcm9wZXJ0eUluZm8ocHJvcEtleSk7XG5cbiAgICAgIGlmIChyYXdQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklOR10gPT09IHRydWUpIDsgZWxzZSBpZiAocHJvcEtleSA9PT0gU1VQUFJFU1NfQ09OVEVOVF9FRElUQUJMRV9XQVJOSU5HIHx8IHByb3BLZXkgPT09IFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HIHx8IC8vIENvbnRyb2xsZWQgYXR0cmlidXRlcyBhcmUgbm90IHZhbGlkYXRlZFxuICAgICAgLy8gVE9ETzogT25seSBpZ25vcmUgdGhlbSBvbiBjb250cm9sbGVkIHRhZ3MuXG4gICAgICBwcm9wS2V5ID09PSAndmFsdWUnIHx8IHByb3BLZXkgPT09ICdjaGVja2VkJyB8fCBwcm9wS2V5ID09PSAnc2VsZWN0ZWQnKSA7IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MKSB7XG4gICAgICAgIHZhciBzZXJ2ZXJIVE1MID0gZG9tRWxlbWVudC5pbm5lckhUTUw7XG4gICAgICAgIHZhciBuZXh0SHRtbCA9IG5leHRQcm9wID8gbmV4dFByb3BbSFRNTCQxXSA6IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAobmV4dEh0bWwgIT0gbnVsbCkge1xuICAgICAgICAgIHZhciBleHBlY3RlZEhUTUwgPSBub3JtYWxpemVIVE1MKGRvbUVsZW1lbnQsIG5leHRIdG1sKTtcblxuICAgICAgICAgIGlmIChleHBlY3RlZEhUTUwgIT09IHNlcnZlckhUTUwpIHtcbiAgICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBzZXJ2ZXJIVE1MLCBleHBlY3RlZEhUTUwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuZGVsZXRlKHByb3BLZXkpO1xuXG4gICAgICAgIGlmIChjYW5EaWZmU3R5bGVGb3JIeWRyYXRpb25XYXJuaW5nKSB7XG4gICAgICAgICAgdmFyIGV4cGVjdGVkU3R5bGUgPSBjcmVhdGVEYW5nZXJvdXNTdHJpbmdGb3JTdHlsZXMobmV4dFByb3ApO1xuICAgICAgICAgIHNlcnZlclZhbHVlID0gZG9tRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3N0eWxlJyk7XG5cbiAgICAgICAgICBpZiAoZXhwZWN0ZWRTdHlsZSAhPT0gc2VydmVyVmFsdWUpIHtcbiAgICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBzZXJ2ZXJWYWx1ZSwgZXhwZWN0ZWRTdHlsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnICYmICFlbmFibGVDdXN0b21FbGVtZW50UHJvcGVydHlTdXBwb3J0KSB7XG4gICAgICAgIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cbiAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcEtleS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgc2VydmVyVmFsdWUgPSBnZXRWYWx1ZUZvckF0dHJpYnV0ZShkb21FbGVtZW50LCBwcm9wS2V5LCBuZXh0UHJvcCk7XG5cbiAgICAgICAgaWYgKG5leHRQcm9wICE9PSBzZXJ2ZXJWYWx1ZSkge1xuICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBzZXJ2ZXJWYWx1ZSwgbmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFzaG91bGRJZ25vcmVBdHRyaWJ1dGUocHJvcEtleSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykgJiYgIXNob3VsZFJlbW92ZUF0dHJpYnV0ZShwcm9wS2V5LCBuZXh0UHJvcCwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykpIHtcbiAgICAgICAgdmFyIGlzTWlzbWF0Y2hEdWVUb0JhZENhc2luZyA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChwcm9wZXJ0eUluZm8gIT09IG51bGwpIHtcbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICAgIHNlcnZlclZhbHVlID0gZ2V0VmFsdWVGb3JQcm9wZXJ0eShkb21FbGVtZW50LCBwcm9wS2V5LCBuZXh0UHJvcCwgcHJvcGVydHlJbmZvKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgb3duTmFtZXNwYWNlID0gcGFyZW50TmFtZXNwYWNlO1xuXG4gICAgICAgICAgaWYgKG93bk5hbWVzcGFjZSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgICAgIG93bk5hbWVzcGFjZSA9IGdldEludHJpbnNpY05hbWVzcGFjZSh0YWcpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChvd25OYW1lc3BhY2UgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICAgICAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShwcm9wS2V5LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgc3RhbmRhcmROYW1lID0gZ2V0UG9zc2libGVTdGFuZGFyZE5hbWUocHJvcEtleSk7XG5cbiAgICAgICAgICAgIGlmIChzdGFuZGFyZE5hbWUgIT09IG51bGwgJiYgc3RhbmRhcmROYW1lICE9PSBwcm9wS2V5KSB7XG4gICAgICAgICAgICAgIC8vIElmIGFuIFNWRyBwcm9wIGlzIHN1cHBsaWVkIHdpdGggYmFkIGNhc2luZywgaXQgd2lsbFxuICAgICAgICAgICAgICAvLyBiZSBzdWNjZXNzZnVsbHkgcGFyc2VkIGZyb20gSFRNTCwgYnV0IHdpbGwgcHJvZHVjZSBhIG1pc21hdGNoXG4gICAgICAgICAgICAgIC8vIChhbmQgd291bGQgYmUgaW5jb3JyZWN0bHkgcmVuZGVyZWQgb24gdGhlIGNsaWVudCkuXG4gICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIHdlIGFscmVhZHkgd2FybiBhYm91dCBiYWQgY2FzaW5nIGVsc2V3aGVyZS5cbiAgICAgICAgICAgICAgLy8gU28gd2UnbGwgc2tpcCB0aGUgbWlzbGVhZGluZyBleHRyYSBtaXNtYXRjaCB3YXJuaW5nIGluIHRoaXMgY2FzZS5cbiAgICAgICAgICAgICAgaXNNaXNtYXRjaER1ZVRvQmFkQ2FzaW5nID0gdHJ1ZTsgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuXG4gICAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuZGVsZXRlKHN0YW5kYXJkTmFtZSk7XG4gICAgICAgICAgICB9IC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cblxuXG4gICAgICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShwcm9wS2V5KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZXJ2ZXJWYWx1ZSA9IGdldFZhbHVlRm9yQXR0cmlidXRlKGRvbUVsZW1lbnQsIHByb3BLZXksIG5leHRQcm9wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkb250V2FybkN1c3RvbUVsZW1lbnQgPSBlbmFibGVDdXN0b21FbGVtZW50UHJvcGVydHlTdXBwb3J0ICA7XG5cbiAgICAgICAgaWYgKCFkb250V2FybkN1c3RvbUVsZW1lbnQgJiYgbmV4dFByb3AgIT09IHNlcnZlclZhbHVlICYmICFpc01pc21hdGNoRHVlVG9CYWRDYXNpbmcpIHtcbiAgICAgICAgICB3YXJuRm9yUHJvcERpZmZlcmVuY2UocHJvcEtleSwgc2VydmVyVmFsdWUsIG5leHRQcm9wKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBpZiAoc2hvdWxkV2FybkRldikge1xuICAgICAgaWYgKCAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLnNpemUgPiAwICYmIHJhd1Byb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HXSAhPT0gdHJ1ZSkge1xuICAgICAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgICAgIHdhcm5Gb3JFeHRyYUF0dHJpYnV0ZXMoZXh0cmFBdHRyaWJ1dGVOYW1lcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICAvLyBUT0RPOiBNYWtlIHN1cmUgd2UgY2hlY2sgaWYgdGhpcyBpcyBzdGlsbCB1bm1vdW50ZWQgb3IgZG8gYW55IGNsZWFuXG4gICAgICAvLyB1cCBuZWNlc3Nhcnkgc2luY2Ugd2UgbmV2ZXIgc3RvcCB0cmFja2luZyBhbnltb3JlLlxuICAgICAgdHJhY2soZG9tRWxlbWVudCk7XG4gICAgICBwb3N0TW91bnRXcmFwcGVyKGRvbUVsZW1lbnQsIHJhd1Byb3BzLCB0cnVlKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgLy8gVE9ETzogTWFrZSBzdXJlIHdlIGNoZWNrIGlmIHRoaXMgaXMgc3RpbGwgdW5tb3VudGVkIG9yIGRvIGFueSBjbGVhblxuICAgICAgLy8gdXAgbmVjZXNzYXJ5IHNpbmNlIHdlIG5ldmVyIHN0b3AgdHJhY2tpbmcgYW55bW9yZS5cbiAgICAgIHRyYWNrKGRvbUVsZW1lbnQpO1xuICAgICAgcG9zdE1vdW50V3JhcHBlciQzKGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICAvLyBGb3IgaW5wdXQgYW5kIHRleHRhcmVhIHdlIGN1cnJlbnQgYWx3YXlzIHNldCB0aGUgdmFsdWUgcHJvcGVydHkgYXRcbiAgICAgIC8vIHBvc3QgbW91bnQgdG8gZm9yY2UgaXQgdG8gZGl2ZXJnZSBmcm9tIGF0dHJpYnV0ZXMuIEhvd2V2ZXIsIGZvclxuICAgICAgLy8gb3B0aW9uIGFuZCBzZWxlY3Qgd2UgZG9uJ3QgcXVpdGUgZG8gdGhlIHNhbWUgdGhpbmcgYW5kIHNlbGVjdFxuICAgICAgLy8gaXMgbm90IHJlc2lsaWVudCB0byB0aGUgRE9NIHN0YXRlIGNoYW5naW5nIHNvIHdlIGRvbid0IGRvIHRoYXQgaGVyZS5cbiAgICAgIC8vIFRPRE86IENvbnNpZGVyIG5vdCBkb2luZyB0aGlzIGZvciBpbnB1dCBhbmQgdGV4dGFyZWEuXG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAodHlwZW9mIHJhd1Byb3BzLm9uQ2xpY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBjYXN0IG1heSBub3QgYmUgc291bmQgZm9yIFNWRywgTWF0aE1MIG9yIGN1c3RvbSBlbGVtZW50cy5cbiAgICAgICAgdHJhcENsaWNrT25Ob25JbnRlcmFjdGl2ZUVsZW1lbnQoZG9tRWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZVBheWxvYWQ7XG59XG5mdW5jdGlvbiBkaWZmSHlkcmF0ZWRUZXh0KHRleHROb2RlLCB0ZXh0LCBpc0NvbmN1cnJlbnRNb2RlKSB7XG4gIHZhciBpc0RpZmZlcmVudCA9IHRleHROb2RlLm5vZGVWYWx1ZSAhPT0gdGV4dDtcbiAgcmV0dXJuIGlzRGlmZmVyZW50O1xufVxuZnVuY3Rpb24gd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlRWxlbWVudChwYXJlbnROb2RlLCBjaGlsZCkge1xuICB7XG4gICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ0RpZCBub3QgZXhwZWN0IHNlcnZlciBIVE1MIHRvIGNvbnRhaW4gYSA8JXM+IGluIDwlcz4uJywgY2hpbGQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgcGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxufVxuZnVuY3Rpb24gd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlVGV4dChwYXJlbnROb2RlLCBjaGlsZCkge1xuICB7XG4gICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ0RpZCBub3QgZXhwZWN0IHNlcnZlciBIVE1MIHRvIGNvbnRhaW4gdGhlIHRleHQgbm9kZSBcIiVzXCIgaW4gPCVzPi4nLCBjaGlsZC5ub2RlVmFsdWUsIHBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkRWxlbWVudChwYXJlbnROb2RlLCB0YWcsIHByb3BzKSB7XG4gIHtcbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG5cbiAgICBlcnJvcignRXhwZWN0ZWQgc2VydmVyIEhUTUwgdG8gY29udGFpbiBhIG1hdGNoaW5nIDwlcz4gaW4gPCVzPi4nLCB0YWcsIHBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkVGV4dChwYXJlbnROb2RlLCB0ZXh0KSB7XG4gIHtcbiAgICBpZiAodGV4dCA9PT0gJycpIHtcbiAgICAgIC8vIFdlIGV4cGVjdCB0byBpbnNlcnQgZW1wdHkgdGV4dCBub2RlcyBzaW5jZSB0aGV5J3JlIG5vdCByZXByZXNlbnRlZCBpblxuICAgICAgLy8gdGhlIEhUTUwuXG4gICAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyBzcGVjaWFsIGNhc2UgaWYgd2UgY2FuIGp1c3QgYXZvaWQgaW5zZXJ0aW5nIGVtcHR5XG4gICAgICAvLyB0ZXh0IG5vZGVzLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgIGVycm9yKCdFeHBlY3RlZCBzZXJ2ZXIgSFRNTCB0byBjb250YWluIGEgbWF0Y2hpbmcgdGV4dCBub2RlIGZvciBcIiVzXCIgaW4gPCVzPi4nLCB0ZXh0LCBwYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICB9XG59XG5mdW5jdGlvbiByZXN0b3JlQ29udHJvbGxlZFN0YXRlJDMoZG9tRWxlbWVudCwgdGFnLCBwcm9wcykge1xuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIHJlc3RvcmVDb250cm9sbGVkU3RhdGUoZG9tRWxlbWVudCwgcHJvcHMpO1xuICAgICAgcmV0dXJuO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQyKGRvbUVsZW1lbnQsIHByb3BzKTtcbiAgICAgIHJldHVybjtcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICByZXN0b3JlQ29udHJvbGxlZFN0YXRlJDEoZG9tRWxlbWVudCwgcHJvcHMpO1xuICAgICAgcmV0dXJuO1xuICB9XG59XG5cbnZhciB2YWxpZGF0ZURPTU5lc3RpbmcgPSBmdW5jdGlvbiAoKSB7fTtcblxudmFyIHVwZGF0ZWRBbmNlc3RvckluZm8gPSBmdW5jdGlvbiAoKSB7fTtcblxue1xuICAvLyBUaGlzIHZhbGlkYXRpb24gY29kZSB3YXMgd3JpdHRlbiBiYXNlZCBvbiB0aGUgSFRNTDUgcGFyc2luZyBzcGVjOlxuICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNoYXMtYW4tZWxlbWVudC1pbi1zY29wZVxuICAvL1xuICAvLyBOb3RlOiB0aGlzIGRvZXMgbm90IGNhdGNoIGFsbCBpbnZhbGlkIG5lc3RpbmcsIG5vciBkb2VzIGl0IHRyeSB0byAoYXMgaXQnc1xuICAvLyBub3QgY2xlYXIgd2hhdCBwcmFjdGljYWwgYmVuZWZpdCBkb2luZyBzbyBwcm92aWRlcyk7IGluc3RlYWQsIHdlIHdhcm4gb25seVxuICAvLyBmb3IgY2FzZXMgd2hlcmUgdGhlIHBhcnNlciB3aWxsIGdpdmUgYSBwYXJzZSB0cmVlIGRpZmZlcmluZyBmcm9tIHdoYXQgUmVhY3RcbiAgLy8gaW50ZW5kZWQuIEZvciBleGFtcGxlLCA8Yj48ZGl2PjwvZGl2PjwvYj4gaXMgaW52YWxpZCBidXQgd2UgZG9uJ3Qgd2FyblxuICAvLyBiZWNhdXNlIGl0IHN0aWxsIHBhcnNlcyBjb3JyZWN0bHk7IHdlIGRvIHdhcm4gZm9yIG90aGVyIGNhc2VzIGxpa2UgbmVzdGVkXG4gIC8vIDxwPiB0YWdzIHdoZXJlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlY29uZCBlbGVtZW50IGltcGxpY2l0bHkgY2xvc2VzIHRoZVxuICAvLyBmaXJzdCwgY2F1c2luZyBhIGNvbmZ1c2luZyBtZXNzLlxuICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNzcGVjaWFsXG4gIHZhciBzcGVjaWFsVGFncyA9IFsnYWRkcmVzcycsICdhcHBsZXQnLCAnYXJlYScsICdhcnRpY2xlJywgJ2FzaWRlJywgJ2Jhc2UnLCAnYmFzZWZvbnQnLCAnYmdzb3VuZCcsICdibG9ja3F1b3RlJywgJ2JvZHknLCAnYnInLCAnYnV0dG9uJywgJ2NhcHRpb24nLCAnY2VudGVyJywgJ2NvbCcsICdjb2xncm91cCcsICdkZCcsICdkZXRhaWxzJywgJ2RpcicsICdkaXYnLCAnZGwnLCAnZHQnLCAnZW1iZWQnLCAnZmllbGRzZXQnLCAnZmlnY2FwdGlvbicsICdmaWd1cmUnLCAnZm9vdGVyJywgJ2Zvcm0nLCAnZnJhbWUnLCAnZnJhbWVzZXQnLCAnaDEnLCAnaDInLCAnaDMnLCAnaDQnLCAnaDUnLCAnaDYnLCAnaGVhZCcsICdoZWFkZXInLCAnaGdyb3VwJywgJ2hyJywgJ2h0bWwnLCAnaWZyYW1lJywgJ2ltZycsICdpbnB1dCcsICdpc2luZGV4JywgJ2xpJywgJ2xpbmsnLCAnbGlzdGluZycsICdtYWluJywgJ21hcnF1ZWUnLCAnbWVudScsICdtZW51aXRlbScsICdtZXRhJywgJ25hdicsICdub2VtYmVkJywgJ25vZnJhbWVzJywgJ25vc2NyaXB0JywgJ29iamVjdCcsICdvbCcsICdwJywgJ3BhcmFtJywgJ3BsYWludGV4dCcsICdwcmUnLCAnc2NyaXB0JywgJ3NlY3Rpb24nLCAnc2VsZWN0JywgJ3NvdXJjZScsICdzdHlsZScsICdzdW1tYXJ5JywgJ3RhYmxlJywgJ3Rib2R5JywgJ3RkJywgJ3RlbXBsYXRlJywgJ3RleHRhcmVhJywgJ3Rmb290JywgJ3RoJywgJ3RoZWFkJywgJ3RpdGxlJywgJ3RyJywgJ3RyYWNrJywgJ3VsJywgJ3dicicsICd4bXAnXTsgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaGFzLWFuLWVsZW1lbnQtaW4tc2NvcGVcblxuICB2YXIgaW5TY29wZVRhZ3MgPSBbJ2FwcGxldCcsICdjYXB0aW9uJywgJ2h0bWwnLCAndGFibGUnLCAndGQnLCAndGgnLCAnbWFycXVlZScsICdvYmplY3QnLCAndGVtcGxhdGUnLCAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNodG1sLWludGVncmF0aW9uLXBvaW50XG4gIC8vIFRPRE86IERpc3Rpbmd1aXNoIGJ5IG5hbWVzcGFjZSBoZXJlIC0tIGZvciA8dGl0bGU+LCBpbmNsdWRpbmcgaXQgaGVyZVxuICAvLyBlcnJzIG9uIHRoZSBzaWRlIG9mIGZld2VyIHdhcm5pbmdzXG4gICdmb3JlaWduT2JqZWN0JywgJ2Rlc2MnLCAndGl0bGUnXTsgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaGFzLWFuLWVsZW1lbnQtaW4tYnV0dG9uLXNjb3BlXG5cbiAgdmFyIGJ1dHRvblNjb3BlVGFncyA9IGluU2NvcGVUYWdzLmNvbmNhdChbJ2J1dHRvbiddKTsgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjZ2VuZXJhdGUtaW1wbGllZC1lbmQtdGFnc1xuXG4gIHZhciBpbXBsaWVkRW5kVGFncyA9IFsnZGQnLCAnZHQnLCAnbGknLCAnb3B0aW9uJywgJ29wdGdyb3VwJywgJ3AnLCAncnAnLCAncnQnXTtcbiAgdmFyIGVtcHR5QW5jZXN0b3JJbmZvID0ge1xuICAgIGN1cnJlbnQ6IG51bGwsXG4gICAgZm9ybVRhZzogbnVsbCxcbiAgICBhVGFnSW5TY29wZTogbnVsbCxcbiAgICBidXR0b25UYWdJblNjb3BlOiBudWxsLFxuICAgIG5vYnJUYWdJblNjb3BlOiBudWxsLFxuICAgIHBUYWdJbkJ1dHRvblNjb3BlOiBudWxsLFxuICAgIGxpc3RJdGVtVGFnQXV0b2Nsb3Npbmc6IG51bGwsXG4gICAgZGxJdGVtVGFnQXV0b2Nsb3Npbmc6IG51bGxcbiAgfTtcblxuICB1cGRhdGVkQW5jZXN0b3JJbmZvID0gZnVuY3Rpb24gKG9sZEluZm8sIHRhZykge1xuICAgIHZhciBhbmNlc3RvckluZm8gPSBhc3NpZ24oe30sIG9sZEluZm8gfHwgZW1wdHlBbmNlc3RvckluZm8pO1xuXG4gICAgdmFyIGluZm8gPSB7XG4gICAgICB0YWc6IHRhZ1xuICAgIH07XG5cbiAgICBpZiAoaW5TY29wZVRhZ3MuaW5kZXhPZih0YWcpICE9PSAtMSkge1xuICAgICAgYW5jZXN0b3JJbmZvLmFUYWdJblNjb3BlID0gbnVsbDtcbiAgICAgIGFuY2VzdG9ySW5mby5idXR0b25UYWdJblNjb3BlID0gbnVsbDtcbiAgICAgIGFuY2VzdG9ySW5mby5ub2JyVGFnSW5TY29wZSA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGJ1dHRvblNjb3BlVGFncy5pbmRleE9mKHRhZykgIT09IC0xKSB7XG4gICAgICBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGUgPSBudWxsO1xuICAgIH0gLy8gU2VlIHJ1bGVzIGZvciAnbGknLCAnZGQnLCAnZHQnIHN0YXJ0IHRhZ3MgaW5cbiAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5ib2R5XG5cblxuICAgIGlmIChzcGVjaWFsVGFncy5pbmRleE9mKHRhZykgIT09IC0xICYmIHRhZyAhPT0gJ2FkZHJlc3MnICYmIHRhZyAhPT0gJ2RpdicgJiYgdGFnICE9PSAncCcpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5saXN0SXRlbVRhZ0F1dG9jbG9zaW5nID0gbnVsbDtcbiAgICAgIGFuY2VzdG9ySW5mby5kbEl0ZW1UYWdBdXRvY2xvc2luZyA9IG51bGw7XG4gICAgfVxuXG4gICAgYW5jZXN0b3JJbmZvLmN1cnJlbnQgPSBpbmZvO1xuXG4gICAgaWYgKHRhZyA9PT0gJ2Zvcm0nKSB7XG4gICAgICBhbmNlc3RvckluZm8uZm9ybVRhZyA9IGluZm87XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gJ2EnKSB7XG4gICAgICBhbmNlc3RvckluZm8uYVRhZ0luU2NvcGUgPSBpbmZvO1xuICAgIH1cblxuICAgIGlmICh0YWcgPT09ICdidXR0b24nKSB7XG4gICAgICBhbmNlc3RvckluZm8uYnV0dG9uVGFnSW5TY29wZSA9IGluZm87XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gJ25vYnInKSB7XG4gICAgICBhbmNlc3RvckluZm8ubm9iclRhZ0luU2NvcGUgPSBpbmZvO1xuICAgIH1cblxuICAgIGlmICh0YWcgPT09ICdwJykge1xuICAgICAgYW5jZXN0b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3BlID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAnbGknKSB7XG4gICAgICBhbmNlc3RvckluZm8ubGlzdEl0ZW1UYWdBdXRvY2xvc2luZyA9IGluZm87XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gJ2RkJyB8fCB0YWcgPT09ICdkdCcpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5kbEl0ZW1UYWdBdXRvY2xvc2luZyA9IGluZm87XG4gICAgfVxuXG4gICAgcmV0dXJuIGFuY2VzdG9ySW5mbztcbiAgfTtcbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlclxuICAgKi9cblxuXG4gIHZhciBpc1RhZ1ZhbGlkV2l0aFBhcmVudCA9IGZ1bmN0aW9uICh0YWcsIHBhcmVudFRhZykge1xuICAgIC8vIEZpcnN0LCBsZXQncyBjaGVjayBpZiB3ZSdyZSBpbiBhbiB1bnVzdWFsIHBhcnNpbmcgbW9kZS4uLlxuICAgIHN3aXRjaCAocGFyZW50VGFnKSB7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5zZWxlY3RcbiAgICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdvcHRpb24nIHx8IHRhZyA9PT0gJ29wdGdyb3VwJyB8fCB0YWcgPT09ICcjdGV4dCc7XG5cbiAgICAgIGNhc2UgJ29wdGdyb3VwJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ29wdGlvbicgfHwgdGFnID09PSAnI3RleHQnO1xuICAgICAgLy8gU3RyaWN0bHkgc3BlYWtpbmcsIHNlZWluZyBhbiA8b3B0aW9uPiBkb2Vzbid0IG1lYW4gd2UncmUgaW4gYSA8c2VsZWN0PlxuICAgICAgLy8gYnV0XG5cbiAgICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICcjdGV4dCc7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW50ZFxuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluY2FwdGlvblxuICAgICAgLy8gTm8gc3BlY2lhbCBiZWhhdmlvciBzaW5jZSB0aGVzZSBydWxlcyBmYWxsIGJhY2sgdG8gXCJpbiBib2R5XCIgbW9kZSBmb3JcbiAgICAgIC8vIGFsbCBleGNlcHQgc3BlY2lhbCB0YWJsZSBub2RlcyB3aGljaCBjYXVzZSBiYWQgcGFyc2luZyBiZWhhdmlvciBhbnl3YXkuXG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW50clxuXG4gICAgICBjYXNlICd0cic6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICd0aCcgfHwgdGFnID09PSAndGQnIHx8IHRhZyA9PT0gJ3N0eWxlJyB8fCB0YWcgPT09ICdzY3JpcHQnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnRib2R5XG5cbiAgICAgIGNhc2UgJ3Rib2R5JzpcbiAgICAgIGNhc2UgJ3RoZWFkJzpcbiAgICAgIGNhc2UgJ3Rmb290JzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ3RyJyB8fCB0YWcgPT09ICdzdHlsZScgfHwgdGFnID09PSAnc2NyaXB0JyB8fCB0YWcgPT09ICd0ZW1wbGF0ZSc7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5jb2xncm91cFxuXG4gICAgICBjYXNlICdjb2xncm91cCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdjb2wnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnRhYmxlXG5cbiAgICAgIGNhc2UgJ3RhYmxlJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2NhcHRpb24nIHx8IHRhZyA9PT0gJ2NvbGdyb3VwJyB8fCB0YWcgPT09ICd0Ym9keScgfHwgdGFnID09PSAndGZvb3QnIHx8IHRhZyA9PT0gJ3RoZWFkJyB8fCB0YWcgPT09ICdzdHlsZScgfHwgdGFnID09PSAnc2NyaXB0JyB8fCB0YWcgPT09ICd0ZW1wbGF0ZSc7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5oZWFkXG5cbiAgICAgIGNhc2UgJ2hlYWQnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnYmFzZScgfHwgdGFnID09PSAnYmFzZWZvbnQnIHx8IHRhZyA9PT0gJ2Jnc291bmQnIHx8IHRhZyA9PT0gJ2xpbmsnIHx8IHRhZyA9PT0gJ21ldGEnIHx8IHRhZyA9PT0gJ3RpdGxlJyB8fCB0YWcgPT09ICdub3NjcmlwdCcgfHwgdGFnID09PSAnbm9mcmFtZXMnIHx8IHRhZyA9PT0gJ3N0eWxlJyB8fCB0YWcgPT09ICdzY3JpcHQnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3NlbWFudGljcy5odG1sI3RoZS1odG1sLWVsZW1lbnRcblxuICAgICAgY2FzZSAnaHRtbCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdoZWFkJyB8fCB0YWcgPT09ICdib2R5JyB8fCB0YWcgPT09ICdmcmFtZXNldCc7XG5cbiAgICAgIGNhc2UgJ2ZyYW1lc2V0JzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2ZyYW1lJztcblxuICAgICAgY2FzZSAnI2RvY3VtZW50JzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2h0bWwnO1xuICAgIH0gLy8gUHJvYmFibHkgaW4gdGhlIFwiaW4gYm9keVwiIHBhcnNpbmcgbW9kZSwgc28gd2Ugb3V0bGF3IG9ubHkgdGFnIGNvbWJvc1xuICAgIC8vIHdoZXJlIHRoZSBwYXJzaW5nIHJ1bGVzIGNhdXNlIGltcGxpY2l0IG9wZW5zIG9yIGNsb3NlcyB0byBiZSBhZGRlZC5cbiAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5ib2R5XG5cblxuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlICdoMSc6XG4gICAgICBjYXNlICdoMic6XG4gICAgICBjYXNlICdoMyc6XG4gICAgICBjYXNlICdoNCc6XG4gICAgICBjYXNlICdoNSc6XG4gICAgICBjYXNlICdoNic6XG4gICAgICAgIHJldHVybiBwYXJlbnRUYWcgIT09ICdoMScgJiYgcGFyZW50VGFnICE9PSAnaDInICYmIHBhcmVudFRhZyAhPT0gJ2gzJyAmJiBwYXJlbnRUYWcgIT09ICdoNCcgJiYgcGFyZW50VGFnICE9PSAnaDUnICYmIHBhcmVudFRhZyAhPT0gJ2g2JztcblxuICAgICAgY2FzZSAncnAnOlxuICAgICAgY2FzZSAncnQnOlxuICAgICAgICByZXR1cm4gaW1wbGllZEVuZFRhZ3MuaW5kZXhPZihwYXJlbnRUYWcpID09PSAtMTtcblxuICAgICAgY2FzZSAnYm9keSc6XG4gICAgICBjYXNlICdjYXB0aW9uJzpcbiAgICAgIGNhc2UgJ2NvbCc6XG4gICAgICBjYXNlICdjb2xncm91cCc6XG4gICAgICBjYXNlICdmcmFtZXNldCc6XG4gICAgICBjYXNlICdmcmFtZSc6XG4gICAgICBjYXNlICdoZWFkJzpcbiAgICAgIGNhc2UgJ2h0bWwnOlxuICAgICAgY2FzZSAndGJvZHknOlxuICAgICAgY2FzZSAndGQnOlxuICAgICAgY2FzZSAndGZvb3QnOlxuICAgICAgY2FzZSAndGgnOlxuICAgICAgY2FzZSAndGhlYWQnOlxuICAgICAgY2FzZSAndHInOlxuICAgICAgICAvLyBUaGVzZSB0YWdzIGFyZSBvbmx5IHZhbGlkIHdpdGggYSBmZXcgcGFyZW50cyB0aGF0IGhhdmUgc3BlY2lhbCBjaGlsZFxuICAgICAgICAvLyBwYXJzaW5nIHJ1bGVzIC0tIGlmIHdlJ3JlIGRvd24gaGVyZSwgdGhlbiBub25lIG9mIHRob3NlIG1hdGNoZWQgYW5kXG4gICAgICAgIC8vIHNvIHdlIGFsbG93IGl0IG9ubHkgaWYgd2UgZG9uJ3Qga25vdyB3aGF0IHRoZSBwYXJlbnQgaXMsIGFzIGFsbCBvdGhlclxuICAgICAgICAvLyBjYXNlcyBhcmUgaW52YWxpZC5cbiAgICAgICAgcmV0dXJuIHBhcmVudFRhZyA9PSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyXG4gICAqL1xuXG5cbiAgdmFyIGZpbmRJbnZhbGlkQW5jZXN0b3JGb3JUYWcgPSBmdW5jdGlvbiAodGFnLCBhbmNlc3RvckluZm8pIHtcbiAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgY2FzZSAnYWRkcmVzcyc6XG4gICAgICBjYXNlICdhcnRpY2xlJzpcbiAgICAgIGNhc2UgJ2FzaWRlJzpcbiAgICAgIGNhc2UgJ2Jsb2NrcXVvdGUnOlxuICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgIGNhc2UgJ2RldGFpbHMnOlxuICAgICAgY2FzZSAnZGlhbG9nJzpcbiAgICAgIGNhc2UgJ2Rpcic6XG4gICAgICBjYXNlICdkaXYnOlxuICAgICAgY2FzZSAnZGwnOlxuICAgICAgY2FzZSAnZmllbGRzZXQnOlxuICAgICAgY2FzZSAnZmlnY2FwdGlvbic6XG4gICAgICBjYXNlICdmaWd1cmUnOlxuICAgICAgY2FzZSAnZm9vdGVyJzpcbiAgICAgIGNhc2UgJ2hlYWRlcic6XG4gICAgICBjYXNlICdoZ3JvdXAnOlxuICAgICAgY2FzZSAnbWFpbic6XG4gICAgICBjYXNlICdtZW51JzpcbiAgICAgIGNhc2UgJ25hdic6XG4gICAgICBjYXNlICdvbCc6XG4gICAgICBjYXNlICdwJzpcbiAgICAgIGNhc2UgJ3NlY3Rpb24nOlxuICAgICAgY2FzZSAnc3VtbWFyeSc6XG4gICAgICBjYXNlICd1bCc6XG4gICAgICBjYXNlICdwcmUnOlxuICAgICAgY2FzZSAnbGlzdGluZyc6XG4gICAgICBjYXNlICd0YWJsZSc6XG4gICAgICBjYXNlICdocic6XG4gICAgICBjYXNlICd4bXAnOlxuICAgICAgY2FzZSAnaDEnOlxuICAgICAgY2FzZSAnaDInOlxuICAgICAgY2FzZSAnaDMnOlxuICAgICAgY2FzZSAnaDQnOlxuICAgICAgY2FzZSAnaDUnOlxuICAgICAgY2FzZSAnaDYnOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3BlO1xuXG4gICAgICBjYXNlICdmb3JtJzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5mb3JtVGFnIHx8IGFuY2VzdG9ySW5mby5wVGFnSW5CdXR0b25TY29wZTtcblxuICAgICAgY2FzZSAnbGknOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmxpc3RJdGVtVGFnQXV0b2Nsb3Npbmc7XG5cbiAgICAgIGNhc2UgJ2RkJzpcbiAgICAgIGNhc2UgJ2R0JzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5kbEl0ZW1UYWdBdXRvY2xvc2luZztcblxuICAgICAgY2FzZSAnYnV0dG9uJzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5idXR0b25UYWdJblNjb3BlO1xuXG4gICAgICBjYXNlICdhJzpcbiAgICAgICAgLy8gU3BlYyBzYXlzIHNvbWV0aGluZyBhYm91dCBzdG9yaW5nIGEgbGlzdCBvZiBtYXJrZXJzLCBidXQgaXQgc291bmRzXG4gICAgICAgIC8vIGVxdWl2YWxlbnQgdG8gdGhpcyBjaGVjay5cbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5hVGFnSW5TY29wZTtcblxuICAgICAgY2FzZSAnbm9icic6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8ubm9iclRhZ0luU2NvcGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgdmFyIGRpZFdhcm4kMSA9IHt9O1xuXG4gIHZhbGlkYXRlRE9NTmVzdGluZyA9IGZ1bmN0aW9uIChjaGlsZFRhZywgY2hpbGRUZXh0LCBhbmNlc3RvckluZm8pIHtcbiAgICBhbmNlc3RvckluZm8gPSBhbmNlc3RvckluZm8gfHwgZW1wdHlBbmNlc3RvckluZm87XG4gICAgdmFyIHBhcmVudEluZm8gPSBhbmNlc3RvckluZm8uY3VycmVudDtcbiAgICB2YXIgcGFyZW50VGFnID0gcGFyZW50SW5mbyAmJiBwYXJlbnRJbmZvLnRhZztcblxuICAgIGlmIChjaGlsZFRleHQgIT0gbnVsbCkge1xuICAgICAgaWYgKGNoaWxkVGFnICE9IG51bGwpIHtcbiAgICAgICAgZXJyb3IoJ3ZhbGlkYXRlRE9NTmVzdGluZzogd2hlbiBjaGlsZFRleHQgaXMgcGFzc2VkLCBjaGlsZFRhZyBzaG91bGQgYmUgbnVsbCcpO1xuICAgICAgfVxuXG4gICAgICBjaGlsZFRhZyA9ICcjdGV4dCc7XG4gICAgfVxuXG4gICAgdmFyIGludmFsaWRQYXJlbnQgPSBpc1RhZ1ZhbGlkV2l0aFBhcmVudChjaGlsZFRhZywgcGFyZW50VGFnKSA/IG51bGwgOiBwYXJlbnRJbmZvO1xuICAgIHZhciBpbnZhbGlkQW5jZXN0b3IgPSBpbnZhbGlkUGFyZW50ID8gbnVsbCA6IGZpbmRJbnZhbGlkQW5jZXN0b3JGb3JUYWcoY2hpbGRUYWcsIGFuY2VzdG9ySW5mbyk7XG4gICAgdmFyIGludmFsaWRQYXJlbnRPckFuY2VzdG9yID0gaW52YWxpZFBhcmVudCB8fCBpbnZhbGlkQW5jZXN0b3I7XG5cbiAgICBpZiAoIWludmFsaWRQYXJlbnRPckFuY2VzdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGFuY2VzdG9yVGFnID0gaW52YWxpZFBhcmVudE9yQW5jZXN0b3IudGFnO1xuICAgIHZhciB3YXJuS2V5ID0gISFpbnZhbGlkUGFyZW50ICsgJ3wnICsgY2hpbGRUYWcgKyAnfCcgKyBhbmNlc3RvclRhZztcblxuICAgIGlmIChkaWRXYXJuJDFbd2FybktleV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuJDFbd2FybktleV0gPSB0cnVlO1xuICAgIHZhciB0YWdEaXNwbGF5TmFtZSA9IGNoaWxkVGFnO1xuICAgIHZhciB3aGl0ZXNwYWNlSW5mbyA9ICcnO1xuXG4gICAgaWYgKGNoaWxkVGFnID09PSAnI3RleHQnKSB7XG4gICAgICBpZiAoL1xcUy8udGVzdChjaGlsZFRleHQpKSB7XG4gICAgICAgIHRhZ0Rpc3BsYXlOYW1lID0gJ1RleHQgbm9kZXMnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFnRGlzcGxheU5hbWUgPSAnV2hpdGVzcGFjZSB0ZXh0IG5vZGVzJztcbiAgICAgICAgd2hpdGVzcGFjZUluZm8gPSBcIiBNYWtlIHN1cmUgeW91IGRvbid0IGhhdmUgYW55IGV4dHJhIHdoaXRlc3BhY2UgYmV0d2VlbiB0YWdzIG9uIFwiICsgJ2VhY2ggbGluZSBvZiB5b3VyIHNvdXJjZSBjb2RlLic7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhZ0Rpc3BsYXlOYW1lID0gJzwnICsgY2hpbGRUYWcgKyAnPic7XG4gICAgfVxuXG4gICAgaWYgKGludmFsaWRQYXJlbnQpIHtcbiAgICAgIHZhciBpbmZvID0gJyc7XG5cbiAgICAgIGlmIChhbmNlc3RvclRhZyA9PT0gJ3RhYmxlJyAmJiBjaGlsZFRhZyA9PT0gJ3RyJykge1xuICAgICAgICBpbmZvICs9ICcgQWRkIGEgPHRib2R5PiwgPHRoZWFkPiBvciA8dGZvb3Q+IHRvIHlvdXIgY29kZSB0byBtYXRjaCB0aGUgRE9NIHRyZWUgZ2VuZXJhdGVkIGJ5ICcgKyAndGhlIGJyb3dzZXIuJztcbiAgICAgIH1cblxuICAgICAgZXJyb3IoJ3ZhbGlkYXRlRE9NTmVzdGluZyguLi4pOiAlcyBjYW5ub3QgYXBwZWFyIGFzIGEgY2hpbGQgb2YgPCVzPi4lcyVzJywgdGFnRGlzcGxheU5hbWUsIGFuY2VzdG9yVGFnLCB3aGl0ZXNwYWNlSW5mbywgaW5mbyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVycm9yKCd2YWxpZGF0ZURPTU5lc3RpbmcoLi4uKTogJXMgY2Fubm90IGFwcGVhciBhcyBhIGRlc2NlbmRhbnQgb2YgJyArICc8JXM+LicsIHRhZ0Rpc3BsYXlOYW1lLCBhbmNlc3RvclRhZyk7XG4gICAgfVxuICB9O1xufVxuXG52YXIgU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkckMSA9ICdzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcnO1xudmFyIFNVU1BFTlNFX1NUQVJUX0RBVEEgPSAnJCc7XG52YXIgU1VTUEVOU0VfRU5EX0RBVEEgPSAnLyQnO1xudmFyIFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSA9ICckPyc7XG52YXIgU1VTUEVOU0VfRkFMTEJBQ0tfU1RBUlRfREFUQSA9ICckISc7XG52YXIgU1RZTEUkMSA9ICdzdHlsZSc7XG52YXIgZXZlbnRzRW5hYmxlZCA9IG51bGw7XG52YXIgc2VsZWN0aW9uSW5mb3JtYXRpb24gPSBudWxsO1xuZnVuY3Rpb24gZ2V0Um9vdEhvc3RDb250ZXh0KHJvb3RDb250YWluZXJJbnN0YW5jZSkge1xuICB2YXIgdHlwZTtcbiAgdmFyIG5hbWVzcGFjZTtcbiAgdmFyIG5vZGVUeXBlID0gcm9vdENvbnRhaW5lckluc3RhbmNlLm5vZGVUeXBlO1xuXG4gIHN3aXRjaCAobm9kZVR5cGUpIHtcbiAgICBjYXNlIERPQ1VNRU5UX05PREU6XG4gICAgY2FzZSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFOlxuICAgICAge1xuICAgICAgICB0eXBlID0gbm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgPyAnI2RvY3VtZW50JyA6ICcjZnJhZ21lbnQnO1xuICAgICAgICB2YXIgcm9vdCA9IHJvb3RDb250YWluZXJJbnN0YW5jZS5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgIG5hbWVzcGFjZSA9IHJvb3QgPyByb290Lm5hbWVzcGFjZVVSSSA6IGdldENoaWxkTmFtZXNwYWNlKG51bGwsICcnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICB2YXIgY29udGFpbmVyID0gbm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSA/IHJvb3RDb250YWluZXJJbnN0YW5jZS5wYXJlbnROb2RlIDogcm9vdENvbnRhaW5lckluc3RhbmNlO1xuICAgICAgICB2YXIgb3duTmFtZXNwYWNlID0gY29udGFpbmVyLm5hbWVzcGFjZVVSSSB8fCBudWxsO1xuICAgICAgICB0eXBlID0gY29udGFpbmVyLnRhZ05hbWU7XG4gICAgICAgIG5hbWVzcGFjZSA9IGdldENoaWxkTmFtZXNwYWNlKG93bk5hbWVzcGFjZSwgdHlwZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG5cbiAge1xuICAgIHZhciB2YWxpZGF0ZWRUYWcgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIGFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm8obnVsbCwgdmFsaWRhdGVkVGFnKTtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZXNwYWNlOiBuYW1lc3BhY2UsXG4gICAgICBhbmNlc3RvckluZm86IGFuY2VzdG9ySW5mb1xuICAgIH07XG4gIH1cbn1cbmZ1bmN0aW9uIGdldENoaWxkSG9zdENvbnRleHQocGFyZW50SG9zdENvbnRleHQsIHR5cGUsIHJvb3RDb250YWluZXJJbnN0YW5jZSkge1xuICB7XG4gICAgdmFyIHBhcmVudEhvc3RDb250ZXh0RGV2ID0gcGFyZW50SG9zdENvbnRleHQ7XG4gICAgdmFyIG5hbWVzcGFjZSA9IGdldENoaWxkTmFtZXNwYWNlKHBhcmVudEhvc3RDb250ZXh0RGV2Lm5hbWVzcGFjZSwgdHlwZSk7XG4gICAgdmFyIGFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm8ocGFyZW50SG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvLCB0eXBlKTtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZXNwYWNlOiBuYW1lc3BhY2UsXG4gICAgICBhbmNlc3RvckluZm86IGFuY2VzdG9ySW5mb1xuICAgIH07XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFB1YmxpY0luc3RhbmNlKGluc3RhbmNlKSB7XG4gIHJldHVybiBpbnN0YW5jZTtcbn1cbmZ1bmN0aW9uIHByZXBhcmVGb3JDb21taXQoY29udGFpbmVySW5mbykge1xuICBldmVudHNFbmFibGVkID0gaXNFbmFibGVkKCk7XG4gIHNlbGVjdGlvbkluZm9ybWF0aW9uID0gZ2V0U2VsZWN0aW9uSW5mb3JtYXRpb24oKTtcbiAgdmFyIGFjdGl2ZUluc3RhbmNlID0gbnVsbDtcblxuICBzZXRFbmFibGVkKGZhbHNlKTtcbiAgcmV0dXJuIGFjdGl2ZUluc3RhbmNlO1xufVxuZnVuY3Rpb24gcmVzZXRBZnRlckNvbW1pdChjb250YWluZXJJbmZvKSB7XG4gIHJlc3RvcmVTZWxlY3Rpb24oc2VsZWN0aW9uSW5mb3JtYXRpb24pO1xuICBzZXRFbmFibGVkKGV2ZW50c0VuYWJsZWQpO1xuICBldmVudHNFbmFibGVkID0gbnVsbDtcbiAgc2VsZWN0aW9uSW5mb3JtYXRpb24gPSBudWxsO1xufVxuZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2UodHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQsIGludGVybmFsSW5zdGFuY2VIYW5kbGUpIHtcbiAgdmFyIHBhcmVudE5hbWVzcGFjZTtcblxuICB7XG4gICAgLy8gVE9ETzogdGFrZSBuYW1lc3BhY2UgaW50byBhY2NvdW50IHdoZW4gdmFsaWRhdGluZy5cbiAgICB2YXIgaG9zdENvbnRleHREZXYgPSBob3N0Q29udGV4dDtcbiAgICB2YWxpZGF0ZURPTU5lc3RpbmcodHlwZSwgbnVsbCwgaG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvKTtcblxuICAgIGlmICh0eXBlb2YgcHJvcHMuY2hpbGRyZW4gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ251bWJlcicpIHtcbiAgICAgIHZhciBzdHJpbmcgPSAnJyArIHByb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIG93bkFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm8oaG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvLCB0eXBlKTtcbiAgICAgIHZhbGlkYXRlRE9NTmVzdGluZyhudWxsLCBzdHJpbmcsIG93bkFuY2VzdG9ySW5mbyk7XG4gICAgfVxuXG4gICAgcGFyZW50TmFtZXNwYWNlID0gaG9zdENvbnRleHREZXYubmFtZXNwYWNlO1xuICB9XG5cbiAgdmFyIGRvbUVsZW1lbnQgPSBjcmVhdGVFbGVtZW50KHR5cGUsIHByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIHBhcmVudE5hbWVzcGFjZSk7XG4gIHByZWNhY2hlRmliZXJOb2RlKGludGVybmFsSW5zdGFuY2VIYW5kbGUsIGRvbUVsZW1lbnQpO1xuICB1cGRhdGVGaWJlclByb3BzKGRvbUVsZW1lbnQsIHByb3BzKTtcbiAgcmV0dXJuIGRvbUVsZW1lbnQ7XG59XG5mdW5jdGlvbiBhcHBlbmRJbml0aWFsQ2hpbGQocGFyZW50SW5zdGFuY2UsIGNoaWxkKSB7XG4gIHBhcmVudEluc3RhbmNlLmFwcGVuZENoaWxkKGNoaWxkKTtcbn1cbmZ1bmN0aW9uIGZpbmFsaXplSW5pdGlhbENoaWxkcmVuKGRvbUVsZW1lbnQsIHR5cGUsIHByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0KSB7XG4gIHNldEluaXRpYWxQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHR5cGUsIHByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UpO1xuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ2J1dHRvbic6XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgcmV0dXJuICEhcHJvcHMuYXV0b0ZvY3VzO1xuXG4gICAgY2FzZSAnaW1nJzpcbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gcHJlcGFyZVVwZGF0ZShkb21FbGVtZW50LCB0eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQpIHtcbiAge1xuICAgIHZhciBob3N0Q29udGV4dERldiA9IGhvc3RDb250ZXh0O1xuXG4gICAgaWYgKHR5cGVvZiBuZXdQcm9wcy5jaGlsZHJlbiAhPT0gdHlwZW9mIG9sZFByb3BzLmNoaWxkcmVuICYmICh0eXBlb2YgbmV3UHJvcHMuY2hpbGRyZW4gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBuZXdQcm9wcy5jaGlsZHJlbiA9PT0gJ251bWJlcicpKSB7XG4gICAgICB2YXIgc3RyaW5nID0gJycgKyBuZXdQcm9wcy5jaGlsZHJlbjtcbiAgICAgIHZhciBvd25BbmNlc3RvckluZm8gPSB1cGRhdGVkQW5jZXN0b3JJbmZvKGhvc3RDb250ZXh0RGV2LmFuY2VzdG9ySW5mbywgdHlwZSk7XG4gICAgICB2YWxpZGF0ZURPTU5lc3RpbmcobnVsbCwgc3RyaW5nLCBvd25BbmNlc3RvckluZm8pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkaWZmUHJvcGVydGllcyhkb21FbGVtZW50LCB0eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMpO1xufVxuZnVuY3Rpb24gc2hvdWxkU2V0VGV4dENvbnRlbnQodHlwZSwgcHJvcHMpIHtcbiAgcmV0dXJuIHR5cGUgPT09ICd0ZXh0YXJlYScgfHwgdHlwZSA9PT0gJ25vc2NyaXB0JyB8fCB0eXBlb2YgcHJvcHMuY2hpbGRyZW4gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MID09PSAnb2JqZWN0JyAmJiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAhPT0gbnVsbCAmJiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTC5fX2h0bWwgIT0gbnVsbDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVRleHRJbnN0YW5jZSh0ZXh0LCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0LCBpbnRlcm5hbEluc3RhbmNlSGFuZGxlKSB7XG4gIHtcbiAgICB2YXIgaG9zdENvbnRleHREZXYgPSBob3N0Q29udGV4dDtcbiAgICB2YWxpZGF0ZURPTU5lc3RpbmcobnVsbCwgdGV4dCwgaG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvKTtcbiAgfVxuXG4gIHZhciB0ZXh0Tm9kZSA9IGNyZWF0ZVRleHROb2RlKHRleHQsIHJvb3RDb250YWluZXJJbnN0YW5jZSk7XG4gIHByZWNhY2hlRmliZXJOb2RlKGludGVybmFsSW5zdGFuY2VIYW5kbGUsIHRleHROb2RlKTtcbiAgcmV0dXJuIHRleHROb2RlO1xufVxuZnVuY3Rpb24gZ2V0Q3VycmVudEV2ZW50UHJpb3JpdHkoKSB7XG4gIHZhciBjdXJyZW50RXZlbnQgPSB3aW5kb3cuZXZlbnQ7XG5cbiAgaWYgKGN1cnJlbnRFdmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIERlZmF1bHRFdmVudFByaW9yaXR5O1xuICB9XG5cbiAgcmV0dXJuIGdldEV2ZW50UHJpb3JpdHkoY3VycmVudEV2ZW50LnR5cGUpO1xufVxuLy8gaWYgYSBjb21wb25lbnQganVzdCBpbXBvcnRzIFJlYWN0RE9NIChlLmcuIGZvciBmaW5kRE9NTm9kZSkuXG4vLyBTb21lIGVudmlyb25tZW50cyBtaWdodCBub3QgaGF2ZSBzZXRUaW1lb3V0IG9yIGNsZWFyVGltZW91dC5cblxudmFyIHNjaGVkdWxlVGltZW91dCA9IHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nID8gc2V0VGltZW91dCA6IHVuZGVmaW5lZDtcbnZhciBjYW5jZWxUaW1lb3V0ID0gdHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJyA/IGNsZWFyVGltZW91dCA6IHVuZGVmaW5lZDtcbnZhciBub1RpbWVvdXQgPSAtMTtcbnZhciBsb2NhbFByb21pc2UgPSB0eXBlb2YgUHJvbWlzZSA9PT0gJ2Z1bmN0aW9uJyA/IFByb21pc2UgOiB1bmRlZmluZWQ7IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS1cbnZhciBzY2hlZHVsZU1pY3JvdGFzayA9IHR5cGVvZiBxdWV1ZU1pY3JvdGFzayA9PT0gJ2Z1bmN0aW9uJyA/IHF1ZXVlTWljcm90YXNrIDogdHlwZW9mIGxvY2FsUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgPyBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgcmV0dXJuIGxvY2FsUHJvbWlzZS5yZXNvbHZlKG51bGwpLnRoZW4oY2FsbGJhY2spLmNhdGNoKGhhbmRsZUVycm9ySW5OZXh0VGljayk7XG59IDogc2NoZWR1bGVUaW1lb3V0OyAvLyBUT0RPOiBEZXRlcm1pbmUgdGhlIGJlc3QgZmFsbGJhY2sgaGVyZS5cblxuZnVuY3Rpb24gaGFuZGxlRXJyb3JJbk5leHRUaWNrKGVycm9yKSB7XG4gIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIHRocm93IGVycm9yO1xuICB9KTtcbn0gLy8gLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gY29tbWl0TW91bnQoZG9tRWxlbWVudCwgdHlwZSwgbmV3UHJvcHMsIGludGVybmFsSW5zdGFuY2VIYW5kbGUpIHtcbiAgLy8gRGVzcGl0ZSB0aGUgbmFtaW5nIHRoYXQgbWlnaHQgaW1wbHkgb3RoZXJ3aXNlLCB0aGlzIG1ldGhvZCBvbmx5XG4gIC8vIGZpcmVzIGlmIHRoZXJlIGlzIGFuIGBVcGRhdGVgIGVmZmVjdCBzY2hlZHVsZWQgZHVyaW5nIG1vdW50aW5nLlxuICAvLyBUaGlzIGhhcHBlbnMgaWYgYGZpbmFsaXplSW5pdGlhbENoaWxkcmVuYCByZXR1cm5zIGB0cnVlYCAod2hpY2ggaXRcbiAgLy8gZG9lcyB0byBpbXBsZW1lbnQgdGhlIGBhdXRvRm9jdXNgIGF0dHJpYnV0ZSBvbiB0aGUgY2xpZW50KS4gQnV0XG4gIC8vIHRoZXJlIGFyZSBhbHNvIG90aGVyIGNhc2VzIHdoZW4gdGhpcyBtaWdodCBoYXBwZW4gKHN1Y2ggYXMgcGF0Y2hpbmdcbiAgLy8gdXAgdGV4dCBjb250ZW50IGR1cmluZyBoeWRyYXRpb24gbWlzbWF0Y2gpLiBTbyB3ZSdsbCBjaGVjayB0aGlzIGFnYWluLlxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdidXR0b24nOlxuICAgIGNhc2UgJ2lucHV0JzpcbiAgICBjYXNlICdzZWxlY3QnOlxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIGlmIChuZXdQcm9wcy5hdXRvRm9jdXMpIHtcbiAgICAgICAgZG9tRWxlbWVudC5mb2N1cygpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG5cbiAgICBjYXNlICdpbWcnOlxuICAgICAge1xuICAgICAgICBpZiAobmV3UHJvcHMuc3JjKSB7XG4gICAgICAgICAgZG9tRWxlbWVudC5zcmMgPSBuZXdQcm9wcy5zcmM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNvbW1pdFVwZGF0ZShkb21FbGVtZW50LCB1cGRhdGVQYXlsb2FkLCB0eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMsIGludGVybmFsSW5zdGFuY2VIYW5kbGUpIHtcbiAgLy8gQXBwbHkgdGhlIGRpZmYgdG8gdGhlIERPTSBub2RlLlxuICB1cGRhdGVQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHVwZGF0ZVBheWxvYWQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcyk7IC8vIFVwZGF0ZSB0aGUgcHJvcHMgaGFuZGxlIHNvIHRoYXQgd2Uga25vdyB3aGljaCBwcm9wcyBhcmUgdGhlIG9uZXMgd2l0aFxuICAvLyB3aXRoIGN1cnJlbnQgZXZlbnQgaGFuZGxlcnMuXG5cbiAgdXBkYXRlRmliZXJQcm9wcyhkb21FbGVtZW50LCBuZXdQcm9wcyk7XG59XG5mdW5jdGlvbiByZXNldFRleHRDb250ZW50KGRvbUVsZW1lbnQpIHtcbiAgc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCwgJycpO1xufVxuZnVuY3Rpb24gY29tbWl0VGV4dFVwZGF0ZSh0ZXh0SW5zdGFuY2UsIG9sZFRleHQsIG5ld1RleHQpIHtcbiAgdGV4dEluc3RhbmNlLm5vZGVWYWx1ZSA9IG5ld1RleHQ7XG59XG5mdW5jdGlvbiBhcHBlbmRDaGlsZChwYXJlbnRJbnN0YW5jZSwgY2hpbGQpIHtcbiAgcGFyZW50SW5zdGFuY2UuYXBwZW5kQ2hpbGQoY2hpbGQpO1xufVxuZnVuY3Rpb24gYXBwZW5kQ2hpbGRUb0NvbnRhaW5lcihjb250YWluZXIsIGNoaWxkKSB7XG4gIHZhciBwYXJlbnROb2RlO1xuXG4gIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgIHBhcmVudE5vZGUgPSBjb250YWluZXIucGFyZW50Tm9kZTtcbiAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZCwgY29udGFpbmVyKTtcbiAgfSBlbHNlIHtcbiAgICBwYXJlbnROb2RlID0gY29udGFpbmVyO1xuICAgIHBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICB9IC8vIFRoaXMgY29udGFpbmVyIG1pZ2h0IGJlIHVzZWQgZm9yIGEgcG9ydGFsLlxuICAvLyBJZiBzb21ldGhpbmcgaW5zaWRlIGEgcG9ydGFsIGlzIGNsaWNrZWQsIHRoYXQgY2xpY2sgc2hvdWxkIGJ1YmJsZVxuICAvLyB0aHJvdWdoIHRoZSBSZWFjdCB0cmVlLiBIb3dldmVyLCBvbiBNb2JpbGUgU2FmYXJpIHRoZSBjbGljayB3b3VsZFxuICAvLyBuZXZlciBidWJibGUgdGhyb3VnaCB0aGUgKkRPTSogdHJlZSB1bmxlc3MgYW4gYW5jZXN0b3Igd2l0aCBvbmNsaWNrXG4gIC8vIGV2ZW50IGV4aXN0cy4gU28gd2Ugd291bGRuJ3Qgc2VlIGl0IGFuZCBkaXNwYXRjaCBpdC5cbiAgLy8gVGhpcyBpcyB3aHkgd2UgZW5zdXJlIHRoYXQgbm9uIFJlYWN0IHJvb3QgY29udGFpbmVycyBoYXZlIGlubGluZSBvbmNsaWNrXG4gIC8vIGRlZmluZWQuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTE5MThcblxuXG4gIHZhciByZWFjdFJvb3RDb250YWluZXIgPSBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lcjtcblxuICBpZiAoKHJlYWN0Um9vdENvbnRhaW5lciA9PT0gbnVsbCB8fCByZWFjdFJvb3RDb250YWluZXIgPT09IHVuZGVmaW5lZCkgJiYgcGFyZW50Tm9kZS5vbmNsaWNrID09PSBudWxsKSB7XG4gICAgLy8gVE9ETzogVGhpcyBjYXN0IG1heSBub3QgYmUgc291bmQgZm9yIFNWRywgTWF0aE1MIG9yIGN1c3RvbSBlbGVtZW50cy5cbiAgICB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChwYXJlbnROb2RlKTtcbiAgfVxufVxuZnVuY3Rpb24gaW5zZXJ0QmVmb3JlKHBhcmVudEluc3RhbmNlLCBjaGlsZCwgYmVmb3JlQ2hpbGQpIHtcbiAgcGFyZW50SW5zdGFuY2UuaW5zZXJ0QmVmb3JlKGNoaWxkLCBiZWZvcmVDaGlsZCk7XG59XG5mdW5jdGlvbiBpbnNlcnRJbkNvbnRhaW5lckJlZm9yZShjb250YWluZXIsIGNoaWxkLCBiZWZvcmVDaGlsZCkge1xuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICBjb250YWluZXIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2hpbGQsIGJlZm9yZUNoaWxkKTtcbiAgfSBlbHNlIHtcbiAgICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKGNoaWxkLCBiZWZvcmVDaGlsZCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlQ2hpbGQocGFyZW50SW5zdGFuY2UsIGNoaWxkKSB7XG4gIHBhcmVudEluc3RhbmNlLnJlbW92ZUNoaWxkKGNoaWxkKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZUNoaWxkRnJvbUNvbnRhaW5lcihjb250YWluZXIsIGNoaWxkKSB7XG4gIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgIGNvbnRhaW5lci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNoaWxkKTtcbiAgfSBlbHNlIHtcbiAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQoY2hpbGQpO1xuICB9XG59XG5mdW5jdGlvbiBjbGVhclN1c3BlbnNlQm91bmRhcnkocGFyZW50SW5zdGFuY2UsIHN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgdmFyIG5vZGUgPSBzdXNwZW5zZUluc3RhbmNlOyAvLyBEZWxldGUgYWxsIG5vZGVzIHdpdGhpbiB0aGlzIHN1c3BlbnNlIGJvdW5kYXJ5LlxuICAvLyBUaGVyZSBtaWdodCBiZSBuZXN0ZWQgbm9kZXMgc28gd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIGhvd1xuICAvLyBkZWVwIHdlIGFyZSBhbmQgb25seSBicmVhayBvdXQgd2hlbiB3ZSdyZSBiYWNrIG9uIHRvcC5cblxuICB2YXIgZGVwdGggPSAwO1xuXG4gIGRvIHtcbiAgICB2YXIgbmV4dE5vZGUgPSBub2RlLm5leHRTaWJsaW5nO1xuICAgIHBhcmVudEluc3RhbmNlLnJlbW92ZUNoaWxkKG5vZGUpO1xuXG4gICAgaWYgKG5leHROb2RlICYmIG5leHROb2RlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICAgIHZhciBkYXRhID0gbmV4dE5vZGUuZGF0YTtcblxuICAgICAgaWYgKGRhdGEgPT09IFNVU1BFTlNFX0VORF9EQVRBKSB7XG4gICAgICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgICAgIHBhcmVudEluc3RhbmNlLnJlbW92ZUNoaWxkKG5leHROb2RlKTsgLy8gUmV0cnkgaWYgYW55IGV2ZW50IHJlcGxheWluZyB3YXMgYmxvY2tlZCBvbiB0aGlzLlxuXG4gICAgICAgICAgcmV0cnlJZkJsb2NrZWRPbihzdXNwZW5zZUluc3RhbmNlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkYXRhID09PSBTVVNQRU5TRV9TVEFSVF9EQVRBIHx8IGRhdGEgPT09IFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBKSB7XG4gICAgICAgIGRlcHRoKys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbm9kZSA9IG5leHROb2RlO1xuICB9IHdoaWxlIChub2RlKTsgLy8gVE9ETzogV2Fybiwgd2UgZGlkbid0IGZpbmQgdGhlIGVuZCBjb21tZW50IGJvdW5kYXJ5LlxuICAvLyBSZXRyeSBpZiBhbnkgZXZlbnQgcmVwbGF5aW5nIHdhcyBibG9ja2VkIG9uIHRoaXMuXG5cblxuICByZXRyeUlmQmxvY2tlZE9uKHN1c3BlbnNlSW5zdGFuY2UpO1xufVxuZnVuY3Rpb24gY2xlYXJTdXNwZW5zZUJvdW5kYXJ5RnJvbUNvbnRhaW5lcihjb250YWluZXIsIHN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgY2xlYXJTdXNwZW5zZUJvdW5kYXJ5KGNvbnRhaW5lci5wYXJlbnROb2RlLCBzdXNwZW5zZUluc3RhbmNlKTtcbiAgfSBlbHNlIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgIGNsZWFyU3VzcGVuc2VCb3VuZGFyeShjb250YWluZXIsIHN1c3BlbnNlSW5zdGFuY2UpO1xuICB9IC8vIFJldHJ5IGlmIGFueSBldmVudCByZXBsYXlpbmcgd2FzIGJsb2NrZWQgb24gdGhpcy5cblxuXG4gIHJldHJ5SWZCbG9ja2VkT24oY29udGFpbmVyKTtcbn1cbmZ1bmN0aW9uIGhpZGVJbnN0YW5jZShpbnN0YW5jZSkge1xuICAvLyBUT0RPOiBEb2VzIHRoaXMgd29yayBmb3IgYWxsIGVsZW1lbnQgdHlwZXM/IFdoYXQgYWJvdXQgTWF0aE1MPyBTaG91bGQgd2VcbiAgLy8gcGFzcyBob3N0IGNvbnRleHQgdG8gdGhpcyBtZXRob2Q/XG4gIGluc3RhbmNlID0gaW5zdGFuY2U7XG4gIHZhciBzdHlsZSA9IGluc3RhbmNlLnN0eWxlO1xuXG4gIGlmICh0eXBlb2Ygc3R5bGUuc2V0UHJvcGVydHkgPT09ICdmdW5jdGlvbicpIHtcbiAgICBzdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsICdub25lJywgJ2ltcG9ydGFudCcpO1xuICB9IGVsc2Uge1xuICAgIHN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH1cbn1cbmZ1bmN0aW9uIGhpZGVUZXh0SW5zdGFuY2UodGV4dEluc3RhbmNlKSB7XG4gIHRleHRJbnN0YW5jZS5ub2RlVmFsdWUgPSAnJztcbn1cbmZ1bmN0aW9uIHVuaGlkZUluc3RhbmNlKGluc3RhbmNlLCBwcm9wcykge1xuICBpbnN0YW5jZSA9IGluc3RhbmNlO1xuICB2YXIgc3R5bGVQcm9wID0gcHJvcHNbU1RZTEUkMV07XG4gIHZhciBkaXNwbGF5ID0gc3R5bGVQcm9wICE9PSB1bmRlZmluZWQgJiYgc3R5bGVQcm9wICE9PSBudWxsICYmIHN0eWxlUHJvcC5oYXNPd25Qcm9wZXJ0eSgnZGlzcGxheScpID8gc3R5bGVQcm9wLmRpc3BsYXkgOiBudWxsO1xuICBpbnN0YW5jZS5zdHlsZS5kaXNwbGF5ID0gZGFuZ2Vyb3VzU3R5bGVWYWx1ZSgnZGlzcGxheScsIGRpc3BsYXkpO1xufVxuZnVuY3Rpb24gdW5oaWRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSwgdGV4dCkge1xuICB0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlID0gdGV4dDtcbn1cbmZ1bmN0aW9uIGNsZWFyQ29udGFpbmVyKGNvbnRhaW5lcikge1xuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICBjb250YWluZXIudGV4dENvbnRlbnQgPSAnJztcbiAgfSBlbHNlIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUpIHtcbiAgICBpZiAoY29udGFpbmVyLmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKGNvbnRhaW5lci5kb2N1bWVudEVsZW1lbnQpO1xuICAgIH1cbiAgfVxufSAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBjYW5IeWRyYXRlSW5zdGFuY2UoaW5zdGFuY2UsIHR5cGUsIHByb3BzKSB7XG4gIGlmIChpbnN0YW5jZS5ub2RlVHlwZSAhPT0gRUxFTUVOVF9OT0RFIHx8IHR5cGUudG9Mb3dlckNhc2UoKSAhPT0gaW5zdGFuY2Uubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9IC8vIFRoaXMgaGFzIG5vdyBiZWVuIHJlZmluZWQgdG8gYW4gZWxlbWVudCBub2RlLlxuXG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuZnVuY3Rpb24gY2FuSHlkcmF0ZVRleHRJbnN0YW5jZShpbnN0YW5jZSwgdGV4dCkge1xuICBpZiAodGV4dCA9PT0gJycgfHwgaW5zdGFuY2Uubm9kZVR5cGUgIT09IFRFWFRfTk9ERSkge1xuICAgIC8vIEVtcHR5IHN0cmluZ3MgYXJlIG5vdCBwYXJzZWQgYnkgSFRNTCBzbyB0aGVyZSB3b24ndCBiZSBhIGNvcnJlY3QgbWF0Y2ggaGVyZS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBUaGlzIGhhcyBub3cgYmVlbiByZWZpbmVkIHRvIGEgdGV4dCBub2RlLlxuXG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuZnVuY3Rpb24gY2FuSHlkcmF0ZVN1c3BlbnNlSW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgaWYgKGluc3RhbmNlLm5vZGVUeXBlICE9PSBDT01NRU5UX05PREUpIHtcbiAgICAvLyBFbXB0eSBzdHJpbmdzIGFyZSBub3QgcGFyc2VkIGJ5IEhUTUwgc28gdGhlcmUgd29uJ3QgYmUgYSBjb3JyZWN0IG1hdGNoIGhlcmUuXG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLy8gVGhpcyBoYXMgbm93IGJlZW4gcmVmaW5lZCB0byBhIHN1c3BlbnNlIG5vZGUuXG5cblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5mdW5jdGlvbiBpc1N1c3BlbnNlSW5zdGFuY2VQZW5kaW5nKGluc3RhbmNlKSB7XG4gIHJldHVybiBpbnN0YW5jZS5kYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEE7XG59XG5mdW5jdGlvbiBpc1N1c3BlbnNlSW5zdGFuY2VGYWxsYmFjayhpbnN0YW5jZSkge1xuICByZXR1cm4gaW5zdGFuY2UuZGF0YSA9PT0gU1VTUEVOU0VfRkFMTEJBQ0tfU1RBUlRfREFUQTtcbn1cbmZ1bmN0aW9uIGdldFN1c3BlbnNlSW5zdGFuY2VGYWxsYmFja0Vycm9yRGV0YWlscyhpbnN0YW5jZSkge1xuICB2YXIgZGF0YXNldCA9IGluc3RhbmNlLm5leHRTaWJsaW5nICYmIGluc3RhbmNlLm5leHRTaWJsaW5nLmRhdGFzZXQ7XG4gIHZhciBkaWdlc3QsIG1lc3NhZ2UsIHN0YWNrO1xuXG4gIGlmIChkYXRhc2V0KSB7XG4gICAgZGlnZXN0ID0gZGF0YXNldC5kZ3N0O1xuXG4gICAge1xuICAgICAgbWVzc2FnZSA9IGRhdGFzZXQubXNnO1xuICAgICAgc3RhY2sgPSBkYXRhc2V0LnN0Y2s7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIHJldHVybiB7XG4gICAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgICAgZGlnZXN0OiBkaWdlc3QsXG4gICAgICBzdGFjazogc3RhY2tcbiAgICB9O1xuICB9IC8vIGxldCB2YWx1ZSA9IHttZXNzYWdlOiB1bmRlZmluZWQsIGhhc2g6IHVuZGVmaW5lZH07XG4gIC8vIGNvbnN0IG5leHRTaWJsaW5nID0gaW5zdGFuY2UubmV4dFNpYmxpbmc7XG4gIC8vIGlmIChuZXh0U2libGluZykge1xuICAvLyAgIGNvbnN0IGRhdGFzZXQgPSAoKG5leHRTaWJsaW5nOiBhbnkpOiBIVE1MVGVtcGxhdGVFbGVtZW50KS5kYXRhc2V0O1xuICAvLyAgIHZhbHVlLm1lc3NhZ2UgPSBkYXRhc2V0Lm1zZztcbiAgLy8gICB2YWx1ZS5oYXNoID0gZGF0YXNldC5oYXNoO1xuICAvLyAgIGlmICh0cnVlKSB7XG4gIC8vICAgICB2YWx1ZS5zdGFjayA9IGRhdGFzZXQuc3RhY2s7XG4gIC8vICAgfVxuICAvLyB9XG4gIC8vIHJldHVybiB2YWx1ZTtcblxufVxuZnVuY3Rpb24gcmVnaXN0ZXJTdXNwZW5zZUluc3RhbmNlUmV0cnkoaW5zdGFuY2UsIGNhbGxiYWNrKSB7XG4gIGluc3RhbmNlLl9yZWFjdFJldHJ5ID0gY2FsbGJhY2s7XG59XG5cbmZ1bmN0aW9uIGdldE5leHRIeWRyYXRhYmxlKG5vZGUpIHtcbiAgLy8gU2tpcCBub24taHlkcmF0YWJsZSBub2Rlcy5cbiAgZm9yICg7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICB2YXIgbm9kZVR5cGUgPSBub2RlLm5vZGVUeXBlO1xuXG4gICAgaWYgKG5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgfHwgbm9kZVR5cGUgPT09IFRFWFRfTk9ERSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKG5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICAgIHZhciBub2RlRGF0YSA9IG5vZGUuZGF0YTtcblxuICAgICAgaWYgKG5vZGVEYXRhID09PSBTVVNQRU5TRV9TVEFSVF9EQVRBIHx8IG5vZGVEYXRhID09PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBIHx8IG5vZGVEYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlRGF0YSA9PT0gU1VTUEVOU0VfRU5EX0RBVEEpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59XG5cbmZ1bmN0aW9uIGdldE5leHRIeWRyYXRhYmxlU2libGluZyhpbnN0YW5jZSkge1xuICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGUoaW5zdGFuY2UubmV4dFNpYmxpbmcpO1xufVxuZnVuY3Rpb24gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGQocGFyZW50SW5zdGFuY2UpIHtcbiAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlKHBhcmVudEluc3RhbmNlLmZpcnN0Q2hpbGQpO1xufVxuZnVuY3Rpb24gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGRXaXRoaW5Db250YWluZXIocGFyZW50Q29udGFpbmVyKSB7XG4gIHJldHVybiBnZXROZXh0SHlkcmF0YWJsZShwYXJlbnRDb250YWluZXIuZmlyc3RDaGlsZCk7XG59XG5mdW5jdGlvbiBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZFdpdGhpblN1c3BlbnNlSW5zdGFuY2UocGFyZW50SW5zdGFuY2UpIHtcbiAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlKHBhcmVudEluc3RhbmNlLm5leHRTaWJsaW5nKTtcbn1cbmZ1bmN0aW9uIGh5ZHJhdGVJbnN0YW5jZShpbnN0YW5jZSwgdHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQsIGludGVybmFsSW5zdGFuY2VIYW5kbGUsIHNob3VsZFdhcm5EZXYpIHtcbiAgcHJlY2FjaGVGaWJlck5vZGUoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgaW5zdGFuY2UpOyAvLyBUT0RPOiBQb3NzaWJseSBkZWZlciB0aGlzIHVudGlsIHRoZSBjb21taXQgcGhhc2Ugd2hlcmUgYWxsIHRoZSBldmVudHNcbiAgLy8gZ2V0IGF0dGFjaGVkLlxuXG4gIHVwZGF0ZUZpYmVyUHJvcHMoaW5zdGFuY2UsIHByb3BzKTtcbiAgdmFyIHBhcmVudE5hbWVzcGFjZTtcblxuICB7XG4gICAgdmFyIGhvc3RDb250ZXh0RGV2ID0gaG9zdENvbnRleHQ7XG4gICAgcGFyZW50TmFtZXNwYWNlID0gaG9zdENvbnRleHREZXYubmFtZXNwYWNlO1xuICB9IC8vIFRPRE86IFRlbXBvcmFyeSBoYWNrIHRvIGNoZWNrIGlmIHdlJ3JlIGluIGEgY29uY3VycmVudCByb290LiBXZSBjYW4gZGVsZXRlXG4gIC8vIHdoZW4gdGhlIGxlZ2FjeSByb290IEFQSSBpcyByZW1vdmVkLlxuXG5cbiAgdmFyIGlzQ29uY3VycmVudE1vZGUgPSAoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZS5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG4gIHJldHVybiBkaWZmSHlkcmF0ZWRQcm9wZXJ0aWVzKGluc3RhbmNlLCB0eXBlLCBwcm9wcywgcGFyZW50TmFtZXNwYWNlLCByb290Q29udGFpbmVySW5zdGFuY2UsIGlzQ29uY3VycmVudE1vZGUsIHNob3VsZFdhcm5EZXYpO1xufVxuZnVuY3Rpb24gaHlkcmF0ZVRleHRJbnN0YW5jZSh0ZXh0SW5zdGFuY2UsIHRleHQsIGludGVybmFsSW5zdGFuY2VIYW5kbGUsIHNob3VsZFdhcm5EZXYpIHtcbiAgcHJlY2FjaGVGaWJlck5vZGUoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgdGV4dEluc3RhbmNlKTsgLy8gVE9ETzogVGVtcG9yYXJ5IGhhY2sgdG8gY2hlY2sgaWYgd2UncmUgaW4gYSBjb25jdXJyZW50IHJvb3QuIFdlIGNhbiBkZWxldGVcbiAgLy8gd2hlbiB0aGUgbGVnYWN5IHJvb3QgQVBJIGlzIHJlbW92ZWQuXG5cbiAgdmFyIGlzQ29uY3VycmVudE1vZGUgPSAoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZS5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG4gIHJldHVybiBkaWZmSHlkcmF0ZWRUZXh0KHRleHRJbnN0YW5jZSwgdGV4dCk7XG59XG5mdW5jdGlvbiBoeWRyYXRlU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZUluc3RhbmNlLCBpbnRlcm5hbEluc3RhbmNlSGFuZGxlKSB7XG4gIHByZWNhY2hlRmliZXJOb2RlKGludGVybmFsSW5zdGFuY2VIYW5kbGUsIHN1c3BlbnNlSW5zdGFuY2UpO1xufVxuZnVuY3Rpb24gZ2V0TmV4dEh5ZHJhdGFibGVJbnN0YW5jZUFmdGVyU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZUluc3RhbmNlKSB7XG4gIHZhciBub2RlID0gc3VzcGVuc2VJbnN0YW5jZS5uZXh0U2libGluZzsgLy8gU2tpcCBwYXN0IGFsbCBub2RlcyB3aXRoaW4gdGhpcyBzdXNwZW5zZSBib3VuZGFyeS5cbiAgLy8gVGhlcmUgbWlnaHQgYmUgbmVzdGVkIG5vZGVzIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiBob3dcbiAgLy8gZGVlcCB3ZSBhcmUgYW5kIG9ubHkgYnJlYWsgb3V0IHdoZW4gd2UncmUgYmFjayBvbiB0b3AuXG5cbiAgdmFyIGRlcHRoID0gMDtcblxuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICAgIHZhciBkYXRhID0gbm9kZS5kYXRhO1xuXG4gICAgICBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfRU5EX0RBVEEpIHtcbiAgICAgICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlU2libGluZyhub2RlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZXB0aC0tO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRhdGEgPT09IFNVU1BFTlNFX1NUQVJUX0RBVEEgfHwgZGF0YSA9PT0gU1VTUEVOU0VfRkFMTEJBQ0tfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEpIHtcbiAgICAgICAgZGVwdGgrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBub2RlID0gbm9kZS5uZXh0U2libGluZztcbiAgfSAvLyBUT0RPOiBXYXJuLCB3ZSBkaWRuJ3QgZmluZCB0aGUgZW5kIGNvbW1lbnQgYm91bmRhcnkuXG5cblxuICByZXR1cm4gbnVsbDtcbn0gLy8gUmV0dXJucyB0aGUgU3VzcGVuc2VJbnN0YW5jZSBpZiB0aGlzIG5vZGUgaXMgYSBkaXJlY3QgY2hpbGQgb2YgYVxuLy8gU3VzcGVuc2VJbnN0YW5jZS4gSS5lLiBpZiBpdHMgcHJldmlvdXMgc2libGluZyBpcyBhIENvbW1lbnQgd2l0aFxuLy8gU1VTUEVOU0VfeF9TVEFSVF9EQVRBLiBPdGhlcndpc2UsIG51bGwuXG5cbmZ1bmN0aW9uIGdldFBhcmVudFN1c3BlbnNlSW5zdGFuY2UodGFyZ2V0SW5zdGFuY2UpIHtcbiAgdmFyIG5vZGUgPSB0YXJnZXRJbnN0YW5jZS5wcmV2aW91c1NpYmxpbmc7IC8vIFNraXAgcGFzdCBhbGwgbm9kZXMgd2l0aGluIHRoaXMgc3VzcGVuc2UgYm91bmRhcnkuXG4gIC8vIFRoZXJlIG1pZ2h0IGJlIG5lc3RlZCBub2RlcyBzbyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgaG93XG4gIC8vIGRlZXAgd2UgYXJlIGFuZCBvbmx5IGJyZWFrIG91dCB3aGVuIHdlJ3JlIGJhY2sgb24gdG9wLlxuXG4gIHZhciBkZXB0aCA9IDA7XG5cbiAgd2hpbGUgKG5vZGUpIHtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgICB2YXIgZGF0YSA9IG5vZGUuZGF0YTtcblxuICAgICAgaWYgKGRhdGEgPT09IFNVU1BFTlNFX1NUQVJUX0RBVEEgfHwgZGF0YSA9PT0gU1VTUEVOU0VfRkFMTEJBQ0tfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEpIHtcbiAgICAgICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkYXRhID09PSBTVVNQRU5TRV9FTkRfREFUQSkge1xuICAgICAgICBkZXB0aCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5vZGUgPSBub2RlLnByZXZpb3VzU2libGluZztcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gY29tbWl0SHlkcmF0ZWRDb250YWluZXIoY29udGFpbmVyKSB7XG4gIC8vIFJldHJ5IGlmIGFueSBldmVudCByZXBsYXlpbmcgd2FzIGJsb2NrZWQgb24gdGhpcy5cbiAgcmV0cnlJZkJsb2NrZWRPbihjb250YWluZXIpO1xufVxuZnVuY3Rpb24gY29tbWl0SHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgLy8gUmV0cnkgaWYgYW55IGV2ZW50IHJlcGxheWluZyB3YXMgYmxvY2tlZCBvbiB0aGlzLlxuICByZXRyeUlmQmxvY2tlZE9uKHN1c3BlbnNlSW5zdGFuY2UpO1xufVxuZnVuY3Rpb24gc2hvdWxkRGVsZXRlVW5oeWRyYXRlZFRhaWxJbnN0YW5jZXMocGFyZW50VHlwZSkge1xuICByZXR1cm4gcGFyZW50VHlwZSAhPT0gJ2hlYWQnICYmIHBhcmVudFR5cGUgIT09ICdib2R5Jztcbn1cbmZ1bmN0aW9uIGRpZE5vdE1hdGNoSHlkcmF0ZWRDb250YWluZXJUZXh0SW5zdGFuY2UocGFyZW50Q29udGFpbmVyLCB0ZXh0SW5zdGFuY2UsIHRleHQsIGlzQ29uY3VycmVudE1vZGUpIHtcbiAgdmFyIHNob3VsZFdhcm5EZXYgPSB0cnVlO1xuICBjaGVja0ZvclVubWF0Y2hlZFRleHQodGV4dEluc3RhbmNlLm5vZGVWYWx1ZSwgdGV4dCwgaXNDb25jdXJyZW50TW9kZSwgc2hvdWxkV2FybkRldik7XG59XG5mdW5jdGlvbiBkaWROb3RNYXRjaEh5ZHJhdGVkVGV4dEluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgdGV4dEluc3RhbmNlLCB0ZXh0LCBpc0NvbmN1cnJlbnRNb2RlKSB7XG4gIGlmIChwYXJlbnRQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxXSAhPT0gdHJ1ZSkge1xuICAgIHZhciBzaG91bGRXYXJuRGV2ID0gdHJ1ZTtcbiAgICBjaGVja0ZvclVubWF0Y2hlZFRleHQodGV4dEluc3RhbmNlLm5vZGVWYWx1ZSwgdGV4dCwgaXNDb25jdXJyZW50TW9kZSwgc2hvdWxkV2FybkRldik7XG4gIH1cbn1cbmZ1bmN0aW9uIGRpZE5vdEh5ZHJhdGVJbnN0YW5jZVdpdGhpbkNvbnRhaW5lcihwYXJlbnRDb250YWluZXIsIGluc3RhbmNlKSB7XG4gIHtcbiAgICBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlRWxlbWVudChwYXJlbnRDb250YWluZXIsIGluc3RhbmNlKTtcbiAgICB9IGVsc2UgaWYgKGluc3RhbmNlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIDsgZWxzZSB7XG4gICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVUZXh0KHBhcmVudENvbnRhaW5lciwgaW5zdGFuY2UpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90SHlkcmF0ZUluc3RhbmNlV2l0aGluU3VzcGVuc2VJbnN0YW5jZShwYXJlbnRJbnN0YW5jZSwgaW5zdGFuY2UpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWU6IE9ubHkgRWxlbWVudCBvciBEb2N1bWVudCBjYW4gYmUgcGFyZW50IG5vZGVzLlxuICAgIHZhciBwYXJlbnROb2RlID0gcGFyZW50SW5zdGFuY2UucGFyZW50Tm9kZTtcblxuICAgIGlmIChwYXJlbnROb2RlICE9PSBudWxsKSB7XG4gICAgICBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVFbGVtZW50KHBhcmVudE5vZGUsIGluc3RhbmNlKTtcbiAgICAgIH0gZWxzZSBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkgOyBlbHNlIHtcbiAgICAgICAgd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlVGV4dChwYXJlbnROb2RlLCBpbnN0YW5jZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBkaWROb3RIeWRyYXRlSW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCBpbnN0YW5jZSwgaXNDb25jdXJyZW50TW9kZSkge1xuICB7XG4gICAgaWYgKGlzQ29uY3VycmVudE1vZGUgfHwgcGFyZW50UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkckMV0gIT09IHRydWUpIHtcbiAgICAgIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZUVsZW1lbnQocGFyZW50SW5zdGFuY2UsIGluc3RhbmNlKTtcbiAgICAgIH0gZWxzZSBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkgOyBlbHNlIHtcbiAgICAgICAgd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlVGV4dChwYXJlbnRJbnN0YW5jZSwgaW5zdGFuY2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVJbnN0YW5jZVdpdGhpbkNvbnRhaW5lcihwYXJlbnRDb250YWluZXIsIHR5cGUsIHByb3BzKSB7XG4gIHtcbiAgICB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZEVsZW1lbnQocGFyZW50Q29udGFpbmVyLCB0eXBlKTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVUZXh0SW5zdGFuY2VXaXRoaW5Db250YWluZXIocGFyZW50Q29udGFpbmVyLCB0ZXh0KSB7XG4gIHtcbiAgICB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZFRleHQocGFyZW50Q29udGFpbmVyLCB0ZXh0KTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVJbnN0YW5jZVdpdGhpblN1c3BlbnNlSW5zdGFuY2UocGFyZW50SW5zdGFuY2UsIHR5cGUsIHByb3BzKSB7XG4gIHtcbiAgICAvLyAkRmxvd0ZpeE1lOiBPbmx5IEVsZW1lbnQgb3IgRG9jdW1lbnQgY2FuIGJlIHBhcmVudCBub2Rlcy5cbiAgICB2YXIgcGFyZW50Tm9kZSA9IHBhcmVudEluc3RhbmNlLnBhcmVudE5vZGU7XG4gICAgaWYgKHBhcmVudE5vZGUgIT09IG51bGwpIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkRWxlbWVudChwYXJlbnROb2RlLCB0eXBlKTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVUZXh0SW5zdGFuY2VXaXRoaW5TdXNwZW5zZUluc3RhbmNlKHBhcmVudEluc3RhbmNlLCB0ZXh0KSB7XG4gIHtcbiAgICAvLyAkRmxvd0ZpeE1lOiBPbmx5IEVsZW1lbnQgb3IgRG9jdW1lbnQgY2FuIGJlIHBhcmVudCBub2Rlcy5cbiAgICB2YXIgcGFyZW50Tm9kZSA9IHBhcmVudEluc3RhbmNlLnBhcmVudE5vZGU7XG4gICAgaWYgKHBhcmVudE5vZGUgIT09IG51bGwpIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkVGV4dChwYXJlbnROb2RlLCB0ZXh0KTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIHR5cGUsIHByb3BzLCBpc0NvbmN1cnJlbnRNb2RlKSB7XG4gIHtcbiAgICBpZiAoaXNDb25jdXJyZW50TW9kZSB8fCBwYXJlbnRQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxXSAhPT0gdHJ1ZSkge1xuICAgICAgd2FybkZvckluc2VydGVkSHlkcmF0ZWRFbGVtZW50KHBhcmVudEluc3RhbmNlLCB0eXBlKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGRpZE5vdEZpbmRIeWRyYXRhYmxlVGV4dEluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgdGV4dCwgaXNDb25jdXJyZW50TW9kZSkge1xuICB7XG4gICAgaWYgKGlzQ29uY3VycmVudE1vZGUgfHwgcGFyZW50UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkckMV0gIT09IHRydWUpIHtcbiAgICAgIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkVGV4dChwYXJlbnRJbnN0YW5jZSwgdGV4dCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBlcnJvckh5ZHJhdGluZ0NvbnRhaW5lcihwYXJlbnRDb250YWluZXIpIHtcbiAge1xuICAgIC8vIFRPRE86IFRoaXMgZ2V0cyBsb2dnZWQgYnkgb25SZWNvdmVyYWJsZUVycm9yLCB0b28sIHNvIHdlIHNob3VsZCBiZVxuICAgIC8vIGFibGUgdG8gcmVtb3ZlIGl0LlxuICAgIGVycm9yKCdBbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgaHlkcmF0aW9uLiBUaGUgc2VydmVyIEhUTUwgd2FzIHJlcGxhY2VkIHdpdGggY2xpZW50IGNvbnRlbnQgaW4gPCVzPi4nLCBwYXJlbnRDb250YWluZXIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHByZXBhcmVQb3J0YWxNb3VudChwb3J0YWxJbnN0YW5jZSkge1xuICBsaXN0ZW5Ub0FsbFN1cHBvcnRlZEV2ZW50cyhwb3J0YWxJbnN0YW5jZSk7XG59XG5cbnZhciByYW5kb21LZXkgPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKTtcbnZhciBpbnRlcm5hbEluc3RhbmNlS2V5ID0gJ19fcmVhY3RGaWJlciQnICsgcmFuZG9tS2V5O1xudmFyIGludGVybmFsUHJvcHNLZXkgPSAnX19yZWFjdFByb3BzJCcgKyByYW5kb21LZXk7XG52YXIgaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleSA9ICdfX3JlYWN0Q29udGFpbmVyJCcgKyByYW5kb21LZXk7XG52YXIgaW50ZXJuYWxFdmVudEhhbmRsZXJzS2V5ID0gJ19fcmVhY3RFdmVudHMkJyArIHJhbmRvbUtleTtcbnZhciBpbnRlcm5hbEV2ZW50SGFuZGxlckxpc3RlbmVyc0tleSA9ICdfX3JlYWN0TGlzdGVuZXJzJCcgKyByYW5kb21LZXk7XG52YXIgaW50ZXJuYWxFdmVudEhhbmRsZXNTZXRLZXkgPSAnX19yZWFjdEhhbmRsZXMkJyArIHJhbmRvbUtleTtcbmZ1bmN0aW9uIGRldGFjaERlbGV0ZWRJbnN0YW5jZShub2RlKSB7XG4gIC8vIFRPRE86IFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgb24gaG9zdCBjb21wb25lbnRzLiBJIGRvbid0IHRoaW5rIGFsbCBvZlxuICAvLyB0aGVzZSBmaWVsZHMgYXJlIHJlbGV2YW50LlxuICBkZWxldGUgbm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XTtcbiAgZGVsZXRlIG5vZGVbaW50ZXJuYWxQcm9wc0tleV07XG4gIGRlbGV0ZSBub2RlW2ludGVybmFsRXZlbnRIYW5kbGVyc0tleV07XG4gIGRlbGV0ZSBub2RlW2ludGVybmFsRXZlbnRIYW5kbGVyTGlzdGVuZXJzS2V5XTtcbiAgZGVsZXRlIG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXNTZXRLZXldO1xufVxuZnVuY3Rpb24gcHJlY2FjaGVGaWJlck5vZGUoaG9zdEluc3QsIG5vZGUpIHtcbiAgbm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XSA9IGhvc3RJbnN0O1xufVxuZnVuY3Rpb24gbWFya0NvbnRhaW5lckFzUm9vdChob3N0Um9vdCwgbm9kZSkge1xuICBub2RlW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldID0gaG9zdFJvb3Q7XG59XG5mdW5jdGlvbiB1bm1hcmtDb250YWluZXJBc1Jvb3Qobm9kZSkge1xuICBub2RlW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldID0gbnVsbDtcbn1cbmZ1bmN0aW9uIGlzQ29udGFpbmVyTWFya2VkQXNSb290KG5vZGUpIHtcbiAgcmV0dXJuICEhbm9kZVtpbnRlcm5hbENvbnRhaW5lckluc3RhbmNlS2V5XTtcbn0gLy8gR2l2ZW4gYSBET00gbm9kZSwgcmV0dXJuIHRoZSBjbG9zZXN0IEhvc3RDb21wb25lbnQgb3IgSG9zdFRleHQgZmliZXIgYW5jZXN0b3IuXG4vLyBJZiB0aGUgdGFyZ2V0IG5vZGUgaXMgcGFydCBvZiBhIGh5ZHJhdGVkIG9yIG5vdCB5ZXQgcmVuZGVyZWQgc3VidHJlZSwgdGhlblxuLy8gdGhpcyBtYXkgYWxzbyByZXR1cm4gYSBTdXNwZW5zZUNvbXBvbmVudCBvciBIb3N0Um9vdCB0byBpbmRpY2F0ZSB0aGF0LlxuLy8gQ29uY2VwdHVhbGx5IHRoZSBIb3N0Um9vdCBmaWJlciBpcyBhIGNoaWxkIG9mIHRoZSBDb250YWluZXIgbm9kZS4gU28gaWYgeW91XG4vLyBwYXNzIHRoZSBDb250YWluZXIgbm9kZSBhcyB0aGUgdGFyZ2V0Tm9kZSwgeW91IHdpbGwgbm90IGFjdHVhbGx5IGdldCB0aGVcbi8vIEhvc3RSb290IGJhY2suIFRvIGdldCB0byB0aGUgSG9zdFJvb3QsIHlvdSBuZWVkIHRvIHBhc3MgYSBjaGlsZCBvZiBpdC5cbi8vIFRoZSBzYW1lIHRoaW5nIGFwcGxpZXMgdG8gU3VzcGVuc2UgYm91bmRhcmllcy5cblxuZnVuY3Rpb24gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUodGFyZ2V0Tm9kZSkge1xuICB2YXIgdGFyZ2V0SW5zdCA9IHRhcmdldE5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV07XG5cbiAgaWYgKHRhcmdldEluc3QpIHtcbiAgICAvLyBEb24ndCByZXR1cm4gSG9zdFJvb3Qgb3IgU3VzcGVuc2VDb21wb25lbnQgaGVyZS5cbiAgICByZXR1cm4gdGFyZ2V0SW5zdDtcbiAgfSAvLyBJZiB0aGUgZGlyZWN0IGV2ZW50IHRhcmdldCBpc24ndCBhIFJlYWN0IG93bmVkIERPTSBub2RlLCB3ZSBuZWVkIHRvIGxvb2tcbiAgLy8gdG8gc2VlIGlmIG9uZSBvZiBpdHMgcGFyZW50cyBpcyBhIFJlYWN0IG93bmVkIERPTSBub2RlLlxuXG5cbiAgdmFyIHBhcmVudE5vZGUgPSB0YXJnZXROb2RlLnBhcmVudE5vZGU7XG5cbiAgd2hpbGUgKHBhcmVudE5vZGUpIHtcbiAgICAvLyBXZSdsbCBjaGVjayBpZiB0aGlzIGlzIGEgY29udGFpbmVyIHJvb3QgdGhhdCBjb3VsZCBpbmNsdWRlXG4gICAgLy8gUmVhY3Qgbm9kZXMgaW4gdGhlIGZ1dHVyZS4gV2UgbmVlZCB0byBjaGVjayB0aGlzIGZpcnN0IGJlY2F1c2VcbiAgICAvLyBpZiB3ZSdyZSBhIGNoaWxkIG9mIGEgZGVoeWRyYXRlZCBjb250YWluZXIsIHdlIG5lZWQgdG8gZmlyc3RcbiAgICAvLyBmaW5kIHRoYXQgaW5uZXIgY29udGFpbmVyIGJlZm9yZSBtb3Zpbmcgb24gdG8gZmluZGluZyB0aGUgcGFyZW50XG4gICAgLy8gaW5zdGFuY2UuIE5vdGUgdGhhdCB3ZSBkb24ndCBjaGVjayB0aGlzIGZpZWxkIG9uICB0aGUgdGFyZ2V0Tm9kZVxuICAgIC8vIGl0c2VsZiBiZWNhdXNlIHRoZSBmaWJlcnMgYXJlIGNvbmNlcHR1YWxseSBiZXR3ZWVuIHRoZSBjb250YWluZXJcbiAgICAvLyBub2RlIGFuZCB0aGUgZmlyc3QgY2hpbGQuIEl0IGlzbid0IHN1cnJvdW5kaW5nIHRoZSBjb250YWluZXIgbm9kZS5cbiAgICAvLyBJZiBpdCdzIG5vdCBhIGNvbnRhaW5lciwgd2UgY2hlY2sgaWYgaXQncyBhbiBpbnN0YW5jZS5cbiAgICB0YXJnZXRJbnN0ID0gcGFyZW50Tm9kZVtpbnRlcm5hbENvbnRhaW5lckluc3RhbmNlS2V5XSB8fCBwYXJlbnROb2RlW2ludGVybmFsSW5zdGFuY2VLZXldO1xuXG4gICAgaWYgKHRhcmdldEluc3QpIHtcbiAgICAgIC8vIFNpbmNlIHRoaXMgd2Fzbid0IHRoZSBkaXJlY3QgdGFyZ2V0IG9mIHRoZSBldmVudCwgd2UgbWlnaHQgaGF2ZVxuICAgICAgLy8gc3RlcHBlZCBwYXN0IGRlaHlkcmF0ZWQgRE9NIG5vZGVzIHRvIGdldCBoZXJlLiBIb3dldmVyIHRoZXkgY291bGRcbiAgICAgIC8vIGFsc28gaGF2ZSBiZWVuIG5vbi1SZWFjdCBub2Rlcy4gV2UgbmVlZCB0byBhbnN3ZXIgd2hpY2ggb25lLlxuICAgICAgLy8gSWYgd2UgdGhlIGluc3RhbmNlIGRvZXNuJ3QgaGF2ZSBhbnkgY2hpbGRyZW4sIHRoZW4gdGhlcmUgY2FuJ3QgYmVcbiAgICAgIC8vIGEgbmVzdGVkIHN1c3BlbnNlIGJvdW5kYXJ5IHdpdGhpbiBpdC4gU28gd2UgY2FuIHVzZSB0aGlzIGFzIGEgZmFzdFxuICAgICAgLy8gYmFpbG91dC4gTW9zdCBvZiB0aGUgdGltZSwgd2hlbiBwZW9wbGUgYWRkIG5vbi1SZWFjdCBjaGlsZHJlbiB0b1xuICAgICAgLy8gdGhlIHRyZWUsIGl0IGlzIHVzaW5nIGEgcmVmIHRvIGEgY2hpbGQtbGVzcyBET00gbm9kZS5cbiAgICAgIC8vIE5vcm1hbGx5IHdlJ2Qgb25seSBuZWVkIHRvIGNoZWNrIG9uZSBvZiB0aGUgZmliZXJzIGJlY2F1c2UgaWYgaXRcbiAgICAgIC8vIGhhcyBldmVyIGdvbmUgZnJvbSBoYXZpbmcgY2hpbGRyZW4gdG8gZGVsZXRpbmcgdGhlbSBvciB2aWNlIHZlcnNhXG4gICAgICAvLyBpdCB3b3VsZCBoYXZlIGRlbGV0ZWQgdGhlIGRlaHlkcmF0ZWQgYm91bmRhcnkgbmVzdGVkIGluc2lkZSBhbHJlYWR5LlxuICAgICAgLy8gSG93ZXZlciwgc2luY2UgdGhlIEhvc3RSb290IHN0YXJ0cyBvdXQgd2l0aCBhbiBhbHRlcm5hdGUgaXQgbWlnaHRcbiAgICAgIC8vIGhhdmUgb25lIG9uIHRoZSBhbHRlcm5hdGUgc28gd2UgbmVlZCB0byBjaGVjayBpbiBjYXNlIHRoaXMgd2FzIGFcbiAgICAgIC8vIHJvb3QuXG4gICAgICB2YXIgYWx0ZXJuYXRlID0gdGFyZ2V0SW5zdC5hbHRlcm5hdGU7XG5cbiAgICAgIGlmICh0YXJnZXRJbnN0LmNoaWxkICE9PSBudWxsIHx8IGFsdGVybmF0ZSAhPT0gbnVsbCAmJiBhbHRlcm5hdGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgLy8gTmV4dCB3ZSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgdGhlIG5vZGUgdGhhdCBza2lwcGVkIHBhc3QgaXNcbiAgICAgICAgLy8gbmVzdGVkIHdpdGhpbiBhIGRlaHlkcmF0ZWQgYm91bmRhcnkgYW5kIGlmIHNvLCB3aGljaCBvbmUuXG4gICAgICAgIHZhciBzdXNwZW5zZUluc3RhbmNlID0gZ2V0UGFyZW50U3VzcGVuc2VJbnN0YW5jZSh0YXJnZXROb2RlKTtcblxuICAgICAgICB3aGlsZSAoc3VzcGVuc2VJbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlIGZvdW5kIGEgc3VzcGVuc2UgaW5zdGFuY2UuIFRoYXQgbWVhbnMgdGhhdCB3ZSBoYXZlbid0XG4gICAgICAgICAgLy8gaHlkcmF0ZWQgaXQgeWV0LiBFdmVuIHRob3VnaCB3ZSBsZWF2ZSB0aGUgY29tbWVudHMgaW4gdGhlXG4gICAgICAgICAgLy8gRE9NIGFmdGVyIGh5ZHJhdGluZywgYW5kIHRoZXJlIGFyZSBib3VuZGFyaWVzIGluIHRoZSBET01cbiAgICAgICAgICAvLyB0aGF0IGNvdWxkIGFscmVhZHkgYmUgaHlkcmF0ZWQsIHdlIHdvdWxkbid0IGhhdmUgZm91bmQgdGhlbVxuICAgICAgICAgIC8vIHRocm91Z2ggdGhpcyBwYXNzIHNpbmNlIGlmIHRoZSB0YXJnZXQgaXMgaHlkcmF0ZWQgaXQgd291bGRcbiAgICAgICAgICAvLyBoYXZlIGhhZCBhbiBpbnRlcm5hbEluc3RhbmNlS2V5IG9uIGl0LlxuICAgICAgICAgIC8vIExldCdzIGdldCB0aGUgZmliZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBTdXNwZW5zZUNvbXBvbmVudFxuICAgICAgICAgIC8vIGFzIHRoZSBkZWVwZXN0IGluc3RhbmNlLlxuICAgICAgICAgIHZhciB0YXJnZXRTdXNwZW5zZUluc3QgPSBzdXNwZW5zZUluc3RhbmNlW2ludGVybmFsSW5zdGFuY2VLZXldO1xuXG4gICAgICAgICAgaWYgKHRhcmdldFN1c3BlbnNlSW5zdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldFN1c3BlbnNlSW5zdDtcbiAgICAgICAgICB9IC8vIElmIHdlIGRvbid0IGZpbmQgYSBGaWJlciBvbiB0aGUgY29tbWVudCwgaXQgbWlnaHQgYmUgYmVjYXVzZVxuICAgICAgICAgIC8vIHdlIGhhdmVuJ3QgZ290dGVuIHRvIGh5ZHJhdGUgaXQgeWV0LiBUaGVyZSBtaWdodCBzdGlsbCBiZSBhXG4gICAgICAgICAgLy8gcGFyZW50IGJvdW5kYXJ5IHRoYXQgaGFzbid0IGFib3ZlIHRoaXMgb25lIHNvIHdlIG5lZWQgdG8gZmluZFxuICAgICAgICAgIC8vIHRoZSBvdXRlciBtb3N0IHRoYXQgaXMga25vd24uXG5cblxuICAgICAgICAgIHN1c3BlbnNlSW5zdGFuY2UgPSBnZXRQYXJlbnRTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpOyAvLyBJZiB3ZSBkb24ndCBmaW5kIG9uZSwgdGhlbiB0aGF0IHNob3VsZCBtZWFuIHRoYXQgdGhlIHBhcmVudFxuICAgICAgICAgIC8vIGhvc3QgY29tcG9uZW50IGFsc28gaGFzbid0IGh5ZHJhdGVkIHlldC4gV2UgY2FuIHJldHVybiBpdFxuICAgICAgICAgIC8vIGJlbG93IHNpbmNlIGl0IHdpbGwgYmFpbCBvdXQgb24gdGhlIGlzTW91bnRlZCBjaGVjayBsYXRlci5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGFyZ2V0SW5zdDtcbiAgICB9XG5cbiAgICB0YXJnZXROb2RlID0gcGFyZW50Tm9kZTtcbiAgICBwYXJlbnROb2RlID0gdGFyZ2V0Tm9kZS5wYXJlbnROb2RlO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4vKipcbiAqIEdpdmVuIGEgRE9NIG5vZGUsIHJldHVybiB0aGUgUmVhY3RET01Db21wb25lbnQgb3IgUmVhY3RET01UZXh0Q29tcG9uZW50XG4gKiBpbnN0YW5jZSwgb3IgbnVsbCBpZiB0aGUgbm9kZSB3YXMgbm90IHJlbmRlcmVkIGJ5IHRoaXMgUmVhY3QuXG4gKi9cblxuZnVuY3Rpb24gZ2V0SW5zdGFuY2VGcm9tTm9kZShub2RlKSB7XG4gIHZhciBpbnN0ID0gbm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XSB8fCBub2RlW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldO1xuXG4gIGlmIChpbnN0KSB7XG4gICAgaWYgKGluc3QudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IGluc3QudGFnID09PSBIb3N0VGV4dCB8fCBpbnN0LnRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQgfHwgaW5zdC50YWcgPT09IEhvc3RSb290KSB7XG4gICAgICByZXR1cm4gaW5zdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4vKipcbiAqIEdpdmVuIGEgUmVhY3RET01Db21wb25lbnQgb3IgUmVhY3RET01UZXh0Q29tcG9uZW50LCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmdcbiAqIERPTSBub2RlLlxuICovXG5cbmZ1bmN0aW9uIGdldE5vZGVGcm9tSW5zdGFuY2UoaW5zdCkge1xuICBpZiAoaW5zdC50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgaW5zdC50YWcgPT09IEhvc3RUZXh0KSB7XG4gICAgLy8gSW4gRmliZXIgdGhpcywgaXMganVzdCB0aGUgc3RhdGUgbm9kZSByaWdodCBub3cuIFdlIGFzc3VtZSBpdCB3aWxsIGJlXG4gICAgLy8gYSBob3N0IGNvbXBvbmVudCBvciBob3N0IHRleHQuXG4gICAgcmV0dXJuIGluc3Quc3RhdGVOb2RlO1xuICB9IC8vIFdpdGhvdXQgdGhpcyBmaXJzdCBpbnZhcmlhbnQsIHBhc3NpbmcgYSBub24tRE9NLWNvbXBvbmVudCB0cmlnZ2VycyB0aGUgbmV4dFxuICAvLyBpbnZhcmlhbnQgZm9yIGEgbWlzc2luZyBwYXJlbnQsIHdoaWNoIGlzIHN1cGVyIGNvbmZ1c2luZy5cblxuXG4gIHRocm93IG5ldyBFcnJvcignZ2V0Tm9kZUZyb21JbnN0YW5jZTogSW52YWxpZCBhcmd1bWVudC4nKTtcbn1cbmZ1bmN0aW9uIGdldEZpYmVyQ3VycmVudFByb3BzRnJvbU5vZGUobm9kZSkge1xuICByZXR1cm4gbm9kZVtpbnRlcm5hbFByb3BzS2V5XSB8fCBudWxsO1xufVxuZnVuY3Rpb24gdXBkYXRlRmliZXJQcm9wcyhub2RlLCBwcm9wcykge1xuICBub2RlW2ludGVybmFsUHJvcHNLZXldID0gcHJvcHM7XG59XG5mdW5jdGlvbiBnZXRFdmVudExpc3RlbmVyU2V0KG5vZGUpIHtcbiAgdmFyIGVsZW1lbnRMaXN0ZW5lclNldCA9IG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXJzS2V5XTtcblxuICBpZiAoZWxlbWVudExpc3RlbmVyU2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICBlbGVtZW50TGlzdGVuZXJTZXQgPSBub2RlW2ludGVybmFsRXZlbnRIYW5kbGVyc0tleV0gPSBuZXcgU2V0KCk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudExpc3RlbmVyU2V0O1xufVxuXG52YXIgbG9nZ2VkVHlwZUZhaWx1cmVzID0ge307XG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcblxuZnVuY3Rpb24gc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCkge1xuICB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSwgZWxlbWVudC5fc291cmNlLCBvd25lciA/IG93bmVyLnR5cGUgOiBudWxsKTtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMS5zZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja1Byb3BUeXBlcyh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24sIGNvbXBvbmVudE5hbWUsIGVsZW1lbnQpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWUgVGhpcyBpcyBva2F5IGJ1dCBGbG93IGRvZXNuJ3Qga25vdyBpdC5cbiAgICB2YXIgaGFzID0gRnVuY3Rpb24uY2FsbC5iaW5kKGhhc093blByb3BlcnR5KTtcblxuICAgIGZvciAodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHtcbiAgICAgIGlmIChoYXModHlwZVNwZWNzLCB0eXBlU3BlY05hbWUpKSB7XG4gICAgICAgIHZhciBlcnJvciQxID0gdm9pZCAwOyAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuXG4gICAgICAgIC8vIEFmdGVyIHRoZXNlIGhhdmUgYmVlbiBjbGVhbmVkIHVwLCB3ZSdsbCBsZXQgdGhlbSB0aHJvdy5cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhbiBpbnZhcmlhbnQgdGhhdCBnZXRzIGNhdWdodC4gSXQncyB0aGUgc2FtZVxuICAgICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS5cbiAgICAgICAgICBpZiAodHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgICAgICAgdmFyIGVyciA9IEVycm9yKChjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycpICsgJzogJyArIGxvY2F0aW9uICsgJyB0eXBlIGAnICsgdHlwZVNwZWNOYW1lICsgJ2AgaXMgaW52YWxpZDsgJyArICdpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UsIGJ1dCByZWNlaXZlZCBgJyArIHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSArICdgLicgKyAnVGhpcyBvZnRlbiBoYXBwZW5zIGJlY2F1c2Ugb2YgdHlwb3Mgc3VjaCBhcyBgUHJvcFR5cGVzLmZ1bmN0aW9uYCBpbnN0ZWFkIG9mIGBQcm9wVHlwZXMuZnVuY2AuJyk7XG4gICAgICAgICAgICBlcnIubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlcnJvciQxID0gdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0odmFsdWVzLCB0eXBlU3BlY05hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBudWxsLCAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnKTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICBlcnJvciQxID0gZXg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IkMSAmJiAhKGVycm9yJDEgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgIGVycm9yKCclczogdHlwZSBzcGVjaWZpY2F0aW9uIG9mICVzJyArICcgYCVzYCBpcyBpbnZhbGlkOyB0aGUgdHlwZSBjaGVja2VyICcgKyAnZnVuY3Rpb24gbXVzdCByZXR1cm4gYG51bGxgIG9yIGFuIGBFcnJvcmAgYnV0IHJldHVybmVkIGEgJXMuICcgKyAnWW91IG1heSBoYXZlIGZvcmdvdHRlbiB0byBwYXNzIGFuIGFyZ3VtZW50IHRvIHRoZSB0eXBlIGNoZWNrZXIgJyArICdjcmVhdG9yIChhcnJheU9mLCBpbnN0YW5jZU9mLCBvYmplY3RPZiwgb25lT2YsIG9uZU9mVHlwZSwgYW5kICcgKyAnc2hhcGUgYWxsIHJlcXVpcmUgYW4gYXJndW1lbnQpLicsIGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJywgbG9jYXRpb24sIHR5cGVTcGVjTmFtZSwgdHlwZW9mIGVycm9yJDEpO1xuXG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IkMSBpbnN0YW5jZW9mIEVycm9yICYmICEoZXJyb3IkMS5tZXNzYWdlIGluIGxvZ2dlZFR5cGVGYWlsdXJlcykpIHtcbiAgICAgICAgICAvLyBPbmx5IG1vbml0b3IgdGhpcyBmYWlsdXJlIG9uY2UgYmVjYXVzZSB0aGVyZSB0ZW5kcyB0byBiZSBhIGxvdCBvZiB0aGVcbiAgICAgICAgICAvLyBzYW1lIGVycm9yLlxuICAgICAgICAgIGxvZ2dlZFR5cGVGYWlsdXJlc1tlcnJvciQxLm1lc3NhZ2VdID0gdHJ1ZTtcbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgIGVycm9yKCdGYWlsZWQgJXMgdHlwZTogJXMnLCBsb2NhdGlvbiwgZXJyb3IkMS5tZXNzYWdlKTtcblxuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciB2YWx1ZVN0YWNrID0gW107XG52YXIgZmliZXJTdGFjaztcblxue1xuICBmaWJlclN0YWNrID0gW107XG59XG5cbnZhciBpbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjcmVhdGVDdXJzb3IoZGVmYXVsdFZhbHVlKSB7XG4gIHJldHVybiB7XG4gICAgY3VycmVudDogZGVmYXVsdFZhbHVlXG4gIH07XG59XG5cbmZ1bmN0aW9uIHBvcChjdXJzb3IsIGZpYmVyKSB7XG4gIGlmIChpbmRleCA8IDApIHtcbiAgICB7XG4gICAgICBlcnJvcignVW5leHBlY3RlZCBwb3AuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAge1xuICAgIGlmIChmaWJlciAhPT0gZmliZXJTdGFja1tpbmRleF0pIHtcbiAgICAgIGVycm9yKCdVbmV4cGVjdGVkIEZpYmVyIHBvcHBlZC4nKTtcbiAgICB9XG4gIH1cblxuICBjdXJzb3IuY3VycmVudCA9IHZhbHVlU3RhY2tbaW5kZXhdO1xuICB2YWx1ZVN0YWNrW2luZGV4XSA9IG51bGw7XG5cbiAge1xuICAgIGZpYmVyU3RhY2tbaW5kZXhdID0gbnVsbDtcbiAgfVxuXG4gIGluZGV4LS07XG59XG5cbmZ1bmN0aW9uIHB1c2goY3Vyc29yLCB2YWx1ZSwgZmliZXIpIHtcbiAgaW5kZXgrKztcbiAgdmFsdWVTdGFja1tpbmRleF0gPSBjdXJzb3IuY3VycmVudDtcblxuICB7XG4gICAgZmliZXJTdGFja1tpbmRleF0gPSBmaWJlcjtcbiAgfVxuXG4gIGN1cnNvci5jdXJyZW50ID0gdmFsdWU7XG59XG5cbnZhciB3YXJuZWRBYm91dE1pc3NpbmdHZXRDaGlsZENvbnRleHQ7XG5cbntcbiAgd2FybmVkQWJvdXRNaXNzaW5nR2V0Q2hpbGRDb250ZXh0ID0ge307XG59XG5cbnZhciBlbXB0eUNvbnRleHRPYmplY3QgPSB7fTtcblxue1xuICBPYmplY3QuZnJlZXplKGVtcHR5Q29udGV4dE9iamVjdCk7XG59IC8vIEEgY3Vyc29yIHRvIHRoZSBjdXJyZW50IG1lcmdlZCBjb250ZXh0IG9iamVjdCBvbiB0aGUgc3RhY2suXG5cblxudmFyIGNvbnRleHRTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihlbXB0eUNvbnRleHRPYmplY3QpOyAvLyBBIGN1cnNvciB0byBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjb250ZXh0IGhhcyBjaGFuZ2VkLlxuXG52YXIgZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihmYWxzZSk7IC8vIEtlZXAgdHJhY2sgb2YgdGhlIHByZXZpb3VzIGNvbnRleHQgb2JqZWN0IHRoYXQgd2FzIG9uIHRoZSBzdGFjay5cbi8vIFdlIHVzZSB0aGlzIHRvIGdldCBhY2Nlc3MgdG8gdGhlIHBhcmVudCBjb250ZXh0IGFmdGVyIHdlIGhhdmUgYWxyZWFkeVxuLy8gcHVzaGVkIHRoZSBuZXh0IGNvbnRleHQgcHJvdmlkZXIsIGFuZCBub3cgbmVlZCB0byBtZXJnZSB0aGVpciBjb250ZXh0cy5cblxudmFyIHByZXZpb3VzQ29udGV4dCA9IGVtcHR5Q29udGV4dE9iamVjdDtcblxuZnVuY3Rpb24gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIGRpZFB1c2hPd25Db250ZXh0SWZQcm92aWRlcikge1xuICB7XG4gICAgaWYgKGRpZFB1c2hPd25Db250ZXh0SWZQcm92aWRlciAmJiBpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICAvLyBJZiB0aGUgZmliZXIgaXMgYSBjb250ZXh0IHByb3ZpZGVyIGl0c2VsZiwgd2hlbiB3ZSByZWFkIGl0cyBjb250ZXh0XG4gICAgICAvLyB3ZSBtYXkgaGF2ZSBhbHJlYWR5IHB1c2hlZCBpdHMgb3duIGNoaWxkIGNvbnRleHQgb24gdGhlIHN0YWNrLiBBIGNvbnRleHRcbiAgICAgIC8vIHByb3ZpZGVyIHNob3VsZCBub3QgXCJzZWVcIiBpdHMgb3duIGNoaWxkIGNvbnRleHQuIFRoZXJlZm9yZSB3ZSByZWFkIHRoZVxuICAgICAgLy8gcHJldmlvdXMgKHBhcmVudCkgY29udGV4dCBpbnN0ZWFkIGZvciBhIGNvbnRleHQgcHJvdmlkZXIuXG4gICAgICByZXR1cm4gcHJldmlvdXNDb250ZXh0O1xuICAgIH1cblxuICAgIHJldHVybiBjb250ZXh0U3RhY2tDdXJzb3IuY3VycmVudDtcbiAgfVxufVxuXG5mdW5jdGlvbiBjYWNoZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCwgbWFza2VkQ29udGV4dCkge1xuICB7XG4gICAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQgPSB1bm1hc2tlZENvbnRleHQ7XG4gICAgaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNYXNrZWRDaGlsZENvbnRleHQgPSBtYXNrZWRDb250ZXh0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldE1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCkge1xuICB7XG4gICAgdmFyIHR5cGUgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgIHZhciBjb250ZXh0VHlwZXMgPSB0eXBlLmNvbnRleHRUeXBlcztcblxuICAgIGlmICghY29udGV4dFR5cGVzKSB7XG4gICAgICByZXR1cm4gZW1wdHlDb250ZXh0T2JqZWN0O1xuICAgIH0gLy8gQXZvaWQgcmVjcmVhdGluZyBtYXNrZWQgY29udGV4dCB1bmxlc3MgdW5tYXNrZWQgY29udGV4dCBoYXMgY2hhbmdlZC5cbiAgICAvLyBGYWlsaW5nIHRvIGRvIHRoaXMgd2lsbCByZXN1bHQgaW4gdW5uZWNlc3NhcnkgY2FsbHMgdG8gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcy5cbiAgICAvLyBUaGlzIG1heSB0cmlnZ2VyIGluZmluaXRlIGxvb3BzIGlmIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgY2FsbHMgc2V0U3RhdGUuXG5cblxuICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICAgIGlmIChpbnN0YW5jZSAmJiBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0ID09PSB1bm1hc2tlZENvbnRleHQpIHtcbiAgICAgIHJldHVybiBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dDtcbiAgICB9XG5cbiAgICB2YXIgY29udGV4dCA9IHt9O1xuXG4gICAgZm9yICh2YXIga2V5IGluIGNvbnRleHRUeXBlcykge1xuICAgICAgY29udGV4dFtrZXldID0gdW5tYXNrZWRDb250ZXh0W2tleV07XG4gICAgfVxuXG4gICAge1xuICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHdvcmtJblByb2dyZXNzKSB8fCAnVW5rbm93bic7XG4gICAgICBjaGVja1Byb3BUeXBlcyhjb250ZXh0VHlwZXMsIGNvbnRleHQsICdjb250ZXh0JywgbmFtZSk7XG4gICAgfSAvLyBDYWNoZSB1bm1hc2tlZCBjb250ZXh0IHNvIHdlIGNhbiBhdm9pZCByZWNyZWF0aW5nIG1hc2tlZCBjb250ZXh0IHVubGVzcyBuZWNlc3NhcnkuXG4gICAgLy8gQ29udGV4dCBpcyBjcmVhdGVkIGJlZm9yZSB0aGUgY2xhc3MgY29tcG9uZW50IGlzIGluc3RhbnRpYXRlZCBzbyBjaGVjayBmb3IgaW5zdGFuY2UuXG5cblxuICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgY2FjaGVDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQsIGNvbnRleHQpO1xuICAgIH1cblxuICAgIHJldHVybiBjb250ZXh0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc0NvbnRleHRDaGFuZ2VkKCkge1xuICB7XG4gICAgcmV0dXJuIGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IuY3VycmVudDtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0NvbnRleHRQcm92aWRlcih0eXBlKSB7XG4gIHtcbiAgICB2YXIgY2hpbGRDb250ZXh0VHlwZXMgPSB0eXBlLmNoaWxkQ29udGV4dFR5cGVzO1xuICAgIHJldHVybiBjaGlsZENvbnRleHRUeXBlcyAhPT0gbnVsbCAmJiBjaGlsZENvbnRleHRUeXBlcyAhPT0gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvcENvbnRleHQoZmliZXIpIHtcbiAge1xuICAgIHBvcChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBmaWJlcik7XG4gICAgcG9wKGNvbnRleHRTdGFja0N1cnNvciwgZmliZXIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvcFRvcExldmVsQ29udGV4dE9iamVjdChmaWJlcikge1xuICB7XG4gICAgcG9wKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yLCBmaWJlcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHVzaFRvcExldmVsQ29udGV4dE9iamVjdChmaWJlciwgY29udGV4dCwgZGlkQ2hhbmdlKSB7XG4gIHtcbiAgICBpZiAoY29udGV4dFN0YWNrQ3Vyc29yLmN1cnJlbnQgIT09IGVtcHR5Q29udGV4dE9iamVjdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIGNvbnRleHQgZm91bmQgb24gc3RhY2suICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG5cbiAgICBwdXNoKGNvbnRleHRTdGFja0N1cnNvciwgY29udGV4dCwgZmliZXIpO1xuICAgIHB1c2goZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZGlkQ2hhbmdlLCBmaWJlcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0NoaWxkQ29udGV4dChmaWJlciwgdHlwZSwgcGFyZW50Q29udGV4dCkge1xuICB7XG4gICAgdmFyIGluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuICAgIHZhciBjaGlsZENvbnRleHRUeXBlcyA9IHR5cGUuY2hpbGRDb250ZXh0VHlwZXM7IC8vIFRPRE8gKGJ2YXVnaG4pIFJlcGxhY2UgdGhpcyBiZWhhdmlvciB3aXRoIGFuIGludmFyaWFudCgpIGluIHRoZSBmdXR1cmUuXG4gICAgLy8gSXQgaGFzIG9ubHkgYmVlbiBhZGRlZCBpbiBGaWJlciB0byBtYXRjaCB0aGUgKHVuaW50ZW50aW9uYWwpIGJlaGF2aW9yIGluIFN0YWNrLlxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnVW5rbm93bic7XG5cbiAgICAgICAgaWYgKCF3YXJuZWRBYm91dE1pc3NpbmdHZXRDaGlsZENvbnRleHRbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgICB3YXJuZWRBYm91dE1pc3NpbmdHZXRDaGlsZENvbnRleHRbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJyVzLmNoaWxkQ29udGV4dFR5cGVzIGlzIHNwZWNpZmllZCBidXQgdGhlcmUgaXMgbm8gZ2V0Q2hpbGRDb250ZXh0KCkgbWV0aG9kICcgKyAnb24gdGhlIGluc3RhbmNlLiBZb3UgY2FuIGVpdGhlciBkZWZpbmUgZ2V0Q2hpbGRDb250ZXh0KCkgb24gJXMgb3IgcmVtb3ZlICcgKyAnY2hpbGRDb250ZXh0VHlwZXMgZnJvbSBpdC4nLCBjb21wb25lbnROYW1lLCBjb21wb25lbnROYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFyZW50Q29udGV4dDtcbiAgICB9XG5cbiAgICB2YXIgY2hpbGRDb250ZXh0ID0gaW5zdGFuY2UuZ2V0Q2hpbGRDb250ZXh0KCk7XG5cbiAgICBmb3IgKHZhciBjb250ZXh0S2V5IGluIGNoaWxkQ29udGV4dCkge1xuICAgICAgaWYgKCEoY29udGV4dEtleSBpbiBjaGlsZENvbnRleHRUeXBlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnVW5rbm93bicpICsgXCIuZ2V0Q2hpbGRDb250ZXh0KCk6IGtleSBcXFwiXCIgKyBjb250ZXh0S2V5ICsgXCJcXFwiIGlzIG5vdCBkZWZpbmVkIGluIGNoaWxkQ29udGV4dFR5cGVzLlwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB7XG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdVbmtub3duJztcbiAgICAgIGNoZWNrUHJvcFR5cGVzKGNoaWxkQ29udGV4dFR5cGVzLCBjaGlsZENvbnRleHQsICdjaGlsZCBjb250ZXh0JywgbmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFzc2lnbih7fSwgcGFyZW50Q29udGV4dCwgY2hpbGRDb250ZXh0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwdXNoQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzKSB7XG4gIHtcbiAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7IC8vIFdlIHB1c2ggdGhlIGNvbnRleHQgYXMgZWFybHkgYXMgcG9zc2libGUgdG8gZW5zdXJlIHN0YWNrIGludGVncml0eS5cbiAgICAvLyBJZiB0aGUgaW5zdGFuY2UgZG9lcyBub3QgZXhpc3QgeWV0LCB3ZSB3aWxsIHB1c2ggbnVsbCBhdCBmaXJzdCxcbiAgICAvLyBhbmQgcmVwbGFjZSBpdCBvbiB0aGUgc3RhY2sgbGF0ZXIgd2hlbiBpbnZhbGlkYXRpbmcgdGhlIGNvbnRleHQuXG5cbiAgICB2YXIgbWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQgPSBpbnN0YW5jZSAmJiBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dCB8fCBlbXB0eUNvbnRleHRPYmplY3Q7IC8vIFJlbWVtYmVyIHRoZSBwYXJlbnQgY29udGV4dCBzbyB3ZSBjYW4gbWVyZ2Ugd2l0aCBpdCBsYXRlci5cbiAgICAvLyBJbmhlcml0IHRoZSBwYXJlbnQncyBkaWQtcGVyZm9ybS13b3JrIHZhbHVlIHRvIGF2b2lkIGluYWR2ZXJ0ZW50bHkgYmxvY2tpbmcgdXBkYXRlcy5cblxuICAgIHByZXZpb3VzQ29udGV4dCA9IGNvbnRleHRTdGFja0N1cnNvci5jdXJyZW50O1xuICAgIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yLCBtZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgIHB1c2goZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvci5jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW52YWxpZGF0ZUNvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgdHlwZSwgZGlkQ2hhbmdlKSB7XG4gIHtcbiAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIGhhdmUgYW4gaW5zdGFuY2UgYnkgdGhpcyBwb2ludC4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIGlmIChkaWRDaGFuZ2UpIHtcbiAgICAgIC8vIE1lcmdlIHBhcmVudCBhbmQgb3duIGNvbnRleHQuXG4gICAgICAvLyBTa2lwIHRoaXMgaWYgd2UncmUgbm90IHVwZGF0aW5nIGR1ZSB0byBzQ1UuXG4gICAgICAvLyBUaGlzIGF2b2lkcyB1bm5lY2Vzc2FyaWx5IHJlY29tcHV0aW5nIG1lbW9pemVkIHZhbHVlcy5cbiAgICAgIHZhciBtZXJnZWRDb250ZXh0ID0gcHJvY2Vzc0NoaWxkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdHlwZSwgcHJldmlvdXNDb250ZXh0KTtcbiAgICAgIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0ID0gbWVyZ2VkQ29udGV4dDsgLy8gUmVwbGFjZSB0aGUgb2xkIChvciBlbXB0eSkgY29udGV4dCB3aXRoIHRoZSBuZXcgb25lLlxuICAgICAgLy8gSXQgaXMgaW1wb3J0YW50IHRvIHVud2luZCB0aGUgY29udGV4dCBpbiB0aGUgcmV2ZXJzZSBvcmRlci5cblxuICAgICAgcG9wKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHBvcChjb250ZXh0U3RhY2tDdXJzb3IsIHdvcmtJblByb2dyZXNzKTsgLy8gTm93IHB1c2ggdGhlIG5ldyBjb250ZXh0IGFuZCBtYXJrIHRoYXQgaXQgaGFzIGNoYW5nZWQuXG5cbiAgICAgIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yLCBtZXJnZWRDb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBwdXNoKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGRpZENoYW5nZSwgd29ya0luUHJvZ3Jlc3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwb3AoZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcHVzaChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBkaWRDaGFuZ2UsIHdvcmtJblByb2dyZXNzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEN1cnJlbnRVbm1hc2tlZENvbnRleHQoZmliZXIpIHtcbiAge1xuICAgIC8vIEN1cnJlbnRseSB0aGlzIGlzIG9ubHkgdXNlZCB3aXRoIHJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyOyBub3Qgc3VyZSBpZiBpdFxuICAgIC8vIG1ha2VzIHNlbnNlIGVsc2V3aGVyZVxuICAgIGlmICghaXNGaWJlck1vdW50ZWQoZmliZXIpIHx8IGZpYmVyLnRhZyAhPT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgc3VidHJlZSBwYXJlbnQgdG8gYmUgYSBtb3VudGVkIGNsYXNzIGNvbXBvbmVudC4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIHZhciBub2RlID0gZmliZXI7XG5cbiAgICBkbyB7XG4gICAgICBzd2l0Y2ggKG5vZGUudGFnKSB7XG4gICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAgcmV0dXJuIG5vZGUuc3RhdGVOb2RlLmNvbnRleHQ7XG5cbiAgICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgQ29tcG9uZW50ID0gbm9kZS50eXBlO1xuXG4gICAgICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgICAgICByZXR1cm4gbm9kZS5zdGF0ZU5vZGUuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH0gd2hpbGUgKG5vZGUgIT09IG51bGwpO1xuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdGb3VuZCB1bmV4cGVjdGVkIGRldGFjaGVkIHN1YnRyZWUgcGFyZW50LiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cbn1cblxudmFyIExlZ2FjeVJvb3QgPSAwO1xudmFyIENvbmN1cnJlbnRSb290ID0gMTtcblxudmFyIHN5bmNRdWV1ZSA9IG51bGw7XG52YXIgaW5jbHVkZXNMZWdhY3lTeW5jQ2FsbGJhY2tzID0gZmFsc2U7XG52YXIgaXNGbHVzaGluZ1N5bmNRdWV1ZSA9IGZhbHNlO1xuZnVuY3Rpb24gc2NoZWR1bGVTeW5jQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgLy8gUHVzaCB0aGlzIGNhbGxiYWNrIGludG8gYW4gaW50ZXJuYWwgcXVldWUuIFdlJ2xsIGZsdXNoIHRoZXNlIGVpdGhlciBpblxuICAvLyB0aGUgbmV4dCB0aWNrLCBvciBlYXJsaWVyIGlmIHNvbWV0aGluZyBjYWxscyBgZmx1c2hTeW5jQ2FsbGJhY2tRdWV1ZWAuXG4gIGlmIChzeW5jUXVldWUgPT09IG51bGwpIHtcbiAgICBzeW5jUXVldWUgPSBbY2FsbGJhY2tdO1xuICB9IGVsc2Uge1xuICAgIC8vIFB1c2ggb250byBleGlzdGluZyBxdWV1ZS4gRG9uJ3QgbmVlZCB0byBzY2hlZHVsZSBhIGNhbGxiYWNrIGJlY2F1c2VcbiAgICAvLyB3ZSBhbHJlYWR5IHNjaGVkdWxlZCBvbmUgd2hlbiB3ZSBjcmVhdGVkIHRoZSBxdWV1ZS5cbiAgICBzeW5jUXVldWUucHVzaChjYWxsYmFjayk7XG4gIH1cbn1cbmZ1bmN0aW9uIHNjaGVkdWxlTGVnYWN5U3luY0NhbGxiYWNrKGNhbGxiYWNrKSB7XG4gIGluY2x1ZGVzTGVnYWN5U3luY0NhbGxiYWNrcyA9IHRydWU7XG4gIHNjaGVkdWxlU3luY0NhbGxiYWNrKGNhbGxiYWNrKTtcbn1cbmZ1bmN0aW9uIGZsdXNoU3luY0NhbGxiYWNrc09ubHlJbkxlZ2FjeU1vZGUoKSB7XG4gIC8vIE9ubHkgZmx1c2hlcyB0aGUgcXVldWUgaWYgdGhlcmUncyBhIGxlZ2FjeSBzeW5jIGNhbGxiYWNrIHNjaGVkdWxlZC5cbiAgLy8gVE9ETzogVGhlcmUncyBvbmx5IGEgc2luZ2xlIHR5cGUgb2YgY2FsbGJhY2s6IHBlcmZvcm1TeW5jT25Xb3JrT25Sb290LiBTb1xuICAvLyBpdCBtaWdodCBtYWtlIG1vcmUgc2Vuc2UgZm9yIHRoZSBxdWV1ZSB0byBiZSBhIGxpc3Qgb2Ygcm9vdHMgaW5zdGVhZCBvZiBhXG4gIC8vIGxpc3Qgb2YgZ2VuZXJpYyBjYWxsYmFja3MuIFRoZW4gd2UgY2FuIGhhdmUgdHdvOiBvbmUgZm9yIGxlZ2FjeSByb290cywgb25lXG4gIC8vIGZvciBjb25jdXJyZW50IHJvb3RzLiBBbmQgdGhpcyBtZXRob2Qgd291bGQgb25seSBmbHVzaCB0aGUgbGVnYWN5IG9uZXMuXG4gIGlmIChpbmNsdWRlc0xlZ2FjeVN5bmNDYWxsYmFja3MpIHtcbiAgICBmbHVzaFN5bmNDYWxsYmFja3MoKTtcbiAgfVxufVxuZnVuY3Rpb24gZmx1c2hTeW5jQ2FsbGJhY2tzKCkge1xuICBpZiAoIWlzRmx1c2hpbmdTeW5jUXVldWUgJiYgc3luY1F1ZXVlICE9PSBudWxsKSB7XG4gICAgLy8gUHJldmVudCByZS1lbnRyYW5jZS5cbiAgICBpc0ZsdXNoaW5nU3luY1F1ZXVlID0gdHJ1ZTtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIHByZXZpb3VzVXBkYXRlUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcblxuICAgIHRyeSB7XG4gICAgICB2YXIgaXNTeW5jID0gdHJ1ZTtcbiAgICAgIHZhciBxdWV1ZSA9IHN5bmNRdWV1ZTsgLy8gVE9ETzogSXMgdGhpcyBuZWNlc3NhcnkgYW55bW9yZT8gVGhlIG9ubHkgdXNlciBjb2RlIHRoYXQgcnVucyBpbiB0aGlzXG4gICAgICAvLyBxdWV1ZSBpcyBpbiB0aGUgcmVuZGVyIG9yIGNvbW1pdCBwaGFzZXMuXG5cbiAgICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShEaXNjcmV0ZUV2ZW50UHJpb3JpdHkpO1xuXG4gICAgICBmb3IgKDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IHF1ZXVlW2ldO1xuXG4gICAgICAgIGRvIHtcbiAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrKGlzU3luYyk7XG4gICAgICAgIH0gd2hpbGUgKGNhbGxiYWNrICE9PSBudWxsKTtcbiAgICAgIH1cblxuICAgICAgc3luY1F1ZXVlID0gbnVsbDtcbiAgICAgIGluY2x1ZGVzTGVnYWN5U3luY0NhbGxiYWNrcyA9IGZhbHNlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBJZiBzb21ldGhpbmcgdGhyb3dzLCBsZWF2ZSB0aGUgcmVtYWluaW5nIGNhbGxiYWNrcyBvbiB0aGUgcXVldWUuXG4gICAgICBpZiAoc3luY1F1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgIHN5bmNRdWV1ZSA9IHN5bmNRdWV1ZS5zbGljZShpICsgMSk7XG4gICAgICB9IC8vIFJlc3VtZSBmbHVzaGluZyBpbiB0aGUgbmV4dCB0aWNrXG5cblxuICAgICAgc2NoZWR1bGVDYWxsYmFjayhJbW1lZGlhdGVQcmlvcml0eSwgZmx1c2hTeW5jQ2FsbGJhY2tzKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNVcGRhdGVQcmlvcml0eSk7XG4gICAgICBpc0ZsdXNoaW5nU3luY1F1ZXVlID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vIFRPRE86IFVzZSB0aGUgdW5pZmllZCBmaWJlciBzdGFjayBtb2R1bGUgaW5zdGVhZCBvZiB0aGlzIGxvY2FsIG9uZT9cbi8vIEludGVudGlvbmFsbHkgbm90IHVzaW5nIGl0IHlldCB0byBkZXJpc2sgdGhlIGluaXRpYWwgaW1wbGVtZW50YXRpb24sIGJlY2F1c2Vcbi8vIHRoZSB3YXkgd2UgcHVzaC9wb3AgdGhlc2UgdmFsdWVzIGlzIGEgYml0IHVudXN1YWwuIElmIHRoZXJlJ3MgYSBtaXN0YWtlLCBJJ2Rcbi8vIHJhdGhlciB0aGUgaWRzIGJlIHdyb25nIHRoYW4gY3Jhc2ggdGhlIHdob2xlIHJlY29uY2lsZXIuXG52YXIgZm9ya1N0YWNrID0gW107XG52YXIgZm9ya1N0YWNrSW5kZXggPSAwO1xudmFyIHRyZWVGb3JrUHJvdmlkZXIgPSBudWxsO1xudmFyIHRyZWVGb3JrQ291bnQgPSAwO1xudmFyIGlkU3RhY2sgPSBbXTtcbnZhciBpZFN0YWNrSW5kZXggPSAwO1xudmFyIHRyZWVDb250ZXh0UHJvdmlkZXIgPSBudWxsO1xudmFyIHRyZWVDb250ZXh0SWQgPSAxO1xudmFyIHRyZWVDb250ZXh0T3ZlcmZsb3cgPSAnJztcbmZ1bmN0aW9uIGlzRm9ya2VkQ2hpbGQod29ya0luUHJvZ3Jlc3MpIHtcbiAgd2FybklmTm90SHlkcmF0aW5nKCk7XG4gIHJldHVybiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBGb3JrZWQpICE9PSBOb0ZsYWdzO1xufVxuZnVuY3Rpb24gZ2V0Rm9ya3NBdExldmVsKHdvcmtJblByb2dyZXNzKSB7XG4gIHdhcm5JZk5vdEh5ZHJhdGluZygpO1xuICByZXR1cm4gdHJlZUZvcmtDb3VudDtcbn1cbmZ1bmN0aW9uIGdldFRyZWVJZCgpIHtcbiAgdmFyIG92ZXJmbG93ID0gdHJlZUNvbnRleHRPdmVyZmxvdztcbiAgdmFyIGlkV2l0aExlYWRpbmdCaXQgPSB0cmVlQ29udGV4dElkO1xuICB2YXIgaWQgPSBpZFdpdGhMZWFkaW5nQml0ICYgfmdldExlYWRpbmdCaXQoaWRXaXRoTGVhZGluZ0JpdCk7XG4gIHJldHVybiBpZC50b1N0cmluZygzMikgKyBvdmVyZmxvdztcbn1cbmZ1bmN0aW9uIHB1c2hUcmVlRm9yayh3b3JrSW5Qcm9ncmVzcywgdG90YWxDaGlsZHJlbikge1xuICAvLyBUaGlzIGlzIGNhbGxlZCByaWdodCBhZnRlciB3ZSByZWNvbmNpbGUgYW4gYXJyYXkgKG9yIGl0ZXJhdG9yKSBvZiBjaGlsZFxuICAvLyBmaWJlcnMsIGJlY2F1c2UgdGhhdCdzIHRoZSBvbmx5IHBsYWNlIHdoZXJlIHdlIGtub3cgaG93IG1hbnkgY2hpbGRyZW4gaW5cbiAgLy8gdGhlIHdob2xlIHNldCB3aXRob3V0IGRvaW5nIGV4dHJhIHdvcmsgbGF0ZXIsIG9yIHN0b3JpbmcgYWRkdGlvbmFsXG4gIC8vIGluZm9ybWF0aW9uIG9uIHRoZSBmaWJlci5cbiAgLy9cbiAgLy8gVGhhdCdzIHdoeSB0aGlzIGZ1bmN0aW9uIGlzIHNlcGFyYXRlIGZyb20gcHVzaFRyZWVJZCBcdTIwMTQgaXQncyBjYWxsZWQgZHVyaW5nXG4gIC8vIHRoZSByZW5kZXIgcGhhc2Ugb2YgdGhlIGZvcmsgcGFyZW50LCBub3QgdGhlIGNoaWxkLCB3aGljaCBpcyB3aGVyZSB3ZSBwdXNoXG4gIC8vIHRoZSBvdGhlciBjb250ZXh0IHZhbHVlcy5cbiAgLy9cbiAgLy8gSW4gdGhlIEZpenogaW1wbGVtZW50YXRpb24gdGhpcyBpcyBtdWNoIHNpbXBsZXIgYmVjYXVzZSB0aGUgY2hpbGQgaXNcbiAgLy8gcmVuZGVyZWQgaW4gdGhlIHNhbWUgY2FsbHN0YWNrIGFzIHRoZSBwYXJlbnQuXG4gIC8vXG4gIC8vIEl0IG1pZ2h0IGJlIGJldHRlciB0byBqdXN0IGFkZCBhIGBmb3Jrc2AgZmllbGQgdG8gdGhlIEZpYmVyIHR5cGUuIEl0IHdvdWxkXG4gIC8vIG1ha2UgdGhpcyBtb2R1bGUgc2ltcGxlci5cbiAgd2FybklmTm90SHlkcmF0aW5nKCk7XG4gIGZvcmtTdGFja1tmb3JrU3RhY2tJbmRleCsrXSA9IHRyZWVGb3JrQ291bnQ7XG4gIGZvcmtTdGFja1tmb3JrU3RhY2tJbmRleCsrXSA9IHRyZWVGb3JrUHJvdmlkZXI7XG4gIHRyZWVGb3JrUHJvdmlkZXIgPSB3b3JrSW5Qcm9ncmVzcztcbiAgdHJlZUZvcmtDb3VudCA9IHRvdGFsQ2hpbGRyZW47XG59XG5mdW5jdGlvbiBwdXNoVHJlZUlkKHdvcmtJblByb2dyZXNzLCB0b3RhbENoaWxkcmVuLCBpbmRleCkge1xuICB3YXJuSWZOb3RIeWRyYXRpbmcoKTtcbiAgaWRTdGFja1tpZFN0YWNrSW5kZXgrK10gPSB0cmVlQ29udGV4dElkO1xuICBpZFN0YWNrW2lkU3RhY2tJbmRleCsrXSA9IHRyZWVDb250ZXh0T3ZlcmZsb3c7XG4gIGlkU3RhY2tbaWRTdGFja0luZGV4KytdID0gdHJlZUNvbnRleHRQcm92aWRlcjtcbiAgdHJlZUNvbnRleHRQcm92aWRlciA9IHdvcmtJblByb2dyZXNzO1xuICB2YXIgYmFzZUlkV2l0aExlYWRpbmdCaXQgPSB0cmVlQ29udGV4dElkO1xuICB2YXIgYmFzZU92ZXJmbG93ID0gdHJlZUNvbnRleHRPdmVyZmxvdzsgLy8gVGhlIGxlZnRtb3N0IDEgbWFya3MgdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UsIG5vbi1pbmNsdXNpdmUuIEl0J3Mgbm90IHBhcnRcbiAgLy8gb2YgdGhlIGlkOyB3ZSB1c2UgaXQgdG8gYWNjb3VudCBmb3IgbGVhZGluZyAwcy5cblxuICB2YXIgYmFzZUxlbmd0aCA9IGdldEJpdExlbmd0aChiYXNlSWRXaXRoTGVhZGluZ0JpdCkgLSAxO1xuICB2YXIgYmFzZUlkID0gYmFzZUlkV2l0aExlYWRpbmdCaXQgJiB+KDEgPDwgYmFzZUxlbmd0aCk7XG4gIHZhciBzbG90ID0gaW5kZXggKyAxO1xuICB2YXIgbGVuZ3RoID0gZ2V0Qml0TGVuZ3RoKHRvdGFsQ2hpbGRyZW4pICsgYmFzZUxlbmd0aDsgLy8gMzAgaXMgdGhlIG1heCBsZW5ndGggd2UgY2FuIHN0b3JlIHdpdGhvdXQgb3ZlcmZsb3dpbmcsIHRha2luZyBpbnRvXG4gIC8vIGNvbnNpZGVyYXRpb24gdGhlIGxlYWRpbmcgMSB3ZSB1c2UgdG8gbWFyayB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZS5cblxuICBpZiAobGVuZ3RoID4gMzApIHtcbiAgICAvLyBXZSBvdmVyZmxvd2VkIHRoZSBiaXR3aXNlLXNhZmUgcmFuZ2UuIEZhbGwgYmFjayB0byBzbG93ZXIgYWxnb3JpdGhtLlxuICAgIC8vIFRoaXMgYnJhbmNoIGFzc3VtZXMgdGhlIGxlbmd0aCBvZiB0aGUgYmFzZSBpZCBpcyBncmVhdGVyIHRoYW4gNTsgaXQgd29uJ3RcbiAgICAvLyB3b3JrIGZvciBzbWFsbGVyIGlkcywgYmVjYXVzZSB5b3UgbmVlZCA1IGJpdHMgcGVyIGNoYXJhY3Rlci5cbiAgICAvL1xuICAgIC8vIFdlIGVuY29kZSB0aGUgaWQgaW4gbXVsdGlwbGUgc3RlcHM6IGZpcnN0IHRoZSBiYXNlIGlkLCB0aGVuIHRoZVxuICAgIC8vIHJlbWFpbmluZyBkaWdpdHMuXG4gICAgLy9cbiAgICAvLyBFYWNoIDUgYml0IHNlcXVlbmNlIGNvcnJlc3BvbmRzIHRvIGEgc2luZ2xlIGJhc2UgMzIgY2hhcmFjdGVyLiBTbyBmb3JcbiAgICAvLyBleGFtcGxlLCBpZiB0aGUgY3VycmVudCBpZCBpcyAyMyBiaXRzIGxvbmcsIHdlIGNhbiBjb252ZXJ0IDIwIG9mIHRob3NlXG4gICAgLy8gYml0cyBpbnRvIGEgc3RyaW5nIG9mIDQgY2hhcmFjdGVycywgd2l0aCAzIGJpdHMgbGVmdCBvdmVyLlxuICAgIC8vXG4gICAgLy8gRmlyc3QgY2FsY3VsYXRlIGhvdyBtYW55IGJpdHMgaW4gdGhlIGJhc2UgaWQgcmVwcmVzZW50IGEgY29tcGxldGVcbiAgICAvLyBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzLlxuICAgIHZhciBudW1iZXJPZk92ZXJmbG93Qml0cyA9IGJhc2VMZW5ndGggLSBiYXNlTGVuZ3RoICUgNTsgLy8gVGhlbiBjcmVhdGUgYSBiaXRtYXNrIHRoYXQgc2VsZWN0cyBvbmx5IHRob3NlIGJpdHMuXG5cbiAgICB2YXIgbmV3T3ZlcmZsb3dCaXRzID0gKDEgPDwgbnVtYmVyT2ZPdmVyZmxvd0JpdHMpIC0gMTsgLy8gU2VsZWN0IHRoZSBiaXRzLCBhbmQgY29udmVydCB0aGVtIHRvIGEgYmFzZSAzMiBzdHJpbmcuXG5cbiAgICB2YXIgbmV3T3ZlcmZsb3cgPSAoYmFzZUlkICYgbmV3T3ZlcmZsb3dCaXRzKS50b1N0cmluZygzMik7IC8vIE5vdyB3ZSBjYW4gcmVtb3ZlIHRob3NlIGJpdHMgZnJvbSB0aGUgYmFzZSBpZC5cblxuICAgIHZhciByZXN0T2ZCYXNlSWQgPSBiYXNlSWQgPj4gbnVtYmVyT2ZPdmVyZmxvd0JpdHM7XG4gICAgdmFyIHJlc3RPZkJhc2VMZW5ndGggPSBiYXNlTGVuZ3RoIC0gbnVtYmVyT2ZPdmVyZmxvd0JpdHM7IC8vIEZpbmFsbHksIGVuY29kZSB0aGUgcmVzdCBvZiB0aGUgYml0cyB1c2luZyB0aGUgbm9ybWFsIGFsZ29yaXRobS4gQmVjYXVzZVxuICAgIC8vIHdlIG1hZGUgbW9yZSByb29tLCB0aGlzIHRpbWUgaXQgd29uJ3Qgb3ZlcmZsb3cuXG5cbiAgICB2YXIgcmVzdE9mTGVuZ3RoID0gZ2V0Qml0TGVuZ3RoKHRvdGFsQ2hpbGRyZW4pICsgcmVzdE9mQmFzZUxlbmd0aDtcbiAgICB2YXIgcmVzdE9mTmV3Qml0cyA9IHNsb3QgPDwgcmVzdE9mQmFzZUxlbmd0aDtcbiAgICB2YXIgaWQgPSByZXN0T2ZOZXdCaXRzIHwgcmVzdE9mQmFzZUlkO1xuICAgIHZhciBvdmVyZmxvdyA9IG5ld092ZXJmbG93ICsgYmFzZU92ZXJmbG93O1xuICAgIHRyZWVDb250ZXh0SWQgPSAxIDw8IHJlc3RPZkxlbmd0aCB8IGlkO1xuICAgIHRyZWVDb250ZXh0T3ZlcmZsb3cgPSBvdmVyZmxvdztcbiAgfSBlbHNlIHtcbiAgICAvLyBOb3JtYWwgcGF0aFxuICAgIHZhciBuZXdCaXRzID0gc2xvdCA8PCBiYXNlTGVuZ3RoO1xuXG4gICAgdmFyIF9pZCA9IG5ld0JpdHMgfCBiYXNlSWQ7XG5cbiAgICB2YXIgX292ZXJmbG93ID0gYmFzZU92ZXJmbG93O1xuICAgIHRyZWVDb250ZXh0SWQgPSAxIDw8IGxlbmd0aCB8IF9pZDtcbiAgICB0cmVlQ29udGV4dE92ZXJmbG93ID0gX292ZXJmbG93O1xuICB9XG59XG5mdW5jdGlvbiBwdXNoTWF0ZXJpYWxpemVkVHJlZUlkKHdvcmtJblByb2dyZXNzKSB7XG4gIHdhcm5JZk5vdEh5ZHJhdGluZygpOyAvLyBUaGlzIGNvbXBvbmVudCBtYXRlcmlhbGl6ZWQgYW4gaWQuIFRoaXMgd2lsbCBhZmZlY3QgYW55IGlkcyB0aGF0IGFwcGVhclxuICAvLyBpbiBpdHMgY2hpbGRyZW4uXG5cbiAgdmFyIHJldHVybkZpYmVyID0gd29ya0luUHJvZ3Jlc3MucmV0dXJuO1xuXG4gIGlmIChyZXR1cm5GaWJlciAhPT0gbnVsbCkge1xuICAgIHZhciBudW1iZXJPZkZvcmtzID0gMTtcbiAgICB2YXIgc2xvdEluZGV4ID0gMDtcbiAgICBwdXNoVHJlZUZvcmsod29ya0luUHJvZ3Jlc3MsIG51bWJlck9mRm9ya3MpO1xuICAgIHB1c2hUcmVlSWQod29ya0luUHJvZ3Jlc3MsIG51bWJlck9mRm9ya3MsIHNsb3RJbmRleCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0Qml0TGVuZ3RoKG51bWJlcikge1xuICByZXR1cm4gMzIgLSBjbHozMihudW1iZXIpO1xufVxuXG5mdW5jdGlvbiBnZXRMZWFkaW5nQml0KGlkKSB7XG4gIHJldHVybiAxIDw8IGdldEJpdExlbmd0aChpZCkgLSAxO1xufVxuXG5mdW5jdGlvbiBwb3BUcmVlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcykge1xuICAvLyBSZXN0b3JlIHRoZSBwcmV2aW91cyB2YWx1ZXMuXG4gIC8vIFRoaXMgaXMgYSBiaXQgbW9yZSBjb21wbGljYXRlZCB0aGFuIG90aGVyIGNvbnRleHQtbGlrZSBtb2R1bGVzIGluIEZpYmVyXG4gIC8vIGJlY2F1c2UgdGhlIHNhbWUgRmliZXIgbWF5IGFwcGVhciBvbiB0aGUgc3RhY2sgbXVsdGlwbGUgdGltZXMgYW5kIGZvclxuICAvLyBkaWZmZXJlbnQgcmVhc29ucy4gV2UgaGF2ZSB0byBrZWVwIHBvcHBpbmcgdW50aWwgdGhlIHdvcmstaW4tcHJvZ3Jlc3MgaXNcbiAgLy8gbm8gbG9uZ2VyIGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrLlxuICB3aGlsZSAod29ya0luUHJvZ3Jlc3MgPT09IHRyZWVGb3JrUHJvdmlkZXIpIHtcbiAgICB0cmVlRm9ya1Byb3ZpZGVyID0gZm9ya1N0YWNrWy0tZm9ya1N0YWNrSW5kZXhdO1xuICAgIGZvcmtTdGFja1tmb3JrU3RhY2tJbmRleF0gPSBudWxsO1xuICAgIHRyZWVGb3JrQ291bnQgPSBmb3JrU3RhY2tbLS1mb3JrU3RhY2tJbmRleF07XG4gICAgZm9ya1N0YWNrW2ZvcmtTdGFja0luZGV4XSA9IG51bGw7XG4gIH1cblxuICB3aGlsZSAod29ya0luUHJvZ3Jlc3MgPT09IHRyZWVDb250ZXh0UHJvdmlkZXIpIHtcbiAgICB0cmVlQ29udGV4dFByb3ZpZGVyID0gaWRTdGFja1stLWlkU3RhY2tJbmRleF07XG4gICAgaWRTdGFja1tpZFN0YWNrSW5kZXhdID0gbnVsbDtcbiAgICB0cmVlQ29udGV4dE92ZXJmbG93ID0gaWRTdGFja1stLWlkU3RhY2tJbmRleF07XG4gICAgaWRTdGFja1tpZFN0YWNrSW5kZXhdID0gbnVsbDtcbiAgICB0cmVlQ29udGV4dElkID0gaWRTdGFja1stLWlkU3RhY2tJbmRleF07XG4gICAgaWRTdGFja1tpZFN0YWNrSW5kZXhdID0gbnVsbDtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0U3VzcGVuZGVkVHJlZUNvbnRleHQoKSB7XG4gIHdhcm5JZk5vdEh5ZHJhdGluZygpO1xuXG4gIGlmICh0cmVlQ29udGV4dFByb3ZpZGVyICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0cmVlQ29udGV4dElkLFxuICAgICAgb3ZlcmZsb3c6IHRyZWVDb250ZXh0T3ZlcmZsb3dcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5mdW5jdGlvbiByZXN0b3JlU3VzcGVuZGVkVHJlZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbmRlZENvbnRleHQpIHtcbiAgd2FybklmTm90SHlkcmF0aW5nKCk7XG4gIGlkU3RhY2tbaWRTdGFja0luZGV4KytdID0gdHJlZUNvbnRleHRJZDtcbiAgaWRTdGFja1tpZFN0YWNrSW5kZXgrK10gPSB0cmVlQ29udGV4dE92ZXJmbG93O1xuICBpZFN0YWNrW2lkU3RhY2tJbmRleCsrXSA9IHRyZWVDb250ZXh0UHJvdmlkZXI7XG4gIHRyZWVDb250ZXh0SWQgPSBzdXNwZW5kZWRDb250ZXh0LmlkO1xuICB0cmVlQ29udGV4dE92ZXJmbG93ID0gc3VzcGVuZGVkQ29udGV4dC5vdmVyZmxvdztcbiAgdHJlZUNvbnRleHRQcm92aWRlciA9IHdvcmtJblByb2dyZXNzO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZOb3RIeWRyYXRpbmcoKSB7XG4gIHtcbiAgICBpZiAoIWdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCB0byBiZSBoeWRyYXRpbmcuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlICcgKyAnYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG59XG5cbi8vIFRoaXMgbWF5IGhhdmUgYmVlbiBhbiBpbnNlcnRpb24gb3IgYSBoeWRyYXRpb24uXG5cbnZhciBoeWRyYXRpb25QYXJlbnRGaWJlciA9IG51bGw7XG52YXIgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IG51bGw7XG52YXIgaXNIeWRyYXRpbmcgPSBmYWxzZTsgLy8gVGhpcyBmbGFnIGFsbG93cyBmb3Igd2FybmluZyBzdXByZXNzaW9uIHdoZW4gd2UgZXhwZWN0IHRoZXJlIHRvIGJlIG1pc21hdGNoZXNcbi8vIGR1ZSB0byBlYXJsaWVyIG1pc21hdGNoZXMgb3IgYSBzdXNwZW5kZWQgZmliZXIuXG5cbnZhciBkaWRTdXNwZW5kT3JFcnJvckRFViA9IGZhbHNlOyAvLyBIeWRyYXRpb24gZXJyb3JzIHRoYXQgd2VyZSB0aHJvd24gaW5zaWRlIHRoaXMgYm91bmRhcnlcblxudmFyIGh5ZHJhdGlvbkVycm9ycyA9IG51bGw7XG5cbmZ1bmN0aW9uIHdhcm5JZkh5ZHJhdGluZygpIHtcbiAge1xuICAgIGlmIChpc0h5ZHJhdGluZykge1xuICAgICAgZXJyb3IoJ1dlIHNob3VsZCBub3QgYmUgaHlkcmF0aW5nIGhlcmUuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGEgYnVnLicpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtYXJrRGlkVGhyb3dXaGlsZUh5ZHJhdGluZ0RFVigpIHtcbiAge1xuICAgIGRpZFN1c3BlbmRPckVycm9yREVWID0gdHJ1ZTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkU3VzcGVuZE9yRXJyb3JXaGlsZUh5ZHJhdGluZ0RFVigpIHtcbiAge1xuICAgIHJldHVybiBkaWRTdXNwZW5kT3JFcnJvckRFVjtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbnRlckh5ZHJhdGlvblN0YXRlKGZpYmVyKSB7XG5cbiAgdmFyIHBhcmVudEluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZFdpdGhpbkNvbnRhaW5lcihwYXJlbnRJbnN0YW5jZSk7XG4gIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7XG4gIGlzSHlkcmF0aW5nID0gdHJ1ZTtcbiAgaHlkcmF0aW9uRXJyb3JzID0gbnVsbDtcbiAgZGlkU3VzcGVuZE9yRXJyb3JERVYgPSBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlZW50ZXJIeWRyYXRpb25TdGF0ZUZyb21EZWh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZShmaWJlciwgc3VzcGVuc2VJbnN0YW5jZSwgdHJlZUNvbnRleHQpIHtcblxuICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGRXaXRoaW5TdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpO1xuICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyO1xuICBpc0h5ZHJhdGluZyA9IHRydWU7XG4gIGh5ZHJhdGlvbkVycm9ycyA9IG51bGw7XG4gIGRpZFN1c3BlbmRPckVycm9yREVWID0gZmFsc2U7XG5cbiAgaWYgKHRyZWVDb250ZXh0ICE9PSBudWxsKSB7XG4gICAgcmVzdG9yZVN1c3BlbmRlZFRyZWVDb250ZXh0KGZpYmVyLCB0cmVlQ29udGV4dCk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gd2FyblVuaHlkcmF0ZWRJbnN0YW5jZShyZXR1cm5GaWJlciwgaW5zdGFuY2UpIHtcbiAge1xuICAgIHN3aXRjaCAocmV0dXJuRmliZXIudGFnKSB7XG4gICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICB7XG4gICAgICAgICAgZGlkTm90SHlkcmF0ZUluc3RhbmNlV2l0aGluQ29udGFpbmVyKHJldHVybkZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLCBpbnN0YW5jZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGlzQ29uY3VycmVudE1vZGUgPSAocmV0dXJuRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuICAgICAgICAgIGRpZE5vdEh5ZHJhdGVJbnN0YW5jZShyZXR1cm5GaWJlci50eXBlLCByZXR1cm5GaWJlci5tZW1vaXplZFByb3BzLCByZXR1cm5GaWJlci5zdGF0ZU5vZGUsIGluc3RhbmNlLCAvLyBUT0RPOiBEZWxldGUgdGhpcyBhcmd1bWVudCB3aGVuIHdlIHJlbW92ZSB0aGUgbGVnYWN5IHJvb3QgQVBJLlxuICAgICAgICAgIGlzQ29uY3VycmVudE1vZGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IHJldHVybkZpYmVyLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgaWYgKHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkgZGlkTm90SHlkcmF0ZUluc3RhbmNlV2l0aGluU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQsIGluc3RhbmNlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkZWxldGVIeWRyYXRhYmxlSW5zdGFuY2UocmV0dXJuRmliZXIsIGluc3RhbmNlKSB7XG4gIHdhcm5Vbmh5ZHJhdGVkSW5zdGFuY2UocmV0dXJuRmliZXIsIGluc3RhbmNlKTtcbiAgdmFyIGNoaWxkVG9EZWxldGUgPSBjcmVhdGVGaWJlckZyb21Ib3N0SW5zdGFuY2VGb3JEZWxldGlvbigpO1xuICBjaGlsZFRvRGVsZXRlLnN0YXRlTm9kZSA9IGluc3RhbmNlO1xuICBjaGlsZFRvRGVsZXRlLnJldHVybiA9IHJldHVybkZpYmVyO1xuICB2YXIgZGVsZXRpb25zID0gcmV0dXJuRmliZXIuZGVsZXRpb25zO1xuXG4gIGlmIChkZWxldGlvbnMgPT09IG51bGwpIHtcbiAgICByZXR1cm5GaWJlci5kZWxldGlvbnMgPSBbY2hpbGRUb0RlbGV0ZV07XG4gICAgcmV0dXJuRmliZXIuZmxhZ3MgfD0gQ2hpbGREZWxldGlvbjtcbiAgfSBlbHNlIHtcbiAgICBkZWxldGlvbnMucHVzaChjaGlsZFRvRGVsZXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuTm9uaHlkcmF0ZWRJbnN0YW5jZShyZXR1cm5GaWJlciwgZmliZXIpIHtcbiAge1xuICAgIGlmIChkaWRTdXNwZW5kT3JFcnJvckRFVikge1xuICAgICAgLy8gSW5zaWRlIGEgYm91bmRhcnkgdGhhdCBhbHJlYWR5IHN1c3BlbmRlZC4gV2UncmUgY3VycmVudGx5IHJlbmRlcmluZyB0aGVcbiAgICAgIC8vIHNpYmxpbmdzIG9mIGEgc3VzcGVuZGVkIG5vZGUuIFRoZSBtaXNtYXRjaCBtYXkgYmUgZHVlIHRvIHRoZSBtaXNzaW5nXG4gICAgICAvLyBkYXRhLCBzbyBpdCdzIHByb2JhYmx5IGEgZmFsc2UgcG9zaXRpdmUuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoIChyZXR1cm5GaWJlci50YWcpIHtcbiAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgcGFyZW50Q29udGFpbmVyID0gcmV0dXJuRmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG5cbiAgICAgICAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgICAgICB2YXIgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgICAgICAgICAgIHZhciBwcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVJbnN0YW5jZVdpdGhpbkNvbnRhaW5lcihwYXJlbnRDb250YWluZXIsIHR5cGUpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgICAgICAgICAgdmFyIHRleHQgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlVGV4dEluc3RhbmNlV2l0aGluQ29udGFpbmVyKHBhcmVudENvbnRhaW5lciwgdGV4dCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBwYXJlbnRUeXBlID0gcmV0dXJuRmliZXIudHlwZTtcbiAgICAgICAgICB2YXIgcGFyZW50UHJvcHMgPSByZXR1cm5GaWJlci5tZW1vaXplZFByb3BzO1xuICAgICAgICAgIHZhciBwYXJlbnRJbnN0YW5jZSA9IHJldHVybkZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgX3R5cGUgPSBmaWJlci50eXBlO1xuICAgICAgICAgICAgICAgIHZhciBfcHJvcHMgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICAgICAgdmFyIGlzQ29uY3VycmVudE1vZGUgPSAocmV0dXJuRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuICAgICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlSW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCBfdHlwZSwgX3Byb3BzLCAvLyBUT0RPOiBEZWxldGUgdGhpcyBhcmd1bWVudCB3aGVuIHdlIHJlbW92ZSB0aGUgbGVnYWN5IHJvb3QgQVBJLlxuICAgICAgICAgICAgICAgIGlzQ29uY3VycmVudE1vZGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgX3RleHQgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG5cbiAgICAgICAgICAgICAgICB2YXIgX2lzQ29uY3VycmVudE1vZGUgPSAocmV0dXJuRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuXG4gICAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVUZXh0SW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCBfdGV4dCwgLy8gVE9ETzogRGVsZXRlIHRoaXMgYXJndW1lbnQgd2hlbiB3ZSByZW1vdmUgdGhlIGxlZ2FjeSByb290IEFQSS5cbiAgICAgICAgICAgICAgICBfaXNDb25jdXJyZW50TW9kZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIHN1c3BlbnNlU3RhdGUgPSByZXR1cm5GaWJlci5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgIHZhciBfcGFyZW50SW5zdGFuY2UgPSBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQ7XG4gICAgICAgICAgaWYgKF9wYXJlbnRJbnN0YW5jZSAhPT0gbnVsbCkgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICAgICAgdmFyIF90eXBlMiA9IGZpYmVyLnR5cGU7XG4gICAgICAgICAgICAgIHZhciBfcHJvcHMyID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICAgICAgICBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlV2l0aGluU3VzcGVuc2VJbnN0YW5jZShfcGFyZW50SW5zdGFuY2UsIF90eXBlMik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgICAgICAgICB2YXIgX3RleHQyID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICAgICAgICBkaWROb3RGaW5kSHlkcmF0YWJsZVRleHRJbnN0YW5jZVdpdGhpblN1c3BlbnNlSW5zdGFuY2UoX3BhcmVudEluc3RhbmNlLCBfdGV4dDIpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnNlcnROb25IeWRyYXRlZEluc3RhbmNlKHJldHVybkZpYmVyLCBmaWJlcikge1xuICBmaWJlci5mbGFncyA9IGZpYmVyLmZsYWdzICYgfkh5ZHJhdGluZyB8IFBsYWNlbWVudDtcbiAgd2Fybk5vbmh5ZHJhdGVkSW5zdGFuY2UocmV0dXJuRmliZXIsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gdHJ5SHlkcmF0ZShmaWJlciwgbmV4dEluc3RhbmNlKSB7XG4gIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgICAgIHZhciBwcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgdmFyIGluc3RhbmNlID0gY2FuSHlkcmF0ZUluc3RhbmNlKG5leHRJbnN0YW5jZSwgdHlwZSk7XG5cbiAgICAgICAgaWYgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgZmliZXIuc3RhdGVOb2RlID0gaW5zdGFuY2U7XG4gICAgICAgICAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBmaWJlcjtcbiAgICAgICAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGQoaW5zdGFuY2UpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHRleHQgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgIHZhciB0ZXh0SW5zdGFuY2UgPSBjYW5IeWRyYXRlVGV4dEluc3RhbmNlKG5leHRJbnN0YW5jZSwgdGV4dCk7XG5cbiAgICAgICAgaWYgKHRleHRJbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGZpYmVyLnN0YXRlTm9kZSA9IHRleHRJbnN0YW5jZTtcbiAgICAgICAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyOyAvLyBUZXh0IEluc3RhbmNlcyBkb24ndCBoYXZlIGNoaWxkcmVuIHNvIHRoZXJlJ3Mgbm90aGluZyB0byBoeWRyYXRlLlxuXG4gICAgICAgICAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IG51bGw7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgc3VzcGVuc2VJbnN0YW5jZSA9IGNhbkh5ZHJhdGVTdXNwZW5zZUluc3RhbmNlKG5leHRJbnN0YW5jZSk7XG5cbiAgICAgICAgaWYgKHN1c3BlbnNlSW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IHtcbiAgICAgICAgICAgIGRlaHlkcmF0ZWQ6IHN1c3BlbnNlSW5zdGFuY2UsXG4gICAgICAgICAgICB0cmVlQ29udGV4dDogZ2V0U3VzcGVuZGVkVHJlZUNvbnRleHQoKSxcbiAgICAgICAgICAgIHJldHJ5TGFuZTogT2Zmc2NyZWVuTGFuZVxuICAgICAgICAgIH07XG4gICAgICAgICAgZmliZXIubWVtb2l6ZWRTdGF0ZSA9IHN1c3BlbnNlU3RhdGU7IC8vIFN0b3JlIHRoZSBkZWh5ZHJhdGVkIGZyYWdtZW50IGFzIGEgY2hpbGQgZmliZXIuXG4gICAgICAgICAgLy8gVGhpcyBzaW1wbGlmaWVzIHRoZSBjb2RlIGZvciBnZXRIb3N0U2libGluZyBhbmQgZGVsZXRpbmcgbm9kZXMsXG4gICAgICAgICAgLy8gc2luY2UgaXQgZG9lc24ndCBoYXZlIHRvIGNvbnNpZGVyIGFsbCBTdXNwZW5zZSBib3VuZGFyaWVzIGFuZFxuICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZXkncmUgZGVoeWRyYXRlZCBvbmVzIG9yIG5vdC5cblxuICAgICAgICAgIHZhciBkZWh5ZHJhdGVkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21EZWh5ZHJhdGVkRnJhZ21lbnQoc3VzcGVuc2VJbnN0YW5jZSk7XG4gICAgICAgICAgZGVoeWRyYXRlZEZyYWdtZW50LnJldHVybiA9IGZpYmVyO1xuICAgICAgICAgIGZpYmVyLmNoaWxkID0gZGVoeWRyYXRlZEZyYWdtZW50O1xuICAgICAgICAgIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7IC8vIFdoaWxlIGEgU3VzcGVuc2UgSW5zdGFuY2UgZG9lcyBoYXZlIGNoaWxkcmVuLCB3ZSB3b24ndCBzdGVwIGludG9cbiAgICAgICAgICAvLyBpdCBkdXJpbmcgdGhlIGZpcnN0IHBhc3MuIEluc3RlYWQsIHdlJ2xsIHJlZW50ZXIgaXQgbGF0ZXIuXG5cbiAgICAgICAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gbnVsbDtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkQ2xpZW50UmVuZGVyT25NaXNtYXRjaChmaWJlcikge1xuICByZXR1cm4gKGZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSAmJiAoZmliZXIuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gTm9GbGFncztcbn1cblxuZnVuY3Rpb24gdGhyb3dPbkh5ZHJhdGlvbk1pc21hdGNoKGZpYmVyKSB7XG4gIHRocm93IG5ldyBFcnJvcignSHlkcmF0aW9uIGZhaWxlZCBiZWNhdXNlIHRoZSBpbml0aWFsIFVJIGRvZXMgbm90IG1hdGNoIHdoYXQgd2FzICcgKyAncmVuZGVyZWQgb24gdGhlIHNlcnZlci4nKTtcbn1cblxuZnVuY3Rpb24gdHJ5VG9DbGFpbU5leHRIeWRyYXRhYmxlSW5zdGFuY2UoZmliZXIpIHtcbiAgaWYgKCFpc0h5ZHJhdGluZykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBuZXh0SW5zdGFuY2UgPSBuZXh0SHlkcmF0YWJsZUluc3RhbmNlO1xuXG4gIGlmICghbmV4dEluc3RhbmNlKSB7XG4gICAgaWYgKHNob3VsZENsaWVudFJlbmRlck9uTWlzbWF0Y2goZmliZXIpKSB7XG4gICAgICB3YXJuTm9uaHlkcmF0ZWRJbnN0YW5jZShoeWRyYXRpb25QYXJlbnRGaWJlciwgZmliZXIpO1xuICAgICAgdGhyb3dPbkh5ZHJhdGlvbk1pc21hdGNoKCk7XG4gICAgfSAvLyBOb3RoaW5nIHRvIGh5ZHJhdGUuIE1ha2UgaXQgYW4gaW5zZXJ0aW9uLlxuXG5cbiAgICBpbnNlcnROb25IeWRyYXRlZEluc3RhbmNlKGh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaWJlcik7XG4gICAgaXNIeWRyYXRpbmcgPSBmYWxzZTtcbiAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBmaXJzdEF0dGVtcHRlZEluc3RhbmNlID0gbmV4dEluc3RhbmNlO1xuXG4gIGlmICghdHJ5SHlkcmF0ZShmaWJlciwgbmV4dEluc3RhbmNlKSkge1xuICAgIGlmIChzaG91bGRDbGllbnRSZW5kZXJPbk1pc21hdGNoKGZpYmVyKSkge1xuICAgICAgd2Fybk5vbmh5ZHJhdGVkSW5zdGFuY2UoaHlkcmF0aW9uUGFyZW50RmliZXIsIGZpYmVyKTtcbiAgICAgIHRocm93T25IeWRyYXRpb25NaXNtYXRjaCgpO1xuICAgIH0gLy8gSWYgd2UgY2FuJ3QgaHlkcmF0ZSB0aGlzIGluc3RhbmNlIGxldCdzIHRyeSB0aGUgbmV4dCBvbmUuXG4gICAgLy8gV2UgdXNlIHRoaXMgYXMgYSBoZXVyaXN0aWMuIEl0J3MgYmFzZWQgb24gaW50dWl0aW9uIGFuZCBub3QgZGF0YSBzbyBpdFxuICAgIC8vIG1pZ2h0IGJlIGZsYXdlZCBvciB1bm5lY2Vzc2FyeS5cblxuXG4gICAgbmV4dEluc3RhbmNlID0gZ2V0TmV4dEh5ZHJhdGFibGVTaWJsaW5nKGZpcnN0QXR0ZW1wdGVkSW5zdGFuY2UpO1xuICAgIHZhciBwcmV2SHlkcmF0aW9uUGFyZW50RmliZXIgPSBoeWRyYXRpb25QYXJlbnRGaWJlcjtcblxuICAgIGlmICghbmV4dEluc3RhbmNlIHx8ICF0cnlIeWRyYXRlKGZpYmVyLCBuZXh0SW5zdGFuY2UpKSB7XG4gICAgICAvLyBOb3RoaW5nIHRvIGh5ZHJhdGUuIE1ha2UgaXQgYW4gaW5zZXJ0aW9uLlxuICAgICAgaW5zZXJ0Tm9uSHlkcmF0ZWRJbnN0YW5jZShoeWRyYXRpb25QYXJlbnRGaWJlciwgZmliZXIpO1xuICAgICAgaXNIeWRyYXRpbmcgPSBmYWxzZTtcbiAgICAgIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBXZSBtYXRjaGVkIHRoZSBuZXh0IG9uZSwgd2UnbGwgbm93IGFzc3VtZSB0aGF0IHRoZSBmaXJzdCBvbmUgd2FzXG4gICAgLy8gc3VwZXJmbHVvdXMgYW5kIHdlJ2xsIGRlbGV0ZSBpdC4gU2luY2Ugd2UgY2FuJ3QgZWFnZXJseSBkZWxldGUgaXRcbiAgICAvLyB3ZSdsbCBoYXZlIHRvIHNjaGVkdWxlIGEgZGVsZXRpb24uIFRvIGRvIHRoYXQsIHRoaXMgbm9kZSBuZWVkcyBhIGR1bW15XG4gICAgLy8gZmliZXIgYXNzb2NpYXRlZCB3aXRoIGl0LlxuXG5cbiAgICBkZWxldGVIeWRyYXRhYmxlSW5zdGFuY2UocHJldkh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaXJzdEF0dGVtcHRlZEluc3RhbmNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmVwYXJlVG9IeWRyYXRlSG9zdEluc3RhbmNlKGZpYmVyLCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0KSB7XG5cbiAgdmFyIGluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuICB2YXIgc2hvdWxkV2FybklmTWlzbWF0Y2hEZXYgPSAhZGlkU3VzcGVuZE9yRXJyb3JERVY7XG4gIHZhciB1cGRhdGVQYXlsb2FkID0gaHlkcmF0ZUluc3RhbmNlKGluc3RhbmNlLCBmaWJlci50eXBlLCBmaWJlci5tZW1vaXplZFByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0LCBmaWJlciwgc2hvdWxkV2FybklmTWlzbWF0Y2hEZXYpOyAvLyBUT0RPOiBUeXBlIHRoaXMgc3BlY2lmaWMgdG8gdGhpcyB0eXBlIG9mIGNvbXBvbmVudC5cblxuICBmaWJlci51cGRhdGVRdWV1ZSA9IHVwZGF0ZVBheWxvYWQ7IC8vIElmIHRoZSB1cGRhdGUgcGF5bG9hZCBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBpcyBhIGNoYW5nZSBvciBpZiB0aGVyZVxuICAvLyBpcyBhIG5ldyByZWYgd2UgbWFyayB0aGlzIGFzIGFuIHVwZGF0ZS5cblxuICBpZiAodXBkYXRlUGF5bG9hZCAhPT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlVG9IeWRyYXRlSG9zdFRleHRJbnN0YW5jZShmaWJlcikge1xuXG4gIHZhciB0ZXh0SW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG4gIHZhciB0ZXh0Q29udGVudCA9IGZpYmVyLm1lbW9pemVkUHJvcHM7XG4gIHZhciBzaG91bGRVcGRhdGUgPSBoeWRyYXRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSwgdGV4dENvbnRlbnQsIGZpYmVyKTtcblxuICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgLy8gV2UgYXNzdW1lIHRoYXQgcHJlcGFyZVRvSHlkcmF0ZUhvc3RUZXh0SW5zdGFuY2UgaXMgY2FsbGVkIGluIGEgY29udGV4dCB3aGVyZSB0aGVcbiAgICAvLyBoeWRyYXRpb24gcGFyZW50IGlzIHRoZSBwYXJlbnQgaG9zdCBjb21wb25lbnQgb2YgdGhpcyBob3N0IHRleHQuXG4gICAgdmFyIHJldHVybkZpYmVyID0gaHlkcmF0aW9uUGFyZW50RmliZXI7XG5cbiAgICBpZiAocmV0dXJuRmliZXIgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAocmV0dXJuRmliZXIudGFnKSB7XG4gICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHBhcmVudENvbnRhaW5lciA9IHJldHVybkZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICAgICAgICAgICAgdmFyIGlzQ29uY3VycmVudE1vZGUgPSAocmV0dXJuRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuICAgICAgICAgICAgZGlkTm90TWF0Y2hIeWRyYXRlZENvbnRhaW5lclRleHRJbnN0YW5jZShwYXJlbnRDb250YWluZXIsIHRleHRJbnN0YW5jZSwgdGV4dENvbnRlbnQsIC8vIFRPRE86IERlbGV0ZSB0aGlzIGFyZ3VtZW50IHdoZW4gd2UgcmVtb3ZlIHRoZSBsZWdhY3kgcm9vdCBBUEkuXG4gICAgICAgICAgICBpc0NvbmN1cnJlbnRNb2RlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHBhcmVudFR5cGUgPSByZXR1cm5GaWJlci50eXBlO1xuICAgICAgICAgICAgdmFyIHBhcmVudFByb3BzID0gcmV0dXJuRmliZXIubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICAgIHZhciBwYXJlbnRJbnN0YW5jZSA9IHJldHVybkZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgICAgdmFyIF9pc0NvbmN1cnJlbnRNb2RlMiA9IChyZXR1cm5GaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG5cbiAgICAgICAgICAgIGRpZE5vdE1hdGNoSHlkcmF0ZWRUZXh0SW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCB0ZXh0SW5zdGFuY2UsIHRleHRDb250ZW50LCAvLyBUT0RPOiBEZWxldGUgdGhpcyBhcmd1bWVudCB3aGVuIHdlIHJlbW92ZSB0aGUgbGVnYWN5IHJvb3QgQVBJLlxuICAgICAgICAgICAgX2lzQ29uY3VycmVudE1vZGUyKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gc2hvdWxkVXBkYXRlO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlVG9IeWRyYXRlSG9zdFN1c3BlbnNlSW5zdGFuY2UoZmliZXIpIHtcblxuICB2YXIgc3VzcGVuc2VTdGF0ZSA9IGZpYmVyLm1lbW9pemVkU3RhdGU7XG4gIHZhciBzdXNwZW5zZUluc3RhbmNlID0gc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCA/IHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZCA6IG51bGw7XG5cbiAgaWYgKCFzdXNwZW5zZUluc3RhbmNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byBoYXZlIGEgaHlkcmF0ZWQgc3VzcGVuc2UgaW5zdGFuY2UuICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxuXG4gIGh5ZHJhdGVTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gc2tpcFBhc3REZWh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZShmaWJlcikge1xuXG4gIHZhciBzdXNwZW5zZVN0YXRlID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHN1c3BlbnNlSW5zdGFuY2UgPSBzdXNwZW5zZVN0YXRlICE9PSBudWxsID8gc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkIDogbnVsbDtcblxuICBpZiAoIXN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIGhhdmUgYSBoeWRyYXRlZCBzdXNwZW5zZSBpbnN0YW5jZS4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlSW5zdGFuY2VBZnRlclN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSk7XG59XG5cbmZ1bmN0aW9uIHBvcFRvTmV4dEhvc3RQYXJlbnQoZmliZXIpIHtcbiAgdmFyIHBhcmVudCA9IGZpYmVyLnJldHVybjtcblxuICB3aGlsZSAocGFyZW50ICE9PSBudWxsICYmIHBhcmVudC50YWcgIT09IEhvc3RDb21wb25lbnQgJiYgcGFyZW50LnRhZyAhPT0gSG9zdFJvb3QgJiYgcGFyZW50LnRhZyAhPT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuO1xuICB9XG5cbiAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBwYXJlbnQ7XG59XG5cbmZ1bmN0aW9uIHBvcEh5ZHJhdGlvblN0YXRlKGZpYmVyKSB7XG5cbiAgaWYgKGZpYmVyICE9PSBoeWRyYXRpb25QYXJlbnRGaWJlcikge1xuICAgIC8vIFdlJ3JlIGRlZXBlciB0aGFuIHRoZSBjdXJyZW50IGh5ZHJhdGlvbiBjb250ZXh0LCBpbnNpZGUgYW4gaW5zZXJ0ZWRcbiAgICAvLyB0cmVlLlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaXNIeWRyYXRpbmcpIHtcbiAgICAvLyBJZiB3ZSdyZSBub3QgY3VycmVudGx5IGh5ZHJhdGluZyBidXQgd2UncmUgaW4gYSBoeWRyYXRpb24gY29udGV4dCwgdGhlblxuICAgIC8vIHdlIHdlcmUgYW4gaW5zZXJ0aW9uIGFuZCBub3cgbmVlZCB0byBwb3AgdXAgcmVlbnRlciBoeWRyYXRpb24gb2Ygb3VyXG4gICAgLy8gc2libGluZ3MuXG4gICAgcG9wVG9OZXh0SG9zdFBhcmVudChmaWJlcik7XG4gICAgaXNIeWRyYXRpbmcgPSB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBJZiB3ZSBoYXZlIGFueSByZW1haW5pbmcgaHlkcmF0YWJsZSBub2Rlcywgd2UgbmVlZCB0byBkZWxldGUgdGhlbSBub3cuXG4gIC8vIFdlIG9ubHkgZG8gdGhpcyBkZWVwZXIgdGhhbiBoZWFkIGFuZCBib2R5IHNpbmNlIHRoZXkgdGVuZCB0byBoYXZlIHJhbmRvbVxuICAvLyBvdGhlciBub2RlcyBpbiB0aGVtLiBXZSBhbHNvIGlnbm9yZSBjb21wb25lbnRzIHdpdGggcHVyZSB0ZXh0IGNvbnRlbnQgaW5cbiAgLy8gc2lkZSBvZiB0aGVtLiBXZSBhbHNvIGRvbid0IGRlbGV0ZSBhbnl0aGluZyBpbnNpZGUgdGhlIHJvb3QgY29udGFpbmVyLlxuXG5cbiAgaWYgKGZpYmVyLnRhZyAhPT0gSG9zdFJvb3QgJiYgKGZpYmVyLnRhZyAhPT0gSG9zdENvbXBvbmVudCB8fCBzaG91bGREZWxldGVVbmh5ZHJhdGVkVGFpbEluc3RhbmNlcyhmaWJlci50eXBlKSAmJiAhc2hvdWxkU2V0VGV4dENvbnRlbnQoZmliZXIudHlwZSwgZmliZXIubWVtb2l6ZWRQcm9wcykpKSB7XG4gICAgdmFyIG5leHRJbnN0YW5jZSA9IG5leHRIeWRyYXRhYmxlSW5zdGFuY2U7XG5cbiAgICBpZiAobmV4dEluc3RhbmNlKSB7XG4gICAgICBpZiAoc2hvdWxkQ2xpZW50UmVuZGVyT25NaXNtYXRjaChmaWJlcikpIHtcbiAgICAgICAgd2FybklmVW5oeWRyYXRlZFRhaWxOb2RlcyhmaWJlcik7XG4gICAgICAgIHRocm93T25IeWRyYXRpb25NaXNtYXRjaCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2hpbGUgKG5leHRJbnN0YW5jZSkge1xuICAgICAgICAgIGRlbGV0ZUh5ZHJhdGFibGVJbnN0YW5jZShmaWJlciwgbmV4dEluc3RhbmNlKTtcbiAgICAgICAgICBuZXh0SW5zdGFuY2UgPSBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcobmV4dEluc3RhbmNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHBvcFRvTmV4dEhvc3RQYXJlbnQoZmliZXIpO1xuXG4gIGlmIChmaWJlci50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IHNraXBQYXN0RGVoeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2UoZmliZXIpO1xuICB9IGVsc2Uge1xuICAgIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBoeWRyYXRpb25QYXJlbnRGaWJlciA/IGdldE5leHRIeWRyYXRhYmxlU2libGluZyhmaWJlci5zdGF0ZU5vZGUpIDogbnVsbDtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBoYXNVbmh5ZHJhdGVkVGFpbE5vZGVzKCkge1xuICByZXR1cm4gaXNIeWRyYXRpbmcgJiYgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gd2FybklmVW5oeWRyYXRlZFRhaWxOb2RlcyhmaWJlcikge1xuICB2YXIgbmV4dEluc3RhbmNlID0gbmV4dEh5ZHJhdGFibGVJbnN0YW5jZTtcblxuICB3aGlsZSAobmV4dEluc3RhbmNlKSB7XG4gICAgd2FyblVuaHlkcmF0ZWRJbnN0YW5jZShmaWJlciwgbmV4dEluc3RhbmNlKTtcbiAgICBuZXh0SW5zdGFuY2UgPSBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcobmV4dEluc3RhbmNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNldEh5ZHJhdGlvblN0YXRlKCkge1xuXG4gIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gbnVsbDtcbiAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IG51bGw7XG4gIGlzSHlkcmF0aW5nID0gZmFsc2U7XG4gIGRpZFN1c3BlbmRPckVycm9yREVWID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHVwZ3JhZGVIeWRyYXRpb25FcnJvcnNUb1JlY292ZXJhYmxlKCkge1xuICBpZiAoaHlkcmF0aW9uRXJyb3JzICE9PSBudWxsKSB7XG4gICAgLy8gU3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCBhIGZvcmNlZCBjbGllbnQgcmVuZGVyLiBUaGUgZXJyb3JzIHRoYXQgb2NjdXJyZWRcbiAgICAvLyBkdXJpbmcgdGhlIGh5ZHJhdGlvbiBhdHRlbXB0IGFyZSBub3cgcmVjb3ZlcmVkLiBXZSB3aWxsIGxvZyB0aGVtIGluXG4gICAgLy8gY29tbWl0IHBoYXNlLCBvbmNlIHRoZSBlbnRpcmUgdHJlZSBoYXMgZmluaXNoZWQuXG4gICAgcXVldWVSZWNvdmVyYWJsZUVycm9ycyhoeWRyYXRpb25FcnJvcnMpO1xuICAgIGh5ZHJhdGlvbkVycm9ycyA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0SXNIeWRyYXRpbmcoKSB7XG4gIHJldHVybiBpc0h5ZHJhdGluZztcbn1cblxuZnVuY3Rpb24gcXVldWVIeWRyYXRpb25FcnJvcihlcnJvcikge1xuICBpZiAoaHlkcmF0aW9uRXJyb3JzID09PSBudWxsKSB7XG4gICAgaHlkcmF0aW9uRXJyb3JzID0gW2Vycm9yXTtcbiAgfSBlbHNlIHtcbiAgICBoeWRyYXRpb25FcnJvcnMucHVzaChlcnJvcik7XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZztcbnZhciBOb1RyYW5zaXRpb24gPSBudWxsO1xuZnVuY3Rpb24gcmVxdWVzdEN1cnJlbnRUcmFuc2l0aW9uKCkge1xuICByZXR1cm4gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMS50cmFuc2l0aW9uO1xufVxuXG52YXIgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MgPSB7XG4gIHJlY29yZFVuc2FmZUxpZmVjeWNsZVdhcm5pbmdzOiBmdW5jdGlvbiAoZmliZXIsIGluc3RhbmNlKSB7fSxcbiAgZmx1c2hQZW5kaW5nVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3M6IGZ1bmN0aW9uICgpIHt9LFxuICByZWNvcmRMZWdhY3lDb250ZXh0V2FybmluZzogZnVuY3Rpb24gKGZpYmVyLCBpbnN0YW5jZSkge30sXG4gIGZsdXNoTGVnYWN5Q29udGV4dFdhcm5pbmc6IGZ1bmN0aW9uICgpIHt9LFxuICBkaXNjYXJkUGVuZGluZ1dhcm5pbmdzOiBmdW5jdGlvbiAoKSB7fVxufTtcblxue1xuICB2YXIgZmluZFN0cmljdFJvb3QgPSBmdW5jdGlvbiAoZmliZXIpIHtcbiAgICB2YXIgbWF5YmVTdHJpY3RSb290ID0gbnVsbDtcbiAgICB2YXIgbm9kZSA9IGZpYmVyO1xuXG4gICAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgIG1heWJlU3RyaWN0Um9vdCA9IG5vZGU7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gbWF5YmVTdHJpY3RSb290O1xuICB9O1xuXG4gIHZhciBzZXRUb1NvcnRlZFN0cmluZyA9IGZ1bmN0aW9uIChzZXQpIHtcbiAgICB2YXIgYXJyYXkgPSBbXTtcbiAgICBzZXQuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGFycmF5LnB1c2godmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiBhcnJheS5zb3J0KCkuam9pbignLCAnKTtcbiAgfTtcblxuICB2YXIgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdO1xuICB2YXIgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdO1xuICB2YXIgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTsgLy8gVHJhY2tzIGNvbXBvbmVudHMgd2UgaGF2ZSBhbHJlYWR5IHdhcm5lZCBhYm91dC5cblxuICB2YXIgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcyA9IG5ldyBTZXQoKTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyA9IGZ1bmN0aW9uIChmaWJlciwgaW5zdGFuY2UpIHtcbiAgICAvLyBEZWR1cGUgc3RyYXRlZ3k6IFdhcm4gb25jZSBwZXIgY29tcG9uZW50LlxuICAgIGlmIChkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmhhcyhmaWJlci50eXBlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nICYmIC8vIERvbid0IHdhcm4gYWJvdXQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLlxuICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudC5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MucHVzaChmaWJlcik7XG4gICAgfVxuXG4gICAgaWYgKGZpYmVyLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlICYmIHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzLl9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgIT09IHRydWUpIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MucHVzaChmaWJlcik7XG4gICAgfVxuXG4gICAgaWYgKGZpYmVyLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlICYmIHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MucHVzaChmaWJlcik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG5cbiAgICBpZiAoZmliZXIubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUgJiYgdHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG4gIH07XG5cbiAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MuZmx1c2hQZW5kaW5nVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gV2UgZG8gYW4gaW5pdGlhbCBwYXNzIHRvIGdhdGhlciBjb21wb25lbnQgbmFtZXNcbiAgICB2YXIgY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG5cbiAgICBpZiAocGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgICBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTtcbiAgICAgIH0pO1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gICAgfVxuXG4gICAgdmFyIFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gICAgfVxuXG4gICAgdmFyIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gICAgfVxuXG4gICAgdmFyIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG5cbiAgICBpZiAocGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgICBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTtcbiAgICAgIH0pO1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzID0gbmV3IFNldCgpO1xuXG4gICAgaWYgKHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBjb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMuYWRkKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdO1xuICAgIH0gLy8gRmluYWxseSwgd2UgZmx1c2ggYWxsIHRoZSB3YXJuaW5nc1xuICAgIC8vIFVOU0FGRV8gb25lcyBiZWZvcmUgdGhlIGRlcHJlY2F0ZWQgb25lcywgc2luY2UgdGhleSdsbCBiZSAnbG91ZGVyJ1xuXG5cbiAgICBpZiAoVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzLnNpemUgPiAwKSB7XG4gICAgICB2YXIgc29ydGVkTmFtZXMgPSBzZXRUb1NvcnRlZFN0cmluZyhVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMpO1xuXG4gICAgICBlcnJvcignVXNpbmcgVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCBpbiBzdHJpY3QgbW9kZSBpcyBub3QgcmVjb21tZW5kZWQgYW5kIG1heSBpbmRpY2F0ZSBidWdzIGluIHlvdXIgY29kZS4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4nICsgJyogTW92ZSBjb2RlIHdpdGggc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZE1vdW50LCBhbmQgc2V0IGluaXRpYWwgc3RhdGUgaW4gdGhlIGNvbnN0cnVjdG9yLlxcbicgKyAnXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJywgc29ydGVkTmFtZXMpO1xuICAgIH1cblxuICAgIGlmIChVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzLnNpemUgPiAwKSB7XG4gICAgICB2YXIgX3NvcnRlZE5hbWVzID0gc2V0VG9Tb3J0ZWRTdHJpbmcoVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyk7XG5cbiAgICAgIGVycm9yKCdVc2luZyBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyBpbiBzdHJpY3QgbW9kZSBpcyBub3QgcmVjb21tZW5kZWQgJyArICdhbmQgbWF5IGluZGljYXRlIGJ1Z3MgaW4geW91ciBjb2RlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbicgKyAnKiBNb3ZlIGRhdGEgZmV0Y2hpbmcgY29kZSBvciBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkVXBkYXRlLlxcbicgKyBcIiogSWYgeW91J3JlIHVwZGF0aW5nIHN0YXRlIHdoZW5ldmVyIHByb3BzIGNoYW5nZSwgXCIgKyAncmVmYWN0b3IgeW91ciBjb2RlIHRvIHVzZSBtZW1vaXphdGlvbiB0ZWNobmlxdWVzIG9yIG1vdmUgaXQgdG8gJyArICdzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLiBMZWFybiBtb3JlIGF0OiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvZGVyaXZlZC1zdGF0ZVxcbicgKyAnXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJywgX3NvcnRlZE5hbWVzKTtcbiAgICB9XG5cbiAgICBpZiAoVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcy5zaXplID4gMCkge1xuICAgICAgdmFyIF9zb3J0ZWROYW1lczIgPSBzZXRUb1NvcnRlZFN0cmluZyhVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzKTtcblxuICAgICAgZXJyb3IoJ1VzaW5nIFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlIGluIHN0cmljdCBtb2RlIGlzIG5vdCByZWNvbW1lbmRlZCAnICsgJ2FuZCBtYXkgaW5kaWNhdGUgYnVncyBpbiB5b3VyIGNvZGUuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuJyArICcqIE1vdmUgZGF0YSBmZXRjaGluZyBjb2RlIG9yIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRVcGRhdGUuXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBfc29ydGVkTmFtZXMyKTtcbiAgICB9XG5cbiAgICBpZiAoY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMuc2l6ZSA+IDApIHtcbiAgICAgIHZhciBfc29ydGVkTmFtZXMzID0gc2V0VG9Tb3J0ZWRTdHJpbmcoY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMpO1xuXG4gICAgICB3YXJuKCdjb21wb25lbnRXaWxsTW91bnQgaGFzIGJlZW4gcmVuYW1lZCwgYW5kIGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgdXNlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbicgKyAnKiBNb3ZlIGNvZGUgd2l0aCBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkTW91bnQsIGFuZCBzZXQgaW5pdGlhbCBzdGF0ZSBpbiB0aGUgY29uc3RydWN0b3IuXFxuJyArICcqIFJlbmFtZSBjb21wb25lbnRXaWxsTW91bnQgdG8gVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCB0byBzdXBwcmVzcyAnICsgJ3RoaXMgd2FybmluZyBpbiBub24tc3RyaWN0IG1vZGUuIEluIFJlYWN0IDE4LngsIG9ubHkgdGhlIFVOU0FGRV8gbmFtZSB3aWxsIHdvcmsuICcgKyAnVG8gcmVuYW1lIGFsbCBkZXByZWNhdGVkIGxpZmVjeWNsZXMgdG8gdGhlaXIgbmV3IG5hbWVzLCB5b3UgY2FuIHJ1biAnICsgJ2BucHggcmVhY3QtY29kZW1vZCByZW5hbWUtdW5zYWZlLWxpZmVjeWNsZXNgIGluIHlvdXIgcHJvamVjdCBzb3VyY2UgZm9sZGVyLlxcbicgKyAnXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJywgX3NvcnRlZE5hbWVzMyk7XG4gICAgfVxuXG4gICAgaWYgKGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcy5zaXplID4gMCkge1xuICAgICAgdmFyIF9zb3J0ZWROYW1lczQgPSBzZXRUb1NvcnRlZFN0cmluZyhjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMpO1xuXG4gICAgICB3YXJuKCdjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIGhhcyBiZWVuIHJlbmFtZWQsIGFuZCBpcyBub3QgcmVjb21tZW5kZWQgZm9yIHVzZS4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4nICsgJyogTW92ZSBkYXRhIGZldGNoaW5nIGNvZGUgb3Igc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZFVwZGF0ZS5cXG4nICsgXCIqIElmIHlvdSdyZSB1cGRhdGluZyBzdGF0ZSB3aGVuZXZlciBwcm9wcyBjaGFuZ2UsIHJlZmFjdG9yIHlvdXIgXCIgKyAnY29kZSB0byB1c2UgbWVtb2l6YXRpb24gdGVjaG5pcXVlcyBvciBtb3ZlIGl0IHRvICcgKyAnc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gTGVhcm4gbW9yZSBhdDogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2Rlcml2ZWQtc3RhdGVcXG4nICsgJyogUmVuYW1lIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgdG8gVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgdG8gc3VwcHJlc3MgJyArICd0aGlzIHdhcm5pbmcgaW4gbm9uLXN0cmljdCBtb2RlLiBJbiBSZWFjdCAxOC54LCBvbmx5IHRoZSBVTlNBRkVfIG5hbWUgd2lsbCB3b3JrLiAnICsgJ1RvIHJlbmFtZSBhbGwgZGVwcmVjYXRlZCBsaWZlY3ljbGVzIHRvIHRoZWlyIG5ldyBuYW1lcywgeW91IGNhbiBydW4gJyArICdgbnB4IHJlYWN0LWNvZGVtb2QgcmVuYW1lLXVuc2FmZS1saWZlY3ljbGVzYCBpbiB5b3VyIHByb2plY3Qgc291cmNlIGZvbGRlci5cXG4nICsgJ1xcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycsIF9zb3J0ZWROYW1lczQpO1xuICAgIH1cblxuICAgIGlmIChjb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMuc2l6ZSA+IDApIHtcbiAgICAgIHZhciBfc29ydGVkTmFtZXM1ID0gc2V0VG9Tb3J0ZWRTdHJpbmcoY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzKTtcblxuICAgICAgd2FybignY29tcG9uZW50V2lsbFVwZGF0ZSBoYXMgYmVlbiByZW5hbWVkLCBhbmQgaXMgbm90IHJlY29tbWVuZGVkIGZvciB1c2UuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuJyArICcqIE1vdmUgZGF0YSBmZXRjaGluZyBjb2RlIG9yIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRVcGRhdGUuXFxuJyArICcqIFJlbmFtZSBjb21wb25lbnRXaWxsVXBkYXRlIHRvIFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlIHRvIHN1cHByZXNzICcgKyAndGhpcyB3YXJuaW5nIGluIG5vbi1zdHJpY3QgbW9kZS4gSW4gUmVhY3QgMTgueCwgb25seSB0aGUgVU5TQUZFXyBuYW1lIHdpbGwgd29yay4gJyArICdUbyByZW5hbWUgYWxsIGRlcHJlY2F0ZWQgbGlmZWN5Y2xlcyB0byB0aGVpciBuZXcgbmFtZXMsIHlvdSBjYW4gcnVuICcgKyAnYG5weCByZWFjdC1jb2RlbW9kIHJlbmFtZS11bnNhZmUtbGlmZWN5Y2xlc2AgaW4geW91ciBwcm9qZWN0IHNvdXJjZSBmb2xkZXIuXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBfc29ydGVkTmFtZXM1KTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHBlbmRpbmdMZWdhY3lDb250ZXh0V2FybmluZyA9IG5ldyBNYXAoKTsgLy8gVHJhY2tzIGNvbXBvbmVudHMgd2UgaGF2ZSBhbHJlYWR5IHdhcm5lZCBhYm91dC5cblxuICB2YXIgZGlkV2FybkFib3V0TGVnYWN5Q29udGV4dCA9IG5ldyBTZXQoKTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRMZWdhY3lDb250ZXh0V2FybmluZyA9IGZ1bmN0aW9uIChmaWJlciwgaW5zdGFuY2UpIHtcbiAgICB2YXIgc3RyaWN0Um9vdCA9IGZpbmRTdHJpY3RSb290KGZpYmVyKTtcblxuICAgIGlmIChzdHJpY3RSb290ID09PSBudWxsKSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgdG8gZmluZCBhIFN0cmljdE1vZGUgY29tcG9uZW50IGluIGEgc3RyaWN0IG1vZGUgdHJlZS4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuXG4gICAgICByZXR1cm47XG4gICAgfSAvLyBEZWR1cCBzdHJhdGVneTogV2FybiBvbmNlIHBlciBjb21wb25lbnQuXG5cblxuICAgIGlmIChkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0LmhhcyhmaWJlci50eXBlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB3YXJuaW5nc0ZvclJvb3QgPSBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcuZ2V0KHN0cmljdFJvb3QpO1xuXG4gICAgaWYgKGZpYmVyLnR5cGUuY29udGV4dFR5cGVzICE9IG51bGwgfHwgZmliZXIudHlwZS5jaGlsZENvbnRleHRUeXBlcyAhPSBudWxsIHx8IGluc3RhbmNlICE9PSBudWxsICYmIHR5cGVvZiBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh3YXJuaW5nc0ZvclJvb3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB3YXJuaW5nc0ZvclJvb3QgPSBbXTtcbiAgICAgICAgcGVuZGluZ0xlZ2FjeUNvbnRleHRXYXJuaW5nLnNldChzdHJpY3RSb290LCB3YXJuaW5nc0ZvclJvb3QpO1xuICAgICAgfVxuXG4gICAgICB3YXJuaW5nc0ZvclJvb3QucHVzaChmaWJlcik7XG4gICAgfVxuICB9O1xuXG4gIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmZsdXNoTGVnYWN5Q29udGV4dFdhcm5pbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgcGVuZGluZ0xlZ2FjeUNvbnRleHRXYXJuaW5nLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyQXJyYXksIHN0cmljdFJvb3QpIHtcbiAgICAgIGlmIChmaWJlckFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBmaXJzdEZpYmVyID0gZmliZXJBcnJheVswXTtcbiAgICAgIHZhciB1bmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcbiAgICAgIGZpYmVyQXJyYXkuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgdW5pcXVlTmFtZXMuYWRkKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0TGVnYWN5Q29udGV4dC5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHZhciBzb3J0ZWROYW1lcyA9IHNldFRvU29ydGVkU3RyaW5nKHVuaXF1ZU5hbWVzKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0Q3VycmVudEZpYmVyKGZpcnN0RmliZXIpO1xuXG4gICAgICAgIGVycm9yKCdMZWdhY3kgY29udGV4dCBBUEkgaGFzIGJlZW4gZGV0ZWN0ZWQgd2l0aGluIGEgc3RyaWN0LW1vZGUgdHJlZS4nICsgJ1xcblxcblRoZSBvbGQgQVBJIHdpbGwgYmUgc3VwcG9ydGVkIGluIGFsbCAxNi54IHJlbGVhc2VzLCBidXQgYXBwbGljYXRpb25zICcgKyAndXNpbmcgaXQgc2hvdWxkIG1pZ3JhdGUgdG8gdGhlIG5ldyB2ZXJzaW9uLicgKyAnXFxuXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJyArICdcXG5cXG5MZWFybiBtb3JlIGFib3V0IHRoaXMgd2FybmluZyBoZXJlOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvbGVnYWN5LWNvbnRleHQnLCBzb3J0ZWROYW1lcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmRpc2NhcmRQZW5kaW5nV2FybmluZ3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdMZWdhY3lDb250ZXh0V2FybmluZyA9IG5ldyBNYXAoKTtcbiAgfTtcbn1cblxudmFyIGRpZFdhcm5BYm91dE1hcHM7XG52YXIgZGlkV2FybkFib3V0R2VuZXJhdG9ycztcbnZhciBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzO1xudmFyIG93bmVySGFzS2V5VXNlV2FybmluZztcbnZhciBvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmc7XG5cbnZhciB3YXJuRm9yTWlzc2luZ0tleSA9IGZ1bmN0aW9uIChjaGlsZCwgcmV0dXJuRmliZXIpIHt9O1xuXG57XG4gIGRpZFdhcm5BYm91dE1hcHMgPSBmYWxzZTtcbiAgZGlkV2FybkFib3V0R2VuZXJhdG9ycyA9IGZhbHNlO1xuICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzID0ge307XG4gIC8qKlxuICAgKiBXYXJuIGlmIHRoZXJlJ3Mgbm8ga2V5IGV4cGxpY2l0bHkgc2V0IG9uIGR5bmFtaWMgYXJyYXlzIG9mIGNoaWxkcmVuIG9yXG4gICAqIG9iamVjdCBrZXlzIGFyZSBub3QgdmFsaWQuIFRoaXMgYWxsb3dzIHVzIHRvIGtlZXAgdHJhY2sgb2YgY2hpbGRyZW4gYmV0d2VlblxuICAgKiB1cGRhdGVzLlxuICAgKi9cblxuICBvd25lckhhc0tleVVzZVdhcm5pbmcgPSB7fTtcbiAgb3duZXJIYXNGdW5jdGlvblR5cGVXYXJuaW5nID0ge307XG5cbiAgd2FybkZvck1pc3NpbmdLZXkgPSBmdW5jdGlvbiAoY2hpbGQsIHJldHVybkZpYmVyKSB7XG4gICAgaWYgKGNoaWxkID09PSBudWxsIHx8IHR5cGVvZiBjaGlsZCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWNoaWxkLl9zdG9yZSB8fCBjaGlsZC5fc3RvcmUudmFsaWRhdGVkIHx8IGNoaWxkLmtleSAhPSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjaGlsZC5fc3RvcmUgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlYWN0IENvbXBvbmVudCBpbiB3YXJuRm9yTWlzc2luZ0tleSBzaG91bGQgaGF2ZSBhIF9zdG9yZS4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIGNoaWxkLl9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihyZXR1cm5GaWJlcikgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICBpZiAob3duZXJIYXNLZXlVc2VXYXJuaW5nW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb3duZXJIYXNLZXlVc2VXYXJuaW5nW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcblxuICAgIGVycm9yKCdFYWNoIGNoaWxkIGluIGEgbGlzdCBzaG91bGQgaGF2ZSBhIHVuaXF1ZSAnICsgJ1wia2V5XCIgcHJvcC4gU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay93YXJuaW5nLWtleXMgZm9yICcgKyAnbW9yZSBpbmZvcm1hdGlvbi4nKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gaXNSZWFjdENsYXNzKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUucHJvdG90eXBlICYmIHR5cGUucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQ7XG59XG5cbmZ1bmN0aW9uIGNvZXJjZVJlZihyZXR1cm5GaWJlciwgY3VycmVudCwgZWxlbWVudCkge1xuICB2YXIgbWl4ZWRSZWYgPSBlbGVtZW50LnJlZjtcblxuICBpZiAobWl4ZWRSZWYgIT09IG51bGwgJiYgdHlwZW9mIG1peGVkUmVmICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBtaXhlZFJlZiAhPT0gJ29iamVjdCcpIHtcbiAgICB7XG4gICAgICAvLyBUT0RPOiBDbGVhbiB0aGlzIHVwIG9uY2Ugd2UgdHVybiBvbiB0aGUgc3RyaW5nIHJlZiB3YXJuaW5nIGZvclxuICAgICAgLy8gZXZlcnlvbmUsIGJlY2F1c2UgdGhlIHN0cmljdCBtb2RlIGNhc2Ugd2lsbCBubyBsb25nZXIgYmUgcmVsZXZhbnRcbiAgICAgIGlmICgocmV0dXJuRmliZXIubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUgfHwgd2FybkFib3V0U3RyaW5nUmVmcykgJiYgLy8gV2Ugd2FybiBpbiBSZWFjdEVsZW1lbnQuanMgaWYgb3duZXIgYW5kIHNlbGYgYXJlIGVxdWFsIGZvciBzdHJpbmcgcmVmc1xuICAgICAgLy8gYmVjYXVzZSB0aGVzZSBjYW5ub3QgYmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gYW4gYXJyb3cgZnVuY3Rpb25cbiAgICAgIC8vIHVzaW5nIGEgY29kZW1vZC4gVGhlcmVmb3JlLCB3ZSBkb24ndCBoYXZlIHRvIHdhcm4gYWJvdXQgc3RyaW5nIHJlZnMgYWdhaW4uXG4gICAgICAhKGVsZW1lbnQuX293bmVyICYmIGVsZW1lbnQuX3NlbGYgJiYgZWxlbWVudC5fb3duZXIuc3RhdGVOb2RlICE9PSBlbGVtZW50Ll9zZWxmKSAmJiAvLyBXaWxsIGFscmVhZHkgdGhyb3cgd2l0aCBcIkZ1bmN0aW9uIGNvbXBvbmVudHMgY2Fubm90IGhhdmUgc3RyaW5nIHJlZnNcIlxuICAgICAgIShlbGVtZW50Ll9vd25lciAmJiBlbGVtZW50Ll9vd25lci50YWcgIT09IENsYXNzQ29tcG9uZW50KSAmJiAvLyBXaWxsIGFscmVhZHkgd2FybiB3aXRoIFwiRnVuY3Rpb24gY29tcG9uZW50cyBjYW5ub3QgYmUgZ2l2ZW4gcmVmc1wiXG4gICAgICAhKHR5cGVvZiBlbGVtZW50LnR5cGUgPT09ICdmdW5jdGlvbicgJiYgIWlzUmVhY3RDbGFzcyhlbGVtZW50LnR5cGUpKSAmJiAvLyBXaWxsIGFscmVhZHkgdGhyb3cgd2l0aCBcIkVsZW1lbnQgcmVmIHdhcyBzcGVjaWZpZWQgYXMgYSBzdHJpbmcgKHNvbWVTdHJpbmdSZWYpIGJ1dCBubyBvd25lciB3YXMgc2V0XCJcbiAgICAgIGVsZW1lbnQuX293bmVyKSB7XG4gICAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihyZXR1cm5GaWJlcikgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgZXJyb3IoJ0NvbXBvbmVudCBcIiVzXCIgY29udGFpbnMgdGhlIHN0cmluZyByZWYgXCIlc1wiLiBTdXBwb3J0IGZvciBzdHJpbmcgcmVmcyAnICsgJ3dpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBXZSByZWNvbW1lbmQgdXNpbmcgJyArICd1c2VSZWYoKSBvciBjcmVhdGVSZWYoKSBpbnN0ZWFkLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtc3RyaW5nLXJlZicsIGNvbXBvbmVudE5hbWUsIG1peGVkUmVmKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbGVtZW50Ll9vd25lcikge1xuICAgICAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICB2YXIgaW5zdDtcblxuICAgICAgaWYgKG93bmVyKSB7XG4gICAgICAgIHZhciBvd25lckZpYmVyID0gb3duZXI7XG5cbiAgICAgICAgaWYgKG93bmVyRmliZXIudGFnICE9PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRnVuY3Rpb24gY29tcG9uZW50cyBjYW5ub3QgaGF2ZSBzdHJpbmcgcmVmcy4gJyArICdXZSByZWNvbW1lbmQgdXNpbmcgdXNlUmVmKCkgaW5zdGVhZC4gJyArICdMZWFybiBtb3JlIGFib3V0IHVzaW5nIHJlZnMgc2FmZWx5IGhlcmU6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N0cmljdC1tb2RlLXN0cmluZy1yZWYnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGluc3QgPSBvd25lckZpYmVyLnN0YXRlTm9kZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpbnN0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3Npbmcgb3duZXIgZm9yIHN0cmluZyByZWYgXCIgKyBtaXhlZFJlZiArIFwiLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBcIiArICdidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgfSAvLyBBc3NpZ25pbmcgdGhpcyB0byBhIGNvbnN0IHNvIEZsb3cga25vd3MgaXQgd29uJ3QgY2hhbmdlIGluIHRoZSBjbG9zdXJlXG5cblxuICAgICAgdmFyIHJlc29sdmVkSW5zdCA9IGluc3Q7XG5cbiAgICAgIHtcbiAgICAgICAgY2hlY2tQcm9wU3RyaW5nQ29lcmNpb24obWl4ZWRSZWYsICdyZWYnKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHN0cmluZ1JlZiA9ICcnICsgbWl4ZWRSZWY7IC8vIENoZWNrIGlmIHByZXZpb3VzIHN0cmluZyByZWYgbWF0Y2hlcyBuZXcgc3RyaW5nIHJlZlxuXG4gICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50LnJlZiAhPT0gbnVsbCAmJiB0eXBlb2YgY3VycmVudC5yZWYgPT09ICdmdW5jdGlvbicgJiYgY3VycmVudC5yZWYuX3N0cmluZ1JlZiA9PT0gc3RyaW5nUmVmKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50LnJlZjtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlZiA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgcmVmcyA9IHJlc29sdmVkSW5zdC5yZWZzO1xuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGRlbGV0ZSByZWZzW3N0cmluZ1JlZl07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVmc1tzdHJpbmdSZWZdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHJlZi5fc3RyaW5nUmVmID0gc3RyaW5nUmVmO1xuICAgICAgcmV0dXJuIHJlZjtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiBtaXhlZFJlZiAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCByZWYgdG8gYmUgYSBmdW5jdGlvbiwgYSBzdHJpbmcsIGFuIG9iamVjdCByZXR1cm5lZCBieSBSZWFjdC5jcmVhdGVSZWYoKSwgb3IgbnVsbC4nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlbGVtZW50Ll9vd25lcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFbGVtZW50IHJlZiB3YXMgc3BlY2lmaWVkIGFzIGEgc3RyaW5nIChcIiArIG1peGVkUmVmICsgXCIpIGJ1dCBubyBvd25lciB3YXMgc2V0LiBUaGlzIGNvdWxkIGhhcHBlbiBmb3Igb25lIG9mXCIgKyAnIHRoZSBmb2xsb3dpbmcgcmVhc29uczpcXG4nICsgJzEuIFlvdSBtYXkgYmUgYWRkaW5nIGEgcmVmIHRvIGEgZnVuY3Rpb24gY29tcG9uZW50XFxuJyArIFwiMi4gWW91IG1heSBiZSBhZGRpbmcgYSByZWYgdG8gYSBjb21wb25lbnQgdGhhdCB3YXMgbm90IGNyZWF0ZWQgaW5zaWRlIGEgY29tcG9uZW50J3MgcmVuZGVyIG1ldGhvZFxcblwiICsgJzMuIFlvdSBoYXZlIG11bHRpcGxlIGNvcGllcyBvZiBSZWFjdCBsb2FkZWRcXG4nICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvcmVmcy1tdXN0LWhhdmUtb3duZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1peGVkUmVmO1xufVxuXG5mdW5jdGlvbiB0aHJvd09uSW52YWxpZE9iamVjdFR5cGUocmV0dXJuRmliZXIsIG5ld0NoaWxkKSB7XG4gIHZhciBjaGlsZFN0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuZXdDaGlsZCk7XG4gIHRocm93IG5ldyBFcnJvcihcIk9iamVjdHMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkIChmb3VuZDogXCIgKyAoY2hpbGRTdHJpbmcgPT09ICdbb2JqZWN0IE9iamVjdF0nID8gJ29iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhuZXdDaGlsZCkuam9pbignLCAnKSArICd9JyA6IGNoaWxkU3RyaW5nKSArIFwiKS4gXCIgKyAnSWYgeW91IG1lYW50IHRvIHJlbmRlciBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4sIHVzZSBhbiBhcnJheSAnICsgJ2luc3RlYWQuJyk7XG59XG5cbmZ1bmN0aW9uIHdhcm5PbkZ1bmN0aW9uVHlwZShyZXR1cm5GaWJlcikge1xuICB7XG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHJldHVybkZpYmVyKSB8fCAnQ29tcG9uZW50JztcblxuICAgIGlmIChvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmdbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmdbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ0Z1bmN0aW9ucyBhcmUgbm90IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQuIFRoaXMgbWF5IGhhcHBlbiBpZiAnICsgJ3lvdSByZXR1cm4gYSBDb21wb25lbnQgaW5zdGVhZCBvZiA8Q29tcG9uZW50IC8+IGZyb20gcmVuZGVyLiAnICsgJ09yIG1heWJlIHlvdSBtZWFudCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gcmF0aGVyIHRoYW4gcmV0dXJuIGl0LicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVMYXp5KGxhenlUeXBlKSB7XG4gIHZhciBwYXlsb2FkID0gbGF6eVR5cGUuX3BheWxvYWQ7XG4gIHZhciBpbml0ID0gbGF6eVR5cGUuX2luaXQ7XG4gIHJldHVybiBpbml0KHBheWxvYWQpO1xufSAvLyBUaGlzIHdyYXBwZXIgZnVuY3Rpb24gZXhpc3RzIGJlY2F1c2UgSSBleHBlY3QgdG8gY2xvbmUgdGhlIGNvZGUgaW4gZWFjaCBwYXRoXG4vLyB0byBiZSBhYmxlIHRvIG9wdGltaXplIGVhY2ggcGF0aCBpbmRpdmlkdWFsbHkgYnkgYnJhbmNoaW5nIGVhcmx5LiBUaGlzIG5lZWRzXG4vLyBhIGNvbXBpbGVyIG9yIHdlIGNhbiBkbyBpdCBtYW51YWxseS4gSGVscGVycyB0aGF0IGRvbid0IG5lZWQgdGhpcyBicmFuY2hpbmdcbi8vIGxpdmUgb3V0c2lkZSBvZiB0aGlzIGZ1bmN0aW9uLlxuXG5cbmZ1bmN0aW9uIENoaWxkUmVjb25jaWxlcihzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gIGZ1bmN0aW9uIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZFRvRGVsZXRlKSB7XG4gICAgaWYgKCFzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAvLyBOb29wLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBkZWxldGlvbnMgPSByZXR1cm5GaWJlci5kZWxldGlvbnM7XG5cbiAgICBpZiAoZGVsZXRpb25zID09PSBudWxsKSB7XG4gICAgICByZXR1cm5GaWJlci5kZWxldGlvbnMgPSBbY2hpbGRUb0RlbGV0ZV07XG4gICAgICByZXR1cm5GaWJlci5mbGFncyB8PSBDaGlsZERlbGV0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGlvbnMucHVzaChjaGlsZFRvRGVsZXRlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpIHtcbiAgICBpZiAoIXNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgIC8vIE5vb3AuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IC8vIFRPRE86IEZvciB0aGUgc2hvdWxkQ2xvbmUgY2FzZSwgdGhpcyBjb3VsZCBiZSBtaWNyby1vcHRpbWl6ZWQgYSBiaXQgYnlcbiAgICAvLyBhc3N1bWluZyB0aGF0IGFmdGVyIHRoZSBmaXJzdCBjaGlsZCB3ZSd2ZSBhbHJlYWR5IGFkZGVkIGV2ZXJ5dGhpbmcuXG5cblxuICAgIHZhciBjaGlsZFRvRGVsZXRlID0gY3VycmVudEZpcnN0Q2hpbGQ7XG5cbiAgICB3aGlsZSAoY2hpbGRUb0RlbGV0ZSAhPT0gbnVsbCkge1xuICAgICAgZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkVG9EZWxldGUpO1xuICAgICAgY2hpbGRUb0RlbGV0ZSA9IGNoaWxkVG9EZWxldGUuc2libGluZztcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1hcFJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCkge1xuICAgIC8vIEFkZCB0aGUgcmVtYWluaW5nIGNoaWxkcmVuIHRvIGEgdGVtcG9yYXJ5IG1hcCBzbyB0aGF0IHdlIGNhbiBmaW5kIHRoZW0gYnlcbiAgICAvLyBrZXlzIHF1aWNrbHkuIEltcGxpY2l0IChudWxsKSBrZXlzIGdldCBhZGRlZCB0byB0aGlzIHNldCB3aXRoIHRoZWlyIGluZGV4XG4gICAgLy8gaW5zdGVhZC5cbiAgICB2YXIgZXhpc3RpbmdDaGlsZHJlbiA9IG5ldyBNYXAoKTtcbiAgICB2YXIgZXhpc3RpbmdDaGlsZCA9IGN1cnJlbnRGaXJzdENoaWxkO1xuXG4gICAgd2hpbGUgKGV4aXN0aW5nQ2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGlmIChleGlzdGluZ0NoaWxkLmtleSAhPT0gbnVsbCkge1xuICAgICAgICBleGlzdGluZ0NoaWxkcmVuLnNldChleGlzdGluZ0NoaWxkLmtleSwgZXhpc3RpbmdDaGlsZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleGlzdGluZ0NoaWxkcmVuLnNldChleGlzdGluZ0NoaWxkLmluZGV4LCBleGlzdGluZ0NoaWxkKTtcbiAgICAgIH1cblxuICAgICAgZXhpc3RpbmdDaGlsZCA9IGV4aXN0aW5nQ2hpbGQuc2libGluZztcbiAgICB9XG5cbiAgICByZXR1cm4gZXhpc3RpbmdDaGlsZHJlbjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVzZUZpYmVyKGZpYmVyLCBwZW5kaW5nUHJvcHMpIHtcbiAgICAvLyBXZSBjdXJyZW50bHkgc2V0IHNpYmxpbmcgdG8gbnVsbCBhbmQgaW5kZXggdG8gMCBoZXJlIGJlY2F1c2UgaXQgaXMgZWFzeVxuICAgIC8vIHRvIGZvcmdldCB0byBkbyBiZWZvcmUgcmV0dXJuaW5nIGl0LiBFLmcuIGZvciB0aGUgc2luZ2xlIGNoaWxkIGNhc2UuXG4gICAgdmFyIGNsb25lID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoZmliZXIsIHBlbmRpbmdQcm9wcyk7XG4gICAgY2xvbmUuaW5kZXggPSAwO1xuICAgIGNsb25lLnNpYmxpbmcgPSBudWxsO1xuICAgIHJldHVybiBjbG9uZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBsYWNlQ2hpbGQobmV3RmliZXIsIGxhc3RQbGFjZWRJbmRleCwgbmV3SW5kZXgpIHtcbiAgICBuZXdGaWJlci5pbmRleCA9IG5ld0luZGV4O1xuXG4gICAgaWYgKCFzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAvLyBEdXJpbmcgaHlkcmF0aW9uLCB0aGUgdXNlSWQgYWxnb3JpdGhtIG5lZWRzIHRvIGtub3cgd2hpY2ggZmliZXJzIGFyZVxuICAgICAgLy8gcGFydCBvZiBhIGxpc3Qgb2YgY2hpbGRyZW4gKGFycmF5cywgaXRlcmF0b3JzKS5cbiAgICAgIG5ld0ZpYmVyLmZsYWdzIHw9IEZvcmtlZDtcbiAgICAgIHJldHVybiBsYXN0UGxhY2VkSW5kZXg7XG4gICAgfVxuXG4gICAgdmFyIGN1cnJlbnQgPSBuZXdGaWJlci5hbHRlcm5hdGU7XG5cbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgdmFyIG9sZEluZGV4ID0gY3VycmVudC5pbmRleDtcblxuICAgICAgaWYgKG9sZEluZGV4IDwgbGFzdFBsYWNlZEluZGV4KSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBtb3ZlLlxuICAgICAgICBuZXdGaWJlci5mbGFncyB8PSBQbGFjZW1lbnQ7XG4gICAgICAgIHJldHVybiBsYXN0UGxhY2VkSW5kZXg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGlzIGl0ZW0gY2FuIHN0YXkgaW4gcGxhY2UuXG4gICAgICAgIHJldHVybiBvbGRJbmRleDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhpcyBpcyBhbiBpbnNlcnRpb24uXG4gICAgICBuZXdGaWJlci5mbGFncyB8PSBQbGFjZW1lbnQ7XG4gICAgICByZXR1cm4gbGFzdFBsYWNlZEluZGV4O1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHBsYWNlU2luZ2xlQ2hpbGQobmV3RmliZXIpIHtcbiAgICAvLyBUaGlzIGlzIHNpbXBsZXIgZm9yIHRoZSBzaW5nbGUgY2hpbGQgY2FzZS4gV2Ugb25seSBuZWVkIHRvIGRvIGFcbiAgICAvLyBwbGFjZW1lbnQgZm9yIGluc2VydGluZyBuZXcgY2hpbGRyZW4uXG4gICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMgJiYgbmV3RmliZXIuYWx0ZXJuYXRlID09PSBudWxsKSB7XG4gICAgICBuZXdGaWJlci5mbGFncyB8PSBQbGFjZW1lbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0ZpYmVyO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlVGV4dE5vZGUocmV0dXJuRmliZXIsIGN1cnJlbnQsIHRleHRDb250ZW50LCBsYW5lcykge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQudGFnICE9PSBIb3N0VGV4dCkge1xuICAgICAgLy8gSW5zZXJ0XG4gICAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbVRleHQodGV4dENvbnRlbnQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcbiAgICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXBkYXRlXG4gICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjdXJyZW50LCB0ZXh0Q29udGVudCk7XG4gICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVFbGVtZW50KHJldHVybkZpYmVyLCBjdXJyZW50LCBlbGVtZW50LCBsYW5lcykge1xuICAgIHZhciBlbGVtZW50VHlwZSA9IGVsZW1lbnQudHlwZTtcblxuICAgIGlmIChlbGVtZW50VHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgICAgcmV0dXJuIHVwZGF0ZUZyYWdtZW50KHJldHVybkZpYmVyLCBjdXJyZW50LCBlbGVtZW50LnByb3BzLmNoaWxkcmVuLCBsYW5lcywgZWxlbWVudC5rZXkpO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICBpZiAoY3VycmVudC5lbGVtZW50VHlwZSA9PT0gZWxlbWVudFR5cGUgfHwgKCAvLyBLZWVwIHRoaXMgY2hlY2sgaW5saW5lIHNvIGl0IG9ubHkgcnVucyBvbiB0aGUgZmFsc2UgcGF0aDpcbiAgICAgICBpc0NvbXBhdGlibGVGYW1pbHlGb3JIb3RSZWxvYWRpbmcoY3VycmVudCwgZWxlbWVudCkgKSB8fCAvLyBMYXp5IHR5cGVzIHNob3VsZCByZWNvbmNpbGUgdGhlaXIgcmVzb2x2ZWQgdHlwZS5cbiAgICAgIC8vIFdlIG5lZWQgdG8gZG8gdGhpcyBhZnRlciB0aGUgSG90IFJlbG9hZGluZyBjaGVjayBhYm92ZSxcbiAgICAgIC8vIGJlY2F1c2UgaG90IHJlbG9hZGluZyBoYXMgZGlmZmVyZW50IHNlbWFudGljcyB0aGFuIHByb2QgYmVjYXVzZVxuICAgICAgLy8gaXQgZG9lc24ndCByZXN1c3BlbmQuIFNvIHdlIGNhbid0IGxldCB0aGUgY2FsbCBiZWxvdyBzdXNwZW5kLlxuICAgICAgdHlwZW9mIGVsZW1lbnRUeXBlID09PSAnb2JqZWN0JyAmJiBlbGVtZW50VHlwZSAhPT0gbnVsbCAmJiBlbGVtZW50VHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFICYmIHJlc29sdmVMYXp5KGVsZW1lbnRUeXBlKSA9PT0gY3VycmVudC50eXBlKSB7XG4gICAgICAgIC8vIE1vdmUgYmFzZWQgb24gaW5kZXhcbiAgICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY3VycmVudCwgZWxlbWVudC5wcm9wcyk7XG4gICAgICAgIGV4aXN0aW5nLnJlZiA9IGNvZXJjZVJlZihyZXR1cm5GaWJlciwgY3VycmVudCwgZWxlbWVudCk7XG4gICAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBleGlzdGluZy5fZGVidWdTb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7XG4gICAgICAgICAgZXhpc3RpbmcuX2RlYnVnT3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBleGlzdGluZztcbiAgICAgIH1cbiAgICB9IC8vIEluc2VydFxuXG5cbiAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbUVsZW1lbnQoZWxlbWVudCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuICAgIGNyZWF0ZWQucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjdXJyZW50LCBlbGVtZW50KTtcbiAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgIHJldHVybiBjcmVhdGVkO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlUG9ydGFsKHJldHVybkZpYmVyLCBjdXJyZW50LCBwb3J0YWwsIGxhbmVzKSB7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudC50YWcgIT09IEhvc3RQb3J0YWwgfHwgY3VycmVudC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyAhPT0gcG9ydGFsLmNvbnRhaW5lckluZm8gfHwgY3VycmVudC5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb24gIT09IHBvcnRhbC5pbXBsZW1lbnRhdGlvbikge1xuICAgICAgLy8gSW5zZXJ0XG4gICAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbVBvcnRhbChwb3J0YWwsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcbiAgICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXBkYXRlXG4gICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjdXJyZW50LCBwb3J0YWwuY2hpbGRyZW4gfHwgW10pO1xuICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlRnJhZ21lbnQocmV0dXJuRmliZXIsIGN1cnJlbnQsIGZyYWdtZW50LCBsYW5lcywga2V5KSB7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudC50YWcgIT09IEZyYWdtZW50KSB7XG4gICAgICAvLyBJbnNlcnRcbiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZnJhZ21lbnQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzLCBrZXkpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVcGRhdGVcbiAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGN1cnJlbnQsIGZyYWdtZW50KTtcbiAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUNoaWxkKHJldHVybkZpYmVyLCBuZXdDaGlsZCwgbGFuZXMpIHtcbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnc3RyaW5nJyAmJiBuZXdDaGlsZCAhPT0gJycgfHwgdHlwZW9mIG5ld0NoaWxkID09PSAnbnVtYmVyJykge1xuICAgICAgLy8gVGV4dCBub2RlcyBkb24ndCBoYXZlIGtleXMuIElmIHRoZSBwcmV2aW91cyBub2RlIGlzIGltcGxpY2l0bHkga2V5ZWRcbiAgICAgIC8vIHdlIGNhbiBjb250aW51ZSB0byByZXBsYWNlIGl0IHdpdGhvdXQgYWJvcnRpbmcgZXZlbiBpZiBpdCBpcyBub3QgYSB0ZXh0XG4gICAgICAvLyBub2RlLlxuICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21UZXh0KCcnICsgbmV3Q2hpbGQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcbiAgICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnb2JqZWN0JyAmJiBuZXdDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChuZXdDaGlsZC4kJHR5cGVvZikge1xuICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgX2NyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21FbGVtZW50KG5ld0NoaWxkLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG5cbiAgICAgICAgICAgIF9jcmVhdGVkLnJlZiA9IGNvZXJjZVJlZihyZXR1cm5GaWJlciwgbnVsbCwgbmV3Q2hpbGQpO1xuICAgICAgICAgICAgX2NyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICAgICAgICByZXR1cm4gX2NyZWF0ZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIF9jcmVhdGVkMiA9IGNyZWF0ZUZpYmVyRnJvbVBvcnRhbChuZXdDaGlsZCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuXG4gICAgICAgICAgICBfY3JlYXRlZDIucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICAgICAgICByZXR1cm4gX2NyZWF0ZWQyO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgcGF5bG9hZCA9IG5ld0NoaWxkLl9wYXlsb2FkO1xuICAgICAgICAgICAgdmFyIGluaXQgPSBuZXdDaGlsZC5faW5pdDtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVDaGlsZChyZXR1cm5GaWJlciwgaW5pdChwYXlsb2FkKSwgbGFuZXMpO1xuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXJyYXkobmV3Q2hpbGQpIHx8IGdldEl0ZXJhdG9yRm4obmV3Q2hpbGQpKSB7XG4gICAgICAgIHZhciBfY3JlYXRlZDMgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChuZXdDaGlsZCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMsIG51bGwpO1xuXG4gICAgICAgIF9jcmVhdGVkMy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgICAgcmV0dXJuIF9jcmVhdGVkMztcbiAgICAgIH1cblxuICAgICAgdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3YXJuT25GdW5jdGlvblR5cGUocmV0dXJuRmliZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlU2xvdChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkLCBsYW5lcykge1xuICAgIC8vIFVwZGF0ZSB0aGUgZmliZXIgaWYgdGhlIGtleXMgbWF0Y2gsIG90aGVyd2lzZSByZXR1cm4gbnVsbC5cbiAgICB2YXIga2V5ID0gb2xkRmliZXIgIT09IG51bGwgPyBvbGRGaWJlci5rZXkgOiBudWxsO1xuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ3N0cmluZycgJiYgbmV3Q2hpbGQgIT09ICcnIHx8IHR5cGVvZiBuZXdDaGlsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgIC8vIFRleHQgbm9kZXMgZG9uJ3QgaGF2ZSBrZXlzLiBJZiB0aGUgcHJldmlvdXMgbm9kZSBpcyBpbXBsaWNpdGx5IGtleWVkXG4gICAgICAvLyB3ZSBjYW4gY29udGludWUgdG8gcmVwbGFjZSBpdCB3aXRob3V0IGFib3J0aW5nIGV2ZW4gaWYgaXQgaXMgbm90IGEgdGV4dFxuICAgICAgLy8gbm9kZS5cbiAgICAgIGlmIChrZXkgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1cGRhdGVUZXh0Tm9kZShyZXR1cm5GaWJlciwgb2xkRmliZXIsICcnICsgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnb2JqZWN0JyAmJiBuZXdDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChuZXdDaGlsZC4kJHR5cGVvZikge1xuICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAobmV3Q2hpbGQua2V5ID09PSBrZXkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZUVsZW1lbnQocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBuZXdDaGlsZCwgbGFuZXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKG5ld0NoaWxkLmtleSA9PT0ga2V5KSB7XG4gICAgICAgICAgICAgIHJldHVybiB1cGRhdGVQb3J0YWwocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBuZXdDaGlsZCwgbGFuZXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBwYXlsb2FkID0gbmV3Q2hpbGQuX3BheWxvYWQ7XG4gICAgICAgICAgICB2YXIgaW5pdCA9IG5ld0NoaWxkLl9pbml0O1xuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVNsb3QocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBpbml0KHBheWxvYWQpLCBsYW5lcyk7XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNBcnJheShuZXdDaGlsZCkgfHwgZ2V0SXRlcmF0b3JGbihuZXdDaGlsZCkpIHtcbiAgICAgICAgaWYgKGtleSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZUZyYWdtZW50KHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQsIGxhbmVzLCBudWxsKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3YXJuT25GdW5jdGlvblR5cGUocmV0dXJuRmliZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlRnJvbU1hcChleGlzdGluZ0NoaWxkcmVuLCByZXR1cm5GaWJlciwgbmV3SWR4LCBuZXdDaGlsZCwgbGFuZXMpIHtcbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnc3RyaW5nJyAmJiBuZXdDaGlsZCAhPT0gJycgfHwgdHlwZW9mIG5ld0NoaWxkID09PSAnbnVtYmVyJykge1xuICAgICAgLy8gVGV4dCBub2RlcyBkb24ndCBoYXZlIGtleXMsIHNvIHdlIG5laXRoZXIgaGF2ZSB0byBjaGVjayB0aGUgb2xkIG5vclxuICAgICAgLy8gbmV3IG5vZGUgZm9yIHRoZSBrZXkuIElmIGJvdGggYXJlIHRleHQgbm9kZXMsIHRoZXkgbWF0Y2guXG4gICAgICB2YXIgbWF0Y2hlZEZpYmVyID0gZXhpc3RpbmdDaGlsZHJlbi5nZXQobmV3SWR4KSB8fCBudWxsO1xuICAgICAgcmV0dXJuIHVwZGF0ZVRleHROb2RlKHJldHVybkZpYmVyLCBtYXRjaGVkRmliZXIsICcnICsgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnb2JqZWN0JyAmJiBuZXdDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChuZXdDaGlsZC4kJHR5cGVvZikge1xuICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgX21hdGNoZWRGaWJlciA9IGV4aXN0aW5nQ2hpbGRyZW4uZ2V0KG5ld0NoaWxkLmtleSA9PT0gbnVsbCA/IG5ld0lkeCA6IG5ld0NoaWxkLmtleSkgfHwgbnVsbDtcblxuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZUVsZW1lbnQocmV0dXJuRmliZXIsIF9tYXRjaGVkRmliZXIsIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIF9tYXRjaGVkRmliZXIyID0gZXhpc3RpbmdDaGlsZHJlbi5nZXQobmV3Q2hpbGQua2V5ID09PSBudWxsID8gbmV3SWR4IDogbmV3Q2hpbGQua2V5KSB8fCBudWxsO1xuXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlUG9ydGFsKHJldHVybkZpYmVyLCBfbWF0Y2hlZEZpYmVyMiwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBuZXdDaGlsZC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IG5ld0NoaWxkLl9pbml0O1xuICAgICAgICAgIHJldHVybiB1cGRhdGVGcm9tTWFwKGV4aXN0aW5nQ2hpbGRyZW4sIHJldHVybkZpYmVyLCBuZXdJZHgsIGluaXQocGF5bG9hZCksIGxhbmVzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXJyYXkobmV3Q2hpbGQpIHx8IGdldEl0ZXJhdG9yRm4obmV3Q2hpbGQpKSB7XG4gICAgICAgIHZhciBfbWF0Y2hlZEZpYmVyMyA9IGV4aXN0aW5nQ2hpbGRyZW4uZ2V0KG5ld0lkeCkgfHwgbnVsbDtcblxuICAgICAgICByZXR1cm4gdXBkYXRlRnJhZ21lbnQocmV0dXJuRmliZXIsIF9tYXRjaGVkRmliZXIzLCBuZXdDaGlsZCwgbGFuZXMsIG51bGwpO1xuICAgICAgfVxuXG4gICAgICB0aHJvd09uSW52YWxpZE9iamVjdFR5cGUocmV0dXJuRmliZXIsIG5ld0NoaWxkKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdhcm5PbkZ1bmN0aW9uVHlwZShyZXR1cm5GaWJlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIFdhcm5zIGlmIHRoZXJlIGlzIGEgZHVwbGljYXRlIG9yIG1pc3Npbmcga2V5XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gd2Fybk9uSW52YWxpZEtleShjaGlsZCwga25vd25LZXlzLCByZXR1cm5GaWJlcikge1xuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgY2hpbGQgIT09ICdvYmplY3QnIHx8IGNoaWxkID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBrbm93bktleXM7XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoY2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAgd2FybkZvck1pc3NpbmdLZXkoY2hpbGQsIHJldHVybkZpYmVyKTtcbiAgICAgICAgICB2YXIga2V5ID0gY2hpbGQua2V5O1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBrZXkgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoa25vd25LZXlzID09PSBudWxsKSB7XG4gICAgICAgICAgICBrbm93bktleXMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBrbm93bktleXMuYWRkKGtleSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWtub3duS2V5cy5oYXMoa2V5KSkge1xuICAgICAgICAgICAga25vd25LZXlzLmFkZChrZXkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZXJyb3IoJ0VuY291bnRlcmVkIHR3byBjaGlsZHJlbiB3aXRoIHRoZSBzYW1lIGtleSwgYCVzYC4gJyArICdLZXlzIHNob3VsZCBiZSB1bmlxdWUgc28gdGhhdCBjb21wb25lbnRzIG1haW50YWluIHRoZWlyIGlkZW50aXR5ICcgKyAnYWNyb3NzIHVwZGF0ZXMuIE5vbi11bmlxdWUga2V5cyBtYXkgY2F1c2UgY2hpbGRyZW4gdG8gYmUgJyArICdkdXBsaWNhdGVkIGFuZC9vciBvbWl0dGVkIFx1MjAxNCB0aGUgYmVoYXZpb3IgaXMgdW5zdXBwb3J0ZWQgYW5kICcgKyAnY291bGQgY2hhbmdlIGluIGEgZnV0dXJlIHZlcnNpb24uJywga2V5KTtcblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgIHZhciBwYXlsb2FkID0gY2hpbGQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBjaGlsZC5faW5pdDtcbiAgICAgICAgICB3YXJuT25JbnZhbGlkS2V5KGluaXQocGF5bG9hZCksIGtub3duS2V5cywgcmV0dXJuRmliZXIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBrbm93bktleXM7XG4gIH1cblxuICBmdW5jdGlvbiByZWNvbmNpbGVDaGlsZHJlbkFycmF5KHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGRyZW4sIGxhbmVzKSB7XG4gICAgLy8gVGhpcyBhbGdvcml0aG0gY2FuJ3Qgb3B0aW1pemUgYnkgc2VhcmNoaW5nIGZyb20gYm90aCBlbmRzIHNpbmNlIHdlXG4gICAgLy8gZG9uJ3QgaGF2ZSBiYWNrcG9pbnRlcnMgb24gZmliZXJzLiBJJ20gdHJ5aW5nIHRvIHNlZSBob3cgZmFyIHdlIGNhbiBnZXRcbiAgICAvLyB3aXRoIHRoYXQgbW9kZWwuIElmIGl0IGVuZHMgdXAgbm90IGJlaW5nIHdvcnRoIHRoZSB0cmFkZW9mZnMsIHdlIGNhblxuICAgIC8vIGFkZCBpdCBsYXRlci5cbiAgICAvLyBFdmVuIHdpdGggYSB0d28gZW5kZWQgb3B0aW1pemF0aW9uLCB3ZSdkIHdhbnQgdG8gb3B0aW1pemUgZm9yIHRoZSBjYXNlXG4gICAgLy8gd2hlcmUgdGhlcmUgYXJlIGZldyBjaGFuZ2VzIGFuZCBicnV0ZSBmb3JjZSB0aGUgY29tcGFyaXNvbiBpbnN0ZWFkIG9mXG4gICAgLy8gZ29pbmcgZm9yIHRoZSBNYXAuIEl0J2QgbGlrZSB0byBleHBsb3JlIGhpdHRpbmcgdGhhdCBwYXRoIGZpcnN0IGluXG4gICAgLy8gZm9yd2FyZC1vbmx5IG1vZGUgYW5kIG9ubHkgZ28gZm9yIHRoZSBNYXAgb25jZSB3ZSBub3RpY2UgdGhhdCB3ZSBuZWVkXG4gICAgLy8gbG90cyBvZiBsb29rIGFoZWFkLiBUaGlzIGRvZXNuJ3QgaGFuZGxlIHJldmVyc2FsIGFzIHdlbGwgYXMgdHdvIGVuZGVkXG4gICAgLy8gc2VhcmNoIGJ1dCB0aGF0J3MgdW51c3VhbC4gQmVzaWRlcywgZm9yIHRoZSB0d28gZW5kZWQgb3B0aW1pemF0aW9uIHRvXG4gICAgLy8gd29yayBvbiBJdGVyYWJsZXMsIHdlJ2QgbmVlZCB0byBjb3B5IHRoZSB3aG9sZSBzZXQuXG4gICAgLy8gSW4gdGhpcyBmaXJzdCBpdGVyYXRpb24sIHdlJ2xsIGp1c3QgbGl2ZSB3aXRoIGhpdHRpbmcgdGhlIGJhZCBjYXNlXG4gICAgLy8gKGFkZGluZyBldmVyeXRoaW5nIHRvIGEgTWFwKSBpbiBmb3IgZXZlcnkgaW5zZXJ0L21vdmUuXG4gICAgLy8gSWYgeW91IGNoYW5nZSB0aGlzIGNvZGUsIGFsc28gdXBkYXRlIHJlY29uY2lsZUNoaWxkcmVuSXRlcmF0b3IoKSB3aGljaFxuICAgIC8vIHVzZXMgdGhlIHNhbWUgYWxnb3JpdGhtLlxuICAgIHtcbiAgICAgIC8vIEZpcnN0LCB2YWxpZGF0ZSBrZXlzLlxuICAgICAgdmFyIGtub3duS2V5cyA9IG51bGw7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV3Q2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNoaWxkID0gbmV3Q2hpbGRyZW5baV07XG4gICAgICAgIGtub3duS2V5cyA9IHdhcm5PbkludmFsaWRLZXkoY2hpbGQsIGtub3duS2V5cywgcmV0dXJuRmliZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciByZXN1bHRpbmdGaXJzdENoaWxkID0gbnVsbDtcbiAgICB2YXIgcHJldmlvdXNOZXdGaWJlciA9IG51bGw7XG4gICAgdmFyIG9sZEZpYmVyID0gY3VycmVudEZpcnN0Q2hpbGQ7XG4gICAgdmFyIGxhc3RQbGFjZWRJbmRleCA9IDA7XG4gICAgdmFyIG5ld0lkeCA9IDA7XG4gICAgdmFyIG5leHRPbGRGaWJlciA9IG51bGw7XG5cbiAgICBmb3IgKDsgb2xkRmliZXIgIT09IG51bGwgJiYgbmV3SWR4IDwgbmV3Q2hpbGRyZW4ubGVuZ3RoOyBuZXdJZHgrKykge1xuICAgICAgaWYgKG9sZEZpYmVyLmluZGV4ID4gbmV3SWR4KSB7XG4gICAgICAgIG5leHRPbGRGaWJlciA9IG9sZEZpYmVyO1xuICAgICAgICBvbGRGaWJlciA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0T2xkRmliZXIgPSBvbGRGaWJlci5zaWJsaW5nO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmV3RmliZXIgPSB1cGRhdGVTbG90KHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGRyZW5bbmV3SWR4XSwgbGFuZXMpO1xuXG4gICAgICBpZiAobmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBicmVha3Mgb24gZW1wdHkgc2xvdHMgbGlrZSBudWxsIGNoaWxkcmVuLiBUaGF0J3NcbiAgICAgICAgLy8gdW5mb3J0dW5hdGUgYmVjYXVzZSBpdCB0cmlnZ2VycyB0aGUgc2xvdyBwYXRoIGFsbCB0aGUgdGltZS4gV2UgbmVlZFxuICAgICAgICAvLyBhIGJldHRlciB3YXkgdG8gY29tbXVuaWNhdGUgd2hldGhlciB0aGlzIHdhcyBhIG1pc3Mgb3IgbnVsbCxcbiAgICAgICAgLy8gYm9vbGVhbiwgdW5kZWZpbmVkLCBldGMuXG4gICAgICAgIGlmIChvbGRGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIG9sZEZpYmVyID0gbmV4dE9sZEZpYmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAgIGlmIChvbGRGaWJlciAmJiBuZXdGaWJlci5hbHRlcm5hdGUgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSBtYXRjaGVkIHRoZSBzbG90LCBidXQgd2UgZGlkbid0IHJldXNlIHRoZSBleGlzdGluZyBmaWJlciwgc28gd2VcbiAgICAgICAgICAvLyBuZWVkIHRvIGRlbGV0ZSB0aGUgZXhpc3RpbmcgY2hpbGQuXG4gICAgICAgICAgZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIG9sZEZpYmVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKG5ld0ZpYmVyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG5cbiAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgIC8vIFRPRE86IE1vdmUgb3V0IG9mIHRoZSBsb29wLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgdGhlIGZpcnN0IHJ1bi5cbiAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IG5ld0ZpYmVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVE9ETzogRGVmZXIgc2libGluZ3MgaWYgd2UncmUgbm90IGF0IHRoZSByaWdodCBpbmRleCBmb3IgdGhpcyBzbG90LlxuICAgICAgICAvLyBJLmUuIGlmIHdlIGhhZCBudWxsIHZhbHVlcyBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byBkZWZlciB0aGlzXG4gICAgICAgIC8vIGZvciBlYWNoIG51bGwgdmFsdWUuIEhvd2V2ZXIsIHdlIGFsc28gZG9uJ3Qgd2FudCB0byBjYWxsIHVwZGF0ZVNsb3RcbiAgICAgICAgLy8gd2l0aCB0aGUgcHJldmlvdXMgb25lLlxuICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBuZXdGaWJlcjtcbiAgICAgIH1cblxuICAgICAgcHJldmlvdXNOZXdGaWJlciA9IG5ld0ZpYmVyO1xuICAgICAgb2xkRmliZXIgPSBuZXh0T2xkRmliZXI7XG4gICAgfVxuXG4gICAgaWYgKG5ld0lkeCA9PT0gbmV3Q2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAvLyBXZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIG5ldyBjaGlsZHJlbi4gV2UgY2FuIGRlbGV0ZSB0aGUgcmVzdC5cbiAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBvbGRGaWJlcik7XG5cbiAgICAgIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgICAgIHZhciBudW1iZXJPZkZvcmtzID0gbmV3SWR4O1xuICAgICAgICBwdXNoVHJlZUZvcmsocmV0dXJuRmliZXIsIG51bWJlck9mRm9ya3MpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgICB9XG5cbiAgICBpZiAob2xkRmliZXIgPT09IG51bGwpIHtcbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYW55IG1vcmUgZXhpc3RpbmcgY2hpbGRyZW4gd2UgY2FuIGNob29zZSBhIGZhc3QgcGF0aFxuICAgICAgLy8gc2luY2UgdGhlIHJlc3Qgd2lsbCBhbGwgYmUgaW5zZXJ0aW9ucy5cbiAgICAgIGZvciAoOyBuZXdJZHggPCBuZXdDaGlsZHJlbi5sZW5ndGg7IG5ld0lkeCsrKSB7XG4gICAgICAgIHZhciBfbmV3RmliZXIgPSBjcmVhdGVDaGlsZChyZXR1cm5GaWJlciwgbmV3Q2hpbGRyZW5bbmV3SWR4XSwgbGFuZXMpO1xuXG4gICAgICAgIGlmIChfbmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQoX25ld0ZpYmVyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG5cbiAgICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBUT0RPOiBNb3ZlIG91dCBvZiB0aGUgbG9vcC4gVGhpcyBvbmx5IGhhcHBlbnMgZm9yIHRoZSBmaXJzdCBydW4uXG4gICAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IF9uZXdGaWJlcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBfbmV3RmliZXI7XG4gICAgICAgIH1cblxuICAgICAgICBwcmV2aW91c05ld0ZpYmVyID0gX25ld0ZpYmVyO1xuICAgICAgfVxuXG4gICAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgICAgICB2YXIgX251bWJlck9mRm9ya3MgPSBuZXdJZHg7XG4gICAgICAgIHB1c2hUcmVlRm9yayhyZXR1cm5GaWJlciwgX251bWJlck9mRm9ya3MpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgICB9IC8vIEFkZCBhbGwgY2hpbGRyZW4gdG8gYSBrZXkgbWFwIGZvciBxdWljayBsb29rdXBzLlxuXG5cbiAgICB2YXIgZXhpc3RpbmdDaGlsZHJlbiA9IG1hcFJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBvbGRGaWJlcik7IC8vIEtlZXAgc2Nhbm5pbmcgYW5kIHVzZSB0aGUgbWFwIHRvIHJlc3RvcmUgZGVsZXRlZCBpdGVtcyBhcyBtb3Zlcy5cblxuICAgIGZvciAoOyBuZXdJZHggPCBuZXdDaGlsZHJlbi5sZW5ndGg7IG5ld0lkeCsrKSB7XG4gICAgICB2YXIgX25ld0ZpYmVyMiA9IHVwZGF0ZUZyb21NYXAoZXhpc3RpbmdDaGlsZHJlbiwgcmV0dXJuRmliZXIsIG5ld0lkeCwgbmV3Q2hpbGRyZW5bbmV3SWR4XSwgbGFuZXMpO1xuXG4gICAgICBpZiAoX25ld0ZpYmVyMiAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgICAgIGlmIChfbmV3RmliZXIyLmFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gVGhlIG5ldyBmaWJlciBpcyBhIHdvcmsgaW4gcHJvZ3Jlc3MsIGJ1dCBpZiB0aGVyZSBleGlzdHMgYVxuICAgICAgICAgICAgLy8gY3VycmVudCwgdGhhdCBtZWFucyB0aGF0IHdlIHJldXNlZCB0aGUgZmliZXIuIFdlIG5lZWQgdG8gZGVsZXRlXG4gICAgICAgICAgICAvLyBpdCBmcm9tIHRoZSBjaGlsZCBsaXN0IHNvIHRoYXQgd2UgZG9uJ3QgYWRkIGl0IHRvIHRoZSBkZWxldGlvblxuICAgICAgICAgICAgLy8gbGlzdC5cbiAgICAgICAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uZGVsZXRlKF9uZXdGaWJlcjIua2V5ID09PSBudWxsID8gbmV3SWR4IDogX25ld0ZpYmVyMi5rZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQoX25ld0ZpYmVyMiwgbGFzdFBsYWNlZEluZGV4LCBuZXdJZHgpO1xuXG4gICAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IF9uZXdGaWJlcjI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gX25ld0ZpYmVyMjtcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBfbmV3RmliZXIyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAvLyBBbnkgZXhpc3RpbmcgY2hpbGRyZW4gdGhhdCB3ZXJlbid0IGNvbnN1bWVkIGFib3ZlIHdlcmUgZGVsZXRlZC4gV2UgbmVlZFxuICAgICAgLy8gdG8gYWRkIHRoZW0gdG8gdGhlIGRlbGV0aW9uIGxpc3QuXG4gICAgICBleGlzdGluZ0NoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIHJldHVybiBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAgIHZhciBfbnVtYmVyT2ZGb3JrczIgPSBuZXdJZHg7XG4gICAgICBwdXNoVHJlZUZvcmsocmV0dXJuRmliZXIsIF9udW1iZXJPZkZvcmtzMik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gIH1cblxuICBmdW5jdGlvbiByZWNvbmNpbGVDaGlsZHJlbkl0ZXJhdG9yKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGRyZW5JdGVyYWJsZSwgbGFuZXMpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBzYW1lIGltcGxlbWVudGF0aW9uIGFzIHJlY29uY2lsZUNoaWxkcmVuQXJyYXkoKSxcbiAgICAvLyBidXQgdXNpbmcgdGhlIGl0ZXJhdG9yIGluc3RlYWQuXG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKG5ld0NoaWxkcmVuSXRlcmFibGUpO1xuXG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FuIG9iamVjdCBpcyBub3QgYW4gaXRlcmFibGUuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiAnICsgJ1JlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICAvLyBXZSBkb24ndCBzdXBwb3J0IHJlbmRlcmluZyBHZW5lcmF0b3JzIGJlY2F1c2UgaXQncyBhIG11dGF0aW9uLlxuICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTI5OTVcbiAgICAgIGlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIC8vICRGbG93Rml4TWUgRmxvdyBkb2Vzbid0IGtub3cgYWJvdXQgdG9TdHJpbmdUYWdcbiAgICAgIG5ld0NoaWxkcmVuSXRlcmFibGVbU3ltYm9sLnRvU3RyaW5nVGFnXSA9PT0gJ0dlbmVyYXRvcicpIHtcbiAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRHZW5lcmF0b3JzKSB7XG4gICAgICAgICAgZXJyb3IoJ1VzaW5nIEdlbmVyYXRvcnMgYXMgY2hpbGRyZW4gaXMgdW5zdXBwb3J0ZWQgYW5kIHdpbGwgbGlrZWx5IHlpZWxkICcgKyAndW5leHBlY3RlZCByZXN1bHRzIGJlY2F1c2UgZW51bWVyYXRpbmcgYSBnZW5lcmF0b3IgbXV0YXRlcyBpdC4gJyArICdZb3UgbWF5IGNvbnZlcnQgaXQgdG8gYW4gYXJyYXkgd2l0aCBgQXJyYXkuZnJvbSgpYCBvciB0aGUgJyArICdgWy4uLnNwcmVhZF1gIG9wZXJhdG9yIGJlZm9yZSByZW5kZXJpbmcuIEtlZXAgaW4gbWluZCAnICsgJ3lvdSBtaWdodCBuZWVkIHRvIHBvbHlmaWxsIHRoZXNlIGZlYXR1cmVzIGZvciBvbGRlciBicm93c2Vycy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRpZFdhcm5BYm91dEdlbmVyYXRvcnMgPSB0cnVlO1xuICAgICAgfSAvLyBXYXJuIGFib3V0IHVzaW5nIE1hcHMgYXMgY2hpbGRyZW5cblxuXG4gICAgICBpZiAobmV3Q2hpbGRyZW5JdGVyYWJsZS5lbnRyaWVzID09PSBpdGVyYXRvckZuKSB7XG4gICAgICAgIGlmICghZGlkV2FybkFib3V0TWFwcykge1xuICAgICAgICAgIGVycm9yKCdVc2luZyBNYXBzIGFzIGNoaWxkcmVuIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnVXNlIGFuIGFycmF5IG9mIGtleWVkIFJlYWN0RWxlbWVudHMgaW5zdGVhZC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRpZFdhcm5BYm91dE1hcHMgPSB0cnVlO1xuICAgICAgfSAvLyBGaXJzdCwgdmFsaWRhdGUga2V5cy5cbiAgICAgIC8vIFdlJ2xsIGdldCBhIGRpZmZlcmVudCBpdGVyYXRvciBsYXRlciBmb3IgdGhlIG1haW4gcGFzcy5cblxuXG4gICAgICB2YXIgX25ld0NoaWxkcmVuID0gaXRlcmF0b3JGbi5jYWxsKG5ld0NoaWxkcmVuSXRlcmFibGUpO1xuXG4gICAgICBpZiAoX25ld0NoaWxkcmVuKSB7XG4gICAgICAgIHZhciBrbm93bktleXMgPSBudWxsO1xuXG4gICAgICAgIHZhciBfc3RlcCA9IF9uZXdDaGlsZHJlbi5uZXh0KCk7XG5cbiAgICAgICAgZm9yICg7ICFfc3RlcC5kb25lOyBfc3RlcCA9IF9uZXdDaGlsZHJlbi5uZXh0KCkpIHtcbiAgICAgICAgICB2YXIgY2hpbGQgPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgICBrbm93bktleXMgPSB3YXJuT25JbnZhbGlkS2V5KGNoaWxkLCBrbm93bktleXMsIHJldHVybkZpYmVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBuZXdDaGlsZHJlbiA9IGl0ZXJhdG9yRm4uY2FsbChuZXdDaGlsZHJlbkl0ZXJhYmxlKTtcblxuICAgIGlmIChuZXdDaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FuIGl0ZXJhYmxlIG9iamVjdCBwcm92aWRlZCBubyBpdGVyYXRvci4nKTtcbiAgICB9XG5cbiAgICB2YXIgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IG51bGw7XG4gICAgdmFyIHByZXZpb3VzTmV3RmliZXIgPSBudWxsO1xuICAgIHZhciBvbGRGaWJlciA9IGN1cnJlbnRGaXJzdENoaWxkO1xuICAgIHZhciBsYXN0UGxhY2VkSW5kZXggPSAwO1xuICAgIHZhciBuZXdJZHggPSAwO1xuICAgIHZhciBuZXh0T2xkRmliZXIgPSBudWxsO1xuICAgIHZhciBzdGVwID0gbmV3Q2hpbGRyZW4ubmV4dCgpO1xuXG4gICAgZm9yICg7IG9sZEZpYmVyICE9PSBudWxsICYmICFzdGVwLmRvbmU7IG5ld0lkeCsrLCBzdGVwID0gbmV3Q2hpbGRyZW4ubmV4dCgpKSB7XG4gICAgICBpZiAob2xkRmliZXIuaW5kZXggPiBuZXdJZHgpIHtcbiAgICAgICAgbmV4dE9sZEZpYmVyID0gb2xkRmliZXI7XG4gICAgICAgIG9sZEZpYmVyID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRPbGRGaWJlciA9IG9sZEZpYmVyLnNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIHZhciBuZXdGaWJlciA9IHVwZGF0ZVNsb3QocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBzdGVwLnZhbHVlLCBsYW5lcyk7XG5cbiAgICAgIGlmIChuZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGJyZWFrcyBvbiBlbXB0eSBzbG90cyBsaWtlIG51bGwgY2hpbGRyZW4uIFRoYXQnc1xuICAgICAgICAvLyB1bmZvcnR1bmF0ZSBiZWNhdXNlIGl0IHRyaWdnZXJzIHRoZSBzbG93IHBhdGggYWxsIHRoZSB0aW1lLiBXZSBuZWVkXG4gICAgICAgIC8vIGEgYmV0dGVyIHdheSB0byBjb21tdW5pY2F0ZSB3aGV0aGVyIHRoaXMgd2FzIGEgbWlzcyBvciBudWxsLFxuICAgICAgICAvLyBib29sZWFuLCB1bmRlZmluZWQsIGV0Yy5cbiAgICAgICAgaWYgKG9sZEZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgb2xkRmliZXIgPSBuZXh0T2xkRmliZXI7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgICAgaWYgKG9sZEZpYmVyICYmIG5ld0ZpYmVyLmFsdGVybmF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlIG1hdGNoZWQgdGhlIHNsb3QsIGJ1dCB3ZSBkaWRuJ3QgcmV1c2UgdGhlIGV4aXN0aW5nIGZpYmVyLCBzbyB3ZVxuICAgICAgICAgIC8vIG5lZWQgdG8gZGVsZXRlIHRoZSBleGlzdGluZyBjaGlsZC5cbiAgICAgICAgICBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgb2xkRmliZXIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQobmV3RmliZXIsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgLy8gVE9ETzogTW92ZSBvdXQgb2YgdGhlIGxvb3AuIFRoaXMgb25seSBoYXBwZW5zIGZvciB0aGUgZmlyc3QgcnVuLlxuICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gbmV3RmliZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUT0RPOiBEZWZlciBzaWJsaW5ncyBpZiB3ZSdyZSBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IGZvciB0aGlzIHNsb3QuXG4gICAgICAgIC8vIEkuZS4gaWYgd2UgaGFkIG51bGwgdmFsdWVzIGJlZm9yZSwgdGhlbiB3ZSB3YW50IHRvIGRlZmVyIHRoaXNcbiAgICAgICAgLy8gZm9yIGVhY2ggbnVsbCB2YWx1ZS4gSG93ZXZlciwgd2UgYWxzbyBkb24ndCB3YW50IHRvIGNhbGwgdXBkYXRlU2xvdFxuICAgICAgICAvLyB3aXRoIHRoZSBwcmV2aW91cyBvbmUuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IG5ld0ZpYmVyO1xuICAgICAgfVxuXG4gICAgICBwcmV2aW91c05ld0ZpYmVyID0gbmV3RmliZXI7XG4gICAgICBvbGRGaWJlciA9IG5leHRPbGRGaWJlcjtcbiAgICB9XG5cbiAgICBpZiAoc3RlcC5kb25lKSB7XG4gICAgICAvLyBXZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIG5ldyBjaGlsZHJlbi4gV2UgY2FuIGRlbGV0ZSB0aGUgcmVzdC5cbiAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBvbGRGaWJlcik7XG5cbiAgICAgIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgICAgIHZhciBudW1iZXJPZkZvcmtzID0gbmV3SWR4O1xuICAgICAgICBwdXNoVHJlZUZvcmsocmV0dXJuRmliZXIsIG51bWJlck9mRm9ya3MpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgICB9XG5cbiAgICBpZiAob2xkRmliZXIgPT09IG51bGwpIHtcbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYW55IG1vcmUgZXhpc3RpbmcgY2hpbGRyZW4gd2UgY2FuIGNob29zZSBhIGZhc3QgcGF0aFxuICAgICAgLy8gc2luY2UgdGhlIHJlc3Qgd2lsbCBhbGwgYmUgaW5zZXJ0aW9ucy5cbiAgICAgIGZvciAoOyAhc3RlcC5kb25lOyBuZXdJZHgrKywgc3RlcCA9IG5ld0NoaWxkcmVuLm5leHQoKSkge1xuICAgICAgICB2YXIgX25ld0ZpYmVyMyA9IGNyZWF0ZUNoaWxkKHJldHVybkZpYmVyLCBzdGVwLnZhbHVlLCBsYW5lcyk7XG5cbiAgICAgICAgaWYgKF9uZXdGaWJlcjMgPT09IG51bGwpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQoX25ld0ZpYmVyMywgbGFzdFBsYWNlZEluZGV4LCBuZXdJZHgpO1xuXG4gICAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gVE9ETzogTW92ZSBvdXQgb2YgdGhlIGxvb3AuIFRoaXMgb25seSBoYXBwZW5zIGZvciB0aGUgZmlyc3QgcnVuLlxuICAgICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBfbmV3RmliZXIzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IF9uZXdGaWJlcjM7XG4gICAgICAgIH1cblxuICAgICAgICBwcmV2aW91c05ld0ZpYmVyID0gX25ld0ZpYmVyMztcbiAgICAgIH1cblxuICAgICAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAgICAgdmFyIF9udW1iZXJPZkZvcmtzMyA9IG5ld0lkeDtcbiAgICAgICAgcHVzaFRyZWVGb3JrKHJldHVybkZpYmVyLCBfbnVtYmVyT2ZGb3JrczMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgICB9IC8vIEFkZCBhbGwgY2hpbGRyZW4gdG8gYSBrZXkgbWFwIGZvciBxdWljayBsb29rdXBzLlxuXG5cbiAgICB2YXIgZXhpc3RpbmdDaGlsZHJlbiA9IG1hcFJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBvbGRGaWJlcik7IC8vIEtlZXAgc2Nhbm5pbmcgYW5kIHVzZSB0aGUgbWFwIHRvIHJlc3RvcmUgZGVsZXRlZCBpdGVtcyBhcyBtb3Zlcy5cblxuICAgIGZvciAoOyAhc3RlcC5kb25lOyBuZXdJZHgrKywgc3RlcCA9IG5ld0NoaWxkcmVuLm5leHQoKSkge1xuICAgICAgdmFyIF9uZXdGaWJlcjQgPSB1cGRhdGVGcm9tTWFwKGV4aXN0aW5nQ2hpbGRyZW4sIHJldHVybkZpYmVyLCBuZXdJZHgsIHN0ZXAudmFsdWUsIGxhbmVzKTtcblxuICAgICAgaWYgKF9uZXdGaWJlcjQgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgICAgICBpZiAoX25ld0ZpYmVyNC5hbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFRoZSBuZXcgZmliZXIgaXMgYSB3b3JrIGluIHByb2dyZXNzLCBidXQgaWYgdGhlcmUgZXhpc3RzIGFcbiAgICAgICAgICAgIC8vIGN1cnJlbnQsIHRoYXQgbWVhbnMgdGhhdCB3ZSByZXVzZWQgdGhlIGZpYmVyLiBXZSBuZWVkIHRvIGRlbGV0ZVxuICAgICAgICAgICAgLy8gaXQgZnJvbSB0aGUgY2hpbGQgbGlzdCBzbyB0aGF0IHdlIGRvbid0IGFkZCBpdCB0byB0aGUgZGVsZXRpb25cbiAgICAgICAgICAgIC8vIGxpc3QuXG4gICAgICAgICAgICBleGlzdGluZ0NoaWxkcmVuLmRlbGV0ZShfbmV3RmliZXI0LmtleSA9PT0gbnVsbCA/IG5ld0lkeCA6IF9uZXdGaWJlcjQua2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKF9uZXdGaWJlcjQsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBfbmV3RmliZXI0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IF9uZXdGaWJlcjQ7XG4gICAgICAgIH1cblxuICAgICAgICBwcmV2aW91c05ld0ZpYmVyID0gX25ld0ZpYmVyNDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgLy8gQW55IGV4aXN0aW5nIGNoaWxkcmVuIHRoYXQgd2VyZW4ndCBjb25zdW1lZCBhYm92ZSB3ZXJlIGRlbGV0ZWQuIFdlIG5lZWRcbiAgICAgIC8vIHRvIGFkZCB0aGVtIHRvIHRoZSBkZWxldGlvbiBsaXN0LlxuICAgICAgZXhpc3RpbmdDaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICByZXR1cm4gZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgICB2YXIgX251bWJlck9mRm9ya3M0ID0gbmV3SWR4O1xuICAgICAgcHVzaFRyZWVGb3JrKHJldHVybkZpYmVyLCBfbnVtYmVyT2ZGb3JrczQpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVjb25jaWxlU2luZ2xlVGV4dE5vZGUocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCB0ZXh0Q29udGVudCwgbGFuZXMpIHtcbiAgICAvLyBUaGVyZSdzIG5vIG5lZWQgdG8gY2hlY2sgZm9yIGtleXMgb24gdGV4dCBub2RlcyBzaW5jZSB3ZSBkb24ndCBoYXZlIGFcbiAgICAvLyB3YXkgdG8gZGVmaW5lIHRoZW0uXG4gICAgaWYgKGN1cnJlbnRGaXJzdENoaWxkICE9PSBudWxsICYmIGN1cnJlbnRGaXJzdENoaWxkLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAgIC8vIFdlIGFscmVhZHkgaGF2ZSBhbiBleGlzdGluZyBub2RlIHNvIGxldCdzIGp1c3QgdXBkYXRlIGl0IGFuZCBkZWxldGVcbiAgICAgIC8vIHRoZSByZXN0LlxuICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLnNpYmxpbmcpO1xuICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY3VycmVudEZpcnN0Q2hpbGQsIHRleHRDb250ZW50KTtcbiAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgIH0gLy8gVGhlIGV4aXN0aW5nIGZpcnN0IGNoaWxkIGlzIG5vdCBhIHRleHQgbm9kZSBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSBvbmVcbiAgICAvLyBhbmQgZGVsZXRlIHRoZSBleGlzdGluZyBvbmVzLlxuXG5cbiAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpO1xuICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tVGV4dCh0ZXh0Q29udGVudCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgcmV0dXJuIGNyZWF0ZWQ7XG4gIH1cblxuICBmdW5jdGlvbiByZWNvbmNpbGVTaW5nbGVFbGVtZW50KHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgZWxlbWVudCwgbGFuZXMpIHtcbiAgICB2YXIga2V5ID0gZWxlbWVudC5rZXk7XG4gICAgdmFyIGNoaWxkID0gY3VycmVudEZpcnN0Q2hpbGQ7XG5cbiAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRPRE86IElmIGtleSA9PT0gbnVsbCBhbmQgY2hpbGQua2V5ID09PSBudWxsLCB0aGVuIHRoaXMgb25seSBhcHBsaWVzIHRvXG4gICAgICAvLyB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdC5cbiAgICAgIGlmIChjaGlsZC5rZXkgPT09IGtleSkge1xuICAgICAgICB2YXIgZWxlbWVudFR5cGUgPSBlbGVtZW50LnR5cGU7XG5cbiAgICAgICAgaWYgKGVsZW1lbnRUeXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFKSB7XG4gICAgICAgICAgaWYgKGNoaWxkLnRhZyA9PT0gRnJhZ21lbnQpIHtcbiAgICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZC5zaWJsaW5nKTtcbiAgICAgICAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGNoaWxkLCBlbGVtZW50LnByb3BzLmNoaWxkcmVuKTtcbiAgICAgICAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGV4aXN0aW5nLl9kZWJ1Z1NvdXJjZSA9IGVsZW1lbnQuX3NvdXJjZTtcbiAgICAgICAgICAgICAgZXhpc3RpbmcuX2RlYnVnT3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoY2hpbGQuZWxlbWVudFR5cGUgPT09IGVsZW1lbnRUeXBlIHx8ICggLy8gS2VlcCB0aGlzIGNoZWNrIGlubGluZSBzbyBpdCBvbmx5IHJ1bnMgb24gdGhlIGZhbHNlIHBhdGg6XG4gICAgICAgICAgIGlzQ29tcGF0aWJsZUZhbWlseUZvckhvdFJlbG9hZGluZyhjaGlsZCwgZWxlbWVudCkgKSB8fCAvLyBMYXp5IHR5cGVzIHNob3VsZCByZWNvbmNpbGUgdGhlaXIgcmVzb2x2ZWQgdHlwZS5cbiAgICAgICAgICAvLyBXZSBuZWVkIHRvIGRvIHRoaXMgYWZ0ZXIgdGhlIEhvdCBSZWxvYWRpbmcgY2hlY2sgYWJvdmUsXG4gICAgICAgICAgLy8gYmVjYXVzZSBob3QgcmVsb2FkaW5nIGhhcyBkaWZmZXJlbnQgc2VtYW50aWNzIHRoYW4gcHJvZCBiZWNhdXNlXG4gICAgICAgICAgLy8gaXQgZG9lc24ndCByZXN1c3BlbmQuIFNvIHdlIGNhbid0IGxldCB0aGUgY2FsbCBiZWxvdyBzdXNwZW5kLlxuICAgICAgICAgIHR5cGVvZiBlbGVtZW50VHlwZSA9PT0gJ29iamVjdCcgJiYgZWxlbWVudFR5cGUgIT09IG51bGwgJiYgZWxlbWVudFR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSAmJiByZXNvbHZlTGF6eShlbGVtZW50VHlwZSkgPT09IGNoaWxkLnR5cGUpIHtcbiAgICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZC5zaWJsaW5nKTtcblxuICAgICAgICAgICAgdmFyIF9leGlzdGluZyA9IHVzZUZpYmVyKGNoaWxkLCBlbGVtZW50LnByb3BzKTtcblxuICAgICAgICAgICAgX2V4aXN0aW5nLnJlZiA9IGNvZXJjZVJlZihyZXR1cm5GaWJlciwgY2hpbGQsIGVsZW1lbnQpO1xuICAgICAgICAgICAgX2V4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIF9leGlzdGluZy5fZGVidWdTb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7XG4gICAgICAgICAgICAgIF9leGlzdGluZy5fZGVidWdPd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gX2V4aXN0aW5nO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBEaWRuJ3QgbWF0Y2guXG5cblxuICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudC50eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFKSB7XG4gICAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGVsZW1lbnQucHJvcHMuY2hpbGRyZW4sIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzLCBlbGVtZW50LmtleSk7XG4gICAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBfY3JlYXRlZDQgPSBjcmVhdGVGaWJlckZyb21FbGVtZW50KGVsZW1lbnQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcblxuICAgICAgX2NyZWF0ZWQ0LnJlZiA9IGNvZXJjZVJlZihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIGVsZW1lbnQpO1xuICAgICAgX2NyZWF0ZWQ0LnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIF9jcmVhdGVkNDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWNvbmNpbGVTaW5nbGVQb3J0YWwocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBwb3J0YWwsIGxhbmVzKSB7XG4gICAgdmFyIGtleSA9IHBvcnRhbC5rZXk7XG4gICAgdmFyIGNoaWxkID0gY3VycmVudEZpcnN0Q2hpbGQ7XG5cbiAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRPRE86IElmIGtleSA9PT0gbnVsbCBhbmQgY2hpbGQua2V5ID09PSBudWxsLCB0aGVuIHRoaXMgb25seSBhcHBsaWVzIHRvXG4gICAgICAvLyB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdC5cbiAgICAgIGlmIChjaGlsZC5rZXkgPT09IGtleSkge1xuICAgICAgICBpZiAoY2hpbGQudGFnID09PSBIb3N0UG9ydGFsICYmIGNoaWxkLnN0YXRlTm9kZS5jb250YWluZXJJbmZvID09PSBwb3J0YWwuY29udGFpbmVySW5mbyAmJiBjaGlsZC5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb24gPT09IHBvcnRhbC5pbXBsZW1lbnRhdGlvbikge1xuICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZC5zaWJsaW5nKTtcbiAgICAgICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjaGlsZCwgcG9ydGFsLmNoaWxkcmVuIHx8IFtdKTtcbiAgICAgICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgIH1cblxuICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICAgIH1cblxuICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tUG9ydGFsKHBvcnRhbCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgcmV0dXJuIGNyZWF0ZWQ7XG4gIH0gLy8gVGhpcyBBUEkgd2lsbCB0YWcgdGhlIGNoaWxkcmVuIHdpdGggdGhlIHNpZGUtZWZmZWN0IG9mIHRoZSByZWNvbmNpbGlhdGlvblxuICAvLyBpdHNlbGYuIFRoZXkgd2lsbCBiZSBhZGRlZCB0byB0aGUgc2lkZS1lZmZlY3QgbGlzdCBhcyB3ZSBwYXNzIHRocm91Z2ggdGhlXG4gIC8vIGNoaWxkcmVuIGFuZCB0aGUgcGFyZW50LlxuXG5cbiAgZnVuY3Rpb24gcmVjb25jaWxlQ2hpbGRGaWJlcnMocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZCwgbGFuZXMpIHtcbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG5vdCByZWN1cnNpdmUuXG4gICAgLy8gSWYgdGhlIHRvcCBsZXZlbCBpdGVtIGlzIGFuIGFycmF5LCB3ZSB0cmVhdCBpdCBhcyBhIHNldCBvZiBjaGlsZHJlbixcbiAgICAvLyBub3QgYXMgYSBmcmFnbWVudC4gTmVzdGVkIGFycmF5cyBvbiB0aGUgb3RoZXIgaGFuZCB3aWxsIGJlIHRyZWF0ZWQgYXNcbiAgICAvLyBmcmFnbWVudCBub2Rlcy4gUmVjdXJzaW9uIGhhcHBlbnMgYXQgdGhlIG5vcm1hbCBmbG93LlxuICAgIC8vIEhhbmRsZSB0b3AgbGV2ZWwgdW5rZXllZCBmcmFnbWVudHMgYXMgaWYgdGhleSB3ZXJlIGFycmF5cy5cbiAgICAvLyBUaGlzIGxlYWRzIHRvIGFuIGFtYmlndWl0eSBiZXR3ZWVuIDw+e1suLi5dfTwvPiBhbmQgPD4uLi48Lz4uXG4gICAgLy8gV2UgdHJlYXQgdGhlIGFtYmlndW91cyBjYXNlcyBhYm92ZSB0aGUgc2FtZS5cbiAgICB2YXIgaXNVbmtleWVkVG9wTGV2ZWxGcmFnbWVudCA9IHR5cGVvZiBuZXdDaGlsZCA9PT0gJ29iamVjdCcgJiYgbmV3Q2hpbGQgIT09IG51bGwgJiYgbmV3Q2hpbGQudHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSAmJiBuZXdDaGlsZC5rZXkgPT09IG51bGw7XG5cbiAgICBpZiAoaXNVbmtleWVkVG9wTGV2ZWxGcmFnbWVudCkge1xuICAgICAgbmV3Q2hpbGQgPSBuZXdDaGlsZC5wcm9wcy5jaGlsZHJlbjtcbiAgICB9IC8vIEhhbmRsZSBvYmplY3QgdHlwZXNcblxuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ29iamVjdCcgJiYgbmV3Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIHBsYWNlU2luZ2xlQ2hpbGQocmVjb25jaWxlU2luZ2xlRWxlbWVudChyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkLCBsYW5lcykpO1xuXG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIHBsYWNlU2luZ2xlQ2hpbGQocmVjb25jaWxlU2luZ2xlUG9ydGFsKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKSk7XG5cbiAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBuZXdDaGlsZC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IG5ld0NoaWxkLl9pbml0OyAvLyBUT0RPOiBUaGlzIGZ1bmN0aW9uIGlzIHN1cHBvc2VkIHRvIGJlIG5vbi1yZWN1cnNpdmUuXG5cbiAgICAgICAgICByZXR1cm4gcmVjb25jaWxlQ2hpbGRGaWJlcnMocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBpbml0KHBheWxvYWQpLCBsYW5lcyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0FycmF5KG5ld0NoaWxkKSkge1xuICAgICAgICByZXR1cm4gcmVjb25jaWxlQ2hpbGRyZW5BcnJheShyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChnZXRJdGVyYXRvckZuKG5ld0NoaWxkKSkge1xuICAgICAgICByZXR1cm4gcmVjb25jaWxlQ2hpbGRyZW5JdGVyYXRvcihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgICB9XG5cbiAgICAgIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdzdHJpbmcnICYmIG5ld0NoaWxkICE9PSAnJyB8fCB0eXBlb2YgbmV3Q2hpbGQgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gcGxhY2VTaW5nbGVDaGlsZChyZWNvbmNpbGVTaW5nbGVUZXh0Tm9kZShyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsICcnICsgbmV3Q2hpbGQsIGxhbmVzKSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3YXJuT25GdW5jdGlvblR5cGUocmV0dXJuRmliZXIpO1xuICAgICAgfVxuICAgIH0gLy8gUmVtYWluaW5nIGNhc2VzIGFyZSBhbGwgdHJlYXRlZCBhcyBlbXB0eS5cblxuXG4gICAgcmV0dXJuIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCk7XG4gIH1cblxuICByZXR1cm4gcmVjb25jaWxlQ2hpbGRGaWJlcnM7XG59XG5cbnZhciByZWNvbmNpbGVDaGlsZEZpYmVycyA9IENoaWxkUmVjb25jaWxlcih0cnVlKTtcbnZhciBtb3VudENoaWxkRmliZXJzID0gQ2hpbGRSZWNvbmNpbGVyKGZhbHNlKTtcbmZ1bmN0aW9uIGNsb25lQ2hpbGRGaWJlcnMoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgd29ya0luUHJvZ3Jlc3MuY2hpbGQgIT09IGN1cnJlbnQuY2hpbGQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jlc3VtaW5nIHdvcmsgbm90IHlldCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9PT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBjdXJyZW50Q2hpbGQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgdmFyIG5ld0NoaWxkID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudENoaWxkLCBjdXJyZW50Q2hpbGQucGVuZGluZ1Byb3BzKTtcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBuZXdDaGlsZDtcbiAgbmV3Q2hpbGQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG5cbiAgd2hpbGUgKGN1cnJlbnRDaGlsZC5zaWJsaW5nICE9PSBudWxsKSB7XG4gICAgY3VycmVudENoaWxkID0gY3VycmVudENoaWxkLnNpYmxpbmc7XG4gICAgbmV3Q2hpbGQgPSBuZXdDaGlsZC5zaWJsaW5nID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudENoaWxkLCBjdXJyZW50Q2hpbGQucGVuZGluZ1Byb3BzKTtcbiAgICBuZXdDaGlsZC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgfVxuXG4gIG5ld0NoaWxkLnNpYmxpbmcgPSBudWxsO1xufSAvLyBSZXNldCBhIHdvcmtJblByb2dyZXNzIGNoaWxkIHNldCB0byBwcmVwYXJlIGl0IGZvciBhIHNlY29uZCBwYXNzLlxuXG5mdW5jdGlvbiByZXNldENoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBsYW5lcykge1xuICB2YXIgY2hpbGQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICByZXNldFdvcmtJblByb2dyZXNzKGNoaWxkLCBsYW5lcyk7XG4gICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICB9XG59XG5cbnZhciB2YWx1ZUN1cnNvciA9IGNyZWF0ZUN1cnNvcihudWxsKTtcbnZhciByZW5kZXJlclNpZ2lsO1xuXG57XG4gIC8vIFVzZSB0aGlzIHRvIGRldGVjdCBtdWx0aXBsZSByZW5kZXJlcnMgdXNpbmcgdGhlIHNhbWUgY29udGV4dFxuICByZW5kZXJlclNpZ2lsID0ge307XG59XG5cbnZhciBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9IG51bGw7XG52YXIgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gbnVsbDtcbnZhciBsYXN0RnVsbHlPYnNlcnZlZENvbnRleHQgPSBudWxsO1xudmFyIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSBmYWxzZTtcbmZ1bmN0aW9uIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpIHtcbiAgLy8gVGhpcyBpcyBjYWxsZWQgcmlnaHQgYmVmb3JlIFJlYWN0IHlpZWxkcyBleGVjdXRpb24sIHRvIGVuc3VyZSBgcmVhZENvbnRleHRgXG4gIC8vIGNhbm5vdCBiZSBjYWxsZWQgb3V0c2lkZSB0aGUgcmVuZGVyIHBoYXNlLlxuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9IG51bGw7XG4gIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IG51bGw7XG4gIGxhc3RGdWxseU9ic2VydmVkQ29udGV4dCA9IG51bGw7XG5cbiAge1xuICAgIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gZW50ZXJEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpIHtcbiAge1xuICAgIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSB0cnVlO1xuICB9XG59XG5mdW5jdGlvbiBleGl0RGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKSB7XG4gIHtcbiAgICBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIHB1c2hQcm92aWRlcihwcm92aWRlckZpYmVyLCBjb250ZXh0LCBuZXh0VmFsdWUpIHtcbiAge1xuICAgIHB1c2godmFsdWVDdXJzb3IsIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSwgcHJvdmlkZXJGaWJlcik7XG4gICAgY29udGV4dC5fY3VycmVudFZhbHVlID0gbmV4dFZhbHVlO1xuXG4gICAge1xuICAgICAgaWYgKGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciAhPT0gdW5kZWZpbmVkICYmIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciAhPT0gbnVsbCAmJiBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgIT09IHJlbmRlcmVyU2lnaWwpIHtcbiAgICAgICAgZXJyb3IoJ0RldGVjdGVkIG11bHRpcGxlIHJlbmRlcmVycyBjb25jdXJyZW50bHkgcmVuZGVyaW5nIHRoZSAnICsgJ3NhbWUgY29udGV4dCBwcm92aWRlci4gVGhpcyBpcyBjdXJyZW50bHkgdW5zdXBwb3J0ZWQuJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciA9IHJlbmRlcmVyU2lnaWw7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBwb3BQcm92aWRlcihjb250ZXh0LCBwcm92aWRlckZpYmVyKSB7XG4gIHZhciBjdXJyZW50VmFsdWUgPSB2YWx1ZUN1cnNvci5jdXJyZW50O1xuICBwb3AodmFsdWVDdXJzb3IsIHByb3ZpZGVyRmliZXIpO1xuXG4gIHtcbiAgICB7XG4gICAgICBjb250ZXh0Ll9jdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWU7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBzY2hlZHVsZUNvbnRleHRXb3JrT25QYXJlbnRQYXRoKHBhcmVudCwgcmVuZGVyTGFuZXMsIHByb3BhZ2F0aW9uUm9vdCkge1xuICAvLyBVcGRhdGUgdGhlIGNoaWxkIGxhbmVzIG9mIGFsbCB0aGUgYW5jZXN0b3JzLCBpbmNsdWRpbmcgdGhlIGFsdGVybmF0ZXMuXG4gIHZhciBub2RlID0gcGFyZW50O1xuXG4gIHdoaWxlIChub2RlICE9PSBudWxsKSB7XG4gICAgdmFyIGFsdGVybmF0ZSA9IG5vZGUuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKCFpc1N1YnNldE9mTGFuZXMobm9kZS5jaGlsZExhbmVzLCByZW5kZXJMYW5lcykpIHtcbiAgICAgIG5vZGUuY2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMobm9kZS5jaGlsZExhbmVzLCByZW5kZXJMYW5lcyk7XG5cbiAgICAgIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgYWx0ZXJuYXRlLmNoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5jaGlsZExhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChhbHRlcm5hdGUgIT09IG51bGwgJiYgIWlzU3Vic2V0T2ZMYW5lcyhhbHRlcm5hdGUuY2hpbGRMYW5lcywgcmVuZGVyTGFuZXMpKSB7XG4gICAgICBhbHRlcm5hdGUuY2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMoYWx0ZXJuYXRlLmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICB9XG5cbiAgICBpZiAobm9kZSA9PT0gcHJvcGFnYXRpb25Sb290KSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gIH1cblxuICB7XG4gICAgaWYgKG5vZGUgIT09IHByb3BhZ2F0aW9uUm9vdCkge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIHRvIGZpbmQgdGhlIHByb3BhZ2F0aW9uIHJvb3Qgd2hlbiBzY2hlZHVsaW5nIGNvbnRleHQgd29yay4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcHJvcGFnYXRlQ29udGV4dENoYW5nZSh3b3JrSW5Qcm9ncmVzcywgY29udGV4dCwgcmVuZGVyTGFuZXMpIHtcbiAge1xuICAgIHByb3BhZ2F0ZUNvbnRleHRDaGFuZ2VfZWFnZXIod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIHJlbmRlckxhbmVzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcm9wYWdhdGVDb250ZXh0Q2hhbmdlX2VhZ2VyKHdvcmtJblByb2dyZXNzLCBjb250ZXh0LCByZW5kZXJMYW5lcykge1xuXG4gIHZhciBmaWJlciA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuXG4gIGlmIChmaWJlciAhPT0gbnVsbCkge1xuICAgIC8vIFNldCB0aGUgcmV0dXJuIHBvaW50ZXIgb2YgdGhlIGNoaWxkIHRvIHRoZSB3b3JrLWluLXByb2dyZXNzIGZpYmVyLlxuICAgIGZpYmVyLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICB9XG5cbiAgd2hpbGUgKGZpYmVyICE9PSBudWxsKSB7XG4gICAgdmFyIG5leHRGaWJlciA9IHZvaWQgMDsgLy8gVmlzaXQgdGhpcyBmaWJlci5cblxuICAgIHZhciBsaXN0ID0gZmliZXIuZGVwZW5kZW5jaWVzO1xuXG4gICAgaWYgKGxpc3QgIT09IG51bGwpIHtcbiAgICAgIG5leHRGaWJlciA9IGZpYmVyLmNoaWxkO1xuICAgICAgdmFyIGRlcGVuZGVuY3kgPSBsaXN0LmZpcnN0Q29udGV4dDtcblxuICAgICAgd2hpbGUgKGRlcGVuZGVuY3kgIT09IG51bGwpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNvbnRleHQgbWF0Y2hlcy5cbiAgICAgICAgaWYgKGRlcGVuZGVuY3kuY29udGV4dCA9PT0gY29udGV4dCkge1xuICAgICAgICAgIC8vIE1hdGNoISBTY2hlZHVsZSBhbiB1cGRhdGUgb24gdGhpcyBmaWJlci5cbiAgICAgICAgICBpZiAoZmliZXIudGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgICAgICAgLy8gU2NoZWR1bGUgYSBmb3JjZSB1cGRhdGUgb24gdGhlIHdvcmstaW4tcHJvZ3Jlc3MuXG4gICAgICAgICAgICB2YXIgbGFuZSA9IHBpY2tBcmJpdHJhcnlMYW5lKHJlbmRlckxhbmVzKTtcbiAgICAgICAgICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoTm9UaW1lc3RhbXAsIGxhbmUpO1xuICAgICAgICAgICAgdXBkYXRlLnRhZyA9IEZvcmNlVXBkYXRlOyAvLyBUT0RPOiBCZWNhdXNlIHdlIGRvbid0IGhhdmUgYSB3b3JrLWluLXByb2dyZXNzLCB0aGlzIHdpbGwgYWRkIHRoZVxuICAgICAgICAgICAgLy8gdXBkYXRlIHRvIHRoZSBjdXJyZW50IGZpYmVyLCB0b28sIHdoaWNoIG1lYW5zIGl0IHdpbGwgcGVyc2lzdCBldmVuIGlmXG4gICAgICAgICAgICAvLyB0aGlzIHJlbmRlciBpcyB0aHJvd24gYXdheS4gU2luY2UgaXQncyBhIHJhY2UgY29uZGl0aW9uLCBub3Qgc3VyZSBpdCdzXG4gICAgICAgICAgICAvLyB3b3J0aCBmaXhpbmcuXG4gICAgICAgICAgICAvLyBJbmxpbmVkIGBlbnF1ZXVlVXBkYXRlYCB0byByZW1vdmUgaW50ZXJsZWF2ZWQgdXBkYXRlIGNoZWNrXG5cbiAgICAgICAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IGZpYmVyLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgICAgICBpZiAodXBkYXRlUXVldWUgPT09IG51bGwpIDsgZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBzaGFyZWRRdWV1ZSA9IHVwZGF0ZVF1ZXVlLnNoYXJlZDtcbiAgICAgICAgICAgICAgdmFyIHBlbmRpbmcgPSBzaGFyZWRRdWV1ZS5wZW5kaW5nO1xuXG4gICAgICAgICAgICAgIGlmIChwZW5kaW5nID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LlxuICAgICAgICAgICAgICAgIHVwZGF0ZS5uZXh0ID0gdXBkYXRlO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHVwZGF0ZS5uZXh0ID0gcGVuZGluZy5uZXh0O1xuICAgICAgICAgICAgICAgIHBlbmRpbmcubmV4dCA9IHVwZGF0ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHNoYXJlZFF1ZXVlLnBlbmRpbmcgPSB1cGRhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZmliZXIubGFuZXMgPSBtZXJnZUxhbmVzKGZpYmVyLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICAgICAgICAgIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGFsdGVybmF0ZS5sYW5lcyA9IG1lcmdlTGFuZXMoYWx0ZXJuYXRlLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2NoZWR1bGVDb250ZXh0V29ya09uUGFyZW50UGF0aChmaWJlci5yZXR1cm4sIHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcyk7IC8vIE1hcmsgdGhlIHVwZGF0ZWQgbGFuZXMgb24gdGhlIGxpc3QsIHRvby5cblxuICAgICAgICAgIGxpc3QubGFuZXMgPSBtZXJnZUxhbmVzKGxpc3QubGFuZXMsIHJlbmRlckxhbmVzKTsgLy8gU2luY2Ugd2UgYWxyZWFkeSBmb3VuZCBhIG1hdGNoLCB3ZSBjYW4gc3RvcCB0cmF2ZXJzaW5nIHRoZVxuICAgICAgICAgIC8vIGRlcGVuZGVuY3kgbGlzdC5cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVwZW5kZW5jeSA9IGRlcGVuZGVuY3kubmV4dDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZpYmVyLnRhZyA9PT0gQ29udGV4dFByb3ZpZGVyKSB7XG4gICAgICAvLyBEb24ndCBzY2FuIGRlZXBlciBpZiB0aGlzIGlzIGEgbWF0Y2hpbmcgcHJvdmlkZXJcbiAgICAgIG5leHRGaWJlciA9IGZpYmVyLnR5cGUgPT09IHdvcmtJblByb2dyZXNzLnR5cGUgPyBudWxsIDogZmliZXIuY2hpbGQ7XG4gICAgfSBlbHNlIGlmIChmaWJlci50YWcgPT09IERlaHlkcmF0ZWRGcmFnbWVudCkge1xuICAgICAgLy8gSWYgYSBkZWh5ZHJhdGVkIHN1c3BlbnNlIGJvdW5kYXJ5IGlzIGluIHRoaXMgc3VidHJlZSwgd2UgZG9uJ3Qga25vd1xuICAgICAgLy8gaWYgaXQgd2lsbCBoYXZlIGFueSBjb250ZXh0IGNvbnN1bWVycyBpbiBpdC4gVGhlIGJlc3Qgd2UgY2FuIGRvIGlzXG4gICAgICAvLyBtYXJrIGl0IGFzIGhhdmluZyB1cGRhdGVzLlxuICAgICAgdmFyIHBhcmVudFN1c3BlbnNlID0gZmliZXIucmV0dXJuO1xuXG4gICAgICBpZiAocGFyZW50U3VzcGVuc2UgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXZSBqdXN0IGNhbWUgZnJvbSBhIHBhcmVudCBzbyB3ZSBtdXN0IGhhdmUgaGFkIGEgcGFyZW50LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICAgICAgfVxuXG4gICAgICBwYXJlbnRTdXNwZW5zZS5sYW5lcyA9IG1lcmdlTGFuZXMocGFyZW50U3VzcGVuc2UubGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICAgIHZhciBfYWx0ZXJuYXRlID0gcGFyZW50U3VzcGVuc2UuYWx0ZXJuYXRlO1xuXG4gICAgICBpZiAoX2FsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICBfYWx0ZXJuYXRlLmxhbmVzID0gbWVyZ2VMYW5lcyhfYWx0ZXJuYXRlLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9IC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBwYXNzaW5nIHRoaXMgZmliZXIgYXMgdGhlIHBhcmVudFxuICAgICAgLy8gYmVjYXVzZSB3ZSB3YW50IHRvIHNjaGVkdWxlIHRoaXMgZmliZXIgYXMgaGF2aW5nIHdvcmtcbiAgICAgIC8vIG9uIGl0cyBjaGlsZHJlbi4gV2UnbGwgdXNlIHRoZSBjaGlsZExhbmVzIG9uXG4gICAgICAvLyB0aGlzIGZpYmVyIHRvIGluZGljYXRlIHRoYXQgYSBjb250ZXh0IGhhcyBjaGFuZ2VkLlxuXG5cbiAgICAgIHNjaGVkdWxlQ29udGV4dFdvcmtPblBhcmVudFBhdGgocGFyZW50U3VzcGVuc2UsIHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBuZXh0RmliZXIgPSBmaWJlci5zaWJsaW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUcmF2ZXJzZSBkb3duLlxuICAgICAgbmV4dEZpYmVyID0gZmliZXIuY2hpbGQ7XG4gICAgfVxuXG4gICAgaWYgKG5leHRGaWJlciAhPT0gbnVsbCkge1xuICAgICAgLy8gU2V0IHRoZSByZXR1cm4gcG9pbnRlciBvZiB0aGUgY2hpbGQgdG8gdGhlIHdvcmstaW4tcHJvZ3Jlc3MgZmliZXIuXG4gICAgICBuZXh0RmliZXIucmV0dXJuID0gZmliZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIGNoaWxkLiBUcmF2ZXJzZSB0byBuZXh0IHNpYmxpbmcuXG4gICAgICBuZXh0RmliZXIgPSBmaWJlcjtcblxuICAgICAgd2hpbGUgKG5leHRGaWJlciAhPT0gbnVsbCkge1xuICAgICAgICBpZiAobmV4dEZpYmVyID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICAgIC8vIFdlJ3JlIGJhY2sgdG8gdGhlIHJvb3Qgb2YgdGhpcyBzdWJ0cmVlLiBFeGl0LlxuICAgICAgICAgIG5leHRGaWJlciA9IG51bGw7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2libGluZyA9IG5leHRGaWJlci5zaWJsaW5nO1xuXG4gICAgICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gU2V0IHRoZSByZXR1cm4gcG9pbnRlciBvZiB0aGUgc2libGluZyB0byB0aGUgd29yay1pbi1wcm9ncmVzcyBmaWJlci5cbiAgICAgICAgICBzaWJsaW5nLnJldHVybiA9IG5leHRGaWJlci5yZXR1cm47XG4gICAgICAgICAgbmV4dEZpYmVyID0gc2libGluZztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSAvLyBObyBtb3JlIHNpYmxpbmdzLiBUcmF2ZXJzZSB1cC5cblxuXG4gICAgICAgIG5leHRGaWJlciA9IG5leHRGaWJlci5yZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmliZXIgPSBuZXh0RmliZXI7XG4gIH1cbn1cbmZ1bmN0aW9uIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9IHdvcmtJblByb2dyZXNzO1xuICBsYXN0Q29udGV4dERlcGVuZGVuY3kgPSBudWxsO1xuICBsYXN0RnVsbHlPYnNlcnZlZENvbnRleHQgPSBudWxsO1xuICB2YXIgZGVwZW5kZW5jaWVzID0gd29ya0luUHJvZ3Jlc3MuZGVwZW5kZW5jaWVzO1xuXG4gIGlmIChkZXBlbmRlbmNpZXMgIT09IG51bGwpIHtcbiAgICB7XG4gICAgICB2YXIgZmlyc3RDb250ZXh0ID0gZGVwZW5kZW5jaWVzLmZpcnN0Q29udGV4dDtcblxuICAgICAgaWYgKGZpcnN0Q29udGV4dCAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoaW5jbHVkZXNTb21lTGFuZShkZXBlbmRlbmNpZXMubGFuZXMsIHJlbmRlckxhbmVzKSkge1xuICAgICAgICAgIC8vIENvbnRleHQgbGlzdCBoYXMgYSBwZW5kaW5nIHVwZGF0ZS4gTWFyayB0aGF0IHRoaXMgZmliZXIgcGVyZm9ybWVkIHdvcmsuXG4gICAgICAgICAgbWFya1dvcmtJblByb2dyZXNzUmVjZWl2ZWRVcGRhdGUoKTtcbiAgICAgICAgfSAvLyBSZXNldCB0aGUgd29yay1pbi1wcm9ncmVzcyBsaXN0XG5cblxuICAgICAgICBkZXBlbmRlbmNpZXMuZmlyc3RDb250ZXh0ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHJlYWRDb250ZXh0KGNvbnRleHQpIHtcbiAge1xuICAgIC8vIFRoaXMgd2FybmluZyB3b3VsZCBmaXJlIGlmIHlvdSByZWFkIGNvbnRleHQgaW5zaWRlIGEgSG9vayBsaWtlIHVzZU1lbW8uXG4gICAgLy8gVW5saWtlIHRoZSBjbGFzcyBjaGVjayBiZWxvdywgaXQncyBub3QgZW5mb3JjZWQgaW4gcHJvZHVjdGlvbiBmb3IgcGVyZi5cbiAgICBpZiAoaXNEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVikge1xuICAgICAgZXJyb3IoJ0NvbnRleHQgY2FuIG9ubHkgYmUgcmVhZCB3aGlsZSBSZWFjdCBpcyByZW5kZXJpbmcuICcgKyAnSW4gY2xhc3NlcywgeW91IGNhbiByZWFkIGl0IGluIHRoZSByZW5kZXIgbWV0aG9kIG9yIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gJyArICdJbiBmdW5jdGlvbiBjb21wb25lbnRzLCB5b3UgY2FuIHJlYWQgaXQgZGlyZWN0bHkgaW4gdGhlIGZ1bmN0aW9uIGJvZHksIGJ1dCBub3QgJyArICdpbnNpZGUgSG9va3MgbGlrZSB1c2VSZWR1Y2VyKCkgb3IgdXNlTWVtbygpLicpO1xuICAgIH1cbiAgfVxuXG4gIHZhciB2YWx1ZSA9ICBjb250ZXh0Ll9jdXJyZW50VmFsdWUgO1xuXG4gIGlmIChsYXN0RnVsbHlPYnNlcnZlZENvbnRleHQgPT09IGNvbnRleHQpIDsgZWxzZSB7XG4gICAgdmFyIGNvbnRleHRJdGVtID0ge1xuICAgICAgY29udGV4dDogY29udGV4dCxcbiAgICAgIG1lbW9pemVkVmFsdWU6IHZhbHVlLFxuICAgICAgbmV4dDogbnVsbFxuICAgIH07XG5cbiAgICBpZiAobGFzdENvbnRleHREZXBlbmRlbmN5ID09PSBudWxsKSB7XG4gICAgICBpZiAoY3VycmVudGx5UmVuZGVyaW5nRmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb250ZXh0IGNhbiBvbmx5IGJlIHJlYWQgd2hpbGUgUmVhY3QgaXMgcmVuZGVyaW5nLiAnICsgJ0luIGNsYXNzZXMsIHlvdSBjYW4gcmVhZCBpdCBpbiB0aGUgcmVuZGVyIG1ldGhvZCBvciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuICcgKyAnSW4gZnVuY3Rpb24gY29tcG9uZW50cywgeW91IGNhbiByZWFkIGl0IGRpcmVjdGx5IGluIHRoZSBmdW5jdGlvbiBib2R5LCBidXQgbm90ICcgKyAnaW5zaWRlIEhvb2tzIGxpa2UgdXNlUmVkdWNlcigpIG9yIHVzZU1lbW8oKS4nKTtcbiAgICAgIH0gLy8gVGhpcyBpcyB0aGUgZmlyc3QgZGVwZW5kZW5jeSBmb3IgdGhpcyBjb21wb25lbnQuIENyZWF0ZSBhIG5ldyBsaXN0LlxuXG5cbiAgICAgIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IGNvbnRleHRJdGVtO1xuICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIuZGVwZW5kZW5jaWVzID0ge1xuICAgICAgICBsYW5lczogTm9MYW5lcyxcbiAgICAgICAgZmlyc3RDb250ZXh0OiBjb250ZXh0SXRlbVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQXBwZW5kIGEgbmV3IGNvbnRleHQgaXRlbS5cbiAgICAgIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IGxhc3RDb250ZXh0RGVwZW5kZW5jeS5uZXh0ID0gY29udGV4dEl0ZW07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vLyByZW5kZXIuIFdoZW4gdGhpcyByZW5kZXIgZXhpdHMsIGVpdGhlciBiZWNhdXNlIGl0IGZpbmlzaGVzIG9yIGJlY2F1c2UgaXQgaXNcbi8vIGludGVycnVwdGVkLCB0aGUgaW50ZXJsZWF2ZWQgdXBkYXRlcyB3aWxsIGJlIHRyYW5zZmVycmVkIG9udG8gdGhlIG1haW4gcGFydFxuLy8gb2YgdGhlIHF1ZXVlLlxuXG52YXIgY29uY3VycmVudFF1ZXVlcyA9IG51bGw7XG5mdW5jdGlvbiBwdXNoQ29uY3VycmVudFVwZGF0ZVF1ZXVlKHF1ZXVlKSB7XG4gIGlmIChjb25jdXJyZW50UXVldWVzID09PSBudWxsKSB7XG4gICAgY29uY3VycmVudFF1ZXVlcyA9IFtxdWV1ZV07XG4gIH0gZWxzZSB7XG4gICAgY29uY3VycmVudFF1ZXVlcy5wdXNoKHF1ZXVlKTtcbiAgfVxufVxuZnVuY3Rpb24gZmluaXNoUXVldWVpbmdDb25jdXJyZW50VXBkYXRlcygpIHtcbiAgLy8gVHJhbnNmZXIgdGhlIGludGVybGVhdmVkIHVwZGF0ZXMgb250byB0aGUgbWFpbiBxdWV1ZS4gRWFjaCBxdWV1ZSBoYXMgYVxuICAvLyBgcGVuZGluZ2AgZmllbGQgYW5kIGFuIGBpbnRlcmxlYXZlZGAgZmllbGQuIFdoZW4gdGhleSBhcmUgbm90IG51bGwsIHRoZXlcbiAgLy8gcG9pbnQgdG8gdGhlIGxhc3Qgbm9kZSBpbiBhIGNpcmN1bGFyIGxpbmtlZCBsaXN0LiBXZSBuZWVkIHRvIGFwcGVuZCB0aGVcbiAgLy8gaW50ZXJsZWF2ZWQgbGlzdCB0byB0aGUgZW5kIG9mIHRoZSBwZW5kaW5nIGxpc3QgYnkgam9pbmluZyB0aGVtIGludG8gYVxuICAvLyBzaW5nbGUsIGNpcmN1bGFyIGxpc3QuXG4gIGlmIChjb25jdXJyZW50UXVldWVzICE9PSBudWxsKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25jdXJyZW50UXVldWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcXVldWUgPSBjb25jdXJyZW50UXVldWVzW2ldO1xuICAgICAgdmFyIGxhc3RJbnRlcmxlYXZlZFVwZGF0ZSA9IHF1ZXVlLmludGVybGVhdmVkO1xuXG4gICAgICBpZiAobGFzdEludGVybGVhdmVkVXBkYXRlICE9PSBudWxsKSB7XG4gICAgICAgIHF1ZXVlLmludGVybGVhdmVkID0gbnVsbDtcbiAgICAgICAgdmFyIGZpcnN0SW50ZXJsZWF2ZWRVcGRhdGUgPSBsYXN0SW50ZXJsZWF2ZWRVcGRhdGUubmV4dDtcbiAgICAgICAgdmFyIGxhc3RQZW5kaW5nVXBkYXRlID0gcXVldWUucGVuZGluZztcblxuICAgICAgICBpZiAobGFzdFBlbmRpbmdVcGRhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgZmlyc3RQZW5kaW5nVXBkYXRlID0gbGFzdFBlbmRpbmdVcGRhdGUubmV4dDtcbiAgICAgICAgICBsYXN0UGVuZGluZ1VwZGF0ZS5uZXh0ID0gZmlyc3RJbnRlcmxlYXZlZFVwZGF0ZTtcbiAgICAgICAgICBsYXN0SW50ZXJsZWF2ZWRVcGRhdGUubmV4dCA9IGZpcnN0UGVuZGluZ1VwZGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHF1ZXVlLnBlbmRpbmcgPSBsYXN0SW50ZXJsZWF2ZWRVcGRhdGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uY3VycmVudFF1ZXVlcyA9IG51bGw7XG4gIH1cbn1cbmZ1bmN0aW9uIGVucXVldWVDb25jdXJyZW50SG9va1VwZGF0ZShmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSkge1xuICB2YXIgaW50ZXJsZWF2ZWQgPSBxdWV1ZS5pbnRlcmxlYXZlZDtcblxuICBpZiAoaW50ZXJsZWF2ZWQgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUuIENyZWF0ZSBhIGNpcmN1bGFyIGxpc3QuXG4gICAgdXBkYXRlLm5leHQgPSB1cGRhdGU7IC8vIEF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgcmVuZGVyLCB0aGlzIHF1ZXVlJ3MgaW50ZXJsZWF2ZWQgdXBkYXRlcyB3aWxsXG4gICAgLy8gYmUgdHJhbnNmZXJyZWQgdG8gdGhlIHBlbmRpbmcgcXVldWUuXG5cbiAgICBwdXNoQ29uY3VycmVudFVwZGF0ZVF1ZXVlKHF1ZXVlKTtcbiAgfSBlbHNlIHtcbiAgICB1cGRhdGUubmV4dCA9IGludGVybGVhdmVkLm5leHQ7XG4gICAgaW50ZXJsZWF2ZWQubmV4dCA9IHVwZGF0ZTtcbiAgfVxuXG4gIHF1ZXVlLmludGVybGVhdmVkID0gdXBkYXRlO1xuICByZXR1cm4gbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3QoZmliZXIsIGxhbmUpO1xufVxuZnVuY3Rpb24gZW5xdWV1ZUNvbmN1cnJlbnRIb29rVXBkYXRlQW5kRWFnZXJseUJhaWxvdXQoZmliZXIsIHF1ZXVlLCB1cGRhdGUsIGxhbmUpIHtcbiAgdmFyIGludGVybGVhdmVkID0gcXVldWUuaW50ZXJsZWF2ZWQ7XG5cbiAgaWYgKGludGVybGVhdmVkID09PSBudWxsKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LlxuICAgIHVwZGF0ZS5uZXh0ID0gdXBkYXRlOyAvLyBBdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHJlbmRlciwgdGhpcyBxdWV1ZSdzIGludGVybGVhdmVkIHVwZGF0ZXMgd2lsbFxuICAgIC8vIGJlIHRyYW5zZmVycmVkIHRvIHRoZSBwZW5kaW5nIHF1ZXVlLlxuXG4gICAgcHVzaENvbmN1cnJlbnRVcGRhdGVRdWV1ZShxdWV1ZSk7XG4gIH0gZWxzZSB7XG4gICAgdXBkYXRlLm5leHQgPSBpbnRlcmxlYXZlZC5uZXh0O1xuICAgIGludGVybGVhdmVkLm5leHQgPSB1cGRhdGU7XG4gIH1cblxuICBxdWV1ZS5pbnRlcmxlYXZlZCA9IHVwZGF0ZTtcbn1cbmZ1bmN0aW9uIGVucXVldWVDb25jdXJyZW50Q2xhc3NVcGRhdGUoZmliZXIsIHF1ZXVlLCB1cGRhdGUsIGxhbmUpIHtcbiAgdmFyIGludGVybGVhdmVkID0gcXVldWUuaW50ZXJsZWF2ZWQ7XG5cbiAgaWYgKGludGVybGVhdmVkID09PSBudWxsKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LlxuICAgIHVwZGF0ZS5uZXh0ID0gdXBkYXRlOyAvLyBBdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHJlbmRlciwgdGhpcyBxdWV1ZSdzIGludGVybGVhdmVkIHVwZGF0ZXMgd2lsbFxuICAgIC8vIGJlIHRyYW5zZmVycmVkIHRvIHRoZSBwZW5kaW5nIHF1ZXVlLlxuXG4gICAgcHVzaENvbmN1cnJlbnRVcGRhdGVRdWV1ZShxdWV1ZSk7XG4gIH0gZWxzZSB7XG4gICAgdXBkYXRlLm5leHQgPSBpbnRlcmxlYXZlZC5uZXh0O1xuICAgIGludGVybGVhdmVkLm5leHQgPSB1cGRhdGU7XG4gIH1cblxuICBxdWV1ZS5pbnRlcmxlYXZlZCA9IHVwZGF0ZTtcbiAgcmV0dXJuIG1hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290KGZpYmVyLCBsYW5lKTtcbn1cbmZ1bmN0aW9uIGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgbGFuZSkge1xuICByZXR1cm4gbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3QoZmliZXIsIGxhbmUpO1xufSAvLyBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gb3V0c2lkZSB0aGlzIG1vZHVsZSBzaG91bGQgb25seSBiZSBkb25lIGZvciBiYWNrd2FyZHNcbi8vIGNvbXBhdGliaWxpdHkgYW5kIHNob3VsZCBhbHdheXMgYmUgYWNjb21wYW5pZWQgYnkgYSB3YXJuaW5nLlxuXG52YXIgdW5zYWZlX21hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290ID0gbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3Q7XG5cbmZ1bmN0aW9uIG1hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290KHNvdXJjZUZpYmVyLCBsYW5lKSB7XG4gIC8vIFVwZGF0ZSB0aGUgc291cmNlIGZpYmVyJ3MgbGFuZXNcbiAgc291cmNlRmliZXIubGFuZXMgPSBtZXJnZUxhbmVzKHNvdXJjZUZpYmVyLmxhbmVzLCBsYW5lKTtcbiAgdmFyIGFsdGVybmF0ZSA9IHNvdXJjZUZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgYWx0ZXJuYXRlLmxhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUubGFuZXMsIGxhbmUpO1xuICB9XG5cbiAge1xuICAgIGlmIChhbHRlcm5hdGUgPT09IG51bGwgJiYgKHNvdXJjZUZpYmVyLmZsYWdzICYgKFBsYWNlbWVudCB8IEh5ZHJhdGluZykpICE9PSBOb0ZsYWdzKSB7XG4gICAgICB3YXJuQWJvdXRVcGRhdGVPbk5vdFlldE1vdW50ZWRGaWJlckluREVWKHNvdXJjZUZpYmVyKTtcbiAgICB9XG4gIH0gLy8gV2FsayB0aGUgcGFyZW50IHBhdGggdG8gdGhlIHJvb3QgYW5kIHVwZGF0ZSB0aGUgY2hpbGQgbGFuZXMuXG5cblxuICB2YXIgbm9kZSA9IHNvdXJjZUZpYmVyO1xuICB2YXIgcGFyZW50ID0gc291cmNlRmliZXIucmV0dXJuO1xuXG4gIHdoaWxlIChwYXJlbnQgIT09IG51bGwpIHtcbiAgICBwYXJlbnQuY2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMocGFyZW50LmNoaWxkTGFuZXMsIGxhbmUpO1xuICAgIGFsdGVybmF0ZSA9IHBhcmVudC5hbHRlcm5hdGU7XG5cbiAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICBhbHRlcm5hdGUuY2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMoYWx0ZXJuYXRlLmNoaWxkTGFuZXMsIGxhbmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB7XG4gICAgICAgIGlmICgocGFyZW50LmZsYWdzICYgKFBsYWNlbWVudCB8IEh5ZHJhdGluZykpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgd2FybkFib3V0VXBkYXRlT25Ob3RZZXRNb3VudGVkRmliZXJJbkRFVihzb3VyY2VGaWJlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBub2RlID0gcGFyZW50O1xuICAgIHBhcmVudCA9IHBhcmVudC5yZXR1cm47XG4gIH1cblxuICBpZiAobm9kZS50YWcgPT09IEhvc3RSb290KSB7XG4gICAgdmFyIHJvb3QgPSBub2RlLnN0YXRlTm9kZTtcbiAgICByZXR1cm4gcm9vdDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG52YXIgVXBkYXRlU3RhdGUgPSAwO1xudmFyIFJlcGxhY2VTdGF0ZSA9IDE7XG52YXIgRm9yY2VVcGRhdGUgPSAyO1xudmFyIENhcHR1cmVVcGRhdGUgPSAzOyAvLyBHbG9iYWwgc3RhdGUgdGhhdCBpcyByZXNldCBhdCB0aGUgYmVnaW5uaW5nIG9mIGNhbGxpbmcgYHByb2Nlc3NVcGRhdGVRdWV1ZWAuXG4vLyBJdCBzaG91bGQgb25seSBiZSByZWFkIHJpZ2h0IGFmdGVyIGNhbGxpbmcgYHByb2Nlc3NVcGRhdGVRdWV1ZWAsIHZpYVxuLy8gYGNoZWNrSGFzRm9yY2VVcGRhdGVBZnRlclByb2Nlc3NpbmdgLlxuXG52YXIgaGFzRm9yY2VVcGRhdGUgPSBmYWxzZTtcbnZhciBkaWRXYXJuVXBkYXRlSW5zaWRlVXBkYXRlO1xudmFyIGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZTtcblxue1xuICBkaWRXYXJuVXBkYXRlSW5zaWRlVXBkYXRlID0gZmFsc2U7XG4gIGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZSA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGluaXRpYWxpemVVcGRhdGVRdWV1ZShmaWJlcikge1xuICB2YXIgcXVldWUgPSB7XG4gICAgYmFzZVN0YXRlOiBmaWJlci5tZW1vaXplZFN0YXRlLFxuICAgIGZpcnN0QmFzZVVwZGF0ZTogbnVsbCxcbiAgICBsYXN0QmFzZVVwZGF0ZTogbnVsbCxcbiAgICBzaGFyZWQ6IHtcbiAgICAgIHBlbmRpbmc6IG51bGwsXG4gICAgICBpbnRlcmxlYXZlZDogbnVsbCxcbiAgICAgIGxhbmVzOiBOb0xhbmVzXG4gICAgfSxcbiAgICBlZmZlY3RzOiBudWxsXG4gIH07XG4gIGZpYmVyLnVwZGF0ZVF1ZXVlID0gcXVldWU7XG59XG5mdW5jdGlvbiBjbG9uZVVwZGF0ZVF1ZXVlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSB7XG4gIC8vIENsb25lIHRoZSB1cGRhdGUgcXVldWUgZnJvbSBjdXJyZW50LiBVbmxlc3MgaXQncyBhbHJlYWR5IGEgY2xvbmUuXG4gIHZhciBxdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuICB2YXIgY3VycmVudFF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTtcblxuICBpZiAocXVldWUgPT09IGN1cnJlbnRRdWV1ZSkge1xuICAgIHZhciBjbG9uZSA9IHtcbiAgICAgIGJhc2VTdGF0ZTogY3VycmVudFF1ZXVlLmJhc2VTdGF0ZSxcbiAgICAgIGZpcnN0QmFzZVVwZGF0ZTogY3VycmVudFF1ZXVlLmZpcnN0QmFzZVVwZGF0ZSxcbiAgICAgIGxhc3RCYXNlVXBkYXRlOiBjdXJyZW50UXVldWUubGFzdEJhc2VVcGRhdGUsXG4gICAgICBzaGFyZWQ6IGN1cnJlbnRRdWV1ZS5zaGFyZWQsXG4gICAgICBlZmZlY3RzOiBjdXJyZW50UXVldWUuZWZmZWN0c1xuICAgIH07XG4gICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBjbG9uZTtcbiAgfVxufVxuZnVuY3Rpb24gY3JlYXRlVXBkYXRlKGV2ZW50VGltZSwgbGFuZSkge1xuICB2YXIgdXBkYXRlID0ge1xuICAgIGV2ZW50VGltZTogZXZlbnRUaW1lLFxuICAgIGxhbmU6IGxhbmUsXG4gICAgdGFnOiBVcGRhdGVTdGF0ZSxcbiAgICBwYXlsb2FkOiBudWxsLFxuICAgIGNhbGxiYWNrOiBudWxsLFxuICAgIG5leHQ6IG51bGxcbiAgfTtcbiAgcmV0dXJuIHVwZGF0ZTtcbn1cbmZ1bmN0aW9uIGVucXVldWVVcGRhdGUoZmliZXIsIHVwZGF0ZSwgbGFuZSkge1xuICB2YXIgdXBkYXRlUXVldWUgPSBmaWJlci51cGRhdGVRdWV1ZTtcblxuICBpZiAodXBkYXRlUXVldWUgPT09IG51bGwpIHtcbiAgICAvLyBPbmx5IG9jY3VycyBpZiB0aGUgZmliZXIgaGFzIGJlZW4gdW5tb3VudGVkLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIHNoYXJlZFF1ZXVlID0gdXBkYXRlUXVldWUuc2hhcmVkO1xuXG4gIHtcbiAgICBpZiAoY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlID09PSBzaGFyZWRRdWV1ZSAmJiAhZGlkV2FyblVwZGF0ZUluc2lkZVVwZGF0ZSkge1xuICAgICAgZXJyb3IoJ0FuIHVwZGF0ZSAoc2V0U3RhdGUsIHJlcGxhY2VTdGF0ZSwgb3IgZm9yY2VVcGRhdGUpIHdhcyBzY2hlZHVsZWQgJyArICdmcm9tIGluc2lkZSBhbiB1cGRhdGUgZnVuY3Rpb24uIFVwZGF0ZSBmdW5jdGlvbnMgc2hvdWxkIGJlIHB1cmUsICcgKyAnd2l0aCB6ZXJvIHNpZGUtZWZmZWN0cy4gQ29uc2lkZXIgdXNpbmcgY29tcG9uZW50RGlkVXBkYXRlIG9yIGEgJyArICdjYWxsYmFjay4nKTtcblxuICAgICAgZGlkV2FyblVwZGF0ZUluc2lkZVVwZGF0ZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKGlzVW5zYWZlQ2xhc3NSZW5kZXJQaGFzZVVwZGF0ZSgpKSB7XG4gICAgLy8gVGhpcyBpcyBhbiB1bnNhZmUgcmVuZGVyIHBoYXNlIHVwZGF0ZS4gQWRkIGRpcmVjdGx5IHRvIHRoZSB1cGRhdGVcbiAgICAvLyBxdWV1ZSBzbyB3ZSBjYW4gcHJvY2VzcyBpdCBpbW1lZGlhdGVseSBkdXJpbmcgdGhlIGN1cnJlbnQgcmVuZGVyLlxuICAgIHZhciBwZW5kaW5nID0gc2hhcmVkUXVldWUucGVuZGluZztcblxuICAgIGlmIChwZW5kaW5nID09PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUuIENyZWF0ZSBhIGNpcmN1bGFyIGxpc3QuXG4gICAgICB1cGRhdGUubmV4dCA9IHVwZGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdXBkYXRlLm5leHQgPSBwZW5kaW5nLm5leHQ7XG4gICAgICBwZW5kaW5nLm5leHQgPSB1cGRhdGU7XG4gICAgfVxuXG4gICAgc2hhcmVkUXVldWUucGVuZGluZyA9IHVwZGF0ZTsgLy8gVXBkYXRlIHRoZSBjaGlsZExhbmVzIGV2ZW4gdGhvdWdoIHdlJ3JlIG1vc3QgbGlrZWx5IGFscmVhZHkgcmVuZGVyaW5nXG4gICAgLy8gdGhpcyBmaWJlci4gVGhpcyBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgaW4gdGhlIGNhc2Ugd2hlcmUgeW91XG4gICAgLy8gdXBkYXRlIGEgZGlmZmVyZW50IGNvbXBvbmVudCBkdXJpbmcgcmVuZGVyIHBoYXNlIHRoYW4gdGhlIG9uZSB0aGF0IGlzXG4gICAgLy8gY3VycmVudGx5IHJlbmRlcmluZ3MgKGEgcGF0dGVybiB0aGF0IGlzIGFjY29tcGFuaWVkIGJ5IGEgd2FybmluZykuXG5cbiAgICByZXR1cm4gdW5zYWZlX21hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290KGZpYmVyLCBsYW5lKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZW5xdWV1ZUNvbmN1cnJlbnRDbGFzc1VwZGF0ZShmaWJlciwgc2hhcmVkUXVldWUsIHVwZGF0ZSwgbGFuZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGVudGFuZ2xlVHJhbnNpdGlvbnMocm9vdCwgZmliZXIsIGxhbmUpIHtcbiAgdmFyIHVwZGF0ZVF1ZXVlID0gZmliZXIudXBkYXRlUXVldWU7XG5cbiAgaWYgKHVwZGF0ZVF1ZXVlID09PSBudWxsKSB7XG4gICAgLy8gT25seSBvY2N1cnMgaWYgdGhlIGZpYmVyIGhhcyBiZWVuIHVubW91bnRlZC5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgc2hhcmVkUXVldWUgPSB1cGRhdGVRdWV1ZS5zaGFyZWQ7XG5cbiAgaWYgKGlzVHJhbnNpdGlvbkxhbmUobGFuZSkpIHtcbiAgICB2YXIgcXVldWVMYW5lcyA9IHNoYXJlZFF1ZXVlLmxhbmVzOyAvLyBJZiBhbnkgZW50YW5nbGVkIGxhbmVzIGFyZSBubyBsb25nZXIgcGVuZGluZyBvbiB0aGUgcm9vdCwgdGhlbiB0aGV5IG11c3RcbiAgICAvLyBoYXZlIGZpbmlzaGVkLiBXZSBjYW4gcmVtb3ZlIHRoZW0gZnJvbSB0aGUgc2hhcmVkIHF1ZXVlLCB3aGljaCByZXByZXNlbnRzXG4gICAgLy8gYSBzdXBlcnNldCBvZiB0aGUgYWN0dWFsbHkgcGVuZGluZyBsYW5lcy4gSW4gc29tZSBjYXNlcyB3ZSBtYXkgZW50YW5nbGVcbiAgICAvLyBtb3JlIHRoYW4gd2UgbmVlZCB0bywgYnV0IHRoYXQncyBPSy4gSW4gZmFjdCBpdCdzIHdvcnNlIGlmIHdlICpkb24ndCpcbiAgICAvLyBlbnRhbmdsZSB3aGVuIHdlIHNob3VsZC5cblxuICAgIHF1ZXVlTGFuZXMgPSBpbnRlcnNlY3RMYW5lcyhxdWV1ZUxhbmVzLCByb290LnBlbmRpbmdMYW5lcyk7IC8vIEVudGFuZ2xlIHRoZSBuZXcgdHJhbnNpdGlvbiBsYW5lIHdpdGggdGhlIG90aGVyIHRyYW5zaXRpb24gbGFuZXMuXG5cbiAgICB2YXIgbmV3UXVldWVMYW5lcyA9IG1lcmdlTGFuZXMocXVldWVMYW5lcywgbGFuZSk7XG4gICAgc2hhcmVkUXVldWUubGFuZXMgPSBuZXdRdWV1ZUxhbmVzOyAvLyBFdmVuIGlmIHF1ZXVlLmxhbmVzIGFscmVhZHkgaW5jbHVkZSBsYW5lLCB3ZSBkb24ndCBrbm93IGZvciBjZXJ0YWluIGlmXG4gICAgLy8gdGhlIGxhbmUgZmluaXNoZWQgc2luY2UgdGhlIGxhc3QgdGltZSB3ZSBlbnRhbmdsZWQgaXQuIFNvIHdlIG5lZWQgdG9cbiAgICAvLyBlbnRhbmdsZSBpdCBhZ2FpbiwganVzdCB0byBiZSBzdXJlLlxuXG4gICAgbWFya1Jvb3RFbnRhbmdsZWQocm9vdCwgbmV3UXVldWVMYW5lcyk7XG4gIH1cbn1cbmZ1bmN0aW9uIGVucXVldWVDYXB0dXJlZFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgY2FwdHVyZWRVcGRhdGUpIHtcbiAgLy8gQ2FwdHVyZWQgdXBkYXRlcyBhcmUgdXBkYXRlcyB0aGF0IGFyZSB0aHJvd24gYnkgYSBjaGlsZCBkdXJpbmcgdGhlIHJlbmRlclxuICAvLyBwaGFzZS4gVGhleSBzaG91bGQgYmUgZGlzY2FyZGVkIGlmIHRoZSByZW5kZXIgaXMgYWJvcnRlZC4gVGhlcmVmb3JlLFxuICAvLyB3ZSBzaG91bGQgb25seSBwdXQgdGhlbSBvbiB0aGUgd29yay1pbi1wcm9ncmVzcyBxdWV1ZSwgbm90IHRoZSBjdXJyZW50IG9uZS5cbiAgdmFyIHF1ZXVlID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWU7IC8vIENoZWNrIGlmIHRoZSB3b3JrLWluLXByb2dyZXNzIHF1ZXVlIGlzIGEgY2xvbmUuXG5cbiAgdmFyIGN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGU7XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICB2YXIgY3VycmVudFF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTtcblxuICAgIGlmIChxdWV1ZSA9PT0gY3VycmVudFF1ZXVlKSB7XG4gICAgICAvLyBUaGUgd29yay1pbi1wcm9ncmVzcyBxdWV1ZSBpcyB0aGUgc2FtZSBhcyBjdXJyZW50LiBUaGlzIGhhcHBlbnMgd2hlblxuICAgICAgLy8gd2UgYmFpbCBvdXQgb24gYSBwYXJlbnQgZmliZXIgdGhhdCB0aGVuIGNhcHR1cmVzIGFuIGVycm9yIHRocm93biBieVxuICAgICAgLy8gYSBjaGlsZC4gU2luY2Ugd2Ugd2FudCB0byBhcHBlbmQgdGhlIHVwZGF0ZSBvbmx5IHRvIHRoZSB3b3JrLWluXG4gICAgICAvLyAtcHJvZ3Jlc3MgcXVldWUsIHdlIG5lZWQgdG8gY2xvbmUgdGhlIHVwZGF0ZXMuIFdlIHVzdWFsbHkgY2xvbmUgZHVyaW5nXG4gICAgICAvLyBwcm9jZXNzVXBkYXRlUXVldWUsIGJ1dCB0aGF0IGRpZG4ndCBoYXBwZW4gaW4gdGhpcyBjYXNlIGJlY2F1c2Ugd2VcbiAgICAgIC8vIHNraXBwZWQgb3ZlciB0aGUgcGFyZW50IHdoZW4gd2UgYmFpbGVkIG91dC5cbiAgICAgIHZhciBuZXdGaXJzdCA9IG51bGw7XG4gICAgICB2YXIgbmV3TGFzdCA9IG51bGw7XG4gICAgICB2YXIgZmlyc3RCYXNlVXBkYXRlID0gcXVldWUuZmlyc3RCYXNlVXBkYXRlO1xuXG4gICAgICBpZiAoZmlyc3RCYXNlVXBkYXRlICE9PSBudWxsKSB7XG4gICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgdXBkYXRlcyBhbmQgY2xvbmUgdGhlbS5cbiAgICAgICAgdmFyIHVwZGF0ZSA9IGZpcnN0QmFzZVVwZGF0ZTtcblxuICAgICAgICBkbyB7XG4gICAgICAgICAgdmFyIGNsb25lID0ge1xuICAgICAgICAgICAgZXZlbnRUaW1lOiB1cGRhdGUuZXZlbnRUaW1lLFxuICAgICAgICAgICAgbGFuZTogdXBkYXRlLmxhbmUsXG4gICAgICAgICAgICB0YWc6IHVwZGF0ZS50YWcsXG4gICAgICAgICAgICBwYXlsb2FkOiB1cGRhdGUucGF5bG9hZCxcbiAgICAgICAgICAgIGNhbGxiYWNrOiB1cGRhdGUuY2FsbGJhY2ssXG4gICAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmIChuZXdMYXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgICBuZXdGaXJzdCA9IG5ld0xhc3QgPSBjbG9uZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3TGFzdC5uZXh0ID0gY2xvbmU7XG4gICAgICAgICAgICBuZXdMYXN0ID0gY2xvbmU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdXBkYXRlID0gdXBkYXRlLm5leHQ7XG4gICAgICAgIH0gd2hpbGUgKHVwZGF0ZSAhPT0gbnVsbCk7IC8vIEFwcGVuZCB0aGUgY2FwdHVyZWQgdXBkYXRlIHRoZSBlbmQgb2YgdGhlIGNsb25lZCBsaXN0LlxuXG5cbiAgICAgICAgaWYgKG5ld0xhc3QgPT09IG51bGwpIHtcbiAgICAgICAgICBuZXdGaXJzdCA9IG5ld0xhc3QgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdMYXN0Lm5leHQgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgICAgICAgICBuZXdMYXN0ID0gY2FwdHVyZWRVcGRhdGU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoZXJlIGFyZSBubyBiYXNlIHVwZGF0ZXMuXG4gICAgICAgIG5ld0ZpcnN0ID0gbmV3TGFzdCA9IGNhcHR1cmVkVXBkYXRlO1xuICAgICAgfVxuXG4gICAgICBxdWV1ZSA9IHtcbiAgICAgICAgYmFzZVN0YXRlOiBjdXJyZW50UXVldWUuYmFzZVN0YXRlLFxuICAgICAgICBmaXJzdEJhc2VVcGRhdGU6IG5ld0ZpcnN0LFxuICAgICAgICBsYXN0QmFzZVVwZGF0ZTogbmV3TGFzdCxcbiAgICAgICAgc2hhcmVkOiBjdXJyZW50UXVldWUuc2hhcmVkLFxuICAgICAgICBlZmZlY3RzOiBjdXJyZW50UXVldWUuZWZmZWN0c1xuICAgICAgfTtcbiAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gcXVldWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9IC8vIEFwcGVuZCB0aGUgdXBkYXRlIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuXG5cblxuICB2YXIgbGFzdEJhc2VVcGRhdGUgPSBxdWV1ZS5sYXN0QmFzZVVwZGF0ZTtcblxuICBpZiAobGFzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICBxdWV1ZS5maXJzdEJhc2VVcGRhdGUgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgfSBlbHNlIHtcbiAgICBsYXN0QmFzZVVwZGF0ZS5uZXh0ID0gY2FwdHVyZWRVcGRhdGU7XG4gIH1cblxuICBxdWV1ZS5sYXN0QmFzZVVwZGF0ZSA9IGNhcHR1cmVkVXBkYXRlO1xufVxuXG5mdW5jdGlvbiBnZXRTdGF0ZUZyb21VcGRhdGUod29ya0luUHJvZ3Jlc3MsIHF1ZXVlLCB1cGRhdGUsIHByZXZTdGF0ZSwgbmV4dFByb3BzLCBpbnN0YW5jZSkge1xuICBzd2l0Y2ggKHVwZGF0ZS50YWcpIHtcbiAgICBjYXNlIFJlcGxhY2VTdGF0ZTpcbiAgICAgIHtcbiAgICAgICAgdmFyIHBheWxvYWQgPSB1cGRhdGUucGF5bG9hZDtcblxuICAgICAgICBpZiAodHlwZW9mIHBheWxvYWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAvLyBVcGRhdGVyIGZ1bmN0aW9uXG4gICAgICAgICAge1xuICAgICAgICAgICAgZW50ZXJEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBuZXh0U3RhdGUgPSBwYXlsb2FkLmNhbGwoaW5zdGFuY2UsIHByZXZTdGF0ZSwgbmV4dFByb3BzKTtcblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkLmNhbGwoaW5zdGFuY2UsIHByZXZTdGF0ZSwgbmV4dFByb3BzKTtcbiAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXhpdERpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG5leHRTdGF0ZTtcbiAgICAgICAgfSAvLyBTdGF0ZSBvYmplY3RcblxuXG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgfVxuXG4gICAgY2FzZSBDYXB0dXJlVXBkYXRlOlxuICAgICAge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IHdvcmtJblByb2dyZXNzLmZsYWdzICYgflNob3VsZENhcHR1cmUgfCBEaWRDYXB0dXJlO1xuICAgICAgfVxuICAgIC8vIEludGVudGlvbmFsIGZhbGx0aHJvdWdoXG5cbiAgICBjYXNlIFVwZGF0ZVN0YXRlOlxuICAgICAge1xuICAgICAgICB2YXIgX3BheWxvYWQgPSB1cGRhdGUucGF5bG9hZDtcbiAgICAgICAgdmFyIHBhcnRpYWxTdGF0ZTtcblxuICAgICAgICBpZiAodHlwZW9mIF9wYXlsb2FkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gVXBkYXRlciBmdW5jdGlvblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGVudGVyRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwYXJ0aWFsU3RhdGUgPSBfcGF5bG9hZC5jYWxsKGluc3RhbmNlLCBwcmV2U3RhdGUsIG5leHRQcm9wcyk7XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgX3BheWxvYWQuY2FsbChpbnN0YW5jZSwgcHJldlN0YXRlLCBuZXh0UHJvcHMpO1xuICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBleGl0RGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUGFydGlhbCBzdGF0ZSBvYmplY3RcbiAgICAgICAgICBwYXJ0aWFsU3RhdGUgPSBfcGF5bG9hZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJ0aWFsU3RhdGUgPT09IG51bGwgfHwgcGFydGlhbFN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBOdWxsIGFuZCB1bmRlZmluZWQgYXJlIHRyZWF0ZWQgYXMgbm8tb3BzLlxuICAgICAgICAgIHJldHVybiBwcmV2U3RhdGU7XG4gICAgICAgIH0gLy8gTWVyZ2UgdGhlIHBhcnRpYWwgc3RhdGUgYW5kIHRoZSBwcmV2aW91cyBzdGF0ZS5cblxuXG4gICAgICAgIHJldHVybiBhc3NpZ24oe30sIHByZXZTdGF0ZSwgcGFydGlhbFN0YXRlKTtcbiAgICAgIH1cblxuICAgIGNhc2UgRm9yY2VVcGRhdGU6XG4gICAgICB7XG4gICAgICAgIGhhc0ZvcmNlVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHByZXZTdGF0ZTtcbiAgICAgIH1cbiAgfVxuXG4gIHJldHVybiBwcmV2U3RhdGU7XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcywgcHJvcHMsIGluc3RhbmNlLCByZW5kZXJMYW5lcykge1xuICAvLyBUaGlzIGlzIGFsd2F5cyBub24tbnVsbCBvbiBhIENsYXNzQ29tcG9uZW50IG9yIEhvc3RSb290XG4gIHZhciBxdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuICBoYXNGb3JjZVVwZGF0ZSA9IGZhbHNlO1xuXG4gIHtcbiAgICBjdXJyZW50bHlQcm9jZXNzaW5nUXVldWUgPSBxdWV1ZS5zaGFyZWQ7XG4gIH1cblxuICB2YXIgZmlyc3RCYXNlVXBkYXRlID0gcXVldWUuZmlyc3RCYXNlVXBkYXRlO1xuICB2YXIgbGFzdEJhc2VVcGRhdGUgPSBxdWV1ZS5sYXN0QmFzZVVwZGF0ZTsgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIHBlbmRpbmcgdXBkYXRlcy4gSWYgc28sIHRyYW5zZmVyIHRoZW0gdG8gdGhlIGJhc2UgcXVldWUuXG5cbiAgdmFyIHBlbmRpbmdRdWV1ZSA9IHF1ZXVlLnNoYXJlZC5wZW5kaW5nO1xuXG4gIGlmIChwZW5kaW5nUXVldWUgIT09IG51bGwpIHtcbiAgICBxdWV1ZS5zaGFyZWQucGVuZGluZyA9IG51bGw7IC8vIFRoZSBwZW5kaW5nIHF1ZXVlIGlzIGNpcmN1bGFyLiBEaXNjb25uZWN0IHRoZSBwb2ludGVyIGJldHdlZW4gZmlyc3RcbiAgICAvLyBhbmQgbGFzdCBzbyB0aGF0IGl0J3Mgbm9uLWNpcmN1bGFyLlxuXG4gICAgdmFyIGxhc3RQZW5kaW5nVXBkYXRlID0gcGVuZGluZ1F1ZXVlO1xuICAgIHZhciBmaXJzdFBlbmRpbmdVcGRhdGUgPSBsYXN0UGVuZGluZ1VwZGF0ZS5uZXh0O1xuICAgIGxhc3RQZW5kaW5nVXBkYXRlLm5leHQgPSBudWxsOyAvLyBBcHBlbmQgcGVuZGluZyB1cGRhdGVzIHRvIGJhc2UgcXVldWVcblxuICAgIGlmIChsYXN0QmFzZVVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgZmlyc3RCYXNlVXBkYXRlID0gZmlyc3RQZW5kaW5nVXBkYXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICBsYXN0QmFzZVVwZGF0ZS5uZXh0ID0gZmlyc3RQZW5kaW5nVXBkYXRlO1xuICAgIH1cblxuICAgIGxhc3RCYXNlVXBkYXRlID0gbGFzdFBlbmRpbmdVcGRhdGU7IC8vIElmIHRoZXJlJ3MgYSBjdXJyZW50IHF1ZXVlLCBhbmQgaXQncyBkaWZmZXJlbnQgZnJvbSB0aGUgYmFzZSBxdWV1ZSwgdGhlblxuICAgIC8vIHdlIG5lZWQgdG8gdHJhbnNmZXIgdGhlIHVwZGF0ZXMgdG8gdGhhdCBxdWV1ZSwgdG9vLiBCZWNhdXNlIHRoZSBiYXNlXG4gICAgLy8gcXVldWUgaXMgYSBzaW5nbHktbGlua2VkIGxpc3Qgd2l0aCBubyBjeWNsZXMsIHdlIGNhbiBhcHBlbmQgdG8gYm90aFxuICAgIC8vIGxpc3RzIGFuZCB0YWtlIGFkdmFudGFnZSBvZiBzdHJ1Y3R1cmFsIHNoYXJpbmcuXG4gICAgLy8gVE9ETzogUGFzcyBgY3VycmVudGAgYXMgYXJndW1lbnRcblxuICAgIHZhciBjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgaXMgYWx3YXlzIG5vbi1udWxsIG9uIGEgQ2xhc3NDb21wb25lbnQgb3IgSG9zdFJvb3RcbiAgICAgIHZhciBjdXJyZW50UXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlO1xuICAgICAgdmFyIGN1cnJlbnRMYXN0QmFzZVVwZGF0ZSA9IGN1cnJlbnRRdWV1ZS5sYXN0QmFzZVVwZGF0ZTtcblxuICAgICAgaWYgKGN1cnJlbnRMYXN0QmFzZVVwZGF0ZSAhPT0gbGFzdEJhc2VVcGRhdGUpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRMYXN0QmFzZVVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGN1cnJlbnRRdWV1ZS5maXJzdEJhc2VVcGRhdGUgPSBmaXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3VycmVudExhc3RCYXNlVXBkYXRlLm5leHQgPSBmaXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50UXVldWUubGFzdEJhc2VVcGRhdGUgPSBsYXN0UGVuZGluZ1VwZGF0ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gVGhlc2UgdmFsdWVzIG1heSBjaGFuZ2UgYXMgd2UgcHJvY2VzcyB0aGUgcXVldWUuXG5cblxuICBpZiAoZmlyc3RCYXNlVXBkYXRlICE9PSBudWxsKSB7XG4gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBsaXN0IG9mIHVwZGF0ZXMgdG8gY29tcHV0ZSB0aGUgcmVzdWx0LlxuICAgIHZhciBuZXdTdGF0ZSA9IHF1ZXVlLmJhc2VTdGF0ZTsgLy8gVE9ETzogRG9uJ3QgbmVlZCB0byBhY2N1bXVsYXRlIHRoaXMuIEluc3RlYWQsIHdlIGNhbiByZW1vdmUgcmVuZGVyTGFuZXNcbiAgICAvLyBmcm9tIHRoZSBvcmlnaW5hbCBsYW5lcy5cblxuICAgIHZhciBuZXdMYW5lcyA9IE5vTGFuZXM7XG4gICAgdmFyIG5ld0Jhc2VTdGF0ZSA9IG51bGw7XG4gICAgdmFyIG5ld0ZpcnN0QmFzZVVwZGF0ZSA9IG51bGw7XG4gICAgdmFyIG5ld0xhc3RCYXNlVXBkYXRlID0gbnVsbDtcbiAgICB2YXIgdXBkYXRlID0gZmlyc3RCYXNlVXBkYXRlO1xuXG4gICAgZG8ge1xuICAgICAgdmFyIHVwZGF0ZUxhbmUgPSB1cGRhdGUubGFuZTtcbiAgICAgIHZhciB1cGRhdGVFdmVudFRpbWUgPSB1cGRhdGUuZXZlbnRUaW1lO1xuXG4gICAgICBpZiAoIWlzU3Vic2V0T2ZMYW5lcyhyZW5kZXJMYW5lcywgdXBkYXRlTGFuZSkpIHtcbiAgICAgICAgLy8gUHJpb3JpdHkgaXMgaW5zdWZmaWNpZW50LiBTa2lwIHRoaXMgdXBkYXRlLiBJZiB0aGlzIGlzIHRoZSBmaXJzdFxuICAgICAgICAvLyBza2lwcGVkIHVwZGF0ZSwgdGhlIHByZXZpb3VzIHVwZGF0ZS9zdGF0ZSBpcyB0aGUgbmV3IGJhc2VcbiAgICAgICAgLy8gdXBkYXRlL3N0YXRlLlxuICAgICAgICB2YXIgY2xvbmUgPSB7XG4gICAgICAgICAgZXZlbnRUaW1lOiB1cGRhdGVFdmVudFRpbWUsXG4gICAgICAgICAgbGFuZTogdXBkYXRlTGFuZSxcbiAgICAgICAgICB0YWc6IHVwZGF0ZS50YWcsXG4gICAgICAgICAgcGF5bG9hZDogdXBkYXRlLnBheWxvYWQsXG4gICAgICAgICAgY2FsbGJhY2s6IHVwZGF0ZS5jYWxsYmFjayxcbiAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKG5ld0xhc3RCYXNlVXBkYXRlID09PSBudWxsKSB7XG4gICAgICAgICAgbmV3Rmlyc3RCYXNlVXBkYXRlID0gbmV3TGFzdEJhc2VVcGRhdGUgPSBjbG9uZTtcbiAgICAgICAgICBuZXdCYXNlU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdMYXN0QmFzZVVwZGF0ZSA9IG5ld0xhc3RCYXNlVXBkYXRlLm5leHQgPSBjbG9uZTtcbiAgICAgICAgfSAvLyBVcGRhdGUgdGhlIHJlbWFpbmluZyBwcmlvcml0eSBpbiB0aGUgcXVldWUuXG5cblxuICAgICAgICBuZXdMYW5lcyA9IG1lcmdlTGFuZXMobmV3TGFuZXMsIHVwZGF0ZUxhbmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyB1cGRhdGUgZG9lcyBoYXZlIHN1ZmZpY2llbnQgcHJpb3JpdHkuXG4gICAgICAgIGlmIChuZXdMYXN0QmFzZVVwZGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBfY2xvbmUgPSB7XG4gICAgICAgICAgICBldmVudFRpbWU6IHVwZGF0ZUV2ZW50VGltZSxcbiAgICAgICAgICAgIC8vIFRoaXMgdXBkYXRlIGlzIGdvaW5nIHRvIGJlIGNvbW1pdHRlZCBzbyB3ZSBuZXZlciB3YW50IHVuY29tbWl0XG4gICAgICAgICAgICAvLyBpdC4gVXNpbmcgTm9MYW5lIHdvcmtzIGJlY2F1c2UgMCBpcyBhIHN1YnNldCBvZiBhbGwgYml0bWFza3MsIHNvXG4gICAgICAgICAgICAvLyB0aGlzIHdpbGwgbmV2ZXIgYmUgc2tpcHBlZCBieSB0aGUgY2hlY2sgYWJvdmUuXG4gICAgICAgICAgICBsYW5lOiBOb0xhbmUsXG4gICAgICAgICAgICB0YWc6IHVwZGF0ZS50YWcsXG4gICAgICAgICAgICBwYXlsb2FkOiB1cGRhdGUucGF5bG9hZCxcbiAgICAgICAgICAgIGNhbGxiYWNrOiB1cGRhdGUuY2FsbGJhY2ssXG4gICAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBuZXdMYXN0QmFzZVVwZGF0ZSA9IG5ld0xhc3RCYXNlVXBkYXRlLm5leHQgPSBfY2xvbmU7XG4gICAgICAgIH0gLy8gUHJvY2VzcyB0aGlzIHVwZGF0ZS5cblxuXG4gICAgICAgIG5ld1N0YXRlID0gZ2V0U3RhdGVGcm9tVXBkYXRlKHdvcmtJblByb2dyZXNzLCBxdWV1ZSwgdXBkYXRlLCBuZXdTdGF0ZSwgcHJvcHMsIGluc3RhbmNlKTtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gdXBkYXRlLmNhbGxiYWNrO1xuXG4gICAgICAgIGlmIChjYWxsYmFjayAhPT0gbnVsbCAmJiAvLyBJZiB0aGUgdXBkYXRlIHdhcyBhbHJlYWR5IGNvbW1pdHRlZCwgd2Ugc2hvdWxkIG5vdCBxdWV1ZSBpdHNcbiAgICAgICAgLy8gY2FsbGJhY2sgYWdhaW4uXG4gICAgICAgIHVwZGF0ZS5sYW5lICE9PSBOb0xhbmUpIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBDYWxsYmFjaztcbiAgICAgICAgICB2YXIgZWZmZWN0cyA9IHF1ZXVlLmVmZmVjdHM7XG5cbiAgICAgICAgICBpZiAoZWZmZWN0cyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcXVldWUuZWZmZWN0cyA9IFt1cGRhdGVdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlZmZlY3RzLnB1c2godXBkYXRlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdXBkYXRlID0gdXBkYXRlLm5leHQ7XG5cbiAgICAgIGlmICh1cGRhdGUgPT09IG51bGwpIHtcbiAgICAgICAgcGVuZGluZ1F1ZXVlID0gcXVldWUuc2hhcmVkLnBlbmRpbmc7XG5cbiAgICAgICAgaWYgKHBlbmRpbmdRdWV1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEFuIHVwZGF0ZSB3YXMgc2NoZWR1bGVkIGZyb20gaW5zaWRlIGEgcmVkdWNlci4gQWRkIHRoZSBuZXdcbiAgICAgICAgICAvLyBwZW5kaW5nIHVwZGF0ZXMgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBhbmQga2VlcCBwcm9jZXNzaW5nLlxuICAgICAgICAgIHZhciBfbGFzdFBlbmRpbmdVcGRhdGUgPSBwZW5kaW5nUXVldWU7IC8vIEludGVudGlvbmFsbHkgdW5zb3VuZC4gUGVuZGluZyB1cGRhdGVzIGZvcm0gYSBjaXJjdWxhciBsaXN0LCBidXQgd2VcbiAgICAgICAgICAvLyB1bnJhdmVsIHRoZW0gd2hlbiB0cmFuc2ZlcnJpbmcgdGhlbSB0byB0aGUgYmFzZSBxdWV1ZS5cblxuICAgICAgICAgIHZhciBfZmlyc3RQZW5kaW5nVXBkYXRlID0gX2xhc3RQZW5kaW5nVXBkYXRlLm5leHQ7XG4gICAgICAgICAgX2xhc3RQZW5kaW5nVXBkYXRlLm5leHQgPSBudWxsO1xuICAgICAgICAgIHVwZGF0ZSA9IF9maXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgICAgcXVldWUubGFzdEJhc2VVcGRhdGUgPSBfbGFzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgICAgcXVldWUuc2hhcmVkLnBlbmRpbmcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSB3aGlsZSAodHJ1ZSk7XG5cbiAgICBpZiAobmV3TGFzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgIG5ld0Jhc2VTdGF0ZSA9IG5ld1N0YXRlO1xuICAgIH1cblxuICAgIHF1ZXVlLmJhc2VTdGF0ZSA9IG5ld0Jhc2VTdGF0ZTtcbiAgICBxdWV1ZS5maXJzdEJhc2VVcGRhdGUgPSBuZXdGaXJzdEJhc2VVcGRhdGU7XG4gICAgcXVldWUubGFzdEJhc2VVcGRhdGUgPSBuZXdMYXN0QmFzZVVwZGF0ZTsgLy8gSW50ZXJsZWF2ZWQgdXBkYXRlcyBhcmUgc3RvcmVkIG9uIGEgc2VwYXJhdGUgcXVldWUuIFdlIGFyZW4ndCBnb2luZyB0b1xuICAgIC8vIHByb2Nlc3MgdGhlbSBkdXJpbmcgdGhpcyByZW5kZXIsIGJ1dCB3ZSBkbyBuZWVkIHRvIHRyYWNrIHdoaWNoIGxhbmVzXG4gICAgLy8gYXJlIHJlbWFpbmluZy5cblxuICAgIHZhciBsYXN0SW50ZXJsZWF2ZWQgPSBxdWV1ZS5zaGFyZWQuaW50ZXJsZWF2ZWQ7XG5cbiAgICBpZiAobGFzdEludGVybGVhdmVkICE9PSBudWxsKSB7XG4gICAgICB2YXIgaW50ZXJsZWF2ZWQgPSBsYXN0SW50ZXJsZWF2ZWQ7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgbmV3TGFuZXMgPSBtZXJnZUxhbmVzKG5ld0xhbmVzLCBpbnRlcmxlYXZlZC5sYW5lKTtcbiAgICAgICAgaW50ZXJsZWF2ZWQgPSBpbnRlcmxlYXZlZC5uZXh0O1xuICAgICAgfSB3aGlsZSAoaW50ZXJsZWF2ZWQgIT09IGxhc3RJbnRlcmxlYXZlZCk7XG4gICAgfSBlbHNlIGlmIChmaXJzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgIC8vIGBxdWV1ZS5sYW5lc2AgaXMgdXNlZCBmb3IgZW50YW5nbGluZyB0cmFuc2l0aW9ucy4gV2UgY2FuIHNldCBpdCBiYWNrIHRvXG4gICAgICAvLyB6ZXJvIG9uY2UgdGhlIHF1ZXVlIGlzIGVtcHR5LlxuICAgICAgcXVldWUuc2hhcmVkLmxhbmVzID0gTm9MYW5lcztcbiAgICB9IC8vIFNldCB0aGUgcmVtYWluaW5nIGV4cGlyYXRpb24gdGltZSB0byBiZSB3aGF0ZXZlciBpcyByZW1haW5pbmcgaW4gdGhlIHF1ZXVlLlxuICAgIC8vIFRoaXMgc2hvdWxkIGJlIGZpbmUgYmVjYXVzZSB0aGUgb25seSB0d28gb3RoZXIgdGhpbmdzIHRoYXQgY29udHJpYnV0ZSB0b1xuICAgIC8vIGV4cGlyYXRpb24gdGltZSBhcmUgcHJvcHMgYW5kIGNvbnRleHQuIFdlJ3JlIGFscmVhZHkgaW4gdGhlIG1pZGRsZSBvZiB0aGVcbiAgICAvLyBiZWdpbiBwaGFzZSBieSB0aGUgdGltZSB3ZSBzdGFydCBwcm9jZXNzaW5nIHRoZSBxdWV1ZSwgc28gd2UndmUgYWxyZWFkeVxuICAgIC8vIGRlYWx0IHdpdGggdGhlIHByb3BzLiBDb250ZXh0IGluIGNvbXBvbmVudHMgdGhhdCBzcGVjaWZ5XG4gICAgLy8gc2hvdWxkQ29tcG9uZW50VXBkYXRlIGlzIHRyaWNreTsgYnV0IHdlJ2xsIGhhdmUgdG8gYWNjb3VudCBmb3JcbiAgICAvLyB0aGF0IHJlZ2FyZGxlc3MuXG5cblxuICAgIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXMobmV3TGFuZXMpO1xuICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbmV3TGFuZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9XG5cbiAge1xuICAgIGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZSA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FsbENhbGxiYWNrKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgcGFzc2VkIGFzIGNhbGxiYWNrLiBFeHBlY3RlZCBhIGZ1bmN0aW9uLiBJbnN0ZWFkICcgKyAoXCJyZWNlaXZlZDogXCIgKyBjYWxsYmFjaykpO1xuICB9XG5cbiAgY2FsbGJhY2suY2FsbChjb250ZXh0KTtcbn1cblxuZnVuY3Rpb24gcmVzZXRIYXNGb3JjZVVwZGF0ZUJlZm9yZVByb2Nlc3NpbmcoKSB7XG4gIGhhc0ZvcmNlVXBkYXRlID0gZmFsc2U7XG59XG5mdW5jdGlvbiBjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkge1xuICByZXR1cm4gaGFzRm9yY2VVcGRhdGU7XG59XG5mdW5jdGlvbiBjb21taXRVcGRhdGVRdWV1ZShmaW5pc2hlZFdvcmssIGZpbmlzaGVkUXVldWUsIGluc3RhbmNlKSB7XG4gIC8vIENvbW1pdCB0aGUgZWZmZWN0c1xuICB2YXIgZWZmZWN0cyA9IGZpbmlzaGVkUXVldWUuZWZmZWN0cztcbiAgZmluaXNoZWRRdWV1ZS5lZmZlY3RzID0gbnVsbDtcblxuICBpZiAoZWZmZWN0cyAhPT0gbnVsbCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWZmZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVmZmVjdCA9IGVmZmVjdHNbaV07XG4gICAgICB2YXIgY2FsbGJhY2sgPSBlZmZlY3QuY2FsbGJhY2s7XG5cbiAgICAgIGlmIChjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAgICBlZmZlY3QuY2FsbGJhY2sgPSBudWxsO1xuICAgICAgICBjYWxsQ2FsbGJhY2soY2FsbGJhY2ssIGluc3RhbmNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIE5PX0NPTlRFWFQgPSB7fTtcbnZhciBjb250ZXh0U3RhY2tDdXJzb3IkMSA9IGNyZWF0ZUN1cnNvcihOT19DT05URVhUKTtcbnZhciBjb250ZXh0RmliZXJTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihOT19DT05URVhUKTtcbnZhciByb290SW5zdGFuY2VTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihOT19DT05URVhUKTtcblxuZnVuY3Rpb24gcmVxdWlyZWRDb250ZXh0KGMpIHtcbiAgaWYgKGMgPT09IE5PX0NPTlRFWFQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGhvc3QgY29udGV4dCB0byBleGlzdC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnICcgKyAnaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgcmV0dXJuIGM7XG59XG5cbmZ1bmN0aW9uIGdldFJvb3RIb3N0Q29udGFpbmVyKCkge1xuICB2YXIgcm9vdEluc3RhbmNlID0gcmVxdWlyZWRDb250ZXh0KHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yLmN1cnJlbnQpO1xuICByZXR1cm4gcm9vdEluc3RhbmNlO1xufVxuXG5mdW5jdGlvbiBwdXNoSG9zdENvbnRhaW5lcihmaWJlciwgbmV4dFJvb3RJbnN0YW5jZSkge1xuICAvLyBQdXNoIGN1cnJlbnQgcm9vdCBpbnN0YW5jZSBvbnRvIHRoZSBzdGFjaztcbiAgLy8gVGhpcyBhbGxvd3MgdXMgdG8gcmVzZXQgcm9vdCB3aGVuIHBvcnRhbHMgYXJlIHBvcHBlZC5cbiAgcHVzaChyb290SW5zdGFuY2VTdGFja0N1cnNvciwgbmV4dFJvb3RJbnN0YW5jZSwgZmliZXIpOyAvLyBUcmFjayB0aGUgY29udGV4dCBhbmQgdGhlIEZpYmVyIHRoYXQgcHJvdmlkZWQgaXQuXG4gIC8vIFRoaXMgZW5hYmxlcyB1cyB0byBwb3Agb25seSBGaWJlcnMgdGhhdCBwcm92aWRlIHVuaXF1ZSBjb250ZXh0cy5cblxuICBwdXNoKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLCBmaWJlciwgZmliZXIpOyAvLyBGaW5hbGx5LCB3ZSBuZWVkIHRvIHB1c2ggdGhlIGhvc3QgY29udGV4dCB0byB0aGUgc3RhY2suXG4gIC8vIEhvd2V2ZXIsIHdlIGNhbid0IGp1c3QgY2FsbCBnZXRSb290SG9zdENvbnRleHQoKSBhbmQgcHVzaCBpdCBiZWNhdXNlXG4gIC8vIHdlJ2QgaGF2ZSBhIGRpZmZlcmVudCBudW1iZXIgb2YgZW50cmllcyBvbiB0aGUgc3RhY2sgZGVwZW5kaW5nIG9uXG4gIC8vIHdoZXRoZXIgZ2V0Um9vdEhvc3RDb250ZXh0KCkgdGhyb3dzIHNvbWV3aGVyZSBpbiByZW5kZXJlciBjb2RlIG9yIG5vdC5cbiAgLy8gU28gd2UgcHVzaCBhbiBlbXB0eSB2YWx1ZSBmaXJzdC4gVGhpcyBsZXRzIHVzIHNhZmVseSB1bndpbmQgb24gZXJyb3JzLlxuXG4gIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yJDEsIE5PX0NPTlRFWFQsIGZpYmVyKTtcbiAgdmFyIG5leHRSb290Q29udGV4dCA9IGdldFJvb3RIb3N0Q29udGV4dChuZXh0Um9vdEluc3RhbmNlKTsgLy8gTm93IHRoYXQgd2Uga25vdyB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgdGhyb3csIHJlcGxhY2UgaXQuXG5cbiAgcG9wKGNvbnRleHRTdGFja0N1cnNvciQxLCBmaWJlcik7XG4gIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yJDEsIG5leHRSb290Q29udGV4dCwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBwb3BIb3N0Q29udGFpbmVyKGZpYmVyKSB7XG4gIHBvcChjb250ZXh0U3RhY2tDdXJzb3IkMSwgZmliZXIpO1xuICBwb3AoY29udGV4dEZpYmVyU3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgcG9wKHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yLCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIGdldEhvc3RDb250ZXh0KCkge1xuICB2YXIgY29udGV4dCA9IHJlcXVpcmVkQ29udGV4dChjb250ZXh0U3RhY2tDdXJzb3IkMS5jdXJyZW50KTtcbiAgcmV0dXJuIGNvbnRleHQ7XG59XG5cbmZ1bmN0aW9uIHB1c2hIb3N0Q29udGV4dChmaWJlcikge1xuICB2YXIgcm9vdEluc3RhbmNlID0gcmVxdWlyZWRDb250ZXh0KHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yLmN1cnJlbnQpO1xuICB2YXIgY29udGV4dCA9IHJlcXVpcmVkQ29udGV4dChjb250ZXh0U3RhY2tDdXJzb3IkMS5jdXJyZW50KTtcbiAgdmFyIG5leHRDb250ZXh0ID0gZ2V0Q2hpbGRIb3N0Q29udGV4dChjb250ZXh0LCBmaWJlci50eXBlKTsgLy8gRG9uJ3QgcHVzaCB0aGlzIEZpYmVyJ3MgY29udGV4dCB1bmxlc3MgaXQncyB1bmlxdWUuXG5cbiAgaWYgKGNvbnRleHQgPT09IG5leHRDb250ZXh0KSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIFRyYWNrIHRoZSBjb250ZXh0IGFuZCB0aGUgRmliZXIgdGhhdCBwcm92aWRlZCBpdC5cbiAgLy8gVGhpcyBlbmFibGVzIHVzIHRvIHBvcCBvbmx5IEZpYmVycyB0aGF0IHByb3ZpZGUgdW5pcXVlIGNvbnRleHRzLlxuXG5cbiAgcHVzaChjb250ZXh0RmliZXJTdGFja0N1cnNvciwgZmliZXIsIGZpYmVyKTtcbiAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IkMSwgbmV4dENvbnRleHQsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gcG9wSG9zdENvbnRleHQoZmliZXIpIHtcbiAgLy8gRG8gbm90IHBvcCB1bmxlc3MgdGhpcyBGaWJlciBwcm92aWRlZCB0aGUgY3VycmVudCBjb250ZXh0LlxuICAvLyBwdXNoSG9zdENvbnRleHQoKSBvbmx5IHB1c2hlcyBGaWJlcnMgdGhhdCBwcm92aWRlIHVuaXF1ZSBjb250ZXh0cy5cbiAgaWYgKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLmN1cnJlbnQgIT09IGZpYmVyKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcG9wKGNvbnRleHRTdGFja0N1cnNvciQxLCBmaWJlcik7XG4gIHBvcChjb250ZXh0RmliZXJTdGFja0N1cnNvciwgZmliZXIpO1xufVxuXG52YXIgRGVmYXVsdFN1c3BlbnNlQ29udGV4dCA9IDA7IC8vIFRoZSBTdXNwZW5zZSBDb250ZXh0IGlzIHNwbGl0IGludG8gdHdvIHBhcnRzLiBUaGUgbG93ZXIgYml0cyBpc1xuLy8gaW5oZXJpdGVkIGRlZXBseSBkb3duIHRoZSBzdWJ0cmVlLiBUaGUgdXBwZXIgYml0cyBvbmx5IGFmZmVjdFxuLy8gdGhpcyBpbW1lZGlhdGUgc3VzcGVuc2UgYm91bmRhcnkgYW5kIGdldHMgcmVzZXQgZWFjaCBuZXdcbi8vIGJvdW5kYXJ5IG9yIHN1c3BlbnNlIGxpc3QuXG5cbnZhciBTdWJ0cmVlU3VzcGVuc2VDb250ZXh0TWFzayA9IDE7IC8vIFN1YnRyZWUgRmxhZ3M6XG4vLyBJbnZpc2libGVQYXJlbnRTdXNwZW5zZUNvbnRleHQgaW5kaWNhdGVzIHRoYXQgb25lIG9mIG91ciBwYXJlbnQgU3VzcGVuc2Vcbi8vIGJvdW5kYXJpZXMgaXMgbm90IGN1cnJlbnRseSBzaG93aW5nIHZpc2libGUgbWFpbiBjb250ZW50LlxuLy8gRWl0aGVyIGJlY2F1c2UgaXQgaXMgYWxyZWFkeSBzaG93aW5nIGEgZmFsbGJhY2sgb3IgaXMgbm90IG1vdW50ZWQgYXQgYWxsLlxuLy8gV2UgY2FuIHVzZSB0aGlzIHRvIGRldGVybWluZSBpZiBpdCBpcyBkZXNpcmFibGUgdG8gdHJpZ2dlciBhIGZhbGxiYWNrIGF0XG4vLyB0aGUgcGFyZW50LiBJZiBub3QsIHRoZW4gd2UgbWlnaHQgbmVlZCB0byB0cmlnZ2VyIHVuZGVzaXJhYmxlIGJvdW5kYXJpZXNcbi8vIGFuZC9vciBzdXNwZW5kIHRoZSBjb21taXQgdG8gYXZvaWQgaGlkaW5nIHRoZSBwYXJlbnQgY29udGVudC5cblxudmFyIEludmlzaWJsZVBhcmVudFN1c3BlbnNlQ29udGV4dCA9IDE7IC8vIFNoYWxsb3cgRmxhZ3M6XG4vLyBGb3JjZVN1c3BlbnNlRmFsbGJhY2sgY2FuIGJlIHVzZWQgYnkgU3VzcGVuc2VMaXN0IHRvIGZvcmNlIG5ld2x5IGFkZGVkXG4vLyBpdGVtcyBpbnRvIHRoZWlyIGZhbGxiYWNrIHN0YXRlIGR1cmluZyBvbmUgb2YgdGhlIHJlbmRlciBwYXNzZXMuXG5cbnZhciBGb3JjZVN1c3BlbnNlRmFsbGJhY2sgPSAyO1xudmFyIHN1c3BlbnNlU3RhY2tDdXJzb3IgPSBjcmVhdGVDdXJzb3IoRGVmYXVsdFN1c3BlbnNlQ29udGV4dCk7XG5mdW5jdGlvbiBoYXNTdXNwZW5zZUNvbnRleHQocGFyZW50Q29udGV4dCwgZmxhZykge1xuICByZXR1cm4gKHBhcmVudENvbnRleHQgJiBmbGFnKSAhPT0gMDtcbn1cbmZ1bmN0aW9uIHNldERlZmF1bHRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHBhcmVudENvbnRleHQpIHtcbiAgcmV0dXJuIHBhcmVudENvbnRleHQgJiBTdWJ0cmVlU3VzcGVuc2VDb250ZXh0TWFzaztcbn1cbmZ1bmN0aW9uIHNldFNoYWxsb3dTdXNwZW5zZUNvbnRleHQocGFyZW50Q29udGV4dCwgc2hhbGxvd0NvbnRleHQpIHtcbiAgcmV0dXJuIHBhcmVudENvbnRleHQgJiBTdWJ0cmVlU3VzcGVuc2VDb250ZXh0TWFzayB8IHNoYWxsb3dDb250ZXh0O1xufVxuZnVuY3Rpb24gYWRkU3VidHJlZVN1c3BlbnNlQ29udGV4dChwYXJlbnRDb250ZXh0LCBzdWJ0cmVlQ29udGV4dCkge1xuICByZXR1cm4gcGFyZW50Q29udGV4dCB8IHN1YnRyZWVDb250ZXh0O1xufVxuZnVuY3Rpb24gcHVzaFN1c3BlbnNlQ29udGV4dChmaWJlciwgbmV3Q29udGV4dCkge1xuICBwdXNoKHN1c3BlbnNlU3RhY2tDdXJzb3IsIG5ld0NvbnRleHQsIGZpYmVyKTtcbn1cbmZ1bmN0aW9uIHBvcFN1c3BlbnNlQ29udGV4dChmaWJlcikge1xuICBwb3Aoc3VzcGVuc2VTdGFja0N1cnNvciwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRDYXB0dXJlU3VzcGVuc2Uod29ya0luUHJvZ3Jlc3MsIGhhc0ludmlzaWJsZVBhcmVudCkge1xuICAvLyBJZiBpdCB3YXMgdGhlIHByaW1hcnkgY2hpbGRyZW4gdGhhdCBqdXN0IHN1c3BlbmRlZCwgY2FwdHVyZSBhbmQgcmVuZGVyIHRoZVxuICAvLyBmYWxsYmFjay4gT3RoZXJ3aXNlLCBkb24ndCBjYXB0dXJlIGFuZCBidWJibGUgdG8gdGhlIG5leHQgYm91bmRhcnkuXG4gIHZhciBuZXh0U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChuZXh0U3RhdGUgIT09IG51bGwpIHtcbiAgICBpZiAobmV4dFN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICAgIC8vIEEgZGVoeWRyYXRlZCBib3VuZGFyeSBhbHdheXMgY2FwdHVyZXMuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgcHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzOyAvLyBSZWd1bGFyIGJvdW5kYXJpZXMgYWx3YXlzIGNhcHR1cmUuXG5cbiAge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIElmIGl0J3MgYSBib3VuZGFyeSB3ZSBzaG91bGQgYXZvaWQsIHRoZW4gd2UgcHJlZmVyIHRvIGJ1YmJsZSB1cCB0byB0aGVcbn1cbmZ1bmN0aW9uIGZpbmRGaXJzdFN1c3BlbmRlZChyb3cpIHtcbiAgdmFyIG5vZGUgPSByb3c7XG5cbiAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICBpZiAobm9kZS50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgICB2YXIgc3RhdGUgPSBub2RlLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgIGlmIChzdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgZGVoeWRyYXRlZCA9IHN0YXRlLmRlaHlkcmF0ZWQ7XG5cbiAgICAgICAgaWYgKGRlaHlkcmF0ZWQgPT09IG51bGwgfHwgaXNTdXNwZW5zZUluc3RhbmNlUGVuZGluZyhkZWh5ZHJhdGVkKSB8fCBpc1N1c3BlbnNlSW5zdGFuY2VGYWxsYmFjayhkZWh5ZHJhdGVkKSkge1xuICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChub2RlLnRhZyA9PT0gU3VzcGVuc2VMaXN0Q29tcG9uZW50ICYmIC8vIHJldmVhbE9yZGVyIHVuZGVmaW5lZCBjYW4ndCBiZSB0cnVzdGVkIGJlY2F1c2UgaXQgZG9uJ3RcbiAgICAvLyBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgaXQgc3VzcGVuZGVkIG9yIG5vdC5cbiAgICBub2RlLm1lbW9pemVkUHJvcHMucmV2ZWFsT3JkZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIGRpZFN1c3BlbmQgPSAobm9kZS5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzO1xuXG4gICAgICBpZiAoZGlkU3VzcGVuZCkge1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUgPT09IHJvdykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSByb3cpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgTm9GbGFncyQxID1cbi8qICAgKi9cbjA7IC8vIFJlcHJlc2VudHMgd2hldGhlciBlZmZlY3Qgc2hvdWxkIGZpcmUuXG5cbnZhciBIYXNFZmZlY3QgPVxuLyogKi9cbjE7IC8vIFJlcHJlc2VudHMgdGhlIHBoYXNlIGluIHdoaWNoIHRoZSBlZmZlY3QgKG5vdCB0aGUgY2xlYW4tdXApIGZpcmVzLlxuXG52YXIgSW5zZXJ0aW9uID1cbi8qICAqL1xuMjtcbnZhciBMYXlvdXQgPVxuLyogICAgKi9cbjQ7XG52YXIgUGFzc2l2ZSQxID1cbi8qICAgKi9cbjg7XG5cbi8vIGFuZCBzaG91bGQgYmUgcmVzZXQgYmVmb3JlIHN0YXJ0aW5nIGEgbmV3IHJlbmRlci5cbi8vIFRoaXMgdHJhY2tzIHdoaWNoIG11dGFibGUgc291cmNlcyBuZWVkIHRvIGJlIHJlc2V0IGFmdGVyIGEgcmVuZGVyLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NTb3VyY2VzID0gW107XG5mdW5jdGlvbiByZXNldFdvcmtJblByb2dyZXNzVmVyc2lvbnMoKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgd29ya0luUHJvZ3Jlc3NTb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG11dGFibGVTb3VyY2UgPSB3b3JrSW5Qcm9ncmVzc1NvdXJjZXNbaV07XG5cbiAgICB7XG4gICAgICBtdXRhYmxlU291cmNlLl93b3JrSW5Qcm9ncmVzc1ZlcnNpb25QcmltYXJ5ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICB3b3JrSW5Qcm9ncmVzc1NvdXJjZXMubGVuZ3RoID0gMDtcbn1cbi8vIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSB2ZXJzaW9uIHVzZWQgZm9yIHNlcnZlciByZW5kZXJpbmcgbWF0Y2hlcyB0aGUgb25lXG4vLyB0aGF0IGlzIGV2ZW50dWFsbHkgcmVhZCBkdXJpbmcgaHlkcmF0aW9uLlxuLy8gSWYgdGhleSBkb24ndCBtYXRjaCB0aGVyZSdzIGEgcG90ZW50aWFsIHRlYXIgYW5kIGEgZnVsbCBkZW9wdCByZW5kZXIgaXMgcmVxdWlyZWQuXG5cbmZ1bmN0aW9uIHJlZ2lzdGVyTXV0YWJsZVNvdXJjZUZvckh5ZHJhdGlvbihyb290LCBtdXRhYmxlU291cmNlKSB7XG4gIHZhciBnZXRWZXJzaW9uID0gbXV0YWJsZVNvdXJjZS5fZ2V0VmVyc2lvbjtcbiAgdmFyIHZlcnNpb24gPSBnZXRWZXJzaW9uKG11dGFibGVTb3VyY2UuX3NvdXJjZSk7IC8vIFRPRE8gQ2xlYXIgdGhpcyBkYXRhIG9uY2UgYWxsIHBlbmRpbmcgaHlkcmF0aW9uIHdvcmsgaXMgZmluaXNoZWQuXG4gIC8vIFJldGFpbmluZyBpdCBmb3JldmVyIG1heSBpbnRlcmZlcmUgd2l0aCBHQy5cblxuICBpZiAocm9vdC5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhID09IG51bGwpIHtcbiAgICByb290Lm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGEgPSBbbXV0YWJsZVNvdXJjZSwgdmVyc2lvbl07XG4gIH0gZWxzZSB7XG4gICAgcm9vdC5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhLnB1c2gobXV0YWJsZVNvdXJjZSwgdmVyc2lvbik7XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsXG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMiA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnO1xudmFyIGRpZFdhcm5BYm91dE1pc21hdGNoZWRIb29rc0ZvckNvbXBvbmVudDtcbnZhciBkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdDtcblxue1xuICBkaWRXYXJuQWJvdXRNaXNtYXRjaGVkSG9va3NGb3JDb21wb25lbnQgPSBuZXcgU2V0KCk7XG59XG5cbi8vIFRoZXNlIGFyZSBzZXQgcmlnaHQgYmVmb3JlIGNhbGxpbmcgdGhlIGNvbXBvbmVudC5cbnZhciByZW5kZXJMYW5lcyA9IE5vTGFuZXM7IC8vIFRoZSB3b3JrLWluLXByb2dyZXNzIGZpYmVyLiBJJ3ZlIG5hbWVkIGl0IGRpZmZlcmVudGx5IHRvIGRpc3Rpbmd1aXNoIGl0IGZyb21cbi8vIHRoZSB3b3JrLWluLXByb2dyZXNzIGhvb2suXG5cbnZhciBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gbnVsbDsgLy8gSG9va3MgYXJlIHN0b3JlZCBhcyBhIGxpbmtlZCBsaXN0IG9uIHRoZSBmaWJlcidzIG1lbW9pemVkU3RhdGUgZmllbGQuIFRoZVxuLy8gY3VycmVudCBob29rIGxpc3QgaXMgdGhlIGxpc3QgdGhhdCBiZWxvbmdzIHRvIHRoZSBjdXJyZW50IGZpYmVyLiBUaGVcbi8vIHdvcmstaW4tcHJvZ3Jlc3MgaG9vayBsaXN0IGlzIGEgbmV3IGxpc3QgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZVxuLy8gd29yay1pbi1wcm9ncmVzcyBmaWJlci5cblxudmFyIGN1cnJlbnRIb29rID0gbnVsbDtcbnZhciB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBudWxsOyAvLyBXaGV0aGVyIGFuIHVwZGF0ZSB3YXMgc2NoZWR1bGVkIGF0IGFueSBwb2ludCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS4gVGhpc1xuLy8gZG9lcyBub3QgZ2V0IHJlc2V0IGlmIHdlIGRvIGFub3RoZXIgcmVuZGVyIHBhc3M7IG9ubHkgd2hlbiB3ZSdyZSBjb21wbGV0ZWx5XG4vLyBmaW5pc2hlZCBldmFsdWF0aW5nIHRoaXMgY29tcG9uZW50LiBUaGlzIGlzIGFuIG9wdGltaXphdGlvbiBzbyB3ZSBrbm93XG4vLyB3aGV0aGVyIHdlIG5lZWQgdG8gY2xlYXIgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgYWZ0ZXIgYSB0aHJvdy5cblxudmFyIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSBmYWxzZTsgLy8gV2hlcmUgYW4gdXBkYXRlIHdhcyBzY2hlZHVsZWQgb25seSBkdXJpbmcgdGhlIGN1cnJlbnQgcmVuZGVyIHBhc3MuIFRoaXNcbi8vIGdldHMgcmVzZXQgYWZ0ZXIgZWFjaCBhdHRlbXB0LlxuLy8gVE9ETzogTWF5YmUgdGhlcmUncyBzb21lIHdheSB0byBjb25zb2xpZGF0ZSB0aGlzIHdpdGhcbi8vIGBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlYC4gT3Igd2l0aCBgbnVtYmVyT2ZSZVJlbmRlcnNgLlxuXG52YXIgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzID0gZmFsc2U7IC8vIENvdW50cyB0aGUgbnVtYmVyIG9mIHVzZUlkIGhvb2tzIGluIHRoaXMgY29tcG9uZW50LlxuXG52YXIgbG9jYWxJZENvdW50ZXIgPSAwOyAvLyBVc2VkIGZvciBpZHMgdGhhdCBhcmUgZ2VuZXJhdGVkIGNvbXBsZXRlbHkgY2xpZW50LXNpZGUgKGkuZS4gbm90IGR1cmluZ1xuLy8gaHlkcmF0aW9uKS4gVGhpcyBjb3VudGVyIGlzIGdsb2JhbCwgc28gY2xpZW50IGlkcyBhcmUgbm90IHN0YWJsZSBhY3Jvc3Ncbi8vIHJlbmRlciBhdHRlbXB0cy5cblxudmFyIGdsb2JhbENsaWVudElkQ291bnRlciA9IDA7XG52YXIgUkVfUkVOREVSX0xJTUlUID0gMjU7IC8vIEluIERFViwgdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBwcmltaXRpdmUgaG9va1xuXG52YXIgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBudWxsOyAvLyBJbiBERVYsIHRoaXMgbGlzdCBlbnN1cmVzIHRoYXQgaG9va3MgYXJlIGNhbGxlZCBpbiB0aGUgc2FtZSBvcmRlciBiZXR3ZWVuIHJlbmRlcnMuXG4vLyBUaGUgbGlzdCBzdG9yZXMgdGhlIG9yZGVyIG9mIGhvb2tzIHVzZWQgZHVyaW5nIHRoZSBpbml0aWFsIHJlbmRlciAobW91bnQpLlxuLy8gU3Vic2VxdWVudCByZW5kZXJzICh1cGRhdGVzKSByZWZlcmVuY2UgdGhpcyBsaXN0LlxuXG52YXIgaG9va1R5cGVzRGV2ID0gbnVsbDtcbnZhciBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xOyAvLyBJbiBERVYsIHRoaXMgdHJhY2tzIHdoZXRoZXIgY3VycmVudGx5IHJlbmRlcmluZyBjb21wb25lbnQgbmVlZHMgdG8gaWdub3JlXG4vLyB0aGUgZGVwZW5kZW5jaWVzIGZvciBIb29rcyB0aGF0IG5lZWQgdGhlbSAoZS5nLiB1c2VFZmZlY3Qgb3IgdXNlTWVtbykuXG4vLyBXaGVuIHRydWUsIHN1Y2ggSG9va3Mgd2lsbCBhbHdheXMgYmUgXCJyZW1vdW50ZWRcIi4gT25seSB1c2VkIGR1cmluZyBob3QgcmVsb2FkLlxuXG52YXIgaWdub3JlUHJldmlvdXNEZXBlbmRlbmNpZXMgPSBmYWxzZTtcblxuZnVuY3Rpb24gbW91bnRIb29rVHlwZXNEZXYoKSB7XG4gIHtcbiAgICB2YXIgaG9va05hbWUgPSBjdXJyZW50SG9va05hbWVJbkRldjtcblxuICAgIGlmIChob29rVHlwZXNEZXYgPT09IG51bGwpIHtcbiAgICAgIGhvb2tUeXBlc0RldiA9IFtob29rTmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGhvb2tUeXBlc0Rldi5wdXNoKGhvb2tOYW1lKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlSG9va1R5cGVzRGV2KCkge1xuICB7XG4gICAgdmFyIGhvb2tOYW1lID0gY3VycmVudEhvb2tOYW1lSW5EZXY7XG5cbiAgICBpZiAoaG9va1R5cGVzRGV2ICE9PSBudWxsKSB7XG4gICAgICBob29rVHlwZXNVcGRhdGVJbmRleERldisrO1xuXG4gICAgICBpZiAoaG9va1R5cGVzRGV2W2hvb2tUeXBlc1VwZGF0ZUluZGV4RGV2XSAhPT0gaG9va05hbWUpIHtcbiAgICAgICAgd2Fybk9uSG9va01pc21hdGNoSW5EZXYoaG9va05hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKSB7XG4gIHtcbiAgICBpZiAoZGVwcyAhPT0gdW5kZWZpbmVkICYmIGRlcHMgIT09IG51bGwgJiYgIWlzQXJyYXkoZGVwcykpIHtcbiAgICAgIC8vIFZlcmlmeSBkZXBzLCBidXQgb25seSBvbiBtb3VudCB0byBhdm9pZCBleHRyYSBjaGVja3MuXG4gICAgICAvLyBJdCdzIHVubGlrZWx5IHRoZWlyIHR5cGUgd291bGQgY2hhbmdlIGFzIHVzdWFsbHkgeW91IGRlZmluZSB0aGVtIGlubGluZS5cbiAgICAgIGVycm9yKCclcyByZWNlaXZlZCBhIGZpbmFsIGFyZ3VtZW50IHRoYXQgaXMgbm90IGFuIGFycmF5IChpbnN0ZWFkLCByZWNlaXZlZCBgJXNgKS4gV2hlbiAnICsgJ3NwZWNpZmllZCwgdGhlIGZpbmFsIGFyZ3VtZW50IG11c3QgYmUgYW4gYXJyYXkuJywgY3VycmVudEhvb2tOYW1lSW5EZXYsIHR5cGVvZiBkZXBzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gd2Fybk9uSG9va01pc21hdGNoSW5EZXYoY3VycmVudEhvb2tOYW1lKSB7XG4gIHtcbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSk7XG5cbiAgICBpZiAoIWRpZFdhcm5BYm91dE1pc21hdGNoZWRIb29rc0ZvckNvbXBvbmVudC5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgIGRpZFdhcm5BYm91dE1pc21hdGNoZWRIb29rc0ZvckNvbXBvbmVudC5hZGQoY29tcG9uZW50TmFtZSk7XG5cbiAgICAgIGlmIChob29rVHlwZXNEZXYgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIHRhYmxlID0gJyc7XG4gICAgICAgIHZhciBzZWNvbmRDb2x1bW5TdGFydCA9IDMwO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2OyBpKyspIHtcbiAgICAgICAgICB2YXIgb2xkSG9va05hbWUgPSBob29rVHlwZXNEZXZbaV07XG4gICAgICAgICAgdmFyIG5ld0hvb2tOYW1lID0gaSA9PT0gaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPyBjdXJyZW50SG9va05hbWUgOiBvbGRIb29rTmFtZTtcbiAgICAgICAgICB2YXIgcm93ID0gaSArIDEgKyBcIi4gXCIgKyBvbGRIb29rTmFtZTsgLy8gRXh0cmEgc3BhY2Ugc28gc2Vjb25kIGNvbHVtbiBsaW5lcyB1cFxuICAgICAgICAgIC8vIGxvbCBAIElFIG5vdCBzdXBwb3J0aW5nIFN0cmluZyNyZXBlYXRcblxuICAgICAgICAgIHdoaWxlIChyb3cubGVuZ3RoIDwgc2Vjb25kQ29sdW1uU3RhcnQpIHtcbiAgICAgICAgICAgIHJvdyArPSAnICc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcm93ICs9IG5ld0hvb2tOYW1lICsgJ1xcbic7XG4gICAgICAgICAgdGFibGUgKz0gcm93O1xuICAgICAgICB9XG5cbiAgICAgICAgZXJyb3IoJ1JlYWN0IGhhcyBkZXRlY3RlZCBhIGNoYW5nZSBpbiB0aGUgb3JkZXIgb2YgSG9va3MgY2FsbGVkIGJ5ICVzLiAnICsgJ1RoaXMgd2lsbCBsZWFkIHRvIGJ1Z3MgYW5kIGVycm9ycyBpZiBub3QgZml4ZWQuICcgKyAnRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlYWQgdGhlIFJ1bGVzIG9mIEhvb2tzOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvcnVsZXMtb2YtaG9va3NcXG5cXG4nICsgJyAgIFByZXZpb3VzIHJlbmRlciAgICAgICAgICAgIE5leHQgcmVuZGVyXFxuJyArICcgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4nICsgJyVzJyArICcgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cXG4nLCBjb21wb25lbnROYW1lLCB0YWJsZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHRocm93SW52YWxpZEhvb2tFcnJvcigpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGhvb2sgY2FsbC4gSG9va3MgY2FuIG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uIGNvbXBvbmVudC4gVGhpcyBjb3VsZCBoYXBwZW4gZm9yJyArICcgb25lIG9mIHRoZSBmb2xsb3dpbmcgcmVhc29uczpcXG4nICsgJzEuIFlvdSBtaWdodCBoYXZlIG1pc21hdGNoaW5nIHZlcnNpb25zIG9mIFJlYWN0IGFuZCB0aGUgcmVuZGVyZXIgKHN1Y2ggYXMgUmVhY3QgRE9NKVxcbicgKyAnMi4gWW91IG1pZ2h0IGJlIGJyZWFraW5nIHRoZSBSdWxlcyBvZiBIb29rc1xcbicgKyAnMy4gWW91IG1pZ2h0IGhhdmUgbW9yZSB0aGFuIG9uZSBjb3B5IG9mIFJlYWN0IGluIHRoZSBzYW1lIGFwcFxcbicgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9pbnZhbGlkLWhvb2stY2FsbCBmb3IgdGlwcyBhYm91dCBob3cgdG8gZGVidWcgYW5kIGZpeCB0aGlzIHByb2JsZW0uJyk7XG59XG5cbmZ1bmN0aW9uIGFyZUhvb2tJbnB1dHNFcXVhbChuZXh0RGVwcywgcHJldkRlcHMpIHtcbiAge1xuICAgIGlmIChpZ25vcmVQcmV2aW91c0RlcGVuZGVuY2llcykge1xuICAgICAgLy8gT25seSB0cnVlIHdoZW4gdGhpcyBjb21wb25lbnQgaXMgYmVpbmcgaG90IHJlbG9hZGVkLlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwcmV2RGVwcyA9PT0gbnVsbCkge1xuICAgIHtcbiAgICAgIGVycm9yKCclcyByZWNlaXZlZCBhIGZpbmFsIGFyZ3VtZW50IGR1cmluZyB0aGlzIHJlbmRlciwgYnV0IG5vdCBkdXJpbmcgJyArICd0aGUgcHJldmlvdXMgcmVuZGVyLiBFdmVuIHRob3VnaCB0aGUgZmluYWwgYXJndW1lbnQgaXMgb3B0aW9uYWwsICcgKyAnaXRzIHR5cGUgY2Fubm90IGNoYW5nZSBiZXR3ZWVuIHJlbmRlcnMuJywgY3VycmVudEhvb2tOYW1lSW5EZXYpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHtcbiAgICAvLyBEb24ndCBib3RoZXIgY29tcGFyaW5nIGxlbmd0aHMgaW4gcHJvZCBiZWNhdXNlIHRoZXNlIGFycmF5cyBzaG91bGQgYmVcbiAgICAvLyBwYXNzZWQgaW5saW5lLlxuICAgIGlmIChuZXh0RGVwcy5sZW5ndGggIT09IHByZXZEZXBzLmxlbmd0aCkge1xuICAgICAgZXJyb3IoJ1RoZSBmaW5hbCBhcmd1bWVudCBwYXNzZWQgdG8gJXMgY2hhbmdlZCBzaXplIGJldHdlZW4gcmVuZGVycy4gVGhlICcgKyAnb3JkZXIgYW5kIHNpemUgb2YgdGhpcyBhcnJheSBtdXN0IHJlbWFpbiBjb25zdGFudC5cXG5cXG4nICsgJ1ByZXZpb3VzOiAlc1xcbicgKyAnSW5jb21pbmc6ICVzJywgY3VycmVudEhvb2tOYW1lSW5EZXYsIFwiW1wiICsgcHJldkRlcHMuam9pbignLCAnKSArIFwiXVwiLCBcIltcIiArIG5leHREZXBzLmpvaW4oJywgJykgKyBcIl1cIik7XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmV2RGVwcy5sZW5ndGggJiYgaSA8IG5leHREZXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKG9iamVjdElzKG5leHREZXBzW2ldLCBwcmV2RGVwc1tpXSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZW5kZXJXaXRoSG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcHJvcHMsIHNlY29uZEFyZywgbmV4dFJlbmRlckxhbmVzKSB7XG4gIHJlbmRlckxhbmVzID0gbmV4dFJlbmRlckxhbmVzO1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gd29ya0luUHJvZ3Jlc3M7XG5cbiAge1xuICAgIGhvb2tUeXBlc0RldiA9IGN1cnJlbnQgIT09IG51bGwgPyBjdXJyZW50Ll9kZWJ1Z0hvb2tUeXBlcyA6IG51bGw7XG4gICAgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPSAtMTsgLy8gVXNlZCBmb3IgaG90IHJlbG9hZGluZzpcblxuICAgIGlnbm9yZVByZXZpb3VzRGVwZW5kZW5jaWVzID0gY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50LnR5cGUgIT09IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gIH1cblxuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IE5vTGFuZXM7IC8vIFRoZSBmb2xsb3dpbmcgc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHJlc2V0XG4gIC8vIGN1cnJlbnRIb29rID0gbnVsbDtcbiAgLy8gd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcbiAgLy8gZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IGZhbHNlO1xuICAvLyBsb2NhbElkQ291bnRlciA9IDA7XG4gIC8vIFRPRE8gV2FybiBpZiBubyBob29rcyBhcmUgdXNlZCBhdCBhbGwgZHVyaW5nIG1vdW50LCB0aGVuIHNvbWUgYXJlIHVzZWQgZHVyaW5nIHVwZGF0ZS5cbiAgLy8gQ3VycmVudGx5IHdlIHdpbGwgaWRlbnRpZnkgdGhlIHVwZGF0ZSByZW5kZXIgYXMgYSBtb3VudCBiZWNhdXNlIG1lbW9pemVkU3RhdGUgPT09IG51bGwuXG4gIC8vIFRoaXMgaXMgdHJpY2t5IGJlY2F1c2UgaXQncyB2YWxpZCBmb3IgY2VydGFpbiB0eXBlcyBvZiBjb21wb25lbnRzIChlLmcuIFJlYWN0LmxhenkpXG4gIC8vIFVzaW5nIG1lbW9pemVkU3RhdGUgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIG1vdW50L3VwZGF0ZSBvbmx5IHdvcmtzIGlmIGF0IGxlYXN0IG9uZSBzdGF0ZWZ1bCBob29rIGlzIHVzZWQuXG4gIC8vIE5vbi1zdGF0ZWZ1bCBob29rcyAoZS5nLiBjb250ZXh0KSBkb24ndCBnZXQgYWRkZWQgdG8gbWVtb2l6ZWRTdGF0ZSxcbiAgLy8gc28gbWVtb2l6ZWRTdGF0ZSB3b3VsZCBiZSBudWxsIGR1cmluZyB1cGRhdGVzIGFuZCBtb3VudHMuXG5cbiAge1xuICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuICAgIH0gZWxzZSBpZiAoaG9va1R5cGVzRGV2ICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGRpc3BhdGNoZXIgaGFuZGxlcyBhbiBlZGdlIGNhc2Ugd2hlcmUgYSBjb21wb25lbnQgaXMgdXBkYXRpbmcsXG4gICAgICAvLyBidXQgbm8gc3RhdGVmdWwgaG9va3MgaGF2ZSBiZWVuIHVzZWQuXG4gICAgICAvLyBXZSB3YW50IHRvIG1hdGNoIHRoZSBwcm9kdWN0aW9uIGNvZGUgYmVoYXZpb3IgKHdoaWNoIHdpbGwgdXNlIEhvb2tzRGlzcGF0Y2hlck9uTW91bnQpLFxuICAgICAgLy8gYnV0IHdpdGggdGhlIGV4dHJhIERFViB2YWxpZGF0aW9uIHRvIGVuc3VyZSBob29rcyBvcmRlcmluZyBoYXNuJ3QgY2hhbmdlZC5cbiAgICAgIC8vIFRoaXMgZGlzcGF0Y2hlciBkb2VzIHRoYXQuXG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEhvb2tzRGlzcGF0Y2hlck9uTW91bnRXaXRoSG9va1R5cGVzSW5ERVY7XG4gICAgfSBlbHNlIHtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjaGlsZHJlbiA9IENvbXBvbmVudChwcm9wcywgc2Vjb25kQXJnKTsgLy8gQ2hlY2sgaWYgdGhlcmUgd2FzIGEgcmVuZGVyIHBoYXNlIHVwZGF0ZVxuXG4gIGlmIChkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MpIHtcbiAgICAvLyBLZWVwIHJlbmRlcmluZyBpbiBhIGxvb3AgZm9yIGFzIGxvbmcgYXMgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgY29udGludWUgdG9cbiAgICAvLyBiZSBzY2hlZHVsZWQuIFVzZSBhIGNvdW50ZXIgdG8gcHJldmVudCBpbmZpbml0ZSBsb29wcy5cbiAgICB2YXIgbnVtYmVyT2ZSZVJlbmRlcnMgPSAwO1xuXG4gICAgZG8ge1xuICAgICAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzID0gZmFsc2U7XG4gICAgICBsb2NhbElkQ291bnRlciA9IDA7XG5cbiAgICAgIGlmIChudW1iZXJPZlJlUmVuZGVycyA+PSBSRV9SRU5ERVJfTElNSVQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb28gbWFueSByZS1yZW5kZXJzLiBSZWFjdCBsaW1pdHMgdGhlIG51bWJlciBvZiByZW5kZXJzIHRvIHByZXZlbnQgJyArICdhbiBpbmZpbml0ZSBsb29wLicpO1xuICAgICAgfVxuXG4gICAgICBudW1iZXJPZlJlUmVuZGVycyArPSAxO1xuXG4gICAgICB7XG4gICAgICAgIC8vIEV2ZW4gd2hlbiBob3QgcmVsb2FkaW5nLCBhbGxvdyBkZXBlbmRlbmNpZXMgdG8gc3RhYmlsaXplXG4gICAgICAgIC8vIGFmdGVyIGZpcnN0IHJlbmRlciB0byBwcmV2ZW50IGluZmluaXRlIHJlbmRlciBwaGFzZSB1cGRhdGVzLlxuICAgICAgICBpZ25vcmVQcmV2aW91c0RlcGVuZGVuY2llcyA9IGZhbHNlO1xuICAgICAgfSAvLyBTdGFydCBvdmVyIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdFxuXG5cbiAgICAgIGN1cnJlbnRIb29rID0gbnVsbDtcbiAgICAgIHdvcmtJblByb2dyZXNzSG9vayA9IG51bGw7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IG51bGw7XG5cbiAgICAgIHtcbiAgICAgICAgLy8gQWxzbyB2YWxpZGF0ZSBob29rIG9yZGVyIGZvciBjYXNjYWRpbmcgdXBkYXRlcy5cbiAgICAgICAgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPSAtMTtcbiAgICAgIH1cblxuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSAgSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWIDtcbiAgICAgIGNoaWxkcmVuID0gQ29tcG9uZW50KHByb3BzLCBzZWNvbmRBcmcpO1xuICAgIH0gd2hpbGUgKGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyk7XG4gIH0gLy8gV2UgY2FuIGFzc3VtZSB0aGUgcHJldmlvdXMgZGlzcGF0Y2hlciBpcyBhbHdheXMgdGhpcyBvbmUsIHNpbmNlIHdlIHNldCBpdFxuICAvLyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZW5kZXIgcGhhc2UgYW5kIHRoZXJlJ3Mgbm8gcmUtZW50cmFuY2UuXG5cblxuICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IENvbnRleHRPbmx5RGlzcGF0Y2hlcjtcblxuICB7XG4gICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnSG9va1R5cGVzID0gaG9va1R5cGVzRGV2O1xuICB9IC8vIFRoaXMgY2hlY2sgdXNlcyBjdXJyZW50SG9vayBzbyB0aGF0IGl0IHdvcmtzIHRoZSBzYW1lIGluIERFViBhbmQgcHJvZCBidW5kbGVzLlxuICAvLyBob29rVHlwZXNEZXYgY291bGQgY2F0Y2ggbW9yZSBjYXNlcyAoZS5nLiBjb250ZXh0KSBidXQgb25seSBpbiBERVYgYnVuZGxlcy5cblxuXG4gIHZhciBkaWRSZW5kZXJUb29GZXdIb29rcyA9IGN1cnJlbnRIb29rICE9PSBudWxsICYmIGN1cnJlbnRIb29rLm5leHQgIT09IG51bGw7XG4gIHJlbmRlckxhbmVzID0gTm9MYW5lcztcbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSA9IG51bGw7XG4gIGN1cnJlbnRIb29rID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcblxuICB7XG4gICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBudWxsO1xuICAgIGhvb2tUeXBlc0RldiA9IG51bGw7XG4gICAgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPSAtMTsgLy8gQ29uZmlybSB0aGF0IGEgc3RhdGljIGZsYWcgd2FzIG5vdCBhZGRlZCBvciByZW1vdmVkIHNpbmNlIHRoZSBsYXN0XG4gICAgLy8gcmVuZGVyLiBJZiB0aGlzIGZpcmVzLCBpdCBzdWdnZXN0cyB0aGF0IHdlIGluY29ycmVjdGx5IHJlc2V0IHRoZSBzdGF0aWNcbiAgICAvLyBmbGFncyBpbiBzb21lIG90aGVyIHBhcnQgb2YgdGhlIGNvZGViYXNlLiBUaGlzIGhhcyBoYXBwZW5lZCBiZWZvcmUsIGZvclxuICAgIC8vIGV4YW1wbGUsIGluIHRoZSBTdXNwZW5zZUxpc3QgaW1wbGVtZW50YXRpb24uXG5cbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiAoY3VycmVudC5mbGFncyAmIFN0YXRpY01hc2spICE9PSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBTdGF0aWNNYXNrKSAmJiAvLyBEaXNhYmxlIHRoaXMgd2FybmluZyBpbiBsZWdhY3kgbW9kZSwgYmVjYXVzZSBsZWdhY3kgU3VzcGVuc2UgaXMgd2VpcmRcbiAgICAvLyBhbmQgY3JlYXRlcyBmYWxzZSBwb3NpdGl2ZXMuIFRvIG1ha2UgdGhpcyB3b3JrIGluIGxlZ2FjeSBtb2RlLCB3ZSdkXG4gICAgLy8gbmVlZCB0byBtYXJrIGZpYmVycyB0aGF0IGNvbW1pdCBpbiBhbiBpbmNvbXBsZXRlIHN0YXRlLCBzb21laG93LiBGb3JcbiAgICAvLyBub3cgSSdsbCBkaXNhYmxlIHRoZSB3YXJuaW5nIHRoYXQgbW9zdCBvZiB0aGUgYnVncyB0aGF0IHdvdWxkIHRyaWdnZXJcbiAgICAvLyBpdCBhcmUgZWl0aGVyIGV4Y2x1c2l2ZSB0byBjb25jdXJyZW50IG1vZGUgb3IgZXhpc3QgaW4gYm90aC5cbiAgICAoY3VycmVudC5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgIGVycm9yKCdJbnRlcm5hbCBSZWFjdCBlcnJvcjogRXhwZWN0ZWQgc3RhdGljIGZsYWcgd2FzIG1pc3NpbmcuIFBsZWFzZSAnICsgJ25vdGlmeSB0aGUgUmVhY3QgdGVhbS4nKTtcbiAgICB9XG4gIH1cblxuICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlID0gZmFsc2U7IC8vIFRoaXMgaXMgcmVzZXQgYnkgY2hlY2tEaWRSZW5kZXJJZEhvb2tcbiAgLy8gbG9jYWxJZENvdW50ZXIgPSAwO1xuXG4gIGlmIChkaWRSZW5kZXJUb29GZXdIb29rcykge1xuICAgIHRocm93IG5ldyBFcnJvcignUmVuZGVyZWQgZmV3ZXIgaG9va3MgdGhhbiBleHBlY3RlZC4gVGhpcyBtYXkgYmUgY2F1c2VkIGJ5IGFuIGFjY2lkZW50YWwgJyArICdlYXJseSByZXR1cm4gc3RhdGVtZW50LicpO1xuICB9XG5cbiAgcmV0dXJuIGNoaWxkcmVuO1xufVxuZnVuY3Rpb24gY2hlY2tEaWRSZW5kZXJJZEhvb2soKSB7XG4gIC8vIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBldmVyeSByZW5kZXJXaXRoSG9va3MgY2FsbC5cbiAgLy8gQ29uY2VwdHVhbGx5LCBpdCdzIHBhcnQgb2YgdGhlIHJldHVybiB2YWx1ZSBvZiByZW5kZXJXaXRoSG9va3M7IGl0J3Mgb25seSBhXG4gIC8vIHNlcGFyYXRlIGZ1bmN0aW9uIHRvIGF2b2lkIHVzaW5nIGFuIGFycmF5IHR1cGxlLlxuICB2YXIgZGlkUmVuZGVySWRIb29rID0gbG9jYWxJZENvdW50ZXIgIT09IDA7XG4gIGxvY2FsSWRDb3VudGVyID0gMDtcbiAgcmV0dXJuIGRpZFJlbmRlcklkSG9vaztcbn1cbmZ1bmN0aW9uIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbGFuZXMpIHtcbiAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlOyAvLyBUT0RPOiBEb24ndCBuZWVkIHRvIHJlc2V0IHRoZSBmbGFncyBoZXJlLCBiZWNhdXNlIHRoZXkncmUgcmVzZXQgaW4gdGhlXG4gIC8vIGNvbXBsZXRlIHBoYXNlIChidWJibGVQcm9wZXJ0aWVzKS5cblxuICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSB+KE1vdW50UGFzc2l2ZURldiB8IE1vdW50TGF5b3V0RGV2IHwgUGFzc2l2ZSB8IFVwZGF0ZSk7XG4gIH0gZWxzZSB7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gfihQYXNzaXZlIHwgVXBkYXRlKTtcbiAgfVxuXG4gIGN1cnJlbnQubGFuZXMgPSByZW1vdmVMYW5lcyhjdXJyZW50LmxhbmVzLCBsYW5lcyk7XG59XG5mdW5jdGlvbiByZXNldEhvb2tzQWZ0ZXJUaHJvdygpIHtcbiAgLy8gV2UgY2FuIGFzc3VtZSB0aGUgcHJldmlvdXMgZGlzcGF0Y2hlciBpcyBhbHdheXMgdGhpcyBvbmUsIHNpbmNlIHdlIHNldCBpdFxuICAvLyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZW5kZXIgcGhhc2UgYW5kIHRoZXJlJ3Mgbm8gcmUtZW50cmFuY2UuXG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gQ29udGV4dE9ubHlEaXNwYXRjaGVyO1xuXG4gIGlmIChkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlKSB7XG4gICAgLy8gVGhlcmUgd2VyZSByZW5kZXIgcGhhc2UgdXBkYXRlcy4gVGhlc2UgYXJlIG9ubHkgdmFsaWQgZm9yIHRoaXMgcmVuZGVyXG4gICAgLy8gcGhhc2UsIHdoaWNoIHdlIGFyZSBub3cgYWJvcnRpbmcuIFJlbW92ZSB0aGUgdXBkYXRlcyBmcm9tIHRoZSBxdWV1ZXMgc29cbiAgICAvLyB0aGV5IGRvIG5vdCBwZXJzaXN0IHRvIHRoZSBuZXh0IHJlbmRlci4gRG8gbm90IHJlbW92ZSB1cGRhdGVzIGZyb20gaG9va3NcbiAgICAvLyB0aGF0IHdlcmVuJ3QgcHJvY2Vzc2VkLlxuICAgIC8vXG4gICAgLy8gT25seSByZXNldCB0aGUgdXBkYXRlcyBmcm9tIHRoZSBxdWV1ZSBpZiBpdCBoYXMgYSBjbG9uZS4gSWYgaXQgZG9lc1xuICAgIC8vIG5vdCBoYXZlIGEgY2xvbmUsIHRoYXQgbWVhbnMgaXQgd2Fzbid0IHByb2Nlc3NlZCwgYW5kIHRoZSB1cGRhdGVzIHdlcmVcbiAgICAvLyBzY2hlZHVsZWQgYmVmb3JlIHdlIGVudGVyZWQgdGhlIHJlbmRlciBwaGFzZS5cbiAgICB2YXIgaG9vayA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubWVtb2l6ZWRTdGF0ZTtcblxuICAgIHdoaWxlIChob29rICE9PSBudWxsKSB7XG4gICAgICB2YXIgcXVldWUgPSBob29rLnF1ZXVlO1xuXG4gICAgICBpZiAocXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgcXVldWUucGVuZGluZyA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGhvb2sgPSBob29rLm5leHQ7XG4gICAgfVxuXG4gICAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IGZhbHNlO1xuICB9XG5cbiAgcmVuZGVyTGFuZXMgPSBOb0xhbmVzO1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gbnVsbDtcbiAgY3VycmVudEhvb2sgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBudWxsO1xuXG4gIHtcbiAgICBob29rVHlwZXNEZXYgPSBudWxsO1xuICAgIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7XG4gICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBudWxsO1xuICAgIGlzVXBkYXRpbmdPcGFxdWVWYWx1ZUluUmVuZGVyUGhhc2UgPSBmYWxzZTtcbiAgfVxuXG4gIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyA9IGZhbHNlO1xuICBsb2NhbElkQ291bnRlciA9IDA7XG59XG5cbmZ1bmN0aW9uIG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCkge1xuICB2YXIgaG9vayA9IHtcbiAgICBtZW1vaXplZFN0YXRlOiBudWxsLFxuICAgIGJhc2VTdGF0ZTogbnVsbCxcbiAgICBiYXNlUXVldWU6IG51bGwsXG4gICAgcXVldWU6IG51bGwsXG4gICAgbmV4dDogbnVsbFxuICB9O1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc0hvb2sgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBob29rIGluIHRoZSBsaXN0XG4gICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tZW1vaXplZFN0YXRlID0gd29ya0luUHJvZ3Jlc3NIb29rID0gaG9vaztcbiAgfSBlbHNlIHtcbiAgICAvLyBBcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdFxuICAgIHdvcmtJblByb2dyZXNzSG9vayA9IHdvcmtJblByb2dyZXNzSG9vay5uZXh0ID0gaG9vaztcbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzc0hvb2s7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpIHtcbiAgLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJvdGggZm9yIHVwZGF0ZXMgYW5kIGZvciByZS1yZW5kZXJzIHRyaWdnZXJlZCBieSBhXG4gIC8vIHJlbmRlciBwaGFzZSB1cGRhdGUuIEl0IGFzc3VtZXMgdGhlcmUgaXMgZWl0aGVyIGEgY3VycmVudCBob29rIHdlIGNhblxuICAvLyBjbG9uZSwgb3IgYSB3b3JrLWluLXByb2dyZXNzIGhvb2sgZnJvbSBhIHByZXZpb3VzIHJlbmRlciBwYXNzIHRoYXQgd2UgY2FuXG4gIC8vIHVzZSBhcyBhIGJhc2UuIFdoZW4gd2UgcmVhY2ggdGhlIGVuZCBvZiB0aGUgYmFzZSBsaXN0LCB3ZSBtdXN0IHN3aXRjaCB0b1xuICAvLyB0aGUgZGlzcGF0Y2hlciB1c2VkIGZvciBtb3VudHMuXG4gIHZhciBuZXh0Q3VycmVudEhvb2s7XG5cbiAgaWYgKGN1cnJlbnRIb29rID09PSBudWxsKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmFsdGVybmF0ZTtcblxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICBuZXh0Q3VycmVudEhvb2sgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRDdXJyZW50SG9vayA9IG51bGw7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG5leHRDdXJyZW50SG9vayA9IGN1cnJlbnRIb29rLm5leHQ7XG4gIH1cblxuICB2YXIgbmV4dFdvcmtJblByb2dyZXNzSG9vaztcblxuICBpZiAod29ya0luUHJvZ3Jlc3NIb29rID09PSBudWxsKSB7XG4gICAgbmV4dFdvcmtJblByb2dyZXNzSG9vayA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubWVtb2l6ZWRTdGF0ZTtcbiAgfSBlbHNlIHtcbiAgICBuZXh0V29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQ7XG4gIH1cblxuICBpZiAobmV4dFdvcmtJblByb2dyZXNzSG9vayAhPT0gbnVsbCkge1xuICAgIC8vIFRoZXJlJ3MgYWxyZWFkeSBhIHdvcmstaW4tcHJvZ3Jlc3MuIFJldXNlIGl0LlxuICAgIHdvcmtJblByb2dyZXNzSG9vayA9IG5leHRXb3JrSW5Qcm9ncmVzc0hvb2s7XG4gICAgbmV4dFdvcmtJblByb2dyZXNzSG9vayA9IHdvcmtJblByb2dyZXNzSG9vay5uZXh0O1xuICAgIGN1cnJlbnRIb29rID0gbmV4dEN1cnJlbnRIb29rO1xuICB9IGVsc2Uge1xuICAgIC8vIENsb25lIGZyb20gdGhlIGN1cnJlbnQgaG9vay5cbiAgICBpZiAobmV4dEN1cnJlbnRIb29rID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlbmRlcmVkIG1vcmUgaG9va3MgdGhhbiBkdXJpbmcgdGhlIHByZXZpb3VzIHJlbmRlci4nKTtcbiAgICB9XG5cbiAgICBjdXJyZW50SG9vayA9IG5leHRDdXJyZW50SG9vaztcbiAgICB2YXIgbmV3SG9vayA9IHtcbiAgICAgIG1lbW9pemVkU3RhdGU6IGN1cnJlbnRIb29rLm1lbW9pemVkU3RhdGUsXG4gICAgICBiYXNlU3RhdGU6IGN1cnJlbnRIb29rLmJhc2VTdGF0ZSxcbiAgICAgIGJhc2VRdWV1ZTogY3VycmVudEhvb2suYmFzZVF1ZXVlLFxuICAgICAgcXVldWU6IGN1cnJlbnRIb29rLnF1ZXVlLFxuICAgICAgbmV4dDogbnVsbFxuICAgIH07XG5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3NIb29rID09PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBob29rIGluIHRoZSBsaXN0LlxuICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tZW1vaXplZFN0YXRlID0gd29ya0luUHJvZ3Jlc3NIb29rID0gbmV3SG9vaztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuXG4gICAgICB3b3JrSW5Qcm9ncmVzc0hvb2sgPSB3b3JrSW5Qcm9ncmVzc0hvb2submV4dCA9IG5ld0hvb2s7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzSG9vaztcbn1cblxuZnVuY3Rpb24gY3JlYXRlRnVuY3Rpb25Db21wb25lbnRVcGRhdGVRdWV1ZSgpIHtcbiAgcmV0dXJuIHtcbiAgICBsYXN0RWZmZWN0OiBudWxsLFxuICAgIHN0b3JlczogbnVsbFxuICB9O1xufVxuXG5mdW5jdGlvbiBiYXNpY1N0YXRlUmVkdWNlcihzdGF0ZSwgYWN0aW9uKSB7XG4gIC8vICRGbG93Rml4TWU6IEZsb3cgZG9lc24ndCBsaWtlIG1peGVkIHR5cGVzXG4gIHJldHVybiB0eXBlb2YgYWN0aW9uID09PSAnZnVuY3Rpb24nID8gYWN0aW9uKHN0YXRlKSA6IGFjdGlvbjtcbn1cblxuZnVuY3Rpb24gbW91bnRSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgaW5pdGlhbFN0YXRlO1xuXG4gIGlmIChpbml0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBpbml0aWFsU3RhdGUgPSBpbml0KGluaXRpYWxBcmcpO1xuICB9IGVsc2Uge1xuICAgIGluaXRpYWxTdGF0ZSA9IGluaXRpYWxBcmc7XG4gIH1cblxuICBob29rLm1lbW9pemVkU3RhdGUgPSBob29rLmJhc2VTdGF0ZSA9IGluaXRpYWxTdGF0ZTtcbiAgdmFyIHF1ZXVlID0ge1xuICAgIHBlbmRpbmc6IG51bGwsXG4gICAgaW50ZXJsZWF2ZWQ6IG51bGwsXG4gICAgbGFuZXM6IE5vTGFuZXMsXG4gICAgZGlzcGF0Y2g6IG51bGwsXG4gICAgbGFzdFJlbmRlcmVkUmVkdWNlcjogcmVkdWNlcixcbiAgICBsYXN0UmVuZGVyZWRTdGF0ZTogaW5pdGlhbFN0YXRlXG4gIH07XG4gIGhvb2sucXVldWUgPSBxdWV1ZTtcbiAgdmFyIGRpc3BhdGNoID0gcXVldWUuZGlzcGF0Y2ggPSBkaXNwYXRjaFJlZHVjZXJBY3Rpb24uYmluZChudWxsLCBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLCBxdWV1ZSk7XG4gIHJldHVybiBbaG9vay5tZW1vaXplZFN0YXRlLCBkaXNwYXRjaF07XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgcXVldWUgPSBob29rLnF1ZXVlO1xuXG4gIGlmIChxdWV1ZSA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2hvdWxkIGhhdmUgYSBxdWV1ZS4gVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgcXVldWUubGFzdFJlbmRlcmVkUmVkdWNlciA9IHJlZHVjZXI7XG4gIHZhciBjdXJyZW50ID0gY3VycmVudEhvb2s7IC8vIFRoZSBsYXN0IHJlYmFzZSB1cGRhdGUgdGhhdCBpcyBOT1QgcGFydCBvZiB0aGUgYmFzZSBzdGF0ZS5cblxuICB2YXIgYmFzZVF1ZXVlID0gY3VycmVudC5iYXNlUXVldWU7IC8vIFRoZSBsYXN0IHBlbmRpbmcgdXBkYXRlIHRoYXQgaGFzbid0IGJlZW4gcHJvY2Vzc2VkIHlldC5cblxuICB2YXIgcGVuZGluZ1F1ZXVlID0gcXVldWUucGVuZGluZztcblxuICBpZiAocGVuZGluZ1F1ZXVlICE9PSBudWxsKSB7XG4gICAgLy8gV2UgaGF2ZSBuZXcgdXBkYXRlcyB0aGF0IGhhdmVuJ3QgYmVlbiBwcm9jZXNzZWQgeWV0LlxuICAgIC8vIFdlJ2xsIGFkZCB0aGVtIHRvIHRoZSBiYXNlIHF1ZXVlLlxuICAgIGlmIChiYXNlUXVldWUgIT09IG51bGwpIHtcbiAgICAgIC8vIE1lcmdlIHRoZSBwZW5kaW5nIHF1ZXVlIGFuZCB0aGUgYmFzZSBxdWV1ZS5cbiAgICAgIHZhciBiYXNlRmlyc3QgPSBiYXNlUXVldWUubmV4dDtcbiAgICAgIHZhciBwZW5kaW5nRmlyc3QgPSBwZW5kaW5nUXVldWUubmV4dDtcbiAgICAgIGJhc2VRdWV1ZS5uZXh0ID0gcGVuZGluZ0ZpcnN0O1xuICAgICAgcGVuZGluZ1F1ZXVlLm5leHQgPSBiYXNlRmlyc3Q7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKGN1cnJlbnQuYmFzZVF1ZXVlICE9PSBiYXNlUXVldWUpIHtcbiAgICAgICAgLy8gSW50ZXJuYWwgaW52YXJpYW50IHRoYXQgc2hvdWxkIG5ldmVyIGhhcHBlbiwgYnV0IGZlYXNpYmx5IGNvdWxkIGluXG4gICAgICAgIC8vIHRoZSBmdXR1cmUgaWYgd2UgaW1wbGVtZW50IHJlc3VtaW5nLCBvciBzb21lIGZvcm0gb2YgdGhhdC5cbiAgICAgICAgZXJyb3IoJ0ludGVybmFsIGVycm9yOiBFeHBlY3RlZCB3b3JrLWluLXByb2dyZXNzIHF1ZXVlIHRvIGJlIGEgY2xvbmUuICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjdXJyZW50LmJhc2VRdWV1ZSA9IGJhc2VRdWV1ZSA9IHBlbmRpbmdRdWV1ZTtcbiAgICBxdWV1ZS5wZW5kaW5nID0gbnVsbDtcbiAgfVxuXG4gIGlmIChiYXNlUXVldWUgIT09IG51bGwpIHtcbiAgICAvLyBXZSBoYXZlIGEgcXVldWUgdG8gcHJvY2Vzcy5cbiAgICB2YXIgZmlyc3QgPSBiYXNlUXVldWUubmV4dDtcbiAgICB2YXIgbmV3U3RhdGUgPSBjdXJyZW50LmJhc2VTdGF0ZTtcbiAgICB2YXIgbmV3QmFzZVN0YXRlID0gbnVsbDtcbiAgICB2YXIgbmV3QmFzZVF1ZXVlRmlyc3QgPSBudWxsO1xuICAgIHZhciBuZXdCYXNlUXVldWVMYXN0ID0gbnVsbDtcbiAgICB2YXIgdXBkYXRlID0gZmlyc3Q7XG5cbiAgICBkbyB7XG4gICAgICB2YXIgdXBkYXRlTGFuZSA9IHVwZGF0ZS5sYW5lO1xuXG4gICAgICBpZiAoIWlzU3Vic2V0T2ZMYW5lcyhyZW5kZXJMYW5lcywgdXBkYXRlTGFuZSkpIHtcbiAgICAgICAgLy8gUHJpb3JpdHkgaXMgaW5zdWZmaWNpZW50LiBTa2lwIHRoaXMgdXBkYXRlLiBJZiB0aGlzIGlzIHRoZSBmaXJzdFxuICAgICAgICAvLyBza2lwcGVkIHVwZGF0ZSwgdGhlIHByZXZpb3VzIHVwZGF0ZS9zdGF0ZSBpcyB0aGUgbmV3IGJhc2VcbiAgICAgICAgLy8gdXBkYXRlL3N0YXRlLlxuICAgICAgICB2YXIgY2xvbmUgPSB7XG4gICAgICAgICAgbGFuZTogdXBkYXRlTGFuZSxcbiAgICAgICAgICBhY3Rpb246IHVwZGF0ZS5hY3Rpb24sXG4gICAgICAgICAgaGFzRWFnZXJTdGF0ZTogdXBkYXRlLmhhc0VhZ2VyU3RhdGUsXG4gICAgICAgICAgZWFnZXJTdGF0ZTogdXBkYXRlLmVhZ2VyU3RhdGUsXG4gICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChuZXdCYXNlUXVldWVMYXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgbmV3QmFzZVF1ZXVlRmlyc3QgPSBuZXdCYXNlUXVldWVMYXN0ID0gY2xvbmU7XG4gICAgICAgICAgbmV3QmFzZVN0YXRlID0gbmV3U3RhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3QmFzZVF1ZXVlTGFzdCA9IG5ld0Jhc2VRdWV1ZUxhc3QubmV4dCA9IGNsb25lO1xuICAgICAgICB9IC8vIFVwZGF0ZSB0aGUgcmVtYWluaW5nIHByaW9yaXR5IGluIHRoZSBxdWV1ZS5cbiAgICAgICAgLy8gVE9ETzogRG9uJ3QgbmVlZCB0byBhY2N1bXVsYXRlIHRoaXMuIEluc3RlYWQsIHdlIGNhbiByZW1vdmVcbiAgICAgICAgLy8gcmVuZGVyTGFuZXMgZnJvbSB0aGUgb3JpZ2luYWwgbGFuZXMuXG5cblxuICAgICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzID0gbWVyZ2VMYW5lcyhjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzLCB1cGRhdGVMYW5lKTtcbiAgICAgICAgbWFya1NraXBwZWRVcGRhdGVMYW5lcyh1cGRhdGVMYW5lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgdXBkYXRlIGRvZXMgaGF2ZSBzdWZmaWNpZW50IHByaW9yaXR5LlxuICAgICAgICBpZiAobmV3QmFzZVF1ZXVlTGFzdCAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBfY2xvbmUgPSB7XG4gICAgICAgICAgICAvLyBUaGlzIHVwZGF0ZSBpcyBnb2luZyB0byBiZSBjb21taXR0ZWQgc28gd2UgbmV2ZXIgd2FudCB1bmNvbW1pdFxuICAgICAgICAgICAgLy8gaXQuIFVzaW5nIE5vTGFuZSB3b3JrcyBiZWNhdXNlIDAgaXMgYSBzdWJzZXQgb2YgYWxsIGJpdG1hc2tzLCBzb1xuICAgICAgICAgICAgLy8gdGhpcyB3aWxsIG5ldmVyIGJlIHNraXBwZWQgYnkgdGhlIGNoZWNrIGFib3ZlLlxuICAgICAgICAgICAgbGFuZTogTm9MYW5lLFxuICAgICAgICAgICAgYWN0aW9uOiB1cGRhdGUuYWN0aW9uLFxuICAgICAgICAgICAgaGFzRWFnZXJTdGF0ZTogdXBkYXRlLmhhc0VhZ2VyU3RhdGUsXG4gICAgICAgICAgICBlYWdlclN0YXRlOiB1cGRhdGUuZWFnZXJTdGF0ZSxcbiAgICAgICAgICAgIG5leHQ6IG51bGxcbiAgICAgICAgICB9O1xuICAgICAgICAgIG5ld0Jhc2VRdWV1ZUxhc3QgPSBuZXdCYXNlUXVldWVMYXN0Lm5leHQgPSBfY2xvbmU7XG4gICAgICAgIH0gLy8gUHJvY2VzcyB0aGlzIHVwZGF0ZS5cblxuXG4gICAgICAgIGlmICh1cGRhdGUuaGFzRWFnZXJTdGF0ZSkge1xuICAgICAgICAgIC8vIElmIHRoaXMgdXBkYXRlIGlzIGEgc3RhdGUgdXBkYXRlIChub3QgYSByZWR1Y2VyKSBhbmQgd2FzIHByb2Nlc3NlZCBlYWdlcmx5LFxuICAgICAgICAgIC8vIHdlIGNhbiB1c2UgdGhlIGVhZ2VybHkgY29tcHV0ZWQgc3RhdGVcbiAgICAgICAgICBuZXdTdGF0ZSA9IHVwZGF0ZS5lYWdlclN0YXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBhY3Rpb24gPSB1cGRhdGUuYWN0aW9uO1xuICAgICAgICAgIG5ld1N0YXRlID0gcmVkdWNlcihuZXdTdGF0ZSwgYWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB1cGRhdGUgPSB1cGRhdGUubmV4dDtcbiAgICB9IHdoaWxlICh1cGRhdGUgIT09IG51bGwgJiYgdXBkYXRlICE9PSBmaXJzdCk7XG5cbiAgICBpZiAobmV3QmFzZVF1ZXVlTGFzdCA9PT0gbnVsbCkge1xuICAgICAgbmV3QmFzZVN0YXRlID0gbmV3U3RhdGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0Jhc2VRdWV1ZUxhc3QubmV4dCA9IG5ld0Jhc2VRdWV1ZUZpcnN0O1xuICAgIH0gLy8gTWFyayB0aGF0IHRoZSBmaWJlciBwZXJmb3JtZWQgd29yaywgYnV0IG9ubHkgaWYgdGhlIG5ldyBzdGF0ZSBpc1xuICAgIC8vIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IHN0YXRlLlxuXG5cbiAgICBpZiAoIW9iamVjdElzKG5ld1N0YXRlLCBob29rLm1lbW9pemVkU3RhdGUpKSB7XG4gICAgICBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpO1xuICAgIH1cblxuICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICAgIGhvb2suYmFzZVN0YXRlID0gbmV3QmFzZVN0YXRlO1xuICAgIGhvb2suYmFzZVF1ZXVlID0gbmV3QmFzZVF1ZXVlTGFzdDtcbiAgICBxdWV1ZS5sYXN0UmVuZGVyZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9IC8vIEludGVybGVhdmVkIHVwZGF0ZXMgYXJlIHN0b3JlZCBvbiBhIHNlcGFyYXRlIHF1ZXVlLiBXZSBhcmVuJ3QgZ29pbmcgdG9cbiAgLy8gcHJvY2VzcyB0aGVtIGR1cmluZyB0aGlzIHJlbmRlciwgYnV0IHdlIGRvIG5lZWQgdG8gdHJhY2sgd2hpY2ggbGFuZXNcbiAgLy8gYXJlIHJlbWFpbmluZy5cblxuXG4gIHZhciBsYXN0SW50ZXJsZWF2ZWQgPSBxdWV1ZS5pbnRlcmxlYXZlZDtcblxuICBpZiAobGFzdEludGVybGVhdmVkICE9PSBudWxsKSB7XG4gICAgdmFyIGludGVybGVhdmVkID0gbGFzdEludGVybGVhdmVkO1xuXG4gICAgZG8ge1xuICAgICAgdmFyIGludGVybGVhdmVkTGFuZSA9IGludGVybGVhdmVkLmxhbmU7XG4gICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzID0gbWVyZ2VMYW5lcyhjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzLCBpbnRlcmxlYXZlZExhbmUpO1xuICAgICAgbWFya1NraXBwZWRVcGRhdGVMYW5lcyhpbnRlcmxlYXZlZExhbmUpO1xuICAgICAgaW50ZXJsZWF2ZWQgPSBpbnRlcmxlYXZlZC5uZXh0O1xuICAgIH0gd2hpbGUgKGludGVybGVhdmVkICE9PSBsYXN0SW50ZXJsZWF2ZWQpO1xuICB9IGVsc2UgaWYgKGJhc2VRdWV1ZSA9PT0gbnVsbCkge1xuICAgIC8vIGBxdWV1ZS5sYW5lc2AgaXMgdXNlZCBmb3IgZW50YW5nbGluZyB0cmFuc2l0aW9ucy4gV2UgY2FuIHNldCBpdCBiYWNrIHRvXG4gICAgLy8gemVybyBvbmNlIHRoZSBxdWV1ZSBpcyBlbXB0eS5cbiAgICBxdWV1ZS5sYW5lcyA9IE5vTGFuZXM7XG4gIH1cblxuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaDtcbiAgcmV0dXJuIFtob29rLm1lbW9pemVkU3RhdGUsIGRpc3BhdGNoXTtcbn1cblxuZnVuY3Rpb24gcmVyZW5kZXJSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIHF1ZXVlID0gaG9vay5xdWV1ZTtcblxuICBpZiAocXVldWUgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nob3VsZCBoYXZlIGEgcXVldWUuIFRoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxuXG4gIHF1ZXVlLmxhc3RSZW5kZXJlZFJlZHVjZXIgPSByZWR1Y2VyOyAvLyBUaGlzIGlzIGEgcmUtcmVuZGVyLiBBcHBseSB0aGUgbmV3IHJlbmRlciBwaGFzZSB1cGRhdGVzIHRvIHRoZSBwcmV2aW91c1xuICAvLyB3b3JrLWluLXByb2dyZXNzIGhvb2suXG5cbiAgdmFyIGRpc3BhdGNoID0gcXVldWUuZGlzcGF0Y2g7XG4gIHZhciBsYXN0UmVuZGVyUGhhc2VVcGRhdGUgPSBxdWV1ZS5wZW5kaW5nO1xuICB2YXIgbmV3U3RhdGUgPSBob29rLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKGxhc3RSZW5kZXJQaGFzZVVwZGF0ZSAhPT0gbnVsbCkge1xuICAgIC8vIFRoZSBxdWV1ZSBkb2Vzbid0IHBlcnNpc3QgcGFzdCB0aGlzIHJlbmRlciBwYXNzLlxuICAgIHF1ZXVlLnBlbmRpbmcgPSBudWxsO1xuICAgIHZhciBmaXJzdFJlbmRlclBoYXNlVXBkYXRlID0gbGFzdFJlbmRlclBoYXNlVXBkYXRlLm5leHQ7XG4gICAgdmFyIHVwZGF0ZSA9IGZpcnN0UmVuZGVyUGhhc2VVcGRhdGU7XG5cbiAgICBkbyB7XG4gICAgICAvLyBQcm9jZXNzIHRoaXMgcmVuZGVyIHBoYXNlIHVwZGF0ZS4gV2UgZG9uJ3QgaGF2ZSB0byBjaGVjayB0aGVcbiAgICAgIC8vIHByaW9yaXR5IGJlY2F1c2UgaXQgd2lsbCBhbHdheXMgYmUgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnRcbiAgICAgIC8vIHJlbmRlcidzLlxuICAgICAgdmFyIGFjdGlvbiA9IHVwZGF0ZS5hY3Rpb247XG4gICAgICBuZXdTdGF0ZSA9IHJlZHVjZXIobmV3U3RhdGUsIGFjdGlvbik7XG4gICAgICB1cGRhdGUgPSB1cGRhdGUubmV4dDtcbiAgICB9IHdoaWxlICh1cGRhdGUgIT09IGZpcnN0UmVuZGVyUGhhc2VVcGRhdGUpOyAvLyBNYXJrIHRoYXQgdGhlIGZpYmVyIHBlcmZvcm1lZCB3b3JrLCBidXQgb25seSBpZiB0aGUgbmV3IHN0YXRlIGlzXG4gICAgLy8gZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgc3RhdGUuXG5cblxuICAgIGlmICghb2JqZWN0SXMobmV3U3RhdGUsIGhvb2subWVtb2l6ZWRTdGF0ZSkpIHtcbiAgICAgIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCk7XG4gICAgfVxuXG4gICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7IC8vIERvbid0IHBlcnNpc3QgdGhlIHN0YXRlIGFjY3VtdWxhdGVkIGZyb20gdGhlIHJlbmRlciBwaGFzZSB1cGRhdGVzIHRvXG4gICAgLy8gdGhlIGJhc2Ugc3RhdGUgdW5sZXNzIHRoZSBxdWV1ZSBpcyBlbXB0eS5cbiAgICAvLyBUT0RPOiBOb3Qgc3VyZSBpZiB0aGlzIGlzIHRoZSBkZXNpcmVkIHNlbWFudGljcywgYnV0IGl0J3Mgd2hhdCB3ZVxuICAgIC8vIGRvIGZvciBnRFNGUC4gSSBjYW4ndCByZW1lbWJlciB3aHkuXG5cbiAgICBpZiAoaG9vay5iYXNlUXVldWUgPT09IG51bGwpIHtcbiAgICAgIGhvb2suYmFzZVN0YXRlID0gbmV3U3RhdGU7XG4gICAgfVxuXG4gICAgcXVldWUubGFzdFJlbmRlcmVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgfVxuXG4gIHJldHVybiBbbmV3U3RhdGUsIGRpc3BhdGNoXTtcbn1cblxuZnVuY3Rpb24gbW91bnRNdXRhYmxlU291cmNlKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVNdXRhYmxlU291cmNlKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudFN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gIHZhciBmaWJlciA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDE7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHRTbmFwc2hvdDtcbiAgdmFyIGlzSHlkcmF0aW5nID0gZ2V0SXNIeWRyYXRpbmcoKTtcblxuICBpZiAoaXNIeWRyYXRpbmcpIHtcbiAgICBpZiAoZ2V0U2VydmVyU25hcHNob3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGdldFNlcnZlclNuYXBzaG90LCB3aGljaCBpcyByZXF1aXJlZCBmb3IgJyArICdzZXJ2ZXItcmVuZGVyZWQgY29udGVudC4gV2lsbCByZXZlcnQgdG8gY2xpZW50IHJlbmRlcmluZy4nKTtcbiAgICB9XG5cbiAgICBuZXh0U25hcHNob3QgPSBnZXRTZXJ2ZXJTbmFwc2hvdCgpO1xuXG4gICAge1xuICAgICAgaWYgKCFkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCkge1xuICAgICAgICBpZiAobmV4dFNuYXBzaG90ICE9PSBnZXRTZXJ2ZXJTbmFwc2hvdCgpKSB7XG4gICAgICAgICAgZXJyb3IoJ1RoZSByZXN1bHQgb2YgZ2V0U2VydmVyU25hcHNob3Qgc2hvdWxkIGJlIGNhY2hlZCB0byBhdm9pZCBhbiBpbmZpbml0ZSBsb29wJyk7XG5cbiAgICAgICAgICBkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbmV4dFNuYXBzaG90ID0gZ2V0U25hcHNob3QoKTtcblxuICAgIHtcbiAgICAgIGlmICghZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QpIHtcbiAgICAgICAgdmFyIGNhY2hlZFNuYXBzaG90ID0gZ2V0U25hcHNob3QoKTtcblxuICAgICAgICBpZiAoIW9iamVjdElzKG5leHRTbmFwc2hvdCwgY2FjaGVkU25hcHNob3QpKSB7XG4gICAgICAgICAgZXJyb3IoJ1RoZSByZXN1bHQgb2YgZ2V0U25hcHNob3Qgc2hvdWxkIGJlIGNhY2hlZCB0byBhdm9pZCBhbiBpbmZpbml0ZSBsb29wJyk7XG5cbiAgICAgICAgICBkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIFVubGVzcyB3ZSdyZSByZW5kZXJpbmcgYSBibG9ja2luZyBsYW5lLCBzY2hlZHVsZSBhIGNvbnNpc3RlbmN5IGNoZWNrLlxuICAgIC8vIFJpZ2h0IGJlZm9yZSBjb21taXR0aW5nLCB3ZSB3aWxsIHdhbGsgdGhlIHRyZWUgYW5kIGNoZWNrIGlmIGFueSBvZiB0aGVcbiAgICAvLyBzdG9yZXMgd2VyZSBtdXRhdGVkLlxuICAgIC8vXG4gICAgLy8gV2Ugd29uJ3QgZG8gdGhpcyBpZiB3ZSdyZSBoeWRyYXRpbmcgc2VydmVyLXJlbmRlcmVkIGNvbnRlbnQsIGJlY2F1c2UgaWZcbiAgICAvLyB0aGUgY29udGVudCBpcyBzdGFsZSwgaXQncyBhbHJlYWR5IHZpc2libGUgYW55d2F5LiBJbnN0ZWFkIHdlJ2xsIHBhdGNoXG4gICAgLy8gaXQgdXAgaW4gYSBwYXNzaXZlIGVmZmVjdC5cblxuXG4gICAgdmFyIHJvb3QgPSBnZXRXb3JrSW5Qcm9ncmVzc1Jvb3QoKTtcblxuICAgIGlmIChyb290ID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGEgd29yay1pbi1wcm9ncmVzcyByb290LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG5cbiAgICBpZiAoIWluY2x1ZGVzQmxvY2tpbmdMYW5lKHJvb3QsIHJlbmRlckxhbmVzKSkge1xuICAgICAgcHVzaFN0b3JlQ29uc2lzdGVuY3lDaGVjayhmaWJlciwgZ2V0U25hcHNob3QsIG5leHRTbmFwc2hvdCk7XG4gICAgfVxuICB9IC8vIFJlYWQgdGhlIGN1cnJlbnQgc25hcHNob3QgZnJvbSB0aGUgc3RvcmUgb24gZXZlcnkgcmVuZGVyLiBUaGlzIGJyZWFrcyB0aGVcbiAgLy8gbm9ybWFsIHJ1bGVzIG9mIFJlYWN0LCBhbmQgb25seSB3b3JrcyBiZWNhdXNlIHN0b3JlIHVwZGF0ZXMgYXJlXG4gIC8vIGFsd2F5cyBzeW5jaHJvbm91cy5cblxuXG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5leHRTbmFwc2hvdDtcbiAgdmFyIGluc3QgPSB7XG4gICAgdmFsdWU6IG5leHRTbmFwc2hvdCxcbiAgICBnZXRTbmFwc2hvdDogZ2V0U25hcHNob3RcbiAgfTtcbiAgaG9vay5xdWV1ZSA9IGluc3Q7IC8vIFNjaGVkdWxlIGFuIGVmZmVjdCB0byBzdWJzY3JpYmUgdG8gdGhlIHN0b3JlLlxuXG4gIG1vdW50RWZmZWN0KHN1YnNjcmliZVRvU3RvcmUuYmluZChudWxsLCBmaWJlciwgaW5zdCwgc3Vic2NyaWJlKSwgW3N1YnNjcmliZV0pOyAvLyBTY2hlZHVsZSBhbiBlZmZlY3QgdG8gdXBkYXRlIHRoZSBtdXRhYmxlIGluc3RhbmNlIGZpZWxkcy4gV2Ugd2lsbCB1cGRhdGVcbiAgLy8gdGhpcyB3aGVuZXZlciBzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBvciB2YWx1ZSBjaGFuZ2VzLiBCZWNhdXNlIHRoZXJlJ3Mgbm9cbiAgLy8gY2xlYW4tdXAgZnVuY3Rpb24sIGFuZCB3ZSB0cmFjayB0aGUgZGVwcyBjb3JyZWN0bHksIHdlIGNhbiBjYWxsIHB1c2hFZmZlY3RcbiAgLy8gZGlyZWN0bHksIHdpdGhvdXQgc3RvcmluZyBhbnkgYWRkaXRpb25hbCBzdGF0ZS4gRm9yIHRoZSBzYW1lIHJlYXNvbiwgd2VcbiAgLy8gZG9uJ3QgbmVlZCB0byBzZXQgYSBzdGF0aWMgZmxhZywgZWl0aGVyLlxuICAvLyBUT0RPOiBXZSBjYW4gbW92ZSB0aGlzIHRvIHRoZSBwYXNzaXZlIHBoYXNlIG9uY2Ugd2UgYWRkIGEgcHJlLWNvbW1pdFxuICAvLyBjb25zaXN0ZW5jeSBjaGVjay4gU2VlIHRoZSBuZXh0IGNvbW1lbnQuXG5cbiAgZmliZXIuZmxhZ3MgfD0gUGFzc2l2ZTtcbiAgcHVzaEVmZmVjdChIYXNFZmZlY3QgfCBQYXNzaXZlJDEsIHVwZGF0ZVN0b3JlSW5zdGFuY2UuYmluZChudWxsLCBmaWJlciwgaW5zdCwgbmV4dFNuYXBzaG90LCBnZXRTbmFwc2hvdCksIHVuZGVmaW5lZCwgbnVsbCk7XG4gIHJldHVybiBuZXh0U25hcHNob3Q7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gIHZhciBmaWJlciA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDE7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7IC8vIFJlYWQgdGhlIGN1cnJlbnQgc25hcHNob3QgZnJvbSB0aGUgc3RvcmUgb24gZXZlcnkgcmVuZGVyLiBUaGlzIGJyZWFrcyB0aGVcbiAgLy8gbm9ybWFsIHJ1bGVzIG9mIFJlYWN0LCBhbmQgb25seSB3b3JrcyBiZWNhdXNlIHN0b3JlIHVwZGF0ZXMgYXJlXG4gIC8vIGFsd2F5cyBzeW5jaHJvbm91cy5cblxuICB2YXIgbmV4dFNuYXBzaG90ID0gZ2V0U25hcHNob3QoKTtcblxuICB7XG4gICAgaWYgKCFkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCkge1xuICAgICAgdmFyIGNhY2hlZFNuYXBzaG90ID0gZ2V0U25hcHNob3QoKTtcblxuICAgICAgaWYgKCFvYmplY3RJcyhuZXh0U25hcHNob3QsIGNhY2hlZFNuYXBzaG90KSkge1xuICAgICAgICBlcnJvcignVGhlIHJlc3VsdCBvZiBnZXRTbmFwc2hvdCBzaG91bGQgYmUgY2FjaGVkIHRvIGF2b2lkIGFuIGluZmluaXRlIGxvb3AnKTtcblxuICAgICAgICBkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHByZXZTbmFwc2hvdCA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHNuYXBzaG90Q2hhbmdlZCA9ICFvYmplY3RJcyhwcmV2U25hcHNob3QsIG5leHRTbmFwc2hvdCk7XG5cbiAgaWYgKHNuYXBzaG90Q2hhbmdlZCkge1xuICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5leHRTbmFwc2hvdDtcbiAgICBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpO1xuICB9XG5cbiAgdmFyIGluc3QgPSBob29rLnF1ZXVlO1xuICB1cGRhdGVFZmZlY3Qoc3Vic2NyaWJlVG9TdG9yZS5iaW5kKG51bGwsIGZpYmVyLCBpbnN0LCBzdWJzY3JpYmUpLCBbc3Vic2NyaWJlXSk7IC8vIFdoZW5ldmVyIGdldFNuYXBzaG90IG9yIHN1YnNjcmliZSBjaGFuZ2VzLCB3ZSBuZWVkIHRvIGNoZWNrIGluIHRoZVxuICAvLyBjb21taXQgcGhhc2UgaWYgdGhlcmUgd2FzIGFuIGludGVybGVhdmVkIG11dGF0aW9uLiBJbiBjb25jdXJyZW50IG1vZGVcbiAgLy8gdGhpcyBjYW4gaGFwcGVuIGFsbCB0aGUgdGltZSwgYnV0IGV2ZW4gaW4gc3luY2hyb25vdXMgbW9kZSwgYW4gZWFybGllclxuICAvLyBlZmZlY3QgbWF5IGhhdmUgbXV0YXRlZCB0aGUgc3RvcmUuXG5cbiAgaWYgKGluc3QuZ2V0U25hcHNob3QgIT09IGdldFNuYXBzaG90IHx8IHNuYXBzaG90Q2hhbmdlZCB8fCAvLyBDaGVjayBpZiB0aGUgc3VzYmNyaWJlIGZ1bmN0aW9uIGNoYW5nZWQuIFdlIGNhbiBzYXZlIHNvbWUgbWVtb3J5IGJ5XG4gIC8vIGNoZWNraW5nIHdoZXRoZXIgd2Ugc2NoZWR1bGVkIGEgc3Vic2NyaXB0aW9uIGVmZmVjdCBhYm92ZS5cbiAgd29ya0luUHJvZ3Jlc3NIb29rICE9PSBudWxsICYmIHdvcmtJblByb2dyZXNzSG9vay5tZW1vaXplZFN0YXRlLnRhZyAmIEhhc0VmZmVjdCkge1xuICAgIGZpYmVyLmZsYWdzIHw9IFBhc3NpdmU7XG4gICAgcHVzaEVmZmVjdChIYXNFZmZlY3QgfCBQYXNzaXZlJDEsIHVwZGF0ZVN0b3JlSW5zdGFuY2UuYmluZChudWxsLCBmaWJlciwgaW5zdCwgbmV4dFNuYXBzaG90LCBnZXRTbmFwc2hvdCksIHVuZGVmaW5lZCwgbnVsbCk7IC8vIFVubGVzcyB3ZSdyZSByZW5kZXJpbmcgYSBibG9ja2luZyBsYW5lLCBzY2hlZHVsZSBhIGNvbnNpc3RlbmN5IGNoZWNrLlxuICAgIC8vIFJpZ2h0IGJlZm9yZSBjb21taXR0aW5nLCB3ZSB3aWxsIHdhbGsgdGhlIHRyZWUgYW5kIGNoZWNrIGlmIGFueSBvZiB0aGVcbiAgICAvLyBzdG9yZXMgd2VyZSBtdXRhdGVkLlxuXG4gICAgdmFyIHJvb3QgPSBnZXRXb3JrSW5Qcm9ncmVzc1Jvb3QoKTtcblxuICAgIGlmIChyb290ID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGEgd29yay1pbi1wcm9ncmVzcyByb290LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG5cbiAgICBpZiAoIWluY2x1ZGVzQmxvY2tpbmdMYW5lKHJvb3QsIHJlbmRlckxhbmVzKSkge1xuICAgICAgcHVzaFN0b3JlQ29uc2lzdGVuY3lDaGVjayhmaWJlciwgZ2V0U25hcHNob3QsIG5leHRTbmFwc2hvdCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5leHRTbmFwc2hvdDtcbn1cblxuZnVuY3Rpb24gcHVzaFN0b3JlQ29uc2lzdGVuY3lDaGVjayhmaWJlciwgZ2V0U25hcHNob3QsIHJlbmRlcmVkU25hcHNob3QpIHtcbiAgZmliZXIuZmxhZ3MgfD0gU3RvcmVDb25zaXN0ZW5jeTtcbiAgdmFyIGNoZWNrID0ge1xuICAgIGdldFNuYXBzaG90OiBnZXRTbmFwc2hvdCxcbiAgICB2YWx1ZTogcmVuZGVyZWRTbmFwc2hvdFxuICB9O1xuICB2YXIgY29tcG9uZW50VXBkYXRlUXVldWUgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLnVwZGF0ZVF1ZXVlO1xuXG4gIGlmIChjb21wb25lbnRVcGRhdGVRdWV1ZSA9PT0gbnVsbCkge1xuICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlID0gY3JlYXRlRnVuY3Rpb25Db21wb25lbnRVcGRhdGVRdWV1ZSgpO1xuICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEudXBkYXRlUXVldWUgPSBjb21wb25lbnRVcGRhdGVRdWV1ZTtcbiAgICBjb21wb25lbnRVcGRhdGVRdWV1ZS5zdG9yZXMgPSBbY2hlY2tdO1xuICB9IGVsc2Uge1xuICAgIHZhciBzdG9yZXMgPSBjb21wb25lbnRVcGRhdGVRdWV1ZS5zdG9yZXM7XG5cbiAgICBpZiAoc3RvcmVzID09PSBudWxsKSB7XG4gICAgICBjb21wb25lbnRVcGRhdGVRdWV1ZS5zdG9yZXMgPSBbY2hlY2tdO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG9yZXMucHVzaChjaGVjayk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN0b3JlSW5zdGFuY2UoZmliZXIsIGluc3QsIG5leHRTbmFwc2hvdCwgZ2V0U25hcHNob3QpIHtcbiAgLy8gVGhlc2UgYXJlIHVwZGF0ZWQgaW4gdGhlIHBhc3NpdmUgcGhhc2VcbiAgaW5zdC52YWx1ZSA9IG5leHRTbmFwc2hvdDtcbiAgaW5zdC5nZXRTbmFwc2hvdCA9IGdldFNuYXBzaG90OyAvLyBTb21ldGhpbmcgbWF5IGhhdmUgYmVlbiBtdXRhdGVkIGluIGJldHdlZW4gcmVuZGVyIGFuZCBjb21taXQuIFRoaXMgY291bGRcbiAgLy8gaGF2ZSBiZWVuIGluIGFuIGV2ZW50IHRoYXQgZmlyZWQgYmVmb3JlIHRoZSBwYXNzaXZlIGVmZmVjdHMsIG9yIGl0IGNvdWxkXG4gIC8vIGhhdmUgYmVlbiBpbiBhIGxheW91dCBlZmZlY3QuIEluIHRoYXQgY2FzZSwgd2Ugd291bGQgaGF2ZSB1c2VkIHRoZSBvbGRcbiAgLy8gc25hcHNobyBhbmQgZ2V0U25hcHNob3QgdmFsdWVzIHRvIGJhaWwgb3V0LiBXZSBuZWVkIHRvIGNoZWNrIG9uZSBtb3JlIHRpbWUuXG5cbiAgaWYgKGNoZWNrSWZTbmFwc2hvdENoYW5nZWQoaW5zdCkpIHtcbiAgICAvLyBGb3JjZSBhIHJlLXJlbmRlci5cbiAgICBmb3JjZVN0b3JlUmVyZW5kZXIoZmliZXIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN1YnNjcmliZVRvU3RvcmUoZmliZXIsIGluc3QsIHN1YnNjcmliZSkge1xuICB2YXIgaGFuZGxlU3RvcmVDaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gVGhlIHN0b3JlIGNoYW5nZWQuIENoZWNrIGlmIHRoZSBzbmFwc2hvdCBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgd2VcbiAgICAvLyByZWFkIGZyb20gdGhlIHN0b3JlLlxuICAgIGlmIChjaGVja0lmU25hcHNob3RDaGFuZ2VkKGluc3QpKSB7XG4gICAgICAvLyBGb3JjZSBhIHJlLXJlbmRlci5cbiAgICAgIGZvcmNlU3RvcmVSZXJlbmRlcihmaWJlcik7XG4gICAgfVxuICB9OyAvLyBTdWJzY3JpYmUgdG8gdGhlIHN0b3JlIGFuZCByZXR1cm4gYSBjbGVhbi11cCBmdW5jdGlvbi5cblxuXG4gIHJldHVybiBzdWJzY3JpYmUoaGFuZGxlU3RvcmVDaGFuZ2UpO1xufVxuXG5mdW5jdGlvbiBjaGVja0lmU25hcHNob3RDaGFuZ2VkKGluc3QpIHtcbiAgdmFyIGxhdGVzdEdldFNuYXBzaG90ID0gaW5zdC5nZXRTbmFwc2hvdDtcbiAgdmFyIHByZXZWYWx1ZSA9IGluc3QudmFsdWU7XG5cbiAgdHJ5IHtcbiAgICB2YXIgbmV4dFZhbHVlID0gbGF0ZXN0R2V0U25hcHNob3QoKTtcbiAgICByZXR1cm4gIW9iamVjdElzKHByZXZWYWx1ZSwgbmV4dFZhbHVlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JjZVN0b3JlUmVyZW5kZXIoZmliZXIpIHtcbiAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudFN0YXRlKGluaXRpYWxTdGF0ZSkge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG5cbiAgaWYgKHR5cGVvZiBpbml0aWFsU3RhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyAkRmxvd0ZpeE1lOiBGbG93IGRvZXNuJ3QgbGlrZSBtaXhlZCB0eXBlc1xuICAgIGluaXRpYWxTdGF0ZSA9IGluaXRpYWxTdGF0ZSgpO1xuICB9XG5cbiAgaG9vay5tZW1vaXplZFN0YXRlID0gaG9vay5iYXNlU3RhdGUgPSBpbml0aWFsU3RhdGU7XG4gIHZhciBxdWV1ZSA9IHtcbiAgICBwZW5kaW5nOiBudWxsLFxuICAgIGludGVybGVhdmVkOiBudWxsLFxuICAgIGxhbmVzOiBOb0xhbmVzLFxuICAgIGRpc3BhdGNoOiBudWxsLFxuICAgIGxhc3RSZW5kZXJlZFJlZHVjZXI6IGJhc2ljU3RhdGVSZWR1Y2VyLFxuICAgIGxhc3RSZW5kZXJlZFN0YXRlOiBpbml0aWFsU3RhdGVcbiAgfTtcbiAgaG9vay5xdWV1ZSA9IHF1ZXVlO1xuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaCA9IGRpc3BhdGNoU2V0U3RhdGUuYmluZChudWxsLCBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLCBxdWV1ZSk7XG4gIHJldHVybiBbaG9vay5tZW1vaXplZFN0YXRlLCBkaXNwYXRjaF07XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN0YXRlKGluaXRpYWxTdGF0ZSkge1xuICByZXR1cm4gdXBkYXRlUmVkdWNlcihiYXNpY1N0YXRlUmVkdWNlcik7XG59XG5cbmZ1bmN0aW9uIHJlcmVuZGVyU3RhdGUoaW5pdGlhbFN0YXRlKSB7XG4gIHJldHVybiByZXJlbmRlclJlZHVjZXIoYmFzaWNTdGF0ZVJlZHVjZXIpO1xufVxuXG5mdW5jdGlvbiBwdXNoRWZmZWN0KHRhZywgY3JlYXRlLCBkZXN0cm95LCBkZXBzKSB7XG4gIHZhciBlZmZlY3QgPSB7XG4gICAgdGFnOiB0YWcsXG4gICAgY3JlYXRlOiBjcmVhdGUsXG4gICAgZGVzdHJveTogZGVzdHJveSxcbiAgICBkZXBzOiBkZXBzLFxuICAgIC8vIENpcmN1bGFyXG4gICAgbmV4dDogbnVsbFxuICB9O1xuICB2YXIgY29tcG9uZW50VXBkYXRlUXVldWUgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLnVwZGF0ZVF1ZXVlO1xuXG4gIGlmIChjb21wb25lbnRVcGRhdGVRdWV1ZSA9PT0gbnVsbCkge1xuICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlID0gY3JlYXRlRnVuY3Rpb25Db21wb25lbnRVcGRhdGVRdWV1ZSgpO1xuICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEudXBkYXRlUXVldWUgPSBjb21wb25lbnRVcGRhdGVRdWV1ZTtcbiAgICBjb21wb25lbnRVcGRhdGVRdWV1ZS5sYXN0RWZmZWN0ID0gZWZmZWN0Lm5leHQgPSBlZmZlY3Q7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGxhc3RFZmZlY3QgPSBjb21wb25lbnRVcGRhdGVRdWV1ZS5sYXN0RWZmZWN0O1xuXG4gICAgaWYgKGxhc3RFZmZlY3QgPT09IG51bGwpIHtcbiAgICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgPSBlZmZlY3QubmV4dCA9IGVmZmVjdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGZpcnN0RWZmZWN0ID0gbGFzdEVmZmVjdC5uZXh0O1xuICAgICAgbGFzdEVmZmVjdC5uZXh0ID0gZWZmZWN0O1xuICAgICAgZWZmZWN0Lm5leHQgPSBmaXJzdEVmZmVjdDtcbiAgICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgPSBlZmZlY3Q7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVmZmVjdDtcbn1cblxuZnVuY3Rpb24gbW91bnRSZWYoaW5pdGlhbFZhbHVlKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcblxuICB7XG4gICAgdmFyIF9yZWYyID0ge1xuICAgICAgY3VycmVudDogaW5pdGlhbFZhbHVlXG4gICAgfTtcbiAgICBob29rLm1lbW9pemVkU3RhdGUgPSBfcmVmMjtcbiAgICByZXR1cm4gX3JlZjI7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlUmVmKGluaXRpYWxWYWx1ZSkge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICByZXR1cm4gaG9vay5tZW1vaXplZFN0YXRlO1xufVxuXG5mdW5jdGlvbiBtb3VudEVmZmVjdEltcGwoZmliZXJGbGFncywgaG9va0ZsYWdzLCBjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5mbGFncyB8PSBmaWJlckZsYWdzO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBwdXNoRWZmZWN0KEhhc0VmZmVjdCB8IGhvb2tGbGFncywgY3JlYXRlLCB1bmRlZmluZWQsIG5leHREZXBzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRWZmZWN0SW1wbChmaWJlckZsYWdzLCBob29rRmxhZ3MsIGNyZWF0ZSwgZGVwcykge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgdmFyIGRlc3Ryb3kgPSB1bmRlZmluZWQ7XG5cbiAgaWYgKGN1cnJlbnRIb29rICE9PSBudWxsKSB7XG4gICAgdmFyIHByZXZFZmZlY3QgPSBjdXJyZW50SG9vay5tZW1vaXplZFN0YXRlO1xuICAgIGRlc3Ryb3kgPSBwcmV2RWZmZWN0LmRlc3Ryb3k7XG5cbiAgICBpZiAobmV4dERlcHMgIT09IG51bGwpIHtcbiAgICAgIHZhciBwcmV2RGVwcyA9IHByZXZFZmZlY3QuZGVwcztcblxuICAgICAgaWYgKGFyZUhvb2tJbnB1dHNFcXVhbChuZXh0RGVwcywgcHJldkRlcHMpKSB7XG4gICAgICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHB1c2hFZmZlY3QoaG9va0ZsYWdzLCBjcmVhdGUsIGRlc3Ryb3ksIG5leHREZXBzKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEuZmxhZ3MgfD0gZmliZXJGbGFncztcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gcHVzaEVmZmVjdChIYXNFZmZlY3QgfCBob29rRmxhZ3MsIGNyZWF0ZSwgZGVzdHJveSwgbmV4dERlcHMpO1xufVxuXG5mdW5jdGlvbiBtb3VudEVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgaWYgKCAoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICByZXR1cm4gbW91bnRFZmZlY3RJbXBsKE1vdW50UGFzc2l2ZURldiB8IFBhc3NpdmUgfCBQYXNzaXZlU3RhdGljLCBQYXNzaXZlJDEsIGNyZWF0ZSwgZGVwcyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG1vdW50RWZmZWN0SW1wbChQYXNzaXZlIHwgUGFzc2l2ZVN0YXRpYywgUGFzc2l2ZSQxLCBjcmVhdGUsIGRlcHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgcmV0dXJuIHVwZGF0ZUVmZmVjdEltcGwoUGFzc2l2ZSwgUGFzc2l2ZSQxLCBjcmVhdGUsIGRlcHMpO1xufVxuXG5mdW5jdGlvbiBtb3VudEluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgcmV0dXJuIG1vdW50RWZmZWN0SW1wbChVcGRhdGUsIEluc2VydGlvbiwgY3JlYXRlLCBkZXBzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICByZXR1cm4gdXBkYXRlRWZmZWN0SW1wbChVcGRhdGUsIEluc2VydGlvbiwgY3JlYXRlLCBkZXBzKTtcbn1cblxuZnVuY3Rpb24gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBmaWJlckZsYWdzID0gVXBkYXRlO1xuXG4gIHtcbiAgICBmaWJlckZsYWdzIHw9IExheW91dFN0YXRpYztcbiAgfVxuXG4gIGlmICggKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgZmliZXJGbGFncyB8PSBNb3VudExheW91dERldjtcbiAgfVxuXG4gIHJldHVybiBtb3VudEVmZmVjdEltcGwoZmliZXJGbGFncywgTGF5b3V0LCBjcmVhdGUsIGRlcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHJldHVybiB1cGRhdGVFZmZlY3RJbXBsKFVwZGF0ZSwgTGF5b3V0LCBjcmVhdGUsIGRlcHMpO1xufVxuXG5mdW5jdGlvbiBpbXBlcmF0aXZlSGFuZGxlRWZmZWN0KGNyZWF0ZSwgcmVmKSB7XG4gIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIHJlZkNhbGxiYWNrID0gcmVmO1xuXG4gICAgdmFyIF9pbnN0ID0gY3JlYXRlKCk7XG5cbiAgICByZWZDYWxsYmFjayhfaW5zdCk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlZkNhbGxiYWNrKG51bGwpO1xuICAgIH07XG4gIH0gZWxzZSBpZiAocmVmICE9PSBudWxsICYmIHJlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIHJlZk9iamVjdCA9IHJlZjtcblxuICAgIHtcbiAgICAgIGlmICghcmVmT2JqZWN0Lmhhc093blByb3BlcnR5KCdjdXJyZW50JykpIHtcbiAgICAgICAgZXJyb3IoJ0V4cGVjdGVkIHVzZUltcGVyYXRpdmVIYW5kbGUoKSBmaXJzdCBhcmd1bWVudCB0byBlaXRoZXIgYmUgYSAnICsgJ3JlZiBjYWxsYmFjayBvciBSZWFjdC5jcmVhdGVSZWYoKSBvYmplY3QuIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsICdhbiBvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMocmVmT2JqZWN0KS5qb2luKCcsICcpICsgJ30nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgX2luc3QyID0gY3JlYXRlKCk7XG5cbiAgICByZWZPYmplY3QuY3VycmVudCA9IF9pbnN0MjtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmVmT2JqZWN0LmN1cnJlbnQgPSBudWxsO1xuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGNyZWF0ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIHVzZUltcGVyYXRpdmVIYW5kbGUoKSBzZWNvbmQgYXJndW1lbnQgdG8gYmUgYSBmdW5jdGlvbiAnICsgJ3RoYXQgY3JlYXRlcyBhIGhhbmRsZS4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY3JlYXRlICE9PSBudWxsID8gdHlwZW9mIGNyZWF0ZSA6ICdudWxsJyk7XG4gICAgfVxuICB9IC8vIFRPRE86IElmIGRlcHMgYXJlIHByb3ZpZGVkLCBzaG91bGQgd2Ugc2tpcCBjb21wYXJpbmcgdGhlIHJlZiBpdHNlbGY/XG5cblxuICB2YXIgZWZmZWN0RGVwcyA9IGRlcHMgIT09IG51bGwgJiYgZGVwcyAhPT0gdW5kZWZpbmVkID8gZGVwcy5jb25jYXQoW3JlZl0pIDogbnVsbDtcbiAgdmFyIGZpYmVyRmxhZ3MgPSBVcGRhdGU7XG5cbiAge1xuICAgIGZpYmVyRmxhZ3MgfD0gTGF5b3V0U3RhdGljO1xuICB9XG5cbiAgaWYgKCAoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICBmaWJlckZsYWdzIHw9IE1vdW50TGF5b3V0RGV2O1xuICB9XG5cbiAgcmV0dXJuIG1vdW50RWZmZWN0SW1wbChmaWJlckZsYWdzLCBMYXlvdXQsIGltcGVyYXRpdmVIYW5kbGVFZmZlY3QuYmluZChudWxsLCBjcmVhdGUsIHJlZiksIGVmZmVjdERlcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGNyZWF0ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIHVzZUltcGVyYXRpdmVIYW5kbGUoKSBzZWNvbmQgYXJndW1lbnQgdG8gYmUgYSBmdW5jdGlvbiAnICsgJ3RoYXQgY3JlYXRlcyBhIGhhbmRsZS4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY3JlYXRlICE9PSBudWxsID8gdHlwZW9mIGNyZWF0ZSA6ICdudWxsJyk7XG4gICAgfVxuICB9IC8vIFRPRE86IElmIGRlcHMgYXJlIHByb3ZpZGVkLCBzaG91bGQgd2Ugc2tpcCBjb21wYXJpbmcgdGhlIHJlZiBpdHNlbGY/XG5cblxuICB2YXIgZWZmZWN0RGVwcyA9IGRlcHMgIT09IG51bGwgJiYgZGVwcyAhPT0gdW5kZWZpbmVkID8gZGVwcy5jb25jYXQoW3JlZl0pIDogbnVsbDtcbiAgcmV0dXJuIHVwZGF0ZUVmZmVjdEltcGwoVXBkYXRlLCBMYXlvdXQsIGltcGVyYXRpdmVIYW5kbGVFZmZlY3QuYmluZChudWxsLCBjcmVhdGUsIHJlZiksIGVmZmVjdERlcHMpO1xufVxuXG5mdW5jdGlvbiBtb3VudERlYnVnVmFsdWUodmFsdWUsIGZvcm1hdHRlckZuKSB7Ly8gVGhpcyBob29rIGlzIG5vcm1hbGx5IGEgbm8tb3AuXG4gIC8vIFRoZSByZWFjdC1kZWJ1Zy1ob29rcyBwYWNrYWdlIGluamVjdHMgaXRzIG93biBpbXBsZW1lbnRhdGlvblxuICAvLyBzbyB0aGF0IGUuZy4gRGV2VG9vbHMgY2FuIGRpc3BsYXkgY3VzdG9tIGhvb2sgdmFsdWVzLlxufVxuXG52YXIgdXBkYXRlRGVidWdWYWx1ZSA9IG1vdW50RGVidWdWYWx1ZTtcblxuZnVuY3Rpb24gbW91bnRDYWxsYmFjayhjYWxsYmFjaywgZGVwcykge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBbY2FsbGJhY2ssIG5leHREZXBzXTtcbiAgcmV0dXJuIGNhbGxiYWNrO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcykge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgdmFyIHByZXZTdGF0ZSA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgaWYgKG5leHREZXBzICE9PSBudWxsKSB7XG4gICAgICB2YXIgcHJldkRlcHMgPSBwcmV2U3RhdGVbMV07XG5cbiAgICAgIGlmIChhcmVIb29rSW5wdXRzRXF1YWwobmV4dERlcHMsIHByZXZEZXBzKSkge1xuICAgICAgICByZXR1cm4gcHJldlN0YXRlWzBdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IFtjYWxsYmFjaywgbmV4dERlcHNdO1xuICByZXR1cm4gY2FsbGJhY2s7XG59XG5cbmZ1bmN0aW9uIG1vdW50TWVtbyhuZXh0Q3JlYXRlLCBkZXBzKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIHZhciBuZXh0VmFsdWUgPSBuZXh0Q3JlYXRlKCk7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IFtuZXh0VmFsdWUsIG5leHREZXBzXTtcbiAgcmV0dXJuIG5leHRWYWx1ZTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTWVtbyhuZXh0Q3JlYXRlLCBkZXBzKSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzO1xuICB2YXIgcHJldlN0YXRlID0gaG9vay5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChwcmV2U3RhdGUgIT09IG51bGwpIHtcbiAgICAvLyBBc3N1bWUgdGhlc2UgYXJlIGRlZmluZWQuIElmIHRoZXkncmUgbm90LCBhcmVIb29rSW5wdXRzRXF1YWwgd2lsbCB3YXJuLlxuICAgIGlmIChuZXh0RGVwcyAhPT0gbnVsbCkge1xuICAgICAgdmFyIHByZXZEZXBzID0gcHJldlN0YXRlWzFdO1xuXG4gICAgICBpZiAoYXJlSG9va0lucHV0c0VxdWFsKG5leHREZXBzLCBwcmV2RGVwcykpIHtcbiAgICAgICAgcmV0dXJuIHByZXZTdGF0ZVswXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgbmV4dFZhbHVlID0gbmV4dENyZWF0ZSgpO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBbbmV4dFZhbHVlLCBuZXh0RGVwc107XG4gIHJldHVybiBuZXh0VmFsdWU7XG59XG5cbmZ1bmN0aW9uIG1vdW50RGVmZXJyZWRWYWx1ZSh2YWx1ZSkge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHZhbHVlO1xuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZURlZmVycmVkVmFsdWUodmFsdWUpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIHJlc29sdmVkQ3VycmVudEhvb2sgPSBjdXJyZW50SG9vaztcbiAgdmFyIHByZXZWYWx1ZSA9IHJlc29sdmVkQ3VycmVudEhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgcmV0dXJuIHVwZGF0ZURlZmVycmVkVmFsdWVJbXBsKGhvb2ssIHByZXZWYWx1ZSwgdmFsdWUpO1xufVxuXG5mdW5jdGlvbiByZXJlbmRlckRlZmVycmVkVmFsdWUodmFsdWUpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcblxuICBpZiAoY3VycmVudEhvb2sgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIGEgcmVyZW5kZXIgZHVyaW5nIGEgbW91bnQuXG4gICAgaG9vay5tZW1vaXplZFN0YXRlID0gdmFsdWU7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaXMgYSByZXJlbmRlciBkdXJpbmcgYW4gdXBkYXRlLlxuICAgIHZhciBwcmV2VmFsdWUgPSBjdXJyZW50SG9vay5tZW1vaXplZFN0YXRlO1xuICAgIHJldHVybiB1cGRhdGVEZWZlcnJlZFZhbHVlSW1wbChob29rLCBwcmV2VmFsdWUsIHZhbHVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVEZWZlcnJlZFZhbHVlSW1wbChob29rLCBwcmV2VmFsdWUsIHZhbHVlKSB7XG4gIHZhciBzaG91bGREZWZlclZhbHVlID0gIWluY2x1ZGVzT25seU5vblVyZ2VudExhbmVzKHJlbmRlckxhbmVzKTtcblxuICBpZiAoc2hvdWxkRGVmZXJWYWx1ZSkge1xuICAgIC8vIFRoaXMgaXMgYW4gdXJnZW50IHVwZGF0ZS4gSWYgdGhlIHZhbHVlIGhhcyBjaGFuZ2VkLCBrZWVwIHVzaW5nIHRoZVxuICAgIC8vIHByZXZpb3VzIHZhbHVlIGFuZCBzcGF3biBhIGRlZmVycmVkIHJlbmRlciB0byB1cGRhdGUgaXQgbGF0ZXIuXG4gICAgaWYgKCFvYmplY3RJcyh2YWx1ZSwgcHJldlZhbHVlKSkge1xuICAgICAgLy8gU2NoZWR1bGUgYSBkZWZlcnJlZCByZW5kZXJcbiAgICAgIHZhciBkZWZlcnJlZExhbmUgPSBjbGFpbU5leHRUcmFuc2l0aW9uTGFuZSgpO1xuICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5sYW5lcyA9IG1lcmdlTGFuZXMoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5sYW5lcywgZGVmZXJyZWRMYW5lKTtcbiAgICAgIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXMoZGVmZXJyZWRMYW5lKTsgLy8gU2V0IHRoaXMgdG8gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSByZW5kZXJlZCB2YWx1ZSBpcyBpbmNvbnNpc3RlbnRcbiAgICAgIC8vIGZyb20gdGhlIGxhdGVzdCB2YWx1ZS4gVGhlIG5hbWUgXCJiYXNlU3RhdGVcIiBkb2Vzbid0IHJlYWxseSBtYXRjaCBob3cgd2VcbiAgICAgIC8vIHVzZSBpdCBiZWNhdXNlIHdlJ3JlIHJldXNpbmcgYSBzdGF0ZSBob29rIGZpZWxkIGluc3RlYWQgb2YgY3JlYXRpbmcgYVxuICAgICAgLy8gbmV3IG9uZS5cblxuICAgICAgaG9vay5iYXNlU3RhdGUgPSB0cnVlO1xuICAgIH0gLy8gUmV1c2UgdGhlIHByZXZpb3VzIHZhbHVlXG5cblxuICAgIHJldHVybiBwcmV2VmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyBub3QgYW4gdXJnZW50IHVwZGF0ZSwgc28gd2UgY2FuIHVzZSB0aGUgbGF0ZXN0IHZhbHVlIHJlZ2FyZGxlc3NcbiAgICAvLyBvZiB3aGF0IGl0IGlzLiBObyBuZWVkIHRvIGRlZmVyIGl0LlxuICAgIC8vIEhvd2V2ZXIsIGlmIHdlJ3JlIGN1cnJlbnRseSBpbnNpZGUgYSBzcGF3bmVkIHJlbmRlciwgdGhlbiB3ZSBuZWVkIHRvIG1hcmtcbiAgICAvLyB0aGlzIGFzIGFuIHVwZGF0ZSB0byBwcmV2ZW50IHRoZSBmaWJlciBmcm9tIGJhaWxpbmcgb3V0LlxuICAgIC8vXG4gICAgLy8gYGJhc2VTdGF0ZWAgaXMgdHJ1ZSB3aGVuIHRoZSBjdXJyZW50IHZhbHVlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSByZW5kZXJlZFxuICAgIC8vIHZhbHVlLiBUaGUgbmFtZSBkb2Vzbid0IHJlYWxseSBtYXRjaCBob3cgd2UgdXNlIGl0IGJlY2F1c2Ugd2UncmUgcmV1c2luZ1xuICAgIC8vIGEgc3RhdGUgaG9vayBmaWVsZCBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG9uZS5cbiAgICBpZiAoaG9vay5iYXNlU3RhdGUpIHtcbiAgICAgIC8vIEZsaXAgdGhpcyBiYWNrIHRvIGZhbHNlLlxuICAgICAgaG9vay5iYXNlU3RhdGUgPSBmYWxzZTtcbiAgICAgIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCk7XG4gICAgfVxuXG4gICAgaG9vay5tZW1vaXplZFN0YXRlID0gdmFsdWU7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0YXJ0VHJhbnNpdGlvbihzZXRQZW5kaW5nLCBjYWxsYmFjaywgb3B0aW9ucykge1xuICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoaGlnaGVyRXZlbnRQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5LCBDb250aW51b3VzRXZlbnRQcmlvcml0eSkpO1xuICBzZXRQZW5kaW5nKHRydWUpO1xuICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQyLnRyYW5zaXRpb247XG4gIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDIudHJhbnNpdGlvbiA9IHt9O1xuICB2YXIgY3VycmVudFRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQyLnRyYW5zaXRpb247XG5cbiAge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDIudHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycyA9IG5ldyBTZXQoKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgc2V0UGVuZGluZyhmYWxzZSk7XG4gICAgY2FsbGJhY2soKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSk7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMi50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG5cbiAgICB7XG4gICAgICBpZiAocHJldlRyYW5zaXRpb24gPT09IG51bGwgJiYgY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMpIHtcbiAgICAgICAgdmFyIHVwZGF0ZWRGaWJlcnNDb3VudCA9IGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzLnNpemU7XG5cbiAgICAgICAgaWYgKHVwZGF0ZWRGaWJlcnNDb3VudCA+IDEwKSB7XG4gICAgICAgICAgd2FybignRGV0ZWN0ZWQgYSBsYXJnZSBudW1iZXIgb2YgdXBkYXRlcyBpbnNpZGUgc3RhcnRUcmFuc2l0aW9uLiAnICsgJ0lmIHRoaXMgaXMgZHVlIHRvIGEgc3Vic2NyaXB0aW9uIHBsZWFzZSByZS13cml0ZSBpdCB0byB1c2UgUmVhY3QgcHJvdmlkZWQgaG9va3MuICcgKyAnT3RoZXJ3aXNlIGNvbmN1cnJlbnQgbW9kZSBndWFyYW50ZWVzIGFyZSBvZmYgdGhlIHRhYmxlLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMuY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRUcmFuc2l0aW9uKCkge1xuICB2YXIgX21vdW50U3RhdGUgPSBtb3VudFN0YXRlKGZhbHNlKSxcbiAgICAgIGlzUGVuZGluZyA9IF9tb3VudFN0YXRlWzBdLFxuICAgICAgc2V0UGVuZGluZyA9IF9tb3VudFN0YXRlWzFdOyAvLyBUaGUgYHN0YXJ0YCBtZXRob2QgbmV2ZXIgY2hhbmdlcy5cblxuXG4gIHZhciBzdGFydCA9IHN0YXJ0VHJhbnNpdGlvbi5iaW5kKG51bGwsIHNldFBlbmRpbmcpO1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHN0YXJ0O1xuICByZXR1cm4gW2lzUGVuZGluZywgc3RhcnRdO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVUcmFuc2l0aW9uKCkge1xuICB2YXIgX3VwZGF0ZVN0YXRlID0gdXBkYXRlU3RhdGUoKSxcbiAgICAgIGlzUGVuZGluZyA9IF91cGRhdGVTdGF0ZVswXTtcblxuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgc3RhcnQgPSBob29rLm1lbW9pemVkU3RhdGU7XG4gIHJldHVybiBbaXNQZW5kaW5nLCBzdGFydF07XG59XG5cbmZ1bmN0aW9uIHJlcmVuZGVyVHJhbnNpdGlvbigpIHtcbiAgdmFyIF9yZXJlbmRlclN0YXRlID0gcmVyZW5kZXJTdGF0ZSgpLFxuICAgICAgaXNQZW5kaW5nID0gX3JlcmVuZGVyU3RhdGVbMF07XG5cbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIHN0YXJ0ID0gaG9vay5tZW1vaXplZFN0YXRlO1xuICByZXR1cm4gW2lzUGVuZGluZywgc3RhcnRdO1xufVxuXG52YXIgaXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZSA9IGZhbHNlO1xuZnVuY3Rpb24gZ2V0SXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZUluREVWKCkge1xuICB7XG4gICAgcmV0dXJuIGlzVXBkYXRpbmdPcGFxdWVWYWx1ZUluUmVuZGVyUGhhc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRJZCgpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgcm9vdCA9IGdldFdvcmtJblByb2dyZXNzUm9vdCgpOyAvLyBUT0RPOiBJbiBGaXp6LCBpZCBnZW5lcmF0aW9uIGlzIHNwZWNpZmljIHRvIGVhY2ggc2VydmVyIGNvbmZpZy4gTWF5YmUgd2VcbiAgLy8gc2hvdWxkIGRvIHRoaXMgaW4gRmliZXIsIHRvbz8gRGVmZXJyaW5nIHRoaXMgZGVjaXNpb24gZm9yIG5vdyBiZWNhdXNlXG4gIC8vIHRoZXJlJ3Mgbm8gb3RoZXIgcGxhY2UgdG8gc3RvcmUgdGhlIHByZWZpeCBleGNlcHQgZm9yIGFuIGludGVybmFsIGZpZWxkIG9uXG4gIC8vIHRoZSBwdWJsaWMgY3JlYXRlUm9vdCBvYmplY3QsIHdoaWNoIHRoZSBmaWJlciB0cmVlIGRvZXMgbm90IGN1cnJlbnRseSBoYXZlXG4gIC8vIGEgcmVmZXJlbmNlIHRvLlxuXG4gIHZhciBpZGVudGlmaWVyUHJlZml4ID0gcm9vdC5pZGVudGlmaWVyUHJlZml4O1xuICB2YXIgaWQ7XG5cbiAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICB2YXIgdHJlZUlkID0gZ2V0VHJlZUlkKCk7IC8vIFVzZSBhIGNhcHRpYWwgUiBwcmVmaXggZm9yIHNlcnZlci1nZW5lcmF0ZWQgaWRzLlxuXG4gICAgaWQgPSAnOicgKyBpZGVudGlmaWVyUHJlZml4ICsgJ1InICsgdHJlZUlkOyAvLyBVbmxlc3MgdGhpcyBpcyB0aGUgZmlyc3QgaWQgYXQgdGhpcyBsZXZlbCwgYXBwZW5kIGEgbnVtYmVyIGF0IHRoZSBlbmRcbiAgICAvLyB0aGF0IHJlcHJlc2VudHMgdGhlIHBvc2l0aW9uIG9mIHRoaXMgdXNlSWQgaG9vayBhbW9uZyBhbGwgdGhlIHVzZUlkXG4gICAgLy8gaG9va3MgZm9yIHRoaXMgZmliZXIuXG5cbiAgICB2YXIgbG9jYWxJZCA9IGxvY2FsSWRDb3VudGVyKys7XG5cbiAgICBpZiAobG9jYWxJZCA+IDApIHtcbiAgICAgIGlkICs9ICdIJyArIGxvY2FsSWQudG9TdHJpbmcoMzIpO1xuICAgIH1cblxuICAgIGlkICs9ICc6JztcbiAgfSBlbHNlIHtcbiAgICAvLyBVc2UgYSBsb3dlcmNhc2UgciBwcmVmaXggZm9yIGNsaWVudC1nZW5lcmF0ZWQgaWRzLlxuICAgIHZhciBnbG9iYWxDbGllbnRJZCA9IGdsb2JhbENsaWVudElkQ291bnRlcisrO1xuICAgIGlkID0gJzonICsgaWRlbnRpZmllclByZWZpeCArICdyJyArIGdsb2JhbENsaWVudElkLnRvU3RyaW5nKDMyKSArICc6JztcbiAgfVxuXG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IGlkO1xuICByZXR1cm4gaWQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUlkKCkge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgaWQgPSBob29rLm1lbW9pemVkU3RhdGU7XG4gIHJldHVybiBpZDtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hSZWR1Y2VyQWN0aW9uKGZpYmVyLCBxdWV1ZSwgYWN0aW9uKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1szXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoXCJTdGF0ZSB1cGRhdGVzIGZyb20gdGhlIHVzZVN0YXRlKCkgYW5kIHVzZVJlZHVjZXIoKSBIb29rcyBkb24ndCBzdXBwb3J0IHRoZSBcIiArICdzZWNvbmQgY2FsbGJhY2sgYXJndW1lbnQuIFRvIGV4ZWN1dGUgYSBzaWRlIGVmZmVjdCBhZnRlciAnICsgJ3JlbmRlcmluZywgZGVjbGFyZSBpdCBpbiB0aGUgY29tcG9uZW50IGJvZHkgd2l0aCB1c2VFZmZlY3QoKS4nKTtcbiAgICB9XG4gIH1cblxuICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgdmFyIHVwZGF0ZSA9IHtcbiAgICBsYW5lOiBsYW5lLFxuICAgIGFjdGlvbjogYWN0aW9uLFxuICAgIGhhc0VhZ2VyU3RhdGU6IGZhbHNlLFxuICAgIGVhZ2VyU3RhdGU6IG51bGwsXG4gICAgbmV4dDogbnVsbFxuICB9O1xuXG4gIGlmIChpc1JlbmRlclBoYXNlVXBkYXRlKGZpYmVyKSkge1xuICAgIGVucXVldWVSZW5kZXJQaGFzZVVwZGF0ZShxdWV1ZSwgdXBkYXRlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50SG9va1VwZGF0ZShmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgICAgIGVudGFuZ2xlVHJhbnNpdGlvblVwZGF0ZShyb290LCBxdWV1ZSwgbGFuZSk7XG4gICAgfVxuICB9XG5cbiAgbWFya1VwZGF0ZUluRGV2VG9vbHMoZmliZXIsIGxhbmUpO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaFNldFN0YXRlKGZpYmVyLCBxdWV1ZSwgYWN0aW9uKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1szXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoXCJTdGF0ZSB1cGRhdGVzIGZyb20gdGhlIHVzZVN0YXRlKCkgYW5kIHVzZVJlZHVjZXIoKSBIb29rcyBkb24ndCBzdXBwb3J0IHRoZSBcIiArICdzZWNvbmQgY2FsbGJhY2sgYXJndW1lbnQuIFRvIGV4ZWN1dGUgYSBzaWRlIGVmZmVjdCBhZnRlciAnICsgJ3JlbmRlcmluZywgZGVjbGFyZSBpdCBpbiB0aGUgY29tcG9uZW50IGJvZHkgd2l0aCB1c2VFZmZlY3QoKS4nKTtcbiAgICB9XG4gIH1cblxuICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgdmFyIHVwZGF0ZSA9IHtcbiAgICBsYW5lOiBsYW5lLFxuICAgIGFjdGlvbjogYWN0aW9uLFxuICAgIGhhc0VhZ2VyU3RhdGU6IGZhbHNlLFxuICAgIGVhZ2VyU3RhdGU6IG51bGwsXG4gICAgbmV4dDogbnVsbFxuICB9O1xuXG4gIGlmIChpc1JlbmRlclBoYXNlVXBkYXRlKGZpYmVyKSkge1xuICAgIGVucXVldWVSZW5kZXJQaGFzZVVwZGF0ZShxdWV1ZSwgdXBkYXRlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGZpYmVyLmxhbmVzID09PSBOb0xhbmVzICYmIChhbHRlcm5hdGUgPT09IG51bGwgfHwgYWx0ZXJuYXRlLmxhbmVzID09PSBOb0xhbmVzKSkge1xuICAgICAgLy8gVGhlIHF1ZXVlIGlzIGN1cnJlbnRseSBlbXB0eSwgd2hpY2ggbWVhbnMgd2UgY2FuIGVhZ2VybHkgY29tcHV0ZSB0aGVcbiAgICAgIC8vIG5leHQgc3RhdGUgYmVmb3JlIGVudGVyaW5nIHRoZSByZW5kZXIgcGhhc2UuIElmIHRoZSBuZXcgc3RhdGUgaXMgdGhlXG4gICAgICAvLyBzYW1lIGFzIHRoZSBjdXJyZW50IHN0YXRlLCB3ZSBtYXkgYmUgYWJsZSB0byBiYWlsIG91dCBlbnRpcmVseS5cbiAgICAgIHZhciBsYXN0UmVuZGVyZWRSZWR1Y2VyID0gcXVldWUubGFzdFJlbmRlcmVkUmVkdWNlcjtcblxuICAgICAgaWYgKGxhc3RSZW5kZXJlZFJlZHVjZXIgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIHByZXZEaXNwYXRjaGVyO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBjdXJyZW50U3RhdGUgPSBxdWV1ZS5sYXN0UmVuZGVyZWRTdGF0ZTtcbiAgICAgICAgICB2YXIgZWFnZXJTdGF0ZSA9IGxhc3RSZW5kZXJlZFJlZHVjZXIoY3VycmVudFN0YXRlLCBhY3Rpb24pOyAvLyBTdGFzaCB0aGUgZWFnZXJseSBjb21wdXRlZCBzdGF0ZSwgYW5kIHRoZSByZWR1Y2VyIHVzZWQgdG8gY29tcHV0ZVxuICAgICAgICAgIC8vIGl0LCBvbiB0aGUgdXBkYXRlIG9iamVjdC4gSWYgdGhlIHJlZHVjZXIgaGFzbid0IGNoYW5nZWQgYnkgdGhlXG4gICAgICAgICAgLy8gdGltZSB3ZSBlbnRlciB0aGUgcmVuZGVyIHBoYXNlLCB0aGVuIHRoZSBlYWdlciBzdGF0ZSBjYW4gYmUgdXNlZFxuICAgICAgICAgIC8vIHdpdGhvdXQgY2FsbGluZyB0aGUgcmVkdWNlciBhZ2Fpbi5cblxuICAgICAgICAgIHVwZGF0ZS5oYXNFYWdlclN0YXRlID0gdHJ1ZTtcbiAgICAgICAgICB1cGRhdGUuZWFnZXJTdGF0ZSA9IGVhZ2VyU3RhdGU7XG5cbiAgICAgICAgICBpZiAob2JqZWN0SXMoZWFnZXJTdGF0ZSwgY3VycmVudFN0YXRlKSkge1xuICAgICAgICAgICAgLy8gRmFzdCBwYXRoLiBXZSBjYW4gYmFpbCBvdXQgd2l0aG91dCBzY2hlZHVsaW5nIFJlYWN0IHRvIHJlLXJlbmRlci5cbiAgICAgICAgICAgIC8vIEl0J3Mgc3RpbGwgcG9zc2libGUgdGhhdCB3ZSdsbCBuZWVkIHRvIHJlYmFzZSB0aGlzIHVwZGF0ZSBsYXRlcixcbiAgICAgICAgICAgIC8vIGlmIHRoZSBjb21wb25lbnQgcmUtcmVuZGVycyBmb3IgYSBkaWZmZXJlbnQgcmVhc29uIGFuZCBieSB0aGF0XG4gICAgICAgICAgICAvLyB0aW1lIHRoZSByZWR1Y2VyIGhhcyBjaGFuZ2VkLlxuICAgICAgICAgICAgLy8gVE9ETzogRG8gd2Ugc3RpbGwgbmVlZCB0byBlbnRhbmdsZSB0cmFuc2l0aW9ucyBpbiB0aGlzIGNhc2U/XG4gICAgICAgICAgICBlbnF1ZXVlQ29uY3VycmVudEhvb2tVcGRhdGVBbmRFYWdlcmx5QmFpbG91dChmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikgey8vIFN1cHByZXNzIHRoZSBlcnJvci4gSXQgd2lsbCB0aHJvdyBhZ2FpbiBpbiB0aGUgcmVuZGVyIHBoYXNlLlxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudEhvb2tVcGRhdGUoZmliZXIsIHF1ZXVlLCB1cGRhdGUsIGxhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gICAgICBlbnRhbmdsZVRyYW5zaXRpb25VcGRhdGUocm9vdCwgcXVldWUsIGxhbmUpO1xuICAgIH1cbiAgfVxuXG4gIG1hcmtVcGRhdGVJbkRldlRvb2xzKGZpYmVyLCBsYW5lKTtcbn1cblxuZnVuY3Rpb24gaXNSZW5kZXJQaGFzZVVwZGF0ZShmaWJlcikge1xuICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuICByZXR1cm4gZmliZXIgPT09IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEgfHwgYWx0ZXJuYXRlICE9PSBudWxsICYmIGFsdGVybmF0ZSA9PT0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMTtcbn1cblxuZnVuY3Rpb24gZW5xdWV1ZVJlbmRlclBoYXNlVXBkYXRlKHF1ZXVlLCB1cGRhdGUpIHtcbiAgLy8gVGhpcyBpcyBhIHJlbmRlciBwaGFzZSB1cGRhdGUuIFN0YXNoIGl0IGluIGEgbGF6aWx5LWNyZWF0ZWQgbWFwIG9mXG4gIC8vIHF1ZXVlIC0+IGxpbmtlZCBsaXN0IG9mIHVwZGF0ZXMuIEFmdGVyIHRoaXMgcmVuZGVyIHBhc3MsIHdlJ2xsIHJlc3RhcnRcbiAgLy8gYW5kIGFwcGx5IHRoZSBzdGFzaGVkIHVwZGF0ZXMgb24gdG9wIG9mIHRoZSB3b3JrLWluLXByb2dyZXNzIGhvb2suXG4gIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyA9IGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSB0cnVlO1xuICB2YXIgcGVuZGluZyA9IHF1ZXVlLnBlbmRpbmc7XG5cbiAgaWYgKHBlbmRpbmcgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUuIENyZWF0ZSBhIGNpcmN1bGFyIGxpc3QuXG4gICAgdXBkYXRlLm5leHQgPSB1cGRhdGU7XG4gIH0gZWxzZSB7XG4gICAgdXBkYXRlLm5leHQgPSBwZW5kaW5nLm5leHQ7XG4gICAgcGVuZGluZy5uZXh0ID0gdXBkYXRlO1xuICB9XG5cbiAgcXVldWUucGVuZGluZyA9IHVwZGF0ZTtcbn0gLy8gVE9ETzogTW92ZSB0byBSZWFjdEZpYmVyQ29uY3VycmVudFVwZGF0ZXM/XG5cblxuZnVuY3Rpb24gZW50YW5nbGVUcmFuc2l0aW9uVXBkYXRlKHJvb3QsIHF1ZXVlLCBsYW5lKSB7XG4gIGlmIChpc1RyYW5zaXRpb25MYW5lKGxhbmUpKSB7XG4gICAgdmFyIHF1ZXVlTGFuZXMgPSBxdWV1ZS5sYW5lczsgLy8gSWYgYW55IGVudGFuZ2xlZCBsYW5lcyBhcmUgbm8gbG9uZ2VyIHBlbmRpbmcgb24gdGhlIHJvb3QsIHRoZW4gdGhleVxuICAgIC8vIG11c3QgaGF2ZSBmaW5pc2hlZC4gV2UgY2FuIHJlbW92ZSB0aGVtIGZyb20gdGhlIHNoYXJlZCBxdWV1ZSwgd2hpY2hcbiAgICAvLyByZXByZXNlbnRzIGEgc3VwZXJzZXQgb2YgdGhlIGFjdHVhbGx5IHBlbmRpbmcgbGFuZXMuIEluIHNvbWUgY2FzZXMgd2VcbiAgICAvLyBtYXkgZW50YW5nbGUgbW9yZSB0aGFuIHdlIG5lZWQgdG8sIGJ1dCB0aGF0J3MgT0suIEluIGZhY3QgaXQncyB3b3JzZSBpZlxuICAgIC8vIHdlICpkb24ndCogZW50YW5nbGUgd2hlbiB3ZSBzaG91bGQuXG5cbiAgICBxdWV1ZUxhbmVzID0gaW50ZXJzZWN0TGFuZXMocXVldWVMYW5lcywgcm9vdC5wZW5kaW5nTGFuZXMpOyAvLyBFbnRhbmdsZSB0aGUgbmV3IHRyYW5zaXRpb24gbGFuZSB3aXRoIHRoZSBvdGhlciB0cmFuc2l0aW9uIGxhbmVzLlxuXG4gICAgdmFyIG5ld1F1ZXVlTGFuZXMgPSBtZXJnZUxhbmVzKHF1ZXVlTGFuZXMsIGxhbmUpO1xuICAgIHF1ZXVlLmxhbmVzID0gbmV3UXVldWVMYW5lczsgLy8gRXZlbiBpZiBxdWV1ZS5sYW5lcyBhbHJlYWR5IGluY2x1ZGUgbGFuZSwgd2UgZG9uJ3Qga25vdyBmb3IgY2VydGFpbiBpZlxuICAgIC8vIHRoZSBsYW5lIGZpbmlzaGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgd2UgZW50YW5nbGVkIGl0LiBTbyB3ZSBuZWVkIHRvXG4gICAgLy8gZW50YW5nbGUgaXQgYWdhaW4sIGp1c3QgdG8gYmUgc3VyZS5cblxuICAgIG1hcmtSb290RW50YW5nbGVkKHJvb3QsIG5ld1F1ZXVlTGFuZXMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtVcGRhdGVJbkRldlRvb2xzKGZpYmVyLCBsYW5lLCBhY3Rpb24pIHtcblxuICB7XG4gICAgbWFya1N0YXRlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKTtcbiAgfVxufVxuXG52YXIgQ29udGV4dE9ubHlEaXNwYXRjaGVyID0ge1xuICByZWFkQ29udGV4dDogcmVhZENvbnRleHQsXG4gIHVzZUNhbGxiYWNrOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUNvbnRleHQ6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlRWZmZWN0OiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUltcGVyYXRpdmVIYW5kbGU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlSW5zZXJ0aW9uRWZmZWN0OiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUxheW91dEVmZmVjdDogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VNZW1vOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZVJlZHVjZXI6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlUmVmOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZVN0YXRlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZURlYnVnVmFsdWU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlRGVmZXJyZWRWYWx1ZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VUcmFuc2l0aW9uOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZU11dGFibGVTb3VyY2U6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlU3luY0V4dGVybmFsU3RvcmU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlSWQ6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG59O1xuXG52YXIgSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWID0gbnVsbDtcbnZhciBIb29rc0Rpc3BhdGNoZXJPbk1vdW50V2l0aEhvb2tUeXBlc0luREVWID0gbnVsbDtcbnZhciBIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWID0gbnVsbDtcbnZhciBIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgPSBudWxsO1xudmFyIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVYgPSBudWxsO1xudmFyIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWID0gbnVsbDtcbnZhciBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWID0gbnVsbDtcblxue1xuICB2YXIgd2FybkludmFsaWRDb250ZXh0QWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgIGVycm9yKCdDb250ZXh0IGNhbiBvbmx5IGJlIHJlYWQgd2hpbGUgUmVhY3QgaXMgcmVuZGVyaW5nLiAnICsgJ0luIGNsYXNzZXMsIHlvdSBjYW4gcmVhZCBpdCBpbiB0aGUgcmVuZGVyIG1ldGhvZCBvciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuICcgKyAnSW4gZnVuY3Rpb24gY29tcG9uZW50cywgeW91IGNhbiByZWFkIGl0IGRpcmVjdGx5IGluIHRoZSBmdW5jdGlvbiBib2R5LCBidXQgbm90ICcgKyAnaW5zaWRlIEhvb2tzIGxpa2UgdXNlUmVkdWNlcigpIG9yIHVzZU1lbW8oKS4nKTtcbiAgfTtcblxuICB2YXIgd2FybkludmFsaWRIb29rQWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgIGVycm9yKCdEbyBub3QgY2FsbCBIb29rcyBpbnNpZGUgdXNlRWZmZWN0KC4uLiksIHVzZU1lbW8oLi4uKSwgb3Igb3RoZXIgYnVpbHQtaW4gSG9va3MuICcgKyAnWW91IGNhbiBvbmx5IGNhbGwgSG9va3MgYXQgdGhlIHRvcCBsZXZlbCBvZiB5b3VyIFJlYWN0IGZ1bmN0aW9uLiAnICsgJ0ZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvcnVsZXMtb2YtaG9va3MnKTtcbiAgfTtcblxuICBIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICByZXR1cm4gbW91bnRDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpO1xuICAgICAgcmV0dXJuIG1vdW50RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpO1xuICAgICAgcmV0dXJuIG1vdW50SW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICByZXR1cm4gbW91bnRJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHJldHVybiBtb3VudExheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTWVtbzogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50TWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50UmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50UmVmKGluaXRpYWxWYWx1ZSk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudERlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRNdXRhYmxlU291cmNlKCk7XG4gICAgfSxcbiAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTeW5jRXh0ZXJuYWxTdG9yZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50U3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpO1xuICAgIH0sXG4gICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRJZCgpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG5cbiAgSG9va3NEaXNwYXRjaGVyT25Nb3VudFdpdGhIb29rVHlwZXNJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50Q2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50SW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudEluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50TWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRSZWYoaW5pdGlhbFZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50TXV0YWJsZVNvdXJjZSgpO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCk7XG4gICAgfSxcbiAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSWQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRJZCgpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG5cbiAgSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTWVtbzogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlUmVmKCk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZURlZmVycmVkVmFsdWUodmFsdWUpO1xuICAgIH0sXG4gICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlVHJhbnNpdGlvbic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZU11dGFibGVTb3VyY2UoKTtcbiAgICB9LFxuICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN5bmNFeHRlcm5hbFN0b3JlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QpO1xuICAgIH0sXG4gICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUlkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcblxuICBIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gcmVyZW5kZXJSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVJlZigpO1xuICAgIH0sXG4gICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN0YXRlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiByZXJlbmRlclN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVEZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVyZW5kZXJEZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVyZW5kZXJUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZU11dGFibGVTb3VyY2UoKTtcbiAgICB9LFxuICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN5bmNFeHRlcm5hbFN0b3JlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QpO1xuICAgIH0sXG4gICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUlkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcblxuICBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgd2FybkludmFsaWRDb250ZXh0QWNjZXNzKCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUluc2VydGlvbkVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW5zZXJ0aW9uRWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudEluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50TGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50UmVmKGluaXRpYWxWYWx1ZSk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50TXV0YWJsZVNvdXJjZSgpO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50U3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpO1xuICAgIH0sXG4gICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudElkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcblxuICBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHdhcm5JbnZhbGlkQ29udGV4dEFjY2VzcygpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ2FsbGJhY2snO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVSZWYoKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlU3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlVHJhbnNpdGlvbigpO1xuICAgIH0sXG4gICAgdXNlTXV0YWJsZVNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTXV0YWJsZVNvdXJjZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZU11dGFibGVTb3VyY2UoKTtcbiAgICB9LFxuICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN5bmNFeHRlcm5hbFN0b3JlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCk7XG4gICAgfSxcbiAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSWQnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJZCgpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG5cbiAgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHdhcm5JbnZhbGlkQ29udGV4dEFjY2VzcygpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ2FsbGJhY2snO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHJlcmVuZGVyUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVJlZigpO1xuICAgIH0sXG4gICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN0YXRlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiByZXJlbmRlclN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZURlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlcmVuZGVyRGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVyZW5kZXJUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTXV0YWJsZVNvdXJjZSgpO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90KTtcbiAgICB9LFxuICAgIHVzZUlkOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJZCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUlkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcbn1cblxudmFyIG5vdyQxID0gU2NoZWR1bGVyLnVuc3RhYmxlX25vdztcbnZhciBjb21taXRUaW1lID0gMDtcbnZhciBsYXlvdXRFZmZlY3RTdGFydFRpbWUgPSAtMTtcbnZhciBwcm9maWxlclN0YXJ0VGltZSA9IC0xO1xudmFyIHBhc3NpdmVFZmZlY3RTdGFydFRpbWUgPSAtMTtcbi8qKlxuICogVHJhY2tzIHdoZXRoZXIgdGhlIGN1cnJlbnQgdXBkYXRlIHdhcyBhIG5lc3RlZC9jYXNjYWRpbmcgdXBkYXRlIChzY2hlZHVsZWQgZnJvbSBhIGxheW91dCBlZmZlY3QpLlxuICpcbiAqIFRoZSBvdmVyYWxsIHNlcXVlbmNlIGlzOlxuICogICAxLiByZW5kZXJcbiAqICAgMi4gY29tbWl0IChhbmQgY2FsbCBgb25SZW5kZXJgLCBgb25Db21taXRgKVxuICogICAzLiBjaGVjayBmb3IgbmVzdGVkIHVwZGF0ZXNcbiAqICAgNC4gZmx1c2ggcGFzc2l2ZSBlZmZlY3RzIChhbmQgY2FsbCBgb25Qb3N0Q29tbWl0YClcbiAqXG4gKiBOZXN0ZWQgdXBkYXRlcyBhcmUgaWRlbnRpZmllZCBpbiBzdGVwIDMgYWJvdmUsXG4gKiBidXQgc3RlcCA0IHN0aWxsIGFwcGxpZXMgdG8gdGhlIHdvcmsgdGhhdCB3YXMganVzdCBjb21taXR0ZWQuXG4gKiBXZSB1c2UgdHdvIGZsYWdzIHRvIHRyYWNrIG5lc3RlZCB1cGRhdGVzIHRoZW46XG4gKiBvbmUgdHJhY2tzIHdoZXRoZXIgdGhlIHVwY29taW5nIHVwZGF0ZSBpcyBhIG5lc3RlZCB1cGRhdGUsXG4gKiBhbmQgdGhlIG90aGVyIHRyYWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHVwZGF0ZSB3YXMgYSBuZXN0ZWQgdXBkYXRlLlxuICogVGhlIGZpcnN0IHZhbHVlIGdldHMgc3luY2VkIHRvIHRoZSBzZWNvbmQgYXQgdGhlIHN0YXJ0IG9mIHRoZSByZW5kZXIgcGhhc2UuXG4gKi9cblxudmFyIGN1cnJlbnRVcGRhdGVJc05lc3RlZCA9IGZhbHNlO1xudmFyIG5lc3RlZFVwZGF0ZVNjaGVkdWxlZCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBpc0N1cnJlbnRVcGRhdGVOZXN0ZWQoKSB7XG4gIHJldHVybiBjdXJyZW50VXBkYXRlSXNOZXN0ZWQ7XG59XG5cbmZ1bmN0aW9uIG1hcmtOZXN0ZWRVcGRhdGVTY2hlZHVsZWQoKSB7XG4gIHtcbiAgICBuZXN0ZWRVcGRhdGVTY2hlZHVsZWQgPSB0cnVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc2V0TmVzdGVkVXBkYXRlRmxhZygpIHtcbiAge1xuICAgIGN1cnJlbnRVcGRhdGVJc05lc3RlZCA9IGZhbHNlO1xuICAgIG5lc3RlZFVwZGF0ZVNjaGVkdWxlZCA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN5bmNOZXN0ZWRVcGRhdGVGbGFnKCkge1xuICB7XG4gICAgY3VycmVudFVwZGF0ZUlzTmVzdGVkID0gbmVzdGVkVXBkYXRlU2NoZWR1bGVkO1xuICAgIG5lc3RlZFVwZGF0ZVNjaGVkdWxlZCA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldENvbW1pdFRpbWUoKSB7XG4gIHJldHVybiBjb21taXRUaW1lO1xufVxuXG5mdW5jdGlvbiByZWNvcmRDb21taXRUaW1lKCkge1xuXG4gIGNvbW1pdFRpbWUgPSBub3ckMSgpO1xufVxuXG5mdW5jdGlvbiBzdGFydFByb2ZpbGVyVGltZXIoZmliZXIpIHtcblxuICBwcm9maWxlclN0YXJ0VGltZSA9IG5vdyQxKCk7XG5cbiAgaWYgKGZpYmVyLmFjdHVhbFN0YXJ0VGltZSA8IDApIHtcbiAgICBmaWJlci5hY3R1YWxTdGFydFRpbWUgPSBub3ckMSgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nKGZpYmVyKSB7XG5cbiAgcHJvZmlsZXJTdGFydFRpbWUgPSAtMTtcbn1cblxuZnVuY3Rpb24gc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREZWx0YShmaWJlciwgb3ZlcnJpZGVCYXNlVGltZSkge1xuXG4gIGlmIChwcm9maWxlclN0YXJ0VGltZSA+PSAwKSB7XG4gICAgdmFyIGVsYXBzZWRUaW1lID0gbm93JDEoKSAtIHByb2ZpbGVyU3RhcnRUaW1lO1xuICAgIGZpYmVyLmFjdHVhbER1cmF0aW9uICs9IGVsYXBzZWRUaW1lO1xuXG4gICAgaWYgKG92ZXJyaWRlQmFzZVRpbWUpIHtcbiAgICAgIGZpYmVyLnNlbGZCYXNlRHVyYXRpb24gPSBlbGFwc2VkVGltZTtcbiAgICB9XG5cbiAgICBwcm9maWxlclN0YXJ0VGltZSA9IC0xO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGZpYmVyKSB7XG5cbiAgaWYgKGxheW91dEVmZmVjdFN0YXJ0VGltZSA+PSAwKSB7XG4gICAgdmFyIGVsYXBzZWRUaW1lID0gbm93JDEoKSAtIGxheW91dEVmZmVjdFN0YXJ0VGltZTtcbiAgICBsYXlvdXRFZmZlY3RTdGFydFRpbWUgPSAtMTsgLy8gU3RvcmUgZHVyYXRpb24gb24gdGhlIG5leHQgbmVhcmVzdCBQcm9maWxlciBhbmNlc3RvclxuICAgIC8vIE9yIHRoZSByb290IChmb3IgdGhlIERldlRvb2xzIFByb2ZpbGVyIHRvIHJlYWQpXG5cbiAgICB2YXIgcGFyZW50RmliZXIgPSBmaWJlci5yZXR1cm47XG5cbiAgICB3aGlsZSAocGFyZW50RmliZXIgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAocGFyZW50RmliZXIudGFnKSB7XG4gICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAgdmFyIHJvb3QgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgcm9vdC5lZmZlY3REdXJhdGlvbiArPSBlbGFwc2VkVGltZTtcbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY2FzZSBQcm9maWxlcjpcbiAgICAgICAgICB2YXIgcGFyZW50U3RhdGVOb2RlID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgIHBhcmVudFN0YXRlTm9kZS5lZmZlY3REdXJhdGlvbiArPSBlbGFwc2VkVGltZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIucmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZWNvcmRQYXNzaXZlRWZmZWN0RHVyYXRpb24oZmliZXIpIHtcblxuICBpZiAocGFzc2l2ZUVmZmVjdFN0YXJ0VGltZSA+PSAwKSB7XG4gICAgdmFyIGVsYXBzZWRUaW1lID0gbm93JDEoKSAtIHBhc3NpdmVFZmZlY3RTdGFydFRpbWU7XG4gICAgcGFzc2l2ZUVmZmVjdFN0YXJ0VGltZSA9IC0xOyAvLyBTdG9yZSBkdXJhdGlvbiBvbiB0aGUgbmV4dCBuZWFyZXN0IFByb2ZpbGVyIGFuY2VzdG9yXG4gICAgLy8gT3IgdGhlIHJvb3QgKGZvciB0aGUgRGV2VG9vbHMgUHJvZmlsZXIgdG8gcmVhZClcblxuICAgIHZhciBwYXJlbnRGaWJlciA9IGZpYmVyLnJldHVybjtcblxuICAgIHdoaWxlIChwYXJlbnRGaWJlciAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChwYXJlbnRGaWJlci50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICB2YXIgcm9vdCA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgICAgICByb290LnBhc3NpdmVFZmZlY3REdXJhdGlvbiArPSBlbGFwc2VkVGltZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY2FzZSBQcm9maWxlcjpcbiAgICAgICAgICB2YXIgcGFyZW50U3RhdGVOb2RlID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgaWYgKHBhcmVudFN0YXRlTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gRGV0YWNoZWQgZmliZXJzIGhhdmUgdGhlaXIgc3RhdGUgbm9kZSBjbGVhcmVkIG91dC5cbiAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgdGhlIHJldHVybiBwb2ludGVyIGlzIGFsc28gY2xlYXJlZCBvdXQsXG4gICAgICAgICAgICAvLyBzbyB3ZSB3b24ndCBiZSBhYmxlIHRvIHJlcG9ydCB0aGUgdGltZSBzcGVudCBpbiB0aGlzIFByb2ZpbGVyJ3Mgc3VidHJlZS5cbiAgICAgICAgICAgIHBhcmVudFN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb24gKz0gZWxhcHNlZFRpbWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLnJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpIHtcblxuICBsYXlvdXRFZmZlY3RTdGFydFRpbWUgPSBub3ckMSgpO1xufVxuXG5mdW5jdGlvbiBzdGFydFBhc3NpdmVFZmZlY3RUaW1lcigpIHtcblxuICBwYXNzaXZlRWZmZWN0U3RhcnRUaW1lID0gbm93JDEoKTtcbn1cblxuZnVuY3Rpb24gdHJhbnNmZXJBY3R1YWxEdXJhdGlvbihmaWJlcikge1xuICAvLyBUcmFuc2ZlciB0aW1lIHNwZW50IHJlbmRlcmluZyB0aGVzZSBjaGlsZHJlbiBzbyB3ZSBkb24ndCBsb3NlIGl0XG4gIC8vIGFmdGVyIHdlIHJlcmVuZGVyLiBUaGlzIGlzIHVzZWQgYXMgYSBoZWxwZXIgaW4gc3BlY2lhbCBjYXNlc1xuICAvLyB3aGVyZSB3ZSBzaG91bGQgY291bnQgdGhlIHdvcmsgb2YgbXVsdGlwbGUgcGFzc2VzLlxuICB2YXIgY2hpbGQgPSBmaWJlci5jaGlsZDtcblxuICB3aGlsZSAoY2hpbGQpIHtcbiAgICBmaWJlci5hY3R1YWxEdXJhdGlvbiArPSBjaGlsZC5hY3R1YWxEdXJhdGlvbjtcbiAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZURlZmF1bHRQcm9wcyhDb21wb25lbnQsIGJhc2VQcm9wcykge1xuICBpZiAoQ29tcG9uZW50ICYmIENvbXBvbmVudC5kZWZhdWx0UHJvcHMpIHtcbiAgICAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHMuIFRha2VuIGZyb20gUmVhY3RFbGVtZW50XG4gICAgdmFyIHByb3BzID0gYXNzaWduKHt9LCBiYXNlUHJvcHMpO1xuICAgIHZhciBkZWZhdWx0UHJvcHMgPSBDb21wb25lbnQuZGVmYXVsdFByb3BzO1xuXG4gICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gZGVmYXVsdFByb3BzKSB7XG4gICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gZGVmYXVsdFByb3BzW3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcHJvcHM7XG4gIH1cblxuICByZXR1cm4gYmFzZVByb3BzO1xufVxuXG52YXIgZmFrZUludGVybmFsSW5zdGFuY2UgPSB7fTtcbnZhciBkaWRXYXJuQWJvdXRTdGF0ZUFzc2lnbm1lbnRGb3JDb21wb25lbnQ7XG52YXIgZGlkV2FybkFib3V0VW5pbml0aWFsaXplZFN0YXRlO1xudmFyIGRpZFdhcm5BYm91dEdldFNuYXBzaG90QmVmb3JlVXBkYXRlV2l0aG91dERpZFVwZGF0ZTtcbnZhciBkaWRXYXJuQWJvdXRMZWdhY3lMaWZlY3ljbGVzQW5kRGVyaXZlZFN0YXRlO1xudmFyIGRpZFdhcm5BYm91dFVuZGVmaW5lZERlcml2ZWRTdGF0ZTtcbnZhciB3YXJuT25VbmRlZmluZWREZXJpdmVkU3RhdGU7XG52YXIgd2Fybk9uSW52YWxpZENhbGxiYWNrO1xudmFyIGRpZFdhcm5BYm91dERpcmVjdGx5QXNzaWduaW5nUHJvcHNUb1N0YXRlO1xudmFyIGRpZFdhcm5BYm91dENvbnRleHRUeXBlQW5kQ29udGV4dFR5cGVzO1xudmFyIGRpZFdhcm5BYm91dEludmFsaWRhdGVDb250ZXh0VHlwZTtcbnZhciBkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0JDE7XG5cbntcbiAgZGlkV2FybkFib3V0U3RhdGVBc3NpZ25tZW50Rm9yQ29tcG9uZW50ID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXRVbmluaXRpYWxpemVkU3RhdGUgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dEdldFNuYXBzaG90QmVmb3JlVXBkYXRlV2l0aG91dERpZFVwZGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0RGlyZWN0bHlBc3NpZ25pbmdQcm9wc1RvU3RhdGUgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dFVuZGVmaW5lZERlcml2ZWRTdGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0Q29udGV4dFR5cGVBbmRDb250ZXh0VHlwZXMgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dEludmFsaWRhdGVDb250ZXh0VHlwZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0TGVnYWN5Q29udGV4dCQxID0gbmV3IFNldCgpO1xuICB2YXIgZGlkV2Fybk9uSW52YWxpZENhbGxiYWNrID0gbmV3IFNldCgpO1xuXG4gIHdhcm5PbkludmFsaWRDYWxsYmFjayA9IGZ1bmN0aW9uIChjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgIGlmIChjYWxsYmFjayA9PT0gbnVsbCB8fCB0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIga2V5ID0gY2FsbGVyTmFtZSArICdfJyArIGNhbGxiYWNrO1xuXG4gICAgaWYgKCFkaWRXYXJuT25JbnZhbGlkQ2FsbGJhY2suaGFzKGtleSkpIHtcbiAgICAgIGRpZFdhcm5PbkludmFsaWRDYWxsYmFjay5hZGQoa2V5KTtcblxuICAgICAgZXJyb3IoJyVzKC4uLik6IEV4cGVjdGVkIHRoZSBsYXN0IG9wdGlvbmFsIGBjYWxsYmFja2AgYXJndW1lbnQgdG8gYmUgYSAnICsgJ2Z1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjYWxsZXJOYW1lLCBjYWxsYmFjayk7XG4gICAgfVxuICB9O1xuXG4gIHdhcm5PblVuZGVmaW5lZERlcml2ZWRTdGF0ZSA9IGZ1bmN0aW9uICh0eXBlLCBwYXJ0aWFsU3RhdGUpIHtcbiAgICBpZiAocGFydGlhbFN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFVuZGVmaW5lZERlcml2ZWRTdGF0ZS5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgZGlkV2FybkFib3V0VW5kZWZpbmVkRGVyaXZlZFN0YXRlLmFkZChjb21wb25lbnROYW1lKTtcblxuICAgICAgICBlcnJvcignJXMuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKCk6IEEgdmFsaWQgc3RhdGUgb2JqZWN0IChvciBudWxsKSBtdXN0IGJlIHJldHVybmVkLiAnICsgJ1lvdSBoYXZlIHJldHVybmVkIHVuZGVmaW5lZC4nLCBjb21wb25lbnROYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH07IC8vIFRoaXMgaXMgc28gZ3Jvc3MgYnV0IGl0J3MgYXQgbGVhc3Qgbm9uLWNyaXRpY2FsIGFuZCBjYW4gYmUgcmVtb3ZlZCBpZlxuICAvLyBpdCBjYXVzZXMgcHJvYmxlbXMuIFRoaXMgaXMgbWVhbnQgdG8gZ2l2ZSBhIG5pY2VyIGVycm9yIG1lc3NhZ2UgZm9yXG4gIC8vIFJlYWN0RE9NMTUudW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIocmVhY3RET00xNkNvbXBvbmVudCxcbiAgLy8gLi4uKSkgd2hpY2ggb3RoZXJ3aXNlIHRocm93cyBhIFwiX3Byb2Nlc3NDaGlsZENvbnRleHQgaXMgbm90IGEgZnVuY3Rpb25cIlxuICAvLyBleGNlcHRpb24uXG5cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZmFrZUludGVybmFsSW5zdGFuY2UsICdfcHJvY2Vzc0NoaWxkQ29udGV4dCcsIHtcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdfcHJvY2Vzc0NoaWxkQ29udGV4dCBpcyBub3QgYXZhaWxhYmxlIGluIFJlYWN0IDE2Ky4gVGhpcyBsaWtlbHkgJyArICdtZWFucyB5b3UgaGF2ZSBtdWx0aXBsZSBjb3BpZXMgb2YgUmVhY3QgYW5kIGFyZSBhdHRlbXB0aW5nIHRvIG5lc3QgJyArICdhIFJlYWN0IDE1IHRyZWUgaW5zaWRlIGEgUmVhY3QgMTYgdHJlZSB1c2luZyAnICsgXCJ1bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lciwgd2hpY2ggaXNuJ3Qgc3VwcG9ydGVkLiBUcnkgXCIgKyAndG8gbWFrZSBzdXJlIHlvdSBoYXZlIG9ubHkgb25lIGNvcHkgb2YgUmVhY3QgKGFuZCBpZGVhbGx5LCBzd2l0Y2ggJyArICd0byBSZWFjdERPTS5jcmVhdGVQb3J0YWwpLicpO1xuICAgIH1cbiAgfSk7XG4gIE9iamVjdC5mcmVlemUoZmFrZUludGVybmFsSW5zdGFuY2UpO1xufVxuXG5mdW5jdGlvbiBhcHBseURlcml2ZWRTdGF0ZUZyb21Qcm9wcyh3b3JrSW5Qcm9ncmVzcywgY3RvciwgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLCBuZXh0UHJvcHMpIHtcbiAgdmFyIHByZXZTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIHZhciBwYXJ0aWFsU3RhdGUgPSBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMobmV4dFByb3BzLCBwcmV2U3RhdGUpO1xuXG4gIHtcbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gSW52b2tlIHRoZSBmdW5jdGlvbiBhbiBleHRyYSB0aW1lIHRvIGhlbHAgZGV0ZWN0IHNpZGUtZWZmZWN0cy5cbiAgICAgICAgcGFydGlhbFN0YXRlID0gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKG5leHRQcm9wcywgcHJldlN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3YXJuT25VbmRlZmluZWREZXJpdmVkU3RhdGUoY3RvciwgcGFydGlhbFN0YXRlKTtcbiAgfSAvLyBNZXJnZSB0aGUgcGFydGlhbCBzdGF0ZSBhbmQgdGhlIHByZXZpb3VzIHN0YXRlLlxuXG5cbiAgdmFyIG1lbW9pemVkU3RhdGUgPSBwYXJ0aWFsU3RhdGUgPT09IG51bGwgfHwgcGFydGlhbFN0YXRlID09PSB1bmRlZmluZWQgPyBwcmV2U3RhdGUgOiBhc3NpZ24oe30sIHByZXZTdGF0ZSwgcGFydGlhbFN0YXRlKTtcbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG1lbW9pemVkU3RhdGU7IC8vIE9uY2UgdGhlIHVwZGF0ZSBxdWV1ZSBpcyBlbXB0eSwgcGVyc2lzdCB0aGUgZGVyaXZlZCBzdGF0ZSBvbnRvIHRoZVxuICAvLyBiYXNlIHN0YXRlLlxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIC8vIFF1ZXVlIGlzIGFsd2F5cyBub24tbnVsbCBmb3IgY2xhc3Nlc1xuICAgIHZhciB1cGRhdGVRdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuICAgIHVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZSA9IG1lbW9pemVkU3RhdGU7XG4gIH1cbn1cblxudmFyIGNsYXNzQ29tcG9uZW50VXBkYXRlciA9IHtcbiAgaXNNb3VudGVkOiBpc01vdW50ZWQsXG4gIGVucXVldWVTZXRTdGF0ZTogZnVuY3Rpb24gKGluc3QsIHBheWxvYWQsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGZpYmVyID0gZ2V0KGluc3QpO1xuICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpO1xuICAgIHVwZGF0ZS5wYXlsb2FkID0gcGF5bG9hZDtcblxuICAgIGlmIChjYWxsYmFjayAhPT0gdW5kZWZpbmVkICYmIGNhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICB7XG4gICAgICAgIHdhcm5PbkludmFsaWRDYWxsYmFjayhjYWxsYmFjaywgJ3NldFN0YXRlJyk7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZS5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIHZhciByb290ID0gZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlLCBsYW5lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gICAgICBlbnRhbmdsZVRyYW5zaXRpb25zKHJvb3QsIGZpYmVyLCBsYW5lKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBtYXJrU3RhdGVVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpO1xuICAgIH1cbiAgfSxcbiAgZW5xdWV1ZVJlcGxhY2VTdGF0ZTogZnVuY3Rpb24gKGluc3QsIHBheWxvYWQsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGZpYmVyID0gZ2V0KGluc3QpO1xuICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpO1xuICAgIHVwZGF0ZS50YWcgPSBSZXBsYWNlU3RhdGU7XG4gICAgdXBkYXRlLnBheWxvYWQgPSBwYXlsb2FkO1xuXG4gICAgaWYgKGNhbGxiYWNrICE9PSB1bmRlZmluZWQgJiYgY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgIHtcbiAgICAgICAgd2Fybk9uSW52YWxpZENhbGxiYWNrKGNhbGxiYWNrLCAncmVwbGFjZVN0YXRlJyk7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZS5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIHZhciByb290ID0gZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlLCBsYW5lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gICAgICBlbnRhbmdsZVRyYW5zaXRpb25zKHJvb3QsIGZpYmVyLCBsYW5lKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBtYXJrU3RhdGVVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpO1xuICAgIH1cbiAgfSxcbiAgZW5xdWV1ZUZvcmNlVXBkYXRlOiBmdW5jdGlvbiAoaW5zdCwgY2FsbGJhY2spIHtcbiAgICB2YXIgZmliZXIgPSBnZXQoaW5zdCk7XG4gICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKGV2ZW50VGltZSwgbGFuZSk7XG4gICAgdXBkYXRlLnRhZyA9IEZvcmNlVXBkYXRlO1xuXG4gICAgaWYgKGNhbGxiYWNrICE9PSB1bmRlZmluZWQgJiYgY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgIHtcbiAgICAgICAgd2Fybk9uSW52YWxpZENhbGxiYWNrKGNhbGxiYWNrLCAnZm9yY2VVcGRhdGUnKTtcbiAgICAgIH1cblxuICAgICAgdXBkYXRlLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUsIGxhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgICAgIGVudGFuZ2xlVHJhbnNpdGlvbnMocm9vdCwgZmliZXIsIGxhbmUpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIG1hcmtGb3JjZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSk7XG4gICAgfVxuICB9XG59O1xuXG5mdW5jdGlvbiBjaGVja1Nob3VsZENvbXBvbmVudFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgY3Rvciwgb2xkUHJvcHMsIG5ld1Byb3BzLCBvbGRTdGF0ZSwgbmV3U3RhdGUsIG5leHRDb250ZXh0KSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICBpZiAodHlwZW9mIGluc3RhbmNlLnNob3VsZENvbXBvbmVudFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBzaG91bGRVcGRhdGUgPSBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUobmV3UHJvcHMsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG5cbiAgICB7XG4gICAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gSW52b2tlIHRoZSBmdW5jdGlvbiBhbiBleHRyYSB0aW1lIHRvIGhlbHAgZGV0ZWN0IHNpZGUtZWZmZWN0cy5cbiAgICAgICAgICBzaG91bGRVcGRhdGUgPSBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUobmV3UHJvcHMsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRVcGRhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlcnJvcignJXMuc2hvdWxkQ29tcG9uZW50VXBkYXRlKCk6IFJldHVybmVkIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIGEgJyArICdib29sZWFuIHZhbHVlLiBNYWtlIHN1cmUgdG8gcmV0dXJuIHRydWUgb3IgZmFsc2UuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2hvdWxkVXBkYXRlO1xuICB9XG5cbiAgaWYgKGN0b3IucHJvdG90eXBlICYmIGN0b3IucHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50KSB7XG4gICAgcmV0dXJuICFzaGFsbG93RXF1YWwob2xkUHJvcHMsIG5ld1Byb3BzKSB8fCAhc2hhbGxvd0VxdWFsKG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY2hlY2tDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBuZXdQcm9wcykge1xuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAge1xuICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdDb21wb25lbnQnO1xuICAgIHZhciByZW5kZXJQcmVzZW50ID0gaW5zdGFuY2UucmVuZGVyO1xuXG4gICAgaWYgKCFyZW5kZXJQcmVzZW50KSB7XG4gICAgICBpZiAoY3Rvci5wcm90b3R5cGUgJiYgdHlwZW9mIGN0b3IucHJvdG90eXBlLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBlcnJvcignJXMoLi4uKTogTm8gYHJlbmRlcmAgbWV0aG9kIGZvdW5kIG9uIHRoZSByZXR1cm5lZCBjb21wb25lbnQgJyArICdpbnN0YW5jZTogZGlkIHlvdSBhY2NpZGVudGFsbHkgcmV0dXJuIGFuIG9iamVjdCBmcm9tIHRoZSBjb25zdHJ1Y3Rvcj8nLCBuYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCclcyguLi4pOiBObyBgcmVuZGVyYCBtZXRob2QgZm91bmQgb24gdGhlIHJldHVybmVkIGNvbXBvbmVudCAnICsgJ2luc3RhbmNlOiB5b3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIGRlZmluZSBgcmVuZGVyYC4nLCBuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuZ2V0SW5pdGlhbFN0YXRlICYmICFpbnN0YW5jZS5nZXRJbml0aWFsU3RhdGUuaXNSZWFjdENsYXNzQXBwcm92ZWQgJiYgIWluc3RhbmNlLnN0YXRlKSB7XG4gICAgICBlcnJvcignZ2V0SW5pdGlhbFN0YXRlIHdhcyBkZWZpbmVkIG9uICVzLCBhIHBsYWluIEphdmFTY3JpcHQgY2xhc3MuICcgKyAnVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgY2xhc3NlcyBjcmVhdGVkIHVzaW5nIFJlYWN0LmNyZWF0ZUNsYXNzLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBkZWZpbmUgYSBzdGF0ZSBwcm9wZXJ0eSBpbnN0ZWFkPycsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5nZXREZWZhdWx0UHJvcHMgJiYgIWluc3RhbmNlLmdldERlZmF1bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZCkge1xuICAgICAgZXJyb3IoJ2dldERlZmF1bHRQcm9wcyB3YXMgZGVmaW5lZCBvbiAlcywgYSBwbGFpbiBKYXZhU2NyaXB0IGNsYXNzLiAnICsgJ1RoaXMgaXMgb25seSBzdXBwb3J0ZWQgZm9yIGNsYXNzZXMgY3JlYXRlZCB1c2luZyBSZWFjdC5jcmVhdGVDbGFzcy4gJyArICdVc2UgYSBzdGF0aWMgcHJvcGVydHkgdG8gZGVmaW5lIGRlZmF1bHRQcm9wcyBpbnN0ZWFkLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5wcm9wVHlwZXMpIHtcbiAgICAgIGVycm9yKCdwcm9wVHlwZXMgd2FzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgcHJvcGVydHkgb24gJXMuIFVzZSBhIHN0YXRpYyAnICsgJ3Byb3BlcnR5IHRvIGRlZmluZSBwcm9wVHlwZXMgaW5zdGVhZC4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuY29udGV4dFR5cGUpIHtcbiAgICAgIGVycm9yKCdjb250ZXh0VHlwZSB3YXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcy4gVXNlIGEgc3RhdGljICcgKyAncHJvcGVydHkgdG8gZGVmaW5lIGNvbnRleHRUeXBlIGluc3RlYWQuJywgbmFtZSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKGN0b3IuY2hpbGRDb250ZXh0VHlwZXMgJiYgIWRpZFdhcm5BYm91dExlZ2FjeUNvbnRleHQkMS5oYXMoY3RvcikgJiYgLy8gU3RyaWN0IE1vZGUgaGFzIGl0cyBvd24gd2FybmluZyBmb3IgbGVnYWN5IGNvbnRleHQsIHNvIHdlIGNhbiBza2lwXG4gICAgICAvLyB0aGlzIG9uZS5cbiAgICAgICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0JDEuYWRkKGN0b3IpO1xuXG4gICAgICAgIGVycm9yKCclcyB1c2VzIHRoZSBsZWdhY3kgY2hpbGRDb250ZXh0VHlwZXMgQVBJIHdoaWNoIGlzIG5vIGxvbmdlciAnICsgJ3N1cHBvcnRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UuIFVzZSAnICsgJ1JlYWN0LmNyZWF0ZUNvbnRleHQoKSBpbnN0ZWFkXFxuXFxuLicgKyAnTGVhcm4gbW9yZSBhYm91dCB0aGlzIHdhcm5pbmcgaGVyZTogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2xlZ2FjeS1jb250ZXh0JywgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjdG9yLmNvbnRleHRUeXBlcyAmJiAhZGlkV2FybkFib3V0TGVnYWN5Q29udGV4dCQxLmhhcyhjdG9yKSAmJiAvLyBTdHJpY3QgTW9kZSBoYXMgaXRzIG93biB3YXJuaW5nIGZvciBsZWdhY3kgY29udGV4dCwgc28gd2UgY2FuIHNraXBcbiAgICAgIC8vIHRoaXMgb25lLlxuICAgICAgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dExlZ2FjeUNvbnRleHQkMS5hZGQoY3Rvcik7XG5cbiAgICAgICAgZXJyb3IoJyVzIHVzZXMgdGhlIGxlZ2FjeSBjb250ZXh0VHlwZXMgQVBJIHdoaWNoIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgJyArICdhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UuIFVzZSAnICsgJ1JlYWN0LmNyZWF0ZUNvbnRleHQoKSB3aXRoIHN0YXRpYyBjb250ZXh0VHlwZSBpbnN0ZWFkLlxcblxcbicgKyAnTGVhcm4gbW9yZSBhYm91dCB0aGlzIHdhcm5pbmcgaGVyZTogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2xlZ2FjeS1jb250ZXh0JywgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbnN0YW5jZS5jb250ZXh0VHlwZXMpIHtcbiAgICAgICAgZXJyb3IoJ2NvbnRleHRUeXBlcyB3YXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcy4gVXNlIGEgc3RhdGljICcgKyAncHJvcGVydHkgdG8gZGVmaW5lIGNvbnRleHRUeXBlcyBpbnN0ZWFkLicsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY3Rvci5jb250ZXh0VHlwZSAmJiBjdG9yLmNvbnRleHRUeXBlcyAmJiAhZGlkV2FybkFib3V0Q29udGV4dFR5cGVBbmRDb250ZXh0VHlwZXMuaGFzKGN0b3IpKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dENvbnRleHRUeXBlQW5kQ29udGV4dFR5cGVzLmFkZChjdG9yKTtcblxuICAgICAgICBlcnJvcignJXMgZGVjbGFyZXMgYm90aCBjb250ZXh0VHlwZXMgYW5kIGNvbnRleHRUeXBlIHN0YXRpYyBwcm9wZXJ0aWVzLiAnICsgJ1RoZSBsZWdhY3kgY29udGV4dFR5cGVzIHByb3BlcnR5IHdpbGwgYmUgaWdub3JlZC4nLCBuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFNob3VsZFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdjb21wb25lbnRTaG91bGRVcGRhdGUoKS4gRGlkIHlvdSBtZWFuIHNob3VsZENvbXBvbmVudFVwZGF0ZSgpPyAnICsgJ1RoZSBuYW1lIGlzIHBocmFzZWQgYXMgYSBxdWVzdGlvbiBiZWNhdXNlIHRoZSBmdW5jdGlvbiBpcyAnICsgJ2V4cGVjdGVkIHRvIHJldHVybiBhIHZhbHVlLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChjdG9yLnByb3RvdHlwZSAmJiBjdG9yLnByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudCAmJiB0eXBlb2YgaW5zdGFuY2Uuc2hvdWxkQ29tcG9uZW50VXBkYXRlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgc2hvdWxkQ29tcG9uZW50VXBkYXRlKCkuICcgKyAnc2hvdWxkQ29tcG9uZW50VXBkYXRlIHNob3VsZCBub3QgYmUgdXNlZCB3aGVuIGV4dGVuZGluZyBSZWFjdC5QdXJlQ29tcG9uZW50LiAnICsgJ1BsZWFzZSBleHRlbmQgUmVhY3QuQ29tcG9uZW50IGlmIHNob3VsZENvbXBvbmVudFVwZGF0ZSBpcyB1c2VkLicsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQSBwdXJlIGNvbXBvbmVudCcpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVW5tb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdjb21wb25lbnREaWRVbm1vdW50KCkuIEJ1dCB0aGVyZSBpcyBubyBzdWNoIGxpZmVjeWNsZSBtZXRob2QuICcgKyAnRGlkIHlvdSBtZWFuIGNvbXBvbmVudFdpbGxVbm1vdW50KCk/JywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50RGlkUmVjZWl2ZVByb3BzKCkuIEJ1dCB0aGVyZSBpcyBubyBzdWNoIGxpZmVjeWNsZSBtZXRob2QuICcgKyAnSWYgeW91IG1lYW50IHRvIHVwZGF0ZSB0aGUgc3RhdGUgaW4gcmVzcG9uc2UgdG8gY2hhbmdpbmcgcHJvcHMsICcgKyAndXNlIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKS4gSWYgeW91IG1lYW50IHRvIGZldGNoIGRhdGEgb3IgJyArICdydW4gc2lkZS1lZmZlY3RzIG9yIG11dGF0aW9ucyBhZnRlciBSZWFjdCBoYXMgdXBkYXRlZCB0aGUgVUksIHVzZSBjb21wb25lbnREaWRVcGRhdGUoKS4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcygpLiBEaWQgeW91IG1lYW4gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpPycsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMoKS4gRGlkIHlvdSBtZWFuIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCk/JywgbmFtZSk7XG4gICAgfVxuXG4gICAgdmFyIGhhc011dGF0ZWRQcm9wcyA9IGluc3RhbmNlLnByb3BzICE9PSBuZXdQcm9wcztcblxuICAgIGlmIChpbnN0YW5jZS5wcm9wcyAhPT0gdW5kZWZpbmVkICYmIGhhc011dGF0ZWRQcm9wcykge1xuICAgICAgZXJyb3IoJyVzKC4uLik6IFdoZW4gY2FsbGluZyBzdXBlcigpIGluIGAlc2AsIG1ha2Ugc3VyZSB0byBwYXNzICcgKyBcInVwIHRoZSBzYW1lIHByb3BzIHRoYXQgeW91ciBjb21wb25lbnQncyBjb25zdHJ1Y3RvciB3YXMgcGFzc2VkLlwiLCBuYW1lLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuZGVmYXVsdFByb3BzKSB7XG4gICAgICBlcnJvcignU2V0dGluZyBkZWZhdWx0UHJvcHMgYXMgYW4gaW5zdGFuY2UgcHJvcGVydHkgb24gJXMgaXMgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBiZSBpZ25vcmVkLicgKyAnIEluc3RlYWQsIGRlZmluZSBkZWZhdWx0UHJvcHMgYXMgYSBzdGF0aWMgcHJvcGVydHkgb24gJXMuJywgbmFtZSwgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlICE9PSAnZnVuY3Rpb24nICYmICFkaWRXYXJuQWJvdXRHZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZVdpdGhvdXREaWRVcGRhdGUuaGFzKGN0b3IpKSB7XG4gICAgICBkaWRXYXJuQWJvdXRHZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZVdpdGhvdXREaWRVcGRhdGUuYWRkKGN0b3IpO1xuXG4gICAgICBlcnJvcignJXM6IGdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCkgc2hvdWxkIGJlIHVzZWQgd2l0aCBjb21wb25lbnREaWRVcGRhdGUoKS4gJyArICdUaGlzIGNvbXBvbmVudCBkZWZpbmVzIGdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCkgb25seS4nLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoY3RvcikpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXM6IGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcygpIGlzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgbWV0aG9kICcgKyAnYW5kIHdpbGwgYmUgaWdub3JlZC4gSW5zdGVhZCwgZGVjbGFyZSBpdCBhcyBhIHN0YXRpYyBtZXRob2QuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclczogZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKCkgaXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBtZXRob2QgJyArICdhbmQgd2lsbCBiZSBpZ25vcmVkLiBJbnN0ZWFkLCBkZWNsYXJlIGl0IGFzIGEgc3RhdGljIG1ldGhvZC4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGN0b3IuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclczogZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKSBpcyBkZWZpbmVkIGFzIGEgc3RhdGljIG1ldGhvZCAnICsgJ2FuZCB3aWxsIGJlIGlnbm9yZWQuIEluc3RlYWQsIGRlY2xhcmUgaXQgYXMgYW4gaW5zdGFuY2UgbWV0aG9kLicsIG5hbWUpO1xuICAgIH1cblxuICAgIHZhciBfc3RhdGUgPSBpbnN0YW5jZS5zdGF0ZTtcblxuICAgIGlmIChfc3RhdGUgJiYgKHR5cGVvZiBfc3RhdGUgIT09ICdvYmplY3QnIHx8IGlzQXJyYXkoX3N0YXRlKSkpIHtcbiAgICAgIGVycm9yKCclcy5zdGF0ZTogbXVzdCBiZSBzZXQgdG8gYW4gb2JqZWN0IG9yIG51bGwnLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldENoaWxkQ29udGV4dCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgY3Rvci5jaGlsZENvbnRleHRUeXBlcyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIGVycm9yKCclcy5nZXRDaGlsZENvbnRleHQoKTogY2hpbGRDb250ZXh0VHlwZXMgbXVzdCBiZSBkZWZpbmVkIGluIG9yZGVyIHRvICcgKyAndXNlIGdldENoaWxkQ29udGV4dCgpLicsIG5hbWUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhZG9wdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKSB7XG4gIGluc3RhbmNlLnVwZGF0ZXIgPSBjbGFzc0NvbXBvbmVudFVwZGF0ZXI7XG4gIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IGluc3RhbmNlOyAvLyBUaGUgaW5zdGFuY2UgbmVlZHMgYWNjZXNzIHRvIHRoZSBmaWJlciBzbyB0aGF0IGl0IGNhbiBzY2hlZHVsZSB1cGRhdGVzXG5cbiAgc2V0KGluc3RhbmNlLCB3b3JrSW5Qcm9ncmVzcyk7XG5cbiAge1xuICAgIGluc3RhbmNlLl9yZWFjdEludGVybmFsSW5zdGFuY2UgPSBmYWtlSW50ZXJuYWxJbnN0YW5jZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBwcm9wcykge1xuICB2YXIgaXNMZWdhY3lDb250ZXh0Q29uc3VtZXIgPSBmYWxzZTtcbiAgdmFyIHVubWFza2VkQ29udGV4dCA9IGVtcHR5Q29udGV4dE9iamVjdDtcbiAgdmFyIGNvbnRleHQgPSBlbXB0eUNvbnRleHRPYmplY3Q7XG4gIHZhciBjb250ZXh0VHlwZSA9IGN0b3IuY29udGV4dFR5cGU7XG5cbiAge1xuICAgIGlmICgnY29udGV4dFR5cGUnIGluIGN0b3IpIHtcbiAgICAgIHZhciBpc1ZhbGlkID0gLy8gQWxsb3cgbnVsbCBmb3IgY29uZGl0aW9uYWwgZGVjbGFyYXRpb25cbiAgICAgIGNvbnRleHRUeXBlID09PSBudWxsIHx8IGNvbnRleHRUeXBlICE9PSB1bmRlZmluZWQgJiYgY29udGV4dFR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSAmJiBjb250ZXh0VHlwZS5fY29udGV4dCA9PT0gdW5kZWZpbmVkOyAvLyBOb3QgYSA8Q29udGV4dC5Db25zdW1lcj5cblxuICAgICAgaWYgKCFpc1ZhbGlkICYmICFkaWRXYXJuQWJvdXRJbnZhbGlkYXRlQ29udGV4dFR5cGUuaGFzKGN0b3IpKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dEludmFsaWRhdGVDb250ZXh0VHlwZS5hZGQoY3Rvcik7XG4gICAgICAgIHZhciBhZGRlbmR1bSA9ICcnO1xuXG4gICAgICAgIGlmIChjb250ZXh0VHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYWRkZW5kdW0gPSAnIEhvd2V2ZXIsIGl0IGlzIHNldCB0byB1bmRlZmluZWQuICcgKyAnVGhpcyBjYW4gYmUgY2F1c2VkIGJ5IGEgdHlwbyBvciBieSBtaXhpbmcgdXAgbmFtZWQgYW5kIGRlZmF1bHQgaW1wb3J0cy4gJyArICdUaGlzIGNhbiBhbHNvIGhhcHBlbiBkdWUgdG8gYSBjaXJjdWxhciBkZXBlbmRlbmN5LCBzbyAnICsgJ3RyeSBtb3ZpbmcgdGhlIGNyZWF0ZUNvbnRleHQoKSBjYWxsIHRvIGEgc2VwYXJhdGUgZmlsZS4nO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb250ZXh0VHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBhZGRlbmR1bSA9ICcgSG93ZXZlciwgaXQgaXMgc2V0IHRvIGEgJyArIHR5cGVvZiBjb250ZXh0VHlwZSArICcuJztcbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0VHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRSkge1xuICAgICAgICAgIGFkZGVuZHVtID0gJyBEaWQgeW91IGFjY2lkZW50YWxseSBwYXNzIHRoZSBDb250ZXh0LlByb3ZpZGVyIGluc3RlYWQ/JztcbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0VHlwZS5fY29udGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gPENvbnRleHQuQ29uc3VtZXI+XG4gICAgICAgICAgYWRkZW5kdW0gPSAnIERpZCB5b3UgYWNjaWRlbnRhbGx5IHBhc3MgdGhlIENvbnRleHQuQ29uc3VtZXIgaW5zdGVhZD8nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFkZGVuZHVtID0gJyBIb3dldmVyLCBpdCBpcyBzZXQgdG8gYW4gb2JqZWN0IHdpdGgga2V5cyB7JyArIE9iamVjdC5rZXlzKGNvbnRleHRUeXBlKS5qb2luKCcsICcpICsgJ30uJztcbiAgICAgICAgfVxuXG4gICAgICAgIGVycm9yKCclcyBkZWZpbmVzIGFuIGludmFsaWQgY29udGV4dFR5cGUuICcgKyAnY29udGV4dFR5cGUgc2hvdWxkIHBvaW50IHRvIHRoZSBDb250ZXh0IG9iamVjdCByZXR1cm5lZCBieSBSZWFjdC5jcmVhdGVDb250ZXh0KCkuJXMnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoY3RvcikgfHwgJ0NvbXBvbmVudCcsIGFkZGVuZHVtKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIGNvbnRleHRUeXBlID09PSAnb2JqZWN0JyAmJiBjb250ZXh0VHlwZSAhPT0gbnVsbCkge1xuICAgIGNvbnRleHQgPSByZWFkQ29udGV4dChjb250ZXh0VHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgdW5tYXNrZWRDb250ZXh0ID0gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBjdG9yLCB0cnVlKTtcbiAgICB2YXIgY29udGV4dFR5cGVzID0gY3Rvci5jb250ZXh0VHlwZXM7XG4gICAgaXNMZWdhY3lDb250ZXh0Q29uc3VtZXIgPSBjb250ZXh0VHlwZXMgIT09IG51bGwgJiYgY29udGV4dFR5cGVzICE9PSB1bmRlZmluZWQ7XG4gICAgY29udGV4dCA9IGlzTGVnYWN5Q29udGV4dENvbnN1bWVyID8gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0KSA6IGVtcHR5Q29udGV4dE9iamVjdDtcbiAgfVxuXG4gIHZhciBpbnN0YW5jZSA9IG5ldyBjdG9yKHByb3BzLCBjb250ZXh0KTsgLy8gSW5zdGFudGlhdGUgdHdpY2UgdG8gaGVscCBkZXRlY3Qgc2lkZS1lZmZlY3RzLlxuXG4gIHtcbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgaW5zdGFuY2UgPSBuZXcgY3Rvcihwcm9wcywgY29udGV4dCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IGluc3RhbmNlLnN0YXRlICE9PSBudWxsICYmIGluc3RhbmNlLnN0YXRlICE9PSB1bmRlZmluZWQgPyBpbnN0YW5jZS5zdGF0ZSA6IG51bGw7XG4gIGFkb3B0Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpO1xuXG4gIHtcbiAgICBpZiAodHlwZW9mIGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nICYmIHN0YXRlID09PSBudWxsKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRVbmluaXRpYWxpemVkU3RhdGUuaGFzKGNvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZS5hZGQoY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgZXJyb3IoJ2Alc2AgdXNlcyBgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzYCBidXQgaXRzIGluaXRpYWwgc3RhdGUgaXMgJyArICclcy4gVGhpcyBpcyBub3QgcmVjb21tZW5kZWQuIEluc3RlYWQsIGRlZmluZSB0aGUgaW5pdGlhbCBzdGF0ZSBieSAnICsgJ2Fzc2lnbmluZyBhbiBvYmplY3QgdG8gYHRoaXMuc3RhdGVgIGluIHRoZSBjb25zdHJ1Y3RvciBvZiBgJXNgLiAnICsgJ1RoaXMgZW5zdXJlcyB0aGF0IGBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNgIGFyZ3VtZW50cyBoYXZlIGEgY29uc2lzdGVudCBzaGFwZS4nLCBjb21wb25lbnROYW1lLCBpbnN0YW5jZS5zdGF0ZSA9PT0gbnVsbCA/ICdudWxsJyA6ICd1bmRlZmluZWQnLCBjb21wb25lbnROYW1lKTtcbiAgICAgIH1cbiAgICB9IC8vIElmIG5ldyBjb21wb25lbnQgQVBJcyBhcmUgZGVmaW5lZCwgXCJ1bnNhZmVcIiBsaWZlY3ljbGVzIHdvbid0IGJlIGNhbGxlZC5cbiAgICAvLyBXYXJuIGFib3V0IHRoZXNlIGxpZmVjeWNsZXMgaWYgdGhleSBhcmUgcHJlc2VudC5cbiAgICAvLyBEb24ndCB3YXJuIGFib3V0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgbWV0aG9kcyB0aG91Z2guXG5cblxuICAgIGlmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgZm91bmRXaWxsTW91bnROYW1lID0gbnVsbDtcbiAgICAgIHZhciBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lID0gbnVsbDtcbiAgICAgIHZhciBmb3VuZFdpbGxVcGRhdGVOYW1lID0gbnVsbDtcblxuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50Ll9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgIT09IHRydWUpIHtcbiAgICAgICAgZm91bmRXaWxsTW91bnROYW1lID0gJ2NvbXBvbmVudFdpbGxNb3VudCc7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGZvdW5kV2lsbE1vdW50TmFtZSA9ICdVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50JztcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgICBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lID0gJ2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMnO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSA9ICdVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyc7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlLl9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgIT09IHRydWUpIHtcbiAgICAgICAgZm91bmRXaWxsVXBkYXRlTmFtZSA9ICdjb21wb25lbnRXaWxsVXBkYXRlJztcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGZvdW5kV2lsbFVwZGF0ZU5hbWUgPSAnVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUnO1xuICAgICAgfVxuXG4gICAgICBpZiAoZm91bmRXaWxsTW91bnROYW1lICE9PSBudWxsIHx8IGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgIT09IG51bGwgfHwgZm91bmRXaWxsVXBkYXRlTmFtZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgX2NvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoY3RvcikgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgICAgdmFyIG5ld0FwaU5hbWUgPSB0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicgPyAnZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKCknIDogJ2dldFNuYXBzaG90QmVmb3JlVXBkYXRlKCknO1xuXG4gICAgICAgIGlmICghZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZS5oYXMoX2NvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgICAgZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZS5hZGQoX2NvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgICAgZXJyb3IoJ1Vuc2FmZSBsZWdhY3kgbGlmZWN5Y2xlcyB3aWxsIG5vdCBiZSBjYWxsZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgbmV3IGNvbXBvbmVudCBBUElzLlxcblxcbicgKyAnJXMgdXNlcyAlcyBidXQgYWxzbyBjb250YWlucyB0aGUgZm9sbG93aW5nIGxlZ2FjeSBsaWZlY3ljbGVzOiVzJXMlc1xcblxcbicgKyAnVGhlIGFib3ZlIGxpZmVjeWNsZXMgc2hvdWxkIGJlIHJlbW92ZWQuIExlYXJuIG1vcmUgYWJvdXQgdGhpcyB3YXJuaW5nIGhlcmU6XFxuJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzJywgX2NvbXBvbmVudE5hbWUsIG5ld0FwaU5hbWUsIGZvdW5kV2lsbE1vdW50TmFtZSAhPT0gbnVsbCA/IFwiXFxuICBcIiArIGZvdW5kV2lsbE1vdW50TmFtZSA6ICcnLCBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lICE9PSBudWxsID8gXCJcXG4gIFwiICsgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSA6ICcnLCBmb3VuZFdpbGxVcGRhdGVOYW1lICE9PSBudWxsID8gXCJcXG4gIFwiICsgZm91bmRXaWxsVXBkYXRlTmFtZSA6ICcnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSAvLyBDYWNoZSB1bm1hc2tlZCBjb250ZXh0IHNvIHdlIGNhbiBhdm9pZCByZWNyZWF0aW5nIG1hc2tlZCBjb250ZXh0IHVubGVzcyBuZWNlc3NhcnkuXG4gIC8vIFJlYWN0RmliZXJDb250ZXh0IHVzdWFsbHkgdXBkYXRlcyB0aGlzIGNhY2hlIGJ1dCBjYW4ndCBmb3IgbmV3bHktY3JlYXRlZCBpbnN0YW5jZXMuXG5cblxuICBpZiAoaXNMZWdhY3lDb250ZXh0Q29uc3VtZXIpIHtcbiAgICBjYWNoZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCwgY29udGV4dCk7XG4gIH1cblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5cbmZ1bmN0aW9uIGNhbGxDb21wb25lbnRXaWxsTW91bnQod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKSB7XG4gIHZhciBvbGRTdGF0ZSA9IGluc3RhbmNlLnN0YXRlO1xuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50KCk7XG4gIH1cblxuICBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCk7XG4gIH1cblxuICBpZiAob2xkU3RhdGUgIT09IGluc3RhbmNlLnN0YXRlKSB7XG4gICAge1xuICAgICAgZXJyb3IoJyVzLmNvbXBvbmVudFdpbGxNb3VudCgpOiBBc3NpZ25pbmcgZGlyZWN0bHkgdG8gdGhpcy5zdGF0ZSBpcyAnICsgXCJkZXByZWNhdGVkIChleGNlcHQgaW5zaWRlIGEgY29tcG9uZW50J3MgXCIgKyAnY29uc3RydWN0b3IpLiBVc2Ugc2V0U3RhdGUgaW5zdGVhZC4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHdvcmtJblByb2dyZXNzKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgfVxuXG4gICAgY2xhc3NDb21wb25lbnRVcGRhdGVyLmVucXVldWVSZXBsYWNlU3RhdGUoaW5zdGFuY2UsIGluc3RhbmNlLnN0YXRlLCBudWxsKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjYWxsQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UsIG5ld1Byb3BzLCBuZXh0Q29udGV4dCkge1xuICB2YXIgb2xkU3RhdGUgPSBpbnN0YW5jZS5zdGF0ZTtcblxuICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5ld1Byb3BzLCBuZXh0Q29udGV4dCk7XG4gIH1cblxuICBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV3UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgfVxuXG4gIGlmIChpbnN0YW5jZS5zdGF0ZSAhPT0gb2xkU3RhdGUpIHtcbiAgICB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIod29ya0luUHJvZ3Jlc3MpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFN0YXRlQXNzaWdubWVudEZvckNvbXBvbmVudC5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgZGlkV2FybkFib3V0U3RhdGVBc3NpZ25tZW50Rm9yQ29tcG9uZW50LmFkZChjb21wb25lbnROYW1lKTtcblxuICAgICAgICBlcnJvcignJXMuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpOiBBc3NpZ25pbmcgZGlyZWN0bHkgdG8gJyArIFwidGhpcy5zdGF0ZSBpcyBkZXByZWNhdGVkIChleGNlcHQgaW5zaWRlIGEgY29tcG9uZW50J3MgXCIgKyAnY29uc3RydWN0b3IpLiBVc2Ugc2V0U3RhdGUgaW5zdGVhZC4nLCBjb21wb25lbnROYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjbGFzc0NvbXBvbmVudFVwZGF0ZXIuZW5xdWV1ZVJlcGxhY2VTdGF0ZShpbnN0YW5jZSwgaW5zdGFuY2Uuc3RhdGUsIG51bGwpO1xuICB9XG59IC8vIEludm9rZXMgdGhlIG1vdW50IGxpZmUtY3ljbGVzIG9uIGEgcHJldmlvdXNseSBuZXZlciByZW5kZXJlZCBpbnN0YW5jZS5cblxuXG5mdW5jdGlvbiBtb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG5ld1Byb3BzLCByZW5kZXJMYW5lcykge1xuICB7XG4gICAgY2hlY2tDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBuZXdQcm9wcyk7XG4gIH1cblxuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gIGluc3RhbmNlLnByb3BzID0gbmV3UHJvcHM7XG4gIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgaW5zdGFuY2UucmVmcyA9IHt9O1xuICBpbml0aWFsaXplVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MpO1xuICB2YXIgY29udGV4dFR5cGUgPSBjdG9yLmNvbnRleHRUeXBlO1xuXG4gIGlmICh0eXBlb2YgY29udGV4dFR5cGUgPT09ICdvYmplY3QnICYmIGNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgaW5zdGFuY2UuY29udGV4dCA9IHJlYWRDb250ZXh0KGNvbnRleHRUeXBlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgdW5tYXNrZWRDb250ZXh0ID0gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBjdG9yLCB0cnVlKTtcbiAgICBpbnN0YW5jZS5jb250ZXh0ID0gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0KTtcbiAgfVxuXG4gIHtcbiAgICBpZiAoaW5zdGFuY2Uuc3RhdGUgPT09IG5ld1Byb3BzKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXREaXJlY3RseUFzc2lnbmluZ1Byb3BzVG9TdGF0ZS5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgZGlkV2FybkFib3V0RGlyZWN0bHlBc3NpZ25pbmdQcm9wc1RvU3RhdGUuYWRkKGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGVycm9yKCclczogSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGFzc2lnbiBwcm9wcyBkaXJlY3RseSB0byBzdGF0ZSAnICsgXCJiZWNhdXNlIHVwZGF0ZXMgdG8gcHJvcHMgd29uJ3QgYmUgcmVmbGVjdGVkIGluIHN0YXRlLiBcIiArICdJbiBtb3N0IGNhc2VzLCBpdCBpcyBiZXR0ZXIgdG8gdXNlIHByb3BzIGRpcmVjdGx5LicsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MucmVjb3JkTGVnYWN5Q29udGV4dFdhcm5pbmcod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpO1xuICAgIH1cbiAgfVxuXG4gIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9IGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzO1xuXG4gIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV3UHJvcHMpO1xuICAgIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfSAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cblxuXG4gIGlmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlICE9PSAnZnVuY3Rpb24nICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSkge1xuICAgIGNhbGxDb21wb25lbnRXaWxsTW91bnQod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKTsgLy8gSWYgd2UgaGFkIGFkZGl0aW9uYWwgc3RhdGUgdXBkYXRlcyBkdXJpbmcgdGhpcyBsaWZlLWN5Y2xlLCBsZXQnc1xuICAgIC8vIHByb2Nlc3MgdGhlbSBub3cuXG5cbiAgICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG5ld1Byb3BzLCBpbnN0YW5jZSwgcmVuZGVyTGFuZXMpO1xuICAgIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZmliZXJGbGFncyA9IFVwZGF0ZTtcblxuICAgIHtcbiAgICAgIGZpYmVyRmxhZ3MgfD0gTGF5b3V0U3RhdGljO1xuICAgIH1cblxuICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgZmliZXJGbGFncyB8PSBNb3VudExheW91dERldjtcbiAgICB9XG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBmaWJlckZsYWdzO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc3VtZU1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgY3RvciwgbmV3UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgdmFyIG9sZFByb3BzID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcztcbiAgaW5zdGFuY2UucHJvcHMgPSBvbGRQcm9wcztcbiAgdmFyIG9sZENvbnRleHQgPSBpbnN0YW5jZS5jb250ZXh0O1xuICB2YXIgY29udGV4dFR5cGUgPSBjdG9yLmNvbnRleHRUeXBlO1xuICB2YXIgbmV4dENvbnRleHQgPSBlbXB0eUNvbnRleHRPYmplY3Q7XG5cbiAgaWYgKHR5cGVvZiBjb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgY29udGV4dFR5cGUgIT09IG51bGwpIHtcbiAgICBuZXh0Q29udGV4dCA9IHJlYWRDb250ZXh0KGNvbnRleHRUeXBlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbmV4dExlZ2FjeVVubWFza2VkQ29udGV4dCA9IGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgY3RvciwgdHJ1ZSk7XG4gICAgbmV4dENvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBuZXh0TGVnYWN5VW5tYXNrZWRDb250ZXh0KTtcbiAgfVxuXG4gIHZhciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPSBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcbiAgdmFyIGhhc05ld0xpZmVjeWNsZXMgPSB0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJzsgLy8gTm90ZTogRHVyaW5nIHRoZXNlIGxpZmUtY3ljbGVzLCBpbnN0YW5jZS5wcm9wcy9pbnN0YW5jZS5zdGF0ZSBhcmUgd2hhdFxuICAvLyBldmVyIHRoZSBwcmV2aW91c2x5IGF0dGVtcHRlZCB0byByZW5kZXIgLSBub3QgdGhlIFwiY3VycmVudFwiLiBIb3dldmVyLFxuICAvLyBkdXJpbmcgY29tcG9uZW50RGlkVXBkYXRlIHdlIHBhc3MgdGhlIFwiY3VycmVudFwiIHByb3BzLlxuICAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cblxuICBpZiAoIWhhc05ld0xpZmVjeWNsZXMgJiYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICBpZiAob2xkUHJvcHMgIT09IG5ld1Byb3BzIHx8IG9sZENvbnRleHQgIT09IG5leHRDb250ZXh0KSB7XG4gICAgICBjYWxsQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UsIG5ld1Byb3BzLCBuZXh0Q29udGV4dCk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXRIYXNGb3JjZVVwZGF0ZUJlZm9yZVByb2Nlc3NpbmcoKTtcbiAgdmFyIG9sZFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIG5ld1N0YXRlID0gaW5zdGFuY2Uuc3RhdGUgPSBvbGRTdGF0ZTtcbiAgcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCBuZXdQcm9wcywgaW5zdGFuY2UsIHJlbmRlckxhbmVzKTtcbiAgbmV3U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChvbGRQcm9wcyA9PT0gbmV3UHJvcHMgJiYgb2xkU3RhdGUgPT09IG5ld1N0YXRlICYmICFoYXNDb250ZXh0Q2hhbmdlZCgpICYmICFjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkpIHtcbiAgICAvLyBJZiBhbiB1cGRhdGUgd2FzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdlIHNob3VsZCBzY2hlZHVsZSBhbiBVcGRhdGVcbiAgICAvLyBlZmZlY3QgZXZlbiB0aG91Z2ggd2UncmUgYmFpbGluZyBvdXQsIHNvIHRoYXQgY1dVL2NEVSBhcmUgY2FsbGVkLlxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBmaWJlckZsYWdzID0gVXBkYXRlO1xuXG4gICAgICB7XG4gICAgICAgIGZpYmVyRmxhZ3MgfD0gTGF5b3V0U3RhdGljO1xuICAgICAgfVxuXG4gICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgZmliZXJGbGFncyB8PSBNb3VudExheW91dERldjtcbiAgICAgIH1cblxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gZmliZXJGbGFncztcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGFwcGx5RGVyaXZlZFN0YXRlRnJvbVByb3BzKHdvcmtJblByb2dyZXNzLCBjdG9yLCBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMsIG5ld1Byb3BzKTtcbiAgICBuZXdTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIH1cblxuICB2YXIgc2hvdWxkVXBkYXRlID0gY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZygpIHx8IGNoZWNrU2hvdWxkQ29tcG9uZW50VXBkYXRlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBvbGRQcm9wcywgbmV3UHJvcHMsIG9sZFN0YXRlLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpO1xuXG4gIGlmIChzaG91bGRVcGRhdGUpIHtcbiAgICAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgICAvLyBVbnNhZmUgbGlmZWN5Y2xlcyBzaG91bGQgbm90IGJlIGludm9rZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgdGhlIG5ldyBBUElzLlxuICAgIGlmICghaGFzTmV3TGlmZWN5Y2xlcyAmJiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBfZmliZXJGbGFncyA9IFVwZGF0ZTtcblxuICAgICAge1xuICAgICAgICBfZmliZXJGbGFncyB8PSBMYXlvdXRTdGF0aWM7XG4gICAgICB9XG5cbiAgICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICBfZmliZXJGbGFncyB8PSBNb3VudExheW91dERldjtcbiAgICAgIH1cblxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gX2ZpYmVyRmxhZ3M7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIElmIGFuIHVwZGF0ZSB3YXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgd2Ugc2hvdWxkIHNjaGVkdWxlIGFuIFVwZGF0ZVxuICAgIC8vIGVmZmVjdCBldmVuIHRob3VnaCB3ZSdyZSBiYWlsaW5nIG91dCwgc28gdGhhdCBjV1UvY0RVIGFyZSBjYWxsZWQuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIF9maWJlckZsYWdzMiA9IFVwZGF0ZTtcblxuICAgICAge1xuICAgICAgICBfZmliZXJGbGFnczIgfD0gTGF5b3V0U3RhdGljO1xuICAgICAgfVxuXG4gICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgX2ZpYmVyRmxhZ3MyIHw9IE1vdW50TGF5b3V0RGV2O1xuICAgICAgfVxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBfZmliZXJGbGFnczI7XG4gICAgfSAvLyBJZiBzaG91bGRDb21wb25lbnRVcGRhdGUgcmV0dXJuZWQgZmFsc2UsIHdlIHNob3VsZCBzdGlsbCB1cGRhdGUgdGhlXG4gICAgLy8gbWVtb2l6ZWQgc3RhdGUgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIHdvcmsgY2FuIGJlIHJldXNlZC5cblxuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IG5ld1Byb3BzO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgfSAvLyBVcGRhdGUgdGhlIGV4aXN0aW5nIGluc3RhbmNlJ3Mgc3RhdGUsIHByb3BzLCBhbmQgY29udGV4dCBwb2ludGVycyBldmVuXG4gIC8vIGlmIHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5zIGZhbHNlLlxuXG5cbiAgaW5zdGFuY2UucHJvcHMgPSBuZXdQcm9wcztcbiAgaW5zdGFuY2Uuc3RhdGUgPSBuZXdTdGF0ZTtcbiAgaW5zdGFuY2UuY29udGV4dCA9IG5leHRDb250ZXh0O1xuICByZXR1cm4gc2hvdWxkVXBkYXRlO1xufSAvLyBJbnZva2VzIHRoZSB1cGRhdGUgbGlmZS1jeWNsZXMgYW5kIHJldHVybnMgZmFsc2UgaWYgaXQgc2hvdWxkbid0IHJlcmVuZGVyLlxuXG5cbmZ1bmN0aW9uIHVwZGF0ZUNsYXNzSW5zdGFuY2UoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGN0b3IsIG5ld1Byb3BzLCByZW5kZXJMYW5lcykge1xuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gIGNsb25lVXBkYXRlUXVldWUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICB2YXIgdW5yZXNvbHZlZE9sZFByb3BzID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcztcbiAgdmFyIG9sZFByb3BzID0gd29ya0luUHJvZ3Jlc3MudHlwZSA9PT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPyB1bnJlc29sdmVkT2xkUHJvcHMgOiByZXNvbHZlRGVmYXVsdFByb3BzKHdvcmtJblByb2dyZXNzLnR5cGUsIHVucmVzb2x2ZWRPbGRQcm9wcyk7XG4gIGluc3RhbmNlLnByb3BzID0gb2xkUHJvcHM7XG4gIHZhciB1bnJlc29sdmVkTmV3UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBvbGRDb250ZXh0ID0gaW5zdGFuY2UuY29udGV4dDtcbiAgdmFyIGNvbnRleHRUeXBlID0gY3Rvci5jb250ZXh0VHlwZTtcbiAgdmFyIG5leHRDb250ZXh0ID0gZW1wdHlDb250ZXh0T2JqZWN0O1xuXG4gIGlmICh0eXBlb2YgY29udGV4dFR5cGUgPT09ICdvYmplY3QnICYmIGNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgbmV4dENvbnRleHQgPSByZWFkQ29udGV4dChjb250ZXh0VHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIG5leHRVbm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHRydWUpO1xuICAgIG5leHRDb250ZXh0ID0gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgbmV4dFVubWFza2VkQ29udGV4dCk7XG4gIH1cblxuICB2YXIgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID0gY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM7XG4gIHZhciBoYXNOZXdMaWZlY3ljbGVzID0gdHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbic7IC8vIE5vdGU6IER1cmluZyB0aGVzZSBsaWZlLWN5Y2xlcywgaW5zdGFuY2UucHJvcHMvaW5zdGFuY2Uuc3RhdGUgYXJlIHdoYXRcbiAgLy8gZXZlciB0aGUgcHJldmlvdXNseSBhdHRlbXB0ZWQgdG8gcmVuZGVyIC0gbm90IHRoZSBcImN1cnJlbnRcIi4gSG93ZXZlcixcbiAgLy8gZHVyaW5nIGNvbXBvbmVudERpZFVwZGF0ZSB3ZSBwYXNzIHRoZSBcImN1cnJlbnRcIiBwcm9wcy5cbiAgLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMsXG4gIC8vIFVuc2FmZSBsaWZlY3ljbGVzIHNob3VsZCBub3QgYmUgaW52b2tlZCBmb3IgY29tcG9uZW50cyB1c2luZyB0aGUgbmV3IEFQSXMuXG5cbiAgaWYgKCFoYXNOZXdMaWZlY3ljbGVzICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpKSB7XG4gICAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyAhPT0gdW5yZXNvbHZlZE5ld1Byb3BzIHx8IG9sZENvbnRleHQgIT09IG5leHRDb250ZXh0KSB7XG4gICAgICBjYWxsQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UsIG5ld1Byb3BzLCBuZXh0Q29udGV4dCk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXRIYXNGb3JjZVVwZGF0ZUJlZm9yZVByb2Nlc3NpbmcoKTtcbiAgdmFyIG9sZFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIG5ld1N0YXRlID0gaW5zdGFuY2Uuc3RhdGUgPSBvbGRTdGF0ZTtcbiAgcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCBuZXdQcm9wcywgaW5zdGFuY2UsIHJlbmRlckxhbmVzKTtcbiAgbmV3U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gIGlmICh1bnJlc29sdmVkT2xkUHJvcHMgPT09IHVucmVzb2x2ZWROZXdQcm9wcyAmJiBvbGRTdGF0ZSA9PT0gbmV3U3RhdGUgJiYgIWhhc0NvbnRleHRDaGFuZ2VkKCkgJiYgIWNoZWNrSGFzRm9yY2VVcGRhdGVBZnRlclByb2Nlc3NpbmcoKSAmJiAhKGVuYWJsZUxhenlDb250ZXh0UHJvcGFnYXRpb24gICApKSB7XG4gICAgLy8gSWYgYW4gdXBkYXRlIHdhcyBhbHJlYWR5IGluIHByb2dyZXNzLCB3ZSBzaG91bGQgc2NoZWR1bGUgYW4gVXBkYXRlXG4gICAgLy8gZWZmZWN0IGV2ZW4gdGhvdWdoIHdlJ3JlIGJhaWxpbmcgb3V0LCBzbyB0aGF0IGNXVS9jRFUgYXJlIGNhbGxlZC5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyAhPT0gY3VycmVudC5tZW1vaXplZFByb3BzIHx8IG9sZFN0YXRlICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh1bnJlc29sdmVkT2xkUHJvcHMgIT09IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB8fCBvbGRTdGF0ZSAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNuYXBzaG90O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV3UHJvcHMpO1xuICAgIG5ld1N0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfVxuXG4gIHZhciBzaG91bGRVcGRhdGUgPSBjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkgfHwgY2hlY2tTaG91bGRDb21wb25lbnRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG9sZFByb3BzLCBuZXdQcm9wcywgb2xkU3RhdGUsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCkgfHwgLy8gVE9ETzogSW4gc29tZSBjYXNlcywgd2UnbGwgZW5kIHVwIGNoZWNraW5nIGlmIGNvbnRleHQgaGFzIGNoYW5nZWQgdHdpY2UsXG4gIC8vIGJvdGggYmVmb3JlIGFuZCBhZnRlciBgc2hvdWxkQ29tcG9uZW50VXBkYXRlYCBoYXMgYmVlbiBjYWxsZWQuIE5vdCBpZGVhbCxcbiAgLy8gYnV0IEknbSBsb2F0aCB0byByZWZhY3RvciB0aGlzIGZ1bmN0aW9uLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgbWVtb2l6ZWRcbiAgLy8gY29tcG9uZW50cyBzbyBpdCdzIG5vdCB0aGF0IGNvbW1vbi5cbiAgZW5hYmxlTGF6eUNvbnRleHRQcm9wYWdhdGlvbiAgIDtcblxuICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMsXG4gICAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cbiAgICBpZiAoIWhhc05ld0xpZmVjeWNsZXMgJiYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlKG5ld1Byb3BzLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlKG5ld1Byb3BzLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU25hcHNob3Q7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIElmIGFuIHVwZGF0ZSB3YXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgd2Ugc2hvdWxkIHNjaGVkdWxlIGFuIFVwZGF0ZVxuICAgIC8vIGVmZmVjdCBldmVuIHRob3VnaCB3ZSdyZSBiYWlsaW5nIG91dCwgc28gdGhhdCBjV1UvY0RVIGFyZSBjYWxsZWQuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh1bnJlc29sdmVkT2xkUHJvcHMgIT09IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB8fCBvbGRTdGF0ZSAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAodW5yZXNvbHZlZE9sZFByb3BzICE9PSBjdXJyZW50Lm1lbW9pemVkUHJvcHMgfHwgb2xkU3RhdGUgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTbmFwc2hvdDtcbiAgICAgIH1cbiAgICB9IC8vIElmIHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5lZCBmYWxzZSwgd2Ugc2hvdWxkIHN0aWxsIHVwZGF0ZSB0aGVcbiAgICAvLyBtZW1vaXplZCBwcm9wcy9zdGF0ZSB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgd29yayBjYW4gYmUgcmV1c2VkLlxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gbmV3UHJvcHM7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9IC8vIFVwZGF0ZSB0aGUgZXhpc3RpbmcgaW5zdGFuY2UncyBzdGF0ZSwgcHJvcHMsIGFuZCBjb250ZXh0IHBvaW50ZXJzIGV2ZW5cbiAgLy8gaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybnMgZmFsc2UuXG5cblxuICBpbnN0YW5jZS5wcm9wcyA9IG5ld1Byb3BzO1xuICBpbnN0YW5jZS5zdGF0ZSA9IG5ld1N0YXRlO1xuICBpbnN0YW5jZS5jb250ZXh0ID0gbmV4dENvbnRleHQ7XG4gIHJldHVybiBzaG91bGRVcGRhdGU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKHZhbHVlLCBzb3VyY2UpIHtcbiAgLy8gSWYgdGhlIHZhbHVlIGlzIGFuIGVycm9yLCBjYWxsIHRoaXMgZnVuY3Rpb24gaW1tZWRpYXRlbHkgYWZ0ZXIgaXQgaXMgdGhyb3duXG4gIC8vIHNvIHRoZSBzdGFjayBpcyBhY2N1cmF0ZS5cbiAgcmV0dXJuIHtcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgc291cmNlOiBzb3VyY2UsXG4gICAgc3RhY2s6IGdldFN0YWNrQnlGaWJlckluRGV2QW5kUHJvZChzb3VyY2UpLFxuICAgIGRpZ2VzdDogbnVsbFxuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlQ2FwdHVyZWRWYWx1ZSh2YWx1ZSwgZGlnZXN0LCBzdGFjaykge1xuICByZXR1cm4ge1xuICAgIHZhbHVlOiB2YWx1ZSxcbiAgICBzb3VyY2U6IG51bGwsXG4gICAgc3RhY2s6IHN0YWNrICE9IG51bGwgPyBzdGFjayA6IG51bGwsXG4gICAgZGlnZXN0OiBkaWdlc3QgIT0gbnVsbCA/IGRpZ2VzdCA6IG51bGxcbiAgfTtcbn1cblxuLy8gVGhpcyBtb2R1bGUgaXMgZm9ya2VkIGluIGRpZmZlcmVudCBlbnZpcm9ubWVudHMuXG4vLyBCeSBkZWZhdWx0LCByZXR1cm4gYHRydWVgIHRvIGxvZyBlcnJvcnMgdG8gdGhlIGNvbnNvbGUuXG4vLyBGb3JrcyBjYW4gcmV0dXJuIGBmYWxzZWAgaWYgdGhpcyBpc24ndCBkZXNpcmFibGUuXG5mdW5jdGlvbiBzaG93RXJyb3JEaWFsb2coYm91bmRhcnksIGVycm9ySW5mbykge1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gbG9nQ2FwdHVyZWRFcnJvcihib3VuZGFyeSwgZXJyb3JJbmZvKSB7XG4gIHRyeSB7XG4gICAgdmFyIGxvZ0Vycm9yID0gc2hvd0Vycm9yRGlhbG9nKGJvdW5kYXJ5LCBlcnJvckluZm8pOyAvLyBBbGxvdyBpbmplY3RlZCBzaG93RXJyb3JEaWFsb2coKSB0byBwcmV2ZW50IGRlZmF1bHQgY29uc29sZS5lcnJvciBsb2dnaW5nLlxuICAgIC8vIFRoaXMgZW5hYmxlcyByZW5kZXJlcnMgbGlrZSBSZWFjdE5hdGl2ZSB0byBiZXR0ZXIgbWFuYWdlIHJlZGJveCBiZWhhdmlvci5cblxuICAgIGlmIChsb2dFcnJvciA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZXJyb3IgPSBlcnJvckluZm8udmFsdWU7XG5cbiAgICBpZiAodHJ1ZSkge1xuICAgICAgdmFyIHNvdXJjZSA9IGVycm9ySW5mby5zb3VyY2U7XG4gICAgICB2YXIgc3RhY2sgPSBlcnJvckluZm8uc3RhY2s7XG4gICAgICB2YXIgY29tcG9uZW50U3RhY2sgPSBzdGFjayAhPT0gbnVsbCA/IHN0YWNrIDogJyc7IC8vIEJyb3dzZXJzIHN1cHBvcnQgc2lsZW5jaW5nIHVuY2F1Z2h0IGVycm9ycyBieSBjYWxsaW5nXG4gICAgICAvLyBgcHJldmVudERlZmF1bHQoKWAgaW4gd2luZG93IGBlcnJvcmAgaGFuZGxlci5cbiAgICAgIC8vIFdlIHJlY29yZCB0aGlzIGluZm9ybWF0aW9uIGFzIGFuIGV4cGFuZG8gb24gdGhlIGVycm9yLlxuXG4gICAgICBpZiAoZXJyb3IgIT0gbnVsbCAmJiBlcnJvci5fc3VwcHJlc3NMb2dnaW5nKSB7XG4gICAgICAgIGlmIChib3VuZGFyeS50YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICAgICAgLy8gVGhlIGVycm9yIGlzIHJlY292ZXJhYmxlIGFuZCB3YXMgc2lsZW5jZWQuXG4gICAgICAgICAgLy8gSWdub3JlIGl0IGFuZCBkb24ndCBwcmludCB0aGUgc3RhY2sgYWRkZW5kdW0uXG4gICAgICAgICAgLy8gVGhpcyBpcyBoYW5keSBmb3IgdGVzdGluZyBlcnJvciBib3VuZGFyaWVzIHdpdGhvdXQgbm9pc2UuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IC8vIFRoZSBlcnJvciBpcyBmYXRhbC4gU2luY2UgdGhlIHNpbGVuY2luZyBtaWdodCBoYXZlXG4gICAgICAgIC8vIGJlZW4gYWNjaWRlbnRhbCwgd2UnbGwgc3VyZmFjZSBpdCBhbnl3YXkuXG4gICAgICAgIC8vIEhvd2V2ZXIsIHRoZSBicm93c2VyIHdvdWxkIGhhdmUgc2lsZW5jZWQgdGhlIG9yaWdpbmFsIGVycm9yXG4gICAgICAgIC8vIHNvIHdlJ2xsIHByaW50IGl0IGZpcnN0LCBhbmQgdGhlbiBwcmludCB0aGUgc3RhY2sgYWRkZW5kdW0uXG5cblxuICAgICAgICBjb25zb2xlWydlcnJvciddKGVycm9yKTsgLy8gRG9uJ3QgdHJhbnNmb3JtIHRvIG91ciB3cmFwcGVyXG4gICAgICAgIC8vIEZvciBhIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhpcyBibG9jaywgc2VlOlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8xMzM4NFxuICAgICAgfVxuXG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IHNvdXJjZSA/IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoc291cmNlKSA6IG51bGw7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZU1lc3NhZ2UgPSBjb21wb25lbnROYW1lID8gXCJUaGUgYWJvdmUgZXJyb3Igb2NjdXJyZWQgaW4gdGhlIDxcIiArIGNvbXBvbmVudE5hbWUgKyBcIj4gY29tcG9uZW50OlwiIDogJ1RoZSBhYm92ZSBlcnJvciBvY2N1cnJlZCBpbiBvbmUgb2YgeW91ciBSZWFjdCBjb21wb25lbnRzOic7XG4gICAgICB2YXIgZXJyb3JCb3VuZGFyeU1lc3NhZ2U7XG5cbiAgICAgIGlmIChib3VuZGFyeS50YWcgPT09IEhvc3RSb290KSB7XG4gICAgICAgIGVycm9yQm91bmRhcnlNZXNzYWdlID0gJ0NvbnNpZGVyIGFkZGluZyBhbiBlcnJvciBib3VuZGFyeSB0byB5b3VyIHRyZWUgdG8gY3VzdG9taXplIGVycm9yIGhhbmRsaW5nIGJlaGF2aW9yLlxcbicgKyAnVmlzaXQgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2Vycm9yLWJvdW5kYXJpZXMgdG8gbGVhcm4gbW9yZSBhYm91dCBlcnJvciBib3VuZGFyaWVzLic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZXJyb3JCb3VuZGFyeU5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGJvdW5kYXJ5KSB8fCAnQW5vbnltb3VzJztcbiAgICAgICAgZXJyb3JCb3VuZGFyeU1lc3NhZ2UgPSBcIlJlYWN0IHdpbGwgdHJ5IHRvIHJlY3JlYXRlIHRoaXMgY29tcG9uZW50IHRyZWUgZnJvbSBzY3JhdGNoIFwiICsgKFwidXNpbmcgdGhlIGVycm9yIGJvdW5kYXJ5IHlvdSBwcm92aWRlZCwgXCIgKyBlcnJvckJvdW5kYXJ5TmFtZSArIFwiLlwiKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbWJpbmVkTWVzc2FnZSA9IGNvbXBvbmVudE5hbWVNZXNzYWdlICsgXCJcXG5cIiArIGNvbXBvbmVudFN0YWNrICsgXCJcXG5cXG5cIiArIChcIlwiICsgZXJyb3JCb3VuZGFyeU1lc3NhZ2UpOyAvLyBJbiBkZXZlbG9wbWVudCwgd2UgcHJvdmlkZSBvdXIgb3duIG1lc3NhZ2Ugd2l0aCBqdXN0IHRoZSBjb21wb25lbnQgc3RhY2suXG4gICAgICAvLyBXZSBkb24ndCBpbmNsdWRlIHRoZSBvcmlnaW5hbCBlcnJvciBtZXNzYWdlIGFuZCBKUyBzdGFjayBiZWNhdXNlIHRoZSBicm93c2VyXG4gICAgICAvLyBoYXMgYWxyZWFkeSBwcmludGVkIGl0LiBFdmVuIGlmIHRoZSBhcHBsaWNhdGlvbiBzd2FsbG93cyB0aGUgZXJyb3IsIGl0IGlzIHN0aWxsXG4gICAgICAvLyBkaXNwbGF5ZWQgYnkgdGhlIGJyb3dzZXIgdGhhbmtzIHRvIHRoZSBERVYtb25seSBmYWtlIGV2ZW50IHRyaWNrIGluIFJlYWN0RXJyb3JVdGlscy5cblxuICAgICAgY29uc29sZVsnZXJyb3InXShjb21iaW5lZE1lc3NhZ2UpOyAvLyBEb24ndCB0cmFuc2Zvcm0gdG8gb3VyIHdyYXBwZXJcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSW4gcHJvZHVjdGlvbiwgd2UgcHJpbnQgdGhlIGVycm9yIGRpcmVjdGx5LlxuICAgICAgLy8gVGhpcyB3aWxsIGluY2x1ZGUgdGhlIG1lc3NhZ2UsIHRoZSBKUyBzdGFjaywgYW5kIGFueXRoaW5nIHRoZSBicm93c2VyIHdhbnRzIHRvIHNob3cuXG4gICAgICAvLyBXZSBwYXNzIHRoZSBlcnJvciBvYmplY3QgaW5zdGVhZCBvZiBjdXN0b20gbWVzc2FnZSBzbyB0aGF0IHRoZSBicm93c2VyIGRpc3BsYXlzIHRoZSBlcnJvciBuYXRpdmVseS5cbiAgICAgIGNvbnNvbGVbJ2Vycm9yJ10oZXJyb3IpOyAvLyBEb24ndCB0cmFuc2Zvcm0gdG8gb3VyIHdyYXBwZXJcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdywgb3IgUmVhY3QgaW50ZXJuYWwgc3RhdGUgd2lsbCBnZXQgbWVzc2VkIHVwLlxuICAgIC8vIElmIGNvbnNvbGUuZXJyb3IgaXMgb3ZlcnJpZGRlbiwgb3IgbG9nQ2FwdHVyZWRFcnJvcigpIHNob3dzIGEgZGlhbG9nIHRoYXQgdGhyb3dzLFxuICAgIC8vIHdlIHdhbnQgdG8gcmVwb3J0IHRoaXMgZXJyb3Igb3V0c2lkZSBvZiB0aGUgbm9ybWFsIHN0YWNrIGFzIGEgbGFzdCByZXNvcnQuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMzE4OFxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9KTtcbiAgfVxufVxuXG52YXIgUG9zc2libHlXZWFrTWFwJDEgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtNYXAgOiBNYXA7XG5cbmZ1bmN0aW9uIGNyZWF0ZVJvb3RFcnJvclVwZGF0ZShmaWJlciwgZXJyb3JJbmZvLCBsYW5lKSB7XG4gIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoTm9UaW1lc3RhbXAsIGxhbmUpOyAvLyBVbm1vdW50IHRoZSByb290IGJ5IHJlbmRlcmluZyBudWxsLlxuXG4gIHVwZGF0ZS50YWcgPSBDYXB0dXJlVXBkYXRlOyAvLyBDYXV0aW9uOiBSZWFjdCBEZXZUb29scyBjdXJyZW50bHkgZGVwZW5kcyBvbiB0aGlzIHByb3BlcnR5XG4gIC8vIGJlaW5nIGNhbGxlZCBcImVsZW1lbnRcIi5cblxuICB1cGRhdGUucGF5bG9hZCA9IHtcbiAgICBlbGVtZW50OiBudWxsXG4gIH07XG4gIHZhciBlcnJvciA9IGVycm9ySW5mby52YWx1ZTtcblxuICB1cGRhdGUuY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgb25VbmNhdWdodEVycm9yKGVycm9yKTtcbiAgICBsb2dDYXB0dXJlZEVycm9yKGZpYmVyLCBlcnJvckluZm8pO1xuICB9O1xuXG4gIHJldHVybiB1cGRhdGU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNsYXNzRXJyb3JVcGRhdGUoZmliZXIsIGVycm9ySW5mbywgbGFuZSkge1xuICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKE5vVGltZXN0YW1wLCBsYW5lKTtcbiAgdXBkYXRlLnRhZyA9IENhcHR1cmVVcGRhdGU7XG4gIHZhciBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPSBmaWJlci50eXBlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcjtcblxuICBpZiAodHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBlcnJvciQxID0gZXJyb3JJbmZvLnZhbHVlO1xuXG4gICAgdXBkYXRlLnBheWxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKGVycm9yJDEpO1xuICAgIH07XG5cbiAgICB1cGRhdGUuY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB7XG4gICAgICAgIG1hcmtGYWlsZWRFcnJvckJvdW5kYXJ5Rm9ySG90UmVsb2FkaW5nKGZpYmVyKTtcbiAgICAgIH1cblxuICAgICAgbG9nQ2FwdHVyZWRFcnJvcihmaWJlciwgZXJyb3JJbmZvKTtcbiAgICB9O1xuICB9XG5cbiAgdmFyIGluc3QgPSBmaWJlci5zdGF0ZU5vZGU7XG5cbiAgaWYgKGluc3QgIT09IG51bGwgJiYgdHlwZW9mIGluc3QuY29tcG9uZW50RGlkQ2F0Y2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICB1cGRhdGUuY2FsbGJhY2sgPSBmdW5jdGlvbiBjYWxsYmFjaygpIHtcbiAgICAgIHtcbiAgICAgICAgbWFya0ZhaWxlZEVycm9yQm91bmRhcnlGb3JIb3RSZWxvYWRpbmcoZmliZXIpO1xuICAgICAgfVxuXG4gICAgICBsb2dDYXB0dXJlZEVycm9yKGZpYmVyLCBlcnJvckluZm8pO1xuXG4gICAgICBpZiAodHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUbyBwcmVzZXJ2ZSB0aGUgcHJlZXhpc3RpbmcgcmV0cnkgYmVoYXZpb3Igb2YgZXJyb3IgYm91bmRhcmllcyxcbiAgICAgICAgLy8gd2Uga2VlcCB0cmFjayBvZiB3aGljaCBvbmVzIGFscmVhZHkgZmFpbGVkIGR1cmluZyB0aGlzIGJhdGNoLlxuICAgICAgICAvLyBUaGlzIGdldHMgcmVzZXQgYmVmb3JlIHdlIHlpZWxkIGJhY2sgdG8gdGhlIGJyb3dzZXIuXG4gICAgICAgIC8vIFRPRE86IFdhcm4gaW4gc3RyaWN0IG1vZGUgaWYgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIGlzXG4gICAgICAgIC8vIG5vdCBkZWZpbmVkLlxuICAgICAgICBtYXJrTGVnYWN5RXJyb3JCb3VuZGFyeUFzRmFpbGVkKHRoaXMpO1xuICAgICAgfVxuXG4gICAgICB2YXIgZXJyb3IkMSA9IGVycm9ySW5mby52YWx1ZTtcbiAgICAgIHZhciBzdGFjayA9IGVycm9ySW5mby5zdGFjaztcbiAgICAgIHRoaXMuY29tcG9uZW50RGlkQ2F0Y2goZXJyb3IkMSwge1xuICAgICAgICBjb21wb25lbnRTdGFjazogc3RhY2sgIT09IG51bGwgPyBzdGFjayA6ICcnXG4gICAgICB9KTtcblxuICAgICAge1xuICAgICAgICBpZiAodHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIC8vIElmIGNvbXBvbmVudERpZENhdGNoIGlzIHRoZSBvbmx5IGVycm9yIGJvdW5kYXJ5IG1ldGhvZCBkZWZpbmVkLFxuICAgICAgICAgIC8vIHRoZW4gaXQgbmVlZHMgdG8gY2FsbCBzZXRTdGF0ZSB0byByZWNvdmVyIGZyb20gZXJyb3JzLlxuICAgICAgICAgIC8vIElmIG5vIHN0YXRlIHVwZGF0ZSBpcyBzY2hlZHVsZWQgdGhlbiB0aGUgYm91bmRhcnkgd2lsbCBzd2FsbG93IHRoZSBlcnJvci5cbiAgICAgICAgICBpZiAoIWluY2x1ZGVzU29tZUxhbmUoZmliZXIubGFuZXMsIFN5bmNMYW5lKSkge1xuICAgICAgICAgICAgZXJyb3IoJyVzOiBFcnJvciBib3VuZGFyaWVzIHNob3VsZCBpbXBsZW1lbnQgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKCkuICcgKyAnSW4gdGhhdCBtZXRob2QsIHJldHVybiBhIHN0YXRlIHVwZGF0ZSB0byBkaXNwbGF5IGFuIGVycm9yIG1lc3NhZ2Ugb3IgZmFsbGJhY2sgVUkuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ1Vua25vd24nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZTtcbn1cblxuZnVuY3Rpb24gYXR0YWNoUGluZ0xpc3RlbmVyKHJvb3QsIHdha2VhYmxlLCBsYW5lcykge1xuICAvLyBBdHRhY2ggYSBwaW5nIGxpc3RlbmVyXG4gIC8vXG4gIC8vIFRoZSBkYXRhIG1pZ2h0IHJlc29sdmUgYmVmb3JlIHdlIGhhdmUgYSBjaGFuY2UgdG8gY29tbWl0IHRoZSBmYWxsYmFjay4gT3IsXG4gIC8vIGluIHRoZSBjYXNlIG9mIGEgcmVmcmVzaCwgd2UnbGwgbmV2ZXIgY29tbWl0IGEgZmFsbGJhY2suIFNvIHdlIG5lZWQgdG9cbiAgLy8gYXR0YWNoIGEgbGlzdGVuZXIgbm93LiBXaGVuIGl0IHJlc29sdmVzIChcInBpbmdzXCIpLCB3ZSBjYW4gZGVjaWRlIHdoZXRoZXIgdG9cbiAgLy8gdHJ5IHJlbmRlcmluZyB0aGUgdHJlZSBhZ2Fpbi5cbiAgLy9cbiAgLy8gT25seSBhdHRhY2ggYSBsaXN0ZW5lciBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBmb3IgdGhlIGxhbmVzXG4gIC8vIHdlJ3JlIGN1cnJlbnRseSByZW5kZXJpbmcgKHdoaWNoIGFjdHMgbGlrZSBhIFwidGhyZWFkIElEXCIgaGVyZSkuXG4gIC8vXG4gIC8vIFdlIG9ubHkgbmVlZCB0byBkbyB0aGlzIGluIGNvbmN1cnJlbnQgbW9kZS4gTGVnYWN5IFN1c3BlbnNlIGFsd2F5c1xuICAvLyBjb21taXRzIGZhbGxiYWNrcyBzeW5jaHJvbm91c2x5LCBzbyB0aGVyZSBhcmUgbm8gcGluZ3MuXG4gIHZhciBwaW5nQ2FjaGUgPSByb290LnBpbmdDYWNoZTtcbiAgdmFyIHRocmVhZElEcztcblxuICBpZiAocGluZ0NhY2hlID09PSBudWxsKSB7XG4gICAgcGluZ0NhY2hlID0gcm9vdC5waW5nQ2FjaGUgPSBuZXcgUG9zc2libHlXZWFrTWFwJDEoKTtcbiAgICB0aHJlYWRJRHMgPSBuZXcgU2V0KCk7XG4gICAgcGluZ0NhY2hlLnNldCh3YWtlYWJsZSwgdGhyZWFkSURzKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJlYWRJRHMgPSBwaW5nQ2FjaGUuZ2V0KHdha2VhYmxlKTtcblxuICAgIGlmICh0aHJlYWRJRHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyZWFkSURzID0gbmV3IFNldCgpO1xuICAgICAgcGluZ0NhY2hlLnNldCh3YWtlYWJsZSwgdGhyZWFkSURzKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIXRocmVhZElEcy5oYXMobGFuZXMpKSB7XG4gICAgLy8gTWVtb2l6ZSB1c2luZyB0aGUgdGhyZWFkIElEIHRvIHByZXZlbnQgcmVkdW5kYW50IGxpc3RlbmVycy5cbiAgICB0aHJlYWRJRHMuYWRkKGxhbmVzKTtcbiAgICB2YXIgcGluZyA9IHBpbmdTdXNwZW5kZWRSb290LmJpbmQobnVsbCwgcm9vdCwgd2FrZWFibGUsIGxhbmVzKTtcblxuICAgIHtcbiAgICAgIGlmIChpc0RldlRvb2xzUHJlc2VudCkge1xuICAgICAgICAvLyBJZiB3ZSBoYXZlIHBlbmRpbmcgd29yayBzdGlsbCwgcmVzdG9yZSB0aGUgb3JpZ2luYWwgdXBkYXRlcnNcbiAgICAgICAgcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhyb290LCBsYW5lcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd2FrZWFibGUudGhlbihwaW5nLCBwaW5nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhdHRhY2hSZXRyeUxpc3RlbmVyKHN1c3BlbnNlQm91bmRhcnksIHJvb3QsIHdha2VhYmxlLCBsYW5lcykge1xuICAvLyBSZXRyeSBsaXN0ZW5lclxuICAvL1xuICAvLyBJZiB0aGUgZmFsbGJhY2sgZG9lcyBjb21taXQsIHdlIG5lZWQgdG8gYXR0YWNoIGEgZGlmZmVyZW50IHR5cGUgb2ZcbiAgLy8gbGlzdGVuZXIuIFRoaXMgb25lIHNjaGVkdWxlcyBhbiB1cGRhdGUgb24gdGhlIFN1c3BlbnNlIGJvdW5kYXJ5IHRvIHR1cm5cbiAgLy8gdGhlIGZhbGxiYWNrIHN0YXRlIG9mZi5cbiAgLy9cbiAgLy8gU3Rhc2ggdGhlIHdha2VhYmxlIG9uIHRoZSBib3VuZGFyeSBmaWJlciBzbyB3ZSBjYW4gYWNjZXNzIGl0IGluIHRoZVxuICAvLyBjb21taXQgcGhhc2UuXG4gIC8vXG4gIC8vIFdoZW4gdGhlIHdha2VhYmxlIHJlc29sdmVzLCB3ZSdsbCBhdHRlbXB0IHRvIHJlbmRlciB0aGUgYm91bmRhcnlcbiAgLy8gYWdhaW4gKFwicmV0cnlcIikuXG4gIHZhciB3YWtlYWJsZXMgPSBzdXNwZW5zZUJvdW5kYXJ5LnVwZGF0ZVF1ZXVlO1xuXG4gIGlmICh3YWtlYWJsZXMgPT09IG51bGwpIHtcbiAgICB2YXIgdXBkYXRlUXVldWUgPSBuZXcgU2V0KCk7XG4gICAgdXBkYXRlUXVldWUuYWRkKHdha2VhYmxlKTtcbiAgICBzdXNwZW5zZUJvdW5kYXJ5LnVwZGF0ZVF1ZXVlID0gdXBkYXRlUXVldWU7XG4gIH0gZWxzZSB7XG4gICAgd2FrZWFibGVzLmFkZCh3YWtlYWJsZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzZXRTdXNwZW5kZWRDb21wb25lbnQoc291cmNlRmliZXIsIHJvb3RSZW5kZXJMYW5lcykge1xuICAvLyBBIGxlZ2FjeSBtb2RlIFN1c3BlbnNlIHF1aXJrLCBvbmx5IHJlbGV2YW50IHRvIGhvb2sgY29tcG9uZW50cy5cblxuXG4gIHZhciB0YWcgPSBzb3VyY2VGaWJlci50YWc7XG5cbiAgaWYgKChzb3VyY2VGaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUgJiYgKHRhZyA9PT0gRnVuY3Rpb25Db21wb25lbnQgfHwgdGFnID09PSBGb3J3YXJkUmVmIHx8IHRhZyA9PT0gU2ltcGxlTWVtb0NvbXBvbmVudCkpIHtcbiAgICB2YXIgY3VycmVudFNvdXJjZSA9IHNvdXJjZUZpYmVyLmFsdGVybmF0ZTtcblxuICAgIGlmIChjdXJyZW50U291cmNlKSB7XG4gICAgICBzb3VyY2VGaWJlci51cGRhdGVRdWV1ZSA9IGN1cnJlbnRTb3VyY2UudXBkYXRlUXVldWU7XG4gICAgICBzb3VyY2VGaWJlci5tZW1vaXplZFN0YXRlID0gY3VycmVudFNvdXJjZS5tZW1vaXplZFN0YXRlO1xuICAgICAgc291cmNlRmliZXIubGFuZXMgPSBjdXJyZW50U291cmNlLmxhbmVzO1xuICAgIH0gZWxzZSB7XG4gICAgICBzb3VyY2VGaWJlci51cGRhdGVRdWV1ZSA9IG51bGw7XG4gICAgICBzb3VyY2VGaWJlci5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TmVhcmVzdFN1c3BlbnNlQm91bmRhcnlUb0NhcHR1cmUocmV0dXJuRmliZXIpIHtcbiAgdmFyIG5vZGUgPSByZXR1cm5GaWJlcjtcblxuICBkbyB7XG4gICAgaWYgKG5vZGUudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCAmJiBzaG91bGRDYXB0dXJlU3VzcGVuc2Uobm9kZSkpIHtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH0gLy8gVGhpcyBib3VuZGFyeSBhbHJlYWR5IGNhcHR1cmVkIGR1cmluZyB0aGlzIHJlbmRlci4gQ29udGludWUgdG8gdGhlIG5leHRcbiAgICAvLyBib3VuZGFyeS5cblxuXG4gICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICB9IHdoaWxlIChub2RlICE9PSBudWxsKTtcblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gbWFya1N1c3BlbnNlQm91bmRhcnlTaG91bGRDYXB0dXJlKHN1c3BlbnNlQm91bmRhcnksIHJldHVybkZpYmVyLCBzb3VyY2VGaWJlciwgcm9vdCwgcm9vdFJlbmRlckxhbmVzKSB7XG4gIC8vIFRoaXMgbWFya3MgYSBTdXNwZW5zZSBib3VuZGFyeSBzbyB0aGF0IHdoZW4gd2UncmUgdW53aW5kaW5nIHRoZSBzdGFjayxcbiAgLy8gaXQgY2FwdHVyZXMgdGhlIHN1c3BlbmRlZCBcImV4Y2VwdGlvblwiIGFuZCBkb2VzIGEgc2Vjb25kIChmYWxsYmFjaykgcGFzcy5cbiAgaWYgKChzdXNwZW5zZUJvdW5kYXJ5Lm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgIC8vIExlZ2FjeSBNb2RlIFN1c3BlbnNlXG4gICAgLy9cbiAgICAvLyBJZiB0aGUgYm91bmRhcnkgaXMgaW4gbGVnYWN5IG1vZGUsIHdlIHNob3VsZCAqbm90KlxuICAgIC8vIHN1c3BlbmQgdGhlIGNvbW1pdC4gUHJldGVuZCBhcyBpZiB0aGUgc3VzcGVuZGVkIGNvbXBvbmVudCByZW5kZXJlZFxuICAgIC8vIG51bGwgYW5kIGtlZXAgcmVuZGVyaW5nLiBXaGVuIHRoZSBTdXNwZW5zZSBib3VuZGFyeSBjb21wbGV0ZXMsXG4gICAgLy8gd2UnbGwgZG8gYSBzZWNvbmQgcGFzcyB0byByZW5kZXIgdGhlIGZhbGxiYWNrLlxuICAgIGlmIChzdXNwZW5zZUJvdW5kYXJ5ID09PSByZXR1cm5GaWJlcikge1xuICAgICAgLy8gU3BlY2lhbCBjYXNlIHdoZXJlIHdlIHN1c3BlbmRlZCB3aGlsZSByZWNvbmNpbGluZyB0aGUgY2hpbGRyZW4gb2ZcbiAgICAgIC8vIGEgU3VzcGVuc2UgYm91bmRhcnkncyBpbm5lciBPZmZzY3JlZW4gd3JhcHBlciBmaWJlci4gVGhpcyBoYXBwZW5zXG4gICAgICAvLyB3aGVuIGEgUmVhY3QubGF6eSBjb21wb25lbnQgaXMgYSBkaXJlY3QgY2hpbGQgb2YgYVxuICAgICAgLy8gU3VzcGVuc2UgYm91bmRhcnkuXG4gICAgICAvL1xuICAgICAgLy8gU3VzcGVuc2UgYm91bmRhcmllcyBhcmUgaW1wbGVtZW50ZWQgYXMgbXVsdGlwbGUgZmliZXJzLCBidXQgdGhleVxuICAgICAgLy8gYXJlIGEgc2luZ2xlIGNvbmNlcHR1YWwgdW5pdC4gVGhlIGxlZ2FjeSBtb2RlIGJlaGF2aW9yIHdoZXJlIHdlXG4gICAgICAvLyBwcmV0ZW5kIHRoZSBzdXNwZW5kZWQgZmliZXIgY29tbWl0dGVkIGFzIGBudWxsYCB3b24ndCB3b3JrLFxuICAgICAgLy8gYmVjYXVzZSBpbiB0aGlzIGNhc2UgdGhlIFwic3VzcGVuZGVkXCIgZmliZXIgaXMgdGhlIGlubmVyXG4gICAgICAvLyBPZmZzY3JlZW4gd3JhcHBlci5cbiAgICAgIC8vXG4gICAgICAvLyBCZWNhdXNlIHRoZSBjb250ZW50cyBvZiB0aGUgYm91bmRhcnkgaGF2ZW4ndCBzdGFydGVkIHJlbmRlcmluZ1xuICAgICAgLy8geWV0IChpLmUuIG5vdGhpbmcgaW4gdGhlIHRyZWUgaGFzIHBhcnRpYWxseSByZW5kZXJlZCkgd2UgY2FuXG4gICAgICAvLyBzd2l0Y2ggdG8gdGhlIHJlZ3VsYXIsIGNvbmN1cnJlbnQgbW9kZSBiZWhhdmlvcjogbWFyayB0aGVcbiAgICAgIC8vIGJvdW5kYXJ5IHdpdGggU2hvdWxkQ2FwdHVyZSBhbmQgZW50ZXIgdGhlIHVud2luZCBwaGFzZS5cbiAgICAgIHN1c3BlbnNlQm91bmRhcnkuZmxhZ3MgfD0gU2hvdWxkQ2FwdHVyZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3VzcGVuc2VCb3VuZGFyeS5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgc291cmNlRmliZXIuZmxhZ3MgfD0gRm9yY2VVcGRhdGVGb3JMZWdhY3lTdXNwZW5zZTsgLy8gV2UncmUgZ29pbmcgdG8gY29tbWl0IHRoaXMgZmliZXIgZXZlbiB0aG91Z2ggaXQgZGlkbid0IGNvbXBsZXRlLlxuICAgICAgLy8gQnV0IHdlIHNob3VsZG4ndCBjYWxsIGFueSBsaWZlY3ljbGUgbWV0aG9kcyBvciBjYWxsYmFja3MuIFJlbW92ZVxuICAgICAgLy8gYWxsIGxpZmVjeWNsZSBlZmZlY3QgdGFncy5cblxuICAgICAgc291cmNlRmliZXIuZmxhZ3MgJj0gfihMaWZlY3ljbGVFZmZlY3RNYXNrIHwgSW5jb21wbGV0ZSk7XG5cbiAgICAgIGlmIChzb3VyY2VGaWJlci50YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICAgIHZhciBjdXJyZW50U291cmNlRmliZXIgPSBzb3VyY2VGaWJlci5hbHRlcm5hdGU7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRTb3VyY2VGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgYSBuZXcgbW91bnQuIENoYW5nZSB0aGUgdGFnIHNvIGl0J3Mgbm90IG1pc3Rha2VuIGZvciBhXG4gICAgICAgICAgLy8gY29tcGxldGVkIGNsYXNzIGNvbXBvbmVudC4gRm9yIGV4YW1wbGUsIHdlIHNob3VsZCBub3QgY2FsbFxuICAgICAgICAgIC8vIGNvbXBvbmVudFdpbGxVbm1vdW50IGlmIGl0IGlzIGRlbGV0ZWQuXG4gICAgICAgICAgc291cmNlRmliZXIudGFnID0gSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFdoZW4gd2UgdHJ5IHJlbmRlcmluZyBhZ2Fpbiwgd2Ugc2hvdWxkIG5vdCByZXVzZSB0aGUgY3VycmVudCBmaWJlcixcbiAgICAgICAgICAvLyBzaW5jZSBpdCdzIGtub3duIHRvIGJlIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4gVXNlIGEgZm9yY2UgdXBkYXRlIHRvXG4gICAgICAgICAgLy8gcHJldmVudCBhIGJhaWwgb3V0LlxuICAgICAgICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoTm9UaW1lc3RhbXAsIFN5bmNMYW5lKTtcbiAgICAgICAgICB1cGRhdGUudGFnID0gRm9yY2VVcGRhdGU7XG4gICAgICAgICAgZW5xdWV1ZVVwZGF0ZShzb3VyY2VGaWJlciwgdXBkYXRlLCBTeW5jTGFuZSk7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gVGhlIHNvdXJjZSBmaWJlciBkaWQgbm90IGNvbXBsZXRlLiBNYXJrIGl0IHdpdGggU3luYyBwcmlvcml0eSB0b1xuICAgICAgLy8gaW5kaWNhdGUgdGhhdCBpdCBzdGlsbCBoYXMgcGVuZGluZyB3b3JrLlxuXG5cbiAgICAgIHNvdXJjZUZpYmVyLmxhbmVzID0gbWVyZ2VMYW5lcyhzb3VyY2VGaWJlci5sYW5lcywgU3luY0xhbmUpO1xuICAgIH1cblxuICAgIHJldHVybiBzdXNwZW5zZUJvdW5kYXJ5O1xuICB9IC8vIENvbmZpcm1lZCB0aGF0IHRoZSBib3VuZGFyeSBpcyBpbiBhIGNvbmN1cnJlbnQgbW9kZSB0cmVlLiBDb250aW51ZVxuICAvLyB3aXRoIHRoZSBub3JtYWwgc3VzcGVuZCBwYXRoLlxuICAvL1xuICAvLyBBZnRlciB0aGlzIHdlJ2xsIHVzZSBhIHNldCBvZiBoZXVyaXN0aWNzIHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXNcbiAgLy8gcmVuZGVyIHBhc3Mgd2lsbCBydW4gdG8gY29tcGxldGlvbiBvciByZXN0YXJ0IG9yIFwic3VzcGVuZFwiIHRoZSBjb21taXQuXG4gIC8vIFRoZSBhY3R1YWwgbG9naWMgZm9yIHRoaXMgaXMgc3ByZWFkIG91dCBpbiBkaWZmZXJlbnQgcGxhY2VzLlxuICAvL1xuICAvLyBUaGlzIGZpcnN0IHByaW5jaXBsZSBpcyB0aGF0IGlmIHdlJ3JlIGdvaW5nIHRvIHN1c3BlbmQgd2hlbiB3ZSBjb21wbGV0ZVxuICAvLyBhIHJvb3QsIHRoZW4gd2Ugc2hvdWxkIGFsc28gcmVzdGFydCBpZiB3ZSBnZXQgYW4gdXBkYXRlIG9yIHBpbmcgdGhhdFxuICAvLyBtaWdodCB1bnN1c3BlbmQgaXQsIGFuZCB2aWNlIHZlcnNhLiBUaGUgb25seSByZWFzb24gdG8gc3VzcGVuZCBpc1xuICAvLyBiZWNhdXNlIHlvdSB0aGluayB5b3UgbWlnaHQgd2FudCB0byByZXN0YXJ0IGJlZm9yZSBjb21taXR0aW5nLiBIb3dldmVyLFxuICAvLyBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gcmVzdGFydCBvbmx5IHdoaWxlIGluIHRoZSBwZXJpb2Qgd2UncmUgc3VzcGVuZGVkLlxuICAvL1xuICAvLyBSZXN0YXJ0aW5nIHRvbyBhZ2dyZXNzaXZlbHkgaXMgYWxzbyBub3QgZ29vZCBiZWNhdXNlIGl0IHN0YXJ2ZXMgb3V0IGFueVxuICAvLyBpbnRlcm1lZGlhdGUgbG9hZGluZyBzdGF0ZS4gU28gd2UgdXNlIGhldXJpc3RpY3MgdG8gZGV0ZXJtaW5lIHdoZW4uXG4gIC8vIFN1c3BlbnNlIEhldXJpc3RpY3NcbiAgLy9cbiAgLy8gSWYgbm90aGluZyB0aHJldyBhIFByb21pc2Ugb3IgYWxsIHRoZSBzYW1lIGZhbGxiYWNrcyBhcmUgYWxyZWFkeSBzaG93aW5nLFxuICAvLyB0aGVuIGRvbid0IHN1c3BlbmQvcmVzdGFydC5cbiAgLy9cbiAgLy8gSWYgdGhpcyBpcyBhbiBpbml0aWFsIHJlbmRlciBvZiBhIG5ldyB0cmVlIG9mIFN1c3BlbnNlIGJvdW5kYXJpZXMgYW5kXG4gIC8vIHRob3NlIHRyaWdnZXIgYSBmYWxsYmFjaywgdGhlbiBkb24ndCBzdXNwZW5kL3Jlc3RhcnQuIFdlIHdhbnQgdG8gZW5zdXJlXG4gIC8vIHRoYXQgd2UgY2FuIHNob3cgdGhlIGluaXRpYWwgbG9hZGluZyBzdGF0ZSBhcyBxdWlja2x5IGFzIHBvc3NpYmxlLlxuICAvL1xuICAvLyBJZiB3ZSBoaXQgYSBcIkRlbGF5ZWRcIiBjYXNlLCBzdWNoIGFzIHdoZW4gd2UnZCBzd2l0Y2ggZnJvbSBjb250ZW50IGJhY2sgaW50b1xuICAvLyBhIGZhbGxiYWNrLCB0aGVuIHdlIHNob3VsZCBhbHdheXMgc3VzcGVuZC9yZXN0YXJ0LiBUcmFuc2l0aW9ucyBhcHBseVxuICAvLyB0byB0aGlzIGNhc2UuIElmIG5vbmUgaXMgZGVmaW5lZCwgSk5EIGlzIHVzZWQgaW5zdGVhZC5cbiAgLy9cbiAgLy8gSWYgd2UncmUgYWxyZWFkeSBzaG93aW5nIGEgZmFsbGJhY2sgYW5kIGl0IGdldHMgXCJyZXRyaWVkXCIsIGFsbG93aW5nIHVzIHRvIHNob3dcbiAgLy8gYW5vdGhlciBsZXZlbCwgYnV0IHRoZXJlJ3Mgc3RpbGwgYW4gaW5uZXIgYm91bmRhcnkgdGhhdCB3b3VsZCBzaG93IGEgZmFsbGJhY2ssXG4gIC8vIHRoZW4gd2Ugc3VzcGVuZC9yZXN0YXJ0IGZvciA1MDBtcyBzaW5jZSB0aGUgbGFzdCB0aW1lIHdlIHNob3dlZCBhIGZhbGxiYWNrXG4gIC8vIGFueXdoZXJlIGluIHRoZSB0cmVlLiBUaGlzIGVmZmVjdGl2ZWx5IHRocm90dGxlcyBwcm9ncmVzc2l2ZSBsb2FkaW5nIGludG8gYVxuICAvLyBjb25zaXN0ZW50IHRyYWluIG9mIGNvbW1pdHMuIFRoaXMgYWxzbyBnaXZlcyB1cyBhbiBvcHBvcnR1bml0eSB0byByZXN0YXJ0IHRvXG4gIC8vIGdldCB0byB0aGUgY29tcGxldGVkIHN0YXRlIHNsaWdodGx5IGVhcmxpZXIuXG4gIC8vXG4gIC8vIElmIHRoZXJlJ3MgYW1iaWd1aXR5IGR1ZSB0byBiYXRjaGluZyBpdCdzIHJlc29sdmVkIGluIHByZWZlcmVuY2Ugb2Y6XG4gIC8vIDEpIFwiZGVsYXllZFwiLCAyKSBcImluaXRpYWwgcmVuZGVyXCIsIDMpIFwicmV0cnlcIi5cbiAgLy9cbiAgLy8gV2Ugd2FudCB0byBlbnN1cmUgdGhhdCBhIFwiYnVzeVwiIHN0YXRlIGRvZXNuJ3QgZ2V0IGZvcmNlIGNvbW1pdHRlZC4gV2Ugd2FudCB0b1xuICAvLyBlbnN1cmUgdGhhdCBuZXcgaW5pdGlhbCBsb2FkaW5nIHN0YXRlcyBjYW4gY29tbWl0IGFzIHNvb24gYXMgcG9zc2libGUuXG5cblxuICBzdXNwZW5zZUJvdW5kYXJ5LmZsYWdzIHw9IFNob3VsZENhcHR1cmU7IC8vIFRPRE86IEkgdGhpbmsgd2UgY2FuIHJlbW92ZSB0aGlzLCBzaW5jZSB3ZSBub3cgdXNlIGBEaWRDYXB0dXJlYCBpblxuICAvLyB0aGUgYmVnaW4gcGhhc2UgdG8gcHJldmVudCBhbiBlYXJseSBiYWlsb3V0LlxuXG4gIHN1c3BlbnNlQm91bmRhcnkubGFuZXMgPSByb290UmVuZGVyTGFuZXM7XG4gIHJldHVybiBzdXNwZW5zZUJvdW5kYXJ5O1xufVxuXG5mdW5jdGlvbiB0aHJvd0V4Y2VwdGlvbihyb290LCByZXR1cm5GaWJlciwgc291cmNlRmliZXIsIHZhbHVlLCByb290UmVuZGVyTGFuZXMpIHtcbiAgLy8gVGhlIHNvdXJjZSBmaWJlciBkaWQgbm90IGNvbXBsZXRlLlxuICBzb3VyY2VGaWJlci5mbGFncyB8PSBJbmNvbXBsZXRlO1xuXG4gIHtcbiAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgIC8vIElmIHdlIGhhdmUgcGVuZGluZyB3b3JrIHN0aWxsLCByZXN0b3JlIHRoZSBvcmlnaW5hbCB1cGRhdGVyc1xuICAgICAgcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhyb290LCByb290UmVuZGVyTGFuZXMpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZS50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gVGhpcyBpcyBhIHdha2VhYmxlLiBUaGUgY29tcG9uZW50IHN1c3BlbmRlZC5cbiAgICB2YXIgd2FrZWFibGUgPSB2YWx1ZTtcbiAgICByZXNldFN1c3BlbmRlZENvbXBvbmVudChzb3VyY2VGaWJlcik7XG5cbiAgICB7XG4gICAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBzb3VyY2VGaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpIHtcbiAgICAgICAgbWFya0RpZFRocm93V2hpbGVIeWRyYXRpbmdERVYoKTtcbiAgICAgIH1cbiAgICB9XG5cblxuICAgIHZhciBzdXNwZW5zZUJvdW5kYXJ5ID0gZ2V0TmVhcmVzdFN1c3BlbnNlQm91bmRhcnlUb0NhcHR1cmUocmV0dXJuRmliZXIpO1xuXG4gICAgaWYgKHN1c3BlbnNlQm91bmRhcnkgIT09IG51bGwpIHtcbiAgICAgIHN1c3BlbnNlQm91bmRhcnkuZmxhZ3MgJj0gfkZvcmNlQ2xpZW50UmVuZGVyO1xuICAgICAgbWFya1N1c3BlbnNlQm91bmRhcnlTaG91bGRDYXB0dXJlKHN1c3BlbnNlQm91bmRhcnksIHJldHVybkZpYmVyLCBzb3VyY2VGaWJlciwgcm9vdCwgcm9vdFJlbmRlckxhbmVzKTsgLy8gV2Ugb25seSBhdHRhY2ggcGluZyBsaXN0ZW5lcnMgaW4gY29uY3VycmVudCBtb2RlLiBMZWdhY3kgU3VzcGVuc2UgYWx3YXlzXG4gICAgICAvLyBjb21taXRzIGZhbGxiYWNrcyBzeW5jaHJvbm91c2x5LCBzbyB0aGVyZSBhcmUgbm8gcGluZ3MuXG5cbiAgICAgIGlmIChzdXNwZW5zZUJvdW5kYXJ5Lm1vZGUgJiBDb25jdXJyZW50TW9kZSkge1xuICAgICAgICBhdHRhY2hQaW5nTGlzdGVuZXIocm9vdCwgd2FrZWFibGUsIHJvb3RSZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICAgIGF0dGFjaFJldHJ5TGlzdGVuZXIoc3VzcGVuc2VCb3VuZGFyeSwgcm9vdCwgd2FrZWFibGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBObyBib3VuZGFyeSB3YXMgZm91bmQuIFVubGVzcyB0aGlzIGlzIGEgc3luYyB1cGRhdGUsIHRoaXMgaXMgT0suXG4gICAgICAvLyBXZSBjYW4gc3VzcGVuZCBhbmQgd2FpdCBmb3IgbW9yZSBkYXRhIHRvIGFycml2ZS5cbiAgICAgIGlmICghaW5jbHVkZXNTeW5jTGFuZShyb290UmVuZGVyTGFuZXMpKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgbm90IGEgc3luYyB1cGRhdGUuIFN1c3BlbmQuIFNpbmNlIHdlJ3JlIG5vdCBhY3RpdmF0aW5nIGFcbiAgICAgICAgLy8gU3VzcGVuc2UgYm91bmRhcnksIHRoaXMgd2lsbCB1bndpbmQgYWxsIHRoZSB3YXkgdG8gdGhlIHJvb3Qgd2l0aG91dFxuICAgICAgICAvLyBwZXJmb3JtaW5nIGEgc2Vjb25kIHBhc3MgdG8gcmVuZGVyIGEgZmFsbGJhY2suIChUaGlzIGlzIGFyZ3VhYmx5IGhvd1xuICAgICAgICAvLyByZWZyZXNoIHRyYW5zaXRpb25zIHNob3VsZCB3b3JrLCB0b28sIHNpbmNlIHdlJ3JlIG5vdCBnb2luZyB0byBjb21taXRcbiAgICAgICAgLy8gdGhlIGZhbGxiYWNrcyBhbnl3YXkuKVxuICAgICAgICAvL1xuICAgICAgICAvLyBUaGlzIGNhc2UgYWxzbyBhcHBsaWVzIHRvIGluaXRpYWwgaHlkcmF0aW9uLlxuICAgICAgICBhdHRhY2hQaW5nTGlzdGVuZXIocm9vdCwgd2FrZWFibGUsIHJvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgIHJlbmRlckRpZFN1c3BlbmREZWxheUlmUG9zc2libGUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBUaGlzIGlzIGEgc3luYy9kaXNjcmV0ZSB1cGRhdGUuIFdlIHRyZWF0IHRoaXMgY2FzZSBsaWtlIGFuIGVycm9yXG4gICAgICAvLyBiZWNhdXNlIGRpc2NyZXRlIHJlbmRlcnMgYXJlIGV4cGVjdGVkIHRvIHByb2R1Y2UgYSBjb21wbGV0ZSB0cmVlXG4gICAgICAvLyBzeW5jaHJvbm91c2x5IHRvIG1haW50YWluIGNvbnNpc3RlbmN5IHdpdGggZXh0ZXJuYWwgc3RhdGUuXG5cblxuICAgICAgdmFyIHVuY2F1Z2h0U3VzcGVuc2VFcnJvciA9IG5ldyBFcnJvcignQSBjb21wb25lbnQgc3VzcGVuZGVkIHdoaWxlIHJlc3BvbmRpbmcgdG8gc3luY2hyb25vdXMgaW5wdXQuIFRoaXMgJyArICd3aWxsIGNhdXNlIHRoZSBVSSB0byBiZSByZXBsYWNlZCB3aXRoIGEgbG9hZGluZyBpbmRpY2F0b3IuIFRvICcgKyAnZml4LCB1cGRhdGVzIHRoYXQgc3VzcGVuZCBzaG91bGQgYmUgd3JhcHBlZCAnICsgJ3dpdGggc3RhcnRUcmFuc2l0aW9uLicpOyAvLyBJZiB3ZSdyZSBvdXRzaWRlIGEgdHJhbnNpdGlvbiwgZmFsbCB0aHJvdWdoIHRvIHRoZSByZWd1bGFyIGVycm9yIHBhdGguXG4gICAgICAvLyBUaGUgZXJyb3Igd2lsbCBiZSBjYXVnaHQgYnkgdGhlIG5lYXJlc3Qgc3VzcGVuc2UgYm91bmRhcnkuXG5cbiAgICAgIHZhbHVlID0gdW5jYXVnaHRTdXNwZW5zZUVycm9yO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIGEgcmVndWxhciBlcnJvciwgbm90IGEgU3VzcGVuc2Ugd2FrZWFibGUuXG4gICAgaWYgKGdldElzSHlkcmF0aW5nKCkgJiYgc291cmNlRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSB7XG4gICAgICBtYXJrRGlkVGhyb3dXaGlsZUh5ZHJhdGluZ0RFVigpO1xuXG4gICAgICB2YXIgX3N1c3BlbnNlQm91bmRhcnkgPSBnZXROZWFyZXN0U3VzcGVuc2VCb3VuZGFyeVRvQ2FwdHVyZShyZXR1cm5GaWJlcik7IC8vIElmIHRoZSBlcnJvciB3YXMgdGhyb3duIGR1cmluZyBoeWRyYXRpb24sIHdlIG1heSBiZSBhYmxlIHRvIHJlY292ZXIgYnlcbiAgICAgIC8vIGRpc2NhcmRpbmcgdGhlIGRlaHlkcmF0ZWQgY29udGVudCBhbmQgc3dpdGNoaW5nIHRvIGEgY2xpZW50IHJlbmRlci5cbiAgICAgIC8vIEluc3RlYWQgb2Ygc3VyZmFjaW5nIHRoZSBlcnJvciwgZmluZCB0aGUgbmVhcmVzdCBTdXNwZW5zZSBib3VuZGFyeVxuICAgICAgLy8gYW5kIHJlbmRlciBpdCBhZ2FpbiB3aXRob3V0IGh5ZHJhdGlvbi5cblxuXG4gICAgICBpZiAoX3N1c3BlbnNlQm91bmRhcnkgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKChfc3VzcGVuc2VCb3VuZGFyeS5mbGFncyAmIFNob3VsZENhcHR1cmUpID09PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgLy8gU2V0IGEgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IHdlIHNob3VsZCB0cnkgcmVuZGVyaW5nIHRoZSBub3JtYWxcbiAgICAgICAgICAvLyBjaGlsZHJlbiBhZ2Fpbiwgbm90IHRoZSBmYWxsYmFjay5cbiAgICAgICAgICBfc3VzcGVuc2VCb3VuZGFyeS5mbGFncyB8PSBGb3JjZUNsaWVudFJlbmRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIG1hcmtTdXNwZW5zZUJvdW5kYXJ5U2hvdWxkQ2FwdHVyZShfc3VzcGVuc2VCb3VuZGFyeSwgcmV0dXJuRmliZXIsIHNvdXJjZUZpYmVyLCByb290LCByb290UmVuZGVyTGFuZXMpOyAvLyBFdmVuIHRob3VnaCB0aGUgdXNlciBtYXkgbm90IGJlIGFmZmVjdGVkIGJ5IHRoaXMgZXJyb3IsIHdlIHNob3VsZFxuICAgICAgICAvLyBzdGlsbCBsb2cgaXQgc28gaXQgY2FuIGJlIGZpeGVkLlxuXG4gICAgICAgIHF1ZXVlSHlkcmF0aW9uRXJyb3IoY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIodmFsdWUsIHNvdXJjZUZpYmVyKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YWx1ZSA9IGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKHZhbHVlLCBzb3VyY2VGaWJlcik7XG4gIHJlbmRlckRpZEVycm9yKHZhbHVlKTsgLy8gV2UgZGlkbid0IGZpbmQgYSBib3VuZGFyeSB0aGF0IGNvdWxkIGhhbmRsZSB0aGlzIHR5cGUgb2YgZXhjZXB0aW9uLiBTdGFydFxuICAvLyBvdmVyIGFuZCB0cmF2ZXJzZSBwYXJlbnQgcGF0aCBhZ2FpbiwgdGhpcyB0aW1lIHRyZWF0aW5nIHRoZSBleGNlcHRpb25cbiAgLy8gYXMgYW4gZXJyb3IuXG5cbiAgdmFyIHdvcmtJblByb2dyZXNzID0gcmV0dXJuRmliZXI7XG5cbiAgZG8ge1xuICAgIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9lcnJvckluZm8gPSB2YWx1ZTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTaG91bGRDYXB0dXJlO1xuICAgICAgICAgIHZhciBsYW5lID0gcGlja0FyYml0cmFyeUxhbmUocm9vdFJlbmRlckxhbmVzKTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IG1lcmdlTGFuZXMod29ya0luUHJvZ3Jlc3MubGFuZXMsIGxhbmUpO1xuICAgICAgICAgIHZhciB1cGRhdGUgPSBjcmVhdGVSb290RXJyb3JVcGRhdGUod29ya0luUHJvZ3Jlc3MsIF9lcnJvckluZm8sIGxhbmUpO1xuICAgICAgICAgIGVucXVldWVDYXB0dXJlZFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgdXBkYXRlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgLy8gQ2FwdHVyZSBhbmQgcmV0cnlcbiAgICAgICAgdmFyIGVycm9ySW5mbyA9IHZhbHVlO1xuICAgICAgICB2YXIgY3RvciA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICAgICAgICBpZiAoKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IE5vRmxhZ3MgJiYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciA9PT0gJ2Z1bmN0aW9uJyB8fCBpbnN0YW5jZSAhPT0gbnVsbCAmJiB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkQ2F0Y2ggPT09ICdmdW5jdGlvbicgJiYgIWlzQWxyZWFkeUZhaWxlZExlZ2FjeUVycm9yQm91bmRhcnkoaW5zdGFuY2UpKSkge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNob3VsZENhcHR1cmU7XG5cbiAgICAgICAgICB2YXIgX2xhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShyb290UmVuZGVyTGFuZXMpO1xuXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBtZXJnZUxhbmVzKHdvcmtJblByb2dyZXNzLmxhbmVzLCBfbGFuZSk7IC8vIFNjaGVkdWxlIHRoZSBlcnJvciBib3VuZGFyeSB0byByZS1yZW5kZXIgdXNpbmcgdXBkYXRlZCBzdGF0ZVxuXG4gICAgICAgICAgdmFyIF91cGRhdGUgPSBjcmVhdGVDbGFzc0Vycm9yVXBkYXRlKHdvcmtJblByb2dyZXNzLCBlcnJvckluZm8sIF9sYW5lKTtcblxuICAgICAgICAgIGVucXVldWVDYXB0dXJlZFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgX3VwZGF0ZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MgPSB3b3JrSW5Qcm9ncmVzcy5yZXR1cm47XG4gIH0gd2hpbGUgKHdvcmtJblByb2dyZXNzICE9PSBudWxsKTtcbn1cblxuZnVuY3Rpb24gZ2V0U3VzcGVuZGVkQ2FjaGUoKSB7XG4gIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgU3VzcGVuc2UgYm91bmRhcnkgc3VzcGVuZHMuIEl0IHJldHVybnMgdGhlXG59XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50T3duZXI7XG52YXIgZGlkUmVjZWl2ZVVwZGF0ZSA9IGZhbHNlO1xudmFyIGRpZFdhcm5BYm91dEJhZENsYXNzO1xudmFyIGRpZFdhcm5BYm91dE1vZHVsZVBhdHRlcm5Db21wb25lbnQ7XG52YXIgZGlkV2FybkFib3V0Q29udGV4dFR5cGVPbkZ1bmN0aW9uQ29tcG9uZW50O1xudmFyIGRpZFdhcm5BYm91dEdldERlcml2ZWRTdGF0ZU9uRnVuY3Rpb25Db21wb25lbnQ7XG52YXIgZGlkV2FybkFib3V0RnVuY3Rpb25SZWZzO1xudmFyIGRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHM7XG52YXIgZGlkV2FybkFib3V0UmV2ZWFsT3JkZXI7XG52YXIgZGlkV2FybkFib3V0VGFpbE9wdGlvbnM7XG52YXIgZGlkV2FybkFib3V0RGVmYXVsdFByb3BzT25GdW5jdGlvbkNvbXBvbmVudDtcblxue1xuICBkaWRXYXJuQWJvdXRCYWRDbGFzcyA9IHt9O1xuICBkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50ID0ge307XG4gIGRpZFdhcm5BYm91dENvbnRleHRUeXBlT25GdW5jdGlvbkNvbXBvbmVudCA9IHt9O1xuICBkaWRXYXJuQWJvdXRHZXREZXJpdmVkU3RhdGVPbkZ1bmN0aW9uQ29tcG9uZW50ID0ge307XG4gIGRpZFdhcm5BYm91dEZ1bmN0aW9uUmVmcyA9IHt9O1xuICBkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzID0gZmFsc2U7XG4gIGRpZFdhcm5BYm91dFJldmVhbE9yZGVyID0ge307XG4gIGRpZFdhcm5BYm91dFRhaWxPcHRpb25zID0ge307XG4gIGRpZFdhcm5BYm91dERlZmF1bHRQcm9wc09uRnVuY3Rpb25Db21wb25lbnQgPSB7fTtcbn1cblxuZnVuY3Rpb24gcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAvLyBJZiB0aGlzIGlzIGEgZnJlc2ggbmV3IGNvbXBvbmVudCB0aGF0IGhhc24ndCBiZWVuIHJlbmRlcmVkIHlldCwgd2VcbiAgICAvLyB3b24ndCB1cGRhdGUgaXRzIGNoaWxkIHNldCBieSBhcHBseWluZyBtaW5pbWFsIHNpZGUtZWZmZWN0cy4gSW5zdGVhZCxcbiAgICAvLyB3ZSB3aWxsIGFkZCB0aGVtIGFsbCB0byB0aGUgY2hpbGQgYmVmb3JlIGl0IGdldHMgcmVuZGVyZWQuIFRoYXQgbWVhbnNcbiAgICAvLyB3ZSBjYW4gb3B0aW1pemUgdGhpcyByZWNvbmNpbGlhdGlvbiBwYXNzIGJ5IG5vdCB0cmFja2luZyBzaWRlLWVmZmVjdHMuXG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBtb3VudENoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBudWxsLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBJZiB0aGUgY3VycmVudCBjaGlsZCBpcyB0aGUgc2FtZSBhcyB0aGUgd29yayBpbiBwcm9ncmVzcywgaXQgbWVhbnMgdGhhdFxuICAgIC8vIHdlIGhhdmVuJ3QgeWV0IHN0YXJ0ZWQgYW55IHdvcmsgb24gdGhlc2UgY2hpbGRyZW4uIFRoZXJlZm9yZSwgd2UgdXNlXG4gICAgLy8gdGhlIGNsb25lIGFsZ29yaXRobSB0byBjcmVhdGUgYSBjb3B5IG9mIGFsbCB0aGUgY3VycmVudCBjaGlsZHJlbi5cbiAgICAvLyBJZiB3ZSBoYWQgYW55IHByb2dyZXNzZWQgd29yayBhbHJlYWR5LCB0aGF0IGlzIGludmFsaWQgYXQgdGhpcyBwb2ludCBzb1xuICAgIC8vIGxldCdzIHRocm93IGl0IG91dC5cbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBjdXJyZW50LmNoaWxkLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JjZVVubW91bnRDdXJyZW50QW5kUmVjb25jaWxlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRoaXMgZnVuY3Rpb24gaXMgZm9yayBvZiByZWNvbmNpbGVDaGlsZHJlbi4gSXQncyB1c2VkIGluIGNhc2VzIHdoZXJlIHdlXG4gIC8vIHdhbnQgdG8gcmVjb25jaWxlIHdpdGhvdXQgbWF0Y2hpbmcgYWdhaW5zdCB0aGUgZXhpc3Rpbmcgc2V0LiBUaGlzIGhhcyB0aGVcbiAgLy8gZWZmZWN0IG9mIGFsbCBjdXJyZW50IGNoaWxkcmVuIGJlaW5nIHVubW91bnRlZDsgZXZlbiBpZiB0aGUgdHlwZSBhbmQga2V5XG4gIC8vIGFyZSB0aGUgc2FtZSwgdGhlIG9sZCBjaGlsZCBpcyB1bm1vdW50ZWQgYW5kIGEgbmV3IGNoaWxkIGlzIGNyZWF0ZWQuXG4gIC8vXG4gIC8vIFRvIGRvIHRoaXMsIHdlJ3JlIGdvaW5nIHRvIGdvIHRocm91Z2ggdGhlIHJlY29uY2lsZSBhbGdvcml0aG0gdHdpY2UuIEluXG4gIC8vIHRoZSBmaXJzdCBwYXNzLCB3ZSBzY2hlZHVsZSBhIGRlbGV0aW9uIGZvciBhbGwgdGhlIGN1cnJlbnQgY2hpbGRyZW4gYnlcbiAgLy8gcGFzc2luZyBudWxsLlxuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBjdXJyZW50LmNoaWxkLCBudWxsLCByZW5kZXJMYW5lcyk7IC8vIEluIHRoZSBzZWNvbmQgcGFzcywgd2UgbW91bnQgdGhlIG5ldyBjaGlsZHJlbi4gVGhlIHRyaWNrIGhlcmUgaXMgdGhhdCB3ZVxuICAvLyBwYXNzIG51bGwgaW4gcGxhY2Ugb2Ygd2hlcmUgd2UgdXN1YWxseSBwYXNzIHRoZSBjdXJyZW50IGNoaWxkIHNldC4gVGhpcyBoYXNcbiAgLy8gdGhlIGVmZmVjdCBvZiByZW1vdW50aW5nIGFsbCBjaGlsZHJlbiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlaXJcbiAgLy8gaWRlbnRpdGllcyBtYXRjaC5cblxuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBudWxsLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRm9yd2FyZFJlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRPRE86IGN1cnJlbnQgY2FuIGJlIG5vbi1udWxsIGhlcmUgZXZlbiBpZiB0aGUgY29tcG9uZW50XG4gIC8vIGhhc24ndCB5ZXQgbW91bnRlZC4gVGhpcyBoYXBwZW5zIGFmdGVyIHRoZSBmaXJzdCByZW5kZXIgc3VzcGVuZHMuXG4gIC8vIFdlJ2xsIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGlzIGlzIGZpbmUgb3IgY2FuIGNhdXNlIGlzc3Vlcy5cbiAge1xuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgLy8gTGF6eSBjb21wb25lbnQgcHJvcHMgY2FuJ3QgYmUgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgcmVzb2x2ZWQgaGVyZS5cbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgIGlmIChpbm5lclByb3BUeXBlcykge1xuICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgcmVuZGVyID0gQ29tcG9uZW50LnJlbmRlcjtcbiAgdmFyIHJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjsgLy8gVGhlIHJlc3QgaXMgYSBmb3JrIG9mIHVwZGF0ZUZ1bmN0aW9uQ29tcG9uZW50XG5cbiAgdmFyIG5leHRDaGlsZHJlbjtcbiAgdmFyIGhhc0lkO1xuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gIHtcbiAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RhcnRlZCh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cblxuICB7XG4gICAgUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgc2V0SXNSZW5kZXJpbmcodHJ1ZSk7XG4gICAgbmV4dENoaWxkcmVuID0gcmVuZGVyV2l0aEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXIsIG5leHRQcm9wcywgcmVmLCByZW5kZXJMYW5lcyk7XG4gICAgaGFzSWQgPSBjaGVja0RpZFJlbmRlcklkSG9vaygpO1xuXG4gICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIG5leHRDaGlsZHJlbiA9IHJlbmRlcldpdGhIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyLCBuZXh0UHJvcHMsIHJlZiwgcmVuZGVyTGFuZXMpO1xuICAgICAgICBoYXNJZCA9IGNoZWNrRGlkUmVuZGVySWRIb29rKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2V0SXNSZW5kZXJpbmcoZmFsc2UpO1xuICB9XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCk7XG4gIH1cblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiAhZGlkUmVjZWl2ZVVwZGF0ZSkge1xuICAgIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBoYXNJZCkge1xuICAgIHB1c2hNYXRlcmlhbGl6ZWRUcmVlSWQod29ya0luUHJvZ3Jlc3MpO1xuICB9IC8vIFJlYWN0IERldlRvb2xzIHJlYWRzIHRoaXMgZmxhZy5cblxuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBlcmZvcm1lZFdvcms7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVNZW1vQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICB2YXIgdHlwZSA9IENvbXBvbmVudC50eXBlO1xuXG4gICAgaWYgKGlzU2ltcGxlRnVuY3Rpb25Db21wb25lbnQodHlwZSkgJiYgQ29tcG9uZW50LmNvbXBhcmUgPT09IG51bGwgJiYgLy8gU2ltcGxlTWVtb0NvbXBvbmVudCBjb2RlcGF0aCBkb2Vzbid0IHJlc29sdmUgb3V0ZXIgcHJvcHMgZWl0aGVyLlxuICAgIENvbXBvbmVudC5kZWZhdWx0UHJvcHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIHJlc29sdmVkVHlwZSA9IHR5cGU7XG5cbiAgICAgIHtcbiAgICAgICAgcmVzb2x2ZWRUeXBlID0gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHR5cGUpO1xuICAgICAgfSAvLyBJZiB0aGlzIGlzIGEgcGxhaW4gZnVuY3Rpb24gY29tcG9uZW50IHdpdGhvdXQgZGVmYXVsdCBwcm9wcyxcbiAgICAgIC8vIGFuZCB3aXRoIG9ubHkgdGhlIGRlZmF1bHQgc2hhbGxvdyBjb21wYXJpc29uLCB3ZSB1cGdyYWRlIGl0XG4gICAgICAvLyB0byBhIFNpbXBsZU1lbW9Db21wb25lbnQgdG8gYWxsb3cgZmFzdCBwYXRoIHVwZGF0ZXMuXG5cblxuICAgICAgd29ya0luUHJvZ3Jlc3MudGFnID0gU2ltcGxlTWVtb0NvbXBvbmVudDtcbiAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSByZXNvbHZlZFR5cGU7XG5cbiAgICAgIHtcbiAgICAgICAgdmFsaWRhdGVGdW5jdGlvbkNvbXBvbmVudEluRGV2KHdvcmtJblByb2dyZXNzLCB0eXBlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVwZGF0ZVNpbXBsZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlc29sdmVkVHlwZSwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgfVxuXG4gICAge1xuICAgICAgdmFyIGlubmVyUHJvcFR5cGVzID0gdHlwZS5wcm9wVHlwZXM7XG5cbiAgICAgIGlmIChpbm5lclByb3BUeXBlcykge1xuICAgICAgICAvLyBJbm5lciBtZW1vIGNvbXBvbmVudCBwcm9wcyBhcmVuJ3QgY3VycmVudGx5IHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50LlxuICAgICAgICAvLyBXZSBjb3VsZCBtb3ZlIGl0IHRoZXJlLCBidXQgd2UnZCBzdGlsbCBuZWVkIHRoaXMgZm9yIGxhenkgY29kZSBwYXRoLlxuICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKSk7XG4gICAgICB9XG5cbiAgICAgIGlmICggQ29tcG9uZW50LmRlZmF1bHRQcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpIHx8ICdVbmtub3duJztcblxuICAgICAgICBpZiAoIWRpZFdhcm5BYm91dERlZmF1bHRQcm9wc09uRnVuY3Rpb25Db21wb25lbnRbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgICBlcnJvcignJXM6IFN1cHBvcnQgZm9yIGRlZmF1bHRQcm9wcyB3aWxsIGJlIHJlbW92ZWQgZnJvbSBtZW1vIGNvbXBvbmVudHMgJyArICdpbiBhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBVc2UgSmF2YVNjcmlwdCBkZWZhdWx0IHBhcmFtZXRlcnMgaW5zdGVhZC4nLCBjb21wb25lbnROYW1lKTtcblxuICAgICAgICAgIGRpZFdhcm5BYm91dERlZmF1bHRQcm9wc09uRnVuY3Rpb25Db21wb25lbnRbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNoaWxkID0gY3JlYXRlRmliZXJGcm9tVHlwZUFuZFByb3BzKENvbXBvbmVudC50eXBlLCBudWxsLCBuZXh0UHJvcHMsIHdvcmtJblByb2dyZXNzLCB3b3JrSW5Qcm9ncmVzcy5tb2RlLCByZW5kZXJMYW5lcyk7XG4gICAgY2hpbGQucmVmID0gd29ya0luUHJvZ3Jlc3MucmVmO1xuICAgIGNoaWxkLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY2hpbGQ7XG4gICAgcmV0dXJuIGNoaWxkO1xuICB9XG5cbiAge1xuICAgIHZhciBfdHlwZSA9IENvbXBvbmVudC50eXBlO1xuICAgIHZhciBfaW5uZXJQcm9wVHlwZXMgPSBfdHlwZS5wcm9wVHlwZXM7XG5cbiAgICBpZiAoX2lubmVyUHJvcFR5cGVzKSB7XG4gICAgICAvLyBJbm5lciBtZW1vIGNvbXBvbmVudCBwcm9wcyBhcmVuJ3QgY3VycmVudGx5IHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50LlxuICAgICAgLy8gV2UgY291bGQgbW92ZSBpdCB0aGVyZSwgYnV0IHdlJ2Qgc3RpbGwgbmVlZCB0aGlzIGZvciBsYXp5IGNvZGUgcGF0aC5cbiAgICAgIGNoZWNrUHJvcFR5cGVzKF9pbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoX3R5cGUpKTtcbiAgICB9XG4gIH1cblxuICB2YXIgY3VycmVudENoaWxkID0gY3VycmVudC5jaGlsZDsgLy8gVGhpcyBpcyBhbHdheXMgZXhhY3RseSBvbmUgY2hpbGRcblxuICB2YXIgaGFzU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0ID0gY2hlY2tTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQoY3VycmVudCwgcmVuZGVyTGFuZXMpO1xuXG4gIGlmICghaGFzU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0KSB7XG4gICAgLy8gVGhpcyB3aWxsIGJlIHRoZSBwcm9wcyB3aXRoIHJlc29sdmVkIGRlZmF1bHRQcm9wcyxcbiAgICAvLyB1bmxpa2UgY3VycmVudC5tZW1vaXplZFByb3BzIHdoaWNoIHdpbGwgYmUgdGhlIHVucmVzb2x2ZWQgb25lcy5cbiAgICB2YXIgcHJldlByb3BzID0gY3VycmVudENoaWxkLm1lbW9pemVkUHJvcHM7IC8vIERlZmF1bHQgdG8gc2hhbGxvdyBjb21wYXJpc29uXG5cbiAgICB2YXIgY29tcGFyZSA9IENvbXBvbmVudC5jb21wYXJlO1xuICAgIGNvbXBhcmUgPSBjb21wYXJlICE9PSBudWxsID8gY29tcGFyZSA6IHNoYWxsb3dFcXVhbDtcblxuICAgIGlmIChjb21wYXJlKHByZXZQcm9wcywgbmV4dFByb3BzKSAmJiBjdXJyZW50LnJlZiA9PT0gd29ya0luUHJvZ3Jlc3MucmVmKSB7XG4gICAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIH1cbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuICB2YXIgbmV3Q2hpbGQgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50Q2hpbGQsIG5leHRQcm9wcyk7XG4gIG5ld0NoaWxkLnJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjtcbiAgbmV3Q2hpbGQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbmV3Q2hpbGQ7XG4gIHJldHVybiBuZXdDaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU2ltcGxlTWVtb0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRPRE86IGN1cnJlbnQgY2FuIGJlIG5vbi1udWxsIGhlcmUgZXZlbiBpZiB0aGUgY29tcG9uZW50XG4gIC8vIGhhc24ndCB5ZXQgbW91bnRlZC4gVGhpcyBoYXBwZW5zIHdoZW4gdGhlIGlubmVyIHJlbmRlciBzdXNwZW5kcy5cbiAgLy8gV2UnbGwgbmVlZCB0byBmaWd1cmUgb3V0IGlmIHRoaXMgaXMgZmluZSBvciBjYW4gY2F1c2UgaXNzdWVzLlxuICB7XG4gICAgaWYgKHdvcmtJblByb2dyZXNzLnR5cGUgIT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlKSB7XG4gICAgICAvLyBMYXp5IGNvbXBvbmVudCBwcm9wcyBjYW4ndCBiZSB2YWxpZGF0ZWQgaW4gY3JlYXRlRWxlbWVudFxuICAgICAgLy8gYmVjYXVzZSB0aGV5J3JlIG9ubHkgZ3VhcmFudGVlZCB0byBiZSByZXNvbHZlZCBoZXJlLlxuICAgICAgdmFyIG91dGVyTWVtb1R5cGUgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZTtcblxuICAgICAgaWYgKG91dGVyTWVtb1R5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSkge1xuICAgICAgICAvLyBXZSB3YXJuIHdoZW4geW91IGRlZmluZSBwcm9wVHlwZXMgb24gbGF6eSgpXG4gICAgICAgIC8vIHNvIGxldCdzIGp1c3Qgc2tpcCBvdmVyIGl0IHRvIGZpbmQgbWVtbygpIG91dGVyIHdyYXBwZXIuXG4gICAgICAgIC8vIElubmVyIHByb3BzIGZvciBtZW1vIGFyZSB2YWxpZGF0ZWQgbGF0ZXIuXG4gICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gb3V0ZXJNZW1vVHlwZTtcbiAgICAgICAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkO1xuICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBvdXRlck1lbW9UeXBlID0gaW5pdChwYXlsb2FkKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIG91dGVyTWVtb1R5cGUgPSBudWxsO1xuICAgICAgICB9IC8vIElubmVyIHByb3BUeXBlcyB3aWxsIGJlIHZhbGlkYXRlZCBpbiB0aGUgZnVuY3Rpb24gY29tcG9uZW50IHBhdGguXG5cblxuICAgICAgICB2YXIgb3V0ZXJQcm9wVHlwZXMgPSBvdXRlck1lbW9UeXBlICYmIG91dGVyTWVtb1R5cGUucHJvcFR5cGVzO1xuXG4gICAgICAgIGlmIChvdXRlclByb3BUeXBlcykge1xuICAgICAgICAgIGNoZWNrUHJvcFR5cGVzKG91dGVyUHJvcFR5cGVzLCBuZXh0UHJvcHMsIC8vIFJlc29sdmVkIChTaW1wbGVNZW1vQ29tcG9uZW50IGhhcyBubyBkZWZhdWx0UHJvcHMpXG4gICAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUob3V0ZXJNZW1vVHlwZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICB2YXIgcHJldlByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuXG4gICAgaWYgKHNoYWxsb3dFcXVhbChwcmV2UHJvcHMsIG5leHRQcm9wcykgJiYgY3VycmVudC5yZWYgPT09IHdvcmtJblByb2dyZXNzLnJlZiAmJiAoIC8vIFByZXZlbnQgYmFpbG91dCBpZiB0aGUgaW1wbGVtZW50YXRpb24gY2hhbmdlZCBkdWUgdG8gaG90IHJlbG9hZC5cbiAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9PT0gY3VycmVudC50eXBlICkpIHtcbiAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTsgLy8gVGhlIHByb3BzIGFyZSBzaGFsbG93bHkgZXF1YWwuIFJldXNlIHRoZSBwcmV2aW91cyBwcm9wcyBvYmplY3QsIGxpa2Ugd2VcbiAgICAgIC8vIHdvdWxkIGR1cmluZyBhIG5vcm1hbCBmaWJlciBiYWlsb3V0LlxuICAgICAgLy9cbiAgICAgIC8vIFdlIGRvbid0IGhhdmUgc3Ryb25nIGd1YXJhbnRlZXMgdGhhdCB0aGUgcHJvcHMgb2JqZWN0IGlzIHJlZmVyZW50aWFsbHlcbiAgICAgIC8vIGVxdWFsIGR1cmluZyB1cGRhdGVzIHdoZXJlIHdlIGNhbid0IGJhaWwgb3V0IGFueXdheSBcdTIwMTQgbGlrZSBpZiB0aGUgcHJvcHNcbiAgICAgIC8vIGFyZSBzaGFsbG93bHkgZXF1YWwsIGJ1dCB0aGVyZSdzIGEgbG9jYWwgc3RhdGUgb3IgY29udGV4dCB1cGRhdGUgaW4gdGhlXG4gICAgICAvLyBzYW1lIGJhdGNoLlxuICAgICAgLy9cbiAgICAgIC8vIEhvd2V2ZXIsIGFzIGEgcHJpbmNpcGxlLCB3ZSBzaG91bGQgYWltIHRvIG1ha2UgdGhlIGJlaGF2aW9yIGNvbnNpc3RlbnRcbiAgICAgIC8vIGFjcm9zcyBkaWZmZXJlbnQgd2F5cyBvZiBtZW1vaXppbmcgYSBjb21wb25lbnQuIEZvciBleGFtcGxlLCBSZWFjdC5tZW1vXG4gICAgICAvLyBoYXMgYSBkaWZmZXJlbnQgaW50ZXJuYWwgRmliZXIgbGF5b3V0IGlmIHlvdSBwYXNzIGEgbm9ybWFsIGZ1bmN0aW9uXG4gICAgICAvLyBjb21wb25lbnQgKFNpbXBsZU1lbW9Db21wb25lbnQpIHZlcnN1cyBpZiB5b3UgcGFzcyBhIGRpZmZlcmVudCB0eXBlXG4gICAgICAvLyBsaWtlIGZvcndhcmRSZWYgKE1lbW9Db21wb25lbnQpLiBCdXQgdGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuXG4gICAgICAvLyBXcmFwcGluZyBhIGNvbXBvbmVudCBpbiBmb3J3YXJkUmVmIChvciBSZWFjdC5sYXp5LCBldGMpIHNob3VsZG4ndFxuICAgICAgLy8gYWZmZWN0IHdoZXRoZXIgdGhlIHByb3BzIG9iamVjdCBpcyByZXVzZWQgZHVyaW5nIGEgYmFpbG91dC5cblxuICAgICAgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzID0gbmV4dFByb3BzID0gcHJldlByb3BzO1xuXG4gICAgICBpZiAoIWNoZWNrU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0KGN1cnJlbnQsIHJlbmRlckxhbmVzKSkge1xuICAgICAgICAvLyBUaGUgcGVuZGluZyBsYW5lcyB3ZXJlIGNsZWFyZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBiZWdpbldvcmsuIFdlJ3JlXG4gICAgICAgIC8vIGFib3V0IHRvIGJhaWwgb3V0LCBidXQgdGhlcmUgbWlnaHQgYmUgb3RoZXIgbGFuZXMgdGhhdCB3ZXJlbid0XG4gICAgICAgIC8vIGluY2x1ZGVkIGluIHRoZSBjdXJyZW50IHJlbmRlci4gVXN1YWxseSwgdGhlIHByaW9yaXR5IGxldmVsIG9mIHRoZVxuICAgICAgICAvLyByZW1haW5pbmcgdXBkYXRlcyBpcyBhY2N1bXVsYXRlZCBkdXJpbmcgdGhlIGV2YWx1YXRpb24gb2YgdGhlXG4gICAgICAgIC8vIGNvbXBvbmVudCAoaS5lLiB3aGVuIHByb2Nlc3NpbmcgdGhlIHVwZGF0ZSBxdWV1ZSkuIEJ1dCBzaW5jZSBzaW5jZVxuICAgICAgICAvLyB3ZSdyZSBiYWlsaW5nIG91dCBlYXJseSAqd2l0aG91dCogZXZhbHVhdGluZyB0aGUgY29tcG9uZW50LCB3ZSBuZWVkXG4gICAgICAgIC8vIHRvIGFjY291bnQgZm9yIGl0IGhlcmUsIHRvby4gUmVzZXQgdG8gdGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IGZpYmVyLlxuICAgICAgICAvLyBOT1RFOiBUaGlzIG9ubHkgYXBwbGllcyB0byBTaW1wbGVNZW1vQ29tcG9uZW50LCBub3QgTWVtb0NvbXBvbmVudCxcbiAgICAgICAgLy8gYmVjYXVzZSBhIE1lbW9Db21wb25lbnQgZmliZXIgZG9lcyBub3QgaGF2ZSBob29rcyBvciBhbiB1cGRhdGUgcXVldWU7XG4gICAgICAgIC8vIHJhdGhlciwgaXQgd3JhcHMgYXJvdW5kIGFuIGlubmVyIGNvbXBvbmVudCwgd2hpY2ggbWF5IG9yIG1heSBub3RcbiAgICAgICAgLy8gY29udGFpbnMgaG9va3MuXG4gICAgICAgIC8vIFRPRE86IE1vdmUgdGhlIHJlc2V0IGF0IGluIGJlZ2luV29yayBvdXQgb2YgdGhlIGNvbW1vbiBwYXRoIHNvIHRoYXRcbiAgICAgICAgLy8gdGhpcyBpcyBubyBsb25nZXIgbmVjZXNzYXJ5LlxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IGN1cnJlbnQubGFuZXM7XG4gICAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9IGVsc2UgaWYgKChjdXJyZW50LmZsYWdzICYgRm9yY2VVcGRhdGVGb3JMZWdhY3lTdXNwZW5zZSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSB0aGF0IG9ubHkgZXhpc3RzIGZvciBsZWdhY3kgbW9kZS5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzE5MjE2LlxuICAgICAgICBkaWRSZWNlaXZlVXBkYXRlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdXBkYXRlRnVuY3Rpb25Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU9mZnNjcmVlbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQgIT09IG51bGwgPyBjdXJyZW50Lm1lbW9pemVkU3RhdGUgOiBudWxsO1xuXG4gIGlmIChuZXh0UHJvcHMubW9kZSA9PT0gJ2hpZGRlbicgfHwgZW5hYmxlTGVnYWN5SGlkZGVuICkge1xuICAgIC8vIFJlbmRlcmluZyBhIGhpZGRlbiB0cmVlLlxuICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgICAvLyBJbiBsZWdhY3kgc3luYyBtb2RlLCBkb24ndCBkZWZlciB0aGUgc3VidHJlZS4gUmVuZGVyIGl0IG5vdy5cbiAgICAgIC8vIFRPRE86IENvbnNpZGVyIGhvdyBPZmZzY3JlZW4gc2hvdWxkIHdvcmsgd2l0aCB0cmFuc2l0aW9ucyBpbiB0aGUgZnV0dXJlXG4gICAgICB2YXIgbmV4dFN0YXRlID0ge1xuICAgICAgICBiYXNlTGFuZXM6IE5vTGFuZXMsXG4gICAgICAgIGNhY2hlUG9vbDogbnVsbCxcbiAgICAgICAgdHJhbnNpdGlvbnM6IG51bGxcbiAgICAgIH07XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbmV4dFN0YXRlO1xuXG4gICAgICBwdXNoUmVuZGVyTGFuZXMod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICB9IGVsc2UgaWYgKCFpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCBPZmZzY3JlZW5MYW5lKSkge1xuICAgICAgdmFyIHNwYXduZWRDYWNoZVBvb2wgPSBudWxsOyAvLyBXZSdyZSBoaWRkZW4sIGFuZCB3ZSdyZSBub3QgcmVuZGVyaW5nIGF0IE9mZnNjcmVlbi4gV2Ugd2lsbCBiYWlsIG91dFxuICAgICAgLy8gYW5kIHJlc3VtZSB0aGlzIHRyZWUgbGF0ZXIuXG5cbiAgICAgIHZhciBuZXh0QmFzZUxhbmVzO1xuXG4gICAgICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBwcmV2QmFzZUxhbmVzID0gcHJldlN0YXRlLmJhc2VMYW5lcztcbiAgICAgICAgbmV4dEJhc2VMYW5lcyA9IG1lcmdlTGFuZXMocHJldkJhc2VMYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dEJhc2VMYW5lcyA9IHJlbmRlckxhbmVzO1xuICAgICAgfSAvLyBTY2hlZHVsZSB0aGlzIGZpYmVyIHRvIHJlLXJlbmRlciBhdCBvZmZzY3JlZW4gcHJpb3JpdHkuIFRoZW4gYmFpbG91dC5cblxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMgPSBsYW5lVG9MYW5lcyhPZmZzY3JlZW5MYW5lKTtcbiAgICAgIHZhciBfbmV4dFN0YXRlID0ge1xuICAgICAgICBiYXNlTGFuZXM6IG5leHRCYXNlTGFuZXMsXG4gICAgICAgIGNhY2hlUG9vbDogc3Bhd25lZENhY2hlUG9vbCxcbiAgICAgICAgdHJhbnNpdGlvbnM6IG51bGxcbiAgICAgIH07XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gX25leHRTdGF0ZTtcbiAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgICAgIC8vIHRvIGF2b2lkIGEgcHVzaC9wb3AgbWlzYWxpZ25tZW50LlxuXG5cbiAgICAgIHB1c2hSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcywgbmV4dEJhc2VMYW5lcyk7XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBzZWNvbmQgcmVuZGVyLiBUaGUgc3Vycm91bmRpbmcgdmlzaWJsZSBjb250ZW50IGhhcyBhbHJlYWR5XG4gICAgICAvLyBjb21taXR0ZWQuIE5vdyB3ZSByZXN1bWUgcmVuZGVyaW5nIHRoZSBoaWRkZW4gdHJlZS5cbiAgICAgIC8vIFJlbmRlcmluZyBhdCBvZmZzY3JlZW4sIHNvIHdlIGNhbiBjbGVhciB0aGUgYmFzZSBsYW5lcy5cbiAgICAgIHZhciBfbmV4dFN0YXRlMiA9IHtcbiAgICAgICAgYmFzZUxhbmVzOiBOb0xhbmVzLFxuICAgICAgICBjYWNoZVBvb2w6IG51bGwsXG4gICAgICAgIHRyYW5zaXRpb25zOiBudWxsXG4gICAgICB9O1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IF9uZXh0U3RhdGUyOyAvLyBQdXNoIHRoZSBsYW5lcyB0aGF0IHdlcmUgc2tpcHBlZCB3aGVuIHdlIGJhaWxlZCBvdXQuXG5cbiAgICAgIHZhciBzdWJ0cmVlUmVuZGVyTGFuZXMgPSBwcmV2U3RhdGUgIT09IG51bGwgPyBwcmV2U3RhdGUuYmFzZUxhbmVzIDogcmVuZGVyTGFuZXM7XG5cbiAgICAgIHB1c2hSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcywgc3VidHJlZVJlbmRlckxhbmVzKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gUmVuZGVyaW5nIGEgdmlzaWJsZSB0cmVlLlxuICAgIHZhciBfc3VidHJlZVJlbmRlckxhbmVzO1xuXG4gICAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgLy8gV2UncmUgZ29pbmcgZnJvbSBoaWRkZW4gLT4gdmlzaWJsZS5cbiAgICAgIF9zdWJ0cmVlUmVuZGVyTGFuZXMgPSBtZXJnZUxhbmVzKHByZXZTdGF0ZS5iYXNlTGFuZXMsIHJlbmRlckxhbmVzKTtcblxuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFdlIHdlcmVuJ3QgcHJldmlvdXNseSBoaWRkZW4sIGFuZCB3ZSBzdGlsbCBhcmVuJ3QsIHNvIHRoZXJlJ3Mgbm90aGluZ1xuICAgICAgLy8gc3BlY2lhbCB0byBkby4gTmVlZCB0byBwdXNoIHRvIHRoZSBzdGFjayByZWdhcmRsZXNzLCB0aG91Z2gsIHRvIGF2b2lkXG4gICAgICAvLyBhIHB1c2gvcG9wIG1pc2FsaWdubWVudC5cbiAgICAgIF9zdWJ0cmVlUmVuZGVyTGFuZXMgPSByZW5kZXJMYW5lcztcbiAgICB9XG5cbiAgICBwdXNoUmVuZGVyTGFuZXMod29ya0luUHJvZ3Jlc3MsIF9zdWJ0cmVlUmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59IC8vIE5vdGU6IFRoZXNlIGhhcHBlbiB0byBoYXZlIGlkZW50aWNhbCBiZWdpbiBwaGFzZXMsIGZvciBub3cuIFdlIHNob3VsZG4ndCBob2xkXG5cbmZ1bmN0aW9uIHVwZGF0ZUZyYWdtZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgbmV4dENoaWxkcmVuID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTW9kZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5leHRDaGlsZHJlbiA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcy5jaGlsZHJlbjtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVByb2ZpbGVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuXG4gICAge1xuICAgICAgLy8gUmVzZXQgZWZmZWN0IGR1cmF0aW9ucyBmb3IgdGhlIG5leHQgZXZlbnR1YWwgZWZmZWN0IHBoYXNlLlxuICAgICAgLy8gVGhlc2UgYXJlIHJlc2V0IGR1cmluZyByZW5kZXIgdG8gYWxsb3cgdGhlIERldlRvb2xzIGNvbW1pdCBob29rIGEgY2hhbmNlIHRvIHJlYWQgdGhlbSxcbiAgICAgIHZhciBzdGF0ZU5vZGUgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgICBzdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb24gPSAwO1xuICAgICAgc3RhdGVOb2RlLnBhc3NpdmVFZmZlY3REdXJhdGlvbiA9IDA7XG4gICAgfVxuICB9XG5cbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIG1hcmtSZWYoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgdmFyIHJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjtcblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCAmJiByZWYgIT09IG51bGwgfHwgY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50LnJlZiAhPT0gcmVmKSB7XG4gICAgLy8gU2NoZWR1bGUgYSBSZWYgZWZmZWN0XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUmVmO1xuXG4gICAge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUmVmU3RhdGljO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIHtcbiAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgIC8vIExhenkgY29tcG9uZW50IHByb3BzIGNhbid0IGJlIHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50XG4gICAgICAvLyBiZWNhdXNlIHRoZXkncmUgb25seSBndWFyYW50ZWVkIHRvIGJlIHJlc29sdmVkIGhlcmUuXG4gICAgICB2YXIgaW5uZXJQcm9wVHlwZXMgPSBDb21wb25lbnQucHJvcFR5cGVzO1xuXG4gICAgICBpZiAoaW5uZXJQcm9wVHlwZXMpIHtcbiAgICAgICAgY2hlY2tQcm9wVHlwZXMoaW5uZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgcHJvcHNcbiAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbnRleHQ7XG5cbiAge1xuICAgIHZhciB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSk7XG4gICAgY29udGV4dCA9IGdldE1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCk7XG4gIH1cblxuICB2YXIgbmV4dENoaWxkcmVuO1xuICB2YXIgaGFzSWQ7XG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKHdvcmtJblByb2dyZXNzKTtcbiAgfVxuXG4gIHtcbiAgICBSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICBzZXRJc1JlbmRlcmluZyh0cnVlKTtcbiAgICBuZXh0Q2hpbGRyZW4gPSByZW5kZXJXaXRoSG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gICAgaGFzSWQgPSBjaGVja0RpZFJlbmRlcklkSG9vaygpO1xuXG4gICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIG5leHRDaGlsZHJlbiA9IHJlbmRlcldpdGhIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIGNvbnRleHQsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgaGFzSWQgPSBjaGVja0RpZFJlbmRlcklkSG9vaygpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHNldElzUmVuZGVyaW5nKGZhbHNlKTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpO1xuICB9XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgIWRpZFJlY2VpdmVVcGRhdGUpIHtcbiAgICBiYWlsb3V0SG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgaWYgKGdldElzSHlkcmF0aW5nKCkgJiYgaGFzSWQpIHtcbiAgICBwdXNoTWF0ZXJpYWxpemVkVHJlZUlkKHdvcmtJblByb2dyZXNzKTtcbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlQ2xhc3NDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcykge1xuICB7XG4gICAgLy8gVGhpcyBpcyB1c2VkIGJ5IERldlRvb2xzIHRvIGZvcmNlIGEgYm91bmRhcnkgdG8gZXJyb3IuXG4gICAgc3dpdGNoIChzaG91bGRFcnJvcih3b3JrSW5Qcm9ncmVzcykpIHtcbiAgICAgIGNhc2UgZmFsc2U6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgX2luc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgICAgICAgIHZhciBjdG9yID0gd29ya0luUHJvZ3Jlc3MudHlwZTsgLy8gVE9ETyBUaGlzIHdheSBvZiByZXNldHRpbmcgdGhlIGVycm9yIGJvdW5kYXJ5IHN0YXRlIGlzIGEgaGFjay5cbiAgICAgICAgICAvLyBJcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcz9cblxuICAgICAgICAgIHZhciB0ZW1wSW5zdGFuY2UgPSBuZXcgY3Rvcih3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzLCBfaW5zdGFuY2UuY29udGV4dCk7XG4gICAgICAgICAgdmFyIHN0YXRlID0gdGVtcEluc3RhbmNlLnN0YXRlO1xuXG4gICAgICAgICAgX2luc3RhbmNlLnVwZGF0ZXIuZW5xdWV1ZVNldFN0YXRlKF9pbnN0YW5jZSwgc3RhdGUsIG51bGwpO1xuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSB0cnVlOlxuICAgICAgICB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTaG91bGRDYXB0dXJlOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuXG4gICAgICAgICAgdmFyIGVycm9yJDEgPSBuZXcgRXJyb3IoJ1NpbXVsYXRlZCBlcnJvciBjb21pbmcgZnJvbSBEZXZUb29scycpO1xuICAgICAgICAgIHZhciBsYW5lID0gcGlja0FyYml0cmFyeUxhbmUocmVuZGVyTGFuZXMpO1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzcy5sYW5lcywgbGFuZSk7IC8vIFNjaGVkdWxlIHRoZSBlcnJvciBib3VuZGFyeSB0byByZS1yZW5kZXIgdXNpbmcgdXBkYXRlZCBzdGF0ZVxuXG4gICAgICAgICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZUNsYXNzRXJyb3JVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKGVycm9yJDEsIHdvcmtJblByb2dyZXNzKSwgbGFuZSk7XG4gICAgICAgICAgZW5xdWV1ZUNhcHR1cmVkVXBkYXRlKHdvcmtJblByb2dyZXNzLCB1cGRhdGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzLnR5cGUgIT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlKSB7XG4gICAgICAvLyBMYXp5IGNvbXBvbmVudCBwcm9wcyBjYW4ndCBiZSB2YWxpZGF0ZWQgaW4gY3JlYXRlRWxlbWVudFxuICAgICAgLy8gYmVjYXVzZSB0aGV5J3JlIG9ubHkgZ3VhcmFudGVlZCB0byBiZSByZXNvbHZlZCBoZXJlLlxuICAgICAgdmFyIGlubmVyUHJvcFR5cGVzID0gQ29tcG9uZW50LnByb3BUeXBlcztcblxuICAgICAgaWYgKGlubmVyUHJvcFR5cGVzKSB7XG4gICAgICAgIGNoZWNrUHJvcFR5cGVzKGlubmVyUHJvcFR5cGVzLCBuZXh0UHJvcHMsIC8vIFJlc29sdmVkIHByb3BzXG4gICAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSAvLyBQdXNoIGNvbnRleHQgcHJvdmlkZXJzIGVhcmx5IHRvIHByZXZlbnQgY29udGV4dCBzdGFjayBtaXNtYXRjaGVzLlxuICAvLyBEdXJpbmcgbW91bnRpbmcgd2UgZG9uJ3Qga25vdyB0aGUgY2hpbGQgY29udGV4dCB5ZXQgYXMgdGhlIGluc3RhbmNlIGRvZXNuJ3QgZXhpc3QuXG4gIC8vIFdlIHdpbGwgaW52YWxpZGF0ZSB0aGUgY2hpbGQgY29udGV4dCBpbiBmaW5pc2hDbGFzc0NvbXBvbmVudCgpIHJpZ2h0IGFmdGVyIHJlbmRlcmluZy5cblxuXG4gIHZhciBoYXNDb250ZXh0O1xuXG4gIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgaGFzQ29udGV4dCA9IHRydWU7XG4gICAgcHVzaENvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcyk7XG4gIH0gZWxzZSB7XG4gICAgaGFzQ29udGV4dCA9IGZhbHNlO1xuICB9XG5cbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICB2YXIgc2hvdWxkVXBkYXRlO1xuXG4gIGlmIChpbnN0YW5jZSA9PT0gbnVsbCkge1xuICAgIHJlc2V0U3VzcGVuZGVkQ3VycmVudE9uTW91bnRJbkxlZ2FjeU1vZGUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpOyAvLyBJbiB0aGUgaW5pdGlhbCBwYXNzIHdlIG1pZ2h0IG5lZWQgdG8gY29uc3RydWN0IHRoZSBpbnN0YW5jZS5cblxuICAgIGNvbnN0cnVjdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzKTtcbiAgICBtb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgc2hvdWxkVXBkYXRlID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgLy8gSW4gYSByZXN1bWUsIHdlJ2xsIGFscmVhZHkgaGF2ZSBhbiBpbnN0YW5jZSB3ZSBjYW4gcmV1c2UuXG4gICAgc2hvdWxkVXBkYXRlID0gcmVzdW1lTW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICB9IGVsc2Uge1xuICAgIHNob3VsZFVwZGF0ZSA9IHVwZGF0ZUNsYXNzSW5zdGFuY2UoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICB2YXIgbmV4dFVuaXRPZldvcmsgPSBmaW5pc2hDbGFzc0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBzaG91bGRVcGRhdGUsIGhhc0NvbnRleHQsIHJlbmRlckxhbmVzKTtcblxuICB7XG4gICAgdmFyIGluc3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgICBpZiAoc2hvdWxkVXBkYXRlICYmIGluc3QucHJvcHMgIT09IG5leHRQcm9wcykge1xuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzKSB7XG4gICAgICAgIGVycm9yKCdJdCBsb29rcyBsaWtlICVzIGlzIHJlYXNzaWduaW5nIGl0cyBvd24gYHRoaXMucHJvcHNgIHdoaWxlIHJlbmRlcmluZy4gJyArICdUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIGNhbiBsZWFkIHRvIGNvbmZ1c2luZyBidWdzLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIod29ya0luUHJvZ3Jlc3MpIHx8ICdhIGNvbXBvbmVudCcpO1xuICAgICAgfVxuXG4gICAgICBkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV4dFVuaXRPZldvcms7XG59XG5cbmZ1bmN0aW9uIGZpbmlzaENsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHNob3VsZFVwZGF0ZSwgaGFzQ29udGV4dCwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gUmVmcyBzaG91bGQgdXBkYXRlIGV2ZW4gaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybnMgZmFsc2VcbiAgbWFya1JlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHZhciBkaWRDYXB0dXJlRXJyb3IgPSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncztcblxuICBpZiAoIXNob3VsZFVwZGF0ZSAmJiAhZGlkQ2FwdHVyZUVycm9yKSB7XG4gICAgLy8gQ29udGV4dCBwcm92aWRlcnMgc2hvdWxkIGRlZmVyIHRvIHNDVSBmb3IgcmVuZGVyaW5nXG4gICAgaWYgKGhhc0NvbnRleHQpIHtcbiAgICAgIGludmFsaWRhdGVDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgZmFsc2UpO1xuICAgIH1cblxuICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7IC8vIFJlcmVuZGVyXG5cbiAgUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3M7XG4gIHZhciBuZXh0Q2hpbGRyZW47XG5cbiAgaWYgKGRpZENhcHR1cmVFcnJvciAmJiB0eXBlb2YgQ29tcG9uZW50LmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIElmIHdlIGNhcHR1cmVkIGFuIGVycm9yLCBidXQgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIGlzIG5vdCBkZWZpbmVkLFxuICAgIC8vIHVubW91bnQgYWxsIHRoZSBjaGlsZHJlbi4gY29tcG9uZW50RGlkQ2F0Y2ggd2lsbCBzY2hlZHVsZSBhbiB1cGRhdGUgdG9cbiAgICAvLyByZS1yZW5kZXIgYSBmYWxsYmFjay4gVGhpcyBpcyB0ZW1wb3JhcnkgdW50aWwgd2UgbWlncmF0ZSBldmVyeW9uZSB0b1xuICAgIC8vIHRoZSBuZXcgQVBJLlxuICAgIC8vIFRPRE86IFdhcm4gaW4gYSBmdXR1cmUgcmVsZWFzZS5cbiAgICBuZXh0Q2hpbGRyZW4gPSBudWxsO1xuXG4gICAge1xuICAgICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmcoKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAge1xuICAgICAgbWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQod29ya0luUHJvZ3Jlc3MpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIHNldElzUmVuZGVyaW5nKHRydWUpO1xuICAgICAgbmV4dENoaWxkcmVuID0gaW5zdGFuY2UucmVuZGVyKCk7XG5cbiAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpbnN0YW5jZS5yZW5kZXIoKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2V0SXNSZW5kZXJpbmcoZmFsc2UpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCk7XG4gICAgfVxuICB9IC8vIFJlYWN0IERldlRvb2xzIHJlYWRzIHRoaXMgZmxhZy5cblxuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBlcmZvcm1lZFdvcms7XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgZGlkQ2FwdHVyZUVycm9yKSB7XG4gICAgLy8gSWYgd2UncmUgcmVjb3ZlcmluZyBmcm9tIGFuIGVycm9yLCByZWNvbmNpbGUgd2l0aG91dCByZXVzaW5nIGFueSBvZlxuICAgIC8vIHRoZSBleGlzdGluZyBjaGlsZHJlbi4gQ29uY2VwdHVhbGx5LCB0aGUgbm9ybWFsIGNoaWxkcmVuIGFuZCB0aGUgY2hpbGRyZW5cbiAgICAvLyB0aGF0IGFyZSBzaG93biBvbiBlcnJvciBhcmUgdHdvIGRpZmZlcmVudCBzZXRzLCBzbyB3ZSBzaG91bGRuJ3QgcmV1c2VcbiAgICAvLyBub3JtYWwgY2hpbGRyZW4gZXZlbiBpZiB0aGVpciBpZGVudGl0aWVzIG1hdGNoLlxuICAgIGZvcmNlVW5tb3VudEN1cnJlbnRBbmRSZWNvbmNpbGUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB9IGVsc2Uge1xuICAgIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfSAvLyBNZW1vaXplIHN0YXRlIHVzaW5nIHRoZSB2YWx1ZXMgd2UganVzdCB1c2VkIHRvIHJlbmRlci5cbiAgLy8gVE9ETzogUmVzdHJ1Y3R1cmUgc28gd2UgbmV2ZXIgcmVhZCB2YWx1ZXMgZnJvbSB0aGUgaW5zdGFuY2UuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gaW5zdGFuY2Uuc3RhdGU7IC8vIFRoZSBjb250ZXh0IG1pZ2h0IGhhdmUgY2hhbmdlZCBzbyB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlIGl0LlxuXG4gIGlmIChoYXNDb250ZXh0KSB7XG4gICAgaW52YWxpZGF0ZUNvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCB0cnVlKTtcbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gcHVzaEhvc3RSb290Q29udGV4dCh3b3JrSW5Qcm9ncmVzcykge1xuICB2YXIgcm9vdCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICBpZiAocm9vdC5wZW5kaW5nQ29udGV4dCkge1xuICAgIHB1c2hUb3BMZXZlbENvbnRleHRPYmplY3Qod29ya0luUHJvZ3Jlc3MsIHJvb3QucGVuZGluZ0NvbnRleHQsIHJvb3QucGVuZGluZ0NvbnRleHQgIT09IHJvb3QuY29udGV4dCk7XG4gIH0gZWxzZSBpZiAocm9vdC5jb250ZXh0KSB7XG4gICAgLy8gU2hvdWxkIGFsd2F5cyBiZSBzZXRcbiAgICBwdXNoVG9wTGV2ZWxDb250ZXh0T2JqZWN0KHdvcmtJblByb2dyZXNzLCByb290LmNvbnRleHQsIGZhbHNlKTtcbiAgfVxuXG4gIHB1c2hIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzLCByb290LmNvbnRhaW5lckluZm8pO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVIb3N0Um9vdChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgcHVzaEhvc3RSb290Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nob3VsZCBoYXZlIGEgY3VycmVudCBmaWJlci4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgfVxuXG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBwcmV2U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgcHJldkNoaWxkcmVuID0gcHJldlN0YXRlLmVsZW1lbnQ7XG4gIGNsb25lVXBkYXRlUXVldWUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG5leHRQcm9wcywgbnVsbCwgcmVuZGVyTGFuZXMpO1xuICB2YXIgbmV4dFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHJvb3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gIC8vIGJlaW5nIGNhbGxlZCBcImVsZW1lbnRcIi5cblxuXG4gIHZhciBuZXh0Q2hpbGRyZW4gPSBuZXh0U3RhdGUuZWxlbWVudDtcblxuICBpZiAoIHByZXZTdGF0ZS5pc0RlaHlkcmF0ZWQpIHtcbiAgICAvLyBUaGlzIGlzIGEgaHlkcmF0aW9uIHJvb3Qgd2hvc2Ugc2hlbGwgaGFzIG5vdCB5ZXQgaHlkcmF0ZWQuIFdlIHNob3VsZFxuICAgIC8vIGF0dGVtcHQgdG8gaHlkcmF0ZS5cbiAgICAvLyBGbGlwIGlzRGVoeWRyYXRlZCB0byBmYWxzZSB0byBpbmRpY2F0ZSB0aGF0IHdoZW4gdGhpcyByZW5kZXJcbiAgICAvLyBmaW5pc2hlcywgdGhlIHJvb3Qgd2lsbCBubyBsb25nZXIgYmUgZGVoeWRyYXRlZC5cbiAgICB2YXIgb3ZlcnJpZGVTdGF0ZSA9IHtcbiAgICAgIGVsZW1lbnQ6IG5leHRDaGlsZHJlbixcbiAgICAgIGlzRGVoeWRyYXRlZDogZmFsc2UsXG4gICAgICBjYWNoZTogbmV4dFN0YXRlLmNhY2hlLFxuICAgICAgcGVuZGluZ1N1c3BlbnNlQm91bmRhcmllczogbmV4dFN0YXRlLnBlbmRpbmdTdXNwZW5zZUJvdW5kYXJpZXMsXG4gICAgICB0cmFuc2l0aW9uczogbmV4dFN0YXRlLnRyYW5zaXRpb25zXG4gICAgfTtcbiAgICB2YXIgdXBkYXRlUXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTsgLy8gYGJhc2VTdGF0ZWAgY2FuIGFsd2F5cyBiZSB0aGUgbGFzdCBzdGF0ZSBiZWNhdXNlIHRoZSByb290IGRvZXNuJ3RcbiAgICAvLyBoYXZlIHJlZHVjZXIgZnVuY3Rpb25zIHNvIGl0IGRvZXNuJ3QgbmVlZCByZWJhc2luZy5cblxuICAgIHVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZSA9IG92ZXJyaWRlU3RhdGU7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG92ZXJyaWRlU3RhdGU7XG5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBGb3JjZUNsaWVudFJlbmRlcikge1xuICAgICAgLy8gU29tZXRoaW5nIGVycm9yZWQgZHVyaW5nIGEgcHJldmlvdXMgYXR0ZW1wdCB0byBoeWRyYXRlIHRoZSBzaGVsbCwgc28gd2VcbiAgICAgIC8vIGZvcmNlZCBhIGNsaWVudCByZW5kZXIuXG4gICAgICB2YXIgcmVjb3ZlcmFibGVFcnJvciA9IGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKG5ldyBFcnJvcignVGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGh5ZHJhdGluZy4gQmVjYXVzZSB0aGUgZXJyb3IgaGFwcGVuZWQgb3V0c2lkZSAnICsgJ29mIGEgU3VzcGVuc2UgYm91bmRhcnksIHRoZSBlbnRpcmUgcm9vdCB3aWxsIHN3aXRjaCB0byAnICsgJ2NsaWVudCByZW5kZXJpbmcuJyksIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBtb3VudEhvc3RSb290V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcywgcmVjb3ZlcmFibGVFcnJvcik7XG4gICAgfSBlbHNlIGlmIChuZXh0Q2hpbGRyZW4gIT09IHByZXZDaGlsZHJlbikge1xuICAgICAgdmFyIF9yZWNvdmVyYWJsZUVycm9yID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIobmV3IEVycm9yKCdUaGlzIHJvb3QgcmVjZWl2ZWQgYW4gZWFybHkgdXBkYXRlLCBiZWZvcmUgYW55dGhpbmcgd2FzIGFibGUgJyArICdoeWRyYXRlLiBTd2l0Y2hlZCB0aGUgZW50aXJlIHJvb3QgdG8gY2xpZW50IHJlbmRlcmluZy4nKSwgd29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICByZXR1cm4gbW91bnRIb3N0Um9vdFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMsIF9yZWNvdmVyYWJsZUVycm9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIG91dGVybW9zdCBzaGVsbCBoYXMgbm90IGh5ZHJhdGVkIHlldC4gU3RhcnQgaHlkcmF0aW5nLlxuICAgICAgZW50ZXJIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgIHZhciBjaGlsZCA9IG1vdW50Q2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIG51bGwsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjaGlsZDtcbiAgICAgIHZhciBub2RlID0gY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgIC8vIE1hcmsgZWFjaCBjaGlsZCBhcyBoeWRyYXRpbmcuIFRoaXMgaXMgYSBmYXN0IHBhdGggdG8ga25vdyB3aGV0aGVyIHRoaXNcbiAgICAgICAgLy8gdHJlZSBpcyBwYXJ0IG9mIGEgaHlkcmF0aW5nIHRyZWUuIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgYSBjaGlsZFxuICAgICAgICAvLyBub2RlIGhhcyBmdWxseSBtb3VudGVkIHlldCwgYW5kIGZvciBzY2hlZHVsaW5nIGV2ZW50IHJlcGxheWluZy5cbiAgICAgICAgLy8gQ29uY2VwdHVhbGx5IHRoaXMgaXMgc2ltaWxhciB0byBQbGFjZW1lbnQgaW4gdGhhdCBhIG5ldyBzdWJ0cmVlIGlzXG4gICAgICAgIC8vIGluc2VydGVkIGludG8gdGhlIFJlYWN0IHRyZWUgaGVyZS4gSXQganVzdCBoYXBwZW5zIHRvIG5vdCBuZWVkIERPTVxuICAgICAgICAvLyBtdXRhdGlvbnMgYmVjYXVzZSBpdCBhbHJlYWR5IGV4aXN0cy5cbiAgICAgICAgbm9kZS5mbGFncyA9IG5vZGUuZmxhZ3MgJiB+UGxhY2VtZW50IHwgSHlkcmF0aW5nO1xuICAgICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBSb290IGlzIG5vdCBkZWh5ZHJhdGVkLiBFaXRoZXIgdGhpcyBpcyBhIGNsaWVudC1vbmx5IHJvb3QsIG9yIGl0XG4gICAgLy8gYWxyZWFkeSBoeWRyYXRlZC5cbiAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG5cbiAgICBpZiAobmV4dENoaWxkcmVuID09PSBwcmV2Q2hpbGRyZW4pIHtcbiAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgfVxuXG4gICAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiBtb3VudEhvc3RSb290V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcywgcmVjb3ZlcmFibGVFcnJvcikge1xuICAvLyBSZXZlcnQgdG8gY2xpZW50IHJlbmRlcmluZy5cbiAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuICBxdWV1ZUh5ZHJhdGlvbkVycm9yKHJlY292ZXJhYmxlRXJyb3IpO1xuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBGb3JjZUNsaWVudFJlbmRlcjtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUhvc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHB1c2hIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICB0cnlUb0NsYWltTmV4dEh5ZHJhdGFibGVJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cblxuICB2YXIgdHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBwcmV2UHJvcHMgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogbnVsbDtcbiAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgdmFyIGlzRGlyZWN0VGV4dENoaWxkID0gc2hvdWxkU2V0VGV4dENvbnRlbnQodHlwZSwgbmV4dFByb3BzKTtcblxuICBpZiAoaXNEaXJlY3RUZXh0Q2hpbGQpIHtcbiAgICAvLyBXZSBzcGVjaWFsIGNhc2UgYSBkaXJlY3QgdGV4dCBjaGlsZCBvZiBhIGhvc3Qgbm9kZS4gVGhpcyBpcyBhIGNvbW1vblxuICAgIC8vIGNhc2UuIFdlIHdvbid0IGhhbmRsZSBpdCBhcyBhIHJlaWZpZWQgY2hpbGQuIFdlIHdpbGwgaW5zdGVhZCBoYW5kbGVcbiAgICAvLyB0aGlzIGluIHRoZSBob3N0IGVudmlyb25tZW50IHRoYXQgYWxzbyBoYXMgYWNjZXNzIHRvIHRoaXMgcHJvcC4gVGhhdFxuICAgIC8vIGF2b2lkcyBhbGxvY2F0aW5nIGFub3RoZXIgSG9zdFRleHQgZmliZXIgYW5kIHRyYXZlcnNpbmcgaXQuXG4gICAgbmV4dENoaWxkcmVuID0gbnVsbDtcbiAgfSBlbHNlIGlmIChwcmV2UHJvcHMgIT09IG51bGwgJiYgc2hvdWxkU2V0VGV4dENvbnRlbnQodHlwZSwgcHJldlByb3BzKSkge1xuICAgIC8vIElmIHdlJ3JlIHN3aXRjaGluZyBmcm9tIGEgZGlyZWN0IHRleHQgY2hpbGQgdG8gYSBub3JtYWwgY2hpbGQsIG9yIHRvXG4gICAgLy8gZW1wdHksIHdlIG5lZWQgdG8gc2NoZWR1bGUgdGhlIHRleHQgY29udGVudCB0byBiZSByZXNldC5cbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBDb250ZW50UmVzZXQ7XG4gIH1cblxuICBtYXJrUmVmKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUhvc3RUZXh0KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSB7XG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgdHJ5VG9DbGFpbU5leHRIeWRyYXRhYmxlSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MpO1xuICB9IC8vIE5vdGhpbmcgdG8gZG8gaGVyZS4gVGhpcyBpcyB0ZXJtaW5hbC4gV2UnbGwgZG8gdGhlIGNvbXBsZXRpb24gc3RlcFxuICAvLyBpbW1lZGlhdGVseSBhZnRlci5cblxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBtb3VudExhenlDb21wb25lbnQoX2N1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBlbGVtZW50VHlwZSwgcmVuZGVyTGFuZXMpIHtcbiAgcmVzZXRTdXNwZW5kZWRDdXJyZW50T25Nb3VudEluTGVnYWN5TW9kZShfY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICB2YXIgcHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBsYXp5Q29tcG9uZW50ID0gZWxlbWVudFR5cGU7XG4gIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuICB2YXIgQ29tcG9uZW50ID0gaW5pdChwYXlsb2FkKTsgLy8gU3RvcmUgdGhlIHVud3JhcHBlZCBjb21wb25lbnQgaW4gdGhlIHR5cGUuXG5cbiAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudDtcbiAgdmFyIHJlc29sdmVkVGFnID0gd29ya0luUHJvZ3Jlc3MudGFnID0gcmVzb2x2ZUxhenlDb21wb25lbnRUYWcoQ29tcG9uZW50KTtcbiAgdmFyIHJlc29sdmVkUHJvcHMgPSByZXNvbHZlRGVmYXVsdFByb3BzKENvbXBvbmVudCwgcHJvcHMpO1xuICB2YXIgY2hpbGQ7XG5cbiAgc3dpdGNoIChyZXNvbHZlZFRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB2YWxpZGF0ZUZ1bmN0aW9uQ29tcG9uZW50SW5EZXYod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCk7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudCA9IHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyhDb21wb25lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGQgPSB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlZFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH1cblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gQ29tcG9uZW50ID0gcmVzb2x2ZUNsYXNzRm9ySG90UmVsb2FkaW5nKENvbXBvbmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZCA9IHVwZGF0ZUNsYXNzQ29tcG9uZW50KG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlc29sdmVkUHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgfVxuXG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudCA9IHJlc29sdmVGb3J3YXJkUmVmRm9ySG90UmVsb2FkaW5nKENvbXBvbmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZCA9IHVwZGF0ZUZvcndhcmRSZWYobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcmVzb2x2ZWRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICB9XG5cbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgICAgICAgIHZhciBvdXRlclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgICAgICAgIGlmIChvdXRlclByb3BUeXBlcykge1xuICAgICAgICAgICAgICBjaGVja1Byb3BUeXBlcyhvdXRlclByb3BUeXBlcywgcmVzb2x2ZWRQcm9wcywgLy8gUmVzb2x2ZWQgZm9yIG91dGVyIG9ubHlcbiAgICAgICAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGQgPSB1cGRhdGVNZW1vQ29tcG9uZW50KG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlc29sdmVEZWZhdWx0UHJvcHMoQ29tcG9uZW50LnR5cGUsIHJlc29sdmVkUHJvcHMpLCAvLyBUaGUgaW5uZXIgdHlwZSBjYW4gaGF2ZSBkZWZhdWx0cyB0b29cbiAgICAgICAgcmVuZGVyTGFuZXMpO1xuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICB9XG4gIH1cblxuICB2YXIgaGludCA9ICcnO1xuXG4gIHtcbiAgICBpZiAoQ29tcG9uZW50ICE9PSBudWxsICYmIHR5cGVvZiBDb21wb25lbnQgPT09ICdvYmplY3QnICYmIENvbXBvbmVudC4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICBoaW50ID0gJyBEaWQgeW91IHdyYXAgYSBjb21wb25lbnQgaW4gUmVhY3QubGF6eSgpIG1vcmUgdGhhbiBvbmNlPyc7XG4gICAgfVxuICB9IC8vIFRoaXMgbWVzc2FnZSBpbnRlbnRpb25hbGx5IGRvZXNuJ3QgbWVudGlvbiBGb3J3YXJkUmVmIG9yIE1lbW9Db21wb25lbnRcbiAgLy8gYmVjYXVzZSB0aGUgZmFjdCB0aGF0IGl0J3MgYSBzZXBhcmF0ZSB0eXBlIG9mIHdvcmsgaXMgYW5cbiAgLy8gaW1wbGVtZW50YXRpb24gZGV0YWlsLlxuXG5cbiAgdGhyb3cgbmV3IEVycm9yKFwiRWxlbWVudCB0eXBlIGlzIGludmFsaWQuIFJlY2VpdmVkIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvOiBcIiArIENvbXBvbmVudCArIFwiLiBcIiArIChcIkxhenkgZWxlbWVudCB0eXBlIG11c3QgcmVzb2x2ZSB0byBhIGNsYXNzIG9yIGZ1bmN0aW9uLlwiICsgaGludCkpO1xufVxuXG5mdW5jdGlvbiBtb3VudEluY29tcGxldGVDbGFzc0NvbXBvbmVudChfY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcykge1xuICByZXNldFN1c3BlbmRlZEN1cnJlbnRPbk1vdW50SW5MZWdhY3lNb2RlKF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7IC8vIFByb21vdGUgdGhlIGZpYmVyIHRvIGEgY2xhc3MgYW5kIHRyeSByZW5kZXJpbmcgYWdhaW4uXG5cbiAgd29ya0luUHJvZ3Jlc3MudGFnID0gQ2xhc3NDb21wb25lbnQ7IC8vIFRoZSByZXN0IG9mIHRoaXMgZnVuY3Rpb24gaXMgYSBmb3JrIG9mIGB1cGRhdGVDbGFzc0NvbXBvbmVudGBcbiAgLy8gUHVzaCBjb250ZXh0IHByb3ZpZGVycyBlYXJseSB0byBwcmV2ZW50IGNvbnRleHQgc3RhY2sgbWlzbWF0Y2hlcy5cbiAgLy8gRHVyaW5nIG1vdW50aW5nIHdlIGRvbid0IGtub3cgdGhlIGNoaWxkIGNvbnRleHQgeWV0IGFzIHRoZSBpbnN0YW5jZSBkb2Vzbid0IGV4aXN0LlxuICAvLyBXZSB3aWxsIGludmFsaWRhdGUgdGhlIGNoaWxkIGNvbnRleHQgaW4gZmluaXNoQ2xhc3NDb21wb25lbnQoKSByaWdodCBhZnRlciByZW5kZXJpbmcuXG5cbiAgdmFyIGhhc0NvbnRleHQ7XG5cbiAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICBoYXNDb250ZXh0ID0gdHJ1ZTtcbiAgICBwdXNoQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzKTtcbiAgfSBlbHNlIHtcbiAgICBoYXNDb250ZXh0ID0gZmFsc2U7XG4gIH1cblxuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICBjb25zdHJ1Y3RDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcyk7XG4gIG1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIGZpbmlzaENsYXNzQ29tcG9uZW50KG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHRydWUsIGhhc0NvbnRleHQsIHJlbmRlckxhbmVzKTtcbn1cblxuZnVuY3Rpb24gbW91bnRJbmRldGVybWluYXRlQ29tcG9uZW50KF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZW5kZXJMYW5lcykge1xuICByZXNldFN1c3BlbmRlZEN1cnJlbnRPbk1vdW50SW5MZWdhY3lNb2RlKF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHZhciBwcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIGNvbnRleHQ7XG5cbiAge1xuICAgIHZhciB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgZmFsc2UpO1xuICAgIGNvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpO1xuICB9XG5cbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgdmFyIHZhbHVlO1xuICB2YXIgaGFzSWQ7XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKHdvcmtJblByb2dyZXNzKTtcbiAgfVxuXG4gIHtcbiAgICBpZiAoQ29tcG9uZW50LnByb3RvdHlwZSAmJiB0eXBlb2YgQ29tcG9uZW50LnByb3RvdHlwZS5yZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dEJhZENsYXNzW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgIGVycm9yKFwiVGhlIDwlcyAvPiBjb21wb25lbnQgYXBwZWFycyB0byBoYXZlIGEgcmVuZGVyIG1ldGhvZCwgYnV0IGRvZXNuJ3QgZXh0ZW5kIFJlYWN0LkNvbXBvbmVudC4gXCIgKyAnVGhpcyBpcyBsaWtlbHkgdG8gY2F1c2UgZXJyb3JzLiBDaGFuZ2UgJXMgdG8gZXh0ZW5kIFJlYWN0LkNvbXBvbmVudCBpbnN0ZWFkLicsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dEJhZENsYXNzW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZExlZ2FjeUNvbnRleHRXYXJuaW5nKHdvcmtJblByb2dyZXNzLCBudWxsKTtcbiAgICB9XG5cbiAgICBzZXRJc1JlbmRlcmluZyh0cnVlKTtcbiAgICBSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICB2YWx1ZSA9IHJlbmRlcldpdGhIb29rcyhudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBwcm9wcywgY29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICAgIGhhc0lkID0gY2hlY2tEaWRSZW5kZXJJZEhvb2soKTtcbiAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gIH1cblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuXG4gIHtcbiAgICAvLyBTdXBwb3J0IGZvciBtb2R1bGUgY29tcG9uZW50cyBpcyBkZXByZWNhdGVkIGFuZCBpcyByZW1vdmVkIGJlaGluZCBhIGZsYWcuXG4gICAgLy8gV2hldGhlciBvciBub3QgaXQgd291bGQgY3Jhc2ggbGF0ZXIsIHdlIHdhbnQgdG8gc2hvdyBhIGdvb2QgbWVzc2FnZSBpbiBERVYgZmlyc3QuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJyAmJiB2YWx1ZS4kJHR5cGVvZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgX2NvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSB8fCAnVW5rbm93bic7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0TW9kdWxlUGF0dGVybkNvbXBvbmVudFtfY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZXJyb3IoJ1RoZSA8JXMgLz4gY29tcG9uZW50IGFwcGVhcnMgdG8gYmUgYSBmdW5jdGlvbiBjb21wb25lbnQgdGhhdCByZXR1cm5zIGEgY2xhc3MgaW5zdGFuY2UuICcgKyAnQ2hhbmdlICVzIHRvIGEgY2xhc3MgdGhhdCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCBpbnN0ZWFkLiAnICsgXCJJZiB5b3UgY2FuJ3QgdXNlIGEgY2xhc3MgdHJ5IGFzc2lnbmluZyB0aGUgcHJvdG90eXBlIG9uIHRoZSBmdW5jdGlvbiBhcyBhIHdvcmthcm91bmQuIFwiICsgXCJgJXMucHJvdG90eXBlID0gUmVhY3QuQ29tcG9uZW50LnByb3RvdHlwZWAuIERvbid0IHVzZSBhbiBhcnJvdyBmdW5jdGlvbiBzaW5jZSBpdCBcIiArICdjYW5ub3QgYmUgY2FsbGVkIHdpdGggYG5ld2AgYnkgUmVhY3QuJywgX2NvbXBvbmVudE5hbWUsIF9jb21wb25lbnROYW1lLCBfY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgZGlkV2FybkFib3V0TW9kdWxlUGF0dGVybkNvbXBvbmVudFtfY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICggLy8gUnVuIHRoZXNlIGNoZWNrcyBpbiBwcm9kdWN0aW9uIG9ubHkgaWYgdGhlIGZsYWcgaXMgb2ZmLlxuICAvLyBFdmVudHVhbGx5IHdlJ2xsIGRlbGV0ZSB0aGlzIGJyYW5jaCBhbHRvZ2V0aGVyLlxuICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUucmVuZGVyID09PSAnZnVuY3Rpb24nICYmIHZhbHVlLiQkdHlwZW9mID09PSB1bmRlZmluZWQpIHtcbiAgICB7XG4gICAgICB2YXIgX2NvbXBvbmVudE5hbWUyID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dE1vZHVsZVBhdHRlcm5Db21wb25lbnRbX2NvbXBvbmVudE5hbWUyXSkge1xuICAgICAgICBlcnJvcignVGhlIDwlcyAvPiBjb21wb25lbnQgYXBwZWFycyB0byBiZSBhIGZ1bmN0aW9uIGNvbXBvbmVudCB0aGF0IHJldHVybnMgYSBjbGFzcyBpbnN0YW5jZS4gJyArICdDaGFuZ2UgJXMgdG8gYSBjbGFzcyB0aGF0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IGluc3RlYWQuICcgKyBcIklmIHlvdSBjYW4ndCB1c2UgYSBjbGFzcyB0cnkgYXNzaWduaW5nIHRoZSBwcm90b3R5cGUgb24gdGhlIGZ1bmN0aW9uIGFzIGEgd29ya2Fyb3VuZC4gXCIgKyBcImAlcy5wcm90b3R5cGUgPSBSZWFjdC5Db21wb25lbnQucHJvdG90eXBlYC4gRG9uJ3QgdXNlIGFuIGFycm93IGZ1bmN0aW9uIHNpbmNlIGl0IFwiICsgJ2Nhbm5vdCBiZSBjYWxsZWQgd2l0aCBgbmV3YCBieSBSZWFjdC4nLCBfY29tcG9uZW50TmFtZTIsIF9jb21wb25lbnROYW1lMiwgX2NvbXBvbmVudE5hbWUyKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50W19jb21wb25lbnROYW1lMl0gPSB0cnVlO1xuICAgICAgfVxuICAgIH0gLy8gUHJvY2VlZCB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoaXMgaXMgYSBjbGFzcyBpbnN0YW5jZVxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBDbGFzc0NvbXBvbmVudDsgLy8gVGhyb3cgb3V0IGFueSBob29rcyB0aGF0IHdlcmUgdXNlZC5cblxuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDsgLy8gUHVzaCBjb250ZXh0IHByb3ZpZGVycyBlYXJseSB0byBwcmV2ZW50IGNvbnRleHQgc3RhY2sgbWlzbWF0Y2hlcy5cbiAgICAvLyBEdXJpbmcgbW91bnRpbmcgd2UgZG9uJ3Qga25vdyB0aGUgY2hpbGQgY29udGV4dCB5ZXQgYXMgdGhlIGluc3RhbmNlIGRvZXNuJ3QgZXhpc3QuXG4gICAgLy8gV2Ugd2lsbCBpbnZhbGlkYXRlIHRoZSBjaGlsZCBjb250ZXh0IGluIGZpbmlzaENsYXNzQ29tcG9uZW50KCkgcmlnaHQgYWZ0ZXIgcmVuZGVyaW5nLlxuXG4gICAgdmFyIGhhc0NvbnRleHQgPSBmYWxzZTtcblxuICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICBoYXNDb250ZXh0ID0gdHJ1ZTtcbiAgICAgIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICBoYXNDb250ZXh0ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IHZhbHVlLnN0YXRlICE9PSBudWxsICYmIHZhbHVlLnN0YXRlICE9PSB1bmRlZmluZWQgPyB2YWx1ZS5zdGF0ZSA6IG51bGw7XG4gICAgaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzKTtcbiAgICBhZG9wdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIHZhbHVlKTtcbiAgICBtb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICByZXR1cm4gZmluaXNoQ2xhc3NDb21wb25lbnQobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSwgaGFzQ29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICB9IGVsc2Uge1xuICAgIC8vIFByb2NlZWQgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGlzIGlzIGEgZnVuY3Rpb24gY29tcG9uZW50XG4gICAgd29ya0luUHJvZ3Jlc3MudGFnID0gRnVuY3Rpb25Db21wb25lbnQ7XG5cbiAgICB7XG5cbiAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YWx1ZSA9IHJlbmRlcldpdGhIb29rcyhudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBwcm9wcywgY29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICAgICAgICAgIGhhc0lkID0gY2hlY2tEaWRSZW5kZXJJZEhvb2soKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBoYXNJZCkge1xuICAgICAgcHVzaE1hdGVyaWFsaXplZFRyZWVJZCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuXG4gICAgcmVjb25jaWxlQ2hpbGRyZW4obnVsbCwgd29ya0luUHJvZ3Jlc3MsIHZhbHVlLCByZW5kZXJMYW5lcyk7XG5cbiAgICB7XG4gICAgICB2YWxpZGF0ZUZ1bmN0aW9uQ29tcG9uZW50SW5EZXYod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlRnVuY3Rpb25Db21wb25lbnRJbkRldih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50KSB7XG4gIHtcbiAgICBpZiAoQ29tcG9uZW50KSB7XG4gICAgICBpZiAoQ29tcG9uZW50LmNoaWxkQ29udGV4dFR5cGVzKSB7XG4gICAgICAgIGVycm9yKCclcyguLi4pOiBjaGlsZENvbnRleHRUeXBlcyBjYW5ub3QgYmUgZGVmaW5lZCBvbiBhIGZ1bmN0aW9uIGNvbXBvbmVudC4nLCBDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50Lm5hbWUgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5yZWYgIT09IG51bGwpIHtcbiAgICAgIHZhciBpbmZvID0gJyc7XG4gICAgICB2YXIgb3duZXJOYW1lID0gZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKTtcblxuICAgICAgaWYgKG93bmVyTmFtZSkge1xuICAgICAgICBpbmZvICs9ICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG93bmVyTmFtZSArICdgLic7XG4gICAgICB9XG5cbiAgICAgIHZhciB3YXJuaW5nS2V5ID0gb3duZXJOYW1lIHx8ICcnO1xuICAgICAgdmFyIGRlYnVnU291cmNlID0gd29ya0luUHJvZ3Jlc3MuX2RlYnVnU291cmNlO1xuXG4gICAgICBpZiAoZGVidWdTb3VyY2UpIHtcbiAgICAgICAgd2FybmluZ0tleSA9IGRlYnVnU291cmNlLmZpbGVOYW1lICsgJzonICsgZGVidWdTb3VyY2UubGluZU51bWJlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRGdW5jdGlvblJlZnNbd2FybmluZ0tleV0pIHtcbiAgICAgICAgZGlkV2FybkFib3V0RnVuY3Rpb25SZWZzW3dhcm5pbmdLZXldID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignRnVuY3Rpb24gY29tcG9uZW50cyBjYW5ub3QgYmUgZ2l2ZW4gcmVmcy4gJyArICdBdHRlbXB0cyB0byBhY2Nlc3MgdGhpcyByZWYgd2lsbCBmYWlsLiAnICsgJ0RpZCB5b3UgbWVhbiB0byB1c2UgUmVhY3QuZm9yd2FyZFJlZigpPyVzJywgaW5mbyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCBDb21wb25lbnQuZGVmYXVsdFByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dERlZmF1bHRQcm9wc09uRnVuY3Rpb25Db21wb25lbnRbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZXJyb3IoJyVzOiBTdXBwb3J0IGZvciBkZWZhdWx0UHJvcHMgd2lsbCBiZSByZW1vdmVkIGZyb20gZnVuY3Rpb24gY29tcG9uZW50cyAnICsgJ2luIGEgZnV0dXJlIG1ham9yIHJlbGVhc2UuIFVzZSBKYXZhU2NyaXB0IGRlZmF1bHQgcGFyYW1ldGVycyBpbnN0ZWFkLicsIGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dERlZmF1bHRQcm9wc09uRnVuY3Rpb25Db21wb25lbnRbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgQ29tcG9uZW50LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIF9jb21wb25lbnROYW1lMyA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpIHx8ICdVbmtub3duJztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRHZXREZXJpdmVkU3RhdGVPbkZ1bmN0aW9uQ29tcG9uZW50W19jb21wb25lbnROYW1lM10pIHtcbiAgICAgICAgZXJyb3IoJyVzOiBGdW5jdGlvbiBjb21wb25lbnRzIGRvIG5vdCBzdXBwb3J0IGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4nLCBfY29tcG9uZW50TmFtZTMpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dEdldERlcml2ZWRTdGF0ZU9uRnVuY3Rpb25Db21wb25lbnRbX2NvbXBvbmVudE5hbWUzXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBDb21wb25lbnQuY29udGV4dFR5cGUgPT09ICdvYmplY3QnICYmIENvbXBvbmVudC5jb250ZXh0VHlwZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIF9jb21wb25lbnROYW1lNCA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpIHx8ICdVbmtub3duJztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRDb250ZXh0VHlwZU9uRnVuY3Rpb25Db21wb25lbnRbX2NvbXBvbmVudE5hbWU0XSkge1xuICAgICAgICBlcnJvcignJXM6IEZ1bmN0aW9uIGNvbXBvbmVudHMgZG8gbm90IHN1cHBvcnQgY29udGV4dFR5cGUuJywgX2NvbXBvbmVudE5hbWU0KTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZU9uRnVuY3Rpb25Db21wb25lbnRbX2NvbXBvbmVudE5hbWU0XSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBTVVNQRU5ERURfTUFSS0VSID0ge1xuICBkZWh5ZHJhdGVkOiBudWxsLFxuICB0cmVlQ29udGV4dDogbnVsbCxcbiAgcmV0cnlMYW5lOiBOb0xhbmVcbn07XG5cbmZ1bmN0aW9uIG1vdW50U3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShyZW5kZXJMYW5lcykge1xuICByZXR1cm4ge1xuICAgIGJhc2VMYW5lczogcmVuZGVyTGFuZXMsXG4gICAgY2FjaGVQb29sOiBnZXRTdXNwZW5kZWRDYWNoZSgpLFxuICAgIHRyYW5zaXRpb25zOiBudWxsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN1c3BlbnNlT2Zmc2NyZWVuU3RhdGUocHJldk9mZnNjcmVlblN0YXRlLCByZW5kZXJMYW5lcykge1xuICB2YXIgY2FjaGVQb29sID0gbnVsbDtcblxuICByZXR1cm4ge1xuICAgIGJhc2VMYW5lczogbWVyZ2VMYW5lcyhwcmV2T2Zmc2NyZWVuU3RhdGUuYmFzZUxhbmVzLCByZW5kZXJMYW5lcyksXG4gICAgY2FjaGVQb29sOiBjYWNoZVBvb2wsXG4gICAgdHJhbnNpdGlvbnM6IHByZXZPZmZzY3JlZW5TdGF0ZS50cmFuc2l0aW9uc1xuICB9O1xufSAvLyBUT0RPOiBQcm9iYWJseSBzaG91bGQgaW5saW5lIHRoaXMgYmFja1xuXG5cbmZ1bmN0aW9uIHNob3VsZFJlbWFpbk9uRmFsbGJhY2soc3VzcGVuc2VDb250ZXh0LCBjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgLy8gSWYgd2UncmUgYWxyZWFkeSBzaG93aW5nIGEgZmFsbGJhY2ssIHRoZXJlIGFyZSBjYXNlcyB3aGVyZSB3ZSBuZWVkIHRvXG4gIC8vIHJlbWFpbiBvbiB0aGF0IGZhbGxiYWNrIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgY29udGVudCBoYXMgcmVzb2x2ZWQuXG4gIC8vIEZvciBleGFtcGxlLCBTdXNwZW5zZUxpc3QgY29vcmRpbmF0ZXMgd2hlbiBuZXN0ZWQgY29udGVudCBhcHBlYXJzLlxuICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgIHZhciBzdXNwZW5zZVN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuXG4gICAgaWYgKHN1c3BlbnNlU3RhdGUgPT09IG51bGwpIHtcbiAgICAgIC8vIEN1cnJlbnRseSBzaG93aW5nIGNvbnRlbnQuIERvbid0IGhpZGUgaXQsIGV2ZW4gaWYgRm9yY2VTdXNwZW5zZUZhbGxiYWNrXG4gICAgICAvLyBpcyB0cnVlLiBNb3JlIHByZWNpc2UgbmFtZSBtaWdodCBiZSBcIkZvcmNlUmVtYWluU3VzcGVuc2VGYWxsYmFja1wiLlxuICAgICAgLy8gTm90ZTogVGhpcyBpcyBhIGZhY3RvcmluZyBzbWVsbC4gQ2FuJ3QgcmVtYWluIG9uIGEgZmFsbGJhY2sgaWYgdGhlcmUnc1xuICAgICAgLy8gbm8gZmFsbGJhY2sgdG8gcmVtYWluIG9uLlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSAvLyBOb3QgY3VycmVudGx5IHNob3dpbmcgY29udGVudC4gQ29uc3VsdCB0aGUgU3VzcGVuc2UgY29udGV4dC5cblxuXG4gIHJldHVybiBoYXNTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0LCBGb3JjZVN1c3BlbnNlRmFsbGJhY2spO1xufVxuXG5mdW5jdGlvbiBnZXRSZW1haW5pbmdXb3JrSW5QcmltYXJ5VHJlZShjdXJyZW50LCByZW5kZXJMYW5lcykge1xuICAvLyBUT0RPOiBTaG91bGQgbm90IHJlbW92ZSByZW5kZXIgbGFuZXMgdGhhdCB3ZXJlIHBpbmdlZCBkdXJpbmcgdGhpcyByZW5kZXJcbiAgcmV0dXJuIHJlbW92ZUxhbmVzKGN1cnJlbnQuY2hpbGRMYW5lcywgcmVuZGVyTGFuZXMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTdXNwZW5zZUNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wczsgLy8gVGhpcyBpcyB1c2VkIGJ5IERldlRvb2xzIHRvIGZvcmNlIGEgYm91bmRhcnkgdG8gc3VzcGVuZC5cblxuICB7XG4gICAgaWYgKHNob3VsZFN1c3BlbmQod29ya0luUHJvZ3Jlc3MpKSB7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgIH1cbiAgfVxuXG4gIHZhciBzdXNwZW5zZUNvbnRleHQgPSBzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQ7XG4gIHZhciBzaG93RmFsbGJhY2sgPSBmYWxzZTtcbiAgdmFyIGRpZFN1c3BlbmQgPSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncztcblxuICBpZiAoZGlkU3VzcGVuZCB8fCBzaG91bGRSZW1haW5PbkZhbGxiYWNrKHN1c3BlbnNlQ29udGV4dCwgY3VycmVudCkpIHtcbiAgICAvLyBTb21ldGhpbmcgaW4gdGhpcyBib3VuZGFyeSdzIHN1YnRyZWUgYWxyZWFkeSBzdXNwZW5kZWQuIFN3aXRjaCB0b1xuICAgIC8vIHJlbmRlcmluZyB0aGUgZmFsbGJhY2sgY2hpbGRyZW4uXG4gICAgc2hvd0ZhbGxiYWNrID0gdHJ1ZTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSB+RGlkQ2FwdHVyZTtcbiAgfSBlbHNlIHtcbiAgICAvLyBBdHRlbXB0aW5nIHRoZSBtYWluIGNvbnRlbnRcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50Lm1lbW9pemVkU3RhdGUgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgaXMgYSBuZXcgbW91bnQgb3IgdGhpcyBib3VuZGFyeSBpcyBhbHJlYWR5IHNob3dpbmcgYSBmYWxsYmFjayBzdGF0ZS5cbiAgICAgIC8vIE1hcmsgdGhpcyBzdWJ0cmVlIGNvbnRleHQgYXMgaGF2aW5nIGF0IGxlYXN0IG9uZSBpbnZpc2libGUgcGFyZW50IHRoYXQgY291bGRcbiAgICAgIC8vIGhhbmRsZSB0aGUgZmFsbGJhY2sgc3RhdGUuXG4gICAgICAvLyBBdm9pZGVkIGJvdW5kYXJpZXMgYXJlIG5vdCBjb25zaWRlcmVkIHNpbmNlIHRoZXkgY2Fubm90IGhhbmRsZSBwcmVmZXJyZWQgZmFsbGJhY2sgc3RhdGVzLlxuICAgICAge1xuICAgICAgICBzdXNwZW5zZUNvbnRleHQgPSBhZGRTdWJ0cmVlU3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCwgSW52aXNpYmxlUGFyZW50U3VzcGVuc2VDb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdXNwZW5zZUNvbnRleHQgPSBzZXREZWZhdWx0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQpO1xuICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZUNvbnRleHQpOyAvLyBPSywgdGhlIG5leHQgcGFydCBpcyBjb25mdXNpbmcuIFdlJ3JlIGFib3V0IHRvIHJlY29uY2lsZSB0aGUgU3VzcGVuc2VcbiAgLy8gYm91bmRhcnkncyBjaGlsZHJlbi4gVGhpcyBpbnZvbHZlcyBzb21lIGN1c3RvbSByZWNvbmNpbGlhdGlvbiBsb2dpYy4gVHdvXG4gIC8vIG1haW4gcmVhc29ucyB0aGlzIGlzIHNvIGNvbXBsaWNhdGVkLlxuICAvL1xuICAvLyBGaXJzdCwgTGVnYWN5IE1vZGUgaGFzIGRpZmZlcmVudCBzZW1hbnRpY3MgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBUaGVcbiAgLy8gcHJpbWFyeSB0cmVlIHdpbGwgY29tbWl0IGluIGFuIGluY29uc2lzdGVudCBzdGF0ZSwgc28gd2hlbiB3ZSBkbyB0aGVcbiAgLy8gc2Vjb25kIHBhc3MgdG8gcmVuZGVyIHRoZSBmYWxsYmFjaywgd2UgZG8gc29tZSBleGNlZWRpbmdseSwgdWgsIGNsZXZlclxuICAvLyBoYWNrcyB0byBtYWtlIHRoYXQgbm90IHRvdGFsbHkgYnJlYWsuIExpa2UgdHJhbnNmZXJyaW5nIGVmZmVjdHMgYW5kXG4gIC8vIGRlbGV0aW9ucyBmcm9tIGhpZGRlbiB0cmVlLiBJbiBDb25jdXJyZW50IE1vZGUsIGl0J3MgbXVjaCBzaW1wbGVyLFxuICAvLyBiZWNhdXNlIHdlIGJhaWxvdXQgb24gdGhlIHByaW1hcnkgdHJlZSBjb21wbGV0ZWx5IGFuZCBsZWF2ZSBpdCBpbiBpdHMgb2xkXG4gIC8vIHN0YXRlLCBubyBlZmZlY3RzLiBTYW1lIGFzIHdoYXQgd2UgZG8gZm9yIE9mZnNjcmVlbiAoZXhjZXB0IHRoYXRcbiAgLy8gT2Zmc2NyZWVuIGRvZXNuJ3QgaGF2ZSB0aGUgZmlyc3QgcmVuZGVyIHBhc3MpLlxuICAvL1xuICAvLyBTZWNvbmQgaXMgaHlkcmF0aW9uLiBEdXJpbmcgaHlkcmF0aW9uLCB0aGUgU3VzcGVuc2UgZmliZXIgaGFzIGEgc2xpZ2h0bHlcbiAgLy8gZGlmZmVyZW50IGxheW91dCwgd2hlcmUgdGhlIGNoaWxkIHBvaW50cyB0byBhIGRlaHlkcmF0ZWQgZnJhZ21lbnQsIHdoaWNoXG4gIC8vIGNvbnRhaW5zIHRoZSBET00gcmVuZGVyZWQgYnkgdGhlIHNlcnZlci5cbiAgLy9cbiAgLy8gVGhpcmQsIGV2ZW4gaWYgeW91IHNldCBhbGwgdGhhdCBhc2lkZSwgU3VzcGVuc2UgaXMgbGlrZSBlcnJvciBib3VuZGFyaWVzIGluXG4gIC8vIHRoYXQgd2UgZmlyc3Qgd2UgdHJ5IHRvIHJlbmRlciBvbmUgdHJlZSwgYW5kIGlmIHRoYXQgZmFpbHMsIHdlIHJlbmRlciBhZ2FpblxuICAvLyBhbmQgc3dpdGNoIHRvIGEgZGlmZmVyZW50IHRyZWUuIExpa2UgYSB0cnkvY2F0Y2ggYmxvY2suIFNvIHdlIGhhdmUgdG8gdHJhY2tcbiAgLy8gd2hpY2ggYnJhbmNoIHdlJ3JlIGN1cnJlbnRseSByZW5kZXJpbmcuIElkZWFsbHkgd2Ugd291bGQgbW9kZWwgdGhpcyB1c2luZ1xuICAvLyBhIHN0YWNrLlxuXG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgLy8gSW5pdGlhbCBtb3VudFxuICAgIC8vIFNwZWNpYWwgcGF0aCBmb3IgaHlkcmF0aW9uXG4gICAgLy8gSWYgd2UncmUgY3VycmVudGx5IGh5ZHJhdGluZywgdHJ5IHRvIGh5ZHJhdGUgdGhpcyBib3VuZGFyeS5cbiAgICB0cnlUb0NsYWltTmV4dEh5ZHJhdGFibGVJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcyk7IC8vIFRoaXMgY291bGQndmUgYmVlbiBhIGRlaHlkcmF0ZWQgc3VzcGVuc2UgY29tcG9uZW50LlxuXG4gICAgdmFyIHN1c3BlbnNlU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gICAgaWYgKHN1c3BlbnNlU3RhdGUgIT09IG51bGwpIHtcbiAgICAgIHZhciBkZWh5ZHJhdGVkID0gc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkO1xuXG4gICAgICBpZiAoZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbW91bnREZWh5ZHJhdGVkU3VzcGVuc2VDb21wb25lbnQod29ya0luUHJvZ3Jlc3MsIGRlaHlkcmF0ZWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBuZXh0UHJpbWFyeUNoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICAgIHZhciBuZXh0RmFsbGJhY2tDaGlsZHJlbiA9IG5leHRQcm9wcy5mYWxsYmFjaztcblxuICAgIGlmIChzaG93RmFsbGJhY2spIHtcbiAgICAgIHZhciBmYWxsYmFja0ZyYWdtZW50ID0gbW91bnRTdXNwZW5zZUZhbGxiYWNrQ2hpbGRyZW4od29ya0luUHJvZ3Jlc3MsIG5leHRQcmltYXJ5Q2hpbGRyZW4sIG5leHRGYWxsYmFja0NoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gICAgICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50Lm1lbW9pemVkU3RhdGUgPSBtb3VudFN1c3BlbnNlT2Zmc2NyZWVuU3RhdGUocmVuZGVyTGFuZXMpO1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IFNVU1BFTkRFRF9NQVJLRVI7XG5cbiAgICAgIHJldHVybiBmYWxsYmFja0ZyYWdtZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbW91bnRTdXNwZW5zZVByaW1hcnlDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgbmV4dFByaW1hcnlDaGlsZHJlbik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaXMgYW4gdXBkYXRlLlxuICAgIC8vIFNwZWNpYWwgcGF0aCBmb3IgaHlkcmF0aW9uXG4gICAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcblxuICAgIGlmIChwcmV2U3RhdGUgIT09IG51bGwpIHtcbiAgICAgIHZhciBfZGVoeWRyYXRlZCA9IHByZXZTdGF0ZS5kZWh5ZHJhdGVkO1xuXG4gICAgICBpZiAoX2RlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZURlaHlkcmF0ZWRTdXNwZW5zZUNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgZGlkU3VzcGVuZCwgbmV4dFByb3BzLCBfZGVoeWRyYXRlZCwgcHJldlN0YXRlLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3dGYWxsYmFjaykge1xuICAgICAgdmFyIF9uZXh0RmFsbGJhY2tDaGlsZHJlbiA9IG5leHRQcm9wcy5mYWxsYmFjaztcbiAgICAgIHZhciBfbmV4dFByaW1hcnlDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgICAgIHZhciBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSB1cGRhdGVTdXNwZW5zZUZhbGxiYWNrQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIF9uZXh0UHJpbWFyeUNoaWxkcmVuLCBfbmV4dEZhbGxiYWNrQ2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgICAgIHZhciBfcHJpbWFyeUNoaWxkRnJhZ21lbnQyID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICB2YXIgcHJldk9mZnNjcmVlblN0YXRlID0gY3VycmVudC5jaGlsZC5tZW1vaXplZFN0YXRlO1xuICAgICAgX3ByaW1hcnlDaGlsZEZyYWdtZW50Mi5tZW1vaXplZFN0YXRlID0gcHJldk9mZnNjcmVlblN0YXRlID09PSBudWxsID8gbW91bnRTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHJlbmRlckxhbmVzKSA6IHVwZGF0ZVN1c3BlbnNlT2Zmc2NyZWVuU3RhdGUocHJldk9mZnNjcmVlblN0YXRlLCByZW5kZXJMYW5lcyk7XG5cbiAgICAgIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDIuY2hpbGRMYW5lcyA9IGdldFJlbWFpbmluZ1dvcmtJblByaW1hcnlUcmVlKGN1cnJlbnQsIHJlbmRlckxhbmVzKTtcbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBTVVNQRU5ERURfTUFSS0VSO1xuICAgICAgcmV0dXJuIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIF9uZXh0UHJpbWFyeUNoaWxkcmVuMiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcblxuICAgICAgdmFyIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDMgPSB1cGRhdGVTdXNwZW5zZVByaW1hcnlDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgX25leHRQcmltYXJ5Q2hpbGRyZW4yLCByZW5kZXJMYW5lcyk7XG5cbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDM7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1vdW50U3VzcGVuc2VQcmltYXJ5Q2hpbGRyZW4od29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG1vZGUgPSB3b3JrSW5Qcm9ncmVzcy5tb2RlO1xuICB2YXIgcHJpbWFyeUNoaWxkUHJvcHMgPSB7XG4gICAgbW9kZTogJ3Zpc2libGUnLFxuICAgIGNoaWxkcmVuOiBwcmltYXJ5Q2hpbGRyZW5cbiAgfTtcbiAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gbW91bnRXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKHByaW1hcnlDaGlsZFByb3BzLCBtb2RlKTtcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gIHJldHVybiBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZUZhbGxiYWNrQ2hpbGRyZW4od29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbiwgZmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG1vZGUgPSB3b3JrSW5Qcm9ncmVzcy5tb2RlO1xuICB2YXIgcHJvZ3Jlc3NlZFByaW1hcnlGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICB2YXIgcHJpbWFyeUNoaWxkUHJvcHMgPSB7XG4gICAgbW9kZTogJ2hpZGRlbicsXG4gICAgY2hpbGRyZW46IHByaW1hcnlDaGlsZHJlblxuICB9O1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gIHZhciBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG5cbiAgaWYgKChtb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUgJiYgcHJvZ3Jlc3NlZFByaW1hcnlGcmFnbWVudCAhPT0gbnVsbCkge1xuICAgIC8vIEluIGxlZ2FjeSBtb2RlLCB3ZSBjb21taXQgdGhlIHByaW1hcnkgdHJlZSBhcyBpZiBpdCBzdWNjZXNzZnVsbHlcbiAgICAvLyBjb21wbGV0ZWQsIGV2ZW4gdGhvdWdoIGl0J3MgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLlxuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gcHJvZ3Jlc3NlZFByaW1hcnlGcmFnbWVudDtcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5jaGlsZExhbmVzID0gTm9MYW5lcztcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5wZW5kaW5nUHJvcHMgPSBwcmltYXJ5Q2hpbGRQcm9wcztcblxuICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAvLyBSZXNldCB0aGUgZHVyYXRpb25zIGZyb20gdGhlIGZpcnN0IHBhc3Mgc28gdGhleSBhcmVuJ3QgaW5jbHVkZWQgaW4gdGhlXG4gICAgICAvLyBmaW5hbCBhbW91bnRzLiBUaGlzIHNlZW1zIGNvdW50ZXJpbnR1aXRpdmUsIHNpbmNlIHdlJ3JlIGludGVudGlvbmFsbHlcbiAgICAgIC8vIG5vdCBtZWFzdXJpbmcgcGFydCBvZiB0aGUgcmVuZGVyIHBoYXNlLCBidXQgdGhpcyBtYWtlcyBpdCBtYXRjaCB3aGF0IHdlXG4gICAgICAvLyBkbyBpbiBDb25jdXJyZW50IE1vZGUuXG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5hY3R1YWxEdXJhdGlvbiA9IDA7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5hY3R1YWxTdGFydFRpbWUgPSAtMTtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnNlbGZCYXNlRHVyYXRpb24gPSAwO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQudHJlZUJhc2VEdXJhdGlvbiA9IDA7XG4gICAgfVxuXG4gICAgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZmFsbGJhY2tDaGlsZHJlbiwgbW9kZSwgcmVuZGVyTGFuZXMsIG51bGwpO1xuICB9IGVsc2Uge1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gbW91bnRXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKHByaW1hcnlDaGlsZFByb3BzLCBtb2RlKTtcbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChmYWxsYmFja0NoaWxkcmVuLCBtb2RlLCByZW5kZXJMYW5lcywgbnVsbCk7XG4gIH1cblxuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgZmFsbGJhY2tDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zaWJsaW5nID0gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHByaW1hcnlDaGlsZEZyYWdtZW50O1xuICByZXR1cm4gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xufVxuXG5mdW5jdGlvbiBtb3VudFdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIob2Zmc2NyZWVuUHJvcHMsIG1vZGUsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRoZSBwcm9wcyBhcmd1bWVudCB0byBgY3JlYXRlRmliZXJGcm9tT2Zmc2NyZWVuYCBpcyBgYW55YCB0eXBlZCwgc28gd2UgdXNlXG4gIC8vIHRoaXMgd3JhcHBlciBmdW5jdGlvbiB0byBjb25zdHJhaW4gaXQuXG4gIHJldHVybiBjcmVhdGVGaWJlckZyb21PZmZzY3JlZW4ob2Zmc2NyZWVuUHJvcHMsIG1vZGUsIE5vTGFuZXMsIG51bGwpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKGN1cnJlbnQsIG9mZnNjcmVlblByb3BzKSB7XG4gIC8vIFRoZSBwcm9wcyBhcmd1bWVudCB0byBgY3JlYXRlV29ya0luUHJvZ3Jlc3NgIGlzIGBhbnlgIHR5cGVkLCBzbyB3ZSB1c2UgdGhpc1xuICAvLyB3cmFwcGVyIGZ1bmN0aW9uIHRvIGNvbnN0cmFpbiBpdC5cbiAgcmV0dXJuIGNyZWF0ZVdvcmtJblByb2dyZXNzKGN1cnJlbnQsIG9mZnNjcmVlblByb3BzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3VzcGVuc2VQcmltYXJ5Q2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudCA9IGN1cnJlbnQuY2hpbGQ7XG4gIHZhciBjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmc7XG4gIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHVwZGF0ZVdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIoY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LCB7XG4gICAgbW9kZTogJ3Zpc2libGUnLFxuICAgIGNoaWxkcmVuOiBwcmltYXJ5Q2hpbGRyZW5cbiAgfSk7XG5cbiAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5sYW5lcyA9IHJlbmRlckxhbmVzO1xuICB9XG5cbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmcgPSBudWxsO1xuXG4gIGlmIChjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgLy8gRGVsZXRlIHRoZSBmYWxsYmFjayBjaGlsZCBmcmFnbWVudFxuICAgIHZhciBkZWxldGlvbnMgPSB3b3JrSW5Qcm9ncmVzcy5kZWxldGlvbnM7XG5cbiAgICBpZiAoZGVsZXRpb25zID09PSBudWxsKSB7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5kZWxldGlvbnMgPSBbY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudF07XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBDaGlsZERlbGV0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGlvbnMucHVzaChjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50KTtcbiAgICB9XG4gIH1cblxuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHByaW1hcnlDaGlsZEZyYWdtZW50O1xuICByZXR1cm4gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN1c3BlbnNlRmFsbGJhY2tDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuLCBmYWxsYmFja0NoaWxkcmVuLCByZW5kZXJMYW5lcykge1xuICB2YXIgbW9kZSA9IHdvcmtJblByb2dyZXNzLm1vZGU7XG4gIHZhciBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBjdXJyZW50LmNoaWxkO1xuICB2YXIgY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudC5zaWJsaW5nO1xuICB2YXIgcHJpbWFyeUNoaWxkUHJvcHMgPSB7XG4gICAgbW9kZTogJ2hpZGRlbicsXG4gICAgY2hpbGRyZW46IHByaW1hcnlDaGlsZHJlblxuICB9O1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG5cbiAgaWYgKCAvLyBJbiBsZWdhY3kgbW9kZSwgd2UgY29tbWl0IHRoZSBwcmltYXJ5IHRyZWUgYXMgaWYgaXQgc3VjY2Vzc2Z1bGx5XG4gIC8vIGNvbXBsZXRlZCwgZXZlbiB0aG91Z2ggaXQncyBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuXG4gIChtb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUgJiYgLy8gTWFrZSBzdXJlIHdlJ3JlIG9uIHRoZSBzZWNvbmQgcGFzcywgaS5lLiB0aGUgcHJpbWFyeSBjaGlsZCBmcmFnbWVudCB3YXNcbiAgLy8gYWxyZWFkeSBjbG9uZWQuIEluIGxlZ2FjeSBtb2RlLCB0aGUgb25seSBjYXNlIHdoZXJlIHRoaXMgaXNuJ3QgdHJ1ZSBpc1xuICAvLyB3aGVuIERldlRvb2xzIGZvcmNlcyB1cyB0byBkaXNwbGF5IGEgZmFsbGJhY2s7IHdlIHNraXAgdGhlIGZpcnN0IHJlbmRlclxuICAvLyBwYXNzIGVudGlyZWx5IGFuZCBnbyBzdHJhaWdodCB0byByZW5kZXJpbmcgdGhlIGZhbGxiYWNrLiAoSW4gQ29uY3VycmVudFxuICAvLyBNb2RlLCBTdXNwZW5zZUxpc3QgY2FuIGFsc28gdHJpZ2dlciB0aGlzIHNjZW5hcmlvLCBidXQgdGhpcyBpcyBhIGxlZ2FjeS1cbiAgLy8gb25seSBjb2RlcGF0aC4pXG4gIHdvcmtJblByb2dyZXNzLmNoaWxkICE9PSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQpIHtcbiAgICB2YXIgcHJvZ3Jlc3NlZFByaW1hcnlGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gcHJvZ3Jlc3NlZFByaW1hcnlGcmFnbWVudDtcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5jaGlsZExhbmVzID0gTm9MYW5lcztcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5wZW5kaW5nUHJvcHMgPSBwcmltYXJ5Q2hpbGRQcm9wcztcblxuICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAvLyBSZXNldCB0aGUgZHVyYXRpb25zIGZyb20gdGhlIGZpcnN0IHBhc3Mgc28gdGhleSBhcmVuJ3QgaW5jbHVkZWQgaW4gdGhlXG4gICAgICAvLyBmaW5hbCBhbW91bnRzLiBUaGlzIHNlZW1zIGNvdW50ZXJpbnR1aXRpdmUsIHNpbmNlIHdlJ3JlIGludGVudGlvbmFsbHlcbiAgICAgIC8vIG5vdCBtZWFzdXJpbmcgcGFydCBvZiB0aGUgcmVuZGVyIHBoYXNlLCBidXQgdGhpcyBtYWtlcyBpdCBtYXRjaCB3aGF0IHdlXG4gICAgICAvLyBkbyBpbiBDb25jdXJyZW50IE1vZGUuXG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5hY3R1YWxEdXJhdGlvbiA9IDA7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5hY3R1YWxTdGFydFRpbWUgPSAtMTtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnNlbGZCYXNlRHVyYXRpb24gPSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb24gPSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICB9IC8vIFRoZSBmYWxsYmFjayBmaWJlciB3YXMgYWRkZWQgYXMgYSBkZWxldGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBhc3MuXG4gICAgLy8gSG93ZXZlciwgc2luY2Ugd2UncmUgZ29pbmcgdG8gcmVtYWluIG9uIHRoZSBmYWxsYmFjaywgd2Ugbm8gbG9uZ2VyIHdhbnRcbiAgICAvLyB0byBkZWxldGUgaXQuXG5cblxuICAgIHdvcmtJblByb2dyZXNzLmRlbGV0aW9ucyA9IG51bGw7XG4gIH0gZWxzZSB7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudCwgcHJpbWFyeUNoaWxkUHJvcHMpOyAvLyBTaW5jZSB3ZSdyZSByZXVzaW5nIGEgY3VycmVudCB0cmVlLCB3ZSBuZWVkIHRvIHJldXNlIHRoZSBmbGFncywgdG9vLlxuICAgIC8vIChXZSBkb24ndCBkbyB0aGlzIGluIGxlZ2FjeSBtb2RlLCBiZWNhdXNlIGluIGxlZ2FjeSBtb2RlIHdlIGRvbid0IHJlLXVzZVxuICAgIC8vIHRoZSBjdXJyZW50IHRyZWU7IHNlZSBwcmV2aW91cyBicmFuY2guKVxuXG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc3VidHJlZUZsYWdzID0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LnN1YnRyZWVGbGFncyAmIFN0YXRpY01hc2s7XG4gIH1cblxuICB2YXIgZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuXG4gIGlmIChjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudCwgZmFsbGJhY2tDaGlsZHJlbik7XG4gIH0gZWxzZSB7XG4gICAgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZmFsbGJhY2tDaGlsZHJlbiwgbW9kZSwgcmVuZGVyTGFuZXMsIG51bGwpOyAvLyBOZWVkcyBhIHBsYWNlbWVudCBlZmZlY3QgYmVjYXVzZSB0aGUgcGFyZW50ICh0aGUgU3VzcGVuc2UgYm91bmRhcnkpIGFscmVhZHlcbiAgICAvLyBtb3VudGVkIGJ1dCB0aGlzIGlzIGEgbmV3IGZpYmVyLlxuXG4gICAgZmFsbGJhY2tDaGlsZEZyYWdtZW50LmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgfVxuXG4gIGZhbGxiYWNrQ2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmcgPSBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gIHJldHVybiBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG59XG5cbmZ1bmN0aW9uIHJldHJ5U3VzcGVuc2VDb21wb25lbnRXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcywgcmVjb3ZlcmFibGVFcnJvcikge1xuICAvLyBGYWxsaW5nIGJhY2sgdG8gY2xpZW50IHJlbmRlcmluZy4gQmVjYXVzZSB0aGlzIGhhcyBwZXJmb3JtYW5jZVxuICAvLyBpbXBsaWNhdGlvbnMsIGl0J3MgY29uc2lkZXJlZCBhIHJlY292ZXJhYmxlIGVycm9yLCBldmVuIHRob3VnaCB0aGUgdXNlclxuICAvLyBsaWtlbHkgd29uJ3Qgb2JzZXJ2ZSBhbnl0aGluZyB3cm9uZyB3aXRoIHRoZSBVSS5cbiAgLy9cbiAgLy8gVGhlIGVycm9yIGlzIHBhc3NlZCBpbiBhcyBhbiBhcmd1bWVudCB0byBlbmZvcmNlIHRoYXQgZXZlcnkgY2FsbGVyIHByb3ZpZGVcbiAgLy8gYSBjdXN0b20gbWVzc2FnZSwgb3IgZXhwbGljaXRseSBvcHQgb3V0IChjdXJyZW50bHkgdGhlIG9ubHkgcGF0aCB0aGF0IG9wdHNcbiAgLy8gb3V0IGlzIGxlZ2FjeSBtb2RlOyBldmVyeSBjb25jdXJyZW50IHBhdGggcHJvdmlkZXMgYW4gZXJyb3IpLlxuICBpZiAocmVjb3ZlcmFibGVFcnJvciAhPT0gbnVsbCkge1xuICAgIHF1ZXVlSHlkcmF0aW9uRXJyb3IocmVjb3ZlcmFibGVFcnJvcik7XG4gIH0gLy8gVGhpcyB3aWxsIGFkZCB0aGUgb2xkIGZpYmVyIHRvIHRoZSBkZWxldGlvbiBsaXN0XG5cblxuICByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgY3VycmVudC5jaGlsZCwgbnVsbCwgcmVuZGVyTGFuZXMpOyAvLyBXZSdyZSBub3cgbm90IHN1c3BlbmRlZCBub3IgZGVoeWRyYXRlZC5cblxuICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgcHJpbWFyeUNoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBtb3VudFN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4pOyAvLyBOZWVkcyBhIHBsYWNlbWVudCBlZmZlY3QgYmVjYXVzZSB0aGUgcGFyZW50ICh0aGUgU3VzcGVuc2UgYm91bmRhcnkpIGFscmVhZHlcbiAgLy8gbW91bnRlZCBidXQgdGhpcyBpcyBhIG5ldyBmaWJlci5cblxuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5mbGFncyB8PSBQbGFjZW1lbnQ7XG4gIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICByZXR1cm4gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG59XG5cbmZ1bmN0aW9uIG1vdW50U3VzcGVuc2VGYWxsYmFja0FmdGVyUmV0cnlXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4sIGZhbGxiYWNrQ2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIHZhciBmaWJlck1vZGUgPSB3b3JrSW5Qcm9ncmVzcy5tb2RlO1xuICB2YXIgcHJpbWFyeUNoaWxkUHJvcHMgPSB7XG4gICAgbW9kZTogJ3Zpc2libGUnLFxuICAgIGNoaWxkcmVuOiBwcmltYXJ5Q2hpbGRyZW5cbiAgfTtcbiAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gbW91bnRXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKHByaW1hcnlDaGlsZFByb3BzLCBmaWJlck1vZGUpO1xuICB2YXIgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZmFsbGJhY2tDaGlsZHJlbiwgZmliZXJNb2RlLCByZW5kZXJMYW5lcywgbnVsbCk7IC8vIE5lZWRzIGEgcGxhY2VtZW50IGVmZmVjdCBiZWNhdXNlIHRoZSBwYXJlbnQgKHRoZSBTdXNwZW5zZVxuICAvLyBib3VuZGFyeSkgYWxyZWFkeSBtb3VudGVkIGJ1dCB0aGlzIGlzIGEgbmV3IGZpYmVyLlxuXG4gIGZhbGxiYWNrQ2hpbGRGcmFnbWVudC5mbGFncyB8PSBQbGFjZW1lbnQ7XG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICBmYWxsYmFja0NoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmcgPSBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG5cbiAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAvLyBXZSB3aWxsIGhhdmUgZHJvcHBlZCB0aGUgZWZmZWN0IGxpc3Qgd2hpY2ggY29udGFpbnMgdGhlXG4gICAgLy8gZGVsZXRpb24uIFdlIG5lZWQgdG8gcmVjb25jaWxlIHRvIGRlbGV0ZSB0aGUgY3VycmVudCBjaGlsZC5cbiAgICByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgY3VycmVudC5jaGlsZCwgbnVsbCwgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgcmV0dXJuIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gbW91bnREZWh5ZHJhdGVkU3VzcGVuc2VDb21wb25lbnQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbnNlSW5zdGFuY2UsIHJlbmRlckxhbmVzKSB7XG4gIC8vIER1cmluZyB0aGUgZmlyc3QgcGFzcywgd2UnbGwgYmFpbCBvdXQgYW5kIG5vdCBkcmlsbCBpbnRvIHRoZSBjaGlsZHJlbi5cbiAgLy8gSW5zdGVhZCwgd2UnbGwgbGVhdmUgdGhlIGNvbnRlbnQgaW4gcGxhY2UgYW5kIHRyeSB0byBoeWRyYXRlIGl0IGxhdGVyLlxuICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgIHtcbiAgICAgIGVycm9yKCdDYW5ub3QgaHlkcmF0ZSBTdXNwZW5zZSBpbiBsZWdhY3kgbW9kZS4gU3dpdGNoIGZyb20gJyArICdSZWFjdERPTS5oeWRyYXRlKGVsZW1lbnQsIGNvbnRhaW5lcikgdG8gJyArICdSZWFjdERPTUNsaWVudC5oeWRyYXRlUm9vdChjb250YWluZXIsIDxBcHAgLz4pJyArICcucmVuZGVyKGVsZW1lbnQpIG9yIHJlbW92ZSB0aGUgU3VzcGVuc2UgY29tcG9uZW50cyBmcm9tICcgKyAndGhlIHNlcnZlciByZW5kZXJlZCBjb21wb25lbnRzLicpO1xuICAgIH1cblxuICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbGFuZVRvTGFuZXMoU3luY0xhbmUpO1xuICB9IGVsc2UgaWYgKGlzU3VzcGVuc2VJbnN0YW5jZUZhbGxiYWNrKHN1c3BlbnNlSW5zdGFuY2UpKSB7XG4gICAgLy8gVGhpcyBpcyBhIGNsaWVudC1vbmx5IGJvdW5kYXJ5LiBTaW5jZSB3ZSB3b24ndCBnZXQgYW55IGNvbnRlbnQgZnJvbSB0aGUgc2VydmVyXG4gICAgLy8gZm9yIHRoaXMsIHdlIG5lZWQgdG8gc2NoZWR1bGUgdGhhdCBhdCBhIGhpZ2hlciBwcmlvcml0eSBiYXNlZCBvbiB3aGVuIGl0IHdvdWxkXG4gICAgLy8gaGF2ZSB0aW1lZCBvdXQuIEluIHRoZW9yeSB3ZSBjb3VsZCByZW5kZXIgaXQgaW4gdGhpcyBwYXNzIGJ1dCBpdCB3b3VsZCBoYXZlIHRoZVxuICAgIC8vIHdyb25nIHByaW9yaXR5IGFzc29jaWF0ZWQgd2l0aCBpdCBhbmQgd2lsbCBwcmV2ZW50IGh5ZHJhdGlvbiBvZiBwYXJlbnQgcGF0aC5cbiAgICAvLyBJbnN0ZWFkLCB3ZSdsbCBsZWF2ZSB3b3JrIGxlZnQgb24gaXQgdG8gcmVuZGVyIGl0IGluIGEgc2VwYXJhdGUgY29tbWl0LlxuICAgIC8vIFRPRE8gVGhpcyB0aW1lIHNob3VsZCBiZSB0aGUgdGltZSBhdCB3aGljaCB0aGUgc2VydmVyIHJlbmRlcmVkIHJlc3BvbnNlIHRoYXQgaXNcbiAgICAvLyBhIHBhcmVudCB0byB0aGlzIGJvdW5kYXJ5IHdhcyBkaXNwbGF5ZWQuIEhvd2V2ZXIsIHNpbmNlIHdlIGN1cnJlbnRseSBkb24ndCBoYXZlXG4gICAgLy8gYSBwcm90b2NvbCB0byB0cmFuc2ZlciB0aGF0IHRpbWUsIHdlJ2xsIGp1c3QgZXN0aW1hdGUgaXQgYnkgdXNpbmcgdGhlIGN1cnJlbnRcbiAgICAvLyB0aW1lLiBUaGlzIHdpbGwgbWVhbiB0aGF0IFN1c3BlbnNlIHRpbWVvdXRzIGFyZSBzbGlnaHRseSBzaGlmdGVkIHRvIGxhdGVyIHRoYW5cbiAgICAvLyB0aGV5IHNob3VsZCBiZS5cbiAgICAvLyBTY2hlZHVsZSBhIG5vcm1hbCBwcmkgdXBkYXRlIHRvIHJlbmRlciB0aGlzIGNvbnRlbnQuXG4gICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBsYW5lVG9MYW5lcyhEZWZhdWx0SHlkcmF0aW9uTGFuZSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gV2UnbGwgY29udGludWUgaHlkcmF0aW5nIHRoZSByZXN0IGF0IG9mZnNjcmVlbiBwcmlvcml0eSBzaW5jZSB3ZSdsbCBhbHJlYWR5XG4gICAgLy8gYmUgc2hvd2luZyB0aGUgcmlnaHQgY29udGVudCBjb21pbmcgZnJvbSB0aGUgc2VydmVyLCBpdCBpcyBubyBydXNoLlxuICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbGFuZVRvTGFuZXMoT2Zmc2NyZWVuTGFuZSk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRGVoeWRyYXRlZFN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBkaWRTdXNwZW5kLCBuZXh0UHJvcHMsIHN1c3BlbnNlSW5zdGFuY2UsIHN1c3BlbnNlU3RhdGUsIHJlbmRlckxhbmVzKSB7XG4gIGlmICghZGlkU3VzcGVuZCkge1xuICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHJlbmRlciBwYXNzLiBBdHRlbXB0IHRvIGh5ZHJhdGUuXG4gICAgLy8gV2Ugc2hvdWxkIG5ldmVyIGJlIGh5ZHJhdGluZyBhdCB0aGlzIHBvaW50IGJlY2F1c2UgaXQgaXMgdGhlIGZpcnN0IHBhc3MsXG4gICAgLy8gYnV0IGFmdGVyIHdlJ3ZlIGFscmVhZHkgY29tbWl0dGVkIG9uY2UuXG4gICAgd2FybklmSHlkcmF0aW5nKCk7XG5cbiAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgcmV0dXJuIHJldHJ5U3VzcGVuc2VDb21wb25lbnRXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcywgLy8gVE9ETzogV2hlbiB3ZSBkZWxldGUgbGVnYWN5IG1vZGUsIHdlIHNob3VsZCBtYWtlIHRoaXMgZXJyb3IgYXJndW1lbnRcbiAgICAgIC8vIHJlcXVpcmVkIFx1MjAxNCBldmVyeSBjb25jdXJyZW50IG1vZGUgcGF0aCB0aGF0IGNhdXNlcyBoeWRyYXRpb24gdG9cbiAgICAgIC8vIGRlLW9wdCB0byBjbGllbnQgcmVuZGVyaW5nIHNob3VsZCBoYXZlIGFuIGVycm9yIG1lc3NhZ2UuXG4gICAgICBudWxsKTtcbiAgICB9XG5cbiAgICBpZiAoaXNTdXNwZW5zZUluc3RhbmNlRmFsbGJhY2soc3VzcGVuc2VJbnN0YW5jZSkpIHtcbiAgICAgIC8vIFRoaXMgYm91bmRhcnkgaXMgaW4gYSBwZXJtYW5lbnQgZmFsbGJhY2sgc3RhdGUuIEluIHRoaXMgY2FzZSwgd2UnbGwgbmV2ZXJcbiAgICAgIC8vIGdldCBhbiB1cGRhdGUgYW5kIHdlJ2xsIG5ldmVyIGJlIGFibGUgdG8gaHlkcmF0ZSB0aGUgZmluYWwgY29udGVudC4gTGV0J3MganVzdCB0cnkgdGhlXG4gICAgICAvLyBjbGllbnQgc2lkZSByZW5kZXIgaW5zdGVhZC5cbiAgICAgIHZhciBkaWdlc3QsIG1lc3NhZ2UsIHN0YWNrO1xuXG4gICAgICB7XG4gICAgICAgIHZhciBfZ2V0U3VzcGVuc2VJbnN0YW5jZUYgPSBnZXRTdXNwZW5zZUluc3RhbmNlRmFsbGJhY2tFcnJvckRldGFpbHMoc3VzcGVuc2VJbnN0YW5jZSk7XG5cbiAgICAgICAgZGlnZXN0ID0gX2dldFN1c3BlbnNlSW5zdGFuY2VGLmRpZ2VzdDtcbiAgICAgICAgbWVzc2FnZSA9IF9nZXRTdXNwZW5zZUluc3RhbmNlRi5tZXNzYWdlO1xuICAgICAgICBzdGFjayA9IF9nZXRTdXNwZW5zZUluc3RhbmNlRi5zdGFjaztcbiAgICAgIH1cblxuICAgICAgdmFyIGVycm9yO1xuXG4gICAgICBpZiAobWVzc2FnZSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgICBlcnJvciA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yID0gbmV3IEVycm9yKCdUaGUgc2VydmVyIGNvdWxkIG5vdCBmaW5pc2ggdGhpcyBTdXNwZW5zZSBib3VuZGFyeSwgbGlrZWx5ICcgKyAnZHVlIHRvIGFuIGVycm9yIGR1cmluZyBzZXJ2ZXIgcmVuZGVyaW5nLiBTd2l0Y2hlZCB0byAnICsgJ2NsaWVudCByZW5kZXJpbmcuJyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBjYXB0dXJlZFZhbHVlID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZShlcnJvciwgZGlnZXN0LCBzdGFjayk7XG4gICAgICByZXR1cm4gcmV0cnlTdXNwZW5zZUNvbXBvbmVudFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzLCBjYXB0dXJlZFZhbHVlKTtcbiAgICB9XG4gICAgLy8gYW55IGNvbnRleHQgaGFzIGNoYW5nZWQsIHdlIG5lZWQgdG8gdHJlYXQgaXMgYXMgaWYgdGhlIGlucHV0IG1pZ2h0IGhhdmUgY2hhbmdlZC5cblxuXG4gICAgdmFyIGhhc0NvbnRleHRDaGFuZ2VkID0gaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgY3VycmVudC5jaGlsZExhbmVzKTtcblxuICAgIGlmIChkaWRSZWNlaXZlVXBkYXRlIHx8IGhhc0NvbnRleHRDaGFuZ2VkKSB7XG4gICAgICAvLyBUaGlzIGJvdW5kYXJ5IGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBmaXJzdCByZW5kZXIuIFRoaXMgbWVhbnMgdGhhdCB3ZSBhcmUgbm93IHVuYWJsZSB0b1xuICAgICAgLy8gaHlkcmF0ZSBpdC4gV2UgbWlnaHQgc3RpbGwgYmUgYWJsZSB0byBoeWRyYXRlIGl0IHVzaW5nIGEgaGlnaGVyIHByaW9yaXR5IGxhbmUuXG4gICAgICB2YXIgcm9vdCA9IGdldFdvcmtJblByb2dyZXNzUm9vdCgpO1xuXG4gICAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgYXR0ZW1wdEh5ZHJhdGlvbkF0TGFuZSA9IGdldEJ1bXBlZExhbmVGb3JIeWRyYXRpb24ocm9vdCwgcmVuZGVyTGFuZXMpO1xuXG4gICAgICAgIGlmIChhdHRlbXB0SHlkcmF0aW9uQXRMYW5lICE9PSBOb0xhbmUgJiYgYXR0ZW1wdEh5ZHJhdGlvbkF0TGFuZSAhPT0gc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmUpIHtcbiAgICAgICAgICAvLyBJbnRlbnRpb25hbGx5IG11dGF0aW5nIHNpbmNlIHRoaXMgcmVuZGVyIHdpbGwgZ2V0IGludGVycnVwdGVkLiBUaGlzXG4gICAgICAgICAgLy8gaXMgb25lIG9mIHRoZSB2ZXJ5IHJhcmUgdGltZXMgd2hlcmUgd2UgbXV0YXRlIHRoZSBjdXJyZW50IHRyZWVcbiAgICAgICAgICAvLyBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS5cbiAgICAgICAgICBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZSA9IGF0dGVtcHRIeWRyYXRpb25BdExhbmU7IC8vIFRPRE86IElkZWFsbHkgdGhpcyB3b3VsZCBpbmhlcml0IHRoZSBldmVudCB0aW1lIG9mIHRoZSBjdXJyZW50IHJlbmRlclxuXG4gICAgICAgICAgdmFyIGV2ZW50VGltZSA9IE5vVGltZXN0YW1wO1xuICAgICAgICAgIGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShjdXJyZW50LCBhdHRlbXB0SHlkcmF0aW9uQXRMYW5lKTtcbiAgICAgICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgY3VycmVudCwgYXR0ZW1wdEh5ZHJhdGlvbkF0TGFuZSwgZXZlbnRUaW1lKTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBJZiB3ZSBoYXZlIHNjaGVkdWxlZCBoaWdoZXIgcHJpIHdvcmsgYWJvdmUsIHRoaXMgd2lsbCBwcm9iYWJseSBqdXN0IGFib3J0IHRoZSByZW5kZXJcbiAgICAgIC8vIHNpbmNlIHdlIG5vdyBoYXZlIGhpZ2hlciBwcmlvcml0eSB3b3JrLCBidXQgaW4gY2FzZSBpdCBkb2Vzbid0LCB3ZSBuZWVkIHRvIHByZXBhcmUgdG9cbiAgICAgIC8vIHJlbmRlciBzb21ldGhpbmcsIGlmIHdlIHRpbWUgb3V0LiBFdmVuIGlmIHRoYXQgcmVxdWlyZXMgdXMgdG8gZGVsZXRlIGV2ZXJ5dGhpbmcgYW5kXG4gICAgICAvLyBza2lwIGh5ZHJhdGlvbi5cbiAgICAgIC8vIERlbGF5IGhhdmluZyB0byBkbyB0aGlzIGFzIGxvbmcgYXMgdGhlIHN1c3BlbnNlIHRpbWVvdXQgYWxsb3dzIHVzLlxuXG5cbiAgICAgIHJlbmRlckRpZFN1c3BlbmREZWxheUlmUG9zc2libGUoKTtcblxuICAgICAgdmFyIF9jYXB0dXJlZFZhbHVlID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZShuZXcgRXJyb3IoJ1RoaXMgU3VzcGVuc2UgYm91bmRhcnkgcmVjZWl2ZWQgYW4gdXBkYXRlIGJlZm9yZSBpdCBmaW5pc2hlZCAnICsgJ2h5ZHJhdGluZy4gVGhpcyBjYXVzZWQgdGhlIGJvdW5kYXJ5IHRvIHN3aXRjaCB0byBjbGllbnQgcmVuZGVyaW5nLiAnICsgJ1RoZSB1c3VhbCB3YXkgdG8gZml4IHRoaXMgaXMgdG8gd3JhcCB0aGUgb3JpZ2luYWwgdXBkYXRlICcgKyAnaW4gc3RhcnRUcmFuc2l0aW9uLicpKTtcblxuICAgICAgcmV0dXJuIHJldHJ5U3VzcGVuc2VDb21wb25lbnRXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcywgX2NhcHR1cmVkVmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoaXNTdXNwZW5zZUluc3RhbmNlUGVuZGluZyhzdXNwZW5zZUluc3RhbmNlKSkge1xuICAgICAgLy8gVGhpcyBjb21wb25lbnQgaXMgc3RpbGwgcGVuZGluZyBtb3JlIGRhdGEgZnJvbSB0aGUgc2VydmVyLCBzbyB3ZSBjYW4ndCBoeWRyYXRlIGl0c1xuICAgICAgLy8gY29udGVudC4gV2UgdHJlYXQgaXQgYXMgaWYgdGhpcyBjb21wb25lbnQgc3VzcGVuZGVkIGl0c2VsZi4gSXQgbWlnaHQgc2VlbSBhcyBpZlxuICAgICAgLy8gd2UgY291bGQganVzdCB0cnkgdG8gcmVuZGVyIGl0IGNsaWVudC1zaWRlIGluc3RlYWQuIEhvd2V2ZXIsIHRoaXMgd2lsbCBwZXJmb3JtIGFcbiAgICAgIC8vIGxvdCBvZiB1bm5lY2Vzc2FyeSB3b3JrIGFuZCBpcyB1bmxpa2VseSB0byBjb21wbGV0ZSBzaW5jZSBpdCBvZnRlbiB3aWxsIHN1c3BlbmRcbiAgICAgIC8vIG9uIG1pc3NpbmcgZGF0YSBhbnl3YXkuIEFkZGl0aW9uYWxseSwgdGhlIHNlcnZlciBtaWdodCBiZSBhYmxlIHRvIHJlbmRlciBtb3JlXG4gICAgICAvLyB0aGFuIHdlIGNhbiBvbiB0aGUgY2xpZW50IHlldC4gSW4gdGhhdCBjYXNlIHdlJ2QgZW5kIHVwIHdpdGggbW9yZSBmYWxsYmFjayBzdGF0ZXNcbiAgICAgIC8vIG9uIHRoZSBjbGllbnQgdGhhbiBpZiB3ZSBqdXN0IGxlYXZlIGl0IGFsb25lLiBJZiB0aGUgc2VydmVyIHRpbWVzIG91dCBvciBlcnJvcnNcbiAgICAgIC8vIHRoZXNlIHNob3VsZCB1cGRhdGUgdGhpcyBib3VuZGFyeSB0byB0aGUgcGVybWFuZW50IEZhbGxiYWNrIHN0YXRlIGluc3RlYWQuXG4gICAgICAvLyBNYXJrIGl0IGFzIGhhdmluZyBjYXB0dXJlZCAoaS5lLiBzdXNwZW5kZWQpLlxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTsgLy8gTGVhdmUgdGhlIGNoaWxkIGluIHBsYWNlLiBJLmUuIHRoZSBkZWh5ZHJhdGVkIGZyYWdtZW50LlxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGN1cnJlbnQuY2hpbGQ7IC8vIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gcmV0cnkgdGhpcyBib3VuZGFyeSBvbmNlIHRoZSBzZXJ2ZXIgaGFzIHNlbnQgdGhlIHJlc3VsdC5cblxuICAgICAgdmFyIHJldHJ5ID0gcmV0cnlEZWh5ZHJhdGVkU3VzcGVuc2VCb3VuZGFyeS5iaW5kKG51bGwsIGN1cnJlbnQpO1xuICAgICAgcmVnaXN0ZXJTdXNwZW5zZUluc3RhbmNlUmV0cnkoc3VzcGVuc2VJbnN0YW5jZSwgcmV0cnkpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IGF0dGVtcHQuXG4gICAgICByZWVudGVySHlkcmF0aW9uU3RhdGVGcm9tRGVoeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIHN1c3BlbnNlSW5zdGFuY2UsIHN1c3BlbnNlU3RhdGUudHJlZUNvbnRleHQpO1xuICAgICAgdmFyIHByaW1hcnlDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgICAgIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IG1vdW50U3VzcGVuc2VQcmltYXJ5Q2hpbGRyZW4od29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbik7IC8vIE1hcmsgdGhlIGNoaWxkcmVuIGFzIGh5ZHJhdGluZy4gVGhpcyBpcyBhIGZhc3QgcGF0aCB0byBrbm93IHdoZXRoZXIgdGhpc1xuICAgICAgLy8gdHJlZSBpcyBwYXJ0IG9mIGEgaHlkcmF0aW5nIHRyZWUuIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgYSBjaGlsZFxuICAgICAgLy8gbm9kZSBoYXMgZnVsbHkgbW91bnRlZCB5ZXQsIGFuZCBmb3Igc2NoZWR1bGluZyBldmVudCByZXBsYXlpbmcuXG4gICAgICAvLyBDb25jZXB0dWFsbHkgdGhpcyBpcyBzaW1pbGFyIHRvIFBsYWNlbWVudCBpbiB0aGF0IGEgbmV3IHN1YnRyZWUgaXNcbiAgICAgIC8vIGluc2VydGVkIGludG8gdGhlIFJlYWN0IHRyZWUgaGVyZS4gSXQganVzdCBoYXBwZW5zIHRvIG5vdCBuZWVkIERPTVxuICAgICAgLy8gbXV0YXRpb25zIGJlY2F1c2UgaXQgYWxyZWFkeSBleGlzdHMuXG5cbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmZsYWdzIHw9IEh5ZHJhdGluZztcbiAgICAgIHJldHVybiBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgc2Vjb25kIHJlbmRlciBwYXNzLiBXZSBhbHJlYWR5IGF0dGVtcHRlZCB0byBoeWRyYXRlZCwgYnV0XG4gICAgLy8gc29tZXRoaW5nIGVpdGhlciBzdXNwZW5kZWQgb3IgZXJyb3JlZC5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBGb3JjZUNsaWVudFJlbmRlcikge1xuICAgICAgLy8gU29tZXRoaW5nIGVycm9yZWQgZHVyaW5nIGh5ZHJhdGlvbi4gVHJ5IGFnYWluIHdpdGhvdXQgaHlkcmF0aW5nLlxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gfkZvcmNlQ2xpZW50UmVuZGVyO1xuXG4gICAgICB2YXIgX2NhcHR1cmVkVmFsdWUyID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZShuZXcgRXJyb3IoJ1RoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBoeWRyYXRpbmcgdGhpcyBTdXNwZW5zZSBib3VuZGFyeS4gJyArICdTd2l0Y2hlZCB0byBjbGllbnQgcmVuZGVyaW5nLicpKTtcblxuICAgICAgcmV0dXJuIHJldHJ5U3VzcGVuc2VDb21wb25lbnRXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcywgX2NhcHR1cmVkVmFsdWUyKTtcbiAgICB9IGVsc2UgaWYgKHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgIT09IG51bGwpIHtcbiAgICAgIC8vIFNvbWV0aGluZyBzdXNwZW5kZWQgYW5kIHdlIHNob3VsZCBzdGlsbCBiZSBpbiBkZWh5ZHJhdGVkIG1vZGUuXG4gICAgICAvLyBMZWF2ZSB0aGUgZXhpc3RpbmcgY2hpbGQgaW4gcGxhY2UuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGN1cnJlbnQuY2hpbGQ7IC8vIFRoZSBkZWh5ZHJhdGVkIGNvbXBsZXRpb24gcGFzcyBleHBlY3RzIHRoaXMgZmxhZyB0byBiZSB0aGVyZVxuICAgICAgLy8gYnV0IHRoZSBub3JtYWwgc3VzcGVuc2UgcGFzcyBkb2Vzbid0LlxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFN1c3BlbmRlZCBidXQgd2Ugc2hvdWxkIG5vIGxvbmdlciBiZSBpbiBkZWh5ZHJhdGVkIG1vZGUuXG4gICAgICAvLyBUaGVyZWZvcmUgd2Ugbm93IGhhdmUgdG8gcmVuZGVyIHRoZSBmYWxsYmFjay5cbiAgICAgIHZhciBuZXh0UHJpbWFyeUNoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIG5leHRGYWxsYmFja0NoaWxkcmVuID0gbmV4dFByb3BzLmZhbGxiYWNrO1xuICAgICAgdmFyIGZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IG1vdW50U3VzcGVuc2VGYWxsYmFja0FmdGVyUmV0cnlXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0UHJpbWFyeUNoaWxkcmVuLCBuZXh0RmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICAgICAgdmFyIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDQubWVtb2l6ZWRTdGF0ZSA9IG1vdW50U3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShyZW5kZXJMYW5lcyk7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gU1VTUEVOREVEX01BUktFUjtcbiAgICAgIHJldHVybiBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlU3VzcGVuc2VXb3JrT25GaWJlcihmaWJlciwgcmVuZGVyTGFuZXMsIHByb3BhZ2F0aW9uUm9vdCkge1xuICBmaWJlci5sYW5lcyA9IG1lcmdlTGFuZXMoZmliZXIubGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgYWx0ZXJuYXRlLmxhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUubGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHNjaGVkdWxlQ29udGV4dFdvcmtPblBhcmVudFBhdGgoZmliZXIucmV0dXJuLCByZW5kZXJMYW5lcywgcHJvcGFnYXRpb25Sb290KTtcbn1cblxuZnVuY3Rpb24gcHJvcGFnYXRlU3VzcGVuc2VDb250ZXh0Q2hhbmdlKHdvcmtJblByb2dyZXNzLCBmaXJzdENoaWxkLCByZW5kZXJMYW5lcykge1xuICAvLyBNYXJrIGFueSBTdXNwZW5zZSBib3VuZGFyaWVzIHdpdGggZmFsbGJhY2tzIGFzIGhhdmluZyB3b3JrIHRvIGRvLlxuICAvLyBJZiB0aGV5IHdlcmUgcHJldmlvdXNseSBmb3JjZWQgaW50byBmYWxsYmFja3MsIHRoZXkgbWF5IG5vdyBiZSBhYmxlXG4gIC8vIHRvIHVuYmxvY2suXG4gIHZhciBub2RlID0gZmlyc3RDaGlsZDtcblxuICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgIGlmIChub2RlLnRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICAgIHZhciBzdGF0ZSA9IG5vZGUubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgaWYgKHN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIHNjaGVkdWxlU3VzcGVuc2VXb3JrT25GaWJlcihub2RlLCByZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobm9kZS50YWcgPT09IFN1c3BlbnNlTGlzdENvbXBvbmVudCkge1xuICAgICAgLy8gSWYgdGhlIHRhaWwgaXMgaGlkZGVuIHRoZXJlIG1pZ2h0IG5vdCBiZSBhbiBTdXNwZW5zZSBib3VuZGFyaWVzXG4gICAgICAvLyB0byBzY2hlZHVsZSB3b3JrIG9uLiBJbiB0aGlzIGNhc2Ugd2UgaGF2ZSB0byBzY2hlZHVsZSBpdCBvbiB0aGVcbiAgICAgIC8vIGxpc3QgaXRzZWxmLlxuICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSB0byB0cmF2ZXJzZSB0byB0aGUgY2hpbGRyZW4gb2YgdGhlIGxpc3Qgc2luY2VcbiAgICAgIC8vIHRoZSBsaXN0IHdpbGwgcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugd2hlbiBpdCByZXJlbmRlcnMuXG4gICAgICBzY2hlZHVsZVN1c3BlbnNlV29ya09uRmliZXIobm9kZSwgcmVuZGVyTGFuZXMsIHdvcmtJblByb2dyZXNzKTtcbiAgICB9IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUgPT09IHdvcmtJblByb2dyZXNzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kTGFzdENvbnRlbnRSb3coZmlyc3RDaGlsZCkge1xuICAvLyBUaGlzIGlzIGdvaW5nIHRvIGZpbmQgdGhlIGxhc3Qgcm93IGFtb25nIHRoZXNlIGNoaWxkcmVuIHRoYXQgaXMgYWxyZWFkeVxuICAvLyBzaG93aW5nIGNvbnRlbnQgb24gdGhlIHNjcmVlbiwgYXMgb3Bwb3NlZCB0byBiZWluZyBpbiBmYWxsYmFjayBzdGF0ZSBvclxuICAvLyBuZXcuIElmIGEgcm93IGhhcyBtdWx0aXBsZSBTdXNwZW5zZSBib3VuZGFyaWVzLCBhbnkgb2YgdGhlbSBiZWluZyBpbiB0aGVcbiAgLy8gZmFsbGJhY2sgc3RhdGUsIGNvdW50cyBhcyB0aGUgd2hvbGUgcm93IGJlaW5nIGluIGEgZmFsbGJhY2sgc3RhdGUuXG4gIC8vIE5vdGUgdGhhdCB0aGUgXCJyb3dzXCIgd2lsbCBiZSB3b3JrSW5Qcm9ncmVzcywgYnV0IGFueSBuZXN0ZWQgY2hpbGRyZW5cbiAgLy8gd2lsbCBzdGlsbCBiZSBjdXJyZW50IHNpbmNlIHdlIGhhdmVuJ3QgcmVuZGVyZWQgdGhlbSB5ZXQuIFRoZSBtb3VudGVkXG4gIC8vIG9yZGVyIG1heSBub3QgYmUgdGhlIHNhbWUgYXMgdGhlIG5ldyBvcmRlci4gV2UgdXNlIHRoZSBuZXcgb3JkZXIuXG4gIHZhciByb3cgPSBmaXJzdENoaWxkO1xuICB2YXIgbGFzdENvbnRlbnRSb3cgPSBudWxsO1xuXG4gIHdoaWxlIChyb3cgIT09IG51bGwpIHtcbiAgICB2YXIgY3VycmVudFJvdyA9IHJvdy5hbHRlcm5hdGU7IC8vIE5ldyByb3dzIGNhbid0IGJlIGNvbnRlbnQgcm93cy5cblxuICAgIGlmIChjdXJyZW50Um93ICE9PSBudWxsICYmIGZpbmRGaXJzdFN1c3BlbmRlZChjdXJyZW50Um93KSA9PT0gbnVsbCkge1xuICAgICAgbGFzdENvbnRlbnRSb3cgPSByb3c7XG4gICAgfVxuXG4gICAgcm93ID0gcm93LnNpYmxpbmc7XG4gIH1cblxuICByZXR1cm4gbGFzdENvbnRlbnRSb3c7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUmV2ZWFsT3JkZXIocmV2ZWFsT3JkZXIpIHtcbiAge1xuICAgIGlmIChyZXZlYWxPcmRlciAhPT0gdW5kZWZpbmVkICYmIHJldmVhbE9yZGVyICE9PSAnZm9yd2FyZHMnICYmIHJldmVhbE9yZGVyICE9PSAnYmFja3dhcmRzJyAmJiByZXZlYWxPcmRlciAhPT0gJ3RvZ2V0aGVyJyAmJiAhZGlkV2FybkFib3V0UmV2ZWFsT3JkZXJbcmV2ZWFsT3JkZXJdKSB7XG4gICAgICBkaWRXYXJuQWJvdXRSZXZlYWxPcmRlcltyZXZlYWxPcmRlcl0gPSB0cnVlO1xuXG4gICAgICBpZiAodHlwZW9mIHJldmVhbE9yZGVyID09PSAnc3RyaW5nJykge1xuICAgICAgICBzd2l0Y2ggKHJldmVhbE9yZGVyLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICBjYXNlICd0b2dldGhlcic6XG4gICAgICAgICAgY2FzZSAnZm9yd2FyZHMnOlxuICAgICAgICAgIGNhc2UgJ2JhY2t3YXJkcyc6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGVycm9yKCdcIiVzXCIgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yIHJldmVhbE9yZGVyIG9uIDxTdXNwZW5zZUxpc3QgLz4uICcgKyAnVXNlIGxvd2VyY2FzZSBcIiVzXCIgaW5zdGVhZC4nLCByZXZlYWxPcmRlciwgcmV2ZWFsT3JkZXIudG9Mb3dlckNhc2UoKSk7XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICBjYXNlICdmb3J3YXJkJzpcbiAgICAgICAgICBjYXNlICdiYWNrd2FyZCc6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGVycm9yKCdcIiVzXCIgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yIHJldmVhbE9yZGVyIG9uIDxTdXNwZW5zZUxpc3QgLz4uICcgKyAnUmVhY3QgdXNlcyB0aGUgLXMgc3VmZml4IGluIHRoZSBzcGVsbGluZy4gVXNlIFwiJXNzXCIgaW5zdGVhZC4nLCByZXZlYWxPcmRlciwgcmV2ZWFsT3JkZXIudG9Mb3dlckNhc2UoKSk7XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgZXJyb3IoJ1wiJXNcIiBpcyBub3QgYSBzdXBwb3J0ZWQgcmV2ZWFsT3JkZXIgb24gPFN1c3BlbnNlTGlzdCAvPi4gJyArICdEaWQgeW91IG1lYW4gXCJ0b2dldGhlclwiLCBcImZvcndhcmRzXCIgb3IgXCJiYWNrd2FyZHNcIj8nLCByZXZlYWxPcmRlcik7XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcignJXMgaXMgbm90IGEgc3VwcG9ydGVkIHZhbHVlIGZvciByZXZlYWxPcmRlciBvbiA8U3VzcGVuc2VMaXN0IC8+LiAnICsgJ0RpZCB5b3UgbWVhbiBcInRvZ2V0aGVyXCIsIFwiZm9yd2FyZHNcIiBvciBcImJhY2t3YXJkc1wiPycsIHJldmVhbE9yZGVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVUYWlsT3B0aW9ucyh0YWlsTW9kZSwgcmV2ZWFsT3JkZXIpIHtcbiAge1xuICAgIGlmICh0YWlsTW9kZSAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuQWJvdXRUYWlsT3B0aW9uc1t0YWlsTW9kZV0pIHtcbiAgICAgIGlmICh0YWlsTW9kZSAhPT0gJ2NvbGxhcHNlZCcgJiYgdGFpbE1vZGUgIT09ICdoaWRkZW4nKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dFRhaWxPcHRpb25zW3RhaWxNb2RlXSA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJ1wiJXNcIiBpcyBub3QgYSBzdXBwb3J0ZWQgdmFsdWUgZm9yIHRhaWwgb24gPFN1c3BlbnNlTGlzdCAvPi4gJyArICdEaWQgeW91IG1lYW4gXCJjb2xsYXBzZWRcIiBvciBcImhpZGRlblwiPycsIHRhaWxNb2RlKTtcbiAgICAgIH0gZWxzZSBpZiAocmV2ZWFsT3JkZXIgIT09ICdmb3J3YXJkcycgJiYgcmV2ZWFsT3JkZXIgIT09ICdiYWNrd2FyZHMnKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dFRhaWxPcHRpb25zW3RhaWxNb2RlXSA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJzxTdXNwZW5zZUxpc3QgdGFpbD1cIiVzXCIgLz4gaXMgb25seSB2YWxpZCBpZiByZXZlYWxPcmRlciBpcyAnICsgJ1wiZm9yd2FyZHNcIiBvciBcImJhY2t3YXJkc1wiLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBzcGVjaWZ5IHJldmVhbE9yZGVyPVwiZm9yd2FyZHNcIj8nLCB0YWlsTW9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3VzcGVuc2VMaXN0TmVzdGVkQ2hpbGQoY2hpbGRTbG90LCBpbmRleCkge1xuICB7XG4gICAgdmFyIGlzQW5BcnJheSA9IGlzQXJyYXkoY2hpbGRTbG90KTtcbiAgICB2YXIgaXNJdGVyYWJsZSA9ICFpc0FuQXJyYXkgJiYgdHlwZW9mIGdldEl0ZXJhdG9yRm4oY2hpbGRTbG90KSA9PT0gJ2Z1bmN0aW9uJztcblxuICAgIGlmIChpc0FuQXJyYXkgfHwgaXNJdGVyYWJsZSkge1xuICAgICAgdmFyIHR5cGUgPSBpc0FuQXJyYXkgPyAnYXJyYXknIDogJ2l0ZXJhYmxlJztcblxuICAgICAgZXJyb3IoJ0EgbmVzdGVkICVzIHdhcyBwYXNzZWQgdG8gcm93ICMlcyBpbiA8U3VzcGVuc2VMaXN0IC8+LiBXcmFwIGl0IGluICcgKyAnYW4gYWRkaXRpb25hbCBTdXNwZW5zZUxpc3QgdG8gY29uZmlndXJlIGl0cyByZXZlYWxPcmRlcjogJyArICc8U3VzcGVuc2VMaXN0IHJldmVhbE9yZGVyPS4uLj4gLi4uICcgKyAnPFN1c3BlbnNlTGlzdCByZXZlYWxPcmRlcj0uLi4+eyVzfTwvU3VzcGVuc2VMaXN0PiAuLi4gJyArICc8L1N1c3BlbnNlTGlzdD4nLCB0eXBlLCBpbmRleCwgdHlwZSk7XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTdXNwZW5zZUxpc3RDaGlsZHJlbihjaGlsZHJlbiwgcmV2ZWFsT3JkZXIpIHtcbiAge1xuICAgIGlmICgocmV2ZWFsT3JkZXIgPT09ICdmb3J3YXJkcycgfHwgcmV2ZWFsT3JkZXIgPT09ICdiYWNrd2FyZHMnKSAmJiBjaGlsZHJlbiAhPT0gdW5kZWZpbmVkICYmIGNoaWxkcmVuICE9PSBudWxsICYmIGNoaWxkcmVuICE9PSBmYWxzZSkge1xuICAgICAgaWYgKGlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoIXZhbGlkYXRlU3VzcGVuc2VMaXN0TmVzdGVkQ2hpbGQoY2hpbGRyZW5baV0sIGkpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4oY2hpbGRyZW4pO1xuXG4gICAgICAgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHZhciBjaGlsZHJlbkl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKGNoaWxkcmVuKTtcblxuICAgICAgICAgIGlmIChjaGlsZHJlbkl0ZXJhdG9yKSB7XG4gICAgICAgICAgICB2YXIgc3RlcCA9IGNoaWxkcmVuSXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgdmFyIF9pID0gMDtcblxuICAgICAgICAgICAgZm9yICg7ICFzdGVwLmRvbmU7IHN0ZXAgPSBjaGlsZHJlbkl0ZXJhdG9yLm5leHQoKSkge1xuICAgICAgICAgICAgICBpZiAoIXZhbGlkYXRlU3VzcGVuc2VMaXN0TmVzdGVkQ2hpbGQoc3RlcC52YWx1ZSwgX2kpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgX2krKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXJyb3IoJ0Egc2luZ2xlIHJvdyB3YXMgcGFzc2VkIHRvIGEgPFN1c3BlbnNlTGlzdCByZXZlYWxPcmRlcj1cIiVzXCIgLz4uICcgKyAnVGhpcyBpcyBub3QgdXNlZnVsIHNpbmNlIGl0IG5lZWRzIG11bHRpcGxlIHJvd3MuICcgKyAnRGlkIHlvdSBtZWFuIHRvIHBhc3MgbXVsdGlwbGUgY2hpbGRyZW4gb3IgYW4gYXJyYXk/JywgcmV2ZWFsT3JkZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluaXRTdXNwZW5zZUxpc3RSZW5kZXJTdGF0ZSh3b3JrSW5Qcm9ncmVzcywgaXNCYWNrd2FyZHMsIHRhaWwsIGxhc3RDb250ZW50Um93LCB0YWlsTW9kZSkge1xuICB2YXIgcmVuZGVyU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChyZW5kZXJTdGF0ZSA9PT0gbnVsbCkge1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSB7XG4gICAgICBpc0JhY2t3YXJkczogaXNCYWNrd2FyZHMsXG4gICAgICByZW5kZXJpbmc6IG51bGwsXG4gICAgICByZW5kZXJpbmdTdGFydFRpbWU6IDAsXG4gICAgICBsYXN0OiBsYXN0Q29udGVudFJvdyxcbiAgICAgIHRhaWw6IHRhaWwsXG4gICAgICB0YWlsTW9kZTogdGFpbE1vZGVcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIC8vIFdlIGNhbiByZXVzZSB0aGUgZXhpc3Rpbmcgb2JqZWN0IGZyb20gcHJldmlvdXMgcmVuZGVycy5cbiAgICByZW5kZXJTdGF0ZS5pc0JhY2t3YXJkcyA9IGlzQmFja3dhcmRzO1xuICAgIHJlbmRlclN0YXRlLnJlbmRlcmluZyA9IG51bGw7XG4gICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nU3RhcnRUaW1lID0gMDtcbiAgICByZW5kZXJTdGF0ZS5sYXN0ID0gbGFzdENvbnRlbnRSb3c7XG4gICAgcmVuZGVyU3RhdGUudGFpbCA9IHRhaWw7XG4gICAgcmVuZGVyU3RhdGUudGFpbE1vZGUgPSB0YWlsTW9kZTtcbiAgfVxufSAvLyBUaGlzIGNhbiBlbmQgdXAgcmVuZGVyaW5nIHRoaXMgY29tcG9uZW50IG11bHRpcGxlIHBhc3Nlcy5cbi8vIFRoZSBmaXJzdCBwYXNzIHNwbGl0cyB0aGUgY2hpbGRyZW4gZmliZXJzIGludG8gdHdvIHNldHMuIEEgaGVhZCBhbmQgdGFpbC5cbi8vIFdlIGZpcnN0IHJlbmRlciB0aGUgaGVhZC4gSWYgYW55dGhpbmcgaXMgaW4gZmFsbGJhY2sgc3RhdGUsIHdlIGRvIGFub3RoZXJcbi8vIHBhc3MgdGhyb3VnaCBiZWdpbldvcmsgdG8gcmVyZW5kZXIgYWxsIGNoaWxkcmVuIChpbmNsdWRpbmcgdGhlIHRhaWwpIHdpdGhcbi8vIHRoZSBmb3JjZSBzdXNwZW5kIGNvbnRleHQuIElmIHRoZSBmaXJzdCByZW5kZXIgZGlkbid0IGhhdmUgYW55dGhpbmcgaW5cbi8vIGluIGZhbGxiYWNrIHN0YXRlLiBUaGVuIHdlIHJlbmRlciBlYWNoIHJvdyBpbiB0aGUgdGFpbCBvbmUtYnktb25lLlxuLy8gVGhhdCBoYXBwZW5zIGluIHRoZSBjb21wbGV0ZVdvcmsgcGhhc2Ugd2l0aG91dCBnb2luZyBiYWNrIHRvIGJlZ2luV29yay5cblxuXG5mdW5jdGlvbiB1cGRhdGVTdXNwZW5zZUxpc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciByZXZlYWxPcmRlciA9IG5leHRQcm9wcy5yZXZlYWxPcmRlcjtcbiAgdmFyIHRhaWxNb2RlID0gbmV4dFByb3BzLnRhaWw7XG4gIHZhciBuZXdDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgdmFsaWRhdGVSZXZlYWxPcmRlcihyZXZlYWxPcmRlcik7XG4gIHZhbGlkYXRlVGFpbE9wdGlvbnModGFpbE1vZGUsIHJldmVhbE9yZGVyKTtcbiAgdmFsaWRhdGVTdXNwZW5zZUxpc3RDaGlsZHJlbihuZXdDaGlsZHJlbiwgcmV2ZWFsT3JkZXIpO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV3Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgdmFyIHN1c3BlbnNlQ29udGV4dCA9IHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudDtcbiAgdmFyIHNob3VsZEZvcmNlRmFsbGJhY2sgPSBoYXNTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0LCBGb3JjZVN1c3BlbnNlRmFsbGJhY2spO1xuXG4gIGlmIChzaG91bGRGb3JjZUZhbGxiYWNrKSB7XG4gICAgc3VzcGVuc2VDb250ZXh0ID0gc2V0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQsIEZvcmNlU3VzcGVuc2VGYWxsYmFjayk7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZGlkU3VzcGVuZEJlZm9yZSA9IGN1cnJlbnQgIT09IG51bGwgJiYgKGN1cnJlbnQuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncztcblxuICAgIGlmIChkaWRTdXNwZW5kQmVmb3JlKSB7XG4gICAgICAvLyBJZiB3ZSBwcmV2aW91c2x5IGZvcmNlZCBhIGZhbGxiYWNrLCB3ZSBuZWVkIHRvIHNjaGVkdWxlIHdvcmtcbiAgICAgIC8vIG9uIGFueSBuZXN0ZWQgYm91bmRhcmllcyB0byBsZXQgdGhlbSBrbm93IHRvIHRyeSB0byByZW5kZXJcbiAgICAgIC8vIGFnYWluLiBUaGlzIGlzIHRoZSBzYW1lIGFzIGNvbnRleHQgdXBkYXRpbmcuXG4gICAgICBwcm9wYWdhdGVTdXNwZW5zZUNvbnRleHRDaGFuZ2Uod29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLmNoaWxkLCByZW5kZXJMYW5lcyk7XG4gICAgfVxuXG4gICAgc3VzcGVuc2VDb250ZXh0ID0gc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0KTtcbiAgfVxuXG4gIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbnNlQ29udGV4dCk7XG5cbiAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICAvLyBJbiBsZWdhY3kgbW9kZSwgU3VzcGVuc2VMaXN0IGRvZXNuJ3Qgd29yayBzbyB3ZSBqdXN0XG4gICAgLy8gdXNlIG1ha2UgaXQgYSBub29wIGJ5IHRyZWF0aW5nIGl0IGFzIHRoZSBkZWZhdWx0IHJldmVhbE9yZGVyLlxuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICB9IGVsc2Uge1xuICAgIHN3aXRjaCAocmV2ZWFsT3JkZXIpIHtcbiAgICAgIGNhc2UgJ2ZvcndhcmRzJzpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXN0Q29udGVudFJvdyA9IGZpbmRMYXN0Q29udGVudFJvdyh3b3JrSW5Qcm9ncmVzcy5jaGlsZCk7XG4gICAgICAgICAgdmFyIHRhaWw7XG5cbiAgICAgICAgICBpZiAobGFzdENvbnRlbnRSb3cgPT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFRoZSB3aG9sZSBsaXN0IGlzIHBhcnQgb2YgdGhlIHRhaWwuXG4gICAgICAgICAgICAvLyBUT0RPOiBXZSBjb3VsZCBmYXN0IHBhdGggYnkganVzdCByZW5kZXJpbmcgdGhlIHRhaWwgbm93LlxuICAgICAgICAgICAgdGFpbCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBudWxsO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBEaXNjb25uZWN0IHRoZSB0YWlsIHJvd3MgYWZ0ZXIgdGhlIGNvbnRlbnQgcm93LlxuICAgICAgICAgICAgLy8gV2UncmUgZ29pbmcgdG8gcmVuZGVyIHRoZW0gc2VwYXJhdGVseSBsYXRlci5cbiAgICAgICAgICAgIHRhaWwgPSBsYXN0Q29udGVudFJvdy5zaWJsaW5nO1xuICAgICAgICAgICAgbGFzdENvbnRlbnRSb3cuc2libGluZyA9IG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaW5pdFN1c3BlbnNlTGlzdFJlbmRlclN0YXRlKHdvcmtJblByb2dyZXNzLCBmYWxzZSwgLy8gaXNCYWNrd2FyZHNcbiAgICAgICAgICB0YWlsLCBsYXN0Q29udGVudFJvdywgdGFpbE1vZGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgJ2JhY2t3YXJkcyc6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBXZSdyZSBnb2luZyB0byBmaW5kIHRoZSBmaXJzdCByb3cgdGhhdCBoYXMgZXhpc3RpbmcgY29udGVudC5cbiAgICAgICAgICAvLyBBdCB0aGUgc2FtZSB0aW1lIHdlJ3JlIGdvaW5nIHRvIHJldmVyc2UgdGhlIGxpc3Qgb2YgZXZlcnl0aGluZ1xuICAgICAgICAgIC8vIHdlIHBhc3MgaW4gdGhlIG1lYW50aW1lLiBUaGF0J3MgZ29pbmcgdG8gYmUgb3VyIHRhaWwgaW4gcmV2ZXJzZVxuICAgICAgICAgIC8vIG9yZGVyLlxuICAgICAgICAgIHZhciBfdGFpbCA9IG51bGw7XG4gICAgICAgICAgdmFyIHJvdyA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbnVsbDtcblxuICAgICAgICAgIHdoaWxlIChyb3cgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBjdXJyZW50Um93ID0gcm93LmFsdGVybmF0ZTsgLy8gTmV3IHJvd3MgY2FuJ3QgYmUgY29udGVudCByb3dzLlxuXG4gICAgICAgICAgICBpZiAoY3VycmVudFJvdyAhPT0gbnVsbCAmJiBmaW5kRmlyc3RTdXNwZW5kZWQoY3VycmVudFJvdykgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtYWluIGNvbnRlbnQuXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcm93O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIG5leHRSb3cgPSByb3cuc2libGluZztcbiAgICAgICAgICAgIHJvdy5zaWJsaW5nID0gX3RhaWw7XG4gICAgICAgICAgICBfdGFpbCA9IHJvdztcbiAgICAgICAgICAgIHJvdyA9IG5leHRSb3c7XG4gICAgICAgICAgfSAvLyBUT0RPOiBJZiB3b3JrSW5Qcm9ncmVzcy5jaGlsZCBpcyBudWxsLCB3ZSBjYW4gY29udGludWUgb24gdGhlIHRhaWwgaW1tZWRpYXRlbHkuXG5cblxuICAgICAgICAgIGluaXRTdXNwZW5zZUxpc3RSZW5kZXJTdGF0ZSh3b3JrSW5Qcm9ncmVzcywgdHJ1ZSwgLy8gaXNCYWNrd2FyZHNcbiAgICAgICAgICBfdGFpbCwgbnVsbCwgLy8gbGFzdFxuICAgICAgICAgIHRhaWxNb2RlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlICd0b2dldGhlcic6XG4gICAgICAgIHtcbiAgICAgICAgICBpbml0U3VzcGVuc2VMaXN0UmVuZGVyU3RhdGUod29ya0luUHJvZ3Jlc3MsIGZhbHNlLCAvLyBpc0JhY2t3YXJkc1xuICAgICAgICAgIG51bGwsIC8vIHRhaWxcbiAgICAgICAgICBudWxsLCAvLyBsYXN0XG4gICAgICAgICAgdW5kZWZpbmVkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB7XG4gICAgICAgICAgLy8gVGhlIGRlZmF1bHQgcmV2ZWFsIG9yZGVyIGlzIHRoZSBzYW1lIGFzIG5vdCBoYXZpbmdcbiAgICAgICAgICAvLyBhIGJvdW5kYXJ5LlxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVQb3J0YWxDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHB1c2hIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzLCB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyk7XG4gIHZhciBuZXh0Q2hpbGRyZW4gPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAvLyBQb3J0YWxzIGFyZSBzcGVjaWFsIGJlY2F1c2Ugd2UgZG9uJ3QgYXBwZW5kIHRoZSBjaGlsZHJlbiBkdXJpbmcgbW91bnRcbiAgICAvLyBidXQgYXQgY29tbWl0LiBUaGVyZWZvcmUgd2UgbmVlZCB0byB0cmFjayBpbnNlcnRpb25zIHdoaWNoIHRoZSBub3JtYWxcbiAgICAvLyBmbG93IGRvZXNuJ3QgZG8gZHVyaW5nIG1vdW50LiBUaGlzIGRvZXNuJ3QgaGFwcGVuIGF0IHRoZSByb290IGJlY2F1c2VcbiAgICAvLyB0aGUgcm9vdCBhbHdheXMgc3RhcnRzIHdpdGggYSBcImN1cnJlbnRcIiB3aXRoIGEgbnVsbCBjaGlsZC5cbiAgICAvLyBUT0RPOiBDb25zaWRlciB1bmlmeWluZyB0aGlzIHdpdGggaG93IHRoZSByb290IHdvcmtzLlxuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmVjb25jaWxlQ2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIG51bGwsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB9IGVsc2Uge1xuICAgIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxudmFyIGhhc1dhcm5lZEFib3V0VXNpbmdOb1ZhbHVlUHJvcE9uQ29udGV4dFByb3ZpZGVyID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHVwZGF0ZUNvbnRleHRQcm92aWRlcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIHByb3ZpZGVyVHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gIHZhciBjb250ZXh0ID0gcHJvdmlkZXJUeXBlLl9jb250ZXh0O1xuICB2YXIgbmV3UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBvbGRQcm9wcyA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHM7XG4gIHZhciBuZXdWYWx1ZSA9IG5ld1Byb3BzLnZhbHVlO1xuXG4gIHtcbiAgICBpZiAoISgndmFsdWUnIGluIG5ld1Byb3BzKSkge1xuICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dFVzaW5nTm9WYWx1ZVByb3BPbkNvbnRleHRQcm92aWRlcikge1xuICAgICAgICBoYXNXYXJuZWRBYm91dFVzaW5nTm9WYWx1ZVByb3BPbkNvbnRleHRQcm92aWRlciA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJ1RoZSBgdmFsdWVgIHByb3AgaXMgcmVxdWlyZWQgZm9yIHRoZSBgPENvbnRleHQuUHJvdmlkZXI+YC4gRGlkIHlvdSBtaXNzcGVsbCBpdCBvciBmb3JnZXQgdG8gcGFzcyBpdD8nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcHJvdmlkZXJQcm9wVHlwZXMgPSB3b3JrSW5Qcm9ncmVzcy50eXBlLnByb3BUeXBlcztcblxuICAgIGlmIChwcm92aWRlclByb3BUeXBlcykge1xuICAgICAgY2hlY2tQcm9wVHlwZXMocHJvdmlkZXJQcm9wVHlwZXMsIG5ld1Byb3BzLCAncHJvcCcsICdDb250ZXh0LlByb3ZpZGVyJyk7XG4gICAgfVxuICB9XG5cbiAgcHVzaFByb3ZpZGVyKHdvcmtJblByb2dyZXNzLCBjb250ZXh0LCBuZXdWYWx1ZSk7XG5cbiAge1xuICAgIGlmIChvbGRQcm9wcyAhPT0gbnVsbCkge1xuICAgICAgdmFyIG9sZFZhbHVlID0gb2xkUHJvcHMudmFsdWU7XG5cbiAgICAgIGlmIChvYmplY3RJcyhvbGRWYWx1ZSwgbmV3VmFsdWUpKSB7XG4gICAgICAgIC8vIE5vIGNoYW5nZS4gQmFpbG91dCBlYXJseSBpZiBjaGlsZHJlbiBhcmUgdGhlIHNhbWUuXG4gICAgICAgIGlmIChvbGRQcm9wcy5jaGlsZHJlbiA9PT0gbmV3UHJvcHMuY2hpbGRyZW4gJiYgIWhhc0NvbnRleHRDaGFuZ2VkKCkpIHtcbiAgICAgICAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGUgY29udGV4dCB2YWx1ZSBjaGFuZ2VkLiBTZWFyY2ggZm9yIG1hdGNoaW5nIGNvbnN1bWVycyBhbmQgc2NoZWR1bGVcbiAgICAgICAgLy8gdGhlbSB0byB1cGRhdGUuXG4gICAgICAgIHByb3BhZ2F0ZUNvbnRleHRDaGFuZ2Uod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgbmV3Q2hpbGRyZW4gPSBuZXdQcm9wcy5jaGlsZHJlbjtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5ld0NoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxudmFyIGhhc1dhcm5lZEFib3V0VXNpbmdDb250ZXh0QXNDb25zdW1lciA9IGZhbHNlO1xuXG5mdW5jdGlvbiB1cGRhdGVDb250ZXh0Q29uc3VtZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBjb250ZXh0ID0gd29ya0luUHJvZ3Jlc3MudHlwZTsgLy8gVGhlIGxvZ2ljIGJlbG93IGZvciBDb250ZXh0IGRpZmZlcnMgZGVwZW5kaW5nIG9uIFBST0Qgb3IgREVWIG1vZGUuIEluXG4gIC8vIERFViBtb2RlLCB3ZSBjcmVhdGUgYSBzZXBhcmF0ZSBvYmplY3QgZm9yIENvbnRleHQuQ29uc3VtZXIgdGhhdCBhY3RzXG4gIC8vIGxpa2UgYSBwcm94eSB0byBDb250ZXh0LiBUaGlzIHByb3h5IG9iamVjdCBhZGRzIHVubmVjZXNzYXJ5IGNvZGUgaW4gUFJPRFxuICAvLyBzbyB3ZSB1c2UgdGhlIG9sZCBiZWhhdmlvdXIgKENvbnRleHQuQ29uc3VtZXIgcmVmZXJlbmNlcyBDb250ZXh0KSB0b1xuICAvLyByZWR1Y2Ugc2l6ZSBhbmQgb3ZlcmhlYWQuIFRoZSBzZXBhcmF0ZSBvYmplY3QgcmVmZXJlbmNlcyBjb250ZXh0IHZpYVxuICAvLyBhIHByb3BlcnR5IGNhbGxlZCBcIl9jb250ZXh0XCIsIHdoaWNoIGFsc28gZ2l2ZXMgdXMgdGhlIGFiaWxpdHkgdG8gY2hlY2tcbiAgLy8gaW4gREVWIG1vZGUgaWYgdGhpcyBwcm9wZXJ0eSBleGlzdHMgb3Igbm90IGFuZCB3YXJuIGlmIGl0IGRvZXMgbm90LlxuXG4gIHtcbiAgICBpZiAoY29udGV4dC5fY29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBUaGlzIG1heSBiZSBiZWNhdXNlIGl0J3MgYSBDb250ZXh0IChyYXRoZXIgdGhhbiBhIENvbnN1bWVyKS5cbiAgICAgIC8vIE9yIGl0IG1heSBiZSBiZWNhdXNlIGl0J3Mgb2xkZXIgUmVhY3Qgd2hlcmUgdGhleSdyZSB0aGUgc2FtZSB0aGluZy5cbiAgICAgIC8vIFdlIG9ubHkgd2FudCB0byB3YXJuIGlmIHdlJ3JlIHN1cmUgaXQncyBhIG5ldyBSZWFjdC5cbiAgICAgIGlmIChjb250ZXh0ICE9PSBjb250ZXh0LkNvbnN1bWVyKSB7XG4gICAgICAgIGlmICghaGFzV2FybmVkQWJvdXRVc2luZ0NvbnRleHRBc0NvbnN1bWVyKSB7XG4gICAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ0NvbnRleHRBc0NvbnN1bWVyID0gdHJ1ZTtcblxuICAgICAgICAgIGVycm9yKCdSZW5kZXJpbmcgPENvbnRleHQ+IGRpcmVjdGx5IGlzIG5vdCBzdXBwb3J0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAnICsgJ2EgZnV0dXJlIG1ham9yIHJlbGVhc2UuIERpZCB5b3UgbWVhbiB0byByZW5kZXIgPENvbnRleHQuQ29uc3VtZXI+IGluc3RlYWQ/Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29udGV4dCA9IGNvbnRleHQuX2NvbnRleHQ7XG4gICAgfVxuICB9XG5cbiAgdmFyIG5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgcmVuZGVyID0gbmV3UHJvcHMuY2hpbGRyZW47XG5cbiAge1xuICAgIGlmICh0eXBlb2YgcmVuZGVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignQSBjb250ZXh0IGNvbnN1bWVyIHdhcyByZW5kZXJlZCB3aXRoIG11bHRpcGxlIGNoaWxkcmVuLCBvciBhIGNoaWxkICcgKyBcInRoYXQgaXNuJ3QgYSBmdW5jdGlvbi4gQSBjb250ZXh0IGNvbnN1bWVyIGV4cGVjdHMgYSBzaW5nbGUgY2hpbGQgXCIgKyAndGhhdCBpcyBhIGZ1bmN0aW9uLiBJZiB5b3UgZGlkIHBhc3MgYSBmdW5jdGlvbiwgbWFrZSBzdXJlIHRoZXJlICcgKyAnaXMgbm8gdHJhaWxpbmcgb3IgbGVhZGluZyB3aGl0ZXNwYWNlIGFyb3VuZCBpdC4nKTtcbiAgICB9XG4gIH1cblxuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICB2YXIgbmV3VmFsdWUgPSByZWFkQ29udGV4dChjb250ZXh0KTtcblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQod29ya0luUHJvZ3Jlc3MpO1xuICB9XG5cbiAgdmFyIG5ld0NoaWxkcmVuO1xuXG4gIHtcbiAgICBSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICBzZXRJc1JlbmRlcmluZyh0cnVlKTtcbiAgICBuZXdDaGlsZHJlbiA9IHJlbmRlcihuZXdWYWx1ZSk7XG4gICAgc2V0SXNSZW5kZXJpbmcoZmFsc2UpO1xuICB9XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCk7XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5ld0NoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gbWFya1dvcmtJblByb2dyZXNzUmVjZWl2ZWRVcGRhdGUoKSB7XG4gIGRpZFJlY2VpdmVVcGRhdGUgPSB0cnVlO1xufVxuXG5mdW5jdGlvbiByZXNldFN1c3BlbmRlZEN1cnJlbnRPbk1vdW50SW5MZWdhY3lNb2RlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSB7XG4gIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIC8vIEEgbGF6eSBjb21wb25lbnQgb25seSBtb3VudHMgaWYgaXQgc3VzcGVuZGVkIGluc2lkZSBhIG5vbi1cbiAgICAgIC8vIGNvbmN1cnJlbnQgdHJlZSwgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLiBXZSB3YW50IHRvIHRyZWF0IGl0IGxpa2VcbiAgICAgIC8vIGEgbmV3IG1vdW50LCBldmVuIHRob3VnaCBhbiBlbXB0eSB2ZXJzaW9uIG9mIGl0IGFscmVhZHkgY29tbWl0dGVkLlxuICAgICAgLy8gRGlzY29ubmVjdCB0aGUgYWx0ZXJuYXRlIHBvaW50ZXJzLlxuICAgICAgY3VycmVudC5hbHRlcm5hdGUgPSBudWxsO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlID0gbnVsbDsgLy8gU2luY2UgdGhpcyBpcyBjb25jZXB0dWFsbHkgYSBuZXcgZmliZXIsIHNjaGVkdWxlIGEgUGxhY2VtZW50IGVmZmVjdFxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQbGFjZW1lbnQ7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgLy8gUmV1c2UgcHJldmlvdXMgZGVwZW5kZW5jaWVzXG4gICAgd29ya0luUHJvZ3Jlc3MuZGVwZW5kZW5jaWVzID0gY3VycmVudC5kZXBlbmRlbmNpZXM7XG4gIH1cblxuICB7XG4gICAgLy8gRG9uJ3QgdXBkYXRlIFwiYmFzZVwiIHJlbmRlciB0aW1lcyBmb3IgYmFpbG91dHMuXG4gICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmcoKTtcbiAgfVxuXG4gIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXMod29ya0luUHJvZ3Jlc3MubGFuZXMpOyAvLyBDaGVjayBpZiB0aGUgY2hpbGRyZW4gaGF2ZSBhbnkgcGVuZGluZyB3b3JrLlxuXG4gIGlmICghaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcykpIHtcbiAgICAvLyBUaGUgY2hpbGRyZW4gZG9uJ3QgaGF2ZSBhbnkgd29yayBlaXRoZXIuIFdlIGNhbiBza2lwIHRoZW0uXG4gICAgLy8gVE9ETzogT25jZSB3ZSBhZGQgYmFjayByZXN1bWluZywgd2Ugc2hvdWxkIGNoZWNrIGlmIHRoZSBjaGlsZHJlbiBhcmVcbiAgICAvLyBhIHdvcmstaW4tcHJvZ3Jlc3Mgc2V0LiBJZiBzbywgd2UgbmVlZCB0byB0cmFuc2ZlciB0aGVpciBlZmZlY3RzLlxuICAgIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSAvLyBUaGlzIGZpYmVyIGRvZXNuJ3QgaGF2ZSB3b3JrLCBidXQgaXRzIHN1YnRyZWUgZG9lcy4gQ2xvbmUgdGhlIGNoaWxkXG4gIC8vIGZpYmVycyBhbmQgY29udGludWUuXG5cblxuICBjbG9uZUNoaWxkRmliZXJzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiByZW1vdW50RmliZXIoY3VycmVudCwgb2xkV29ya0luUHJvZ3Jlc3MsIG5ld1dvcmtJblByb2dyZXNzKSB7XG4gIHtcbiAgICB2YXIgcmV0dXJuRmliZXIgPSBvbGRXb3JrSW5Qcm9ncmVzcy5yZXR1cm47XG5cbiAgICBpZiAocmV0dXJuRmliZXIgPT09IG51bGwpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBzd2FwIHRoZSByb290IGZpYmVyLicpO1xuICAgIH0gLy8gRGlzY29ubmVjdCBmcm9tIHRoZSBvbGQgY3VycmVudC5cbiAgICAvLyBJdCB3aWxsIGdldCBkZWxldGVkLlxuXG5cbiAgICBjdXJyZW50LmFsdGVybmF0ZSA9IG51bGw7XG4gICAgb2xkV29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlID0gbnVsbDsgLy8gQ29ubmVjdCB0byB0aGUgbmV3IHRyZWUuXG5cbiAgICBuZXdXb3JrSW5Qcm9ncmVzcy5pbmRleCA9IG9sZFdvcmtJblByb2dyZXNzLmluZGV4O1xuICAgIG5ld1dvcmtJblByb2dyZXNzLnNpYmxpbmcgPSBvbGRXb3JrSW5Qcm9ncmVzcy5zaWJsaW5nO1xuICAgIG5ld1dvcmtJblByb2dyZXNzLnJldHVybiA9IG9sZFdvcmtJblByb2dyZXNzLnJldHVybjtcbiAgICBuZXdXb3JrSW5Qcm9ncmVzcy5yZWYgPSBvbGRXb3JrSW5Qcm9ncmVzcy5yZWY7IC8vIFJlcGxhY2UgdGhlIGNoaWxkL3NpYmxpbmcgcG9pbnRlcnMgYWJvdmUgaXQuXG5cbiAgICBpZiAob2xkV29ya0luUHJvZ3Jlc3MgPT09IHJldHVybkZpYmVyLmNoaWxkKSB7XG4gICAgICByZXR1cm5GaWJlci5jaGlsZCA9IG5ld1dvcmtJblByb2dyZXNzO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcHJldlNpYmxpbmcgPSByZXR1cm5GaWJlci5jaGlsZDtcblxuICAgICAgaWYgKHByZXZTaWJsaW5nID09PSBudWxsKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgcGFyZW50IHRvIGhhdmUgYSBjaGlsZC4nKTtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKHByZXZTaWJsaW5nLnNpYmxpbmcgIT09IG9sZFdvcmtJblByb2dyZXNzKSB7XG4gICAgICAgIHByZXZTaWJsaW5nID0gcHJldlNpYmxpbmcuc2libGluZztcblxuICAgICAgICBpZiAocHJldlNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gZmluZCB0aGUgcHJldmlvdXMgc2libGluZy4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwcmV2U2libGluZy5zaWJsaW5nID0gbmV3V29ya0luUHJvZ3Jlc3M7XG4gICAgfSAvLyBEZWxldGUgdGhlIG9sZCBmaWJlciBhbmQgcGxhY2UgdGhlIG5ldyBvbmUuXG4gICAgLy8gU2luY2UgdGhlIG9sZCBmaWJlciBpcyBkaXNjb25uZWN0ZWQsIHdlIGhhdmUgdG8gc2NoZWR1bGUgaXQgbWFudWFsbHkuXG5cblxuICAgIHZhciBkZWxldGlvbnMgPSByZXR1cm5GaWJlci5kZWxldGlvbnM7XG5cbiAgICBpZiAoZGVsZXRpb25zID09PSBudWxsKSB7XG4gICAgICByZXR1cm5GaWJlci5kZWxldGlvbnMgPSBbY3VycmVudF07XG4gICAgICByZXR1cm5GaWJlci5mbGFncyB8PSBDaGlsZERlbGV0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGlvbnMucHVzaChjdXJyZW50KTtcbiAgICB9XG5cbiAgICBuZXdXb3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQbGFjZW1lbnQ7IC8vIFJlc3RhcnQgd29yayBmcm9tIHRoZSBuZXcgZmliZXIuXG5cbiAgICByZXR1cm4gbmV3V29ya0luUHJvZ3Jlc3M7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQoY3VycmVudCwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gQmVmb3JlIHBlcmZvcm1pbmcgYW4gZWFybHkgYmFpbG91dCwgd2UgbXVzdCBjaGVjayBpZiB0aGVyZSBhcmUgcGVuZGluZ1xuICAvLyB1cGRhdGVzIG9yIGNvbnRleHQuXG4gIHZhciB1cGRhdGVMYW5lcyA9IGN1cnJlbnQubGFuZXM7XG5cbiAgaWYgKGluY2x1ZGVzU29tZUxhbmUodXBkYXRlTGFuZXMsIHJlbmRlckxhbmVzKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIE5vIHBlbmRpbmcgdXBkYXRlLCBidXQgYmVjYXVzZSBjb250ZXh0IGlzIHByb3BhZ2F0ZWQgbGF6aWx5LCB3ZSBuZWVkXG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBhdHRlbXB0RWFybHlCYWlsb3V0SWZOb1NjaGVkdWxlZFVwZGF0ZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVGhpcyBmaWJlciBkb2VzIG5vdCBoYXZlIGFueSBwZW5kaW5nIHdvcmsuIEJhaWxvdXQgd2l0aG91dCBlbnRlcmluZ1xuICAvLyB0aGUgYmVnaW4gcGhhc2UuIFRoZXJlJ3Mgc3RpbGwgc29tZSBib29ra2VlcGluZyB3ZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmVcbiAgLy8gaW4gdGhpcyBvcHRpbWl6ZWQgcGF0aCwgbW9zdGx5IHB1c2hpbmcgc3R1ZmYgb250byB0aGUgc3RhY2suXG4gIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHB1c2hIb3N0Um9vdENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgdmFyIHJvb3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgICAgIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgcHVzaEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIENvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG5cbiAgICAgICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgICAgICBwdXNoQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgcHVzaEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICB7XG4gICAgICAgIHZhciBuZXdWYWx1ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMudmFsdWU7XG4gICAgICAgIHZhciBjb250ZXh0ID0gd29ya0luUHJvZ3Jlc3MudHlwZS5fY29udGV4dDtcbiAgICAgICAgcHVzaFByb3ZpZGVyKHdvcmtJblByb2dyZXNzLCBjb250ZXh0LCBuZXdWYWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBQcm9maWxlcjpcbiAgICAgIHtcbiAgICAgICAgLy8gUHJvZmlsZXIgc2hvdWxkIG9ubHkgY2FsbCBvblJlbmRlciB3aGVuIG9uZSBvZiBpdHMgZGVzY2VuZGFudHMgYWN0dWFsbHkgcmVuZGVyZWQuXG4gICAgICAgIHZhciBoYXNDaGlsZFdvcmsgPSBpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzKTtcblxuICAgICAgICBpZiAoaGFzQ2hpbGRXb3JrKSB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAge1xuICAgICAgICAgIC8vIFJlc2V0IGVmZmVjdCBkdXJhdGlvbnMgZm9yIHRoZSBuZXh0IGV2ZW50dWFsIGVmZmVjdCBwaGFzZS5cbiAgICAgICAgICAvLyBUaGVzZSBhcmUgcmVzZXQgZHVyaW5nIHJlbmRlciB0byBhbGxvdyB0aGUgRGV2VG9vbHMgY29tbWl0IGhvb2sgYSBjaGFuY2UgdG8gcmVhZCB0aGVtLFxuICAgICAgICAgIHZhciBzdGF0ZU5vZGUgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgICAgICAgc3RhdGVOb2RlLmVmZmVjdER1cmF0aW9uID0gMDtcbiAgICAgICAgICBzdGF0ZU5vZGUucGFzc2l2ZUVmZmVjdER1cmF0aW9uID0gMDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBzdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgaWYgKHN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKHN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHNldERlZmF1bHRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudCkpOyAvLyBXZSBrbm93IHRoYXQgdGhpcyBjb21wb25lbnQgd2lsbCBzdXNwZW5kIGFnYWluIGJlY2F1c2UgaWYgaXQgaGFzXG4gICAgICAgICAgICAvLyBiZWVuIHVuc3VzcGVuZGVkIGl0IGhhcyBjb21taXR0ZWQgYXMgYSByZXNvbHZlZCBTdXNwZW5zZSBjb21wb25lbnQuXG4gICAgICAgICAgICAvLyBJZiBpdCBuZWVkcyB0byBiZSByZXRyaWVkLCBpdCBzaG91bGQgaGF2ZSB3b3JrIHNjaGVkdWxlZCBvbiBpdC5cblxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTsgLy8gV2Ugc2hvdWxkIG5ldmVyIHJlbmRlciB0aGUgY2hpbGRyZW4gb2YgYSBkZWh5ZHJhdGVkIGJvdW5kYXJ5IHVudGlsIHdlXG4gICAgICAgICAgICAvLyB1cGdyYWRlIGl0LiBXZSByZXR1cm4gbnVsbCBpbnN0ZWFkIG9mIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsuXG5cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH0gLy8gSWYgdGhpcyBib3VuZGFyeSBpcyBjdXJyZW50bHkgdGltZWQgb3V0LCB3ZSBuZWVkIHRvIGRlY2lkZVxuICAgICAgICAgIC8vIHdoZXRoZXIgdG8gcmV0cnkgdGhlIHByaW1hcnkgY2hpbGRyZW4sIG9yIHRvIHNraXAgb3ZlciBpdCBhbmRcbiAgICAgICAgICAvLyBnbyBzdHJhaWdodCB0byB0aGUgZmFsbGJhY2suIENoZWNrIHRoZSBwcmlvcml0eSBvZiB0aGUgcHJpbWFyeVxuICAgICAgICAgIC8vIGNoaWxkIGZyYWdtZW50LlxuXG5cbiAgICAgICAgICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgICB2YXIgcHJpbWFyeUNoaWxkTGFuZXMgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudC5jaGlsZExhbmVzO1xuXG4gICAgICAgICAgaWYgKGluY2x1ZGVzU29tZUxhbmUocmVuZGVyTGFuZXMsIHByaW1hcnlDaGlsZExhbmVzKSkge1xuICAgICAgICAgICAgLy8gVGhlIHByaW1hcnkgY2hpbGRyZW4gaGF2ZSBwZW5kaW5nIHdvcmsuIFVzZSB0aGUgbm9ybWFsIHBhdGhcbiAgICAgICAgICAgIC8vIHRvIGF0dGVtcHQgdG8gcmVuZGVyIHRoZSBwcmltYXJ5IGNoaWxkcmVuIGFnYWluLlxuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFRoZSBwcmltYXJ5IGNoaWxkIGZyYWdtZW50IGRvZXMgbm90IGhhdmUgcGVuZGluZyB3b3JrIG1hcmtlZFxuICAgICAgICAgICAgLy8gb24gaXRcbiAgICAgICAgICAgIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHNldERlZmF1bHRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudCkpOyAvLyBUaGUgcHJpbWFyeSBjaGlsZHJlbiBkbyBub3QgaGF2ZSBwZW5kaW5nIHdvcmsgd2l0aCBzdWZmaWNpZW50XG4gICAgICAgICAgICAvLyBwcmlvcml0eS4gQmFpbG91dC5cblxuICAgICAgICAgICAgdmFyIGNoaWxkID0gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgICAgICAgICBpZiAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gVGhlIGZhbGxiYWNrIGNoaWxkcmVuIGhhdmUgcGVuZGluZyB3b3JrLiBTa2lwIG92ZXIgdGhlXG4gICAgICAgICAgICAgIC8vIHByaW1hcnkgY2hpbGRyZW4gYW5kIHdvcmsgb24gdGhlIGZhbGxiYWNrLlxuICAgICAgICAgICAgICByZXR1cm4gY2hpbGQuc2libGluZztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIE5vdGU6IFdlIGNhbiByZXR1cm4gYG51bGxgIGhlcmUgYmVjYXVzZSB3ZSBhbHJlYWR5IGNoZWNrZWRcbiAgICAgICAgICAgICAgLy8gd2hldGhlciB0aGVyZSB3ZXJlIG5lc3RlZCBjb250ZXh0IGNvbnN1bWVycywgdmlhIHRoZSBjYWxsIHRvXG4gICAgICAgICAgICAgIC8vIGBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrYCBhYm92ZS5cbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHNldERlZmF1bHRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGRpZFN1c3BlbmRCZWZvcmUgPSAoY3VycmVudC5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzO1xuXG4gICAgICAgIHZhciBfaGFzQ2hpbGRXb3JrID0gaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyk7XG5cbiAgICAgICAgaWYgKGRpZFN1c3BlbmRCZWZvcmUpIHtcbiAgICAgICAgICBpZiAoX2hhc0NoaWxkV29yaykge1xuICAgICAgICAgICAgLy8gSWYgc29tZXRoaW5nIHdhcyBpbiBmYWxsYmFjayBzdGF0ZSBsYXN0IHRpbWUsIGFuZCB3ZSBoYXZlIGFsbCB0aGVcbiAgICAgICAgICAgIC8vIHNhbWUgY2hpbGRyZW4gdGhlbiB3ZSdyZSBzdGlsbCBpbiBwcm9ncmVzc2l2ZSBsb2FkaW5nIHN0YXRlLlxuICAgICAgICAgICAgLy8gU29tZXRoaW5nIG1pZ2h0IGdldCB1bmJsb2NrZWQgYnkgc3RhdGUgdXBkYXRlcyBvciByZXRyaWVzIGluIHRoZVxuICAgICAgICAgICAgLy8gdHJlZSB3aGljaCB3aWxsIGFmZmVjdCB0aGUgdGFpbC4gU28gd2UgbmVlZCB0byB1c2UgdGhlIG5vcm1hbFxuICAgICAgICAgICAgLy8gcGF0aCB0byBjb21wdXRlIHRoZSBjb3JyZWN0IHRhaWwuXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlU3VzcGVuc2VMaXN0Q29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgICAgfSAvLyBJZiBub25lIG9mIHRoZSBjaGlsZHJlbiBoYWQgYW55IHdvcmssIHRoYXQgbWVhbnMgdGhhdCBub25lIG9mXG4gICAgICAgICAgLy8gdGhlbSBnb3QgcmV0cmllZCBzbyB0aGV5J2xsIHN0aWxsIGJlIGJsb2NrZWQgaW4gdGhlIHNhbWUgd2F5XG4gICAgICAgICAgLy8gYXMgYmVmb3JlLiBXZSBjYW4gZmFzdCBiYWlsIG91dC5cblxuXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgfSAvLyBJZiBub3RoaW5nIHN1c3BlbmRlZCBiZWZvcmUgYW5kIHdlJ3JlIHJlbmRlcmluZyB0aGUgc2FtZSBjaGlsZHJlbixcbiAgICAgICAgLy8gdGhlbiB0aGUgdGFpbCBkb2Vzbid0IG1hdHRlci4gQW55dGhpbmcgbmV3IHRoYXQgc3VzcGVuZHMgd2lsbCB3b3JrXG4gICAgICAgIC8vIGluIHRoZSBcInRvZ2V0aGVyXCIgbW9kZSwgc28gd2UgY2FuIGNvbnRpbnVlIGZyb20gdGhlIHN0YXRlIHdlIGhhZC5cblxuXG4gICAgICAgIHZhciByZW5kZXJTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgaWYgKHJlbmRlclN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gUmVzZXQgdG8gdGhlIFwidG9nZXRoZXJcIiBtb2RlIGluIGNhc2Ugd2UndmUgc3RhcnRlZCBhIGRpZmZlcmVudFxuICAgICAgICAgIC8vIHVwZGF0ZSBpbiB0aGUgcGFzdCBidXQgZGlkbid0IGNvbXBsZXRlIGl0LlxuICAgICAgICAgIHJlbmRlclN0YXRlLnJlbmRlcmluZyA9IG51bGw7XG4gICAgICAgICAgcmVuZGVyU3RhdGUudGFpbCA9IG51bGw7XG4gICAgICAgICAgcmVuZGVyU3RhdGUubGFzdEVmZmVjdCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQpO1xuXG4gICAgICAgIGlmIChfaGFzQ2hpbGRXb3JrKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gSWYgbm9uZSBvZiB0aGUgY2hpbGRyZW4gaGFkIGFueSB3b3JrLCB0aGF0IG1lYW5zIHRoYXQgbm9uZSBvZlxuICAgICAgICAgIC8vIHRoZW0gZ290IHJldHJpZWQgc28gdGhleSdsbCBzdGlsbCBiZSBibG9ja2VkIGluIHRoZSBzYW1lIHdheVxuICAgICAgICAgIC8vIGFzIGJlZm9yZS4gV2UgY2FuIGZhc3QgYmFpbCBvdXQuXG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgIGNhc2UgTGVnYWN5SGlkZGVuQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICAvLyBOZWVkIHRvIGNoZWNrIGlmIHRoZSB0cmVlIHN0aWxsIG5lZWRzIHRvIGJlIGRlZmVycmVkLiBUaGlzIGlzXG4gICAgICAgIC8vIGFsbW9zdCBpZGVudGljYWwgdG8gdGhlIGxvZ2ljIHVzZWQgaW4gdGhlIG5vcm1hbCB1cGRhdGUgcGF0aCxcbiAgICAgICAgLy8gc28gd2UnbGwganVzdCBlbnRlciB0aGF0LiBUaGUgb25seSBkaWZmZXJlbmNlIGlzIHdlJ2xsIGJhaWwgb3V0XG4gICAgICAgIC8vIGF0IHRoZSBuZXh0IGxldmVsIGluc3RlYWQgb2YgdGhpcyBvbmUsIGJlY2F1c2UgdGhlIGNoaWxkIHByb3BzXG4gICAgICAgIC8vIGhhdmUgbm90IGNoYW5nZWQuIFdoaWNoIGlzIGZpbmUuXG4gICAgICAgIC8vIFRPRE86IFByb2JhYmx5IHNob3VsZCByZWZhY3RvciBgYmVnaW5Xb3JrYCB0byBzcGxpdCB0aGUgYmFpbG91dFxuICAgICAgICAvLyBwYXRoIGZyb20gdGhlIG5vcm1hbCBwYXRoLiBJJ20gdGVtcHRlZCB0byBkbyBhIGxhYmVsZWQgYnJlYWsgaGVyZVxuICAgICAgICAvLyBidXQgSSB3b24ndCA6KVxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IE5vTGFuZXM7XG4gICAgICAgIHJldHVybiB1cGRhdGVPZmZzY3JlZW5Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cbiAgfVxuXG4gIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG59XG5cbmZ1bmN0aW9uIGJlZ2luV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAge1xuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5fZGVidWdOZWVkc1JlbW91bnQgJiYgY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyB3aWxsIHJlc3RhcnQgdGhlIGJlZ2luIHBoYXNlIHdpdGggYSBuZXcgZmliZXIuXG4gICAgICByZXR1cm4gcmVtb3VudEZpYmVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBjcmVhdGVGaWJlckZyb21UeXBlQW5kUHJvcHMod29ya0luUHJvZ3Jlc3MudHlwZSwgd29ya0luUHJvZ3Jlc3Mua2V5LCB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMsIHdvcmtJblByb2dyZXNzLl9kZWJ1Z093bmVyIHx8IG51bGwsIHdvcmtJblByb2dyZXNzLm1vZGUsIHdvcmtJblByb2dyZXNzLmxhbmVzKSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICB2YXIgb2xkUHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gICAgdmFyIG5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuXG4gICAgaWYgKG9sZFByb3BzICE9PSBuZXdQcm9wcyB8fCBoYXNDb250ZXh0Q2hhbmdlZCgpIHx8ICggLy8gRm9yY2UgYSByZS1yZW5kZXIgaWYgdGhlIGltcGxlbWVudGF0aW9uIGNoYW5nZWQgZHVlIHRvIGhvdCByZWxvYWQ6XG4gICAgIHdvcmtJblByb2dyZXNzLnR5cGUgIT09IGN1cnJlbnQudHlwZSApKSB7XG4gICAgICAvLyBJZiBwcm9wcyBvciBjb250ZXh0IGNoYW5nZWQsIG1hcmsgdGhlIGZpYmVyIGFzIGhhdmluZyBwZXJmb3JtZWQgd29yay5cbiAgICAgIC8vIFRoaXMgbWF5IGJlIHVuc2V0IGlmIHRoZSBwcm9wcyBhcmUgZGV0ZXJtaW5lZCB0byBiZSBlcXVhbCBsYXRlciAobWVtbykuXG4gICAgICBkaWRSZWNlaXZlVXBkYXRlID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTmVpdGhlciBwcm9wcyBub3IgbGVnYWN5IGNvbnRleHQgY2hhbmdlcy4gQ2hlY2sgaWYgdGhlcmUncyBhIHBlbmRpbmdcbiAgICAgIC8vIHVwZGF0ZSBvciBjb250ZXh0IGNoYW5nZS5cbiAgICAgIHZhciBoYXNTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQgPSBjaGVja1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dChjdXJyZW50LCByZW5kZXJMYW5lcyk7XG5cbiAgICAgIGlmICghaGFzU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0ICYmIC8vIElmIHRoaXMgaXMgdGhlIHNlY29uZCBwYXNzIG9mIGFuIGVycm9yIG9yIHN1c3BlbnNlIGJvdW5kYXJ5LCB0aGVyZVxuICAgICAgLy8gbWF5IG5vdCBiZSB3b3JrIHNjaGVkdWxlZCBvbiBgY3VycmVudGAsIHNvIHdlIGNoZWNrIGZvciB0aGlzIGZsYWcuXG4gICAgICAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gTm9GbGFncykge1xuICAgICAgICAvLyBObyBwZW5kaW5nIHVwZGF0ZXMgb3IgY29udGV4dC4gQmFpbCBvdXQgbm93LlxuICAgICAgICBkaWRSZWNlaXZlVXBkYXRlID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBhdHRlbXB0RWFybHlCYWlsb3V0SWZOb1NjaGVkdWxlZFVwZGF0ZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoKGN1cnJlbnQuZmxhZ3MgJiBGb3JjZVVwZGF0ZUZvckxlZ2FjeVN1c3BlbnNlKSAhPT0gTm9GbGFncykge1xuICAgICAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIHRoYXQgb25seSBleGlzdHMgZm9yIGxlZ2FjeSBtb2RlLlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTkyMTYuXG4gICAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQW4gdXBkYXRlIHdhcyBzY2hlZHVsZWQgb24gdGhpcyBmaWJlciwgYnV0IHRoZXJlIGFyZSBubyBuZXcgcHJvcHNcbiAgICAgICAgLy8gbm9yIGxlZ2FjeSBjb250ZXh0LiBTZXQgdGhpcyB0byBmYWxzZS4gSWYgYW4gdXBkYXRlIHF1ZXVlIG9yIGNvbnRleHRcbiAgICAgICAgLy8gY29uc3VtZXIgcHJvZHVjZXMgYSBjaGFuZ2VkIHZhbHVlLCBpdCB3aWxsIHNldCB0aGlzIHRvIHRydWUuIE90aGVyd2lzZSxcbiAgICAgICAgLy8gdGhlIGNvbXBvbmVudCB3aWxsIGFzc3VtZSB0aGUgY2hpbGRyZW4gaGF2ZSBub3QgY2hhbmdlZCBhbmQgYmFpbCBvdXQuXG4gICAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IGZhbHNlO1xuXG4gICAgaWYgKGdldElzSHlkcmF0aW5nKCkgJiYgaXNGb3JrZWRDaGlsZCh3b3JrSW5Qcm9ncmVzcykpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgY2hpbGQgYmVsb25ncyB0byBhIGxpc3Qgb2YgbXVsaXBsZSBjaGlsZHJlbiBpblxuICAgICAgLy8gaXRzIHBhcmVudC5cbiAgICAgIC8vXG4gICAgICAvLyBJbiBhIHRydWUgbXVsdGktdGhyZWFkZWQgaW1wbGVtZW50YXRpb24sIHdlIHdvdWxkIHJlbmRlciBjaGlsZHJlbiBvblxuICAgICAgLy8gcGFyYWxsZWwgdGhyZWFkcy4gVGhpcyB3b3VsZCByZXByZXNlbnQgdGhlIGJlZ2lubmluZyBvZiBhIG5ldyByZW5kZXJcbiAgICAgIC8vIHRocmVhZCBmb3IgdGhpcyBzdWJ0cmVlLlxuICAgICAgLy9cbiAgICAgIC8vIFdlIG9ubHkgdXNlIHRoaXMgZm9yIGlkIGdlbmVyYXRpb24gZHVyaW5nIGh5ZHJhdGlvbiwgd2hpY2ggaXMgd2h5IHRoZVxuICAgICAgLy8gbG9naWMgaXMgbG9jYXRlZCBpbiB0aGlzIHNwZWNpYWwgYnJhbmNoLlxuICAgICAgdmFyIHNsb3RJbmRleCA9IHdvcmtJblByb2dyZXNzLmluZGV4O1xuICAgICAgdmFyIG51bWJlck9mRm9ya3MgPSBnZXRGb3Jrc0F0TGV2ZWwoKTtcbiAgICAgIHB1c2hUcmVlSWQod29ya0luUHJvZ3Jlc3MsIG51bWJlck9mRm9ya3MsIHNsb3RJbmRleCk7XG4gICAgfVxuICB9IC8vIEJlZm9yZSBlbnRlcmluZyB0aGUgYmVnaW4gcGhhc2UsIGNsZWFyIHBlbmRpbmcgdXBkYXRlIHByaW9yaXR5LlxuICAvLyBUT0RPOiBUaGlzIGFzc3VtZXMgdGhhdCB3ZSdyZSBhYm91dCB0byBldmFsdWF0ZSB0aGUgY29tcG9uZW50IGFuZCBwcm9jZXNzXG4gIC8vIHRoZSB1cGRhdGUgcXVldWUuIEhvd2V2ZXIsIHRoZXJlJ3MgYW4gZXhjZXB0aW9uOiBTaW1wbGVNZW1vQ29tcG9uZW50XG4gIC8vIHNvbWV0aW1lcyBiYWlscyBvdXQgbGF0ZXIgaW4gdGhlIGJlZ2luIHBoYXNlLiBUaGlzIGluZGljYXRlcyB0aGF0IHdlIHNob3VsZFxuICAvLyBtb3ZlIHRoaXMgYXNzaWdubWVudCBvdXQgb2YgdGhlIGNvbW1vbiBwYXRoIGFuZCBpbnRvIGVhY2ggYnJhbmNoLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBOb0xhbmVzO1xuXG4gIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgY2FzZSBJbmRldGVybWluYXRlQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZXR1cm4gbW91bnRJbmRldGVybWluYXRlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCB3b3JrSW5Qcm9ncmVzcy50eXBlLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIExhenlDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBlbGVtZW50VHlwZSA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlO1xuICAgICAgICByZXR1cm4gbW91bnRMYXp5Q29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBlbGVtZW50VHlwZSwgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIENvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciB1bnJlc29sdmVkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gICAgICAgIHZhciByZXNvbHZlZFByb3BzID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPT09IENvbXBvbmVudCA/IHVucmVzb2x2ZWRQcm9wcyA6IHJlc29sdmVEZWZhdWx0UHJvcHMoQ29tcG9uZW50LCB1bnJlc29sdmVkUHJvcHMpO1xuICAgICAgICByZXR1cm4gdXBkYXRlRnVuY3Rpb25Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcmVzb2x2ZWRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9Db21wb25lbnQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICB2YXIgX3VucmVzb2x2ZWRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcblxuICAgICAgICB2YXIgX3Jlc29sdmVkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9PT0gX0NvbXBvbmVudCA/IF91bnJlc29sdmVkUHJvcHMgOiByZXNvbHZlRGVmYXVsdFByb3BzKF9Db21wb25lbnQsIF91bnJlc29sdmVkUHJvcHMpO1xuXG4gICAgICAgIHJldHVybiB1cGRhdGVDbGFzc0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgX0NvbXBvbmVudCwgX3Jlc29sdmVkUHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICByZXR1cm4gdXBkYXRlSG9zdFJvb3QoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHJldHVybiB1cGRhdGVIb3N0Q29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgcmV0dXJuIHVwZGF0ZUhvc3RUZXh0KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICByZXR1cm4gdXBkYXRlU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHJldHVybiB1cGRhdGVQb3J0YWxDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIHtcbiAgICAgICAgdmFyIHR5cGUgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICB2YXIgX3VucmVzb2x2ZWRQcm9wczIgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG5cbiAgICAgICAgdmFyIF9yZXNvbHZlZFByb3BzMiA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID09PSB0eXBlID8gX3VucmVzb2x2ZWRQcm9wczIgOiByZXNvbHZlRGVmYXVsdFByb3BzKHR5cGUsIF91bnJlc29sdmVkUHJvcHMyKTtcblxuICAgICAgICByZXR1cm4gdXBkYXRlRm9yd2FyZFJlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgdHlwZSwgX3Jlc29sdmVkUHJvcHMyLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIEZyYWdtZW50OlxuICAgICAgcmV0dXJuIHVwZGF0ZUZyYWdtZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIE1vZGU6XG4gICAgICByZXR1cm4gdXBkYXRlTW9kZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBQcm9maWxlcjpcbiAgICAgIHJldHVybiB1cGRhdGVQcm9maWxlcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICByZXR1cm4gdXBkYXRlQ29udGV4dFByb3ZpZGVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIENvbnRleHRDb25zdW1lcjpcbiAgICAgIHJldHVybiB1cGRhdGVDb250ZXh0Q29uc3VtZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIF90eXBlMiA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzMyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wczsgLy8gUmVzb2x2ZSBvdXRlciBwcm9wcyBmaXJzdCwgdGhlbiByZXNvbHZlIGlubmVyIHByb3BzLlxuXG4gICAgICAgIHZhciBfcmVzb2x2ZWRQcm9wczMgPSByZXNvbHZlRGVmYXVsdFByb3BzKF90eXBlMiwgX3VucmVzb2x2ZWRQcm9wczMpO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgICAgICAgIHZhciBvdXRlclByb3BUeXBlcyA9IF90eXBlMi5wcm9wVHlwZXM7XG5cbiAgICAgICAgICAgIGlmIChvdXRlclByb3BUeXBlcykge1xuICAgICAgICAgICAgICBjaGVja1Byb3BUeXBlcyhvdXRlclByb3BUeXBlcywgX3Jlc29sdmVkUHJvcHMzLCAvLyBSZXNvbHZlZCBmb3Igb3V0ZXIgb25seVxuICAgICAgICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShfdHlwZTIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBfcmVzb2x2ZWRQcm9wczMgPSByZXNvbHZlRGVmYXVsdFByb3BzKF90eXBlMi50eXBlLCBfcmVzb2x2ZWRQcm9wczMpO1xuICAgICAgICByZXR1cm4gdXBkYXRlTWVtb0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgX3R5cGUyLCBfcmVzb2x2ZWRQcm9wczMsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVNpbXBsZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLnR5cGUsIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBfQ29tcG9uZW50MiA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzNCA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcblxuICAgICAgICB2YXIgX3Jlc29sdmVkUHJvcHM0ID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPT09IF9Db21wb25lbnQyID8gX3VucmVzb2x2ZWRQcm9wczQgOiByZXNvbHZlRGVmYXVsdFByb3BzKF9Db21wb25lbnQyLCBfdW5yZXNvbHZlZFByb3BzNCk7XG5cbiAgICAgICAgcmV0dXJuIG1vdW50SW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfQ29tcG9uZW50MiwgX3Jlc29sdmVkUHJvcHM0LCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVN1c3BlbnNlTGlzdENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBTY29wZUNvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZXR1cm4gdXBkYXRlT2Zmc2NyZWVuQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHVuaXQgb2Ygd29yayB0YWcgKFwiICsgd29ya0luUHJvZ3Jlc3MudGFnICsgXCIpLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gXCIgKyAnUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xufVxuXG5mdW5jdGlvbiBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKSB7XG4gIC8vIFRhZyB0aGUgZmliZXIgd2l0aCBhbiB1cGRhdGUgZWZmZWN0LiBUaGlzIHR1cm5zIGEgUGxhY2VtZW50IGludG9cbiAgLy8gYSBQbGFjZW1lbnRBbmRVcGRhdGUuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbn1cblxuZnVuY3Rpb24gbWFya1JlZiQxKHdvcmtJblByb2dyZXNzKSB7XG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFJlZjtcblxuICB7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUmVmU3RhdGljO1xuICB9XG59XG5cbnZhciBhcHBlbmRBbGxDaGlsZHJlbjtcbnZhciB1cGRhdGVIb3N0Q29udGFpbmVyO1xudmFyIHVwZGF0ZUhvc3RDb21wb25lbnQkMTtcbnZhciB1cGRhdGVIb3N0VGV4dCQxO1xuXG57XG4gIC8vIE11dGF0aW9uIG1vZGVcbiAgYXBwZW5kQWxsQ2hpbGRyZW4gPSBmdW5jdGlvbiAocGFyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmVlZHNWaXNpYmlsaXR5VG9nZ2xlLCBpc0hpZGRlbikge1xuICAgIC8vIFdlIG9ubHkgaGF2ZSB0aGUgdG9wIEZpYmVyIHRoYXQgd2FzIGNyZWF0ZWQgYnV0IHdlIG5lZWQgcmVjdXJzZSBkb3duIGl0c1xuICAgIC8vIGNoaWxkcmVuIHRvIGZpbmQgYWxsIHRoZSB0ZXJtaW5hbCBub2Rlcy5cbiAgICB2YXIgbm9kZSA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuXG4gICAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBub2RlLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAgICAgYXBwZW5kSW5pdGlhbENoaWxkKHBhcmVudCwgbm9kZS5zdGF0ZU5vZGUpO1xuICAgICAgfSBlbHNlIGlmIChub2RlLnRhZyA9PT0gSG9zdFBvcnRhbCkgOyBlbHNlIGlmIChub2RlLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZSA9PT0gd29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gd29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gICAgfVxuICB9O1xuXG4gIHVwZGF0ZUhvc3RDb250YWluZXIgPSBmdW5jdGlvbiAoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHsvLyBOb29wXG4gIH07XG5cbiAgdXBkYXRlSG9zdENvbXBvbmVudCQxID0gZnVuY3Rpb24gKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCB0eXBlLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlKSB7XG4gICAgLy8gSWYgd2UgaGF2ZSBhbiBhbHRlcm5hdGUsIHRoYXQgbWVhbnMgdGhpcyBpcyBhbiB1cGRhdGUgYW5kIHdlIG5lZWQgdG9cbiAgICAvLyBzY2hlZHVsZSBhIHNpZGUtZWZmZWN0IHRvIGRvIHRoZSB1cGRhdGVzLlxuICAgIHZhciBvbGRQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcblxuICAgIGlmIChvbGRQcm9wcyA9PT0gbmV3UHJvcHMpIHtcbiAgICAgIC8vIEluIG11dGF0aW9uIG1vZGUsIHRoaXMgaXMgc3VmZmljaWVudCBmb3IgYSBiYWlsb3V0IGJlY2F1c2VcbiAgICAgIC8vIHdlIHdvbid0IHRvdWNoIHRoaXMgbm9kZSBldmVuIGlmIGNoaWxkcmVuIGNoYW5nZWQuXG4gICAgICByZXR1cm47XG4gICAgfSAvLyBJZiB3ZSBnZXQgdXBkYXRlZCBiZWNhdXNlIG9uZSBvZiBvdXIgY2hpbGRyZW4gdXBkYXRlZCwgd2UgZG9uJ3RcbiAgICAvLyBoYXZlIG5ld1Byb3BzIHNvIHdlJ2xsIGhhdmUgdG8gcmV1c2UgdGhlbS5cbiAgICAvLyBUT0RPOiBTcGxpdCB0aGUgdXBkYXRlIEFQSSBhcyBzZXBhcmF0ZSBmb3IgdGhlIHByb3BzIHZzLiBjaGlsZHJlbi5cbiAgICAvLyBFdmVuIGJldHRlciB3b3VsZCBiZSBpZiBjaGlsZHJlbiB3ZXJlbid0IHNwZWNpYWwgY2FzZWQgYXQgYWxsIHRoby5cblxuXG4gICAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgIHZhciBjdXJyZW50SG9zdENvbnRleHQgPSBnZXRIb3N0Q29udGV4dCgpOyAvLyBUT0RPOiBFeHBlcmllbmNpbmcgYW4gZXJyb3Igd2hlcmUgb2xkUHJvcHMgaXMgbnVsbC4gU3VnZ2VzdHMgYSBob3N0XG4gICAgLy8gY29tcG9uZW50IGlzIGhpdHRpbmcgdGhlIHJlc3VtZSBwYXRoLiBGaWd1cmUgb3V0IHdoeS4gUG9zc2libHlcbiAgICAvLyByZWxhdGVkIHRvIGBoaWRkZW5gLlxuXG4gICAgdmFyIHVwZGF0ZVBheWxvYWQgPSBwcmVwYXJlVXBkYXRlKGluc3RhbmNlLCB0eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgY3VycmVudEhvc3RDb250ZXh0KTsgLy8gVE9ETzogVHlwZSB0aGlzIHNwZWNpZmljIHRvIHRoaXMgdHlwZSBvZiBjb21wb25lbnQuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IHVwZGF0ZVBheWxvYWQ7IC8vIElmIHRoZSB1cGRhdGUgcGF5bG9hZCBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBpcyBhIGNoYW5nZSBvciBpZiB0aGVyZVxuICAgIC8vIGlzIGEgbmV3IHJlZiB3ZSBtYXJrIHRoaXMgYXMgYW4gdXBkYXRlLiBBbGwgdGhlIHdvcmsgaXMgZG9uZSBpbiBjb21taXRXb3JrLlxuXG4gICAgaWYgKHVwZGF0ZVBheWxvYWQpIHtcbiAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgIH1cbiAgfTtcblxuICB1cGRhdGVIb3N0VGV4dCQxID0gZnVuY3Rpb24gKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBvbGRUZXh0LCBuZXdUZXh0KSB7XG4gICAgLy8gSWYgdGhlIHRleHQgZGlmZmVycywgbWFyayBpdCBhcyBhbiB1cGRhdGUuIEFsbCB0aGUgd29yayBpbiBkb25lIGluIGNvbW1pdFdvcmsuXG4gICAgaWYgKG9sZFRleHQgIT09IG5ld1RleHQpIHtcbiAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gY3V0T2ZmVGFpbElmTmVlZGVkKHJlbmRlclN0YXRlLCBoYXNSZW5kZXJlZEFUYWlsRmFsbGJhY2spIHtcbiAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAvLyBJZiB3ZSdyZSBoeWRyYXRpbmcsIHdlIHNob3VsZCBjb25zdW1lIGFzIG1hbnkgaXRlbXMgYXMgd2UgY2FuXG4gICAgLy8gc28gd2UgZG9uJ3QgbGVhdmUgYW55IGJlaGluZC5cbiAgICByZXR1cm47XG4gIH1cblxuICBzd2l0Y2ggKHJlbmRlclN0YXRlLnRhaWxNb2RlKSB7XG4gICAgY2FzZSAnaGlkZGVuJzpcbiAgICAgIHtcbiAgICAgICAgLy8gQW55IGluc2VydGlvbnMgYXQgdGhlIGVuZCBvZiB0aGUgdGFpbCBsaXN0IGFmdGVyIHRoaXMgcG9pbnRcbiAgICAgICAgLy8gc2hvdWxkIGJlIGludmlzaWJsZS4gSWYgdGhlcmUgYXJlIGFscmVhZHkgbW91bnRlZCBib3VuZGFyaWVzXG4gICAgICAgIC8vIGFueXRoaW5nIGJlZm9yZSB0aGVtIGFyZSBub3QgY29uc2lkZXJlZCBmb3IgY29sbGFwc2luZy5cbiAgICAgICAgLy8gVGhlcmVmb3JlIHdlIG5lZWQgdG8gZ28gdGhyb3VnaCB0aGUgd2hvbGUgdGFpbCB0byBmaW5kIGlmXG4gICAgICAgIC8vIHRoZXJlIGFyZSBhbnkuXG4gICAgICAgIHZhciB0YWlsTm9kZSA9IHJlbmRlclN0YXRlLnRhaWw7XG4gICAgICAgIHZhciBsYXN0VGFpbE5vZGUgPSBudWxsO1xuXG4gICAgICAgIHdoaWxlICh0YWlsTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGlmICh0YWlsTm9kZS5hbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGxhc3RUYWlsTm9kZSA9IHRhaWxOb2RlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRhaWxOb2RlID0gdGFpbE5vZGUuc2libGluZztcbiAgICAgICAgfSAvLyBOZXh0IHdlJ3JlIHNpbXBseSBnb2luZyB0byBkZWxldGUgYWxsIGluc2VydGlvbnMgYWZ0ZXIgdGhlXG4gICAgICAgIC8vIGxhc3QgcmVuZGVyZWQgaXRlbS5cblxuXG4gICAgICAgIGlmIChsYXN0VGFpbE5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBBbGwgcmVtYWluaW5nIGl0ZW1zIGluIHRoZSB0YWlsIGFyZSBpbnNlcnRpb25zLlxuICAgICAgICAgIHJlbmRlclN0YXRlLnRhaWwgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIERldGFjaCB0aGUgaW5zZXJ0aW9uIGFmdGVyIHRoZSBsYXN0IG5vZGUgdGhhdCB3YXMgYWxyZWFkeVxuICAgICAgICAgIC8vIGluc2VydGVkLlxuICAgICAgICAgIGxhc3RUYWlsTm9kZS5zaWJsaW5nID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSAnY29sbGFwc2VkJzpcbiAgICAgIHtcbiAgICAgICAgLy8gQW55IGluc2VydGlvbnMgYXQgdGhlIGVuZCBvZiB0aGUgdGFpbCBsaXN0IGFmdGVyIHRoaXMgcG9pbnRcbiAgICAgICAgLy8gc2hvdWxkIGJlIGludmlzaWJsZS4gSWYgdGhlcmUgYXJlIGFscmVhZHkgbW91bnRlZCBib3VuZGFyaWVzXG4gICAgICAgIC8vIGFueXRoaW5nIGJlZm9yZSB0aGVtIGFyZSBub3QgY29uc2lkZXJlZCBmb3IgY29sbGFwc2luZy5cbiAgICAgICAgLy8gVGhlcmVmb3JlIHdlIG5lZWQgdG8gZ28gdGhyb3VnaCB0aGUgd2hvbGUgdGFpbCB0byBmaW5kIGlmXG4gICAgICAgIC8vIHRoZXJlIGFyZSBhbnkuXG4gICAgICAgIHZhciBfdGFpbE5vZGUgPSByZW5kZXJTdGF0ZS50YWlsO1xuICAgICAgICB2YXIgX2xhc3RUYWlsTm9kZSA9IG51bGw7XG5cbiAgICAgICAgd2hpbGUgKF90YWlsTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGlmIChfdGFpbE5vZGUuYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBfbGFzdFRhaWxOb2RlID0gX3RhaWxOb2RlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF90YWlsTm9kZSA9IF90YWlsTm9kZS5zaWJsaW5nO1xuICAgICAgICB9IC8vIE5leHQgd2UncmUgc2ltcGx5IGdvaW5nIHRvIGRlbGV0ZSBhbGwgaW5zZXJ0aW9ucyBhZnRlciB0aGVcbiAgICAgICAgLy8gbGFzdCByZW5kZXJlZCBpdGVtLlxuXG5cbiAgICAgICAgaWYgKF9sYXN0VGFpbE5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBBbGwgcmVtYWluaW5nIGl0ZW1zIGluIHRoZSB0YWlsIGFyZSBpbnNlcnRpb25zLlxuICAgICAgICAgIGlmICghaGFzUmVuZGVyZWRBVGFpbEZhbGxiYWNrICYmIHJlbmRlclN0YXRlLnRhaWwgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFdlIHN1c3BlbmRlZCBkdXJpbmcgdGhlIGhlYWQuIFdlIHdhbnQgdG8gc2hvdyBhdCBsZWFzdCBvbmVcbiAgICAgICAgICAgIC8vIHJvdyBhdCB0aGUgdGFpbC4gU28gd2UnbGwga2VlcCBvbiBhbmQgY3V0IG9mZiB0aGUgcmVzdC5cbiAgICAgICAgICAgIHJlbmRlclN0YXRlLnRhaWwuc2libGluZyA9IG51bGw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlbmRlclN0YXRlLnRhaWwgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBEZXRhY2ggdGhlIGluc2VydGlvbiBhZnRlciB0aGUgbGFzdCBub2RlIHRoYXQgd2FzIGFscmVhZHlcbiAgICAgICAgICAvLyBpbnNlcnRlZC5cbiAgICAgICAgICBfbGFzdFRhaWxOb2RlLnNpYmxpbmcgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYnViYmxlUHJvcGVydGllcyhjb21wbGV0ZWRXb3JrKSB7XG4gIHZhciBkaWRCYWlsb3V0ID0gY29tcGxldGVkV29yay5hbHRlcm5hdGUgIT09IG51bGwgJiYgY29tcGxldGVkV29yay5hbHRlcm5hdGUuY2hpbGQgPT09IGNvbXBsZXRlZFdvcmsuY2hpbGQ7XG4gIHZhciBuZXdDaGlsZExhbmVzID0gTm9MYW5lcztcbiAgdmFyIHN1YnRyZWVGbGFncyA9IE5vRmxhZ3M7XG5cbiAgaWYgKCFkaWRCYWlsb3V0KSB7XG4gICAgLy8gQnViYmxlIHVwIHRoZSBlYXJsaWVzdCBleHBpcmF0aW9uIHRpbWUuXG4gICAgaWYgKCAoY29tcGxldGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgIC8vIEluIHByb2ZpbGluZyBtb2RlLCByZXNldENoaWxkRXhwaXJhdGlvblRpbWUgaXMgYWxzbyB1c2VkIHRvIHJlc2V0XG4gICAgICAvLyBwcm9maWxlciBkdXJhdGlvbnMuXG4gICAgICB2YXIgYWN0dWFsRHVyYXRpb24gPSBjb21wbGV0ZWRXb3JrLmFjdHVhbER1cmF0aW9uO1xuICAgICAgdmFyIHRyZWVCYXNlRHVyYXRpb24gPSBjb21wbGV0ZWRXb3JrLnNlbGZCYXNlRHVyYXRpb247XG4gICAgICB2YXIgY2hpbGQgPSBjb21wbGV0ZWRXb3JrLmNoaWxkO1xuXG4gICAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbmV3Q2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMobmV3Q2hpbGRMYW5lcywgbWVyZ2VMYW5lcyhjaGlsZC5sYW5lcywgY2hpbGQuY2hpbGRMYW5lcykpO1xuICAgICAgICBzdWJ0cmVlRmxhZ3MgfD0gY2hpbGQuc3VidHJlZUZsYWdzO1xuICAgICAgICBzdWJ0cmVlRmxhZ3MgfD0gY2hpbGQuZmxhZ3M7IC8vIFdoZW4gYSBmaWJlciBpcyBjbG9uZWQsIGl0cyBhY3R1YWxEdXJhdGlvbiBpcyByZXNldCB0byAwLiBUaGlzIHZhbHVlIHdpbGxcbiAgICAgICAgLy8gb25seSBiZSB1cGRhdGVkIGlmIHdvcmsgaXMgZG9uZSBvbiB0aGUgZmliZXIgKGkuZS4gaXQgZG9lc24ndCBiYWlsb3V0KS5cbiAgICAgICAgLy8gV2hlbiB3b3JrIGlzIGRvbmUsIGl0IHNob3VsZCBidWJibGUgdG8gdGhlIHBhcmVudCdzIGFjdHVhbER1cmF0aW9uLiBJZlxuICAgICAgICAvLyB0aGUgZmliZXIgaGFzIG5vdCBiZWVuIGNsb25lZCB0aG91Z2gsIChtZWFuaW5nIG5vIHdvcmsgd2FzIGRvbmUpLCB0aGVuXG4gICAgICAgIC8vIHRoaXMgdmFsdWUgd2lsbCByZWZsZWN0IHRoZSBhbW91bnQgb2YgdGltZSBzcGVudCB3b3JraW5nIG9uIGEgcHJldmlvdXNcbiAgICAgICAgLy8gcmVuZGVyLiBJbiB0aGF0IGNhc2UgaXQgc2hvdWxkIG5vdCBidWJibGUuIFdlIGRldGVybWluZSB3aGV0aGVyIGl0IHdhc1xuICAgICAgICAvLyBjbG9uZWQgYnkgY29tcGFyaW5nIHRoZSBjaGlsZCBwb2ludGVyLlxuXG4gICAgICAgIGFjdHVhbER1cmF0aW9uICs9IGNoaWxkLmFjdHVhbER1cmF0aW9uO1xuICAgICAgICB0cmVlQmFzZUR1cmF0aW9uICs9IGNoaWxkLnRyZWVCYXNlRHVyYXRpb247XG4gICAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICAgIH1cblxuICAgICAgY29tcGxldGVkV29yay5hY3R1YWxEdXJhdGlvbiA9IGFjdHVhbER1cmF0aW9uO1xuICAgICAgY29tcGxldGVkV29yay50cmVlQmFzZUR1cmF0aW9uID0gdHJlZUJhc2VEdXJhdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIF9jaGlsZCA9IGNvbXBsZXRlZFdvcmsuY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChfY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbmV3Q2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMobmV3Q2hpbGRMYW5lcywgbWVyZ2VMYW5lcyhfY2hpbGQubGFuZXMsIF9jaGlsZC5jaGlsZExhbmVzKSk7XG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBfY2hpbGQuc3VidHJlZUZsYWdzO1xuICAgICAgICBzdWJ0cmVlRmxhZ3MgfD0gX2NoaWxkLmZsYWdzOyAvLyBVcGRhdGUgdGhlIHJldHVybiBwb2ludGVyIHNvIHRoZSB0cmVlIGlzIGNvbnNpc3RlbnQuIFRoaXMgaXMgYSBjb2RlXG4gICAgICAgIC8vIHNtZWxsIGJlY2F1c2UgaXQgYXNzdW1lcyB0aGUgY29tbWl0IHBoYXNlIGlzIG5ldmVyIGNvbmN1cnJlbnQgd2l0aFxuICAgICAgICAvLyB0aGUgcmVuZGVyIHBoYXNlLiBXaWxsIGFkZHJlc3MgZHVyaW5nIHJlZmFjdG9yIHRvIGFsdGVybmF0ZSBtb2RlbC5cblxuICAgICAgICBfY2hpbGQucmV0dXJuID0gY29tcGxldGVkV29yaztcbiAgICAgICAgX2NoaWxkID0gX2NoaWxkLnNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29tcGxldGVkV29yay5zdWJ0cmVlRmxhZ3MgfD0gc3VidHJlZUZsYWdzO1xuICB9IGVsc2Uge1xuICAgIC8vIEJ1YmJsZSB1cCB0aGUgZWFybGllc3QgZXhwaXJhdGlvbiB0aW1lLlxuICAgIGlmICggKGNvbXBsZXRlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAvLyBJbiBwcm9maWxpbmcgbW9kZSwgcmVzZXRDaGlsZEV4cGlyYXRpb25UaW1lIGlzIGFsc28gdXNlZCB0byByZXNldFxuICAgICAgLy8gcHJvZmlsZXIgZHVyYXRpb25zLlxuICAgICAgdmFyIF90cmVlQmFzZUR1cmF0aW9uID0gY29tcGxldGVkV29yay5zZWxmQmFzZUR1cmF0aW9uO1xuICAgICAgdmFyIF9jaGlsZDIgPSBjb21wbGV0ZWRXb3JrLmNoaWxkO1xuXG4gICAgICB3aGlsZSAoX2NoaWxkMiAhPT0gbnVsbCkge1xuICAgICAgICBuZXdDaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhuZXdDaGlsZExhbmVzLCBtZXJnZUxhbmVzKF9jaGlsZDIubGFuZXMsIF9jaGlsZDIuY2hpbGRMYW5lcykpOyAvLyBcIlN0YXRpY1wiIGZsYWdzIHNoYXJlIHRoZSBsaWZldGltZSBvZiB0aGUgZmliZXIvaG9vayB0aGV5IGJlbG9uZyB0byxcbiAgICAgICAgLy8gc28gd2Ugc2hvdWxkIGJ1YmJsZSB0aG9zZSB1cCBldmVuIGR1cmluZyBhIGJhaWxvdXQuIEFsbCB0aGUgb3RoZXJcbiAgICAgICAgLy8gZmxhZ3MgaGF2ZSBhIGxpZmV0aW1lIG9ubHkgb2YgYSBzaW5nbGUgcmVuZGVyICsgY29tbWl0LCBzbyB3ZSBzaG91bGRcbiAgICAgICAgLy8gaWdub3JlIHRoZW0uXG5cbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IF9jaGlsZDIuc3VidHJlZUZsYWdzICYgU3RhdGljTWFzaztcbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IF9jaGlsZDIuZmxhZ3MgJiBTdGF0aWNNYXNrO1xuICAgICAgICBfdHJlZUJhc2VEdXJhdGlvbiArPSBfY2hpbGQyLnRyZWVCYXNlRHVyYXRpb247XG4gICAgICAgIF9jaGlsZDIgPSBfY2hpbGQyLnNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIGNvbXBsZXRlZFdvcmsudHJlZUJhc2VEdXJhdGlvbiA9IF90cmVlQmFzZUR1cmF0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX2NoaWxkMyA9IGNvbXBsZXRlZFdvcmsuY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChfY2hpbGQzICE9PSBudWxsKSB7XG4gICAgICAgIG5ld0NoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKG5ld0NoaWxkTGFuZXMsIG1lcmdlTGFuZXMoX2NoaWxkMy5sYW5lcywgX2NoaWxkMy5jaGlsZExhbmVzKSk7IC8vIFwiU3RhdGljXCIgZmxhZ3Mgc2hhcmUgdGhlIGxpZmV0aW1lIG9mIHRoZSBmaWJlci9ob29rIHRoZXkgYmVsb25nIHRvLFxuICAgICAgICAvLyBzbyB3ZSBzaG91bGQgYnViYmxlIHRob3NlIHVwIGV2ZW4gZHVyaW5nIGEgYmFpbG91dC4gQWxsIHRoZSBvdGhlclxuICAgICAgICAvLyBmbGFncyBoYXZlIGEgbGlmZXRpbWUgb25seSBvZiBhIHNpbmdsZSByZW5kZXIgKyBjb21taXQsIHNvIHdlIHNob3VsZFxuICAgICAgICAvLyBpZ25vcmUgdGhlbS5cblxuICAgICAgICBzdWJ0cmVlRmxhZ3MgfD0gX2NoaWxkMy5zdWJ0cmVlRmxhZ3MgJiBTdGF0aWNNYXNrO1xuICAgICAgICBzdWJ0cmVlRmxhZ3MgfD0gX2NoaWxkMy5mbGFncyAmIFN0YXRpY01hc2s7IC8vIFVwZGF0ZSB0aGUgcmV0dXJuIHBvaW50ZXIgc28gdGhlIHRyZWUgaXMgY29uc2lzdGVudC4gVGhpcyBpcyBhIGNvZGVcbiAgICAgICAgLy8gc21lbGwgYmVjYXVzZSBpdCBhc3N1bWVzIHRoZSBjb21taXQgcGhhc2UgaXMgbmV2ZXIgY29uY3VycmVudCB3aXRoXG4gICAgICAgIC8vIHRoZSByZW5kZXIgcGhhc2UuIFdpbGwgYWRkcmVzcyBkdXJpbmcgcmVmYWN0b3IgdG8gYWx0ZXJuYXRlIG1vZGVsLlxuXG4gICAgICAgIF9jaGlsZDMucmV0dXJuID0gY29tcGxldGVkV29yaztcbiAgICAgICAgX2NoaWxkMyA9IF9jaGlsZDMuc2libGluZztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wbGV0ZWRXb3JrLnN1YnRyZWVGbGFncyB8PSBzdWJ0cmVlRmxhZ3M7XG4gIH1cblxuICBjb21wbGV0ZWRXb3JrLmNoaWxkTGFuZXMgPSBuZXdDaGlsZExhbmVzO1xuICByZXR1cm4gZGlkQmFpbG91dDtcbn1cblxuZnVuY3Rpb24gY29tcGxldGVEZWh5ZHJhdGVkU3VzcGVuc2VCb3VuZGFyeShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dFN0YXRlKSB7XG4gIGlmIChoYXNVbmh5ZHJhdGVkVGFpbE5vZGVzKCkgJiYgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSAmJiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gTm9GbGFncykge1xuICAgIHdhcm5JZlVuaHlkcmF0ZWRUYWlsTm9kZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBGb3JjZUNsaWVudFJlbmRlciB8IEluY29tcGxldGUgfCBTaG91bGRDYXB0dXJlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciB3YXNIeWRyYXRlZCA9IHBvcEh5ZHJhdGlvblN0YXRlKHdvcmtJblByb2dyZXNzKTtcblxuICBpZiAobmV4dFN0YXRlICE9PSBudWxsICYmIG5leHRTdGF0ZS5kZWh5ZHJhdGVkICE9PSBudWxsKSB7XG4gICAgLy8gV2UgbWlnaHQgYmUgaW5zaWRlIGEgaHlkcmF0aW9uIHN0YXRlIHRoZSBmaXJzdCB0aW1lIHdlJ3JlIHBpY2tpbmcgdXAgdGhpc1xuICAgIC8vIFN1c3BlbnNlIGJvdW5kYXJ5LCBhbmQgYWxzbyBhZnRlciB3ZSd2ZSByZWVudGVyZWQgaXQgZm9yIGZ1cnRoZXIgaHlkcmF0aW9uLlxuICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICBpZiAoIXdhc0h5ZHJhdGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQSBkZWh5ZHJhdGVkIHN1c3BlbnNlIGNvbXBvbmVudCB3YXMgY29tcGxldGVkIHdpdGhvdXQgYSBoeWRyYXRlZCBub2RlLiAnICsgJ1RoaXMgaXMgcHJvYmFibHkgYSBidWcgaW4gUmVhY3QuJyk7XG4gICAgICB9XG5cbiAgICAgIHByZXBhcmVUb0h5ZHJhdGVIb3N0U3VzcGVuc2VJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAge1xuICAgICAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgIHZhciBpc1RpbWVkT3V0U3VzcGVuc2UgPSBuZXh0U3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgICBpZiAoaXNUaW1lZE91dFN1c3BlbnNlKSB7XG4gICAgICAgICAgICAvLyBEb24ndCBjb3VudCB0aW1lIHNwZW50IGluIGEgdGltZWQgb3V0IFN1c3BlbnNlIHN1YnRyZWUgYXMgcGFydCBvZiB0aGUgYmFzZSBkdXJhdGlvbi5cbiAgICAgICAgICAgIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuXG4gICAgICAgICAgICBpZiAocHJpbWFyeUNoaWxkRnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gJEZsb3dGaXhNZSBGbG93IGRvZXNuJ3Qgc3VwcG9ydCB0eXBlIGNhc3RpbmcgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgLT0gb3BlcmF0b3JcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiAtPSBwcmltYXJ5Q2hpbGRGcmFnbWVudC50cmVlQmFzZUR1cmF0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFdlIG1pZ2h0IGhhdmUgcmVlbnRlcmVkIHRoaXMgYm91bmRhcnkgdG8gaHlkcmF0ZSBpdC4gSWYgc28sIHdlIG5lZWQgdG8gcmVzZXQgdGhlIGh5ZHJhdGlvblxuICAgICAgLy8gc3RhdGUgc2luY2Ugd2UncmUgbm93IGV4aXRpbmcgb3V0IG9mIGl0LiBwb3BIeWRyYXRpb25TdGF0ZSBkb2Vzbid0IGRvIHRoYXQgZm9yIHVzLlxuICAgICAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuXG4gICAgICBpZiAoKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IE5vRmxhZ3MpIHtcbiAgICAgICAgLy8gVGhpcyBib3VuZGFyeSBkaWQgbm90IHN1c3BlbmQgc28gaXQncyBub3cgaHlkcmF0ZWQgYW5kIHVuc3VzcGVuZGVkLlxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICAgIH0gLy8gSWYgbm90aGluZyBzdXNwZW5kZWQsIHdlIG5lZWQgdG8gc2NoZWR1bGUgYW4gZWZmZWN0IHRvIG1hcmsgdGhpcyBib3VuZGFyeVxuICAgICAgLy8gYXMgaGF2aW5nIGh5ZHJhdGVkIHNvIGV2ZW50cyBrbm93IHRoYXQgdGhleSdyZSBmcmVlIHRvIGJlIGludm9rZWQuXG4gICAgICAvLyBJdCdzIGFsc28gYSBzaWduYWwgdG8gcmVwbGF5IGV2ZW50cyBhbmQgdGhlIHN1c3BlbnNlIGNhbGxiYWNrLlxuICAgICAgLy8gSWYgc29tZXRoaW5nIHN1c3BlbmRlZCwgc2NoZWR1bGUgYW4gZWZmZWN0IHRvIGF0dGFjaCByZXRyeSBsaXN0ZW5lcnMuXG4gICAgICAvLyBTbyB3ZSBtaWdodCBhcyB3ZWxsIGFsd2F5cyBtYXJrIHRoaXMuXG5cblxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgIHtcbiAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICB2YXIgX2lzVGltZWRPdXRTdXNwZW5zZSA9IG5leHRTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICAgIGlmIChfaXNUaW1lZE91dFN1c3BlbnNlKSB7XG4gICAgICAgICAgICAvLyBEb24ndCBjb3VudCB0aW1lIHNwZW50IGluIGEgdGltZWQgb3V0IFN1c3BlbnNlIHN1YnRyZWUgYXMgcGFydCBvZiB0aGUgYmFzZSBkdXJhdGlvbi5cbiAgICAgICAgICAgIHZhciBfcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICAgICAgICAgICAgaWYgKF9wcmltYXJ5Q2hpbGRGcmFnbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyAkRmxvd0ZpeE1lIEZsb3cgZG9lc24ndCBzdXBwb3J0IHR5cGUgY2FzdGluZyBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSAtPSBvcGVyYXRvclxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uIC09IF9wcmltYXJ5Q2hpbGRGcmFnbWVudC50cmVlQmFzZUR1cmF0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgdGhpcyB0cmVlLiBJZiB0aGlzIHdhcyBhIGZvcmNlZCBjbGllbnQgcmVuZGVyLFxuICAgIC8vIHRoZXJlIG1heSBoYXZlIGJlZW4gcmVjb3ZlcmFibGUgZXJyb3JzIGR1cmluZyBmaXJzdCBoeWRyYXRpb25cbiAgICAvLyBhdHRlbXB0LiBJZiBzbywgYWRkIHRoZW0gdG8gYSBxdWV1ZSBzbyB3ZSBjYW4gbG9nIHRoZW0gaW4gdGhlXG4gICAgLy8gY29tbWl0IHBoYXNlLlxuICAgIHVwZ3JhZGVIeWRyYXRpb25FcnJvcnNUb1JlY292ZXJhYmxlKCk7IC8vIEZhbGwgdGhyb3VnaCB0byBub3JtYWwgU3VzcGVuc2UgcGF0aFxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tcGxldGVXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgbmV3UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7IC8vIE5vdGU6IFRoaXMgaW50ZW50aW9uYWxseSBkb2Vzbid0IGNoZWNrIGlmIHdlJ3JlIGh5ZHJhdGluZyBiZWNhdXNlIGNvbXBhcmluZ1xuICAvLyB0byB0aGUgY3VycmVudCB0cmVlIHByb3ZpZGVyIGZpYmVyIGlzIGp1c3QgYXMgZmFzdCBhbmQgbGVzcyBlcnJvci1wcm9uZS5cbiAgLy8gSWRlYWxseSB3ZSB3b3VsZCBoYXZlIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIHRoZSB3b3JrIGxvb3Agb25seVxuICAvLyBmb3IgaHlkcmF0aW9uLlxuXG4gIHBvcFRyZWVDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcblxuICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgIGNhc2UgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDpcbiAgICBjYXNlIExhenlDb21wb25lbnQ6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgRnJhZ21lbnQ6XG4gICAgY2FzZSBNb2RlOlxuICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgY2FzZSBDb250ZXh0Q29uc3VtZXI6XG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBDb21wb25lbnQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuXG4gICAgICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICAgICAgcG9wQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIH1cblxuICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAge1xuICAgICAgICB2YXIgZmliZXJSb290ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgICAgICBwb3BIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcG9wVG9wTGV2ZWxDb250ZXh0T2JqZWN0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmVzZXRXb3JrSW5Qcm9ncmVzc1ZlcnNpb25zKCk7XG5cbiAgICAgICAgaWYgKGZpYmVyUm9vdC5wZW5kaW5nQ29udGV4dCkge1xuICAgICAgICAgIGZpYmVyUm9vdC5jb250ZXh0ID0gZmliZXJSb290LnBlbmRpbmdDb250ZXh0O1xuICAgICAgICAgIGZpYmVyUm9vdC5wZW5kaW5nQ29udGV4dCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50LmNoaWxkID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gSWYgd2UgaHlkcmF0ZWQsIHBvcCBzbyB0aGF0IHdlIGNhbiBkZWxldGUgYW55IHJlbWFpbmluZyBjaGlsZHJlblxuICAgICAgICAgIC8vIHRoYXQgd2VyZW4ndCBoeWRyYXRlZC5cbiAgICAgICAgICB2YXIgd2FzSHlkcmF0ZWQgPSBwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAgICBpZiAod2FzSHlkcmF0ZWQpIHtcbiAgICAgICAgICAgIC8vIElmIHdlIGh5ZHJhdGVkLCB0aGVuIHdlJ2xsIG5lZWQgdG8gc2NoZWR1bGUgYW4gdXBkYXRlIGZvclxuICAgICAgICAgICAgLy8gdGhlIGNvbW1pdCBzaWRlLWVmZmVjdHMgb24gdGhlIHJvb3QuXG4gICAgICAgICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICAgICAgICBpZiAoIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBjbGllbnQgcm9vdFxuICAgICAgICAgICAgICAhcHJldlN0YXRlLmlzRGVoeWRyYXRlZCB8fCAvLyBDaGVjayBpZiB3ZSByZXZlcnRlZCB0byBjbGllbnQgcmVuZGVyaW5nIChlLmcuIGR1ZSB0byBhbiBlcnJvcilcbiAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRm9yY2VDbGllbnRSZW5kZXIpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgICAgICAgLy8gU2NoZWR1bGUgYW4gZWZmZWN0IHRvIGNsZWFyIHRoaXMgY29udGFpbmVyIGF0IHRoZSBzdGFydCBvZiB0aGVcbiAgICAgICAgICAgICAgICAvLyBuZXh0IGNvbW1pdC4gVGhpcyBoYW5kbGVzIHRoZSBjYXNlIG9mIFJlYWN0IHJlbmRlcmluZyBpbnRvIGFcbiAgICAgICAgICAgICAgICAvLyBjb250YWluZXIgd2l0aCBwcmV2aW91cyBjaGlsZHJlbi4gSXQncyBhbHNvIHNhZmUgdG8gZG8gZm9yXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlcyB0b28sIGJlY2F1c2UgY3VycmVudC5jaGlsZCB3b3VsZCBvbmx5IGJlIG51bGwgaWYgdGhlXG4gICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgcmVuZGVyIHdhcyBudWxsIChzbyB0aGUgY29udGFpbmVyIHdvdWxkIGFscmVhZHlcbiAgICAgICAgICAgICAgICAvLyBiZSBlbXB0eSkuXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU25hcHNob3Q7IC8vIElmIHRoaXMgd2FzIGEgZm9yY2VkIGNsaWVudCByZW5kZXIsIHRoZXJlIG1heSBoYXZlIGJlZW5cbiAgICAgICAgICAgICAgICAvLyByZWNvdmVyYWJsZSBlcnJvcnMgZHVyaW5nIGZpcnN0IGh5ZHJhdGlvbiBhdHRlbXB0LiBJZiBzbywgYWRkXG4gICAgICAgICAgICAgICAgLy8gdGhlbSB0byBhIHF1ZXVlIHNvIHdlIGNhbiBsb2cgdGhlbSBpbiB0aGUgY29tbWl0IHBoYXNlLlxuXG4gICAgICAgICAgICAgICAgdXBncmFkZUh5ZHJhdGlvbkVycm9yc1RvUmVjb3ZlcmFibGUoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHVwZGF0ZUhvc3RDb250YWluZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wSG9zdENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB2YXIgcm9vdENvbnRhaW5lckluc3RhbmNlID0gZ2V0Um9vdEhvc3RDb250YWluZXIoKTtcbiAgICAgICAgdmFyIHR5cGUgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuXG4gICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgdXBkYXRlSG9zdENvbXBvbmVudCQxKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCB0eXBlLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlKTtcblxuICAgICAgICAgIGlmIChjdXJyZW50LnJlZiAhPT0gd29ya0luUHJvZ3Jlc3MucmVmKSB7XG4gICAgICAgICAgICBtYXJrUmVmJDEod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIW5ld1Byb3BzKSB7XG4gICAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV2UgbXVzdCBoYXZlIG5ldyBwcm9wcyBmb3IgbmV3IG1vdW50cy4gVGhpcyBlcnJvciBpcyBsaWtlbHkgJyArICdjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgICAgICAgfSAvLyBUaGlzIGNhbiBoYXBwZW4gd2hlbiB3ZSBhYm9ydCB3b3JrLlxuXG5cbiAgICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGN1cnJlbnRIb3N0Q29udGV4dCA9IGdldEhvc3RDb250ZXh0KCk7IC8vIFRPRE86IE1vdmUgY3JlYXRlSW5zdGFuY2UgdG8gYmVnaW5Xb3JrIGFuZCBrZWVwIGl0IG9uIGEgY29udGV4dFxuICAgICAgICAgIC8vIFwic3RhY2tcIiBhcyB0aGUgcGFyZW50LiBUaGVuIGFwcGVuZCBjaGlsZHJlbiBhcyB3ZSBnbyBpbiBiZWdpbldvcmtcbiAgICAgICAgICAvLyBvciBjb21wbGV0ZVdvcmsgZGVwZW5kaW5nIG9uIHdoZXRoZXIgd2Ugd2FudCB0byBhZGQgdGhlbSB0b3AtPmRvd24gb3JcbiAgICAgICAgICAvLyBib3R0b20tPnVwLiBUb3AtPmRvd24gaXMgZmFzdGVyIGluIElFMTEuXG5cbiAgICAgICAgICB2YXIgX3dhc0h5ZHJhdGVkID0gcG9wSHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICAgICAgaWYgKF93YXNIeWRyYXRlZCkge1xuICAgICAgICAgICAgLy8gVE9ETzogTW92ZSB0aGlzIGFuZCBjcmVhdGVJbnN0YW5jZSBzdGVwIGludG8gdGhlIGJlZ2luUGhhc2VcbiAgICAgICAgICAgIC8vIHRvIGNvbnNvbGlkYXRlLlxuICAgICAgICAgICAgaWYgKHByZXBhcmVUb0h5ZHJhdGVIb3N0SW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgY3VycmVudEhvc3RDb250ZXh0KSkge1xuICAgICAgICAgICAgICAvLyBJZiBjaGFuZ2VzIHRvIHRoZSBoeWRyYXRlZCBub2RlIG5lZWQgdG8gYmUgYXBwbGllZCBhdCB0aGVcbiAgICAgICAgICAgICAgLy8gY29tbWl0LXBoYXNlIHdlIG1hcmsgdGhpcyBhcyBzdWNoLlxuICAgICAgICAgICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gY3JlYXRlSW5zdGFuY2UodHlwZSwgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgY3VycmVudEhvc3RDb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICBhcHBlbmRBbGxDaGlsZHJlbihpbnN0YW5jZSwgd29ya0luUHJvZ3Jlc3MsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBpbnN0YW5jZTsgLy8gQ2VydGFpbiByZW5kZXJlcnMgcmVxdWlyZSBjb21taXQtdGltZSBlZmZlY3RzIGZvciBpbml0aWFsIG1vdW50LlxuICAgICAgICAgICAgLy8gKGVnIERPTSByZW5kZXJlciBzdXBwb3J0cyBhdXRvLWZvY3VzIGZvciBjZXJ0YWluIGVsZW1lbnRzKS5cbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBzdWNoIHJlbmRlcmVycyBnZXQgc2NoZWR1bGVkIGZvciBsYXRlciB3b3JrLlxuXG4gICAgICAgICAgICBpZiAoZmluYWxpemVJbml0aWFsQ2hpbGRyZW4oaW5zdGFuY2UsIHR5cGUsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UpKSB7XG4gICAgICAgICAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5yZWYgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgcmVmIG9uIGEgaG9zdCBub2RlIHdlIG5lZWQgdG8gc2NoZWR1bGUgYSBjYWxsYmFja1xuICAgICAgICAgICAgbWFya1JlZiQxKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAge1xuICAgICAgICB2YXIgbmV3VGV4dCA9IG5ld1Byb3BzO1xuXG4gICAgICAgIGlmIChjdXJyZW50ICYmIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgdmFyIG9sZFRleHQgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7IC8vIElmIHdlIGhhdmUgYW4gYWx0ZXJuYXRlLCB0aGF0IG1lYW5zIHRoaXMgaXMgYW4gdXBkYXRlIGFuZCB3ZSBuZWVkXG4gICAgICAgICAgLy8gdG8gc2NoZWR1bGUgYSBzaWRlLWVmZmVjdCB0byBkbyB0aGUgdXBkYXRlcy5cblxuICAgICAgICAgIHVwZGF0ZUhvc3RUZXh0JDEoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG9sZFRleHQsIG5ld1RleHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0eXBlb2YgbmV3VGV4dCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXZSBtdXN0IGhhdmUgbmV3IHByb3BzIGZvciBuZXcgbW91bnRzLiBUaGlzIGVycm9yIGlzIGxpa2VseSAnICsgJ2NhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICAgICAgICB9IC8vIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHdlIGFib3J0IHdvcmsuXG5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgX3Jvb3RDb250YWluZXJJbnN0YW5jZSA9IGdldFJvb3RIb3N0Q29udGFpbmVyKCk7XG5cbiAgICAgICAgICB2YXIgX2N1cnJlbnRIb3N0Q29udGV4dCA9IGdldEhvc3RDb250ZXh0KCk7XG5cbiAgICAgICAgICB2YXIgX3dhc0h5ZHJhdGVkMiA9IHBvcEh5ZHJhdGlvblN0YXRlKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICAgIGlmIChfd2FzSHlkcmF0ZWQyKSB7XG4gICAgICAgICAgICBpZiAocHJlcGFyZVRvSHlkcmF0ZUhvc3RUZXh0SW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MpKSB7XG4gICAgICAgICAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBjcmVhdGVUZXh0SW5zdGFuY2UobmV3VGV4dCwgX3Jvb3RDb250YWluZXJJbnN0YW5jZSwgX2N1cnJlbnRIb3N0Q29udGV4dCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHZhciBuZXh0U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlOyAvLyBTcGVjaWFsIHBhdGggZm9yIGRlaHlkcmF0ZWQgYm91bmRhcmllcy4gV2UgbWF5IGV2ZW50dWFsbHkgbW92ZSB0aGlzXG4gICAgICAgIC8vIHRvIGl0cyBvd24gZmliZXIgdHlwZSBzbyB0aGF0IHdlIGNhbiBhZGQgb3RoZXIga2luZHMgb2YgaHlkcmF0aW9uXG4gICAgICAgIC8vIGJvdW5kYXJpZXMgdGhhdCBhcmVuJ3QgYXNzb2NpYXRlZCB3aXRoIGEgU3VzcGVuc2UgdHJlZS4gSW4gYW50aWNpcGF0aW9uXG4gICAgICAgIC8vIG9mIHN1Y2ggYSByZWZhY3RvciwgYWxsIHRoZSBoeWRyYXRpb24gbG9naWMgaXMgY29udGFpbmVkIGluXG4gICAgICAgIC8vIHRoaXMgYnJhbmNoLlxuXG4gICAgICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbCAmJiBjdXJyZW50Lm1lbW9pemVkU3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBmYWxsdGhyb3VnaFRvTm9ybWFsU3VzcGVuc2VQYXRoID0gY29tcGxldGVEZWh5ZHJhdGVkU3VzcGVuc2VCb3VuZGFyeShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dFN0YXRlKTtcblxuICAgICAgICAgIGlmICghZmFsbHRocm91Z2hUb05vcm1hbFN1c3BlbnNlUGF0aCkge1xuICAgICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLmZsYWdzICYgU2hvdWxkQ2FwdHVyZSkge1xuICAgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UuIFRoZXJlIHdlcmUgcmVtYWluaW5nIHVuaHlkcmF0ZWQgbm9kZXMuIFdlIHRyZWF0XG4gICAgICAgICAgICAgIC8vIHRoaXMgYXMgYSBtaXNtYXRjaC4gUmV2ZXJ0IHRvIGNsaWVudCByZW5kZXJpbmcuXG4gICAgICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIERpZCBub3QgZmluaXNoIGh5ZHJhdGluZywgZWl0aGVyIGJlY2F1c2UgdGhpcyBpcyB0aGUgaW5pdGlhbFxuICAgICAgICAgICAgICAvLyByZW5kZXIgb3IgYmVjYXVzZSBzb21ldGhpbmcgc3VzcGVuZGVkLlxuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IC8vIENvbnRpbnVlIHdpdGggdGhlIG5vcm1hbCBTdXNwZW5zZSBwYXRoLlxuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICAvLyBTb21ldGhpbmcgc3VzcGVuZGVkLiBSZS1yZW5kZXIgd2l0aCB0aGUgZmFsbGJhY2sgY2hpbGRyZW4uXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSByZW5kZXJMYW5lczsgLy8gRG8gbm90IHJlc2V0IHRoZSBlZmZlY3QgbGlzdC5cblxuICAgICAgICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgICAgdHJhbnNmZXJBY3R1YWxEdXJhdGlvbih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfSAvLyBEb24ndCBidWJibGUgcHJvcGVydGllcyBpbiB0aGlzIGNhc2UuXG5cblxuICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBuZXh0RGlkVGltZW91dCA9IG5leHRTdGF0ZSAhPT0gbnVsbDtcbiAgICAgICAgdmFyIHByZXZEaWRUaW1lb3V0ID0gY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50Lm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG4gICAgICAgIC8vIGEgcGFzc2l2ZSBlZmZlY3QsIHdoaWNoIGlzIHdoZW4gd2UgcHJvY2VzcyB0aGUgdHJhbnNpdGlvbnNcblxuXG4gICAgICAgIGlmIChuZXh0RGlkVGltZW91dCAhPT0gcHJldkRpZFRpbWVvdXQpIHtcbiAgICAgICAgICAvLyBhbiBlZmZlY3QgdG8gdG9nZ2xlIHRoZSBzdWJ0cmVlJ3MgdmlzaWJpbGl0eS4gV2hlbiB3ZSBzd2l0Y2ggZnJvbVxuICAgICAgICAgIC8vIGZhbGxiYWNrIC0+IHByaW1hcnksIHRoZSBpbm5lciBPZmZzY3JlZW4gZmliZXIgc2NoZWR1bGVzIHRoaXMgZWZmZWN0XG4gICAgICAgICAgLy8gYXMgcGFydCBvZiBpdHMgbm9ybWFsIGNvbXBsZXRlIHBoYXNlLiBCdXQgd2hlbiB3ZSBzd2l0Y2ggZnJvbVxuICAgICAgICAgIC8vIHByaW1hcnkgLT4gZmFsbGJhY2ssIHRoZSBpbm5lciBPZmZzY3JlZW4gZmliZXIgZG9lcyBub3QgaGF2ZSBhIGNvbXBsZXRlXG4gICAgICAgICAgLy8gcGhhc2UuIFNvIHdlIG5lZWQgdG8gc2NoZWR1bGUgaXRzIGVmZmVjdCBoZXJlLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gV2UgYWxzbyB1c2UgdGhpcyBmbGFnIHRvIGNvbm5lY3QvZGlzY29ubmVjdCB0aGUgZWZmZWN0cywgYnV0IHRoZSBzYW1lXG4gICAgICAgICAgLy8gbG9naWMgYXBwbGllczogd2hlbiByZS1jb25uZWN0aW5nLCB0aGUgT2Zmc2NyZWVuIGZpYmVyJ3MgY29tcGxldGVcbiAgICAgICAgICAvLyBwaGFzZSB3aWxsIGhhbmRsZSBzY2hlZHVsaW5nIHRoZSBlZmZlY3QuIEl0J3Mgb25seSB3aGVuIHRoZSBmYWxsYmFja1xuICAgICAgICAgIC8vIGlzIGFjdGl2ZSB0aGF0IHdlIGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC5cblxuXG4gICAgICAgICAgaWYgKG5leHREaWRUaW1lb3V0KSB7XG4gICAgICAgICAgICB2YXIgX29mZnNjcmVlbkZpYmVyMiA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgICAgX29mZnNjcmVlbkZpYmVyMi5mbGFncyB8PSBWaXNpYmlsaXR5OyAvLyBUT0RPOiBUaGlzIHdpbGwgc3RpbGwgc3VzcGVuZCBhIHN5bmNocm9ub3VzIHRyZWUgaWYgYW55dGhpbmdcbiAgICAgICAgICAgIC8vIGluIHRoZSBjb25jdXJyZW50IHRyZWUgYWxyZWFkeSBzdXNwZW5kZWQgZHVyaW5nIHRoaXMgcmVuZGVyLlxuICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGtub3duIGJ1Zy5cblxuICAgICAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgICAgLy8gVE9ETzogTW92ZSB0aGlzIGJhY2sgdG8gdGhyb3dFeGNlcHRpb24gYmVjYXVzZSB0aGlzIGlzIHRvbyBsYXRlXG4gICAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYSBsYXJnZSB0cmVlIHdoaWNoIGlzIGNvbW1vbiBmb3IgaW5pdGlhbCBsb2Fkcy4gV2VcbiAgICAgICAgICAgICAgLy8gZG9uJ3Qga25vdyBpZiB3ZSBzaG91bGQgcmVzdGFydCBhIHJlbmRlciBvciBub3QgdW50aWwgd2UgZ2V0XG4gICAgICAgICAgICAgIC8vIHRoaXMgbWFya2VyLCBhbmQgdGhpcyBpcyB0b28gbGF0ZS5cbiAgICAgICAgICAgICAgLy8gSWYgdGhpcyByZW5kZXIgYWxyZWFkeSBoYWQgYSBwaW5nIG9yIGxvd2VyIHByaSB1cGRhdGVzLFxuICAgICAgICAgICAgICAvLyBhbmQgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBrbm93IHdlJ3JlIGdvaW5nIHRvIHN1c3BlbmQgd2VcbiAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGFibGUgdG8gaW1tZWRpYXRlbHkgcmVzdGFydCBmcm9tIHdpdGhpbiB0aHJvd0V4Y2VwdGlvbi5cbiAgICAgICAgICAgICAgdmFyIGhhc0ludmlzaWJsZUNoaWxkQ29udGV4dCA9IGN1cnJlbnQgPT09IG51bGwgJiYgKHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMudW5zdGFibGVfYXZvaWRUaGlzRmFsbGJhY2sgIT09IHRydWUgfHwgIWVuYWJsZVN1c3BlbnNlQXZvaWRUaGlzRmFsbGJhY2spO1xuXG4gICAgICAgICAgICAgIGlmIChoYXNJbnZpc2libGVDaGlsZENvbnRleHQgfHwgaGFzU3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudCwgSW52aXNpYmxlUGFyZW50U3VzcGVuc2VDb250ZXh0KSkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgd2FzIGluIGFuIGludmlzaWJsZSB0cmVlIG9yIGEgbmV3IHJlbmRlciwgdGhlbiBzaG93aW5nXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBib3VuZGFyeSBpcyBvay5cbiAgICAgICAgICAgICAgICByZW5kZXJEaWRTdXNwZW5kKCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSdyZSBnb2luZyB0byBoYXZlIHRvIGhpZGUgY29udGVudCBzbyB3ZSBzaG91bGRcbiAgICAgICAgICAgICAgICAvLyBzdXNwZW5kIGZvciBsb25nZXIgaWYgcG9zc2libGUuXG4gICAgICAgICAgICAgICAgcmVuZGVyRGlkU3VzcGVuZERlbGF5SWZQb3NzaWJsZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHdha2VhYmxlcyA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgIGlmICh3YWtlYWJsZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBTY2hlZHVsZSBhbiBlZmZlY3QgdG8gYXR0YWNoIGEgcmV0cnkgbGlzdGVuZXIgdG8gdGhlIHByb21pc2UuXG4gICAgICAgICAgLy8gVE9ETzogTW92ZSB0byBwYXNzaXZlIHBoYXNlXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAge1xuICAgICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgICBpZiAobmV4dERpZFRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgLy8gRG9uJ3QgY291bnQgdGltZSBzcGVudCBpbiBhIHRpbWVkIG91dCBTdXNwZW5zZSBzdWJ0cmVlIGFzIHBhcnQgb2YgdGhlIGJhc2UgZHVyYXRpb24uXG4gICAgICAgICAgICAgIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuXG4gICAgICAgICAgICAgIGlmIChwcmltYXJ5Q2hpbGRGcmFnbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vICRGbG93Rml4TWUgRmxvdyBkb2Vzbid0IHN1cHBvcnQgdHlwZSBjYXN0aW5nIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIC09IG9wZXJhdG9yXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiAtPSBwcmltYXJ5Q2hpbGRGcmFnbWVudC50cmVlQmFzZUR1cmF0aW9uO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBwb3BIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHVwZGF0ZUhvc3RDb250YWluZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgICBwcmVwYXJlUG9ydGFsTW91bnQod29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICAgICAgfVxuXG4gICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICAvLyBQb3AgcHJvdmlkZXIgZmliZXJcbiAgICAgIHZhciBjb250ZXh0ID0gd29ya0luUHJvZ3Jlc3MudHlwZS5fY29udGV4dDtcbiAgICAgIHBvcFByb3ZpZGVyKGNvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIEluY29tcGxldGVDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgLy8gU2FtZSBhcyBjbGFzcyBjb21wb25lbnQgY2FzZS4gSSBwdXQgaXQgZG93biBoZXJlIHNvIHRoYXQgdGhlIHRhZ3MgYXJlXG4gICAgICAgIC8vIHNlcXVlbnRpYWwgdG8gZW5zdXJlIHRoaXMgc3dpdGNoIGlzIGNvbXBpbGVkIHRvIGEganVtcCB0YWJsZS5cbiAgICAgICAgdmFyIF9Db21wb25lbnQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuXG4gICAgICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihfQ29tcG9uZW50KSkge1xuICAgICAgICAgIHBvcENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHZhciByZW5kZXJTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgaWYgKHJlbmRlclN0YXRlID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UncmUgcnVubmluZyBpbiB0aGUgZGVmYXVsdCwgXCJpbmRlcGVuZGVudFwiIG1vZGUuXG4gICAgICAgICAgLy8gV2UgZG9uJ3QgZG8gYW55dGhpbmcgaW4gdGhpcyBtb2RlLlxuICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRpZFN1c3BlbmRBbHJlYWR5ID0gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG4gICAgICAgIHZhciByZW5kZXJlZFRhaWwgPSByZW5kZXJTdGF0ZS5yZW5kZXJpbmc7XG5cbiAgICAgICAgaWYgKHJlbmRlcmVkVGFpbCA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlIGp1c3QgcmVuZGVyZWQgdGhlIGhlYWQuXG4gICAgICAgICAgaWYgKCFkaWRTdXNwZW5kQWxyZWFkeSkge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgcGFzcy4gV2UgbmVlZCB0byBmaWd1cmUgb3V0IGlmIGFueXRoaW5nIGlzIHN0aWxsXG4gICAgICAgICAgICAvLyBzdXNwZW5kZWQgaW4gdGhlIHJlbmRlcmVkIHNldC5cbiAgICAgICAgICAgIC8vIElmIG5ldyBjb250ZW50IHVuc3VzcGVuZGVkLCBidXQgdGhlcmUncyBzdGlsbCBzb21lIGNvbnRlbnQgdGhhdFxuICAgICAgICAgICAgLy8gZGlkbid0LiBUaGVuIHdlIG5lZWQgdG8gZG8gYSBzZWNvbmQgcGFzcyB0aGF0IGZvcmNlcyBldmVyeXRoaW5nXG4gICAgICAgICAgICAvLyB0byBrZWVwIHNob3dpbmcgdGhlaXIgZmFsbGJhY2tzLlxuICAgICAgICAgICAgLy8gV2UgbWlnaHQgYmUgc3VzcGVuZGVkIGlmIHNvbWV0aGluZyBpbiB0aGlzIHJlbmRlciBwYXNzIHN1c3BlbmRlZCwgb3JcbiAgICAgICAgICAgIC8vIHNvbWV0aGluZyBpbiB0aGUgcHJldmlvdXMgY29tbWl0dGVkIHBhc3Mgc3VzcGVuZGVkLiBPdGhlcndpc2UsXG4gICAgICAgICAgICAvLyB0aGVyZSdzIG5vIGNoYW5jZSBzbyB3ZSBjYW4gc2tpcCB0aGUgZXhwZW5zaXZlIGNhbGwgdG9cbiAgICAgICAgICAgIC8vIGZpbmRGaXJzdFN1c3BlbmRlZC5cbiAgICAgICAgICAgIHZhciBjYW5ub3RCZVN1c3BlbmRlZCA9IHJlbmRlckhhc05vdFN1c3BlbmRlZFlldCgpICYmIChjdXJyZW50ID09PSBudWxsIHx8IChjdXJyZW50LmZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IE5vRmxhZ3MpO1xuXG4gICAgICAgICAgICBpZiAoIWNhbm5vdEJlU3VzcGVuZGVkKSB7XG4gICAgICAgICAgICAgIHZhciByb3cgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICAgICAgICAgICAgICB3aGlsZSAocm93ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN1c3BlbmRlZCA9IGZpbmRGaXJzdFN1c3BlbmRlZChyb3cpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHN1c3BlbmRlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgZGlkU3VzcGVuZEFscmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgZmFsc2UpOyAvLyBJZiB0aGlzIGlzIGEgbmV3bHkgc3VzcGVuZGVkIHRyZWUsIGl0IG1pZ2h0IG5vdCBnZXQgY29tbWl0dGVkIGFzXG4gICAgICAgICAgICAgICAgICAvLyBwYXJ0IG9mIHRoZSBzZWNvbmQgcGFzcy4gSW4gdGhhdCBjYXNlIG5vdGhpbmcgd2lsbCBzdWJzY3JpYmUgdG9cbiAgICAgICAgICAgICAgICAgIC8vIGl0cyB0aGVuYWJsZXMuIEluc3RlYWQsIHdlJ2xsIHRyYW5zZmVyIGl0cyB0aGVuYWJsZXMgdG8gdGhlXG4gICAgICAgICAgICAgICAgICAvLyBTdXNwZW5zZUxpc3Qgc28gdGhhdCBpdCBjYW4gcmV0cnkgaWYgdGhleSByZXNvbHZlLlxuICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgbWlnaHQgYmUgbXVsdGlwbGUgb2YgdGhlc2UgaW4gdGhlIGxpc3QgYnV0IHNpbmNlIHdlJ3JlXG4gICAgICAgICAgICAgICAgICAvLyBnb2luZyB0byB3YWl0IGZvciBhbGwgb2YgdGhlbSBhbnl3YXksIGl0IGRvZXNuJ3QgcmVhbGx5IG1hdHRlclxuICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggb25lcyBnZXRzIHRvIHBpbmcuIEluIHRoZW9yeSB3ZSBjb3VsZCBnZXQgY2xldmVyIGFuZCBrZWVwXG4gICAgICAgICAgICAgICAgICAvLyB0cmFjayBvZiBob3cgbWFueSBkZXBlbmRlbmNpZXMgcmVtYWluIGJ1dCBpdCBnZXRzIHRyaWNreSBiZWNhdXNlXG4gICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgbWVhbnRpbWUsIHdlIGNhbiBhZGQvcmVtb3ZlL2NoYW5nZSBpdGVtcyBhbmQgZGVwZW5kZW5jaWVzLlxuICAgICAgICAgICAgICAgICAgLy8gV2UgbWlnaHQgYmFpbCBvdXQgb2YgdGhlIGxvb3AgYmVmb3JlIGZpbmRpbmcgYW55IGJ1dCB0aGF0XG4gICAgICAgICAgICAgICAgICAvLyBkb2Vzbid0IG1hdHRlciBzaW5jZSB0aGF0IG1lYW5zIHRoYXQgdGhlIG90aGVyIGJvdW5kYXJpZXMgdGhhdFxuICAgICAgICAgICAgICAgICAgLy8gd2UgZGlkIGZpbmQgYWxyZWFkeSBoYXMgdGhlaXIgbGlzdGVuZXJzIGF0dGFjaGVkLlxuXG4gICAgICAgICAgICAgICAgICB2YXIgbmV3VGhlbmFibGVzID0gc3VzcGVuZGVkLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgICAgICAgICAgICBpZiAobmV3VGhlbmFibGVzICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbmV3VGhlbmFibGVzO1xuICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICAgICAgICAgICAgICB9IC8vIFJlcmVuZGVyIHRoZSB3aG9sZSBsaXN0LCBidXQgdGhpcyB0aW1lLCB3ZSdsbCBmb3JjZSBmYWxsYmFja3NcbiAgICAgICAgICAgICAgICAgIC8vIHRvIHN0YXkgaW4gcGxhY2UuXG4gICAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgZWZmZWN0IGZsYWdzIGJlZm9yZSBkb2luZyB0aGUgc2Vjb25kIHBhc3Mgc2luY2UgdGhhdCdzIG5vdyBpbnZhbGlkLlxuICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGNoaWxkIGZpYmVycyB0byB0aGVpciBvcmlnaW5hbCBzdGF0ZS5cblxuXG4gICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuICAgICAgICAgICAgICAgICAgcmVzZXRDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpOyAvLyBTZXQgdXAgdGhlIFN1c3BlbnNlIENvbnRleHQgdG8gZm9yY2Ugc3VzcGVuc2UgYW5kIGltbWVkaWF0ZWx5XG4gICAgICAgICAgICAgICAgICAvLyByZXJlbmRlciB0aGUgY2hpbGRyZW4uXG5cbiAgICAgICAgICAgICAgICAgIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHNldFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50LCBGb3JjZVN1c3BlbnNlRmFsbGJhY2spKTsgLy8gRG9uJ3QgYnViYmxlIHByb3BlcnRpZXMgaW4gdGhpcyBjYXNlLlxuXG4gICAgICAgICAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcm93ID0gcm93LnNpYmxpbmc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJlbmRlclN0YXRlLnRhaWwgIT09IG51bGwgJiYgbm93KCkgPiBnZXRSZW5kZXJUYXJnZXRUaW1lKCkpIHtcbiAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhbHJlYWR5IHBhc3NlZCBvdXIgQ1BVIGRlYWRsaW5lIGJ1dCB3ZSBzdGlsbCBoYXZlIHJvd3NcbiAgICAgICAgICAgICAgLy8gbGVmdCBpbiB0aGUgdGFpbC4gV2UnbGwganVzdCBnaXZlIHVwIGZ1cnRoZXIgYXR0ZW1wdHMgdG8gcmVuZGVyXG4gICAgICAgICAgICAgIC8vIHRoZSBtYWluIGNvbnRlbnQgYW5kIG9ubHkgcmVuZGVyIGZhbGxiYWNrcy5cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICAgICAgZGlkU3VzcGVuZEFscmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIGZhbHNlKTsgLy8gU2luY2Ugbm90aGluZyBhY3R1YWxseSBzdXNwZW5kZWQsIHRoZXJlIHdpbGwgbm90aGluZyB0byBwaW5nIHRoaXNcbiAgICAgICAgICAgICAgLy8gdG8gZ2V0IGl0IHN0YXJ0ZWQgYmFjayB1cCB0byBhdHRlbXB0IHRoZSBuZXh0IGl0ZW0uIFdoaWxlIGluIHRlcm1zXG4gICAgICAgICAgICAgIC8vIG9mIHByaW9yaXR5IHRoaXMgd29yayBoYXMgdGhlIHNhbWUgcHJpb3JpdHkgYXMgdGhpcyBjdXJyZW50IHJlbmRlcixcbiAgICAgICAgICAgICAgLy8gaXQncyBub3QgcGFydCBvZiB0aGUgc2FtZSB0cmFuc2l0aW9uIG9uY2UgdGhlIHRyYW5zaXRpb24gaGFzXG4gICAgICAgICAgICAgIC8vIGNvbW1pdHRlZC4gSWYgaXQncyBzeW5jLCB3ZSBzdGlsbCB3YW50IHRvIHlpZWxkIHNvIHRoYXQgaXQgY2FuIGJlXG4gICAgICAgICAgICAgIC8vIHBhaW50ZWQuIENvbmNlcHR1YWxseSwgdGhpcyBpcyByZWFsbHkgdGhlIHNhbWUgYXMgcGluZ2luZy5cbiAgICAgICAgICAgICAgLy8gV2UgY2FuIHVzZSBhbnkgUmV0cnlMYW5lIGV2ZW4gaWYgaXQncyB0aGUgb25lIGN1cnJlbnRseSByZW5kZXJpbmdcbiAgICAgICAgICAgICAgLy8gc2luY2Ugd2UncmUgbGVhdmluZyBpdCBiZWhpbmQgb24gdGhpcyBub2RlLlxuXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gU29tZVJldHJ5TGFuZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3V0T2ZmVGFpbElmTmVlZGVkKHJlbmRlclN0YXRlLCBmYWxzZSk7XG4gICAgICAgICAgfSAvLyBOZXh0IHdlJ3JlIGdvaW5nIHRvIHJlbmRlciB0aGUgdGFpbC5cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEFwcGVuZCB0aGUgcmVuZGVyZWQgcm93IHRvIHRoZSBjaGlsZCBsaXN0LlxuICAgICAgICAgIGlmICghZGlkU3VzcGVuZEFscmVhZHkpIHtcbiAgICAgICAgICAgIHZhciBfc3VzcGVuZGVkID0gZmluZEZpcnN0U3VzcGVuZGVkKHJlbmRlcmVkVGFpbCk7XG5cbiAgICAgICAgICAgIGlmIChfc3VzcGVuZGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgICAgICAgICAgIGRpZFN1c3BlbmRBbHJlYWR5ID0gdHJ1ZTsgLy8gRW5zdXJlIHdlIHRyYW5zZmVyIHRoZSB1cGRhdGUgcXVldWUgdG8gdGhlIHBhcmVudCBzbyB0aGF0IGl0IGRvZXNuJ3RcbiAgICAgICAgICAgICAgLy8gZ2V0IGxvc3QgaWYgdGhpcyByb3cgZW5kcyB1cCBkcm9wcGVkIGR1cmluZyBhIHNlY29uZCBwYXNzLlxuXG4gICAgICAgICAgICAgIHZhciBfbmV3VGhlbmFibGVzID0gX3N1c3BlbmRlZC51cGRhdGVRdWV1ZTtcblxuICAgICAgICAgICAgICBpZiAoX25ld1RoZW5hYmxlcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gX25ld1RoZW5hYmxlcztcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIHRydWUpOyAvLyBUaGlzIG1pZ2h0IGhhdmUgYmVlbiBtb2RpZmllZC5cblxuICAgICAgICAgICAgICBpZiAocmVuZGVyU3RhdGUudGFpbCA9PT0gbnVsbCAmJiByZW5kZXJTdGF0ZS50YWlsTW9kZSA9PT0gJ2hpZGRlbicgJiYgIXJlbmRlcmVkVGFpbC5hbHRlcm5hdGUgJiYgIWdldElzSHlkcmF0aW5nKCkgLy8gV2UgZG9uJ3QgY3V0IGl0IGlmIHdlJ3JlIGh5ZHJhdGluZy5cbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAvLyBXZSdyZSBkb25lLlxuICAgICAgICAgICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCAvLyBUaGUgdGltZSBpdCB0b29rIHRvIHJlbmRlciBsYXN0IHJvdyBpcyBncmVhdGVyIHRoYW4gdGhlIHJlbWFpbmluZ1xuICAgICAgICAgICAgLy8gdGltZSB3ZSBoYXZlIHRvIHJlbmRlci4gU28gcmVuZGVyaW5nIG9uZSBtb3JlIHJvdyB3b3VsZCBsaWtlbHlcbiAgICAgICAgICAgIC8vIGV4Y2VlZCBpdC5cbiAgICAgICAgICAgIG5vdygpICogMiAtIHJlbmRlclN0YXRlLnJlbmRlcmluZ1N0YXJ0VGltZSA+IGdldFJlbmRlclRhcmdldFRpbWUoKSAmJiByZW5kZXJMYW5lcyAhPT0gT2Zmc2NyZWVuTGFuZSkge1xuICAgICAgICAgICAgICAvLyBXZSBoYXZlIG5vdyBwYXNzZWQgb3VyIENQVSBkZWFkbGluZSBhbmQgd2UnbGwganVzdCBnaXZlIHVwIGZ1cnRoZXJcbiAgICAgICAgICAgICAgLy8gYXR0ZW1wdHMgdG8gcmVuZGVyIHRoZSBtYWluIGNvbnRlbnQgYW5kIG9ubHkgcmVuZGVyIGZhbGxiYWNrcy5cbiAgICAgICAgICAgICAgLy8gVGhlIGFzc3VtcHRpb24gaXMgdGhhdCB0aGlzIGlzIHVzdWFsbHkgZmFzdGVyLlxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICAgICAgICBkaWRTdXNwZW5kQWxyZWFkeSA9IHRydWU7XG4gICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgZmFsc2UpOyAvLyBTaW5jZSBub3RoaW5nIGFjdHVhbGx5IHN1c3BlbmRlZCwgdGhlcmUgd2lsbCBub3RoaW5nIHRvIHBpbmcgdGhpc1xuICAgICAgICAgICAgICAvLyB0byBnZXQgaXQgc3RhcnRlZCBiYWNrIHVwIHRvIGF0dGVtcHQgdGhlIG5leHQgaXRlbS4gV2hpbGUgaW4gdGVybXNcbiAgICAgICAgICAgICAgLy8gb2YgcHJpb3JpdHkgdGhpcyB3b3JrIGhhcyB0aGUgc2FtZSBwcmlvcml0eSBhcyB0aGlzIGN1cnJlbnQgcmVuZGVyLFxuICAgICAgICAgICAgICAvLyBpdCdzIG5vdCBwYXJ0IG9mIHRoZSBzYW1lIHRyYW5zaXRpb24gb25jZSB0aGUgdHJhbnNpdGlvbiBoYXNcbiAgICAgICAgICAgICAgLy8gY29tbWl0dGVkLiBJZiBpdCdzIHN5bmMsIHdlIHN0aWxsIHdhbnQgdG8geWllbGQgc28gdGhhdCBpdCBjYW4gYmVcbiAgICAgICAgICAgICAgLy8gcGFpbnRlZC4gQ29uY2VwdHVhbGx5LCB0aGlzIGlzIHJlYWxseSB0aGUgc2FtZSBhcyBwaW5naW5nLlxuICAgICAgICAgICAgICAvLyBXZSBjYW4gdXNlIGFueSBSZXRyeUxhbmUgZXZlbiBpZiBpdCdzIHRoZSBvbmUgY3VycmVudGx5IHJlbmRlcmluZ1xuICAgICAgICAgICAgICAvLyBzaW5jZSB3ZSdyZSBsZWF2aW5nIGl0IGJlaGluZCBvbiB0aGlzIG5vZGUuXG5cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBTb21lUmV0cnlMYW5lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChyZW5kZXJTdGF0ZS5pc0JhY2t3YXJkcykge1xuICAgICAgICAgICAgLy8gVGhlIGVmZmVjdCBsaXN0IG9mIHRoZSBiYWNrd2FyZHMgdGFpbCB3aWxsIGhhdmUgYmVlbiBhZGRlZFxuICAgICAgICAgICAgLy8gdG8gdGhlIGVuZC4gVGhpcyBicmVha3MgdGhlIGd1YXJhbnRlZSB0aGF0IGxpZmUtY3ljbGVzIGZpcmUgaW5cbiAgICAgICAgICAgIC8vIHNpYmxpbmcgb3JkZXIgYnV0IHRoYXQgaXNuJ3QgYSBzdHJvbmcgZ3VhcmFudGVlIHByb21pc2VkIGJ5IFJlYWN0LlxuICAgICAgICAgICAgLy8gRXNwZWNpYWxseSBzaW5jZSB0aGVzZSBtaWdodCBhbHNvIGp1c3QgcG9wIGluIGR1cmluZyBmdXR1cmUgY29tbWl0cy5cbiAgICAgICAgICAgIC8vIEFwcGVuZCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0LlxuICAgICAgICAgICAgcmVuZGVyZWRUYWlsLnNpYmxpbmcgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmVuZGVyZWRUYWlsO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgcHJldmlvdXNTaWJsaW5nID0gcmVuZGVyU3RhdGUubGFzdDtcblxuICAgICAgICAgICAgaWYgKHByZXZpb3VzU2libGluZyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICBwcmV2aW91c1NpYmxpbmcuc2libGluZyA9IHJlbmRlcmVkVGFpbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmVuZGVyZWRUYWlsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZW5kZXJTdGF0ZS5sYXN0ID0gcmVuZGVyZWRUYWlsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZW5kZXJTdGF0ZS50YWlsICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2Ugc3RpbGwgaGF2ZSB0YWlsIHJvd3MgdG8gcmVuZGVyLlxuICAgICAgICAgIC8vIFBvcCBhIHJvdy5cbiAgICAgICAgICB2YXIgbmV4dCA9IHJlbmRlclN0YXRlLnRhaWw7XG4gICAgICAgICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nID0gbmV4dDtcbiAgICAgICAgICByZW5kZXJTdGF0ZS50YWlsID0gbmV4dC5zaWJsaW5nO1xuICAgICAgICAgIHJlbmRlclN0YXRlLnJlbmRlcmluZ1N0YXJ0VGltZSA9IG5vdygpO1xuICAgICAgICAgIG5leHQuc2libGluZyA9IG51bGw7IC8vIFJlc3RvcmUgdGhlIGNvbnRleHQuXG4gICAgICAgICAgLy8gVE9ETzogV2UgY2FuIHByb2JhYmx5IGp1c3QgYXZvaWQgcG9wcGluZyBpdCBpbnN0ZWFkIGFuZCBvbmx5XG4gICAgICAgICAgLy8gc2V0dGluZyBpdCB0aGUgZmlyc3QgdGltZSB3ZSBnbyBmcm9tIG5vdCBzdXNwZW5kZWQgdG8gc3VzcGVuZGVkLlxuXG4gICAgICAgICAgdmFyIHN1c3BlbnNlQ29udGV4dCA9IHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudDtcblxuICAgICAgICAgIGlmIChkaWRTdXNwZW5kQWxyZWFkeSkge1xuICAgICAgICAgICAgc3VzcGVuc2VDb250ZXh0ID0gc2V0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQsIEZvcmNlU3VzcGVuc2VGYWxsYmFjayk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1c3BlbnNlQ29udGV4dCA9IHNldERlZmF1bHRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuc2VDb250ZXh0KTsgLy8gRG8gYSBwYXNzIG92ZXIgdGhlIG5leHQgcm93LlxuICAgICAgICAgIC8vIERvbid0IGJ1YmJsZSBwcm9wZXJ0aWVzIGluIHRoaXMgY2FzZS5cblxuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9XG5cbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTY29wZUNvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgIGNhc2UgTGVnYWN5SGlkZGVuQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBwb3BSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHZhciBfbmV4dFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgdmFyIG5leHRJc0hpZGRlbiA9IF9uZXh0U3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgX3ByZXZTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICB2YXIgcHJldklzSGlkZGVuID0gX3ByZXZTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICAgIGlmIChwcmV2SXNIaWRkZW4gIT09IG5leHRJc0hpZGRlbiAmJiAoIC8vIExlZ2FjeUhpZGRlbiBkb2Vzbid0IGRvIGFueSBoaWRpbmcgXHUyMDE0IGl0IG9ubHkgcHJlLXJlbmRlcnMuXG4gICAgICAgICAgIWVuYWJsZUxlZ2FjeUhpZGRlbiApKSB7XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBWaXNpYmlsaXR5O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbmV4dElzSGlkZGVuIHx8ICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBEb24ndCBidWJibGUgcHJvcGVydGllcyBmb3IgaGlkZGVuIGNoaWxkcmVuIHVubGVzcyB3ZSdyZSByZW5kZXJpbmdcbiAgICAgICAgICAvLyBhdCBvZmZzY3JlZW4gcHJpb3JpdHkuXG4gICAgICAgICAgaWYgKGluY2x1ZGVzU29tZUxhbmUoc3VidHJlZVJlbmRlckxhbmVzLCBPZmZzY3JlZW5MYW5lKSkge1xuICAgICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgd2FzIGFuIGluc2VydGlvbiBvciB1cGRhdGUgaW4gdGhlIGhpZGRlbiBzdWJ0cmVlLlxuICAgICAgICAgICAgICAvLyBJZiBzbywgd2UgbmVlZCB0byBoaWRlIHRob3NlIG5vZGVzIGluIHRoZSBjb21taXQgcGhhc2UsIHNvXG4gICAgICAgICAgICAgIC8vIHNjaGVkdWxlIGEgdmlzaWJpbGl0eSBlZmZlY3QuXG4gICAgICAgICAgICAgIGlmICggd29ya0luUHJvZ3Jlc3Muc3VidHJlZUZsYWdzICYgKFBsYWNlbWVudCB8IFVwZGF0ZSkpIHtcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBWaXNpYmlsaXR5O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBDYWNoZUNvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgVHJhY2luZ01hcmtlckNvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gdW5pdCBvZiB3b3JrIHRhZyAoXCIgKyB3b3JrSW5Qcm9ncmVzcy50YWcgKyBcIikuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBcIiArICdSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG59XG5cbmZ1bmN0aW9uIHVud2luZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIC8vIE5vdGU6IFRoaXMgaW50ZW50aW9uYWxseSBkb2Vzbid0IGNoZWNrIGlmIHdlJ3JlIGh5ZHJhdGluZyBiZWNhdXNlIGNvbXBhcmluZ1xuICAvLyB0byB0aGUgY3VycmVudCB0cmVlIHByb3ZpZGVyIGZpYmVyIGlzIGp1c3QgYXMgZmFzdCBhbmQgbGVzcyBlcnJvci1wcm9uZS5cbiAgLy8gSWRlYWxseSB3ZSB3b3VsZCBoYXZlIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIHRoZSB3b3JrIGxvb3Agb25seVxuICAvLyBmb3IgaHlkcmF0aW9uLlxuICBwb3BUcmVlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgIHBvcENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZsYWdzID0gd29ya0luUHJvZ3Jlc3MuZmxhZ3M7XG5cbiAgICAgICAgaWYgKGZsYWdzICYgU2hvdWxkQ2FwdHVyZSkge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID0gZmxhZ3MgJiB+U2hvdWxkQ2FwdHVyZSB8IERpZENhcHR1cmU7XG5cbiAgICAgICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyQWN0dWFsRHVyYXRpb24od29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHJvb3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgICAgIHBvcEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICBwb3BUb3BMZXZlbENvbnRleHRPYmplY3Qod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXNldFdvcmtJblByb2dyZXNzVmVyc2lvbnMoKTtcbiAgICAgICAgdmFyIF9mbGFncyA9IHdvcmtJblByb2dyZXNzLmZsYWdzO1xuXG4gICAgICAgIGlmICgoX2ZsYWdzICYgU2hvdWxkQ2FwdHVyZSkgIT09IE5vRmxhZ3MgJiYgKF9mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgLy8gVGhlcmUgd2FzIGFuIGVycm9yIGR1cmluZyByZW5kZXIgdGhhdCB3YXNuJ3QgY2FwdHVyZWQgYnkgYSBzdXNwZW5zZVxuICAgICAgICAgIC8vIGJvdW5kYXJ5LiBEbyBhIHNlY29uZCBwYXNzIG9uIHRoZSByb290IHRvIHVubW91bnQgdGhlIGNoaWxkcmVuLlxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID0gX2ZsYWdzICYgflNob3VsZENhcHR1cmUgfCBEaWRDYXB0dXJlO1xuICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgfSAvLyBXZSB1bndvdW5kIHRvIHRoZSByb290IHdpdGhvdXQgY29tcGxldGluZyBpdC4gRXhpdC5cblxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICAvLyBUT0RPOiBwb3BIeWRyYXRpb25TdGF0ZVxuICAgICAgICBwb3BIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgdmFyIHN1c3BlbnNlU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gICAgICAgIGlmIChzdXNwZW5zZVN0YXRlICE9PSBudWxsICYmIHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhyZXcgaW4gbmV3bHkgbW91bnRlZCBkZWh5ZHJhdGVkIGNvbXBvbmVudC4gVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gJyArICdSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIF9mbGFnczIgPSB3b3JrSW5Qcm9ncmVzcy5mbGFncztcblxuICAgICAgICBpZiAoX2ZsYWdzMiAmIFNob3VsZENhcHR1cmUpIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IF9mbGFnczIgJiB+U2hvdWxkQ2FwdHVyZSB8IERpZENhcHR1cmU7IC8vIENhcHR1cmVkIGEgc3VzcGVuc2UgZWZmZWN0LiBSZS1yZW5kZXIgdGhlIGJvdW5kYXJ5LlxuXG4gICAgICAgICAgaWYgKCAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgICB0cmFuc2ZlckFjdHVhbER1cmF0aW9uKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBwb3BTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MpOyAvLyBTdXNwZW5zZUxpc3QgZG9lc24ndCBhY3R1YWxseSBjYXRjaCBhbnl0aGluZy4gSXQgc2hvdWxkJ3ZlIGJlZW5cbiAgICAgICAgLy8gY2F1Z2h0IGJ5IGEgbmVzdGVkIGJvdW5kYXJ5LiBJZiBub3QsIGl0IHNob3VsZCBidWJibGUgdGhyb3VnaC5cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHBvcEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgIHZhciBjb250ZXh0ID0gd29ya0luUHJvZ3Jlc3MudHlwZS5fY29udGV4dDtcbiAgICAgIHBvcFByb3ZpZGVyKGNvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgY2FzZSBMZWdhY3lIaWRkZW5Db21wb25lbnQ6XG4gICAgICBwb3BSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgQ2FjaGVDb21wb25lbnQ6XG5cbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVud2luZEludGVycnVwdGVkV29yayhjdXJyZW50LCBpbnRlcnJ1cHRlZFdvcmssIHJlbmRlckxhbmVzKSB7XG4gIC8vIE5vdGU6IFRoaXMgaW50ZW50aW9uYWxseSBkb2Vzbid0IGNoZWNrIGlmIHdlJ3JlIGh5ZHJhdGluZyBiZWNhdXNlIGNvbXBhcmluZ1xuICAvLyB0byB0aGUgY3VycmVudCB0cmVlIHByb3ZpZGVyIGZpYmVyIGlzIGp1c3QgYXMgZmFzdCBhbmQgbGVzcyBlcnJvci1wcm9uZS5cbiAgLy8gSWRlYWxseSB3ZSB3b3VsZCBoYXZlIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIHRoZSB3b3JrIGxvb3Agb25seVxuICAvLyBmb3IgaHlkcmF0aW9uLlxuICBwb3BUcmVlQ29udGV4dChpbnRlcnJ1cHRlZFdvcmspO1xuXG4gIHN3aXRjaCAoaW50ZXJydXB0ZWRXb3JrLnRhZykge1xuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBjaGlsZENvbnRleHRUeXBlcyA9IGludGVycnVwdGVkV29yay50eXBlLmNoaWxkQ29udGV4dFR5cGVzO1xuXG4gICAgICAgIGlmIChjaGlsZENvbnRleHRUeXBlcyAhPT0gbnVsbCAmJiBjaGlsZENvbnRleHRUeXBlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcG9wQ29udGV4dChpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAge1xuICAgICAgICB2YXIgcm9vdCA9IGludGVycnVwdGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgIHBvcEhvc3RDb250YWluZXIoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgICAgcG9wVG9wTGV2ZWxDb250ZXh0T2JqZWN0KGludGVycnVwdGVkV29yayk7XG4gICAgICAgIHJlc2V0V29ya0luUHJvZ3Jlc3NWZXJzaW9ucygpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wSG9zdENvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBwb3BIb3N0Q29udGFpbmVyKGludGVycnVwdGVkV29yayk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICBwb3BTdXNwZW5zZUNvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICBwb3BTdXNwZW5zZUNvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICB2YXIgY29udGV4dCA9IGludGVycnVwdGVkV29yay50eXBlLl9jb250ZXh0O1xuICAgICAgcG9wUHJvdmlkZXIoY29udGV4dCwgaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgY2FzZSBMZWdhY3lIaWRkZW5Db21wb25lbnQ6XG4gICAgICBwb3BSZW5kZXJMYW5lcyhpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgYnJlYWs7XG4gIH1cbn1cblxudmFyIGRpZFdhcm5BYm91dFVuZGVmaW5lZFNuYXBzaG90QmVmb3JlVXBkYXRlID0gbnVsbDtcblxue1xuICBkaWRXYXJuQWJvdXRVbmRlZmluZWRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9IG5ldyBTZXQoKTtcbn0gLy8gVXNlZCBkdXJpbmcgdGhlIGNvbW1pdCBwaGFzZSB0byB0cmFjayB0aGUgc3RhdGUgb2YgdGhlIE9mZnNjcmVlbiBjb21wb25lbnQgc3RhY2suXG4vLyBBbGxvd3MgdXMgdG8gYXZvaWQgdHJhdmVyc2luZyB0aGUgcmV0dXJuIHBhdGggdG8gZmluZCB0aGUgbmVhcmVzdCBPZmZzY3JlZW4gYW5jZXN0b3IuXG4vLyBPbmx5IHVzZWQgd2hlbiBlbmFibGVTdXNwZW5zZUxheW91dEVmZmVjdFNlbWFudGljcyBpcyBlbmFibGVkLlxuXG5cbnZhciBvZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4gPSBmYWxzZTtcbnZhciBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gZmFsc2U7XG52YXIgUG9zc2libHlXZWFrU2V0ID0gdHlwZW9mIFdlYWtTZXQgPT09ICdmdW5jdGlvbicgPyBXZWFrU2V0IDogU2V0O1xudmFyIG5leHRFZmZlY3QgPSBudWxsOyAvLyBVc2VkIGZvciBQcm9maWxpbmcgYnVpbGRzIHRvIHRyYWNrIHVwZGF0ZXJzLlxuXG52YXIgaW5Qcm9ncmVzc0xhbmVzID0gbnVsbDtcbnZhciBpblByb2dyZXNzUm9vdCA9IG51bGw7XG5mdW5jdGlvbiByZXBvcnRVbmNhdWdodEVycm9ySW5ERVYoZXJyb3IpIHtcbiAgLy8gV3JhcHBpbmcgZWFjaCBzbWFsbCBwYXJ0IG9mIHRoZSBjb21taXQgcGhhc2UgaW50byBhIGd1YXJkZWRcbiAgLy8gY2FsbGJhY2sgaXMgYSBiaXQgdG9vIHNsb3cgKGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzIxNjY2KS5cbiAgLy8gQnV0IHdlIHJlbHkgb24gaXQgdG8gc3VyZmFjZSBlcnJvcnMgdG8gREVWIHRvb2xzIGxpa2Ugb3ZlcmxheXNcbiAgLy8gKGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMjE3MTIpLlxuICAvLyBBcyBhIGNvbXByb21pc2UsIHJldGhyb3cgb25seSBjYXVnaHQgZXJyb3JzIGluIGEgZ3VhcmQuXG4gIHtcbiAgICBpbnZva2VHdWFyZGVkQ2FsbGJhY2sobnVsbCwgZnVuY3Rpb24gKCkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG4gICAgY2xlYXJDYXVnaHRFcnJvcigpO1xuICB9XG59XG5cbnZhciBjYWxsQ29tcG9uZW50V2lsbFVubW91bnRXaXRoVGltZXIgPSBmdW5jdGlvbiAoY3VycmVudCwgaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gIGluc3RhbmNlLnN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuXG4gIGlmICggY3VycmVudC5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICB0cnkge1xuICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVubW91bnQoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oY3VycmVudCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVbm1vdW50KCk7XG4gIH1cbn07IC8vIENhcHR1cmUgZXJyb3JzIHNvIHRoZXkgZG9uJ3QgaW50ZXJydXB0IG1vdW50aW5nLlxuXG5cbmZ1bmN0aW9uIHNhZmVseUNhbGxDb21taXRIb29rTGF5b3V0RWZmZWN0TGlzdE1vdW50KGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpIHtcbiAgdHJ5IHtcbiAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KExheW91dCwgY3VycmVudCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IpO1xuICB9XG59IC8vIENhcHR1cmUgZXJyb3JzIHNvIHRoZXkgZG9uJ3QgaW50ZXJydXB0IHVubW91bnRpbmcuXG5cblxuZnVuY3Rpb24gc2FmZWx5Q2FsbENvbXBvbmVudFdpbGxVbm1vdW50KGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGluc3RhbmNlKSB7XG4gIHRyeSB7XG4gICAgY2FsbENvbXBvbmVudFdpbGxVbm1vdW50V2l0aFRpbWVyKGN1cnJlbnQsIGluc3RhbmNlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvcik7XG4gIH1cbn0gLy8gQ2FwdHVyZSBlcnJvcnMgc28gdGhleSBkb24ndCBpbnRlcnJ1cHQgbW91bnRpbmcuXG5cblxuZnVuY3Rpb24gc2FmZWx5Q2FsbENvbXBvbmVudERpZE1vdW50KGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGluc3RhbmNlKSB7XG4gIHRyeSB7XG4gICAgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvcik7XG4gIH1cbn0gLy8gQ2FwdHVyZSBlcnJvcnMgc28gdGhleSBkb24ndCBpbnRlcnJ1cHQgbW91bnRpbmcuXG5cblxuZnVuY3Rpb24gc2FmZWx5QXR0YWNoUmVmKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpIHtcbiAgdHJ5IHtcbiAgICBjb21taXRBdHRhY2hSZWYoY3VycmVudCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNhZmVseURldGFjaFJlZihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKSB7XG4gIHZhciByZWYgPSBjdXJyZW50LnJlZjtcblxuICBpZiAocmVmICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciByZXRWYWw7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChlbmFibGVQcm9maWxlclRpbWVyICYmIGVuYWJsZVByb2ZpbGVyQ29tbWl0SG9va3MgJiYgY3VycmVudC5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgcmV0VmFsID0gcmVmKG51bGwpO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihjdXJyZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0VmFsID0gcmVmKG51bGwpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvcik7XG4gICAgICB9XG5cbiAgICAgIHtcbiAgICAgICAgaWYgKHR5cGVvZiByZXRWYWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBlcnJvcignVW5leHBlY3RlZCByZXR1cm4gdmFsdWUgZnJvbSBhIGNhbGxiYWNrIHJlZiBpbiAlcy4gJyArICdBIGNhbGxiYWNrIHJlZiBzaG91bGQgbm90IHJldHVybiBhIGZ1bmN0aW9uLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoY3VycmVudCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2FmZWx5Q2FsbERlc3Ryb3koY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVzdHJveSkge1xuICB0cnkge1xuICAgIGRlc3Ryb3koKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvcik7XG4gIH1cbn1cblxudmFyIGZvY3VzZWRJbnN0YW5jZUhhbmRsZSA9IG51bGw7XG52YXIgc2hvdWxkRmlyZUFmdGVyQWN0aXZlSW5zdGFuY2VCbHVyID0gZmFsc2U7XG5mdW5jdGlvbiBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmlyc3RDaGlsZCkge1xuICBmb2N1c2VkSW5zdGFuY2VIYW5kbGUgPSBwcmVwYXJlRm9yQ29tbWl0KHJvb3QuY29udGFpbmVySW5mbyk7XG4gIG5leHRFZmZlY3QgPSBmaXJzdENoaWxkO1xuICBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHNfYmVnaW4oKTsgLy8gV2Ugbm8gbG9uZ2VyIG5lZWQgdG8gdHJhY2sgdGhlIGFjdGl2ZSBpbnN0YW5jZSBmaWJlclxuXG4gIHZhciBzaG91bGRGaXJlID0gc2hvdWxkRmlyZUFmdGVyQWN0aXZlSW5zdGFuY2VCbHVyO1xuICBzaG91bGRGaXJlQWZ0ZXJBY3RpdmVJbnN0YW5jZUJsdXIgPSBmYWxzZTtcbiAgZm9jdXNlZEluc3RhbmNlSGFuZGxlID0gbnVsbDtcbiAgcmV0dXJuIHNob3VsZEZpcmU7XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c19iZWdpbigpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0OyAvLyBUaGlzIHBoYXNlIGlzIG9ubHkgdXNlZCBmb3IgYmVmb3JlQWN0aXZlSW5zdGFuY2VCbHVyLlxuXG4gICAgdmFyIGNoaWxkID0gZmliZXIuY2hpbGQ7XG5cbiAgICBpZiAoKGZpYmVyLnN1YnRyZWVGbGFncyAmIEJlZm9yZU11dGF0aW9uTWFzaykgIT09IE5vRmxhZ3MgJiYgY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGNoaWxkLnJldHVybiA9IGZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IGNoaWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHNfY29tcGxldGUoKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzX2NvbXBsZXRlKCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG4gICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHNPbkZpYmVyKGZpYmVyKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgIH1cblxuICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgdmFyIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nO1xuXG4gICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgIHNpYmxpbmcucmV0dXJuID0gZmliZXIucmV0dXJuO1xuICAgICAgbmV4dEVmZmVjdCA9IHNpYmxpbmc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbmV4dEVmZmVjdCA9IGZpYmVyLnJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHNPbkZpYmVyKGZpbmlzaGVkV29yaykge1xuICB2YXIgY3VycmVudCA9IGZpbmlzaGVkV29yay5hbHRlcm5hdGU7XG4gIHZhciBmbGFncyA9IGZpbmlzaGVkV29yay5mbGFncztcblxuICBpZiAoKGZsYWdzICYgU25hcHNob3QpICE9PSBOb0ZsYWdzKSB7XG4gICAgc2V0Q3VycmVudEZpYmVyKGZpbmlzaGVkV29yayk7XG5cbiAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBwcmV2UHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gICAgICAgICAgICB2YXIgcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTsgLy8gV2UgY291bGQgdXBkYXRlIGluc3RhbmNlIHByb3BzIGFuZCBzdGF0ZSBoZXJlLFxuICAgICAgICAgICAgLy8gYnV0IGluc3RlYWQgd2UgcmVseSBvbiB0aGVtIGJlaW5nIHNldCBkdXJpbmcgbGFzdCByZW5kZXIuXG4gICAgICAgICAgICAvLyBUT0RPOiByZXZpc2l0IHRoaXMgd2hlbiB3ZSBpbXBsZW1lbnQgcmVzdW1pbmcuXG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWYgKGZpbmlzaGVkV29yay50eXBlID09PSBmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgJiYgIWRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UucHJvcHMgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzKSB7XG4gICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgcHJvcHMgdG8gbWF0Y2ggbWVtb2l6ZWQgcHJvcHMgYmVmb3JlICcgKyAnZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnByb3BzYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnN0YXRlICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHN0YXRlIHRvIG1hdGNoIG1lbW9pemVkIHN0YXRlIGJlZm9yZSAnICsgJ2dldFNuYXBzaG90QmVmb3JlVXBkYXRlLiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5zdGF0ZWAuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgc25hcHNob3QgPSBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgPT09IGZpbmlzaGVkV29yay50eXBlID8gcHJldlByb3BzIDogcmVzb2x2ZURlZmF1bHRQcm9wcyhmaW5pc2hlZFdvcmsudHlwZSwgcHJldlByb3BzKSwgcHJldlN0YXRlKTtcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB2YXIgZGlkV2FyblNldCA9IGRpZFdhcm5BYm91dFVuZGVmaW5lZFNuYXBzaG90QmVmb3JlVXBkYXRlO1xuXG4gICAgICAgICAgICAgIGlmIChzbmFwc2hvdCA9PT0gdW5kZWZpbmVkICYmICFkaWRXYXJuU2V0LmhhcyhmaW5pc2hlZFdvcmsudHlwZSkpIHtcbiAgICAgICAgICAgICAgICBkaWRXYXJuU2V0LmFkZChmaW5pc2hlZFdvcmsudHlwZSk7XG5cbiAgICAgICAgICAgICAgICBlcnJvcignJXMuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKTogQSBzbmFwc2hvdCB2YWx1ZSAob3IgbnVsbCkgJyArICdtdXN0IGJlIHJldHVybmVkLiBZb3UgaGF2ZSByZXR1cm5lZCB1bmRlZmluZWQuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9IHNuYXBzaG90O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgcm9vdCA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgICAgICBjbGVhckNvbnRhaW5lcihyb290LmNvbnRhaW5lckluZm8pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBjYXNlIEluY29tcGxldGVDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgLy8gTm90aGluZyB0byBkbyBmb3IgdGhlc2UgY29tcG9uZW50IHR5cGVzXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIHVuaXQgb2Ygd29yayB0YWcgc2hvdWxkIG5vdCBoYXZlIHNpZGUtZWZmZWN0cy4gVGhpcyBlcnJvciBpcyAnICsgJ2xpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoZmxhZ3MsIGZpbmlzaGVkV29yaywgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcikge1xuICB2YXIgdXBkYXRlUXVldWUgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG4gIHZhciBsYXN0RWZmZWN0ID0gdXBkYXRlUXVldWUgIT09IG51bGwgPyB1cGRhdGVRdWV1ZS5sYXN0RWZmZWN0IDogbnVsbDtcblxuICBpZiAobGFzdEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaXJzdEVmZmVjdCA9IGxhc3RFZmZlY3QubmV4dDtcbiAgICB2YXIgZWZmZWN0ID0gZmlyc3RFZmZlY3Q7XG5cbiAgICBkbyB7XG4gICAgICBpZiAoKGVmZmVjdC50YWcgJiBmbGFncykgPT09IGZsYWdzKSB7XG4gICAgICAgIC8vIFVubW91bnRcbiAgICAgICAgdmFyIGRlc3Ryb3kgPSBlZmZlY3QuZGVzdHJveTtcbiAgICAgICAgZWZmZWN0LmRlc3Ryb3kgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKGRlc3Ryb3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBQYXNzaXZlJDEpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RhcnRlZChmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJiBMYXlvdXQpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgbWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdGFydGVkKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKChmbGFncyAmIEluc2VydGlvbikgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICBzZXRJc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2FmZWx5Q2FsbERlc3Ryb3koZmluaXNoZWRXb3JrLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZXN0cm95KTtcblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBJbnNlcnRpb24pICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgc2V0SXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0KGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoKGZsYWdzICYgUGFzc2l2ZSQxKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0b3BwZWQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYgTGF5b3V0KSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RvcHBlZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBlZmZlY3QgPSBlZmZlY3QubmV4dDtcbiAgICB9IHdoaWxlIChlZmZlY3QgIT09IGZpcnN0RWZmZWN0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KGZsYWdzLCBmaW5pc2hlZFdvcmspIHtcbiAgdmFyIHVwZGF0ZVF1ZXVlID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlO1xuICB2YXIgbGFzdEVmZmVjdCA9IHVwZGF0ZVF1ZXVlICE9PSBudWxsID8gdXBkYXRlUXVldWUubGFzdEVmZmVjdCA6IG51bGw7XG5cbiAgaWYgKGxhc3RFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmlyc3RFZmZlY3QgPSBsYXN0RWZmZWN0Lm5leHQ7XG4gICAgdmFyIGVmZmVjdCA9IGZpcnN0RWZmZWN0O1xuXG4gICAgZG8ge1xuICAgICAgaWYgKChlZmZlY3QudGFnICYgZmxhZ3MpID09PSBmbGFncykge1xuICAgICAgICB7XG4gICAgICAgICAgaWYgKChmbGFncyAmIFBhc3NpdmUkMSkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0YXJ0ZWQoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmIExheW91dCkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgbWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RhcnRlZChmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBNb3VudFxuXG5cbiAgICAgICAgdmFyIGNyZWF0ZSA9IGVmZmVjdC5jcmVhdGU7XG5cbiAgICAgICAge1xuICAgICAgICAgIGlmICgoZmxhZ3MgJiBJbnNlcnRpb24pICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgIHNldElzUnVubmluZ0luc2VydGlvbkVmZmVjdCh0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBlZmZlY3QuZGVzdHJveSA9IGNyZWF0ZSgpO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoKGZsYWdzICYgSW5zZXJ0aW9uKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICBzZXRJc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QoZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoKGZsYWdzICYgUGFzc2l2ZSQxKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RvcHBlZCgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYgTGF5b3V0KSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdG9wcGVkKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAge1xuICAgICAgICAgIHZhciBkZXN0cm95ID0gZWZmZWN0LmRlc3Ryb3k7XG5cbiAgICAgICAgICBpZiAoZGVzdHJveSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBkZXN0cm95ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YXIgaG9va05hbWUgPSB2b2lkIDA7XG5cbiAgICAgICAgICAgIGlmICgoZWZmZWN0LnRhZyAmIExheW91dCkgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICAgICAgaG9va05hbWUgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGVmZmVjdC50YWcgJiBJbnNlcnRpb24pICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgICAgIGhvb2tOYW1lID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBob29rTmFtZSA9ICd1c2VFZmZlY3QnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgYWRkZW5kdW0gPSB2b2lkIDA7XG5cbiAgICAgICAgICAgIGlmIChkZXN0cm95ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIGFkZGVuZHVtID0gJyBZb3UgcmV0dXJuZWQgbnVsbC4gSWYgeW91ciBlZmZlY3QgZG9lcyBub3QgcmVxdWlyZSBjbGVhbiAnICsgJ3VwLCByZXR1cm4gdW5kZWZpbmVkIChvciBub3RoaW5nKS4nO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGVzdHJveS50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIGFkZGVuZHVtID0gJ1xcblxcbkl0IGxvb2tzIGxpa2UgeW91IHdyb3RlICcgKyBob29rTmFtZSArICcoYXN5bmMgKCkgPT4gLi4uKSBvciByZXR1cm5lZCBhIFByb21pc2UuICcgKyAnSW5zdGVhZCwgd3JpdGUgdGhlIGFzeW5jIGZ1bmN0aW9uIGluc2lkZSB5b3VyIGVmZmVjdCAnICsgJ2FuZCBjYWxsIGl0IGltbWVkaWF0ZWx5OlxcblxcbicgKyBob29rTmFtZSArICcoKCkgPT4ge1xcbicgKyAnICBhc3luYyBmdW5jdGlvbiBmZXRjaERhdGEoKSB7XFxuJyArICcgICAgLy8gWW91IGNhbiBhd2FpdCBoZXJlXFxuJyArICcgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBNeUFQSS5nZXREYXRhKHNvbWVJZCk7XFxuJyArICcgICAgLy8gLi4uXFxuJyArICcgIH1cXG4nICsgJyAgZmV0Y2hEYXRhKCk7XFxuJyArIFwifSwgW3NvbWVJZF0pOyAvLyBPciBbXSBpZiBlZmZlY3QgZG9lc24ndCBuZWVkIHByb3BzIG9yIHN0YXRlXFxuXFxuXCIgKyAnTGVhcm4gbW9yZSBhYm91dCBkYXRhIGZldGNoaW5nIHdpdGggSG9va3M6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9ob29rcy1kYXRhLWZldGNoaW5nJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGFkZGVuZHVtID0gJyBZb3UgcmV0dXJuZWQ6ICcgKyBkZXN0cm95O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBlcnJvcignJXMgbXVzdCBub3QgcmV0dXJuIGFueXRoaW5nIGJlc2lkZXMgYSBmdW5jdGlvbiwgJyArICd3aGljaCBpcyB1c2VkIGZvciBjbGVhbi11cC4lcycsIGhvb2tOYW1lLCBhZGRlbmR1bSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGVmZmVjdCA9IGVmZmVjdC5uZXh0O1xuICAgIH0gd2hpbGUgKGVmZmVjdCAhPT0gZmlyc3RFZmZlY3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVFZmZlY3REdXJhdGlvbnMoZmluaXNoZWRSb290LCBmaW5pc2hlZFdvcmspIHtcbiAge1xuICAgIC8vIE9ubHkgUHJvZmlsZXJzIHdpdGggd29yayBpbiB0aGVpciBzdWJ0cmVlIHdpbGwgaGF2ZSBhbiBVcGRhdGUgZWZmZWN0IHNjaGVkdWxlZC5cbiAgICBpZiAoKGZpbmlzaGVkV29yay5mbGFncyAmIFVwZGF0ZSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgICAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBwYXNzaXZlRWZmZWN0RHVyYXRpb24gPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlLnBhc3NpdmVFZmZlY3REdXJhdGlvbjtcbiAgICAgICAgICAgIHZhciBfZmluaXNoZWRXb3JrJG1lbW9pemUgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcyxcbiAgICAgICAgICAgICAgICBpZCA9IF9maW5pc2hlZFdvcmskbWVtb2l6ZS5pZCxcbiAgICAgICAgICAgICAgICBvblBvc3RDb21taXQgPSBfZmluaXNoZWRXb3JrJG1lbW9pemUub25Qb3N0Q29tbWl0OyAvLyBUaGlzIHZhbHVlIHdpbGwgc3RpbGwgcmVmbGVjdCB0aGUgcHJldmlvdXMgY29tbWl0IHBoYXNlLlxuICAgICAgICAgICAgLy8gSXQgZG9lcyBub3QgZ2V0IHJlc2V0IHVudGlsIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBjb21taXQgcGhhc2UuXG5cbiAgICAgICAgICAgIHZhciBjb21taXRUaW1lID0gZ2V0Q29tbWl0VGltZSgpO1xuICAgICAgICAgICAgdmFyIHBoYXNlID0gZmluaXNoZWRXb3JrLmFsdGVybmF0ZSA9PT0gbnVsbCA/ICdtb3VudCcgOiAndXBkYXRlJztcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAoaXNDdXJyZW50VXBkYXRlTmVzdGVkKCkpIHtcbiAgICAgICAgICAgICAgICBwaGFzZSA9ICduZXN0ZWQtdXBkYXRlJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9uUG9zdENvbW1pdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICBvblBvc3RDb21taXQoaWQsIHBoYXNlLCBwYXNzaXZlRWZmZWN0RHVyYXRpb24sIGNvbW1pdFRpbWUpO1xuICAgICAgICAgICAgfSAvLyBCdWJibGUgdGltZXMgdG8gdGhlIG5leHQgbmVhcmVzdCBhbmNlc3RvciBQcm9maWxlci5cbiAgICAgICAgICAgIC8vIEFmdGVyIHdlIHByb2Nlc3MgdGhhdCBQcm9maWxlciwgd2UnbGwgYnViYmxlIGZ1cnRoZXIgdXAuXG5cblxuICAgICAgICAgICAgdmFyIHBhcmVudEZpYmVyID0gZmluaXNoZWRXb3JrLnJldHVybjtcblxuICAgICAgICAgICAgb3V0ZXI6IHdoaWxlIChwYXJlbnRGaWJlciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICBzd2l0Y2ggKHBhcmVudEZpYmVyLnRhZykge1xuICAgICAgICAgICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAgICAgICAgICB2YXIgcm9vdCA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgICAgIHJvb3QucGFzc2l2ZUVmZmVjdER1cmF0aW9uICs9IHBhc3NpdmVFZmZlY3REdXJhdGlvbjtcbiAgICAgICAgICAgICAgICAgIGJyZWFrIG91dGVyO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBQcm9maWxlcjpcbiAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnRTdGF0ZU5vZGUgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgICAgICAgICBwYXJlbnRTdGF0ZU5vZGUucGFzc2l2ZUVmZmVjdER1cmF0aW9uICs9IHBhc3NpdmVFZmZlY3REdXJhdGlvbjtcbiAgICAgICAgICAgICAgICAgIGJyZWFrIG91dGVyO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcGFyZW50RmliZXIgPSBwYXJlbnRGaWJlci5yZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0TGF5b3V0RWZmZWN0T25GaWJlcihmaW5pc2hlZFJvb3QsIGN1cnJlbnQsIGZpbmlzaGVkV29yaywgY29tbWl0dGVkTGFuZXMpIHtcbiAgaWYgKChmaW5pc2hlZFdvcmsuZmxhZ3MgJiBMYXlvdXRNYXNrKSAhPT0gTm9GbGFncykge1xuICAgIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGlmICggIW9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pIHtcbiAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgbGF5b3V0IGVmZmVjdHMgaGF2ZSBhbHJlYWR5IGJlZW4gZGVzdHJveWVkIChkdXJpbmcgbXV0YXRpb24gcGhhc2UpLlxuICAgICAgICAgICAgLy8gVGhpcyBpcyBkb25lIHRvIHByZXZlbnQgc2libGluZyBjb21wb25lbnQgZWZmZWN0cyBmcm9tIGludGVyZmVyaW5nIHdpdGggZWFjaCBvdGhlcixcbiAgICAgICAgICAgIC8vIGUuZy4gYSBkZXN0cm95IGZ1bmN0aW9uIGluIG9uZSBjb21wb25lbnQgc2hvdWxkIG5ldmVyIG92ZXJyaWRlIGEgcmVmIHNldFxuICAgICAgICAgICAgLy8gYnkgYSBjcmVhdGUgZnVuY3Rpb24gaW4gYW5vdGhlciBjb21wb25lbnQgZHVyaW5nIHRoZSBzYW1lIGNvbW1pdC5cbiAgICAgICAgICAgIGlmICggZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KExheW91dCB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KExheW91dCB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcblxuICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsuZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICAgIGlmICghb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikge1xuICAgICAgICAgICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIFdlIGNvdWxkIHVwZGF0ZSBpbnN0YW5jZSBwcm9wcyBhbmQgc3RhdGUgaGVyZSxcbiAgICAgICAgICAgICAgICAvLyBidXQgaW5zdGVhZCB3ZSByZWx5IG9uIHRoZW0gYmVpbmcgc2V0IGR1cmluZyBsYXN0IHJlbmRlci5cbiAgICAgICAgICAgICAgICAvLyBUT0RPOiByZXZpc2l0IHRoaXMgd2hlbiB3ZSBpbXBsZW1lbnQgcmVzdW1pbmcuXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWYgKGZpbmlzaGVkV29yay50eXBlID09PSBmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgJiYgIWRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnByb3BzICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcykge1xuICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBwcm9wcyB0byBtYXRjaCBtZW1vaXplZCBwcm9wcyBiZWZvcmUgJyArICdjb21wb25lbnREaWRNb3VudC4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5zdGF0ZSAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgc3RhdGUgdG8gbWF0Y2ggbWVtb2l6ZWQgc3RhdGUgYmVmb3JlICcgKyAnY29tcG9uZW50RGlkTW91bnQuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQoKTtcbiAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBwcmV2UHJvcHMgPSBmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgPT09IGZpbmlzaGVkV29yay50eXBlID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogcmVzb2x2ZURlZmF1bHRQcm9wcyhmaW5pc2hlZFdvcmsudHlwZSwgY3VycmVudC5tZW1vaXplZFByb3BzKTtcbiAgICAgICAgICAgICAgICB2YXIgcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlOyAvLyBXZSBjb3VsZCB1cGRhdGUgaW5zdGFuY2UgcHJvcHMgYW5kIHN0YXRlIGhlcmUsXG4gICAgICAgICAgICAgICAgLy8gYnV0IGluc3RlYWQgd2UgcmVseSBvbiB0aGVtIGJlaW5nIHNldCBkdXJpbmcgbGFzdCByZW5kZXIuXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogcmV2aXNpdCB0aGlzIHdoZW4gd2UgaW1wbGVtZW50IHJlc3VtaW5nLlxuXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWYgKGZpbmlzaGVkV29yay50eXBlID09PSBmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgJiYgIWRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnByb3BzICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcykge1xuICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBwcm9wcyB0byBtYXRjaCBtZW1vaXplZCBwcm9wcyBiZWZvcmUgJyArICdjb21wb25lbnREaWRVcGRhdGUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnByb3BzYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2Uuc3RhdGUgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHN0YXRlIHRvIG1hdGNoIG1lbW9pemVkIHN0YXRlIGJlZm9yZSAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMuc3RhdGVgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICggZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUsIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlKTtcbiAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSwgaW5zdGFuY2UuX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gLy8gVE9ETzogSSB0aGluayB0aGlzIGlzIG5vdyBhbHdheXMgbm9uLW51bGwgYnkgdGhlIHRpbWUgaXQgcmVhY2hlcyB0aGVcbiAgICAgICAgICAvLyBjb21taXQgcGhhc2UuIENvbnNpZGVyIHJlbW92aW5nIHRoZSB0eXBlIGNoZWNrLlxuXG5cbiAgICAgICAgICB2YXIgdXBkYXRlUXVldWUgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG5cbiAgICAgICAgICBpZiAodXBkYXRlUXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWYgKGZpbmlzaGVkV29yay50eXBlID09PSBmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgJiYgIWRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UucHJvcHMgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzKSB7XG4gICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgcHJvcHMgdG8gbWF0Y2ggbWVtb2l6ZWQgcHJvcHMgYmVmb3JlICcgKyAncHJvY2Vzc2luZyB0aGUgdXBkYXRlIHF1ZXVlLiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5wcm9wc2AuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5zdGF0ZSAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBzdGF0ZSB0byBtYXRjaCBtZW1vaXplZCBzdGF0ZSBiZWZvcmUgJyArICdwcm9jZXNzaW5nIHRoZSB1cGRhdGUgcXVldWUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IC8vIFdlIGNvdWxkIHVwZGF0ZSBpbnN0YW5jZSBwcm9wcyBhbmQgc3RhdGUgaGVyZSxcbiAgICAgICAgICAgIC8vIGJ1dCBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlbSBiZWluZyBzZXQgZHVyaW5nIGxhc3QgcmVuZGVyLlxuICAgICAgICAgICAgLy8gVE9ETzogcmV2aXNpdCB0aGlzIHdoZW4gd2UgaW1wbGVtZW50IHJlc3VtaW5nLlxuXG5cbiAgICAgICAgICAgIGNvbW1pdFVwZGF0ZVF1ZXVlKGZpbmlzaGVkV29yaywgdXBkYXRlUXVldWUsIGluc3RhbmNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICB7XG4gICAgICAgICAgLy8gVE9ETzogSSB0aGluayB0aGlzIGlzIG5vdyBhbHdheXMgbm9uLW51bGwgYnkgdGhlIHRpbWUgaXQgcmVhY2hlcyB0aGVcbiAgICAgICAgICAvLyBjb21taXQgcGhhc2UuIENvbnNpZGVyIHJlbW92aW5nIHRoZSB0eXBlIGNoZWNrLlxuICAgICAgICAgIHZhciBfdXBkYXRlUXVldWUgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG5cbiAgICAgICAgICBpZiAoX3VwZGF0ZVF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgX2luc3RhbmNlID0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKGZpbmlzaGVkV29yay5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay5jaGlsZC50YWcpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgICAgICAgICAgICBfaW5zdGFuY2UgPSBnZXRQdWJsaWNJbnN0YW5jZShmaW5pc2hlZFdvcmsuY2hpbGQuc3RhdGVOb2RlKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgICAgICAgICAgIF9pbnN0YW5jZSA9IGZpbmlzaGVkV29yay5jaGlsZC5zdGF0ZU5vZGU7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb21taXRVcGRhdGVRdWV1ZShmaW5pc2hlZFdvcmssIF91cGRhdGVRdWV1ZSwgX2luc3RhbmNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgX2luc3RhbmNlMiA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7IC8vIFJlbmRlcmVycyBtYXkgc2NoZWR1bGUgd29yayB0byBiZSBkb25lIGFmdGVyIGhvc3QgY29tcG9uZW50cyBhcmUgbW91bnRlZFxuICAgICAgICAgIC8vIChlZyBET00gcmVuZGVyZXIgbWF5IHNjaGVkdWxlIGF1dG8tZm9jdXMgZm9yIGlucHV0cyBhbmQgZm9ybSBjb250cm9scykuXG4gICAgICAgICAgLy8gVGhlc2UgZWZmZWN0cyBzaG91bGQgb25seSBiZSBjb21taXR0ZWQgd2hlbiBjb21wb25lbnRzIGFyZSBmaXJzdCBtb3VudGVkLFxuICAgICAgICAgIC8vIGFrYSB3aGVuIHRoZXJlIGlzIG5vIGN1cnJlbnQvYWx0ZXJuYXRlLlxuXG4gICAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwgJiYgZmluaXNoZWRXb3JrLmZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAgICB2YXIgdHlwZSA9IGZpbmlzaGVkV29yay50eXBlO1xuICAgICAgICAgICAgdmFyIHByb3BzID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHM7XG4gICAgICAgICAgICBjb21taXRNb3VudChfaW5zdGFuY2UyLCB0eXBlLCBwcm9wcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgICAge1xuICAgICAgICAgIC8vIFdlIGhhdmUgbm8gbGlmZS1jeWNsZXMgYXNzb2NpYXRlZCB3aXRoIHRleHQuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgICB7XG4gICAgICAgICAgLy8gV2UgaGF2ZSBubyBsaWZlLWN5Y2xlcyBhc3NvY2lhdGVkIHdpdGggcG9ydGFscy5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgICB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIF9maW5pc2hlZFdvcmskbWVtb2l6ZTIgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcyxcbiAgICAgICAgICAgICAgICBvbkNvbW1pdCA9IF9maW5pc2hlZFdvcmskbWVtb2l6ZTIub25Db21taXQsXG4gICAgICAgICAgICAgICAgb25SZW5kZXIgPSBfZmluaXNoZWRXb3JrJG1lbW9pemUyLm9uUmVuZGVyO1xuICAgICAgICAgICAgdmFyIGVmZmVjdER1cmF0aW9uID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZS5lZmZlY3REdXJhdGlvbjtcbiAgICAgICAgICAgIHZhciBjb21taXRUaW1lID0gZ2V0Q29tbWl0VGltZSgpO1xuICAgICAgICAgICAgdmFyIHBoYXNlID0gY3VycmVudCA9PT0gbnVsbCA/ICdtb3VudCcgOiAndXBkYXRlJztcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAoaXNDdXJyZW50VXBkYXRlTmVzdGVkKCkpIHtcbiAgICAgICAgICAgICAgICBwaGFzZSA9ICduZXN0ZWQtdXBkYXRlJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9uUmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIG9uUmVuZGVyKGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzLmlkLCBwaGFzZSwgZmluaXNoZWRXb3JrLmFjdHVhbER1cmF0aW9uLCBmaW5pc2hlZFdvcmsudHJlZUJhc2VEdXJhdGlvbiwgZmluaXNoZWRXb3JrLmFjdHVhbFN0YXJ0VGltZSwgY29tbWl0VGltZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvbkNvbW1pdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIG9uQ29tbWl0KGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzLmlkLCBwaGFzZSwgZWZmZWN0RHVyYXRpb24sIGNvbW1pdFRpbWUpO1xuICAgICAgICAgICAgICB9IC8vIFNjaGVkdWxlIGEgcGFzc2l2ZSBlZmZlY3QgZm9yIHRoaXMgUHJvZmlsZXIgdG8gY2FsbCBvblBvc3RDb21taXQgaG9va3MuXG4gICAgICAgICAgICAgIC8vIFRoaXMgZWZmZWN0IHNob3VsZCBiZSBzY2hlZHVsZWQgZXZlbiBpZiB0aGVyZSBpcyBubyBvblBvc3RDb21taXQgY2FsbGJhY2sgZm9yIHRoaXMgUHJvZmlsZXIsXG4gICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlIGVmZmVjdCBpcyBhbHNvIHdoZXJlIHRpbWVzIGJ1YmJsZSB0byBwYXJlbnQgUHJvZmlsZXJzLlxuXG5cbiAgICAgICAgICAgICAgZW5xdWV1ZVBlbmRpbmdQYXNzaXZlUHJvZmlsZXJFZmZlY3QoZmluaXNoZWRXb3JrKTsgLy8gUHJvcGFnYXRlIGxheW91dCBlZmZlY3QgZHVyYXRpb25zIHRvIHRoZSBuZXh0IG5lYXJlc3QgUHJvZmlsZXIgYW5jZXN0b3IuXG4gICAgICAgICAgICAgIC8vIERvIG5vdCByZXNldCB0aGVzZSB2YWx1ZXMgdW50aWwgdGhlIG5leHQgcmVuZGVyIHNvIERldlRvb2xzIGhhcyBhIGNoYW5jZSB0byByZWFkIHRoZW0gZmlyc3QuXG5cbiAgICAgICAgICAgICAgdmFyIHBhcmVudEZpYmVyID0gZmluaXNoZWRXb3JrLnJldHVybjtcblxuICAgICAgICAgICAgICBvdXRlcjogd2hpbGUgKHBhcmVudEZpYmVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChwYXJlbnRGaWJlci50YWcpIHtcbiAgICAgICAgICAgICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAgICAgICAgICAgIHZhciByb290ID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgICAgICAgICAgICByb290LmVmZmVjdER1cmF0aW9uICs9IGVmZmVjdER1cmF0aW9uO1xuICAgICAgICAgICAgICAgICAgICBicmVhayBvdXRlcjtcblxuICAgICAgICAgICAgICAgICAgY2FzZSBQcm9maWxlcjpcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmVudFN0YXRlTm9kZSA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50U3RhdGVOb2RlLmVmZmVjdER1cmF0aW9uICs9IGVmZmVjdER1cmF0aW9uO1xuICAgICAgICAgICAgICAgICAgICBicmVhayBvdXRlcjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLnJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBjb21taXRTdXNwZW5zZUh5ZHJhdGlvbkNhbGxiYWNrcyhmaW5pc2hlZFJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICBjYXNlIEluY29tcGxldGVDbGFzc0NvbXBvbmVudDpcbiAgICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6XG4gICAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgTGVnYWN5SGlkZGVuQ29tcG9uZW50OlxuICAgICAgY2FzZSBUcmFjaW5nTWFya2VyQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIHVuaXQgb2Ygd29yayB0YWcgc2hvdWxkIG5vdCBoYXZlIHNpZGUtZWZmZWN0cy4gVGhpcyBlcnJvciBpcyAnICsgJ2xpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxuXG4gIGlmICggIW9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pIHtcbiAgICB7XG4gICAgICBpZiAoZmluaXNoZWRXb3JrLmZsYWdzICYgUmVmKSB7XG4gICAgICAgIGNvbW1pdEF0dGFjaFJlZihmaW5pc2hlZFdvcmspO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZWFwcGVhckxheW91dEVmZmVjdHNPbkZpYmVyKG5vZGUpIHtcbiAgLy8gVHVybiBvbiBsYXlvdXQgZWZmZWN0cyBpbiBhIHRyZWUgdGhhdCBwcmV2aW91c2x5IGRpc2FwcGVhcmVkLlxuICAvLyBUT0RPIChPZmZzY3JlZW4pIENoZWNrOiBmbGFncyAmIExheW91dFN0YXRpY1xuICBzd2l0Y2ggKG5vZGUudGFnKSB7XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoIG5vZGUubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgIHNhZmVseUNhbGxDb21taXRIb29rTGF5b3V0RWZmZWN0TGlzdE1vdW50KG5vZGUsIG5vZGUucmV0dXJuKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24obm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNhZmVseUNhbGxDb21taXRIb29rTGF5b3V0RWZmZWN0TGlzdE1vdW50KG5vZGUsIG5vZGUucmV0dXJuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gbm9kZS5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHNhZmVseUNhbGxDb21wb25lbnREaWRNb3VudChub2RlLCBub2RlLnJldHVybiwgaW5zdGFuY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2FmZWx5QXR0YWNoUmVmKG5vZGUsIG5vZGUucmV0dXJuKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHNhZmVseUF0dGFjaFJlZihub2RlLCBub2RlLnJldHVybik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGhpZGVPclVuaGlkZUFsbENoaWxkcmVuKGZpbmlzaGVkV29yaywgaXNIaWRkZW4pIHtcbiAgLy8gT25seSBoaWRlIG9yIHVuaGlkZSB0aGUgdG9wLW1vc3QgaG9zdCBub2Rlcy5cbiAgdmFyIGhvc3RTdWJ0cmVlUm9vdCA9IG51bGw7XG5cbiAge1xuICAgIC8vIFdlIG9ubHkgaGF2ZSB0aGUgdG9wIEZpYmVyIHRoYXQgd2FzIGluc2VydGVkIGJ1dCB3ZSBuZWVkIHRvIHJlY3Vyc2UgZG93biBpdHNcbiAgICAvLyBjaGlsZHJlbiB0byBmaW5kIGFsbCB0aGUgdGVybWluYWwgbm9kZXMuXG4gICAgdmFyIG5vZGUgPSBmaW5pc2hlZFdvcms7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50KSB7XG4gICAgICAgIGlmIChob3N0U3VidHJlZVJvb3QgPT09IG51bGwpIHtcbiAgICAgICAgICBob3N0U3VidHJlZVJvb3QgPSBub2RlO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IG5vZGUuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgICBpZiAoaXNIaWRkZW4pIHtcbiAgICAgICAgICAgICAgaGlkZUluc3RhbmNlKGluc3RhbmNlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHVuaGlkZUluc3RhbmNlKG5vZGUuc3RhdGVOb2RlLCBub2RlLm1lbW9pemVkUHJvcHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobm9kZS50YWcgPT09IEhvc3RUZXh0KSB7XG4gICAgICAgIGlmIChob3N0U3VidHJlZVJvb3QgPT09IG51bGwpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIF9pbnN0YW5jZTMgPSBub2RlLnN0YXRlTm9kZTtcblxuICAgICAgICAgICAgaWYgKGlzSGlkZGVuKSB7XG4gICAgICAgICAgICAgIGhpZGVUZXh0SW5zdGFuY2UoX2luc3RhbmNlMyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB1bmhpZGVUZXh0SW5zdGFuY2UoX2luc3RhbmNlMywgbm9kZS5tZW1vaXplZFByb3BzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKChub2RlLnRhZyA9PT0gT2Zmc2NyZWVuQ29tcG9uZW50IHx8IG5vZGUudGFnID09PSBMZWdhY3lIaWRkZW5Db21wb25lbnQpICYmIG5vZGUubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbCAmJiBub2RlICE9PSBmaW5pc2hlZFdvcmspIDsgZWxzZSBpZiAobm9kZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUgPT09IGZpbmlzaGVkV29yaykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSBmaW5pc2hlZFdvcmspIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaG9zdFN1YnRyZWVSb290ID09PSBub2RlKSB7XG4gICAgICAgICAgaG9zdFN1YnRyZWVSb290ID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGhvc3RTdWJ0cmVlUm9vdCA9PT0gbm9kZSkge1xuICAgICAgICBob3N0U3VidHJlZVJvb3QgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRBdHRhY2hSZWYoZmluaXNoZWRXb3JrKSB7XG4gIHZhciByZWYgPSBmaW5pc2hlZFdvcmsucmVmO1xuXG4gIGlmIChyZWYgIT09IG51bGwpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuICAgIHZhciBpbnN0YW5jZVRvVXNlO1xuXG4gICAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgIGluc3RhbmNlVG9Vc2UgPSBnZXRQdWJsaWNJbnN0YW5jZShpbnN0YW5jZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpbnN0YW5jZVRvVXNlID0gaW5zdGFuY2U7XG4gICAgfSAvLyBNb3ZlZCBvdXRzaWRlIHRvIGVuc3VyZSBEQ0Ugd29ya3Mgd2l0aCB0aGlzIGZsYWdcblxuICAgIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgcmV0VmFsO1xuXG4gICAgICBpZiAoIGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgcmV0VmFsID0gcmVmKGluc3RhbmNlVG9Vc2UpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldFZhbCA9IHJlZihpbnN0YW5jZVRvVXNlKTtcbiAgICAgIH1cblxuICAgICAge1xuICAgICAgICBpZiAodHlwZW9mIHJldFZhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGVycm9yKCdVbmV4cGVjdGVkIHJldHVybiB2YWx1ZSBmcm9tIGEgY2FsbGJhY2sgcmVmIGluICVzLiAnICsgJ0EgY2FsbGJhY2sgcmVmIHNob3VsZCBub3QgcmV0dXJuIGEgZnVuY3Rpb24uJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB7XG4gICAgICAgIGlmICghcmVmLmhhc093blByb3BlcnR5KCdjdXJyZW50JykpIHtcbiAgICAgICAgICBlcnJvcignVW5leHBlY3RlZCByZWYgb2JqZWN0IHByb3ZpZGVkIGZvciAlcy4gJyArICdVc2UgZWl0aGVyIGEgcmVmLXNldHRlciBmdW5jdGlvbiBvciBSZWFjdC5jcmVhdGVSZWYoKS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlZi5jdXJyZW50ID0gaW5zdGFuY2VUb1VzZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGV0YWNoRmliZXJNdXRhdGlvbihmaWJlcikge1xuICAvLyBDdXQgb2ZmIHRoZSByZXR1cm4gcG9pbnRlciB0byBkaXNjb25uZWN0IGl0IGZyb20gdGhlIHRyZWUuXG4gIC8vIFRoaXMgZW5hYmxlcyB1cyB0byBkZXRlY3QgYW5kIHdhcm4gYWdhaW5zdCBzdGF0ZSB1cGRhdGVzIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuXG4gIC8vIEl0IGFsc28gcHJldmVudHMgZXZlbnRzIGZyb20gYnViYmxpbmcgZnJvbSB3aXRoaW4gZGlzY29ubmVjdGVkIGNvbXBvbmVudHMuXG4gIC8vXG4gIC8vIElkZWFsbHksIHdlIHNob3VsZCBhbHNvIGNsZWFyIHRoZSBjaGlsZCBwb2ludGVyIG9mIHRoZSBwYXJlbnQgYWx0ZXJuYXRlIHRvIGxldCB0aGlzXG4gIC8vIGdldCBHQzplZCBidXQgd2UgZG9uJ3Qga25vdyB3aGljaCBmb3Igc3VyZSB3aGljaCBwYXJlbnQgaXMgdGhlIGN1cnJlbnRcbiAgLy8gb25lIHNvIHdlJ2xsIHNldHRsZSBmb3IgR0M6aW5nIHRoZSBzdWJ0cmVlIG9mIHRoaXMgY2hpbGQuXG4gIC8vIFRoaXMgY2hpbGQgaXRzZWxmIHdpbGwgYmUgR0M6ZWQgd2hlbiB0aGUgcGFyZW50IHVwZGF0ZXMgdGhlIG5leHQgdGltZS5cbiAgLy9cbiAgLy8gTm90ZSB0aGF0IHdlIGNhbid0IGNsZWFyIGNoaWxkIG9yIHNpYmxpbmcgcG9pbnRlcnMgeWV0LlxuICAvLyBUaGV5J3JlIG5lZWRlZCBmb3IgcGFzc2l2ZSBlZmZlY3RzIGFuZCBmb3IgZmluZERPTU5vZGUuXG4gIC8vIFdlIGRlZmVyIHRob3NlIGZpZWxkcywgYW5kIGFsbCBvdGhlciBjbGVhbnVwLCB0byB0aGUgcGFzc2l2ZSBwaGFzZSAoc2VlIGRldGFjaEZpYmVyQWZ0ZXJFZmZlY3RzKS5cbiAgLy9cbiAgLy8gRG9uJ3QgcmVzZXQgdGhlIGFsdGVybmF0ZSB5ZXQsIGVpdGhlci4gV2UgbmVlZCB0aGF0IHNvIHdlIGNhbiBkZXRhY2ggdGhlXG4gIC8vIGFsdGVybmF0ZSdzIGZpZWxkcyBpbiB0aGUgcGFzc2l2ZSBwaGFzZS4gQ2xlYXJpbmcgdGhlIHJldHVybiBwb2ludGVyIGlzXG4gIC8vIHN1ZmZpY2llbnQgZm9yIGZpbmRET01Ob2RlIHNlbWFudGljcy5cbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgYWx0ZXJuYXRlLnJldHVybiA9IG51bGw7XG4gIH1cblxuICBmaWJlci5yZXR1cm4gPSBudWxsO1xufVxuXG5mdW5jdGlvbiBkZXRhY2hGaWJlckFmdGVyRWZmZWN0cyhmaWJlcikge1xuICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICBmaWJlci5hbHRlcm5hdGUgPSBudWxsO1xuICAgIGRldGFjaEZpYmVyQWZ0ZXJFZmZlY3RzKGFsdGVybmF0ZSk7XG4gIH0gLy8gTm90ZTogRGVmZW5zaXZlbHkgdXNpbmcgbmVnYXRpb24gaW5zdGVhZCBvZiA8IGluIGNhc2VcbiAgLy8gYGRlbGV0ZWRUcmVlQ2xlYW5VcExldmVsYCBpcyB1bmRlZmluZWQuXG5cblxuICB7XG4gICAgLy8gQ2xlYXIgY3ljbGljYWwgRmliZXIgZmllbGRzLiBUaGlzIGxldmVsIGFsb25lIGlzIGRlc2lnbmVkIHRvIHJvdWdobHlcbiAgICAvLyBhcHByb3hpbWF0ZSB0aGUgcGxhbm5lZCBGaWJlciByZWZhY3Rvci4gSW4gdGhhdCB3b3JsZCwgYHNldFN0YXRlYCB3aWxsIGJlXG4gICAgLy8gYm91bmQgdG8gYSBzcGVjaWFsIFwiaW5zdGFuY2VcIiBvYmplY3QgaW5zdGVhZCBvZiBhIEZpYmVyLiBUaGUgSW5zdGFuY2VcbiAgICAvLyBvYmplY3Qgd2lsbCBub3QgaGF2ZSBhbnkgb2YgdGhlc2UgZmllbGRzLiBJdCB3aWxsIG9ubHkgYmUgY29ubmVjdGVkIHRvXG4gICAgLy8gdGhlIGZpYmVyIHRyZWUgdmlhIGEgc2luZ2xlIGxpbmsgYXQgdGhlIHJvb3QuIFNvIGlmIHRoaXMgbGV2ZWwgYWxvbmUgaXNcbiAgICAvLyBzdWZmaWNpZW50IHRvIGZpeCBtZW1vcnkgaXNzdWVzLCB0aGF0IGJvZGVzIHdlbGwgZm9yIG91ciBwbGFucy5cbiAgICBmaWJlci5jaGlsZCA9IG51bGw7XG4gICAgZmliZXIuZGVsZXRpb25zID0gbnVsbDtcbiAgICBmaWJlci5zaWJsaW5nID0gbnVsbDsgLy8gVGhlIGBzdGF0ZU5vZGVgIGlzIGN5Y2xpY2FsIGJlY2F1c2Ugb24gaG9zdCBub2RlcyBpdCBwb2ludHMgdG8gdGhlIGhvc3RcbiAgICAvLyB0cmVlLCB3aGljaCBoYXMgaXRzIG93biBwb2ludGVycyB0byBjaGlsZHJlbiwgcGFyZW50cywgYW5kIHNpYmxpbmdzLlxuICAgIC8vIFRoZSBvdGhlciBob3N0IG5vZGVzIGFsc28gcG9pbnQgYmFjayB0byBmaWJlcnMsIHNvIHdlIHNob3VsZCBkZXRhY2ggdGhhdFxuICAgIC8vIG9uZSwgdG9vLlxuXG4gICAgaWYgKGZpYmVyLnRhZyA9PT0gSG9zdENvbXBvbmVudCkge1xuICAgICAgdmFyIGhvc3RJbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgaWYgKGhvc3RJbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICBkZXRhY2hEZWxldGVkSW5zdGFuY2UoaG9zdEluc3RhbmNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmaWJlci5zdGF0ZU5vZGUgPSBudWxsOyAvLyBJJ20gaW50ZW50aW9uYWxseSBub3QgY2xlYXJpbmcgdGhlIGByZXR1cm5gIGZpZWxkIGluIHRoaXMgbGV2ZWwuIFdlXG4gICAgLy8gYWxyZWFkeSBkaXNjb25uZWN0IHRoZSBgcmV0dXJuYCBwb2ludGVyIGF0IHRoZSByb290IG9mIHRoZSBkZWxldGVkXG4gICAgLy8gc3VidHJlZSAoaW4gYGRldGFjaEZpYmVyTXV0YXRpb25gKS4gQmVzaWRlcywgYHJldHVybmAgYnkgaXRzZWxmIGlzIG5vdFxuICAgIC8vIGN5Y2xpY2FsIFx1MjAxNCBpdCdzIG9ubHkgY3ljbGljYWwgd2hlbiBjb21iaW5lZCB3aXRoIGBjaGlsZGAsIGBzaWJsaW5nYCwgYW5kXG4gICAgLy8gYGFsdGVybmF0ZWAuIEJ1dCB3ZSdsbCBjbGVhciBpdCBpbiB0aGUgbmV4dCBsZXZlbCBhbnl3YXksIGp1c3QgaW4gY2FzZS5cblxuICAgIHtcbiAgICAgIGZpYmVyLl9kZWJ1Z093bmVyID0gbnVsbDtcbiAgICB9XG5cbiAgICB7XG4gICAgICAvLyBUaGVvcmV0aWNhbGx5LCBub3RoaW5nIGluIGhlcmUgc2hvdWxkIGJlIG5lY2Vzc2FyeSwgYmVjYXVzZSB3ZSBhbHJlYWR5XG4gICAgICAvLyBkaXNjb25uZWN0ZWQgdGhlIGZpYmVyIGZyb20gdGhlIHRyZWUuIFNvIGV2ZW4gaWYgc29tZXRoaW5nIGxlYWtzIHRoaXNcbiAgICAgIC8vIHBhcnRpY3VsYXIgZmliZXIsIGl0IHdvbid0IGxlYWsgYW55dGhpbmcgZWxzZVxuICAgICAgLy9cbiAgICAgIC8vIFRoZSBwdXJwb3NlIG9mIHRoaXMgYnJhbmNoIGlzIHRvIGJlIHN1cGVyIGFnZ3Jlc3NpdmUgc28gd2UgY2FuIG1lYXN1cmVcbiAgICAgIC8vIGlmIHRoZXJlJ3MgYW55IGRpZmZlcmVuY2UgaW4gbWVtb3J5IGltcGFjdC4gSWYgdGhlcmUgaXMsIHRoYXQgY291bGRcbiAgICAgIC8vIGluZGljYXRlIGEgUmVhY3QgbGVhayB3ZSBkb24ndCBrbm93IGFib3V0LlxuICAgICAgZmliZXIucmV0dXJuID0gbnVsbDtcbiAgICAgIGZpYmVyLmRlcGVuZGVuY2llcyA9IG51bGw7XG4gICAgICBmaWJlci5tZW1vaXplZFByb3BzID0gbnVsbDtcbiAgICAgIGZpYmVyLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgICAgZmliZXIucGVuZGluZ1Byb3BzID0gbnVsbDtcbiAgICAgIGZpYmVyLnN0YXRlTm9kZSA9IG51bGw7IC8vIFRPRE86IE1vdmUgdG8gYGNvbW1pdFBhc3NpdmVVbm1vdW50SW5zaWRlRGVsZXRlZFRyZWVPbkZpYmVyYCBpbnN0ZWFkLlxuXG4gICAgICBmaWJlci51cGRhdGVRdWV1ZSA9IG51bGw7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldEhvc3RQYXJlbnRGaWJlcihmaWJlcikge1xuICB2YXIgcGFyZW50ID0gZmliZXIucmV0dXJuO1xuXG4gIHdoaWxlIChwYXJlbnQgIT09IG51bGwpIHtcbiAgICBpZiAoaXNIb3N0UGFyZW50KHBhcmVudCkpIHtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfVxuXG4gICAgcGFyZW50ID0gcGFyZW50LnJldHVybjtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gZmluZCBhIGhvc3QgcGFyZW50LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgJyArICdpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG59XG5cbmZ1bmN0aW9uIGlzSG9zdFBhcmVudChmaWJlcikge1xuICByZXR1cm4gZmliZXIudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IGZpYmVyLnRhZyA9PT0gSG9zdFJvb3QgfHwgZmliZXIudGFnID09PSBIb3N0UG9ydGFsO1xufVxuXG5mdW5jdGlvbiBnZXRIb3N0U2libGluZyhmaWJlcikge1xuICAvLyBXZSdyZSBnb2luZyB0byBzZWFyY2ggZm9yd2FyZCBpbnRvIHRoZSB0cmVlIHVudGlsIHdlIGZpbmQgYSBzaWJsaW5nIGhvc3RcbiAgLy8gbm9kZS4gVW5mb3J0dW5hdGVseSwgaWYgbXVsdGlwbGUgaW5zZXJ0aW9ucyBhcmUgZG9uZSBpbiBhIHJvdyB3ZSBoYXZlIHRvXG4gIC8vIHNlYXJjaCBwYXN0IHRoZW0uIFRoaXMgbGVhZHMgdG8gZXhwb25lbnRpYWwgc2VhcmNoIGZvciB0aGUgbmV4dCBzaWJsaW5nLlxuICAvLyBUT0RPOiBGaW5kIGEgbW9yZSBlZmZpY2llbnQgd2F5IHRvIGRvIHRoaXMuXG4gIHZhciBub2RlID0gZmliZXI7XG5cbiAgc2libGluZ3M6IHdoaWxlICh0cnVlKSB7XG4gICAgLy8gSWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcsIGxldCdzIHRyeSB0aGUgbmV4dCBzaWJsaW5nLlxuICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBpc0hvc3RQYXJlbnQobm9kZS5yZXR1cm4pKSB7XG4gICAgICAgIC8vIElmIHdlIHBvcCBvdXQgb2YgdGhlIHJvb3Qgb3IgaGl0IHRoZSBwYXJlbnQgdGhlIGZpYmVyIHdlIGFyZSB0aGVcbiAgICAgICAgLy8gbGFzdCBzaWJsaW5nLlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cblxuICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuXG4gICAgd2hpbGUgKG5vZGUudGFnICE9PSBIb3N0Q29tcG9uZW50ICYmIG5vZGUudGFnICE9PSBIb3N0VGV4dCAmJiBub2RlLnRhZyAhPT0gRGVoeWRyYXRlZEZyYWdtZW50KSB7XG4gICAgICAvLyBJZiBpdCBpcyBub3QgaG9zdCBub2RlIGFuZCwgd2UgbWlnaHQgaGF2ZSBhIGhvc3Qgbm9kZSBpbnNpZGUgaXQuXG4gICAgICAvLyBUcnkgdG8gc2VhcmNoIGRvd24gdW50aWwgd2UgZmluZCBvbmUuXG4gICAgICBpZiAobm9kZS5mbGFncyAmIFBsYWNlbWVudCkge1xuICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgY2hpbGQsIHRyeSB0aGUgc2libGluZ3MgaW5zdGVhZC5cbiAgICAgICAgY29udGludWUgc2libGluZ3M7XG4gICAgICB9IC8vIElmIHdlIGRvbid0IGhhdmUgYSBjaGlsZCwgdHJ5IHRoZSBzaWJsaW5ncyBpbnN0ZWFkLlxuICAgICAgLy8gV2UgYWxzbyBza2lwIHBvcnRhbHMgYmVjYXVzZSB0aGV5IGFyZSBub3QgcGFydCBvZiB0aGlzIGhvc3QgdHJlZS5cblxuXG4gICAgICBpZiAobm9kZS5jaGlsZCA9PT0gbnVsbCB8fCBub2RlLnRhZyA9PT0gSG9zdFBvcnRhbCkge1xuICAgICAgICBjb250aW51ZSBzaWJsaW5ncztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICB9XG4gICAgfSAvLyBDaGVjayBpZiB0aGlzIGhvc3Qgbm9kZSBpcyBzdGFibGUgb3IgYWJvdXQgdG8gYmUgcGxhY2VkLlxuXG5cbiAgICBpZiAoIShub2RlLmZsYWdzICYgUGxhY2VtZW50KSkge1xuICAgICAgLy8gRm91bmQgaXQhXG4gICAgICByZXR1cm4gbm9kZS5zdGF0ZU5vZGU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBsYWNlbWVudChmaW5pc2hlZFdvcmspIHtcblxuXG4gIHZhciBwYXJlbnRGaWJlciA9IGdldEhvc3RQYXJlbnRGaWJlcihmaW5pc2hlZFdvcmspOyAvLyBOb3RlOiB0aGVzZSB0d28gdmFyaWFibGVzICptdXN0KiBhbHdheXMgYmUgdXBkYXRlZCB0b2dldGhlci5cblxuICBzd2l0Y2ggKHBhcmVudEZpYmVyLnRhZykge1xuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHBhcmVudCA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICBpZiAocGFyZW50RmliZXIuZmxhZ3MgJiBDb250ZW50UmVzZXQpIHtcbiAgICAgICAgICAvLyBSZXNldCB0aGUgdGV4dCBjb250ZW50IG9mIHRoZSBwYXJlbnQgYmVmb3JlIGRvaW5nIGFueSBpbnNlcnRpb25zXG4gICAgICAgICAgcmVzZXRUZXh0Q29udGVudChwYXJlbnQpOyAvLyBDbGVhciBDb250ZW50UmVzZXQgZnJvbSB0aGUgZWZmZWN0IHRhZ1xuXG4gICAgICAgICAgcGFyZW50RmliZXIuZmxhZ3MgJj0gfkNvbnRlbnRSZXNldDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBiZWZvcmUgPSBnZXRIb3N0U2libGluZyhmaW5pc2hlZFdvcmspOyAvLyBXZSBvbmx5IGhhdmUgdGhlIHRvcCBGaWJlciB0aGF0IHdhcyBpbnNlcnRlZCBidXQgd2UgbmVlZCB0byByZWN1cnNlIGRvd24gaXRzXG4gICAgICAgIC8vIGNoaWxkcmVuIHRvIGZpbmQgYWxsIHRoZSB0ZXJtaW5hbCBub2Rlcy5cblxuICAgICAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGUoZmluaXNoZWRXb3JrLCBiZWZvcmUsIHBhcmVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICB7XG4gICAgICAgIHZhciBfcGFyZW50ID0gcGFyZW50RmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG5cbiAgICAgICAgdmFyIF9iZWZvcmUgPSBnZXRIb3N0U2libGluZyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZUludG9Db250YWluZXIoZmluaXNoZWRXb3JrLCBfYmVmb3JlLCBfcGFyZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lLW5vLWZhbGx0aHJvdWdoXG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGhvc3QgcGFyZW50IGZpYmVyLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgJyArICdpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlSW50b0NvbnRhaW5lcihub2RlLCBiZWZvcmUsIHBhcmVudCkge1xuICB2YXIgdGFnID0gbm9kZS50YWc7XG4gIHZhciBpc0hvc3QgPSB0YWcgPT09IEhvc3RDb21wb25lbnQgfHwgdGFnID09PSBIb3N0VGV4dDtcblxuICBpZiAoaXNIb3N0KSB7XG4gICAgdmFyIHN0YXRlTm9kZSA9IG5vZGUuc3RhdGVOb2RlO1xuXG4gICAgaWYgKGJlZm9yZSkge1xuICAgICAgaW5zZXJ0SW5Db250YWluZXJCZWZvcmUocGFyZW50LCBzdGF0ZU5vZGUsIGJlZm9yZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwcGVuZENoaWxkVG9Db250YWluZXIocGFyZW50LCBzdGF0ZU5vZGUpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0YWcgPT09IEhvc3RQb3J0YWwpIDsgZWxzZSB7XG4gICAgdmFyIGNoaWxkID0gbm9kZS5jaGlsZDtcblxuICAgIGlmIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlSW50b0NvbnRhaW5lcihjaGlsZCwgYmVmb3JlLCBwYXJlbnQpO1xuICAgICAgdmFyIHNpYmxpbmcgPSBjaGlsZC5zaWJsaW5nO1xuXG4gICAgICB3aGlsZSAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGVJbnRvQ29udGFpbmVyKHNpYmxpbmcsIGJlZm9yZSwgcGFyZW50KTtcbiAgICAgICAgc2libGluZyA9IHNpYmxpbmcuc2libGluZztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlKG5vZGUsIGJlZm9yZSwgcGFyZW50KSB7XG4gIHZhciB0YWcgPSBub2RlLnRhZztcbiAgdmFyIGlzSG9zdCA9IHRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCB0YWcgPT09IEhvc3RUZXh0O1xuXG4gIGlmIChpc0hvc3QpIHtcbiAgICB2YXIgc3RhdGVOb2RlID0gbm9kZS5zdGF0ZU5vZGU7XG5cbiAgICBpZiAoYmVmb3JlKSB7XG4gICAgICBpbnNlcnRCZWZvcmUocGFyZW50LCBzdGF0ZU5vZGUsIGJlZm9yZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwcGVuZENoaWxkKHBhcmVudCwgc3RhdGVOb2RlKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodGFnID09PSBIb3N0UG9ydGFsKSA7IGVsc2Uge1xuICAgIHZhciBjaGlsZCA9IG5vZGUuY2hpbGQ7XG5cbiAgICBpZiAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZShjaGlsZCwgYmVmb3JlLCBwYXJlbnQpO1xuICAgICAgdmFyIHNpYmxpbmcgPSBjaGlsZC5zaWJsaW5nO1xuXG4gICAgICB3aGlsZSAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGUoc2libGluZywgYmVmb3JlLCBwYXJlbnQpO1xuICAgICAgICBzaWJsaW5nID0gc2libGluZy5zaWJsaW5nO1xuICAgICAgfVxuICAgIH1cbiAgfVxufSAvLyBUaGVzZSBhcmUgdHJhY2tlZCBvbiB0aGUgc3RhY2sgYXMgd2UgcmVjdXJzaXZlbHkgdHJhdmVyc2UgYVxuLy8gZGVsZXRlZCBzdWJ0cmVlLlxuLy8gVE9ETzogVXBkYXRlIHRoZXNlIGR1cmluZyB0aGUgd2hvbGUgbXV0YXRpb24gcGhhc2UsIG5vdCBqdXN0IGR1cmluZ1xuLy8gYSBkZWxldGlvbi5cblxuXG52YXIgaG9zdFBhcmVudCA9IG51bGw7XG52YXIgaG9zdFBhcmVudElzQ29udGFpbmVyID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGNvbW1pdERlbGV0aW9uRWZmZWN0cyhyb290LCByZXR1cm5GaWJlciwgZGVsZXRlZEZpYmVyKSB7XG4gIHtcbiAgICAvLyBXZSBvbmx5IGhhdmUgdGhlIHRvcCBGaWJlciB0aGF0IHdhcyBkZWxldGVkIGJ1dCB3ZSBuZWVkIHRvIHJlY3Vyc2UgZG93biBpdHNcbiAgICAvLyBjaGlsZHJlbiB0byBmaW5kIGFsbCB0aGUgdGVybWluYWwgbm9kZXMuXG4gICAgLy8gUmVjdXJzaXZlbHkgZGVsZXRlIGFsbCBob3N0IG5vZGVzIGZyb20gdGhlIHBhcmVudCwgZGV0YWNoIHJlZnMsIGNsZWFuXG4gICAgLy8gdXAgbW91bnRlZCBsYXlvdXQgZWZmZWN0cywgYW5kIGNhbGwgY29tcG9uZW50V2lsbFVubW91bnQuXG4gICAgLy8gV2Ugb25seSBuZWVkIHRvIHJlbW92ZSB0aGUgdG9wbW9zdCBob3N0IGNoaWxkIGluIGVhY2ggYnJhbmNoLiBCdXQgdGhlbiB3ZVxuICAgIC8vIHN0aWxsIG5lZWQgdG8ga2VlcCB0cmF2ZXJzaW5nIHRvIHVubW91bnQgZWZmZWN0cywgcmVmcywgYW5kIGNXVS4gVE9ETzogV2VcbiAgICAvLyBjb3VsZCBzcGxpdCB0aGlzIGludG8gdHdvIHNlcGFyYXRlIHRyYXZlcnNhbHMgZnVuY3Rpb25zLCB3aGVyZSB0aGUgc2Vjb25kXG4gICAgLy8gb25lIGRvZXNuJ3QgaW5jbHVkZSBhbnkgcmVtb3ZlQ2hpbGQgbG9naWMuIFRoaXMgaXMgbWF5YmUgdGhlIHNhbWVcbiAgICAvLyBmdW5jdGlvbiBhcyBcImRpc2FwcGVhckxheW91dEVmZmVjdHNcIiAob3Igd2hhdGV2ZXIgdGhhdCB0dXJucyBpbnRvIGFmdGVyXG4gICAgLy8gdGhlIGxheW91dCBwaGFzZSBpcyByZWZhY3RvcmVkIHRvIHVzZSByZWN1cnNpb24pLlxuICAgIC8vIEJlZm9yZSBzdGFydGluZywgZmluZCB0aGUgbmVhcmVzdCBob3N0IHBhcmVudCBvbiB0aGUgc3RhY2sgc28gd2Uga25vd1xuICAgIC8vIHdoaWNoIGluc3RhbmNlL2NvbnRhaW5lciB0byByZW1vdmUgdGhlIGNoaWxkcmVuIGZyb20uXG4gICAgLy8gVE9ETzogSW5zdGVhZCBvZiBzZWFyY2hpbmcgdXAgdGhlIGZpYmVyIHJldHVybiBwYXRoIG9uIGV2ZXJ5IGRlbGV0aW9uLCB3ZVxuICAgIC8vIGNhbiB0cmFjayB0aGUgbmVhcmVzdCBob3N0IGNvbXBvbmVudCBvbiB0aGUgSlMgc3RhY2sgYXMgd2UgdHJhdmVyc2UgdGhlXG4gICAgLy8gdHJlZSBkdXJpbmcgdGhlIGNvbW1pdCBwaGFzZS4gVGhpcyB3b3VsZCBtYWtlIGluc2VydGlvbnMgZmFzdGVyLCB0b28uXG4gICAgdmFyIHBhcmVudCA9IHJldHVybkZpYmVyO1xuXG4gICAgZmluZFBhcmVudDogd2hpbGUgKHBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChwYXJlbnQudGFnKSB7XG4gICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBob3N0UGFyZW50ID0gcGFyZW50LnN0YXRlTm9kZTtcbiAgICAgICAgICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWsgZmluZFBhcmVudDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBob3N0UGFyZW50ID0gcGFyZW50LnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICAgICAgICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrIGZpbmRQYXJlbnQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBob3N0UGFyZW50ID0gcGFyZW50LnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICAgICAgICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrIGZpbmRQYXJlbnQ7XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChob3N0UGFyZW50ID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIGZpbmQgYSBob3N0IHBhcmVudC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5ICcgKyAnYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIGNvbW1pdERlbGV0aW9uRWZmZWN0c09uRmliZXIocm9vdCwgcmV0dXJuRmliZXIsIGRlbGV0ZWRGaWJlcik7XG4gICAgaG9zdFBhcmVudCA9IG51bGw7XG4gICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gZmFsc2U7XG4gIH1cblxuICBkZXRhY2hGaWJlck11dGF0aW9uKGRlbGV0ZWRGaWJlcik7XG59XG5cbmZ1bmN0aW9uIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBwYXJlbnQpIHtcbiAgLy8gVE9ETzogVXNlIGEgc3RhdGljIGZsYWcgdG8gc2tpcCB0cmVlcyB0aGF0IGRvbid0IGhhdmUgdW5tb3VudCBlZmZlY3RzXG4gIHZhciBjaGlsZCA9IHBhcmVudC5jaGlsZDtcblxuICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICBjb21taXREZWxldGlvbkVmZmVjdHNPbkZpYmVyKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgY2hpbGQpO1xuICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXREZWxldGlvbkVmZmVjdHNPbkZpYmVyKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKSB7XG4gIG9uQ29tbWl0VW5tb3VudChkZWxldGVkRmliZXIpOyAvLyBUaGUgY2FzZXMgaW4gdGhpcyBvdXRlciBzd2l0Y2ggbW9kaWZ5IHRoZSBzdGFjayBiZWZvcmUgdGhleSB0cmF2ZXJzZVxuICAvLyBpbnRvIHRoZWlyIHN1YnRyZWUuIFRoZXJlIGFyZSBzaW1wbGVyIGNhc2VzIGluIHRoZSBpbm5lciBzd2l0Y2hcbiAgLy8gdGhhdCBkb24ndCBtb2RpZnkgdGhlIHN0YWNrLlxuXG4gIHN3aXRjaCAoZGVsZXRlZEZpYmVyLnRhZykge1xuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCFvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuKSB7XG4gICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcik7XG4gICAgICAgIH0gLy8gSW50ZW50aW9uYWwgZmFsbHRocm91Z2ggdG8gbmV4dCBicmFuY2hcblxuICAgICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZS1uby1mYWxsdGhyb3VnaFxuXG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIHtcbiAgICAgICAgLy8gV2Ugb25seSBuZWVkIHRvIHJlbW92ZSB0aGUgbmVhcmVzdCBob3N0IGNoaWxkLiBTZXQgdGhlIGhvc3QgcGFyZW50XG4gICAgICAgIC8vIHRvIGBudWxsYCBvbiB0aGUgc3RhY2sgdG8gaW5kaWNhdGUgdGhhdCBuZXN0ZWQgY2hpbGRyZW4gZG9uJ3RcbiAgICAgICAgLy8gbmVlZCB0byBiZSByZW1vdmVkLlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIHByZXZIb3N0UGFyZW50ID0gaG9zdFBhcmVudDtcbiAgICAgICAgICB2YXIgcHJldkhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IGhvc3RQYXJlbnRJc0NvbnRhaW5lcjtcbiAgICAgICAgICBob3N0UGFyZW50ID0gbnVsbDtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgICBob3N0UGFyZW50ID0gcHJldkhvc3RQYXJlbnQ7XG4gICAgICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gcHJldkhvc3RQYXJlbnRJc0NvbnRhaW5lcjtcblxuICAgICAgICAgIGlmIChob3N0UGFyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBOb3cgdGhhdCBhbGwgdGhlIGNoaWxkIGVmZmVjdHMgaGF2ZSB1bm1vdW50ZWQsIHdlIGNhbiByZW1vdmUgdGhlXG4gICAgICAgICAgICAvLyBub2RlIGZyb20gdGhlIHRyZWUuXG4gICAgICAgICAgICBpZiAoaG9zdFBhcmVudElzQ29udGFpbmVyKSB7XG4gICAgICAgICAgICAgIHJlbW92ZUNoaWxkRnJvbUNvbnRhaW5lcihob3N0UGFyZW50LCBkZWxldGVkRmliZXIuc3RhdGVOb2RlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlbW92ZUNoaWxkKGhvc3RQYXJlbnQsIGRlbGV0ZWRGaWJlci5zdGF0ZU5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgRGVoeWRyYXRlZEZyYWdtZW50OlxuICAgICAge1xuICAgICAgICAvLyBEZWxldGUgdGhlIGRlaHlkcmF0ZWQgc3VzcGVuc2UgYm91bmRhcnkgYW5kIGFsbCBvZiBpdHMgY29udGVudC5cblxuXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoaG9zdFBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGhvc3RQYXJlbnRJc0NvbnRhaW5lcikge1xuICAgICAgICAgICAgICBjbGVhclN1c3BlbnNlQm91bmRhcnlGcm9tQ29udGFpbmVyKGhvc3RQYXJlbnQsIGRlbGV0ZWRGaWJlci5zdGF0ZU5vZGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY2xlYXJTdXNwZW5zZUJvdW5kYXJ5KGhvc3RQYXJlbnQsIGRlbGV0ZWRGaWJlci5zdGF0ZU5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIC8vIFdoZW4gd2UgZ28gaW50byBhIHBvcnRhbCwgaXQgYmVjb21lcyB0aGUgcGFyZW50IHRvIHJlbW92ZSBmcm9tLlxuICAgICAgICAgIHZhciBfcHJldkhvc3RQYXJlbnQgPSBob3N0UGFyZW50O1xuICAgICAgICAgIHZhciBfcHJldkhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IGhvc3RQYXJlbnRJc0NvbnRhaW5lcjtcbiAgICAgICAgICBob3N0UGFyZW50ID0gZGVsZXRlZEZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICAgICAgICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IHRydWU7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgICAgaG9zdFBhcmVudCA9IF9wcmV2SG9zdFBhcmVudDtcbiAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSBfcHJldkhvc3RQYXJlbnRJc0NvbnRhaW5lcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICghb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikge1xuICAgICAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IGRlbGV0ZWRGaWJlci51cGRhdGVRdWV1ZTtcblxuICAgICAgICAgIGlmICh1cGRhdGVRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGxhc3RFZmZlY3QgPSB1cGRhdGVRdWV1ZS5sYXN0RWZmZWN0O1xuXG4gICAgICAgICAgICBpZiAobGFzdEVmZmVjdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICB2YXIgZmlyc3RFZmZlY3QgPSBsYXN0RWZmZWN0Lm5leHQ7XG4gICAgICAgICAgICAgIHZhciBlZmZlY3QgPSBmaXJzdEVmZmVjdDtcblxuICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgdmFyIF9lZmZlY3QgPSBlZmZlY3QsXG4gICAgICAgICAgICAgICAgICAgIGRlc3Ryb3kgPSBfZWZmZWN0LmRlc3Ryb3ksXG4gICAgICAgICAgICAgICAgICAgIHRhZyA9IF9lZmZlY3QudGFnO1xuXG4gICAgICAgICAgICAgICAgaWYgKGRlc3Ryb3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgaWYgKCh0YWcgJiBJbnNlcnRpb24pICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgICAgICAgc2FmZWx5Q2FsbERlc3Ryb3koZGVsZXRlZEZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZXN0cm95KTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRhZyAmIExheW91dCkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgbWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdGFydGVkKGRlbGV0ZWRGaWJlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoIGRlbGV0ZWRGaWJlci5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgc2FmZWx5Q2FsbERlc3Ryb3koZGVsZXRlZEZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZXN0cm95KTtcbiAgICAgICAgICAgICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihkZWxldGVkRmliZXIpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHNhZmVseUNhbGxEZXN0cm95KGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVzdHJveSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgbWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdG9wcGVkKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBlZmZlY3QgPSBlZmZlY3QubmV4dDtcbiAgICAgICAgICAgICAgfSB3aGlsZSAoZWZmZWN0ICE9PSBmaXJzdEVmZmVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICghb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikge1xuICAgICAgICAgIHNhZmVseURldGFjaFJlZihkZWxldGVkRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpO1xuICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGRlbGV0ZWRGaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVbm1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBzYWZlbHlDYWxsQ29tcG9uZW50V2lsbFVubW91bnQoZGVsZXRlZEZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBpbnN0YW5jZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoIC8vIFRPRE86IFJlbW92ZSB0aGlzIGRlYWQgZmxhZ1xuICAgICAgICAgZGVsZXRlZEZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkge1xuICAgICAgICAgIC8vIElmIHRoaXMgb2Zmc2NyZWVuIGNvbXBvbmVudCBpcyBoaWRkZW4sIHdlIGFscmVhZHkgdW5tb3VudGVkIGl0LiBCZWZvcmVcbiAgICAgICAgICAvLyBkZWxldGluZyB0aGUgY2hpbGRyZW4sIHRyYWNrIHRoYXQgaXQncyBhbHJlYWR5IHVubW91bnRlZCBzbyB0aGF0IHdlXG4gICAgICAgICAgLy8gZG9uJ3QgYXR0ZW1wdCB0byB1bm1vdW50IHRoZSBlZmZlY3RzIGFnYWluLlxuICAgICAgICAgIC8vIFRPRE86IElmIHRoZSB0cmVlIGlzIGhpZGRlbiwgaW4gbW9zdCBjYXNlcyB3ZSBzaG91bGQgYmUgYWJsZSB0byBza2lwXG4gICAgICAgICAgLy8gb3ZlciB0aGUgbmVzdGVkIGNoaWxkcmVuIGVudGlyZWx5LiBBbiBleGNlcHRpb24gaXMgd2UgaGF2ZW4ndCB5ZXQgZm91bmRcbiAgICAgICAgICAvLyB0aGUgdG9wbW9zdCBob3N0IG5vZGUgdG8gZGVsZXRlLCB3aGljaCB3ZSBhbHJlYWR5IHRyYWNrIG9uIHRoZSBzdGFjay5cbiAgICAgICAgICAvLyBCdXQgdGhlIG90aGVyIGNhc2UgaXMgcG9ydGFscywgd2hpY2ggbmVlZCB0byBiZSBkZXRhY2hlZCBubyBtYXR0ZXIgaG93XG4gICAgICAgICAgLy8gZGVlcGx5IHRoZXkgYXJlIG5lc3RlZC4gV2Ugc2hvdWxkIHVzZSBhIHN1YnRyZWUgZmxhZyB0byB0cmFjayB3aGV0aGVyIGFcbiAgICAgICAgICAvLyBzdWJ0cmVlIGluY2x1ZGVzIGEgbmVzdGVkIHBvcnRhbC5cbiAgICAgICAgICB2YXIgcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuO1xuICAgICAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiB8fCBkZWxldGVkRmliZXIubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0U3VzcGVuc2VDYWxsYmFjayhmaW5pc2hlZFdvcmspIHtcbiAgLy8gVE9ETzogTW92ZSB0aGlzIHRvIHBhc3NpdmUgcGhhc2VcbiAgdmFyIG5ld1N0YXRlID0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGU7XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFN1c3BlbnNlSHlkcmF0aW9uQ2FsbGJhY2tzKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKSB7XG5cbiAgdmFyIG5ld1N0YXRlID0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKG5ld1N0YXRlID09PSBudWxsKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAgICAgIGlmIChwcmV2U3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIHN1c3BlbnNlSW5zdGFuY2UgPSBwcmV2U3RhdGUuZGVoeWRyYXRlZDtcblxuICAgICAgICBpZiAoc3VzcGVuc2VJbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGNvbW1pdEh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZUluc3RhbmNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhdHRhY2hTdXNwZW5zZVJldHJ5TGlzdGVuZXJzKGZpbmlzaGVkV29yaykge1xuICAvLyBJZiB0aGlzIGJvdW5kYXJ5IGp1c3QgdGltZWQgb3V0LCB0aGVuIGl0IHdpbGwgaGF2ZSBhIHNldCBvZiB3YWtlYWJsZXMuXG4gIC8vIEZvciBlYWNoIHdha2VhYmxlLCBhdHRhY2ggYSBsaXN0ZW5lciBzbyB0aGF0IHdoZW4gaXQgcmVzb2x2ZXMsIFJlYWN0XG4gIC8vIGF0dGVtcHRzIHRvIHJlLXJlbmRlciB0aGUgYm91bmRhcnkgaW4gdGhlIHByaW1hcnkgKHByZS10aW1lb3V0KSBzdGF0ZS5cbiAgdmFyIHdha2VhYmxlcyA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcblxuICBpZiAod2FrZWFibGVzICE9PSBudWxsKSB7XG4gICAgZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgICB2YXIgcmV0cnlDYWNoZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG5cbiAgICBpZiAocmV0cnlDYWNoZSA9PT0gbnVsbCkge1xuICAgICAgcmV0cnlDYWNoZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGUgPSBuZXcgUG9zc2libHlXZWFrU2V0KCk7XG4gICAgfVxuXG4gICAgd2FrZWFibGVzLmZvckVhY2goZnVuY3Rpb24gKHdha2VhYmxlKSB7XG4gICAgICAvLyBNZW1vaXplIHVzaW5nIHRoZSBib3VuZGFyeSBmaWJlciB0byBwcmV2ZW50IHJlZHVuZGFudCBsaXN0ZW5lcnMuXG4gICAgICB2YXIgcmV0cnkgPSByZXNvbHZlUmV0cnlXYWtlYWJsZS5iaW5kKG51bGwsIGZpbmlzaGVkV29yaywgd2FrZWFibGUpO1xuXG4gICAgICBpZiAoIXJldHJ5Q2FjaGUuaGFzKHdha2VhYmxlKSkge1xuICAgICAgICByZXRyeUNhY2hlLmFkZCh3YWtlYWJsZSk7XG5cbiAgICAgICAge1xuICAgICAgICAgIGlmIChpc0RldlRvb2xzUHJlc2VudCkge1xuICAgICAgICAgICAgaWYgKGluUHJvZ3Jlc3NMYW5lcyAhPT0gbnVsbCAmJiBpblByb2dyZXNzUm9vdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIHBlbmRpbmcgd29yayBzdGlsbCwgYXNzb2NpYXRlIHRoZSBvcmlnaW5hbCB1cGRhdGVycyB3aXRoIGl0LlxuICAgICAgICAgICAgICByZXN0b3JlUGVuZGluZ1VwZGF0ZXJzKGluUHJvZ3Jlc3NSb290LCBpblByb2dyZXNzTGFuZXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ0V4cGVjdGVkIGZpbmlzaGVkIHJvb3QgYW5kIGxhbmVzIHRvIGJlIHNldC4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB3YWtlYWJsZS50aGVuKHJldHJ5LCByZXRyeSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn0gLy8gVGhpcyBmdW5jdGlvbiBkZXRlY3RzIHdoZW4gYSBTdXNwZW5zZSBib3VuZGFyeSBnb2VzIGZyb20gdmlzaWJsZSB0byBoaWRkZW4uXG5mdW5jdGlvbiBjb21taXRNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrLCBjb21taXR0ZWRMYW5lcykge1xuICBpblByb2dyZXNzTGFuZXMgPSBjb21taXR0ZWRMYW5lcztcbiAgaW5Qcm9ncmVzc1Jvb3QgPSByb290O1xuICBzZXRDdXJyZW50RmliZXIoZmluaXNoZWRXb3JrKTtcbiAgY29tbWl0TXV0YXRpb25FZmZlY3RzT25GaWJlcihmaW5pc2hlZFdvcmssIHJvb3QpO1xuICBzZXRDdXJyZW50RmliZXIoZmluaXNoZWRXb3JrKTtcbiAgaW5Qcm9ncmVzc0xhbmVzID0gbnVsbDtcbiAgaW5Qcm9ncmVzc1Jvb3QgPSBudWxsO1xufVxuXG5mdW5jdGlvbiByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIHBhcmVudEZpYmVyLCBsYW5lcykge1xuICAvLyBEZWxldGlvbnMgZWZmZWN0cyBjYW4gYmUgc2NoZWR1bGVkIG9uIGFueSBmaWJlciB0eXBlLiBUaGV5IG5lZWQgdG8gaGFwcGVuXG4gIC8vIGJlZm9yZSB0aGUgY2hpbGRyZW4gZWZmZWN0cyBoYWUgZmlyZWQuXG4gIHZhciBkZWxldGlvbnMgPSBwYXJlbnRGaWJlci5kZWxldGlvbnM7XG5cbiAgaWYgKGRlbGV0aW9ucyAhPT0gbnVsbCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVsZXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2hpbGRUb0RlbGV0ZSA9IGRlbGV0aW9uc1tpXTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29tbWl0RGVsZXRpb25FZmZlY3RzKHJvb3QsIHBhcmVudEZpYmVyLCBjaGlsZFRvRGVsZXRlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGNoaWxkVG9EZWxldGUsIHBhcmVudEZpYmVyLCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHByZXZEZWJ1Z0ZpYmVyID0gZ2V0Q3VycmVudEZpYmVyKCk7XG5cbiAgaWYgKHBhcmVudEZpYmVyLnN1YnRyZWVGbGFncyAmIE11dGF0aW9uTWFzaykge1xuICAgIHZhciBjaGlsZCA9IHBhcmVudEZpYmVyLmNoaWxkO1xuXG4gICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBzZXRDdXJyZW50RmliZXIoY2hpbGQpO1xuICAgICAgY29tbWl0TXV0YXRpb25FZmZlY3RzT25GaWJlcihjaGlsZCwgcm9vdCk7XG4gICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgfVxuICB9XG5cbiAgc2V0Q3VycmVudEZpYmVyKHByZXZEZWJ1Z0ZpYmVyKTtcbn1cblxuZnVuY3Rpb24gY29tbWl0TXV0YXRpb25FZmZlY3RzT25GaWJlcihmaW5pc2hlZFdvcmssIHJvb3QsIGxhbmVzKSB7XG4gIHZhciBjdXJyZW50ID0gZmluaXNoZWRXb3JrLmFsdGVybmF0ZTtcbiAgdmFyIGZsYWdzID0gZmluaXNoZWRXb3JrLmZsYWdzOyAvLyBUaGUgZWZmZWN0IGZsYWcgc2hvdWxkIGJlIGNoZWNrZWQgKmFmdGVyKiB3ZSByZWZpbmUgdGhlIHR5cGUgb2YgZmliZXIsXG4gIC8vIGJlY2F1c2UgdGhlIGZpYmVyIHRhZyBpcyBtb3JlIHNwZWNpZmljLiBBbiBleGNlcHRpb24gaXMgYW55IGZsYWcgcmVsYXRlZFxuICAvLyB0byByZWNvbmNpbGF0aW9uLCBiZWNhdXNlIHRob3NlIGNhbiBiZSBzZXQgb24gYWxsIGZpYmVyIHR5cGVzLlxuXG4gIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgaWYgKGZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChJbnNlcnRpb24gfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7XG4gICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KEluc2VydGlvbiB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfSAvLyBMYXlvdXQgZWZmZWN0cyBhcmUgZGVzdHJveWVkIGR1cmluZyB0aGUgbXV0YXRpb24gcGhhc2Ugc28gdGhhdCBhbGxcbiAgICAgICAgICAvLyBkZXN0cm95IGZ1bmN0aW9ucyBmb3IgYWxsIGZpYmVycyBhcmUgY2FsbGVkIGJlZm9yZSBhbnkgY3JlYXRlIGZ1bmN0aW9ucy5cbiAgICAgICAgICAvLyBUaGlzIHByZXZlbnRzIHNpYmxpbmcgY29tcG9uZW50IGVmZmVjdHMgZnJvbSBpbnRlcmZlcmluZyB3aXRoIGVhY2ggb3RoZXIsXG4gICAgICAgICAgLy8gZS5nLiBhIGRlc3Ryb3kgZnVuY3Rpb24gaW4gb25lIGNvbXBvbmVudCBzaG91bGQgbmV2ZXIgb3ZlcnJpZGUgYSByZWYgc2V0XG4gICAgICAgICAgLy8gYnkgYSBjcmVhdGUgZnVuY3Rpb24gaW4gYW5vdGhlciBjb21wb25lbnQgZHVyaW5nIHRoZSBzYW1lIGNvbW1pdC5cblxuXG4gICAgICAgICAgaWYgKCBmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChMYXlvdXQgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KExheW91dCB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgaWYgKGZsYWdzICYgUmVmKSB7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHNhZmVseURldGFjaFJlZihjdXJyZW50LCBjdXJyZW50LnJldHVybik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFJlZikge1xuICAgICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzYWZlbHlEZXRhY2hSZWYoY3VycmVudCwgY3VycmVudC5yZXR1cm4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHtcbiAgICAgICAgICAvLyBUT0RPOiBDb250ZW50UmVzZXQgZ2V0cyBjbGVhcmVkIGJ5IHRoZSBjaGlsZHJlbiBkdXJpbmcgdGhlIGNvbW1pdFxuICAgICAgICAgIC8vIHBoYXNlLiBUaGlzIGlzIGEgcmVmYWN0b3IgaGF6YXJkIGJlY2F1c2UgaXQgbWVhbnMgd2UgbXVzdCByZWFkXG4gICAgICAgICAgLy8gZmxhZ3MgdGhlIGZsYWdzIGFmdGVyIGBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHNgIGhhcyBhbHJlYWR5IHJ1bjtcbiAgICAgICAgICAvLyB0aGUgb3JkZXIgbWF0dGVycy4gV2Ugc2hvdWxkIHJlZmFjdG9yIHNvIHRoYXQgQ29udGVudFJlc2V0IGRvZXMgbm90XG4gICAgICAgICAgLy8gcmVseSBvbiBtdXRhdGluZyB0aGUgZmxhZyBkdXJpbmcgY29tbWl0LiBMaWtlIGJ5IHNldHRpbmcgYSBmbGFnXG4gICAgICAgICAgLy8gZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UgaW5zdGVhZC5cbiAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLmZsYWdzICYgQ29udGVudFJlc2V0KSB7XG4gICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICByZXNldFRleHRDb250ZW50KGluc3RhbmNlKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChmbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgICAgdmFyIF9pbnN0YW5jZTQgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgICBpZiAoX2luc3RhbmNlNCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIENvbW1pdCB0aGUgd29yayBwcmVwYXJlZCBlYXJsaWVyLlxuICAgICAgICAgICAgICB2YXIgbmV3UHJvcHMgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wczsgLy8gRm9yIGh5ZHJhdGlvbiB3ZSByZXVzZSB0aGUgdXBkYXRlIHBhdGggYnV0IHdlIHRyZWF0IHRoZSBvbGRQcm9wc1xuICAgICAgICAgICAgICAvLyBhcyB0aGUgbmV3UHJvcHMuIFRoZSB1cGRhdGVQYXlsb2FkIHdpbGwgY29udGFpbiB0aGUgcmVhbCBjaGFuZ2UgaW5cbiAgICAgICAgICAgICAgLy8gdGhpcyBjYXNlLlxuXG4gICAgICAgICAgICAgIHZhciBvbGRQcm9wcyA9IGN1cnJlbnQgIT09IG51bGwgPyBjdXJyZW50Lm1lbW9pemVkUHJvcHMgOiBuZXdQcm9wcztcbiAgICAgICAgICAgICAgdmFyIHR5cGUgPSBmaW5pc2hlZFdvcmsudHlwZTsgLy8gVE9ETzogVHlwZSB0aGUgdXBkYXRlUXVldWUgdG8gYmUgc3BlY2lmaWMgdG8gaG9zdCBjb21wb25lbnRzLlxuXG4gICAgICAgICAgICAgIHZhciB1cGRhdGVQYXlsb2FkID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlO1xuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWUgPSBudWxsO1xuXG4gICAgICAgICAgICAgIGlmICh1cGRhdGVQYXlsb2FkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIGNvbW1pdFVwZGF0ZShfaW5zdGFuY2U0LCB1cGRhdGVQYXlsb2FkLCB0eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgaWYgKGZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKGZpbmlzaGVkV29yay5zdGF0ZU5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIHNob3VsZCBoYXZlIGEgdGV4dCBub2RlIGluaXRpYWxpemVkLiBUaGlzIGVycm9yIGlzIGxpa2VseSAnICsgJ2NhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciB0ZXh0SW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuICAgICAgICAgICAgdmFyIG5ld1RleHQgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wczsgLy8gRm9yIGh5ZHJhdGlvbiB3ZSByZXVzZSB0aGUgdXBkYXRlIHBhdGggYnV0IHdlIHRyZWF0IHRoZSBvbGRQcm9wc1xuICAgICAgICAgICAgLy8gYXMgdGhlIG5ld1Byb3BzLiBUaGUgdXBkYXRlUGF5bG9hZCB3aWxsIGNvbnRhaW4gdGhlIHJlYWwgY2hhbmdlIGluXG4gICAgICAgICAgICAvLyB0aGlzIGNhc2UuXG5cbiAgICAgICAgICAgIHZhciBvbGRUZXh0ID0gY3VycmVudCAhPT0gbnVsbCA/IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyA6IG5ld1RleHQ7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbW1pdFRleHRVcGRhdGUodGV4dEluc3RhbmNlLCBvbGRUZXh0LCBuZXdUZXh0KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgaWYgKGZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdmFyIHByZXZSb290U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgICAgICAgaWYgKHByZXZSb290U3RhdGUuaXNEZWh5ZHJhdGVkKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIGNvbW1pdEh5ZHJhdGVkQ29udGFpbmVyKHJvb3QuY29udGFpbmVySW5mbyk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuICAgICAgICB2YXIgb2Zmc2NyZWVuRmliZXIgPSBmaW5pc2hlZFdvcmsuY2hpbGQ7XG5cbiAgICAgICAgaWYgKG9mZnNjcmVlbkZpYmVyLmZsYWdzICYgVmlzaWJpbGl0eSkge1xuICAgICAgICAgIHZhciBvZmZzY3JlZW5JbnN0YW5jZSA9IG9mZnNjcmVlbkZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICB2YXIgbmV3U3RhdGUgPSBvZmZzY3JlZW5GaWJlci5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgIHZhciBpc0hpZGRlbiA9IG5ld1N0YXRlICE9PSBudWxsOyAvLyBUcmFjayB0aGUgY3VycmVudCBzdGF0ZSBvbiB0aGUgT2Zmc2NyZWVuIGluc3RhbmNlIHNvIHdlIGNhblxuICAgICAgICAgIC8vIHJlYWQgaXQgZHVyaW5nIGFuIGV2ZW50XG5cbiAgICAgICAgICBvZmZzY3JlZW5JbnN0YW5jZS5pc0hpZGRlbiA9IGlzSGlkZGVuO1xuXG4gICAgICAgICAgaWYgKGlzSGlkZGVuKSB7XG4gICAgICAgICAgICB2YXIgd2FzSGlkZGVuID0gb2Zmc2NyZWVuRmliZXIuYWx0ZXJuYXRlICE9PSBudWxsICYmIG9mZnNjcmVlbkZpYmVyLmFsdGVybmF0ZS5tZW1vaXplZFN0YXRlICE9PSBudWxsO1xuXG4gICAgICAgICAgICBpZiAoIXdhc0hpZGRlbikge1xuICAgICAgICAgICAgICAvLyBUT0RPOiBNb3ZlIHRvIHBhc3NpdmUgcGhhc2VcbiAgICAgICAgICAgICAgbWFya0NvbW1pdFRpbWVPZkZhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbW1pdFN1c3BlbnNlQ2FsbGJhY2soZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXR0YWNoU3VzcGVuc2VSZXRyeUxpc3RlbmVycyhmaW5pc2hlZFdvcmspO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBfd2FzSGlkZGVuID0gY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50Lm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgaWYgKCAvLyBUT0RPOiBSZW1vdmUgdGhpcyBkZWFkIGZsYWdcbiAgICAgICAgIGZpbmlzaGVkV29yay5tb2RlICYgQ29uY3VycmVudE1vZGUpIHtcbiAgICAgICAgICAvLyBCZWZvcmUgY29tbWl0dGluZyB0aGUgY2hpbGRyZW4sIHRyYWNrIG9uIHRoZSBzdGFjayB3aGV0aGVyIHRoaXNcbiAgICAgICAgICAvLyBvZmZzY3JlZW4gc3VidHJlZSB3YXMgYWxyZWFkeSBoaWRkZW4sIHNvIHRoYXQgd2UgZG9uJ3QgdW5tb3VudCB0aGVcbiAgICAgICAgICAvLyBlZmZlY3RzIGFnYWluLlxuICAgICAgICAgIHZhciBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47XG4gICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuIHx8IF93YXNIaWRkZW47XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIH1cblxuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpZiAoZmxhZ3MgJiBWaXNpYmlsaXR5KSB7XG4gICAgICAgICAgdmFyIF9vZmZzY3JlZW5JbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgICAgdmFyIF9uZXdTdGF0ZSA9IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlO1xuXG4gICAgICAgICAgdmFyIF9pc0hpZGRlbiA9IF9uZXdTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICAgIHZhciBvZmZzY3JlZW5Cb3VuZGFyeSA9IGZpbmlzaGVkV29yazsgLy8gVHJhY2sgdGhlIGN1cnJlbnQgc3RhdGUgb24gdGhlIE9mZnNjcmVlbiBpbnN0YW5jZSBzbyB3ZSBjYW5cbiAgICAgICAgICAvLyByZWFkIGl0IGR1cmluZyBhbiBldmVudFxuXG4gICAgICAgICAgX29mZnNjcmVlbkluc3RhbmNlLmlzSGlkZGVuID0gX2lzSGlkZGVuO1xuXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKF9pc0hpZGRlbikge1xuICAgICAgICAgICAgICBpZiAoIV93YXNIaWRkZW4pIHtcbiAgICAgICAgICAgICAgICBpZiAoKG9mZnNjcmVlbkJvdW5kYXJ5Lm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgICAgICAgICAgbmV4dEVmZmVjdCA9IG9mZnNjcmVlbkJvdW5kYXJ5O1xuICAgICAgICAgICAgICAgICAgdmFyIG9mZnNjcmVlbkNoaWxkID0gb2Zmc2NyZWVuQm91bmRhcnkuY2hpbGQ7XG5cbiAgICAgICAgICAgICAgICAgIHdoaWxlIChvZmZzY3JlZW5DaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBuZXh0RWZmZWN0ID0gb2Zmc2NyZWVuQ2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIGRpc2FwcGVhckxheW91dEVmZmVjdHNfYmVnaW4ob2Zmc2NyZWVuQ2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICBvZmZzY3JlZW5DaGlsZCA9IG9mZnNjcmVlbkNoaWxkLnNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAge1xuICAgICAgICAgICAgLy8gVE9ETzogVGhpcyBuZWVkcyB0byBydW4gd2hlbmV2ZXIgdGhlcmUncyBhbiBpbnNlcnRpb24gb3IgdXBkYXRlXG4gICAgICAgICAgICAvLyBpbnNpZGUgYSBoaWRkZW4gT2Zmc2NyZWVuIHRyZWUuXG4gICAgICAgICAgICBoaWRlT3JVbmhpZGVBbGxDaGlsZHJlbihvZmZzY3JlZW5Cb3VuZGFyeSwgX2lzSGlkZGVuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpZiAoZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICBhdHRhY2hTdXNwZW5zZVJldHJ5TGlzdGVuZXJzKGZpbmlzaGVkV29yayk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIFNjb3BlQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKSB7XG4gIC8vIFBsYWNlbWVudCBlZmZlY3RzIChpbnNlcnRpb25zLCByZW9yZGVycykgY2FuIGJlIHNjaGVkdWxlZCBvbiBhbnkgZmliZXJcbiAgLy8gdHlwZS4gVGhleSBuZWVkcyB0byBoYXBwZW4gYWZ0ZXIgdGhlIGNoaWxkcmVuIGVmZmVjdHMgaGF2ZSBmaXJlZCwgYnV0XG4gIC8vIGJlZm9yZSB0aGUgZWZmZWN0cyBvbiB0aGlzIGZpYmVyIGhhdmUgZmlyZWQuXG4gIHZhciBmbGFncyA9IGZpbmlzaGVkV29yay5mbGFncztcblxuICBpZiAoZmxhZ3MgJiBQbGFjZW1lbnQpIHtcbiAgICB0cnkge1xuICAgICAgY29tbWl0UGxhY2VtZW50KGZpbmlzaGVkV29yayk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgIH0gLy8gQ2xlYXIgdGhlIFwicGxhY2VtZW50XCIgZnJvbSBlZmZlY3QgdGFnIHNvIHRoYXQgd2Uga25vdyB0aGF0IHRoaXMgaXNcbiAgICAvLyBpbnNlcnRlZCwgYmVmb3JlIGFueSBsaWZlLWN5Y2xlcyBsaWtlIGNvbXBvbmVudERpZE1vdW50IGdldHMgY2FsbGVkLlxuICAgIC8vIFRPRE86IGZpbmRET01Ob2RlIGRvZXNuJ3QgcmVseSBvbiB0aGlzIGFueSBtb3JlIGJ1dCBpc01vdW50ZWQgZG9lc1xuICAgIC8vIGFuZCBpc01vdW50ZWQgaXMgZGVwcmVjYXRlZCBhbnl3YXkgc28gd2Ugc2hvdWxkIGJlIGFibGUgdG8ga2lsbCB0aGlzLlxuXG5cbiAgICBmaW5pc2hlZFdvcmsuZmxhZ3MgJj0gflBsYWNlbWVudDtcbiAgfVxuXG4gIGlmIChmbGFncyAmIEh5ZHJhdGluZykge1xuICAgIGZpbmlzaGVkV29yay5mbGFncyAmPSB+SHlkcmF0aW5nO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdExheW91dEVmZmVjdHMoZmluaXNoZWRXb3JrLCByb290LCBjb21taXR0ZWRMYW5lcykge1xuICBpblByb2dyZXNzTGFuZXMgPSBjb21taXR0ZWRMYW5lcztcbiAgaW5Qcm9ncmVzc1Jvb3QgPSByb290O1xuICBuZXh0RWZmZWN0ID0gZmluaXNoZWRXb3JrO1xuICBjb21taXRMYXlvdXRFZmZlY3RzX2JlZ2luKGZpbmlzaGVkV29yaywgcm9vdCwgY29tbWl0dGVkTGFuZXMpO1xuICBpblByb2dyZXNzTGFuZXMgPSBudWxsO1xuICBpblByb2dyZXNzUm9vdCA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGNvbW1pdExheW91dEVmZmVjdHNfYmVnaW4oc3VidHJlZVJvb3QsIHJvb3QsIGNvbW1pdHRlZExhbmVzKSB7XG4gIC8vIFN1c3BlbnNlIGxheW91dCBlZmZlY3RzIHNlbWFudGljcyBkb24ndCBjaGFuZ2UgZm9yIGxlZ2FjeSByb290cy5cbiAgdmFyIGlzTW9kZXJuUm9vdCA9IChzdWJ0cmVlUm9vdC5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG5cbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuICAgIHZhciBmaXJzdENoaWxkID0gZmliZXIuY2hpbGQ7XG5cbiAgICBpZiAoIGZpYmVyLnRhZyA9PT0gT2Zmc2NyZWVuQ29tcG9uZW50ICYmIGlzTW9kZXJuUm9vdCkge1xuICAgICAgLy8gS2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBPZmZzY3JlZW4gc3RhY2sncyBzdGF0ZS5cbiAgICAgIHZhciBpc0hpZGRlbiA9IGZpYmVyLm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG4gICAgICB2YXIgbmV3T2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuID0gaXNIaWRkZW4gfHwgb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuO1xuXG4gICAgICBpZiAobmV3T2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuKSB7XG4gICAgICAgIC8vIFRoZSBPZmZzY3JlZW4gdHJlZSBpcyBoaWRkZW4uIFNraXAgb3ZlciBpdHMgbGF5b3V0IGVmZmVjdHMuXG4gICAgICAgIGNvbW1pdExheW91dE1vdW50RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRPRE8gKE9mZnNjcmVlbikgQWxzbyBjaGVjazogc3VidHJlZUZsYWdzICYgTGF5b3V0TWFza1xuICAgICAgICB2YXIgY3VycmVudCA9IGZpYmVyLmFsdGVybmF0ZTtcbiAgICAgICAgdmFyIHdhc0hpZGRlbiA9IGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudC5tZW1vaXplZFN0YXRlICE9PSBudWxsO1xuICAgICAgICB2YXIgbmV3T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IHdhc0hpZGRlbiB8fCBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuO1xuICAgICAgICB2YXIgcHJldk9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiA9IG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbjtcbiAgICAgICAgdmFyIHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjsgLy8gVHJhdmVyc2UgdGhlIE9mZnNjcmVlbiBzdWJ0cmVlIHdpdGggdGhlIGN1cnJlbnQgT2Zmc2NyZWVuIGFzIHRoZSByb290LlxuXG4gICAgICAgIG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiA9IG5ld09mZnNjcmVlblN1YnRyZWVJc0hpZGRlbjtcbiAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IG5ld09mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47XG5cbiAgICAgICAgaWYgKG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gJiYgIXByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyB0aGUgcm9vdCBvZiBhIHJlYXBwZWFyaW5nIGJvdW5kYXJ5LiBUdXJuIGl0cyBsYXlvdXQgZWZmZWN0c1xuICAgICAgICAgIC8vIGJhY2sgb24uXG4gICAgICAgICAgbmV4dEVmZmVjdCA9IGZpYmVyO1xuICAgICAgICAgIHJlYXBwZWFyTGF5b3V0RWZmZWN0c19iZWdpbihmaWJlcik7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY2hpbGQgPSBmaXJzdENoaWxkO1xuXG4gICAgICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgIG5leHRFZmZlY3QgPSBjaGlsZDtcbiAgICAgICAgICBjb21taXRMYXlvdXRFZmZlY3RzX2JlZ2luKGNoaWxkLCAvLyBOZXcgcm9vdDsgYnViYmxlIGJhY2sgdXAgdG8gaGVyZSBhbmQgc3RvcC5cbiAgICAgICAgICByb290LCBjb21taXR0ZWRMYW5lcyk7XG4gICAgICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICAgICAgICB9IC8vIFJlc3RvcmUgT2Zmc2NyZWVuIHN0YXRlIGFuZCByZXN1bWUgaW4gb3VyLXByb2dyZXNzIHRyYXZlcnNhbC5cblxuXG4gICAgICAgIG5leHRFZmZlY3QgPSBmaWJlcjtcbiAgICAgICAgb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuID0gcHJldk9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbjtcbiAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuO1xuICAgICAgICBjb21taXRMYXlvdXRNb3VudEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QsIHJvb3QsIGNvbW1pdHRlZExhbmVzKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKChmaWJlci5zdWJ0cmVlRmxhZ3MgJiBMYXlvdXRNYXNrKSAhPT0gTm9GbGFncyAmJiBmaXJzdENoaWxkICE9PSBudWxsKSB7XG4gICAgICBmaXJzdENoaWxkLnJldHVybiA9IGZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IGZpcnN0Q2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbW1pdExheW91dE1vdW50RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRMYXlvdXRNb3VudEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QsIHJvb3QsIGNvbW1pdHRlZExhbmVzKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcblxuICAgIGlmICgoZmliZXIuZmxhZ3MgJiBMYXlvdXRNYXNrKSAhPT0gTm9GbGFncykge1xuICAgICAgdmFyIGN1cnJlbnQgPSBmaWJlci5hbHRlcm5hdGU7XG4gICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb21taXRMYXlvdXRFZmZlY3RPbkZpYmVyKHJvb3QsIGN1cnJlbnQsIGZpYmVyLCBjb21taXR0ZWRMYW5lcyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgICB9XG5cbiAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgfVxuXG4gICAgaWYgKGZpYmVyID09PSBzdWJ0cmVlUm9vdCkge1xuICAgICAgbmV4dEVmZmVjdCA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nO1xuXG4gICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgIHNpYmxpbmcucmV0dXJuID0gZmliZXIucmV0dXJuO1xuICAgICAgbmV4dEVmZmVjdCA9IHNpYmxpbmc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbmV4dEVmZmVjdCA9IGZpYmVyLnJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNhcHBlYXJMYXlvdXRFZmZlY3RzX2JlZ2luKHN1YnRyZWVSb290KSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcbiAgICB2YXIgZmlyc3RDaGlsZCA9IGZpYmVyLmNoaWxkOyAvLyBUT0RPIChPZmZzY3JlZW4pIENoZWNrOiBmbGFncyAmIChSZWZTdGF0aWMgfCBMYXlvdXRTdGF0aWMpXG5cbiAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGlmICggZmliZXIubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChMYXlvdXQsIGZpYmVyLCBmaWJlci5yZXR1cm4pO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZmliZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoTGF5b3V0LCBmaWJlciwgZmliZXIucmV0dXJuKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgLy8gVE9ETyAoT2Zmc2NyZWVuKSBDaGVjazogZmxhZ3MgJiBSZWZTdGF0aWNcbiAgICAgICAgICBzYWZlbHlEZXRhY2hSZWYoZmliZXIsIGZpYmVyLnJldHVybik7XG4gICAgICAgICAgdmFyIGluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVW5tb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgc2FmZWx5Q2FsbENvbXBvbmVudFdpbGxVbm1vdW50KGZpYmVyLCBmaWJlci5yZXR1cm4sIGluc3RhbmNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBzYWZlbHlEZXRhY2hSZWYoZmliZXIsIGZpYmVyLnJldHVybik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGFcbiAgICAgICAgICB2YXIgaXNIaWRkZW4gPSBmaWJlci5tZW1vaXplZFN0YXRlICE9PSBudWxsO1xuXG4gICAgICAgICAgaWYgKGlzSGlkZGVuKSB7XG4gICAgICAgICAgICAvLyBOZXN0ZWQgT2Zmc2NyZWVuIHRyZWUgaXMgYWxyZWFkeSBoaWRkZW4uIERvbid0IGRpc2FwcGVhclxuICAgICAgICAgICAgLy8gaXRzIGVmZmVjdHMuXG4gICAgICAgICAgICBkaXNhcHBlYXJMYXlvdXRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfSAvLyBUT0RPIChPZmZzY3JlZW4pIENoZWNrOiBzdWJ0cmVlRmxhZ3MgJiBMYXlvdXRTdGF0aWNcblxuXG4gICAgaWYgKGZpcnN0Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGZpcnN0Q2hpbGQucmV0dXJuID0gZmliZXI7XG4gICAgICBuZXh0RWZmZWN0ID0gZmlyc3RDaGlsZDtcbiAgICB9IGVsc2Uge1xuICAgICAgZGlzYXBwZWFyTGF5b3V0RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRpc2FwcGVhckxheW91dEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuXG4gICAgaWYgKGZpYmVyID09PSBzdWJ0cmVlUm9vdCkge1xuICAgICAgbmV4dEVmZmVjdCA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nO1xuXG4gICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgIHNpYmxpbmcucmV0dXJuID0gZmliZXIucmV0dXJuO1xuICAgICAgbmV4dEVmZmVjdCA9IHNpYmxpbmc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbmV4dEVmZmVjdCA9IGZpYmVyLnJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWFwcGVhckxheW91dEVmZmVjdHNfYmVnaW4oc3VidHJlZVJvb3QpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuICAgIHZhciBmaXJzdENoaWxkID0gZmliZXIuY2hpbGQ7XG5cbiAgICBpZiAoZmliZXIudGFnID09PSBPZmZzY3JlZW5Db21wb25lbnQpIHtcbiAgICAgIHZhciBpc0hpZGRlbiA9IGZpYmVyLm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG5cbiAgICAgIGlmIChpc0hpZGRlbikge1xuICAgICAgICAvLyBOZXN0ZWQgT2Zmc2NyZWVuIHRyZWUgaXMgc3RpbGwgaGlkZGVuLiBEb24ndCByZS1hcHBlYXIgaXRzIGVmZmVjdHMuXG4gICAgICAgIHJlYXBwZWFyTGF5b3V0RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH0gLy8gVE9ETyAoT2Zmc2NyZWVuKSBDaGVjazogc3VidHJlZUZsYWdzICYgTGF5b3V0U3RhdGljXG5cblxuICAgIGlmIChmaXJzdENoaWxkICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIG5vZGUgbWF5IGhhdmUgYmVlbiByZXVzZWQgZnJvbSBhIHByZXZpb3VzIHJlbmRlciwgc28gd2UgY2FuJ3RcbiAgICAgIC8vIGFzc3VtZSBpdHMgcmV0dXJuIHBvaW50ZXIgaXMgY29ycmVjdC5cbiAgICAgIGZpcnN0Q2hpbGQucmV0dXJuID0gZmliZXI7XG4gICAgICBuZXh0RWZmZWN0ID0gZmlyc3RDaGlsZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVhcHBlYXJMYXlvdXRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhcHBlYXJMYXlvdXRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290KSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDsgLy8gVE9ETyAoT2Zmc2NyZWVuKSBDaGVjazogZmxhZ3MgJiBMYXlvdXRTdGF0aWNcblxuICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG5cbiAgICB0cnkge1xuICAgICAgcmVhcHBlYXJMYXlvdXRFZmZlY3RzT25GaWJlcihmaWJlcik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICB9XG5cbiAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuXG4gICAgaWYgKGZpYmVyID09PSBzdWJ0cmVlUm9vdCkge1xuICAgICAgbmV4dEVmZmVjdCA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nO1xuXG4gICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgbm9kZSBtYXkgaGF2ZSBiZWVuIHJldXNlZCBmcm9tIGEgcHJldmlvdXMgcmVuZGVyLCBzbyB3ZSBjYW4ndFxuICAgICAgLy8gYXNzdW1lIGl0cyByZXR1cm4gcG9pbnRlciBpcyBjb3JyZWN0LlxuICAgICAgc2libGluZy5yZXR1cm4gPSBmaWJlci5yZXR1cm47XG4gICAgICBuZXh0RWZmZWN0ID0gc2libGluZztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0RWZmZWN0ID0gZmliZXIucmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrLCBjb21taXR0ZWRMYW5lcywgY29tbWl0dGVkVHJhbnNpdGlvbnMpIHtcbiAgbmV4dEVmZmVjdCA9IGZpbmlzaGVkV29yaztcbiAgY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0c19iZWdpbihmaW5pc2hlZFdvcmssIHJvb3QsIGNvbW1pdHRlZExhbmVzLCBjb21taXR0ZWRUcmFuc2l0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHNfYmVnaW4oc3VidHJlZVJvb3QsIHJvb3QsIGNvbW1pdHRlZExhbmVzLCBjb21taXR0ZWRUcmFuc2l0aW9ucykge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG4gICAgdmFyIGZpcnN0Q2hpbGQgPSBmaWJlci5jaGlsZDtcblxuICAgIGlmICgoZmliZXIuc3VidHJlZUZsYWdzICYgUGFzc2l2ZU1hc2spICE9PSBOb0ZsYWdzICYmIGZpcnN0Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGZpcnN0Q2hpbGQucmV0dXJuID0gZmliZXI7XG4gICAgICBuZXh0RWZmZWN0ID0gZmlyc3RDaGlsZDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMsIGNvbW1pdHRlZFRyYW5zaXRpb25zKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMsIGNvbW1pdHRlZFRyYW5zaXRpb25zKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcblxuICAgIGlmICgoZmliZXIuZmxhZ3MgJiBQYXNzaXZlKSAhPT0gTm9GbGFncykge1xuICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29tbWl0UGFzc2l2ZU1vdW50T25GaWJlcihyb290LCBmaWJlciwgY29tbWl0dGVkTGFuZXMsIGNvbW1pdHRlZFRyYW5zaXRpb25zKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICAgIH1cblxuICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICB9XG5cbiAgICBpZiAoZmliZXIgPT09IHN1YnRyZWVSb290KSB7XG4gICAgICBuZXh0RWZmZWN0ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2libGluZy5yZXR1cm4gPSBmaWJlci5yZXR1cm47XG4gICAgICBuZXh0RWZmZWN0ID0gc2libGluZztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0RWZmZWN0ID0gZmliZXIucmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVNb3VudE9uRmliZXIoZmluaXNoZWRSb290LCBmaW5pc2hlZFdvcmssIGNvbW1pdHRlZExhbmVzLCBjb21taXR0ZWRUcmFuc2l0aW9ucykge1xuICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICggZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgIHN0YXJ0UGFzc2l2ZUVmZmVjdFRpbWVyKCk7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChQYXNzaXZlJDEgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHJlY29yZFBhc3NpdmVFZmZlY3REdXJhdGlvbihmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KFBhc3NpdmUkMSB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0cyhmaXJzdENoaWxkKSB7XG4gIG5leHRFZmZlY3QgPSBmaXJzdENoaWxkO1xuICBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNfYmVnaW4oKTtcbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzX2JlZ2luKCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG4gICAgdmFyIGNoaWxkID0gZmliZXIuY2hpbGQ7XG5cbiAgICBpZiAoKG5leHRFZmZlY3QuZmxhZ3MgJiBDaGlsZERlbGV0aW9uKSAhPT0gTm9GbGFncykge1xuICAgICAgdmFyIGRlbGV0aW9ucyA9IGZpYmVyLmRlbGV0aW9ucztcblxuICAgICAgaWYgKGRlbGV0aW9ucyAhPT0gbnVsbCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlbGV0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBmaWJlclRvRGVsZXRlID0gZGVsZXRpb25zW2ldO1xuICAgICAgICAgIG5leHRFZmZlY3QgPSBmaWJlclRvRGVsZXRlO1xuICAgICAgICAgIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c0luc2lkZU9mRGVsZXRlZFRyZWVfYmVnaW4oZmliZXJUb0RlbGV0ZSwgZmliZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAge1xuICAgICAgICAgIC8vIEEgZmliZXIgd2FzIGRlbGV0ZWQgZnJvbSB0aGlzIHBhcmVudCBmaWJlciwgYnV0IGl0J3Mgc3RpbGwgcGFydCBvZlxuICAgICAgICAgIC8vIHRoZSBwcmV2aW91cyAoYWx0ZXJuYXRlKSBwYXJlbnQgZmliZXIncyBsaXN0IG9mIGNoaWxkcmVuLiBCZWNhdXNlXG4gICAgICAgICAgLy8gY2hpbGRyZW4gYXJlIGEgbGlua2VkIGxpc3QsIGFuIGVhcmxpZXIgc2libGluZyB0aGF0J3Mgc3RpbGwgYWxpdmVcbiAgICAgICAgICAvLyB3aWxsIGJlIGNvbm5lY3RlZCB0byB0aGUgZGVsZXRlZCBmaWJlciB2aWEgaXRzIGBhbHRlcm5hdGVgOlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gICBsaXZlIGZpYmVyXG4gICAgICAgICAgLy8gICAtLWFsdGVybmF0ZS0tPiBwcmV2aW91cyBsaXZlIGZpYmVyXG4gICAgICAgICAgLy8gICAtLXNpYmxpbmctLT4gZGVsZXRlZCBmaWJlclxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gV2UgY2FuJ3QgZGlzY29ubmVjdCBgYWx0ZXJuYXRlYCBvbiBub2RlcyB0aGF0IGhhdmVuJ3QgYmVlbiBkZWxldGVkXG4gICAgICAgICAgLy8geWV0LCBidXQgd2UgY2FuIGRpc2Nvbm5lY3QgdGhlIGBzaWJsaW5nYCBhbmQgYGNoaWxkYCBwb2ludGVycy5cbiAgICAgICAgICB2YXIgcHJldmlvdXNGaWJlciA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICAgICAgICAgIGlmIChwcmV2aW91c0ZpYmVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgZGV0YWNoZWRDaGlsZCA9IHByZXZpb3VzRmliZXIuY2hpbGQ7XG5cbiAgICAgICAgICAgIGlmIChkZXRhY2hlZENoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHByZXZpb3VzRmliZXIuY2hpbGQgPSBudWxsO1xuXG4gICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICB2YXIgZGV0YWNoZWRTaWJsaW5nID0gZGV0YWNoZWRDaGlsZC5zaWJsaW5nO1xuICAgICAgICAgICAgICAgIGRldGFjaGVkQ2hpbGQuc2libGluZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgZGV0YWNoZWRDaGlsZCA9IGRldGFjaGVkU2libGluZztcbiAgICAgICAgICAgICAgfSB3aGlsZSAoZGV0YWNoZWRDaGlsZCAhPT0gbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbmV4dEVmZmVjdCA9IGZpYmVyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICgoZmliZXIuc3VidHJlZUZsYWdzICYgUGFzc2l2ZU1hc2spICE9PSBOb0ZsYWdzICYmIGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBjaGlsZC5yZXR1cm4gPSBmaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBjaGlsZDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzX2NvbXBsZXRlKCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c19jb21wbGV0ZSgpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuXG4gICAgaWYgKChmaWJlci5mbGFncyAmIFBhc3NpdmUpICE9PSBOb0ZsYWdzKSB7XG4gICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuICAgICAgY29tbWl0UGFzc2l2ZVVubW91bnRPbkZpYmVyKGZpYmVyKTtcbiAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgfVxuXG4gICAgdmFyIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nO1xuXG4gICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgIHNpYmxpbmcucmV0dXJuID0gZmliZXIucmV0dXJuO1xuICAgICAgbmV4dEVmZmVjdCA9IHNpYmxpbmc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbmV4dEVmZmVjdCA9IGZpYmVyLnJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudE9uRmliZXIoZmluaXNoZWRXb3JrKSB7XG4gIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCBmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgc3RhcnRQYXNzaXZlRWZmZWN0VGltZXIoKTtcbiAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoUGFzc2l2ZSQxIHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4pO1xuICAgICAgICAgIHJlY29yZFBhc3NpdmVFZmZlY3REdXJhdGlvbihmaW5pc2hlZFdvcmspO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChQYXNzaXZlJDEgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNJbnNpZGVPZkRlbGV0ZWRUcmVlX2JlZ2luKGRlbGV0ZWRTdWJ0cmVlUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcikge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7IC8vIERlbGV0aW9uIGVmZmVjdHMgZmlyZSBpbiBwYXJlbnQgLT4gY2hpbGQgb3JkZXJcbiAgICAvLyBUT0RPOiBDaGVjayBpZiBmaWJlciBoYXMgYSBQYXNzaXZlU3RhdGljIGZsYWdcblxuICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG4gICAgY29tbWl0UGFzc2l2ZVVubW91bnRJbnNpZGVEZWxldGVkVHJlZU9uRmliZXIoZmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpO1xuICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgdmFyIGNoaWxkID0gZmliZXIuY2hpbGQ7IC8vIFRPRE86IE9ubHkgdHJhdmVyc2Ugc3VidHJlZSBpZiBpdCBoYXMgYSBQYXNzaXZlU3RhdGljIGZsYWcuIChCdXQsIGlmIHdlXG4gICAgLy8gZG8gdGhpcywgc3RpbGwgbmVlZCB0byBoYW5kbGUgYGRlbGV0ZWRUcmVlQ2xlYW5VcExldmVsYCBjb3JyZWN0bHkuKVxuXG4gICAgaWYgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBjaGlsZC5yZXR1cm4gPSBmaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBjaGlsZDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzSW5zaWRlT2ZEZWxldGVkVHJlZV9jb21wbGV0ZShkZWxldGVkU3VidHJlZVJvb3QpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNJbnNpZGVPZkRlbGV0ZWRUcmVlX2NvbXBsZXRlKGRlbGV0ZWRTdWJ0cmVlUm9vdCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG4gICAgdmFyIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nO1xuICAgIHZhciByZXR1cm5GaWJlciA9IGZpYmVyLnJldHVybjtcblxuICAgIHtcbiAgICAgIC8vIFJlY3Vyc2l2ZWx5IHRyYXZlcnNlIHRoZSBlbnRpcmUgZGVsZXRlZCB0cmVlIGFuZCBjbGVhbiB1cCBmaWJlciBmaWVsZHMuXG4gICAgICAvLyBUaGlzIGlzIG1vcmUgYWdncmVzc2l2ZSB0aGFuIGlkZWFsLCBhbmQgdGhlIGxvbmcgdGVybSBnb2FsIGlzIHRvIG9ubHlcbiAgICAgIC8vIGhhdmUgdG8gZGV0YWNoIHRoZSBkZWxldGVkIHRyZWUgYXQgdGhlIHJvb3QuXG4gICAgICBkZXRhY2hGaWJlckFmdGVyRWZmZWN0cyhmaWJlcik7XG5cbiAgICAgIGlmIChmaWJlciA9PT0gZGVsZXRlZFN1YnRyZWVSb290KSB7XG4gICAgICAgIG5leHRFZmZlY3QgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgIHNpYmxpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICBuZXh0RWZmZWN0ID0gc2libGluZztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0RWZmZWN0ID0gcmV0dXJuRmliZXI7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZVVubW91bnRJbnNpZGVEZWxldGVkVHJlZU9uRmliZXIoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcikge1xuICBzd2l0Y2ggKGN1cnJlbnQudGFnKSB7XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoIGN1cnJlbnQubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgc3RhcnRQYXNzaXZlRWZmZWN0VGltZXIoKTtcbiAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoUGFzc2l2ZSQxLCBjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKTtcbiAgICAgICAgICByZWNvcmRQYXNzaXZlRWZmZWN0RHVyYXRpb24oY3VycmVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KFBhc3NpdmUkMSwgY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcik7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxufSAvLyBUT0RPOiBSZXVzZSByZWFwcGVhckxheW91dEVmZmVjdHMgdHJhdmVyc2FsIGhlcmU/XG5cblxuZnVuY3Rpb24gaW52b2tlTGF5b3V0RWZmZWN0TW91bnRJbkRFVihmaWJlcikge1xuICB7XG4gICAgLy8gV2UgZG9uJ3QgbmVlZCB0byByZS1jaGVjayBTdHJpY3RFZmZlY3RzTW9kZSBoZXJlLlxuICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgaWYgdGhhdCBjaGVjayBoYXMgYWxyZWFkeSBwYXNzZWQuXG4gICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChMYXlvdXQgfCBIYXNFZmZlY3QsIGZpYmVyKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQoKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGludm9rZVBhc3NpdmVFZmZlY3RNb3VudEluREVWKGZpYmVyKSB7XG4gIHtcbiAgICAvLyBXZSBkb24ndCBuZWVkIHRvIHJlLWNoZWNrIFN0cmljdEVmZmVjdHNNb2RlIGhlcmUuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBpZiB0aGF0IGNoZWNrIGhhcyBhbHJlYWR5IHBhc3NlZC5cbiAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KFBhc3NpdmUkMSB8IEhhc0VmZmVjdCwgZmliZXIpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW52b2tlTGF5b3V0RWZmZWN0VW5tb3VudEluREVWKGZpYmVyKSB7XG4gIHtcbiAgICAvLyBXZSBkb24ndCBuZWVkIHRvIHJlLWNoZWNrIFN0cmljdEVmZmVjdHNNb2RlIGhlcmUuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBpZiB0aGF0IGNoZWNrIGhhcyBhbHJlYWR5IHBhc3NlZC5cbiAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoTGF5b3V0IHwgSGFzRWZmZWN0LCBmaWJlciwgZmliZXIucmV0dXJuKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVbm1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBzYWZlbHlDYWxsQ29tcG9uZW50V2lsbFVubW91bnQoZmliZXIsIGZpYmVyLnJldHVybiwgaW5zdGFuY2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGludm9rZVBhc3NpdmVFZmZlY3RVbm1vdW50SW5ERVYoZmliZXIpIHtcbiAge1xuICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gcmUtY2hlY2sgU3RyaWN0RWZmZWN0c01vZGUgaGVyZS5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGlmIHRoYXQgY2hlY2sgaGFzIGFscmVhZHkgcGFzc2VkLlxuICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChQYXNzaXZlJDEgfCBIYXNFZmZlY3QsIGZpYmVyLCBmaWJlci5yZXR1cm4pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBDT01QT05FTlRfVFlQRSA9IDA7XG52YXIgSEFTX1BTRVVET19DTEFTU19UWVBFID0gMTtcbnZhciBST0xFX1RZUEUgPSAyO1xudmFyIFRFU1RfTkFNRV9UWVBFID0gMztcbnZhciBURVhUX1RZUEUgPSA0O1xuXG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuZm9yKSB7XG4gIHZhciBzeW1ib2xGb3IgPSBTeW1ib2wuZm9yO1xuICBDT01QT05FTlRfVFlQRSA9IHN5bWJvbEZvcignc2VsZWN0b3IuY29tcG9uZW50Jyk7XG4gIEhBU19QU0VVRE9fQ0xBU1NfVFlQRSA9IHN5bWJvbEZvcignc2VsZWN0b3IuaGFzX3BzZXVkb19jbGFzcycpO1xuICBST0xFX1RZUEUgPSBzeW1ib2xGb3IoJ3NlbGVjdG9yLnJvbGUnKTtcbiAgVEVTVF9OQU1FX1RZUEUgPSBzeW1ib2xGb3IoJ3NlbGVjdG9yLnRlc3RfaWQnKTtcbiAgVEVYVF9UWVBFID0gc3ltYm9sRm9yKCdzZWxlY3Rvci50ZXh0Jyk7XG59XG52YXIgY29tbWl0SG9va3MgPSBbXTtcbmZ1bmN0aW9uIG9uQ29tbWl0Um9vdCQxKCkge1xuICB7XG4gICAgY29tbWl0SG9va3MuZm9yRWFjaChmdW5jdGlvbiAoY29tbWl0SG9vaykge1xuICAgICAgcmV0dXJuIGNvbW1pdEhvb2soKTtcbiAgICB9KTtcbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50QWN0UXVldWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRBY3RRdWV1ZTtcbmZ1bmN0aW9uIGlzTGVnYWN5QWN0RW52aXJvbm1lbnQoZmliZXIpIHtcbiAge1xuICAgIC8vIExlZ2FjeSBtb2RlLiBXZSBwcmVzZXJ2ZSB0aGUgYmVoYXZpb3Igb2YgUmVhY3QgMTcncyBhY3QuIEl0IGFzc3VtZXMgYW5cbiAgICAvLyBhY3QgZW52aXJvbm1lbnQgd2hlbmV2ZXIgYGplc3RgIGlzIGRlZmluZWQsIGJ1dCB5b3UgY2FuIHN0aWxsIHR1cm4gb2ZmXG4gICAgLy8gc3B1cmlvdXMgd2FybmluZ3MgYnkgc2V0dGluZyBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlQgZXhwbGljaXRseVxuICAgIC8vIHRvIGZhbHNlLlxuICAgIHZhciBpc1JlYWN0QWN0RW52aXJvbm1lbnRHbG9iYWwgPSAvLyAkRmxvd0V4cGVjdGVkRXJyb3IgXHUyMDEzIEZsb3cgZG9lc24ndCBrbm93IGFib3V0IElTX1JFQUNUX0FDVF9FTlZJUk9OTUVOVCBnbG9iYWxcbiAgICB0eXBlb2YgSVNfUkVBQ1RfQUNUX0VOVklST05NRU5UICE9PSAndW5kZWZpbmVkJyA/IElTX1JFQUNUX0FDVF9FTlZJUk9OTUVOVCA6IHVuZGVmaW5lZDsgLy8gJEZsb3dFeHBlY3RlZEVycm9yIC0gRmxvdyBkb2Vzbid0IGtub3cgYWJvdXQgamVzdFxuXG4gICAgdmFyIGplc3RJc0RlZmluZWQgPSB0eXBlb2YgamVzdCAhPT0gJ3VuZGVmaW5lZCc7XG4gICAgcmV0dXJuICBqZXN0SXNEZWZpbmVkICYmIGlzUmVhY3RBY3RFbnZpcm9ubWVudEdsb2JhbCAhPT0gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzQ29uY3VycmVudEFjdEVudmlyb25tZW50KCkge1xuICB7XG4gICAgdmFyIGlzUmVhY3RBY3RFbnZpcm9ubWVudEdsb2JhbCA9IC8vICRGbG93RXhwZWN0ZWRFcnJvciBcdTIwMTMgRmxvdyBkb2Vzbid0IGtub3cgYWJvdXQgSVNfUkVBQ1RfQUNUX0VOVklST05NRU5UIGdsb2JhbFxuICAgIHR5cGVvZiBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlQgIT09ICd1bmRlZmluZWQnID8gSVNfUkVBQ1RfQUNUX0VOVklST05NRU5UIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFpc1JlYWN0QWN0RW52aXJvbm1lbnRHbG9iYWwgJiYgUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgLy8gVE9ETzogSW5jbHVkZSBsaW5rIHRvIHJlbGV2YW50IGRvY3VtZW50YXRpb24gcGFnZS5cbiAgICAgIGVycm9yKCdUaGUgY3VycmVudCB0ZXN0aW5nIGVudmlyb25tZW50IGlzIG5vdCBjb25maWd1cmVkIHRvIHN1cHBvcnQgJyArICdhY3QoLi4uKScpO1xuICAgIH1cblxuICAgIHJldHVybiBpc1JlYWN0QWN0RW52aXJvbm1lbnRHbG9iYWw7XG4gIH1cbn1cblxudmFyIGNlaWwgPSBNYXRoLmNlaWw7XG52YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixcbiAgICBSZWFjdEN1cnJlbnRPd25lciQyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50T3duZXIsXG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMyA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLFxuICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRBY3RRdWV1ZTtcbnZhciBOb0NvbnRleHQgPVxuLyogICAgICAgICAgICAgKi9cbjA7XG52YXIgQmF0Y2hlZENvbnRleHQgPVxuLyogICAgICAgICAgICAgICAqL1xuMTtcbnZhciBSZW5kZXJDb250ZXh0ID1cbi8qICAgICAgICAgICAgICAgICovXG4yO1xudmFyIENvbW1pdENvbnRleHQgPVxuLyogICAgICAgICAgICAgICAgKi9cbjQ7XG52YXIgUm9vdEluUHJvZ3Jlc3MgPSAwO1xudmFyIFJvb3RGYXRhbEVycm9yZWQgPSAxO1xudmFyIFJvb3RFcnJvcmVkID0gMjtcbnZhciBSb290U3VzcGVuZGVkID0gMztcbnZhciBSb290U3VzcGVuZGVkV2l0aERlbGF5ID0gNDtcbnZhciBSb290Q29tcGxldGVkID0gNTtcbnZhciBSb290RGlkTm90Q29tcGxldGUgPSA2OyAvLyBEZXNjcmliZXMgd2hlcmUgd2UgYXJlIGluIHRoZSBSZWFjdCBleGVjdXRpb24gc3RhY2tcblxudmFyIGV4ZWN1dGlvbkNvbnRleHQgPSBOb0NvbnRleHQ7IC8vIFRoZSByb290IHdlJ3JlIHdvcmtpbmcgb25cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdCA9IG51bGw7IC8vIFRoZSBmaWJlciB3ZSdyZSB3b3JraW5nIG9uXG5cbnZhciB3b3JrSW5Qcm9ncmVzcyA9IG51bGw7IC8vIFRoZSBsYW5lcyB3ZSdyZSByZW5kZXJpbmdcblxudmFyIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gTm9MYW5lczsgLy8gU3RhY2sgdGhhdCBhbGxvd3MgY29tcG9uZW50cyB0byBjaGFuZ2UgdGhlIHJlbmRlciBsYW5lcyBmb3IgaXRzIHN1YnRyZWVcbi8vIFRoaXMgaXMgYSBzdXBlcnNldCBvZiB0aGUgbGFuZXMgd2Ugc3RhcnRlZCB3b3JraW5nIG9uIGF0IHRoZSByb290LiBUaGUgb25seVxuLy8gY2FzZSB3aGVyZSBpdCdzIGRpZmZlcmVudCBmcm9tIGB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lc2AgaXMgd2hlbiB3ZVxuLy8gZW50ZXIgYSBzdWJ0cmVlIHRoYXQgaXMgaGlkZGVuIGFuZCBuZWVkcyB0byBiZSB1bmhpZGRlbjogU3VzcGVuc2UgYW5kXG4vLyBPZmZzY3JlZW4gY29tcG9uZW50LlxuLy9cbi8vIE1vc3QgdGhpbmdzIGluIHRoZSB3b3JrIGxvb3Agc2hvdWxkIGRlYWwgd2l0aCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcy5cbi8vIE1vc3QgdGhpbmdzIGluIGJlZ2luL2NvbXBsZXRlIHBoYXNlcyBzaG91bGQgZGVhbCB3aXRoIHN1YnRyZWVSZW5kZXJMYW5lcy5cblxudmFyIHN1YnRyZWVSZW5kZXJMYW5lcyA9IE5vTGFuZXM7XG52YXIgc3VidHJlZVJlbmRlckxhbmVzQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKE5vTGFuZXMpOyAvLyBXaGV0aGVyIHRvIHJvb3QgY29tcGxldGVkLCBlcnJvcmVkLCBzdXNwZW5kZWQsIGV0Yy5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290SW5Qcm9ncmVzczsgLy8gQSBmYXRhbCBlcnJvciwgaWYgb25lIGlzIHRocm93blxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvciA9IG51bGw7IC8vIFwiSW5jbHVkZWRcIiBsYW5lcyByZWZlciB0byBsYW5lcyB0aGF0IHdlcmUgd29ya2VkIG9uIGR1cmluZyB0aGlzIHJlbmRlci4gSXQnc1xuLy8gc2xpZ2h0bHkgZGlmZmVyZW50IHRoYW4gYHJlbmRlckxhbmVzYCBiZWNhdXNlIGByZW5kZXJMYW5lc2AgY2FuIGNoYW5nZSBhcyB5b3Vcbi8vIGVudGVyIGFuZCBleGl0IGFuIE9mZnNjcmVlbiB0cmVlLiBUaGlzIHZhbHVlIGlzIHRoZSBjb21iaW5hdGlvbiBvZiBhbGwgcmVuZGVyXG4vLyBsYW5lcyBmb3IgdGhlIGVudGlyZSByZW5kZXIgcGhhc2UuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzID0gTm9MYW5lczsgLy8gVGhlIHdvcmsgbGVmdCBvdmVyIGJ5IGNvbXBvbmVudHMgdGhhdCB3ZXJlIHZpc2l0ZWQgZHVyaW5nIHRoaXMgcmVuZGVyLiBPbmx5XG4vLyBpbmNsdWRlcyB1bnByb2Nlc3NlZCB1cGRhdGVzLCBub3Qgd29yayBpbiBiYWlsZWQgb3V0IGNoaWxkcmVuLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzID0gTm9MYW5lczsgLy8gTGFuZXMgdGhhdCB3ZXJlIHVwZGF0ZWQgKGluIGFuIGludGVybGVhdmVkIGV2ZW50KSBkdXJpbmcgdGhpcyByZW5kZXIuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcyA9IE5vTGFuZXM7IC8vIExhbmVzIHRoYXQgd2VyZSB1cGRhdGVkIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlICgqbm90KiBhbiBpbnRlcmxlYXZlZCBldmVudCkuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcyA9IE5vTGFuZXM7IC8vIEVycm9ycyB0aGF0IGFyZSB0aHJvd24gZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RDb25jdXJyZW50RXJyb3JzID0gbnVsbDsgLy8gVGhlc2UgYXJlIGVycm9ycyB0aGF0IHdlIHJlY292ZXJlZCBmcm9tIHdpdGhvdXQgc3VyZmFjaW5nIHRoZW0gdG8gdGhlIFVJLlxuLy8gV2Ugd2lsbCBsb2cgdGhlbSBvbmNlIHRoZSB0cmVlIGNvbW1pdHMuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycyA9IG51bGw7IC8vIFRoZSBtb3N0IHJlY2VudCB0aW1lIHdlIGNvbW1pdHRlZCBhIGZhbGxiYWNrLiBUaGlzIGxldHMgdXMgZW5zdXJlIGEgdHJhaW5cbi8vIG1vZGVsIHdoZXJlIHdlIGRvbid0IGNvbW1pdCBuZXcgbG9hZGluZyBzdGF0ZXMgaW4gdG9vIHF1aWNrIHN1Y2Nlc3Npb24uXG5cbnZhciBnbG9iYWxNb3N0UmVjZW50RmFsbGJhY2tUaW1lID0gMDtcbnZhciBGQUxMQkFDS19USFJPVFRMRV9NUyA9IDUwMDsgLy8gVGhlIGFic29sdXRlIHRpbWUgZm9yIHdoZW4gd2Ugc2hvdWxkIHN0YXJ0IGdpdmluZyB1cCBvbiByZW5kZXJpbmdcbi8vIG1vcmUgYW5kIHByZWZlciBDUFUgc3VzcGVuc2UgaGV1cmlzdGljcyBpbnN0ZWFkLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyVGFyZ2V0VGltZSA9IEluZmluaXR5OyAvLyBIb3cgbG9uZyBhIHJlbmRlciBpcyBzdXBwb3NlZCB0byB0YWtlIGJlZm9yZSB3ZSBzdGFydCBmb2xsb3dpbmcgQ1BVXG4vLyBzdXNwZW5zZSBoZXVyaXN0aWNzIGFuZCBvcHQgb3V0IG9mIHJlbmRlcmluZyBtb3JlIGNvbnRlbnQuXG5cbnZhciBSRU5ERVJfVElNRU9VVF9NUyA9IDUwMDtcbnZhciB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zID0gbnVsbDtcblxuZnVuY3Rpb24gcmVzZXRSZW5kZXJUaW1lcigpIHtcbiAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyVGFyZ2V0VGltZSA9IG5vdygpICsgUkVOREVSX1RJTUVPVVRfTVM7XG59XG5cbmZ1bmN0aW9uIGdldFJlbmRlclRhcmdldFRpbWUoKSB7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJUYXJnZXRUaW1lO1xufVxudmFyIGhhc1VuY2F1Z2h0RXJyb3IgPSBmYWxzZTtcbnZhciBmaXJzdFVuY2F1Z2h0RXJyb3IgPSBudWxsO1xudmFyIGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkID0gbnVsbDsgLy8gT25seSB1c2VkIHdoZW4gZW5hYmxlUHJvZmlsZXJOZXN0ZWRVcGRhdGVTY2hlZHVsZWRIb29rIGlzIHRydWU7XG52YXIgcm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMgPSBmYWxzZTtcbnZhciByb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cyA9IG51bGw7XG52YXIgcGVuZGluZ1Bhc3NpdmVFZmZlY3RzTGFuZXMgPSBOb0xhbmVzO1xudmFyIHBlbmRpbmdQYXNzaXZlUHJvZmlsZXJFZmZlY3RzID0gW107XG52YXIgcGVuZGluZ1Bhc3NpdmVUcmFuc2l0aW9ucyA9IG51bGw7IC8vIFVzZSB0aGVzZSB0byBwcmV2ZW50IGFuIGluZmluaXRlIGxvb3Agb2YgbmVzdGVkIHVwZGF0ZXNcblxudmFyIE5FU1RFRF9VUERBVEVfTElNSVQgPSA1MDtcbnZhciBuZXN0ZWRVcGRhdGVDb3VudCA9IDA7XG52YXIgcm9vdFdpdGhOZXN0ZWRVcGRhdGVzID0gbnVsbDtcbnZhciBpc0ZsdXNoaW5nUGFzc2l2ZUVmZmVjdHMgPSBmYWxzZTtcbnZhciBkaWRTY2hlZHVsZVVwZGF0ZUR1cmluZ1Bhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG52YXIgTkVTVEVEX1BBU1NJVkVfVVBEQVRFX0xJTUlUID0gNTA7XG52YXIgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMDtcbnZhciByb290V2l0aFBhc3NpdmVOZXN0ZWRVcGRhdGVzID0gbnVsbDsgLy8gSWYgdHdvIHVwZGF0ZXMgYXJlIHNjaGVkdWxlZCB3aXRoaW4gdGhlIHNhbWUgZXZlbnQsIHdlIHNob3VsZCB0cmVhdCB0aGVpclxuLy8gZXZlbnQgdGltZXMgYXMgc2ltdWx0YW5lb3VzLCBldmVuIGlmIHRoZSBhY3R1YWwgY2xvY2sgdGltZSBoYXMgYWR2YW5jZWRcbi8vIGJldHdlZW4gdGhlIGZpcnN0IGFuZCBzZWNvbmQgY2FsbC5cblxudmFyIGN1cnJlbnRFdmVudFRpbWUgPSBOb1RpbWVzdGFtcDtcbnZhciBjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZSA9IE5vTGFuZXM7XG52YXIgaXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0ID0gZmFsc2U7XG5mdW5jdGlvbiBnZXRXb3JrSW5Qcm9ncmVzc1Jvb3QoKSB7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzc1Jvb3Q7XG59XG5mdW5jdGlvbiByZXF1ZXN0RXZlbnRUaW1lKCkge1xuICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KSB7XG4gICAgLy8gV2UncmUgaW5zaWRlIFJlYWN0LCBzbyBpdCdzIGZpbmUgdG8gcmVhZCB0aGUgYWN0dWFsIHRpbWUuXG4gICAgcmV0dXJuIG5vdygpO1xuICB9IC8vIFdlJ3JlIG5vdCBpbnNpZGUgUmVhY3QsIHNvIHdlIG1heSBiZSBpbiB0aGUgbWlkZGxlIG9mIGEgYnJvd3NlciBldmVudC5cblxuXG4gIGlmIChjdXJyZW50RXZlbnRUaW1lICE9PSBOb1RpbWVzdGFtcCkge1xuICAgIC8vIFVzZSB0aGUgc2FtZSBzdGFydCB0aW1lIGZvciBhbGwgdXBkYXRlcyB1bnRpbCB3ZSBlbnRlciBSZWFjdCBhZ2Fpbi5cbiAgICByZXR1cm4gY3VycmVudEV2ZW50VGltZTtcbiAgfSAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUgc2luY2UgUmVhY3QgeWllbGRlZC4gQ29tcHV0ZSBhIG5ldyBzdGFydCB0aW1lLlxuXG5cbiAgY3VycmVudEV2ZW50VGltZSA9IG5vdygpO1xuICByZXR1cm4gY3VycmVudEV2ZW50VGltZTtcbn1cbmZ1bmN0aW9uIHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKSB7XG4gIC8vIFNwZWNpYWwgY2FzZXNcbiAgdmFyIG1vZGUgPSBmaWJlci5tb2RlO1xuXG4gIGlmICgobW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgcmV0dXJuIFN5bmNMYW5lO1xuICB9IGVsc2UgaWYgKCAoZXhlY3V0aW9uQ29udGV4dCAmIFJlbmRlckNvbnRleHQpICE9PSBOb0NvbnRleHQgJiYgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAvLyBUaGlzIGlzIGEgcmVuZGVyIHBoYXNlIHVwZGF0ZS4gVGhlc2UgYXJlIG5vdCBvZmZpY2lhbGx5IHN1cHBvcnRlZC4gVGhlXG4gICAgLy8gb2xkIGJlaGF2aW9yIGlzIHRvIGdpdmUgdGhpcyB0aGUgc2FtZSBcInRocmVhZFwiIChsYW5lcykgYXNcbiAgICAvLyB3aGF0ZXZlciBpcyBjdXJyZW50bHkgcmVuZGVyaW5nLiBTbyBpZiB5b3UgY2FsbCBgc2V0U3RhdGVgIG9uIGEgY29tcG9uZW50XG4gICAgLy8gdGhhdCBoYXBwZW5zIGxhdGVyIGluIHRoZSBzYW1lIHJlbmRlciwgaXQgd2lsbCBmbHVzaC4gSWRlYWxseSwgd2Ugd2FudCB0b1xuICAgIC8vIHJlbW92ZSB0aGUgc3BlY2lhbCBjYXNlIGFuZCB0cmVhdCB0aGVtIGFzIGlmIHRoZXkgY2FtZSBmcm9tIGFuXG4gICAgLy8gaW50ZXJsZWF2ZWQgZXZlbnQuIFJlZ2FyZGxlc3MsIHRoaXMgcGF0dGVybiBpcyBub3Qgb2ZmaWNpYWxseSBzdXBwb3J0ZWQuXG4gICAgLy8gVGhpcyBiZWhhdmlvciBpcyBvbmx5IGEgZmFsbGJhY2suIFRoZSBmbGFnIG9ubHkgZXhpc3RzIHVudGlsIHdlIGNhbiByb2xsXG4gICAgLy8gb3V0IHRoZSBzZXRTdGF0ZSB3YXJuaW5nLCBzaW5jZSBleGlzdGluZyBjb2RlIG1pZ2h0IGFjY2lkZW50YWxseSByZWx5IG9uXG4gICAgLy8gdGhlIGN1cnJlbnQgYmVoYXZpb3IuXG4gICAgcmV0dXJuIHBpY2tBcmJpdHJhcnlMYW5lKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHZhciBpc1RyYW5zaXRpb24gPSByZXF1ZXN0Q3VycmVudFRyYW5zaXRpb24oKSAhPT0gTm9UcmFuc2l0aW9uO1xuXG4gIGlmIChpc1RyYW5zaXRpb24pIHtcbiAgICBpZiAoIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiAhPT0gbnVsbCkge1xuICAgICAgdmFyIHRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb247XG5cbiAgICAgIGlmICghdHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycykge1xuICAgICAgICB0cmFuc2l0aW9uLl91cGRhdGVkRmliZXJzID0gbmV3IFNldCgpO1xuICAgICAgfVxuXG4gICAgICB0cmFuc2l0aW9uLl91cGRhdGVkRmliZXJzLmFkZChmaWJlcik7XG4gICAgfSAvLyBUaGUgYWxnb3JpdGhtIGZvciBhc3NpZ25pbmcgYW4gdXBkYXRlIHRvIGEgbGFuZSBzaG91bGQgYmUgc3RhYmxlIGZvciBhbGxcbiAgICAvLyB1cGRhdGVzIGF0IHRoZSBzYW1lIHByaW9yaXR5IHdpdGhpbiB0aGUgc2FtZSBldmVudC4gVG8gZG8gdGhpcywgdGhlXG4gICAgLy8gaW5wdXRzIHRvIHRoZSBhbGdvcml0aG0gbXVzdCBiZSB0aGUgc2FtZS5cbiAgICAvL1xuICAgIC8vIFRoZSB0cmljayB3ZSB1c2UgaXMgdG8gY2FjaGUgdGhlIGZpcnN0IG9mIGVhY2ggb2YgdGhlc2UgaW5wdXRzIHdpdGhpbiBhblxuICAgIC8vIGV2ZW50LiBUaGVuIHJlc2V0IHRoZSBjYWNoZWQgdmFsdWVzIG9uY2Ugd2UgY2FuIGJlIHN1cmUgdGhlIGV2ZW50IGlzXG4gICAgLy8gb3Zlci4gT3VyIGhldXJpc3RpYyBmb3IgdGhhdCBpcyB3aGVuZXZlciB3ZSBlbnRlciBhIGNvbmN1cnJlbnQgd29yayBsb29wLlxuXG5cbiAgICBpZiAoY3VycmVudEV2ZW50VHJhbnNpdGlvbkxhbmUgPT09IE5vTGFuZSkge1xuICAgICAgLy8gQWxsIHRyYW5zaXRpb25zIHdpdGhpbiB0aGUgc2FtZSBldmVudCBhcmUgYXNzaWduZWQgdGhlIHNhbWUgbGFuZS5cbiAgICAgIGN1cnJlbnRFdmVudFRyYW5zaXRpb25MYW5lID0gY2xhaW1OZXh0VHJhbnNpdGlvbkxhbmUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudEV2ZW50VHJhbnNpdGlvbkxhbmU7XG4gIH0gLy8gVXBkYXRlcyBvcmlnaW5hdGluZyBpbnNpZGUgY2VydGFpbiBSZWFjdCBtZXRob2RzLCBsaWtlIGZsdXNoU3luYywgaGF2ZVxuICAvLyB0aGVpciBwcmlvcml0eSBzZXQgYnkgdHJhY2tpbmcgaXQgd2l0aCBhIGNvbnRleHQgdmFyaWFibGUuXG4gIC8vXG4gIC8vIFRoZSBvcGFxdWUgdHlwZSByZXR1cm5lZCBieSB0aGUgaG9zdCBjb25maWcgaXMgaW50ZXJuYWxseSBhIGxhbmUsIHNvIHdlIGNhblxuICAvLyB1c2UgdGhhdCBkaXJlY3RseS5cbiAgLy8gVE9ETzogTW92ZSB0aGlzIHR5cGUgY29udmVyc2lvbiB0byB0aGUgZXZlbnQgcHJpb3JpdHkgbW9kdWxlLlxuXG5cbiAgdmFyIHVwZGF0ZUxhbmUgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcblxuICBpZiAodXBkYXRlTGFuZSAhPT0gTm9MYW5lKSB7XG4gICAgcmV0dXJuIHVwZGF0ZUxhbmU7XG4gIH0gLy8gVGhpcyB1cGRhdGUgb3JpZ2luYXRlZCBvdXRzaWRlIFJlYWN0LiBBc2sgdGhlIGhvc3QgZW52aXJvbm1lbnQgZm9yIGFuXG4gIC8vIGFwcHJvcHJpYXRlIHByaW9yaXR5LCBiYXNlZCBvbiB0aGUgdHlwZSBvZiBldmVudC5cbiAgLy9cbiAgLy8gVGhlIG9wYXF1ZSB0eXBlIHJldHVybmVkIGJ5IHRoZSBob3N0IGNvbmZpZyBpcyBpbnRlcm5hbGx5IGEgbGFuZSwgc28gd2UgY2FuXG4gIC8vIHVzZSB0aGF0IGRpcmVjdGx5LlxuICAvLyBUT0RPOiBNb3ZlIHRoaXMgdHlwZSBjb252ZXJzaW9uIHRvIHRoZSBldmVudCBwcmlvcml0eSBtb2R1bGUuXG5cblxuICB2YXIgZXZlbnRMYW5lID0gZ2V0Q3VycmVudEV2ZW50UHJpb3JpdHkoKTtcbiAgcmV0dXJuIGV2ZW50TGFuZTtcbn1cblxuZnVuY3Rpb24gcmVxdWVzdFJldHJ5TGFuZShmaWJlcikge1xuICAvLyBUaGlzIGlzIGEgZm9yayBvZiBgcmVxdWVzdFVwZGF0ZUxhbmVgIGRlc2lnbmVkIHNwZWNpZmljYWxseSBmb3IgU3VzcGVuc2VcbiAgLy8gXCJyZXRyaWVzXCIgXHUyMDE0IGEgc3BlY2lhbCB1cGRhdGUgdGhhdCBhdHRlbXB0cyB0byBmbGlwIGEgU3VzcGVuc2UgYm91bmRhcnlcbiAgLy8gZnJvbSBpdHMgcGxhY2Vob2xkZXIgc3RhdGUgdG8gaXRzIHByaW1hcnkvcmVzb2x2ZWQgc3RhdGUuXG4gIC8vIFNwZWNpYWwgY2FzZXNcbiAgdmFyIG1vZGUgPSBmaWJlci5tb2RlO1xuXG4gIGlmICgobW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgcmV0dXJuIFN5bmNMYW5lO1xuICB9XG5cbiAgcmV0dXJuIGNsYWltTmV4dFJldHJ5TGFuZSgpO1xufVxuXG5mdW5jdGlvbiBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSkge1xuICBjaGVja0Zvck5lc3RlZFVwZGF0ZXMoKTtcblxuICB7XG4gICAgaWYgKGlzUnVubmluZ0luc2VydGlvbkVmZmVjdCkge1xuICAgICAgZXJyb3IoJ3VzZUluc2VydGlvbkVmZmVjdCBtdXN0IG5vdCBzY2hlZHVsZSB1cGRhdGVzLicpO1xuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBpZiAoaXNGbHVzaGluZ1Bhc3NpdmVFZmZlY3RzKSB7XG4gICAgICBkaWRTY2hlZHVsZVVwZGF0ZUR1cmluZ1Bhc3NpdmVFZmZlY3RzID0gdHJ1ZTtcbiAgICB9XG4gIH0gLy8gTWFyayB0aGF0IHRoZSByb290IGhhcyBhIHBlbmRpbmcgdXBkYXRlLlxuXG5cbiAgbWFya1Jvb3RVcGRhdGVkKHJvb3QsIGxhbmUsIGV2ZW50VGltZSk7XG5cbiAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vTGFuZXMgJiYgcm9vdCA9PT0gd29ya0luUHJvZ3Jlc3NSb290KSB7XG4gICAgLy8gVGhpcyB1cGRhdGUgd2FzIGRpc3BhdGNoZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UuIFRoaXMgaXMgYSBtaXN0YWtlXG4gICAgLy8gaWYgdGhlIHVwZGF0ZSBvcmlnaW5hdGVzIGZyb20gdXNlciBzcGFjZSAod2l0aCB0aGUgZXhjZXB0aW9uIG9mIGxvY2FsXG4gICAgLy8gaG9vayB1cGRhdGVzLCB3aGljaCBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseSBhbmQgZG9uJ3QgcmVhY2ggdGhpc1xuICAgIC8vIGZ1bmN0aW9uKSwgYnV0IHRoZXJlIGFyZSBzb21lIGludGVybmFsIFJlYWN0IGZlYXR1cmVzIHRoYXQgdXNlIHRoaXMgYXNcbiAgICAvLyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwsIGxpa2Ugc2VsZWN0aXZlIGh5ZHJhdGlvbi5cbiAgICB3YXJuQWJvdXRSZW5kZXJQaGFzZVVwZGF0ZXNJbkRFVihmaWJlcik7IC8vIFRyYWNrIGxhbmVzIHRoYXQgd2VyZSB1cGRhdGVkIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlXG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyBhIG5vcm1hbCB1cGRhdGUsIHNjaGVkdWxlZCBmcm9tIG91dHNpZGUgdGhlIHJlbmRlciBwaGFzZS4gRm9yXG4gICAgLy8gZXhhbXBsZSwgZHVyaW5nIGFuIGlucHV0IGV2ZW50LlxuICAgIHtcbiAgICAgIGlmIChpc0RldlRvb2xzUHJlc2VudCkge1xuICAgICAgICBhZGRGaWJlclRvTGFuZXNNYXAocm9vdCwgZmliZXIsIGxhbmUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHdhcm5JZlVwZGF0ZXNOb3RXcmFwcGVkV2l0aEFjdERFVihmaWJlcik7XG5cbiAgICBpZiAocm9vdCA9PT0gd29ya0luUHJvZ3Jlc3NSb290KSB7XG4gICAgICAvLyBSZWNlaXZlZCBhbiB1cGRhdGUgdG8gYSB0cmVlIHRoYXQncyBpbiB0aGUgbWlkZGxlIG9mIHJlbmRlcmluZy4gTWFya1xuICAgICAgLy8gdGhhdCB0aGVyZSB3YXMgYW4gaW50ZXJsZWF2ZWQgdXBkYXRlIHdvcmsgb24gdGhpcyByb290LiBVbmxlc3MgdGhlXG4gICAgICAvLyBgZGVmZXJSZW5kZXJQaGFzZVVwZGF0ZVRvTmV4dEJhdGNoYCBmbGFnIGlzIG9mZiBhbmQgdGhpcyBpcyBhIHJlbmRlclxuICAgICAgLy8gcGhhc2UgdXBkYXRlLiBJbiB0aGF0IGNhc2UsIHdlIGRvbid0IHRyZWF0IHJlbmRlciBwaGFzZSB1cGRhdGVzIGFzIGlmXG4gICAgICAvLyB0aGV5IHdlcmUgaW50ZXJsZWF2ZWQsIGZvciBiYWNrd2FyZHMgY29tcGF0IHJlYXNvbnMuXG4gICAgICBpZiAoIChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgPT09IE5vQ29udGV4dCkge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcyA9IG1lcmdlTGFuZXMod29ya0luUHJvZ3Jlc3NSb290SW50ZXJsZWF2ZWRVcGRhdGVkTGFuZXMsIGxhbmUpO1xuICAgICAgfVxuXG4gICAgICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdFN1c3BlbmRlZFdpdGhEZWxheSkge1xuICAgICAgICAvLyBUaGUgcm9vdCBhbHJlYWR5IHN1c3BlbmRlZCB3aXRoIGEgZGVsYXksIHdoaWNoIG1lYW5zIHRoaXMgcmVuZGVyXG4gICAgICAgIC8vIGRlZmluaXRlbHkgd29uJ3QgZmluaXNoLiBTaW5jZSB3ZSBoYXZlIGEgbmV3IHVwZGF0ZSwgbGV0J3MgbWFyayBpdCBhc1xuICAgICAgICAvLyBzdXNwZW5kZWQgbm93LCByaWdodCBiZWZvcmUgbWFya2luZyB0aGUgaW5jb21pbmcgdXBkYXRlLiBUaGlzIGhhcyB0aGVcbiAgICAgICAgLy8gZWZmZWN0IG9mIGludGVycnVwdGluZyB0aGUgY3VycmVudCByZW5kZXIgYW5kIHN3aXRjaGluZyB0byB0aGUgdXBkYXRlLlxuICAgICAgICAvLyBUT0RPOiBNYWtlIHN1cmUgdGhpcyBkb2Vzbid0IG92ZXJyaWRlIHBpbmdzIHRoYXQgaGFwcGVuIHdoaWxlIHdlJ3ZlXG4gICAgICAgIC8vIGFscmVhZHkgc3RhcnRlZCByZW5kZXJpbmcuXG4gICAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBldmVudFRpbWUpO1xuXG4gICAgaWYgKGxhbmUgPT09IFN5bmNMYW5lICYmIGV4ZWN1dGlvbkNvbnRleHQgPT09IE5vQ29udGV4dCAmJiAoZmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlICYmIC8vIFRyZWF0IGBhY3RgIGFzIGlmIGl0J3MgaW5zaWRlIGBiYXRjaGVkVXBkYXRlc2AsIGV2ZW4gaW4gbGVnYWN5IG1vZGUuXG4gICAgISggUmVhY3RDdXJyZW50QWN0UXVldWUkMS5pc0JhdGNoaW5nTGVnYWN5KSkge1xuICAgICAgLy8gRmx1c2ggdGhlIHN5bmNocm9ub3VzIHdvcmsgbm93LCB1bmxlc3Mgd2UncmUgYWxyZWFkeSB3b3JraW5nIG9yIGluc2lkZVxuICAgICAgLy8gYSBiYXRjaC4gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGluc2lkZSBzY2hlZHVsZVVwZGF0ZU9uRmliZXIgaW5zdGVhZCBvZlxuICAgICAgLy8gc2NoZWR1bGVDYWxsYmFja0ZvckZpYmVyIHRvIHByZXNlcnZlIHRoZSBhYmlsaXR5IHRvIHNjaGVkdWxlIGEgY2FsbGJhY2tcbiAgICAgIC8vIHdpdGhvdXQgaW1tZWRpYXRlbHkgZmx1c2hpbmcgaXQuIFdlIG9ubHkgZG8gdGhpcyBmb3IgdXNlci1pbml0aWF0ZWRcbiAgICAgIC8vIHVwZGF0ZXMsIHRvIHByZXNlcnZlIGhpc3RvcmljYWwgYmVoYXZpb3Igb2YgbGVnYWN5IG1vZGUuXG4gICAgICByZXNldFJlbmRlclRpbWVyKCk7XG4gICAgICBmbHVzaFN5bmNDYWxsYmFja3NPbmx5SW5MZWdhY3lNb2RlKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBzY2hlZHVsZUluaXRpYWxIeWRyYXRpb25PblJvb3Qocm9vdCwgbGFuZSwgZXZlbnRUaW1lKSB7XG4gIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGZvcmsgb2Ygc2NoZWR1bGVVcGRhdGVPbkZpYmVyIHRoYXQgaXMgb25seSB1c2VkIHRvXG4gIC8vIHNjaGVkdWxlIHRoZSBpbml0aWFsIGh5ZHJhdGlvbiBvZiBhIHJvb3QgdGhhdCBoYXMganVzdCBiZWVuIGNyZWF0ZWQuIE1vc3RcbiAgLy8gb2YgdGhlIHN0dWZmIGluIHNjaGVkdWxlVXBkYXRlT25GaWJlciBjYW4gYmUgc2tpcHBlZC5cbiAgLy9cbiAgLy8gVGhlIG1haW4gcmVhc29uIGZvciB0aGlzIHNlcGFyYXRlIHBhdGgsIHRob3VnaCwgaXMgdG8gZGlzdGluZ3Vpc2ggdGhlXG4gIC8vIGluaXRpYWwgY2hpbGRyZW4gZnJvbSBzdWJzZXF1ZW50IHVwZGF0ZXMuIEluIGZ1bGx5IGNsaWVudC1yZW5kZXJlZCByb290c1xuICAvLyAoY3JlYXRlUm9vdCBpbnN0ZWFkIG9mIGh5ZHJhdGVSb290KSwgYWxsIHRvcC1sZXZlbCByZW5kZXJzIGFyZSBtb2RlbGVkIGFzXG4gIC8vIHVwZGF0ZXMsIGJ1dCBoeWRyYXRpb24gcm9vdHMgYXJlIHNwZWNpYWwgYmVjYXVzZSB0aGUgaW5pdGlhbCByZW5kZXIgbXVzdFxuICAvLyBtYXRjaCB3aGF0IHdhcyByZW5kZXJlZCBvbiB0aGUgc2VydmVyLlxuICB2YXIgY3VycmVudCA9IHJvb3QuY3VycmVudDtcbiAgY3VycmVudC5sYW5lcyA9IGxhbmU7XG4gIG1hcmtSb290VXBkYXRlZChyb290LCBsYW5lLCBldmVudFRpbWUpO1xuICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcbn1cbmZ1bmN0aW9uIGlzVW5zYWZlQ2xhc3NSZW5kZXJQaGFzZVVwZGF0ZShmaWJlcikge1xuICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgcmVuZGVyIHBoYXNlIHVwZGF0ZS4gT25seSBjYWxsZWQgYnkgY2xhc3MgY29tcG9uZW50cyxcbiAgLy8gd2hpY2ggc3BlY2lhbCAoZGVwcmVjYXRlZCkgYmVoYXZpb3IgZm9yIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZSBwcm9wcy5cbiAgcmV0dXJuICgvLyBUT0RPOiBSZW1vdmUgb3V0ZGF0ZWQgZGVmZXJSZW5kZXJQaGFzZVVwZGF0ZVRvTmV4dEJhdGNoIGV4cGVyaW1lbnQuIFdlXG4gICAgLy8gZGVjaWRlZCBub3QgdG8gZW5hYmxlIGl0LlxuICAgICAoZXhlY3V0aW9uQ29udGV4dCAmIFJlbmRlckNvbnRleHQpICE9PSBOb0NvbnRleHRcbiAgKTtcbn0gLy8gVXNlIHRoaXMgZnVuY3Rpb24gdG8gc2NoZWR1bGUgYSB0YXNrIGZvciBhIHJvb3QuIFRoZXJlJ3Mgb25seSBvbmUgdGFzayBwZXJcbi8vIHJvb3Q7IGlmIGEgdGFzayB3YXMgYWxyZWFkeSBzY2hlZHVsZWQsIHdlJ2xsIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgcHJpb3JpdHlcbi8vIG9mIHRoZSBleGlzdGluZyB0YXNrIGlzIHRoZSBzYW1lIGFzIHRoZSBwcmlvcml0eSBvZiB0aGUgbmV4dCBsZXZlbCB0aGF0IHRoZVxuLy8gcm9vdCBoYXMgd29yayBvbi4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb24gZXZlcnkgdXBkYXRlLCBhbmQgcmlnaHQgYmVmb3JlXG4vLyBleGl0aW5nIGEgdGFzay5cblxuZnVuY3Rpb24gZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGN1cnJlbnRUaW1lKSB7XG4gIHZhciBleGlzdGluZ0NhbGxiYWNrTm9kZSA9IHJvb3QuY2FsbGJhY2tOb2RlOyAvLyBDaGVjayBpZiBhbnkgbGFuZXMgYXJlIGJlaW5nIHN0YXJ2ZWQgYnkgb3RoZXIgd29yay4gSWYgc28sIG1hcmsgdGhlbSBhc1xuICAvLyBleHBpcmVkIHNvIHdlIGtub3cgdG8gd29yayBvbiB0aG9zZSBuZXh0LlxuXG4gIG1hcmtTdGFydmVkTGFuZXNBc0V4cGlyZWQocm9vdCwgY3VycmVudFRpbWUpOyAvLyBEZXRlcm1pbmUgdGhlIG5leHQgbGFuZXMgdG8gd29yayBvbiwgYW5kIHRoZWlyIHByaW9yaXR5LlxuXG4gIHZhciBuZXh0TGFuZXMgPSBnZXROZXh0TGFuZXMocm9vdCwgcm9vdCA9PT0gd29ya0luUHJvZ3Jlc3NSb290ID8gd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgOiBOb0xhbmVzKTtcblxuICBpZiAobmV4dExhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgLy8gU3BlY2lhbCBjYXNlOiBUaGVyZSdzIG5vdGhpbmcgdG8gd29yayBvbi5cbiAgICBpZiAoZXhpc3RpbmdDYWxsYmFja05vZGUgIT09IG51bGwpIHtcbiAgICAgIGNhbmNlbENhbGxiYWNrJDEoZXhpc3RpbmdDYWxsYmFja05vZGUpO1xuICAgIH1cblxuICAgIHJvb3QuY2FsbGJhY2tOb2RlID0gbnVsbDtcbiAgICByb290LmNhbGxiYWNrUHJpb3JpdHkgPSBOb0xhbmU7XG4gICAgcmV0dXJuO1xuICB9IC8vIFdlIHVzZSB0aGUgaGlnaGVzdCBwcmlvcml0eSBsYW5lIHRvIHJlcHJlc2VudCB0aGUgcHJpb3JpdHkgb2YgdGhlIGNhbGxiYWNrLlxuXG5cbiAgdmFyIG5ld0NhbGxiYWNrUHJpb3JpdHkgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKG5leHRMYW5lcyk7IC8vIENoZWNrIGlmIHRoZXJlJ3MgYW4gZXhpc3RpbmcgdGFzay4gV2UgbWF5IGJlIGFibGUgdG8gcmV1c2UgaXQuXG5cbiAgdmFyIGV4aXN0aW5nQ2FsbGJhY2tQcmlvcml0eSA9IHJvb3QuY2FsbGJhY2tQcmlvcml0eTtcblxuICBpZiAoZXhpc3RpbmdDYWxsYmFja1ByaW9yaXR5ID09PSBuZXdDYWxsYmFja1ByaW9yaXR5ICYmIC8vIFNwZWNpYWwgY2FzZSByZWxhdGVkIHRvIGBhY3RgLiBJZiB0aGUgY3VycmVudGx5IHNjaGVkdWxlZCB0YXNrIGlzIGFcbiAgLy8gU2NoZWR1bGVyIHRhc2ssIHJhdGhlciB0aGFuIGFuIGBhY3RgIHRhc2ssIGNhbmNlbCBpdCBhbmQgcmUtc2NoZWR1bGVkXG4gIC8vIG9uIHRoZSBgYWN0YCBxdWV1ZS5cbiAgISggUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50ICE9PSBudWxsICYmIGV4aXN0aW5nQ2FsbGJhY2tOb2RlICE9PSBmYWtlQWN0Q2FsbGJhY2tOb2RlKSkge1xuICAgIHtcbiAgICAgIC8vIElmIHdlJ3JlIGdvaW5nIHRvIHJlLXVzZSBhbiBleGlzdGluZyB0YXNrLCBpdCBuZWVkcyB0byBleGlzdC5cbiAgICAgIC8vIEFzc3VtZSB0aGF0IGRpc2NyZXRlIHVwZGF0ZSBtaWNyb3Rhc2tzIGFyZSBub24tY2FuY2VsbGFibGUgYW5kIG51bGwuXG4gICAgICAvLyBUT0RPOiBUZW1wb3JhcnkgdW50aWwgd2UgY29uZmlybSB0aGlzIHdhcm5pbmcgaXMgbm90IGZpcmVkLlxuICAgICAgaWYgKGV4aXN0aW5nQ2FsbGJhY2tOb2RlID09IG51bGwgJiYgZXhpc3RpbmdDYWxsYmFja1ByaW9yaXR5ICE9PSBTeW5jTGFuZSkge1xuICAgICAgICBlcnJvcignRXhwZWN0ZWQgc2NoZWR1bGVkIGNhbGxiYWNrIHRvIGV4aXN0LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgfVxuICAgIH0gLy8gVGhlIHByaW9yaXR5IGhhc24ndCBjaGFuZ2VkLiBXZSBjYW4gcmV1c2UgdGhlIGV4aXN0aW5nIHRhc2suIEV4aXQuXG5cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChleGlzdGluZ0NhbGxiYWNrTm9kZSAhPSBudWxsKSB7XG4gICAgLy8gQ2FuY2VsIHRoZSBleGlzdGluZyBjYWxsYmFjay4gV2UnbGwgc2NoZWR1bGUgYSBuZXcgb25lIGJlbG93LlxuICAgIGNhbmNlbENhbGxiYWNrJDEoZXhpc3RpbmdDYWxsYmFja05vZGUpO1xuICB9IC8vIFNjaGVkdWxlIGEgbmV3IGNhbGxiYWNrLlxuXG5cbiAgdmFyIG5ld0NhbGxiYWNrTm9kZTtcblxuICBpZiAobmV3Q2FsbGJhY2tQcmlvcml0eSA9PT0gU3luY0xhbmUpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2U6IFN5bmMgUmVhY3QgY2FsbGJhY2tzIGFyZSBzY2hlZHVsZWQgb24gYSBzcGVjaWFsXG4gICAgLy8gaW50ZXJuYWwgcXVldWVcbiAgICBpZiAocm9vdC50YWcgPT09IExlZ2FjeVJvb3QpIHtcbiAgICAgIGlmICggUmVhY3RDdXJyZW50QWN0UXVldWUkMS5pc0JhdGNoaW5nTGVnYWN5ICE9PSBudWxsKSB7XG4gICAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuZGlkU2NoZWR1bGVMZWdhY3lVcGRhdGUgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBzY2hlZHVsZUxlZ2FjeVN5bmNDYWxsYmFjayhwZXJmb3JtU3luY1dvcmtPblJvb3QuYmluZChudWxsLCByb290KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjaGVkdWxlU3luY0NhbGxiYWNrKHBlcmZvcm1TeW5jV29ya09uUm9vdC5iaW5kKG51bGwsIHJvb3QpKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICAvLyBGbHVzaCB0aGUgcXVldWUgaW4gYSBtaWNyb3Rhc2suXG4gICAgICBpZiAoIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAvLyBJbnNpZGUgYGFjdGAsIHVzZSBvdXIgaW50ZXJuYWwgYGFjdGAgcXVldWUgc28gdGhhdCB0aGVzZSBnZXQgZmx1c2hlZFxuICAgICAgICAvLyBhdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHNjb3BlIGV2ZW4gd2hlbiB1c2luZyB0aGUgc3luYyB2ZXJzaW9uXG4gICAgICAgIC8vIG9mIGBhY3RgLlxuICAgICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmN1cnJlbnQucHVzaChmbHVzaFN5bmNDYWxsYmFja3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2NoZWR1bGVNaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIEluIFNhZmFyaSwgYXBwZW5kaW5nIGFuIGlmcmFtZSBmb3JjZXMgbWljcm90YXNrcyB0byBydW4uXG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8yMjQ1OVxuICAgICAgICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgcnVubmluZyBjYWxsYmFja3MgaW4gdGhlIG1pZGRsZSBvZiByZW5kZXJcbiAgICAgICAgICAvLyBvciBjb21taXQgc28gd2UgbmVlZCB0byBjaGVjayBhZ2FpbnN0IHRoYXQuXG4gICAgICAgICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgPT09IE5vQ29udGV4dCkge1xuICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgd291bGQgc3RpbGwgcHJlbWF0dXJlbHkgZmx1c2ggdGhlIGNhbGxiYWNrc1xuICAgICAgICAgICAgLy8gaWYgdGhpcyBoYXBwZW5zIG91dHNpZGUgcmVuZGVyIG9yIGNvbW1pdCBwaGFzZSAoZS5nLiBpbiBhbiBldmVudCkuXG4gICAgICAgICAgICBmbHVzaFN5bmNDYWxsYmFja3MoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5ld0NhbGxiYWNrTm9kZSA9IG51bGw7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHNjaGVkdWxlclByaW9yaXR5TGV2ZWw7XG5cbiAgICBzd2l0Y2ggKGxhbmVzVG9FdmVudFByaW9yaXR5KG5leHRMYW5lcykpIHtcbiAgICAgIGNhc2UgRGlzY3JldGVFdmVudFByaW9yaXR5OlxuICAgICAgICBzY2hlZHVsZXJQcmlvcml0eUxldmVsID0gSW1tZWRpYXRlUHJpb3JpdHk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIENvbnRpbnVvdXNFdmVudFByaW9yaXR5OlxuICAgICAgICBzY2hlZHVsZXJQcmlvcml0eUxldmVsID0gVXNlckJsb2NraW5nUHJpb3JpdHk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIERlZmF1bHRFdmVudFByaW9yaXR5OlxuICAgICAgICBzY2hlZHVsZXJQcmlvcml0eUxldmVsID0gTm9ybWFsUHJpb3JpdHk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIElkbGVFdmVudFByaW9yaXR5OlxuICAgICAgICBzY2hlZHVsZXJQcmlvcml0eUxldmVsID0gSWRsZVByaW9yaXR5O1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHlMZXZlbCA9IE5vcm1hbFByaW9yaXR5O1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBuZXdDYWxsYmFja05vZGUgPSBzY2hlZHVsZUNhbGxiYWNrJDEoc2NoZWR1bGVyUHJpb3JpdHlMZXZlbCwgcGVyZm9ybUNvbmN1cnJlbnRXb3JrT25Sb290LmJpbmQobnVsbCwgcm9vdCkpO1xuICB9XG5cbiAgcm9vdC5jYWxsYmFja1ByaW9yaXR5ID0gbmV3Q2FsbGJhY2tQcmlvcml0eTtcbiAgcm9vdC5jYWxsYmFja05vZGUgPSBuZXdDYWxsYmFja05vZGU7XG59IC8vIFRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IGZvciBldmVyeSBjb25jdXJyZW50IHRhc2ssIGkuZS4gYW55dGhpbmcgdGhhdFxuLy8gZ29lcyB0aHJvdWdoIFNjaGVkdWxlci5cblxuXG5mdW5jdGlvbiBwZXJmb3JtQ29uY3VycmVudFdvcmtPblJvb3Qocm9vdCwgZGlkVGltZW91dCkge1xuICB7XG4gICAgcmVzZXROZXN0ZWRVcGRhdGVGbGFnKCk7XG4gIH0gLy8gU2luY2Ugd2Uga25vdyB3ZSdyZSBpbiBhIFJlYWN0IGV2ZW50LCB3ZSBjYW4gY2xlYXIgdGhlIGN1cnJlbnRcbiAgLy8gZXZlbnQgdGltZS4gVGhlIG5leHQgdXBkYXRlIHdpbGwgY29tcHV0ZSBhIG5ldyBldmVudCB0aW1lLlxuXG5cbiAgY3VycmVudEV2ZW50VGltZSA9IE5vVGltZXN0YW1wO1xuICBjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZSA9IE5vTGFuZXM7XG5cbiAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgIT09IE5vQ29udGV4dCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2hvdWxkIG5vdCBhbHJlYWR5IGJlIHdvcmtpbmcuJyk7XG4gIH0gLy8gRmx1c2ggYW55IHBlbmRpbmcgcGFzc2l2ZSBlZmZlY3RzIGJlZm9yZSBkZWNpZGluZyB3aGljaCBsYW5lcyB0byB3b3JrIG9uLFxuICAvLyBpbiBjYXNlIHRoZXkgc2NoZWR1bGUgYWRkaXRpb25hbCB3b3JrLlxuXG5cbiAgdmFyIG9yaWdpbmFsQ2FsbGJhY2tOb2RlID0gcm9vdC5jYWxsYmFja05vZGU7XG4gIHZhciBkaWRGbHVzaFBhc3NpdmVFZmZlY3RzID0gZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuXG4gIGlmIChkaWRGbHVzaFBhc3NpdmVFZmZlY3RzKSB7XG4gICAgLy8gU29tZXRoaW5nIGluIHRoZSBwYXNzaXZlIGVmZmVjdCBwaGFzZSBtYXkgaGF2ZSBjYW5jZWxlZCB0aGUgY3VycmVudCB0YXNrLlxuICAgIC8vIENoZWNrIGlmIHRoZSB0YXNrIG5vZGUgZm9yIHRoaXMgcm9vdCB3YXMgY2hhbmdlZC5cbiAgICBpZiAocm9vdC5jYWxsYmFja05vZGUgIT09IG9yaWdpbmFsQ2FsbGJhY2tOb2RlKSB7XG4gICAgICAvLyBUaGUgY3VycmVudCB0YXNrIHdhcyBjYW5jZWxlZC4gRXhpdC4gV2UgZG9uJ3QgbmVlZCB0byBjYWxsXG4gICAgICAvLyBgZW5zdXJlUm9vdElzU2NoZWR1bGVkYCBiZWNhdXNlIHRoZSBjaGVjayBhYm92ZSBpbXBsaWVzIGVpdGhlciB0aGF0XG4gICAgICAvLyB0aGVyZSdzIGEgbmV3IHRhc2ssIG9yIHRoYXQgdGhlcmUncyBubyByZW1haW5pbmcgd29yayBvbiB0aGlzIHJvb3QuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0gLy8gRGV0ZXJtaW5lIHRoZSBuZXh0IGxhbmVzIHRvIHdvcmsgb24sIHVzaW5nIHRoZSBmaWVsZHMgc3RvcmVkXG4gIC8vIG9uIHRoZSByb290LlxuXG5cbiAgdmFyIGxhbmVzID0gZ2V0TmV4dExhbmVzKHJvb3QsIHJvb3QgPT09IHdvcmtJblByb2dyZXNzUm9vdCA/IHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzIDogTm9MYW5lcyk7XG5cbiAgaWYgKGxhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgLy8gRGVmZW5zaXZlIGNvZGluZy4gVGhpcyBpcyBuZXZlciBleHBlY3RlZCB0byBoYXBwZW4uXG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLy8gV2UgZGlzYWJsZSB0aW1lLXNsaWNpbmcgaW4gc29tZSBjYXNlczogaWYgdGhlIHdvcmsgaGFzIGJlZW4gQ1BVLWJvdW5kXG4gIC8vIGZvciB0b28gbG9uZyAoXCJleHBpcmVkXCIgd29yaywgdG8gcHJldmVudCBzdGFydmF0aW9uKSwgb3Igd2UncmUgaW5cbiAgLy8gc3luYy11cGRhdGVzLWJ5LWRlZmF1bHQgbW9kZS5cbiAgLy8gVE9ETzogV2Ugb25seSBjaGVjayBgZGlkVGltZW91dGAgZGVmZW5zaXZlbHksIHRvIGFjY291bnQgZm9yIGEgU2NoZWR1bGVyXG4gIC8vIGJ1ZyB3ZSdyZSBzdGlsbCBpbnZlc3RpZ2F0aW5nLiBPbmNlIHRoZSBidWcgaW4gU2NoZWR1bGVyIGlzIGZpeGVkLFxuICAvLyB3ZSBjYW4gcmVtb3ZlIHRoaXMsIHNpbmNlIHdlIHRyYWNrIGV4cGlyYXRpb24gb3Vyc2VsdmVzLlxuXG5cbiAgdmFyIHNob3VsZFRpbWVTbGljZSA9ICFpbmNsdWRlc0Jsb2NraW5nTGFuZShyb290LCBsYW5lcykgJiYgIWluY2x1ZGVzRXhwaXJlZExhbmUocm9vdCwgbGFuZXMpICYmICggIWRpZFRpbWVvdXQpO1xuICB2YXIgZXhpdFN0YXR1cyA9IHNob3VsZFRpbWVTbGljZSA/IHJlbmRlclJvb3RDb25jdXJyZW50KHJvb3QsIGxhbmVzKSA6IHJlbmRlclJvb3RTeW5jKHJvb3QsIGxhbmVzKTtcblxuICBpZiAoZXhpdFN0YXR1cyAhPT0gUm9vdEluUHJvZ3Jlc3MpIHtcbiAgICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdEVycm9yZWQpIHtcbiAgICAgIC8vIElmIHNvbWV0aGluZyB0aHJldyBhbiBlcnJvciwgdHJ5IHJlbmRlcmluZyBvbmUgbW9yZSB0aW1lLiBXZSdsbFxuICAgICAgLy8gcmVuZGVyIHN5bmNocm9ub3VzbHkgdG8gYmxvY2sgY29uY3VycmVudCBkYXRhIG11dGF0aW9ucywgYW5kIHdlJ2xsXG4gICAgICAvLyBpbmNsdWRlcyBhbGwgcGVuZGluZyB1cGRhdGVzIGFyZSBpbmNsdWRlZC4gSWYgaXQgc3RpbGwgZmFpbHMgYWZ0ZXJcbiAgICAgIC8vIHRoZSBzZWNvbmQgYXR0ZW1wdCwgd2UnbGwgZ2l2ZSB1cCBhbmQgY29tbWl0IHRoZSByZXN1bHRpbmcgdHJlZS5cbiAgICAgIHZhciBlcnJvclJldHJ5TGFuZXMgPSBnZXRMYW5lc1RvUmV0cnlTeW5jaHJvbm91c2x5T25FcnJvcihyb290KTtcblxuICAgICAgaWYgKGVycm9yUmV0cnlMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgICBsYW5lcyA9IGVycm9yUmV0cnlMYW5lcztcbiAgICAgICAgZXhpdFN0YXR1cyA9IHJlY292ZXJGcm9tQ29uY3VycmVudEVycm9yKHJvb3QsIGVycm9yUmV0cnlMYW5lcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3RGYXRhbEVycm9yZWQpIHtcbiAgICAgIHZhciBmYXRhbEVycm9yID0gd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvcjtcbiAgICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIE5vTGFuZXMpO1xuICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBsYW5lcyk7XG4gICAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuICAgICAgdGhyb3cgZmF0YWxFcnJvcjtcbiAgICB9XG5cbiAgICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdERpZE5vdENvbXBsZXRlKSB7XG4gICAgICAvLyBUaGUgcmVuZGVyIHVud291bmQgd2l0aG91dCBjb21wbGV0aW5nIHRoZSB0cmVlLiBUaGlzIGhhcHBlbnMgaW4gc3BlY2lhbFxuICAgICAgLy8gY2FzZXMgd2hlcmUgbmVlZCB0byBleGl0IHRoZSBjdXJyZW50IHJlbmRlciB3aXRob3V0IHByb2R1Y2luZyBhXG4gICAgICAvLyBjb25zaXN0ZW50IHRyZWUgb3IgY29tbWl0dGluZy5cbiAgICAgIC8vXG4gICAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiBkdXJpbmcgYSBjb25jdXJyZW50IHJlbmRlciwgbm90IGEgZGlzY3JldGUgb3JcbiAgICAgIC8vIHN5bmNocm9ub3VzIHVwZGF0ZS4gV2Ugc2hvdWxkIGhhdmUgYWxyZWFkeSBjaGVja2VkIGZvciB0aGlzIHdoZW4gd2VcbiAgICAgIC8vIHVud291bmQgdGhlIHN0YWNrLlxuICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBsYW5lcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSByZW5kZXIgY29tcGxldGVkLlxuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyByZW5kZXIgbWF5IGhhdmUgeWllbGRlZCB0byBhIGNvbmN1cnJlbnQgZXZlbnQsIGFuZCBpZiBzbyxcbiAgICAgIC8vIGNvbmZpcm0gdGhhdCBhbnkgbmV3bHkgcmVuZGVyZWQgc3RvcmVzIGFyZSBjb25zaXN0ZW50LlxuICAgICAgLy8gVE9ETzogSXQncyBwb3NzaWJsZSB0aGF0IGV2ZW4gYSBjb25jdXJyZW50IHJlbmRlciBtYXkgbmV2ZXIgaGF2ZSB5aWVsZGVkXG4gICAgICAvLyB0byB0aGUgbWFpbiB0aHJlYWQsIGlmIGl0IHdhcyBmYXN0IGVub3VnaCwgb3IgaWYgaXQgZXhwaXJlZC4gV2UgY291bGRcbiAgICAgIC8vIHNraXAgdGhlIGNvbnNpc3RlbmN5IGNoZWNrIGluIHRoYXQgY2FzZSwgdG9vLlxuICAgICAgdmFyIHJlbmRlcldhc0NvbmN1cnJlbnQgPSAhaW5jbHVkZXNCbG9ja2luZ0xhbmUocm9vdCwgbGFuZXMpO1xuICAgICAgdmFyIGZpbmlzaGVkV29yayA9IHJvb3QuY3VycmVudC5hbHRlcm5hdGU7XG5cbiAgICAgIGlmIChyZW5kZXJXYXNDb25jdXJyZW50ICYmICFpc1JlbmRlckNvbnNpc3RlbnRXaXRoRXh0ZXJuYWxTdG9yZXMoZmluaXNoZWRXb3JrKSkge1xuICAgICAgICAvLyBBIHN0b3JlIHdhcyBtdXRhdGVkIGluIGFuIGludGVybGVhdmVkIGV2ZW50LiBSZW5kZXIgYWdhaW4sXG4gICAgICAgIC8vIHN5bmNocm9ub3VzbHksIHRvIGJsb2NrIGZ1cnRoZXIgbXV0YXRpb25zLlxuICAgICAgICBleGl0U3RhdHVzID0gcmVuZGVyUm9vdFN5bmMocm9vdCwgbGFuZXMpOyAvLyBXZSBuZWVkIHRvIGNoZWNrIGFnYWluIGlmIHNvbWV0aGluZyB0aHJld1xuXG4gICAgICAgIGlmIChleGl0U3RhdHVzID09PSBSb290RXJyb3JlZCkge1xuICAgICAgICAgIHZhciBfZXJyb3JSZXRyeUxhbmVzID0gZ2V0TGFuZXNUb1JldHJ5U3luY2hyb25vdXNseU9uRXJyb3Iocm9vdCk7XG5cbiAgICAgICAgICBpZiAoX2Vycm9yUmV0cnlMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgICAgICAgbGFuZXMgPSBfZXJyb3JSZXRyeUxhbmVzO1xuICAgICAgICAgICAgZXhpdFN0YXR1cyA9IHJlY292ZXJGcm9tQ29uY3VycmVudEVycm9yKHJvb3QsIF9lcnJvclJldHJ5TGFuZXMpOyAvLyBXZSBhc3N1bWUgdGhlIHRyZWUgaXMgbm93IGNvbnNpc3RlbnQgYmVjYXVzZSB3ZSBkaWRuJ3QgeWllbGQgdG8gYW55XG4gICAgICAgICAgICAvLyBjb25jdXJyZW50IGV2ZW50cy5cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdEZhdGFsRXJyb3JlZCkge1xuICAgICAgICAgIHZhciBfZmF0YWxFcnJvciA9IHdvcmtJblByb2dyZXNzUm9vdEZhdGFsRXJyb3I7XG4gICAgICAgICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgTm9MYW5lcyk7XG4gICAgICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBsYW5lcyk7XG4gICAgICAgICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcbiAgICAgICAgICB0aHJvdyBfZmF0YWxFcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSAvLyBXZSBub3cgaGF2ZSBhIGNvbnNpc3RlbnQgdHJlZS4gVGhlIG5leHQgc3RlcCBpcyBlaXRoZXIgdG8gY29tbWl0IGl0LFxuICAgICAgLy8gb3IsIGlmIHNvbWV0aGluZyBzdXNwZW5kZWQsIHdhaXQgdG8gY29tbWl0IGl0IGFmdGVyIGEgdGltZW91dC5cblxuXG4gICAgICByb290LmZpbmlzaGVkV29yayA9IGZpbmlzaGVkV29yaztcbiAgICAgIHJvb3QuZmluaXNoZWRMYW5lcyA9IGxhbmVzO1xuICAgICAgZmluaXNoQ29uY3VycmVudFJlbmRlcihyb290LCBleGl0U3RhdHVzLCBsYW5lcyk7XG4gICAgfVxuICB9XG5cbiAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcblxuICBpZiAocm9vdC5jYWxsYmFja05vZGUgPT09IG9yaWdpbmFsQ2FsbGJhY2tOb2RlKSB7XG4gICAgLy8gVGhlIHRhc2sgbm9kZSBzY2hlZHVsZWQgZm9yIHRoaXMgcm9vdCBpcyB0aGUgc2FtZSBvbmUgdGhhdCdzXG4gICAgLy8gY3VycmVudGx5IGV4ZWN1dGVkLiBOZWVkIHRvIHJldHVybiBhIGNvbnRpbnVhdGlvbi5cbiAgICByZXR1cm4gcGVyZm9ybUNvbmN1cnJlbnRXb3JrT25Sb290LmJpbmQobnVsbCwgcm9vdCk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmVjb3ZlckZyb21Db25jdXJyZW50RXJyb3Iocm9vdCwgZXJyb3JSZXRyeUxhbmVzKSB7XG4gIC8vIElmIGFuIGVycm9yIG9jY3VycmVkIGR1cmluZyBoeWRyYXRpb24sIGRpc2NhcmQgc2VydmVyIHJlc3BvbnNlIGFuZCBmYWxsXG4gIC8vIGJhY2sgdG8gY2xpZW50IHNpZGUgcmVuZGVyLlxuICAvLyBCZWZvcmUgcmVuZGVyaW5nIGFnYWluLCBzYXZlIHRoZSBlcnJvcnMgZnJvbSB0aGUgcHJldmlvdXMgYXR0ZW1wdC5cbiAgdmFyIGVycm9yc0Zyb21GaXJzdEF0dGVtcHQgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RDb25jdXJyZW50RXJyb3JzO1xuXG4gIGlmIChpc1Jvb3REZWh5ZHJhdGVkKHJvb3QpKSB7XG4gICAgLy8gVGhlIHNoZWxsIGZhaWxlZCB0byBoeWRyYXRlLiBTZXQgYSBmbGFnIHRvIGZvcmNlIGEgY2xpZW50IHJlbmRlcmluZ1xuICAgIC8vIGR1cmluZyB0aGUgbmV4dCBhdHRlbXB0LiBUbyBkbyB0aGlzLCB3ZSBjYWxsIHByZXBhcmVGcmVzaFN0YWNrIG5vd1xuICAgIC8vIHRvIGNyZWF0ZSB0aGUgcm9vdCB3b3JrLWluLXByb2dyZXNzIGZpYmVyLiBUaGlzIGlzIGEgYml0IHdlaXJkIGluIHRlcm1zXG4gICAgLy8gb2YgZmFjdG9yaW5nLCBiZWNhdXNlIGl0IHJlbGllcyBvbiByZW5kZXJSb290U3luYyBub3QgY2FsbGluZ1xuICAgIC8vIHByZXBhcmVGcmVzaFN0YWNrIGFnYWluIGluIHRoZSBjYWxsIGJlbG93LCB3aGljaCBoYXBwZW5zIGJlY2F1c2UgdGhlXG4gICAgLy8gcm9vdCBhbmQgbGFuZXMgaGF2ZW4ndCBjaGFuZ2VkLlxuICAgIC8vXG4gICAgLy8gVE9ETzogSSB0aGluayB3aGF0IHdlIHNob3VsZCBkbyBpcyBzZXQgRm9yY2VDbGllbnRSZW5kZXIgaW5zaWRlXG4gICAgLy8gdGhyb3dFeGNlcHRpb24sIGxpa2Ugd2UgZG8gZm9yIG5lc3RlZCBTdXNwZW5zZSBib3VuZGFyaWVzLiBUaGUgcmVhc29uXG4gICAgLy8gaXQncyBoZXJlIGluc3RlYWQgaXMgc28gd2UgY2FuIHN3aXRjaCB0byB0aGUgc3luY2hyb25vdXMgd29yayBsb29wLCB0b28uXG4gICAgLy8gU29tZXRoaW5nIHRvIGNvbnNpZGVyIGZvciBhIGZ1dHVyZSByZWZhY3Rvci5cbiAgICB2YXIgcm9vdFdvcmtJblByb2dyZXNzID0gcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgZXJyb3JSZXRyeUxhbmVzKTtcbiAgICByb290V29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRm9yY2VDbGllbnRSZW5kZXI7XG5cbiAgICB7XG4gICAgICBlcnJvckh5ZHJhdGluZ0NvbnRhaW5lcihyb290LmNvbnRhaW5lckluZm8pO1xuICAgIH1cbiAgfVxuXG4gIHZhciBleGl0U3RhdHVzID0gcmVuZGVyUm9vdFN5bmMocm9vdCwgZXJyb3JSZXRyeUxhbmVzKTtcblxuICBpZiAoZXhpdFN0YXR1cyAhPT0gUm9vdEVycm9yZWQpIHtcbiAgICAvLyBTdWNjZXNzZnVsbHkgZmluaXNoZWQgcmVuZGVyaW5nIG9uIHJldHJ5XG4gICAgLy8gVGhlIGVycm9ycyBmcm9tIHRoZSBmYWlsZWQgZmlyc3QgYXR0ZW1wdCBoYXZlIGJlZW4gcmVjb3ZlcmVkLiBBZGRcbiAgICAvLyB0aGVtIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHJlY292ZXJhYmxlIGVycm9ycy4gV2UnbGwgbG9nIHRoZW0gaW4gdGhlXG4gICAgLy8gY29tbWl0IHBoYXNlLlxuICAgIHZhciBlcnJvcnNGcm9tU2Vjb25kQXR0ZW1wdCA9IHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzO1xuICAgIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzID0gZXJyb3JzRnJvbUZpcnN0QXR0ZW1wdDsgLy8gVGhlIGVycm9ycyBmcm9tIHRoZSBzZWNvbmQgYXR0ZW1wdCBzaG91bGQgYmUgcXVldWVkIGFmdGVyIHRoZSBlcnJvcnNcbiAgICAvLyBmcm9tIHRoZSBmaXJzdCBhdHRlbXB0LCB0byBwcmVzZXJ2ZSB0aGUgY2F1c2FsIHNlcXVlbmNlLlxuXG4gICAgaWYgKGVycm9yc0Zyb21TZWNvbmRBdHRlbXB0ICE9PSBudWxsKSB7XG4gICAgICBxdWV1ZVJlY292ZXJhYmxlRXJyb3JzKGVycm9yc0Zyb21TZWNvbmRBdHRlbXB0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhpdFN0YXR1cztcbn1cblxuZnVuY3Rpb24gcXVldWVSZWNvdmVyYWJsZUVycm9ycyhlcnJvcnMpIHtcbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzID09PSBudWxsKSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMgPSBlcnJvcnM7XG4gIH0gZWxzZSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMucHVzaC5hcHBseSh3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgZXJyb3JzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5pc2hDb25jdXJyZW50UmVuZGVyKHJvb3QsIGV4aXRTdGF0dXMsIGxhbmVzKSB7XG4gIHN3aXRjaCAoZXhpdFN0YXR1cykge1xuICAgIGNhc2UgUm9vdEluUHJvZ3Jlc3M6XG4gICAgY2FzZSBSb290RmF0YWxFcnJvcmVkOlxuICAgICAge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jvb3QgZGlkIG5vdCBjb21wbGV0ZS4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH1cbiAgICAvLyBGbG93IGtub3dzIGFib3V0IGludmFyaWFudCwgc28gaXQgY29tcGxhaW5zIGlmIEkgYWRkIGEgYnJlYWtcbiAgICAvLyBzdGF0ZW1lbnQsIGJ1dCBlc2xpbnQgZG9lc24ndCBrbm93IGFib3V0IGludmFyaWFudCwgc28gaXQgY29tcGxhaW5zXG4gICAgLy8gaWYgSSBkby4gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICBjYXNlIFJvb3RFcnJvcmVkOlxuICAgICAge1xuICAgICAgICAvLyBXZSBzaG91bGQgaGF2ZSBhbHJlYWR5IGF0dGVtcHRlZCB0byByZXRyeSB0aGlzIHRyZWUuIElmIHdlIHJlYWNoZWRcbiAgICAgICAgLy8gdGhpcyBwb2ludCwgaXQgZXJyb3JlZCBhZ2Fpbi4gQ29tbWl0IGl0LlxuICAgICAgICBjb21taXRSb290KHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFJvb3RTdXNwZW5kZWQ6XG4gICAgICB7XG4gICAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgbGFuZXMpOyAvLyBXZSBoYXZlIGFuIGFjY2VwdGFibGUgbG9hZGluZyBzdGF0ZS4gV2UgbmVlZCB0byBmaWd1cmUgb3V0IGlmIHdlXG4gICAgICAgIC8vIHNob3VsZCBpbW1lZGlhdGVseSBjb21taXQgaXQgb3Igd2FpdCBhIGJpdC5cblxuICAgICAgICBpZiAoaW5jbHVkZXNPbmx5UmV0cmllcyhsYW5lcykgJiYgLy8gZG8gbm90IGRlbGF5IGlmIHdlJ3JlIGluc2lkZSBhbiBhY3QoKSBzY29wZVxuICAgICAgICAhc2hvdWxkRm9yY2VGbHVzaEZhbGxiYWNrc0luREVWKCkpIHtcbiAgICAgICAgICAvLyBUaGlzIHJlbmRlciBvbmx5IGluY2x1ZGVkIHJldHJpZXMsIG5vIHVwZGF0ZXMuIFRocm90dGxlIGNvbW1pdHRpbmdcbiAgICAgICAgICAvLyByZXRyaWVzIHNvIHRoYXQgd2UgZG9uJ3Qgc2hvdyB0b28gbWFueSBsb2FkaW5nIHN0YXRlcyB0b28gcXVpY2tseS5cbiAgICAgICAgICB2YXIgbXNVbnRpbFRpbWVvdXQgPSBnbG9iYWxNb3N0UmVjZW50RmFsbGJhY2tUaW1lICsgRkFMTEJBQ0tfVEhST1RUTEVfTVMgLSBub3coKTsgLy8gRG9uJ3QgYm90aGVyIHdpdGggYSB2ZXJ5IHNob3J0IHN1c3BlbnNlIHRpbWUuXG5cbiAgICAgICAgICBpZiAobXNVbnRpbFRpbWVvdXQgPiAxMCkge1xuICAgICAgICAgICAgdmFyIG5leHRMYW5lcyA9IGdldE5leHRMYW5lcyhyb290LCBOb0xhbmVzKTtcblxuICAgICAgICAgICAgaWYgKG5leHRMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgICAgICAgICAvLyBUaGVyZSdzIGFkZGl0aW9uYWwgd29yayBvbiB0aGlzIHJvb3QuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgc3VzcGVuZGVkTGFuZXMgPSByb290LnN1c3BlbmRlZExhbmVzO1xuXG4gICAgICAgICAgICBpZiAoIWlzU3Vic2V0T2ZMYW5lcyhzdXNwZW5kZWRMYW5lcywgbGFuZXMpKSB7XG4gICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBwcmVmZXIgdG8gcmVuZGVyIHRoZSBmYWxsYmFjayBvZiBhdCB0aGUgbGFzdFxuICAgICAgICAgICAgICAvLyBzdXNwZW5kZWQgbGV2ZWwuIFBpbmcgdGhlIGxhc3Qgc3VzcGVuZGVkIGxldmVsIHRvIHRyeVxuICAgICAgICAgICAgICAvLyByZW5kZXJpbmcgaXQgYWdhaW4uXG4gICAgICAgICAgICAgIC8vIEZJWE1FOiBXaGF0IGlmIHRoZSBzdXNwZW5kZWQgbGFuZXMgYXJlIElkbGU/IFNob3VsZCBub3QgcmVzdGFydC5cbiAgICAgICAgICAgICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICAgICAgICAgICAgbWFya1Jvb3RQaW5nZWQocm9vdCwgc3VzcGVuZGVkTGFuZXMpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gLy8gVGhlIHJlbmRlciBpcyBzdXNwZW5kZWQsIGl0IGhhc24ndCB0aW1lZCBvdXQsIGFuZCB0aGVyZSdzIG5vXG4gICAgICAgICAgICAvLyBsb3dlciBwcmlvcml0eSB3b3JrIHRvIGRvLiBJbnN0ZWFkIG9mIGNvbW1pdHRpbmcgdGhlIGZhbGxiYWNrXG4gICAgICAgICAgICAvLyBpbW1lZGlhdGVseSwgd2FpdCBmb3IgbW9yZSBkYXRhIHRvIGFycml2ZS5cblxuXG4gICAgICAgICAgICByb290LnRpbWVvdXRIYW5kbGUgPSBzY2hlZHVsZVRpbWVvdXQoY29tbWl0Um9vdC5iaW5kKG51bGwsIHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zKSwgbXNVbnRpbFRpbWVvdXQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIFRoZSB3b3JrIGV4cGlyZWQuIENvbW1pdCBpbW1lZGlhdGVseS5cblxuXG4gICAgICAgIGNvbW1pdFJvb3Qocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgUm9vdFN1c3BlbmRlZFdpdGhEZWxheTpcbiAgICAgIHtcbiAgICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBsYW5lcyk7XG5cbiAgICAgICAgaWYgKGluY2x1ZGVzT25seVRyYW5zaXRpb25zKGxhbmVzKSkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgYSB0cmFuc2l0aW9uLCBzbyB3ZSBzaG91bGQgZXhpdCB3aXRob3V0IGNvbW1pdHRpbmcgYVxuICAgICAgICAgIC8vIHBsYWNlaG9sZGVyIGFuZCB3aXRob3V0IHNjaGVkdWxpbmcgYSB0aW1lb3V0LiBEZWxheSBpbmRlZmluaXRlbHlcbiAgICAgICAgICAvLyB1bnRpbCB3ZSByZWNlaXZlIG1vcmUgZGF0YS5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc2hvdWxkRm9yY2VGbHVzaEZhbGxiYWNrc0luREVWKCkpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIHRyYW5zaXRpb24sIGJ1dCB3ZSBkaWQgdHJpZ2dlciBhbiBhdm9pZGVkIHN0YXRlLlxuICAgICAgICAgIC8vIFNjaGVkdWxlIGEgcGxhY2Vob2xkZXIgdG8gZGlzcGxheSBhZnRlciBhIHNob3J0IGRlbGF5LCB1c2luZyB0aGUgSnVzdFxuICAgICAgICAgIC8vIE5vdGljZWFibGUgRGlmZmVyZW5jZS5cbiAgICAgICAgICAvLyBUT0RPOiBJcyB0aGUgSk5EIG9wdGltaXphdGlvbiB3b3J0aCB0aGUgYWRkZWQgY29tcGxleGl0eT8gSWYgdGhpcyBpc1xuICAgICAgICAgIC8vIHRoZSBvbmx5IHJlYXNvbiB3ZSB0cmFjayB0aGUgZXZlbnQgdGltZSwgdGhlbiBwcm9iYWJseSBub3QuXG4gICAgICAgICAgLy8gQ29uc2lkZXIgcmVtb3ZpbmcuXG4gICAgICAgICAgdmFyIG1vc3RSZWNlbnRFdmVudFRpbWUgPSBnZXRNb3N0UmVjZW50RXZlbnRUaW1lKHJvb3QsIGxhbmVzKTtcbiAgICAgICAgICB2YXIgZXZlbnRUaW1lTXMgPSBtb3N0UmVjZW50RXZlbnRUaW1lO1xuICAgICAgICAgIHZhciB0aW1lRWxhcHNlZE1zID0gbm93KCkgLSBldmVudFRpbWVNcztcblxuICAgICAgICAgIHZhciBfbXNVbnRpbFRpbWVvdXQgPSBqbmQodGltZUVsYXBzZWRNcykgLSB0aW1lRWxhcHNlZE1zOyAvLyBEb24ndCBib3RoZXIgd2l0aCBhIHZlcnkgc2hvcnQgc3VzcGVuc2UgdGltZS5cblxuXG4gICAgICAgICAgaWYgKF9tc1VudGlsVGltZW91dCA+IDEwKSB7XG4gICAgICAgICAgICAvLyBJbnN0ZWFkIG9mIGNvbW1pdHRpbmcgdGhlIGZhbGxiYWNrIGltbWVkaWF0ZWx5LCB3YWl0IGZvciBtb3JlIGRhdGFcbiAgICAgICAgICAgIC8vIHRvIGFycml2ZS5cbiAgICAgICAgICAgIHJvb3QudGltZW91dEhhbmRsZSA9IHNjaGVkdWxlVGltZW91dChjb21taXRSb290LmJpbmQobnVsbCwgcm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpLCBfbXNVbnRpbFRpbWVvdXQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIENvbW1pdCB0aGUgcGxhY2Vob2xkZXIuXG5cblxuICAgICAgICBjb21taXRSb290KHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFJvb3RDb21wbGV0ZWQ6XG4gICAgICB7XG4gICAgICAgIC8vIFRoZSB3b3JrIGNvbXBsZXRlZC4gUmVhZHkgdG8gY29tbWl0LlxuICAgICAgICBjb21taXRSb290KHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gcm9vdCBleGl0IHN0YXR1cy4nKTtcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1JlbmRlckNvbnNpc3RlbnRXaXRoRXh0ZXJuYWxTdG9yZXMoZmluaXNoZWRXb3JrKSB7XG4gIC8vIFNlYXJjaCB0aGUgcmVuZGVyZWQgdHJlZSBmb3IgZXh0ZXJuYWwgc3RvcmUgcmVhZHMsIGFuZCBjaGVjayB3aGV0aGVyIHRoZVxuICAvLyBzdG9yZXMgd2VyZSBtdXRhdGVkIGluIGEgY29uY3VycmVudCBldmVudC4gSW50ZW50aW9uYWxseSB1c2luZyBhbiBpdGVyYXRpdmVcbiAgLy8gbG9vcCBpbnN0ZWFkIG9mIHJlY3Vyc2lvbiBzbyB3ZSBjYW4gZXhpdCBlYXJseS5cbiAgdmFyIG5vZGUgPSBmaW5pc2hlZFdvcms7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAobm9kZS5mbGFncyAmIFN0b3JlQ29uc2lzdGVuY3kpIHtcbiAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IG5vZGUudXBkYXRlUXVldWU7XG5cbiAgICAgIGlmICh1cGRhdGVRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgY2hlY2tzID0gdXBkYXRlUXVldWUuc3RvcmVzO1xuXG4gICAgICAgIGlmIChjaGVja3MgIT09IG51bGwpIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoZWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNoZWNrID0gY2hlY2tzW2ldO1xuICAgICAgICAgICAgdmFyIGdldFNuYXBzaG90ID0gY2hlY2suZ2V0U25hcHNob3Q7XG4gICAgICAgICAgICB2YXIgcmVuZGVyZWRWYWx1ZSA9IGNoZWNrLnZhbHVlO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBpZiAoIW9iamVjdElzKGdldFNuYXBzaG90KCksIHJlbmRlcmVkVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgLy8gRm91bmQgYW4gaW5jb25zaXN0ZW50IHN0b3JlLlxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgLy8gSWYgYGdldFNuYXBzaG90YCB0aHJvd3MsIHJldHVybiBgZmFsc2VgLiBUaGlzIHdpbGwgc2NoZWR1bGVcbiAgICAgICAgICAgICAgLy8gYSByZS1yZW5kZXIsIGFuZCB0aGUgZXJyb3Igd2lsbCBiZSByZXRocm93biBkdXJpbmcgcmVuZGVyLlxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNoaWxkID0gbm9kZS5jaGlsZDtcblxuICAgIGlmIChub2RlLnN1YnRyZWVGbGFncyAmIFN0b3JlQ29uc2lzdGVuY3kgJiYgY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICBub2RlID0gY2hpbGQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZSA9PT0gZmluaXNoZWRXb3JrKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IGZpbmlzaGVkV29yaykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cblxuICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICB9IC8vIEZsb3cgZG9lc24ndCBrbm93IHRoaXMgaXMgdW5yZWFjaGFibGUsIGJ1dCBlc2xpbnQgZG9lc1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5yZWFjaGFibGVcblxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIHN1c3BlbmRlZExhbmVzKSB7XG4gIC8vIFdoZW4gc3VzcGVuZGluZywgd2Ugc2hvdWxkIGFsd2F5cyBleGNsdWRlIGxhbmVzIHRoYXQgd2VyZSBwaW5nZWQgb3IgKG1vcmVcbiAgLy8gcmFyZWx5LCBzaW5jZSB3ZSB0cnkgdG8gYXZvaWQgaXQpIHVwZGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UuXG4gIC8vIFRPRE86IExvbCBtYXliZSB0aGVyZSdzIGEgYmV0dGVyIHdheSB0byBmYWN0b3IgdGhpcyBiZXNpZGVzIHRoaXNcbiAgLy8gb2Jub3hpb3VzbHkgbmFtZWQgZnVuY3Rpb24gOilcbiAgc3VzcGVuZGVkTGFuZXMgPSByZW1vdmVMYW5lcyhzdXNwZW5kZWRMYW5lcywgd29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXMpO1xuICBzdXNwZW5kZWRMYW5lcyA9IHJlbW92ZUxhbmVzKHN1c3BlbmRlZExhbmVzLCB3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcyk7XG4gIG1hcmtSb290U3VzcGVuZGVkKHJvb3QsIHN1c3BlbmRlZExhbmVzKTtcbn0gLy8gVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHN5bmNocm9ub3VzIHRhc2tzIHRoYXQgZG9uJ3QgZ29cbi8vIHRocm91Z2ggU2NoZWR1bGVyXG5cblxuZnVuY3Rpb24gcGVyZm9ybVN5bmNXb3JrT25Sb290KHJvb3QpIHtcbiAge1xuICAgIHN5bmNOZXN0ZWRVcGRhdGVGbGFnKCk7XG4gIH1cblxuICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbm90IGFscmVhZHkgYmUgd29ya2luZy4nKTtcbiAgfVxuXG4gIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgdmFyIGxhbmVzID0gZ2V0TmV4dExhbmVzKHJvb3QsIE5vTGFuZXMpO1xuXG4gIGlmICghaW5jbHVkZXNTb21lTGFuZShsYW5lcywgU3luY0xhbmUpKSB7XG4gICAgLy8gVGhlcmUncyBubyByZW1haW5pbmcgc3luYyB3b3JrIGxlZnQuXG4gICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBleGl0U3RhdHVzID0gcmVuZGVyUm9vdFN5bmMocm9vdCwgbGFuZXMpO1xuXG4gIGlmIChyb290LnRhZyAhPT0gTGVnYWN5Um9vdCAmJiBleGl0U3RhdHVzID09PSBSb290RXJyb3JlZCkge1xuICAgIC8vIElmIHNvbWV0aGluZyB0aHJldyBhbiBlcnJvciwgdHJ5IHJlbmRlcmluZyBvbmUgbW9yZSB0aW1lLiBXZSdsbCByZW5kZXJcbiAgICAvLyBzeW5jaHJvbm91c2x5IHRvIGJsb2NrIGNvbmN1cnJlbnQgZGF0YSBtdXRhdGlvbnMsIGFuZCB3ZSdsbCBpbmNsdWRlc1xuICAgIC8vIGFsbCBwZW5kaW5nIHVwZGF0ZXMgYXJlIGluY2x1ZGVkLiBJZiBpdCBzdGlsbCBmYWlscyBhZnRlciB0aGUgc2Vjb25kXG4gICAgLy8gYXR0ZW1wdCwgd2UnbGwgZ2l2ZSB1cCBhbmQgY29tbWl0IHRoZSByZXN1bHRpbmcgdHJlZS5cbiAgICB2YXIgZXJyb3JSZXRyeUxhbmVzID0gZ2V0TGFuZXNUb1JldHJ5U3luY2hyb25vdXNseU9uRXJyb3Iocm9vdCk7XG5cbiAgICBpZiAoZXJyb3JSZXRyeUxhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICBsYW5lcyA9IGVycm9yUmV0cnlMYW5lcztcbiAgICAgIGV4aXRTdGF0dXMgPSByZWNvdmVyRnJvbUNvbmN1cnJlbnRFcnJvcihyb290LCBlcnJvclJldHJ5TGFuZXMpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChleGl0U3RhdHVzID09PSBSb290RmF0YWxFcnJvcmVkKSB7XG4gICAgdmFyIGZhdGFsRXJyb3IgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RGYXRhbEVycm9yO1xuICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIE5vTGFuZXMpO1xuICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgbGFuZXMpO1xuICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG4gICAgdGhyb3cgZmF0YWxFcnJvcjtcbiAgfVxuXG4gIGlmIChleGl0U3RhdHVzID09PSBSb290RGlkTm90Q29tcGxldGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jvb3QgZGlkIG5vdCBjb21wbGV0ZS4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgfSAvLyBXZSBub3cgaGF2ZSBhIGNvbnNpc3RlbnQgdHJlZS4gQmVjYXVzZSB0aGlzIGlzIGEgc3luYyByZW5kZXIsIHdlXG4gIC8vIHdpbGwgY29tbWl0IGl0IGV2ZW4gaWYgc29tZXRoaW5nIHN1c3BlbmRlZC5cblxuXG4gIHZhciBmaW5pc2hlZFdvcmsgPSByb290LmN1cnJlbnQuYWx0ZXJuYXRlO1xuICByb290LmZpbmlzaGVkV29yayA9IGZpbmlzaGVkV29yaztcbiAgcm9vdC5maW5pc2hlZExhbmVzID0gbGFuZXM7XG4gIGNvbW1pdFJvb3Qocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpOyAvLyBCZWZvcmUgZXhpdGluZywgbWFrZSBzdXJlIHRoZXJlJ3MgYSBjYWxsYmFjayBzY2hlZHVsZWQgZm9yIHRoZSBuZXh0XG4gIC8vIHBlbmRpbmcgbGV2ZWwuXG5cbiAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGZsdXNoUm9vdChyb290LCBsYW5lcykge1xuICBpZiAobGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICBtYXJrUm9vdEVudGFuZ2xlZChyb290LCBtZXJnZUxhbmVzKGxhbmVzLCBTeW5jTGFuZSkpO1xuICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG5cbiAgICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSA9PT0gTm9Db250ZXh0KSB7XG4gICAgICByZXNldFJlbmRlclRpbWVyKCk7XG4gICAgICBmbHVzaFN5bmNDYWxsYmFja3MoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGJhdGNoZWRVcGRhdGVzJDEoZm4sIGEpIHtcbiAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgZXhlY3V0aW9uQ29udGV4dCB8PSBCYXRjaGVkQ29udGV4dDtcblxuICB0cnkge1xuICAgIHJldHVybiBmbihhKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7IC8vIElmIHRoZXJlIHdlcmUgbGVnYWN5IHN5bmMgdXBkYXRlcywgZmx1c2ggdGhlbSBhdCB0aGUgZW5kIG9mIHRoZSBvdXRlclxuICAgIC8vIG1vc3QgYmF0Y2hlZFVwZGF0ZXMtbGlrZSBtZXRob2QuXG5cbiAgICBpZiAoZXhlY3V0aW9uQ29udGV4dCA9PT0gTm9Db250ZXh0ICYmIC8vIFRyZWF0IGBhY3RgIGFzIGlmIGl0J3MgaW5zaWRlIGBiYXRjaGVkVXBkYXRlc2AsIGV2ZW4gaW4gbGVnYWN5IG1vZGUuXG4gICAgISggUmVhY3RDdXJyZW50QWN0UXVldWUkMS5pc0JhdGNoaW5nTGVnYWN5KSkge1xuICAgICAgcmVzZXRSZW5kZXJUaW1lcigpO1xuICAgICAgZmx1c2hTeW5jQ2FsbGJhY2tzT25seUluTGVnYWN5TW9kZSgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZGlzY3JldGVVcGRhdGVzKGZuLCBhLCBiLCBjLCBkKSB7XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbjtcblxuICB0cnkge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IG51bGw7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7XG4gICAgcmV0dXJuIGZuKGEsIGIsIGMsIGQpO1xuICB9IGZpbmFsbHkge1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5KTtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcblxuICAgIGlmIChleGVjdXRpb25Db250ZXh0ID09PSBOb0NvbnRleHQpIHtcbiAgICAgIHJlc2V0UmVuZGVyVGltZXIoKTtcbiAgICB9XG4gIH1cbn0gLy8gT3ZlcmxvYWQgdGhlIGRlZmluaXRpb24gdG8gdGhlIHR3byB2YWxpZCBzaWduYXR1cmVzLlxuLy8gV2FybmluZywgdGhpcyBvcHRzLW91dCBvZiBjaGVja2luZyB0aGUgZnVuY3Rpb24gYm9keS5cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlZGVjbGFyZVxuZnVuY3Rpb24gZmx1c2hTeW5jKGZuKSB7XG4gIC8vIEluIGxlZ2FjeSBtb2RlLCB3ZSBmbHVzaCBwZW5kaW5nIHBhc3NpdmUgZWZmZWN0cyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZVxuICAvLyBuZXh0IGV2ZW50LCBub3QgYXQgdGhlIGVuZCBvZiB0aGUgcHJldmlvdXMgb25lLlxuICBpZiAocm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgIT09IG51bGwgJiYgcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMudGFnID09PSBMZWdhY3lSb290ICYmIChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgPT09IE5vQ29udGV4dCkge1xuICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgfVxuXG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gQmF0Y2hlZENvbnRleHQ7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbjtcbiAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcblxuICB0cnkge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IG51bGw7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7XG5cbiAgICBpZiAoZm4pIHtcbiAgICAgIHJldHVybiBmbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSk7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG4gICAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0OyAvLyBGbHVzaCB0aGUgaW1tZWRpYXRlIGNhbGxiYWNrcyB0aGF0IHdlcmUgc2NoZWR1bGVkIGR1cmluZyB0aGlzIGJhdGNoLlxuICAgIC8vIE5vdGUgdGhhdCB0aGlzIHdpbGwgaGFwcGVuIGV2ZW4gaWYgYmF0Y2hlZFVwZGF0ZXMgaXMgaGlnaGVyIHVwXG4gICAgLy8gdGhlIHN0YWNrLlxuXG4gICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgPT09IE5vQ29udGV4dCkge1xuICAgICAgZmx1c2hTeW5jQ2FsbGJhY2tzKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBpc0FscmVhZHlSZW5kZXJpbmcoKSB7XG4gIC8vIFVzZWQgYnkgdGhlIHJlbmRlcmVyIHRvIHByaW50IGEgd2FybmluZyBpZiBjZXJ0YWluIEFQSXMgYXJlIGNhbGxlZCBmcm9tXG4gIC8vIHRoZSB3cm9uZyBjb250ZXh0LlxuICByZXR1cm4gIChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgIT09IE5vQ29udGV4dDtcbn1cbmZ1bmN0aW9uIHB1c2hSZW5kZXJMYW5lcyhmaWJlciwgbGFuZXMpIHtcbiAgcHVzaChzdWJ0cmVlUmVuZGVyTGFuZXNDdXJzb3IsIHN1YnRyZWVSZW5kZXJMYW5lcywgZmliZXIpO1xuICBzdWJ0cmVlUmVuZGVyTGFuZXMgPSBtZXJnZUxhbmVzKHN1YnRyZWVSZW5kZXJMYW5lcywgbGFuZXMpO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzLCBsYW5lcyk7XG59XG5mdW5jdGlvbiBwb3BSZW5kZXJMYW5lcyhmaWJlcikge1xuICBzdWJ0cmVlUmVuZGVyTGFuZXMgPSBzdWJ0cmVlUmVuZGVyTGFuZXNDdXJzb3IuY3VycmVudDtcbiAgcG9wKHN1YnRyZWVSZW5kZXJMYW5lc0N1cnNvciwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBsYW5lcykge1xuICByb290LmZpbmlzaGVkV29yayA9IG51bGw7XG4gIHJvb3QuZmluaXNoZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHZhciB0aW1lb3V0SGFuZGxlID0gcm9vdC50aW1lb3V0SGFuZGxlO1xuXG4gIGlmICh0aW1lb3V0SGFuZGxlICE9PSBub1RpbWVvdXQpIHtcbiAgICAvLyBUaGUgcm9vdCBwcmV2aW91cyBzdXNwZW5kZWQgYW5kIHNjaGVkdWxlZCBhIHRpbWVvdXQgdG8gY29tbWl0IGEgZmFsbGJhY2tcbiAgICAvLyBzdGF0ZS4gTm93IHRoYXQgd2UgaGF2ZSBhZGRpdGlvbmFsIHdvcmssIGNhbmNlbCB0aGUgdGltZW91dC5cbiAgICByb290LnRpbWVvdXRIYW5kbGUgPSBub1RpbWVvdXQ7IC8vICRGbG93Rml4TWUgQ29tcGxhaW5zIG5vVGltZW91dCBpcyBub3QgYSBUaW1lb3V0SUQsIGRlc3BpdGUgdGhlIGNoZWNrIGFib3ZlXG5cbiAgICBjYW5jZWxUaW1lb3V0KHRpbWVvdXRIYW5kbGUpO1xuICB9XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzICE9PSBudWxsKSB7XG4gICAgdmFyIGludGVycnVwdGVkV29yayA9IHdvcmtJblByb2dyZXNzLnJldHVybjtcblxuICAgIHdoaWxlIChpbnRlcnJ1cHRlZFdvcmsgIT09IG51bGwpIHtcbiAgICAgIHZhciBjdXJyZW50ID0gaW50ZXJydXB0ZWRXb3JrLmFsdGVybmF0ZTtcbiAgICAgIHVud2luZEludGVycnVwdGVkV29yayhjdXJyZW50LCBpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgaW50ZXJydXB0ZWRXb3JrID0gaW50ZXJydXB0ZWRXb3JrLnJldHVybjtcbiAgICB9XG4gIH1cblxuICB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSByb290O1xuICB2YXIgcm9vdFdvcmtJblByb2dyZXNzID0gY3JlYXRlV29ya0luUHJvZ3Jlc3Mocm9vdC5jdXJyZW50LCBudWxsKTtcbiAgd29ya0luUHJvZ3Jlc3MgPSByb290V29ya0luUHJvZ3Jlc3M7XG4gIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gc3VidHJlZVJlbmRlckxhbmVzID0gd29ya0luUHJvZ3Jlc3NSb290SW5jbHVkZWRMYW5lcyA9IGxhbmVzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdEluUHJvZ3Jlc3M7XG4gIHdvcmtJblByb2dyZXNzUm9vdEZhdGFsRXJyb3IgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RTa2lwcGVkTGFuZXMgPSBOb0xhbmVzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHdvcmtJblByb2dyZXNzUm9vdFBpbmdlZExhbmVzID0gTm9MYW5lcztcbiAgd29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9ycyA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzID0gbnVsbDtcbiAgZmluaXNoUXVldWVpbmdDb25jdXJyZW50VXBkYXRlcygpO1xuXG4gIHtcbiAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5kaXNjYXJkUGVuZGluZ1dhcm5pbmdzKCk7XG4gIH1cblxuICByZXR1cm4gcm9vdFdvcmtJblByb2dyZXNzO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVFcnJvcihyb290LCB0aHJvd25WYWx1ZSkge1xuICBkbyB7XG4gICAgdmFyIGVycm9yZWRXb3JrID0gd29ya0luUHJvZ3Jlc3M7XG5cbiAgICB0cnkge1xuICAgICAgLy8gUmVzZXQgbW9kdWxlLWxldmVsIHN0YXRlIHRoYXQgd2FzIHNldCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS5cbiAgICAgIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpO1xuICAgICAgcmVzZXRIb29rc0FmdGVyVGhyb3coKTtcbiAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7IC8vIFRPRE86IEkgZm91bmQgYW5kIGFkZGVkIHRoaXMgbWlzc2luZyBsaW5lIHdoaWxlIGludmVzdGlnYXRpbmcgYVxuICAgICAgLy8gc2VwYXJhdGUgaXNzdWUuIFdyaXRlIGEgcmVncmVzc2lvbiB0ZXN0IHVzaW5nIHN0cmluZyByZWZzLlxuXG4gICAgICBSZWFjdEN1cnJlbnRPd25lciQyLmN1cnJlbnQgPSBudWxsO1xuXG4gICAgICBpZiAoZXJyb3JlZFdvcmsgPT09IG51bGwgfHwgZXJyb3JlZFdvcmsucmV0dXJuID09PSBudWxsKSB7XG4gICAgICAgIC8vIEV4cGVjdGVkIHRvIGJlIHdvcmtpbmcgb24gYSBub24tcm9vdCBmaWJlci4gVGhpcyBpcyBhIGZhdGFsIGVycm9yXG4gICAgICAgIC8vIGJlY2F1c2UgdGhlcmUncyBubyBhbmNlc3RvciB0aGF0IGNhbiBoYW5kbGUgaXQ7IHRoZSByb290IGlzXG4gICAgICAgIC8vIHN1cHBvc2VkIHRvIGNhcHR1cmUgYWxsIGVycm9ycyB0aGF0IHdlcmVuJ3QgY2F1Z2h0IGJ5IGFuIGVycm9yXG4gICAgICAgIC8vIGJvdW5kYXJ5LlxuICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdEZhdGFsRXJyb3JlZDtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvciA9IHRocm93blZhbHVlOyAvLyBTZXQgYHdvcmtJblByb2dyZXNzYCB0byBudWxsLiBUaGlzIHJlcHJlc2VudHMgYWR2YW5jaW5nIHRvIHRoZSBuZXh0XG4gICAgICAgIC8vIHNpYmxpbmcsIG9yIHRoZSBwYXJlbnQgaWYgdGhlcmUgYXJlIG5vIHNpYmxpbmdzLiBCdXQgc2luY2UgdGhlIHJvb3RcbiAgICAgICAgLy8gaGFzIG5vIHNpYmxpbmdzIG5vciBhIHBhcmVudCwgd2Ugc2V0IGl0IHRvIG51bGwuIFVzdWFsbHkgdGhpcyBpc1xuICAgICAgICAvLyBoYW5kbGVkIGJ5IGBjb21wbGV0ZVVuaXRPZldvcmtgIG9yIGB1bndpbmRXb3JrYCwgYnV0IHNpbmNlIHdlJ3JlXG4gICAgICAgIC8vIGludGVudGlvbmFsbHkgbm90IGNhbGxpbmcgdGhvc2UsIHdlIG5lZWQgc2V0IGl0IGhlcmUuXG4gICAgICAgIC8vIFRPRE86IENvbnNpZGVyIGNhbGxpbmcgYHVud2luZFdvcmtgIHRvIHBvcCB0aGUgY29udGV4dHMuXG5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChlbmFibGVQcm9maWxlclRpbWVyICYmIGVycm9yZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAvLyBSZWNvcmQgdGhlIHRpbWUgc3BlbnQgcmVuZGVyaW5nIGJlZm9yZSBhbiBlcnJvciB3YXMgdGhyb3duLiBUaGlzXG4gICAgICAgIC8vIGF2b2lkcyBpbmFjY3VyYXRlIFByb2ZpbGVyIGR1cmF0aW9ucyBpbiB0aGUgY2FzZSBvZiBhXG4gICAgICAgIC8vIHN1c3BlbmRlZCByZW5kZXIuXG4gICAgICAgIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkRGVsdGEoZXJyb3JlZFdvcmssIHRydWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW5hYmxlU2NoZWR1bGluZ1Byb2ZpbGVyKSB7XG4gICAgICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCk7XG5cbiAgICAgICAgaWYgKHRocm93blZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB0aHJvd25WYWx1ZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHRocm93blZhbHVlLnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2YXIgd2FrZWFibGUgPSB0aHJvd25WYWx1ZTtcbiAgICAgICAgICBtYXJrQ29tcG9uZW50U3VzcGVuZGVkKGVycm9yZWRXb3JrLCB3YWtlYWJsZSwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1hcmtDb21wb25lbnRFcnJvcmVkKGVycm9yZWRXb3JrLCB0aHJvd25WYWx1ZSwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRocm93RXhjZXB0aW9uKHJvb3QsIGVycm9yZWRXb3JrLnJldHVybiwgZXJyb3JlZFdvcmssIHRocm93blZhbHVlLCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gICAgICBjb21wbGV0ZVVuaXRPZldvcmsoZXJyb3JlZFdvcmspO1xuICAgIH0gY2F0Y2ggKHlldEFub3RoZXJUaHJvd25WYWx1ZSkge1xuICAgICAgLy8gU29tZXRoaW5nIGluIHRoZSByZXR1cm4gcGF0aCBhbHNvIHRocmV3LlxuICAgICAgdGhyb3duVmFsdWUgPSB5ZXRBbm90aGVyVGhyb3duVmFsdWU7XG5cbiAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcyA9PT0gZXJyb3JlZFdvcmsgJiYgZXJyb3JlZFdvcmsgIT09IG51bGwpIHtcbiAgICAgICAgLy8gSWYgdGhpcyBib3VuZGFyeSBoYXMgYWxyZWFkeSBlcnJvcmVkLCB0aGVuIHdlIGhhZCB0cm91YmxlIHByb2Nlc3NpbmdcbiAgICAgICAgLy8gdGhlIGVycm9yLiBCdWJibGUgaXQgdG8gdGhlIG5leHQgYm91bmRhcnkuXG4gICAgICAgIGVycm9yZWRXb3JrID0gZXJyb3JlZFdvcmsucmV0dXJuO1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IGVycm9yZWRXb3JrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3JlZFdvcmsgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICAgIH1cblxuICAgICAgY29udGludWU7XG4gICAgfSAvLyBSZXR1cm4gdG8gdGhlIG5vcm1hbCB3b3JrIGxvb3AuXG5cblxuICAgIHJldHVybjtcbiAgfSB3aGlsZSAodHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIHB1c2hEaXNwYXRjaGVyKCkge1xuICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDIuY3VycmVudDtcbiAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQyLmN1cnJlbnQgPSBDb250ZXh0T25seURpc3BhdGNoZXI7XG5cbiAgaWYgKHByZXZEaXNwYXRjaGVyID09PSBudWxsKSB7XG4gICAgLy8gVGhlIFJlYWN0IGlzb21vcnBoaWMgcGFja2FnZSBkb2VzIG5vdCBpbmNsdWRlIGEgZGVmYXVsdCBkaXNwYXRjaGVyLlxuICAgIC8vIEluc3RlYWQgdGhlIGZpcnN0IHJlbmRlcmVyIHdpbGwgbGF6aWx5IGF0dGFjaCBvbmUsIGluIG9yZGVyIHRvIGdpdmVcbiAgICAvLyBuaWNlciBlcnJvciBtZXNzYWdlcy5cbiAgICByZXR1cm4gQ29udGV4dE9ubHlEaXNwYXRjaGVyO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBwcmV2RGlzcGF0Y2hlcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBwb3BEaXNwYXRjaGVyKHByZXZEaXNwYXRjaGVyKSB7XG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMi5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG59XG5cbmZ1bmN0aW9uIG1hcmtDb21taXRUaW1lT2ZGYWxsYmFjaygpIHtcbiAgZ2xvYmFsTW9zdFJlY2VudEZhbGxiYWNrVGltZSA9IG5vdygpO1xufVxuZnVuY3Rpb24gbWFya1NraXBwZWRVcGRhdGVMYW5lcyhsYW5lKSB7XG4gIHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcyA9IG1lcmdlTGFuZXMobGFuZSwgd29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzKTtcbn1cbmZ1bmN0aW9uIHJlbmRlckRpZFN1c3BlbmQoKSB7XG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290SW5Qcm9ncmVzcykge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290U3VzcGVuZGVkO1xuICB9XG59XG5mdW5jdGlvbiByZW5kZXJEaWRTdXNwZW5kRGVsYXlJZlBvc3NpYmxlKCkge1xuICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdEluUHJvZ3Jlc3MgfHwgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdFN1c3BlbmRlZCB8fCB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290RXJyb3JlZCkge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290U3VzcGVuZGVkV2l0aERlbGF5O1xuICB9IC8vIENoZWNrIGlmIHRoZXJlIGFyZSB1cGRhdGVzIHRoYXQgd2Ugc2tpcHBlZCB0cmVlIHRoYXQgbWlnaHQgaGF2ZSB1bmJsb2NrZWRcbiAgLy8gdGhpcyByZW5kZXIuXG5cblxuICBpZiAod29ya0luUHJvZ3Jlc3NSb290ICE9PSBudWxsICYmIChpbmNsdWRlc05vbklkbGVXb3JrKHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcykgfHwgaW5jbHVkZXNOb25JZGxlV29yayh3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcykpKSB7XG4gICAgLy8gTWFyayB0aGUgY3VycmVudCByZW5kZXIgYXMgc3VzcGVuZGVkIHNvIHRoYXQgd2Ugc3dpdGNoIHRvIHdvcmtpbmcgb25cbiAgICAvLyB0aGUgdXBkYXRlcyB0aGF0IHdlcmUgc2tpcHBlZC4gVXN1YWxseSB3ZSBvbmx5IHN1c3BlbmQgYXQgdGhlIGVuZCBvZlxuICAgIC8vIHRoZSByZW5kZXIgcGhhc2UuXG4gICAgLy8gVE9ETzogV2Ugc2hvdWxkIHByb2JhYmx5IGFsd2F5cyBtYXJrIHRoZSByb290IGFzIHN1c3BlbmRlZCBpbW1lZGlhdGVseVxuICAgIC8vIChpbnNpZGUgdGhpcyBmdW5jdGlvbiksIHNpbmNlIGJ5IHN1c3BlbmRpbmcgYXQgdGhlIGVuZCBvZiB0aGUgcmVuZGVyXG4gICAgLy8gcGhhc2UgaW50cm9kdWNlcyBhIHBvdGVudGlhbCBtaXN0YWtlIHdoZXJlIHdlIHN1c3BlbmQgbGFuZXMgdGhhdCB3ZXJlXG4gICAgLy8gcGluZ2VkIG9yIHVwZGF0ZWQgd2hpbGUgd2Ugd2VyZSByZW5kZXJpbmcuXG4gICAgbWFya1Jvb3RTdXNwZW5kZWQkMSh3b3JrSW5Qcm9ncmVzc1Jvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTtcbiAgfVxufVxuZnVuY3Rpb24gcmVuZGVyRGlkRXJyb3IoZXJyb3IpIHtcbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgIT09IFJvb3RTdXNwZW5kZWRXaXRoRGVsYXkpIHtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdEVycm9yZWQ7XG4gIH1cblxuICBpZiAod29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9ycyA9PT0gbnVsbCkge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdENvbmN1cnJlbnRFcnJvcnMgPSBbZXJyb3JdO1xuICB9IGVsc2Uge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdENvbmN1cnJlbnRFcnJvcnMucHVzaChlcnJvcik7XG4gIH1cbn0gLy8gQ2FsbGVkIGR1cmluZyByZW5kZXIgdG8gZGV0ZXJtaW5lIGlmIGFueXRoaW5nIGhhcyBzdXNwZW5kZWQuXG4vLyBSZXR1cm5zIGZhbHNlIGlmIHdlJ3JlIG5vdCBzdXJlLlxuXG5mdW5jdGlvbiByZW5kZXJIYXNOb3RTdXNwZW5kZWRZZXQoKSB7XG4gIC8vIElmIHNvbWV0aGluZyBlcnJvcmVkIG9yIGNvbXBsZXRlZCwgd2UgY2FuJ3QgcmVhbGx5IGJlIHN1cmUsXG4gIC8vIHNvIHRob3NlIGFyZSBmYWxzZS5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RJblByb2dyZXNzO1xufVxuXG5mdW5jdGlvbiByZW5kZXJSb290U3luYyhyb290LCBsYW5lcykge1xuICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICBleGVjdXRpb25Db250ZXh0IHw9IFJlbmRlckNvbnRleHQ7XG4gIHZhciBwcmV2RGlzcGF0Y2hlciA9IHB1c2hEaXNwYXRjaGVyKCk7IC8vIElmIHRoZSByb290IG9yIGxhbmVzIGhhdmUgY2hhbmdlZCwgdGhyb3cgb3V0IHRoZSBleGlzdGluZyBzdGFja1xuICAvLyBhbmQgcHJlcGFyZSBhIGZyZXNoIG9uZS4gT3RoZXJ3aXNlIHdlJ2xsIGNvbnRpbnVlIHdoZXJlIHdlIGxlZnQgb2ZmLlxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3QgIT09IHJvb3QgfHwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgIT09IGxhbmVzKSB7XG4gICAge1xuICAgICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICAgIHZhciBtZW1vaXplZFVwZGF0ZXJzID0gcm9vdC5tZW1vaXplZFVwZGF0ZXJzO1xuXG4gICAgICAgIGlmIChtZW1vaXplZFVwZGF0ZXJzLnNpemUgPiAwKSB7XG4gICAgICAgICAgcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgICAgbWVtb2l6ZWRVcGRhdGVycy5jbGVhcigpO1xuICAgICAgICB9IC8vIEF0IHRoaXMgcG9pbnQsIG1vdmUgRmliZXJzIHRoYXQgc2NoZWR1bGVkIHRoZSB1cGNvbWluZyB3b3JrIGZyb20gdGhlIE1hcCB0byB0aGUgU2V0LlxuICAgICAgICAvLyBJZiB3ZSBiYWlsb3V0IG9uIHRoaXMgd29yaywgd2UnbGwgbW92ZSB0aGVtIGJhY2sgKGxpa2UgYWJvdmUpLlxuICAgICAgICAvLyBJdCdzIGltcG9ydGFudCB0byBtb3ZlIHRoZW0gbm93IGluIGNhc2UgdGhlIHdvcmsgc3Bhd25zIG1vcmUgd29yayBhdCB0aGUgc2FtZSBwcmlvcml0eSB3aXRoIGRpZmZlcmVudCB1cGRhdGVycy5cbiAgICAgICAgLy8gVGhhdCB3YXkgd2UgY2FuIGtlZXAgdGhlIGN1cnJlbnQgdXBkYXRlIGFuZCBmdXR1cmUgdXBkYXRlcyBzZXBhcmF0ZS5cblxuXG4gICAgICAgIG1vdmVQZW5kaW5nRmliZXJzVG9NZW1vaXplZChyb290LCBsYW5lcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyA9IGdldFRyYW5zaXRpb25zRm9yTGFuZXMoKTtcbiAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBsYW5lcyk7XG4gIH1cblxuICB7XG4gICAgbWFya1JlbmRlclN0YXJ0ZWQobGFuZXMpO1xuICB9XG5cbiAgZG8ge1xuICAgIHRyeSB7XG4gICAgICB3b3JrTG9vcFN5bmMoKTtcbiAgICAgIGJyZWFrO1xuICAgIH0gY2F0Y2ggKHRocm93blZhbHVlKSB7XG4gICAgICBoYW5kbGVFcnJvcihyb290LCB0aHJvd25WYWx1ZSk7XG4gICAgfVxuICB9IHdoaWxlICh0cnVlKTtcblxuICByZXNldENvbnRleHREZXBlbmRlbmNpZXMoKTtcbiAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0O1xuICBwb3BEaXNwYXRjaGVyKHByZXZEaXNwYXRjaGVyKTtcblxuICBpZiAod29ya0luUHJvZ3Jlc3MgIT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIGEgc3luYyByZW5kZXIsIHNvIHdlIHNob3VsZCBoYXZlIGZpbmlzaGVkIHRoZSB3aG9sZSB0cmVlLlxuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbW1pdCBhbiBpbmNvbXBsZXRlIHJvb3QuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhICcgKyAnYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrUmVuZGVyU3RvcHBlZCgpO1xuICB9IC8vIFNldCB0aGlzIHRvIG51bGwgdG8gaW5kaWNhdGUgdGhlcmUncyBubyBpbi1wcm9ncmVzcyByZW5kZXIuXG5cblxuICB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA9IE5vTGFuZXM7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzO1xufSAvLyBUaGUgd29yayBsb29wIGlzIGFuIGV4dHJlbWVseSBob3QgcGF0aC4gVGVsbCBDbG9zdXJlIG5vdCB0byBpbmxpbmUgaXQuXG5cbi8qKiBAbm9pbmxpbmUgKi9cblxuXG5mdW5jdGlvbiB3b3JrTG9vcFN5bmMoKSB7XG4gIC8vIEFscmVhZHkgdGltZWQgb3V0LCBzbyBwZXJmb3JtIHdvcmsgd2l0aG91dCBjaGVja2luZyBpZiB3ZSBuZWVkIHRvIHlpZWxkLlxuICB3aGlsZSAod29ya0luUHJvZ3Jlc3MgIT09IG51bGwpIHtcbiAgICBwZXJmb3JtVW5pdE9mV29yayh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVuZGVyUm9vdENvbmN1cnJlbnQocm9vdCwgbGFuZXMpIHtcbiAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgZXhlY3V0aW9uQ29udGV4dCB8PSBSZW5kZXJDb250ZXh0O1xuICB2YXIgcHJldkRpc3BhdGNoZXIgPSBwdXNoRGlzcGF0Y2hlcigpOyAvLyBJZiB0aGUgcm9vdCBvciBsYW5lcyBoYXZlIGNoYW5nZWQsIHRocm93IG91dCB0aGUgZXhpc3Rpbmcgc3RhY2tcbiAgLy8gYW5kIHByZXBhcmUgYSBmcmVzaCBvbmUuIE90aGVyd2lzZSB3ZSdsbCBjb250aW51ZSB3aGVyZSB3ZSBsZWZ0IG9mZi5cblxuICBpZiAod29ya0luUHJvZ3Jlc3NSb290ICE9PSByb290IHx8IHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzICE9PSBsYW5lcykge1xuICAgIHtcbiAgICAgIGlmIChpc0RldlRvb2xzUHJlc2VudCkge1xuICAgICAgICB2YXIgbWVtb2l6ZWRVcGRhdGVycyA9IHJvb3QubWVtb2l6ZWRVcGRhdGVycztcblxuICAgICAgICBpZiAobWVtb2l6ZWRVcGRhdGVycy5zaXplID4gMCkge1xuICAgICAgICAgIHJlc3RvcmVQZW5kaW5nVXBkYXRlcnMocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICAgICAgICAgIG1lbW9pemVkVXBkYXRlcnMuY2xlYXIoKTtcbiAgICAgICAgfSAvLyBBdCB0aGlzIHBvaW50LCBtb3ZlIEZpYmVycyB0aGF0IHNjaGVkdWxlZCB0aGUgdXBjb21pbmcgd29yayBmcm9tIHRoZSBNYXAgdG8gdGhlIFNldC5cbiAgICAgICAgLy8gSWYgd2UgYmFpbG91dCBvbiB0aGlzIHdvcmssIHdlJ2xsIG1vdmUgdGhlbSBiYWNrIChsaWtlIGFib3ZlKS5cbiAgICAgICAgLy8gSXQncyBpbXBvcnRhbnQgdG8gbW92ZSB0aGVtIG5vdyBpbiBjYXNlIHRoZSB3b3JrIHNwYXducyBtb3JlIHdvcmsgYXQgdGhlIHNhbWUgcHJpb3JpdHkgd2l0aCBkaWZmZXJlbnQgdXBkYXRlcnMuXG4gICAgICAgIC8vIFRoYXQgd2F5IHdlIGNhbiBrZWVwIHRoZSBjdXJyZW50IHVwZGF0ZSBhbmQgZnV0dXJlIHVwZGF0ZXMgc2VwYXJhdGUuXG5cblxuICAgICAgICBtb3ZlUGVuZGluZ0ZpYmVyc1RvTWVtb2l6ZWQocm9vdCwgbGFuZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMgPSBnZXRUcmFuc2l0aW9uc0ZvckxhbmVzKCk7XG4gICAgcmVzZXRSZW5kZXJUaW1lcigpO1xuICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIGxhbmVzKTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrUmVuZGVyU3RhcnRlZChsYW5lcyk7XG4gIH1cblxuICBkbyB7XG4gICAgdHJ5IHtcbiAgICAgIHdvcmtMb29wQ29uY3VycmVudCgpO1xuICAgICAgYnJlYWs7XG4gICAgfSBjYXRjaCAodGhyb3duVmFsdWUpIHtcbiAgICAgIGhhbmRsZUVycm9yKHJvb3QsIHRocm93blZhbHVlKTtcbiAgICB9XG4gIH0gd2hpbGUgKHRydWUpO1xuXG4gIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpO1xuICBwb3BEaXNwYXRjaGVyKHByZXZEaXNwYXRjaGVyKTtcbiAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0O1xuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzICE9PSBudWxsKSB7XG4gICAgLy8gU3RpbGwgd29yayByZW1haW5pbmcuXG4gICAge1xuICAgICAgbWFya1JlbmRlcllpZWxkZWQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUm9vdEluUHJvZ3Jlc3M7XG4gIH0gZWxzZSB7XG4gICAgLy8gQ29tcGxldGVkIHRoZSB0cmVlLlxuICAgIHtcbiAgICAgIG1hcmtSZW5kZXJTdG9wcGVkKCk7XG4gICAgfSAvLyBTZXQgdGhpcyB0byBudWxsIHRvIGluZGljYXRlIHRoZXJlJ3Mgbm8gaW4tcHJvZ3Jlc3MgcmVuZGVyLlxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gTm9MYW5lczsgLy8gUmV0dXJuIHRoZSBmaW5hbCBleGl0IHN0YXR1cy5cblxuICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzO1xuICB9XG59XG4vKiogQG5vaW5saW5lICovXG5cblxuZnVuY3Rpb24gd29ya0xvb3BDb25jdXJyZW50KCkge1xuICAvLyBQZXJmb3JtIHdvcmsgdW50aWwgU2NoZWR1bGVyIGFza3MgdXMgdG8geWllbGRcbiAgd2hpbGUgKHdvcmtJblByb2dyZXNzICE9PSBudWxsICYmICFzaG91bGRZaWVsZCgpKSB7XG4gICAgcGVyZm9ybVVuaXRPZldvcmsod29ya0luUHJvZ3Jlc3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBlcmZvcm1Vbml0T2ZXb3JrKHVuaXRPZldvcmspIHtcbiAgLy8gVGhlIGN1cnJlbnQsIGZsdXNoZWQsIHN0YXRlIG9mIHRoaXMgZmliZXIgaXMgdGhlIGFsdGVybmF0ZS4gSWRlYWxseVxuICAvLyBub3RoaW5nIHNob3VsZCByZWx5IG9uIHRoaXMsIGJ1dCByZWx5aW5nIG9uIGl0IGhlcmUgbWVhbnMgdGhhdCB3ZSBkb24ndFxuICAvLyBuZWVkIGFuIGFkZGl0aW9uYWwgZmllbGQgb24gdGhlIHdvcmsgaW4gcHJvZ3Jlc3MuXG4gIHZhciBjdXJyZW50ID0gdW5pdE9mV29yay5hbHRlcm5hdGU7XG4gIHNldEN1cnJlbnRGaWJlcih1bml0T2ZXb3JrKTtcbiAgdmFyIG5leHQ7XG5cbiAgaWYgKCAodW5pdE9mV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICBzdGFydFByb2ZpbGVyVGltZXIodW5pdE9mV29yayk7XG4gICAgbmV4dCA9IGJlZ2luV29yayQxKGN1cnJlbnQsIHVuaXRPZldvcmssIHN1YnRyZWVSZW5kZXJMYW5lcyk7XG4gICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREZWx0YSh1bml0T2ZXb3JrLCB0cnVlKTtcbiAgfSBlbHNlIHtcbiAgICBuZXh0ID0gYmVnaW5Xb3JrJDEoY3VycmVudCwgdW5pdE9mV29yaywgc3VidHJlZVJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gIHVuaXRPZldvcmsubWVtb2l6ZWRQcm9wcyA9IHVuaXRPZldvcmsucGVuZGluZ1Byb3BzO1xuXG4gIGlmIChuZXh0ID09PSBudWxsKSB7XG4gICAgLy8gSWYgdGhpcyBkb2Vzbid0IHNwYXduIG5ldyB3b3JrLCBjb21wbGV0ZSB0aGUgY3VycmVudCB3b3JrLlxuICAgIGNvbXBsZXRlVW5pdE9mV29yayh1bml0T2ZXb3JrKTtcbiAgfSBlbHNlIHtcbiAgICB3b3JrSW5Qcm9ncmVzcyA9IG5leHQ7XG4gIH1cblxuICBSZWFjdEN1cnJlbnRPd25lciQyLmN1cnJlbnQgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBjb21wbGV0ZVVuaXRPZldvcmsodW5pdE9mV29yaykge1xuICAvLyBBdHRlbXB0IHRvIGNvbXBsZXRlIHRoZSBjdXJyZW50IHVuaXQgb2Ygd29yaywgdGhlbiBtb3ZlIHRvIHRoZSBuZXh0XG4gIC8vIHNpYmxpbmcuIElmIHRoZXJlIGFyZSBubyBtb3JlIHNpYmxpbmdzLCByZXR1cm4gdG8gdGhlIHBhcmVudCBmaWJlci5cbiAgdmFyIGNvbXBsZXRlZFdvcmsgPSB1bml0T2ZXb3JrO1xuXG4gIGRvIHtcbiAgICAvLyBUaGUgY3VycmVudCwgZmx1c2hlZCwgc3RhdGUgb2YgdGhpcyBmaWJlciBpcyB0aGUgYWx0ZXJuYXRlLiBJZGVhbGx5XG4gICAgLy8gbm90aGluZyBzaG91bGQgcmVseSBvbiB0aGlzLCBidXQgcmVseWluZyBvbiBpdCBoZXJlIG1lYW5zIHRoYXQgd2UgZG9uJ3RcbiAgICAvLyBuZWVkIGFuIGFkZGl0aW9uYWwgZmllbGQgb24gdGhlIHdvcmsgaW4gcHJvZ3Jlc3MuXG4gICAgdmFyIGN1cnJlbnQgPSBjb21wbGV0ZWRXb3JrLmFsdGVybmF0ZTtcbiAgICB2YXIgcmV0dXJuRmliZXIgPSBjb21wbGV0ZWRXb3JrLnJldHVybjsgLy8gQ2hlY2sgaWYgdGhlIHdvcmsgY29tcGxldGVkIG9yIGlmIHNvbWV0aGluZyB0aHJldy5cblxuICAgIGlmICgoY29tcGxldGVkV29yay5mbGFncyAmIEluY29tcGxldGUpID09PSBOb0ZsYWdzKSB7XG4gICAgICBzZXRDdXJyZW50RmliZXIoY29tcGxldGVkV29yayk7XG4gICAgICB2YXIgbmV4dCA9IHZvaWQgMDtcblxuICAgICAgaWYgKCAoY29tcGxldGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpID09PSBOb01vZGUpIHtcbiAgICAgICAgbmV4dCA9IGNvbXBsZXRlV29yayhjdXJyZW50LCBjb21wbGV0ZWRXb3JrLCBzdWJ0cmVlUmVuZGVyTGFuZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhcnRQcm9maWxlclRpbWVyKGNvbXBsZXRlZFdvcmspO1xuICAgICAgICBuZXh0ID0gY29tcGxldGVXb3JrKGN1cnJlbnQsIGNvbXBsZXRlZFdvcmssIHN1YnRyZWVSZW5kZXJMYW5lcyk7IC8vIFVwZGF0ZSByZW5kZXIgZHVyYXRpb24gYXNzdW1pbmcgd2UgZGlkbid0IGVycm9yLlxuXG4gICAgICAgIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkRGVsdGEoY29tcGxldGVkV29yaywgZmFsc2UpO1xuICAgICAgfVxuXG4gICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuXG4gICAgICBpZiAobmV4dCAhPT0gbnVsbCkge1xuICAgICAgICAvLyBDb21wbGV0aW5nIHRoaXMgZmliZXIgc3Bhd25lZCBuZXcgd29yay4gV29yayBvbiB0aGF0IG5leHQuXG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gbmV4dDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGZpYmVyIGRpZCBub3QgY29tcGxldGUgYmVjYXVzZSBzb21ldGhpbmcgdGhyZXcuIFBvcCB2YWx1ZXMgb2ZmXG4gICAgICAvLyB0aGUgc3RhY2sgd2l0aG91dCBlbnRlcmluZyB0aGUgY29tcGxldGUgcGhhc2UuIElmIHRoaXMgaXMgYSBib3VuZGFyeSxcbiAgICAgIC8vIGNhcHR1cmUgdmFsdWVzIGlmIHBvc3NpYmxlLlxuICAgICAgdmFyIF9uZXh0ID0gdW53aW5kV29yayhjdXJyZW50LCBjb21wbGV0ZWRXb3JrKTsgLy8gQmVjYXVzZSB0aGlzIGZpYmVyIGRpZCBub3QgY29tcGxldGUsIGRvbid0IHJlc2V0IGl0cyBsYW5lcy5cblxuXG4gICAgICBpZiAoX25leHQgIT09IG51bGwpIHtcbiAgICAgICAgLy8gSWYgY29tcGxldGluZyB0aGlzIHdvcmsgc3Bhd25lZCBuZXcgd29yaywgZG8gdGhhdCBuZXh0LiBXZSdsbCBjb21lXG4gICAgICAgIC8vIGJhY2sgaGVyZSBhZ2Fpbi5cbiAgICAgICAgLy8gU2luY2Ugd2UncmUgcmVzdGFydGluZywgcmVtb3ZlIGFueXRoaW5nIHRoYXQgaXMgbm90IGEgaG9zdCBlZmZlY3RcbiAgICAgICAgLy8gZnJvbSB0aGUgZWZmZWN0IHRhZy5cbiAgICAgICAgX25leHQuZmxhZ3MgJj0gSG9zdEVmZmVjdE1hc2s7XG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gX25leHQ7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCAoY29tcGxldGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgLy8gUmVjb3JkIHRoZSByZW5kZXIgZHVyYXRpb24gZm9yIHRoZSBmaWJlciB0aGF0IGVycm9yZWQuXG4gICAgICAgIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkRGVsdGEoY29tcGxldGVkV29yaywgZmFsc2UpOyAvLyBJbmNsdWRlIHRoZSB0aW1lIHNwZW50IHdvcmtpbmcgb24gZmFpbGVkIGNoaWxkcmVuIGJlZm9yZSBjb250aW51aW5nLlxuXG4gICAgICAgIHZhciBhY3R1YWxEdXJhdGlvbiA9IGNvbXBsZXRlZFdvcmsuYWN0dWFsRHVyYXRpb247XG4gICAgICAgIHZhciBjaGlsZCA9IGNvbXBsZXRlZFdvcmsuY2hpbGQ7XG5cbiAgICAgICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgYWN0dWFsRHVyYXRpb24gKz0gY2hpbGQuYWN0dWFsRHVyYXRpb247XG4gICAgICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgY29tcGxldGVkV29yay5hY3R1YWxEdXJhdGlvbiA9IGFjdHVhbER1cmF0aW9uO1xuICAgICAgfVxuXG4gICAgICBpZiAocmV0dXJuRmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgLy8gTWFyayB0aGUgcGFyZW50IGZpYmVyIGFzIGluY29tcGxldGUgYW5kIGNsZWFyIGl0cyBzdWJ0cmVlIGZsYWdzLlxuICAgICAgICByZXR1cm5GaWJlci5mbGFncyB8PSBJbmNvbXBsZXRlO1xuICAgICAgICByZXR1cm5GaWJlci5zdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuICAgICAgICByZXR1cm5GaWJlci5kZWxldGlvbnMgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gV2UndmUgdW53b3VuZCBhbGwgdGhlIHdheSB0byB0aGUgcm9vdC5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3REaWROb3RDb21wbGV0ZTtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHNpYmxpbmdGaWJlciA9IGNvbXBsZXRlZFdvcmsuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nRmliZXIgIT09IG51bGwpIHtcbiAgICAgIC8vIElmIHRoZXJlIGlzIG1vcmUgd29yayB0byBkbyBpbiB0aGlzIHJldHVybkZpYmVyLCBkbyB0aGF0IG5leHQuXG4gICAgICB3b3JrSW5Qcm9ncmVzcyA9IHNpYmxpbmdGaWJlcjtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIE90aGVyd2lzZSwgcmV0dXJuIHRvIHRoZSBwYXJlbnRcblxuXG4gICAgY29tcGxldGVkV29yayA9IHJldHVybkZpYmVyOyAvLyBVcGRhdGUgdGhlIG5leHQgdGhpbmcgd2UncmUgd29ya2luZyBvbiBpbiBjYXNlIHNvbWV0aGluZyB0aHJvd3MuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcyA9IGNvbXBsZXRlZFdvcms7XG4gIH0gd2hpbGUgKGNvbXBsZXRlZFdvcmsgIT09IG51bGwpOyAvLyBXZSd2ZSByZWFjaGVkIHRoZSByb290LlxuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RJblByb2dyZXNzKSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RDb21wbGV0ZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0Um9vdChyb290LCByZWNvdmVyYWJsZUVycm9ycywgdHJhbnNpdGlvbnMpIHtcbiAgLy8gVE9ETzogVGhpcyBubyBsb25nZXIgbWFrZXMgYW55IHNlbnNlLiBXZSBhbHJlYWR5IHdyYXAgdGhlIG11dGF0aW9uIGFuZFxuICAvLyBsYXlvdXQgcGhhc2VzLiBTaG91bGQgYmUgYWJsZSB0byByZW1vdmUuXG4gIHZhciBwcmV2aW91c1VwZGF0ZUxhbmVQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb247XG5cbiAgdHJ5IHtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBudWxsO1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShEaXNjcmV0ZUV2ZW50UHJpb3JpdHkpO1xuICAgIGNvbW1pdFJvb3RJbXBsKHJvb3QsIHJlY292ZXJhYmxlRXJyb3JzLCB0cmFuc2l0aW9ucywgcHJldmlvdXNVcGRhdGVMYW5lUHJpb3JpdHkpO1xuICB9IGZpbmFsbHkge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1VwZGF0ZUxhbmVQcmlvcml0eSk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gY29tbWl0Um9vdEltcGwocm9vdCwgcmVjb3ZlcmFibGVFcnJvcnMsIHRyYW5zaXRpb25zLCByZW5kZXJQcmlvcml0eUxldmVsKSB7XG4gIGRvIHtcbiAgICAvLyBgZmx1c2hQYXNzaXZlRWZmZWN0c2Agd2lsbCBjYWxsIGBmbHVzaFN5bmNVcGRhdGVRdWV1ZWAgYXQgdGhlIGVuZCwgd2hpY2hcbiAgICAvLyBtZWFucyBgZmx1c2hQYXNzaXZlRWZmZWN0c2Agd2lsbCBzb21ldGltZXMgcmVzdWx0IGluIGFkZGl0aW9uYWxcbiAgICAvLyBwYXNzaXZlIGVmZmVjdHMuIFNvIHdlIG5lZWQgdG8ga2VlcCBmbHVzaGluZyBpbiBhIGxvb3AgdW50aWwgdGhlcmUgYXJlXG4gICAgLy8gbm8gbW9yZSBwZW5kaW5nIGVmZmVjdHMuXG4gICAgLy8gVE9ETzogTWlnaHQgYmUgYmV0dGVyIGlmIGBmbHVzaFBhc3NpdmVFZmZlY3RzYCBkaWQgbm90IGF1dG9tYXRpY2FsbHlcbiAgICAvLyBmbHVzaCBzeW5jaHJvbm91cyB3b3JrIGF0IHRoZSBlbmQsIHRvIGF2b2lkIGZhY3RvcmluZyBoYXphcmRzIGxpa2UgdGhpcy5cbiAgICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG4gIH0gd2hpbGUgKHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzICE9PSBudWxsKTtcblxuICBmbHVzaFJlbmRlclBoYXNlU3RyaWN0TW9kZVdhcm5pbmdzSW5ERVYoKTtcblxuICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbm90IGFscmVhZHkgYmUgd29ya2luZy4nKTtcbiAgfVxuXG4gIHZhciBmaW5pc2hlZFdvcmsgPSByb290LmZpbmlzaGVkV29yaztcbiAgdmFyIGxhbmVzID0gcm9vdC5maW5pc2hlZExhbmVzO1xuXG4gIHtcbiAgICBtYXJrQ29tbWl0U3RhcnRlZChsYW5lcyk7XG4gIH1cblxuICBpZiAoZmluaXNoZWRXb3JrID09PSBudWxsKSB7XG5cbiAgICB7XG4gICAgICBtYXJrQ29tbWl0U3RvcHBlZCgpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2Uge1xuICAgIHtcbiAgICAgIGlmIChsYW5lcyA9PT0gTm9MYW5lcykge1xuICAgICAgICBlcnJvcigncm9vdC5maW5pc2hlZExhbmVzIHNob3VsZCBub3QgYmUgZW1wdHkgZHVyaW5nIGEgY29tbWl0LiBUaGlzIGlzIGEgJyArICdidWcgaW4gUmVhY3QuJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcm9vdC5maW5pc2hlZFdvcmsgPSBudWxsO1xuICByb290LmZpbmlzaGVkTGFuZXMgPSBOb0xhbmVzO1xuXG4gIGlmIChmaW5pc2hlZFdvcmsgPT09IHJvb3QuY3VycmVudCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbW1pdCB0aGUgc2FtZSB0cmVlIGFzIGJlZm9yZS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5ICcgKyAnYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9IC8vIGNvbW1pdFJvb3QgbmV2ZXIgcmV0dXJucyBhIGNvbnRpbnVhdGlvbjsgaXQgYWx3YXlzIGZpbmlzaGVzIHN5bmNocm9ub3VzbHkuXG4gIC8vIFNvIHdlIGNhbiBjbGVhciB0aGVzZSBub3cgdG8gYWxsb3cgYSBuZXcgY2FsbGJhY2sgdG8gYmUgc2NoZWR1bGVkLlxuXG5cbiAgcm9vdC5jYWxsYmFja05vZGUgPSBudWxsO1xuICByb290LmNhbGxiYWNrUHJpb3JpdHkgPSBOb0xhbmU7IC8vIFVwZGF0ZSB0aGUgZmlyc3QgYW5kIGxhc3QgcGVuZGluZyB0aW1lcyBvbiB0aGlzIHJvb3QuIFRoZSBuZXcgZmlyc3RcbiAgLy8gcGVuZGluZyB0aW1lIGlzIHdoYXRldmVyIGlzIGxlZnQgb24gdGhlIHJvb3QgZmliZXIuXG5cbiAgdmFyIHJlbWFpbmluZ0xhbmVzID0gbWVyZ2VMYW5lcyhmaW5pc2hlZFdvcmsubGFuZXMsIGZpbmlzaGVkV29yay5jaGlsZExhbmVzKTtcbiAgbWFya1Jvb3RGaW5pc2hlZChyb290LCByZW1haW5pbmdMYW5lcyk7XG5cbiAgaWYgKHJvb3QgPT09IHdvcmtJblByb2dyZXNzUm9vdCkge1xuICAgIC8vIFdlIGNhbiByZXNldCB0aGVzZSBub3cgdGhhdCB0aGV5IGFyZSBmaW5pc2hlZC5cbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA9IE5vTGFuZXM7XG4gIH0gLy8gSWYgdGhlcmUgYXJlIHBlbmRpbmcgcGFzc2l2ZSBlZmZlY3RzLCBzY2hlZHVsZSBhIGNhbGxiYWNrIHRvIHByb2Nlc3MgdGhlbS5cbiAgLy8gRG8gdGhpcyBhcyBlYXJseSBhcyBwb3NzaWJsZSwgc28gaXQgaXMgcXVldWVkIGJlZm9yZSBhbnl0aGluZyBlbHNlIHRoYXRcbiAgLy8gbWlnaHQgZ2V0IHNjaGVkdWxlZCBpbiB0aGUgY29tbWl0IHBoYXNlLiAoU2VlICMxNjcxNC4pXG4gIC8vIFRPRE86IERlbGV0ZSBhbGwgb3RoZXIgcGxhY2VzIHRoYXQgc2NoZWR1bGUgdGhlIHBhc3NpdmUgZWZmZWN0IGNhbGxiYWNrXG4gIC8vIFRoZXkncmUgcmVkdW5kYW50LlxuXG5cbiAgaWYgKChmaW5pc2hlZFdvcmsuc3VidHJlZUZsYWdzICYgUGFzc2l2ZU1hc2spICE9PSBOb0ZsYWdzIHx8IChmaW5pc2hlZFdvcmsuZmxhZ3MgJiBQYXNzaXZlTWFzaykgIT09IE5vRmxhZ3MpIHtcbiAgICBpZiAoIXJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzKSB7XG4gICAgICByb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cyA9IHRydWU7XG4gICAgICAvLyB0byBzdG9yZSBpdCBpbiBwZW5kaW5nUGFzc2l2ZVRyYW5zaXRpb25zIHVudGlsIHRoZXkgZ2V0IHByb2Nlc3NlZFxuICAgICAgLy8gV2UgbmVlZCB0byBwYXNzIHRoaXMgdGhyb3VnaCBhcyBhbiBhcmd1bWVudCB0byBjb21taXRSb290XG4gICAgICAvLyBiZWNhdXNlIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMgbWlnaHQgaGF2ZSBjaGFuZ2VkIGJldHdlZW5cbiAgICAgIC8vIHRoZSBwcmV2aW91cyByZW5kZXIgYW5kIGNvbW1pdCBpZiB3ZSB0aHJvdHRsZSB0aGUgY29tbWl0XG4gICAgICAvLyB3aXRoIHNldFRpbWVvdXRcblxuICAgICAgcGVuZGluZ1Bhc3NpdmVUcmFuc2l0aW9ucyA9IHRyYW5zaXRpb25zO1xuICAgICAgc2NoZWR1bGVDYWxsYmFjayQxKE5vcm1hbFByaW9yaXR5LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTsgLy8gVGhpcyByZW5kZXIgdHJpZ2dlcmVkIHBhc3NpdmUgZWZmZWN0czogcmVsZWFzZSB0aGUgcm9vdCBjYWNoZSBwb29sXG4gICAgICAgIC8vICphZnRlciogcGFzc2l2ZSBlZmZlY3RzIGZpcmUgdG8gYXZvaWQgZnJlZWluZyBhIGNhY2hlIHBvb2wgdGhhdCBtYXlcbiAgICAgICAgLy8gYmUgcmVmZXJlbmNlZCBieSBhIG5vZGUgaW4gdGhlIHRyZWUgKEhvc3RSb290LCBDYWNoZSBib3VuZGFyeSBldGMpXG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9KTtcbiAgICB9XG4gIH0gLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBlZmZlY3RzIGluIHRoZSB3aG9sZSB0cmVlLlxuICAvLyBUT0RPOiBUaGlzIGlzIGxlZnQgb3ZlciBmcm9tIHRoZSBlZmZlY3QgbGlzdCBpbXBsZW1lbnRhdGlvbiwgd2hlcmUgd2UgaGFkXG4gIC8vIHRvIGNoZWNrIGZvciB0aGUgZXhpc3RlbmNlIG9mIGBmaXJzdEVmZmVjdGAgdG8gc2F0aXNmeSBGbG93LiBJIHRoaW5rIHRoZVxuICAvLyBvbmx5IG90aGVyIHJlYXNvbiB0aGlzIG9wdGltaXphdGlvbiBleGlzdHMgaXMgYmVjYXVzZSBpdCBhZmZlY3RzIHByb2ZpbGluZy5cbiAgLy8gUmVjb25zaWRlciB3aGV0aGVyIHRoaXMgaXMgbmVjZXNzYXJ5LlxuXG5cbiAgdmFyIHN1YnRyZWVIYXNFZmZlY3RzID0gKGZpbmlzaGVkV29yay5zdWJ0cmVlRmxhZ3MgJiAoQmVmb3JlTXV0YXRpb25NYXNrIHwgTXV0YXRpb25NYXNrIHwgTGF5b3V0TWFzayB8IFBhc3NpdmVNYXNrKSkgIT09IE5vRmxhZ3M7XG4gIHZhciByb290SGFzRWZmZWN0ID0gKGZpbmlzaGVkV29yay5mbGFncyAmIChCZWZvcmVNdXRhdGlvbk1hc2sgfCBNdXRhdGlvbk1hc2sgfCBMYXlvdXRNYXNrIHwgUGFzc2l2ZU1hc2spKSAhPT0gTm9GbGFncztcblxuICBpZiAoc3VidHJlZUhhc0VmZmVjdHMgfHwgcm9vdEhhc0VmZmVjdCkge1xuICAgIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbjtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBudWxsO1xuICAgIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7XG4gICAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgICBleGVjdXRpb25Db250ZXh0IHw9IENvbW1pdENvbnRleHQ7IC8vIFJlc2V0IHRoaXMgdG8gbnVsbCBiZWZvcmUgY2FsbGluZyBsaWZlY3ljbGVzXG5cbiAgICBSZWFjdEN1cnJlbnRPd25lciQyLmN1cnJlbnQgPSBudWxsOyAvLyBUaGUgY29tbWl0IHBoYXNlIGlzIGJyb2tlbiBpbnRvIHNldmVyYWwgc3ViLXBoYXNlcy4gV2UgZG8gYSBzZXBhcmF0ZSBwYXNzXG4gICAgLy8gb2YgdGhlIGVmZmVjdCBsaXN0IGZvciBlYWNoIHBoYXNlOiBhbGwgbXV0YXRpb24gZWZmZWN0cyBjb21lIGJlZm9yZSBhbGxcbiAgICAvLyBsYXlvdXQgZWZmZWN0cywgYW5kIHNvIG9uLlxuICAgIC8vIFRoZSBmaXJzdCBwaGFzZSBhIFwiYmVmb3JlIG11dGF0aW9uXCIgcGhhc2UuIFdlIHVzZSB0aGlzIHBoYXNlIHRvIHJlYWQgdGhlXG4gICAgLy8gc3RhdGUgb2YgdGhlIGhvc3QgdHJlZSByaWdodCBiZWZvcmUgd2UgbXV0YXRlIGl0LiBUaGlzIGlzIHdoZXJlXG4gICAgLy8gZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgaXMgY2FsbGVkLlxuXG4gICAgdmFyIHNob3VsZEZpcmVBZnRlckFjdGl2ZUluc3RhbmNlQmx1ciA9IGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuXG4gICAge1xuICAgICAgLy8gTWFyayB0aGUgY3VycmVudCBjb21taXQgdGltZSB0byBiZSBzaGFyZWQgYnkgYWxsIFByb2ZpbGVycyBpbiB0aGlzXG4gICAgICAvLyBiYXRjaC4gVGhpcyBlbmFibGVzIHRoZW0gdG8gYmUgZ3JvdXBlZCBsYXRlci5cbiAgICAgIHJlY29yZENvbW1pdFRpbWUoKTtcbiAgICB9XG5cblxuICAgIGNvbW1pdE11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmssIGxhbmVzKTtcblxuICAgIHJlc2V0QWZ0ZXJDb21taXQocm9vdC5jb250YWluZXJJbmZvKTsgLy8gVGhlIHdvcmstaW4tcHJvZ3Jlc3MgdHJlZSBpcyBub3cgdGhlIGN1cnJlbnQgdHJlZS4gVGhpcyBtdXN0IGNvbWUgYWZ0ZXJcbiAgICAvLyB0aGUgbXV0YXRpb24gcGhhc2UsIHNvIHRoYXQgdGhlIHByZXZpb3VzIHRyZWUgaXMgc3RpbGwgY3VycmVudCBkdXJpbmdcbiAgICAvLyBjb21wb25lbnRXaWxsVW5tb3VudCwgYnV0IGJlZm9yZSB0aGUgbGF5b3V0IHBoYXNlLCBzbyB0aGF0IHRoZSBmaW5pc2hlZFxuICAgIC8vIHdvcmsgaXMgY3VycmVudCBkdXJpbmcgY29tcG9uZW50RGlkTW91bnQvVXBkYXRlLlxuXG4gICAgcm9vdC5jdXJyZW50ID0gZmluaXNoZWRXb3JrOyAvLyBUaGUgbmV4dCBwaGFzZSBpcyB0aGUgbGF5b3V0IHBoYXNlLCB3aGVyZSB3ZSBjYWxsIGVmZmVjdHMgdGhhdCByZWFkXG5cbiAgICB7XG4gICAgICBtYXJrTGF5b3V0RWZmZWN0c1N0YXJ0ZWQobGFuZXMpO1xuICAgIH1cblxuICAgIGNvbW1pdExheW91dEVmZmVjdHMoZmluaXNoZWRXb3JrLCByb290LCBsYW5lcyk7XG5cbiAgICB7XG4gICAgICBtYXJrTGF5b3V0RWZmZWN0c1N0b3BwZWQoKTtcbiAgICB9XG4gICAgLy8gb3Bwb3J0dW5pdHkgdG8gcGFpbnQuXG5cblxuICAgIHJlcXVlc3RQYWludCgpO1xuICAgIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDsgLy8gUmVzZXQgdGhlIHByaW9yaXR5IHRvIHRoZSBwcmV2aW91cyBub24tc3luYyB2YWx1ZS5cblxuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5KTtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcbiAgfSBlbHNlIHtcbiAgICAvLyBObyBlZmZlY3RzLlxuICAgIHJvb3QuY3VycmVudCA9IGZpbmlzaGVkV29yazsgLy8gTWVhc3VyZSB0aGVzZSBhbnl3YXkgc28gdGhlIGZsYW1lZ3JhcGggZXhwbGljaXRseSBzaG93cyB0aGF0IHRoZXJlIHdlcmVcbiAgICAvLyBubyBlZmZlY3RzLlxuICAgIC8vIFRPRE86IE1heWJlIHRoZXJlJ3MgYSBiZXR0ZXIgd2F5IHRvIHJlcG9ydCB0aGlzLlxuXG4gICAge1xuICAgICAgcmVjb3JkQ29tbWl0VGltZSgpO1xuICAgIH1cbiAgfVxuXG4gIHZhciByb290RGlkSGF2ZVBhc3NpdmVFZmZlY3RzID0gcm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHM7XG5cbiAgaWYgKHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzKSB7XG4gICAgLy8gVGhpcyBjb21taXQgaGFzIHBhc3NpdmUgZWZmZWN0cy4gU3Rhc2ggYSByZWZlcmVuY2UgdG8gdGhlbS4gQnV0IGRvbid0XG4gICAgLy8gc2NoZWR1bGUgYSBjYWxsYmFjayB1bnRpbCBhZnRlciBmbHVzaGluZyBsYXlvdXQgd29yay5cbiAgICByb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xuICAgIHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzID0gcm9vdDtcbiAgICBwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcyA9IGxhbmVzO1xuICB9IGVsc2Uge1xuXG4gICAge1xuICAgICAgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMDtcbiAgICAgIHJvb3RXaXRoUGFzc2l2ZU5lc3RlZFVwZGF0ZXMgPSBudWxsO1xuICAgIH1cbiAgfSAvLyBSZWFkIHRoaXMgYWdhaW4sIHNpbmNlIGFuIGVmZmVjdCBtaWdodCBoYXZlIHVwZGF0ZWQgaXRcblxuXG4gIHJlbWFpbmluZ0xhbmVzID0gcm9vdC5wZW5kaW5nTGFuZXM7IC8vIENoZWNrIGlmIHRoZXJlJ3MgcmVtYWluaW5nIHdvcmsgb24gdGhpcyByb290XG4gIC8vIFRPRE86IFRoaXMgaXMgcGFydCBvZiB0aGUgYGNvbXBvbmVudERpZENhdGNoYCBpbXBsZW1lbnRhdGlvbi4gSXRzIHB1cnBvc2VcbiAgLy8gaXMgdG8gZGV0ZWN0IHdoZXRoZXIgc29tZXRoaW5nIG1pZ2h0IGhhdmUgY2FsbGVkIHNldFN0YXRlIGluc2lkZVxuICAvLyBgY29tcG9uZW50RGlkQ2F0Y2hgLiBUaGUgbWVjaGFuaXNtIGlzIGtub3duIHRvIGJlIGZsYXdlZCBiZWNhdXNlIGBzZXRTdGF0ZWBcbiAgLy8gaW5zaWRlIGBjb21wb25lbnREaWRDYXRjaGAgaXMgaXRzZWxmIGZsYXdlZCBcdTIwMTQgdGhhdCdzIHdoeSB3ZSByZWNvbW1lbmRcbiAgLy8gYGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcmAgaW5zdGVhZC4gSG93ZXZlciwgaXQgY291bGQgYmUgaW1wcm92ZWQgYnlcbiAgLy8gY2hlY2tpbmcgaWYgcmVtYWluaW5nTGFuZXMgaW5jbHVkZXMgU3luYyB3b3JrLCBpbnN0ZWFkIG9mIHdoZXRoZXIgdGhlcmUnc1xuICAvLyBhbnkgd29yayByZW1haW5pbmcgYXQgYWxsICh3aGljaCB3b3VsZCBhbHNvIGluY2x1ZGUgc3R1ZmYgbGlrZSBTdXNwZW5zZVxuICAvLyByZXRyaWVzIG9yIHRyYW5zaXRpb25zKS4gSXQncyBiZWVuIGxpa2UgdGhpcyBmb3IgYSB3aGlsZSwgdGhvdWdoLCBzbyBmaXhpbmdcbiAgLy8gaXQgcHJvYmFibHkgaXNuJ3QgdGhhdCB1cmdlbnQuXG5cbiAgaWYgKHJlbWFpbmluZ0xhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgLy8gSWYgdGhlcmUncyBubyByZW1haW5pbmcgd29yaywgd2UgY2FuIGNsZWFyIHRoZSBzZXQgb2YgYWxyZWFkeSBmYWlsZWRcbiAgICAvLyBlcnJvciBib3VuZGFyaWVzLlxuICAgIGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkID0gbnVsbDtcbiAgfVxuXG4gIHtcbiAgICBpZiAoIXJvb3REaWRIYXZlUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAgIGNvbW1pdERvdWJsZUludm9rZUVmZmVjdHNJbkRFVihyb290LmN1cnJlbnQsIGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBvbkNvbW1pdFJvb3QoZmluaXNoZWRXb3JrLnN0YXRlTm9kZSwgcmVuZGVyUHJpb3JpdHlMZXZlbCk7XG5cbiAge1xuICAgIGlmIChpc0RldlRvb2xzUHJlc2VudCkge1xuICAgICAgcm9vdC5tZW1vaXplZFVwZGF0ZXJzLmNsZWFyKCk7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIG9uQ29tbWl0Um9vdCQxKCk7XG4gIH0gLy8gQWx3YXlzIGNhbGwgdGhpcyBiZWZvcmUgZXhpdGluZyBgY29tbWl0Um9vdGAsIHRvIGVuc3VyZSB0aGF0IGFueVxuICAvLyBhZGRpdGlvbmFsIHdvcmsgb24gdGhpcyByb290IGlzIHNjaGVkdWxlZC5cblxuXG4gIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG5cbiAgaWYgKHJlY292ZXJhYmxlRXJyb3JzICE9PSBudWxsKSB7XG4gICAgLy8gVGhlcmUgd2VyZSBlcnJvcnMgZHVyaW5nIHRoaXMgcmVuZGVyLCBidXQgcmVjb3ZlcmVkIGZyb20gdGhlbSB3aXRob3V0XG4gICAgLy8gbmVlZGluZyB0byBzdXJmYWNlIGl0IHRvIHRoZSBVSS4gV2UgbG9nIHRoZW0gaGVyZS5cbiAgICB2YXIgb25SZWNvdmVyYWJsZUVycm9yID0gcm9vdC5vblJlY292ZXJhYmxlRXJyb3I7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlY292ZXJhYmxlRXJyb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcmVjb3ZlcmFibGVFcnJvciA9IHJlY292ZXJhYmxlRXJyb3JzW2ldO1xuICAgICAgdmFyIGNvbXBvbmVudFN0YWNrID0gcmVjb3ZlcmFibGVFcnJvci5zdGFjaztcbiAgICAgIHZhciBkaWdlc3QgPSByZWNvdmVyYWJsZUVycm9yLmRpZ2VzdDtcbiAgICAgIG9uUmVjb3ZlcmFibGVFcnJvcihyZWNvdmVyYWJsZUVycm9yLnZhbHVlLCB7XG4gICAgICAgIGNvbXBvbmVudFN0YWNrOiBjb21wb25lbnRTdGFjayxcbiAgICAgICAgZGlnZXN0OiBkaWdlc3RcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGlmIChoYXNVbmNhdWdodEVycm9yKSB7XG4gICAgaGFzVW5jYXVnaHRFcnJvciA9IGZhbHNlO1xuICAgIHZhciBlcnJvciQxID0gZmlyc3RVbmNhdWdodEVycm9yO1xuICAgIGZpcnN0VW5jYXVnaHRFcnJvciA9IG51bGw7XG4gICAgdGhyb3cgZXJyb3IkMTtcbiAgfSAvLyBJZiB0aGUgcGFzc2l2ZSBlZmZlY3RzIGFyZSB0aGUgcmVzdWx0IG9mIGEgZGlzY3JldGUgcmVuZGVyLCBmbHVzaCB0aGVtXG4gIC8vIHN5bmNocm9ub3VzbHkgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCB0YXNrIHNvIHRoYXQgdGhlIHJlc3VsdCBpc1xuICAvLyBpbW1lZGlhdGVseSBvYnNlcnZhYmxlLiBPdGhlcndpc2UsIHdlIGFzc3VtZSB0aGF0IHRoZXkgYXJlIG5vdFxuICAvLyBvcmRlci1kZXBlbmRlbnQgYW5kIGRvIG5vdCBuZWVkIHRvIGJlIG9ic2VydmVkIGJ5IGV4dGVybmFsIHN5c3RlbXMsIHNvIHdlXG4gIC8vIGNhbiB3YWl0IHVudGlsIGFmdGVyIHBhaW50LlxuICAvLyBUT0RPOiBXZSBjYW4gb3B0aW1pemUgdGhpcyBieSBub3Qgc2NoZWR1bGluZyB0aGUgY2FsbGJhY2sgZWFybGllci4gU2luY2Ugd2VcbiAgLy8gY3VycmVudGx5IHNjaGVkdWxlIHRoZSBjYWxsYmFjayBpbiBtdWx0aXBsZSBwbGFjZXMsIHdpbGwgd2FpdCB1bnRpbCB0aG9zZVxuICAvLyBhcmUgY29uc29saWRhdGVkLlxuXG5cbiAgaWYgKGluY2x1ZGVzU29tZUxhbmUocGVuZGluZ1Bhc3NpdmVFZmZlY3RzTGFuZXMsIFN5bmNMYW5lKSAmJiByb290LnRhZyAhPT0gTGVnYWN5Um9vdCkge1xuICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgfSAvLyBSZWFkIHRoaXMgYWdhaW4sIHNpbmNlIGEgcGFzc2l2ZSBlZmZlY3QgbWlnaHQgaGF2ZSB1cGRhdGVkIGl0XG5cblxuICByZW1haW5pbmdMYW5lcyA9IHJvb3QucGVuZGluZ0xhbmVzO1xuXG4gIGlmIChpbmNsdWRlc1NvbWVMYW5lKHJlbWFpbmluZ0xhbmVzLCBTeW5jTGFuZSkpIHtcbiAgICB7XG4gICAgICBtYXJrTmVzdGVkVXBkYXRlU2NoZWR1bGVkKCk7XG4gICAgfSAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSByb290IHN5bmNocm9ub3VzbHkgcmUtcmVuZGVycyB3aXRob3V0XG4gICAgLy8gZmluaXNoaW5nLiBJZiB0aGVyZSBhcmUgdG9vIG1hbnksIGl0IGluZGljYXRlcyBhbiBpbmZpbml0ZSB1cGRhdGUgbG9vcC5cblxuXG4gICAgaWYgKHJvb3QgPT09IHJvb3RXaXRoTmVzdGVkVXBkYXRlcykge1xuICAgICAgbmVzdGVkVXBkYXRlQ291bnQrKztcbiAgICB9IGVsc2Uge1xuICAgICAgbmVzdGVkVXBkYXRlQ291bnQgPSAwO1xuICAgICAgcm9vdFdpdGhOZXN0ZWRVcGRhdGVzID0gcm9vdDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbmVzdGVkVXBkYXRlQ291bnQgPSAwO1xuICB9IC8vIElmIGxheW91dCB3b3JrIHdhcyBzY2hlZHVsZWQsIGZsdXNoIGl0IG5vdy5cblxuXG4gIGZsdXNoU3luY0NhbGxiYWNrcygpO1xuXG4gIHtcbiAgICBtYXJrQ29tbWl0U3RvcHBlZCgpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKSB7XG4gIC8vIFJldHVybnMgd2hldGhlciBwYXNzaXZlIGVmZmVjdHMgd2VyZSBmbHVzaGVkLlxuICAvLyBUT0RPOiBDb21iaW5lIHRoaXMgY2hlY2sgd2l0aCB0aGUgb25lIGluIGZsdXNoUGFzc2l2ZUVGZmVjdHNJbXBsLiBXZSBzaG91bGRcbiAgLy8gcHJvYmFibHkganVzdCBjb21iaW5lIHRoZSB0d28gZnVuY3Rpb25zLiBJIGJlbGlldmUgdGhleSB3ZXJlIG9ubHkgc2VwYXJhdGVcbiAgLy8gaW4gdGhlIGZpcnN0IHBsYWNlIGJlY2F1c2Ugd2UgdXNlZCB0byB3cmFwIGl0IHdpdGhcbiAgLy8gYFNjaGVkdWxlci5ydW5XaXRoUHJpb3JpdHlgLCB3aGljaCBhY2NlcHRzIGEgZnVuY3Rpb24uIEJ1dCBub3cgd2UgdHJhY2sgdGhlXG4gIC8vIHByaW9yaXR5IHdpdGhpbiBSZWFjdCBpdHNlbGYsIHNvIHdlIGNhbiBtdXRhdGUgdGhlIHZhcmlhYmxlIGRpcmVjdGx5LlxuICBpZiAocm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgIT09IG51bGwpIHtcbiAgICB2YXIgcmVuZGVyUHJpb3JpdHkgPSBsYW5lc1RvRXZlbnRQcmlvcml0eShwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcyk7XG4gICAgdmFyIHByaW9yaXR5ID0gbG93ZXJFdmVudFByaW9yaXR5KERlZmF1bHRFdmVudFByaW9yaXR5LCByZW5kZXJQcmlvcml0eSk7XG4gICAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uO1xuICAgIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG5cbiAgICB0cnkge1xuICAgICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gbnVsbDtcbiAgICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmlvcml0eSk7XG4gICAgICByZXR1cm4gZmx1c2hQYXNzaXZlRWZmZWN0c0ltcGwoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHkpO1xuICAgICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247IC8vIE9uY2UgcGFzc2l2ZSBlZmZlY3RzIGhhdmUgcnVuIGZvciB0aGUgdHJlZSAtIGdpdmluZyBjb21wb25lbnRzIGFcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBlbnF1ZXVlUGVuZGluZ1Bhc3NpdmVQcm9maWxlckVmZmVjdChmaWJlcikge1xuICB7XG4gICAgcGVuZGluZ1Bhc3NpdmVQcm9maWxlckVmZmVjdHMucHVzaChmaWJlcik7XG5cbiAgICBpZiAoIXJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzKSB7XG4gICAgICByb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cyA9IHRydWU7XG4gICAgICBzY2hlZHVsZUNhbGxiYWNrJDEoTm9ybWFsUHJpb3JpdHksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmbHVzaFBhc3NpdmVFZmZlY3RzSW1wbCgpIHtcbiAgaWYgKHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IC8vIENhY2hlIGFuZCBjbGVhciB0aGUgdHJhbnNpdGlvbnMgZmxhZ1xuXG5cbiAgdmFyIHRyYW5zaXRpb25zID0gcGVuZGluZ1Bhc3NpdmVUcmFuc2l0aW9ucztcbiAgcGVuZGluZ1Bhc3NpdmVUcmFuc2l0aW9ucyA9IG51bGw7XG4gIHZhciByb290ID0gcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHM7XG4gIHZhciBsYW5lcyA9IHBlbmRpbmdQYXNzaXZlRWZmZWN0c0xhbmVzO1xuICByb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cyA9IG51bGw7IC8vIFRPRE86IFRoaXMgaXMgc29tZXRpbWVzIG91dCBvZiBzeW5jIHdpdGggcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMuXG4gIC8vIEZpZ3VyZSBvdXQgd2h5IGFuZCBmaXggaXQuIEl0J3Mgbm90IGNhdXNpbmcgYW55IGtub3duIGlzc3VlcyAocHJvYmFibHlcbiAgLy8gYmVjYXVzZSBpdCdzIG9ubHkgdXNlZCBmb3IgcHJvZmlsaW5nKSwgYnV0IGl0J3MgYSByZWZhY3RvciBoYXphcmQuXG5cbiAgcGVuZGluZ1Bhc3NpdmVFZmZlY3RzTGFuZXMgPSBOb0xhbmVzO1xuXG4gIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpICE9PSBOb0NvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBmbHVzaCBwYXNzaXZlIGVmZmVjdHMgd2hpbGUgYWxyZWFkeSByZW5kZXJpbmcuJyk7XG4gIH1cblxuICB7XG4gICAgaXNGbHVzaGluZ1Bhc3NpdmVFZmZlY3RzID0gdHJ1ZTtcbiAgICBkaWRTY2hlZHVsZVVwZGF0ZUR1cmluZ1Bhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG4gIH1cblxuICB7XG4gICAgbWFya1Bhc3NpdmVFZmZlY3RzU3RhcnRlZChsYW5lcyk7XG4gIH1cblxuICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICBleGVjdXRpb25Db250ZXh0IHw9IENvbW1pdENvbnRleHQ7XG4gIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0cyhyb290LmN1cnJlbnQpO1xuICBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzKHJvb3QsIHJvb3QuY3VycmVudCwgbGFuZXMsIHRyYW5zaXRpb25zKTsgLy8gVE9ETzogTW92ZSB0byBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzXG5cbiAge1xuICAgIHZhciBwcm9maWxlckVmZmVjdHMgPSBwZW5kaW5nUGFzc2l2ZVByb2ZpbGVyRWZmZWN0cztcbiAgICBwZW5kaW5nUGFzc2l2ZVByb2ZpbGVyRWZmZWN0cyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9maWxlckVmZmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBfZmliZXIgPSBwcm9maWxlckVmZmVjdHNbaV07XG4gICAgICBjb21taXRQYXNzaXZlRWZmZWN0RHVyYXRpb25zKHJvb3QsIF9maWJlcik7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIG1hcmtQYXNzaXZlRWZmZWN0c1N0b3BwZWQoKTtcbiAgfVxuXG4gIHtcbiAgICBjb21taXREb3VibGVJbnZva2VFZmZlY3RzSW5ERVYocm9vdC5jdXJyZW50LCB0cnVlKTtcbiAgfVxuXG4gIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDtcbiAgZmx1c2hTeW5jQ2FsbGJhY2tzKCk7XG5cbiAge1xuICAgIC8vIElmIGFkZGl0aW9uYWwgcGFzc2l2ZSBlZmZlY3RzIHdlcmUgc2NoZWR1bGVkLCBpbmNyZW1lbnQgYSBjb3VudGVyLiBJZiB0aGlzXG4gICAgLy8gZXhjZWVkcyB0aGUgbGltaXQsIHdlJ2xsIGZpcmUgYSB3YXJuaW5nLlxuICAgIGlmIChkaWRTY2hlZHVsZVVwZGF0ZUR1cmluZ1Bhc3NpdmVFZmZlY3RzKSB7XG4gICAgICBpZiAocm9vdCA9PT0gcm9vdFdpdGhQYXNzaXZlTmVzdGVkVXBkYXRlcykge1xuICAgICAgICBuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA9IDA7XG4gICAgICAgIHJvb3RXaXRoUGFzc2l2ZU5lc3RlZFVwZGF0ZXMgPSByb290O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQgPSAwO1xuICAgIH1cblxuICAgIGlzRmx1c2hpbmdQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xuICAgIGRpZFNjaGVkdWxlVXBkYXRlRHVyaW5nUGFzc2l2ZUVmZmVjdHMgPSBmYWxzZTtcbiAgfSAvLyBUT0RPOiBNb3ZlIHRvIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHNcblxuXG4gIG9uUG9zdENvbW1pdFJvb3Qocm9vdCk7XG5cbiAge1xuICAgIHZhciBzdGF0ZU5vZGUgPSByb290LmN1cnJlbnQuc3RhdGVOb2RlO1xuICAgIHN0YXRlTm9kZS5lZmZlY3REdXJhdGlvbiA9IDA7XG4gICAgc3RhdGVOb2RlLnBhc3NpdmVFZmZlY3REdXJhdGlvbiA9IDA7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNBbHJlYWR5RmFpbGVkTGVnYWN5RXJyb3JCb3VuZGFyeShpbnN0YW5jZSkge1xuICByZXR1cm4gbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgIT09IG51bGwgJiYgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQuaGFzKGluc3RhbmNlKTtcbn1cbmZ1bmN0aW9uIG1hcmtMZWdhY3lFcnJvckJvdW5kYXJ5QXNGYWlsZWQoaW5zdGFuY2UpIHtcbiAgaWYgKGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkID09PSBudWxsKSB7XG4gICAgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPSBuZXcgU2V0KFtpbnN0YW5jZV0pO1xuICB9IGVsc2Uge1xuICAgIGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkLmFkZChpbnN0YW5jZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJlcGFyZVRvVGhyb3dVbmNhdWdodEVycm9yKGVycm9yKSB7XG4gIGlmICghaGFzVW5jYXVnaHRFcnJvcikge1xuICAgIGhhc1VuY2F1Z2h0RXJyb3IgPSB0cnVlO1xuICAgIGZpcnN0VW5jYXVnaHRFcnJvciA9IGVycm9yO1xuICB9XG59XG5cbnZhciBvblVuY2F1Z2h0RXJyb3IgPSBwcmVwYXJlVG9UaHJvd1VuY2F1Z2h0RXJyb3I7XG5cbmZ1bmN0aW9uIGNhcHR1cmVDb21taXRQaGFzZUVycm9yT25Sb290KHJvb3RGaWJlciwgc291cmNlRmliZXIsIGVycm9yKSB7XG4gIHZhciBlcnJvckluZm8gPSBjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcihlcnJvciwgc291cmNlRmliZXIpO1xuICB2YXIgdXBkYXRlID0gY3JlYXRlUm9vdEVycm9yVXBkYXRlKHJvb3RGaWJlciwgZXJyb3JJbmZvLCBTeW5jTGFuZSk7XG4gIHZhciByb290ID0gZW5xdWV1ZVVwZGF0ZShyb290RmliZXIsIHVwZGF0ZSwgU3luY0xhbmUpO1xuICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuXG4gIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgbWFya1Jvb3RVcGRhdGVkKHJvb3QsIFN5bmNMYW5lLCBldmVudFRpbWUpO1xuICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBldmVudFRpbWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKHNvdXJjZUZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvciQxKSB7XG4gIHtcbiAgICByZXBvcnRVbmNhdWdodEVycm9ySW5ERVYoZXJyb3IkMSk7XG4gICAgc2V0SXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0KGZhbHNlKTtcbiAgfVxuXG4gIGlmIChzb3VyY2VGaWJlci50YWcgPT09IEhvc3RSb290KSB7XG4gICAgLy8gRXJyb3Igd2FzIHRocm93biBhdCB0aGUgcm9vdC4gVGhlcmUgaXMgbm8gcGFyZW50LCBzbyB0aGUgcm9vdFxuICAgIC8vIGl0c2VsZiBzaG91bGQgY2FwdHVyZSBpdC5cbiAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvck9uUm9vdChzb3VyY2VGaWJlciwgc291cmNlRmliZXIsIGVycm9yJDEpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBmaWJlciA9IG51bGw7XG5cbiAge1xuICAgIGZpYmVyID0gbmVhcmVzdE1vdW50ZWRBbmNlc3RvcjtcbiAgfVxuXG4gIHdoaWxlIChmaWJlciAhPT0gbnVsbCkge1xuICAgIGlmIChmaWJlci50YWcgPT09IEhvc3RSb290KSB7XG4gICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvck9uUm9vdChmaWJlciwgc291cmNlRmliZXIsIGVycm9yJDEpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoZmliZXIudGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgdmFyIGN0b3IgPSBmaWJlci50eXBlO1xuICAgICAgdmFyIGluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICBpZiAodHlwZW9mIGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRDYXRjaCA9PT0gJ2Z1bmN0aW9uJyAmJiAhaXNBbHJlYWR5RmFpbGVkTGVnYWN5RXJyb3JCb3VuZGFyeShpbnN0YW5jZSkpIHtcbiAgICAgICAgdmFyIGVycm9ySW5mbyA9IGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKGVycm9yJDEsIHNvdXJjZUZpYmVyKTtcbiAgICAgICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZUNsYXNzRXJyb3JVcGRhdGUoZmliZXIsIGVycm9ySW5mbywgU3luY0xhbmUpO1xuICAgICAgICB2YXIgcm9vdCA9IGVucXVldWVVcGRhdGUoZmliZXIsIHVwZGF0ZSwgU3luY0xhbmUpO1xuICAgICAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuXG4gICAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgICAgbWFya1Jvb3RVcGRhdGVkKHJvb3QsIFN5bmNMYW5lLCBldmVudFRpbWUpO1xuICAgICAgICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBldmVudFRpbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZpYmVyID0gZmliZXIucmV0dXJuO1xuICB9XG5cbiAge1xuICAgIC8vIFRPRE86IFVudGlsIHdlIHJlLWxhbmQgc2tpcFVubW91bnRlZEJvdW5kYXJpZXMgKHNlZSAjMjAxNDcpLCB0aGlzIHdhcm5pbmdcbiAgICAvLyB3aWxsIGZpcmUgZm9yIGVycm9ycyB0aGF0IGFyZSB0aHJvd24gYnkgZGVzdHJveSBmdW5jdGlvbnMgaW5zaWRlIGRlbGV0ZWRcbiAgICAvLyB0cmVlcy4gV2hhdCBpdCBzaG91bGQgaW5zdGVhZCBkbyBpcyBwcm9wYWdhdGUgdGhlIGVycm9yIHRvIHRoZSBwYXJlbnQgb2ZcbiAgICAvLyB0aGUgZGVsZXRlZCB0cmVlLiBJbiB0aGUgbWVhbnRpbWUsIGRvIG5vdCBhZGQgdGhpcyB3YXJuaW5nIHRvIHRoZVxuICAgIC8vIGFsbG93bGlzdDsgdGhpcyBpcyBvbmx5IGZvciBvdXIgaW50ZXJuYWwgdXNlLlxuICAgIGVycm9yKCdJbnRlcm5hbCBSZWFjdCBlcnJvcjogQXR0ZW1wdGVkIHRvIGNhcHR1cmUgYSBjb21taXQgcGhhc2UgZXJyb3IgJyArICdpbnNpZGUgYSBkZXRhY2hlZCB0cmVlLiBUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiBSZWFjdC4gTGlrZWx5ICcgKyAnY2F1c2VzIGluY2x1ZGUgZGVsZXRpbmcgdGhlIHNhbWUgZmliZXIgbW9yZSB0aGFuIG9uY2UsIGNvbW1pdHRpbmcgYW4gJyArICdhbHJlYWR5LWZpbmlzaGVkIHRyZWUsIG9yIGFuIGluY29uc2lzdGVudCByZXR1cm4gcG9pbnRlci5cXG5cXG4nICsgJ0Vycm9yIG1lc3NhZ2U6XFxuXFxuJXMnLCBlcnJvciQxKTtcbiAgfVxufVxuZnVuY3Rpb24gcGluZ1N1c3BlbmRlZFJvb3Qocm9vdCwgd2FrZWFibGUsIHBpbmdlZExhbmVzKSB7XG4gIHZhciBwaW5nQ2FjaGUgPSByb290LnBpbmdDYWNoZTtcblxuICBpZiAocGluZ0NhY2hlICE9PSBudWxsKSB7XG4gICAgLy8gVGhlIHdha2VhYmxlIHJlc29sdmVkLCBzbyB3ZSBubyBsb25nZXIgbmVlZCB0byBtZW1vaXplLCBiZWNhdXNlIGl0IHdpbGxcbiAgICAvLyBuZXZlciBiZSB0aHJvd24gYWdhaW4uXG4gICAgcGluZ0NhY2hlLmRlbGV0ZSh3YWtlYWJsZSk7XG4gIH1cblxuICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICBtYXJrUm9vdFBpbmdlZChyb290LCBwaW5nZWRMYW5lcyk7XG4gIHdhcm5JZlN1c3BlbnNlUmVzb2x1dGlvbk5vdFdyYXBwZWRXaXRoQWN0REVWKHJvb3QpO1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3QgPT09IHJvb3QgJiYgaXNTdWJzZXRPZkxhbmVzKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzLCBwaW5nZWRMYW5lcykpIHtcbiAgICAvLyBSZWNlaXZlZCBhIHBpbmcgYXQgdGhlIHNhbWUgcHJpb3JpdHkgbGV2ZWwgYXQgd2hpY2ggd2UncmUgY3VycmVudGx5XG4gICAgLy8gcmVuZGVyaW5nLiBXZSBtaWdodCB3YW50IHRvIHJlc3RhcnQgdGhpcyByZW5kZXIuIFRoaXMgc2hvdWxkIG1pcnJvclxuICAgIC8vIHRoZSBsb2dpYyBvZiB3aGV0aGVyIG9yIG5vdCBhIHJvb3Qgc3VzcGVuZHMgb25jZSBpdCBjb21wbGV0ZXMuXG4gICAgLy8gVE9ETzogSWYgd2UncmUgcmVuZGVyaW5nIHN5bmMgZWl0aGVyIGR1ZSB0byBTeW5jLCBCYXRjaGVkIG9yIGV4cGlyZWQsXG4gICAgLy8gd2Ugc2hvdWxkIHByb2JhYmx5IG5ldmVyIHJlc3RhcnQuXG4gICAgLy8gSWYgd2UncmUgc3VzcGVuZGVkIHdpdGggZGVsYXksIG9yIGlmIGl0J3MgYSByZXRyeSwgd2UnbGwgYWx3YXlzIHN1c3BlbmRcbiAgICAvLyBzbyB3ZSBjYW4gYWx3YXlzIHJlc3RhcnQuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RTdXNwZW5kZWRXaXRoRGVsYXkgfHwgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdFN1c3BlbmRlZCAmJiBpbmNsdWRlc09ubHlSZXRyaWVzKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKSAmJiBub3coKSAtIGdsb2JhbE1vc3RSZWNlbnRGYWxsYmFja1RpbWUgPCBGQUxMQkFDS19USFJPVFRMRV9NUykge1xuICAgICAgLy8gUmVzdGFydCBmcm9tIHRoZSByb290LlxuICAgICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgTm9MYW5lcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEV2ZW4gdGhvdWdoIHdlIGNhbid0IHJlc3RhcnQgcmlnaHQgbm93LCB3ZSBtaWdodCBnZXQgYW5cbiAgICAgIC8vIG9wcG9ydHVuaXR5IGxhdGVyLiBTbyB3ZSBtYXJrIHRoaXMgcmVuZGVyIGFzIGhhdmluZyBhIHBpbmcuXG4gICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcyA9IG1lcmdlTGFuZXMod29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXMsIHBpbmdlZExhbmVzKTtcbiAgICB9XG4gIH1cblxuICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcbn1cblxuZnVuY3Rpb24gcmV0cnlUaW1lZE91dEJvdW5kYXJ5KGJvdW5kYXJ5RmliZXIsIHJldHJ5TGFuZSkge1xuICAvLyBUaGUgYm91bmRhcnkgZmliZXIgKGEgU3VzcGVuc2UgY29tcG9uZW50IG9yIFN1c3BlbnNlTGlzdCBjb21wb25lbnQpXG4gIC8vIHByZXZpb3VzbHkgd2FzIHJlbmRlcmVkIGluIGl0cyBmYWxsYmFjayBzdGF0ZS4gT25lIG9mIHRoZSBwcm9taXNlcyB0aGF0XG4gIC8vIHN1c3BlbmRlZCBpdCBoYXMgcmVzb2x2ZWQsIHdoaWNoIG1lYW5zIGF0IGxlYXN0IHBhcnQgb2YgdGhlIHRyZWUgd2FzXG4gIC8vIGxpa2VseSB1bmJsb2NrZWQuIFRyeSByZW5kZXJpbmcgYWdhaW4sIGF0IGEgbmV3IGxhbmVzLlxuICBpZiAocmV0cnlMYW5lID09PSBOb0xhbmUpIHtcbiAgICAvLyBUT0RPOiBBc3NpZ24gdGhpcyB0byBgc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmVgPyB0byBhdm9pZFxuICAgIC8vIHVubmVjZXNzYXJ5IGVudGFuZ2xlbWVudD9cbiAgICByZXRyeUxhbmUgPSByZXF1ZXN0UmV0cnlMYW5lKGJvdW5kYXJ5RmliZXIpO1xuICB9IC8vIFRPRE86IFNwZWNpYWwgY2FzZSBpZGxlIHByaW9yaXR5P1xuXG5cbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoYm91bmRhcnlGaWJlciwgcmV0cnlMYW5lKTtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIG1hcmtSb290VXBkYXRlZChyb290LCByZXRyeUxhbmUsIGV2ZW50VGltZSk7XG4gICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmV0cnlEZWh5ZHJhdGVkU3VzcGVuc2VCb3VuZGFyeShib3VuZGFyeUZpYmVyKSB7XG4gIHZhciBzdXNwZW5zZVN0YXRlID0gYm91bmRhcnlGaWJlci5tZW1vaXplZFN0YXRlO1xuICB2YXIgcmV0cnlMYW5lID0gTm9MYW5lO1xuXG4gIGlmIChzdXNwZW5zZVN0YXRlICE9PSBudWxsKSB7XG4gICAgcmV0cnlMYW5lID0gc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmU7XG4gIH1cblxuICByZXRyeVRpbWVkT3V0Qm91bmRhcnkoYm91bmRhcnlGaWJlciwgcmV0cnlMYW5lKTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVSZXRyeVdha2VhYmxlKGJvdW5kYXJ5RmliZXIsIHdha2VhYmxlKSB7XG4gIHZhciByZXRyeUxhbmUgPSBOb0xhbmU7IC8vIERlZmF1bHRcblxuICB2YXIgcmV0cnlDYWNoZTtcblxuICBzd2l0Y2ggKGJvdW5kYXJ5RmliZXIudGFnKSB7XG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHJldHJ5Q2FjaGUgPSBib3VuZGFyeUZpYmVyLnN0YXRlTm9kZTtcbiAgICAgIHZhciBzdXNwZW5zZVN0YXRlID0gYm91bmRhcnlGaWJlci5tZW1vaXplZFN0YXRlO1xuXG4gICAgICBpZiAoc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICByZXRyeUxhbmUgPSBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHJldHJ5Q2FjaGUgPSBib3VuZGFyeUZpYmVyLnN0YXRlTm9kZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGluZ2VkIHVua25vd24gc3VzcGVuc2UgYm91bmRhcnkgdHlwZS4gJyArICdUaGlzIGlzIHByb2JhYmx5IGEgYnVnIGluIFJlYWN0LicpO1xuICB9XG5cbiAgaWYgKHJldHJ5Q2FjaGUgIT09IG51bGwpIHtcbiAgICAvLyBUaGUgd2FrZWFibGUgcmVzb2x2ZWQsIHNvIHdlIG5vIGxvbmdlciBuZWVkIHRvIG1lbW9pemUsIGJlY2F1c2UgaXQgd2lsbFxuICAgIC8vIG5ldmVyIGJlIHRocm93biBhZ2Fpbi5cbiAgICByZXRyeUNhY2hlLmRlbGV0ZSh3YWtlYWJsZSk7XG4gIH1cblxuICByZXRyeVRpbWVkT3V0Qm91bmRhcnkoYm91bmRhcnlGaWJlciwgcmV0cnlMYW5lKTtcbn0gLy8gQ29tcHV0ZXMgdGhlIG5leHQgSnVzdCBOb3RpY2VhYmxlIERpZmZlcmVuY2UgKEpORCkgYm91bmRhcnkuXG4vLyBUaGUgdGhlb3J5IGlzIHRoYXQgYSBwZXJzb24gY2FuJ3QgdGVsbCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHNtYWxsIGRpZmZlcmVuY2VzIGluIHRpbWUuXG4vLyBUaGVyZWZvcmUsIGlmIHdlIHdhaXQgYSBiaXQgbG9uZ2VyIHRoYW4gbmVjZXNzYXJ5IHRoYXQgd29uJ3QgdHJhbnNsYXRlIHRvIGEgbm90aWNlYWJsZVxuLy8gZGlmZmVyZW5jZSBpbiB0aGUgZXhwZXJpZW5jZS4gSG93ZXZlciwgd2FpdGluZyBmb3IgbG9uZ2VyIG1pZ2h0IG1lYW4gdGhhdCB3ZSBjYW4gYXZvaWRcbi8vIHNob3dpbmcgYW4gaW50ZXJtZWRpYXRlIGxvYWRpbmcgc3RhdGUuIFRoZSBsb25nZXIgd2UgaGF2ZSBhbHJlYWR5IHdhaXRlZCwgdGhlIGhhcmRlciBpdFxuLy8gaXMgdG8gdGVsbCBzbWFsbCBkaWZmZXJlbmNlcyBpbiB0aW1lLiBUaGVyZWZvcmUsIHRoZSBsb25nZXIgd2UndmUgYWxyZWFkeSB3YWl0ZWQsXG4vLyB0aGUgbG9uZ2VyIHdlIGNhbiB3YWl0IGFkZGl0aW9uYWxseS4gQXQgc29tZSBwb2ludCB3ZSBoYXZlIHRvIGdpdmUgdXAgdGhvdWdoLlxuLy8gV2UgcGljayBhIHRyYWluIG1vZGVsIHdoZXJlIHRoZSBuZXh0IGJvdW5kYXJ5IGNvbW1pdHMgYXQgYSBjb25zaXN0ZW50IHNjaGVkdWxlLlxuLy8gVGhlc2UgcGFydGljdWxhciBudW1iZXJzIGFyZSB2YWd1ZSBlc3RpbWF0ZXMuIFdlIGV4cGVjdCB0byBhZGp1c3QgdGhlbSBiYXNlZCBvbiByZXNlYXJjaC5cblxuZnVuY3Rpb24gam5kKHRpbWVFbGFwc2VkKSB7XG4gIHJldHVybiB0aW1lRWxhcHNlZCA8IDEyMCA/IDEyMCA6IHRpbWVFbGFwc2VkIDwgNDgwID8gNDgwIDogdGltZUVsYXBzZWQgPCAxMDgwID8gMTA4MCA6IHRpbWVFbGFwc2VkIDwgMTkyMCA/IDE5MjAgOiB0aW1lRWxhcHNlZCA8IDMwMDAgPyAzMDAwIDogdGltZUVsYXBzZWQgPCA0MzIwID8gNDMyMCA6IGNlaWwodGltZUVsYXBzZWQgLyAxOTYwKSAqIDE5NjA7XG59XG5cbmZ1bmN0aW9uIGNoZWNrRm9yTmVzdGVkVXBkYXRlcygpIHtcbiAgaWYgKG5lc3RlZFVwZGF0ZUNvdW50ID4gTkVTVEVEX1VQREFURV9MSU1JVCkge1xuICAgIG5lc3RlZFVwZGF0ZUNvdW50ID0gMDtcbiAgICByb290V2l0aE5lc3RlZFVwZGF0ZXMgPSBudWxsO1xuICAgIHRocm93IG5ldyBFcnJvcignTWF4aW11bSB1cGRhdGUgZGVwdGggZXhjZWVkZWQuIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGEgY29tcG9uZW50ICcgKyAncmVwZWF0ZWRseSBjYWxscyBzZXRTdGF0ZSBpbnNpZGUgY29tcG9uZW50V2lsbFVwZGF0ZSBvciAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZS4gUmVhY3QgbGltaXRzIHRoZSBudW1iZXIgb2YgbmVzdGVkIHVwZGF0ZXMgdG8gJyArICdwcmV2ZW50IGluZmluaXRlIGxvb3BzLicpO1xuICB9XG5cbiAge1xuICAgIGlmIChuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQgPiBORVNURURfUEFTU0lWRV9VUERBVEVfTElNSVQpIHtcbiAgICAgIG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA9IDA7XG4gICAgICByb290V2l0aFBhc3NpdmVOZXN0ZWRVcGRhdGVzID0gbnVsbDtcblxuICAgICAgZXJyb3IoJ01heGltdW0gdXBkYXRlIGRlcHRoIGV4Y2VlZGVkLiBUaGlzIGNhbiBoYXBwZW4gd2hlbiBhIGNvbXBvbmVudCAnICsgXCJjYWxscyBzZXRTdGF0ZSBpbnNpZGUgdXNlRWZmZWN0LCBidXQgdXNlRWZmZWN0IGVpdGhlciBkb2Vzbid0IFwiICsgJ2hhdmUgYSBkZXBlbmRlbmN5IGFycmF5LCBvciBvbmUgb2YgdGhlIGRlcGVuZGVuY2llcyBjaGFuZ2VzIG9uICcgKyAnZXZlcnkgcmVuZGVyLicpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmbHVzaFJlbmRlclBoYXNlU3RyaWN0TW9kZVdhcm5pbmdzSW5ERVYoKSB7XG4gIHtcbiAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5mbHVzaExlZ2FjeUNvbnRleHRXYXJuaW5nKCk7XG5cbiAgICB7XG4gICAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5mbHVzaFBlbmRpbmdVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncygpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXREb3VibGVJbnZva2VFZmZlY3RzSW5ERVYoZmliZXIsIGhhc1Bhc3NpdmVFZmZlY3RzKSB7XG4gIHtcbiAgICAvLyBUT0RPIChTdHJpY3RFZmZlY3RzKSBTaG91bGQgd2Ugc2V0IGEgbWFya2VyIG9uIHRoZSByb290IGlmIGl0IGNvbnRhaW5zIHN0cmljdCBlZmZlY3RzXG4gICAgLy8gc28gd2UgZG9uJ3QgdHJhdmVyc2UgdW5uZWNlc3NhcmlseT8gc2ltaWxhciB0byBzdWJ0cmVlRmxhZ3MgYnV0IGp1c3QgYXQgdGhlIHJvb3QgbGV2ZWwuXG4gICAgLy8gTWF5YmUgbm90IGEgYmlnIGRlYWwgc2luY2UgdGhpcyBpcyBERVYgb25seSBiZWhhdmlvci5cbiAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuICAgIGludm9rZUVmZmVjdHNJbkRldihmaWJlciwgTW91bnRMYXlvdXREZXYsIGludm9rZUxheW91dEVmZmVjdFVubW91bnRJbkRFVik7XG5cbiAgICBpZiAoaGFzUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAgIGludm9rZUVmZmVjdHNJbkRldihmaWJlciwgTW91bnRQYXNzaXZlRGV2LCBpbnZva2VQYXNzaXZlRWZmZWN0VW5tb3VudEluREVWKTtcbiAgICB9XG5cbiAgICBpbnZva2VFZmZlY3RzSW5EZXYoZmliZXIsIE1vdW50TGF5b3V0RGV2LCBpbnZva2VMYXlvdXRFZmZlY3RNb3VudEluREVWKTtcblxuICAgIGlmIChoYXNQYXNzaXZlRWZmZWN0cykge1xuICAgICAgaW52b2tlRWZmZWN0c0luRGV2KGZpYmVyLCBNb3VudFBhc3NpdmVEZXYsIGludm9rZVBhc3NpdmVFZmZlY3RNb3VudEluREVWKTtcbiAgICB9XG5cbiAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGludm9rZUVmZmVjdHNJbkRldihmaXJzdENoaWxkLCBmaWJlckZsYWdzLCBpbnZva2VFZmZlY3RGbikge1xuICB7XG4gICAgLy8gV2UgZG9uJ3QgbmVlZCB0byByZS1jaGVjayBTdHJpY3RFZmZlY3RzTW9kZSBoZXJlLlxuICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgaWYgdGhhdCBjaGVjayBoYXMgYWxyZWFkeSBwYXNzZWQuXG4gICAgdmFyIGN1cnJlbnQgPSBmaXJzdENoaWxkO1xuICAgIHZhciBzdWJ0cmVlUm9vdCA9IG51bGw7XG5cbiAgICB3aGlsZSAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgdmFyIHByaW1hcnlTdWJ0cmVlRmxhZyA9IGN1cnJlbnQuc3VidHJlZUZsYWdzICYgZmliZXJGbGFncztcblxuICAgICAgaWYgKGN1cnJlbnQgIT09IHN1YnRyZWVSb290ICYmIGN1cnJlbnQuY2hpbGQgIT09IG51bGwgJiYgcHJpbWFyeVN1YnRyZWVGbGFnICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmNoaWxkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKChjdXJyZW50LmZsYWdzICYgZmliZXJGbGFncykgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICBpbnZva2VFZmZlY3RGbihjdXJyZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjdXJyZW50LnNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5zaWJsaW5nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN1cnJlbnQgPSBzdWJ0cmVlUm9vdCA9IGN1cnJlbnQucmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBkaWRXYXJuU3RhdGVVcGRhdGVGb3JOb3RZZXRNb3VudGVkQ29tcG9uZW50ID0gbnVsbDtcbmZ1bmN0aW9uIHdhcm5BYm91dFVwZGF0ZU9uTm90WWV0TW91bnRlZEZpYmVySW5ERVYoZmliZXIpIHtcbiAge1xuICAgIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIFJlbmRlckNvbnRleHQpICE9PSBOb0NvbnRleHQpIHtcbiAgICAgIC8vIFdlIGxldCB0aGUgb3RoZXIgd2FybmluZyBhYm91dCByZW5kZXIgcGhhc2UgdXBkYXRlcyBkZWFsIHdpdGggdGhpcyBvbmUuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCEoZmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB0YWcgPSBmaWJlci50YWc7XG5cbiAgICBpZiAodGFnICE9PSBJbmRldGVybWluYXRlQ29tcG9uZW50ICYmIHRhZyAhPT0gSG9zdFJvb3QgJiYgdGFnICE9PSBDbGFzc0NvbXBvbmVudCAmJiB0YWcgIT09IEZ1bmN0aW9uQ29tcG9uZW50ICYmIHRhZyAhPT0gRm9yd2FyZFJlZiAmJiB0YWcgIT09IE1lbW9Db21wb25lbnQgJiYgdGFnICE9PSBTaW1wbGVNZW1vQ29tcG9uZW50KSB7XG4gICAgICAvLyBPbmx5IHdhcm4gZm9yIHVzZXItZGVmaW5lZCBjb21wb25lbnRzLCBub3QgaW50ZXJuYWwgb25lcyBsaWtlIFN1c3BlbnNlLlxuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gV2Ugc2hvdyB0aGUgd2hvbGUgc3RhY2sgYnV0IGRlZHVwZSBvbiB0aGUgdG9wIGNvbXBvbmVudCdzIG5hbWUgYmVjYXVzZVxuICAgIC8vIHRoZSBwcm9ibGVtYXRpYyBjb2RlIGFsbW9zdCBhbHdheXMgbGllcyBpbnNpZGUgdGhhdCBjb21wb25lbnQuXG5cblxuICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ1JlYWN0Q29tcG9uZW50JztcblxuICAgIGlmIChkaWRXYXJuU3RhdGVVcGRhdGVGb3JOb3RZZXRNb3VudGVkQ29tcG9uZW50ICE9PSBudWxsKSB7XG4gICAgICBpZiAoZGlkV2FyblN0YXRlVXBkYXRlRm9yTm90WWV0TW91bnRlZENvbXBvbmVudC5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBkaWRXYXJuU3RhdGVVcGRhdGVGb3JOb3RZZXRNb3VudGVkQ29tcG9uZW50LmFkZChjb21wb25lbnROYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGlkV2FyblN0YXRlVXBkYXRlRm9yTm90WWV0TW91bnRlZENvbXBvbmVudCA9IG5ldyBTZXQoW2NvbXBvbmVudE5hbWVdKTtcbiAgICB9XG5cbiAgICB2YXIgcHJldmlvdXNGaWJlciA9IGN1cnJlbnQ7XG5cbiAgICB0cnkge1xuICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgICAgZXJyb3IoXCJDYW4ndCBwZXJmb3JtIGEgUmVhY3Qgc3RhdGUgdXBkYXRlIG9uIGEgY29tcG9uZW50IHRoYXQgaGFzbid0IG1vdW50ZWQgeWV0LiBcIiArICdUaGlzIGluZGljYXRlcyB0aGF0IHlvdSBoYXZlIGEgc2lkZS1lZmZlY3QgaW4geW91ciByZW5kZXIgZnVuY3Rpb24gdGhhdCAnICsgJ2FzeW5jaHJvbm91c2x5IGxhdGVyIGNhbGxzIHRyaWVzIHRvIHVwZGF0ZSB0aGUgY29tcG9uZW50LiBNb3ZlIHRoaXMgd29yayB0byAnICsgJ3VzZUVmZmVjdCBpbnN0ZWFkLicpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAocHJldmlvdXNGaWJlcikge1xuICAgICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbnZhciBiZWdpbldvcmskMTtcblxue1xuICB2YXIgZHVtbXlGaWJlciA9IG51bGw7XG5cbiAgYmVnaW5Xb3JrJDEgPSBmdW5jdGlvbiAoY3VycmVudCwgdW5pdE9mV29yaywgbGFuZXMpIHtcbiAgICAvLyBJZiBhIGNvbXBvbmVudCB0aHJvd3MgYW4gZXJyb3IsIHdlIHJlcGxheSBpdCBhZ2FpbiBpbiBhIHN5bmNocm9ub3VzbHlcbiAgICAvLyBkaXNwYXRjaGVkIGV2ZW50LCBzbyB0aGF0IHRoZSBkZWJ1Z2dlciB3aWxsIHRyZWF0IGl0IGFzIGFuIHVuY2F1Z2h0XG4gICAgLy8gZXJyb3IgU2VlIFJlYWN0RXJyb3JVdGlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAvLyBCZWZvcmUgZW50ZXJpbmcgdGhlIGJlZ2luIHBoYXNlLCBjb3B5IHRoZSB3b3JrLWluLXByb2dyZXNzIG9udG8gYSBkdW1teVxuICAgIC8vIGZpYmVyLiBJZiBiZWdpbldvcmsgdGhyb3dzLCB3ZSdsbCB1c2UgdGhpcyB0byByZXNldCB0aGUgc3RhdGUuXG4gICAgdmFyIG9yaWdpbmFsV29ya0luUHJvZ3Jlc3NDb3B5ID0gYXNzaWduRmliZXJQcm9wZXJ0aWVzSW5ERVYoZHVtbXlGaWJlciwgdW5pdE9mV29yayk7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGJlZ2luV29yayhjdXJyZW50LCB1bml0T2ZXb3JrLCBsYW5lcyk7XG4gICAgfSBjYXRjaCAob3JpZ2luYWxFcnJvcikge1xuICAgICAgaWYgKGRpZFN1c3BlbmRPckVycm9yV2hpbGVIeWRyYXRpbmdERVYoKSB8fCBvcmlnaW5hbEVycm9yICE9PSBudWxsICYmIHR5cGVvZiBvcmlnaW5hbEVycm9yID09PSAnb2JqZWN0JyAmJiB0eXBlb2Ygb3JpZ2luYWxFcnJvci50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIERvbid0IHJlcGxheSBwcm9taXNlcy5cbiAgICAgICAgLy8gRG9uJ3QgcmVwbGF5IGVycm9ycyBpZiB3ZSBhcmUgaHlkcmF0aW5nIGFuZCBoYXZlIGFscmVhZHkgc3VzcGVuZGVkIG9yIGhhbmRsZWQgYW4gZXJyb3JcbiAgICAgICAgdGhyb3cgb3JpZ2luYWxFcnJvcjtcbiAgICAgIH0gLy8gS2VlcCB0aGlzIGNvZGUgaW4gc3luYyB3aXRoIGhhbmRsZUVycm9yOyBhbnkgY2hhbmdlcyBoZXJlIG11c3QgaGF2ZVxuICAgICAgLy8gY29ycmVzcG9uZGluZyBjaGFuZ2VzIHRoZXJlLlxuXG5cbiAgICAgIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpO1xuICAgICAgcmVzZXRIb29rc0FmdGVyVGhyb3coKTsgLy8gRG9uJ3QgcmVzZXQgY3VycmVudCBkZWJ1ZyBmaWJlciwgc2luY2Ugd2UncmUgYWJvdXQgdG8gd29yayBvbiB0aGVcbiAgICAgIC8vIHNhbWUgZmliZXIgYWdhaW4uXG4gICAgICAvLyBVbndpbmQgdGhlIGZhaWxlZCBzdGFjayBmcmFtZVxuXG4gICAgICB1bndpbmRJbnRlcnJ1cHRlZFdvcmsoY3VycmVudCwgdW5pdE9mV29yayk7IC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHByb3BlcnRpZXMgb2YgdGhlIGZpYmVyLlxuXG4gICAgICBhc3NpZ25GaWJlclByb3BlcnRpZXNJbkRFVih1bml0T2ZXb3JrLCBvcmlnaW5hbFdvcmtJblByb2dyZXNzQ29weSk7XG5cbiAgICAgIGlmICggdW5pdE9mV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgLy8gUmVzZXQgdGhlIHByb2ZpbGVyIHRpbWVyLlxuICAgICAgICBzdGFydFByb2ZpbGVyVGltZXIodW5pdE9mV29yayk7XG4gICAgICB9IC8vIFJ1biBiZWdpbldvcmsgYWdhaW4uXG5cblxuICAgICAgaW52b2tlR3VhcmRlZENhbGxiYWNrKG51bGwsIGJlZ2luV29yaywgbnVsbCwgY3VycmVudCwgdW5pdE9mV29yaywgbGFuZXMpO1xuXG4gICAgICBpZiAoaGFzQ2F1Z2h0RXJyb3IoKSkge1xuICAgICAgICB2YXIgcmVwbGF5RXJyb3IgPSBjbGVhckNhdWdodEVycm9yKCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiByZXBsYXlFcnJvciA9PT0gJ29iamVjdCcgJiYgcmVwbGF5RXJyb3IgIT09IG51bGwgJiYgcmVwbGF5RXJyb3IuX3N1cHByZXNzTG9nZ2luZyAmJiB0eXBlb2Ygb3JpZ2luYWxFcnJvciA9PT0gJ29iamVjdCcgJiYgb3JpZ2luYWxFcnJvciAhPT0gbnVsbCAmJiAhb3JpZ2luYWxFcnJvci5fc3VwcHJlc3NMb2dnaW5nKSB7XG4gICAgICAgICAgLy8gSWYgc3VwcHJlc3NlZCwgbGV0IHRoZSBmbGFnIGNhcnJ5IG92ZXIgdG8gdGhlIG9yaWdpbmFsIGVycm9yIHdoaWNoIGlzIHRoZSBvbmUgd2UnbGwgcmV0aHJvdy5cbiAgICAgICAgICBvcmlnaW5hbEVycm9yLl9zdXBwcmVzc0xvZ2dpbmcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IC8vIFdlIGFsd2F5cyB0aHJvdyB0aGUgb3JpZ2luYWwgZXJyb3IgaW4gY2FzZSB0aGUgc2Vjb25kIHJlbmRlciBwYXNzIGlzIG5vdCBpZGVtcG90ZW50LlxuICAgICAgLy8gVGhpcyBjYW4gaGFwcGVuIGlmIGEgbWVtb2l6ZWQgZnVuY3Rpb24gb3IgQ29tbW9uSlMgbW9kdWxlIGRvZXNuJ3QgdGhyb3cgYWZ0ZXIgZmlyc3QgaW52b2NhdGlvbi5cblxuXG4gICAgICB0aHJvdyBvcmlnaW5hbEVycm9yO1xuICAgIH1cbiAgfTtcbn1cblxudmFyIGRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyID0gZmFsc2U7XG52YXIgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXJGb3JBbm90aGVyQ29tcG9uZW50O1xuXG57XG4gIGRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyRm9yQW5vdGhlckNvbXBvbmVudCA9IG5ldyBTZXQoKTtcbn1cblxuZnVuY3Rpb24gd2FybkFib3V0UmVuZGVyUGhhc2VVcGRhdGVzSW5ERVYoZmliZXIpIHtcbiAge1xuICAgIGlmIChpc1JlbmRlcmluZyAmJiAhZ2V0SXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZUluREVWKCkpIHtcbiAgICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciByZW5kZXJpbmdDb21wb25lbnROYW1lID0gd29ya0luUHJvZ3Jlc3MgJiYgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcih3b3JrSW5Qcm9ncmVzcykgfHwgJ1Vua25vd24nOyAvLyBEZWR1cGUgYnkgdGhlIHJlbmRlcmluZyBjb21wb25lbnQgYmVjYXVzZSBpdCdzIHRoZSBvbmUgdGhhdCBuZWVkcyB0byBiZSBmaXhlZC5cblxuICAgICAgICAgICAgdmFyIGRlZHVwZUtleSA9IHJlbmRlcmluZ0NvbXBvbmVudE5hbWU7XG5cbiAgICAgICAgICAgIGlmICghZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXJGb3JBbm90aGVyQ29tcG9uZW50LmhhcyhkZWR1cGVLZXkpKSB7XG4gICAgICAgICAgICAgIGRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyRm9yQW5vdGhlckNvbXBvbmVudC5hZGQoZGVkdXBlS2V5KTtcbiAgICAgICAgICAgICAgdmFyIHNldFN0YXRlQ29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdVbmtub3duJztcblxuICAgICAgICAgICAgICBlcnJvcignQ2Fubm90IHVwZGF0ZSBhIGNvbXBvbmVudCAoYCVzYCkgd2hpbGUgcmVuZGVyaW5nIGEgJyArICdkaWZmZXJlbnQgY29tcG9uZW50IChgJXNgKS4gVG8gbG9jYXRlIHRoZSBiYWQgc2V0U3RhdGUoKSBjYWxsIGluc2lkZSBgJXNgLCAnICsgJ2ZvbGxvdyB0aGUgc3RhY2sgdHJhY2UgYXMgZGVzY3JpYmVkIGluIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zZXRzdGF0ZS1pbi1yZW5kZXInLCBzZXRTdGF0ZUNvbXBvbmVudE5hbWUsIHJlbmRlcmluZ0NvbXBvbmVudE5hbWUsIHJlbmRlcmluZ0NvbXBvbmVudE5hbWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoIWRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyKSB7XG4gICAgICAgICAgICAgIGVycm9yKCdDYW5ub3QgdXBkYXRlIGR1cmluZyBhbiBleGlzdGluZyBzdGF0ZSB0cmFuc2l0aW9uIChzdWNoIGFzICcgKyAnd2l0aGluIGByZW5kZXJgKS4gUmVuZGVyIG1ldGhvZHMgc2hvdWxkIGJlIGEgcHVyZSAnICsgJ2Z1bmN0aW9uIG9mIHByb3BzIGFuZCBzdGF0ZS4nKTtcblxuICAgICAgICAgICAgICBkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlciA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhyb290LCBsYW5lcykge1xuICB7XG4gICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICB2YXIgbWVtb2l6ZWRVcGRhdGVycyA9IHJvb3QubWVtb2l6ZWRVcGRhdGVycztcbiAgICAgIG1lbW9pemVkVXBkYXRlcnMuZm9yRWFjaChmdW5jdGlvbiAoc2NoZWR1bGluZ0ZpYmVyKSB7XG4gICAgICAgIGFkZEZpYmVyVG9MYW5lc01hcChyb290LCBzY2hlZHVsaW5nRmliZXIsIGxhbmVzKTtcbiAgICAgIH0pOyAvLyBUaGlzIGZ1bmN0aW9uIGludGVudGlvbmFsbHkgZG9lcyBub3QgY2xlYXIgbWVtb2l6ZWQgdXBkYXRlcnMuXG4gICAgICAvLyBUaG9zZSBtYXkgc3RpbGwgYmUgcmVsZXZhbnQgdG8gdGhlIGN1cnJlbnQgY29tbWl0XG4gICAgICAvLyBhbmQgYSBmdXR1cmUgb25lIChlLmcuIFN1c3BlbnNlKS5cbiAgICB9XG4gIH1cbn1cbnZhciBmYWtlQWN0Q2FsbGJhY2tOb2RlID0ge307XG5cbmZ1bmN0aW9uIHNjaGVkdWxlQ2FsbGJhY2skMShwcmlvcml0eUxldmVsLCBjYWxsYmFjaykge1xuICB7XG4gICAgLy8gSWYgd2UncmUgY3VycmVudGx5IGluc2lkZSBhbiBgYWN0YCBzY29wZSwgYnlwYXNzIFNjaGVkdWxlciBhbmQgcHVzaCB0b1xuICAgIC8vIHRoZSBgYWN0YCBxdWV1ZSBpbnN0ZWFkLlxuICAgIHZhciBhY3RRdWV1ZSA9IFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuY3VycmVudDtcblxuICAgIGlmIChhY3RRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgYWN0UXVldWUucHVzaChjYWxsYmFjayk7XG4gICAgICByZXR1cm4gZmFrZUFjdENhbGxiYWNrTm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHNjaGVkdWxlQ2FsbGJhY2socHJpb3JpdHlMZXZlbCwgY2FsbGJhY2spO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjYW5jZWxDYWxsYmFjayQxKGNhbGxiYWNrTm9kZSkge1xuICBpZiAoIGNhbGxiYWNrTm9kZSA9PT0gZmFrZUFjdENhbGxiYWNrTm9kZSkge1xuICAgIHJldHVybjtcbiAgfSAvLyBJbiBwcm9kdWN0aW9uLCBhbHdheXMgY2FsbCBTY2hlZHVsZXIuIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBzdHJpcHBlZCBvdXQuXG5cblxuICByZXR1cm4gY2FuY2VsQ2FsbGJhY2soY2FsbGJhY2tOb2RlKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkRm9yY2VGbHVzaEZhbGxiYWNrc0luREVWKCkge1xuICAvLyBOZXZlciBmb3JjZSBmbHVzaCBpbiBwcm9kdWN0aW9uLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBnZXQgc3RyaXBwZWQgb3V0LlxuICByZXR1cm4gIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuY3VycmVudCAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gd2FybklmVXBkYXRlc05vdFdyYXBwZWRXaXRoQWN0REVWKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoZmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSB7XG4gICAgICBpZiAoIWlzQ29uY3VycmVudEFjdEVudmlyb25tZW50KCkpIHtcbiAgICAgICAgLy8gTm90IGluIGFuIGFjdCBlbnZpcm9ubWVudC4gTm8gbmVlZCB0byB3YXJuLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIExlZ2FjeSBtb2RlIGhhcyBhZGRpdGlvbmFsIGNhc2VzIHdoZXJlIHdlIHN1cHByZXNzIGEgd2FybmluZy5cbiAgICAgIGlmICghaXNMZWdhY3lBY3RFbnZpcm9ubWVudCgpKSB7XG4gICAgICAgIC8vIE5vdCBpbiBhbiBhY3QgZW52aXJvbm1lbnQuIE5vIG5lZWQgdG8gd2Fybi5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXhlY3V0aW9uQ29udGV4dCAhPT0gTm9Db250ZXh0KSB7XG4gICAgICAgIC8vIExlZ2FjeSBtb2RlIGRvZXNuJ3Qgd2FybiBpZiB0aGUgdXBkYXRlIGlzIGJhdGNoZWQsIGkuZS5cbiAgICAgICAgLy8gYmF0Y2hlZFVwZGF0ZXMgb3IgZmx1c2hTeW5jLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChmaWJlci50YWcgIT09IEZ1bmN0aW9uQ29tcG9uZW50ICYmIGZpYmVyLnRhZyAhPT0gRm9yd2FyZFJlZiAmJiBmaWJlci50YWcgIT09IFNpbXBsZU1lbW9Db21wb25lbnQpIHtcbiAgICAgICAgLy8gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggcHJlLWhvb2tzIGNvZGUsIGxlZ2FjeSBtb2RlIG9ubHlcbiAgICAgICAgLy8gd2FybnMgZm9yIHVwZGF0ZXMgdGhhdCBvcmlnaW5hdGUgZnJvbSBhIGhvb2suXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgICB2YXIgcHJldmlvdXNGaWJlciA9IGN1cnJlbnQ7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG5cbiAgICAgICAgZXJyb3IoJ0FuIHVwZGF0ZSB0byAlcyBpbnNpZGUgYSB0ZXN0IHdhcyBub3Qgd3JhcHBlZCBpbiBhY3QoLi4uKS5cXG5cXG4nICsgJ1doZW4gdGVzdGluZywgY29kZSB0aGF0IGNhdXNlcyBSZWFjdCBzdGF0ZSB1cGRhdGVzIHNob3VsZCBiZSAnICsgJ3dyYXBwZWQgaW50byBhY3QoLi4uKTpcXG5cXG4nICsgJ2FjdCgoKSA9PiB7XFxuJyArICcgIC8qIGZpcmUgZXZlbnRzIHRoYXQgdXBkYXRlIHN0YXRlICovXFxuJyArICd9KTtcXG4nICsgJy8qIGFzc2VydCBvbiB0aGUgb3V0cHV0ICovXFxuXFxuJyArIFwiVGhpcyBlbnN1cmVzIHRoYXQgeW91J3JlIHRlc3RpbmcgdGhlIGJlaGF2aW9yIHRoZSB1c2VyIHdvdWxkIHNlZSBcIiArICdpbiB0aGUgYnJvd3Nlci4nICsgJyBMZWFybiBtb3JlIGF0IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay93cmFwLXRlc3RzLXdpdGgtYWN0JywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKHByZXZpb3VzRmliZXIpIHtcbiAgICAgICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gd2FybklmU3VzcGVuc2VSZXNvbHV0aW9uTm90V3JhcHBlZFdpdGhBY3RERVYocm9vdCkge1xuICB7XG4gICAgaWYgKHJvb3QudGFnICE9PSBMZWdhY3lSb290ICYmIGlzQ29uY3VycmVudEFjdEVudmlyb25tZW50KCkgJiYgUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgICBlcnJvcignQSBzdXNwZW5kZWQgcmVzb3VyY2UgZmluaXNoZWQgbG9hZGluZyBpbnNpZGUgYSB0ZXN0LCBidXQgdGhlIGV2ZW50ICcgKyAnd2FzIG5vdCB3cmFwcGVkIGluIGFjdCguLi4pLlxcblxcbicgKyAnV2hlbiB0ZXN0aW5nLCBjb2RlIHRoYXQgcmVzb2x2ZXMgc3VzcGVuZGVkIGRhdGEgc2hvdWxkIGJlIHdyYXBwZWQgJyArICdpbnRvIGFjdCguLi4pOlxcblxcbicgKyAnYWN0KCgpID0+IHtcXG4nICsgJyAgLyogZmluaXNoIGxvYWRpbmcgc3VzcGVuZGVkIGRhdGEgKi9cXG4nICsgJ30pO1xcbicgKyAnLyogYXNzZXJ0IG9uIHRoZSBvdXRwdXQgKi9cXG5cXG4nICsgXCJUaGlzIGVuc3VyZXMgdGhhdCB5b3UncmUgdGVzdGluZyB0aGUgYmVoYXZpb3IgdGhlIHVzZXIgd291bGQgc2VlIFwiICsgJ2luIHRoZSBicm93c2VyLicgKyAnIExlYXJuIG1vcmUgYXQgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3dyYXAtdGVzdHMtd2l0aC1hY3QnKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0SXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0KGlzUnVubmluZykge1xuICB7XG4gICAgaXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0ID0gaXNSdW5uaW5nO1xuICB9XG59XG5cbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXMgKi9cbnZhciByZXNvbHZlRmFtaWx5ID0gbnVsbDsgLy8gJEZsb3dGaXhNZSBGbG93IGdldHMgY29uZnVzZWQgYnkgYSBXZWFrU2V0IGZlYXR1cmUgY2hlY2sgYmVsb3cuXG5cbnZhciBmYWlsZWRCb3VuZGFyaWVzID0gbnVsbDtcbnZhciBzZXRSZWZyZXNoSGFuZGxlciA9IGZ1bmN0aW9uIChoYW5kbGVyKSB7XG4gIHtcbiAgICByZXNvbHZlRmFtaWx5ID0gaGFuZGxlcjtcbiAgfVxufTtcbmZ1bmN0aW9uIHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyh0eXBlKSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cblxuICAgIHZhciBmYW1pbHkgPSByZXNvbHZlRmFtaWx5KHR5cGUpO1xuXG4gICAgaWYgKGZhbWlseSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9IC8vIFVzZSB0aGUgbGF0ZXN0IGtub3duIGltcGxlbWVudGF0aW9uLlxuXG5cbiAgICByZXR1cm4gZmFtaWx5LmN1cnJlbnQ7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc29sdmVDbGFzc0ZvckhvdFJlbG9hZGluZyh0eXBlKSB7XG4gIC8vIE5vIGltcGxlbWVudGF0aW9uIGRpZmZlcmVuY2VzLlxuICByZXR1cm4gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHR5cGUpO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUZvcndhcmRSZWZGb3JIb3RSZWxvYWRpbmcodHlwZSkge1xuICB7XG4gICAgaWYgKHJlc29sdmVGYW1pbHkgPT09IG51bGwpIHtcbiAgICAgIC8vIEhvdCByZWxvYWRpbmcgaXMgZGlzYWJsZWQuXG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG5cbiAgICB2YXIgZmFtaWx5ID0gcmVzb2x2ZUZhbWlseSh0eXBlKTtcblxuICAgIGlmIChmYW1pbHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQ2hlY2sgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEgcmVhbCBmb3J3YXJkUmVmLiBEb24ndCB3YW50IHRvIGNyYXNoIGVhcmx5LlxuICAgICAgaWYgKHR5cGUgIT09IG51bGwgJiYgdHlwZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB0eXBlLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBGb3J3YXJkUmVmIGlzIHNwZWNpYWwgYmVjYXVzZSBpdHMgcmVzb2x2ZWQgLnR5cGUgaXMgYW4gb2JqZWN0LFxuICAgICAgICAvLyBidXQgaXQncyBwb3NzaWJsZSB0aGF0IHdlIG9ubHkgaGF2ZSBpdHMgaW5uZXIgcmVuZGVyIGZ1bmN0aW9uIGluIHRoZSBtYXAuXG4gICAgICAgIC8vIElmIHRoYXQgaW5uZXIgcmVuZGVyIGZ1bmN0aW9uIGlzIGRpZmZlcmVudCwgd2UnbGwgYnVpbGQgYSBuZXcgZm9yd2FyZFJlZiB0eXBlLlxuICAgICAgICB2YXIgY3VycmVudFJlbmRlciA9IHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyh0eXBlLnJlbmRlcik7XG5cbiAgICAgICAgaWYgKHR5cGUucmVuZGVyICE9PSBjdXJyZW50UmVuZGVyKSB7XG4gICAgICAgICAgdmFyIHN5bnRoZXRpY1R5cGUgPSB7XG4gICAgICAgICAgICAkJHR5cGVvZjogUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSxcbiAgICAgICAgICAgIHJlbmRlcjogY3VycmVudFJlbmRlclxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAodHlwZS5kaXNwbGF5TmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBzeW50aGV0aWNUeXBlLmRpc3BsYXlOYW1lID0gdHlwZS5kaXNwbGF5TmFtZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gc3ludGhldGljVHlwZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9IC8vIFVzZSB0aGUgbGF0ZXN0IGtub3duIGltcGxlbWVudGF0aW9uLlxuXG5cbiAgICByZXR1cm4gZmFtaWx5LmN1cnJlbnQ7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzQ29tcGF0aWJsZUZhbWlseUZvckhvdFJlbG9hZGluZyhmaWJlciwgZWxlbWVudCkge1xuICB7XG4gICAgaWYgKHJlc29sdmVGYW1pbHkgPT09IG51bGwpIHtcbiAgICAgIC8vIEhvdCByZWxvYWRpbmcgaXMgZGlzYWJsZWQuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIHByZXZUeXBlID0gZmliZXIuZWxlbWVudFR5cGU7XG4gICAgdmFyIG5leHRUeXBlID0gZWxlbWVudC50eXBlOyAvLyBJZiB3ZSBnb3QgaGVyZSwgd2Uga25vdyB0eXBlcyBhcmVuJ3QgPT09IGVxdWFsLlxuXG4gICAgdmFyIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gZmFsc2U7XG4gICAgdmFyICQkdHlwZW9mTmV4dFR5cGUgPSB0eXBlb2YgbmV4dFR5cGUgPT09ICdvYmplY3QnICYmIG5leHRUeXBlICE9PSBudWxsID8gbmV4dFR5cGUuJCR0eXBlb2YgOiBudWxsO1xuXG4gICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAodHlwZW9mIG5leHRUeXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGlmICh0eXBlb2YgbmV4dFR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCQkdHlwZW9mTmV4dFR5cGUgPT09IFJFQUNUX0xBWllfVFlQRSkge1xuICAgICAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyB0aGUgaW5uZXIgdHlwZSB5ZXQuXG4gICAgICAgICAgICAvLyBXZSdyZSBnb2luZyB0byBhc3N1bWUgdGhhdCB0aGUgbGF6eSBpbm5lciB0eXBlIGlzIHN0YWJsZSxcbiAgICAgICAgICAgIC8vIGFuZCBzbyBpdCBpcyBzdWZmaWNpZW50IHRvIGF2b2lkIHJlY29uY2lsaW5nIGl0IGF3YXkuXG4gICAgICAgICAgICAvLyBXZSdyZSBub3QgZ29pbmcgdG8gdW53cmFwIG9yIGFjdHVhbGx5IHVzZSB0aGUgbmV3IGxhenkgdHlwZS5cbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSkge1xuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKCQkdHlwZW9mTmV4dFR5cGUgPT09IFJFQUNUX01FTU9fVFlQRSkge1xuICAgICAgICAgICAgLy8gVE9ETzogaWYgaXQgd2FzIGJ1dCBjYW4gbm8gbG9uZ2VyIGJlIHNpbXBsZSxcbiAgICAgICAgICAgIC8vIHdlIHNob3VsZG4ndCBzZXQgdGhpcy5cbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCQkdHlwZW9mTmV4dFR5cGUgPT09IFJFQUNUX0xBWllfVFlQRSkge1xuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIENoZWNrIGlmIGJvdGggdHlwZXMgaGF2ZSBhIGZhbWlseSBhbmQgaXQncyB0aGUgc2FtZSBvbmUuXG5cblxuICAgIGlmIChuZWVkc0NvbXBhcmVGYW1pbGllcykge1xuICAgICAgLy8gTm90ZTogbWVtbygpIGFuZCBmb3J3YXJkUmVmKCkgd2UnbGwgY29tcGFyZSBvdXRlciByYXRoZXIgdGhhbiBpbm5lciB0eXBlLlxuICAgICAgLy8gVGhpcyBtZWFucyBib3RoIG9mIHRoZW0gbmVlZCB0byBiZSByZWdpc3RlcmVkIHRvIHByZXNlcnZlIHN0YXRlLlxuICAgICAgLy8gSWYgd2UgdW53cmFwcGVkIGFuZCBjb21wYXJlZCB0aGUgaW5uZXIgdHlwZXMgZm9yIHdyYXBwZXJzIGluc3RlYWQsXG4gICAgICAvLyB0aGVuIHdlIHdvdWxkIHJpc2sgZmFsc2VseSBzYXlpbmcgdHdvIHNlcGFyYXRlIG1lbW8oRm9vKVxuICAgICAgLy8gY2FsbHMgYXJlIGVxdWl2YWxlbnQgYmVjYXVzZSB0aGV5IHdyYXAgdGhlIHNhbWUgRm9vIGZ1bmN0aW9uLlxuICAgICAgdmFyIHByZXZGYW1pbHkgPSByZXNvbHZlRmFtaWx5KHByZXZUeXBlKTtcblxuICAgICAgaWYgKHByZXZGYW1pbHkgIT09IHVuZGVmaW5lZCAmJiBwcmV2RmFtaWx5ID09PSByZXNvbHZlRmFtaWx5KG5leHRUeXBlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtGYWlsZWRFcnJvckJvdW5kYXJ5Rm9ySG90UmVsb2FkaW5nKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIFdlYWtTZXQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZmFpbGVkQm91bmRhcmllcyA9PT0gbnVsbCkge1xuICAgICAgZmFpbGVkQm91bmRhcmllcyA9IG5ldyBXZWFrU2V0KCk7XG4gICAgfVxuXG4gICAgZmFpbGVkQm91bmRhcmllcy5hZGQoZmliZXIpO1xuICB9XG59XG52YXIgc2NoZWR1bGVSZWZyZXNoID0gZnVuY3Rpb24gKHJvb3QsIHVwZGF0ZSkge1xuICB7XG4gICAgaWYgKHJlc29sdmVGYW1pbHkgPT09IG51bGwpIHtcbiAgICAgIC8vIEhvdCByZWxvYWRpbmcgaXMgZGlzYWJsZWQuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHN0YWxlRmFtaWxpZXMgPSB1cGRhdGUuc3RhbGVGYW1pbGllcyxcbiAgICAgICAgdXBkYXRlZEZhbWlsaWVzID0gdXBkYXRlLnVwZGF0ZWRGYW1pbGllcztcbiAgICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG4gICAgZmx1c2hTeW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNjaGVkdWxlRmliZXJzV2l0aEZhbWlsaWVzUmVjdXJzaXZlbHkocm9vdC5jdXJyZW50LCB1cGRhdGVkRmFtaWxpZXMsIHN0YWxlRmFtaWxpZXMpO1xuICAgIH0pO1xuICB9XG59O1xudmFyIHNjaGVkdWxlUm9vdCA9IGZ1bmN0aW9uIChyb290LCBlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAocm9vdC5jb250ZXh0ICE9PSBlbXB0eUNvbnRleHRPYmplY3QpIHtcbiAgICAgIC8vIFN1cGVyIGVkZ2UgY2FzZTogcm9vdCBoYXMgYSBsZWdhY3kgX3JlbmRlclN1YnRyZWUgY29udGV4dFxuICAgICAgLy8gYnV0IHdlIGRvbid0IGtub3cgdGhlIHBhcmVudENvbXBvbmVudCBzbyB3ZSBjYW4ndCBwYXNzIGl0LlxuICAgICAgLy8gSnVzdCBpZ25vcmUuIFdlJ2xsIGRlbGV0ZSB0aGlzIHdpdGggX3JlbmRlclN1YnRyZWUgY29kZSBwYXRoIGxhdGVyLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgdXBkYXRlQ29udGFpbmVyKGVsZW1lbnQsIHJvb3QsIG51bGwsIG51bGwpO1xuICAgIH0pO1xuICB9XG59O1xuXG5mdW5jdGlvbiBzY2hlZHVsZUZpYmVyc1dpdGhGYW1pbGllc1JlY3Vyc2l2ZWx5KGZpYmVyLCB1cGRhdGVkRmFtaWxpZXMsIHN0YWxlRmFtaWxpZXMpIHtcbiAge1xuICAgIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGUsXG4gICAgICAgIGNoaWxkID0gZmliZXIuY2hpbGQsXG4gICAgICAgIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nLFxuICAgICAgICB0YWcgPSBmaWJlci50YWcsXG4gICAgICAgIHR5cGUgPSBmaWJlci50eXBlO1xuICAgIHZhciBjYW5kaWRhdGVUeXBlID0gbnVsbDtcblxuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgY2FuZGlkYXRlVHlwZSA9IHR5cGU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICAgIGNhbmRpZGF0ZVR5cGUgPSB0eXBlLnJlbmRlcjtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHJlc29sdmVGYW1pbHkgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgcmVzb2x2ZUZhbWlseSB0byBiZSBzZXQgZHVyaW5nIGhvdCByZWxvYWQuJyk7XG4gICAgfVxuXG4gICAgdmFyIG5lZWRzUmVuZGVyID0gZmFsc2U7XG4gICAgdmFyIG5lZWRzUmVtb3VudCA9IGZhbHNlO1xuXG4gICAgaWYgKGNhbmRpZGF0ZVR5cGUgIT09IG51bGwpIHtcbiAgICAgIHZhciBmYW1pbHkgPSByZXNvbHZlRmFtaWx5KGNhbmRpZGF0ZVR5cGUpO1xuXG4gICAgICBpZiAoZmFtaWx5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHN0YWxlRmFtaWxpZXMuaGFzKGZhbWlseSkpIHtcbiAgICAgICAgICBuZWVkc1JlbW91bnQgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHVwZGF0ZWRGYW1pbGllcy5oYXMoZmFtaWx5KSkge1xuICAgICAgICAgIGlmICh0YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICAgICAgICBuZWVkc1JlbW91bnQgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZWVkc1JlbmRlciA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGZhaWxlZEJvdW5kYXJpZXMgIT09IG51bGwpIHtcbiAgICAgIGlmIChmYWlsZWRCb3VuZGFyaWVzLmhhcyhmaWJlcikgfHwgYWx0ZXJuYXRlICE9PSBudWxsICYmIGZhaWxlZEJvdW5kYXJpZXMuaGFzKGFsdGVybmF0ZSkpIHtcbiAgICAgICAgbmVlZHNSZW1vdW50ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobmVlZHNSZW1vdW50KSB7XG4gICAgICBmaWJlci5fZGVidWdOZWVkc1JlbW91bnQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChuZWVkc1JlbW91bnQgfHwgbmVlZHNSZW5kZXIpIHtcbiAgICAgIHZhciBfcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgICBpZiAoX3Jvb3QgIT09IG51bGwpIHtcbiAgICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKF9yb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hpbGQgIT09IG51bGwgJiYgIW5lZWRzUmVtb3VudCkge1xuICAgICAgc2NoZWR1bGVGaWJlcnNXaXRoRmFtaWxpZXNSZWN1cnNpdmVseShjaGlsZCwgdXBkYXRlZEZhbWlsaWVzLCBzdGFsZUZhbWlsaWVzKTtcbiAgICB9XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2NoZWR1bGVGaWJlcnNXaXRoRmFtaWxpZXNSZWN1cnNpdmVseShzaWJsaW5nLCB1cGRhdGVkRmFtaWxpZXMsIHN0YWxlRmFtaWxpZXMpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgZmluZEhvc3RJbnN0YW5jZXNGb3JSZWZyZXNoID0gZnVuY3Rpb24gKHJvb3QsIGZhbWlsaWVzKSB7XG4gIHtcbiAgICB2YXIgaG9zdEluc3RhbmNlcyA9IG5ldyBTZXQoKTtcbiAgICB2YXIgdHlwZXMgPSBuZXcgU2V0KGZhbWlsaWVzLm1hcChmdW5jdGlvbiAoZmFtaWx5KSB7XG4gICAgICByZXR1cm4gZmFtaWx5LmN1cnJlbnQ7XG4gICAgfSkpO1xuICAgIGZpbmRIb3N0SW5zdGFuY2VzRm9yTWF0Y2hpbmdGaWJlcnNSZWN1cnNpdmVseShyb290LmN1cnJlbnQsIHR5cGVzLCBob3N0SW5zdGFuY2VzKTtcbiAgICByZXR1cm4gaG9zdEluc3RhbmNlcztcbiAgfVxufTtcblxuZnVuY3Rpb24gZmluZEhvc3RJbnN0YW5jZXNGb3JNYXRjaGluZ0ZpYmVyc1JlY3Vyc2l2ZWx5KGZpYmVyLCB0eXBlcywgaG9zdEluc3RhbmNlcykge1xuICB7XG4gICAgdmFyIGNoaWxkID0gZmliZXIuY2hpbGQsXG4gICAgICAgIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nLFxuICAgICAgICB0YWcgPSBmaWJlci50YWcsXG4gICAgICAgIHR5cGUgPSBmaWJlci50eXBlO1xuICAgIHZhciBjYW5kaWRhdGVUeXBlID0gbnVsbDtcblxuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgY2FuZGlkYXRlVHlwZSA9IHR5cGU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICAgIGNhbmRpZGF0ZVR5cGUgPSB0eXBlLnJlbmRlcjtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIGRpZE1hdGNoID0gZmFsc2U7XG5cbiAgICBpZiAoY2FuZGlkYXRlVHlwZSAhPT0gbnVsbCkge1xuICAgICAgaWYgKHR5cGVzLmhhcyhjYW5kaWRhdGVUeXBlKSkge1xuICAgICAgICBkaWRNYXRjaCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRpZE1hdGNoKSB7XG4gICAgICAvLyBXZSBoYXZlIGEgbWF0Y2guIFRoaXMgb25seSBkcmlsbHMgZG93biB0byB0aGUgY2xvc2VzdCBob3N0IGNvbXBvbmVudHMuXG4gICAgICAvLyBUaGVyZSdzIG5vIG5lZWQgdG8gc2VhcmNoIGRlZXBlciBiZWNhdXNlIGZvciB0aGUgcHVycG9zZSBvZiBnaXZpbmdcbiAgICAgIC8vIHZpc3VhbCBmZWVkYmFjaywgXCJmbGFzaGluZ1wiIG91dGVybW9zdCBwYXJlbnQgcmVjdGFuZ2xlcyBpcyBzdWZmaWNpZW50LlxuICAgICAgZmluZEhvc3RJbnN0YW5jZXNGb3JGaWJlclNoYWxsb3dseShmaWJlciwgaG9zdEluc3RhbmNlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHRoZXJlJ3Mgbm8gbWF0Y2gsIG1heWJlIHRoZXJlIHdpbGwgYmUgb25lIGZ1cnRoZXIgZG93biBpbiB0aGUgY2hpbGQgdHJlZS5cbiAgICAgIGlmIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICBmaW5kSG9zdEluc3RhbmNlc0Zvck1hdGNoaW5nRmliZXJzUmVjdXJzaXZlbHkoY2hpbGQsIHR5cGVzLCBob3N0SW5zdGFuY2VzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgZmluZEhvc3RJbnN0YW5jZXNGb3JNYXRjaGluZ0ZpYmVyc1JlY3Vyc2l2ZWx5KHNpYmxpbmcsIHR5cGVzLCBob3N0SW5zdGFuY2VzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEhvc3RJbnN0YW5jZXNGb3JGaWJlclNoYWxsb3dseShmaWJlciwgaG9zdEluc3RhbmNlcykge1xuICB7XG4gICAgdmFyIGZvdW5kSG9zdEluc3RhbmNlcyA9IGZpbmRDaGlsZEhvc3RJbnN0YW5jZXNGb3JGaWJlclNoYWxsb3dseShmaWJlciwgaG9zdEluc3RhbmNlcyk7XG5cbiAgICBpZiAoZm91bmRIb3N0SW5zdGFuY2VzKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBJZiB3ZSBkaWRuJ3QgZmluZCBhbnkgaG9zdCBjaGlsZHJlbiwgZmFsbGJhY2sgdG8gY2xvc2VzdCBob3N0IHBhcmVudC5cblxuXG4gICAgdmFyIG5vZGUgPSBmaWJlcjtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBzd2l0Y2ggKG5vZGUudGFnKSB7XG4gICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICBob3N0SW5zdGFuY2VzLmFkZChub2RlLnN0YXRlTm9kZSk7XG4gICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgICAgICBob3N0SW5zdGFuY2VzLmFkZChub2RlLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTtcbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICBob3N0SW5zdGFuY2VzLmFkZChub2RlLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIHJlYWNoIHJvb3QgZmlyc3QuJyk7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZENoaWxkSG9zdEluc3RhbmNlc0ZvckZpYmVyU2hhbGxvd2x5KGZpYmVyLCBob3N0SW5zdGFuY2VzKSB7XG4gIHtcbiAgICB2YXIgbm9kZSA9IGZpYmVyO1xuICAgIHZhciBmb3VuZEhvc3RJbnN0YW5jZXMgPSBmYWxzZTtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAobm9kZS50YWcgPT09IEhvc3RDb21wb25lbnQpIHtcbiAgICAgICAgLy8gV2UgZ290IGEgbWF0Y2guXG4gICAgICAgIGZvdW5kSG9zdEluc3RhbmNlcyA9IHRydWU7XG4gICAgICAgIGhvc3RJbnN0YW5jZXMuYWRkKG5vZGUuc3RhdGVOb2RlKTsgLy8gVGhlcmUgbWF5IHN0aWxsIGJlIG1vcmUsIHNvIGtlZXAgc2VhcmNoaW5nLlxuICAgICAgfSBlbHNlIGlmIChub2RlLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZSA9PT0gZmliZXIpIHtcbiAgICAgICAgcmV0dXJuIGZvdW5kSG9zdEluc3RhbmNlcztcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IGZpYmVyKSB7XG4gICAgICAgICAgcmV0dXJuIGZvdW5kSG9zdEluc3RhbmNlcztcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgIH1cblxuICAgICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbnZhciBoYXNCYWRNYXBQb2x5ZmlsbDtcblxue1xuICBoYXNCYWRNYXBQb2x5ZmlsbCA9IGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgdmFyIG5vbkV4dGVuc2libGVPYmplY3QgPSBPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pO1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLW5ldyAqL1xuXG4gICAgbmV3IE1hcChbW25vbkV4dGVuc2libGVPYmplY3QsIG51bGxdXSk7XG4gICAgbmV3IFNldChbbm9uRXh0ZW5zaWJsZU9iamVjdF0pO1xuICAgIC8qIGVzbGludC1lbmFibGUgbm8tbmV3ICovXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBUT0RPOiBDb25zaWRlciB3YXJuaW5nIGFib3V0IGJhZCBwb2x5ZmlsbHNcbiAgICBoYXNCYWRNYXBQb2x5ZmlsbCA9IHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gRmliZXJOb2RlKHRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpIHtcbiAgLy8gSW5zdGFuY2VcbiAgdGhpcy50YWcgPSB0YWc7XG4gIHRoaXMua2V5ID0ga2V5O1xuICB0aGlzLmVsZW1lbnRUeXBlID0gbnVsbDtcbiAgdGhpcy50eXBlID0gbnVsbDtcbiAgdGhpcy5zdGF0ZU5vZGUgPSBudWxsOyAvLyBGaWJlclxuXG4gIHRoaXMucmV0dXJuID0gbnVsbDtcbiAgdGhpcy5jaGlsZCA9IG51bGw7XG4gIHRoaXMuc2libGluZyA9IG51bGw7XG4gIHRoaXMuaW5kZXggPSAwO1xuICB0aGlzLnJlZiA9IG51bGw7XG4gIHRoaXMucGVuZGluZ1Byb3BzID0gcGVuZGluZ1Byb3BzO1xuICB0aGlzLm1lbW9pemVkUHJvcHMgPSBudWxsO1xuICB0aGlzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgdGhpcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgdGhpcy5kZXBlbmRlbmNpZXMgPSBudWxsO1xuICB0aGlzLm1vZGUgPSBtb2RlOyAvLyBFZmZlY3RzXG5cbiAgdGhpcy5mbGFncyA9IE5vRmxhZ3M7XG4gIHRoaXMuc3VidHJlZUZsYWdzID0gTm9GbGFncztcbiAgdGhpcy5kZWxldGlvbnMgPSBudWxsO1xuICB0aGlzLmxhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5jaGlsZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5hbHRlcm5hdGUgPSBudWxsO1xuXG4gIHtcbiAgICAvLyBOb3RlOiBUaGUgZm9sbG93aW5nIGlzIGRvbmUgdG8gYXZvaWQgYSB2OCBwZXJmb3JtYW5jZSBjbGlmZi5cbiAgICAvL1xuICAgIC8vIEluaXRpYWxpemluZyB0aGUgZmllbGRzIGJlbG93IHRvIHNtaXMgYW5kIGxhdGVyIHVwZGF0aW5nIHRoZW0gd2l0aFxuICAgIC8vIGRvdWJsZSB2YWx1ZXMgd2lsbCBjYXVzZSBGaWJlcnMgdG8gZW5kIHVwIGhhdmluZyBzZXBhcmF0ZSBzaGFwZXMuXG4gICAgLy8gVGhpcyBiZWhhdmlvci9idWcgaGFzIHNvbWV0aGluZyB0byBkbyB3aXRoIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9uKCkuXG4gICAgLy8gRm9ydHVuYXRlbHkgdGhpcyBvbmx5IGltcGFjdHMgREVWIGJ1aWxkcy5cbiAgICAvLyBVbmZvcnR1bmF0ZWx5IGl0IG1ha2VzIFJlYWN0IHVudXNhYmx5IHNsb3cgZm9yIHNvbWUgYXBwbGljYXRpb25zLlxuICAgIC8vIFRvIHdvcmsgYXJvdW5kIHRoaXMsIGluaXRpYWxpemUgdGhlIGZpZWxkcyBiZWxvdyB3aXRoIGRvdWJsZXMuXG4gICAgLy9cbiAgICAvLyBMZWFybiBtb3JlIGFib3V0IHRoaXMgaGVyZTpcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE0MzY1XG4gICAgLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9ODUzOFxuICAgIHRoaXMuYWN0dWFsRHVyYXRpb24gPSBOdW1iZXIuTmFOO1xuICAgIHRoaXMuYWN0dWFsU3RhcnRUaW1lID0gTnVtYmVyLk5hTjtcbiAgICB0aGlzLnNlbGZCYXNlRHVyYXRpb24gPSBOdW1iZXIuTmFOO1xuICAgIHRoaXMudHJlZUJhc2VEdXJhdGlvbiA9IE51bWJlci5OYU47IC8vIEl0J3Mgb2theSB0byByZXBsYWNlIHRoZSBpbml0aWFsIGRvdWJsZXMgd2l0aCBzbWlzIGFmdGVyIGluaXRpYWxpemF0aW9uLlxuICAgIC8vIFRoaXMgd29uJ3QgdHJpZ2dlciB0aGUgcGVyZm9ybWFuY2UgY2xpZmYgbWVudGlvbmVkIGFib3ZlLFxuICAgIC8vIGFuZCBpdCBzaW1wbGlmaWVzIG90aGVyIHByb2ZpbGVyIGNvZGUgKGluY2x1ZGluZyBEZXZUb29scykuXG5cbiAgICB0aGlzLmFjdHVhbER1cmF0aW9uID0gMDtcbiAgICB0aGlzLmFjdHVhbFN0YXJ0VGltZSA9IC0xO1xuICAgIHRoaXMuc2VsZkJhc2VEdXJhdGlvbiA9IDA7XG4gICAgdGhpcy50cmVlQmFzZUR1cmF0aW9uID0gMDtcbiAgfVxuXG4gIHtcbiAgICAvLyBUaGlzIGlzbid0IGRpcmVjdGx5IHVzZWQgYnV0IGlzIGhhbmR5IGZvciBkZWJ1Z2dpbmcgaW50ZXJuYWxzOlxuICAgIHRoaXMuX2RlYnVnU291cmNlID0gbnVsbDtcbiAgICB0aGlzLl9kZWJ1Z093bmVyID0gbnVsbDtcbiAgICB0aGlzLl9kZWJ1Z05lZWRzUmVtb3VudCA9IGZhbHNlO1xuICAgIHRoaXMuX2RlYnVnSG9va1R5cGVzID0gbnVsbDtcblxuICAgIGlmICghaGFzQmFkTWFwUG9seWZpbGwgJiYgdHlwZW9mIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHRoaXMpO1xuICAgIH1cbiAgfVxufSAvLyBUaGlzIGlzIGEgY29uc3RydWN0b3IgZnVuY3Rpb24sIHJhdGhlciB0aGFuIGEgUE9KTyBjb25zdHJ1Y3Rvciwgc3RpbGxcbi8vIHBsZWFzZSBlbnN1cmUgd2UgZG8gdGhlIGZvbGxvd2luZzpcbi8vIDEpIE5vYm9keSBzaG91bGQgYWRkIGFueSBpbnN0YW5jZSBtZXRob2RzIG9uIHRoaXMuIEluc3RhbmNlIG1ldGhvZHMgY2FuIGJlXG4vLyAgICBtb3JlIGRpZmZpY3VsdCB0byBwcmVkaWN0IHdoZW4gdGhleSBnZXQgb3B0aW1pemVkIGFuZCB0aGV5IGFyZSBhbG1vc3Rcbi8vICAgIG5ldmVyIGlubGluZWQgcHJvcGVybHkgaW4gc3RhdGljIGNvbXBpbGVycy5cbi8vIDIpIE5vYm9keSBzaG91bGQgcmVseSBvbiBgaW5zdGFuY2VvZiBGaWJlcmAgZm9yIHR5cGUgdGVzdGluZy4gV2Ugc2hvdWxkXG4vLyAgICBhbHdheXMga25vdyB3aGVuIGl0IGlzIGEgZmliZXIuXG4vLyAzKSBXZSBtaWdodCB3YW50IHRvIGV4cGVyaW1lbnQgd2l0aCB1c2luZyBudW1lcmljIGtleXMgc2luY2UgdGhleSBhcmUgZWFzaWVyXG4vLyAgICB0byBvcHRpbWl6ZSBpbiBhIG5vbi1KSVQgZW52aXJvbm1lbnQuXG4vLyA0KSBXZSBjYW4gZWFzaWx5IGdvIGZyb20gYSBjb25zdHJ1Y3RvciB0byBhIGNyZWF0ZUZpYmVyIG9iamVjdCBsaXRlcmFsIGlmIHRoYXRcbi8vICAgIGlzIGZhc3Rlci5cbi8vIDUpIEl0IHNob3VsZCBiZSBlYXN5IHRvIHBvcnQgdGhpcyB0byBhIEMgc3RydWN0IGFuZCBrZWVwIGEgQyBpbXBsZW1lbnRhdGlvblxuLy8gICAgY29tcGF0aWJsZS5cblxuXG52YXIgY3JlYXRlRmliZXIgPSBmdW5jdGlvbiAodGFnLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSkge1xuICAvLyAkRmxvd0ZpeE1lOiB0aGUgc2hhcGVzIGFyZSBleGFjdCBoZXJlIGJ1dCBGbG93IGRvZXNuJ3QgbGlrZSBjb25zdHJ1Y3RvcnNcbiAgcmV0dXJuIG5ldyBGaWJlck5vZGUodGFnLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSk7XG59O1xuXG5mdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QkMShDb21wb25lbnQpIHtcbiAgdmFyIHByb3RvdHlwZSA9IENvbXBvbmVudC5wcm90b3R5cGU7XG4gIHJldHVybiAhIShwcm90b3R5cGUgJiYgcHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQpO1xufVxuXG5mdW5jdGlvbiBpc1NpbXBsZUZ1bmN0aW9uQ29tcG9uZW50KHR5cGUpIHtcbiAgcmV0dXJuIHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nICYmICFzaG91bGRDb25zdHJ1Y3QkMSh0eXBlKSAmJiB0eXBlLmRlZmF1bHRQcm9wcyA9PT0gdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUxhenlDb21wb25lbnRUYWcoQ29tcG9uZW50KSB7XG4gIGlmICh0eXBlb2YgQ29tcG9uZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHNob3VsZENvbnN0cnVjdCQxKENvbXBvbmVudCkgPyBDbGFzc0NvbXBvbmVudCA6IEZ1bmN0aW9uQ29tcG9uZW50O1xuICB9IGVsc2UgaWYgKENvbXBvbmVudCAhPT0gdW5kZWZpbmVkICYmIENvbXBvbmVudCAhPT0gbnVsbCkge1xuICAgIHZhciAkJHR5cGVvZiA9IENvbXBvbmVudC4kJHR5cGVvZjtcblxuICAgIGlmICgkJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSkge1xuICAgICAgcmV0dXJuIEZvcndhcmRSZWY7XG4gICAgfVxuXG4gICAgaWYgKCQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUpIHtcbiAgICAgIHJldHVybiBNZW1vQ29tcG9uZW50O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBJbmRldGVybWluYXRlQ29tcG9uZW50O1xufSAvLyBUaGlzIGlzIHVzZWQgdG8gY3JlYXRlIGFuIGFsdGVybmF0ZSBmaWJlciB0byBkbyB3b3JrIG9uLlxuXG5mdW5jdGlvbiBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50LCBwZW5kaW5nUHJvcHMpIHtcbiAgdmFyIHdvcmtJblByb2dyZXNzID0gY3VycmVudC5hbHRlcm5hdGU7XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzID09PSBudWxsKSB7XG4gICAgLy8gV2UgdXNlIGEgZG91YmxlIGJ1ZmZlcmluZyBwb29saW5nIHRlY2huaXF1ZSBiZWNhdXNlIHdlIGtub3cgdGhhdCB3ZSdsbFxuICAgIC8vIG9ubHkgZXZlciBuZWVkIGF0IG1vc3QgdHdvIHZlcnNpb25zIG9mIGEgdHJlZS4gV2UgcG9vbCB0aGUgXCJvdGhlclwiIHVudXNlZFxuICAgIC8vIG5vZGUgdGhhdCB3ZSdyZSBmcmVlIHRvIHJldXNlLiBUaGlzIGlzIGxhemlseSBjcmVhdGVkIHRvIGF2b2lkIGFsbG9jYXRpbmdcbiAgICAvLyBleHRyYSBvYmplY3RzIGZvciB0aGluZ3MgdGhhdCBhcmUgbmV2ZXIgdXBkYXRlZC4gSXQgYWxzbyBhbGxvdyB1cyB0b1xuICAgIC8vIHJlY2xhaW0gdGhlIGV4dHJhIG1lbW9yeSBpZiBuZWVkZWQuXG4gICAgd29ya0luUHJvZ3Jlc3MgPSBjcmVhdGVGaWJlcihjdXJyZW50LnRhZywgcGVuZGluZ1Byb3BzLCBjdXJyZW50LmtleSwgY3VycmVudC5tb2RlKTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9IGN1cnJlbnQuZWxlbWVudFR5cGU7XG4gICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IGN1cnJlbnQudHlwZTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBjdXJyZW50LnN0YXRlTm9kZTtcblxuICAgIHtcbiAgICAgIC8vIERFVi1vbmx5IGZpZWxkc1xuICAgICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnU291cmNlID0gY3VycmVudC5fZGVidWdTb3VyY2U7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdPd25lciA9IGN1cnJlbnQuX2RlYnVnT3duZXI7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdIb29rVHlwZXMgPSBjdXJyZW50Ll9kZWJ1Z0hvb2tUeXBlcztcbiAgICB9XG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBjdXJyZW50O1xuICAgIGN1cnJlbnQuYWx0ZXJuYXRlID0gd29ya0luUHJvZ3Jlc3M7XG4gIH0gZWxzZSB7XG4gICAgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzID0gcGVuZGluZ1Byb3BzOyAvLyBOZWVkZWQgYmVjYXVzZSBCbG9ja3Mgc3RvcmUgZGF0YSBvbiB0eXBlLlxuXG4gICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IGN1cnJlbnQudHlwZTsgLy8gV2UgYWxyZWFkeSBoYXZlIGFuIGFsdGVybmF0ZS5cbiAgICAvLyBSZXNldCB0aGUgZWZmZWN0IHRhZy5cblxuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID0gTm9GbGFnczsgLy8gVGhlIGVmZmVjdHMgYXJlIG5vIGxvbmdlciB2YWxpZC5cblxuICAgIHdvcmtJblByb2dyZXNzLnN1YnRyZWVGbGFncyA9IE5vRmxhZ3M7XG4gICAgd29ya0luUHJvZ3Jlc3MuZGVsZXRpb25zID0gbnVsbDtcblxuICAgIHtcbiAgICAgIC8vIFdlIGludGVudGlvbmFsbHkgcmVzZXQsIHJhdGhlciB0aGFuIGNvcHksIGFjdHVhbER1cmF0aW9uICYgYWN0dWFsU3RhcnRUaW1lLlxuICAgICAgLy8gVGhpcyBwcmV2ZW50cyB0aW1lIGZyb20gZW5kbGVzc2x5IGFjY3VtdWxhdGluZyBpbiBuZXcgY29tbWl0cy5cbiAgICAgIC8vIFRoaXMgaGFzIHRoZSBkb3duc2lkZSBvZiByZXNldHRpbmcgdmFsdWVzIGZvciBkaWZmZXJlbnQgcHJpb3JpdHkgcmVuZGVycyxcbiAgICAgIC8vIEJ1dCB3b3JrcyBmb3IgeWllbGRpbmcgKHRoZSBjb21tb24gY2FzZSkgYW5kIHNob3VsZCBzdXBwb3J0IHJlc3VtaW5nLlxuICAgICAgd29ya0luUHJvZ3Jlc3MuYWN0dWFsRHVyYXRpb24gPSAwO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuYWN0dWFsU3RhcnRUaW1lID0gLTE7XG4gICAgfVxuICB9IC8vIFJlc2V0IGFsbCBlZmZlY3RzIGV4Y2VwdCBzdGF0aWMgb25lcy5cbiAgLy8gU3RhdGljIGVmZmVjdHMgYXJlIG5vdCBzcGVjaWZpYyB0byBhIHJlbmRlci5cblxuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzID0gY3VycmVudC5mbGFncyAmIFN0YXRpY01hc2s7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMgPSBjdXJyZW50LmNoaWxkTGFuZXM7XG4gIHdvcmtJblByb2dyZXNzLmxhbmVzID0gY3VycmVudC5sYW5lcztcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjdXJyZW50LmNoaWxkO1xuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7IC8vIENsb25lIHRoZSBkZXBlbmRlbmNpZXMgb2JqZWN0LiBUaGlzIGlzIG11dGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UsIHNvXG4gIC8vIGl0IGNhbm5vdCBiZSBzaGFyZWQgd2l0aCB0aGUgY3VycmVudCBmaWJlci5cblxuICB2YXIgY3VycmVudERlcGVuZGVuY2llcyA9IGN1cnJlbnQuZGVwZW5kZW5jaWVzO1xuICB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPSBjdXJyZW50RGVwZW5kZW5jaWVzID09PSBudWxsID8gbnVsbCA6IHtcbiAgICBsYW5lczogY3VycmVudERlcGVuZGVuY2llcy5sYW5lcyxcbiAgICBmaXJzdENvbnRleHQ6IGN1cnJlbnREZXBlbmRlbmNpZXMuZmlyc3RDb250ZXh0XG4gIH07IC8vIFRoZXNlIHdpbGwgYmUgb3ZlcnJpZGRlbiBkdXJpbmcgdGhlIHBhcmVudCdzIHJlY29uY2lsaWF0aW9uXG5cbiAgd29ya0luUHJvZ3Jlc3Muc2libGluZyA9IGN1cnJlbnQuc2libGluZztcbiAgd29ya0luUHJvZ3Jlc3MuaW5kZXggPSBjdXJyZW50LmluZGV4O1xuICB3b3JrSW5Qcm9ncmVzcy5yZWYgPSBjdXJyZW50LnJlZjtcblxuICB7XG4gICAgd29ya0luUHJvZ3Jlc3Muc2VsZkJhc2VEdXJhdGlvbiA9IGN1cnJlbnQuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uID0gY3VycmVudC50cmVlQmFzZUR1cmF0aW9uO1xuICB9XG5cbiAge1xuICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z05lZWRzUmVtb3VudCA9IGN1cnJlbnQuX2RlYnVnTmVlZHNSZW1vdW50O1xuXG4gICAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICAgIGNhc2UgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDpcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcoY3VycmVudC50eXBlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSByZXNvbHZlQ2xhc3NGb3JIb3RSZWxvYWRpbmcoY3VycmVudC50eXBlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IHJlc29sdmVGb3J3YXJkUmVmRm9ySG90UmVsb2FkaW5nKGN1cnJlbnQudHlwZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbn0gLy8gVXNlZCB0byByZXVzZSBhIEZpYmVyIGZvciBhIHNlY29uZCBwYXNzLlxuXG5mdW5jdGlvbiByZXNldFdvcmtJblByb2dyZXNzKHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAvLyBUaGlzIHJlc2V0cyB0aGUgRmliZXIgdG8gd2hhdCBjcmVhdGVGaWJlciBvciBjcmVhdGVXb3JrSW5Qcm9ncmVzcyB3b3VsZFxuICAvLyBoYXZlIHNldCB0aGUgdmFsdWVzIHRvIGJlZm9yZSBkdXJpbmcgdGhlIGZpcnN0IHBhc3MuIElkZWFsbHkgdGhpcyB3b3VsZG4ndFxuICAvLyBiZSBuZWNlc3NhcnkgYnV0IHVuZm9ydHVuYXRlbHkgbWFueSBjb2RlIHBhdGhzIHJlYWRzIGZyb20gdGhlIHdvcmtJblByb2dyZXNzXG4gIC8vIHdoZW4gdGhleSBzaG91bGQgYmUgcmVhZGluZyBmcm9tIGN1cnJlbnQgYW5kIHdyaXRpbmcgdG8gd29ya0luUHJvZ3Jlc3MuXG4gIC8vIFdlIGFzc3VtZSBwZW5kaW5nUHJvcHMsIGluZGV4LCBrZXksIHJlZiwgcmV0dXJuIGFyZSBzdGlsbCB1bnRvdWNoZWQgdG9cbiAgLy8gYXZvaWQgZG9pbmcgYW5vdGhlciByZWNvbmNpbGlhdGlvbi5cbiAgLy8gUmVzZXQgdGhlIGVmZmVjdCBmbGFncyBidXQga2VlcCBhbnkgUGxhY2VtZW50IHRhZ3MsIHNpbmNlIHRoYXQncyBzb21ldGhpbmdcbiAgLy8gdGhhdCBjaGlsZCBmaWJlciBpcyBzZXR0aW5nLCBub3QgdGhlIHJlY29uY2lsaWF0aW9uLlxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSBTdGF0aWNNYXNrIHwgUGxhY2VtZW50OyAvLyBUaGUgZWZmZWN0cyBhcmUgbm8gbG9uZ2VyIHZhbGlkLlxuXG4gIHZhciBjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlO1xuXG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgLy8gUmVzZXQgdG8gY3JlYXRlRmliZXIncyBpbml0aWFsIHZhbHVlcy5cbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzID0gTm9MYW5lcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IHJlbmRlckxhbmVzO1xuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5zdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IG51bGw7XG5cbiAgICB7XG4gICAgICAvLyBOb3RlOiBXZSBkb24ndCByZXNldCB0aGUgYWN0dWFsVGltZSBjb3VudHMuIEl0J3MgdXNlZnVsIHRvIGFjY3VtdWxhdGVcbiAgICAgIC8vIGFjdHVhbCB0aW1lIGFjcm9zcyBtdWx0aXBsZSByZW5kZXIgcGFzc2VzLlxuICAgICAgd29ya0luUHJvZ3Jlc3Muc2VsZkJhc2VEdXJhdGlvbiA9IDA7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uID0gMDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gUmVzZXQgdG8gdGhlIGNsb25lZCB2YWx1ZXMgdGhhdCBjcmVhdGVXb3JrSW5Qcm9ncmVzcyB3b3VsZCd2ZS5cbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzID0gY3VycmVudC5jaGlsZExhbmVzO1xuICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gY3VycmVudC5sYW5lcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGN1cnJlbnQuY2hpbGQ7XG4gICAgd29ya0luUHJvZ3Jlc3Muc3VidHJlZUZsYWdzID0gTm9GbGFncztcbiAgICB3b3JrSW5Qcm9ncmVzcy5kZWxldGlvbnMgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7IC8vIE5lZWRlZCBiZWNhdXNlIEJsb2NrcyBzdG9yZSBkYXRhIG9uIHR5cGUuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gY3VycmVudC50eXBlOyAvLyBDbG9uZSB0aGUgZGVwZW5kZW5jaWVzIG9iamVjdC4gVGhpcyBpcyBtdXRhdGVkIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLCBzb1xuICAgIC8vIGl0IGNhbm5vdCBiZSBzaGFyZWQgd2l0aCB0aGUgY3VycmVudCBmaWJlci5cblxuICAgIHZhciBjdXJyZW50RGVwZW5kZW5jaWVzID0gY3VycmVudC5kZXBlbmRlbmNpZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MuZGVwZW5kZW5jaWVzID0gY3VycmVudERlcGVuZGVuY2llcyA9PT0gbnVsbCA/IG51bGwgOiB7XG4gICAgICBsYW5lczogY3VycmVudERlcGVuZGVuY2llcy5sYW5lcyxcbiAgICAgIGZpcnN0Q29udGV4dDogY3VycmVudERlcGVuZGVuY2llcy5maXJzdENvbnRleHRcbiAgICB9O1xuXG4gICAge1xuICAgICAgLy8gTm90ZTogV2UgZG9uJ3QgcmVzZXQgdGhlIGFjdHVhbFRpbWUgY291bnRzLiBJdCdzIHVzZWZ1bCB0byBhY2N1bXVsYXRlXG4gICAgICAvLyBhY3R1YWwgdGltZSBhY3Jvc3MgbXVsdGlwbGUgcmVuZGVyIHBhc3Nlcy5cbiAgICAgIHdvcmtJblByb2dyZXNzLnNlbGZCYXNlRHVyYXRpb24gPSBjdXJyZW50LnNlbGZCYXNlRHVyYXRpb247XG4gICAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uID0gY3VycmVudC50cmVlQmFzZUR1cmF0aW9uO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbn1cbmZ1bmN0aW9uIGNyZWF0ZUhvc3RSb290RmliZXIodGFnLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUpIHtcbiAgdmFyIG1vZGU7XG5cbiAgaWYgKHRhZyA9PT0gQ29uY3VycmVudFJvb3QpIHtcbiAgICBtb2RlID0gQ29uY3VycmVudE1vZGU7XG5cbiAgICBpZiAoaXNTdHJpY3RNb2RlID09PSB0cnVlKSB7XG4gICAgICBtb2RlIHw9IFN0cmljdExlZ2FjeU1vZGU7XG5cbiAgICAgIHtcbiAgICAgICAgbW9kZSB8PSBTdHJpY3RFZmZlY3RzTW9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbW9kZSA9IE5vTW9kZTtcbiAgfVxuXG4gIGlmICggaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAvLyBBbHdheXMgY29sbGVjdCBwcm9maWxlIHRpbWluZ3Mgd2hlbiBEZXZUb29scyBhcmUgcHJlc2VudC5cbiAgICAvLyBUaGlzIGVuYWJsZXMgRGV2VG9vbHMgdG8gc3RhcnQgY2FwdHVyaW5nIHRpbWluZyBhdCBhbnkgcG9pbnRcdTIwMTNcbiAgICAvLyBXaXRob3V0IHNvbWUgbm9kZXMgaW4gdGhlIHRyZWUgaGF2aW5nIGVtcHR5IGJhc2UgdGltZXMuXG4gICAgbW9kZSB8PSBQcm9maWxlTW9kZTtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVGaWJlcihIb3N0Um9vdCwgbnVsbCwgbnVsbCwgbW9kZSk7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21UeXBlQW5kUHJvcHModHlwZSwgLy8gUmVhY3QkRWxlbWVudFR5cGVcbmtleSwgcGVuZGluZ1Byb3BzLCBvd25lciwgbW9kZSwgbGFuZXMpIHtcbiAgdmFyIGZpYmVyVGFnID0gSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDsgLy8gVGhlIHJlc29sdmVkIHR5cGUgaXMgc2V0IGlmIHdlIGtub3cgd2hhdCB0aGUgZmluYWwgdHlwZSB3aWxsIGJlLiBJLmUuIGl0J3Mgbm90IGxhenkuXG5cbiAgdmFyIHJlc29sdmVkVHlwZSA9IHR5cGU7XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKHNob3VsZENvbnN0cnVjdCQxKHR5cGUpKSB7XG4gICAgICBmaWJlclRhZyA9IENsYXNzQ29tcG9uZW50O1xuXG4gICAgICB7XG4gICAgICAgIHJlc29sdmVkVHlwZSA9IHJlc29sdmVDbGFzc0ZvckhvdFJlbG9hZGluZyhyZXNvbHZlZFR5cGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB7XG4gICAgICAgIHJlc29sdmVkVHlwZSA9IHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyhyZXNvbHZlZFR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICBmaWJlclRhZyA9IEhvc3RDb21wb25lbnQ7XG4gIH0gZWxzZSB7XG4gICAgZ2V0VGFnOiBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KHBlbmRpbmdQcm9wcy5jaGlsZHJlbiwgbW9kZSwgbGFuZXMsIGtleSk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgICAgZmliZXJUYWcgPSBNb2RlO1xuICAgICAgICBtb2RlIHw9IFN0cmljdExlZ2FjeU1vZGU7XG5cbiAgICAgICAgaWYgKCAobW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgLy8gU3RyaWN0IGVmZmVjdHMgc2hvdWxkIG5ldmVyIHJ1biBvbiBsZWdhY3kgcm9vdHNcbiAgICAgICAgICBtb2RlIHw9IFN0cmljdEVmZmVjdHNNb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbVByb2ZpbGVyKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbVN1c3BlbnNlKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tU3VzcGVuc2VMaXN0KHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfT0ZGU0NSRUVOX1RZUEU6XG4gICAgICAgIHJldHVybiBjcmVhdGVGaWJlckZyb21PZmZzY3JlZW4ocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9MRUdBQ1lfSElEREVOX1RZUEU6XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgICBjYXNlIFJFQUNUX1NDT1BFX1RZUEU6XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgICBjYXNlIFJFQUNUX0NBQ0hFX1RZUEU6XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgICBjYXNlIFJFQUNUX1RSQUNJTkdfTUFSS0VSX1RZUEU6XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgICBjYXNlIFJFQUNUX0RFQlVHX1RSQUNJTkdfTU9ERV9UWVBFOlxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAge1xuICAgICAgICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IENvbnRleHRQcm92aWRlcjtcbiAgICAgICAgICAgICAgICBicmVhayBnZXRUYWc7XG5cbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGNvbnN1bWVyXG4gICAgICAgICAgICAgICAgZmliZXJUYWcgPSBDb250ZXh0Q29uc3VtZXI7XG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuXG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IEZvcndhcmRSZWY7XG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICByZXNvbHZlZFR5cGUgPSByZXNvbHZlRm9yd2FyZFJlZkZvckhvdFJlbG9hZGluZyhyZXNvbHZlZFR5cGUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrIGdldFRhZztcblxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IE1lbW9Db21wb25lbnQ7XG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuXG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gTGF6eUNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICByZXNvbHZlZFR5cGUgPSBudWxsO1xuICAgICAgICAgICAgICAgIGJyZWFrIGdldFRhZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgaW5mbyA9ICcnO1xuXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgaW5mbyArPSAnIFlvdSBsaWtlbHkgZm9yZ290IHRvIGV4cG9ydCB5b3VyIGNvbXBvbmVudCBmcm9tIHRoZSBmaWxlICcgKyBcIml0J3MgZGVmaW5lZCBpbiwgb3IgeW91IG1pZ2h0IGhhdmUgbWl4ZWQgdXAgZGVmYXVsdCBhbmQgXCIgKyAnbmFtZWQgaW1wb3J0cy4nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgb3duZXJOYW1lID0gb3duZXIgPyBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKG93bmVyKSA6IG51bGw7XG5cbiAgICAgICAgICAgIGlmIChvd25lck5hbWUpIHtcbiAgICAgICAgICAgICAgaW5mbyArPSAnXFxuXFxuQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBvd25lck5hbWUgKyAnYC4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRWxlbWVudCB0eXBlIGlzIGludmFsaWQ6IGV4cGVjdGVkIGEgc3RyaW5nIChmb3IgYnVpbHQtaW4gJyArICdjb21wb25lbnRzKSBvciBhIGNsYXNzL2Z1bmN0aW9uIChmb3IgY29tcG9zaXRlIGNvbXBvbmVudHMpICcgKyAoXCJidXQgZ290OiBcIiArICh0eXBlID09IG51bGwgPyB0eXBlIDogdHlwZW9mIHR5cGUpICsgXCIuXCIgKyBpbmZvKSk7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihmaWJlclRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpO1xuICBmaWJlci5lbGVtZW50VHlwZSA9IHR5cGU7XG4gIGZpYmVyLnR5cGUgPSByZXNvbHZlZFR5cGU7XG4gIGZpYmVyLmxhbmVzID0gbGFuZXM7XG5cbiAge1xuICAgIGZpYmVyLl9kZWJ1Z093bmVyID0gb3duZXI7XG4gIH1cblxuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21FbGVtZW50KGVsZW1lbnQsIG1vZGUsIGxhbmVzKSB7XG4gIHZhciBvd25lciA9IG51bGw7XG5cbiAge1xuICAgIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gIH1cblxuICB2YXIgdHlwZSA9IGVsZW1lbnQudHlwZTtcbiAgdmFyIGtleSA9IGVsZW1lbnQua2V5O1xuICB2YXIgcGVuZGluZ1Byb3BzID0gZWxlbWVudC5wcm9wcztcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXJGcm9tVHlwZUFuZFByb3BzKHR5cGUsIGtleSwgcGVuZGluZ1Byb3BzLCBvd25lciwgbW9kZSwgbGFuZXMpO1xuXG4gIHtcbiAgICBmaWJlci5fZGVidWdTb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7XG4gICAgZmliZXIuX2RlYnVnT3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgfVxuXG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGVsZW1lbnRzLCBtb2RlLCBsYW5lcywga2V5KSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEZyYWdtZW50LCBlbGVtZW50cywga2V5LCBtb2RlKTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGZpYmVyO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21Qcm9maWxlcihwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgcGVuZGluZ1Byb3BzLmlkICE9PSAnc3RyaW5nJykge1xuICAgICAgZXJyb3IoJ1Byb2ZpbGVyIG11c3Qgc3BlY2lmeSBhbiBcImlkXCIgb2YgdHlwZSBgc3RyaW5nYCBhcyBhIHByb3AuIFJlY2VpdmVkIHRoZSB0eXBlIGAlc2AgaW5zdGVhZC4nLCB0eXBlb2YgcGVuZGluZ1Byb3BzLmlkKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihQcm9maWxlciwgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUgfCBQcm9maWxlTW9kZSk7XG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcblxuICB7XG4gICAgZmliZXIuc3RhdGVOb2RlID0ge1xuICAgICAgZWZmZWN0RHVyYXRpb246IDAsXG4gICAgICBwYXNzaXZlRWZmZWN0RHVyYXRpb246IDBcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGZpYmVyO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21TdXNwZW5zZShwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoU3VzcGVuc2VDb21wb25lbnQsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTtcbiAgZmliZXIuZWxlbWVudFR5cGUgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21TdXNwZW5zZUxpc3QocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKFN1c3BlbnNlTGlzdENvbXBvbmVudCwgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpO1xuICBmaWJlci5lbGVtZW50VHlwZSA9IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tT2Zmc2NyZWVuKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSkge1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihPZmZzY3JlZW5Db21wb25lbnQsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTtcbiAgZmliZXIuZWxlbWVudFR5cGUgPSBSRUFDVF9PRkZTQ1JFRU5fVFlQRTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgdmFyIHByaW1hcnlDaGlsZEluc3RhbmNlID0ge1xuICAgIGlzSGlkZGVuOiBmYWxzZVxuICB9O1xuICBmaWJlci5zdGF0ZU5vZGUgPSBwcmltYXJ5Q2hpbGRJbnN0YW5jZTtcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tVGV4dChjb250ZW50LCBtb2RlLCBsYW5lcykge1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihIb3N0VGV4dCwgY29udGVudCwgbnVsbCwgbW9kZSk7XG4gIGZpYmVyLmxhbmVzID0gbGFuZXM7XG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbUhvc3RJbnN0YW5jZUZvckRlbGV0aW9uKCkge1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihIb3N0Q29tcG9uZW50LCBudWxsLCBudWxsLCBOb01vZGUpO1xuICBmaWJlci5lbGVtZW50VHlwZSA9ICdERUxFVEVEJztcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tRGVoeWRyYXRlZEZyYWdtZW50KGRlaHlkcmF0ZWROb2RlKSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKERlaHlkcmF0ZWRGcmFnbWVudCwgbnVsbCwgbnVsbCwgTm9Nb2RlKTtcbiAgZmliZXIuc3RhdGVOb2RlID0gZGVoeWRyYXRlZE5vZGU7XG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVBvcnRhbChwb3J0YWwsIG1vZGUsIGxhbmVzKSB7XG4gIHZhciBwZW5kaW5nUHJvcHMgPSBwb3J0YWwuY2hpbGRyZW4gIT09IG51bGwgPyBwb3J0YWwuY2hpbGRyZW4gOiBbXTtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoSG9zdFBvcnRhbCwgcGVuZGluZ1Byb3BzLCBwb3J0YWwua2V5LCBtb2RlKTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgZmliZXIuc3RhdGVOb2RlID0ge1xuICAgIGNvbnRhaW5lckluZm86IHBvcnRhbC5jb250YWluZXJJbmZvLFxuICAgIHBlbmRpbmdDaGlsZHJlbjogbnVsbCxcbiAgICAvLyBVc2VkIGJ5IHBlcnNpc3RlbnQgdXBkYXRlc1xuICAgIGltcGxlbWVudGF0aW9uOiBwb3J0YWwuaW1wbGVtZW50YXRpb25cbiAgfTtcbiAgcmV0dXJuIGZpYmVyO1xufSAvLyBVc2VkIGZvciBzdGFzaGluZyBXSVAgcHJvcGVydGllcyB0byByZXBsYXkgZmFpbGVkIHdvcmsgaW4gREVWLlxuXG5mdW5jdGlvbiBhc3NpZ25GaWJlclByb3BlcnRpZXNJbkRFVih0YXJnZXQsIHNvdXJjZSkge1xuICBpZiAodGFyZ2V0ID09PSBudWxsKSB7XG4gICAgLy8gVGhpcyBGaWJlcidzIGluaXRpYWwgcHJvcGVydGllcyB3aWxsIGFsd2F5cyBiZSBvdmVyd3JpdHRlbi5cbiAgICAvLyBXZSBvbmx5IHVzZSBhIEZpYmVyIHRvIGVuc3VyZSB0aGUgc2FtZSBoaWRkZW4gY2xhc3Mgc28gREVWIGlzbid0IHNsb3cuXG4gICAgdGFyZ2V0ID0gY3JlYXRlRmliZXIoSW5kZXRlcm1pbmF0ZUNvbXBvbmVudCwgbnVsbCwgbnVsbCwgTm9Nb2RlKTtcbiAgfSAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgd3JpdHRlbiBhcyBhIGxpc3Qgb2YgYWxsIHByb3BlcnRpZXMuXG4gIC8vIFdlIHRyaWVkIHRvIHVzZSBPYmplY3QuYXNzaWduKCkgaW5zdGVhZCBidXQgdGhpcyBpcyBjYWxsZWQgaW5cbiAgLy8gdGhlIGhvdHRlc3QgcGF0aCwgYW5kIE9iamVjdC5hc3NpZ24oKSB3YXMgdG9vIHNsb3c6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTI1MDJcbiAgLy8gVGhpcyBjb2RlIGlzIERFVi1vbmx5IHNvIHNpemUgaXMgbm90IGEgY29uY2Vybi5cblxuXG4gIHRhcmdldC50YWcgPSBzb3VyY2UudGFnO1xuICB0YXJnZXQua2V5ID0gc291cmNlLmtleTtcbiAgdGFyZ2V0LmVsZW1lbnRUeXBlID0gc291cmNlLmVsZW1lbnRUeXBlO1xuICB0YXJnZXQudHlwZSA9IHNvdXJjZS50eXBlO1xuICB0YXJnZXQuc3RhdGVOb2RlID0gc291cmNlLnN0YXRlTm9kZTtcbiAgdGFyZ2V0LnJldHVybiA9IHNvdXJjZS5yZXR1cm47XG4gIHRhcmdldC5jaGlsZCA9IHNvdXJjZS5jaGlsZDtcbiAgdGFyZ2V0LnNpYmxpbmcgPSBzb3VyY2Uuc2libGluZztcbiAgdGFyZ2V0LmluZGV4ID0gc291cmNlLmluZGV4O1xuICB0YXJnZXQucmVmID0gc291cmNlLnJlZjtcbiAgdGFyZ2V0LnBlbmRpbmdQcm9wcyA9IHNvdXJjZS5wZW5kaW5nUHJvcHM7XG4gIHRhcmdldC5tZW1vaXplZFByb3BzID0gc291cmNlLm1lbW9pemVkUHJvcHM7XG4gIHRhcmdldC51cGRhdGVRdWV1ZSA9IHNvdXJjZS51cGRhdGVRdWV1ZTtcbiAgdGFyZ2V0Lm1lbW9pemVkU3RhdGUgPSBzb3VyY2UubWVtb2l6ZWRTdGF0ZTtcbiAgdGFyZ2V0LmRlcGVuZGVuY2llcyA9IHNvdXJjZS5kZXBlbmRlbmNpZXM7XG4gIHRhcmdldC5tb2RlID0gc291cmNlLm1vZGU7XG4gIHRhcmdldC5mbGFncyA9IHNvdXJjZS5mbGFncztcbiAgdGFyZ2V0LnN1YnRyZWVGbGFncyA9IHNvdXJjZS5zdWJ0cmVlRmxhZ3M7XG4gIHRhcmdldC5kZWxldGlvbnMgPSBzb3VyY2UuZGVsZXRpb25zO1xuICB0YXJnZXQubGFuZXMgPSBzb3VyY2UubGFuZXM7XG4gIHRhcmdldC5jaGlsZExhbmVzID0gc291cmNlLmNoaWxkTGFuZXM7XG4gIHRhcmdldC5hbHRlcm5hdGUgPSBzb3VyY2UuYWx0ZXJuYXRlO1xuXG4gIHtcbiAgICB0YXJnZXQuYWN0dWFsRHVyYXRpb24gPSBzb3VyY2UuYWN0dWFsRHVyYXRpb247XG4gICAgdGFyZ2V0LmFjdHVhbFN0YXJ0VGltZSA9IHNvdXJjZS5hY3R1YWxTdGFydFRpbWU7XG4gICAgdGFyZ2V0LnNlbGZCYXNlRHVyYXRpb24gPSBzb3VyY2Uuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICB0YXJnZXQudHJlZUJhc2VEdXJhdGlvbiA9IHNvdXJjZS50cmVlQmFzZUR1cmF0aW9uO1xuICB9XG5cbiAgdGFyZ2V0Ll9kZWJ1Z1NvdXJjZSA9IHNvdXJjZS5fZGVidWdTb3VyY2U7XG4gIHRhcmdldC5fZGVidWdPd25lciA9IHNvdXJjZS5fZGVidWdPd25lcjtcbiAgdGFyZ2V0Ll9kZWJ1Z05lZWRzUmVtb3VudCA9IHNvdXJjZS5fZGVidWdOZWVkc1JlbW91bnQ7XG4gIHRhcmdldC5fZGVidWdIb29rVHlwZXMgPSBzb3VyY2UuX2RlYnVnSG9va1R5cGVzO1xuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBGaWJlclJvb3ROb2RlKGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0ZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yKSB7XG4gIHRoaXMudGFnID0gdGFnO1xuICB0aGlzLmNvbnRhaW5lckluZm8gPSBjb250YWluZXJJbmZvO1xuICB0aGlzLnBlbmRpbmdDaGlsZHJlbiA9IG51bGw7XG4gIHRoaXMuY3VycmVudCA9IG51bGw7XG4gIHRoaXMucGluZ0NhY2hlID0gbnVsbDtcbiAgdGhpcy5maW5pc2hlZFdvcmsgPSBudWxsO1xuICB0aGlzLnRpbWVvdXRIYW5kbGUgPSBub1RpbWVvdXQ7XG4gIHRoaXMuY29udGV4dCA9IG51bGw7XG4gIHRoaXMucGVuZGluZ0NvbnRleHQgPSBudWxsO1xuICB0aGlzLmNhbGxiYWNrTm9kZSA9IG51bGw7XG4gIHRoaXMuY2FsbGJhY2tQcmlvcml0eSA9IE5vTGFuZTtcbiAgdGhpcy5ldmVudFRpbWVzID0gY3JlYXRlTGFuZU1hcChOb0xhbmVzKTtcbiAgdGhpcy5leHBpcmF0aW9uVGltZXMgPSBjcmVhdGVMYW5lTWFwKE5vVGltZXN0YW1wKTtcbiAgdGhpcy5wZW5kaW5nTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLnN1c3BlbmRlZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5waW5nZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHRoaXMuZXhwaXJlZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5tdXRhYmxlUmVhZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5maW5pc2hlZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5lbnRhbmdsZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHRoaXMuZW50YW5nbGVtZW50cyA9IGNyZWF0ZUxhbmVNYXAoTm9MYW5lcyk7XG4gIHRoaXMuaWRlbnRpZmllclByZWZpeCA9IGlkZW50aWZpZXJQcmVmaXg7XG4gIHRoaXMub25SZWNvdmVyYWJsZUVycm9yID0gb25SZWNvdmVyYWJsZUVycm9yO1xuXG4gIHtcbiAgICB0aGlzLm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGEgPSBudWxsO1xuICB9XG5cbiAge1xuICAgIHRoaXMuZWZmZWN0RHVyYXRpb24gPSAwO1xuICAgIHRoaXMucGFzc2l2ZUVmZmVjdER1cmF0aW9uID0gMDtcbiAgfVxuXG4gIHtcbiAgICB0aGlzLm1lbW9pemVkVXBkYXRlcnMgPSBuZXcgU2V0KCk7XG4gICAgdmFyIHBlbmRpbmdVcGRhdGVyc0xhbmVNYXAgPSB0aGlzLnBlbmRpbmdVcGRhdGVyc0xhbmVNYXAgPSBbXTtcblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBUb3RhbExhbmVzOyBfaSsrKSB7XG4gICAgICBwZW5kaW5nVXBkYXRlcnNMYW5lTWFwLnB1c2gobmV3IFNldCgpKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgQ29uY3VycmVudFJvb3Q6XG4gICAgICAgIHRoaXMuX2RlYnVnUm9vdFR5cGUgPSBoeWRyYXRlID8gJ2h5ZHJhdGVSb290KCknIDogJ2NyZWF0ZVJvb3QoKSc7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIExlZ2FjeVJvb3Q6XG4gICAgICAgIHRoaXMuX2RlYnVnUm9vdFR5cGUgPSBoeWRyYXRlID8gJ2h5ZHJhdGUoKScgOiAncmVuZGVyKCknO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlRmliZXJSb290KGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0ZSwgaW5pdGlhbENoaWxkcmVuLCBoeWRyYXRpb25DYWxsYmFja3MsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSwgLy8gVE9ETzogV2UgaGF2ZSBzZXZlcmFsIG9mIHRoZXNlIGFyZ3VtZW50cyB0aGF0IGFyZSBjb25jZXB0dWFsbHkgcGFydCBvZiB0aGVcbi8vIGhvc3QgY29uZmlnLCBidXQgYmVjYXVzZSB0aGV5IGFyZSBwYXNzZWQgaW4gYXQgcnVudGltZSwgd2UgaGF2ZSB0byB0aHJlYWRcbi8vIHRoZW0gdGhyb3VnaCB0aGUgcm9vdCBjb25zdHJ1Y3Rvci4gUGVyaGFwcyB3ZSBzaG91bGQgcHV0IHRoZW0gYWxsIGludG8gYVxuLy8gc2luZ2xlIHR5cGUsIGxpa2UgYSBEeW5hbWljSG9zdENvbmZpZyB0aGF0IGlzIGRlZmluZWQgYnkgdGhlIHJlbmRlcmVyLlxuaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yLCB0cmFuc2l0aW9uQ2FsbGJhY2tzKSB7XG4gIHZhciByb290ID0gbmV3IEZpYmVyUm9vdE5vZGUoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRlLCBpZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IpO1xuICAvLyBzdGF0ZU5vZGUgaXMgYW55LlxuXG5cbiAgdmFyIHVuaW5pdGlhbGl6ZWRGaWJlciA9IGNyZWF0ZUhvc3RSb290RmliZXIodGFnLCBpc1N0cmljdE1vZGUpO1xuICByb290LmN1cnJlbnQgPSB1bmluaXRpYWxpemVkRmliZXI7XG4gIHVuaW5pdGlhbGl6ZWRGaWJlci5zdGF0ZU5vZGUgPSByb290O1xuXG4gIHtcbiAgICB2YXIgX2luaXRpYWxTdGF0ZSA9IHtcbiAgICAgIGVsZW1lbnQ6IGluaXRpYWxDaGlsZHJlbixcbiAgICAgIGlzRGVoeWRyYXRlZDogaHlkcmF0ZSxcbiAgICAgIGNhY2hlOiBudWxsLFxuICAgICAgLy8gbm90IGVuYWJsZWQgeWV0XG4gICAgICB0cmFuc2l0aW9uczogbnVsbCxcbiAgICAgIHBlbmRpbmdTdXNwZW5zZUJvdW5kYXJpZXM6IG51bGxcbiAgICB9O1xuICAgIHVuaW5pdGlhbGl6ZWRGaWJlci5tZW1vaXplZFN0YXRlID0gX2luaXRpYWxTdGF0ZTtcbiAgfVxuXG4gIGluaXRpYWxpemVVcGRhdGVRdWV1ZSh1bmluaXRpYWxpemVkRmliZXIpO1xuICByZXR1cm4gcm9vdDtcbn1cblxudmFyIFJlYWN0VmVyc2lvbiA9ICcxOC4zLjEnO1xuXG5mdW5jdGlvbiBjcmVhdGVQb3J0YWwoY2hpbGRyZW4sIGNvbnRhaW5lckluZm8sIC8vIFRPRE86IGZpZ3VyZSBvdXQgdGhlIEFQSSBmb3IgY3Jvc3MtcmVuZGVyZXIgaW1wbGVtZW50YXRpb24uXG5pbXBsZW1lbnRhdGlvbikge1xuICB2YXIga2V5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBudWxsO1xuXG4gIHtcbiAgICBjaGVja0tleVN0cmluZ0NvZXJjaW9uKGtleSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC8vIFRoaXMgdGFnIGFsbG93IHVzIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMgYXMgYSBSZWFjdCBQb3J0YWxcbiAgICAkJHR5cGVvZjogUkVBQ1RfUE9SVEFMX1RZUEUsXG4gICAga2V5OiBrZXkgPT0gbnVsbCA/IG51bGwgOiAnJyArIGtleSxcbiAgICBjaGlsZHJlbjogY2hpbGRyZW4sXG4gICAgY29udGFpbmVySW5mbzogY29udGFpbmVySW5mbyxcbiAgICBpbXBsZW1lbnRhdGlvbjogaW1wbGVtZW50YXRpb25cbiAgfTtcbn1cblxudmFyIGRpZFdhcm5BYm91dE5lc3RlZFVwZGF0ZXM7XG52YXIgZGlkV2FybkFib3V0RmluZE5vZGVJblN0cmljdE1vZGU7XG5cbntcbiAgZGlkV2FybkFib3V0TmVzdGVkVXBkYXRlcyA9IGZhbHNlO1xuICBkaWRXYXJuQWJvdXRGaW5kTm9kZUluU3RyaWN0TW9kZSA9IHt9O1xufVxuXG5mdW5jdGlvbiBnZXRDb250ZXh0Rm9yU3VidHJlZShwYXJlbnRDb21wb25lbnQpIHtcbiAgaWYgKCFwYXJlbnRDb21wb25lbnQpIHtcbiAgICByZXR1cm4gZW1wdHlDb250ZXh0T2JqZWN0O1xuICB9XG5cbiAgdmFyIGZpYmVyID0gZ2V0KHBhcmVudENvbXBvbmVudCk7XG4gIHZhciBwYXJlbnRDb250ZXh0ID0gZmluZEN1cnJlbnRVbm1hc2tlZENvbnRleHQoZmliZXIpO1xuXG4gIGlmIChmaWJlci50YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgdmFyIENvbXBvbmVudCA9IGZpYmVyLnR5cGU7XG5cbiAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgcmV0dXJuIHByb2Nlc3NDaGlsZENvbnRleHQoZmliZXIsIENvbXBvbmVudCwgcGFyZW50Q29udGV4dCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBhcmVudENvbnRleHQ7XG59XG5cbmZ1bmN0aW9uIGZpbmRIb3N0SW5zdGFuY2VXaXRoV2FybmluZyhjb21wb25lbnQsIG1ldGhvZE5hbWUpIHtcbiAge1xuICAgIHZhciBmaWJlciA9IGdldChjb21wb25lbnQpO1xuXG4gICAgaWYgKGZpYmVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50LnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIG5vZGUgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoY29tcG9uZW50KS5qb2luKCcsJyk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFyZ3VtZW50IGFwcGVhcnMgdG8gbm90IGJlIGEgUmVhY3RDb21wb25lbnQuIEtleXM6IFwiICsga2V5cyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGhvc3RGaWJlciA9IGZpbmRDdXJyZW50SG9zdEZpYmVyKGZpYmVyKTtcblxuICAgIGlmIChob3N0RmliZXIgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChob3N0RmliZXIubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0RmluZE5vZGVJblN0cmljdE1vZGVbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZGlkV2FybkFib3V0RmluZE5vZGVJblN0cmljdE1vZGVbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgICB2YXIgcHJldmlvdXNGaWJlciA9IGN1cnJlbnQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzZXRDdXJyZW50RmliZXIoaG9zdEZpYmVyKTtcblxuICAgICAgICAgIGlmIChmaWJlci5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgICAgICAgZXJyb3IoJyVzIGlzIGRlcHJlY2F0ZWQgaW4gU3RyaWN0TW9kZS4gJyArICclcyB3YXMgcGFzc2VkIGFuIGluc3RhbmNlIG9mICVzIHdoaWNoIGlzIGluc2lkZSBTdHJpY3RNb2RlLiAnICsgJ0luc3RlYWQsIGFkZCBhIHJlZiBkaXJlY3RseSB0byB0aGUgZWxlbWVudCB5b3Ugd2FudCB0byByZWZlcmVuY2UuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1maW5kLW5vZGUnLCBtZXRob2ROYW1lLCBtZXRob2ROYW1lLCBjb21wb25lbnROYW1lKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXJyb3IoJyVzIGlzIGRlcHJlY2F0ZWQgaW4gU3RyaWN0TW9kZS4gJyArICclcyB3YXMgcGFzc2VkIGFuIGluc3RhbmNlIG9mICVzIHdoaWNoIHJlbmRlcnMgU3RyaWN0TW9kZSBjaGlsZHJlbi4gJyArICdJbnN0ZWFkLCBhZGQgYSByZWYgZGlyZWN0bHkgdG8gdGhlIGVsZW1lbnQgeW91IHdhbnQgdG8gcmVmZXJlbmNlLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtZmluZC1ub2RlJywgbWV0aG9kTmFtZSwgbWV0aG9kTmFtZSwgY29tcG9uZW50TmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIC8vIElkZWFsbHkgdGhpcyBzaG91bGQgcmVzZXQgdG8gcHJldmlvdXMgYnV0IHRoaXMgc2hvdWxkbid0IGJlIGNhbGxlZCBpblxuICAgICAgICAgIC8vIHJlbmRlciBhbmQgdGhlcmUncyBhbm90aGVyIHdhcm5pbmcgZm9yIHRoYXQgYW55d2F5LlxuICAgICAgICAgIGlmIChwcmV2aW91c0ZpYmVyKSB7XG4gICAgICAgICAgICBzZXRDdXJyZW50RmliZXIocHJldmlvdXNGaWJlcik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGhvc3RGaWJlci5zdGF0ZU5vZGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29udGFpbmVyKGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0aW9uQ2FsbGJhY2tzLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvciwgdHJhbnNpdGlvbkNhbGxiYWNrcykge1xuICB2YXIgaHlkcmF0ZSA9IGZhbHNlO1xuICB2YXIgaW5pdGlhbENoaWxkcmVuID0gbnVsbDtcbiAgcmV0dXJuIGNyZWF0ZUZpYmVyUm9vdChjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGUsIGluaXRpYWxDaGlsZHJlbiwgaHlkcmF0aW9uQ2FsbGJhY2tzLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvcik7XG59XG5mdW5jdGlvbiBjcmVhdGVIeWRyYXRpb25Db250YWluZXIoaW5pdGlhbENoaWxkcmVuLCAvLyBUT0RPOiBSZW1vdmUgYGNhbGxiYWNrYCB3aGVuIHdlIGRlbGV0ZSBsZWdhY3kgbW9kZS5cbmNhbGxiYWNrLCBjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGlvbkNhbGxiYWNrcywgaXNTdHJpY3RNb2RlLCBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLCBpZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IsIHRyYW5zaXRpb25DYWxsYmFja3MpIHtcbiAgdmFyIGh5ZHJhdGUgPSB0cnVlO1xuICB2YXIgcm9vdCA9IGNyZWF0ZUZpYmVyUm9vdChjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGUsIGluaXRpYWxDaGlsZHJlbiwgaHlkcmF0aW9uQ2FsbGJhY2tzLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvcik7IC8vIFRPRE86IE1vdmUgdGhpcyB0byBGaWJlclJvb3QgY29uc3RydWN0b3JcblxuICByb290LmNvbnRleHQgPSBnZXRDb250ZXh0Rm9yU3VidHJlZShudWxsKTsgLy8gU2NoZWR1bGUgdGhlIGluaXRpYWwgcmVuZGVyLiBJbiBhIGh5ZHJhdGlvbiByb290LCB0aGlzIGlzIGRpZmZlcmVudCBmcm9tXG4gIC8vIGEgcmVndWxhciB1cGRhdGUgYmVjYXVzZSB0aGUgaW5pdGlhbCByZW5kZXIgbXVzdCBtYXRjaCB3YXMgd2FzIHJlbmRlcmVkXG4gIC8vIG9uIHRoZSBzZXJ2ZXIuXG4gIC8vIE5PVEU6IFRoaXMgdXBkYXRlIGludGVudGlvbmFsbHkgZG9lc24ndCBoYXZlIGEgcGF5bG9hZC4gV2UncmUgb25seSB1c2luZ1xuICAvLyB0aGUgdXBkYXRlIHRvIHNjaGVkdWxlIHdvcmsgb24gdGhlIHJvb3QgZmliZXIgKGFuZCwgZm9yIGxlZ2FjeSByb290cywgdG9cbiAgLy8gZW5xdWV1ZSB0aGUgY2FsbGJhY2sgaWYgb25lIGlzIHByb3ZpZGVkKS5cblxuICB2YXIgY3VycmVudCA9IHJvb3QuY3VycmVudDtcbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShjdXJyZW50KTtcbiAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpO1xuICB1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjayAhPT0gdW5kZWZpbmVkICYmIGNhbGxiYWNrICE9PSBudWxsID8gY2FsbGJhY2sgOiBudWxsO1xuICBlbnF1ZXVlVXBkYXRlKGN1cnJlbnQsIHVwZGF0ZSwgbGFuZSk7XG4gIHNjaGVkdWxlSW5pdGlhbEh5ZHJhdGlvbk9uUm9vdChyb290LCBsYW5lLCBldmVudFRpbWUpO1xuICByZXR1cm4gcm9vdDtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUNvbnRhaW5lcihlbGVtZW50LCBjb250YWluZXIsIHBhcmVudENvbXBvbmVudCwgY2FsbGJhY2spIHtcbiAge1xuICAgIG9uU2NoZWR1bGVSb290KGNvbnRhaW5lciwgZWxlbWVudCk7XG4gIH1cblxuICB2YXIgY3VycmVudCQxID0gY29udGFpbmVyLmN1cnJlbnQ7XG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoY3VycmVudCQxKTtcblxuICB7XG4gICAgbWFya1JlbmRlclNjaGVkdWxlZChsYW5lKTtcbiAgfVxuXG4gIHZhciBjb250ZXh0ID0gZ2V0Q29udGV4dEZvclN1YnRyZWUocGFyZW50Q29tcG9uZW50KTtcblxuICBpZiAoY29udGFpbmVyLmNvbnRleHQgPT09IG51bGwpIHtcbiAgICBjb250YWluZXIuY29udGV4dCA9IGNvbnRleHQ7XG4gIH0gZWxzZSB7XG4gICAgY29udGFpbmVyLnBlbmRpbmdDb250ZXh0ID0gY29udGV4dDtcbiAgfVxuXG4gIHtcbiAgICBpZiAoaXNSZW5kZXJpbmcgJiYgY3VycmVudCAhPT0gbnVsbCAmJiAhZGlkV2FybkFib3V0TmVzdGVkVXBkYXRlcykge1xuICAgICAgZGlkV2FybkFib3V0TmVzdGVkVXBkYXRlcyA9IHRydWU7XG5cbiAgICAgIGVycm9yKCdSZW5kZXIgbWV0aG9kcyBzaG91bGQgYmUgYSBwdXJlIGZ1bmN0aW9uIG9mIHByb3BzIGFuZCBzdGF0ZTsgJyArICd0cmlnZ2VyaW5nIG5lc3RlZCBjb21wb25lbnQgdXBkYXRlcyBmcm9tIHJlbmRlciBpcyBub3QgYWxsb3dlZC4gJyArICdJZiBuZWNlc3NhcnksIHRyaWdnZXIgbmVzdGVkIHVwZGF0ZXMgaW4gY29tcG9uZW50RGlkVXBkYXRlLlxcblxcbicgKyAnQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgJXMuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihjdXJyZW50KSB8fCAnVW5rbm93bicpO1xuICAgIH1cbiAgfVxuXG4gIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKTsgLy8gQ2F1dGlvbjogUmVhY3QgRGV2VG9vbHMgY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcm9wZXJ0eVxuICAvLyBiZWluZyBjYWxsZWQgXCJlbGVtZW50XCIuXG5cbiAgdXBkYXRlLnBheWxvYWQgPSB7XG4gICAgZWxlbWVudDogZWxlbWVudFxuICB9O1xuICBjYWxsYmFjayA9IGNhbGxiYWNrID09PSB1bmRlZmluZWQgPyBudWxsIDogY2FsbGJhY2s7XG5cbiAgaWYgKGNhbGxiYWNrICE9PSBudWxsKSB7XG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBlcnJvcigncmVuZGVyKC4uLik6IEV4cGVjdGVkIHRoZSBsYXN0IG9wdGlvbmFsIGBjYWxsYmFja2AgYXJndW1lbnQgdG8gYmUgYSAnICsgJ2Z1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gIH1cblxuICB2YXIgcm9vdCA9IGVucXVldWVVcGRhdGUoY3VycmVudCQxLCB1cGRhdGUsIGxhbmUpO1xuXG4gIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGN1cnJlbnQkMSwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgICBlbnRhbmdsZVRyYW5zaXRpb25zKHJvb3QsIGN1cnJlbnQkMSwgbGFuZSk7XG4gIH1cblxuICByZXR1cm4gbGFuZTtcbn1cbmZ1bmN0aW9uIGdldFB1YmxpY1Jvb3RJbnN0YW5jZShjb250YWluZXIpIHtcbiAgdmFyIGNvbnRhaW5lckZpYmVyID0gY29udGFpbmVyLmN1cnJlbnQ7XG5cbiAgaWYgKCFjb250YWluZXJGaWJlci5jaGlsZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc3dpdGNoIChjb250YWluZXJGaWJlci5jaGlsZC50YWcpIHtcbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICByZXR1cm4gZ2V0UHVibGljSW5zdGFuY2UoY29udGFpbmVyRmliZXIuY2hpbGQuc3RhdGVOb2RlKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gY29udGFpbmVyRmliZXIuY2hpbGQuc3RhdGVOb2RlO1xuICB9XG59XG5mdW5jdGlvbiBhdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24kMShmaWJlcikge1xuICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHZhciByb290ID0gZmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmIChpc1Jvb3REZWh5ZHJhdGVkKHJvb3QpKSB7XG4gICAgICAgICAgLy8gRmx1c2ggdGhlIGZpcnN0IHNjaGVkdWxlZCBcInVwZGF0ZVwiLlxuICAgICAgICAgIHZhciBsYW5lcyA9IGdldEhpZ2hlc3RQcmlvcml0eVBlbmRpbmdMYW5lcyhyb290KTtcbiAgICAgICAgICBmbHVzaFJvb3Qocm9vdCwgbGFuZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgICAgICAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICAgICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIGV2ZW50VGltZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTsgLy8gSWYgd2UncmUgc3RpbGwgYmxvY2tlZCBhZnRlciB0aGlzLCB3ZSBuZWVkIHRvIGluY3JlYXNlXG4gICAgICAgIC8vIHRoZSBwcmlvcml0eSBvZiBhbnkgcHJvbWlzZXMgcmVzb2x2aW5nIHdpdGhpbiB0aGlzXG4gICAgICAgIC8vIGJvdW5kYXJ5IHNvIHRoYXQgdGhleSBuZXh0IGF0dGVtcHQgYWxzbyBoYXMgaGlnaGVyIHByaS5cblxuICAgICAgICB2YXIgcmV0cnlMYW5lID0gU3luY0xhbmU7XG4gICAgICAgIG1hcmtSZXRyeUxhbmVJZk5vdEh5ZHJhdGVkKGZpYmVyLCByZXRyeUxhbmUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtYXJrUmV0cnlMYW5lSW1wbChmaWJlciwgcmV0cnlMYW5lKSB7XG4gIHZhciBzdXNwZW5zZVN0YXRlID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAoc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCAmJiBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZSA9IGhpZ2hlclByaW9yaXR5TGFuZShzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZSwgcmV0cnlMYW5lKTtcbiAgfVxufSAvLyBJbmNyZWFzZXMgdGhlIHByaW9yaXR5IG9mIHRoZW5hYmxlcyB3aGVuIHRoZXkgcmVzb2x2ZSB3aXRoaW4gdGhpcyBib3VuZGFyeS5cblxuXG5mdW5jdGlvbiBtYXJrUmV0cnlMYW5lSWZOb3RIeWRyYXRlZChmaWJlciwgcmV0cnlMYW5lKSB7XG4gIG1hcmtSZXRyeUxhbmVJbXBsKGZpYmVyLCByZXRyeUxhbmUpO1xuICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gIGlmIChhbHRlcm5hdGUpIHtcbiAgICBtYXJrUmV0cnlMYW5lSW1wbChhbHRlcm5hdGUsIHJldHJ5TGFuZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uJDEoZmliZXIpIHtcbiAgaWYgKGZpYmVyLnRhZyAhPT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICAvLyBXZSBpZ25vcmUgSG9zdFJvb3RzIGhlcmUgYmVjYXVzZSB3ZSBjYW4ndCBpbmNyZWFzZVxuICAgIC8vIHRoZWlyIHByaW9yaXR5IGFuZCB0aGV5IHNob3VsZCBub3Qgc3VzcGVuZCBvbiBJL08sXG4gICAgLy8gc2luY2UgeW91IGhhdmUgdG8gd3JhcCBhbnl0aGluZyB0aGF0IG1pZ2h0IHN1c3BlbmQgaW5cbiAgICAvLyBTdXNwZW5zZS5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgbGFuZSA9IFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmU7XG4gIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBsYW5lKTtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBsYW5lLCBldmVudFRpbWUpO1xuICB9XG5cbiAgbWFya1JldHJ5TGFuZUlmTm90SHlkcmF0ZWQoZmliZXIsIGxhbmUpO1xufVxuZnVuY3Rpb24gYXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5JDEoZmliZXIpIHtcbiAgaWYgKGZpYmVyLnRhZyAhPT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICAvLyBXZSBpZ25vcmUgSG9zdFJvb3RzIGhlcmUgYmVjYXVzZSB3ZSBjYW4ndCBpbmNyZWFzZVxuICAgIC8vIHRoZWlyIHByaW9yaXR5IG90aGVyIHRoYW4gc3luY2hyb25vdXNseSBmbHVzaCBpdC5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIGxhbmUpO1xuXG4gIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gIH1cblxuICBtYXJrUmV0cnlMYW5lSWZOb3RIeWRyYXRlZChmaWJlciwgbGFuZSk7XG59XG5mdW5jdGlvbiBmaW5kSG9zdEluc3RhbmNlV2l0aE5vUG9ydGFscyhmaWJlcikge1xuICB2YXIgaG9zdEZpYmVyID0gZmluZEN1cnJlbnRIb3N0RmliZXJXaXRoTm9Qb3J0YWxzKGZpYmVyKTtcblxuICBpZiAoaG9zdEZpYmVyID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gaG9zdEZpYmVyLnN0YXRlTm9kZTtcbn1cblxudmFyIHNob3VsZEVycm9ySW1wbCA9IGZ1bmN0aW9uIChmaWJlcikge1xuICByZXR1cm4gbnVsbDtcbn07XG5cbmZ1bmN0aW9uIHNob3VsZEVycm9yKGZpYmVyKSB7XG4gIHJldHVybiBzaG91bGRFcnJvckltcGwoZmliZXIpO1xufVxuXG52YXIgc2hvdWxkU3VzcGVuZEltcGwgPSBmdW5jdGlvbiAoZmliZXIpIHtcbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuZnVuY3Rpb24gc2hvdWxkU3VzcGVuZChmaWJlcikge1xuICByZXR1cm4gc2hvdWxkU3VzcGVuZEltcGwoZmliZXIpO1xufVxudmFyIG92ZXJyaWRlSG9va1N0YXRlID0gbnVsbDtcbnZhciBvdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGggPSBudWxsO1xudmFyIG92ZXJyaWRlSG9va1N0YXRlUmVuYW1lUGF0aCA9IG51bGw7XG52YXIgb3ZlcnJpZGVQcm9wcyA9IG51bGw7XG52YXIgb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGggPSBudWxsO1xudmFyIG92ZXJyaWRlUHJvcHNSZW5hbWVQYXRoID0gbnVsbDtcbnZhciBzY2hlZHVsZVVwZGF0ZSA9IG51bGw7XG52YXIgc2V0RXJyb3JIYW5kbGVyID0gbnVsbDtcbnZhciBzZXRTdXNwZW5zZUhhbmRsZXIgPSBudWxsO1xuXG57XG4gIHZhciBjb3B5V2l0aERlbGV0ZUltcGwgPSBmdW5jdGlvbiAob2JqLCBwYXRoLCBpbmRleCkge1xuICAgIHZhciBrZXkgPSBwYXRoW2luZGV4XTtcbiAgICB2YXIgdXBkYXRlZCA9IGlzQXJyYXkob2JqKSA/IG9iai5zbGljZSgpIDogYXNzaWduKHt9LCBvYmopO1xuXG4gICAgaWYgKGluZGV4ICsgMSA9PT0gcGF0aC5sZW5ndGgpIHtcbiAgICAgIGlmIChpc0FycmF5KHVwZGF0ZWQpKSB7XG4gICAgICAgIHVwZGF0ZWQuc3BsaWNlKGtleSwgMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgdXBkYXRlZFtrZXldO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICB9IC8vICRGbG93Rml4TWUgbnVtYmVyIG9yIHN0cmluZyBpcyBmaW5lIGhlcmVcblxuXG4gICAgdXBkYXRlZFtrZXldID0gY29weVdpdGhEZWxldGVJbXBsKG9ialtrZXldLCBwYXRoLCBpbmRleCArIDEpO1xuICAgIHJldHVybiB1cGRhdGVkO1xuICB9O1xuXG4gIHZhciBjb3B5V2l0aERlbGV0ZSA9IGZ1bmN0aW9uIChvYmosIHBhdGgpIHtcbiAgICByZXR1cm4gY29weVdpdGhEZWxldGVJbXBsKG9iaiwgcGF0aCwgMCk7XG4gIH07XG5cbiAgdmFyIGNvcHlXaXRoUmVuYW1lSW1wbCA9IGZ1bmN0aW9uIChvYmosIG9sZFBhdGgsIG5ld1BhdGgsIGluZGV4KSB7XG4gICAgdmFyIG9sZEtleSA9IG9sZFBhdGhbaW5kZXhdO1xuICAgIHZhciB1cGRhdGVkID0gaXNBcnJheShvYmopID8gb2JqLnNsaWNlKCkgOiBhc3NpZ24oe30sIG9iaik7XG5cbiAgICBpZiAoaW5kZXggKyAxID09PSBvbGRQYXRoLmxlbmd0aCkge1xuICAgICAgdmFyIG5ld0tleSA9IG5ld1BhdGhbaW5kZXhdOyAvLyAkRmxvd0ZpeE1lIG51bWJlciBvciBzdHJpbmcgaXMgZmluZSBoZXJlXG5cbiAgICAgIHVwZGF0ZWRbbmV3S2V5XSA9IHVwZGF0ZWRbb2xkS2V5XTtcblxuICAgICAgaWYgKGlzQXJyYXkodXBkYXRlZCkpIHtcbiAgICAgICAgdXBkYXRlZC5zcGxpY2Uob2xkS2V5LCAxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSB1cGRhdGVkW29sZEtleV07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vICRGbG93Rml4TWUgbnVtYmVyIG9yIHN0cmluZyBpcyBmaW5lIGhlcmVcbiAgICAgIHVwZGF0ZWRbb2xkS2V5XSA9IGNvcHlXaXRoUmVuYW1lSW1wbCggLy8gJEZsb3dGaXhNZSBudW1iZXIgb3Igc3RyaW5nIGlzIGZpbmUgaGVyZVxuICAgICAgb2JqW29sZEtleV0sIG9sZFBhdGgsIG5ld1BhdGgsIGluZGV4ICsgMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZWQ7XG4gIH07XG5cbiAgdmFyIGNvcHlXaXRoUmVuYW1lID0gZnVuY3Rpb24gKG9iaiwgb2xkUGF0aCwgbmV3UGF0aCkge1xuICAgIGlmIChvbGRQYXRoLmxlbmd0aCAhPT0gbmV3UGF0aC5sZW5ndGgpIHtcbiAgICAgIHdhcm4oJ2NvcHlXaXRoUmVuYW1lKCkgZXhwZWN0cyBwYXRocyBvZiB0aGUgc2FtZSBsZW5ndGgnKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5ld1BhdGgubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGlmIChvbGRQYXRoW2ldICE9PSBuZXdQYXRoW2ldKSB7XG4gICAgICAgICAgd2FybignY29weVdpdGhSZW5hbWUoKSBleHBlY3RzIHBhdGhzIHRvIGJlIHRoZSBzYW1lIGV4Y2VwdCBmb3IgdGhlIGRlZXBlc3Qga2V5Jyk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29weVdpdGhSZW5hbWVJbXBsKG9iaiwgb2xkUGF0aCwgbmV3UGF0aCwgMCk7XG4gIH07XG5cbiAgdmFyIGNvcHlXaXRoU2V0SW1wbCA9IGZ1bmN0aW9uIChvYmosIHBhdGgsIGluZGV4LCB2YWx1ZSkge1xuICAgIGlmIChpbmRleCA+PSBwYXRoLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHZhciBrZXkgPSBwYXRoW2luZGV4XTtcbiAgICB2YXIgdXBkYXRlZCA9IGlzQXJyYXkob2JqKSA/IG9iai5zbGljZSgpIDogYXNzaWduKHt9LCBvYmopOyAvLyAkRmxvd0ZpeE1lIG51bWJlciBvciBzdHJpbmcgaXMgZmluZSBoZXJlXG5cbiAgICB1cGRhdGVkW2tleV0gPSBjb3B5V2l0aFNldEltcGwob2JqW2tleV0sIHBhdGgsIGluZGV4ICsgMSwgdmFsdWUpO1xuICAgIHJldHVybiB1cGRhdGVkO1xuICB9O1xuXG4gIHZhciBjb3B5V2l0aFNldCA9IGZ1bmN0aW9uIChvYmosIHBhdGgsIHZhbHVlKSB7XG4gICAgcmV0dXJuIGNvcHlXaXRoU2V0SW1wbChvYmosIHBhdGgsIDAsIHZhbHVlKTtcbiAgfTtcblxuICB2YXIgZmluZEhvb2sgPSBmdW5jdGlvbiAoZmliZXIsIGlkKSB7XG4gICAgLy8gRm9yIG5vdywgdGhlIFwiaWRcIiBvZiBzdGF0ZWZ1bCBob29rcyBpcyBqdXN0IHRoZSBzdGF0ZWZ1bCBob29rIGluZGV4LlxuICAgIC8vIFRoaXMgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlIHdpdGggZS5nLiBuZXN0ZWQgaG9va3MuXG4gICAgdmFyIGN1cnJlbnRIb29rID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcblxuICAgIHdoaWxlIChjdXJyZW50SG9vayAhPT0gbnVsbCAmJiBpZCA+IDApIHtcbiAgICAgIGN1cnJlbnRIb29rID0gY3VycmVudEhvb2submV4dDtcbiAgICAgIGlkLS07XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnRIb29rO1xuICB9OyAvLyBTdXBwb3J0IERldlRvb2xzIGVkaXRhYmxlIHZhbHVlcyBmb3IgdXNlU3RhdGUgYW5kIHVzZVJlZHVjZXIuXG5cblxuICBvdmVycmlkZUhvb2tTdGF0ZSA9IGZ1bmN0aW9uIChmaWJlciwgaWQsIHBhdGgsIHZhbHVlKSB7XG4gICAgdmFyIGhvb2sgPSBmaW5kSG9vayhmaWJlciwgaWQpO1xuXG4gICAgaWYgKGhvb2sgIT09IG51bGwpIHtcbiAgICAgIHZhciBuZXdTdGF0ZSA9IGNvcHlXaXRoU2V0KGhvb2subWVtb2l6ZWRTdGF0ZSwgcGF0aCwgdmFsdWUpO1xuICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gICAgICBob29rLmJhc2VTdGF0ZSA9IG5ld1N0YXRlOyAvLyBXZSBhcmVuJ3QgYWN0dWFsbHkgYWRkaW5nIGFuIHVwZGF0ZSB0byB0aGUgcXVldWUsXG4gICAgICAvLyBiZWNhdXNlIHRoZXJlIGlzIG5vIHVwZGF0ZSB3ZSBjYW4gYWRkIGZvciB1c2VSZWR1Y2VyIGhvb2tzIHRoYXQgd29uJ3QgdHJpZ2dlciBhbiBlcnJvci5cbiAgICAgIC8vIChUaGVyZSdzIG5vIGFwcHJvcHJpYXRlIGFjdGlvbiB0eXBlIGZvciBEZXZUb29scyBvdmVycmlkZXMuKVxuICAgICAgLy8gQXMgYSByZXN1bHQgdGhvdWdoLCBSZWFjdCB3aWxsIHNlZSB0aGUgc2NoZWR1bGVkIHVwZGF0ZSBhcyBhIG5vb3AgYW5kIGJhaWxvdXQuXG4gICAgICAvLyBTaGFsbG93IGNsb25pbmcgcHJvcHMgd29ya3MgYXMgYSB3b3JrYXJvdW5kIGZvciBub3cgdG8gYnlwYXNzIHRoZSBiYWlsb3V0IGNoZWNrLlxuXG4gICAgICBmaWJlci5tZW1vaXplZFByb3BzID0gYXNzaWduKHt9LCBmaWJlci5tZW1vaXplZFByb3BzKTtcbiAgICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoID0gZnVuY3Rpb24gKGZpYmVyLCBpZCwgcGF0aCkge1xuICAgIHZhciBob29rID0gZmluZEhvb2soZmliZXIsIGlkKTtcblxuICAgIGlmIChob29rICE9PSBudWxsKSB7XG4gICAgICB2YXIgbmV3U3RhdGUgPSBjb3B5V2l0aERlbGV0ZShob29rLm1lbW9pemVkU3RhdGUsIHBhdGgpO1xuICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gICAgICBob29rLmJhc2VTdGF0ZSA9IG5ld1N0YXRlOyAvLyBXZSBhcmVuJ3QgYWN0dWFsbHkgYWRkaW5nIGFuIHVwZGF0ZSB0byB0aGUgcXVldWUsXG4gICAgICAvLyBiZWNhdXNlIHRoZXJlIGlzIG5vIHVwZGF0ZSB3ZSBjYW4gYWRkIGZvciB1c2VSZWR1Y2VyIGhvb2tzIHRoYXQgd29uJ3QgdHJpZ2dlciBhbiBlcnJvci5cbiAgICAgIC8vIChUaGVyZSdzIG5vIGFwcHJvcHJpYXRlIGFjdGlvbiB0eXBlIGZvciBEZXZUb29scyBvdmVycmlkZXMuKVxuICAgICAgLy8gQXMgYSByZXN1bHQgdGhvdWdoLCBSZWFjdCB3aWxsIHNlZSB0aGUgc2NoZWR1bGVkIHVwZGF0ZSBhcyBhIG5vb3AgYW5kIGJhaWxvdXQuXG4gICAgICAvLyBTaGFsbG93IGNsb25pbmcgcHJvcHMgd29ya3MgYXMgYSB3b3JrYXJvdW5kIGZvciBub3cgdG8gYnlwYXNzIHRoZSBiYWlsb3V0IGNoZWNrLlxuXG4gICAgICBmaWJlci5tZW1vaXplZFByb3BzID0gYXNzaWduKHt9LCBmaWJlci5tZW1vaXplZFByb3BzKTtcbiAgICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoID0gZnVuY3Rpb24gKGZpYmVyLCBpZCwgb2xkUGF0aCwgbmV3UGF0aCkge1xuICAgIHZhciBob29rID0gZmluZEhvb2soZmliZXIsIGlkKTtcblxuICAgIGlmIChob29rICE9PSBudWxsKSB7XG4gICAgICB2YXIgbmV3U3RhdGUgPSBjb3B5V2l0aFJlbmFtZShob29rLm1lbW9pemVkU3RhdGUsIG9sZFBhdGgsIG5ld1BhdGgpO1xuICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gICAgICBob29rLmJhc2VTdGF0ZSA9IG5ld1N0YXRlOyAvLyBXZSBhcmVuJ3QgYWN0dWFsbHkgYWRkaW5nIGFuIHVwZGF0ZSB0byB0aGUgcXVldWUsXG4gICAgICAvLyBiZWNhdXNlIHRoZXJlIGlzIG5vIHVwZGF0ZSB3ZSBjYW4gYWRkIGZvciB1c2VSZWR1Y2VyIGhvb2tzIHRoYXQgd29uJ3QgdHJpZ2dlciBhbiBlcnJvci5cbiAgICAgIC8vIChUaGVyZSdzIG5vIGFwcHJvcHJpYXRlIGFjdGlvbiB0eXBlIGZvciBEZXZUb29scyBvdmVycmlkZXMuKVxuICAgICAgLy8gQXMgYSByZXN1bHQgdGhvdWdoLCBSZWFjdCB3aWxsIHNlZSB0aGUgc2NoZWR1bGVkIHVwZGF0ZSBhcyBhIG5vb3AgYW5kIGJhaWxvdXQuXG4gICAgICAvLyBTaGFsbG93IGNsb25pbmcgcHJvcHMgd29ya3MgYXMgYSB3b3JrYXJvdW5kIGZvciBub3cgdG8gYnlwYXNzIHRoZSBiYWlsb3V0IGNoZWNrLlxuXG4gICAgICBmaWJlci5tZW1vaXplZFByb3BzID0gYXNzaWduKHt9LCBmaWJlci5tZW1vaXplZFByb3BzKTtcbiAgICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICAgIH1cbiAgICB9XG4gIH07IC8vIFN1cHBvcnQgRGV2VG9vbHMgcHJvcHMgZm9yIGZ1bmN0aW9uIGNvbXBvbmVudHMsIGZvcndhcmRSZWYsIG1lbW8sIGhvc3QgY29tcG9uZW50cywgZXRjLlxuXG5cbiAgb3ZlcnJpZGVQcm9wcyA9IGZ1bmN0aW9uIChmaWJlciwgcGF0aCwgdmFsdWUpIHtcbiAgICBmaWJlci5wZW5kaW5nUHJvcHMgPSBjb3B5V2l0aFNldChmaWJlci5tZW1vaXplZFByb3BzLCBwYXRoLCB2YWx1ZSk7XG5cbiAgICBpZiAoZmliZXIuYWx0ZXJuYXRlKSB7XG4gICAgICBmaWJlci5hbHRlcm5hdGUucGVuZGluZ1Byb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgIH1cblxuICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgIH1cbiAgfTtcblxuICBvdmVycmlkZVByb3BzRGVsZXRlUGF0aCA9IGZ1bmN0aW9uIChmaWJlciwgcGF0aCkge1xuICAgIGZpYmVyLnBlbmRpbmdQcm9wcyA9IGNvcHlXaXRoRGVsZXRlKGZpYmVyLm1lbW9pemVkUHJvcHMsIHBhdGgpO1xuXG4gICAgaWYgKGZpYmVyLmFsdGVybmF0ZSkge1xuICAgICAgZmliZXIuYWx0ZXJuYXRlLnBlbmRpbmdQcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICB9XG5cbiAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICB9XG4gIH07XG5cbiAgb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGggPSBmdW5jdGlvbiAoZmliZXIsIG9sZFBhdGgsIG5ld1BhdGgpIHtcbiAgICBmaWJlci5wZW5kaW5nUHJvcHMgPSBjb3B5V2l0aFJlbmFtZShmaWJlci5tZW1vaXplZFByb3BzLCBvbGRQYXRoLCBuZXdQYXRoKTtcblxuICAgIGlmIChmaWJlci5hbHRlcm5hdGUpIHtcbiAgICAgIGZpYmVyLmFsdGVybmF0ZS5wZW5kaW5nUHJvcHMgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgfVxuXG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgfVxuICB9O1xuXG4gIHNjaGVkdWxlVXBkYXRlID0gZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgfVxuICB9O1xuXG4gIHNldEVycm9ySGFuZGxlciA9IGZ1bmN0aW9uIChuZXdTaG91bGRFcnJvckltcGwpIHtcbiAgICBzaG91bGRFcnJvckltcGwgPSBuZXdTaG91bGRFcnJvckltcGw7XG4gIH07XG5cbiAgc2V0U3VzcGVuc2VIYW5kbGVyID0gZnVuY3Rpb24gKG5ld1Nob3VsZFN1c3BlbmRJbXBsKSB7XG4gICAgc2hvdWxkU3VzcGVuZEltcGwgPSBuZXdTaG91bGRTdXNwZW5kSW1wbDtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZmluZEhvc3RJbnN0YW5jZUJ5RmliZXIoZmliZXIpIHtcbiAgdmFyIGhvc3RGaWJlciA9IGZpbmRDdXJyZW50SG9zdEZpYmVyKGZpYmVyKTtcblxuICBpZiAoaG9zdEZpYmVyID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gaG9zdEZpYmVyLnN0YXRlTm9kZTtcbn1cblxuZnVuY3Rpb24gZW1wdHlGaW5kRmliZXJCeUhvc3RJbnN0YW5jZShpbnN0YW5jZSkge1xuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0Q3VycmVudEZpYmVyRm9yRGV2VG9vbHMoKSB7XG4gIHJldHVybiBjdXJyZW50O1xufVxuXG5mdW5jdGlvbiBpbmplY3RJbnRvRGV2VG9vbHMoZGV2VG9vbHNDb25maWcpIHtcbiAgdmFyIGZpbmRGaWJlckJ5SG9zdEluc3RhbmNlID0gZGV2VG9vbHNDb25maWcuZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U7XG4gIHZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjtcbiAgcmV0dXJuIGluamVjdEludGVybmFscyh7XG4gICAgYnVuZGxlVHlwZTogZGV2VG9vbHNDb25maWcuYnVuZGxlVHlwZSxcbiAgICB2ZXJzaW9uOiBkZXZUb29sc0NvbmZpZy52ZXJzaW9uLFxuICAgIHJlbmRlcmVyUGFja2FnZU5hbWU6IGRldlRvb2xzQ29uZmlnLnJlbmRlcmVyUGFja2FnZU5hbWUsXG4gICAgcmVuZGVyZXJDb25maWc6IGRldlRvb2xzQ29uZmlnLnJlbmRlcmVyQ29uZmlnLFxuICAgIG92ZXJyaWRlSG9va1N0YXRlOiBvdmVycmlkZUhvb2tTdGF0ZSxcbiAgICBvdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGg6IG92ZXJyaWRlSG9va1N0YXRlRGVsZXRlUGF0aCxcbiAgICBvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGg6IG92ZXJyaWRlSG9va1N0YXRlUmVuYW1lUGF0aCxcbiAgICBvdmVycmlkZVByb3BzOiBvdmVycmlkZVByb3BzLFxuICAgIG92ZXJyaWRlUHJvcHNEZWxldGVQYXRoOiBvdmVycmlkZVByb3BzRGVsZXRlUGF0aCxcbiAgICBvdmVycmlkZVByb3BzUmVuYW1lUGF0aDogb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGgsXG4gICAgc2V0RXJyb3JIYW5kbGVyOiBzZXRFcnJvckhhbmRsZXIsXG4gICAgc2V0U3VzcGVuc2VIYW5kbGVyOiBzZXRTdXNwZW5zZUhhbmRsZXIsXG4gICAgc2NoZWR1bGVVcGRhdGU6IHNjaGVkdWxlVXBkYXRlLFxuICAgIGN1cnJlbnREaXNwYXRjaGVyUmVmOiBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLFxuICAgIGZpbmRIb3N0SW5zdGFuY2VCeUZpYmVyOiBmaW5kSG9zdEluc3RhbmNlQnlGaWJlcixcbiAgICBmaW5kRmliZXJCeUhvc3RJbnN0YW5jZTogZmluZEZpYmVyQnlIb3N0SW5zdGFuY2UgfHwgZW1wdHlGaW5kRmliZXJCeUhvc3RJbnN0YW5jZSxcbiAgICAvLyBSZWFjdCBSZWZyZXNoXG4gICAgZmluZEhvc3RJbnN0YW5jZXNGb3JSZWZyZXNoOiAgZmluZEhvc3RJbnN0YW5jZXNGb3JSZWZyZXNoICxcbiAgICBzY2hlZHVsZVJlZnJlc2g6ICBzY2hlZHVsZVJlZnJlc2ggLFxuICAgIHNjaGVkdWxlUm9vdDogIHNjaGVkdWxlUm9vdCAsXG4gICAgc2V0UmVmcmVzaEhhbmRsZXI6ICBzZXRSZWZyZXNoSGFuZGxlciAsXG4gICAgLy8gRW5hYmxlcyBEZXZUb29scyB0byBhcHBlbmQgb3duZXIgc3RhY2tzIHRvIGVycm9yIG1lc3NhZ2VzIGluIERFViBtb2RlLlxuICAgIGdldEN1cnJlbnRGaWJlcjogIGdldEN1cnJlbnRGaWJlckZvckRldlRvb2xzICxcbiAgICAvLyBFbmFibGVzIERldlRvb2xzIHRvIGRldGVjdCByZWNvbmNpbGVyIHZlcnNpb24gcmF0aGVyIHRoYW4gcmVuZGVyZXIgdmVyc2lvblxuICAgIC8vIHdoaWNoIG1heSBub3QgbWF0Y2ggZm9yIHRoaXJkIHBhcnR5IHJlbmRlcmVycy5cbiAgICByZWNvbmNpbGVyVmVyc2lvbjogUmVhY3RWZXJzaW9uXG4gIH0pO1xufVxuXG4vKiBnbG9iYWwgcmVwb3J0RXJyb3IgKi9cblxudmFyIGRlZmF1bHRPblJlY292ZXJhYmxlRXJyb3IgPSB0eXBlb2YgcmVwb3J0RXJyb3IgPT09ICdmdW5jdGlvbicgPyAvLyBJbiBtb2Rlcm4gYnJvd3NlcnMsIHJlcG9ydEVycm9yIHdpbGwgZGlzcGF0Y2ggYW4gZXJyb3IgZXZlbnQsXG4vLyBlbXVsYXRpbmcgYW4gdW5jYXVnaHQgSmF2YVNjcmlwdCBlcnJvci5cbnJlcG9ydEVycm9yIDogZnVuY3Rpb24gKGVycm9yKSB7XG4gIC8vIEluIG9sZGVyIGJyb3dzZXJzIGFuZCB0ZXN0IGVudmlyb25tZW50cywgZmFsbGJhY2sgdG8gY29uc29sZS5lcnJvci5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZ1xuICBjb25zb2xlWydlcnJvciddKGVycm9yKTtcbn07XG5cbmZ1bmN0aW9uIFJlYWN0RE9NUm9vdChpbnRlcm5hbFJvb3QpIHtcbiAgdGhpcy5faW50ZXJuYWxSb290ID0gaW50ZXJuYWxSb290O1xufVxuXG5SZWFjdERPTUh5ZHJhdGlvblJvb3QucHJvdG90eXBlLnJlbmRlciA9IFJlYWN0RE9NUm9vdC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKGNoaWxkcmVuKSB7XG4gIHZhciByb290ID0gdGhpcy5faW50ZXJuYWxSb290O1xuXG4gIGlmIChyb290ID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgdXBkYXRlIGFuIHVubW91bnRlZCByb290LicpO1xuICB9XG5cbiAge1xuICAgIGlmICh0eXBlb2YgYXJndW1lbnRzWzFdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcigncmVuZGVyKC4uLik6IGRvZXMgbm90IHN1cHBvcnQgdGhlIHNlY29uZCBjYWxsYmFjayBhcmd1bWVudC4gJyArICdUbyBleGVjdXRlIGEgc2lkZSBlZmZlY3QgYWZ0ZXIgcmVuZGVyaW5nLCBkZWNsYXJlIGl0IGluIGEgY29tcG9uZW50IGJvZHkgd2l0aCB1c2VFZmZlY3QoKS4nKTtcbiAgICB9IGVsc2UgaWYgKGlzVmFsaWRDb250YWluZXIoYXJndW1lbnRzWzFdKSkge1xuICAgICAgZXJyb3IoJ1lvdSBwYXNzZWQgYSBjb250YWluZXIgdG8gdGhlIHNlY29uZCBhcmd1bWVudCBvZiByb290LnJlbmRlciguLi4pLiAnICsgXCJZb3UgZG9uJ3QgbmVlZCB0byBwYXNzIGl0IGFnYWluIHNpbmNlIHlvdSBhbHJlYWR5IHBhc3NlZCBpdCB0byBjcmVhdGUgdGhlIHJvb3QuXCIpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZ3VtZW50c1sxXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGVycm9yKCdZb3UgcGFzc2VkIGEgc2Vjb25kIGFyZ3VtZW50IHRvIHJvb3QucmVuZGVyKC4uLikgYnV0IGl0IG9ubHkgYWNjZXB0cyAnICsgJ29uZSBhcmd1bWVudC4nKTtcbiAgICB9XG5cbiAgICB2YXIgY29udGFpbmVyID0gcm9vdC5jb250YWluZXJJbmZvO1xuXG4gICAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSAhPT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgICB2YXIgaG9zdEluc3RhbmNlID0gZmluZEhvc3RJbnN0YW5jZVdpdGhOb1BvcnRhbHMocm9vdC5jdXJyZW50KTtcblxuICAgICAgaWYgKGhvc3RJbnN0YW5jZSkge1xuICAgICAgICBpZiAoaG9zdEluc3RhbmNlLnBhcmVudE5vZGUgIT09IGNvbnRhaW5lcikge1xuICAgICAgICAgIGVycm9yKCdyZW5kZXIoLi4uKTogSXQgbG9va3MgbGlrZSB0aGUgUmVhY3QtcmVuZGVyZWQgY29udGVudCBvZiB0aGUgJyArICdyb290IGNvbnRhaW5lciB3YXMgcmVtb3ZlZCB3aXRob3V0IHVzaW5nIFJlYWN0LiBUaGlzIGlzIG5vdCAnICsgJ3N1cHBvcnRlZCBhbmQgd2lsbCBjYXVzZSBlcnJvcnMuIEluc3RlYWQsIGNhbGwgJyArIFwicm9vdC51bm1vdW50KCkgdG8gZW1wdHkgYSByb290J3MgY29udGFpbmVyLlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUNvbnRhaW5lcihjaGlsZHJlbiwgcm9vdCwgbnVsbCwgbnVsbCk7XG59O1xuXG5SZWFjdERPTUh5ZHJhdGlvblJvb3QucHJvdG90eXBlLnVubW91bnQgPSBSZWFjdERPTVJvb3QucHJvdG90eXBlLnVubW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1swXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ3VubW91bnQoLi4uKTogZG9lcyBub3Qgc3VwcG9ydCBhIGNhbGxiYWNrIGFyZ3VtZW50LiAnICsgJ1RvIGV4ZWN1dGUgYSBzaWRlIGVmZmVjdCBhZnRlciByZW5kZXJpbmcsIGRlY2xhcmUgaXQgaW4gYSBjb21wb25lbnQgYm9keSB3aXRoIHVzZUVmZmVjdCgpLicpO1xuICAgIH1cbiAgfVxuXG4gIHZhciByb290ID0gdGhpcy5faW50ZXJuYWxSb290O1xuXG4gIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgdGhpcy5faW50ZXJuYWxSb290ID0gbnVsbDtcbiAgICB2YXIgY29udGFpbmVyID0gcm9vdC5jb250YWluZXJJbmZvO1xuXG4gICAge1xuICAgICAgaWYgKGlzQWxyZWFkeVJlbmRlcmluZygpKSB7XG4gICAgICAgIGVycm9yKCdBdHRlbXB0ZWQgdG8gc3luY2hyb25vdXNseSB1bm1vdW50IGEgcm9vdCB3aGlsZSBSZWFjdCB3YXMgYWxyZWFkeSAnICsgJ3JlbmRlcmluZy4gUmVhY3QgY2Fubm90IGZpbmlzaCB1bm1vdW50aW5nIHRoZSByb290IHVudGlsIHRoZSAnICsgJ2N1cnJlbnQgcmVuZGVyIGhhcyBjb21wbGV0ZWQsIHdoaWNoIG1heSBsZWFkIHRvIGEgcmFjZSBjb25kaXRpb24uJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmx1c2hTeW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgIHVwZGF0ZUNvbnRhaW5lcihudWxsLCByb290LCBudWxsLCBudWxsKTtcbiAgICB9KTtcbiAgICB1bm1hcmtDb250YWluZXJBc1Jvb3QoY29udGFpbmVyKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gY3JlYXRlUm9vdChjb250YWluZXIsIG9wdGlvbnMpIHtcbiAgaWYgKCFpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lcikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NyZWF0ZVJvb3QoLi4uKTogVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC4nKTtcbiAgfVxuXG4gIHdhcm5JZlJlYWN0RE9NQ29udGFpbmVySW5ERVYoY29udGFpbmVyKTtcbiAgdmFyIGlzU3RyaWN0TW9kZSA9IGZhbHNlO1xuICB2YXIgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSA9IGZhbHNlO1xuICB2YXIgaWRlbnRpZmllclByZWZpeCA9ICcnO1xuICB2YXIgb25SZWNvdmVyYWJsZUVycm9yID0gZGVmYXVsdE9uUmVjb3ZlcmFibGVFcnJvcjtcbiAgdmFyIHRyYW5zaXRpb25DYWxsYmFja3MgPSBudWxsO1xuXG4gIGlmIChvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgIHtcbiAgICAgIGlmIChvcHRpb25zLmh5ZHJhdGUpIHtcbiAgICAgICAgd2FybignaHlkcmF0ZSB0aHJvdWdoIGNyZWF0ZVJvb3QgaXMgZGVwcmVjYXRlZC4gVXNlIFJlYWN0RE9NQ2xpZW50Lmh5ZHJhdGVSb290KGNvbnRhaW5lciwgPEFwcCAvPikgaW5zdGVhZC4nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucyAhPT0gbnVsbCAmJiBvcHRpb25zLiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEUpIHtcbiAgICAgICAgICBlcnJvcignWW91IHBhc3NlZCBhIEpTWCBlbGVtZW50IHRvIGNyZWF0ZVJvb3QuIFlvdSBwcm9iYWJseSBtZWFudCB0byAnICsgJ2NhbGwgcm9vdC5yZW5kZXIgaW5zdGVhZC4gJyArICdFeGFtcGxlIHVzYWdlOlxcblxcbicgKyAnICBsZXQgcm9vdCA9IGNyZWF0ZVJvb3QoZG9tQ29udGFpbmVyKTtcXG4nICsgJyAgcm9vdC5yZW5kZXIoPEFwcCAvPik7Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy51bnN0YWJsZV9zdHJpY3RNb2RlID09PSB0cnVlKSB7XG4gICAgICBpc1N0cmljdE1vZGUgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmlkZW50aWZpZXJQcmVmaXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWRlbnRpZmllclByZWZpeCA9IG9wdGlvbnMuaWRlbnRpZmllclByZWZpeDtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5vblJlY292ZXJhYmxlRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgb25SZWNvdmVyYWJsZUVycm9yID0gb3B0aW9ucy5vblJlY292ZXJhYmxlRXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMudHJhbnNpdGlvbkNhbGxiYWNrcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0cmFuc2l0aW9uQ2FsbGJhY2tzID0gb3B0aW9ucy50cmFuc2l0aW9uQ2FsbGJhY2tzO1xuICAgIH1cbiAgfVxuXG4gIHZhciByb290ID0gY3JlYXRlQ29udGFpbmVyKGNvbnRhaW5lciwgQ29uY3VycmVudFJvb3QsIG51bGwsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yKTtcbiAgbWFya0NvbnRhaW5lckFzUm9vdChyb290LmN1cnJlbnQsIGNvbnRhaW5lcik7XG4gIHZhciByb290Q29udGFpbmVyRWxlbWVudCA9IGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFID8gY29udGFpbmVyLnBhcmVudE5vZGUgOiBjb250YWluZXI7XG4gIGxpc3RlblRvQWxsU3VwcG9ydGVkRXZlbnRzKHJvb3RDb250YWluZXJFbGVtZW50KTtcbiAgcmV0dXJuIG5ldyBSZWFjdERPTVJvb3Qocm9vdCk7XG59XG5cbmZ1bmN0aW9uIFJlYWN0RE9NSHlkcmF0aW9uUm9vdChpbnRlcm5hbFJvb3QpIHtcbiAgdGhpcy5faW50ZXJuYWxSb290ID0gaW50ZXJuYWxSb290O1xufVxuXG5mdW5jdGlvbiBzY2hlZHVsZUh5ZHJhdGlvbih0YXJnZXQpIHtcbiAgaWYgKHRhcmdldCkge1xuICAgIHF1ZXVlRXhwbGljaXRIeWRyYXRpb25UYXJnZXQodGFyZ2V0KTtcbiAgfVxufVxuXG5SZWFjdERPTUh5ZHJhdGlvblJvb3QucHJvdG90eXBlLnVuc3RhYmxlX3NjaGVkdWxlSHlkcmF0aW9uID0gc2NoZWR1bGVIeWRyYXRpb247XG5mdW5jdGlvbiBoeWRyYXRlUm9vdChjb250YWluZXIsIGluaXRpYWxDaGlsZHJlbiwgb3B0aW9ucykge1xuICBpZiAoIWlzVmFsaWRDb250YWluZXIoY29udGFpbmVyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaHlkcmF0ZVJvb3QoLi4uKTogVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC4nKTtcbiAgfVxuXG4gIHdhcm5JZlJlYWN0RE9NQ29udGFpbmVySW5ERVYoY29udGFpbmVyKTtcblxuICB7XG4gICAgaWYgKGluaXRpYWxDaGlsZHJlbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlcnJvcignTXVzdCBwcm92aWRlIGluaXRpYWwgY2hpbGRyZW4gYXMgc2Vjb25kIGFyZ3VtZW50IHRvIGh5ZHJhdGVSb290LiAnICsgJ0V4YW1wbGUgdXNhZ2U6IGh5ZHJhdGVSb290KGRvbUNvbnRhaW5lciwgPEFwcCAvPiknKTtcbiAgICB9XG4gIH0gLy8gRm9yIG5vdyB3ZSByZXVzZSB0aGUgd2hvbGUgYmFnIG9mIG9wdGlvbnMgc2luY2UgdGhleSBjb250YWluXG4gIC8vIHRoZSBoeWRyYXRpb24gY2FsbGJhY2tzLlxuXG5cbiAgdmFyIGh5ZHJhdGlvbkNhbGxiYWNrcyA9IG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMgOiBudWxsOyAvLyBUT0RPOiBEZWxldGUgdGhpcyBvcHRpb25cblxuICB2YXIgbXV0YWJsZVNvdXJjZXMgPSBvcHRpb25zICE9IG51bGwgJiYgb3B0aW9ucy5oeWRyYXRlZFNvdXJjZXMgfHwgbnVsbDtcbiAgdmFyIGlzU3RyaWN0TW9kZSA9IGZhbHNlO1xuICB2YXIgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSA9IGZhbHNlO1xuICB2YXIgaWRlbnRpZmllclByZWZpeCA9ICcnO1xuICB2YXIgb25SZWNvdmVyYWJsZUVycm9yID0gZGVmYXVsdE9uUmVjb3ZlcmFibGVFcnJvcjtcblxuICBpZiAob3B0aW9ucyAhPT0gbnVsbCAmJiBvcHRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAob3B0aW9ucy51bnN0YWJsZV9zdHJpY3RNb2RlID09PSB0cnVlKSB7XG4gICAgICBpc1N0cmljdE1vZGUgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmlkZW50aWZpZXJQcmVmaXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWRlbnRpZmllclByZWZpeCA9IG9wdGlvbnMuaWRlbnRpZmllclByZWZpeDtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5vblJlY292ZXJhYmxlRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgb25SZWNvdmVyYWJsZUVycm9yID0gb3B0aW9ucy5vblJlY292ZXJhYmxlRXJyb3I7XG4gICAgfVxuICB9XG5cbiAgdmFyIHJvb3QgPSBjcmVhdGVIeWRyYXRpb25Db250YWluZXIoaW5pdGlhbENoaWxkcmVuLCBudWxsLCBjb250YWluZXIsIENvbmN1cnJlbnRSb290LCBoeWRyYXRpb25DYWxsYmFja3MsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yKTtcbiAgbWFya0NvbnRhaW5lckFzUm9vdChyb290LmN1cnJlbnQsIGNvbnRhaW5lcik7IC8vIFRoaXMgY2FuJ3QgYmUgYSBjb21tZW50IG5vZGUgc2luY2UgaHlkcmF0aW9uIGRvZXNuJ3Qgd29yayBvbiBjb21tZW50IG5vZGVzIGFueXdheS5cblxuICBsaXN0ZW5Ub0FsbFN1cHBvcnRlZEV2ZW50cyhjb250YWluZXIpO1xuXG4gIGlmIChtdXRhYmxlU291cmNlcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXV0YWJsZVNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBtdXRhYmxlU291cmNlID0gbXV0YWJsZVNvdXJjZXNbaV07XG4gICAgICByZWdpc3Rlck11dGFibGVTb3VyY2VGb3JIeWRyYXRpb24ocm9vdCwgbXV0YWJsZVNvdXJjZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBSZWFjdERPTUh5ZHJhdGlvblJvb3Qocm9vdCk7XG59XG5mdW5jdGlvbiBpc1ZhbGlkQ29udGFpbmVyKG5vZGUpIHtcbiAgcmV0dXJuICEhKG5vZGUgJiYgKG5vZGUubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSB8fCBub2RlLm5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFIHx8IG5vZGUubm9kZVR5cGUgPT09IERPQ1VNRU5UX0ZSQUdNRU5UX05PREUgfHwgIWRpc2FibGVDb21tZW50c0FzRE9NQ29udGFpbmVycyAgKSk7XG59IC8vIFRPRE86IFJlbW92ZSB0aGlzIGZ1bmN0aW9uIHdoaWNoIGFsc28gaW5jbHVkZXMgY29tbWVudCBub2Rlcy5cbi8vIFdlIG9ubHkgdXNlIGl0IGluIHBsYWNlcyB0aGF0IGFyZSBjdXJyZW50bHkgbW9yZSByZWxheGVkLlxuXG5mdW5jdGlvbiBpc1ZhbGlkQ29udGFpbmVyTGVnYWN5KG5vZGUpIHtcbiAgcmV0dXJuICEhKG5vZGUgJiYgKG5vZGUubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSB8fCBub2RlLm5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFIHx8IG5vZGUubm9kZVR5cGUgPT09IERPQ1VNRU5UX0ZSQUdNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFICYmIG5vZGUubm9kZVZhbHVlID09PSAnIHJlYWN0LW1vdW50LXBvaW50LXVuc3RhYmxlICcpKTtcbn1cblxuZnVuY3Rpb24gd2FybklmUmVhY3RET01Db250YWluZXJJbkRFVihjb250YWluZXIpIHtcbiAge1xuICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSAmJiBjb250YWluZXIudGFnTmFtZSAmJiBjb250YWluZXIudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnQk9EWScpIHtcbiAgICAgIGVycm9yKCdjcmVhdGVSb290KCk6IENyZWF0aW5nIHJvb3RzIGRpcmVjdGx5IHdpdGggZG9jdW1lbnQuYm9keSBpcyAnICsgJ2Rpc2NvdXJhZ2VkLCBzaW5jZSBpdHMgY2hpbGRyZW4gYXJlIG9mdGVuIG1hbmlwdWxhdGVkIGJ5IHRoaXJkLXBhcnR5ICcgKyAnc2NyaXB0cyBhbmQgYnJvd3NlciBleHRlbnNpb25zLiBUaGlzIG1heSBsZWFkIHRvIHN1YnRsZSAnICsgJ3JlY29uY2lsaWF0aW9uIGlzc3Vlcy4gVHJ5IHVzaW5nIGEgY29udGFpbmVyIGVsZW1lbnQgY3JlYXRlZCAnICsgJ2ZvciB5b3VyIGFwcC4nKTtcbiAgICB9XG5cbiAgICBpZiAoaXNDb250YWluZXJNYXJrZWRBc1Jvb3QoY29udGFpbmVyKSkge1xuICAgICAgaWYgKGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyKSB7XG4gICAgICAgIGVycm9yKCdZb3UgYXJlIGNhbGxpbmcgUmVhY3RET01DbGllbnQuY3JlYXRlUm9vdCgpIG9uIGEgY29udGFpbmVyIHRoYXQgd2FzIHByZXZpb3VzbHkgJyArICdwYXNzZWQgdG8gUmVhY3RET00ucmVuZGVyKCkuIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCdZb3UgYXJlIGNhbGxpbmcgUmVhY3RET01DbGllbnQuY3JlYXRlUm9vdCgpIG9uIGEgY29udGFpbmVyIHRoYXQgJyArICdoYXMgYWxyZWFkeSBiZWVuIHBhc3NlZCB0byBjcmVhdGVSb290KCkgYmVmb3JlLiBJbnN0ZWFkLCBjYWxsICcgKyAncm9vdC5yZW5kZXIoKSBvbiB0aGUgZXhpc3Rpbmcgcm9vdCBpbnN0ZWFkIGlmIHlvdSB3YW50IHRvIHVwZGF0ZSBpdC4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudE93bmVyJDMgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRPd25lcjtcbnZhciB0b3BMZXZlbFVwZGF0ZVdhcm5pbmdzO1xuXG57XG4gIHRvcExldmVsVXBkYXRlV2FybmluZ3MgPSBmdW5jdGlvbiAoY29udGFpbmVyKSB7XG4gICAgaWYgKGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyICYmIGNvbnRhaW5lci5ub2RlVHlwZSAhPT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgICB2YXIgaG9zdEluc3RhbmNlID0gZmluZEhvc3RJbnN0YW5jZVdpdGhOb1BvcnRhbHMoY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIuY3VycmVudCk7XG5cbiAgICAgIGlmIChob3N0SW5zdGFuY2UpIHtcbiAgICAgICAgaWYgKGhvc3RJbnN0YW5jZS5wYXJlbnROb2RlICE9PSBjb250YWluZXIpIHtcbiAgICAgICAgICBlcnJvcigncmVuZGVyKC4uLik6IEl0IGxvb2tzIGxpa2UgdGhlIFJlYWN0LXJlbmRlcmVkIGNvbnRlbnQgb2YgdGhpcyAnICsgJ2NvbnRhaW5lciB3YXMgcmVtb3ZlZCB3aXRob3V0IHVzaW5nIFJlYWN0LiBUaGlzIGlzIG5vdCAnICsgJ3N1cHBvcnRlZCBhbmQgd2lsbCBjYXVzZSBlcnJvcnMuIEluc3RlYWQsIGNhbGwgJyArICdSZWFjdERPTS51bm1vdW50Q29tcG9uZW50QXROb2RlIHRvIGVtcHR5IGEgY29udGFpbmVyLicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGlzUm9vdFJlbmRlcmVkQnlTb21lUmVhY3QgPSAhIWNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyO1xuICAgIHZhciByb290RWwgPSBnZXRSZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKTtcbiAgICB2YXIgaGFzTm9uUm9vdFJlYWN0Q2hpbGQgPSAhIShyb290RWwgJiYgZ2V0SW5zdGFuY2VGcm9tTm9kZShyb290RWwpKTtcblxuICAgIGlmIChoYXNOb25Sb290UmVhY3RDaGlsZCAmJiAhaXNSb290UmVuZGVyZWRCeVNvbWVSZWFjdCkge1xuICAgICAgZXJyb3IoJ3JlbmRlciguLi4pOiBSZXBsYWNpbmcgUmVhY3QtcmVuZGVyZWQgY2hpbGRyZW4gd2l0aCBhIG5ldyByb290ICcgKyAnY29tcG9uZW50LiBJZiB5b3UgaW50ZW5kZWQgdG8gdXBkYXRlIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUsICcgKyAneW91IHNob3VsZCBpbnN0ZWFkIGhhdmUgdGhlIGV4aXN0aW5nIGNoaWxkcmVuIHVwZGF0ZSB0aGVpciBzdGF0ZSAnICsgJ2FuZCByZW5kZXIgdGhlIG5ldyBjb21wb25lbnRzIGluc3RlYWQgb2YgY2FsbGluZyBSZWFjdERPTS5yZW5kZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFICYmIGNvbnRhaW5lci50YWdOYW1lICYmIGNvbnRhaW5lci50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdCT0RZJykge1xuICAgICAgZXJyb3IoJ3JlbmRlcigpOiBSZW5kZXJpbmcgY29tcG9uZW50cyBkaXJlY3RseSBpbnRvIGRvY3VtZW50LmJvZHkgaXMgJyArICdkaXNjb3VyYWdlZCwgc2luY2UgaXRzIGNoaWxkcmVuIGFyZSBvZnRlbiBtYW5pcHVsYXRlZCBieSB0aGlyZC1wYXJ0eSAnICsgJ3NjcmlwdHMgYW5kIGJyb3dzZXIgZXh0ZW5zaW9ucy4gVGhpcyBtYXkgbGVhZCB0byBzdWJ0bGUgJyArICdyZWNvbmNpbGlhdGlvbiBpc3N1ZXMuIFRyeSByZW5kZXJpbmcgaW50byBhIGNvbnRhaW5lciBlbGVtZW50IGNyZWF0ZWQgJyArICdmb3IgeW91ciBhcHAuJyk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRSZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKSB7XG4gIGlmICghY29udGFpbmVyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFKSB7XG4gICAgcmV0dXJuIGNvbnRhaW5lci5kb2N1bWVudEVsZW1lbnQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNvbnRhaW5lci5maXJzdENoaWxkO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vb3BPblJlY292ZXJhYmxlRXJyb3IoKSB7Ly8gVGhpcyBpc24ndCByZWFjaGFibGUgYmVjYXVzZSBvblJlY292ZXJhYmxlRXJyb3IgaXNuJ3QgY2FsbGVkIGluIHRoZVxuICAvLyBsZWdhY3kgQVBJLlxufVxuXG5mdW5jdGlvbiBsZWdhY3lDcmVhdGVSb290RnJvbURPTUNvbnRhaW5lcihjb250YWluZXIsIGluaXRpYWxDaGlsZHJlbiwgcGFyZW50Q29tcG9uZW50LCBjYWxsYmFjaywgaXNIeWRyYXRpb25Db250YWluZXIpIHtcbiAgaWYgKGlzSHlkcmF0aW9uQ29udGFpbmVyKSB7XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIG9yaWdpbmFsQ2FsbGJhY2sgPSBjYWxsYmFjaztcblxuICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGdldFB1YmxpY1Jvb3RJbnN0YW5jZShyb290KTtcbiAgICAgICAgb3JpZ2luYWxDYWxsYmFjay5jYWxsKGluc3RhbmNlKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIHJvb3QgPSBjcmVhdGVIeWRyYXRpb25Db250YWluZXIoaW5pdGlhbENoaWxkcmVuLCBjYWxsYmFjaywgY29udGFpbmVyLCBMZWdhY3lSb290LCBudWxsLCAvLyBoeWRyYXRpb25DYWxsYmFja3NcbiAgICBmYWxzZSwgLy8gaXNTdHJpY3RNb2RlXG4gICAgZmFsc2UsIC8vIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsXG4gICAgJycsIC8vIGlkZW50aWZpZXJQcmVmaXhcbiAgICBub29wT25SZWNvdmVyYWJsZUVycm9yKTtcbiAgICBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciA9IHJvb3Q7XG4gICAgbWFya0NvbnRhaW5lckFzUm9vdChyb290LmN1cnJlbnQsIGNvbnRhaW5lcik7XG4gICAgdmFyIHJvb3RDb250YWluZXJFbGVtZW50ID0gY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUgPyBjb250YWluZXIucGFyZW50Tm9kZSA6IGNvbnRhaW5lcjtcbiAgICBsaXN0ZW5Ub0FsbFN1cHBvcnRlZEV2ZW50cyhyb290Q29udGFpbmVyRWxlbWVudCk7XG4gICAgZmx1c2hTeW5jKCk7XG4gICAgcmV0dXJuIHJvb3Q7XG4gIH0gZWxzZSB7XG4gICAgLy8gRmlyc3QgY2xlYXIgYW55IGV4aXN0aW5nIGNvbnRlbnQuXG4gICAgdmFyIHJvb3RTaWJsaW5nO1xuXG4gICAgd2hpbGUgKHJvb3RTaWJsaW5nID0gY29udGFpbmVyLmxhc3RDaGlsZCkge1xuICAgICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKHJvb3RTaWJsaW5nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgX29yaWdpbmFsQ2FsbGJhY2sgPSBjYWxsYmFjaztcblxuICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGdldFB1YmxpY1Jvb3RJbnN0YW5jZShfcm9vdCk7XG5cbiAgICAgICAgX29yaWdpbmFsQ2FsbGJhY2suY2FsbChpbnN0YW5jZSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfcm9vdCA9IGNyZWF0ZUNvbnRhaW5lcihjb250YWluZXIsIExlZ2FjeVJvb3QsIG51bGwsIC8vIGh5ZHJhdGlvbkNhbGxiYWNrc1xuICAgIGZhbHNlLCAvLyBpc1N0cmljdE1vZGVcbiAgICBmYWxzZSwgLy8gY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSxcbiAgICAnJywgLy8gaWRlbnRpZmllclByZWZpeFxuICAgIG5vb3BPblJlY292ZXJhYmxlRXJyb3IpO1xuXG4gICAgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPSBfcm9vdDtcbiAgICBtYXJrQ29udGFpbmVyQXNSb290KF9yb290LmN1cnJlbnQsIGNvbnRhaW5lcik7XG5cbiAgICB2YXIgX3Jvb3RDb250YWluZXJFbGVtZW50ID0gY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUgPyBjb250YWluZXIucGFyZW50Tm9kZSA6IGNvbnRhaW5lcjtcblxuICAgIGxpc3RlblRvQWxsU3VwcG9ydGVkRXZlbnRzKF9yb290Q29udGFpbmVyRWxlbWVudCk7IC8vIEluaXRpYWwgbW91bnQgc2hvdWxkIG5vdCBiZSBiYXRjaGVkLlxuXG4gICAgZmx1c2hTeW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgIHVwZGF0ZUNvbnRhaW5lcihpbml0aWFsQ2hpbGRyZW4sIF9yb290LCBwYXJlbnRDb21wb25lbnQsIGNhbGxiYWNrKTtcbiAgICB9KTtcbiAgICByZXR1cm4gX3Jvb3Q7XG4gIH1cbn1cblxuZnVuY3Rpb24gd2Fybk9uSW52YWxpZENhbGxiYWNrJDEoY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAge1xuICAgIGlmIChjYWxsYmFjayAhPT0gbnVsbCAmJiB0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyguLi4pOiBFeHBlY3RlZCB0aGUgbGFzdCBvcHRpb25hbCBgY2FsbGJhY2tgIGFyZ3VtZW50IHRvIGJlIGEgJyArICdmdW5jdGlvbi4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY2FsbGVyTmFtZSwgY2FsbGJhY2spO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIGNoaWxkcmVuLCBjb250YWluZXIsIGZvcmNlSHlkcmF0ZSwgY2FsbGJhY2spIHtcbiAge1xuICAgIHRvcExldmVsVXBkYXRlV2FybmluZ3MoY29udGFpbmVyKTtcbiAgICB3YXJuT25JbnZhbGlkQ2FsbGJhY2skMShjYWxsYmFjayA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGNhbGxiYWNrLCAncmVuZGVyJyk7XG4gIH1cblxuICB2YXIgbWF5YmVSb290ID0gY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXI7XG4gIHZhciByb290O1xuXG4gIGlmICghbWF5YmVSb290KSB7XG4gICAgLy8gSW5pdGlhbCBtb3VudFxuICAgIHJvb3QgPSBsZWdhY3lDcmVhdGVSb290RnJvbURPTUNvbnRhaW5lcihjb250YWluZXIsIGNoaWxkcmVuLCBwYXJlbnRDb21wb25lbnQsIGNhbGxiYWNrLCBmb3JjZUh5ZHJhdGUpO1xuICB9IGVsc2Uge1xuICAgIHJvb3QgPSBtYXliZVJvb3Q7XG5cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgb3JpZ2luYWxDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG4gICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZ2V0UHVibGljUm9vdEluc3RhbmNlKHJvb3QpO1xuICAgICAgICBvcmlnaW5hbENhbGxiYWNrLmNhbGwoaW5zdGFuY2UpO1xuICAgICAgfTtcbiAgICB9IC8vIFVwZGF0ZVxuXG5cbiAgICB1cGRhdGVDb250YWluZXIoY2hpbGRyZW4sIHJvb3QsIHBhcmVudENvbXBvbmVudCwgY2FsbGJhY2spO1xuICB9XG5cbiAgcmV0dXJuIGdldFB1YmxpY1Jvb3RJbnN0YW5jZShyb290KTtcbn1cblxudmFyIGRpZFdhcm5BYm91dEZpbmRET01Ob2RlID0gZmFsc2U7XG5mdW5jdGlvbiBmaW5kRE9NTm9kZShjb21wb25lbnRPckVsZW1lbnQpIHtcbiAge1xuICAgIGlmICghZGlkV2FybkFib3V0RmluZERPTU5vZGUpIHtcbiAgICAgIGRpZFdhcm5BYm91dEZpbmRET01Ob2RlID0gdHJ1ZTtcblxuICAgICAgZXJyb3IoJ2ZpbmRET01Ob2RlIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciAnICsgJ3JlbGVhc2UuIEluc3RlYWQsIGFkZCBhIHJlZiBkaXJlY3RseSB0byB0aGUgZWxlbWVudCB5b3Ugd2FudCAnICsgJ3RvIHJlZmVyZW5jZS4gTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1maW5kLW5vZGUnKTtcbiAgICB9XG5cbiAgICB2YXIgb3duZXIgPSBSZWFjdEN1cnJlbnRPd25lciQzLmN1cnJlbnQ7XG5cbiAgICBpZiAob3duZXIgIT09IG51bGwgJiYgb3duZXIuc3RhdGVOb2RlICE9PSBudWxsKSB7XG4gICAgICB2YXIgd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIgPSBvd25lci5zdGF0ZU5vZGUuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyO1xuXG4gICAgICBpZiAoIXdhcm5lZEFib3V0UmVmc0luUmVuZGVyKSB7XG4gICAgICAgIGVycm9yKCclcyBpcyBhY2Nlc3NpbmcgZmluZERPTU5vZGUgaW5zaWRlIGl0cyByZW5kZXIoKS4gJyArICdyZW5kZXIoKSBzaG91bGQgYmUgYSBwdXJlIGZ1bmN0aW9uIG9mIHByb3BzIGFuZCBzdGF0ZS4gSXQgc2hvdWxkICcgKyAnbmV2ZXIgYWNjZXNzIHNvbWV0aGluZyB0aGF0IHJlcXVpcmVzIHN0YWxlIGRhdGEgZnJvbSB0aGUgcHJldmlvdXMgJyArICdyZW5kZXIsIHN1Y2ggYXMgcmVmcy4gTW92ZSB0aGlzIGxvZ2ljIHRvIGNvbXBvbmVudERpZE1vdW50IGFuZCAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZSBpbnN0ZWFkLicsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShvd25lci50eXBlKSB8fCAnQSBjb21wb25lbnQnKTtcbiAgICAgIH1cblxuICAgICAgb3duZXIuc3RhdGVOb2RlLl93YXJuZWRBYm91dFJlZnNJblJlbmRlciA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbXBvbmVudE9yRWxlbWVudCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoY29tcG9uZW50T3JFbGVtZW50Lm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICByZXR1cm4gY29tcG9uZW50T3JFbGVtZW50O1xuICB9XG5cbiAge1xuICAgIHJldHVybiBmaW5kSG9zdEluc3RhbmNlV2l0aFdhcm5pbmcoY29tcG9uZW50T3JFbGVtZW50LCAnZmluZERPTU5vZGUnKTtcbiAgfVxufVxuZnVuY3Rpb24gaHlkcmF0ZShlbGVtZW50LCBjb250YWluZXIsIGNhbGxiYWNrKSB7XG4gIHtcbiAgICBlcnJvcignUmVhY3RET00uaHlkcmF0ZSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGluIFJlYWN0IDE4LiBVc2UgaHlkcmF0ZVJvb3QgJyArICdpbnN0ZWFkLiBVbnRpbCB5b3Ugc3dpdGNoIHRvIHRoZSBuZXcgQVBJLCB5b3VyIGFwcCB3aWxsIGJlaGF2ZSBhcyAnICsgXCJpZiBpdCdzIHJ1bm5pbmcgUmVhY3QgMTcuIExlYXJuIFwiICsgJ21vcmU6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zd2l0Y2gtdG8tY3JlYXRlcm9vdCcpO1xuICB9XG5cbiAgaWYgKCFpc1ZhbGlkQ29udGFpbmVyTGVnYWN5KGNvbnRhaW5lcikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJyk7XG4gIH1cblxuICB7XG4gICAgdmFyIGlzTW9kZXJuUm9vdCA9IGlzQ29udGFpbmVyTWFya2VkQXNSb290KGNvbnRhaW5lcikgJiYgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPT09IHVuZGVmaW5lZDtcblxuICAgIGlmIChpc01vZGVyblJvb3QpIHtcbiAgICAgIGVycm9yKCdZb3UgYXJlIGNhbGxpbmcgUmVhY3RET00uaHlkcmF0ZSgpIG9uIGEgY29udGFpbmVyIHRoYXQgd2FzIHByZXZpb3VzbHkgJyArICdwYXNzZWQgdG8gUmVhY3RET01DbGllbnQuY3JlYXRlUm9vdCgpLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnRGlkIHlvdSBtZWFuIHRvIGNhbGwgaHlkcmF0ZVJvb3QoY29udGFpbmVyLCBlbGVtZW50KT8nKTtcbiAgICB9XG4gIH0gLy8gVE9ETzogdGhyb3cgb3Igd2FybiBpZiB3ZSBjb3VsZG4ndCBoeWRyYXRlP1xuXG5cbiAgcmV0dXJuIGxlZ2FjeVJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKG51bGwsIGVsZW1lbnQsIGNvbnRhaW5lciwgdHJ1ZSwgY2FsbGJhY2spO1xufVxuZnVuY3Rpb24gcmVuZGVyKGVsZW1lbnQsIGNvbnRhaW5lciwgY2FsbGJhY2spIHtcbiAge1xuICAgIGVycm9yKCdSZWFjdERPTS5yZW5kZXIgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCBpbiBSZWFjdCAxOC4gVXNlIGNyZWF0ZVJvb3QgJyArICdpbnN0ZWFkLiBVbnRpbCB5b3Ugc3dpdGNoIHRvIHRoZSBuZXcgQVBJLCB5b3VyIGFwcCB3aWxsIGJlaGF2ZSBhcyAnICsgXCJpZiBpdCdzIHJ1bm5pbmcgUmVhY3QgMTcuIExlYXJuIFwiICsgJ21vcmU6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zd2l0Y2gtdG8tY3JlYXRlcm9vdCcpO1xuICB9XG5cbiAgaWYgKCFpc1ZhbGlkQ29udGFpbmVyTGVnYWN5KGNvbnRhaW5lcikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJyk7XG4gIH1cblxuICB7XG4gICAgdmFyIGlzTW9kZXJuUm9vdCA9IGlzQ29udGFpbmVyTWFya2VkQXNSb290KGNvbnRhaW5lcikgJiYgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPT09IHVuZGVmaW5lZDtcblxuICAgIGlmIChpc01vZGVyblJvb3QpIHtcbiAgICAgIGVycm9yKCdZb3UgYXJlIGNhbGxpbmcgUmVhY3RET00ucmVuZGVyKCkgb24gYSBjb250YWluZXIgdGhhdCB3YXMgcHJldmlvdXNseSAnICsgJ3Bhc3NlZCB0byBSZWFjdERPTUNsaWVudC5jcmVhdGVSb290KCkuIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4gJyArICdEaWQgeW91IG1lYW4gdG8gY2FsbCByb290LnJlbmRlcihlbGVtZW50KT8nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbGVnYWN5UmVuZGVyU3VidHJlZUludG9Db250YWluZXIobnVsbCwgZWxlbWVudCwgY29udGFpbmVyLCBmYWxzZSwgY2FsbGJhY2spO1xufVxuZnVuY3Rpb24gdW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIocGFyZW50Q29tcG9uZW50LCBlbGVtZW50LCBjb250YWluZXJOb2RlLCBjYWxsYmFjaykge1xuICB7XG4gICAgZXJyb3IoJ1JlYWN0RE9NLnVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKCkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCAnICsgJ2luIFJlYWN0IDE4LiBDb25zaWRlciB1c2luZyBhIHBvcnRhbCBpbnN0ZWFkLiBVbnRpbCB5b3Ugc3dpdGNoIHRvICcgKyBcInRoZSBjcmVhdGVSb290IEFQSSwgeW91ciBhcHAgd2lsbCBiZWhhdmUgYXMgaWYgaXQncyBydW5uaW5nIFJlYWN0IFwiICsgJzE3LiBMZWFybiBtb3JlOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3dpdGNoLXRvLWNyZWF0ZXJvb3QnKTtcbiAgfVxuXG4gIGlmICghaXNWYWxpZENvbnRhaW5lckxlZ2FjeShjb250YWluZXJOb2RlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC4nKTtcbiAgfVxuXG4gIGlmIChwYXJlbnRDb21wb25lbnQgPT0gbnVsbCB8fCAhaGFzKHBhcmVudENvbXBvbmVudCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3BhcmVudENvbXBvbmVudCBtdXN0IGJlIGEgdmFsaWQgUmVhY3QgQ29tcG9uZW50Jyk7XG4gIH1cblxuICByZXR1cm4gbGVnYWN5UmVuZGVyU3VidHJlZUludG9Db250YWluZXIocGFyZW50Q29tcG9uZW50LCBlbGVtZW50LCBjb250YWluZXJOb2RlLCBmYWxzZSwgY2FsbGJhY2spO1xufVxudmFyIGRpZFdhcm5BYm91dFVubW91bnRDb21wb25lbnRBdE5vZGUgPSBmYWxzZTtcbmZ1bmN0aW9uIHVubW91bnRDb21wb25lbnRBdE5vZGUoY29udGFpbmVyKSB7XG4gIHtcbiAgICBpZiAoIWRpZFdhcm5BYm91dFVubW91bnRDb21wb25lbnRBdE5vZGUpIHtcbiAgICAgIGRpZFdhcm5BYm91dFVubW91bnRDb21wb25lbnRBdE5vZGUgPSB0cnVlO1xuXG4gICAgICBlcnJvcigndW5tb3VudENvbXBvbmVudEF0Tm9kZSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlICcgKyAnbmV4dCBtYWpvciByZWxlYXNlLiBTd2l0Y2ggdG8gdGhlIGNyZWF0ZVJvb3QgQVBJLiBMZWFybiAnICsgJ21vcmU6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zd2l0Y2gtdG8tY3JlYXRlcm9vdCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghaXNWYWxpZENvbnRhaW5lckxlZ2FjeShjb250YWluZXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1bm1vdW50Q29tcG9uZW50QXROb2RlKC4uLik6IFRhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJyk7XG4gIH1cblxuICB7XG4gICAgdmFyIGlzTW9kZXJuUm9vdCA9IGlzQ29udGFpbmVyTWFya2VkQXNSb290KGNvbnRhaW5lcikgJiYgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPT09IHVuZGVmaW5lZDtcblxuICAgIGlmIChpc01vZGVyblJvb3QpIHtcbiAgICAgIGVycm9yKCdZb3UgYXJlIGNhbGxpbmcgUmVhY3RET00udW5tb3VudENvbXBvbmVudEF0Tm9kZSgpIG9uIGEgY29udGFpbmVyIHRoYXQgd2FzIHByZXZpb3VzbHkgJyArICdwYXNzZWQgdG8gUmVhY3RET01DbGllbnQuY3JlYXRlUm9vdCgpLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuIERpZCB5b3UgbWVhbiB0byBjYWxsIHJvb3QudW5tb3VudCgpPycpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lcikge1xuICAgIHtcbiAgICAgIHZhciByb290RWwgPSBnZXRSZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKTtcbiAgICAgIHZhciByZW5kZXJlZEJ5RGlmZmVyZW50UmVhY3QgPSByb290RWwgJiYgIWdldEluc3RhbmNlRnJvbU5vZGUocm9vdEVsKTtcblxuICAgICAgaWYgKHJlbmRlcmVkQnlEaWZmZXJlbnRSZWFjdCkge1xuICAgICAgICBlcnJvcihcInVubW91bnRDb21wb25lbnRBdE5vZGUoKTogVGhlIG5vZGUgeW91J3JlIGF0dGVtcHRpbmcgdG8gdW5tb3VudCBcIiArICd3YXMgcmVuZGVyZWQgYnkgYW5vdGhlciBjb3B5IG9mIFJlYWN0LicpO1xuICAgICAgfVxuICAgIH0gLy8gVW5tb3VudCBzaG91bGQgbm90IGJlIGJhdGNoZWQuXG5cblxuICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihudWxsLCBudWxsLCBjb250YWluZXIsIGZhbHNlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vICRGbG93Rml4TWUgVGhpcyBzaG91bGQgcHJvYmFibHkgdXNlIGBkZWxldGUgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXJgXG4gICAgICAgIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyID0gbnVsbDtcbiAgICAgICAgdW5tYXJrQ29udGFpbmVyQXNSb290KGNvbnRhaW5lcik7XG4gICAgICB9KTtcbiAgICB9KTsgLy8gSWYgeW91IGNhbGwgdW5tb3VudENvbXBvbmVudEF0Tm9kZSB0d2ljZSBpbiBxdWljayBzdWNjZXNzaW9uLCB5b3UnbGxcbiAgICAvLyBnZXQgYHRydWVgIHR3aWNlLiBUaGF0J3MgcHJvYmFibHkgZmluZT9cblxuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHtcbiAgICAgIHZhciBfcm9vdEVsID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcik7XG5cbiAgICAgIHZhciBoYXNOb25Sb290UmVhY3RDaGlsZCA9ICEhKF9yb290RWwgJiYgZ2V0SW5zdGFuY2VGcm9tTm9kZShfcm9vdEVsKSk7IC8vIENoZWNrIGlmIHRoZSBjb250YWluZXIgaXRzZWxmIGlzIGEgUmVhY3Qgcm9vdCBub2RlLlxuXG4gICAgICB2YXIgaXNDb250YWluZXJSZWFjdFJvb3QgPSBjb250YWluZXIubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSAmJiBpc1ZhbGlkQ29udGFpbmVyTGVnYWN5KGNvbnRhaW5lci5wYXJlbnROb2RlKSAmJiAhIWNvbnRhaW5lci5wYXJlbnROb2RlLl9yZWFjdFJvb3RDb250YWluZXI7XG5cbiAgICAgIGlmIChoYXNOb25Sb290UmVhY3RDaGlsZCkge1xuICAgICAgICBlcnJvcihcInVubW91bnRDb21wb25lbnRBdE5vZGUoKTogVGhlIG5vZGUgeW91J3JlIGF0dGVtcHRpbmcgdG8gdW5tb3VudCBcIiArICd3YXMgcmVuZGVyZWQgYnkgUmVhY3QgYW5kIGlzIG5vdCBhIHRvcC1sZXZlbCBjb250YWluZXIuICVzJywgaXNDb250YWluZXJSZWFjdFJvb3QgPyAnWW91IG1heSBoYXZlIGFjY2lkZW50YWxseSBwYXNzZWQgaW4gYSBSZWFjdCByb290IG5vZGUgaW5zdGVhZCAnICsgJ29mIGl0cyBjb250YWluZXIuJyA6ICdJbnN0ZWFkLCBoYXZlIHRoZSBwYXJlbnQgY29tcG9uZW50IHVwZGF0ZSBpdHMgc3RhdGUgYW5kICcgKyAncmVyZW5kZXIgaW4gb3JkZXIgdG8gcmVtb3ZlIHRoaXMgY29tcG9uZW50LicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5zZXRBdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24oYXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uJDEpO1xuc2V0QXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24oYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24kMSk7XG5zZXRBdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkoYXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5JDEpO1xuc2V0R2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSk7XG5zZXRBdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eShydW5XaXRoUHJpb3JpdHkpO1xuXG57XG4gIGlmICh0eXBlb2YgTWFwICE9PSAnZnVuY3Rpb24nIHx8IC8vICRGbG93SXNzdWUgRmxvdyBpbmNvcnJlY3RseSB0aGlua3MgTWFwIGhhcyBubyBwcm90b3R5cGVcbiAgTWFwLnByb3RvdHlwZSA9PSBudWxsIHx8IHR5cGVvZiBNYXAucHJvdG90eXBlLmZvckVhY2ggIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIFNldCAhPT0gJ2Z1bmN0aW9uJyB8fCAvLyAkRmxvd0lzc3VlIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIFNldCBoYXMgbm8gcHJvdG90eXBlXG4gIFNldC5wcm90b3R5cGUgPT0gbnVsbCB8fCB0eXBlb2YgU2V0LnByb3RvdHlwZS5jbGVhciAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgU2V0LnByb3RvdHlwZS5mb3JFYWNoICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgZXJyb3IoJ1JlYWN0IGRlcGVuZHMgb24gTWFwIGFuZCBTZXQgYnVpbHQtaW4gdHlwZXMuIE1ha2Ugc3VyZSB0aGF0IHlvdSBsb2FkIGEgJyArICdwb2x5ZmlsbCBpbiBvbGRlciBicm93c2Vycy4gaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3JlYWN0LXBvbHlmaWxscycpO1xuICB9XG59XG5cbnNldFJlc3RvcmVJbXBsZW1lbnRhdGlvbihyZXN0b3JlQ29udHJvbGxlZFN0YXRlJDMpO1xuc2V0QmF0Y2hpbmdJbXBsZW1lbnRhdGlvbihiYXRjaGVkVXBkYXRlcyQxLCBkaXNjcmV0ZVVwZGF0ZXMsIGZsdXNoU3luYyk7XG5cbmZ1bmN0aW9uIGNyZWF0ZVBvcnRhbCQxKGNoaWxkcmVuLCBjb250YWluZXIpIHtcbiAgdmFyIGtleSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbnVsbDtcblxuICBpZiAoIWlzVmFsaWRDb250YWluZXIoY29udGFpbmVyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC4nKTtcbiAgfSAvLyBUT0RPOiBwYXNzIFJlYWN0RE9NIHBvcnRhbCBpbXBsZW1lbnRhdGlvbiBhcyB0aGlyZCBhcmd1bWVudFxuICAvLyAkRmxvd0ZpeE1lIFRoZSBGbG93IHR5cGUgaXMgb3BhcXVlIGJ1dCB0aGVyZSdzIG5vIHdheSB0byBhY3R1YWxseSBjcmVhdGUgaXQuXG5cblxuICByZXR1cm4gY3JlYXRlUG9ydGFsKGNoaWxkcmVuLCBjb250YWluZXIsIG51bGwsIGtleSk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHBhcmVudENvbXBvbmVudCwgZWxlbWVudCwgY29udGFpbmVyTm9kZSwgY2FsbGJhY2spIHtcbiAgcmV0dXJuIHVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHBhcmVudENvbXBvbmVudCwgZWxlbWVudCwgY29udGFpbmVyTm9kZSwgY2FsbGJhY2spO1xufVxuXG52YXIgSW50ZXJuYWxzID0ge1xuICB1c2luZ0NsaWVudEVudHJ5UG9pbnQ6IGZhbHNlLFxuICAvLyBLZWVwIGluIHN5bmMgd2l0aCBSZWFjdFRlc3RVdGlscy5qcy5cbiAgLy8gVGhpcyBpcyBhbiBhcnJheSBmb3IgYmV0dGVyIG1pbmlmaWNhdGlvbi5cbiAgRXZlbnRzOiBbZ2V0SW5zdGFuY2VGcm9tTm9kZSwgZ2V0Tm9kZUZyb21JbnN0YW5jZSwgZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZSwgZW5xdWV1ZVN0YXRlUmVzdG9yZSwgcmVzdG9yZVN0YXRlSWZOZWVkZWQsIGJhdGNoZWRVcGRhdGVzJDFdXG59O1xuXG5mdW5jdGlvbiBjcmVhdGVSb290JDEoY29udGFpbmVyLCBvcHRpb25zKSB7XG4gIHtcbiAgICBpZiAoIUludGVybmFscy51c2luZ0NsaWVudEVudHJ5UG9pbnQgJiYgIWZhbHNlKSB7XG4gICAgICBlcnJvcignWW91IGFyZSBpbXBvcnRpbmcgY3JlYXRlUm9vdCBmcm9tIFwicmVhY3QtZG9tXCIgd2hpY2ggaXMgbm90IHN1cHBvcnRlZC4gJyArICdZb3Ugc2hvdWxkIGluc3RlYWQgaW1wb3J0IGl0IGZyb20gXCJyZWFjdC1kb20vY2xpZW50XCIuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZVJvb3QoY29udGFpbmVyLCBvcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gaHlkcmF0ZVJvb3QkMShjb250YWluZXIsIGluaXRpYWxDaGlsZHJlbiwgb3B0aW9ucykge1xuICB7XG4gICAgaWYgKCFJbnRlcm5hbHMudXNpbmdDbGllbnRFbnRyeVBvaW50ICYmICFmYWxzZSkge1xuICAgICAgZXJyb3IoJ1lvdSBhcmUgaW1wb3J0aW5nIGh5ZHJhdGVSb290IGZyb20gXCJyZWFjdC1kb21cIiB3aGljaCBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ1lvdSBzaG91bGQgaW5zdGVhZCBpbXBvcnQgaXQgZnJvbSBcInJlYWN0LWRvbS9jbGllbnRcIi4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaHlkcmF0ZVJvb3QoY29udGFpbmVyLCBpbml0aWFsQ2hpbGRyZW4sIG9wdGlvbnMpO1xufSAvLyBPdmVybG9hZCB0aGUgZGVmaW5pdGlvbiB0byB0aGUgdHdvIHZhbGlkIHNpZ25hdHVyZXMuXG4vLyBXYXJuaW5nLCB0aGlzIG9wdHMtb3V0IG9mIGNoZWNraW5nIHRoZSBmdW5jdGlvbiBib2R5LlxuXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZWRlY2xhcmVcbmZ1bmN0aW9uIGZsdXNoU3luYyQxKGZuKSB7XG4gIHtcbiAgICBpZiAoaXNBbHJlYWR5UmVuZGVyaW5nKCkpIHtcbiAgICAgIGVycm9yKCdmbHVzaFN5bmMgd2FzIGNhbGxlZCBmcm9tIGluc2lkZSBhIGxpZmVjeWNsZSBtZXRob2QuIFJlYWN0IGNhbm5vdCAnICsgJ2ZsdXNoIHdoZW4gUmVhY3QgaXMgYWxyZWFkeSByZW5kZXJpbmcuIENvbnNpZGVyIG1vdmluZyB0aGlzIGNhbGwgdG8gJyArICdhIHNjaGVkdWxlciB0YXNrIG9yIG1pY3JvIHRhc2suJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZsdXNoU3luYyhmbik7XG59XG52YXIgZm91bmREZXZUb29scyA9IGluamVjdEludG9EZXZUb29scyh7XG4gIGZpbmRGaWJlckJ5SG9zdEluc3RhbmNlOiBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSxcbiAgYnVuZGxlVHlwZTogIDEgLFxuICB2ZXJzaW9uOiBSZWFjdFZlcnNpb24sXG4gIHJlbmRlcmVyUGFja2FnZU5hbWU6ICdyZWFjdC1kb20nXG59KTtcblxue1xuICBpZiAoIWZvdW5kRGV2VG9vbHMgJiYgY2FuVXNlRE9NICYmIHdpbmRvdy50b3AgPT09IHdpbmRvdy5zZWxmKSB7XG4gICAgLy8gSWYgd2UncmUgaW4gQ2hyb21lIG9yIEZpcmVmb3gsIHByb3ZpZGUgYSBkb3dubG9hZCBsaW5rIGlmIG5vdCBpbnN0YWxsZWQuXG4gICAgaWYgKG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignQ2hyb21lJykgPiAtMSAmJiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0VkZ2UnKSA9PT0gLTEgfHwgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdGaXJlZm94JykgPiAtMSkge1xuICAgICAgdmFyIHByb3RvY29sID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sOyAvLyBEb24ndCB3YXJuIGluIGV4b3RpYyBjYXNlcyBsaWtlIGNocm9tZS1leHRlbnNpb246Ly8uXG5cbiAgICAgIGlmICgvXihodHRwcz98ZmlsZSk6JC8udGVzdChwcm90b2NvbCkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZ1xuICAgICAgICBjb25zb2xlLmluZm8oJyVjRG93bmxvYWQgdGhlIFJlYWN0IERldlRvb2xzICcgKyAnZm9yIGEgYmV0dGVyIGRldmVsb3BtZW50IGV4cGVyaWVuY2U6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3JlYWN0LWRldnRvb2xzJyArIChwcm90b2NvbCA9PT0gJ2ZpbGU6JyA/ICdcXG5Zb3UgbWlnaHQgbmVlZCB0byB1c2UgYSBsb2NhbCBIVFRQIHNlcnZlciAoaW5zdGVhZCBvZiBmaWxlOi8vKTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvcmVhY3QtZGV2dG9vbHMtZmFxJyA6ICcnKSwgJ2ZvbnQtd2VpZ2h0OmJvbGQnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0cy5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRCA9IEludGVybmFscztcbmV4cG9ydHMuY3JlYXRlUG9ydGFsID0gY3JlYXRlUG9ydGFsJDE7XG5leHBvcnRzLmNyZWF0ZVJvb3QgPSBjcmVhdGVSb290JDE7XG5leHBvcnRzLmZpbmRET01Ob2RlID0gZmluZERPTU5vZGU7XG5leHBvcnRzLmZsdXNoU3luYyA9IGZsdXNoU3luYyQxO1xuZXhwb3J0cy5oeWRyYXRlID0gaHlkcmF0ZTtcbmV4cG9ydHMuaHlkcmF0ZVJvb3QgPSBoeWRyYXRlUm9vdCQxO1xuZXhwb3J0cy5yZW5kZXIgPSByZW5kZXI7XG5leHBvcnRzLnVubW91bnRDb21wb25lbnRBdE5vZGUgPSB1bm1vdW50Q29tcG9uZW50QXROb2RlO1xuZXhwb3J0cy51bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyA9IGJhdGNoZWRVcGRhdGVzJDE7XG5leHBvcnRzLnVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyID0gcmVuZGVyU3VidHJlZUludG9Db250YWluZXI7XG5leHBvcnRzLnZlcnNpb24gPSBSZWFjdFZlcnNpb247XG4gICAgICAgICAgLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AobmV3IEVycm9yKCkpO1xufVxuICAgICAgICBcbiAgfSkoKTtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIGNoZWNrRENFKCkge1xuICAvKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG4gIGlmIChcbiAgICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fID09PSAndW5kZWZpbmVkJyB8fFxuICAgIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UgIT09ICdmdW5jdGlvbidcbiAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgLy8gVGhpcyBicmFuY2ggaXMgdW5yZWFjaGFibGUgYmVjYXVzZSB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkXG4gICAgLy8gaW4gcHJvZHVjdGlvbiwgYnV0IHRoZSBjb25kaXRpb24gaXMgdHJ1ZSBvbmx5IGluIGRldmVsb3BtZW50LlxuICAgIC8vIFRoZXJlZm9yZSBpZiB0aGUgYnJhbmNoIGlzIHN0aWxsIGhlcmUsIGRlYWQgY29kZSBlbGltaW5hdGlvbiB3YXNuJ3RcbiAgICAvLyBwcm9wZXJseSBhcHBsaWVkLlxuICAgIC8vIERvbid0IGNoYW5nZSB0aGUgbWVzc2FnZS4gUmVhY3QgRGV2VG9vbHMgcmVsaWVzIG9uIGl0LiBBbHNvIG1ha2Ugc3VyZVxuICAgIC8vIHRoaXMgbWVzc2FnZSBkb2Vzbid0IG9jY3VyIGVsc2V3aGVyZSBpbiB0aGlzIGZ1bmN0aW9uLCBvciBpdCB3aWxsIGNhdXNlXG4gICAgLy8gYSBmYWxzZSBwb3NpdGl2ZS5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ15fXicpO1xuICB9XG4gIHRyeSB7XG4gICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGNvZGUgYWJvdmUgaGFzIGJlZW4gZGVhZCBjb2RlIGVsaW1pbmF0ZWQgKERDRSdkKS5cbiAgICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UoY2hlY2tEQ0UpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBEZXZUb29scyBzaG91bGRuJ3QgY3Jhc2ggUmVhY3QsIG5vIG1hdHRlciB3aGF0LlxuICAgIC8vIFdlIHNob3VsZCBzdGlsbCByZXBvcnQgaW4gY2FzZSB3ZSBicmVhayB0aGlzIGNvZGUuXG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICB9XG59XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIC8vIERDRSBjaGVjayBzaG91bGQgaGFwcGVuIGJlZm9yZSBSZWFjdERPTSBidW5kbGUgZXhlY3V0ZXMgc28gdGhhdFxuICAvLyBEZXZUb29scyBjYW4gcmVwb3J0IGJhZCBtaW5pZmljYXRpb24gZHVyaW5nIGluamVjdGlvbi5cbiAgY2hlY2tEQ0UoKTtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbSA9IHJlcXVpcmUoJ3JlYWN0LWRvbScpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgZXhwb3J0cy5jcmVhdGVSb290ID0gbS5jcmVhdGVSb290O1xuICBleHBvcnRzLmh5ZHJhdGVSb290ID0gbS5oeWRyYXRlUm9vdDtcbn0gZWxzZSB7XG4gIHZhciBpID0gbS5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRDtcbiAgZXhwb3J0cy5jcmVhdGVSb290ID0gZnVuY3Rpb24oYywgbykge1xuICAgIGkudXNpbmdDbGllbnRFbnRyeVBvaW50ID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG0uY3JlYXRlUm9vdChjLCBvKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSBmYWxzZTtcbiAgICB9XG4gIH07XG4gIGV4cG9ydHMuaHlkcmF0ZVJvb3QgPSBmdW5jdGlvbihjLCBoLCBvKSB7XG4gICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbS5oeWRyYXRlUm9vdChjLCBoLCBvKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSBmYWxzZTtcbiAgICB9XG4gIH07XG59XG4iLCAiLyohXG5cdENvcHlyaWdodCAoYykgMjAxOCBKZWQgV2F0c29uLlxuXHRMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgKE1JVCksIHNlZVxuXHRodHRwOi8vamVkd2F0c29uLmdpdGh1Yi5pby9jbGFzc25hbWVzXG4qL1xuLyogZ2xvYmFsIGRlZmluZSAqL1xuXG4oZnVuY3Rpb24gKCkge1xuXHQndXNlIHN0cmljdCc7XG5cblx0dmFyIGhhc093biA9IHt9Lmhhc093blByb3BlcnR5O1xuXG5cdGZ1bmN0aW9uIGNsYXNzTmFtZXMgKCkge1xuXHRcdHZhciBjbGFzc2VzID0gJyc7XG5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGFyZyA9IGFyZ3VtZW50c1tpXTtcblx0XHRcdGlmIChhcmcpIHtcblx0XHRcdFx0Y2xhc3NlcyA9IGFwcGVuZENsYXNzKGNsYXNzZXMsIHBhcnNlVmFsdWUoYXJnKSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNsYXNzZXM7XG5cdH1cblxuXHRmdW5jdGlvbiBwYXJzZVZhbHVlIChhcmcpIHtcblx0XHRpZiAodHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcblx0XHRcdHJldHVybiBhcmc7XG5cdFx0fVxuXG5cdFx0aWYgKHR5cGVvZiBhcmcgIT09ICdvYmplY3QnKSB7XG5cdFx0XHRyZXR1cm4gJyc7XG5cdFx0fVxuXG5cdFx0aWYgKEFycmF5LmlzQXJyYXkoYXJnKSkge1xuXHRcdFx0cmV0dXJuIGNsYXNzTmFtZXMuYXBwbHkobnVsbCwgYXJnKTtcblx0XHR9XG5cblx0XHRpZiAoYXJnLnRvU3RyaW5nICE9PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nICYmICFhcmcudG9TdHJpbmcudG9TdHJpbmcoKS5pbmNsdWRlcygnW25hdGl2ZSBjb2RlXScpKSB7XG5cdFx0XHRyZXR1cm4gYXJnLnRvU3RyaW5nKCk7XG5cdFx0fVxuXG5cdFx0dmFyIGNsYXNzZXMgPSAnJztcblxuXHRcdGZvciAodmFyIGtleSBpbiBhcmcpIHtcblx0XHRcdGlmIChoYXNPd24uY2FsbChhcmcsIGtleSkgJiYgYXJnW2tleV0pIHtcblx0XHRcdFx0Y2xhc3NlcyA9IGFwcGVuZENsYXNzKGNsYXNzZXMsIGtleSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNsYXNzZXM7XG5cdH1cblxuXHRmdW5jdGlvbiBhcHBlbmRDbGFzcyAodmFsdWUsIG5ld0NsYXNzKSB7XG5cdFx0aWYgKCFuZXdDbGFzcykge1xuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH1cblx0XG5cdFx0aWYgKHZhbHVlKSB7XG5cdFx0XHRyZXR1cm4gdmFsdWUgKyAnICcgKyBuZXdDbGFzcztcblx0XHR9XG5cdFxuXHRcdHJldHVybiB2YWx1ZSArIG5ld0NsYXNzO1xuXHR9XG5cblx0aWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG5cdFx0Y2xhc3NOYW1lcy5kZWZhdWx0ID0gY2xhc3NOYW1lcztcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGNsYXNzTmFtZXM7XG5cdH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZGVmaW5lLmFtZCA9PT0gJ29iamVjdCcgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIHJlZ2lzdGVyIGFzICdjbGFzc25hbWVzJywgY29uc2lzdGVudCB3aXRoIG5wbSBwYWNrYWdlIG5hbWVcblx0XHRkZWZpbmUoJ2NsYXNzbmFtZXMnLCBbXSwgZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIGNsYXNzTmFtZXM7XG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0d2luZG93LmNsYXNzTmFtZXMgPSBjbGFzc05hbWVzO1xuXHR9XG59KCkpO1xuIiwgIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHJlYWN0LWlzLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxuLy8gQVRURU5USU9OXG4vLyBXaGVuIGFkZGluZyBuZXcgc3ltYm9scyB0byB0aGlzIGZpbGUsXG4vLyBQbGVhc2UgY29uc2lkZXIgYWxzbyBhZGRpbmcgdG8gJ3JlYWN0LWRldnRvb2xzLXNoYXJlZC9zcmMvYmFja2VuZC9SZWFjdFN5bWJvbHMnXG4vLyBUaGUgU3ltYm9sIHVzZWQgdG8gdGFnIHRoZSBSZWFjdEVsZW1lbnQtbGlrZSB0eXBlcy5cbnZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50Jyk7XG52YXIgUkVBQ1RfUE9SVEFMX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wb3J0YWwnKTtcbnZhciBSRUFDVF9GUkFHTUVOVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZnJhZ21lbnQnKTtcbnZhciBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3RyaWN0X21vZGUnKTtcbnZhciBSRUFDVF9QUk9GSUxFUl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucHJvZmlsZXInKTtcbnZhciBSRUFDVF9QUk9WSURFUl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucHJvdmlkZXInKTtcbnZhciBSRUFDVF9DT05URVhUX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5jb250ZXh0Jyk7XG52YXIgUkVBQ1RfU0VSVkVSX0NPTlRFWFRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnNlcnZlcl9jb250ZXh0Jyk7XG52YXIgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmZvcndhcmRfcmVmJyk7XG52YXIgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlJyk7XG52YXIgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2VfbGlzdCcpO1xudmFyIFJFQUNUX01FTU9fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm1lbW8nKTtcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5sYXp5Jyk7XG52YXIgUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5vZmZzY3JlZW4nKTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudmFyIGVuYWJsZVNjb3BlQVBJID0gZmFsc2U7IC8vIEV4cGVyaW1lbnRhbCBDcmVhdGUgRXZlbnQgSGFuZGxlIEFQSS5cbnZhciBlbmFibGVDYWNoZUVsZW1lbnQgPSBmYWxzZTtcbnZhciBlbmFibGVUcmFuc2l0aW9uVHJhY2luZyA9IGZhbHNlOyAvLyBObyBrbm93biBidWdzLCBidXQgbmVlZHMgcGVyZm9ybWFuY2UgdGVzdGluZ1xuXG52YXIgZW5hYmxlTGVnYWN5SGlkZGVuID0gZmFsc2U7IC8vIEVuYWJsZXMgdW5zdGFibGVfYXZvaWRUaGlzRmFsbGJhY2sgZmVhdHVyZSBpbiBGaWJlclxuLy8gc3R1ZmYuIEludGVuZGVkIHRvIGVuYWJsZSBSZWFjdCBjb3JlIG1lbWJlcnMgdG8gbW9yZSBlYXNpbHkgZGVidWcgc2NoZWR1bGluZ1xuLy8gaXNzdWVzIGluIERFViBidWlsZHMuXG5cbnZhciBlbmFibGVEZWJ1Z1RyYWNpbmcgPSBmYWxzZTsgLy8gVHJhY2sgd2hpY2ggRmliZXIocykgc2NoZWR1bGUgcmVuZGVyIHdvcmsuXG5cbnZhciBSRUFDVF9NT0RVTEVfUkVGRVJFTkNFO1xuXG57XG4gIFJFQUNUX01PRFVMRV9SRUZFUkVOQ0UgPSBTeW1ib2wuZm9yKCdyZWFjdC5tb2R1bGUucmVmZXJlbmNlJyk7XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSB7XG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyBOb3RlOiB0eXBlb2YgbWlnaHQgYmUgb3RoZXIgdGhhbiAnc3ltYm9sJyBvciAnbnVtYmVyJyAoZS5nLiBpZiBpdCdzIGEgcG9seWZpbGwpLlxuXG5cbiAgaWYgKHR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRSB8fCBlbmFibGVEZWJ1Z1RyYWNpbmcgIHx8IHR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgfHwgZW5hYmxlTGVnYWN5SGlkZGVuICB8fCB0eXBlID09PSBSRUFDVF9PRkZTQ1JFRU5fVFlQRSB8fCBlbmFibGVTY29wZUFQSSAgfHwgZW5hYmxlQ2FjaGVFbGVtZW50ICB8fCBlbmFibGVUcmFuc2l0aW9uVHJhY2luZyApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgLy8gVGhpcyBuZWVkcyB0byBpbmNsdWRlIGFsbCBwb3NzaWJsZSBtb2R1bGUgcmVmZXJlbmNlIG9iamVjdFxuICAgIC8vIHR5cGVzIHN1cHBvcnRlZCBieSBhbnkgRmxpZ2h0IGNvbmZpZ3VyYXRpb24gYW55d2hlcmUgc2luY2VcbiAgICAvLyB3ZSBkb24ndCBrbm93IHdoaWNoIEZsaWdodCBidWlsZCB0aGlzIHdpbGwgZW5kIHVwIGJlaW5nIHVzZWRcbiAgICAvLyB3aXRoLlxuICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01PRFVMRV9SRUZFUkVOQ0UgfHwgdHlwZS5nZXRNb2R1bGVJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHR5cGVPZihvYmplY3QpIHtcbiAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCkge1xuICAgIHZhciAkJHR5cGVvZiA9IG9iamVjdC4kJHR5cGVvZjtcblxuICAgIHN3aXRjaCAoJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICB2YXIgdHlwZSA9IG9iamVjdC50eXBlO1xuXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgICAgICAgIHJldHVybiB0eXBlO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHZhciAkJHR5cGVvZlR5cGUgPSB0eXBlICYmIHR5cGUuJCR0eXBlb2Y7XG5cbiAgICAgICAgICAgIHN3aXRjaCAoJCR0eXBlb2ZUeXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfU0VSVkVSX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mVHlwZTtcblxuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAkJHR5cGVvZjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgIHJldHVybiAkJHR5cGVvZjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxudmFyIENvbnRleHRDb25zdW1lciA9IFJFQUNUX0NPTlRFWFRfVFlQRTtcbnZhciBDb250ZXh0UHJvdmlkZXIgPSBSRUFDVF9QUk9WSURFUl9UWVBFO1xudmFyIEVsZW1lbnQgPSBSRUFDVF9FTEVNRU5UX1RZUEU7XG52YXIgRm9yd2FyZFJlZiA9IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU7XG52YXIgRnJhZ21lbnQgPSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xudmFyIExhenkgPSBSRUFDVF9MQVpZX1RZUEU7XG52YXIgTWVtbyA9IFJFQUNUX01FTU9fVFlQRTtcbnZhciBQb3J0YWwgPSBSRUFDVF9QT1JUQUxfVFlQRTtcbnZhciBQcm9maWxlciA9IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG52YXIgU3RyaWN0TW9kZSA9IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG52YXIgU3VzcGVuc2UgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xudmFyIFN1c3BlbnNlTGlzdCA9IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTtcbnZhciBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSA9IGZhbHNlO1xudmFyIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQ29uY3VycmVudE1vZGUgPSBmYWxzZTsgLy8gQXN5bmNNb2RlIHNob3VsZCBiZSBkZXByZWNhdGVkXG5cbmZ1bmN0aW9uIGlzQXN5bmNNb2RlKG9iamVjdCkge1xuICB7XG4gICAgaWYgKCFoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSkge1xuICAgICAgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUgPSB0cnVlOyAvLyBVc2luZyBjb25zb2xlWyd3YXJuJ10gdG8gZXZhZGUgQmFiZWwgYW5kIEVTTGludFxuXG4gICAgICBjb25zb2xlWyd3YXJuJ10oJ1RoZSBSZWFjdElzLmlzQXN5bmNNb2RlKCkgYWxpYXMgaGFzIGJlZW4gZGVwcmVjYXRlZCwgJyArICdhbmQgd2lsbCBiZSByZW1vdmVkIGluIFJlYWN0IDE4Ky4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBpc0NvbmN1cnJlbnRNb2RlKG9iamVjdCkge1xuICB7XG4gICAgaWYgKCFoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0NvbmN1cnJlbnRNb2RlKSB7XG4gICAgICBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0NvbmN1cnJlbnRNb2RlID0gdHJ1ZTsgLy8gVXNpbmcgY29uc29sZVsnd2FybiddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcblxuICAgICAgY29uc29sZVsnd2FybiddKCdUaGUgUmVhY3RJcy5pc0NvbmN1cnJlbnRNb2RlKCkgYWxpYXMgaGFzIGJlZW4gZGVwcmVjYXRlZCwgJyArICdhbmQgd2lsbCBiZSByZW1vdmVkIGluIFJlYWN0IDE4Ky4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBpc0NvbnRleHRDb25zdW1lcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9DT05URVhUX1RZUEU7XG59XG5mdW5jdGlvbiBpc0NvbnRleHRQcm92aWRlcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QUk9WSURFUl9UWVBFO1xufVxuZnVuY3Rpb24gaXNFbGVtZW50KG9iamVjdCkge1xuICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsICYmIG9iamVjdC4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNGb3J3YXJkUmVmKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU7XG59XG5mdW5jdGlvbiBpc0ZyYWdtZW50KG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEU7XG59XG5mdW5jdGlvbiBpc0xhenkob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfTEFaWV9UWVBFO1xufVxuZnVuY3Rpb24gaXNNZW1vKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX01FTU9fVFlQRTtcbn1cbmZ1bmN0aW9uIGlzUG9ydGFsKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BPUlRBTF9UWVBFO1xufVxuZnVuY3Rpb24gaXNQcm9maWxlcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xufVxuZnVuY3Rpb24gaXNTdHJpY3RNb2RlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG59XG5mdW5jdGlvbiBpc1N1c3BlbnNlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG59XG5mdW5jdGlvbiBpc1N1c3BlbnNlTGlzdChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU7XG59XG5cbmV4cG9ydHMuQ29udGV4dENvbnN1bWVyID0gQ29udGV4dENvbnN1bWVyO1xuZXhwb3J0cy5Db250ZXh0UHJvdmlkZXIgPSBDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLkVsZW1lbnQgPSBFbGVtZW50O1xuZXhwb3J0cy5Gb3J3YXJkUmVmID0gRm9yd2FyZFJlZjtcbmV4cG9ydHMuRnJhZ21lbnQgPSBGcmFnbWVudDtcbmV4cG9ydHMuTGF6eSA9IExhenk7XG5leHBvcnRzLk1lbW8gPSBNZW1vO1xuZXhwb3J0cy5Qb3J0YWwgPSBQb3J0YWw7XG5leHBvcnRzLlByb2ZpbGVyID0gUHJvZmlsZXI7XG5leHBvcnRzLlN0cmljdE1vZGUgPSBTdHJpY3RNb2RlO1xuZXhwb3J0cy5TdXNwZW5zZSA9IFN1c3BlbnNlO1xuZXhwb3J0cy5TdXNwZW5zZUxpc3QgPSBTdXNwZW5zZUxpc3Q7XG5leHBvcnRzLmlzQXN5bmNNb2RlID0gaXNBc3luY01vZGU7XG5leHBvcnRzLmlzQ29uY3VycmVudE1vZGUgPSBpc0NvbmN1cnJlbnRNb2RlO1xuZXhwb3J0cy5pc0NvbnRleHRDb25zdW1lciA9IGlzQ29udGV4dENvbnN1bWVyO1xuZXhwb3J0cy5pc0NvbnRleHRQcm92aWRlciA9IGlzQ29udGV4dFByb3ZpZGVyO1xuZXhwb3J0cy5pc0VsZW1lbnQgPSBpc0VsZW1lbnQ7XG5leHBvcnRzLmlzRm9yd2FyZFJlZiA9IGlzRm9yd2FyZFJlZjtcbmV4cG9ydHMuaXNGcmFnbWVudCA9IGlzRnJhZ21lbnQ7XG5leHBvcnRzLmlzTGF6eSA9IGlzTGF6eTtcbmV4cG9ydHMuaXNNZW1vID0gaXNNZW1vO1xuZXhwb3J0cy5pc1BvcnRhbCA9IGlzUG9ydGFsO1xuZXhwb3J0cy5pc1Byb2ZpbGVyID0gaXNQcm9maWxlcjtcbmV4cG9ydHMuaXNTdHJpY3RNb2RlID0gaXNTdHJpY3RNb2RlO1xuZXhwb3J0cy5pc1N1c3BlbnNlID0gaXNTdXNwZW5zZTtcbmV4cG9ydHMuaXNTdXNwZW5zZUxpc3QgPSBpc1N1c3BlbnNlTGlzdDtcbmV4cG9ydHMuaXNWYWxpZEVsZW1lbnRUeXBlID0gaXNWYWxpZEVsZW1lbnRUeXBlO1xuZXhwb3J0cy50eXBlT2YgPSB0eXBlT2Y7XG4gIH0pKCk7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWlzLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWlzLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QtanN4LXJ1bnRpbWUuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG4vLyBBVFRFTlRJT05cbi8vIFdoZW4gYWRkaW5nIG5ldyBzeW1ib2xzIHRvIHRoaXMgZmlsZSxcbi8vIFBsZWFzZSBjb25zaWRlciBhbHNvIGFkZGluZyB0byAncmVhY3QtZGV2dG9vbHMtc2hhcmVkL3NyYy9iYWNrZW5kL1JlYWN0U3ltYm9scydcbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLlxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKTtcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnBvcnRhbCcpO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mcmFnbWVudCcpO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpO1xudmFyIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm9maWxlcicpO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm92aWRlcicpO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbnRleHQnKTtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZm9yd2FyZF9yZWYnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2UnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0Jyk7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubWVtbycpO1xudmFyIFJFQUNUX0xBWllfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmxhenknKTtcbnZhciBSRUFDVF9PRkZTQ1JFRU5fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm9mZnNjcmVlbicpO1xudmFyIE1BWUJFX0lURVJBVE9SX1NZTUJPTCA9IFN5bWJvbC5pdGVyYXRvcjtcbnZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJztcbmZ1bmN0aW9uIGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkge1xuICBpZiAobWF5YmVJdGVyYWJsZSA9PT0gbnVsbCB8fCB0eXBlb2YgbWF5YmVJdGVyYWJsZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBtYXliZUl0ZXJhdG9yID0gTUFZQkVfSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbTUFZQkVfSVRFUkFUT1JfU1lNQk9MXSB8fCBtYXliZUl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXTtcblxuICBpZiAodHlwZW9mIG1heWJlSXRlcmF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbWF5YmVJdGVyYXRvcjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgUmVhY3RTaGFyZWRJbnRlcm5hbHMgPSBSZWFjdC5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRDtcblxuZnVuY3Rpb24gZXJyb3IoZm9ybWF0KSB7XG4gIHtcbiAgICB7XG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBhcmdzW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgfVxuXG4gICAgICBwcmludFdhcm5pbmcoJ2Vycm9yJywgZm9ybWF0LCBhcmdzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRXYXJuaW5nKGxldmVsLCBmb3JtYXQsIGFyZ3MpIHtcbiAgLy8gV2hlbiBjaGFuZ2luZyB0aGlzIGxvZ2ljLCB5b3UgbWlnaHQgd2FudCB0byBhbHNvXG4gIC8vIHVwZGF0ZSBjb25zb2xlV2l0aFN0YWNrRGV2Lnd3dy5qcyBhcyB3ZWxsLlxuICB7XG4gICAgdmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuICAgIHZhciBzdGFjayA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0U3RhY2tBZGRlbmR1bSgpO1xuXG4gICAgaWYgKHN0YWNrICE9PSAnJykge1xuICAgICAgZm9ybWF0ICs9ICclcyc7XG4gICAgICBhcmdzID0gYXJncy5jb25jYXQoW3N0YWNrXSk7XG4gICAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cblxuXG4gICAgdmFyIGFyZ3NXaXRoRm9ybWF0ID0gYXJncy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBTdHJpbmcoaXRlbSk7XG4gICAgfSk7IC8vIENhcmVmdWw6IFJOIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJlZml4XG5cbiAgICBhcmdzV2l0aEZvcm1hdC51bnNoaWZ0KCdXYXJuaW5nOiAnICsgZm9ybWF0KTsgLy8gV2UgaW50ZW50aW9uYWxseSBkb24ndCB1c2Ugc3ByZWFkIChvciAuYXBwbHkpIGRpcmVjdGx5IGJlY2F1c2UgaXRcbiAgICAvLyBicmVha3MgSUU5OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzNjEwXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZ1xuXG4gICAgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoY29uc29sZVtsZXZlbF0sIGNvbnNvbGUsIGFyZ3NXaXRoRm9ybWF0KTtcbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG52YXIgZW5hYmxlU2NvcGVBUEkgPSBmYWxzZTsgLy8gRXhwZXJpbWVudGFsIENyZWF0ZSBFdmVudCBIYW5kbGUgQVBJLlxudmFyIGVuYWJsZUNhY2hlRWxlbWVudCA9IGZhbHNlO1xudmFyIGVuYWJsZVRyYW5zaXRpb25UcmFjaW5nID0gZmFsc2U7IC8vIE5vIGtub3duIGJ1Z3MsIGJ1dCBuZWVkcyBwZXJmb3JtYW5jZSB0ZXN0aW5nXG5cbnZhciBlbmFibGVMZWdhY3lIaWRkZW4gPSBmYWxzZTsgLy8gRW5hYmxlcyB1bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFjayBmZWF0dXJlIGluIEZpYmVyXG4vLyBzdHVmZi4gSW50ZW5kZWQgdG8gZW5hYmxlIFJlYWN0IGNvcmUgbWVtYmVycyB0byBtb3JlIGVhc2lseSBkZWJ1ZyBzY2hlZHVsaW5nXG4vLyBpc3N1ZXMgaW4gREVWIGJ1aWxkcy5cblxudmFyIGVuYWJsZURlYnVnVHJhY2luZyA9IGZhbHNlOyAvLyBUcmFjayB3aGljaCBGaWJlcihzKSBzY2hlZHVsZSByZW5kZXIgd29yay5cblxudmFyIFJFQUNUX01PRFVMRV9SRUZFUkVOQ0U7XG5cbntcbiAgUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm1vZHVsZS5yZWZlcmVuY2UnKTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIE5vdGU6IHR5cGVvZiBtaWdodCBiZSBvdGhlciB0aGFuICdzeW1ib2wnIG9yICdudW1iZXInIChlLmcuIGlmIGl0J3MgYSBwb2x5ZmlsbCkuXG5cblxuICBpZiAodHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFIHx8IGVuYWJsZURlYnVnVHJhY2luZyAgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCBlbmFibGVMZWdhY3lIaWRkZW4gIHx8IHR5cGUgPT09IFJFQUNUX09GRlNDUkVFTl9UWVBFIHx8IGVuYWJsZVNjb3BlQVBJICB8fCBlbmFibGVDYWNoZUVsZW1lbnQgIHx8IGVuYWJsZVRyYW5zaXRpb25UcmFjaW5nICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCAvLyBUaGlzIG5lZWRzIHRvIGluY2x1ZGUgYWxsIHBvc3NpYmxlIG1vZHVsZSByZWZlcmVuY2Ugb2JqZWN0XG4gICAgLy8gdHlwZXMgc3VwcG9ydGVkIGJ5IGFueSBGbGlnaHQgY29uZmlndXJhdGlvbiBhbnl3aGVyZSBzaW5jZVxuICAgIC8vIHdlIGRvbid0IGtub3cgd2hpY2ggRmxpZ2h0IGJ1aWxkIHRoaXMgd2lsbCBlbmQgdXAgYmVpbmcgdXNlZFxuICAgIC8vIHdpdGguXG4gICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRSB8fCB0eXBlLmdldE1vZHVsZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0V3JhcHBlZE5hbWUob3V0ZXJUeXBlLCBpbm5lclR5cGUsIHdyYXBwZXJOYW1lKSB7XG4gIHZhciBkaXNwbGF5TmFtZSA9IG91dGVyVHlwZS5kaXNwbGF5TmFtZTtcblxuICBpZiAoZGlzcGxheU5hbWUpIHtcbiAgICByZXR1cm4gZGlzcGxheU5hbWU7XG4gIH1cblxuICB2YXIgZnVuY3Rpb25OYW1lID0gaW5uZXJUeXBlLmRpc3BsYXlOYW1lIHx8IGlubmVyVHlwZS5uYW1lIHx8ICcnO1xuICByZXR1cm4gZnVuY3Rpb25OYW1lICE9PSAnJyA/IHdyYXBwZXJOYW1lICsgXCIoXCIgKyBmdW5jdGlvbk5hbWUgKyBcIilcIiA6IHdyYXBwZXJOYW1lO1xufSAvLyBLZWVwIGluIHN5bmMgd2l0aCByZWFjdC1yZWNvbmNpbGVyL2dldENvbXBvbmVudE5hbWVGcm9tRmliZXJcblxuXG5mdW5jdGlvbiBnZXRDb250ZXh0TmFtZSh0eXBlKSB7XG4gIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8ICdDb250ZXh0Jztcbn0gLy8gTm90ZSB0aGF0IHRoZSByZWNvbmNpbGVyIHBhY2thZ2Ugc2hvdWxkIGdlbmVyYWxseSBwcmVmZXIgdG8gdXNlIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoKSBpbnN0ZWFkLlxuXG5cbmZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKSB7XG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICAvLyBIb3N0IHJvb3QsIHRleHQgbm9kZSBvciBqdXN0IGludmFsaWQgdHlwZS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHtcbiAgICBpZiAodHlwZW9mIHR5cGUudGFnID09PSAnbnVtYmVyJykge1xuICAgICAgZXJyb3IoJ1JlY2VpdmVkIGFuIHVuZXhwZWN0ZWQgb2JqZWN0IGluIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSgpLiAnICsgJ1RoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgbnVsbDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgIHJldHVybiAnRnJhZ21lbnQnO1xuXG4gICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgIHJldHVybiAnUG9ydGFsJztcblxuICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgIHJldHVybiAnUHJvZmlsZXInO1xuXG4gICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgcmV0dXJuICdTdHJpY3RNb2RlJztcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2UnO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlTGlzdCc7XG5cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuICAgICAgICB2YXIgY29udGV4dCA9IHR5cGU7XG4gICAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZShjb250ZXh0KSArICcuQ29uc3VtZXInO1xuXG4gICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgIHZhciBwcm92aWRlciA9IHR5cGU7XG4gICAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZShwcm92aWRlci5fY29udGV4dCkgKyAnLlByb3ZpZGVyJztcblxuICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZE5hbWUodHlwZSwgdHlwZS5yZW5kZXIsICdGb3J3YXJkUmVmJyk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICB2YXIgb3V0ZXJOYW1lID0gdHlwZS5kaXNwbGF5TmFtZSB8fCBudWxsO1xuXG4gICAgICAgIGlmIChvdXRlck5hbWUgIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gb3V0ZXJOYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlLnR5cGUpIHx8ICdNZW1vJztcblxuICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbGF6eUNvbXBvbmVudCA9IHR5cGU7XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGluaXQocGF5bG9hZCkpO1xuICAgICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxudmFyIGFzc2lnbiA9IE9iamVjdC5hc3NpZ247XG5cbi8vIEhlbHBlcnMgdG8gcGF0Y2ggY29uc29sZS5sb2dzIHRvIGF2b2lkIGxvZ2dpbmcgZHVyaW5nIHNpZGUtZWZmZWN0IGZyZWVcbi8vIHJlcGxheWluZyBvbiByZW5kZXIgZnVuY3Rpb24uIFRoaXMgY3VycmVudGx5IG9ubHkgcGF0Y2hlcyB0aGUgb2JqZWN0XG4vLyBsYXppbHkgd2hpY2ggd29uJ3QgY292ZXIgaWYgdGhlIGxvZyBmdW5jdGlvbiB3YXMgZXh0cmFjdGVkIGVhZ2VybHkuXG4vLyBXZSBjb3VsZCBhbHNvIGVhZ2VybHkgcGF0Y2ggdGhlIG1ldGhvZC5cbnZhciBkaXNhYmxlZERlcHRoID0gMDtcbnZhciBwcmV2TG9nO1xudmFyIHByZXZJbmZvO1xudmFyIHByZXZXYXJuO1xudmFyIHByZXZFcnJvcjtcbnZhciBwcmV2R3JvdXA7XG52YXIgcHJldkdyb3VwQ29sbGFwc2VkO1xudmFyIHByZXZHcm91cEVuZDtcblxuZnVuY3Rpb24gZGlzYWJsZWRMb2coKSB7fVxuXG5kaXNhYmxlZExvZy5fX3JlYWN0RGlzYWJsZWRMb2cgPSB0cnVlO1xuZnVuY3Rpb24gZGlzYWJsZUxvZ3MoKSB7XG4gIHtcbiAgICBpZiAoZGlzYWJsZWREZXB0aCA9PT0gMCkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgICBwcmV2TG9nID0gY29uc29sZS5sb2c7XG4gICAgICBwcmV2SW5mbyA9IGNvbnNvbGUuaW5mbztcbiAgICAgIHByZXZXYXJuID0gY29uc29sZS53YXJuO1xuICAgICAgcHJldkVycm9yID0gY29uc29sZS5lcnJvcjtcbiAgICAgIHByZXZHcm91cCA9IGNvbnNvbGUuZ3JvdXA7XG4gICAgICBwcmV2R3JvdXBDb2xsYXBzZWQgPSBjb25zb2xlLmdyb3VwQ29sbGFwc2VkO1xuICAgICAgcHJldkdyb3VwRW5kID0gY29uc29sZS5ncm91cEVuZDsgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xOTA5OVxuXG4gICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IGRpc2FibGVkTG9nLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBpbmZvOiBwcm9wcyxcbiAgICAgICAgbG9nOiBwcm9wcyxcbiAgICAgICAgd2FybjogcHJvcHMsXG4gICAgICAgIGVycm9yOiBwcm9wcyxcbiAgICAgICAgZ3JvdXA6IHByb3BzLFxuICAgICAgICBncm91cENvbGxhcHNlZDogcHJvcHMsXG4gICAgICAgIGdyb3VwRW5kOiBwcm9wc1xuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGRpc2FibGVkRGVwdGgrKztcbiAgfVxufVxuZnVuY3Rpb24gcmVlbmFibGVMb2dzKCkge1xuICB7XG4gICAgZGlzYWJsZWREZXB0aC0tO1xuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lIEZsb3cgdGhpbmtzIGNvbnNvbGUgaXMgaW1tdXRhYmxlLlxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjb25zb2xlLCB7XG4gICAgICAgIGxvZzogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2TG9nXG4gICAgICAgIH0pLFxuICAgICAgICBpbmZvOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZJbmZvXG4gICAgICAgIH0pLFxuICAgICAgICB3YXJuOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZXYXJuXG4gICAgICAgIH0pLFxuICAgICAgICBlcnJvcjogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2RXJyb3JcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cFxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwQ29sbGFwc2VkXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cEVuZDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBFbmRcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICB9XG5cbiAgICBpZiAoZGlzYWJsZWREZXB0aCA8IDApIHtcbiAgICAgIGVycm9yKCdkaXNhYmxlZERlcHRoIGZlbGwgYmVsb3cgemVyby4gJyArICdUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyO1xudmFyIHByZWZpeDtcbmZ1bmN0aW9uIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUsIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgaWYgKHByZWZpeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBFeHRyYWN0IHRoZSBWTSBzcGVjaWZpYyBwcmVmaXggdXNlZCBieSBlYWNoIGxpbmUuXG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICB2YXIgbWF0Y2ggPSB4LnN0YWNrLnRyaW0oKS5tYXRjaCgvXFxuKCAqKGF0ICk/KS8pO1xuICAgICAgICBwcmVmaXggPSBtYXRjaCAmJiBtYXRjaFsxXSB8fCAnJztcbiAgICAgIH1cbiAgICB9IC8vIFdlIHVzZSB0aGUgcHJlZml4IHRvIGVuc3VyZSBvdXIgc3RhY2tzIGxpbmUgdXAgd2l0aCBuYXRpdmUgc3RhY2sgZnJhbWVzLlxuXG5cbiAgICByZXR1cm4gJ1xcbicgKyBwcmVmaXggKyBuYW1lO1xuICB9XG59XG52YXIgcmVlbnRyeSA9IGZhbHNlO1xudmFyIGNvbXBvbmVudEZyYW1lQ2FjaGU7XG5cbntcbiAgdmFyIFBvc3NpYmx5V2Vha01hcCA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nID8gV2Vha01hcCA6IE1hcDtcbiAgY29tcG9uZW50RnJhbWVDYWNoZSA9IG5ldyBQb3NzaWJseVdlYWtNYXAoKTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShmbiwgY29uc3RydWN0KSB7XG4gIC8vIElmIHNvbWV0aGluZyBhc2tlZCBmb3IgYSBzdGFjayBpbnNpZGUgYSBmYWtlIHJlbmRlciwgaXQgc2hvdWxkIGdldCBpZ25vcmVkLlxuICBpZiAoICFmbiB8fCByZWVudHJ5KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAge1xuICAgIHZhciBmcmFtZSA9IGNvbXBvbmVudEZyYW1lQ2FjaGUuZ2V0KGZuKTtcblxuICAgIGlmIChmcmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZnJhbWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbnRyb2w7XG4gIHJlZW50cnkgPSB0cnVlO1xuICB2YXIgcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZSA9IEVycm9yLnByZXBhcmVTdGFja1RyYWNlOyAvLyAkRmxvd0ZpeE1lIEl0IGRvZXMgYWNjZXB0IHVuZGVmaW5lZC5cblxuICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHVuZGVmaW5lZDtcbiAgdmFyIHByZXZpb3VzRGlzcGF0Y2hlcjtcblxuICB7XG4gICAgcHJldmlvdXNEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50OyAvLyBTZXQgdGhlIGRpc3BhdGNoZXIgaW4gREVWIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBjYWxsIGluIHRoZSByZW5kZXIgZnVuY3Rpb25cbiAgICAvLyBmb3Igd2FybmluZ3MuXG5cbiAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQgPSBudWxsO1xuICAgIGRpc2FibGVMb2dzKCk7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIFRoaXMgc2hvdWxkIHRocm93LlxuICAgIGlmIChjb25zdHJ1Y3QpIHtcbiAgICAgIC8vIFNvbWV0aGluZyBzaG91bGQgYmUgc2V0dGluZyB0aGUgcHJvcHMgaW4gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAgdmFyIEZha2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lXG5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZha2UucHJvdG90eXBlLCAncHJvcHMnLCB7XG4gICAgICAgIHNldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIFdlIHVzZSBhIHRocm93aW5nIHNldHRlciBpbnN0ZWFkIG9mIGZyb3plbiBvciBub24td3JpdGFibGUgcHJvcHNcbiAgICAgICAgICAvLyBiZWNhdXNlIHRoYXQgd29uJ3QgdGhyb3cgaW4gYSBub24tc3RyaWN0IG1vZGUgZnVuY3Rpb24uXG4gICAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgJiYgUmVmbGVjdC5jb25zdHJ1Y3QpIHtcbiAgICAgICAgLy8gV2UgY29uc3RydWN0IGEgZGlmZmVyZW50IGNvbnRyb2wgZm9yIHRoaXMgY2FzZSB0byBpbmNsdWRlIGFueSBleHRyYVxuICAgICAgICAvLyBmcmFtZXMgYWRkZWQgYnkgdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICB0cnkge1xuICAgICAgICAgIFJlZmxlY3QuY29uc3RydWN0KEZha2UsIFtdKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgICB9XG5cbiAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoZm4sIFtdLCBGYWtlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgRmFrZS5jYWxsKCk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZuLmNhbGwoRmFrZS5wcm90b3R5cGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICBjb250cm9sID0geDtcbiAgICAgIH1cblxuICAgICAgZm4oKTtcbiAgICB9XG4gIH0gY2F0Y2ggKHNhbXBsZSkge1xuICAgIC8vIFRoaXMgaXMgaW5saW5lZCBtYW51YWxseSBiZWNhdXNlIGNsb3N1cmUgZG9lc24ndCBkbyBpdCBmb3IgdXMuXG4gICAgaWYgKHNhbXBsZSAmJiBjb250cm9sICYmIHR5cGVvZiBzYW1wbGUuc3RhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBUaGlzIGV4dHJhY3RzIHRoZSBmaXJzdCBmcmFtZSBmcm9tIHRoZSBzYW1wbGUgdGhhdCBpc24ndCBhbHNvIGluIHRoZSBjb250cm9sLlxuICAgICAgLy8gU2tpcHBpbmcgb25lIGZyYW1lIHRoYXQgd2UgYXNzdW1lIGlzIHRoZSBmcmFtZSB0aGF0IGNhbGxzIHRoZSB0d28uXG4gICAgICB2YXIgc2FtcGxlTGluZXMgPSBzYW1wbGUuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIGNvbnRyb2xMaW5lcyA9IGNvbnRyb2wuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIHMgPSBzYW1wbGVMaW5lcy5sZW5ndGggLSAxO1xuICAgICAgdmFyIGMgPSBjb250cm9sTGluZXMubGVuZ3RoIC0gMTtcblxuICAgICAgd2hpbGUgKHMgPj0gMSAmJiBjID49IDAgJiYgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAvLyBXZSBleHBlY3QgYXQgbGVhc3Qgb25lIHN0YWNrIGZyYW1lIHRvIGJlIHNoYXJlZC5cbiAgICAgICAgLy8gVHlwaWNhbGx5IHRoaXMgd2lsbCBiZSB0aGUgcm9vdCBtb3N0IG9uZS4gSG93ZXZlciwgc3RhY2sgZnJhbWVzIG1heSBiZVxuICAgICAgICAvLyBjdXQgb2ZmIGR1ZSB0byBtYXhpbXVtIHN0YWNrIGxpbWl0cy4gSW4gdGhpcyBjYXNlLCBvbmUgbWF5YmUgY3V0IG9mZlxuICAgICAgICAvLyBlYXJsaWVyIHRoYW4gdGhlIG90aGVyLiBXZSBhc3N1bWUgdGhhdCB0aGUgc2FtcGxlIGlzIGxvbmdlciBvciB0aGUgc2FtZVxuICAgICAgICAvLyBhbmQgdGhlcmUgZm9yIGN1dCBvZmYgZWFybGllci4gU28gd2Ugc2hvdWxkIGZpbmQgdGhlIHJvb3QgbW9zdCBmcmFtZSBpblxuICAgICAgICAvLyB0aGUgc2FtcGxlIHNvbWV3aGVyZSBpbiB0aGUgY29udHJvbC5cbiAgICAgICAgYy0tO1xuICAgICAgfVxuXG4gICAgICBmb3IgKDsgcyA+PSAxICYmIGMgPj0gMDsgcy0tLCBjLS0pIHtcbiAgICAgICAgLy8gTmV4dCB3ZSBmaW5kIHRoZSBmaXJzdCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSB3aGljaCBzaG91bGQgYmUgdGhlXG4gICAgICAgIC8vIGZyYW1lIHRoYXQgY2FsbGVkIG91ciBzYW1wbGUgZnVuY3Rpb24gYW5kIHRoZSBjb250cm9sLlxuICAgICAgICBpZiAoc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgIC8vIEluIFY4LCB0aGUgZmlyc3QgbGluZSBpcyBkZXNjcmliaW5nIHRoZSBtZXNzYWdlIGJ1dCBvdGhlciBWTXMgZG9uJ3QuXG4gICAgICAgICAgLy8gSWYgd2UncmUgYWJvdXQgdG8gcmV0dXJuIHRoZSBmaXJzdCBsaW5lLCBhbmQgdGhlIGNvbnRyb2wgaXMgYWxzbyBvbiB0aGUgc2FtZVxuICAgICAgICAgIC8vIGxpbmUsIHRoYXQncyBhIHByZXR0eSBnb29kIGluZGljYXRvciB0aGF0IG91ciBzYW1wbGUgdGhyZXcgYXQgc2FtZSBsaW5lIGFzXG4gICAgICAgICAgLy8gdGhlIGNvbnRyb2wuIEkuZS4gYmVmb3JlIHdlIGVudGVyZWQgdGhlIHNhbXBsZSBmcmFtZS4gU28gd2UgaWdub3JlIHRoaXMgcmVzdWx0LlxuICAgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiB5b3UgcGFzc2VkIGEgY2xhc3MgdG8gZnVuY3Rpb24gY29tcG9uZW50LCBvciBub24tZnVuY3Rpb24uXG4gICAgICAgICAgaWYgKHMgIT09IDEgfHwgYyAhPT0gMSkge1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBzLS07XG4gICAgICAgICAgICAgIGMtLTsgLy8gV2UgbWF5IHN0aWxsIGhhdmUgc2ltaWxhciBpbnRlcm1lZGlhdGUgZnJhbWVzIGZyb20gdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICAgICAgICAvLyBUaGUgbmV4dCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSBzaG91bGQgYmUgb3VyIG1hdGNoIHRob3VnaC5cblxuICAgICAgICAgICAgICBpZiAoYyA8IDAgfHwgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgICAgICAgIC8vIFY4IGFkZHMgYSBcIm5ld1wiIHByZWZpeCBmb3IgbmF0aXZlIGNsYXNzZXMuIExldCdzIHJlbW92ZSBpdCB0byBtYWtlIGl0IHByZXR0aWVyLlxuICAgICAgICAgICAgICAgIHZhciBfZnJhbWUgPSAnXFxuJyArIHNhbXBsZUxpbmVzW3NdLnJlcGxhY2UoJyBhdCBuZXcgJywgJyBhdCAnKTsgLy8gSWYgb3VyIGNvbXBvbmVudCBmcmFtZSBpcyBsYWJlbGVkIFwiPGFub255bW91cz5cIlxuICAgICAgICAgICAgICAgIC8vIGJ1dCB3ZSBoYXZlIGEgdXNlci1wcm92aWRlZCBcImRpc3BsYXlOYW1lXCJcbiAgICAgICAgICAgICAgICAvLyBzcGxpY2UgaXQgaW4gdG8gbWFrZSB0aGUgc3RhY2sgbW9yZSByZWFkYWJsZS5cblxuXG4gICAgICAgICAgICAgICAgaWYgKGZuLmRpc3BsYXlOYW1lICYmIF9mcmFtZS5pbmNsdWRlcygnPGFub255bW91cz4nKSkge1xuICAgICAgICAgICAgICAgICAgX2ZyYW1lID0gX2ZyYW1lLnJlcGxhY2UoJzxhbm9ueW1vdXM+JywgZm4uZGlzcGxheU5hbWUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIF9mcmFtZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSAvLyBSZXR1cm4gdGhlIGxpbmUgd2UgZm91bmQuXG5cblxuICAgICAgICAgICAgICAgIHJldHVybiBfZnJhbWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gd2hpbGUgKHMgPj0gMSAmJiBjID49IDApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHJlZW50cnkgPSBmYWxzZTtcblxuICAgIHtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudCA9IHByZXZpb3VzRGlzcGF0Y2hlcjtcbiAgICAgIHJlZW5hYmxlTG9ncygpO1xuICAgIH1cblxuICAgIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZTtcbiAgfSAvLyBGYWxsYmFjayB0byBqdXN0IHVzaW5nIHRoZSBuYW1lIGlmIHdlIGNvdWxkbid0IG1ha2UgaXQgdGhyb3cuXG5cblxuICB2YXIgbmFtZSA9IGZuID8gZm4uZGlzcGxheU5hbWUgfHwgZm4ubmFtZSA6ICcnO1xuICB2YXIgc3ludGhldGljRnJhbWUgPSBuYW1lID8gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSkgOiAnJztcblxuICB7XG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIHN5bnRoZXRpY0ZyYW1lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3ludGhldGljRnJhbWU7XG59XG5mdW5jdGlvbiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZm4sIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGZhbHNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QoQ29tcG9uZW50KSB7XG4gIHZhciBwcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICByZXR1cm4gISEocHJvdG90eXBlICYmIHByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUsIHNvdXJjZSwgb3duZXJGbikge1xuXG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB7XG4gICAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZSh0eXBlLCBzaG91bGRDb25zdHJ1Y3QodHlwZSkpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUodHlwZSk7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlJyk7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2VMaXN0Jyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUodHlwZS5yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgLy8gTWVtbyBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLnR5cGUsIHNvdXJjZSwgb3duZXJGbik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSB0eXBlO1xuICAgICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gTGF6eSBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgICAgIHJldHVybiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoaW5pdChwYXlsb2FkKSwgc291cmNlLCBvd25lckZuKTtcbiAgICAgICAgICB9IGNhdGNoICh4KSB7fVxuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgbG9nZ2VkVHlwZUZhaWx1cmVzID0ge307XG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG5cbmZ1bmN0aW9uIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgIHZhciBzdGFjayA9IGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihlbGVtZW50LnR5cGUsIGVsZW1lbnQuX3NvdXJjZSwgb3duZXIgPyBvd25lci50eXBlIDogbnVsbCk7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLnNldEV4dHJhU3RhY2tGcmFtZShzdGFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuc2V0RXh0cmFTdGFja0ZyYW1lKG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja1Byb3BUeXBlcyh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24sIGNvbXBvbmVudE5hbWUsIGVsZW1lbnQpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWUgVGhpcyBpcyBva2F5IGJ1dCBGbG93IGRvZXNuJ3Qga25vdyBpdC5cbiAgICB2YXIgaGFzID0gRnVuY3Rpb24uY2FsbC5iaW5kKGhhc093blByb3BlcnR5KTtcblxuICAgIGZvciAodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHtcbiAgICAgIGlmIChoYXModHlwZVNwZWNzLCB0eXBlU3BlY05hbWUpKSB7XG4gICAgICAgIHZhciBlcnJvciQxID0gdm9pZCAwOyAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuXG4gICAgICAgIC8vIEFmdGVyIHRoZXNlIGhhdmUgYmVlbiBjbGVhbmVkIHVwLCB3ZSdsbCBsZXQgdGhlbSB0aHJvdy5cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhbiBpbnZhcmlhbnQgdGhhdCBnZXRzIGNhdWdodC4gSXQncyB0aGUgc2FtZVxuICAgICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS5cbiAgICAgICAgICBpZiAodHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgICAgICAgdmFyIGVyciA9IEVycm9yKChjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycpICsgJzogJyArIGxvY2F0aW9uICsgJyB0eXBlIGAnICsgdHlwZVNwZWNOYW1lICsgJ2AgaXMgaW52YWxpZDsgJyArICdpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UsIGJ1dCByZWNlaXZlZCBgJyArIHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSArICdgLicgKyAnVGhpcyBvZnRlbiBoYXBwZW5zIGJlY2F1c2Ugb2YgdHlwb3Mgc3VjaCBhcyBgUHJvcFR5cGVzLmZ1bmN0aW9uYCBpbnN0ZWFkIG9mIGBQcm9wVHlwZXMuZnVuY2AuJyk7XG4gICAgICAgICAgICBlcnIubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlcnJvciQxID0gdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0odmFsdWVzLCB0eXBlU3BlY05hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBudWxsLCAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnKTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICBlcnJvciQxID0gZXg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IkMSAmJiAhKGVycm9yJDEgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgIGVycm9yKCclczogdHlwZSBzcGVjaWZpY2F0aW9uIG9mICVzJyArICcgYCVzYCBpcyBpbnZhbGlkOyB0aGUgdHlwZSBjaGVja2VyICcgKyAnZnVuY3Rpb24gbXVzdCByZXR1cm4gYG51bGxgIG9yIGFuIGBFcnJvcmAgYnV0IHJldHVybmVkIGEgJXMuICcgKyAnWW91IG1heSBoYXZlIGZvcmdvdHRlbiB0byBwYXNzIGFuIGFyZ3VtZW50IHRvIHRoZSB0eXBlIGNoZWNrZXIgJyArICdjcmVhdG9yIChhcnJheU9mLCBpbnN0YW5jZU9mLCBvYmplY3RPZiwgb25lT2YsIG9uZU9mVHlwZSwgYW5kICcgKyAnc2hhcGUgYWxsIHJlcXVpcmUgYW4gYXJndW1lbnQpLicsIGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJywgbG9jYXRpb24sIHR5cGVTcGVjTmFtZSwgdHlwZW9mIGVycm9yJDEpO1xuXG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IkMSBpbnN0YW5jZW9mIEVycm9yICYmICEoZXJyb3IkMS5tZXNzYWdlIGluIGxvZ2dlZFR5cGVGYWlsdXJlcykpIHtcbiAgICAgICAgICAvLyBPbmx5IG1vbml0b3IgdGhpcyBmYWlsdXJlIG9uY2UgYmVjYXVzZSB0aGVyZSB0ZW5kcyB0byBiZSBhIGxvdCBvZiB0aGVcbiAgICAgICAgICAvLyBzYW1lIGVycm9yLlxuICAgICAgICAgIGxvZ2dlZFR5cGVGYWlsdXJlc1tlcnJvciQxLm1lc3NhZ2VdID0gdHJ1ZTtcbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgIGVycm9yKCdGYWlsZWQgJXMgdHlwZTogJXMnLCBsb2NhdGlvbiwgZXJyb3IkMS5tZXNzYWdlKTtcblxuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBpc0FycmF5SW1wbCA9IEFycmF5LmlzQXJyYXk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZWRlY2xhcmVcblxuZnVuY3Rpb24gaXNBcnJheShhKSB7XG4gIHJldHVybiBpc0FycmF5SW1wbChhKTtcbn1cblxuLypcbiAqIFRoZSBgJycgKyB2YWx1ZWAgcGF0dGVybiAodXNlZCBpbiBpbiBwZXJmLXNlbnNpdGl2ZSBjb2RlKSB0aHJvd3MgZm9yIFN5bWJvbFxuICogYW5kIFRlbXBvcmFsLiogdHlwZXMuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8yMjA2NC5cbiAqXG4gKiBUaGUgZnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlIHdpbGwgdGhyb3cgYW4gZWFzaWVyLXRvLXVuZGVyc3RhbmQsXG4gKiBlYXNpZXItdG8tZGVidWcgZXhjZXB0aW9uIHdpdGggYSBjbGVhciBlcnJvcnMgbWVzc2FnZSBtZXNzYWdlIGV4cGxhaW5pbmcgdGhlXG4gKiBwcm9ibGVtLiAoSW5zdGVhZCBvZiBhIGNvbmZ1c2luZyBleGNlcHRpb24gdGhyb3duIGluc2lkZSB0aGUgaW1wbGVtZW50YXRpb25cbiAqIG9mIHRoZSBgdmFsdWVgIG9iamVjdCkuXG4gKi9cbi8vICRGbG93Rml4TWUgb25seSBjYWxsZWQgaW4gREVWLCBzbyB2b2lkIHJldHVybiBpcyBub3QgcG9zc2libGUuXG5mdW5jdGlvbiB0eXBlTmFtZSh2YWx1ZSkge1xuICB7XG4gICAgLy8gdG9TdHJpbmdUYWcgaXMgbmVlZGVkIGZvciBuYW1lc3BhY2VkIHR5cGVzIGxpa2UgVGVtcG9yYWwuSW5zdGFudFxuICAgIHZhciBoYXNUb1N0cmluZ1RhZyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLnRvU3RyaW5nVGFnO1xuICAgIHZhciB0eXBlID0gaGFzVG9TdHJpbmdUYWcgJiYgdmFsdWVbU3ltYm9sLnRvU3RyaW5nVGFnXSB8fCB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lIHx8ICdPYmplY3QnO1xuICAgIHJldHVybiB0eXBlO1xuICB9XG59IC8vICRGbG93Rml4TWUgb25seSBjYWxsZWQgaW4gREVWLCBzbyB2b2lkIHJldHVybiBpcyBub3QgcG9zc2libGUuXG5cblxuZnVuY3Rpb24gd2lsbENvZXJjaW9uVGhyb3codmFsdWUpIHtcbiAge1xuICAgIHRyeSB7XG4gICAgICB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAgLy8gSWYgeW91IGVuZGVkIHVwIGhlcmUgYnkgZm9sbG93aW5nIGFuIGV4Y2VwdGlvbiBjYWxsIHN0YWNrLCBoZXJlJ3Mgd2hhdCdzXG4gIC8vIGhhcHBlbmVkOiB5b3Ugc3VwcGxpZWQgYW4gb2JqZWN0IG9yIHN5bWJvbCB2YWx1ZSB0byBSZWFjdCAoYXMgYSBwcm9wLCBrZXksXG4gIC8vIERPTSBhdHRyaWJ1dGUsIENTUyBwcm9wZXJ0eSwgc3RyaW5nIHJlZiwgZXRjLikgYW5kIHdoZW4gUmVhY3QgdHJpZWQgdG9cbiAgLy8gY29lcmNlIGl0IHRvIGEgc3RyaW5nIHVzaW5nIGAnJyArIHZhbHVlYCwgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uXG4gIC8vXG4gIC8vIFRoZSBtb3N0IGNvbW1vbiB0eXBlcyB0aGF0IHdpbGwgY2F1c2UgdGhpcyBleGNlcHRpb24gYXJlIGBTeW1ib2xgIGluc3RhbmNlc1xuICAvLyBhbmQgVGVtcG9yYWwgb2JqZWN0cyBsaWtlIGBUZW1wb3JhbC5JbnN0YW50YC4gQnV0IGFueSBvYmplY3QgdGhhdCBoYXMgYVxuICAvLyBgdmFsdWVPZmAgb3IgYFtTeW1ib2wudG9QcmltaXRpdmVdYCBtZXRob2QgdGhhdCB0aHJvd3Mgd2lsbCBhbHNvIGNhdXNlIHRoaXNcbiAgLy8gZXhjZXB0aW9uLiAoTGlicmFyeSBhdXRob3JzIGRvIHRoaXMgdG8gcHJldmVudCB1c2VycyBmcm9tIHVzaW5nIGJ1aWx0LWluXG4gIC8vIG51bWVyaWMgb3BlcmF0b3JzIGxpa2UgYCtgIG9yIGNvbXBhcmlzb24gb3BlcmF0b3JzIGxpa2UgYD49YCBiZWNhdXNlIGN1c3RvbVxuICAvLyBtZXRob2RzIGFyZSBuZWVkZWQgdG8gcGVyZm9ybSBhY2N1cmF0ZSBhcml0aG1ldGljIG9yIGNvbXBhcmlzb24uKVxuICAvL1xuICAvLyBUbyBmaXggdGhlIHByb2JsZW0sIGNvZXJjZSB0aGlzIG9iamVjdCBvciBzeW1ib2wgdmFsdWUgdG8gYSBzdHJpbmcgYmVmb3JlXG4gIC8vIHBhc3NpbmcgaXQgdG8gUmVhY3QuIFRoZSBtb3N0IHJlbGlhYmxlIHdheSBpcyB1c3VhbGx5IGBTdHJpbmcodmFsdWUpYC5cbiAgLy9cbiAgLy8gVG8gZmluZCB3aGljaCB2YWx1ZSBpcyB0aHJvd2luZywgY2hlY2sgdGhlIGJyb3dzZXIgb3IgZGVidWdnZXIgY29uc29sZS5cbiAgLy8gQmVmb3JlIHRoaXMgZXhjZXB0aW9uIHdhcyB0aHJvd24sIHRoZXJlIHNob3VsZCBiZSBgY29uc29sZS5lcnJvcmAgb3V0cHV0XG4gIC8vIHRoYXQgc2hvd3MgdGhlIHR5cGUgKFN5bWJvbCwgVGVtcG9yYWwuUGxhaW5EYXRlLCBldGMuKSB0aGF0IGNhdXNlZCB0aGVcbiAgLy8gcHJvYmxlbSBhbmQgaG93IHRoYXQgdHlwZSB3YXMgdXNlZDoga2V5LCBhdHJyaWJ1dGUsIGlucHV0IHZhbHVlIHByb3AsIGV0Yy5cbiAgLy8gSW4gbW9zdCBjYXNlcywgdGhpcyBjb25zb2xlIG91dHB1dCBhbHNvIHNob3dzIHRoZSBjb21wb25lbnQgYW5kIGl0c1xuICAvLyBhbmNlc3RvciBjb21wb25lbnRzIHdoZXJlIHRoZSBleGNlcHRpb24gaGFwcGVuZWQuXG4gIC8vXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICByZXR1cm4gJycgKyB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAge1xuICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdUaGUgcHJvdmlkZWQga2V5IGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50T3duZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRPd25lcjtcbnZhciBSRVNFUlZFRF9QUk9QUyA9IHtcbiAga2V5OiB0cnVlLFxuICByZWY6IHRydWUsXG4gIF9fc2VsZjogdHJ1ZSxcbiAgX19zb3VyY2U6IHRydWVcbn07XG52YXIgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd247XG52YXIgc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd247XG52YXIgZGlkV2FybkFib3V0U3RyaW5nUmVmcztcblxue1xuICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzID0ge307XG59XG5cbmZ1bmN0aW9uIGhhc1ZhbGlkUmVmKGNvbmZpZykge1xuICB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAncmVmJykpIHtcbiAgICAgIHZhciBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgJ3JlZicpLmdldDtcblxuICAgICAgaWYgKGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb25maWcucmVmICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGhhc1ZhbGlkS2V5KGNvbmZpZykge1xuICB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAna2V5JykpIHtcbiAgICAgIHZhciBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgJ2tleScpLmdldDtcblxuICAgICAgaWYgKGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb25maWcua2V5ICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHdhcm5JZlN0cmluZ1JlZkNhbm5vdEJlQXV0b0NvbnZlcnRlZChjb25maWcsIHNlbGYpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgY29uZmlnLnJlZiA9PT0gJ3N0cmluZycgJiYgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCAmJiBzZWxmICYmIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQuc3RhdGVOb2RlICE9PSBzZWxmKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnR5cGUpO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZXJyb3IoJ0NvbXBvbmVudCBcIiVzXCIgY29udGFpbnMgdGhlIHN0cmluZyByZWYgXCIlc1wiLiAnICsgJ1N1cHBvcnQgZm9yIHN0cmluZyByZWZzIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiAnICsgJ1RoaXMgY2FzZSBjYW5ub3QgYmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gYW4gYXJyb3cgZnVuY3Rpb24uICcgKyAnV2UgYXNrIHlvdSB0byBtYW51YWxseSBmaXggdGhpcyBjYXNlIGJ5IHVzaW5nIHVzZVJlZigpIG9yIGNyZWF0ZVJlZigpIGluc3RlYWQuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1zdHJpbmctcmVmJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQudHlwZSksIGNvbmZpZy5yZWYpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkZWZpbmVLZXlQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpIHtcbiAge1xuICAgIHZhciB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIXNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duKSB7XG4gICAgICAgIHNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignJXM6IGBrZXlgIGlzIG5vdCBhIHByb3AuIFRyeWluZyB0byBhY2Nlc3MgaXQgd2lsbCByZXN1bHQgJyArICdpbiBgdW5kZWZpbmVkYCBiZWluZyByZXR1cm5lZC4gSWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBzYW1lICcgKyAndmFsdWUgd2l0aGluIHRoZSBjaGlsZCBjb21wb25lbnQsIHlvdSBzaG91bGQgcGFzcyBpdCBhcyBhIGRpZmZlcmVudCAnICsgJ3Byb3AuIChodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3BlY2lhbC1wcm9wcyknLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHdhcm5BYm91dEFjY2Vzc2luZ0tleS5pc1JlYWN0V2FybmluZyA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3BzLCAna2V5Jywge1xuICAgICAgZ2V0OiB3YXJuQWJvdXRBY2Nlc3NpbmdLZXksXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZWZpbmVSZWZQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpIHtcbiAge1xuICAgIHZhciB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIXNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duKSB7XG4gICAgICAgIHNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignJXM6IGByZWZgIGlzIG5vdCBhIHByb3AuIFRyeWluZyB0byBhY2Nlc3MgaXQgd2lsbCByZXN1bHQgJyArICdpbiBgdW5kZWZpbmVkYCBiZWluZyByZXR1cm5lZC4gSWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBzYW1lICcgKyAndmFsdWUgd2l0aGluIHRoZSBjaGlsZCBjb21wb25lbnQsIHlvdSBzaG91bGQgcGFzcyBpdCBhcyBhIGRpZmZlcmVudCAnICsgJ3Byb3AuIChodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3BlY2lhbC1wcm9wcyknLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHdhcm5BYm91dEFjY2Vzc2luZ1JlZi5pc1JlYWN0V2FybmluZyA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3BzLCAncmVmJywge1xuICAgICAgZ2V0OiB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgfVxufVxuLyoqXG4gKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgUmVhY3QgZWxlbWVudC4gVGhpcyBubyBsb25nZXIgYWRoZXJlcyB0b1xuICogdGhlIGNsYXNzIHBhdHRlcm4sIHNvIGRvIG5vdCB1c2UgbmV3IHRvIGNhbGwgaXQuIEFsc28sIGluc3RhbmNlb2YgY2hlY2tcbiAqIHdpbGwgbm90IHdvcmsuIEluc3RlYWQgdGVzdCAkJHR5cGVvZiBmaWVsZCBhZ2FpbnN0IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSB0byBjaGVja1xuICogaWYgc29tZXRoaW5nIGlzIGEgUmVhY3QgRWxlbWVudC5cbiAqXG4gKiBAcGFyYW0geyp9IHR5cGVcbiAqIEBwYXJhbSB7Kn0gcHJvcHNcbiAqIEBwYXJhbSB7Kn0ga2V5XG4gKiBAcGFyYW0ge3N0cmluZ3xvYmplY3R9IHJlZlxuICogQHBhcmFtIHsqfSBvd25lclxuICogQHBhcmFtIHsqfSBzZWxmIEEgKnRlbXBvcmFyeSogaGVscGVyIHRvIGRldGVjdCBwbGFjZXMgd2hlcmUgYHRoaXNgIGlzXG4gKiBkaWZmZXJlbnQgZnJvbSB0aGUgYG93bmVyYCB3aGVuIFJlYWN0LmNyZWF0ZUVsZW1lbnQgaXMgY2FsbGVkLCBzbyB0aGF0IHdlXG4gKiBjYW4gd2Fybi4gV2Ugd2FudCB0byBnZXQgcmlkIG9mIG93bmVyIGFuZCByZXBsYWNlIHN0cmluZyBgcmVmYHMgd2l0aCBhcnJvd1xuICogZnVuY3Rpb25zLCBhbmQgYXMgbG9uZyBhcyBgdGhpc2AgYW5kIG93bmVyIGFyZSB0aGUgc2FtZSwgdGhlcmUgd2lsbCBiZSBub1xuICogY2hhbmdlIGluIGJlaGF2aW9yLlxuICogQHBhcmFtIHsqfSBzb3VyY2UgQW4gYW5ub3RhdGlvbiBvYmplY3QgKGFkZGVkIGJ5IGEgdHJhbnNwaWxlciBvciBvdGhlcndpc2UpXG4gKiBpbmRpY2F0aW5nIGZpbGVuYW1lLCBsaW5lIG51bWJlciwgYW5kL29yIG90aGVyIGluZm9ybWF0aW9uLlxuICogQGludGVybmFsXG4gKi9cblxuXG52YXIgUmVhY3RFbGVtZW50ID0gZnVuY3Rpb24gKHR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIG93bmVyLCBwcm9wcykge1xuICB2YXIgZWxlbWVudCA9IHtcbiAgICAvLyBUaGlzIHRhZyBhbGxvd3MgdXMgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcyBhcyBhIFJlYWN0IEVsZW1lbnRcbiAgICAkJHR5cGVvZjogUkVBQ1RfRUxFTUVOVF9UWVBFLFxuICAgIC8vIEJ1aWx0LWluIHByb3BlcnRpZXMgdGhhdCBiZWxvbmcgb24gdGhlIGVsZW1lbnRcbiAgICB0eXBlOiB0eXBlLFxuICAgIGtleToga2V5LFxuICAgIHJlZjogcmVmLFxuICAgIHByb3BzOiBwcm9wcyxcbiAgICAvLyBSZWNvcmQgdGhlIGNvbXBvbmVudCByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhpcyBlbGVtZW50LlxuICAgIF9vd25lcjogb3duZXJcbiAgfTtcblxuICB7XG4gICAgLy8gVGhlIHZhbGlkYXRpb24gZmxhZyBpcyBjdXJyZW50bHkgbXV0YXRpdmUuIFdlIHB1dCBpdCBvblxuICAgIC8vIGFuIGV4dGVybmFsIGJhY2tpbmcgc3RvcmUgc28gdGhhdCB3ZSBjYW4gZnJlZXplIHRoZSB3aG9sZSBvYmplY3QuXG4gICAgLy8gVGhpcyBjYW4gYmUgcmVwbGFjZWQgd2l0aCBhIFdlYWtNYXAgb25jZSB0aGV5IGFyZSBpbXBsZW1lbnRlZCBpblxuICAgIC8vIGNvbW1vbmx5IHVzZWQgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzLlxuICAgIGVsZW1lbnQuX3N0b3JlID0ge307IC8vIFRvIG1ha2UgY29tcGFyaW5nIFJlYWN0RWxlbWVudHMgZWFzaWVyIGZvciB0ZXN0aW5nIHB1cnBvc2VzLCB3ZSBtYWtlXG4gICAgLy8gdGhlIHZhbGlkYXRpb24gZmxhZyBub24tZW51bWVyYWJsZSAod2hlcmUgcG9zc2libGUsIHdoaWNoIHNob3VsZFxuICAgIC8vIGluY2x1ZGUgZXZlcnkgZW52aXJvbm1lbnQgd2UgcnVuIHRlc3RzIGluKSwgc28gdGhlIHRlc3QgZnJhbWV3b3JrXG4gICAgLy8gaWdub3JlcyBpdC5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50Ll9zdG9yZSwgJ3ZhbGlkYXRlZCcsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IGZhbHNlXG4gICAgfSk7IC8vIHNlbGYgYW5kIHNvdXJjZSBhcmUgREVWIG9ubHkgcHJvcGVydGllcy5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnX3NlbGYnLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogc2VsZlxuICAgIH0pOyAvLyBUd28gZWxlbWVudHMgY3JlYXRlZCBpbiB0d28gZGlmZmVyZW50IHBsYWNlcyBzaG91bGQgYmUgY29uc2lkZXJlZFxuICAgIC8vIGVxdWFsIGZvciB0ZXN0aW5nIHB1cnBvc2VzIGFuZCB0aGVyZWZvcmUgd2UgaGlkZSBpdCBmcm9tIGVudW1lcmF0aW9uLlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdfc291cmNlJywge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IHNvdXJjZVxuICAgIH0pO1xuXG4gICAgaWYgKE9iamVjdC5mcmVlemUpIHtcbiAgICAgIE9iamVjdC5mcmVlemUoZWxlbWVudC5wcm9wcyk7XG4gICAgICBPYmplY3QuZnJlZXplKGVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufTtcbi8qKlxuICogaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0anMvcmZjcy9wdWxsLzEwN1xuICogQHBhcmFtIHsqfSB0eXBlXG4gKiBAcGFyYW0ge29iamVjdH0gcHJvcHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqL1xuXG5mdW5jdGlvbiBqc3hERVYodHlwZSwgY29uZmlnLCBtYXliZUtleSwgc291cmNlLCBzZWxmKSB7XG4gIHtcbiAgICB2YXIgcHJvcE5hbWU7IC8vIFJlc2VydmVkIG5hbWVzIGFyZSBleHRyYWN0ZWRcblxuICAgIHZhciBwcm9wcyA9IHt9O1xuICAgIHZhciBrZXkgPSBudWxsO1xuICAgIHZhciByZWYgPSBudWxsOyAvLyBDdXJyZW50bHksIGtleSBjYW4gYmUgc3ByZWFkIGluIGFzIGEgcHJvcC4gVGhpcyBjYXVzZXMgYSBwb3RlbnRpYWxcbiAgICAvLyBpc3N1ZSBpZiBrZXkgaXMgYWxzbyBleHBsaWNpdGx5IGRlY2xhcmVkIChpZS4gPGRpdiB7Li4ucHJvcHN9IGtleT1cIkhpXCIgLz5cbiAgICAvLyBvciA8ZGl2IGtleT1cIkhpXCIgey4uLnByb3BzfSAvPiApLiBXZSB3YW50IHRvIGRlcHJlY2F0ZSBrZXkgc3ByZWFkLFxuICAgIC8vIGJ1dCBhcyBhbiBpbnRlcm1lZGlhcnkgc3RlcCwgd2Ugd2lsbCB1c2UganN4REVWIGZvciBldmVyeXRoaW5nIGV4Y2VwdFxuICAgIC8vIDxkaXYgey4uLnByb3BzfSBrZXk9XCJIaVwiIC8+LCBiZWNhdXNlIHdlIGFyZW4ndCBjdXJyZW50bHkgYWJsZSB0byB0ZWxsIGlmXG4gICAgLy8ga2V5IGlzIGV4cGxpY2l0bHkgZGVjbGFyZWQgdG8gYmUgdW5kZWZpbmVkIG9yIG5vdC5cblxuICAgIGlmIChtYXliZUtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB7XG4gICAgICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24obWF5YmVLZXkpO1xuICAgICAgfVxuXG4gICAgICBrZXkgPSAnJyArIG1heWJlS2V5O1xuICAgIH1cblxuICAgIGlmIChoYXNWYWxpZEtleShjb25maWcpKSB7XG4gICAgICB7XG4gICAgICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24oY29uZmlnLmtleSk7XG4gICAgICB9XG5cbiAgICAgIGtleSA9ICcnICsgY29uZmlnLmtleTtcbiAgICB9XG5cbiAgICBpZiAoaGFzVmFsaWRSZWYoY29uZmlnKSkge1xuICAgICAgcmVmID0gY29uZmlnLnJlZjtcbiAgICAgIHdhcm5JZlN0cmluZ1JlZkNhbm5vdEJlQXV0b0NvbnZlcnRlZChjb25maWcsIHNlbGYpO1xuICAgIH0gLy8gUmVtYWluaW5nIHByb3BlcnRpZXMgYXJlIGFkZGVkIHRvIGEgbmV3IHByb3BzIG9iamVjdFxuXG5cbiAgICBmb3IgKHByb3BOYW1lIGluIGNvbmZpZykge1xuICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCBwcm9wTmFtZSkgJiYgIVJFU0VSVkVEX1BST1BTLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBjb25maWdbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH0gLy8gUmVzb2x2ZSBkZWZhdWx0IHByb3BzXG5cblxuICAgIGlmICh0eXBlICYmIHR5cGUuZGVmYXVsdFByb3BzKSB7XG4gICAgICB2YXIgZGVmYXVsdFByb3BzID0gdHlwZS5kZWZhdWx0UHJvcHM7XG5cbiAgICAgIGZvciAocHJvcE5hbWUgaW4gZGVmYXVsdFByb3BzKSB7XG4gICAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoa2V5IHx8IHJlZikge1xuICAgICAgdmFyIGRpc3BsYXlOYW1lID0gdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgPyB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCAnVW5rbm93bicgOiB0eXBlO1xuXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIGRlZmluZUtleVByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gUmVhY3RFbGVtZW50KHR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQsIHByb3BzKTtcbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50T3duZXIkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyO1xudmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG5cbmZ1bmN0aW9uIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZWxlbWVudCkge1xuICB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSwgZWxlbWVudC5fc291cmNlLCBvd25lciA/IG93bmVyLnR5cGUgOiBudWxsKTtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMS5zZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd247XG5cbntcbiAgcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd24gPSBmYWxzZTtcbn1cbi8qKlxuICogVmVyaWZpZXMgdGhlIG9iamVjdCBpcyBhIFJlYWN0RWxlbWVudC5cbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjaXN2YWxpZGVsZW1lbnRcbiAqIEBwYXJhbSB7P29iamVjdH0gb2JqZWN0XG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGBvYmplY3RgIGlzIGEgUmVhY3RFbGVtZW50LlxuICogQGZpbmFsXG4gKi9cblxuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudChvYmplY3QpIHtcbiAge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwgJiYgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEU7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkge1xuICB7XG4gICAgaWYgKFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCkge1xuICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50LnR5cGUpO1xuXG4gICAgICBpZiAobmFtZSkge1xuICAgICAgICByZXR1cm4gJ1xcblxcbkNoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgbmFtZSArICdgLic7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuICcnO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtKHNvdXJjZSkge1xuICB7XG4gICAgaWYgKHNvdXJjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgZmlsZU5hbWUgPSBzb3VyY2UuZmlsZU5hbWUucmVwbGFjZSgvXi4qW1xcXFxcXC9dLywgJycpO1xuICAgICAgdmFyIGxpbmVOdW1iZXIgPSBzb3VyY2UubGluZU51bWJlcjtcbiAgICAgIHJldHVybiAnXFxuXFxuQ2hlY2sgeW91ciBjb2RlIGF0ICcgKyBmaWxlTmFtZSArICc6JyArIGxpbmVOdW1iZXIgKyAnLic7XG4gICAgfVxuXG4gICAgcmV0dXJuICcnO1xuICB9XG59XG4vKipcbiAqIFdhcm4gaWYgdGhlcmUncyBubyBrZXkgZXhwbGljaXRseSBzZXQgb24gZHluYW1pYyBhcnJheXMgb2YgY2hpbGRyZW4gb3JcbiAqIG9iamVjdCBrZXlzIGFyZSBub3QgdmFsaWQuIFRoaXMgYWxsb3dzIHVzIHRvIGtlZXAgdHJhY2sgb2YgY2hpbGRyZW4gYmV0d2VlblxuICogdXBkYXRlcy5cbiAqL1xuXG5cbnZhciBvd25lckhhc0tleVVzZVdhcm5pbmcgPSB7fTtcblxuZnVuY3Rpb24gZ2V0Q3VycmVudENvbXBvbmVudEVycm9ySW5mbyhwYXJlbnRUeXBlKSB7XG4gIHtcbiAgICB2YXIgaW5mbyA9IGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpO1xuXG4gICAgaWYgKCFpbmZvKSB7XG4gICAgICB2YXIgcGFyZW50TmFtZSA9IHR5cGVvZiBwYXJlbnRUeXBlID09PSAnc3RyaW5nJyA/IHBhcmVudFR5cGUgOiBwYXJlbnRUeXBlLmRpc3BsYXlOYW1lIHx8IHBhcmVudFR5cGUubmFtZTtcblxuICAgICAgaWYgKHBhcmVudE5hbWUpIHtcbiAgICAgICAgaW5mbyA9IFwiXFxuXFxuQ2hlY2sgdGhlIHRvcC1sZXZlbCByZW5kZXIgY2FsbCB1c2luZyA8XCIgKyBwYXJlbnROYW1lICsgXCI+LlwiO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpbmZvO1xuICB9XG59XG4vKipcbiAqIFdhcm4gaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFuIGV4cGxpY2l0IGtleSBhc3NpZ25lZCB0byBpdC5cbiAqIFRoaXMgZWxlbWVudCBpcyBpbiBhbiBhcnJheS4gVGhlIGFycmF5IGNvdWxkIGdyb3cgYW5kIHNocmluayBvciBiZVxuICogcmVvcmRlcmVkLiBBbGwgY2hpbGRyZW4gdGhhdCBoYXZlbid0IGFscmVhZHkgYmVlbiB2YWxpZGF0ZWQgYXJlIHJlcXVpcmVkIHRvXG4gKiBoYXZlIGEgXCJrZXlcIiBwcm9wZXJ0eSBhc3NpZ25lZCB0byBpdC4gRXJyb3Igc3RhdHVzZXMgYXJlIGNhY2hlZCBzbyBhIHdhcm5pbmdcbiAqIHdpbGwgb25seSBiZSBzaG93biBvbmNlLlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnQgRWxlbWVudCB0aGF0IHJlcXVpcmVzIGEga2V5LlxuICogQHBhcmFtIHsqfSBwYXJlbnRUeXBlIGVsZW1lbnQncyBwYXJlbnQncyB0eXBlLlxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVFeHBsaWNpdEtleShlbGVtZW50LCBwYXJlbnRUeXBlKSB7XG4gIHtcbiAgICBpZiAoIWVsZW1lbnQuX3N0b3JlIHx8IGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCB8fCBlbGVtZW50LmtleSAhPSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZWxlbWVudC5fc3RvcmUudmFsaWRhdGVkID0gdHJ1ZTtcbiAgICB2YXIgY3VycmVudENvbXBvbmVudEVycm9ySW5mbyA9IGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSk7XG5cbiAgICBpZiAob3duZXJIYXNLZXlVc2VXYXJuaW5nW2N1cnJlbnRDb21wb25lbnRFcnJvckluZm9dKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb3duZXJIYXNLZXlVc2VXYXJuaW5nW2N1cnJlbnRDb21wb25lbnRFcnJvckluZm9dID0gdHJ1ZTsgLy8gVXN1YWxseSB0aGUgY3VycmVudCBvd25lciBpcyB0aGUgb2ZmZW5kZXIsIGJ1dCBpZiBpdCBhY2NlcHRzIGNoaWxkcmVuIGFzIGFcbiAgICAvLyBwcm9wZXJ0eSwgaXQgbWF5IGJlIHRoZSBjcmVhdG9yIG9mIHRoZSBjaGlsZCB0aGF0J3MgcmVzcG9uc2libGUgZm9yXG4gICAgLy8gYXNzaWduaW5nIGl0IGEga2V5LlxuXG4gICAgdmFyIGNoaWxkT3duZXIgPSAnJztcblxuICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQuX293bmVyICYmIGVsZW1lbnQuX293bmVyICE9PSBSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQpIHtcbiAgICAgIC8vIEdpdmUgdGhlIGNvbXBvbmVudCB0aGF0IG9yaWdpbmFsbHkgY3JlYXRlZCB0aGlzIGNoaWxkLlxuICAgICAgY2hpbGRPd25lciA9IFwiIEl0IHdhcyBwYXNzZWQgYSBjaGlsZCBmcm9tIFwiICsgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGVsZW1lbnQuX293bmVyLnR5cGUpICsgXCIuXCI7XG4gICAgfVxuXG4gICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShlbGVtZW50KTtcblxuICAgIGVycm9yKCdFYWNoIGNoaWxkIGluIGEgbGlzdCBzaG91bGQgaGF2ZSBhIHVuaXF1ZSBcImtleVwiIHByb3AuJyArICclcyVzIFNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvd2FybmluZy1rZXlzIGZvciBtb3JlIGluZm9ybWF0aW9uLicsIGN1cnJlbnRDb21wb25lbnRFcnJvckluZm8sIGNoaWxkT3duZXIpO1xuXG4gICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShudWxsKTtcbiAgfVxufVxuLyoqXG4gKiBFbnN1cmUgdGhhdCBldmVyeSBlbGVtZW50IGVpdGhlciBpcyBwYXNzZWQgaW4gYSBzdGF0aWMgbG9jYXRpb24sIGluIGFuXG4gKiBhcnJheSB3aXRoIGFuIGV4cGxpY2l0IGtleXMgcHJvcGVydHkgZGVmaW5lZCwgb3IgaW4gYW4gb2JqZWN0IGxpdGVyYWxcbiAqIHdpdGggdmFsaWQga2V5IHByb3BlcnR5LlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIHtSZWFjdE5vZGV9IG5vZGUgU3RhdGljYWxseSBwYXNzZWQgY2hpbGQgb2YgYW55IHR5cGUuXG4gKiBAcGFyYW0geyp9IHBhcmVudFR5cGUgbm9kZSdzIHBhcmVudCdzIHR5cGUuXG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZUNoaWxkS2V5cyhub2RlLCBwYXJlbnRUeXBlKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIG5vZGUgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzQXJyYXkobm9kZSkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2hpbGQgPSBub2RlW2ldO1xuXG4gICAgICAgIGlmIChpc1ZhbGlkRWxlbWVudChjaGlsZCkpIHtcbiAgICAgICAgICB2YWxpZGF0ZUV4cGxpY2l0S2V5KGNoaWxkLCBwYXJlbnRUeXBlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNWYWxpZEVsZW1lbnQobm9kZSkpIHtcbiAgICAgIC8vIFRoaXMgZWxlbWVudCB3YXMgcGFzc2VkIGluIGEgdmFsaWQgbG9jYXRpb24uXG4gICAgICBpZiAobm9kZS5fc3RvcmUpIHtcbiAgICAgICAgbm9kZS5fc3RvcmUudmFsaWRhdGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vZGUpIHtcbiAgICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihub2RlKTtcblxuICAgICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIEVudHJ5IGl0ZXJhdG9ycyB1c2VkIHRvIHByb3ZpZGUgaW1wbGljaXQga2V5cyxcbiAgICAgICAgLy8gYnV0IG5vdyB3ZSBwcmludCBhIHNlcGFyYXRlIHdhcm5pbmcgZm9yIHRoZW0gbGF0ZXIuXG4gICAgICAgIGlmIChpdGVyYXRvckZuICE9PSBub2RlLmVudHJpZXMpIHtcbiAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwobm9kZSk7XG4gICAgICAgICAgdmFyIHN0ZXA7XG5cbiAgICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgICBpZiAoaXNWYWxpZEVsZW1lbnQoc3RlcC52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgdmFsaWRhdGVFeHBsaWNpdEtleShzdGVwLnZhbHVlLCBwYXJlbnRUeXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbi8qKlxuICogR2l2ZW4gYW4gZWxlbWVudCwgdmFsaWRhdGUgdGhhdCBpdHMgcHJvcHMgZm9sbG93IHRoZSBwcm9wVHlwZXMgZGVmaW5pdGlvbixcbiAqIHByb3ZpZGVkIGJ5IHRoZSB0eXBlLlxuICpcbiAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBlbGVtZW50XG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BUeXBlcyhlbGVtZW50KSB7XG4gIHtcbiAgICB2YXIgdHlwZSA9IGVsZW1lbnQudHlwZTtcblxuICAgIGlmICh0eXBlID09PSBudWxsIHx8IHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgcHJvcFR5cGVzO1xuXG4gICAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwcm9wVHlwZXMgPSB0eXBlLnByb3BUeXBlcztcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCAvLyBOb3RlOiBNZW1vIG9ubHkgY2hlY2tzIG91dGVyIHByb3BzIGhlcmUuXG4gICAgLy8gSW5uZXIgcHJvcHMgYXJlIGNoZWNrZWQgaW4gdGhlIHJlY29uY2lsZXIuXG4gICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFKSkge1xuICAgICAgcHJvcFR5cGVzID0gdHlwZS5wcm9wVHlwZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocHJvcFR5cGVzKSB7XG4gICAgICAvLyBJbnRlbnRpb25hbGx5IGluc2lkZSB0byBhdm9pZCB0cmlnZ2VyaW5nIGxhenkgaW5pdGlhbGl6ZXJzOlxuICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSk7XG4gICAgICBjaGVja1Byb3BUeXBlcyhwcm9wVHlwZXMsIGVsZW1lbnQucHJvcHMsICdwcm9wJywgbmFtZSwgZWxlbWVudCk7XG4gICAgfSBlbHNlIGlmICh0eXBlLlByb3BUeXBlcyAhPT0gdW5kZWZpbmVkICYmICFwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93bikge1xuICAgICAgcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd24gPSB0cnVlOyAvLyBJbnRlbnRpb25hbGx5IGluc2lkZSB0byBhdm9pZCB0cmlnZ2VyaW5nIGxhenkgaW5pdGlhbGl6ZXJzOlxuXG4gICAgICB2YXIgX25hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSk7XG5cbiAgICAgIGVycm9yKCdDb21wb25lbnQgJXMgZGVjbGFyZWQgYFByb3BUeXBlc2AgaW5zdGVhZCBvZiBgcHJvcFR5cGVzYC4gRGlkIHlvdSBtaXNzcGVsbCB0aGUgcHJvcGVydHkgYXNzaWdubWVudD8nLCBfbmFtZSB8fCAnVW5rbm93bicpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdHlwZS5nZXREZWZhdWx0UHJvcHMgPT09ICdmdW5jdGlvbicgJiYgIXR5cGUuZ2V0RGVmYXVsdFByb3BzLmlzUmVhY3RDbGFzc0FwcHJvdmVkKSB7XG4gICAgICBlcnJvcignZ2V0RGVmYXVsdFByb3BzIGlzIG9ubHkgdXNlZCBvbiBjbGFzc2ljIFJlYWN0LmNyZWF0ZUNsYXNzICcgKyAnZGVmaW5pdGlvbnMuIFVzZSBhIHN0YXRpYyBwcm9wZXJ0eSBuYW1lZCBgZGVmYXVsdFByb3BzYCBpbnN0ZWFkLicpO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBHaXZlbiBhIGZyYWdtZW50LCB2YWxpZGF0ZSB0aGF0IGl0IGNhbiBvbmx5IGJlIHByb3ZpZGVkIHdpdGggZnJhZ21lbnQgcHJvcHNcbiAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBmcmFnbWVudFxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVGcmFnbWVudFByb3BzKGZyYWdtZW50KSB7XG4gIHtcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGZyYWdtZW50LnByb3BzKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG5cbiAgICAgIGlmIChrZXkgIT09ICdjaGlsZHJlbicgJiYga2V5ICE9PSAna2V5Jykge1xuICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGZyYWdtZW50KTtcblxuICAgICAgICBlcnJvcignSW52YWxpZCBwcm9wIGAlc2Agc3VwcGxpZWQgdG8gYFJlYWN0LkZyYWdtZW50YC4gJyArICdSZWFjdC5GcmFnbWVudCBjYW4gb25seSBoYXZlIGBrZXlgIGFuZCBgY2hpbGRyZW5gIHByb3BzLicsIGtleSk7XG5cbiAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShudWxsKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGZyYWdtZW50LnJlZiAhPT0gbnVsbCkge1xuICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShmcmFnbWVudCk7XG5cbiAgICAgIGVycm9yKCdJbnZhbGlkIGF0dHJpYnV0ZSBgcmVmYCBzdXBwbGllZCB0byBgUmVhY3QuRnJhZ21lbnRgLicpO1xuXG4gICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgZGlkV2FybkFib3V0S2V5U3ByZWFkID0ge307XG5mdW5jdGlvbiBqc3hXaXRoVmFsaWRhdGlvbih0eXBlLCBwcm9wcywga2V5LCBpc1N0YXRpY0NoaWxkcmVuLCBzb3VyY2UsIHNlbGYpIHtcbiAge1xuICAgIHZhciB2YWxpZFR5cGUgPSBpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSk7IC8vIFdlIHdhcm4gaW4gdGhpcyBjYXNlIGJ1dCBkb24ndCB0aHJvdy4gV2UgZXhwZWN0IHRoZSBlbGVtZW50IGNyZWF0aW9uIHRvXG4gICAgLy8gc3VjY2VlZCBhbmQgdGhlcmUgd2lsbCBsaWtlbHkgYmUgZXJyb3JzIGluIHJlbmRlci5cblxuICAgIGlmICghdmFsaWRUeXBlKSB7XG4gICAgICB2YXIgaW5mbyA9ICcnO1xuXG4gICAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsICYmIE9iamVjdC5rZXlzKHR5cGUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBpbmZvICs9ICcgWW91IGxpa2VseSBmb3Jnb3QgdG8gZXhwb3J0IHlvdXIgY29tcG9uZW50IGZyb20gdGhlIGZpbGUgJyArIFwiaXQncyBkZWZpbmVkIGluLCBvciB5b3UgbWlnaHQgaGF2ZSBtaXhlZCB1cCBkZWZhdWx0IGFuZCBuYW1lZCBpbXBvcnRzLlwiO1xuICAgICAgfVxuXG4gICAgICB2YXIgc291cmNlSW5mbyA9IGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtKHNvdXJjZSk7XG5cbiAgICAgIGlmIChzb3VyY2VJbmZvKSB7XG4gICAgICAgIGluZm8gKz0gc291cmNlSW5mbztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluZm8gKz0gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCk7XG4gICAgICB9XG5cbiAgICAgIHZhciB0eXBlU3RyaW5nO1xuXG4gICAgICBpZiAodHlwZSA9PT0gbnVsbCkge1xuICAgICAgICB0eXBlU3RyaW5nID0gJ251bGwnO1xuICAgICAgfSBlbHNlIGlmIChpc0FycmF5KHR5cGUpKSB7XG4gICAgICAgIHR5cGVTdHJpbmcgPSAnYXJyYXknO1xuICAgICAgfSBlbHNlIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFKSB7XG4gICAgICAgIHR5cGVTdHJpbmcgPSBcIjxcIiArIChnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZS50eXBlKSB8fCAnVW5rbm93bicpICsgXCIgLz5cIjtcbiAgICAgICAgaW5mbyA9ICcgRGlkIHlvdSBhY2NpZGVudGFsbHkgZXhwb3J0IGEgSlNYIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGNvbXBvbmVudD8nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHlwZVN0cmluZyA9IHR5cGVvZiB0eXBlO1xuICAgICAgfVxuXG4gICAgICBlcnJvcignUmVhY3QuanN4OiB0eXBlIGlzIGludmFsaWQgLS0gZXhwZWN0ZWQgYSBzdHJpbmcgKGZvciAnICsgJ2J1aWx0LWluIGNvbXBvbmVudHMpIG9yIGEgY2xhc3MvZnVuY3Rpb24gKGZvciBjb21wb3NpdGUgJyArICdjb21wb25lbnRzKSBidXQgZ290OiAlcy4lcycsIHR5cGVTdHJpbmcsIGluZm8pO1xuICAgIH1cblxuICAgIHZhciBlbGVtZW50ID0ganN4REVWKHR5cGUsIHByb3BzLCBrZXksIHNvdXJjZSwgc2VsZik7IC8vIFRoZSByZXN1bHQgY2FuIGJlIG51bGxpc2ggaWYgYSBtb2NrIG9yIGEgY3VzdG9tIGZ1bmN0aW9uIGlzIHVzZWQuXG4gICAgLy8gVE9ETzogRHJvcCB0aGlzIHdoZW4gdGhlc2UgYXJlIG5vIGxvbmdlciBhbGxvd2VkIGFzIHRoZSB0eXBlIGFyZ3VtZW50LlxuXG4gICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfSAvLyBTa2lwIGtleSB3YXJuaW5nIGlmIHRoZSB0eXBlIGlzbid0IHZhbGlkIHNpbmNlIG91ciBrZXkgdmFsaWRhdGlvbiBsb2dpY1xuICAgIC8vIGRvZXNuJ3QgZXhwZWN0IGEgbm9uLXN0cmluZy9mdW5jdGlvbiB0eXBlIGFuZCBjYW4gdGhyb3cgY29uZnVzaW5nIGVycm9ycy5cbiAgICAvLyBXZSBkb24ndCB3YW50IGV4Y2VwdGlvbiBiZWhhdmlvciB0byBkaWZmZXIgYmV0d2VlbiBkZXYgYW5kIHByb2QuXG4gICAgLy8gKFJlbmRlcmluZyB3aWxsIHRocm93IHdpdGggYSBoZWxwZnVsIG1lc3NhZ2UgYW5kIGFzIHNvb24gYXMgdGhlIHR5cGUgaXNcbiAgICAvLyBmaXhlZCwgdGhlIGtleSB3YXJuaW5ncyB3aWxsIGFwcGVhci4pXG5cblxuICAgIGlmICh2YWxpZFR5cGUpIHtcbiAgICAgIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuO1xuXG4gICAgICBpZiAoY2hpbGRyZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoaXNTdGF0aWNDaGlsZHJlbikge1xuICAgICAgICAgIGlmIChpc0FycmF5KGNoaWxkcmVuKSkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICB2YWxpZGF0ZUNoaWxkS2V5cyhjaGlsZHJlbltpXSwgdHlwZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChPYmplY3QuZnJlZXplKSB7XG4gICAgICAgICAgICAgIE9iamVjdC5mcmVlemUoY2hpbGRyZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvcignUmVhY3QuanN4OiBTdGF0aWMgY2hpbGRyZW4gc2hvdWxkIGFsd2F5cyBiZSBhbiBhcnJheS4gJyArICdZb3UgYXJlIGxpa2VseSBleHBsaWNpdGx5IGNhbGxpbmcgUmVhY3QuanN4cyBvciBSZWFjdC5qc3hERVYuICcgKyAnVXNlIHRoZSBCYWJlbCB0cmFuc2Zvcm0gaW5zdGVhZC4nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsaWRhdGVDaGlsZEtleXMoY2hpbGRyZW4sIHR5cGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwocHJvcHMsICdrZXknKSkge1xuICAgICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKTtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhwcm9wcykuZmlsdGVyKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgICAgcmV0dXJuIGsgIT09ICdrZXknO1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGJlZm9yZUV4YW1wbGUgPSBrZXlzLmxlbmd0aCA+IDAgPyAne2tleTogc29tZUtleSwgJyArIGtleXMuam9pbignOiAuLi4sICcpICsgJzogLi4ufScgOiAne2tleTogc29tZUtleX0nO1xuXG4gICAgICAgIGlmICghZGlkV2FybkFib3V0S2V5U3ByZWFkW2NvbXBvbmVudE5hbWUgKyBiZWZvcmVFeGFtcGxlXSkge1xuICAgICAgICAgIHZhciBhZnRlckV4YW1wbGUgPSBrZXlzLmxlbmd0aCA+IDAgPyAneycgKyBrZXlzLmpvaW4oJzogLi4uLCAnKSArICc6IC4uLn0nIDogJ3t9JztcblxuICAgICAgICAgIGVycm9yKCdBIHByb3BzIG9iamVjdCBjb250YWluaW5nIGEgXCJrZXlcIiBwcm9wIGlzIGJlaW5nIHNwcmVhZCBpbnRvIEpTWDpcXG4nICsgJyAgbGV0IHByb3BzID0gJXM7XFxuJyArICcgIDwlcyB7Li4ucHJvcHN9IC8+XFxuJyArICdSZWFjdCBrZXlzIG11c3QgYmUgcGFzc2VkIGRpcmVjdGx5IHRvIEpTWCB3aXRob3V0IHVzaW5nIHNwcmVhZDpcXG4nICsgJyAgbGV0IHByb3BzID0gJXM7XFxuJyArICcgIDwlcyBrZXk9e3NvbWVLZXl9IHsuLi5wcm9wc30gLz4nLCBiZWZvcmVFeGFtcGxlLCBjb21wb25lbnROYW1lLCBhZnRlckV4YW1wbGUsIGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgICAgZGlkV2FybkFib3V0S2V5U3ByZWFkW2NvbXBvbmVudE5hbWUgKyBiZWZvcmVFeGFtcGxlXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgICAgdmFsaWRhdGVGcmFnbWVudFByb3BzKGVsZW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWxpZGF0ZVByb3BUeXBlcyhlbGVtZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxufSAvLyBUaGVzZSB0d28gZnVuY3Rpb25zIGV4aXN0IHRvIHN0aWxsIGdldCBjaGlsZCB3YXJuaW5ncyBpbiBkZXZcbi8vIGV2ZW4gd2l0aCB0aGUgcHJvZCB0cmFuc2Zvcm0uIFRoaXMgbWVhbnMgdGhhdCBqc3hERVYgaXMgcHVyZWx5XG4vLyBvcHQtaW4gYmVoYXZpb3IgZm9yIGJldHRlciBtZXNzYWdlcyBidXQgdGhhdCB3ZSB3b24ndCBzdG9wXG4vLyBnaXZpbmcgeW91IHdhcm5pbmdzIGlmIHlvdSB1c2UgcHJvZHVjdGlvbiBhcGlzLlxuXG5mdW5jdGlvbiBqc3hXaXRoVmFsaWRhdGlvblN0YXRpYyh0eXBlLCBwcm9wcywga2V5KSB7XG4gIHtcbiAgICByZXR1cm4ganN4V2l0aFZhbGlkYXRpb24odHlwZSwgcHJvcHMsIGtleSwgdHJ1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGpzeFdpdGhWYWxpZGF0aW9uRHluYW1pYyh0eXBlLCBwcm9wcywga2V5KSB7XG4gIHtcbiAgICByZXR1cm4ganN4V2l0aFZhbGlkYXRpb24odHlwZSwgcHJvcHMsIGtleSwgZmFsc2UpO1xuICB9XG59XG5cbnZhciBqc3ggPSAganN4V2l0aFZhbGlkYXRpb25EeW5hbWljIDsgLy8gd2UgbWF5IHdhbnQgdG8gc3BlY2lhbCBjYXNlIGpzeHMgaW50ZXJuYWxseSB0byB0YWtlIGFkdmFudGFnZSBvZiBzdGF0aWMgY2hpbGRyZW4uXG4vLyBmb3Igbm93IHdlIGNhbiBzaGlwIGlkZW50aWNhbCBwcm9kIGZ1bmN0aW9uc1xuXG52YXIganN4cyA9ICBqc3hXaXRoVmFsaWRhdGlvblN0YXRpYyA7XG5cbmV4cG9ydHMuRnJhZ21lbnQgPSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xuZXhwb3J0cy5qc3ggPSBqc3g7XG5leHBvcnRzLmpzeHMgPSBqc3hzO1xuICB9KSgpO1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1qc3gtcnVudGltZS5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1qc3gtcnVudGltZS5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwgImltcG9ydCBcIm1vY2hhXCI7XG5pbXBvcnQgeyBwYWdlUGhvdG9zaG9wU3RvcmVNYXAsIHBhZ2VTdG9yZSB9IGZyb20gXCIuLi8uLi8uLi9tb2R1bGVzL2NvbWZ5L3Bob3Rvc2hvcE1vZGVscy5tanNcIjtcblxuKGdsb2JhbFRoaXMgYXMgYW55KS5zZHBwcF9kZWJ1Z1BhZ2VTdG9yZSA9IHBhZ2VTdG9yZTtcbihnbG9iYWxUaGlzIGFzIGFueSkuc2RwcHBfZGVidWdQYWdlUGhvdG9zaG9wU3RvcmVNYXAgPSBwYWdlUGhvdG9zaG9wU3RvcmVNYXA7XG5cbm1vY2hhLnNldHVwKHtcbiAgICByZXBvcnRlcjogXCJzcGVjXCIsXG4gICAgdWk6IFwiYmRkXCIsXG59KTtcbm1vY2hhLmNsZWFuUmVmZXJlbmNlc0FmdGVyUnVuKGZhbHNlKTtcblxuXG4oZ2xvYmFsVGhpcyBhcyBhbnkpLnNkcHBwVGVzdCA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAvLyBhd2FpdCBQcm9taXNlLmFsbChbaW1wb3J0KCcuL2NvbWZ5L2Zvcm1pbmcudGVzdC5tanMnKV0pO1xuICAgIG1vY2hhLnJ1bigpO1xufSIsICJpbXBvcnQgeyBQYXRjaEVycm9yLCBfZGVlcENsb25lLCBpc0ludGVnZXIsIHVuZXNjYXBlUGF0aENvbXBvbmVudCwgaGFzVW5kZWZpbmVkIH0gZnJvbSAnLi9oZWxwZXJzLm1qcyc7XG5leHBvcnQgdmFyIEpzb25QYXRjaEVycm9yID0gUGF0Y2hFcnJvcjtcbmV4cG9ydCB2YXIgZGVlcENsb25lID0gX2RlZXBDbG9uZTtcbi8qIFdlIHVzZSBhIEphdmFzY3JpcHQgaGFzaCB0byBzdG9yZSBlYWNoXG4gZnVuY3Rpb24uIEVhY2ggaGFzaCBlbnRyeSAocHJvcGVydHkpIHVzZXNcbiB0aGUgb3BlcmF0aW9uIGlkZW50aWZpZXJzIHNwZWNpZmllZCBpbiByZmM2OTAyLlxuIEluIHRoaXMgd2F5LCB3ZSBjYW4gbWFwIGVhY2ggcGF0Y2ggb3BlcmF0aW9uXG4gdG8gaXRzIGRlZGljYXRlZCBmdW5jdGlvbiBpbiBlZmZpY2llbnQgd2F5LlxuICovXG4vKiBUaGUgb3BlcmF0aW9ucyBhcHBsaWNhYmxlIHRvIGFuIG9iamVjdCAqL1xudmFyIG9iak9wcyA9IHtcbiAgICBhZGQ6IGZ1bmN0aW9uIChvYmosIGtleSwgZG9jdW1lbnQpIHtcbiAgICAgICAgb2JqW2tleV0gPSB0aGlzLnZhbHVlO1xuICAgICAgICByZXR1cm4geyBuZXdEb2N1bWVudDogZG9jdW1lbnQgfTtcbiAgICB9LFxuICAgIHJlbW92ZTogZnVuY3Rpb24gKG9iaiwga2V5LCBkb2N1bWVudCkge1xuICAgICAgICB2YXIgcmVtb3ZlZCA9IG9ialtrZXldO1xuICAgICAgICBkZWxldGUgb2JqW2tleV07XG4gICAgICAgIHJldHVybiB7IG5ld0RvY3VtZW50OiBkb2N1bWVudCwgcmVtb3ZlZDogcmVtb3ZlZCB9O1xuICAgIH0sXG4gICAgcmVwbGFjZTogZnVuY3Rpb24gKG9iaiwga2V5LCBkb2N1bWVudCkge1xuICAgICAgICB2YXIgcmVtb3ZlZCA9IG9ialtrZXldO1xuICAgICAgICBvYmpba2V5XSA9IHRoaXMudmFsdWU7XG4gICAgICAgIHJldHVybiB7IG5ld0RvY3VtZW50OiBkb2N1bWVudCwgcmVtb3ZlZDogcmVtb3ZlZCB9O1xuICAgIH0sXG4gICAgbW92ZTogZnVuY3Rpb24gKG9iaiwga2V5LCBkb2N1bWVudCkge1xuICAgICAgICAvKiBpbiBjYXNlIG1vdmUgdGFyZ2V0IG92ZXJ3cml0ZXMgYW4gZXhpc3RpbmcgdmFsdWUsXG4gICAgICAgIHJldHVybiB0aGUgcmVtb3ZlZCB2YWx1ZSwgdGhpcyBjYW4gYmUgdGF4aW5nIHBlcmZvcm1hbmNlLXdpc2UsXG4gICAgICAgIGFuZCBpcyBwb3RlbnRpYWxseSB1bm5lZWRlZCAqL1xuICAgICAgICB2YXIgcmVtb3ZlZCA9IGdldFZhbHVlQnlQb2ludGVyKGRvY3VtZW50LCB0aGlzLnBhdGgpO1xuICAgICAgICBpZiAocmVtb3ZlZCkge1xuICAgICAgICAgICAgcmVtb3ZlZCA9IF9kZWVwQ2xvbmUocmVtb3ZlZCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG9yaWdpbmFsVmFsdWUgPSBhcHBseU9wZXJhdGlvbihkb2N1bWVudCwgeyBvcDogXCJyZW1vdmVcIiwgcGF0aDogdGhpcy5mcm9tIH0pLnJlbW92ZWQ7XG4gICAgICAgIGFwcGx5T3BlcmF0aW9uKGRvY3VtZW50LCB7IG9wOiBcImFkZFwiLCBwYXRoOiB0aGlzLnBhdGgsIHZhbHVlOiBvcmlnaW5hbFZhbHVlIH0pO1xuICAgICAgICByZXR1cm4geyBuZXdEb2N1bWVudDogZG9jdW1lbnQsIHJlbW92ZWQ6IHJlbW92ZWQgfTtcbiAgICB9LFxuICAgIGNvcHk6IGZ1bmN0aW9uIChvYmosIGtleSwgZG9jdW1lbnQpIHtcbiAgICAgICAgdmFyIHZhbHVlVG9Db3B5ID0gZ2V0VmFsdWVCeVBvaW50ZXIoZG9jdW1lbnQsIHRoaXMuZnJvbSk7XG4gICAgICAgIC8vIGVuZm9yY2UgY29weSBieSB2YWx1ZSBzbyBmdXJ0aGVyIG9wZXJhdGlvbnMgZG9uJ3QgYWZmZWN0IHNvdXJjZSAoc2VlIGlzc3VlICMxNzcpXG4gICAgICAgIGFwcGx5T3BlcmF0aW9uKGRvY3VtZW50LCB7IG9wOiBcImFkZFwiLCBwYXRoOiB0aGlzLnBhdGgsIHZhbHVlOiBfZGVlcENsb25lKHZhbHVlVG9Db3B5KSB9KTtcbiAgICAgICAgcmV0dXJuIHsgbmV3RG9jdW1lbnQ6IGRvY3VtZW50IH07XG4gICAgfSxcbiAgICB0ZXN0OiBmdW5jdGlvbiAob2JqLCBrZXksIGRvY3VtZW50KSB7XG4gICAgICAgIHJldHVybiB7IG5ld0RvY3VtZW50OiBkb2N1bWVudCwgdGVzdDogX2FyZUVxdWFscyhvYmpba2V5XSwgdGhpcy52YWx1ZSkgfTtcbiAgICB9LFxuICAgIF9nZXQ6IGZ1bmN0aW9uIChvYmosIGtleSwgZG9jdW1lbnQpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IG9ialtrZXldO1xuICAgICAgICByZXR1cm4geyBuZXdEb2N1bWVudDogZG9jdW1lbnQgfTtcbiAgICB9XG59O1xuLyogVGhlIG9wZXJhdGlvbnMgYXBwbGljYWJsZSB0byBhbiBhcnJheS4gTWFueSBhcmUgdGhlIHNhbWUgYXMgZm9yIHRoZSBvYmplY3QgKi9cbnZhciBhcnJPcHMgPSB7XG4gICAgYWRkOiBmdW5jdGlvbiAoYXJyLCBpLCBkb2N1bWVudCkge1xuICAgICAgICBpZiAoaXNJbnRlZ2VyKGkpKSB7XG4gICAgICAgICAgICBhcnIuc3BsaWNlKGksIDAsIHRoaXMudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAvLyBhcnJheSBwcm9wc1xuICAgICAgICAgICAgYXJyW2ldID0gdGhpcy52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0aGlzIG1heSBiZSBuZWVkZWQgd2hlbiB1c2luZyAnLScgaW4gYW4gYXJyYXlcbiAgICAgICAgcmV0dXJuIHsgbmV3RG9jdW1lbnQ6IGRvY3VtZW50LCBpbmRleDogaSB9O1xuICAgIH0sXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiAoYXJyLCBpLCBkb2N1bWVudCkge1xuICAgICAgICB2YXIgcmVtb3ZlZExpc3QgPSBhcnIuc3BsaWNlKGksIDEpO1xuICAgICAgICByZXR1cm4geyBuZXdEb2N1bWVudDogZG9jdW1lbnQsIHJlbW92ZWQ6IHJlbW92ZWRMaXN0WzBdIH07XG4gICAgfSxcbiAgICByZXBsYWNlOiBmdW5jdGlvbiAoYXJyLCBpLCBkb2N1bWVudCkge1xuICAgICAgICB2YXIgcmVtb3ZlZCA9IGFycltpXTtcbiAgICAgICAgYXJyW2ldID0gdGhpcy52YWx1ZTtcbiAgICAgICAgcmV0dXJuIHsgbmV3RG9jdW1lbnQ6IGRvY3VtZW50LCByZW1vdmVkOiByZW1vdmVkIH07XG4gICAgfSxcbiAgICBtb3ZlOiBvYmpPcHMubW92ZSxcbiAgICBjb3B5OiBvYmpPcHMuY29weSxcbiAgICB0ZXN0OiBvYmpPcHMudGVzdCxcbiAgICBfZ2V0OiBvYmpPcHMuX2dldFxufTtcbi8qKlxuICogUmV0cmlldmVzIGEgdmFsdWUgZnJvbSBhIEpTT04gZG9jdW1lbnQgYnkgYSBKU09OIHBvaW50ZXIuXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gZG9jdW1lbnQgVGhlIGRvY3VtZW50IHRvIGdldCB0aGUgdmFsdWUgZnJvbVxuICogQHBhcmFtIHBvaW50ZXIgYW4gZXNjYXBlZCBKU09OIHBvaW50ZXJcbiAqIEByZXR1cm4gVGhlIHJldHJpZXZlZCB2YWx1ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsdWVCeVBvaW50ZXIoZG9jdW1lbnQsIHBvaW50ZXIpIHtcbiAgICBpZiAocG9pbnRlciA9PSAnJykge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnQ7XG4gICAgfVxuICAgIHZhciBnZXRPcmlnaW5hbERlc3RpbmF0aW9uID0geyBvcDogXCJfZ2V0XCIsIHBhdGg6IHBvaW50ZXIgfTtcbiAgICBhcHBseU9wZXJhdGlvbihkb2N1bWVudCwgZ2V0T3JpZ2luYWxEZXN0aW5hdGlvbik7XG4gICAgcmV0dXJuIGdldE9yaWdpbmFsRGVzdGluYXRpb24udmFsdWU7XG59XG4vKipcbiAqIEFwcGx5IGEgc2luZ2xlIEpTT04gUGF0Y2ggT3BlcmF0aW9uIG9uIGEgSlNPTiBkb2N1bWVudC5cbiAqIFJldHVybnMgdGhlIHtuZXdEb2N1bWVudCwgcmVzdWx0fSBvZiB0aGUgb3BlcmF0aW9uLlxuICogSXQgbW9kaWZpZXMgdGhlIGBkb2N1bWVudGAgYW5kIGBvcGVyYXRpb25gIG9iamVjdHMgLSBpdCBnZXRzIHRoZSB2YWx1ZXMgYnkgcmVmZXJlbmNlLlxuICogSWYgeW91IHdvdWxkIGxpa2UgdG8gYXZvaWQgdG91Y2hpbmcgeW91ciB2YWx1ZXMsIGNsb25lIHRoZW06XG4gKiBganNvbnBhdGNoLmFwcGx5T3BlcmF0aW9uKGRvY3VtZW50LCBqc29ucGF0Y2guX2RlZXBDbG9uZShvcGVyYXRpb24pKWAuXG4gKlxuICogQHBhcmFtIGRvY3VtZW50IFRoZSBkb2N1bWVudCB0byBwYXRjaFxuICogQHBhcmFtIG9wZXJhdGlvbiBUaGUgb3BlcmF0aW9uIHRvIGFwcGx5XG4gKiBAcGFyYW0gdmFsaWRhdGVPcGVyYXRpb24gYGZhbHNlYCBpcyB3aXRob3V0IHZhbGlkYXRpb24sIGB0cnVlYCB0byB1c2UgZGVmYXVsdCBqc29ucGF0Y2gncyB2YWxpZGF0aW9uLCBvciB5b3UgY2FuIHBhc3MgYSBgdmFsaWRhdGVPcGVyYXRpb25gIGNhbGxiYWNrIHRvIGJlIHVzZWQgZm9yIHZhbGlkYXRpb24uXG4gKiBAcGFyYW0gbXV0YXRlRG9jdW1lbnQgV2hldGhlciB0byBtdXRhdGUgdGhlIG9yaWdpbmFsIGRvY3VtZW50IG9yIGNsb25lIGl0IGJlZm9yZSBhcHBseWluZ1xuICogQHBhcmFtIGJhblByb3RvdHlwZU1vZGlmaWNhdGlvbnMgV2hldGhlciB0byBiYW4gbW9kaWZpY2F0aW9ucyB0byBgX19wcm90b19fYCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICogQHJldHVybiBge25ld0RvY3VtZW50LCByZXN1bHR9YCBhZnRlciB0aGUgb3BlcmF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseU9wZXJhdGlvbihkb2N1bWVudCwgb3BlcmF0aW9uLCB2YWxpZGF0ZU9wZXJhdGlvbiwgbXV0YXRlRG9jdW1lbnQsIGJhblByb3RvdHlwZU1vZGlmaWNhdGlvbnMsIGluZGV4KSB7XG4gICAgaWYgKHZhbGlkYXRlT3BlcmF0aW9uID09PSB2b2lkIDApIHsgdmFsaWRhdGVPcGVyYXRpb24gPSBmYWxzZTsgfVxuICAgIGlmIChtdXRhdGVEb2N1bWVudCA9PT0gdm9pZCAwKSB7IG11dGF0ZURvY3VtZW50ID0gdHJ1ZTsgfVxuICAgIGlmIChiYW5Qcm90b3R5cGVNb2RpZmljYXRpb25zID09PSB2b2lkIDApIHsgYmFuUHJvdG90eXBlTW9kaWZpY2F0aW9ucyA9IHRydWU7IH1cbiAgICBpZiAoaW5kZXggPT09IHZvaWQgMCkgeyBpbmRleCA9IDA7IH1cbiAgICBpZiAodmFsaWRhdGVPcGVyYXRpb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWxpZGF0ZU9wZXJhdGlvbiA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZU9wZXJhdGlvbihvcGVyYXRpb24sIDAsIGRvY3VtZW50LCBvcGVyYXRpb24ucGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YWxpZGF0b3Iob3BlcmF0aW9uLCAwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKiBST09UIE9QRVJBVElPTlMgKi9cbiAgICBpZiAob3BlcmF0aW9uLnBhdGggPT09IFwiXCIpIHtcbiAgICAgICAgdmFyIHJldHVyblZhbHVlID0geyBuZXdEb2N1bWVudDogZG9jdW1lbnQgfTtcbiAgICAgICAgaWYgKG9wZXJhdGlvbi5vcCA9PT0gJ2FkZCcpIHtcbiAgICAgICAgICAgIHJldHVyblZhbHVlLm5ld0RvY3VtZW50ID0gb3BlcmF0aW9uLnZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9wZXJhdGlvbi5vcCA9PT0gJ3JlcGxhY2UnKSB7XG4gICAgICAgICAgICByZXR1cm5WYWx1ZS5uZXdEb2N1bWVudCA9IG9wZXJhdGlvbi52YWx1ZTtcbiAgICAgICAgICAgIHJldHVyblZhbHVlLnJlbW92ZWQgPSBkb2N1bWVudDsgLy9kb2N1bWVudCB3ZSByZW1vdmVkXG4gICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3BlcmF0aW9uLm9wID09PSAnbW92ZScgfHwgb3BlcmF0aW9uLm9wID09PSAnY29weScpIHsgLy8gaXQncyBhIG1vdmUgb3IgY29weSB0byByb290XG4gICAgICAgICAgICByZXR1cm5WYWx1ZS5uZXdEb2N1bWVudCA9IGdldFZhbHVlQnlQb2ludGVyKGRvY3VtZW50LCBvcGVyYXRpb24uZnJvbSk7IC8vIGdldCB0aGUgdmFsdWUgYnkganNvbi1wb2ludGVyIGluIGBmcm9tYCBmaWVsZFxuICAgICAgICAgICAgaWYgKG9wZXJhdGlvbi5vcCA9PT0gJ21vdmUnKSB7IC8vIHJlcG9ydCByZW1vdmVkIGl0ZW1cbiAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5yZW1vdmVkID0gZG9jdW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3BlcmF0aW9uLm9wID09PSAndGVzdCcpIHtcbiAgICAgICAgICAgIHJldHVyblZhbHVlLnRlc3QgPSBfYXJlRXF1YWxzKGRvY3VtZW50LCBvcGVyYXRpb24udmFsdWUpO1xuICAgICAgICAgICAgaWYgKHJldHVyblZhbHVlLnRlc3QgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpzb25QYXRjaEVycm9yKFwiVGVzdCBvcGVyYXRpb24gZmFpbGVkXCIsICdURVNUX09QRVJBVElPTl9GQUlMRUQnLCBpbmRleCwgb3BlcmF0aW9uLCBkb2N1bWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm5WYWx1ZS5uZXdEb2N1bWVudCA9IGRvY3VtZW50O1xuICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9wZXJhdGlvbi5vcCA9PT0gJ3JlbW92ZScpIHsgLy8gYSByZW1vdmUgb24gcm9vdFxuICAgICAgICAgICAgcmV0dXJuVmFsdWUucmVtb3ZlZCA9IGRvY3VtZW50O1xuICAgICAgICAgICAgcmV0dXJuVmFsdWUubmV3RG9jdW1lbnQgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9wZXJhdGlvbi5vcCA9PT0gJ19nZXQnKSB7XG4gICAgICAgICAgICBvcGVyYXRpb24udmFsdWUgPSBkb2N1bWVudDtcbiAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHsgLyogYmFkIG9wZXJhdGlvbiAqL1xuICAgICAgICAgICAgaWYgKHZhbGlkYXRlT3BlcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpzb25QYXRjaEVycm9yKCdPcGVyYXRpb24gYG9wYCBwcm9wZXJ0eSBpcyBub3Qgb25lIG9mIG9wZXJhdGlvbnMgZGVmaW5lZCBpbiBSRkMtNjkwMicsICdPUEVSQVRJT05fT1BfSU5WQUxJRCcsIGluZGV4LCBvcGVyYXRpb24sIGRvY3VtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gLyogRU5EIFJPT1QgT1BFUkFUSU9OUyAqL1xuICAgIGVsc2Uge1xuICAgICAgICBpZiAoIW11dGF0ZURvY3VtZW50KSB7XG4gICAgICAgICAgICBkb2N1bWVudCA9IF9kZWVwQ2xvbmUoZG9jdW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYXRoID0gb3BlcmF0aW9uLnBhdGggfHwgXCJcIjtcbiAgICAgICAgdmFyIGtleXMgPSBwYXRoLnNwbGl0KCcvJyk7XG4gICAgICAgIHZhciBvYmogPSBkb2N1bWVudDtcbiAgICAgICAgdmFyIHQgPSAxOyAvL3NraXAgZW1wdHkgZWxlbWVudCAtIGh0dHA6Ly9qc3BlcmYuY29tL3RvLXNoaWZ0LW9yLW5vdC10by1zaGlmdFxuICAgICAgICB2YXIgbGVuID0ga2V5cy5sZW5ndGg7XG4gICAgICAgIHZhciBleGlzdGluZ1BhdGhGcmFnbWVudCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIGtleSA9IHZvaWQgMDtcbiAgICAgICAgdmFyIHZhbGlkYXRlRnVuY3Rpb24gPSB2b2lkIDA7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsaWRhdGVPcGVyYXRpb24gPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdmFsaWRhdGVGdW5jdGlvbiA9IHZhbGlkYXRlT3BlcmF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFsaWRhdGVGdW5jdGlvbiA9IHZhbGlkYXRvcjtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAga2V5ID0ga2V5c1t0XTtcbiAgICAgICAgICAgIGlmIChrZXkgJiYga2V5LmluZGV4T2YoJ34nKSAhPSAtMSkge1xuICAgICAgICAgICAgICAgIGtleSA9IHVuZXNjYXBlUGF0aENvbXBvbmVudChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJhblByb3RvdHlwZU1vZGlmaWNhdGlvbnMgJiZcbiAgICAgICAgICAgICAgICAoa2V5ID09ICdfX3Byb3RvX18nIHx8XG4gICAgICAgICAgICAgICAgICAgIChrZXkgPT0gJ3Byb3RvdHlwZScgJiYgdCA+IDAgJiYga2V5c1t0IC0gMV0gPT0gJ2NvbnN0cnVjdG9yJykpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSlNPTi1QYXRjaDogbW9kaWZ5aW5nIGBfX3Byb3RvX19gIG9yIGBjb25zdHJ1Y3Rvci9wcm90b3R5cGVgIHByb3AgaXMgYmFubmVkIGZvciBzZWN1cml0eSByZWFzb25zLCBpZiB0aGlzIHdhcyBvbiBwdXJwb3NlLCBwbGVhc2Ugc2V0IGBiYW5Qcm90b3R5cGVNb2RpZmljYXRpb25zYCBmbGFnIGZhbHNlIGFuZCBwYXNzIGl0IHRvIHRoaXMgZnVuY3Rpb24uIE1vcmUgaW5mbyBpbiBmYXN0LWpzb24tcGF0Y2ggUkVBRE1FJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsaWRhdGVPcGVyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdQYXRoRnJhZ21lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAob2JqW2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdQYXRoRnJhZ21lbnQgPSBrZXlzLnNsaWNlKDAsIHQpLmpvaW4oJy8nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ID09IGxlbiAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nUGF0aEZyYWdtZW50ID0gb3BlcmF0aW9uLnBhdGg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nUGF0aEZyYWdtZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlRnVuY3Rpb24ob3BlcmF0aW9uLCAwLCBkb2N1bWVudCwgZXhpc3RpbmdQYXRoRnJhZ21lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdCsrO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICAgICAgICAgIGlmIChrZXkgPT09ICctJykge1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSBvYmoubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlT3BlcmF0aW9uICYmICFpc0ludGVnZXIoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpzb25QYXRjaEVycm9yKFwiRXhwZWN0ZWQgYW4gdW5zaWduZWQgYmFzZS0xMCBpbnRlZ2VyIHZhbHVlLCBtYWtpbmcgdGhlIG5ldyByZWZlcmVuY2VkIHZhbHVlIHRoZSBhcnJheSBlbGVtZW50IHdpdGggdGhlIHplcm8tYmFzZWQgaW5kZXhcIiwgXCJPUEVSQVRJT05fUEFUSF9JTExFR0FMX0FSUkFZX0lOREVYXCIsIGluZGV4LCBvcGVyYXRpb24sIGRvY3VtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfSAvLyBvbmx5IHBhcnNlIGtleSB3aGVuIGl0J3MgYW4gaW50ZWdlciBmb3IgYGFyci5wcm9wYCB0byB3b3JrXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzSW50ZWdlcihrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSB+fmtleTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodCA+PSBsZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlT3BlcmF0aW9uICYmIG9wZXJhdGlvbi5vcCA9PT0gXCJhZGRcIiAmJiBrZXkgPiBvYmoubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSnNvblBhdGNoRXJyb3IoXCJUaGUgc3BlY2lmaWVkIGluZGV4IE1VU1QgTk9UIGJlIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheVwiLCBcIk9QRVJBVElPTl9WQUxVRV9PVVRfT0ZfQk9VTkRTXCIsIGluZGV4LCBvcGVyYXRpb24sIGRvY3VtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgcmV0dXJuVmFsdWUgPSBhcnJPcHNbb3BlcmF0aW9uLm9wXS5jYWxsKG9wZXJhdGlvbiwgb2JqLCBrZXksIGRvY3VtZW50KTsgLy8gQXBwbHkgcGF0Y2hcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJldHVyblZhbHVlLnRlc3QgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSnNvblBhdGNoRXJyb3IoXCJUZXN0IG9wZXJhdGlvbiBmYWlsZWRcIiwgJ1RFU1RfT1BFUkFUSU9OX0ZBSUxFRCcsIGluZGV4LCBvcGVyYXRpb24sIGRvY3VtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHQgPj0gbGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5WYWx1ZSA9IG9iak9wc1tvcGVyYXRpb24ub3BdLmNhbGwob3BlcmF0aW9uLCBvYmosIGtleSwgZG9jdW1lbnQpOyAvLyBBcHBseSBwYXRjaFxuICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuVmFsdWUudGVzdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBKc29uUGF0Y2hFcnJvcihcIlRlc3Qgb3BlcmF0aW9uIGZhaWxlZFwiLCAnVEVTVF9PUEVSQVRJT05fRkFJTEVEJywgaW5kZXgsIG9wZXJhdGlvbiwgZG9jdW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvYmogPSBvYmpba2V5XTtcbiAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgbW9yZSBrZXlzIGluIHRoZSBwYXRoLCBidXQgdGhlIG5leHQgdmFsdWUgaXNuJ3QgYSBub24tbnVsbCBvYmplY3QsXG4gICAgICAgICAgICAvLyB0aHJvdyBhbiBPUEVSQVRJT05fUEFUSF9VTlJFU09MVkFCTEUgZXJyb3IgaW5zdGVhZCBvZiBpdGVyYXRpbmcgYWdhaW4uXG4gICAgICAgICAgICBpZiAodmFsaWRhdGVPcGVyYXRpb24gJiYgdCA8IGxlbiAmJiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBKc29uUGF0Y2hFcnJvcignQ2Fubm90IHBlcmZvcm0gb3BlcmF0aW9uIGF0IHRoZSBkZXNpcmVkIHBhdGgnLCAnT1BFUkFUSU9OX1BBVEhfVU5SRVNPTFZBQkxFJywgaW5kZXgsIG9wZXJhdGlvbiwgZG9jdW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBBcHBseSBhIGZ1bGwgSlNPTiBQYXRjaCBhcnJheSBvbiBhIEpTT04gZG9jdW1lbnQuXG4gKiBSZXR1cm5zIHRoZSB7bmV3RG9jdW1lbnQsIHJlc3VsdH0gb2YgdGhlIHBhdGNoLlxuICogSXQgbW9kaWZpZXMgdGhlIGBkb2N1bWVudGAgb2JqZWN0IGFuZCBgcGF0Y2hgIC0gaXQgZ2V0cyB0aGUgdmFsdWVzIGJ5IHJlZmVyZW5jZS5cbiAqIElmIHlvdSB3b3VsZCBsaWtlIHRvIGF2b2lkIHRvdWNoaW5nIHlvdXIgdmFsdWVzLCBjbG9uZSB0aGVtOlxuICogYGpzb25wYXRjaC5hcHBseVBhdGNoKGRvY3VtZW50LCBqc29ucGF0Y2guX2RlZXBDbG9uZShwYXRjaCkpYC5cbiAqXG4gKiBAcGFyYW0gZG9jdW1lbnQgVGhlIGRvY3VtZW50IHRvIHBhdGNoXG4gKiBAcGFyYW0gcGF0Y2ggVGhlIHBhdGNoIHRvIGFwcGx5XG4gKiBAcGFyYW0gdmFsaWRhdGVPcGVyYXRpb24gYGZhbHNlYCBpcyB3aXRob3V0IHZhbGlkYXRpb24sIGB0cnVlYCB0byB1c2UgZGVmYXVsdCBqc29ucGF0Y2gncyB2YWxpZGF0aW9uLCBvciB5b3UgY2FuIHBhc3MgYSBgdmFsaWRhdGVPcGVyYXRpb25gIGNhbGxiYWNrIHRvIGJlIHVzZWQgZm9yIHZhbGlkYXRpb24uXG4gKiBAcGFyYW0gbXV0YXRlRG9jdW1lbnQgV2hldGhlciB0byBtdXRhdGUgdGhlIG9yaWdpbmFsIGRvY3VtZW50IG9yIGNsb25lIGl0IGJlZm9yZSBhcHBseWluZ1xuICogQHBhcmFtIGJhblByb3RvdHlwZU1vZGlmaWNhdGlvbnMgV2hldGhlciB0byBiYW4gbW9kaWZpY2F0aW9ucyB0byBgX19wcm90b19fYCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICogQHJldHVybiBBbiBhcnJheSBvZiBge25ld0RvY3VtZW50LCByZXN1bHR9YCBhZnRlciB0aGUgcGF0Y2hcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UGF0Y2goZG9jdW1lbnQsIHBhdGNoLCB2YWxpZGF0ZU9wZXJhdGlvbiwgbXV0YXRlRG9jdW1lbnQsIGJhblByb3RvdHlwZU1vZGlmaWNhdGlvbnMpIHtcbiAgICBpZiAobXV0YXRlRG9jdW1lbnQgPT09IHZvaWQgMCkgeyBtdXRhdGVEb2N1bWVudCA9IHRydWU7IH1cbiAgICBpZiAoYmFuUHJvdG90eXBlTW9kaWZpY2F0aW9ucyA9PT0gdm9pZCAwKSB7IGJhblByb3RvdHlwZU1vZGlmaWNhdGlvbnMgPSB0cnVlOyB9XG4gICAgaWYgKHZhbGlkYXRlT3BlcmF0aW9uKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShwYXRjaCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBKc29uUGF0Y2hFcnJvcignUGF0Y2ggc2VxdWVuY2UgbXVzdCBiZSBhbiBhcnJheScsICdTRVFVRU5DRV9OT1RfQU5fQVJSQVknKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoIW11dGF0ZURvY3VtZW50KSB7XG4gICAgICAgIGRvY3VtZW50ID0gX2RlZXBDbG9uZShkb2N1bWVudCk7XG4gICAgfVxuICAgIHZhciByZXN1bHRzID0gbmV3IEFycmF5KHBhdGNoLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aF8xID0gcGF0Y2gubGVuZ3RoOyBpIDwgbGVuZ3RoXzE7IGkrKykge1xuICAgICAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIHBhc3MgbXV0YXRlRG9jdW1lbnQgYXJndW1lbnQgYmVjYXVzZSBpZiBpdCB3YXMgdHJ1ZSwgd2UgYWxyZWFkeSBkZWVwIGNsb25lZCB0aGUgb2JqZWN0LCB3ZSdsbCBqdXN0IHBhc3MgYHRydWVgXG4gICAgICAgIHJlc3VsdHNbaV0gPSBhcHBseU9wZXJhdGlvbihkb2N1bWVudCwgcGF0Y2hbaV0sIHZhbGlkYXRlT3BlcmF0aW9uLCB0cnVlLCBiYW5Qcm90b3R5cGVNb2RpZmljYXRpb25zLCBpKTtcbiAgICAgICAgZG9jdW1lbnQgPSByZXN1bHRzW2ldLm5ld0RvY3VtZW50OyAvLyBpbiBjYXNlIHJvb3Qgd2FzIHJlcGxhY2VkXG4gICAgfVxuICAgIHJlc3VsdHMubmV3RG9jdW1lbnQgPSBkb2N1bWVudDtcbiAgICByZXR1cm4gcmVzdWx0cztcbn1cbi8qKlxuICogQXBwbHkgYSBzaW5nbGUgSlNPTiBQYXRjaCBPcGVyYXRpb24gb24gYSBKU09OIGRvY3VtZW50LlxuICogUmV0dXJucyB0aGUgdXBkYXRlZCBkb2N1bWVudC5cbiAqIFN1aXRhYmxlIGFzIGEgcmVkdWNlci5cbiAqXG4gKiBAcGFyYW0gZG9jdW1lbnQgVGhlIGRvY3VtZW50IHRvIHBhdGNoXG4gKiBAcGFyYW0gb3BlcmF0aW9uIFRoZSBvcGVyYXRpb24gdG8gYXBwbHlcbiAqIEByZXR1cm4gVGhlIHVwZGF0ZWQgZG9jdW1lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UmVkdWNlcihkb2N1bWVudCwgb3BlcmF0aW9uLCBpbmRleCkge1xuICAgIHZhciBvcGVyYXRpb25SZXN1bHQgPSBhcHBseU9wZXJhdGlvbihkb2N1bWVudCwgb3BlcmF0aW9uKTtcbiAgICBpZiAob3BlcmF0aW9uUmVzdWx0LnRlc3QgPT09IGZhbHNlKSB7IC8vIGZhaWxlZCB0ZXN0XG4gICAgICAgIHRocm93IG5ldyBKc29uUGF0Y2hFcnJvcihcIlRlc3Qgb3BlcmF0aW9uIGZhaWxlZFwiLCAnVEVTVF9PUEVSQVRJT05fRkFJTEVEJywgaW5kZXgsIG9wZXJhdGlvbiwgZG9jdW1lbnQpO1xuICAgIH1cbiAgICByZXR1cm4gb3BlcmF0aW9uUmVzdWx0Lm5ld0RvY3VtZW50O1xufVxuLyoqXG4gKiBWYWxpZGF0ZXMgYSBzaW5nbGUgb3BlcmF0aW9uLiBDYWxsZWQgZnJvbSBganNvbnBhdGNoLnZhbGlkYXRlYC4gVGhyb3dzIGBKc29uUGF0Y2hFcnJvcmAgaW4gY2FzZSBvZiBhbiBlcnJvci5cbiAqIEBwYXJhbSB7b2JqZWN0fSBvcGVyYXRpb24gLSBvcGVyYXRpb24gb2JqZWN0IChwYXRjaClcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIGluZGV4IG9mIG9wZXJhdGlvbiBpbiB0aGUgc2VxdWVuY2VcbiAqIEBwYXJhbSB7b2JqZWN0fSBbZG9jdW1lbnRdIC0gb2JqZWN0IHdoZXJlIHRoZSBvcGVyYXRpb24gaXMgc3VwcG9zZWQgdG8gYmUgYXBwbGllZFxuICogQHBhcmFtIHtzdHJpbmd9IFtleGlzdGluZ1BhdGhGcmFnbWVudF0gLSBjb21lcyBhbG9uZyB3aXRoIGBkb2N1bWVudGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRvcihvcGVyYXRpb24sIGluZGV4LCBkb2N1bWVudCwgZXhpc3RpbmdQYXRoRnJhZ21lbnQpIHtcbiAgICBpZiAodHlwZW9mIG9wZXJhdGlvbiAhPT0gJ29iamVjdCcgfHwgb3BlcmF0aW9uID09PSBudWxsIHx8IEFycmF5LmlzQXJyYXkob3BlcmF0aW9uKSkge1xuICAgICAgICB0aHJvdyBuZXcgSnNvblBhdGNoRXJyb3IoJ09wZXJhdGlvbiBpcyBub3QgYW4gb2JqZWN0JywgJ09QRVJBVElPTl9OT1RfQU5fT0JKRUNUJywgaW5kZXgsIG9wZXJhdGlvbiwgZG9jdW1lbnQpO1xuICAgIH1cbiAgICBlbHNlIGlmICghb2JqT3BzW29wZXJhdGlvbi5vcF0pIHtcbiAgICAgICAgdGhyb3cgbmV3IEpzb25QYXRjaEVycm9yKCdPcGVyYXRpb24gYG9wYCBwcm9wZXJ0eSBpcyBub3Qgb25lIG9mIG9wZXJhdGlvbnMgZGVmaW5lZCBpbiBSRkMtNjkwMicsICdPUEVSQVRJT05fT1BfSU5WQUxJRCcsIGluZGV4LCBvcGVyYXRpb24sIGRvY3VtZW50KTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIG9wZXJhdGlvbi5wYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgSnNvblBhdGNoRXJyb3IoJ09wZXJhdGlvbiBgcGF0aGAgcHJvcGVydHkgaXMgbm90IGEgc3RyaW5nJywgJ09QRVJBVElPTl9QQVRIX0lOVkFMSUQnLCBpbmRleCwgb3BlcmF0aW9uLCBkb2N1bWVudCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKG9wZXJhdGlvbi5wYXRoLmluZGV4T2YoJy8nKSAhPT0gMCAmJiBvcGVyYXRpb24ucGF0aC5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIHBhdGhzIHRoYXQgYXJlbid0IGVtcHR5IHN0cmluZyBzaG91bGQgc3RhcnQgd2l0aCBcIi9cIlxuICAgICAgICB0aHJvdyBuZXcgSnNvblBhdGNoRXJyb3IoJ09wZXJhdGlvbiBgcGF0aGAgcHJvcGVydHkgbXVzdCBzdGFydCB3aXRoIFwiL1wiJywgJ09QRVJBVElPTl9QQVRIX0lOVkFMSUQnLCBpbmRleCwgb3BlcmF0aW9uLCBkb2N1bWVudCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKChvcGVyYXRpb24ub3AgPT09ICdtb3ZlJyB8fCBvcGVyYXRpb24ub3AgPT09ICdjb3B5JykgJiYgdHlwZW9mIG9wZXJhdGlvbi5mcm9tICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgSnNvblBhdGNoRXJyb3IoJ09wZXJhdGlvbiBgZnJvbWAgcHJvcGVydHkgaXMgbm90IHByZXNlbnQgKGFwcGxpY2FibGUgaW4gYG1vdmVgIGFuZCBgY29weWAgb3BlcmF0aW9ucyknLCAnT1BFUkFUSU9OX0ZST01fUkVRVUlSRUQnLCBpbmRleCwgb3BlcmF0aW9uLCBkb2N1bWVudCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKChvcGVyYXRpb24ub3AgPT09ICdhZGQnIHx8IG9wZXJhdGlvbi5vcCA9PT0gJ3JlcGxhY2UnIHx8IG9wZXJhdGlvbi5vcCA9PT0gJ3Rlc3QnKSAmJiBvcGVyYXRpb24udmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgSnNvblBhdGNoRXJyb3IoJ09wZXJhdGlvbiBgdmFsdWVgIHByb3BlcnR5IGlzIG5vdCBwcmVzZW50IChhcHBsaWNhYmxlIGluIGBhZGRgLCBgcmVwbGFjZWAgYW5kIGB0ZXN0YCBvcGVyYXRpb25zKScsICdPUEVSQVRJT05fVkFMVUVfUkVRVUlSRUQnLCBpbmRleCwgb3BlcmF0aW9uLCBkb2N1bWVudCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKChvcGVyYXRpb24ub3AgPT09ICdhZGQnIHx8IG9wZXJhdGlvbi5vcCA9PT0gJ3JlcGxhY2UnIHx8IG9wZXJhdGlvbi5vcCA9PT0gJ3Rlc3QnKSAmJiBoYXNVbmRlZmluZWQob3BlcmF0aW9uLnZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgSnNvblBhdGNoRXJyb3IoJ09wZXJhdGlvbiBgdmFsdWVgIHByb3BlcnR5IGlzIG5vdCBwcmVzZW50IChhcHBsaWNhYmxlIGluIGBhZGRgLCBgcmVwbGFjZWAgYW5kIGB0ZXN0YCBvcGVyYXRpb25zKScsICdPUEVSQVRJT05fVkFMVUVfQ0FOTk9UX0NPTlRBSU5fVU5ERUZJTkVEJywgaW5kZXgsIG9wZXJhdGlvbiwgZG9jdW1lbnQpO1xuICAgIH1cbiAgICBlbHNlIGlmIChkb2N1bWVudCkge1xuICAgICAgICBpZiAob3BlcmF0aW9uLm9wID09IFwiYWRkXCIpIHtcbiAgICAgICAgICAgIHZhciBwYXRoTGVuID0gb3BlcmF0aW9uLnBhdGguc3BsaXQoXCIvXCIpLmxlbmd0aDtcbiAgICAgICAgICAgIHZhciBleGlzdGluZ1BhdGhMZW4gPSBleGlzdGluZ1BhdGhGcmFnbWVudC5zcGxpdChcIi9cIikubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKHBhdGhMZW4gIT09IGV4aXN0aW5nUGF0aExlbiArIDEgJiYgcGF0aExlbiAhPT0gZXhpc3RpbmdQYXRoTGVuKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpzb25QYXRjaEVycm9yKCdDYW5ub3QgcGVyZm9ybSBhbiBgYWRkYCBvcGVyYXRpb24gYXQgdGhlIGRlc2lyZWQgcGF0aCcsICdPUEVSQVRJT05fUEFUSF9DQU5OT1RfQUREJywgaW5kZXgsIG9wZXJhdGlvbiwgZG9jdW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9wZXJhdGlvbi5vcCA9PT0gJ3JlcGxhY2UnIHx8IG9wZXJhdGlvbi5vcCA9PT0gJ3JlbW92ZScgfHwgb3BlcmF0aW9uLm9wID09PSAnX2dldCcpIHtcbiAgICAgICAgICAgIGlmIChvcGVyYXRpb24ucGF0aCAhPT0gZXhpc3RpbmdQYXRoRnJhZ21lbnQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSnNvblBhdGNoRXJyb3IoJ0Nhbm5vdCBwZXJmb3JtIHRoZSBvcGVyYXRpb24gYXQgYSBwYXRoIHRoYXQgZG9lcyBub3QgZXhpc3QnLCAnT1BFUkFUSU9OX1BBVEhfVU5SRVNPTFZBQkxFJywgaW5kZXgsIG9wZXJhdGlvbiwgZG9jdW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9wZXJhdGlvbi5vcCA9PT0gJ21vdmUnIHx8IG9wZXJhdGlvbi5vcCA9PT0gJ2NvcHknKSB7XG4gICAgICAgICAgICB2YXIgZXhpc3RpbmdWYWx1ZSA9IHsgb3A6IFwiX2dldFwiLCBwYXRoOiBvcGVyYXRpb24uZnJvbSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xuICAgICAgICAgICAgdmFyIGVycm9yID0gdmFsaWRhdGUoW2V4aXN0aW5nVmFsdWVdLCBkb2N1bWVudCk7XG4gICAgICAgICAgICBpZiAoZXJyb3IgJiYgZXJyb3IubmFtZSA9PT0gJ09QRVJBVElPTl9QQVRIX1VOUkVTT0xWQUJMRScpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSnNvblBhdGNoRXJyb3IoJ0Nhbm5vdCBwZXJmb3JtIHRoZSBvcGVyYXRpb24gZnJvbSBhIHBhdGggdGhhdCBkb2VzIG5vdCBleGlzdCcsICdPUEVSQVRJT05fRlJPTV9VTlJFU09MVkFCTEUnLCBpbmRleCwgb3BlcmF0aW9uLCBkb2N1bWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFZhbGlkYXRlcyBhIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMuIElmIGBkb2N1bWVudGAgcGFyYW1ldGVyIGlzIHByb3ZpZGVkLCB0aGUgc2VxdWVuY2UgaXMgYWRkaXRpb25hbGx5IHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBvYmplY3QgZG9jdW1lbnQuXG4gKiBJZiBlcnJvciBpcyBlbmNvdW50ZXJlZCwgcmV0dXJucyBhIEpzb25QYXRjaEVycm9yIG9iamVjdFxuICogQHBhcmFtIHNlcXVlbmNlXG4gKiBAcGFyYW0gZG9jdW1lbnRcbiAqIEByZXR1cm5zIHtKc29uUGF0Y2hFcnJvcnx1bmRlZmluZWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZShzZXF1ZW5jZSwgZG9jdW1lbnQsIGV4dGVybmFsVmFsaWRhdG9yKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHNlcXVlbmNlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEpzb25QYXRjaEVycm9yKCdQYXRjaCBzZXF1ZW5jZSBtdXN0IGJlIGFuIGFycmF5JywgJ1NFUVVFTkNFX05PVF9BTl9BUlJBWScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkb2N1bWVudCkge1xuICAgICAgICAgICAgLy9jbG9uZSBkb2N1bWVudCBhbmQgc2VxdWVuY2Ugc28gdGhhdCB3ZSBjYW4gc2FmZWx5IHRyeSBhcHBseWluZyBvcGVyYXRpb25zXG4gICAgICAgICAgICBhcHBseVBhdGNoKF9kZWVwQ2xvbmUoZG9jdW1lbnQpLCBfZGVlcENsb25lKHNlcXVlbmNlKSwgZXh0ZXJuYWxWYWxpZGF0b3IgfHwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBleHRlcm5hbFZhbGlkYXRvciA9IGV4dGVybmFsVmFsaWRhdG9yIHx8IHZhbGlkYXRvcjtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VxdWVuY2UubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBleHRlcm5hbFZhbGlkYXRvcihzZXF1ZW5jZVtpXSwgaSwgZG9jdW1lbnQsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBKc29uUGF0Y2hFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8gYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL2Vwb2JlcmV6a2luL2Zhc3QtZGVlcC1lcXVhbFxuLy8gTUlUIExpY2Vuc2Vcbi8vIENvcHlyaWdodCAoYykgMjAxNyBFdmdlbnkgUG9iZXJlemtpblxuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4vLyBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuLy8gU09GVFdBUkUuXG5leHBvcnQgZnVuY3Rpb24gX2FyZUVxdWFscyhhLCBiKSB7XG4gICAgaWYgKGEgPT09IGIpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmIChhICYmIGIgJiYgdHlwZW9mIGEgPT0gJ29iamVjdCcgJiYgdHlwZW9mIGIgPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdmFyIGFyckEgPSBBcnJheS5pc0FycmF5KGEpLCBhcnJCID0gQXJyYXkuaXNBcnJheShiKSwgaSwgbGVuZ3RoLCBrZXk7XG4gICAgICAgIGlmIChhcnJBICYmIGFyckIpIHtcbiAgICAgICAgICAgIGxlbmd0aCA9IGEubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGxlbmd0aCAhPSBiLmxlbmd0aClcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspXG4gICAgICAgICAgICAgICAgaWYgKCFfYXJlRXF1YWxzKGFbaV0sIGJbaV0pKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXJyQSAhPSBhcnJCKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGEpO1xuICAgICAgICBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICAgICAgaWYgKGxlbmd0aCAhPT0gT2JqZWN0LmtleXMoYikubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspXG4gICAgICAgICAgICBpZiAoIWIuaGFzT3duUHJvcGVydHkoa2V5c1tpXSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspIHtcbiAgICAgICAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICAgICAgICBpZiAoIV9hcmVFcXVhbHMoYVtrZXldLCBiW2tleV0pKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGEgIT09IGEgJiYgYiAhPT0gYjtcbn1cbjtcbiIsICIvKiFcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9TdGFyY291bnRlci1KYWNrL0pTT04tUGF0Y2hcbiAqIChjKSAyMDE3LTIwMjIgSm9hY2hpbSBXZXN0ZXJcbiAqIE1JVCBsaWNlbnNlZFxuICovXG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbnZhciBfaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuZXhwb3J0IGZ1bmN0aW9uIGhhc093blByb3BlcnR5KG9iaiwga2V5KSB7XG4gICAgcmV0dXJuIF9oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfb2JqZWN0S2V5cyhvYmopIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgIHZhciBrZXlzXzEgPSBuZXcgQXJyYXkob2JqLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwga2V5c18xLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICBrZXlzXzFba10gPSBcIlwiICsgaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ga2V5c18xO1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LmtleXMpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaik7XG4gICAgfVxuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIgaSBpbiBvYmopIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5KG9iaiwgaSkpIHtcbiAgICAgICAgICAgIGtleXMucHVzaChpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ga2V5cztcbn1cbjtcbi8qKlxuKiBEZWVwbHkgY2xvbmUgdGhlIG9iamVjdC5cbiogaHR0cHM6Ly9qc3BlcmYuY29tL2RlZXAtY29weS12cy1qc29uLXN0cmluZ2lmeS1qc29uLXBhcnNlLzI1IChyZWN1cnNpdmVEZWVwQ29weSlcbiogQHBhcmFtICB7YW55fSBvYmogdmFsdWUgdG8gY2xvbmVcbiogQHJldHVybiB7YW55fSBjbG9uZWQgb2JqXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIF9kZWVwQ2xvbmUob2JqKSB7XG4gICAgc3dpdGNoICh0eXBlb2Ygb2JqKSB7XG4gICAgICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpOyAvL0Zhc3RlciB0aGFuIEVTNSBjbG9uZSAtIGh0dHA6Ly9qc3BlcmYuY29tL2RlZXAtY2xvbmluZy1vZi1vYmplY3RzLzVcbiAgICAgICAgY2FzZSBcInVuZGVmaW5lZFwiOlxuICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vdGhpcyBpcyBob3cgSlNPTi5zdHJpbmdpZnkgYmVoYXZlcyBmb3IgYXJyYXkgaXRlbXNcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBvYmo7IC8vbm8gbmVlZCB0byBjbG9uZSBwcmltaXRpdmVzXG4gICAgfVxufVxuLy8zeCBmYXN0ZXIgdGhhbiBjYWNoZWQgL15cXGQrJC8udGVzdChzdHIpXG5leHBvcnQgZnVuY3Rpb24gaXNJbnRlZ2VyKHN0cikge1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgbGVuID0gc3RyLmxlbmd0aDtcbiAgICB2YXIgY2hhckNvZGU7XG4gICAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICAgICAgY2hhckNvZGUgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgICAgaWYgKGNoYXJDb2RlID49IDQ4ICYmIGNoYXJDb2RlIDw9IDU3KSB7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuLyoqXG4qIEVzY2FwZXMgYSBqc29uIHBvaW50ZXIgcGF0aFxuKiBAcGFyYW0gcGF0aCBUaGUgcmF3IHBvaW50ZXJcbiogQHJldHVybiB0aGUgRXNjYXBlZCBwYXRoXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZVBhdGhDb21wb25lbnQocGF0aCkge1xuICAgIGlmIChwYXRoLmluZGV4T2YoJy8nKSA9PT0gLTEgJiYgcGF0aC5pbmRleE9mKCd+JykgPT09IC0xKVxuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICByZXR1cm4gcGF0aC5yZXBsYWNlKC9+L2csICd+MCcpLnJlcGxhY2UoL1xcLy9nLCAnfjEnKTtcbn1cbi8qKlxuICogVW5lc2NhcGVzIGEganNvbiBwb2ludGVyIHBhdGhcbiAqIEBwYXJhbSBwYXRoIFRoZSBlc2NhcGVkIHBvaW50ZXJcbiAqIEByZXR1cm4gVGhlIHVuZXNjYXBlZCBwYXRoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmVzY2FwZVBhdGhDb21wb25lbnQocGF0aCkge1xuICAgIHJldHVybiBwYXRoLnJlcGxhY2UoL34xL2csICcvJykucmVwbGFjZSgvfjAvZywgJ34nKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfZ2V0UGF0aFJlY3Vyc2l2ZShyb290LCBvYmopIHtcbiAgICB2YXIgZm91bmQ7XG4gICAgZm9yICh2YXIga2V5IGluIHJvb3QpIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5KHJvb3QsIGtleSkpIHtcbiAgICAgICAgICAgIGlmIChyb290W2tleV0gPT09IG9iaikge1xuICAgICAgICAgICAgICAgIHJldHVybiBlc2NhcGVQYXRoQ29tcG9uZW50KGtleSkgKyAnLyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2Ygcm9vdFtrZXldID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIGZvdW5kID0gX2dldFBhdGhSZWN1cnNpdmUocm9vdFtrZXldLCBvYmopO1xuICAgICAgICAgICAgICAgIGlmIChmb3VuZCAhPSAnJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXNjYXBlUGF0aENvbXBvbmVudChrZXkpICsgJy8nICsgZm91bmQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAnJztcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXRoKHJvb3QsIG9iaikge1xuICAgIGlmIChyb290ID09PSBvYmopIHtcbiAgICAgICAgcmV0dXJuICcvJztcbiAgICB9XG4gICAgdmFyIHBhdGggPSBfZ2V0UGF0aFJlY3Vyc2l2ZShyb290LCBvYmopO1xuICAgIGlmIChwYXRoID09PSAnJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJPYmplY3Qgbm90IGZvdW5kIGluIHJvb3RcIik7XG4gICAgfVxuICAgIHJldHVybiBcIi9cIiArIHBhdGg7XG59XG4vKipcbiogUmVjdXJzaXZlbHkgY2hlY2tzIHdoZXRoZXIgYW4gb2JqZWN0IGhhcyBhbnkgdW5kZWZpbmVkIHZhbHVlcyBpbnNpZGUuXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1VuZGVmaW5lZChvYmopIHtcbiAgICBpZiAob2JqID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChvYmopIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICAgICAgZm9yICh2YXIgaV8xID0gMCwgbGVuID0gb2JqLmxlbmd0aDsgaV8xIDwgbGVuOyBpXzErKykge1xuICAgICAgICAgICAgICAgIGlmIChoYXNVbmRlZmluZWQob2JqW2lfMV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICB2YXIgb2JqS2V5cyA9IF9vYmplY3RLZXlzKG9iaik7XG4gICAgICAgICAgICB2YXIgb2JqS2V5c0xlbmd0aCA9IG9iaktleXMubGVuZ3RoO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmpLZXlzTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaGFzVW5kZWZpbmVkKG9ialtvYmpLZXlzW2ldXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHBhdGNoRXJyb3JNZXNzYWdlRm9ybWF0dGVyKG1lc3NhZ2UsIGFyZ3MpIHtcbiAgICB2YXIgbWVzc2FnZVBhcnRzID0gW21lc3NhZ2VdO1xuICAgIGZvciAodmFyIGtleSBpbiBhcmdzKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHR5cGVvZiBhcmdzW2tleV0gPT09ICdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoYXJnc1trZXldLCBudWxsLCAyKSA6IGFyZ3Nba2V5XTsgLy8gcHJldHR5IHByaW50XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBtZXNzYWdlUGFydHMucHVzaChrZXkgKyBcIjogXCIgKyB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1lc3NhZ2VQYXJ0cy5qb2luKCdcXG4nKTtcbn1cbnZhciBQYXRjaEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQYXRjaEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBhdGNoRXJyb3IobWVzc2FnZSwgbmFtZSwgaW5kZXgsIG9wZXJhdGlvbiwgdHJlZSkge1xuICAgICAgICB2YXIgX25ld1RhcmdldCA9IHRoaXMuY29uc3RydWN0b3I7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHBhdGNoRXJyb3JNZXNzYWdlRm9ybWF0dGVyKG1lc3NhZ2UsIHsgbmFtZTogbmFtZSwgaW5kZXg6IGluZGV4LCBvcGVyYXRpb246IG9wZXJhdGlvbiwgdHJlZTogdHJlZSB9KSkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIF90aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIF90aGlzLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjtcbiAgICAgICAgX3RoaXMudHJlZSA9IHRyZWU7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihfdGhpcywgX25ld1RhcmdldC5wcm90b3R5cGUpOyAvLyByZXN0b3JlIHByb3RvdHlwZSBjaGFpbiwgc2VlIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80ODM0MjM1OVxuICAgICAgICBfdGhpcy5tZXNzYWdlID0gcGF0Y2hFcnJvck1lc3NhZ2VGb3JtYXR0ZXIobWVzc2FnZSwgeyBuYW1lOiBuYW1lLCBpbmRleDogaW5kZXgsIG9wZXJhdGlvbjogb3BlcmF0aW9uLCB0cmVlOiB0cmVlIH0pO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBQYXRjaEVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgUGF0Y2hFcnJvciB9O1xuIiwgIi8qIVxuICogaHR0cHM6Ly9naXRodWIuY29tL1N0YXJjb3VudGVyLUphY2svSlNPTi1QYXRjaFxuICogKGMpIDIwMTctMjAyMSBKb2FjaGltIFdlc3RlclxuICogTUlUIGxpY2Vuc2VcbiAqL1xuaW1wb3J0IHsgX2RlZXBDbG9uZSwgX29iamVjdEtleXMsIGVzY2FwZVBhdGhDb21wb25lbnQsIGhhc093blByb3BlcnR5IH0gZnJvbSAnLi9oZWxwZXJzLm1qcyc7XG5pbXBvcnQgeyBhcHBseVBhdGNoIH0gZnJvbSAnLi9jb3JlLm1qcyc7XG52YXIgYmVmb3JlRGljdCA9IG5ldyBXZWFrTWFwKCk7XG52YXIgTWlycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE1pcnJvcihvYmopIHtcbiAgICAgICAgdGhpcy5vYnNlcnZlcnMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMub2JqID0gb2JqO1xuICAgIH1cbiAgICByZXR1cm4gTWlycm9yO1xufSgpKTtcbnZhciBPYnNlcnZlckluZm8gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gT2JzZXJ2ZXJJbmZvKGNhbGxiYWNrLCBvYnNlcnZlcikge1xuICAgICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIgPSBvYnNlcnZlcjtcbiAgICB9XG4gICAgcmV0dXJuIE9ic2VydmVySW5mbztcbn0oKSk7XG5mdW5jdGlvbiBnZXRNaXJyb3Iob2JqKSB7XG4gICAgcmV0dXJuIGJlZm9yZURpY3QuZ2V0KG9iaik7XG59XG5mdW5jdGlvbiBnZXRPYnNlcnZlckZyb21NaXJyb3IobWlycm9yLCBjYWxsYmFjaykge1xuICAgIHJldHVybiBtaXJyb3Iub2JzZXJ2ZXJzLmdldChjYWxsYmFjayk7XG59XG5mdW5jdGlvbiByZW1vdmVPYnNlcnZlckZyb21NaXJyb3IobWlycm9yLCBvYnNlcnZlcikge1xuICAgIG1pcnJvci5vYnNlcnZlcnMuZGVsZXRlKG9ic2VydmVyLmNhbGxiYWNrKTtcbn1cbi8qKlxuICogRGV0YWNoIGFuIG9ic2VydmVyIGZyb20gYW4gb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bm9ic2VydmUocm9vdCwgb2JzZXJ2ZXIpIHtcbiAgICBvYnNlcnZlci51bm9ic2VydmUoKTtcbn1cbi8qKlxuICogT2JzZXJ2ZXMgY2hhbmdlcyBtYWRlIHRvIGFuIG9iamVjdCwgd2hpY2ggY2FuIHRoZW4gYmUgcmV0cmlldmVkIHVzaW5nIGdlbmVyYXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvYnNlcnZlKG9iaiwgY2FsbGJhY2spIHtcbiAgICB2YXIgcGF0Y2hlcyA9IFtdO1xuICAgIHZhciBvYnNlcnZlcjtcbiAgICB2YXIgbWlycm9yID0gZ2V0TWlycm9yKG9iaik7XG4gICAgaWYgKCFtaXJyb3IpIHtcbiAgICAgICAgbWlycm9yID0gbmV3IE1pcnJvcihvYmopO1xuICAgICAgICBiZWZvcmVEaWN0LnNldChvYmosIG1pcnJvcik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YXIgb2JzZXJ2ZXJJbmZvID0gZ2V0T2JzZXJ2ZXJGcm9tTWlycm9yKG1pcnJvciwgY2FsbGJhY2spO1xuICAgICAgICBvYnNlcnZlciA9IG9ic2VydmVySW5mbyAmJiBvYnNlcnZlckluZm8ub2JzZXJ2ZXI7XG4gICAgfVxuICAgIGlmIChvYnNlcnZlcikge1xuICAgICAgICByZXR1cm4gb2JzZXJ2ZXI7XG4gICAgfVxuICAgIG9ic2VydmVyID0ge307XG4gICAgbWlycm9yLnZhbHVlID0gX2RlZXBDbG9uZShvYmopO1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICBvYnNlcnZlci5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICBvYnNlcnZlci5uZXh0ID0gbnVsbDtcbiAgICAgICAgdmFyIGRpcnR5Q2hlY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBnZW5lcmF0ZShvYnNlcnZlcik7XG4gICAgICAgIH07XG4gICAgICAgIHZhciBmYXN0Q2hlY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQob2JzZXJ2ZXIubmV4dCk7XG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0ID0gc2V0VGltZW91dChkaXJ0eUNoZWNrKTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7IC8vbm90IE5vZGVcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgZmFzdENoZWNrKTtcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIGZhc3RDaGVjayk7XG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgZmFzdENoZWNrKTtcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZmFzdENoZWNrKTtcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmYXN0Q2hlY2spO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9ic2VydmVyLnBhdGNoZXMgPSBwYXRjaGVzO1xuICAgIG9ic2VydmVyLm9iamVjdCA9IG9iajtcbiAgICBvYnNlcnZlci51bm9ic2VydmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGdlbmVyYXRlKG9ic2VydmVyKTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KG9ic2VydmVyLm5leHQpO1xuICAgICAgICByZW1vdmVPYnNlcnZlckZyb21NaXJyb3IobWlycm9yLCBvYnNlcnZlcik7XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBmYXN0Q2hlY2spO1xuICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXVwJywgZmFzdENoZWNrKTtcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBmYXN0Q2hlY2spO1xuICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBmYXN0Q2hlY2spO1xuICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZhc3RDaGVjayk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIG1pcnJvci5vYnNlcnZlcnMuc2V0KGNhbGxiYWNrLCBuZXcgT2JzZXJ2ZXJJbmZvKGNhbGxiYWNrLCBvYnNlcnZlcikpO1xuICAgIHJldHVybiBvYnNlcnZlcjtcbn1cbi8qKlxuICogR2VuZXJhdGUgYW4gYXJyYXkgb2YgcGF0Y2hlcyBmcm9tIGFuIG9ic2VydmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZShvYnNlcnZlciwgaW52ZXJ0aWJsZSkge1xuICAgIGlmIChpbnZlcnRpYmxlID09PSB2b2lkIDApIHsgaW52ZXJ0aWJsZSA9IGZhbHNlOyB9XG4gICAgdmFyIG1pcnJvciA9IGJlZm9yZURpY3QuZ2V0KG9ic2VydmVyLm9iamVjdCk7XG4gICAgX2dlbmVyYXRlKG1pcnJvci52YWx1ZSwgb2JzZXJ2ZXIub2JqZWN0LCBvYnNlcnZlci5wYXRjaGVzLCBcIlwiLCBpbnZlcnRpYmxlKTtcbiAgICBpZiAob2JzZXJ2ZXIucGF0Y2hlcy5sZW5ndGgpIHtcbiAgICAgICAgYXBwbHlQYXRjaChtaXJyb3IudmFsdWUsIG9ic2VydmVyLnBhdGNoZXMpO1xuICAgIH1cbiAgICB2YXIgdGVtcCA9IG9ic2VydmVyLnBhdGNoZXM7XG4gICAgaWYgKHRlbXAubGVuZ3RoID4gMCkge1xuICAgICAgICBvYnNlcnZlci5wYXRjaGVzID0gW107XG4gICAgICAgIGlmIChvYnNlcnZlci5jYWxsYmFjaykge1xuICAgICAgICAgICAgb2JzZXJ2ZXIuY2FsbGJhY2sodGVtcCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRlbXA7XG59XG4vLyBEaXJ0eSBjaGVjayBpZiBvYmogaXMgZGlmZmVyZW50IGZyb20gbWlycm9yLCBnZW5lcmF0ZSBwYXRjaGVzIGFuZCB1cGRhdGUgbWlycm9yXG5mdW5jdGlvbiBfZ2VuZXJhdGUobWlycm9yLCBvYmosIHBhdGNoZXMsIHBhdGgsIGludmVydGlibGUpIHtcbiAgICBpZiAob2JqID09PSBtaXJyb3IpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iai50b0pTT04gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBvYmogPSBvYmoudG9KU09OKCk7XG4gICAgfVxuICAgIHZhciBuZXdLZXlzID0gX29iamVjdEtleXMob2JqKTtcbiAgICB2YXIgb2xkS2V5cyA9IF9vYmplY3RLZXlzKG1pcnJvcik7XG4gICAgdmFyIGNoYW5nZWQgPSBmYWxzZTtcbiAgICB2YXIgZGVsZXRlZCA9IGZhbHNlO1xuICAgIC8vaWYgZXZlciBcIm1vdmVcIiBvcGVyYXRpb24gaXMgaW1wbGVtZW50ZWQgaGVyZSwgbWFrZSBzdXJlIHRoaXMgdGVzdCBydW5zIE9LOiBcInNob3VsZCBub3QgZ2VuZXJhdGUgdGhlIHNhbWUgcGF0Y2ggdHdpY2UgKG1vdmUpXCJcbiAgICBmb3IgKHZhciB0ID0gb2xkS2V5cy5sZW5ndGggLSAxOyB0ID49IDA7IHQtLSkge1xuICAgICAgICB2YXIga2V5ID0gb2xkS2V5c1t0XTtcbiAgICAgICAgdmFyIG9sZFZhbCA9IG1pcnJvcltrZXldO1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkob2JqLCBrZXkpICYmICEob2JqW2tleV0gPT09IHVuZGVmaW5lZCAmJiBvbGRWYWwgIT09IHVuZGVmaW5lZCAmJiBBcnJheS5pc0FycmF5KG9iaikgPT09IGZhbHNlKSkge1xuICAgICAgICAgICAgdmFyIG5ld1ZhbCA9IG9ialtrZXldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvbGRWYWwgPT0gXCJvYmplY3RcIiAmJiBvbGRWYWwgIT0gbnVsbCAmJiB0eXBlb2YgbmV3VmFsID09IFwib2JqZWN0XCIgJiYgbmV3VmFsICE9IG51bGwgJiYgQXJyYXkuaXNBcnJheShvbGRWYWwpID09PSBBcnJheS5pc0FycmF5KG5ld1ZhbCkpIHtcbiAgICAgICAgICAgICAgICBfZ2VuZXJhdGUob2xkVmFsLCBuZXdWYWwsIHBhdGNoZXMsIHBhdGggKyBcIi9cIiArIGVzY2FwZVBhdGhDb21wb25lbnQoa2V5KSwgaW52ZXJ0aWJsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAob2xkVmFsICE9PSBuZXdWYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnZlcnRpYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRjaGVzLnB1c2goeyBvcDogXCJ0ZXN0XCIsIHBhdGg6IHBhdGggKyBcIi9cIiArIGVzY2FwZVBhdGhDb21wb25lbnQoa2V5KSwgdmFsdWU6IF9kZWVwQ2xvbmUob2xkVmFsKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwYXRjaGVzLnB1c2goeyBvcDogXCJyZXBsYWNlXCIsIHBhdGg6IHBhdGggKyBcIi9cIiArIGVzY2FwZVBhdGhDb21wb25lbnQoa2V5KSwgdmFsdWU6IF9kZWVwQ2xvbmUobmV3VmFsKSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShtaXJyb3IpID09PSBBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgICAgIGlmIChpbnZlcnRpYmxlKSB7XG4gICAgICAgICAgICAgICAgcGF0Y2hlcy5wdXNoKHsgb3A6IFwidGVzdFwiLCBwYXRoOiBwYXRoICsgXCIvXCIgKyBlc2NhcGVQYXRoQ29tcG9uZW50KGtleSksIHZhbHVlOiBfZGVlcENsb25lKG9sZFZhbCkgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXRjaGVzLnB1c2goeyBvcDogXCJyZW1vdmVcIiwgcGF0aDogcGF0aCArIFwiL1wiICsgZXNjYXBlUGF0aENvbXBvbmVudChrZXkpIH0pO1xuICAgICAgICAgICAgZGVsZXRlZCA9IHRydWU7IC8vIHByb3BlcnR5IGhhcyBiZWVuIGRlbGV0ZWRcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpbnZlcnRpYmxlKSB7XG4gICAgICAgICAgICAgICAgcGF0Y2hlcy5wdXNoKHsgb3A6IFwidGVzdFwiLCBwYXRoOiBwYXRoLCB2YWx1ZTogbWlycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGF0Y2hlcy5wdXNoKHsgb3A6IFwicmVwbGFjZVwiLCBwYXRoOiBwYXRoLCB2YWx1ZTogb2JqIH0pO1xuICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFkZWxldGVkICYmIG5ld0tleXMubGVuZ3RoID09IG9sZEtleXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yICh2YXIgdCA9IDA7IHQgPCBuZXdLZXlzLmxlbmd0aDsgdCsrKSB7XG4gICAgICAgIHZhciBrZXkgPSBuZXdLZXlzW3RdO1xuICAgICAgICBpZiAoIWhhc093blByb3BlcnR5KG1pcnJvciwga2V5KSAmJiBvYmpba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBwYXRjaGVzLnB1c2goeyBvcDogXCJhZGRcIiwgcGF0aDogcGF0aCArIFwiL1wiICsgZXNjYXBlUGF0aENvbXBvbmVudChrZXkpLCB2YWx1ZTogX2RlZXBDbG9uZShvYmpba2V5XSkgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIENyZWF0ZSBhbiBhcnJheSBvZiBwYXRjaGVzIGZyb20gdGhlIGRpZmZlcmVuY2VzIGluIHR3byBvYmplY3RzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wYXJlKHRyZWUxLCB0cmVlMiwgaW52ZXJ0aWJsZSkge1xuICAgIGlmIChpbnZlcnRpYmxlID09PSB2b2lkIDApIHsgaW52ZXJ0aWJsZSA9IGZhbHNlOyB9XG4gICAgdmFyIHBhdGNoZXMgPSBbXTtcbiAgICBfZ2VuZXJhdGUodHJlZTEsIHRyZWUyLCBwYXRjaGVzLCAnJywgaW52ZXJ0aWJsZSk7XG4gICAgcmV0dXJuIHBhdGNoZXM7XG59XG4iLCAiZXhwb3J0ICogZnJvbSAnLi9tb2R1bGUvY29yZS5tanMnO1xuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGUvZHVwbGV4Lm1qcyc7XG5leHBvcnQge1xuICAgIFBhdGNoRXJyb3IgYXMgSnNvblBhdGNoRXJyb3IsXG4gICAgX2RlZXBDbG9uZSBhcyBkZWVwQ2xvbmUsXG4gICAgZXNjYXBlUGF0aENvbXBvbmVudCxcbiAgICB1bmVzY2FwZVBhdGhDb21wb25lbnRcbn0gZnJvbSAnLi9tb2R1bGUvaGVscGVycy5tanMnO1xuXG5cbi8qKlxuICogRGVmYXVsdCBleHBvcnQgZm9yIGJhY2t3YXJkcyBjb21wYXRcbiAqL1xuXG5pbXBvcnQgKiBhcyBjb3JlIGZyb20gJy4vbW9kdWxlL2NvcmUubWpzJztcbmltcG9ydCAqIGFzIGR1cGxleCBmcm9tICcuL21vZHVsZS9kdXBsZXgubWpzJztcbmltcG9ydCB7XG4gICAgUGF0Y2hFcnJvciBhcyBKc29uUGF0Y2hFcnJvcixcbiAgICBfZGVlcENsb25lIGFzIGRlZXBDbG9uZSxcbiAgICBlc2NhcGVQYXRoQ29tcG9uZW50LFxuICAgIHVuZXNjYXBlUGF0aENvbXBvbmVudFxufSBmcm9tICcuL21vZHVsZS9oZWxwZXJzLm1qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IE9iamVjdC5hc3NpZ24oe30sIGNvcmUsIGR1cGxleCwge1xuICAgIEpzb25QYXRjaEVycm9yLFxuICAgIGRlZXBDbG9uZSxcbiAgICBlc2NhcGVQYXRoQ29tcG9uZW50LFxuICAgIHVuZXNjYXBlUGF0aENvbXBvbmVudFxufSk7IiwgImltcG9ydCB7IGFwcGx5UGF0Y2gsIGNvbXBhcmUsIGRlZXBDbG9uZSwgZ2V0VmFsdWVCeVBvaW50ZXIsIE9wZXJhdGlvbiB9IGZyb20gXCJmYXN0LWpzb24tcGF0Y2hcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTdG9yZVN1YnNjcmliZXIge1xuICAgIChjdXI6IGFueSwgcHJldjogYW55KTogYW55XG59XG5jb25zdCBTVE9SRV9NVVRBVElPTlMgPSBTeW1ib2woJ1NUT1JFX01VVEFUSU9OUycpO1xuXG5leHBvcnQgY2xhc3MgU3RvcmU8VCBleHRlbmRzIE9iamVjdD4ge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfZGF0YTogVDtcbiAgICAvLyBwdWJsaWMgZGF0YTogUmVhZG9ubHk8VD47XG4gICAgcHJvdGVjdGVkIF9tdXRhdGlvblJlY29yZHM6IE9wZXJhdGlvbltdID0gW11cbiAgICBwcm90ZWN0ZWQgc3RvcmVkTWluVmVyc2lvbiA9IDA7IC8vIHRoZSB2ZXJzaW9uIG9mIHRoZSBkYXRhIHRoYXQgaGFzIGJlZW4gc2VudCB0byB0aGUgc2VydmVyXG4gICAgcHJvdGVjdGVkIF92ZXJzaW9uID0gMDsgLy8gdGhlIHZlcnNpb24gb2YgdGhlIGRhdGEgdGhhdCBoYXMgYmVlbiBtb2RpZmllZCBidXQgbm90IHNlbnQgdG8gdGhlIHNlcnZlclxuICAgIHB1YmxpYyBnZXQgdmVyc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZlcnNpb247XG4gICAgfVxuICAgIHB1YmxpYyBmbHVzaCgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbnM6IHRoaXMuX211dGF0aW9uUmVjb3Jkcy5zbGljZSgwKSxcbiAgICAgICAgICAgIGZyb21WZXJzaW9uOiB0aGlzLnN0b3JlZE1pblZlcnNpb24sXG4gICAgICAgICAgICB0b1ZlcnNpb246IHRoaXMudmVyc2lvblxuICAgICAgICB9XG4gICAgfSBcbiAgICBwdWJsaWMgZmx1c2hEb25lKHZlcnNpb246IG51bWJlcikge1xuICAgICAgICB0aGlzLl9tdXRhdGlvblJlY29yZHMgPSB0aGlzLl9tdXRhdGlvblJlY29yZHMuc2xpY2UodmVyc2lvbiAtIHRoaXMuc3RvcmVkTWluVmVyc2lvbik7XG4gICAgICAgIHRoaXMuc3RvcmVkTWluVmVyc2lvbiA9IHZlcnNpb247XG4gICAgfVxuICAgIHB1YmxpYyBwYXRjaFZlcnNpb25BY2NlcHRhYmxlKGZyb21WZXJzaW9uOiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZlcnNpb24gIT0gLTEgJiYgZnJvbVZlcnNpb24gPD0gdGhpcy5fdmVyc2lvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGF0Y2hEYXRhKG9wZXJhdGlvbnM6IE9wZXJhdGlvbltdKSB7XG4gICAgICAgIC8vIGlmICh0aGlzLnN0b3JlZE1pblZlcnNpb24gPCB0aGlzLl92ZXJzaW9uKSB7XG4gICAgICAgIC8vICAgICBvcGVyYXRpb25zID0gb3BlcmF0aW9ucy5zbGljZSh0aGlzLnN0b3JlZE1pblZlcnNpb24gLSB0aGlzLl92ZXJzaW9uKTtcbiAgICAgICAgLy8gfVxuICAgICAgICBjb25zdCBvcmlnaW5EYXRhID0gZGVlcENsb25lKHRoaXMuX2RhdGEpO1xuICAgICAgICBhcHBseVBhdGNoKHRoaXMuX2RhdGEsIG9wZXJhdGlvbnMpO1xuICAgICAgICB0aGlzLl92ZXJzaW9uICs9IG9wZXJhdGlvbnMubGVuZ3RoO1xuICAgICAgICB0aGlzLnN0b3JlZE1pblZlcnNpb24gPSB0aGlzLl92ZXJzaW9uO1xuICAgICAgICB0aGlzLmRpc3BhdGNoKG9wZXJhdGlvbnMsIG9yaWdpbkRhdGEpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGF0YSgpOiBUIHtcbiAgICAgICAgcmV0dXJuIGRlZXBDbG9uZSh0aGlzLl9kYXRhKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgW1NUT1JFX01VVEFUSU9OU106IHN0cmluZ1tdID0gW107XG4gICAgY29uc3RydWN0b3IoZGF0YTogVCkge1xuICAgICAgICB0aGlzLl9kYXRhID0gZGVlcENsb25lKGRhdGEpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzeW5jKGRhdGE6IFQsIHZlcnNpb246IG51bWJlcikge1xuICAgICAgICBjb25zdCBvcmlnaW5EYXRhID0gdGhpcy5fZGF0YTtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9ucyA9IGNvbXBhcmUob3JpZ2luRGF0YSwgZGF0YSk7XG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLl9kYXRhLCBkYXRhKTtcbiAgICAgICAgdGhpcy5zdG9yZWRNaW5WZXJzaW9uID0gdGhpcy5fdmVyc2lvbiA9IHZlcnNpb247XG5cbiAgICAgICAgdGhpcy5kaXNwYXRjaChvcGVyYXRpb25zLCBvcmlnaW5EYXRhKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc3Vic2NyaWJlcnM6IFtzdHJpbmcsIFN0b3JlU3Vic2NyaWJlcl1bXSA9IFtdO1xuICAgIHB1YmxpYyBzdWJzY3JpYmUocGF0aDogc3RyaW5nLCBjYWxsYmFjazogU3RvcmVTdWJzY3JpYmVyKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlcnMucHVzaChbcGF0aCwgY2FsbGJhY2tdKTtcbiAgICB9XG4gICAgcHVibGljIHVuc3Vic2NyaWJlKGNhbGxiYWNrOiBTdG9yZVN1YnNjcmliZXIpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVycyA9IHRoaXMuc3Vic2NyaWJlcnMuZmlsdGVyKChbcGF0aCwgY2JdKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gY2IgIT0gY2FsbGJhY2s7XG4gICAgICAgIH0pXG4gICAgfVxuICAgIHByb3RlY3RlZCBkaXNwYXRjaChvcGVyYXRpb25zOiBPcGVyYXRpb25bXSwgb3JpZ2luRGF0YTogYW55KSB7XG4gICAgICAgIC8vIFRyYWNrIGNoYW5nZWQgcGF0aHMgYW5kIHRoZWlyIG9yaWdpbmFsIHZhbHVlc1xuICAgICAgICBjb25zdCBjaGFuZ2VkUGF0aHMgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICAgICAgICBcbiAgICAgICAgLy8gUmVjb3JkIGFsbCBjaGFuZ2VzIGZpcnN0XG4gICAgICAgIG9wZXJhdGlvbnMuZm9yRWFjaChvcCA9PiB7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmliZXJzLmZvckVhY2goKFtwYXRoLCBfXSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChvcC5wYXRoLnN0YXJ0c1dpdGgocGF0aCkgJiYgIWNoYW5nZWRQYXRocy5oYXMocGF0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlZFBhdGhzLnNldChwYXRoLCBKU09OLnN0cmluZ2lmeShwYXRoID09PSBcIi9cIiA/IG9yaWdpbkRhdGEgOiBnZXRWYWx1ZUJ5UG9pbnRlcihvcmlnaW5EYXRhLCBwYXRoKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBUaGVuIHRyaWdnZXIgY2FsbGJhY2tzIGZvciBwYXRocyB0aGF0IGFjdHVhbGx5IGNoYW5nZWRcbiAgICAgICAgY2hhbmdlZFBhdGhzLmZvckVhY2goKG9yaWdpblZhbHVlSlNPTiwgcGF0aCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBwYXRoID09PSBcIi9cIiA/IHRoaXMuX2RhdGEgOiBnZXRWYWx1ZUJ5UG9pbnRlcih0aGlzLl9kYXRhLCBwYXRoKTtcbiAgICAgICAgICAgIC8vIE9ubHkgdHJpZ2dlciBpZiB2YWx1ZXMgYXJlIGRpZmZlcmVudFxuICAgICAgICAgICAgaWYgKG9yaWdpblZhbHVlSlNPTiAhPT0gSlNPTi5zdHJpbmdpZnkobmV3VmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVyc1xuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChbc3ViUGF0aCwgX10pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWJQYXRoID09PSBwYXRoXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKChbXywgY2FsbGJhY2tdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzID0ge31cbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gY2FsbGJhY2sobmV3VmFsdWUsIEpTT04ucGFyc2Uob3JpZ2luVmFsdWVKU09OIHx8IHt9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUuc3RhY2sgfHwgZS5tZXNzYWdlIHx8IGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuY2F0Y2goKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUuc3RhY2sgfHwgZS5tZXNzYWdlIHx8IGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIFN0b3JlTXV0YXRpb24odGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBzdHJpbmcsIG9yaWdpbmFsRGVzY3JpcHRvcjogYW55KSB7XG4gICAgaWYgKCF0YXJnZXQuY29uc3RydWN0b3JbU1RPUkVfTVVUQVRJT05TXSkge1xuICAgICAgICB0YXJnZXQuY29uc3RydWN0b3JbU1RPUkVfTVVUQVRJT05TXSA9IFtdO1xuICAgIH1cbiAgICB0YXJnZXQuY29uc3RydWN0b3JbU1RPUkVfTVVUQVRJT05TXS5wdXNoKHByb3BlcnR5S2V5KTtcbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogZnVuY3Rpb24odGhpczogU3RvcmU8YW55PiwgLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbkRhdGEgPSBkZWVwQ2xvbmUodGhpcy5fZGF0YSk7XG4gICAgICAgICAgICBvcmlnaW5hbERlc2NyaXB0b3IudmFsdWUuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgICAgICBjb25zdCBvcGVyYXRpb25zID0gY29tcGFyZShvcmlnaW5EYXRhLCB0aGlzLl9kYXRhKTtcbiAgICAgICAgICAgIGlmIChvcGVyYXRpb25zLmxlbmd0aCA9PSAwKSByZXR1cm47XG4gICAgICAgICAgICB0aGlzLl9tdXRhdGlvblJlY29yZHMucHVzaCguLi5vcGVyYXRpb25zKTtcbiAgICAgICAgICAgIHRoaXMuX3ZlcnNpb24gKz0gb3BlcmF0aW9ucy5sZW5ndGg7XG5cbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2gob3BlcmF0aW9ucywgb3JpZ2luRGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5pbnRlcmZhY2UgTWFpblN0b3JlRGF0YSB7ICAgXG4gICAgc2lkOiBzdHJpbmdcbiAgICBzc2lkOiBzdHJpbmdcbn1cbmV4cG9ydCBjbGFzcyBNYWluU3RvcmU8VCBleHRlbmRzIE9iamVjdD4gZXh0ZW5kcyBTdG9yZTxUICYgTWFpblN0b3JlRGF0YT4ge1xuICAgIGNvbnN0cnVjdG9yKGRhdGE6IFQpIHtcbiAgICAgICAgc3VwZXIoT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICBzaWQ6ICcnLFxuICAgICAgICAgICAgc3NpZDogJydcbiAgICAgICAgfSwgZGF0YSB8fCB7fSkpO1xuICAgIH1cblxuICAgIEBTdG9yZU11dGF0aW9uXG4gICAgc2V0U0lEKHNpZDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2RhdGEuc2lkID0gc2lkO1xuICAgICAgICB0aGlzLl9kYXRhLnNzaWQgPSBzaWQuc2xpY2UoMCwgNCk7XG4gICAgfVxufSIsICJpbXBvcnQgeyBNYWluU3RvcmUsIFN0b3JlTXV0YXRpb24gfSBmcm9tIFwiLi4vY29tbW9uL3N0b3JlL3N0b3JlLm10c1wiO1xuaW1wb3J0IHsgV2lkZ2V0VGFibGVTdHJ1Y3R1cmUsIFdpZGdldFRhYmxlVmFsdWUgfSBmcm9tIFwiLi4vdHlwZXMvc2RwcHBcIjtcblxuZXhwb3J0IGludGVyZmFjZSBQYWdlU3RvcmVEYXRhIHtcbiAgICB0aXRsZTogc3RyaW5nXG4gICAgd2Vidmlld0Zyb21TaWQ6IHN0cmluZyxcblxuICAgIHByb2dyZXNzOiBudW1iZXJcbiAgICBxdWV1ZVNpemU6IG51bWJlclxuICAgIGxhc3RFcnJvcjogc3RyaW5nXG4gICAgZXhlY3V0aW5nTm9kZVRpdGxlOiBzdHJpbmdcblxuICAgIHdpZGdldFRhYmxlU3RydWN0dXJlOiBXaWRnZXRUYWJsZVN0cnVjdHVyZVxuICAgIHdpZGdldFRhYmxlVmFsdWU6IFdpZGdldFRhYmxlVmFsdWVcbiAgICB3aWRnZXRUYWJsZUVycm9yczogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgICB1c2VTbGlkZXJGb3JOdW1iZXJXaWRnZXQ6IGJvb2xlYW5cbiAgICAvLyBsYXN0T3BlbmVkV29ya2Zsb3c6IHN0cmluZ1xuXG4gICAgaGFzUFNETm9kZXM6IGJvb2xlYW5cbiAgICBjb21meVVzZXJUb2tlbjogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBQYWdlU3RvcmUgZXh0ZW5kcyBNYWluU3RvcmU8UGFnZVN0b3JlRGF0YT4ge1xuXG4gICAgY29uc3RydWN0b3IoZGF0YT86IFBhZ2VTdG9yZURhdGEsIHZlcnNpb24/OiBudW1iZXIpIHtcbiAgICAgICAgc3VwZXIoZGF0YSB8fCB7XG4gICAgICAgICAgICB0aXRsZTogJycsXG4gICAgICAgICAgICB3ZWJ2aWV3RnJvbVNpZDogbG9jYXRpb24uc2VhcmNoLm1hdGNoKC93ZWJ2aWV3X2Zyb21zaWQ9KFteJl0rKS8pPy5bMV0gfHwgJycsXG5cbiAgICAgICAgICAgIHByb2dyZXNzOiAwLFxuICAgICAgICAgICAgbGFzdEVycm9yOiAnJyxcbiAgICAgICAgICAgIHF1ZXVlU2l6ZTogMCxcbiAgICAgICAgICAgIGV4ZWN1dGluZ05vZGVUaXRsZTogXCJcIixcblxuICAgICAgICAgICAgd2lkZ2V0VGFibGVTdHJ1Y3R1cmU6IHtcbiAgICAgICAgICAgICAgICB3aWRnZXRUYWJsZVBhdGg6ICcnLFxuICAgICAgICAgICAgICAgIHdpZGdldFRhYmxlUGVyc2lzdGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB3aWRnZXRUYWJsZUlEOiAnJyxcbiAgICAgICAgICAgICAgICBub2Rlczoge30sXG4gICAgICAgICAgICAgICAgZ3JvdXBzOiB7fSxcbiAgICAgICAgICAgICAgICBub2RlSW5kZXhlczogW10sXG4gICAgICAgICAgICAgICAgZXh0cmFPcHRpb25zOiB7fVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdpZGdldFRhYmxlVmFsdWU6IHt9LFxuICAgICAgICAgICAgd2lkZ2V0VGFibGVFcnJvcnM6IHt9LFxuICAgICAgICAgICAgdXNlU2xpZGVyRm9yTnVtYmVyV2lkZ2V0OiBmYWxzZSxcbiAgICAgICAgICAgIC8vIGxhc3RPcGVuZWRXb3JrZmxvdzogJycsXG5cbiAgICAgICAgICAgIGhhc1BTRE5vZGVzOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbWZ5VXNlclRva2VuOiAnJ1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fdmVyc2lvbiA9IHZlcnNpb24gfHwgMDtcbiAgICB9XG4gICAgQFN0b3JlTXV0YXRpb25cbiAgICBzZXRXZWJ2aWV3RnJvbVNpZCh3ZWJ2aWV3RnJvbVNpZDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2RhdGEud2Vidmlld0Zyb21TaWQgPSB3ZWJ2aWV3RnJvbVNpZDtcbiAgICB9XG4gICAgQFN0b3JlTXV0YXRpb25cbiAgICBzZXRUaXRsZSh0aXRsZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2RhdGEudGl0bGUgPSB0aXRsZTtcbiAgICB9XG4gICAgQFN0b3JlTXV0YXRpb25cbiAgICBzZXRQcm9ncmVzcyhwcm9ncmVzczogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX2RhdGEucHJvZ3Jlc3MgPSBwcm9ncmVzcztcbiAgICB9XG4gICAgQFN0b3JlTXV0YXRpb25cbiAgICBzZXRMYXN0RXJyb3IobGFzdEVycm9yOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fZGF0YS5sYXN0RXJyb3IgPSBsYXN0RXJyb3I7XG4gICAgfVxuICAgIEBTdG9yZU11dGF0aW9uXG4gICAgc2V0UXVldWVTaXplKHF1ZXVlU2l6ZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX2RhdGEucXVldWVTaXplID0gcXVldWVTaXplO1xuICAgIH1cbiAgICBAU3RvcmVNdXRhdGlvblxuICAgIHNldEV4ZWN1dGluZ05vZGVUaXRsZShleGVjdXRpbmdOb2RlVGl0bGU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9kYXRhLmV4ZWN1dGluZ05vZGVUaXRsZSA9IGV4ZWN1dGluZ05vZGVUaXRsZTtcbiAgICB9XG4gICAgQFN0b3JlTXV0YXRpb25cbiAgICBzZXRXaWRnZXRUYWJsZVN0cnVjdHVyZSh3aWRnZXRUYWJsZVN0cnVjdHVyZTogUGFnZVN0b3JlRGF0YVsnd2lkZ2V0VGFibGVTdHJ1Y3R1cmUnXSkge1xuICAgICAgICB0aGlzLl9kYXRhLndpZGdldFRhYmxlU3RydWN0dXJlID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh3aWRnZXRUYWJsZVN0cnVjdHVyZSkpO1xuICAgIH1cbiAgICBAU3RvcmVNdXRhdGlvblxuICAgIHNldFdpZGdldFRhYmxlVmFsdWUod2lkZ2V0VGFibGVWYWx1ZTogUGFnZVN0b3JlRGF0YVsnd2lkZ2V0VGFibGVWYWx1ZSddKSB7XG4gICAgICAgIHRoaXMuX2RhdGEud2lkZ2V0VGFibGVWYWx1ZSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkod2lkZ2V0VGFibGVWYWx1ZSkpO1xuICAgIH1cbiAgICBAU3RvcmVNdXRhdGlvblxuICAgIHNldFdpZGdldFRhYmxlRXJyb3JzKHdpZGdldFRhYmxlRXJyb3JzOiBQYWdlU3RvcmVEYXRhWyd3aWRnZXRUYWJsZUVycm9ycyddKSB7XG4gICAgICAgIHRoaXMuX2RhdGEud2lkZ2V0VGFibGVFcnJvcnMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHdpZGdldFRhYmxlRXJyb3JzKSk7XG4gICAgfVxuICAgIEBTdG9yZU11dGF0aW9uXG4gICAgc2V0SGFzUFNETm9kZXMoaGFzUFNETm9kZXM6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fZGF0YS5oYXNQU0ROb2RlcyA9IGhhc1BTRE5vZGVzO1xuICAgIH1cblxuICAgIEBTdG9yZU11dGF0aW9uXG4gICAgc2V0Q29tZnlVc2VyVG9rZW4oY29tZnlVc2VyVG9rZW46IHN0cmluZykge1xuICAgICAgICB0aGlzLl9kYXRhLmNvbWZ5VXNlclRva2VuID0gY29tZnlVc2VyVG9rZW47XG4gICAgfVxuXG4gICAgQFN0b3JlTXV0YXRpb25cbiAgICBzZXRVc2VTbGlkZXJGb3JOdW1iZXJXaWRnZXQodXNlU2xpZGVyRm9yTnVtYmVyV2lkZ2V0OiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2RhdGEudXNlU2xpZGVyRm9yTnVtYmVyV2lkZ2V0ID0gdXNlU2xpZGVyRm9yTnVtYmVyV2lkZ2V0O1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBNYWluU3RvcmUsIFN0b3JlTXV0YXRpb24gfSBmcm9tIFwiLi4vY29tbW9uL3N0b3JlL3N0b3JlLm10c1wiO1xuZXhwb3J0IHR5cGUgSWRlbnRpZnkgPSBuZXZlcjtcblxuZXhwb3J0IGludGVyZmFjZSBMYXllckRhdGEge1xuICAgIGlkOiBudW1iZXIsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGlkZW50aWZ5OiBJZGVudGlmeSxcbiAgICBsZXZlbDogbnVtYmVyLFxuICAgIGZ1bGxQYXRoOiBzdHJpbmcsXG4gICAgZGlydHlJRDogbnVtYmVyXG59XG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50RGF0YSB7XG4gICAgbmFtZTogc3RyaW5nXG4gICAgaWQ6IG51bWJlclxuICAgIGlkZW50aWZ5OiBJZGVudGlmeVxuICAgIGxheWVyczogTGF5ZXJEYXRhW11cbiAgICBjYW52YXNEaXJ0eUlEOiBudW1iZXJcbiAgICBzZWxlY3Rpb25EaXJ0eUlEOiBudW1iZXJcbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIFBob3Rvc2hvcERhdGFEb2N1bWVudCB7XG4gICAgW2lkOiBudW1iZXJdOiBEb2N1bWVudERhdGFcbn1cbmV4cG9ydCBpbnRlcmZhY2UgUGhvdG9zaG9wU3RvcmVEYXRhIHtcbiAgICB1bmFtZTogc3RyaW5nIC8vIHJhbmRvbSBzdHJpbmcgaW5zdGFuY2UgbmFtZVxuICAgIGNvbWZ5VXNlclRva2VuOiBzdHJpbmdcbiAgICBpc0xvY2FsOiBib29sZWFuXG5cbiAgICBhY3RpdmVEb2N1bWVudElEOiBudW1iZXIgIC8vIGFjdGl2ZSBkb2N1bWVudCBuYW1lXG4gICAgZG9jdW1lbnRzOiBQaG90b3Nob3BEYXRhRG9jdW1lbnRcblxuICAgIGNhbnZhc1N0YXRlSUQ6IG51bWJlciAgLy8gbGFzdCBQUyBoaXN0b3J5IHN0YXRlIGlkIHRoYXQgdHJpZ2dlcmVkIGltYWdlIGNoYW5nZVxuICAgIHNlbGVjdGlvblN0YXRlSUQ6IHN0cmluZyAgLy8gbGFzdCBQUyBoaXN0b3J5IHN0YXRlIGlkIHRoYXQgdHJpZ2dlcmVkIHNlbGVjdGlvbiBjaGFuZ2VcbiAgICBoaXN0b3J5U3RhdGVJRDogbnVtYmVyICAvLyBsYXN0IFBTIGhpc3Rvcnkgc3RhdGUgaWRcbn1cblxuZXhwb3J0IGNsYXNzIFBob3Rvc2hvcFN0b3JlIGV4dGVuZHMgTWFpblN0b3JlPFBob3Rvc2hvcFN0b3JlRGF0YT4ge1xuXG4gICAgY29uc3RydWN0b3IoZGF0YT86IFBob3Rvc2hvcFN0b3JlRGF0YSwgdmVyc2lvbj86IG51bWJlcikge1xuICAgICAgICBzdXBlcihkYXRhIHx8IHtcbiAgICAgICAgICAgIHVuYW1lOiAnJyxcbiAgICAgICAgICAgIGNvbWZ5VXNlclRva2VuOiAnJyxcbiAgICAgICAgICAgIGlzTG9jYWw6IGZhbHNlLFxuXG4gICAgICAgICAgICBhY3RpdmVEb2N1bWVudElEOiAwLFxuICAgICAgICAgICAgZG9jdW1lbnRzOiB7fSxcblxuICAgICAgICAgICAgY2FudmFzU3RhdGVJRDogMCxcbiAgICAgICAgICAgIHNlbGVjdGlvblN0YXRlSUQ6ICcnLFxuICAgICAgICAgICAgaGlzdG9yeVN0YXRlSUQ6IDAsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl92ZXJzaW9uID0gdmVyc2lvbiB8fCAwO1xuICAgIH1cblxuICAgIEBTdG9yZU11dGF0aW9uXG4gICAgc2V0SXNMb2NhbChpc0xvY2FsOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2RhdGEuaXNMb2NhbCA9IGlzTG9jYWw7XG4gICAgfVxuXG4gICAgQFN0b3JlTXV0YXRpb25cbiAgICBzZXRVTmFtZSh1aWQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9kYXRhLnVuYW1lID0gJ1BTXycgKyB1aWQ7XG4gICAgfVxuXG4gICAgQFN0b3JlTXV0YXRpb25cbiAgICBzZXREb2N1bWVudChhY3RpdmVEb2N1bWVudElEOiBudW1iZXIsIGRvY3VtZW50czogUGhvdG9zaG9wRGF0YURvY3VtZW50KSB7XG4gICAgICAgIHRoaXMuX2RhdGEuYWN0aXZlRG9jdW1lbnRJRCA9IGFjdGl2ZURvY3VtZW50SUQ7XG4gICAgICAgIHRoaXMuX2RhdGEuZG9jdW1lbnRzID0gZG9jdW1lbnRzO1xuICAgIH1cblxuICAgIEBTdG9yZU11dGF0aW9uXG4gICAgc2V0Q2FudmFzU3RhdGVJRChoaXN0b3J5U3RhdGVJRDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX2RhdGEuY2FudmFzU3RhdGVJRCA9IGhpc3RvcnlTdGF0ZUlEO1xuICAgIH1cbiAgICBAU3RvcmVNdXRhdGlvblxuICAgIHNldFNlbGVjdGlvblN0YXRlSUQoc2VsZWN0aW9uU3RhdGU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9kYXRhLnNlbGVjdGlvblN0YXRlSUQgPSBzZWxlY3Rpb25TdGF0ZTtcbiAgICB9XG4gICAgQFN0b3JlTXV0YXRpb25cbiAgICBzZXRIaXN0b3J5U3RhdGVJRChoaXN0b3J5U3RhdGVJRDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX2RhdGEuaGlzdG9yeVN0YXRlSUQgPSBoaXN0b3J5U3RhdGVJRDtcbiAgICB9XG4gICAgQFN0b3JlTXV0YXRpb25cbiAgICBzZXRDb21meVVzZXJUb2tlbihjb21meVVzZXJUb2tlbjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2RhdGEuY29tZnlVc2VyVG9rZW4gPSBjb21meVVzZXJUb2tlbjtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgU3RvcmVTdWJzY3JpYmVyIH0gZnJvbSBcIi4vc3RvcmUubWpzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmVNYXBTdWJzY3JpYmVyIHtcbiAgICAoa2V5OiBzdHJpbmcsIGN1cjogYW55LCBwcmV2OiBhbnkpOiBhbnlcbn07XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTdG9yZU1hcDxVPiB7XG4gICAgcHJvdGVjdGVkIHN0b3JlTWFwOiBNYXA8c3RyaW5nLCBVPiA9IG5ldyBNYXA8c3RyaW5nLCBVPigpO1xuXG4gICAgYWJzdHJhY3QgY3JlYXRlU3RvcmUoZGF0YTogYW55LCB2ZXJzaW9uOiBudW1iZXIpOiBVO1xuXG4gICAgcHVibGljIHN0b3JlQ291bnQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmVNYXAuc2l6ZTtcbiAgICB9XG4gICAgcHVibGljIGdldFN0b3JlKGtleTogc3RyaW5nKTogVSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlTWFwLmdldChrZXkpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0QWxsU3RvcmUoKTogUmVjb3JkPHN0cmluZywgVT4ge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKHRoaXMuc3RvcmVNYXAuZW50cmllcygpKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc3Vic2NyaWJlcnM6IFtzdHJpbmcsIFN0b3JlTWFwU3Vic2NyaWJlcl1bXSA9IFtdO1xuICAgIHByb3RlY3RlZCBzdWJzY3JpYmVyc1dpdGhvdXRLZXk6IFdlYWtNYXA8U3RvcmVNYXBTdWJzY3JpYmVyLCB7IFtrZXk6IHN0cmluZ106IFN0b3JlU3Vic2NyaWJlciB9PiA9IG5ldyBXZWFrTWFwKCk7XG4gICAgcHVibGljIHN1YnNjcmliZShwYXRoOiBzdHJpbmcsIGNhbGxiYWNrOiBTdG9yZU1hcFN1YnNjcmliZXIpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVycy5wdXNoKFtwYXRoLCBjYWxsYmFja10pO1xuICAgICAgICBjb25zdCBzdWJzY3JpYmVyc1dpdGhvdXRLZXk6IHsgW2tleTogc3RyaW5nXTogU3RvcmVTdWJzY3JpYmVyIH0gPSB7fTtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVyc1dpdGhvdXRLZXkuc2V0KGNhbGxiYWNrLCBzdWJzY3JpYmVyc1dpdGhvdXRLZXkpO1xuICAgICAgICB0aGlzLnN0b3JlTWFwLmZvckVhY2goKHN0b3JlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIHN1YnNjcmliZXJzV2l0aG91dEtleVtrZXldID0gY2FsbGJhY2suYmluZCh0aGlzLCBrZXkpO1xuICAgICAgICAgICAgKHN0b3JlIGFzIGFueSkuc3Vic2NyaWJlKHBhdGgsIHN1YnNjcmliZXJzV2l0aG91dEtleVtrZXldKTtcbiAgICAgICAgfSlcbiAgICB9XG4gICAgcHVibGljIHVuc3Vic2NyaWJlKGNhbGxiYWNrOiBTdG9yZU1hcFN1YnNjcmliZXIpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVycyA9IHRoaXMuc3Vic2NyaWJlcnMuZmlsdGVyKChbcGF0aCwgY2JdKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gY2IgIT0gY2FsbGJhY2s7XG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IHN1YnNjcmliZXJzV2l0aG91dEtleSA9IHRoaXMuc3Vic2NyaWJlcnNXaXRob3V0S2V5LmdldChjYWxsYmFjayk7XG4gICAgICAgIGlmICghc3Vic2NyaWJlcnNXaXRob3V0S2V5KSByZXR1cm47XG4gICAgICAgIHRoaXMuc3RvcmVNYXAuZm9yRWFjaCgoc3RvcmUsIGtleSkgPT4ge1xuICAgICAgICAgICAgKHN0b3JlIGFzIGFueSkudW5zdWJzY3JpYmUoc3Vic2NyaWJlcnNXaXRob3V0S2V5W2tleV0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkU3RvcmUoa2V5OiBzdHJpbmcsIGRhdGE6IGFueSwgdmVyc2lvbjogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0b3JlID0gdGhpcy5jcmVhdGVTdG9yZShkYXRhLCB2ZXJzaW9uKVxuICAgICAgICB0aGlzLnN0b3JlTWFwLnNldChrZXksIHN0b3JlKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVycy5mb3JFYWNoKChbcGF0aCwgY2FsbGJhY2tdKSA9PiB7XG4gICAgICAgICAgICBsZXQgc3Vic2NyaWJlcnNXaXRob3V0S2V5ID0gdGhpcy5zdWJzY3JpYmVyc1dpdGhvdXRLZXkuZ2V0KGNhbGxiYWNrKTtcbiAgICAgICAgICAgIGlmICghc3Vic2NyaWJlcnNXaXRob3V0S2V5KSB7XG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlcnNXaXRob3V0S2V5ID0ge307XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVyc1dpdGhvdXRLZXkuc2V0KGNhbGxiYWNrLCBzdWJzY3JpYmVyc1dpdGhvdXRLZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3Vic2NyaWJlcnNXaXRob3V0S2V5W2tleV0gPSBjYWxsYmFjay5iaW5kKHRoaXMsIGtleSk7XG4gICAgICAgICAgICAoc3RvcmUgYXMgYW55KS5zdWJzY3JpYmUocGF0aCwgc3Vic2NyaWJlcnNXaXRob3V0S2V5W2tleV0pO1xuXG4gICAgICAgICAgICBpZiAocGF0aCA9PSBcIi9cIikgY2FsbGJhY2soa2V5LCBkYXRhLCBudWxsKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHB1YmxpYyByZW1vdmVTdG9yZShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb25zdCBzdG9yZSA9IHRoaXMuc3RvcmVNYXAuZ2V0KGtleSk7XG4gICAgICAgIGlmICghc3RvcmUpIHJldHVybjtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVycy5mb3JFYWNoKChbcGF0aCwgY2FsbGJhY2tdKSA9PiB7XG4gICAgICAgICAgICBsZXQgc3Vic2NyaWJlcnNXaXRob3V0S2V5ID0gdGhpcy5zdWJzY3JpYmVyc1dpdGhvdXRLZXkuZ2V0KGNhbGxiYWNrKTtcbiAgICAgICAgICAgIGlmICghc3Vic2NyaWJlcnNXaXRob3V0S2V5KSByZXR1cm47XG4gICAgICAgICAgICAoc3RvcmUgYXMgYW55KS51bnN1YnNjcmliZShzdWJzY3JpYmVyc1dpdGhvdXRLZXlba2V5XSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChwYXRoID09IFwiL1wiKSBjYWxsYmFjayhrZXksIG51bGwsIChzdG9yZSBhcyBhbnkpLmRhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zdG9yZU1hcC5kZWxldGUoa2V5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3luYyhwYXlsb2FkOiBzdHJpbmdbXSB8IHsgW2tleTogc3RyaW5nXTogeyBkYXRhOiBhbnksIHZlcnNpb246IG51bWJlciB9IH0pOiB2b2lkIHtcbiAgICAgICAgaWYgKHBheWxvYWQgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEtleXMgPSBBcnJheS5mcm9tKHRoaXMuc3RvcmVNYXAua2V5cygpKTtcbiAgICAgICAgICAgIGNvbnN0IGFkZEtleXMgPSBwYXlsb2FkLmZpbHRlcihrZXkgPT4gIWN1cnJlbnRLZXlzLmluY2x1ZGVzKGtleSkpO1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlS2V5cyA9IGN1cnJlbnRLZXlzLmZpbHRlcihrZXkgPT4gIXBheWxvYWQuaW5jbHVkZXMoa2V5KSk7XG4gICAgICAgICAgICBhZGRLZXlzLmZvckVhY2goa2V5ID0+IHRoaXMuYWRkU3RvcmUoa2V5LCB7fSwgMCkpO1xuICAgICAgICAgICAgcmVtb3ZlS2V5cy5mb3JFYWNoKGtleSA9PiB0aGlzLnJlbW92ZVN0b3JlKGtleSkpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCByZW1vdmVLZXlzID0gQXJyYXkuZnJvbSh0aGlzLnN0b3JlTWFwLmtleXMoKSkuZmlsdGVyKGtleSA9PiAhT2JqZWN0LmtleXMocGF5bG9hZCkuaW5jbHVkZXMoa2V5KSk7XG4gICAgICAgICAgICByZW1vdmVLZXlzLmZvckVhY2goa2V5ID0+IHRoaXMucmVtb3ZlU3RvcmUoa2V5KSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBwYXlsb2FkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhLCB2ZXJzaW9uIH0gPSBwYXlsb2FkW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RvcmVNYXAuaGFzKGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JlTWFwLmdldChrZXkpPy5zeW5jKGRhdGEsIHZlcnNpb24pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkU3RvcmUoa2V5LCBkYXRhLCB2ZXJzaW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgIH1cbn1cbiIsICJcbmNvbnN0IGFwcCA9ICh3aW5kb3cgYXMgYW55KS5jb21meUFQSS5hcHAuYXBwO1xuY29uc3QgJGVsID0gKHdpbmRvdyBhcyBhbnkpLmNvbWZ5QVBJLnVpLiRlbDtcbmNvbnN0IGFwaSA9ICh3aW5kb3cgYXMgYW55KS5jb21meUFQSS5hcGkuYXBpO1xuXG5leHBvcnQge1xuICAgIGFwcCwgJGVsLCBhcGlcbn0iLCAiaW1wb3J0IHsgUGFnZVN0b3JlIH0gZnJvbSBcIi4uLy4uL3NyYy9zdG9yZS9wYWdlLm10c1wiO1xuaW1wb3J0IHsgUGhvdG9zaG9wRGF0YURvY3VtZW50LCBQaG90b3Nob3BTdG9yZSB9IGZyb20gXCIuLi8uLi9zcmMvc3RvcmUvcGhvdG9zaG9wLm10c1wiO1xuaW1wb3J0IHsgU3RvcmVNYXAgfSBmcm9tIFwiLi4vLi4vc3JjL2NvbW1vbi9zdG9yZS9zdG9yZS1tYXAubXRzXCI7XG5pbXBvcnQgeyBhcGkgfSBmcm9tIFwiLi9zcmMvY29tZnktZ2xvYmFscy5tdHNcIjtcblxuY2xhc3MgUGFnZVBob3Rvc2hvcFN0b3JlTWFwIGV4dGVuZHMgU3RvcmVNYXA8UGhvdG9zaG9wU3RvcmU+IHtcbiAgICBjcmVhdGVTdG9yZShkYXRhOiBhbnksIHZlcnNpb246IG51bWJlcik6IFBob3Rvc2hvcFN0b3JlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQaG90b3Nob3BTdG9yZShkYXRhLCB2ZXJzaW9uKTtcbiAgICB9XG5cbiAgICBnZXRTdG9yZUJ5TmFtZShpbnN0YW5jZU5hbWU6IHN0cmluZyk6IFBob3Rvc2hvcFN0b3JlIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgZm9yIChjb25zdCBzdG9yZSBvZiB0aGlzLnN0b3JlTWFwLnZhbHVlcygpKSB7XG4gICAgICAgICAgICBpZiAoc3RvcmUuZGF0YS51bmFtZSA9PT0gaW5zdGFuY2VOYW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0QWxsUGhvdG9zaG9wRG9jdW1lbnREYXRhKCkge1xuICAgICAgICBjb25zdCByZXQ6IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IHtcbiAgICAgICAgICAgICAgICBzaWQ6IHN0cmluZyxcbiAgICAgICAgICAgICAgICBhY3RpdmVEb2N1bWVudElEOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgZG9jdW1lbnRzOiBQaG90b3Nob3BEYXRhRG9jdW1lbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSA9IHt9XG4gICAgICAgIHRoaXMuc3RvcmVNYXAuZm9yRWFjaCgoc3RvcmUpID0+IHtcbiAgICAgICAgICAgIHJldFtzdG9yZS5kYXRhLnVuYW1lXSA9IHtcbiAgICAgICAgICAgICAgICBzaWQ6IHN0b3JlLmRhdGEuc2lkLFxuICAgICAgICAgICAgICAgIGFjdGl2ZURvY3VtZW50SUQ6IHN0b3JlLmRhdGEuYWN0aXZlRG9jdW1lbnRJRCxcbiAgICAgICAgICAgICAgICBkb2N1bWVudHM6IHN0b3JlLmRhdGEuZG9jdW1lbnRzXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBwYWdlUGhvdG9zaG9wU3RvcmVNYXAgPSBuZXcgUGFnZVBob3Rvc2hvcFN0b3JlTWFwKCk7XG5leHBvcnQgY29uc3QgcGFnZVN0b3JlID0gbmV3IFBhZ2VTdG9yZSgpO1xuXG4vLyBpbiB3ZWJ2aWV3XG5pZiAoKHdpbmRvdyBhcyBhbnkpLnV4cEhvc3QpIHtcbiAgICBjb25zdCBjYWxsYmFjayA9IChlOiBNZXNzYWdlRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGUuZGF0YS5hY3Rpb24gIT09IFwid2Vidmlldy1jb25uZWN0XCIgfHwgIWUuZGF0YS5wYXlsb2FkLndlYnZpZXdGcm9tU2lkKSByZXR1cm4gY29uc29sZS5sb2coZSk7XG4gICAgICAgIGUuZGF0YS5wYXlsb2FkLndlYnZpZXdGcm9tU2lkID0gZS5kYXRhLnBheWxvYWQud2Vidmlld0Zyb21TaWQ7XG4gICAgICAgIHBhZ2VTdG9yZS5zZXRXZWJ2aWV3RnJvbVNpZChlLmRhdGEucGF5bG9hZC53ZWJ2aWV3RnJvbVNpZCk7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgY2FsbGJhY2spO1xuICAgIH1cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGNhbGxiYWNrKTtcbiAgICAod2luZG93IGFzIGFueSkudXhwSG9zdC5wb3N0TWVzc2FnZSh7XG4gICAgICAgIGZyb206ICdzZHBwcC13ZWJ2aWV3JyxcbiAgICAgICAgYWN0aW9uOiBcIndlYnZpZXctY29ubmVjdFwiLFxuICAgIH0sICcqJylcbn1cbmZ1bmN0aW9uIHJlZnJlc2hUaXRsZSgpIHtcbiAgICBpZiAoZG9jdW1lbnQudGl0bGUgIT09IHBhZ2VTdG9yZS5kYXRhLnRpdGxlKSB7XG4gICAgICAgIHBhZ2VTdG9yZS5zZXRUaXRsZShkb2N1bWVudC50aXRsZSk7XG4gICAgfVxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShyZWZyZXNoVGl0bGUpO1xufVxucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHJlZnJlc2hUaXRsZSlcblxubGV0IG1vZGVsSW5pdGVkID0gZmFsc2U7XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2FpdE1vZGVsSW5pdGVkKCkge1xuICAgIGlmIChtb2RlbEluaXRlZCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGFwaS51c2VyICYmIHBhZ2VTdG9yZS5zZXRDb21meVVzZXJUb2tlbihhcGkudXNlcik7XG4gICAgY29uc3QgdXNlU2xpZGVyRm9yTnVtYmVyV2lkZ2V0ID0gYXdhaXQgYXBpLmdldFNldHRpbmcoJ3NkcHBwLnVzZVNsaWRlckZvck51bWJlcldpZGdldCcpXG4gICAgaWYgKHVzZVNsaWRlckZvck51bWJlcldpZGdldCkge1xuICAgICAgICBwYWdlU3RvcmUuc2V0VXNlU2xpZGVyRm9yTnVtYmVyV2lkZ2V0KHVzZVNsaWRlckZvck51bWJlcldpZGdldClcbiAgICB9XG4gICAgbW9kZWxJbml0ZWQgPSB0cnVlO1xufSIsICJleHBvcnQgZGVmYXVsdCB7XG4gICAgJ1NEUFBQIEdldCBEb2N1bWVudCc6ICdTRFBQUCBHZXQgRG9jdW1lbnQnLFxuICAgICdTRFBQUCBHZXQgTGF5ZXIgQnkgSUQnOiAnU0RQUFAgR2V0IExheWVyJyxcbiAgICAnU0RQUFAgR2V0IExpbmtlZCBMYXllcnMnOiAnU0RQUFAgR2V0IExpbmtlZCBMYXllcnMnLFxuICAgICdTRFBQUCBHZXQgTGF5ZXJzIEluIEdyb3VwJzogJ1NEUFBQIEdldCBMYXllcnMgSW4gR3JvdXAnLFxuICAgICdTRFBQUCBHZXQgVGV4dCBGcm9tIExheWVyJzogJ1NEUFBQIEdldCBUZXh0IEZyb20gTGF5ZXInLFxuICAgICdTRFBQUCBQYXJzZSBMYXllciBJbmZvJzogJ1NEUFBQIFBhcnNlIExheWVyIEluZm8nLFxuICAgICdTRFBQUCBHZXQgU2VsZWN0aW9uJzogJ1NEUFBQIEdldCBTZWxlY3Rpb24nLCBcbiAgICAnU0RQUFAgR2V0IEltYWdlIEZyb20gUGhvdG9zaG9wJzogJ1NEUFBQIEdldCBJbWFnZSBGcm9tIFBob3Rvc2hvcCcsXG4gICAgJ1NEUFBQIFNlbmQgSW1hZ2VzIFRvIFBob3Rvc2hvcCc6ICdTRFBQUCBTZW5kIEltYWdlcyBUbyBQaG90b3Nob3AnLFxuICAgICdTRFBQUCBTZXR0aW5ncyc6ICdTRFBQUCBTZXR0aW5ncy9NaXNjJyxcbn0iLCAiZXhwb3J0IGRlZmF1bHQge1xuICAgIC8vIHNwZWljaWFsIGRvY3VtZW50LyBsYXllclxuICAgICcjIyMgQWN0aXZlIERvY3VtZW50ICMjIyc6ICcjIyMgXHU1RjUzXHU1MjREXHU2NTg3XHU2ODYzICMjIycsXG4gICAgJyMjIyBUaGUgQ2FudmFzICMjIyc6ICcjIyMgXHU2NTc0XHU0RTJBXHU3NTNCXHU1RTAzICMjIycsXG4gICAgJyMjIyBOZXcgTGF5ZXIgIyMjJzogJyMjIyBcdTY1QjBcdTU2RkVcdTVDNDIgIyMjJyxcbiAgICAnIyMjIFNlbGVjdGVkIExheWVyICMjIyc6ICcjIyMgXHU2MjQwXHU5MDA5XHU1NkZFXHU1QzQyICMjIycsXG4gICAgJyMjIyBLZWVwIFNpemUgb3IgRml0IENhbnZhcyAjIyMnOiAnIyMjIFx1NEZERFx1NjMwMVx1NUMzQVx1NUJGOFx1NjIxNlx1OTAwMlx1NUU5NFx1NzUzQlx1NUUwMyAjIyMnLFxuICAgICdfU0RQUFBfUFNEXyc6ICdfU0RQUFBfUFNEXycsXG5cbiAgICAvLyBBMTExMSBVSVxuICAgICdTYXZlIGFuZCBydW4gaW1tZWRpYXRlbHknOiAnXHU0RkREXHU1QjU4XHU1RTc2XHU3QUNCXHU1MzczXHU2MjY3XHU4ODRDJyxcbiAgICAnQ2xvc2UnOiAnXHU1MTczXHU5NUVEJyxcbiAgICAnU2VsZWN0IGEgezB9JzogYFx1OTAwOVx1NjJFOVx1NEUwMFx1NEUyQSB7MH1gLFxuXG4gICAgLy8gY29tZnl1aSBkaWFsb2dcbiAgICAnSG93IHRvIHVzZSAuY2N4IGZpbGUnOiAnXHU1OTgyXHU0RjU1XHU0RjdGXHU3NTI4IC5jY3ggXHU2NTg3XHU0RUY2JyxcbiAgICAnMS4gSWYgeW91IGhhdmUgaW5zdGFsbGVkIEFkb2JlIENyZWF0aXZlIENsb3VkJzogJzEuIFx1NTk4Mlx1Njc5Q1x1NEY2MFx1NURGMlx1N0VDRlx1NUI4OVx1ODhDNVx1NEU4NiBBZG9iZSBDcmVhdGl2ZSBDbG91ZCcsIFxuICAgICdKdXN0IGRvdWJsZSBjbGljayB0aGUgLmNjeCBmaWxlLCBpdCB3aWxsIGluc3RhbGwgdGhlIHBsdWdpbiBhdXRvbWF0aWNhbGx5JzogJ1x1NTNDQ1x1NTFGQiAuY2N4IFx1NjU4N1x1NEVGNlx1RkYwQ1x1NUI4M1x1NEYxQVx1ODFFQVx1NTJBOFx1NUI4OVx1ODhDNScsXG4gICAgXCIyLiBJZiB5b3UgZG9uJ3QgaGF2ZSBBZG9iZSBDcmVhdGl2ZSBDbG91ZFwiOiAnMi4gXHU1OTgyXHU2NzlDXHU0RjYwXHU2Q0ExXHU2NzA5IEFkb2JlIENyZWF0aXZlIENsb3VkJyxcbiAgICAnUmVuYW1lIC5jY3ggdG8gLnppcCBhbmQgZXh0cmFjdCBpdCBpbnRvICc6ICdcdTVDMDYgLmNjeCBcdTkxQ0RcdTU0N0RcdTU0MERcdTRFM0EgLnppcCBcdTVFNzZcdTg5RTNcdTUzOEJcdTUyMzAnLFxuICAgICdvcic6ICdcdTYyMTYnLFxuICAgICdQaG90b3Nob3AgZGlyZWN0b3J5JzogJ1Bob3Rvc2hvcCBcdTVCODlcdTg4QzVcdTc2RUVcdTVGNTUnLFxuXG4gICAgLy8gY29tZnl1aSBlcnJvclxuICAgICdDYW5ub3QgY29ubmVjdCBtdWx0aXBsZSBkaWZmZXJlbnQgZG9jdW1lbnQgd2lkZ2V0cyB3aXRoIHNhbWUgdmFsdWUnOiAnXHU0RTBEXHU4MEZEXHU4RkRFXHU2M0E1XHU1OTFBXHU0RTJBXHU1MTc3XHU2NzA5XHU3NkY4XHU1NDBDXHU1MDNDXHU3Njg0XHU2NTg3XHU2ODYzXHU1QzBGXHU5MEU4XHU0RUY2JyxcbiAgICAnWW91IGNhbiBvbmx5IGhhdmUgb25lIFNEUFBQIFNldHRpbmdzIG5vZGUgaW4gYSB3b3JrZmxvdyc6ICdcdTRFMDBcdTRFMkFcdTVERTVcdTRGNUNcdTZENDFcdTRFMkRcdTUzRUFcdTgwRkRcdTY3MDlcdTRFMDBcdTRFMkEgU0RQUFAgU2V0dGluZ3MgXHU4MjgyXHU3MEI5JyxcbiAgICAnY29udmVydCB3aWRnZXQgezB9IGZhaWxlZDonOiAnXHU2M0E3XHU0RUY2ezB9XHU4RjZDXHU2MzYyXHU1OTMxXHU4RDI1XHVGRjFBJyxcbiAgICAnaGlkZGVuIHdlYnZpZXcgbG9hZCBmYWlsZWQ6IHswfSwgcGxlYXNlIHNlbGVjdCBhIGJyb3dzZXIgcGFnZSB0byBjb250aW51ZSc6ICdcdTUxODVcdTdGNkUgd2VidmlldyBcdTUyQTBcdThGN0RcdTU5MzFcdThEMjU6IHswfVx1RkYwQ1x1OEJGN1x1OTAwOVx1NjJFOVx1NEUwMFx1NEUyQVx1NkQ0Rlx1ODlDOFx1NTY2OFx1OTg3NVx1OTc2Mlx1N0VFN1x1N0VFRCcsXG4gICAgXG4gICAgLy8gY29tZnkgbm9kZSB0aXRsZVxuICAgICdTRFBQUCBHZXQgRG9jdW1lbnQnOiAnU0RQUFBcdTgzQjdcdTUzRDZcdTY1ODdcdTY4NjMoR2V0RG9jdW1lbnQpJyxcbiAgICAnU0RQUFAgR2V0IExheWVyIEJ5IElEJzogJ1NEUFBQXHU4M0I3XHU1M0Q2XHU1NkZFXHU1QzQyKEdldExheWVyKScsXG4gICAgJ1NEUFBQIEdldCBMaW5rZWQgTGF5ZXJzJzogJ1NEUFBQXHU4M0I3XHU1M0Q2XHU5NEZFXHU2M0E1XHU1NkZFXHU1QzQyKEdldExpbmtlZExheWVycyknLFxuICAgICdTRFBQUCBHZXQgTGF5ZXJzIEluIEdyb3VwJzogJ1NEUFBQXHU4M0I3XHU1M0Q2XHU3RUM0XHU0RTJEXHU1NkZFXHU1QzQyKEdldExheWVyc0luR3JvdXApJyxcbiAgICAnU0RQUFAgR2V0IFRleHQgRnJvbSBMYXllcic6ICdTRFBQUFx1ODNCN1x1NTNENlx1NTZGRVx1NUM0Mlx1NjU4N1x1NjcyQyhHZXRUZXh0RnJvbUxheWVyKScsXG4gICAgJ1NEUFBQIFBhcnNlIExheWVyIEluZm8nOiAnU0RQUFBcdTg5RTNcdTY3OTBcdTU2RkVcdTVDNDJcdTRGRTFcdTYwNkYoUGFyc2VMYXllckluZm8pJyxcbiAgICAnU0RQUFAgR2V0IFNlbGVjdGlvbic6ICdTRFBQUFx1ODNCN1x1NTNENlx1OTAwOVx1NTMzQShHZXRTZWxlY3Rpb24pJywgXG4gICAgJ1NEUFBQIEdldCBJbWFnZSBGcm9tIFBob3Rvc2hvcCc6ICdTRFBQUFx1NEVDRVBTXHU4M0I3XHU1M0Q2XHU1NkZFXHU1MENGKEdldEltYWdlRnJvbVBob3Rvc2hvcCknLFxuICAgICdTRFBQUCBTZW5kIEltYWdlcyBUbyBQaG90b3Nob3AnOiAnU0RQUFBcdTUzRDFcdTkwMDFcdTU2RkVcdTUwQ0ZcdTUyMzBQUyhTZW5kSW1hZ2VzVG9QaG90b3Nob3ApJyxcbiAgICAnU0RQUFAgU2VuZCBUZXh0IFRvIExheWVyJzogJ1NEUFBQXHU1M0QxXHU5MDAxXHU2NTg3XHU2NzJDXHU1MjMwXHU1NkZFXHU1QzQyKFNlbmRUZXh0VG9MYXllciknLFxuICAgICdTRFBQUCBSdW4gUGhvdG9zaG9wIEFjdGlvbic6ICdTRFBQUFx1OEZEMFx1ODg0Q1BTIEFjdGlvbihSdW5QaG90b3Nob3BBY3Rpb24pJyxcblxuLy8gY29tZnkgd2lkZ2V0L2lucHV0XG4gICAgJ2Rvd25sb2FkIFBTIHBsdWdpbiAoLmNjeCknOiAnXHU0RTBCXHU4RjdEIFBob3Rvc2hvcCBcdTYzRDJcdTRFRjYgKC5jY3gpJyxcbiAgICAnY3VycmVudCBDb21meVVJIHBhZ2VpZDogezB9JzogJ1x1NUY1M1x1NTI0RCBDb21meVVJIFx1OTg3NVx1OTc2MklEOiB7MH0nLFxuICAgICdjdXJyZW50IEExMTExIHBhZ2VpZDogezB9JzogJ1x1NUY1M1x1NTI0RCBBMTExMSBcdTk4NzVcdTk3NjJJRDogezB9JyxcbiAgICAnZG9jdW1lbnQgbGlua2VkJzogJ1x1NjU4N1x1Njg2M1x1NTNDMlx1NjU3MFx1NURGMlx1OTRGRVx1NjNBNScsXG4gICAgJ2xheWVyIGxpbmtlZCc6ICdcdTU2RkVcdTVDNDJcdTUzQzJcdTY1NzBcdTVERjJcdTk0RkVcdTYzQTUnLFxuICAgICdib3VuZCBsaW5rZWQnOiAnXHU4MzAzXHU1NkY0XHU1M0MyXHU2NTcwXHU1REYyXHU5NEZFXHU2M0E1JyxcbiAgICAnZG9jdW1lbnQnOiAnXHU2NTg3XHU2ODYzJywgXG4gICAgJ0RvY3VtZW50JzogJ1x1NjU4N1x1Njg2MycsIFxuICAgICdET0NVTUVOVCc6ICdcdTY1ODdcdTY4NjMnLCBcbiAgICAnZG9jdW1lbnRfbmFtZSc6ICdcdTY1ODdcdTY4NjNcdTU0MERcdTVCNTdpZCcsXG4gICAgJ2xheWVyX25hbWVpZCc6ICdcdTU2RkVcdTVDNDJcdTU0MERcdTVCNTdpZCcsXG4gICAgJ2xheWVyX25hbWUnOiAnXHU1NkZFXHU1QzQyXHU1NDBEXHU1QjU3JyxcbiAgICAnbGF5ZXJfaW5mbyc6ICdcdTU2RkVcdTVDNDJcdTRGRTFcdTYwNkYnLFxuICAgICdib3VuZF90b3AnOiAnXHU4MzAzXHU1NkY0XHU0RTBBXHU4RkI5XHU4REREJyxcbiAgICAnYm91bmRfbGVmdCc6ICdcdTgzMDNcdTU2RjRcdTVERTZcdThGQjlcdThEREQnLFxuICAgICdib3VuZF93aWR0aCc6ICdcdTgzMDNcdTU2RjRcdTVCQkRcdTVFQTYnLFxuICAgICdib3VuZF9oZWlnaHQnOiAnXHU4MzAzXHU1NkY0XHU5QUQ4XHU1RUE2JyxcbiAgICAnY2VudGVyX3gnOiAnXHU0RTJEXHU1RkMzXHU3MEI5eCcsXG4gICAgJ2NlbnRlcl95JzogJ1x1NEUyRFx1NUZDM1x1NzBCOXknLFxuICAgICdvcGFjaXR5JzogJ1x1OTAwRlx1NjYwRVx1NUVBNicsXG4gICAgJ2xheWVyJzogJ1x1NTZGRVx1NUM0MicsXG4gICAgJ2xheWVyX29yX2dyb3VwJzogJ1x1NTZGRVx1NUM0MihcdTYyMTZcdTdFQzQpJyxcbiAgICAnTGF5ZXJfb3JfZ3JvdXAnOiAnXHU1NkZFXHU1QzQyKFx1NjIxNlx1N0VDNCknLFxuICAgICdib3VuZCc6ICdcdTgzMDNcdTU2RjQnLFxuICAgICdib3VuZHMnOiAnXHU4MzAzXHU1NkY0JyxcbiAgICAnYm91bmRzIFtvcHRpb25hbF0nOiAnXHU4MzAzXHU1NkY0W1x1NTNFRlx1OTAwOV0nLFxuICAgICdib3VuZGFyeSc6ICdcdTgzMDNcdTU2RjQnLFxuICAgICdCb3VuZGFyeSc6ICdcdTgzMDNcdTU2RjQnLFxuICAgICdjYW52YXNfYm91bmRhcnknOiAnXHU3NTNCXHU1RTAzXHU4MzAzXHU1NkY0JyxcbiAgICAnY2FudmFzX2JvdW5kJzogJ1x1NzUzQlx1NUUwM1x1ODMwM1x1NTZGNCcsXG4gICAgJ2xheWVyX2JvdW5kYXJ5JzogJ1x1NTZGRVx1NUM0Mlx1ODMwM1x1NTZGNCcsXG4gICAgJ2xheWVyX2JvdW5kJzogJ1x1NTZGRVx1NUM0Mlx1ODMwM1x1NTZGNCcsXG4gICAgXCJQaG90b3Nob3AgRGlzY29ubmVjdGVkIVwiIDogXCJQaG90b3Nob3AgXHU2NzJBXHU4RkRFXHU2M0E1XHVGRjAxXCIsXG4gICAgJ3JnYl9vdXQnOiAnUkdCXHU4RjkzXHU1MUZBJyxcbiAgICAnYWxwaGFfb3V0JzogJ0FscGhhXHU4RjkzXHU1MUZBJyxcbiAgICAnaW1hZ2VzJzogJ1x1NTZGRVx1NTBDRicsXG4gICAgJ3RleHQnOiAnXHU2NTg3XHU2NzJDJyxcbiAgICAnSURfbW9kZSc6ICdcdTdDQkVcdTc4NkVJRFx1NkEyMVx1NUYwRicsXG4gICAgJ25hbWVfbW9kZSc6ICdcdTU0MERcdTVCNTdcdTUzMzlcdTkxNERcdTZBMjFcdTVGMEYnLFxuICAgICdzZWxlY3QnOiAnXHU5MDA5XHU2MkU5JyxcbiAgICAnZG9jdW1lbnQgYm91bmRhcnknOiAnXHU2NTg3XHU2ODYzXHU4MzAzXHU1NkY0JyxcbiAgICAnbGF5ZXIgYm91bmRhcnknOiAnXHU1NkZFXHU1QzQyXHU4MzAzXHU1NkY0JyxcbiAgICAnc2VsZWN0aW9uIGJvdW5kYXJ5JzogJ1x1OTAwOVx1NEUyRFx1ODMwM1x1NTZGNCcsXG4gICAgJ3NhdmUgLnBzZCB0byB0aGlzIHdvcmtmbG93JzogJ1x1NEZERFx1NUI1OC5wc2RcdTUyMzBcdThGRDlcdTRFMkFcdTVERTVcdTRGNUNcdTZENDEnLFxuICAgICdleHRyYWN0IHNhdmVkIC5wc2QgdG8gUGhvdG9zaG9wJzogJ1x1NjNEMFx1NTNENlx1NEZERFx1NUI1OFx1NzY4NC5wc2RcdTUyMzBQaG90b3Nob3AnLFxuICAgICdzYW1wbGUgLnBzZCc6ICdcdTc5M0FcdTRGOEIucHNkJyxcbiAgICAnbWFzayc6ICdcdTkwNkVcdTdGNjknLFxuICAgICduYW1lJzogJ1x1NTQwRFx1NzlGMCcsXG4gICAgJ3F1YWxpdHknOiAnXHU1NkZFXHU1MENGXHU4RDI4XHU5MUNGJyxcbiAgICBcbiAgICAvLyBwaG90b3Nob3AgVUlcbiAgICAndGltZW91dCc6ICdcdThEODVcdTY1RjYnLFxuICAgICctLW11bHRpLXVzZXIgYWN0aXZhdGVkLCBOb3QgTG9naW4hJzogJy0tbXVsdGktdXNlclx1NURGMlx1NkZDMFx1NkQzQlx1RkYwQ1x1NEY0Nlx1NjcyQVx1NzY3Qlx1NUY1NVx1RkYwMScsXG4gICAgJ0xvZ291dCc6ICdcdTc2N0JcdTUxRkEnLFxuICAgICdVc2VyOiAnOiAnXHU3NTI4XHU2MjM3OiAnLFxuICAgICdjb25uZWN0JzogJ1x1OEZERVx1NjNBNScsXG4gICAgJ2Nvbm5lY3RlZCc6ICdcdTVERjJcdThGREVcdTYzQTUnLFxuICAgICdkaXNjb25uZWN0JzogJ1x1NjVBRFx1NUYwMCcsXG4gICAgJ2Rpc2Nvbm5lY3RlZCc6ICdcdTVERjJcdTY1QURcdTVGMDBcdThGREVcdTYzQTUnLFxuICAgICdyZWNvbm5lY3RpbmcuLi4nOiAnXHU5MUNEXHU4RkRFXHU0RTJELi4uJywgIFxuICAgICdjb25uZWN0aW5nJzogJ1x1OEZERVx1NjNBNVx1NEUyRCcsICBcbiAgICAnd2VicGFnZXMnOiAnXHU3RjUxXHU5ODc1XHU1MjE3XHU4ODY4JyxcbiAgICAnd29ya2Zsb3dzJzogJ1x1NURFNVx1NEY1Q1x1NkQ0MScsXG4gICAgJ3dvcmtmbG93JzogJ1x1NURFNVx1NEY1Q1x1NkQ0MScsXG4gICAgJ2F1dG8gcnVuIHBhZ2UgW3swfV0gYWZ0ZXIgY2hhbmdlLi4nOiAnXHU2NkY0XHU2NTM5XHU1NDBFXHU4MUVBXHU1MkE4XHU4RkQwXHU4ODRDXHU5ODc1XHU5NzYyIHswfS4uJyxcbiAgICAnYXV0byBydW4gd29ya2Zsb3cgW3swfV0gYWZ0ZXIgY2hhbmdlLi4nOiAnXHU2NkY0XHU2NTM5XHU1NDBFXHU4MUVBXHU1MkE4XHU4RkQwXHU4ODRDXHU1REU1XHU0RjVDXHU2RDQxIHswfS4uJyxcbiAgICAnYXV0byBydW4gd29ya2Zsb3cgYWZ0ZXIgY2hhbmdlLi4nOiAnXHU2NkY0XHU2NTM5XHU1NDBFXHU4MUVBXHU1MkE4XHU4RkQwXHU4ODRDXHU1REU1XHU0RjVDXHU2RDQxLi4nLFxuICAgICdzZWxlY3Rpb25fb25seSc6ICdcdTRFQzVcdTkwMDlcdTUzM0EnLFxuICAgICdRdWV1ZTonOiAnXHU5NjFGXHU1MjE3OicsXG4gICAgJ1NldCBBczonOiAnXHU4QkJFXHU3RjZFXHU0RTNBOicsXG4gICAgJ0Vycm9yIHswfS4uLiBwbGVhc2UgY29udGFjdCBtZSB2aWEgRGlzY29yZC9HaXRodWInOiAnXHU1MUZBXHU3M0IwXHU5NTE5XHU4QkVGIHswfS4uLlx1RkYwQ1x1OEJGN1x1OTAxQVx1OEZDNyBRUS9HaXRodWIgXHU4MDU0XHU3Q0ZCXHU2MjExJyxcbiAgICAnV2VidmlldyBpbml0aWFsaXplIGZhaWxlZC4gUGxlYXNlIHJlcG9ydCB0byBtZSB2aWEgRGlzY29yZC9HaXRodWIgd2l0aCB5b3VyIENvbWZ5VVJMLCBPcGVyYXRlIFN5c3RlbSc6ICdXZWJ2aWV3IFx1NTIxRFx1NTlDQlx1NTMxNlx1NTkzMVx1OEQyNVx1RkYwQ1x1OEJGN1x1OTAxQVx1OEZDNyBRUS9HaXRodWIgXHU4MDU0XHU3Q0ZCXHU2MjExXHU1RTc2XHU5NjQ0XHU0RTBBXHU0RjYwXHU3Njg0Q29tZnlcdTU3MzBcdTU3NDBcdTMwMDFcdTY0Q0RcdTRGNUNcdTdDRkJcdTdFREYnLFxuICAgICdXb3JrZmxvdyBMaXN0IG9mIENvbWZ5VUkgd2l0aCAtLW11bHRpLXVzZXIgaXMgb25seSBhdmFpbGFibGUgZm9yIHNwb25zb3JzJzogJ1x1NUUyNlwiLS1tdWx0aS11c2VyXCJcdTc2ODRDb21meVVJXHU0RUM1XHU1QkY5XHU4RDVFXHU1MkE5XHU4MDA1XHU1RjAwXHU2NTNFJyxcbiAgICAnV29ya2Zsb3cgQWdlbnQgaXMgbG9hZGluZy4uLic6ICdcdThGRDBcdTg4NENcdThGN0RcdTRGNTNcdTVDMUFcdTU3MjhcdTUyQTBcdThGN0QuLi4nLFxuICAgICcoUGFnZSBJRDogezB9KVF1ZXVlOiB7MX0nOiAnKFx1OTg3NVx1OTc2MklEOiB7MH0pIFx1OTYxRlx1NTIxN1x1OTU3Rlx1NUVBNiB7MX0nLFxuICAgICdubyBzdWl0YWJsZSBub2RlIHRvIGNvbnRyb2wgaW4gdGhpcyB3b3JrZmxvdyc6ICdcdThGRDlcdTRFMkFcdTVERTVcdTRGNUNcdTZENDFcdTRFMkRcdTZDQTFcdTY3MDlcdTgwRkRcdTYzQTdcdTUyMzZcdTc2ODRcdTgyODJcdTcwQjknLFxuICAgIFwiU2F2ZVwiOiBcIlx1NEZERFx1NUI1OFwiLFxuICAgIFwiRWRpdFwiOiBcIlx1N0YxNlx1OEY5MVwiLFxuICAgIFwiRWRpdCBpbiBDb21meVVJXCI6IFwiXHU1NzI4IENvbWZ5VUkgXHU0RTJEXHU3RjE2XHU4RjkxXCIsXG4gICAgXCJ1c2luZyBicm93c2VyIHBhZ2UgW3swfV0gZm9yIHdvcmtmbG93IHJ1bm5pbmdcIjogJ1x1NkI2M1x1NjNBNVx1N0JBMVx1N0Y1MVx1OTg3NSBbezB9XSBcdThGRDBcdTg4NENcdTVERTVcdTRGNUNcdTZENDEnLFxuICAgICd3b3JrZmxvdyBydW5uaW5nIGJ5IGhpZGRlbiB3ZWJ2aWV3JzogJ1x1NURFNVx1NEY1Q1x1NkQ0MVx1NTcyOFx1OTY5MFx1ODVDRlx1NzY4NHdlYnZpZXdcdTRFMkRcdThGRDBcdTg4NEMnLFxuICAgICdMb2NrIEltYWdlJzogJ1x1OTUwMVx1NUI5QVx1NTZGRVx1NTBDRicsXG4gICAgJ1VubG9jayBJbWFnZSc6ICdcdTg5RTNcdTk1MDFcdTU2RkVcdTUwQ0YnLFxuICAgICdzZWFyY2guLi4nOiAnXHU2NDFDXHU3RDIyLi4uJyxcbiAgICAnZGlzYWJsZWQgd2hlbiBydW5uaW5nIGluIGJyb3dzZXIgcGFnZSc6ICdcdTYzQTVcdTdCQTFcdTdGNTFcdTk4NzVcdTY1RjZcdTRFMERcdTUzRUZcdTc1MjgnLFxuICAgICdvbmx5IHN1cHBvcnRlZCBpbiBQaG90b3Nob3AnOiAnXHU0RUM1XHU1NzI4IFBob3Rvc2hvcCBcdTRFMkRcdTY1MkZcdTYzMDEnLFxuICAgICdMb2dpbic6ICdcdTc2N0JcdTVGNTUnLFxuICAgICdJbnZpdGF0aW9uIENvZGUnOiAnXHU5MDgwXHU4QkY3XHU3ODAxJyxcbiAgICAnVXNlcm5hbWUnOiAnXHU3NTI4XHU2MjM3XHU1NDBEJyxcbiAgICAnUGFzc3dvcmQnOiAnXHU1QkM2XHU3ODAxJyxcbiAgICAnUGxlYXNlIGlucHV0IGludml0YXRpb24gY29kZSc6ICdcdThCRjdcdThGOTNcdTUxNjVcdTkwODBcdThCRjdcdTc4MDEnLFxuICAgICdQbGVhc2UgaW5wdXQgdXNlcm5hbWUnOiAnXHU4QkY3XHU4RjkzXHU1MTY1XHU3NTI4XHU2MjM3XHU1NDBEJyxcbiAgICAnUGxlYXNlIGlucHV0IHBhc3N3b3JkJzogJ1x1OEJGN1x1OEY5M1x1NTE2NVx1NUJDNlx1NzgwMScsXG5cbiAgICAvLyBwaG90b3Nob3AgY29ubmVjdCBlcnJvclxuICAgICc1MDI6IE1heWJlIHRoZSBzZXJ2ZXIgaXMgbm90IHJ1bm5pbmcnOiAnNTAyOiBcdTY3MERcdTUyQTFcdTU2NjhcdTUzRUZcdTgwRkRcdTY3MkFcdThGRDBcdTg4NEMnLFxuICAgICc0MDQ6IE1heWJlIFNEUFBQIGlzIG5vdCBpbnN0YWxsZWQgb3IgZmFpbGVkIHRvIHJ1biBpbiBDb21meVVJJzogJzQwNDogXHU1M0VGXHU4MEZEXHU1NzI4Q29tZnlVSVx1NEUyRFNEUFBQXHU2NzJBXHU1Qjg5XHU4OEM1XHU2MjE2XHU4RkQwXHU4ODRDXHU1OTMxXHU4RDI1JyxcbiAgICAnezB9LiByZWNvbm5lY3RpbmcuLi4nOiAnezB9LiBcdTkxQ0RcdThGREVcdTRFMkQuLi4nLFxuICAgICdkaXNjb25uZWN0ZWQgdG8gezB9IGZhaWxlZCB7MX0nOiBgXHU2NUFEXHU1RjAwXHU4RkRFXHU2M0E1IHswfSBcdTk1MTlcdThCRUYgezF9YCxcbiAgICAndmVyc2lvbiBtaXNtYXRjaCwgcGxlYXNlIHJlaW5zdGFsbCBQUyBwbHVnaW4nOiAnXHU3MjQ4XHU2NzJDXHU0RTBEXHU1MzM5XHU5MTREXHVGRjBDXHU4QkY3XHU5MUNEXHU2NUIwXHU1Qjg5XHU4OEM1IFBTIFx1NjNEMlx1NEVGNicsXG4gICAgJ2luc3RhbmNlIHR5cGUgbm90IHJlY29nbml6ZWQnOiAnXHU2NzJBXHU4QkM2XHU1MjJCXHU3Njg0XHU4RjZGXHU0RUY2XHU3QzdCXHU1NzhCJyxcbiAgICAnRXJyb3I6IHswfSc6ICdcdTk1MTlcdThCRUY6IHswfScsXG4gICAgJ1ZlcmlmaWNhdGlvbiBFcnJvcic6ICdcdTlBOENcdThCQzFcdTk1MTlcdThCRUYnLFxuXG4gICAgLy8gcGhvdG9zaG9wIGV2ZW50IGVycm9yXG4gICAgJ2RvY3VtZW50IHswfSBub3QgZm91bmQnOiAnXHU2MjdFXHU0RTBEXHU1MjMwXHU2NTg3XHU2ODYzOiB7MH0nLFxuICAgICdvbmx5IGxheWVyIGtpbmQgXCJURVhUXCIgaXMgc3VwcG9ydGVkLCBpbnZhbGlkIGxheWVyOiB7MH0nOiAnXHU0RTBEXHU2NTJGXHU2MzAxXHU5NzVFXHU2NTg3XHU2NzJDXHU1NkZFXHU1QzQyOiB7MH0nLFxuICAgICdjcmVhdGUgbGF5ZXIgZmFpbGVkJzogJ1x1NTIxQlx1NUVGQVx1NTZGRVx1NUM0Mlx1NTkzMVx1OEQyNScsXG4gICAgJ2xheWVyIG5vdCBmb3VuZCB7MH0nOiAnXHU2MjdFXHU0RTBEXHU1MjMwXHU1NkZFXHU1QzQyOiB7MH0nLFxuICAgICdubyBsaW5rZWQgbGF5ZXIgZm9yIHswfSc6ICdcdTZDQTFcdTY3MDlcdTk0RkVcdTYzQTVcdTU2RkVcdTVDNDI6IHswfScsXG4gICAgJ2xheWVyIHswfSBpcyBub3QgYSBncm91cCc6ICdcdTU2RkVcdTVDNDIgezB9IFx1NEUwRFx1NjYyRlx1NEUwMFx1NEUyQVx1N0VDNCcsXG4gICAgJ25vIGxheWVyIGluIGdyb3VwIHswfSc6ICdcdTdFQzQgezB9IFx1NEUyRFx1NkNBMVx1NjcwOVx1NTZGRVx1NUM0MicsXG4gICAgJ2xheWVyIG5vdCBmb3VuZDogezB9JzogJ1x1NjI3RVx1NEUwRFx1NTIzMFx1NTZGRVx1NUM0MjogezB9JyxcbiAgICAnTm8gdXBsb2FkX25hbWUnOiAnXHU0RTBBXHU0RjIwXHU2M0E1XHU1M0UzXHU4RkQ0XHU1NkRFXHU0RTg2XHU1OTMxXHU4RDI1JyxcbiAgICAnZ2V0IHBpeGVsIG9mIHswfSBmYWlsZWQnOiAnXHU4M0I3XHU1M0Q2XHU1MENGXHU3RDIwXHU1OTMxXHU4RDI1OiB7MH0nLFxuICAgICdtZXJnZSBncm91cCBmYWlsZWQnOiAnXHU1NDA4XHU1RTc2XHU3RUM0XHU1OTMxXHU4RDI1JyxcbiAgICAnaW52YWxpZCBuYW1lOiB7MH0nOiAnXHU5NzVFXHU2Q0Q1XHU3Njg0XHU1NDBEXHU3OUYwOiB7MH0nLFxuICAgICdnZXRfbGF5ZXJfaW5mbzogbGF5ZXJfaWRlbnRpZnkgcmVxdWlyZWQnOiAnZ2V0X2xheWVyX2luZm86IFx1OTcwMFx1ODk4MSBsYXllcl9pZGVudGlmeScsXG4gICAgJ2ludmFsaWQgYWN0aW9uOiB7MH0nOiAnXHU2NUUwXHU2NTQ4XHU3Njg0XHU2NENEXHU0RjVDOiB7MH0nLFxuICAgICdjcmVhdGUgZG9jdW1lbnQgZmFpbGVkJzogJ1x1NTIxQlx1NUVGQVx1NjU4N1x1Njg2M1x1NTkzMVx1OEQyNScsXG4gICAgJ2NyZWF0ZSBkb2N1bWVudCBmb3IgcHJldmlldyc6ICdcdTUyMUJcdTVFRkFcdTk4ODRcdTg5QzhcdTY1ODdcdTY4NjMnLFxuICAgICdyZXNpemUgZG9jdW1lbnQgZm9yIHByZXZpZXcnOiAnXHU4QzAzXHU2NTc0XHU5ODg0XHU4OUM4XHU2NTg3XHU2ODYzXHU1QzNBXHU1QkY4JyxcbiAgICAnbm8gZmlyc3QgcmVsYXRlZCBsYXllciBpbiB7MH0nOiAnXHU3RUM0IHswfSBcdTRFMkRcdTZDQTFcdTY3MDlcdTdCMkNcdTRFMDBcdTRFMkFcdTc2RjhcdTUxNzNcdTU2RkVcdTVDNDInLFxuICAgIFwiaW1hZ2VEYXRhRXJyb3I6IGRhdGEgbGVuZ3RoIGlzIG5vdCBtdWx0aXBsZSBvZiB3aWR0aCAqIGhlaWdodFwiOiBcIlx1NTZGRVx1NTBDRlx1NjU3MFx1NjM2RVx1NjcwOVx1OEJFRjogXHU2NTcwXHU2MzZFXHU5NTdGXHU1RUE2XHU0RTBEXHU2NjJGXHU1QkJEXHU1RUE2ICogXHU5QUQ4XHU1RUE2XHU3Njg0XHU1MDBEXHU2NTcwXCIsXG4gICAgXCJpbWFnZURhdGFFcnJvcjogb3JpZ2luQ29tcG9uZW50cyBtdXN0IGJlIDEgb3IgM1wiOiBcIlx1NTZGRVx1NTBDRlx1NjU3MFx1NjM2RVx1NjcwOVx1OEJFRjogb3JpZ2luQ29tcG9uZW50cyBcdTVGQzVcdTk4N0JcdTY2MkYgMSBcdTYyMTYgM1wiLFxuICAgICd1bmV4cGVjdGVkIGNvbm5lY3Rpb24gbG9zdCwgcGxlYXNlIHRyeSB0byByZWNvbm5lY3QnOiAnXHU2MTBGXHU1OTE2XHU2NUFEXHU1RjAwXHU4RkRFXHU2M0E1XHVGRjBDXHU4QkY3XHU1QzFEXHU4QkQ1XHU5MUNEXHU2NUIwXHU4RkRFXHU2M0E1JyxcbiAgICBcIldvcmtmbG93IGxpc3QgaXMgZW1wdHksIHBsZWFzZSBzYXZlIGEgd29ya2Zsb3cgYnkgQ29tZnkncyBsYXN0ZXN0IFVJXCI6ICdcdTVERTVcdTRGNUNcdTZENDFcdTUyMTdcdTg4NjhcdTRFM0FcdTdBN0FcdUZGMENcdThCRjdcdTU3MjhDb21meVx1NzY4NFx1NjVCMFx1NzI0OFVJXHU0RTJEXHU0RkREXHU1QjU4XHU0RTAwXHU0RTJBXHU1REU1XHU0RjVDXHU2RDQxJyxcbiAgICAnTm8gb3BlbmVkIENvbWZ5VUkgcGFnZXMnOiAnXHU2Q0ExXHU2NzA5XHU1REYyXHU2MjUzXHU1RjAwXHU3Njg0Q29tZnlVSVx1OTg3NVx1OTc2MicsXG4gICAgJ2NvbWZ5QVBJIGlzIG5vdCBpbml0aWFsaXplZCwgbWF5YmUgY29tZnlVSSBpcyB0b28gb2xkJzogJ1x1NjVFMFx1NkNENVx1ODNCN1x1NTNENiBDb21meUFQSVx1RkYwQ1x1NTNFRlx1ODBGRCBDb21meVVJIFx1NzI0OFx1NjcyQ1x1NTkyQVx1NjVFNycsXG4gICAgJ3Vuc3VwcG9ydGVkIGNoYW5uZWwgY291bnRzOiB7MH0nOiAnXHU0RTBEXHU2NTJGXHU2MzAxXHU3Njg0XHU5MDFBXHU5MDUzXHU2NTcwOiB7MH0nLFxuICAgICdUaW1lb3V0LCBNYXliZSB0aGUgVVJMIGlzIHdyb25nJzogJ1x1OEQ4NVx1NjVGNlx1RkYwQ1x1NTNFRlx1ODBGRCBjb21meVx1NTczMFx1NTc0MCBcdTU4NkJcdTUxOTlcdTk1MTlcdThCRUYnLFxuICAgICdXb3JrZmxvdyBsaXN0IGxvYWRpbmcgZmFpbGVkOiB7MH0nOiAnXHU1REU1XHU0RjVDXHU2RDQxXHU1MjE3XHU4ODY4XHU1MkEwXHU4RjdEXHU1OTMxXHU4RDI1OiB7MH0nLFxuICAgICdQbGVhc2UgcmVnaXN0ZXIgYSB1c2VyIGluIENvbWZ5VUknOiAnXHU4QkY3XHU1NzI4IENvbWZ5VUkgXHU0RTJEXHU2Q0U4XHU1MThDXHU0RTAwXHU0RTJBXHU3NTI4XHU2MjM3JyxcbiAgICAnR2V0U2VsZWN0aW9uIG5lZWQgUGhvdG9zaG9wIHZlcnNpb24gMjUrJzogJ0dldFNlbGVjdGlvbiBcdTk3MDBcdTg5ODEgUGhvdG9zaG9wIDI1KyBcdTcyNDhcdTY3MkMnLFxuICAgICdBY3Rpb24gezB9IG5vdCBmb3VuZCc6ICdBY3Rpb24gezB9IFx1NjcyQVx1NjI3RVx1NTIzMCcsXG4gICAgJ0FjdGlvbiBzZXQgezB9IG5vdCBmb3VuZCc6ICdBY3Rpb25TZXQgezB9IFx1NjcyQVx1NjI3RVx1NTIzMCcsXG5cbiAgICAvLyBwaG90b3Nob3AgbW9kYWwgc3RhdGVcbiAgICAnY3JlYXRlIGRvY3VtZW50IGZvciBzZW50IGltYWdlcyc6ICdcdTdFRDlcdTUzRDFcdTkwMDFcdTc2ODRcdTU2RkVcdTcyNDdcdTUyMUJcdTVFRkFcdTY1ODdcdTY4NjMnLFxuICAgICdzaG93IHNlbnQgaW1hZ2VzJzogJ1x1NjYzRVx1NzkzQVx1NTNEMVx1OTAwMVx1NzY4NFx1NTZGRVx1NzI0NycsXG4gICAgJ2ZhbGxiYWNrIHNob3cgc2VudCBpbWFnZXMnOiAnXHU1M0Q2XHU2RDg4XHU2NjNFXHU3OTNBXHU1M0QxXHU5MDAxXHU3Njg0XHU1NkZFXHU3MjQ3JyxcbiAgICBcImdldCBjb250ZW50IG9mIGxheWVyIHswfVwiOiBcIlx1ODNCN1x1NTNENlx1NTZGRVx1NUM0MiB7MH0gXHU3Njg0XHU1MTg1XHU1QkI5XCIsXG4gICAgJ2ZhbGxiYWNrIGdldCBjb250ZW50IG9mIGxheWVyIHswfSc6ICdcdTUzRDZcdTZEODhcdTgzQjdcdTUzRDZcdTU2RkVcdTVDNDIgezB9IFx1NzY4NFx1NTE4NVx1NUJCOScsXG4gICAgJ2dldCBsYXllciBpbmZvJzogJ1x1ODNCN1x1NTNENlx1NTZGRVx1NUM0Mlx1NEZFMVx1NjA2RicsXG4gICAgJ3NkcHBwIGV4dHJhY3QgUFNEJzogJ3NkcHBwIFx1NUJGQ1x1NTE2NSBQU0QnLFxuICAgICdzZHBwcCBnZXQgUFNEJzogJ3NkcHBwIFx1ODNCN1x1NTNENiBQU0QnLCBcbiAgICAnc2V0IHRleHQgdG8gbGF5ZXInOiAnXHU4QkJFXHU3RjZFXHU1NkZFXHU1QzQyXHU3Njg0XHU2NTg3XHU2NzJDJyxcbiAgICAncnVuIFBob3Rvc2hvcCBBY3Rpb24nOiAnc2RwcHAgXHU4RkQwXHU4ODRDIFBob3Rvc2hvcCBBY3Rpb24nLFxuICAgICdzZWxlY3QgbGF5ZXInOiAnc2RwcHAgXHU5MDA5XHU0RTJEXHU1NkZFXHU1QzQyJyxcbiAgICBcbiAgICAvLyBwaG90b3Nob3AgZGlhbG9nL3dpZGdldFxuICAgICd7MH0gd2FudHMgdG8gZXh0cmFjdCBhIFBTRCBmaWxlIHRvIFBob3Rvc2hvcCwgYXJlIHlvdSBzdXJlPyc6ICd7MH0gXHU2MEYzXHU4OTgxXHU5MUNBXHU2NTNFXHU0RTAwXHU0RTJBLnBzZFx1NjU4N1x1NEVGNlx1NTIzMFBob3Rvc2hvcFx1RkYwQ1x1Nzg2RVx1NUI5QVx1NTQxN1x1RkYxRicsXG4gICAgJ3Nob3VsZCBzZHBwcCByZWZ1c2UgZXh0cmFjdGluZyBQU0QgdG8gUGhvdG9zaG9wIGluIHRoaXMgc2Vzc2lvbiBhbnltb3JlPyc6ICdcdTY2MkZcdTU0MjZcdTg5ODFcdThCQTkgc2RwcHAgXHU2MkQyXHU3RUREXHU2NzJDXHU2QjIxUFNcdTRGMUFcdThCRERcdTUxOERcdTZCMjFcdTYzQTVcdTUzRDcucHNkXHU5MUNBXHU2NTNFXHU4QkY3XHU2QzQyXHVGRjFGJyxcbiAgICAnV2lkZSBNb2RlJzogJ1x1NUJCRFx1NUM0Rlx1NkEyMVx1NUYwRicsXG4gICAgJ1F1aWNrIFNldCc6ICdcdTVGRUJcdTkwMUZcdThCQkVcdTdGNkUnLFxuICAgICdTZWxlY3RlZCBMYXllcic6ICdcdTkwMDlcdTRFMkRcdTU2RkVcdTVDNDInLFxuICAgICdTZWxlY3RlZCBMYXllciAoaW52ZXJ0KSc6ICdcdTkwMDlcdTRFMkRcdTU2RkVcdTVDNDIoXHU1M0NEXHU1NDExKScsXG4gICAgJ0NhbnZhcyc6ICdcdTc1M0JcdTVFMDMnLFxuICAgICdTZWxlY3Rpb24nOiAnXHU5MDA5XHU1MzNBJyxcbiAgICAnTWFudWFsJzogJ1x1NjI0Qlx1NTJBOFx1NkEyMVx1NUYwRicsXG4gICAgJ0F1dG8nOiAnXHU4MUVBXHU1MkE4XHU2QTIxXHU1RjBGJyxcblxuICAgIC8vIGFib3V0XG4gICAgJ1RoaXMgcGx1Z2luIGlzIGJhc2VkIG9uIHNkLXBwcCc6ICdcdTY3MkNcdTYzRDJcdTRFRjZcdTU3RkFcdTRFOEVzZC1wcHBcdTVGMDBcdTUzRDEnLFxuICAgICdBbmQgZm9sbG93cyBpdHMgb3BlbiBzb3VyY2UgbGljZW5zZTonOiAnXHU1RTc2XHU5MDc1XHU1RkFBXHU1MTc2XHU1RjAwXHU2RTkwXHU1MzRGXHU4QkFFXHVGRjFBJyxcbiAgICBcIkNsb3VkXCI6IFwiXHU0RTkxXHU3QUVGXHU2M0E4XHU4MzUwXCIsXG4gICAgXCJTcG9uc29yc1wiOiBcIlx1OEQ1RVx1NTJBOVwiLFxuICAgIFwid2FpdGluZy4uLlwiOiAnXHU4NjVBXHU0RjREXHU0RUU1XHU1Rjg1JyxcbiAgICAnTGlua3MnOiAnXHU1M0NCXHU2MEM1XHU5NEZFXHU2M0E1JyxcbiAgICAnQ29tbXVuaXR5JzogJ1x1NzkzRVx1NTMzQScsXG4gICAgJ0xJQ0VOU0U6JzogJ1x1OEJCOFx1NTNFRlx1OEJDMVx1RkYxQScsXG4gICAgJ09mZmljaWFsIFNpdGUnOiAnXHU1Qjk4XHU2NUI5XHU3RjUxXHU3QUQ5JyxcblxuICAgIC8vIGNvbWZ5IHBvcHVwXG4gICAgXCJ1cGxvYWRcIjogXCJcdTRFMEFcdTRGMjBcIixcbiAgICBcIlNpbXBsaWZ5IFdvcmtmbG93XCI6IFwiXHU3QjgwXHU1MzE2XHU1REU1XHU0RjVDXHU2RDQxXCIsXG4gICAgXCJQaG90b3Nob3BcIjogXCJQaG90b3Nob3BcIixcbiAgICBcIlBob3Rvc2hvcCBwbHVnaW4gc2V0dGluZ3NcIjogXCJQaG90b3Nob3AgXHU2M0QyXHU0RUY2XHU4QkJFXHU3RjZFXCIsXG4gICAgXCJQaG90b3Nob3AgcGx1Z2luXCI6IFwiUGhvdG9zaG9wIFx1NjNEMlx1NEVGNlwiLFxuICAgIFwiU0RQUFAgU2V0dGluZ3MvTWlzY1wiOiBcIlNEUFBQIFx1OEJCRVx1N0Y2RS9cdTY3NDJcdTk4NzlcIixcbiAgICBcIlNhbXBsZSAuUFNEIGZvciB0aGlzIHdvcmtmbG93OlwiOiBcIlx1NzkzQVx1NEY4Qi5QU0RcIixcbiAgICBcIkRvd25sb2FkIEV4YW1wbGUgLlBTRFwiOiBcIlx1NEUwQlx1OEY3RFx1NzkzQVx1NEY4Qi5QU0RcIixcbiAgICBcIk1heGltdW0gSW1hZ2UgU2l6ZSAocHgpOlwiOiBcIlx1NjcwMFx1NTkyN1x1NTZGRVx1NTBDRlx1NUMzQVx1NUJGOChweClcIixcbiAgICBcIkRvd25sb2FkXCI6IFwiXHU0RTBCXHU4RjdEXCIsXG4gICAgXCJVcGxvYWRcIjogXCJcdTRFMEFcdTRGMjBcIixcbiAgICBcIlJlc2V0XCI6IFwiXHU5MUNEXHU3RjZFXCIsXG4gICAgJ1JlZnJlc2gnOiAnXHU1MjM3XHU2NUIwJyxcbiAgICAnQ29tZnkgVVJMIChZb3UgY2FuIGNvcHkgaXQgdG8gY29ubmVjdCBDb21meVVJIGluIHRoZSBwbHVnaW4pOic6ICdDb21meVx1NTczMFx1NTc0MChcdTRGNjBcdTUzRUZcdTRFRTVcdTU5MERcdTUyMzZcdTVCODNcdTUyMzBcdTYzRDJcdTRFRjZcdTRFMkRcdThGREVcdTYzQTVDb21meVVJKTonLFxuICAgICd1c2Ugc2xpZGVyIGZvciBudW1iZXIgd2lkZ2V0Oic6ICdcdTY1NzBcdTVCNTdcdTYzQTdcdTRFRjZcdTRGN0ZcdTc1MjhcdTZFRDFcdTU3NTcnLFxuICAgICdQaG90b3Nob3AgaXMgbm90IGNvbm5lY3RlZCc6ICdQaG90b3Nob3AgXHU2NzJBXHU4RkRFXHU2M0E1JyxcbiAgICAnc2VsZWN0Li4uJzogJ1x1OEJGN1x1OTAwOVx1NjJFOScsXG4gICAgJ2NsaWNrIHRvIGVkaXQnOiAnXHU3MEI5XHU1MUZCXHU3RjE2XHU4RjkxJyxcblxuICAgIC8vIGNvbWZ5IGNhbGwgZXJyb3JcbiAgICAnQ29tZnlNYW5hZ2VyIG5vdCBmb3VuZCwgY2Fubm90IHJlYm9vdCc6ICdDb21meSBNYW5hZ2VyXHU2NzJBXHU1Qjg5XHU4OEM1XHVGRjBDXHU2NUUwXHU2Q0Q1XHU5MUNEXHU1NDJGJyxcbiAgICAnRmFpbGVkIHRvIHJlYm9vdCBDb21meVVJJzogJ1x1OTFDRFx1NTQyRkNvbWZ5VUlcdTU5MzFcdThEMjUnLFxufVxuIiwgImltcG9ydCBlbiBmcm9tICcuL2VuLm1qcyc7XG5pbXBvcnQgemhjbiBmcm9tICcuL3poLWNuLm1qcyc7XG4vL0B0cy1pZ25vcmVcbmNvbnN0IHJlcXVpcmVfID0gdHlwZW9mIHJlcXVpcmUgIT0gJ3VuZGVmaW5lZCcgPyByZXF1aXJlIDogdW5kZWZpbmVkXG5cbmxldCBsb2NhbGUgPSAnZW4nXG5pZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLmxhbmd1YWdlKSB7XG4gICAgbG9jYWxlID0gbmF2aWdhdG9yLmxhbmd1YWdlID09IFwiemgtQ05cIiA/ICd6aGNuJyA6ICdlbidcbn0gZWxzZSBpZiAocmVxdWlyZV8pIHtcbiAgICBsb2NhbGUgPSByZXF1aXJlXygndXhwJykuaG9zdC51aUxvY2FsZS5zdGFydHNXaXRoKFwiemhcIikgPyAnemhjbicgOiAnZW4nO1xufVxuXG5leHBvcnQgdHlwZSBJMThuS2V5ID0ga2V5b2YgdHlwZW9mIHpoY247XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGkxOG4oa2V5OiBrZXlvZiB0eXBlb2YgemhjbiwgLi4uYXJnczogYW55W10pIHtcbiAgICBjb25zdCBmb3JtYXRTdHI6IHN0cmluZyA9IGxvY2FsZSA9PSAnemhjbicgPyB6aGNuW2tleV0gOiAoa2V5IGluIGVuID8gKGVuIGFzIGFueSlba2V5XSA6IGtleSk7XG4gICAgaWYgKCFmb3JtYXRTdHIpIHRocm93IG5ldyBFcnJvcihgaTE4biBrZXkgbm90IGZvdW5kOiAke2tleX1gKTtcblxuICAgIHJldHVybiBmb3JtYXRTdHIucmVwbGFjZSgveyhcXGQrKX0vZywgZnVuY3Rpb24gKG1hdGNoLCBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBhcmdzW251bWJlcl0gIT0gJ3VuZGVmaW5lZCcgPyBhcmdzW251bWJlcl0gOiBtYXRjaFxuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEkxOG5LZXkoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4ga2V5IGluIHpoY247XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0kxOG5PZihrZXk6IGtleW9mIHR5cGVvZiB6aGNuLCBzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBrZXkgPT0gc3RyIHx8IHpoY25ba2V5XSA9PSBzdHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJMThuTG9jYWxlKCkge1xuICAgIHJldHVybiBsb2NhbGU7XG59XG4iLCAiaW1wb3J0IGkxOG4sIHsgaXNJMThuT2YgfSBmcm9tIFwiLi4vaTE4bi5tanNcIjtcblxuZXhwb3J0IGNsYXNzIFNwZWljaWFsSURNYW5hZ2VyIHtcbiAgICBwcml2YXRlIHN0YXRpYyBTUEVDSUFMX0RPQ1VNRU5UX0NVUlJFTlQgOiAnIyMjIEFjdGl2ZSBEb2N1bWVudCAjIyMnID0gJyMjIyBBY3RpdmUgRG9jdW1lbnQgIyMjJ1xuICAgIHB1YmxpYyBzdGF0aWMgaXNfU1BFQ0lBTF9ET0NVTUVOVF9DVVJSRU5UKHN0cjogc3RyaW5nKSB7IHJldHVybiBpc0kxOG5PZih0aGlzLlNQRUNJQUxfRE9DVU1FTlRfQ1VSUkVOVCwgc3RyKSB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRfU1BFQ0lBTF9ET0NVTUVOVF9DVVJSRU5UKCkgeyByZXR1cm4gaTE4bih0aGlzLlNQRUNJQUxfRE9DVU1FTlRfQ1VSUkVOVCkgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgU1BFQ0lBTF9MQVlFUl9LRUVQX1NJWkUgOiAnIyMjIEtlZXAgU2l6ZSBvciBGaXQgQ2FudmFzICMjIycgPSAnIyMjIEtlZXAgU2l6ZSBvciBGaXQgQ2FudmFzICMjIydcbiAgICBwdWJsaWMgc3RhdGljIGlzX1NQRUNJQUxfTEFZRVJfRklUKHN0cjogc3RyaW5nKSB7IHJldHVybiBpc0kxOG5PZih0aGlzLlNQRUNJQUxfTEFZRVJfS0VFUF9TSVpFLCBzdHIpIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldF9TUEVDSUFMX0xBWUVSX0ZJVCgpIHsgcmV0dXJuIGkxOG4odGhpcy5TUEVDSUFMX0xBWUVSX0tFRVBfU0laRSkgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgU1BFQ0lBTF9MQVlFUl9VU0VfQ0FOVkFTIDogJyMjIyBUaGUgQ2FudmFzICMjIycgPSAnIyMjIFRoZSBDYW52YXMgIyMjJ1xuICAgIHB1YmxpYyBzdGF0aWMgaXNfU1BFQ0lBTF9MQVlFUl9VU0VfQ0FOVkFTKHN0cjogc3RyaW5nKSB7IHJldHVybiBpc0kxOG5PZih0aGlzLlNQRUNJQUxfTEFZRVJfVVNFX0NBTlZBUywgc3RyKSB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRfU1BFQ0lBTF9MQVlFUl9VU0VfQ0FOVkFTKCkgeyByZXR1cm4gaTE4bih0aGlzLlNQRUNJQUxfTEFZRVJfVVNFX0NBTlZBUykgfSBcblxuICAgIHByaXZhdGUgc3RhdGljIFNQRUNJQUxfTEFZRVJfTkVXX0xBWUVSIDogJyMjIyBOZXcgTGF5ZXIgIyMjJyA9ICcjIyMgTmV3IExheWVyICMjIydcbiAgICBwdWJsaWMgc3RhdGljIGlzX1NQRUNJQUxfTEFZRVJfTkVXX0xBWUVSKHN0cjogc3RyaW5nKSB7IHJldHVybiBpc0kxOG5PZih0aGlzLlNQRUNJQUxfTEFZRVJfTkVXX0xBWUVSLCBzdHIpIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldF9TUEVDSUFMX0xBWUVSX05FV19MQVlFUigpIHsgcmV0dXJuIGkxOG4odGhpcy5TUEVDSUFMX0xBWUVSX05FV19MQVlFUikgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgU1BFQ0lBTF9MQVlFUl9TRUxFQ1RFRF9MQVlFUiA6ICcjIyMgU2VsZWN0ZWQgTGF5ZXIgIyMjJyA9ICcjIyMgU2VsZWN0ZWQgTGF5ZXIgIyMjJ1xuICAgIHB1YmxpYyBzdGF0aWMgaXNfU1BFQ0lBTF9MQVlFUl9TRUxFQ1RFRF9MQVlFUihzdHI6IHN0cmluZykgeyByZXR1cm4gaXNJMThuT2YodGhpcy5TUEVDSUFMX0xBWUVSX1NFTEVDVEVEX0xBWUVSLCBzdHIpIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldF9TUEVDSUFMX0xBWUVSX1NFTEVDVEVEX0xBWUVSKCkgeyByZXR1cm4gaTE4bih0aGlzLlNQRUNJQUxfTEFZRVJfU0VMRUNURURfTEFZRVIpIH1cblxuICAgIHByaXZhdGUgc3RhdGljIFNQRUNJQUxfTEFZRVJfUFJFVklFV19ET0NVTUVOVCA6ICdfU0RQUFBfUFNEXycgPSAnX1NEUFBQX1BTRF8nXG4gICAgcHVibGljIHN0YXRpYyBpc19TUEVDSUFMX0xBWUVSX1BSRVZJRVdfRE9DVU1FTlQoc3RyOiBzdHJpbmcpIHsgcmV0dXJuIGlzSTE4bk9mKHRoaXMuU1BFQ0lBTF9MQVlFUl9QUkVWSUVXX0RPQ1VNRU5ULCBzdHIpIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldF9TUEVDSUFMX0xBWUVSX1BSRVZJRVdfRE9DVU1FTlQoKSB7IHJldHVybiBpMThuKHRoaXMuU1BFQ0lBTF9MQVlFUl9QUkVWSUVXX0RPQ1VNRU5UKSB9XG5cbiAgICBzdGF0aWMgZ2V0U3BlY2lhbERvY3VtZW50Q3VycmVudCgpIHtcbiAgICAgICAgcmV0dXJuIGkxOG4oU3BlaWNpYWxJRE1hbmFnZXIuU1BFQ0lBTF9ET0NVTUVOVF9DVVJSRU5UKVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRTcGVjaWFsTGF5ZXJGb3JHZXQoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBpMThuKFNwZWljaWFsSURNYW5hZ2VyLlNQRUNJQUxfTEFZRVJfVVNFX0NBTlZBUyksXG4gICAgICAgICAgICBpMThuKFNwZWljaWFsSURNYW5hZ2VyLlNQRUNJQUxfTEFZRVJfU0VMRUNURURfTEFZRVIpXG4gICAgICAgIF1cbiAgICB9XG4gICAgc3RhdGljIGdldFNwZWNpYWxMYXllckZvclNlbmQoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBpMThuKFNwZWljaWFsSURNYW5hZ2VyLlNQRUNJQUxfTEFZRVJfTkVXX0xBWUVSKSxcbiAgICAgICAgICAgIGkxOG4oU3BlaWNpYWxJRE1hbmFnZXIuU1BFQ0lBTF9MQVlFUl9TRUxFQ1RFRF9MQVlFUilcbiAgICAgICAgXVxuICAgIH1cbiAgICBzdGF0aWMgZ2V0U3BlY2lhbERvY3VtZW50Rm9yUHJldmlldygpIHtcbiAgICAgICAgcmV0dXJuIGkxOG4oU3BlaWNpYWxJRE1hbmFnZXIuU1BFQ0lBTF9MQVlFUl9QUkVWSUVXX0RPQ1VNRU5UKVxuICAgIH1cblxuICAgIHN0YXRpYyBmaXhJMThuKHN0cjogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLmlzX1NQRUNJQUxfRE9DVU1FTlRfQ1VSUkVOVChzdHIpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5TUEVDSUFMX0RPQ1VNRU5UX0NVUlJFTlQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNfU1BFQ0lBTF9MQVlFUl9ORVdfTEFZRVIoc3RyKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuU1BFQ0lBTF9MQVlFUl9ORVdfTEFZRVI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNfU1BFQ0lBTF9MQVlFUl9QUkVWSUVXX0RPQ1VNRU5UKHN0cikpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLlNQRUNJQUxfTEFZRVJfUFJFVklFV19ET0NVTUVOVDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc19TUEVDSUFMX0xBWUVSX1VTRV9DQU5WQVMoc3RyKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuU1BFQ0lBTF9MQVlFUl9VU0VfQ0FOVkFTO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzX1NQRUNJQUxfTEFZRVJfU0VMRUNURURfTEFZRVIoc3RyKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuU1BFQ0lBTF9MQVlFUl9TRUxFQ1RFRF9MQVlFUjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBJZGVudGlmeSB9IGZyb20gXCIuLi8uLi9zdG9yZS9waG90b3Nob3AubXRzXCI7XG5cblxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VMYXllcklkZW50aWZ5KGlkOiBudW1iZXIsIG5hbWU6IHN0cmluZywgbGV2ZWwgPSAwKTogSWRlbnRpZnkge1xuICAgIHJldHVybiAoJy0nLnJlcGVhdChsZXZlbCkgKyBgJHtuYW1lfSAoaWQ6JHtpZH0pYCkgYXMgYW55IGFzIG5ldmVyXG59XG5leHBvcnQgZnVuY3Rpb24gbWFrZURvY3VtZW50SWRlbnRpZnkoaWQ6IG51bWJlciwgbmFtZTogc3RyaW5nKTogSWRlbnRpZnkge1xuICAgIHJldHVybiAoYCR7bmFtZX0gKGlkOiR7aWR9KWApIGFzIGFueSBhcyBuZXZlclxufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGF5ZXJJZGVudGlmeShpZGVudGlmeTogSWRlbnRpZnkgfCBzdHJpbmcpOiB7bmFtZTogc3RyaW5nLCBpZDogbnVtYmVyfSB7XG4gICAgY29uc3Qgc3BsaXR0ZXIgPSAoaWRlbnRpZnkgYXMgc3RyaW5nKS5zcGxpdCgnIChpZDonKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBzcGxpdHRlclswXSxcbiAgICAgICAgaWQ6IHBhcnNlSW50KHNwbGl0dGVyWzFdLnNsaWNlKDAsIC0xKSlcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VEb2N1bWVudElkZW50aWZ5KGlkZW50aWZ5OiBJZGVudGlmeSB8IHN0cmluZyk6IHtuYW1lOiBzdHJpbmcsIGlkOiBudW1iZXJ9IHtcbiAgICByZXR1cm4gcGFyc2VMYXllcklkZW50aWZ5KGlkZW50aWZ5KTtcbn0iLCAiLy8gQHRzLWlnbm9yZVxuZ2xvYmFsVGhpcy5zZHBwcFggPSBnbG9iYWxUaGlzLnNkcHBwWCB8fCB7fTtcbmV4cG9ydCBjb25zdCBzZHBwcFggPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLnNkcHBwWDsiLCAiaW1wb3J0IHsgcGFyc2VEb2N1bWVudElkZW50aWZ5IH0gZnJvbSBcIi4uL2NvbW1vbi9waG90b3Nob3AvaWRlbnRpZnkubWpzXCI7XG5pbXBvcnQgeyBTcGVpY2lhbElETWFuYWdlciB9IGZyb20gXCIuLi9jb21tb24vcGhvdG9zaG9wL3NwZWNpYWxMYXllci5tanNcIjtcbmltcG9ydCB7IERvY3VtZW50RGF0YSwgSWRlbnRpZnksIFBob3Rvc2hvcFN0b3JlIH0gZnJvbSBcIi4vcGhvdG9zaG9wLm1qc1wiO1xuXG5cbmV4cG9ydCBjbGFzcyBQaG90b3Nob3BTdG9yZUhlbHBlciB7XG4gICAgc3RhdGljIG1ha2VEb2N1bWVudERhdGFPcHRpb25zKHBob3Rvc2hvcFN0b3JlOiBQaG90b3Nob3BTdG9yZSk6IElkZW50aWZ5W10ge1xuICAgICAgICBjb25zdCBQaG90b3Nob3BTdG9yZURhdGEgPSBwaG90b3Nob3BTdG9yZS5kYXRhO1xuICAgICAgICBjb25zdCBvcHRpb25zOiBzdHJpbmdbXSA9IFtgJHtTcGVpY2lhbElETWFuYWdlci5nZXRTcGVjaWFsRG9jdW1lbnRDdXJyZW50KCl9YF1cbiAgICAgICAgT2JqZWN0LmtleXMoUGhvdG9zaG9wU3RvcmVEYXRhLmRvY3VtZW50cylcbiAgICAgICAgICAgIC5mb3JFYWNoKGRvY3VtZW50SUQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50ID0gUGhvdG9zaG9wU3RvcmVEYXRhLmRvY3VtZW50c1tkb2N1bWVudElEIGFzIGFueV07XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5wdXNoKGRvY3VtZW50LmlkZW50aWZ5KVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBvcHRpb25zIGFzIElkZW50aWZ5W107XG4gICAgfVxuICAgIHN0YXRpYyBmaW5kRG9jdW1lbnREYXRhKHBob3Rvc2hvcFN0b3JlOiBQaG90b3Nob3BTdG9yZSwgaWRlbnRpZnk6IHN0cmluZykge1xuICAgICAgICBjb25zdCBkb2N1bWVudElEID0gU3BlaWNpYWxJRE1hbmFnZXIuaXNfU1BFQ0lBTF9ET0NVTUVOVF9DVVJSRU5UKGlkZW50aWZ5KSA/XG4gICAgICAgICAgICBwaG90b3Nob3BTdG9yZS5kYXRhLmFjdGl2ZURvY3VtZW50SUQgOlxuICAgICAgICAgICAgcGFyc2VEb2N1bWVudElkZW50aWZ5KGlkZW50aWZ5KS5pZDtcbiAgICAgICAgcmV0dXJuIHBob3Rvc2hvcFN0b3JlLmRhdGEuZG9jdW1lbnRzW2RvY3VtZW50SURdO1xuICAgIH1cbiAgICBzdGF0aWMgbWFrZUxheWVyT3B0aW9ucyhkb2N1bWVudERhdGE6IERvY3VtZW50RGF0YSwgZXh0cmFPcHRpb25zOiBzdHJpbmdbXSkge1xuICAgICAgICBsZXQgb3B0aW9ucyA9IGV4dHJhT3B0aW9ucy5jb25jYXQoXG4gICAgICAgICAgICBkb2N1bWVudERhdGEubGF5ZXJzLm1hcChsYXllciA9PiBsYXllci5pZGVudGlmeSlcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gb3B0aW9uc1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0TGF5ZXJEaXJ0eUlEKGRvY3VtZW50RGF0YTogRG9jdW1lbnREYXRhLCBpZGVudGlmeTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGxheWVyID0gZG9jdW1lbnREYXRhLmxheWVycy5maW5kKGxheWVyID0+IGxheWVyLmlkZW50aWZ5ID09PSBpZGVudGlmeSk7XG4gICAgICAgIHJldHVybiBsYXllcj8uZGlydHlJRCB8fCAwO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Q2FudmFzRGlydHlJRChkb2N1bWVudERhdGE6IERvY3VtZW50RGF0YSkge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnREYXRhLmNhbnZhc0RpcnR5SUQgfHwgMDtcbiAgICB9XG4gICAgc3RhdGljIGdldFNlbGVjdGlvbkRpcnR5SUQoZG9jdW1lbnREYXRhOiBEb2N1bWVudERhdGEpIHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50RGF0YS5zZWxlY3Rpb25EaXJ0eUlEIHx8IDA7XG4gICAgfVxufVxuIiwgImltcG9ydCBpMThuIGZyb20gXCIuLi8uLi8uLi9zcmMvY29tbW9uL2kxOG4ubWpzXCI7XG5pbXBvcnQgeyBwYXJzZURvY3VtZW50SWRlbnRpZnkgfSBmcm9tIFwiLi4vLi4vLi4vc3JjL2NvbW1vbi9waG90b3Nob3AvaWRlbnRpZnkubXRzXCI7XG5pbXBvcnQgeyBTcGVpY2lhbElETWFuYWdlciB9IGZyb20gXCIuLi8uLi8uLi9zcmMvY29tbW9uL3Bob3Rvc2hvcC9zcGVjaWFsTGF5ZXIubXRzXCI7XG5pbXBvcnQgeyBzZHBwcFggfSBmcm9tIFwiLi4vLi4vLi4vc3JjL2NvbW1vbi9zZHBwcFgubXRzXCI7XG5pbXBvcnQgeyBQaG90b3Nob3BTdG9yZUhlbHBlciB9IGZyb20gXCIuLi8uLi8uLi9zcmMvc3RvcmUvaGVscGVycy5tdHNcIjtcbmltcG9ydCB7IElkZW50aWZ5IH0gZnJvbSBcIi4uLy4uLy4uL3NyYy9zdG9yZS9waG90b3Nob3AubXRzXCI7XG5pbXBvcnQgeyBhcGksIGFwcCB9IGZyb20gXCIuL2NvbWZ5LWdsb2JhbHMubXRzXCI7XG5pbXBvcnQgeyBwYWdlUGhvdG9zaG9wU3RvcmVNYXAgfSBmcm9tIFwiLi4vcGhvdG9zaG9wTW9kZWxzLm10c1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gbWFrZURvY3VtZW50RGF0YU9wdGlvbnMoKSB7XG4gICAgY29uc3QgYWxsU3RvcmVzID0gcGFnZVBob3Rvc2hvcFN0b3JlTWFwLmdldEFsbFN0b3JlKCk7XG4gICAgY29uc3Qgb3B0aW9uczogc3RyaW5nW10gPSBbXVxuICAgIE9iamVjdC52YWx1ZXMoYWxsU3RvcmVzKS5mb3JFYWNoKHN0b3JlID0+IHtcbiAgICAgICAgaWYgKGFwaS51c2VyICYmIGFwaS51c2VyICE9IHN0b3JlLmRhdGEuY29tZnlVc2VyVG9rZW4pIHJldHVybjtcblxuICAgICAgICBjb25zdCBzdG9yZU9wdGlvbnMgPSBQaG90b3Nob3BTdG9yZUhlbHBlci5tYWtlRG9jdW1lbnREYXRhT3B0aW9ucyhzdG9yZSlcbiAgICAgICAgICAgIC5tYXAob3B0aW9uID0+IG1ha2VEb2N1bWVudE9wdGlvbihvcHRpb24sIHN0b3JlLmRhdGEudW5hbWUpKTtcbiAgICAgICAgb3B0aW9ucy5wdXNoKC4uLnN0b3JlT3B0aW9ucyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIG9wdGlvbnM7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0TGF5ZXJPcHRpb25zQnlEb2N1bWVudFZhbHVlKGRvY3VtZW50VmFsdWU6IHN0cmluZywgZXh0cmFPcHRpb25zOiBzdHJpbmdbXSkge1xuICAgIGxldCBvcHRpb25zID0gWycnXVxuICAgIGNvbnN0IGRvY3VtZW50T3B0aW9uID0gcGFyc2VEb2N1bWVudE9wdGlvbihkb2N1bWVudFZhbHVlKTtcbiAgICBpZiAoIWRvY3VtZW50T3B0aW9uKSByZXR1cm4gW107XG4gICAgY29uc3Qgc3RvcmVPcHRpb25zID0gUGhvdG9zaG9wU3RvcmVIZWxwZXIubWFrZUxheWVyT3B0aW9ucyhkb2N1bWVudE9wdGlvbi5kb2N1bWVudERhdGEsIGV4dHJhT3B0aW9ucylcbiAgICBvcHRpb25zLnB1c2goLi4uc3RvcmVPcHRpb25zKTtcbiAgICByZXR1cm4gb3B0aW9uc1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzUGhvdG9zaG9wQ29ubmVjdGVkKCkge1xuICAgIGlmIChhcGkudXNlcikge1xuICAgICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhwYWdlUGhvdG9zaG9wU3RvcmVNYXAuZ2V0QWxsU3RvcmUoKSlcbiAgICAgICAgICAgIC5maWx0ZXIoc3RvcmUgPT5cbiAgICAgICAgICAgICAgICBhcGkudXNlciA9PSBzdG9yZS5kYXRhLmNvbWZ5VXNlclRva2VuXG4gICAgICAgICAgICApLmxlbmd0aCA+IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHBhZ2VQaG90b3Nob3BTdG9yZU1hcC5zdG9yZUNvdW50KClcbiAgICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VEb2N1bWVudE9wdGlvbihpZGVudGlmeTogSWRlbnRpZnksIGluc3RhbmNlTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGAke2luc3RhbmNlTmFtZX0vJHtpZGVudGlmeX1gXG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VEb2N1bWVudE9wdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKCF2YWx1ZSB8fCAhdmFsdWUuc3BsaXQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGJhY2tlbmREYXRhcyA9IHBhZ2VQaG90b3Nob3BTdG9yZU1hcC5nZXRBbGxQaG90b3Nob3BEb2N1bWVudERhdGEoKTtcbiAgICBsZXQgW2luc3RhbmNlTmFtZSwgZG9jdW1lbnRJZGVudGlmeV0gPSB2YWx1ZS5zcGxpdCgnLycpO1xuICAgIGlmICghZG9jdW1lbnRJZGVudGlmeSkge1xuICAgICAgICBkb2N1bWVudElkZW50aWZ5ID0gaW5zdGFuY2VOYW1lXG4gICAgICAgIGluc3RhbmNlTmFtZSA9IE9iamVjdC5rZXlzKGJhY2tlbmREYXRhcylbMF07XG4gICAgfTtcbiAgICBpZiAoIWJhY2tlbmREYXRhc1tpbnN0YW5jZU5hbWVdKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBkb2N1bWVudElEID0gU3BlaWNpYWxJRE1hbmFnZXIuaXNfU1BFQ0lBTF9ET0NVTUVOVF9DVVJSRU5UKGRvY3VtZW50SWRlbnRpZnkpID9cbiAgICAgICAgYmFja2VuZERhdGFzW2luc3RhbmNlTmFtZV0uYWN0aXZlRG9jdW1lbnRJRCA6XG4gICAgICAgIHBhcnNlRG9jdW1lbnRJZGVudGlmeShkb2N1bWVudElkZW50aWZ5KS5pZDtcblxuICAgIGlmIChiYWNrZW5kRGF0YXNbaW5zdGFuY2VOYW1lXT8uZG9jdW1lbnRzW2RvY3VtZW50SURdKSB7XG4gICAgICAgIGNvbnN0IGRvY3VtZW50RGF0YSA9IGJhY2tlbmREYXRhc1tpbnN0YW5jZU5hbWVdLmRvY3VtZW50c1tkb2N1bWVudElEXTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGluc3RhbmNlX2lkOiBiYWNrZW5kRGF0YXNbaW5zdGFuY2VOYW1lXS5zaWQsXG4gICAgICAgICAgICBpZGVudGlmeTogZG9jdW1lbnRJZGVudGlmeSxcbiAgICAgICAgICAgIGRvY3VtZW50RGF0YVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuaW50ZXJmYWNlIENvbWZ5R3JhcGhOb2RlIHtcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgaWQ6IG51bWJlcixcbiAgICBpbnB1dHM6IHsgbGluaz86IG51bWJlciB9W10sXG4gICAgd2lkZ2V0czogQ29tZnlHcmFwaFdpZGdldFtdXG59XG5pbnRlcmZhY2UgQ29tZnlHcmFwaFdpZGdldCB7XG4gICAgdmFsdWU6IHN0cmluZ1xuICAgIHNlcmlhbGl6ZVZhbHVlOiAoKSA9PiBQcm9taXNlPHN0cmluZz5cbn1cblxuY29uc3QgZ2V0TGluayA9IGZ1bmN0aW9uIChvcmlnaW5faWQ6IG51bWJlcikge1xuICAgIGNvbnN0IGxpbmtNYXA6IE1hcDxudW1iZXIsIHtcbiAgICAgICAgb3JpZ2luX2lkOiBudW1iZXIsXG4gICAgICAgIHRhcmdldF9pZDogbnVtYmVyXG4gICAgfT4gfCB7XG4gICAgICAgIG9yaWdpbl9pZDogbnVtYmVyLFxuICAgICAgICB0YXJnZXRfaWQ6IG51bWJlclxuICAgIH1bXSA9IGFwcC5ncmFwaC5saW5rcztcbiAgICBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheShsaW5rTWFwKTtcbiAgICBpZiAoaXNBcnJheSkge1xuICAgICAgICByZXR1cm4gbGlua01hcC5maW5kKGxpbmsgPT4gbGluayAmJiBsaW5rLm9yaWdpbl9pZCA9PSBvcmlnaW5faWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBsaW5rTWFwLmdldChvcmlnaW5faWQpO1xuICAgIH1cbn1cblxuLy8gdG9kbyBncm91cG5vZGVcbmV4cG9ydCBmdW5jdGlvbiBmaW5kRG9jdW1lbnROb2RlUmVjdXJzaXZlKF9ub2RlOiBDb21meUdyYXBoTm9kZSk6IENvbWZ5R3JhcGhOb2RlIHwgbnVsbCB7XG4gICAgY29uc3QgYWxsTm9kZXM6IENvbWZ5R3JhcGhOb2RlW10gPSBhcHAuZ3JhcGgubm9kZXM7XG5cbiAgICBjb25zdCBjdXJOb2RlID0gYWxsTm9kZXMuZmluZChub2RlID0+IF9ub2RlLmlkID09IG5vZGUuaWQpO1xuICAgIGlmICghY3VyTm9kZSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgcmVzdWx0OiBDb21meUdyYXBoTm9kZVtdID0gW107XG4gICAgZmluZFJlY3Vyc2l2ZShjdXJOb2RlLCByZXN1bHQpO1xuICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMikge1xuICAgICAgICBjb25zdCBmaXJzdFZhbHVlID0gcmVzdWx0WzBdLndpZGdldHNbMF0udmFsdWU7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICFyZXN1bHRcbiAgICAgICAgICAgICAgICAubWFwKG5vZGUgPT4gbm9kZS53aWRnZXRzWzBdLnZhbHVlKVxuICAgICAgICAgICAgICAgIC5ldmVyeSh2YWx1ZSA9PiB2YWx1ZSA9PSBmaXJzdFZhbHVlKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihpMThuKCdDYW5ub3QgY29ubmVjdCBtdWx0aXBsZSBkaWZmZXJlbnQgZG9jdW1lbnQgd2lkZ2V0cyB3aXRoIHNhbWUgdmFsdWUnKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdD8uWzBdIHx8IG51bGw7XG5cbiAgICBmdW5jdGlvbiBmaW5kUmVjdXJzaXZlKG5vZGU6IENvbWZ5R3JhcGhOb2RlLCByZXN1bHQ6IENvbWZ5R3JhcGhOb2RlW10pOiBDb21meUdyYXBoTm9kZSB8IG51bGwge1xuICAgICAgICBpZiAobm9kZS50eXBlID09ICdTRFBQUCBHZXQgRG9jdW1lbnQnKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChub2RlKTtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmlucHV0cy5sZW5ndGggPT0gMCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGZvciAoY29uc3QgaW5wdXQgb2Ygbm9kZS5pbnB1dHMpIHtcbiAgICAgICAgICAgIGlmIChpbnB1dC5saW5rKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGluayA9IGdldExpbmsoaW5wdXQubGluayk7XG4gICAgICAgICAgICAgICAgaWYgKCFsaW5rKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXROb2RlID0gYWxsTm9kZXMuZmluZChub2RlID0+IG5vZGUuaWQgPT0gbGluay5vcmlnaW5faWQpO1xuICAgICAgICAgICAgICAgIGlmICghdGFyZ2V0Tm9kZSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF5YmVEb2N1bWVudFdpZGdldCA9IGZpbmRSZWN1cnNpdmUodGFyZ2V0Tm9kZSwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICBpZiAobWF5YmVEb2N1bWVudFdpZGdldCkgcmV0dXJuIG1heWJlRG9jdW1lbnRXaWRnZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG5zZHBwcFguZmluZERvY3VtZW50Tm9kZVJlY3Vyc2l2ZSA9IGZpbmREb2N1bWVudE5vZGVSZWN1cnNpdmU7IiwgImV4cG9ydCBjbGFzcyBGbHVzaGVyIHtcbiAgICAvLyB0aGUgYXN5bmMgcXVldWVcbiAgICBwcml2YXRlIGZsdXNoaW5nOiBQcm9taXNlPGFueT4gPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBwcml2YXRlIG5ld0ZsdXNoUGVuZGluZyA9IGZhbHNlO1xuICAgIGNvbnN0cnVjdG9yKGRvRmx1c2g6ICgpID0+IFByb21pc2U8YW55Pikge1xuICAgICAgICB0aGlzLmRvRmx1c2ggPSBkb0ZsdXNoO1xuICAgICAgICB0aGlzLnBhdXNlKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGRvRmx1c2g6ICgpID0+IFByb21pc2U8YW55PjtcblxuICAgIHB1YmxpYyBydW5GbHVzaCgpIHtcbiAgICAgICAgaWYgKHRoaXMubmV3Rmx1c2hQZW5kaW5nKSByZXR1cm47XG4gICAgICAgIHRoaXMubmV3Rmx1c2hQZW5kaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5mbHVzaGluZyA9IHRoaXMuZmx1c2hpbmcudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHJlcXVlc3RBbmltYXRpb25GcmFtZShyZXNvbHZlKSlcbiAgICAgICAgICAgIHRoaXMubmV3Rmx1c2hQZW5kaW5nID0gZmFsc2U7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmRvRmx1c2goKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBwYXVzZSgpIHtcbiAgICAgICAgdGhpcy5mbHVzaGluZyA9IHRoaXMuZmx1c2hpbmcudGhlbigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7IFxuICAgICAgICAgICAgICAgIHRoaXMucmVzdW1lID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVzdW1lID0gKCkgPT4geyB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzdW1lOiAocD86IGFueSkgPT4gdm9pZCA9ICgpID0+IHsgfTtcbn0iLCAiaW1wb3J0IHsgRmx1c2hlciB9IGZyb20gXCIuLi8uLi9mbHVzaGVyLm1qc1wiO1xuaW1wb3J0IHsgTWFpblN0b3JlIH0gZnJvbSBcIi4uLy4uL3N0b3JlL3N0b3JlLm1qc1wiO1xuaW1wb3J0IHsgU29ja2V0LCBTb2NrZXRDb25zdHJ1Y3RvciB9IGZyb20gXCIuLi9Tb2NrZXQubWpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBNYWluU3RvcmVIb2xkZXJTb2NrZXQoc3RvcmU6IE1haW5TdG9yZTxhbnk+LCB0eXBlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKFNvY2tldENsYXNzOiBTb2NrZXRDb25zdHJ1Y3RvcjxTb2NrZXQ+KSB7XG4gICAgICAgIHJldHVybiBjbGFzcyBleHRlbmRzIFNvY2tldENsYXNzIHtcbiAgICAgICAgICAgIGNvbnN0cnVjdG9yKHVybDogc3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgc3VwZXIodXJsKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5vbignc3RvcmVfcmVxdWVzdCcsIChwYXlsb2FkOiBhbnksIGNhbGxiYWNrOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soe1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogc3RvcmUuZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246IHN0b3JlLnZlcnNpb25cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBsZXQgZmx1c2hlciA9IG5ldyBGbHVzaGVyKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBvcGVyYXRpb25zLCBmcm9tVmVyc2lvbiwgdG9WZXJzaW9uIH0gPSBzdG9yZS5mbHVzaCgpXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ3N0YXJ0IGZsdXNoJywgZnJvbVZlcnNpb24sIG9wZXJhdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2FsbGJhY2tlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrZWQpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ2ZsdXNoIHRpbWVvdXQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDUwMDApXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5lbWl0KCdzdG9yZV9mbHVzaCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21WZXJzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcz8uZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignZmx1c2ggZXJyb3InLCByZXMuZXJyb3IpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUuZmx1c2hEb25lKHRvVmVyc2lvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIHN0b3JlLnN1YnNjcmliZSgnLycsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZmx1c2hlci5ydW5GbHVzaCgpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQub24oJ2Rpc2Nvbm5lY3QnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZsdXNoZXIucGF1c2UoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5vbignY29ubmVjdCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmUuc2V0U0lEKHRoaXMuc29ja2V0LmlkIHx8ICcnKVxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQuZW1pdCgnc2RwcHBfaW5pdCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHN0b3JlLmRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogc3RvcmUudmVyc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5vbignc2RwcHBfaW5pdGVkJywgKHBheWxvYWQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmbHVzaGVyLnJlc3VtZSgpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59IiwgImltcG9ydCB7IFN0b3JlTWFwIH0gZnJvbSBcIi4uLy4uL3N0b3JlL3N0b3JlLW1hcC5tanNcIjtcbmltcG9ydCB7IFNvY2tldCwgU29ja2V0Q29uc3RydWN0b3IgfSBmcm9tIFwiLi4vU29ja2V0Lm1qc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gU3RvcmVNYXBIb2xkZXJTb2NrZXQoc3RvcmVNYXA6IFN0b3JlTWFwPGFueT4sIHRhcmdldFR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiBmdW5jdGlvbiAoU29ja2V0Q2xhc3M6IFNvY2tldENvbnN0cnVjdG9yPFNvY2tldD4pIHtcbiAgICAgICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgU29ja2V0Q2xhc3Mge1xuICAgICAgICAgICAgY29uc3RydWN0b3IodXJsOiBzdHJpbmcpIHtcbiAgICAgICAgICAgICAgICBzdXBlcih1cmwpO1xuICAgICAgICAgICAgICAgIHRoaXMuc29ja2V0Lm9uKCdzdG9yZV9mbHVzaCcsIChwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgICAgIHNpZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbnM6IGFueVtdLFxuICAgICAgICAgICAgICAgICAgICBmcm9tVmVyc2lvbjogbnVtYmVyLFxuICAgICAgICAgICAgICAgIH0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBheWxvYWQudHlwZSAhPT0gdGFyZ2V0VHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdwaG90b3Nob3AgZmx1c2gnLCBwYXlsb2FkLnNpZClcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RvcmUgPSBzdG9yZU1hcC5nZXRTdG9yZShwYXlsb2FkLnNpZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc3RvcmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNvY2tldC5lbWl0KCdzdG9yZV9yZXF1ZXN0JywgeyBzaWQ6IHBheWxvYWQuc2lkIH0sIChwYXlsb2FkOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZU1hcC5hZGRTdG9yZShwYXlsb2FkLnNpZCwgcGF5bG9hZC5kYXRhLCBwYXlsb2FkLnZlcnNpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdG9yZS5wYXRjaFZlcnNpb25BY2NlcHRhYmxlKHBheWxvYWQuZnJvbVZlcnNpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUucGF0Y2hEYXRhKHBheWxvYWQub3BlcmF0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdwYXRjaCB2ZXJzaW9uIG5vdCBhY2NlcHRhYmxlIGZyb20nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLmZyb21WZXJzaW9uLCAnY3VycmVudCB2ZXJzaW9uIGlzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUudmVyc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5lbWl0KCdzdG9yZV9yZXF1ZXN0JywgeyB0eXBlOiB0YXJnZXRUeXBlIH0sIChwYXlsb2FkOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVNYXAuc3luYyhwYXlsb2FkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQub24oJ3N0b3JlX3JlbW92ZScsIChwYXlsb2FkOiB7IHNpZDogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmVNYXAucmVtb3ZlU3RvcmUocGF5bG9hZC5zaWQpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQub24oJ3NkcHBwX2luaXRlZCcsIChwYXlsb2FkOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQuZW1pdCgnc3RvcmVfcmVxdWVzdCcsIHsgdHlwZTogdGFyZ2V0VHlwZSB9LCAocGF5bG9hZDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yZU1hcC5zeW5jKHBheWxvYWQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsICJjb25zdCBQQUNLRVRfVFlQRVMgPSBPYmplY3QuY3JlYXRlKG51bGwpOyAvLyBubyBNYXAgPSBubyBwb2x5ZmlsbFxuUEFDS0VUX1RZUEVTW1wib3BlblwiXSA9IFwiMFwiO1xuUEFDS0VUX1RZUEVTW1wiY2xvc2VcIl0gPSBcIjFcIjtcblBBQ0tFVF9UWVBFU1tcInBpbmdcIl0gPSBcIjJcIjtcblBBQ0tFVF9UWVBFU1tcInBvbmdcIl0gPSBcIjNcIjtcblBBQ0tFVF9UWVBFU1tcIm1lc3NhZ2VcIl0gPSBcIjRcIjtcblBBQ0tFVF9UWVBFU1tcInVwZ3JhZGVcIl0gPSBcIjVcIjtcblBBQ0tFVF9UWVBFU1tcIm5vb3BcIl0gPSBcIjZcIjtcbmNvbnN0IFBBQ0tFVF9UWVBFU19SRVZFUlNFID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbk9iamVjdC5rZXlzKFBBQ0tFVF9UWVBFUykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgUEFDS0VUX1RZUEVTX1JFVkVSU0VbUEFDS0VUX1RZUEVTW2tleV1dID0ga2V5O1xufSk7XG5jb25zdCBFUlJPUl9QQUNLRVQgPSB7IHR5cGU6IFwiZXJyb3JcIiwgZGF0YTogXCJwYXJzZXIgZXJyb3JcIiB9O1xuZXhwb3J0IHsgUEFDS0VUX1RZUEVTLCBQQUNLRVRfVFlQRVNfUkVWRVJTRSwgRVJST1JfUEFDS0VUIH07XG4iLCAiaW1wb3J0IHsgUEFDS0VUX1RZUEVTIH0gZnJvbSBcIi4vY29tbW9ucy5qc1wiO1xuY29uc3Qgd2l0aE5hdGl2ZUJsb2IgPSB0eXBlb2YgQmxvYiA9PT0gXCJmdW5jdGlvblwiIHx8XG4gICAgKHR5cGVvZiBCbG9iICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChCbG9iKSA9PT0gXCJbb2JqZWN0IEJsb2JDb25zdHJ1Y3Rvcl1cIik7XG5jb25zdCB3aXRoTmF0aXZlQXJyYXlCdWZmZXIgPSB0eXBlb2YgQXJyYXlCdWZmZXIgPT09IFwiZnVuY3Rpb25cIjtcbi8vIEFycmF5QnVmZmVyLmlzVmlldyBtZXRob2QgaXMgbm90IGRlZmluZWQgaW4gSUUxMFxuY29uc3QgaXNWaWV3ID0gKG9iaikgPT4ge1xuICAgIHJldHVybiB0eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyBBcnJheUJ1ZmZlci5pc1ZpZXcob2JqKVxuICAgICAgICA6IG9iaiAmJiBvYmouYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI7XG59O1xuY29uc3QgZW5jb2RlUGFja2V0ID0gKHsgdHlwZSwgZGF0YSB9LCBzdXBwb3J0c0JpbmFyeSwgY2FsbGJhY2spID0+IHtcbiAgICBpZiAod2l0aE5hdGl2ZUJsb2IgJiYgZGF0YSBpbnN0YW5jZW9mIEJsb2IpIHtcbiAgICAgICAgaWYgKHN1cHBvcnRzQmluYXJ5KSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZW5jb2RlQmxvYkFzQmFzZTY0KGRhdGEsIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICh3aXRoTmF0aXZlQXJyYXlCdWZmZXIgJiZcbiAgICAgICAgKGRhdGEgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciB8fCBpc1ZpZXcoZGF0YSkpKSB7XG4gICAgICAgIGlmIChzdXBwb3J0c0JpbmFyeSkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGVuY29kZUJsb2JBc0Jhc2U2NChuZXcgQmxvYihbZGF0YV0pLCBjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gcGxhaW4gc3RyaW5nXG4gICAgcmV0dXJuIGNhbGxiYWNrKFBBQ0tFVF9UWVBFU1t0eXBlXSArIChkYXRhIHx8IFwiXCIpKTtcbn07XG5jb25zdCBlbmNvZGVCbG9iQXNCYXNlNjQgPSAoZGF0YSwgY2FsbGJhY2spID0+IHtcbiAgICBjb25zdCBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICBmaWxlUmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGZpbGVSZWFkZXIucmVzdWx0LnNwbGl0KFwiLFwiKVsxXTtcbiAgICAgICAgY2FsbGJhY2soXCJiXCIgKyAoY29udGVudCB8fCBcIlwiKSk7XG4gICAgfTtcbiAgICByZXR1cm4gZmlsZVJlYWRlci5yZWFkQXNEYXRhVVJMKGRhdGEpO1xufTtcbmZ1bmN0aW9uIHRvQXJyYXkoZGF0YSkge1xuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShkYXRhKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShkYXRhLmJ1ZmZlciwgZGF0YS5ieXRlT2Zmc2V0LCBkYXRhLmJ5dGVMZW5ndGgpO1xuICAgIH1cbn1cbmxldCBURVhUX0VOQ09ERVI7XG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlUGFja2V0VG9CaW5hcnkocGFja2V0LCBjYWxsYmFjaykge1xuICAgIGlmICh3aXRoTmF0aXZlQmxvYiAmJiBwYWNrZXQuZGF0YSBpbnN0YW5jZW9mIEJsb2IpIHtcbiAgICAgICAgcmV0dXJuIHBhY2tldC5kYXRhLmFycmF5QnVmZmVyKCkudGhlbih0b0FycmF5KS50aGVuKGNhbGxiYWNrKTtcbiAgICB9XG4gICAgZWxzZSBpZiAod2l0aE5hdGl2ZUFycmF5QnVmZmVyICYmXG4gICAgICAgIChwYWNrZXQuZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8IGlzVmlldyhwYWNrZXQuZGF0YSkpKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayh0b0FycmF5KHBhY2tldC5kYXRhKSk7XG4gICAgfVxuICAgIGVuY29kZVBhY2tldChwYWNrZXQsIGZhbHNlLCAoZW5jb2RlZCkgPT4ge1xuICAgICAgICBpZiAoIVRFWFRfRU5DT0RFUikge1xuICAgICAgICAgICAgVEVYVF9FTkNPREVSID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2soVEVYVF9FTkNPREVSLmVuY29kZShlbmNvZGVkKSk7XG4gICAgfSk7XG59XG5leHBvcnQgeyBlbmNvZGVQYWNrZXQgfTtcbiIsICIvLyBpbXBvcnRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9zb2NrZXRpby9iYXNlNjQtYXJyYXlidWZmZXJcbmNvbnN0IGNoYXJzID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nO1xuLy8gVXNlIGEgbG9va3VwIHRhYmxlIHRvIGZpbmQgdGhlIGluZGV4LlxuY29uc3QgbG9va3VwID0gdHlwZW9mIFVpbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gW10gOiBuZXcgVWludDhBcnJheSgyNTYpO1xuZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykge1xuICAgIGxvb2t1cFtjaGFycy5jaGFyQ29kZUF0KGkpXSA9IGk7XG59XG5leHBvcnQgY29uc3QgZW5jb2RlID0gKGFycmF5YnVmZmVyKSA9PiB7XG4gICAgbGV0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlidWZmZXIpLCBpLCBsZW4gPSBieXRlcy5sZW5ndGgsIGJhc2U2NCA9ICcnO1xuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMykge1xuICAgICAgICBiYXNlNjQgKz0gY2hhcnNbYnl0ZXNbaV0gPj4gMl07XG4gICAgICAgIGJhc2U2NCArPSBjaGFyc1soKGJ5dGVzW2ldICYgMykgPDwgNCkgfCAoYnl0ZXNbaSArIDFdID4+IDQpXTtcbiAgICAgICAgYmFzZTY0ICs9IGNoYXJzWygoYnl0ZXNbaSArIDFdICYgMTUpIDw8IDIpIHwgKGJ5dGVzW2kgKyAyXSA+PiA2KV07XG4gICAgICAgIGJhc2U2NCArPSBjaGFyc1tieXRlc1tpICsgMl0gJiA2M107XG4gICAgfVxuICAgIGlmIChsZW4gJSAzID09PSAyKSB7XG4gICAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDEpICsgJz0nO1xuICAgIH1cbiAgICBlbHNlIGlmIChsZW4gJSAzID09PSAxKSB7XG4gICAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDIpICsgJz09JztcbiAgICB9XG4gICAgcmV0dXJuIGJhc2U2NDtcbn07XG5leHBvcnQgY29uc3QgZGVjb2RlID0gKGJhc2U2NCkgPT4ge1xuICAgIGxldCBidWZmZXJMZW5ndGggPSBiYXNlNjQubGVuZ3RoICogMC43NSwgbGVuID0gYmFzZTY0Lmxlbmd0aCwgaSwgcCA9IDAsIGVuY29kZWQxLCBlbmNvZGVkMiwgZW5jb2RlZDMsIGVuY29kZWQ0O1xuICAgIGlmIChiYXNlNjRbYmFzZTY0Lmxlbmd0aCAtIDFdID09PSAnPScpIHtcbiAgICAgICAgYnVmZmVyTGVuZ3RoLS07XG4gICAgICAgIGlmIChiYXNlNjRbYmFzZTY0Lmxlbmd0aCAtIDJdID09PSAnPScpIHtcbiAgICAgICAgICAgIGJ1ZmZlckxlbmd0aC0tO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGFycmF5YnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGJ1ZmZlckxlbmd0aCksIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlidWZmZXIpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgICAgICBlbmNvZGVkMSA9IGxvb2t1cFtiYXNlNjQuY2hhckNvZGVBdChpKV07XG4gICAgICAgIGVuY29kZWQyID0gbG9va3VwW2Jhc2U2NC5jaGFyQ29kZUF0KGkgKyAxKV07XG4gICAgICAgIGVuY29kZWQzID0gbG9va3VwW2Jhc2U2NC5jaGFyQ29kZUF0KGkgKyAyKV07XG4gICAgICAgIGVuY29kZWQ0ID0gbG9va3VwW2Jhc2U2NC5jaGFyQ29kZUF0KGkgKyAzKV07XG4gICAgICAgIGJ5dGVzW3ArK10gPSAoZW5jb2RlZDEgPDwgMikgfCAoZW5jb2RlZDIgPj4gNCk7XG4gICAgICAgIGJ5dGVzW3ArK10gPSAoKGVuY29kZWQyICYgMTUpIDw8IDQpIHwgKGVuY29kZWQzID4+IDIpO1xuICAgICAgICBieXRlc1twKytdID0gKChlbmNvZGVkMyAmIDMpIDw8IDYpIHwgKGVuY29kZWQ0ICYgNjMpO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXlidWZmZXI7XG59O1xuIiwgImltcG9ydCB7IEVSUk9SX1BBQ0tFVCwgUEFDS0VUX1RZUEVTX1JFVkVSU0UsIH0gZnJvbSBcIi4vY29tbW9ucy5qc1wiO1xuaW1wb3J0IHsgZGVjb2RlIH0gZnJvbSBcIi4vY29udHJpYi9iYXNlNjQtYXJyYXlidWZmZXIuanNcIjtcbmNvbnN0IHdpdGhOYXRpdmVBcnJheUJ1ZmZlciA9IHR5cGVvZiBBcnJheUJ1ZmZlciA9PT0gXCJmdW5jdGlvblwiO1xuZXhwb3J0IGNvbnN0IGRlY29kZVBhY2tldCA9IChlbmNvZGVkUGFja2V0LCBiaW5hcnlUeXBlKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGVkUGFja2V0ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBcIm1lc3NhZ2VcIixcbiAgICAgICAgICAgIGRhdGE6IG1hcEJpbmFyeShlbmNvZGVkUGFja2V0LCBiaW5hcnlUeXBlKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgdHlwZSA9IGVuY29kZWRQYWNrZXQuY2hhckF0KDApO1xuICAgIGlmICh0eXBlID09PSBcImJcIikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogXCJtZXNzYWdlXCIsXG4gICAgICAgICAgICBkYXRhOiBkZWNvZGVCYXNlNjRQYWNrZXQoZW5jb2RlZFBhY2tldC5zdWJzdHJpbmcoMSksIGJpbmFyeVR5cGUpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBwYWNrZXRUeXBlID0gUEFDS0VUX1RZUEVTX1JFVkVSU0VbdHlwZV07XG4gICAgaWYgKCFwYWNrZXRUeXBlKSB7XG4gICAgICAgIHJldHVybiBFUlJPUl9QQUNLRVQ7XG4gICAgfVxuICAgIHJldHVybiBlbmNvZGVkUGFja2V0Lmxlbmd0aCA+IDFcbiAgICAgICAgPyB7XG4gICAgICAgICAgICB0eXBlOiBQQUNLRVRfVFlQRVNfUkVWRVJTRVt0eXBlXSxcbiAgICAgICAgICAgIGRhdGE6IGVuY29kZWRQYWNrZXQuc3Vic3RyaW5nKDEpLFxuICAgICAgICB9XG4gICAgICAgIDoge1xuICAgICAgICAgICAgdHlwZTogUEFDS0VUX1RZUEVTX1JFVkVSU0VbdHlwZV0sXG4gICAgICAgIH07XG59O1xuY29uc3QgZGVjb2RlQmFzZTY0UGFja2V0ID0gKGRhdGEsIGJpbmFyeVR5cGUpID0+IHtcbiAgICBpZiAod2l0aE5hdGl2ZUFycmF5QnVmZmVyKSB7XG4gICAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGUoZGF0YSk7XG4gICAgICAgIHJldHVybiBtYXBCaW5hcnkoZGVjb2RlZCwgYmluYXJ5VHlwZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4geyBiYXNlNjQ6IHRydWUsIGRhdGEgfTsgLy8gZmFsbGJhY2sgZm9yIG9sZCBicm93c2Vyc1xuICAgIH1cbn07XG5jb25zdCBtYXBCaW5hcnkgPSAoZGF0YSwgYmluYXJ5VHlwZSkgPT4ge1xuICAgIHN3aXRjaCAoYmluYXJ5VHlwZSkge1xuICAgICAgICBjYXNlIFwiYmxvYlwiOlxuICAgICAgICAgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBCbG9iKSB7XG4gICAgICAgICAgICAgICAgLy8gZnJvbSBXZWJTb2NrZXQgKyBiaW5hcnlUeXBlIFwiYmxvYlwiXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBmcm9tIEhUVFAgbG9uZy1wb2xsaW5nIG9yIFdlYlRyYW5zcG9ydFxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQmxvYihbZGF0YV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICBjYXNlIFwiYXJyYXlidWZmZXJcIjpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgICAgICAvLyBmcm9tIEhUVFAgbG9uZy1wb2xsaW5nIChiYXNlNjQpIG9yIFdlYlNvY2tldCArIGJpbmFyeVR5cGUgXCJhcnJheWJ1ZmZlclwiXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBmcm9tIFdlYlRyYW5zcG9ydCAoVWludDhBcnJheSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5idWZmZXI7XG4gICAgICAgICAgICB9XG4gICAgfVxufTtcbiIsICJpbXBvcnQgeyBlbmNvZGVQYWNrZXQsIGVuY29kZVBhY2tldFRvQmluYXJ5IH0gZnJvbSBcIi4vZW5jb2RlUGFja2V0LmpzXCI7XG5pbXBvcnQgeyBkZWNvZGVQYWNrZXQgfSBmcm9tIFwiLi9kZWNvZGVQYWNrZXQuanNcIjtcbmltcG9ydCB7IEVSUk9SX1BBQ0tFVCwgfSBmcm9tIFwiLi9jb21tb25zLmpzXCI7XG5jb25zdCBTRVBBUkFUT1IgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDMwKTsgLy8gc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0RlbGltaXRlciNBU0NJSV9kZWxpbWl0ZWRfdGV4dFxuY29uc3QgZW5jb2RlUGF5bG9hZCA9IChwYWNrZXRzLCBjYWxsYmFjaykgPT4ge1xuICAgIC8vIHNvbWUgcGFja2V0cyBtYXkgYmUgYWRkZWQgdG8gdGhlIGFycmF5IHdoaWxlIGVuY29kaW5nLCBzbyB0aGUgaW5pdGlhbCBsZW5ndGggbXVzdCBiZSBzYXZlZFxuICAgIGNvbnN0IGxlbmd0aCA9IHBhY2tldHMubGVuZ3RoO1xuICAgIGNvbnN0IGVuY29kZWRQYWNrZXRzID0gbmV3IEFycmF5KGxlbmd0aCk7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBwYWNrZXRzLmZvckVhY2goKHBhY2tldCwgaSkgPT4ge1xuICAgICAgICAvLyBmb3JjZSBiYXNlNjQgZW5jb2RpbmcgZm9yIGJpbmFyeSBwYWNrZXRzXG4gICAgICAgIGVuY29kZVBhY2tldChwYWNrZXQsIGZhbHNlLCAoZW5jb2RlZFBhY2tldCkgPT4ge1xuICAgICAgICAgICAgZW5jb2RlZFBhY2tldHNbaV0gPSBlbmNvZGVkUGFja2V0O1xuICAgICAgICAgICAgaWYgKCsrY291bnQgPT09IGxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVuY29kZWRQYWNrZXRzLmpvaW4oU0VQQVJBVE9SKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcbmNvbnN0IGRlY29kZVBheWxvYWQgPSAoZW5jb2RlZFBheWxvYWQsIGJpbmFyeVR5cGUpID0+IHtcbiAgICBjb25zdCBlbmNvZGVkUGFja2V0cyA9IGVuY29kZWRQYXlsb2FkLnNwbGl0KFNFUEFSQVRPUik7XG4gICAgY29uc3QgcGFja2V0cyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW5jb2RlZFBhY2tldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgZGVjb2RlZFBhY2tldCA9IGRlY29kZVBhY2tldChlbmNvZGVkUGFja2V0c1tpXSwgYmluYXJ5VHlwZSk7XG4gICAgICAgIHBhY2tldHMucHVzaChkZWNvZGVkUGFja2V0KTtcbiAgICAgICAgaWYgKGRlY29kZWRQYWNrZXQudHlwZSA9PT0gXCJlcnJvclwiKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGFja2V0cztcbn07XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGFja2V0RW5jb2RlclN0cmVhbSgpIHtcbiAgICByZXR1cm4gbmV3IFRyYW5zZm9ybVN0cmVhbSh7XG4gICAgICAgIHRyYW5zZm9ybShwYWNrZXQsIGNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgIGVuY29kZVBhY2tldFRvQmluYXJ5KHBhY2tldCwgKGVuY29kZWRQYWNrZXQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXlsb2FkTGVuZ3RoID0gZW5jb2RlZFBhY2tldC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgbGV0IGhlYWRlcjtcbiAgICAgICAgICAgICAgICAvLyBpbnNwaXJlZCBieSB0aGUgV2ViU29ja2V0IGZvcm1hdDogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dlYlNvY2tldHNfQVBJL1dyaXRpbmdfV2ViU29ja2V0X3NlcnZlcnMjZGVjb2RpbmdfcGF5bG9hZF9sZW5ndGhcbiAgICAgICAgICAgICAgICBpZiAocGF5bG9hZExlbmd0aCA8IDEyNikge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBuZXcgVWludDhBcnJheSgxKTtcbiAgICAgICAgICAgICAgICAgICAgbmV3IERhdGFWaWV3KGhlYWRlci5idWZmZXIpLnNldFVpbnQ4KDAsIHBheWxvYWRMZW5ndGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXlsb2FkTGVuZ3RoIDwgNjU1MzYpIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gbmV3IFVpbnQ4QXJyYXkoMyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcoaGVhZGVyLmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIHZpZXcuc2V0VWludDgoMCwgMTI2KTtcbiAgICAgICAgICAgICAgICAgICAgdmlldy5zZXRVaW50MTYoMSwgcGF5bG9hZExlbmd0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBuZXcgVWludDhBcnJheSg5KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmlldyA9IG5ldyBEYXRhVmlldyhoZWFkZXIuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgdmlldy5zZXRVaW50OCgwLCAxMjcpO1xuICAgICAgICAgICAgICAgICAgICB2aWV3LnNldEJpZ1VpbnQ2NCgxLCBCaWdJbnQocGF5bG9hZExlbmd0aCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBmaXJzdCBiaXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHBheWxvYWQgaXMgcGxhaW4gdGV4dCAoMCkgb3IgYmluYXJ5ICgxKVxuICAgICAgICAgICAgICAgIGlmIChwYWNrZXQuZGF0YSAmJiB0eXBlb2YgcGFja2V0LmRhdGEgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyWzBdIHw9IDB4ODA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShoZWFkZXIpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShlbmNvZGVkUGFja2V0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgIH0pO1xufVxubGV0IFRFWFRfREVDT0RFUjtcbmZ1bmN0aW9uIHRvdGFsTGVuZ3RoKGNodW5rcykge1xuICAgIHJldHVybiBjaHVua3MucmVkdWNlKChhY2MsIGNodW5rKSA9PiBhY2MgKyBjaHVuay5sZW5ndGgsIDApO1xufVxuZnVuY3Rpb24gY29uY2F0Q2h1bmtzKGNodW5rcywgc2l6ZSkge1xuICAgIGlmIChjaHVua3NbMF0ubGVuZ3RoID09PSBzaXplKSB7XG4gICAgICAgIHJldHVybiBjaHVua3Muc2hpZnQoKTtcbiAgICB9XG4gICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgbGV0IGogPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgIGJ1ZmZlcltpXSA9IGNodW5rc1swXVtqKytdO1xuICAgICAgICBpZiAoaiA9PT0gY2h1bmtzWzBdLmxlbmd0aCkge1xuICAgICAgICAgICAgY2h1bmtzLnNoaWZ0KCk7XG4gICAgICAgICAgICBqID0gMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2h1bmtzLmxlbmd0aCAmJiBqIDwgY2h1bmtzWzBdLmxlbmd0aCkge1xuICAgICAgICBjaHVua3NbMF0gPSBjaHVua3NbMF0uc2xpY2Uoaik7XG4gICAgfVxuICAgIHJldHVybiBidWZmZXI7XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGFja2V0RGVjb2RlclN0cmVhbShtYXhQYXlsb2FkLCBiaW5hcnlUeXBlKSB7XG4gICAgaWYgKCFURVhUX0RFQ09ERVIpIHtcbiAgICAgICAgVEVYVF9ERUNPREVSID0gbmV3IFRleHREZWNvZGVyKCk7XG4gICAgfVxuICAgIGNvbnN0IGNodW5rcyA9IFtdO1xuICAgIGxldCBzdGF0ZSA9IDAgLyogU3RhdGUuUkVBRF9IRUFERVIgKi87XG4gICAgbGV0IGV4cGVjdGVkTGVuZ3RoID0gLTE7XG4gICAgbGV0IGlzQmluYXJ5ID0gZmFsc2U7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2Zvcm1TdHJlYW0oe1xuICAgICAgICB0cmFuc2Zvcm0oY2h1bmssIGNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgIGNodW5rcy5wdXNoKGNodW5rKTtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlID09PSAwIC8qIFN0YXRlLlJFQURfSEVBREVSICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b3RhbExlbmd0aChjaHVua3MpIDwgMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gY29uY2F0Q2h1bmtzKGNodW5rcywgMSk7XG4gICAgICAgICAgICAgICAgICAgIGlzQmluYXJ5ID0gKGhlYWRlclswXSAmIDB4ODApID09PSAweDgwO1xuICAgICAgICAgICAgICAgICAgICBleHBlY3RlZExlbmd0aCA9IGhlYWRlclswXSAmIDB4N2Y7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleHBlY3RlZExlbmd0aCA8IDEyNikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAzIC8qIFN0YXRlLlJFQURfUEFZTE9BRCAqLztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHBlY3RlZExlbmd0aCA9PT0gMTI2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDEgLyogU3RhdGUuUkVBRF9FWFRFTkRFRF9MRU5HVEhfMTYgKi87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDIgLyogU3RhdGUuUkVBRF9FWFRFTkRFRF9MRU5HVEhfNjQgKi87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUgPT09IDEgLyogU3RhdGUuUkVBRF9FWFRFTkRFRF9MRU5HVEhfMTYgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvdGFsTGVuZ3RoKGNodW5rcykgPCAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJBcnJheSA9IGNvbmNhdENodW5rcyhjaHVua3MsIDIpO1xuICAgICAgICAgICAgICAgICAgICBleHBlY3RlZExlbmd0aCA9IG5ldyBEYXRhVmlldyhoZWFkZXJBcnJheS5idWZmZXIsIGhlYWRlckFycmF5LmJ5dGVPZmZzZXQsIGhlYWRlckFycmF5Lmxlbmd0aCkuZ2V0VWludDE2KDApO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDMgLyogU3RhdGUuUkVBRF9QQVlMT0FEICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGF0ZSA9PT0gMiAvKiBTdGF0ZS5SRUFEX0VYVEVOREVEX0xFTkdUSF82NCAqLykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodG90YWxMZW5ndGgoY2h1bmtzKSA8IDgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlckFycmF5ID0gY29uY2F0Q2h1bmtzKGNodW5rcywgOCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcoaGVhZGVyQXJyYXkuYnVmZmVyLCBoZWFkZXJBcnJheS5ieXRlT2Zmc2V0LCBoZWFkZXJBcnJheS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuID0gdmlldy5nZXRVaW50MzIoMCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuID4gTWF0aC5wb3coMiwgNTMgLSAzMikgLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbWF4aW11bSBzYWZlIGludGVnZXIgaW4gSmF2YVNjcmlwdCBpcyAyXjUzIC0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKEVSUk9SX1BBQ0tFVCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBleHBlY3RlZExlbmd0aCA9IG4gKiBNYXRoLnBvdygyLCAzMikgKyB2aWV3LmdldFVpbnQzMig0KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAzIC8qIFN0YXRlLlJFQURfUEFZTE9BRCAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b3RhbExlbmd0aChjaHVua3MpIDwgZXhwZWN0ZWRMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBjb25jYXRDaHVua3MoY2h1bmtzLCBleHBlY3RlZExlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShkZWNvZGVQYWNrZXQoaXNCaW5hcnkgPyBkYXRhIDogVEVYVF9ERUNPREVSLmRlY29kZShkYXRhKSwgYmluYXJ5VHlwZSkpO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDAgLyogU3RhdGUuUkVBRF9IRUFERVIgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChleHBlY3RlZExlbmd0aCA9PT0gMCB8fCBleHBlY3RlZExlbmd0aCA+IG1heFBheWxvYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKEVSUk9SX1BBQ0tFVCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBwcm90b2NvbCA9IDQ7XG5leHBvcnQgeyBlbmNvZGVQYWNrZXQsIGVuY29kZVBheWxvYWQsIGRlY29kZVBhY2tldCwgZGVjb2RlUGF5bG9hZCwgfTtcbiIsICIvKipcbiAqIEluaXRpYWxpemUgYSBuZXcgYEVtaXR0ZXJgLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIEVtaXR0ZXIob2JqKSB7XG4gIGlmIChvYmopIHJldHVybiBtaXhpbihvYmopO1xufVxuXG4vKipcbiAqIE1peGluIHRoZSBlbWl0dGVyIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHJldHVybiB7T2JqZWN0fVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbWl4aW4ob2JqKSB7XG4gIGZvciAodmFyIGtleSBpbiBFbWl0dGVyLnByb3RvdHlwZSkge1xuICAgIG9ialtrZXldID0gRW1pdHRlci5wcm90b3R5cGVba2V5XTtcbiAgfVxuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIExpc3RlbiBvbiB0aGUgZ2l2ZW4gYGV2ZW50YCB3aXRoIGBmbmAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHJldHVybiB7RW1pdHRlcn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuRW1pdHRlci5wcm90b3R5cGUub24gPVxuRW1pdHRlci5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2ZW50LCBmbil7XG4gIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcyB8fCB7fTtcbiAgKHRoaXMuX2NhbGxiYWNrc1snJCcgKyBldmVudF0gPSB0aGlzLl9jYWxsYmFja3NbJyQnICsgZXZlbnRdIHx8IFtdKVxuICAgIC5wdXNoKGZuKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEFkZHMgYW4gYGV2ZW50YCBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgaW52b2tlZCBhIHNpbmdsZVxuICogdGltZSB0aGVuIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtFbWl0dGVyfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5FbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24oZXZlbnQsIGZuKXtcbiAgZnVuY3Rpb24gb24oKSB7XG4gICAgdGhpcy5vZmYoZXZlbnQsIG9uKTtcbiAgICBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgb24uZm4gPSBmbjtcbiAgdGhpcy5vbihldmVudCwgb24pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBnaXZlbiBjYWxsYmFjayBmb3IgYGV2ZW50YCBvciBhbGxcbiAqIHJlZ2lzdGVyZWQgY2FsbGJhY2tzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbkVtaXR0ZXIucHJvdG90eXBlLm9mZiA9XG5FbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9XG5FbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPVxuRW1pdHRlci5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2ZW50LCBmbil7XG4gIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcyB8fCB7fTtcblxuICAvLyBhbGxcbiAgaWYgKDAgPT0gYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIHRoaXMuX2NhbGxiYWNrcyA9IHt9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gc3BlY2lmaWMgZXZlbnRcbiAgdmFyIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrc1snJCcgKyBldmVudF07XG4gIGlmICghY2FsbGJhY2tzKSByZXR1cm4gdGhpcztcblxuICAvLyByZW1vdmUgYWxsIGhhbmRsZXJzXG4gIGlmICgxID09IGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICBkZWxldGUgdGhpcy5fY2FsbGJhY2tzWyckJyArIGV2ZW50XTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHJlbW92ZSBzcGVjaWZpYyBoYW5kbGVyXG4gIHZhciBjYjtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICBjYiA9IGNhbGxiYWNrc1tpXTtcbiAgICBpZiAoY2IgPT09IGZuIHx8IGNiLmZuID09PSBmbikge1xuICAgICAgY2FsbGJhY2tzLnNwbGljZShpLCAxKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlbW92ZSBldmVudCBzcGVjaWZpYyBhcnJheXMgZm9yIGV2ZW50IHR5cGVzIHRoYXQgbm9cbiAgLy8gb25lIGlzIHN1YnNjcmliZWQgZm9yIHRvIGF2b2lkIG1lbW9yeSBsZWFrLlxuICBpZiAoY2FsbGJhY2tzLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSB0aGlzLl9jYWxsYmFja3NbJyQnICsgZXZlbnRdO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEVtaXQgYGV2ZW50YCB3aXRoIHRoZSBnaXZlbiBhcmdzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHBhcmFtIHtNaXhlZH0gLi4uXG4gKiBAcmV0dXJuIHtFbWl0dGVyfVxuICovXG5cbkVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbihldmVudCl7XG4gIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcyB8fCB7fTtcblxuICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSlcbiAgICAsIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrc1snJCcgKyBldmVudF07XG5cbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgfVxuXG4gIGlmIChjYWxsYmFja3MpIHtcbiAgICBjYWxsYmFja3MgPSBjYWxsYmFja3Muc2xpY2UoMCk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgICAgY2FsbGJhY2tzW2ldLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gYWxpYXMgdXNlZCBmb3IgcmVzZXJ2ZWQgZXZlbnRzIChwcm90ZWN0ZWQgbWV0aG9kKVxuRW1pdHRlci5wcm90b3R5cGUuZW1pdFJlc2VydmVkID0gRW1pdHRlci5wcm90b3R5cGUuZW1pdDtcblxuLyoqXG4gKiBSZXR1cm4gYXJyYXkgb2YgY2FsbGJhY2tzIGZvciBgZXZlbnRgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbkVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uKGV2ZW50KXtcbiAgdGhpcy5fY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzIHx8IHt9O1xuICByZXR1cm4gdGhpcy5fY2FsbGJhY2tzWyckJyArIGV2ZW50XSB8fCBbXTtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhpcyBlbWl0dGVyIGhhcyBgZXZlbnRgIGhhbmRsZXJzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuRW1pdHRlci5wcm90b3R5cGUuaGFzTGlzdGVuZXJzID0gZnVuY3Rpb24oZXZlbnQpe1xuICByZXR1cm4gISEgdGhpcy5saXN0ZW5lcnMoZXZlbnQpLmxlbmd0aDtcbn07XG4iLCAiZXhwb3J0IGNvbnN0IG5leHRUaWNrID0gKCgpID0+IHtcbiAgICBjb25zdCBpc1Byb21pc2VBdmFpbGFibGUgPSB0eXBlb2YgUHJvbWlzZSA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBQcm9taXNlLnJlc29sdmUgPT09IFwiZnVuY3Rpb25cIjtcbiAgICBpZiAoaXNQcm9taXNlQXZhaWxhYmxlKSB7XG4gICAgICAgIHJldHVybiAoY2IpID0+IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oY2IpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIChjYiwgc2V0VGltZW91dEZuKSA9PiBzZXRUaW1lb3V0Rm4oY2IsIDApO1xuICAgIH1cbn0pKCk7XG5leHBvcnQgY29uc3QgZ2xvYmFsVGhpc1NoaW0gPSAoKCkgPT4ge1xuICAgIGlmICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICByZXR1cm4gd2luZG93O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcbiAgICB9XG59KSgpO1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRCaW5hcnlUeXBlID0gXCJhcnJheWJ1ZmZlclwiO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvb2tpZUphcigpIHsgfVxuIiwgImltcG9ydCB7IGdsb2JhbFRoaXNTaGltIGFzIGdsb2JhbFRoaXMgfSBmcm9tIFwiLi9nbG9iYWxzLm5vZGUuanNcIjtcbmV4cG9ydCBmdW5jdGlvbiBwaWNrKG9iaiwgLi4uYXR0cikge1xuICAgIHJldHVybiBhdHRyLnJlZHVjZSgoYWNjLCBrKSA9PiB7XG4gICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaykpIHtcbiAgICAgICAgICAgIGFjY1trXSA9IG9ialtrXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcbn1cbi8vIEtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIHJlYWwgdGltZW91dCBmdW5jdGlvbnMgc28gdGhleSBjYW4gYmUgdXNlZCB3aGVuIG92ZXJyaWRkZW5cbmNvbnN0IE5BVElWRV9TRVRfVElNRU9VVCA9IGdsb2JhbFRoaXMuc2V0VGltZW91dDtcbmNvbnN0IE5BVElWRV9DTEVBUl9USU1FT1VUID0gZ2xvYmFsVGhpcy5jbGVhclRpbWVvdXQ7XG5leHBvcnQgZnVuY3Rpb24gaW5zdGFsbFRpbWVyRnVuY3Rpb25zKG9iaiwgb3B0cykge1xuICAgIGlmIChvcHRzLnVzZU5hdGl2ZVRpbWVycykge1xuICAgICAgICBvYmouc2V0VGltZW91dEZuID0gTkFUSVZFX1NFVF9USU1FT1VULmJpbmQoZ2xvYmFsVGhpcyk7XG4gICAgICAgIG9iai5jbGVhclRpbWVvdXRGbiA9IE5BVElWRV9DTEVBUl9USU1FT1VULmJpbmQoZ2xvYmFsVGhpcyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBvYmouc2V0VGltZW91dEZuID0gZ2xvYmFsVGhpcy5zZXRUaW1lb3V0LmJpbmQoZ2xvYmFsVGhpcyk7XG4gICAgICAgIG9iai5jbGVhclRpbWVvdXRGbiA9IGdsb2JhbFRoaXMuY2xlYXJUaW1lb3V0LmJpbmQoZ2xvYmFsVGhpcyk7XG4gICAgfVxufVxuLy8gYmFzZTY0IGVuY29kZWQgYnVmZmVycyBhcmUgYWJvdXQgMzMlIGJpZ2dlciAoaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmFzZTY0KVxuY29uc3QgQkFTRTY0X09WRVJIRUFEID0gMS4zMztcbi8vIHdlIGNvdWxkIGFsc28gaGF2ZSB1c2VkIGBuZXcgQmxvYihbb2JqXSkuc2l6ZWAsIGJ1dCBpdCBpc24ndCBzdXBwb3J0ZWQgaW4gSUU5XG5leHBvcnQgZnVuY3Rpb24gYnl0ZUxlbmd0aChvYmopIHtcbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4gdXRmOExlbmd0aChvYmopO1xuICAgIH1cbiAgICAvLyBhcnJheWJ1ZmZlciBvciBibG9iXG4gICAgcmV0dXJuIE1hdGguY2VpbCgob2JqLmJ5dGVMZW5ndGggfHwgb2JqLnNpemUpICogQkFTRTY0X09WRVJIRUFEKTtcbn1cbmZ1bmN0aW9uIHV0ZjhMZW5ndGgoc3RyKSB7XG4gICAgbGV0IGMgPSAwLCBsZW5ndGggPSAwO1xuICAgIGZvciAobGV0IGkgPSAwLCBsID0gc3RyLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIGlmIChjIDwgMHg4MCkge1xuICAgICAgICAgICAgbGVuZ3RoICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYyA8IDB4ODAwKSB7XG4gICAgICAgICAgICBsZW5ndGggKz0gMjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjIDwgMHhkODAwIHx8IGMgPj0gMHhlMDAwKSB7XG4gICAgICAgICAgICBsZW5ndGggKz0gMztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIGxlbmd0aCArPSA0O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsZW5ndGg7XG59XG4vKipcbiAqIEdlbmVyYXRlcyBhIHJhbmRvbSA4LWNoYXJhY3RlcnMgc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmFuZG9tU3RyaW5nKCkge1xuICAgIHJldHVybiAoRGF0ZS5ub3coKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDMpICtcbiAgICAgICAgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDUpKTtcbn1cbiIsICIvLyBpbXBvcnRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9nYWxrbi9xdWVyeXN0cmluZ1xuLyoqXG4gKiBDb21waWxlcyBhIHF1ZXJ5c3RyaW5nXG4gKiBSZXR1cm5zIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0XG4gKlxuICogQHBhcmFtIHtPYmplY3R9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZShvYmopIHtcbiAgICBsZXQgc3RyID0gJyc7XG4gICAgZm9yIChsZXQgaSBpbiBvYmopIHtcbiAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgICAgaWYgKHN0ci5sZW5ndGgpXG4gICAgICAgICAgICAgICAgc3RyICs9ICcmJztcbiAgICAgICAgICAgIHN0ciArPSBlbmNvZGVVUklDb21wb25lbnQoaSkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQob2JqW2ldKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RyO1xufVxuLyoqXG4gKiBQYXJzZXMgYSBzaW1wbGUgcXVlcnlzdHJpbmcgaW50byBhbiBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlKHFzKSB7XG4gICAgbGV0IHFyeSA9IHt9O1xuICAgIGxldCBwYWlycyA9IHFzLnNwbGl0KCcmJyk7XG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBwYWlycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgbGV0IHBhaXIgPSBwYWlyc1tpXS5zcGxpdCgnPScpO1xuICAgICAgICBxcnlbZGVjb2RlVVJJQ29tcG9uZW50KHBhaXJbMF0pXSA9IGRlY29kZVVSSUNvbXBvbmVudChwYWlyWzFdKTtcbiAgICB9XG4gICAgcmV0dXJuIHFyeTtcbn1cbiIsICJpbXBvcnQgeyBkZWNvZGVQYWNrZXQgfSBmcm9tIFwiZW5naW5lLmlvLXBhcnNlclwiO1xuaW1wb3J0IHsgRW1pdHRlciB9IGZyb20gXCJAc29ja2V0LmlvL2NvbXBvbmVudC1lbWl0dGVyXCI7XG5pbXBvcnQgeyBpbnN0YWxsVGltZXJGdW5jdGlvbnMgfSBmcm9tIFwiLi91dGlsLmpzXCI7XG5pbXBvcnQgeyBlbmNvZGUgfSBmcm9tIFwiLi9jb250cmliL3BhcnNlcXMuanNcIjtcbmV4cG9ydCBjbGFzcyBUcmFuc3BvcnRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihyZWFzb24sIGRlc2NyaXB0aW9uLCBjb250ZXh0KSB7XG4gICAgICAgIHN1cGVyKHJlYXNvbik7XG4gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy50eXBlID0gXCJUcmFuc3BvcnRFcnJvclwiO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBUcmFuc3BvcnQgZXh0ZW5kcyBFbWl0dGVyIHtcbiAgICAvKipcbiAgICAgKiBUcmFuc3BvcnQgYWJzdHJhY3QgY29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG4gICAgICAgIGluc3RhbGxUaW1lckZ1bmN0aW9ucyh0aGlzLCBvcHRzKTtcbiAgICAgICAgdGhpcy5vcHRzID0gb3B0cztcbiAgICAgICAgdGhpcy5xdWVyeSA9IG9wdHMucXVlcnk7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gb3B0cy5zb2NrZXQ7XG4gICAgICAgIHRoaXMuc3VwcG9ydHNCaW5hcnkgPSAhb3B0cy5mb3JjZUJhc2U2NDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW1pdHMgYW4gZXJyb3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVhc29uXG4gICAgICogQHBhcmFtIGRlc2NyaXB0aW9uXG4gICAgICogQHBhcmFtIGNvbnRleHQgLSB0aGUgZXJyb3IgY29udGV4dFxuICAgICAqIEByZXR1cm4ge1RyYW5zcG9ydH0gZm9yIGNoYWluaW5nXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIG9uRXJyb3IocmVhc29uLCBkZXNjcmlwdGlvbiwgY29udGV4dCkge1xuICAgICAgICBzdXBlci5lbWl0UmVzZXJ2ZWQoXCJlcnJvclwiLCBuZXcgVHJhbnNwb3J0RXJyb3IocmVhc29uLCBkZXNjcmlwdGlvbiwgY29udGV4dCkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogT3BlbnMgdGhlIHRyYW5zcG9ydC5cbiAgICAgKi9cbiAgICBvcGVuKCkge1xuICAgICAgICB0aGlzLnJlYWR5U3RhdGUgPSBcIm9wZW5pbmdcIjtcbiAgICAgICAgdGhpcy5kb09wZW4oKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb3NlcyB0aGUgdHJhbnNwb3J0LlxuICAgICAqL1xuICAgIGNsb3NlKCkge1xuICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09PSBcIm9wZW5pbmdcIiB8fCB0aGlzLnJlYWR5U3RhdGUgPT09IFwib3BlblwiKSB7XG4gICAgICAgICAgICB0aGlzLmRvQ2xvc2UoKTtcbiAgICAgICAgICAgIHRoaXMub25DbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kcyBtdWx0aXBsZSBwYWNrZXRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFja2V0c1xuICAgICAqL1xuICAgIHNlbmQocGFja2V0cykge1xuICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09PSBcIm9wZW5cIikge1xuICAgICAgICAgICAgdGhpcy53cml0ZShwYWNrZXRzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHRoaXMgbWlnaHQgaGFwcGVuIGlmIHRoZSB0cmFuc3BvcnQgd2FzIHNpbGVudGx5IGNsb3NlZCBpbiB0aGUgYmVmb3JldW5sb2FkIGV2ZW50IGhhbmRsZXJcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiBvcGVuXG4gICAgICpcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgb25PcGVuKCkge1xuICAgICAgICB0aGlzLnJlYWR5U3RhdGUgPSBcIm9wZW5cIjtcbiAgICAgICAgdGhpcy53cml0YWJsZSA9IHRydWU7XG4gICAgICAgIHN1cGVyLmVtaXRSZXNlcnZlZChcIm9wZW5cIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aXRoIGRhdGEuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZGF0YVxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBvbkRhdGEoZGF0YSkge1xuICAgICAgICBjb25zdCBwYWNrZXQgPSBkZWNvZGVQYWNrZXQoZGF0YSwgdGhpcy5zb2NrZXQuYmluYXJ5VHlwZSk7XG4gICAgICAgIHRoaXMub25QYWNrZXQocGFja2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdpdGggYSBkZWNvZGVkIHBhY2tldC5cbiAgICAgKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBvblBhY2tldChwYWNrZXQpIHtcbiAgICAgICAgc3VwZXIuZW1pdFJlc2VydmVkKFwicGFja2V0XCIsIHBhY2tldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIGNsb3NlLlxuICAgICAqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIG9uQ2xvc2UoZGV0YWlscykge1xuICAgICAgICB0aGlzLnJlYWR5U3RhdGUgPSBcImNsb3NlZFwiO1xuICAgICAgICBzdXBlci5lbWl0UmVzZXJ2ZWQoXCJjbG9zZVwiLCBkZXRhaWxzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGF1c2VzIHRoZSB0cmFuc3BvcnQsIGluIG9yZGVyIG5vdCB0byBsb3NlIHBhY2tldHMgZHVyaW5nIGFuIHVwZ3JhZGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb25QYXVzZVxuICAgICAqL1xuICAgIHBhdXNlKG9uUGF1c2UpIHsgfVxuICAgIGNyZWF0ZVVyaShzY2hlbWEsIHF1ZXJ5ID0ge30pIHtcbiAgICAgICAgcmV0dXJuIChzY2hlbWEgK1xuICAgICAgICAgICAgXCI6Ly9cIiArXG4gICAgICAgICAgICB0aGlzLl9ob3N0bmFtZSgpICtcbiAgICAgICAgICAgIHRoaXMuX3BvcnQoKSArXG4gICAgICAgICAgICB0aGlzLm9wdHMucGF0aCArXG4gICAgICAgICAgICB0aGlzLl9xdWVyeShxdWVyeSkpO1xuICAgIH1cbiAgICBfaG9zdG5hbWUoKSB7XG4gICAgICAgIGNvbnN0IGhvc3RuYW1lID0gdGhpcy5vcHRzLmhvc3RuYW1lO1xuICAgICAgICByZXR1cm4gaG9zdG5hbWUuaW5kZXhPZihcIjpcIikgPT09IC0xID8gaG9zdG5hbWUgOiBcIltcIiArIGhvc3RuYW1lICsgXCJdXCI7XG4gICAgfVxuICAgIF9wb3J0KCkge1xuICAgICAgICBpZiAodGhpcy5vcHRzLnBvcnQgJiZcbiAgICAgICAgICAgICgodGhpcy5vcHRzLnNlY3VyZSAmJiBOdW1iZXIodGhpcy5vcHRzLnBvcnQgIT09IDQ0MykpIHx8XG4gICAgICAgICAgICAgICAgKCF0aGlzLm9wdHMuc2VjdXJlICYmIE51bWJlcih0aGlzLm9wdHMucG9ydCkgIT09IDgwKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBcIjpcIiArIHRoaXMub3B0cy5wb3J0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX3F1ZXJ5KHF1ZXJ5KSB7XG4gICAgICAgIGNvbnN0IGVuY29kZWRRdWVyeSA9IGVuY29kZShxdWVyeSk7XG4gICAgICAgIHJldHVybiBlbmNvZGVkUXVlcnkubGVuZ3RoID8gXCI/XCIgKyBlbmNvZGVkUXVlcnkgOiBcIlwiO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBUcmFuc3BvcnQgfSBmcm9tIFwiLi4vdHJhbnNwb3J0LmpzXCI7XG5pbXBvcnQgeyByYW5kb21TdHJpbmcgfSBmcm9tIFwiLi4vdXRpbC5qc1wiO1xuaW1wb3J0IHsgZW5jb2RlUGF5bG9hZCwgZGVjb2RlUGF5bG9hZCB9IGZyb20gXCJlbmdpbmUuaW8tcGFyc2VyXCI7XG5leHBvcnQgY2xhc3MgUG9sbGluZyBleHRlbmRzIFRyYW5zcG9ydCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuX3BvbGxpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgZ2V0IG5hbWUoKSB7XG4gICAgICAgIHJldHVybiBcInBvbGxpbmdcIjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogT3BlbnMgdGhlIHNvY2tldCAodHJpZ2dlcnMgcG9sbGluZykuIFdlIHdyaXRlIGEgUElORyBtZXNzYWdlIHRvIGRldGVybWluZVxuICAgICAqIHdoZW4gdGhlIHRyYW5zcG9ydCBpcyBvcGVuLlxuICAgICAqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIGRvT3BlbigpIHtcbiAgICAgICAgdGhpcy5fcG9sbCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXVzZXMgcG9sbGluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uUGF1c2UgLSBjYWxsYmFjayB1cG9uIGJ1ZmZlcnMgYXJlIGZsdXNoZWQgYW5kIHRyYW5zcG9ydCBpcyBwYXVzZWRcbiAgICAgKiBAcGFja2FnZVxuICAgICAqL1xuICAgIHBhdXNlKG9uUGF1c2UpIHtcbiAgICAgICAgdGhpcy5yZWFkeVN0YXRlID0gXCJwYXVzaW5nXCI7XG4gICAgICAgIGNvbnN0IHBhdXNlID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWFkeVN0YXRlID0gXCJwYXVzZWRcIjtcbiAgICAgICAgICAgIG9uUGF1c2UoKTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMuX3BvbGxpbmcgfHwgIXRoaXMud3JpdGFibGUpIHtcbiAgICAgICAgICAgIGxldCB0b3RhbCA9IDA7XG4gICAgICAgICAgICBpZiAodGhpcy5fcG9sbGluZykge1xuICAgICAgICAgICAgICAgIHRvdGFsKys7XG4gICAgICAgICAgICAgICAgdGhpcy5vbmNlKFwicG9sbENvbXBsZXRlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgLS10b3RhbCB8fCBwYXVzZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLndyaXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgdG90YWwrKztcbiAgICAgICAgICAgICAgICB0aGlzLm9uY2UoXCJkcmFpblwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIC0tdG90YWwgfHwgcGF1c2UoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBhdXNlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RhcnRzIHBvbGxpbmcgY3ljbGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9wb2xsKCkge1xuICAgICAgICB0aGlzLl9wb2xsaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kb1BvbGwoKTtcbiAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJwb2xsXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPdmVybG9hZHMgb25EYXRhIHRvIGRldGVjdCBwYXlsb2Fkcy5cbiAgICAgKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBvbkRhdGEoZGF0YSkge1xuICAgICAgICBjb25zdCBjYWxsYmFjayA9IChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIC8vIGlmIGl0cyB0aGUgZmlyc3QgbWVzc2FnZSB3ZSBjb25zaWRlciB0aGUgdHJhbnNwb3J0IG9wZW5cbiAgICAgICAgICAgIGlmIChcIm9wZW5pbmdcIiA9PT0gdGhpcy5yZWFkeVN0YXRlICYmIHBhY2tldC50eXBlID09PSBcIm9wZW5cIikge1xuICAgICAgICAgICAgICAgIHRoaXMub25PcGVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpZiBpdHMgYSBjbG9zZSBwYWNrZXQsIHdlIGNsb3NlIHRoZSBvbmdvaW5nIHJlcXVlc3RzXG4gICAgICAgICAgICBpZiAoXCJjbG9zZVwiID09PSBwYWNrZXQudHlwZSkge1xuICAgICAgICAgICAgICAgIHRoaXMub25DbG9zZSh7IGRlc2NyaXB0aW9uOiBcInRyYW5zcG9ydCBjbG9zZWQgYnkgdGhlIHNlcnZlclwiIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIG90aGVyd2lzZSBieXBhc3Mgb25EYXRhIGFuZCBoYW5kbGUgdGhlIG1lc3NhZ2VcbiAgICAgICAgICAgIHRoaXMub25QYWNrZXQocGFja2V0KTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gZGVjb2RlIHBheWxvYWRcbiAgICAgICAgZGVjb2RlUGF5bG9hZChkYXRhLCB0aGlzLnNvY2tldC5iaW5hcnlUeXBlKS5mb3JFYWNoKGNhbGxiYWNrKTtcbiAgICAgICAgLy8gaWYgYW4gZXZlbnQgZGlkIG5vdCB0cmlnZ2VyIGNsb3NpbmdcbiAgICAgICAgaWYgKFwiY2xvc2VkXCIgIT09IHRoaXMucmVhZHlTdGF0ZSkge1xuICAgICAgICAgICAgLy8gaWYgd2UgZ290IGRhdGEgd2UncmUgbm90IHBvbGxpbmdcbiAgICAgICAgICAgIHRoaXMuX3BvbGxpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwicG9sbENvbXBsZXRlXCIpO1xuICAgICAgICAgICAgaWYgKFwib3BlblwiID09PSB0aGlzLnJlYWR5U3RhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wb2xsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb3IgcG9sbGluZywgc2VuZCBhIGNsb3NlIHBhY2tldC5cbiAgICAgKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBkb0Nsb3NlKCkge1xuICAgICAgICBjb25zdCBjbG9zZSA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMud3JpdGUoW3sgdHlwZTogXCJjbG9zZVwiIH1dKTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKFwib3BlblwiID09PSB0aGlzLnJlYWR5U3RhdGUpIHtcbiAgICAgICAgICAgIGNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBpbiBjYXNlIHdlJ3JlIHRyeWluZyB0byBjbG9zZSB3aGlsZVxuICAgICAgICAgICAgLy8gaGFuZHNoYWtpbmcgaXMgaW4gcHJvZ3Jlc3MgKEdILTE2NClcbiAgICAgICAgICAgIHRoaXMub25jZShcIm9wZW5cIiwgY2xvc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhIHBhY2tldHMgcGF5bG9hZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhY2tldHMgLSBkYXRhIHBhY2tldHNcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgd3JpdGUocGFja2V0cykge1xuICAgICAgICB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG4gICAgICAgIGVuY29kZVBheWxvYWQocGFja2V0cywgKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZG9Xcml0ZShkYXRhLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy53cml0YWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJkcmFpblwiKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIHVyaSBmb3IgY29ubmVjdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdXJpKCkge1xuICAgICAgICBjb25zdCBzY2hlbWEgPSB0aGlzLm9wdHMuc2VjdXJlID8gXCJodHRwc1wiIDogXCJodHRwXCI7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5xdWVyeSB8fCB7fTtcbiAgICAgICAgLy8gY2FjaGUgYnVzdGluZyBpcyBmb3JjZWRcbiAgICAgICAgaWYgKGZhbHNlICE9PSB0aGlzLm9wdHMudGltZXN0YW1wUmVxdWVzdHMpIHtcbiAgICAgICAgICAgIHF1ZXJ5W3RoaXMub3B0cy50aW1lc3RhbXBQYXJhbV0gPSByYW5kb21TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuc3VwcG9ydHNCaW5hcnkgJiYgIXF1ZXJ5LnNpZCkge1xuICAgICAgICAgICAgcXVlcnkuYjY0ID0gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVVcmkoc2NoZW1hLCBxdWVyeSk7XG4gICAgfVxufVxuIiwgIi8vIGltcG9ydGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvbmVudC9oYXMtY29yc1xubGV0IHZhbHVlID0gZmFsc2U7XG50cnkge1xuICAgIHZhbHVlID0gdHlwZW9mIFhNTEh0dHBSZXF1ZXN0ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAnd2l0aENyZWRlbnRpYWxzJyBpbiBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbn1cbmNhdGNoIChlcnIpIHtcbiAgICAvLyBpZiBYTUxIdHRwIHN1cHBvcnQgaXMgZGlzYWJsZWQgaW4gSUUgdGhlbiBpdCB3aWxsIHRocm93XG4gICAgLy8gd2hlbiB0cnlpbmcgdG8gY3JlYXRlXG59XG5leHBvcnQgY29uc3QgaGFzQ09SUyA9IHZhbHVlO1xuIiwgImltcG9ydCB7IFBvbGxpbmcgfSBmcm9tIFwiLi9wb2xsaW5nLmpzXCI7XG5pbXBvcnQgeyBFbWl0dGVyIH0gZnJvbSBcIkBzb2NrZXQuaW8vY29tcG9uZW50LWVtaXR0ZXJcIjtcbmltcG9ydCB7IGluc3RhbGxUaW1lckZ1bmN0aW9ucywgcGljayB9IGZyb20gXCIuLi91dGlsLmpzXCI7XG5pbXBvcnQgeyBnbG9iYWxUaGlzU2hpbSBhcyBnbG9iYWxUaGlzIH0gZnJvbSBcIi4uL2dsb2JhbHMubm9kZS5qc1wiO1xuaW1wb3J0IHsgaGFzQ09SUyB9IGZyb20gXCIuLi9jb250cmliL2hhcy1jb3JzLmpzXCI7XG5mdW5jdGlvbiBlbXB0eSgpIHsgfVxuZXhwb3J0IGNsYXNzIEJhc2VYSFIgZXh0ZW5kcyBQb2xsaW5nIHtcbiAgICAvKipcbiAgICAgKiBYSFIgUG9sbGluZyBjb25zdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzXG4gICAgICogQHBhY2thZ2VcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuICAgICAgICBpZiAodHlwZW9mIGxvY2F0aW9uICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICBjb25zdCBpc1NTTCA9IFwiaHR0cHM6XCIgPT09IGxvY2F0aW9uLnByb3RvY29sO1xuICAgICAgICAgICAgbGV0IHBvcnQgPSBsb2NhdGlvbi5wb3J0O1xuICAgICAgICAgICAgLy8gc29tZSB1c2VyIGFnZW50cyBoYXZlIGVtcHR5IGBsb2NhdGlvbi5wb3J0YFxuICAgICAgICAgICAgaWYgKCFwb3J0KSB7XG4gICAgICAgICAgICAgICAgcG9ydCA9IGlzU1NMID8gXCI0NDNcIiA6IFwiODBcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMueGQgPVxuICAgICAgICAgICAgICAgICh0eXBlb2YgbG9jYXRpb24gIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgb3B0cy5ob3N0bmFtZSAhPT0gbG9jYXRpb24uaG9zdG5hbWUpIHx8XG4gICAgICAgICAgICAgICAgICAgIHBvcnQgIT09IG9wdHMucG9ydDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kcyBkYXRhLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGRhdGEgdG8gc2VuZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsZWQgdXBvbiBmbHVzaC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGRvV3JpdGUoZGF0YSwgZm4pIHtcbiAgICAgICAgY29uc3QgcmVxID0gdGhpcy5yZXF1ZXN0KHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICB9KTtcbiAgICAgICAgcmVxLm9uKFwic3VjY2Vzc1wiLCBmbik7XG4gICAgICAgIHJlcS5vbihcImVycm9yXCIsICh4aHJTdGF0dXMsIGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25FcnJvcihcInhociBwb3N0IGVycm9yXCIsIHhoclN0YXR1cywgY29udGV4dCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdGFydHMgYSBwb2xsIGN5Y2xlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBkb1BvbGwoKSB7XG4gICAgICAgIGNvbnN0IHJlcSA9IHRoaXMucmVxdWVzdCgpO1xuICAgICAgICByZXEub24oXCJkYXRhXCIsIHRoaXMub25EYXRhLmJpbmQodGhpcykpO1xuICAgICAgICByZXEub24oXCJlcnJvclwiLCAoeGhyU3RhdHVzLCBjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uRXJyb3IoXCJ4aHIgcG9sbCBlcnJvclwiLCB4aHJTdGF0dXMsIGNvbnRleHQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wb2xsWGhyID0gcmVxO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBSZXF1ZXN0IGV4dGVuZHMgRW1pdHRlciB7XG4gICAgLyoqXG4gICAgICogUmVxdWVzdCBjb25zdHJ1Y3RvclxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcGFja2FnZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNyZWF0ZVJlcXVlc3QsIHVyaSwgb3B0cykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNyZWF0ZVJlcXVlc3QgPSBjcmVhdGVSZXF1ZXN0O1xuICAgICAgICBpbnN0YWxsVGltZXJGdW5jdGlvbnModGhpcywgb3B0cyk7XG4gICAgICAgIHRoaXMuX29wdHMgPSBvcHRzO1xuICAgICAgICB0aGlzLl9tZXRob2QgPSBvcHRzLm1ldGhvZCB8fCBcIkdFVFwiO1xuICAgICAgICB0aGlzLl91cmkgPSB1cmk7XG4gICAgICAgIHRoaXMuX2RhdGEgPSB1bmRlZmluZWQgIT09IG9wdHMuZGF0YSA/IG9wdHMuZGF0YSA6IG51bGw7XG4gICAgICAgIHRoaXMuX2NyZWF0ZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBYSFIgb2JqZWN0IGFuZCBzZW5kcyB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2NyZWF0ZSgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBvcHRzID0gcGljayh0aGlzLl9vcHRzLCBcImFnZW50XCIsIFwicGZ4XCIsIFwia2V5XCIsIFwicGFzc3BocmFzZVwiLCBcImNlcnRcIiwgXCJjYVwiLCBcImNpcGhlcnNcIiwgXCJyZWplY3RVbmF1dGhvcml6ZWRcIiwgXCJhdXRvVW5yZWZcIik7XG4gICAgICAgIG9wdHMueGRvbWFpbiA9ICEhdGhpcy5fb3B0cy54ZDtcbiAgICAgICAgY29uc3QgeGhyID0gKHRoaXMuX3hociA9IHRoaXMuY3JlYXRlUmVxdWVzdChvcHRzKSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB4aHIub3Blbih0aGlzLl9tZXRob2QsIHRoaXMuX3VyaSwgdHJ1ZSk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRzLmV4dHJhSGVhZGVycykge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIHhoci5zZXREaXNhYmxlSGVhZGVyQ2hlY2sgJiYgeGhyLnNldERpc2FibGVIZWFkZXJDaGVjayh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSBpbiB0aGlzLl9vcHRzLmV4dHJhSGVhZGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX29wdHMuZXh0cmFIZWFkZXJzLmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaSwgdGhpcy5fb3B0cy5leHRyYUhlYWRlcnNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHsgfVxuICAgICAgICAgICAgaWYgKFwiUE9TVFwiID09PSB0aGlzLl9tZXRob2QpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtdHlwZVwiLCBcInRleHQvcGxhaW47Y2hhcnNldD1VVEYtOFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkFjY2VwdFwiLCBcIiovKlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7IH1cbiAgICAgICAgICAgIChfYSA9IHRoaXMuX29wdHMuY29va2llSmFyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYWRkQ29va2llcyh4aHIpO1xuICAgICAgICAgICAgLy8gaWU2IGNoZWNrXG4gICAgICAgICAgICBpZiAoXCJ3aXRoQ3JlZGVudGlhbHNcIiBpbiB4aHIpIHtcbiAgICAgICAgICAgICAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gdGhpcy5fb3B0cy53aXRoQ3JlZGVudGlhbHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fb3B0cy5yZXF1ZXN0VGltZW91dCkge1xuICAgICAgICAgICAgICAgIHhoci50aW1lb3V0ID0gdGhpcy5fb3B0cy5yZXF1ZXN0VGltZW91dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gMykge1xuICAgICAgICAgICAgICAgICAgICAoX2EgPSB0aGlzLl9vcHRzLmNvb2tpZUphcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnBhcnNlQ29va2llcyhcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoXCJzZXQtY29va2llXCIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKDQgIT09IHhoci5yZWFkeVN0YXRlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgaWYgKDIwMCA9PT0geGhyLnN0YXR1cyB8fCAxMjIzID09PSB4aHIuc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uTG9hZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBgZXJyb3JgIGV2ZW50IGhhbmRsZXIgdGhhdCdzIHVzZXItc2V0XG4gICAgICAgICAgICAgICAgICAgIC8vIGRvZXMgbm90IHRocm93IGluIHRoZSBzYW1lIHRpY2sgYW5kIGdldHMgY2F1Z2h0IGhlcmVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRUaW1lb3V0Rm4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25FcnJvcih0eXBlb2YgeGhyLnN0YXR1cyA9PT0gXCJudW1iZXJcIiA/IHhoci5zdGF0dXMgOiAwKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHhoci5zZW5kKHRoaXMuX2RhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBOZWVkIHRvIGRlZmVyIHNpbmNlIC5jcmVhdGUoKSBpcyBjYWxsZWQgZGlyZWN0bHkgZnJvbSB0aGUgY29uc3RydWN0b3JcbiAgICAgICAgICAgIC8vIGFuZCB0aHVzIHRoZSAnZXJyb3InIGV2ZW50IGNhbiBvbmx5IGJlIG9ubHkgYm91bmQgKmFmdGVyKiB0aGlzIGV4Y2VwdGlvblxuICAgICAgICAgICAgLy8gb2NjdXJzLiAgVGhlcmVmb3JlLCBhbHNvLCB3ZSBjYW5ub3QgdGhyb3cgaGVyZSBhdCBhbGwuXG4gICAgICAgICAgICB0aGlzLnNldFRpbWVvdXRGbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25FcnJvcihlKTtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRoaXMuX2luZGV4ID0gUmVxdWVzdC5yZXF1ZXN0c0NvdW50Kys7XG4gICAgICAgICAgICBSZXF1ZXN0LnJlcXVlc3RzW3RoaXMuX2luZGV4XSA9IHRoaXM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHVwb24gZXJyb3IuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9vbkVycm9yKGVycikge1xuICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImVycm9yXCIsIGVyciwgdGhpcy5feGhyKTtcbiAgICAgICAgdGhpcy5fY2xlYW51cCh0cnVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYW5zIHVwIGhvdXNlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfY2xlYW51cChmcm9tRXJyb3IpIHtcbiAgICAgICAgaWYgKFwidW5kZWZpbmVkXCIgPT09IHR5cGVvZiB0aGlzLl94aHIgfHwgbnVsbCA9PT0gdGhpcy5feGhyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5feGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGVtcHR5O1xuICAgICAgICBpZiAoZnJvbUVycm9yKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3hoci5hYm9ydCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHsgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBSZXF1ZXN0LnJlcXVlc3RzW3RoaXMuX2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl94aHIgPSBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiBsb2FkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfb25Mb2FkKCkge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5feGhyLnJlc3BvbnNlVGV4dDtcbiAgICAgICAgaWYgKGRhdGEgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwiZGF0YVwiLCBkYXRhKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwic3VjY2Vzc1wiKTtcbiAgICAgICAgICAgIHRoaXMuX2NsZWFudXAoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBYm9ydHMgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcGFja2FnZVxuICAgICAqL1xuICAgIGFib3J0KCkge1xuICAgICAgICB0aGlzLl9jbGVhbnVwKCk7XG4gICAgfVxufVxuUmVxdWVzdC5yZXF1ZXN0c0NvdW50ID0gMDtcblJlcXVlc3QucmVxdWVzdHMgPSB7fTtcbi8qKlxuICogQWJvcnRzIHBlbmRpbmcgcmVxdWVzdHMgd2hlbiB1bmxvYWRpbmcgdGhlIHdpbmRvdy4gVGhpcyBpcyBuZWVkZWQgdG8gcHJldmVudFxuICogbWVtb3J5IGxlYWtzIChlLmcuIHdoZW4gdXNpbmcgSUUpIGFuZCB0byBlbnN1cmUgdGhhdCBubyBzcHVyaW91cyBlcnJvciBpc1xuICogZW1pdHRlZC5cbiAqL1xuaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAodHlwZW9mIGF0dGFjaEV2ZW50ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBhdHRhY2hFdmVudChcIm9udW5sb2FkXCIsIHVubG9hZEhhbmRsZXIpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgYWRkRXZlbnRMaXN0ZW5lciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGNvbnN0IHRlcm1pbmF0aW9uRXZlbnQgPSBcIm9ucGFnZWhpZGVcIiBpbiBnbG9iYWxUaGlzID8gXCJwYWdlaGlkZVwiIDogXCJ1bmxvYWRcIjtcbiAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcih0ZXJtaW5hdGlvbkV2ZW50LCB1bmxvYWRIYW5kbGVyLCBmYWxzZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gdW5sb2FkSGFuZGxlcigpIHtcbiAgICBmb3IgKGxldCBpIGluIFJlcXVlc3QucmVxdWVzdHMpIHtcbiAgICAgICAgaWYgKFJlcXVlc3QucmVxdWVzdHMuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgIFJlcXVlc3QucmVxdWVzdHNbaV0uYWJvcnQoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmNvbnN0IGhhc1hIUjIgPSAoZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHhociA9IG5ld1JlcXVlc3Qoe1xuICAgICAgICB4ZG9tYWluOiBmYWxzZSxcbiAgICB9KTtcbiAgICByZXR1cm4geGhyICYmIHhoci5yZXNwb25zZVR5cGUgIT09IG51bGw7XG59KSgpO1xuLyoqXG4gKiBIVFRQIGxvbmctcG9sbGluZyBiYXNlZCBvbiB0aGUgYnVpbHQtaW4gYFhNTEh0dHBSZXF1ZXN0YCBvYmplY3QuXG4gKlxuICogVXNhZ2U6IGJyb3dzZXJcbiAqXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9YTUxIdHRwUmVxdWVzdFxuICovXG5leHBvcnQgY2xhc3MgWEhSIGV4dGVuZHMgQmFzZVhIUiB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgY29uc3QgZm9yY2VCYXNlNjQgPSBvcHRzICYmIG9wdHMuZm9yY2VCYXNlNjQ7XG4gICAgICAgIHRoaXMuc3VwcG9ydHNCaW5hcnkgPSBoYXNYSFIyICYmICFmb3JjZUJhc2U2NDtcbiAgICB9XG4gICAgcmVxdWVzdChvcHRzID0ge30pIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihvcHRzLCB7IHhkOiB0aGlzLnhkIH0sIHRoaXMub3B0cyk7XG4gICAgICAgIHJldHVybiBuZXcgUmVxdWVzdChuZXdSZXF1ZXN0LCB0aGlzLnVyaSgpLCBvcHRzKTtcbiAgICB9XG59XG5mdW5jdGlvbiBuZXdSZXF1ZXN0KG9wdHMpIHtcbiAgICBjb25zdCB4ZG9tYWluID0gb3B0cy54ZG9tYWluO1xuICAgIC8vIFhNTEh0dHBSZXF1ZXN0IGNhbiBiZSBkaXNhYmxlZCBvbiBJRVxuICAgIHRyeSB7XG4gICAgICAgIGlmIChcInVuZGVmaW5lZFwiICE9PSB0eXBlb2YgWE1MSHR0cFJlcXVlc3QgJiYgKCF4ZG9tYWluIHx8IGhhc0NPUlMpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGUpIHsgfVxuICAgIGlmICgheGRvbWFpbikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBnbG9iYWxUaGlzW1tcIkFjdGl2ZVwiXS5jb25jYXQoXCJPYmplY3RcIikuam9pbihcIlhcIildKFwiTWljcm9zb2Z0LlhNTEhUVFBcIik7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHsgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBUcmFuc3BvcnQgfSBmcm9tIFwiLi4vdHJhbnNwb3J0LmpzXCI7XG5pbXBvcnQgeyBwaWNrLCByYW5kb21TdHJpbmcgfSBmcm9tIFwiLi4vdXRpbC5qc1wiO1xuaW1wb3J0IHsgZW5jb2RlUGFja2V0IH0gZnJvbSBcImVuZ2luZS5pby1wYXJzZXJcIjtcbmltcG9ydCB7IGdsb2JhbFRoaXNTaGltIGFzIGdsb2JhbFRoaXMsIG5leHRUaWNrIH0gZnJvbSBcIi4uL2dsb2JhbHMubm9kZS5qc1wiO1xuLy8gZGV0ZWN0IFJlYWN0TmF0aXZlIGVudmlyb25tZW50XG5jb25zdCBpc1JlYWN0TmF0aXZlID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgIHR5cGVvZiBuYXZpZ2F0b3IucHJvZHVjdCA9PT0gXCJzdHJpbmdcIiAmJlxuICAgIG5hdmlnYXRvci5wcm9kdWN0LnRvTG93ZXJDYXNlKCkgPT09IFwicmVhY3RuYXRpdmVcIjtcbmV4cG9ydCBjbGFzcyBCYXNlV1MgZXh0ZW5kcyBUcmFuc3BvcnQge1xuICAgIGdldCBuYW1lKCkge1xuICAgICAgICByZXR1cm4gXCJ3ZWJzb2NrZXRcIjtcbiAgICB9XG4gICAgZG9PcGVuKCkge1xuICAgICAgICBjb25zdCB1cmkgPSB0aGlzLnVyaSgpO1xuICAgICAgICBjb25zdCBwcm90b2NvbHMgPSB0aGlzLm9wdHMucHJvdG9jb2xzO1xuICAgICAgICAvLyBSZWFjdCBOYXRpdmUgb25seSBzdXBwb3J0cyB0aGUgJ2hlYWRlcnMnIG9wdGlvbiwgYW5kIHdpbGwgcHJpbnQgYSB3YXJuaW5nIGlmIGFueXRoaW5nIGVsc2UgaXMgcGFzc2VkXG4gICAgICAgIGNvbnN0IG9wdHMgPSBpc1JlYWN0TmF0aXZlXG4gICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICA6IHBpY2sodGhpcy5vcHRzLCBcImFnZW50XCIsIFwicGVyTWVzc2FnZURlZmxhdGVcIiwgXCJwZnhcIiwgXCJrZXlcIiwgXCJwYXNzcGhyYXNlXCIsIFwiY2VydFwiLCBcImNhXCIsIFwiY2lwaGVyc1wiLCBcInJlamVjdFVuYXV0aG9yaXplZFwiLCBcImxvY2FsQWRkcmVzc1wiLCBcInByb3RvY29sVmVyc2lvblwiLCBcIm9yaWdpblwiLCBcIm1heFBheWxvYWRcIiwgXCJmYW1pbHlcIiwgXCJjaGVja1NlcnZlcklkZW50aXR5XCIpO1xuICAgICAgICBpZiAodGhpcy5vcHRzLmV4dHJhSGVhZGVycykge1xuICAgICAgICAgICAgb3B0cy5oZWFkZXJzID0gdGhpcy5vcHRzLmV4dHJhSGVhZGVycztcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy53cyA9IHRoaXMuY3JlYXRlU29ja2V0KHVyaSwgcHJvdG9jb2xzLCBvcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbWl0UmVzZXJ2ZWQoXCJlcnJvclwiLCBlcnIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMud3MuYmluYXJ5VHlwZSA9IHRoaXMuc29ja2V0LmJpbmFyeVR5cGU7XG4gICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBldmVudCBsaXN0ZW5lcnMgdG8gdGhlIHNvY2tldFxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBhZGRFdmVudExpc3RlbmVycygpIHtcbiAgICAgICAgdGhpcy53cy5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRzLmF1dG9VbnJlZikge1xuICAgICAgICAgICAgICAgIHRoaXMud3MuX3NvY2tldC51bnJlZigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vbk9wZW4oKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy53cy5vbmNsb3NlID0gKGNsb3NlRXZlbnQpID0+IHRoaXMub25DbG9zZSh7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJ3ZWJzb2NrZXQgY29ubmVjdGlvbiBjbG9zZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IGNsb3NlRXZlbnQsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLndzLm9ubWVzc2FnZSA9IChldikgPT4gdGhpcy5vbkRhdGEoZXYuZGF0YSk7XG4gICAgICAgIHRoaXMud3Mub25lcnJvciA9IChlKSA9PiB0aGlzLm9uRXJyb3IoXCJ3ZWJzb2NrZXQgZXJyb3JcIiwgZSk7XG4gICAgfVxuICAgIHdyaXRlKHBhY2tldHMpIHtcbiAgICAgICAgdGhpcy53cml0YWJsZSA9IGZhbHNlO1xuICAgICAgICAvLyBlbmNvZGVQYWNrZXQgZWZmaWNpZW50IGFzIGl0IHVzZXMgV1MgZnJhbWluZ1xuICAgICAgICAvLyBubyBuZWVkIGZvciBlbmNvZGVQYXlsb2FkXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFja2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgcGFja2V0ID0gcGFja2V0c1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RQYWNrZXQgPSBpID09PSBwYWNrZXRzLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICBlbmNvZGVQYWNrZXQocGFja2V0LCB0aGlzLnN1cHBvcnRzQmluYXJ5LCAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFNvbWV0aW1lcyB0aGUgd2Vic29ja2V0IGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkIGJ1dCB0aGUgYnJvd3NlciBkaWRuJ3RcbiAgICAgICAgICAgICAgICAvLyBoYXZlIGEgY2hhbmNlIG9mIGluZm9ybWluZyB1cyBhYm91dCBpdCB5ZXQsIGluIHRoYXQgY2FzZSBzZW5kIHdpbGxcbiAgICAgICAgICAgICAgICAvLyB0aHJvdyBhbiBlcnJvclxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9Xcml0ZShwYWNrZXQsIGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobGFzdFBhY2tldCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBmYWtlIGRyYWluXG4gICAgICAgICAgICAgICAgICAgIC8vIGRlZmVyIHRvIG5leHQgdGljayB0byBhbGxvdyBTb2NrZXQgdG8gY2xlYXIgd3JpdGVCdWZmZXJcbiAgICAgICAgICAgICAgICAgICAgbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0YWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImRyYWluXCIpO1xuICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLnNldFRpbWVvdXRGbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZG9DbG9zZSgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLndzICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB0aGlzLndzLm9uZXJyb3IgPSAoKSA9PiB7IH07XG4gICAgICAgICAgICB0aGlzLndzLmNsb3NlKCk7XG4gICAgICAgICAgICB0aGlzLndzID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgdXJpIGZvciBjb25uZWN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB1cmkoKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMub3B0cy5zZWN1cmUgPyBcIndzc1wiIDogXCJ3c1wiO1xuICAgICAgICBjb25zdCBxdWVyeSA9IHRoaXMucXVlcnkgfHwge307XG4gICAgICAgIC8vIGFwcGVuZCB0aW1lc3RhbXAgdG8gVVJJXG4gICAgICAgIGlmICh0aGlzLm9wdHMudGltZXN0YW1wUmVxdWVzdHMpIHtcbiAgICAgICAgICAgIHF1ZXJ5W3RoaXMub3B0cy50aW1lc3RhbXBQYXJhbV0gPSByYW5kb21TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBjb21tdW5pY2F0ZSBiaW5hcnkgc3VwcG9ydCBjYXBhYmlsaXRpZXNcbiAgICAgICAgaWYgKCF0aGlzLnN1cHBvcnRzQmluYXJ5KSB7XG4gICAgICAgICAgICBxdWVyeS5iNjQgPSAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVVyaShzY2hlbWEsIHF1ZXJ5KTtcbiAgICB9XG59XG5jb25zdCBXZWJTb2NrZXRDdG9yID0gZ2xvYmFsVGhpcy5XZWJTb2NrZXQgfHwgZ2xvYmFsVGhpcy5Nb3pXZWJTb2NrZXQ7XG4vKipcbiAqIFdlYlNvY2tldCB0cmFuc3BvcnQgYmFzZWQgb24gdGhlIGJ1aWx0LWluIGBXZWJTb2NrZXRgIG9iamVjdC5cbiAqXG4gKiBVc2FnZTogYnJvd3NlciwgTm9kZS5qcyAoc2luY2UgdjIxKSwgRGVubywgQnVuXG4gKlxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2ViU29ja2V0XG4gKiBAc2VlIGh0dHBzOi8vY2FuaXVzZS5jb20vbWRuLWFwaV93ZWJzb2NrZXRcbiAqIEBzZWUgaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9nbG9iYWxzLmh0bWwjd2Vic29ja2V0XG4gKi9cbmV4cG9ydCBjbGFzcyBXUyBleHRlbmRzIEJhc2VXUyB7XG4gICAgY3JlYXRlU29ja2V0KHVyaSwgcHJvdG9jb2xzLCBvcHRzKSB7XG4gICAgICAgIHJldHVybiAhaXNSZWFjdE5hdGl2ZVxuICAgICAgICAgICAgPyBwcm90b2NvbHNcbiAgICAgICAgICAgICAgICA/IG5ldyBXZWJTb2NrZXRDdG9yKHVyaSwgcHJvdG9jb2xzKVxuICAgICAgICAgICAgICAgIDogbmV3IFdlYlNvY2tldEN0b3IodXJpKVxuICAgICAgICAgICAgOiBuZXcgV2ViU29ja2V0Q3Rvcih1cmksIHByb3RvY29scywgb3B0cyk7XG4gICAgfVxuICAgIGRvV3JpdGUoX3BhY2tldCwgZGF0YSkge1xuICAgICAgICB0aGlzLndzLnNlbmQoZGF0YSk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IFRyYW5zcG9ydCB9IGZyb20gXCIuLi90cmFuc3BvcnQuanNcIjtcbmltcG9ydCB7IG5leHRUaWNrIH0gZnJvbSBcIi4uL2dsb2JhbHMubm9kZS5qc1wiO1xuaW1wb3J0IHsgY3JlYXRlUGFja2V0RGVjb2RlclN0cmVhbSwgY3JlYXRlUGFja2V0RW5jb2RlclN0cmVhbSwgfSBmcm9tIFwiZW5naW5lLmlvLXBhcnNlclwiO1xuLyoqXG4gKiBXZWJUcmFuc3BvcnQgdHJhbnNwb3J0IGJhc2VkIG9uIHRoZSBidWlsdC1pbiBgV2ViVHJhbnNwb3J0YCBvYmplY3QuXG4gKlxuICogVXNhZ2U6IGJyb3dzZXIsIE5vZGUuanMgKHdpdGggdGhlIGBAZmFpbHMtY29tcG9uZW50cy93ZWJ0cmFuc3BvcnRgIHBhY2thZ2UpXG4gKlxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2ViVHJhbnNwb3J0XG4gKiBAc2VlIGh0dHBzOi8vY2FuaXVzZS5jb20vd2VidHJhbnNwb3J0XG4gKi9cbmV4cG9ydCBjbGFzcyBXVCBleHRlbmRzIFRyYW5zcG9ydCB7XG4gICAgZ2V0IG5hbWUoKSB7XG4gICAgICAgIHJldHVybiBcIndlYnRyYW5zcG9ydFwiO1xuICAgIH1cbiAgICBkb09wZW4oKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB0aGlzLl90cmFuc3BvcnQgPSBuZXcgV2ViVHJhbnNwb3J0KHRoaXMuY3JlYXRlVXJpKFwiaHR0cHNcIiksIHRoaXMub3B0cy50cmFuc3BvcnRPcHRpb25zW3RoaXMubmFtZV0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVtaXRSZXNlcnZlZChcImVycm9yXCIsIGVycik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdHJhbnNwb3J0LmNsb3NlZFxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkNsb3NlKCk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkVycm9yKFwid2VidHJhbnNwb3J0IGVycm9yXCIsIGVycik7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBub3RlOiB3ZSBjb3VsZCBoYXZlIHVzZWQgYXN5bmMvYXdhaXQsIGJ1dCB0aGF0IHdvdWxkIHJlcXVpcmUgc29tZSBhZGRpdGlvbmFsIHBvbHlmaWxsc1xuICAgICAgICB0aGlzLl90cmFuc3BvcnQucmVhZHkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl90cmFuc3BvcnQuY3JlYXRlQmlkaXJlY3Rpb25hbFN0cmVhbSgpLnRoZW4oKHN0cmVhbSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlY29kZXJTdHJlYW0gPSBjcmVhdGVQYWNrZXREZWNvZGVyU3RyZWFtKE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLCB0aGlzLnNvY2tldC5iaW5hcnlUeXBlKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWFkZXIgPSBzdHJlYW0ucmVhZGFibGUucGlwZVRocm91Z2goZGVjb2RlclN0cmVhbSkuZ2V0UmVhZGVyKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5jb2RlclN0cmVhbSA9IGNyZWF0ZVBhY2tldEVuY29kZXJTdHJlYW0oKTtcbiAgICAgICAgICAgICAgICBlbmNvZGVyU3RyZWFtLnJlYWRhYmxlLnBpcGVUbyhzdHJlYW0ud3JpdGFibGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3dyaXRlciA9IGVuY29kZXJTdHJlYW0ud3JpdGFibGUuZ2V0V3JpdGVyKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVhZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVhZCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoeyBkb25lLCB2YWx1ZSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25QYWNrZXQodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCgpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZWFkKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFja2V0ID0geyB0eXBlOiBcIm9wZW5cIiB9O1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnF1ZXJ5LnNpZCkge1xuICAgICAgICAgICAgICAgICAgICBwYWNrZXQuZGF0YSA9IGB7XCJzaWRcIjpcIiR7dGhpcy5xdWVyeS5zaWR9XCJ9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fd3JpdGVyLndyaXRlKHBhY2tldCkudGhlbigoKSA9PiB0aGlzLm9uT3BlbigpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgd3JpdGUocGFja2V0cykge1xuICAgICAgICB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFja2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgcGFja2V0ID0gcGFja2V0c1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RQYWNrZXQgPSBpID09PSBwYWNrZXRzLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICB0aGlzLl93cml0ZXIud3JpdGUocGFja2V0KS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobGFzdFBhY2tldCkge1xuICAgICAgICAgICAgICAgICAgICBuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwiZHJhaW5cIik7XG4gICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuc2V0VGltZW91dEZuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkb0Nsb3NlKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IHRoaXMuX3RyYW5zcG9ydCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNsb3NlKCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IFhIUiB9IGZyb20gXCIuL3BvbGxpbmcteGhyLm5vZGUuanNcIjtcbmltcG9ydCB7IFdTIH0gZnJvbSBcIi4vd2Vic29ja2V0Lm5vZGUuanNcIjtcbmltcG9ydCB7IFdUIH0gZnJvbSBcIi4vd2VidHJhbnNwb3J0LmpzXCI7XG5leHBvcnQgY29uc3QgdHJhbnNwb3J0cyA9IHtcbiAgICB3ZWJzb2NrZXQ6IFdTLFxuICAgIHdlYnRyYW5zcG9ydDogV1QsXG4gICAgcG9sbGluZzogWEhSLFxufTtcbiIsICIvLyBpbXBvcnRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9nYWxrbi9wYXJzZXVyaVxuLyoqXG4gKiBQYXJzZXMgYSBVUklcbiAqXG4gKiBOb3RlOiB3ZSBjb3VsZCBhbHNvIGhhdmUgdXNlZCB0aGUgYnVpbHQtaW4gVVJMIG9iamVjdCwgYnV0IGl0IGlzbid0IHN1cHBvcnRlZCBvbiBhbGwgcGxhdGZvcm1zLlxuICpcbiAqIFNlZTpcbiAqIC0gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1VSTFxuICogLSBodHRwczovL2Nhbml1c2UuY29tL3VybFxuICogLSBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjMzk4NiNhcHBlbmRpeC1CXG4gKlxuICogSGlzdG9yeSBvZiB0aGUgcGFyc2UoKSBtZXRob2Q6XG4gKiAtIGZpcnN0IGNvbW1pdDogaHR0cHM6Ly9naXRodWIuY29tL3NvY2tldGlvL3NvY2tldC5pby1jbGllbnQvY29tbWl0LzRlZTFkNWQ5NGIzOTA2YTljMDUyYjQ1OWYxYTgxOGIxNWYzOGY5MWNcbiAqIC0gZXhwb3J0IGludG8gaXRzIG93biBtb2R1bGU6IGh0dHBzOi8vZ2l0aHViLmNvbS9zb2NrZXRpby9lbmdpbmUuaW8tY2xpZW50L2NvbW1pdC9kZTJjNTYxZTQ1NjRlZmViNzhmMWJkYjFiYTM5ZWY4MWIyODIyY2IzXG4gKiAtIHJlaW1wb3J0OiBodHRwczovL2dpdGh1Yi5jb20vc29ja2V0aW8vZW5naW5lLmlvLWNsaWVudC9jb21taXQvZGYzMjI3N2MzZjZkNjIyZWVjNWVkMDlmNDkzY2FlM2YzMzkxZDI0MlxuICpcbiAqIEBhdXRob3IgU3RldmVuIExldml0aGFuIDxzdGV2ZW5sZXZpdGhhbi5jb20+IChNSVQgbGljZW5zZSlcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5jb25zdCByZSA9IC9eKD86KD8hW146QFxcLz8jXSs6W146QFxcL10qQCkoaHR0cHxodHRwc3x3c3x3c3MpOlxcL1xcLyk/KCg/OigoW146QFxcLz8jXSopKD86OihbXjpAXFwvPyNdKikpPyk/QCk/KCg/OlthLWYwLTldezAsNH06KXsyLDd9W2EtZjAtOV17MCw0fXxbXjpcXC8/I10qKSg/OjooXFxkKikpPykoKChcXC8oPzpbXj8jXSg/IVtePyNcXC9dKlxcLltePyNcXC8uXSsoPzpbPyNdfCQpKSkqXFwvPyk/KFtePyNcXC9dKikpKD86XFw/KFteI10qKSk/KD86IyguKikpPykvO1xuY29uc3QgcGFydHMgPSBbXG4gICAgJ3NvdXJjZScsICdwcm90b2NvbCcsICdhdXRob3JpdHknLCAndXNlckluZm8nLCAndXNlcicsICdwYXNzd29yZCcsICdob3N0JywgJ3BvcnQnLCAncmVsYXRpdmUnLCAncGF0aCcsICdkaXJlY3RvcnknLCAnZmlsZScsICdxdWVyeScsICdhbmNob3InXG5dO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlKHN0cikge1xuICAgIGlmIChzdHIubGVuZ3RoID4gODAwMCkge1xuICAgICAgICB0aHJvdyBcIlVSSSB0b28gbG9uZ1wiO1xuICAgIH1cbiAgICBjb25zdCBzcmMgPSBzdHIsIGIgPSBzdHIuaW5kZXhPZignWycpLCBlID0gc3RyLmluZGV4T2YoJ10nKTtcbiAgICBpZiAoYiAhPSAtMSAmJiBlICE9IC0xKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHJpbmcoMCwgYikgKyBzdHIuc3Vic3RyaW5nKGIsIGUpLnJlcGxhY2UoLzovZywgJzsnKSArIHN0ci5zdWJzdHJpbmcoZSwgc3RyLmxlbmd0aCk7XG4gICAgfVxuICAgIGxldCBtID0gcmUuZXhlYyhzdHIgfHwgJycpLCB1cmkgPSB7fSwgaSA9IDE0O1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgdXJpW3BhcnRzW2ldXSA9IG1baV0gfHwgJyc7XG4gICAgfVxuICAgIGlmIChiICE9IC0xICYmIGUgIT0gLTEpIHtcbiAgICAgICAgdXJpLnNvdXJjZSA9IHNyYztcbiAgICAgICAgdXJpLmhvc3QgPSB1cmkuaG9zdC5zdWJzdHJpbmcoMSwgdXJpLmhvc3QubGVuZ3RoIC0gMSkucmVwbGFjZSgvOy9nLCAnOicpO1xuICAgICAgICB1cmkuYXV0aG9yaXR5ID0gdXJpLmF1dGhvcml0eS5yZXBsYWNlKCdbJywgJycpLnJlcGxhY2UoJ10nLCAnJykucmVwbGFjZSgvOy9nLCAnOicpO1xuICAgICAgICB1cmkuaXB2NnVyaSA9IHRydWU7XG4gICAgfVxuICAgIHVyaS5wYXRoTmFtZXMgPSBwYXRoTmFtZXModXJpLCB1cmlbJ3BhdGgnXSk7XG4gICAgdXJpLnF1ZXJ5S2V5ID0gcXVlcnlLZXkodXJpLCB1cmlbJ3F1ZXJ5J10pO1xuICAgIHJldHVybiB1cmk7XG59XG5mdW5jdGlvbiBwYXRoTmFtZXMob2JqLCBwYXRoKSB7XG4gICAgY29uc3QgcmVneCA9IC9cXC97Miw5fS9nLCBuYW1lcyA9IHBhdGgucmVwbGFjZShyZWd4LCBcIi9cIikuc3BsaXQoXCIvXCIpO1xuICAgIGlmIChwYXRoLnNsaWNlKDAsIDEpID09ICcvJyB8fCBwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBuYW1lcy5zcGxpY2UoMCwgMSk7XG4gICAgfVxuICAgIGlmIChwYXRoLnNsaWNlKC0xKSA9PSAnLycpIHtcbiAgICAgICAgbmFtZXMuc3BsaWNlKG5hbWVzLmxlbmd0aCAtIDEsIDEpO1xuICAgIH1cbiAgICByZXR1cm4gbmFtZXM7XG59XG5mdW5jdGlvbiBxdWVyeUtleSh1cmksIHF1ZXJ5KSB7XG4gICAgY29uc3QgZGF0YSA9IHt9O1xuICAgIHF1ZXJ5LnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLCBmdW5jdGlvbiAoJDAsICQxLCAkMikge1xuICAgICAgICBpZiAoJDEpIHtcbiAgICAgICAgICAgIGRhdGFbJDFdID0gJDI7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZGF0YTtcbn1cbiIsICJpbXBvcnQgeyB0cmFuc3BvcnRzIGFzIERFRkFVTFRfVFJBTlNQT1JUUyB9IGZyb20gXCIuL3RyYW5zcG9ydHMvaW5kZXguanNcIjtcbmltcG9ydCB7IGluc3RhbGxUaW1lckZ1bmN0aW9ucywgYnl0ZUxlbmd0aCB9IGZyb20gXCIuL3V0aWwuanNcIjtcbmltcG9ydCB7IGRlY29kZSB9IGZyb20gXCIuL2NvbnRyaWIvcGFyc2Vxcy5qc1wiO1xuaW1wb3J0IHsgcGFyc2UgfSBmcm9tIFwiLi9jb250cmliL3BhcnNldXJpLmpzXCI7XG5pbXBvcnQgeyBFbWl0dGVyIH0gZnJvbSBcIkBzb2NrZXQuaW8vY29tcG9uZW50LWVtaXR0ZXJcIjtcbmltcG9ydCB7IHByb3RvY29sIH0gZnJvbSBcImVuZ2luZS5pby1wYXJzZXJcIjtcbmltcG9ydCB7IGNyZWF0ZUNvb2tpZUphciwgZGVmYXVsdEJpbmFyeVR5cGUsIG5leHRUaWNrLCB9IGZyb20gXCIuL2dsb2JhbHMubm9kZS5qc1wiO1xuY29uc3Qgd2l0aEV2ZW50TGlzdGVuZXJzID0gdHlwZW9mIGFkZEV2ZW50TGlzdGVuZXIgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgIHR5cGVvZiByZW1vdmVFdmVudExpc3RlbmVyID09PSBcImZ1bmN0aW9uXCI7XG5jb25zdCBPRkZMSU5FX0VWRU5UX0xJU1RFTkVSUyA9IFtdO1xuaWYgKHdpdGhFdmVudExpc3RlbmVycykge1xuICAgIC8vIHdpdGhpbiBhIFNlcnZpY2VXb3JrZXIsIGFueSBldmVudCBoYW5kbGVyIGZvciB0aGUgJ29mZmxpbmUnIGV2ZW50IG11c3QgYmUgYWRkZWQgb24gdGhlIGluaXRpYWwgZXZhbHVhdGlvbiBvZiB0aGVcbiAgICAvLyBzY3JpcHQsIHNvIHdlIGNyZWF0ZSBvbmUgc2luZ2xlIGV2ZW50IGxpc3RlbmVyIGhlcmUgd2hpY2ggd2lsbCBmb3J3YXJkIHRoZSBldmVudCB0byB0aGUgc29ja2V0IGluc3RhbmNlc1xuICAgIGFkZEV2ZW50TGlzdGVuZXIoXCJvZmZsaW5lXCIsICgpID0+IHtcbiAgICAgICAgT0ZGTElORV9FVkVOVF9MSVNURU5FUlMuZm9yRWFjaCgobGlzdGVuZXIpID0+IGxpc3RlbmVyKCkpO1xuICAgIH0sIGZhbHNlKTtcbn1cbi8qKlxuICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIFdlYlNvY2tldC1saWtlIGludGVyZmFjZSB0byBjb25uZWN0IHRvIGFuIEVuZ2luZS5JTyBzZXJ2ZXIuIFRoZSBjb25uZWN0aW9uIHdpbGwgYmUgZXN0YWJsaXNoZWRcbiAqIHdpdGggb25lIG9mIHRoZSBhdmFpbGFibGUgbG93LWxldmVsIHRyYW5zcG9ydHMsIGxpa2UgSFRUUCBsb25nLXBvbGxpbmcsIFdlYlNvY2tldCBvciBXZWJUcmFuc3BvcnQuXG4gKlxuICogVGhpcyBjbGFzcyBjb21lcyB3aXRob3V0IHVwZ3JhZGUgbWVjaGFuaXNtLCB3aGljaCBtZWFucyB0aGF0IGl0IHdpbGwga2VlcCB0aGUgZmlyc3QgbG93LWxldmVsIHRyYW5zcG9ydCB0aGF0XG4gKiBzdWNjZXNzZnVsbHkgZXN0YWJsaXNoZXMgdGhlIGNvbm5lY3Rpb24uXG4gKlxuICogSW4gb3JkZXIgdG8gYWxsb3cgdHJlZS1zaGFraW5nLCB0aGVyZSBhcmUgbm8gdHJhbnNwb3J0cyBpbmNsdWRlZCwgdGhhdCdzIHdoeSB0aGUgYHRyYW5zcG9ydHNgIG9wdGlvbiBpcyBtYW5kYXRvcnkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IFNvY2tldFdpdGhvdXRVcGdyYWRlLCBXZWJTb2NrZXQgfSBmcm9tIFwiZW5naW5lLmlvLWNsaWVudFwiO1xuICpcbiAqIGNvbnN0IHNvY2tldCA9IG5ldyBTb2NrZXRXaXRob3V0VXBncmFkZSh7XG4gKiAgIHRyYW5zcG9ydHM6IFtXZWJTb2NrZXRdXG4gKiB9KTtcbiAqXG4gKiBzb2NrZXQub24oXCJvcGVuXCIsICgpID0+IHtcbiAqICAgc29ja2V0LnNlbmQoXCJoZWxsb1wiKTtcbiAqIH0pO1xuICpcbiAqIEBzZWUgU29ja2V0V2l0aFVwZ3JhZGVcbiAqIEBzZWUgU29ja2V0XG4gKi9cbmV4cG9ydCBjbGFzcyBTb2NrZXRXaXRob3V0VXBncmFkZSBleHRlbmRzIEVtaXR0ZXIge1xuICAgIC8qKlxuICAgICAqIFNvY2tldCBjb25zdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gdXJpIC0gdXJpIG9yIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih1cmksIG9wdHMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5iaW5hcnlUeXBlID0gZGVmYXVsdEJpbmFyeVR5cGU7XG4gICAgICAgIHRoaXMud3JpdGVCdWZmZXIgPSBbXTtcbiAgICAgICAgdGhpcy5fcHJldkJ1ZmZlckxlbiA9IDA7XG4gICAgICAgIHRoaXMuX3BpbmdJbnRlcnZhbCA9IC0xO1xuICAgICAgICB0aGlzLl9waW5nVGltZW91dCA9IC0xO1xuICAgICAgICB0aGlzLl9tYXhQYXlsb2FkID0gLTE7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZXhwaXJhdGlvbiB0aW1lc3RhbXAgb2YgdGhlIHtAbGluayBfcGluZ1RpbWVvdXRUaW1lcn0gb2JqZWN0IGlzIHRyYWNrZWQsIGluIGNhc2UgdGhlIHRpbWVyIGlzIHRocm90dGxlZCBhbmQgdGhlXG4gICAgICAgICAqIGNhbGxiYWNrIGlzIG5vdCBmaXJlZCBvbiB0aW1lLiBUaGlzIGNhbiBoYXBwZW4gZm9yIGV4YW1wbGUgd2hlbiBhIGxhcHRvcCBpcyBzdXNwZW5kZWQgb3Igd2hlbiBhIHBob25lIGlzIGxvY2tlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX3BpbmdUaW1lb3V0VGltZSA9IEluZmluaXR5O1xuICAgICAgICBpZiAodXJpICYmIFwib2JqZWN0XCIgPT09IHR5cGVvZiB1cmkpIHtcbiAgICAgICAgICAgIG9wdHMgPSB1cmk7XG4gICAgICAgICAgICB1cmkgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cmkpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZFVyaSA9IHBhcnNlKHVyaSk7XG4gICAgICAgICAgICBvcHRzLmhvc3RuYW1lID0gcGFyc2VkVXJpLmhvc3Q7XG4gICAgICAgICAgICBvcHRzLnNlY3VyZSA9XG4gICAgICAgICAgICAgICAgcGFyc2VkVXJpLnByb3RvY29sID09PSBcImh0dHBzXCIgfHwgcGFyc2VkVXJpLnByb3RvY29sID09PSBcIndzc1wiO1xuICAgICAgICAgICAgb3B0cy5wb3J0ID0gcGFyc2VkVXJpLnBvcnQ7XG4gICAgICAgICAgICBpZiAocGFyc2VkVXJpLnF1ZXJ5KVxuICAgICAgICAgICAgICAgIG9wdHMucXVlcnkgPSBwYXJzZWRVcmkucXVlcnk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3B0cy5ob3N0KSB7XG4gICAgICAgICAgICBvcHRzLmhvc3RuYW1lID0gcGFyc2Uob3B0cy5ob3N0KS5ob3N0O1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbGxUaW1lckZ1bmN0aW9ucyh0aGlzLCBvcHRzKTtcbiAgICAgICAgdGhpcy5zZWN1cmUgPVxuICAgICAgICAgICAgbnVsbCAhPSBvcHRzLnNlY3VyZVxuICAgICAgICAgICAgICAgID8gb3B0cy5zZWN1cmVcbiAgICAgICAgICAgICAgICA6IHR5cGVvZiBsb2NhdGlvbiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBcImh0dHBzOlwiID09PSBsb2NhdGlvbi5wcm90b2NvbDtcbiAgICAgICAgaWYgKG9wdHMuaG9zdG5hbWUgJiYgIW9wdHMucG9ydCkge1xuICAgICAgICAgICAgLy8gaWYgbm8gcG9ydCBpcyBzcGVjaWZpZWQgbWFudWFsbHksIHVzZSB0aGUgcHJvdG9jb2wgZGVmYXVsdFxuICAgICAgICAgICAgb3B0cy5wb3J0ID0gdGhpcy5zZWN1cmUgPyBcIjQ0M1wiIDogXCI4MFwiO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaG9zdG5hbWUgPVxuICAgICAgICAgICAgb3B0cy5ob3N0bmFtZSB8fFxuICAgICAgICAgICAgICAgICh0eXBlb2YgbG9jYXRpb24gIT09IFwidW5kZWZpbmVkXCIgPyBsb2NhdGlvbi5ob3N0bmFtZSA6IFwibG9jYWxob3N0XCIpO1xuICAgICAgICB0aGlzLnBvcnQgPVxuICAgICAgICAgICAgb3B0cy5wb3J0IHx8XG4gICAgICAgICAgICAgICAgKHR5cGVvZiBsb2NhdGlvbiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBsb2NhdGlvbi5wb3J0XG4gICAgICAgICAgICAgICAgICAgID8gbG9jYXRpb24ucG9ydFxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuc2VjdXJlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFwiNDQzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogXCI4MFwiKTtcbiAgICAgICAgdGhpcy50cmFuc3BvcnRzID0gW107XG4gICAgICAgIHRoaXMuX3RyYW5zcG9ydHNCeU5hbWUgPSB7fTtcbiAgICAgICAgb3B0cy50cmFuc3BvcnRzLmZvckVhY2goKHQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zcG9ydE5hbWUgPSB0LnByb3RvdHlwZS5uYW1lO1xuICAgICAgICAgICAgdGhpcy50cmFuc3BvcnRzLnB1c2godHJhbnNwb3J0TmFtZSk7XG4gICAgICAgICAgICB0aGlzLl90cmFuc3BvcnRzQnlOYW1lW3RyYW5zcG9ydE5hbWVdID0gdDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub3B0cyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgcGF0aDogXCIvZW5naW5lLmlvXCIsXG4gICAgICAgICAgICBhZ2VudDogZmFsc2UsXG4gICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IGZhbHNlLFxuICAgICAgICAgICAgdXBncmFkZTogdHJ1ZSxcbiAgICAgICAgICAgIHRpbWVzdGFtcFBhcmFtOiBcInRcIixcbiAgICAgICAgICAgIHJlbWVtYmVyVXBncmFkZTogZmFsc2UsXG4gICAgICAgICAgICBhZGRUcmFpbGluZ1NsYXNoOiB0cnVlLFxuICAgICAgICAgICAgcmVqZWN0VW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgICAgICAgcGVyTWVzc2FnZURlZmxhdGU6IHtcbiAgICAgICAgICAgICAgICB0aHJlc2hvbGQ6IDEwMjQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHJhbnNwb3J0T3B0aW9uczoge30sXG4gICAgICAgICAgICBjbG9zZU9uQmVmb3JldW5sb2FkOiBmYWxzZSxcbiAgICAgICAgfSwgb3B0cyk7XG4gICAgICAgIHRoaXMub3B0cy5wYXRoID1cbiAgICAgICAgICAgIHRoaXMub3B0cy5wYXRoLnJlcGxhY2UoL1xcLyQvLCBcIlwiKSArXG4gICAgICAgICAgICAgICAgKHRoaXMub3B0cy5hZGRUcmFpbGluZ1NsYXNoID8gXCIvXCIgOiBcIlwiKTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdHMucXVlcnkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHRoaXMub3B0cy5xdWVyeSA9IGRlY29kZSh0aGlzLm9wdHMucXVlcnkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh3aXRoRXZlbnRMaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdHMuY2xvc2VPbkJlZm9yZXVubG9hZCkge1xuICAgICAgICAgICAgICAgIC8vIEZpcmVmb3ggY2xvc2VzIHRoZSBjb25uZWN0aW9uIHdoZW4gdGhlIFwiYmVmb3JldW5sb2FkXCIgZXZlbnQgaXMgZW1pdHRlZCBidXQgbm90IENocm9tZS4gVGhpcyBldmVudCBsaXN0ZW5lclxuICAgICAgICAgICAgICAgIC8vIGVuc3VyZXMgZXZlcnkgYnJvd3NlciBiZWhhdmVzIHRoZSBzYW1lIChubyBcImRpc2Nvbm5lY3RcIiBldmVudCBhdCB0aGUgU29ja2V0LklPIGxldmVsIHdoZW4gdGhlIHBhZ2UgaXNcbiAgICAgICAgICAgICAgICAvLyBjbG9zZWQvcmVsb2FkZWQpXG4gICAgICAgICAgICAgICAgdGhpcy5fYmVmb3JldW5sb2FkRXZlbnRMaXN0ZW5lciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudHJhbnNwb3J0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzaWxlbnRseSBjbG9zZSB0aGUgdHJhbnNwb3J0XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zcG9ydC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGFkZEV2ZW50TGlzdGVuZXIoXCJiZWZvcmV1bmxvYWRcIiwgdGhpcy5fYmVmb3JldW5sb2FkRXZlbnRMaXN0ZW5lciwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuaG9zdG5hbWUgIT09IFwibG9jYWxob3N0XCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vZmZsaW5lRXZlbnRMaXN0ZW5lciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25DbG9zZShcInRyYW5zcG9ydCBjbG9zZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJuZXR3b3JrIGNvbm5lY3Rpb24gbG9zdFwiLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE9GRkxJTkVfRVZFTlRfTElTVEVORVJTLnB1c2godGhpcy5fb2ZmbGluZUV2ZW50TGlzdGVuZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdHMud2l0aENyZWRlbnRpYWxzKSB7XG4gICAgICAgICAgICB0aGlzLl9jb29raWVKYXIgPSBjcmVhdGVDb29raWVKYXIoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9vcGVuKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdHJhbnNwb3J0IG9mIHRoZSBnaXZlbiB0eXBlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgLSB0cmFuc3BvcnQgbmFtZVxuICAgICAqIEByZXR1cm4ge1RyYW5zcG9ydH1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNyZWF0ZVRyYW5zcG9ydChuYW1lKSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRzLnF1ZXJ5KTtcbiAgICAgICAgLy8gYXBwZW5kIGVuZ2luZS5pbyBwcm90b2NvbCBpZGVudGlmaWVyXG4gICAgICAgIHF1ZXJ5LkVJTyA9IHByb3RvY29sO1xuICAgICAgICAvLyB0cmFuc3BvcnQgbmFtZVxuICAgICAgICBxdWVyeS50cmFuc3BvcnQgPSBuYW1lO1xuICAgICAgICAvLyBzZXNzaW9uIGlkIGlmIHdlIGFscmVhZHkgaGF2ZSBvbmVcbiAgICAgICAgaWYgKHRoaXMuaWQpXG4gICAgICAgICAgICBxdWVyeS5zaWQgPSB0aGlzLmlkO1xuICAgICAgICBjb25zdCBvcHRzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRzLCB7XG4gICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgIHNvY2tldDogdGhpcyxcbiAgICAgICAgICAgIGhvc3RuYW1lOiB0aGlzLmhvc3RuYW1lLFxuICAgICAgICAgICAgc2VjdXJlOiB0aGlzLnNlY3VyZSxcbiAgICAgICAgICAgIHBvcnQ6IHRoaXMucG9ydCxcbiAgICAgICAgfSwgdGhpcy5vcHRzLnRyYW5zcG9ydE9wdGlvbnNbbmFtZV0pO1xuICAgICAgICByZXR1cm4gbmV3IHRoaXMuX3RyYW5zcG9ydHNCeU5hbWVbbmFtZV0ob3B0cyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIHRyYW5zcG9ydCB0byB1c2UgYW5kIHN0YXJ0cyBwcm9iZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX29wZW4oKSB7XG4gICAgICAgIGlmICh0aGlzLnRyYW5zcG9ydHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBFbWl0IGVycm9yIG9uIG5leHQgdGljayBzbyBpdCBjYW4gYmUgbGlzdGVuZWQgdG9cbiAgICAgICAgICAgIHRoaXMuc2V0VGltZW91dEZuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImVycm9yXCIsIFwiTm8gdHJhbnNwb3J0cyBhdmFpbGFibGVcIik7XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmFuc3BvcnROYW1lID0gdGhpcy5vcHRzLnJlbWVtYmVyVXBncmFkZSAmJlxuICAgICAgICAgICAgU29ja2V0V2l0aG91dFVwZ3JhZGUucHJpb3JXZWJzb2NrZXRTdWNjZXNzICYmXG4gICAgICAgICAgICB0aGlzLnRyYW5zcG9ydHMuaW5kZXhPZihcIndlYnNvY2tldFwiKSAhPT0gLTFcbiAgICAgICAgICAgID8gXCJ3ZWJzb2NrZXRcIlxuICAgICAgICAgICAgOiB0aGlzLnRyYW5zcG9ydHNbMF07XG4gICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IFwib3BlbmluZ1wiO1xuICAgICAgICBjb25zdCB0cmFuc3BvcnQgPSB0aGlzLmNyZWF0ZVRyYW5zcG9ydCh0cmFuc3BvcnROYW1lKTtcbiAgICAgICAgdHJhbnNwb3J0Lm9wZW4oKTtcbiAgICAgICAgdGhpcy5zZXRUcmFuc3BvcnQodHJhbnNwb3J0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgY3VycmVudCB0cmFuc3BvcnQuIERpc2FibGVzIHRoZSBleGlzdGluZyBvbmUgKGlmIGFueSkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHNldFRyYW5zcG9ydCh0cmFuc3BvcnQpIHtcbiAgICAgICAgaWYgKHRoaXMudHJhbnNwb3J0KSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zcG9ydC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzZXQgdXAgdHJhbnNwb3J0XG4gICAgICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0O1xuICAgICAgICAvLyBzZXQgdXAgdHJhbnNwb3J0IGxpc3RlbmVyc1xuICAgICAgICB0cmFuc3BvcnRcbiAgICAgICAgICAgIC5vbihcImRyYWluXCIsIHRoaXMuX29uRHJhaW4uYmluZCh0aGlzKSlcbiAgICAgICAgICAgIC5vbihcInBhY2tldFwiLCB0aGlzLl9vblBhY2tldC5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgLm9uKFwiZXJyb3JcIiwgdGhpcy5fb25FcnJvci5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgLm9uKFwiY2xvc2VcIiwgKHJlYXNvbikgPT4gdGhpcy5fb25DbG9zZShcInRyYW5zcG9ydCBjbG9zZVwiLCByZWFzb24pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gY29ubmVjdGlvbiBpcyBkZWVtZWQgb3Blbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25PcGVuKCkge1xuICAgICAgICB0aGlzLnJlYWR5U3RhdGUgPSBcIm9wZW5cIjtcbiAgICAgICAgU29ja2V0V2l0aG91dFVwZ3JhZGUucHJpb3JXZWJzb2NrZXRTdWNjZXNzID1cbiAgICAgICAgICAgIFwid2Vic29ja2V0XCIgPT09IHRoaXMudHJhbnNwb3J0Lm5hbWU7XG4gICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwib3BlblwiKTtcbiAgICAgICAgdGhpcy5mbHVzaCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIGEgcGFja2V0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfb25QYWNrZXQocGFja2V0KSB7XG4gICAgICAgIGlmIChcIm9wZW5pbmdcIiA9PT0gdGhpcy5yZWFkeVN0YXRlIHx8XG4gICAgICAgICAgICBcIm9wZW5cIiA9PT0gdGhpcy5yZWFkeVN0YXRlIHx8XG4gICAgICAgICAgICBcImNsb3NpbmdcIiA9PT0gdGhpcy5yZWFkeVN0YXRlKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcInBhY2tldFwiLCBwYWNrZXQpO1xuICAgICAgICAgICAgLy8gU29ja2V0IGlzIGxpdmUgLSBhbnkgcGFja2V0IGNvdW50c1xuICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJoZWFydGJlYXRcIik7XG4gICAgICAgICAgICBzd2l0Y2ggKHBhY2tldC50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm9wZW5cIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkhhbmRzaGFrZShKU09OLnBhcnNlKHBhY2tldC5kYXRhKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJwaW5nXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbmRQYWNrZXQoXCJwb25nXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcInBpbmdcIik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwicG9uZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVzZXRQaW5nVGltZW91dCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZXJyb3JcIjpcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKFwic2VydmVyIGVycm9yXCIpO1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGVyci5jb2RlID0gcGFja2V0LmRhdGE7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uRXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJkYXRhXCIsIHBhY2tldC5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJtZXNzYWdlXCIsIHBhY2tldC5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHVwb24gaGFuZHNoYWtlIGNvbXBsZXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIGhhbmRzaGFrZSBvYmpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG9uSGFuZHNoYWtlKGRhdGEpIHtcbiAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJoYW5kc2hha2VcIiwgZGF0YSk7XG4gICAgICAgIHRoaXMuaWQgPSBkYXRhLnNpZDtcbiAgICAgICAgdGhpcy50cmFuc3BvcnQucXVlcnkuc2lkID0gZGF0YS5zaWQ7XG4gICAgICAgIHRoaXMuX3BpbmdJbnRlcnZhbCA9IGRhdGEucGluZ0ludGVydmFsO1xuICAgICAgICB0aGlzLl9waW5nVGltZW91dCA9IGRhdGEucGluZ1RpbWVvdXQ7XG4gICAgICAgIHRoaXMuX21heFBheWxvYWQgPSBkYXRhLm1heFBheWxvYWQ7XG4gICAgICAgIHRoaXMub25PcGVuKCk7XG4gICAgICAgIC8vIEluIGNhc2Ugb3BlbiBoYW5kbGVyIGNsb3NlcyBzb2NrZXRcbiAgICAgICAgaWYgKFwiY2xvc2VkXCIgPT09IHRoaXMucmVhZHlTdGF0ZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5fcmVzZXRQaW5nVGltZW91dCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGFuZCByZXNldHMgcGluZyB0aW1lb3V0IHRpbWVyIGJhc2VkIG9uIHNlcnZlciBwaW5ncy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3Jlc2V0UGluZ1RpbWVvdXQoKSB7XG4gICAgICAgIHRoaXMuY2xlYXJUaW1lb3V0Rm4odGhpcy5fcGluZ1RpbWVvdXRUaW1lcik7XG4gICAgICAgIGNvbnN0IGRlbGF5ID0gdGhpcy5fcGluZ0ludGVydmFsICsgdGhpcy5fcGluZ1RpbWVvdXQ7XG4gICAgICAgIHRoaXMuX3BpbmdUaW1lb3V0VGltZSA9IERhdGUubm93KCkgKyBkZWxheTtcbiAgICAgICAgdGhpcy5fcGluZ1RpbWVvdXRUaW1lciA9IHRoaXMuc2V0VGltZW91dEZuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX29uQ2xvc2UoXCJwaW5nIHRpbWVvdXRcIik7XG4gICAgICAgIH0sIGRlbGF5KTtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5hdXRvVW5yZWYpIHtcbiAgICAgICAgICAgIHRoaXMuX3BpbmdUaW1lb3V0VGltZXIudW5yZWYoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgb24gYGRyYWluYCBldmVudFxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfb25EcmFpbigpIHtcbiAgICAgICAgdGhpcy53cml0ZUJ1ZmZlci5zcGxpY2UoMCwgdGhpcy5fcHJldkJ1ZmZlckxlbik7XG4gICAgICAgIC8vIHNldHRpbmcgcHJldkJ1ZmZlckxlbiA9IDAgaXMgdmVyeSBpbXBvcnRhbnRcbiAgICAgICAgLy8gZm9yIGV4YW1wbGUsIHdoZW4gdXBncmFkaW5nLCB1cGdyYWRlIHBhY2tldCBpcyBzZW50IG92ZXIsXG4gICAgICAgIC8vIGFuZCBhIG5vbnplcm8gcHJldkJ1ZmZlckxlbiBjb3VsZCBjYXVzZSBwcm9ibGVtcyBvbiBgZHJhaW5gXG4gICAgICAgIHRoaXMuX3ByZXZCdWZmZXJMZW4gPSAwO1xuICAgICAgICBpZiAoMCA9PT0gdGhpcy53cml0ZUJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwiZHJhaW5cIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZsdXNoKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRmx1c2ggd3JpdGUgYnVmZmVycy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZmx1c2goKSB7XG4gICAgICAgIGlmIChcImNsb3NlZFwiICE9PSB0aGlzLnJlYWR5U3RhdGUgJiZcbiAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0LndyaXRhYmxlICYmXG4gICAgICAgICAgICAhdGhpcy51cGdyYWRpbmcgJiZcbiAgICAgICAgICAgIHRoaXMud3JpdGVCdWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBwYWNrZXRzID0gdGhpcy5fZ2V0V3JpdGFibGVQYWNrZXRzKCk7XG4gICAgICAgICAgICB0aGlzLnRyYW5zcG9ydC5zZW5kKHBhY2tldHMpO1xuICAgICAgICAgICAgLy8ga2VlcCB0cmFjayBvZiBjdXJyZW50IGxlbmd0aCBvZiB3cml0ZUJ1ZmZlclxuICAgICAgICAgICAgLy8gc3BsaWNlIHdyaXRlQnVmZmVyIGFuZCBjYWxsYmFja0J1ZmZlciBvbiBgZHJhaW5gXG4gICAgICAgICAgICB0aGlzLl9wcmV2QnVmZmVyTGVuID0gcGFja2V0cy5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImZsdXNoXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVuc3VyZSB0aGUgZW5jb2RlZCBzaXplIG9mIHRoZSB3cml0ZUJ1ZmZlciBpcyBiZWxvdyB0aGUgbWF4UGF5bG9hZCB2YWx1ZSBzZW50IGJ5IHRoZSBzZXJ2ZXIgKG9ubHkgZm9yIEhUVFBcbiAgICAgKiBsb25nLXBvbGxpbmcpXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9nZXRXcml0YWJsZVBhY2tldHMoKSB7XG4gICAgICAgIGNvbnN0IHNob3VsZENoZWNrUGF5bG9hZFNpemUgPSB0aGlzLl9tYXhQYXlsb2FkICYmXG4gICAgICAgICAgICB0aGlzLnRyYW5zcG9ydC5uYW1lID09PSBcInBvbGxpbmdcIiAmJlxuICAgICAgICAgICAgdGhpcy53cml0ZUJ1ZmZlci5sZW5ndGggPiAxO1xuICAgICAgICBpZiAoIXNob3VsZENoZWNrUGF5bG9hZFNpemUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLndyaXRlQnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwYXlsb2FkU2l6ZSA9IDE7IC8vIGZpcnN0IHBhY2tldCB0eXBlXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy53cml0ZUJ1ZmZlci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMud3JpdGVCdWZmZXJbaV0uZGF0YTtcbiAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZFNpemUgKz0gYnl0ZUxlbmd0aChkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpID4gMCAmJiBwYXlsb2FkU2l6ZSA+IHRoaXMuX21heFBheWxvYWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy53cml0ZUJ1ZmZlci5zbGljZSgwLCBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBheWxvYWRTaXplICs9IDI7IC8vIHNlcGFyYXRvciArIHBhY2tldCB0eXBlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMud3JpdGVCdWZmZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBoZWFydGJlYXQgdGltZXIgaGFzIGV4cGlyZWQgYnV0IHRoZSBzb2NrZXQgaGFzIG5vdCB5ZXQgYmVlbiBub3RpZmllZC5cbiAgICAgKlxuICAgICAqIE5vdGU6IHRoaXMgbWV0aG9kIGlzIHByaXZhdGUgZm9yIG5vdyBiZWNhdXNlIGl0IGRvZXMgbm90IHJlYWxseSBmaXQgdGhlIFdlYlNvY2tldCBBUEksIGJ1dCBpZiB3ZSBwdXQgaXQgaW4gdGhlXG4gICAgICogYHdyaXRlKClgIG1ldGhvZCB0aGVuIHRoZSBtZXNzYWdlIHdvdWxkIG5vdCBiZSBidWZmZXJlZCBieSB0aGUgU29ja2V0LklPIGNsaWVudC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICAvKiBwcml2YXRlICovIF9oYXNQaW5nRXhwaXJlZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9waW5nVGltZW91dFRpbWUpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY29uc3QgaGFzRXhwaXJlZCA9IERhdGUubm93KCkgPiB0aGlzLl9waW5nVGltZW91dFRpbWU7XG4gICAgICAgIGlmIChoYXNFeHBpcmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9waW5nVGltZW91dFRpbWUgPSAwO1xuICAgICAgICAgICAgbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX29uQ2xvc2UoXCJwaW5nIHRpbWVvdXRcIik7XG4gICAgICAgICAgICB9LCB0aGlzLnNldFRpbWVvdXRGbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhc0V4cGlyZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIGEgbWVzc2FnZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgLSBtZXNzYWdlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAgICogQHJldHVybiB7U29ja2V0fSBmb3IgY2hhaW5pbmcuXG4gICAgICovXG4gICAgd3JpdGUobXNnLCBvcHRpb25zLCBmbikge1xuICAgICAgICB0aGlzLl9zZW5kUGFja2V0KFwibWVzc2FnZVwiLCBtc2csIG9wdGlvbnMsIGZuKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIGEgbWVzc2FnZS4gQWxpYXMgb2Yge0BsaW5rIFNvY2tldCN3cml0ZX0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbXNnIC0gbWVzc2FnZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm4ge1NvY2tldH0gZm9yIGNoYWluaW5nLlxuICAgICAqL1xuICAgIHNlbmQobXNnLCBvcHRpb25zLCBmbikge1xuICAgICAgICB0aGlzLl9zZW5kUGFja2V0KFwibWVzc2FnZVwiLCBtc2csIG9wdGlvbnMsIGZuKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIGEgcGFja2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGU6IHBhY2tldCB0eXBlLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBkYXRhLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfc2VuZFBhY2tldCh0eXBlLCBkYXRhLCBvcHRpb25zLCBmbikge1xuICAgICAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgZGF0YSkge1xuICAgICAgICAgICAgZm4gPSBkYXRhO1xuICAgICAgICAgICAgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2Ygb3B0aW9ucykge1xuICAgICAgICAgICAgZm4gPSBvcHRpb25zO1xuICAgICAgICAgICAgb3B0aW9ucyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFwiY2xvc2luZ1wiID09PSB0aGlzLnJlYWR5U3RhdGUgfHwgXCJjbG9zZWRcIiA9PT0gdGhpcy5yZWFkeVN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIG9wdGlvbnMuY29tcHJlc3MgPSBmYWxzZSAhPT0gb3B0aW9ucy5jb21wcmVzcztcbiAgICAgICAgY29uc3QgcGFja2V0ID0ge1xuICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcInBhY2tldENyZWF0ZVwiLCBwYWNrZXQpO1xuICAgICAgICB0aGlzLndyaXRlQnVmZmVyLnB1c2gocGFja2V0KTtcbiAgICAgICAgaWYgKGZuKVxuICAgICAgICAgICAgdGhpcy5vbmNlKFwiZmx1c2hcIiwgZm4pO1xuICAgICAgICB0aGlzLmZsdXNoKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb3NlcyB0aGUgY29ubmVjdGlvbi5cbiAgICAgKi9cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgY29uc3QgY2xvc2UgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9vbkNsb3NlKFwiZm9yY2VkIGNsb3NlXCIpO1xuICAgICAgICAgICAgdGhpcy50cmFuc3BvcnQuY2xvc2UoKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgY2xlYW51cEFuZENsb3NlID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vZmYoXCJ1cGdyYWRlXCIsIGNsZWFudXBBbmRDbG9zZSk7XG4gICAgICAgICAgICB0aGlzLm9mZihcInVwZ3JhZGVFcnJvclwiLCBjbGVhbnVwQW5kQ2xvc2UpO1xuICAgICAgICAgICAgY2xvc2UoKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgd2FpdEZvclVwZ3JhZGUgPSAoKSA9PiB7XG4gICAgICAgICAgICAvLyB3YWl0IGZvciB1cGdyYWRlIHRvIGZpbmlzaCBzaW5jZSB3ZSBjYW4ndCBzZW5kIHBhY2tldHMgd2hpbGUgcGF1c2luZyBhIHRyYW5zcG9ydFxuICAgICAgICAgICAgdGhpcy5vbmNlKFwidXBncmFkZVwiLCBjbGVhbnVwQW5kQ2xvc2UpO1xuICAgICAgICAgICAgdGhpcy5vbmNlKFwidXBncmFkZUVycm9yXCIsIGNsZWFudXBBbmRDbG9zZSk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChcIm9wZW5pbmdcIiA9PT0gdGhpcy5yZWFkeVN0YXRlIHx8IFwib3BlblwiID09PSB0aGlzLnJlYWR5U3RhdGUpIHtcbiAgICAgICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IFwiY2xvc2luZ1wiO1xuICAgICAgICAgICAgaWYgKHRoaXMud3JpdGVCdWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbmNlKFwiZHJhaW5cIiwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy51cGdyYWRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRGb3JVcGdyYWRlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnVwZ3JhZGluZykge1xuICAgICAgICAgICAgICAgIHdhaXRGb3JVcGdyYWRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjbG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiB0cmFuc3BvcnQgZXJyb3JcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX29uRXJyb3IoZXJyKSB7XG4gICAgICAgIFNvY2tldFdpdGhvdXRVcGdyYWRlLnByaW9yV2Vic29ja2V0U3VjY2VzcyA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5vcHRzLnRyeUFsbFRyYW5zcG9ydHMgJiZcbiAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0cy5sZW5ndGggPiAxICYmXG4gICAgICAgICAgICB0aGlzLnJlYWR5U3RhdGUgPT09IFwib3BlbmluZ1wiKSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zcG9ydHMuc2hpZnQoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9vcGVuKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJlcnJvclwiLCBlcnIpO1xuICAgICAgICB0aGlzLl9vbkNsb3NlKFwidHJhbnNwb3J0IGVycm9yXCIsIGVycik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIHRyYW5zcG9ydCBjbG9zZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX29uQ2xvc2UocmVhc29uLCBkZXNjcmlwdGlvbikge1xuICAgICAgICBpZiAoXCJvcGVuaW5nXCIgPT09IHRoaXMucmVhZHlTdGF0ZSB8fFxuICAgICAgICAgICAgXCJvcGVuXCIgPT09IHRoaXMucmVhZHlTdGF0ZSB8fFxuICAgICAgICAgICAgXCJjbG9zaW5nXCIgPT09IHRoaXMucmVhZHlTdGF0ZSkge1xuICAgICAgICAgICAgLy8gY2xlYXIgdGltZXJzXG4gICAgICAgICAgICB0aGlzLmNsZWFyVGltZW91dEZuKHRoaXMuX3BpbmdUaW1lb3V0VGltZXIpO1xuICAgICAgICAgICAgLy8gc3RvcCBldmVudCBmcm9tIGZpcmluZyBhZ2FpbiBmb3IgdHJhbnNwb3J0XG4gICAgICAgICAgICB0aGlzLnRyYW5zcG9ydC5yZW1vdmVBbGxMaXN0ZW5lcnMoXCJjbG9zZVwiKTtcbiAgICAgICAgICAgIC8vIGVuc3VyZSB0cmFuc3BvcnQgd29uJ3Qgc3RheSBvcGVuXG4gICAgICAgICAgICB0aGlzLnRyYW5zcG9ydC5jbG9zZSgpO1xuICAgICAgICAgICAgLy8gaWdub3JlIGZ1cnRoZXIgdHJhbnNwb3J0IGNvbW11bmljYXRpb25cbiAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICAgICAgaWYgKHdpdGhFdmVudExpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9iZWZvcmV1bmxvYWRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoXCJiZWZvcmV1bmxvYWRcIiwgdGhpcy5fYmVmb3JldW5sb2FkRXZlbnRMaXN0ZW5lciwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fb2ZmbGluZUV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IE9GRkxJTkVfRVZFTlRfTElTVEVORVJTLmluZGV4T2YodGhpcy5fb2ZmbGluZUV2ZW50TGlzdGVuZXIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIE9GRkxJTkVfRVZFTlRfTElTVEVORVJTLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHNldCByZWFkeSBzdGF0ZVxuICAgICAgICAgICAgdGhpcy5yZWFkeVN0YXRlID0gXCJjbG9zZWRcIjtcbiAgICAgICAgICAgIC8vIGNsZWFyIHNlc3Npb24gaWRcbiAgICAgICAgICAgIHRoaXMuaWQgPSBudWxsO1xuICAgICAgICAgICAgLy8gZW1pdCBjbG9zZSBldmVudFxuICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJjbG9zZVwiLCByZWFzb24sIGRlc2NyaXB0aW9uKTtcbiAgICAgICAgICAgIC8vIGNsZWFuIGJ1ZmZlcnMgYWZ0ZXIsIHNvIHVzZXJzIGNhbiBzdGlsbFxuICAgICAgICAgICAgLy8gZ3JhYiB0aGUgYnVmZmVycyBvbiBgY2xvc2VgIGV2ZW50XG4gICAgICAgICAgICB0aGlzLndyaXRlQnVmZmVyID0gW107XG4gICAgICAgICAgICB0aGlzLl9wcmV2QnVmZmVyTGVuID0gMDtcbiAgICAgICAgfVxuICAgIH1cbn1cblNvY2tldFdpdGhvdXRVcGdyYWRlLnByb3RvY29sID0gcHJvdG9jb2w7XG4vKipcbiAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBXZWJTb2NrZXQtbGlrZSBpbnRlcmZhY2UgdG8gY29ubmVjdCB0byBhbiBFbmdpbmUuSU8gc2VydmVyLiBUaGUgY29ubmVjdGlvbiB3aWxsIGJlIGVzdGFibGlzaGVkXG4gKiB3aXRoIG9uZSBvZiB0aGUgYXZhaWxhYmxlIGxvdy1sZXZlbCB0cmFuc3BvcnRzLCBsaWtlIEhUVFAgbG9uZy1wb2xsaW5nLCBXZWJTb2NrZXQgb3IgV2ViVHJhbnNwb3J0LlxuICpcbiAqIFRoaXMgY2xhc3MgY29tZXMgd2l0aCBhbiB1cGdyYWRlIG1lY2hhbmlzbSwgd2hpY2ggbWVhbnMgdGhhdCBvbmNlIHRoZSBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkIHdpdGggdGhlIGZpcnN0XG4gKiBsb3ctbGV2ZWwgdHJhbnNwb3J0LCBpdCB3aWxsIHRyeSB0byB1cGdyYWRlIHRvIGEgYmV0dGVyIHRyYW5zcG9ydC5cbiAqXG4gKiBJbiBvcmRlciB0byBhbGxvdyB0cmVlLXNoYWtpbmcsIHRoZXJlIGFyZSBubyB0cmFuc3BvcnRzIGluY2x1ZGVkLCB0aGF0J3Mgd2h5IHRoZSBgdHJhbnNwb3J0c2Agb3B0aW9uIGlzIG1hbmRhdG9yeS5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgU29ja2V0V2l0aFVwZ3JhZGUsIFdlYlNvY2tldCB9IGZyb20gXCJlbmdpbmUuaW8tY2xpZW50XCI7XG4gKlxuICogY29uc3Qgc29ja2V0ID0gbmV3IFNvY2tldFdpdGhVcGdyYWRlKHtcbiAqICAgdHJhbnNwb3J0czogW1dlYlNvY2tldF1cbiAqIH0pO1xuICpcbiAqIHNvY2tldC5vbihcIm9wZW5cIiwgKCkgPT4ge1xuICogICBzb2NrZXQuc2VuZChcImhlbGxvXCIpO1xuICogfSk7XG4gKlxuICogQHNlZSBTb2NrZXRXaXRob3V0VXBncmFkZVxuICogQHNlZSBTb2NrZXRcbiAqL1xuZXhwb3J0IGNsYXNzIFNvY2tldFdpdGhVcGdyYWRlIGV4dGVuZHMgU29ja2V0V2l0aG91dFVwZ3JhZGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLl91cGdyYWRlcyA9IFtdO1xuICAgIH1cbiAgICBvbk9wZW4oKSB7XG4gICAgICAgIHN1cGVyLm9uT3BlbigpO1xuICAgICAgICBpZiAoXCJvcGVuXCIgPT09IHRoaXMucmVhZHlTdGF0ZSAmJiB0aGlzLm9wdHMudXBncmFkZSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl91cGdyYWRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Byb2JlKHRoaXMuX3VwZ3JhZGVzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm9iZXMgYSB0cmFuc3BvcnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSAtIHRyYW5zcG9ydCBuYW1lXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfcHJvYmUobmFtZSkge1xuICAgICAgICBsZXQgdHJhbnNwb3J0ID0gdGhpcy5jcmVhdGVUcmFuc3BvcnQobmFtZSk7XG4gICAgICAgIGxldCBmYWlsZWQgPSBmYWxzZTtcbiAgICAgICAgU29ja2V0V2l0aG91dFVwZ3JhZGUucHJpb3JXZWJzb2NrZXRTdWNjZXNzID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IG9uVHJhbnNwb3J0T3BlbiA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChmYWlsZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdHJhbnNwb3J0LnNlbmQoW3sgdHlwZTogXCJwaW5nXCIsIGRhdGE6IFwicHJvYmVcIiB9XSk7XG4gICAgICAgICAgICB0cmFuc3BvcnQub25jZShcInBhY2tldFwiLCAobXNnKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGZhaWxlZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlmIChcInBvbmdcIiA9PT0gbXNnLnR5cGUgJiYgXCJwcm9iZVwiID09PSBtc2cuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZ3JhZGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwidXBncmFkaW5nXCIsIHRyYW5zcG9ydCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdHJhbnNwb3J0KVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBTb2NrZXRXaXRob3V0VXBncmFkZS5wcmlvcldlYnNvY2tldFN1Y2Nlc3MgPVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ3ZWJzb2NrZXRcIiA9PT0gdHJhbnNwb3J0Lm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0LnBhdXNlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWlsZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFwiY2xvc2VkXCIgPT09IHRoaXMucmVhZHlTdGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFRyYW5zcG9ydCh0cmFuc3BvcnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LnNlbmQoW3sgdHlwZTogXCJ1cGdyYWRlXCIgfV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJ1cGdyYWRlXCIsIHRyYW5zcG9ydCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGdyYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmx1c2goKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoXCJwcm9iZSBlcnJvclwiKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBlcnIudHJhbnNwb3J0ID0gdHJhbnNwb3J0Lm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwidXBncmFkZUVycm9yXCIsIGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGZ1bmN0aW9uIGZyZWV6ZVRyYW5zcG9ydCgpIHtcbiAgICAgICAgICAgIGlmIChmYWlsZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy8gQW55IGNhbGxiYWNrIGNhbGxlZCBieSB0cmFuc3BvcnQgc2hvdWxkIGJlIGlnbm9yZWQgc2luY2Ugbm93XG4gICAgICAgICAgICBmYWlsZWQgPSB0cnVlO1xuICAgICAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICAgICAgdHJhbnNwb3J0LmNsb3NlKCk7XG4gICAgICAgICAgICB0cmFuc3BvcnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIEhhbmRsZSBhbnkgZXJyb3IgdGhhdCBoYXBwZW5zIHdoaWxlIHByb2JpbmdcbiAgICAgICAgY29uc3Qgb25lcnJvciA9IChlcnIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKFwicHJvYmUgZXJyb3I6IFwiICsgZXJyKTtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGVycm9yLnRyYW5zcG9ydCA9IHRyYW5zcG9ydC5uYW1lO1xuICAgICAgICAgICAgZnJlZXplVHJhbnNwb3J0KCk7XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcInVwZ3JhZGVFcnJvclwiLCBlcnJvcik7XG4gICAgICAgIH07XG4gICAgICAgIGZ1bmN0aW9uIG9uVHJhbnNwb3J0Q2xvc2UoKSB7XG4gICAgICAgICAgICBvbmVycm9yKFwidHJhbnNwb3J0IGNsb3NlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXaGVuIHRoZSBzb2NrZXQgaXMgY2xvc2VkIHdoaWxlIHdlJ3JlIHByb2JpbmdcbiAgICAgICAgZnVuY3Rpb24gb25jbG9zZSgpIHtcbiAgICAgICAgICAgIG9uZXJyb3IoXCJzb2NrZXQgY2xvc2VkXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdoZW4gdGhlIHNvY2tldCBpcyB1cGdyYWRlZCB3aGlsZSB3ZSdyZSBwcm9iaW5nXG4gICAgICAgIGZ1bmN0aW9uIG9udXBncmFkZSh0bykge1xuICAgICAgICAgICAgaWYgKHRyYW5zcG9ydCAmJiB0by5uYW1lICE9PSB0cmFuc3BvcnQubmFtZSkge1xuICAgICAgICAgICAgICAgIGZyZWV6ZVRyYW5zcG9ydCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFJlbW92ZSBhbGwgbGlzdGVuZXJzIG9uIHRoZSB0cmFuc3BvcnQgYW5kIG9uIHNlbGZcbiAgICAgICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgICAgIHRyYW5zcG9ydC5yZW1vdmVMaXN0ZW5lcihcIm9wZW5cIiwgb25UcmFuc3BvcnRPcGVuKTtcbiAgICAgICAgICAgIHRyYW5zcG9ydC5yZW1vdmVMaXN0ZW5lcihcImVycm9yXCIsIG9uZXJyb3IpO1xuICAgICAgICAgICAgdHJhbnNwb3J0LnJlbW92ZUxpc3RlbmVyKFwiY2xvc2VcIiwgb25UcmFuc3BvcnRDbG9zZSk7XG4gICAgICAgICAgICB0aGlzLm9mZihcImNsb3NlXCIsIG9uY2xvc2UpO1xuICAgICAgICAgICAgdGhpcy5vZmYoXCJ1cGdyYWRpbmdcIiwgb251cGdyYWRlKTtcbiAgICAgICAgfTtcbiAgICAgICAgdHJhbnNwb3J0Lm9uY2UoXCJvcGVuXCIsIG9uVHJhbnNwb3J0T3Blbik7XG4gICAgICAgIHRyYW5zcG9ydC5vbmNlKFwiZXJyb3JcIiwgb25lcnJvcik7XG4gICAgICAgIHRyYW5zcG9ydC5vbmNlKFwiY2xvc2VcIiwgb25UcmFuc3BvcnRDbG9zZSk7XG4gICAgICAgIHRoaXMub25jZShcImNsb3NlXCIsIG9uY2xvc2UpO1xuICAgICAgICB0aGlzLm9uY2UoXCJ1cGdyYWRpbmdcIiwgb251cGdyYWRlKTtcbiAgICAgICAgaWYgKHRoaXMuX3VwZ3JhZGVzLmluZGV4T2YoXCJ3ZWJ0cmFuc3BvcnRcIikgIT09IC0xICYmXG4gICAgICAgICAgICBuYW1lICE9PSBcIndlYnRyYW5zcG9ydFwiKSB7XG4gICAgICAgICAgICAvLyBmYXZvciBXZWJUcmFuc3BvcnRcbiAgICAgICAgICAgIHRoaXMuc2V0VGltZW91dEZuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWZhaWxlZCkge1xuICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQub3BlbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIDIwMCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0cmFuc3BvcnQub3BlbigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9uSGFuZHNoYWtlKGRhdGEpIHtcbiAgICAgICAgdGhpcy5fdXBncmFkZXMgPSB0aGlzLl9maWx0ZXJVcGdyYWRlcyhkYXRhLnVwZ3JhZGVzKTtcbiAgICAgICAgc3VwZXIub25IYW5kc2hha2UoZGF0YSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZpbHRlcnMgdXBncmFkZXMsIHJldHVybmluZyBvbmx5IHRob3NlIG1hdGNoaW5nIGNsaWVudCB0cmFuc3BvcnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheX0gdXBncmFkZXMgLSBzZXJ2ZXIgdXBncmFkZXNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9maWx0ZXJVcGdyYWRlcyh1cGdyYWRlcykge1xuICAgICAgICBjb25zdCBmaWx0ZXJlZFVwZ3JhZGVzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdXBncmFkZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh+dGhpcy50cmFuc3BvcnRzLmluZGV4T2YodXBncmFkZXNbaV0pKVxuICAgICAgICAgICAgICAgIGZpbHRlcmVkVXBncmFkZXMucHVzaCh1cGdyYWRlc1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbHRlcmVkVXBncmFkZXM7XG4gICAgfVxufVxuLyoqXG4gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgV2ViU29ja2V0LWxpa2UgaW50ZXJmYWNlIHRvIGNvbm5lY3QgdG8gYW4gRW5naW5lLklPIHNlcnZlci4gVGhlIGNvbm5lY3Rpb24gd2lsbCBiZSBlc3RhYmxpc2hlZFxuICogd2l0aCBvbmUgb2YgdGhlIGF2YWlsYWJsZSBsb3ctbGV2ZWwgdHJhbnNwb3J0cywgbGlrZSBIVFRQIGxvbmctcG9sbGluZywgV2ViU29ja2V0IG9yIFdlYlRyYW5zcG9ydC5cbiAqXG4gKiBUaGlzIGNsYXNzIGNvbWVzIHdpdGggYW4gdXBncmFkZSBtZWNoYW5pc20sIHdoaWNoIG1lYW5zIHRoYXQgb25jZSB0aGUgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCB3aXRoIHRoZSBmaXJzdFxuICogbG93LWxldmVsIHRyYW5zcG9ydCwgaXQgd2lsbCB0cnkgdG8gdXBncmFkZSB0byBhIGJldHRlciB0cmFuc3BvcnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IFNvY2tldCB9IGZyb20gXCJlbmdpbmUuaW8tY2xpZW50XCI7XG4gKlxuICogY29uc3Qgc29ja2V0ID0gbmV3IFNvY2tldCgpO1xuICpcbiAqIHNvY2tldC5vbihcIm9wZW5cIiwgKCkgPT4ge1xuICogICBzb2NrZXQuc2VuZChcImhlbGxvXCIpO1xuICogfSk7XG4gKlxuICogQHNlZSBTb2NrZXRXaXRob3V0VXBncmFkZVxuICogQHNlZSBTb2NrZXRXaXRoVXBncmFkZVxuICovXG5leHBvcnQgY2xhc3MgU29ja2V0IGV4dGVuZHMgU29ja2V0V2l0aFVwZ3JhZGUge1xuICAgIGNvbnN0cnVjdG9yKHVyaSwgb3B0cyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IG8gPSB0eXBlb2YgdXJpID09PSBcIm9iamVjdFwiID8gdXJpIDogb3B0cztcbiAgICAgICAgaWYgKCFvLnRyYW5zcG9ydHMgfHxcbiAgICAgICAgICAgIChvLnRyYW5zcG9ydHMgJiYgdHlwZW9mIG8udHJhbnNwb3J0c1swXSA9PT0gXCJzdHJpbmdcIikpIHtcbiAgICAgICAgICAgIG8udHJhbnNwb3J0cyA9IChvLnRyYW5zcG9ydHMgfHwgW1wicG9sbGluZ1wiLCBcIndlYnNvY2tldFwiLCBcIndlYnRyYW5zcG9ydFwiXSlcbiAgICAgICAgICAgICAgICAubWFwKCh0cmFuc3BvcnROYW1lKSA9PiBERUZBVUxUX1RSQU5TUE9SVFNbdHJhbnNwb3J0TmFtZV0pXG4gICAgICAgICAgICAgICAgLmZpbHRlcigodCkgPT4gISF0KTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlcih1cmksIG8pO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBTb2NrZXQgfSBmcm9tIFwiLi9zb2NrZXQuanNcIjtcbmV4cG9ydCB7IFNvY2tldCB9O1xuZXhwb3J0IHsgU29ja2V0V2l0aG91dFVwZ3JhZGUsIFNvY2tldFdpdGhVcGdyYWRlLCB9IGZyb20gXCIuL3NvY2tldC5qc1wiO1xuZXhwb3J0IGNvbnN0IHByb3RvY29sID0gU29ja2V0LnByb3RvY29sO1xuZXhwb3J0IHsgVHJhbnNwb3J0LCBUcmFuc3BvcnRFcnJvciB9IGZyb20gXCIuL3RyYW5zcG9ydC5qc1wiO1xuZXhwb3J0IHsgdHJhbnNwb3J0cyB9IGZyb20gXCIuL3RyYW5zcG9ydHMvaW5kZXguanNcIjtcbmV4cG9ydCB7IGluc3RhbGxUaW1lckZ1bmN0aW9ucyB9IGZyb20gXCIuL3V0aWwuanNcIjtcbmV4cG9ydCB7IHBhcnNlIH0gZnJvbSBcIi4vY29udHJpYi9wYXJzZXVyaS5qc1wiO1xuZXhwb3J0IHsgbmV4dFRpY2sgfSBmcm9tIFwiLi9nbG9iYWxzLm5vZGUuanNcIjtcbmV4cG9ydCB7IEZldGNoIH0gZnJvbSBcIi4vdHJhbnNwb3J0cy9wb2xsaW5nLWZldGNoLmpzXCI7XG5leHBvcnQgeyBYSFIgYXMgTm9kZVhIUiB9IGZyb20gXCIuL3RyYW5zcG9ydHMvcG9sbGluZy14aHIubm9kZS5qc1wiO1xuZXhwb3J0IHsgWEhSIH0gZnJvbSBcIi4vdHJhbnNwb3J0cy9wb2xsaW5nLXhoci5qc1wiO1xuZXhwb3J0IHsgV1MgYXMgTm9kZVdlYlNvY2tldCB9IGZyb20gXCIuL3RyYW5zcG9ydHMvd2Vic29ja2V0Lm5vZGUuanNcIjtcbmV4cG9ydCB7IFdTIGFzIFdlYlNvY2tldCB9IGZyb20gXCIuL3RyYW5zcG9ydHMvd2Vic29ja2V0LmpzXCI7XG5leHBvcnQgeyBXVCBhcyBXZWJUcmFuc3BvcnQgfSBmcm9tIFwiLi90cmFuc3BvcnRzL3dlYnRyYW5zcG9ydC5qc1wiO1xuIiwgImltcG9ydCB7IHBhcnNlIH0gZnJvbSBcImVuZ2luZS5pby1jbGllbnRcIjtcbi8qKlxuICogVVJMIHBhcnNlci5cbiAqXG4gKiBAcGFyYW0gdXJpIC0gdXJsXG4gKiBAcGFyYW0gcGF0aCAtIHRoZSByZXF1ZXN0IHBhdGggb2YgdGhlIGNvbm5lY3Rpb25cbiAqIEBwYXJhbSBsb2MgLSBBbiBvYmplY3QgbWVhbnQgdG8gbWltaWMgd2luZG93LmxvY2F0aW9uLlxuICogICAgICAgIERlZmF1bHRzIHRvIHdpbmRvdy5sb2NhdGlvbi5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVybCh1cmksIHBhdGggPSBcIlwiLCBsb2MpIHtcbiAgICBsZXQgb2JqID0gdXJpO1xuICAgIC8vIGRlZmF1bHQgdG8gd2luZG93LmxvY2F0aW9uXG4gICAgbG9jID0gbG9jIHx8ICh0eXBlb2YgbG9jYXRpb24gIT09IFwidW5kZWZpbmVkXCIgJiYgbG9jYXRpb24pO1xuICAgIGlmIChudWxsID09IHVyaSlcbiAgICAgICAgdXJpID0gbG9jLnByb3RvY29sICsgXCIvL1wiICsgbG9jLmhvc3Q7XG4gICAgLy8gcmVsYXRpdmUgcGF0aCBzdXBwb3J0XG4gICAgaWYgKHR5cGVvZiB1cmkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgaWYgKFwiL1wiID09PSB1cmkuY2hhckF0KDApKSB7XG4gICAgICAgICAgICBpZiAoXCIvXCIgPT09IHVyaS5jaGFyQXQoMSkpIHtcbiAgICAgICAgICAgICAgICB1cmkgPSBsb2MucHJvdG9jb2wgKyB1cmk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB1cmkgPSBsb2MuaG9zdCArIHVyaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIS9eKGh0dHBzP3x3c3M/KTpcXC9cXC8vLnRlc3QodXJpKSkge1xuICAgICAgICAgICAgaWYgKFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiBsb2MpIHtcbiAgICAgICAgICAgICAgICB1cmkgPSBsb2MucHJvdG9jb2wgKyBcIi8vXCIgKyB1cmk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB1cmkgPSBcImh0dHBzOi8vXCIgKyB1cmk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gcGFyc2VcbiAgICAgICAgb2JqID0gcGFyc2UodXJpKTtcbiAgICB9XG4gICAgLy8gbWFrZSBzdXJlIHdlIHRyZWF0IGBsb2NhbGhvc3Q6ODBgIGFuZCBgbG9jYWxob3N0YCBlcXVhbGx5XG4gICAgaWYgKCFvYmoucG9ydCkge1xuICAgICAgICBpZiAoL14oaHR0cHx3cykkLy50ZXN0KG9iai5wcm90b2NvbCkpIHtcbiAgICAgICAgICAgIG9iai5wb3J0ID0gXCI4MFwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKC9eKGh0dHB8d3MpcyQvLnRlc3Qob2JqLnByb3RvY29sKSkge1xuICAgICAgICAgICAgb2JqLnBvcnQgPSBcIjQ0M1wiO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9iai5wYXRoID0gb2JqLnBhdGggfHwgXCIvXCI7XG4gICAgY29uc3QgaXB2NiA9IG9iai5ob3N0LmluZGV4T2YoXCI6XCIpICE9PSAtMTtcbiAgICBjb25zdCBob3N0ID0gaXB2NiA/IFwiW1wiICsgb2JqLmhvc3QgKyBcIl1cIiA6IG9iai5ob3N0O1xuICAgIC8vIGRlZmluZSB1bmlxdWUgaWRcbiAgICBvYmouaWQgPSBvYmoucHJvdG9jb2wgKyBcIjovL1wiICsgaG9zdCArIFwiOlwiICsgb2JqLnBvcnQgKyBwYXRoO1xuICAgIC8vIGRlZmluZSBocmVmXG4gICAgb2JqLmhyZWYgPVxuICAgICAgICBvYmoucHJvdG9jb2wgK1xuICAgICAgICAgICAgXCI6Ly9cIiArXG4gICAgICAgICAgICBob3N0ICtcbiAgICAgICAgICAgIChsb2MgJiYgbG9jLnBvcnQgPT09IG9iai5wb3J0ID8gXCJcIiA6IFwiOlwiICsgb2JqLnBvcnQpO1xuICAgIHJldHVybiBvYmo7XG59XG4iLCAiaW1wb3J0IHsgRW1pdHRlciB9IGZyb20gXCJAc29ja2V0LmlvL2NvbXBvbmVudC1lbWl0dGVyXCI7XG5pbXBvcnQgeyBkZWNvbnN0cnVjdFBhY2tldCwgcmVjb25zdHJ1Y3RQYWNrZXQgfSBmcm9tIFwiLi9iaW5hcnkuanNcIjtcbmltcG9ydCB7IGlzQmluYXJ5LCBoYXNCaW5hcnkgfSBmcm9tIFwiLi9pcy1iaW5hcnkuanNcIjtcbi8qKlxuICogVGhlc2Ugc3RyaW5ncyBtdXN0IG5vdCBiZSB1c2VkIGFzIGV2ZW50IG5hbWVzLCBhcyB0aGV5IGhhdmUgYSBzcGVjaWFsIG1lYW5pbmcuXG4gKi9cbmNvbnN0IFJFU0VSVkVEX0VWRU5UUyA9IFtcbiAgICBcImNvbm5lY3RcIixcbiAgICBcImNvbm5lY3RfZXJyb3JcIixcbiAgICBcImRpc2Nvbm5lY3RcIixcbiAgICBcImRpc2Nvbm5lY3RpbmdcIixcbiAgICBcIm5ld0xpc3RlbmVyXCIsXG4gICAgXCJyZW1vdmVMaXN0ZW5lclwiLCAvLyB1c2VkIGJ5IHRoZSBOb2RlLmpzIEV2ZW50RW1pdHRlclxuXTtcbi8qKlxuICogUHJvdG9jb2wgdmVyc2lvbi5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBwcm90b2NvbCA9IDU7XG5leHBvcnQgdmFyIFBhY2tldFR5cGU7XG4oZnVuY3Rpb24gKFBhY2tldFR5cGUpIHtcbiAgICBQYWNrZXRUeXBlW1BhY2tldFR5cGVbXCJDT05ORUNUXCJdID0gMF0gPSBcIkNPTk5FQ1RcIjtcbiAgICBQYWNrZXRUeXBlW1BhY2tldFR5cGVbXCJESVNDT05ORUNUXCJdID0gMV0gPSBcIkRJU0NPTk5FQ1RcIjtcbiAgICBQYWNrZXRUeXBlW1BhY2tldFR5cGVbXCJFVkVOVFwiXSA9IDJdID0gXCJFVkVOVFwiO1xuICAgIFBhY2tldFR5cGVbUGFja2V0VHlwZVtcIkFDS1wiXSA9IDNdID0gXCJBQ0tcIjtcbiAgICBQYWNrZXRUeXBlW1BhY2tldFR5cGVbXCJDT05ORUNUX0VSUk9SXCJdID0gNF0gPSBcIkNPTk5FQ1RfRVJST1JcIjtcbiAgICBQYWNrZXRUeXBlW1BhY2tldFR5cGVbXCJCSU5BUllfRVZFTlRcIl0gPSA1XSA9IFwiQklOQVJZX0VWRU5UXCI7XG4gICAgUGFja2V0VHlwZVtQYWNrZXRUeXBlW1wiQklOQVJZX0FDS1wiXSA9IDZdID0gXCJCSU5BUllfQUNLXCI7XG59KShQYWNrZXRUeXBlIHx8IChQYWNrZXRUeXBlID0ge30pKTtcbi8qKlxuICogQSBzb2NrZXQuaW8gRW5jb2RlciBpbnN0YW5jZVxuICovXG5leHBvcnQgY2xhc3MgRW5jb2RlciB7XG4gICAgLyoqXG4gICAgICogRW5jb2RlciBjb25zdHJ1Y3RvclxuICAgICAqXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gcmVwbGFjZXIgLSBjdXN0b20gcmVwbGFjZXIgdG8gcGFzcyBkb3duIHRvIEpTT04ucGFyc2VcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihyZXBsYWNlcikge1xuICAgICAgICB0aGlzLnJlcGxhY2VyID0gcmVwbGFjZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVuY29kZSBhIHBhY2tldCBhcyBhIHNpbmdsZSBzdHJpbmcgaWYgbm9uLWJpbmFyeSwgb3IgYXMgYVxuICAgICAqIGJ1ZmZlciBzZXF1ZW5jZSwgZGVwZW5kaW5nIG9uIHBhY2tldCB0eXBlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iaiAtIHBhY2tldCBvYmplY3RcbiAgICAgKi9cbiAgICBlbmNvZGUob2JqKSB7XG4gICAgICAgIGlmIChvYmoudHlwZSA9PT0gUGFja2V0VHlwZS5FVkVOVCB8fCBvYmoudHlwZSA9PT0gUGFja2V0VHlwZS5BQ0spIHtcbiAgICAgICAgICAgIGlmIChoYXNCaW5hcnkob2JqKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVuY29kZUFzQmluYXJ5KHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogb2JqLnR5cGUgPT09IFBhY2tldFR5cGUuRVZFTlRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gUGFja2V0VHlwZS5CSU5BUllfRVZFTlRcbiAgICAgICAgICAgICAgICAgICAgICAgIDogUGFja2V0VHlwZS5CSU5BUllfQUNLLFxuICAgICAgICAgICAgICAgICAgICBuc3A6IG9iai5uc3AsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IG9iai5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBpZDogb2JqLmlkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbdGhpcy5lbmNvZGVBc1N0cmluZyhvYmopXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5jb2RlIHBhY2tldCBhcyBzdHJpbmcuXG4gICAgICovXG4gICAgZW5jb2RlQXNTdHJpbmcob2JqKSB7XG4gICAgICAgIC8vIGZpcnN0IGlzIHR5cGVcbiAgICAgICAgbGV0IHN0ciA9IFwiXCIgKyBvYmoudHlwZTtcbiAgICAgICAgLy8gYXR0YWNobWVudHMgaWYgd2UgaGF2ZSB0aGVtXG4gICAgICAgIGlmIChvYmoudHlwZSA9PT0gUGFja2V0VHlwZS5CSU5BUllfRVZFTlQgfHxcbiAgICAgICAgICAgIG9iai50eXBlID09PSBQYWNrZXRUeXBlLkJJTkFSWV9BQ0spIHtcbiAgICAgICAgICAgIHN0ciArPSBvYmouYXR0YWNobWVudHMgKyBcIi1cIjtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgbmFtZXNwYWNlIG90aGVyIHRoYW4gYC9gXG4gICAgICAgIC8vIHdlIGFwcGVuZCBpdCBmb2xsb3dlZCBieSBhIGNvbW1hIGAsYFxuICAgICAgICBpZiAob2JqLm5zcCAmJiBcIi9cIiAhPT0gb2JqLm5zcCkge1xuICAgICAgICAgICAgc3RyICs9IG9iai5uc3AgKyBcIixcIjtcbiAgICAgICAgfVxuICAgICAgICAvLyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSB0aGUgaWRcbiAgICAgICAgaWYgKG51bGwgIT0gb2JqLmlkKSB7XG4gICAgICAgICAgICBzdHIgKz0gb2JqLmlkO1xuICAgICAgICB9XG4gICAgICAgIC8vIGpzb24gZGF0YVxuICAgICAgICBpZiAobnVsbCAhPSBvYmouZGF0YSkge1xuICAgICAgICAgICAgc3RyICs9IEpTT04uc3RyaW5naWZ5KG9iai5kYXRhLCB0aGlzLnJlcGxhY2VyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbmNvZGUgcGFja2V0IGFzICdidWZmZXIgc2VxdWVuY2UnIGJ5IHJlbW92aW5nIGJsb2JzLCBhbmRcbiAgICAgKiBkZWNvbnN0cnVjdGluZyBwYWNrZXQgaW50byBvYmplY3Qgd2l0aCBwbGFjZWhvbGRlcnMgYW5kXG4gICAgICogYSBsaXN0IG9mIGJ1ZmZlcnMuXG4gICAgICovXG4gICAgZW5jb2RlQXNCaW5hcnkob2JqKSB7XG4gICAgICAgIGNvbnN0IGRlY29uc3RydWN0aW9uID0gZGVjb25zdHJ1Y3RQYWNrZXQob2JqKTtcbiAgICAgICAgY29uc3QgcGFjayA9IHRoaXMuZW5jb2RlQXNTdHJpbmcoZGVjb25zdHJ1Y3Rpb24ucGFja2V0KTtcbiAgICAgICAgY29uc3QgYnVmZmVycyA9IGRlY29uc3RydWN0aW9uLmJ1ZmZlcnM7XG4gICAgICAgIGJ1ZmZlcnMudW5zaGlmdChwYWNrKTsgLy8gYWRkIHBhY2tldCBpbmZvIHRvIGJlZ2lubmluZyBvZiBkYXRhIGxpc3RcbiAgICAgICAgcmV0dXJuIGJ1ZmZlcnM7IC8vIHdyaXRlIGFsbCB0aGUgYnVmZmVyc1xuICAgIH1cbn1cbi8vIHNlZSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy84NTExMjgxL2NoZWNrLWlmLWEtdmFsdWUtaXMtYW4tb2JqZWN0LWluLWphdmFzY3JpcHRcbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09IFwiW29iamVjdCBPYmplY3RdXCI7XG59XG4vKipcbiAqIEEgc29ja2V0LmlvIERlY29kZXIgaW5zdGFuY2VcbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9IGRlY29kZXJcbiAqL1xuZXhwb3J0IGNsYXNzIERlY29kZXIgZXh0ZW5kcyBFbWl0dGVyIHtcbiAgICAvKipcbiAgICAgKiBEZWNvZGVyIGNvbnN0cnVjdG9yXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSByZXZpdmVyIC0gY3VzdG9tIHJldml2ZXIgdG8gcGFzcyBkb3duIHRvIEpTT04uc3RyaW5naWZ5XG4gICAgICovXG4gICAgY29uc3RydWN0b3IocmV2aXZlcikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnJldml2ZXIgPSByZXZpdmVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWNvZGVzIGFuIGVuY29kZWQgcGFja2V0IHN0cmluZyBpbnRvIHBhY2tldCBKU09OLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG9iaiAtIGVuY29kZWQgcGFja2V0XG4gICAgICovXG4gICAgYWRkKG9iaikge1xuICAgICAgICBsZXQgcGFja2V0O1xuICAgICAgICBpZiAodHlwZW9mIG9iaiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVjb25zdHJ1Y3Rvcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImdvdCBwbGFpbnRleHQgZGF0YSB3aGVuIHJlY29uc3RydWN0aW5nIGEgcGFja2V0XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFja2V0ID0gdGhpcy5kZWNvZGVTdHJpbmcob2JqKTtcbiAgICAgICAgICAgIGNvbnN0IGlzQmluYXJ5RXZlbnQgPSBwYWNrZXQudHlwZSA9PT0gUGFja2V0VHlwZS5CSU5BUllfRVZFTlQ7XG4gICAgICAgICAgICBpZiAoaXNCaW5hcnlFdmVudCB8fCBwYWNrZXQudHlwZSA9PT0gUGFja2V0VHlwZS5CSU5BUllfQUNLKSB7XG4gICAgICAgICAgICAgICAgcGFja2V0LnR5cGUgPSBpc0JpbmFyeUV2ZW50ID8gUGFja2V0VHlwZS5FVkVOVCA6IFBhY2tldFR5cGUuQUNLO1xuICAgICAgICAgICAgICAgIC8vIGJpbmFyeSBwYWNrZXQncyBqc29uXG4gICAgICAgICAgICAgICAgdGhpcy5yZWNvbnN0cnVjdG9yID0gbmV3IEJpbmFyeVJlY29uc3RydWN0b3IocGFja2V0KTtcbiAgICAgICAgICAgICAgICAvLyBubyBhdHRhY2htZW50cywgbGFiZWxlZCBiaW5hcnkgYnV0IG5vIGJpbmFyeSBkYXRhIHRvIGZvbGxvd1xuICAgICAgICAgICAgICAgIGlmIChwYWNrZXQuYXR0YWNobWVudHMgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgc3VwZXIuZW1pdFJlc2VydmVkKFwiZGVjb2RlZFwiLCBwYWNrZXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIG5vbi1iaW5hcnkgZnVsbCBwYWNrZXRcbiAgICAgICAgICAgICAgICBzdXBlci5lbWl0UmVzZXJ2ZWQoXCJkZWNvZGVkXCIsIHBhY2tldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNCaW5hcnkob2JqKSB8fCBvYmouYmFzZTY0KSB7XG4gICAgICAgICAgICAvLyByYXcgYmluYXJ5IGRhdGFcbiAgICAgICAgICAgIGlmICghdGhpcy5yZWNvbnN0cnVjdG9yKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZ290IGJpbmFyeSBkYXRhIHdoZW4gbm90IHJlY29uc3RydWN0aW5nIGEgcGFja2V0XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFja2V0ID0gdGhpcy5yZWNvbnN0cnVjdG9yLnRha2VCaW5hcnlEYXRhKG9iaik7XG4gICAgICAgICAgICAgICAgaWYgKHBhY2tldCkge1xuICAgICAgICAgICAgICAgICAgICAvLyByZWNlaXZlZCBmaW5hbCBidWZmZXJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWNvbnN0cnVjdG9yID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgc3VwZXIuZW1pdFJlc2VydmVkKFwiZGVjb2RlZFwiLCBwYWNrZXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gdHlwZTogXCIgKyBvYmopO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlY29kZSBhIHBhY2tldCBTdHJpbmcgKEpTT04gZGF0YSlcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHBhY2tldFxuICAgICAqL1xuICAgIGRlY29kZVN0cmluZyhzdHIpIHtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAvLyBsb29rIHVwIHR5cGVcbiAgICAgICAgY29uc3QgcCA9IHtcbiAgICAgICAgICAgIHR5cGU6IE51bWJlcihzdHIuY2hhckF0KDApKSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKFBhY2tldFR5cGVbcC50eXBlXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIHBhY2tldCB0eXBlIFwiICsgcC50eXBlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBsb29rIHVwIGF0dGFjaG1lbnRzIGlmIHR5cGUgYmluYXJ5XG4gICAgICAgIGlmIChwLnR5cGUgPT09IFBhY2tldFR5cGUuQklOQVJZX0VWRU5UIHx8XG4gICAgICAgICAgICBwLnR5cGUgPT09IFBhY2tldFR5cGUuQklOQVJZX0FDSykge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBpICsgMTtcbiAgICAgICAgICAgIHdoaWxlIChzdHIuY2hhckF0KCsraSkgIT09IFwiLVwiICYmIGkgIT0gc3RyLmxlbmd0aCkgeyB9XG4gICAgICAgICAgICBjb25zdCBidWYgPSBzdHIuc3Vic3RyaW5nKHN0YXJ0LCBpKTtcbiAgICAgICAgICAgIGlmIChidWYgIT0gTnVtYmVyKGJ1ZikgfHwgc3RyLmNoYXJBdChpKSAhPT0gXCItXCIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbGxlZ2FsIGF0dGFjaG1lbnRzXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcC5hdHRhY2htZW50cyA9IE51bWJlcihidWYpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGxvb2sgdXAgbmFtZXNwYWNlIChpZiBhbnkpXG4gICAgICAgIGlmIChcIi9cIiA9PT0gc3RyLmNoYXJBdChpICsgMSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gaSArIDE7XG4gICAgICAgICAgICB3aGlsZSAoKytpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYyA9IHN0ci5jaGFyQXQoaSk7XG4gICAgICAgICAgICAgICAgaWYgKFwiLFwiID09PSBjKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gc3RyLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwLm5zcCA9IHN0ci5zdWJzdHJpbmcoc3RhcnQsIGkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcC5uc3AgPSBcIi9cIjtcbiAgICAgICAgfVxuICAgICAgICAvLyBsb29rIHVwIGlkXG4gICAgICAgIGNvbnN0IG5leHQgPSBzdHIuY2hhckF0KGkgKyAxKTtcbiAgICAgICAgaWYgKFwiXCIgIT09IG5leHQgJiYgTnVtYmVyKG5leHQpID09IG5leHQpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gaSArIDE7XG4gICAgICAgICAgICB3aGlsZSAoKytpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYyA9IHN0ci5jaGFyQXQoaSk7XG4gICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gYyB8fCBOdW1iZXIoYykgIT0gYykge1xuICAgICAgICAgICAgICAgICAgICAtLWk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gc3RyLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwLmlkID0gTnVtYmVyKHN0ci5zdWJzdHJpbmcoc3RhcnQsIGkgKyAxKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbG9vayB1cCBqc29uIGRhdGFcbiAgICAgICAgaWYgKHN0ci5jaGFyQXQoKytpKSkge1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMudHJ5UGFyc2Uoc3RyLnN1YnN0cihpKSk7XG4gICAgICAgICAgICBpZiAoRGVjb2Rlci5pc1BheWxvYWRWYWxpZChwLnR5cGUsIHBheWxvYWQpKSB7XG4gICAgICAgICAgICAgICAgcC5kYXRhID0gcGF5bG9hZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgcGF5bG9hZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcDtcbiAgICB9XG4gICAgdHJ5UGFyc2Uoc3RyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShzdHIsIHRoaXMucmV2aXZlcik7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgaXNQYXlsb2FkVmFsaWQodHlwZSwgcGF5bG9hZCkge1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgUGFja2V0VHlwZS5DT05ORUNUOlxuICAgICAgICAgICAgICAgIHJldHVybiBpc09iamVjdChwYXlsb2FkKTtcbiAgICAgICAgICAgIGNhc2UgUGFja2V0VHlwZS5ESVNDT05ORUNUOlxuICAgICAgICAgICAgICAgIHJldHVybiBwYXlsb2FkID09PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjYXNlIFBhY2tldFR5cGUuQ09OTkVDVF9FUlJPUjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIHBheWxvYWQgPT09IFwic3RyaW5nXCIgfHwgaXNPYmplY3QocGF5bG9hZCk7XG4gICAgICAgICAgICBjYXNlIFBhY2tldFR5cGUuRVZFTlQ6XG4gICAgICAgICAgICBjYXNlIFBhY2tldFR5cGUuQklOQVJZX0VWRU5UOlxuICAgICAgICAgICAgICAgIHJldHVybiAoQXJyYXkuaXNBcnJheShwYXlsb2FkKSAmJlxuICAgICAgICAgICAgICAgICAgICAodHlwZW9mIHBheWxvYWRbMF0gPT09IFwibnVtYmVyXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlb2YgcGF5bG9hZFswXSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFU0VSVkVEX0VWRU5UUy5pbmRleE9mKHBheWxvYWRbMF0pID09PSAtMSkpKTtcbiAgICAgICAgICAgIGNhc2UgUGFja2V0VHlwZS5BQ0s6XG4gICAgICAgICAgICBjYXNlIFBhY2tldFR5cGUuQklOQVJZX0FDSzpcbiAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShwYXlsb2FkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWFsbG9jYXRlcyBhIHBhcnNlcidzIHJlc291cmNlc1xuICAgICAqL1xuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLnJlY29uc3RydWN0b3IpIHtcbiAgICAgICAgICAgIHRoaXMucmVjb25zdHJ1Y3Rvci5maW5pc2hlZFJlY29uc3RydWN0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLnJlY29uc3RydWN0b3IgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBBIG1hbmFnZXIgb2YgYSBiaW5hcnkgZXZlbnQncyAnYnVmZmVyIHNlcXVlbmNlJy4gU2hvdWxkXG4gKiBiZSBjb25zdHJ1Y3RlZCB3aGVuZXZlciBhIHBhY2tldCBvZiB0eXBlIEJJTkFSWV9FVkVOVCBpc1xuICogZGVjb2RlZC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFja2V0XG4gKiBAcmV0dXJuIHtCaW5hcnlSZWNvbnN0cnVjdG9yfSBpbml0aWFsaXplZCByZWNvbnN0cnVjdG9yXG4gKi9cbmNsYXNzIEJpbmFyeVJlY29uc3RydWN0b3Ige1xuICAgIGNvbnN0cnVjdG9yKHBhY2tldCkge1xuICAgICAgICB0aGlzLnBhY2tldCA9IHBhY2tldDtcbiAgICAgICAgdGhpcy5idWZmZXJzID0gW107XG4gICAgICAgIHRoaXMucmVjb25QYWNrID0gcGFja2V0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNZXRob2QgdG8gYmUgY2FsbGVkIHdoZW4gYmluYXJ5IGRhdGEgcmVjZWl2ZWQgZnJvbSBjb25uZWN0aW9uXG4gICAgICogYWZ0ZXIgYSBCSU5BUllfRVZFTlQgcGFja2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtCdWZmZXIgfCBBcnJheUJ1ZmZlcn0gYmluRGF0YSAtIHRoZSByYXcgYmluYXJ5IGRhdGEgcmVjZWl2ZWRcbiAgICAgKiBAcmV0dXJuIHtudWxsIHwgT2JqZWN0fSByZXR1cm5zIG51bGwgaWYgbW9yZSBiaW5hcnkgZGF0YSBpcyBleHBlY3RlZCBvclxuICAgICAqICAgYSByZWNvbnN0cnVjdGVkIHBhY2tldCBvYmplY3QgaWYgYWxsIGJ1ZmZlcnMgaGF2ZSBiZWVuIHJlY2VpdmVkLlxuICAgICAqL1xuICAgIHRha2VCaW5hcnlEYXRhKGJpbkRhdGEpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzLnB1c2goYmluRGF0YSk7XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlcnMubGVuZ3RoID09PSB0aGlzLnJlY29uUGFjay5hdHRhY2htZW50cykge1xuICAgICAgICAgICAgLy8gZG9uZSB3aXRoIGJ1ZmZlciBsaXN0XG4gICAgICAgICAgICBjb25zdCBwYWNrZXQgPSByZWNvbnN0cnVjdFBhY2tldCh0aGlzLnJlY29uUGFjaywgdGhpcy5idWZmZXJzKTtcbiAgICAgICAgICAgIHRoaXMuZmluaXNoZWRSZWNvbnN0cnVjdGlvbigpO1xuICAgICAgICAgICAgcmV0dXJuIHBhY2tldDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYW5zIHVwIGJpbmFyeSBwYWNrZXQgcmVjb25zdHJ1Y3Rpb24gdmFyaWFibGVzLlxuICAgICAqL1xuICAgIGZpbmlzaGVkUmVjb25zdHJ1Y3Rpb24oKSB7XG4gICAgICAgIHRoaXMucmVjb25QYWNrID0gbnVsbDtcbiAgICAgICAgdGhpcy5idWZmZXJzID0gW107XG4gICAgfVxufVxuIiwgImNvbnN0IHdpdGhOYXRpdmVBcnJheUJ1ZmZlciA9IHR5cGVvZiBBcnJheUJ1ZmZlciA9PT0gXCJmdW5jdGlvblwiO1xuY29uc3QgaXNWaWV3ID0gKG9iaikgPT4ge1xuICAgIHJldHVybiB0eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyBBcnJheUJ1ZmZlci5pc1ZpZXcob2JqKVxuICAgICAgICA6IG9iai5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcjtcbn07XG5jb25zdCB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5jb25zdCB3aXRoTmF0aXZlQmxvYiA9IHR5cGVvZiBCbG9iID09PSBcImZ1bmN0aW9uXCIgfHxcbiAgICAodHlwZW9mIEJsb2IgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdG9TdHJpbmcuY2FsbChCbG9iKSA9PT0gXCJbb2JqZWN0IEJsb2JDb25zdHJ1Y3Rvcl1cIik7XG5jb25zdCB3aXRoTmF0aXZlRmlsZSA9IHR5cGVvZiBGaWxlID09PSBcImZ1bmN0aW9uXCIgfHxcbiAgICAodHlwZW9mIEZpbGUgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdG9TdHJpbmcuY2FsbChGaWxlKSA9PT0gXCJbb2JqZWN0IEZpbGVDb25zdHJ1Y3Rvcl1cIik7XG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBvYmogaXMgYSBCdWZmZXIsIGFuIEFycmF5QnVmZmVyLCBhIEJsb2Igb3IgYSBGaWxlLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0JpbmFyeShvYmopIHtcbiAgICByZXR1cm4gKCh3aXRoTmF0aXZlQXJyYXlCdWZmZXIgJiYgKG9iaiBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8IGlzVmlldyhvYmopKSkgfHxcbiAgICAgICAgKHdpdGhOYXRpdmVCbG9iICYmIG9iaiBpbnN0YW5jZW9mIEJsb2IpIHx8XG4gICAgICAgICh3aXRoTmF0aXZlRmlsZSAmJiBvYmogaW5zdGFuY2VvZiBGaWxlKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaGFzQmluYXJ5KG9iaiwgdG9KU09OKSB7XG4gICAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBvYmoubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaGFzQmluYXJ5KG9ialtpXSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChpc0JpbmFyeShvYmopKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAob2JqLnRvSlNPTiAmJlxuICAgICAgICB0eXBlb2Ygb2JqLnRvSlNPTiA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgIGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGhhc0JpbmFyeShvYmoudG9KU09OKCksIHRydWUpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkgJiYgaGFzQmluYXJ5KG9ialtrZXldKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuIiwgImltcG9ydCB7IGlzQmluYXJ5IH0gZnJvbSBcIi4vaXMtYmluYXJ5LmpzXCI7XG4vKipcbiAqIFJlcGxhY2VzIGV2ZXJ5IEJ1ZmZlciB8IEFycmF5QnVmZmVyIHwgQmxvYiB8IEZpbGUgaW4gcGFja2V0IHdpdGggYSBudW1iZXJlZCBwbGFjZWhvbGRlci5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFja2V0IC0gc29ja2V0LmlvIGV2ZW50IHBhY2tldFxuICogQHJldHVybiB7T2JqZWN0fSB3aXRoIGRlY29uc3RydWN0ZWQgcGFja2V0IGFuZCBsaXN0IG9mIGJ1ZmZlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29uc3RydWN0UGFja2V0KHBhY2tldCkge1xuICAgIGNvbnN0IGJ1ZmZlcnMgPSBbXTtcbiAgICBjb25zdCBwYWNrZXREYXRhID0gcGFja2V0LmRhdGE7XG4gICAgY29uc3QgcGFjayA9IHBhY2tldDtcbiAgICBwYWNrLmRhdGEgPSBfZGVjb25zdHJ1Y3RQYWNrZXQocGFja2V0RGF0YSwgYnVmZmVycyk7XG4gICAgcGFjay5hdHRhY2htZW50cyA9IGJ1ZmZlcnMubGVuZ3RoOyAvLyBudW1iZXIgb2YgYmluYXJ5ICdhdHRhY2htZW50cydcbiAgICByZXR1cm4geyBwYWNrZXQ6IHBhY2ssIGJ1ZmZlcnM6IGJ1ZmZlcnMgfTtcbn1cbmZ1bmN0aW9uIF9kZWNvbnN0cnVjdFBhY2tldChkYXRhLCBidWZmZXJzKSB7XG4gICAgaWYgKCFkYXRhKVxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICBpZiAoaXNCaW5hcnkoZGF0YSkpIHtcbiAgICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSB7IF9wbGFjZWhvbGRlcjogdHJ1ZSwgbnVtOiBidWZmZXJzLmxlbmd0aCB9O1xuICAgICAgICBidWZmZXJzLnB1c2goZGF0YSk7XG4gICAgICAgIHJldHVybiBwbGFjZWhvbGRlcjtcbiAgICB9XG4gICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICBjb25zdCBuZXdEYXRhID0gbmV3IEFycmF5KGRhdGEubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBuZXdEYXRhW2ldID0gX2RlY29uc3RydWN0UGFja2V0KGRhdGFbaV0sIGJ1ZmZlcnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdEYXRhO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgZGF0YSA9PT0gXCJvYmplY3RcIiAmJiAhKGRhdGEgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgICBjb25zdCBuZXdEYXRhID0ge307XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSkge1xuICAgICAgICAgICAgICAgIG5ld0RhdGFba2V5XSA9IF9kZWNvbnN0cnVjdFBhY2tldChkYXRhW2tleV0sIGJ1ZmZlcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdEYXRhO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbn1cbi8qKlxuICogUmVjb25zdHJ1Y3RzIGEgYmluYXJ5IHBhY2tldCBmcm9tIGl0cyBwbGFjZWhvbGRlciBwYWNrZXQgYW5kIGJ1ZmZlcnNcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFja2V0IC0gZXZlbnQgcGFja2V0IHdpdGggcGxhY2Vob2xkZXJzXG4gKiBAcGFyYW0ge0FycmF5fSBidWZmZXJzIC0gYmluYXJ5IGJ1ZmZlcnMgdG8gcHV0IGluIHBsYWNlaG9sZGVyIHBvc2l0aW9uc1xuICogQHJldHVybiB7T2JqZWN0fSByZWNvbnN0cnVjdGVkIHBhY2tldFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb25zdHJ1Y3RQYWNrZXQocGFja2V0LCBidWZmZXJzKSB7XG4gICAgcGFja2V0LmRhdGEgPSBfcmVjb25zdHJ1Y3RQYWNrZXQocGFja2V0LmRhdGEsIGJ1ZmZlcnMpO1xuICAgIGRlbGV0ZSBwYWNrZXQuYXR0YWNobWVudHM7IC8vIG5vIGxvbmdlciB1c2VmdWxcbiAgICByZXR1cm4gcGFja2V0O1xufVxuZnVuY3Rpb24gX3JlY29uc3RydWN0UGFja2V0KGRhdGEsIGJ1ZmZlcnMpIHtcbiAgICBpZiAoIWRhdGEpXG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIGlmIChkYXRhICYmIGRhdGEuX3BsYWNlaG9sZGVyID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IGlzSW5kZXhWYWxpZCA9IHR5cGVvZiBkYXRhLm51bSA9PT0gXCJudW1iZXJcIiAmJlxuICAgICAgICAgICAgZGF0YS5udW0gPj0gMCAmJlxuICAgICAgICAgICAgZGF0YS5udW0gPCBidWZmZXJzLmxlbmd0aDtcbiAgICAgICAgaWYgKGlzSW5kZXhWYWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcnNbZGF0YS5udW1dOyAvLyBhcHByb3ByaWF0ZSBidWZmZXIgKHNob3VsZCBiZSBuYXR1cmFsIG9yZGVyIGFueXdheSlcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgYXR0YWNobWVudHNcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGRhdGFbaV0gPSBfcmVjb25zdHJ1Y3RQYWNrZXQoZGF0YVtpXSwgYnVmZmVycyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgZGF0YVtrZXldID0gX3JlY29uc3RydWN0UGFja2V0KGRhdGFba2V5XSwgYnVmZmVycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIG9uKG9iaiwgZXYsIGZuKSB7XG4gICAgb2JqLm9uKGV2LCBmbik7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHN1YkRlc3Ryb3koKSB7XG4gICAgICAgIG9iai5vZmYoZXYsIGZuKTtcbiAgICB9O1xufVxuIiwgImltcG9ydCB7IFBhY2tldFR5cGUgfSBmcm9tIFwic29ja2V0LmlvLXBhcnNlclwiO1xuaW1wb3J0IHsgb24gfSBmcm9tIFwiLi9vbi5qc1wiO1xuaW1wb3J0IHsgRW1pdHRlciwgfSBmcm9tIFwiQHNvY2tldC5pby9jb21wb25lbnQtZW1pdHRlclwiO1xuLyoqXG4gKiBJbnRlcm5hbCBldmVudHMuXG4gKiBUaGVzZSBldmVudHMgY2FuJ3QgYmUgZW1pdHRlZCBieSB0aGUgdXNlci5cbiAqL1xuY29uc3QgUkVTRVJWRURfRVZFTlRTID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgY29ubmVjdDogMSxcbiAgICBjb25uZWN0X2Vycm9yOiAxLFxuICAgIGRpc2Nvbm5lY3Q6IDEsXG4gICAgZGlzY29ubmVjdGluZzogMSxcbiAgICAvLyBFdmVudEVtaXR0ZXIgcmVzZXJ2ZWQgZXZlbnRzOiBodHRwczovL25vZGVqcy5vcmcvYXBpL2V2ZW50cy5odG1sI2V2ZW50c19ldmVudF9uZXdsaXN0ZW5lclxuICAgIG5ld0xpc3RlbmVyOiAxLFxuICAgIHJlbW92ZUxpc3RlbmVyOiAxLFxufSk7XG4vKipcbiAqIEEgU29ja2V0IGlzIHRoZSBmdW5kYW1lbnRhbCBjbGFzcyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgc2VydmVyLlxuICpcbiAqIEEgU29ja2V0IGJlbG9uZ3MgdG8gYSBjZXJ0YWluIE5hbWVzcGFjZSAoYnkgZGVmYXVsdCAvKSBhbmQgdXNlcyBhbiB1bmRlcmx5aW5nIHtAbGluayBNYW5hZ2VyfSB0byBjb21tdW5pY2F0ZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgc29ja2V0ID0gaW8oKTtcbiAqXG4gKiBzb2NrZXQub24oXCJjb25uZWN0XCIsICgpID0+IHtcbiAqICAgY29uc29sZS5sb2coXCJjb25uZWN0ZWRcIik7XG4gKiB9KTtcbiAqXG4gKiAvLyBzZW5kIGFuIGV2ZW50IHRvIHRoZSBzZXJ2ZXJcbiAqIHNvY2tldC5lbWl0KFwiZm9vXCIsIFwiYmFyXCIpO1xuICpcbiAqIHNvY2tldC5vbihcImZvb2JhclwiLCAoKSA9PiB7XG4gKiAgIC8vIGFuIGV2ZW50IHdhcyByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXJcbiAqIH0pO1xuICpcbiAqIC8vIHVwb24gZGlzY29ubmVjdGlvblxuICogc29ja2V0Lm9uKFwiZGlzY29ubmVjdFwiLCAocmVhc29uKSA9PiB7XG4gKiAgIGNvbnNvbGUubG9nKGBkaXNjb25uZWN0ZWQgZHVlIHRvICR7cmVhc29ufWApO1xuICogfSk7XG4gKi9cbmV4cG9ydCBjbGFzcyBTb2NrZXQgZXh0ZW5kcyBFbWl0dGVyIHtcbiAgICAvKipcbiAgICAgKiBgU29ja2V0YCBjb25zdHJ1Y3Rvci5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihpbywgbnNwLCBvcHRzKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGV0aGVyIHRoZSBzb2NrZXQgaXMgY3VycmVudGx5IGNvbm5lY3RlZCB0byB0aGUgc2VydmVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKiBjb25zdCBzb2NrZXQgPSBpbygpO1xuICAgICAgICAgKlxuICAgICAgICAgKiBzb2NrZXQub24oXCJjb25uZWN0XCIsICgpID0+IHtcbiAgICAgICAgICogICBjb25zb2xlLmxvZyhzb2NrZXQuY29ubmVjdGVkKTsgLy8gdHJ1ZVxuICAgICAgICAgKiB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogc29ja2V0Lm9uKFwiZGlzY29ubmVjdFwiLCAoKSA9PiB7XG4gICAgICAgICAqICAgY29uc29sZS5sb2coc29ja2V0LmNvbm5lY3RlZCk7IC8vIGZhbHNlXG4gICAgICAgICAqIH0pO1xuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gc3RhdGUgd2FzIHJlY292ZXJlZCBhZnRlciBhIHRlbXBvcmFyeSBkaXNjb25uZWN0aW9uLiBJbiB0aGF0IGNhc2UsIGFueSBtaXNzZWQgcGFja2V0cyB3aWxsXG4gICAgICAgICAqIGJlIHRyYW5zbWl0dGVkIGJ5IHRoZSBzZXJ2ZXIuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlY292ZXJlZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogQnVmZmVyIGZvciBwYWNrZXRzIHJlY2VpdmVkIGJlZm9yZSB0aGUgQ09OTkVDVCBwYWNrZXRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmVjZWl2ZUJ1ZmZlciA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogQnVmZmVyIGZvciBwYWNrZXRzIHRoYXQgd2lsbCBiZSBzZW50IG9uY2UgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc2VuZEJ1ZmZlciA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHF1ZXVlIG9mIHBhY2tldHMgdG8gYmUgc2VudCB3aXRoIHJldHJ5IGluIGNhc2Ugb2YgZmFpbHVyZS5cbiAgICAgICAgICpcbiAgICAgICAgICogUGFja2V0cyBhcmUgc2VudCBvbmUgYnkgb25lLCBlYWNoIHdhaXRpbmcgZm9yIHRoZSBzZXJ2ZXIgYWNrbm93bGVkZ2VtZW50LCBpbiBvcmRlciB0byBndWFyYW50ZWUgdGhlIGRlbGl2ZXJ5IG9yZGVyLlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fcXVldWUgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgc2VxdWVuY2UgdG8gZ2VuZXJhdGUgdGhlIElEIG9mIHRoZSB7QGxpbmsgUXVldWVkUGFja2V0fS5cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX3F1ZXVlU2VxID0gMDtcbiAgICAgICAgdGhpcy5pZHMgPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgICogQSBtYXAgY29udGFpbmluZyBhY2tub3dsZWRnZW1lbnQgaGFuZGxlcnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBgd2l0aEVycm9yYCBhdHRyaWJ1dGUgaXMgdXNlZCB0byBkaWZmZXJlbnRpYXRlIGhhbmRsZXJzIHRoYXQgYWNjZXB0IGFuIGVycm9yIGFzIGZpcnN0IGFyZ3VtZW50OlxuICAgICAgICAgKlxuICAgICAgICAgKiAtIGBzb2NrZXQuZW1pdChcInRlc3RcIiwgKGVyciwgdmFsdWUpID0+IHsgLi4uIH0pYCB3aXRoIGBhY2tUaW1lb3V0YCBvcHRpb25cbiAgICAgICAgICogLSBgc29ja2V0LnRpbWVvdXQoNTAwMCkuZW1pdChcInRlc3RcIiwgKGVyciwgdmFsdWUpID0+IHsgLi4uIH0pYFxuICAgICAgICAgKiAtIGBjb25zdCB2YWx1ZSA9IGF3YWl0IHNvY2tldC5lbWl0V2l0aEFjayhcInRlc3RcIilgXG4gICAgICAgICAqXG4gICAgICAgICAqIEZyb20gdGhvc2UgdGhhdCBkb24ndDpcbiAgICAgICAgICpcbiAgICAgICAgICogLSBgc29ja2V0LmVtaXQoXCJ0ZXN0XCIsICh2YWx1ZSkgPT4geyAuLi4gfSk7YFxuICAgICAgICAgKlxuICAgICAgICAgKiBJbiB0aGUgZmlyc3QgY2FzZSwgdGhlIGhhbmRsZXJzIHdpbGwgYmUgY2FsbGVkIHdpdGggYW4gZXJyb3Igd2hlbjpcbiAgICAgICAgICpcbiAgICAgICAgICogLSB0aGUgdGltZW91dCBpcyByZWFjaGVkXG4gICAgICAgICAqIC0gdGhlIHNvY2tldCBnZXRzIGRpc2Nvbm5lY3RlZFxuICAgICAgICAgKlxuICAgICAgICAgKiBJbiB0aGUgc2Vjb25kIGNhc2UsIHRoZSBoYW5kbGVycyB3aWxsIGJlIHNpbXBseSBkaXNjYXJkZWQgdXBvbiBkaXNjb25uZWN0aW9uLCBzaW5jZSB0aGUgY2xpZW50IHdpbGwgbmV2ZXIgcmVjZWl2ZVxuICAgICAgICAgKiBhbiBhY2tub3dsZWRnZW1lbnQgZnJvbSB0aGUgc2VydmVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hY2tzID0ge307XG4gICAgICAgIHRoaXMuZmxhZ3MgPSB7fTtcbiAgICAgICAgdGhpcy5pbyA9IGlvO1xuICAgICAgICB0aGlzLm5zcCA9IG5zcDtcbiAgICAgICAgaWYgKG9wdHMgJiYgb3B0cy5hdXRoKSB7XG4gICAgICAgICAgICB0aGlzLmF1dGggPSBvcHRzLmF1dGg7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fb3B0cyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdHMpO1xuICAgICAgICBpZiAodGhpcy5pby5fYXV0b0Nvbm5lY3QpXG4gICAgICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgc29ja2V0IGlzIGN1cnJlbnRseSBkaXNjb25uZWN0ZWRcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3Qgc29ja2V0ID0gaW8oKTtcbiAgICAgKlxuICAgICAqIHNvY2tldC5vbihcImNvbm5lY3RcIiwgKCkgPT4ge1xuICAgICAqICAgY29uc29sZS5sb2coc29ja2V0LmRpc2Nvbm5lY3RlZCk7IC8vIGZhbHNlXG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBzb2NrZXQub24oXCJkaXNjb25uZWN0XCIsICgpID0+IHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKHNvY2tldC5kaXNjb25uZWN0ZWQpOyAvLyB0cnVlXG4gICAgICogfSk7XG4gICAgICovXG4gICAgZ2V0IGRpc2Nvbm5lY3RlZCgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmNvbm5lY3RlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3Vic2NyaWJlIHRvIG9wZW4sIGNsb3NlIGFuZCBwYWNrZXQgZXZlbnRzXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHN1YkV2ZW50cygpIHtcbiAgICAgICAgaWYgKHRoaXMuc3VicylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY29uc3QgaW8gPSB0aGlzLmlvO1xuICAgICAgICB0aGlzLnN1YnMgPSBbXG4gICAgICAgICAgICBvbihpbywgXCJvcGVuXCIsIHRoaXMub25vcGVuLmJpbmQodGhpcykpLFxuICAgICAgICAgICAgb24oaW8sIFwicGFja2V0XCIsIHRoaXMub25wYWNrZXQuYmluZCh0aGlzKSksXG4gICAgICAgICAgICBvbihpbywgXCJlcnJvclwiLCB0aGlzLm9uZXJyb3IuYmluZCh0aGlzKSksXG4gICAgICAgICAgICBvbihpbywgXCJjbG9zZVwiLCB0aGlzLm9uY2xvc2UuYmluZCh0aGlzKSksXG4gICAgICAgIF07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIFNvY2tldCB3aWxsIHRyeSB0byByZWNvbm5lY3Qgd2hlbiBpdHMgTWFuYWdlciBjb25uZWN0cyBvciByZWNvbm5lY3RzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBzb2NrZXQgPSBpbygpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coc29ja2V0LmFjdGl2ZSk7IC8vIHRydWVcbiAgICAgKlxuICAgICAqIHNvY2tldC5vbihcImRpc2Nvbm5lY3RcIiwgKHJlYXNvbikgPT4ge1xuICAgICAqICAgaWYgKHJlYXNvbiA9PT0gXCJpbyBzZXJ2ZXIgZGlzY29ubmVjdFwiKSB7XG4gICAgICogICAgIC8vIHRoZSBkaXNjb25uZWN0aW9uIHdhcyBpbml0aWF0ZWQgYnkgdGhlIHNlcnZlciwgeW91IG5lZWQgdG8gbWFudWFsbHkgcmVjb25uZWN0XG4gICAgICogICAgIGNvbnNvbGUubG9nKHNvY2tldC5hY3RpdmUpOyAvLyBmYWxzZVxuICAgICAqICAgfVxuICAgICAqICAgLy8gZWxzZSB0aGUgc29ja2V0IHdpbGwgYXV0b21hdGljYWxseSB0cnkgdG8gcmVjb25uZWN0XG4gICAgICogICBjb25zb2xlLmxvZyhzb2NrZXQuYWN0aXZlKTsgLy8gdHJ1ZVxuICAgICAqIH0pO1xuICAgICAqL1xuICAgIGdldCBhY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuc3VicztcbiAgICB9XG4gICAgLyoqXG4gICAgICogXCJPcGVuc1wiIHRoZSBzb2NrZXQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IHNvY2tldCA9IGlvKHtcbiAgICAgKiAgIGF1dG9Db25uZWN0OiBmYWxzZVxuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogc29ja2V0LmNvbm5lY3QoKTtcbiAgICAgKi9cbiAgICBjb25uZWN0KCkge1xuICAgICAgICBpZiAodGhpcy5jb25uZWN0ZWQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgdGhpcy5zdWJFdmVudHMoKTtcbiAgICAgICAgaWYgKCF0aGlzLmlvW1wiX3JlY29ubmVjdGluZ1wiXSlcbiAgICAgICAgICAgIHRoaXMuaW8ub3BlbigpOyAvLyBlbnN1cmUgb3BlblxuICAgICAgICBpZiAoXCJvcGVuXCIgPT09IHRoaXMuaW8uX3JlYWR5U3RhdGUpXG4gICAgICAgICAgICB0aGlzLm9ub3BlbigpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWxpYXMgZm9yIHtAbGluayBjb25uZWN0KCl9LlxuICAgICAqL1xuICAgIG9wZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3QoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZHMgYSBgbWVzc2FnZWAgZXZlbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBtaW1pY3MgdGhlIFdlYlNvY2tldC5zZW5kKCkgbWV0aG9kLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2ViU29ja2V0L3NlbmRcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogc29ja2V0LnNlbmQoXCJoZWxsb1wiKTtcbiAgICAgKlxuICAgICAqIC8vIHRoaXMgaXMgZXF1aXZhbGVudCB0b1xuICAgICAqIHNvY2tldC5lbWl0KFwibWVzc2FnZVwiLCBcImhlbGxvXCIpO1xuICAgICAqXG4gICAgICogQHJldHVybiBzZWxmXG4gICAgICovXG4gICAgc2VuZCguLi5hcmdzKSB7XG4gICAgICAgIGFyZ3MudW5zaGlmdChcIm1lc3NhZ2VcIik7XG4gICAgICAgIHRoaXMuZW1pdC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIGBlbWl0YC5cbiAgICAgKiBJZiB0aGUgZXZlbnQgaXMgaW4gYGV2ZW50c2AsIGl0J3MgZW1pdHRlZCBub3JtYWxseS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogc29ja2V0LmVtaXQoXCJoZWxsb1wiLCBcIndvcmxkXCIpO1xuICAgICAqXG4gICAgICogLy8gYWxsIHNlcmlhbGl6YWJsZSBkYXRhc3RydWN0dXJlcyBhcmUgc3VwcG9ydGVkIChubyBuZWVkIHRvIGNhbGwgSlNPTi5zdHJpbmdpZnkpXG4gICAgICogc29ja2V0LmVtaXQoXCJoZWxsb1wiLCAxLCBcIjJcIiwgeyAzOiBbXCI0XCJdLCA1OiBVaW50OEFycmF5LmZyb20oWzZdKSB9KTtcbiAgICAgKlxuICAgICAqIC8vIHdpdGggYW4gYWNrbm93bGVkZ2VtZW50IGZyb20gdGhlIHNlcnZlclxuICAgICAqIHNvY2tldC5lbWl0KFwiaGVsbG9cIiwgXCJ3b3JsZFwiLCAodmFsKSA9PiB7XG4gICAgICogICAvLyAuLi5cbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIEByZXR1cm4gc2VsZlxuICAgICAqL1xuICAgIGVtaXQoZXYsIC4uLmFyZ3MpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIGlmIChSRVNFUlZFRF9FVkVOVFMuaGFzT3duUHJvcGVydHkoZXYpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGV2LnRvU3RyaW5nKCkgKyAnXCIgaXMgYSByZXNlcnZlZCBldmVudCBuYW1lJyk7XG4gICAgICAgIH1cbiAgICAgICAgYXJncy51bnNoaWZ0KGV2KTtcbiAgICAgICAgaWYgKHRoaXMuX29wdHMucmV0cmllcyAmJiAhdGhpcy5mbGFncy5mcm9tUXVldWUgJiYgIXRoaXMuZmxhZ3Mudm9sYXRpbGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2FkZFRvUXVldWUoYXJncyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYWNrZXQgPSB7XG4gICAgICAgICAgICB0eXBlOiBQYWNrZXRUeXBlLkVWRU5ULFxuICAgICAgICAgICAgZGF0YTogYXJncyxcbiAgICAgICAgfTtcbiAgICAgICAgcGFja2V0Lm9wdGlvbnMgPSB7fTtcbiAgICAgICAgcGFja2V0Lm9wdGlvbnMuY29tcHJlc3MgPSB0aGlzLmZsYWdzLmNvbXByZXNzICE9PSBmYWxzZTtcbiAgICAgICAgLy8gZXZlbnQgYWNrIGNhbGxiYWNrXG4gICAgICAgIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0pIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gdGhpcy5pZHMrKztcbiAgICAgICAgICAgIGNvbnN0IGFjayA9IGFyZ3MucG9wKCk7XG4gICAgICAgICAgICB0aGlzLl9yZWdpc3RlckFja0NhbGxiYWNrKGlkLCBhY2spO1xuICAgICAgICAgICAgcGFja2V0LmlkID0gaWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNUcmFuc3BvcnRXcml0YWJsZSA9IChfYiA9IChfYSA9IHRoaXMuaW8uZW5naW5lKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudHJhbnNwb3J0KSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Iud3JpdGFibGU7XG4gICAgICAgIGNvbnN0IGlzQ29ubmVjdGVkID0gdGhpcy5jb25uZWN0ZWQgJiYgISgoX2MgPSB0aGlzLmlvLmVuZ2luZSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLl9oYXNQaW5nRXhwaXJlZCgpKTtcbiAgICAgICAgY29uc3QgZGlzY2FyZFBhY2tldCA9IHRoaXMuZmxhZ3Mudm9sYXRpbGUgJiYgIWlzVHJhbnNwb3J0V3JpdGFibGU7XG4gICAgICAgIGlmIChkaXNjYXJkUGFja2V0KSB7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5T3V0Z29pbmdMaXN0ZW5lcnMocGFja2V0KTtcbiAgICAgICAgICAgIHRoaXMucGFja2V0KHBhY2tldCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlbmRCdWZmZXIucHVzaChwYWNrZXQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmxhZ3MgPSB7fTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3JlZ2lzdGVyQWNrQ2FsbGJhY2soaWQsIGFjaykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSAoX2EgPSB0aGlzLmZsYWdzLnRpbWVvdXQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMuX29wdHMuYWNrVGltZW91dDtcbiAgICAgICAgaWYgKHRpbWVvdXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5hY2tzW2lkXSA9IGFjaztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGNvbnN0IHRpbWVyID0gdGhpcy5pby5zZXRUaW1lb3V0Rm4oKCkgPT4ge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuYWNrc1tpZF07XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VuZEJ1ZmZlci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbmRCdWZmZXJbaV0uaWQgPT09IGlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VuZEJ1ZmZlci5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWNrLmNhbGwodGhpcywgbmV3IEVycm9yKFwib3BlcmF0aW9uIGhhcyB0aW1lZCBvdXRcIikpO1xuICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgY29uc3QgZm4gPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgdGhpcy5pby5jbGVhclRpbWVvdXRGbih0aW1lcik7XG4gICAgICAgICAgICBhY2suYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIH07XG4gICAgICAgIGZuLndpdGhFcnJvciA9IHRydWU7XG4gICAgICAgIHRoaXMuYWNrc1tpZF0gPSBmbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW1pdHMgYW4gZXZlbnQgYW5kIHdhaXRzIGZvciBhbiBhY2tub3dsZWRnZW1lbnRcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gd2l0aG91dCB0aW1lb3V0XG4gICAgICogY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzb2NrZXQuZW1pdFdpdGhBY2soXCJoZWxsb1wiLCBcIndvcmxkXCIpO1xuICAgICAqXG4gICAgICogLy8gd2l0aCBhIHNwZWNpZmljIHRpbWVvdXRcbiAgICAgKiB0cnkge1xuICAgICAqICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzb2NrZXQudGltZW91dCgxMDAwKS5lbWl0V2l0aEFjayhcImhlbGxvXCIsIFwid29ybGRcIik7XG4gICAgICogfSBjYXRjaCAoZXJyKSB7XG4gICAgICogICAvLyB0aGUgc2VydmVyIGRpZCBub3QgYWNrbm93bGVkZ2UgdGhlIGV2ZW50IGluIHRoZSBnaXZlbiBkZWxheVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEByZXR1cm4gYSBQcm9taXNlIHRoYXQgd2lsbCBiZSBmdWxmaWxsZWQgd2hlbiB0aGUgc2VydmVyIGFja25vd2xlZGdlcyB0aGUgZXZlbnRcbiAgICAgKi9cbiAgICBlbWl0V2l0aEFjayhldiwgLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZm4gPSAoYXJnMSwgYXJnMikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBhcmcxID8gcmVqZWN0KGFyZzEpIDogcmVzb2x2ZShhcmcyKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmbi53aXRoRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgYXJncy5wdXNoKGZuKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdChldiwgLi4uYXJncyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGQgdGhlIHBhY2tldCB0byB0aGUgcXVldWUuXG4gICAgICogQHBhcmFtIGFyZ3NcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9hZGRUb1F1ZXVlKGFyZ3MpIHtcbiAgICAgICAgbGV0IGFjaztcbiAgICAgICAgaWYgKHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgYWNrID0gYXJncy5wb3AoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYWNrZXQgPSB7XG4gICAgICAgICAgICBpZDogdGhpcy5fcXVldWVTZXErKyxcbiAgICAgICAgICAgIHRyeUNvdW50OiAwLFxuICAgICAgICAgICAgcGVuZGluZzogZmFsc2UsXG4gICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgZmxhZ3M6IE9iamVjdC5hc3NpZ24oeyBmcm9tUXVldWU6IHRydWUgfSwgdGhpcy5mbGFncyksXG4gICAgICAgIH07XG4gICAgICAgIGFyZ3MucHVzaCgoZXJyLCAuLi5yZXNwb25zZUFyZ3MpID0+IHtcbiAgICAgICAgICAgIGlmIChwYWNrZXQgIT09IHRoaXMuX3F1ZXVlWzBdKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhlIHBhY2tldCBoYXMgYWxyZWFkeSBiZWVuIGFja25vd2xlZGdlZFxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGhhc0Vycm9yID0gZXJyICE9PSBudWxsO1xuICAgICAgICAgICAgaWYgKGhhc0Vycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhY2tldC50cnlDb3VudCA+IHRoaXMuX29wdHMucmV0cmllcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9xdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY2soZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3F1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgaWYgKGFjaykge1xuICAgICAgICAgICAgICAgICAgICBhY2sobnVsbCwgLi4ucmVzcG9uc2VBcmdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYWNrZXQucGVuZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RyYWluUXVldWUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3F1ZXVlLnB1c2gocGFja2V0KTtcbiAgICAgICAgdGhpcy5fZHJhaW5RdWV1ZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIHRoZSBmaXJzdCBwYWNrZXQgb2YgdGhlIHF1ZXVlLCBhbmQgd2FpdCBmb3IgYW4gYWNrbm93bGVkZ2VtZW50IGZyb20gdGhlIHNlcnZlci5cbiAgICAgKiBAcGFyYW0gZm9yY2UgLSB3aGV0aGVyIHRvIHJlc2VuZCBhIHBhY2tldCB0aGF0IGhhcyBub3QgYmVlbiBhY2tub3dsZWRnZWQgeWV0XG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9kcmFpblF1ZXVlKGZvcmNlID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbm5lY3RlZCB8fCB0aGlzLl9xdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYWNrZXQgPSB0aGlzLl9xdWV1ZVswXTtcbiAgICAgICAgaWYgKHBhY2tldC5wZW5kaW5nICYmICFmb3JjZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHBhY2tldC5wZW5kaW5nID0gdHJ1ZTtcbiAgICAgICAgcGFja2V0LnRyeUNvdW50Kys7XG4gICAgICAgIHRoaXMuZmxhZ3MgPSBwYWNrZXQuZmxhZ3M7XG4gICAgICAgIHRoaXMuZW1pdC5hcHBseSh0aGlzLCBwYWNrZXQuYXJncyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIGEgcGFja2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhY2tldFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcGFja2V0KHBhY2tldCkge1xuICAgICAgICBwYWNrZXQubnNwID0gdGhpcy5uc3A7XG4gICAgICAgIHRoaXMuaW8uX3BhY2tldChwYWNrZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiBlbmdpbmUgYG9wZW5gLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBvbm9wZW4oKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5hdXRoID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGhpcy5hdXRoKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2VuZENvbm5lY3RQYWNrZXQoZGF0YSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbmRDb25uZWN0UGFja2V0KHRoaXMuYXV0aCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZHMgYSBDT05ORUNUIHBhY2tldCB0byBpbml0aWF0ZSB0aGUgU29ja2V0LklPIHNlc3Npb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGF0YVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3NlbmRDb25uZWN0UGFja2V0KGRhdGEpIHtcbiAgICAgICAgdGhpcy5wYWNrZXQoe1xuICAgICAgICAgICAgdHlwZTogUGFja2V0VHlwZS5DT05ORUNULFxuICAgICAgICAgICAgZGF0YTogdGhpcy5fcGlkXG4gICAgICAgICAgICAgICAgPyBPYmplY3QuYXNzaWduKHsgcGlkOiB0aGlzLl9waWQsIG9mZnNldDogdGhpcy5fbGFzdE9mZnNldCB9LCBkYXRhKVxuICAgICAgICAgICAgICAgIDogZGF0YSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIGVuZ2luZSBvciBtYW5hZ2VyIGBlcnJvcmAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXJyXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBvbmVycm9yKGVycikge1xuICAgICAgICBpZiAoIXRoaXMuY29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImNvbm5lY3RfZXJyb3JcIiwgZXJyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiBlbmdpbmUgYGNsb3NlYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZWFzb25cbiAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb25cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG9uY2xvc2UocmVhc29uLCBkZXNjcmlwdGlvbikge1xuICAgICAgICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuICAgICAgICBkZWxldGUgdGhpcy5pZDtcbiAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJkaXNjb25uZWN0XCIsIHJlYXNvbiwgZGVzY3JpcHRpb24pO1xuICAgICAgICB0aGlzLl9jbGVhckFja3MoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYXJzIHRoZSBhY2tub3dsZWRnZW1lbnQgaGFuZGxlcnMgdXBvbiBkaXNjb25uZWN0aW9uLCBzaW5jZSB0aGUgY2xpZW50IHdpbGwgbmV2ZXIgcmVjZWl2ZSBhbiBhY2tub3dsZWRnZW1lbnQgZnJvbVxuICAgICAqIHRoZSBzZXJ2ZXIuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9jbGVhckFja3MoKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuYWNrcykuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlzQnVmZmVyZWQgPSB0aGlzLnNlbmRCdWZmZXIuc29tZSgocGFja2V0KSA9PiBTdHJpbmcocGFja2V0LmlkKSA9PT0gaWQpO1xuICAgICAgICAgICAgaWYgKCFpc0J1ZmZlcmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gbm90ZTogaGFuZGxlcnMgdGhhdCBkbyBub3QgYWNjZXB0IGFuIGVycm9yIGFzIGZpcnN0IGFyZ3VtZW50IGFyZSBpZ25vcmVkIGhlcmVcbiAgICAgICAgICAgICAgICBjb25zdCBhY2sgPSB0aGlzLmFja3NbaWRdO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmFja3NbaWRdO1xuICAgICAgICAgICAgICAgIGlmIChhY2sud2l0aEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjay5jYWxsKHRoaXMsIG5ldyBFcnJvcihcInNvY2tldCBoYXMgYmVlbiBkaXNjb25uZWN0ZWRcIikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aXRoIHNvY2tldCBwYWNrZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFja2V0XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBvbnBhY2tldChwYWNrZXQpIHtcbiAgICAgICAgY29uc3Qgc2FtZU5hbWVzcGFjZSA9IHBhY2tldC5uc3AgPT09IHRoaXMubnNwO1xuICAgICAgICBpZiAoIXNhbWVOYW1lc3BhY2UpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHN3aXRjaCAocGFja2V0LnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgUGFja2V0VHlwZS5DT05ORUNUOlxuICAgICAgICAgICAgICAgIGlmIChwYWNrZXQuZGF0YSAmJiBwYWNrZXQuZGF0YS5zaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbmNvbm5lY3QocGFja2V0LmRhdGEuc2lkLCBwYWNrZXQuZGF0YS5waWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJjb25uZWN0X2Vycm9yXCIsIG5ldyBFcnJvcihcIkl0IHNlZW1zIHlvdSBhcmUgdHJ5aW5nIHRvIHJlYWNoIGEgU29ja2V0LklPIHNlcnZlciBpbiB2Mi54IHdpdGggYSB2My54IGNsaWVudCwgYnV0IHRoZXkgYXJlIG5vdCBjb21wYXRpYmxlIChtb3JlIGluZm9ybWF0aW9uIGhlcmU6IGh0dHBzOi8vc29ja2V0LmlvL2RvY3MvdjMvbWlncmF0aW5nLWZyb20tMi14LXRvLTMtMC8pXCIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBhY2tldFR5cGUuRVZFTlQ6XG4gICAgICAgICAgICBjYXNlIFBhY2tldFR5cGUuQklOQVJZX0VWRU5UOlxuICAgICAgICAgICAgICAgIHRoaXMub25ldmVudChwYWNrZXQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQYWNrZXRUeXBlLkFDSzpcbiAgICAgICAgICAgIGNhc2UgUGFja2V0VHlwZS5CSU5BUllfQUNLOlxuICAgICAgICAgICAgICAgIHRoaXMub25hY2socGFja2V0KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUGFja2V0VHlwZS5ESVNDT05ORUNUOlxuICAgICAgICAgICAgICAgIHRoaXMub25kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBhY2tldFR5cGUuQ09OTkVDVF9FUlJPUjpcbiAgICAgICAgICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IocGFja2V0LmRhdGEubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIGVyci5kYXRhID0gcGFja2V0LmRhdGEuZGF0YTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImNvbm5lY3RfZXJyb3JcIiwgZXJyKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiBhIHNlcnZlciBldmVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYWNrZXRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG9uZXZlbnQocGFja2V0KSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBwYWNrZXQuZGF0YSB8fCBbXTtcbiAgICAgICAgaWYgKG51bGwgIT0gcGFja2V0LmlkKSB7XG4gICAgICAgICAgICBhcmdzLnB1c2godGhpcy5hY2socGFja2V0LmlkKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXRFdmVudChhcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVjZWl2ZUJ1ZmZlci5wdXNoKE9iamVjdC5mcmVlemUoYXJncykpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVtaXRFdmVudChhcmdzKSB7XG4gICAgICAgIGlmICh0aGlzLl9hbnlMaXN0ZW5lcnMgJiYgdGhpcy5fYW55TGlzdGVuZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fYW55TGlzdGVuZXJzLnNsaWNlKCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIGxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN1cGVyLmVtaXQuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIGlmICh0aGlzLl9waWQgJiYgYXJncy5sZW5ndGggJiYgdHlwZW9mIGFyZ3NbYXJncy5sZW5ndGggLSAxXSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgdGhpcy5fbGFzdE9mZnNldCA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm9kdWNlcyBhbiBhY2sgY2FsbGJhY2sgdG8gZW1pdCB3aXRoIGFuIGV2ZW50LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBhY2soaWQpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGxldCBzZW50ID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICAgICAgLy8gcHJldmVudCBkb3VibGUgY2FsbGJhY2tzXG4gICAgICAgICAgICBpZiAoc2VudClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBzZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgIHNlbGYucGFja2V0KHtcbiAgICAgICAgICAgICAgICB0eXBlOiBQYWNrZXRUeXBlLkFDSyxcbiAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgZGF0YTogYXJncyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiBhIHNlcnZlciBhY2tub3dsZWRnZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFja2V0XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBvbmFjayhwYWNrZXQpIHtcbiAgICAgICAgY29uc3QgYWNrID0gdGhpcy5hY2tzW3BhY2tldC5pZF07XG4gICAgICAgIGlmICh0eXBlb2YgYWNrICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgdGhpcy5hY2tzW3BhY2tldC5pZF07XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRklYTUUgYWNrIGlzIGluY29ycmVjdGx5IGluZmVycmVkIGFzICduZXZlcidcbiAgICAgICAgaWYgKGFjay53aXRoRXJyb3IpIHtcbiAgICAgICAgICAgIHBhY2tldC5kYXRhLnVuc2hpZnQobnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBhY2suYXBwbHkodGhpcywgcGFja2V0LmRhdGEpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiBzZXJ2ZXIgY29ubmVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25jb25uZWN0KGlkLCBwaWQpIHtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLnJlY292ZXJlZCA9IHBpZCAmJiB0aGlzLl9waWQgPT09IHBpZDtcbiAgICAgICAgdGhpcy5fcGlkID0gcGlkOyAvLyBkZWZpbmVkIG9ubHkgaWYgY29ubmVjdGlvbiBzdGF0ZSByZWNvdmVyeSBpcyBlbmFibGVkXG4gICAgICAgIHRoaXMuY29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5lbWl0QnVmZmVyZWQoKTtcbiAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJjb25uZWN0XCIpO1xuICAgICAgICB0aGlzLl9kcmFpblF1ZXVlKHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbWl0IGJ1ZmZlcmVkIGV2ZW50cyAocmVjZWl2ZWQgYW5kIGVtaXR0ZWQpLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBlbWl0QnVmZmVyZWQoKSB7XG4gICAgICAgIHRoaXMucmVjZWl2ZUJ1ZmZlci5mb3JFYWNoKChhcmdzKSA9PiB0aGlzLmVtaXRFdmVudChhcmdzKSk7XG4gICAgICAgIHRoaXMucmVjZWl2ZUJ1ZmZlciA9IFtdO1xuICAgICAgICB0aGlzLnNlbmRCdWZmZXIuZm9yRWFjaCgocGFja2V0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeU91dGdvaW5nTGlzdGVuZXJzKHBhY2tldCk7XG4gICAgICAgICAgICB0aGlzLnBhY2tldChwYWNrZXQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zZW5kQnVmZmVyID0gW107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIHNlcnZlciBkaXNjb25uZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBvbmRpc2Nvbm5lY3QoKSB7XG4gICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLm9uY2xvc2UoXCJpbyBzZXJ2ZXIgZGlzY29ubmVjdFwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHVwb24gZm9yY2VkIGNsaWVudC9zZXJ2ZXIgc2lkZSBkaXNjb25uZWN0aW9ucyxcbiAgICAgKiB0aGlzIG1ldGhvZCBlbnN1cmVzIHRoZSBtYW5hZ2VyIHN0b3BzIHRyYWNraW5nIHVzIGFuZFxuICAgICAqIHRoYXQgcmVjb25uZWN0aW9ucyBkb24ndCBnZXQgdHJpZ2dlcmVkIGZvciB0aGlzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5zdWJzKSB7XG4gICAgICAgICAgICAvLyBjbGVhbiBzdWJzY3JpcHRpb25zIHRvIGF2b2lkIHJlY29ubmVjdGlvbnNcbiAgICAgICAgICAgIHRoaXMuc3Vicy5mb3JFYWNoKChzdWJEZXN0cm95KSA9PiBzdWJEZXN0cm95KCkpO1xuICAgICAgICAgICAgdGhpcy5zdWJzID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW9bXCJfZGVzdHJveVwiXSh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGlzY29ubmVjdHMgdGhlIHNvY2tldCBtYW51YWxseS4gSW4gdGhhdCBjYXNlLCB0aGUgc29ja2V0IHdpbGwgbm90IHRyeSB0byByZWNvbm5lY3QuXG4gICAgICpcbiAgICAgKiBJZiB0aGlzIGlzIHRoZSBsYXN0IGFjdGl2ZSBTb2NrZXQgaW5zdGFuY2Ugb2YgdGhlIHtAbGluayBNYW5hZ2VyfSwgdGhlIGxvdy1sZXZlbCBjb25uZWN0aW9uIHdpbGwgYmUgY2xvc2VkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBzb2NrZXQgPSBpbygpO1xuICAgICAqXG4gICAgICogc29ja2V0Lm9uKFwiZGlzY29ubmVjdFwiLCAocmVhc29uKSA9PiB7XG4gICAgICogICAvLyBjb25zb2xlLmxvZyhyZWFzb24pOyBwcmludHMgXCJpbyBjbGllbnQgZGlzY29ubmVjdFwiXG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBzb2NrZXQuZGlzY29ubmVjdCgpO1xuICAgICAqXG4gICAgICogQHJldHVybiBzZWxmXG4gICAgICovXG4gICAgZGlzY29ubmVjdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnBhY2tldCh7IHR5cGU6IFBhY2tldFR5cGUuRElTQ09OTkVDVCB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyByZW1vdmUgc29ja2V0IGZyb20gcG9vbFxuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGVkKSB7XG4gICAgICAgICAgICAvLyBmaXJlIGV2ZW50c1xuICAgICAgICAgICAgdGhpcy5vbmNsb3NlKFwiaW8gY2xpZW50IGRpc2Nvbm5lY3RcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFsaWFzIGZvciB7QGxpbmsgZGlzY29ubmVjdCgpfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gc2VsZlxuICAgICAqL1xuICAgIGNsb3NlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGNvbXByZXNzIGZsYWcuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHNvY2tldC5jb21wcmVzcyhmYWxzZSkuZW1pdChcImhlbGxvXCIpO1xuICAgICAqXG4gICAgICogQHBhcmFtIGNvbXByZXNzIC0gaWYgYHRydWVgLCBjb21wcmVzc2VzIHRoZSBzZW5kaW5nIGRhdGFcbiAgICAgKiBAcmV0dXJuIHNlbGZcbiAgICAgKi9cbiAgICBjb21wcmVzcyhjb21wcmVzcykge1xuICAgICAgICB0aGlzLmZsYWdzLmNvbXByZXNzID0gY29tcHJlc3M7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgbW9kaWZpZXIgZm9yIGEgc3Vic2VxdWVudCBldmVudCBlbWlzc2lvbiB0aGF0IHRoZSBldmVudCBtZXNzYWdlIHdpbGwgYmUgZHJvcHBlZCB3aGVuIHRoaXMgc29ja2V0IGlzIG5vdFxuICAgICAqIHJlYWR5IHRvIHNlbmQgbWVzc2FnZXMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHNvY2tldC52b2xhdGlsZS5lbWl0KFwiaGVsbG9cIik7IC8vIHRoZSBzZXJ2ZXIgbWF5IG9yIG1heSBub3QgcmVjZWl2ZSBpdFxuICAgICAqXG4gICAgICogQHJldHVybnMgc2VsZlxuICAgICAqL1xuICAgIGdldCB2b2xhdGlsZSgpIHtcbiAgICAgICAgdGhpcy5mbGFncy52b2xhdGlsZSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgbW9kaWZpZXIgZm9yIGEgc3Vic2VxdWVudCBldmVudCBlbWlzc2lvbiB0aGF0IHRoZSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCB3aXRoIGFuIGVycm9yIHdoZW4gdGhlXG4gICAgICogZ2l2ZW4gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBoYXZlIGVsYXBzZWQgd2l0aG91dCBhbiBhY2tub3dsZWRnZW1lbnQgZnJvbSB0aGUgc2VydmVyOlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBzb2NrZXQudGltZW91dCg1MDAwKS5lbWl0KFwibXktZXZlbnRcIiwgKGVycikgPT4ge1xuICAgICAqICAgaWYgKGVycikge1xuICAgICAqICAgICAvLyB0aGUgc2VydmVyIGRpZCBub3QgYWNrbm93bGVkZ2UgdGhlIGV2ZW50IGluIHRoZSBnaXZlbiBkZWxheVxuICAgICAqICAgfVxuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogQHJldHVybnMgc2VsZlxuICAgICAqL1xuICAgIHRpbWVvdXQodGltZW91dCkge1xuICAgICAgICB0aGlzLmZsYWdzLnRpbWVvdXQgPSB0aW1lb3V0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBmaXJlZCB3aGVuIGFueSBldmVudCBpcyBlbWl0dGVkLiBUaGUgZXZlbnQgbmFtZSBpcyBwYXNzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZVxuICAgICAqIGNhbGxiYWNrLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBzb2NrZXQub25BbnkoKGV2ZW50LCAuLi5hcmdzKSA9PiB7XG4gICAgICogICBjb25zb2xlLmxvZyhgZ290ICR7ZXZlbnR9YCk7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGlzdGVuZXJcbiAgICAgKi9cbiAgICBvbkFueShsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl9hbnlMaXN0ZW5lcnMgPSB0aGlzLl9hbnlMaXN0ZW5lcnMgfHwgW107XG4gICAgICAgIHRoaXMuX2FueUxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgZmlyZWQgd2hlbiBhbnkgZXZlbnQgaXMgZW1pdHRlZC4gVGhlIGV2ZW50IG5hbWUgaXMgcGFzc2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGVcbiAgICAgKiBjYWxsYmFjay4gVGhlIGxpc3RlbmVyIGlzIGFkZGVkIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3RlbmVycyBhcnJheS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogc29ja2V0LnByZXBlbmRBbnkoKGV2ZW50LCAuLi5hcmdzKSA9PiB7XG4gICAgICogICBjb25zb2xlLmxvZyhgZ290IGV2ZW50ICR7ZXZlbnR9YCk7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGlzdGVuZXJcbiAgICAgKi9cbiAgICBwcmVwZW5kQW55KGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX2FueUxpc3RlbmVycyA9IHRoaXMuX2FueUxpc3RlbmVycyB8fCBbXTtcbiAgICAgICAgdGhpcy5fYW55TGlzdGVuZXJzLnVuc2hpZnQobGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIGZpcmVkIHdoZW4gYW55IGV2ZW50IGlzIGVtaXR0ZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGNhdGNoQWxsTGlzdGVuZXIgPSAoZXZlbnQsIC4uLmFyZ3MpID0+IHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBnb3QgZXZlbnQgJHtldmVudH1gKTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBzb2NrZXQub25BbnkoY2F0Y2hBbGxMaXN0ZW5lcik7XG4gICAgICpcbiAgICAgKiAvLyByZW1vdmUgYSBzcGVjaWZpYyBsaXN0ZW5lclxuICAgICAqIHNvY2tldC5vZmZBbnkoY2F0Y2hBbGxMaXN0ZW5lcik7XG4gICAgICpcbiAgICAgKiAvLyBvciByZW1vdmUgYWxsIGxpc3RlbmVyc1xuICAgICAqIHNvY2tldC5vZmZBbnkoKTtcbiAgICAgKlxuICAgICAqIEBwYXJhbSBsaXN0ZW5lclxuICAgICAqL1xuICAgIG9mZkFueShsaXN0ZW5lcikge1xuICAgICAgICBpZiAoIXRoaXMuX2FueUxpc3RlbmVycykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLl9hbnlMaXN0ZW5lcnM7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lciA9PT0gbGlzdGVuZXJzW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2FueUxpc3RlbmVycyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGxpc3RlbmVycyB0aGF0IGFyZSBsaXN0ZW5pbmcgZm9yIGFueSBldmVudCB0aGF0IGlzIHNwZWNpZmllZC4gVGhpcyBhcnJheSBjYW4gYmUgbWFuaXB1bGF0ZWQsXG4gICAgICogZS5nLiB0byByZW1vdmUgbGlzdGVuZXJzLlxuICAgICAqL1xuICAgIGxpc3RlbmVyc0FueSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FueUxpc3RlbmVycyB8fCBbXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBmaXJlZCB3aGVuIGFueSBldmVudCBpcyBlbWl0dGVkLiBUaGUgZXZlbnQgbmFtZSBpcyBwYXNzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZVxuICAgICAqIGNhbGxiYWNrLlxuICAgICAqXG4gICAgICogTm90ZTogYWNrbm93bGVkZ2VtZW50cyBzZW50IHRvIHRoZSBzZXJ2ZXIgYXJlIG5vdCBpbmNsdWRlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogc29ja2V0Lm9uQW55T3V0Z29pbmcoKGV2ZW50LCAuLi5hcmdzKSA9PiB7XG4gICAgICogICBjb25zb2xlLmxvZyhgc2VudCBldmVudCAke2V2ZW50fWApO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogQHBhcmFtIGxpc3RlbmVyXG4gICAgICovXG4gICAgb25BbnlPdXRnb2luZyhsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl9hbnlPdXRnb2luZ0xpc3RlbmVycyA9IHRoaXMuX2FueU91dGdvaW5nTGlzdGVuZXJzIHx8IFtdO1xuICAgICAgICB0aGlzLl9hbnlPdXRnb2luZ0xpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgZmlyZWQgd2hlbiBhbnkgZXZlbnQgaXMgZW1pdHRlZC4gVGhlIGV2ZW50IG5hbWUgaXMgcGFzc2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGVcbiAgICAgKiBjYWxsYmFjay4gVGhlIGxpc3RlbmVyIGlzIGFkZGVkIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3RlbmVycyBhcnJheS5cbiAgICAgKlxuICAgICAqIE5vdGU6IGFja25vd2xlZGdlbWVudHMgc2VudCB0byB0aGUgc2VydmVyIGFyZSBub3QgaW5jbHVkZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHNvY2tldC5wcmVwZW5kQW55T3V0Z29pbmcoKGV2ZW50LCAuLi5hcmdzKSA9PiB7XG4gICAgICogICBjb25zb2xlLmxvZyhgc2VudCBldmVudCAke2V2ZW50fWApO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogQHBhcmFtIGxpc3RlbmVyXG4gICAgICovXG4gICAgcHJlcGVuZEFueU91dGdvaW5nKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX2FueU91dGdvaW5nTGlzdGVuZXJzID0gdGhpcy5fYW55T3V0Z29pbmdMaXN0ZW5lcnMgfHwgW107XG4gICAgICAgIHRoaXMuX2FueU91dGdvaW5nTGlzdGVuZXJzLnVuc2hpZnQobGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIGZpcmVkIHdoZW4gYW55IGV2ZW50IGlzIGVtaXR0ZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGNhdGNoQWxsTGlzdGVuZXIgPSAoZXZlbnQsIC4uLmFyZ3MpID0+IHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBzZW50IGV2ZW50ICR7ZXZlbnR9YCk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogc29ja2V0Lm9uQW55T3V0Z29pbmcoY2F0Y2hBbGxMaXN0ZW5lcik7XG4gICAgICpcbiAgICAgKiAvLyByZW1vdmUgYSBzcGVjaWZpYyBsaXN0ZW5lclxuICAgICAqIHNvY2tldC5vZmZBbnlPdXRnb2luZyhjYXRjaEFsbExpc3RlbmVyKTtcbiAgICAgKlxuICAgICAqIC8vIG9yIHJlbW92ZSBhbGwgbGlzdGVuZXJzXG4gICAgICogc29ja2V0Lm9mZkFueU91dGdvaW5nKCk7XG4gICAgICpcbiAgICAgKiBAcGFyYW0gW2xpc3RlbmVyXSAtIHRoZSBjYXRjaC1hbGwgbGlzdGVuZXIgKG9wdGlvbmFsKVxuICAgICAqL1xuICAgIG9mZkFueU91dGdvaW5nKGxpc3RlbmVyKSB7XG4gICAgICAgIGlmICghdGhpcy5fYW55T3V0Z29pbmdMaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaXN0ZW5lcikge1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fYW55T3V0Z29pbmdMaXN0ZW5lcnM7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lciA9PT0gbGlzdGVuZXJzW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2FueU91dGdvaW5nTGlzdGVuZXJzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgbGlzdGVuZXJzIHRoYXQgYXJlIGxpc3RlbmluZyBmb3IgYW55IGV2ZW50IHRoYXQgaXMgc3BlY2lmaWVkLiBUaGlzIGFycmF5IGNhbiBiZSBtYW5pcHVsYXRlZCxcbiAgICAgKiBlLmcuIHRvIHJlbW92ZSBsaXN0ZW5lcnMuXG4gICAgICovXG4gICAgbGlzdGVuZXJzQW55T3V0Z29pbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hbnlPdXRnb2luZ0xpc3RlbmVycyB8fCBbXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTm90aWZ5IHRoZSBsaXN0ZW5lcnMgZm9yIGVhY2ggcGFja2V0IHNlbnRcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYWNrZXRcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgbm90aWZ5T3V0Z29pbmdMaXN0ZW5lcnMocGFja2V0KSB7XG4gICAgICAgIGlmICh0aGlzLl9hbnlPdXRnb2luZ0xpc3RlbmVycyAmJiB0aGlzLl9hbnlPdXRnb2luZ0xpc3RlbmVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2FueU91dGdvaW5nTGlzdGVuZXJzLnNsaWNlKCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIGxpc3RlbmVyLmFwcGx5KHRoaXMsIHBhY2tldC5kYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICIvKipcbiAqIEluaXRpYWxpemUgYmFja29mZiB0aW1lciB3aXRoIGBvcHRzYC5cbiAqXG4gKiAtIGBtaW5gIGluaXRpYWwgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgWzEwMF1cbiAqIC0gYG1heGAgbWF4IHRpbWVvdXQgWzEwMDAwXVxuICogLSBgaml0dGVyYCBbMF1cbiAqIC0gYGZhY3RvcmAgWzJdXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHNcbiAqIEBhcGkgcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBCYWNrb2ZmKG9wdHMpIHtcbiAgICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgICB0aGlzLm1zID0gb3B0cy5taW4gfHwgMTAwO1xuICAgIHRoaXMubWF4ID0gb3B0cy5tYXggfHwgMTAwMDA7XG4gICAgdGhpcy5mYWN0b3IgPSBvcHRzLmZhY3RvciB8fCAyO1xuICAgIHRoaXMuaml0dGVyID0gb3B0cy5qaXR0ZXIgPiAwICYmIG9wdHMuaml0dGVyIDw9IDEgPyBvcHRzLmppdHRlciA6IDA7XG4gICAgdGhpcy5hdHRlbXB0cyA9IDA7XG59XG4vKipcbiAqIFJldHVybiB0aGUgYmFja29mZiBkdXJhdGlvbi5cbiAqXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5CYWNrb2ZmLnByb3RvdHlwZS5kdXJhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbXMgPSB0aGlzLm1zICogTWF0aC5wb3codGhpcy5mYWN0b3IsIHRoaXMuYXR0ZW1wdHMrKyk7XG4gICAgaWYgKHRoaXMuaml0dGVyKSB7XG4gICAgICAgIHZhciByYW5kID0gTWF0aC5yYW5kb20oKTtcbiAgICAgICAgdmFyIGRldmlhdGlvbiA9IE1hdGguZmxvb3IocmFuZCAqIHRoaXMuaml0dGVyICogbXMpO1xuICAgICAgICBtcyA9IChNYXRoLmZsb29yKHJhbmQgKiAxMCkgJiAxKSA9PSAwID8gbXMgLSBkZXZpYXRpb24gOiBtcyArIGRldmlhdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIE1hdGgubWluKG1zLCB0aGlzLm1heCkgfCAwO1xufTtcbi8qKlxuICogUmVzZXQgdGhlIG51bWJlciBvZiBhdHRlbXB0cy5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5CYWNrb2ZmLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmF0dGVtcHRzID0gMDtcbn07XG4vKipcbiAqIFNldCB0aGUgbWluaW11bSBkdXJhdGlvblxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cbkJhY2tvZmYucHJvdG90eXBlLnNldE1pbiA9IGZ1bmN0aW9uIChtaW4pIHtcbiAgICB0aGlzLm1zID0gbWluO1xufTtcbi8qKlxuICogU2V0IHRoZSBtYXhpbXVtIGR1cmF0aW9uXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuQmFja29mZi5wcm90b3R5cGUuc2V0TWF4ID0gZnVuY3Rpb24gKG1heCkge1xuICAgIHRoaXMubWF4ID0gbWF4O1xufTtcbi8qKlxuICogU2V0IHRoZSBqaXR0ZXJcbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5CYWNrb2ZmLnByb3RvdHlwZS5zZXRKaXR0ZXIgPSBmdW5jdGlvbiAoaml0dGVyKSB7XG4gICAgdGhpcy5qaXR0ZXIgPSBqaXR0ZXI7XG59O1xuIiwgImltcG9ydCB7IFNvY2tldCBhcyBFbmdpbmUsIGluc3RhbGxUaW1lckZ1bmN0aW9ucywgbmV4dFRpY2ssIH0gZnJvbSBcImVuZ2luZS5pby1jbGllbnRcIjtcbmltcG9ydCB7IFNvY2tldCB9IGZyb20gXCIuL3NvY2tldC5qc1wiO1xuaW1wb3J0ICogYXMgcGFyc2VyIGZyb20gXCJzb2NrZXQuaW8tcGFyc2VyXCI7XG5pbXBvcnQgeyBvbiB9IGZyb20gXCIuL29uLmpzXCI7XG5pbXBvcnQgeyBCYWNrb2ZmIH0gZnJvbSBcIi4vY29udHJpYi9iYWNrbzIuanNcIjtcbmltcG9ydCB7IEVtaXR0ZXIsIH0gZnJvbSBcIkBzb2NrZXQuaW8vY29tcG9uZW50LWVtaXR0ZXJcIjtcbmV4cG9ydCBjbGFzcyBNYW5hZ2VyIGV4dGVuZHMgRW1pdHRlciB7XG4gICAgY29uc3RydWN0b3IodXJpLCBvcHRzKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5uc3BzID0ge307XG4gICAgICAgIHRoaXMuc3VicyA9IFtdO1xuICAgICAgICBpZiAodXJpICYmIFwib2JqZWN0XCIgPT09IHR5cGVvZiB1cmkpIHtcbiAgICAgICAgICAgIG9wdHMgPSB1cmk7XG4gICAgICAgICAgICB1cmkgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge307XG4gICAgICAgIG9wdHMucGF0aCA9IG9wdHMucGF0aCB8fCBcIi9zb2NrZXQuaW9cIjtcbiAgICAgICAgdGhpcy5vcHRzID0gb3B0cztcbiAgICAgICAgaW5zdGFsbFRpbWVyRnVuY3Rpb25zKHRoaXMsIG9wdHMpO1xuICAgICAgICB0aGlzLnJlY29ubmVjdGlvbihvcHRzLnJlY29ubmVjdGlvbiAhPT0gZmFsc2UpO1xuICAgICAgICB0aGlzLnJlY29ubmVjdGlvbkF0dGVtcHRzKG9wdHMucmVjb25uZWN0aW9uQXR0ZW1wdHMgfHwgSW5maW5pdHkpO1xuICAgICAgICB0aGlzLnJlY29ubmVjdGlvbkRlbGF5KG9wdHMucmVjb25uZWN0aW9uRGVsYXkgfHwgMTAwMCk7XG4gICAgICAgIHRoaXMucmVjb25uZWN0aW9uRGVsYXlNYXgob3B0cy5yZWNvbm5lY3Rpb25EZWxheU1heCB8fCA1MDAwKTtcbiAgICAgICAgdGhpcy5yYW5kb21pemF0aW9uRmFjdG9yKChfYSA9IG9wdHMucmFuZG9taXphdGlvbkZhY3RvcikgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMC41KTtcbiAgICAgICAgdGhpcy5iYWNrb2ZmID0gbmV3IEJhY2tvZmYoe1xuICAgICAgICAgICAgbWluOiB0aGlzLnJlY29ubmVjdGlvbkRlbGF5KCksXG4gICAgICAgICAgICBtYXg6IHRoaXMucmVjb25uZWN0aW9uRGVsYXlNYXgoKSxcbiAgICAgICAgICAgIGppdHRlcjogdGhpcy5yYW5kb21pemF0aW9uRmFjdG9yKCksXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRpbWVvdXQobnVsbCA9PSBvcHRzLnRpbWVvdXQgPyAyMDAwMCA6IG9wdHMudGltZW91dCk7XG4gICAgICAgIHRoaXMuX3JlYWR5U3RhdGUgPSBcImNsb3NlZFwiO1xuICAgICAgICB0aGlzLnVyaSA9IHVyaTtcbiAgICAgICAgY29uc3QgX3BhcnNlciA9IG9wdHMucGFyc2VyIHx8IHBhcnNlcjtcbiAgICAgICAgdGhpcy5lbmNvZGVyID0gbmV3IF9wYXJzZXIuRW5jb2RlcigpO1xuICAgICAgICB0aGlzLmRlY29kZXIgPSBuZXcgX3BhcnNlci5EZWNvZGVyKCk7XG4gICAgICAgIHRoaXMuX2F1dG9Db25uZWN0ID0gb3B0cy5hdXRvQ29ubmVjdCAhPT0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLl9hdXRvQ29ubmVjdClcbiAgICAgICAgICAgIHRoaXMub3BlbigpO1xuICAgIH1cbiAgICByZWNvbm5lY3Rpb24odikge1xuICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVjb25uZWN0aW9uO1xuICAgICAgICB0aGlzLl9yZWNvbm5lY3Rpb24gPSAhIXY7XG4gICAgICAgIGlmICghdikge1xuICAgICAgICAgICAgdGhpcy5za2lwUmVjb25uZWN0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmVjb25uZWN0aW9uQXR0ZW1wdHModikge1xuICAgICAgICBpZiAodiA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlY29ubmVjdGlvbkF0dGVtcHRzO1xuICAgICAgICB0aGlzLl9yZWNvbm5lY3Rpb25BdHRlbXB0cyA9IHY7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZWNvbm5lY3Rpb25EZWxheSh2KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZWNvbm5lY3Rpb25EZWxheTtcbiAgICAgICAgdGhpcy5fcmVjb25uZWN0aW9uRGVsYXkgPSB2O1xuICAgICAgICAoX2EgPSB0aGlzLmJhY2tvZmYpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zZXRNaW4odik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByYW5kb21pemF0aW9uRmFjdG9yKHYpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAodiA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JhbmRvbWl6YXRpb25GYWN0b3I7XG4gICAgICAgIHRoaXMuX3JhbmRvbWl6YXRpb25GYWN0b3IgPSB2O1xuICAgICAgICAoX2EgPSB0aGlzLmJhY2tvZmYpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zZXRKaXR0ZXIodik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZWNvbm5lY3Rpb25EZWxheU1heCh2KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZWNvbm5lY3Rpb25EZWxheU1heDtcbiAgICAgICAgdGhpcy5fcmVjb25uZWN0aW9uRGVsYXlNYXggPSB2O1xuICAgICAgICAoX2EgPSB0aGlzLmJhY2tvZmYpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zZXRNYXgodik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0aW1lb3V0KHYpIHtcbiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RpbWVvdXQ7XG4gICAgICAgIHRoaXMuX3RpbWVvdXQgPSB2O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RhcnRzIHRyeWluZyB0byByZWNvbm5lY3QgaWYgcmVjb25uZWN0aW9uIGlzIGVuYWJsZWQgYW5kIHdlIGhhdmUgbm90XG4gICAgICogc3RhcnRlZCByZWNvbm5lY3RpbmcgeWV0XG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG1heWJlUmVjb25uZWN0T25PcGVuKCkge1xuICAgICAgICAvLyBPbmx5IHRyeSB0byByZWNvbm5lY3QgaWYgaXQncyB0aGUgZmlyc3QgdGltZSB3ZSdyZSBjb25uZWN0aW5nXG4gICAgICAgIGlmICghdGhpcy5fcmVjb25uZWN0aW5nICYmXG4gICAgICAgICAgICB0aGlzLl9yZWNvbm5lY3Rpb24gJiZcbiAgICAgICAgICAgIHRoaXMuYmFja29mZi5hdHRlbXB0cyA9PT0gMCkge1xuICAgICAgICAgICAgLy8ga2VlcHMgcmVjb25uZWN0aW9uIGZyb20gZmlyaW5nIHR3aWNlIGZvciB0aGUgc2FtZSByZWNvbm5lY3Rpb24gbG9vcFxuICAgICAgICAgICAgdGhpcy5yZWNvbm5lY3QoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHRyYW5zcG9ydCBgc29ja2V0YC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gb3B0aW9uYWwsIGNhbGxiYWNrXG4gICAgICogQHJldHVybiBzZWxmXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIG9wZW4oZm4pIHtcbiAgICAgICAgaWYgKH50aGlzLl9yZWFkeVN0YXRlLmluZGV4T2YoXCJvcGVuXCIpKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIHRoaXMuZW5naW5lID0gbmV3IEVuZ2luZSh0aGlzLnVyaSwgdGhpcy5vcHRzKTtcbiAgICAgICAgY29uc3Qgc29ja2V0ID0gdGhpcy5lbmdpbmU7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICB0aGlzLl9yZWFkeVN0YXRlID0gXCJvcGVuaW5nXCI7XG4gICAgICAgIHRoaXMuc2tpcFJlY29ubmVjdCA9IGZhbHNlO1xuICAgICAgICAvLyBlbWl0IGBvcGVuYFxuICAgICAgICBjb25zdCBvcGVuU3ViRGVzdHJveSA9IG9uKHNvY2tldCwgXCJvcGVuXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHNlbGYub25vcGVuKCk7XG4gICAgICAgICAgICBmbiAmJiBmbigpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgb25FcnJvciA9IChlcnIpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cCgpO1xuICAgICAgICAgICAgdGhpcy5fcmVhZHlTdGF0ZSA9IFwiY2xvc2VkXCI7XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImVycm9yXCIsIGVycik7XG4gICAgICAgICAgICBpZiAoZm4pIHtcbiAgICAgICAgICAgICAgICBmbihlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gT25seSBkbyB0aGlzIGlmIHRoZXJlIGlzIG5vIGZuIHRvIGhhbmRsZSB0aGUgZXJyb3JcbiAgICAgICAgICAgICAgICB0aGlzLm1heWJlUmVjb25uZWN0T25PcGVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8vIGVtaXQgYGVycm9yYFxuICAgICAgICBjb25zdCBlcnJvclN1YiA9IG9uKHNvY2tldCwgXCJlcnJvclwiLCBvbkVycm9yKTtcbiAgICAgICAgaWYgKGZhbHNlICE9PSB0aGlzLl90aW1lb3V0KSB7XG4gICAgICAgICAgICBjb25zdCB0aW1lb3V0ID0gdGhpcy5fdGltZW91dDtcbiAgICAgICAgICAgIC8vIHNldCB0aW1lclxuICAgICAgICAgICAgY29uc3QgdGltZXIgPSB0aGlzLnNldFRpbWVvdXRGbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgb3BlblN1YkRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICBvbkVycm9yKG5ldyBFcnJvcihcInRpbWVvdXRcIikpO1xuICAgICAgICAgICAgICAgIHNvY2tldC5jbG9zZSgpO1xuICAgICAgICAgICAgfSwgdGltZW91dCk7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRzLmF1dG9VbnJlZikge1xuICAgICAgICAgICAgICAgIHRpbWVyLnVucmVmKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnN1YnMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhclRpbWVvdXRGbih0aW1lcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN1YnMucHVzaChvcGVuU3ViRGVzdHJveSk7XG4gICAgICAgIHRoaXMuc3Vicy5wdXNoKGVycm9yU3ViKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFsaWFzIGZvciBvcGVuKClcbiAgICAgKlxuICAgICAqIEByZXR1cm4gc2VsZlxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBjb25uZWN0KGZuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wZW4oZm4pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiB0cmFuc3BvcnQgb3Blbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25vcGVuKCkge1xuICAgICAgICAvLyBjbGVhciBvbGQgc3Vic1xuICAgICAgICB0aGlzLmNsZWFudXAoKTtcbiAgICAgICAgLy8gbWFyayBhcyBvcGVuXG4gICAgICAgIHRoaXMuX3JlYWR5U3RhdGUgPSBcIm9wZW5cIjtcbiAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJvcGVuXCIpO1xuICAgICAgICAvLyBhZGQgbmV3IHN1YnNcbiAgICAgICAgY29uc3Qgc29ja2V0ID0gdGhpcy5lbmdpbmU7XG4gICAgICAgIHRoaXMuc3Vicy5wdXNoKG9uKHNvY2tldCwgXCJwaW5nXCIsIHRoaXMub25waW5nLmJpbmQodGhpcykpLCBvbihzb2NrZXQsIFwiZGF0YVwiLCB0aGlzLm9uZGF0YS5iaW5kKHRoaXMpKSwgb24oc29ja2V0LCBcImVycm9yXCIsIHRoaXMub25lcnJvci5iaW5kKHRoaXMpKSwgb24oc29ja2V0LCBcImNsb3NlXCIsIHRoaXMub25jbG9zZS5iaW5kKHRoaXMpKSwgXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgb24odGhpcy5kZWNvZGVyLCBcImRlY29kZWRcIiwgdGhpcy5vbmRlY29kZWQuYmluZCh0aGlzKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiBhIHBpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG9ucGluZygpIHtcbiAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJwaW5nXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2l0aCBkYXRhLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBvbmRhdGEoZGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5kZWNvZGVyLmFkZChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5vbmNsb3NlKFwicGFyc2UgZXJyb3JcIiwgZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gcGFyc2VyIGZ1bGx5IGRlY29kZXMgYSBwYWNrZXQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG9uZGVjb2RlZChwYWNrZXQpIHtcbiAgICAgICAgLy8gdGhlIG5leHRUaWNrIGNhbGwgcHJldmVudHMgYW4gZXhjZXB0aW9uIGluIGEgdXNlci1wcm92aWRlZCBldmVudCBsaXN0ZW5lciBmcm9tIHRyaWdnZXJpbmcgYSBkaXNjb25uZWN0aW9uIGR1ZSB0byBhIFwicGFyc2UgZXJyb3JcIlxuICAgICAgICBuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcInBhY2tldFwiLCBwYWNrZXQpO1xuICAgICAgICB9LCB0aGlzLnNldFRpbWVvdXRGbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIHNvY2tldCBlcnJvci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25lcnJvcihlcnIpIHtcbiAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJlcnJvclwiLCBlcnIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHNvY2tldCBmb3IgdGhlIGdpdmVuIGBuc3BgLlxuICAgICAqXG4gICAgICogQHJldHVybiB7U29ja2V0fVxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBzb2NrZXQobnNwLCBvcHRzKSB7XG4gICAgICAgIGxldCBzb2NrZXQgPSB0aGlzLm5zcHNbbnNwXTtcbiAgICAgICAgaWYgKCFzb2NrZXQpIHtcbiAgICAgICAgICAgIHNvY2tldCA9IG5ldyBTb2NrZXQodGhpcywgbnNwLCBvcHRzKTtcbiAgICAgICAgICAgIHRoaXMubnNwc1tuc3BdID0gc29ja2V0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX2F1dG9Db25uZWN0ICYmICFzb2NrZXQuYWN0aXZlKSB7XG4gICAgICAgICAgICBzb2NrZXQuY29ubmVjdCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzb2NrZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIGEgc29ja2V0IGNsb3NlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNvY2tldFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2Rlc3Ryb3koc29ja2V0KSB7XG4gICAgICAgIGNvbnN0IG5zcHMgPSBPYmplY3Qua2V5cyh0aGlzLm5zcHMpO1xuICAgICAgICBmb3IgKGNvbnN0IG5zcCBvZiBuc3BzKSB7XG4gICAgICAgICAgICBjb25zdCBzb2NrZXQgPSB0aGlzLm5zcHNbbnNwXTtcbiAgICAgICAgICAgIGlmIChzb2NrZXQuYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2Nsb3NlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhIHBhY2tldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYWNrZXRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9wYWNrZXQocGFja2V0KSB7XG4gICAgICAgIGNvbnN0IGVuY29kZWRQYWNrZXRzID0gdGhpcy5lbmNvZGVyLmVuY29kZShwYWNrZXQpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVuY29kZWRQYWNrZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmVuZ2luZS53cml0ZShlbmNvZGVkUGFja2V0c1tpXSwgcGFja2V0Lm9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsZWFuIHVwIHRyYW5zcG9ydCBzdWJzY3JpcHRpb25zIGFuZCBwYWNrZXQgYnVmZmVyLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjbGVhbnVwKCkge1xuICAgICAgICB0aGlzLnN1YnMuZm9yRWFjaCgoc3ViRGVzdHJveSkgPT4gc3ViRGVzdHJveSgpKTtcbiAgICAgICAgdGhpcy5zdWJzLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuZGVjb2Rlci5kZXN0cm95KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb3NlIHRoZSBjdXJyZW50IHNvY2tldC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2Nsb3NlKCkge1xuICAgICAgICB0aGlzLnNraXBSZWNvbm5lY3QgPSB0cnVlO1xuICAgICAgICB0aGlzLl9yZWNvbm5lY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5vbmNsb3NlKFwiZm9yY2VkIGNsb3NlXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3IgY2xvc2UoKVxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBkaXNjb25uZWN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2xvc2UoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW46XG4gICAgICpcbiAgICAgKiAtIHRoZSBsb3ctbGV2ZWwgZW5naW5lIGlzIGNsb3NlZFxuICAgICAqIC0gdGhlIHBhcnNlciBlbmNvdW50ZXJlZCBhIGJhZGx5IGZvcm1hdHRlZCBwYWNrZXRcbiAgICAgKiAtIGFsbCBzb2NrZXRzIGFyZSBkaXNjb25uZWN0ZWRcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25jbG9zZShyZWFzb24sIGRlc2NyaXB0aW9uKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgICAgIChfYSA9IHRoaXMuZW5naW5lKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2xvc2UoKTtcbiAgICAgICAgdGhpcy5iYWNrb2ZmLnJlc2V0KCk7XG4gICAgICAgIHRoaXMuX3JlYWR5U3RhdGUgPSBcImNsb3NlZFwiO1xuICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImNsb3NlXCIsIHJlYXNvbiwgZGVzY3JpcHRpb24pO1xuICAgICAgICBpZiAodGhpcy5fcmVjb25uZWN0aW9uICYmICF0aGlzLnNraXBSZWNvbm5lY3QpIHtcbiAgICAgICAgICAgIHRoaXMucmVjb25uZWN0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQXR0ZW1wdCBhIHJlY29ubmVjdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcmVjb25uZWN0KCkge1xuICAgICAgICBpZiAodGhpcy5fcmVjb25uZWN0aW5nIHx8IHRoaXMuc2tpcFJlY29ubmVjdClcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgaWYgKHRoaXMuYmFja29mZi5hdHRlbXB0cyA+PSB0aGlzLl9yZWNvbm5lY3Rpb25BdHRlbXB0cykge1xuICAgICAgICAgICAgdGhpcy5iYWNrb2ZmLnJlc2V0KCk7XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcInJlY29ubmVjdF9mYWlsZWRcIik7XG4gICAgICAgICAgICB0aGlzLl9yZWNvbm5lY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGRlbGF5ID0gdGhpcy5iYWNrb2ZmLmR1cmF0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLl9yZWNvbm5lY3RpbmcgPSB0cnVlO1xuICAgICAgICAgICAgY29uc3QgdGltZXIgPSB0aGlzLnNldFRpbWVvdXRGbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGYuc2tpcFJlY29ubmVjdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwicmVjb25uZWN0X2F0dGVtcHRcIiwgc2VsZi5iYWNrb2ZmLmF0dGVtcHRzKTtcbiAgICAgICAgICAgICAgICAvLyBjaGVjayBhZ2FpbiBmb3IgdGhlIGNhc2Ugc29ja2V0IGNsb3NlZCBpbiBhYm92ZSBldmVudHNcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5za2lwUmVjb25uZWN0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgc2VsZi5vcGVuKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmVjb25uZWN0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlY29ubmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJyZWNvbm5lY3RfZXJyb3JcIiwgZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25yZWNvbm5lY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSwgZGVsYXkpO1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0cy5hdXRvVW5yZWYpIHtcbiAgICAgICAgICAgICAgICB0aW1lci51bnJlZigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zdWJzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJUaW1lb3V0Rm4odGltZXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHVwb24gc3VjY2Vzc2Z1bCByZWNvbm5lY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG9ucmVjb25uZWN0KCkge1xuICAgICAgICBjb25zdCBhdHRlbXB0ID0gdGhpcy5iYWNrb2ZmLmF0dGVtcHRzO1xuICAgICAgICB0aGlzLl9yZWNvbm5lY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5iYWNrb2ZmLnJlc2V0KCk7XG4gICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwicmVjb25uZWN0XCIsIGF0dGVtcHQpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyB1cmwgfSBmcm9tIFwiLi91cmwuanNcIjtcbmltcG9ydCB7IE1hbmFnZXIgfSBmcm9tIFwiLi9tYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBTb2NrZXQgfSBmcm9tIFwiLi9zb2NrZXQuanNcIjtcbi8qKlxuICogTWFuYWdlcnMgY2FjaGUuXG4gKi9cbmNvbnN0IGNhY2hlID0ge307XG5mdW5jdGlvbiBsb29rdXAodXJpLCBvcHRzKSB7XG4gICAgaWYgKHR5cGVvZiB1cmkgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgb3B0cyA9IHVyaTtcbiAgICAgICAgdXJpID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgICBjb25zdCBwYXJzZWQgPSB1cmwodXJpLCBvcHRzLnBhdGggfHwgXCIvc29ja2V0LmlvXCIpO1xuICAgIGNvbnN0IHNvdXJjZSA9IHBhcnNlZC5zb3VyY2U7XG4gICAgY29uc3QgaWQgPSBwYXJzZWQuaWQ7XG4gICAgY29uc3QgcGF0aCA9IHBhcnNlZC5wYXRoO1xuICAgIGNvbnN0IHNhbWVOYW1lc3BhY2UgPSBjYWNoZVtpZF0gJiYgcGF0aCBpbiBjYWNoZVtpZF1bXCJuc3BzXCJdO1xuICAgIGNvbnN0IG5ld0Nvbm5lY3Rpb24gPSBvcHRzLmZvcmNlTmV3IHx8XG4gICAgICAgIG9wdHNbXCJmb3JjZSBuZXcgY29ubmVjdGlvblwiXSB8fFxuICAgICAgICBmYWxzZSA9PT0gb3B0cy5tdWx0aXBsZXggfHxcbiAgICAgICAgc2FtZU5hbWVzcGFjZTtcbiAgICBsZXQgaW87XG4gICAgaWYgKG5ld0Nvbm5lY3Rpb24pIHtcbiAgICAgICAgaW8gPSBuZXcgTWFuYWdlcihzb3VyY2UsIG9wdHMpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKCFjYWNoZVtpZF0pIHtcbiAgICAgICAgICAgIGNhY2hlW2lkXSA9IG5ldyBNYW5hZ2VyKHNvdXJjZSwgb3B0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaW8gPSBjYWNoZVtpZF07XG4gICAgfVxuICAgIGlmIChwYXJzZWQucXVlcnkgJiYgIW9wdHMucXVlcnkpIHtcbiAgICAgICAgb3B0cy5xdWVyeSA9IHBhcnNlZC5xdWVyeUtleTtcbiAgICB9XG4gICAgcmV0dXJuIGlvLnNvY2tldChwYXJzZWQucGF0aCwgb3B0cyk7XG59XG4vLyBzbyB0aGF0IFwibG9va3VwXCIgY2FuIGJlIHVzZWQgYm90aCBhcyBhIGZ1bmN0aW9uIChlLmcuIGBpbyguLi4pYCkgYW5kIGFzIGFcbi8vIG5hbWVzcGFjZSAoZS5nLiBgaW8uY29ubmVjdCguLi4pYCksIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG5PYmplY3QuYXNzaWduKGxvb2t1cCwge1xuICAgIE1hbmFnZXIsXG4gICAgU29ja2V0LFxuICAgIGlvOiBsb29rdXAsXG4gICAgY29ubmVjdDogbG9va3VwLFxufSk7XG4vKipcbiAqIFByb3RvY29sIHZlcnNpb24uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgeyBwcm90b2NvbCB9IGZyb20gXCJzb2NrZXQuaW8tcGFyc2VyXCI7XG4vKipcbiAqIEV4cG9zZSBjb25zdHJ1Y3RvcnMgZm9yIHN0YW5kYWxvbmUgYnVpbGQuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgeyBNYW5hZ2VyLCBTb2NrZXQsIGxvb2t1cCBhcyBpbywgbG9va3VwIGFzIGNvbm5lY3QsIGxvb2t1cCBhcyBkZWZhdWx0LCB9O1xuZXhwb3J0IHsgRmV0Y2gsIE5vZGVYSFIsIFhIUiwgTm9kZVdlYlNvY2tldCwgV2ViU29ja2V0LCBXZWJUcmFuc3BvcnQsIH0gZnJvbSBcImVuZ2luZS5pby1jbGllbnRcIjtcbiIsICI1MDRcbiIsICIvL0B0cy1pZ25vcmVcbmltcG9ydCB2ZXJzaW9uVGV4dCBmcm9tIFwiLi4vLi4vLi4vc2RwcHBfcHl0aG9uL3ZlcnNpb24udHh0XCI7XG5cbmV4cG9ydCBjb25zdCBfX0dMT0JBTF9BUElfTEVWRUxfXyA9IHZlcnNpb25UZXh0LnRyaW0oKTtcbiIsICJpbXBvcnQgeyBpbyB9IGZyb20gJ3NvY2tldC5pby1jbGllbnQnO1xuaW1wb3J0IHsgX19HTE9CQUxfQVBJX0xFVkVMX18gfSBmcm9tICcuLi92ZXJzaW9uLm1qcyc7XG5pbXBvcnQgeyBTb2NrZXQgYXMgU29ja2V0SU9DbGllbnQgfSBmcm9tICdzb2NrZXQuaW8tY2xpZW50JztcblxuZXhwb3J0IGNsYXNzIFNvY2tldCB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHNvY2tldDogU29ja2V0SU9DbGllbnQ7XG4gICAgY29uc3RydWN0b3IodXJsOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9ICcvJyArIFt1cmwuc3BsaXQoJy8nKS5zbGljZSgzKS5maWx0ZXIocCA9PiBwKS5qb2luKCcvJyksICdzZC1wcHAvJ10uZmlsdGVyKHAgPT4gcCkuam9pbignLycpO1xuICAgICAgICB1cmwgPSB1cmwuc3BsaXQoJy8nKS5zbGljZSgwLCAzKS5qb2luKCcvJyk7XG5cbiAgICAgICAgdGhpcy5zb2NrZXQgPSBpbyh1cmwsIHtcbiAgICAgICAgICAgIC8vIG9yaWdpbixcbiAgICAgICAgICAgIHRyYW5zcG9ydHM6IFtcIndlYnNvY2tldFwiXSxcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgICAgIGFwaV9sZXZlbDogX19HTE9CQUxfQVBJX0xFVkVMX19cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgYXV0b0Nvbm5lY3Q6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNvY2tldC5vbignY29ubmVjdCcsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LmlvLmVuZ2luZS5iaW5hcnlUeXBlID0gXCJibG9iXCI7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvY2tldC5pZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29ubmVjdCgpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuY29ubmVjdCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbG9zZSgpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIFNvY2tldENvbnN0cnVjdG9yPFQ+ID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcblxuZXhwb3J0IGZ1bmN0aW9uIFNvY2tldE1peGluPFQ+KFxuICAgIC4uLm1peGluczogKChTb2NrZXRDbGFzczogU29ja2V0Q29uc3RydWN0b3I8U29ja2V0PikgPT4gU29ja2V0Q29uc3RydWN0b3I8U29ja2V0PilbXVxuKTogbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gU29ja2V0ICYgVCB7XG4gICAgcmV0dXJuIG1peGlucy5yZWR1Y2UoKFNvY2tldENsYXNzLCBtaXhpbikgPT4gbWl4aW4oU29ja2V0Q2xhc3MpLCBTb2NrZXQpIGFzIG5ldyAoLi4uYXJnczogYW55W10pID0+IFNvY2tldCAmIFQ7XG59XG4iLCAiaW1wb3J0IHsgU29ja2V0LCBTb2NrZXRDb25zdHJ1Y3RvciB9IGZyb20gXCIuLi9jb21tb24vc29ja2V0L1NvY2tldC5tanNcIjtcbmltcG9ydCB7IGFwcCB9IGZyb20gXCIuLi8uLi9tb2R1bGVzL2NvbWZ5L3NyYy9jb21meS1nbG9iYWxzLm10c1wiO1xuaW1wb3J0IHsgUGhvdG9zaG9wQ2FsbGVyIH0gZnJvbSBcIi4vUGhvdG9zaG9wQ2FsbGVySW50ZXJmYWNlLm10c1wiO1xuaW1wb3J0IHsgUGhvdG9zaG9wQ2FsbGVlQWN0aW9ucyB9IGZyb20gXCIuL1Bob3Rvc2hvcENhbGxlZUludGVyZmFjZS5tdHNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIFBob3Rvc2hvcENhbGxlclNvY2tldChTb2NrZXRDbGFzczogU29ja2V0Q29uc3RydWN0b3I8U29ja2V0Pikge1xuXG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgU29ja2V0Q2xhc3MgaW1wbGVtZW50cyBQaG90b3Nob3BDYWxsZXIge1xuICAgICAgICBjb25zdHJ1Y3Rvcih1cmw6IHN0cmluZykge1xuICAgICAgICAgICAgc3VwZXIodXJsKTtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0Lm9uKCdGX3Bob3Rvc2hvcCcsIChwYXlsb2FkOiBhbnksIGNhbGxiYWNrOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGF5bG9hZC5hY3Rpb24gPT0gJ2V4dHJhY3RQU0QnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHAuZ3JhcGgubm9kZXMuZm9yRWFjaCgobm9kZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUudHlwZSA9PSAnU0RQUFAgR2V0IERvY3VtZW50Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4dHJhY3RQU0Qobm9kZSwgcGF5bG9hZC5wYXJhbXMuZnJvbV9zaWQsICcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh7fSlcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh7IGVycm9yOiBlcnJvci5tZXNzYWdlIH0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBhc3luYyBpbXBvcnRQU0REYXRhVVJMRnJvbVBob3Rvc2hvcChzaWQ6IHN0cmluZywgZG9jdW1lbnRfaWRlbnRpZnk6IHN0cmluZywgZnJvbVNTSUQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgICAgICBjb25zdCBibG9iOiBCbG9iID0gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc29ja2V0LmVtaXQoJ0JfcGhvdG9zaG9wJywge1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdwc2QnLFxuICAgICAgICAgICAgICAgICAgICBzaWQ6IHNpZCxcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdnZXQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZnJvbVNTSUQsXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudF9pZGVudGlmeVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgKHBheWxvYWQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHBheWxvYWQuZGF0YSBhcyBhbnkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGJsb2IpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgICAgIHJlYWRlci5vbmxvYWRlbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkYXRhVVJMID0gcmVhZGVyLnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhVVJMIGFzIHN0cmluZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBhc3luYyBleHBvcnRQU0REYXRhVVJMVG9QaG90b3Nob3Aoc2lkOiBzdHJpbmcsIGRvY3VtZW50X2lkZW50aWZ5OiBzdHJpbmcsIGRhdGFVUkw6IHN0cmluZywgZnJvbVNTSUQ6IHN0cmluZykge1xuICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgZmV0Y2goZGF0YVVSTCkudGhlbihyZXMgPT4gcmVzLmFycmF5QnVmZmVyKCkpO1xuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc29ja2V0LmVtaXQoJ0JfcGhvdG9zaG9wJywge1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdwc2QnLFxuICAgICAgICAgICAgICAgICAgICBzaWQ6IHNpZCxcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdleHRyYWN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyb21TU0lELFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRfaWRlbnRpZnksXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBidWZmZXJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIChwYXlsb2FkOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShwYXlsb2FkIGFzIGFueSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHB1YmxpYyBhc3luYyBnZXRJbWFnZShzaWQ6IHN0cmluZywgcGF5bG9hZDogUGhvdG9zaG9wQ2FsbGVlQWN0aW9uc1snZ2V0SW1hZ2UnXVsncGFyYW1zJ10pIHtcbiAgICAgICAgLy8gICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIC8vICAgICAgICAgdGhpcy5zb2NrZXQuZW1pdCgnQl9waG90b3Nob3AnLCB7XG4gICAgICAgIC8vICAgICAgICAgICAgIGFjdGlvbjogJ2dldEltYWdlJyxcbiAgICAgICAgLy8gICAgICAgICAgICAgc2lkOiBzaWQsXG4gICAgICAgIC8vICAgICAgICAgICAgIHBhcmFtczogcGF5bG9hZFxuICAgICAgICAvLyAgICAgICAgIH0sIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgLy8gICAgICAgICAgICAgZGF0YSAmJiBkYXRhLmVycm9yID8gcmVqZWN0KG5ldyBFcnJvcihkYXRhLmVycm9yKSkgOiByZXNvbHZlKGRhdGEpO1xuICAgICAgICAvLyAgICAgICAgIH0pO1xuICAgICAgICAvLyAgICAgfSk7XG4gICAgICAgIC8vIH1cblxuICAgICAgICBwdWJsaWMgYXN5bmMgc2VuZEltYWdlKHNpZDogc3RyaW5nLCBwYXlsb2FkOiBQaG90b3Nob3BDYWxsZWVBY3Rpb25zWydzZW5kSW1hZ2VzJ11bJ3BhcmFtcyddKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc29ja2V0LmVtaXQoJ0JfcGhvdG9zaG9wJywge1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdzZW5kSW1hZ2VzJyxcbiAgICAgICAgICAgICAgICAgICAgc2lkOiBzaWQsXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtczogcGF5bG9hZFxuICAgICAgICAgICAgICAgIH0sIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YSAmJiBkYXRhLmVycm9yID8gcmVqZWN0KG5ldyBFcnJvcihkYXRhLmVycm9yKSkgOiByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgYXN5bmMgZ2V0U3BlY2lhbElkZW50aWZpZXJWYWx1ZShzaWQ6IHN0cmluZywgcGF5bG9hZDogUGhvdG9zaG9wQ2FsbGVlQWN0aW9uc1snZ2V0U3BlY2lhbElkZW50aWZpZXJWYWx1ZSddWydwYXJhbXMnXSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5lbWl0KCdCX3Bob3Rvc2hvcCcsIHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnZ2V0U3BlY2lhbElkZW50aWZpZXJWYWx1ZScsXG4gICAgICAgICAgICAgICAgICAgIHNpZDogc2lkLFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHBheWxvYWRcbiAgICAgICAgICAgICAgICB9LCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgJiYgZGF0YS5lcnJvciA/IHJlamVjdChuZXcgRXJyb3IoZGF0YS5lcnJvcikpIDogcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2FtZSBhcyB0aGUgb25lIGluIFNEUFBQRG9jdW1lbnQgbm9kZS5cbiAgICAgICAgcHJpdmF0ZSBhc3luYyBleHRyYWN0UFNEKG5vZGU6IGFueSwgc2lkOiBzdHJpbmcsIGRvY3VtZW50SWRlbnRpZnk6IHN0cmluZykge1xuICAgICAgICAgICAgaWYgKG5vZGUucHJvcGVydGllcy5wc2QpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmV4cG9ydFBTRERhdGFVUkxUb1Bob3Rvc2hvcChzaWQsIGRvY3VtZW50SWRlbnRpZnksIG5vZGUucHJvcGVydGllc1sncHNkJ10sIHRoaXMuc29ja2V0LmlkIHx8IFwiPz9cIilcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDMwMCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgKGdsb2JhbFRoaXMgYXMgYW55KS5hcHAuY2FudmFzLmRyYXcodHJ1ZSwgdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGNvbnNvbGUuZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsICJleHBvcnQgY29uc3QgYmxhbmtHcmFwaCA9IHtcbiAgICBsYXN0X25vZGVfaWQ6IDAsXG4gICAgbGFzdF9saW5rX2lkOiAwLFxuICAgIG5vZGVzOiBbXSxcbiAgICBsaW5rczogW10sXG4gICAgZ3JvdXBzOiBbXSxcbiAgICBjb25maWc6IHt9LFxuICAgIGV4dHJhOiB7fSxcbiAgICB2ZXJzaW9uOiAwLjRcbn1cbiIsICJpbXBvcnQgeyBwYWdlU3RvcmUgfSBmcm9tIFwicGhvdG9zaG9wTW9kZWxzLm1qc1wiO1xuaW1wb3J0IGkxOG4gZnJvbSBcIi4uLy4uLy4uL3NyYy9jb21tb24vaTE4bi5tdHNcIjtcbmltcG9ydCB7IHNkcHBwWCB9IGZyb20gXCIuLi8uLi8uLi9zcmMvY29tbW9uL3NkcHBwWC5tdHNcIjtcbmltcG9ydCB7IFdpZGdldFRhYmxlU3RydWN0dXJlLCBXaWRnZXRUYWJsZVN0cnVjdHVyZU5vZGUsIFdpZGdldFRhYmxlVmFsdWUgfSBmcm9tIFwiLi4vLi4vLi4vc3JjL3R5cGVzL3NkcHBwXCI7XG5pbXBvcnQgeyBhcHAgfSBmcm9tIFwiLi9jb21meS1nbG9iYWxzLm10c1wiO1xuXG4vLyBEZWZpbmUgYSB0eXBlIGZvciB0aGUgY29udmVydGVyIGZ1bmN0aW9uXG50eXBlIE5vZGVDb252ZXJ0ZXIgPSAobm9kZTogYW55KSA9PiBXaWRnZXRUYWJsZVN0cnVjdHVyZU5vZGUgfCBudWxsO1xudHlwZSBXaWRnZXRWYWx1ZVNldHRlciA9IChub2RlOiBhbnksIHdpZGdldEluZGV4OiBhbnksIHZhbHVlOiBhbnkpID0+IGJvb2xlYW47XG5cbmNvbnN0IGN1c3RvbU5vZGVDb252ZXJ0ZXJzQnlXaWxkY2FyZDogW3N0cmluZywge1xuICAgIGZvcm1hdHRlcjogTm9kZUNvbnZlcnRlcixcbiAgICBzZXR0ZXI6IFdpZGdldFZhbHVlU2V0dGVyIHwgbnVsbFxufV1bXSA9IFtdO1xuXG5zZHBwcFgud2lkZ2V0YWJsZSA9IHNkcHBwWC53aWRnZXRhYmxlIHx8IHt9O1xuc2RwcHBYLndpZGdldGFibGUuYWRkID0gZnVuY3Rpb24gKG5hbWU6IHN0cmluZywgZm46IE5vZGVDb252ZXJ0ZXIgfCB7XG4gICAgZm9ybWF0dGVyOiBOb2RlQ29udmVydGVyLFxuICAgIHNldHRlcjogV2lkZ2V0VmFsdWVTZXR0ZXJcbn0pIHtcbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGN1c3RvbU5vZGVDb252ZXJ0ZXJzQnlXaWxkY2FyZC5wdXNoKFtuYW1lLCB7XG4gICAgICAgICAgICBmb3JtYXR0ZXI6IGZuLFxuICAgICAgICAgICAgc2V0dGVyOiBudWxsXG4gICAgICAgIH1dKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjdXN0b21Ob2RlQ29udmVydGVyc0J5V2lsZGNhcmQucHVzaChbbmFtZSwgZm5dKTtcbiAgICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHNldFdpZGdldFZhbHVlKG5vZGU6IGFueSwgd2lkZ2V0SW5kZXg6IGFueSwgdmFsdWU6IGFueSkge1xuICAgIGNvbnN0IGRlZmF1bHRDb252ZXJ0ZXIgPSBjdXN0b21Ob2RlQ29udmVydGVyc0J5V2lsZGNhcmQuZmluZCgoW3dpbGRjYXJkXSkgPT4ge1xuICAgICAgICByZXR1cm4gd2lsZGNhcmQgPT0gJ19fREVGQVVMVF9fJ1xuICAgIH0pXG4gICAgY29uc3QgY29udmVydGVyID0gY3VzdG9tTm9kZUNvbnZlcnRlcnNCeVdpbGRjYXJkLmZpbmQoKFt3aWxkY2FyZF0pID0+IHtcbiAgICAgICAgcmV0dXJuIHdpbGRjYXJkTWF0Y2god2lsZGNhcmQsIG5vZGUudHlwZSk7XG4gICAgfSkgfHwgZGVmYXVsdENvbnZlcnRlcjtcbiAgICBsZXQgc2V0dGVkID0gZmFsc2U7XG4gICAgaWYgKGNvbnZlcnRlcikge1xuICAgICAgICBjb25zdCBzZXR0ZXIgPSBjb252ZXJ0ZXJbMV0uc2V0dGVyO1xuICAgICAgICBpZiAoc2V0dGVyKSB7XG4gICAgICAgICAgICBzZXR0ZWQgPSAhIXNldHRlcihub2RlLCB3aWRnZXRJbmRleCwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghc2V0dGVkKSB7XG4gICAgICAgIG5vZGUud2lkZ2V0c1t3aWRnZXRJbmRleF0udmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgbm9kZS53aWRnZXRzW3dpZGdldEluZGV4XS5jYWxsYmFjaz8uKHZhbHVlKVxuICAgIH1cbiAgICBjb25zdCB3b3JrZmxvd01hbmFnZXIgPSBhcHAud29ya2Zsb3dNYW5hZ2VyIHx8IGFwcC5leHRlbnNpb25NYW5hZ2VyLndvcmtmbG93XG4gICAgd29ya2Zsb3dNYW5hZ2VyLmFjdGl2ZVdvcmtmbG93Py5jaGFuZ2VUcmFja2VyLmNoZWNrU3RhdGUoKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2lkZ2V0VGFibGVWYWx1ZShncmFwaDogYW55KTogV2lkZ2V0VGFibGVWYWx1ZSB7XG4gICAgY29uc3QgcmV0OiBXaWRnZXRUYWJsZVZhbHVlID0ge307XG4gICAgY29uc3QgZGVmYXVsdENvbnZlcnRlciA9IGN1c3RvbU5vZGVDb252ZXJ0ZXJzQnlXaWxkY2FyZC5maW5kKChbd2lsZGNhcmRdKSA9PiB7XG4gICAgICAgIHJldHVybiB3aWxkY2FyZCA9PSAnX19ERUZBVUxUX18nXG4gICAgfSlcblxuICAgIGdyYXBoXG4gICAgICAgIC5ub2Rlc1xuICAgICAgICAuZm9yRWFjaCgobm9kZTogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoIW5vZGUud2lkZ2V0cyB8fCBub2RlLndpZGdldHMubGVuZ3RoID09IDApIHJldHVybjsgLy8gbm8gd2lkZ2V0c1xuICAgICAgICAgICAgY29uc3QgY29udmVydGVyID0gY3VzdG9tTm9kZUNvbnZlcnRlcnNCeVdpbGRjYXJkLmZpbmQoKFt3aWxkY2FyZF0pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gd2lsZGNhcmRNYXRjaCh3aWxkY2FyZCwgbm9kZS50eXBlKTtcbiAgICAgICAgICAgIH0pIHx8IGRlZmF1bHRDb252ZXJ0ZXI7XG4gICAgICAgICAgICBpZiAoY29udmVydGVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udmVydGVkID0gY29udmVydGVyWzFdLmZvcm1hdHRlcihub2RlKTtcbiAgICAgICAgICAgICAgICBpZiAoY29udmVydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFtub2RlLmlkXSA9IGNvbnZlcnRlZC53aWRnZXRzLm1hcCgod2lkZ2V0OiBhbnkpID0+IHdpZGdldC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICByZXR1cm4gcmV0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFrZVdpZGdldFRhYmxlU3RydWN0dXJlKGdyYXBoOiBhbnksIGFjdGl2ZVdvcmtmbG93OiBhbnkpOiBXaWRnZXRUYWJsZVN0cnVjdHVyZSB7XG4gICAgaWYgKCFncmFwaCkgcmV0dXJuIHtcbiAgICAgICAgd2lkZ2V0VGFibGVJRDogJycsXG4gICAgICAgIHdpZGdldFRhYmxlUGF0aDogJycsXG4gICAgICAgIHdpZGdldFRhYmxlUGVyc2lzdGVkOiBmYWxzZSxcbiAgICAgICAgZ3JvdXBzOiB7fSxcbiAgICAgICAgbm9kZXM6IHt9LFxuICAgICAgICBub2RlSW5kZXhlczogW10sXG4gICAgICAgIGV4dHJhT3B0aW9uczoge1xuICAgICAgICAgICAgdXNlU2xpZGVyRm9yTnVtYmVyV2lkZ2V0OiBwYWdlU3RvcmUuZGF0YS51c2VTbGlkZXJGb3JOdW1iZXJXaWRnZXRcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgZ3JvdXBzOiBXaWRnZXRUYWJsZVN0cnVjdHVyZVsnZ3JvdXBzJ10gPSBncmFwaFxuICAgICAgICAuZ3JvdXBzXG4gICAgICAgIC5tYXAoKGdyb3VwOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGdyb3VwLnJlY29tcHV0ZUluc2lkZU5vZGVzKCk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGlkOiBncm91cC5pZCxcbiAgICAgICAgICAgICAgICBuYW1lOiBncm91cC50aXRsZSxcbiAgICAgICAgICAgICAgICBjb2xvcjogZ3JvdXAuY29sb3IsXG4gICAgICAgICAgICAgICAgbm9kZUlEczogZ3JvdXAubm9kZXMubWFwKChub2RlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUuaWQ7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgY29uc3Qgbm9kZXM6IFdpZGdldFRhYmxlU3RydWN0dXJlTm9kZVtdID0gZ3JhcGhcbiAgICAgICAgLm5vZGVzXG4gICAgICAgIC5tYXAoKG5vZGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKG5vZGUubW9kZSAhPSAwKSByZXR1cm47IC8vIG11dGVkIG9yIGJ5IHBhc3NlZFxuICAgICAgICAgICAgY29uc3QgdGl0bGUgPSBnZXRUaXRsZShub2RlKTtcbiAgICAgICAgICAgIGlmICghdGl0bGUgfHwgdGl0bGUuc3RhcnRzV2l0aChcIi5cIikpIHJldHVybjsgLy8gaGlkZGVuXG4gICAgICAgICAgICBpZiAoIW5vZGUud2lkZ2V0cyB8fCBub2RlLndpZGdldHMubGVuZ3RoID09IDApIHJldHVybjsgLy8gbm8gd2lkZ2V0c1xuXG4gICAgICAgICAgICBjb25zdCBjb252ZXJ0ZXIgPSBjdXN0b21Ob2RlQ29udmVydGVyc0J5V2lsZGNhcmQuZmluZCgoW3dpbGRjYXJkXSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB3aWxkY2FyZE1hdGNoKHdpbGRjYXJkLCBub2RlLnR5cGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoY29udmVydGVyKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udmVydGVkID0gY29udmVydGVyWzFdLmZvcm1hdHRlcihub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnZlcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydGVkLmlkID0gbm9kZS5pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZC51aVdlaWdodFN1bSA9IGNvbnZlcnRlZC53aWRnZXRzLnJlZHVjZSgoc3VtOiBudW1iZXIsIHdpZGdldDogYW55KSA9PiBzdW0gKyAod2lkZ2V0LnVpV2VpZ2h0IHx8IDEyKSwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogbm9kZS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVpV2VpZ2h0U3VtOiAxMixcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZGdldHM6IFt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogaTE4bignY29udmVydCB3aWRnZXQgezB9IGZhaWxlZDonLCBjb252ZXJ0ZXJbMF0pICsgKGUubWVzc2FnZSB8fCBlIHx8ICcnKSArIChlPy5zdGFjayB8fCAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGdlbmVyaWMgbm9kZSBcbiAgICAgICAgICAgIC8vb25seSB1c2UgdGhlIG5vZGVzIHN0YXJ0cyB3aXRoICNcbiAgICAgICAgICAgIGlmICghdGl0bGUuc3RhcnRzV2l0aChcIiNcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHdpZGdldHMgPSBub2RlLndpZGdldHM7XG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0Q29udmVydGVyID0gY3VzdG9tTm9kZUNvbnZlcnRlcnNCeVdpbGRjYXJkLmZpbmQoKFt3aWxkY2FyZF0pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gd2lsZGNhcmQgPT0gJ19fREVGQVVMVF9fJ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGlmIChkZWZhdWx0Q29udmVydGVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udmVydGVkID0gZGVmYXVsdENvbnZlcnRlclsxXS5mb3JtYXR0ZXIobm9kZSk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnZlcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihjb252ZXJ0ZWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVpV2VpZ2h0U3VtOiBjb252ZXJ0ZWQud2lkZ2V0cy5yZWR1Y2UoKHN1bTogbnVtYmVyLCB3aWRnZXQ6IGFueSkgPT4gc3VtICsgKHdpZGdldC51aVdlaWdodCB8fCAxMiksIDApLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjb252ZXJ0ZWQgPSB7XG4gICAgICAgICAgICAgICAgaWQ6IG5vZGUuaWQsXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxuICAgICAgICAgICAgICAgIHdpZGdldHM6IHdpZGdldHMubWFwKCh3aWRnZXQ6IGFueSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogd2lkZ2V0LmxhYmVsIHx8IHdpZGdldC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRUeXBlOiB3aWRnZXQudHlwZSB8fCBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogd2lkZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB3aWRnZXQub3B0aW9uc1xuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGNvbnZlcnRlZCwge1xuICAgICAgICAgICAgICAgIHVpV2VpZ2h0U3VtOiBjb252ZXJ0ZWQud2lkZ2V0cy5yZWR1Y2UoKHN1bTogbnVtYmVyLCB3aWRnZXQ6IGFueSkgPT4gc3VtICsgKHdpZGdldC51aVdlaWdodCB8fCAxMiksIDApLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgLnNvcnQoKGE6IFdpZGdldFRhYmxlU3RydWN0dXJlTm9kZSwgYjogV2lkZ2V0VGFibGVTdHJ1Y3R1cmVOb2RlKSA9PiB7XG4gICAgICAgICAgICBsZXQgdGl0bGVBID0gZ2V0VGl0bGUoYSk7XG4gICAgICAgICAgICBsZXQgdGl0bGVCID0gZ2V0VGl0bGUoYik7XG4gICAgICAgICAgICB0aXRsZUEgPSB0aXRsZUEuc3RhcnRzV2l0aChcIiNcIikgPyB0aXRsZUEuc2xpY2UoMSkudHJpbSgpIDogdGl0bGVBLnRyaW0oKTtcbiAgICAgICAgICAgIHRpdGxlQiA9IHRpdGxlQi5zdGFydHNXaXRoKFwiI1wiKSA/IHRpdGxlQi5zbGljZSgxKS50cmltKCkgOiB0aXRsZUIudHJpbSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRpdGxlQS5sb2NhbGVDb21wYXJlKHRpdGxlQik7XG4gICAgICAgIH0pXG5cbiAgICByZXR1cm4ge1xuICAgICAgICB3aWRnZXRUYWJsZVBhdGg6IGFjdGl2ZVdvcmtmbG93LnBhdGgsXG4gICAgICAgIHdpZGdldFRhYmxlUGVyc2lzdGVkOiBhY3RpdmVXb3JrZmxvdy5pc1BlcnNpc3RlZCxcbiAgICAgICAgd2lkZ2V0VGFibGVJRDogYWN0aXZlV29ya2Zsb3cuYWN0aXZlU3RhdGUuaWQsXG4gICAgICAgIGdyb3VwcyxcbiAgICAgICAgbm9kZXM6IG5vZGVzLnJlZHVjZSgoYWNjOiBSZWNvcmQ8bnVtYmVyLCBXaWRnZXRUYWJsZVN0cnVjdHVyZU5vZGU+LCBub2RlOiBXaWRnZXRUYWJsZVN0cnVjdHVyZU5vZGUpID0+IHtcbiAgICAgICAgICAgIGFjY1tub2RlLmlkXSA9IG5vZGU7XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LCB7fSksXG4gICAgICAgIG5vZGVJbmRleGVzOiBub2Rlcy5tYXAoKG5vZGU6IFdpZGdldFRhYmxlU3RydWN0dXJlTm9kZSkgPT4gbm9kZS5pZCksXG4gICAgICAgIGV4dHJhT3B0aW9uczoge1xuICAgICAgICAgICAgdXNlU2xpZGVyRm9yTnVtYmVyV2lkZ2V0OiBwYWdlU3RvcmUuZGF0YS51c2VTbGlkZXJGb3JOdW1iZXJXaWRnZXRcbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG5mdW5jdGlvbiB3aWxkY2FyZE1hdGNoKHBhdHRlcm46IHN0cmluZywgdGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gQ29udmVydCB3aWxkY2FyZCBwYXR0ZXJuIHRvIHJlZ2V4IHBhdHRlcm5cbiAgICBjb25zdCByZWdleFBhdHRlcm4gPSBwYXR0ZXJuXG4gICAgICAgIC5yZXBsYWNlKC9bLiteJHt9KCl8W1xcXVxcXFxdL2csICdcXFxcJCYnKSAvLyBFc2NhcGUgcmVnZXggc3BlY2lhbCBjaGFycyBleGNlcHQgKiBhbmQgP1xuICAgICAgICAucmVwbGFjZSgvXFwqL2csICcuKicpICAgICAgICAgICAgICAgICAgLy8gKiBtYXRjaGVzIGFueSBzZXF1ZW5jZVxuICAgICAgICAucmVwbGFjZSgvXFw/L2csICcuJyk7ICAgICAgICAgICAgICAgICAgLy8gPyBtYXRjaGVzIGFueSBzaW5nbGUgY2hhcmFjdGVyXG5cbiAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYF4ke3JlZ2V4UGF0dGVybn0kYCk7XG4gICAgcmV0dXJuIHJlZ2V4LnRlc3QodGV4dCk7XG59XG5cbi8qKlxuICogZ2V0IHRoZSB0aXRsZSBvZiB0aGUgbm9kZSwgd2l0aCBwcmlvcml0eSB0byBhdm9pZCBjb25mbGljdHMgd2l0aCB0aGUgaGlkZGVuIHByb3BlcnR5IHNkcHBwX3dpZGdldGFibGVfdGl0bGVcbiAqIFx1ODNCN1x1NTNENlx1ODI4Mlx1NzBCOVx1NzY4NFx1NjgwN1x1OTg5OCwgXHU0RjE4XHU1MTQ4XHU3NTI4XHU0RThFXHU4OUM0XHU5MDdGXHU1MUIyXHU3QTgxXHU3Njg0XHU5NjkwXHU4NUNGXHU1QzVFXHU2MDI3c2RwcHBfd2lkZ2V0YWJsZV90aXRsZVxuICogXG4gKiBAcGFyYW0geyp9IG5vZGUgXG4gKiBAcmV0dXJucyBcbiAqL1xuZnVuY3Rpb24gZ2V0VGl0bGUobm9kZTogYW55LCBkZWZhdWx0VGl0bGU6IHN0cmluZyA9ICcnKSB7XG4gICAgbGV0IHJldFRpdGxlID0gZGVmYXVsdFRpdGxlIHx8IG5vZGUudGl0bGUgfHwgJyc7XG4gICAgaWYgKG5vZGUuc2V0UHJvcGVydHkgJiYgKHJldFRpdGxlLnN0YXJ0c1dpdGgoXCIjXCIpIHx8IHJldFRpdGxlLnN0YXJ0c1dpdGgoXCIuXCIpKSkge1xuICAgICAgICBub2RlLnNldFByb3BlcnR5KCdzZHBwcF93aWRnZXRhYmxlX3RpdGxlJywgcmV0VGl0bGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldFRpdGxlID0gbm9kZS5wcm9wZXJ0aWVzPy5bJ3NkcHBwX3dpZGdldGFibGVfdGl0bGUnXSB8fCByZXRUaXRsZTtcbiAgICB9XG4gICAgcmV0dXJuIHJldFRpdGxlO1xufVxuc2RwcHBYLmdldE5vZGVUaXRsZSA9IGdldFRpdGxlOyIsICJjb25zdCBwcm9tcHRzRnJvbVNEUFBQQmFja2VuZCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5leHBvcnQgZGVmYXVsdCBwcm9tcHRzRnJvbVNEUFBQQmFja2VuZFxuIiwgImltcG9ydCB7IFdvcmtmbG93Q2FsbGVlQWN0aW9ucyB9IGZyb20gXCIuLi8uLi8uLi8uLi9zcmMvc29ja2V0L1dvcmtmbG93Q2FsbGVlSW50ZXJmYWNlLm10c1wiO1xuaW1wb3J0IHsgU29ja2V0LCBTb2NrZXRDb25zdHJ1Y3RvciB9IGZyb20gXCIuLi8uLi8uLi8uLi9zcmMvY29tbW9uL3NvY2tldC9Tb2NrZXQubXRzXCI7XG5pbXBvcnQgeyBXb3JrZmxvd0NhbGxlckFjdGlvbnMgfSBmcm9tIFwiLi4vLi4vLi4vLi4vc3JjL3NvY2tldC9Xb3JrZmxvd0NhbGxlckludGVyZmFjZS5tdHNcIjtcbmltcG9ydCB7IHBhZ2VTdG9yZSB9IGZyb20gXCIuLi8uLi9waG90b3Nob3BNb2RlbHMubXRzXCI7XG5pbXBvcnQgeyBhcGksIGFwcCB9IGZyb20gXCIuLi9jb21meS1nbG9iYWxzLm10c1wiO1xuaW1wb3J0IHsgYmxhbmtHcmFwaCB9IGZyb20gXCIuLi9kZWZhdWx0R3JhcGgubXRzXCI7XG5pbXBvcnQgeyBtYWtlV2lkZ2V0VGFibGVTdHJ1Y3R1cmUsIHNldFdpZGdldFZhbHVlIH0gZnJvbSBcIi4uL2dyYXBoLXRvLWZvcm0ubXRzXCI7XG5pbXBvcnQgUHJldmlld1NlbmRlciBmcm9tIFwiLi4vUHJldmlld1NlbmRlci5tdHNcIjtcbmltcG9ydCBpMThuIGZyb20gXCIuLi8uLi8uLi8uLi9zcmMvY29tbW9uL2kxOG4ubXRzXCI7XG5cbmludGVyZmFjZSBXb3JrZmxvd0NhbGxlZVBheWxvYWQge1xuICAgIGFjdGlvbjoga2V5b2YgV29ya2Zsb3dDYWxsZWVBY3Rpb25zLFxuICAgIHNpZDogc3RyaW5nLFxuICAgIHBhcmFtczogV29ya2Zsb3dDYWxsZWVBY3Rpb25zW2tleW9mIFdvcmtmbG93Q2FsbGVlQWN0aW9uc11bJ3BhcmFtcyddXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBXb3JrZmxvd0NhbGxlZVNvY2tldChTb2NrZXRDbGFzczogU29ja2V0Q29uc3RydWN0b3I8U29ja2V0Pikge1xuXG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgU29ja2V0Q2xhc3Mge1xuICAgICAgICBwcml2YXRlIHdvcmtmbG93TWFuYWdlcjogYW55XG5cbiAgICAgICAgY29uc3RydWN0b3IodXJsOiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHN1cGVyKHVybCk7XG4gICAgICAgICAgICB0aGlzLndvcmtmbG93TWFuYWdlciA9IGFwcC53b3JrZmxvd01hbmFnZXIgfHwgYXBwLmV4dGVuc2lvbk1hbmFnZXIud29ya2Zsb3dcblxuICAgICAgICAgICAgdGhpcy5zb2NrZXQub24oJ0Zfd29ya2Zsb3cnLCBhc3luYyAocGF5bG9hZDogV29ya2Zsb3dDYWxsZWVQYXlsb2FkLCBjYWxsYmFjazogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLmFjdGlvbiA9PSAnb3BlbicgfHxcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC5hY3Rpb24gPT0gJ3NhdmUnIHx8XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQuYWN0aW9uID09ICdsaXN0JyB8fFxuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLmFjdGlvbiA9PSAnc2V0V2lkZ2V0VmFsdWUnIHx8XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQuYWN0aW9uID09ICdydW4nIHx8XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQuYWN0aW9uID09ICdzZXROb2RlVGl0bGUnIHx8XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQuYWN0aW9uID09ICdsb2dvdXQnIHx8XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQuYWN0aW9uID09ICdpbnRlcnJ1cHQnIHx8XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQuYWN0aW9uID09ICdjbGVhclF1ZXVlJyB8fFxuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLmFjdGlvbiA9PSAncmVib290J1xuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXNbcGF5bG9hZC5hY3Rpb25dKHBheWxvYWQucGFyYW1zKSBhcyBhbnlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHJlcyB8fCB7fSlcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGUuc3RhY2sgfHwgZS5tZXNzYWdlIHx8IGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogJ0ludmFsaWQgYWN0aW9uJ1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHByaXZhdGUgYXN5bmMgbG9nb3V0KCkge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBpLXNpZ24tb3V0JykucGFyZW50RWxlbWVudC5jbGljaygpXG4gICAgICAgIH1cblxuICAgICAgICBwcml2YXRlIGFzeW5jIHJ1bihwYXJhbXM6IFdvcmtmbG93Q2FsbGVlQWN0aW9uc1sncnVuJ11bJ3BhcmFtcyddKSB7XG4gICAgICAgICAgICBpZiAoIWhpamFja2VkUXVldWVQcm9tcHQpIHtcbiAgICAgICAgICAgICAgICBoaWphY2tRdWV1ZVByb21wdCgpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGJhdGNoQ291bnQgPSBwYXJhbXMuc2l6ZTtcblxuICAgICAgICAgICAgbGV0IGhhc0FueUVycm9yID0gZmFsc2VcbiAgICAgICAgICAgIGxldCBnZW5lcmFsRXJyb3IgPSAnJ1xuICAgICAgICAgICAgbGV0IG5vZGVFcnJvcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgYXBwLnF1ZXVlUHJvbXB0KDEsIGJhdGNoQ291bnQpXG4gICAgICAgICAgICAgICAgaWYgKCFzdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc0FueUVycm9yID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICBub2RlRXJyb3JzID0gZm9ybWF0Tm9kZUVycm9ycyhhcHAubGFzdE5vZGVFcnJvcnMpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGhhc0FueUVycm9yID0gdHJ1ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaGFzQW55RXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAoZ2VuZXJhbEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2VTdG9yZS5zZXRMYXN0RXJyb3IoZ2VuZXJhbEVycm9yKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2VTdG9yZS5zZXRXaWRnZXRUYWJsZUVycm9ycyhub2RlRXJyb3JzKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHByb21wdElkID0gbGFzdFF1ZXVlUHJvbXB0UmVzLnByb21wdF9pZFxuICAgICAgICAgICAgUHJldmlld1NlbmRlci5zZXQocHJvbXB0SWQsIHBhcmFtcy5mcm9tX3NpZClcbiAgICAgICAgICAgIGZ1bmN0aW9uIGZvcm1hdE5vZGVFcnJvcnMoZXJyb3JzOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhlcnJvcnMpLmZvckVhY2goKG5vZGVJRCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXRbbm9kZUlELnNwbGl0KFwiOlwiKVswXV0gPSBlcnJvcnNbbm9kZUlEXS5lcnJvcnMubWFwKEpTT04uc3RyaW5naWZ5KS5qb2luKCdcXG4nKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHB1YmxpYyBhc3luYyBsaXN0KCkge1xuICAgICAgICAgICAgY29uc3Qgd29ya2Zsb3dzID0gdGhpcy53b3JrZmxvd01hbmFnZXIud29ya2Zsb3dzXG4gICAgICAgICAgICBsZXQgd29ya2Zsb3dQYXRocyA9IHdvcmtmbG93cy5tYXAoKHc6IGFueSkgPT4gdy5wYXRoLnJlcGxhY2UoJ3dvcmtmbG93cy8nLCAnJykpO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycygpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHVzZXJ0b2tlbnMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnQ29tZnkudXNlcklkJylcbiAgICAgICAgICAgICAgICB1c2VydG9rZW5zICYmIGhlYWRlcnMuc2V0KCdjb21meS11c2VyJywgdXNlcnRva2Vucyk7XG4gICAgICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBmZXRjaCBhbmQgYXBwbHkgZmF2b3JpdGVzXG4gICAgICAgICAgICAgICAgY29uc3QgZmF2b3JpdGVzUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICAgICAgICAgICAgJy4vYXBpL3VzZXJkYXRhL3dvcmtmbG93cyUyRi5pbmRleC5qc29uJywge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGZhdm9yaXRlc1Jlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZhdm9yaXRlc0RhdGEgPSBhd2FpdCBmYXZvcml0ZXNSZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZhdm9yaXRlcyA9IGZhdm9yaXRlc0RhdGEuZmF2b3JpdGVzLm1hcCgoZmF2OiBzdHJpbmcpID0+IGZhdi5yZXBsYWNlKCd3b3JrZmxvd3MvJywgJycpKTtcblxuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1BhdGhzLnNvcnQoKGE6IHN0cmluZywgYjogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhSXNGYXZvcml0ZSA9IGZhdm9yaXRlcy5pbmNsdWRlcyhhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJJc0Zhdm9yaXRlID0gZmF2b3JpdGVzLmluY2x1ZGVzKGIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFJc0Zhdm9yaXRlICYmICFiSXNGYXZvcml0ZSkgcmV0dXJuIC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhSXNGYXZvcml0ZSAmJiBiSXNGYXZvcml0ZSkgcmV0dXJuIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ0Vycm9yIGZldGNoaW5nIGZhdm9yaXRlcywgcmV0dXJuaW5nIHVuc29ydGVkIHdvcmtmbG93czonLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gd29ya2Zsb3dQYXRocztcbiAgICAgICAgfVxuICAgICAgICBwcml2YXRlIHNldFdpZGdldFZhbHVlKHBhcmFtczogV29ya2Zsb3dDYWxsZWVBY3Rpb25zWydzZXRXaWRnZXRWYWx1ZSddWydwYXJhbXMnXSkge1xuICAgICAgICAgICAgcGFyYW1zLnZhbHVlcy5mb3JFYWNoKCh7IG5vZGVJRCwgd2lkZ2V0SW5kZXgsIHZhbHVlIH0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gYXBwLmdyYXBoLm5vZGVzLmZpbmQoKG46IGFueSkgPT4gbi5pZCA9PSBub2RlSUQpO1xuICAgICAgICAgICAgICAgIGlmICghbm9kZSB8fCB2YWx1ZSA9PSBub2RlLndpZGdldHNbd2lkZ2V0SW5kZXhdLnZhbHVlKSByZXR1cm47XG4gICAgICAgICAgICAgICAgc2V0V2lkZ2V0VmFsdWUobm9kZSwgd2lkZ2V0SW5kZXgsIHZhbHVlKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcHJpdmF0ZSBhc3luYyBvcGVuKHBhcmFtczogV29ya2Zsb3dDYWxsZWVBY3Rpb25zWydvcGVuJ11bJ3BhcmFtcyddKSB7XG4gICAgICAgICAgICBjb25zdCB7IHdvcmtmbG93X3BhdGggfSA9IHBhcmFtcztcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKHdvcmtmbG93X3BhdGguc3RhcnRzV2l0aCgnc2RwcHA6Ly8nKSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9wZW5TRFBQUFdvcmtmbG93KHBhcmFtcylcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9wZW5Db21meVdvcmtmbG93KHBhcmFtcylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcHJpdmF0ZSBhc3luYyBvcGVuU0RQUFBXb3JrZmxvdyhwYXJhbXM6IFdvcmtmbG93Q2FsbGVlQWN0aW9uc1snb3BlbiddWydwYXJhbXMnXSkge1xuICAgICAgICAgICAgY29uc3Qgd29ya2Zsb3dfcGF0aCA9IHBhcmFtcy53b3JrZmxvd19wYXRoLnJlcGxhY2UoJ3NkcHBwOi8vJywgJycpXG5cbiAgICAgICAgICAgIGNvbnN0IHdvcmtmbG93Q29udGVudCA9IGF3YWl0IGZldGNoKFwiL3NkLXBwcC1zdGF0aWMvc2RwcHAtd29ya2Zsb3dzL1wiICsgd29ya2Zsb3dfcGF0aCkudGhlbihyZXMgPT4gcmVzLmpzb24oKSlcblxuICAgICAgICAgICAgYXdhaXQgYXBwLmxvYWRHcmFwaERhdGEod29ya2Zsb3dDb250ZW50KVxuXG4gICAgICAgICAgICAvLyB0ZW1wIHdvcmtmbG93IG1heSBub3QgaGF2ZSBhbnkgc3RvcmVcbiAgICAgICAgfVxuICAgICAgICBwcml2YXRlIGFzeW5jIG9wZW5Db21meVdvcmtmbG93KHBhcmFtczogV29ya2Zsb3dDYWxsZWVBY3Rpb25zWydvcGVuJ11bJ3BhcmFtcyddKSB7XG4gICAgICAgICAgICBjb25zdCB7IHdvcmtmbG93X3BhdGgsIGZyb21fc2lkLCByZXNldCB9ID0gcGFyYW1zO1xuICAgICAgICAgICAgY29uc3Qgd29ya2Zsb3cgPSB0aGlzLndvcmtmbG93TWFuYWdlci53b3JrZmxvd3MuZmluZCgodzogYW55KSA9PlxuICAgICAgICAgICAgICAgIHcuZnVsbEZpbGVuYW1lID09PSB3b3JrZmxvd19wYXRoIHx8XG4gICAgICAgICAgICAgICAgdy5wYXRoID09PSB3b3JrZmxvd19wYXRoIHx8XG4gICAgICAgICAgICAgICAgdy5wYXRoID09PSAnd29ya2Zsb3dzLycgKyB3b3JrZmxvd19wYXRoXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBpZiAoKHdvcmtmbG93LmlzT3BlbiB8fCB0aGlzLndvcmtmbG93TWFuYWdlci5pc09wZW4/Lih3b3JrZmxvdykpICYmICFyZXNldCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBpZiAodGhpcy53b3JrZmxvd01hbmFnZXIub3BlbldvcmtmbG93cy5sZW5ndGggPT09IDEpIGF3YWl0IGFwcC5sb2FkR3JhcGhEYXRhKGJsYW5rR3JhcGgpXG4gICAgICAgICAgICBlbHNlIGF3YWl0IG9wZW5Xb3JrZmxvdyh0aGlzLndvcmtmbG93TWFuYWdlcixcbiAgICAgICAgICAgICAgICB0aGlzLndvcmtmbG93TWFuYWdlci5vcGVuV29ya2Zsb3dzWzBdID09IHdvcmtmbG93ID9cbiAgICAgICAgICAgICAgICAgICAgdGhpcy53b3JrZmxvd01hbmFnZXIub3BlbldvcmtmbG93c1sxXSA6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMud29ya2Zsb3dNYW5hZ2VyLm9wZW5Xb3JrZmxvd3NbMF1cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMud29ya2Zsb3dNYW5hZ2VyLmNsb3NlV29ya2Zsb3cod29ya2Zsb3csIGZhbHNlKVxuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVzb2x2ZSkpO1xuICAgICAgICAgICAgYXdhaXQgb3BlbldvcmtmbG93KHRoaXMud29ya2Zsb3dNYW5hZ2VyLCB3b3JrZmxvdyk7XG5cbiAgICAgICAgICAgIC8vIHdhaXQgZm9yIHNvbWUgdGhpcmQgcGFydHkgbm9kZXMgdG8gdXBkYXRlXG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgNTAwKSk7XG5cbiAgICAgICAgICAgIGlmICghcGFnZVN0b3JlLmRhdGEud2lkZ2V0VGFibGVTdHJ1Y3R1cmUpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc29ja2V0LmVtaXQoJ0Jfd29ya2Zsb3cnLCB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnZ2V0U3RvcmVkV2lkZ2V0VmFsdWUnLFxuICAgICAgICAgICAgICAgIHNpZDogZnJvbV9zaWQsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgIHdpZGdldFRhYmxlSUQ6IHBhZ2VTdG9yZS5kYXRhLndpZGdldFRhYmxlU3RydWN0dXJlLndpZGdldFRhYmxlSUQsXG4gICAgICAgICAgICAgICAgICAgIHdpZGdldFRhYmxlUGF0aDogcGFnZVN0b3JlLmRhdGEud2lkZ2V0VGFibGVTdHJ1Y3R1cmUud2lkZ2V0VGFibGVQYXRoLFxuICAgICAgICAgICAgICAgICAgICB3aWRnZXRUYWJsZVBlcnNpc3RlZDogcGFnZVN0b3JlLmRhdGEud2lkZ2V0VGFibGVTdHJ1Y3R1cmUud2lkZ2V0VGFibGVQZXJzaXN0ZWQsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgKHJlc3VsdDogV29ya2Zsb3dDYWxsZXJBY3Rpb25zWydnZXRTdG9yZWRXaWRnZXRWYWx1ZSddWydyZXN1bHQnXSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0V2lkZ2V0VmFsdWUocmVzdWx0KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBwcml2YXRlIGFzeW5jIHNhdmUocGFyYW1zOiBXb3JrZmxvd0NhbGxlZUFjdGlvbnNbJ3NhdmUnXVsncGFyYW1zJ10pIHtcbiAgICAgICAgICAgIGNvbnN0IHsgd29ya2Zsb3dfcGF0aCwgZnJvbV9zaWQgfSA9IHBhcmFtcztcbiAgICAgICAgICAgIGNvbnN0IHdvcmtmbG93ID0gdGhpcy53b3JrZmxvd01hbmFnZXIud29ya2Zsb3dzLmZpbmQoKHc6IGFueSkgPT5cbiAgICAgICAgICAgICAgICB3LmZ1bGxGaWxlbmFtZSA9PT0gd29ya2Zsb3dfcGF0aCB8fFxuICAgICAgICAgICAgICAgIHcucGF0aCA9PT0gd29ya2Zsb3dfcGF0aCB8fFxuICAgICAgICAgICAgICAgIHcucGF0aCA9PT0gJ3dvcmtmbG93cy8nICsgd29ya2Zsb3dfcGF0aFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgaWYgKCF3b3JrZmxvdykgdGhyb3cgbmV3IEVycm9yKCdXb3JrZmxvdyBub3QgZm91bmQnKTtcbiAgICAgICAgICAgIGlmICh0aGlzLndvcmtmbG93TWFuYWdlci5hY3RpdmVXb3JrZmxvdz8uaWQgIT0gd29ya2Zsb3cuaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW4oeyB3b3JrZmxvd19wYXRoLCBmcm9tX3NpZCwgcmVzZXQ6IGZhbHNlIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3b3JrZmxvdy5jaGFuZ2VUcmFja2VyLmNoZWNrU3RhdGUoKVxuICAgICAgICAgICAgYXdhaXQgdGhpcy53b3JrZmxvd01hbmFnZXIuc2F2ZVdvcmtmbG93KHdvcmtmbG93KTtcbiAgICAgICAgfVxuICAgICAgICBwdWJsaWMgc2V0Tm9kZVRpdGxlKHBhcmFtczogV29ya2Zsb3dDYWxsZWVBY3Rpb25zWydzZXROb2RlVGl0bGUnXVsncGFyYW1zJ10pIHtcbiAgICAgICAgICAgIGNvbnN0IHsgbm9kZV9pZCwgdGl0bGUgfSA9IHBhcmFtcztcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBhcHAuZ3JhcGgubm9kZXMuZmluZCgobjogYW55KSA9PiBuLmlkID09IG5vZGVfaWQpO1xuICAgICAgICAgICAgaWYgKCFub2RlKSB0aHJvdyBuZXcgRXJyb3IoJ05vZGUgbm90IGZvdW5kJyk7XG4gICAgICAgICAgICBub2RlLnRpdGxlID0gdGl0bGU7XG4gICAgICAgICAgICBub2RlLnNldFByb3BlcnR5KCdzZHBwcF93aWRnZXRhYmxlX3RpdGxlJywgdGl0bGUpO1xuICAgICAgICB9XG4gICAgICAgIHB1YmxpYyBhc3luYyBpbnRlcnJ1cHQocGFyYW1zOiBXb3JrZmxvd0NhbGxlZUFjdGlvbnNbJ2ludGVycnVwdCddWydwYXJhbXMnXSkge1xuICAgICAgICAgICAgYXdhaXQgYXBwLmFwaS5pbnRlcnJ1cHQoKTtcbiAgICAgICAgfVxuICAgICAgICBwdWJsaWMgYXN5bmMgY2xlYXJRdWV1ZShwYXJhbXM6IFdvcmtmbG93Q2FsbGVlQWN0aW9uc1snY2xlYXJRdWV1ZSddWydwYXJhbXMnXSkge1xuICAgICAgICAgICAgYXdhaXQgYXBwLmFwaS5jbGVhckl0ZW1zKCdxdWV1ZScpXG5cbiAgICAgICAgfVxuICAgICAgICBwdWJsaWMgYXN5bmMgcmVib290KHBhcmFtczogV29ya2Zsb3dDYWxsZWVBY3Rpb25zWydyZWJvb3QnXVsncGFyYW1zJ10pIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy4vYXBpL21hbmFnZXIvcmVib290JylcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gNDA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGkxOG4oJ0NvbWZ5TWFuYWdlciBub3QgZm91bmQsIGNhbm5vdCByZWJvb3QnKSxcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSAyMDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBlcnJvcjogaTE4bignRmFpbGVkIHRvIHJlYm9vdCBDb21meVVJJykgKyByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG5cblxuYXN5bmMgZnVuY3Rpb24gb3BlbldvcmtmbG93KHdvcmtmbG93TWFuYWdlcjogYW55LCB3b3JrZmxvdzogYW55KSB7XG4gICAgaWYgKGFwcC53b3JrZmxvd01hbmFnZXIgPT0gd29ya2Zsb3dNYW5hZ2VyKSB7XG4gICAgICAgIGF3YWl0IHdvcmtmbG93LmxvYWQoKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHdvcmtmbG93TWFuYWdlci5vcGVuV29ya2Zsb3cod29ya2Zsb3cpO1xuICAgICAgICBhd2FpdCBhcHAubG9hZEdyYXBoRGF0YShcbiAgICAgICAgICAgIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkod29ya2Zsb3cuYWN0aXZlU3RhdGUpKSxcbiAgICAgICAgLyogY2xlYW49Ki8gdHJ1ZSxcbiAgICAgICAgLyogcmVzdG9yZV92aWV3PSovIHRydWUsXG4gICAgICAgICAgICB3b3JrZmxvdyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgIH1cbn1cbmxldCBoaWphY2tlZFF1ZXVlUHJvbXB0ID0gZmFsc2VcbmxldCBsYXN0UXVldWVQcm9tcHRSZXM6IGFueSA9IG51bGw7XG5mdW5jdGlvbiBoaWphY2tRdWV1ZVByb21wdCgpIHtcbiAgICBpZiAoaGlqYWNrZWRRdWV1ZVByb21wdCkgcmV0dXJuO1xuICAgIGNvbnN0IG9yaWdpbmFsUXVldWVQcm9tcHQgPSBhcGkucXVldWVQcm9tcHQ7XG4gICAgYXBpLnF1ZXVlUHJvbXB0ID0gYXN5bmMgKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICAgIGxhc3RRdWV1ZVByb21wdFJlcyA9IGF3YWl0IG9yaWdpbmFsUXVldWVQcm9tcHQoLi4uYXJncylcbiAgICAgICAgcmV0dXJuIGxhc3RRdWV1ZVByb21wdFJlc1xuICAgIH1cbiAgICBoaWphY2tlZFF1ZXVlUHJvbXB0ID0gdHJ1ZVxufSIsICJpbXBvcnQgeyBNYWluU3RvcmVIb2xkZXJTb2NrZXQgfSBmcm9tIFwiLi4vLi4vLi4vLi4vc3JjL2NvbW1vbi9zb2NrZXQvbWl4aW5zL01haW5TdG9yZUhvbGRlci5tdHNcIjtcbmltcG9ydCB7IFN0b3JlTWFwSG9sZGVyU29ja2V0IH0gZnJvbSBcIi4uLy4uLy4uLy4uL3NyYy9jb21tb24vc29ja2V0L21peGlucy9TdG9yZU1hcEhvbGRlci5tdHNcIjtcbmltcG9ydCB7IFNvY2tldCwgU29ja2V0Q29uc3RydWN0b3IsIFNvY2tldE1peGluIH0gZnJvbSBcIi4uLy4uLy4uLy4uL3NyYy9jb21tb24vc29ja2V0L1NvY2tldC5tdHNcIjtcbmltcG9ydCB7IHBhZ2VQaG90b3Nob3BTdG9yZU1hcCwgcGFnZVN0b3JlIH0gZnJvbSBcIi4uLy4uL3Bob3Rvc2hvcE1vZGVscy5tdHNcIjtcbmltcG9ydCB7IFBob3Rvc2hvcENhbGxlclNvY2tldCB9IGZyb20gXCIuLi8uLi8uLi8uLi9zcmMvc29ja2V0L1Bob3Rvc2hvcENhbGxlci5tdHNcIjtcbmltcG9ydCB7IFdvcmtmbG93Q2FsbGVlU29ja2V0IH0gZnJvbSBcIi4vV29ya2Zsb3dDYWxsZWUubXRzXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93Q2FsbGVlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL3NvY2tldC9Xb3JrZmxvd0NhbGxlZUludGVyZmFjZS5tdHMnO1xuaW1wb3J0IHR5cGUgeyBQaG90b3Nob3BDYWxsZXIgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvc29ja2V0L1Bob3Rvc2hvcENhbGxlckludGVyZmFjZS5tdHMnO1xuXG5leHBvcnQgY2xhc3MgQ29tZnlTb2NrZXQgZXh0ZW5kcyAoU29ja2V0TWl4aW4oXG4gICAgTWFpblN0b3JlSG9sZGVyU29ja2V0KHBhZ2VTdG9yZSwgJ2NvbWZ5JyksXG4gICAgU3RvcmVNYXBIb2xkZXJTb2NrZXQocGFnZVBob3Rvc2hvcFN0b3JlTWFwLCAncGhvdG9zaG9wJyksXG4gICAgUGhvdG9zaG9wQ2FsbGVyU29ja2V0LFxuICAgIFdvcmtmbG93Q2FsbGVlU29ja2V0XG4pIGFzIFNvY2tldENvbnN0cnVjdG9yPFNvY2tldCAmIFBob3Rvc2hvcENhbGxlciAmIFdvcmtmbG93Q2FsbGVlPikge1xuICAgIHN0YXRpYyBpbnN0YW5jZTogQ29tZnlTb2NrZXQ7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKGxvY2F0aW9uLmhyZWYuc3BsaXQoJz8nKVswXS5zcGxpdCgnIycpWzBdKTtcbiAgICAgICAgQ29tZnlTb2NrZXQuaW5zdGFuY2UgPSB0aGlzO1xuICAgIH1cbn0gIiwgImV4cG9ydCBmdW5jdGlvbiBzaW1wbGlmeVdvcmtmbG93UGF0aChwYXRoOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gcGF0aC5yZXBsYWNlKC9ed29ya2Zsb3dzXFwvLywgJycpLnJlcGxhY2UoL1xcLmpzb24kLywgJycpO1xufSIsICJpbXBvcnQgaTE4biwgeyBJMThuS2V5IH0gZnJvbSBcIi4uLy4uLy4uLy4uL3NyYy9jb21tb24vaTE4bi5tdHNcIjtcbmltcG9ydCB7IFNwZWljaWFsSURNYW5hZ2VyIH0gZnJvbSBcIi4uLy4uLy4uLy4uL3NyYy9jb21tb24vcGhvdG9zaG9wL3NwZWNpYWxMYXllci5tdHNcIjtcbmltcG9ydCB7IExheWVyRGF0YSB9IGZyb20gXCIuLi8uLi8uLi8uLi9zcmMvc3RvcmUvcGhvdG9zaG9wLm10c1wiO1xuaW1wb3J0IHsgcGFnZVBob3Rvc2hvcFN0b3JlTWFwLCBwYWdlU3RvcmUgfSBmcm9tIFwiLi4vLi4vcGhvdG9zaG9wTW9kZWxzLm10c1wiO1xuaW1wb3J0IHsgZmluZERvY3VtZW50Tm9kZVJlY3Vyc2l2ZSwgZ2V0TGF5ZXJPcHRpb25zQnlEb2N1bWVudFZhbHVlLCBtYWtlRG9jdW1lbnREYXRhT3B0aW9ucywgbWFrZURvY3VtZW50T3B0aW9uLCBwYXJzZURvY3VtZW50T3B0aW9uIH0gZnJvbSBcIi4uL3V0aWwubXRzXCI7XG5pbXBvcnQgeyBDb21meVNvY2tldCB9IGZyb20gXCIuLi9zb2NrZXQvQ29tZnlTb2NrZXQubXRzXCI7XG5pbXBvcnQgeyBzaW1wbGlmeVdvcmtmbG93UGF0aCB9IGZyb20gXCIuLi8uLi8uLi8uLi9zcmMvY29tbW9uL3N0cmluZy11dGlsLm10c1wiO1xuaW1wb3J0IHsgUGhvdG9zaG9wU3RvcmVIZWxwZXIgfSBmcm9tIFwiLi4vLi4vLi4vLi4vc3JjL3N0b3JlL2hlbHBlcnMubXRzXCI7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTRFBQUFdpZGdldCB7XG4gICAgd2lkZ2V0OiBhbnlcbiAgICBub2RlOiBhbnlcbiAgICBwcm90ZWN0ZWQgb3JpZ2luTGFiZWw6IHN0cmluZyA9ICcnXG4gICAgcHJvdGVjdGVkIGluZGV4SW5Ob2RlOiBudW1iZXIgPSAwXG4gICAgY29uc3RydWN0b3Iobm9kZTogYW55LCB3aWRnZXQ6IGFueSkge1xuICAgICAgICB0aGlzLndpZGdldCA9IHdpZGdldDtcbiAgICAgICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICAgICAgdGhpcy5pbmRleEluTm9kZSA9IG5vZGUud2lkZ2V0cy5pbmRleE9mKHdpZGdldCk7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzXG4gICAgICAgIHdpZGdldC5jYWxsYmFjayA9IGZ1bmN0aW9uICguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICAgICAgaWYgKHNlbGYud2lkZ2V0ICE9IHRoaXMpIHtcbiAgICAgICAgICAgICAgICAvLyAwMjIyIHRlbXAgZml4LCBDb21meVVJIHNpZGUgd2lsbCBjcmVhdGUgbmV3IFdpZGdldCB3aGVuIHR5cGUgY2hhbmdlZC4gXG4gICAgICAgICAgICAgICAgLy8gQnV0IGRpZCBub3QgYXNzaWduIHRoZSBuZXcgb25lIHRvIG5vZGUud2lkZ2V0c1tdXG4gICAgICAgICAgICAgICAgc2VsZi53aWRnZXQgPSBzZWxmLm5vZGUud2lkZ2V0c1tzZWxmLmluZGV4SW5Ob2RlXSA9IHRoaXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlbGYuX2NhbGxiYWNrcy5mb3JFYWNoKGNhbGxiYWNrID0+IGNhbGxiYWNrKC4uLmFyZ3MpKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMub3JpZ2luTGFiZWwgPSB3aWRnZXQubGFiZWxcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jYWxsYmFja3M6ICgoLi4uYXJnczogYW55W10pID0+IGFueSlbXSA9IFtdO1xuICAgIHB1YmxpYyBvbkNoYW5nZShjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpIHtcbiAgICAgICAgdGhpcy5fY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgIH1cbiAgICBwdWJsaWMgcmVtb3ZlT25DaGFuZ2UoY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55KSB7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrcy5zcGxpY2UodGhpcy5fY2FsbGJhY2tzLmluZGV4T2YoY2FsbGJhY2spLCAxKTtcbiAgICB9XG4gICAgcHVibGljIGFic3RyYWN0IHVwZGF0ZSgpOiB2b2lkO1xufVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNEUFBQQ29tYm9XaWRnZXQgZXh0ZW5kcyBTRFBQUFdpZGdldCB7XG4gICAgcHVibGljIGxvY2tNb2RlKGlzTG9jazogYm9vbGVhbiwgbG9ja0xhYmVsOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGlzTG9jaykge1xuICAgICAgICAgICAgaWYgKHRoaXMud2lkZ2V0LnR5cGUgPT0gJ2J1dHRvbicpIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMud2lkZ2V0LnR5cGUgPSAnYnV0dG9uJ1xuICAgICAgICAgICAgdGhpcy53aWRnZXQudmFsdWUgPSAnJztcbiAgICAgICAgICAgIHRoaXMud2lkZ2V0LmxhYmVsID0gbG9ja0xhYmVsO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy53aWRnZXQudHlwZSA9PSAnY29tYm8nKSByZXR1cm47XG4gICAgICAgICAgICB0aGlzLndpZGdldC50eXBlID0gJ2NvbWJvJ1xuICAgICAgICAgICAgdGhpcy53aWRnZXQudmFsdWUgPSAnJztcbiAgICAgICAgICAgIHRoaXMud2lkZ2V0LmxhYmVsID0gdGhpcy5vcmlnaW5MYWJlbDtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBEb2N1bWVudFdpZGdldCBleHRlbmRzIFNEUFBQQ29tYm9XaWRnZXQge1xuICAgIHN0YXRpYyBjcmVhdGUobm9kZTogYW55LCBuYW1lOiBJMThuS2V5KSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnM6IHN0cmluZ1tdID0gbWFrZURvY3VtZW50RGF0YU9wdGlvbnMoKTtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IG5vZGUuc2l6ZS5zbGljZSgwKTtcbiAgICAgICAgY29uc3QgZG9jdW1lbnRXaWRnZXQgPSBub2RlLmFkZFdpZGdldCgnY29tYm8nLCBuYW1lLCBvcHRpb25zWzBdIHx8ICcnLCAoKSA9PiB7IH0sIHsgZm9yY2VJbnB1dDogdHJ1ZSwgdmFsdWVzOiBtYWtlRG9jdW1lbnREYXRhT3B0aW9ucyB9KVxuICAgICAgICBkb2N1bWVudFdpZGdldC5zZXJpYWxpemVWYWx1ZSA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBwYXJzZURvY3VtZW50T3B0aW9uKGRvY3VtZW50V2lkZ2V0LnZhbHVlKTtcbiAgICAgICAgICAgIGlmICghZGF0YSkgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZV9pZDogaTE4bignZG9jdW1lbnQgezB9IG5vdCBmb3VuZCcsIGRvY3VtZW50V2lkZ2V0LnZhbHVlKSxcbiAgICAgICAgICAgICAgICBpZGVudGlmeTogJycsXG4gICAgICAgICAgICAgICAgZGlydHlJRDogMFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsZXQgaWRlbnRpZnkgPSBkYXRhLmlkZW50aWZ5O1xuICAgICAgICAgICAgaWYgKFNwZWljaWFsSURNYW5hZ2VyLmlzX1NQRUNJQUxfRE9DVU1FTlRfQ1VSUkVOVChpZGVudGlmeSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXQgPSBhd2FpdCBDb21meVNvY2tldC5pbnN0YW5jZS5nZXRTcGVjaWFsSWRlbnRpZmllclZhbHVlKGRhdGEuaW5zdGFuY2VfaWQsIHtcbiAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcjogaWRlbnRpZnlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIGlkZW50aWZ5ID0gcmV0LnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZV9pZDogZGF0YS5pbnN0YW5jZV9pZCxcbiAgICAgICAgICAgICAgICBpZGVudGlmeTogaWRlbnRpZnksXG4gICAgICAgICAgICAgICAgY2FudmFzRGlydHlJRDogZGF0YS5kb2N1bWVudERhdGEuY2FudmFzRGlydHlJRCxcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25EaXJ0eUlEOiBkYXRhLmRvY3VtZW50RGF0YS5zZWxlY3Rpb25EaXJ0eUlEXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBub2RlLnNpemUgPSBbc2l6ZVswXSwgTWF0aC5tYXgoc2l6ZVsxXSwgbm9kZS5zaXplWzFdKV07XG4gICAgICAgIHJldHVybiBuZXcgRG9jdW1lbnRXaWRnZXQobm9kZSwgZG9jdW1lbnRXaWRnZXQpO1xuICAgIH1cbiAgICBzdGF0aWMgbGluayhub2RlOiBhbnksIHdpZGdldDogYW55KSB7XG4gICAgICAgIGlmICh3aWRnZXQudHlwZSA9PSBcImNvbWJvXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRG9jdW1lbnRXaWRnZXQobm9kZSwgd2lkZ2V0KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkV2lkZ2V0ID0gRG9jdW1lbnRXaWRnZXQuY3JlYXRlKG5vZGUsIHdpZGdldC5uYW1lKTtcbiAgICAgICAgY29uc3Qgb2xkV2lkZ2V0SW5kZXggPSBub2RlLndpZGdldHMuaW5kZXhPZih3aWRnZXQpO1xuICAgICAgICBub2RlLndpZGdldHNbb2xkV2lkZ2V0SW5kZXhdID0gbm9kZS53aWRnZXRzLnBvcCgpO1xuICAgICAgICByZXR1cm4gZFdpZGdldDtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihub2RlOiBhbnksIHdpZGdldDogYW55KSB7XG4gICAgICAgIHN1cGVyKG5vZGUsIHdpZGdldCk7XG4gICAgICAgIHRoaXMub25DaGFuZ2UoKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmICghaXNOYU4oK3ZhbHVlKSkgeyAvLyBpcyBudW1iZXJcbiAgICAgICAgICAgICAgICB3aWRnZXQudmFsdWUgPSBPYmplY3Qua2V5cyh3aWRnZXQub3B0aW9ucy52YWx1ZXMpWyt2YWx1ZV07XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnKSB7IC8vIGlzIHN0cmluZ1xuICAgICAgICAgICAgICAgIGNvbnN0IHNwbGl0ID0gdmFsdWUuc3BsaXQoJy8nKTtcbiAgICAgICAgICAgICAgICBpZiAoU3BlaWNpYWxJRE1hbmFnZXIuaXNfU1BFQ0lBTF9ET0NVTUVOVF9DVVJSRU5UKHNwbGl0WzFdKSkge1xuICAgICAgICAgICAgICAgICAgICB3aWRnZXQudmFsdWUgPSBzcGxpdFswXSArICcvJyArIFNwZWljaWFsSURNYW5hZ2VyLmdldFNwZWNpYWxEb2N1bWVudEN1cnJlbnQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGUoKSB7XG4gICAgICAgIHdpZGdldENoZWNrQ29udGFpbk9yUmVzZXQodGhpcy53aWRnZXQsIHRoaXMud2lkZ2V0Lm9wdGlvbnMudmFsdWVzLCB0cnVlKVxuICAgIH1cblxuICAgIHB1YmxpYyBzZWxlY3RDb25jcmV0ZURvY3VtZW50KCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBTcGVpY2lhbElETWFuYWdlci5pc19TUEVDSUFMX0RPQ1VNRU5UX0NVUlJFTlQodGhpcy53aWRnZXQudmFsdWUpXG4gICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgW2luc3RhbmNlS2V5LF0gPSB0aGlzLndpZGdldC52YWx1ZS5zcGxpdCgnLycpO1xuICAgICAgICAgICAgY29uc3Qgc3RvcmUgPSBwYWdlUGhvdG9zaG9wU3RvcmVNYXAuZ2V0U3RvcmVCeU5hbWUoaW5zdGFuY2VLZXkpO1xuICAgICAgICAgICAgaWYgKCFzdG9yZSkgcmV0dXJuIGNvbnNvbGUud2Fybihgc3RvcmUgJHtpbnN0YW5jZUtleX0gbm90IGZvdW5kYCk7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB0aGlzLndpZGdldC52YWx1ZSA9IG1ha2VEb2N1bWVudE9wdGlvbihzdG9yZS5kYXRhLmRvY3VtZW50c1tzdG9yZS5kYXRhLmFjdGl2ZURvY3VtZW50SURdLmlkZW50aWZ5LCBpbnN0YW5jZUtleSlcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgTGF5ZXJXaWRnZXRDdG9yT3B0aW9ucyB7XG4gICAgZXh0cmFPcHRpb25zOiBzdHJpbmdbXVxufVxuaW50ZXJmYWNlIExheWVyV2lkZ2V0V2l0aERvY3VtZW50U2VsZWN0aW9uQ3Rvck9wdGlvbnMgZXh0ZW5kcyBMYXllcldpZGdldEN0b3JPcHRpb25zIHtcbiAgICBkb2N1bWVudFdpZGdldEluTm9kZTogRG9jdW1lbnRXaWRnZXQgfCBudWxsLFxufVxuZXhwb3J0IGNsYXNzIExheWVyV2lkZ2V0IGV4dGVuZHMgU0RQUFBDb21ib1dpZGdldCB7XG4gICAgcHJvdGVjdGVkIGRvY3VtZW50V2lkZ2V0QnlMaW5rZWQ6IERvY3VtZW50V2lkZ2V0IHwgbnVsbCA9IG51bGw7XG4gICAgcHJvdGVjdGVkIGV4dHJhT3B0aW9uczogc3RyaW5nW107XG4gICAgY29uc3RydWN0b3Iobm9kZTogYW55LCBsYXllcldpZGdldDogYW55LCBvcHRpb25zOiBMYXllcldpZGdldEN0b3JPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG5vZGUsIGxheWVyV2lkZ2V0KTtcbiAgICAgICAgdGhpcy5leHRyYU9wdGlvbnMgPSBvcHRpb25zLmV4dHJhT3B0aW9ucztcbiAgICAgICAgdGhpcy51cGRhdGUgPSB0aGlzLnVwZGF0ZS5iaW5kKHRoaXMpO1xuXG4gICAgICAgIHRoaXMub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm5vZGUuc2V0UHJvcGVydHkoJ2xheWVyV2lkZ2V0RGV0YWlsJyArIHRoaXMuaW5kZXhJbk5vZGUsIHRoaXMuY3VycmVudE9wdGlvbnNEZXRhaWxbT2JqZWN0LnZhbHVlcyh0aGlzLmN1cnJlbnRPcHRpb25zKS5pbmRleE9mKHRoaXMud2lkZ2V0LnZhbHVlKV0pO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnKSB7IC8vIGlzIHN0cmluZ1xuICAgICAgICAgICAgICAgIHZhbHVlID0gU3BlaWNpYWxJRE1hbmFnZXIuZml4STE4bih2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIGxheWVyV2lkZ2V0LnNlcmlhbGl6ZVZhbHVlID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZG9jdW1lbnRXaWRnZXQgPSB0aGlzLmRvY3VtZW50V2lkZ2V0QnlMaW5rZWQ7XG4gICAgICAgICAgICBpZiAoIWRvY3VtZW50V2lkZ2V0KSByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIGlkZW50aWZ5OiBsYXllcldpZGdldC52YWx1ZSxcbiAgICAgICAgICAgICAgICBkaXJ0eUlEOiAwXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgZG9jdW1lbnQgPSBwYXJzZURvY3VtZW50T3B0aW9uKGRvY3VtZW50V2lkZ2V0LndpZGdldC52YWx1ZSk7XG4gICAgICAgICAgICBpZiAoIWRvY3VtZW50KSByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIGlkZW50aWZ5OiBsYXllcldpZGdldC52YWx1ZSxcbiAgICAgICAgICAgICAgICBkaXJ0eUlEOiAwXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbGV0IGlkZW50aWZ5ID0gbGF5ZXJXaWRnZXQudmFsdWU7XG4gICAgICAgICAgICBpZiAoU3BlaWNpYWxJRE1hbmFnZXIuaXNfU1BFQ0lBTF9MQVlFUl9TRUxFQ1RFRF9MQVlFUihpZGVudGlmeSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXQgPSBhd2FpdCBDb21meVNvY2tldC5pbnN0YW5jZS5nZXRTcGVjaWFsSWRlbnRpZmllclZhbHVlKGRvY3VtZW50Lmluc3RhbmNlX2lkLCB7XG4gICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXI6IGlkZW50aWZ5XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBpZGVudGlmeSA9IHJldC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBkaXJ0eUlEID0gMFxuICAgICAgICAgICAgaWYgKFNwZWljaWFsSURNYW5hZ2VyLmlzX1NQRUNJQUxfTEFZRVJfTkVXX0xBWUVSKGlkZW50aWZ5KSB8fCBTcGVpY2lhbElETWFuYWdlci5pc19TUEVDSUFMX0xBWUVSX1VTRV9DQU5WQVMoaWRlbnRpZnkpKSB7XG4gICAgICAgICAgICAgICAgZGlydHlJRCA9IFBob3Rvc2hvcFN0b3JlSGVscGVyLmdldENhbnZhc0RpcnR5SUQoZG9jdW1lbnQuZG9jdW1lbnREYXRhKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGlydHlJRCA9IFBob3Rvc2hvcFN0b3JlSGVscGVyLmdldExheWVyRGlydHlJRChkb2N1bWVudC5kb2N1bWVudERhdGEsIGlkZW50aWZ5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgaWRlbnRpZnksXG4gICAgICAgICAgICAgICAgZGlydHlJRFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgbGluayhub2RlOiBhbnksIHdpZGdldDogYW55LCBvcHRpb25zOiBMYXllcldpZGdldEN0b3JPcHRpb25zKSB7XG4gICAgICAgIGlmICh3aWRnZXQudHlwZSA9PSBcImNvbWJvXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTGF5ZXJXaWRnZXQobm9kZSwgd2lkZ2V0LCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsV2lkZ2V0ID0gTGF5ZXJXaWRnZXQuY3JlYXRlKG5vZGUsIHdpZGdldC5uYW1lLCBvcHRpb25zKTtcbiAgICAgICAgY29uc3Qgb2xkV2lkZ2V0SW5kZXggPSBub2RlLndpZGdldHMuaW5kZXhPZih3aWRnZXQpO1xuICAgICAgICBub2RlLndpZGdldHNbb2xkV2lkZ2V0SW5kZXhdID0gbm9kZS53aWRnZXRzLnBvcCgpO1xuICAgICAgICByZXR1cm4gbFdpZGdldDtcbiAgICB9XG5cbiAgICBwdWJsaWMgbGlua0RvY3VtZW50V2lkZ2V0KGRvY3VtZW50V2lkZ2V0OiBEb2N1bWVudFdpZGdldCB8IG51bGwpIHtcbiAgICAgICAgaWYgKHRoaXMuZG9jdW1lbnRXaWRnZXRCeUxpbmtlZCkge1xuICAgICAgICAgICAgZG9jdW1lbnRXaWRnZXQ/LnJlbW92ZU9uQ2hhbmdlKHRoaXMudXBkYXRlKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZG9jdW1lbnRXaWRnZXRCeUxpbmtlZCA9IGRvY3VtZW50V2lkZ2V0O1xuICAgICAgICBpZiAodGhpcy5kb2N1bWVudFdpZGdldEJ5TGlua2VkKSB7XG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50V2lkZ2V0QnlMaW5rZWQub25DaGFuZ2UodGhpcy51cGRhdGUpXG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIHVwZGF0ZSgpIHtcbiAgICAgICAgY29uc3QgZG9jdW1lbnRXaWRnZXQgPSB0aGlzLmRvY3VtZW50V2lkZ2V0QnlMaW5rZWQ7XG4gICAgICAgIHRoaXMudXBkYXRlT3B0aW9ucyhkb2N1bWVudFdpZGdldCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGN1cnJlbnRPcHRpb25zOiBzdHJpbmdbXSA9IFtdXG4gICAgcHJvdGVjdGVkIGN1cnJlbnRPcHRpb25zRGV0YWlsOiBMYXllckRhdGFbXSA9IFtdXG5cbiAgICBwcm90ZWN0ZWQgdXBkYXRlT3B0aW9ucyhkb2N1bWVudFdpZGdldDogRG9jdW1lbnRXaWRnZXQgfCBudWxsKSB7XG4gICAgICAgIHRoaXMuY3VycmVudE9wdGlvbnMgPSB0aGlzLmV4dHJhT3B0aW9ucy5zbGljZSgwKVxuICAgICAgICB0aGlzLmN1cnJlbnRPcHRpb25zRGV0YWlsID0gbmV3IEFycmF5KHRoaXMuY3VycmVudE9wdGlvbnMubGVuZ3RoKS5maWxsKHsgaWQ6IDAsIG5hbWU6ICcnLCBpZGVudGlmeTogJycsIGxldmVsOiAwLCBmdWxsUGF0aDogJycgfSk7XG5cbiAgICAgICAgaWYgKGRvY3VtZW50V2lkZ2V0ICYmIGRvY3VtZW50V2lkZ2V0LndpZGdldC52YWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgZG9jdW1lbnQgPSBwYXJzZURvY3VtZW50T3B0aW9uKGRvY3VtZW50V2lkZ2V0LndpZGdldC52YWx1ZSk7XG4gICAgICAgICAgICBpZiAoIWRvY3VtZW50KSByZXR1cm47XG4gICAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudERhdGEubGF5ZXJzLm1hcCgobGF5ZXI6IExheWVyRGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE9wdGlvbnMucHVzaChsYXllci5pZGVudGlmeSlcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRPcHRpb25zRGV0YWlsLnB1c2gobGF5ZXIpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndpZGdldC5vcHRpb25zLnZhbHVlcyA9IHRoaXMuY3VycmVudE9wdGlvbnM7XG4gICAgICAgIGlmIChPYmplY3QudmFsdWVzKHRoaXMuY3VycmVudE9wdGlvbnMpLmluZGV4T2YodGhpcy53aWRnZXQudmFsdWUpID09IC0xKSB7XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5EZXRhaWw6IExheWVyRGF0YSB8IG51bGwgPSB0aGlzLm5vZGUucHJvcGVydGllc1snbGF5ZXJXaWRnZXREZXRhaWwnICsgdGhpcy5pbmRleEluTm9kZV1cbiAgICAgICAgICAgIGlmIChvcmlnaW5EZXRhaWwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaW5kSW5kZXggPSB0aGlzLmN1cnJlbnRPcHRpb25zRGV0YWlsLmZpbmRJbmRleChpdGVtID0+IGl0ZW0uZnVsbFBhdGggPT0gb3JpZ2luRGV0YWlsLmZ1bGxQYXRoKVxuICAgICAgICAgICAgICAgIGlmIChmaW5kSW5kZXggIT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53aWRnZXQudmFsdWUgPSB0aGlzLmN1cnJlbnRPcHRpb25zW2ZpbmRJbmRleF1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIG9yIHNldCB0aGUgbm9kZSB0byByZWRcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBjcmVhdGUobm9kZTogYW55LCBuYW1lOiBJMThuS2V5LCBvcHRpb25zOiBMYXllcldpZGdldEN0b3JPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHNpemUgPSBub2RlLnNpemUuc2xpY2UoMCk7XG4gICAgICAgIGNvbnN0IGxheWVyV2lkZ2V0ID0gbm9kZS5hZGRXaWRnZXQoJ2NvbWJvJywgbmFtZSwgb3B0aW9ucy5leHRyYU9wdGlvbnNbMF0gfHwgJycsICgpID0+IHsgfSwgeyBmb3JjZUlucHV0OiB0cnVlLCB2YWx1ZXM6IG9wdGlvbnMuZXh0cmFPcHRpb25zIH0pXG5cbiAgICAgICAgbm9kZS5zaXplID0gW3NpemVbMF0sIE1hdGgubWF4KHNpemVbMV0sIG5vZGUuc2l6ZVsxXSldO1xuICAgICAgICByZXR1cm4gbmV3IExheWVyV2lkZ2V0KG5vZGUsIGxheWVyV2lkZ2V0LCB7XG4gICAgICAgICAgICBleHRyYU9wdGlvbnM6IG9wdGlvbnMuZXh0cmFPcHRpb25zXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmNvbnN0IGRlZmF1bHRMYXllcldpZGdldFdpdGhEb2N1bWVudFNlbGVjdGlvbk9wdGlvbnM6IExheWVyV2lkZ2V0V2l0aERvY3VtZW50U2VsZWN0aW9uQ3Rvck9wdGlvbnMgPSB7XG4gICAgZXh0cmFPcHRpb25zOiBbXSxcbiAgICBkb2N1bWVudFdpZGdldEluTm9kZTogbnVsbFxufVxuZXhwb3J0IGNsYXNzIExheWVyV2lkZ2V0V2l0aERvY3VtZW50U2VsZWN0aW9uIGV4dGVuZHMgTGF5ZXJXaWRnZXQge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZG9jdW1lbnRXaWRnZXRJbk5vZGU6IERvY3VtZW50V2lkZ2V0IHwgbnVsbDtcblxuICAgIGNvbnN0cnVjdG9yKG5vZGU6IGFueSwgbGF5ZXJXaWRnZXQ/OiBhbnksIG9wdGlvbnM6IExheWVyV2lkZ2V0V2l0aERvY3VtZW50U2VsZWN0aW9uQ3Rvck9wdGlvbnMgPSBkZWZhdWx0TGF5ZXJXaWRnZXRXaXRoRG9jdW1lbnRTZWxlY3Rpb25PcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG5vZGUsIGxheWVyV2lkZ2V0LCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5kb2N1bWVudFdpZGdldEluTm9kZSA9IG9wdGlvbnMuZG9jdW1lbnRXaWRnZXRJbk5vZGU7XG4gICAgICAgIHRoaXMub25DaGFuZ2UoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZG9jdW1lbnRXaWRnZXQgPSB0aGlzLmRvY3VtZW50V2lkZ2V0SW5Ob2RlIHx8IHRoaXMuZG9jdW1lbnRXaWRnZXRCeUxpbmtlZDtcbiAgICAgICAgICAgIGRvY3VtZW50V2lkZ2V0Py5zZWxlY3RDb25jcmV0ZURvY3VtZW50KCk7XG4gICAgICAgIH0pXG4gICAgICAgIGxheWVyV2lkZ2V0LnNlcmlhbGl6ZVZhbHVlID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZG9jdW1lbnRXaWRnZXQgPSB0aGlzLmRvY3VtZW50V2lkZ2V0SW5Ob2RlIHx8IHRoaXMuZG9jdW1lbnRXaWRnZXRCeUxpbmtlZDtcbiAgICAgICAgICAgIGlmICghZG9jdW1lbnRXaWRnZXQpIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgaWRlbnRpZnk6IGxheWVyV2lkZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICAgIGRpcnR5SUQ6IDBcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBkb2N1bWVudCA9IHBhcnNlRG9jdW1lbnRPcHRpb24oZG9jdW1lbnRXaWRnZXQud2lkZ2V0LnZhbHVlKTtcbiAgICAgICAgICAgIGlmICghZG9jdW1lbnQpIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgaWRlbnRpZnk6IGxheWVyV2lkZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICAgIGRpcnR5SUQ6IDBcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBsZXQgaWRlbnRpZnkgPSBsYXllcldpZGdldC52YWx1ZTtcbiAgICAgICAgICAgIGlmIChTcGVpY2lhbElETWFuYWdlci5pc19TUEVDSUFMX0xBWUVSX1NFTEVDVEVEX0xBWUVSKGlkZW50aWZ5KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJldCA9IGF3YWl0IENvbWZ5U29ja2V0Lmluc3RhbmNlLmdldFNwZWNpYWxJZGVudGlmaWVyVmFsdWUoZG9jdW1lbnQuaW5zdGFuY2VfaWQsIHtcbiAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcjogaWRlbnRpZnlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIGlkZW50aWZ5ID0gcmV0LnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGRpcnR5SUQgPSAwIFxuICAgICAgICAgICAgaWYgKFNwZWljaWFsSURNYW5hZ2VyLmlzX1NQRUNJQUxfTEFZRVJfTkVXX0xBWUVSKGlkZW50aWZ5KSB8fCBTcGVpY2lhbElETWFuYWdlci5pc19TUEVDSUFMX0xBWUVSX1VTRV9DQU5WQVMoaWRlbnRpZnkpKSB7XG4gICAgICAgICAgICAgICAgZGlydHlJRCA9IFBob3Rvc2hvcFN0b3JlSGVscGVyLmdldENhbnZhc0RpcnR5SUQoZG9jdW1lbnQuZG9jdW1lbnREYXRhKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGlydHlJRCA9IFBob3Rvc2hvcFN0b3JlSGVscGVyLmdldExheWVyRGlydHlJRChkb2N1bWVudC5kb2N1bWVudERhdGEsIGlkZW50aWZ5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgaWRlbnRpZnksXG4gICAgICAgICAgICAgICAgZGlydHlJRFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kb2N1bWVudFdpZGdldEluTm9kZT8ub25DaGFuZ2UodGhpcy51cGRhdGUpXG4gICAgfVxuICAgIHB1YmxpYyBvdmVycmlkZSB1cGRhdGUoKSB7XG4gICAgICAgIGNvbnN0IGRvY3VtZW50V2lkZ2V0ID0gdGhpcy5kb2N1bWVudFdpZGdldEluTm9kZSB8fCB0aGlzLmRvY3VtZW50V2lkZ2V0QnlMaW5rZWQ7XG4gICAgICAgIGlmIChkb2N1bWVudFdpZGdldD8ud2lkZ2V0LnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLndpZGdldC5vcHRpb25zLnZhbHVlcyA9IGdldExheWVyT3B0aW9uc0J5RG9jdW1lbnRWYWx1ZShkb2N1bWVudFdpZGdldC53aWRnZXQudmFsdWUsIHRoaXMuZXh0cmFPcHRpb25zKVxuICAgICAgICAgICAgd2lkZ2V0Q2hlY2tDb250YWluT3JSZXNldCh0aGlzLndpZGdldCwgdGhpcy53aWRnZXQub3B0aW9ucy52YWx1ZXMpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgY3JlYXRlKG5vZGU6IGFueSwgbmFtZTogSTE4bktleSwgb3B0aW9uczogTGF5ZXJXaWRnZXRXaXRoRG9jdW1lbnRTZWxlY3Rpb25DdG9yT3B0aW9ucykge1xuICAgICAgICBjb25zdCBzaXplID0gbm9kZS5zaXplLnNsaWNlKDApO1xuICAgICAgICBjb25zdCBsYXllcldpZGdldCA9IG5vZGUuYWRkV2lkZ2V0KCdjb21ibycsIG5hbWUsIG9wdGlvbnMuZXh0cmFPcHRpb25zWzBdIHx8ICcnLCAoKSA9PiB7IH0sIHsgZm9yY2VJbnB1dDogdHJ1ZSwgdmFsdWVzOiBvcHRpb25zLmV4dHJhT3B0aW9ucyB9KVxuICAgICAgICAvLyBsYXllcldpZGdldC5zZXJpYWxpemVWYWx1ZSA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gICAgIHRoaXMuZG9jdW1lbnRXaWRnZXRCeUxpbmtlZFxuICAgICAgICAvLyB9XG5cbiAgICAgICAgbm9kZS5zaXplID0gW3NpemVbMF0sIE1hdGgubWF4KHNpemVbMV0sIG5vZGUuc2l6ZVsxXSldO1xuICAgICAgICByZXR1cm4gbmV3IExheWVyV2lkZ2V0V2l0aERvY3VtZW50U2VsZWN0aW9uKG5vZGUsIGxheWVyV2lkZ2V0LCB7XG4gICAgICAgICAgICBkb2N1bWVudFdpZGdldEluTm9kZTogb3B0aW9ucy5kb2N1bWVudFdpZGdldEluTm9kZSxcbiAgICAgICAgICAgIGV4dHJhT3B0aW9uczogb3B0aW9ucy5leHRyYU9wdGlvbnNcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBCb3VuZGFyeVdpZGdldEN0b3JPcHRpb25zIHtcbiAgICBleHRyYU9wdGlvbnM6IHN0cmluZ1tdXG59XG5cbmxldCBsYXN0RG93bmxvYWRUaW1lID0gMDtcbmRlY2xhcmUgY29uc3QgYXBwOiBhbnk7XG5leHBvcnQgY2xhc3MgRG93bmxvYWRXaWRnZXQgZXh0ZW5kcyBTRFBQUFdpZGdldCB7XG4gICAgY29uc3RydWN0b3Iobm9kZTogYW55LCB3aWRnZXQ/OiBhbnkpIHtcbiAgICAgICAgaWYgKCF3aWRnZXQpIHtcbiAgICAgICAgICAgIGNvbnN0IHNpemUgPSBub2RlLnNpemUuc2xpY2UoMCk7XG4gICAgICAgICAgICB3aWRnZXQgPSBub2RlLmFkZFdpZGdldCgnYnV0dG9uJywgJ3NkcHBwJywgJycsICgpID0+IHsgfSlcbiAgICAgICAgICAgIG5vZGUuc2l6ZSA9IFtcbiAgICAgICAgICAgICAgICBzaXplWzBdLFxuICAgICAgICAgICAgICAgIE1hdGgubWF4KHNpemVbMV0sIG5vZGUuc2l6ZVsxXSlcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICB3aWRnZXQuc2VyaWFsaXplVmFsdWUgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmV0OiBhbnkgPSB7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RPcGVuZWRXb3JrZmxvdzogc2ltcGxpZnlXb3JrZmxvd1BhdGgocGFnZVN0b3JlLmRhdGEud2lkZ2V0VGFibGVTdHJ1Y3R1cmUud2lkZ2V0VGFibGVQYXRoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBkb2N1bWVudE5vZGUgPSBmaW5kRG9jdW1lbnROb2RlUmVjdXJzaXZlKG5vZGUpO1xuICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudE5vZGU/LndpZGdldHNbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gYXdhaXQgZG9jdW1lbnROb2RlLndpZGdldHNbMF0uc2VyaWFsaXplVmFsdWUoKTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldC5kb2N1bWVudCA9IEpTT04ucGFyc2UodmFsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldC5pc0xvY2FsID0gcGFnZVBob3Rvc2hvcFN0b3JlTWFwLmdldFN0b3JlKHJldC5kb2N1bWVudC5pbnN0YW5jZV9pZCk/LmRhdGEuaXNMb2NhbCB8fCBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShyZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN1cGVyKG5vZGUsIHdpZGdldCk7XG4gICAgICAgIHRoaXMub25DaGFuZ2UoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHBhZ2VQaG90b3Nob3BTdG9yZU1hcC5zdG9yZUNvdW50KCkgPT0gMCAmJiBEYXRlLm5vdygpIC0gbGFzdERvd25sb2FkVGltZSA+IDMwMDApIHtcbiAgICAgICAgICAgICAgICBsYXN0RG93bmxvYWRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICBsb2NhdGlvbi5ocmVmID0gXCIvc2QtcHBwLXN0YXRpYy9zZC1wcHBfUFMuY2N4P189XCIgKyBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgIC8vIGNvbWZ5IGFwcFxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhcHAudWkuZGlhbG9nLnNob3coYDxoMiBcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiY29sb3I6IHZhcigtLWZnLWNvbG9yKTtcIj4ke2kxOG4oJ0hvdyB0byB1c2UgLmNjeCBmaWxlJyl9PC9oMj48aDQgXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImNvbG9yOiB2YXIoLS1mZy1jb2xvcik7XCI+JHtpMThuKCcxLiBJZiB5b3UgaGF2ZSBpbnN0YWxsZWQgQWRvYmUgQ3JlYXRpdmUgQ2xvdWQnKX08L2g0PjxwIFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJjb2xvcjogdmFyKC0tZmctY29sb3IpO1wiPiR7aTE4bignSnVzdCBkb3VibGUgY2xpY2sgdGhlIC5jY3ggZmlsZSwgaXQgd2lsbCBpbnN0YWxsIHRoZSBwbHVnaW4gYXV0b21hdGljYWxseScpfTwvcD48aDQgXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImNvbG9yOiB2YXIoLS1mZy1jb2xvcik7XCI+JHtpMThuKFwiMi4gSWYgeW91IGRvbid0IGhhdmUgQWRvYmUgQ3JlYXRpdmUgQ2xvdWRcIil9PC9oND48cCBcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiY29sb3I6IHZhcigtLWZnLWNvbG9yKTtcIj4ke2kxOG4oJ1JlbmFtZSAuY2N4IHRvIC56aXAgYW5kIGV4dHJhY3QgaXQgaW50byAnKX08aT5bJHtpMThuKCdQaG90b3Nob3AgZGlyZWN0b3J5Jyl9XS9QbHVnLWluczwvaT4gJHtpMThuKCdvcicpfSA8aT5bJHtpMThuKCdQaG90b3Nob3AgZGlyZWN0b3J5Jyl9XS9QbHVnLWlucy9HZW5lcmF0b3I8L2k+PC9wPjxpbWcgXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD00MDAgc3JjPVwiL3NkLXBwcC1zdGF0aWMvY2N4LWhlbHAucG5nXCIvPlxuICAgICAgICAgICAgICAgICAgICBgKVxuICAgICAgICAgICAgICAgIH0sIDMwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgdXBkYXRlKCkge1xuICAgICAgICB0aGlzLndpZGdldC5sYWJlbCA9IHBhZ2VQaG90b3Nob3BTdG9yZU1hcC5zdG9yZUNvdW50KCkgPiAwICYmIENvbWZ5U29ja2V0Lmluc3RhbmNlLmlkID9cbiAgICAgICAgICAgIGkxOG4oJ2N1cnJlbnQgQ29tZnlVSSBwYWdlaWQ6IHswfScsIENvbWZ5U29ja2V0Lmluc3RhbmNlLmlkLnNsaWNlKDAsIDQpKSA6XG4gICAgICAgICAgICBpMThuKCdkb3dubG9hZCBQUyBwbHVnaW4gKC5jY3gpJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkb2N1bWVudFdpZGdldEJ5TGlua2VkOiBEb2N1bWVudFdpZGdldCB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyBsaW5rRG9jdW1lbnRXaWRnZXQoZG9jdW1lbnRXaWRnZXQ6IERvY3VtZW50V2lkZ2V0IHwgbnVsbCkge1xuICAgICAgICB0aGlzLmRvY3VtZW50V2lkZ2V0QnlMaW5rZWQgPSBkb2N1bWVudFdpZGdldDtcbiAgICB9XG59XG5cblxuXG5leHBvcnQgZnVuY3Rpb24gd2lkZ2V0Q2hlY2tDb250YWluT3JSZXNldCh3aWRnZXQ6IGFueSwgb3B0aW9uczogc3RyaW5nW10gfCAoKCkgPT4gc3RyaW5nW10pLCByZXNldElmTm90Q29udGFpbjogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBGdW5jdGlvbikgb3B0aW9ucyA9IG9wdGlvbnMoKTtcbiAgICBpZiAoIXdpZGdldC52YWx1ZSkgd2lkZ2V0LnZhbHVlID0gb3B0aW9uc1swXTtcbiAgICBpZiAob3B0aW9ucy5pbmRleE9mKHdpZGdldC52YWx1ZSkgPT0gLTEpIHtcbiAgICAgICAgaWYgKHJlc2V0SWZOb3RDb250YWluKSB3aWRnZXQudmFsdWUgPSBvcHRpb25zWzBdO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBfX0dMT0JBTF9BUElfTEVWRUxfXyB9IGZyb20gXCIuLi8uLi8uLi8uLi9zcmMvY29tbW9uL3ZlcnNpb24ubXRzXCI7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTRFBQUE5vZGUge1xuICAgIHN0YXRpYyBub2RlTWFwOiBXZWFrTWFwPGFueSwgU0RQUFBOb2RlPiA9IG5ldyBXZWFrTWFwKCk7XG4gICAgc3RhdGljIHJlZ2lzdGVyTm9kZVR5cGUobm9kZVR5cGU6IGFueSwgbm9kZURhdGE6IGFueSwgU0RQUFBOb2RlQ2xhc3M6IG5ldyAobm9kZTogYW55KSA9PiBTRFBQUE5vZGUpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAoU0RQUFBOb2RlQ2xhc3MucHJlaGFuZGxlTm9kZVR5cGUpIFNEUFBQTm9kZUNsYXNzLnByZWhhbmRsZU5vZGVUeXBlKG5vZGVUeXBlLm5vZGVEYXRhIHx8IG5vZGVEYXRhKTtcbiAgICAgICAgY29uc3Qgb25BZGRlZCA9IG5vZGVUeXBlLnByb3RvdHlwZS5vbkFkZGVkO1xuICAgICAgICBjb25zdCBvblJlbW92ZWQgPSBub2RlVHlwZS5wcm90b3R5cGUub25SZW1vdmVkO1xuXG4gICAgICAgIG5vZGVUeXBlLnByb3RvdHlwZS5vbkFkZGVkID0gYXN5bmMgZnVuY3Rpb24gKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICAgICAgICBpZiAob25BZGRlZCkgYXdhaXQgb25BZGRlZC5jYWxsKHRoaXMsIC4uLmFyZ3MpO1xuICAgICAgICAgICAgY29uc3Qgc2RwcHBOb2RlID0gbmV3IFNEUFBQTm9kZUNsYXNzKHRoaXMpO1xuICAgICAgICAgICAgU0RQUFBOb2RlLm5vZGVNYXAuc2V0KHRoaXMsIHNkcHBwTm9kZSk7XG4gICAgICAgICAgICBhd2FpdCBzZHBwcE5vZGUudXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZVR5cGUucHJvdG90eXBlLm9uUmVtb3ZlZCA9IGFzeW5jIGZ1bmN0aW9uICguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICAgICAgaWYgKG9uUmVtb3ZlZCkgYXdhaXQgb25SZW1vdmVkLmNhbGwodGhpcywgLi4uYXJncyk7XG4gICAgICAgICAgICBjb25zdCBzZHBwcE5vZGUgPSBTRFBQUE5vZGUubm9kZU1hcC5nZXQodGhpcyk7XG4gICAgICAgICAgICBTRFBQUE5vZGUubm9kZU1hcC5kZWxldGUodGhpcyk7XG4gICAgICAgICAgICBzZHBwcE5vZGU/Lm9uRGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIG5vZGVUeXBlLnByb3RvdHlwZS5vbkRyYXdGb3JlZ3JvdW5kID0gYXN5bmMgZnVuY3Rpb24gKGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKSB7XG4gICAgICAgICAgICBjb25zdCBzZHBwcE5vZGUgPSBTRFBQUE5vZGUubm9kZU1hcC5nZXQodGhpcyk7XG4gICAgICAgICAgICBzZHBwcE5vZGU/Lm9uRHJhd0ZvcmVncm91bmQoY3R4KTtcbiAgICAgICAgICAgIGF3YWl0IHNkcHBwTm9kZT8udXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZVR5cGUucHJvdG90eXBlLm9uQ29uZmlndXJlID0gYXN5bmMgZnVuY3Rpb24gKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICAgICAgICBjb25zdCBzZHBwcE5vZGUgPSBTRFBQUE5vZGUubm9kZU1hcC5nZXQodGhpcyk7XG4gICAgICAgICAgICBzZHBwcE5vZGU/Lm9uQ29uZmlndXJlKGFyZ3NbMF0pO1xuICAgICAgICAgICAgYXdhaXQgc2RwcHBOb2RlPy51cGRhdGUoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvbkNvbm5lY3Rpb25zQ2hhbmdlID0gbm9kZVR5cGUucHJvdG90eXBlLm9uQ29ubmVjdGlvbnNDaGFuZ2U7XG4gICAgICAgIG5vZGVUeXBlLnByb3RvdHlwZS5vbkNvbm5lY3Rpb25zQ2hhbmdlID0gYXN5bmMgZnVuY3Rpb24gKHR5cGU6IG51bWJlciwgaW5kZXg6IG51bWJlciwgY29ubmVjdGVkOiBib29sZWFuLCBsaW5rSW5mbzogYW55KSB7XG4gICAgICAgICAgICBjb25zdCBzZHBwcE5vZGUgPSBTRFBQUE5vZGUubm9kZU1hcC5nZXQodGhpcyk7XG4gICAgICAgICAgICBpZiAodHlwZSA9PSAxKSB7XG4gICAgICAgICAgICAgICAgc2RwcHBOb2RlPy5pbnB1dENvbm5lY3Rpb25DaGFuZ2UoaW5kZXgsIGNvbm5lY3RlZCAmJiBsaW5rSW5mbyk7XG4gICAgICAgICAgICAgICAgYXdhaXQgc2RwcHBOb2RlPy51cGRhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlID09IDIpIHtcbiAgICAgICAgICAgICAgICBzZHBwcE5vZGU/Lm91dHB1dENvbm5lY3Rpb25DaGFuZ2UoaW5kZXgsIGNvbm5lY3RlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb25Db25uZWN0aW9uc0NoYW5nZT8uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBub2RlOiBhbnk7XG4gICAgY29uc3RydWN0b3Iobm9kZTogYW55KSB7IHRoaXMubm9kZSA9IG5vZGU7IH1cbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgdXBkYXRlKCk6IFByb21pc2U8dm9pZD47XG4gICAgcHJvdGVjdGVkIGlucHV0Q29ubmVjdGlvbkNoYW5nZShpbmRleDogbnVtYmVyLCBjb25uZWN0ZWQ6IGJvb2xlYW4pIHsgfVxuICAgIHByb3RlY3RlZCBvdXRwdXRDb25uZWN0aW9uQ2hhbmdlKGluZGV4OiBudW1iZXIsIGNvbm5lY3RlZDogYm9vbGVhbikgeyB9XG4gICAgcHJvdGVjdGVkIG9uRHJhd0ZvcmVncm91bmQoY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQpIHsgfVxuICAgIHByb3RlY3RlZCBvbkRlc3Ryb3koKSB7IH1cbiAgICBwcm90ZWN0ZWQgb25Db25maWd1cmUobm9kZURhdGE6IGFueSkge1xuICAgICAgICB0aGlzLm5vZGUuc2V0UHJvcGVydHkoJ3NkcHBwLXZlcnNpb24nLCBfX0dMT0JBTF9BUElfTEVWRUxfXyk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IGlzUGhvdG9zaG9wQ29ubmVjdGVkIH0gZnJvbSBcIi4uL3V0aWwubXRzXCI7XG5pbXBvcnQgeyBEb3dubG9hZFdpZGdldCB9IGZyb20gXCIuLi9saXRlZ3JhcGgvZmUtd2lkZ2V0cy5tanNcIjtcbmltcG9ydCB7IFNEUFBQTm9kZSB9IGZyb20gXCIuL1NEUFBQTm9kZS5tanNcIjtcbmltcG9ydCBpMThuIGZyb20gXCIuLi8uLi8uLi8uLi9zcmMvY29tbW9uL2kxOG4ubXRzXCI7XG5cbmV4cG9ydCBjbGFzcyBTRFBQUERvd25sb2FkYWJsZU5vZGUgZXh0ZW5kcyBTRFBQUE5vZGUge1xuXG4gICAgcHJvdGVjdGVkIGRvd25sb2FkV2lkZ2V0OiBhbnk7XG4gICAgY29uc3RydWN0b3Iobm9kZTogYW55KSB7XG4gICAgICAgIHN1cGVyKG5vZGUpO1xuICAgICAgICBpZiAoIXRoaXMuZG93bmxvYWRXaWRnZXQpXG4gICAgICAgICAgICB0aGlzLmRvd25sb2FkV2lkZ2V0ID0gbmV3IERvd25sb2FkV2lkZ2V0KHRoaXMubm9kZSk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBvbkNvbmZpZ3VyZShub2RlRGF0YTogYW55KTogdm9pZCB7XG4gICAgICAgIHN1cGVyLm9uQ29uZmlndXJlKG5vZGVEYXRhKTtcbiAgICB9XG4gICAgb25EcmF3Rm9yZWdyb3VuZChjdHg6IGFueSkge1xuICAgICAgICBpZiAodGhpcy5ub2RlLmZsYWdzLmNvbGxhcHNlZCkgcmV0dXJuO1xuXG4gICAgICAgIGlmICghaXNQaG90b3Nob3BDb25uZWN0ZWQoKSkge1xuICAgICAgICAgICAgY3R4LnNhdmUoKTtcbiAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBcInJnYmEoMjU1LCAwLCAwLCAwLjIpXCI7XG4gICAgICAgICAgICBjdHguZmlsbFJlY3QoMCwgMCwgdGhpcy5ub2RlLnNpemVbMF0sIHRoaXMubm9kZS5zaXplWzFdKTtcbiAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBcIndoaXRlXCI7XG4gICAgICAgICAgICBjdHgudGV4dEFsaWduID0gXCJjZW50ZXJcIlxuICAgICAgICAgICAgY3R4LmZpbGxUZXh0KGkxOG4oXCJQaG90b3Nob3AgRGlzY29ubmVjdGVkIVwiKSwgdGhpcy5ub2RlLnNpemVbMF0gLyAyLCA1KTtcbiAgICAgICAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgdXBkYXRlKCkge1xuICAgICAgICB0aGlzLmRvd25sb2FkV2lkZ2V0Py51cGRhdGUoKTtcbiAgICB9XG59IiwgImltcG9ydCB7IERvY3VtZW50V2lkZ2V0IH0gZnJvbSBcIi4uL2xpdGVncmFwaC9mZS13aWRnZXRzLm1qc1wiO1xuaW1wb3J0IHsgU0RQUFBOb2RlIH0gZnJvbSBcIi4vU0RQUFBOb2RlLm1qc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5vZGVXaXRoRG9jdW1lbnRPdXRwdXQge1xuICAgIGRvY3VtZW50V2lkZ2V0OiBEb2N1bWVudFdpZGdldCB8IG51bGw7XG59XG5leHBvcnQgaW50ZXJmYWNlIE5vZGVXaXRoTGF5ZXJPdXRwdXQgZXh0ZW5kcyBOb2RlV2l0aERvY3VtZW50T3V0cHV0IHtcbn1cbmV4cG9ydCBjbGFzcyBTRFBQUElucHV0IHtcbiAgICBwcm90ZWN0ZWQgbm9kZTogYW55XG4gICAgcHJvdGVjdGVkIGlucHV0SW5kZXg6IG51bWJlclxuICAgIHB1YmxpYyBnZXQgaW5kZXgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlucHV0SW5kZXhcbiAgICB9XG4gICAgY29uc3RydWN0b3Iobm9kZTogYW55LCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMubm9kZSA9IG5vZGU7XG4gICAgICAgIHRoaXMuaW5wdXRJbmRleCA9IGluZGV4O1xuICAgIH1cbiAgICBwdWJsaWMgdXBkYXRlKCkge1xuICAgICAgICAvLyB0aGlzLm5vZGUuaW5wdXRzW3RoaXMuaW5wdXRJbmRleF0ubGFiZWwgPSBpMThuKHRoaXMubm9kZS5pbnB1dHNbdGhpcy5pbnB1dEluZGV4XS5uYW1lKVxuICAgIH1cblxuICAgIHB1YmxpYyBjb25uZWN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbn1cbmV4cG9ydCBjbGFzcyBEb2N1bWVudElucHV0IGV4dGVuZHMgU0RQUFBJbnB1dCB7XG4gICAgZ2V0IGRvY3VtZW50V2lkZ2V0KCkge1xuICAgICAgICBjb25zdCBub2RlV2l0aERvY3VtZW50T3V0cHV0ID0gZmluZFNvdXJjZU5vZGVCeUlucHV0PE5vZGVXaXRoRG9jdW1lbnRPdXRwdXQ+KHRoaXMubm9kZSwgdGhpcy5ub2RlLmlucHV0c1t0aGlzLmlucHV0SW5kZXhdKVxuICAgICAgICByZXR1cm4gbm9kZVdpdGhEb2N1bWVudE91dHB1dD8uZG9jdW1lbnRXaWRnZXQgfHwgbnVsbDtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgTGF5ZXJJbnB1dCBleHRlbmRzIFNEUFBQSW5wdXQge1xuICAgIGdldCBkb2N1bWVudFdpZGdldCgpIHtcbiAgICAgICAgY29uc3Qgbm9kZVdpdGhMYXllck91dHB1dCA9IGZpbmRTb3VyY2VOb2RlQnlJbnB1dDxOb2RlV2l0aExheWVyT3V0cHV0Pih0aGlzLm5vZGUsIHRoaXMubm9kZS5pbnB1dHNbdGhpcy5pbnB1dEluZGV4XSlcbiAgICAgICAgcmV0dXJuIG5vZGVXaXRoTGF5ZXJPdXRwdXQ/LmRvY3VtZW50V2lkZ2V0IHx8IG51bGw7XG4gICAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kU291cmNlTm9kZUJ5SW5wdXQ8VD4obm9kZTogYW55LCBpbnB1dDogYW55KTogVCB8IG51bGwge1xuICAgIGlmICghbm9kZS5ncmFwaC5saW5rc1tpbnB1dC5saW5rXSkgcmV0dXJuIG51bGw7XG4gICAgbGV0IGZyb21Ob2RlSUQgPSBub2RlLmdyYXBoLmxpbmtzW2lucHV0LmxpbmtdLm9yaWdpbl9pZDtcbiAgICBsZXQgZnJvbU5vZGUgPSBub2RlLmdyYXBoLmdldE5vZGVCeUlkKGZyb21Ob2RlSUQpO1xuICAgIHdoaWxlIChmcm9tTm9kZS50eXBlID09ICdSZXJvdXRlJykge1xuICAgICAgICBmcm9tTm9kZUlEID0gbm9kZS5ncmFwaC5saW5rc1tmcm9tTm9kZS5pbnB1dHNbMF0ubGlua10ub3JpZ2luX2lkO1xuICAgICAgICBmcm9tTm9kZSA9IG5vZGUuZ3JhcGguZ2V0Tm9kZUJ5SWQoZnJvbU5vZGVJRCk7XG4gICAgfVxuICAgIHJldHVybiBTRFBQUE5vZGUubm9kZU1hcC5nZXQoZnJvbU5vZGUpIGFzIFRcbn1cbiIsICJpbXBvcnQgaTE4biBmcm9tIFwiLi4vLi4vLi4vLi4vc3JjL2NvbW1vbi9pMThuLm10c1wiO1xuaW1wb3J0IHsgU3BlaWNpYWxJRE1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vLi4vLi4vc3JjL2NvbW1vbi9waG90b3Nob3Avc3BlY2lhbExheWVyLm10c1wiO1xuaW1wb3J0IHsgRG9jdW1lbnRXaWRnZXQsIERvd25sb2FkV2lkZ2V0LCBMYXllcldpZGdldCwgU0RQUFBXaWRnZXQgfSBmcm9tIFwiLi4vbGl0ZWdyYXBoL2ZlLXdpZGdldHMubWpzXCI7XG5pbXBvcnQgeyBEb2N1bWVudElucHV0LCBMYXllcklucHV0LCBTRFBQUElucHV0IH0gZnJvbSBcIi4vSW5wdXRzLm1qc1wiO1xuaW1wb3J0IHsgU0RQUFBEb3dubG9hZGFibGVOb2RlIH0gZnJvbSBcIi4vU0RQUFBEb3dubG9hZGFibGVOb2RlLm1qc1wiO1xuXG5leHBvcnQgY2xhc3MgU0RQUFBOb2RlV2l0aElucHV0IGV4dGVuZHMgU0RQUFBEb3dubG9hZGFibGVOb2RlIHtcbiAgICBnZXQgZG9jdW1lbnRXaWRnZXQoKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0Q29ubmVjdGVkSW5wdXQgPSB0aGlzLmlucHV0cy5maW5kKGlucHV0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dC5jb25uZWN0ZWQgJiYgKFxuICAgICAgICAgICAgICAgIGlucHV0IGluc3RhbmNlb2YgRG9jdW1lbnRJbnB1dCB8fFxuICAgICAgICAgICAgICAgIGlucHV0IGluc3RhbmNlb2YgTGF5ZXJJbnB1dFxuICAgICAgICAgICAgKVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGZpcnN0Q29ubmVjdGVkSW5wdXQpIHJldHVybiAoZmlyc3RDb25uZWN0ZWRJbnB1dCBhcyBhbnkpLmRvY3VtZW50V2lkZ2V0O1xuICAgICAgICByZXR1cm4gdGhpcy5zZHBwcFdpZGdldHMuZmluZCh3aWRnZXQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHdpZGdldCBpbnN0YW5jZW9mIERvY3VtZW50V2lkZ2V0XG4gICAgICAgIH0pIGFzIERvY3VtZW50V2lkZ2V0O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpbnB1dHM6IFNEUFBQSW5wdXRbXSA9IFtdO1xuICAgIHByb3RlY3RlZCBzZHBwcFdpZGdldHM6IFNEUFBQV2lkZ2V0W10gPSBbXTtcbiAgICBjb25zdHJ1Y3Rvcihub2RlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIobm9kZSk7XG4gICAgICAgIGxldCBmaXJzdERvY3VtZW50V2lkZ2V0OiBEb2N1bWVudFdpZGdldCB8IG51bGwgPSBudWxsO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubm9kZS53aWRnZXRzPy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMubm9kZS53aWRnZXRzW2ldLm5hbWVcbiAgICAgICAgICAgIGlmICghbmFtZSB8fCBuYW1lID09IFwic2RwcHBcIikgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCBpbnB1dERhdGEgPSB0aGlzLm5vZGUuY29uc3RydWN0b3Iubm9kZURhdGEuaW5wdXQucmVxdWlyZWRbbmFtZV0gfHwgdGhpcy5ub2RlLmNvbnN0cnVjdG9yLm5vZGVEYXRhLmlucHV0Lm9wdGlvbmFsW25hbWVdO1xuICAgICAgICAgICAgaWYgKCFpbnB1dERhdGEpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGlucHV0RGF0YVsxXS5zZHBwcF90eXBlID09ICdET0NVTUVOVF9uYW1laWQnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZFdpZGdldCA9IERvY3VtZW50V2lkZ2V0Lmxpbmsobm9kZSwgdGhpcy5ub2RlLndpZGdldHNbaV0pXG4gICAgICAgICAgICAgICAgZmlyc3REb2N1bWVudFdpZGdldCA9IGZpcnN0RG9jdW1lbnRXaWRnZXQgfHwgZFdpZGdldFxuICAgICAgICAgICAgICAgIHRoaXMuc2RwcHBXaWRnZXRzLnB1c2goZFdpZGdldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5wdXREYXRhWzFdLnNkcHBwX3R5cGUgPT0gJ0xBWUVSX3NlbGVjdCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsV2lkZ2V0ID0gTGF5ZXJXaWRnZXQubGluayhub2RlLCB0aGlzLm5vZGUud2lkZ2V0c1tpXSwge1xuICAgICAgICAgICAgICAgICAgICBleHRyYU9wdGlvbnM6IFNwZWljaWFsSURNYW5hZ2VyLmdldFNwZWNpYWxMYXllckZvckdldCgpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB0aGlzLnNkcHBwV2lkZ2V0cy5wdXNoKGxXaWRnZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ub2RlLmlucHV0cz8ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLm5vZGUuaW5wdXRzW2ldLm5hbWVcbiAgICAgICAgICAgIGNvbnN0IGlucHV0RGF0YSA9IHRoaXMubm9kZS5jb25zdHJ1Y3Rvci5ub2RlRGF0YS5pbnB1dC5yZXF1aXJlZFtuYW1lXSB8fCB0aGlzLm5vZGUuY29uc3RydWN0b3Iubm9kZURhdGEuaW5wdXQub3B0aW9uYWxbbmFtZV07XG4gICAgICAgICAgICBpZiAoaW5wdXREYXRhWzFdLnNkcHBwX3R5cGUgPT0gJ0RPQ1VNRU5UJykge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRzLnB1c2gobmV3IERvY3VtZW50SW5wdXQobm9kZSwgaSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlucHV0RGF0YVsxXS5zZHBwcF90eXBlID09ICdMQVlFUicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0cy5wdXNoKG5ldyBMYXllcklucHV0KG5vZGUsIGkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyB1cGRhdGUoKSB7XG4gICAgICAgIHRoaXMubm9kZS53aWRnZXRzPy5mb3JFYWNoKCh3aWRnZXQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHdpZGdldC5sYWJlbCkgcmV0dXJuO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB3aWRnZXQubGFiZWwgPSBpMThuKHdpZGdldC5uYW1lKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB3aWRnZXQubGFiZWwgPSB3aWRnZXQubmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2RwcHBXaWRnZXRzPy5mb3JFYWNoKHdpZGdldCA9PiB7XG4gICAgICAgICAgICB3aWRnZXQudXBkYXRlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmlucHV0cz8uZm9yRWFjaChpbnB1dCA9PiB7XG4gICAgICAgICAgICBpbnB1dC51cGRhdGUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN1cGVyLnVwZGF0ZSgpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgaW5wdXRDb25uZWN0aW9uQ2hhbmdlKGluZGV4OiBudW1iZXIsIGNvbm5lY3RlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBzdXBlci5pbnB1dENvbm5lY3Rpb25DaGFuZ2UoaW5kZXgsIGNvbm5lY3RlZCk7XG4gICAgICAgIHRoaXMuaW5wdXRzLmZvckVhY2goc2RwcHBJbnB1dCA9PiB7XG4gICAgICAgICAgICBpZiAoc2RwcHBJbnB1dC5pbmRleCA9PSBpbmRleCkge1xuICAgICAgICAgICAgICAgIHNkcHBwSW5wdXQuY29ubmVjdGVkID0gY29ubmVjdGVkO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0RvY3VtZW50V2lkZ2V0ID0gdGhpcy5kb2N1bWVudFdpZGdldDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kb3dubG9hZFdpZGdldCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvd25sb2FkV2lkZ2V0LmxpbmtEb2N1bWVudFdpZGdldChuZXdEb2N1bWVudFdpZGdldCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc2RwcHBXaWRnZXRzLmZvckVhY2god2lkZ2V0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdpZGdldCBpbnN0YW5jZW9mIExheWVyV2lkZ2V0IHx8IHdpZGdldCBpbnN0YW5jZW9mIERvd25sb2FkV2lkZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aWRnZXQubGlua0RvY3VtZW50V2lkZ2V0KG5ld0RvY3VtZW50V2lkZ2V0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBDb21meVNvY2tldCB9IGZyb20gXCIuLi9zb2NrZXQvQ29tZnlTb2NrZXQubWpzXCI7XG5pbXBvcnQgeyBEb2N1bWVudFdpZGdldCwgTGF5ZXJXaWRnZXQgfSBmcm9tIFwiLi4vbGl0ZWdyYXBoL2ZlLXdpZGdldHMubWpzXCI7XG5pbXBvcnQgeyBEb2N1bWVudElucHV0LCBOb2RlV2l0aERvY3VtZW50T3V0cHV0LCBOb2RlV2l0aExheWVyT3V0cHV0IH0gZnJvbSBcIi4vSW5wdXRzLm1qc1wiO1xuaW1wb3J0IHsgU0RQUFBEb3dubG9hZGFibGVOb2RlIH0gZnJvbSBcIi4vU0RQUFBEb3dubG9hZGFibGVOb2RlLm1qc1wiO1xuaW1wb3J0IHsgU0RQUFBOb2RlV2l0aElucHV0IH0gZnJvbSBcIi4vU0RQUFBOb2RlV2l0aElucHV0Lm1qc1wiO1xuaW1wb3J0IGkxOG4gZnJvbSBcIi4uLy4uLy4uLy4uL3NyYy9jb21tb24vaTE4bi5tdHNcIjtcbmltcG9ydCB7IHBhZ2VQaG90b3Nob3BTdG9yZU1hcCwgcGFnZVN0b3JlIH0gZnJvbSBcInBob3Rvc2hvcE1vZGVscy5tanNcIjtcblxuZXhwb3J0IGNsYXNzIEdldExheWVyTm9kZSBleHRlbmRzIFNEUFBQTm9kZVdpdGhJbnB1dCBpbXBsZW1lbnRzIE5vZGVXaXRoTGF5ZXJPdXRwdXQge1xuICAgIGdldCBkb2N1bWVudFdpZGdldCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmlucHV0c1swXSBhcyBEb2N1bWVudElucHV0KT8uZG9jdW1lbnRXaWRnZXQ7XG4gICAgfVxuXG4gICAgYXN5bmMgdXBkYXRlKCkge1xuICAgICAgICBzdXBlci51cGRhdGUoKTtcbiAgICAgICAgdGhpcy5ub2RlLmlucHV0cy5mb3JFYWNoKChpOiBhbnkpID0+IGkubGFiZWwgPSBpMThuKGkubmFtZSkpO1xuICAgICAgICB0aGlzLm5vZGUub3V0cHV0cy5mb3JFYWNoKChpOiBhbnkpID0+IGkubGFiZWwgPSBpMThuKGkubmFtZSkpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBHZXRTZWxlY3Rpb25Ob2RlIGV4dGVuZHMgU0RQUFBOb2RlV2l0aElucHV0IHtcbiAgICBhc3luYyB1cGRhdGUoKSB7XG4gICAgICAgIHN1cGVyLnVwZGF0ZSgpO1xuICAgICAgICB0aGlzLm5vZGUuaW5wdXRzLmZvckVhY2goKGk6IGFueSkgPT4gaS5sYWJlbCA9IGkxOG4oaS5uYW1lKSk7XG4gICAgICAgIHRoaXMubm9kZS5vdXRwdXRzLmZvckVhY2goKGk6IGFueSkgPT4gaS5sYWJlbCA9IGkxOG4oaS5uYW1lKSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFBhcnNlTGF5ZXJJbmZvTm9kZSBleHRlbmRzIFNEUFBQTm9kZVdpdGhJbnB1dCB7XG4gICAgYXN5bmMgdXBkYXRlKCkge1xuICAgICAgICBzdXBlci51cGRhdGUoKTtcbiAgICAgICAgdGhpcy5ub2RlLmlucHV0cy5mb3JFYWNoKChpOiBhbnkpID0+IGkubGFiZWwgPSBpMThuKGkubmFtZSkpO1xuICAgICAgICB0aGlzLm5vZGUub3V0cHV0cy5mb3JFYWNoKChpOiBhbnkpID0+IGkubGFiZWwgPSBpMThuKGkubmFtZSkpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBHZXRMYXllcnNJbkdyb3VwTm9kZSBleHRlbmRzIFNEUFBQTm9kZVdpdGhJbnB1dCBpbXBsZW1lbnRzIE5vZGVXaXRoTGF5ZXJPdXRwdXQge1xuICAgIGdldCBkb2N1bWVudFdpZGdldCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmlucHV0c1swXSBhcyBEb2N1bWVudElucHV0KT8uZG9jdW1lbnRXaWRnZXQ7XG4gICAgfVxuICAgIGFzeW5jIHVwZGF0ZSgpIHtcbiAgICAgICAgc3VwZXIudXBkYXRlKCk7XG4gICAgICAgIHRoaXMubm9kZS5pbnB1dHMuZm9yRWFjaCgoaTogYW55KSA9PiBpLmxhYmVsID0gaTE4bihpLm5hbWUpKTtcbiAgICAgICAgdGhpcy5ub2RlLm91dHB1dHMuZm9yRWFjaCgoaTogYW55KSA9PiBpLmxhYmVsID0gaTE4bihpLm5hbWUpKTtcbiAgICAgICAgdGhpcy5ub2RlLndpZGdldHNbMF0ubGFiZWwgPSBpMThuKHRoaXMubm9kZS53aWRnZXRzWzBdLm5hbWUpXG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEdldExpbmtlZExheWVyc05vZGUgZXh0ZW5kcyBTRFBQUE5vZGVXaXRoSW5wdXQgaW1wbGVtZW50cyBOb2RlV2l0aExheWVyT3V0cHV0IHtcbiAgICBnZXQgZG9jdW1lbnRXaWRnZXQoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5pbnB1dHNbMF0gYXMgRG9jdW1lbnRJbnB1dCk/LmRvY3VtZW50V2lkZ2V0O1xuICAgIH1cbiAgICBhc3luYyB1cGRhdGUoKSB7XG4gICAgICAgIHN1cGVyLnVwZGF0ZSgpO1xuICAgICAgICB0aGlzLm5vZGUuaW5wdXRzLmZvckVhY2goKGk6IGFueSkgPT4gaS5sYWJlbCA9IGkxOG4oaS5uYW1lKSk7XG4gICAgICAgIHRoaXMubm9kZS5vdXRwdXRzLmZvckVhY2goKGk6IGFueSkgPT4gaS5sYWJlbCA9IGkxOG4oaS5uYW1lKSk7XG4gICAgICAgIHRoaXMubm9kZS53aWRnZXRzWzBdLmxhYmVsID0gaTE4bih0aGlzLm5vZGUud2lkZ2V0c1swXS5uYW1lKVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNlbmRUZXh0VG9MYXllck5vZGUgZXh0ZW5kcyBTRFBQUERvd25sb2FkYWJsZU5vZGUge1xuICAgIHByb3RlY3RlZCBhc3luYyB1cGRhdGUoKSB7XG4gICAgICAgIHN1cGVyLnVwZGF0ZSgpO1xuICAgICAgICB0aGlzLm5vZGUuaW5wdXRzWzBdLmxhYmVsID0gaTE4bih0aGlzLm5vZGUuaW5wdXRzWzBdLm5hbWUpXG4gICAgICAgIHRoaXMubm9kZS5pbnB1dHNbMV0ubGFiZWwgPSBpMThuKHRoaXMubm9kZS5pbnB1dHNbMV0ubmFtZSlcbiAgICAgICAgdGhpcy5ub2RlLm91dHB1dHNbMF0gJiYgKHRoaXMubm9kZS5vdXRwdXRzWzBdLmxhYmVsID0gaTE4bih0aGlzLm5vZGUub3V0cHV0c1swXS5uYW1lKSlcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgR2V0VGV4dEZyb21MYXllck5vZGUgZXh0ZW5kcyBTRFBQUERvd25sb2FkYWJsZU5vZGUge1xuICAgIHN0YXRpYyBwcmVoYW5kbGVOb2RlVHlwZShub2RlRGF0YTogYW55KSB7XG4gICAgICAgIGlmIChub2RlRGF0YS5pbnB1dC5vcHRpb25hbFsnZG9jdW1lbnQnXSkge1xuICAgICAgICAgICAgZGVsZXRlIG5vZGVEYXRhLmlucHV0Lm9wdGlvbmFsWydkb2N1bWVudCddO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKG5vZGU6IGFueSkge1xuICAgICAgICBzdXBlcihub2RlKTtcbiAgICB9XG4gICAgYXN5bmMgdXBkYXRlKCkge1xuICAgICAgICBzdXBlci51cGRhdGUoKTtcbiAgICAgICAgdGhpcy5ub2RlLmlucHV0c1swXS5sYWJlbCA9IGkxOG4odGhpcy5ub2RlLmlucHV0c1swXS5uYW1lKVxuICAgICAgICB0aGlzLm5vZGUub3V0cHV0c1swXSAmJiAodGhpcy5ub2RlLm91dHB1dHNbMF0ubGFiZWwgPSBpMThuKHRoaXMubm9kZS5vdXRwdXRzWzBdLm5hbWUpKVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdldERvY3VtZW50Tm9kZSBleHRlbmRzIFNEUFBQTm9kZVdpdGhJbnB1dCBpbXBsZW1lbnRzIE5vZGVXaXRoRG9jdW1lbnRPdXRwdXQge1xuICAgIGdldCBkb2N1bWVudFdpZGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2RwcHBXaWRnZXRzWzBdIGFzIERvY3VtZW50V2lkZ2V0O1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgcHNkV2lkZ2V0OiBhbnlcblxuICAgIHB1YmxpYyBleHRyYWN0UFNEKHNpZDogc3RyaW5nLCBkb2N1bWVudElkZW50aWZ5OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMubm9kZS5wcm9wZXJ0aWVzLnBzZCkge1xuICAgICAgICAgICAgQ29tZnlTb2NrZXQuaW5zdGFuY2VcbiAgICAgICAgICAgICAgICAuZXhwb3J0UFNERGF0YVVSTFRvUGhvdG9zaG9wKHNpZCwgZG9jdW1lbnRJZGVudGlmeSwgdGhpcy5ub2RlLnByb3BlcnRpZXNbJ3BzZCddLCBwYWdlU3RvcmUuZGF0YS5zc2lkKVxuICAgICAgICAgICAgICAgIC50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDMwMCkpO1xuICAgICAgICAgICAgICAgICAgICAoZ2xvYmFsVGhpcyBhcyBhbnkpLmFwcC5jYW52YXMuZHJhdyh0cnVlLCB0cnVlKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKGNvbnNvbGUuZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Iobm9kZTogYW55KSB7XG4gICAgICAgIHN1cGVyKG5vZGUpO1xuICAgICAgICB0aGlzLnBzZFdpZGdldCA9IG5vZGUuYWRkV2lkZ2V0KCdidXR0b24nLCAnJywgJycsICgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5kb2N1bWVudFdpZGdldC53aWRnZXQudmFsdWUpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IGJhY2tlbmREYXRhcyA9IHBhZ2VQaG90b3Nob3BTdG9yZU1hcC5nZXRBbGxQaG90b3Nob3BEb2N1bWVudERhdGEoKTtcbiAgICAgICAgICAgIGxldCBbaW5zdGFuY2VOYW1lLCBkb2N1bWVudElkZW50aWZ5XSA9IHRoaXMuZG9jdW1lbnRXaWRnZXQud2lkZ2V0LnZhbHVlLnNwbGl0KCcvJyk7XG4gICAgICAgICAgICBpZiAodGhpcy5ub2RlLnByb3BlcnRpZXMucHNkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leHRyYWN0UFNEKGJhY2tlbmREYXRhc1tpbnN0YW5jZU5hbWVdLnNpZCwgZG9jdW1lbnRJZGVudGlmeSk7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgQ29tZnlTb2NrZXQuaW5zdGFuY2VcbiAgICAgICAgICAgICAgICAgICAgLmltcG9ydFBTRERhdGFVUkxGcm9tUGhvdG9zaG9wKGJhY2tlbmREYXRhc1tpbnN0YW5jZU5hbWVdLnNpZCwgZG9jdW1lbnRJZGVudGlmeSwgcGFnZVN0b3JlLmRhdGEuc3NpZClcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4ocHNkQmFzZTY0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZS5zZXRQcm9wZXJ0eSgncHNkJywgcHNkQmFzZTY0KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHt9KVxuICAgIH1cblxuICAgIGFzeW5jIHVwZGF0ZSgpIHtcbiAgICAgICAgc3VwZXIudXBkYXRlKCk7XG4gICAgICAgIHRoaXMubm9kZS5vdXRwdXRzLmZvckVhY2goKGk6IGFueSkgPT4gaS5sYWJlbCA9IGkxOG4oaS5uYW1lKSk7XG4gICAgICAgIGlmICh0aGlzLm5vZGUucHJvcGVydGllcy5wc2QpIHtcbiAgICAgICAgICAgIHBhZ2VTdG9yZS5zZXRIYXNQU0ROb2Rlcyh0cnVlKVxuICAgICAgICAgICAgdGhpcy5wc2RXaWRnZXQubGFiZWwgPSBpMThuKCdleHRyYWN0IHNhdmVkIC5wc2QgdG8gUGhvdG9zaG9wJylcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFnZVN0b3JlLnNldEhhc1BTRE5vZGVzKGZhbHNlKVxuICAgICAgICAgICAgdGhpcy5wc2RXaWRnZXQubGFiZWwgPSBpMThuKCdzYXZlIC5wc2QgdG8gdGhpcyB3b3JrZmxvdycpXG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSdW5QaG90b3Nob3BBY3Rpb25Ob2RlIGV4dGVuZHMgU0RQUFBOb2RlV2l0aElucHV0IHtcbiAgICBhc3luYyB1cGRhdGUoKSB7XG4gICAgICAgIHN1cGVyLnVwZGF0ZSgpO1xuICAgICAgICB0aGlzLm5vZGUuaW5wdXRzLmZvckVhY2goKGk6IGFueSkgPT4gaS5sYWJlbCA9IGkxOG4oaS5uYW1lKSk7XG4gICAgICAgIHRoaXMubm9kZS5vdXRwdXRzLmZvckVhY2goKGk6IGFueSkgPT4gaS5sYWJlbCA9IGkxOG4oaS5uYW1lKSk7XG4gICAgfVxufVxuIiwgImltcG9ydCBpMThuIGZyb20gXCIuLi8uLi8uLi8uLi9zcmMvY29tbW9uL2kxOG4ubXRzXCI7XG5pbXBvcnQgeyBTcGVpY2lhbElETWFuYWdlciB9IGZyb20gXCIuLi8uLi8uLi8uLi9zcmMvY29tbW9uL3Bob3Rvc2hvcC9zcGVjaWFsTGF5ZXIubXRzXCI7XG5pbXBvcnQgeyBEb2N1bWVudFdpZGdldCwgTGF5ZXJXaWRnZXQsIExheWVyV2lkZ2V0V2l0aERvY3VtZW50U2VsZWN0aW9uIH0gZnJvbSBcIi4uL2xpdGVncmFwaC9mZS13aWRnZXRzLm1qc1wiO1xuaW1wb3J0IHsgQ29tZnlOb2RlRGVmTGlzdCB9IGZyb20gXCIuLi9saXRlZ3JhcGgvbm9kZS13cmFwcGVyLm1qc1wiO1xuaW1wb3J0IHsgR2V0U2VsZWN0aW9uTm9kZSB9IGZyb20gXCIuL25vZGVzLm1qc1wiO1xuaW1wb3J0IHsgU0RQUFBEb3dubG9hZGFibGVOb2RlIH0gZnJvbSBcIi4vU0RQUFBEb3dubG9hZGFibGVOb2RlLm1qc1wiO1xuZGVjbGFyZSBjb25zdCBjb21meUFQSTogYW55O1xuXG5leHBvcnQgY2xhc3MgR2V0SW1hZ2VGcm9tTGF5ZXJOb2RlIGV4dGVuZHMgU0RQUFBEb3dubG9hZGFibGVOb2RlIHtcbiAgICBzdGF0aWMgcHJlaGFuZGxlTm9kZVR5cGUobm9kZURhdGE6IGFueSkge1xuICAgICAgICBpZiAobm9kZURhdGEuaW5wdXQub3B0aW9uYWxbJ2RvY3VtZW50J10pIHtcbiAgICAgICAgICAgIGRlbGV0ZSBub2RlRGF0YS5pbnB1dC5vcHRpb25hbFsnZG9jdW1lbnQnXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIGRvY3VtZW50V2lkZ2V0OiBEb2N1bWVudFdpZGdldDtcbiAgICBwcml2YXRlIGxheWVyV2lkZ2V0OiBMYXllcldpZGdldDtcbiAgICBjb25zdHJ1Y3Rvcihub2RlOiBhbnkpIHtcbiAgICAgICAgY29uc3QgZG9jdW1lbnRXaWRnZXQgPSBEb2N1bWVudFdpZGdldC5jcmVhdGUobm9kZSwgJ2RvY3VtZW50JylcbiAgICAgICAgY29uc3QgbGF5ZXJXaWRnZXQgPSBMYXllcldpZGdldFdpdGhEb2N1bWVudFNlbGVjdGlvbi5jcmVhdGUobm9kZSwgJ2xheWVyX29yX2dyb3VwJywge1xuICAgICAgICAgICAgZG9jdW1lbnRXaWRnZXRJbk5vZGU6IGRvY3VtZW50V2lkZ2V0LFxuICAgICAgICAgICAgZXh0cmFPcHRpb25zOiBTcGVpY2lhbElETWFuYWdlci5nZXRTcGVjaWFsTGF5ZXJGb3JHZXQoKVxuICAgICAgICB9KTtcblxuICAgICAgICBzdXBlcihub2RlKTtcbiAgICAgICAgdGhpcy5kb2N1bWVudFdpZGdldCA9IGRvY3VtZW50V2lkZ2V0XG4gICAgICAgIHRoaXMubGF5ZXJXaWRnZXQgPSBsYXllcldpZGdldFxuXG4gICAgICAgIGlmICh0aGlzLm5vZGUud2lkZ2V0c1swXS5uYW1lID09ICdxdWFsaXR5Jykge1xuICAgICAgICAgICAgdGhpcy5ub2RlLndpZGdldHNbMV0gPSBkb2N1bWVudFdpZGdldC53aWRnZXRcbiAgICAgICAgICAgIHRoaXMubm9kZS53aWRnZXRzWzJdID0gbGF5ZXJXaWRnZXQud2lkZ2V0XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm5vZGUud2lkZ2V0c1swXSA9IGRvY3VtZW50V2lkZ2V0LndpZGdldFxuICAgICAgICAgICAgdGhpcy5ub2RlLndpZGdldHNbMV0gPSBsYXllcldpZGdldC53aWRnZXRcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcm90ZWN0ZWQgb25Db25maWd1cmUobm9kZURhdGE6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAoIW5vZGVEYXRhLnByb3BlcnRpZXNbJ3NkcHBwLXZlcnNpb24nXSkge1xuXG4gICAgICAgIH0gZWxzZSBpZiAoK25vZGVEYXRhLnByb3BlcnRpZXNbJ3NkcHBwLXZlcnNpb24nXSA8PSA0MTApIHtcblxuICAgICAgICAgICAgaWYgKHRoaXMubm9kZS53aWRnZXRzWzBdLnZhbHVlID09PSB0cnVlIHx8IHRoaXMubm9kZS53aWRnZXRzWzBdLnZhbHVlID09PSBcInRydWVcIikge1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZ2V0U2VsZWN0aW9uTm9kZSA9IGNvbWZ5QVBJLmFwcC5hcHAuYWRkTm9kZU9uR3JhcGgoQ29tZnlOb2RlRGVmTGlzdFsnU0RQUFAgR2V0IFNlbGVjdGlvbiddLCB7XG4gICAgICAgICAgICAgICAgICAgIHBvczogdGhpcy5ub2RlLnBvcyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBuZXcgR2V0U2VsZWN0aW9uTm9kZShnZXRTZWxlY3Rpb25Ob2RlKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGUub3V0cHV0c1swXS5saW5rcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbWZ5QVBJLmFwcC5hcHAuYWRkTm9kZU9uR3JhcGgoQ29tZnlOb2RlRGVmTGlzdFsnSm9pbkltYWdlV2l0aEFscGhhJ10sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvczogW3RoaXMubm9kZS5wb3NbMF0gKyBnZXRTZWxlY3Rpb25Ob2RlLnNpemVbMF0gKyAxMCwgdGhpcy5ub2RlLnBvc1sxXSAtIDIwXSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBnZXRTZWxlY3Rpb25Ob2RlLnNpemUgPSB0aGlzLm5vZGUuc2l6ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICA7IChjb21meUFQSSBhcyBhbnkpLmFwcC5hcHAuZ3JhcGgucmVtb3ZlKHRoaXMubm9kZSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5ub2RlLndpZGdldHNbMF0udmFsdWUgPSBub2RlRGF0YS53aWRnZXRzX3ZhbHVlc1sxXTtcbiAgICAgICAgICAgIHRoaXMubm9kZS53aWRnZXRzWzFdLnZhbHVlID0gbm9kZURhdGEud2lkZ2V0c192YWx1ZXNbMl07XG4gICAgICAgIH0gZWxzZSBpZiAoK25vZGVEYXRhLnByb3BlcnRpZXNbJ3NkcHBwLXZlcnNpb24nXSA8IDUwNCkge1xuICAgICAgICAgICAgaWYgKHRoaXMubm9kZS53aWRnZXRzWzBdLm5hbWUgPT0gJ3F1YWxpdHknKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlLndpZGdldHNbMF0udmFsdWUgPSAxMDA7XG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlLndpZGdldHNbMV0udmFsdWUgPSBub2RlRGF0YS53aWRnZXRzX3ZhbHVlc1swXTtcbiAgICAgICAgICAgICAgICB0aGlzLm5vZGUud2lkZ2V0c1syXS52YWx1ZSA9IG5vZGVEYXRhLndpZGdldHNfdmFsdWVzWzFdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN1cGVyLm9uQ29uZmlndXJlKG5vZGVEYXRhKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgdXBkYXRlKCkge1xuICAgICAgICB0aGlzLmRvY3VtZW50V2lkZ2V0LmxvY2tNb2RlKHRoaXMubGF5ZXJMaW5rZWQsIGkxOG4oJ2RvY3VtZW50IGxpbmtlZCcpKVxuICAgICAgICB0aGlzLmxheWVyV2lkZ2V0LmxvY2tNb2RlKHRoaXMubGF5ZXJMaW5rZWQsIGkxOG4oJ2xheWVyIGxpbmtlZCcpKVxuXG4gICAgICAgIHRoaXMuZG9jdW1lbnRXaWRnZXQudXBkYXRlKCk7XG4gICAgICAgIHRoaXMubGF5ZXJXaWRnZXQudXBkYXRlKCk7XG4gICAgICAgIHN1cGVyLnVwZGF0ZSgpO1xuICAgICAgICB0aGlzLm5vZGUud2lkZ2V0cy5mb3JFYWNoKChpOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChpLmxhYmVsKSByZXR1cm5cbiAgICAgICAgICAgIHRyeSB7IGkubGFiZWwgPSBpMThuKGkubmFtZSkgfSBjYXRjaCAoZSkgeyB9XG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMubm9kZS5pbnB1dHMuZm9yRWFjaCgoaTogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoaS5sYWJlbCkgcmV0dXJuXG4gICAgICAgICAgICB0cnkgeyBpLmxhYmVsID0gaTE4bihpLm5hbWUpIH0gY2F0Y2ggKGUpIHsgfVxuICAgICAgICB9KVxuICAgICAgICB0aGlzLm5vZGUub3V0cHV0cy5mb3JFYWNoKChpOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChpLmxhYmVsKSByZXR1cm5cbiAgICAgICAgICAgIHRyeSB7IGkubGFiZWwgPSBpMThuKGkubmFtZSkgfSBjYXRjaCAoZSkgeyB9XG4gICAgICAgIH0pXG4gICAgfVxuICAgIHByaXZhdGUgbGF5ZXJMaW5rZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgaW5wdXRDb25uZWN0aW9uQ2hhbmdlKGluZGV4OiBudW1iZXIsIGNvbm5lY3RlZDogYm9vbGVhbikge1xuICAgICAgICBzdXBlci5pbnB1dENvbm5lY3Rpb25DaGFuZ2UoaW5kZXgsIGNvbm5lY3RlZCk7XG4gICAgICAgIGlmIChpbmRleCA9PSAwKSB0aGlzLmxheWVyTGlua2VkID0gY29ubmVjdGVkO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBTZW5kSW1hZ2VUb0xheWVyTm9kZSBleHRlbmRzIFNEUFBQRG93bmxvYWRhYmxlTm9kZSB7XG4gICAgc3RhdGljIHByZWhhbmRsZU5vZGVUeXBlKG5vZGVEYXRhOiBhbnkpIHtcbiAgICAgICAgaWYgKG5vZGVEYXRhLmlucHV0Lm9wdGlvbmFsWydkb2N1bWVudCddKSB7XG4gICAgICAgICAgICBkZWxldGUgbm9kZURhdGEuaW5wdXQub3B0aW9uYWxbJ2RvY3VtZW50J107XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBkb2N1bWVudFdpZGdldDogRG9jdW1lbnRXaWRnZXQ7XG4gICAgcHJpdmF0ZSBsYXllcldpZGdldDogTGF5ZXJXaWRnZXQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihub2RlOiBhbnkpIHtcbiAgICAgICAgY29uc3QgZG9jdW1lbnRXaWRnZXQgPSBEb2N1bWVudFdpZGdldC5jcmVhdGUobm9kZSwgJ2RvY3VtZW50JylcbiAgICAgICAgY29uc3QgbGF5ZXJXaWRnZXQgPSBMYXllcldpZGdldFdpdGhEb2N1bWVudFNlbGVjdGlvbi5jcmVhdGUobm9kZSwgJ2xheWVyX29yX2dyb3VwJywge1xuICAgICAgICAgICAgZG9jdW1lbnRXaWRnZXRJbk5vZGU6IGRvY3VtZW50V2lkZ2V0LFxuICAgICAgICAgICAgZXh0cmFPcHRpb25zOiBTcGVpY2lhbElETWFuYWdlci5nZXRTcGVjaWFsTGF5ZXJGb3JTZW5kKClcbiAgICAgICAgfSk7XG4gICAgICAgIHN1cGVyKG5vZGUpO1xuICAgICAgICB0aGlzLmRvY3VtZW50V2lkZ2V0ID0gZG9jdW1lbnRXaWRnZXRcbiAgICAgICAgdGhpcy5sYXllcldpZGdldCA9IGxheWVyV2lkZ2V0XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyB1cGRhdGUoKSB7XG4gICAgICAgIHRoaXMuZG9jdW1lbnRXaWRnZXQ/LmxvY2tNb2RlKHRoaXMubGF5ZXJMaW5rZWQsIGkxOG4oJ2RvY3VtZW50IGxpbmtlZCcpKVxuICAgICAgICB0aGlzLmxheWVyV2lkZ2V0Py5sb2NrTW9kZSh0aGlzLmxheWVyTGlua2VkLCBpMThuKCdsYXllciBsaW5rZWQnKSlcblxuICAgICAgICB0aGlzLmRvY3VtZW50V2lkZ2V0LnVwZGF0ZSgpO1xuICAgICAgICB0aGlzLmxheWVyV2lkZ2V0LnVwZGF0ZSgpO1xuICAgICAgICBzdXBlci51cGRhdGUoKTtcbiAgICAgICAgaWYgKCF0aGlzLm5vZGUud2lkZ2V0c1swXS5sYWJlbClcbiAgICAgICAgICAgIHRoaXMubm9kZS53aWRnZXRzWzBdLmxhYmVsID0gaTE4bih0aGlzLm5vZGUud2lkZ2V0c1swXS5uYW1lKVxuICAgICAgICBpZiAoIXRoaXMubm9kZS53aWRnZXRzWzFdLmxhYmVsKVxuICAgICAgICAgICAgdGhpcy5ub2RlLndpZGdldHNbMV0ubGFiZWwgPSBpMThuKHRoaXMubm9kZS53aWRnZXRzWzFdLm5hbWUpXG4gICAgICAgIHRoaXMubm9kZS5pbnB1dHNbMF0ubGFiZWwgPSBpMThuKHRoaXMubm9kZS5pbnB1dHNbMF0ubmFtZSlcbiAgICAgICAgdGhpcy5ub2RlLmlucHV0c1sxXS5sYWJlbCA9IGkxOG4odGhpcy5ub2RlLmlucHV0c1sxXS5uYW1lKVxuICAgICAgICB0aGlzLm5vZGUuaW5wdXRzWzJdLmxhYmVsID0gaTE4bih0aGlzLm5vZGUuaW5wdXRzWzJdLm5hbWUpXG4gICAgICAgIHRoaXMubm9kZS5vdXRwdXRzWzBdLmxhYmVsID0gaTE4bih0aGlzLm5vZGUub3V0cHV0c1swXS5uYW1lKVxuICAgIH1cbiAgICBwcml2YXRlIGxheWVyTGlua2VkOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIGlucHV0Q29ubmVjdGlvbkNoYW5nZShpbmRleDogbnVtYmVyLCBjb25uZWN0ZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgc3VwZXIuaW5wdXRDb25uZWN0aW9uQ2hhbmdlKGluZGV4LCBjb25uZWN0ZWQpO1xuICAgICAgICBpZiAoaW5kZXggPT0gMSkgdGhpcy5sYXllckxpbmtlZCA9IGNvbm5lY3RlZDtcbiAgICB9XG59IiwgImltcG9ydCBpMThuIGZyb20gXCIuLi8uLi8uLi8uLi9zcmMvY29tbW9uL2kxOG4ubXRzXCI7XG5pbXBvcnQgeyBHZXRJbWFnZUZyb21MYXllck5vZGUsIFNlbmRJbWFnZVRvTGF5ZXJOb2RlIH0gZnJvbSBcIi4uL2NvbWZ5LW5vZGVzL2xlZ2FjeS1ub2Rlcy5tanNcIjtcbmltcG9ydCB7IEdldERvY3VtZW50Tm9kZSwgR2V0TGF5ZXJOb2RlLCBHZXRMYXllcnNJbkdyb3VwTm9kZSwgR2V0TGlua2VkTGF5ZXJzTm9kZSwgR2V0U2VsZWN0aW9uTm9kZSwgR2V0VGV4dEZyb21MYXllck5vZGUsIFBhcnNlTGF5ZXJJbmZvTm9kZSwgUnVuUGhvdG9zaG9wQWN0aW9uTm9kZSwgU2VuZFRleHRUb0xheWVyTm9kZSB9IGZyb20gXCIuLi9jb21meS1ub2Rlcy9ub2Rlcy5tanNcIjtcbmltcG9ydCB7IFNEUFBQTm9kZSB9IGZyb20gXCIuLi9jb21meS1ub2Rlcy9TRFBQUE5vZGUubWpzXCI7XG5pbXBvcnQgeyBTRFBQUE5vZGVXaXRoSW5wdXQgfSBmcm9tIFwiLi4vY29tZnktbm9kZXMvU0RQUFBOb2RlV2l0aElucHV0Lm1qc1wiO1xuZGVjbGFyZSBjb25zdCBjb21meUFQSTogYW55O1xuXG5jb25zdCBTRFBQUE5vZGVMaXN0ID0ge1xuICAgICdHZXQgSW1hZ2UgRnJvbSBQaG90b3Nob3AgTGF5ZXInOiBHZXRJbWFnZUZyb21MYXllck5vZGUsXG4gICAgJ1NlbmQgSW1hZ2VzIFRvIFBob3Rvc2hvcCc6IFNlbmRJbWFnZVRvTGF5ZXJOb2RlLFxuICAgICdTRFBQUCBTZW5kIFRleHQgVG8gTGF5ZXInOiBTZW5kVGV4dFRvTGF5ZXJOb2RlLFxuICAgICdTRFBQUCBHZXQgVGV4dCBGcm9tIExheWVyJzogR2V0VGV4dEZyb21MYXllck5vZGUsXG4gICAgJ1NEUFBQIFBhcnNlIExheWVyIEluZm8nOiBQYXJzZUxheWVySW5mb05vZGUsXG4gICAgJ1NEUFBQIEdldCBMaW5rZWQgTGF5ZXJzJzogR2V0TGlua2VkTGF5ZXJzTm9kZSxcbiAgICAnU0RQUFAgR2V0IExheWVycyBJbiBHcm91cCc6IEdldExheWVyc0luR3JvdXBOb2RlLFxuICAgICdTRFBQUCBHZXQgTGF5ZXIgQnkgSUQnOiBHZXRMYXllck5vZGUsXG4gICAgJ1NEUFBQIEdldCBEb2N1bWVudCc6IEdldERvY3VtZW50Tm9kZSxcbiAgICAnU0RQUFAgR2V0IFNlbGVjdGlvbic6IEdldFNlbGVjdGlvbk5vZGUsXG4gICAgJ1NEUFBQIFJ1biBQaG90b3Nob3AgQWN0aW9uJzogUnVuUGhvdG9zaG9wQWN0aW9uTm9kZSxcbiAgICAvLyAnU0RQUFAgU2V0dGluZ3MnOiBTRFBQUFNldHRpbmdzTm9kZSxcbn1cbmV4cG9ydCBjb25zdCBDb21meU5vZGVEZWZMaXN0OiBSZWNvcmQ8YW55LCBhbnk+ID0ge30gYXMgYW55XG5cbmV4cG9ydCBmdW5jdGlvbiB3cmFwTm9kZShub2RlVHlwZTogYW55LCBub2RlRGVmOiBhbnkpIHtcbiAgICBjb25zdCBjb21meUNsYXNzID0gbm9kZVR5cGUuY29tZnlDbGFzcyB8fCBub2RlRGVmLm5hbWU7XG4gICAgQ29tZnlOb2RlRGVmTGlzdFtjb21meUNsYXNzXSA9IG5vZGVEZWY7XG4gICAgXG4gICAgaWYgKGNvbWZ5Q2xhc3MgaW4gU0RQUFBOb2RlTGlzdCkge1xuICAgICAgICBub2RlVHlwZS50aXRsZSA9IGkxOG4obm9kZURlZi5kaXNwbGF5X25hbWUpO1xuICAgICAgICBub2RlRGVmLmRpc3BsYXlfbmFtZSA9IGkxOG4obm9kZURlZi5kaXNwbGF5X25hbWUpO1xuICAgICAgICBTRFBQUE5vZGUucmVnaXN0ZXJOb2RlVHlwZShub2RlVHlwZSwgbm9kZURlZiwgU0RQUFBOb2RlTGlzdFtjb21meUNsYXNzIGFzIGtleW9mIHR5cGVvZiBTRFBQUE5vZGVMaXN0XSlcblxuICAgIH0gZWxzZSBpZiAoY29tZnlDbGFzcy5zdGFydHNXaXRoKCd3b3JrZmxvdycpICYmIGNvbWZ5QVBJLmdyb3VwTm9kZS5Hcm91cE5vZGVIYW5kbGVyLmdldEdyb3VwRGF0YShub2RlVHlwZSkpIHtcbiAgICAgICAgY29uc3QgZ3JvdXBEYXRhID0gY29tZnlBUEkuZ3JvdXBOb2RlLkdyb3VwTm9kZUhhbmRsZXIuZ2V0R3JvdXBEYXRhKG5vZGVUeXBlKVxuICAgICAgICBsZXQgY29udGFpbnNTRFBQUE5vZGUgPSBmYWxzZTtcbiAgICAgICAgZ3JvdXBEYXRhLm5vZGVEYXRhLm5vZGVzLmZvckVhY2goKG5vZGU6IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgLy8gbWlnaHQgYmUgYW5vdGhlciBncm91cE5vZGVcbiAgICAgICAgICAgIGlmIChub2RlLnR5cGUgaW4gU0RQUFBOb2RlTGlzdCkgY29udGFpbnNTRFBQUE5vZGUgPSB0cnVlO1xuICAgICAgICB9KVxuICAgICAgICBcbiAgICAgICAgaWYgKGNvbnRhaW5zU0RQUFBOb2RlKVxuICAgICAgICAgICAgU0RQUFBOb2RlLnJlZ2lzdGVyTm9kZVR5cGUobm9kZVR5cGUsIG5vZGVEZWYsIFNEUFBQTm9kZVdpdGhJbnB1dClcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgY3JlYXRlUm9vdCB9IGZyb20gXCJyZWFjdC1kb20vY2xpZW50XCI7XG5pbXBvcnQgeyBjcmVhdGVFbGVtZW50IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgQ29tZnlQb3B1cCBmcm9tIFwiLi90c3gvQ29tZnlQb3B1cFwiO1xuaW1wb3J0IENvbWZ5U2lkZWJhciBmcm9tIFwiLi90c3gvQ29tZnlTaWRlYmFyXCI7XG5cbmxldCBzZHBwcENhbnZhc1JlbmRlcmVkOiBhbnkgPSBudWxsXG5sZXQgc2RwcHBTaWRlQmFyUmVuZGVyZWQ6IGFueSA9IG51bGxcbmxldCBwb3B1cEpTWEVsZW1lbnQ6IGFueSA9IG51bGxcbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIGluaXRQb3B1cChhcHA6IGFueSkge1xuICAgIGlmICghc2RwcHBDYW52YXNSZW5kZXJlZCkge1xuICAgICAgICBjb25zdCBzZHBwcENhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBzZHBwcENhbnZhcy5pZCA9IFwic2RwcHAtcG9wdXAtcm9vdFwiO1xuICAgICAgICBzZHBwcENhbnZhcy5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZ3JhcGgtY2FudmFzLWNvbnRhaW5lclwiKT8ucHJlcGVuZChzZHBwcENhbnZhcyk7XG5cbiAgICAgICAgYXBwLmV4dGVuc2lvbk1hbmFnZXIucmVnaXN0ZXJTaWRlYmFyVGFiKHtcblxuICAgICAgICAgICAgaWQ6IFwic2RwcHBcIixcbiAgICAgICAgICAgIHRpdGxlOiBcIlNELVBQUFwiLFxuICAgICAgICAgICAgdG9vbHRpcDogXCJTRC1QUFAgV29ya2Zsb3cgVUlcIixcbiAgICAgICAgICAgIGljb246IFwic2RwcHAtc2lkZS1pY29uXCIsXG4gICAgICAgICAgICB0eXBlOiBcImN1c3RvbVwiLFxuICAgICAgICAgICAgcmVuZGVyOiAoY29udGFpbmVyOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghc2RwcHBTaWRlQmFyUmVuZGVyZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLndpZHRoID0gXCIxMDAlXCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSBcImF1dG9cIjtcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLnBhZGRpbmcgPSBcIjhweFwiO1xuICAgICAgICAgICAgICAgICAgICBjcmVhdGVSb290KGNvbnRhaW5lcikucmVuZGVyKGNyZWF0ZUVsZW1lbnQoQ29tZnlTaWRlYmFyLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvbk1heGltaXplOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1BvcHVwKFwiMVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uUGhvdG9zaG9wOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1BvcHVwKFwiMlwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2RwcHBDYW52YXMuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHNob3dQb3B1cCh0YWI6IHN0cmluZykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXNkcHBwQ2FudmFzUmVuZGVyZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvcHVwSlNYRWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoQ29tZnlQb3B1cCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xvc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2RwcHBDYW52YXMuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVJvb3Qoc2RwcHBDYW52YXMpLnJlbmRlcihwb3B1cEpTWEVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb3B1cEpTWEVsZW1lbnQucHJvcHMudGFiID0gdGFiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc2RwcHBDYW52YXMuc3R5bGUuZGlzcGxheSA9IFwiZmxleFwiO1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLnNkcHBwLXNpZGUtaWNvblwiKT8ucGFyZW50RWxlbWVudD8uY2xpY2soKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgfVxufVxuXG4iLCAiI3NkcHBwLXBvcHVwLXJvb3Qge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgcGFkZGluZzogMTZweDtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iZy1jb2xvcik7XG4gICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XG4gICAganVzdGlmeS1jb250ZW50OiBzdHJldGNoO1xufSBcbi5zZHBwcC1tZW51LWNvbnRhaW5lciB7XG4gICAgYm94LXNpemluZzogY29udGVudC1ib3g7XG4gICAgb3ZlcmZsb3cteTogaGlkZGVuO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBhbGlnbi1pdGVtczogc3RyZXRjaDtcbiAgICBtaW4td2lkdGg6IDA7XG4gICAgZmxleDogMTtcbn1cbi5zZHBwcC1tZW51LWhlYWRlciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGdhcDogMTBweDtcbiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IpO1xuICAgIHBhZGRpbmctYm90dG9tOiA1cHg7XG4gICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHJnYmEoMTI3LCAxMjcsIDEyNywgLjQpO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xufSAgIFxuXG4uc2RwcHAtbWVudS1oZWFkZXIgYnV0dG9uIHtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktaW5wdXQtYmcpO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBib3gtc2hhZG93OiBub25lO1xufVxuLnNkcHBwLW1lbnUtaGVhZGVyIGJ1dHRvbjpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYm9yZGVyLWNvbG9yKTtcbn1cbi5zZHBwcC1tZW51LWhlYWRlciBidXR0b24uYWN0aXZlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wcmltYXJ5LWJnKTtcbn1cbi5zZHBwcC1tZW51LWhlYWRlciBidXR0b24uYWN0aXZlOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wcmltYXJ5LWhvdmVyLWJnKTtcbn1cblxuLnNkcHBwLW1lbnUtY29udGVudCB7XG4gICAgZ2FwOiAxMHB4O1xuICAgIGZsZXg6IDE7XG4gICAgbWluLWhlaWdodDogMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBtaW4td2lkdGg6IDA7XG4gICAgb3ZlcmZsb3cteDogaGlkZGVuO1xufVxuXG5cbi5zZHBwcC1jbG9zZS1idXR0b24ge1xuICAgIGhlaWdodDogMzBweDtcbiAgICB3aWR0aDogMzBweDtcbiAgICB0b3A6IDEwcHg7XG4gICAgcmlnaHQ6IDEwcHg7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi5zZXR0aW5ncy1jb250YWluZXIge1xuICAgIHBhZGRpbmc6IDEwcHg7XG4gICAgY29sb3I6IHdoaXRlO1xufVxuXG4uc2V0dGluZ3Mtc2VjdGlvbiB7XG4gICAgZGlzcGxheTogZ3JpZDtcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7XG4gICAgZ2FwOiAxMHB4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgbWFyZ2luLWJvdHRvbTogMTVweDtcbn1cblxuLnNldHRpbmdzLXNlY3Rpb24gbGFiZWwge1xuICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgcGFkZGluZy1yaWdodDogMTBweDtcbn1cblxuLnNldHRpbmdzLXNlY3Rpb24gaW5wdXRbdHlwZT1cIm51bWJlclwiXSB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgcGFkZGluZzogNXB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjNjY2O1xuICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LWlucHV0LWJnKTtcbiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IpO1xufVxuXG4uc2V0dGluZ3Mtc2VjdGlvbiAuZG93bmxvYWQtYnV0dG9uIHtcbiAgICB3aWR0aDogYXV0bztcbiAgICBwYWRkaW5nOiA1cHggMTBweDtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgIzY2NjtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1pbnB1dC1iZyk7XG4gICAgY29sb3I6IHZhcigtLWZnLWNvbG9yKTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgbWFyZ2luLXJpZ2h0OiA1cHg7XG59XG5cbi5zZXR0aW5ncy1zZWN0aW9uIC5kb3dubG9hZC1idXR0b246bGFzdC1jaGlsZCB7XG4gICAgbWFyZ2luLXJpZ2h0OiAwO1xufVxuXG4uc2V0dGluZ3Mtc2VjdGlvbiBkaXY6aGFzKC5kb3dubG9hZC1idXR0b24pIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcbiAgICBnYXA6IDVweDtcbn1cblxuLnNldHRpbmdzLXNlY3Rpb24gcCB7XG4gICAgZ3JpZC1jb2x1bW46IDEgLyAtMTtcbiAgICBtYXJnaW46IDA7XG59XG5cbi5zZXR0aW5ncy1jb250YWluZXIgaDIge1xuICAgIG1hcmdpbi10b3A6IDA7XG4gICAgbWFyZ2luLWJvdHRvbTogMjBweDtcbn1cblxuLnNldHRpbmdzLWNvbnRyb2wge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZ2FwOiA1cHg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuLnNldHRpbmdzLWNvbnRyb2wgaW5wdXRbdHlwZT1cIm51bWJlclwiXSB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgbWluLXdpZHRoOiA4MHB4O1xufVxuXG4uc2V0dGluZ3MtbGFiZWwge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuLnNkcHBwLW1lbnUtd29ya2Zsb3ctZWRpdC13cmFwIHtcbiAgICBmb250LXNpemU6IDEycHg7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xufVxuXG4uc2RwcHAtbWVudS13b3JrZmxvdy1lZGl0LXdyYXAgcCB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgY29sb3I6IHZhcigtLWRlc2NyaXAtdGV4dClcbn1cblxuLndvcmtmbG93LWVkaXQtY29udGVudCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGdhcDogMTBweDtcbn1cbi53b3JrZmxvdy1lZGl0LWZpZWxkIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgd2lkdGg6IDEwMCU7XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA2MzlweCkge1xuICAgIC53b3JrZmxvdy1lZGl0LWNvbnRlbnQge1xuICAgICAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgb3ZlcmZsb3cteTogaGlkZGVuO1xuICAgICAgICBvdmVyZmxvdy14OiBzY3JvbGw7XG4gICAgfVxuICAgIC53b3JrZmxvdy1lZGl0LWZpZWxkIHtcbiAgICAgICAgbWF4LXdpZHRoOiAzMjBweDtcbiAgICB9XG59XG5cbi53b3JrZmxvdy1lZGl0LWZpZWxkLXRpdGxlIHtcbiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IpO1xuICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICBib3JkZXItbGVmdDogNHB4IHNvbGlkIHJnYmEoMTI3LCAxMjcsIDEyNywgLjQpO1xuICAgIHBhZGRpbmc6IDJweCAycHggMnB4IDVweDtcbiAgICBtYXJnaW46IDNweCAwO1xuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xufVxuXG4ud29ya2Zsb3ctZWRpdC1maWVsZCB7XG4gICAgY29sb3I6IHZhcigtLWZnLWNvbG9yKTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgZmxleC13cmFwOiB3cmFwO1xuICAgIGdhcDogNXB4O1xufVxuXG4uc2RwcHAtc2lkZS1pY29uIHtcbiAgICB3aWR0aDogNjRweDtcbiAgICBoZWlnaHQ6IDY0cHg7XG4gICAgbWFzay1pbWFnZTogdXJsKFwiLi9zZC1wcHAtc3RhdGljL3NkcHBwLWljb24uc3ZnXCIpO1xuICAgIG1hc2stc2l6ZTogMzZweDtcbiAgICBtYXNrLXBvc2l0aW9uOiBjZW50ZXI7XG4gICAgbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjdXJyZW50Q29sb3I7XG59XG4uc2RwcHAtc2lkZS1jb250YWluZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHBhZGRpbmctdG9wOiAzMnB4O1xufVxuLnNkcHBwLXNpZGUtY29udGFpbmVyIC5zZHBwcC1zaWRlLWhlYWRlciB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgZ2FwOiAxMHB4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbn1cbi5zZHBwcC1zaWRlLWNvbnRhaW5lciAuc2RwcHAtc2lkZS1oZWFkZXIgYnV0dG9uIHtcbiAgICB3aWR0aDogMzJweDtcbiAgICBoZWlnaHQ6IDMycHg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yKTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG59XG4uc2RwcHAtcGhvdG9zaG9wLWljb24ge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChcImh0dHBzOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvYS9hZi9BZG9iZV9QaG90b3Nob3BfQ0NfaWNvbi5zdmdcIik7XG59XG4uc2RwcHAtcHJlbWllcmUtaWNvbiB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiaHR0cHM6Ly91cGxvYWQud2lraW1lZGlhLm9yZy93aWtpcGVkaWEvY29tbW9ucy80LzQwL0Fkb2JlX1ByZW1pZXJlX1Byb19DQ19pY29uLnN2Z1wiKTtcbn1cbiIsICIvLyBAdHMtaWdub3JlXG5pbXBvcnQgY3NzVGV4dCBmcm9tIFwiLi4vQ29tZnlQb3B1cC5jc3NcIlxuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFNldHRpbmdzIGZyb20gXCIuL1NldHRpbmdzXCI7XG5pbXBvcnQgeyBXb3JrZmxvd0VkaXRXcmFwIH0gZnJvbSBcIi4vV29ya2Zsb3dFZGl0V2ViXCI7XG5pbXBvcnQgeyBDb25maWdQcm92aWRlciB9IGZyb20gJ2FudGQnO1xuaW1wb3J0IHsgQ2xvc2VPdXRsaW5lZCB9IGZyb20gXCJAYW50LWRlc2lnbi9pY29uc1wiO1xuaW1wb3J0IGkxOG4gZnJvbSBcIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21tb24vaTE4bi5tdHNcIjtcbnZhciBkb2NTdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG5kb2NTdHlsZS5pbm5lckhUTUwgPSBjc3NUZXh0O1xuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChkb2NTdHlsZSk7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIENvbWZ5UG9wdXAoeyBvbkNsb3NlLCB0YWIgfTogeyBvbkNsb3NlOiAoKSA9PiB2b2lkLCB0YWI6IHN0cmluZyB9KSB7XG4gICAgY29uc3QgW190YWIsIHNldFRhYl0gPSB1c2VTdGF0ZSgnMScpO1xuICAgIGNvbnN0IFtzaWRlYmFyV2lkdGgsIHNldFNpZGViYXJXaWR0aF0gPSB1c2VTdGF0ZSgwKTtcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBzZXRUYWIodGFiKTtcbiAgICB9LCBbdGFiXSk7XG4gICAgXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgY29uc3QgJGNhbnZhcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdncmFwaC1jYW52YXMnKTtcbiAgICAgICAgbGV0IGZyYW1lQ291bnQgPSAwO1xuICAgICAgICBsZXQgYW5pbWF0aW9uRnJhbWVJZDogbnVtYmVyO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgdXBkYXRlRGltZW5zaW9ucyA9ICgpID0+IHtcbiAgICAgICAgICAgIGZyYW1lQ291bnQrKztcbiAgICAgICAgICAgIGlmIChmcmFtZUNvdW50ICUgMyA9PT0gMCAmJiAkY2FudmFzKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2lkZUJhciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zaWRlLWJhci1wYW5lbCcpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChzaWRlQmFyICYmIHNpZGVCYXIuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldFNpZGViYXJXaWR0aChzaWRlQmFyLmNsaWVudFdpZHRoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzZXRTaWRlYmFyV2lkdGgoMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYW5pbWF0aW9uRnJhbWVJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh1cGRhdGVEaW1lbnNpb25zKTtcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIGFuaW1hdGlvbkZyYW1lSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodXBkYXRlRGltZW5zaW9ucyk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoYW5pbWF0aW9uRnJhbWVJZCk7XG4gICAgICAgIH07XG4gICAgfSwgW10pO1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPENvbmZpZ1Byb3ZpZGVyXG4gICAgICAgICAgICB0aGVtZT17e1xuICAgICAgICAgICAgICAgIHRva2VuOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbG9yVGV4dDogJ3ZhcigtLWZnLWNvbG9yKScsXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yQmdDb250YWluZXI6ICd2YXIoLS1jb21meS1pbnB1dC1iZyknLFxuICAgICAgICAgICAgICAgICAgICBjb2xvckJnRWxldmF0ZWQ6ICd2YXIoLS1jb21meS1pbnB1dC1iZyknLFxuICAgICAgICAgICAgICAgICAgICBjb2xvckZpbGxTZWNvbmRhcnk6ICd2YXIoLS1jb21meS1pbnB1dC1iZyknLFxuICAgICAgICAgICAgICAgICAgICBjb250cm9sSXRlbUJnSG92ZXI6ICd2YXIoLS1jb21meS1pbnB1dC1iZyknLFxuICAgICAgICAgICAgICAgICAgICBjb2xvckJnVGV4dEhvdmVyOiAndmFyKC0tY29tZnktaW5wdXQtYmcpJyxcbiAgICAgICAgICAgICAgICAgICAgY29sb3JCb3JkZXI6ICd2YXIoLS1wLWlucHV0dGV4dC1ib3JkZXItY29sb3IpJyxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNkcHBwLW1lbnUtY29udGFpbmVyXCIgc3R5bGU9e3sgXG4gICAgICAgICAgICAgICAgcGFkZGluZ0xlZnQ6IHNpZGViYXJXaWR0aFxuICAgICAgICAgICAgfX0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzZHBwcC1tZW51LWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNkcHBwLW1lbnUtaGVhZGVyLWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gb25DbGljaz17KCkgPT4gc2V0VGFiKCcxJyl9IGNsYXNzTmFtZT17X3RhYiA9PT0gJzEnID8gJ2FjdGl2ZScgOiAnJ30+e2kxOG4oXCJTaW1wbGlmeSBXb3JrZmxvd1wiKX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gb25DbGljaz17KCkgPT4gc2V0VGFiKCcyJyl9IGNsYXNzTmFtZT17X3RhYiA9PT0gJzInID8gJ2FjdGl2ZScgOiAnJ30+e2kxOG4oXCJQaG90b3Nob3BcIil9PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5Qb3dlcmVkIGJ5IFNEUFBQPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT1cInNkcHBwLW1lbnUtY2xvc2UtYnV0dG9uXCIgb25DbGljaz17b25DbG9zZX0+PENsb3NlT3V0bGluZWQgLz48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNkcHBwLW1lbnUtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNkcHBwLW1lbnUtd29ya2Zsb3ctZWRpdC13cmFwXCIgc3R5bGU9e3sgZGlzcGxheTogX3RhYiA9PT0gJzEnID8gJ2Jsb2NrJyA6ICdub25lJyB9fT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxXb3JrZmxvd0VkaXRXcmFwIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNkcHBwLW1lbnUtc2V0dGluZ3Mtd3JhcFwiIHN0eWxlPXt7IGRpc3BsYXk6IF90YWIgPT09ICcyJyA/ICdibG9jaycgOiAnbm9uZScgfX0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8U2V0dGluZ3MgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9Db25maWdQcm92aWRlcj5cbiAgICApO1xufSIsICJpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHBhZ2VTdG9yZSB9IGZyb20gXCIuLi8uLi8uLi9waG90b3Nob3BNb2RlbHMubXRzXCI7XG5pbXBvcnQgaTE4biBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbW1vbi9pMThuLm10c1wiO1xuaW1wb3J0IHsgYXBpIH0gZnJvbSBcIi4uLy4uL2NvbWZ5LWdsb2JhbHMubXRzXCI7XG5pbXBvcnQgeyBDaGVja2JveCB9IGZyb20gXCJhbnRkXCI7XG5cbmNvbnN0IFNldHRpbmdzOiBSZWFjdC5GQyA9ICgpID0+IHtcbiAgICBjb25zdCBbdXNlU2xpZGVyRm9yTnVtYmVyV2lkZ2V0LCBzZXRVc2VTbGlkZXJGb3JOdW1iZXJXaWRnZXRdID0gdXNlU3RhdGUocGFnZVN0b3JlLmRhdGEudXNlU2xpZGVyRm9yTnVtYmVyV2lkZ2V0KTtcbiAgICBjb25zdCBoYW5kbGVEb3dubG9hZFBsdWdpbiA9ICgpID0+IHtcbiAgICAgICAgbG9jYXRpb24uaHJlZiA9IFwiL3NkLXBwcC1zdGF0aWMvc2QtcHBwX1BTLmNjeD9fPVwiICsgRGF0ZS5ub3coKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzZXR0aW5ncy1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxoMj57aTE4bihcIlNEUFBQIFNldHRpbmdzL01pc2NcIil9PC9oMj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzZXR0aW5ncy1zZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzZXR0aW5ncy1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e2kxOG4oXCJDb21meSBVUkwgKFlvdSBjYW4gY29weSBpdCB0byBjb25uZWN0IENvbWZ5VUkgaW4gdGhlIHBsdWdpbik6XCIpfTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzZXR0aW5ncy1jb250cm9sXCI+XG4gICAgICAgICAgICAgICAgICAgIHtsb2NhdGlvbi5ocmVmLnNwbGl0KFwiP1wiKVswXS5zcGxpdChcIiNcIilbMF19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzZXR0aW5ncy1zZWN0aW9uIHNldHRpbmdzLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic2V0dGluZ3MtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPntpMThuKFwiUGhvdG9zaG9wIHBsdWdpblwiKX08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic2V0dGluZ3MtY29udHJvbFwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG9uQ2xpY2s9e2hhbmRsZURvd25sb2FkUGx1Z2lufSBjbGFzc05hbWU9XCJkb3dubG9hZC1idXR0b25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtpMThuKFwiRG93bmxvYWRcIil9XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic2V0dGluZ3Mtc2VjdGlvbiBzZXR0aW5ncy1yb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNldHRpbmdzLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBodG1sRm9yPVwibWF4SW1hZ2VTaXplXCI+e2kxOG4oXCJ1c2Ugc2xpZGVyIGZvciBudW1iZXIgd2lkZ2V0OlwiKX08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic2V0dGluZ3MtY29udHJvbFwiPlxuICAgICAgICAgICAgICAgICAgICA8Q2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwidXNlU2xpZGVyRm9yTnVtYmVyV2lkZ2V0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e3VzZVNsaWRlckZvck51bWJlcldpZGdldH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRVc2VTbGlkZXJGb3JOdW1iZXJXaWRnZXQoZXZlbnQudGFyZ2V0LmNoZWNrZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VTdG9yZS5zZXRVc2VTbGlkZXJGb3JOdW1iZXJXaWRnZXQoZXZlbnQudGFyZ2V0LmNoZWNrZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaS5zdG9yZVNldHRpbmcoJ3NkcHBwLnVzZVNsaWRlckZvck51bWJlcldpZGdldCcsIGV2ZW50LnRhcmdldC5jaGVja2VkKVxuICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgU2V0dGluZ3M7IiwgImZ1bmN0aW9uIF9leHRlbmRzKCkge1xuICByZXR1cm4gX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAobikge1xuICAgIGZvciAodmFyIGUgPSAxOyBlIDwgYXJndW1lbnRzLmxlbmd0aDsgZSsrKSB7XG4gICAgICB2YXIgdCA9IGFyZ3VtZW50c1tlXTtcbiAgICAgIGZvciAodmFyIHIgaW4gdCkgKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIHIpICYmIChuW3JdID0gdFtyXSk7XG4gICAgfVxuICAgIHJldHVybiBuO1xuICB9LCBfZXh0ZW5kcy5hcHBseShudWxsLCBhcmd1bWVudHMpO1xufVxuZXhwb3J0IHsgX2V4dGVuZHMgYXMgZGVmYXVsdCB9OyIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0b0FycmF5IGZyb20gXCJyYy11dGlsL2VzL0NoaWxkcmVuL3RvQXJyYXlcIjtcbmltcG9ydCB7IHdhcm5pbmcgfSBmcm9tIFwicmMtdXRpbC9lcy93YXJuaW5nXCI7XG5pbXBvcnQgU2luZ2xlT2JzZXJ2ZXIgZnJvbSBcIi4vU2luZ2xlT2JzZXJ2ZXJcIjtcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tIFwiLi9Db2xsZWN0aW9uXCI7XG52YXIgSU5URVJOQUxfUFJFRklYX0tFWSA9ICdyYy1vYnNlcnZlci1rZXknO1xuaW1wb3J0IHsgX3JzIH0gZnJvbSBcIi4vdXRpbHMvb2JzZXJ2ZXJVdGlsXCI7XG5leHBvcnQgeyAvKiogQHByaXZhdGUgVGVzdCBvbmx5IGZvciBtb2NrIHRyaWdnZXIgcmVzaXplIGV2ZW50ICovXG5fcnMgfTtcbmZ1bmN0aW9uIFJlc2l6ZU9ic2VydmVyKHByb3BzLCByZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW47XG4gIHZhciBjaGlsZE5vZGVzID0gdHlwZW9mIGNoaWxkcmVuID09PSAnZnVuY3Rpb24nID8gW2NoaWxkcmVuXSA6IHRvQXJyYXkoY2hpbGRyZW4pO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmIChjaGlsZE5vZGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHdhcm5pbmcoZmFsc2UsICdGaW5kIG1vcmUgdGhhbiBvbmUgY2hpbGQgbm9kZSB3aXRoIGBjaGlsZHJlbmAgaW4gUmVzaXplT2JzZXJ2ZXIuIFBsZWFzZSB1c2UgUmVzaXplT2JzZXJ2ZXIuQ29sbGVjdGlvbiBpbnN0ZWFkLicpO1xuICAgIH0gZWxzZSBpZiAoY2hpbGROb2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHdhcm5pbmcoZmFsc2UsICdgY2hpbGRyZW5gIG9mIFJlc2l6ZU9ic2VydmVyIGlzIGVtcHR5LiBOb3RoaW5nIGlzIGluIG9ic2VydmUuJyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBjaGlsZE5vZGVzLm1hcChmdW5jdGlvbiAoY2hpbGQsIGluZGV4KSB7XG4gICAgdmFyIGtleSA9IChjaGlsZCA9PT0gbnVsbCB8fCBjaGlsZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2hpbGQua2V5KSB8fCBcIlwiLmNvbmNhdChJTlRFUk5BTF9QUkVGSVhfS0VZLCBcIi1cIikuY29uY2F0KGluZGV4KTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU2luZ2xlT2JzZXJ2ZXIsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgICAga2V5OiBrZXksXG4gICAgICByZWY6IGluZGV4ID09PSAwID8gcmVmIDogdW5kZWZpbmVkXG4gICAgfSksIGNoaWxkKTtcbiAgfSk7XG59XG52YXIgUmVmUmVzaXplT2JzZXJ2ZXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihSZXNpemVPYnNlcnZlcik7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBSZWZSZXNpemVPYnNlcnZlci5kaXNwbGF5TmFtZSA9ICdSZXNpemVPYnNlcnZlcic7XG59XG5SZWZSZXNpemVPYnNlcnZlci5Db2xsZWN0aW9uID0gQ29sbGVjdGlvbjtcbmV4cG9ydCBkZWZhdWx0IFJlZlJlc2l6ZU9ic2VydmVyOyIsICJmdW5jdGlvbiBfdHlwZW9mKG8pIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG8pIHtcbiAgICByZXR1cm4gdHlwZW9mIG87XG4gIH0gOiBmdW5jdGlvbiAobykge1xuICAgIHJldHVybiBvICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG8uY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvO1xuICB9LCBfdHlwZW9mKG8pO1xufVxuZXhwb3J0IHsgX3R5cGVvZiBhcyBkZWZhdWx0IH07IiwgImltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbnZhciBSRUFDVF9FTEVNRU5UX1RZUEVfMTggPSBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50Jyk7XG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFXzE5ID0gU3ltYm9sLmZvcigncmVhY3QudHJhbnNpdGlvbmFsLmVsZW1lbnQnKTtcbnZhciBSRUFDVF9GUkFHTUVOVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZnJhZ21lbnQnKTtcblxuLyoqXG4gKiBDb21wYXRpYmxlIHdpdGggUmVhY3QgMTggb3IgMTkgdG8gY2hlY2sgaWYgbm9kZSBpcyBhIEZyYWdtZW50LlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0ZyYWdtZW50KG9iamVjdCkge1xuICByZXR1cm4gKFxuICAgIC8vIEJhc2Ugb2JqZWN0IHR5cGVcbiAgICBvYmplY3QgJiYgX3R5cGVvZihvYmplY3QpID09PSAnb2JqZWN0JyAmJiAoXG4gICAgLy8gUmVhY3QgRWxlbWVudCB0eXBlXG4gICAgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEVfMTggfHwgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEVfMTkpICYmXG4gICAgLy8gUmVhY3QgRnJhZ21lbnQgdHlwZVxuICAgIG9iamVjdC50eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFXG4gICk7XG59IiwgImltcG9ydCBpc0ZyYWdtZW50IGZyb20gXCIuLi9SZWFjdC9pc0ZyYWdtZW50XCI7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdG9BcnJheShjaGlsZHJlbikge1xuICB2YXIgb3B0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgdmFyIHJldCA9IFtdO1xuICBSZWFjdC5DaGlsZHJlbi5mb3JFYWNoKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICBpZiAoKGNoaWxkID09PSB1bmRlZmluZWQgfHwgY2hpbGQgPT09IG51bGwpICYmICFvcHRpb24ua2VlcEVtcHR5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkKSkge1xuICAgICAgcmV0ID0gcmV0LmNvbmNhdCh0b0FycmF5KGNoaWxkKSk7XG4gICAgfSBlbHNlIGlmIChpc0ZyYWdtZW50KGNoaWxkKSAmJiBjaGlsZC5wcm9wcykge1xuICAgICAgcmV0ID0gcmV0LmNvbmNhdCh0b0FycmF5KGNoaWxkLnByb3BzLmNoaWxkcmVuLCBvcHRpb24pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0LnB1c2goY2hpbGQpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXQ7XG59IiwgIi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbnZhciB3YXJuZWQgPSB7fTtcbnZhciBwcmVXYXJuaW5nRm5zID0gW107XG5cbi8qKlxuICogUHJlIHdhcm5pbmcgZW5hYmxlIHlvdSB0byBwYXJzZSBjb250ZW50IGJlZm9yZSBjb25zb2xlLmVycm9yLlxuICogTW9kaWZ5IHRvIG51bGwgd2lsbCBwcmV2ZW50IHdhcm5pbmcuXG4gKi9cbmV4cG9ydCB2YXIgcHJlTWVzc2FnZSA9IGZ1bmN0aW9uIHByZU1lc3NhZ2UoZm4pIHtcbiAgcHJlV2FybmluZ0Zucy5wdXNoKGZuKTtcbn07XG5cbi8qKlxuICogV2FybmluZyBpZiBjb25kaXRpb24gbm90IG1hdGNoLlxuICogQHBhcmFtIHZhbGlkIENvbmRpdGlvblxuICogQHBhcmFtIG1lc3NhZ2UgV2FybmluZyBtZXNzYWdlXG4gKiBAZXhhbXBsZVxuICogYGBganNcbiAqIHdhcm5pbmcoZmFsc2UsICdzb21lIGVycm9yJyk7IC8vIHByaW50IHNvbWUgZXJyb3JcbiAqIHdhcm5pbmcodHJ1ZSwgJ3NvbWUgZXJyb3InKTsgLy8gcHJpbnQgbm90aGluZ1xuICogd2FybmluZygxID09PSAyLCAnc29tZSBlcnJvcicpOyAvLyBwcmludCBzb21lIGVycm9yXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdhcm5pbmcodmFsaWQsIG1lc3NhZ2UpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIXZhbGlkICYmIGNvbnNvbGUgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBmaW5hbE1lc3NhZ2UgPSBwcmVXYXJuaW5nRm5zLnJlZHVjZShmdW5jdGlvbiAobXNnLCBwcmVNZXNzYWdlRm4pIHtcbiAgICAgIHJldHVybiBwcmVNZXNzYWdlRm4obXNnICE9PSBudWxsICYmIG1zZyAhPT0gdm9pZCAwID8gbXNnIDogJycsICd3YXJuaW5nJyk7XG4gICAgfSwgbWVzc2FnZSk7XG4gICAgaWYgKGZpbmFsTWVzc2FnZSkge1xuICAgICAgY29uc29sZS5lcnJvcihcIldhcm5pbmc6IFwiLmNvbmNhdChmaW5hbE1lc3NhZ2UpKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIEBzZWUgU2ltaWxhciB0byB7QGxpbmsgd2FybmluZ30gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3RlKHZhbGlkLCBtZXNzYWdlKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICF2YWxpZCAmJiBjb25zb2xlICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgZmluYWxNZXNzYWdlID0gcHJlV2FybmluZ0Zucy5yZWR1Y2UoZnVuY3Rpb24gKG1zZywgcHJlTWVzc2FnZUZuKSB7XG4gICAgICByZXR1cm4gcHJlTWVzc2FnZUZuKG1zZyAhPT0gbnVsbCAmJiBtc2cgIT09IHZvaWQgMCA/IG1zZyA6ICcnLCAnbm90ZScpO1xuICAgIH0sIG1lc3NhZ2UpO1xuICAgIGlmIChmaW5hbE1lc3NhZ2UpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIk5vdGU6IFwiLmNvbmNhdChmaW5hbE1lc3NhZ2UpKTtcbiAgICB9XG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiByZXNldFdhcm5lZCgpIHtcbiAgd2FybmVkID0ge307XG59XG5leHBvcnQgZnVuY3Rpb24gY2FsbChtZXRob2QsIHZhbGlkLCBtZXNzYWdlKSB7XG4gIGlmICghdmFsaWQgJiYgIXdhcm5lZFttZXNzYWdlXSkge1xuICAgIG1ldGhvZChmYWxzZSwgbWVzc2FnZSk7XG4gICAgd2FybmVkW21lc3NhZ2VdID0gdHJ1ZTtcbiAgfVxufVxuXG4vKiogQHNlZSBTYW1lIGFzIHtAbGluayB3YXJuaW5nfSwgYnV0IG9ubHkgd2FybiBvbmNlIGZvciB0aGUgc2FtZSBtZXNzYWdlICovXG5leHBvcnQgZnVuY3Rpb24gd2FybmluZ09uY2UodmFsaWQsIG1lc3NhZ2UpIHtcbiAgY2FsbCh3YXJuaW5nLCB2YWxpZCwgbWVzc2FnZSk7XG59XG5cbi8qKiBAc2VlIFNhbWUgYXMge0BsaW5rIHdhcm5pbmd9LCBidXQgb25seSB3YXJuIG9uY2UgZm9yIHRoZSBzYW1lIG1lc3NhZ2UgKi9cbmV4cG9ydCBmdW5jdGlvbiBub3RlT25jZSh2YWxpZCwgbWVzc2FnZSkge1xuICBjYWxsKG5vdGUsIHZhbGlkLCBtZXNzYWdlKTtcbn1cbndhcm5pbmdPbmNlLnByZU1lc3NhZ2UgPSBwcmVNZXNzYWdlO1xud2FybmluZ09uY2UucmVzZXRXYXJuZWQgPSByZXNldFdhcm5lZDtcbndhcm5pbmdPbmNlLm5vdGVPbmNlID0gbm90ZU9uY2U7XG5leHBvcnQgZGVmYXVsdCB3YXJuaW5nT25jZTsiLCAiaW1wb3J0IF90eXBlb2YgZnJvbSBcIi4vdHlwZW9mLmpzXCI7XG5mdW5jdGlvbiB0b1ByaW1pdGl2ZSh0LCByKSB7XG4gIGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YodCkgfHwgIXQpIHJldHVybiB0O1xuICB2YXIgZSA9IHRbU3ltYm9sLnRvUHJpbWl0aXZlXTtcbiAgaWYgKHZvaWQgMCAhPT0gZSkge1xuICAgIHZhciBpID0gZS5jYWxsKHQsIHIgfHwgXCJkZWZhdWx0XCIpO1xuICAgIGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YoaSkpIHJldHVybiBpO1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTtcbiAgfVxuICByZXR1cm4gKFwic3RyaW5nXCIgPT09IHIgPyBTdHJpbmcgOiBOdW1iZXIpKHQpO1xufVxuZXhwb3J0IHsgdG9QcmltaXRpdmUgYXMgZGVmYXVsdCB9OyIsICJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiLi90eXBlb2YuanNcIjtcbmltcG9ydCB0b1ByaW1pdGl2ZSBmcm9tIFwiLi90b1ByaW1pdGl2ZS5qc1wiO1xuZnVuY3Rpb24gdG9Qcm9wZXJ0eUtleSh0KSB7XG4gIHZhciBpID0gdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7XG4gIHJldHVybiBcInN5bWJvbFwiID09IF90eXBlb2YoaSkgPyBpIDogaSArIFwiXCI7XG59XG5leHBvcnQgeyB0b1Byb3BlcnR5S2V5IGFzIGRlZmF1bHQgfTsiLCAiaW1wb3J0IHRvUHJvcGVydHlLZXkgZnJvbSBcIi4vdG9Qcm9wZXJ0eUtleS5qc1wiO1xuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KGUsIHIsIHQpIHtcbiAgcmV0dXJuIChyID0gdG9Qcm9wZXJ0eUtleShyKSkgaW4gZSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCByLCB7XG4gICAgdmFsdWU6IHQsXG4gICAgZW51bWVyYWJsZTogITAsXG4gICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICB3cml0YWJsZTogITBcbiAgfSkgOiBlW3JdID0gdCwgZTtcbn1cbmV4cG9ydCB7IF9kZWZpbmVQcm9wZXJ0eSBhcyBkZWZhdWx0IH07IiwgImltcG9ydCBkZWZpbmVQcm9wZXJ0eSBmcm9tIFwiLi9kZWZpbmVQcm9wZXJ0eS5qc1wiO1xuZnVuY3Rpb24gb3duS2V5cyhlLCByKSB7XG4gIHZhciB0ID0gT2JqZWN0LmtleXMoZSk7XG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIG8gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO1xuICAgIHIgJiYgKG8gPSBvLmZpbHRlcihmdW5jdGlvbiAocikge1xuICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgcikuZW51bWVyYWJsZTtcbiAgICB9KSksIHQucHVzaC5hcHBseSh0LCBvKTtcbiAgfVxuICByZXR1cm4gdDtcbn1cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQyKGUpIHtcbiAgZm9yICh2YXIgciA9IDE7IHIgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspIHtcbiAgICB2YXIgdCA9IG51bGwgIT0gYXJndW1lbnRzW3JdID8gYXJndW1lbnRzW3JdIDoge307XG4gICAgciAlIDIgPyBvd25LZXlzKE9iamVjdCh0KSwgITApLmZvckVhY2goZnVuY3Rpb24gKHIpIHtcbiAgICAgIGRlZmluZVByb3BlcnR5KGUsIHIsIHRbcl0pO1xuICAgIH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSkgOiBvd25LZXlzKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbiAocikge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgcikpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBlO1xufVxuZXhwb3J0IHsgX29iamVjdFNwcmVhZDIgYXMgZGVmYXVsdCB9OyIsICJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5leHBvcnQgZnVuY3Rpb24gaXNET00obm9kZSkge1xuICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudFxuICAvLyBTaW5jZSBYVUxFbGVtZW50IGlzIGFsc28gc3ViY2xhc3Mgb2YgRWxlbWVudCwgd2Ugb25seSBuZWVkIEhUTUxFbGVtZW50IGFuZCBTVkdFbGVtZW50XG4gIHJldHVybiBub2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQ7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIGEgRE9NIG5vZGUgdmlhIGEgcmVmLCBhbmQgZG9lcyBub3QgaW52b2tlIGBmaW5kRE9NTm9kZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRET00obm9kZSkge1xuICBpZiAobm9kZSAmJiBfdHlwZW9mKG5vZGUpID09PSAnb2JqZWN0JyAmJiBpc0RPTShub2RlLm5hdGl2ZUVsZW1lbnQpKSB7XG4gICAgcmV0dXJuIG5vZGUubmF0aXZlRWxlbWVudDtcbiAgfVxuICBpZiAoaXNET00obm9kZSkpIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBSZXR1cm4gaWYgYSBub2RlIGlzIGEgRE9NIG5vZGUuIEVsc2Ugd2lsbCByZXR1cm4gYnkgYGZpbmRET01Ob2RlYFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBmaW5kRE9NTm9kZShub2RlKSB7XG4gIHZhciBkb21Ob2RlID0gZ2V0RE9NKG5vZGUpO1xuICBpZiAoZG9tTm9kZSkge1xuICAgIHJldHVybiBkb21Ob2RlO1xuICB9XG4gIGlmIChub2RlIGluc3RhbmNlb2YgUmVhY3QuQ29tcG9uZW50KSB7XG4gICAgdmFyIF9SZWFjdERPTSRmaW5kRE9NTm9kZTtcbiAgICByZXR1cm4gKF9SZWFjdERPTSRmaW5kRE9NTm9kZSA9IFJlYWN0RE9NLmZpbmRET01Ob2RlKSA9PT0gbnVsbCB8fCBfUmVhY3RET00kZmluZERPTU5vZGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9SZWFjdERPTSRmaW5kRE9NTm9kZS5jYWxsKFJlYWN0RE9NLCBub2RlKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn0iLCAiaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IHsgaXNWYWxpZEVsZW1lbnQsIHZlcnNpb24gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBGb3J3YXJkUmVmLCBpc01lbW8gfSBmcm9tICdyZWFjdC1pcyc7XG5pbXBvcnQgdXNlTWVtbyBmcm9tIFwiLi9ob29rcy91c2VNZW1vXCI7XG5pbXBvcnQgaXNGcmFnbWVudCBmcm9tIFwiLi9SZWFjdC9pc0ZyYWdtZW50XCI7XG52YXIgUmVhY3RNYWpvclZlcnNpb24gPSBOdW1iZXIodmVyc2lvbi5zcGxpdCgnLicpWzBdKTtcbmV4cG9ydCB2YXIgZmlsbFJlZiA9IGZ1bmN0aW9uIGZpbGxSZWYocmVmLCBub2RlKSB7XG4gIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmVmKG5vZGUpO1xuICB9IGVsc2UgaWYgKF90eXBlb2YocmVmKSA9PT0gJ29iamVjdCcgJiYgcmVmICYmICdjdXJyZW50JyBpbiByZWYpIHtcbiAgICByZWYuY3VycmVudCA9IG5vZGU7XG4gIH1cbn07XG5cbi8qKlxuICogTWVyZ2UgcmVmcyBpbnRvIG9uZSByZWYgZnVuY3Rpb24gdG8gc3VwcG9ydCByZWYgcGFzc2luZy5cbiAqL1xuZXhwb3J0IHZhciBjb21wb3NlUmVmID0gZnVuY3Rpb24gY29tcG9zZVJlZigpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHJlZnMgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgcmVmc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuICB2YXIgcmVmTGlzdCA9IHJlZnMuZmlsdGVyKEJvb2xlYW4pO1xuICBpZiAocmVmTGlzdC5sZW5ndGggPD0gMSkge1xuICAgIHJldHVybiByZWZMaXN0WzBdO1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiAobm9kZSkge1xuICAgIHJlZnMuZm9yRWFjaChmdW5jdGlvbiAocmVmKSB7XG4gICAgICBmaWxsUmVmKHJlZiwgbm9kZSk7XG4gICAgfSk7XG4gIH07XG59O1xuZXhwb3J0IHZhciB1c2VDb21wb3NlUmVmID0gZnVuY3Rpb24gdXNlQ29tcG9zZVJlZigpIHtcbiAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCByZWZzID0gbmV3IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgcmVmc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICB9XG4gIHJldHVybiB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gY29tcG9zZVJlZi5hcHBseSh2b2lkIDAsIHJlZnMpO1xuICB9LCByZWZzLCBmdW5jdGlvbiAocHJldiwgbmV4dCkge1xuICAgIHJldHVybiBwcmV2Lmxlbmd0aCAhPT0gbmV4dC5sZW5ndGggfHwgcHJldi5ldmVyeShmdW5jdGlvbiAocmVmLCBpKSB7XG4gICAgICByZXR1cm4gcmVmICE9PSBuZXh0W2ldO1xuICAgIH0pO1xuICB9KTtcbn07XG5leHBvcnQgdmFyIHN1cHBvcnRSZWYgPSBmdW5jdGlvbiBzdXBwb3J0UmVmKG5vZGVPckNvbXBvbmVudCkge1xuICB2YXIgX3R5cGUkcHJvdG90eXBlLCBfbm9kZU9yQ29tcG9uZW50JHByb3Q7XG4gIGlmICghbm9kZU9yQ29tcG9uZW50KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gUmVhY3QgMTkgbm8gbmVlZCBgZm9yd2FyZFJlZmAgYW55bW9yZS4gU28ganVzdCBwYXNzIGlmIGlzIGEgUmVhY3QgZWxlbWVudC5cbiAgaWYgKGlzUmVhY3RFbGVtZW50KG5vZGVPckNvbXBvbmVudCkgJiYgUmVhY3RNYWpvclZlcnNpb24gPj0gMTkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgdHlwZSA9IGlzTWVtbyhub2RlT3JDb21wb25lbnQpID8gbm9kZU9yQ29tcG9uZW50LnR5cGUudHlwZSA6IG5vZGVPckNvbXBvbmVudC50eXBlO1xuXG4gIC8vIEZ1bmN0aW9uIGNvbXBvbmVudCBub2RlXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyAmJiAhKChfdHlwZSRwcm90b3R5cGUgPSB0eXBlLnByb3RvdHlwZSkgIT09IG51bGwgJiYgX3R5cGUkcHJvdG90eXBlICE9PSB2b2lkIDAgJiYgX3R5cGUkcHJvdG90eXBlLnJlbmRlcikgJiYgdHlwZS4kJHR5cGVvZiAhPT0gRm9yd2FyZFJlZikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIENsYXNzIGNvbXBvbmVudFxuICBpZiAodHlwZW9mIG5vZGVPckNvbXBvbmVudCA9PT0gJ2Z1bmN0aW9uJyAmJiAhKChfbm9kZU9yQ29tcG9uZW50JHByb3QgPSBub2RlT3JDb21wb25lbnQucHJvdG90eXBlKSAhPT0gbnVsbCAmJiBfbm9kZU9yQ29tcG9uZW50JHByb3QgIT09IHZvaWQgMCAmJiBfbm9kZU9yQ29tcG9uZW50JHByb3QucmVuZGVyKSAmJiBub2RlT3JDb21wb25lbnQuJCR0eXBlb2YgIT09IEZvcndhcmRSZWYpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xuZnVuY3Rpb24gaXNSZWFjdEVsZW1lbnQobm9kZSkge1xuICByZXR1cm4gLyojX19QVVJFX18qL2lzVmFsaWRFbGVtZW50KG5vZGUpICYmICFpc0ZyYWdtZW50KG5vZGUpO1xufVxuZXhwb3J0IHZhciBzdXBwb3J0Tm9kZVJlZiA9IGZ1bmN0aW9uIHN1cHBvcnROb2RlUmVmKG5vZGUpIHtcbiAgcmV0dXJuIGlzUmVhY3RFbGVtZW50KG5vZGUpICYmIHN1cHBvcnRSZWYobm9kZSk7XG59O1xuXG4vKipcbiAqIEluIFJlYWN0IDE5LiBgcmVmYCBpcyBub3QgYSBwcm9wZXJ0eSBmcm9tIG5vZGUuXG4gKiBCdXQgYSBwcm9wZXJ0eSBmcm9tIGBwcm9wcy5yZWZgLlxuICogVG8gY2hlY2sgaWYgYHByb3BzLnJlZmAgZXhpc3Qgb3IgZmFsbGJhY2sgdG8gYHJlZmAuXG4gKi9cbmV4cG9ydCB2YXIgZ2V0Tm9kZVJlZiA9IGZ1bmN0aW9uIGdldE5vZGVSZWYobm9kZSkge1xuICBpZiAobm9kZSAmJiBpc1JlYWN0RWxlbWVudChub2RlKSkge1xuICAgIHZhciBlbGUgPSBub2RlO1xuXG4gICAgLy8gU291cmNlIGZyb206XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL211aS9tYXRlcmlhbC11aS9ibG9iL21hc3Rlci9wYWNrYWdlcy9tdWktdXRpbHMvc3JjL2dldFJlYWN0Tm9kZVJlZi9nZXRSZWFjdE5vZGVSZWYudHNcbiAgICByZXR1cm4gZWxlLnByb3BzLnByb3BlcnR5SXNFbnVtZXJhYmxlKCdyZWYnKSA/IGVsZS5wcm9wcy5yZWYgOiBlbGUucmVmO1xuICB9XG4gIHJldHVybiBudWxsO1xufTsiLCAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlTWVtbyhnZXRWYWx1ZSwgY29uZGl0aW9uLCBzaG91bGRVcGRhdGUpIHtcbiAgdmFyIGNhY2hlUmVmID0gUmVhY3QudXNlUmVmKHt9KTtcbiAgaWYgKCEoJ3ZhbHVlJyBpbiBjYWNoZVJlZi5jdXJyZW50KSB8fCBzaG91bGRVcGRhdGUoY2FjaGVSZWYuY3VycmVudC5jb25kaXRpb24sIGNvbmRpdGlvbikpIHtcbiAgICBjYWNoZVJlZi5jdXJyZW50LnZhbHVlID0gZ2V0VmFsdWUoKTtcbiAgICBjYWNoZVJlZi5jdXJyZW50LmNvbmRpdGlvbiA9IGNvbmRpdGlvbjtcbiAgfVxuICByZXR1cm4gY2FjaGVSZWYuY3VycmVudC52YWx1ZTtcbn0iLCAiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCBmaW5kRE9NTm9kZSBmcm9tIFwicmMtdXRpbC9lcy9Eb20vZmluZERPTU5vZGVcIjtcbmltcG9ydCB7IHN1cHBvcnRSZWYsIHVzZUNvbXBvc2VSZWYsIGdldE5vZGVSZWYgfSBmcm9tIFwicmMtdXRpbC9lcy9yZWZcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbGxlY3Rpb25Db250ZXh0IH0gZnJvbSBcIi4uL0NvbGxlY3Rpb25cIjtcbmltcG9ydCB7IG9ic2VydmUsIHVub2JzZXJ2ZSB9IGZyb20gXCIuLi91dGlscy9vYnNlcnZlclV0aWxcIjtcbmltcG9ydCBEb21XcmFwcGVyIGZyb20gXCIuL0RvbVdyYXBwZXJcIjtcbmZ1bmN0aW9uIFNpbmdsZU9ic2VydmVyKHByb3BzLCByZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZDtcbiAgdmFyIGVsZW1lbnRSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHZhciB3cmFwcGVyUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICB2YXIgb25Db2xsZWN0aW9uUmVzaXplID0gUmVhY3QudXNlQ29udGV4dChDb2xsZWN0aW9uQ29udGV4dCk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IENoaWxkcmVuID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgaXNSZW5kZXJQcm9wcyA9IHR5cGVvZiBjaGlsZHJlbiA9PT0gJ2Z1bmN0aW9uJztcbiAgdmFyIG1lcmdlZENoaWxkcmVuID0gaXNSZW5kZXJQcm9wcyA/IGNoaWxkcmVuKGVsZW1lbnRSZWYpIDogY2hpbGRyZW47XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU2l6ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgc2l6ZVJlZiA9IFJlYWN0LnVzZVJlZih7XG4gICAgd2lkdGg6IC0xLFxuICAgIGhlaWdodDogLTEsXG4gICAgb2Zmc2V0V2lkdGg6IC0xLFxuICAgIG9mZnNldEhlaWdodDogLTFcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVmID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgY2FuUmVmID0gIWlzUmVuZGVyUHJvcHMgJiYgLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KG1lcmdlZENoaWxkcmVuKSAmJiBzdXBwb3J0UmVmKG1lcmdlZENoaWxkcmVuKTtcbiAgdmFyIG9yaWdpblJlZiA9IGNhblJlZiA/IGdldE5vZGVSZWYobWVyZ2VkQ2hpbGRyZW4pIDogbnVsbDtcbiAgdmFyIG1lcmdlZFJlZiA9IHVzZUNvbXBvc2VSZWYob3JpZ2luUmVmLCBlbGVtZW50UmVmKTtcbiAgdmFyIGdldERvbSA9IGZ1bmN0aW9uIGdldERvbSgpIHtcbiAgICB2YXIgX2VsZW1lbnRSZWYkY3VycmVudDtcbiAgICByZXR1cm4gZmluZERPTU5vZGUoZWxlbWVudFJlZi5jdXJyZW50KSB8fCAoXG4gICAgLy8gU3VwcG9ydCBgbmF0aXZlRWxlbWVudGAgZm9ybWF0XG4gICAgZWxlbWVudFJlZi5jdXJyZW50ICYmIF90eXBlb2YoZWxlbWVudFJlZi5jdXJyZW50KSA9PT0gJ29iamVjdCcgPyBmaW5kRE9NTm9kZSgoX2VsZW1lbnRSZWYkY3VycmVudCA9IGVsZW1lbnRSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2VsZW1lbnRSZWYkY3VycmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2VsZW1lbnRSZWYkY3VycmVudC5uYXRpdmVFbGVtZW50KSA6IG51bGwpIHx8IGZpbmRET01Ob2RlKHdyYXBwZXJSZWYuY3VycmVudCk7XG4gIH07XG4gIFJlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGdldERvbSgpO1xuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gT2JzZXJ2ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBwcm9wc1JlZiA9IFJlYWN0LnVzZVJlZihwcm9wcyk7XG4gIHByb3BzUmVmLmN1cnJlbnQgPSBwcm9wcztcblxuICAvLyBIYW5kbGVyXG4gIHZhciBvbkludGVybmFsUmVzaXplID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIHZhciBfcHJvcHNSZWYkY3VycmVudCA9IHByb3BzUmVmLmN1cnJlbnQsXG4gICAgICBvblJlc2l6ZSA9IF9wcm9wc1JlZiRjdXJyZW50Lm9uUmVzaXplLFxuICAgICAgZGF0YSA9IF9wcm9wc1JlZiRjdXJyZW50LmRhdGE7XG4gICAgdmFyIF90YXJnZXQkZ2V0Qm91bmRpbmdDbCA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgIHdpZHRoID0gX3RhcmdldCRnZXRCb3VuZGluZ0NsLndpZHRoLFxuICAgICAgaGVpZ2h0ID0gX3RhcmdldCRnZXRCb3VuZGluZ0NsLmhlaWdodDtcbiAgICB2YXIgb2Zmc2V0V2lkdGggPSB0YXJnZXQub2Zmc2V0V2lkdGgsXG4gICAgICBvZmZzZXRIZWlnaHQgPSB0YXJnZXQub2Zmc2V0SGVpZ2h0O1xuXG4gICAgLyoqXG4gICAgICogUmVzaXplIG9ic2VydmVyIHRyaWdnZXIgd2hlbiBjb250ZW50IHNpemUgY2hhbmdlZC5cbiAgICAgKiBJbiBtb3N0IGNhc2Ugd2UganVzdCBjYXJlIGFib3V0IGVsZW1lbnQgc2l6ZSxcbiAgICAgKiBsZXQncyB1c2UgYGJvdW5kYXJ5YCBpbnN0ZWFkIG9mIGBjb250ZW50UmVjdGAgaGVyZSB0byBhdm9pZCBzaGFraW5nLlxuICAgICAqL1xuICAgIHZhciBmaXhlZFdpZHRoID0gTWF0aC5mbG9vcih3aWR0aCk7XG4gICAgdmFyIGZpeGVkSGVpZ2h0ID0gTWF0aC5mbG9vcihoZWlnaHQpO1xuICAgIGlmIChzaXplUmVmLmN1cnJlbnQud2lkdGggIT09IGZpeGVkV2lkdGggfHwgc2l6ZVJlZi5jdXJyZW50LmhlaWdodCAhPT0gZml4ZWRIZWlnaHQgfHwgc2l6ZVJlZi5jdXJyZW50Lm9mZnNldFdpZHRoICE9PSBvZmZzZXRXaWR0aCB8fCBzaXplUmVmLmN1cnJlbnQub2Zmc2V0SGVpZ2h0ICE9PSBvZmZzZXRIZWlnaHQpIHtcbiAgICAgIHZhciBzaXplID0ge1xuICAgICAgICB3aWR0aDogZml4ZWRXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiBmaXhlZEhlaWdodCxcbiAgICAgICAgb2Zmc2V0V2lkdGg6IG9mZnNldFdpZHRoLFxuICAgICAgICBvZmZzZXRIZWlnaHQ6IG9mZnNldEhlaWdodFxuICAgICAgfTtcbiAgICAgIHNpemVSZWYuY3VycmVudCA9IHNpemU7XG5cbiAgICAgIC8vIElFIGlzIHN0cmFuZ2UsIHJpZ2h0P1xuICAgICAgdmFyIG1lcmdlZE9mZnNldFdpZHRoID0gb2Zmc2V0V2lkdGggPT09IE1hdGgucm91bmQod2lkdGgpID8gd2lkdGggOiBvZmZzZXRXaWR0aDtcbiAgICAgIHZhciBtZXJnZWRPZmZzZXRIZWlnaHQgPSBvZmZzZXRIZWlnaHQgPT09IE1hdGgucm91bmQoaGVpZ2h0KSA/IGhlaWdodCA6IG9mZnNldEhlaWdodDtcbiAgICAgIHZhciBzaXplSW5mbyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc2l6ZSksIHt9LCB7XG4gICAgICAgIG9mZnNldFdpZHRoOiBtZXJnZWRPZmZzZXRXaWR0aCxcbiAgICAgICAgb2Zmc2V0SGVpZ2h0OiBtZXJnZWRPZmZzZXRIZWlnaHRcbiAgICAgIH0pO1xuXG4gICAgICAvLyBMZXQgY29sbGVjdGlvbiBrbm93IHdoYXQgaGFwcGVuZWRcbiAgICAgIG9uQ29sbGVjdGlvblJlc2l6ZSA9PT0gbnVsbCB8fCBvbkNvbGxlY3Rpb25SZXNpemUgPT09IHZvaWQgMCB8fCBvbkNvbGxlY3Rpb25SZXNpemUoc2l6ZUluZm8sIHRhcmdldCwgZGF0YSk7XG4gICAgICBpZiAob25SZXNpemUpIHtcbiAgICAgICAgLy8gZGVmZXIgdGhlIGNhbGxiYWNrIGJ1dCBub3QgZGVmZXIgdG8gbmV4dCBmcmFtZVxuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBvblJlc2l6ZShzaXplSW5mbywgdGFyZ2V0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LCBbXSk7XG5cbiAgLy8gRHluYW1pYyBvYnNlcnZlXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGN1cnJlbnRFbGVtZW50ID0gZ2V0RG9tKCk7XG4gICAgaWYgKGN1cnJlbnRFbGVtZW50ICYmICFkaXNhYmxlZCkge1xuICAgICAgb2JzZXJ2ZShjdXJyZW50RWxlbWVudCwgb25JbnRlcm5hbFJlc2l6ZSk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdW5vYnNlcnZlKGN1cnJlbnRFbGVtZW50LCBvbkludGVybmFsUmVzaXplKTtcbiAgICB9O1xuICB9LCBbZWxlbWVudFJlZi5jdXJyZW50LCBkaXNhYmxlZF0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERvbVdyYXBwZXIsIHtcbiAgICByZWY6IHdyYXBwZXJSZWZcbiAgfSwgY2FuUmVmID8gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChtZXJnZWRDaGlsZHJlbiwge1xuICAgIHJlZjogbWVyZ2VkUmVmXG4gIH0pIDogbWVyZ2VkQ2hpbGRyZW4pO1xufVxudmFyIFJlZlNpbmdsZU9ic2VydmVyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoU2luZ2xlT2JzZXJ2ZXIpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgUmVmU2luZ2xlT2JzZXJ2ZXIuZGlzcGxheU5hbWUgPSAnU2luZ2xlT2JzZXJ2ZXInO1xufVxuZXhwb3J0IGRlZmF1bHQgUmVmU2luZ2xlT2JzZXJ2ZXI7IiwgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCB2YXIgQ29sbGVjdGlvbkNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbi8qKlxuICogQ29sbGVjdCBhbGwgdGhlIHJlc2l6ZSBldmVudCBmcm9tIGNoaWxkcmVuIFJlc2l6ZU9ic2VydmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2xsZWN0aW9uKF9yZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICBvbkJhdGNoUmVzaXplID0gX3JlZi5vbkJhdGNoUmVzaXplO1xuICB2YXIgcmVzaXplSWRSZWYgPSBSZWFjdC51c2VSZWYoMCk7XG4gIHZhciByZXNpemVJbmZvc1JlZiA9IFJlYWN0LnVzZVJlZihbXSk7XG4gIHZhciBvbkNvbGxlY3Rpb25SZXNpemUgPSBSZWFjdC51c2VDb250ZXh0KENvbGxlY3Rpb25Db250ZXh0KTtcbiAgdmFyIG9uUmVzaXplID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKHNpemUsIGVsZW1lbnQsIGRhdGEpIHtcbiAgICByZXNpemVJZFJlZi5jdXJyZW50ICs9IDE7XG4gICAgdmFyIGN1cnJlbnRJZCA9IHJlc2l6ZUlkUmVmLmN1cnJlbnQ7XG4gICAgcmVzaXplSW5mb3NSZWYuY3VycmVudC5wdXNoKHtcbiAgICAgIHNpemU6IHNpemUsXG4gICAgICBlbGVtZW50OiBlbGVtZW50LFxuICAgICAgZGF0YTogZGF0YVxuICAgIH0pO1xuICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGN1cnJlbnRJZCA9PT0gcmVzaXplSWRSZWYuY3VycmVudCkge1xuICAgICAgICBvbkJhdGNoUmVzaXplID09PSBudWxsIHx8IG9uQmF0Y2hSZXNpemUgPT09IHZvaWQgMCB8fCBvbkJhdGNoUmVzaXplKHJlc2l6ZUluZm9zUmVmLmN1cnJlbnQpO1xuICAgICAgICByZXNpemVJbmZvc1JlZi5jdXJyZW50ID0gW107XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBDb250aW51ZSBidWJibGluZyBpZiBwYXJlbnQgZXhpc3RcbiAgICBvbkNvbGxlY3Rpb25SZXNpemUgPT09IG51bGwgfHwgb25Db2xsZWN0aW9uUmVzaXplID09PSB2b2lkIDAgfHwgb25Db2xsZWN0aW9uUmVzaXplKHNpemUsIGVsZW1lbnQsIGRhdGEpO1xuICB9LCBbb25CYXRjaFJlc2l6ZSwgb25Db2xsZWN0aW9uUmVzaXplXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb2xsZWN0aW9uQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBvblJlc2l6ZVxuICB9LCBjaGlsZHJlbik7XG59IiwgIi8qKlxyXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2hpbXMgdGhhdCBwcm92aWRlIG1pbmltYWwgZnVuY3Rpb25hbGl0eSBvZiB0aGUgRVM2IGNvbGxlY3Rpb25zLlxyXG4gKlxyXG4gKiBUaGVzZSBpbXBsZW1lbnRhdGlvbnMgYXJlIG5vdCBtZWFudCB0byBiZSB1c2VkIG91dHNpZGUgb2YgdGhlIFJlc2l6ZU9ic2VydmVyXHJcbiAqIG1vZHVsZXMgYXMgdGhleSBjb3ZlciBvbmx5IGEgbGltaXRlZCByYW5nZSBvZiB1c2UgY2FzZXMuXHJcbiAqL1xyXG4vKiBlc2xpbnQtZGlzYWJsZSByZXF1aXJlLWpzZG9jLCB2YWxpZC1qc2RvYyAqL1xyXG52YXIgTWFwU2hpbSA9IChmdW5jdGlvbiAoKSB7XHJcbiAgICBpZiAodHlwZW9mIE1hcCAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICByZXR1cm4gTWFwO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGluZGV4IGluIHByb3ZpZGVkIGFycmF5IHRoYXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIGtleS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5PEFycmF5Pn0gYXJyXHJcbiAgICAgKiBAcGFyYW0geyp9IGtleVxyXG4gICAgICogQHJldHVybnMge251bWJlcn1cclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gZ2V0SW5kZXgoYXJyLCBrZXkpIHtcclxuICAgICAgICB2YXIgcmVzdWx0ID0gLTE7XHJcbiAgICAgICAgYXJyLnNvbWUoZnVuY3Rpb24gKGVudHJ5LCBpbmRleCkge1xyXG4gICAgICAgICAgICBpZiAoZW50cnlbMF0gPT09IGtleSkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gaW5kZXg7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuICAgIHJldHVybiAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgZnVuY3Rpb24gY2xhc3NfMSgpIHtcclxuICAgICAgICAgICAgdGhpcy5fX2VudHJpZXNfXyA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2xhc3NfMS5wcm90b3R5cGUsIFwic2l6ZVwiLCB7XHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX19lbnRyaWVzX18ubGVuZ3RoO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgICAgICB9KTtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcGFyYW0geyp9IGtleVxyXG4gICAgICAgICAqIEByZXR1cm5zIHsqfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNsYXNzXzEucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXkpIHtcclxuICAgICAgICAgICAgdmFyIGluZGV4ID0gZ2V0SW5kZXgodGhpcy5fX2VudHJpZXNfXywga2V5KTtcclxuICAgICAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy5fX2VudHJpZXNfX1tpbmRleF07XHJcbiAgICAgICAgICAgIHJldHVybiBlbnRyeSAmJiBlbnRyeVsxXTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwYXJhbSB7Kn0ga2V5XHJcbiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZVxyXG4gICAgICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNsYXNzXzEucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHZhciBpbmRleCA9IGdldEluZGV4KHRoaXMuX19lbnRyaWVzX18sIGtleSk7XHJcbiAgICAgICAgICAgIGlmICh+aW5kZXgpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX19lbnRyaWVzX19baW5kZXhdWzFdID0gdmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9fZW50cmllc19fLnB1c2goW2tleSwgdmFsdWVdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHBhcmFtIHsqfSBrZXlcclxuICAgICAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAgICAgKi9cclxuICAgICAgICBjbGFzc18xLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAoa2V5KSB7XHJcbiAgICAgICAgICAgIHZhciBlbnRyaWVzID0gdGhpcy5fX2VudHJpZXNfXztcclxuICAgICAgICAgICAgdmFyIGluZGV4ID0gZ2V0SW5kZXgoZW50cmllcywga2V5KTtcclxuICAgICAgICAgICAgaWYgKH5pbmRleCkge1xyXG4gICAgICAgICAgICAgICAgZW50cmllcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcGFyYW0geyp9IGtleVxyXG4gICAgICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNsYXNzXzEucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIChrZXkpIHtcclxuICAgICAgICAgICAgcmV0dXJuICEhfmdldEluZGV4KHRoaXMuX19lbnRyaWVzX18sIGtleSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAgICAgKi9cclxuICAgICAgICBjbGFzc18xLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5fX2VudHJpZXNfXy5zcGxpY2UoMCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xyXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW2N0eD1udWxsXVxyXG4gICAgICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNsYXNzXzEucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiAoY2FsbGJhY2ssIGN0eCkge1xyXG4gICAgICAgICAgICBpZiAoY3R4ID09PSB2b2lkIDApIHsgY3R4ID0gbnVsbDsgfVxyXG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gdGhpcy5fX2VudHJpZXNfXzsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBlbnRyeSA9IF9hW19pXTtcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwoY3R4LCBlbnRyeVsxXSwgZW50cnlbMF0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gY2xhc3NfMTtcclxuICAgIH0oKSk7XHJcbn0pKCk7XG5cbi8qKlxyXG4gKiBEZXRlY3RzIHdoZXRoZXIgd2luZG93IGFuZCBkb2N1bWVudCBvYmplY3RzIGFyZSBhdmFpbGFibGUgaW4gY3VycmVudCBlbnZpcm9ubWVudC5cclxuICovXHJcbnZhciBpc0Jyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kb2N1bWVudCA9PT0gZG9jdW1lbnQ7XG5cbi8vIFJldHVybnMgZ2xvYmFsIG9iamVjdCBvZiBhIGN1cnJlbnQgZW52aXJvbm1lbnQuXHJcbnZhciBnbG9iYWwkMSA9IChmdW5jdGlvbiAoKSB7XHJcbiAgICBpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2xvYmFsLk1hdGggPT09IE1hdGgpIHtcclxuICAgICAgICByZXR1cm4gZ2xvYmFsO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJiBzZWxmLk1hdGggPT09IE1hdGgpIHtcclxuICAgICAgICByZXR1cm4gc2VsZjtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuTWF0aCA9PT0gTWF0aCkge1xyXG4gICAgICAgIHJldHVybiB3aW5kb3c7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcclxuICAgIHJldHVybiBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xyXG59KSgpO1xuXG4vKipcclxuICogQSBzaGltIGZvciB0aGUgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIHdoaWNoIGZhbGxzIGJhY2sgdG8gdGhlIHNldFRpbWVvdXQgaWZcclxuICogZmlyc3Qgb25lIGlzIG5vdCBzdXBwb3J0ZWQuXHJcbiAqXHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJlcXVlc3RzJyBpZGVudGlmaWVyLlxyXG4gKi9cclxudmFyIHJlcXVlc3RBbmltYXRpb25GcmFtZSQxID0gKGZ1bmN0aW9uICgpIHtcclxuICAgIGlmICh0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgLy8gSXQncyByZXF1aXJlZCB0byB1c2UgYSBib3VuZGVkIGZ1bmN0aW9uIGJlY2F1c2UgSUUgc29tZXRpbWVzIHRocm93c1xyXG4gICAgICAgIC8vIGFuIFwiSW52YWxpZCBjYWxsaW5nIG9iamVjdFwiIGVycm9yIGlmIHJBRiBpcyBpbnZva2VkIHdpdGhvdXQgdGhlIGdsb2JhbFxyXG4gICAgICAgIC8vIG9iamVjdCBvbiB0aGUgbGVmdCBoYW5kIHNpZGUuXHJcbiAgICAgICAgcmV0dXJuIHJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKGdsb2JhbCQxKTtcclxuICAgIH1cclxuICAgIHJldHVybiBmdW5jdGlvbiAoY2FsbGJhY2spIHsgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXR1cm4gY2FsbGJhY2soRGF0ZS5ub3coKSk7IH0sIDEwMDAgLyA2MCk7IH07XHJcbn0pKCk7XG5cbi8vIERlZmluZXMgbWluaW11bSB0aW1lb3V0IGJlZm9yZSBhZGRpbmcgYSB0cmFpbGluZyBjYWxsLlxyXG52YXIgdHJhaWxpbmdUaW1lb3V0ID0gMjtcclxuLyoqXHJcbiAqIENyZWF0ZXMgYSB3cmFwcGVyIGZ1bmN0aW9uIHdoaWNoIGVuc3VyZXMgdGhhdCBwcm92aWRlZCBjYWxsYmFjayB3aWxsIGJlXHJcbiAqIGludm9rZWQgb25seSBvbmNlIGR1cmluZyB0aGUgc3BlY2lmaWVkIGRlbGF5IHBlcmlvZC5cclxuICpcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBiZSBpbnZva2VkIGFmdGVyIHRoZSBkZWxheSBwZXJpb2QuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBkZWxheSAtIERlbGF5IGFmdGVyIHdoaWNoIHRvIGludm9rZSBjYWxsYmFjay5cclxuICogQHJldHVybnMge0Z1bmN0aW9ufVxyXG4gKi9cclxuZnVuY3Rpb24gdGhyb3R0bGUgKGNhbGxiYWNrLCBkZWxheSkge1xyXG4gICAgdmFyIGxlYWRpbmdDYWxsID0gZmFsc2UsIHRyYWlsaW5nQ2FsbCA9IGZhbHNlLCBsYXN0Q2FsbFRpbWUgPSAwO1xyXG4gICAgLyoqXHJcbiAgICAgKiBJbnZva2VzIHRoZSBvcmlnaW5hbCBjYWxsYmFjayBmdW5jdGlvbiBhbmQgc2NoZWR1bGVzIG5ldyBpbnZvY2F0aW9uIGlmXHJcbiAgICAgKiB0aGUgXCJwcm94eVwiIHdhcyBjYWxsZWQgZHVyaW5nIGN1cnJlbnQgcmVxdWVzdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gcmVzb2x2ZVBlbmRpbmcoKSB7XHJcbiAgICAgICAgaWYgKGxlYWRpbmdDYWxsKSB7XHJcbiAgICAgICAgICAgIGxlYWRpbmdDYWxsID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0cmFpbGluZ0NhbGwpIHtcclxuICAgICAgICAgICAgcHJveHkoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENhbGxiYWNrIGludm9rZWQgYWZ0ZXIgdGhlIHNwZWNpZmllZCBkZWxheS4gSXQgd2lsbCBmdXJ0aGVyIHBvc3Rwb25lXHJcbiAgICAgKiBpbnZvY2F0aW9uIG9mIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiBkZWxlZ2F0aW5nIGl0IHRvIHRoZVxyXG4gICAgICogcmVxdWVzdEFuaW1hdGlvbkZyYW1lLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiB0aW1lb3V0Q2FsbGJhY2soKSB7XHJcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lJDEocmVzb2x2ZVBlbmRpbmcpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTY2hlZHVsZXMgaW52b2NhdGlvbiBvZiB0aGUgb3JpZ2luYWwgZnVuY3Rpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIHByb3h5KCkge1xyXG4gICAgICAgIHZhciB0aW1lU3RhbXAgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgIGlmIChsZWFkaW5nQ2FsbCkge1xyXG4gICAgICAgICAgICAvLyBSZWplY3QgaW1tZWRpYXRlbHkgZm9sbG93aW5nIGNhbGxzLlxyXG4gICAgICAgICAgICBpZiAodGltZVN0YW1wIC0gbGFzdENhbGxUaW1lIDwgdHJhaWxpbmdUaW1lb3V0KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gU2NoZWR1bGUgbmV3IGNhbGwgdG8gYmUgaW4gaW52b2tlZCB3aGVuIHRoZSBwZW5kaW5nIG9uZSBpcyByZXNvbHZlZC5cclxuICAgICAgICAgICAgLy8gVGhpcyBpcyBpbXBvcnRhbnQgZm9yIFwidHJhbnNpdGlvbnNcIiB3aGljaCBuZXZlciBhY3R1YWxseSBzdGFydFxyXG4gICAgICAgICAgICAvLyBpbW1lZGlhdGVseSBzbyB0aGVyZSBpcyBhIGNoYW5jZSB0aGF0IHdlIG1pZ2h0IG1pc3Mgb25lIGlmIGNoYW5nZVxyXG4gICAgICAgICAgICAvLyBoYXBwZW5zIGFtaWRzIHRoZSBwZW5kaW5nIGludm9jYXRpb24uXHJcbiAgICAgICAgICAgIHRyYWlsaW5nQ2FsbCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsZWFkaW5nQ2FsbCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRyYWlsaW5nQ2FsbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KHRpbWVvdXRDYWxsYmFjaywgZGVsYXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsYXN0Q2FsbFRpbWUgPSB0aW1lU3RhbXA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcHJveHk7XHJcbn1cblxuLy8gTWluaW11bSBkZWxheSBiZWZvcmUgaW52b2tpbmcgdGhlIHVwZGF0ZSBvZiBvYnNlcnZlcnMuXHJcbnZhciBSRUZSRVNIX0RFTEFZID0gMjA7XHJcbi8vIEEgbGlzdCBvZiBzdWJzdHJpbmdzIG9mIENTUyBwcm9wZXJ0aWVzIHVzZWQgdG8gZmluZCB0cmFuc2l0aW9uIGV2ZW50cyB0aGF0XHJcbi8vIG1pZ2h0IGFmZmVjdCBkaW1lbnNpb25zIG9mIG9ic2VydmVkIGVsZW1lbnRzLlxyXG52YXIgdHJhbnNpdGlvbktleXMgPSBbJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCAnbGVmdCcsICd3aWR0aCcsICdoZWlnaHQnLCAnc2l6ZScsICd3ZWlnaHQnXTtcclxuLy8gQ2hlY2sgaWYgTXV0YXRpb25PYnNlcnZlciBpcyBhdmFpbGFibGUuXHJcbnZhciBtdXRhdGlvbk9ic2VydmVyU3VwcG9ydGVkID0gdHlwZW9mIE11dGF0aW9uT2JzZXJ2ZXIgIT09ICd1bmRlZmluZWQnO1xyXG4vKipcclxuICogU2luZ2xldG9uIGNvbnRyb2xsZXIgY2xhc3Mgd2hpY2ggaGFuZGxlcyB1cGRhdGVzIG9mIFJlc2l6ZU9ic2VydmVyIGluc3RhbmNlcy5cclxuICovXHJcbnZhciBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyLlxyXG4gICAgICpcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlcigpIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBET00gbGlzdGVuZXJzIGhhdmUgYmVlbiBhZGRlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBwcml2YXRlIHtib29sZWFufVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY29ubmVjdGVkXyA9IGZhbHNlO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRlbGxzIHRoYXQgY29udHJvbGxlciBoYXMgc3Vic2NyaWJlZCBmb3IgTXV0YXRpb24gRXZlbnRzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQHByaXZhdGUge2Jvb2xlYW59XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5tdXRhdGlvbkV2ZW50c0FkZGVkXyA9IGZhbHNlO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEtlZXBzIHJlZmVyZW5jZSB0byB0aGUgaW5zdGFuY2Ugb2YgTXV0YXRpb25PYnNlcnZlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBwcml2YXRlIHtNdXRhdGlvbk9ic2VydmVyfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubXV0YXRpb25zT2JzZXJ2ZXJfID0gbnVsbDtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIGxpc3Qgb2YgY29ubmVjdGVkIG9ic2VydmVycy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBwcml2YXRlIHtBcnJheTxSZXNpemVPYnNlcnZlclNQST59XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5vYnNlcnZlcnNfID0gW107XHJcbiAgICAgICAgdGhpcy5vblRyYW5zaXRpb25FbmRfID0gdGhpcy5vblRyYW5zaXRpb25FbmRfLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoID0gdGhyb3R0bGUodGhpcy5yZWZyZXNoLmJpbmQodGhpcyksIFJFRlJFU0hfREVMQVkpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIG9ic2VydmVyIHRvIG9ic2VydmVycyBsaXN0LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UmVzaXplT2JzZXJ2ZXJTUEl9IG9ic2VydmVyIC0gT2JzZXJ2ZXIgdG8gYmUgYWRkZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAqL1xyXG4gICAgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyLnByb3RvdHlwZS5hZGRPYnNlcnZlciA9IGZ1bmN0aW9uIChvYnNlcnZlcikge1xyXG4gICAgICAgIGlmICghfnRoaXMub2JzZXJ2ZXJzXy5pbmRleE9mKG9ic2VydmVyKSkge1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyc18ucHVzaChvYnNlcnZlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEFkZCBsaXN0ZW5lcnMgaWYgdGhleSBoYXZlbid0IGJlZW4gYWRkZWQgeWV0LlxyXG4gICAgICAgIGlmICghdGhpcy5jb25uZWN0ZWRfKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdF8oKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIG9ic2VydmVyIGZyb20gb2JzZXJ2ZXJzIGxpc3QuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtSZXNpemVPYnNlcnZlclNQSX0gb2JzZXJ2ZXIgLSBPYnNlcnZlciB0byBiZSByZW1vdmVkLlxyXG4gICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgKi9cclxuICAgIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlci5wcm90b3R5cGUucmVtb3ZlT2JzZXJ2ZXIgPSBmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcclxuICAgICAgICB2YXIgb2JzZXJ2ZXJzID0gdGhpcy5vYnNlcnZlcnNfO1xyXG4gICAgICAgIHZhciBpbmRleCA9IG9ic2VydmVycy5pbmRleE9mKG9ic2VydmVyKTtcclxuICAgICAgICAvLyBSZW1vdmUgb2JzZXJ2ZXIgaWYgaXQncyBwcmVzZW50IGluIHJlZ2lzdHJ5LlxyXG4gICAgICAgIGlmICh+aW5kZXgpIHtcclxuICAgICAgICAgICAgb2JzZXJ2ZXJzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFJlbW92ZSBsaXN0ZW5lcnMgaWYgY29udHJvbGxlciBoYXMgbm8gY29ubmVjdGVkIG9ic2VydmVycy5cclxuICAgICAgICBpZiAoIW9ic2VydmVycy5sZW5ndGggJiYgdGhpcy5jb25uZWN0ZWRfKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzY29ubmVjdF8oKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBJbnZva2VzIHRoZSB1cGRhdGUgb2Ygb2JzZXJ2ZXJzLiBJdCB3aWxsIGNvbnRpbnVlIHJ1bm5pbmcgdXBkYXRlcyBpbnNvZmFyXHJcbiAgICAgKiBpdCBkZXRlY3RzIGNoYW5nZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgKi9cclxuICAgIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlci5wcm90b3R5cGUucmVmcmVzaCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgY2hhbmdlc0RldGVjdGVkID0gdGhpcy51cGRhdGVPYnNlcnZlcnNfKCk7XHJcbiAgICAgICAgLy8gQ29udGludWUgcnVubmluZyB1cGRhdGVzIGlmIGNoYW5nZXMgaGF2ZSBiZWVuIGRldGVjdGVkIGFzIHRoZXJlIG1pZ2h0XHJcbiAgICAgICAgLy8gYmUgZnV0dXJlIG9uZXMgY2F1c2VkIGJ5IENTUyB0cmFuc2l0aW9ucy5cclxuICAgICAgICBpZiAoY2hhbmdlc0RldGVjdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaCgpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgZXZlcnkgb2JzZXJ2ZXIgZnJvbSBvYnNlcnZlcnMgbGlzdCBhbmQgbm90aWZpZXMgdGhlbSBvZiBxdWV1ZWRcclxuICAgICAqIGVudHJpZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIFwidHJ1ZVwiIGlmIGFueSBvYnNlcnZlciBoYXMgZGV0ZWN0ZWQgY2hhbmdlcyBpblxyXG4gICAgICogICAgICBkaW1lbnNpb25zIG9mIGl0J3MgZWxlbWVudHMuXHJcbiAgICAgKi9cclxuICAgIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlci5wcm90b3R5cGUudXBkYXRlT2JzZXJ2ZXJzXyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAvLyBDb2xsZWN0IG9ic2VydmVycyB0aGF0IGhhdmUgYWN0aXZlIG9ic2VydmF0aW9ucy5cclxuICAgICAgICB2YXIgYWN0aXZlT2JzZXJ2ZXJzID0gdGhpcy5vYnNlcnZlcnNfLmZpbHRlcihmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9ic2VydmVyLmdhdGhlckFjdGl2ZSgpLCBvYnNlcnZlci5oYXNBY3RpdmUoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBEZWxpdmVyIG5vdGlmaWNhdGlvbnMgaW4gYSBzZXBhcmF0ZSBjeWNsZSBpbiBvcmRlciB0byBhdm9pZCBhbnlcclxuICAgICAgICAvLyBjb2xsaXNpb25zIGJldHdlZW4gb2JzZXJ2ZXJzLCBlLmcuIHdoZW4gbXVsdGlwbGUgaW5zdGFuY2VzIG9mXHJcbiAgICAgICAgLy8gUmVzaXplT2JzZXJ2ZXIgYXJlIHRyYWNraW5nIHRoZSBzYW1lIGVsZW1lbnQgYW5kIHRoZSBjYWxsYmFjayBvZiBvbmVcclxuICAgICAgICAvLyBvZiB0aGVtIGNoYW5nZXMgY29udGVudCBkaW1lbnNpb25zIG9mIHRoZSBvYnNlcnZlZCB0YXJnZXQuIFNvbWV0aW1lc1xyXG4gICAgICAgIC8vIHRoaXMgbWF5IHJlc3VsdCBpbiBub3RpZmljYXRpb25zIGJlaW5nIGJsb2NrZWQgZm9yIHRoZSByZXN0IG9mIG9ic2VydmVycy5cclxuICAgICAgICBhY3RpdmVPYnNlcnZlcnMuZm9yRWFjaChmdW5jdGlvbiAob2JzZXJ2ZXIpIHsgcmV0dXJuIG9ic2VydmVyLmJyb2FkY2FzdEFjdGl2ZSgpOyB9KTtcclxuICAgICAgICByZXR1cm4gYWN0aXZlT2JzZXJ2ZXJzLmxlbmd0aCA+IDA7XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBJbml0aWFsaXplcyBET00gbGlzdGVuZXJzLlxyXG4gICAgICpcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAqL1xyXG4gICAgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyLnByb3RvdHlwZS5jb25uZWN0XyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAvLyBEbyBub3RoaW5nIGlmIHJ1bm5pbmcgaW4gYSBub24tYnJvd3NlciBlbnZpcm9ubWVudCBvciBpZiBsaXN0ZW5lcnNcclxuICAgICAgICAvLyBoYXZlIGJlZW4gYWxyZWFkeSBhZGRlZC5cclxuICAgICAgICBpZiAoIWlzQnJvd3NlciB8fCB0aGlzLmNvbm5lY3RlZF8pIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBTdWJzY3JpcHRpb24gdG8gdGhlIFwiVHJhbnNpdGlvbmVuZFwiIGV2ZW50IGlzIHVzZWQgYXMgYSB3b3JrYXJvdW5kIGZvclxyXG4gICAgICAgIC8vIGRlbGF5ZWQgdHJhbnNpdGlvbnMuIFRoaXMgd2F5IGl0J3MgcG9zc2libGUgdG8gY2FwdHVyZSBhdCBsZWFzdCB0aGVcclxuICAgICAgICAvLyBmaW5hbCBzdGF0ZSBvZiBhbiBlbGVtZW50LlxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCB0aGlzLm9uVHJhbnNpdGlvbkVuZF8pO1xyXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLnJlZnJlc2gpO1xyXG4gICAgICAgIGlmIChtdXRhdGlvbk9ic2VydmVyU3VwcG9ydGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubXV0YXRpb25zT2JzZXJ2ZXJfID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIodGhpcy5yZWZyZXNoKTtcclxuICAgICAgICAgICAgdGhpcy5tdXRhdGlvbnNPYnNlcnZlcl8ub2JzZXJ2ZShkb2N1bWVudCwge1xyXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGNoYXJhY3RlckRhdGE6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBzdWJ0cmVlOiB0cnVlXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NU3VidHJlZU1vZGlmaWVkJywgdGhpcy5yZWZyZXNoKTtcclxuICAgICAgICAgICAgdGhpcy5tdXRhdGlvbkV2ZW50c0FkZGVkXyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY29ubmVjdGVkXyA9IHRydWU7XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIERPTSBsaXN0ZW5lcnMuXHJcbiAgICAgKlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICovXHJcbiAgICBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIucHJvdG90eXBlLmRpc2Nvbm5lY3RfID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIC8vIERvIG5vdGhpbmcgaWYgcnVubmluZyBpbiBhIG5vbi1icm93c2VyIGVudmlyb25tZW50IG9yIGlmIGxpc3RlbmVyc1xyXG4gICAgICAgIC8vIGhhdmUgYmVlbiBhbHJlYWR5IHJlbW92ZWQuXHJcbiAgICAgICAgaWYgKCFpc0Jyb3dzZXIgfHwgIXRoaXMuY29ubmVjdGVkXykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCB0aGlzLm9uVHJhbnNpdGlvbkVuZF8pO1xyXG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLnJlZnJlc2gpO1xyXG4gICAgICAgIGlmICh0aGlzLm11dGF0aW9uc09ic2VydmVyXykge1xyXG4gICAgICAgICAgICB0aGlzLm11dGF0aW9uc09ic2VydmVyXy5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm11dGF0aW9uRXZlbnRzQWRkZWRfKSB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ0RPTVN1YnRyZWVNb2RpZmllZCcsIHRoaXMucmVmcmVzaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubXV0YXRpb25zT2JzZXJ2ZXJfID0gbnVsbDtcclxuICAgICAgICB0aGlzLm11dGF0aW9uRXZlbnRzQWRkZWRfID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jb25uZWN0ZWRfID0gZmFsc2U7XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBcIlRyYW5zaXRpb25lbmRcIiBldmVudCBoYW5kbGVyLlxyXG4gICAgICpcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAcGFyYW0ge1RyYW5zaXRpb25FdmVudH0gZXZlbnRcclxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICovXHJcbiAgICBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIucHJvdG90eXBlLm9uVHJhbnNpdGlvbkVuZF8gPSBmdW5jdGlvbiAoX2EpIHtcclxuICAgICAgICB2YXIgX2IgPSBfYS5wcm9wZXJ0eU5hbWUsIHByb3BlcnR5TmFtZSA9IF9iID09PSB2b2lkIDAgPyAnJyA6IF9iO1xyXG4gICAgICAgIC8vIERldGVjdCB3aGV0aGVyIHRyYW5zaXRpb24gbWF5IGFmZmVjdCBkaW1lbnNpb25zIG9mIGFuIGVsZW1lbnQuXHJcbiAgICAgICAgdmFyIGlzUmVmbG93UHJvcGVydHkgPSB0cmFuc2l0aW9uS2V5cy5zb21lKGZ1bmN0aW9uIChrZXkpIHtcclxuICAgICAgICAgICAgcmV0dXJuICEhfnByb3BlcnR5TmFtZS5pbmRleE9mKGtleSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGlzUmVmbG93UHJvcGVydHkpIHtcclxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBpbnN0YW5jZSBvZiB0aGUgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHtSZXNpemVPYnNlcnZlckNvbnRyb2xsZXJ9XHJcbiAgICAgKi9cclxuICAgIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlci5nZXRJbnN0YW5jZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaW5zdGFuY2VfKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2VfID0gbmV3IFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZV87XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBIb2xkcyByZWZlcmVuY2UgdG8gdGhlIGNvbnRyb2xsZXIncyBpbnN0YW5jZS5cclxuICAgICAqXHJcbiAgICAgKiBAcHJpdmF0ZSB7UmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyfVxyXG4gICAgICovXHJcbiAgICBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIuaW5zdGFuY2VfID0gbnVsbDtcclxuICAgIHJldHVybiBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXI7XHJcbn0oKSk7XG5cbi8qKlxyXG4gKiBEZWZpbmVzIG5vbi13cml0YWJsZS9lbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgdGhlIHByb3ZpZGVkIHRhcmdldCBvYmplY3QuXHJcbiAqXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXQgLSBPYmplY3QgZm9yIHdoaWNoIHRvIGRlZmluZSBwcm9wZXJ0aWVzLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgLSBQcm9wZXJ0aWVzIHRvIGJlIGRlZmluZWQuXHJcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRhcmdldCBvYmplY3QuXHJcbiAqL1xyXG52YXIgZGVmaW5lQ29uZmlndXJhYmxlID0gKGZ1bmN0aW9uICh0YXJnZXQsIHByb3BzKSB7XHJcbiAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gT2JqZWN0LmtleXMocHJvcHMpOyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgIHZhciBrZXkgPSBfYVtfaV07XHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCB7XHJcbiAgICAgICAgICAgIHZhbHVlOiBwcm9wc1trZXldLFxyXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiB0YXJnZXQ7XHJcbn0pO1xuXG4vKipcclxuICogUmV0dXJucyB0aGUgZ2xvYmFsIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggcHJvdmlkZWQgZWxlbWVudC5cclxuICpcclxuICogQHBhcmFtIHtPYmplY3R9IHRhcmdldFxyXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxyXG4gKi9cclxudmFyIGdldFdpbmRvd09mID0gKGZ1bmN0aW9uICh0YXJnZXQpIHtcclxuICAgIC8vIEFzc3VtZSB0aGF0IHRoZSBlbGVtZW50IGlzIGFuIGluc3RhbmNlIG9mIE5vZGUsIHdoaWNoIG1lYW5zIHRoYXQgaXRcclxuICAgIC8vIGhhcyB0aGUgXCJvd25lckRvY3VtZW50XCIgcHJvcGVydHkgZnJvbSB3aGljaCB3ZSBjYW4gcmV0cmlldmUgYVxyXG4gICAgLy8gY29ycmVzcG9uZGluZyBnbG9iYWwgb2JqZWN0LlxyXG4gICAgdmFyIG93bmVyR2xvYmFsID0gdGFyZ2V0ICYmIHRhcmdldC5vd25lckRvY3VtZW50ICYmIHRhcmdldC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xyXG4gICAgLy8gUmV0dXJuIHRoZSBsb2NhbCBnbG9iYWwgb2JqZWN0IGlmIGl0J3Mgbm90IHBvc3NpYmxlIGV4dHJhY3Qgb25lIGZyb21cclxuICAgIC8vIHByb3ZpZGVkIGVsZW1lbnQuXHJcbiAgICByZXR1cm4gb3duZXJHbG9iYWwgfHwgZ2xvYmFsJDE7XHJcbn0pO1xuXG4vLyBQbGFjZWhvbGRlciBvZiBhbiBlbXB0eSBjb250ZW50IHJlY3RhbmdsZS5cclxudmFyIGVtcHR5UmVjdCA9IGNyZWF0ZVJlY3RJbml0KDAsIDAsIDAsIDApO1xyXG4vKipcclxuICogQ29udmVydHMgcHJvdmlkZWQgc3RyaW5nIHRvIGEgbnVtYmVyLlxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IHZhbHVlXHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9XHJcbiAqL1xyXG5mdW5jdGlvbiB0b0Zsb2F0KHZhbHVlKSB7XHJcbiAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWx1ZSkgfHwgMDtcclxufVxyXG4vKipcclxuICogRXh0cmFjdHMgYm9yZGVycyBzaXplIGZyb20gcHJvdmlkZWQgc3R5bGVzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge0NTU1N0eWxlRGVjbGFyYXRpb259IHN0eWxlc1xyXG4gKiBAcGFyYW0gey4uLnN0cmluZ30gcG9zaXRpb25zIC0gQm9yZGVycyBwb3NpdGlvbnMgKHRvcCwgcmlnaHQsIC4uLilcclxuICogQHJldHVybnMge251bWJlcn1cclxuICovXHJcbmZ1bmN0aW9uIGdldEJvcmRlcnNTaXplKHN0eWxlcykge1xyXG4gICAgdmFyIHBvc2l0aW9ucyA9IFtdO1xyXG4gICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICBwb3NpdGlvbnNbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcG9zaXRpb25zLnJlZHVjZShmdW5jdGlvbiAoc2l6ZSwgcG9zaXRpb24pIHtcclxuICAgICAgICB2YXIgdmFsdWUgPSBzdHlsZXNbJ2JvcmRlci0nICsgcG9zaXRpb24gKyAnLXdpZHRoJ107XHJcbiAgICAgICAgcmV0dXJuIHNpemUgKyB0b0Zsb2F0KHZhbHVlKTtcclxuICAgIH0sIDApO1xyXG59XHJcbi8qKlxyXG4gKiBFeHRyYWN0cyBwYWRkaW5ncyBzaXplcyBmcm9tIHByb3ZpZGVkIHN0eWxlcy5cclxuICpcclxuICogQHBhcmFtIHtDU1NTdHlsZURlY2xhcmF0aW9ufSBzdHlsZXNcclxuICogQHJldHVybnMge09iamVjdH0gUGFkZGluZ3MgYm94LlxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0UGFkZGluZ3Moc3R5bGVzKSB7XHJcbiAgICB2YXIgcG9zaXRpb25zID0gWyd0b3AnLCAncmlnaHQnLCAnYm90dG9tJywgJ2xlZnQnXTtcclxuICAgIHZhciBwYWRkaW5ncyA9IHt9O1xyXG4gICAgZm9yICh2YXIgX2kgPSAwLCBwb3NpdGlvbnNfMSA9IHBvc2l0aW9uczsgX2kgPCBwb3NpdGlvbnNfMS5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICB2YXIgcG9zaXRpb24gPSBwb3NpdGlvbnNfMVtfaV07XHJcbiAgICAgICAgdmFyIHZhbHVlID0gc3R5bGVzWydwYWRkaW5nLScgKyBwb3NpdGlvbl07XHJcbiAgICAgICAgcGFkZGluZ3NbcG9zaXRpb25dID0gdG9GbG9hdCh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGFkZGluZ3M7XHJcbn1cclxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgY29udGVudCByZWN0YW5nbGUgb2YgcHJvdmlkZWQgU1ZHIGVsZW1lbnQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7U1ZHR3JhcGhpY3NFbGVtZW50fSB0YXJnZXQgLSBFbGVtZW50IGNvbnRlbnQgcmVjdGFuZ2xlIG9mIHdoaWNoIG5lZWRzXHJcbiAqICAgICAgdG8gYmUgY2FsY3VsYXRlZC5cclxuICogQHJldHVybnMge0RPTVJlY3RJbml0fVxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0U1ZHQ29udGVudFJlY3QodGFyZ2V0KSB7XHJcbiAgICB2YXIgYmJveCA9IHRhcmdldC5nZXRCQm94KCk7XHJcbiAgICByZXR1cm4gY3JlYXRlUmVjdEluaXQoMCwgMCwgYmJveC53aWR0aCwgYmJveC5oZWlnaHQpO1xyXG59XHJcbi8qKlxyXG4gKiBDYWxjdWxhdGVzIGNvbnRlbnQgcmVjdGFuZ2xlIG9mIHByb3ZpZGVkIEhUTUxFbGVtZW50LlxyXG4gKlxyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSB0YXJnZXQgLSBFbGVtZW50IGZvciB3aGljaCB0byBjYWxjdWxhdGUgdGhlIGNvbnRlbnQgcmVjdGFuZ2xlLlxyXG4gKiBAcmV0dXJucyB7RE9NUmVjdEluaXR9XHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRIVE1MRWxlbWVudENvbnRlbnRSZWN0KHRhcmdldCkge1xyXG4gICAgLy8gQ2xpZW50IHdpZHRoICYgaGVpZ2h0IHByb3BlcnRpZXMgY2FuJ3QgYmVcclxuICAgIC8vIHVzZWQgZXhjbHVzaXZlbHkgYXMgdGhleSBwcm92aWRlIHJvdW5kZWQgdmFsdWVzLlxyXG4gICAgdmFyIGNsaWVudFdpZHRoID0gdGFyZ2V0LmNsaWVudFdpZHRoLCBjbGllbnRIZWlnaHQgPSB0YXJnZXQuY2xpZW50SGVpZ2h0O1xyXG4gICAgLy8gQnkgdGhpcyBjb25kaXRpb24gd2UgY2FuIGNhdGNoIGFsbCBub24tcmVwbGFjZWQgaW5saW5lLCBoaWRkZW4gYW5kXHJcbiAgICAvLyBkZXRhY2hlZCBlbGVtZW50cy4gVGhvdWdoIGVsZW1lbnRzIHdpdGggd2lkdGggJiBoZWlnaHQgcHJvcGVydGllcyBsZXNzXHJcbiAgICAvLyB0aGFuIDAuNSB3aWxsIGJlIGRpc2NhcmRlZCBhcyB3ZWxsLlxyXG4gICAgLy9cclxuICAgIC8vIFdpdGhvdXQgaXQgd2Ugd291bGQgbmVlZCB0byBpbXBsZW1lbnQgc2VwYXJhdGUgbWV0aG9kcyBmb3IgZWFjaCBvZlxyXG4gICAgLy8gdGhvc2UgY2FzZXMgYW5kIGl0J3Mgbm90IHBvc3NpYmxlIHRvIHBlcmZvcm0gYSBwcmVjaXNlIGFuZCBwZXJmb3JtYW5jZVxyXG4gICAgLy8gZWZmZWN0aXZlIHRlc3QgZm9yIGhpZGRlbiBlbGVtZW50cy4gRS5nLiBldmVuIGpRdWVyeSdzICc6dmlzaWJsZScgZmlsdGVyXHJcbiAgICAvLyBnaXZlcyB3cm9uZyByZXN1bHRzIGZvciBlbGVtZW50cyB3aXRoIHdpZHRoICYgaGVpZ2h0IGxlc3MgdGhhbiAwLjUuXHJcbiAgICBpZiAoIWNsaWVudFdpZHRoICYmICFjbGllbnRIZWlnaHQpIHtcclxuICAgICAgICByZXR1cm4gZW1wdHlSZWN0O1xyXG4gICAgfVxyXG4gICAgdmFyIHN0eWxlcyA9IGdldFdpbmRvd09mKHRhcmdldCkuZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpO1xyXG4gICAgdmFyIHBhZGRpbmdzID0gZ2V0UGFkZGluZ3Moc3R5bGVzKTtcclxuICAgIHZhciBob3JpelBhZCA9IHBhZGRpbmdzLmxlZnQgKyBwYWRkaW5ncy5yaWdodDtcclxuICAgIHZhciB2ZXJ0UGFkID0gcGFkZGluZ3MudG9wICsgcGFkZGluZ3MuYm90dG9tO1xyXG4gICAgLy8gQ29tcHV0ZWQgc3R5bGVzIG9mIHdpZHRoICYgaGVpZ2h0IGFyZSBiZWluZyB1c2VkIGJlY2F1c2UgdGhleSBhcmUgdGhlXHJcbiAgICAvLyBvbmx5IGRpbWVuc2lvbnMgYXZhaWxhYmxlIHRvIEpTIHRoYXQgY29udGFpbiBub24tcm91bmRlZCB2YWx1ZXMuIEl0IGNvdWxkXHJcbiAgICAvLyBiZSBwb3NzaWJsZSB0byB1dGlsaXplIHRoZSBnZXRCb3VuZGluZ0NsaWVudFJlY3QgaWYgb25seSBpdCdzIGRhdGEgd2Fzbid0XHJcbiAgICAvLyBhZmZlY3RlZCBieSBDU1MgdHJhbnNmb3JtYXRpb25zIGxldCBhbG9uZSBwYWRkaW5ncywgYm9yZGVycyBhbmQgc2Nyb2xsIGJhcnMuXHJcbiAgICB2YXIgd2lkdGggPSB0b0Zsb2F0KHN0eWxlcy53aWR0aCksIGhlaWdodCA9IHRvRmxvYXQoc3R5bGVzLmhlaWdodCk7XHJcbiAgICAvLyBXaWR0aCAmIGhlaWdodCBpbmNsdWRlIHBhZGRpbmdzIGFuZCBib3JkZXJzIHdoZW4gdGhlICdib3JkZXItYm94JyBib3hcclxuICAgIC8vIG1vZGVsIGlzIGFwcGxpZWQgKGV4Y2VwdCBmb3IgSUUpLlxyXG4gICAgaWYgKHN0eWxlcy5ib3hTaXppbmcgPT09ICdib3JkZXItYm94Jykge1xyXG4gICAgICAgIC8vIEZvbGxvd2luZyBjb25kaXRpb25zIGFyZSByZXF1aXJlZCB0byBoYW5kbGUgSW50ZXJuZXQgRXhwbG9yZXIgd2hpY2hcclxuICAgICAgICAvLyBkb2Vzbid0IGluY2x1ZGUgcGFkZGluZ3MgYW5kIGJvcmRlcnMgdG8gY29tcHV0ZWQgQ1NTIGRpbWVuc2lvbnMuXHJcbiAgICAgICAgLy9cclxuICAgICAgICAvLyBXZSBjYW4gc2F5IHRoYXQgaWYgQ1NTIGRpbWVuc2lvbnMgKyBwYWRkaW5ncyBhcmUgZXF1YWwgdG8gdGhlIFwiY2xpZW50XCJcclxuICAgICAgICAvLyBwcm9wZXJ0aWVzIHRoZW4gaXQncyBlaXRoZXIgSUUsIGFuZCB0aHVzIHdlIGRvbid0IG5lZWQgdG8gc3VidHJhY3RcclxuICAgICAgICAvLyBhbnl0aGluZywgb3IgYW4gZWxlbWVudCBtZXJlbHkgZG9lc24ndCBoYXZlIHBhZGRpbmdzL2JvcmRlcnMgc3R5bGVzLlxyXG4gICAgICAgIGlmIChNYXRoLnJvdW5kKHdpZHRoICsgaG9yaXpQYWQpICE9PSBjbGllbnRXaWR0aCkge1xyXG4gICAgICAgICAgICB3aWR0aCAtPSBnZXRCb3JkZXJzU2l6ZShzdHlsZXMsICdsZWZ0JywgJ3JpZ2h0JykgKyBob3JpelBhZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKE1hdGgucm91bmQoaGVpZ2h0ICsgdmVydFBhZCkgIT09IGNsaWVudEhlaWdodCkge1xyXG4gICAgICAgICAgICBoZWlnaHQgLT0gZ2V0Qm9yZGVyc1NpemUoc3R5bGVzLCAndG9wJywgJ2JvdHRvbScpICsgdmVydFBhZDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBGb2xsb3dpbmcgc3RlcHMgY2FuJ3QgYmUgYXBwbGllZCB0byB0aGUgZG9jdW1lbnQncyByb290IGVsZW1lbnQgYXMgaXRzXHJcbiAgICAvLyBjbGllbnRbV2lkdGgvSGVpZ2h0XSBwcm9wZXJ0aWVzIHJlcHJlc2VudCB2aWV3cG9ydCBhcmVhIG9mIHRoZSB3aW5kb3cuXHJcbiAgICAvLyBCZXNpZGVzLCBpdCdzIGFzIHdlbGwgbm90IG5lY2Vzc2FyeSBhcyB0aGUgPGh0bWw+IGl0c2VsZiBuZWl0aGVyIGhhc1xyXG4gICAgLy8gcmVuZGVyZWQgc2Nyb2xsIGJhcnMgbm9yIGl0IGNhbiBiZSBjbGlwcGVkLlxyXG4gICAgaWYgKCFpc0RvY3VtZW50RWxlbWVudCh0YXJnZXQpKSB7XHJcbiAgICAgICAgLy8gSW4gc29tZSBicm93c2VycyAob25seSBpbiBGaXJlZm94LCBhY3R1YWxseSkgQ1NTIHdpZHRoICYgaGVpZ2h0XHJcbiAgICAgICAgLy8gaW5jbHVkZSBzY3JvbGwgYmFycyBzaXplIHdoaWNoIGNhbiBiZSByZW1vdmVkIGF0IHRoaXMgc3RlcCBhcyBzY3JvbGxcclxuICAgICAgICAvLyBiYXJzIGFyZSB0aGUgb25seSBkaWZmZXJlbmNlIGJldHdlZW4gcm91bmRlZCBkaW1lbnNpb25zICsgcGFkZGluZ3NcclxuICAgICAgICAvLyBhbmQgXCJjbGllbnRcIiBwcm9wZXJ0aWVzLCB0aG91Z2ggdGhhdCBpcyBub3QgYWx3YXlzIHRydWUgaW4gQ2hyb21lLlxyXG4gICAgICAgIHZhciB2ZXJ0U2Nyb2xsYmFyID0gTWF0aC5yb3VuZCh3aWR0aCArIGhvcml6UGFkKSAtIGNsaWVudFdpZHRoO1xyXG4gICAgICAgIHZhciBob3JpelNjcm9sbGJhciA9IE1hdGgucm91bmQoaGVpZ2h0ICsgdmVydFBhZCkgLSBjbGllbnRIZWlnaHQ7XHJcbiAgICAgICAgLy8gQ2hyb21lIGhhcyBhIHJhdGhlciB3ZWlyZCByb3VuZGluZyBvZiBcImNsaWVudFwiIHByb3BlcnRpZXMuXHJcbiAgICAgICAgLy8gRS5nLiBmb3IgYW4gZWxlbWVudCB3aXRoIGNvbnRlbnQgd2lkdGggb2YgMzE0LjJweCBpdCBzb21ldGltZXMgZ2l2ZXNcclxuICAgICAgICAvLyB0aGUgY2xpZW50IHdpZHRoIG9mIDMxNXB4IGFuZCBmb3IgdGhlIHdpZHRoIG9mIDMxNC43cHggaXQgbWF5IGdpdmVcclxuICAgICAgICAvLyAzMTRweC4gQW5kIGl0IGRvZXNuJ3QgaGFwcGVuIGFsbCB0aGUgdGltZS4gU28ganVzdCBpZ25vcmUgdGhpcyBkZWx0YVxyXG4gICAgICAgIC8vIGFzIGEgbm9uLXJlbGV2YW50LlxyXG4gICAgICAgIGlmIChNYXRoLmFicyh2ZXJ0U2Nyb2xsYmFyKSAhPT0gMSkge1xyXG4gICAgICAgICAgICB3aWR0aCAtPSB2ZXJ0U2Nyb2xsYmFyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoTWF0aC5hYnMoaG9yaXpTY3JvbGxiYXIpICE9PSAxKSB7XHJcbiAgICAgICAgICAgIGhlaWdodCAtPSBob3JpelNjcm9sbGJhcjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3JlYXRlUmVjdEluaXQocGFkZGluZ3MubGVmdCwgcGFkZGluZ3MudG9wLCB3aWR0aCwgaGVpZ2h0KTtcclxufVxyXG4vKipcclxuICogQ2hlY2tzIHdoZXRoZXIgcHJvdmlkZWQgZWxlbWVudCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgU1ZHR3JhcGhpY3NFbGVtZW50LlxyXG4gKlxyXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCAtIEVsZW1lbnQgdG8gYmUgY2hlY2tlZC5cclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG52YXIgaXNTVkdHcmFwaGljc0VsZW1lbnQgPSAoZnVuY3Rpb24gKCkge1xyXG4gICAgLy8gU29tZSBicm93c2VycywgbmFtZWx5IElFIGFuZCBFZGdlLCBkb24ndCBoYXZlIHRoZSBTVkdHcmFwaGljc0VsZW1lbnRcclxuICAgIC8vIGludGVyZmFjZS5cclxuICAgIGlmICh0eXBlb2YgU1ZHR3JhcGhpY3NFbGVtZW50ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0KSB7IHJldHVybiB0YXJnZXQgaW5zdGFuY2VvZiBnZXRXaW5kb3dPZih0YXJnZXQpLlNWR0dyYXBoaWNzRWxlbWVudDsgfTtcclxuICAgIH1cclxuICAgIC8vIElmIGl0J3Mgc28sIHRoZW4gY2hlY2sgdGhhdCBlbGVtZW50IGlzIGF0IGxlYXN0IGFuIGluc3RhbmNlIG9mIHRoZVxyXG4gICAgLy8gU1ZHRWxlbWVudCBhbmQgdGhhdCBpdCBoYXMgdGhlIFwiZ2V0QkJveFwiIG1ldGhvZC5cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1leHRyYS1wYXJlbnNcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0KSB7IHJldHVybiAodGFyZ2V0IGluc3RhbmNlb2YgZ2V0V2luZG93T2YodGFyZ2V0KS5TVkdFbGVtZW50ICYmXHJcbiAgICAgICAgdHlwZW9mIHRhcmdldC5nZXRCQm94ID09PSAnZnVuY3Rpb24nKTsgfTtcclxufSkoKTtcclxuLyoqXHJcbiAqIENoZWNrcyB3aGV0aGVyIHByb3ZpZGVkIGVsZW1lbnQgaXMgYSBkb2N1bWVudCBlbGVtZW50ICg8aHRtbD4pLlxyXG4gKlxyXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCAtIEVsZW1lbnQgdG8gYmUgY2hlY2tlZC5cclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5mdW5jdGlvbiBpc0RvY3VtZW50RWxlbWVudCh0YXJnZXQpIHtcclxuICAgIHJldHVybiB0YXJnZXQgPT09IGdldFdpbmRvd09mKHRhcmdldCkuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xyXG59XHJcbi8qKlxyXG4gKiBDYWxjdWxhdGVzIGFuIGFwcHJvcHJpYXRlIGNvbnRlbnQgcmVjdGFuZ2xlIGZvciBwcm92aWRlZCBodG1sIG9yIHN2ZyBlbGVtZW50LlxyXG4gKlxyXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCAtIEVsZW1lbnQgY29udGVudCByZWN0YW5nbGUgb2Ygd2hpY2ggbmVlZHMgdG8gYmUgY2FsY3VsYXRlZC5cclxuICogQHJldHVybnMge0RPTVJlY3RJbml0fVxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0Q29udGVudFJlY3QodGFyZ2V0KSB7XHJcbiAgICBpZiAoIWlzQnJvd3Nlcikge1xyXG4gICAgICAgIHJldHVybiBlbXB0eVJlY3Q7XHJcbiAgICB9XHJcbiAgICBpZiAoaXNTVkdHcmFwaGljc0VsZW1lbnQodGFyZ2V0KSkge1xyXG4gICAgICAgIHJldHVybiBnZXRTVkdDb250ZW50UmVjdCh0YXJnZXQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdldEhUTUxFbGVtZW50Q29udGVudFJlY3QodGFyZ2V0KTtcclxufVxyXG4vKipcclxuICogQ3JlYXRlcyByZWN0YW5nbGUgd2l0aCBhbiBpbnRlcmZhY2Ugb2YgdGhlIERPTVJlY3RSZWFkT25seS5cclxuICogU3BlYzogaHR0cHM6Ly9kcmFmdHMuZnh0Zi5vcmcvZ2VvbWV0cnkvI2RvbXJlY3RyZWFkb25seVxyXG4gKlxyXG4gKiBAcGFyYW0ge0RPTVJlY3RJbml0fSByZWN0SW5pdCAtIE9iamVjdCB3aXRoIHJlY3RhbmdsZSdzIHgveSBjb29yZGluYXRlcyBhbmQgZGltZW5zaW9ucy5cclxuICogQHJldHVybnMge0RPTVJlY3RSZWFkT25seX1cclxuICovXHJcbmZ1bmN0aW9uIGNyZWF0ZVJlYWRPbmx5UmVjdChfYSkge1xyXG4gICAgdmFyIHggPSBfYS54LCB5ID0gX2EueSwgd2lkdGggPSBfYS53aWR0aCwgaGVpZ2h0ID0gX2EuaGVpZ2h0O1xyXG4gICAgLy8gSWYgRE9NUmVjdFJlYWRPbmx5IGlzIGF2YWlsYWJsZSB1c2UgaXQgYXMgYSBwcm90b3R5cGUgZm9yIHRoZSByZWN0YW5nbGUuXHJcbiAgICB2YXIgQ29uc3RyID0gdHlwZW9mIERPTVJlY3RSZWFkT25seSAhPT0gJ3VuZGVmaW5lZCcgPyBET01SZWN0UmVhZE9ubHkgOiBPYmplY3Q7XHJcbiAgICB2YXIgcmVjdCA9IE9iamVjdC5jcmVhdGUoQ29uc3RyLnByb3RvdHlwZSk7XHJcbiAgICAvLyBSZWN0YW5nbGUncyBwcm9wZXJ0aWVzIGFyZSBub3Qgd3JpdGFibGUgYW5kIG5vbi1lbnVtZXJhYmxlLlxyXG4gICAgZGVmaW5lQ29uZmlndXJhYmxlKHJlY3QsIHtcclxuICAgICAgICB4OiB4LCB5OiB5LCB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0LFxyXG4gICAgICAgIHRvcDogeSxcclxuICAgICAgICByaWdodDogeCArIHdpZHRoLFxyXG4gICAgICAgIGJvdHRvbTogaGVpZ2h0ICsgeSxcclxuICAgICAgICBsZWZ0OiB4XHJcbiAgICB9KTtcclxuICAgIHJldHVybiByZWN0O1xyXG59XHJcbi8qKlxyXG4gKiBDcmVhdGVzIERPTVJlY3RJbml0IG9iamVjdCBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgZGltZW5zaW9ucyBhbmQgdGhlIHgveSBjb29yZGluYXRlcy5cclxuICogU3BlYzogaHR0cHM6Ly9kcmFmdHMuZnh0Zi5vcmcvZ2VvbWV0cnkvI2RpY3RkZWYtZG9tcmVjdGluaXRcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBYIGNvb3JkaW5hdGUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gWSBjb29yZGluYXRlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBSZWN0YW5nbGUncyB3aWR0aC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFJlY3RhbmdsZSdzIGhlaWdodC5cclxuICogQHJldHVybnMge0RPTVJlY3RJbml0fVxyXG4gKi9cclxuZnVuY3Rpb24gY3JlYXRlUmVjdEluaXQoeCwgeSwgd2lkdGgsIGhlaWdodCkge1xyXG4gICAgcmV0dXJuIHsgeDogeCwgeTogeSwgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9O1xyXG59XG5cbi8qKlxyXG4gKiBDbGFzcyB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciBjb21wdXRhdGlvbnMgb2YgdGhlIGNvbnRlbnQgcmVjdGFuZ2xlIG9mXHJcbiAqIHByb3ZpZGVkIERPTSBlbGVtZW50IGFuZCBmb3Iga2VlcGluZyB0cmFjayBvZiBpdCdzIGNoYW5nZXMuXHJcbiAqL1xyXG52YXIgUmVzaXplT2JzZXJ2YXRpb24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgUmVzaXplT2JzZXJ2YXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXQgLSBFbGVtZW50IHRvIGJlIG9ic2VydmVkLlxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBSZXNpemVPYnNlcnZhdGlvbih0YXJnZXQpIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBCcm9hZGNhc3RlZCB3aWR0aCBvZiBjb250ZW50IHJlY3RhbmdsZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5icm9hZGNhc3RXaWR0aCA9IDA7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQnJvYWRjYXN0ZWQgaGVpZ2h0IG9mIGNvbnRlbnQgcmVjdGFuZ2xlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmJyb2FkY2FzdEhlaWdodCA9IDA7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogUmVmZXJlbmNlIHRvIHRoZSBsYXN0IG9ic2VydmVkIGNvbnRlbnQgcmVjdGFuZ2xlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQHByaXZhdGUge0RPTVJlY3RJbml0fVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY29udGVudFJlY3RfID0gY3JlYXRlUmVjdEluaXQoMCwgMCwgMCwgMCk7XHJcbiAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgY29udGVudCByZWN0YW5nbGUgYW5kIHRlbGxzIHdoZXRoZXIgaXQncyB3aWR0aCBvciBoZWlnaHQgcHJvcGVydGllc1xyXG4gICAgICogaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IGJyb2FkY2FzdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgUmVzaXplT2JzZXJ2YXRpb24ucHJvdG90eXBlLmlzQWN0aXZlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciByZWN0ID0gZ2V0Q29udGVudFJlY3QodGhpcy50YXJnZXQpO1xyXG4gICAgICAgIHRoaXMuY29udGVudFJlY3RfID0gcmVjdDtcclxuICAgICAgICByZXR1cm4gKHJlY3Qud2lkdGggIT09IHRoaXMuYnJvYWRjYXN0V2lkdGggfHxcclxuICAgICAgICAgICAgcmVjdC5oZWlnaHQgIT09IHRoaXMuYnJvYWRjYXN0SGVpZ2h0KTtcclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgJ2Jyb2FkY2FzdFdpZHRoJyBhbmQgJ2Jyb2FkY2FzdEhlaWdodCcgcHJvcGVydGllcyB3aXRoIGEgZGF0YVxyXG4gICAgICogZnJvbSB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0aWVzIG9mIHRoZSBsYXN0IG9ic2VydmVkIGNvbnRlbnQgcmVjdGFuZ2xlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHtET01SZWN0SW5pdH0gTGFzdCBvYnNlcnZlZCBjb250ZW50IHJlY3RhbmdsZS5cclxuICAgICAqL1xyXG4gICAgUmVzaXplT2JzZXJ2YXRpb24ucHJvdG90eXBlLmJyb2FkY2FzdFJlY3QgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIHJlY3QgPSB0aGlzLmNvbnRlbnRSZWN0XztcclxuICAgICAgICB0aGlzLmJyb2FkY2FzdFdpZHRoID0gcmVjdC53aWR0aDtcclxuICAgICAgICB0aGlzLmJyb2FkY2FzdEhlaWdodCA9IHJlY3QuaGVpZ2h0O1xyXG4gICAgICAgIHJldHVybiByZWN0O1xyXG4gICAgfTtcclxuICAgIHJldHVybiBSZXNpemVPYnNlcnZhdGlvbjtcclxufSgpKTtcblxudmFyIFJlc2l6ZU9ic2VydmVyRW50cnkgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgUmVzaXplT2JzZXJ2ZXJFbnRyeS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCAtIEVsZW1lbnQgdGhhdCBpcyBiZWluZyBvYnNlcnZlZC5cclxuICAgICAqIEBwYXJhbSB7RE9NUmVjdEluaXR9IHJlY3RJbml0IC0gRGF0YSBvZiB0aGUgZWxlbWVudCdzIGNvbnRlbnQgcmVjdGFuZ2xlLlxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBSZXNpemVPYnNlcnZlckVudHJ5KHRhcmdldCwgcmVjdEluaXQpIHtcclxuICAgICAgICB2YXIgY29udGVudFJlY3QgPSBjcmVhdGVSZWFkT25seVJlY3QocmVjdEluaXQpO1xyXG4gICAgICAgIC8vIEFjY29yZGluZyB0byB0aGUgc3BlY2lmaWNhdGlvbiBmb2xsb3dpbmcgcHJvcGVydGllcyBhcmUgbm90IHdyaXRhYmxlXHJcbiAgICAgICAgLy8gYW5kIGFyZSBhbHNvIG5vdCBlbnVtZXJhYmxlIGluIHRoZSBuYXRpdmUgaW1wbGVtZW50YXRpb24uXHJcbiAgICAgICAgLy9cclxuICAgICAgICAvLyBQcm9wZXJ0eSBhY2Nlc3NvcnMgYXJlIG5vdCBiZWluZyB1c2VkIGFzIHRoZXknZCByZXF1aXJlIHRvIGRlZmluZSBhXHJcbiAgICAgICAgLy8gcHJpdmF0ZSBXZWFrTWFwIHN0b3JhZ2Ugd2hpY2ggbWF5IGNhdXNlIG1lbW9yeSBsZWFrcyBpbiBicm93c2VycyB0aGF0XHJcbiAgICAgICAgLy8gZG9uJ3Qgc3VwcG9ydCB0aGlzIHR5cGUgb2YgY29sbGVjdGlvbnMuXHJcbiAgICAgICAgZGVmaW5lQ29uZmlndXJhYmxlKHRoaXMsIHsgdGFyZ2V0OiB0YXJnZXQsIGNvbnRlbnRSZWN0OiBjb250ZW50UmVjdCB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBSZXNpemVPYnNlcnZlckVudHJ5O1xyXG59KCkpO1xuXG52YXIgUmVzaXplT2JzZXJ2ZXJTUEkgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgUmVzaXplT2JzZXJ2ZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtSZXNpemVPYnNlcnZlckNhbGxiYWNrfSBjYWxsYmFjayAtIENhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgaW52b2tlZFxyXG4gICAgICogICAgICB3aGVuIG9uZSBvZiB0aGUgb2JzZXJ2ZWQgZWxlbWVudHMgY2hhbmdlcyBpdCdzIGNvbnRlbnQgZGltZW5zaW9ucy5cclxuICAgICAqIEBwYXJhbSB7UmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyfSBjb250cm9sbGVyIC0gQ29udHJvbGxlciBpbnN0YW5jZSB3aGljaFxyXG4gICAgICogICAgICBpcyByZXNwb25zaWJsZSBmb3IgdGhlIHVwZGF0ZXMgb2Ygb2JzZXJ2ZXIuXHJcbiAgICAgKiBAcGFyYW0ge1Jlc2l6ZU9ic2VydmVyfSBjYWxsYmFja0N0eCAtIFJlZmVyZW5jZSB0byB0aGUgcHVibGljXHJcbiAgICAgKiAgICAgIFJlc2l6ZU9ic2VydmVyIGluc3RhbmNlIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIGNhbGxiYWNrIGZ1bmN0aW9uLlxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBSZXNpemVPYnNlcnZlclNQSShjYWxsYmFjaywgY29udHJvbGxlciwgY2FsbGJhY2tDdHgpIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBDb2xsZWN0aW9uIG9mIHJlc2l6ZSBvYnNlcnZhdGlvbnMgdGhhdCBoYXZlIGRldGVjdGVkIGNoYW5nZXMgaW4gZGltZW5zaW9uc1xyXG4gICAgICAgICAqIG9mIGVsZW1lbnRzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQHByaXZhdGUge0FycmF5PFJlc2l6ZU9ic2VydmF0aW9uPn1cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmFjdGl2ZU9ic2VydmF0aW9uc18gPSBbXTtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBSZWdpc3RyeSBvZiB0aGUgUmVzaXplT2JzZXJ2YXRpb24gaW5zdGFuY2VzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQHByaXZhdGUge01hcDxFbGVtZW50LCBSZXNpemVPYnNlcnZhdGlvbj59XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5vYnNlcnZhdGlvbnNfID0gbmV3IE1hcFNoaW0oKTtcclxuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBjYWxsYmFjayBwcm92aWRlZCBhcyBwYXJhbWV0ZXIgMSBpcyBub3QgYSBmdW5jdGlvbi4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jYWxsYmFja18gPSBjYWxsYmFjaztcclxuICAgICAgICB0aGlzLmNvbnRyb2xsZXJfID0gY29udHJvbGxlcjtcclxuICAgICAgICB0aGlzLmNhbGxiYWNrQ3R4XyA9IGNhbGxiYWNrQ3R4O1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTdGFydHMgb2JzZXJ2aW5nIHByb3ZpZGVkIGVsZW1lbnQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXQgLSBFbGVtZW50IHRvIGJlIG9ic2VydmVkLlxyXG4gICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgKi9cclxuICAgIFJlc2l6ZU9ic2VydmVyU1BJLnByb3RvdHlwZS5vYnNlcnZlID0gZnVuY3Rpb24gKHRhcmdldCkge1xyXG4gICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCcxIGFyZ3VtZW50IHJlcXVpcmVkLCBidXQgb25seSAwIHByZXNlbnQuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIERvIG5vdGhpbmcgaWYgY3VycmVudCBlbnZpcm9ubWVudCBkb2Vzbid0IGhhdmUgdGhlIEVsZW1lbnQgaW50ZXJmYWNlLlxyXG4gICAgICAgIGlmICh0eXBlb2YgRWxlbWVudCA9PT0gJ3VuZGVmaW5lZCcgfHwgIShFbGVtZW50IGluc3RhbmNlb2YgT2JqZWN0KSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIGdldFdpbmRvd09mKHRhcmdldCkuRWxlbWVudCkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncGFyYW1ldGVyIDEgaXMgbm90IG9mIHR5cGUgXCJFbGVtZW50XCIuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBvYnNlcnZhdGlvbnMgPSB0aGlzLm9ic2VydmF0aW9uc187XHJcbiAgICAgICAgLy8gRG8gbm90aGluZyBpZiBlbGVtZW50IGlzIGFscmVhZHkgYmVpbmcgb2JzZXJ2ZWQuXHJcbiAgICAgICAgaWYgKG9ic2VydmF0aW9ucy5oYXModGFyZ2V0KSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9ic2VydmF0aW9ucy5zZXQodGFyZ2V0LCBuZXcgUmVzaXplT2JzZXJ2YXRpb24odGFyZ2V0KSk7XHJcbiAgICAgICAgdGhpcy5jb250cm9sbGVyXy5hZGRPYnNlcnZlcih0aGlzKTtcclxuICAgICAgICAvLyBGb3JjZSB0aGUgdXBkYXRlIG9mIG9ic2VydmF0aW9ucy5cclxuICAgICAgICB0aGlzLmNvbnRyb2xsZXJfLnJlZnJlc2goKTtcclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIFN0b3BzIG9ic2VydmluZyBwcm92aWRlZCBlbGVtZW50LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0IC0gRWxlbWVudCB0byBzdG9wIG9ic2VydmluZy5cclxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICovXHJcbiAgICBSZXNpemVPYnNlcnZlclNQSS5wcm90b3R5cGUudW5vYnNlcnZlID0gZnVuY3Rpb24gKHRhcmdldCkge1xyXG4gICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCcxIGFyZ3VtZW50IHJlcXVpcmVkLCBidXQgb25seSAwIHByZXNlbnQuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIERvIG5vdGhpbmcgaWYgY3VycmVudCBlbnZpcm9ubWVudCBkb2Vzbid0IGhhdmUgdGhlIEVsZW1lbnQgaW50ZXJmYWNlLlxyXG4gICAgICAgIGlmICh0eXBlb2YgRWxlbWVudCA9PT0gJ3VuZGVmaW5lZCcgfHwgIShFbGVtZW50IGluc3RhbmNlb2YgT2JqZWN0KSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIGdldFdpbmRvd09mKHRhcmdldCkuRWxlbWVudCkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncGFyYW1ldGVyIDEgaXMgbm90IG9mIHR5cGUgXCJFbGVtZW50XCIuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBvYnNlcnZhdGlvbnMgPSB0aGlzLm9ic2VydmF0aW9uc187XHJcbiAgICAgICAgLy8gRG8gbm90aGluZyBpZiBlbGVtZW50IGlzIG5vdCBiZWluZyBvYnNlcnZlZC5cclxuICAgICAgICBpZiAoIW9ic2VydmF0aW9ucy5oYXModGFyZ2V0KSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9ic2VydmF0aW9ucy5kZWxldGUodGFyZ2V0KTtcclxuICAgICAgICBpZiAoIW9ic2VydmF0aW9ucy5zaXplKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlcl8ucmVtb3ZlT2JzZXJ2ZXIodGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIC8qKlxyXG4gICAgICogU3RvcHMgb2JzZXJ2aW5nIGFsbCBlbGVtZW50cy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAqL1xyXG4gICAgUmVzaXplT2JzZXJ2ZXJTUEkucHJvdG90eXBlLmRpc2Nvbm5lY3QgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5jbGVhckFjdGl2ZSgpO1xyXG4gICAgICAgIHRoaXMub2JzZXJ2YXRpb25zXy5jbGVhcigpO1xyXG4gICAgICAgIHRoaXMuY29udHJvbGxlcl8ucmVtb3ZlT2JzZXJ2ZXIodGhpcyk7XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBDb2xsZWN0cyBvYnNlcnZhdGlvbiBpbnN0YW5jZXMgdGhlIGFzc29jaWF0ZWQgZWxlbWVudCBvZiB3aGljaCBoYXMgY2hhbmdlZFxyXG4gICAgICogaXQncyBjb250ZW50IHJlY3RhbmdsZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAqL1xyXG4gICAgUmVzaXplT2JzZXJ2ZXJTUEkucHJvdG90eXBlLmdhdGhlckFjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIHRoaXMuY2xlYXJBY3RpdmUoKTtcclxuICAgICAgICB0aGlzLm9ic2VydmF0aW9uc18uZm9yRWFjaChmdW5jdGlvbiAob2JzZXJ2YXRpb24pIHtcclxuICAgICAgICAgICAgaWYgKG9ic2VydmF0aW9uLmlzQWN0aXZlKCkpIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLmFjdGl2ZU9ic2VydmF0aW9uc18ucHVzaChvYnNlcnZhdGlvbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIEludm9rZXMgaW5pdGlhbCBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIGEgbGlzdCBvZiBSZXNpemVPYnNlcnZlckVudHJ5XHJcbiAgICAgKiBpbnN0YW5jZXMgY29sbGVjdGVkIGZyb20gYWN0aXZlIHJlc2l6ZSBvYnNlcnZhdGlvbnMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgKi9cclxuICAgIFJlc2l6ZU9ic2VydmVyU1BJLnByb3RvdHlwZS5icm9hZGNhc3RBY3RpdmUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLy8gRG8gbm90aGluZyBpZiBvYnNlcnZlciBkb2Vzbid0IGhhdmUgYWN0aXZlIG9ic2VydmF0aW9ucy5cclxuICAgICAgICBpZiAoIXRoaXMuaGFzQWN0aXZlKCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgY3R4ID0gdGhpcy5jYWxsYmFja0N0eF87XHJcbiAgICAgICAgLy8gQ3JlYXRlIFJlc2l6ZU9ic2VydmVyRW50cnkgaW5zdGFuY2UgZm9yIGV2ZXJ5IGFjdGl2ZSBvYnNlcnZhdGlvbi5cclxuICAgICAgICB2YXIgZW50cmllcyA9IHRoaXMuYWN0aXZlT2JzZXJ2YXRpb25zXy5tYXAoZnVuY3Rpb24gKG9ic2VydmF0aW9uKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVzaXplT2JzZXJ2ZXJFbnRyeShvYnNlcnZhdGlvbi50YXJnZXQsIG9ic2VydmF0aW9uLmJyb2FkY2FzdFJlY3QoKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5jYWxsYmFja18uY2FsbChjdHgsIGVudHJpZXMsIGN0eCk7XHJcbiAgICAgICAgdGhpcy5jbGVhckFjdGl2ZSgpO1xyXG4gICAgfTtcclxuICAgIC8qKlxyXG4gICAgICogQ2xlYXJzIHRoZSBjb2xsZWN0aW9uIG9mIGFjdGl2ZSBvYnNlcnZhdGlvbnMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgKi9cclxuICAgIFJlc2l6ZU9ic2VydmVyU1BJLnByb3RvdHlwZS5jbGVhckFjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLmFjdGl2ZU9ic2VydmF0aW9uc18uc3BsaWNlKDApO1xyXG4gICAgfTtcclxuICAgIC8qKlxyXG4gICAgICogVGVsbHMgd2hldGhlciBvYnNlcnZlciBoYXMgYWN0aXZlIG9ic2VydmF0aW9ucy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgUmVzaXplT2JzZXJ2ZXJTUEkucHJvdG90eXBlLmhhc0FjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVPYnNlcnZhdGlvbnNfLmxlbmd0aCA+IDA7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIFJlc2l6ZU9ic2VydmVyU1BJO1xyXG59KCkpO1xuXG4vLyBSZWdpc3RyeSBvZiBpbnRlcm5hbCBvYnNlcnZlcnMuIElmIFdlYWtNYXAgaXMgbm90IGF2YWlsYWJsZSB1c2UgY3VycmVudCBzaGltXHJcbi8vIGZvciB0aGUgTWFwIGNvbGxlY3Rpb24gYXMgaXQgaGFzIGFsbCByZXF1aXJlZCBtZXRob2RzIGFuZCBiZWNhdXNlIFdlYWtNYXBcclxuLy8gY2FuJ3QgYmUgZnVsbHkgcG9seWZpbGxlZCBhbnl3YXkuXHJcbnZhciBvYnNlcnZlcnMgPSB0eXBlb2YgV2Vha01hcCAhPT0gJ3VuZGVmaW5lZCcgPyBuZXcgV2Vha01hcCgpIDogbmV3IE1hcFNoaW0oKTtcclxuLyoqXHJcbiAqIFJlc2l6ZU9ic2VydmVyIEFQSS4gRW5jYXBzdWxhdGVzIHRoZSBSZXNpemVPYnNlcnZlciBTUEkgaW1wbGVtZW50YXRpb25cclxuICogZXhwb3Npbmcgb25seSB0aG9zZSBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIHRoYXQgYXJlIGRlZmluZWQgaW4gdGhlIHNwZWMuXHJcbiAqL1xyXG52YXIgUmVzaXplT2JzZXJ2ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgUmVzaXplT2JzZXJ2ZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtSZXNpemVPYnNlcnZlckNhbGxiYWNrfSBjYWxsYmFjayAtIENhbGxiYWNrIHRoYXQgaXMgaW52b2tlZCB3aGVuXHJcbiAgICAgKiAgICAgIGRpbWVuc2lvbnMgb2YgdGhlIG9ic2VydmVkIGVsZW1lbnRzIGNoYW5nZS5cclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gUmVzaXplT2JzZXJ2ZXIoY2FsbGJhY2spIHtcclxuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVzaXplT2JzZXJ2ZXIpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbi4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJzEgYXJndW1lbnQgcmVxdWlyZWQsIGJ1dCBvbmx5IDAgcHJlc2VudC4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGNvbnRyb2xsZXIgPSBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKTtcclxuICAgICAgICB2YXIgb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXJTUEkoY2FsbGJhY2ssIGNvbnRyb2xsZXIsIHRoaXMpO1xyXG4gICAgICAgIG9ic2VydmVycy5zZXQodGhpcywgb2JzZXJ2ZXIpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFJlc2l6ZU9ic2VydmVyO1xyXG59KCkpO1xyXG4vLyBFeHBvc2UgcHVibGljIG1ldGhvZHMgb2YgUmVzaXplT2JzZXJ2ZXIuXHJcbltcclxuICAgICdvYnNlcnZlJyxcclxuICAgICd1bm9ic2VydmUnLFxyXG4gICAgJ2Rpc2Nvbm5lY3QnXHJcbl0uZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kKSB7XHJcbiAgICBSZXNpemVPYnNlcnZlci5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgcmV0dXJuIChfYSA9IG9ic2VydmVycy5nZXQodGhpcykpW21ldGhvZF0uYXBwbHkoX2EsIGFyZ3VtZW50cyk7XHJcbiAgICB9O1xyXG59KTtcblxudmFyIGluZGV4ID0gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8vIEV4cG9ydCBleGlzdGluZyBpbXBsZW1lbnRhdGlvbiBpZiBhdmFpbGFibGUuXHJcbiAgICBpZiAodHlwZW9mIGdsb2JhbCQxLlJlc2l6ZU9ic2VydmVyICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHJldHVybiBnbG9iYWwkMS5SZXNpemVPYnNlcnZlcjtcclxuICAgIH1cclxuICAgIHJldHVybiBSZXNpemVPYnNlcnZlcjtcclxufSkoKTtcblxuZXhwb3J0IGRlZmF1bHQgaW5kZXg7XG4iLCAiaW1wb3J0IFJlc2l6ZU9ic2VydmVyIGZyb20gJ3Jlc2l6ZS1vYnNlcnZlci1wb2x5ZmlsbCc7XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IENvbnN0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbnZhciBlbGVtZW50TGlzdGVuZXJzID0gbmV3IE1hcCgpO1xuZnVuY3Rpb24gb25SZXNpemUoZW50aXRpZXMpIHtcbiAgZW50aXRpZXMuZm9yRWFjaChmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgdmFyIF9lbGVtZW50TGlzdGVuZXJzJGdldDtcbiAgICB2YXIgdGFyZ2V0ID0gZW50aXR5LnRhcmdldDtcbiAgICAoX2VsZW1lbnRMaXN0ZW5lcnMkZ2V0ID0gZWxlbWVudExpc3RlbmVycy5nZXQodGFyZ2V0KSkgPT09IG51bGwgfHwgX2VsZW1lbnRMaXN0ZW5lcnMkZ2V0ID09PSB2b2lkIDAgfHwgX2VsZW1lbnRMaXN0ZW5lcnMkZ2V0LmZvckVhY2goZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gbGlzdGVuZXIodGFyZ2V0KTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8vIE5vdGU6IFJlc2l6ZU9ic2VydmVyIHBvbHlmaWxsIG5vdCBzdXBwb3J0IG9wdGlvbiB0byBtZWFzdXJlIGJvcmRlci1ib3ggcmVzaXplXG52YXIgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIob25SZXNpemUpO1xuXG4vLyBEZXYgZW52IG9ubHlcbmV4cG9ydCB2YXIgX2VsID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGVsZW1lbnRMaXN0ZW5lcnMgOiBudWxsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG5leHBvcnQgdmFyIF9ycyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBvblJlc2l6ZSA6IG51bGw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IE9ic2VydmUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgZnVuY3Rpb24gb2JzZXJ2ZShlbGVtZW50LCBjYWxsYmFjaykge1xuICBpZiAoIWVsZW1lbnRMaXN0ZW5lcnMuaGFzKGVsZW1lbnQpKSB7XG4gICAgZWxlbWVudExpc3RlbmVycy5zZXQoZWxlbWVudCwgbmV3IFNldCgpKTtcbiAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGVsZW1lbnQpO1xuICB9XG4gIGVsZW1lbnRMaXN0ZW5lcnMuZ2V0KGVsZW1lbnQpLmFkZChjYWxsYmFjayk7XG59XG5leHBvcnQgZnVuY3Rpb24gdW5vYnNlcnZlKGVsZW1lbnQsIGNhbGxiYWNrKSB7XG4gIGlmIChlbGVtZW50TGlzdGVuZXJzLmhhcyhlbGVtZW50KSkge1xuICAgIGVsZW1lbnRMaXN0ZW5lcnMuZ2V0KGVsZW1lbnQpLmRlbGV0ZShjYWxsYmFjayk7XG4gICAgaWYgKCFlbGVtZW50TGlzdGVuZXJzLmdldChlbGVtZW50KS5zaXplKSB7XG4gICAgICByZXNpemVPYnNlcnZlci51bm9ic2VydmUoZWxlbWVudCk7XG4gICAgICBlbGVtZW50TGlzdGVuZXJzLmRlbGV0ZShlbGVtZW50KTtcbiAgICB9XG4gIH1cbn0iLCAiZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGEsIG4pIHtcbiAgaWYgKCEoYSBpbnN0YW5jZW9mIG4pKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xufVxuZXhwb3J0IHsgX2NsYXNzQ2FsbENoZWNrIGFzIGRlZmF1bHQgfTsiLCAiaW1wb3J0IHRvUHJvcGVydHlLZXkgZnJvbSBcIi4vdG9Qcm9wZXJ0eUtleS5qc1wiO1xuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXMoZSwgcikge1xuICBmb3IgKHZhciB0ID0gMDsgdCA8IHIubGVuZ3RoOyB0KyspIHtcbiAgICB2YXIgbyA9IHJbdF07XG4gICAgby5lbnVtZXJhYmxlID0gby5lbnVtZXJhYmxlIHx8ICExLCBvLmNvbmZpZ3VyYWJsZSA9ICEwLCBcInZhbHVlXCIgaW4gbyAmJiAoby53cml0YWJsZSA9ICEwKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHRvUHJvcGVydHlLZXkoby5rZXkpLCBvKTtcbiAgfVxufVxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKGUsIHIsIHQpIHtcbiAgcmV0dXJuIHIgJiYgX2RlZmluZVByb3BlcnRpZXMoZS5wcm90b3R5cGUsIHIpLCB0ICYmIF9kZWZpbmVQcm9wZXJ0aWVzKGUsIHQpLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJwcm90b3R5cGVcIiwge1xuICAgIHdyaXRhYmxlOiAhMVxuICB9KSwgZTtcbn1cbmV4cG9ydCB7IF9jcmVhdGVDbGFzcyBhcyBkZWZhdWx0IH07IiwgImZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZih0LCBlKSB7XG4gIHJldHVybiBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gKHQsIGUpIHtcbiAgICByZXR1cm4gdC5fX3Byb3RvX18gPSBlLCB0O1xuICB9LCBfc2V0UHJvdG90eXBlT2YodCwgZSk7XG59XG5leHBvcnQgeyBfc2V0UHJvdG90eXBlT2YgYXMgZGVmYXVsdCB9OyIsICJpbXBvcnQgc2V0UHJvdG90eXBlT2YgZnJvbSBcIi4vc2V0UHJvdG90eXBlT2YuanNcIjtcbmZ1bmN0aW9uIF9pbmhlcml0cyh0LCBlKSB7XG4gIGlmIChcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIGUgJiYgbnVsbCAhPT0gZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO1xuICB0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoZSAmJiBlLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogdCxcbiAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICB9XG4gIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJwcm90b3R5cGVcIiwge1xuICAgIHdyaXRhYmxlOiAhMVxuICB9KSwgZSAmJiBzZXRQcm90b3R5cGVPZih0LCBlKTtcbn1cbmV4cG9ydCB7IF9pbmhlcml0cyBhcyBkZWZhdWx0IH07IiwgImZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZih0KSB7XG4gIHJldHVybiBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdC5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKHQpO1xuICB9LCBfZ2V0UHJvdG90eXBlT2YodCk7XG59XG5leHBvcnQgeyBfZ2V0UHJvdG90eXBlT2YgYXMgZGVmYXVsdCB9OyIsICJmdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkge1xuICB0cnkge1xuICAgIHZhciB0ID0gIUJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTtcbiAgfSBjYXRjaCAodCkge31cbiAgcmV0dXJuIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHtcbiAgICByZXR1cm4gISF0O1xuICB9KSgpO1xufVxuZXhwb3J0IHsgX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCBhcyBkZWZhdWx0IH07IiwgImZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoZSkge1xuICBpZiAodm9pZCAwID09PSBlKSB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7XG4gIHJldHVybiBlO1xufVxuZXhwb3J0IHsgX2Fzc2VydFRoaXNJbml0aWFsaXplZCBhcyBkZWZhdWx0IH07IiwgImltcG9ydCBfdHlwZW9mIGZyb20gXCIuL3R5cGVvZi5qc1wiO1xuaW1wb3J0IGFzc2VydFRoaXNJbml0aWFsaXplZCBmcm9tIFwiLi9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQuanNcIjtcbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHQsIGUpIHtcbiAgaWYgKGUgJiYgKFwib2JqZWN0XCIgPT0gX3R5cGVvZihlKSB8fCBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIGUpKSByZXR1cm4gZTtcbiAgaWYgKHZvaWQgMCAhPT0gZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkRlcml2ZWQgY29uc3RydWN0b3JzIG1heSBvbmx5IHJldHVybiBvYmplY3Qgb3IgdW5kZWZpbmVkXCIpO1xuICByZXR1cm4gYXNzZXJ0VGhpc0luaXRpYWxpemVkKHQpO1xufVxuZXhwb3J0IHsgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4gYXMgZGVmYXVsdCB9OyIsICJpbXBvcnQgZ2V0UHJvdG90eXBlT2YgZnJvbSBcIi4vZ2V0UHJvdG90eXBlT2YuanNcIjtcbmltcG9ydCBpc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgZnJvbSBcIi4vaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0LmpzXCI7XG5pbXBvcnQgcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiBmcm9tIFwiLi9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuLmpzXCI7XG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIodCkge1xuICB2YXIgciA9IGlzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBlLFxuICAgICAgbyA9IGdldFByb3RvdHlwZU9mKHQpO1xuICAgIGlmIChyKSB7XG4gICAgICB2YXIgcyA9IGdldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yO1xuICAgICAgZSA9IFJlZmxlY3QuY29uc3RydWN0KG8sIGFyZ3VtZW50cywgcyk7XG4gICAgfSBlbHNlIGUgPSBvLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZSk7XG4gIH07XG59XG5leHBvcnQgeyBfY3JlYXRlU3VwZXIgYXMgZGVmYXVsdCB9OyIsICJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzXCI7XG5pbXBvcnQgX2NyZWF0ZVN1cGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVTdXBlclwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuLyoqXG4gKiBGYWxsYmFjayB0byBmaW5kRE9NTm9kZSBpZiBvcmlnaW4gcmVmIGRvIG5vdCBwcm92aWRlIGFueSBkb20gZWxlbWVudFxuICovXG52YXIgRG9tV3JhcHBlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoRG9tV3JhcHBlciwgX1JlYWN0JENvbXBvbmVudCk7XG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoRG9tV3JhcHBlcik7XG4gIGZ1bmN0aW9uIERvbVdyYXBwZXIoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERvbVdyYXBwZXIpO1xuICAgIHJldHVybiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuICBfY3JlYXRlQ2xhc3MoRG9tV3JhcHBlciwgW3tcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLmNoaWxkcmVuO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gRG9tV3JhcHBlcjtcbn0oUmVhY3QuQ29tcG9uZW50KTtcbmV4cG9ydCB7IERvbVdyYXBwZXIgYXMgZGVmYXVsdCB9OyIsICJmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShyLCBhKSB7XG4gIChudWxsID09IGEgfHwgYSA+IHIubGVuZ3RoKSAmJiAoYSA9IHIubGVuZ3RoKTtcbiAgZm9yICh2YXIgZSA9IDAsIG4gPSBBcnJheShhKTsgZSA8IGE7IGUrKykgbltlXSA9IHJbZV07XG4gIHJldHVybiBuO1xufVxuZXhwb3J0IHsgX2FycmF5TGlrZVRvQXJyYXkgYXMgZGVmYXVsdCB9OyIsICJpbXBvcnQgYXJyYXlMaWtlVG9BcnJheSBmcm9tIFwiLi9hcnJheUxpa2VUb0FycmF5LmpzXCI7XG5mdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMocikge1xuICBpZiAoQXJyYXkuaXNBcnJheShyKSkgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXkocik7XG59XG5leHBvcnQgeyBfYXJyYXlXaXRob3V0SG9sZXMgYXMgZGVmYXVsdCB9OyIsICJmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KHIpIHtcbiAgaWYgKFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIFN5bWJvbCAmJiBudWxsICE9IHJbU3ltYm9sLml0ZXJhdG9yXSB8fCBudWxsICE9IHJbXCJAQGl0ZXJhdG9yXCJdKSByZXR1cm4gQXJyYXkuZnJvbShyKTtcbn1cbmV4cG9ydCB7IF9pdGVyYWJsZVRvQXJyYXkgYXMgZGVmYXVsdCB9OyIsICJpbXBvcnQgYXJyYXlMaWtlVG9BcnJheSBmcm9tIFwiLi9hcnJheUxpa2VUb0FycmF5LmpzXCI7XG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkociwgYSkge1xuICBpZiAocikge1xuICAgIGlmIChcInN0cmluZ1wiID09IHR5cGVvZiByKSByZXR1cm4gYXJyYXlMaWtlVG9BcnJheShyLCBhKTtcbiAgICB2YXIgdCA9IHt9LnRvU3RyaW5nLmNhbGwocikuc2xpY2UoOCwgLTEpO1xuICAgIHJldHVybiBcIk9iamVjdFwiID09PSB0ICYmIHIuY29uc3RydWN0b3IgJiYgKHQgPSByLmNvbnN0cnVjdG9yLm5hbWUpLCBcIk1hcFwiID09PSB0IHx8IFwiU2V0XCIgPT09IHQgPyBBcnJheS5mcm9tKHIpIDogXCJBcmd1bWVudHNcIiA9PT0gdCB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdCh0KSA/IGFycmF5TGlrZVRvQXJyYXkociwgYSkgOiB2b2lkIDA7XG4gIH1cbn1cbmV4cG9ydCB7IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSBhcyBkZWZhdWx0IH07IiwgImZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59XG5leHBvcnQgeyBfbm9uSXRlcmFibGVTcHJlYWQgYXMgZGVmYXVsdCB9OyIsICJpbXBvcnQgYXJyYXlXaXRob3V0SG9sZXMgZnJvbSBcIi4vYXJyYXlXaXRob3V0SG9sZXMuanNcIjtcbmltcG9ydCBpdGVyYWJsZVRvQXJyYXkgZnJvbSBcIi4vaXRlcmFibGVUb0FycmF5LmpzXCI7XG5pbXBvcnQgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkgZnJvbSBcIi4vdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkuanNcIjtcbmltcG9ydCBub25JdGVyYWJsZVNwcmVhZCBmcm9tIFwiLi9ub25JdGVyYWJsZVNwcmVhZC5qc1wiO1xuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KHIpIHtcbiAgcmV0dXJuIGFycmF5V2l0aG91dEhvbGVzKHIpIHx8IGl0ZXJhYmxlVG9BcnJheShyKSB8fCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShyKSB8fCBub25JdGVyYWJsZVNwcmVhZCgpO1xufVxuZXhwb3J0IHsgX3RvQ29uc3VtYWJsZUFycmF5IGFzIGRlZmF1bHQgfTsiLCAidmFyIHJhZiA9IGZ1bmN0aW9uIHJhZihjYWxsYmFjaykge1xuICByZXR1cm4gK3NldFRpbWVvdXQoY2FsbGJhY2ssIDE2KTtcbn07XG52YXIgY2FmID0gZnVuY3Rpb24gY2FmKG51bSkge1xuICByZXR1cm4gY2xlYXJUaW1lb3V0KG51bSk7XG59O1xuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmICdyZXF1ZXN0QW5pbWF0aW9uRnJhbWUnIGluIHdpbmRvdykge1xuICByYWYgPSBmdW5jdGlvbiByYWYoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShjYWxsYmFjayk7XG4gIH07XG4gIGNhZiA9IGZ1bmN0aW9uIGNhZihoYW5kbGUpIHtcbiAgICByZXR1cm4gd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKGhhbmRsZSk7XG4gIH07XG59XG52YXIgcmFmVVVJRCA9IDA7XG52YXIgcmFmSWRzID0gbmV3IE1hcCgpO1xuZnVuY3Rpb24gY2xlYW51cChpZCkge1xuICByYWZJZHMuZGVsZXRlKGlkKTtcbn1cbnZhciB3cmFwcGVyUmFmID0gZnVuY3Rpb24gd3JhcHBlclJhZihjYWxsYmFjaykge1xuICB2YXIgdGltZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDE7XG4gIHJhZlVVSUQgKz0gMTtcbiAgdmFyIGlkID0gcmFmVVVJRDtcbiAgZnVuY3Rpb24gY2FsbFJlZihsZWZ0VGltZXMpIHtcbiAgICBpZiAobGVmdFRpbWVzID09PSAwKSB7XG4gICAgICAvLyBDbGVhbiB1cFxuICAgICAgY2xlYW51cChpZCk7XG5cbiAgICAgIC8vIFRyaWdnZXJcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5leHQgcmFmXG4gICAgICB2YXIgcmVhbElkID0gcmFmKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2FsbFJlZihsZWZ0VGltZXMgLSAxKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBCaW5kIHJlYWwgcmFmIGlkXG4gICAgICByYWZJZHMuc2V0KGlkLCByZWFsSWQpO1xuICAgIH1cbiAgfVxuICBjYWxsUmVmKHRpbWVzKTtcbiAgcmV0dXJuIGlkO1xufTtcbndyYXBwZXJSYWYuY2FuY2VsID0gZnVuY3Rpb24gKGlkKSB7XG4gIHZhciByZWFsSWQgPSByYWZJZHMuZ2V0KGlkKTtcbiAgY2xlYW51cChpZCk7XG4gIHJldHVybiBjYWYocmVhbElkKTtcbn07XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB3cmFwcGVyUmFmLmlkcyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcmFmSWRzO1xuICB9O1xufVxuZXhwb3J0IGRlZmF1bHQgd3JhcHBlclJhZjsiLCAiXCJ1c2UgY2xpZW50XCI7XG5cbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjcmVhdGVUaGVtZSwgU3R5bGVDb250ZXh0IGFzIENzc0luSnNTdHlsZUNvbnRleHQgfSBmcm9tICdAYW50LWRlc2lnbi9jc3NpbmpzJztcbmltcG9ydCBJY29uQ29udGV4dCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvY29tcG9uZW50cy9Db250ZXh0XCI7XG5pbXBvcnQgdXNlTWVtbyBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VNZW1vXCI7XG5pbXBvcnQgeyBtZXJnZSB9IGZyb20gXCJyYy11dGlsL2VzL3V0aWxzL3NldFwiO1xuaW1wb3J0IHdhcm5pbmcsIHsgZGV2VXNlV2FybmluZywgV2FybmluZ0NvbnRleHQgfSBmcm9tICcuLi9fdXRpbC93YXJuaW5nJztcbmltcG9ydCBWYWxpZGF0ZU1lc3NhZ2VzQ29udGV4dCBmcm9tICcuLi9mb3JtL3ZhbGlkYXRlTWVzc2FnZXNDb250ZXh0JztcbmltcG9ydCBMb2NhbGVQcm92aWRlciwgeyBBTlRfTUFSSyB9IGZyb20gJy4uL2xvY2FsZSc7XG5pbXBvcnQgTG9jYWxlQ29udGV4dCBmcm9tICcuLi9sb2NhbGUvY29udGV4dCc7XG5pbXBvcnQgZGVmYXVsdExvY2FsZSBmcm9tICcuLi9sb2NhbGUvZW5fVVMnO1xuaW1wb3J0IHsgZGVmYXVsdFRoZW1lLCBEZXNpZ25Ub2tlbkNvbnRleHQgfSBmcm9tICcuLi90aGVtZS9jb250ZXh0JztcbmltcG9ydCBkZWZhdWx0U2VlZFRva2VuIGZyb20gJy4uL3RoZW1lL3RoZW1lcy9zZWVkJztcbmltcG9ydCB7IENvbmZpZ0NvbnN1bWVyLCBDb25maWdDb250ZXh0LCBkZWZhdWx0SWNvblByZWZpeENscywgZGVmYXVsdFByZWZpeENscywgVmFyaWFudHMgfSBmcm9tICcuL2NvbnRleHQnO1xuaW1wb3J0IHsgcmVnaXN0ZXJUaGVtZSB9IGZyb20gJy4vY3NzVmFyaWFibGVzJztcbmltcG9ydCB7IERpc2FibGVkQ29udGV4dFByb3ZpZGVyIH0gZnJvbSAnLi9EaXNhYmxlZENvbnRleHQnO1xuaW1wb3J0IHVzZUNvbmZpZyBmcm9tICcuL2hvb2tzL3VzZUNvbmZpZyc7XG5pbXBvcnQgdXNlVGhlbWUgZnJvbSAnLi9ob29rcy91c2VUaGVtZSc7XG5pbXBvcnQgTW90aW9uV3JhcHBlciBmcm9tICcuL01vdGlvbldyYXBwZXInO1xuaW1wb3J0IFByb3BXYXJuaW5nIGZyb20gJy4vUHJvcFdhcm5pbmcnO1xuaW1wb3J0IFNpemVDb250ZXh0LCB7IFNpemVDb250ZXh0UHJvdmlkZXIgfSBmcm9tICcuL1NpemVDb250ZXh0JztcbmltcG9ydCB1c2VTdHlsZSBmcm9tICcuL3N0eWxlJztcbmV4cG9ydCB7IFZhcmlhbnRzIH07XG4vKipcbiAqIFNpbmNlIHRvbyBtYW55IGZlZWRiYWNrIHVzaW5nIHN0YXRpYyBtZXRob2QgbGlrZSBgTW9kYWwuY29uZmlybWAgbm90IGdldHRpbmcgdGhlbWUsIHdlIHJlY29yZCB0aGVcbiAqIHRoZW1lIHJlZ2lzdGVyIGluZm8gaGVyZSB0byBoZWxwIGRldmVsb3BlciBnZXQgd2FybmluZyBpbmZvLlxuICovXG5sZXQgZXhpc3RUaGVtZUNvbmZpZyA9IGZhbHNlO1xuZXhwb3J0IGNvbnN0IHdhcm5Db250ZXh0ID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGNvbXBvbmVudE5hbWUgPT4ge1xuICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCFleGlzdFRoZW1lQ29uZmlnLCBjb21wb25lbnROYW1lLCBgU3RhdGljIGZ1bmN0aW9uIGNhbiBub3QgY29uc3VtZSBjb250ZXh0IGxpa2UgZHluYW1pYyB0aGVtZS4gUGxlYXNlIHVzZSAnQXBwJyBjb21wb25lbnQgaW5zdGVhZC5gKSA6IHZvaWQgMDtcbn0gOiAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xubnVsbDtcbmV4cG9ydCB7IENvbmZpZ0NvbnN1bWVyLCBDb25maWdDb250ZXh0LCBkZWZhdWx0UHJlZml4Q2xzLCBkZWZhdWx0SWNvblByZWZpeENscyB9O1xuZXhwb3J0IGNvbnN0IGNvbmZpZ0NvbnN1bWVyUHJvcHMgPSBbJ2dldFRhcmdldENvbnRhaW5lcicsICdnZXRQb3B1cENvbnRhaW5lcicsICdyb290UHJlZml4Q2xzJywgJ2dldFByZWZpeENscycsICdyZW5kZXJFbXB0eScsICdjc3AnLCAnYXV0b0luc2VydFNwYWNlSW5CdXR0b24nLCAnbG9jYWxlJ107XG4vLyBUaGVzZSBwcm9wcyBpcyB1c2VkIGJ5IGB1c2VDb250ZXh0YCBkaXJlY3RseSBpbiBzdWIgY29tcG9uZW50XG5jb25zdCBQQVNTRURfUFJPUFMgPSBbJ2dldFRhcmdldENvbnRhaW5lcicsICdnZXRQb3B1cENvbnRhaW5lcicsICdyZW5kZXJFbXB0eScsICdpbnB1dCcsICdwYWdpbmF0aW9uJywgJ2Zvcm0nLCAnc2VsZWN0JywgJ2J1dHRvbiddO1xubGV0IGdsb2JhbFByZWZpeENscztcbmxldCBnbG9iYWxJY29uUHJlZml4Q2xzO1xubGV0IGdsb2JhbFRoZW1lO1xubGV0IGdsb2JhbEhvbGRlclJlbmRlcjtcbmZ1bmN0aW9uIGdldEdsb2JhbFByZWZpeENscygpIHtcbiAgcmV0dXJuIGdsb2JhbFByZWZpeENscyB8fCBkZWZhdWx0UHJlZml4Q2xzO1xufVxuZnVuY3Rpb24gZ2V0R2xvYmFsSWNvblByZWZpeENscygpIHtcbiAgcmV0dXJuIGdsb2JhbEljb25QcmVmaXhDbHMgfHwgZGVmYXVsdEljb25QcmVmaXhDbHM7XG59XG5mdW5jdGlvbiBpc0xlZ2FjeVRoZW1lKHRoZW1lKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyh0aGVtZSkuc29tZShrZXkgPT4ga2V5LmVuZHNXaXRoKCdDb2xvcicpKTtcbn1cbmNvbnN0IHNldEdsb2JhbENvbmZpZyA9IHByb3BzID0+IHtcbiAgY29uc3Qge1xuICAgIHByZWZpeENscyxcbiAgICBpY29uUHJlZml4Q2xzLFxuICAgIHRoZW1lLFxuICAgIGhvbGRlclJlbmRlclxuICB9ID0gcHJvcHM7XG4gIGlmIChwcmVmaXhDbHMgIT09IHVuZGVmaW5lZCkge1xuICAgIGdsb2JhbFByZWZpeENscyA9IHByZWZpeENscztcbiAgfVxuICBpZiAoaWNvblByZWZpeENscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZ2xvYmFsSWNvblByZWZpeENscyA9IGljb25QcmVmaXhDbHM7XG4gIH1cbiAgaWYgKCdob2xkZXJSZW5kZXInIGluIHByb3BzKSB7XG4gICAgZ2xvYmFsSG9sZGVyUmVuZGVyID0gaG9sZGVyUmVuZGVyO1xuICB9XG4gIGlmICh0aGVtZSkge1xuICAgIGlmIChpc0xlZ2FjeVRoZW1lKHRoZW1lKSkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhmYWxzZSwgJ0NvbmZpZ1Byb3ZpZGVyJywgJ2Bjb25maWdgIG9mIGNzcyB2YXJpYWJsZSB0aGVtZSBpcyBub3Qgd29yayBpbiB2NS4gUGxlYXNlIHVzZSBuZXcgYHRoZW1lYCBjb25maWcgaW5zdGVhZC4nKSA6IHZvaWQgMDtcbiAgICAgIHJlZ2lzdGVyVGhlbWUoZ2V0R2xvYmFsUHJlZml4Q2xzKCksIHRoZW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2xvYmFsVGhlbWUgPSB0aGVtZTtcbiAgICB9XG4gIH1cbn07XG5leHBvcnQgY29uc3QgZ2xvYmFsQ29uZmlnID0gKCkgPT4gKHtcbiAgZ2V0UHJlZml4Q2xzOiAoc3VmZml4Q2xzLCBjdXN0b21pemVQcmVmaXhDbHMpID0+IHtcbiAgICBpZiAoY3VzdG9taXplUHJlZml4Q2xzKSB7XG4gICAgICByZXR1cm4gY3VzdG9taXplUHJlZml4Q2xzO1xuICAgIH1cbiAgICByZXR1cm4gc3VmZml4Q2xzID8gYCR7Z2V0R2xvYmFsUHJlZml4Q2xzKCl9LSR7c3VmZml4Q2xzfWAgOiBnZXRHbG9iYWxQcmVmaXhDbHMoKTtcbiAgfSxcbiAgZ2V0SWNvblByZWZpeENsczogZ2V0R2xvYmFsSWNvblByZWZpeENscyxcbiAgZ2V0Um9vdFByZWZpeENsczogKCkgPT4ge1xuICAgIC8vIElmIEdsb2JhbCBwcmVmaXhDbHMgcHJvdmlkZWQsIHVzZSB0aGlzXG4gICAgaWYgKGdsb2JhbFByZWZpeENscykge1xuICAgICAgcmV0dXJuIGdsb2JhbFByZWZpeENscztcbiAgICB9XG4gICAgLy8gRmFsbGJhY2sgdG8gZGVmYXVsdCBwcmVmaXhDbHNcbiAgICByZXR1cm4gZ2V0R2xvYmFsUHJlZml4Q2xzKCk7XG4gIH0sXG4gIGdldFRoZW1lOiAoKSA9PiBnbG9iYWxUaGVtZSxcbiAgaG9sZGVyUmVuZGVyOiBnbG9iYWxIb2xkZXJSZW5kZXJcbn0pO1xuY29uc3QgUHJvdmlkZXJDaGlsZHJlbiA9IHByb3BzID0+IHtcbiAgY29uc3Qge1xuICAgIGNoaWxkcmVuLFxuICAgIGNzcDogY3VzdG9tQ3NwLFxuICAgIGF1dG9JbnNlcnRTcGFjZUluQnV0dG9uLFxuICAgIGFsZXJ0LFxuICAgIGFuY2hvcixcbiAgICBmb3JtLFxuICAgIGxvY2FsZSxcbiAgICBjb21wb25lbnRTaXplLFxuICAgIGRpcmVjdGlvbixcbiAgICBzcGFjZSxcbiAgICBzcGxpdHRlcixcbiAgICB2aXJ0dWFsLFxuICAgIGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCxcbiAgICBwb3B1cE1hdGNoU2VsZWN0V2lkdGgsXG4gICAgcG9wdXBPdmVyZmxvdyxcbiAgICBsZWdhY3lMb2NhbGUsXG4gICAgcGFyZW50Q29udGV4dCxcbiAgICBpY29uUHJlZml4Q2xzOiBjdXN0b21JY29uUHJlZml4Q2xzLFxuICAgIHRoZW1lLFxuICAgIGNvbXBvbmVudERpc2FibGVkLFxuICAgIHNlZ21lbnRlZCxcbiAgICBzdGF0aXN0aWMsXG4gICAgc3BpbixcbiAgICBjYWxlbmRhcixcbiAgICBjYXJvdXNlbCxcbiAgICBjYXNjYWRlcixcbiAgICBjb2xsYXBzZSxcbiAgICB0eXBvZ3JhcGh5LFxuICAgIGNoZWNrYm94LFxuICAgIGRlc2NyaXB0aW9ucyxcbiAgICBkaXZpZGVyLFxuICAgIGRyYXdlcixcbiAgICBza2VsZXRvbixcbiAgICBzdGVwcyxcbiAgICBpbWFnZSxcbiAgICBsYXlvdXQsXG4gICAgbGlzdCxcbiAgICBtZW50aW9ucyxcbiAgICBtb2RhbCxcbiAgICBwcm9ncmVzcyxcbiAgICByZXN1bHQsXG4gICAgc2xpZGVyLFxuICAgIGJyZWFkY3J1bWIsXG4gICAgbWVudSxcbiAgICBwYWdpbmF0aW9uLFxuICAgIGlucHV0LFxuICAgIHRleHRBcmVhLFxuICAgIGVtcHR5LFxuICAgIGJhZGdlLFxuICAgIHJhZGlvLFxuICAgIHJhdGUsXG4gICAgc3dpdGNoOiBTV0lUQ0gsXG4gICAgdHJhbnNmZXIsXG4gICAgYXZhdGFyLFxuICAgIG1lc3NhZ2UsXG4gICAgdGFnLFxuICAgIHRhYmxlLFxuICAgIGNhcmQsXG4gICAgdGFicyxcbiAgICB0aW1lbGluZSxcbiAgICB0aW1lUGlja2VyLFxuICAgIHVwbG9hZCxcbiAgICBub3RpZmljYXRpb24sXG4gICAgdHJlZSxcbiAgICBjb2xvclBpY2tlcixcbiAgICBkYXRlUGlja2VyLFxuICAgIHJhbmdlUGlja2VyLFxuICAgIGZsZXgsXG4gICAgd2F2ZSxcbiAgICBkcm9wZG93bixcbiAgICB3YXJuaW5nOiB3YXJuaW5nQ29uZmlnLFxuICAgIHRvdXIsXG4gICAgdG9vbHRpcCxcbiAgICBwb3BvdmVyLFxuICAgIHBvcGNvbmZpcm0sXG4gICAgZmxvYXRCdXR0b25Hcm91cCxcbiAgICB2YXJpYW50LFxuICAgIGlucHV0TnVtYmVyLFxuICAgIHRyZWVTZWxlY3RcbiAgfSA9IHByb3BzO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDb250ZXh0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IGdldFByZWZpeENscyA9IFJlYWN0LnVzZUNhbGxiYWNrKChzdWZmaXhDbHMsIGN1c3RvbWl6ZVByZWZpeENscykgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHByZWZpeENsc1xuICAgIH0gPSBwcm9wcztcbiAgICBpZiAoY3VzdG9taXplUHJlZml4Q2xzKSB7XG4gICAgICByZXR1cm4gY3VzdG9taXplUHJlZml4Q2xzO1xuICAgIH1cbiAgICBjb25zdCBtZXJnZWRQcmVmaXhDbHMgPSBwcmVmaXhDbHMgfHwgcGFyZW50Q29udGV4dC5nZXRQcmVmaXhDbHMoJycpO1xuICAgIHJldHVybiBzdWZmaXhDbHMgPyBgJHttZXJnZWRQcmVmaXhDbHN9LSR7c3VmZml4Q2xzfWAgOiBtZXJnZWRQcmVmaXhDbHM7XG4gIH0sIFtwYXJlbnRDb250ZXh0LmdldFByZWZpeENscywgcHJvcHMucHJlZml4Q2xzXSk7XG4gIGNvbnN0IGljb25QcmVmaXhDbHMgPSBjdXN0b21JY29uUHJlZml4Q2xzIHx8IHBhcmVudENvbnRleHQuaWNvblByZWZpeENscyB8fCBkZWZhdWx0SWNvblByZWZpeENscztcbiAgY29uc3QgY3NwID0gY3VzdG9tQ3NwIHx8IHBhcmVudENvbnRleHQuY3NwO1xuICB1c2VTdHlsZShpY29uUHJlZml4Q2xzLCBjc3ApO1xuICBjb25zdCBtZXJnZWRUaGVtZSA9IHVzZVRoZW1lKHRoZW1lLCBwYXJlbnRDb250ZXh0LnRoZW1lLCB7XG4gICAgcHJlZml4Q2xzOiBnZXRQcmVmaXhDbHMoJycpXG4gIH0pO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGV4aXN0VGhlbWVDb25maWcgPSBleGlzdFRoZW1lQ29uZmlnIHx8ICEhbWVyZ2VkVGhlbWU7XG4gIH1cbiAgY29uc3QgYmFzZUNvbmZpZyA9IHtcbiAgICBjc3AsXG4gICAgYXV0b0luc2VydFNwYWNlSW5CdXR0b24sXG4gICAgYWxlcnQsXG4gICAgYW5jaG9yLFxuICAgIGxvY2FsZTogbG9jYWxlIHx8IGxlZ2FjeUxvY2FsZSxcbiAgICBkaXJlY3Rpb24sXG4gICAgc3BhY2UsXG4gICAgc3BsaXR0ZXIsXG4gICAgdmlydHVhbCxcbiAgICBwb3B1cE1hdGNoU2VsZWN0V2lkdGg6IHBvcHVwTWF0Y2hTZWxlY3RXaWR0aCAhPT0gbnVsbCAmJiBwb3B1cE1hdGNoU2VsZWN0V2lkdGggIT09IHZvaWQgMCA/IHBvcHVwTWF0Y2hTZWxlY3RXaWR0aCA6IGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCxcbiAgICBwb3B1cE92ZXJmbG93LFxuICAgIGdldFByZWZpeENscyxcbiAgICBpY29uUHJlZml4Q2xzLFxuICAgIHRoZW1lOiBtZXJnZWRUaGVtZSxcbiAgICBzZWdtZW50ZWQsXG4gICAgc3RhdGlzdGljLFxuICAgIHNwaW4sXG4gICAgY2FsZW5kYXIsXG4gICAgY2Fyb3VzZWwsXG4gICAgY2FzY2FkZXIsXG4gICAgY29sbGFwc2UsXG4gICAgdHlwb2dyYXBoeSxcbiAgICBjaGVja2JveCxcbiAgICBkZXNjcmlwdGlvbnMsXG4gICAgZGl2aWRlcixcbiAgICBkcmF3ZXIsXG4gICAgc2tlbGV0b24sXG4gICAgc3RlcHMsXG4gICAgaW1hZ2UsXG4gICAgaW5wdXQsXG4gICAgdGV4dEFyZWEsXG4gICAgbGF5b3V0LFxuICAgIGxpc3QsXG4gICAgbWVudGlvbnMsXG4gICAgbW9kYWwsXG4gICAgcHJvZ3Jlc3MsXG4gICAgcmVzdWx0LFxuICAgIHNsaWRlcixcbiAgICBicmVhZGNydW1iLFxuICAgIG1lbnUsXG4gICAgcGFnaW5hdGlvbixcbiAgICBlbXB0eSxcbiAgICBiYWRnZSxcbiAgICByYWRpbyxcbiAgICByYXRlLFxuICAgIHN3aXRjaDogU1dJVENILFxuICAgIHRyYW5zZmVyLFxuICAgIGF2YXRhcixcbiAgICBtZXNzYWdlLFxuICAgIHRhZyxcbiAgICB0YWJsZSxcbiAgICBjYXJkLFxuICAgIHRhYnMsXG4gICAgdGltZWxpbmUsXG4gICAgdGltZVBpY2tlcixcbiAgICB1cGxvYWQsXG4gICAgbm90aWZpY2F0aW9uLFxuICAgIHRyZWUsXG4gICAgY29sb3JQaWNrZXIsXG4gICAgZGF0ZVBpY2tlcixcbiAgICByYW5nZVBpY2tlcixcbiAgICBmbGV4LFxuICAgIHdhdmUsXG4gICAgZHJvcGRvd24sXG4gICAgd2FybmluZzogd2FybmluZ0NvbmZpZyxcbiAgICB0b3VyLFxuICAgIHRvb2x0aXAsXG4gICAgcG9wb3ZlcixcbiAgICBwb3Bjb25maXJtLFxuICAgIGZsb2F0QnV0dG9uR3JvdXAsXG4gICAgdmFyaWFudCxcbiAgICBpbnB1dE51bWJlcixcbiAgICB0cmVlU2VsZWN0XG4gIH07XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgY29uc3Qgd2FybmluZ0ZuID0gZGV2VXNlV2FybmluZygnQ29uZmlnUHJvdmlkZXInKTtcbiAgICB3YXJuaW5nRm4oISgnYXV0b0luc2VydFNwYWNlSW5CdXR0b24nIGluIHByb3BzKSwgJ2RlcHJlY2F0ZWQnLCAnYGF1dG9JbnNlcnRTcGFjZUluQnV0dG9uYCBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIGB7IGJ1dHRvbjogeyBhdXRvSW5zZXJ0U3BhY2U6IGJvb2xlYW4gfX1gIGluc3RlYWQuJyk7XG4gIH1cbiAgY29uc3QgY29uZmlnID0gT2JqZWN0LmFzc2lnbih7fSwgcGFyZW50Q29udGV4dCk7XG4gIE9iamVjdC5rZXlzKGJhc2VDb25maWcpLmZvckVhY2goa2V5ID0+IHtcbiAgICBpZiAoYmFzZUNvbmZpZ1trZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZ1trZXldID0gYmFzZUNvbmZpZ1trZXldO1xuICAgIH1cbiAgfSk7XG4gIC8vIFBhc3MgdGhlIHByb3BzIHVzZWQgYnkgYHVzZUNvbnRleHRgIGRpcmVjdGx5IHdpdGggY2hpbGQgY29tcG9uZW50LlxuICAvLyBUaGVzZSBwcm9wcyBzaG91bGQgbWVyZ2VkIGludG8gYGNvbmZpZ2AuXG4gIFBBU1NFRF9QUk9QUy5mb3JFYWNoKHByb3BOYW1lID0+IHtcbiAgICBjb25zdCBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgaWYgKHByb3BWYWx1ZSkge1xuICAgICAgY29uZmlnW3Byb3BOYW1lXSA9IHByb3BWYWx1ZTtcbiAgICB9XG4gIH0pO1xuICBpZiAodHlwZW9mIGF1dG9JbnNlcnRTcGFjZUluQnV0dG9uICE9PSAndW5kZWZpbmVkJykge1xuICAgIC8vIG1lcmdlIGRlcHJlY2F0ZWQgYXBpXG4gICAgY29uZmlnLmJ1dHRvbiA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgYXV0b0luc2VydFNwYWNlOiBhdXRvSW5zZXJ0U3BhY2VJbkJ1dHRvblxuICAgIH0sIGNvbmZpZy5idXR0b24pO1xuICB9XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzI3NjE3XG4gIGNvbnN0IG1lbW9lZENvbmZpZyA9IHVzZU1lbW8oKCkgPT4gY29uZmlnLCBjb25maWcsIChwcmV2Q29uZmlnLCBjdXJyZW50Q29uZmlnKSA9PiB7XG4gICAgY29uc3QgcHJldktleXMgPSBPYmplY3Qua2V5cyhwcmV2Q29uZmlnKTtcbiAgICBjb25zdCBjdXJyZW50S2V5cyA9IE9iamVjdC5rZXlzKGN1cnJlbnRDb25maWcpO1xuICAgIHJldHVybiBwcmV2S2V5cy5sZW5ndGggIT09IGN1cnJlbnRLZXlzLmxlbmd0aCB8fCBwcmV2S2V5cy5zb21lKGtleSA9PiBwcmV2Q29uZmlnW2tleV0gIT09IGN1cnJlbnRDb25maWdba2V5XSk7XG4gIH0pO1xuICBjb25zdCB7XG4gICAgbGF5ZXJcbiAgfSA9IFJlYWN0LnVzZUNvbnRleHQoQ3NzSW5Kc1N0eWxlQ29udGV4dCk7XG4gIGNvbnN0IG1lbW9JY29uQ29udGV4dFZhbHVlID0gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIHByZWZpeENsczogaWNvblByZWZpeENscyxcbiAgICBjc3AsXG4gICAgbGF5ZXI6IGxheWVyID8gJ2FudGQnIDogdW5kZWZpbmVkXG4gIH0pLCBbaWNvblByZWZpeENscywgY3NwLCBsYXllcl0pO1xuICBsZXQgY2hpbGROb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFByb3BXYXJuaW5nLCB7XG4gICAgZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoOiBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGhcbiAgfSksIGNoaWxkcmVuKTtcbiAgY29uc3QgdmFsaWRhdGVNZXNzYWdlcyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICByZXR1cm4gbWVyZ2UoKChfYSA9IGRlZmF1bHRMb2NhbGUuRm9ybSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmRlZmF1bHRWYWxpZGF0ZU1lc3NhZ2VzKSB8fCB7fSwgKChfYyA9IChfYiA9IG1lbW9lZENvbmZpZy5sb2NhbGUpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5Gb3JtKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuZGVmYXVsdFZhbGlkYXRlTWVzc2FnZXMpIHx8IHt9LCAoKF9kID0gbWVtb2VkQ29uZmlnLmZvcm0pID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC52YWxpZGF0ZU1lc3NhZ2VzKSB8fCB7fSwgKGZvcm0gPT09IG51bGwgfHwgZm9ybSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZm9ybS52YWxpZGF0ZU1lc3NhZ2VzKSB8fCB7fSk7XG4gIH0sIFttZW1vZWRDb25maWcsIGZvcm0gPT09IG51bGwgfHwgZm9ybSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZm9ybS52YWxpZGF0ZU1lc3NhZ2VzXSk7XG4gIGlmIChPYmplY3Qua2V5cyh2YWxpZGF0ZU1lc3NhZ2VzKS5sZW5ndGggPiAwKSB7XG4gICAgY2hpbGROb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVmFsaWRhdGVNZXNzYWdlc0NvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgIHZhbHVlOiB2YWxpZGF0ZU1lc3NhZ2VzXG4gICAgfSwgY2hpbGROb2RlKTtcbiAgfVxuICBpZiAobG9jYWxlKSB7XG4gICAgY2hpbGROb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTG9jYWxlUHJvdmlkZXIsIHtcbiAgICAgIGxvY2FsZTogbG9jYWxlLFxuICAgICAgX0FOVF9NQVJLX186IEFOVF9NQVJLXG4gICAgfSwgY2hpbGROb2RlKTtcbiAgfVxuICBpZiAoaWNvblByZWZpeENscyB8fCBjc3ApIHtcbiAgICBjaGlsZE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJY29uQ29udGV4dC5Qcm92aWRlciwge1xuICAgICAgdmFsdWU6IG1lbW9JY29uQ29udGV4dFZhbHVlXG4gICAgfSwgY2hpbGROb2RlKTtcbiAgfVxuICBpZiAoY29tcG9uZW50U2l6ZSkge1xuICAgIGNoaWxkTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNpemVDb250ZXh0UHJvdmlkZXIsIHtcbiAgICAgIHNpemU6IGNvbXBvbmVudFNpemVcbiAgICB9LCBjaGlsZE5vZGUpO1xuICB9XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IE1vdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjaGlsZE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChNb3Rpb25XcmFwcGVyLCBudWxsLCBjaGlsZE5vZGUpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBEeW5hbWljIHRoZW1lID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IG1lbW9UaGVtZSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IF9hID0gbWVyZ2VkVGhlbWUgfHwge30sXG4gICAgICB7XG4gICAgICAgIGFsZ29yaXRobSxcbiAgICAgICAgdG9rZW4sXG4gICAgICAgIGNvbXBvbmVudHMsXG4gICAgICAgIGNzc1ZhclxuICAgICAgfSA9IF9hLFxuICAgICAgcmVzdCA9IF9fcmVzdChfYSwgW1wiYWxnb3JpdGhtXCIsIFwidG9rZW5cIiwgXCJjb21wb25lbnRzXCIsIFwiY3NzVmFyXCJdKTtcbiAgICBjb25zdCB0aGVtZU9iaiA9IGFsZ29yaXRobSAmJiAoIUFycmF5LmlzQXJyYXkoYWxnb3JpdGhtKSB8fCBhbGdvcml0aG0ubGVuZ3RoID4gMCkgPyBjcmVhdGVUaGVtZShhbGdvcml0aG0pIDogZGVmYXVsdFRoZW1lO1xuICAgIGNvbnN0IHBhcnNlZENvbXBvbmVudHMgPSB7fTtcbiAgICBPYmplY3QuZW50cmllcyhjb21wb25lbnRzIHx8IHt9KS5mb3JFYWNoKF9yZWYgPT4ge1xuICAgICAgbGV0IFtjb21wb25lbnROYW1lLCBjb21wb25lbnRUb2tlbl0gPSBfcmVmO1xuICAgICAgY29uc3QgcGFyc2VkVG9rZW4gPSBPYmplY3QuYXNzaWduKHt9LCBjb21wb25lbnRUb2tlbik7XG4gICAgICBpZiAoJ2FsZ29yaXRobScgaW4gcGFyc2VkVG9rZW4pIHtcbiAgICAgICAgaWYgKHBhcnNlZFRva2VuLmFsZ29yaXRobSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHBhcnNlZFRva2VuLnRoZW1lID0gdGhlbWVPYmo7XG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShwYXJzZWRUb2tlbi5hbGdvcml0aG0pIHx8IHR5cGVvZiBwYXJzZWRUb2tlbi5hbGdvcml0aG0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBwYXJzZWRUb2tlbi50aGVtZSA9IGNyZWF0ZVRoZW1lKHBhcnNlZFRva2VuLmFsZ29yaXRobSk7XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIHBhcnNlZFRva2VuLmFsZ29yaXRobTtcbiAgICAgIH1cbiAgICAgIHBhcnNlZENvbXBvbmVudHNbY29tcG9uZW50TmFtZV0gPSBwYXJzZWRUb2tlbjtcbiAgICB9KTtcbiAgICBjb25zdCBtZXJnZWRUb2tlbiA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFNlZWRUb2tlbiksIHRva2VuKTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXN0KSwge1xuICAgICAgdGhlbWU6IHRoZW1lT2JqLFxuICAgICAgdG9rZW46IG1lcmdlZFRva2VuLFxuICAgICAgY29tcG9uZW50czogcGFyc2VkQ29tcG9uZW50cyxcbiAgICAgIG92ZXJyaWRlOiBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgb3ZlcnJpZGU6IG1lcmdlZFRva2VuXG4gICAgICB9LCBwYXJzZWRDb21wb25lbnRzKSxcbiAgICAgIGNzc1ZhcjogY3NzVmFyXG4gICAgfSk7XG4gIH0sIFttZXJnZWRUaGVtZV0pO1xuICBpZiAodGhlbWUpIHtcbiAgICBjaGlsZE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEZXNpZ25Ub2tlbkNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgIHZhbHVlOiBtZW1vVGhlbWVcbiAgICB9LCBjaGlsZE5vZGUpO1xuICB9XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gV2FybmluZyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBpZiAobWVtb2VkQ29uZmlnLndhcm5pbmcpIHtcbiAgICBjaGlsZE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChXYXJuaW5nQ29udGV4dC5Qcm92aWRlciwge1xuICAgICAgdmFsdWU6IG1lbW9lZENvbmZpZy53YXJuaW5nXG4gICAgfSwgY2hpbGROb2RlKTtcbiAgfVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgaWYgKGNvbXBvbmVudERpc2FibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjaGlsZE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEaXNhYmxlZENvbnRleHRQcm92aWRlciwge1xuICAgICAgZGlzYWJsZWQ6IGNvbXBvbmVudERpc2FibGVkXG4gICAgfSwgY2hpbGROb2RlKTtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29uZmlnQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBtZW1vZWRDb25maWdcbiAgfSwgY2hpbGROb2RlKTtcbn07XG5jb25zdCBDb25maWdQcm92aWRlciA9IHByb3BzID0+IHtcbiAgY29uc3QgY29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCk7XG4gIGNvbnN0IGFudExvY2FsZSA9IFJlYWN0LnVzZUNvbnRleHQoTG9jYWxlQ29udGV4dCk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQcm92aWRlckNoaWxkcmVuLCBPYmplY3QuYXNzaWduKHtcbiAgICBwYXJlbnRDb250ZXh0OiBjb250ZXh0LFxuICAgIGxlZ2FjeUxvY2FsZTogYW50TG9jYWxlXG4gIH0sIHByb3BzKSk7XG59O1xuQ29uZmlnUHJvdmlkZXIuQ29uZmlnQ29udGV4dCA9IENvbmZpZ0NvbnRleHQ7XG5Db25maWdQcm92aWRlci5TaXplQ29udGV4dCA9IFNpemVDb250ZXh0O1xuQ29uZmlnUHJvdmlkZXIuY29uZmlnID0gc2V0R2xvYmFsQ29uZmlnO1xuQ29uZmlnUHJvdmlkZXIudXNlQ29uZmlnID0gdXNlQ29uZmlnO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbmZpZ1Byb3ZpZGVyLCAnU2l6ZUNvbnRleHQnLCB7XG4gIGdldDogKCkgPT4ge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoZmFsc2UsICdDb25maWdQcm92aWRlcicsICdDb25maWdQcm92aWRlci5TaXplQ29udGV4dCBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIGBDb25maWdQcm92aWRlci51c2VDb25maWcoKS5jb21wb25lbnRTaXplYCBpbnN0ZWFkLicpIDogdm9pZCAwO1xuICAgIHJldHVybiBTaXplQ29udGV4dDtcbiAgfVxufSk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBDb25maWdQcm92aWRlci5kaXNwbGF5TmFtZSA9ICdDb25maWdQcm92aWRlcic7XG59XG5leHBvcnQgZGVmYXVsdCBDb25maWdQcm92aWRlcjsiLCAiZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKHIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkocikpIHJldHVybiByO1xufVxuZXhwb3J0IHsgX2FycmF5V2l0aEhvbGVzIGFzIGRlZmF1bHQgfTsiLCAiZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KHIsIGwpIHtcbiAgdmFyIHQgPSBudWxsID09IHIgPyBudWxsIDogXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgU3ltYm9sICYmIHJbU3ltYm9sLml0ZXJhdG9yXSB8fCByW1wiQEBpdGVyYXRvclwiXTtcbiAgaWYgKG51bGwgIT0gdCkge1xuICAgIHZhciBlLFxuICAgICAgbixcbiAgICAgIGksXG4gICAgICB1LFxuICAgICAgYSA9IFtdLFxuICAgICAgZiA9ICEwLFxuICAgICAgbyA9ICExO1xuICAgIHRyeSB7XG4gICAgICBpZiAoaSA9ICh0ID0gdC5jYWxsKHIpKS5uZXh0LCAwID09PSBsKSB7XG4gICAgICAgIGlmIChPYmplY3QodCkgIT09IHQpIHJldHVybjtcbiAgICAgICAgZiA9ICExO1xuICAgICAgfSBlbHNlIGZvciAoOyAhKGYgPSAoZSA9IGkuY2FsbCh0KSkuZG9uZSkgJiYgKGEucHVzaChlLnZhbHVlKSwgYS5sZW5ndGggIT09IGwpOyBmID0gITApO1xuICAgIH0gY2F0Y2ggKHIpIHtcbiAgICAgIG8gPSAhMCwgbiA9IHI7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghZiAmJiBudWxsICE9IHRbXCJyZXR1cm5cIl0gJiYgKHUgPSB0W1wicmV0dXJuXCJdKCksIE9iamVjdCh1KSAhPT0gdSkpIHJldHVybjtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChvKSB0aHJvdyBuO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYTtcbiAgfVxufVxuZXhwb3J0IHsgX2l0ZXJhYmxlVG9BcnJheUxpbWl0IGFzIGRlZmF1bHQgfTsiLCAiZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbn1cbmV4cG9ydCB7IF9ub25JdGVyYWJsZVJlc3QgYXMgZGVmYXVsdCB9OyIsICJpbXBvcnQgYXJyYXlXaXRoSG9sZXMgZnJvbSBcIi4vYXJyYXlXaXRoSG9sZXMuanNcIjtcbmltcG9ydCBpdGVyYWJsZVRvQXJyYXlMaW1pdCBmcm9tIFwiLi9pdGVyYWJsZVRvQXJyYXlMaW1pdC5qc1wiO1xuaW1wb3J0IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IGZyb20gXCIuL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5LmpzXCI7XG5pbXBvcnQgbm9uSXRlcmFibGVSZXN0IGZyb20gXCIuL25vbkl0ZXJhYmxlUmVzdC5qc1wiO1xuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkociwgZSkge1xuICByZXR1cm4gYXJyYXlXaXRoSG9sZXMocikgfHwgaXRlcmFibGVUb0FycmF5TGltaXQociwgZSkgfHwgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkociwgZSkgfHwgbm9uSXRlcmFibGVSZXN0KCk7XG59XG5leHBvcnQgeyBfc2xpY2VkVG9BcnJheSBhcyBkZWZhdWx0IH07IiwgIi8qIGVzbGludC1kaXNhYmxlICovXG4vLyBJbnNwaXJlZCBieSBodHRwczovL2dpdGh1Yi5jb20vZ2FyeWNvdXJ0L211cm11cmhhc2gtanNcbi8vIFBvcnRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9hYXBwbGVieS9zbWhhc2hlci9ibG9iLzYxYTA1MzBmMjgyNzdmMmU4NTBiZmMzOTYwMGNlNjFkMDJiNTE4ZGUvc3JjL011cm11ckhhc2gyLmNwcCNMMzctTDg2XG5mdW5jdGlvbiBtdXJtdXIyKHN0cikge1xuICAvLyAnbScgYW5kICdyJyBhcmUgbWl4aW5nIGNvbnN0YW50cyBnZW5lcmF0ZWQgb2ZmbGluZS5cbiAgLy8gVGhleSdyZSBub3QgcmVhbGx5ICdtYWdpYycsIHRoZXkganVzdCBoYXBwZW4gdG8gd29yayB3ZWxsLlxuICAvLyBjb25zdCBtID0gMHg1YmQxZTk5NTtcbiAgLy8gY29uc3QgciA9IDI0O1xuICAvLyBJbml0aWFsaXplIHRoZSBoYXNoXG4gIHZhciBoID0gMDsgLy8gTWl4IDQgYnl0ZXMgYXQgYSB0aW1lIGludG8gdGhlIGhhc2hcblxuICB2YXIgayxcbiAgICAgIGkgPSAwLFxuICAgICAgbGVuID0gc3RyLmxlbmd0aDtcblxuICBmb3IgKDsgbGVuID49IDQ7ICsraSwgbGVuIC09IDQpIHtcbiAgICBrID0gc3RyLmNoYXJDb2RlQXQoaSkgJiAweGZmIHwgKHN0ci5jaGFyQ29kZUF0KCsraSkgJiAweGZmKSA8PCA4IHwgKHN0ci5jaGFyQ29kZUF0KCsraSkgJiAweGZmKSA8PCAxNiB8IChzdHIuY2hhckNvZGVBdCgrK2kpICYgMHhmZikgPDwgMjQ7XG4gICAgayA9XG4gICAgLyogTWF0aC5pbXVsKGssIG0pOiAqL1xuICAgIChrICYgMHhmZmZmKSAqIDB4NWJkMWU5OTUgKyAoKGsgPj4+IDE2KSAqIDB4ZTk5NSA8PCAxNik7XG4gICAgayBePVxuICAgIC8qIGsgPj4+IHI6ICovXG4gICAgayA+Pj4gMjQ7XG4gICAgaCA9XG4gICAgLyogTWF0aC5pbXVsKGssIG0pOiAqL1xuICAgIChrICYgMHhmZmZmKSAqIDB4NWJkMWU5OTUgKyAoKGsgPj4+IDE2KSAqIDB4ZTk5NSA8PCAxNikgXlxuICAgIC8qIE1hdGguaW11bChoLCBtKTogKi9cbiAgICAoaCAmIDB4ZmZmZikgKiAweDViZDFlOTk1ICsgKChoID4+PiAxNikgKiAweGU5OTUgPDwgMTYpO1xuICB9IC8vIEhhbmRsZSB0aGUgbGFzdCBmZXcgYnl0ZXMgb2YgdGhlIGlucHV0IGFycmF5XG5cblxuICBzd2l0Y2ggKGxlbikge1xuICAgIGNhc2UgMzpcbiAgICAgIGggXj0gKHN0ci5jaGFyQ29kZUF0KGkgKyAyKSAmIDB4ZmYpIDw8IDE2O1xuXG4gICAgY2FzZSAyOlxuICAgICAgaCBePSAoc3RyLmNoYXJDb2RlQXQoaSArIDEpICYgMHhmZikgPDwgODtcblxuICAgIGNhc2UgMTpcbiAgICAgIGggXj0gc3RyLmNoYXJDb2RlQXQoaSkgJiAweGZmO1xuICAgICAgaCA9XG4gICAgICAvKiBNYXRoLmltdWwoaCwgbSk6ICovXG4gICAgICAoaCAmIDB4ZmZmZikgKiAweDViZDFlOTk1ICsgKChoID4+PiAxNikgKiAweGU5OTUgPDwgMTYpO1xuICB9IC8vIERvIGEgZmV3IGZpbmFsIG1peGVzIG9mIHRoZSBoYXNoIHRvIGVuc3VyZSB0aGUgbGFzdCBmZXdcbiAgLy8gYnl0ZXMgYXJlIHdlbGwtaW5jb3Jwb3JhdGVkLlxuXG5cbiAgaCBePSBoID4+PiAxMztcbiAgaCA9XG4gIC8qIE1hdGguaW11bChoLCBtKTogKi9cbiAgKGggJiAweGZmZmYpICogMHg1YmQxZTk5NSArICgoaCA+Pj4gMTYpICogMHhlOTk1IDw8IDE2KTtcbiAgcmV0dXJuICgoaCBeIGggPj4+IDE1KSA+Pj4gMCkudG9TdHJpbmcoMzYpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBtdXJtdXIyO1xuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNhblVzZURvbSgpIHtcbiAgcmV0dXJuICEhKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kb2N1bWVudCAmJiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG59IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbnRhaW5zKHJvb3QsIG4pIHtcbiAgaWYgKCFyb290KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gVXNlIG5hdGl2ZSBpZiBzdXBwb3J0XG4gIGlmIChyb290LmNvbnRhaW5zKSB7XG4gICAgcmV0dXJuIHJvb3QuY29udGFpbnMobik7XG4gIH1cblxuICAvLyBgZG9jdW1lbnQuY29udGFpbnNgIG5vdCBzdXBwb3J0IHdpdGggSUUxMVxuICB2YXIgbm9kZSA9IG47XG4gIHdoaWxlIChub2RlKSB7XG4gICAgaWYgKG5vZGUgPT09IHJvb3QpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn0iLCAiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBjYW5Vc2VEb20gZnJvbSBcIi4vY2FuVXNlRG9tXCI7XG5pbXBvcnQgY29udGFpbnMgZnJvbSBcIi4vY29udGFpbnNcIjtcbnZhciBBUFBFTkRfT1JERVIgPSAnZGF0YS1yYy1vcmRlcic7XG52YXIgQVBQRU5EX1BSSU9SSVRZID0gJ2RhdGEtcmMtcHJpb3JpdHknO1xudmFyIE1BUktfS0VZID0gXCJyYy11dGlsLWtleVwiO1xudmFyIGNvbnRhaW5lckNhY2hlID0gbmV3IE1hcCgpO1xuZnVuY3Rpb24gZ2V0TWFyaygpIHtcbiAgdmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9LFxuICAgIG1hcmsgPSBfcmVmLm1hcms7XG4gIGlmIChtYXJrKSB7XG4gICAgcmV0dXJuIG1hcmsuc3RhcnRzV2l0aCgnZGF0YS0nKSA/IG1hcmsgOiBcImRhdGEtXCIuY29uY2F0KG1hcmspO1xuICB9XG4gIHJldHVybiBNQVJLX0tFWTtcbn1cbmZ1bmN0aW9uIGdldENvbnRhaW5lcihvcHRpb24pIHtcbiAgaWYgKG9wdGlvbi5hdHRhY2hUbykge1xuICAgIHJldHVybiBvcHRpb24uYXR0YWNoVG87XG4gIH1cbiAgdmFyIGhlYWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdoZWFkJyk7XG4gIHJldHVybiBoZWFkIHx8IGRvY3VtZW50LmJvZHk7XG59XG5mdW5jdGlvbiBnZXRPcmRlcihwcmVwZW5kKSB7XG4gIGlmIChwcmVwZW5kID09PSAncXVldWUnKSB7XG4gICAgcmV0dXJuICdwcmVwZW5kUXVldWUnO1xuICB9XG4gIHJldHVybiBwcmVwZW5kID8gJ3ByZXBlbmQnIDogJ2FwcGVuZCc7XG59XG5cbi8qKlxuICogRmluZCBzdHlsZSB3aGljaCBpbmplY3QgYnkgcmMtdXRpbFxuICovXG5mdW5jdGlvbiBmaW5kU3R5bGVzKGNvbnRhaW5lcikge1xuICByZXR1cm4gQXJyYXkuZnJvbSgoY29udGFpbmVyQ2FjaGUuZ2V0KGNvbnRhaW5lcikgfHwgY29udGFpbmVyKS5jaGlsZHJlbikuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUudGFnTmFtZSA9PT0gJ1NUWUxFJztcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0Q1NTKGNzcykge1xuICB2YXIgb3B0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgaWYgKCFjYW5Vc2VEb20oKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBjc3AgPSBvcHRpb24uY3NwLFxuICAgIHByZXBlbmQgPSBvcHRpb24ucHJlcGVuZCxcbiAgICBfb3B0aW9uJHByaW9yaXR5ID0gb3B0aW9uLnByaW9yaXR5LFxuICAgIHByaW9yaXR5ID0gX29wdGlvbiRwcmlvcml0eSA9PT0gdm9pZCAwID8gMCA6IF9vcHRpb24kcHJpb3JpdHk7XG4gIHZhciBtZXJnZWRPcmRlciA9IGdldE9yZGVyKHByZXBlbmQpO1xuICB2YXIgaXNQcmVwZW5kUXVldWUgPSBtZXJnZWRPcmRlciA9PT0gJ3ByZXBlbmRRdWV1ZSc7XG4gIHZhciBzdHlsZU5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICBzdHlsZU5vZGUuc2V0QXR0cmlidXRlKEFQUEVORF9PUkRFUiwgbWVyZ2VkT3JkZXIpO1xuICBpZiAoaXNQcmVwZW5kUXVldWUgJiYgcHJpb3JpdHkpIHtcbiAgICBzdHlsZU5vZGUuc2V0QXR0cmlidXRlKEFQUEVORF9QUklPUklUWSwgXCJcIi5jb25jYXQocHJpb3JpdHkpKTtcbiAgfVxuICBpZiAoY3NwICE9PSBudWxsICYmIGNzcCAhPT0gdm9pZCAwICYmIGNzcC5ub25jZSkge1xuICAgIHN0eWxlTm9kZS5ub25jZSA9IGNzcCA9PT0gbnVsbCB8fCBjc3AgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNzcC5ub25jZTtcbiAgfVxuICBzdHlsZU5vZGUuaW5uZXJIVE1MID0gY3NzO1xuICB2YXIgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKG9wdGlvbik7XG4gIHZhciBmaXJzdENoaWxkID0gY29udGFpbmVyLmZpcnN0Q2hpbGQ7XG4gIGlmIChwcmVwZW5kKSB7XG4gICAgLy8gSWYgaXMgcXVldWUgYHByZXBlbmRgLCBpdCB3aWxsIHByZXBlbmQgZmlyc3Qgc3R5bGUgYW5kIHRoZW4gYXBwZW5kIHJlc3Qgc3R5bGVcbiAgICBpZiAoaXNQcmVwZW5kUXVldWUpIHtcbiAgICAgIHZhciBleGlzdFN0eWxlID0gKG9wdGlvbi5zdHlsZXMgfHwgZmluZFN0eWxlcyhjb250YWluZXIpKS5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgLy8gSWdub3JlIHN0eWxlIHdoaWNoIG5vdCBpbmplY3RlZCBieSByYy11dGlsIHdpdGggcHJlcGVuZFxuICAgICAgICBpZiAoIVsncHJlcGVuZCcsICdwcmVwZW5kUXVldWUnXS5pbmNsdWRlcyhub2RlLmdldEF0dHJpYnV0ZShBUFBFTkRfT1JERVIpKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElnbm9yZSBzdHlsZSB3aGljaCBwcmlvcml0eSBsZXNzIHRoZW4gbmV3IHN0eWxlXG4gICAgICAgIHZhciBub2RlUHJpb3JpdHkgPSBOdW1iZXIobm9kZS5nZXRBdHRyaWJ1dGUoQVBQRU5EX1BSSU9SSVRZKSB8fCAwKTtcbiAgICAgICAgcmV0dXJuIHByaW9yaXR5ID49IG5vZGVQcmlvcml0eTtcbiAgICAgIH0pO1xuICAgICAgaWYgKGV4aXN0U3R5bGUubGVuZ3RoKSB7XG4gICAgICAgIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUoc3R5bGVOb2RlLCBleGlzdFN0eWxlW2V4aXN0U3R5bGUubGVuZ3RoIC0gMV0ubmV4dFNpYmxpbmcpO1xuICAgICAgICByZXR1cm4gc3R5bGVOb2RlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVzZSBgaW5zZXJ0QmVmb3JlYCBhcyBgcHJlcGVuZGBcbiAgICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKHN0eWxlTm9kZSwgZmlyc3RDaGlsZCk7XG4gIH0gZWxzZSB7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHN0eWxlTm9kZSk7XG4gIH1cbiAgcmV0dXJuIHN0eWxlTm9kZTtcbn1cbmZ1bmN0aW9uIGZpbmRFeGlzdE5vZGUoa2V5KSB7XG4gIHZhciBvcHRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICB2YXIgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKG9wdGlvbik7XG4gIHJldHVybiAob3B0aW9uLnN0eWxlcyB8fCBmaW5kU3R5bGVzKGNvbnRhaW5lcikpLmZpbmQoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5nZXRBdHRyaWJ1dGUoZ2V0TWFyayhvcHRpb24pKSA9PT0ga2V5O1xuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVDU1Moa2V5KSB7XG4gIHZhciBvcHRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICB2YXIgZXhpc3ROb2RlID0gZmluZEV4aXN0Tm9kZShrZXksIG9wdGlvbik7XG4gIGlmIChleGlzdE5vZGUpIHtcbiAgICB2YXIgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKG9wdGlvbik7XG4gICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKGV4aXN0Tm9kZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBxaWFua3VuIHdpbGwgaW5qZWN0IGBhcHBlbmRDaGlsZGAgdG8gaW5zZXJ0IGludG8gb3RoZXJcbiAqL1xuZnVuY3Rpb24gc3luY1JlYWxDb250YWluZXIoY29udGFpbmVyLCBvcHRpb24pIHtcbiAgdmFyIGNhY2hlZFJlYWxDb250YWluZXIgPSBjb250YWluZXJDYWNoZS5nZXQoY29udGFpbmVyKTtcblxuICAvLyBGaW5kIHJlYWwgY29udGFpbmVyIHdoZW4gbm90IGNhY2hlZCBvciBjYWNoZWQgY29udGFpbmVyIHJlbW92ZWRcbiAgaWYgKCFjYWNoZWRSZWFsQ29udGFpbmVyIHx8ICFjb250YWlucyhkb2N1bWVudCwgY2FjaGVkUmVhbENvbnRhaW5lcikpIHtcbiAgICB2YXIgcGxhY2Vob2xkZXJTdHlsZSA9IGluamVjdENTUygnJywgb3B0aW9uKTtcbiAgICB2YXIgcGFyZW50Tm9kZSA9IHBsYWNlaG9sZGVyU3R5bGUucGFyZW50Tm9kZTtcbiAgICBjb250YWluZXJDYWNoZS5zZXQoY29udGFpbmVyLCBwYXJlbnROb2RlKTtcbiAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQocGxhY2Vob2xkZXJTdHlsZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBtYW51YWxseSBjbGVhciBjb250YWluZXIgY2FjaGUgdG8gYXZvaWQgZ2xvYmFsIGNhY2hlIGluIHVuaXQgdGVzdGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckNvbnRhaW5lckNhY2hlKCkge1xuICBjb250YWluZXJDYWNoZS5jbGVhcigpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUNTUyhjc3MsIGtleSkge1xuICB2YXIgb3JpZ2luT3B0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgdmFyIGNvbnRhaW5lciA9IGdldENvbnRhaW5lcihvcmlnaW5PcHRpb24pO1xuICB2YXIgc3R5bGVzID0gZmluZFN0eWxlcyhjb250YWluZXIpO1xuICB2YXIgb3B0aW9uID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBvcmlnaW5PcHRpb24pLCB7fSwge1xuICAgIHN0eWxlczogc3R5bGVzXG4gIH0pO1xuXG4gIC8vIFN5bmMgcmVhbCBwYXJlbnRcbiAgc3luY1JlYWxDb250YWluZXIoY29udGFpbmVyLCBvcHRpb24pO1xuICB2YXIgZXhpc3ROb2RlID0gZmluZEV4aXN0Tm9kZShrZXksIG9wdGlvbik7XG4gIGlmIChleGlzdE5vZGUpIHtcbiAgICB2YXIgX29wdGlvbiRjc3AsIF9vcHRpb24kY3NwMjtcbiAgICBpZiAoKF9vcHRpb24kY3NwID0gb3B0aW9uLmNzcCkgIT09IG51bGwgJiYgX29wdGlvbiRjc3AgIT09IHZvaWQgMCAmJiBfb3B0aW9uJGNzcC5ub25jZSAmJiBleGlzdE5vZGUubm9uY2UgIT09ICgoX29wdGlvbiRjc3AyID0gb3B0aW9uLmNzcCkgPT09IG51bGwgfHwgX29wdGlvbiRjc3AyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9uJGNzcDIubm9uY2UpKSB7XG4gICAgICB2YXIgX29wdGlvbiRjc3AzO1xuICAgICAgZXhpc3ROb2RlLm5vbmNlID0gKF9vcHRpb24kY3NwMyA9IG9wdGlvbi5jc3ApID09PSBudWxsIHx8IF9vcHRpb24kY3NwMyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29wdGlvbiRjc3AzLm5vbmNlO1xuICAgIH1cbiAgICBpZiAoZXhpc3ROb2RlLmlubmVySFRNTCAhPT0gY3NzKSB7XG4gICAgICBleGlzdE5vZGUuaW5uZXJIVE1MID0gY3NzO1xuICAgIH1cbiAgICByZXR1cm4gZXhpc3ROb2RlO1xuICB9XG4gIHZhciBuZXdOb2RlID0gaW5qZWN0Q1NTKGNzcywgb3B0aW9uKTtcbiAgbmV3Tm9kZS5zZXRBdHRyaWJ1dGUoZ2V0TWFyayhvcHRpb24pLCBrZXkpO1xuICByZXR1cm4gbmV3Tm9kZTtcbn0iLCAiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBoYXNoIGZyb20gJ0BlbW90aW9uL2hhc2gnO1xuaW1wb3J0IHsgdXBkYXRlQ1NTIH0gZnJvbSBcInJjLXV0aWwvZXMvRG9tL2R5bmFtaWNDU1NcIjtcbmltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgU3R5bGVDb250ZXh0LCB7IEFUVFJfTUFSSywgQVRUUl9UT0tFTiwgQ1NTX0lOX0pTX0lOU1RBTkNFIH0gZnJvbSBcIi4uL1N0eWxlQ29udGV4dFwiO1xuaW1wb3J0IHsgZmxhdHRlblRva2VuLCBtZW1vUmVzdWx0LCB0b2tlbjJrZXksIHRvU3R5bGVTdHIgfSBmcm9tIFwiLi4vdXRpbFwiO1xuaW1wb3J0IHsgdHJhbnNmb3JtVG9rZW4gfSBmcm9tIFwiLi4vdXRpbC9jc3MtdmFyaWFibGVzXCI7XG5pbXBvcnQgdXNlR2xvYmFsQ2FjaGUgZnJvbSBcIi4vdXNlR2xvYmFsQ2FjaGVcIjtcbnZhciBFTVBUWV9PVkVSUklERSA9IHt9O1xuXG4vLyBHZW5lcmF0ZSBkaWZmZXJlbnQgcHJlZml4IHRvIG1ha2UgdXNlciBzZWxlY3RvciBicmVhayBpbiBwcm9kdWN0aW9uIGVudi5cbi8vIFRoaXMgaGVscHMgZGV2ZWxvcGVyIG5vdCB0byBkbyBzdHlsZSBvdmVycmlkZSBkaXJlY3RseSBvbiB0aGUgaGFzaCBpZC5cbnZhciBoYXNoUHJlZml4ID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/ICdjc3MtZGV2LW9ubHktZG8tbm90LW92ZXJyaWRlJyA6ICdjc3MnO1xudmFyIHRva2VuS2V5cyA9IG5ldyBNYXAoKTtcbmZ1bmN0aW9uIHJlY29yZENsZWFuVG9rZW4odG9rZW5LZXkpIHtcbiAgdG9rZW5LZXlzLnNldCh0b2tlbktleSwgKHRva2VuS2V5cy5nZXQodG9rZW5LZXkpIHx8IDApICsgMSk7XG59XG5mdW5jdGlvbiByZW1vdmVTdHlsZVRhZ3Moa2V5LCBpbnN0YW5jZUlkKSB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgdmFyIHN0eWxlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJzdHlsZVtcIi5jb25jYXQoQVRUUl9UT0tFTiwgXCI9XFxcIlwiKS5jb25jYXQoa2V5LCBcIlxcXCJdXCIpKTtcbiAgICBzdHlsZXMuZm9yRWFjaChmdW5jdGlvbiAoc3R5bGUpIHtcbiAgICAgIGlmIChzdHlsZVtDU1NfSU5fSlNfSU5TVEFOQ0VdID09PSBpbnN0YW5jZUlkKSB7XG4gICAgICAgIHZhciBfc3R5bGUkcGFyZW50Tm9kZTtcbiAgICAgICAgKF9zdHlsZSRwYXJlbnROb2RlID0gc3R5bGUucGFyZW50Tm9kZSkgPT09IG51bGwgfHwgX3N0eWxlJHBhcmVudE5vZGUgPT09IHZvaWQgMCB8fCBfc3R5bGUkcGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzdHlsZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbnZhciBUT0tFTl9USFJFU0hPTEQgPSAwO1xuXG4vLyBSZW1vdmUgd2lsbCBjaGVjayBjdXJyZW50IGtleXMgZmlyc3RcbmZ1bmN0aW9uIGNsZWFuVG9rZW5TdHlsZSh0b2tlbktleSwgaW5zdGFuY2VJZCkge1xuICB0b2tlbktleXMuc2V0KHRva2VuS2V5LCAodG9rZW5LZXlzLmdldCh0b2tlbktleSkgfHwgMCkgLSAxKTtcbiAgdmFyIHRva2VuS2V5TGlzdCA9IEFycmF5LmZyb20odG9rZW5LZXlzLmtleXMoKSk7XG4gIHZhciBjbGVhbmFibGVLZXlMaXN0ID0gdG9rZW5LZXlMaXN0LmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIGNvdW50ID0gdG9rZW5LZXlzLmdldChrZXkpIHx8IDA7XG4gICAgcmV0dXJuIGNvdW50IDw9IDA7XG4gIH0pO1xuXG4gIC8vIFNob3VsZCBrZWVwIHRva2VucyB1bmRlciB0aHJlc2hvbGQgZm9yIG5vdCB0byBpbnNlcnQgc3R5bGUgdG9vIG9mdGVuXG4gIGlmICh0b2tlbktleUxpc3QubGVuZ3RoIC0gY2xlYW5hYmxlS2V5TGlzdC5sZW5ndGggPiBUT0tFTl9USFJFU0hPTEQpIHtcbiAgICBjbGVhbmFibGVLZXlMaXN0LmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgcmVtb3ZlU3R5bGVUYWdzKGtleSwgaW5zdGFuY2VJZCk7XG4gICAgICB0b2tlbktleXMuZGVsZXRlKGtleSk7XG4gICAgfSk7XG4gIH1cbn1cbmV4cG9ydCB2YXIgZ2V0Q29tcHV0ZWRUb2tlbiA9IGZ1bmN0aW9uIGdldENvbXB1dGVkVG9rZW4ob3JpZ2luVG9rZW4sIG92ZXJyaWRlVG9rZW4sIHRoZW1lLCBmb3JtYXQpIHtcbiAgdmFyIGRlcml2YXRpdmVUb2tlbiA9IHRoZW1lLmdldERlcml2YXRpdmVUb2tlbihvcmlnaW5Ub2tlbik7XG5cbiAgLy8gTWVyZ2Ugd2l0aCBvdmVycmlkZVxuICB2YXIgbWVyZ2VkRGVyaXZhdGl2ZVRva2VuID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBkZXJpdmF0aXZlVG9rZW4pLCBvdmVycmlkZVRva2VuKTtcblxuICAvLyBGb3JtYXQgaWYgbmVlZGVkXG4gIGlmIChmb3JtYXQpIHtcbiAgICBtZXJnZWREZXJpdmF0aXZlVG9rZW4gPSBmb3JtYXQobWVyZ2VkRGVyaXZhdGl2ZVRva2VuKTtcbiAgfVxuICByZXR1cm4gbWVyZ2VkRGVyaXZhdGl2ZVRva2VuO1xufTtcbmV4cG9ydCB2YXIgVE9LRU5fUFJFRklYID0gJ3Rva2VuJztcbi8qKlxuICogQ2FjaGUgdGhlbWUgZGVyaXZhdGl2ZSB0b2tlbiBhcyBnbG9iYWwgc2hhcmVkIG9uZVxuICogQHBhcmFtIHRoZW1lIFRoZW1lIGVudGl0eVxuICogQHBhcmFtIHRva2VucyBMaXN0IG9mIHRva2VucywgdXNlZCBmb3IgY2FjaGUuIFBsZWFzZSBkbyBub3QgZHluYW1pYyBnZW5lcmF0ZSBvYmplY3QgZGlyZWN0bHlcbiAqIEBwYXJhbSBvcHRpb24gQWRkaXRpb25hbCBjb25maWdcbiAqIEByZXR1cm5zIENhbGwgVGhlbWUuZ2V0RGVyaXZhdGl2ZVRva2VuKHRva2VuT2JqZWN0KSB0byBnZXQgdG9rZW5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlQ2FjaGVUb2tlbih0aGVtZSwgdG9rZW5zKSB7XG4gIHZhciBvcHRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICB2YXIgX3VzZUNvbnRleHQgPSB1c2VDb250ZXh0KFN0eWxlQ29udGV4dCksXG4gICAgaW5zdGFuY2VJZCA9IF91c2VDb250ZXh0LmNhY2hlLmluc3RhbmNlSWQsXG4gICAgY29udGFpbmVyID0gX3VzZUNvbnRleHQuY29udGFpbmVyO1xuICB2YXIgX29wdGlvbiRzYWx0ID0gb3B0aW9uLnNhbHQsXG4gICAgc2FsdCA9IF9vcHRpb24kc2FsdCA9PT0gdm9pZCAwID8gJycgOiBfb3B0aW9uJHNhbHQsXG4gICAgX29wdGlvbiRvdmVycmlkZSA9IG9wdGlvbi5vdmVycmlkZSxcbiAgICBvdmVycmlkZSA9IF9vcHRpb24kb3ZlcnJpZGUgPT09IHZvaWQgMCA/IEVNUFRZX09WRVJSSURFIDogX29wdGlvbiRvdmVycmlkZSxcbiAgICBmb3JtYXRUb2tlbiA9IG9wdGlvbi5mb3JtYXRUb2tlbixcbiAgICBjb21wdXRlID0gb3B0aW9uLmdldENvbXB1dGVkVG9rZW4sXG4gICAgY3NzVmFyID0gb3B0aW9uLmNzc1ZhcjtcblxuICAvLyBCYXNpYyAtIFdlIGRvIGJhc2ljIGNhY2hlIGhlcmVcbiAgdmFyIG1lcmdlZFRva2VuID0gbWVtb1Jlc3VsdChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24uYXBwbHkoT2JqZWN0LCBbe31dLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkodG9rZW5zKSkpO1xuICB9LCB0b2tlbnMpO1xuICB2YXIgdG9rZW5TdHIgPSBmbGF0dGVuVG9rZW4obWVyZ2VkVG9rZW4pO1xuICB2YXIgb3ZlcnJpZGVUb2tlblN0ciA9IGZsYXR0ZW5Ub2tlbihvdmVycmlkZSk7XG4gIHZhciBjc3NWYXJTdHIgPSBjc3NWYXIgPyBmbGF0dGVuVG9rZW4oY3NzVmFyKSA6ICcnO1xuICB2YXIgY2FjaGVkVG9rZW4gPSB1c2VHbG9iYWxDYWNoZShUT0tFTl9QUkVGSVgsIFtzYWx0LCB0aGVtZS5pZCwgdG9rZW5TdHIsIG92ZXJyaWRlVG9rZW5TdHIsIGNzc1ZhclN0cl0sIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX2Nzc1ZhciRrZXk7XG4gICAgdmFyIG1lcmdlZERlcml2YXRpdmVUb2tlbiA9IGNvbXB1dGUgPyBjb21wdXRlKG1lcmdlZFRva2VuLCBvdmVycmlkZSwgdGhlbWUpIDogZ2V0Q29tcHV0ZWRUb2tlbihtZXJnZWRUb2tlbiwgb3ZlcnJpZGUsIHRoZW1lLCBmb3JtYXRUb2tlbik7XG5cbiAgICAvLyBSZXBsYWNlIHRva2VuIHZhbHVlIHdpdGggY3NzIHZhcmlhYmxlc1xuICAgIHZhciBhY3R1YWxUb2tlbiA9IF9vYmplY3RTcHJlYWQoe30sIG1lcmdlZERlcml2YXRpdmVUb2tlbik7XG4gICAgdmFyIGNzc1ZhcnNTdHIgPSAnJztcbiAgICBpZiAoISFjc3NWYXIpIHtcbiAgICAgIHZhciBfdHJhbnNmb3JtVG9rZW4gPSB0cmFuc2Zvcm1Ub2tlbihtZXJnZWREZXJpdmF0aXZlVG9rZW4sIGNzc1Zhci5rZXksIHtcbiAgICAgICAgcHJlZml4OiBjc3NWYXIucHJlZml4LFxuICAgICAgICBpZ25vcmU6IGNzc1Zhci5pZ25vcmUsXG4gICAgICAgIHVuaXRsZXNzOiBjc3NWYXIudW5pdGxlc3MsXG4gICAgICAgIHByZXNlcnZlOiBjc3NWYXIucHJlc2VydmVcbiAgICAgIH0pO1xuICAgICAgdmFyIF90cmFuc2Zvcm1Ub2tlbjIgPSBfc2xpY2VkVG9BcnJheShfdHJhbnNmb3JtVG9rZW4sIDIpO1xuICAgICAgbWVyZ2VkRGVyaXZhdGl2ZVRva2VuID0gX3RyYW5zZm9ybVRva2VuMlswXTtcbiAgICAgIGNzc1ZhcnNTdHIgPSBfdHJhbnNmb3JtVG9rZW4yWzFdO1xuICAgIH1cblxuICAgIC8vIE9wdGltaXplIGZvciBgdXNlU3R5bGVSZWdpc3RlcmAgcGVyZm9ybWFuY2VcbiAgICB2YXIgdG9rZW5LZXkgPSB0b2tlbjJrZXkobWVyZ2VkRGVyaXZhdGl2ZVRva2VuLCBzYWx0KTtcbiAgICBtZXJnZWREZXJpdmF0aXZlVG9rZW4uX3Rva2VuS2V5ID0gdG9rZW5LZXk7XG4gICAgYWN0dWFsVG9rZW4uX3Rva2VuS2V5ID0gdG9rZW4ya2V5KGFjdHVhbFRva2VuLCBzYWx0KTtcbiAgICB2YXIgdGhlbWVLZXkgPSAoX2Nzc1ZhciRrZXkgPSBjc3NWYXIgPT09IG51bGwgfHwgY3NzVmFyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjc3NWYXIua2V5KSAhPT0gbnVsbCAmJiBfY3NzVmFyJGtleSAhPT0gdm9pZCAwID8gX2Nzc1ZhciRrZXkgOiB0b2tlbktleTtcbiAgICBtZXJnZWREZXJpdmF0aXZlVG9rZW4uX3RoZW1lS2V5ID0gdGhlbWVLZXk7XG4gICAgcmVjb3JkQ2xlYW5Ub2tlbih0aGVtZUtleSk7XG4gICAgdmFyIGhhc2hJZCA9IFwiXCIuY29uY2F0KGhhc2hQcmVmaXgsIFwiLVwiKS5jb25jYXQoaGFzaCh0b2tlbktleSkpO1xuICAgIG1lcmdlZERlcml2YXRpdmVUb2tlbi5faGFzaElkID0gaGFzaElkOyAvLyBOb3QgdXNlZFxuXG4gICAgcmV0dXJuIFttZXJnZWREZXJpdmF0aXZlVG9rZW4sIGhhc2hJZCwgYWN0dWFsVG9rZW4sIGNzc1ZhcnNTdHIsIChjc3NWYXIgPT09IG51bGwgfHwgY3NzVmFyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjc3NWYXIua2V5KSB8fCAnJ107XG4gIH0sIGZ1bmN0aW9uIChjYWNoZSkge1xuICAgIC8vIFJlbW92ZSB0b2tlbiB3aWxsIHJlbW92ZSBhbGwgcmVsYXRlZCBzdHlsZVxuICAgIGNsZWFuVG9rZW5TdHlsZShjYWNoZVswXS5fdGhlbWVLZXksIGluc3RhbmNlSWQpO1xuICB9LCBmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBfcmVmMiA9IF9zbGljZWRUb0FycmF5KF9yZWYsIDQpLFxuICAgICAgdG9rZW4gPSBfcmVmMlswXSxcbiAgICAgIGNzc1ZhcnNTdHIgPSBfcmVmMlszXTtcbiAgICBpZiAoY3NzVmFyICYmIGNzc1ZhcnNTdHIpIHtcbiAgICAgIHZhciBzdHlsZSA9IHVwZGF0ZUNTUyhjc3NWYXJzU3RyLCBoYXNoKFwiY3NzLXZhcmlhYmxlcy1cIi5jb25jYXQodG9rZW4uX3RoZW1lS2V5KSksIHtcbiAgICAgICAgbWFyazogQVRUUl9NQVJLLFxuICAgICAgICBwcmVwZW5kOiAncXVldWUnLFxuICAgICAgICBhdHRhY2hUbzogY29udGFpbmVyLFxuICAgICAgICBwcmlvcml0eTogLTk5OVxuICAgICAgfSk7XG4gICAgICBzdHlsZVtDU1NfSU5fSlNfSU5TVEFOQ0VdID0gaW5zdGFuY2VJZDtcblxuICAgICAgLy8gVXNlZCBmb3IgYHVzZUNhY2hlVG9rZW5gIHRvIHJlbW92ZSBvbiBiYXRjaCB3aGVuIHRva2VuIHJlbW92ZWRcbiAgICAgIHN0eWxlLnNldEF0dHJpYnV0ZShBVFRSX1RPS0VOLCB0b2tlbi5fdGhlbWVLZXkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBjYWNoZWRUb2tlbjtcbn1cbmV4cG9ydCB2YXIgZXh0cmFjdCA9IGZ1bmN0aW9uIGV4dHJhY3QoY2FjaGUsIGVmZmVjdFN0eWxlcywgb3B0aW9ucykge1xuICB2YXIgX2NhY2hlID0gX3NsaWNlZFRvQXJyYXkoY2FjaGUsIDUpLFxuICAgIHJlYWxUb2tlbiA9IF9jYWNoZVsyXSxcbiAgICBzdHlsZVN0ciA9IF9jYWNoZVszXSxcbiAgICBjc3NWYXJLZXkgPSBfY2FjaGVbNF07XG4gIHZhciBfcmVmMyA9IG9wdGlvbnMgfHwge30sXG4gICAgcGxhaW4gPSBfcmVmMy5wbGFpbjtcbiAgaWYgKCFzdHlsZVN0cikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBzdHlsZUlkID0gcmVhbFRva2VuLl90b2tlbktleTtcbiAgdmFyIG9yZGVyID0gLTk5OTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09IFN0eWxlID09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVXNlZCBmb3IgcmMtdXRpbFxuICB2YXIgc2hhcmVkQXR0cnMgPSB7XG4gICAgJ2RhdGEtcmMtb3JkZXInOiAncHJlcGVuZFF1ZXVlJyxcbiAgICAnZGF0YS1yYy1wcmlvcml0eSc6IFwiXCIuY29uY2F0KG9yZGVyKVxuICB9O1xuICB2YXIgc3R5bGVUZXh0ID0gdG9TdHlsZVN0cihzdHlsZVN0ciwgY3NzVmFyS2V5LCBzdHlsZUlkLCBzaGFyZWRBdHRycywgcGxhaW4pO1xuICByZXR1cm4gW29yZGVyLCBzdHlsZUlkLCBzdHlsZVRleHRdO1xufTsiLCAiZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UociwgZSkge1xuICBpZiAobnVsbCA9PSByKSByZXR1cm4ge307XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIG4gaW4gcikgaWYgKHt9Lmhhc093blByb3BlcnR5LmNhbGwociwgbikpIHtcbiAgICBpZiAoLTEgIT09IGUuaW5kZXhPZihuKSkgY29udGludWU7XG4gICAgdFtuXSA9IHJbbl07XG4gIH1cbiAgcmV0dXJuIHQ7XG59XG5leHBvcnQgeyBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSBhcyBkZWZhdWx0IH07IiwgImltcG9ydCBvYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlIGZyb20gXCIuL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UuanNcIjtcbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhlLCB0KSB7XG4gIGlmIChudWxsID09IGUpIHJldHVybiB7fTtcbiAgdmFyIG8sXG4gICAgcixcbiAgICBpID0gb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShlLCB0KTtcbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgbiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7XG4gICAgZm9yIChyID0gMDsgciA8IG4ubGVuZ3RoOyByKyspIG8gPSBuW3JdLCAtMSA9PT0gdC5pbmRleE9mKG8pICYmIHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgbykgJiYgKGlbb10gPSBlW29dKTtcbiAgfVxuICByZXR1cm4gaTtcbn1cbmV4cG9ydCB7IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBhcyBkZWZhdWx0IH07IiwgImltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCB3YXJuaW5nIGZyb20gXCIuL3dhcm5pbmdcIjtcblxuLyoqXG4gKiBEZWVwbHkgY29tcGFyZXMgdHdvIG9iamVjdCBsaXRlcmFscy5cbiAqIEBwYXJhbSBvYmoxIG9iamVjdCAxXG4gKiBAcGFyYW0gb2JqMiBvYmplY3QgMlxuICogQHBhcmFtIHNoYWxsb3cgc2hhbGxvdyBjb21wYXJlXG4gKiBAcmV0dXJuc1xuICovXG5mdW5jdGlvbiBpc0VxdWFsKG9iajEsIG9iajIpIHtcbiAgdmFyIHNoYWxsb3cgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZhbHNlO1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9wdWxsLzU5NzkvZmlsZXMjZGlmZi1mZGU3MTQ1MDUwYzQ3Y2MzYTMwNjg1NmVmZDVmOWMzMDE2ZTg2ZTg1OWRlOWFmYmQwMmM4NzliZTUwNjdlNThmXG4gIHZhciByZWZTZXQgPSBuZXcgU2V0KCk7XG4gIGZ1bmN0aW9uIGRlZXBFcXVhbChhLCBiKSB7XG4gICAgdmFyIGxldmVsID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAxO1xuICAgIHZhciBjaXJjdWxhciA9IHJlZlNldC5oYXMoYSk7XG4gICAgd2FybmluZyghY2lyY3VsYXIsICdXYXJuaW5nOiBUaGVyZSBtYXkgYmUgY2lyY3VsYXIgcmVmZXJlbmNlcycpO1xuICAgIGlmIChjaXJjdWxhcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoYSA9PT0gYikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChzaGFsbG93ICYmIGxldmVsID4gMSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZWZTZXQuYWRkKGEpO1xuICAgIHZhciBuZXdMZXZlbCA9IGxldmVsICsgMTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGIpIHx8IGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCFkZWVwRXF1YWwoYVtpXSwgYltpXSwgbmV3TGV2ZWwpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGEgJiYgYiAmJiBfdHlwZW9mKGEpID09PSAnb2JqZWN0JyAmJiBfdHlwZW9mKGIpID09PSAnb2JqZWN0Jykge1xuICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhhKTtcbiAgICAgIGlmIChrZXlzLmxlbmd0aCAhPT0gT2JqZWN0LmtleXMoYikubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBrZXlzLmV2ZXJ5KGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIGRlZXBFcXVhbChhW2tleV0sIGJba2V5XSwgbmV3TGV2ZWwpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIG90aGVyXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBkZWVwRXF1YWwob2JqMSwgb2JqMik7XG59XG5leHBvcnQgZGVmYXVsdCBpc0VxdWFsOyIsICJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJjaGlsZHJlblwiXTtcbmltcG9ydCB1c2VNZW1vIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZU1lbW9cIjtcbmltcG9ydCBpc0VxdWFsIGZyb20gXCJyYy11dGlsL2VzL2lzRXF1YWxcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBDYWNoZUVudGl0eSBmcm9tIFwiLi9DYWNoZVwiO1xuZXhwb3J0IHZhciBBVFRSX1RPS0VOID0gJ2RhdGEtdG9rZW4taGFzaCc7XG5leHBvcnQgdmFyIEFUVFJfTUFSSyA9ICdkYXRhLWNzcy1oYXNoJztcbmV4cG9ydCB2YXIgQVRUUl9DQUNIRV9QQVRIID0gJ2RhdGEtY2FjaGUtcGF0aCc7XG5cbi8vIE1hcmsgY3NzLWluLWpzIGluc3RhbmNlIGluIHN0eWxlIGVsZW1lbnRcbmV4cG9ydCB2YXIgQ1NTX0lOX0pTX0lOU1RBTkNFID0gJ19fY3NzaW5qc19pbnN0YW5jZV9fJztcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDYWNoZSgpIHtcbiAgdmFyIGNzc2luanNJbnN0YW5jZUlkID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygxMikuc2xpY2UoMik7XG5cbiAgLy8gVHJpY2t5IFNTUjogTW92ZSBhbGwgaW5saW5lIHN0eWxlIHRvIHRoZSBoZWFkLlxuICAvLyBQUzogV2UgZG8gbm90IHJlY29tbWVuZCB0cmlja3kgbW9kZS5cbiAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQuaGVhZCAmJiBkb2N1bWVudC5ib2R5KSB7XG4gICAgdmFyIHN0eWxlcyA9IGRvY3VtZW50LmJvZHkucXVlcnlTZWxlY3RvckFsbChcInN0eWxlW1wiLmNvbmNhdChBVFRSX01BUkssIFwiXVwiKSkgfHwgW107XG4gICAgdmFyIGZpcnN0Q2hpbGQgPSBkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ7XG4gICAgQXJyYXkuZnJvbShzdHlsZXMpLmZvckVhY2goZnVuY3Rpb24gKHN0eWxlKSB7XG4gICAgICBzdHlsZVtDU1NfSU5fSlNfSU5TVEFOQ0VdID0gc3R5bGVbQ1NTX0lOX0pTX0lOU1RBTkNFXSB8fCBjc3NpbmpzSW5zdGFuY2VJZDtcblxuICAgICAgLy8gTm90IGZvcmNlIG1vdmUgaWYgbm8gaGVhZFxuICAgICAgaWYgKHN0eWxlW0NTU19JTl9KU19JTlNUQU5DRV0gPT09IGNzc2luanNJbnN0YW5jZUlkKSB7XG4gICAgICAgIGRvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKHN0eWxlLCBmaXJzdENoaWxkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIERlZHVwbGljYXRlIG9mIG1vdmVkIHN0eWxlc1xuICAgIHZhciBzdHlsZUhhc2ggPSB7fTtcbiAgICBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJzdHlsZVtcIi5jb25jYXQoQVRUUl9NQVJLLCBcIl1cIikpKS5mb3JFYWNoKGZ1bmN0aW9uIChzdHlsZSkge1xuICAgICAgdmFyIGhhc2ggPSBzdHlsZS5nZXRBdHRyaWJ1dGUoQVRUUl9NQVJLKTtcbiAgICAgIGlmIChzdHlsZUhhc2hbaGFzaF0pIHtcbiAgICAgICAgaWYgKHN0eWxlW0NTU19JTl9KU19JTlNUQU5DRV0gPT09IGNzc2luanNJbnN0YW5jZUlkKSB7XG4gICAgICAgICAgdmFyIF9zdHlsZSRwYXJlbnROb2RlO1xuICAgICAgICAgIChfc3R5bGUkcGFyZW50Tm9kZSA9IHN0eWxlLnBhcmVudE5vZGUpID09PSBudWxsIHx8IF9zdHlsZSRwYXJlbnROb2RlID09PSB2b2lkIDAgfHwgX3N0eWxlJHBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3R5bGUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHlsZUhhc2hbaGFzaF0gPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiBuZXcgQ2FjaGVFbnRpdHkoY3NzaW5qc0luc3RhbmNlSWQpO1xufVxudmFyIFN0eWxlQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHtcbiAgaGFzaFByaW9yaXR5OiAnbG93JyxcbiAgY2FjaGU6IGNyZWF0ZUNhY2hlKCksXG4gIGRlZmF1bHRDYWNoZTogdHJ1ZVxufSk7XG5leHBvcnQgdmFyIFN0eWxlUHJvdmlkZXIgPSBmdW5jdGlvbiBTdHlsZVByb3ZpZGVyKHByb3BzKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgX2V4Y2x1ZGVkKTtcbiAgdmFyIHBhcmVudENvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KFN0eWxlQ29udGV4dCk7XG4gIHZhciBjb250ZXh0ID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG1lcmdlZENvbnRleHQgPSBfb2JqZWN0U3ByZWFkKHt9LCBwYXJlbnRDb250ZXh0KTtcbiAgICBPYmplY3Qua2V5cyhyZXN0UHJvcHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgdmFyIHZhbHVlID0gcmVzdFByb3BzW2tleV07XG4gICAgICBpZiAocmVzdFByb3BzW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBtZXJnZWRDb250ZXh0W2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB2YXIgY2FjaGUgPSByZXN0UHJvcHMuY2FjaGU7XG4gICAgbWVyZ2VkQ29udGV4dC5jYWNoZSA9IG1lcmdlZENvbnRleHQuY2FjaGUgfHwgY3JlYXRlQ2FjaGUoKTtcbiAgICBtZXJnZWRDb250ZXh0LmRlZmF1bHRDYWNoZSA9ICFjYWNoZSAmJiBwYXJlbnRDb250ZXh0LmRlZmF1bHRDYWNoZTtcbiAgICByZXR1cm4gbWVyZ2VkQ29udGV4dDtcbiAgfSwgW3BhcmVudENvbnRleHQsIHJlc3RQcm9wc10sIGZ1bmN0aW9uIChwcmV2LCBuZXh0KSB7XG4gICAgcmV0dXJuICFpc0VxdWFsKHByZXZbMF0sIG5leHRbMF0sIHRydWUpIHx8ICFpc0VxdWFsKHByZXZbMV0sIG5leHRbMV0sIHRydWUpO1xuICB9KTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFN0eWxlQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBjb250ZXh0XG4gIH0sIGNoaWxkcmVuKTtcbn07XG5leHBvcnQgZGVmYXVsdCBTdHlsZUNvbnRleHQ7IiwgImltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbi8vIFt0aW1lcywgcmVhbFZhbHVlXVxuXG52YXIgU1BMSVQgPSAnJSc7XG5cbi8qKiBDb25uZWN0IGtleSB3aXRoIGBTUExJVGAgKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXRoS2V5KGtleXMpIHtcbiAgcmV0dXJuIGtleXMuam9pbihTUExJVCk7XG59XG52YXIgRW50aXR5ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRW50aXR5KGluc3RhbmNlSWQpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRW50aXR5KTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJpbnN0YW5jZUlkXCIsIHZvaWQgMCk7XG4gICAgLyoqIEBwcml2YXRlIEludGVybmFsIGNhY2hlIG1hcC4gRG8gbm90IGFjY2VzcyB0aGlzIGRpcmVjdGx5ICovXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiY2FjaGVcIiwgbmV3IE1hcCgpKTtcbiAgICB0aGlzLmluc3RhbmNlSWQgPSBpbnN0YW5jZUlkO1xuICB9XG4gIF9jcmVhdGVDbGFzcyhFbnRpdHksIFt7XG4gICAga2V5OiBcImdldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXQoa2V5cykge1xuICAgICAgcmV0dXJuIHRoaXMub3BHZXQocGF0aEtleShrZXlzKSk7XG4gICAgfVxuXG4gICAgLyoqIEEgZmFzdCBnZXQgY2FjaGUgd2l0aCBgZ2V0YCBjb25jYXQuICovXG4gIH0sIHtcbiAgICBrZXk6IFwib3BHZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb3BHZXQoa2V5UGF0aFN0cikge1xuICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KGtleVBhdGhTdHIpIHx8IG51bGw7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGUoa2V5cywgdmFsdWVGbikge1xuICAgICAgcmV0dXJuIHRoaXMub3BVcGRhdGUocGF0aEtleShrZXlzKSwgdmFsdWVGbik7XG4gICAgfVxuXG4gICAgLyoqIEEgZmFzdCBnZXQgY2FjaGUgd2l0aCBgZ2V0YCBjb25jYXQuICovXG4gIH0sIHtcbiAgICBrZXk6IFwib3BVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb3BVcGRhdGUoa2V5UGF0aFN0ciwgdmFsdWVGbikge1xuICAgICAgdmFyIHByZXZWYWx1ZSA9IHRoaXMuY2FjaGUuZ2V0KGtleVBhdGhTdHIpO1xuICAgICAgdmFyIG5leHRWYWx1ZSA9IHZhbHVlRm4ocHJldlZhbHVlKTtcbiAgICAgIGlmIChuZXh0VmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5jYWNoZS5kZWxldGUoa2V5UGF0aFN0cik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNhY2hlLnNldChrZXlQYXRoU3RyLCBuZXh0VmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gRW50aXR5O1xufSgpO1xuZXhwb3J0IGRlZmF1bHQgRW50aXR5OyIsICJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3NlcnRUaGlzSW5pdGlhbGl6ZWRcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzXCI7XG5pbXBvcnQgX2NyZWF0ZVN1cGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVTdXBlclwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBBYnN0cmFjdENhbGN1bGF0b3IgZnJvbSBcIi4vY2FsY3VsYXRvclwiO1xudmFyIENBTENfVU5JVCA9ICdDQUxDX1VOSVQnO1xudmFyIHJlZ2V4cCA9IG5ldyBSZWdFeHAoQ0FMQ19VTklULCAnZycpO1xuZnVuY3Rpb24gdW5pdCh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBcIlwiLmNvbmNhdCh2YWx1ZSkuY29uY2F0KENBTENfVU5JVCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxudmFyIENTU0NhbGN1bGF0b3IgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9BYnN0cmFjdENhbGN1bGF0b3IpIHtcbiAgX2luaGVyaXRzKENTU0NhbGN1bGF0b3IsIF9BYnN0cmFjdENhbGN1bGF0b3IpO1xuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKENTU0NhbGN1bGF0b3IpO1xuICBmdW5jdGlvbiBDU1NDYWxjdWxhdG9yKG51bSwgdW5pdGxlc3NDc3NWYXIpIHtcbiAgICB2YXIgX3RoaXM7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENTU0NhbGN1bGF0b3IpO1xuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInJlc3VsdFwiLCAnJyk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInVuaXRsZXNzQ3NzVmFyXCIsIHZvaWQgMCk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImxvd1ByaW9yaXR5XCIsIHZvaWQgMCk7XG4gICAgdmFyIG51bVR5cGUgPSBfdHlwZW9mKG51bSk7XG4gICAgX3RoaXMudW5pdGxlc3NDc3NWYXIgPSB1bml0bGVzc0Nzc1ZhcjtcbiAgICBpZiAobnVtIGluc3RhbmNlb2YgQ1NTQ2FsY3VsYXRvcikge1xuICAgICAgX3RoaXMucmVzdWx0ID0gXCIoXCIuY29uY2F0KG51bS5yZXN1bHQsIFwiKVwiKTtcbiAgICB9IGVsc2UgaWYgKG51bVR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICBfdGhpcy5yZXN1bHQgPSB1bml0KG51bSk7XG4gICAgfSBlbHNlIGlmIChudW1UeXBlID09PSAnc3RyaW5nJykge1xuICAgICAgX3RoaXMucmVzdWx0ID0gbnVtO1xuICAgIH1cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgX2NyZWF0ZUNsYXNzKENTU0NhbGN1bGF0b3IsIFt7XG4gICAga2V5OiBcImFkZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGQobnVtKSB7XG4gICAgICBpZiAobnVtIGluc3RhbmNlb2YgQ1NTQ2FsY3VsYXRvcikge1xuICAgICAgICB0aGlzLnJlc3VsdCA9IFwiXCIuY29uY2F0KHRoaXMucmVzdWx0LCBcIiArIFwiKS5jb25jYXQobnVtLmdldFJlc3VsdCgpKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG51bSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIG51bSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5yZXN1bHQgPSBcIlwiLmNvbmNhdCh0aGlzLnJlc3VsdCwgXCIgKyBcIikuY29uY2F0KHVuaXQobnVtKSk7XG4gICAgICB9XG4gICAgICB0aGlzLmxvd1ByaW9yaXR5ID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzdWJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3ViKG51bSkge1xuICAgICAgaWYgKG51bSBpbnN0YW5jZW9mIENTU0NhbGN1bGF0b3IpIHtcbiAgICAgICAgdGhpcy5yZXN1bHQgPSBcIlwiLmNvbmNhdCh0aGlzLnJlc3VsdCwgXCIgLSBcIikuY29uY2F0KG51bS5nZXRSZXN1bHQoKSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBudW0gPT09ICdudW1iZXInIHx8IHR5cGVvZiBudW0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMucmVzdWx0ID0gXCJcIi5jb25jYXQodGhpcy5yZXN1bHQsIFwiIC0gXCIpLmNvbmNhdCh1bml0KG51bSkpO1xuICAgICAgfVxuICAgICAgdGhpcy5sb3dQcmlvcml0eSA9IHRydWU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibXVsXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG11bChudW0pIHtcbiAgICAgIGlmICh0aGlzLmxvd1ByaW9yaXR5KSB7XG4gICAgICAgIHRoaXMucmVzdWx0ID0gXCIoXCIuY29uY2F0KHRoaXMucmVzdWx0LCBcIilcIik7XG4gICAgICB9XG4gICAgICBpZiAobnVtIGluc3RhbmNlb2YgQ1NTQ2FsY3VsYXRvcikge1xuICAgICAgICB0aGlzLnJlc3VsdCA9IFwiXCIuY29uY2F0KHRoaXMucmVzdWx0LCBcIiAqIFwiKS5jb25jYXQobnVtLmdldFJlc3VsdCh0cnVlKSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBudW0gPT09ICdudW1iZXInIHx8IHR5cGVvZiBudW0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMucmVzdWx0ID0gXCJcIi5jb25jYXQodGhpcy5yZXN1bHQsIFwiICogXCIpLmNvbmNhdChudW0pO1xuICAgICAgfVxuICAgICAgdGhpcy5sb3dQcmlvcml0eSA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRpdlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkaXYobnVtKSB7XG4gICAgICBpZiAodGhpcy5sb3dQcmlvcml0eSkge1xuICAgICAgICB0aGlzLnJlc3VsdCA9IFwiKFwiLmNvbmNhdCh0aGlzLnJlc3VsdCwgXCIpXCIpO1xuICAgICAgfVxuICAgICAgaWYgKG51bSBpbnN0YW5jZW9mIENTU0NhbGN1bGF0b3IpIHtcbiAgICAgICAgdGhpcy5yZXN1bHQgPSBcIlwiLmNvbmNhdCh0aGlzLnJlc3VsdCwgXCIgLyBcIikuY29uY2F0KG51bS5nZXRSZXN1bHQodHJ1ZSkpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbnVtID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgbnVtID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLnJlc3VsdCA9IFwiXCIuY29uY2F0KHRoaXMucmVzdWx0LCBcIiAvIFwiKS5jb25jYXQobnVtKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubG93UHJpb3JpdHkgPSBmYWxzZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRSZXN1bHRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UmVzdWx0KGZvcmNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5sb3dQcmlvcml0eSB8fCBmb3JjZSA/IFwiKFwiLmNvbmNhdCh0aGlzLnJlc3VsdCwgXCIpXCIpIDogdGhpcy5yZXN1bHQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVxdWFsXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVxdWFsKG9wdGlvbnMpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuICAgICAgdmFyIF9yZWYgPSBvcHRpb25zIHx8IHt9LFxuICAgICAgICBjc3NVbml0ID0gX3JlZi51bml0O1xuICAgICAgdmFyIG1lcmdlZFVuaXQgPSB0cnVlO1xuICAgICAgaWYgKHR5cGVvZiBjc3NVbml0ID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgbWVyZ2VkVW5pdCA9IGNzc1VuaXQ7XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmZyb20odGhpcy51bml0bGVzc0Nzc1Zhcikuc29tZShmdW5jdGlvbiAoY3NzVmFyKSB7XG4gICAgICAgIHJldHVybiBfdGhpczIucmVzdWx0LmluY2x1ZGVzKGNzc1Zhcik7XG4gICAgICB9KSkge1xuICAgICAgICBtZXJnZWRVbml0ID0gZmFsc2U7XG4gICAgICB9XG4gICAgICB0aGlzLnJlc3VsdCA9IHRoaXMucmVzdWx0LnJlcGxhY2UocmVnZXhwLCBtZXJnZWRVbml0ID8gJ3B4JyA6ICcnKTtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5sb3dQcmlvcml0eSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIFwiY2FsYyhcIi5jb25jYXQodGhpcy5yZXN1bHQsIFwiKVwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnJlc3VsdDtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIENTU0NhbGN1bGF0b3I7XG59KEFic3RyYWN0Q2FsY3VsYXRvcik7XG5leHBvcnQgeyBDU1NDYWxjdWxhdG9yIGFzIGRlZmF1bHQgfTsiLCAiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IENhY2hlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGZ1bmN0aW9uIHNhbWVEZXJpdmF0aXZlT3B0aW9uKGxlZnQsIHJpZ2h0KSB7XG4gIGlmIChsZWZ0Lmxlbmd0aCAhPT0gcmlnaHQubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVmdC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChsZWZ0W2ldICE9PSByaWdodFtpXSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbnZhciBUaGVtZUNhY2hlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gVGhlbWVDYWNoZSgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVGhlbWVDYWNoZSk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiY2FjaGVcIiwgdm9pZCAwKTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJrZXlzXCIsIHZvaWQgMCk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiY2FjaGVDYWxsVGltZXNcIiwgdm9pZCAwKTtcbiAgICB0aGlzLmNhY2hlID0gbmV3IE1hcCgpO1xuICAgIHRoaXMua2V5cyA9IFtdO1xuICAgIHRoaXMuY2FjaGVDYWxsVGltZXMgPSAwO1xuICB9XG4gIF9jcmVhdGVDbGFzcyhUaGVtZUNhY2hlLCBbe1xuICAgIGtleTogXCJzaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNpemUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5rZXlzLmxlbmd0aDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW50ZXJuYWxHZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW50ZXJuYWxHZXQoZGVyaXZhdGl2ZU9wdGlvbikge1xuICAgICAgdmFyIF9jYWNoZTIsIF9jYWNoZTM7XG4gICAgICB2YXIgdXBkYXRlQ2FsbFRpbWVzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcbiAgICAgIHZhciBjYWNoZSA9IHtcbiAgICAgICAgbWFwOiB0aGlzLmNhY2hlXG4gICAgICB9O1xuICAgICAgZGVyaXZhdGl2ZU9wdGlvbi5mb3JFYWNoKGZ1bmN0aW9uIChkZXJpdmF0aXZlKSB7XG4gICAgICAgIGlmICghY2FjaGUpIHtcbiAgICAgICAgICBjYWNoZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgX2NhY2hlO1xuICAgICAgICAgIGNhY2hlID0gKF9jYWNoZSA9IGNhY2hlKSA9PT0gbnVsbCB8fCBfY2FjaGUgPT09IHZvaWQgMCB8fCAoX2NhY2hlID0gX2NhY2hlLm1hcCkgPT09IG51bGwgfHwgX2NhY2hlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfY2FjaGUuZ2V0KGRlcml2YXRpdmUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmICgoX2NhY2hlMiA9IGNhY2hlKSAhPT0gbnVsbCAmJiBfY2FjaGUyICE9PSB2b2lkIDAgJiYgX2NhY2hlMi52YWx1ZSAmJiB1cGRhdGVDYWxsVGltZXMpIHtcbiAgICAgICAgY2FjaGUudmFsdWVbMV0gPSB0aGlzLmNhY2hlQ2FsbFRpbWVzKys7XG4gICAgICB9XG4gICAgICByZXR1cm4gKF9jYWNoZTMgPSBjYWNoZSkgPT09IG51bGwgfHwgX2NhY2hlMyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2NhY2hlMy52YWx1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldChkZXJpdmF0aXZlT3B0aW9uKSB7XG4gICAgICB2YXIgX3RoaXMkaW50ZXJuYWxHZXQ7XG4gICAgICByZXR1cm4gKF90aGlzJGludGVybmFsR2V0ID0gdGhpcy5pbnRlcm5hbEdldChkZXJpdmF0aXZlT3B0aW9uLCB0cnVlKSkgPT09IG51bGwgfHwgX3RoaXMkaW50ZXJuYWxHZXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJGludGVybmFsR2V0WzBdO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJoYXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFzKGRlcml2YXRpdmVPcHRpb24pIHtcbiAgICAgIHJldHVybiAhIXRoaXMuaW50ZXJuYWxHZXQoZGVyaXZhdGl2ZU9wdGlvbik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQoZGVyaXZhdGl2ZU9wdGlvbiwgdmFsdWUpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAvLyBOZXcgY2FjaGVcbiAgICAgIGlmICghdGhpcy5oYXMoZGVyaXZhdGl2ZU9wdGlvbikpIHtcbiAgICAgICAgaWYgKHRoaXMuc2l6ZSgpICsgMSA+IFRoZW1lQ2FjaGUuTUFYX0NBQ0hFX1NJWkUgKyBUaGVtZUNhY2hlLk1BWF9DQUNIRV9PRkZTRVQpIHtcbiAgICAgICAgICB2YXIgX3RoaXMka2V5cyRyZWR1Y2UgPSB0aGlzLmtleXMucmVkdWNlKGZ1bmN0aW9uIChyZXN1bHQsIGtleSkge1xuICAgICAgICAgICAgICB2YXIgX3Jlc3VsdCA9IF9zbGljZWRUb0FycmF5KHJlc3VsdCwgMiksXG4gICAgICAgICAgICAgICAgY2FsbFRpbWVzID0gX3Jlc3VsdFsxXTtcbiAgICAgICAgICAgICAgaWYgKF90aGlzLmludGVybmFsR2V0KGtleSlbMV0gPCBjYWxsVGltZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW2tleSwgX3RoaXMuaW50ZXJuYWxHZXQoa2V5KVsxXV07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0sIFt0aGlzLmtleXNbMF0sIHRoaXMuY2FjaGVDYWxsVGltZXNdKSxcbiAgICAgICAgICAgIF90aGlzJGtleXMkcmVkdWNlMiA9IF9zbGljZWRUb0FycmF5KF90aGlzJGtleXMkcmVkdWNlLCAxKSxcbiAgICAgICAgICAgIHRhcmdldEtleSA9IF90aGlzJGtleXMkcmVkdWNlMlswXTtcbiAgICAgICAgICB0aGlzLmRlbGV0ZSh0YXJnZXRLZXkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMua2V5cy5wdXNoKGRlcml2YXRpdmVPcHRpb24pO1xuICAgICAgfVxuICAgICAgdmFyIGNhY2hlID0gdGhpcy5jYWNoZTtcbiAgICAgIGRlcml2YXRpdmVPcHRpb24uZm9yRWFjaChmdW5jdGlvbiAoZGVyaXZhdGl2ZSwgaW5kZXgpIHtcbiAgICAgICAgaWYgKGluZGV4ID09PSBkZXJpdmF0aXZlT3B0aW9uLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBjYWNoZS5zZXQoZGVyaXZhdGl2ZSwge1xuICAgICAgICAgICAgdmFsdWU6IFt2YWx1ZSwgX3RoaXMuY2FjaGVDYWxsVGltZXMrK11cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgY2FjaGVWYWx1ZSA9IGNhY2hlLmdldChkZXJpdmF0aXZlKTtcbiAgICAgICAgICBpZiAoIWNhY2hlVmFsdWUpIHtcbiAgICAgICAgICAgIGNhY2hlLnNldChkZXJpdmF0aXZlLCB7XG4gICAgICAgICAgICAgIG1hcDogbmV3IE1hcCgpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFjYWNoZVZhbHVlLm1hcCkge1xuICAgICAgICAgICAgY2FjaGVWYWx1ZS5tYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhY2hlID0gY2FjaGUuZ2V0KGRlcml2YXRpdmUpLm1hcDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRlbGV0ZUJ5UGF0aFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZWxldGVCeVBhdGgoY3VycmVudENhY2hlLCBkZXJpdmF0aXZlcykge1xuICAgICAgdmFyIGNhY2hlID0gY3VycmVudENhY2hlLmdldChkZXJpdmF0aXZlc1swXSk7XG4gICAgICBpZiAoZGVyaXZhdGl2ZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHZhciBfY2FjaGUkdmFsdWU7XG4gICAgICAgIGlmICghY2FjaGUubWFwKSB7XG4gICAgICAgICAgY3VycmVudENhY2hlLmRlbGV0ZShkZXJpdmF0aXZlc1swXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3VycmVudENhY2hlLnNldChkZXJpdmF0aXZlc1swXSwge1xuICAgICAgICAgICAgbWFwOiBjYWNoZS5tYXBcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKF9jYWNoZSR2YWx1ZSA9IGNhY2hlLnZhbHVlKSA9PT0gbnVsbCB8fCBfY2FjaGUkdmFsdWUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jYWNoZSR2YWx1ZVswXTtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSB0aGlzLmRlbGV0ZUJ5UGF0aChjYWNoZS5tYXAsIGRlcml2YXRpdmVzLnNsaWNlKDEpKTtcbiAgICAgIGlmICgoIWNhY2hlLm1hcCB8fCBjYWNoZS5tYXAuc2l6ZSA9PT0gMCkgJiYgIWNhY2hlLnZhbHVlKSB7XG4gICAgICAgIGN1cnJlbnRDYWNoZS5kZWxldGUoZGVyaXZhdGl2ZXNbMF0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGVsZXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9kZWxldGUoZGVyaXZhdGl2ZU9wdGlvbikge1xuICAgICAgLy8gSWYgY2FjaGUgZXhpc3RzXG4gICAgICBpZiAodGhpcy5oYXMoZGVyaXZhdGl2ZU9wdGlvbikpIHtcbiAgICAgICAgdGhpcy5rZXlzID0gdGhpcy5rZXlzLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgIHJldHVybiAhc2FtZURlcml2YXRpdmVPcHRpb24oaXRlbSwgZGVyaXZhdGl2ZU9wdGlvbik7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5kZWxldGVCeVBhdGgodGhpcy5jYWNoZSwgZGVyaXZhdGl2ZU9wdGlvbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gVGhlbWVDYWNoZTtcbn0oKTtcbl9kZWZpbmVQcm9wZXJ0eShUaGVtZUNhY2hlLCBcIk1BWF9DQUNIRV9TSVpFXCIsIDIwKTtcbl9kZWZpbmVQcm9wZXJ0eShUaGVtZUNhY2hlLCBcIk1BWF9DQUNIRV9PRkZTRVRcIiwgNSk7XG5leHBvcnQgeyBUaGVtZUNhY2hlIGFzIGRlZmF1bHQgfTsiLCAiaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IHsgd2FybmluZyB9IGZyb20gXCJyYy11dGlsL2VzL3dhcm5pbmdcIjtcbnZhciB1dWlkID0gMDtcblxuLyoqXG4gKiBUaGVtZSB3aXRoIGFsZ29yaXRobXMgdG8gZGVyaXZlIHRva2VucyBmcm9tIGRlc2lnbiB0b2tlbnMuXG4gKiBVc2UgYGNyZWF0ZVRoZW1lYCBmaXJzdCB3aGljaCB3aWxsIGhlbHAgdG8gbWFuYWdlIHRoZSB0aGVtZSBpbnN0YW5jZSBjYWNoZS5cbiAqL1xudmFyIFRoZW1lID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gVGhlbWUoZGVyaXZhdGl2ZXMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVGhlbWUpO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImRlcml2YXRpdmVzXCIsIHZvaWQgMCk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiaWRcIiwgdm9pZCAwKTtcbiAgICB0aGlzLmRlcml2YXRpdmVzID0gQXJyYXkuaXNBcnJheShkZXJpdmF0aXZlcykgPyBkZXJpdmF0aXZlcyA6IFtkZXJpdmF0aXZlc107XG4gICAgdGhpcy5pZCA9IHV1aWQ7XG4gICAgaWYgKGRlcml2YXRpdmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgd2FybmluZyhkZXJpdmF0aXZlcy5sZW5ndGggPiAwLCAnW0FudCBEZXNpZ24gQ1NTLWluLUpTXSBUaGVtZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCBvbmUgZGVyaXZhdGl2ZSBmdW5jdGlvbi4nKTtcbiAgICB9XG4gICAgdXVpZCArPSAxO1xuICB9XG4gIF9jcmVhdGVDbGFzcyhUaGVtZSwgW3tcbiAgICBrZXk6IFwiZ2V0RGVyaXZhdGl2ZVRva2VuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldERlcml2YXRpdmVUb2tlbih0b2tlbikge1xuICAgICAgcmV0dXJuIHRoaXMuZGVyaXZhdGl2ZXMucmVkdWNlKGZ1bmN0aW9uIChyZXN1bHQsIGRlcml2YXRpdmUpIHtcbiAgICAgICAgcmV0dXJuIGRlcml2YXRpdmUodG9rZW4sIHJlc3VsdCk7XG4gICAgICB9LCB1bmRlZmluZWQpO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gVGhlbWU7XG59KCk7XG5leHBvcnQgeyBUaGVtZSBhcyBkZWZhdWx0IH07IiwgImltcG9ydCBUaGVtZUNhY2hlIGZyb20gXCIuL1RoZW1lQ2FjaGVcIjtcbmltcG9ydCBUaGVtZSBmcm9tIFwiLi9UaGVtZVwiO1xudmFyIGNhY2hlVGhlbWVzID0gbmV3IFRoZW1lQ2FjaGUoKTtcblxuLyoqXG4gKiBTYW1lIGFzIG5ldyBUaGVtZSwgYnV0IHdpbGwgYWx3YXlzIHJldHVybiBzYW1lIG9uZSBpZiBgZGVyaXZhdGl2ZWAgbm90IGNoYW5nZWQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZVRoZW1lKGRlcml2YXRpdmVzKSB7XG4gIHZhciBkZXJpdmF0aXZlQXJyID0gQXJyYXkuaXNBcnJheShkZXJpdmF0aXZlcykgPyBkZXJpdmF0aXZlcyA6IFtkZXJpdmF0aXZlc107XG4gIC8vIENyZWF0ZSBuZXcgdGhlbWUgaWYgbm90IGV4aXN0XG4gIGlmICghY2FjaGVUaGVtZXMuaGFzKGRlcml2YXRpdmVBcnIpKSB7XG4gICAgY2FjaGVUaGVtZXMuc2V0KGRlcml2YXRpdmVBcnIsIG5ldyBUaGVtZShkZXJpdmF0aXZlQXJyKSk7XG4gIH1cblxuICAvLyBHZXQgdGhlbWUgZnJvbSBjYWNoZSBhbmQgcmV0dXJuXG4gIHJldHVybiBjYWNoZVRoZW1lcy5nZXQoZGVyaXZhdGl2ZUFycik7XG59IiwgImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IGhhc2ggZnJvbSAnQGVtb3Rpb24vaGFzaCc7XG5pbXBvcnQgY2FuVXNlRG9tIGZyb20gXCJyYy11dGlsL2VzL0RvbS9jYW5Vc2VEb21cIjtcbmltcG9ydCB7IHJlbW92ZUNTUywgdXBkYXRlQ1NTIH0gZnJvbSBcInJjLXV0aWwvZXMvRG9tL2R5bmFtaWNDU1NcIjtcbmltcG9ydCB7IEFUVFJfTUFSSywgQVRUUl9UT0tFTiB9IGZyb20gXCIuLi9TdHlsZUNvbnRleHRcIjtcbmltcG9ydCB7IFRoZW1lIH0gZnJvbSBcIi4uL3RoZW1lXCI7XG5cbi8vIENyZWF0ZSBhIGNhY2hlIGZvciBtZW1vIGNvbmNhdFxuXG52YXIgcmVzdWx0Q2FjaGUgPSBuZXcgV2Vha01hcCgpO1xudmFyIFJFU1VMVF9WQUxVRSA9IHt9O1xuZXhwb3J0IGZ1bmN0aW9uIG1lbW9SZXN1bHQoY2FsbGJhY2ssIGRlcHMpIHtcbiAgdmFyIGN1cnJlbnQgPSByZXN1bHRDYWNoZTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZXBzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgdmFyIGRlcCA9IGRlcHNbaV07XG4gICAgaWYgKCFjdXJyZW50LmhhcyhkZXApKSB7XG4gICAgICBjdXJyZW50LnNldChkZXAsIG5ldyBXZWFrTWFwKCkpO1xuICAgIH1cbiAgICBjdXJyZW50ID0gY3VycmVudC5nZXQoZGVwKTtcbiAgfVxuICBpZiAoIWN1cnJlbnQuaGFzKFJFU1VMVF9WQUxVRSkpIHtcbiAgICBjdXJyZW50LnNldChSRVNVTFRfVkFMVUUsIGNhbGxiYWNrKCkpO1xuICB9XG4gIHJldHVybiBjdXJyZW50LmdldChSRVNVTFRfVkFMVUUpO1xufVxuXG4vLyBDcmVhdGUgYSBjYWNoZSBoZXJlIHRvIGF2b2lkIGFsd2F5cyBsb29wIGdlbmVyYXRlXG52YXIgZmxhdHRlblRva2VuQ2FjaGUgPSBuZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEZsYXR0ZW4gdG9rZW4gdG8gc3RyaW5nLCB0aGlzIHdpbGwgYXV0byBjYWNoZSB0aGUgcmVzdWx0IHdoZW4gdG9rZW4gbm90IGNoYW5nZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZmxhdHRlblRva2VuKHRva2VuKSB7XG4gIHZhciBzdHIgPSBmbGF0dGVuVG9rZW5DYWNoZS5nZXQodG9rZW4pIHx8ICcnO1xuICBpZiAoIXN0cikge1xuICAgIE9iamVjdC5rZXlzKHRva2VuKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciB2YWx1ZSA9IHRva2VuW2tleV07XG4gICAgICBzdHIgKz0ga2V5O1xuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVGhlbWUpIHtcbiAgICAgICAgc3RyICs9IHZhbHVlLmlkO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZSAmJiBfdHlwZW9mKHZhbHVlKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgc3RyICs9IGZsYXR0ZW5Ub2tlbih2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHIgKz0gdmFsdWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy80ODM4NlxuICAgIC8vIFNob3VsZCBoYXNoIHRoZSBzdHJpbmcgdG8gYXZvaWQgc3R5bGUgdGFnIG5hbWUgdG9vIGxvbmdcbiAgICBzdHIgPSBoYXNoKHN0cik7XG5cbiAgICAvLyBQdXQgaW4gY2FjaGVcbiAgICBmbGF0dGVuVG9rZW5DYWNoZS5zZXQodG9rZW4sIHN0cik7XG4gIH1cbiAgcmV0dXJuIHN0cjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGRlcml2YXRpdmUgdG9rZW4gdG8ga2V5IHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gdG9rZW4ya2V5KHRva2VuLCBzYWx0KSB7XG4gIHJldHVybiBoYXNoKFwiXCIuY29uY2F0KHNhbHQsIFwiX1wiKS5jb25jYXQoZmxhdHRlblRva2VuKHRva2VuKSkpO1xufVxudmFyIHJhbmRvbVNlbGVjdG9yS2V5ID0gXCJyYW5kb20tXCIuY29uY2F0KERhdGUubm93KCksIFwiLVwiKS5jb25jYXQoTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXFwuL2csICcnKTtcblxuLy8gTWFnaWMgYGNvbnRlbnRgIGZvciBkZXRlY3Qgc2VsZWN0b3Igc3VwcG9ydFxudmFyIGNoZWNrQ29udGVudCA9ICdfYkFtQm9PXyc7XG5mdW5jdGlvbiBzdXBwb3J0U2VsZWN0b3Ioc3R5bGVTdHIsIGhhbmRsZUVsZW1lbnQsIHN1cHBvcnRDaGVjaykge1xuICBpZiAoY2FuVXNlRG9tKCkpIHtcbiAgICB2YXIgX2dldENvbXB1dGVkU3R5bGUkY29uLCBfZWxlJHBhcmVudE5vZGU7XG4gICAgdXBkYXRlQ1NTKHN0eWxlU3RyLCByYW5kb21TZWxlY3RvcktleSk7XG4gICAgdmFyIF9lbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBfZWxlLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcbiAgICBfZWxlLnN0eWxlLmxlZnQgPSAnMCc7XG4gICAgX2VsZS5zdHlsZS50b3AgPSAnMCc7XG4gICAgaGFuZGxlRWxlbWVudCA9PT0gbnVsbCB8fCBoYW5kbGVFbGVtZW50ID09PSB2b2lkIDAgfHwgaGFuZGxlRWxlbWVudChfZWxlKTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKF9lbGUpO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBfZWxlLmlubmVySFRNTCA9ICdUZXN0JztcbiAgICAgIF9lbGUuc3R5bGUuekluZGV4ID0gJzk5OTk5OTknO1xuICAgIH1cbiAgICB2YXIgc3VwcG9ydCA9IHN1cHBvcnRDaGVjayA/IHN1cHBvcnRDaGVjayhfZWxlKSA6IChfZ2V0Q29tcHV0ZWRTdHlsZSRjb24gPSBnZXRDb21wdXRlZFN0eWxlKF9lbGUpLmNvbnRlbnQpID09PSBudWxsIHx8IF9nZXRDb21wdXRlZFN0eWxlJGNvbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2dldENvbXB1dGVkU3R5bGUkY29uLmluY2x1ZGVzKGNoZWNrQ29udGVudCk7XG4gICAgKF9lbGUkcGFyZW50Tm9kZSA9IF9lbGUucGFyZW50Tm9kZSkgPT09IG51bGwgfHwgX2VsZSRwYXJlbnROb2RlID09PSB2b2lkIDAgfHwgX2VsZSRwYXJlbnROb2RlLnJlbW92ZUNoaWxkKF9lbGUpO1xuICAgIHJlbW92ZUNTUyhyYW5kb21TZWxlY3RvcktleSk7XG4gICAgcmV0dXJuIHN1cHBvcnQ7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxudmFyIGNhbkxheWVyID0gdW5kZWZpbmVkO1xuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRMYXllcigpIHtcbiAgaWYgKGNhbkxheWVyID09PSB1bmRlZmluZWQpIHtcbiAgICBjYW5MYXllciA9IHN1cHBvcnRTZWxlY3RvcihcIkBsYXllciBcIi5jb25jYXQocmFuZG9tU2VsZWN0b3JLZXksIFwiIHsgLlwiKS5jb25jYXQocmFuZG9tU2VsZWN0b3JLZXksIFwiIHsgY29udGVudDogXFxcIlwiKS5jb25jYXQoY2hlY2tDb250ZW50LCBcIlxcXCIhaW1wb3J0YW50OyB9IH1cIiksIGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIGVsZS5jbGFzc05hbWUgPSByYW5kb21TZWxlY3RvcktleTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gY2FuTGF5ZXI7XG59XG52YXIgY2FuV2hlcmUgPSB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydFdoZXJlKCkge1xuICBpZiAoY2FuV2hlcmUgPT09IHVuZGVmaW5lZCkge1xuICAgIGNhbldoZXJlID0gc3VwcG9ydFNlbGVjdG9yKFwiOndoZXJlKC5cIi5jb25jYXQocmFuZG9tU2VsZWN0b3JLZXksIFwiKSB7IGNvbnRlbnQ6IFxcXCJcIikuY29uY2F0KGNoZWNrQ29udGVudCwgXCJcXFwiIWltcG9ydGFudDsgfVwiKSwgZnVuY3Rpb24gKGVsZSkge1xuICAgICAgZWxlLmNsYXNzTmFtZSA9IHJhbmRvbVNlbGVjdG9yS2V5O1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBjYW5XaGVyZTtcbn1cbnZhciBjYW5Mb2dpYyA9IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0TG9naWNQcm9wcygpIHtcbiAgaWYgKGNhbkxvZ2ljID09PSB1bmRlZmluZWQpIHtcbiAgICBjYW5Mb2dpYyA9IHN1cHBvcnRTZWxlY3RvcihcIi5cIi5jb25jYXQocmFuZG9tU2VsZWN0b3JLZXksIFwiIHsgaW5zZXQtYmxvY2s6IDkzcHggIWltcG9ydGFudDsgfVwiKSwgZnVuY3Rpb24gKGVsZSkge1xuICAgICAgZWxlLmNsYXNzTmFtZSA9IHJhbmRvbVNlbGVjdG9yS2V5O1xuICAgIH0sIGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBnZXRDb21wdXRlZFN0eWxlKGVsZSkuYm90dG9tID09PSAnOTNweCc7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGNhbkxvZ2ljO1xufVxuZXhwb3J0IHZhciBpc0NsaWVudFNpZGUgPSBjYW5Vc2VEb20oKTtcbmV4cG9ydCBmdW5jdGlvbiB1bml0KG51bSkge1xuICBpZiAodHlwZW9mIG51bSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gXCJcIi5jb25jYXQobnVtLCBcInB4XCIpO1xuICB9XG4gIHJldHVybiBudW07XG59XG5leHBvcnQgZnVuY3Rpb24gdG9TdHlsZVN0cihzdHlsZSwgdG9rZW5LZXksIHN0eWxlSWQpIHtcbiAgdmFyIF9vYmplY3RTcHJlYWQyO1xuICB2YXIgY3VzdG9taXplQXR0cnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHt9O1xuICB2YXIgcGxhaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IGZhbHNlO1xuICBpZiAocGxhaW4pIHtcbiAgICByZXR1cm4gc3R5bGU7XG4gIH1cbiAgdmFyIGF0dHJzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBjdXN0b21pemVBdHRycyksIHt9LCAoX29iamVjdFNwcmVhZDIgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9vYmplY3RTcHJlYWQyLCBBVFRSX1RPS0VOLCB0b2tlbktleSksIF9kZWZpbmVQcm9wZXJ0eShfb2JqZWN0U3ByZWFkMiwgQVRUUl9NQVJLLCBzdHlsZUlkKSwgX29iamVjdFNwcmVhZDIpKTtcbiAgdmFyIGF0dHJTdHIgPSBPYmplY3Qua2V5cyhhdHRycykubWFwKGZ1bmN0aW9uIChhdHRyKSB7XG4gICAgdmFyIHZhbCA9IGF0dHJzW2F0dHJdO1xuICAgIHJldHVybiB2YWwgPyBcIlwiLmNvbmNhdChhdHRyLCBcIj1cXFwiXCIpLmNvbmNhdCh2YWwsIFwiXFxcIlwiKSA6IG51bGw7XG4gIH0pLmZpbHRlcihmdW5jdGlvbiAodikge1xuICAgIHJldHVybiB2O1xuICB9KS5qb2luKCcgJyk7XG4gIHJldHVybiBcIjxzdHlsZSBcIi5jb25jYXQoYXR0clN0ciwgXCI+XCIpLmNvbmNhdChzdHlsZSwgXCI8L3N0eWxlPlwiKTtcbn0iLCAiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5leHBvcnQgdmFyIHRva2VuMkNTU1ZhciA9IGZ1bmN0aW9uIHRva2VuMkNTU1Zhcih0b2tlbikge1xuICB2YXIgcHJlZml4ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAnJztcbiAgcmV0dXJuIFwiLS1cIi5jb25jYXQocHJlZml4ID8gXCJcIi5jb25jYXQocHJlZml4LCBcIi1cIikgOiAnJykuY29uY2F0KHRva2VuKS5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCAnJDEtJDInKS5yZXBsYWNlKC8oW0EtWl0rKShbQS1aXVthLXowLTldKykvZywgJyQxLSQyJykucmVwbGFjZSgvKFthLXpdKShbQS1aMC05XSkvZywgJyQxLSQyJykudG9Mb3dlckNhc2UoKTtcbn07XG5leHBvcnQgdmFyIHNlcmlhbGl6ZUNTU1ZhciA9IGZ1bmN0aW9uIHNlcmlhbGl6ZUNTU1Zhcihjc3NWYXJzLCBoYXNoSWQsIG9wdGlvbnMpIHtcbiAgaWYgKCFPYmplY3Qua2V5cyhjc3NWYXJzKS5sZW5ndGgpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgcmV0dXJuIFwiLlwiLmNvbmNhdChoYXNoSWQpLmNvbmNhdChvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHZvaWQgMCAmJiBvcHRpb25zLnNjb3BlID8gXCIuXCIuY29uY2F0KG9wdGlvbnMuc2NvcGUpIDogJycsIFwie1wiKS5jb25jYXQoT2JqZWN0LmVudHJpZXMoY3NzVmFycykubWFwKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgdmFyIF9yZWYyID0gX3NsaWNlZFRvQXJyYXkoX3JlZiwgMiksXG4gICAgICBrZXkgPSBfcmVmMlswXSxcbiAgICAgIHZhbHVlID0gX3JlZjJbMV07XG4gICAgcmV0dXJuIFwiXCIuY29uY2F0KGtleSwgXCI6XCIpLmNvbmNhdCh2YWx1ZSwgXCI7XCIpO1xuICB9KS5qb2luKCcnKSwgXCJ9XCIpO1xufTtcbmV4cG9ydCB2YXIgdHJhbnNmb3JtVG9rZW4gPSBmdW5jdGlvbiB0cmFuc2Zvcm1Ub2tlbih0b2tlbiwgdGhlbWVLZXksIGNvbmZpZykge1xuICB2YXIgY3NzVmFycyA9IHt9O1xuICB2YXIgcmVzdWx0ID0ge307XG4gIE9iamVjdC5lbnRyaWVzKHRva2VuKS5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmMykge1xuICAgIHZhciBfY29uZmlnJHByZXNlcnZlLCBfY29uZmlnJGlnbm9yZTtcbiAgICB2YXIgX3JlZjQgPSBfc2xpY2VkVG9BcnJheShfcmVmMywgMiksXG4gICAgICBrZXkgPSBfcmVmNFswXSxcbiAgICAgIHZhbHVlID0gX3JlZjRbMV07XG4gICAgaWYgKGNvbmZpZyAhPT0gbnVsbCAmJiBjb25maWcgIT09IHZvaWQgMCAmJiAoX2NvbmZpZyRwcmVzZXJ2ZSA9IGNvbmZpZy5wcmVzZXJ2ZSkgIT09IG51bGwgJiYgX2NvbmZpZyRwcmVzZXJ2ZSAhPT0gdm9pZCAwICYmIF9jb25maWckcHJlc2VydmVba2V5XSkge1xuICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICB9IGVsc2UgaWYgKCh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpICYmICEoY29uZmlnICE9PSBudWxsICYmIGNvbmZpZyAhPT0gdm9pZCAwICYmIChfY29uZmlnJGlnbm9yZSA9IGNvbmZpZy5pZ25vcmUpICE9PSBudWxsICYmIF9jb25maWckaWdub3JlICE9PSB2b2lkIDAgJiYgX2NvbmZpZyRpZ25vcmVba2V5XSkpIHtcbiAgICAgIHZhciBfY29uZmlnJHVuaXRsZXNzO1xuICAgICAgdmFyIGNzc1ZhciA9IHRva2VuMkNTU1ZhcihrZXksIGNvbmZpZyA9PT0gbnVsbCB8fCBjb25maWcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmZpZy5wcmVmaXgpO1xuICAgICAgY3NzVmFyc1tjc3NWYXJdID0gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiAhKGNvbmZpZyAhPT0gbnVsbCAmJiBjb25maWcgIT09IHZvaWQgMCAmJiAoX2NvbmZpZyR1bml0bGVzcyA9IGNvbmZpZy51bml0bGVzcykgIT09IG51bGwgJiYgX2NvbmZpZyR1bml0bGVzcyAhPT0gdm9pZCAwICYmIF9jb25maWckdW5pdGxlc3Nba2V5XSkgPyBcIlwiLmNvbmNhdCh2YWx1ZSwgXCJweFwiKSA6IFN0cmluZyh2YWx1ZSk7XG4gICAgICByZXN1bHRba2V5XSA9IFwidmFyKFwiLmNvbmNhdChjc3NWYXIsIFwiKVwiKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gW3Jlc3VsdCwgc2VyaWFsaXplQ1NTVmFyKGNzc1ZhcnMsIHRoZW1lS2V5LCB7XG4gICAgc2NvcGU6IGNvbmZpZyA9PT0gbnVsbCB8fCBjb25maWcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmZpZy5zY29wZVxuICB9KV07XG59OyIsICJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBwYXRoS2V5IH0gZnJvbSBcIi4uL0NhY2hlXCI7XG5pbXBvcnQgU3R5bGVDb250ZXh0IGZyb20gXCIuLi9TdHlsZUNvbnRleHRcIjtcbmltcG9ydCB1c2VDb21wYXRpYmxlSW5zZXJ0aW9uRWZmZWN0IGZyb20gXCIuL3VzZUNvbXBhdGlibGVJbnNlcnRpb25FZmZlY3RcIjtcbmltcG9ydCB1c2VFZmZlY3RDbGVhbnVwUmVnaXN0ZXIgZnJvbSBcIi4vdXNlRWZmZWN0Q2xlYW51cFJlZ2lzdGVyXCI7XG5pbXBvcnQgdXNlSE1SIGZyb20gXCIuL3VzZUhNUlwiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlR2xvYmFsQ2FjaGUocHJlZml4LCBrZXlQYXRoLCBjYWNoZUZuLCBvbkNhY2hlUmVtb3ZlLFxuLy8gQWRkIGFkZGl0aW9uYWwgZWZmZWN0IHRyaWdnZXIgYnkgYHVzZUluc2VydGlvbkVmZmVjdGBcbm9uQ2FjaGVFZmZlY3QpIHtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChTdHlsZUNvbnRleHQpLFxuICAgIGdsb2JhbENhY2hlID0gX1JlYWN0JHVzZUNvbnRleHQuY2FjaGU7XG4gIHZhciBmdWxsUGF0aCA9IFtwcmVmaXhdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoa2V5UGF0aCkpO1xuICB2YXIgZnVsbFBhdGhTdHIgPSBwYXRoS2V5KGZ1bGxQYXRoKTtcbiAgdmFyIHJlZ2lzdGVyID0gdXNlRWZmZWN0Q2xlYW51cFJlZ2lzdGVyKFtmdWxsUGF0aFN0cl0pO1xuICB2YXIgSE1SVXBkYXRlID0gdXNlSE1SKCk7XG4gIHZhciBidWlsZENhY2hlID0gZnVuY3Rpb24gYnVpbGRDYWNoZSh1cGRhdGVyKSB7XG4gICAgZ2xvYmFsQ2FjaGUub3BVcGRhdGUoZnVsbFBhdGhTdHIsIGZ1bmN0aW9uIChwcmV2Q2FjaGUpIHtcbiAgICAgIHZhciBfcmVmID0gcHJldkNhY2hlIHx8IFt1bmRlZmluZWQsIHVuZGVmaW5lZF0sXG4gICAgICAgIF9yZWYyID0gX3NsaWNlZFRvQXJyYXkoX3JlZiwgMiksXG4gICAgICAgIF9yZWYyJCA9IF9yZWYyWzBdLFxuICAgICAgICB0aW1lcyA9IF9yZWYyJCA9PT0gdm9pZCAwID8gMCA6IF9yZWYyJCxcbiAgICAgICAgY2FjaGUgPSBfcmVmMlsxXTtcblxuICAgICAgLy8gSE1SIHNob3VsZCBhbHdheXMgaWdub3JlIGNhY2hlIHNpbmNlIGRldmVsb3BlciBtYXkgY2hhbmdlIGl0XG4gICAgICB2YXIgdG1wQ2FjaGUgPSBjYWNoZTtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGNhY2hlICYmIEhNUlVwZGF0ZSkge1xuICAgICAgICBvbkNhY2hlUmVtb3ZlID09PSBudWxsIHx8IG9uQ2FjaGVSZW1vdmUgPT09IHZvaWQgMCB8fCBvbkNhY2hlUmVtb3ZlKHRtcENhY2hlLCBITVJVcGRhdGUpO1xuICAgICAgICB0bXBDYWNoZSA9IG51bGw7XG4gICAgICB9XG4gICAgICB2YXIgbWVyZ2VkQ2FjaGUgPSB0bXBDYWNoZSB8fCBjYWNoZUZuKCk7XG4gICAgICB2YXIgZGF0YSA9IFt0aW1lcywgbWVyZ2VkQ2FjaGVdO1xuXG4gICAgICAvLyBDYWxsIHVwZGF0ZXIgaWYgbmVlZCBhZGRpdGlvbmFsIGxvZ2ljXG4gICAgICByZXR1cm4gdXBkYXRlciA/IHVwZGF0ZXIoZGF0YSkgOiBkYXRhO1xuICAgIH0pO1xuICB9O1xuXG4gIC8vIENyZWF0ZSBjYWNoZVxuICBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBidWlsZENhY2hlKCk7XG4gIH0sIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwcyAqL1xuICBbZnVsbFBhdGhTdHJdXG4gIC8qIGVzbGludC1lbmFibGUgKi8pO1xuXG4gIHZhciBjYWNoZUVudGl0eSA9IGdsb2JhbENhY2hlLm9wR2V0KGZ1bGxQYXRoU3RyKTtcblxuICAvLyBITVIgY2xlYW4gdGhlIGNhY2hlIGJ1dCBub3QgdHJpZ2dlciBgdXNlTWVtb2AgYWdhaW5cbiAgLy8gTGV0J3MgZmFsbGJhY2sgb2YgdGhpc1xuICAvLyByZWYgaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vY3NzaW5qcy9pc3N1ZXMvMTI3XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICFjYWNoZUVudGl0eSkge1xuICAgIGJ1aWxkQ2FjaGUoKTtcbiAgICBjYWNoZUVudGl0eSA9IGdsb2JhbENhY2hlLm9wR2V0KGZ1bGxQYXRoU3RyKTtcbiAgfVxuICB2YXIgY2FjaGVDb250ZW50ID0gY2FjaGVFbnRpdHlbMV07XG5cbiAgLy8gUmVtb3ZlIGlmIG5vIG5lZWQgYW55bW9yZVxuICB1c2VDb21wYXRpYmxlSW5zZXJ0aW9uRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBvbkNhY2hlRWZmZWN0ID09PSBudWxsIHx8IG9uQ2FjaGVFZmZlY3QgPT09IHZvaWQgMCB8fCBvbkNhY2hlRWZmZWN0KGNhY2hlQ29udGVudCk7XG4gIH0sIGZ1bmN0aW9uIChwb2x5ZmlsbCkge1xuICAgIC8vIEl0J3MgYmFkIHRvIGNhbGwgYnVpbGQgYWdhaW4gaW4gZWZmZWN0LlxuICAgIC8vIEJ1dCB3ZSBoYXZlIHRvIGRvIHRoaXMgc2luY2UgU3RyaWN0TW9kZSB3aWxsIGNhbGwgZWZmZWN0IHR3aWNlXG4gICAgLy8gd2hpY2ggd2lsbCBjbGVhciBjYWNoZSBvbiB0aGUgZmlyc3QgdGltZS5cbiAgICBidWlsZENhY2hlKGZ1bmN0aW9uIChfcmVmMykge1xuICAgICAgdmFyIF9yZWY0ID0gX3NsaWNlZFRvQXJyYXkoX3JlZjMsIDIpLFxuICAgICAgICB0aW1lcyA9IF9yZWY0WzBdLFxuICAgICAgICBjYWNoZSA9IF9yZWY0WzFdO1xuICAgICAgaWYgKHBvbHlmaWxsICYmIHRpbWVzID09PSAwKSB7XG4gICAgICAgIG9uQ2FjaGVFZmZlY3QgPT09IG51bGwgfHwgb25DYWNoZUVmZmVjdCA9PT0gdm9pZCAwIHx8IG9uQ2FjaGVFZmZlY3QoY2FjaGVDb250ZW50KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbdGltZXMgKyAxLCBjYWNoZV07XG4gICAgfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGdsb2JhbENhY2hlLm9wVXBkYXRlKGZ1bGxQYXRoU3RyLCBmdW5jdGlvbiAocHJldkNhY2hlKSB7XG4gICAgICAgIHZhciBfcmVmNSA9IHByZXZDYWNoZSB8fCBbXSxcbiAgICAgICAgICBfcmVmNiA9IF9zbGljZWRUb0FycmF5KF9yZWY1LCAyKSxcbiAgICAgICAgICBfcmVmNiQgPSBfcmVmNlswXSxcbiAgICAgICAgICB0aW1lcyA9IF9yZWY2JCA9PT0gdm9pZCAwID8gMCA6IF9yZWY2JCxcbiAgICAgICAgICBjYWNoZSA9IF9yZWY2WzFdO1xuICAgICAgICB2YXIgbmV4dENvdW50ID0gdGltZXMgLSAxO1xuICAgICAgICBpZiAobmV4dENvdW50ID09PSAwKSB7XG4gICAgICAgICAgLy8gQWx3YXlzIHJlbW92ZSBzdHlsZXMgaW4gdXNlRWZmZWN0IGNhbGxiYWNrXG4gICAgICAgICAgcmVnaXN0ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy8gV2l0aCBwb2x5ZmlsbCwgcmVnaXN0ZXJlZCBjYWxsYmFjayB3aWxsIGFsd2F5cyBiZSBjYWxsZWQgc3luY2hyb25vdXNseVxuICAgICAgICAgICAgLy8gQnV0IHdpdGhvdXQgcG9seWZpbGwsIGl0IHdpbGwgYmUgY2FsbGVkIGluIGVmZmVjdCBjbGVhbiB1cCxcbiAgICAgICAgICAgIC8vIEFuZCBieSB0aGF0IHRpbWUgdGhpcyBjYWNoZSBpcyBjbGVhbmVkIHVwLlxuICAgICAgICAgICAgaWYgKHBvbHlmaWxsIHx8ICFnbG9iYWxDYWNoZS5vcEdldChmdWxsUGF0aFN0cikpIHtcbiAgICAgICAgICAgICAgb25DYWNoZVJlbW92ZSA9PT0gbnVsbCB8fCBvbkNhY2hlUmVtb3ZlID09PSB2b2lkIDAgfHwgb25DYWNoZVJlbW92ZShjYWNoZSwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbdGltZXMgLSAxLCBjYWNoZV07XG4gICAgICB9KTtcbiAgICB9O1xuICB9LCBbZnVsbFBhdGhTdHJdKTtcbiAgcmV0dXJuIGNhY2hlQ29udGVudDtcbn0iLCAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNhblVzZURvbSBmcm9tIFwiLi4vRG9tL2NhblVzZURvbVwiO1xuXG4vKipcbiAqIFdyYXAgYFJlYWN0LnVzZUxheW91dEVmZmVjdGAgd2hpY2ggd2lsbCBub3QgdGhyb3cgd2FybmluZyBtZXNzYWdlIGluIHRlc3QgZW52XG4gKi9cbnZhciB1c2VJbnRlcm5hbExheW91dEVmZmVjdCA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAndGVzdCcgJiYgY2FuVXNlRG9tKCkgPyBSZWFjdC51c2VMYXlvdXRFZmZlY3QgOiBSZWFjdC51c2VFZmZlY3Q7XG52YXIgdXNlTGF5b3V0RWZmZWN0ID0gZnVuY3Rpb24gdXNlTGF5b3V0RWZmZWN0KGNhbGxiYWNrLCBkZXBzKSB7XG4gIHZhciBmaXJzdE1vdW50UmVmID0gUmVhY3QudXNlUmVmKHRydWUpO1xuICB1c2VJbnRlcm5hbExheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKGZpcnN0TW91bnRSZWYuY3VycmVudCk7XG4gIH0sIGRlcHMpO1xuXG4gIC8vIFdlIHRlbGwgcmVhY3QgdGhhdCBmaXJzdCBtb3VudCBoYXMgcGFzc2VkXG4gIHVzZUludGVybmFsTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBmaXJzdE1vdW50UmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgZmlyc3RNb3VudFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICB9O1xuICB9LCBbXSk7XG59O1xuZXhwb3J0IHZhciB1c2VMYXlvdXRVcGRhdGVFZmZlY3QgPSBmdW5jdGlvbiB1c2VMYXlvdXRVcGRhdGVFZmZlY3QoY2FsbGJhY2ssIGRlcHMpIHtcbiAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uIChmaXJzdE1vdW50KSB7XG4gICAgaWYgKCFmaXJzdE1vdW50KSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG4gIH0sIGRlcHMpO1xufTtcbmV4cG9ydCBkZWZhdWx0IHVzZUxheW91dEVmZmVjdDsiLCAiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbi8vIGltcG9ydCBjYW5Vc2VEb20gZnJvbSAncmMtdXRpbC9saWIvRG9tL2NhblVzZURvbSc7XG5pbXBvcnQgdXNlTGF5b3V0RWZmZWN0IGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZUxheW91dEVmZmVjdFwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG4vLyBXZSBuZWVkIGZ1bGx5IGNsb25lIFJlYWN0IGZ1bmN0aW9uIGhlcmVcbi8vIHRvIGF2b2lkIHdlYnBhY2sgd2FybmluZyBSZWFjdCAxNyBkbyBub3QgZXhwb3J0IGB1c2VJZGBcbnZhciBmdWxsQ2xvbmUgPSBfb2JqZWN0U3ByZWFkKHt9LCBSZWFjdCk7XG52YXIgdXNlSW5zZXJ0aW9uRWZmZWN0ID0gZnVsbENsb25lLnVzZUluc2VydGlvbkVmZmVjdDtcbi8qKlxuICogUG9seWZpbGwgYHVzZUluc2VydGlvbkVmZmVjdGAgZm9yIFJlYWN0IDwgMThcbiAqIEBwYXJhbSByZW5kZXJFZmZlY3Qgd2lsbCBiZSBleGVjdXRlZCBpbiBgdXNlTWVtb2AsIGFuZCBkbyBub3QgaGF2ZSBjYWxsYmFja1xuICogQHBhcmFtIGVmZmVjdCB3aWxsIGJlIGV4ZWN1dGVkIGluIGB1c2VMYXlvdXRFZmZlY3RgXG4gKiBAcGFyYW0gZGVwc1xuICovXG52YXIgdXNlSW5zZXJ0aW9uRWZmZWN0UG9seWZpbGwgPSBmdW5jdGlvbiB1c2VJbnNlcnRpb25FZmZlY3RQb2x5ZmlsbChyZW5kZXJFZmZlY3QsIGVmZmVjdCwgZGVwcykge1xuICBSZWFjdC51c2VNZW1vKHJlbmRlckVmZmVjdCwgZGVwcyk7XG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGVmZmVjdCh0cnVlKTtcbiAgfSwgZGVwcyk7XG59O1xuXG4vKipcbiAqIENvbXBhdGlibGUgYHVzZUluc2VydGlvbkVmZmVjdGBcbiAqIHdpbGwgdXNlIGB1c2VJbnNlcnRpb25FZmZlY3RgIGlmIFJlYWN0IHZlcnNpb24gPj0gMTgsXG4gKiBvdGhlcndpc2UgdXNlIGB1c2VJbnNlcnRpb25FZmZlY3RQb2x5ZmlsbGAuXG4gKi9cbnZhciB1c2VDb21wYXRpYmxlSW5zZXJ0aW9uRWZmZWN0ID0gdXNlSW5zZXJ0aW9uRWZmZWN0ID8gZnVuY3Rpb24gKHJlbmRlckVmZmVjdCwgZWZmZWN0LCBkZXBzKSB7XG4gIHJldHVybiB1c2VJbnNlcnRpb25FZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJlbmRlckVmZmVjdCgpO1xuICAgIHJldHVybiBlZmZlY3QoKTtcbiAgfSwgZGVwcyk7XG59IDogdXNlSW5zZXJ0aW9uRWZmZWN0UG9seWZpbGw7XG5leHBvcnQgZGVmYXVsdCB1c2VDb21wYXRpYmxlSW5zZXJ0aW9uRWZmZWN0OyIsICJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IHsgd2FybmluZyB9IGZyb20gXCJyYy11dGlsL2VzL3dhcm5pbmdcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbnZhciBmdWxsQ2xvbmUgPSBfb2JqZWN0U3ByZWFkKHt9LCBSZWFjdCk7XG52YXIgdXNlSW5zZXJ0aW9uRWZmZWN0ID0gZnVsbENsb25lLnVzZUluc2VydGlvbkVmZmVjdDtcblxuLy8gRE8gTk9UIHJlZ2lzdGVyIGZ1bmN0aW9ucyBpbiB1c2VFZmZlY3QgY2xlYW51cCBmdW5jdGlvbiwgb3IgZnVuY3Rpb25zIHRoYXQgcmVnaXN0ZXJlZCB3aWxsIG5ldmVyIGJlIGNhbGxlZC5cbnZhciB1c2VDbGVhbnVwUmVnaXN0ZXIgPSBmdW5jdGlvbiB1c2VDbGVhbnVwUmVnaXN0ZXIoZGVwcykge1xuICB2YXIgZWZmZWN0Q2xlYW51cHMgPSBbXTtcbiAgdmFyIGNsZWFudXBGbGFnID0gZmFsc2U7XG4gIGZ1bmN0aW9uIHJlZ2lzdGVyKGZuKSB7XG4gICAgaWYgKGNsZWFudXBGbGFnKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICB3YXJuaW5nKGZhbHNlLCAnW0FudCBEZXNpZ24gQ1NTLWluLUpTXSBZb3UgYXJlIHJlZ2lzdGVyaW5nIGEgY2xlYW51cCBmdW5jdGlvbiBhZnRlciB1bm1vdW50LCB3aGljaCB3aWxsIG5vdCBoYXZlIGFueSBlZmZlY3QuJyk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVmZmVjdENsZWFudXBzLnB1c2goZm4pO1xuICB9XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgLy8gQ29tcGF0aWJsZSB3aXRoIHN0cmljdCBtb2RlXG4gICAgY2xlYW51cEZsYWcgPSBmYWxzZTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgY2xlYW51cEZsYWcgPSB0cnVlO1xuICAgICAgaWYgKGVmZmVjdENsZWFudXBzLmxlbmd0aCkge1xuICAgICAgICBlZmZlY3RDbGVhbnVwcy5mb3JFYWNoKGZ1bmN0aW9uIChmbikge1xuICAgICAgICAgIHJldHVybiBmbigpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuICB9LCBkZXBzKTtcbiAgcmV0dXJuIHJlZ2lzdGVyO1xufTtcbnZhciB1c2VSdW4gPSBmdW5jdGlvbiB1c2VSdW4oKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoZm4pIHtcbiAgICBmbigpO1xuICB9O1xufTtcblxuLy8gT25seSBlbmFibGUgcmVnaXN0ZXIgaW4gUmVhY3QgMThcbnZhciB1c2VFZmZlY3RDbGVhbnVwUmVnaXN0ZXIgPSB0eXBlb2YgdXNlSW5zZXJ0aW9uRWZmZWN0ICE9PSAndW5kZWZpbmVkJyA/IHVzZUNsZWFudXBSZWdpc3RlciA6IHVzZVJ1bjtcbmV4cG9ydCBkZWZhdWx0IHVzZUVmZmVjdENsZWFudXBSZWdpc3RlcjsiLCAiZnVuY3Rpb24gdXNlUHJvZEhNUigpIHtcbiAgcmV0dXJuIGZhbHNlO1xufVxudmFyIHdlYnBhY2tITVIgPSBmYWxzZTtcbmZ1bmN0aW9uIHVzZURldkhNUigpIHtcbiAgcmV0dXJuIHdlYnBhY2tITVI7XG59XG5leHBvcnQgZGVmYXVsdCBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nID8gdXNlUHJvZEhNUiA6IHVzZURldkhNUjtcblxuLy8gV2VicGFjayBgbW9kdWxlLmhvdC5hY2NlcHRgIGRvIG5vdCBzdXBwb3J0IGFueSBkZXBzIHVwZGF0ZSB0cmlnZ2VyXG4vLyBXZSBoYXZlIHRvIGhhY2sgaGFuZGxlciB0byBmb3JjZSBtYXJrIGFzIEhSTVxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlICYmIG1vZHVsZS5ob3QgJiYgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgLy8gVXNlIGBnbG9iYWxUaGlzYCBmaXJzdCwgYW5kIGB3aW5kb3dgIGZvciBvbGRlciBicm93c2Vyc1xuICAvLyBjb25zdCB3aW4gPSBnbG9iYWxUaGlzIGFzIGFueTtcbiAgdmFyIHdpbiA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IG51bGw7XG4gIGlmICh3aW4gJiYgdHlwZW9mIHdpbi53ZWJwYWNrSG90VXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIG9yaWdpbldlYnBhY2tIb3RVcGRhdGUgPSB3aW4ud2VicGFja0hvdFVwZGF0ZTtcbiAgICB3aW4ud2VicGFja0hvdFVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHdlYnBhY2tITVIgPSB0cnVlO1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdlYnBhY2tITVIgPSBmYWxzZTtcbiAgICAgIH0sIDApO1xuICAgICAgcmV0dXJuIG9yaWdpbldlYnBhY2tIb3RVcGRhdGUuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH1cbn0iLCAiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IHsgcmVtb3ZlQ1NTLCB1cGRhdGVDU1MgfSBmcm9tIFwicmMtdXRpbC9lcy9Eb20vZHluYW1pY0NTU1wiO1xuaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBTdHlsZUNvbnRleHQsIHsgQVRUUl9NQVJLLCBBVFRSX1RPS0VOLCBDU1NfSU5fSlNfSU5TVEFOQ0UgfSBmcm9tIFwiLi4vU3R5bGVDb250ZXh0XCI7XG5pbXBvcnQgeyBpc0NsaWVudFNpZGUsIHRvU3R5bGVTdHIgfSBmcm9tIFwiLi4vdXRpbFwiO1xuaW1wb3J0IHsgdHJhbnNmb3JtVG9rZW4gfSBmcm9tIFwiLi4vdXRpbC9jc3MtdmFyaWFibGVzXCI7XG5pbXBvcnQgdXNlR2xvYmFsQ2FjaGUgZnJvbSBcIi4vdXNlR2xvYmFsQ2FjaGVcIjtcbmltcG9ydCB7IHVuaXF1ZUhhc2ggfSBmcm9tIFwiLi91c2VTdHlsZVJlZ2lzdGVyXCI7XG5leHBvcnQgdmFyIENTU19WQVJfUFJFRklYID0gJ2Nzc1Zhcic7XG52YXIgdXNlQ1NTVmFyUmVnaXN0ZXIgPSBmdW5jdGlvbiB1c2VDU1NWYXJSZWdpc3Rlcihjb25maWcsIGZuKSB7XG4gIHZhciBrZXkgPSBjb25maWcua2V5LFxuICAgIHByZWZpeCA9IGNvbmZpZy5wcmVmaXgsXG4gICAgdW5pdGxlc3MgPSBjb25maWcudW5pdGxlc3MsXG4gICAgaWdub3JlID0gY29uZmlnLmlnbm9yZSxcbiAgICB0b2tlbiA9IGNvbmZpZy50b2tlbixcbiAgICBfY29uZmlnJHNjb3BlID0gY29uZmlnLnNjb3BlLFxuICAgIHNjb3BlID0gX2NvbmZpZyRzY29wZSA9PT0gdm9pZCAwID8gJycgOiBfY29uZmlnJHNjb3BlO1xuICB2YXIgX3VzZUNvbnRleHQgPSB1c2VDb250ZXh0KFN0eWxlQ29udGV4dCksXG4gICAgaW5zdGFuY2VJZCA9IF91c2VDb250ZXh0LmNhY2hlLmluc3RhbmNlSWQsXG4gICAgY29udGFpbmVyID0gX3VzZUNvbnRleHQuY29udGFpbmVyO1xuICB2YXIgdG9rZW5LZXkgPSB0b2tlbi5fdG9rZW5LZXk7XG4gIHZhciBzdHlsZVBhdGggPSBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGNvbmZpZy5wYXRoKSwgW2tleSwgc2NvcGUsIHRva2VuS2V5XSk7XG4gIHZhciBjYWNoZSA9IHVzZUdsb2JhbENhY2hlKENTU19WQVJfUFJFRklYLCBzdHlsZVBhdGgsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgb3JpZ2luVG9rZW4gPSBmbigpO1xuICAgIHZhciBfdHJhbnNmb3JtVG9rZW4gPSB0cmFuc2Zvcm1Ub2tlbihvcmlnaW5Ub2tlbiwga2V5LCB7XG4gICAgICAgIHByZWZpeDogcHJlZml4LFxuICAgICAgICB1bml0bGVzczogdW5pdGxlc3MsXG4gICAgICAgIGlnbm9yZTogaWdub3JlLFxuICAgICAgICBzY29wZTogc2NvcGVcbiAgICAgIH0pLFxuICAgICAgX3RyYW5zZm9ybVRva2VuMiA9IF9zbGljZWRUb0FycmF5KF90cmFuc2Zvcm1Ub2tlbiwgMiksXG4gICAgICBtZXJnZWRUb2tlbiA9IF90cmFuc2Zvcm1Ub2tlbjJbMF0sXG4gICAgICBjc3NWYXJzU3RyID0gX3RyYW5zZm9ybVRva2VuMlsxXTtcbiAgICB2YXIgc3R5bGVJZCA9IHVuaXF1ZUhhc2goc3R5bGVQYXRoLCBjc3NWYXJzU3RyKTtcbiAgICByZXR1cm4gW21lcmdlZFRva2VuLCBjc3NWYXJzU3RyLCBzdHlsZUlkLCBrZXldO1xuICB9LCBmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBfcmVmMiA9IF9zbGljZWRUb0FycmF5KF9yZWYsIDMpLFxuICAgICAgc3R5bGVJZCA9IF9yZWYyWzJdO1xuICAgIGlmIChpc0NsaWVudFNpZGUpIHtcbiAgICAgIHJlbW92ZUNTUyhzdHlsZUlkLCB7XG4gICAgICAgIG1hcms6IEFUVFJfTUFSS1xuICAgICAgfSk7XG4gICAgfVxuICB9LCBmdW5jdGlvbiAoX3JlZjMpIHtcbiAgICB2YXIgX3JlZjQgPSBfc2xpY2VkVG9BcnJheShfcmVmMywgMyksXG4gICAgICBjc3NWYXJzU3RyID0gX3JlZjRbMV0sXG4gICAgICBzdHlsZUlkID0gX3JlZjRbMl07XG4gICAgaWYgKCFjc3NWYXJzU3RyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBzdHlsZSA9IHVwZGF0ZUNTUyhjc3NWYXJzU3RyLCBzdHlsZUlkLCB7XG4gICAgICBtYXJrOiBBVFRSX01BUkssXG4gICAgICBwcmVwZW5kOiAncXVldWUnLFxuICAgICAgYXR0YWNoVG86IGNvbnRhaW5lcixcbiAgICAgIHByaW9yaXR5OiAtOTk5XG4gICAgfSk7XG4gICAgc3R5bGVbQ1NTX0lOX0pTX0lOU1RBTkNFXSA9IGluc3RhbmNlSWQ7XG5cbiAgICAvLyBVc2VkIGZvciBgdXNlQ2FjaGVUb2tlbmAgdG8gcmVtb3ZlIG9uIGJhdGNoIHdoZW4gdG9rZW4gcmVtb3ZlZFxuICAgIHN0eWxlLnNldEF0dHJpYnV0ZShBVFRSX1RPS0VOLCBrZXkpO1xuICB9KTtcbiAgcmV0dXJuIGNhY2hlO1xufTtcbmV4cG9ydCB2YXIgZXh0cmFjdCA9IGZ1bmN0aW9uIGV4dHJhY3QoY2FjaGUsIGVmZmVjdFN0eWxlcywgb3B0aW9ucykge1xuICB2YXIgX2NhY2hlID0gX3NsaWNlZFRvQXJyYXkoY2FjaGUsIDQpLFxuICAgIHN0eWxlU3RyID0gX2NhY2hlWzFdLFxuICAgIHN0eWxlSWQgPSBfY2FjaGVbMl0sXG4gICAgY3NzVmFyS2V5ID0gX2NhY2hlWzNdO1xuICB2YXIgX3JlZjUgPSBvcHRpb25zIHx8IHt9LFxuICAgIHBsYWluID0gX3JlZjUucGxhaW47XG4gIGlmICghc3R5bGVTdHIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2YXIgb3JkZXIgPSAtOTk5O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT0gU3R5bGUgPT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBVc2VkIGZvciByYy11dGlsXG4gIHZhciBzaGFyZWRBdHRycyA9IHtcbiAgICAnZGF0YS1yYy1vcmRlcic6ICdwcmVwZW5kUXVldWUnLFxuICAgICdkYXRhLXJjLXByaW9yaXR5JzogXCJcIi5jb25jYXQob3JkZXIpXG4gIH07XG4gIHZhciBzdHlsZVRleHQgPSB0b1N0eWxlU3RyKHN0eWxlU3RyLCBjc3NWYXJLZXksIHN0eWxlSWQsIHNoYXJlZEF0dHJzLCBwbGFpbik7XG4gIHJldHVybiBbb3JkZXIsIHN0eWxlSWQsIHN0eWxlVGV4dF07XG59O1xuZXhwb3J0IGRlZmF1bHQgdXNlQ1NTVmFyUmVnaXN0ZXI7IiwgImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgaGFzaCBmcm9tICdAZW1vdGlvbi9oYXNoJztcbmltcG9ydCB7IHJlbW92ZUNTUywgdXBkYXRlQ1NTIH0gZnJvbSBcInJjLXV0aWwvZXMvRG9tL2R5bmFtaWNDU1NcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB1bml0bGVzcyBmcm9tICdAZW1vdGlvbi91bml0bGVzcyc7XG5pbXBvcnQgeyBjb21waWxlLCBzZXJpYWxpemUsIHN0cmluZ2lmeSB9IGZyb20gJ3N0eWxpcyc7XG5pbXBvcnQgeyBjb250ZW50UXVvdGVzTGludGVyLCBoYXNoZWRBbmltYXRpb25MaW50ZXIgfSBmcm9tIFwiLi4vbGludGVyc1wiO1xuaW1wb3J0IFN0eWxlQ29udGV4dCwgeyBBVFRSX0NBQ0hFX1BBVEgsIEFUVFJfTUFSSywgQVRUUl9UT0tFTiwgQ1NTX0lOX0pTX0lOU1RBTkNFIH0gZnJvbSBcIi4uL1N0eWxlQ29udGV4dFwiO1xuaW1wb3J0IHsgaXNDbGllbnRTaWRlLCB0b1N0eWxlU3RyIH0gZnJvbSBcIi4uL3V0aWxcIjtcbmltcG9ydCB7IENTU19GSUxFX1NUWUxFLCBleGlzdFBhdGgsIGdldFN0eWxlQW5kSGFzaCB9IGZyb20gXCIuLi91dGlsL2NhY2hlTWFwVXRpbFwiO1xuaW1wb3J0IHVzZUdsb2JhbENhY2hlIGZyb20gXCIuL3VzZUdsb2JhbENhY2hlXCI7XG52YXIgU0tJUF9DSEVDSyA9ICdfc2tpcF9jaGVja18nO1xudmFyIE1VTFRJX1ZBTFVFID0gJ19tdWx0aV92YWx1ZV8nO1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gPT0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUHJlcHJvY2Vzc29yIHN0eWxlIGNvbnRlbnQgdG8gYnJvd3NlciBzdXBwb3J0IG9uZVxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVN0eWxlKHN0eWxlU3RyKSB7XG4gIHZhciBzZXJpYWxpemVkID0gc2VyaWFsaXplKGNvbXBpbGUoc3R5bGVTdHIpLCBzdHJpbmdpZnkpO1xuICByZXR1cm4gc2VyaWFsaXplZC5yZXBsYWNlKC9cXHslJSVcXDpbXjtdO30vZywgJzsnKTtcbn1cbmZ1bmN0aW9uIGlzQ29tcG91bmRDU1NQcm9wZXJ0eSh2YWx1ZSkge1xuICByZXR1cm4gX3R5cGVvZih2YWx1ZSkgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIChTS0lQX0NIRUNLIGluIHZhbHVlIHx8IE1VTFRJX1ZBTFVFIGluIHZhbHVlKTtcbn1cblxuLy8gXHU2Q0U4XHU1MTY1IGhhc2ggXHU1MDNDXG5mdW5jdGlvbiBpbmplY3RTZWxlY3Rvckhhc2goa2V5LCBoYXNoSWQsIGhhc2hQcmlvcml0eSkge1xuICBpZiAoIWhhc2hJZCkge1xuICAgIHJldHVybiBrZXk7XG4gIH1cbiAgdmFyIGhhc2hDbGFzc05hbWUgPSBcIi5cIi5jb25jYXQoaGFzaElkKTtcbiAgdmFyIGhhc2hTZWxlY3RvciA9IGhhc2hQcmlvcml0eSA9PT0gJ2xvdycgPyBcIjp3aGVyZShcIi5jb25jYXQoaGFzaENsYXNzTmFtZSwgXCIpXCIpIDogaGFzaENsYXNzTmFtZTtcblxuICAvLyBcdTZDRThcdTUxNjUgaGFzaElkXG4gIHZhciBrZXlzID0ga2V5LnNwbGl0KCcsJykubWFwKGZ1bmN0aW9uIChrKSB7XG4gICAgdmFyIF9maXJzdFBhdGgkbWF0Y2g7XG4gICAgdmFyIGZ1bGxQYXRoID0gay50cmltKCkuc3BsaXQoL1xccysvKTtcblxuICAgIC8vIFx1NTk4Mlx1Njc5QyBTZWxlY3RvciBcdTdCMkNcdTRFMDBcdTRFMkFcdTY2MkYgSFRNTCBFbGVtZW50XHVGRjBDXHU5MEEzXHU2MjExXHU0RUVDXHU1QzMxXHU2M0QyXHU1MjMwXHU1QjgzXHU3Njg0XHU1NDBFXHU5NzYyXHUzMDAyXHU1M0NEXHU0RTRCXHVGRjBDXHU1QzMxXHU2M0QyXHU1MjMwXHU2NzAwXHU1MjREXHU5NzYyXHUzMDAyXG4gICAgdmFyIGZpcnN0UGF0aCA9IGZ1bGxQYXRoWzBdIHx8ICcnO1xuICAgIHZhciBodG1sRWxlbWVudCA9ICgoX2ZpcnN0UGF0aCRtYXRjaCA9IGZpcnN0UGF0aC5tYXRjaCgvXlxcdysvKSkgPT09IG51bGwgfHwgX2ZpcnN0UGF0aCRtYXRjaCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2ZpcnN0UGF0aCRtYXRjaFswXSkgfHwgJyc7XG4gICAgZmlyc3RQYXRoID0gXCJcIi5jb25jYXQoaHRtbEVsZW1lbnQpLmNvbmNhdChoYXNoU2VsZWN0b3IpLmNvbmNhdChmaXJzdFBhdGguc2xpY2UoaHRtbEVsZW1lbnQubGVuZ3RoKSk7XG4gICAgcmV0dXJuIFtmaXJzdFBhdGhdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoZnVsbFBhdGguc2xpY2UoMSkpKS5qb2luKCcgJyk7XG4gIH0pO1xuICByZXR1cm4ga2V5cy5qb2luKCcsJyk7XG59XG4vLyBQYXJzZSBDU1NPYmplY3QgdG8gc3R5bGUgY29udGVudFxuZXhwb3J0IHZhciBwYXJzZVN0eWxlID0gZnVuY3Rpb24gcGFyc2VTdHlsZShpbnRlcnBvbGF0aW9uKSB7XG4gIHZhciBjb25maWcgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICB2YXIgX3JlZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge1xuICAgICAgcm9vdDogdHJ1ZSxcbiAgICAgIHBhcmVudFNlbGVjdG9yczogW11cbiAgICB9LFxuICAgIHJvb3QgPSBfcmVmLnJvb3QsXG4gICAgaW5qZWN0SGFzaCA9IF9yZWYuaW5qZWN0SGFzaCxcbiAgICBwYXJlbnRTZWxlY3RvcnMgPSBfcmVmLnBhcmVudFNlbGVjdG9ycztcbiAgdmFyIGhhc2hJZCA9IGNvbmZpZy5oYXNoSWQsXG4gICAgbGF5ZXIgPSBjb25maWcubGF5ZXIsXG4gICAgcGF0aCA9IGNvbmZpZy5wYXRoLFxuICAgIGhhc2hQcmlvcml0eSA9IGNvbmZpZy5oYXNoUHJpb3JpdHksXG4gICAgX2NvbmZpZyR0cmFuc2Zvcm1lcnMgPSBjb25maWcudHJhbnNmb3JtZXJzLFxuICAgIHRyYW5zZm9ybWVycyA9IF9jb25maWckdHJhbnNmb3JtZXJzID09PSB2b2lkIDAgPyBbXSA6IF9jb25maWckdHJhbnNmb3JtZXJzLFxuICAgIF9jb25maWckbGludGVycyA9IGNvbmZpZy5saW50ZXJzLFxuICAgIGxpbnRlcnMgPSBfY29uZmlnJGxpbnRlcnMgPT09IHZvaWQgMCA/IFtdIDogX2NvbmZpZyRsaW50ZXJzO1xuICB2YXIgc3R5bGVTdHIgPSAnJztcbiAgdmFyIGVmZmVjdFN0eWxlID0ge307XG4gIGZ1bmN0aW9uIHBhcnNlS2V5ZnJhbWVzKGtleWZyYW1lcykge1xuICAgIHZhciBhbmltYXRpb25OYW1lID0ga2V5ZnJhbWVzLmdldE5hbWUoaGFzaElkKTtcbiAgICBpZiAoIWVmZmVjdFN0eWxlW2FuaW1hdGlvbk5hbWVdKSB7XG4gICAgICB2YXIgX3BhcnNlU3R5bGUgPSBwYXJzZVN0eWxlKGtleWZyYW1lcy5zdHlsZSwgY29uZmlnLCB7XG4gICAgICAgICAgcm9vdDogZmFsc2UsXG4gICAgICAgICAgcGFyZW50U2VsZWN0b3JzOiBwYXJlbnRTZWxlY3RvcnNcbiAgICAgICAgfSksXG4gICAgICAgIF9wYXJzZVN0eWxlMiA9IF9zbGljZWRUb0FycmF5KF9wYXJzZVN0eWxlLCAxKSxcbiAgICAgICAgX3BhcnNlZFN0ciA9IF9wYXJzZVN0eWxlMlswXTtcbiAgICAgIGVmZmVjdFN0eWxlW2FuaW1hdGlvbk5hbWVdID0gXCJAa2V5ZnJhbWVzIFwiLmNvbmNhdChrZXlmcmFtZXMuZ2V0TmFtZShoYXNoSWQpKS5jb25jYXQoX3BhcnNlZFN0cik7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGZsYXR0ZW5MaXN0KGxpc3QpIHtcbiAgICB2YXIgZnVsbExpc3QgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IFtdO1xuICAgIGxpc3QuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbSkpIHtcbiAgICAgICAgZmxhdHRlbkxpc3QoaXRlbSwgZnVsbExpc3QpO1xuICAgICAgfSBlbHNlIGlmIChpdGVtKSB7XG4gICAgICAgIGZ1bGxMaXN0LnB1c2goaXRlbSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGZ1bGxMaXN0O1xuICB9XG4gIHZhciBmbGF0dGVuU3R5bGVMaXN0ID0gZmxhdHRlbkxpc3QoQXJyYXkuaXNBcnJheShpbnRlcnBvbGF0aW9uKSA/IGludGVycG9sYXRpb24gOiBbaW50ZXJwb2xhdGlvbl0pO1xuICBmbGF0dGVuU3R5bGVMaXN0LmZvckVhY2goZnVuY3Rpb24gKG9yaWdpblN0eWxlKSB7XG4gICAgLy8gT25seSByb290IGxldmVsIGNhbiB1c2UgcmF3IHN0cmluZ1xuICAgIHZhciBzdHlsZSA9IHR5cGVvZiBvcmlnaW5TdHlsZSA9PT0gJ3N0cmluZycgJiYgIXJvb3QgPyB7fSA6IG9yaWdpblN0eWxlO1xuICAgIGlmICh0eXBlb2Ygc3R5bGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBzdHlsZVN0ciArPSBcIlwiLmNvbmNhdChzdHlsZSwgXCJcXG5cIik7XG4gICAgfSBlbHNlIGlmIChzdHlsZS5fa2V5ZnJhbWUpIHtcbiAgICAgIC8vIEtleWZyYW1lXG4gICAgICBwYXJzZUtleWZyYW1lcyhzdHlsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBtZXJnZWRTdHlsZSA9IHRyYW5zZm9ybWVycy5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIHRyYW5zKSB7XG4gICAgICAgIHZhciBfdHJhbnMkdmlzaXQ7XG4gICAgICAgIHJldHVybiAodHJhbnMgPT09IG51bGwgfHwgdHJhbnMgPT09IHZvaWQgMCB8fCAoX3RyYW5zJHZpc2l0ID0gdHJhbnMudmlzaXQpID09PSBudWxsIHx8IF90cmFucyR2aXNpdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RyYW5zJHZpc2l0LmNhbGwodHJhbnMsIHByZXYpKSB8fCBwcmV2O1xuICAgICAgfSwgc3R5bGUpO1xuXG4gICAgICAvLyBOb3JtYWwgQ1NTT2JqZWN0XG4gICAgICBPYmplY3Qua2V5cyhtZXJnZWRTdHlsZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IG1lcmdlZFN0eWxlW2tleV07XG4gICAgICAgIGlmIChfdHlwZW9mKHZhbHVlKSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgKGtleSAhPT0gJ2FuaW1hdGlvbk5hbWUnIHx8ICF2YWx1ZS5fa2V5ZnJhbWUpICYmICFpc0NvbXBvdW5kQ1NTUHJvcGVydHkodmFsdWUpKSB7XG4gICAgICAgICAgdmFyIHN1YkluamVjdEhhc2ggPSBmYWxzZTtcblxuICAgICAgICAgIC8vIFx1NUY1M1x1NjIxMFx1NUQ0Q1x1NTk1N1x1NUJGOVx1OEM2MVx1Njc2NVx1NTkwNFx1NzQwNlxuICAgICAgICAgIHZhciBtZXJnZWRLZXkgPSBrZXkudHJpbSgpO1xuICAgICAgICAgIC8vIFdoZXRoZXIgdHJlYXQgY2hpbGQgYXMgcm9vdC4gSW4gbW9zdCBjYXNlIGl0IGlzIGZhbHNlLlxuICAgICAgICAgIHZhciBuZXh0Um9vdCA9IGZhbHNlO1xuXG4gICAgICAgICAgLy8gXHU2MkM2XHU1MjA2XHU1OTFBXHU0RTJBXHU5MDA5XHU2MkU5XHU1NjY4XG4gICAgICAgICAgaWYgKChyb290IHx8IGluamVjdEhhc2gpICYmIGhhc2hJZCkge1xuICAgICAgICAgICAgaWYgKG1lcmdlZEtleS5zdGFydHNXaXRoKCdAJykpIHtcbiAgICAgICAgICAgICAgLy8gXHU3NTY1XHU4RkM3XHU1QTkyXHU0RjUzXHU2N0U1XHU4QkUyXHVGRjBDXHU0RUE0XHU3RUQ5XHU1QjUwXHU4MjgyXHU3MEI5XHU3RUU3XHU3RUVEXHU2M0QyXHU1MTY1IGhhc2hJZFxuICAgICAgICAgICAgICBzdWJJbmplY3RIYXNoID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyZ2VkS2V5ID09PSAnJicpIHtcbiAgICAgICAgICAgICAgLy8gXHU2MkI5XHU2Mzg5IHJvb3Qgc2VsZWN0b3IgXHU0RTBBXHU3Njg0XHU1MzU1XHU0RTJBICZcbiAgICAgICAgICAgICAgbWVyZ2VkS2V5ID0gaW5qZWN0U2VsZWN0b3JIYXNoKCcnLCBoYXNoSWQsIGhhc2hQcmlvcml0eSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBcdTZDRThcdTUxNjUgaGFzaElkXG4gICAgICAgICAgICAgIG1lcmdlZEtleSA9IGluamVjdFNlbGVjdG9ySGFzaChrZXksIGhhc2hJZCwgaGFzaFByaW9yaXR5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHJvb3QgJiYgIWhhc2hJZCAmJiAobWVyZ2VkS2V5ID09PSAnJicgfHwgbWVyZ2VkS2V5ID09PSAnJykpIHtcbiAgICAgICAgICAgIC8vIEluIGNhc2Ugb2YgYHsgJyYnOiB7IGE6IHsgY29sb3I6ICdyZWQnIH0gfSB9YCBvciBgeyAnJzogeyBhOiB7IGNvbG9yOiAncmVkJyB9IH0gfWAgd2l0aG91dCBoYXNoSWQsXG4gICAgICAgICAgICAvLyB3ZSB3aWxsIGdldCBgJnthOntjb2xvcjpyZWQ7fX1gIG9yIGB7YTp7Y29sb3I6cmVkO319YCBzdHJpbmcgZm9yIHN0eWxpcyB0byBjb21waWxlLlxuICAgICAgICAgICAgLy8gQnV0IGl0IGRvZXMgbm90IGNvbmZvcm0gdG8gc3R5bGlzIHN5bnRheCxcbiAgICAgICAgICAgIC8vIGFuZCBmaW5hbGx5IHdlIHdpbGwgZ2V0IGB7Y29sb3I6cmVkO31gIGFzIGNzcywgd2hpY2ggaXMgd3JvbmcuXG4gICAgICAgICAgICAvLyBTbyB3ZSBuZWVkIHRvIHJlbW92ZSBrZXkgaW4gcm9vdCwgYW5kIHRyZWF0IGNoaWxkIGB7IGE6IHsgY29sb3I6ICdyZWQnIH0gfWAgYXMgcm9vdC5cbiAgICAgICAgICAgIG1lcmdlZEtleSA9ICcnO1xuICAgICAgICAgICAgbmV4dFJvb3QgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgX3BhcnNlU3R5bGUzID0gcGFyc2VTdHlsZSh2YWx1ZSwgY29uZmlnLCB7XG4gICAgICAgICAgICAgIHJvb3Q6IG5leHRSb290LFxuICAgICAgICAgICAgICBpbmplY3RIYXNoOiBzdWJJbmplY3RIYXNoLFxuICAgICAgICAgICAgICBwYXJlbnRTZWxlY3RvcnM6IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkocGFyZW50U2VsZWN0b3JzKSwgW21lcmdlZEtleV0pXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIF9wYXJzZVN0eWxlNCA9IF9zbGljZWRUb0FycmF5KF9wYXJzZVN0eWxlMywgMiksXG4gICAgICAgICAgICBfcGFyc2VkU3RyMiA9IF9wYXJzZVN0eWxlNFswXSxcbiAgICAgICAgICAgIGNoaWxkRWZmZWN0U3R5bGUgPSBfcGFyc2VTdHlsZTRbMV07XG4gICAgICAgICAgZWZmZWN0U3R5bGUgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGVmZmVjdFN0eWxlKSwgY2hpbGRFZmZlY3RTdHlsZSk7XG4gICAgICAgICAgc3R5bGVTdHIgKz0gXCJcIi5jb25jYXQobWVyZ2VkS2V5KS5jb25jYXQoX3BhcnNlZFN0cjIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBfdmFsdWU7XG4gICAgICAgICAgZnVuY3Rpb24gYXBwZW5kU3R5bGUoY3NzS2V5LCBjc3NWYWx1ZSkge1xuICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgKF90eXBlb2YodmFsdWUpICE9PSAnb2JqZWN0JyB8fCAhKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDAgJiYgdmFsdWVbU0tJUF9DSEVDS10pKSkge1xuICAgICAgICAgICAgICBbY29udGVudFF1b3Rlc0xpbnRlciwgaGFzaGVkQW5pbWF0aW9uTGludGVyXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGxpbnRlcnMpKS5mb3JFYWNoKGZ1bmN0aW9uIChsaW50ZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGludGVyKGNzc0tleSwgY3NzVmFsdWUsIHtcbiAgICAgICAgICAgICAgICAgIHBhdGg6IHBhdGgsXG4gICAgICAgICAgICAgICAgICBoYXNoSWQ6IGhhc2hJZCxcbiAgICAgICAgICAgICAgICAgIHBhcmVudFNlbGVjdG9yczogcGFyZW50U2VsZWN0b3JzXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBcdTU5ODJcdTY3OUNcdTY2MkZcdTY4MzdcdTVGMEZcdTUyMTlcdTc2RjRcdTYzQTVcdTYzRDJcdTUxNjVcbiAgICAgICAgICAgIHZhciBzdHlsZU5hbWUgPSBjc3NLZXkucmVwbGFjZSgvW0EtWl0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBcIi1cIi5jb25jYXQobWF0Y2gudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gQXV0byBzdWZmaXggd2l0aCBweFxuICAgICAgICAgICAgdmFyIGZvcm1hdFZhbHVlID0gY3NzVmFsdWU7XG4gICAgICAgICAgICBpZiAoIXVuaXRsZXNzW2Nzc0tleV0gJiYgdHlwZW9mIGZvcm1hdFZhbHVlID09PSAnbnVtYmVyJyAmJiBmb3JtYXRWYWx1ZSAhPT0gMCkge1xuICAgICAgICAgICAgICBmb3JtYXRWYWx1ZSA9IFwiXCIuY29uY2F0KGZvcm1hdFZhbHVlLCBcInB4XCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBoYW5kbGUgYW5pbWF0aW9uTmFtZSAmIEtleWZyYW1lIHZhbHVlXG4gICAgICAgICAgICBpZiAoY3NzS2V5ID09PSAnYW5pbWF0aW9uTmFtZScgJiYgY3NzVmFsdWUgIT09IG51bGwgJiYgY3NzVmFsdWUgIT09IHZvaWQgMCAmJiBjc3NWYWx1ZS5fa2V5ZnJhbWUpIHtcbiAgICAgICAgICAgICAgcGFyc2VLZXlmcmFtZXMoY3NzVmFsdWUpO1xuICAgICAgICAgICAgICBmb3JtYXRWYWx1ZSA9IGNzc1ZhbHVlLmdldE5hbWUoaGFzaElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0eWxlU3RyICs9IFwiXCIuY29uY2F0KHN0eWxlTmFtZSwgXCI6XCIpLmNvbmNhdChmb3JtYXRWYWx1ZSwgXCI7XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgYWN0dWFsVmFsdWUgPSAoX3ZhbHVlID0gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHZhbHVlLnZhbHVlKSAhPT0gbnVsbCAmJiBfdmFsdWUgIT09IHZvaWQgMCA/IF92YWx1ZSA6IHZhbHVlO1xuICAgICAgICAgIGlmIChfdHlwZW9mKHZhbHVlKSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCAmJiB2YWx1ZVtNVUxUSV9WQUxVRV0gJiYgQXJyYXkuaXNBcnJheShhY3R1YWxWYWx1ZSkpIHtcbiAgICAgICAgICAgIGFjdHVhbFZhbHVlLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgICAgYXBwZW5kU3R5bGUoa2V5LCBpdGVtKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhcHBlbmRTdHlsZShrZXksIGFjdHVhbFZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIGlmICghcm9vdCkge1xuICAgIHN0eWxlU3RyID0gXCJ7XCIuY29uY2F0KHN0eWxlU3RyLCBcIn1cIik7XG4gIH0gZWxzZSBpZiAobGF5ZXIpIHtcbiAgICAvLyBmaXhtZTogaHR0cHM6Ly9naXRodWIuY29tL3RoeXN1bHRhbi9zdHlsaXMvcHVsbC8zMzlcbiAgICBpZiAoc3R5bGVTdHIpIHtcbiAgICAgIHN0eWxlU3RyID0gXCJAbGF5ZXIgXCIuY29uY2F0KGxheWVyLm5hbWUsIFwiIHtcIikuY29uY2F0KHN0eWxlU3RyLCBcIn1cIik7XG4gICAgfVxuICAgIGlmIChsYXllci5kZXBlbmRlbmNpZXMpIHtcbiAgICAgIGVmZmVjdFN0eWxlW1wiQGxheWVyIFwiLmNvbmNhdChsYXllci5uYW1lKV0gPSBsYXllci5kZXBlbmRlbmNpZXMubWFwKGZ1bmN0aW9uIChkZXBzKSB7XG4gICAgICAgIHJldHVybiBcIkBsYXllciBcIi5jb25jYXQoZGVwcywgXCIsIFwiKS5jb25jYXQobGF5ZXIubmFtZSwgXCI7XCIpO1xuICAgICAgfSkuam9pbignXFxuJyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbc3R5bGVTdHIsIGVmZmVjdFN0eWxlXTtcbn07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vID09ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT1cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmV4cG9ydCBmdW5jdGlvbiB1bmlxdWVIYXNoKHBhdGgsIHN0eWxlU3RyKSB7XG4gIHJldHVybiBoYXNoKFwiXCIuY29uY2F0KHBhdGguam9pbignJScpKS5jb25jYXQoc3R5bGVTdHIpKTtcbn1cbmZ1bmN0aW9uIEVtcHR5KCkge1xuICByZXR1cm4gbnVsbDtcbn1cbmV4cG9ydCB2YXIgU1RZTEVfUFJFRklYID0gJ3N0eWxlJztcbi8qKlxuICogUmVnaXN0ZXIgYSBzdHlsZSB0byB0aGUgZ2xvYmFsIHN0eWxlIHNoZWV0LlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VTdHlsZVJlZ2lzdGVyKGluZm8sIHN0eWxlRm4pIHtcbiAgdmFyIHRva2VuID0gaW5mby50b2tlbixcbiAgICBwYXRoID0gaW5mby5wYXRoLFxuICAgIGhhc2hJZCA9IGluZm8uaGFzaElkLFxuICAgIGxheWVyID0gaW5mby5sYXllcixcbiAgICBub25jZSA9IGluZm8ubm9uY2UsXG4gICAgY2xpZW50T25seSA9IGluZm8uY2xpZW50T25seSxcbiAgICBfaW5mbyRvcmRlciA9IGluZm8ub3JkZXIsXG4gICAgb3JkZXIgPSBfaW5mbyRvcmRlciA9PT0gdm9pZCAwID8gMCA6IF9pbmZvJG9yZGVyO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KFN0eWxlQ29udGV4dCksXG4gICAgYXV0b0NsZWFyID0gX1JlYWN0JHVzZUNvbnRleHQuYXV0b0NsZWFyLFxuICAgIG1vY2sgPSBfUmVhY3QkdXNlQ29udGV4dC5tb2NrLFxuICAgIGRlZmF1bHRDYWNoZSA9IF9SZWFjdCR1c2VDb250ZXh0LmRlZmF1bHRDYWNoZSxcbiAgICBoYXNoUHJpb3JpdHkgPSBfUmVhY3QkdXNlQ29udGV4dC5oYXNoUHJpb3JpdHksXG4gICAgY29udGFpbmVyID0gX1JlYWN0JHVzZUNvbnRleHQuY29udGFpbmVyLFxuICAgIHNzcklubGluZSA9IF9SZWFjdCR1c2VDb250ZXh0LnNzcklubGluZSxcbiAgICB0cmFuc2Zvcm1lcnMgPSBfUmVhY3QkdXNlQ29udGV4dC50cmFuc2Zvcm1lcnMsXG4gICAgbGludGVycyA9IF9SZWFjdCR1c2VDb250ZXh0LmxpbnRlcnMsXG4gICAgY2FjaGUgPSBfUmVhY3QkdXNlQ29udGV4dC5jYWNoZSxcbiAgICBlbmFibGVMYXllciA9IF9SZWFjdCR1c2VDb250ZXh0LmxheWVyO1xuICB2YXIgdG9rZW5LZXkgPSB0b2tlbi5fdG9rZW5LZXk7XG4gIHZhciBmdWxsUGF0aCA9IFt0b2tlbktleV07XG4gIGlmIChlbmFibGVMYXllcikge1xuICAgIGZ1bGxQYXRoLnB1c2goJ2xheWVyJyk7XG4gIH1cbiAgZnVsbFBhdGgucHVzaC5hcHBseShmdWxsUGF0aCwgX3RvQ29uc3VtYWJsZUFycmF5KHBhdGgpKTtcblxuICAvLyBDaGVjayBpZiBuZWVkIGluc2VydCBzdHlsZVxuICB2YXIgaXNNZXJnZWRDbGllbnRTaWRlID0gaXNDbGllbnRTaWRlO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBtb2NrICE9PSB1bmRlZmluZWQpIHtcbiAgICBpc01lcmdlZENsaWVudFNpZGUgPSBtb2NrID09PSAnY2xpZW50JztcbiAgfVxuICB2YXIgX3VzZUdsb2JhbENhY2hlID0gdXNlR2xvYmFsQ2FjaGUoU1RZTEVfUFJFRklYLCBmdWxsUGF0aCxcbiAgICAvLyBDcmVhdGUgY2FjaGUgaWYgbmVlZGVkXG4gICAgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGNhY2hlUGF0aCA9IGZ1bGxQYXRoLmpvaW4oJ3wnKTtcblxuICAgICAgLy8gR2V0IHN0eWxlIGZyb20gU1NSIGlubGluZSBzdHlsZSBkaXJlY3RseVxuICAgICAgaWYgKGV4aXN0UGF0aChjYWNoZVBhdGgpKSB7XG4gICAgICAgIHZhciBfZ2V0U3R5bGVBbmRIYXNoID0gZ2V0U3R5bGVBbmRIYXNoKGNhY2hlUGF0aCksXG4gICAgICAgICAgX2dldFN0eWxlQW5kSGFzaDIgPSBfc2xpY2VkVG9BcnJheShfZ2V0U3R5bGVBbmRIYXNoLCAyKSxcbiAgICAgICAgICBpbmxpbmVDYWNoZVN0eWxlU3RyID0gX2dldFN0eWxlQW5kSGFzaDJbMF0sXG4gICAgICAgICAgc3R5bGVIYXNoID0gX2dldFN0eWxlQW5kSGFzaDJbMV07XG4gICAgICAgIGlmIChpbmxpbmVDYWNoZVN0eWxlU3RyKSB7XG4gICAgICAgICAgcmV0dXJuIFtpbmxpbmVDYWNoZVN0eWxlU3RyLCB0b2tlbktleSwgc3R5bGVIYXNoLCB7fSwgY2xpZW50T25seSwgb3JkZXJdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEdlbmVyYXRlIHN0eWxlXG4gICAgICB2YXIgc3R5bGVPYmogPSBzdHlsZUZuKCk7XG4gICAgICB2YXIgX3BhcnNlU3R5bGU1ID0gcGFyc2VTdHlsZShzdHlsZU9iaiwge1xuICAgICAgICAgIGhhc2hJZDogaGFzaElkLFxuICAgICAgICAgIGhhc2hQcmlvcml0eTogaGFzaFByaW9yaXR5LFxuICAgICAgICAgIGxheWVyOiBlbmFibGVMYXllciA/IGxheWVyIDogdW5kZWZpbmVkLFxuICAgICAgICAgIHBhdGg6IHBhdGguam9pbignLScpLFxuICAgICAgICAgIHRyYW5zZm9ybWVyczogdHJhbnNmb3JtZXJzLFxuICAgICAgICAgIGxpbnRlcnM6IGxpbnRlcnNcbiAgICAgICAgfSksXG4gICAgICAgIF9wYXJzZVN0eWxlNiA9IF9zbGljZWRUb0FycmF5KF9wYXJzZVN0eWxlNSwgMiksXG4gICAgICAgIHBhcnNlZFN0eWxlID0gX3BhcnNlU3R5bGU2WzBdLFxuICAgICAgICBlZmZlY3RTdHlsZSA9IF9wYXJzZVN0eWxlNlsxXTtcbiAgICAgIHZhciBzdHlsZVN0ciA9IG5vcm1hbGl6ZVN0eWxlKHBhcnNlZFN0eWxlKTtcbiAgICAgIHZhciBzdHlsZUlkID0gdW5pcXVlSGFzaChmdWxsUGF0aCwgc3R5bGVTdHIpO1xuICAgICAgcmV0dXJuIFtzdHlsZVN0ciwgdG9rZW5LZXksIHN0eWxlSWQsIGVmZmVjdFN0eWxlLCBjbGllbnRPbmx5LCBvcmRlcl07XG4gICAgfSxcbiAgICAvLyBSZW1vdmUgY2FjaGUgaWYgbm8gbmVlZFxuICAgIGZ1bmN0aW9uIChfcmVmMiwgZnJvbUhNUikge1xuICAgICAgdmFyIF9yZWYzID0gX3NsaWNlZFRvQXJyYXkoX3JlZjIsIDMpLFxuICAgICAgICBzdHlsZUlkID0gX3JlZjNbMl07XG4gICAgICBpZiAoKGZyb21ITVIgfHwgYXV0b0NsZWFyKSAmJiBpc0NsaWVudFNpZGUpIHtcbiAgICAgICAgcmVtb3ZlQ1NTKHN0eWxlSWQsIHtcbiAgICAgICAgICBtYXJrOiBBVFRSX01BUktcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICAvLyBFZmZlY3Q6IEluamVjdCBzdHlsZSBoZXJlXG4gICAgZnVuY3Rpb24gKF9yZWY0KSB7XG4gICAgICB2YXIgX3JlZjUgPSBfc2xpY2VkVG9BcnJheShfcmVmNCwgNCksXG4gICAgICAgIHN0eWxlU3RyID0gX3JlZjVbMF0sXG4gICAgICAgIF8gPSBfcmVmNVsxXSxcbiAgICAgICAgc3R5bGVJZCA9IF9yZWY1WzJdLFxuICAgICAgICBlZmZlY3RTdHlsZSA9IF9yZWY1WzNdO1xuICAgICAgaWYgKGlzTWVyZ2VkQ2xpZW50U2lkZSAmJiBzdHlsZVN0ciAhPT0gQ1NTX0ZJTEVfU1RZTEUpIHtcbiAgICAgICAgdmFyIG1lcmdlZENTU0NvbmZpZyA9IHtcbiAgICAgICAgICBtYXJrOiBBVFRSX01BUkssXG4gICAgICAgICAgcHJlcGVuZDogZW5hYmxlTGF5ZXIgPyBmYWxzZSA6ICdxdWV1ZScsXG4gICAgICAgICAgYXR0YWNoVG86IGNvbnRhaW5lcixcbiAgICAgICAgICBwcmlvcml0eTogb3JkZXJcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIG5vbmNlU3RyID0gdHlwZW9mIG5vbmNlID09PSAnZnVuY3Rpb24nID8gbm9uY2UoKSA6IG5vbmNlO1xuICAgICAgICBpZiAobm9uY2VTdHIpIHtcbiAgICAgICAgICBtZXJnZWRDU1NDb25maWcuY3NwID0ge1xuICAgICAgICAgICAgbm9uY2U6IG5vbmNlU3RyXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09IFNwbGl0IEVmZmVjdCBTdHlsZSA9PT09PT09PT09PT09PT09PVxuICAgICAgICAvLyBXZSB3aWxsIHNwbGl0IGVmZmVjdFN0eWxlIGhlcmUgc2luY2UgQGxheWVyIHNob3VsZCBiZSBhdCB0aGUgdG9wIGxldmVsXG4gICAgICAgIHZhciBlZmZlY3RMYXllcktleXMgPSBbXTtcbiAgICAgICAgdmFyIGVmZmVjdFJlc3RLZXlzID0gW107XG4gICAgICAgIE9iamVjdC5rZXlzKGVmZmVjdFN0eWxlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoJ0BsYXllcicpKSB7XG4gICAgICAgICAgICBlZmZlY3RMYXllcktleXMucHVzaChrZXkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlZmZlY3RSZXN0S2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyA9PT09PT09PT09PT09PT09PSBJbmplY3QgTGF5ZXIgU3R5bGUgPT09PT09PT09PT09PT09PT1cbiAgICAgICAgLy8gSW5qZWN0IGxheWVyIHN0eWxlXG4gICAgICAgIGVmZmVjdExheWVyS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChlZmZlY3RLZXkpIHtcbiAgICAgICAgICB1cGRhdGVDU1Mobm9ybWFsaXplU3R5bGUoZWZmZWN0U3R5bGVbZWZmZWN0S2V5XSksIFwiX2xheWVyLVwiLmNvbmNhdChlZmZlY3RLZXkpLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG1lcmdlZENTU0NvbmZpZyksIHt9LCB7XG4gICAgICAgICAgICBwcmVwZW5kOiB0cnVlXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PSBJbmplY3QgU3R5bGUgPT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgLy8gSW5qZWN0IHN0eWxlXG4gICAgICAgIHZhciBzdHlsZSA9IHVwZGF0ZUNTUyhzdHlsZVN0ciwgc3R5bGVJZCwgbWVyZ2VkQ1NTQ29uZmlnKTtcbiAgICAgICAgc3R5bGVbQ1NTX0lOX0pTX0lOU1RBTkNFXSA9IGNhY2hlLmluc3RhbmNlSWQ7XG5cbiAgICAgICAgLy8gVXNlZCBmb3IgYHVzZUNhY2hlVG9rZW5gIHRvIHJlbW92ZSBvbiBiYXRjaCB3aGVuIHRva2VuIHJlbW92ZWRcbiAgICAgICAgc3R5bGUuc2V0QXR0cmlidXRlKEFUVFJfVE9LRU4sIHRva2VuS2V5KTtcblxuICAgICAgICAvLyBEZWJ1ZyB1c2FnZS4gRGV2IG9ubHlcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICBzdHlsZS5zZXRBdHRyaWJ1dGUoQVRUUl9DQUNIRV9QQVRILCBmdWxsUGF0aC5qb2luKCd8JykpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PSBJbmplY3QgRWZmZWN0IFN0eWxlID09PT09PT09PT09PT09PT09XG4gICAgICAgIC8vIEluamVjdCBjbGllbnQgc2lkZSBlZmZlY3Qgc3R5bGVcbiAgICAgICAgZWZmZWN0UmVzdEtleXMuZm9yRWFjaChmdW5jdGlvbiAoZWZmZWN0S2V5KSB7XG4gICAgICAgICAgdXBkYXRlQ1NTKG5vcm1hbGl6ZVN0eWxlKGVmZmVjdFN0eWxlW2VmZmVjdEtleV0pLCBcIl9lZmZlY3QtXCIuY29uY2F0KGVmZmVjdEtleSksIG1lcmdlZENTU0NvbmZpZyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pLFxuICAgIF91c2VHbG9iYWxDYWNoZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlR2xvYmFsQ2FjaGUsIDMpLFxuICAgIGNhY2hlZFN0eWxlU3RyID0gX3VzZUdsb2JhbENhY2hlMlswXSxcbiAgICBjYWNoZWRUb2tlbktleSA9IF91c2VHbG9iYWxDYWNoZTJbMV0sXG4gICAgY2FjaGVkU3R5bGVJZCA9IF91c2VHbG9iYWxDYWNoZTJbMl07XG4gIHJldHVybiBmdW5jdGlvbiAobm9kZSkge1xuICAgIHZhciBzdHlsZU5vZGU7XG4gICAgaWYgKCFzc3JJbmxpbmUgfHwgaXNNZXJnZWRDbGllbnRTaWRlIHx8ICFkZWZhdWx0Q2FjaGUpIHtcbiAgICAgIHN0eWxlTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVtcHR5LCBudWxsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIF9yZWY2O1xuICAgICAgc3R5bGVOb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiLCBfZXh0ZW5kcyh7fSwgKF9yZWY2ID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfcmVmNiwgQVRUUl9UT0tFTiwgY2FjaGVkVG9rZW5LZXkpLCBfZGVmaW5lUHJvcGVydHkoX3JlZjYsIEFUVFJfTUFSSywgY2FjaGVkU3R5bGVJZCksIF9yZWY2KSwge1xuICAgICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xuICAgICAgICAgIF9faHRtbDogY2FjaGVkU3R5bGVTdHJcbiAgICAgICAgfVxuICAgICAgfSkpO1xuICAgIH1cbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIHN0eWxlTm9kZSwgbm9kZSk7XG4gIH07XG59XG5leHBvcnQgdmFyIGV4dHJhY3QgPSBmdW5jdGlvbiBleHRyYWN0KGNhY2hlLCBlZmZlY3RTdHlsZXMsIG9wdGlvbnMpIHtcbiAgdmFyIF9jYWNoZSA9IF9zbGljZWRUb0FycmF5KGNhY2hlLCA2KSxcbiAgICBzdHlsZVN0ciA9IF9jYWNoZVswXSxcbiAgICB0b2tlbktleSA9IF9jYWNoZVsxXSxcbiAgICBzdHlsZUlkID0gX2NhY2hlWzJdLFxuICAgIGVmZmVjdFN0eWxlID0gX2NhY2hlWzNdLFxuICAgIGNsaWVudE9ubHkgPSBfY2FjaGVbNF0sXG4gICAgb3JkZXIgPSBfY2FjaGVbNV07XG4gIHZhciBfcmVmNyA9IG9wdGlvbnMgfHwge30sXG4gICAgcGxhaW4gPSBfcmVmNy5wbGFpbjtcblxuICAvLyBTa2lwIGNsaWVudCBvbmx5IHN0eWxlXG4gIGlmIChjbGllbnRPbmx5KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIGtleVN0eWxlVGV4dCA9IHN0eWxlU3RyO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT0gU2hhcmUgPT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBVc2VkIGZvciByYy11dGlsXG4gIHZhciBzaGFyZWRBdHRycyA9IHtcbiAgICAnZGF0YS1yYy1vcmRlcic6ICdwcmVwZW5kUXVldWUnLFxuICAgICdkYXRhLXJjLXByaW9yaXR5JzogXCJcIi5jb25jYXQob3JkZXIpXG4gIH07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PSBTdHlsZSA9PT09PT09PT09PT09PT09PT09PT09XG4gIGtleVN0eWxlVGV4dCA9IHRvU3R5bGVTdHIoc3R5bGVTdHIsIHRva2VuS2V5LCBzdHlsZUlkLCBzaGFyZWRBdHRycywgcGxhaW4pO1xuXG4gIC8vID09PT09PT09PT09PT09PSBDcmVhdGUgZWZmZWN0IHN0eWxlID09PT09PT09PT09PT09PVxuICBpZiAoZWZmZWN0U3R5bGUpIHtcbiAgICBPYmplY3Qua2V5cyhlZmZlY3RTdHlsZSkuZm9yRWFjaChmdW5jdGlvbiAoZWZmZWN0S2V5KSB7XG4gICAgICAvLyBFZmZlY3Qgc3R5bGUgY2FuIGJlIHJldXNlZFxuICAgICAgaWYgKCFlZmZlY3RTdHlsZXNbZWZmZWN0S2V5XSkge1xuICAgICAgICBlZmZlY3RTdHlsZXNbZWZmZWN0S2V5XSA9IHRydWU7XG4gICAgICAgIHZhciBlZmZlY3RTdHlsZVN0ciA9IG5vcm1hbGl6ZVN0eWxlKGVmZmVjdFN0eWxlW2VmZmVjdEtleV0pO1xuICAgICAgICB2YXIgZWZmZWN0U3R5bGVIVE1MID0gdG9TdHlsZVN0cihlZmZlY3RTdHlsZVN0ciwgdG9rZW5LZXksIFwiX2VmZmVjdC1cIi5jb25jYXQoZWZmZWN0S2V5KSwgc2hhcmVkQXR0cnMsIHBsYWluKTtcbiAgICAgICAgaWYgKGVmZmVjdEtleS5zdGFydHNXaXRoKCdAbGF5ZXInKSkge1xuICAgICAgICAgIGtleVN0eWxlVGV4dCA9IGVmZmVjdFN0eWxlSFRNTCArIGtleVN0eWxlVGV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBrZXlTdHlsZVRleHQgKz0gZWZmZWN0U3R5bGVIVE1MO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIFtvcmRlciwgc3R5bGVJZCwga2V5U3R5bGVUZXh0XTtcbn07IiwgInZhciB1bml0bGVzc0tleXMgPSB7XG4gIGFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiAxLFxuICBib3JkZXJJbWFnZU91dHNldDogMSxcbiAgYm9yZGVySW1hZ2VTbGljZTogMSxcbiAgYm9yZGVySW1hZ2VXaWR0aDogMSxcbiAgYm94RmxleDogMSxcbiAgYm94RmxleEdyb3VwOiAxLFxuICBib3hPcmRpbmFsR3JvdXA6IDEsXG4gIGNvbHVtbkNvdW50OiAxLFxuICBjb2x1bW5zOiAxLFxuICBmbGV4OiAxLFxuICBmbGV4R3JvdzogMSxcbiAgZmxleFBvc2l0aXZlOiAxLFxuICBmbGV4U2hyaW5rOiAxLFxuICBmbGV4TmVnYXRpdmU6IDEsXG4gIGZsZXhPcmRlcjogMSxcbiAgZ3JpZFJvdzogMSxcbiAgZ3JpZFJvd0VuZDogMSxcbiAgZ3JpZFJvd1NwYW46IDEsXG4gIGdyaWRSb3dTdGFydDogMSxcbiAgZ3JpZENvbHVtbjogMSxcbiAgZ3JpZENvbHVtbkVuZDogMSxcbiAgZ3JpZENvbHVtblNwYW46IDEsXG4gIGdyaWRDb2x1bW5TdGFydDogMSxcbiAgbXNHcmlkUm93OiAxLFxuICBtc0dyaWRSb3dTcGFuOiAxLFxuICBtc0dyaWRDb2x1bW46IDEsXG4gIG1zR3JpZENvbHVtblNwYW46IDEsXG4gIGZvbnRXZWlnaHQ6IDEsXG4gIGxpbmVIZWlnaHQ6IDEsXG4gIG9wYWNpdHk6IDEsXG4gIG9yZGVyOiAxLFxuICBvcnBoYW5zOiAxLFxuICB0YWJTaXplOiAxLFxuICB3aWRvd3M6IDEsXG4gIHpJbmRleDogMSxcbiAgem9vbTogMSxcbiAgV2Via2l0TGluZUNsYW1wOiAxLFxuICAvLyBTVkctcmVsYXRlZCBwcm9wZXJ0aWVzXG4gIGZpbGxPcGFjaXR5OiAxLFxuICBmbG9vZE9wYWNpdHk6IDEsXG4gIHN0b3BPcGFjaXR5OiAxLFxuICBzdHJva2VEYXNoYXJyYXk6IDEsXG4gIHN0cm9rZURhc2hvZmZzZXQ6IDEsXG4gIHN0cm9rZU1pdGVybGltaXQ6IDEsXG4gIHN0cm9rZU9wYWNpdHk6IDEsXG4gIHN0cm9rZVdpZHRoOiAxXG59O1xuXG5leHBvcnQgZGVmYXVsdCB1bml0bGVzc0tleXM7XG4iLCAiZXhwb3J0IHZhciBNUyA9ICctbXMtJ1xuZXhwb3J0IHZhciBNT1ogPSAnLW1vei0nXG5leHBvcnQgdmFyIFdFQktJVCA9ICctd2Via2l0LSdcblxuZXhwb3J0IHZhciBDT01NRU5UID0gJ2NvbW0nXG5leHBvcnQgdmFyIFJVTEVTRVQgPSAncnVsZSdcbmV4cG9ydCB2YXIgREVDTEFSQVRJT04gPSAnZGVjbCdcblxuZXhwb3J0IHZhciBQQUdFID0gJ0BwYWdlJ1xuZXhwb3J0IHZhciBNRURJQSA9ICdAbWVkaWEnXG5leHBvcnQgdmFyIElNUE9SVCA9ICdAaW1wb3J0J1xuZXhwb3J0IHZhciBDSEFSU0VUID0gJ0BjaGFyc2V0J1xuZXhwb3J0IHZhciBWSUVXUE9SVCA9ICdAdmlld3BvcnQnXG5leHBvcnQgdmFyIFNVUFBPUlRTID0gJ0BzdXBwb3J0cydcbmV4cG9ydCB2YXIgRE9DVU1FTlQgPSAnQGRvY3VtZW50J1xuZXhwb3J0IHZhciBOQU1FU1BBQ0UgPSAnQG5hbWVzcGFjZSdcbmV4cG9ydCB2YXIgS0VZRlJBTUVTID0gJ0BrZXlmcmFtZXMnXG5leHBvcnQgdmFyIEZPTlRfRkFDRSA9ICdAZm9udC1mYWNlJ1xuZXhwb3J0IHZhciBDT1VOVEVSX1NUWUxFID0gJ0Bjb3VudGVyLXN0eWxlJ1xuZXhwb3J0IHZhciBGT05UX0ZFQVRVUkVfVkFMVUVTID0gJ0Bmb250LWZlYXR1cmUtdmFsdWVzJ1xuZXhwb3J0IHZhciBMQVlFUiA9ICdAbGF5ZXInXG5leHBvcnQgdmFyIFNDT1BFID0gJ0BzY29wZSdcbiIsICIvKipcbiAqIEBwYXJhbSB7bnVtYmVyfVxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5leHBvcnQgdmFyIGFicyA9IE1hdGguYWJzXG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCB2YXIgZnJvbSA9IFN0cmluZy5mcm9tQ2hhckNvZGVcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH1cbiAqIEByZXR1cm4ge29iamVjdH1cbiAqL1xuZXhwb3J0IHZhciBhc3NpZ24gPSBPYmplY3QuYXNzaWduXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNoICh2YWx1ZSwgbGVuZ3RoKSB7XG5cdHJldHVybiBjaGFyYXQodmFsdWUsIDApIF4gNDUgPyAoKCgoKCgobGVuZ3RoIDw8IDIpIF4gY2hhcmF0KHZhbHVlLCAwKSkgPDwgMikgXiBjaGFyYXQodmFsdWUsIDEpKSA8PCAyKSBeIGNoYXJhdCh2YWx1ZSwgMikpIDw8IDIpIF4gY2hhcmF0KHZhbHVlLCAzKSA6IDBcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaW0gKHZhbHVlKSB7XG5cdHJldHVybiB2YWx1ZS50cmltKClcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7UmVnRXhwfSBwYXR0ZXJuXG4gKiBAcmV0dXJuIHtzdHJpbmc/fVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2ggKHZhbHVlLCBwYXR0ZXJuKSB7XG5cdHJldHVybiAodmFsdWUgPSBwYXR0ZXJuLmV4ZWModmFsdWUpKSA/IHZhbHVlWzBdIDogdmFsdWVcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7KHN0cmluZ3xSZWdFeHApfSBwYXR0ZXJuXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVwbGFjZW1lbnRcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2UgKHZhbHVlLCBwYXR0ZXJuLCByZXBsYWNlbWVudCkge1xuXHRyZXR1cm4gdmFsdWUucmVwbGFjZShwYXR0ZXJuLCByZXBsYWNlbWVudClcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZWFyY2hcbiAqIEBwYXJhbSB7bnVtYmVyfSBwb3NpdGlvblxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5kZXhvZiAodmFsdWUsIHNlYXJjaCwgcG9zaXRpb24pIHtcblx0cmV0dXJuIHZhbHVlLmluZGV4T2Yoc2VhcmNoLCBwb3NpdGlvbilcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhcmF0ICh2YWx1ZSwgaW5kZXgpIHtcblx0cmV0dXJuIHZhbHVlLmNoYXJDb2RlQXQoaW5kZXgpIHwgMFxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHBhcmFtIHtudW1iZXJ9IGJlZ2luXG4gKiBAcGFyYW0ge251bWJlcn0gZW5kXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWJzdHIgKHZhbHVlLCBiZWdpbiwgZW5kKSB7XG5cdHJldHVybiB2YWx1ZS5zbGljZShiZWdpbiwgZW5kKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RybGVuICh2YWx1ZSkge1xuXHRyZXR1cm4gdmFsdWUubGVuZ3RoXG59XG5cbi8qKlxuICogQHBhcmFtIHthbnlbXX0gdmFsdWVcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpemVvZiAodmFsdWUpIHtcblx0cmV0dXJuIHZhbHVlLmxlbmd0aFxufVxuXG4vKipcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHBhcmFtIHthbnlbXX0gYXJyYXlcbiAqIEByZXR1cm4ge2FueX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGVuZCAodmFsdWUsIGFycmF5KSB7XG5cdHJldHVybiBhcnJheS5wdXNoKHZhbHVlKSwgdmFsdWVcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBhcnJheVxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbWJpbmUgKGFycmF5LCBjYWxsYmFjaykge1xuXHRyZXR1cm4gYXJyYXkubWFwKGNhbGxiYWNrKS5qb2luKCcnKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nW119IGFycmF5XG4gKiBAcGFyYW0ge1JlZ0V4cH0gcGF0dGVyblxuICogQHJldHVybiB7c3RyaW5nW119XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXIgKGFycmF5LCBwYXR0ZXJuKSB7XG5cdHJldHVybiBhcnJheS5maWx0ZXIoZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiAhbWF0Y2godmFsdWUsIHBhdHRlcm4pIH0pXG59XG4iLCAiaW1wb3J0IHtmcm9tLCB0cmltLCBjaGFyYXQsIHN0cmxlbiwgc3Vic3RyLCBhcHBlbmQsIGFzc2lnbn0gZnJvbSAnLi9VdGlsaXR5LmpzJ1xuXG5leHBvcnQgdmFyIGxpbmUgPSAxXG5leHBvcnQgdmFyIGNvbHVtbiA9IDFcbmV4cG9ydCB2YXIgbGVuZ3RoID0gMFxuZXhwb3J0IHZhciBwb3NpdGlvbiA9IDBcbmV4cG9ydCB2YXIgY2hhcmFjdGVyID0gMFxuZXhwb3J0IHZhciBjaGFyYWN0ZXJzID0gJydcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7b2JqZWN0IHwgbnVsbH0gcm9vdFxuICogQHBhcmFtIHtvYmplY3QgfCBudWxsfSBwYXJlbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0ge3N0cmluZ1tdIHwgc3RyaW5nfSBwcm9wc1xuICogQHBhcmFtIHtvYmplY3RbXSB8IHN0cmluZ30gY2hpbGRyZW5cbiAqIEBwYXJhbSB7b2JqZWN0W119IHNpYmxpbmdzXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub2RlICh2YWx1ZSwgcm9vdCwgcGFyZW50LCB0eXBlLCBwcm9wcywgY2hpbGRyZW4sIGxlbmd0aCwgc2libGluZ3MpIHtcblx0cmV0dXJuIHt2YWx1ZTogdmFsdWUsIHJvb3Q6IHJvb3QsIHBhcmVudDogcGFyZW50LCB0eXBlOiB0eXBlLCBwcm9wczogcHJvcHMsIGNoaWxkcmVuOiBjaGlsZHJlbiwgbGluZTogbGluZSwgY29sdW1uOiBjb2x1bW4sIGxlbmd0aDogbGVuZ3RoLCByZXR1cm46ICcnLCBzaWJsaW5nczogc2libGluZ3N9XG59XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IHJvb3RcbiAqIEBwYXJhbSB7b2JqZWN0fSBwcm9wc1xuICogQHJldHVybiB7b2JqZWN0fVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29weSAocm9vdCwgcHJvcHMpIHtcblx0cmV0dXJuIGFzc2lnbihub2RlKCcnLCBudWxsLCBudWxsLCAnJywgbnVsbCwgbnVsbCwgMCwgcm9vdC5zaWJsaW5ncyksIHJvb3QsIHtsZW5ndGg6IC1yb290Lmxlbmd0aH0sIHByb3BzKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSByb290XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaWZ0IChyb290KSB7XG5cdHdoaWxlIChyb290LnJvb3QpXG5cdFx0cm9vdCA9IGNvcHkocm9vdC5yb290LCB7Y2hpbGRyZW46IFtyb290XX0pXG5cblx0YXBwZW5kKHJvb3QsIHJvb3Quc2libGluZ3MpXG59XG5cbi8qKlxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhciAoKSB7XG5cdHJldHVybiBjaGFyYWN0ZXJcbn1cblxuLyoqXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmV2ICgpIHtcblx0Y2hhcmFjdGVyID0gcG9zaXRpb24gPiAwID8gY2hhcmF0KGNoYXJhY3RlcnMsIC0tcG9zaXRpb24pIDogMFxuXG5cdGlmIChjb2x1bW4tLSwgY2hhcmFjdGVyID09PSAxMClcblx0XHRjb2x1bW4gPSAxLCBsaW5lLS1cblxuXHRyZXR1cm4gY2hhcmFjdGVyXG59XG5cbi8qKlxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gbmV4dCAoKSB7XG5cdGNoYXJhY3RlciA9IHBvc2l0aW9uIDwgbGVuZ3RoID8gY2hhcmF0KGNoYXJhY3RlcnMsIHBvc2l0aW9uKyspIDogMFxuXG5cdGlmIChjb2x1bW4rKywgY2hhcmFjdGVyID09PSAxMClcblx0XHRjb2x1bW4gPSAxLCBsaW5lKytcblxuXHRyZXR1cm4gY2hhcmFjdGVyXG59XG5cbi8qKlxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcGVlayAoKSB7XG5cdHJldHVybiBjaGFyYXQoY2hhcmFjdGVycywgcG9zaXRpb24pXG59XG5cbi8qKlxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FyZXQgKCkge1xuXHRyZXR1cm4gcG9zaXRpb25cbn1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gYmVnaW5cbiAqIEBwYXJhbSB7bnVtYmVyfSBlbmRcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNsaWNlIChiZWdpbiwgZW5kKSB7XG5cdHJldHVybiBzdWJzdHIoY2hhcmFjdGVycywgYmVnaW4sIGVuZClcbn1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdHlwZVxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9rZW4gKHR5cGUpIHtcblx0c3dpdGNoICh0eXBlKSB7XG5cdFx0Ly8gXFwwIFxcdCBcXG4gXFxyIFxccyB3aGl0ZXNwYWNlIHRva2VuXG5cdFx0Y2FzZSAwOiBjYXNlIDk6IGNhc2UgMTA6IGNhc2UgMTM6IGNhc2UgMzI6XG5cdFx0XHRyZXR1cm4gNVxuXHRcdC8vICEgKyAsIC8gPiBAIH4gaXNvbGF0ZSB0b2tlblxuXHRcdGNhc2UgMzM6IGNhc2UgNDM6IGNhc2UgNDQ6IGNhc2UgNDc6IGNhc2UgNjI6IGNhc2UgNjQ6IGNhc2UgMTI2OlxuXHRcdC8vIDsgeyB9IGJyZWFrcG9pbnQgdG9rZW5cblx0XHRjYXNlIDU5OiBjYXNlIDEyMzogY2FzZSAxMjU6XG5cdFx0XHRyZXR1cm4gNFxuXHRcdC8vIDogYWNjb21wYW5pZWQgdG9rZW5cblx0XHRjYXNlIDU4OlxuXHRcdFx0cmV0dXJuIDNcblx0XHQvLyBcIiAnICggWyBvcGVuaW5nIGRlbGltaXQgdG9rZW5cblx0XHRjYXNlIDM0OiBjYXNlIDM5OiBjYXNlIDQwOiBjYXNlIDkxOlxuXHRcdFx0cmV0dXJuIDJcblx0XHQvLyApIF0gY2xvc2luZyBkZWxpbWl0IHRva2VuXG5cdFx0Y2FzZSA0MTogY2FzZSA5Mzpcblx0XHRcdHJldHVybiAxXG5cdH1cblxuXHRyZXR1cm4gMFxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7YW55W119XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbGxvYyAodmFsdWUpIHtcblx0cmV0dXJuIGxpbmUgPSBjb2x1bW4gPSAxLCBsZW5ndGggPSBzdHJsZW4oY2hhcmFjdGVycyA9IHZhbHVlKSwgcG9zaXRpb24gPSAwLCBbXVxufVxuXG4vKipcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHJldHVybiB7YW55fVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVhbGxvYyAodmFsdWUpIHtcblx0cmV0dXJuIGNoYXJhY3RlcnMgPSAnJywgdmFsdWVcbn1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdHlwZVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVsaW1pdCAodHlwZSkge1xuXHRyZXR1cm4gdHJpbShzbGljZShwb3NpdGlvbiAtIDEsIGRlbGltaXRlcih0eXBlID09PSA5MSA/IHR5cGUgKyAyIDogdHlwZSA9PT0gNDAgPyB0eXBlICsgMSA6IHR5cGUpKSlcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm4ge3N0cmluZ1tdfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9rZW5pemUgKHZhbHVlKSB7XG5cdHJldHVybiBkZWFsbG9jKHRva2VuaXplcihhbGxvYyh2YWx1ZSkpKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSB0eXBlXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aGl0ZXNwYWNlICh0eXBlKSB7XG5cdHdoaWxlIChjaGFyYWN0ZXIgPSBwZWVrKCkpXG5cdFx0aWYgKGNoYXJhY3RlciA8IDMzKVxuXHRcdFx0bmV4dCgpXG5cdFx0ZWxzZVxuXHRcdFx0YnJlYWtcblxuXHRyZXR1cm4gdG9rZW4odHlwZSkgPiAyIHx8IHRva2VuKGNoYXJhY3RlcikgPiAzID8gJycgOiAnICdcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBjaGlsZHJlblxuICogQHJldHVybiB7c3RyaW5nW119XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b2tlbml6ZXIgKGNoaWxkcmVuKSB7XG5cdHdoaWxlIChuZXh0KCkpXG5cdFx0c3dpdGNoICh0b2tlbihjaGFyYWN0ZXIpKSB7XG5cdFx0XHRjYXNlIDA6IGFwcGVuZChpZGVudGlmaWVyKHBvc2l0aW9uIC0gMSksIGNoaWxkcmVuKVxuXHRcdFx0XHRicmVha1xuXHRcdFx0Y2FzZSAyOiBhcHBlbmQoZGVsaW1pdChjaGFyYWN0ZXIpLCBjaGlsZHJlbilcblx0XHRcdFx0YnJlYWtcblx0XHRcdGRlZmF1bHQ6IGFwcGVuZChmcm9tKGNoYXJhY3RlciksIGNoaWxkcmVuKVxuXHRcdH1cblxuXHRyZXR1cm4gY2hpbGRyZW5cbn1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudFxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBpbmcgKGluZGV4LCBjb3VudCkge1xuXHR3aGlsZSAoLS1jb3VudCAmJiBuZXh0KCkpXG5cdFx0Ly8gbm90IDAtOSBBLUYgYS1mXG5cdFx0aWYgKGNoYXJhY3RlciA8IDQ4IHx8IGNoYXJhY3RlciA+IDEwMiB8fCAoY2hhcmFjdGVyID4gNTcgJiYgY2hhcmFjdGVyIDwgNjUpIHx8IChjaGFyYWN0ZXIgPiA3MCAmJiBjaGFyYWN0ZXIgPCA5NykpXG5cdFx0XHRicmVha1xuXG5cdHJldHVybiBzbGljZShpbmRleCwgY2FyZXQoKSArIChjb3VudCA8IDYgJiYgcGVlaygpID09IDMyICYmIG5leHQoKSA9PSAzMikpXG59XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHR5cGVcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlbGltaXRlciAodHlwZSkge1xuXHR3aGlsZSAobmV4dCgpKVxuXHRcdHN3aXRjaCAoY2hhcmFjdGVyKSB7XG5cdFx0XHQvLyBdICkgXCIgJ1xuXHRcdFx0Y2FzZSB0eXBlOlxuXHRcdFx0XHRyZXR1cm4gcG9zaXRpb25cblx0XHRcdC8vIFwiICdcblx0XHRcdGNhc2UgMzQ6IGNhc2UgMzk6XG5cdFx0XHRcdGlmICh0eXBlICE9PSAzNCAmJiB0eXBlICE9PSAzOSlcblx0XHRcdFx0XHRkZWxpbWl0ZXIoY2hhcmFjdGVyKVxuXHRcdFx0XHRicmVha1xuXHRcdFx0Ly8gKFxuXHRcdFx0Y2FzZSA0MDpcblx0XHRcdFx0aWYgKHR5cGUgPT09IDQxKVxuXHRcdFx0XHRcdGRlbGltaXRlcih0eXBlKVxuXHRcdFx0XHRicmVha1xuXHRcdFx0Ly8gXFxcblx0XHRcdGNhc2UgOTI6XG5cdFx0XHRcdG5leHQoKVxuXHRcdFx0XHRicmVha1xuXHRcdH1cblxuXHRyZXR1cm4gcG9zaXRpb25cbn1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdHlwZVxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21tZW50ZXIgKHR5cGUsIGluZGV4KSB7XG5cdHdoaWxlIChuZXh0KCkpXG5cdFx0Ly8gLy9cblx0XHRpZiAodHlwZSArIGNoYXJhY3RlciA9PT0gNDcgKyAxMClcblx0XHRcdGJyZWFrXG5cdFx0Ly8gLypcblx0XHRlbHNlIGlmICh0eXBlICsgY2hhcmFjdGVyID09PSA0MiArIDQyICYmIHBlZWsoKSA9PT0gNDcpXG5cdFx0XHRicmVha1xuXG5cdHJldHVybiAnLyonICsgc2xpY2UoaW5kZXgsIHBvc2l0aW9uIC0gMSkgKyAnKicgKyBmcm9tKHR5cGUgPT09IDQ3ID8gdHlwZSA6IG5leHQoKSlcbn1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aWZpZXIgKGluZGV4KSB7XG5cdHdoaWxlICghdG9rZW4ocGVlaygpKSlcblx0XHRuZXh0KClcblxuXHRyZXR1cm4gc2xpY2UoaW5kZXgsIHBvc2l0aW9uKVxufVxuIiwgImltcG9ydCB7Q09NTUVOVCwgUlVMRVNFVCwgREVDTEFSQVRJT059IGZyb20gJy4vRW51bS5qcydcbmltcG9ydCB7YWJzLCBjaGFyYXQsIHRyaW0sIGZyb20sIHNpemVvZiwgc3RybGVuLCBzdWJzdHIsIGFwcGVuZCwgcmVwbGFjZSwgaW5kZXhvZn0gZnJvbSAnLi9VdGlsaXR5LmpzJ1xuaW1wb3J0IHtub2RlLCBjaGFyLCBwcmV2LCBuZXh0LCBwZWVrLCB0b2tlbiwgY2FyZXQsIGFsbG9jLCBkZWFsbG9jLCBkZWxpbWl0LCB3aGl0ZXNwYWNlLCBlc2NhcGluZywgaWRlbnRpZmllciwgY29tbWVudGVyfSBmcm9tICcuL1Rva2VuaXplci5qcydcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm4ge29iamVjdFtdfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcGlsZSAodmFsdWUpIHtcblx0cmV0dXJuIGRlYWxsb2MocGFyc2UoJycsIG51bGwsIG51bGwsIG51bGwsIFsnJ10sIHZhbHVlID0gYWxsb2ModmFsdWUpLCAwLCBbMF0sIHZhbHVlKSlcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7b2JqZWN0fSByb290XG4gKiBAcGFyYW0ge29iamVjdD99IHBhcmVudFxuICogQHBhcmFtIHtzdHJpbmdbXX0gcnVsZVxuICogQHBhcmFtIHtzdHJpbmdbXX0gcnVsZXNcbiAqIEBwYXJhbSB7c3RyaW5nW119IHJ1bGVzZXRzXG4gKiBAcGFyYW0ge251bWJlcltdfSBwc2V1ZG9cbiAqIEBwYXJhbSB7bnVtYmVyW119IHBvaW50c1xuICogQHBhcmFtIHtzdHJpbmdbXX0gZGVjbGFyYXRpb25zXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZSAodmFsdWUsIHJvb3QsIHBhcmVudCwgcnVsZSwgcnVsZXMsIHJ1bGVzZXRzLCBwc2V1ZG8sIHBvaW50cywgZGVjbGFyYXRpb25zKSB7XG5cdHZhciBpbmRleCA9IDBcblx0dmFyIG9mZnNldCA9IDBcblx0dmFyIGxlbmd0aCA9IHBzZXVkb1xuXHR2YXIgYXRydWxlID0gMFxuXHR2YXIgcHJvcGVydHkgPSAwXG5cdHZhciBwcmV2aW91cyA9IDBcblx0dmFyIHZhcmlhYmxlID0gMVxuXHR2YXIgc2Nhbm5pbmcgPSAxXG5cdHZhciBhbXBlcnNhbmQgPSAxXG5cdHZhciBjaGFyYWN0ZXIgPSAwXG5cdHZhciB0eXBlID0gJydcblx0dmFyIHByb3BzID0gcnVsZXNcblx0dmFyIGNoaWxkcmVuID0gcnVsZXNldHNcblx0dmFyIHJlZmVyZW5jZSA9IHJ1bGVcblx0dmFyIGNoYXJhY3RlcnMgPSB0eXBlXG5cblx0d2hpbGUgKHNjYW5uaW5nKVxuXHRcdHN3aXRjaCAocHJldmlvdXMgPSBjaGFyYWN0ZXIsIGNoYXJhY3RlciA9IG5leHQoKSkge1xuXHRcdFx0Ly8gKFxuXHRcdFx0Y2FzZSA0MDpcblx0XHRcdFx0aWYgKHByZXZpb3VzICE9IDEwOCAmJiBjaGFyYXQoY2hhcmFjdGVycywgbGVuZ3RoIC0gMSkgPT0gNTgpIHtcblx0XHRcdFx0XHRpZiAoaW5kZXhvZihjaGFyYWN0ZXJzICs9IHJlcGxhY2UoZGVsaW1pdChjaGFyYWN0ZXIpLCAnJicsICcmXFxmJyksICcmXFxmJywgYWJzKGluZGV4ID8gcG9pbnRzW2luZGV4IC0gMV0gOiAwKSkgIT0gLTEpXG5cdFx0XHRcdFx0XHRhbXBlcnNhbmQgPSAtMVxuXHRcdFx0XHRcdGJyZWFrXG5cdFx0XHRcdH1cblx0XHRcdC8vIFwiICcgW1xuXHRcdFx0Y2FzZSAzNDogY2FzZSAzOTogY2FzZSA5MTpcblx0XHRcdFx0Y2hhcmFjdGVycyArPSBkZWxpbWl0KGNoYXJhY3Rlcilcblx0XHRcdFx0YnJlYWtcblx0XHRcdC8vIFxcdCBcXG4gXFxyIFxcc1xuXHRcdFx0Y2FzZSA5OiBjYXNlIDEwOiBjYXNlIDEzOiBjYXNlIDMyOlxuXHRcdFx0XHRjaGFyYWN0ZXJzICs9IHdoaXRlc3BhY2UocHJldmlvdXMpXG5cdFx0XHRcdGJyZWFrXG5cdFx0XHQvLyBcXFxuXHRcdFx0Y2FzZSA5Mjpcblx0XHRcdFx0Y2hhcmFjdGVycyArPSBlc2NhcGluZyhjYXJldCgpIC0gMSwgNylcblx0XHRcdFx0Y29udGludWVcblx0XHRcdC8vIC9cblx0XHRcdGNhc2UgNDc6XG5cdFx0XHRcdHN3aXRjaCAocGVlaygpKSB7XG5cdFx0XHRcdFx0Y2FzZSA0MjogY2FzZSA0Nzpcblx0XHRcdFx0XHRcdGFwcGVuZChjb21tZW50KGNvbW1lbnRlcihuZXh0KCksIGNhcmV0KCkpLCByb290LCBwYXJlbnQsIGRlY2xhcmF0aW9ucyksIGRlY2xhcmF0aW9ucylcblx0XHRcdFx0XHRcdGlmICgodG9rZW4ocHJldmlvdXMgfHwgMSkgPT0gNSB8fCB0b2tlbihwZWVrKCkgfHwgMSkgPT0gNSkgJiYgc3RybGVuKGNoYXJhY3RlcnMpICYmIHN1YnN0cihjaGFyYWN0ZXJzLCAtMSwgdm9pZCAwKSAhPT0gJyAnKSBjaGFyYWN0ZXJzICs9ICcgJ1xuXHRcdFx0XHRcdFx0YnJlYWtcblx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0Y2hhcmFjdGVycyArPSAnLydcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVha1xuXHRcdFx0Ly8ge1xuXHRcdFx0Y2FzZSAxMjMgKiB2YXJpYWJsZTpcblx0XHRcdFx0cG9pbnRzW2luZGV4KytdID0gc3RybGVuKGNoYXJhY3RlcnMpICogYW1wZXJzYW5kXG5cdFx0XHQvLyB9IDsgXFwwXG5cdFx0XHRjYXNlIDEyNSAqIHZhcmlhYmxlOiBjYXNlIDU5OiBjYXNlIDA6XG5cdFx0XHRcdHN3aXRjaCAoY2hhcmFjdGVyKSB7XG5cdFx0XHRcdFx0Ly8gXFwwIH1cblx0XHRcdFx0XHRjYXNlIDA6IGNhc2UgMTI1OiBzY2FubmluZyA9IDBcblx0XHRcdFx0XHQvLyA7XG5cdFx0XHRcdFx0Y2FzZSA1OSArIG9mZnNldDogaWYgKGFtcGVyc2FuZCA9PSAtMSkgY2hhcmFjdGVycyA9IHJlcGxhY2UoY2hhcmFjdGVycywgL1xcZi9nLCAnJylcblx0XHRcdFx0XHRcdGlmIChwcm9wZXJ0eSA+IDAgJiYgKHN0cmxlbihjaGFyYWN0ZXJzKSAtIGxlbmd0aCB8fCAodmFyaWFibGUgPT09IDAgJiYgcHJldmlvdXMgPT09IDQ3KSkpXG5cdFx0XHRcdFx0XHRcdGFwcGVuZChwcm9wZXJ0eSA+IDMyID8gZGVjbGFyYXRpb24oY2hhcmFjdGVycyArICc7JywgcnVsZSwgcGFyZW50LCBsZW5ndGggLSAxLCBkZWNsYXJhdGlvbnMpIDogZGVjbGFyYXRpb24ocmVwbGFjZShjaGFyYWN0ZXJzLCAnICcsICcnKSArICc7JywgcnVsZSwgcGFyZW50LCBsZW5ndGggLSAyLCBkZWNsYXJhdGlvbnMpLCBkZWNsYXJhdGlvbnMpXG5cdFx0XHRcdFx0XHRicmVha1xuXHRcdFx0XHRcdC8vIEAgO1xuXHRcdFx0XHRcdGNhc2UgNTk6IGNoYXJhY3RlcnMgKz0gJzsnXG5cdFx0XHRcdFx0Ly8geyBydWxlL2F0LXJ1bGVcblx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0YXBwZW5kKHJlZmVyZW5jZSA9IHJ1bGVzZXQoY2hhcmFjdGVycywgcm9vdCwgcGFyZW50LCBpbmRleCwgb2Zmc2V0LCBydWxlcywgcG9pbnRzLCB0eXBlLCBwcm9wcyA9IFtdLCBjaGlsZHJlbiA9IFtdLCBsZW5ndGgsIHJ1bGVzZXRzKSwgcnVsZXNldHMpXG5cblx0XHRcdFx0XHRcdGlmIChjaGFyYWN0ZXIgPT09IDEyMylcblx0XHRcdFx0XHRcdFx0aWYgKG9mZnNldCA9PT0gMClcblx0XHRcdFx0XHRcdFx0XHRwYXJzZShjaGFyYWN0ZXJzLCByb290LCByZWZlcmVuY2UsIHJlZmVyZW5jZSwgcHJvcHMsIHJ1bGVzZXRzLCBsZW5ndGgsIHBvaW50cywgY2hpbGRyZW4pXG5cdFx0XHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHN3aXRjaCAoYXRydWxlKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBjKG9udGFpbmVyKVxuXHRcdFx0XHRcdFx0XHRcdFx0Y2FzZSA5OTpcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGNoYXJhdChjaGFyYWN0ZXJzLCAzKSA9PT0gMTEwKSBicmVha1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gbChheWVyKVxuXHRcdFx0XHRcdFx0XHRcdFx0Y2FzZSAxMDg6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChjaGFyYXQoY2hhcmFjdGVycywgMikgPT09IDk3KSBicmVha1xuXHRcdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0XHRcdFx0b2Zmc2V0ID0gMFxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gZChvY3VtZW50KSBtKGVkaWEpIHModXBwb3J0cylcblx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgMTAwOiBjYXNlIDEwOTogY2FzZSAxMTU6XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGlmIChvZmZzZXQpIHBhcnNlKHZhbHVlLCByZWZlcmVuY2UsIHJlZmVyZW5jZSwgcnVsZSAmJiBhcHBlbmQocnVsZXNldCh2YWx1ZSwgcmVmZXJlbmNlLCByZWZlcmVuY2UsIDAsIDAsIHJ1bGVzLCBwb2ludHMsIHR5cGUsIHJ1bGVzLCBwcm9wcyA9IFtdLCBsZW5ndGgsIGNoaWxkcmVuKSwgY2hpbGRyZW4pLCBydWxlcywgY2hpbGRyZW4sIGxlbmd0aCwgcG9pbnRzLCBydWxlID8gcHJvcHMgOiBjaGlsZHJlbilcblx0XHRcdFx0XHRcdFx0XHRlbHNlIHBhcnNlKGNoYXJhY3RlcnMsIHJlZmVyZW5jZSwgcmVmZXJlbmNlLCByZWZlcmVuY2UsIFsnJ10sIGNoaWxkcmVuLCAwLCBwb2ludHMsIGNoaWxkcmVuKVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpbmRleCA9IG9mZnNldCA9IHByb3BlcnR5ID0gMCwgdmFyaWFibGUgPSBhbXBlcnNhbmQgPSAxLCB0eXBlID0gY2hhcmFjdGVycyA9ICcnLCBsZW5ndGggPSBwc2V1ZG9cblx0XHRcdFx0YnJlYWtcblx0XHRcdC8vIDpcblx0XHRcdGNhc2UgNTg6XG5cdFx0XHRcdGxlbmd0aCA9IDEgKyBzdHJsZW4oY2hhcmFjdGVycyksIHByb3BlcnR5ID0gcHJldmlvdXNcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGlmICh2YXJpYWJsZSA8IDEpXG5cdFx0XHRcdFx0aWYgKGNoYXJhY3RlciA9PSAxMjMpXG5cdFx0XHRcdFx0XHQtLXZhcmlhYmxlXG5cdFx0XHRcdFx0ZWxzZSBpZiAoY2hhcmFjdGVyID09IDEyNSAmJiB2YXJpYWJsZSsrID09IDAgJiYgcHJldigpID09IDEyNSlcblx0XHRcdFx0XHRcdGNvbnRpbnVlXG5cblx0XHRcdFx0c3dpdGNoIChjaGFyYWN0ZXJzICs9IGZyb20oY2hhcmFjdGVyKSwgY2hhcmFjdGVyICogdmFyaWFibGUpIHtcblx0XHRcdFx0XHQvLyAmXG5cdFx0XHRcdFx0Y2FzZSAzODpcblx0XHRcdFx0XHRcdGFtcGVyc2FuZCA9IG9mZnNldCA+IDAgPyAxIDogKGNoYXJhY3RlcnMgKz0gJ1xcZicsIC0xKVxuXHRcdFx0XHRcdFx0YnJlYWtcblx0XHRcdFx0XHQvLyAsXG5cdFx0XHRcdFx0Y2FzZSA0NDpcblx0XHRcdFx0XHRcdHBvaW50c1tpbmRleCsrXSA9IChzdHJsZW4oY2hhcmFjdGVycykgLSAxKSAqIGFtcGVyc2FuZCwgYW1wZXJzYW5kID0gMVxuXHRcdFx0XHRcdFx0YnJlYWtcblx0XHRcdFx0XHQvLyBAXG5cdFx0XHRcdFx0Y2FzZSA2NDpcblx0XHRcdFx0XHRcdC8vIC1cblx0XHRcdFx0XHRcdGlmIChwZWVrKCkgPT09IDQ1KVxuXHRcdFx0XHRcdFx0XHRjaGFyYWN0ZXJzICs9IGRlbGltaXQobmV4dCgpKVxuXG5cdFx0XHRcdFx0XHRhdHJ1bGUgPSBwZWVrKCksIG9mZnNldCA9IGxlbmd0aCA9IHN0cmxlbih0eXBlID0gY2hhcmFjdGVycyArPSBpZGVudGlmaWVyKGNhcmV0KCkpKSwgY2hhcmFjdGVyKytcblx0XHRcdFx0XHRcdGJyZWFrXG5cdFx0XHRcdFx0Ly8gLVxuXHRcdFx0XHRcdGNhc2UgNDU6XG5cdFx0XHRcdFx0XHRpZiAocHJldmlvdXMgPT09IDQ1ICYmIHN0cmxlbihjaGFyYWN0ZXJzKSA9PSAyKVxuXHRcdFx0XHRcdFx0XHR2YXJpYWJsZSA9IDBcblx0XHRcdFx0fVxuXHRcdH1cblxuXHRyZXR1cm4gcnVsZXNldHNcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7b2JqZWN0fSByb290XG4gKiBAcGFyYW0ge29iamVjdD99IHBhcmVudFxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0XG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBydWxlc1xuICogQHBhcmFtIHtudW1iZXJbXX0gcG9pbnRzXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICogQHBhcmFtIHtzdHJpbmdbXX0gcHJvcHNcbiAqIEBwYXJhbSB7c3RyaW5nW119IGNoaWxkcmVuXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoXG4gKiBAcGFyYW0ge29iamVjdFtdfSBzaWJsaW5nc1xuICogQHJldHVybiB7b2JqZWN0fVxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVsZXNldCAodmFsdWUsIHJvb3QsIHBhcmVudCwgaW5kZXgsIG9mZnNldCwgcnVsZXMsIHBvaW50cywgdHlwZSwgcHJvcHMsIGNoaWxkcmVuLCBsZW5ndGgsIHNpYmxpbmdzKSB7XG5cdHZhciBwb3N0ID0gb2Zmc2V0IC0gMVxuXHR2YXIgcnVsZSA9IG9mZnNldCA9PT0gMCA/IHJ1bGVzIDogWycnXVxuXHR2YXIgc2l6ZSA9IHNpemVvZihydWxlKVxuXG5cdGZvciAodmFyIGkgPSAwLCBqID0gMCwgayA9IDA7IGkgPCBpbmRleDsgKytpKVxuXHRcdGZvciAodmFyIHggPSAwLCB5ID0gc3Vic3RyKHZhbHVlLCBwb3N0ICsgMSwgcG9zdCA9IGFicyhqID0gcG9pbnRzW2ldKSksIHogPSB2YWx1ZTsgeCA8IHNpemU7ICsreClcblx0XHRcdGlmICh6ID0gdHJpbShqID4gMCA/IHJ1bGVbeF0gKyAnICcgKyB5IDogcmVwbGFjZSh5LCAvJlxcZi9nLCBydWxlW3hdKSkpXG5cdFx0XHRcdHByb3BzW2srK10gPSB6XG5cblx0cmV0dXJuIG5vZGUodmFsdWUsIHJvb3QsIHBhcmVudCwgb2Zmc2V0ID09PSAwID8gUlVMRVNFVCA6IHR5cGUsIHByb3BzLCBjaGlsZHJlbiwgbGVuZ3RoLCBzaWJsaW5ncylcbn1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEBwYXJhbSB7b2JqZWN0fSByb290XG4gKiBAcGFyYW0ge29iamVjdD99IHBhcmVudFxuICogQHBhcmFtIHtvYmplY3RbXX0gc2libGluZ3NcbiAqIEByZXR1cm4ge29iamVjdH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbW1lbnQgKHZhbHVlLCByb290LCBwYXJlbnQsIHNpYmxpbmdzKSB7XG5cdHJldHVybiBub2RlKHZhbHVlLCByb290LCBwYXJlbnQsIENPTU1FTlQsIGZyb20oY2hhcigpKSwgc3Vic3RyKHZhbHVlLCAyLCAtMiksIDAsIHNpYmxpbmdzKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHBhcmFtIHtvYmplY3R9IHJvb3RcbiAqIEBwYXJhbSB7b2JqZWN0P30gcGFyZW50XG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoXG4gKiBAcGFyYW0ge29iamVjdFtdfSBzaWJsaW5nc1xuICogQHJldHVybiB7b2JqZWN0fVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjbGFyYXRpb24gKHZhbHVlLCByb290LCBwYXJlbnQsIGxlbmd0aCwgc2libGluZ3MpIHtcblx0cmV0dXJuIG5vZGUodmFsdWUsIHJvb3QsIHBhcmVudCwgREVDTEFSQVRJT04sIHN1YnN0cih2YWx1ZSwgMCwgbGVuZ3RoKSwgc3Vic3RyKHZhbHVlLCBsZW5ndGggKyAxLCAtMSksIGxlbmd0aCwgc2libGluZ3MpXG59XG4iLCAiaW1wb3J0IHtJTVBPUlQsIExBWUVSLCBDT01NRU5ULCBSVUxFU0VULCBERUNMQVJBVElPTiwgS0VZRlJBTUVTLCBOQU1FU1BBQ0V9IGZyb20gJy4vRW51bS5qcydcbmltcG9ydCB7c3RybGVufSBmcm9tICcuL1V0aWxpdHkuanMnXG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3RbXX0gY2hpbGRyZW5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemUgKGNoaWxkcmVuLCBjYWxsYmFjaykge1xuXHR2YXIgb3V0cHV0ID0gJydcblxuXHRmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKVxuXHRcdG91dHB1dCArPSBjYWxsYmFjayhjaGlsZHJlbltpXSwgaSwgY2hpbGRyZW4sIGNhbGxiYWNrKSB8fCAnJ1xuXG5cdHJldHVybiBvdXRwdXRcbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gZWxlbWVudFxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKiBAcGFyYW0ge29iamVjdFtdfSBjaGlsZHJlblxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeSAoZWxlbWVudCwgaW5kZXgsIGNoaWxkcmVuLCBjYWxsYmFjaykge1xuXHRzd2l0Y2ggKGVsZW1lbnQudHlwZSkge1xuXHRcdGNhc2UgTEFZRVI6IGlmIChlbGVtZW50LmNoaWxkcmVuLmxlbmd0aCkgYnJlYWtcblx0XHRjYXNlIElNUE9SVDogY2FzZSBOQU1FU1BBQ0U6IGNhc2UgREVDTEFSQVRJT046IHJldHVybiBlbGVtZW50LnJldHVybiA9IGVsZW1lbnQucmV0dXJuIHx8IGVsZW1lbnQudmFsdWVcblx0XHRjYXNlIENPTU1FTlQ6IHJldHVybiAnJ1xuXHRcdGNhc2UgS0VZRlJBTUVTOiByZXR1cm4gZWxlbWVudC5yZXR1cm4gPSBlbGVtZW50LnZhbHVlICsgJ3snICsgc2VyaWFsaXplKGVsZW1lbnQuY2hpbGRyZW4sIGNhbGxiYWNrKSArICd9J1xuXHRcdGNhc2UgUlVMRVNFVDogaWYgKCFzdHJsZW4oZWxlbWVudC52YWx1ZSA9IGVsZW1lbnQucHJvcHMuam9pbignLCcpKSkgcmV0dXJuICcnXG5cdH1cblxuXHRyZXR1cm4gc3RybGVuKGNoaWxkcmVuID0gc2VyaWFsaXplKGVsZW1lbnQuY2hpbGRyZW4sIGNhbGxiYWNrKSkgPyBlbGVtZW50LnJldHVybiA9IGVsZW1lbnQudmFsdWUgKyAneycgKyBjaGlsZHJlbiArICd9JyA6ICcnXG59XG4iLCAiaW1wb3J0IGRldldhcm5pbmcgZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuZXhwb3J0IGZ1bmN0aW9uIGxpbnRXYXJuaW5nKG1lc3NhZ2UsIGluZm8pIHtcbiAgdmFyIHBhdGggPSBpbmZvLnBhdGgsXG4gICAgcGFyZW50U2VsZWN0b3JzID0gaW5mby5wYXJlbnRTZWxlY3RvcnM7XG4gIGRldldhcm5pbmcoZmFsc2UsIFwiW0FudCBEZXNpZ24gQ1NTLWluLUpTXSBcIi5jb25jYXQocGF0aCA/IFwiRXJyb3IgaW4gXCIuY29uY2F0KHBhdGgsIFwiOiBcIikgOiAnJykuY29uY2F0KG1lc3NhZ2UpLmNvbmNhdChwYXJlbnRTZWxlY3RvcnMubGVuZ3RoID8gXCIgU2VsZWN0b3I6IFwiLmNvbmNhdChwYXJlbnRTZWxlY3RvcnMuam9pbignIHwgJykpIDogJycpKTtcbn0iLCAiaW1wb3J0IHsgbGludFdhcm5pbmcgfSBmcm9tIFwiLi91dGlsc1wiO1xudmFyIGxpbnRlciA9IGZ1bmN0aW9uIGxpbnRlcihrZXksIHZhbHVlLCBpbmZvKSB7XG4gIGlmIChrZXkgPT09ICdjb250ZW50Jykge1xuICAgIC8vIEZyb20gZW1vdGlvbjogaHR0cHM6Ly9naXRodWIuY29tL2Vtb3Rpb24tanMvZW1vdGlvbi9ibG9iL21haW4vcGFja2FnZXMvc2VyaWFsaXplL3NyYy9pbmRleC5qcyNMNjNcbiAgICB2YXIgY29udGVudFZhbHVlUGF0dGVybiA9IC8oYXR0cnxjb3VudGVycz98dXJsfCgoKHJlcGVhdGluZy0pPyhsaW5lYXJ8cmFkaWFsKSl8Y29uaWMpLWdyYWRpZW50KVxcKHwobm8tKT8ob3BlbnxjbG9zZSktcXVvdGUvO1xuICAgIHZhciBjb250ZW50VmFsdWVzID0gWydub3JtYWwnLCAnbm9uZScsICdpbml0aWFsJywgJ2luaGVyaXQnLCAndW5zZXQnXTtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyB8fCBjb250ZW50VmFsdWVzLmluZGV4T2YodmFsdWUpID09PSAtMSAmJiAhY29udGVudFZhbHVlUGF0dGVybi50ZXN0KHZhbHVlKSAmJiAodmFsdWUuY2hhckF0KDApICE9PSB2YWx1ZS5jaGFyQXQodmFsdWUubGVuZ3RoIC0gMSkgfHwgdmFsdWUuY2hhckF0KDApICE9PSAnXCInICYmIHZhbHVlLmNoYXJBdCgwKSAhPT0gXCInXCIpKSB7XG4gICAgICBsaW50V2FybmluZyhcIllvdSBzZWVtIHRvIGJlIHVzaW5nIGEgdmFsdWUgZm9yICdjb250ZW50JyB3aXRob3V0IHF1b3RlcywgdHJ5IHJlcGxhY2luZyBpdCB3aXRoIGBjb250ZW50OiAnXFxcIlwiLmNvbmNhdCh2YWx1ZSwgXCJcXFwiJ2AuXCIpLCBpbmZvKTtcbiAgICB9XG4gIH1cbn07XG5leHBvcnQgZGVmYXVsdCBsaW50ZXI7IiwgImltcG9ydCB7IGxpbnRXYXJuaW5nIH0gZnJvbSBcIi4vdXRpbHNcIjtcbnZhciBsaW50ZXIgPSBmdW5jdGlvbiBsaW50ZXIoa2V5LCB2YWx1ZSwgaW5mbykge1xuICBpZiAoa2V5ID09PSAnYW5pbWF0aW9uJykge1xuICAgIGlmIChpbmZvLmhhc2hJZCAmJiB2YWx1ZSAhPT0gJ25vbmUnKSB7XG4gICAgICBsaW50V2FybmluZyhcIllvdSBzZWVtIHRvIGJlIHVzaW5nIGhhc2hlZCBhbmltYXRpb24gJ1wiLmNvbmNhdCh2YWx1ZSwgXCInLCBpbiB3aGljaCBjYXNlICdhbmltYXRpb25OYW1lJyB3aXRoIEtleWZyYW1lIGFzIHZhbHVlIGlzIHJlY29tbWVuZGVkLlwiKSwgaW5mbyk7XG4gICAgfVxuICB9XG59O1xuZXhwb3J0IGRlZmF1bHQgbGludGVyOyIsICJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBjYW5Vc2VEb20gZnJvbSBcInJjLXV0aWwvZXMvRG9tL2NhblVzZURvbVwiO1xuaW1wb3J0IHsgQVRUUl9NQVJLIH0gZnJvbSBcIi4uL1N0eWxlQ29udGV4dFwiO1xuZXhwb3J0IHZhciBBVFRSX0NBQ0hFX01BUCA9ICdkYXRhLWFudC1jc3NpbmpzLWNhY2hlLXBhdGgnO1xuXG4vKipcbiAqIFRoaXMgbWFya3Mgc3R5bGUgZnJvbSB0aGUgY3NzIGZpbGUuXG4gKiBXaGljaCBtZWFucyBub3QgZXhpc3QgaW4gYDxzdHlsZSAvPmAgdGFnLlxuICovXG5leHBvcnQgdmFyIENTU19GSUxFX1NUWUxFID0gJ19GSUxFX1NUWUxFX18nO1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZShjYWNoZVBhdGhNYXApIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKGNhY2hlUGF0aE1hcCkubWFwKGZ1bmN0aW9uIChwYXRoKSB7XG4gICAgdmFyIGhhc2ggPSBjYWNoZVBhdGhNYXBbcGF0aF07XG4gICAgcmV0dXJuIFwiXCIuY29uY2F0KHBhdGgsIFwiOlwiKS5jb25jYXQoaGFzaCk7XG4gIH0pLmpvaW4oJzsnKTtcbn1cbnZhciBjYWNoZVBhdGhNYXA7XG52YXIgZnJvbUNTU0ZpbGUgPSB0cnVlO1xuXG4vKipcbiAqIEBwcml2YXRlIFRlc3QgdXNhZ2Ugb25seS4gQ2FuIHNhdmUgcmVtb3ZlIGlmIG5vIG5lZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNldChtb2NrQ2FjaGUpIHtcbiAgdmFyIGZyb21GaWxlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB0cnVlO1xuICBjYWNoZVBhdGhNYXAgPSBtb2NrQ2FjaGU7XG4gIGZyb21DU1NGaWxlID0gZnJvbUZpbGU7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZSgpIHtcbiAgaWYgKCFjYWNoZVBhdGhNYXApIHtcbiAgICBjYWNoZVBhdGhNYXAgPSB7fTtcbiAgICBpZiAoY2FuVXNlRG9tKCkpIHtcbiAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGRpdi5jbGFzc05hbWUgPSBBVFRSX0NBQ0hFX01BUDtcbiAgICAgIGRpdi5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7XG4gICAgICBkaXYuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgZGl2LnN0eWxlLnRvcCA9ICctOTk5OXB4JztcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgICAgIHZhciBjb250ZW50ID0gZ2V0Q29tcHV0ZWRTdHlsZShkaXYpLmNvbnRlbnQgfHwgJyc7XG4gICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKC9eXCIvLCAnJykucmVwbGFjZSgvXCIkLywgJycpO1xuXG4gICAgICAvLyBGaWxsIGRhdGFcbiAgICAgIGNvbnRlbnQuc3BsaXQoJzsnKS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHZhciBfaXRlbSRzcGxpdCA9IGl0ZW0uc3BsaXQoJzonKSxcbiAgICAgICAgICBfaXRlbSRzcGxpdDIgPSBfc2xpY2VkVG9BcnJheShfaXRlbSRzcGxpdCwgMiksXG4gICAgICAgICAgcGF0aCA9IF9pdGVtJHNwbGl0MlswXSxcbiAgICAgICAgICBoYXNoID0gX2l0ZW0kc3BsaXQyWzFdO1xuICAgICAgICBjYWNoZVBhdGhNYXBbcGF0aF0gPSBoYXNoO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFJlbW92ZSBpbmxpbmUgcmVjb3JkIHN0eWxlXG4gICAgICB2YXIgaW5saW5lTWFwU3R5bGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwic3R5bGVbXCIuY29uY2F0KEFUVFJfQ0FDSEVfTUFQLCBcIl1cIikpO1xuICAgICAgaWYgKGlubGluZU1hcFN0eWxlKSB7XG4gICAgICAgIHZhciBfaW5saW5lTWFwU3R5bGUkcGFyZW47XG4gICAgICAgIGZyb21DU1NGaWxlID0gZmFsc2U7XG4gICAgICAgIChfaW5saW5lTWFwU3R5bGUkcGFyZW4gPSBpbmxpbmVNYXBTdHlsZS5wYXJlbnROb2RlKSA9PT0gbnVsbCB8fCBfaW5saW5lTWFwU3R5bGUkcGFyZW4gPT09IHZvaWQgMCB8fCBfaW5saW5lTWFwU3R5bGUkcGFyZW4ucmVtb3ZlQ2hpbGQoaW5saW5lTWFwU3R5bGUpO1xuICAgICAgfVxuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChkaXYpO1xuICAgIH1cbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGV4aXN0UGF0aChwYXRoKSB7XG4gIHByZXBhcmUoKTtcbiAgcmV0dXJuICEhY2FjaGVQYXRoTWFwW3BhdGhdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0eWxlQW5kSGFzaChwYXRoKSB7XG4gIHZhciBoYXNoID0gY2FjaGVQYXRoTWFwW3BhdGhdO1xuICB2YXIgc3R5bGVTdHIgPSBudWxsO1xuICBpZiAoaGFzaCAmJiBjYW5Vc2VEb20oKSkge1xuICAgIGlmIChmcm9tQ1NTRmlsZSkge1xuICAgICAgc3R5bGVTdHIgPSBDU1NfRklMRV9TVFlMRTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIF9zdHlsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJzdHlsZVtcIi5jb25jYXQoQVRUUl9NQVJLLCBcIj1cXFwiXCIpLmNvbmNhdChjYWNoZVBhdGhNYXBbcGF0aF0sIFwiXFxcIl1cIikpO1xuICAgICAgaWYgKF9zdHlsZSkge1xuICAgICAgICBzdHlsZVN0ciA9IF9zdHlsZS5pbm5lckhUTUw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDbGVhbiB1cCBzaW5jZSBub3QgZXhpc3QgYW55bW9yZVxuICAgICAgICBkZWxldGUgY2FjaGVQYXRoTWFwW3BhdGhdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gW3N0eWxlU3RyLCBoYXNoXTtcbn0iLCAiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xudmFyIF9FeHRyYWN0U3R5bGVGbnM7XG5pbXBvcnQgeyBleHRyYWN0IGFzIHRva2VuRXh0cmFjdFN0eWxlLCBUT0tFTl9QUkVGSVggfSBmcm9tIFwiLi9ob29rcy91c2VDYWNoZVRva2VuXCI7XG5pbXBvcnQgeyBDU1NfVkFSX1BSRUZJWCwgZXh0cmFjdCBhcyBjc3NWYXJFeHRyYWN0U3R5bGUgfSBmcm9tIFwiLi9ob29rcy91c2VDU1NWYXJSZWdpc3RlclwiO1xuaW1wb3J0IHsgZXh0cmFjdCBhcyBzdHlsZUV4dHJhY3RTdHlsZSwgU1RZTEVfUFJFRklYIH0gZnJvbSBcIi4vaG9va3MvdXNlU3R5bGVSZWdpc3RlclwiO1xuaW1wb3J0IHsgdG9TdHlsZVN0ciB9IGZyb20gXCIuL3V0aWxcIjtcbmltcG9ydCB7IEFUVFJfQ0FDSEVfTUFQLCBzZXJpYWxpemUgYXMgc2VyaWFsaXplQ2FjaGVNYXAgfSBmcm9tIFwiLi91dGlsL2NhY2hlTWFwVXRpbFwiO1xudmFyIEV4dHJhY3RTdHlsZUZucyA9IChfRXh0cmFjdFN0eWxlRm5zID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfRXh0cmFjdFN0eWxlRm5zLCBTVFlMRV9QUkVGSVgsIHN0eWxlRXh0cmFjdFN0eWxlKSwgX2RlZmluZVByb3BlcnR5KF9FeHRyYWN0U3R5bGVGbnMsIFRPS0VOX1BSRUZJWCwgdG9rZW5FeHRyYWN0U3R5bGUpLCBfZGVmaW5lUHJvcGVydHkoX0V4dHJhY3RTdHlsZUZucywgQ1NTX1ZBUl9QUkVGSVgsIGNzc1ZhckV4dHJhY3RTdHlsZSksIF9FeHRyYWN0U3R5bGVGbnMpO1xuZnVuY3Rpb24gaXNOb3ROdWxsKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbDtcbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGV4dHJhY3RTdHlsZShjYWNoZSwgb3B0aW9ucykge1xuICB2YXIgX3JlZiA9IHR5cGVvZiBvcHRpb25zID09PSAnYm9vbGVhbicgPyB7XG4gICAgICBwbGFpbjogb3B0aW9uc1xuICAgIH0gOiBvcHRpb25zIHx8IHt9LFxuICAgIF9yZWYkcGxhaW4gPSBfcmVmLnBsYWluLFxuICAgIHBsYWluID0gX3JlZiRwbGFpbiA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmJHBsYWluLFxuICAgIF9yZWYkdHlwZXMgPSBfcmVmLnR5cGVzLFxuICAgIHR5cGVzID0gX3JlZiR0eXBlcyA9PT0gdm9pZCAwID8gWydzdHlsZScsICd0b2tlbicsICdjc3NWYXInXSA6IF9yZWYkdHlwZXM7XG4gIHZhciBtYXRjaFByZWZpeFJlZ2V4cCA9IG5ldyBSZWdFeHAoXCJeKFwiLmNvbmNhdCgodHlwZW9mIHR5cGVzID09PSAnc3RyaW5nJyA/IFt0eXBlc10gOiB0eXBlcykuam9pbignfCcpLCBcIiklXCIpKTtcblxuICAvLyBwcmVmaXggd2l0aCBgc3R5bGVgIGlzIHVzZWQgZm9yIGB1c2VTdHlsZVJlZ2lzdGVyYCB0byBjYWNoZSBzdHlsZSBjb250ZXh0XG4gIHZhciBzdHlsZUtleXMgPSBBcnJheS5mcm9tKGNhY2hlLmNhY2hlLmtleXMoKSkuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gbWF0Y2hQcmVmaXhSZWdleHAudGVzdChrZXkpO1xuICB9KTtcblxuICAvLyBDb21tb24gZWZmZWN0IHN0eWxlcyBsaWtlIGFuaW1hdGlvblxuICB2YXIgZWZmZWN0U3R5bGVzID0ge307XG5cbiAgLy8gTWFwcGluZyBvZiBjYWNoZVBhdGggdG8gc3R5bGUgaGFzaFxuICB2YXIgY2FjaGVQYXRoTWFwID0ge307XG4gIHZhciBzdHlsZVRleHQgPSAnJztcbiAgc3R5bGVLZXlzLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIGNhY2hlUGF0aCA9IGtleS5yZXBsYWNlKG1hdGNoUHJlZml4UmVnZXhwLCAnJykucmVwbGFjZSgvJS9nLCAnfCcpO1xuICAgIHZhciBfa2V5JHNwbGl0ID0ga2V5LnNwbGl0KCclJyksXG4gICAgICBfa2V5JHNwbGl0MiA9IF9zbGljZWRUb0FycmF5KF9rZXkkc3BsaXQsIDEpLFxuICAgICAgcHJlZml4ID0gX2tleSRzcGxpdDJbMF07XG4gICAgdmFyIGV4dHJhY3RGbiA9IEV4dHJhY3RTdHlsZUZuc1twcmVmaXhdO1xuICAgIHZhciBleHRyYWN0ZWRTdHlsZSA9IGV4dHJhY3RGbihjYWNoZS5jYWNoZS5nZXQoa2V5KVsxXSwgZWZmZWN0U3R5bGVzLCB7XG4gICAgICBwbGFpbjogcGxhaW5cbiAgICB9KTtcbiAgICBpZiAoIWV4dHJhY3RlZFN0eWxlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIF9leHRyYWN0ZWRTdHlsZSA9IF9zbGljZWRUb0FycmF5KGV4dHJhY3RlZFN0eWxlLCAzKSxcbiAgICAgIG9yZGVyID0gX2V4dHJhY3RlZFN0eWxlWzBdLFxuICAgICAgc3R5bGVJZCA9IF9leHRyYWN0ZWRTdHlsZVsxXSxcbiAgICAgIHN0eWxlU3RyID0gX2V4dHJhY3RlZFN0eWxlWzJdO1xuICAgIGlmIChrZXkuc3RhcnRzV2l0aCgnc3R5bGUnKSkge1xuICAgICAgY2FjaGVQYXRoTWFwW2NhY2hlUGF0aF0gPSBzdHlsZUlkO1xuICAgIH1cbiAgICByZXR1cm4gW29yZGVyLCBzdHlsZVN0cl07XG4gIH0pLmZpbHRlcihpc05vdE51bGwpLnNvcnQoZnVuY3Rpb24gKF9yZWYyLCBfcmVmMykge1xuICAgIHZhciBfcmVmNCA9IF9zbGljZWRUb0FycmF5KF9yZWYyLCAxKSxcbiAgICAgIG8xID0gX3JlZjRbMF07XG4gICAgdmFyIF9yZWY1ID0gX3NsaWNlZFRvQXJyYXkoX3JlZjMsIDEpLFxuICAgICAgbzIgPSBfcmVmNVswXTtcbiAgICByZXR1cm4gbzEgLSBvMjtcbiAgfSkuZm9yRWFjaChmdW5jdGlvbiAoX3JlZjYpIHtcbiAgICB2YXIgX3JlZjcgPSBfc2xpY2VkVG9BcnJheShfcmVmNiwgMiksXG4gICAgICBzdHlsZSA9IF9yZWY3WzFdO1xuICAgIHN0eWxlVGV4dCArPSBzdHlsZTtcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gRmlsbCBDYWNoZSBQYXRoID09PT09PT09PT09PT09PT09PT09XG4gIHN0eWxlVGV4dCArPSB0b1N0eWxlU3RyKFwiLlwiLmNvbmNhdChBVFRSX0NBQ0hFX01BUCwgXCJ7Y29udGVudDpcXFwiXCIpLmNvbmNhdChzZXJpYWxpemVDYWNoZU1hcChjYWNoZVBhdGhNYXApLCBcIlxcXCI7fVwiKSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIF9kZWZpbmVQcm9wZXJ0eSh7fSwgQVRUUl9DQUNIRV9NQVAsIEFUVFJfQ0FDSEVfTUFQKSwgcGxhaW4pO1xuICByZXR1cm4gc3R5bGVUZXh0O1xufSIsICJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG52YXIgS2V5ZnJhbWUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBLZXlmcmFtZShuYW1lLCBzdHlsZSkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBLZXlmcmFtZSk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwibmFtZVwiLCB2b2lkIDApO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInN0eWxlXCIsIHZvaWQgMCk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiX2tleWZyYW1lXCIsIHRydWUpO1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5zdHlsZSA9IHN0eWxlO1xuICB9XG4gIF9jcmVhdGVDbGFzcyhLZXlmcmFtZSwgW3tcbiAgICBrZXk6IFwiZ2V0TmFtZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXROYW1lKCkge1xuICAgICAgdmFyIGhhc2hJZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJyc7XG4gICAgICByZXR1cm4gaGFzaElkID8gXCJcIi5jb25jYXQoaGFzaElkLCBcIi1cIikuY29uY2F0KHRoaXMubmFtZSkgOiB0aGlzLm5hbWU7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBLZXlmcmFtZTtcbn0oKTtcbmV4cG9ydCBkZWZhdWx0IEtleWZyYW1lOyIsICJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmZ1bmN0aW9uIHNwbGl0VmFsdWVzKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIFtbdmFsdWVdLCBmYWxzZV07XG4gIH1cbiAgdmFyIHJhd1N0eWxlID0gU3RyaW5nKHZhbHVlKS50cmltKCk7XG4gIHZhciBpbXBvcnRhbnRDZWxscyA9IHJhd1N0eWxlLm1hdGNoKC8oLiopKCFpbXBvcnRhbnQpLyk7XG4gIHZhciBzcGxpdFN0eWxlID0gKGltcG9ydGFudENlbGxzID8gaW1wb3J0YW50Q2VsbHNbMV0gOiByYXdTdHlsZSkudHJpbSgpLnNwbGl0KC9cXHMrLyk7XG5cbiAgLy8gQ29tYmluZSBzdHlsZXMgc3BsaXQgaW4gYnJhY2tldHMsIGxpa2UgYGNhbGMoMXB4ICsgMnB4KWBcbiAgdmFyIHRlbXAgPSBbXTtcbiAgdmFyIGJyYWNrZXRzID0gMDtcbiAgcmV0dXJuIFtzcGxpdFN0eWxlLnJlZHVjZShmdW5jdGlvbiAobGlzdCwgaXRlbSkge1xuICAgIGlmIChpdGVtLmluY2x1ZGVzKCcoJykgfHwgaXRlbS5pbmNsdWRlcygnKScpKSB7XG4gICAgICB2YXIgbGVmdCA9IGl0ZW0uc3BsaXQoJygnKS5sZW5ndGggLSAxO1xuICAgICAgdmFyIHJpZ2h0ID0gaXRlbS5zcGxpdCgnKScpLmxlbmd0aCAtIDE7XG4gICAgICBicmFja2V0cyArPSBsZWZ0IC0gcmlnaHQ7XG4gICAgfVxuICAgIGlmIChicmFja2V0cyA+PSAwKSB0ZW1wLnB1c2goaXRlbSk7XG4gICAgaWYgKGJyYWNrZXRzID09PSAwKSB7XG4gICAgICBsaXN0LnB1c2godGVtcC5qb2luKCcgJykpO1xuICAgICAgdGVtcCA9IFtdO1xuICAgIH1cbiAgICByZXR1cm4gbGlzdDtcbiAgfSwgW10pLCAhIWltcG9ydGFudENlbGxzXTtcbn1cbmZ1bmN0aW9uIG5vU3BsaXQobGlzdCkge1xuICBsaXN0Lm5vdFNwbGl0ID0gdHJ1ZTtcbiAgcmV0dXJuIGxpc3Q7XG59XG52YXIga2V5TWFwID0ge1xuICAvLyBJbnNldFxuICBpbnNldDogWyd0b3AnLCAncmlnaHQnLCAnYm90dG9tJywgJ2xlZnQnXSxcbiAgaW5zZXRCbG9jazogWyd0b3AnLCAnYm90dG9tJ10sXG4gIGluc2V0QmxvY2tTdGFydDogWyd0b3AnXSxcbiAgaW5zZXRCbG9ja0VuZDogWydib3R0b20nXSxcbiAgaW5zZXRJbmxpbmU6IFsnbGVmdCcsICdyaWdodCddLFxuICBpbnNldElubGluZVN0YXJ0OiBbJ2xlZnQnXSxcbiAgaW5zZXRJbmxpbmVFbmQ6IFsncmlnaHQnXSxcbiAgLy8gTWFyZ2luXG4gIG1hcmdpbkJsb2NrOiBbJ21hcmdpblRvcCcsICdtYXJnaW5Cb3R0b20nXSxcbiAgbWFyZ2luQmxvY2tTdGFydDogWydtYXJnaW5Ub3AnXSxcbiAgbWFyZ2luQmxvY2tFbmQ6IFsnbWFyZ2luQm90dG9tJ10sXG4gIG1hcmdpbklubGluZTogWydtYXJnaW5MZWZ0JywgJ21hcmdpblJpZ2h0J10sXG4gIG1hcmdpbklubGluZVN0YXJ0OiBbJ21hcmdpbkxlZnQnXSxcbiAgbWFyZ2luSW5saW5lRW5kOiBbJ21hcmdpblJpZ2h0J10sXG4gIC8vIFBhZGRpbmdcbiAgcGFkZGluZ0Jsb2NrOiBbJ3BhZGRpbmdUb3AnLCAncGFkZGluZ0JvdHRvbSddLFxuICBwYWRkaW5nQmxvY2tTdGFydDogWydwYWRkaW5nVG9wJ10sXG4gIHBhZGRpbmdCbG9ja0VuZDogWydwYWRkaW5nQm90dG9tJ10sXG4gIHBhZGRpbmdJbmxpbmU6IFsncGFkZGluZ0xlZnQnLCAncGFkZGluZ1JpZ2h0J10sXG4gIHBhZGRpbmdJbmxpbmVTdGFydDogWydwYWRkaW5nTGVmdCddLFxuICBwYWRkaW5nSW5saW5lRW5kOiBbJ3BhZGRpbmdSaWdodCddLFxuICAvLyBCb3JkZXJcbiAgYm9yZGVyQmxvY2s6IG5vU3BsaXQoWydib3JkZXJUb3AnLCAnYm9yZGVyQm90dG9tJ10pLFxuICBib3JkZXJCbG9ja1N0YXJ0OiBub1NwbGl0KFsnYm9yZGVyVG9wJ10pLFxuICBib3JkZXJCbG9ja0VuZDogbm9TcGxpdChbJ2JvcmRlckJvdHRvbSddKSxcbiAgYm9yZGVySW5saW5lOiBub1NwbGl0KFsnYm9yZGVyTGVmdCcsICdib3JkZXJSaWdodCddKSxcbiAgYm9yZGVySW5saW5lU3RhcnQ6IG5vU3BsaXQoWydib3JkZXJMZWZ0J10pLFxuICBib3JkZXJJbmxpbmVFbmQ6IG5vU3BsaXQoWydib3JkZXJSaWdodCddKSxcbiAgLy8gQm9yZGVyIHdpZHRoXG4gIGJvcmRlckJsb2NrV2lkdGg6IFsnYm9yZGVyVG9wV2lkdGgnLCAnYm9yZGVyQm90dG9tV2lkdGgnXSxcbiAgYm9yZGVyQmxvY2tTdGFydFdpZHRoOiBbJ2JvcmRlclRvcFdpZHRoJ10sXG4gIGJvcmRlckJsb2NrRW5kV2lkdGg6IFsnYm9yZGVyQm90dG9tV2lkdGgnXSxcbiAgYm9yZGVySW5saW5lV2lkdGg6IFsnYm9yZGVyTGVmdFdpZHRoJywgJ2JvcmRlclJpZ2h0V2lkdGgnXSxcbiAgYm9yZGVySW5saW5lU3RhcnRXaWR0aDogWydib3JkZXJMZWZ0V2lkdGgnXSxcbiAgYm9yZGVySW5saW5lRW5kV2lkdGg6IFsnYm9yZGVyUmlnaHRXaWR0aCddLFxuICAvLyBCb3JkZXIgc3R5bGVcbiAgYm9yZGVyQmxvY2tTdHlsZTogWydib3JkZXJUb3BTdHlsZScsICdib3JkZXJCb3R0b21TdHlsZSddLFxuICBib3JkZXJCbG9ja1N0YXJ0U3R5bGU6IFsnYm9yZGVyVG9wU3R5bGUnXSxcbiAgYm9yZGVyQmxvY2tFbmRTdHlsZTogWydib3JkZXJCb3R0b21TdHlsZSddLFxuICBib3JkZXJJbmxpbmVTdHlsZTogWydib3JkZXJMZWZ0U3R5bGUnLCAnYm9yZGVyUmlnaHRTdHlsZSddLFxuICBib3JkZXJJbmxpbmVTdGFydFN0eWxlOiBbJ2JvcmRlckxlZnRTdHlsZSddLFxuICBib3JkZXJJbmxpbmVFbmRTdHlsZTogWydib3JkZXJSaWdodFN0eWxlJ10sXG4gIC8vIEJvcmRlciBjb2xvclxuICBib3JkZXJCbG9ja0NvbG9yOiBbJ2JvcmRlclRvcENvbG9yJywgJ2JvcmRlckJvdHRvbUNvbG9yJ10sXG4gIGJvcmRlckJsb2NrU3RhcnRDb2xvcjogWydib3JkZXJUb3BDb2xvciddLFxuICBib3JkZXJCbG9ja0VuZENvbG9yOiBbJ2JvcmRlckJvdHRvbUNvbG9yJ10sXG4gIGJvcmRlcklubGluZUNvbG9yOiBbJ2JvcmRlckxlZnRDb2xvcicsICdib3JkZXJSaWdodENvbG9yJ10sXG4gIGJvcmRlcklubGluZVN0YXJ0Q29sb3I6IFsnYm9yZGVyTGVmdENvbG9yJ10sXG4gIGJvcmRlcklubGluZUVuZENvbG9yOiBbJ2JvcmRlclJpZ2h0Q29sb3InXSxcbiAgLy8gQm9yZGVyIHJhZGl1c1xuICBib3JkZXJTdGFydFN0YXJ0UmFkaXVzOiBbJ2JvcmRlclRvcExlZnRSYWRpdXMnXSxcbiAgYm9yZGVyU3RhcnRFbmRSYWRpdXM6IFsnYm9yZGVyVG9wUmlnaHRSYWRpdXMnXSxcbiAgYm9yZGVyRW5kU3RhcnRSYWRpdXM6IFsnYm9yZGVyQm90dG9tTGVmdFJhZGl1cyddLFxuICBib3JkZXJFbmRFbmRSYWRpdXM6IFsnYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMnXVxufTtcbmZ1bmN0aW9uIHdyYXBJbXBvcnRhbnRBbmRTa2lwQ2hlY2sodmFsdWUsIGltcG9ydGFudCkge1xuICB2YXIgcGFyc2VkVmFsdWUgPSB2YWx1ZTtcbiAgaWYgKGltcG9ydGFudCkge1xuICAgIHBhcnNlZFZhbHVlID0gXCJcIi5jb25jYXQocGFyc2VkVmFsdWUsIFwiICFpbXBvcnRhbnRcIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBfc2tpcF9jaGVja186IHRydWUsXG4gICAgdmFsdWU6IHBhcnNlZFZhbHVlXG4gIH07XG59XG5cbi8qKlxuICogQ29udmVydCBjc3MgbG9naWNhbCBwcm9wZXJ0aWVzIHRvIGxlZ2FjeSBwcm9wZXJ0aWVzLlxuICogU3VjaCBhczogYG1hcmdpbi1ibG9jay1zdGFydGAgdG8gYG1hcmdpbi10b3BgLlxuICogVHJhbnNmb3JtIGxpc3Q6XG4gKiAtIGluc2V0XG4gKiAtIG1hcmdpblxuICogLSBwYWRkaW5nXG4gKiAtIGJvcmRlclxuICovXG52YXIgdHJhbnNmb3JtID0ge1xuICB2aXNpdDogZnVuY3Rpb24gdmlzaXQoY3NzT2JqKSB7XG4gICAgdmFyIGNsb25lID0ge307XG4gICAgT2JqZWN0LmtleXMoY3NzT2JqKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGNzc09ialtrZXldO1xuICAgICAgdmFyIG1hdGNoVmFsdWUgPSBrZXlNYXBba2V5XTtcbiAgICAgIGlmIChtYXRjaFZhbHVlICYmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpKSB7XG4gICAgICAgIHZhciBfc3BsaXRWYWx1ZXMgPSBzcGxpdFZhbHVlcyh2YWx1ZSksXG4gICAgICAgICAgX3NwbGl0VmFsdWVzMiA9IF9zbGljZWRUb0FycmF5KF9zcGxpdFZhbHVlcywgMiksXG4gICAgICAgICAgX3ZhbHVlcyA9IF9zcGxpdFZhbHVlczJbMF0sXG4gICAgICAgICAgX2ltcG9ydGFudCA9IF9zcGxpdFZhbHVlczJbMV07XG4gICAgICAgIGlmIChtYXRjaFZhbHVlLmxlbmd0aCAmJiBtYXRjaFZhbHVlLm5vdFNwbGl0KSB7XG4gICAgICAgICAgLy8gbm90IHNwbGl0IG1lYW5zIGFsd2F5cyBnaXZlIHNhbWUgdmFsdWUgbGlrZSBib3JkZXJcbiAgICAgICAgICBtYXRjaFZhbHVlLmZvckVhY2goZnVuY3Rpb24gKG1hdGNoS2V5KSB7XG4gICAgICAgICAgICBjbG9uZVttYXRjaEtleV0gPSB3cmFwSW1wb3J0YW50QW5kU2tpcENoZWNrKHZhbHVlLCBfaW1wb3J0YW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChtYXRjaFZhbHVlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIC8vIEhhbmRsZSBsaWtlIGBtYXJnaW5CbG9ja1N0YXJ0YCA9PiBgbWFyZ2luVG9wYFxuICAgICAgICAgIGNsb25lW21hdGNoVmFsdWVbMF1dID0gd3JhcEltcG9ydGFudEFuZFNraXBDaGVjayhfdmFsdWVzWzBdLCBfaW1wb3J0YW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChtYXRjaFZhbHVlLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgIC8vIEhhbmRsZSBsaWtlIGBtYXJnaW5CbG9ja2AgPT4gYG1hcmdpblRvcGAgJiBgbWFyZ2luQm90dG9tYFxuICAgICAgICAgIG1hdGNoVmFsdWUuZm9yRWFjaChmdW5jdGlvbiAobWF0Y2hLZXksIGluZGV4KSB7XG4gICAgICAgICAgICB2YXIgX3ZhbHVlcyRpbmRleDtcbiAgICAgICAgICAgIGNsb25lW21hdGNoS2V5XSA9IHdyYXBJbXBvcnRhbnRBbmRTa2lwQ2hlY2soKF92YWx1ZXMkaW5kZXggPSBfdmFsdWVzW2luZGV4XSkgIT09IG51bGwgJiYgX3ZhbHVlcyRpbmRleCAhPT0gdm9pZCAwID8gX3ZhbHVlcyRpbmRleCA6IF92YWx1ZXNbMF0sIF9pbXBvcnRhbnQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKG1hdGNoVmFsdWUubGVuZ3RoID09PSA0KSB7XG4gICAgICAgICAgLy8gSGFuZGxlIGxpa2UgYGluc2V0YCA9PiBgdG9wYCAmIGByaWdodGAgJiBgYm90dG9tYCAmIGBsZWZ0YFxuICAgICAgICAgIG1hdGNoVmFsdWUuZm9yRWFjaChmdW5jdGlvbiAobWF0Y2hLZXksIGluZGV4KSB7XG4gICAgICAgICAgICB2YXIgX3JlZiwgX3ZhbHVlcyRpbmRleDI7XG4gICAgICAgICAgICBjbG9uZVttYXRjaEtleV0gPSB3cmFwSW1wb3J0YW50QW5kU2tpcENoZWNrKChfcmVmID0gKF92YWx1ZXMkaW5kZXgyID0gX3ZhbHVlc1tpbmRleF0pICE9PSBudWxsICYmIF92YWx1ZXMkaW5kZXgyICE9PSB2b2lkIDAgPyBfdmFsdWVzJGluZGV4MiA6IF92YWx1ZXNbaW5kZXggLSAyXSkgIT09IG51bGwgJiYgX3JlZiAhPT0gdm9pZCAwID8gX3JlZiA6IF92YWx1ZXNbMF0sIF9pbXBvcnRhbnQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNsb25lW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2xvbmVba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjbG9uZTtcbiAgfVxufTtcbmV4cG9ydCBkZWZhdWx0IHRyYW5zZm9ybTsiLCAiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbnZhciBJY29uQ29udGV4dCA9IC8qI19fUFVSRV9fKi9jcmVhdGVDb250ZXh0KHt9KTtcbmV4cG9ydCBkZWZhdWx0IEljb25Db250ZXh0OyIsICJpbXBvcnQgYXJyYXlXaXRoSG9sZXMgZnJvbSBcIi4vYXJyYXlXaXRoSG9sZXMuanNcIjtcbmltcG9ydCBpdGVyYWJsZVRvQXJyYXkgZnJvbSBcIi4vaXRlcmFibGVUb0FycmF5LmpzXCI7XG5pbXBvcnQgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkgZnJvbSBcIi4vdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkuanNcIjtcbmltcG9ydCBub25JdGVyYWJsZVJlc3QgZnJvbSBcIi4vbm9uSXRlcmFibGVSZXN0LmpzXCI7XG5mdW5jdGlvbiBfdG9BcnJheShyKSB7XG4gIHJldHVybiBhcnJheVdpdGhIb2xlcyhyKSB8fCBpdGVyYWJsZVRvQXJyYXkocikgfHwgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkocikgfHwgbm9uSXRlcmFibGVSZXN0KCk7XG59XG5leHBvcnQgeyBfdG9BcnJheSBhcyBkZWZhdWx0IH07IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldChlbnRpdHksIHBhdGgpIHtcbiAgdmFyIGN1cnJlbnQgPSBlbnRpdHk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY3VycmVudCA9IGN1cnJlbnRbcGF0aFtpXV07XG4gIH1cbiAgcmV0dXJuIGN1cnJlbnQ7XG59IiwgImltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF90b0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0FycmF5XCI7XG5pbXBvcnQgZ2V0IGZyb20gXCIuL2dldFwiO1xuZnVuY3Rpb24gaW50ZXJuYWxTZXQoZW50aXR5LCBwYXRocywgdmFsdWUsIHJlbW92ZUlmVW5kZWZpbmVkKSB7XG4gIGlmICghcGF0aHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHZhciBfcGF0aHMgPSBfdG9BcnJheShwYXRocyksXG4gICAgcGF0aCA9IF9wYXRoc1swXSxcbiAgICByZXN0UGF0aCA9IF9wYXRocy5zbGljZSgxKTtcbiAgdmFyIGNsb25lO1xuICBpZiAoIWVudGl0eSAmJiB0eXBlb2YgcGF0aCA9PT0gJ251bWJlcicpIHtcbiAgICBjbG9uZSA9IFtdO1xuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZW50aXR5KSkge1xuICAgIGNsb25lID0gX3RvQ29uc3VtYWJsZUFycmF5KGVudGl0eSk7XG4gIH0gZWxzZSB7XG4gICAgY2xvbmUgPSBfb2JqZWN0U3ByZWFkKHt9LCBlbnRpdHkpO1xuICB9XG5cbiAgLy8gRGVsZXRlIHByb3AgaWYgYHJlbW92ZUlmVW5kZWZpbmVkYCBhbmQgdmFsdWUgaXMgdW5kZWZpbmVkXG4gIGlmIChyZW1vdmVJZlVuZGVmaW5lZCAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIHJlc3RQYXRoLmxlbmd0aCA9PT0gMSkge1xuICAgIGRlbGV0ZSBjbG9uZVtwYXRoXVtyZXN0UGF0aFswXV07XG4gIH0gZWxzZSB7XG4gICAgY2xvbmVbcGF0aF0gPSBpbnRlcm5hbFNldChjbG9uZVtwYXRoXSwgcmVzdFBhdGgsIHZhbHVlLCByZW1vdmVJZlVuZGVmaW5lZCk7XG4gIH1cbiAgcmV0dXJuIGNsb25lO1xufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2V0KGVudGl0eSwgcGF0aHMsIHZhbHVlKSB7XG4gIHZhciByZW1vdmVJZlVuZGVmaW5lZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogZmFsc2U7XG4gIC8vIERvIG5vdGhpbmcgaWYgYHJlbW92ZUlmVW5kZWZpbmVkYCBhbmQgcGFyZW50IG9iamVjdCBub3QgZXhpc3RcbiAgaWYgKHBhdGhzLmxlbmd0aCAmJiByZW1vdmVJZlVuZGVmaW5lZCAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICFnZXQoZW50aXR5LCBwYXRocy5zbGljZSgwLCAtMSkpKSB7XG4gICAgcmV0dXJuIGVudGl0eTtcbiAgfVxuICByZXR1cm4gaW50ZXJuYWxTZXQoZW50aXR5LCBwYXRocywgdmFsdWUsIHJlbW92ZUlmVW5kZWZpbmVkKTtcbn1cbmZ1bmN0aW9uIGlzT2JqZWN0KG9iaikge1xuICByZXR1cm4gX3R5cGVvZihvYmopID09PSAnb2JqZWN0JyAmJiBvYmogIT09IG51bGwgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikgPT09IE9iamVjdC5wcm90b3R5cGU7XG59XG5mdW5jdGlvbiBjcmVhdGVFbXB0eShzb3VyY2UpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoc291cmNlKSA/IFtdIDoge307XG59XG52YXIga2V5cyA9IHR5cGVvZiBSZWZsZWN0ID09PSAndW5kZWZpbmVkJyA/IE9iamVjdC5rZXlzIDogUmVmbGVjdC5vd25LZXlzO1xuXG4vKipcbiAqIE1lcmdlIG9iamVjdHMgd2hpY2ggd2lsbCBjcmVhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgc291cmNlcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBzb3VyY2VzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG4gIHZhciBjbG9uZSA9IGNyZWF0ZUVtcHR5KHNvdXJjZXNbMF0pO1xuICBzb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNyYykge1xuICAgIGZ1bmN0aW9uIGludGVybmFsTWVyZ2UocGF0aCwgcGFyZW50TG9vcFNldCkge1xuICAgICAgdmFyIGxvb3BTZXQgPSBuZXcgU2V0KHBhcmVudExvb3BTZXQpO1xuICAgICAgdmFyIHZhbHVlID0gZ2V0KHNyYywgcGF0aCk7XG4gICAgICB2YXIgaXNBcnIgPSBBcnJheS5pc0FycmF5KHZhbHVlKTtcbiAgICAgIGlmIChpc0FyciB8fCBpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgLy8gT25seSBhZGQgbm90IGxvb3Agb2JqXG4gICAgICAgIGlmICghbG9vcFNldC5oYXModmFsdWUpKSB7XG4gICAgICAgICAgbG9vcFNldC5hZGQodmFsdWUpO1xuICAgICAgICAgIHZhciBvcmlnaW5WYWx1ZSA9IGdldChjbG9uZSwgcGF0aCk7XG4gICAgICAgICAgaWYgKGlzQXJyKSB7XG4gICAgICAgICAgICAvLyBBcnJheSB3aWxsIGFsd2F5cyBiZSBvdmVycmlkZVxuICAgICAgICAgICAgY2xvbmUgPSBzZXQoY2xvbmUsIHBhdGgsIFtdKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFvcmlnaW5WYWx1ZSB8fCBfdHlwZW9mKG9yaWdpblZhbHVlKSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIC8vIEluaXQgY29udGFpbmVyIGlmIG5vdCBleGlzdFxuICAgICAgICAgICAgY2xvbmUgPSBzZXQoY2xvbmUsIHBhdGgsIGNyZWF0ZUVtcHR5KHZhbHVlKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGtleXModmFsdWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgaW50ZXJuYWxNZXJnZShbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHBhdGgpLCBba2V5XSksIGxvb3BTZXQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbG9uZSA9IHNldChjbG9uZSwgcGF0aCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpbnRlcm5hbE1lcmdlKFtdKTtcbiAgfSk7XG4gIHJldHVybiBjbG9uZTtcbn0iLCAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHJjV2FybmluZywgeyByZXNldFdhcm5lZCBhcyByY1Jlc2V0V2FybmVkIH0gZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuZXhwb3J0IGZ1bmN0aW9uIG5vb3AoKSB7fVxubGV0IGRlcHJlY2F0ZWRXYXJuTGlzdCA9IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gcmVzZXRXYXJuZWQoKSB7XG4gIGRlcHJlY2F0ZWRXYXJuTGlzdCA9IG51bGw7XG4gIHJjUmVzZXRXYXJuZWQoKTtcbn1cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tbXV0YWJsZS1leHBvcnRzXG5sZXQgd2FybmluZyA9IG5vb3A7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB3YXJuaW5nID0gKHZhbGlkLCBjb21wb25lbnQsIG1lc3NhZ2UpID0+IHtcbiAgICByY1dhcm5pbmcodmFsaWQsIGBbYW50ZDogJHtjb21wb25lbnR9XSAke21lc3NhZ2V9YCk7XG4gICAgLy8gU3RyaWN0TW9kZSB3aWxsIGluamVjdCBjb25zb2xlIHdoaWNoIHdpbGwgbm90IHRocm93IHdhcm5pbmcgaW4gUmVhY3QgMTcuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAndGVzdCcpIHtcbiAgICAgIHJlc2V0V2FybmVkKCk7XG4gICAgfVxuICB9O1xufVxuZXhwb3J0IGNvbnN0IFdhcm5pbmdDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQoe30pO1xuLyoqXG4gKiBUaGlzIGlzIGEgaG9vayBidXQgd2Ugbm90IG5hbWVkIGFzIGB1c2VXYXJuaW5nYFxuICogc2luY2UgdGhpcyBpcyBvbmx5IHVzZWQgaW4gZGV2ZWxvcG1lbnQuXG4gKiBXZSBzaG91bGQgYWx3YXlzIHdyYXAgdGhpcyBpbiBgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpYCBjb25kaXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IGRldlVzZVdhcm5pbmcgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gY29tcG9uZW50ID0+IHtcbiAgY29uc3Qge1xuICAgIHN0cmljdFxuICB9ID0gUmVhY3QudXNlQ29udGV4dChXYXJuaW5nQ29udGV4dCk7XG4gIGNvbnN0IHR5cGVXYXJuaW5nID0gKHZhbGlkLCB0eXBlLCBtZXNzYWdlKSA9PiB7XG4gICAgaWYgKCF2YWxpZCkge1xuICAgICAgaWYgKHN0cmljdCA9PT0gZmFsc2UgJiYgdHlwZSA9PT0gJ2RlcHJlY2F0ZWQnKSB7XG4gICAgICAgIGNvbnN0IGV4aXN0V2FybmluZyA9IGRlcHJlY2F0ZWRXYXJuTGlzdDtcbiAgICAgICAgaWYgKCFkZXByZWNhdGVkV2Fybkxpc3QpIHtcbiAgICAgICAgICBkZXByZWNhdGVkV2Fybkxpc3QgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBkZXByZWNhdGVkV2Fybkxpc3RbY29tcG9uZW50XSA9IGRlcHJlY2F0ZWRXYXJuTGlzdFtjb21wb25lbnRdIHx8IFtdO1xuICAgICAgICBpZiAoIWRlcHJlY2F0ZWRXYXJuTGlzdFtjb21wb25lbnRdLmluY2x1ZGVzKG1lc3NhZ2UgfHwgJycpKSB7XG4gICAgICAgICAgZGVwcmVjYXRlZFdhcm5MaXN0W2NvbXBvbmVudF0ucHVzaChtZXNzYWdlIHx8ICcnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXYXJuaW5nIGZvciB0aGUgZmlyc3QgdGltZVxuICAgICAgICBpZiAoIWV4aXN0V2FybmluZykge1xuICAgICAgICAgIGNvbnNvbGUud2FybignW2FudGRdIFRoZXJlIGV4aXN0cyBkZXByZWNhdGVkIHVzYWdlIGluIHlvdXIgY29kZTonLCBkZXByZWNhdGVkV2Fybkxpc3QpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKHZhbGlkLCBjb21wb25lbnQsIG1lc3NhZ2UpIDogdm9pZCAwO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgdHlwZVdhcm5pbmcuZGVwcmVjYXRlZCA9ICh2YWxpZCwgb2xkUHJvcCwgbmV3UHJvcCwgbWVzc2FnZSkgPT4ge1xuICAgIHR5cGVXYXJuaW5nKHZhbGlkLCAnZGVwcmVjYXRlZCcsIGBcXGAke29sZFByb3B9XFxgIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgXFxgJHtuZXdQcm9wfVxcYCBpbnN0ZWFkLiR7bWVzc2FnZSA/IGAgJHttZXNzYWdlfWAgOiAnJ31gKTtcbiAgfTtcbiAgcmV0dXJuIHR5cGVXYXJuaW5nO1xufSA6ICgpID0+IHtcbiAgY29uc3Qgbm9vcFdhcm5pbmcgPSAoKSA9PiB7fTtcbiAgbm9vcFdhcm5pbmcuZGVwcmVjYXRlZCA9IG5vb3A7XG4gIHJldHVybiBub29wV2FybmluZztcbn07XG5leHBvcnQgZGVmYXVsdCB3YXJuaW5nOyIsICJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ3JlYWN0Jztcbi8vIFpvbWJpZUo6IFdlIGV4cG9ydCBzaW5nbGUgZmlsZSBoZXJlIHNpbmNlXG4vLyBDb25maWdQcm92aWRlciB1c2UgdGhpcyB3aGljaCB3aWxsIG1ha2UgbG9vcCBkZXBzXG4vLyB0byBpbXBvcnQgd2hvbGUgYHJjLWZpZWxkLWZvcm1gXG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovY3JlYXRlQ29udGV4dCh1bmRlZmluZWQpOyIsICJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZGV2VXNlV2FybmluZyB9IGZyb20gJy4uL191dGlsL3dhcm5pbmcnO1xuaW1wb3J0IHsgY2hhbmdlQ29uZmlybUxvY2FsZSB9IGZyb20gJy4uL21vZGFsL2xvY2FsZSc7XG5pbXBvcnQgTG9jYWxlQ29udGV4dCBmcm9tICcuL2NvbnRleHQnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB1c2VMb2NhbGUgfSBmcm9tICcuL3VzZUxvY2FsZSc7XG5leHBvcnQgY29uc3QgQU5UX01BUksgPSAnaW50ZXJuYWxNYXJrJztcbmNvbnN0IExvY2FsZVByb3ZpZGVyID0gcHJvcHMgPT4ge1xuICBjb25zdCB7XG4gICAgbG9jYWxlID0ge30sXG4gICAgY2hpbGRyZW4sXG4gICAgX0FOVF9NQVJLX19cbiAgfSA9IHByb3BzO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGNvbnN0IHdhcm5pbmcgPSBkZXZVc2VXYXJuaW5nKCdMb2NhbGVQcm92aWRlcicpO1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoX0FOVF9NQVJLX18gPT09IEFOVF9NQVJLLCAnZGVwcmVjYXRlZCcsICdgTG9jYWxlUHJvdmlkZXJgIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgYGxvY2FsZWAgd2l0aCBgQ29uZmlnUHJvdmlkZXJgIGluc3RlYWQ6IGh0dHA6Ly91LmFudC5kZXNpZ24vbG9jYWxlJykgOiB2b2lkIDA7XG4gIH1cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBjbGVhckxvY2FsZSA9IGNoYW5nZUNvbmZpcm1Mb2NhbGUobG9jYWxlID09PSBudWxsIHx8IGxvY2FsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbG9jYWxlLk1vZGFsKTtcbiAgICByZXR1cm4gY2xlYXJMb2NhbGU7XG4gIH0sIFtsb2NhbGVdKTtcbiAgY29uc3QgZ2V0TWVtb2l6ZWRDb250ZXh0VmFsdWUgPSBSZWFjdC51c2VNZW1vKCgpID0+IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgbG9jYWxlKSwge1xuICAgIGV4aXN0OiB0cnVlXG4gIH0pLCBbbG9jYWxlXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMb2NhbGVDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IGdldE1lbW9pemVkQ29udGV4dFZhbHVlXG4gIH0sIGNoaWxkcmVuKTtcbn07XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBMb2NhbGVQcm92aWRlci5kaXNwbGF5TmFtZSA9ICdMb2NhbGVQcm92aWRlcic7XG59XG5leHBvcnQgZGVmYXVsdCBMb2NhbGVQcm92aWRlcjsiLCAidmFyIGxvY2FsZSA9IHtcbiAgLy8gT3B0aW9uc1xuICBpdGVtc19wZXJfcGFnZTogJy8gcGFnZScsXG4gIGp1bXBfdG86ICdHbyB0bycsXG4gIGp1bXBfdG9fY29uZmlybTogJ2NvbmZpcm0nLFxuICBwYWdlOiAnUGFnZScsXG4gIC8vIFBhZ2luYXRpb25cbiAgcHJldl9wYWdlOiAnUHJldmlvdXMgUGFnZScsXG4gIG5leHRfcGFnZTogJ05leHQgUGFnZScsXG4gIHByZXZfNTogJ1ByZXZpb3VzIDUgUGFnZXMnLFxuICBuZXh0XzU6ICdOZXh0IDUgUGFnZXMnLFxuICBwcmV2XzM6ICdQcmV2aW91cyAzIFBhZ2VzJyxcbiAgbmV4dF8zOiAnTmV4dCAzIFBhZ2VzJyxcbiAgcGFnZV9zaXplOiAnUGFnZSBTaXplJ1xufTtcbmV4cG9ydCBkZWZhdWx0IGxvY2FsZTsiLCAiZXhwb3J0IHZhciBjb21tb25Mb2NhbGUgPSB7XG4gIHllYXJGb3JtYXQ6ICdZWVlZJyxcbiAgZGF5Rm9ybWF0OiAnRCcsXG4gIGNlbGxNZXJpZGllbUZvcm1hdDogJ0EnLFxuICBtb250aEJlZm9yZVllYXI6IHRydWVcbn07IiwgImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgeyBjb21tb25Mb2NhbGUgfSBmcm9tIFwiLi9jb21tb25cIjtcbnZhciBsb2NhbGUgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGNvbW1vbkxvY2FsZSksIHt9LCB7XG4gIGxvY2FsZTogJ2VuX1VTJyxcbiAgdG9kYXk6ICdUb2RheScsXG4gIG5vdzogJ05vdycsXG4gIGJhY2tUb1RvZGF5OiAnQmFjayB0byB0b2RheScsXG4gIG9rOiAnT0snLFxuICBjbGVhcjogJ0NsZWFyJyxcbiAgd2VlazogJ1dlZWsnLFxuICBtb250aDogJ01vbnRoJyxcbiAgeWVhcjogJ1llYXInLFxuICB0aW1lU2VsZWN0OiAnc2VsZWN0IHRpbWUnLFxuICBkYXRlU2VsZWN0OiAnc2VsZWN0IGRhdGUnLFxuICB3ZWVrU2VsZWN0OiAnQ2hvb3NlIGEgd2VlaycsXG4gIG1vbnRoU2VsZWN0OiAnQ2hvb3NlIGEgbW9udGgnLFxuICB5ZWFyU2VsZWN0OiAnQ2hvb3NlIGEgeWVhcicsXG4gIGRlY2FkZVNlbGVjdDogJ0Nob29zZSBhIGRlY2FkZScsXG4gIGRhdGVGb3JtYXQ6ICdNL0QvWVlZWScsXG4gIGRhdGVUaW1lRm9ybWF0OiAnTS9EL1lZWVkgSEg6bW06c3MnLFxuICBwcmV2aW91c01vbnRoOiAnUHJldmlvdXMgbW9udGggKFBhZ2VVcCknLFxuICBuZXh0TW9udGg6ICdOZXh0IG1vbnRoIChQYWdlRG93biknLFxuICBwcmV2aW91c1llYXI6ICdMYXN0IHllYXIgKENvbnRyb2wgKyBsZWZ0KScsXG4gIG5leHRZZWFyOiAnTmV4dCB5ZWFyIChDb250cm9sICsgcmlnaHQpJyxcbiAgcHJldmlvdXNEZWNhZGU6ICdMYXN0IGRlY2FkZScsXG4gIG5leHREZWNhZGU6ICdOZXh0IGRlY2FkZScsXG4gIHByZXZpb3VzQ2VudHVyeTogJ0xhc3QgY2VudHVyeScsXG4gIG5leHRDZW50dXJ5OiAnTmV4dCBjZW50dXJ5J1xufSk7XG5leHBvcnQgZGVmYXVsdCBsb2NhbGU7IiwgImNvbnN0IGxvY2FsZSA9IHtcbiAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgdGltZScsXG4gIHJhbmdlUGxhY2Vob2xkZXI6IFsnU3RhcnQgdGltZScsICdFbmQgdGltZSddXG59O1xuZXhwb3J0IGRlZmF1bHQgbG9jYWxlOyIsICJpbXBvcnQgQ2FsZW5kYXJMb2NhbGUgZnJvbSBcInJjLXBpY2tlci9lcy9sb2NhbGUvZW5fVVNcIjtcbmltcG9ydCBUaW1lUGlja2VyTG9jYWxlIGZyb20gJy4uLy4uL3RpbWUtcGlja2VyL2xvY2FsZS9lbl9VUyc7XG4vLyBNZXJnZSBpbnRvIGEgbG9jYWxlIG9iamVjdFxuY29uc3QgbG9jYWxlID0ge1xuICBsYW5nOiBPYmplY3QuYXNzaWduKHtcbiAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBkYXRlJyxcbiAgICB5ZWFyUGxhY2Vob2xkZXI6ICdTZWxlY3QgeWVhcicsXG4gICAgcXVhcnRlclBsYWNlaG9sZGVyOiAnU2VsZWN0IHF1YXJ0ZXInLFxuICAgIG1vbnRoUGxhY2Vob2xkZXI6ICdTZWxlY3QgbW9udGgnLFxuICAgIHdlZWtQbGFjZWhvbGRlcjogJ1NlbGVjdCB3ZWVrJyxcbiAgICByYW5nZVBsYWNlaG9sZGVyOiBbJ1N0YXJ0IGRhdGUnLCAnRW5kIGRhdGUnXSxcbiAgICByYW5nZVllYXJQbGFjZWhvbGRlcjogWydTdGFydCB5ZWFyJywgJ0VuZCB5ZWFyJ10sXG4gICAgcmFuZ2VRdWFydGVyUGxhY2Vob2xkZXI6IFsnU3RhcnQgcXVhcnRlcicsICdFbmQgcXVhcnRlciddLFxuICAgIHJhbmdlTW9udGhQbGFjZWhvbGRlcjogWydTdGFydCBtb250aCcsICdFbmQgbW9udGgnXSxcbiAgICByYW5nZVdlZWtQbGFjZWhvbGRlcjogWydTdGFydCB3ZWVrJywgJ0VuZCB3ZWVrJ11cbiAgfSwgQ2FsZW5kYXJMb2NhbGUpLFxuICB0aW1lUGlja2VyTG9jYWxlOiBPYmplY3QuYXNzaWduKHt9LCBUaW1lUGlja2VyTG9jYWxlKVxufTtcbi8vIEFsbCBzZXR0aW5ncyBhdDpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vYmxvYi9tYXN0ZXIvY29tcG9uZW50cy9kYXRlLXBpY2tlci9sb2NhbGUvZXhhbXBsZS5qc29uXG5leHBvcnQgZGVmYXVsdCBsb2NhbGU7IiwgImltcG9ydCBlblVTIGZyb20gJy4uLy4uL2RhdGUtcGlja2VyL2xvY2FsZS9lbl9VUyc7XG5leHBvcnQgZGVmYXVsdCBlblVTOyIsICJpbXBvcnQgUGFnaW5hdGlvbiBmcm9tIFwicmMtcGFnaW5hdGlvbi9lcy9sb2NhbGUvZW5fVVNcIjtcbmltcG9ydCBDYWxlbmRhciBmcm9tICcuLi9jYWxlbmRhci9sb2NhbGUvZW5fVVMnO1xuaW1wb3J0IERhdGVQaWNrZXIgZnJvbSAnLi4vZGF0ZS1waWNrZXIvbG9jYWxlL2VuX1VTJztcbmltcG9ydCBUaW1lUGlja2VyIGZyb20gJy4uL3RpbWUtcGlja2VyL2xvY2FsZS9lbl9VUyc7XG5jb25zdCB0eXBlVGVtcGxhdGUgPSAnJHtsYWJlbH0gaXMgbm90IGEgdmFsaWQgJHt0eXBlfSc7XG5jb25zdCBsb2NhbGVWYWx1ZXMgPSB7XG4gIGxvY2FsZTogJ2VuJyxcbiAgUGFnaW5hdGlvbixcbiAgRGF0ZVBpY2tlcixcbiAgVGltZVBpY2tlcixcbiAgQ2FsZW5kYXIsXG4gIGdsb2JhbDoge1xuICAgIHBsYWNlaG9sZGVyOiAnUGxlYXNlIHNlbGVjdCdcbiAgfSxcbiAgVGFibGU6IHtcbiAgICBmaWx0ZXJUaXRsZTogJ0ZpbHRlciBtZW51JyxcbiAgICBmaWx0ZXJDb25maXJtOiAnT0snLFxuICAgIGZpbHRlclJlc2V0OiAnUmVzZXQnLFxuICAgIGZpbHRlckVtcHR5VGV4dDogJ05vIGZpbHRlcnMnLFxuICAgIGZpbHRlckNoZWNrQWxsOiAnU2VsZWN0IGFsbCBpdGVtcycsXG4gICAgZmlsdGVyU2VhcmNoUGxhY2Vob2xkZXI6ICdTZWFyY2ggaW4gZmlsdGVycycsXG4gICAgZW1wdHlUZXh0OiAnTm8gZGF0YScsXG4gICAgc2VsZWN0QWxsOiAnU2VsZWN0IGN1cnJlbnQgcGFnZScsXG4gICAgc2VsZWN0SW52ZXJ0OiAnSW52ZXJ0IGN1cnJlbnQgcGFnZScsXG4gICAgc2VsZWN0Tm9uZTogJ0NsZWFyIGFsbCBkYXRhJyxcbiAgICBzZWxlY3Rpb25BbGw6ICdTZWxlY3QgYWxsIGRhdGEnLFxuICAgIHNvcnRUaXRsZTogJ1NvcnQnLFxuICAgIGV4cGFuZDogJ0V4cGFuZCByb3cnLFxuICAgIGNvbGxhcHNlOiAnQ29sbGFwc2Ugcm93JyxcbiAgICB0cmlnZ2VyRGVzYzogJ0NsaWNrIHRvIHNvcnQgZGVzY2VuZGluZycsXG4gICAgdHJpZ2dlckFzYzogJ0NsaWNrIHRvIHNvcnQgYXNjZW5kaW5nJyxcbiAgICBjYW5jZWxTb3J0OiAnQ2xpY2sgdG8gY2FuY2VsIHNvcnRpbmcnXG4gIH0sXG4gIFRvdXI6IHtcbiAgICBOZXh0OiAnTmV4dCcsXG4gICAgUHJldmlvdXM6ICdQcmV2aW91cycsXG4gICAgRmluaXNoOiAnRmluaXNoJ1xuICB9LFxuICBNb2RhbDoge1xuICAgIG9rVGV4dDogJ09LJyxcbiAgICBjYW5jZWxUZXh0OiAnQ2FuY2VsJyxcbiAgICBqdXN0T2tUZXh0OiAnT0snXG4gIH0sXG4gIFBvcGNvbmZpcm06IHtcbiAgICBva1RleHQ6ICdPSycsXG4gICAgY2FuY2VsVGV4dDogJ0NhbmNlbCdcbiAgfSxcbiAgVHJhbnNmZXI6IHtcbiAgICB0aXRsZXM6IFsnJywgJyddLFxuICAgIHNlYXJjaFBsYWNlaG9sZGVyOiAnU2VhcmNoIGhlcmUnLFxuICAgIGl0ZW1Vbml0OiAnaXRlbScsXG4gICAgaXRlbXNVbml0OiAnaXRlbXMnLFxuICAgIHJlbW92ZTogJ1JlbW92ZScsXG4gICAgc2VsZWN0Q3VycmVudDogJ1NlbGVjdCBjdXJyZW50IHBhZ2UnLFxuICAgIHJlbW92ZUN1cnJlbnQ6ICdSZW1vdmUgY3VycmVudCBwYWdlJyxcbiAgICBzZWxlY3RBbGw6ICdTZWxlY3QgYWxsIGRhdGEnLFxuICAgIGRlc2VsZWN0QWxsOiAnRGVzZWxlY3QgYWxsIGRhdGEnLFxuICAgIHJlbW92ZUFsbDogJ1JlbW92ZSBhbGwgZGF0YScsXG4gICAgc2VsZWN0SW52ZXJ0OiAnSW52ZXJ0IGN1cnJlbnQgcGFnZSdcbiAgfSxcbiAgVXBsb2FkOiB7XG4gICAgdXBsb2FkaW5nOiAnVXBsb2FkaW5nLi4uJyxcbiAgICByZW1vdmVGaWxlOiAnUmVtb3ZlIGZpbGUnLFxuICAgIHVwbG9hZEVycm9yOiAnVXBsb2FkIGVycm9yJyxcbiAgICBwcmV2aWV3RmlsZTogJ1ByZXZpZXcgZmlsZScsXG4gICAgZG93bmxvYWRGaWxlOiAnRG93bmxvYWQgZmlsZSdcbiAgfSxcbiAgRW1wdHk6IHtcbiAgICBkZXNjcmlwdGlvbjogJ05vIGRhdGEnXG4gIH0sXG4gIEljb246IHtcbiAgICBpY29uOiAnaWNvbidcbiAgfSxcbiAgVGV4dDoge1xuICAgIGVkaXQ6ICdFZGl0JyxcbiAgICBjb3B5OiAnQ29weScsXG4gICAgY29waWVkOiAnQ29waWVkJyxcbiAgICBleHBhbmQ6ICdFeHBhbmQnLFxuICAgIGNvbGxhcHNlOiAnQ29sbGFwc2UnXG4gIH0sXG4gIEZvcm06IHtcbiAgICBvcHRpb25hbDogJyhvcHRpb25hbCknLFxuICAgIGRlZmF1bHRWYWxpZGF0ZU1lc3NhZ2VzOiB7XG4gICAgICBkZWZhdWx0OiAnRmllbGQgdmFsaWRhdGlvbiBlcnJvciBmb3IgJHtsYWJlbH0nLFxuICAgICAgcmVxdWlyZWQ6ICdQbGVhc2UgZW50ZXIgJHtsYWJlbH0nLFxuICAgICAgZW51bTogJyR7bGFiZWx9IG11c3QgYmUgb25lIG9mIFske2VudW19XScsXG4gICAgICB3aGl0ZXNwYWNlOiAnJHtsYWJlbH0gY2Fubm90IGJlIGEgYmxhbmsgY2hhcmFjdGVyJyxcbiAgICAgIGRhdGU6IHtcbiAgICAgICAgZm9ybWF0OiAnJHtsYWJlbH0gZGF0ZSBmb3JtYXQgaXMgaW52YWxpZCcsXG4gICAgICAgIHBhcnNlOiAnJHtsYWJlbH0gY2Fubm90IGJlIGNvbnZlcnRlZCB0byBhIGRhdGUnLFxuICAgICAgICBpbnZhbGlkOiAnJHtsYWJlbH0gaXMgYW4gaW52YWxpZCBkYXRlJ1xuICAgICAgfSxcbiAgICAgIHR5cGVzOiB7XG4gICAgICAgIHN0cmluZzogdHlwZVRlbXBsYXRlLFxuICAgICAgICBtZXRob2Q6IHR5cGVUZW1wbGF0ZSxcbiAgICAgICAgYXJyYXk6IHR5cGVUZW1wbGF0ZSxcbiAgICAgICAgb2JqZWN0OiB0eXBlVGVtcGxhdGUsXG4gICAgICAgIG51bWJlcjogdHlwZVRlbXBsYXRlLFxuICAgICAgICBkYXRlOiB0eXBlVGVtcGxhdGUsXG4gICAgICAgIGJvb2xlYW46IHR5cGVUZW1wbGF0ZSxcbiAgICAgICAgaW50ZWdlcjogdHlwZVRlbXBsYXRlLFxuICAgICAgICBmbG9hdDogdHlwZVRlbXBsYXRlLFxuICAgICAgICByZWdleHA6IHR5cGVUZW1wbGF0ZSxcbiAgICAgICAgZW1haWw6IHR5cGVUZW1wbGF0ZSxcbiAgICAgICAgdXJsOiB0eXBlVGVtcGxhdGUsXG4gICAgICAgIGhleDogdHlwZVRlbXBsYXRlXG4gICAgICB9LFxuICAgICAgc3RyaW5nOiB7XG4gICAgICAgIGxlbjogJyR7bGFiZWx9IG11c3QgYmUgJHtsZW59IGNoYXJhY3RlcnMnLFxuICAgICAgICBtaW46ICcke2xhYmVsfSBtdXN0IGJlIGF0IGxlYXN0ICR7bWlufSBjaGFyYWN0ZXJzJyxcbiAgICAgICAgbWF4OiAnJHtsYWJlbH0gbXVzdCBiZSB1cCB0byAke21heH0gY2hhcmFjdGVycycsXG4gICAgICAgIHJhbmdlOiAnJHtsYWJlbH0gbXVzdCBiZSBiZXR3ZWVuICR7bWlufS0ke21heH0gY2hhcmFjdGVycydcbiAgICAgIH0sXG4gICAgICBudW1iZXI6IHtcbiAgICAgICAgbGVuOiAnJHtsYWJlbH0gbXVzdCBiZSBlcXVhbCB0byAke2xlbn0nLFxuICAgICAgICBtaW46ICcke2xhYmVsfSBtdXN0IGJlIG1pbmltdW0gJHttaW59JyxcbiAgICAgICAgbWF4OiAnJHtsYWJlbH0gbXVzdCBiZSBtYXhpbXVtICR7bWF4fScsXG4gICAgICAgIHJhbmdlOiAnJHtsYWJlbH0gbXVzdCBiZSBiZXR3ZWVuICR7bWlufS0ke21heH0nXG4gICAgICB9LFxuICAgICAgYXJyYXk6IHtcbiAgICAgICAgbGVuOiAnTXVzdCBiZSAke2xlbn0gJHtsYWJlbH0nLFxuICAgICAgICBtaW46ICdBdCBsZWFzdCAke21pbn0gJHtsYWJlbH0nLFxuICAgICAgICBtYXg6ICdBdCBtb3N0ICR7bWF4fSAke2xhYmVsfScsXG4gICAgICAgIHJhbmdlOiAnVGhlIGFtb3VudCBvZiAke2xhYmVsfSBtdXN0IGJlIGJldHdlZW4gJHttaW59LSR7bWF4fSdcbiAgICAgIH0sXG4gICAgICBwYXR0ZXJuOiB7XG4gICAgICAgIG1pc21hdGNoOiAnJHtsYWJlbH0gZG9lcyBub3QgbWF0Y2ggdGhlIHBhdHRlcm4gJHtwYXR0ZXJufSdcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIEltYWdlOiB7XG4gICAgcHJldmlldzogJ1ByZXZpZXcnXG4gIH0sXG4gIFFSQ29kZToge1xuICAgIGV4cGlyZWQ6ICdRUiBjb2RlIGV4cGlyZWQnLFxuICAgIHJlZnJlc2g6ICdSZWZyZXNoJyxcbiAgICBzY2FubmVkOiAnU2Nhbm5lZCdcbiAgfSxcbiAgQ29sb3JQaWNrZXI6IHtcbiAgICBwcmVzZXRFbXB0eTogJ0VtcHR5JyxcbiAgICB0cmFuc3BhcmVudDogJ1RyYW5zcGFyZW50JyxcbiAgICBzaW5nbGVDb2xvcjogJ1NpbmdsZScsXG4gICAgZ3JhZGllbnRDb2xvcjogJ0dyYWRpZW50J1xuICB9XG59O1xuZXhwb3J0IGRlZmF1bHQgbG9jYWxlVmFsdWVzOyIsICJpbXBvcnQgZGVmYXVsdExvY2FsZSBmcm9tICcuLi9sb2NhbGUvZW5fVVMnO1xubGV0IHJ1bnRpbWVMb2NhbGUgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0TG9jYWxlLk1vZGFsKTtcbmxldCBsb2NhbGVMaXN0ID0gW107XG5jb25zdCBnZW5lcmF0ZUxvY2FsZSA9ICgpID0+IGxvY2FsZUxpc3QucmVkdWNlKChtZXJnZWQsIGxvY2FsZSkgPT4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBtZXJnZWQpLCBsb2NhbGUpLCBkZWZhdWx0TG9jYWxlLk1vZGFsKTtcbmV4cG9ydCBmdW5jdGlvbiBjaGFuZ2VDb25maXJtTG9jYWxlKG5ld0xvY2FsZSkge1xuICBpZiAobmV3TG9jYWxlKSB7XG4gICAgY29uc3QgY2xvbmVMb2NhbGUgPSBPYmplY3QuYXNzaWduKHt9LCBuZXdMb2NhbGUpO1xuICAgIGxvY2FsZUxpc3QucHVzaChjbG9uZUxvY2FsZSk7XG4gICAgcnVudGltZUxvY2FsZSA9IGdlbmVyYXRlTG9jYWxlKCk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGxvY2FsZUxpc3QgPSBsb2NhbGVMaXN0LmZpbHRlcihsb2NhbGUgPT4gbG9jYWxlICE9PSBjbG9uZUxvY2FsZSk7XG4gICAgICBydW50aW1lTG9jYWxlID0gZ2VuZXJhdGVMb2NhbGUoKTtcbiAgICB9O1xuICB9XG4gIHJ1bnRpbWVMb2NhbGUgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0TG9jYWxlLk1vZGFsKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25maXJtTG9jYWxlKCkge1xuICByZXR1cm4gcnVudGltZUxvY2FsZTtcbn0iLCAiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmNvbnN0IExvY2FsZUNvbnRleHQgPSAvKiNfX1BVUkVfXyovY3JlYXRlQ29udGV4dCh1bmRlZmluZWQpO1xuZXhwb3J0IGRlZmF1bHQgTG9jYWxlQ29udGV4dDsiLCAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IExvY2FsZUNvbnRleHQgZnJvbSAnLi9jb250ZXh0JztcbmltcG9ydCBkZWZhdWx0TG9jYWxlRGF0YSBmcm9tICcuL2VuX1VTJztcbmNvbnN0IHVzZUxvY2FsZSA9IChjb21wb25lbnROYW1lLCBkZWZhdWx0TG9jYWxlKSA9PiB7XG4gIGNvbnN0IGZ1bGxMb2NhbGUgPSBSZWFjdC51c2VDb250ZXh0KExvY2FsZUNvbnRleHQpO1xuICBjb25zdCBnZXRMb2NhbGUgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3QgbG9jYWxlID0gZGVmYXVsdExvY2FsZSB8fCBkZWZhdWx0TG9jYWxlRGF0YVtjb21wb25lbnROYW1lXTtcbiAgICBjb25zdCBsb2NhbGVGcm9tQ29udGV4dCA9IChfYSA9IGZ1bGxMb2NhbGUgPT09IG51bGwgfHwgZnVsbExvY2FsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZnVsbExvY2FsZVtjb21wb25lbnROYW1lXSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDoge307XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdHlwZW9mIGxvY2FsZSA9PT0gJ2Z1bmN0aW9uJyA/IGxvY2FsZSgpIDogbG9jYWxlKSwgbG9jYWxlRnJvbUNvbnRleHQgfHwge30pO1xuICB9LCBbY29tcG9uZW50TmFtZSwgZGVmYXVsdExvY2FsZSwgZnVsbExvY2FsZV0pO1xuICBjb25zdCBnZXRMb2NhbGVDb2RlID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgbG9jYWxlQ29kZSA9IGZ1bGxMb2NhbGUgPT09IG51bGwgfHwgZnVsbExvY2FsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZnVsbExvY2FsZS5sb2NhbGU7XG4gICAgLy8gSGFkIHVzZSBMb2NhbGVQcm92aWRlIGJ1dCBkaWRuJ3Qgc2V0IGxvY2FsZVxuICAgIGlmICgoZnVsbExvY2FsZSA9PT0gbnVsbCB8fCBmdWxsTG9jYWxlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmdWxsTG9jYWxlLmV4aXN0KSAmJiAhbG9jYWxlQ29kZSkge1xuICAgICAgcmV0dXJuIGRlZmF1bHRMb2NhbGVEYXRhLmxvY2FsZTtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2FsZUNvZGU7XG4gIH0sIFtmdWxsTG9jYWxlXSk7XG4gIHJldHVybiBbZ2V0TG9jYWxlLCBnZXRMb2NhbGVDb2RlXTtcbn07XG5leHBvcnQgZGVmYXVsdCB1c2VMb2NhbGU7IiwgImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgZGVmYXVsdFNlZWRUb2tlbiBmcm9tICcuL3RoZW1lcy9zZWVkJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZGVmYXVsdFRoZW1lIH0gZnJvbSAnLi90aGVtZXMvZGVmYXVsdC90aGVtZSc7XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDb250ZXh0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVG8gZW5zdXJlIHNuYXBzaG90IHN0YWJsZS4gV2UgZGlzYWJsZSBoYXNoZWQgaW4gdGVzdCBlbnYuXG5leHBvcnQgY29uc3QgZGVmYXVsdENvbmZpZyA9IHtcbiAgdG9rZW46IGRlZmF1bHRTZWVkVG9rZW4sXG4gIG92ZXJyaWRlOiB7XG4gICAgb3ZlcnJpZGU6IGRlZmF1bHRTZWVkVG9rZW5cbiAgfSxcbiAgaGFzaGVkOiB0cnVlXG59O1xuZXhwb3J0IGNvbnN0IERlc2lnblRva2VuQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KGRlZmF1bHRDb25maWcpOyIsICJleHBvcnQgY29uc3QgZGVmYXVsdFByZXNldENvbG9ycyA9IHtcbiAgYmx1ZTogJyMxNjc3RkYnLFxuICBwdXJwbGU6ICcjNzIyRUQxJyxcbiAgY3lhbjogJyMxM0MyQzInLFxuICBncmVlbjogJyM1MkM0MUEnLFxuICBtYWdlbnRhOiAnI0VCMkY5NicsXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgbWFnZW50YSBpbnN0ZWFkXG4gICAqL1xuICBwaW5rOiAnI0VCMkY5NicsXG4gIHJlZDogJyNGNTIyMkQnLFxuICBvcmFuZ2U6ICcjRkE4QzE2JyxcbiAgeWVsbG93OiAnI0ZBREIxNCcsXG4gIHZvbGNhbm86ICcjRkE1NDFDJyxcbiAgZ2Vla2JsdWU6ICcjMkY1NEVCJyxcbiAgZ29sZDogJyNGQUFEMTQnLFxuICBsaW1lOiAnI0EwRDkxMSdcbn07XG5jb25zdCBzZWVkVG9rZW4gPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRQcmVzZXRDb2xvcnMpLCB7XG4gIC8vIENvbG9yXG4gIGNvbG9yUHJpbWFyeTogJyMxNjc3ZmYnLFxuICBjb2xvclN1Y2Nlc3M6ICcjNTJjNDFhJyxcbiAgY29sb3JXYXJuaW5nOiAnI2ZhYWQxNCcsXG4gIGNvbG9yRXJyb3I6ICcjZmY0ZDRmJyxcbiAgY29sb3JJbmZvOiAnIzE2NzdmZicsXG4gIGNvbG9yTGluazogJycsXG4gIGNvbG9yVGV4dEJhc2U6ICcnLFxuICBjb2xvckJnQmFzZTogJycsXG4gIC8vIEZvbnRcbiAgZm9udEZhbWlseTogYC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgUm9ib3RvLCAnSGVsdmV0aWNhIE5ldWUnLCBBcmlhbCxcbidOb3RvIFNhbnMnLCBzYW5zLXNlcmlmLCAnQXBwbGUgQ29sb3IgRW1vamknLCAnU2Vnb2UgVUkgRW1vamknLCAnU2Vnb2UgVUkgU3ltYm9sJyxcbidOb3RvIENvbG9yIEVtb2ppJ2AsXG4gIGZvbnRGYW1pbHlDb2RlOiBgJ1NGTW9uby1SZWd1bGFyJywgQ29uc29sYXMsICdMaWJlcmF0aW9uIE1vbm8nLCBNZW5sbywgQ291cmllciwgbW9ub3NwYWNlYCxcbiAgZm9udFNpemU6IDE0LFxuICAvLyBMaW5lXG4gIGxpbmVXaWR0aDogMSxcbiAgbGluZVR5cGU6ICdzb2xpZCcsXG4gIC8vIE1vdGlvblxuICBtb3Rpb25Vbml0OiAwLjEsXG4gIG1vdGlvbkJhc2U6IDAsXG4gIG1vdGlvbkVhc2VPdXRDaXJjOiAnY3ViaWMtYmV6aWVyKDAuMDgsIDAuODIsIDAuMTcsIDEpJyxcbiAgbW90aW9uRWFzZUluT3V0Q2lyYzogJ2N1YmljLWJlemllcigwLjc4LCAwLjE0LCAwLjE1LCAwLjg2KScsXG4gIG1vdGlvbkVhc2VPdXQ6ICdjdWJpYy1iZXppZXIoMC4yMTUsIDAuNjEsIDAuMzU1LCAxKScsXG4gIG1vdGlvbkVhc2VJbk91dDogJ2N1YmljLWJlemllcigwLjY0NSwgMC4wNDUsIDAuMzU1LCAxKScsXG4gIG1vdGlvbkVhc2VPdXRCYWNrOiAnY3ViaWMtYmV6aWVyKDAuMTIsIDAuNCwgMC4yOSwgMS40NiknLFxuICBtb3Rpb25FYXNlSW5CYWNrOiAnY3ViaWMtYmV6aWVyKDAuNzEsIC0wLjQ2LCAwLjg4LCAwLjYpJyxcbiAgbW90aW9uRWFzZUluUXVpbnQ6ICdjdWJpYy1iZXppZXIoMC43NTUsIDAuMDUsIDAuODU1LCAwLjA2KScsXG4gIG1vdGlvbkVhc2VPdXRRdWludDogJ2N1YmljLWJlemllcigwLjIzLCAxLCAwLjMyLCAxKScsXG4gIC8vIFJhZGl1c1xuICBib3JkZXJSYWRpdXM6IDYsXG4gIC8vIFNpemVcbiAgc2l6ZVVuaXQ6IDQsXG4gIHNpemVTdGVwOiA0LFxuICBzaXplUG9wdXBBcnJvdzogMTYsXG4gIC8vIENvbnRyb2wgQmFzZVxuICBjb250cm9sSGVpZ2h0OiAzMixcbiAgLy8gekluZGV4XG4gIHpJbmRleEJhc2U6IDAsXG4gIHpJbmRleFBvcHVwQmFzZTogMTAwMCxcbiAgLy8gSW1hZ2VcbiAgb3BhY2l0eUltYWdlOiAxLFxuICAvLyBXaXJlZnJhbWVcbiAgd2lyZWZyYW1lOiBmYWxzZSxcbiAgLy8gTW90aW9uXG4gIG1vdGlvbjogdHJ1ZVxufSk7XG5leHBvcnQgZGVmYXVsdCBzZWVkVG9rZW47IiwgImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5jb25zdCByb3VuZCA9IE1hdGgucm91bmQ7XG5cbi8qKlxuICogU3VwcG9ydCBmb3JtYXQsIGFscGhhIHVuaXQgd2lsbCBjaGVjayB0aGUgJSBtYXJrOlxuICogLSByZ2JhKDEwMiwgMjA0LCAyNTUsIC41KSAgICAgIC0+IFsxMDIsIDIwNCwgMjU1LCAwLjVdXG4gKiAtIHJnYigxMDIgMjA0IDI1NSAvIC41KSAgICAgICAgLT4gWzEwMiwgMjA0LCAyNTUsIDAuNV1cbiAqIC0gcmdiKDEwMCUsIDUwJSwgMCUgLyA1MCUpICAgICAtPiBbMjU1LCAxMjgsIDAsIDAuNV1cbiAqIC0gaHNsKDI3MCwgNjAsIDQwLCAuNSkgICAgICAgICAtPiBbMjcwLCA2MCwgNDAsIDAuNV1cbiAqIC0gaHNsKDI3MGRlZyA2MCUgNDAlIC8gNTAlKSAgIC0+IFsyNzAsIDYwLCA0MCwgMC41XVxuICpcbiAqIFdoZW4gYGJhc2VgIGlzIHByb3ZpZGVkLCB0aGUgcGVyY2VudGFnZSB2YWx1ZSB3aWxsIGJlIGRpdmlkZWQgYnkgYGJhc2VgLlxuICovXG5mdW5jdGlvbiBzcGxpdENvbG9yU3RyKHN0ciwgcGFyc2VOdW0pIHtcbiAgY29uc3QgbWF0Y2ggPSBzdHJcbiAgLy8gUmVtb3ZlIHN0ciBiZWZvcmUgYChgXG4gIC5yZXBsYWNlKC9eW14oXSpcXCgoLiopLywgJyQxJylcbiAgLy8gUmVtb3ZlIHN0ciBhZnRlciBgKWBcbiAgLnJlcGxhY2UoL1xcKS4qLywgJycpLm1hdGNoKC9cXGQqXFwuP1xcZCslPy9nKSB8fCBbXTtcbiAgY29uc3QgbnVtTGlzdCA9IG1hdGNoLm1hcChpdGVtID0+IHBhcnNlRmxvYXQoaXRlbSkpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IDM7IGkgKz0gMSkge1xuICAgIG51bUxpc3RbaV0gPSBwYXJzZU51bShudW1MaXN0W2ldIHx8IDAsIG1hdGNoW2ldIHx8ICcnLCBpKTtcbiAgfVxuXG4gIC8vIEZvciBhbHBoYS4gNTAlIHNob3VsZCBiZSAwLjVcbiAgaWYgKG1hdGNoWzNdKSB7XG4gICAgbnVtTGlzdFszXSA9IG1hdGNoWzNdLmluY2x1ZGVzKCclJykgPyBudW1MaXN0WzNdIC8gMTAwIDogbnVtTGlzdFszXTtcbiAgfSBlbHNlIHtcbiAgICAvLyBCeSBkZWZhdWx0LCBhbHBoYSBpcyAxXG4gICAgbnVtTGlzdFszXSA9IDE7XG4gIH1cbiAgcmV0dXJuIG51bUxpc3Q7XG59XG5jb25zdCBwYXJzZUhTVm9ySFNMID0gKG51bSwgXywgaW5kZXgpID0+IGluZGV4ID09PSAwID8gbnVtIDogbnVtIC8gMTAwO1xuXG4vKiogcm91bmQgYW5kIGxpbWl0IG51bWJlciB0byBpbnRlZ2VyIGJldHdlZW4gMC0yNTUgKi9cbmZ1bmN0aW9uIGxpbWl0UmFuZ2UodmFsdWUsIG1heCkge1xuICBjb25zdCBtZXJnZWRNYXggPSBtYXggfHwgMjU1O1xuICBpZiAodmFsdWUgPiBtZXJnZWRNYXgpIHtcbiAgICByZXR1cm4gbWVyZ2VkTWF4O1xuICB9XG4gIGlmICh2YWx1ZSA8IDApIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5leHBvcnQgY2xhc3MgRmFzdENvbG9yIHtcbiAgY29uc3RydWN0b3IoaW5wdXQpIHtcbiAgICAvKipcbiAgICAgKiBBbGwgRmFzdENvbG9yIG9iamVjdHMgYXJlIHZhbGlkLiBTbyBpc1ZhbGlkIGlzIGFsd2F5cyB0cnVlLiBUaGlzIHByb3BlcnR5IGlzIGtlcHQgdG8gYmUgY29tcGF0aWJsZSB3aXRoIFRpbnlDb2xvci5cbiAgICAgKi9cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJpc1ZhbGlkXCIsIHRydWUpO1xuICAgIC8qKlxuICAgICAqIFJlZCwgUiBpbiBSR0JcbiAgICAgKi9cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJyXCIsIDApO1xuICAgIC8qKlxuICAgICAqIEdyZWVuLCBHIGluIFJHQlxuICAgICAqL1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImdcIiwgMCk7XG4gICAgLyoqXG4gICAgICogQmx1ZSwgQiBpbiBSR0JcbiAgICAgKi9cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJiXCIsIDApO1xuICAgIC8qKlxuICAgICAqIEFscGhhL09wYWNpdHksIEEgaW4gUkdCQS9IU0xBXG4gICAgICovXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiYVwiLCAxKTtcbiAgICAvLyBIU1YgcHJpdmF0ZXNcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJfaFwiLCB2b2lkIDApO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIl9zXCIsIHZvaWQgMCk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiX2xcIiwgdm9pZCAwKTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJfdlwiLCB2b2lkIDApO1xuICAgIC8vIGludGVybWVkaWF0ZSB2YXJpYWJsZXMgdG8gY2FsY3VsYXRlIEhTTC9IU1ZcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJfbWF4XCIsIHZvaWQgMCk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiX21pblwiLCB2b2lkIDApO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIl9icmlnaHRuZXNzXCIsIHZvaWQgMCk7XG4gICAgLyoqXG4gICAgICogQWx3YXlzIGNoZWNrIDMgY2hhciBpbiB0aGUgb2JqZWN0IHRvIGRldGVybWluZSB0aGUgZm9ybWF0LlxuICAgICAqIFdlIG5vdCB1c2UgZnVuY3Rpb24gaW4gY2hlY2sgdG8gc2F2ZSBidW5kbGUgc2l6ZS5cbiAgICAgKiBlLmcuICdyZ2InIC0+IHsgcjogMCwgZzogMCwgYjogMCB9LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hdGNoRm9ybWF0KHN0cikge1xuICAgICAgcmV0dXJuIHN0clswXSBpbiBpbnB1dCAmJiBzdHJbMV0gaW4gaW5wdXQgJiYgc3RyWzJdIGluIGlucHV0O1xuICAgIH1cbiAgICBpZiAoIWlucHV0KSB7XG4gICAgICAvLyBEbyBub3RoaW5nIHNpbmNlIGFscmVhZHkgaW5pdGlhbGl6ZWRcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IHRyaW1TdHIgPSBpbnB1dC50cmltKCk7XG4gICAgICBmdW5jdGlvbiBtYXRjaFByZWZpeChwcmVmaXgpIHtcbiAgICAgICAgcmV0dXJuIHRyaW1TdHIuc3RhcnRzV2l0aChwcmVmaXgpO1xuICAgICAgfVxuICAgICAgaWYgKC9eIz9bQS1GXFxkXXszLDh9JC9pLnRlc3QodHJpbVN0cikpIHtcbiAgICAgICAgdGhpcy5mcm9tSGV4U3RyaW5nKHRyaW1TdHIpO1xuICAgICAgfSBlbHNlIGlmIChtYXRjaFByZWZpeCgncmdiJykpIHtcbiAgICAgICAgdGhpcy5mcm9tUmdiU3RyaW5nKHRyaW1TdHIpO1xuICAgICAgfSBlbHNlIGlmIChtYXRjaFByZWZpeCgnaHNsJykpIHtcbiAgICAgICAgdGhpcy5mcm9tSHNsU3RyaW5nKHRyaW1TdHIpO1xuICAgICAgfSBlbHNlIGlmIChtYXRjaFByZWZpeCgnaHN2JykgfHwgbWF0Y2hQcmVmaXgoJ2hzYicpKSB7XG4gICAgICAgIHRoaXMuZnJvbUhzdlN0cmluZyh0cmltU3RyKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgRmFzdENvbG9yKSB7XG4gICAgICB0aGlzLnIgPSBpbnB1dC5yO1xuICAgICAgdGhpcy5nID0gaW5wdXQuZztcbiAgICAgIHRoaXMuYiA9IGlucHV0LmI7XG4gICAgICB0aGlzLmEgPSBpbnB1dC5hO1xuICAgICAgdGhpcy5faCA9IGlucHV0Ll9oO1xuICAgICAgdGhpcy5fcyA9IGlucHV0Ll9zO1xuICAgICAgdGhpcy5fbCA9IGlucHV0Ll9sO1xuICAgICAgdGhpcy5fdiA9IGlucHV0Ll92O1xuICAgIH0gZWxzZSBpZiAobWF0Y2hGb3JtYXQoJ3JnYicpKSB7XG4gICAgICB0aGlzLnIgPSBsaW1pdFJhbmdlKGlucHV0LnIpO1xuICAgICAgdGhpcy5nID0gbGltaXRSYW5nZShpbnB1dC5nKTtcbiAgICAgIHRoaXMuYiA9IGxpbWl0UmFuZ2UoaW5wdXQuYik7XG4gICAgICB0aGlzLmEgPSB0eXBlb2YgaW5wdXQuYSA9PT0gJ251bWJlcicgPyBsaW1pdFJhbmdlKGlucHV0LmEsIDEpIDogMTtcbiAgICB9IGVsc2UgaWYgKG1hdGNoRm9ybWF0KCdoc2wnKSkge1xuICAgICAgdGhpcy5mcm9tSHNsKGlucHV0KTtcbiAgICB9IGVsc2UgaWYgKG1hdGNoRm9ybWF0KCdoc3YnKSkge1xuICAgICAgdGhpcy5mcm9tSHN2KGlucHV0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdAYW50LWRlc2lnbi9mYXN0LWNvbG9yOiB1bnN1cHBvcnRlZCBpbnB1dCAnICsgSlNPTi5zdHJpbmdpZnkoaW5wdXQpKTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBTZXR0ZXIgPT09PT09PT09PT09PT09PT09PT09PT1cblxuICBzZXRSKHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NjKCdyJywgdmFsdWUpO1xuICB9XG4gIHNldEcodmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5fc2MoJ2cnLCB2YWx1ZSk7XG4gIH1cbiAgc2V0Qih2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLl9zYygnYicsIHZhbHVlKTtcbiAgfVxuICBzZXRBKHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NjKCdhJywgdmFsdWUsIDEpO1xuICB9XG4gIHNldEh1ZSh2YWx1ZSkge1xuICAgIGNvbnN0IGhzdiA9IHRoaXMudG9Ic3YoKTtcbiAgICBoc3YuaCA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzLl9jKGhzdik7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBHZXR0ZXIgPT09PT09PT09PT09PT09PT09PT09PT1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHBlcmNlaXZlZCBsdW1pbmFuY2Ugb2YgYSBjb2xvciwgZnJvbSAwLTEuXG4gICAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvMjAwOC9SRUMtV0NBRzIwLTIwMDgxMjExLyNyZWxhdGl2ZWx1bWluYW5jZWRlZlxuICAgKi9cbiAgZ2V0THVtaW5hbmNlKCkge1xuICAgIGZ1bmN0aW9uIGFkanVzdEdhbW1hKHJhdykge1xuICAgICAgY29uc3QgdmFsID0gcmF3IC8gMjU1O1xuICAgICAgcmV0dXJuIHZhbCA8PSAwLjAzOTI4ID8gdmFsIC8gMTIuOTIgOiBNYXRoLnBvdygodmFsICsgMC4wNTUpIC8gMS4wNTUsIDIuNCk7XG4gICAgfVxuICAgIGNvbnN0IFIgPSBhZGp1c3RHYW1tYSh0aGlzLnIpO1xuICAgIGNvbnN0IEcgPSBhZGp1c3RHYW1tYSh0aGlzLmcpO1xuICAgIGNvbnN0IEIgPSBhZGp1c3RHYW1tYSh0aGlzLmIpO1xuICAgIHJldHVybiAwLjIxMjYgKiBSICsgMC43MTUyICogRyArIDAuMDcyMiAqIEI7XG4gIH1cbiAgZ2V0SHVlKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5faCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnN0IGRlbHRhID0gdGhpcy5nZXRNYXgoKSAtIHRoaXMuZ2V0TWluKCk7XG4gICAgICBpZiAoZGVsdGEgPT09IDApIHtcbiAgICAgICAgdGhpcy5faCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9oID0gcm91bmQoNjAgKiAodGhpcy5yID09PSB0aGlzLmdldE1heCgpID8gKHRoaXMuZyAtIHRoaXMuYikgLyBkZWx0YSArICh0aGlzLmcgPCB0aGlzLmIgPyA2IDogMCkgOiB0aGlzLmcgPT09IHRoaXMuZ2V0TWF4KCkgPyAodGhpcy5iIC0gdGhpcy5yKSAvIGRlbHRhICsgMiA6ICh0aGlzLnIgLSB0aGlzLmcpIC8gZGVsdGEgKyA0KSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9oO1xuICB9XG4gIGdldFNhdHVyYXRpb24oKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl9zID09PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc3QgZGVsdGEgPSB0aGlzLmdldE1heCgpIC0gdGhpcy5nZXRNaW4oKTtcbiAgICAgIGlmIChkZWx0YSA9PT0gMCkge1xuICAgICAgICB0aGlzLl9zID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3MgPSBkZWx0YSAvIHRoaXMuZ2V0TWF4KCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zO1xuICB9XG4gIGdldExpZ2h0bmVzcygpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX2wgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLl9sID0gKHRoaXMuZ2V0TWF4KCkgKyB0aGlzLmdldE1pbigpKSAvIDUxMDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2w7XG4gIH1cbiAgZ2V0VmFsdWUoKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl92ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5fdiA9IHRoaXMuZ2V0TWF4KCkgLyAyNTU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl92O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHBlcmNlaXZlZCBicmlnaHRuZXNzIG9mIHRoZSBjb2xvciwgZnJvbSAwLTI1NS5cbiAgICogTm90ZTogdGhpcyBpcyBub3QgdGhlIGIgb2YgSFNCXG4gICAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvQUVSVCNjb2xvci1jb250cmFzdFxuICAgKi9cbiAgZ2V0QnJpZ2h0bmVzcygpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX2JyaWdodG5lc3MgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLl9icmlnaHRuZXNzID0gKHRoaXMuciAqIDI5OSArIHRoaXMuZyAqIDU4NyArIHRoaXMuYiAqIDExNCkgLyAxMDAwO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYnJpZ2h0bmVzcztcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBGdW5jID09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGRhcmtlbihhbW91bnQgPSAxMCkge1xuICAgIGNvbnN0IGggPSB0aGlzLmdldEh1ZSgpO1xuICAgIGNvbnN0IHMgPSB0aGlzLmdldFNhdHVyYXRpb24oKTtcbiAgICBsZXQgbCA9IHRoaXMuZ2V0TGlnaHRuZXNzKCkgLSBhbW91bnQgLyAxMDA7XG4gICAgaWYgKGwgPCAwKSB7XG4gICAgICBsID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2Moe1xuICAgICAgaCxcbiAgICAgIHMsXG4gICAgICBsLFxuICAgICAgYTogdGhpcy5hXG4gICAgfSk7XG4gIH1cbiAgbGlnaHRlbihhbW91bnQgPSAxMCkge1xuICAgIGNvbnN0IGggPSB0aGlzLmdldEh1ZSgpO1xuICAgIGNvbnN0IHMgPSB0aGlzLmdldFNhdHVyYXRpb24oKTtcbiAgICBsZXQgbCA9IHRoaXMuZ2V0TGlnaHRuZXNzKCkgKyBhbW91bnQgLyAxMDA7XG4gICAgaWYgKGwgPiAxKSB7XG4gICAgICBsID0gMTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2Moe1xuICAgICAgaCxcbiAgICAgIHMsXG4gICAgICBsLFxuICAgICAgYTogdGhpcy5hXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWl4IHRoZSBjdXJyZW50IGNvbG9yIGEgZ2l2ZW4gYW1vdW50IHdpdGggYW5vdGhlciBjb2xvciwgZnJvbSAwIHRvIDEwMC5cbiAgICogMCBtZWFucyBubyBtaXhpbmcgKHJldHVybiBjdXJyZW50IGNvbG9yKS5cbiAgICovXG4gIG1peChpbnB1dCwgYW1vdW50ID0gNTApIHtcbiAgICBjb25zdCBjb2xvciA9IHRoaXMuX2MoaW5wdXQpO1xuICAgIGNvbnN0IHAgPSBhbW91bnQgLyAxMDA7XG4gICAgY29uc3QgY2FsYyA9IGtleSA9PiAoY29sb3Jba2V5XSAtIHRoaXNba2V5XSkgKiBwICsgdGhpc1trZXldO1xuICAgIGNvbnN0IHJnYmEgPSB7XG4gICAgICByOiByb3VuZChjYWxjKCdyJykpLFxuICAgICAgZzogcm91bmQoY2FsYygnZycpKSxcbiAgICAgIGI6IHJvdW5kKGNhbGMoJ2InKSksXG4gICAgICBhOiByb3VuZChjYWxjKCdhJykgKiAxMDApIC8gMTAwXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5fYyhyZ2JhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNaXggdGhlIGNvbG9yIHdpdGggcHVyZSB3aGl0ZSwgZnJvbSAwIHRvIDEwMC5cbiAgICogUHJvdmlkaW5nIDAgd2lsbCBkbyBub3RoaW5nLCBwcm92aWRpbmcgMTAwIHdpbGwgYWx3YXlzIHJldHVybiB3aGl0ZS5cbiAgICovXG4gIHRpbnQoYW1vdW50ID0gMTApIHtcbiAgICByZXR1cm4gdGhpcy5taXgoe1xuICAgICAgcjogMjU1LFxuICAgICAgZzogMjU1LFxuICAgICAgYjogMjU1LFxuICAgICAgYTogMVxuICAgIH0sIGFtb3VudCk7XG4gIH1cblxuICAvKipcbiAgICogTWl4IHRoZSBjb2xvciB3aXRoIHB1cmUgYmxhY2ssIGZyb20gMCB0byAxMDAuXG4gICAqIFByb3ZpZGluZyAwIHdpbGwgZG8gbm90aGluZywgcHJvdmlkaW5nIDEwMCB3aWxsIGFsd2F5cyByZXR1cm4gYmxhY2suXG4gICAqL1xuICBzaGFkZShhbW91bnQgPSAxMCkge1xuICAgIHJldHVybiB0aGlzLm1peCh7XG4gICAgICByOiAwLFxuICAgICAgZzogMCxcbiAgICAgIGI6IDAsXG4gICAgICBhOiAxXG4gICAgfSwgYW1vdW50KTtcbiAgfVxuICBvbkJhY2tncm91bmQoYmFja2dyb3VuZCkge1xuICAgIGNvbnN0IGJnID0gdGhpcy5fYyhiYWNrZ3JvdW5kKTtcbiAgICBjb25zdCBhbHBoYSA9IHRoaXMuYSArIGJnLmEgKiAoMSAtIHRoaXMuYSk7XG4gICAgY29uc3QgY2FsYyA9IGtleSA9PiB7XG4gICAgICByZXR1cm4gcm91bmQoKHRoaXNba2V5XSAqIHRoaXMuYSArIGJnW2tleV0gKiBiZy5hICogKDEgLSB0aGlzLmEpKSAvIGFscGhhKTtcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLl9jKHtcbiAgICAgIHI6IGNhbGMoJ3InKSxcbiAgICAgIGc6IGNhbGMoJ2cnKSxcbiAgICAgIGI6IGNhbGMoJ2InKSxcbiAgICAgIGE6IGFscGhhXG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBTdGF0dXMgPT09PT09PT09PT09PT09PT09PT09PT1cbiAgaXNEYXJrKCkge1xuICAgIHJldHVybiB0aGlzLmdldEJyaWdodG5lc3MoKSA8IDEyODtcbiAgfVxuICBpc0xpZ2h0KCkge1xuICAgIHJldHVybiB0aGlzLmdldEJyaWdodG5lc3MoKSA+PSAxMjg7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gTUlTQyA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgZXF1YWxzKG90aGVyKSB7XG4gICAgcmV0dXJuIHRoaXMuciA9PT0gb3RoZXIuciAmJiB0aGlzLmcgPT09IG90aGVyLmcgJiYgdGhpcy5iID09PSBvdGhlci5iICYmIHRoaXMuYSA9PT0gb3RoZXIuYTtcbiAgfVxuICBjbG9uZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fYyh0aGlzKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09IEZvcm1hdCA9PT09PT09PT09PT09PT09PT09PT09PVxuICB0b0hleFN0cmluZygpIHtcbiAgICBsZXQgaGV4ID0gJyMnO1xuICAgIGNvbnN0IHJIZXggPSAodGhpcy5yIHx8IDApLnRvU3RyaW5nKDE2KTtcbiAgICBoZXggKz0gckhleC5sZW5ndGggPT09IDIgPyBySGV4IDogJzAnICsgckhleDtcbiAgICBjb25zdCBnSGV4ID0gKHRoaXMuZyB8fCAwKS50b1N0cmluZygxNik7XG4gICAgaGV4ICs9IGdIZXgubGVuZ3RoID09PSAyID8gZ0hleCA6ICcwJyArIGdIZXg7XG4gICAgY29uc3QgYkhleCA9ICh0aGlzLmIgfHwgMCkudG9TdHJpbmcoMTYpO1xuICAgIGhleCArPSBiSGV4Lmxlbmd0aCA9PT0gMiA/IGJIZXggOiAnMCcgKyBiSGV4O1xuICAgIGlmICh0eXBlb2YgdGhpcy5hID09PSAnbnVtYmVyJyAmJiB0aGlzLmEgPj0gMCAmJiB0aGlzLmEgPCAxKSB7XG4gICAgICBjb25zdCBhSGV4ID0gcm91bmQodGhpcy5hICogMjU1KS50b1N0cmluZygxNik7XG4gICAgICBoZXggKz0gYUhleC5sZW5ndGggPT09IDIgPyBhSGV4IDogJzAnICsgYUhleDtcbiAgICB9XG4gICAgcmV0dXJuIGhleDtcbiAgfVxuXG4gIC8qKiBDU1Mgc3VwcG9ydCBjb2xvciBwYXR0ZXJuICovXG4gIHRvSHNsKCkge1xuICAgIHJldHVybiB7XG4gICAgICBoOiB0aGlzLmdldEh1ZSgpLFxuICAgICAgczogdGhpcy5nZXRTYXR1cmF0aW9uKCksXG4gICAgICBsOiB0aGlzLmdldExpZ2h0bmVzcygpLFxuICAgICAgYTogdGhpcy5hXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBDU1Mgc3VwcG9ydCBjb2xvciBwYXR0ZXJuICovXG4gIHRvSHNsU3RyaW5nKCkge1xuICAgIGNvbnN0IGggPSB0aGlzLmdldEh1ZSgpO1xuICAgIGNvbnN0IHMgPSByb3VuZCh0aGlzLmdldFNhdHVyYXRpb24oKSAqIDEwMCk7XG4gICAgY29uc3QgbCA9IHJvdW5kKHRoaXMuZ2V0TGlnaHRuZXNzKCkgKiAxMDApO1xuICAgIHJldHVybiB0aGlzLmEgIT09IDEgPyBgaHNsYSgke2h9LCR7c30lLCR7bH0lLCR7dGhpcy5hfSlgIDogYGhzbCgke2h9LCR7c30lLCR7bH0lKWA7XG4gIH1cblxuICAvKiogU2FtZSBhcyB0b0hzYiAqL1xuICB0b0hzdigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaDogdGhpcy5nZXRIdWUoKSxcbiAgICAgIHM6IHRoaXMuZ2V0U2F0dXJhdGlvbigpLFxuICAgICAgdjogdGhpcy5nZXRWYWx1ZSgpLFxuICAgICAgYTogdGhpcy5hXG4gICAgfTtcbiAgfVxuICB0b1JnYigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcjogdGhpcy5yLFxuICAgICAgZzogdGhpcy5nLFxuICAgICAgYjogdGhpcy5iLFxuICAgICAgYTogdGhpcy5hXG4gICAgfTtcbiAgfVxuICB0b1JnYlN0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5hICE9PSAxID8gYHJnYmEoJHt0aGlzLnJ9LCR7dGhpcy5nfSwke3RoaXMuYn0sJHt0aGlzLmF9KWAgOiBgcmdiKCR7dGhpcy5yfSwke3RoaXMuZ30sJHt0aGlzLmJ9KWA7XG4gIH1cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9SZ2JTdHJpbmcoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT0gUHJpdmF0ZXMgPT09PT09PT09PT09PT09PT09PT09PVxuICAvKiogUmV0dXJuIGEgbmV3IEZhc3RDb2xvciBvYmplY3Qgd2l0aCBvbmUgY2hhbm5lbCBjaGFuZ2VkICovXG4gIF9zYyhyZ2IsIHZhbHVlLCBtYXgpIHtcbiAgICBjb25zdCBjbG9uZSA9IHRoaXMuY2xvbmUoKTtcbiAgICBjbG9uZVtyZ2JdID0gbGltaXRSYW5nZSh2YWx1ZSwgbWF4KTtcbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cbiAgX2MoaW5wdXQpIHtcbiAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoaW5wdXQpO1xuICB9XG4gIGdldE1heCgpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX21heCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMuX21heCA9IE1hdGgubWF4KHRoaXMuciwgdGhpcy5nLCB0aGlzLmIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbWF4O1xuICB9XG4gIGdldE1pbigpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX21pbiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMuX21pbiA9IE1hdGgubWluKHRoaXMuciwgdGhpcy5nLCB0aGlzLmIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbWluO1xuICB9XG4gIGZyb21IZXhTdHJpbmcodHJpbVN0cikge1xuICAgIGNvbnN0IHdpdGhvdXRQcmVmaXggPSB0cmltU3RyLnJlcGxhY2UoJyMnLCAnJyk7XG4gICAgZnVuY3Rpb24gY29ubmVjdE51bShpbmRleDEsIGluZGV4Mikge1xuICAgICAgcmV0dXJuIHBhcnNlSW50KHdpdGhvdXRQcmVmaXhbaW5kZXgxXSArIHdpdGhvdXRQcmVmaXhbaW5kZXgyIHx8IGluZGV4MV0sIDE2KTtcbiAgICB9XG4gICAgaWYgKHdpdGhvdXRQcmVmaXgubGVuZ3RoIDwgNikge1xuICAgICAgLy8gI3JnYiBvciAjcmdiYVxuICAgICAgdGhpcy5yID0gY29ubmVjdE51bSgwKTtcbiAgICAgIHRoaXMuZyA9IGNvbm5lY3ROdW0oMSk7XG4gICAgICB0aGlzLmIgPSBjb25uZWN0TnVtKDIpO1xuICAgICAgdGhpcy5hID0gd2l0aG91dFByZWZpeFszXSA/IGNvbm5lY3ROdW0oMykgLyAyNTUgOiAxO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyAjcnJnZ2JiIG9yICNycmdnYmJhYVxuICAgICAgdGhpcy5yID0gY29ubmVjdE51bSgwLCAxKTtcbiAgICAgIHRoaXMuZyA9IGNvbm5lY3ROdW0oMiwgMyk7XG4gICAgICB0aGlzLmIgPSBjb25uZWN0TnVtKDQsIDUpO1xuICAgICAgdGhpcy5hID0gd2l0aG91dFByZWZpeFs2XSA/IGNvbm5lY3ROdW0oNiwgNykgLyAyNTUgOiAxO1xuICAgIH1cbiAgfVxuICBmcm9tSHNsKHtcbiAgICBoLFxuICAgIHMsXG4gICAgbCxcbiAgICBhXG4gIH0pIHtcbiAgICB0aGlzLl9oID0gaCAlIDM2MDtcbiAgICB0aGlzLl9zID0gcztcbiAgICB0aGlzLl9sID0gbDtcbiAgICB0aGlzLmEgPSB0eXBlb2YgYSA9PT0gJ251bWJlcicgPyBhIDogMTtcbiAgICBpZiAocyA8PSAwKSB7XG4gICAgICBjb25zdCByZ2IgPSByb3VuZChsICogMjU1KTtcbiAgICAgIHRoaXMuciA9IHJnYjtcbiAgICAgIHRoaXMuZyA9IHJnYjtcbiAgICAgIHRoaXMuYiA9IHJnYjtcbiAgICB9XG4gICAgbGV0IHIgPSAwLFxuICAgICAgZyA9IDAsXG4gICAgICBiID0gMDtcbiAgICBjb25zdCBodWVQcmltZSA9IGggLyA2MDtcbiAgICBjb25zdCBjaHJvbWEgPSAoMSAtIE1hdGguYWJzKDIgKiBsIC0gMSkpICogcztcbiAgICBjb25zdCBzZWNvbmRDb21wb25lbnQgPSBjaHJvbWEgKiAoMSAtIE1hdGguYWJzKGh1ZVByaW1lICUgMiAtIDEpKTtcbiAgICBpZiAoaHVlUHJpbWUgPj0gMCAmJiBodWVQcmltZSA8IDEpIHtcbiAgICAgIHIgPSBjaHJvbWE7XG4gICAgICBnID0gc2Vjb25kQ29tcG9uZW50O1xuICAgIH0gZWxzZSBpZiAoaHVlUHJpbWUgPj0gMSAmJiBodWVQcmltZSA8IDIpIHtcbiAgICAgIHIgPSBzZWNvbmRDb21wb25lbnQ7XG4gICAgICBnID0gY2hyb21hO1xuICAgIH0gZWxzZSBpZiAoaHVlUHJpbWUgPj0gMiAmJiBodWVQcmltZSA8IDMpIHtcbiAgICAgIGcgPSBjaHJvbWE7XG4gICAgICBiID0gc2Vjb25kQ29tcG9uZW50O1xuICAgIH0gZWxzZSBpZiAoaHVlUHJpbWUgPj0gMyAmJiBodWVQcmltZSA8IDQpIHtcbiAgICAgIGcgPSBzZWNvbmRDb21wb25lbnQ7XG4gICAgICBiID0gY2hyb21hO1xuICAgIH0gZWxzZSBpZiAoaHVlUHJpbWUgPj0gNCAmJiBodWVQcmltZSA8IDUpIHtcbiAgICAgIHIgPSBzZWNvbmRDb21wb25lbnQ7XG4gICAgICBiID0gY2hyb21hO1xuICAgIH0gZWxzZSBpZiAoaHVlUHJpbWUgPj0gNSAmJiBodWVQcmltZSA8IDYpIHtcbiAgICAgIHIgPSBjaHJvbWE7XG4gICAgICBiID0gc2Vjb25kQ29tcG9uZW50O1xuICAgIH1cbiAgICBjb25zdCBsaWdodG5lc3NNb2RpZmljYXRpb24gPSBsIC0gY2hyb21hIC8gMjtcbiAgICB0aGlzLnIgPSByb3VuZCgociArIGxpZ2h0bmVzc01vZGlmaWNhdGlvbikgKiAyNTUpO1xuICAgIHRoaXMuZyA9IHJvdW5kKChnICsgbGlnaHRuZXNzTW9kaWZpY2F0aW9uKSAqIDI1NSk7XG4gICAgdGhpcy5iID0gcm91bmQoKGIgKyBsaWdodG5lc3NNb2RpZmljYXRpb24pICogMjU1KTtcbiAgfVxuICBmcm9tSHN2KHtcbiAgICBoLFxuICAgIHMsXG4gICAgdixcbiAgICBhXG4gIH0pIHtcbiAgICB0aGlzLl9oID0gaCAlIDM2MDtcbiAgICB0aGlzLl9zID0gcztcbiAgICB0aGlzLl92ID0gdjtcbiAgICB0aGlzLmEgPSB0eXBlb2YgYSA9PT0gJ251bWJlcicgPyBhIDogMTtcbiAgICBjb25zdCB2diA9IHJvdW5kKHYgKiAyNTUpO1xuICAgIHRoaXMuciA9IHZ2O1xuICAgIHRoaXMuZyA9IHZ2O1xuICAgIHRoaXMuYiA9IHZ2O1xuICAgIGlmIChzIDw9IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaGggPSBoIC8gNjA7XG4gICAgY29uc3QgaSA9IE1hdGguZmxvb3IoaGgpO1xuICAgIGNvbnN0IGZmID0gaGggLSBpO1xuICAgIGNvbnN0IHAgPSByb3VuZCh2ICogKDEuMCAtIHMpICogMjU1KTtcbiAgICBjb25zdCBxID0gcm91bmQodiAqICgxLjAgLSBzICogZmYpICogMjU1KTtcbiAgICBjb25zdCB0ID0gcm91bmQodiAqICgxLjAgLSBzICogKDEuMCAtIGZmKSkgKiAyNTUpO1xuICAgIHN3aXRjaCAoaSkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICB0aGlzLmcgPSB0O1xuICAgICAgICB0aGlzLmIgPSBwO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgdGhpcy5yID0gcTtcbiAgICAgICAgdGhpcy5iID0gcDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHRoaXMuciA9IHA7XG4gICAgICAgIHRoaXMuYiA9IHQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgICB0aGlzLnIgPSBwO1xuICAgICAgICB0aGlzLmcgPSBxO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNDpcbiAgICAgICAgdGhpcy5yID0gdDtcbiAgICAgICAgdGhpcy5nID0gcDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDU6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLmcgPSBwO1xuICAgICAgICB0aGlzLmIgPSBxO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgZnJvbUhzdlN0cmluZyh0cmltU3RyKSB7XG4gICAgY29uc3QgY2VsbHMgPSBzcGxpdENvbG9yU3RyKHRyaW1TdHIsIHBhcnNlSFNWb3JIU0wpO1xuICAgIHRoaXMuZnJvbUhzdih7XG4gICAgICBoOiBjZWxsc1swXSxcbiAgICAgIHM6IGNlbGxzWzFdLFxuICAgICAgdjogY2VsbHNbMl0sXG4gICAgICBhOiBjZWxsc1szXVxuICAgIH0pO1xuICB9XG4gIGZyb21Ic2xTdHJpbmcodHJpbVN0cikge1xuICAgIGNvbnN0IGNlbGxzID0gc3BsaXRDb2xvclN0cih0cmltU3RyLCBwYXJzZUhTVm9ySFNMKTtcbiAgICB0aGlzLmZyb21Ic2woe1xuICAgICAgaDogY2VsbHNbMF0sXG4gICAgICBzOiBjZWxsc1sxXSxcbiAgICAgIGw6IGNlbGxzWzJdLFxuICAgICAgYTogY2VsbHNbM11cbiAgICB9KTtcbiAgfVxuICBmcm9tUmdiU3RyaW5nKHRyaW1TdHIpIHtcbiAgICBjb25zdCBjZWxscyA9IHNwbGl0Q29sb3JTdHIodHJpbVN0ciwgKG51bSwgdHh0KSA9PlxuICAgIC8vIENvbnZlcnQgcGVyY2VudGFnZSB0byBudW1iZXIuIGUuZy4gNTAlIC0+IDEyOFxuICAgIHR4dC5pbmNsdWRlcygnJScpID8gcm91bmQobnVtIC8gMTAwICogMjU1KSA6IG51bSk7XG4gICAgdGhpcy5yID0gY2VsbHNbMF07XG4gICAgdGhpcy5nID0gY2VsbHNbMV07XG4gICAgdGhpcy5iID0gY2VsbHNbMl07XG4gICAgdGhpcy5hID0gY2VsbHNbM107XG4gIH1cbn0iLCAiaW1wb3J0IHsgRmFzdENvbG9yIH0gZnJvbSAnQGFudC1kZXNpZ24vZmFzdC1jb2xvcic7XG52YXIgaHVlU3RlcCA9IDI7IC8vIFx1ODI3Mlx1NzZGOFx1OTYzNlx1NjhBRlxudmFyIHNhdHVyYXRpb25TdGVwID0gMC4xNjsgLy8gXHU5OTcxXHU1NDhDXHU1RUE2XHU5NjM2XHU2OEFGXHVGRjBDXHU2RDQ1XHU4MjcyXHU5MEU4XHU1MjA2XG52YXIgc2F0dXJhdGlvblN0ZXAyID0gMC4wNTsgLy8gXHU5OTcxXHU1NDhDXHU1RUE2XHU5NjM2XHU2OEFGXHVGRjBDXHU2REYxXHU4MjcyXHU5MEU4XHU1MjA2XG52YXIgYnJpZ2h0bmVzc1N0ZXAxID0gMC4wNTsgLy8gXHU0RUFFXHU1RUE2XHU5NjM2XHU2OEFGXHVGRjBDXHU2RDQ1XHU4MjcyXHU5MEU4XHU1MjA2XG52YXIgYnJpZ2h0bmVzc1N0ZXAyID0gMC4xNTsgLy8gXHU0RUFFXHU1RUE2XHU5NjM2XHU2OEFGXHVGRjBDXHU2REYxXHU4MjcyXHU5MEU4XHU1MjA2XG52YXIgbGlnaHRDb2xvckNvdW50ID0gNTsgLy8gXHU2RDQ1XHU4MjcyXHU2NTcwXHU5MUNGXHVGRjBDXHU0RTNCXHU4MjcyXHU0RTBBXG52YXIgZGFya0NvbG9yQ291bnQgPSA0OyAvLyBcdTZERjFcdTgyNzJcdTY1NzBcdTkxQ0ZcdUZGMENcdTRFM0JcdTgyNzJcdTRFMEJcblxuLy8gXHU2Njk3XHU4MjcyXHU0RTNCXHU5ODk4XHU5ODlDXHU4MjcyXHU2NjIwXHU1QzA0XHU1MTczXHU3Q0ZCXHU4ODY4XG52YXIgZGFya0NvbG9yTWFwID0gW3tcbiAgaW5kZXg6IDcsXG4gIGFtb3VudDogMTVcbn0sIHtcbiAgaW5kZXg6IDYsXG4gIGFtb3VudDogMjVcbn0sIHtcbiAgaW5kZXg6IDUsXG4gIGFtb3VudDogMzBcbn0sIHtcbiAgaW5kZXg6IDUsXG4gIGFtb3VudDogNDVcbn0sIHtcbiAgaW5kZXg6IDUsXG4gIGFtb3VudDogNjVcbn0sIHtcbiAgaW5kZXg6IDUsXG4gIGFtb3VudDogODVcbn0sIHtcbiAgaW5kZXg6IDQsXG4gIGFtb3VudDogOTBcbn0sIHtcbiAgaW5kZXg6IDMsXG4gIGFtb3VudDogOTVcbn0sIHtcbiAgaW5kZXg6IDIsXG4gIGFtb3VudDogOTdcbn0sIHtcbiAgaW5kZXg6IDEsXG4gIGFtb3VudDogOThcbn1dO1xuZnVuY3Rpb24gZ2V0SHVlKGhzdiwgaSwgbGlnaHQpIHtcbiAgdmFyIGh1ZTtcbiAgLy8gXHU2ODM5XHU2MzZFXHU4MjcyXHU3NkY4XHU0RTBEXHU1NDBDXHVGRjBDXHU4MjcyXHU3NkY4XHU4RjZDXHU1NDExXHU0RTBEXHU1NDBDXG4gIGlmIChNYXRoLnJvdW5kKGhzdi5oKSA+PSA2MCAmJiBNYXRoLnJvdW5kKGhzdi5oKSA8PSAyNDApIHtcbiAgICBodWUgPSBsaWdodCA/IE1hdGgucm91bmQoaHN2LmgpIC0gaHVlU3RlcCAqIGkgOiBNYXRoLnJvdW5kKGhzdi5oKSArIGh1ZVN0ZXAgKiBpO1xuICB9IGVsc2Uge1xuICAgIGh1ZSA9IGxpZ2h0ID8gTWF0aC5yb3VuZChoc3YuaCkgKyBodWVTdGVwICogaSA6IE1hdGgucm91bmQoaHN2LmgpIC0gaHVlU3RlcCAqIGk7XG4gIH1cbiAgaWYgKGh1ZSA8IDApIHtcbiAgICBodWUgKz0gMzYwO1xuICB9IGVsc2UgaWYgKGh1ZSA+PSAzNjApIHtcbiAgICBodWUgLT0gMzYwO1xuICB9XG4gIHJldHVybiBodWU7XG59XG5mdW5jdGlvbiBnZXRTYXR1cmF0aW9uKGhzdiwgaSwgbGlnaHQpIHtcbiAgLy8gZ3JleSBjb2xvciBkb24ndCBjaGFuZ2Ugc2F0dXJhdGlvblxuICBpZiAoaHN2LmggPT09IDAgJiYgaHN2LnMgPT09IDApIHtcbiAgICByZXR1cm4gaHN2LnM7XG4gIH1cbiAgdmFyIHNhdHVyYXRpb247XG4gIGlmIChsaWdodCkge1xuICAgIHNhdHVyYXRpb24gPSBoc3YucyAtIHNhdHVyYXRpb25TdGVwICogaTtcbiAgfSBlbHNlIGlmIChpID09PSBkYXJrQ29sb3JDb3VudCkge1xuICAgIHNhdHVyYXRpb24gPSBoc3YucyArIHNhdHVyYXRpb25TdGVwO1xuICB9IGVsc2Uge1xuICAgIHNhdHVyYXRpb24gPSBoc3YucyArIHNhdHVyYXRpb25TdGVwMiAqIGk7XG4gIH1cbiAgLy8gXHU4RkI5XHU3NTRDXHU1MDNDXHU0RkVFXHU2QjYzXG4gIGlmIChzYXR1cmF0aW9uID4gMSkge1xuICAgIHNhdHVyYXRpb24gPSAxO1xuICB9XG4gIC8vIFx1N0IyQ1x1NEUwMFx1NjgzQ1x1NzY4NCBzIFx1OTY1MFx1NTIzNlx1NTcyOCAwLjA2LTAuMSBcdTRFNEJcdTk1RjRcbiAgaWYgKGxpZ2h0ICYmIGkgPT09IGxpZ2h0Q29sb3JDb3VudCAmJiBzYXR1cmF0aW9uID4gMC4xKSB7XG4gICAgc2F0dXJhdGlvbiA9IDAuMTtcbiAgfVxuICBpZiAoc2F0dXJhdGlvbiA8IDAuMDYpIHtcbiAgICBzYXR1cmF0aW9uID0gMC4wNjtcbiAgfVxuICByZXR1cm4gTWF0aC5yb3VuZChzYXR1cmF0aW9uICogMTAwKSAvIDEwMDtcbn1cbmZ1bmN0aW9uIGdldFZhbHVlKGhzdiwgaSwgbGlnaHQpIHtcbiAgdmFyIHZhbHVlO1xuICBpZiAobGlnaHQpIHtcbiAgICB2YWx1ZSA9IGhzdi52ICsgYnJpZ2h0bmVzc1N0ZXAxICogaTtcbiAgfSBlbHNlIHtcbiAgICB2YWx1ZSA9IGhzdi52IC0gYnJpZ2h0bmVzc1N0ZXAyICogaTtcbiAgfVxuICAvLyBDbGFtcCB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDFcbiAgdmFsdWUgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCB2YWx1ZSkpO1xuICByZXR1cm4gTWF0aC5yb3VuZCh2YWx1ZSAqIDEwMCkgLyAxMDA7XG59XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZW5lcmF0ZShjb2xvcikge1xuICB2YXIgb3B0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gIHZhciBwYXR0ZXJucyA9IFtdO1xuICB2YXIgcENvbG9yID0gbmV3IEZhc3RDb2xvcihjb2xvcik7XG4gIHZhciBoc3YgPSBwQ29sb3IudG9Ic3YoKTtcbiAgZm9yICh2YXIgaSA9IGxpZ2h0Q29sb3JDb3VudDsgaSA+IDA7IGkgLT0gMSkge1xuICAgIHZhciBjID0gbmV3IEZhc3RDb2xvcih7XG4gICAgICBoOiBnZXRIdWUoaHN2LCBpLCB0cnVlKSxcbiAgICAgIHM6IGdldFNhdHVyYXRpb24oaHN2LCBpLCB0cnVlKSxcbiAgICAgIHY6IGdldFZhbHVlKGhzdiwgaSwgdHJ1ZSlcbiAgICB9KTtcbiAgICBwYXR0ZXJucy5wdXNoKGMpO1xuICB9XG4gIHBhdHRlcm5zLnB1c2gocENvbG9yKTtcbiAgZm9yICh2YXIgX2kgPSAxOyBfaSA8PSBkYXJrQ29sb3JDb3VudDsgX2kgKz0gMSkge1xuICAgIHZhciBfYyA9IG5ldyBGYXN0Q29sb3Ioe1xuICAgICAgaDogZ2V0SHVlKGhzdiwgX2kpLFxuICAgICAgczogZ2V0U2F0dXJhdGlvbihoc3YsIF9pKSxcbiAgICAgIHY6IGdldFZhbHVlKGhzdiwgX2kpXG4gICAgfSk7XG4gICAgcGF0dGVybnMucHVzaChfYyk7XG4gIH1cblxuICAvLyBkYXJrIHRoZW1lIHBhdHRlcm5zXG4gIGlmIChvcHRzLnRoZW1lID09PSAnZGFyaycpIHtcbiAgICByZXR1cm4gZGFya0NvbG9yTWFwLm1hcChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgdmFyIGluZGV4ID0gX3JlZi5pbmRleCxcbiAgICAgICAgYW1vdW50ID0gX3JlZi5hbW91bnQ7XG4gICAgICByZXR1cm4gbmV3IEZhc3RDb2xvcihvcHRzLmJhY2tncm91bmRDb2xvciB8fCAnIzE0MTQxNCcpLm1peChwYXR0ZXJuc1tpbmRleF0sIGFtb3VudCkudG9IZXhTdHJpbmcoKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcGF0dGVybnMubWFwKGZ1bmN0aW9uIChjKSB7XG4gICAgcmV0dXJuIGMudG9IZXhTdHJpbmcoKTtcbiAgfSk7XG59IiwgIi8vIEdlbmVyYXRlZCBieSBzY3JpcHQuIERvIE5PVCBtb2RpZnkhXG5cbmV4cG9ydCB2YXIgcHJlc2V0UHJpbWFyeUNvbG9ycyA9IHtcbiAgXCJyZWRcIjogXCIjRjUyMjJEXCIsXG4gIFwidm9sY2Fub1wiOiBcIiNGQTU0MUNcIixcbiAgXCJvcmFuZ2VcIjogXCIjRkE4QzE2XCIsXG4gIFwiZ29sZFwiOiBcIiNGQUFEMTRcIixcbiAgXCJ5ZWxsb3dcIjogXCIjRkFEQjE0XCIsXG4gIFwibGltZVwiOiBcIiNBMEQ5MTFcIixcbiAgXCJncmVlblwiOiBcIiM1MkM0MUFcIixcbiAgXCJjeWFuXCI6IFwiIzEzQzJDMlwiLFxuICBcImJsdWVcIjogXCIjMTY3N0ZGXCIsXG4gIFwiZ2Vla2JsdWVcIjogXCIjMkY1NEVCXCIsXG4gIFwicHVycGxlXCI6IFwiIzcyMkVEMVwiLFxuICBcIm1hZ2VudGFcIjogXCIjRUIyRjk2XCIsXG4gIFwiZ3JleVwiOiBcIiM2NjY2NjZcIlxufTtcbmV4cG9ydCB2YXIgcmVkID0gW1wiI2ZmZjFmMFwiLCBcIiNmZmNjYzdcIiwgXCIjZmZhMzllXCIsIFwiI2ZmNzg3NVwiLCBcIiNmZjRkNGZcIiwgXCIjZjUyMjJkXCIsIFwiI2NmMTMyMlwiLCBcIiNhODA3MWFcIiwgXCIjODIwMDE0XCIsIFwiIzVjMDAxMVwiXTtcbnJlZC5wcmltYXJ5ID0gcmVkWzVdO1xuZXhwb3J0IHZhciB2b2xjYW5vID0gW1wiI2ZmZjJlOFwiLCBcIiNmZmQ4YmZcIiwgXCIjZmZiYjk2XCIsIFwiI2ZmOWM2ZVwiLCBcIiNmZjdhNDVcIiwgXCIjZmE1NDFjXCIsIFwiI2Q0MzgwZFwiLCBcIiNhZDIxMDJcIiwgXCIjODcxNDAwXCIsIFwiIzYxMGIwMFwiXTtcbnZvbGNhbm8ucHJpbWFyeSA9IHZvbGNhbm9bNV07XG5leHBvcnQgdmFyIG9yYW5nZSA9IFtcIiNmZmY3ZTZcIiwgXCIjZmZlN2JhXCIsIFwiI2ZmZDU5MVwiLCBcIiNmZmMwNjlcIiwgXCIjZmZhOTQwXCIsIFwiI2ZhOGMxNlwiLCBcIiNkNDZiMDhcIiwgXCIjYWQ0ZTAwXCIsIFwiIzg3MzgwMFwiLCBcIiM2MTI1MDBcIl07XG5vcmFuZ2UucHJpbWFyeSA9IG9yYW5nZVs1XTtcbmV4cG9ydCB2YXIgZ29sZCA9IFtcIiNmZmZiZTZcIiwgXCIjZmZmMWI4XCIsIFwiI2ZmZTU4ZlwiLCBcIiNmZmQ2NjZcIiwgXCIjZmZjNTNkXCIsIFwiI2ZhYWQxNFwiLCBcIiNkNDg4MDZcIiwgXCIjYWQ2ODAwXCIsIFwiIzg3NGQwMFwiLCBcIiM2MTM0MDBcIl07XG5nb2xkLnByaW1hcnkgPSBnb2xkWzVdO1xuZXhwb3J0IHZhciB5ZWxsb3cgPSBbXCIjZmVmZmU2XCIsIFwiI2ZmZmZiOFwiLCBcIiNmZmZiOGZcIiwgXCIjZmZmNTY2XCIsIFwiI2ZmZWMzZFwiLCBcIiNmYWRiMTRcIiwgXCIjZDRiMTA2XCIsIFwiI2FkOGIwMFwiLCBcIiM4NzY4MDBcIiwgXCIjNjE0NzAwXCJdO1xueWVsbG93LnByaW1hcnkgPSB5ZWxsb3dbNV07XG5leHBvcnQgdmFyIGxpbWUgPSBbXCIjZmNmZmU2XCIsIFwiI2Y0ZmZiOFwiLCBcIiNlYWZmOGZcIiwgXCIjZDNmMjYxXCIsIFwiI2JhZTYzN1wiLCBcIiNhMGQ5MTFcIiwgXCIjN2NiMzA1XCIsIFwiIzViOGMwMFwiLCBcIiMzZjY2MDBcIiwgXCIjMjU0MDAwXCJdO1xubGltZS5wcmltYXJ5ID0gbGltZVs1XTtcbmV4cG9ydCB2YXIgZ3JlZW4gPSBbXCIjZjZmZmVkXCIsIFwiI2Q5ZjdiZVwiLCBcIiNiN2ViOGZcIiwgXCIjOTVkZTY0XCIsIFwiIzczZDEzZFwiLCBcIiM1MmM0MWFcIiwgXCIjMzg5ZTBkXCIsIFwiIzIzNzgwNFwiLCBcIiMxMzUyMDBcIiwgXCIjMDkyYjAwXCJdO1xuZ3JlZW4ucHJpbWFyeSA9IGdyZWVuWzVdO1xuZXhwb3J0IHZhciBjeWFuID0gW1wiI2U2ZmZmYlwiLCBcIiNiNWY1ZWNcIiwgXCIjODdlOGRlXCIsIFwiIzVjZGJkM1wiLCBcIiMzNmNmYzlcIiwgXCIjMTNjMmMyXCIsIFwiIzA4OTc5Y1wiLCBcIiMwMDZkNzVcIiwgXCIjMDA0NzRmXCIsIFwiIzAwMjMyOVwiXTtcbmN5YW4ucHJpbWFyeSA9IGN5YW5bNV07XG5leHBvcnQgdmFyIGJsdWUgPSBbXCIjZTZmNGZmXCIsIFwiI2JhZTBmZlwiLCBcIiM5MWNhZmZcIiwgXCIjNjliMWZmXCIsIFwiIzQwOTZmZlwiLCBcIiMxNjc3ZmZcIiwgXCIjMDk1OGQ5XCIsIFwiIzAwM2ViM1wiLCBcIiMwMDJjOGNcIiwgXCIjMDAxZDY2XCJdO1xuYmx1ZS5wcmltYXJ5ID0gYmx1ZVs1XTtcbmV4cG9ydCB2YXIgZ2Vla2JsdWUgPSBbXCIjZjBmNWZmXCIsIFwiI2Q2ZTRmZlwiLCBcIiNhZGM2ZmZcIiwgXCIjODVhNWZmXCIsIFwiIzU5N2VmN1wiLCBcIiMyZjU0ZWJcIiwgXCIjMWQzOWM0XCIsIFwiIzEwMjM5ZVwiLCBcIiMwNjExNzhcIiwgXCIjMDMwODUyXCJdO1xuZ2Vla2JsdWUucHJpbWFyeSA9IGdlZWtibHVlWzVdO1xuZXhwb3J0IHZhciBwdXJwbGUgPSBbXCIjZjlmMGZmXCIsIFwiI2VmZGJmZlwiLCBcIiNkM2FkZjdcIiwgXCIjYjM3ZmViXCIsIFwiIzkyNTRkZVwiLCBcIiM3MjJlZDFcIiwgXCIjNTMxZGFiXCIsIFwiIzM5MTA4NVwiLCBcIiMyMjA3NWVcIiwgXCIjMTIwMzM4XCJdO1xucHVycGxlLnByaW1hcnkgPSBwdXJwbGVbNV07XG5leHBvcnQgdmFyIG1hZ2VudGEgPSBbXCIjZmZmMGY2XCIsIFwiI2ZmZDZlN1wiLCBcIiNmZmFkZDJcIiwgXCIjZmY4NWMwXCIsIFwiI2Y3NTlhYlwiLCBcIiNlYjJmOTZcIiwgXCIjYzQxZDdmXCIsIFwiIzllMTA2OFwiLCBcIiM3ODA2NTBcIiwgXCIjNTIwMzM5XCJdO1xubWFnZW50YS5wcmltYXJ5ID0gbWFnZW50YVs1XTtcbmV4cG9ydCB2YXIgZ3JleSA9IFtcIiNhNmE2YTZcIiwgXCIjOTk5OTk5XCIsIFwiIzhjOGM4Y1wiLCBcIiM4MDgwODBcIiwgXCIjNzM3MzczXCIsIFwiIzY2NjY2NlwiLCBcIiM0MDQwNDBcIiwgXCIjMWExYTFhXCIsIFwiIzAwMDAwMFwiLCBcIiMwMDAwMDBcIl07XG5ncmV5LnByaW1hcnkgPSBncmV5WzVdO1xuZXhwb3J0IHZhciBncmF5ID0gZ3JleTtcbmV4cG9ydCB2YXIgcHJlc2V0UGFsZXR0ZXMgPSB7XG4gIHJlZDogcmVkLFxuICB2b2xjYW5vOiB2b2xjYW5vLFxuICBvcmFuZ2U6IG9yYW5nZSxcbiAgZ29sZDogZ29sZCxcbiAgeWVsbG93OiB5ZWxsb3csXG4gIGxpbWU6IGxpbWUsXG4gIGdyZWVuOiBncmVlbixcbiAgY3lhbjogY3lhbixcbiAgYmx1ZTogYmx1ZSxcbiAgZ2Vla2JsdWU6IGdlZWtibHVlLFxuICBwdXJwbGU6IHB1cnBsZSxcbiAgbWFnZW50YTogbWFnZW50YSxcbiAgZ3JleTogZ3JleVxufTtcbmV4cG9ydCB2YXIgcmVkRGFyayA9IFtcIiMyYTEyMTVcIiwgXCIjNDMxNDE4XCIsIFwiIzU4MTgxY1wiLCBcIiM3OTFhMWZcIiwgXCIjYTYxZDI0XCIsIFwiI2QzMjAyOVwiLCBcIiNlODQ3NDlcIiwgXCIjZjM3MzcwXCIsIFwiI2Y4OWY5YVwiLCBcIiNmYWM4YzNcIl07XG5yZWREYXJrLnByaW1hcnkgPSByZWREYXJrWzVdO1xuZXhwb3J0IHZhciB2b2xjYW5vRGFyayA9IFtcIiMyYjE2MTFcIiwgXCIjNDQxZDEyXCIsIFwiIzU5MjcxNlwiLCBcIiM3YzMxMThcIiwgXCIjYWEzZTE5XCIsIFwiI2Q4NGExYlwiLCBcIiNlODcwNDBcIiwgXCIjZjM5NTZhXCIsIFwiI2Y4YjY5MlwiLCBcIiNmYWQ0YmNcIl07XG52b2xjYW5vRGFyay5wcmltYXJ5ID0gdm9sY2Fub0RhcmtbNV07XG5leHBvcnQgdmFyIG9yYW5nZURhcmsgPSBbXCIjMmIxZDExXCIsIFwiIzQ0MmExMVwiLCBcIiM1OTM4MTVcIiwgXCIjN2M0YTE1XCIsIFwiI2FhNjIxNVwiLCBcIiNkODdhMTZcIiwgXCIjZTg5YTNjXCIsIFwiI2YzYjc2NVwiLCBcIiNmOGNmOGRcIiwgXCIjZmFlM2I3XCJdO1xub3JhbmdlRGFyay5wcmltYXJ5ID0gb3JhbmdlRGFya1s1XTtcbmV4cG9ydCB2YXIgZ29sZERhcmsgPSBbXCIjMmIyMTExXCIsIFwiIzQ0MzExMVwiLCBcIiM1OTQyMTRcIiwgXCIjN2M1OTE0XCIsIFwiI2FhNzcxNFwiLCBcIiNkODk2MTRcIiwgXCIjZThiMzM5XCIsIFwiI2YzY2M2MlwiLCBcIiNmOGRmOGJcIiwgXCIjZmFlZGI1XCJdO1xuZ29sZERhcmsucHJpbWFyeSA9IGdvbGREYXJrWzVdO1xuZXhwb3J0IHZhciB5ZWxsb3dEYXJrID0gW1wiIzJiMjYxMVwiLCBcIiM0NDNiMTFcIiwgXCIjNTk1MDE0XCIsIFwiIzdjNmUxNFwiLCBcIiNhYTk1MTRcIiwgXCIjZDhiZDE0XCIsIFwiI2U4ZDYzOVwiLCBcIiNmM2VhNjJcIiwgXCIjZjhmNDhiXCIsIFwiI2ZhZmFiNVwiXTtcbnllbGxvd0RhcmsucHJpbWFyeSA9IHllbGxvd0RhcmtbNV07XG5leHBvcnQgdmFyIGxpbWVEYXJrID0gW1wiIzFmMjYxMVwiLCBcIiMyZTNjMTBcIiwgXCIjM2U0ZjEzXCIsIFwiIzUzNmQxM1wiLCBcIiM2Zjk0MTJcIiwgXCIjOGJiYjExXCIsIFwiI2E5ZDEzNFwiLCBcIiNjOWU3NWRcIiwgXCIjZTRmODhiXCIsIFwiI2YwZmFiNVwiXTtcbmxpbWVEYXJrLnByaW1hcnkgPSBsaW1lRGFya1s1XTtcbmV4cG9ydCB2YXIgZ3JlZW5EYXJrID0gW1wiIzE2MjMxMlwiLCBcIiMxZDM3MTJcIiwgXCIjMjc0OTE2XCIsIFwiIzMwNjMxN1wiLCBcIiMzYzg2MThcIiwgXCIjNDlhYTE5XCIsIFwiIzZhYmUzOVwiLCBcIiM4ZmQ0NjBcIiwgXCIjYjJlNThiXCIsIFwiI2Q1ZjJiYlwiXTtcbmdyZWVuRGFyay5wcmltYXJ5ID0gZ3JlZW5EYXJrWzVdO1xuZXhwb3J0IHZhciBjeWFuRGFyayA9IFtcIiMxMTIxMjNcIiwgXCIjMTEzNTM2XCIsIFwiIzE0NDg0OFwiLCBcIiMxNDYyNjJcIiwgXCIjMTM4NTg1XCIsIFwiIzEzYThhOFwiLCBcIiMzM2JjYjdcIiwgXCIjNThkMWM5XCIsIFwiIzg0ZTJkOFwiLCBcIiNiMmYxZThcIl07XG5jeWFuRGFyay5wcmltYXJ5ID0gY3lhbkRhcmtbNV07XG5leHBvcnQgdmFyIGJsdWVEYXJrID0gW1wiIzExMWEyY1wiLCBcIiMxMTI1NDVcIiwgXCIjMTUzMjViXCIsIFwiIzE1NDE3ZVwiLCBcIiMxNTU0YWRcIiwgXCIjMTY2OGRjXCIsIFwiIzNjODllOFwiLCBcIiM2NWE5ZjNcIiwgXCIjOGRjNWY4XCIsIFwiI2I3ZGNmYVwiXTtcbmJsdWVEYXJrLnByaW1hcnkgPSBibHVlRGFya1s1XTtcbmV4cG9ydCB2YXIgZ2Vla2JsdWVEYXJrID0gW1wiIzEzMTYyOVwiLCBcIiMxNjFkNDBcIiwgXCIjMWMyNzU1XCIsIFwiIzIwMzE3NVwiLCBcIiMyNjNlYTBcIiwgXCIjMmI0YWNiXCIsIFwiIzUyNzNlMFwiLCBcIiM3ZjllZjNcIiwgXCIjYThjMWY4XCIsIFwiI2QyZTBmYVwiXTtcbmdlZWtibHVlRGFyay5wcmltYXJ5ID0gZ2Vla2JsdWVEYXJrWzVdO1xuZXhwb3J0IHZhciBwdXJwbGVEYXJrID0gW1wiIzFhMTMyNVwiLCBcIiMyNDE2M2FcIiwgXCIjMzAxYzRkXCIsIFwiIzNlMjA2OVwiLCBcIiM1MTI1OGZcIiwgXCIjNjQyYWI1XCIsIFwiIzg1NGVjYVwiLCBcIiNhYjdhZTBcIiwgXCIjY2RhOGYwXCIsIFwiI2ViZDdmYVwiXTtcbnB1cnBsZURhcmsucHJpbWFyeSA9IHB1cnBsZURhcmtbNV07XG5leHBvcnQgdmFyIG1hZ2VudGFEYXJrID0gW1wiIzI5MTMyMVwiLCBcIiM0MDE2MmZcIiwgXCIjNTUxYzNiXCIsIFwiIzc1MjA0ZlwiLCBcIiNhMDI2NjlcIiwgXCIjY2IyYjgzXCIsIFwiI2UwNTI5Y1wiLCBcIiNmMzdmYjdcIiwgXCIjZjhhOGNjXCIsIFwiI2ZhZDJlM1wiXTtcbm1hZ2VudGFEYXJrLnByaW1hcnkgPSBtYWdlbnRhRGFya1s1XTtcbmV4cG9ydCB2YXIgZ3JleURhcmsgPSBbXCIjMTUxNTE1XCIsIFwiIzFmMWYxZlwiLCBcIiMyZDJkMmRcIiwgXCIjMzkzOTM5XCIsIFwiIzQ5NDk0OVwiLCBcIiM1YTVhNWFcIiwgXCIjNmE2YTZhXCIsIFwiIzdiN2I3YlwiLCBcIiM4ODg4ODhcIiwgXCIjOTY5Njk2XCJdO1xuZ3JleURhcmsucHJpbWFyeSA9IGdyZXlEYXJrWzVdO1xuZXhwb3J0IHZhciBwcmVzZXREYXJrUGFsZXR0ZXMgPSB7XG4gIHJlZDogcmVkRGFyayxcbiAgdm9sY2Fubzogdm9sY2Fub0RhcmssXG4gIG9yYW5nZTogb3JhbmdlRGFyayxcbiAgZ29sZDogZ29sZERhcmssXG4gIHllbGxvdzogeWVsbG93RGFyayxcbiAgbGltZTogbGltZURhcmssXG4gIGdyZWVuOiBncmVlbkRhcmssXG4gIGN5YW46IGN5YW5EYXJrLFxuICBibHVlOiBibHVlRGFyayxcbiAgZ2Vla2JsdWU6IGdlZWtibHVlRGFyayxcbiAgcHVycGxlOiBwdXJwbGVEYXJrLFxuICBtYWdlbnRhOiBtYWdlbnRhRGFyayxcbiAgZ3JleTogZ3JleURhcmtcbn07IiwgImltcG9ydCB7IEZhc3RDb2xvciB9IGZyb20gJ0BhbnQtZGVzaWduL2Zhc3QtY29sb3InO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2VuQ29sb3JNYXBUb2tlbihzZWVkLCBfcmVmKSB7XG4gIGxldCB7XG4gICAgZ2VuZXJhdGVDb2xvclBhbGV0dGVzLFxuICAgIGdlbmVyYXRlTmV1dHJhbENvbG9yUGFsZXR0ZXNcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IHtcbiAgICBjb2xvclN1Y2Nlc3M6IGNvbG9yU3VjY2Vzc0Jhc2UsXG4gICAgY29sb3JXYXJuaW5nOiBjb2xvcldhcm5pbmdCYXNlLFxuICAgIGNvbG9yRXJyb3I6IGNvbG9yRXJyb3JCYXNlLFxuICAgIGNvbG9ySW5mbzogY29sb3JJbmZvQmFzZSxcbiAgICBjb2xvclByaW1hcnk6IGNvbG9yUHJpbWFyeUJhc2UsXG4gICAgY29sb3JCZ0Jhc2UsXG4gICAgY29sb3JUZXh0QmFzZVxuICB9ID0gc2VlZDtcbiAgY29uc3QgcHJpbWFyeUNvbG9ycyA9IGdlbmVyYXRlQ29sb3JQYWxldHRlcyhjb2xvclByaW1hcnlCYXNlKTtcbiAgY29uc3Qgc3VjY2Vzc0NvbG9ycyA9IGdlbmVyYXRlQ29sb3JQYWxldHRlcyhjb2xvclN1Y2Nlc3NCYXNlKTtcbiAgY29uc3Qgd2FybmluZ0NvbG9ycyA9IGdlbmVyYXRlQ29sb3JQYWxldHRlcyhjb2xvcldhcm5pbmdCYXNlKTtcbiAgY29uc3QgZXJyb3JDb2xvcnMgPSBnZW5lcmF0ZUNvbG9yUGFsZXR0ZXMoY29sb3JFcnJvckJhc2UpO1xuICBjb25zdCBpbmZvQ29sb3JzID0gZ2VuZXJhdGVDb2xvclBhbGV0dGVzKGNvbG9ySW5mb0Jhc2UpO1xuICBjb25zdCBuZXV0cmFsQ29sb3JzID0gZ2VuZXJhdGVOZXV0cmFsQ29sb3JQYWxldHRlcyhjb2xvckJnQmFzZSwgY29sb3JUZXh0QmFzZSk7XG4gIC8vIENvbG9yIExpbmtcbiAgY29uc3QgY29sb3JMaW5rID0gc2VlZC5jb2xvckxpbmsgfHwgc2VlZC5jb2xvckluZm87XG4gIGNvbnN0IGxpbmtDb2xvcnMgPSBnZW5lcmF0ZUNvbG9yUGFsZXR0ZXMoY29sb3JMaW5rKTtcbiAgY29uc3QgY29sb3JFcnJvckJnRmlsbGVkSG92ZXIgPSBuZXcgRmFzdENvbG9yKGVycm9yQ29sb3JzWzFdKS5taXgobmV3IEZhc3RDb2xvcihlcnJvckNvbG9yc1szXSksIDUwKS50b0hleFN0cmluZygpO1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBuZXV0cmFsQ29sb3JzKSwge1xuICAgIGNvbG9yUHJpbWFyeUJnOiBwcmltYXJ5Q29sb3JzWzFdLFxuICAgIGNvbG9yUHJpbWFyeUJnSG92ZXI6IHByaW1hcnlDb2xvcnNbMl0sXG4gICAgY29sb3JQcmltYXJ5Qm9yZGVyOiBwcmltYXJ5Q29sb3JzWzNdLFxuICAgIGNvbG9yUHJpbWFyeUJvcmRlckhvdmVyOiBwcmltYXJ5Q29sb3JzWzRdLFxuICAgIGNvbG9yUHJpbWFyeUhvdmVyOiBwcmltYXJ5Q29sb3JzWzVdLFxuICAgIGNvbG9yUHJpbWFyeTogcHJpbWFyeUNvbG9yc1s2XSxcbiAgICBjb2xvclByaW1hcnlBY3RpdmU6IHByaW1hcnlDb2xvcnNbN10sXG4gICAgY29sb3JQcmltYXJ5VGV4dEhvdmVyOiBwcmltYXJ5Q29sb3JzWzhdLFxuICAgIGNvbG9yUHJpbWFyeVRleHQ6IHByaW1hcnlDb2xvcnNbOV0sXG4gICAgY29sb3JQcmltYXJ5VGV4dEFjdGl2ZTogcHJpbWFyeUNvbG9yc1sxMF0sXG4gICAgY29sb3JTdWNjZXNzQmc6IHN1Y2Nlc3NDb2xvcnNbMV0sXG4gICAgY29sb3JTdWNjZXNzQmdIb3Zlcjogc3VjY2Vzc0NvbG9yc1syXSxcbiAgICBjb2xvclN1Y2Nlc3NCb3JkZXI6IHN1Y2Nlc3NDb2xvcnNbM10sXG4gICAgY29sb3JTdWNjZXNzQm9yZGVySG92ZXI6IHN1Y2Nlc3NDb2xvcnNbNF0sXG4gICAgY29sb3JTdWNjZXNzSG92ZXI6IHN1Y2Nlc3NDb2xvcnNbNF0sXG4gICAgY29sb3JTdWNjZXNzOiBzdWNjZXNzQ29sb3JzWzZdLFxuICAgIGNvbG9yU3VjY2Vzc0FjdGl2ZTogc3VjY2Vzc0NvbG9yc1s3XSxcbiAgICBjb2xvclN1Y2Nlc3NUZXh0SG92ZXI6IHN1Y2Nlc3NDb2xvcnNbOF0sXG4gICAgY29sb3JTdWNjZXNzVGV4dDogc3VjY2Vzc0NvbG9yc1s5XSxcbiAgICBjb2xvclN1Y2Nlc3NUZXh0QWN0aXZlOiBzdWNjZXNzQ29sb3JzWzEwXSxcbiAgICBjb2xvckVycm9yQmc6IGVycm9yQ29sb3JzWzFdLFxuICAgIGNvbG9yRXJyb3JCZ0hvdmVyOiBlcnJvckNvbG9yc1syXSxcbiAgICBjb2xvckVycm9yQmdGaWxsZWRIb3ZlcixcbiAgICBjb2xvckVycm9yQmdBY3RpdmU6IGVycm9yQ29sb3JzWzNdLFxuICAgIGNvbG9yRXJyb3JCb3JkZXI6IGVycm9yQ29sb3JzWzNdLFxuICAgIGNvbG9yRXJyb3JCb3JkZXJIb3ZlcjogZXJyb3JDb2xvcnNbNF0sXG4gICAgY29sb3JFcnJvckhvdmVyOiBlcnJvckNvbG9yc1s1XSxcbiAgICBjb2xvckVycm9yOiBlcnJvckNvbG9yc1s2XSxcbiAgICBjb2xvckVycm9yQWN0aXZlOiBlcnJvckNvbG9yc1s3XSxcbiAgICBjb2xvckVycm9yVGV4dEhvdmVyOiBlcnJvckNvbG9yc1s4XSxcbiAgICBjb2xvckVycm9yVGV4dDogZXJyb3JDb2xvcnNbOV0sXG4gICAgY29sb3JFcnJvclRleHRBY3RpdmU6IGVycm9yQ29sb3JzWzEwXSxcbiAgICBjb2xvcldhcm5pbmdCZzogd2FybmluZ0NvbG9yc1sxXSxcbiAgICBjb2xvcldhcm5pbmdCZ0hvdmVyOiB3YXJuaW5nQ29sb3JzWzJdLFxuICAgIGNvbG9yV2FybmluZ0JvcmRlcjogd2FybmluZ0NvbG9yc1szXSxcbiAgICBjb2xvcldhcm5pbmdCb3JkZXJIb3Zlcjogd2FybmluZ0NvbG9yc1s0XSxcbiAgICBjb2xvcldhcm5pbmdIb3Zlcjogd2FybmluZ0NvbG9yc1s0XSxcbiAgICBjb2xvcldhcm5pbmc6IHdhcm5pbmdDb2xvcnNbNl0sXG4gICAgY29sb3JXYXJuaW5nQWN0aXZlOiB3YXJuaW5nQ29sb3JzWzddLFxuICAgIGNvbG9yV2FybmluZ1RleHRIb3Zlcjogd2FybmluZ0NvbG9yc1s4XSxcbiAgICBjb2xvcldhcm5pbmdUZXh0OiB3YXJuaW5nQ29sb3JzWzldLFxuICAgIGNvbG9yV2FybmluZ1RleHRBY3RpdmU6IHdhcm5pbmdDb2xvcnNbMTBdLFxuICAgIGNvbG9ySW5mb0JnOiBpbmZvQ29sb3JzWzFdLFxuICAgIGNvbG9ySW5mb0JnSG92ZXI6IGluZm9Db2xvcnNbMl0sXG4gICAgY29sb3JJbmZvQm9yZGVyOiBpbmZvQ29sb3JzWzNdLFxuICAgIGNvbG9ySW5mb0JvcmRlckhvdmVyOiBpbmZvQ29sb3JzWzRdLFxuICAgIGNvbG9ySW5mb0hvdmVyOiBpbmZvQ29sb3JzWzRdLFxuICAgIGNvbG9ySW5mbzogaW5mb0NvbG9yc1s2XSxcbiAgICBjb2xvckluZm9BY3RpdmU6IGluZm9Db2xvcnNbN10sXG4gICAgY29sb3JJbmZvVGV4dEhvdmVyOiBpbmZvQ29sb3JzWzhdLFxuICAgIGNvbG9ySW5mb1RleHQ6IGluZm9Db2xvcnNbOV0sXG4gICAgY29sb3JJbmZvVGV4dEFjdGl2ZTogaW5mb0NvbG9yc1sxMF0sXG4gICAgY29sb3JMaW5rSG92ZXI6IGxpbmtDb2xvcnNbNF0sXG4gICAgY29sb3JMaW5rOiBsaW5rQ29sb3JzWzZdLFxuICAgIGNvbG9yTGlua0FjdGl2ZTogbGlua0NvbG9yc1s3XSxcbiAgICBjb2xvckJnTWFzazogbmV3IEZhc3RDb2xvcignIzAwMCcpLnNldEEoMC40NSkudG9SZ2JTdHJpbmcoKSxcbiAgICBjb2xvcldoaXRlOiAnI2ZmZidcbiAgfSk7XG59IiwgImNvbnN0IGdlblJhZGl1cyA9IHJhZGl1c0Jhc2UgPT4ge1xuICBsZXQgcmFkaXVzTEcgPSByYWRpdXNCYXNlO1xuICBsZXQgcmFkaXVzU00gPSByYWRpdXNCYXNlO1xuICBsZXQgcmFkaXVzWFMgPSByYWRpdXNCYXNlO1xuICBsZXQgcmFkaXVzT3V0ZXIgPSByYWRpdXNCYXNlO1xuICAvLyByYWRpdXNMR1xuICBpZiAocmFkaXVzQmFzZSA8IDYgJiYgcmFkaXVzQmFzZSA+PSA1KSB7XG4gICAgcmFkaXVzTEcgPSByYWRpdXNCYXNlICsgMTtcbiAgfSBlbHNlIGlmIChyYWRpdXNCYXNlIDwgMTYgJiYgcmFkaXVzQmFzZSA+PSA2KSB7XG4gICAgcmFkaXVzTEcgPSByYWRpdXNCYXNlICsgMjtcbiAgfSBlbHNlIGlmIChyYWRpdXNCYXNlID49IDE2KSB7XG4gICAgcmFkaXVzTEcgPSAxNjtcbiAgfVxuICAvLyByYWRpdXNTTVxuICBpZiAocmFkaXVzQmFzZSA8IDcgJiYgcmFkaXVzQmFzZSA+PSA1KSB7XG4gICAgcmFkaXVzU00gPSA0O1xuICB9IGVsc2UgaWYgKHJhZGl1c0Jhc2UgPCA4ICYmIHJhZGl1c0Jhc2UgPj0gNykge1xuICAgIHJhZGl1c1NNID0gNTtcbiAgfSBlbHNlIGlmIChyYWRpdXNCYXNlIDwgMTQgJiYgcmFkaXVzQmFzZSA+PSA4KSB7XG4gICAgcmFkaXVzU00gPSA2O1xuICB9IGVsc2UgaWYgKHJhZGl1c0Jhc2UgPCAxNiAmJiByYWRpdXNCYXNlID49IDE0KSB7XG4gICAgcmFkaXVzU00gPSA3O1xuICB9IGVsc2UgaWYgKHJhZGl1c0Jhc2UgPj0gMTYpIHtcbiAgICByYWRpdXNTTSA9IDg7XG4gIH1cbiAgLy8gcmFkaXVzWFNcbiAgaWYgKHJhZGl1c0Jhc2UgPCA2ICYmIHJhZGl1c0Jhc2UgPj0gMikge1xuICAgIHJhZGl1c1hTID0gMTtcbiAgfSBlbHNlIGlmIChyYWRpdXNCYXNlID49IDYpIHtcbiAgICByYWRpdXNYUyA9IDI7XG4gIH1cbiAgLy8gcmFkaXVzT3V0ZXJcbiAgaWYgKHJhZGl1c0Jhc2UgPiA0ICYmIHJhZGl1c0Jhc2UgPCA4KSB7XG4gICAgcmFkaXVzT3V0ZXIgPSA0O1xuICB9IGVsc2UgaWYgKHJhZGl1c0Jhc2UgPj0gOCkge1xuICAgIHJhZGl1c091dGVyID0gNjtcbiAgfVxuICByZXR1cm4ge1xuICAgIGJvcmRlclJhZGl1czogcmFkaXVzQmFzZSxcbiAgICBib3JkZXJSYWRpdXNYUzogcmFkaXVzWFMsXG4gICAgYm9yZGVyUmFkaXVzU006IHJhZGl1c1NNLFxuICAgIGJvcmRlclJhZGl1c0xHOiByYWRpdXNMRyxcbiAgICBib3JkZXJSYWRpdXNPdXRlcjogcmFkaXVzT3V0ZXJcbiAgfTtcbn07XG5leHBvcnQgZGVmYXVsdCBnZW5SYWRpdXM7IiwgImltcG9ydCBnZW5SYWRpdXMgZnJvbSAnLi9nZW5SYWRpdXMnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2VuQ29tbW9uTWFwVG9rZW4odG9rZW4pIHtcbiAgY29uc3Qge1xuICAgIG1vdGlvblVuaXQsXG4gICAgbW90aW9uQmFzZSxcbiAgICBib3JkZXJSYWRpdXMsXG4gICAgbGluZVdpZHRoXG4gIH0gPSB0b2tlbjtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe1xuICAgIC8vIG1vdGlvblxuICAgIG1vdGlvbkR1cmF0aW9uRmFzdDogYCR7KG1vdGlvbkJhc2UgKyBtb3Rpb25Vbml0KS50b0ZpeGVkKDEpfXNgLFxuICAgIG1vdGlvbkR1cmF0aW9uTWlkOiBgJHsobW90aW9uQmFzZSArIG1vdGlvblVuaXQgKiAyKS50b0ZpeGVkKDEpfXNgLFxuICAgIG1vdGlvbkR1cmF0aW9uU2xvdzogYCR7KG1vdGlvbkJhc2UgKyBtb3Rpb25Vbml0ICogMykudG9GaXhlZCgxKX1zYCxcbiAgICAvLyBsaW5lXG4gICAgbGluZVdpZHRoQm9sZDogbGluZVdpZHRoICsgMVxuICB9LCBnZW5SYWRpdXMoYm9yZGVyUmFkaXVzKSk7XG59IiwgImNvbnN0IGdlbkNvbnRyb2xIZWlnaHQgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb250cm9sSGVpZ2h0XG4gIH0gPSB0b2tlbjtcbiAgcmV0dXJuIHtcbiAgICBjb250cm9sSGVpZ2h0U006IGNvbnRyb2xIZWlnaHQgKiAwLjc1LFxuICAgIGNvbnRyb2xIZWlnaHRYUzogY29udHJvbEhlaWdodCAqIDAuNSxcbiAgICBjb250cm9sSGVpZ2h0TEc6IGNvbnRyb2xIZWlnaHQgKiAxLjI1XG4gIH07XG59O1xuZXhwb3J0IGRlZmF1bHQgZ2VuQ29udHJvbEhlaWdodDsiLCAiZXhwb3J0IGZ1bmN0aW9uIGdldExpbmVIZWlnaHQoZm9udFNpemUpIHtcbiAgcmV0dXJuIChmb250U2l6ZSArIDgpIC8gZm9udFNpemU7XG59XG4vLyBodHRwczovL3podWFubGFuLnpoaWh1LmNvbS9wLzMyNzQ2ODEwXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRGb250U2l6ZXMoYmFzZSkge1xuICBjb25zdCBmb250U2l6ZXMgPSBBcnJheS5mcm9tKHtcbiAgICBsZW5ndGg6IDEwXG4gIH0pLm1hcCgoXywgaW5kZXgpID0+IHtcbiAgICBjb25zdCBpID0gaW5kZXggLSAxO1xuICAgIGNvbnN0IGJhc2VTaXplID0gYmFzZSAqIE1hdGgucG93KE1hdGguRSwgaSAvIDUpO1xuICAgIGNvbnN0IGludFNpemUgPSBpbmRleCA+IDEgPyBNYXRoLmZsb29yKGJhc2VTaXplKSA6IE1hdGguY2VpbChiYXNlU2l6ZSk7XG4gICAgLy8gQ29udmVydCB0byBldmVuXG4gICAgcmV0dXJuIE1hdGguZmxvb3IoaW50U2l6ZSAvIDIpICogMjtcbiAgfSk7XG4gIGZvbnRTaXplc1sxXSA9IGJhc2U7XG4gIHJldHVybiBmb250U2l6ZXMubWFwKHNpemUgPT4gKHtcbiAgICBzaXplLFxuICAgIGxpbmVIZWlnaHQ6IGdldExpbmVIZWlnaHQoc2l6ZSlcbiAgfSkpO1xufSIsICJpbXBvcnQgZ2VuRm9udFNpemVzIGZyb20gJy4vZ2VuRm9udFNpemVzJztcbmNvbnN0IGdlbkZvbnRNYXBUb2tlbiA9IGZvbnRTaXplID0+IHtcbiAgY29uc3QgZm9udFNpemVQYWlycyA9IGdlbkZvbnRTaXplcyhmb250U2l6ZSk7XG4gIGNvbnN0IGZvbnRTaXplcyA9IGZvbnRTaXplUGFpcnMubWFwKHBhaXIgPT4gcGFpci5zaXplKTtcbiAgY29uc3QgbGluZUhlaWdodHMgPSBmb250U2l6ZVBhaXJzLm1hcChwYWlyID0+IHBhaXIubGluZUhlaWdodCk7XG4gIGNvbnN0IGZvbnRTaXplTUQgPSBmb250U2l6ZXNbMV07XG4gIGNvbnN0IGZvbnRTaXplU00gPSBmb250U2l6ZXNbMF07XG4gIGNvbnN0IGZvbnRTaXplTEcgPSBmb250U2l6ZXNbMl07XG4gIGNvbnN0IGxpbmVIZWlnaHQgPSBsaW5lSGVpZ2h0c1sxXTtcbiAgY29uc3QgbGluZUhlaWdodFNNID0gbGluZUhlaWdodHNbMF07XG4gIGNvbnN0IGxpbmVIZWlnaHRMRyA9IGxpbmVIZWlnaHRzWzJdO1xuICByZXR1cm4ge1xuICAgIGZvbnRTaXplU00sXG4gICAgZm9udFNpemU6IGZvbnRTaXplTUQsXG4gICAgZm9udFNpemVMRyxcbiAgICBmb250U2l6ZVhMOiBmb250U2l6ZXNbM10sXG4gICAgZm9udFNpemVIZWFkaW5nMTogZm9udFNpemVzWzZdLFxuICAgIGZvbnRTaXplSGVhZGluZzI6IGZvbnRTaXplc1s1XSxcbiAgICBmb250U2l6ZUhlYWRpbmczOiBmb250U2l6ZXNbNF0sXG4gICAgZm9udFNpemVIZWFkaW5nNDogZm9udFNpemVzWzNdLFxuICAgIGZvbnRTaXplSGVhZGluZzU6IGZvbnRTaXplc1syXSxcbiAgICBsaW5lSGVpZ2h0LFxuICAgIGxpbmVIZWlnaHRMRyxcbiAgICBsaW5lSGVpZ2h0U00sXG4gICAgZm9udEhlaWdodDogTWF0aC5yb3VuZChsaW5lSGVpZ2h0ICogZm9udFNpemVNRCksXG4gICAgZm9udEhlaWdodExHOiBNYXRoLnJvdW5kKGxpbmVIZWlnaHRMRyAqIGZvbnRTaXplTEcpLFxuICAgIGZvbnRIZWlnaHRTTTogTWF0aC5yb3VuZChsaW5lSGVpZ2h0U00gKiBmb250U2l6ZVNNKSxcbiAgICBsaW5lSGVpZ2h0SGVhZGluZzE6IGxpbmVIZWlnaHRzWzZdLFxuICAgIGxpbmVIZWlnaHRIZWFkaW5nMjogbGluZUhlaWdodHNbNV0sXG4gICAgbGluZUhlaWdodEhlYWRpbmczOiBsaW5lSGVpZ2h0c1s0XSxcbiAgICBsaW5lSGVpZ2h0SGVhZGluZzQ6IGxpbmVIZWlnaHRzWzNdLFxuICAgIGxpbmVIZWlnaHRIZWFkaW5nNTogbGluZUhlaWdodHNbMl1cbiAgfTtcbn07XG5leHBvcnQgZGVmYXVsdCBnZW5Gb250TWFwVG9rZW47IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdlblNpemVNYXBUb2tlbih0b2tlbikge1xuICBjb25zdCB7XG4gICAgc2l6ZVVuaXQsXG4gICAgc2l6ZVN0ZXBcbiAgfSA9IHRva2VuO1xuICByZXR1cm4ge1xuICAgIHNpemVYWEw6IHNpemVVbml0ICogKHNpemVTdGVwICsgOCksXG4gICAgLy8gNDhcbiAgICBzaXplWEw6IHNpemVVbml0ICogKHNpemVTdGVwICsgNCksXG4gICAgLy8gMzJcbiAgICBzaXplTEc6IHNpemVVbml0ICogKHNpemVTdGVwICsgMiksXG4gICAgLy8gMjRcbiAgICBzaXplTUQ6IHNpemVVbml0ICogKHNpemVTdGVwICsgMSksXG4gICAgLy8gMjBcbiAgICBzaXplTVM6IHNpemVVbml0ICogc2l6ZVN0ZXAsXG4gICAgLy8gMTZcbiAgICBzaXplOiBzaXplVW5pdCAqIHNpemVTdGVwLFxuICAgIC8vIDE2XG4gICAgc2l6ZVNNOiBzaXplVW5pdCAqIChzaXplU3RlcCAtIDEpLFxuICAgIC8vIDEyXG4gICAgc2l6ZVhTOiBzaXplVW5pdCAqIChzaXplU3RlcCAtIDIpLFxuICAgIC8vIDhcbiAgICBzaXplWFhTOiBzaXplVW5pdCAqIChzaXplU3RlcCAtIDMpIC8vIDRcbiAgfTtcbn0iLCAiaW1wb3J0IHsgRmFzdENvbG9yIH0gZnJvbSAnQGFudC1kZXNpZ24vZmFzdC1jb2xvcic7XG5leHBvcnQgY29uc3QgZ2V0QWxwaGFDb2xvciA9IChiYXNlQ29sb3IsIGFscGhhKSA9PiBuZXcgRmFzdENvbG9yKGJhc2VDb2xvcikuc2V0QShhbHBoYSkudG9SZ2JTdHJpbmcoKTtcbmV4cG9ydCBjb25zdCBnZXRTb2xpZENvbG9yID0gKGJhc2VDb2xvciwgYnJpZ2h0bmVzcykgPT4ge1xuICBjb25zdCBpbnN0YW5jZSA9IG5ldyBGYXN0Q29sb3IoYmFzZUNvbG9yKTtcbiAgcmV0dXJuIGluc3RhbmNlLmRhcmtlbihicmlnaHRuZXNzKS50b0hleFN0cmluZygpO1xufTsiLCAiaW1wb3J0IHsgZ2VuZXJhdGUgfSBmcm9tICdAYW50LWRlc2lnbi9jb2xvcnMnO1xuaW1wb3J0IHsgZ2V0QWxwaGFDb2xvciwgZ2V0U29saWRDb2xvciB9IGZyb20gJy4vY29sb3JBbGdvcml0aG0nO1xuZXhwb3J0IGNvbnN0IGdlbmVyYXRlQ29sb3JQYWxldHRlcyA9IGJhc2VDb2xvciA9PiB7XG4gIGNvbnN0IGNvbG9ycyA9IGdlbmVyYXRlKGJhc2VDb2xvcik7XG4gIHJldHVybiB7XG4gICAgMTogY29sb3JzWzBdLFxuICAgIDI6IGNvbG9yc1sxXSxcbiAgICAzOiBjb2xvcnNbMl0sXG4gICAgNDogY29sb3JzWzNdLFxuICAgIDU6IGNvbG9yc1s0XSxcbiAgICA2OiBjb2xvcnNbNV0sXG4gICAgNzogY29sb3JzWzZdLFxuICAgIDg6IGNvbG9yc1s0XSxcbiAgICA5OiBjb2xvcnNbNV0sXG4gICAgMTA6IGNvbG9yc1s2XVxuICAgIC8vIDg6IGNvbG9yc1s3XSxcbiAgICAvLyA5OiBjb2xvcnNbOF0sXG4gICAgLy8gMTA6IGNvbG9yc1s5XSxcbiAgfTtcbn07XG5leHBvcnQgY29uc3QgZ2VuZXJhdGVOZXV0cmFsQ29sb3JQYWxldHRlcyA9IChiZ0Jhc2VDb2xvciwgdGV4dEJhc2VDb2xvcikgPT4ge1xuICBjb25zdCBjb2xvckJnQmFzZSA9IGJnQmFzZUNvbG9yIHx8ICcjZmZmJztcbiAgY29uc3QgY29sb3JUZXh0QmFzZSA9IHRleHRCYXNlQ29sb3IgfHwgJyMwMDAnO1xuICByZXR1cm4ge1xuICAgIGNvbG9yQmdCYXNlLFxuICAgIGNvbG9yVGV4dEJhc2UsXG4gICAgY29sb3JUZXh0OiBnZXRBbHBoYUNvbG9yKGNvbG9yVGV4dEJhc2UsIDAuODgpLFxuICAgIGNvbG9yVGV4dFNlY29uZGFyeTogZ2V0QWxwaGFDb2xvcihjb2xvclRleHRCYXNlLCAwLjY1KSxcbiAgICBjb2xvclRleHRUZXJ0aWFyeTogZ2V0QWxwaGFDb2xvcihjb2xvclRleHRCYXNlLCAwLjQ1KSxcbiAgICBjb2xvclRleHRRdWF0ZXJuYXJ5OiBnZXRBbHBoYUNvbG9yKGNvbG9yVGV4dEJhc2UsIDAuMjUpLFxuICAgIGNvbG9yRmlsbDogZ2V0QWxwaGFDb2xvcihjb2xvclRleHRCYXNlLCAwLjE1KSxcbiAgICBjb2xvckZpbGxTZWNvbmRhcnk6IGdldEFscGhhQ29sb3IoY29sb3JUZXh0QmFzZSwgMC4wNiksXG4gICAgY29sb3JGaWxsVGVydGlhcnk6IGdldEFscGhhQ29sb3IoY29sb3JUZXh0QmFzZSwgMC4wNCksXG4gICAgY29sb3JGaWxsUXVhdGVybmFyeTogZ2V0QWxwaGFDb2xvcihjb2xvclRleHRCYXNlLCAwLjAyKSxcbiAgICBjb2xvckJnU29saWQ6IGdldEFscGhhQ29sb3IoY29sb3JUZXh0QmFzZSwgMSksXG4gICAgY29sb3JCZ1NvbGlkSG92ZXI6IGdldEFscGhhQ29sb3IoY29sb3JUZXh0QmFzZSwgMC43NSksXG4gICAgY29sb3JCZ1NvbGlkQWN0aXZlOiBnZXRBbHBoYUNvbG9yKGNvbG9yVGV4dEJhc2UsIDAuOTUpLFxuICAgIGNvbG9yQmdMYXlvdXQ6IGdldFNvbGlkQ29sb3IoY29sb3JCZ0Jhc2UsIDQpLFxuICAgIGNvbG9yQmdDb250YWluZXI6IGdldFNvbGlkQ29sb3IoY29sb3JCZ0Jhc2UsIDApLFxuICAgIGNvbG9yQmdFbGV2YXRlZDogZ2V0U29saWRDb2xvcihjb2xvckJnQmFzZSwgMCksXG4gICAgY29sb3JCZ1Nwb3RsaWdodDogZ2V0QWxwaGFDb2xvcihjb2xvclRleHRCYXNlLCAwLjg1KSxcbiAgICBjb2xvckJnQmx1cjogJ3RyYW5zcGFyZW50JyxcbiAgICBjb2xvckJvcmRlcjogZ2V0U29saWRDb2xvcihjb2xvckJnQmFzZSwgMTUpLFxuICAgIGNvbG9yQm9yZGVyU2Vjb25kYXJ5OiBnZXRTb2xpZENvbG9yKGNvbG9yQmdCYXNlLCA2KVxuICB9O1xufTsiLCAiaW1wb3J0IHsgZ2VuZXJhdGUsIHByZXNldFBhbGV0dGVzLCBwcmVzZXRQcmltYXJ5Q29sb3JzIH0gZnJvbSAnQGFudC1kZXNpZ24vY29sb3JzJztcbmltcG9ydCB7IGRlZmF1bHRQcmVzZXRDb2xvcnMgfSBmcm9tICcuLi9zZWVkJztcbmltcG9ydCBnZW5Db2xvck1hcFRva2VuIGZyb20gJy4uL3NoYXJlZC9nZW5Db2xvck1hcFRva2VuJztcbmltcG9ydCBnZW5Db21tb25NYXBUb2tlbiBmcm9tICcuLi9zaGFyZWQvZ2VuQ29tbW9uTWFwVG9rZW4nO1xuaW1wb3J0IGdlbkNvbnRyb2xIZWlnaHQgZnJvbSAnLi4vc2hhcmVkL2dlbkNvbnRyb2xIZWlnaHQnO1xuaW1wb3J0IGdlbkZvbnRNYXBUb2tlbiBmcm9tICcuLi9zaGFyZWQvZ2VuRm9udE1hcFRva2VuJztcbmltcG9ydCBnZW5TaXplTWFwVG9rZW4gZnJvbSAnLi4vc2hhcmVkL2dlblNpemVNYXBUb2tlbic7XG5pbXBvcnQgeyBnZW5lcmF0ZUNvbG9yUGFsZXR0ZXMsIGdlbmVyYXRlTmV1dHJhbENvbG9yUGFsZXR0ZXMgfSBmcm9tICcuL2NvbG9ycyc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZXJpdmF0aXZlKHRva2VuKSB7XG4gIC8vIHBpbmsgaXMgZGVwcmVjYXRlZCBuYW1lIG9mIG1hZ2VudGEsIGtlZXAgdGhpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgcHJlc2V0UHJpbWFyeUNvbG9ycy5waW5rID0gcHJlc2V0UHJpbWFyeUNvbG9ycy5tYWdlbnRhO1xuICBwcmVzZXRQYWxldHRlcy5waW5rID0gcHJlc2V0UGFsZXR0ZXMubWFnZW50YTtcbiAgY29uc3QgY29sb3JQYWxldHRlcyA9IE9iamVjdC5rZXlzKGRlZmF1bHRQcmVzZXRDb2xvcnMpLm1hcChjb2xvcktleSA9PiB7XG4gICAgY29uc3QgY29sb3JzID0gdG9rZW5bY29sb3JLZXldID09PSBwcmVzZXRQcmltYXJ5Q29sb3JzW2NvbG9yS2V5XSA/IHByZXNldFBhbGV0dGVzW2NvbG9yS2V5XSA6IGdlbmVyYXRlKHRva2VuW2NvbG9yS2V5XSk7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oe1xuICAgICAgbGVuZ3RoOiAxMFxuICAgIH0sICgpID0+IDEpLnJlZHVjZSgocHJldiwgXywgaSkgPT4ge1xuICAgICAgcHJldltgJHtjb2xvcktleX0tJHtpICsgMX1gXSA9IGNvbG9yc1tpXTtcbiAgICAgIHByZXZbYCR7Y29sb3JLZXl9JHtpICsgMX1gXSA9IGNvbG9yc1tpXTtcbiAgICAgIHJldHVybiBwcmV2O1xuICAgIH0sIHt9KTtcbiAgfSkucmVkdWNlKChwcmV2LCBjdXIpID0+IHtcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS9ub1BhcmFtZXRlckFzc2lnbjogaXQgaXMgYSByZWR1Y2VcbiAgICBwcmV2ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgY3VyKTtcbiAgICByZXR1cm4gcHJldjtcbiAgfSwge30pO1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdG9rZW4pLCBjb2xvclBhbGV0dGVzKSwgZ2VuQ29sb3JNYXBUb2tlbih0b2tlbiwge1xuICAgIGdlbmVyYXRlQ29sb3JQYWxldHRlcyxcbiAgICBnZW5lcmF0ZU5ldXRyYWxDb2xvclBhbGV0dGVzXG4gIH0pKSwgZ2VuRm9udE1hcFRva2VuKHRva2VuLmZvbnRTaXplKSksIGdlblNpemVNYXBUb2tlbih0b2tlbikpLCBnZW5Db250cm9sSGVpZ2h0KHRva2VuKSksIGdlbkNvbW1vbk1hcFRva2VuKHRva2VuKSk7XG59IiwgImltcG9ydCB7IGNyZWF0ZVRoZW1lIH0gZnJvbSAnQGFudC1kZXNpZ24vY3NzaW5qcyc7XG5pbXBvcnQgZGVmYXVsdERlcml2YXRpdmUgZnJvbSAnLi9pbmRleCc7XG5jb25zdCBkZWZhdWx0VGhlbWUgPSBjcmVhdGVUaGVtZShkZWZhdWx0RGVyaXZhdGl2ZSk7XG5leHBvcnQgZGVmYXVsdCBkZWZhdWx0VGhlbWU7IiwgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCBjb25zdCBkZWZhdWx0UHJlZml4Q2xzID0gJ2FudCc7XG5leHBvcnQgY29uc3QgZGVmYXVsdEljb25QcmVmaXhDbHMgPSAnYW50aWNvbic7XG5leHBvcnQgY29uc3QgVmFyaWFudHMgPSBbJ291dGxpbmVkJywgJ2JvcmRlcmxlc3MnLCAnZmlsbGVkJywgJ3VuZGVybGluZWQnXTtcbmNvbnN0IGRlZmF1bHRHZXRQcmVmaXhDbHMgPSAoc3VmZml4Q2xzLCBjdXN0b21pemVQcmVmaXhDbHMpID0+IHtcbiAgaWYgKGN1c3RvbWl6ZVByZWZpeENscykge1xuICAgIHJldHVybiBjdXN0b21pemVQcmVmaXhDbHM7XG4gIH1cbiAgcmV0dXJuIHN1ZmZpeENscyA/IGAke2RlZmF1bHRQcmVmaXhDbHN9LSR7c3VmZml4Q2xzfWAgOiBkZWZhdWx0UHJlZml4Q2xzO1xufTtcbi8vIHpvbWJpZUo6IFx1RDgzRFx1REVBOCBEbyBub3QgcGFzcyBgZGVmYXVsdFJlbmRlckVtcHR5YCBoZXJlIHNpbmNlIGl0IHdpbGwgY2F1c2UgY2lyY3VsYXIgZGVwZW5kZW5jeS5cbmV4cG9ydCBjb25zdCBDb25maWdDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQoe1xuICAvLyBXZSBwcm92aWRlIGEgZGVmYXVsdCBmdW5jdGlvbiBmb3IgQ29udGV4dCB3aXRob3V0IHByb3ZpZGVyXG4gIGdldFByZWZpeENsczogZGVmYXVsdEdldFByZWZpeENscyxcbiAgaWNvblByZWZpeENsczogZGVmYXVsdEljb25QcmVmaXhDbHNcbn0pO1xuZXhwb3J0IGNvbnN0IHtcbiAgQ29uc3VtZXI6IENvbmZpZ0NvbnN1bWVyXG59ID0gQ29uZmlnQ29udGV4dDtcbmNvbnN0IEVNUFRZX09CSkVDVCA9IHt9O1xuLyoqXG4gKiBHZXQgQ29uZmlnUHJvdmlkZXIgY29uZmlndXJlZCBjb21wb25lbnQgcHJvcHMuXG4gKiBUaGlzIGhlbHAgdG8gcmVkdWNlIGJ1bmRsZSBzaXplIGZvciBzYXZpbmcgYD8uYCBvcGVyYXRvci5cbiAqIERvIG5vdCB1c2UgYXMgYHVzZU1lbW9gIGRlcHMgc2luY2Ugd2UgZG8gbm90IGNhY2hlIHRoZSBvYmplY3QgaGVyZS5cbiAqXG4gKiBOT1RFOiBub3QgcmVmYWN0b3IgdGhpcyB3aXRoIGB1c2VNZW1vYCBzaW5jZSBtZW1vIHdpbGwgY29zdCBhbm90aGVyIG1lbW9yeSBzcGFjZSxcbiAqIHdoaWNoIHdpbGwgd2FzdGUgYm90aCBjb21wYXJlIGNhbGN1bGF0aW9uICYgbWVtb3J5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQ29tcG9uZW50Q29uZmlnKHByb3BOYW1lKSB7XG4gIGNvbnN0IGNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpO1xuICBjb25zdCB7XG4gICAgZ2V0UHJlZml4Q2xzLFxuICAgIGRpcmVjdGlvbixcbiAgICBnZXRQb3B1cENvbnRhaW5lclxuICB9ID0gY29udGV4dDtcbiAgY29uc3QgcHJvcFZhbHVlID0gY29udGV4dFtwcm9wTmFtZV07XG4gIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe1xuICAgIGNsYXNzTmFtZXM6IEVNUFRZX09CSkVDVCxcbiAgICBzdHlsZXM6IEVNUFRZX09CSkVDVFxuICB9LCBwcm9wVmFsdWUpLCB7XG4gICAgZ2V0UHJlZml4Q2xzLFxuICAgIGRpcmVjdGlvbixcbiAgICBnZXRQb3B1cENvbnRhaW5lclxuICB9KTtcbn0iLCAiaW1wb3J0IHsgZ2VuZXJhdGUgfSBmcm9tICdAYW50LWRlc2lnbi9jb2xvcnMnO1xuaW1wb3J0IHsgRmFzdENvbG9yIH0gZnJvbSAnQGFudC1kZXNpZ24vZmFzdC1jb2xvcic7XG5pbXBvcnQgY2FuVXNlRG9tIGZyb20gXCJyYy11dGlsL2VzL0RvbS9jYW5Vc2VEb21cIjtcbmltcG9ydCB7IHVwZGF0ZUNTUyB9IGZyb20gXCJyYy11dGlsL2VzL0RvbS9keW5hbWljQ1NTXCI7XG5pbXBvcnQgd2FybmluZyBmcm9tICcuLi9fdXRpbC93YXJuaW5nJztcbmNvbnN0IGR5bmFtaWNTdHlsZU1hcmsgPSBgLWFudC0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKX1gO1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0eWxlKGdsb2JhbFByZWZpeENscywgdGhlbWUpIHtcbiAgY29uc3QgdmFyaWFibGVzID0ge307XG4gIGNvbnN0IGZvcm1hdENvbG9yID0gKGNvbG9yLCB1cGRhdGVyKSA9PiB7XG4gICAgbGV0IGNsb25lID0gY29sb3IuY2xvbmUoKTtcbiAgICBjbG9uZSA9ICh1cGRhdGVyID09PSBudWxsIHx8IHVwZGF0ZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHVwZGF0ZXIoY2xvbmUpKSB8fCBjbG9uZTtcbiAgICByZXR1cm4gY2xvbmUudG9SZ2JTdHJpbmcoKTtcbiAgfTtcbiAgY29uc3QgZmlsbENvbG9yID0gKGNvbG9yVmFsLCB0eXBlKSA9PiB7XG4gICAgY29uc3QgYmFzZUNvbG9yID0gbmV3IEZhc3RDb2xvcihjb2xvclZhbCk7XG4gICAgY29uc3QgY29sb3JQYWxldHRlcyA9IGdlbmVyYXRlKGJhc2VDb2xvci50b1JnYlN0cmluZygpKTtcbiAgICB2YXJpYWJsZXNbYCR7dHlwZX0tY29sb3JgXSA9IGZvcm1hdENvbG9yKGJhc2VDb2xvcik7XG4gICAgdmFyaWFibGVzW2Ake3R5cGV9LWNvbG9yLWRpc2FibGVkYF0gPSBjb2xvclBhbGV0dGVzWzFdO1xuICAgIHZhcmlhYmxlc1tgJHt0eXBlfS1jb2xvci1ob3ZlcmBdID0gY29sb3JQYWxldHRlc1s0XTtcbiAgICB2YXJpYWJsZXNbYCR7dHlwZX0tY29sb3ItYWN0aXZlYF0gPSBjb2xvclBhbGV0dGVzWzZdO1xuICAgIHZhcmlhYmxlc1tgJHt0eXBlfS1jb2xvci1vdXRsaW5lYF0gPSBiYXNlQ29sb3IuY2xvbmUoKS5zZXRBKDAuMikudG9SZ2JTdHJpbmcoKTtcbiAgICB2YXJpYWJsZXNbYCR7dHlwZX0tY29sb3ItZGVwcmVjYXRlZC1iZ2BdID0gY29sb3JQYWxldHRlc1swXTtcbiAgICB2YXJpYWJsZXNbYCR7dHlwZX0tY29sb3ItZGVwcmVjYXRlZC1ib3JkZXJgXSA9IGNvbG9yUGFsZXR0ZXNbMl07XG4gIH07XG4gIC8vID09PT09PT09PT09PT09PT0gUHJpbWFyeSBDb2xvciA9PT09PT09PT09PT09PT09XG4gIGlmICh0aGVtZS5wcmltYXJ5Q29sb3IpIHtcbiAgICBmaWxsQ29sb3IodGhlbWUucHJpbWFyeUNvbG9yLCAncHJpbWFyeScpO1xuICAgIGNvbnN0IHByaW1hcnlDb2xvciA9IG5ldyBGYXN0Q29sb3IodGhlbWUucHJpbWFyeUNvbG9yKTtcbiAgICBjb25zdCBwcmltYXJ5Q29sb3JzID0gZ2VuZXJhdGUocHJpbWFyeUNvbG9yLnRvUmdiU3RyaW5nKCkpO1xuICAgIC8vIExlZ2FjeSAtIFdlIHNob3VsZCB1c2Ugc2VtYW50aWMgbmFtaW5nIHN0YW5kYXJkXG4gICAgcHJpbWFyeUNvbG9ycy5mb3JFYWNoKChjb2xvciwgaW5kZXgpID0+IHtcbiAgICAgIHZhcmlhYmxlc1tgcHJpbWFyeS0ke2luZGV4ICsgMX1gXSA9IGNvbG9yO1xuICAgIH0pO1xuICAgIC8vIERlcHJlY2F0ZWRcbiAgICB2YXJpYWJsZXNbJ3ByaW1hcnktY29sb3ItZGVwcmVjYXRlZC1sLTM1J10gPSBmb3JtYXRDb2xvcihwcmltYXJ5Q29sb3IsIGMgPT4gYy5saWdodGVuKDM1KSk7XG4gICAgdmFyaWFibGVzWydwcmltYXJ5LWNvbG9yLWRlcHJlY2F0ZWQtbC0yMCddID0gZm9ybWF0Q29sb3IocHJpbWFyeUNvbG9yLCBjID0+IGMubGlnaHRlbigyMCkpO1xuICAgIHZhcmlhYmxlc1sncHJpbWFyeS1jb2xvci1kZXByZWNhdGVkLXQtMjAnXSA9IGZvcm1hdENvbG9yKHByaW1hcnlDb2xvciwgYyA9PiBjLnRpbnQoMjApKTtcbiAgICB2YXJpYWJsZXNbJ3ByaW1hcnktY29sb3ItZGVwcmVjYXRlZC10LTUwJ10gPSBmb3JtYXRDb2xvcihwcmltYXJ5Q29sb3IsIGMgPT4gYy50aW50KDUwKSk7XG4gICAgdmFyaWFibGVzWydwcmltYXJ5LWNvbG9yLWRlcHJlY2F0ZWQtZi0xMiddID0gZm9ybWF0Q29sb3IocHJpbWFyeUNvbG9yLCBjID0+IGMuc2V0QShjLmEgKiAwLjEyKSk7XG4gICAgY29uc3QgcHJpbWFyeUFjdGl2ZUNvbG9yID0gbmV3IEZhc3RDb2xvcihwcmltYXJ5Q29sb3JzWzBdKTtcbiAgICB2YXJpYWJsZXNbJ3ByaW1hcnktY29sb3ItYWN0aXZlLWRlcHJlY2F0ZWQtZi0zMCddID0gZm9ybWF0Q29sb3IocHJpbWFyeUFjdGl2ZUNvbG9yLCBjID0+IGMuc2V0QShjLmEgKiAwLjMpKTtcbiAgICB2YXJpYWJsZXNbJ3ByaW1hcnktY29sb3ItYWN0aXZlLWRlcHJlY2F0ZWQtZC0wMiddID0gZm9ybWF0Q29sb3IocHJpbWFyeUFjdGl2ZUNvbG9yLCBjID0+IGMuZGFya2VuKDIpKTtcbiAgfVxuICAvLyA9PT09PT09PT09PT09PT09IFN1Y2Nlc3MgQ29sb3IgPT09PT09PT09PT09PT09PVxuICBpZiAodGhlbWUuc3VjY2Vzc0NvbG9yKSB7XG4gICAgZmlsbENvbG9yKHRoZW1lLnN1Y2Nlc3NDb2xvciwgJ3N1Y2Nlc3MnKTtcbiAgfVxuICAvLyA9PT09PT09PT09PT09PT09IFdhcm5pbmcgQ29sb3IgPT09PT09PT09PT09PT09PVxuICBpZiAodGhlbWUud2FybmluZ0NvbG9yKSB7XG4gICAgZmlsbENvbG9yKHRoZW1lLndhcm5pbmdDb2xvciwgJ3dhcm5pbmcnKTtcbiAgfVxuICAvLyA9PT09PT09PT09PT09PT09PSBFcnJvciBDb2xvciA9PT09PT09PT09PT09PT09PVxuICBpZiAodGhlbWUuZXJyb3JDb2xvcikge1xuICAgIGZpbGxDb2xvcih0aGVtZS5lcnJvckNvbG9yLCAnZXJyb3InKTtcbiAgfVxuICAvLyA9PT09PT09PT09PT09PT09PSBJbmZvIENvbG9yID09PT09PT09PT09PT09PT09PVxuICBpZiAodGhlbWUuaW5mb0NvbG9yKSB7XG4gICAgZmlsbENvbG9yKHRoZW1lLmluZm9Db2xvciwgJ2luZm8nKTtcbiAgfVxuICAvLyBDb252ZXJ0IHRvIGNzcyB2YXJpYWJsZXNcbiAgY29uc3QgY3NzTGlzdCA9IE9iamVjdC5rZXlzKHZhcmlhYmxlcykubWFwKGtleSA9PiBgLS0ke2dsb2JhbFByZWZpeENsc30tJHtrZXl9OiAke3ZhcmlhYmxlc1trZXldfTtgKTtcbiAgcmV0dXJuIGBcbiAgOnJvb3Qge1xuICAgICR7Y3NzTGlzdC5qb2luKCdcXG4nKX1cbiAgfVxuICBgLnRyaW0oKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclRoZW1lKGdsb2JhbFByZWZpeENscywgdGhlbWUpIHtcbiAgY29uc3Qgc3R5bGUgPSBnZXRTdHlsZShnbG9iYWxQcmVmaXhDbHMsIHRoZW1lKTtcbiAgaWYgKGNhblVzZURvbSgpKSB7XG4gICAgdXBkYXRlQ1NTKHN0eWxlLCBgJHtkeW5hbWljU3R5bGVNYXJrfS1keW5hbWljLXRoZW1lYCk7XG4gIH0gZWxzZSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhmYWxzZSwgJ0NvbmZpZ1Byb3ZpZGVyJywgJ1NTUiBkbyBub3Qgc3VwcG9ydCBkeW5hbWljIHRoZW1lIHdpdGggY3NzIHZhcmlhYmxlcy4nKSA6IHZvaWQgMDtcbiAgfVxufSIsICJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuY29uc3QgRGlzYWJsZWRDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQoZmFsc2UpO1xuZXhwb3J0IGNvbnN0IERpc2FibGVkQ29udGV4dFByb3ZpZGVyID0gX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgY2hpbGRyZW4sXG4gICAgZGlzYWJsZWRcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IG9yaWdpbkRpc2FibGVkID0gUmVhY3QudXNlQ29udGV4dChEaXNhYmxlZENvbnRleHQpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRGlzYWJsZWRDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IGRpc2FibGVkICE9PSBudWxsICYmIGRpc2FibGVkICE9PSB2b2lkIDAgPyBkaXNhYmxlZCA6IG9yaWdpbkRpc2FibGVkXG4gIH0sIGNoaWxkcmVuKTtcbn07XG5leHBvcnQgZGVmYXVsdCBEaXNhYmxlZENvbnRleHQ7IiwgImltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRGlzYWJsZWRDb250ZXh0IGZyb20gJy4uL0Rpc2FibGVkQ29udGV4dCc7XG5pbXBvcnQgU2l6ZUNvbnRleHQgZnJvbSAnLi4vU2l6ZUNvbnRleHQnO1xuZnVuY3Rpb24gdXNlQ29uZmlnKCkge1xuICBjb25zdCBjb21wb25lbnREaXNhYmxlZCA9IHVzZUNvbnRleHQoRGlzYWJsZWRDb250ZXh0KTtcbiAgY29uc3QgY29tcG9uZW50U2l6ZSA9IHVzZUNvbnRleHQoU2l6ZUNvbnRleHQpO1xuICByZXR1cm4ge1xuICAgIGNvbXBvbmVudERpc2FibGVkLFxuICAgIGNvbXBvbmVudFNpemVcbiAgfTtcbn1cbmV4cG9ydCBkZWZhdWx0IHVzZUNvbmZpZzsiLCAiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmNvbnN0IFNpemVDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQodW5kZWZpbmVkKTtcbmV4cG9ydCBjb25zdCBTaXplQ29udGV4dFByb3ZpZGVyID0gX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgY2hpbGRyZW4sXG4gICAgc2l6ZVxuICB9ID0gX3JlZjtcbiAgY29uc3Qgb3JpZ2luU2l6ZSA9IFJlYWN0LnVzZUNvbnRleHQoU2l6ZUNvbnRleHQpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU2l6ZUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogc2l6ZSB8fCBvcmlnaW5TaXplXG4gIH0sIGNoaWxkcmVuKTtcbn07XG5leHBvcnQgZGVmYXVsdCBTaXplQ29udGV4dDsiLCAiaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB0b2tlbjJDU1NWYXIsIHVzZUNTU1ZhclJlZ2lzdGVyLCB1c2VTdHlsZVJlZ2lzdGVyIH0gZnJvbSAnQGFudC1kZXNpZ24vY3NzaW5qcyc7XG5pbXBvcnQgZ2VuQ2FsYyBmcm9tIFwiLi9jYWxjXCI7XG5pbXBvcnQgZ2V0Q29tcFZhclByZWZpeCBmcm9tIFwiLi9nZXRDb21wVmFyUHJlZml4XCI7XG5pbXBvcnQgZ2V0Q29tcG9uZW50VG9rZW4gZnJvbSBcIi4vZ2V0Q29tcG9uZW50VG9rZW5cIjtcbmltcG9ydCBnZXREZWZhdWx0Q29tcG9uZW50VG9rZW4gZnJvbSBcIi4vZ2V0RGVmYXVsdENvbXBvbmVudFRva2VuXCI7XG5pbXBvcnQgZ2VuTWF4TWluIGZyb20gXCIuL21heG1pblwiO1xuaW1wb3J0IHN0YXRpc3RpY1Rva2VuLCB7IG1lcmdlIGFzIG1lcmdlVG9rZW4gfSBmcm9tIFwiLi9zdGF0aXN0aWNcIjtcbmltcG9ydCB1c2VVbmlxdWVNZW1vIGZyb20gXCIuLi9fdXRpbC9ob29rcy91c2VVbmlxdWVNZW1vXCI7XG5pbXBvcnQgdXNlRGVmYXVsdENTUCBmcm9tIFwiLi4vaG9va3MvdXNlQ1NQXCI7XG5mdW5jdGlvbiBnZW5TdHlsZVV0aWxzKGNvbmZpZykge1xuICAvLyBEZXBlbmRlbmN5IGludmVyc2lvbiBmb3IgcHJlcGFyaW5nIGJhc2ljIGNvbmZpZy5cbiAgdmFyIF9jb25maWckdXNlQ1NQID0gY29uZmlnLnVzZUNTUCxcbiAgICB1c2VDU1AgPSBfY29uZmlnJHVzZUNTUCA9PT0gdm9pZCAwID8gdXNlRGVmYXVsdENTUCA6IF9jb25maWckdXNlQ1NQLFxuICAgIHVzZVRva2VuID0gY29uZmlnLnVzZVRva2VuLFxuICAgIHVzZVByZWZpeCA9IGNvbmZpZy51c2VQcmVmaXgsXG4gICAgZ2V0UmVzZXRTdHlsZXMgPSBjb25maWcuZ2V0UmVzZXRTdHlsZXMsXG4gICAgZ2V0Q29tbW9uU3R5bGUgPSBjb25maWcuZ2V0Q29tbW9uU3R5bGUsXG4gICAgZ2V0Q29tcFVuaXRsZXNzID0gY29uZmlnLmdldENvbXBVbml0bGVzcztcbiAgZnVuY3Rpb24gZ2VuU3R5bGVIb29rcyhjb21wb25lbnQsIHN0eWxlRm4sIGdldERlZmF1bHRUb2tlbiwgb3B0aW9ucykge1xuICAgIHZhciBjb21wb25lbnROYW1lID0gQXJyYXkuaXNBcnJheShjb21wb25lbnQpID8gY29tcG9uZW50WzBdIDogY29tcG9uZW50O1xuICAgIGZ1bmN0aW9uIHByZWZpeFRva2VuKGtleSkge1xuICAgICAgcmV0dXJuIFwiXCIuY29uY2F0KFN0cmluZyhjb21wb25lbnROYW1lKSkuY29uY2F0KGtleS5zbGljZSgwLCAxKS50b1VwcGVyQ2FzZSgpKS5jb25jYXQoa2V5LnNsaWNlKDEpKTtcbiAgICB9XG5cbiAgICAvLyBGaWxsIHVuaXRsZXNzXG4gICAgdmFyIG9yaWdpblVuaXRsZXNzID0gKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy51bml0bGVzcykgfHwge307XG4gICAgdmFyIG9yaWdpbkNvbXBVbml0bGVzcyA9IHR5cGVvZiBnZXRDb21wVW5pdGxlc3MgPT09ICdmdW5jdGlvbicgPyBnZXRDb21wVW5pdGxlc3MoY29tcG9uZW50KSA6IHt9O1xuICAgIHZhciBjb21wVW5pdGxlc3MgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG9yaWdpbkNvbXBVbml0bGVzcyksIHt9LCBfZGVmaW5lUHJvcGVydHkoe30sIHByZWZpeFRva2VuKCd6SW5kZXhQb3B1cCcpLCB0cnVlKSk7XG4gICAgT2JqZWN0LmtleXMob3JpZ2luVW5pdGxlc3MpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgY29tcFVuaXRsZXNzW3ByZWZpeFRva2VuKGtleSldID0gb3JpZ2luVW5pdGxlc3Nba2V5XTtcbiAgICB9KTtcblxuICAgIC8vIE9wdGlvbnNcbiAgICB2YXIgbWVyZ2VkT3B0aW9ucyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgb3B0aW9ucyksIHt9LCB7XG4gICAgICB1bml0bGVzczogY29tcFVuaXRsZXNzLFxuICAgICAgcHJlZml4VG9rZW46IHByZWZpeFRva2VuXG4gICAgfSk7XG5cbiAgICAvLyBIb29rc1xuICAgIHZhciB1c2VTdHlsZSA9IGdlbkNvbXBvbmVudFN0eWxlSG9vayhjb21wb25lbnQsIHN0eWxlRm4sIGdldERlZmF1bHRUb2tlbiwgbWVyZ2VkT3B0aW9ucyk7XG4gICAgdmFyIHVzZUNTU1ZhciA9IGdlbkNTU1ZhclJlZ2lzdGVyKGNvbXBvbmVudE5hbWUsIGdldERlZmF1bHRUb2tlbiwgbWVyZ2VkT3B0aW9ucyk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChwcmVmaXhDbHMpIHtcbiAgICAgIHZhciByb290Q2xzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBwcmVmaXhDbHM7XG4gICAgICB2YXIgX3VzZVN0eWxlID0gdXNlU3R5bGUocHJlZml4Q2xzLCByb290Q2xzKSxcbiAgICAgICAgX3VzZVN0eWxlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdHlsZSwgMiksXG4gICAgICAgIGhhc2hJZCA9IF91c2VTdHlsZTJbMV07XG4gICAgICB2YXIgX3VzZUNTU1ZhciA9IHVzZUNTU1Zhcihyb290Q2xzKSxcbiAgICAgICAgX3VzZUNTU1ZhcjIgPSBfc2xpY2VkVG9BcnJheShfdXNlQ1NTVmFyLCAyKSxcbiAgICAgICAgd3JhcENTU1ZhciA9IF91c2VDU1NWYXIyWzBdLFxuICAgICAgICBjc3NWYXJDbHMgPSBfdXNlQ1NTVmFyMlsxXTtcbiAgICAgIHJldHVybiBbd3JhcENTU1ZhciwgaGFzaElkLCBjc3NWYXJDbHNdO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gZ2VuQ1NTVmFyUmVnaXN0ZXIoY29tcG9uZW50LCBnZXREZWZhdWx0VG9rZW4sIG9wdGlvbnMpIHtcbiAgICB2YXIgY29tcFVuaXRsZXNzID0gb3B0aW9ucy51bml0bGVzcyxcbiAgICAgIF9vcHRpb25zJGluamVjdFN0eWxlID0gb3B0aW9ucy5pbmplY3RTdHlsZSxcbiAgICAgIGluamVjdFN0eWxlID0gX29wdGlvbnMkaW5qZWN0U3R5bGUgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRpbmplY3RTdHlsZSxcbiAgICAgIHByZWZpeFRva2VuID0gb3B0aW9ucy5wcmVmaXhUb2tlbixcbiAgICAgIGlnbm9yZSA9IG9wdGlvbnMuaWdub3JlO1xuICAgIHZhciBDU1NWYXJSZWdpc3RlciA9IGZ1bmN0aW9uIENTU1ZhclJlZ2lzdGVyKF9yZWYpIHtcbiAgICAgIHZhciByb290Q2xzID0gX3JlZi5yb290Q2xzLFxuICAgICAgICBfcmVmJGNzc1ZhciA9IF9yZWYuY3NzVmFyLFxuICAgICAgICBjc3NWYXIgPSBfcmVmJGNzc1ZhciA9PT0gdm9pZCAwID8ge30gOiBfcmVmJGNzc1ZhcjtcbiAgICAgIHZhciBfdXNlVG9rZW4gPSB1c2VUb2tlbigpLFxuICAgICAgICByZWFsVG9rZW4gPSBfdXNlVG9rZW4ucmVhbFRva2VuO1xuICAgICAgdXNlQ1NTVmFyUmVnaXN0ZXIoe1xuICAgICAgICBwYXRoOiBbY29tcG9uZW50XSxcbiAgICAgICAgcHJlZml4OiBjc3NWYXIucHJlZml4LFxuICAgICAgICBrZXk6IGNzc1Zhci5rZXksXG4gICAgICAgIHVuaXRsZXNzOiBjb21wVW5pdGxlc3MsXG4gICAgICAgIGlnbm9yZTogaWdub3JlLFxuICAgICAgICB0b2tlbjogcmVhbFRva2VuLFxuICAgICAgICBzY29wZTogcm9vdENsc1xuICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGVmYXVsdFRva2VuID0gZ2V0RGVmYXVsdENvbXBvbmVudFRva2VuKGNvbXBvbmVudCwgcmVhbFRva2VuLCBnZXREZWZhdWx0VG9rZW4pO1xuICAgICAgICB2YXIgY29tcG9uZW50VG9rZW4gPSBnZXRDb21wb25lbnRUb2tlbihjb21wb25lbnQsIHJlYWxUb2tlbiwgZGVmYXVsdFRva2VuLCB7XG4gICAgICAgICAgZGVwcmVjYXRlZFRva2Vuczogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmRlcHJlY2F0ZWRUb2tlbnNcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5rZXlzKGRlZmF1bHRUb2tlbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgY29tcG9uZW50VG9rZW5bcHJlZml4VG9rZW4oa2V5KV0gPSBjb21wb25lbnRUb2tlbltrZXldO1xuICAgICAgICAgIGRlbGV0ZSBjb21wb25lbnRUb2tlbltrZXldO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudFRva2VuO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIHZhciB1c2VDU1NWYXIgPSBmdW5jdGlvbiB1c2VDU1NWYXIocm9vdENscykge1xuICAgICAgdmFyIF91c2VUb2tlbjIgPSB1c2VUb2tlbigpLFxuICAgICAgICBjc3NWYXIgPSBfdXNlVG9rZW4yLmNzc1ZhcjtcbiAgICAgIHJldHVybiBbZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGluamVjdFN0eWxlICYmIGNzc1ZhciA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDU1NWYXJSZWdpc3Rlciwge1xuICAgICAgICAgIHJvb3RDbHM6IHJvb3RDbHMsXG4gICAgICAgICAgY3NzVmFyOiBjc3NWYXIsXG4gICAgICAgICAgY29tcG9uZW50OiBjb21wb25lbnRcbiAgICAgICAgfSksIG5vZGUpIDogbm9kZTtcbiAgICAgIH0sIGNzc1ZhciA9PT0gbnVsbCB8fCBjc3NWYXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNzc1Zhci5rZXldO1xuICAgIH07XG4gICAgcmV0dXJuIHVzZUNTU1ZhcjtcbiAgfVxuICBmdW5jdGlvbiBnZW5Db21wb25lbnRTdHlsZUhvb2soY29tcG9uZW50TmFtZSwgc3R5bGVGbiwgZ2V0RGVmYXVsdFRva2VuKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHt9O1xuICAgIHZhciBjZWxscyA9IEFycmF5LmlzQXJyYXkoY29tcG9uZW50TmFtZSkgPyBjb21wb25lbnROYW1lIDogW2NvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWVdO1xuICAgIHZhciBfY2VsbHMgPSBfc2xpY2VkVG9BcnJheShjZWxscywgMSksXG4gICAgICBjb21wb25lbnQgPSBfY2VsbHNbMF07XG4gICAgdmFyIGNvbmNhdENvbXBvbmVudCA9IGNlbGxzLmpvaW4oJy0nKTtcbiAgICB2YXIgbWVyZ2VkTGF5ZXIgPSBjb25maWcubGF5ZXIgfHwge1xuICAgICAgbmFtZTogJ2FudGQnXG4gICAgfTtcblxuICAgIC8vIFJldHVybiBuZXcgc3R5bGUgaG9va1xuICAgIHJldHVybiBmdW5jdGlvbiAocHJlZml4Q2xzKSB7XG4gICAgICB2YXIgcm9vdENscyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogcHJlZml4Q2xzO1xuICAgICAgdmFyIF91c2VUb2tlbjMgPSB1c2VUb2tlbigpLFxuICAgICAgICB0aGVtZSA9IF91c2VUb2tlbjMudGhlbWUsXG4gICAgICAgIHJlYWxUb2tlbiA9IF91c2VUb2tlbjMucmVhbFRva2VuLFxuICAgICAgICBoYXNoSWQgPSBfdXNlVG9rZW4zLmhhc2hJZCxcbiAgICAgICAgdG9rZW4gPSBfdXNlVG9rZW4zLnRva2VuLFxuICAgICAgICBjc3NWYXIgPSBfdXNlVG9rZW4zLmNzc1ZhcjtcbiAgICAgIHZhciBfdXNlUHJlZml4ID0gdXNlUHJlZml4KCksXG4gICAgICAgIHJvb3RQcmVmaXhDbHMgPSBfdXNlUHJlZml4LnJvb3RQcmVmaXhDbHMsXG4gICAgICAgIGljb25QcmVmaXhDbHMgPSBfdXNlUHJlZml4Lmljb25QcmVmaXhDbHM7XG4gICAgICB2YXIgY3NwID0gdXNlQ1NQKCk7XG4gICAgICB2YXIgdHlwZSA9IGNzc1ZhciA/ICdjc3MnIDogJ2pzJztcblxuICAgICAgLy8gVXNlIHVuaXF1ZSBtZW1vIHRvIHNoYXJlIHRoZSByZXN1bHQgYWNyb3NzIGFsbCBpbnN0YW5jZXNcbiAgICAgIHZhciBjYWxjID0gdXNlVW5pcXVlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB1bml0bGVzc0Nzc1ZhciA9IG5ldyBTZXQoKTtcbiAgICAgICAgaWYgKGNzc1Zhcikge1xuICAgICAgICAgIE9iamVjdC5rZXlzKG9wdGlvbnMudW5pdGxlc3MgfHwge30pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgLy8gU29tZSBjb21wb25lbnQgcHJveHkgdGhlIEFsaWFzVG9rZW4gKGUuZy4gSW1hZ2UpIGFuZCBzb21lIG5vdCAoZS5nLiBNb2RhbClcbiAgICAgICAgICAgIC8vIFdlIHNob3VsZCBib3RoIHBhc3MgaW4gYHVuaXRsZXNzQ3NzVmFyYCB0byBtYWtlIHN1cmUgdGhlIENTU1ZhciBjYW4gYmUgdW5pdGxlc3MuXG4gICAgICAgICAgICB1bml0bGVzc0Nzc1Zhci5hZGQodG9rZW4yQ1NTVmFyKGtleSwgY3NzVmFyLnByZWZpeCkpO1xuICAgICAgICAgICAgdW5pdGxlc3NDc3NWYXIuYWRkKHRva2VuMkNTU1ZhcihrZXksIGdldENvbXBWYXJQcmVmaXgoY29tcG9uZW50LCBjc3NWYXIucHJlZml4KSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnZW5DYWxjKHR5cGUsIHVuaXRsZXNzQ3NzVmFyKTtcbiAgICAgIH0sIFt0eXBlLCBjb21wb25lbnQsIGNzc1ZhciA9PT0gbnVsbCB8fCBjc3NWYXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNzc1Zhci5wcmVmaXhdKTtcbiAgICAgIHZhciBfZ2VuTWF4TWluID0gZ2VuTWF4TWluKHR5cGUpLFxuICAgICAgICBtYXggPSBfZ2VuTWF4TWluLm1heCxcbiAgICAgICAgbWluID0gX2dlbk1heE1pbi5taW47XG5cbiAgICAgIC8vIFNoYXJlZCBjb25maWdcbiAgICAgIHZhciBzaGFyZWRDb25maWcgPSB7XG4gICAgICAgIHRoZW1lOiB0aGVtZSxcbiAgICAgICAgdG9rZW46IHRva2VuLFxuICAgICAgICBoYXNoSWQ6IGhhc2hJZCxcbiAgICAgICAgbm9uY2U6IGZ1bmN0aW9uIG5vbmNlKCkge1xuICAgICAgICAgIHJldHVybiBjc3Aubm9uY2U7XG4gICAgICAgIH0sXG4gICAgICAgIGNsaWVudE9ubHk6IG9wdGlvbnMuY2xpZW50T25seSxcbiAgICAgICAgbGF5ZXI6IG1lcmdlZExheWVyLFxuICAgICAgICAvLyBhbnRkIGlzIGFsd2F5cyBhdCB0b3Agb2Ygc3R5bGVzXG4gICAgICAgIG9yZGVyOiBvcHRpb25zLm9yZGVyIHx8IC05OTlcbiAgICAgIH07XG5cbiAgICAgIC8vIFRoaXMgaWYgc3RhdGVtZW50IGlzIHNhZmUsIGFzIGl0IHdpbGwgb25seSBiZSB1c2VkIGlmIHRoZSBnZW5lcmF0b3IgaGFzIHRoZSBmdW5jdGlvbi4gSXQncyBub3QgZHluYW1pYy5cbiAgICAgIGlmICh0eXBlb2YgZ2V0UmVzZXRTdHlsZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gR2VuZXJhdGUgc3R5bGUgZm9yIGFsbCBuZWVkIHJlc2V0IHRhZ3MuXG4gICAgICAgIHVzZVN0eWxlUmVnaXN0ZXIoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzaGFyZWRDb25maWcpLCB7fSwge1xuICAgICAgICAgIGNsaWVudE9ubHk6IGZhbHNlLFxuICAgICAgICAgIHBhdGg6IFsnU2hhcmVkJywgcm9vdFByZWZpeENsc11cbiAgICAgICAgfSksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gZ2V0UmVzZXRTdHlsZXModG9rZW4sIHtcbiAgICAgICAgICAgIHByZWZpeDoge1xuICAgICAgICAgICAgICByb290UHJlZml4Q2xzOiByb290UHJlZml4Q2xzLFxuICAgICAgICAgICAgICBpY29uUHJlZml4Q2xzOiBpY29uUHJlZml4Q2xzXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY3NwOiBjc3BcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB2YXIgd3JhcFNTUiA9IHVzZVN0eWxlUmVnaXN0ZXIoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzaGFyZWRDb25maWcpLCB7fSwge1xuICAgICAgICBwYXRoOiBbY29uY2F0Q29tcG9uZW50LCBwcmVmaXhDbHMsIGljb25QcmVmaXhDbHNdXG4gICAgICB9KSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAob3B0aW9ucy5pbmplY3RTdHlsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgdmFyIF9zdGF0aXN0aWNUb2tlbiA9IHN0YXRpc3RpY1Rva2VuKHRva2VuKSxcbiAgICAgICAgICBwcm94eVRva2VuID0gX3N0YXRpc3RpY1Rva2VuLnRva2VuLFxuICAgICAgICAgIGZsdXNoID0gX3N0YXRpc3RpY1Rva2VuLmZsdXNoO1xuICAgICAgICB2YXIgZGVmYXVsdENvbXBvbmVudFRva2VuID0gZ2V0RGVmYXVsdENvbXBvbmVudFRva2VuKGNvbXBvbmVudCwgcmVhbFRva2VuLCBnZXREZWZhdWx0VG9rZW4pO1xuICAgICAgICB2YXIgY29tcG9uZW50Q2xzID0gXCIuXCIuY29uY2F0KHByZWZpeENscyk7XG4gICAgICAgIHZhciBjb21wb25lbnRUb2tlbiA9IGdldENvbXBvbmVudFRva2VuKGNvbXBvbmVudCwgcmVhbFRva2VuLCBkZWZhdWx0Q29tcG9uZW50VG9rZW4sIHtcbiAgICAgICAgICBkZXByZWNhdGVkVG9rZW5zOiBvcHRpb25zLmRlcHJlY2F0ZWRUb2tlbnNcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChjc3NWYXIgJiYgZGVmYXVsdENvbXBvbmVudFRva2VuICYmIF90eXBlb2YoZGVmYXVsdENvbXBvbmVudFRva2VuKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBPYmplY3Qua2V5cyhkZWZhdWx0Q29tcG9uZW50VG9rZW4pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgZGVmYXVsdENvbXBvbmVudFRva2VuW2tleV0gPSBcInZhcihcIi5jb25jYXQodG9rZW4yQ1NTVmFyKGtleSwgZ2V0Q29tcFZhclByZWZpeChjb21wb25lbnQsIGNzc1Zhci5wcmVmaXgpKSwgXCIpXCIpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHZhciBtZXJnZWRUb2tlbiA9IG1lcmdlVG9rZW4ocHJveHlUb2tlbiwge1xuICAgICAgICAgIGNvbXBvbmVudENsczogY29tcG9uZW50Q2xzLFxuICAgICAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgICAgIGljb25DbHM6IFwiLlwiLmNvbmNhdChpY29uUHJlZml4Q2xzKSxcbiAgICAgICAgICBhbnRDbHM6IFwiLlwiLmNvbmNhdChyb290UHJlZml4Q2xzKSxcbiAgICAgICAgICBjYWxjOiBjYWxjLFxuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBtYXg6IG1heCxcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgbWluOiBtaW5cbiAgICAgICAgfSwgY3NzVmFyID8gZGVmYXVsdENvbXBvbmVudFRva2VuIDogY29tcG9uZW50VG9rZW4pO1xuICAgICAgICB2YXIgc3R5bGVJbnRlcnBvbGF0aW9uID0gc3R5bGVGbihtZXJnZWRUb2tlbiwge1xuICAgICAgICAgIGhhc2hJZDogaGFzaElkLFxuICAgICAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgICAgIHJvb3RQcmVmaXhDbHM6IHJvb3RQcmVmaXhDbHMsXG4gICAgICAgICAgaWNvblByZWZpeENsczogaWNvblByZWZpeENsc1xuICAgICAgICB9KTtcbiAgICAgICAgZmx1c2goY29tcG9uZW50LCBjb21wb25lbnRUb2tlbik7XG4gICAgICAgIHZhciBjb21tb25TdHlsZSA9IHR5cGVvZiBnZXRDb21tb25TdHlsZSA9PT0gJ2Z1bmN0aW9uJyA/IGdldENvbW1vblN0eWxlKG1lcmdlZFRva2VuLCBwcmVmaXhDbHMsIHJvb3RDbHMsIG9wdGlvbnMucmVzZXRGb250KSA6IG51bGw7XG4gICAgICAgIHJldHVybiBbb3B0aW9ucy5yZXNldFN0eWxlID09PSBmYWxzZSA/IG51bGwgOiBjb21tb25TdHlsZSwgc3R5bGVJbnRlcnBvbGF0aW9uXTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFt3cmFwU1NSLCBoYXNoSWRdO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gZ2VuU3ViU3R5bGVDb21wb25lbnQoY29tcG9uZW50TmFtZSwgc3R5bGVGbiwgZ2V0RGVmYXVsdFRva2VuKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHt9O1xuICAgIHZhciB1c2VTdHlsZSA9IGdlbkNvbXBvbmVudFN0eWxlSG9vayhjb21wb25lbnROYW1lLCBzdHlsZUZuLCBnZXREZWZhdWx0VG9rZW4sIF9vYmplY3RTcHJlYWQoe1xuICAgICAgcmVzZXRTdHlsZTogZmFsc2UsXG4gICAgICAvLyBTdWIgU3R5bGUgc2hvdWxkIGRlZmF1bHQgYWZ0ZXIgcm9vdCBvbmVcbiAgICAgIG9yZGVyOiAtOTk4XG4gICAgfSwgb3B0aW9ucykpO1xuICAgIHZhciBTdHlsZWRDb21wb25lbnQgPSBmdW5jdGlvbiBTdHlsZWRDb21wb25lbnQoX3JlZjIpIHtcbiAgICAgIHZhciBwcmVmaXhDbHMgPSBfcmVmMi5wcmVmaXhDbHMsXG4gICAgICAgIF9yZWYyJHJvb3RDbHMgPSBfcmVmMi5yb290Q2xzLFxuICAgICAgICByb290Q2xzID0gX3JlZjIkcm9vdENscyA9PT0gdm9pZCAwID8gcHJlZml4Q2xzIDogX3JlZjIkcm9vdENscztcbiAgICAgIHVzZVN0eWxlKHByZWZpeENscywgcm9vdENscyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBTdHlsZWRDb21wb25lbnQuZGlzcGxheU5hbWUgPSBcIlN1YlN0eWxlX1wiLmNvbmNhdChTdHJpbmcoQXJyYXkuaXNBcnJheShjb21wb25lbnROYW1lKSA/IGNvbXBvbmVudE5hbWUuam9pbignLicpIDogY29tcG9uZW50TmFtZSkpO1xuICAgIH1cbiAgICByZXR1cm4gU3R5bGVkQ29tcG9uZW50O1xuICB9XG4gIHJldHVybiB7XG4gICAgZ2VuU3R5bGVIb29rczogZ2VuU3R5bGVIb29rcyxcbiAgICBnZW5TdWJTdHlsZUNvbXBvbmVudDogZ2VuU3ViU3R5bGVDb21wb25lbnQsXG4gICAgZ2VuQ29tcG9uZW50U3R5bGVIb29rOiBnZW5Db21wb25lbnRTdHlsZUhvb2tcbiAgfTtcbn1cbmV4cG9ydCBkZWZhdWx0IGdlblN0eWxlVXRpbHM7IiwgImltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xudmFyIEFic3RyYWN0Q2FsY3VsYXRvciA9IC8qI19fUFVSRV9fKi9fY3JlYXRlQ2xhc3MoZnVuY3Rpb24gQWJzdHJhY3RDYWxjdWxhdG9yKCkge1xuICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQWJzdHJhY3RDYWxjdWxhdG9yKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgQWJzdHJhY3RDYWxjdWxhdG9yOyIsICJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3NlcnRUaGlzSW5pdGlhbGl6ZWRcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzXCI7XG5pbXBvcnQgX2NyZWF0ZVN1cGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVTdXBlclwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBBYnN0cmFjdENhbGN1bGF0b3IgZnJvbSBcIi4vY2FsY3VsYXRvclwiO1xudmFyIENBTENfVU5JVCA9ICdDQUxDX1VOSVQnO1xudmFyIHJlZ2V4cCA9IG5ldyBSZWdFeHAoQ0FMQ19VTklULCAnZycpO1xuZnVuY3Rpb24gdW5pdCh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBcIlwiLmNvbmNhdCh2YWx1ZSkuY29uY2F0KENBTENfVU5JVCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxudmFyIENTU0NhbGN1bGF0b3IgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9BYnN0cmFjdENhbGN1bGF0b3IpIHtcbiAgX2luaGVyaXRzKENTU0NhbGN1bGF0b3IsIF9BYnN0cmFjdENhbGN1bGF0b3IpO1xuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKENTU0NhbGN1bGF0b3IpO1xuICBmdW5jdGlvbiBDU1NDYWxjdWxhdG9yKG51bSwgdW5pdGxlc3NDc3NWYXIpIHtcbiAgICB2YXIgX3RoaXM7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENTU0NhbGN1bGF0b3IpO1xuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInJlc3VsdFwiLCAnJyk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInVuaXRsZXNzQ3NzVmFyXCIsIHZvaWQgMCk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImxvd1ByaW9yaXR5XCIsIHZvaWQgMCk7XG4gICAgdmFyIG51bVR5cGUgPSBfdHlwZW9mKG51bSk7XG4gICAgX3RoaXMudW5pdGxlc3NDc3NWYXIgPSB1bml0bGVzc0Nzc1ZhcjtcbiAgICBpZiAobnVtIGluc3RhbmNlb2YgQ1NTQ2FsY3VsYXRvcikge1xuICAgICAgX3RoaXMucmVzdWx0ID0gXCIoXCIuY29uY2F0KG51bS5yZXN1bHQsIFwiKVwiKTtcbiAgICB9IGVsc2UgaWYgKG51bVR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICBfdGhpcy5yZXN1bHQgPSB1bml0KG51bSk7XG4gICAgfSBlbHNlIGlmIChudW1UeXBlID09PSAnc3RyaW5nJykge1xuICAgICAgX3RoaXMucmVzdWx0ID0gbnVtO1xuICAgIH1cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgX2NyZWF0ZUNsYXNzKENTU0NhbGN1bGF0b3IsIFt7XG4gICAga2V5OiBcImFkZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGQobnVtKSB7XG4gICAgICBpZiAobnVtIGluc3RhbmNlb2YgQ1NTQ2FsY3VsYXRvcikge1xuICAgICAgICB0aGlzLnJlc3VsdCA9IFwiXCIuY29uY2F0KHRoaXMucmVzdWx0LCBcIiArIFwiKS5jb25jYXQobnVtLmdldFJlc3VsdCgpKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG51bSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIG51bSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5yZXN1bHQgPSBcIlwiLmNvbmNhdCh0aGlzLnJlc3VsdCwgXCIgKyBcIikuY29uY2F0KHVuaXQobnVtKSk7XG4gICAgICB9XG4gICAgICB0aGlzLmxvd1ByaW9yaXR5ID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzdWJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3ViKG51bSkge1xuICAgICAgaWYgKG51bSBpbnN0YW5jZW9mIENTU0NhbGN1bGF0b3IpIHtcbiAgICAgICAgdGhpcy5yZXN1bHQgPSBcIlwiLmNvbmNhdCh0aGlzLnJlc3VsdCwgXCIgLSBcIikuY29uY2F0KG51bS5nZXRSZXN1bHQoKSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBudW0gPT09ICdudW1iZXInIHx8IHR5cGVvZiBudW0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMucmVzdWx0ID0gXCJcIi5jb25jYXQodGhpcy5yZXN1bHQsIFwiIC0gXCIpLmNvbmNhdCh1bml0KG51bSkpO1xuICAgICAgfVxuICAgICAgdGhpcy5sb3dQcmlvcml0eSA9IHRydWU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibXVsXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG11bChudW0pIHtcbiAgICAgIGlmICh0aGlzLmxvd1ByaW9yaXR5KSB7XG4gICAgICAgIHRoaXMucmVzdWx0ID0gXCIoXCIuY29uY2F0KHRoaXMucmVzdWx0LCBcIilcIik7XG4gICAgICB9XG4gICAgICBpZiAobnVtIGluc3RhbmNlb2YgQ1NTQ2FsY3VsYXRvcikge1xuICAgICAgICB0aGlzLnJlc3VsdCA9IFwiXCIuY29uY2F0KHRoaXMucmVzdWx0LCBcIiAqIFwiKS5jb25jYXQobnVtLmdldFJlc3VsdCh0cnVlKSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBudW0gPT09ICdudW1iZXInIHx8IHR5cGVvZiBudW0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMucmVzdWx0ID0gXCJcIi5jb25jYXQodGhpcy5yZXN1bHQsIFwiICogXCIpLmNvbmNhdChudW0pO1xuICAgICAgfVxuICAgICAgdGhpcy5sb3dQcmlvcml0eSA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRpdlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkaXYobnVtKSB7XG4gICAgICBpZiAodGhpcy5sb3dQcmlvcml0eSkge1xuICAgICAgICB0aGlzLnJlc3VsdCA9IFwiKFwiLmNvbmNhdCh0aGlzLnJlc3VsdCwgXCIpXCIpO1xuICAgICAgfVxuICAgICAgaWYgKG51bSBpbnN0YW5jZW9mIENTU0NhbGN1bGF0b3IpIHtcbiAgICAgICAgdGhpcy5yZXN1bHQgPSBcIlwiLmNvbmNhdCh0aGlzLnJlc3VsdCwgXCIgLyBcIikuY29uY2F0KG51bS5nZXRSZXN1bHQodHJ1ZSkpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbnVtID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgbnVtID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLnJlc3VsdCA9IFwiXCIuY29uY2F0KHRoaXMucmVzdWx0LCBcIiAvIFwiKS5jb25jYXQobnVtKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubG93UHJpb3JpdHkgPSBmYWxzZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRSZXN1bHRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UmVzdWx0KGZvcmNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5sb3dQcmlvcml0eSB8fCBmb3JjZSA/IFwiKFwiLmNvbmNhdCh0aGlzLnJlc3VsdCwgXCIpXCIpIDogdGhpcy5yZXN1bHQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVxdWFsXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVxdWFsKG9wdGlvbnMpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuICAgICAgdmFyIF9yZWYgPSBvcHRpb25zIHx8IHt9LFxuICAgICAgICBjc3NVbml0ID0gX3JlZi51bml0O1xuICAgICAgdmFyIG1lcmdlZFVuaXQgPSB0cnVlO1xuICAgICAgaWYgKHR5cGVvZiBjc3NVbml0ID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgbWVyZ2VkVW5pdCA9IGNzc1VuaXQ7XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmZyb20odGhpcy51bml0bGVzc0Nzc1Zhcikuc29tZShmdW5jdGlvbiAoY3NzVmFyKSB7XG4gICAgICAgIHJldHVybiBfdGhpczIucmVzdWx0LmluY2x1ZGVzKGNzc1Zhcik7XG4gICAgICB9KSkge1xuICAgICAgICBtZXJnZWRVbml0ID0gZmFsc2U7XG4gICAgICB9XG4gICAgICB0aGlzLnJlc3VsdCA9IHRoaXMucmVzdWx0LnJlcGxhY2UocmVnZXhwLCBtZXJnZWRVbml0ID8gJ3B4JyA6ICcnKTtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5sb3dQcmlvcml0eSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIFwiY2FsYyhcIi5jb25jYXQodGhpcy5yZXN1bHQsIFwiKVwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnJlc3VsdDtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIENTU0NhbGN1bGF0b3I7XG59KEFic3RyYWN0Q2FsY3VsYXRvcik7XG5leHBvcnQgeyBDU1NDYWxjdWxhdG9yIGFzIGRlZmF1bHQgfTsiLCAiaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2Fzc2VydFRoaXNJbml0aWFsaXplZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXNzZXJ0VGhpc0luaXRpYWxpemVkXCI7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c1wiO1xuaW1wb3J0IF9jcmVhdGVTdXBlciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlU3VwZXJcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgQWJzdHJhY3RDYWxjdWxhdG9yIGZyb20gXCIuL2NhbGN1bGF0b3JcIjtcbnZhciBOdW1DYWxjdWxhdG9yID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQWJzdHJhY3RDYWxjdWxhdG9yKSB7XG4gIF9pbmhlcml0cyhOdW1DYWxjdWxhdG9yLCBfQWJzdHJhY3RDYWxjdWxhdG9yKTtcbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihOdW1DYWxjdWxhdG9yKTtcbiAgZnVuY3Rpb24gTnVtQ2FsY3VsYXRvcihudW0pIHtcbiAgICB2YXIgX3RoaXM7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE51bUNhbGN1bGF0b3IpO1xuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInJlc3VsdFwiLCAwKTtcbiAgICBpZiAobnVtIGluc3RhbmNlb2YgTnVtQ2FsY3VsYXRvcikge1xuICAgICAgX3RoaXMucmVzdWx0ID0gbnVtLnJlc3VsdDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBudW0gPT09ICdudW1iZXInKSB7XG4gICAgICBfdGhpcy5yZXN1bHQgPSBudW07XG4gICAgfVxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICBfY3JlYXRlQ2xhc3MoTnVtQ2FsY3VsYXRvciwgW3tcbiAgICBrZXk6IFwiYWRkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZChudW0pIHtcbiAgICAgIGlmIChudW0gaW5zdGFuY2VvZiBOdW1DYWxjdWxhdG9yKSB7XG4gICAgICAgIHRoaXMucmVzdWx0ICs9IG51bS5yZXN1bHQ7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBudW0gPT09ICdudW1iZXInKSB7XG4gICAgICAgIHRoaXMucmVzdWx0ICs9IG51bTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzdWJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3ViKG51bSkge1xuICAgICAgaWYgKG51bSBpbnN0YW5jZW9mIE51bUNhbGN1bGF0b3IpIHtcbiAgICAgICAgdGhpcy5yZXN1bHQgLT0gbnVtLnJlc3VsdDtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG51bSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdGhpcy5yZXN1bHQgLT0gbnVtO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm11bFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtdWwobnVtKSB7XG4gICAgICBpZiAobnVtIGluc3RhbmNlb2YgTnVtQ2FsY3VsYXRvcikge1xuICAgICAgICB0aGlzLnJlc3VsdCAqPSBudW0ucmVzdWx0O1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbnVtID09PSAnbnVtYmVyJykge1xuICAgICAgICB0aGlzLnJlc3VsdCAqPSBudW07XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGl2XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRpdihudW0pIHtcbiAgICAgIGlmIChudW0gaW5zdGFuY2VvZiBOdW1DYWxjdWxhdG9yKSB7XG4gICAgICAgIHRoaXMucmVzdWx0IC89IG51bS5yZXN1bHQ7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBudW0gPT09ICdudW1iZXInKSB7XG4gICAgICAgIHRoaXMucmVzdWx0IC89IG51bTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJlcXVhbFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlcXVhbCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc3VsdDtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIE51bUNhbGN1bGF0b3I7XG59KEFic3RyYWN0Q2FsY3VsYXRvcik7XG5leHBvcnQgZGVmYXVsdCBOdW1DYWxjdWxhdG9yOyIsICJpbXBvcnQgQ1NTQ2FsY3VsYXRvciBmcm9tIFwiLi9DU1NDYWxjdWxhdG9yXCI7XG5pbXBvcnQgTnVtQ2FsY3VsYXRvciBmcm9tIFwiLi9OdW1DYWxjdWxhdG9yXCI7XG52YXIgZ2VuQ2FsYyA9IGZ1bmN0aW9uIGdlbkNhbGModHlwZSwgdW5pdGxlc3NDc3NWYXIpIHtcbiAgdmFyIENhbGN1bGF0b3IgPSB0eXBlID09PSAnY3NzJyA/IENTU0NhbGN1bGF0b3IgOiBOdW1DYWxjdWxhdG9yO1xuICByZXR1cm4gZnVuY3Rpb24gKG51bSkge1xuICAgIHJldHVybiBuZXcgQ2FsY3VsYXRvcihudW0sIHVuaXRsZXNzQ3NzVmFyKTtcbiAgfTtcbn07XG5leHBvcnQgZGVmYXVsdCBnZW5DYWxjOyIsICJ2YXIgZ2V0Q29tcFZhclByZWZpeCA9IGZ1bmN0aW9uIGdldENvbXBWYXJQcmVmaXgoY29tcG9uZW50LCBwcmVmaXgpIHtcbiAgcmV0dXJuIFwiXCIuY29uY2F0KFtwcmVmaXgsIGNvbXBvbmVudC5yZXBsYWNlKC8oW0EtWl0rKShbQS1aXVthLXpdKykvZywgJyQxLSQyJykucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgJyQxLSQyJyldLmZpbHRlcihCb29sZWFuKS5qb2luKCctJykpO1xufTtcbmV4cG9ydCBkZWZhdWx0IGdldENvbXBWYXJQcmVmaXg7IiwgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUV2ZW50KGNhbGxiYWNrKSB7XG4gIHZhciBmblJlZiA9IFJlYWN0LnVzZVJlZigpO1xuICBmblJlZi5jdXJyZW50ID0gY2FsbGJhY2s7XG4gIHZhciBtZW1vRm4gPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9mblJlZiRjdXJyZW50O1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIChfZm5SZWYkY3VycmVudCA9IGZuUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9mblJlZiRjdXJyZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZm5SZWYkY3VycmVudC5jYWxsLmFwcGx5KF9mblJlZiRjdXJyZW50LCBbZm5SZWZdLmNvbmNhdChhcmdzKSk7XG4gIH0sIFtdKTtcbiAgcmV0dXJuIG1lbW9Gbjtcbn0iLCAiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG4vKipcbiAqIFNhbWUgYXMgUmVhY3QudXNlU3RhdGUgYnV0IGBzZXRTdGF0ZWAgYWNjZXB0IGBpZ25vcmVEZXN0cm95YCBwYXJhbSB0byBub3QgdG8gc2V0U3RhdGUgYWZ0ZXIgZGVzdHJveWVkLlxuICogV2UgZG8gbm90IG1ha2UgdGhpcyBhdXRvIGlzIHRvIGF2b2lkIHJlYWwgbWVtb3J5IGxlYWsuXG4gKiBEZXZlbG9wZXIgc2hvdWxkIGNvbmZpcm0gaXQncyBzYWZlIHRvIGlnbm9yZSB0aGVtc2VsdmVzLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VTYWZlU3RhdGUoZGVmYXVsdFZhbHVlKSB7XG4gIHZhciBkZXN0cm95UmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGRlZmF1bHRWYWx1ZSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgdmFsdWUgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldFZhbHVlID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBkZXN0cm95UmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgZGVzdHJveVJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIGZ1bmN0aW9uIHNhZmVTZXRTdGF0ZSh1cGRhdGVyLCBpZ25vcmVEZXN0cm95KSB7XG4gICAgaWYgKGlnbm9yZURlc3Ryb3kgJiYgZGVzdHJveVJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNldFZhbHVlKHVwZGF0ZXIpO1xuICB9XG4gIHJldHVybiBbdmFsdWUsIHNhZmVTZXRTdGF0ZV07XG59IiwgImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IHVzZUV2ZW50IGZyb20gXCIuL3VzZUV2ZW50XCI7XG5pbXBvcnQgeyB1c2VMYXlvdXRVcGRhdGVFZmZlY3QgfSBmcm9tIFwiLi91c2VMYXlvdXRFZmZlY3RcIjtcbmltcG9ydCB1c2VTdGF0ZSBmcm9tIFwiLi91c2VTdGF0ZVwiO1xuLyoqIFdlIG9ubHkgdGhpbmsgYHVuZGVmaW5lZGAgaXMgZW1wdHkgKi9cbmZ1bmN0aW9uIGhhc1ZhbHVlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFNpbWlsYXIgdG8gYHVzZVN0YXRlYCBidXQgd2lsbCB1c2UgcHJvcHMgdmFsdWUgaWYgcHJvdmlkZWQuXG4gKiBOb3RlIHRoYXQgaW50ZXJuYWwgdXNlIHJjLXV0aWwgYHVzZVN0YXRlYCBob29rLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VNZXJnZWRTdGF0ZShkZWZhdWx0U3RhdGVWYWx1ZSwgb3B0aW9uKSB7XG4gIHZhciBfcmVmID0gb3B0aW9uIHx8IHt9LFxuICAgIGRlZmF1bHRWYWx1ZSA9IF9yZWYuZGVmYXVsdFZhbHVlLFxuICAgIHZhbHVlID0gX3JlZi52YWx1ZSxcbiAgICBvbkNoYW5nZSA9IF9yZWYub25DaGFuZ2UsXG4gICAgcG9zdFN0YXRlID0gX3JlZi5wb3N0U3RhdGU7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT0gSW5pdCA9PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGhhc1ZhbHVlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKGhhc1ZhbHVlKGRlZmF1bHRWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBkZWZhdWx0VmFsdWUgPT09ICdmdW5jdGlvbicgPyBkZWZhdWx0VmFsdWUoKSA6IGRlZmF1bHRWYWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgZGVmYXVsdFN0YXRlVmFsdWUgPT09ICdmdW5jdGlvbicgPyBkZWZhdWx0U3RhdGVWYWx1ZSgpIDogZGVmYXVsdFN0YXRlVmFsdWU7XG4gICAgICB9XG4gICAgfSksXG4gICAgX3VzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZSwgMiksXG4gICAgaW5uZXJWYWx1ZSA9IF91c2VTdGF0ZTJbMF0sXG4gICAgc2V0SW5uZXJWYWx1ZSA9IF91c2VTdGF0ZTJbMV07XG4gIHZhciBtZXJnZWRWYWx1ZSA9IHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IGlubmVyVmFsdWU7XG4gIHZhciBwb3N0TWVyZ2VkVmFsdWUgPSBwb3N0U3RhdGUgPyBwb3N0U3RhdGUobWVyZ2VkVmFsdWUpIDogbWVyZ2VkVmFsdWU7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PSBDaGFuZ2UgPT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgb25DaGFuZ2VGbiA9IHVzZUV2ZW50KG9uQ2hhbmdlKTtcbiAgdmFyIF91c2VTdGF0ZTMgPSB1c2VTdGF0ZShbbWVyZ2VkVmFsdWVdKSxcbiAgICBfdXNlU3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlMywgMiksXG4gICAgcHJldlZhbHVlID0gX3VzZVN0YXRlNFswXSxcbiAgICBzZXRQcmV2VmFsdWUgPSBfdXNlU3RhdGU0WzFdO1xuICB1c2VMYXlvdXRVcGRhdGVFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcmV2ID0gcHJldlZhbHVlWzBdO1xuICAgIGlmIChpbm5lclZhbHVlICE9PSBwcmV2KSB7XG4gICAgICBvbkNoYW5nZUZuKGlubmVyVmFsdWUsIHByZXYpO1xuICAgIH1cbiAgfSwgW3ByZXZWYWx1ZV0pO1xuXG4gIC8vIFN5bmMgdmFsdWUgYmFjayB0byBgdW5kZWZpbmVkYCB3aGVuIGl0IGZyb20gY29udHJvbCB0byB1bi1jb250cm9sXG4gIHVzZUxheW91dFVwZGF0ZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFoYXNWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgIHNldElubmVyVmFsdWUodmFsdWUpO1xuICAgIH1cbiAgfSwgW3ZhbHVlXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PSBVcGRhdGUgPT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgdHJpZ2dlckNoYW5nZSA9IHVzZUV2ZW50KGZ1bmN0aW9uICh1cGRhdGVyLCBpZ25vcmVEZXN0cm95KSB7XG4gICAgc2V0SW5uZXJWYWx1ZSh1cGRhdGVyLCBpZ25vcmVEZXN0cm95KTtcbiAgICBzZXRQcmV2VmFsdWUoW21lcmdlZFZhbHVlXSwgaWdub3JlRGVzdHJveSk7XG4gIH0pO1xuICByZXR1cm4gW3Bvc3RNZXJnZWRWYWx1ZSwgdHJpZ2dlckNoYW5nZV07XG59IiwgImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCB7IHdhcm5pbmcgfSBmcm9tICdyYy11dGlsJztcbmZ1bmN0aW9uIGdldENvbXBvbmVudFRva2VuKGNvbXBvbmVudCwgdG9rZW4sIGRlZmF1bHRUb2tlbiwgb3B0aW9ucykge1xuICB2YXIgY3VzdG9tVG9rZW4gPSBfb2JqZWN0U3ByZWFkKHt9LCB0b2tlbltjb21wb25lbnRdKTtcbiAgaWYgKG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdm9pZCAwICYmIG9wdGlvbnMuZGVwcmVjYXRlZFRva2Vucykge1xuICAgIHZhciBkZXByZWNhdGVkVG9rZW5zID0gb3B0aW9ucy5kZXByZWNhdGVkVG9rZW5zO1xuICAgIGRlcHJlY2F0ZWRUb2tlbnMuZm9yRWFjaChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgdmFyIF9yZWYyID0gX3NsaWNlZFRvQXJyYXkoX3JlZiwgMiksXG4gICAgICAgIG9sZFRva2VuS2V5ID0gX3JlZjJbMF0sXG4gICAgICAgIG5ld1Rva2VuS2V5ID0gX3JlZjJbMV07XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICB3YXJuaW5nKCEoY3VzdG9tVG9rZW4gIT09IG51bGwgJiYgY3VzdG9tVG9rZW4gIT09IHZvaWQgMCAmJiBjdXN0b21Ub2tlbltvbGRUb2tlbktleV0pLCBcIkNvbXBvbmVudCBUb2tlbiBgXCIuY29uY2F0KFN0cmluZyhvbGRUb2tlbktleSksIFwiYCBvZiBcIikuY29uY2F0KFN0cmluZyhjb21wb25lbnQpLCBcIiBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIGBcIikuY29uY2F0KFN0cmluZyhuZXdUb2tlbktleSksIFwiYCBpbnN0ZWFkLlwiKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNob3VsZCB3cmFwIHdpdGggYGlmYCBjbGF1c2UsIG9yIHRoZXJlIHdpbGwgYmUgYHVuZGVmaW5lZGAgaW4gb2JqZWN0LlxuICAgICAgaWYgKGN1c3RvbVRva2VuICE9PSBudWxsICYmIGN1c3RvbVRva2VuICE9PSB2b2lkIDAgJiYgY3VzdG9tVG9rZW5bb2xkVG9rZW5LZXldIHx8IGN1c3RvbVRva2VuICE9PSBudWxsICYmIGN1c3RvbVRva2VuICE9PSB2b2lkIDAgJiYgY3VzdG9tVG9rZW5bbmV3VG9rZW5LZXldKSB7XG4gICAgICAgIHZhciBfY3VzdG9tVG9rZW4kbmV3VG9rZW47XG4gICAgICAgIChfY3VzdG9tVG9rZW4kbmV3VG9rZW4gPSBjdXN0b21Ub2tlbltuZXdUb2tlbktleV0pICE9PSBudWxsICYmIF9jdXN0b21Ub2tlbiRuZXdUb2tlbiAhPT0gdm9pZCAwID8gX2N1c3RvbVRva2VuJG5ld1Rva2VuIDogY3VzdG9tVG9rZW5bbmV3VG9rZW5LZXldID0gY3VzdG9tVG9rZW4gPT09IG51bGwgfHwgY3VzdG9tVG9rZW4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGN1c3RvbVRva2VuW29sZFRva2VuS2V5XTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICB2YXIgbWVyZ2VkVG9rZW4gPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGRlZmF1bHRUb2tlbiksIGN1c3RvbVRva2VuKTtcblxuICAvLyBSZW1vdmUgc2FtZSB2YWx1ZSBhcyBnbG9iYWwgdG9rZW4gdG8gbWluaW1pemUgc2l6ZVxuICBPYmplY3Qua2V5cyhtZXJnZWRUb2tlbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKG1lcmdlZFRva2VuW2tleV0gPT09IHRva2VuW2tleV0pIHtcbiAgICAgIGRlbGV0ZSBtZXJnZWRUb2tlbltrZXldO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBtZXJnZWRUb2tlbjtcbn1cbmV4cG9ydCBkZWZhdWx0IGdldENvbXBvbmVudFRva2VuOyIsICJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xudmFyIGVuYWJsZVN0YXRpc3RpYyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgfHwgdHlwZW9mIENTU0lOSlNfU1RBVElTVElDICE9PSAndW5kZWZpbmVkJztcbnZhciByZWNvcmRpbmcgPSB0cnVlO1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkbyBhcyBgT2JqZWN0LmFzc2lnbmAgaW4gcHJvZHVjdGlvbi4gQnV0IHdpbGwgdXNlIE9iamVjdC5kZWZpbmVQcm9wZXJ0eTpnZXQgdG9cbiAqIHBhc3MgYWxsIHZhbHVlIGFjY2VzcyBpbiBkZXZlbG9wbWVudC4gVG8gc3VwcG9ydCBzdGF0aXN0aWMgZmllbGQgdXNhZ2Ugd2l0aCBhbGlhcyB0b2tlbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgb2JqcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBvYmpzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGlmICghZW5hYmxlU3RhdGlzdGljKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24uYXBwbHkoT2JqZWN0LCBbe31dLmNvbmNhdChvYmpzKSk7XG4gIH1cbiAgcmVjb3JkaW5nID0gZmFsc2U7XG4gIHZhciByZXQgPSB7fTtcbiAgb2Jqcy5mb3JFYWNoKGZ1bmN0aW9uIChvYmopIHtcbiAgICBpZiAoX3R5cGVvZihvYmopICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXQsIGtleSwge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIHJldHVybiBvYmpba2V5XTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuICByZWNvcmRpbmcgPSB0cnVlO1xuICByZXR1cm4gcmV0O1xufVxuXG4vKiogQGludGVybmFsIEludGVybmFsIFVzYWdlLiBOb3QgdXNlIGluIHlvdXIgcHJvZHVjdGlvbi4gKi9cbmV4cG9ydCB2YXIgc3RhdGlzdGljID0ge307XG5cbi8qKiBAaW50ZXJuYWwgSW50ZXJuYWwgVXNhZ2UuIE5vdCB1c2UgaW4geW91ciBwcm9kdWN0aW9uLiAqL1xuZXhwb3J0IHZhciBfc3RhdGlzdGljX2J1aWxkXyA9IHt9O1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbi8qKiBTdGF0aXN0aWMgdG9rZW4gdXNhZ2UgY2FzZS4gU2hvdWxkIHVzZSBgbWVyZ2VgIGZ1bmN0aW9uIGlmIHlvdSBkbyBub3Qgd2FudCBzcHJlYWQgcmVjb3JkLiAqL1xudmFyIHN0YXRpc3RpY1Rva2VuID0gZnVuY3Rpb24gc3RhdGlzdGljVG9rZW4odG9rZW4pIHtcbiAgdmFyIHRva2VuS2V5cztcbiAgdmFyIHByb3h5ID0gdG9rZW47XG4gIHZhciBmbHVzaCA9IG5vb3A7XG4gIGlmIChlbmFibGVTdGF0aXN0aWMgJiYgdHlwZW9mIFByb3h5ICE9PSAndW5kZWZpbmVkJykge1xuICAgIHRva2VuS2V5cyA9IG5ldyBTZXQoKTtcbiAgICBwcm94eSA9IG5ldyBQcm94eSh0b2tlbiwge1xuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQob2JqLCBwcm9wKSB7XG4gICAgICAgIGlmIChyZWNvcmRpbmcpIHtcbiAgICAgICAgICB2YXIgX3Rva2VuS2V5cztcbiAgICAgICAgICAoX3Rva2VuS2V5cyA9IHRva2VuS2V5cykgPT09IG51bGwgfHwgX3Rva2VuS2V5cyA9PT0gdm9pZCAwIHx8IF90b2tlbktleXMuYWRkKHByb3ApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmpbcHJvcF07XG4gICAgICB9XG4gICAgfSk7XG4gICAgZmx1c2ggPSBmdW5jdGlvbiBmbHVzaChjb21wb25lbnROYW1lLCBjb21wb25lbnRUb2tlbikge1xuICAgICAgdmFyIF9zdGF0aXN0aWMkY29tcG9uZW50TjtcbiAgICAgIHN0YXRpc3RpY1tjb21wb25lbnROYW1lXSA9IHtcbiAgICAgICAgZ2xvYmFsOiBBcnJheS5mcm9tKHRva2VuS2V5cyksXG4gICAgICAgIGNvbXBvbmVudDogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCAoX3N0YXRpc3RpYyRjb21wb25lbnROID0gc3RhdGlzdGljW2NvbXBvbmVudE5hbWVdKSA9PT0gbnVsbCB8fCBfc3RhdGlzdGljJGNvbXBvbmVudE4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9zdGF0aXN0aWMkY29tcG9uZW50Ti5jb21wb25lbnQpLCBjb21wb25lbnRUb2tlbilcbiAgICAgIH07XG4gICAgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHRva2VuOiBwcm94eSxcbiAgICBrZXlzOiB0b2tlbktleXMsXG4gICAgZmx1c2g6IGZsdXNoXG4gIH07XG59O1xuZXhwb3J0IGRlZmF1bHQgc3RhdGlzdGljVG9rZW47IiwgImltcG9ydCB7IG1lcmdlIGFzIG1lcmdlVG9rZW4gfSBmcm9tIFwiLi9zdGF0aXN0aWNcIjtcbmZ1bmN0aW9uIGdldERlZmF1bHRDb21wb25lbnRUb2tlbihjb21wb25lbnQsIHRva2VuLCBnZXREZWZhdWx0VG9rZW4pIHtcbiAgaWYgKHR5cGVvZiBnZXREZWZhdWx0VG9rZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgX3Rva2VuJGNvbXBvbmVudDtcbiAgICByZXR1cm4gZ2V0RGVmYXVsdFRva2VuKG1lcmdlVG9rZW4odG9rZW4sIChfdG9rZW4kY29tcG9uZW50ID0gdG9rZW5bY29tcG9uZW50XSkgIT09IG51bGwgJiYgX3Rva2VuJGNvbXBvbmVudCAhPT0gdm9pZCAwID8gX3Rva2VuJGNvbXBvbmVudCA6IHt9KSk7XG4gIH1cbiAgcmV0dXJuIGdldERlZmF1bHRUb2tlbiAhPT0gbnVsbCAmJiBnZXREZWZhdWx0VG9rZW4gIT09IHZvaWQgMCA/IGdldERlZmF1bHRUb2tlbiA6IHt9O1xufVxuZXhwb3J0IGRlZmF1bHQgZ2V0RGVmYXVsdENvbXBvbmVudFRva2VuOyIsICJpbXBvcnQgeyB1bml0IH0gZnJvbSAnQGFudC1kZXNpZ24vY3NzaW5qcyc7XG5mdW5jdGlvbiBnZW5NYXhNaW4odHlwZSkge1xuICBpZiAodHlwZSA9PT0gJ2pzJykge1xuICAgIHJldHVybiB7XG4gICAgICBtYXg6IE1hdGgubWF4LFxuICAgICAgbWluOiBNYXRoLm1pblxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBtYXg6IGZ1bmN0aW9uIG1heCgpIHtcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFwibWF4KFwiLmNvbmNhdChhcmdzLm1hcChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHVuaXQodmFsdWUpO1xuICAgICAgfSkuam9pbignLCcpLCBcIilcIik7XG4gICAgfSxcbiAgICBtaW46IGZ1bmN0aW9uIG1pbigpIHtcbiAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICB9XG4gICAgICByZXR1cm4gXCJtaW4oXCIuY29uY2F0KGFyZ3MubWFwKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdW5pdCh2YWx1ZSk7XG4gICAgICB9KS5qb2luKCcsJyksIFwiKVwiKTtcbiAgICB9XG4gIH07XG59XG5leHBvcnQgZGVmYXVsdCBnZW5NYXhNaW47IiwgImltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG52YXIgQkVBVF9MSU1JVCA9IDEwMDAgKiA2MCAqIDEwO1xuXG4vKipcbiAqIEEgaGVscGVyIGNsYXNzIHRvIG1hcCBrZXlzIHRvIHZhbHVlcy5cbiAqIEl0IHN1cHBvcnRzIGJvdGggcHJpbWl0aXZlIGtleXMgYW5kIG9iamVjdCBrZXlzLlxuICovXG52YXIgQXJyYXlLZXlNYXAgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBBcnJheUtleU1hcCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQXJyYXlLZXlNYXApO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm1hcFwiLCBuZXcgTWFwKCkpO1xuICAgIC8vIFVzZSBXZWFrTWFwIHRvIGF2b2lkIG1lbW9yeSBsZWFrXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwib2JqZWN0SURNYXBcIiwgbmV3IFdlYWtNYXAoKSk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwibmV4dElEXCIsIDApO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImxhc3RBY2Nlc3NCZWF0XCIsIG5ldyBNYXAoKSk7XG4gICAgLy8gV2Ugd2lsbCBjbGVhbiB1cCB0aGUgY2FjaGUgd2hlbiByZWFjaCB0aGUgbGltaXRcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJhY2Nlc3NCZWF0XCIsIDApO1xuICB9XG4gIF9jcmVhdGVDbGFzcyhBcnJheUtleU1hcCwgW3tcbiAgICBrZXk6IFwic2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldChrZXlzLCB2YWx1ZSkge1xuICAgICAgLy8gTmV3IHNldCB3aWxsIHRyaWdnZXIgY2xlYXJcbiAgICAgIHRoaXMuY2xlYXIoKTtcblxuICAgICAgLy8gU2V0IGxvZ2ljXG4gICAgICB2YXIgY29tcG9zaXRlS2V5ID0gdGhpcy5nZXRDb21wb3NpdGVLZXkoa2V5cyk7XG4gICAgICB0aGlzLm1hcC5zZXQoY29tcG9zaXRlS2V5LCB2YWx1ZSk7XG4gICAgICB0aGlzLmxhc3RBY2Nlc3NCZWF0LnNldChjb21wb3NpdGVLZXksIERhdGUubm93KCkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0KGtleXMpIHtcbiAgICAgIHZhciBjb21wb3NpdGVLZXkgPSB0aGlzLmdldENvbXBvc2l0ZUtleShrZXlzKTtcbiAgICAgIHZhciBjYWNoZSA9IHRoaXMubWFwLmdldChjb21wb3NpdGVLZXkpO1xuICAgICAgdGhpcy5sYXN0QWNjZXNzQmVhdC5zZXQoY29tcG9zaXRlS2V5LCBEYXRlLm5vdygpKTtcbiAgICAgIHRoaXMuYWNjZXNzQmVhdCArPSAxO1xuICAgICAgcmV0dXJuIGNhY2hlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRDb21wb3NpdGVLZXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q29tcG9zaXRlS2V5KGtleXMpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICB2YXIgaWRzID0ga2V5cy5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBpZiAoa2V5ICYmIF90eXBlb2Yoa2V5KSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICByZXR1cm4gXCJvYmpfXCIuY29uY2F0KF90aGlzLmdldE9iamVjdElEKGtleSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIlwiLmNvbmNhdChfdHlwZW9mKGtleSksIFwiX1wiKS5jb25jYXQoa2V5KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGlkcy5qb2luKCd8Jyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldE9iamVjdElEXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldE9iamVjdElEKG9iaikge1xuICAgICAgaWYgKHRoaXMub2JqZWN0SURNYXAuaGFzKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2JqZWN0SURNYXAuZ2V0KG9iaik7XG4gICAgICB9XG4gICAgICB2YXIgaWQgPSB0aGlzLm5leHRJRDtcbiAgICAgIHRoaXMub2JqZWN0SURNYXAuc2V0KG9iaiwgaWQpO1xuICAgICAgdGhpcy5uZXh0SUQgKz0gMTtcbiAgICAgIHJldHVybiBpZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY2xlYXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcbiAgICAgIGlmICh0aGlzLmFjY2Vzc0JlYXQgPiAxMDAwMCkge1xuICAgICAgICB2YXIgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdGhpcy5sYXN0QWNjZXNzQmVhdC5mb3JFYWNoKGZ1bmN0aW9uIChiZWF0LCBrZXkpIHtcbiAgICAgICAgICBpZiAobm93IC0gYmVhdCA+IEJFQVRfTElNSVQpIHtcbiAgICAgICAgICAgIF90aGlzMi5tYXAuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICBfdGhpczIubGFzdEFjY2Vzc0JlYXQuZGVsZXRlKGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hY2Nlc3NCZWF0ID0gMDtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIEFycmF5S2V5TWFwO1xufSgpO1xudmFyIHVuaXF1ZU1hcCA9IG5ldyBBcnJheUtleU1hcCgpO1xuXG4vKipcbiAqIExpa2UgYHVzZU1lbW9gLCBidXQgdGhpcyBob29rIHJlc3VsdCB3aWxsIGJlIHNoYXJlZCBhY3Jvc3MgYWxsIGluc3RhbmNlcy5cbiAqL1xuZnVuY3Rpb24gdXNlVW5pcXVlTWVtbyhtZW1vRm4sIGRlcHMpIHtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBjYWNoZWRWYWx1ZSA9IHVuaXF1ZU1hcC5nZXQoZGVwcyk7XG4gICAgaWYgKGNhY2hlZFZhbHVlKSB7XG4gICAgICByZXR1cm4gY2FjaGVkVmFsdWU7XG4gICAgfVxuICAgIHZhciBuZXdWYWx1ZSA9IG1lbW9GbigpO1xuICAgIHVuaXF1ZU1hcC5zZXQoZGVwcywgbmV3VmFsdWUpO1xuICAgIHJldHVybiBuZXdWYWx1ZTtcbiAgfSwgZGVwcyk7XG59XG5leHBvcnQgZGVmYXVsdCB1c2VVbmlxdWVNZW1vOyIsICIvKipcbiAqIFByb3ZpZGUgYSBkZWZhdWx0IGhvb2sgc2luY2Ugbm90IGV2ZXJ5b25lIG5lZWRzIHRvIGNvbmZpZyB0aGlzLlxuICovXG52YXIgdXNlRGVmYXVsdENTUCA9IGZ1bmN0aW9uIHVzZURlZmF1bHRDU1AoKSB7XG4gIHJldHVybiB7fTtcbn07XG5leHBvcnQgZGVmYXVsdCB1c2VEZWZhdWx0Q1NQOyIsICJleHBvcnQgY29uc3QgUHJlc2V0Q29sb3JzID0gWydibHVlJywgJ3B1cnBsZScsICdjeWFuJywgJ2dyZWVuJywgJ21hZ2VudGEnLCAncGluaycsICdyZWQnLCAnb3JhbmdlJywgJ3llbGxvdycsICd2b2xjYW5vJywgJ2dlZWtibHVlJywgJ2xpbWUnLCAnZ29sZCddOyIsICJ2YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNhY2hlVG9rZW4gfSBmcm9tICdAYW50LWRlc2lnbi9jc3NpbmpzJztcbmltcG9ydCB2ZXJzaW9uIGZyb20gJy4uL3ZlcnNpb24nO1xuaW1wb3J0IHsgZGVmYXVsdFRoZW1lLCBEZXNpZ25Ub2tlbkNvbnRleHQgfSBmcm9tICcuL2NvbnRleHQnO1xuaW1wb3J0IGRlZmF1bHRTZWVkVG9rZW4gZnJvbSAnLi90aGVtZXMvc2VlZCc7XG5pbXBvcnQgZm9ybWF0VG9rZW4gZnJvbSAnLi91dGlsL2FsaWFzJztcbmV4cG9ydCBjb25zdCB1bml0bGVzcyA9IHtcbiAgbGluZUhlaWdodDogdHJ1ZSxcbiAgbGluZUhlaWdodFNNOiB0cnVlLFxuICBsaW5lSGVpZ2h0TEc6IHRydWUsXG4gIGxpbmVIZWlnaHRIZWFkaW5nMTogdHJ1ZSxcbiAgbGluZUhlaWdodEhlYWRpbmcyOiB0cnVlLFxuICBsaW5lSGVpZ2h0SGVhZGluZzM6IHRydWUsXG4gIGxpbmVIZWlnaHRIZWFkaW5nNDogdHJ1ZSxcbiAgbGluZUhlaWdodEhlYWRpbmc1OiB0cnVlLFxuICBvcGFjaXR5TG9hZGluZzogdHJ1ZSxcbiAgZm9udFdlaWdodFN0cm9uZzogdHJ1ZSxcbiAgekluZGV4UG9wdXBCYXNlOiB0cnVlLFxuICB6SW5kZXhCYXNlOiB0cnVlLFxuICBvcGFjaXR5SW1hZ2U6IHRydWVcbn07XG5leHBvcnQgY29uc3QgaWdub3JlID0ge1xuICBzaXplOiB0cnVlLFxuICBzaXplU006IHRydWUsXG4gIHNpemVMRzogdHJ1ZSxcbiAgc2l6ZU1EOiB0cnVlLFxuICBzaXplWFM6IHRydWUsXG4gIHNpemVYWFM6IHRydWUsXG4gIHNpemVNUzogdHJ1ZSxcbiAgc2l6ZVhMOiB0cnVlLFxuICBzaXplWFhMOiB0cnVlLFxuICBzaXplVW5pdDogdHJ1ZSxcbiAgc2l6ZVN0ZXA6IHRydWUsXG4gIG1vdGlvbkJhc2U6IHRydWUsXG4gIG1vdGlvblVuaXQ6IHRydWVcbn07XG5jb25zdCBwcmVzZXJ2ZSA9IHtcbiAgc2NyZWVuWFM6IHRydWUsXG4gIHNjcmVlblhTTWluOiB0cnVlLFxuICBzY3JlZW5YU01heDogdHJ1ZSxcbiAgc2NyZWVuU006IHRydWUsXG4gIHNjcmVlblNNTWluOiB0cnVlLFxuICBzY3JlZW5TTU1heDogdHJ1ZSxcbiAgc2NyZWVuTUQ6IHRydWUsXG4gIHNjcmVlbk1ETWluOiB0cnVlLFxuICBzY3JlZW5NRE1heDogdHJ1ZSxcbiAgc2NyZWVuTEc6IHRydWUsXG4gIHNjcmVlbkxHTWluOiB0cnVlLFxuICBzY3JlZW5MR01heDogdHJ1ZSxcbiAgc2NyZWVuWEw6IHRydWUsXG4gIHNjcmVlblhMTWluOiB0cnVlLFxuICBzY3JlZW5YTE1heDogdHJ1ZSxcbiAgc2NyZWVuWFhMOiB0cnVlLFxuICBzY3JlZW5YWExNaW46IHRydWVcbn07XG5leHBvcnQgY29uc3QgZ2V0Q29tcHV0ZWRUb2tlbiA9IChvcmlnaW5Ub2tlbiwgb3ZlcnJpZGVUb2tlbiwgdGhlbWUpID0+IHtcbiAgY29uc3QgZGVyaXZhdGl2ZVRva2VuID0gdGhlbWUuZ2V0RGVyaXZhdGl2ZVRva2VuKG9yaWdpblRva2VuKTtcbiAgY29uc3Qge1xuICAgICAgb3ZlcnJpZGVcbiAgICB9ID0gb3ZlcnJpZGVUb2tlbixcbiAgICBjb21wb25lbnRzID0gX19yZXN0KG92ZXJyaWRlVG9rZW4sIFtcIm92ZXJyaWRlXCJdKTtcbiAgLy8gTWVyZ2Ugd2l0aCBvdmVycmlkZVxuICBsZXQgbWVyZ2VkRGVyaXZhdGl2ZVRva2VuID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkZXJpdmF0aXZlVG9rZW4pLCB7XG4gICAgb3ZlcnJpZGVcbiAgfSk7XG4gIC8vIEZvcm1hdCBpZiBuZWVkZWRcbiAgbWVyZ2VkRGVyaXZhdGl2ZVRva2VuID0gZm9ybWF0VG9rZW4obWVyZ2VkRGVyaXZhdGl2ZVRva2VuKTtcbiAgaWYgKGNvbXBvbmVudHMpIHtcbiAgICBPYmplY3QuZW50cmllcyhjb21wb25lbnRzKS5mb3JFYWNoKF9yZWYgPT4ge1xuICAgICAgbGV0IFtrZXksIHZhbHVlXSA9IF9yZWY7XG4gICAgICBjb25zdCB7XG4gICAgICAgICAgdGhlbWU6IGNvbXBvbmVudFRoZW1lXG4gICAgICAgIH0gPSB2YWx1ZSxcbiAgICAgICAgY29tcG9uZW50VG9rZW5zID0gX19yZXN0KHZhbHVlLCBbXCJ0aGVtZVwiXSk7XG4gICAgICBsZXQgbWVyZ2VkQ29tcG9uZW50VG9rZW4gPSBjb21wb25lbnRUb2tlbnM7XG4gICAgICBpZiAoY29tcG9uZW50VGhlbWUpIHtcbiAgICAgICAgbWVyZ2VkQ29tcG9uZW50VG9rZW4gPSBnZXRDb21wdXRlZFRva2VuKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgbWVyZ2VkRGVyaXZhdGl2ZVRva2VuKSwgY29tcG9uZW50VG9rZW5zKSwge1xuICAgICAgICAgIG92ZXJyaWRlOiBjb21wb25lbnRUb2tlbnNcbiAgICAgICAgfSwgY29tcG9uZW50VGhlbWUpO1xuICAgICAgfVxuICAgICAgbWVyZ2VkRGVyaXZhdGl2ZVRva2VuW2tleV0gPSBtZXJnZWRDb21wb25lbnRUb2tlbjtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gbWVyZ2VkRGVyaXZhdGl2ZVRva2VuO1xufTtcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSG9vayA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VUb2tlbigpIHtcbiAgY29uc3Qge1xuICAgIHRva2VuOiByb290RGVzaWduVG9rZW4sXG4gICAgaGFzaGVkLFxuICAgIHRoZW1lLFxuICAgIG92ZXJyaWRlLFxuICAgIGNzc1ZhclxuICB9ID0gUmVhY3QudXNlQ29udGV4dChEZXNpZ25Ub2tlbkNvbnRleHQpO1xuICBjb25zdCBzYWx0ID0gYCR7dmVyc2lvbn0tJHtoYXNoZWQgfHwgJyd9YDtcbiAgY29uc3QgbWVyZ2VkVGhlbWUgPSB0aGVtZSB8fCBkZWZhdWx0VGhlbWU7XG4gIGNvbnN0IFt0b2tlbiwgaGFzaElkLCByZWFsVG9rZW5dID0gdXNlQ2FjaGVUb2tlbihtZXJnZWRUaGVtZSwgW2RlZmF1bHRTZWVkVG9rZW4sIHJvb3REZXNpZ25Ub2tlbl0sIHtcbiAgICBzYWx0LFxuICAgIG92ZXJyaWRlLFxuICAgIGdldENvbXB1dGVkVG9rZW4sXG4gICAgLy8gZm9ybWF0VG9rZW4gd2lsbCBub3QgYmUgY29uc3VtZWQgYWZ0ZXIgMS4xNS4wIHdpdGggZ2V0Q29tcHV0ZWRUb2tlbi5cbiAgICAvLyBCdXQgdG9rZW4gd2lsbCBicmVhayBpZiBAYW50LWRlc2lnbi9jc3NpbmpzIGlzIHVuZGVyIDEuMTUuMCB3aXRob3V0IGl0XG4gICAgZm9ybWF0VG9rZW4sXG4gICAgY3NzVmFyOiBjc3NWYXIgJiYge1xuICAgICAgcHJlZml4OiBjc3NWYXIucHJlZml4LFxuICAgICAga2V5OiBjc3NWYXIua2V5LFxuICAgICAgdW5pdGxlc3MsXG4gICAgICBpZ25vcmUsXG4gICAgICBwcmVzZXJ2ZVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiBbbWVyZ2VkVGhlbWUsIHJlYWxUb2tlbiwgaGFzaGVkID8gaGFzaElkIDogJycsIHRva2VuLCBjc3NWYXJdO1xufSIsICJleHBvcnQgZGVmYXVsdCAnNS4yNC43JzsiLCAiXCJ1c2UgY2xpZW50XCI7XG5cbi8qIGVzbGludCBpbXBvcnQvbm8tdW5yZXNvbHZlZDogMCAqL1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHZlcnNpb24gZnJvbSAnLi92ZXJzaW9uJztcbmV4cG9ydCBkZWZhdWx0IHZlcnNpb247IiwgImltcG9ydCB7IEZhc3RDb2xvciB9IGZyb20gJ0BhbnQtZGVzaWduL2Zhc3QtY29sb3InO1xuZnVuY3Rpb24gaXNTdGFibGVDb2xvcihjb2xvcikge1xuICByZXR1cm4gY29sb3IgPj0gMCAmJiBjb2xvciA8PSAyNTU7XG59XG5mdW5jdGlvbiBnZXRBbHBoYUNvbG9yKGZyb250Q29sb3IsIGJhY2tncm91bmRDb2xvcikge1xuICBjb25zdCB7XG4gICAgcjogZlIsXG4gICAgZzogZkcsXG4gICAgYjogZkIsXG4gICAgYTogb3JpZ2luQWxwaGFcbiAgfSA9IG5ldyBGYXN0Q29sb3IoZnJvbnRDb2xvcikudG9SZ2IoKTtcbiAgaWYgKG9yaWdpbkFscGhhIDwgMSkge1xuICAgIHJldHVybiBmcm9udENvbG9yO1xuICB9XG4gIGNvbnN0IHtcbiAgICByOiBiUixcbiAgICBnOiBiRyxcbiAgICBiOiBiQlxuICB9ID0gbmV3IEZhc3RDb2xvcihiYWNrZ3JvdW5kQ29sb3IpLnRvUmdiKCk7XG4gIGZvciAobGV0IGZBID0gMC4wMTsgZkEgPD0gMTsgZkEgKz0gMC4wMSkge1xuICAgIGNvbnN0IHIgPSBNYXRoLnJvdW5kKChmUiAtIGJSICogKDEgLSBmQSkpIC8gZkEpO1xuICAgIGNvbnN0IGcgPSBNYXRoLnJvdW5kKChmRyAtIGJHICogKDEgLSBmQSkpIC8gZkEpO1xuICAgIGNvbnN0IGIgPSBNYXRoLnJvdW5kKChmQiAtIGJCICogKDEgLSBmQSkpIC8gZkEpO1xuICAgIGlmIChpc1N0YWJsZUNvbG9yKHIpICYmIGlzU3RhYmxlQ29sb3IoZykgJiYgaXNTdGFibGVDb2xvcihiKSkge1xuICAgICAgcmV0dXJuIG5ldyBGYXN0Q29sb3Ioe1xuICAgICAgICByLFxuICAgICAgICBnLFxuICAgICAgICBiLFxuICAgICAgICBhOiBNYXRoLnJvdW5kKGZBICogMTAwKSAvIDEwMFxuICAgICAgfSkudG9SZ2JTdHJpbmcoKTtcbiAgICB9XG4gIH1cbiAgLy8gZmFsbGJhY2tcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgcmV0dXJuIG5ldyBGYXN0Q29sb3Ioe1xuICAgIHI6IGZSLFxuICAgIGc6IGZHLFxuICAgIGI6IGZCLFxuICAgIGE6IDFcbiAgfSkudG9SZ2JTdHJpbmcoKTtcbn1cbmV4cG9ydCBkZWZhdWx0IGdldEFscGhhQ29sb3I7IiwgInZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgeyBGYXN0Q29sb3IgfSBmcm9tICdAYW50LWRlc2lnbi9mYXN0LWNvbG9yJztcbmltcG9ydCBzZWVkVG9rZW4gZnJvbSAnLi4vdGhlbWVzL3NlZWQnO1xuaW1wb3J0IGdldEFscGhhQ29sb3IgZnJvbSAnLi9nZXRBbHBoYUNvbG9yJztcbi8qKlxuICogU2VlZCAoZGVzaWduZXIpID4gRGVyaXZhdGl2ZSAoZGVzaWduZXIpID4gQWxpYXMgKGRldmVsb3BlcikuXG4gKlxuICogTWVyZ2Ugc2VlZCAmIGRlcml2YXRpdmUgJiBvdmVycmlkZSB0b2tlbiBhbmQgZ2VuZXJhdGUgYWxpYXMgdG9rZW4gZm9yIGRldmVsb3Blci5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZm9ybWF0VG9rZW4oZGVyaXZhdGl2ZVRva2VuKSB7XG4gIGNvbnN0IHtcbiAgICAgIG92ZXJyaWRlXG4gICAgfSA9IGRlcml2YXRpdmVUb2tlbixcbiAgICByZXN0VG9rZW4gPSBfX3Jlc3QoZGVyaXZhdGl2ZVRva2VuLCBbXCJvdmVycmlkZVwiXSk7XG4gIGNvbnN0IG92ZXJyaWRlVG9rZW5zID0gT2JqZWN0LmFzc2lnbih7fSwgb3ZlcnJpZGUpO1xuICBPYmplY3Qua2V5cyhzZWVkVG9rZW4pLmZvckVhY2godG9rZW4gPT4ge1xuICAgIGRlbGV0ZSBvdmVycmlkZVRva2Vuc1t0b2tlbl07XG4gIH0pO1xuICBjb25zdCBtZXJnZWRUb2tlbiA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVzdFRva2VuKSwgb3ZlcnJpZGVUb2tlbnMpO1xuICBjb25zdCBzY3JlZW5YUyA9IDQ4MDtcbiAgY29uc3Qgc2NyZWVuU00gPSA1NzY7XG4gIGNvbnN0IHNjcmVlbk1EID0gNzY4O1xuICBjb25zdCBzY3JlZW5MRyA9IDk5MjtcbiAgY29uc3Qgc2NyZWVuWEwgPSAxMjAwO1xuICBjb25zdCBzY3JlZW5YWEwgPSAxNjAwO1xuICAvLyBNb3Rpb25cbiAgaWYgKG1lcmdlZFRva2VuLm1vdGlvbiA9PT0gZmFsc2UpIHtcbiAgICBjb25zdCBmYXN0RHVyYXRpb24gPSAnMHMnO1xuICAgIG1lcmdlZFRva2VuLm1vdGlvbkR1cmF0aW9uRmFzdCA9IGZhc3REdXJhdGlvbjtcbiAgICBtZXJnZWRUb2tlbi5tb3Rpb25EdXJhdGlvbk1pZCA9IGZhc3REdXJhdGlvbjtcbiAgICBtZXJnZWRUb2tlbi5tb3Rpb25EdXJhdGlvblNsb3cgPSBmYXN0RHVyYXRpb247XG4gIH1cbiAgLy8gR2VuZXJhdGUgYWxpYXMgdG9rZW5cbiAgY29uc3QgYWxpYXNUb2tlbiA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBtZXJnZWRUb2tlbiksIHtcbiAgICAvLyA9PT09PT09PT09PT09PSBCYWNrZ3JvdW5kID09PT09PT09PT09PT09IC8vXG4gICAgY29sb3JGaWxsQ29udGVudDogbWVyZ2VkVG9rZW4uY29sb3JGaWxsU2Vjb25kYXJ5LFxuICAgIGNvbG9yRmlsbENvbnRlbnRIb3ZlcjogbWVyZ2VkVG9rZW4uY29sb3JGaWxsLFxuICAgIGNvbG9yRmlsbEFsdGVyOiBtZXJnZWRUb2tlbi5jb2xvckZpbGxRdWF0ZXJuYXJ5LFxuICAgIGNvbG9yQmdDb250YWluZXJEaXNhYmxlZDogbWVyZ2VkVG9rZW4uY29sb3JGaWxsVGVydGlhcnksXG4gICAgLy8gPT09PT09PT09PT09PT0gU3BsaXQgPT09PT09PT09PT09PT0gLy9cbiAgICBjb2xvckJvcmRlckJnOiBtZXJnZWRUb2tlbi5jb2xvckJnQ29udGFpbmVyLFxuICAgIGNvbG9yU3BsaXQ6IGdldEFscGhhQ29sb3IobWVyZ2VkVG9rZW4uY29sb3JCb3JkZXJTZWNvbmRhcnksIG1lcmdlZFRva2VuLmNvbG9yQmdDb250YWluZXIpLFxuICAgIC8vID09PT09PT09PT09PT09IFRleHQgPT09PT09PT09PT09PT0gLy9cbiAgICBjb2xvclRleHRQbGFjZWhvbGRlcjogbWVyZ2VkVG9rZW4uY29sb3JUZXh0UXVhdGVybmFyeSxcbiAgICBjb2xvclRleHREaXNhYmxlZDogbWVyZ2VkVG9rZW4uY29sb3JUZXh0UXVhdGVybmFyeSxcbiAgICBjb2xvclRleHRIZWFkaW5nOiBtZXJnZWRUb2tlbi5jb2xvclRleHQsXG4gICAgY29sb3JUZXh0TGFiZWw6IG1lcmdlZFRva2VuLmNvbG9yVGV4dFNlY29uZGFyeSxcbiAgICBjb2xvclRleHREZXNjcmlwdGlvbjogbWVyZ2VkVG9rZW4uY29sb3JUZXh0VGVydGlhcnksXG4gICAgY29sb3JUZXh0TGlnaHRTb2xpZDogbWVyZ2VkVG9rZW4uY29sb3JXaGl0ZSxcbiAgICBjb2xvckhpZ2hsaWdodDogbWVyZ2VkVG9rZW4uY29sb3JFcnJvcixcbiAgICBjb2xvckJnVGV4dEhvdmVyOiBtZXJnZWRUb2tlbi5jb2xvckZpbGxTZWNvbmRhcnksXG4gICAgY29sb3JCZ1RleHRBY3RpdmU6IG1lcmdlZFRva2VuLmNvbG9yRmlsbCxcbiAgICBjb2xvckljb246IG1lcmdlZFRva2VuLmNvbG9yVGV4dFRlcnRpYXJ5LFxuICAgIGNvbG9ySWNvbkhvdmVyOiBtZXJnZWRUb2tlbi5jb2xvclRleHQsXG4gICAgY29sb3JFcnJvck91dGxpbmU6IGdldEFscGhhQ29sb3IobWVyZ2VkVG9rZW4uY29sb3JFcnJvckJnLCBtZXJnZWRUb2tlbi5jb2xvckJnQ29udGFpbmVyKSxcbiAgICBjb2xvcldhcm5pbmdPdXRsaW5lOiBnZXRBbHBoYUNvbG9yKG1lcmdlZFRva2VuLmNvbG9yV2FybmluZ0JnLCBtZXJnZWRUb2tlbi5jb2xvckJnQ29udGFpbmVyKSxcbiAgICAvLyBGb250XG4gICAgZm9udFNpemVJY29uOiBtZXJnZWRUb2tlbi5mb250U2l6ZVNNLFxuICAgIC8vIExpbmVcbiAgICBsaW5lV2lkdGhGb2N1czogbWVyZ2VkVG9rZW4ubGluZVdpZHRoICogMyxcbiAgICAvLyBDb250cm9sXG4gICAgbGluZVdpZHRoOiBtZXJnZWRUb2tlbi5saW5lV2lkdGgsXG4gICAgY29udHJvbE91dGxpbmVXaWR0aDogbWVyZ2VkVG9rZW4ubGluZVdpZHRoICogMixcbiAgICAvLyBDaGVja2JveCBzaXplIGFuZCBleHBhbmQgaWNvbiBzaXplXG4gICAgY29udHJvbEludGVyYWN0aXZlU2l6ZTogbWVyZ2VkVG9rZW4uY29udHJvbEhlaWdodCAvIDIsXG4gICAgY29udHJvbEl0ZW1CZ0hvdmVyOiBtZXJnZWRUb2tlbi5jb2xvckZpbGxUZXJ0aWFyeSxcbiAgICBjb250cm9sSXRlbUJnQWN0aXZlOiBtZXJnZWRUb2tlbi5jb2xvclByaW1hcnlCZyxcbiAgICBjb250cm9sSXRlbUJnQWN0aXZlSG92ZXI6IG1lcmdlZFRva2VuLmNvbG9yUHJpbWFyeUJnSG92ZXIsXG4gICAgY29udHJvbEl0ZW1CZ0FjdGl2ZURpc2FibGVkOiBtZXJnZWRUb2tlbi5jb2xvckZpbGwsXG4gICAgY29udHJvbFRtcE91dGxpbmU6IG1lcmdlZFRva2VuLmNvbG9yRmlsbFF1YXRlcm5hcnksXG4gICAgY29udHJvbE91dGxpbmU6IGdldEFscGhhQ29sb3IobWVyZ2VkVG9rZW4uY29sb3JQcmltYXJ5QmcsIG1lcmdlZFRva2VuLmNvbG9yQmdDb250YWluZXIpLFxuICAgIGxpbmVUeXBlOiBtZXJnZWRUb2tlbi5saW5lVHlwZSxcbiAgICBib3JkZXJSYWRpdXM6IG1lcmdlZFRva2VuLmJvcmRlclJhZGl1cyxcbiAgICBib3JkZXJSYWRpdXNYUzogbWVyZ2VkVG9rZW4uYm9yZGVyUmFkaXVzWFMsXG4gICAgYm9yZGVyUmFkaXVzU006IG1lcmdlZFRva2VuLmJvcmRlclJhZGl1c1NNLFxuICAgIGJvcmRlclJhZGl1c0xHOiBtZXJnZWRUb2tlbi5ib3JkZXJSYWRpdXNMRyxcbiAgICBmb250V2VpZ2h0U3Ryb25nOiA2MDAsXG4gICAgb3BhY2l0eUxvYWRpbmc6IDAuNjUsXG4gICAgbGlua0RlY29yYXRpb246ICdub25lJyxcbiAgICBsaW5rSG92ZXJEZWNvcmF0aW9uOiAnbm9uZScsXG4gICAgbGlua0ZvY3VzRGVjb3JhdGlvbjogJ25vbmUnLFxuICAgIGNvbnRyb2xQYWRkaW5nSG9yaXpvbnRhbDogMTIsXG4gICAgY29udHJvbFBhZGRpbmdIb3Jpem9udGFsU006IDgsXG4gICAgcGFkZGluZ1hYUzogbWVyZ2VkVG9rZW4uc2l6ZVhYUyxcbiAgICBwYWRkaW5nWFM6IG1lcmdlZFRva2VuLnNpemVYUyxcbiAgICBwYWRkaW5nU006IG1lcmdlZFRva2VuLnNpemVTTSxcbiAgICBwYWRkaW5nOiBtZXJnZWRUb2tlbi5zaXplLFxuICAgIHBhZGRpbmdNRDogbWVyZ2VkVG9rZW4uc2l6ZU1ELFxuICAgIHBhZGRpbmdMRzogbWVyZ2VkVG9rZW4uc2l6ZUxHLFxuICAgIHBhZGRpbmdYTDogbWVyZ2VkVG9rZW4uc2l6ZVhMLFxuICAgIHBhZGRpbmdDb250ZW50SG9yaXpvbnRhbExHOiBtZXJnZWRUb2tlbi5zaXplTEcsXG4gICAgcGFkZGluZ0NvbnRlbnRWZXJ0aWNhbExHOiBtZXJnZWRUb2tlbi5zaXplTVMsXG4gICAgcGFkZGluZ0NvbnRlbnRIb3Jpem9udGFsOiBtZXJnZWRUb2tlbi5zaXplTVMsXG4gICAgcGFkZGluZ0NvbnRlbnRWZXJ0aWNhbDogbWVyZ2VkVG9rZW4uc2l6ZVNNLFxuICAgIHBhZGRpbmdDb250ZW50SG9yaXpvbnRhbFNNOiBtZXJnZWRUb2tlbi5zaXplLFxuICAgIHBhZGRpbmdDb250ZW50VmVydGljYWxTTTogbWVyZ2VkVG9rZW4uc2l6ZVhTLFxuICAgIG1hcmdpblhYUzogbWVyZ2VkVG9rZW4uc2l6ZVhYUyxcbiAgICBtYXJnaW5YUzogbWVyZ2VkVG9rZW4uc2l6ZVhTLFxuICAgIG1hcmdpblNNOiBtZXJnZWRUb2tlbi5zaXplU00sXG4gICAgbWFyZ2luOiBtZXJnZWRUb2tlbi5zaXplLFxuICAgIG1hcmdpbk1EOiBtZXJnZWRUb2tlbi5zaXplTUQsXG4gICAgbWFyZ2luTEc6IG1lcmdlZFRva2VuLnNpemVMRyxcbiAgICBtYXJnaW5YTDogbWVyZ2VkVG9rZW4uc2l6ZVhMLFxuICAgIG1hcmdpblhYTDogbWVyZ2VkVG9rZW4uc2l6ZVhYTCxcbiAgICBib3hTaGFkb3c6IGBcbiAgICAgIDAgNnB4IDE2cHggMCByZ2JhKDAsIDAsIDAsIDAuMDgpLFxuICAgICAgMCAzcHggNnB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjEyKSxcbiAgICAgIDAgOXB4IDI4cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4wNSlcbiAgICBgLFxuICAgIGJveFNoYWRvd1NlY29uZGFyeTogYFxuICAgICAgMCA2cHggMTZweCAwIHJnYmEoMCwgMCwgMCwgMC4wOCksXG4gICAgICAwIDNweCA2cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMTIpLFxuICAgICAgMCA5cHggMjhweCA4cHggcmdiYSgwLCAwLCAwLCAwLjA1KVxuICAgIGAsXG4gICAgYm94U2hhZG93VGVydGlhcnk6IGBcbiAgICAgIDAgMXB4IDJweCAwIHJnYmEoMCwgMCwgMCwgMC4wMyksXG4gICAgICAwIDFweCA2cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMDIpLFxuICAgICAgMCAycHggNHB4IDAgcmdiYSgwLCAwLCAwLCAwLjAyKVxuICAgIGAsXG4gICAgc2NyZWVuWFMsXG4gICAgc2NyZWVuWFNNaW46IHNjcmVlblhTLFxuICAgIHNjcmVlblhTTWF4OiBzY3JlZW5TTSAtIDEsXG4gICAgc2NyZWVuU00sXG4gICAgc2NyZWVuU01NaW46IHNjcmVlblNNLFxuICAgIHNjcmVlblNNTWF4OiBzY3JlZW5NRCAtIDEsXG4gICAgc2NyZWVuTUQsXG4gICAgc2NyZWVuTURNaW46IHNjcmVlbk1ELFxuICAgIHNjcmVlbk1ETWF4OiBzY3JlZW5MRyAtIDEsXG4gICAgc2NyZWVuTEcsXG4gICAgc2NyZWVuTEdNaW46IHNjcmVlbkxHLFxuICAgIHNjcmVlbkxHTWF4OiBzY3JlZW5YTCAtIDEsXG4gICAgc2NyZWVuWEwsXG4gICAgc2NyZWVuWExNaW46IHNjcmVlblhMLFxuICAgIHNjcmVlblhMTWF4OiBzY3JlZW5YWEwgLSAxLFxuICAgIHNjcmVlblhYTCxcbiAgICBzY3JlZW5YWExNaW46IHNjcmVlblhYTCxcbiAgICBib3hTaGFkb3dQb3BvdmVyQXJyb3c6ICcycHggMnB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMDUpJyxcbiAgICBib3hTaGFkb3dDYXJkOiBgXG4gICAgICAwIDFweCAycHggLTJweCAke25ldyBGYXN0Q29sb3IoJ3JnYmEoMCwgMCwgMCwgMC4xNiknKS50b1JnYlN0cmluZygpfSxcbiAgICAgIDAgM3B4IDZweCAwICR7bmV3IEZhc3RDb2xvcigncmdiYSgwLCAwLCAwLCAwLjEyKScpLnRvUmdiU3RyaW5nKCl9LFxuICAgICAgMCA1cHggMTJweCA0cHggJHtuZXcgRmFzdENvbG9yKCdyZ2JhKDAsIDAsIDAsIDAuMDkpJykudG9SZ2JTdHJpbmcoKX1cbiAgICBgLFxuICAgIGJveFNoYWRvd0RyYXdlclJpZ2h0OiBgXG4gICAgICAtNnB4IDAgMTZweCAwIHJnYmEoMCwgMCwgMCwgMC4wOCksXG4gICAgICAtM3B4IDAgNnB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjEyKSxcbiAgICAgIC05cHggMCAyOHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMDUpXG4gICAgYCxcbiAgICBib3hTaGFkb3dEcmF3ZXJMZWZ0OiBgXG4gICAgICA2cHggMCAxNnB4IDAgcmdiYSgwLCAwLCAwLCAwLjA4KSxcbiAgICAgIDNweCAwIDZweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4xMiksXG4gICAgICA5cHggMCAyOHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMDUpXG4gICAgYCxcbiAgICBib3hTaGFkb3dEcmF3ZXJVcDogYFxuICAgICAgMCA2cHggMTZweCAwIHJnYmEoMCwgMCwgMCwgMC4wOCksXG4gICAgICAwIDNweCA2cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMTIpLFxuICAgICAgMCA5cHggMjhweCA4cHggcmdiYSgwLCAwLCAwLCAwLjA1KVxuICAgIGAsXG4gICAgYm94U2hhZG93RHJhd2VyRG93bjogYFxuICAgICAgMCAtNnB4IDE2cHggMCByZ2JhKDAsIDAsIDAsIDAuMDgpLFxuICAgICAgMCAtM3B4IDZweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4xMiksXG4gICAgICAwIC05cHggMjhweCA4cHggcmdiYSgwLCAwLCAwLCAwLjA1KVxuICAgIGAsXG4gICAgYm94U2hhZG93VGFic092ZXJmbG93TGVmdDogJ2luc2V0IDEwcHggMCA4cHggLThweCByZ2JhKDAsIDAsIDAsIDAuMDgpJyxcbiAgICBib3hTaGFkb3dUYWJzT3ZlcmZsb3dSaWdodDogJ2luc2V0IC0xMHB4IDAgOHB4IC04cHggcmdiYSgwLCAwLCAwLCAwLjA4KScsXG4gICAgYm94U2hhZG93VGFic092ZXJmbG93VG9wOiAnaW5zZXQgMCAxMHB4IDhweCAtOHB4IHJnYmEoMCwgMCwgMCwgMC4wOCknLFxuICAgIGJveFNoYWRvd1RhYnNPdmVyZmxvd0JvdHRvbTogJ2luc2V0IDAgLTEwcHggOHB4IC04cHggcmdiYSgwLCAwLCAwLCAwLjA4KSdcbiAgfSksIG92ZXJyaWRlVG9rZW5zKTtcbiAgcmV0dXJuIGFsaWFzVG9rZW47XG59IiwgImltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBnZW5TdHlsZVV0aWxzIH0gZnJvbSAnQGFudC1kZXNpZ24vY3NzaW5qcy11dGlscyc7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0LCBkZWZhdWx0SWNvblByZWZpeENscyB9IGZyb20gJy4uLy4uL2NvbmZpZy1wcm92aWRlci9jb250ZXh0JztcbmltcG9ydCB7IGdlbkNvbW1vblN0eWxlLCBnZW5JY29uU3R5bGUsIGdlbkxpbmtTdHlsZSB9IGZyb20gJy4uLy4uL3N0eWxlJztcbmltcG9ydCB1c2VMb2NhbFRva2VuLCB7IHVuaXRsZXNzIH0gZnJvbSAnLi4vdXNlVG9rZW4nO1xuZXhwb3J0IGNvbnN0IHtcbiAgZ2VuU3R5bGVIb29rcyxcbiAgZ2VuQ29tcG9uZW50U3R5bGVIb29rLFxuICBnZW5TdWJTdHlsZUNvbXBvbmVudFxufSA9IGdlblN0eWxlVXRpbHMoe1xuICB1c2VQcmVmaXg6ICgpID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBnZXRQcmVmaXhDbHMsXG4gICAgICBpY29uUHJlZml4Q2xzXG4gICAgfSA9IHVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCk7XG4gICAgY29uc3Qgcm9vdFByZWZpeENscyA9IGdldFByZWZpeENscygpO1xuICAgIHJldHVybiB7XG4gICAgICByb290UHJlZml4Q2xzLFxuICAgICAgaWNvblByZWZpeENsc1xuICAgIH07XG4gIH0sXG4gIHVzZVRva2VuOiAoKSA9PiB7XG4gICAgY29uc3QgW3RoZW1lLCByZWFsVG9rZW4sIGhhc2hJZCwgdG9rZW4sIGNzc1Zhcl0gPSB1c2VMb2NhbFRva2VuKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRoZW1lLFxuICAgICAgcmVhbFRva2VuLFxuICAgICAgaGFzaElkLFxuICAgICAgdG9rZW4sXG4gICAgICBjc3NWYXJcbiAgICB9O1xuICB9LFxuICB1c2VDU1A6ICgpID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBjc3BcbiAgICB9ID0gdXNlQ29udGV4dChDb25maWdDb250ZXh0KTtcbiAgICByZXR1cm4gY3NwICE9PSBudWxsICYmIGNzcCAhPT0gdm9pZCAwID8gY3NwIDoge307XG4gIH0sXG4gIGdldFJlc2V0U3R5bGVzOiAodG9rZW4sIGNvbmZpZykgPT4ge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBsaW5rU3R5bGUgPSBnZW5MaW5rU3R5bGUodG9rZW4pO1xuICAgIHJldHVybiBbbGlua1N0eWxlLCB7XG4gICAgICAnJic6IGxpbmtTdHlsZVxuICAgIH0sIGdlbkljb25TdHlsZSgoX2EgPSBjb25maWcgPT09IG51bGwgfHwgY29uZmlnID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25maWcucHJlZml4Lmljb25QcmVmaXhDbHMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGRlZmF1bHRJY29uUHJlZml4Q2xzKV07XG4gIH0sXG4gIGdldENvbW1vblN0eWxlOiBnZW5Db21tb25TdHlsZSxcbiAgZ2V0Q29tcFVuaXRsZXNzOiAoKSA9PiB1bml0bGVzc1xufSk7IiwgIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgeyB1bml0IH0gZnJvbSAnQGFudC1kZXNpZ24vY3NzaW5qcyc7XG5leHBvcnQgY29uc3QgdGV4dEVsbGlwc2lzID0ge1xuICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gIHdoaXRlU3BhY2U6ICdub3dyYXAnLFxuICB0ZXh0T3ZlcmZsb3c6ICdlbGxpcHNpcydcbn07XG5leHBvcnQgY29uc3QgcmVzZXRDb21wb25lbnQgPSBmdW5jdGlvbiAodG9rZW4pIHtcbiAgbGV0IG5lZWRJbmhlcml0Rm9udEZhbWlseSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG4gIHJldHVybiB7XG4gICAgYm94U2l6aW5nOiAnYm9yZGVyLWJveCcsXG4gICAgbWFyZ2luOiAwLFxuICAgIHBhZGRpbmc6IDAsXG4gICAgY29sb3I6IHRva2VuLmNvbG9yVGV4dCxcbiAgICBmb250U2l6ZTogdG9rZW4uZm9udFNpemUsXG4gICAgLy8gZm9udC12YXJpYW50OiBAZm9udC12YXJpYW50LWJhc2U7XG4gICAgbGluZUhlaWdodDogdG9rZW4ubGluZUhlaWdodCxcbiAgICBsaXN0U3R5bGU6ICdub25lJyxcbiAgICAvLyBmb250LWZlYXR1cmUtc2V0dGluZ3M6IEBmb250LWZlYXR1cmUtc2V0dGluZ3MtYmFzZTtcbiAgICBmb250RmFtaWx5OiBuZWVkSW5oZXJpdEZvbnRGYW1pbHkgPyAnaW5oZXJpdCcgOiB0b2tlbi5mb250RmFtaWx5XG4gIH07XG59O1xuZXhwb3J0IGNvbnN0IHJlc2V0SWNvbiA9ICgpID0+ICh7XG4gIGRpc3BsYXk6ICdpbmxpbmUtZmxleCcsXG4gIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICBjb2xvcjogJ2luaGVyaXQnLFxuICBmb250U3R5bGU6ICdub3JtYWwnLFxuICBsaW5lSGVpZ2h0OiAwLFxuICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICB0ZXh0VHJhbnNmb3JtOiAnbm9uZScsXG4gIC8vIGZvciBTVkcgaWNvbiwgc2VlIGh0dHBzOi8vYmxvZy5wcm90b3R5cHIuaW8vYWxpZ24tc3ZnLWljb25zLXRvLXRleHQtYW5kLXNheS1nb29kYnllLXRvLWZvbnQtaWNvbnMtZDQ0YjNkN2IyNmI0XG4gIHZlcnRpY2FsQWxpZ246ICctMC4xMjVlbScsXG4gIHRleHRSZW5kZXJpbmc6ICdvcHRpbWl6ZUxlZ2liaWxpdHknLFxuICAnLXdlYmtpdC1mb250LXNtb290aGluZyc6ICdhbnRpYWxpYXNlZCcsXG4gICctbW96LW9zeC1mb250LXNtb290aGluZyc6ICdncmF5c2NhbGUnLFxuICAnPiAqJzoge1xuICAgIGxpbmVIZWlnaHQ6IDFcbiAgfSxcbiAgc3ZnOiB7XG4gICAgZGlzcGxheTogJ2lubGluZS1ibG9jaydcbiAgfVxufSk7XG5leHBvcnQgY29uc3QgY2xlYXJGaXggPSAoKSA9PiAoe1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8yMTMwMSNpc3N1ZWNvbW1lbnQtNTgzOTU1MjI5XG4gICcmOjpiZWZvcmUnOiB7XG4gICAgZGlzcGxheTogJ3RhYmxlJyxcbiAgICBjb250ZW50OiAnXCJcIidcbiAgfSxcbiAgJyY6OmFmdGVyJzoge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzIxODY0XG4gICAgZGlzcGxheTogJ3RhYmxlJyxcbiAgICBjbGVhcjogJ2JvdGgnLFxuICAgIGNvbnRlbnQ6ICdcIlwiJ1xuICB9XG59KTtcbmV4cG9ydCBjb25zdCBnZW5MaW5rU3R5bGUgPSB0b2tlbiA9PiAoe1xuICBhOiB7XG4gICAgY29sb3I6IHRva2VuLmNvbG9yTGluayxcbiAgICB0ZXh0RGVjb3JhdGlvbjogdG9rZW4ubGlua0RlY29yYXRpb24sXG4gICAgYmFja2dyb3VuZENvbG9yOiAndHJhbnNwYXJlbnQnLFxuICAgIC8vIHJlbW92ZSB0aGUgZ3JheSBiYWNrZ3JvdW5kIG9uIGFjdGl2ZSBsaW5rcyBpbiBJRSAxMC5cbiAgICBvdXRsaW5lOiAnbm9uZScsXG4gICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgdHJhbnNpdGlvbjogYGNvbG9yICR7dG9rZW4ubW90aW9uRHVyYXRpb25TbG93fWAsXG4gICAgJy13ZWJraXQtdGV4dC1kZWNvcmF0aW9uLXNraXAnOiAnb2JqZWN0cycsXG4gICAgLy8gcmVtb3ZlIGdhcHMgaW4gbGlua3MgdW5kZXJsaW5lIGluIGlPUyA4KyBhbmQgU2FmYXJpIDgrLlxuICAgICcmOmhvdmVyJzoge1xuICAgICAgY29sb3I6IHRva2VuLmNvbG9yTGlua0hvdmVyXG4gICAgfSxcbiAgICAnJjphY3RpdmUnOiB7XG4gICAgICBjb2xvcjogdG9rZW4uY29sb3JMaW5rQWN0aXZlXG4gICAgfSxcbiAgICAnJjphY3RpdmUsICY6aG92ZXInOiB7XG4gICAgICB0ZXh0RGVjb3JhdGlvbjogdG9rZW4ubGlua0hvdmVyRGVjb3JhdGlvbixcbiAgICAgIG91dGxpbmU6IDBcbiAgICB9LFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzIyNTAzXG4gICAgJyY6Zm9jdXMnOiB7XG4gICAgICB0ZXh0RGVjb3JhdGlvbjogdG9rZW4ubGlua0ZvY3VzRGVjb3JhdGlvbixcbiAgICAgIG91dGxpbmU6IDBcbiAgICB9LFxuICAgICcmW2Rpc2FibGVkXSc6IHtcbiAgICAgIGNvbG9yOiB0b2tlbi5jb2xvclRleHREaXNhYmxlZCxcbiAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkJ1xuICAgIH1cbiAgfVxufSk7XG5leHBvcnQgY29uc3QgZ2VuQ29tbW9uU3R5bGUgPSAodG9rZW4sIGNvbXBvbmVudFByZWZpeENscywgcm9vdENscywgcmVzZXRGb250KSA9PiB7XG4gIGNvbnN0IHByZWZpeFNlbGVjdG9yID0gYFtjbGFzc149XCIke2NvbXBvbmVudFByZWZpeENsc31cIl0sIFtjbGFzcyo9XCIgJHtjb21wb25lbnRQcmVmaXhDbHN9XCJdYDtcbiAgY29uc3Qgcm9vdFByZWZpeFNlbGVjdG9yID0gcm9vdENscyA/IGAuJHtyb290Q2xzfWAgOiBwcmVmaXhTZWxlY3RvcjtcbiAgY29uc3QgcmVzZXRTdHlsZSA9IHtcbiAgICBib3hTaXppbmc6ICdib3JkZXItYm94JyxcbiAgICAnJjo6YmVmb3JlLCAmOjphZnRlcic6IHtcbiAgICAgIGJveFNpemluZzogJ2JvcmRlci1ib3gnXG4gICAgfVxuICB9O1xuICBsZXQgcmVzZXRGb250U3R5bGUgPSB7fTtcbiAgaWYgKHJlc2V0Rm9udCAhPT0gZmFsc2UpIHtcbiAgICByZXNldEZvbnRTdHlsZSA9IHtcbiAgICAgIGZvbnRGYW1pbHk6IHRva2VuLmZvbnRGYW1pbHksXG4gICAgICBmb250U2l6ZTogdG9rZW4uZm9udFNpemVcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgW3Jvb3RQcmVmaXhTZWxlY3Rvcl06IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXNldEZvbnRTdHlsZSksIHJlc2V0U3R5bGUpLCB7XG4gICAgICBbcHJlZml4U2VsZWN0b3JdOiByZXNldFN0eWxlXG4gICAgfSlcbiAgfTtcbn07XG5leHBvcnQgY29uc3QgZ2VuRm9jdXNPdXRsaW5lID0gKHRva2VuLCBvZmZzZXQpID0+ICh7XG4gIG91dGxpbmU6IGAke3VuaXQodG9rZW4ubGluZVdpZHRoRm9jdXMpfSBzb2xpZCAke3Rva2VuLmNvbG9yUHJpbWFyeUJvcmRlcn1gLFxuICBvdXRsaW5lT2Zmc2V0OiBvZmZzZXQgIT09IG51bGwgJiYgb2Zmc2V0ICE9PSB2b2lkIDAgPyBvZmZzZXQgOiAxLFxuICB0cmFuc2l0aW9uOiAnb3V0bGluZS1vZmZzZXQgMHMsIG91dGxpbmUgMHMnXG59KTtcbmV4cG9ydCBjb25zdCBnZW5Gb2N1c1N0eWxlID0gKHRva2VuLCBvZmZzZXQpID0+ICh7XG4gICcmOmZvY3VzLXZpc2libGUnOiBPYmplY3QuYXNzaWduKHt9LCBnZW5Gb2N1c091dGxpbmUodG9rZW4sIG9mZnNldCkpXG59KTtcbmV4cG9ydCBjb25zdCBnZW5JY29uU3R5bGUgPSBpY29uUHJlZml4Q2xzID0+ICh7XG4gIFtgLiR7aWNvblByZWZpeENsc31gXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXNldEljb24oKSksIHtcbiAgICBbYC4ke2ljb25QcmVmaXhDbHN9IC4ke2ljb25QcmVmaXhDbHN9LWljb25gXToge1xuICAgICAgZGlzcGxheTogJ2Jsb2NrJ1xuICAgIH1cbiAgfSlcbn0pO1xuZXhwb3J0IGNvbnN0IG9wZXJhdGlvblVuaXQgPSB0b2tlbiA9PiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe1xuICAvLyBGSVhNRTogVGhpcyB1c2UgbGluayBidXQgaXMgYSBvcGVyYXRpb24gdW5pdC4gU2VlbXMgc2hvdWxkIGJlIGEgY29sb3JQcmltYXJ5LlxuICAvLyBBbmQgVHlwb2dyYXBoeSB1c2UgdGhpcyB0byBnZW5lcmF0ZSBsaW5rIHN0eWxlIHdoaWNoIHNob3VsZCBub3QgZG8gdGhpcy5cbiAgY29sb3I6IHRva2VuLmNvbG9yTGluayxcbiAgdGV4dERlY29yYXRpb246IHRva2VuLmxpbmtEZWNvcmF0aW9uLFxuICBvdXRsaW5lOiAnbm9uZScsXG4gIGN1cnNvcjogJ3BvaW50ZXInLFxuICB0cmFuc2l0aW9uOiBgYWxsICR7dG9rZW4ubW90aW9uRHVyYXRpb25TbG93fWAsXG4gIGJvcmRlcjogMCxcbiAgcGFkZGluZzogMCxcbiAgYmFja2dyb3VuZDogJ25vbmUnLFxuICB1c2VyU2VsZWN0OiAnbm9uZSdcbn0sIGdlbkZvY3VzU3R5bGUodG9rZW4pKSwge1xuICAnJjpmb2N1cywgJjpob3Zlcic6IHtcbiAgICBjb2xvcjogdG9rZW4uY29sb3JMaW5rSG92ZXJcbiAgfSxcbiAgJyY6YWN0aXZlJzoge1xuICAgIGNvbG9yOiB0b2tlbi5jb2xvckxpbmtBY3RpdmVcbiAgfVxufSk7IiwgImltcG9ydCB7IFByZXNldENvbG9ycyB9IGZyb20gJy4uL2ludGVyZmFjZSc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZW5QcmVzZXRDb2xvcih0b2tlbiwgZ2VuQ3NzKSB7XG4gIHJldHVybiBQcmVzZXRDb2xvcnMucmVkdWNlKChwcmV2LCBjb2xvcktleSkgPT4ge1xuICAgIGNvbnN0IGxpZ2h0Q29sb3IgPSB0b2tlbltgJHtjb2xvcktleX0xYF07XG4gICAgY29uc3QgbGlnaHRCb3JkZXJDb2xvciA9IHRva2VuW2Ake2NvbG9yS2V5fTNgXTtcbiAgICBjb25zdCBkYXJrQ29sb3IgPSB0b2tlbltgJHtjb2xvcktleX02YF07XG4gICAgY29uc3QgdGV4dENvbG9yID0gdG9rZW5bYCR7Y29sb3JLZXl9N2BdO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZXYpLCBnZW5Dc3MoY29sb3JLZXksIHtcbiAgICAgIGxpZ2h0Q29sb3IsXG4gICAgICBsaWdodEJvcmRlckNvbG9yLFxuICAgICAgZGFya0NvbG9yLFxuICAgICAgdGV4dENvbG9yXG4gICAgfSkpO1xuICB9LCB7fSk7XG59IiwgImltcG9ydCB7IHVzZVN0eWxlUmVnaXN0ZXIgfSBmcm9tICdAYW50LWRlc2lnbi9jc3NpbmpzJztcbmltcG9ydCB7IGdlbkljb25TdHlsZSB9IGZyb20gJy4uLy4uL3N0eWxlJztcbmltcG9ydCB1c2VUb2tlbiBmcm9tICcuLi91c2VUb2tlbic7XG5jb25zdCB1c2VSZXNldEljb25TdHlsZSA9IChpY29uUHJlZml4Q2xzLCBjc3ApID0+IHtcbiAgY29uc3QgW3RoZW1lLCB0b2tlbl0gPSB1c2VUb2tlbigpO1xuICAvLyBHZW5lcmF0ZSBzdHlsZSBmb3IgaWNvbnNcbiAgcmV0dXJuIHVzZVN0eWxlUmVnaXN0ZXIoe1xuICAgIHRoZW1lLFxuICAgIHRva2VuLFxuICAgIGhhc2hJZDogJycsXG4gICAgcGF0aDogWydhbnQtZGVzaWduLWljb25zJywgaWNvblByZWZpeENsc10sXG4gICAgbm9uY2U6ICgpID0+IGNzcCA9PT0gbnVsbCB8fCBjc3AgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNzcC5ub25jZSxcbiAgICBsYXllcjoge1xuICAgICAgbmFtZTogJ2FudGQnXG4gICAgfVxuICB9LCAoKSA9PiBbZ2VuSWNvblN0eWxlKGljb25QcmVmaXhDbHMpXSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgdXNlUmVzZXRJY29uU3R5bGU7IiwgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmNvbnN0IGZ1bGxDbG9uZSA9IE9iamVjdC5hc3NpZ24oe30sIFJlYWN0KTtcbmNvbnN0IHtcbiAgdXNlSWRcbn0gPSBmdWxsQ2xvbmU7XG5jb25zdCB1c2VFbXB0eUlkID0gKCkgPT4gJyc7XG5jb25zdCB1c2VUaGVtZUtleSA9IHR5cGVvZiB1c2VJZCA9PT0gJ3VuZGVmaW5lZCcgPyB1c2VFbXB0eUlkIDogdXNlSWQ7XG5leHBvcnQgZGVmYXVsdCB1c2VUaGVtZUtleTsiLCAiaW1wb3J0IHVzZU1lbW8gZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlTWVtb1wiO1xuaW1wb3J0IGlzRXF1YWwgZnJvbSBcInJjLXV0aWwvZXMvaXNFcXVhbFwiO1xuaW1wb3J0IHsgZGV2VXNlV2FybmluZyB9IGZyb20gJy4uLy4uL191dGlsL3dhcm5pbmcnO1xuaW1wb3J0IHsgZGVmYXVsdENvbmZpZyB9IGZyb20gJy4uLy4uL3RoZW1lL2ludGVybmFsJztcbmltcG9ydCB1c2VUaGVtZUtleSBmcm9tICcuL3VzZVRoZW1lS2V5JztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVRoZW1lKHRoZW1lLCBwYXJlbnRUaGVtZSwgY29uZmlnKSB7XG4gIHZhciBfYSwgX2I7XG4gIGNvbnN0IHdhcm5pbmcgPSBkZXZVc2VXYXJuaW5nKCdDb25maWdQcm92aWRlcicpO1xuICBjb25zdCB0aGVtZUNvbmZpZyA9IHRoZW1lIHx8IHt9O1xuICBjb25zdCBwYXJlbnRUaGVtZUNvbmZpZyA9IHRoZW1lQ29uZmlnLmluaGVyaXQgPT09IGZhbHNlIHx8ICFwYXJlbnRUaGVtZSA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdENvbmZpZyksIHtcbiAgICBoYXNoZWQ6IChfYSA9IHBhcmVudFRoZW1lID09PSBudWxsIHx8IHBhcmVudFRoZW1lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJlbnRUaGVtZS5oYXNoZWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGRlZmF1bHRDb25maWcuaGFzaGVkLFxuICAgIGNzc1ZhcjogcGFyZW50VGhlbWUgPT09IG51bGwgfHwgcGFyZW50VGhlbWUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmVudFRoZW1lLmNzc1ZhclxuICB9KSA6IHBhcmVudFRoZW1lO1xuICBjb25zdCB0aGVtZUtleSA9IHVzZVRoZW1lS2V5KCk7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgY29uc3QgY3NzVmFyRW5hYmxlZCA9IHRoZW1lQ29uZmlnLmNzc1ZhciB8fCBwYXJlbnRUaGVtZUNvbmZpZy5jc3NWYXI7XG4gICAgY29uc3QgdmFsaWRLZXkgPSAhISh0eXBlb2YgdGhlbWVDb25maWcuY3NzVmFyID09PSAnb2JqZWN0JyAmJiAoKF9iID0gdGhlbWVDb25maWcuY3NzVmFyKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Iua2V5KSB8fCB0aGVtZUtleSk7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyghY3NzVmFyRW5hYmxlZCB8fCB2YWxpZEtleSwgJ2JyZWFraW5nJywgJ01pc3Npbmcga2V5IGluIGBjc3NWYXJgIGNvbmZpZy4gUGxlYXNlIHVwZ3JhZGUgdG8gUmVhY3QgMTggb3Igc2V0IGBjc3NWYXIua2V5YCBtYW51YWxseSBpbiBlYWNoIENvbmZpZ1Byb3ZpZGVyIGluc2lkZSBgY3NzVmFyYCBlbmFibGVkIENvbmZpZ1Byb3ZpZGVyLicpIDogdm9pZCAwO1xuICB9XG4gIHJldHVybiB1c2VNZW1vKCgpID0+IHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIGlmICghdGhlbWUpIHtcbiAgICAgIHJldHVybiBwYXJlbnRUaGVtZTtcbiAgICB9XG4gICAgLy8gT3ZlcnJpZGVcbiAgICBjb25zdCBtZXJnZWRDb21wb25lbnRzID0gT2JqZWN0LmFzc2lnbih7fSwgcGFyZW50VGhlbWVDb25maWcuY29tcG9uZW50cyk7XG4gICAgT2JqZWN0LmtleXModGhlbWUuY29tcG9uZW50cyB8fCB7fSkuZm9yRWFjaChjb21wb25lbnROYW1lID0+IHtcbiAgICAgIG1lcmdlZENvbXBvbmVudHNbY29tcG9uZW50TmFtZV0gPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG1lcmdlZENvbXBvbmVudHNbY29tcG9uZW50TmFtZV0pLCB0aGVtZS5jb21wb25lbnRzW2NvbXBvbmVudE5hbWVdKTtcbiAgICB9KTtcbiAgICBjb25zdCBjc3NWYXJLZXkgPSBgY3NzLXZhci0ke3RoZW1lS2V5LnJlcGxhY2UoLzovZywgJycpfWA7XG4gICAgY29uc3QgbWVyZ2VkQ3NzVmFyID0gKChfYSA9IHRoZW1lQ29uZmlnLmNzc1ZhcikgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogcGFyZW50VGhlbWVDb25maWcuY3NzVmFyKSAmJiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7XG4gICAgICBwcmVmaXg6IGNvbmZpZyA9PT0gbnVsbCB8fCBjb25maWcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmZpZy5wcmVmaXhDbHNcbiAgICB9LCB0eXBlb2YgcGFyZW50VGhlbWVDb25maWcuY3NzVmFyID09PSAnb2JqZWN0JyA/IHBhcmVudFRoZW1lQ29uZmlnLmNzc1ZhciA6IHt9KSwgdHlwZW9mIHRoZW1lQ29uZmlnLmNzc1ZhciA9PT0gJ29iamVjdCcgPyB0aGVtZUNvbmZpZy5jc3NWYXIgOiB7fSksIHtcbiAgICAgIGtleTogdHlwZW9mIHRoZW1lQ29uZmlnLmNzc1ZhciA9PT0gJ29iamVjdCcgJiYgKChfYiA9IHRoZW1lQ29uZmlnLmNzc1ZhcikgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmtleSkgfHwgY3NzVmFyS2V5XG4gICAgfSk7XG4gICAgLy8gQmFzZSB0b2tlblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcGFyZW50VGhlbWVDb25maWcpLCB0aGVtZUNvbmZpZyksIHtcbiAgICAgIHRva2VuOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHBhcmVudFRoZW1lQ29uZmlnLnRva2VuKSwgdGhlbWVDb25maWcudG9rZW4pLFxuICAgICAgY29tcG9uZW50czogbWVyZ2VkQ29tcG9uZW50cyxcbiAgICAgIGNzc1ZhcjogbWVyZ2VkQ3NzVmFyXG4gICAgfSk7XG4gIH0sIFt0aGVtZUNvbmZpZywgcGFyZW50VGhlbWVDb25maWddLCAocHJldiwgbmV4dCkgPT4gcHJldi5zb21lKChwcmV2VGhlbWUsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgbmV4dFRoZW1lID0gbmV4dFtpbmRleF07XG4gICAgcmV0dXJuICFpc0VxdWFsKHByZXZUaGVtZSwgbmV4dFRoZW1lLCB0cnVlKTtcbiAgfSkpO1xufSIsICJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgUHJvdmlkZXIgYXMgTW90aW9uUHJvdmlkZXIgfSBmcm9tICdyYy1tb3Rpb24nO1xuaW1wb3J0IHsgdXNlVG9rZW4gfSBmcm9tICcuLi90aGVtZS9pbnRlcm5hbCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNb3Rpb25XcmFwcGVyKHByb3BzKSB7XG4gIGNvbnN0IHtcbiAgICBjaGlsZHJlblxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IFssIHRva2VuXSA9IHVzZVRva2VuKCk7XG4gIGNvbnN0IHtcbiAgICBtb3Rpb25cbiAgfSA9IHRva2VuO1xuICBjb25zdCBuZWVkV3JhcE1vdGlvblByb3ZpZGVyUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgbmVlZFdyYXBNb3Rpb25Qcm92aWRlclJlZi5jdXJyZW50ID0gbmVlZFdyYXBNb3Rpb25Qcm92aWRlclJlZi5jdXJyZW50IHx8IG1vdGlvbiA9PT0gZmFsc2U7XG4gIGlmIChuZWVkV3JhcE1vdGlvblByb3ZpZGVyUmVmLmN1cnJlbnQpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTW90aW9uUHJvdmlkZXIsIHtcbiAgICAgIG1vdGlvbjogbW90aW9uXG4gICAgfSwgY2hpbGRyZW4pO1xuICB9XG4gIHJldHVybiBjaGlsZHJlbjtcbn0iLCAiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0L2RlZmF1bHQtcHJvcHMtbWF0Y2gtcHJvcC10eXBlcywgcmVhY3Qvbm8tbXVsdGktY29tcCwgcmVhY3QvcHJvcC10eXBlcyAqL1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgZmluZERPTU5vZGUgZnJvbSBcInJjLXV0aWwvZXMvRG9tL2ZpbmRET01Ob2RlXCI7XG5pbXBvcnQgeyBmaWxsUmVmLCBnZXROb2RlUmVmLCBzdXBwb3J0UmVmIH0gZnJvbSBcInJjLXV0aWwvZXMvcmVmXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIi4vY29udGV4dFwiO1xuaW1wb3J0IERvbVdyYXBwZXIgZnJvbSBcIi4vRG9tV3JhcHBlclwiO1xuaW1wb3J0IHVzZVN0YXR1cyBmcm9tIFwiLi9ob29rcy91c2VTdGF0dXNcIjtcbmltcG9ydCB7IGlzQWN0aXZlIH0gZnJvbSBcIi4vaG9va3MvdXNlU3RlcFF1ZXVlXCI7XG5pbXBvcnQgeyBTVEFUVVNfTk9ORSwgU1RFUF9QUkVQQVJFLCBTVEVQX1NUQVJUIH0gZnJvbSBcIi4vaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBnZXRUcmFuc2l0aW9uTmFtZSwgc3VwcG9ydFRyYW5zaXRpb24gfSBmcm9tIFwiLi91dGlsL21vdGlvblwiO1xuLyoqXG4gKiBgdHJhbnNpdGlvblN1cHBvcnRgIGlzIHVzZWQgZm9yIG5vbmUgdHJhbnNpdGlvbiB0ZXN0IGNhc2UuXG4gKiBEZWZhdWx0IHdlIHVzZSBicm93c2VyIHRyYW5zaXRpb24gZXZlbnQgc3VwcG9ydCBjaGVjay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbkNTU01vdGlvbihjb25maWcpIHtcbiAgdmFyIHRyYW5zaXRpb25TdXBwb3J0ID0gY29uZmlnO1xuICBpZiAoX3R5cGVvZihjb25maWcpID09PSAnb2JqZWN0Jykge1xuICAgIHRyYW5zaXRpb25TdXBwb3J0ID0gY29uZmlnLnRyYW5zaXRpb25TdXBwb3J0O1xuICB9XG4gIGZ1bmN0aW9uIGlzU3VwcG9ydFRyYW5zaXRpb24ocHJvcHMsIGNvbnRleHRNb3Rpb24pIHtcbiAgICByZXR1cm4gISEocHJvcHMubW90aW9uTmFtZSAmJiB0cmFuc2l0aW9uU3VwcG9ydCAmJiBjb250ZXh0TW90aW9uICE9PSBmYWxzZSk7XG4gIH1cbiAgdmFyIENTU01vdGlvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gICAgdmFyIF9wcm9wcyR2aXNpYmxlID0gcHJvcHMudmlzaWJsZSxcbiAgICAgIHZpc2libGUgPSBfcHJvcHMkdmlzaWJsZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyR2aXNpYmxlLFxuICAgICAgX3Byb3BzJHJlbW92ZU9uTGVhdmUgPSBwcm9wcy5yZW1vdmVPbkxlYXZlLFxuICAgICAgcmVtb3ZlT25MZWF2ZSA9IF9wcm9wcyRyZW1vdmVPbkxlYXZlID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJHJlbW92ZU9uTGVhdmUsXG4gICAgICBmb3JjZVJlbmRlciA9IHByb3BzLmZvcmNlUmVuZGVyLFxuICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIG1vdGlvbk5hbWUgPSBwcm9wcy5tb3Rpb25OYW1lLFxuICAgICAgbGVhdmVkQ2xhc3NOYW1lID0gcHJvcHMubGVhdmVkQ2xhc3NOYW1lLFxuICAgICAgZXZlbnRQcm9wcyA9IHByb3BzLmV2ZW50UHJvcHM7XG4gICAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb250ZXh0KSxcbiAgICAgIGNvbnRleHRNb3Rpb24gPSBfUmVhY3QkdXNlQ29udGV4dC5tb3Rpb247XG4gICAgdmFyIHN1cHBvcnRNb3Rpb24gPSBpc1N1cHBvcnRUcmFuc2l0aW9uKHByb3BzLCBjb250ZXh0TW90aW9uKTtcblxuICAgIC8vIFJlZiB0byB0aGUgcmVhY3Qgbm9kZSwgaXQgbWF5IGJlIGEgSFRNTEVsZW1lbnRcbiAgICB2YXIgbm9kZVJlZiA9IHVzZVJlZigpO1xuICAgIC8vIFJlZiB0byB0aGUgZG9tIHdyYXBwZXIgaW4gY2FzZSByZWYgY2FuIG5vdCBwYXNzIHRvIEhUTUxFbGVtZW50XG4gICAgdmFyIHdyYXBwZXJOb2RlUmVmID0gdXNlUmVmKCk7XG4gICAgZnVuY3Rpb24gZ2V0RG9tRWxlbWVudCgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEhlcmUgd2UncmUgYXZvaWRpbmcgY2FsbCBmb3IgZmluZERPTU5vZGUgc2luY2UgaXQncyBkZXByZWNhdGVkXG4gICAgICAgIC8vIGluIHN0cmljdCBtb2RlLiBXZSdyZSBjYWxsaW5nIGl0IG9ubHkgd2hlbiBub2RlIHJlZiBpcyBub3RcbiAgICAgICAgLy8gYW4gaW5zdGFuY2Ugb2YgRE9NIEhUTUxFbGVtZW50LiBPdGhlcndpc2UgdXNlXG4gICAgICAgIC8vIGZpbmRET01Ob2RlIGFzIGEgZmluYWwgcmVzb3J0XG4gICAgICAgIHJldHVybiBub2RlUmVmLmN1cnJlbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/IG5vZGVSZWYuY3VycmVudCA6IGZpbmRET01Ob2RlKHdyYXBwZXJOb2RlUmVmLmN1cnJlbnQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBPbmx5IGhhcHBlbiB3aGVuIGBtb3Rpb25EZWFkbGluZWAgdHJpZ2dlciBidXQgZWxlbWVudCByZW1vdmVkLlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIF91c2VTdGF0dXMgPSB1c2VTdGF0dXMoc3VwcG9ydE1vdGlvbiwgdmlzaWJsZSwgZ2V0RG9tRWxlbWVudCwgcHJvcHMpLFxuICAgICAgX3VzZVN0YXR1czIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdHVzLCA0KSxcbiAgICAgIHN0YXR1cyA9IF91c2VTdGF0dXMyWzBdLFxuICAgICAgc3RhdHVzU3RlcCA9IF91c2VTdGF0dXMyWzFdLFxuICAgICAgc3RhdHVzU3R5bGUgPSBfdXNlU3RhdHVzMlsyXSxcbiAgICAgIG1lcmdlZFZpc2libGUgPSBfdXNlU3RhdHVzMlszXTtcblxuICAgIC8vIFJlY29yZCB3aGV0aGVyIGNvbnRlbnQgaGFzIHJlbmRlcmVkXG4gICAgLy8gV2lsbCByZXR1cm4gbnVsbCBmb3IgdW4tcmVuZGVyZWQgZXZlbiB3aGVuIGByZW1vdmVPbkxlYXZlPXtmYWxzZX1gXG4gICAgdmFyIHJlbmRlcmVkUmVmID0gUmVhY3QudXNlUmVmKG1lcmdlZFZpc2libGUpO1xuICAgIGlmIChtZXJnZWRWaXNpYmxlKSB7XG4gICAgICByZW5kZXJlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09IFJlZnMgPT09PT09PT09PT09PT09PT09PT09PVxuICAgIHZhciBzZXROb2RlUmVmID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIG5vZGVSZWYuY3VycmVudCA9IG5vZGU7XG4gICAgICBmaWxsUmVmKHJlZiwgbm9kZSk7XG4gICAgfSwgW3JlZl0pO1xuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT1cbiAgICB2YXIgbW90aW9uQ2hpbGRyZW47XG4gICAgdmFyIG1lcmdlZFByb3BzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBldmVudFByb3BzKSwge30sIHtcbiAgICAgIHZpc2libGU6IHZpc2libGVcbiAgICB9KTtcbiAgICBpZiAoIWNoaWxkcmVuKSB7XG4gICAgICAvLyBObyBjaGlsZHJlblxuICAgICAgbW90aW9uQ2hpbGRyZW4gPSBudWxsO1xuICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSBTVEFUVVNfTk9ORSkge1xuICAgICAgLy8gU3RhYmxlIGNoaWxkcmVuXG4gICAgICBpZiAobWVyZ2VkVmlzaWJsZSkge1xuICAgICAgICBtb3Rpb25DaGlsZHJlbiA9IGNoaWxkcmVuKF9vYmplY3RTcHJlYWQoe30sIG1lcmdlZFByb3BzKSwgc2V0Tm9kZVJlZik7XG4gICAgICB9IGVsc2UgaWYgKCFyZW1vdmVPbkxlYXZlICYmIHJlbmRlcmVkUmVmLmN1cnJlbnQgJiYgbGVhdmVkQ2xhc3NOYW1lKSB7XG4gICAgICAgIG1vdGlvbkNoaWxkcmVuID0gY2hpbGRyZW4oX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBtZXJnZWRQcm9wcyksIHt9LCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBsZWF2ZWRDbGFzc05hbWVcbiAgICAgICAgfSksIHNldE5vZGVSZWYpO1xuICAgICAgfSBlbHNlIGlmIChmb3JjZVJlbmRlciB8fCAhcmVtb3ZlT25MZWF2ZSAmJiAhbGVhdmVkQ2xhc3NOYW1lKSB7XG4gICAgICAgIG1vdGlvbkNoaWxkcmVuID0gY2hpbGRyZW4oX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBtZXJnZWRQcm9wcyksIHt9LCB7XG4gICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIGRpc3BsYXk6ICdub25lJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSksIHNldE5vZGVSZWYpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbW90aW9uQ2hpbGRyZW4gPSBudWxsO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJbiBtb3Rpb25cbiAgICAgIHZhciBzdGF0dXNTdWZmaXg7XG4gICAgICBpZiAoc3RhdHVzU3RlcCA9PT0gU1RFUF9QUkVQQVJFKSB7XG4gICAgICAgIHN0YXR1c1N1ZmZpeCA9ICdwcmVwYXJlJztcbiAgICAgIH0gZWxzZSBpZiAoaXNBY3RpdmUoc3RhdHVzU3RlcCkpIHtcbiAgICAgICAgc3RhdHVzU3VmZml4ID0gJ2FjdGl2ZSc7XG4gICAgICB9IGVsc2UgaWYgKHN0YXR1c1N0ZXAgPT09IFNURVBfU1RBUlQpIHtcbiAgICAgICAgc3RhdHVzU3VmZml4ID0gJ3N0YXJ0JztcbiAgICAgIH1cbiAgICAgIHZhciBtb3Rpb25DbHMgPSBnZXRUcmFuc2l0aW9uTmFtZShtb3Rpb25OYW1lLCBcIlwiLmNvbmNhdChzdGF0dXMsIFwiLVwiKS5jb25jYXQoc3RhdHVzU3VmZml4KSk7XG4gICAgICBtb3Rpb25DaGlsZHJlbiA9IGNoaWxkcmVuKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgbWVyZ2VkUHJvcHMpLCB7fSwge1xuICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoZ2V0VHJhbnNpdGlvbk5hbWUobW90aW9uTmFtZSwgc3RhdHVzKSwgX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eSh7fSwgbW90aW9uQ2xzLCBtb3Rpb25DbHMgJiYgc3RhdHVzU3VmZml4KSwgbW90aW9uTmFtZSwgdHlwZW9mIG1vdGlvbk5hbWUgPT09ICdzdHJpbmcnKSksXG4gICAgICAgIHN0eWxlOiBzdGF0dXNTdHlsZVxuICAgICAgfSksIHNldE5vZGVSZWYpO1xuICAgIH1cblxuICAgIC8vIEF1dG8gaW5qZWN0IHJlZiBpZiBjaGlsZCBub2RlIG5vdCBoYXZlIGByZWZgIHByb3BzXG4gICAgaWYgKCAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQobW90aW9uQ2hpbGRyZW4pICYmIHN1cHBvcnRSZWYobW90aW9uQ2hpbGRyZW4pKSB7XG4gICAgICB2YXIgb3JpZ2luTm9kZVJlZiA9IGdldE5vZGVSZWYobW90aW9uQ2hpbGRyZW4pO1xuICAgICAgaWYgKCFvcmlnaW5Ob2RlUmVmKSB7XG4gICAgICAgIG1vdGlvbkNoaWxkcmVuID0gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChtb3Rpb25DaGlsZHJlbiwge1xuICAgICAgICAgIHJlZjogc2V0Tm9kZVJlZlxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERvbVdyYXBwZXIsIHtcbiAgICAgIHJlZjogd3JhcHBlck5vZGVSZWZcbiAgICB9LCBtb3Rpb25DaGlsZHJlbik7XG4gIH0pO1xuICBDU1NNb3Rpb24uZGlzcGxheU5hbWUgPSAnQ1NTTW90aW9uJztcbiAgcmV0dXJuIENTU01vdGlvbjtcbn1cbmV4cG9ydCBkZWZhdWx0IGdlbkNTU01vdGlvbihzdXBwb3J0VHJhbnNpdGlvbik7IiwgImltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiY2hpbGRyZW5cIl07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5leHBvcnQgdmFyIENvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh7fSk7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNb3Rpb25Qcm92aWRlcihfcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZiwgX2V4Y2x1ZGVkKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogcHJvcHNcbiAgfSwgY2hpbGRyZW4pO1xufSIsICJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzXCI7XG5pbXBvcnQgX2NyZWF0ZVN1cGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVTdXBlclwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xudmFyIERvbVdyYXBwZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKERvbVdyYXBwZXIsIF9SZWFjdCRDb21wb25lbnQpO1xuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKERvbVdyYXBwZXIpO1xuICBmdW5jdGlvbiBEb21XcmFwcGVyKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBEb21XcmFwcGVyKTtcbiAgICByZXR1cm4gX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cbiAgX2NyZWF0ZUNsYXNzKERvbVdyYXBwZXIsIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbjtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIERvbVdyYXBwZXI7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5leHBvcnQgZGVmYXVsdCBEb21XcmFwcGVyOyIsICJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VFdmVudCBmcm9tIFwiLi91c2VFdmVudFwiO1xuLyoqXG4gKiBTYW1lIGFzIFJlYWN0LnVzZVN0YXRlIGJ1dCB3aWxsIGFsd2F5cyBnZXQgbGF0ZXN0IHN0YXRlLlxuICogVGhpcyBpcyB1c2VmdWwgd2hlbiBSZWFjdCBtZXJnZSBtdWx0aXBsZSBzdGF0ZSB1cGRhdGVzIGludG8gb25lLlxuICogZS5nLiBvblRyYW5zaXRpb25FbmQgdHJpZ2dlciBtdWx0aXBsZSBldmVudCBhdCBvbmNlIHdpbGwgYmUgbWVyZ2VkIHN0YXRlIHVwZGF0ZSBpbiBSZWFjdC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlU3luY1N0YXRlKGRlZmF1bHRWYWx1ZSkge1xuICB2YXIgX1JlYWN0JHVzZVJlZHVjZXIgPSBSZWFjdC51c2VSZWR1Y2VyKGZ1bmN0aW9uICh4KSB7XG4gICAgICByZXR1cm4geCArIDE7XG4gICAgfSwgMCksXG4gICAgX1JlYWN0JHVzZVJlZHVjZXIyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVJlZHVjZXIsIDIpLFxuICAgIGZvcmNlVXBkYXRlID0gX1JlYWN0JHVzZVJlZHVjZXIyWzFdO1xuICB2YXIgY3VycmVudFZhbHVlUmVmID0gUmVhY3QudXNlUmVmKGRlZmF1bHRWYWx1ZSk7XG4gIHZhciBnZXRWYWx1ZSA9IHVzZUV2ZW50KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gY3VycmVudFZhbHVlUmVmLmN1cnJlbnQ7XG4gIH0pO1xuICB2YXIgc2V0VmFsdWUgPSB1c2VFdmVudChmdW5jdGlvbiAodXBkYXRlcikge1xuICAgIGN1cnJlbnRWYWx1ZVJlZi5jdXJyZW50ID0gdHlwZW9mIHVwZGF0ZXIgPT09ICdmdW5jdGlvbicgPyB1cGRhdGVyKGN1cnJlbnRWYWx1ZVJlZi5jdXJyZW50KSA6IHVwZGF0ZXI7XG4gICAgZm9yY2VVcGRhdGUoKTtcbiAgfSk7XG4gIHJldHVybiBbZ2V0VmFsdWUsIHNldFZhbHVlXTtcbn0iLCAiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCB7IHVzZUV2ZW50IH0gZnJvbSAncmMtdXRpbCc7XG5pbXBvcnQgdXNlU3RhdGUgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlU3RhdGVcIjtcbmltcG9ydCB1c2VTeW5jU3RhdGUgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlU3luY1N0YXRlXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFNUQVRVU19BUFBFQVIsIFNUQVRVU19FTlRFUiwgU1RBVFVTX0xFQVZFLCBTVEFUVVNfTk9ORSwgU1RFUF9BQ1RJVkUsIFNURVBfUFJFUEFSRSwgU1RFUF9QUkVQQVJFRCwgU1RFUF9TVEFSVCB9IGZyb20gXCIuLi9pbnRlcmZhY2VcIjtcbmltcG9ydCB1c2VEb21Nb3Rpb25FdmVudHMgZnJvbSBcIi4vdXNlRG9tTW90aW9uRXZlbnRzXCI7XG5pbXBvcnQgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCBmcm9tIFwiLi91c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0XCI7XG5pbXBvcnQgdXNlU3RlcFF1ZXVlLCB7IERvU3RlcCwgaXNBY3RpdmUsIFNraXBTdGVwIH0gZnJvbSBcIi4vdXNlU3RlcFF1ZXVlXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VTdGF0dXMoc3VwcG9ydE1vdGlvbiwgdmlzaWJsZSwgZ2V0RWxlbWVudCwgX3JlZikge1xuICB2YXIgX3JlZiRtb3Rpb25FbnRlciA9IF9yZWYubW90aW9uRW50ZXIsXG4gICAgbW90aW9uRW50ZXIgPSBfcmVmJG1vdGlvbkVudGVyID09PSB2b2lkIDAgPyB0cnVlIDogX3JlZiRtb3Rpb25FbnRlcixcbiAgICBfcmVmJG1vdGlvbkFwcGVhciA9IF9yZWYubW90aW9uQXBwZWFyLFxuICAgIG1vdGlvbkFwcGVhciA9IF9yZWYkbW90aW9uQXBwZWFyID09PSB2b2lkIDAgPyB0cnVlIDogX3JlZiRtb3Rpb25BcHBlYXIsXG4gICAgX3JlZiRtb3Rpb25MZWF2ZSA9IF9yZWYubW90aW9uTGVhdmUsXG4gICAgbW90aW9uTGVhdmUgPSBfcmVmJG1vdGlvbkxlYXZlID09PSB2b2lkIDAgPyB0cnVlIDogX3JlZiRtb3Rpb25MZWF2ZSxcbiAgICBtb3Rpb25EZWFkbGluZSA9IF9yZWYubW90aW9uRGVhZGxpbmUsXG4gICAgbW90aW9uTGVhdmVJbW1lZGlhdGVseSA9IF9yZWYubW90aW9uTGVhdmVJbW1lZGlhdGVseSxcbiAgICBvbkFwcGVhclByZXBhcmUgPSBfcmVmLm9uQXBwZWFyUHJlcGFyZSxcbiAgICBvbkVudGVyUHJlcGFyZSA9IF9yZWYub25FbnRlclByZXBhcmUsXG4gICAgb25MZWF2ZVByZXBhcmUgPSBfcmVmLm9uTGVhdmVQcmVwYXJlLFxuICAgIG9uQXBwZWFyU3RhcnQgPSBfcmVmLm9uQXBwZWFyU3RhcnQsXG4gICAgb25FbnRlclN0YXJ0ID0gX3JlZi5vbkVudGVyU3RhcnQsXG4gICAgb25MZWF2ZVN0YXJ0ID0gX3JlZi5vbkxlYXZlU3RhcnQsXG4gICAgb25BcHBlYXJBY3RpdmUgPSBfcmVmLm9uQXBwZWFyQWN0aXZlLFxuICAgIG9uRW50ZXJBY3RpdmUgPSBfcmVmLm9uRW50ZXJBY3RpdmUsXG4gICAgb25MZWF2ZUFjdGl2ZSA9IF9yZWYub25MZWF2ZUFjdGl2ZSxcbiAgICBvbkFwcGVhckVuZCA9IF9yZWYub25BcHBlYXJFbmQsXG4gICAgb25FbnRlckVuZCA9IF9yZWYub25FbnRlckVuZCxcbiAgICBvbkxlYXZlRW5kID0gX3JlZi5vbkxlYXZlRW5kLFxuICAgIG9uVmlzaWJsZUNoYW5nZWQgPSBfcmVmLm9uVmlzaWJsZUNoYW5nZWQ7XG4gIC8vIFVzZWQgZm9yIG91dGVyIHJlbmRlciB1c2FnZSB0byBhdm9pZCBgdmlzaWJsZTogZmFsc2UgJiBzdGF0dXM6IG5vbmVgIHRvIHJlbmRlciBub3RoaW5nXG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZSgpLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIGFzeW5jVmlzaWJsZSA9IF91c2VTdGF0ZTJbMF0sXG4gICAgc2V0QXN5bmNWaXNpYmxlID0gX3VzZVN0YXRlMlsxXTtcbiAgdmFyIF91c2VTeW5jU3RhdGUgPSB1c2VTeW5jU3RhdGUoU1RBVFVTX05PTkUpLFxuICAgIF91c2VTeW5jU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN5bmNTdGF0ZSwgMiksXG4gICAgZ2V0U3RhdHVzID0gX3VzZVN5bmNTdGF0ZTJbMF0sXG4gICAgc2V0U3RhdHVzID0gX3VzZVN5bmNTdGF0ZTJbMV07XG4gIHZhciBfdXNlU3RhdGUzID0gdXNlU3RhdGUobnVsbCksXG4gICAgX3VzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZTMsIDIpLFxuICAgIHN0eWxlID0gX3VzZVN0YXRlNFswXSxcbiAgICBzZXRTdHlsZSA9IF91c2VTdGF0ZTRbMV07XG4gIHZhciBjdXJyZW50U3RhdHVzID0gZ2V0U3RhdHVzKCk7XG4gIHZhciBtb3VudGVkUmVmID0gdXNlUmVmKGZhbHNlKTtcbiAgdmFyIGRlYWRsaW5lUmVmID0gdXNlUmVmKG51bGwpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBEb20gTm9kZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgZnVuY3Rpb24gZ2V0RG9tRWxlbWVudCgpIHtcbiAgICByZXR1cm4gZ2V0RWxlbWVudCgpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gTW90aW9uIEVuZCA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgYWN0aXZlUmVmID0gdXNlUmVmKGZhbHNlKTtcblxuICAvKipcbiAgICogQ2xlYW4gdXAgc3RhdHVzICYgc3R5bGVcbiAgICovXG4gIGZ1bmN0aW9uIHVwZGF0ZU1vdGlvbkVuZFN0YXR1cygpIHtcbiAgICBzZXRTdGF0dXMoU1RBVFVTX05PTkUpO1xuICAgIHNldFN0eWxlKG51bGwsIHRydWUpO1xuICB9XG4gIHZhciBvbkludGVybmFsTW90aW9uRW5kID0gdXNlRXZlbnQoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgdmFyIHN0YXR1cyA9IGdldFN0YXR1cygpO1xuICAgIC8vIERvIG5vdGhpbmcgc2luY2Ugbm90IGluIGFueSB0cmFuc2l0aW9uIHN0YXR1cy5cbiAgICAvLyBUaGlzIG1heSBoYXBwZW4gd2hlbiBgbW90aW9uRGVhZGxpbmVgIHRyaWdnZXIuXG4gICAgaWYgKHN0YXR1cyA9PT0gU1RBVFVTX05PTkUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGVsZW1lbnQgPSBnZXREb21FbGVtZW50KCk7XG4gICAgaWYgKGV2ZW50ICYmICFldmVudC5kZWFkbGluZSAmJiBldmVudC50YXJnZXQgIT09IGVsZW1lbnQpIHtcbiAgICAgIC8vIGV2ZW50IGV4aXN0c1xuICAgICAgLy8gbm90IGluaXRpYXRlZCBieSBkZWFkbGluZVxuICAgICAgLy8gdHJhbnNpdGlvbkVuZCBub3QgZmlyZWQgYnkgaW5uZXIgZWxlbWVudHNcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGN1cnJlbnRBY3RpdmUgPSBhY3RpdmVSZWYuY3VycmVudDtcbiAgICB2YXIgY2FuRW5kO1xuICAgIGlmIChzdGF0dXMgPT09IFNUQVRVU19BUFBFQVIgJiYgY3VycmVudEFjdGl2ZSkge1xuICAgICAgY2FuRW5kID0gb25BcHBlYXJFbmQgPT09IG51bGwgfHwgb25BcHBlYXJFbmQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQXBwZWFyRW5kKGVsZW1lbnQsIGV2ZW50KTtcbiAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gU1RBVFVTX0VOVEVSICYmIGN1cnJlbnRBY3RpdmUpIHtcbiAgICAgIGNhbkVuZCA9IG9uRW50ZXJFbmQgPT09IG51bGwgfHwgb25FbnRlckVuZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FbnRlckVuZChlbGVtZW50LCBldmVudCk7XG4gICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IFNUQVRVU19MRUFWRSAmJiBjdXJyZW50QWN0aXZlKSB7XG4gICAgICBjYW5FbmQgPSBvbkxlYXZlRW5kID09PSBudWxsIHx8IG9uTGVhdmVFbmQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uTGVhdmVFbmQoZWxlbWVudCwgZXZlbnQpO1xuICAgIH1cblxuICAgIC8vIE9ubHkgdXBkYXRlIHN0YXR1cyB3aGVuIGBjYW5FbmRgIGFuZCBub3QgZGVzdHJveWVkXG4gICAgaWYgKGN1cnJlbnRBY3RpdmUgJiYgY2FuRW5kICE9PSBmYWxzZSkge1xuICAgICAgdXBkYXRlTW90aW9uRW5kU3RhdHVzKCk7XG4gICAgfVxuICB9KTtcbiAgdmFyIF91c2VEb21Nb3Rpb25FdmVudHMgPSB1c2VEb21Nb3Rpb25FdmVudHMob25JbnRlcm5hbE1vdGlvbkVuZCksXG4gICAgX3VzZURvbU1vdGlvbkV2ZW50czIgPSBfc2xpY2VkVG9BcnJheShfdXNlRG9tTW90aW9uRXZlbnRzLCAxKSxcbiAgICBwYXRjaE1vdGlvbkV2ZW50cyA9IF91c2VEb21Nb3Rpb25FdmVudHMyWzBdO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFN0ZXAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGdldEV2ZW50SGFuZGxlcnMgPSBmdW5jdGlvbiBnZXRFdmVudEhhbmRsZXJzKHRhcmdldFN0YXR1cykge1xuICAgIHN3aXRjaCAodGFyZ2V0U3RhdHVzKSB7XG4gICAgICBjYXNlIFNUQVRVU19BUFBFQVI6XG4gICAgICAgIHJldHVybiBfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eSh7fSwgU1RFUF9QUkVQQVJFLCBvbkFwcGVhclByZXBhcmUpLCBTVEVQX1NUQVJULCBvbkFwcGVhclN0YXJ0KSwgU1RFUF9BQ1RJVkUsIG9uQXBwZWFyQWN0aXZlKTtcbiAgICAgIGNhc2UgU1RBVFVTX0VOVEVSOlxuICAgICAgICByZXR1cm4gX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoe30sIFNURVBfUFJFUEFSRSwgb25FbnRlclByZXBhcmUpLCBTVEVQX1NUQVJULCBvbkVudGVyU3RhcnQpLCBTVEVQX0FDVElWRSwgb25FbnRlckFjdGl2ZSk7XG4gICAgICBjYXNlIFNUQVRVU19MRUFWRTpcbiAgICAgICAgcmV0dXJuIF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KHt9LCBTVEVQX1BSRVBBUkUsIG9uTGVhdmVQcmVwYXJlKSwgU1RFUF9TVEFSVCwgb25MZWF2ZVN0YXJ0KSwgU1RFUF9BQ1RJVkUsIG9uTGVhdmVBY3RpdmUpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgfTtcbiAgdmFyIGV2ZW50SGFuZGxlcnMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZ2V0RXZlbnRIYW5kbGVycyhjdXJyZW50U3RhdHVzKTtcbiAgfSwgW2N1cnJlbnRTdGF0dXNdKTtcbiAgdmFyIF91c2VTdGVwUXVldWUgPSB1c2VTdGVwUXVldWUoY3VycmVudFN0YXR1cywgIXN1cHBvcnRNb3Rpb24sIGZ1bmN0aW9uIChuZXdTdGVwKSB7XG4gICAgICAvLyBPbmx5IHByZXBhcmUgc3RlcCBjYW4gYmUgc2tpcFxuICAgICAgaWYgKG5ld1N0ZXAgPT09IFNURVBfUFJFUEFSRSkge1xuICAgICAgICB2YXIgb25QcmVwYXJlID0gZXZlbnRIYW5kbGVyc1tTVEVQX1BSRVBBUkVdO1xuICAgICAgICBpZiAoIW9uUHJlcGFyZSkge1xuICAgICAgICAgIHJldHVybiBTa2lwU3RlcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb25QcmVwYXJlKGdldERvbUVsZW1lbnQoKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlc3Qgc3RlcCBpcyBzeW5jIHVwZGF0ZVxuICAgICAgaWYgKHN0ZXAgaW4gZXZlbnRIYW5kbGVycykge1xuICAgICAgICB2YXIgX2V2ZW50SGFuZGxlcnMkc3RlcDtcbiAgICAgICAgc2V0U3R5bGUoKChfZXZlbnRIYW5kbGVycyRzdGVwID0gZXZlbnRIYW5kbGVyc1tzdGVwXSkgPT09IG51bGwgfHwgX2V2ZW50SGFuZGxlcnMkc3RlcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2V2ZW50SGFuZGxlcnMkc3RlcC5jYWxsKGV2ZW50SGFuZGxlcnMsIGdldERvbUVsZW1lbnQoKSwgbnVsbCkpIHx8IG51bGwpO1xuICAgICAgfVxuICAgICAgaWYgKHN0ZXAgPT09IFNURVBfQUNUSVZFICYmIGN1cnJlbnRTdGF0dXMgIT09IFNUQVRVU19OT05FKSB7XG4gICAgICAgIC8vIFBhdGNoIGV2ZW50cyB3aGVuIG1vdGlvbiBuZWVkZWRcbiAgICAgICAgcGF0Y2hNb3Rpb25FdmVudHMoZ2V0RG9tRWxlbWVudCgpKTtcbiAgICAgICAgaWYgKG1vdGlvbkRlYWRsaW5lID4gMCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dChkZWFkbGluZVJlZi5jdXJyZW50KTtcbiAgICAgICAgICBkZWFkbGluZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBvbkludGVybmFsTW90aW9uRW5kKHtcbiAgICAgICAgICAgICAgZGVhZGxpbmU6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sIG1vdGlvbkRlYWRsaW5lKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHN0ZXAgPT09IFNURVBfUFJFUEFSRUQpIHtcbiAgICAgICAgdXBkYXRlTW90aW9uRW5kU3RhdHVzKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gRG9TdGVwO1xuICAgIH0pLFxuICAgIF91c2VTdGVwUXVldWUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0ZXBRdWV1ZSwgMiksXG4gICAgc3RhcnRTdGVwID0gX3VzZVN0ZXBRdWV1ZTJbMF0sXG4gICAgc3RlcCA9IF91c2VTdGVwUXVldWUyWzFdO1xuICB2YXIgYWN0aXZlID0gaXNBY3RpdmUoc3RlcCk7XG4gIGFjdGl2ZVJlZi5jdXJyZW50ID0gYWN0aXZlO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU3RhdHVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHZpc2libGVSZWYgPSB1c2VSZWYobnVsbCk7XG5cbiAgLy8gVXBkYXRlIHdpdGggbmV3IHN0YXR1c1xuICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAvLyBXaGVuIHVzZSBTdXNwZW5zZSwgdGhlIGB2aXNpYmxlYCB3aWxsIHJlcGVhdCB0cmlnZ2VyLFxuICAgIC8vIEJ1dCBub3QgcmVhbCBjaGFuZ2Ugb2YgdGhlIGB2aXNpYmxlYCwgd2UgbmVlZCB0byBza2lwIGl0LlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzQ0Mzc5XG4gICAgaWYgKG1vdW50ZWRSZWYuY3VycmVudCAmJiB2aXNpYmxlUmVmLmN1cnJlbnQgPT09IHZpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2V0QXN5bmNWaXNpYmxlKHZpc2libGUpO1xuICAgIHZhciBpc01vdW50ZWQgPSBtb3VudGVkUmVmLmN1cnJlbnQ7XG4gICAgbW91bnRlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcblxuICAgIC8vIGlmICghc3VwcG9ydE1vdGlvbikge1xuICAgIC8vICAgcmV0dXJuO1xuICAgIC8vIH1cblxuICAgIHZhciBuZXh0U3RhdHVzO1xuXG4gICAgLy8gQXBwZWFyXG4gICAgaWYgKCFpc01vdW50ZWQgJiYgdmlzaWJsZSAmJiBtb3Rpb25BcHBlYXIpIHtcbiAgICAgIG5leHRTdGF0dXMgPSBTVEFUVVNfQVBQRUFSO1xuICAgIH1cblxuICAgIC8vIEVudGVyXG4gICAgaWYgKGlzTW91bnRlZCAmJiB2aXNpYmxlICYmIG1vdGlvbkVudGVyKSB7XG4gICAgICBuZXh0U3RhdHVzID0gU1RBVFVTX0VOVEVSO1xuICAgIH1cblxuICAgIC8vIExlYXZlXG4gICAgaWYgKGlzTW91bnRlZCAmJiAhdmlzaWJsZSAmJiBtb3Rpb25MZWF2ZSB8fCAhaXNNb3VudGVkICYmIG1vdGlvbkxlYXZlSW1tZWRpYXRlbHkgJiYgIXZpc2libGUgJiYgbW90aW9uTGVhdmUpIHtcbiAgICAgIG5leHRTdGF0dXMgPSBTVEFUVVNfTEVBVkU7XG4gICAgfVxuICAgIHZhciBuZXh0RXZlbnRIYW5kbGVycyA9IGdldEV2ZW50SGFuZGxlcnMobmV4dFN0YXR1cyk7XG5cbiAgICAvLyBVcGRhdGUgdG8gbmV4dCBzdGF0dXNcbiAgICBpZiAobmV4dFN0YXR1cyAmJiAoc3VwcG9ydE1vdGlvbiB8fCBuZXh0RXZlbnRIYW5kbGVyc1tTVEVQX1BSRVBBUkVdKSkge1xuICAgICAgc2V0U3RhdHVzKG5leHRTdGF0dXMpO1xuICAgICAgc3RhcnRTdGVwKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNldCBiYWNrIGluIGNhc2Ugbm8gbW90aW9uIGJ1dCBwcmV2IHN0YXR1cyBoYXMgcHJlcGFyZSBzdGVwXG4gICAgICBzZXRTdGF0dXMoU1RBVFVTX05PTkUpO1xuICAgIH1cbiAgICB2aXNpYmxlUmVmLmN1cnJlbnQgPSB2aXNpYmxlO1xuICB9LCBbdmlzaWJsZV0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRWZmZWN0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUmVzZXQgd2hlbiBtb3Rpb24gY2hhbmdlZFxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChcbiAgICAvLyBDYW5jZWwgYXBwZWFyXG4gICAgY3VycmVudFN0YXR1cyA9PT0gU1RBVFVTX0FQUEVBUiAmJiAhbW90aW9uQXBwZWFyIHx8XG4gICAgLy8gQ2FuY2VsIGVudGVyXG4gICAgY3VycmVudFN0YXR1cyA9PT0gU1RBVFVTX0VOVEVSICYmICFtb3Rpb25FbnRlciB8fFxuICAgIC8vIENhbmNlbCBsZWF2ZVxuICAgIGN1cnJlbnRTdGF0dXMgPT09IFNUQVRVU19MRUFWRSAmJiAhbW90aW9uTGVhdmUpIHtcbiAgICAgIHNldFN0YXR1cyhTVEFUVVNfTk9ORSk7XG4gICAgfVxuICB9LCBbbW90aW9uQXBwZWFyLCBtb3Rpb25FbnRlciwgbW90aW9uTGVhdmVdKTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgbW91bnRlZFJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICBjbGVhclRpbWVvdXQoZGVhZGxpbmVSZWYuY3VycmVudCk7XG4gICAgfTtcbiAgfSwgW10pO1xuXG4gIC8vIFRyaWdnZXIgYG9uVmlzaWJsZUNoYW5nZWRgXG4gIHZhciBmaXJzdE1vdW50Q2hhbmdlUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAvLyBbdmlzaWJsZSAmIG1vdGlvbiBub3QgZW5kXSA9PiBbIXZpc2libGUgJiBtb3Rpb24gZW5kXSBzdGlsbCBuZWVkIHRyaWdnZXIgb25WaXNpYmxlQ2hhbmdlZFxuICAgIGlmIChhc3luY1Zpc2libGUpIHtcbiAgICAgIGZpcnN0TW91bnRDaGFuZ2VSZWYuY3VycmVudCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChhc3luY1Zpc2libGUgIT09IHVuZGVmaW5lZCAmJiBjdXJyZW50U3RhdHVzID09PSBTVEFUVVNfTk9ORSkge1xuICAgICAgLy8gU2tpcCBmaXJzdCByZW5kZXIgaXMgaW52aXNpYmxlIHNpbmNlIGl0J3Mgbm90aGluZyBjaGFuZ2VkXG4gICAgICBpZiAoZmlyc3RNb3VudENoYW5nZVJlZi5jdXJyZW50IHx8IGFzeW5jVmlzaWJsZSkge1xuICAgICAgICBvblZpc2libGVDaGFuZ2VkID09PSBudWxsIHx8IG9uVmlzaWJsZUNoYW5nZWQgPT09IHZvaWQgMCB8fCBvblZpc2libGVDaGFuZ2VkKGFzeW5jVmlzaWJsZSk7XG4gICAgICB9XG4gICAgICBmaXJzdE1vdW50Q2hhbmdlUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgIH1cbiAgfSwgW2FzeW5jVmlzaWJsZSwgY3VycmVudFN0YXR1c10pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU3R5bGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG1lcmdlZFN0eWxlID0gc3R5bGU7XG4gIGlmIChldmVudEhhbmRsZXJzW1NURVBfUFJFUEFSRV0gJiYgc3RlcCA9PT0gU1RFUF9TVEFSVCkge1xuICAgIG1lcmdlZFN0eWxlID0gX29iamVjdFNwcmVhZCh7XG4gICAgICB0cmFuc2l0aW9uOiAnbm9uZSdcbiAgICB9LCBtZXJnZWRTdHlsZSk7XG4gIH1cbiAgcmV0dXJuIFtjdXJyZW50U3RhdHVzLCBzdGVwLCBtZXJnZWRTdHlsZSwgYXN5bmNWaXNpYmxlICE9PSBudWxsICYmIGFzeW5jVmlzaWJsZSAhPT0gdm9pZCAwID8gYXN5bmNWaXNpYmxlIDogdmlzaWJsZV07XG59IiwgImV4cG9ydCB2YXIgU1RBVFVTX05PTkUgPSAnbm9uZSc7XG5leHBvcnQgdmFyIFNUQVRVU19BUFBFQVIgPSAnYXBwZWFyJztcbmV4cG9ydCB2YXIgU1RBVFVTX0VOVEVSID0gJ2VudGVyJztcbmV4cG9ydCB2YXIgU1RBVFVTX0xFQVZFID0gJ2xlYXZlJztcbmV4cG9ydCB2YXIgU1RFUF9OT05FID0gJ25vbmUnO1xuZXhwb3J0IHZhciBTVEVQX1BSRVBBUkUgPSAncHJlcGFyZSc7XG5leHBvcnQgdmFyIFNURVBfU1RBUlQgPSAnc3RhcnQnO1xuZXhwb3J0IHZhciBTVEVQX0FDVElWRSA9ICdhY3RpdmUnO1xuZXhwb3J0IHZhciBTVEVQX0FDVElWQVRFRCA9ICdlbmQnO1xuLyoqXG4gKiBVc2VkIGZvciBkaXNhYmxlZCBtb3Rpb24gY2FzZS5cbiAqIFByZXBhcmUgc3RhZ2Ugd2lsbCBzdGlsbCB3b3JrIGJ1dCBzdGFydCAmIGFjdGl2ZSB3aWxsIGJlIHNraXBwZWQuXG4gKi9cbmV4cG9ydCB2YXIgU1RFUF9QUkVQQVJFRCA9ICdwcmVwYXJlZCc7IiwgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGFuaW1hdGlvbkVuZE5hbWUsIHRyYW5zaXRpb25FbmROYW1lIH0gZnJvbSBcIi4uL3V0aWwvbW90aW9uXCI7XG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gKG9uSW50ZXJuYWxNb3Rpb25FbmQpIHtcbiAgdmFyIGNhY2hlRWxlbWVudFJlZiA9IHVzZVJlZigpO1xuXG4gIC8vIFJlbW92ZSBldmVudHNcbiAgZnVuY3Rpb24gcmVtb3ZlTW90aW9uRXZlbnRzKGVsZW1lbnQpIHtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHRyYW5zaXRpb25FbmROYW1lLCBvbkludGVybmFsTW90aW9uRW5kKTtcbiAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihhbmltYXRpb25FbmROYW1lLCBvbkludGVybmFsTW90aW9uRW5kKTtcbiAgICB9XG4gIH1cblxuICAvLyBQYXRjaCBldmVudHNcbiAgZnVuY3Rpb24gcGF0Y2hNb3Rpb25FdmVudHMoZWxlbWVudCkge1xuICAgIGlmIChjYWNoZUVsZW1lbnRSZWYuY3VycmVudCAmJiBjYWNoZUVsZW1lbnRSZWYuY3VycmVudCAhPT0gZWxlbWVudCkge1xuICAgICAgcmVtb3ZlTW90aW9uRXZlbnRzKGNhY2hlRWxlbWVudFJlZi5jdXJyZW50KTtcbiAgICB9XG4gICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudCAhPT0gY2FjaGVFbGVtZW50UmVmLmN1cnJlbnQpIHtcbiAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0cmFuc2l0aW9uRW5kTmFtZSwgb25JbnRlcm5hbE1vdGlvbkVuZCk7XG4gICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoYW5pbWF0aW9uRW5kTmFtZSwgb25JbnRlcm5hbE1vdGlvbkVuZCk7XG5cbiAgICAgIC8vIFNhdmUgYXMgY2FjaGUgaW4gY2FzZSBkb20gcmVtb3ZlZCB0cmlnZ2VyIGJ5IGBtb3Rpb25EZWFkbGluZWBcbiAgICAgIGNhY2hlRWxlbWVudFJlZi5jdXJyZW50ID0gZWxlbWVudDtcbiAgICB9XG4gIH1cblxuICAvLyBDbGVhbiB1cCB3aGVuIHJlbW92ZWRcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmVtb3ZlTW90aW9uRXZlbnRzKGNhY2hlRWxlbWVudFJlZi5jdXJyZW50KTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIHJldHVybiBbcGF0Y2hNb3Rpb25FdmVudHMsIHJlbW92ZU1vdGlvbkV2ZW50c107XG59KTsiLCAiaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IGNhblVzZURPTSBmcm9tIFwicmMtdXRpbC9lcy9Eb20vY2FuVXNlRG9tXCI7XG4vLyA9PT09PT09PT09PT09PT09PSBUcmFuc2l0aW9uID09PT09PT09PT09PT09PT09XG4vLyBFdmVudCB3cmFwcGVyLiBDb3B5IGZyb20gcmVhY3Qgc291cmNlIGNvZGVcbmZ1bmN0aW9uIG1ha2VQcmVmaXhNYXAoc3R5bGVQcm9wLCBldmVudE5hbWUpIHtcbiAgdmFyIHByZWZpeGVzID0ge307XG4gIHByZWZpeGVzW3N0eWxlUHJvcC50b0xvd2VyQ2FzZSgpXSA9IGV2ZW50TmFtZS50b0xvd2VyQ2FzZSgpO1xuICBwcmVmaXhlc1tcIldlYmtpdFwiLmNvbmNhdChzdHlsZVByb3ApXSA9IFwid2Via2l0XCIuY29uY2F0KGV2ZW50TmFtZSk7XG4gIHByZWZpeGVzW1wiTW96XCIuY29uY2F0KHN0eWxlUHJvcCldID0gXCJtb3pcIi5jb25jYXQoZXZlbnROYW1lKTtcbiAgcHJlZml4ZXNbXCJtc1wiLmNvbmNhdChzdHlsZVByb3ApXSA9IFwiTVNcIi5jb25jYXQoZXZlbnROYW1lKTtcbiAgcHJlZml4ZXNbXCJPXCIuY29uY2F0KHN0eWxlUHJvcCldID0gXCJvXCIuY29uY2F0KGV2ZW50TmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgcmV0dXJuIHByZWZpeGVzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFZlbmRvclByZWZpeGVzKGRvbVN1cHBvcnQsIHdpbikge1xuICB2YXIgcHJlZml4ZXMgPSB7XG4gICAgYW5pbWF0aW9uZW5kOiBtYWtlUHJlZml4TWFwKCdBbmltYXRpb24nLCAnQW5pbWF0aW9uRW5kJyksXG4gICAgdHJhbnNpdGlvbmVuZDogbWFrZVByZWZpeE1hcCgnVHJhbnNpdGlvbicsICdUcmFuc2l0aW9uRW5kJylcbiAgfTtcbiAgaWYgKGRvbVN1cHBvcnQpIHtcbiAgICBpZiAoISgnQW5pbWF0aW9uRXZlbnQnIGluIHdpbikpIHtcbiAgICAgIGRlbGV0ZSBwcmVmaXhlcy5hbmltYXRpb25lbmQuYW5pbWF0aW9uO1xuICAgIH1cbiAgICBpZiAoISgnVHJhbnNpdGlvbkV2ZW50JyBpbiB3aW4pKSB7XG4gICAgICBkZWxldGUgcHJlZml4ZXMudHJhbnNpdGlvbmVuZC50cmFuc2l0aW9uO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcHJlZml4ZXM7XG59XG52YXIgdmVuZG9yUHJlZml4ZXMgPSBnZXRWZW5kb3JQcmVmaXhlcyhjYW5Vc2VET00oKSwgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB7fSk7XG52YXIgc3R5bGUgPSB7fTtcbmlmIChjYW5Vc2VET00oKSkge1xuICB2YXIgX2RvY3VtZW50JGNyZWF0ZUVsZW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHN0eWxlID0gX2RvY3VtZW50JGNyZWF0ZUVsZW1lLnN0eWxlO1xufVxudmFyIHByZWZpeGVkRXZlbnROYW1lcyA9IHt9O1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKGV2ZW50TmFtZSkge1xuICBpZiAocHJlZml4ZWRFdmVudE5hbWVzW2V2ZW50TmFtZV0pIHtcbiAgICByZXR1cm4gcHJlZml4ZWRFdmVudE5hbWVzW2V2ZW50TmFtZV07XG4gIH1cbiAgdmFyIHByZWZpeE1hcCA9IHZlbmRvclByZWZpeGVzW2V2ZW50TmFtZV07XG4gIGlmIChwcmVmaXhNYXApIHtcbiAgICB2YXIgc3R5bGVQcm9wTGlzdCA9IE9iamVjdC5rZXlzKHByZWZpeE1hcCk7XG4gICAgdmFyIGxlbiA9IHN0eWxlUHJvcExpc3QubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgIHZhciBzdHlsZVByb3AgPSBzdHlsZVByb3BMaXN0W2ldO1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwcmVmaXhNYXAsIHN0eWxlUHJvcCkgJiYgc3R5bGVQcm9wIGluIHN0eWxlKSB7XG4gICAgICAgIHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdID0gcHJlZml4TWFwW3N0eWxlUHJvcF07XG4gICAgICAgIHJldHVybiBwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuICcnO1xufVxudmFyIGludGVybmFsQW5pbWF0aW9uRW5kTmFtZSA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCdhbmltYXRpb25lbmQnKTtcbnZhciBpbnRlcm5hbFRyYW5zaXRpb25FbmROYW1lID0gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoJ3RyYW5zaXRpb25lbmQnKTtcbmV4cG9ydCB2YXIgc3VwcG9ydFRyYW5zaXRpb24gPSAhIShpbnRlcm5hbEFuaW1hdGlvbkVuZE5hbWUgJiYgaW50ZXJuYWxUcmFuc2l0aW9uRW5kTmFtZSk7XG5leHBvcnQgdmFyIGFuaW1hdGlvbkVuZE5hbWUgPSBpbnRlcm5hbEFuaW1hdGlvbkVuZE5hbWUgfHwgJ2FuaW1hdGlvbmVuZCc7XG5leHBvcnQgdmFyIHRyYW5zaXRpb25FbmROYW1lID0gaW50ZXJuYWxUcmFuc2l0aW9uRW5kTmFtZSB8fCAndHJhbnNpdGlvbmVuZCc7XG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJhbnNpdGlvbk5hbWUodHJhbnNpdGlvbk5hbWUsIHRyYW5zaXRpb25UeXBlKSB7XG4gIGlmICghdHJhbnNpdGlvbk5hbWUpIHJldHVybiBudWxsO1xuICBpZiAoX3R5cGVvZih0cmFuc2l0aW9uTmFtZSkgPT09ICdvYmplY3QnKSB7XG4gICAgdmFyIHR5cGUgPSB0cmFuc2l0aW9uVHlwZS5yZXBsYWNlKC8tXFx3L2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgcmV0dXJuIG1hdGNoWzFdLnRvVXBwZXJDYXNlKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRyYW5zaXRpb25OYW1lW3R5cGVdO1xuICB9XG4gIHJldHVybiBcIlwiLmNvbmNhdCh0cmFuc2l0aW9uTmFtZSwgXCItXCIpLmNvbmNhdCh0cmFuc2l0aW9uVHlwZSk7XG59IiwgImltcG9ydCBjYW5Vc2VEb20gZnJvbSBcInJjLXV0aWwvZXMvRG9tL2NhblVzZURvbVwiO1xuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VMYXlvdXRFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5cbi8vIEl0J3Mgc2FmZSB0byB1c2UgYHVzZUxheW91dEVmZmVjdGAgYnV0IHRoZSB3YXJuaW5nIGlzIGFubm95aW5nXG52YXIgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCA9IGNhblVzZURvbSgpID8gdXNlTGF5b3V0RWZmZWN0IDogdXNlRWZmZWN0O1xuZXhwb3J0IGRlZmF1bHQgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdDsiLCAiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgdXNlU3RhdGUgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlU3RhdGVcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFNURVBfQUNUSVZBVEVELCBTVEVQX0FDVElWRSwgU1RFUF9OT05FLCBTVEVQX1BSRVBBUkUsIFNURVBfUFJFUEFSRUQsIFNURVBfU1RBUlQgfSBmcm9tIFwiLi4vaW50ZXJmYWNlXCI7XG5pbXBvcnQgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCBmcm9tIFwiLi91c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0XCI7XG5pbXBvcnQgdXNlTmV4dEZyYW1lIGZyb20gXCIuL3VzZU5leHRGcmFtZVwiO1xudmFyIEZVTExfU1RFUF9RVUVVRSA9IFtTVEVQX1BSRVBBUkUsIFNURVBfU1RBUlQsIFNURVBfQUNUSVZFLCBTVEVQX0FDVElWQVRFRF07XG52YXIgU0lNUExFX1NURVBfUVVFVUUgPSBbU1RFUF9QUkVQQVJFLCBTVEVQX1BSRVBBUkVEXTtcblxuLyoqIFNraXAgY3VycmVudCBzdGVwICovXG5leHBvcnQgdmFyIFNraXBTdGVwID0gZmFsc2U7XG4vKiogQ3VycmVudCBzdGVwIHNob3VsZCBiZSB1cGRhdGUgaW4gKi9cbmV4cG9ydCB2YXIgRG9TdGVwID0gdHJ1ZTtcbmV4cG9ydCBmdW5jdGlvbiBpc0FjdGl2ZShzdGVwKSB7XG4gIHJldHVybiBzdGVwID09PSBTVEVQX0FDVElWRSB8fCBzdGVwID09PSBTVEVQX0FDVElWQVRFRDtcbn1cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAoc3RhdHVzLCBwcmVwYXJlT25seSwgY2FsbGJhY2spIHtcbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKFNURVBfTk9ORSksXG4gICAgX3VzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZSwgMiksXG4gICAgc3RlcCA9IF91c2VTdGF0ZTJbMF0sXG4gICAgc2V0U3RlcCA9IF91c2VTdGF0ZTJbMV07XG4gIHZhciBfdXNlTmV4dEZyYW1lID0gdXNlTmV4dEZyYW1lKCksXG4gICAgX3VzZU5leHRGcmFtZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlTmV4dEZyYW1lLCAyKSxcbiAgICBuZXh0RnJhbWUgPSBfdXNlTmV4dEZyYW1lMlswXSxcbiAgICBjYW5jZWxOZXh0RnJhbWUgPSBfdXNlTmV4dEZyYW1lMlsxXTtcbiAgZnVuY3Rpb24gc3RhcnRRdWV1ZSgpIHtcbiAgICBzZXRTdGVwKFNURVBfUFJFUEFSRSwgdHJ1ZSk7XG4gIH1cbiAgdmFyIFNURVBfUVVFVUUgPSBwcmVwYXJlT25seSA/IFNJTVBMRV9TVEVQX1FVRVVFIDogRlVMTF9TVEVQX1FVRVVFO1xuICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoc3RlcCAhPT0gU1RFUF9OT05FICYmIHN0ZXAgIT09IFNURVBfQUNUSVZBVEVEKSB7XG4gICAgICB2YXIgaW5kZXggPSBTVEVQX1FVRVVFLmluZGV4T2Yoc3RlcCk7XG4gICAgICB2YXIgbmV4dFN0ZXAgPSBTVEVQX1FVRVVFW2luZGV4ICsgMV07XG4gICAgICB2YXIgcmVzdWx0ID0gY2FsbGJhY2soc3RlcCk7XG4gICAgICBpZiAocmVzdWx0ID09PSBTa2lwU3RlcCkge1xuICAgICAgICAvLyBTa2lwIHdoZW4gbm8gbmVlZGVkXG4gICAgICAgIHNldFN0ZXAobmV4dFN0ZXAsIHRydWUpO1xuICAgICAgfSBlbHNlIGlmIChuZXh0U3RlcCkge1xuICAgICAgICAvLyBEbyBhcyBmcmFtZSBmb3Igc3RlcCB1cGRhdGVcbiAgICAgICAgbmV4dEZyYW1lKGZ1bmN0aW9uIChpbmZvKSB7XG4gICAgICAgICAgZnVuY3Rpb24gZG9OZXh0KCkge1xuICAgICAgICAgICAgLy8gU2tpcCBzaW5jZSBjdXJyZW50IHF1ZXVlIGlzIG9vZFxuICAgICAgICAgICAgaWYgKGluZm8uaXNDYW5jZWxlZCgpKSByZXR1cm47XG4gICAgICAgICAgICBzZXRTdGVwKG5leHRTdGVwLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgZG9OZXh0KCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE9ubHkgcHJvbWlzZSBzaG91bGQgYmUgYXN5bmNcbiAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4oZG9OZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSwgW3N0YXR1cywgc3RlcF0pO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBjYW5jZWxOZXh0RnJhbWUoKTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIHJldHVybiBbc3RhcnRRdWV1ZSwgc3RlcF07XG59KTsiLCAiaW1wb3J0IHJhZiBmcm9tIFwicmMtdXRpbC9lcy9yYWZcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAoKSB7XG4gIHZhciBuZXh0RnJhbWVSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIGZ1bmN0aW9uIGNhbmNlbE5leHRGcmFtZSgpIHtcbiAgICByYWYuY2FuY2VsKG5leHRGcmFtZVJlZi5jdXJyZW50KTtcbiAgfVxuICBmdW5jdGlvbiBuZXh0RnJhbWUoY2FsbGJhY2spIHtcbiAgICB2YXIgZGVsYXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDI7XG4gICAgY2FuY2VsTmV4dEZyYW1lKCk7XG4gICAgdmFyIG5leHRGcmFtZUlkID0gcmFmKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChkZWxheSA8PSAxKSB7XG4gICAgICAgIGNhbGxiYWNrKHtcbiAgICAgICAgICBpc0NhbmNlbGVkOiBmdW5jdGlvbiBpc0NhbmNlbGVkKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5leHRGcmFtZUlkICE9PSBuZXh0RnJhbWVSZWYuY3VycmVudDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dEZyYW1lKGNhbGxiYWNrLCBkZWxheSAtIDEpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIG5leHRGcmFtZVJlZi5jdXJyZW50ID0gbmV4dEZyYW1lSWQ7XG4gIH1cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgY2FuY2VsTmV4dEZyYW1lKCk7XG4gICAgfTtcbiAgfSwgW10pO1xuICByZXR1cm4gW25leHRGcmFtZSwgY2FuY2VsTmV4dEZyYW1lXTtcbn0pOyIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2Fzc2VydFRoaXNJbml0aWFsaXplZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXNzZXJ0VGhpc0luaXRpYWxpemVkXCI7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c1wiO1xuaW1wb3J0IF9jcmVhdGVTdXBlciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlU3VwZXJcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiY29tcG9uZW50XCIsIFwiY2hpbGRyZW5cIiwgXCJvblZpc2libGVDaGFuZ2VkXCIsIFwib25BbGxSZW1vdmVkXCJdLFxuICBfZXhjbHVkZWQyID0gW1wic3RhdHVzXCJdO1xuLyogZXNsaW50IHJlYWN0L3Byb3AtdHlwZXM6IDAgKi9cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBPcmlnaW5DU1NNb3Rpb24gZnJvbSBcIi4vQ1NTTW90aW9uXCI7XG5pbXBvcnQgeyBkaWZmS2V5cywgcGFyc2VLZXlzLCBTVEFUVVNfQURELCBTVEFUVVNfS0VFUCwgU1RBVFVTX1JFTU9WRSwgU1RBVFVTX1JFTU9WRUQgfSBmcm9tIFwiLi91dGlsL2RpZmZcIjtcbmltcG9ydCB7IHN1cHBvcnRUcmFuc2l0aW9uIH0gZnJvbSBcIi4vdXRpbC9tb3Rpb25cIjtcbnZhciBNT1RJT05fUFJPUF9OQU1FUyA9IFsnZXZlbnRQcm9wcycsICd2aXNpYmxlJywgJ2NoaWxkcmVuJywgJ21vdGlvbk5hbWUnLCAnbW90aW9uQXBwZWFyJywgJ21vdGlvbkVudGVyJywgJ21vdGlvbkxlYXZlJywgJ21vdGlvbkxlYXZlSW1tZWRpYXRlbHknLCAnbW90aW9uRGVhZGxpbmUnLCAncmVtb3ZlT25MZWF2ZScsICdsZWF2ZWRDbGFzc05hbWUnLCAnb25BcHBlYXJQcmVwYXJlJywgJ29uQXBwZWFyU3RhcnQnLCAnb25BcHBlYXJBY3RpdmUnLCAnb25BcHBlYXJFbmQnLCAnb25FbnRlclN0YXJ0JywgJ29uRW50ZXJBY3RpdmUnLCAnb25FbnRlckVuZCcsICdvbkxlYXZlU3RhcnQnLCAnb25MZWF2ZUFjdGl2ZScsICdvbkxlYXZlRW5kJ107XG4vKipcbiAqIEdlbmVyYXRlIGEgQ1NTTW90aW9uTGlzdCBjb21wb25lbnQgd2l0aCBjb25maWdcbiAqIEBwYXJhbSB0cmFuc2l0aW9uU3VwcG9ydCBObyBuZWVkIHNpbmNlIENTU01vdGlvbkxpc3Qgbm8gbG9uZ2VyIGRlcGVuZHMgb24gdHJhbnNpdGlvbiBzdXBwb3J0XG4gKiBAcGFyYW0gQ1NTTW90aW9uIENTU01vdGlvbiBjb21wb25lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbkNTU01vdGlvbkxpc3QodHJhbnNpdGlvblN1cHBvcnQpIHtcbiAgdmFyIENTU01vdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogT3JpZ2luQ1NTTW90aW9uO1xuICB2YXIgQ1NTTW90aW9uTGlzdCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAgIF9pbmhlcml0cyhDU1NNb3Rpb25MaXN0LCBfUmVhY3QkQ29tcG9uZW50KTtcbiAgICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKENTU01vdGlvbkxpc3QpO1xuICAgIGZ1bmN0aW9uIENTU01vdGlvbkxpc3QoKSB7XG4gICAgICB2YXIgX3RoaXM7XG4gICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ1NTTW90aW9uTGlzdCk7XG4gICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgIH1cbiAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwuYXBwbHkoX3N1cGVyLCBbdGhpc10uY29uY2F0KGFyZ3MpKTtcbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJzdGF0ZVwiLCB7XG4gICAgICAgIGtleUVudGl0aWVzOiBbXVxuICAgICAgfSk7XG4gICAgICAvLyBab21iaWVKOiBSZXR1cm4gdGhlIGNvdW50IG9mIHJlc3Qga2V5cy4gSXQncyBzYWZlIHRvIHJlZmFjdG9yIGlmIG5lZWQgbW9yZSBpbmZvLlxuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInJlbW92ZUtleVwiLCBmdW5jdGlvbiAocmVtb3ZlS2V5KSB7XG4gICAgICAgIF90aGlzLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgICB2YXIgbmV4dEtleUVudGl0aWVzID0gcHJldlN0YXRlLmtleUVudGl0aWVzLm1hcChmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgICAgICAgICBpZiAoZW50aXR5LmtleSAhPT0gcmVtb3ZlS2V5KSByZXR1cm4gZW50aXR5O1xuICAgICAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZW50aXR5KSwge30sIHtcbiAgICAgICAgICAgICAgc3RhdHVzOiBTVEFUVVNfUkVNT1ZFRFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtleUVudGl0aWVzOiBuZXh0S2V5RW50aXRpZXNcbiAgICAgICAgICB9O1xuICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIGtleUVudGl0aWVzID0gX3RoaXMuc3RhdGUua2V5RW50aXRpZXM7XG4gICAgICAgICAgdmFyIHJlc3RLZXlzQ291bnQgPSBrZXlFbnRpdGllcy5maWx0ZXIoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgICAgIHZhciBzdGF0dXMgPSBfcmVmLnN0YXR1cztcbiAgICAgICAgICAgIHJldHVybiBzdGF0dXMgIT09IFNUQVRVU19SRU1PVkVEO1xuICAgICAgICAgIH0pLmxlbmd0aDtcbiAgICAgICAgICBpZiAocmVzdEtleXNDb3VudCA9PT0gMCAmJiBfdGhpcy5wcm9wcy5vbkFsbFJlbW92ZWQpIHtcbiAgICAgICAgICAgIF90aGlzLnByb3BzLm9uQWxsUmVtb3ZlZCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgX2NyZWF0ZUNsYXNzKENTU01vdGlvbkxpc3QsIFt7XG4gICAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgICB2YXIgX3RoaXMyID0gdGhpcztcbiAgICAgICAgdmFyIGtleUVudGl0aWVzID0gdGhpcy5zdGF0ZS5rZXlFbnRpdGllcztcbiAgICAgICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBjb21wb25lbnQgPSBfdGhpcyRwcm9wcy5jb21wb25lbnQsXG4gICAgICAgICAgY2hpbGRyZW4gPSBfdGhpcyRwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgICBfb25WaXNpYmxlQ2hhbmdlZCA9IF90aGlzJHByb3BzLm9uVmlzaWJsZUNoYW5nZWQsXG4gICAgICAgICAgb25BbGxSZW1vdmVkID0gX3RoaXMkcHJvcHMub25BbGxSZW1vdmVkLFxuICAgICAgICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfdGhpcyRwcm9wcywgX2V4Y2x1ZGVkKTtcbiAgICAgICAgdmFyIENvbXBvbmVudCA9IGNvbXBvbmVudCB8fCBSZWFjdC5GcmFnbWVudDtcbiAgICAgICAgdmFyIG1vdGlvblByb3BzID0ge307XG4gICAgICAgIE1PVElPTl9QUk9QX05BTUVTLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgICBtb3Rpb25Qcm9wc1twcm9wXSA9IHJlc3RQcm9wc1twcm9wXTtcbiAgICAgICAgICBkZWxldGUgcmVzdFByb3BzW3Byb3BdO1xuICAgICAgICB9KTtcbiAgICAgICAgZGVsZXRlIHJlc3RQcm9wcy5rZXlzO1xuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCByZXN0UHJvcHMsIGtleUVudGl0aWVzLm1hcChmdW5jdGlvbiAoX3JlZjIsIGluZGV4KSB7XG4gICAgICAgICAgdmFyIHN0YXR1cyA9IF9yZWYyLnN0YXR1cyxcbiAgICAgICAgICAgIGV2ZW50UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZjIsIF9leGNsdWRlZDIpO1xuICAgICAgICAgIHZhciB2aXNpYmxlID0gc3RhdHVzID09PSBTVEFUVVNfQUREIHx8IHN0YXR1cyA9PT0gU1RBVFVTX0tFRVA7XG4gICAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENTU01vdGlvbiwgX2V4dGVuZHMoe30sIG1vdGlvblByb3BzLCB7XG4gICAgICAgICAgICBrZXk6IGV2ZW50UHJvcHMua2V5LFxuICAgICAgICAgICAgdmlzaWJsZTogdmlzaWJsZSxcbiAgICAgICAgICAgIGV2ZW50UHJvcHM6IGV2ZW50UHJvcHMsXG4gICAgICAgICAgICBvblZpc2libGVDaGFuZ2VkOiBmdW5jdGlvbiBvblZpc2libGVDaGFuZ2VkKGNoYW5nZWRWaXNpYmxlKSB7XG4gICAgICAgICAgICAgIF9vblZpc2libGVDaGFuZ2VkID09PSBudWxsIHx8IF9vblZpc2libGVDaGFuZ2VkID09PSB2b2lkIDAgfHwgX29uVmlzaWJsZUNoYW5nZWQoY2hhbmdlZFZpc2libGUsIHtcbiAgICAgICAgICAgICAgICBrZXk6IGV2ZW50UHJvcHMua2V5XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBpZiAoIWNoYW5nZWRWaXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMyLnJlbW92ZUtleShldmVudFByb3BzLmtleSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSwgZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbihfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICAgICAgICAgICAgaW5kZXg6IGluZGV4XG4gICAgICAgICAgICB9KSwgcmVmKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH1dLCBbe1xuICAgICAga2V5OiBcImdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc1wiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhfcmVmMywgX3JlZjQpIHtcbiAgICAgICAgdmFyIGtleXMgPSBfcmVmMy5rZXlzO1xuICAgICAgICB2YXIga2V5RW50aXRpZXMgPSBfcmVmNC5rZXlFbnRpdGllcztcbiAgICAgICAgdmFyIHBhcnNlZEtleU9iamVjdHMgPSBwYXJzZUtleXMoa2V5cyk7XG4gICAgICAgIHZhciBtaXhlZEtleUVudGl0aWVzID0gZGlmZktleXMoa2V5RW50aXRpZXMsIHBhcnNlZEtleU9iamVjdHMpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGtleUVudGl0aWVzOiBtaXhlZEtleUVudGl0aWVzLmZpbHRlcihmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgICAgICAgICB2YXIgcHJldkVudGl0eSA9IGtleUVudGl0aWVzLmZpbmQoZnVuY3Rpb24gKF9yZWY1KSB7XG4gICAgICAgICAgICAgIHZhciBrZXkgPSBfcmVmNS5rZXk7XG4gICAgICAgICAgICAgIHJldHVybiBlbnRpdHkua2V5ID09PSBrZXk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gUmVtb3ZlIGlmIGFscmVhZHkgbWFyayBhcyByZW1vdmVkXG4gICAgICAgICAgICBpZiAocHJldkVudGl0eSAmJiBwcmV2RW50aXR5LnN0YXR1cyA9PT0gU1RBVFVTX1JFTU9WRUQgJiYgZW50aXR5LnN0YXR1cyA9PT0gU1RBVFVTX1JFTU9WRSkge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1dKTtcbiAgICByZXR1cm4gQ1NTTW90aW9uTGlzdDtcbiAgfShSZWFjdC5Db21wb25lbnQpO1xuICBfZGVmaW5lUHJvcGVydHkoQ1NTTW90aW9uTGlzdCwgXCJkZWZhdWx0UHJvcHNcIiwge1xuICAgIGNvbXBvbmVudDogJ2RpdidcbiAgfSk7XG4gIHJldHVybiBDU1NNb3Rpb25MaXN0O1xufVxuZXhwb3J0IGRlZmF1bHQgZ2VuQ1NTTW90aW9uTGlzdChzdXBwb3J0VHJhbnNpdGlvbik7IiwgImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5leHBvcnQgdmFyIFNUQVRVU19BREQgPSAnYWRkJztcbmV4cG9ydCB2YXIgU1RBVFVTX0tFRVAgPSAna2VlcCc7XG5leHBvcnQgdmFyIFNUQVRVU19SRU1PVkUgPSAncmVtb3ZlJztcbmV4cG9ydCB2YXIgU1RBVFVTX1JFTU9WRUQgPSAncmVtb3ZlZCc7XG5leHBvcnQgZnVuY3Rpb24gd3JhcEtleVRvT2JqZWN0KGtleSkge1xuICB2YXIga2V5T2JqO1xuICBpZiAoa2V5ICYmIF90eXBlb2Yoa2V5KSA9PT0gJ29iamVjdCcgJiYgJ2tleScgaW4ga2V5KSB7XG4gICAga2V5T2JqID0ga2V5O1xuICB9IGVsc2Uge1xuICAgIGtleU9iaiA9IHtcbiAgICAgIGtleToga2V5XG4gICAgfTtcbiAgfVxuICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBrZXlPYmopLCB7fSwge1xuICAgIGtleTogU3RyaW5nKGtleU9iai5rZXkpXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlS2V5cygpIHtcbiAgdmFyIGtleXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFtdO1xuICByZXR1cm4ga2V5cy5tYXAod3JhcEtleVRvT2JqZWN0KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkaWZmS2V5cygpIHtcbiAgdmFyIHByZXZLZXlzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbXTtcbiAgdmFyIGN1cnJlbnRLZXlzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBbXTtcbiAgdmFyIGxpc3QgPSBbXTtcbiAgdmFyIGN1cnJlbnRJbmRleCA9IDA7XG4gIHZhciBjdXJyZW50TGVuID0gY3VycmVudEtleXMubGVuZ3RoO1xuICB2YXIgcHJldktleU9iamVjdHMgPSBwYXJzZUtleXMocHJldktleXMpO1xuICB2YXIgY3VycmVudEtleU9iamVjdHMgPSBwYXJzZUtleXMoY3VycmVudEtleXMpO1xuXG4gIC8vIENoZWNrIHByZXYga2V5cyB0byBpbnNlcnQgb3Iga2VlcFxuICBwcmV2S2V5T2JqZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXlPYmopIHtcbiAgICB2YXIgaGl0ID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IGN1cnJlbnRJbmRleDsgaSA8IGN1cnJlbnRMZW47IGkgKz0gMSkge1xuICAgICAgdmFyIGN1cnJlbnRLZXlPYmogPSBjdXJyZW50S2V5T2JqZWN0c1tpXTtcbiAgICAgIGlmIChjdXJyZW50S2V5T2JqLmtleSA9PT0ga2V5T2JqLmtleSkge1xuICAgICAgICAvLyBOZXcgYWRkZWQga2V5cyBzaG91bGQgYWRkIGJlZm9yZSBjdXJyZW50IGtleVxuICAgICAgICBpZiAoY3VycmVudEluZGV4IDwgaSkge1xuICAgICAgICAgIGxpc3QgPSBsaXN0LmNvbmNhdChjdXJyZW50S2V5T2JqZWN0cy5zbGljZShjdXJyZW50SW5kZXgsIGkpLm1hcChmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBvYmopLCB7fSwge1xuICAgICAgICAgICAgICBzdGF0dXM6IFNUQVRVU19BRERcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgICBjdXJyZW50SW5kZXggPSBpO1xuICAgICAgICB9XG4gICAgICAgIGxpc3QucHVzaChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGN1cnJlbnRLZXlPYmopLCB7fSwge1xuICAgICAgICAgIHN0YXR1czogU1RBVFVTX0tFRVBcbiAgICAgICAgfSkpO1xuICAgICAgICBjdXJyZW50SW5kZXggKz0gMTtcbiAgICAgICAgaGl0ID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgbm90IGhpdCwgaXQgbWVhbnMga2V5IGlzIHJlbW92ZWRcbiAgICBpZiAoIWhpdCkge1xuICAgICAgbGlzdC5wdXNoKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwga2V5T2JqKSwge30sIHtcbiAgICAgICAgc3RhdHVzOiBTVEFUVVNfUkVNT1ZFXG4gICAgICB9KSk7XG4gICAgfVxuICB9KTtcblxuICAvLyBBZGQgcmVzdCB0byB0aGUgbGlzdFxuICBpZiAoY3VycmVudEluZGV4IDwgY3VycmVudExlbikge1xuICAgIGxpc3QgPSBsaXN0LmNvbmNhdChjdXJyZW50S2V5T2JqZWN0cy5zbGljZShjdXJyZW50SW5kZXgpLm1hcChmdW5jdGlvbiAob2JqKSB7XG4gICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBvYmopLCB7fSwge1xuICAgICAgICBzdGF0dXM6IFNUQVRVU19BRERcbiAgICAgIH0pO1xuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXJnZSBzYW1lIGtleSB3aGVuIGl0IHJlbW92ZSBhbmQgYWRkIGFnYWluOlxuICAgKiAgICBbMSAtIGFkZCwgMiAtIGtlZXAsIDEgLSByZW1vdmVdIC0+IFsxIC0ga2VlcCwgMiAtIGtlZXBdXG4gICAqL1xuICB2YXIga2V5cyA9IHt9O1xuICBsaXN0LmZvckVhY2goZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIga2V5ID0gX3JlZi5rZXk7XG4gICAga2V5c1trZXldID0gKGtleXNba2V5XSB8fCAwKSArIDE7XG4gIH0pO1xuICB2YXIgZHVwbGljYXRlZEtleXMgPSBPYmplY3Qua2V5cyhrZXlzKS5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBrZXlzW2tleV0gPiAxO1xuICB9KTtcbiAgZHVwbGljYXRlZEtleXMuZm9yRWFjaChmdW5jdGlvbiAobWF0Y2hLZXkpIHtcbiAgICAvLyBSZW1vdmUgYFNUQVRVU19SRU1PVkVgIG5vZGUuXG4gICAgbGlzdCA9IGxpc3QuZmlsdGVyKGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgdmFyIGtleSA9IF9yZWYyLmtleSxcbiAgICAgICAgc3RhdHVzID0gX3JlZjIuc3RhdHVzO1xuICAgICAgcmV0dXJuIGtleSAhPT0gbWF0Y2hLZXkgfHwgc3RhdHVzICE9PSBTVEFUVVNfUkVNT1ZFO1xuICAgIH0pO1xuXG4gICAgLy8gVXBkYXRlIGBTVEFUVVNfQUREYCB0byBgU1RBVFVTX0tFRVBgXG4gICAgbGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICBpZiAobm9kZS5rZXkgPT09IG1hdGNoS2V5KSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICBub2RlLnN0YXR1cyA9IFNUQVRVU19LRUVQO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIGxpc3Q7XG59IiwgImltcG9ydCBDU1NNb3Rpb24gZnJvbSBcIi4vQ1NTTW90aW9uXCI7XG5pbXBvcnQgQ1NTTW90aW9uTGlzdCBmcm9tIFwiLi9DU1NNb3Rpb25MaXN0XCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFByb3ZpZGVyIH0gZnJvbSBcIi4vY29udGV4dFwiO1xuZXhwb3J0IHsgQ1NTTW90aW9uTGlzdCB9O1xuZXhwb3J0IGRlZmF1bHQgQ1NTTW90aW9uOyIsICJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZGV2VXNlV2FybmluZyB9IGZyb20gJy4uL191dGlsL3dhcm5pbmcnO1xuLyoqXG4gKiBXYXJuaW5nIGZvciBDb25maWdQcm92aWRlclByb3BzLlxuICogVGhpcyB3aWxsIGJlIGVtcHR5IGZ1bmN0aW9uIGluIHByb2R1Y3Rpb24uXG4gKi9cbmNvbnN0IFByb3BXYXJuaW5nID0gLyojX19QVVJFX18qL1JlYWN0Lm1lbW8oX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoXG4gIH0gPSBfcmVmO1xuICBjb25zdCB3YXJuaW5nID0gZGV2VXNlV2FybmluZygnQ29uZmlnUHJvdmlkZXInKTtcbiAgd2FybmluZy5kZXByZWNhdGVkKGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCA9PT0gdW5kZWZpbmVkLCAnZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoJywgJ3BvcHVwTWF0Y2hTZWxlY3RXaWR0aCcpO1xuICByZXR1cm4gbnVsbDtcbn0pO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgUHJvcFdhcm5pbmcuZGlzcGxheU5hbWUgPSAnUHJvcFdhcm5pbmcnO1xufVxuZXhwb3J0IGRlZmF1bHQgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IFByb3BXYXJuaW5nIDogKCkgPT4gbnVsbDsiLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQ2hlY2tDaXJjbGVGaWxsZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vQ2hlY2tDaXJjbGVGaWxsZWRcIjtcbmltcG9ydCBBbnRkSWNvbiBmcm9tIFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiO1xudmFyIENoZWNrQ2lyY2xlRmlsbGVkID0gZnVuY3Rpb24gQ2hlY2tDaXJjbGVGaWxsZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IENoZWNrQ2lyY2xlRmlsbGVkU3ZnXG4gIH0pKTtcbn07XG5cbi8qKiFbY2hlY2stY2lyY2xlXShkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUIzYVdSMGFEMGlOVEFpSUdobGFXZG9kRDBpTlRBaUlHWnBiR3c5SWlOallXTmhZMkVpSUhacFpYZENiM2c5SWpZMElEWTBJRGc1TmlBNE9UWWlJR1p2WTNWellXSnNaVDBpWm1Gc2MyVWlJSGh0Ykc1elBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5SStQSEJoZEdnZ1pEMGlUVFV4TWlBMk5FTXlOalF1TmlBMk5DQTJOQ0F5TmpRdU5pQTJOQ0ExTVRKek1qQXdMallnTkRRNElEUTBPQ0EwTkRnZ05EUTRMVEl3TUM0MklEUTBPQzAwTkRoVE56VTVMalFnTmpRZ05URXlJRFkwZW0weE9UTXVOU0F6TURFdU4yd3RNakV3TGpZZ01qa3lZVE14TGpnZ016RXVPQ0F3SURBeExUVXhMamNnTUV3ek1UZ3VOU0EwT0RRdU9XTXRNeTQ0TFRVdU15QXdMVEV5TGpjZ05pNDFMVEV5TGpkb05EWXVPV014TUM0eUlEQWdNVGt1T1NBMExqa2dNalV1T1NBeE15NHpiRGN4TGpJZ09UZ3VPQ0F4TlRjdU1pMHlNVGhqTmkwNExqTWdNVFV1TmkweE15NHpJREkxTGprdE1UTXVNMGcyT1Rsak5pNDFJREFnTVRBdU15QTNMalFnTmk0MUlERXlMamQ2SWlBdlBqd3ZjM1puUGc9PSkgKi9cbnZhciBSZWZJY29uID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoQ2hlY2tDaXJjbGVGaWxsZWQpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgUmVmSWNvbi5kaXNwbGF5TmFtZSA9ICdDaGVja0NpcmNsZUZpbGxlZCc7XG59XG5leHBvcnQgZGVmYXVsdCBSZWZJY29uOyIsICIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBDaGVja0NpcmNsZUZpbGxlZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNTEyIDY0QzI2NC42IDY0IDY0IDI2NC42IDY0IDUxMnMyMDAuNiA0NDggNDQ4IDQ0OCA0NDgtMjAwLjYgNDQ4LTQ0OFM3NTkuNCA2NCA1MTIgNjR6bTE5My41IDMwMS43bC0yMTAuNiAyOTJhMzEuOCAzMS44IDAgMDEtNTEuNyAwTDMxOC41IDQ4NC45Yy0zLjgtNS4zIDAtMTIuNyA2LjUtMTIuN2g0Ni45YzEwLjIgMCAxOS45IDQuOSAyNS45IDEzLjNsNzEuMiA5OC44IDE1Ny4yLTIxOGM2LTguMyAxNS42LTEzLjMgMjUuOS0xMy4zSDY5OWM2LjUgMCAxMC4zIDcuNCA2LjUgMTIuN3pcIiB9IH1dIH0sIFwibmFtZVwiOiBcImNoZWNrLWNpcmNsZVwiLCBcInRoZW1lXCI6IFwiZmlsbGVkXCIgfTtcbmV4cG9ydCBkZWZhdWx0IENoZWNrQ2lyY2xlRmlsbGVkO1xuIiwgIid1c2UgY2xpZW50JztcblxuaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcImNsYXNzTmFtZVwiLCBcImljb25cIiwgXCJzcGluXCIsIFwicm90YXRlXCIsIFwidGFiSW5kZXhcIiwgXCJvbkNsaWNrXCIsIFwidHdvVG9uZUNvbG9yXCJdO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyBibHVlIH0gZnJvbSAnQGFudC1kZXNpZ24vY29sb3JzJztcbmltcG9ydCBDb250ZXh0IGZyb20gXCIuL0NvbnRleHRcIjtcbmltcG9ydCBSZWFjdEljb24gZnJvbSBcIi4vSWNvbkJhc2VcIjtcbmltcG9ydCB7IGdldFR3b1RvbmVDb2xvciwgc2V0VHdvVG9uZUNvbG9yIH0gZnJvbSBcIi4vdHdvVG9uZVByaW1hcnlDb2xvclwiO1xuaW1wb3J0IHsgbm9ybWFsaXplVHdvVG9uZUNvbG9ycyB9IGZyb20gXCIuLi91dGlsc1wiO1xuLy8gSW5pdGlhbCBzZXR0aW5nXG4vLyBzaG91bGQgbW92ZSBpdCB0byBhbnRkIG1haW4gcmVwbz9cbnNldFR3b1RvbmVDb2xvcihibHVlLnByaW1hcnkpO1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vRGVmaW5pdGVseVR5cGVkL0RlZmluaXRlbHlUeXBlZC9pc3N1ZXMvMzQ3NTcjaXNzdWVjb21tZW50LTQ4ODg0ODcyMFxuXG52YXIgSWNvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgaWNvbiA9IHByb3BzLmljb24sXG4gICAgc3BpbiA9IHByb3BzLnNwaW4sXG4gICAgcm90YXRlID0gcHJvcHMucm90YXRlLFxuICAgIHRhYkluZGV4ID0gcHJvcHMudGFiSW5kZXgsXG4gICAgb25DbGljayA9IHByb3BzLm9uQ2xpY2ssXG4gICAgdHdvVG9uZUNvbG9yID0gcHJvcHMudHdvVG9uZUNvbG9yLFxuICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgX2V4Y2x1ZGVkKTtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb250ZXh0KSxcbiAgICBfUmVhY3QkdXNlQ29udGV4dCRwcmUgPSBfUmVhY3QkdXNlQ29udGV4dC5wcmVmaXhDbHMsXG4gICAgcHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQkcHJlID09PSB2b2lkIDAgPyAnYW50aWNvbicgOiBfUmVhY3QkdXNlQ29udGV4dCRwcmUsXG4gICAgcm9vdENsYXNzTmFtZSA9IF9SZWFjdCR1c2VDb250ZXh0LnJvb3RDbGFzc05hbWU7XG4gIHZhciBjbGFzc1N0cmluZyA9IGNsYXNzTmFtZXMocm9vdENsYXNzTmFtZSwgcHJlZml4Q2xzLCBfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQoaWNvbi5uYW1lKSwgISFpY29uLm5hbWUpLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNwaW5cIiksICEhc3BpbiB8fCBpY29uLm5hbWUgPT09ICdsb2FkaW5nJyksIGNsYXNzTmFtZSk7XG4gIHZhciBpY29uVGFiSW5kZXggPSB0YWJJbmRleDtcbiAgaWYgKGljb25UYWJJbmRleCA9PT0gdW5kZWZpbmVkICYmIG9uQ2xpY2spIHtcbiAgICBpY29uVGFiSW5kZXggPSAtMTtcbiAgfVxuICB2YXIgc3ZnU3R5bGUgPSByb3RhdGUgPyB7XG4gICAgbXNUcmFuc2Zvcm06IFwicm90YXRlKFwiLmNvbmNhdChyb3RhdGUsIFwiZGVnKVwiKSxcbiAgICB0cmFuc2Zvcm06IFwicm90YXRlKFwiLmNvbmNhdChyb3RhdGUsIFwiZGVnKVwiKVxuICB9IDogdW5kZWZpbmVkO1xuICB2YXIgX25vcm1hbGl6ZVR3b1RvbmVDb2xvID0gbm9ybWFsaXplVHdvVG9uZUNvbG9ycyh0d29Ub25lQ29sb3IpLFxuICAgIF9ub3JtYWxpemVUd29Ub25lQ29sbzIgPSBfc2xpY2VkVG9BcnJheShfbm9ybWFsaXplVHdvVG9uZUNvbG8sIDIpLFxuICAgIHByaW1hcnlDb2xvciA9IF9ub3JtYWxpemVUd29Ub25lQ29sbzJbMF0sXG4gICAgc2Vjb25kYXJ5Q29sb3IgPSBfbm9ybWFsaXplVHdvVG9uZUNvbG8yWzFdO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIF9leHRlbmRzKHtcbiAgICByb2xlOiBcImltZ1wiLFxuICAgIFwiYXJpYS1sYWJlbFwiOiBpY29uLm5hbWVcbiAgfSwgcmVzdFByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgdGFiSW5kZXg6IGljb25UYWJJbmRleCxcbiAgICBvbkNsaWNrOiBvbkNsaWNrLFxuICAgIGNsYXNzTmFtZTogY2xhc3NTdHJpbmdcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0SWNvbiwge1xuICAgIGljb246IGljb24sXG4gICAgcHJpbWFyeUNvbG9yOiBwcmltYXJ5Q29sb3IsXG4gICAgc2Vjb25kYXJ5Q29sb3I6IHNlY29uZGFyeUNvbG9yLFxuICAgIHN0eWxlOiBzdmdTdHlsZVxuICB9KSk7XG59KTtcbkljb24uZGlzcGxheU5hbWUgPSAnQW50ZEljb24nO1xuSWNvbi5nZXRUd29Ub25lQ29sb3IgPSBnZXRUd29Ub25lQ29sb3I7XG5JY29uLnNldFR3b1RvbmVDb2xvciA9IHNldFR3b1RvbmVDb2xvcjtcbmV4cG9ydCBkZWZhdWx0IEljb247IiwgImltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xudmFyIF9leGNsdWRlZCA9IFtcImljb25cIiwgXCJjbGFzc05hbWVcIiwgXCJvbkNsaWNrXCIsIFwic3R5bGVcIiwgXCJwcmltYXJ5Q29sb3JcIiwgXCJzZWNvbmRhcnlDb2xvclwiXTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGdlbmVyYXRlLCBnZXRTZWNvbmRhcnlDb2xvciwgaXNJY29uRGVmaW5pdGlvbiwgd2FybmluZywgdXNlSW5zZXJ0U3R5bGVzIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG52YXIgdHdvVG9uZUNvbG9yUGFsZXR0ZSA9IHtcbiAgcHJpbWFyeUNvbG9yOiAnIzMzMycsXG4gIHNlY29uZGFyeUNvbG9yOiAnI0U2RTZFNicsXG4gIGNhbGN1bGF0ZWQ6IGZhbHNlXG59O1xuZnVuY3Rpb24gc2V0VHdvVG9uZUNvbG9ycyhfcmVmKSB7XG4gIHZhciBwcmltYXJ5Q29sb3IgPSBfcmVmLnByaW1hcnlDb2xvcixcbiAgICBzZWNvbmRhcnlDb2xvciA9IF9yZWYuc2Vjb25kYXJ5Q29sb3I7XG4gIHR3b1RvbmVDb2xvclBhbGV0dGUucHJpbWFyeUNvbG9yID0gcHJpbWFyeUNvbG9yO1xuICB0d29Ub25lQ29sb3JQYWxldHRlLnNlY29uZGFyeUNvbG9yID0gc2Vjb25kYXJ5Q29sb3IgfHwgZ2V0U2Vjb25kYXJ5Q29sb3IocHJpbWFyeUNvbG9yKTtcbiAgdHdvVG9uZUNvbG9yUGFsZXR0ZS5jYWxjdWxhdGVkID0gISFzZWNvbmRhcnlDb2xvcjtcbn1cbmZ1bmN0aW9uIGdldFR3b1RvbmVDb2xvcnMoKSB7XG4gIHJldHVybiBfb2JqZWN0U3ByZWFkKHt9LCB0d29Ub25lQ29sb3JQYWxldHRlKTtcbn1cbnZhciBJY29uQmFzZSA9IGZ1bmN0aW9uIEljb25CYXNlKHByb3BzKSB7XG4gIHZhciBpY29uID0gcHJvcHMuaWNvbixcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgb25DbGljayA9IHByb3BzLm9uQ2xpY2ssXG4gICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICBwcmltYXJ5Q29sb3IgPSBwcm9wcy5wcmltYXJ5Q29sb3IsXG4gICAgc2Vjb25kYXJ5Q29sb3IgPSBwcm9wcy5zZWNvbmRhcnlDb2xvcixcbiAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIF9leGNsdWRlZCk7XG4gIHZhciBzdmdSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgdmFyIGNvbG9ycyA9IHR3b1RvbmVDb2xvclBhbGV0dGU7XG4gIGlmIChwcmltYXJ5Q29sb3IpIHtcbiAgICBjb2xvcnMgPSB7XG4gICAgICBwcmltYXJ5Q29sb3I6IHByaW1hcnlDb2xvcixcbiAgICAgIHNlY29uZGFyeUNvbG9yOiBzZWNvbmRhcnlDb2xvciB8fCBnZXRTZWNvbmRhcnlDb2xvcihwcmltYXJ5Q29sb3IpXG4gICAgfTtcbiAgfVxuICB1c2VJbnNlcnRTdHlsZXMoc3ZnUmVmKTtcbiAgd2FybmluZyhpc0ljb25EZWZpbml0aW9uKGljb24pLCBcImljb24gc2hvdWxkIGJlIGljb24gZGVmaW5pdG9uLCBidXQgZ290IFwiLmNvbmNhdChpY29uKSk7XG4gIGlmICghaXNJY29uRGVmaW5pdGlvbihpY29uKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciB0YXJnZXQgPSBpY29uO1xuICBpZiAodGFyZ2V0ICYmIHR5cGVvZiB0YXJnZXQuaWNvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRhcmdldCA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdGFyZ2V0KSwge30sIHtcbiAgICAgIGljb246IHRhcmdldC5pY29uKGNvbG9ycy5wcmltYXJ5Q29sb3IsIGNvbG9ycy5zZWNvbmRhcnlDb2xvcilcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gZ2VuZXJhdGUodGFyZ2V0Lmljb24sIFwic3ZnLVwiLmNvbmNhdCh0YXJnZXQubmFtZSksIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgb25DbGljazogb25DbGljayxcbiAgICBzdHlsZTogc3R5bGUsXG4gICAgJ2RhdGEtaWNvbic6IHRhcmdldC5uYW1lLFxuICAgIHdpZHRoOiAnMWVtJyxcbiAgICBoZWlnaHQ6ICcxZW0nLFxuICAgIGZpbGw6ICdjdXJyZW50Q29sb3InLFxuICAgICdhcmlhLWhpZGRlbic6ICd0cnVlJ1xuICB9LCByZXN0UHJvcHMpLCB7fSwge1xuICAgIHJlZjogc3ZnUmVmXG4gIH0pKTtcbn07XG5JY29uQmFzZS5kaXNwbGF5TmFtZSA9ICdJY29uUmVhY3QnO1xuSWNvbkJhc2UuZ2V0VHdvVG9uZUNvbG9ycyA9IGdldFR3b1RvbmVDb2xvcnM7XG5JY29uQmFzZS5zZXRUd29Ub25lQ29sb3JzID0gc2V0VHdvVG9uZUNvbG9ycztcbmV4cG9ydCBkZWZhdWx0IEljb25CYXNlOyIsICJmdW5jdGlvbiBnZXRSb290KGVsZSkge1xuICB2YXIgX2VsZSRnZXRSb290Tm9kZTtcbiAgcmV0dXJuIGVsZSA9PT0gbnVsbCB8fCBlbGUgPT09IHZvaWQgMCB8fCAoX2VsZSRnZXRSb290Tm9kZSA9IGVsZS5nZXRSb290Tm9kZSkgPT09IG51bGwgfHwgX2VsZSRnZXRSb290Tm9kZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2VsZSRnZXRSb290Tm9kZS5jYWxsKGVsZSk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgaXMgaW4gc2hhZG93Um9vdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5TaGFkb3coZWxlKSB7XG4gIHJldHVybiBnZXRSb290KGVsZSkgaW5zdGFuY2VvZiBTaGFkb3dSb290O1xufVxuXG4vKipcbiAqIFJldHVybiBzaGFkb3dSb290IGlmIHBvc3NpYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTaGFkb3dSb290KGVsZSkge1xuICByZXR1cm4gaW5TaGFkb3coZWxlKSA/IGdldFJvb3QoZWxlKSA6IG51bGw7XG59IiwgImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZSBhcyBnZW5lcmF0ZUNvbG9yIH0gZnJvbSAnQGFudC1kZXNpZ24vY29sb3JzJztcbmltcG9ydCB7IHVwZGF0ZUNTUyB9IGZyb20gXCJyYy11dGlsL2VzL0RvbS9keW5hbWljQ1NTXCI7XG5pbXBvcnQgeyBnZXRTaGFkb3dSb290IH0gZnJvbSBcInJjLXV0aWwvZXMvRG9tL3NoYWRvd1wiO1xuaW1wb3J0IHdhcm4gZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuaW1wb3J0IFJlYWN0LCB7IHVzZUNvbnRleHQsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBJY29uQ29udGV4dCBmcm9tIFwiLi9jb21wb25lbnRzL0NvbnRleHRcIjtcbmZ1bmN0aW9uIGNhbWVsQ2FzZShpbnB1dCkge1xuICByZXR1cm4gaW5wdXQucmVwbGFjZSgvLSguKS9nLCBmdW5jdGlvbiAobWF0Y2gsIGcpIHtcbiAgICByZXR1cm4gZy50b1VwcGVyQ2FzZSgpO1xuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3YXJuaW5nKHZhbGlkLCBtZXNzYWdlKSB7XG4gIHdhcm4odmFsaWQsIFwiW0BhbnQtZGVzaWduL2ljb25zXSBcIi5jb25jYXQobWVzc2FnZSkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSWNvbkRlZmluaXRpb24odGFyZ2V0KSB7XG4gIHJldHVybiBfdHlwZW9mKHRhcmdldCkgPT09ICdvYmplY3QnICYmIHR5cGVvZiB0YXJnZXQubmFtZSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIHRhcmdldC50aGVtZSA9PT0gJ3N0cmluZycgJiYgKF90eXBlb2YodGFyZ2V0Lmljb24pID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgdGFyZ2V0Lmljb24gPT09ICdmdW5jdGlvbicpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUF0dHJzKCkge1xuICB2YXIgYXR0cnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICByZXR1cm4gT2JqZWN0LmtleXMoYXR0cnMpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBrZXkpIHtcbiAgICB2YXIgdmFsID0gYXR0cnNba2V5XTtcbiAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgY2FzZSAnY2xhc3MnOlxuICAgICAgICBhY2MuY2xhc3NOYW1lID0gdmFsO1xuICAgICAgICBkZWxldGUgYWNjLmNsYXNzO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGRlbGV0ZSBhY2Nba2V5XTtcbiAgICAgICAgYWNjW2NhbWVsQ2FzZShrZXkpXSA9IHZhbDtcbiAgICB9XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlKG5vZGUsIGtleSwgcm9vdFByb3BzKSB7XG4gIGlmICghcm9vdFByb3BzKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KG5vZGUudGFnLCBfb2JqZWN0U3ByZWFkKHtcbiAgICAgIGtleToga2V5XG4gICAgfSwgbm9ybWFsaXplQXR0cnMobm9kZS5hdHRycykpLCAobm9kZS5jaGlsZHJlbiB8fCBbXSkubWFwKGZ1bmN0aW9uIChjaGlsZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiBnZW5lcmF0ZShjaGlsZCwgXCJcIi5jb25jYXQoa2V5LCBcIi1cIikuY29uY2F0KG5vZGUudGFnLCBcIi1cIikuY29uY2F0KGluZGV4KSk7XG4gICAgfSkpO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChub2RlLnRhZywgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHtcbiAgICBrZXk6IGtleVxuICB9LCBub3JtYWxpemVBdHRycyhub2RlLmF0dHJzKSksIHJvb3RQcm9wcyksIChub2RlLmNoaWxkcmVuIHx8IFtdKS5tYXAoZnVuY3Rpb24gKGNoaWxkLCBpbmRleCkge1xuICAgIHJldHVybiBnZW5lcmF0ZShjaGlsZCwgXCJcIi5jb25jYXQoa2V5LCBcIi1cIikuY29uY2F0KG5vZGUudGFnLCBcIi1cIikuY29uY2F0KGluZGV4KSk7XG4gIH0pKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWNvbmRhcnlDb2xvcihwcmltYXJ5Q29sb3IpIHtcbiAgLy8gY2hvb3NlIHRoZSBzZWNvbmQgY29sb3JcbiAgcmV0dXJuIGdlbmVyYXRlQ29sb3IocHJpbWFyeUNvbG9yKVswXTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVUd29Ub25lQ29sb3JzKHR3b1RvbmVDb2xvcikge1xuICBpZiAoIXR3b1RvbmVDb2xvcikge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICByZXR1cm4gQXJyYXkuaXNBcnJheSh0d29Ub25lQ29sb3IpID8gdHdvVG9uZUNvbG9yIDogW3R3b1RvbmVDb2xvcl07XG59XG5cbi8vIFRoZXNlIHByb3BzIG1ha2Ugc3VyZSB0aGF0IHRoZSBTVkcgYmVoYXZpb3VycyBsaWtlIGdlbmVyYWwgdGV4dC5cbi8vIFJlZmVyZW5jZTogaHR0cHM6Ly9ibG9nLnByb3RvdHlwci5pby9hbGlnbi1zdmctaWNvbnMtdG8tdGV4dC1hbmQtc2F5LWdvb2RieWUtdG8tZm9udC1pY29ucy1kNDRiM2Q3YjI2YjRcbmV4cG9ydCB2YXIgc3ZnQmFzZVByb3BzID0ge1xuICB3aWR0aDogJzFlbScsXG4gIGhlaWdodDogJzFlbScsXG4gIGZpbGw6ICdjdXJyZW50Q29sb3InLFxuICAnYXJpYS1oaWRkZW4nOiAndHJ1ZScsXG4gIGZvY3VzYWJsZTogJ2ZhbHNlJ1xufTtcbmV4cG9ydCB2YXIgaWNvblN0eWxlcyA9IFwiXFxuLmFudGljb24ge1xcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgY29sb3I6IGluaGVyaXQ7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsaW5lLWhlaWdodDogMDtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcbiAgdmVydGljYWwtYWxpZ246IC0wLjEyNWVtO1xcbiAgdGV4dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJpbGl0eTtcXG4gIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkO1xcbiAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTtcXG59XFxuXFxuLmFudGljb24gPiAqIHtcXG4gIGxpbmUtaGVpZ2h0OiAxO1xcbn1cXG5cXG4uYW50aWNvbiBzdmcge1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG5cXG4uYW50aWNvbjo6YmVmb3JlIHtcXG4gIGRpc3BsYXk6IG5vbmU7XFxufVxcblxcbi5hbnRpY29uIC5hbnRpY29uLWljb24ge1xcbiAgZGlzcGxheTogYmxvY2s7XFxufVxcblxcbi5hbnRpY29uW3RhYmluZGV4XSB7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcblxcbi5hbnRpY29uLXNwaW46OmJlZm9yZSxcXG4uYW50aWNvbi1zcGluIHtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIC13ZWJraXQtYW5pbWF0aW9uOiBsb2FkaW5nQ2lyY2xlIDFzIGluZmluaXRlIGxpbmVhcjtcXG4gIGFuaW1hdGlvbjogbG9hZGluZ0NpcmNsZSAxcyBpbmZpbml0ZSBsaW5lYXI7XFxufVxcblxcbkAtd2Via2l0LWtleWZyYW1lcyBsb2FkaW5nQ2lyY2xlIHtcXG4gIDEwMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XFxuICB9XFxufVxcblxcbkBrZXlmcmFtZXMgbG9hZGluZ0NpcmNsZSB7XFxuICAxMDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xcbiAgfVxcbn1cXG5cIjtcbmV4cG9ydCB2YXIgdXNlSW5zZXJ0U3R5bGVzID0gZnVuY3Rpb24gdXNlSW5zZXJ0U3R5bGVzKGVsZVJlZikge1xuICB2YXIgX3VzZUNvbnRleHQgPSB1c2VDb250ZXh0KEljb25Db250ZXh0KSxcbiAgICBjc3AgPSBfdXNlQ29udGV4dC5jc3AsXG4gICAgcHJlZml4Q2xzID0gX3VzZUNvbnRleHQucHJlZml4Q2xzLFxuICAgIGxheWVyID0gX3VzZUNvbnRleHQubGF5ZXI7XG4gIHZhciBtZXJnZWRTdHlsZVN0ciA9IGljb25TdHlsZXM7XG4gIGlmIChwcmVmaXhDbHMpIHtcbiAgICBtZXJnZWRTdHlsZVN0ciA9IG1lcmdlZFN0eWxlU3RyLnJlcGxhY2UoL2FudGljb24vZywgcHJlZml4Q2xzKTtcbiAgfVxuICBpZiAobGF5ZXIpIHtcbiAgICBtZXJnZWRTdHlsZVN0ciA9IFwiQGxheWVyIFwiLmNvbmNhdChsYXllciwgXCIge1xcblwiKS5jb25jYXQobWVyZ2VkU3R5bGVTdHIsIFwiXFxufVwiKTtcbiAgfVxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBlbGUgPSBlbGVSZWYuY3VycmVudDtcbiAgICB2YXIgc2hhZG93Um9vdCA9IGdldFNoYWRvd1Jvb3QoZWxlKTtcbiAgICB1cGRhdGVDU1MobWVyZ2VkU3R5bGVTdHIsICdAYW50LWRlc2lnbi1pY29ucycsIHtcbiAgICAgIHByZXBlbmQ6ICFsYXllcixcbiAgICAgIGNzcDogY3NwLFxuICAgICAgYXR0YWNoVG86IHNoYWRvd1Jvb3RcbiAgICB9KTtcbiAgfSwgW10pO1xufTsiLCAiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgUmVhY3RJY29uIGZyb20gXCIuL0ljb25CYXNlXCI7XG5pbXBvcnQgeyBub3JtYWxpemVUd29Ub25lQ29sb3JzIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5leHBvcnQgZnVuY3Rpb24gc2V0VHdvVG9uZUNvbG9yKHR3b1RvbmVDb2xvcikge1xuICB2YXIgX25vcm1hbGl6ZVR3b1RvbmVDb2xvID0gbm9ybWFsaXplVHdvVG9uZUNvbG9ycyh0d29Ub25lQ29sb3IpLFxuICAgIF9ub3JtYWxpemVUd29Ub25lQ29sbzIgPSBfc2xpY2VkVG9BcnJheShfbm9ybWFsaXplVHdvVG9uZUNvbG8sIDIpLFxuICAgIHByaW1hcnlDb2xvciA9IF9ub3JtYWxpemVUd29Ub25lQ29sbzJbMF0sXG4gICAgc2Vjb25kYXJ5Q29sb3IgPSBfbm9ybWFsaXplVHdvVG9uZUNvbG8yWzFdO1xuICByZXR1cm4gUmVhY3RJY29uLnNldFR3b1RvbmVDb2xvcnMoe1xuICAgIHByaW1hcnlDb2xvcjogcHJpbWFyeUNvbG9yLFxuICAgIHNlY29uZGFyeUNvbG9yOiBzZWNvbmRhcnlDb2xvclxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRUd29Ub25lQ29sb3IoKSB7XG4gIHZhciBjb2xvcnMgPSBSZWFjdEljb24uZ2V0VHdvVG9uZUNvbG9ycygpO1xuICBpZiAoIWNvbG9ycy5jYWxjdWxhdGVkKSB7XG4gICAgcmV0dXJuIGNvbG9ycy5wcmltYXJ5Q29sb3I7XG4gIH1cbiAgcmV0dXJuIFtjb2xvcnMucHJpbWFyeUNvbG9yLCBjb2xvcnMuc2Vjb25kYXJ5Q29sb3JdO1xufSIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBDbG9zZUNpcmNsZUZpbGxlZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9DbG9zZUNpcmNsZUZpbGxlZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gXCIuLi9jb21wb25lbnRzL0FudGRJY29uXCI7XG52YXIgQ2xvc2VDaXJjbGVGaWxsZWQgPSBmdW5jdGlvbiBDbG9zZUNpcmNsZUZpbGxlZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbnRkSWNvbiwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogQ2xvc2VDaXJjbGVGaWxsZWRTdmdcbiAgfSkpO1xufTtcblxuLyoqIVtjbG9zZS1jaXJjbGVdKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjNhV1IwYUQwaU5UQWlJR2hsYVdkb2REMGlOVEFpSUdacGJHdzlJaU5qWVdOaFkyRWlJR1pwYkd3dGNuVnNaVDBpWlhabGJtOWtaQ0lnZG1sbGQwSnZlRDBpTmpRZ05qUWdPRGsySURnNU5pSWdabTlqZFhOaFlteGxQU0ptWVd4elpTSWdlRzFzYm5NOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6SXdNREF2YzNabklqNDhjR0YwYUNCa1BTSk5OVEV5SURZMFl6STBOeTQwSURBZ05EUTRJREl3TUM0MklEUTBPQ0EwTkRoVE56VTVMalFnT1RZd0lEVXhNaUE1TmpBZ05qUWdOelU1TGpRZ05qUWdOVEV5SURJMk5DNDJJRFkwSURVeE1pQTJOSHB0TVRJM0xqazRJREkzTkM0NE1tZ3RMakEwYkMwdU1EZ3VNRFpNTlRFeUlEUTJOaTQzTlNBek9EUXVNVFFnTXpNNExqZzRZeTB1TURRdExqQTFMUzR3TmkwdU1EWXRMakE0TFM0d05tRXVNVEl1TVRJZ01DQXdNQzB1TURjZ01HTXRMakF6SURBdExqQTFMakF4TFM0d09TNHdOV3d0TkRVdU1ESWdORFV1TURKaExqSXVNaUF3SURBd0xTNHdOUzR3T1M0eE1pNHhNaUF3SURBd01DQXVNRGQyTGpBeVlTNHlOeTR5TnlBd0lEQXdMakEyTGpBMlREUTJOaTQzTlNBMU1USWdNek00TGpnNElEWXpPUzQ0Tm1NdExqQTFMakEwTFM0d05pNHdOaTB1TURZdU1EaGhMakV5TGpFeUlEQWdNREF3SUM0d04yTXdJQzR3TXk0d01TNHdOUzR3TlM0d09XdzBOUzR3TWlBME5TNHdNbUV1TWk0eUlEQWdNREF1TURrdU1EVXVNVEl1TVRJZ01DQXdNQzR3TnlBd1l5NHdNaUF3SUM0d05DMHVNREV1TURndExqQTFURFV4TWlBMU5UY3VNalZzTVRJM0xqZzJJREV5Tnk0NE4yTXVNRFF1TURRdU1EWXVNRFV1TURndU1EVmhMakV5TGpFeUlEQWdNREF1TURjZ01HTXVNRE1nTUNBdU1EVXRMakF4TGpBNUxTNHdOV3cwTlM0d01pMDBOUzR3TW1FdU1pNHlJREFnTURBdU1EVXRMakE1TGpFeUxqRXlJREFnTURBd0xTNHdOM1l0TGpBeVlTNHlOeTR5TnlBd0lEQXdMUzR3TlMwdU1EWk1OVFUzTGpJMUlEVXhNbXd4TWpjdU9EY3RNVEkzTGpnMll5NHdOQzB1TURRdU1EVXRMakEyTGpBMUxTNHdPR0V1TVRJdU1USWdNQ0F3TURBdExqQTNZekF0TGpBekxTNHdNUzB1TURVdExqQTFMUzR3T1d3dE5EVXVNREl0TkRVdU1ESmhMakl1TWlBd0lEQXdMUzR3T1MwdU1EVXVNVEl1TVRJZ01DQXdNQzB1TURjZ01Ib2lJQzgrUEM5emRtYyspICovXG52YXIgUmVmSWNvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKENsb3NlQ2lyY2xlRmlsbGVkKTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFJlZkljb24uZGlzcGxheU5hbWUgPSAnQ2xvc2VDaXJjbGVGaWxsZWQnO1xufVxuZXhwb3J0IGRlZmF1bHQgUmVmSWNvbjsiLCAiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgQ2xvc2VDaXJjbGVGaWxsZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcImZpbGwtcnVsZVwiOiBcImV2ZW5vZGRcIiwgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk01MTIgNjRjMjQ3LjQgMCA0NDggMjAwLjYgNDQ4IDQ0OFM3NTkuNCA5NjAgNTEyIDk2MCA2NCA3NTkuNCA2NCA1MTIgMjY0LjYgNjQgNTEyIDY0em0xMjcuOTggMjc0LjgyaC0uMDRsLS4wOC4wNkw1MTIgNDY2Ljc1IDM4NC4xNCAzMzguODhjLS4wNC0uMDUtLjA2LS4wNi0uMDgtLjA2YS4xMi4xMiAwIDAwLS4wNyAwYy0uMDMgMC0uMDUuMDEtLjA5LjA1bC00NS4wMiA0NS4wMmEuMi4yIDAgMDAtLjA1LjA5LjEyLjEyIDAgMDAwIC4wN3YuMDJhLjI3LjI3IDAgMDAuMDYuMDZMNDY2Ljc1IDUxMiAzMzguODggNjM5Ljg2Yy0uMDUuMDQtLjA2LjA2LS4wNi4wOGEuMTIuMTIgMCAwMDAgLjA3YzAgLjAzLjAxLjA1LjA1LjA5bDQ1LjAyIDQ1LjAyYS4yLjIgMCAwMC4wOS4wNS4xMi4xMiAwIDAwLjA3IDBjLjAyIDAgLjA0LS4wMS4wOC0uMDVMNTEyIDU1Ny4yNWwxMjcuODYgMTI3Ljg3Yy4wNC4wNC4wNi4wNS4wOC4wNWEuMTIuMTIgMCAwMC4wNyAwYy4wMyAwIC4wNS0uMDEuMDktLjA1bDQ1LjAyLTQ1LjAyYS4yLjIgMCAwMC4wNS0uMDkuMTIuMTIgMCAwMDAtLjA3di0uMDJhLjI3LjI3IDAgMDAtLjA1LS4wNkw1NTcuMjUgNTEybDEyNy44Ny0xMjcuODZjLjA0LS4wNC4wNS0uMDYuMDUtLjA4YS4xMi4xMiAwIDAwMC0uMDdjMC0uMDMtLjAxLS4wNS0uMDUtLjA5bC00NS4wMi00NS4wMmEuMi4yIDAgMDAtLjA5LS4wNS4xMi4xMiAwIDAwLS4wNyAwelwiIH0gfV0gfSwgXCJuYW1lXCI6IFwiY2xvc2UtY2lyY2xlXCIsIFwidGhlbWVcIjogXCJmaWxsZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgQ2xvc2VDaXJjbGVGaWxsZWQ7XG4iLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQ2xvc2VPdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9DbG9zZU91dGxpbmVkXCI7XG5pbXBvcnQgQW50ZEljb24gZnJvbSBcIi4uL2NvbXBvbmVudHMvQW50ZEljb25cIjtcbnZhciBDbG9zZU91dGxpbmVkID0gZnVuY3Rpb24gQ2xvc2VPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbnRkSWNvbiwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogQ2xvc2VPdXRsaW5lZFN2Z1xuICB9KSk7XG59O1xuXG4vKiohW2Nsb3NlXShkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUIzYVdSMGFEMGlOVEFpSUdobGFXZG9kRDBpTlRBaUlHWnBiR3c5SWlOallXTmhZMkVpSUdacGJHd3RjblZzWlQwaVpYWmxibTlrWkNJZ2RtbGxkMEp2ZUQwaU5qUWdOalFnT0RrMklEZzVOaUlnWm05amRYTmhZbXhsUFNKbVlXeHpaU0lnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JajQ4Y0dGMGFDQmtQU0pOTnprNUxqZzJJREUyTmk0ek1XTXVNRElnTUNBdU1EUXVNREl1TURndU1EWnNOVGN1TmprZ05UY3VOMk11TURRdU1ETXVNRFV1TURVdU1EWXVNRGhoTGpFeUxqRXlJREFnTURFd0lDNHdObU13SUM0d015MHVNREl1TURVdExqQTJMakE1VERVMk9TNDVNeUExTVRKc01qZzNMamNnTWpnM0xqZGpMakEwTGpBMExqQTFMakEyTGpBMkxqQTVZUzR4TWk0eE1pQXdJREF4TUNBdU1EZGpNQ0F1TURJdExqQXlMakEwTFM0d05pNHdPR3d0TlRjdU55QTFOeTQyT1dNdExqQXpMakEwTFM0d05TNHdOUzB1TURjdU1EWmhMakV5TGpFeUlEQWdNREV0TGpBM0lEQmpMUzR3TXlBd0xTNHdOUzB1TURJdExqQTVMUzR3Tmt3MU1USWdOVFk1TGpremJDMHlPRGN1TnlBeU9EY3VOMk10TGpBMExqQTBMUzR3Tmk0d05TMHVNRGt1TURaaExqRXlMakV5SURBZ01ERXRMakEzSURCakxTNHdNaUF3TFM0d05DMHVNREl0TGpBNExTNHdObXd0TlRjdU5qa3ROVGN1TjJNdExqQTBMUzR3TXkwdU1EVXRMakExTFM0d05pMHVNRGRoTGpFeUxqRXlJREFnTURFd0xTNHdOMk13TFM0d015NHdNaTB1TURVdU1EWXRMakE1VERRMU5DNHdOeUExTVRKc0xUSTROeTQzTFRJNE55NDNZeTB1TURRdExqQTBMUzR3TlMwdU1EWXRMakEyTFM0d09XRXVNVEl1TVRJZ01DQXdNVEF0TGpBM1l6QXRMakF5TGpBeUxTNHdOQzR3TmkwdU1EaHNOVGN1TnkwMU55NDJPV011TURNdExqQTBMakExTFM0d05TNHdOeTB1TURaaExqRXlMakV5SURBZ01ERXVNRGNnTUdNdU1ETWdNQ0F1TURVdU1ESXVNRGt1TURaTU5URXlJRFExTkM0d04yd3lPRGN1TnkweU9EY3VOMk11TURRdExqQTBMakEyTFM0d05TNHdPUzB1TURaaExqRXlMakV5SURBZ01ERXVNRGNnTUhvaUlDOCtQQzl6ZG1jKykgKi9cbnZhciBSZWZJY29uID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoQ2xvc2VPdXRsaW5lZCk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBSZWZJY29uLmRpc3BsYXlOYW1lID0gJ0Nsb3NlT3V0bGluZWQnO1xufVxuZXhwb3J0IGRlZmF1bHQgUmVmSWNvbjsiLCAiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgQ2xvc2VPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwiZmlsbC1ydWxlXCI6IFwiZXZlbm9kZFwiLCBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTc5OS44NiAxNjYuMzFjLjAyIDAgLjA0LjAyLjA4LjA2bDU3LjY5IDU3LjdjLjA0LjAzLjA1LjA1LjA2LjA4YS4xMi4xMiAwIDAxMCAuMDZjMCAuMDMtLjAyLjA1LS4wNi4wOUw1NjkuOTMgNTEybDI4Ny43IDI4Ny43Yy4wNC4wNC4wNS4wNi4wNi4wOWEuMTIuMTIgMCAwMTAgLjA3YzAgLjAyLS4wMi4wNC0uMDYuMDhsLTU3LjcgNTcuNjljLS4wMy4wNC0uMDUuMDUtLjA3LjA2YS4xMi4xMiAwIDAxLS4wNyAwYy0uMDMgMC0uMDUtLjAyLS4wOS0uMDZMNTEyIDU2OS45M2wtMjg3LjcgMjg3LjdjLS4wNC4wNC0uMDYuMDUtLjA5LjA2YS4xMi4xMiAwIDAxLS4wNyAwYy0uMDIgMC0uMDQtLjAyLS4wOC0uMDZsLTU3LjY5LTU3LjdjLS4wNC0uMDMtLjA1LS4wNS0uMDYtLjA3YS4xMi4xMiAwIDAxMC0uMDdjMC0uMDMuMDItLjA1LjA2LS4wOUw0NTQuMDcgNTEybC0yODcuNy0yODcuN2MtLjA0LS4wNC0uMDUtLjA2LS4wNi0uMDlhLjEyLjEyIDAgMDEwLS4wN2MwLS4wMi4wMi0uMDQuMDYtLjA4bDU3LjctNTcuNjljLjAzLS4wNC4wNS0uMDUuMDctLjA2YS4xMi4xMiAwIDAxLjA3IDBjLjAzIDAgLjA1LjAyLjA5LjA2TDUxMiA0NTQuMDdsMjg3LjctMjg3LjdjLjA0LS4wNC4wNi0uMDUuMDktLjA2YS4xMi4xMiAwIDAxLjA3IDB6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJjbG9zZVwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgQ2xvc2VPdXRsaW5lZDtcbiIsICJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xudmFyIGF0dHJpYnV0ZXMgPSBcImFjY2VwdCBhY2NlcHRDaGFyc2V0IGFjY2Vzc0tleSBhY3Rpb24gYWxsb3dGdWxsU2NyZWVuIGFsbG93VHJhbnNwYXJlbmN5XFxuICAgIGFsdCBhc3luYyBhdXRvQ29tcGxldGUgYXV0b0ZvY3VzIGF1dG9QbGF5IGNhcHR1cmUgY2VsbFBhZGRpbmcgY2VsbFNwYWNpbmcgY2hhbGxlbmdlXFxuICAgIGNoYXJTZXQgY2hlY2tlZCBjbGFzc0lEIGNsYXNzTmFtZSBjb2xTcGFuIGNvbHMgY29udGVudCBjb250ZW50RWRpdGFibGUgY29udGV4dE1lbnVcXG4gICAgY29udHJvbHMgY29vcmRzIGNyb3NzT3JpZ2luIGRhdGEgZGF0ZVRpbWUgZGVmYXVsdCBkZWZlciBkaXIgZGlzYWJsZWQgZG93bmxvYWQgZHJhZ2dhYmxlXFxuICAgIGVuY1R5cGUgZm9ybSBmb3JtQWN0aW9uIGZvcm1FbmNUeXBlIGZvcm1NZXRob2QgZm9ybU5vVmFsaWRhdGUgZm9ybVRhcmdldCBmcmFtZUJvcmRlclxcbiAgICBoZWFkZXJzIGhlaWdodCBoaWRkZW4gaGlnaCBocmVmIGhyZWZMYW5nIGh0bWxGb3IgaHR0cEVxdWl2IGljb24gaWQgaW5wdXRNb2RlIGludGVncml0eVxcbiAgICBpcyBrZXlQYXJhbXMga2V5VHlwZSBraW5kIGxhYmVsIGxhbmcgbGlzdCBsb29wIGxvdyBtYW5pZmVzdCBtYXJnaW5IZWlnaHQgbWFyZ2luV2lkdGggbWF4IG1heExlbmd0aCBtZWRpYVxcbiAgICBtZWRpYUdyb3VwIG1ldGhvZCBtaW4gbWluTGVuZ3RoIG11bHRpcGxlIG11dGVkIG5hbWUgbm9WYWxpZGF0ZSBub25jZSBvcGVuXFxuICAgIG9wdGltdW0gcGF0dGVybiBwbGFjZWhvbGRlciBwb3N0ZXIgcHJlbG9hZCByYWRpb0dyb3VwIHJlYWRPbmx5IHJlbCByZXF1aXJlZFxcbiAgICByZXZlcnNlZCByb2xlIHJvd1NwYW4gcm93cyBzYW5kYm94IHNjb3BlIHNjb3BlZCBzY3JvbGxpbmcgc2VhbWxlc3Mgc2VsZWN0ZWRcXG4gICAgc2hhcGUgc2l6ZSBzaXplcyBzcGFuIHNwZWxsQ2hlY2sgc3JjIHNyY0RvYyBzcmNMYW5nIHNyY1NldCBzdGFydCBzdGVwIHN0eWxlXFxuICAgIHN1bW1hcnkgdGFiSW5kZXggdGFyZ2V0IHRpdGxlIHR5cGUgdXNlTWFwIHZhbHVlIHdpZHRoIHdtb2RlIHdyYXBcIjtcbnZhciBldmVudHNOYW1lID0gXCJvbkNvcHkgb25DdXQgb25QYXN0ZSBvbkNvbXBvc2l0aW9uRW5kIG9uQ29tcG9zaXRpb25TdGFydCBvbkNvbXBvc2l0aW9uVXBkYXRlIG9uS2V5RG93blxcbiAgICBvbktleVByZXNzIG9uS2V5VXAgb25Gb2N1cyBvbkJsdXIgb25DaGFuZ2Ugb25JbnB1dCBvblN1Ym1pdCBvbkNsaWNrIG9uQ29udGV4dE1lbnUgb25Eb3VibGVDbGlja1xcbiAgICBvbkRyYWcgb25EcmFnRW5kIG9uRHJhZ0VudGVyIG9uRHJhZ0V4aXQgb25EcmFnTGVhdmUgb25EcmFnT3ZlciBvbkRyYWdTdGFydCBvbkRyb3Agb25Nb3VzZURvd25cXG4gICAgb25Nb3VzZUVudGVyIG9uTW91c2VMZWF2ZSBvbk1vdXNlTW92ZSBvbk1vdXNlT3V0IG9uTW91c2VPdmVyIG9uTW91c2VVcCBvblNlbGVjdCBvblRvdWNoQ2FuY2VsXFxuICAgIG9uVG91Y2hFbmQgb25Ub3VjaE1vdmUgb25Ub3VjaFN0YXJ0IG9uU2Nyb2xsIG9uV2hlZWwgb25BYm9ydCBvbkNhblBsYXkgb25DYW5QbGF5VGhyb3VnaFxcbiAgICBvbkR1cmF0aW9uQ2hhbmdlIG9uRW1wdGllZCBvbkVuY3J5cHRlZCBvbkVuZGVkIG9uRXJyb3Igb25Mb2FkZWREYXRhIG9uTG9hZGVkTWV0YWRhdGFcXG4gICAgb25Mb2FkU3RhcnQgb25QYXVzZSBvblBsYXkgb25QbGF5aW5nIG9uUHJvZ3Jlc3Mgb25SYXRlQ2hhbmdlIG9uU2Vla2VkIG9uU2Vla2luZyBvblN0YWxsZWQgb25TdXNwZW5kIG9uVGltZVVwZGF0ZSBvblZvbHVtZUNoYW5nZSBvbldhaXRpbmcgb25Mb2FkIG9uRXJyb3JcIjtcbnZhciBwcm9wTGlzdCA9IFwiXCIuY29uY2F0KGF0dHJpYnV0ZXMsIFwiIFwiKS5jb25jYXQoZXZlbnRzTmFtZSkuc3BsaXQoL1tcXHNcXG5dKy8pO1xuXG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4gKi9cbnZhciBhcmlhUHJlZml4ID0gJ2FyaWEtJztcbnZhciBkYXRhUHJlZml4ID0gJ2RhdGEtJztcbmZ1bmN0aW9uIG1hdGNoKGtleSwgcHJlZml4KSB7XG4gIHJldHVybiBrZXkuaW5kZXhPZihwcmVmaXgpID09PSAwO1xufVxuLyoqXG4gKiBQaWNrZXIgcHJvcHMgZnJvbSBleGlzdCBwcm9wcyB3aXRoIGZpbHRlclxuICogQHBhcmFtIHByb3BzIFBhc3NlZCBwcm9wc1xuICogQHBhcmFtIGFyaWFPbmx5IGJvb2xlYW4gfCB7IGFyaWE/OiBib29sZWFuOyBkYXRhPzogYm9vbGVhbjsgYXR0cj86IGJvb2xlYW47IH0gZmlsdGVyIGNvbmZpZ1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwaWNrQXR0cnMocHJvcHMpIHtcbiAgdmFyIGFyaWFPbmx5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcbiAgdmFyIG1lcmdlZENvbmZpZztcbiAgaWYgKGFyaWFPbmx5ID09PSBmYWxzZSkge1xuICAgIG1lcmdlZENvbmZpZyA9IHtcbiAgICAgIGFyaWE6IHRydWUsXG4gICAgICBkYXRhOiB0cnVlLFxuICAgICAgYXR0cjogdHJ1ZVxuICAgIH07XG4gIH0gZWxzZSBpZiAoYXJpYU9ubHkgPT09IHRydWUpIHtcbiAgICBtZXJnZWRDb25maWcgPSB7XG4gICAgICBhcmlhOiB0cnVlXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBtZXJnZWRDb25maWcgPSBfb2JqZWN0U3ByZWFkKHt9LCBhcmlhT25seSk7XG4gIH1cbiAgdmFyIGF0dHJzID0ge307XG4gIE9iamVjdC5rZXlzKHByb3BzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoXG4gICAgLy8gQXJpYVxuICAgIG1lcmdlZENvbmZpZy5hcmlhICYmIChrZXkgPT09ICdyb2xlJyB8fCBtYXRjaChrZXksIGFyaWFQcmVmaXgpKSB8fFxuICAgIC8vIERhdGFcbiAgICBtZXJnZWRDb25maWcuZGF0YSAmJiBtYXRjaChrZXksIGRhdGFQcmVmaXgpIHx8XG4gICAgLy8gQXR0clxuICAgIG1lcmdlZENvbmZpZy5hdHRyICYmIHByb3BMaXN0LmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIGF0dHJzW2tleV0gPSBwcm9wc1trZXldO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBhdHRycztcbn0iLCAiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCBmdW5jdGlvbiBpc0ZyYWdtZW50KGNoaWxkKSB7XG4gIHJldHVybiBjaGlsZCAmJiAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoY2hpbGQpICYmIGNoaWxkLnR5cGUgPT09IFJlYWN0LkZyYWdtZW50O1xufVxuZXhwb3J0IGNvbnN0IHJlcGxhY2VFbGVtZW50ID0gKGVsZW1lbnQsIHJlcGxhY2VtZW50LCBwcm9wcykgPT4ge1xuICBpZiAoISAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICByZXR1cm4gcmVwbGFjZW1lbnQ7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoZWxlbWVudCwgdHlwZW9mIHByb3BzID09PSAnZnVuY3Rpb24nID8gcHJvcHMoZWxlbWVudC5wcm9wcyB8fCB7fSkgOiBwcm9wcyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIGNsb25lRWxlbWVudChlbGVtZW50LCBwcm9wcykge1xuICByZXR1cm4gcmVwbGFjZUVsZW1lbnQoZWxlbWVudCwgZWxlbWVudCwgcHJvcHMpO1xufSIsICJpbXBvcnQgeyB1c2VUb2tlbiB9IGZyb20gJy4uLy4uL3RoZW1lL2ludGVybmFsJztcbi8qKlxuICogVGhpcyBob29rIGlzIG9ubHkgZm9yIGNzc1ZhciB0byBhZGQgcm9vdCBjbGFzc05hbWUgZm9yIGNvbXBvbmVudHMuXG4gKiBJZiByb290IENsYXNzTmFtZSBpcyBuZWVkZWQsIHRoaXMgaG9vayBjb3VsZCBiZSByZWZhY3RvcmVkIHdpdGggYC1yb290YFxuICogQHBhcmFtIHByZWZpeENsc1xuICovXG5jb25zdCB1c2VDU1NWYXJDbHMgPSBwcmVmaXhDbHMgPT4ge1xuICBjb25zdCBbLCwsLCBjc3NWYXJdID0gdXNlVG9rZW4oKTtcbiAgcmV0dXJuIGNzc1ZhciA/IGAke3ByZWZpeENsc30tY3NzLXZhcmAgOiAnJztcbn07XG5leHBvcnQgZGVmYXVsdCB1c2VDU1NWYXJDbHM7IiwgIi8qKlxuICogQGlnbm9yZVxuICogc29tZSBrZXktY29kZXMgZGVmaW5pdGlvbiBhbmQgdXRpbHMgZnJvbSBjbG9zdXJlLWxpYnJhcnlcbiAqIEBhdXRob3IgeWltaW5naGVAZ21haWwuY29tXG4gKi9cblxudmFyIEtleUNvZGUgPSB7XG4gIC8qKlxuICAgKiBNQUNfRU5URVJcbiAgICovXG4gIE1BQ19FTlRFUjogMyxcbiAgLyoqXG4gICAqIEJBQ0tTUEFDRVxuICAgKi9cbiAgQkFDS1NQQUNFOiA4LFxuICAvKipcbiAgICogVEFCXG4gICAqL1xuICBUQUI6IDksXG4gIC8qKlxuICAgKiBOVU1MT0NLIG9uIEZGL1NhZmFyaSBNYWNcbiAgICovXG4gIE5VTV9DRU5URVI6IDEyLFxuICAvLyBOVU1MT0NLIG9uIEZGL1NhZmFyaSBNYWNcbiAgLyoqXG4gICAqIEVOVEVSXG4gICAqL1xuICBFTlRFUjogMTMsXG4gIC8qKlxuICAgKiBTSElGVFxuICAgKi9cbiAgU0hJRlQ6IDE2LFxuICAvKipcbiAgICogQ1RSTFxuICAgKi9cbiAgQ1RSTDogMTcsXG4gIC8qKlxuICAgKiBBTFRcbiAgICovXG4gIEFMVDogMTgsXG4gIC8qKlxuICAgKiBQQVVTRVxuICAgKi9cbiAgUEFVU0U6IDE5LFxuICAvKipcbiAgICogQ0FQU19MT0NLXG4gICAqL1xuICBDQVBTX0xPQ0s6IDIwLFxuICAvKipcbiAgICogRVNDXG4gICAqL1xuICBFU0M6IDI3LFxuICAvKipcbiAgICogU1BBQ0VcbiAgICovXG4gIFNQQUNFOiAzMixcbiAgLyoqXG4gICAqIFBBR0VfVVBcbiAgICovXG4gIFBBR0VfVVA6IDMzLFxuICAvLyBhbHNvIE5VTV9OT1JUSF9FQVNUXG4gIC8qKlxuICAgKiBQQUdFX0RPV05cbiAgICovXG4gIFBBR0VfRE9XTjogMzQsXG4gIC8vIGFsc28gTlVNX1NPVVRIX0VBU1RcbiAgLyoqXG4gICAqIEVORFxuICAgKi9cbiAgRU5EOiAzNSxcbiAgLy8gYWxzbyBOVU1fU09VVEhfV0VTVFxuICAvKipcbiAgICogSE9NRVxuICAgKi9cbiAgSE9NRTogMzYsXG4gIC8vIGFsc28gTlVNX05PUlRIX1dFU1RcbiAgLyoqXG4gICAqIExFRlRcbiAgICovXG4gIExFRlQ6IDM3LFxuICAvLyBhbHNvIE5VTV9XRVNUXG4gIC8qKlxuICAgKiBVUFxuICAgKi9cbiAgVVA6IDM4LFxuICAvLyBhbHNvIE5VTV9OT1JUSFxuICAvKipcbiAgICogUklHSFRcbiAgICovXG4gIFJJR0hUOiAzOSxcbiAgLy8gYWxzbyBOVU1fRUFTVFxuICAvKipcbiAgICogRE9XTlxuICAgKi9cbiAgRE9XTjogNDAsXG4gIC8vIGFsc28gTlVNX1NPVVRIXG4gIC8qKlxuICAgKiBQUklOVF9TQ1JFRU5cbiAgICovXG4gIFBSSU5UX1NDUkVFTjogNDQsXG4gIC8qKlxuICAgKiBJTlNFUlRcbiAgICovXG4gIElOU0VSVDogNDUsXG4gIC8vIGFsc28gTlVNX0lOU0VSVFxuICAvKipcbiAgICogREVMRVRFXG4gICAqL1xuICBERUxFVEU6IDQ2LFxuICAvLyBhbHNvIE5VTV9ERUxFVEVcbiAgLyoqXG4gICAqIFpFUk9cbiAgICovXG4gIFpFUk86IDQ4LFxuICAvKipcbiAgICogT05FXG4gICAqL1xuICBPTkU6IDQ5LFxuICAvKipcbiAgICogVFdPXG4gICAqL1xuICBUV086IDUwLFxuICAvKipcbiAgICogVEhSRUVcbiAgICovXG4gIFRIUkVFOiA1MSxcbiAgLyoqXG4gICAqIEZPVVJcbiAgICovXG4gIEZPVVI6IDUyLFxuICAvKipcbiAgICogRklWRVxuICAgKi9cbiAgRklWRTogNTMsXG4gIC8qKlxuICAgKiBTSVhcbiAgICovXG4gIFNJWDogNTQsXG4gIC8qKlxuICAgKiBTRVZFTlxuICAgKi9cbiAgU0VWRU46IDU1LFxuICAvKipcbiAgICogRUlHSFRcbiAgICovXG4gIEVJR0hUOiA1NixcbiAgLyoqXG4gICAqIE5JTkVcbiAgICovXG4gIE5JTkU6IDU3LFxuICAvKipcbiAgICogUVVFU1RJT05fTUFSS1xuICAgKi9cbiAgUVVFU1RJT05fTUFSSzogNjMsXG4gIC8vIG5lZWRzIGxvY2FsaXphdGlvblxuICAvKipcbiAgICogQVxuICAgKi9cbiAgQTogNjUsXG4gIC8qKlxuICAgKiBCXG4gICAqL1xuICBCOiA2NixcbiAgLyoqXG4gICAqIENcbiAgICovXG4gIEM6IDY3LFxuICAvKipcbiAgICogRFxuICAgKi9cbiAgRDogNjgsXG4gIC8qKlxuICAgKiBFXG4gICAqL1xuICBFOiA2OSxcbiAgLyoqXG4gICAqIEZcbiAgICovXG4gIEY6IDcwLFxuICAvKipcbiAgICogR1xuICAgKi9cbiAgRzogNzEsXG4gIC8qKlxuICAgKiBIXG4gICAqL1xuICBIOiA3MixcbiAgLyoqXG4gICAqIElcbiAgICovXG4gIEk6IDczLFxuICAvKipcbiAgICogSlxuICAgKi9cbiAgSjogNzQsXG4gIC8qKlxuICAgKiBLXG4gICAqL1xuICBLOiA3NSxcbiAgLyoqXG4gICAqIExcbiAgICovXG4gIEw6IDc2LFxuICAvKipcbiAgICogTVxuICAgKi9cbiAgTTogNzcsXG4gIC8qKlxuICAgKiBOXG4gICAqL1xuICBOOiA3OCxcbiAgLyoqXG4gICAqIE9cbiAgICovXG4gIE86IDc5LFxuICAvKipcbiAgICogUFxuICAgKi9cbiAgUDogODAsXG4gIC8qKlxuICAgKiBRXG4gICAqL1xuICBROiA4MSxcbiAgLyoqXG4gICAqIFJcbiAgICovXG4gIFI6IDgyLFxuICAvKipcbiAgICogU1xuICAgKi9cbiAgUzogODMsXG4gIC8qKlxuICAgKiBUXG4gICAqL1xuICBUOiA4NCxcbiAgLyoqXG4gICAqIFVcbiAgICovXG4gIFU6IDg1LFxuICAvKipcbiAgICogVlxuICAgKi9cbiAgVjogODYsXG4gIC8qKlxuICAgKiBXXG4gICAqL1xuICBXOiA4NyxcbiAgLyoqXG4gICAqIFhcbiAgICovXG4gIFg6IDg4LFxuICAvKipcbiAgICogWVxuICAgKi9cbiAgWTogODksXG4gIC8qKlxuICAgKiBaXG4gICAqL1xuICBaOiA5MCxcbiAgLyoqXG4gICAqIE1FVEFcbiAgICovXG4gIE1FVEE6IDkxLFxuICAvLyBXSU5fS0VZX0xFRlRcbiAgLyoqXG4gICAqIFdJTl9LRVlfUklHSFRcbiAgICovXG4gIFdJTl9LRVlfUklHSFQ6IDkyLFxuICAvKipcbiAgICogQ09OVEVYVF9NRU5VXG4gICAqL1xuICBDT05URVhUX01FTlU6IDkzLFxuICAvKipcbiAgICogTlVNX1pFUk9cbiAgICovXG4gIE5VTV9aRVJPOiA5NixcbiAgLyoqXG4gICAqIE5VTV9PTkVcbiAgICovXG4gIE5VTV9PTkU6IDk3LFxuICAvKipcbiAgICogTlVNX1RXT1xuICAgKi9cbiAgTlVNX1RXTzogOTgsXG4gIC8qKlxuICAgKiBOVU1fVEhSRUVcbiAgICovXG4gIE5VTV9USFJFRTogOTksXG4gIC8qKlxuICAgKiBOVU1fRk9VUlxuICAgKi9cbiAgTlVNX0ZPVVI6IDEwMCxcbiAgLyoqXG4gICAqIE5VTV9GSVZFXG4gICAqL1xuICBOVU1fRklWRTogMTAxLFxuICAvKipcbiAgICogTlVNX1NJWFxuICAgKi9cbiAgTlVNX1NJWDogMTAyLFxuICAvKipcbiAgICogTlVNX1NFVkVOXG4gICAqL1xuICBOVU1fU0VWRU46IDEwMyxcbiAgLyoqXG4gICAqIE5VTV9FSUdIVFxuICAgKi9cbiAgTlVNX0VJR0hUOiAxMDQsXG4gIC8qKlxuICAgKiBOVU1fTklORVxuICAgKi9cbiAgTlVNX05JTkU6IDEwNSxcbiAgLyoqXG4gICAqIE5VTV9NVUxUSVBMWVxuICAgKi9cbiAgTlVNX01VTFRJUExZOiAxMDYsXG4gIC8qKlxuICAgKiBOVU1fUExVU1xuICAgKi9cbiAgTlVNX1BMVVM6IDEwNyxcbiAgLyoqXG4gICAqIE5VTV9NSU5VU1xuICAgKi9cbiAgTlVNX01JTlVTOiAxMDksXG4gIC8qKlxuICAgKiBOVU1fUEVSSU9EXG4gICAqL1xuICBOVU1fUEVSSU9EOiAxMTAsXG4gIC8qKlxuICAgKiBOVU1fRElWSVNJT05cbiAgICovXG4gIE5VTV9ESVZJU0lPTjogMTExLFxuICAvKipcbiAgICogRjFcbiAgICovXG4gIEYxOiAxMTIsXG4gIC8qKlxuICAgKiBGMlxuICAgKi9cbiAgRjI6IDExMyxcbiAgLyoqXG4gICAqIEYzXG4gICAqL1xuICBGMzogMTE0LFxuICAvKipcbiAgICogRjRcbiAgICovXG4gIEY0OiAxMTUsXG4gIC8qKlxuICAgKiBGNVxuICAgKi9cbiAgRjU6IDExNixcbiAgLyoqXG4gICAqIEY2XG4gICAqL1xuICBGNjogMTE3LFxuICAvKipcbiAgICogRjdcbiAgICovXG4gIEY3OiAxMTgsXG4gIC8qKlxuICAgKiBGOFxuICAgKi9cbiAgRjg6IDExOSxcbiAgLyoqXG4gICAqIEY5XG4gICAqL1xuICBGOTogMTIwLFxuICAvKipcbiAgICogRjEwXG4gICAqL1xuICBGMTA6IDEyMSxcbiAgLyoqXG4gICAqIEYxMVxuICAgKi9cbiAgRjExOiAxMjIsXG4gIC8qKlxuICAgKiBGMTJcbiAgICovXG4gIEYxMjogMTIzLFxuICAvKipcbiAgICogTlVNTE9DS1xuICAgKi9cbiAgTlVNTE9DSzogMTQ0LFxuICAvKipcbiAgICogU0VNSUNPTE9OXG4gICAqL1xuICBTRU1JQ09MT046IDE4NixcbiAgLy8gbmVlZHMgbG9jYWxpemF0aW9uXG4gIC8qKlxuICAgKiBEQVNIXG4gICAqL1xuICBEQVNIOiAxODksXG4gIC8vIG5lZWRzIGxvY2FsaXphdGlvblxuICAvKipcbiAgICogRVFVQUxTXG4gICAqL1xuICBFUVVBTFM6IDE4NyxcbiAgLy8gbmVlZHMgbG9jYWxpemF0aW9uXG4gIC8qKlxuICAgKiBDT01NQVxuICAgKi9cbiAgQ09NTUE6IDE4OCxcbiAgLy8gbmVlZHMgbG9jYWxpemF0aW9uXG4gIC8qKlxuICAgKiBQRVJJT0RcbiAgICovXG4gIFBFUklPRDogMTkwLFxuICAvLyBuZWVkcyBsb2NhbGl6YXRpb25cbiAgLyoqXG4gICAqIFNMQVNIXG4gICAqL1xuICBTTEFTSDogMTkxLFxuICAvLyBuZWVkcyBsb2NhbGl6YXRpb25cbiAgLyoqXG4gICAqIEFQT1NUUk9QSEVcbiAgICovXG4gIEFQT1NUUk9QSEU6IDE5MixcbiAgLy8gbmVlZHMgbG9jYWxpemF0aW9uXG4gIC8qKlxuICAgKiBTSU5HTEVfUVVPVEVcbiAgICovXG4gIFNJTkdMRV9RVU9URTogMjIyLFxuICAvLyBuZWVkcyBsb2NhbGl6YXRpb25cbiAgLyoqXG4gICAqIE9QRU5fU1FVQVJFX0JSQUNLRVRcbiAgICovXG4gIE9QRU5fU1FVQVJFX0JSQUNLRVQ6IDIxOSxcbiAgLy8gbmVlZHMgbG9jYWxpemF0aW9uXG4gIC8qKlxuICAgKiBCQUNLU0xBU0hcbiAgICovXG4gIEJBQ0tTTEFTSDogMjIwLFxuICAvLyBuZWVkcyBsb2NhbGl6YXRpb25cbiAgLyoqXG4gICAqIENMT1NFX1NRVUFSRV9CUkFDS0VUXG4gICAqL1xuICBDTE9TRV9TUVVBUkVfQlJBQ0tFVDogMjIxLFxuICAvLyBuZWVkcyBsb2NhbGl6YXRpb25cbiAgLyoqXG4gICAqIFdJTl9LRVlcbiAgICovXG4gIFdJTl9LRVk6IDIyNCxcbiAgLyoqXG4gICAqIE1BQ19GRl9NRVRBXG4gICAqL1xuICBNQUNfRkZfTUVUQTogMjI0LFxuICAvLyBGaXJlZm94IChHZWNrbykgZmlyZXMgdGhpcyBmb3IgdGhlIG1ldGEga2V5IGluc3RlYWQgb2YgOTFcbiAgLyoqXG4gICAqIFdJTl9JTUVcbiAgICovXG4gIFdJTl9JTUU6IDIyOSxcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IEZ1bmN0aW9uID09PT09PT09PT09PT09PT09PT09PT09PVxuICAvKipcbiAgICogd2hldGhlciB0ZXh0IGFuZCBtb2RpZmllZCBrZXkgaXMgZW50ZXJlZCBhdCB0aGUgc2FtZSB0aW1lLlxuICAgKi9cbiAgaXNUZXh0TW9kaWZ5aW5nS2V5RXZlbnQ6IGZ1bmN0aW9uIGlzVGV4dE1vZGlmeWluZ0tleUV2ZW50KGUpIHtcbiAgICB2YXIga2V5Q29kZSA9IGUua2V5Q29kZTtcbiAgICBpZiAoZS5hbHRLZXkgJiYgIWUuY3RybEtleSB8fCBlLm1ldGFLZXkgfHxcbiAgICAvLyBGdW5jdGlvbiBrZXlzIGRvbid0IGdlbmVyYXRlIHRleHRcbiAgICBrZXlDb2RlID49IEtleUNvZGUuRjEgJiYga2V5Q29kZSA8PSBLZXlDb2RlLkYxMikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFRoZSBmb2xsb3dpbmcga2V5cyBhcmUgcXVpdGUgaGFybWxlc3MsIGV2ZW4gaW4gY29tYmluYXRpb24gd2l0aFxuICAgIC8vIENUUkwsIEFMVCBvciBTSElGVC5cbiAgICBzd2l0Y2ggKGtleUNvZGUpIHtcbiAgICAgIGNhc2UgS2V5Q29kZS5BTFQ6XG4gICAgICBjYXNlIEtleUNvZGUuQ0FQU19MT0NLOlxuICAgICAgY2FzZSBLZXlDb2RlLkNPTlRFWFRfTUVOVTpcbiAgICAgIGNhc2UgS2V5Q29kZS5DVFJMOlxuICAgICAgY2FzZSBLZXlDb2RlLkRPV046XG4gICAgICBjYXNlIEtleUNvZGUuRU5EOlxuICAgICAgY2FzZSBLZXlDb2RlLkVTQzpcbiAgICAgIGNhc2UgS2V5Q29kZS5IT01FOlxuICAgICAgY2FzZSBLZXlDb2RlLklOU0VSVDpcbiAgICAgIGNhc2UgS2V5Q29kZS5MRUZUOlxuICAgICAgY2FzZSBLZXlDb2RlLk1BQ19GRl9NRVRBOlxuICAgICAgY2FzZSBLZXlDb2RlLk1FVEE6XG4gICAgICBjYXNlIEtleUNvZGUuTlVNTE9DSzpcbiAgICAgIGNhc2UgS2V5Q29kZS5OVU1fQ0VOVEVSOlxuICAgICAgY2FzZSBLZXlDb2RlLlBBR0VfRE9XTjpcbiAgICAgIGNhc2UgS2V5Q29kZS5QQUdFX1VQOlxuICAgICAgY2FzZSBLZXlDb2RlLlBBVVNFOlxuICAgICAgY2FzZSBLZXlDb2RlLlBSSU5UX1NDUkVFTjpcbiAgICAgIGNhc2UgS2V5Q29kZS5SSUdIVDpcbiAgICAgIGNhc2UgS2V5Q29kZS5TSElGVDpcbiAgICAgIGNhc2UgS2V5Q29kZS5VUDpcbiAgICAgIGNhc2UgS2V5Q29kZS5XSU5fS0VZOlxuICAgICAgY2FzZSBLZXlDb2RlLldJTl9LRVlfUklHSFQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIHdoZXRoZXIgY2hhcmFjdGVyIGlzIGVudGVyZWQuXG4gICAqL1xuICBpc0NoYXJhY3RlcktleTogZnVuY3Rpb24gaXNDaGFyYWN0ZXJLZXkoa2V5Q29kZSkge1xuICAgIGlmIChrZXlDb2RlID49IEtleUNvZGUuWkVSTyAmJiBrZXlDb2RlIDw9IEtleUNvZGUuTklORSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChrZXlDb2RlID49IEtleUNvZGUuTlVNX1pFUk8gJiYga2V5Q29kZSA8PSBLZXlDb2RlLk5VTV9NVUxUSVBMWSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChrZXlDb2RlID49IEtleUNvZGUuQSAmJiBrZXlDb2RlIDw9IEtleUNvZGUuWikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gU2FmYXJpIHNlbmRzIHplcm8ga2V5IGNvZGUgZm9yIG5vbi1sYXRpbiBjaGFyYWN0ZXJzLlxuICAgIGlmICh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdXZWJLaXQnKSAhPT0gLTEgJiYga2V5Q29kZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHN3aXRjaCAoa2V5Q29kZSkge1xuICAgICAgY2FzZSBLZXlDb2RlLlNQQUNFOlxuICAgICAgY2FzZSBLZXlDb2RlLlFVRVNUSU9OX01BUks6XG4gICAgICBjYXNlIEtleUNvZGUuTlVNX1BMVVM6XG4gICAgICBjYXNlIEtleUNvZGUuTlVNX01JTlVTOlxuICAgICAgY2FzZSBLZXlDb2RlLk5VTV9QRVJJT0Q6XG4gICAgICBjYXNlIEtleUNvZGUuTlVNX0RJVklTSU9OOlxuICAgICAgY2FzZSBLZXlDb2RlLlNFTUlDT0xPTjpcbiAgICAgIGNhc2UgS2V5Q29kZS5EQVNIOlxuICAgICAgY2FzZSBLZXlDb2RlLkVRVUFMUzpcbiAgICAgIGNhc2UgS2V5Q29kZS5DT01NQTpcbiAgICAgIGNhc2UgS2V5Q29kZS5QRVJJT0Q6XG4gICAgICBjYXNlIEtleUNvZGUuU0xBU0g6XG4gICAgICBjYXNlIEtleUNvZGUuQVBPU1RST1BIRTpcbiAgICAgIGNhc2UgS2V5Q29kZS5TSU5HTEVfUVVPVEU6XG4gICAgICBjYXNlIEtleUNvZGUuT1BFTl9TUVVBUkVfQlJBQ0tFVDpcbiAgICAgIGNhc2UgS2V5Q29kZS5CQUNLU0xBU0g6XG4gICAgICBjYXNlIEtleUNvZGUuQ0xPU0VfU1FVQVJFX0JSQUNLRVQ6XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufTtcbmV4cG9ydCBkZWZhdWx0IEtleUNvZGU7IiwgImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IExvYWRpbmdPdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9Mb2FkaW5nT3V0bGluZWRcIjtcbmltcG9ydCBBbnRkSWNvbiBmcm9tIFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiO1xudmFyIExvYWRpbmdPdXRsaW5lZCA9IGZ1bmN0aW9uIExvYWRpbmdPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbnRkSWNvbiwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogTG9hZGluZ091dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5cbi8qKiFbbG9hZGluZ10oZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTlRBaUlHaGxhV2RvZEQwaU5UQWlJR1pwYkd3OUlpTmpZV05oWTJFaUlIWnBaWGRDYjNnOUlqQWdNQ0F4TURJMElERXdNalFpSUdadlkzVnpZV0pzWlQwaVptRnNjMlVpSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUkrUEhCaGRHZ2daRDBpVFRrNE9DQTFORGhqTFRFNUxqa2dNQzB6TmkweE5pNHhMVE0yTFRNMklEQXROVGt1TkMweE1TNDJMVEV4Tnkwek5DNDJMVEUzTVM0ellUUTBNQzQwTlNBME5EQXVORFVnTUNBd01DMDVOQzR6TFRFek9TNDVJRFF6Tnk0M01TQTBNemN1TnpFZ01DQXdNQzB4TXprdU9TMDVOQzR6UXpZeU9TQTRNeTQySURVM01TNDBJRGN5SURVeE1pQTNNbU10TVRrdU9TQXdMVE0yTFRFMkxqRXRNell0TXpaek1UWXVNUzB6TmlBek5pMHpObU0yT1M0eElEQWdNVE0yTGpJZ01UTXVOU0F4T1RrdU15QTBNQzR6UXpjM01pNHpJRFkySURneU55QXhNRE1nT0RjMElERTFNR00wTnlBME55QTRNeTQ1SURFd01TNDRJREV3T1M0M0lERTJNaTQzSURJMkxqY2dOak11TVNBME1DNHlJREV6TUM0eUlEUXdMaklnTVRrNUxqTXVNU0F4T1M0NUxURTJJRE0yTFRNMUxqa2dNelo2SWlBdlBqd3ZjM1puUGc9PSkgKi9cbnZhciBSZWZJY29uID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoTG9hZGluZ091dGxpbmVkKTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFJlZkljb24uZGlzcGxheU5hbWUgPSAnTG9hZGluZ091dGxpbmVkJztcbn1cbmV4cG9ydCBkZWZhdWx0IFJlZkljb247IiwgIi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxudmFyIExvYWRpbmdPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjAgMCAxMDI0IDEwMjRcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNOTg4IDU0OGMtMTkuOSAwLTM2LTE2LjEtMzYtMzYgMC01OS40LTExLjYtMTE3LTM0LjYtMTcxLjNhNDQwLjQ1IDQ0MC40NSAwIDAwLTk0LjMtMTM5LjkgNDM3LjcxIDQzNy43MSAwIDAwLTEzOS45LTk0LjNDNjI5IDgzLjYgNTcxLjQgNzIgNTEyIDcyYy0xOS45IDAtMzYtMTYuMS0zNi0zNnMxNi4xLTM2IDM2LTM2YzY5LjEgMCAxMzYuMiAxMy41IDE5OS4zIDQwLjNDNzcyLjMgNjYgODI3IDEwMyA4NzQgMTUwYzQ3IDQ3IDgzLjkgMTAxLjggMTA5LjcgMTYyLjcgMjYuNyA2My4xIDQwLjIgMTMwLjIgNDAuMiAxOTkuMy4xIDE5LjktMTYgMzYtMzUuOSAzNnpcIiB9IH1dIH0sIFwibmFtZVwiOiBcImxvYWRpbmdcIiwgXCJ0aGVtZVwiOiBcIm91dGxpbmVkXCIgfTtcbmV4cG9ydCBkZWZhdWx0IExvYWRpbmdPdXRsaW5lZDtcbiIsICJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZVRva2VuIGZyb20gJy4uLy4uL3RoZW1lL3VzZVRva2VuJztcbmltcG9ydCB7IGRldlVzZVdhcm5pbmcgfSBmcm9tICcuLi93YXJuaW5nJztcbmltcG9ydCB6SW5kZXhDb250ZXh0IGZyb20gJy4uL3ppbmRleENvbnRleHQnO1xuLy8gWi1JbmRleCBjb250cm9sIHJhbmdlXG4vLyBDb250YWluZXI6IDEwMDAgKyBvZmZzZXQgMTAwIChtYXggYmFzZSArIDEwICogb2Zmc2V0ID0gMjAwMClcbi8vIFBvcG92ZXI6IG9mZnNldCA1MFxuLy8gTm90aWZpY2F0aW9uOiBDb250YWluZXIgTWF4IHpJbmRleCArIGNvbXBvbmVudE9mZnNldFxuY29uc3QgQ09OVEFJTkVSX09GRlNFVCA9IDEwMDtcbmNvbnN0IENPTlRBSU5FUl9PRkZTRVRfTUFYX0NPVU5UID0gMTA7XG5leHBvcnQgY29uc3QgQ09OVEFJTkVSX01BWF9PRkZTRVQgPSBDT05UQUlORVJfT0ZGU0VUICogQ09OVEFJTkVSX09GRlNFVF9NQVhfQ09VTlQ7XG4vKipcbiAqIFN0YXRpYyBmdW5jdGlvbiB3aWxsIGRlZmF1bHQgYmUgdGhlIGBDT05UQUlORVJfTUFYX09GRlNFVGAuXG4gKiBCdXQgaXQgc3RpbGwgbWF5IGhhdmUgY2hpbGRyZW4gY29tcG9uZW50IGxpa2UgU2VsZWN0LCBEcm9wZG93bi5cbiAqIFNvIHRoZSB3YXJuaW5nIHpJbmRleCBzaG91bGQgZXhjZWVkIHRoZSBgQ09OVEFJTkVSX01BWF9PRkZTRVRgLlxuICovXG5jb25zdCBDT05UQUlORVJfTUFYX09GRlNFVF9XSVRIX0NISUxEUkVOID0gQ09OVEFJTkVSX01BWF9PRkZTRVQgKyBDT05UQUlORVJfT0ZGU0VUO1xuZXhwb3J0IGNvbnN0IGNvbnRhaW5lckJhc2VaSW5kZXhPZmZzZXQgPSB7XG4gIE1vZGFsOiBDT05UQUlORVJfT0ZGU0VULFxuICBEcmF3ZXI6IENPTlRBSU5FUl9PRkZTRVQsXG4gIFBvcG92ZXI6IENPTlRBSU5FUl9PRkZTRVQsXG4gIFBvcGNvbmZpcm06IENPTlRBSU5FUl9PRkZTRVQsXG4gIFRvb2x0aXA6IENPTlRBSU5FUl9PRkZTRVQsXG4gIFRvdXI6IENPTlRBSU5FUl9PRkZTRVQsXG4gIEZsb2F0QnV0dG9uOiBDT05UQUlORVJfT0ZGU0VUXG59O1xuZXhwb3J0IGNvbnN0IGNvbnN1bWVyQmFzZVpJbmRleE9mZnNldCA9IHtcbiAgU2VsZWN0TGlrZTogNTAsXG4gIERyb3Bkb3duOiA1MCxcbiAgRGF0ZVBpY2tlcjogNTAsXG4gIE1lbnU6IDUwLFxuICBJbWFnZVByZXZpZXc6IDFcbn07XG5mdW5jdGlvbiBpc0NvbnRhaW5lclR5cGUodHlwZSkge1xuICByZXR1cm4gdHlwZSBpbiBjb250YWluZXJCYXNlWkluZGV4T2Zmc2V0O1xufVxuZXhwb3J0IGNvbnN0IHVzZVpJbmRleCA9IChjb21wb25lbnRUeXBlLCBjdXN0b21aSW5kZXgpID0+IHtcbiAgY29uc3QgWywgdG9rZW5dID0gdXNlVG9rZW4oKTtcbiAgY29uc3QgcGFyZW50WkluZGV4ID0gUmVhY3QudXNlQ29udGV4dCh6SW5kZXhDb250ZXh0KTtcbiAgY29uc3QgaXNDb250YWluZXIgPSBpc0NvbnRhaW5lclR5cGUoY29tcG9uZW50VHlwZSk7XG4gIGxldCByZXN1bHQ7XG4gIGlmIChjdXN0b21aSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgIHJlc3VsdCA9IFtjdXN0b21aSW5kZXgsIGN1c3RvbVpJbmRleF07XG4gIH0gZWxzZSB7XG4gICAgbGV0IHpJbmRleCA9IHBhcmVudFpJbmRleCAhPT0gbnVsbCAmJiBwYXJlbnRaSW5kZXggIT09IHZvaWQgMCA/IHBhcmVudFpJbmRleCA6IDA7XG4gICAgaWYgKGlzQ29udGFpbmVyKSB7XG4gICAgICB6SW5kZXggKz1cbiAgICAgIC8vIFVzZSBwcmVzZXQgdG9rZW4gekluZGV4IGJ5IGRlZmF1bHQgYnV0IG5vdCBzdGFjayB3aGVuIGhhcyBwYXJlbnQgY29udGFpbmVyXG4gICAgICAocGFyZW50WkluZGV4ID8gMCA6IHRva2VuLnpJbmRleFBvcHVwQmFzZSkgK1xuICAgICAgLy8gQ29udGFpbmVyIG9mZnNldFxuICAgICAgY29udGFpbmVyQmFzZVpJbmRleE9mZnNldFtjb21wb25lbnRUeXBlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgekluZGV4ICs9IGNvbnN1bWVyQmFzZVpJbmRleE9mZnNldFtjb21wb25lbnRUeXBlXTtcbiAgICB9XG4gICAgcmVzdWx0ID0gW3BhcmVudFpJbmRleCA9PT0gdW5kZWZpbmVkID8gY3VzdG9tWkluZGV4IDogekluZGV4LCB6SW5kZXhdO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgY29uc3Qgd2FybmluZyA9IGRldlVzZVdhcm5pbmcoY29tcG9uZW50VHlwZSk7XG4gICAgY29uc3QgbWF4WkluZGV4ID0gdG9rZW4uekluZGV4UG9wdXBCYXNlICsgQ09OVEFJTkVSX01BWF9PRkZTRVRfV0lUSF9DSElMRFJFTjtcbiAgICBjb25zdCBjdXJyZW50WkluZGV4ID0gcmVzdWx0WzBdIHx8IDA7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhjdXN0b21aSW5kZXggIT09IHVuZGVmaW5lZCB8fCBjdXJyZW50WkluZGV4IDw9IG1heFpJbmRleCwgJ3VzYWdlJywgJ2B6SW5kZXhgIGlzIG92ZXIgZGVzaWduIHRva2VuIGB6SW5kZXhQb3B1cEJhc2VgIHRvbyBtdWNoLiBJdCBtYXkgY2F1c2UgdW5leHBlY3RlZCBvdmVycmlkZS4nKSA6IHZvaWQgMDtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTsiLCAiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmNvbnN0IHpJbmRleENvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh1bmRlZmluZWQpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgekluZGV4Q29udGV4dC5kaXNwbGF5TmFtZSA9ICd6SW5kZXhDb250ZXh0Jztcbn1cbmV4cG9ydCBkZWZhdWx0IHpJbmRleENvbnRleHQ7IiwgIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgKiBhcyBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IHsgcmVuZGVyLCB1bm1vdW50IH0gZnJvbSBcInJjLXV0aWwvZXMvUmVhY3QvcmVuZGVyXCI7XG5pbXBvcnQgd2FybmluZyBmcm9tICcuLi9fdXRpbC93YXJuaW5nJztcbmNvbnN0IGRlZmF1bHRSZWFjdFJlbmRlciA9IChub2RlLCBjb250YWluZXIpID0+IHtcbiAgLy8gVE9ETzogUmVtb3ZlIGluIHY2XG4gIC8vIFdhcm5pbmcgZm9yIFJlYWN0IDE5XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgY29uc3QgbWFqb3JWZXJzaW9uID0gcGFyc2VJbnQoUmVhY3QudmVyc2lvbi5zcGxpdCgnLicpWzBdLCAxMCk7XG4gICAgY29uc3QgZnVsbEtleXMgPSBPYmplY3Qua2V5cyhSZWFjdERPTSk7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhtYWpvclZlcnNpb24gPCAxOSB8fCBmdWxsS2V5cy5pbmNsdWRlcygnY3JlYXRlUm9vdCcpLCAnY29tcGF0aWJsZScsICdhbnRkIHY1IHN1cHBvcnQgUmVhY3QgaXMgMTYgfiAxOC4gc2VlIGh0dHBzOi8vdS5hbnQuZGVzaWduL3Y1LWZvci0xOSBmb3IgY29tcGF0aWJsZS4nKSA6IHZvaWQgMDtcbiAgfVxuICByZW5kZXIobm9kZSwgY29udGFpbmVyKTtcbiAgcmV0dXJuICgpID0+IHtcbiAgICByZXR1cm4gdW5tb3VudChjb250YWluZXIpO1xuICB9O1xufTtcbmxldCB1bnN0YWJsZVJlbmRlciA9IGRlZmF1bHRSZWFjdFJlbmRlcjtcbi8qKlxuICogQGRlcHJlY2F0ZWQgU2V0IFJlYWN0IHJlbmRlciBmdW5jdGlvbiBmb3IgY29tcGF0aWJsZSB1c2FnZS5cbiAqIFRoaXMgaXMgaW50ZXJuYWwgdXNhZ2Ugb25seSBjb21wYXRpYmxlIHdpdGggUmVhY3QgMTkuXG4gKiBBbmQgd2lsbCBiZSByZW1vdmVkIGluIG5leHQgbWFqb3IgdmVyc2lvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuc3RhYmxlU2V0UmVuZGVyKHJlbmRlcikge1xuICB1bnN0YWJsZVJlbmRlciA9IHJlbmRlcjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWFjdFJlbmRlcigpIHtcbiAgcmV0dXJuIHVuc3RhYmxlUmVuZGVyO1xufSIsICJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiLi90eXBlb2YuanNcIjtcbmZ1bmN0aW9uIF9yZWdlbmVyYXRvclJ1bnRpbWUoKSB7XG4gIFwidXNlIHN0cmljdFwiOyAvKiEgcmVnZW5lcmF0b3ItcnVudGltZSAtLSBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4gLS0gbGljZW5zZSAoTUlUKTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL2Jsb2IvbWFpbi9MSUNFTlNFICovXG4gIF9yZWdlbmVyYXRvclJ1bnRpbWUgPSBmdW5jdGlvbiBfcmVnZW5lcmF0b3JSdW50aW1lKCkge1xuICAgIHJldHVybiBlO1xuICB9O1xuICB2YXIgdCxcbiAgICBlID0ge30sXG4gICAgciA9IE9iamVjdC5wcm90b3R5cGUsXG4gICAgbiA9IHIuaGFzT3duUHJvcGVydHksXG4gICAgbyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSB8fCBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgdFtlXSA9IHIudmFsdWU7XG4gICAgfSxcbiAgICBpID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgPyBTeW1ib2wgOiB7fSxcbiAgICBhID0gaS5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIixcbiAgICBjID0gaS5hc3luY0l0ZXJhdG9yIHx8IFwiQEBhc3luY0l0ZXJhdG9yXCIsXG4gICAgdSA9IGkudG9TdHJpbmdUYWcgfHwgXCJAQHRvU3RyaW5nVGFnXCI7XG4gIGZ1bmN0aW9uIGRlZmluZSh0LCBlLCByKSB7XG4gICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBlLCB7XG4gICAgICB2YWx1ZTogcixcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgIHdyaXRhYmxlOiAhMFxuICAgIH0pLCB0W2VdO1xuICB9XG4gIHRyeSB7XG4gICAgZGVmaW5lKHt9LCBcIlwiKTtcbiAgfSBjYXRjaCAodCkge1xuICAgIGRlZmluZSA9IGZ1bmN0aW9uIGRlZmluZSh0LCBlLCByKSB7XG4gICAgICByZXR1cm4gdFtlXSA9IHI7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiB3cmFwKHQsIGUsIHIsIG4pIHtcbiAgICB2YXIgaSA9IGUgJiYgZS5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IgPyBlIDogR2VuZXJhdG9yLFxuICAgICAgYSA9IE9iamVjdC5jcmVhdGUoaS5wcm90b3R5cGUpLFxuICAgICAgYyA9IG5ldyBDb250ZXh0KG4gfHwgW10pO1xuICAgIHJldHVybiBvKGEsIFwiX2ludm9rZVwiLCB7XG4gICAgICB2YWx1ZTogbWFrZUludm9rZU1ldGhvZCh0LCByLCBjKVxuICAgIH0pLCBhO1xuICB9XG4gIGZ1bmN0aW9uIHRyeUNhdGNoKHQsIGUsIHIpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJub3JtYWxcIixcbiAgICAgICAgYXJnOiB0LmNhbGwoZSwgcilcbiAgICAgIH07XG4gICAgfSBjYXRjaCAodCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJ0aHJvd1wiLFxuICAgICAgICBhcmc6IHRcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIGUud3JhcCA9IHdyYXA7XG4gIHZhciBoID0gXCJzdXNwZW5kZWRTdGFydFwiLFxuICAgIGwgPSBcInN1c3BlbmRlZFlpZWxkXCIsXG4gICAgZiA9IFwiZXhlY3V0aW5nXCIsXG4gICAgcyA9IFwiY29tcGxldGVkXCIsXG4gICAgeSA9IHt9O1xuICBmdW5jdGlvbiBHZW5lcmF0b3IoKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvbigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge31cbiAgdmFyIHAgPSB7fTtcbiAgZGVmaW5lKHAsIGEsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSk7XG4gIHZhciBkID0gT2JqZWN0LmdldFByb3RvdHlwZU9mLFxuICAgIHYgPSBkICYmIGQoZCh2YWx1ZXMoW10pKSk7XG4gIHYgJiYgdiAhPT0gciAmJiBuLmNhbGwodiwgYSkgJiYgKHAgPSB2KTtcbiAgdmFyIGcgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPSBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShwKTtcbiAgZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHQpIHtcbiAgICBbXCJuZXh0XCIsIFwidGhyb3dcIiwgXCJyZXR1cm5cIl0uZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgICAgZGVmaW5lKHQsIGUsIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UoZSwgdCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBBc3luY0l0ZXJhdG9yKHQsIGUpIHtcbiAgICBmdW5jdGlvbiBpbnZva2UociwgbywgaSwgYSkge1xuICAgICAgdmFyIGMgPSB0cnlDYXRjaCh0W3JdLCB0LCBvKTtcbiAgICAgIGlmIChcInRocm93XCIgIT09IGMudHlwZSkge1xuICAgICAgICB2YXIgdSA9IGMuYXJnLFxuICAgICAgICAgIGggPSB1LnZhbHVlO1xuICAgICAgICByZXR1cm4gaCAmJiBcIm9iamVjdFwiID09IF90eXBlb2YoaCkgJiYgbi5jYWxsKGgsIFwiX19hd2FpdFwiKSA/IGUucmVzb2x2ZShoLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICBpbnZva2UoXCJuZXh0XCIsIHQsIGksIGEpO1xuICAgICAgICB9LCBmdW5jdGlvbiAodCkge1xuICAgICAgICAgIGludm9rZShcInRocm93XCIsIHQsIGksIGEpO1xuICAgICAgICB9KSA6IGUucmVzb2x2ZShoKS50aGVuKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgdS52YWx1ZSA9IHQsIGkodSk7XG4gICAgICAgIH0sIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgcmV0dXJuIGludm9rZShcInRocm93XCIsIHQsIGksIGEpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGEoYy5hcmcpO1xuICAgIH1cbiAgICB2YXIgcjtcbiAgICBvKHRoaXMsIFwiX2ludm9rZVwiLCB7XG4gICAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUodCwgbikge1xuICAgICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IGUoZnVuY3Rpb24gKGUsIHIpIHtcbiAgICAgICAgICAgIGludm9rZSh0LCBuLCBlLCByKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gciA9IHIgPyByLnRoZW4oY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcsIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKSA6IGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChlLCByLCBuKSB7XG4gICAgdmFyIG8gPSBoO1xuICAgIHJldHVybiBmdW5jdGlvbiAoaSwgYSkge1xuICAgICAgaWYgKG8gPT09IGYpIHRocm93IEVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZ1wiKTtcbiAgICAgIGlmIChvID09PSBzKSB7XG4gICAgICAgIGlmIChcInRocm93XCIgPT09IGkpIHRocm93IGE7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdmFsdWU6IHQsXG4gICAgICAgICAgZG9uZTogITBcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGZvciAobi5tZXRob2QgPSBpLCBuLmFyZyA9IGE7Oykge1xuICAgICAgICB2YXIgYyA9IG4uZGVsZWdhdGU7XG4gICAgICAgIGlmIChjKSB7XG4gICAgICAgICAgdmFyIHUgPSBtYXliZUludm9rZURlbGVnYXRlKGMsIG4pO1xuICAgICAgICAgIGlmICh1KSB7XG4gICAgICAgICAgICBpZiAodSA9PT0geSkgY29udGludWU7XG4gICAgICAgICAgICByZXR1cm4gdTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFwibmV4dFwiID09PSBuLm1ldGhvZCkgbi5zZW50ID0gbi5fc2VudCA9IG4uYXJnO2Vsc2UgaWYgKFwidGhyb3dcIiA9PT0gbi5tZXRob2QpIHtcbiAgICAgICAgICBpZiAobyA9PT0gaCkgdGhyb3cgbyA9IHMsIG4uYXJnO1xuICAgICAgICAgIG4uZGlzcGF0Y2hFeGNlcHRpb24obi5hcmcpO1xuICAgICAgICB9IGVsc2UgXCJyZXR1cm5cIiA9PT0gbi5tZXRob2QgJiYgbi5hYnJ1cHQoXCJyZXR1cm5cIiwgbi5hcmcpO1xuICAgICAgICBvID0gZjtcbiAgICAgICAgdmFyIHAgPSB0cnlDYXRjaChlLCByLCBuKTtcbiAgICAgICAgaWYgKFwibm9ybWFsXCIgPT09IHAudHlwZSkge1xuICAgICAgICAgIGlmIChvID0gbi5kb25lID8gcyA6IGwsIHAuYXJnID09PSB5KSBjb250aW51ZTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHAuYXJnLFxuICAgICAgICAgICAgZG9uZTogbi5kb25lXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBcInRocm93XCIgPT09IHAudHlwZSAmJiAobyA9IHMsIG4ubWV0aG9kID0gXCJ0aHJvd1wiLCBuLmFyZyA9IHAuYXJnKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZSwgcikge1xuICAgIHZhciBuID0gci5tZXRob2QsXG4gICAgICBvID0gZS5pdGVyYXRvcltuXTtcbiAgICBpZiAobyA9PT0gdCkgcmV0dXJuIHIuZGVsZWdhdGUgPSBudWxsLCBcInRocm93XCIgPT09IG4gJiYgZS5pdGVyYXRvcltcInJldHVyblwiXSAmJiAoci5tZXRob2QgPSBcInJldHVyblwiLCByLmFyZyA9IHQsIG1heWJlSW52b2tlRGVsZWdhdGUoZSwgciksIFwidGhyb3dcIiA9PT0gci5tZXRob2QpIHx8IFwicmV0dXJuXCIgIT09IG4gJiYgKHIubWV0aG9kID0gXCJ0aHJvd1wiLCByLmFyZyA9IG5ldyBUeXBlRXJyb3IoXCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICdcIiArIG4gKyBcIicgbWV0aG9kXCIpKSwgeTtcbiAgICB2YXIgaSA9IHRyeUNhdGNoKG8sIGUuaXRlcmF0b3IsIHIuYXJnKTtcbiAgICBpZiAoXCJ0aHJvd1wiID09PSBpLnR5cGUpIHJldHVybiByLm1ldGhvZCA9IFwidGhyb3dcIiwgci5hcmcgPSBpLmFyZywgci5kZWxlZ2F0ZSA9IG51bGwsIHk7XG4gICAgdmFyIGEgPSBpLmFyZztcbiAgICByZXR1cm4gYSA/IGEuZG9uZSA/IChyW2UucmVzdWx0TmFtZV0gPSBhLnZhbHVlLCByLm5leHQgPSBlLm5leHRMb2MsIFwicmV0dXJuXCIgIT09IHIubWV0aG9kICYmIChyLm1ldGhvZCA9IFwibmV4dFwiLCByLmFyZyA9IHQpLCByLmRlbGVnYXRlID0gbnVsbCwgeSkgOiBhIDogKHIubWV0aG9kID0gXCJ0aHJvd1wiLCByLmFyZyA9IG5ldyBUeXBlRXJyb3IoXCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdFwiKSwgci5kZWxlZ2F0ZSA9IG51bGwsIHkpO1xuICB9XG4gIGZ1bmN0aW9uIHB1c2hUcnlFbnRyeSh0KSB7XG4gICAgdmFyIGUgPSB7XG4gICAgICB0cnlMb2M6IHRbMF1cbiAgICB9O1xuICAgIDEgaW4gdCAmJiAoZS5jYXRjaExvYyA9IHRbMV0pLCAyIGluIHQgJiYgKGUuZmluYWxseUxvYyA9IHRbMl0sIGUuYWZ0ZXJMb2MgPSB0WzNdKSwgdGhpcy50cnlFbnRyaWVzLnB1c2goZSk7XG4gIH1cbiAgZnVuY3Rpb24gcmVzZXRUcnlFbnRyeSh0KSB7XG4gICAgdmFyIGUgPSB0LmNvbXBsZXRpb24gfHwge307XG4gICAgZS50eXBlID0gXCJub3JtYWxcIiwgZGVsZXRlIGUuYXJnLCB0LmNvbXBsZXRpb24gPSBlO1xuICB9XG4gIGZ1bmN0aW9uIENvbnRleHQodCkge1xuICAgIHRoaXMudHJ5RW50cmllcyA9IFt7XG4gICAgICB0cnlMb2M6IFwicm9vdFwiXG4gICAgfV0sIHQuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpLCB0aGlzLnJlc2V0KCEwKTtcbiAgfVxuICBmdW5jdGlvbiB2YWx1ZXMoZSkge1xuICAgIGlmIChlIHx8IFwiXCIgPT09IGUpIHtcbiAgICAgIHZhciByID0gZVthXTtcbiAgICAgIGlmIChyKSByZXR1cm4gci5jYWxsKGUpO1xuICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgZS5uZXh0KSByZXR1cm4gZTtcbiAgICAgIGlmICghaXNOYU4oZS5sZW5ndGgpKSB7XG4gICAgICAgIHZhciBvID0gLTEsXG4gICAgICAgICAgaSA9IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgICBmb3IgKDsgKytvIDwgZS5sZW5ndGg7KSBpZiAobi5jYWxsKGUsIG8pKSByZXR1cm4gbmV4dC52YWx1ZSA9IGVbb10sIG5leHQuZG9uZSA9ICExLCBuZXh0O1xuICAgICAgICAgICAgcmV0dXJuIG5leHQudmFsdWUgPSB0LCBuZXh0LmRvbmUgPSAhMCwgbmV4dDtcbiAgICAgICAgICB9O1xuICAgICAgICByZXR1cm4gaS5uZXh0ID0gaTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihfdHlwZW9mKGUpICsgXCIgaXMgbm90IGl0ZXJhYmxlXCIpO1xuICB9XG4gIHJldHVybiBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgbyhnLCBcImNvbnN0cnVjdG9yXCIsIHtcbiAgICB2YWx1ZTogR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsXG4gICAgY29uZmlndXJhYmxlOiAhMFxuICB9KSwgbyhHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgXCJjb25zdHJ1Y3RvclwiLCB7XG4gICAgdmFsdWU6IEdlbmVyYXRvckZ1bmN0aW9uLFxuICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgfSksIEdlbmVyYXRvckZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gZGVmaW5lKEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCB1LCBcIkdlbmVyYXRvckZ1bmN0aW9uXCIpLCBlLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbiAodCkge1xuICAgIHZhciBlID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiB0ICYmIHQuY29uc3RydWN0b3I7XG4gICAgcmV0dXJuICEhZSAmJiAoZSA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHwgXCJHZW5lcmF0b3JGdW5jdGlvblwiID09PSAoZS5kaXNwbGF5TmFtZSB8fCBlLm5hbWUpKTtcbiAgfSwgZS5tYXJrID0gZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHQsIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKSA6ICh0Ll9fcHJvdG9fXyA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCBkZWZpbmUodCwgdSwgXCJHZW5lcmF0b3JGdW5jdGlvblwiKSksIHQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShnKSwgdDtcbiAgfSwgZS5hd3JhcCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fYXdhaXQ6IHRcbiAgICB9O1xuICB9LCBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpLCBkZWZpbmUoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUsIGMsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSksIGUuQXN5bmNJdGVyYXRvciA9IEFzeW5jSXRlcmF0b3IsIGUuYXN5bmMgPSBmdW5jdGlvbiAodCwgciwgbiwgbywgaSkge1xuICAgIHZvaWQgMCA9PT0gaSAmJiAoaSA9IFByb21pc2UpO1xuICAgIHZhciBhID0gbmV3IEFzeW5jSXRlcmF0b3Iod3JhcCh0LCByLCBuLCBvKSwgaSk7XG4gICAgcmV0dXJuIGUuaXNHZW5lcmF0b3JGdW5jdGlvbihyKSA/IGEgOiBhLm5leHQoKS50aGVuKGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdC5kb25lID8gdC52YWx1ZSA6IGEubmV4dCgpO1xuICAgIH0pO1xuICB9LCBkZWZpbmVJdGVyYXRvck1ldGhvZHMoZyksIGRlZmluZShnLCB1LCBcIkdlbmVyYXRvclwiKSwgZGVmaW5lKGcsIGEsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSksIGRlZmluZShnLCBcInRvU3RyaW5nXCIsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gXCJbb2JqZWN0IEdlbmVyYXRvcl1cIjtcbiAgfSksIGUua2V5cyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgdmFyIGUgPSBPYmplY3QodCksXG4gICAgICByID0gW107XG4gICAgZm9yICh2YXIgbiBpbiBlKSByLnB1c2gobik7XG4gICAgcmV0dXJuIHIucmV2ZXJzZSgpLCBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgZm9yICg7IHIubGVuZ3RoOykge1xuICAgICAgICB2YXIgdCA9IHIucG9wKCk7XG4gICAgICAgIGlmICh0IGluIGUpIHJldHVybiBuZXh0LnZhbHVlID0gdCwgbmV4dC5kb25lID0gITEsIG5leHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV4dC5kb25lID0gITAsIG5leHQ7XG4gICAgfTtcbiAgfSwgZS52YWx1ZXMgPSB2YWx1ZXMsIENvbnRleHQucHJvdG90eXBlID0ge1xuICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LFxuICAgIHJlc2V0OiBmdW5jdGlvbiByZXNldChlKSB7XG4gICAgICBpZiAodGhpcy5wcmV2ID0gMCwgdGhpcy5uZXh0ID0gMCwgdGhpcy5zZW50ID0gdGhpcy5fc2VudCA9IHQsIHRoaXMuZG9uZSA9ICExLCB0aGlzLmRlbGVnYXRlID0gbnVsbCwgdGhpcy5tZXRob2QgPSBcIm5leHRcIiwgdGhpcy5hcmcgPSB0LCB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KSwgIWUpIGZvciAodmFyIHIgaW4gdGhpcykgXCJ0XCIgPT09IHIuY2hhckF0KDApICYmIG4uY2FsbCh0aGlzLCByKSAmJiAhaXNOYU4oK3Iuc2xpY2UoMSkpICYmICh0aGlzW3JdID0gdCk7XG4gICAgfSxcbiAgICBzdG9wOiBmdW5jdGlvbiBzdG9wKCkge1xuICAgICAgdGhpcy5kb25lID0gITA7XG4gICAgICB2YXIgdCA9IHRoaXMudHJ5RW50cmllc1swXS5jb21wbGV0aW9uO1xuICAgICAgaWYgKFwidGhyb3dcIiA9PT0gdC50eXBlKSB0aHJvdyB0LmFyZztcbiAgICAgIHJldHVybiB0aGlzLnJ2YWw7XG4gICAgfSxcbiAgICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24gZGlzcGF0Y2hFeGNlcHRpb24oZSkge1xuICAgICAgaWYgKHRoaXMuZG9uZSkgdGhyb3cgZTtcbiAgICAgIHZhciByID0gdGhpcztcbiAgICAgIGZ1bmN0aW9uIGhhbmRsZShuLCBvKSB7XG4gICAgICAgIHJldHVybiBhLnR5cGUgPSBcInRocm93XCIsIGEuYXJnID0gZSwgci5uZXh0ID0gbiwgbyAmJiAoci5tZXRob2QgPSBcIm5leHRcIiwgci5hcmcgPSB0KSwgISFvO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgbyA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBvID49IDA7IC0tbykge1xuICAgICAgICB2YXIgaSA9IHRoaXMudHJ5RW50cmllc1tvXSxcbiAgICAgICAgICBhID0gaS5jb21wbGV0aW9uO1xuICAgICAgICBpZiAoXCJyb290XCIgPT09IGkudHJ5TG9jKSByZXR1cm4gaGFuZGxlKFwiZW5kXCIpO1xuICAgICAgICBpZiAoaS50cnlMb2MgPD0gdGhpcy5wcmV2KSB7XG4gICAgICAgICAgdmFyIGMgPSBuLmNhbGwoaSwgXCJjYXRjaExvY1wiKSxcbiAgICAgICAgICAgIHUgPSBuLmNhbGwoaSwgXCJmaW5hbGx5TG9jXCIpO1xuICAgICAgICAgIGlmIChjICYmIHUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBpLmNhdGNoTG9jKSByZXR1cm4gaGFuZGxlKGkuY2F0Y2hMb2MsICEwKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBpLmZpbmFsbHlMb2MpIHJldHVybiBoYW5kbGUoaS5maW5hbGx5TG9jKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBpLmNhdGNoTG9jKSByZXR1cm4gaGFuZGxlKGkuY2F0Y2hMb2MsICEwKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCF1KSB0aHJvdyBFcnJvcihcInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5XCIpO1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGkuZmluYWxseUxvYykgcmV0dXJuIGhhbmRsZShpLmZpbmFsbHlMb2MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgYWJydXB0OiBmdW5jdGlvbiBhYnJ1cHQodCwgZSkge1xuICAgICAgZm9yICh2YXIgciA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyByID49IDA7IC0tcikge1xuICAgICAgICB2YXIgbyA9IHRoaXMudHJ5RW50cmllc1tyXTtcbiAgICAgICAgaWYgKG8udHJ5TG9jIDw9IHRoaXMucHJldiAmJiBuLmNhbGwobywgXCJmaW5hbGx5TG9jXCIpICYmIHRoaXMucHJldiA8IG8uZmluYWxseUxvYykge1xuICAgICAgICAgIHZhciBpID0gbztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaSAmJiAoXCJicmVha1wiID09PSB0IHx8IFwiY29udGludWVcIiA9PT0gdCkgJiYgaS50cnlMb2MgPD0gZSAmJiBlIDw9IGkuZmluYWxseUxvYyAmJiAoaSA9IG51bGwpO1xuICAgICAgdmFyIGEgPSBpID8gaS5jb21wbGV0aW9uIDoge307XG4gICAgICByZXR1cm4gYS50eXBlID0gdCwgYS5hcmcgPSBlLCBpID8gKHRoaXMubWV0aG9kID0gXCJuZXh0XCIsIHRoaXMubmV4dCA9IGkuZmluYWxseUxvYywgeSkgOiB0aGlzLmNvbXBsZXRlKGEpO1xuICAgIH0sXG4gICAgY29tcGxldGU6IGZ1bmN0aW9uIGNvbXBsZXRlKHQsIGUpIHtcbiAgICAgIGlmIChcInRocm93XCIgPT09IHQudHlwZSkgdGhyb3cgdC5hcmc7XG4gICAgICByZXR1cm4gXCJicmVha1wiID09PSB0LnR5cGUgfHwgXCJjb250aW51ZVwiID09PSB0LnR5cGUgPyB0aGlzLm5leHQgPSB0LmFyZyA6IFwicmV0dXJuXCIgPT09IHQudHlwZSA/ICh0aGlzLnJ2YWwgPSB0aGlzLmFyZyA9IHQuYXJnLCB0aGlzLm1ldGhvZCA9IFwicmV0dXJuXCIsIHRoaXMubmV4dCA9IFwiZW5kXCIpIDogXCJub3JtYWxcIiA9PT0gdC50eXBlICYmIGUgJiYgKHRoaXMubmV4dCA9IGUpLCB5O1xuICAgIH0sXG4gICAgZmluaXNoOiBmdW5jdGlvbiBmaW5pc2godCkge1xuICAgICAgZm9yICh2YXIgZSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBlID49IDA7IC0tZSkge1xuICAgICAgICB2YXIgciA9IHRoaXMudHJ5RW50cmllc1tlXTtcbiAgICAgICAgaWYgKHIuZmluYWxseUxvYyA9PT0gdCkgcmV0dXJuIHRoaXMuY29tcGxldGUoci5jb21wbGV0aW9uLCByLmFmdGVyTG9jKSwgcmVzZXRUcnlFbnRyeShyKSwgeTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFwiY2F0Y2hcIjogZnVuY3Rpb24gX2NhdGNoKHQpIHtcbiAgICAgIGZvciAodmFyIGUgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgZSA+PSAwOyAtLWUpIHtcbiAgICAgICAgdmFyIHIgPSB0aGlzLnRyeUVudHJpZXNbZV07XG4gICAgICAgIGlmIChyLnRyeUxvYyA9PT0gdCkge1xuICAgICAgICAgIHZhciBuID0gci5jb21wbGV0aW9uO1xuICAgICAgICAgIGlmIChcInRocm93XCIgPT09IG4udHlwZSkge1xuICAgICAgICAgICAgdmFyIG8gPSBuLmFyZztcbiAgICAgICAgICAgIHJlc2V0VHJ5RW50cnkocik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyBFcnJvcihcImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdFwiKTtcbiAgICB9LFxuICAgIGRlbGVnYXRlWWllbGQ6IGZ1bmN0aW9uIGRlbGVnYXRlWWllbGQoZSwgciwgbikge1xuICAgICAgcmV0dXJuIHRoaXMuZGVsZWdhdGUgPSB7XG4gICAgICAgIGl0ZXJhdG9yOiB2YWx1ZXMoZSksXG4gICAgICAgIHJlc3VsdE5hbWU6IHIsXG4gICAgICAgIG5leHRMb2M6IG5cbiAgICAgIH0sIFwibmV4dFwiID09PSB0aGlzLm1ldGhvZCAmJiAodGhpcy5hcmcgPSB0KSwgeTtcbiAgICB9XG4gIH0sIGU7XG59XG5leHBvcnQgeyBfcmVnZW5lcmF0b3JSdW50aW1lIGFzIGRlZmF1bHQgfTsiLCAiZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwKG4sIHQsIGUsIHIsIG8sIGEsIGMpIHtcbiAgdHJ5IHtcbiAgICB2YXIgaSA9IG5bYV0oYyksXG4gICAgICB1ID0gaS52YWx1ZTtcbiAgfSBjYXRjaCAobikge1xuICAgIHJldHVybiB2b2lkIGUobik7XG4gIH1cbiAgaS5kb25lID8gdCh1KSA6IFByb21pc2UucmVzb2x2ZSh1KS50aGVuKHIsIG8pO1xufVxuZnVuY3Rpb24gX2FzeW5jVG9HZW5lcmF0b3Iobikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciB0ID0gdGhpcyxcbiAgICAgIGUgPSBhcmd1bWVudHM7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyLCBvKSB7XG4gICAgICB2YXIgYSA9IG4uYXBwbHkodCwgZSk7XG4gICAgICBmdW5jdGlvbiBfbmV4dChuKSB7XG4gICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChhLCByLCBvLCBfbmV4dCwgX3Rocm93LCBcIm5leHRcIiwgbik7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfdGhyb3cobikge1xuICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoYSwgciwgbywgX25leHQsIF90aHJvdywgXCJ0aHJvd1wiLCBuKTtcbiAgICAgIH1cbiAgICAgIF9uZXh0KHZvaWQgMCk7XG4gICAgfSk7XG4gIH07XG59XG5leHBvcnQgeyBfYXN5bmNUb0dlbmVyYXRvciBhcyBkZWZhdWx0IH07IiwgImltcG9ydCBfcmVnZW5lcmF0b3JSdW50aW1lIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9yZWdlbmVyYXRvclJ1bnRpbWVcIjtcbmltcG9ydCBfYXN5bmNUb0dlbmVyYXRvciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXN5bmNUb0dlbmVyYXRvclwiO1xuaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCAqIGFzIFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG4vLyBMZXQgY29tcGlsZXIgbm90IHRvIHNlYXJjaCBtb2R1bGUgdXNhZ2VcbnZhciBmdWxsQ2xvbmUgPSBfb2JqZWN0U3ByZWFkKHt9LCBSZWFjdERPTSk7XG52YXIgdmVyc2lvbiA9IGZ1bGxDbG9uZS52ZXJzaW9uLFxuICByZWFjdFJlbmRlciA9IGZ1bGxDbG9uZS5yZW5kZXIsXG4gIHVubW91bnRDb21wb25lbnRBdE5vZGUgPSBmdWxsQ2xvbmUudW5tb3VudENvbXBvbmVudEF0Tm9kZTtcbnZhciBjcmVhdGVSb290O1xudHJ5IHtcbiAgdmFyIG1haW5WZXJzaW9uID0gTnVtYmVyKCh2ZXJzaW9uIHx8ICcnKS5zcGxpdCgnLicpWzBdKTtcbiAgaWYgKG1haW5WZXJzaW9uID49IDE4KSB7XG4gICAgY3JlYXRlUm9vdCA9IGZ1bGxDbG9uZS5jcmVhdGVSb290O1xuICB9XG59IGNhdGNoIChlKSB7XG4gIC8vIERvIG5vdGhpbmc7XG59XG5mdW5jdGlvbiB0b2dnbGVXYXJuaW5nKHNraXApIHtcbiAgdmFyIF9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEID0gZnVsbENsb25lLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEO1xuICBpZiAoX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQgJiYgX3R5cGVvZihfX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRCkgPT09ICdvYmplY3QnKSB7XG4gICAgX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQudXNpbmdDbGllbnRFbnRyeVBvaW50ID0gc2tpcDtcbiAgfVxufVxudmFyIE1BUksgPSAnX19yY19yZWFjdF9yb290X18nO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gbW9kZXJuUmVuZGVyKG5vZGUsIGNvbnRhaW5lcikge1xuICB0b2dnbGVXYXJuaW5nKHRydWUpO1xuICB2YXIgcm9vdCA9IGNvbnRhaW5lcltNQVJLXSB8fCBjcmVhdGVSb290KGNvbnRhaW5lcik7XG4gIHRvZ2dsZVdhcm5pbmcoZmFsc2UpO1xuICByb290LnJlbmRlcihub2RlKTtcbiAgY29udGFpbmVyW01BUktdID0gcm9vdDtcbn1cbmZ1bmN0aW9uIGxlZ2FjeVJlbmRlcihub2RlLCBjb250YWluZXIpIHtcbiAgcmVhY3RSZW5kZXIgPT09IG51bGwgfHwgcmVhY3RSZW5kZXIgPT09IHZvaWQgMCB8fCByZWFjdFJlbmRlcihub2RlLCBjb250YWluZXIpO1xufVxuXG4vKiogQHByaXZhdGUgVGVzdCB1c2FnZS4gTm90IHdvcmsgaW4gcHJvZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9yKG5vZGUsIGNvbnRhaW5lcikge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHJldHVybiBsZWdhY3lSZW5kZXIobm9kZSwgY29udGFpbmVyKTtcbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlcihub2RlLCBjb250YWluZXIpIHtcbiAgaWYgKGNyZWF0ZVJvb3QpIHtcbiAgICBtb2Rlcm5SZW5kZXIobm9kZSwgY29udGFpbmVyKTtcbiAgICByZXR1cm47XG4gIH1cbiAgbGVnYWN5UmVuZGVyKG5vZGUsIGNvbnRhaW5lcik7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT0gVW5tb3VudCA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuZnVuY3Rpb24gbW9kZXJuVW5tb3VudChfeCkge1xuICByZXR1cm4gX21vZGVyblVubW91bnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmZ1bmN0aW9uIF9tb2Rlcm5Vbm1vdW50KCkge1xuICBfbW9kZXJuVW5tb3VudCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZSgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZShjb250YWluZXIpIHtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZSgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9jb250YWluZXIkTUFSSztcbiAgICAgICAgICAgIChfY29udGFpbmVyJE1BUksgPSBjb250YWluZXJbTUFSS10pID09PSBudWxsIHx8IF9jb250YWluZXIkTUFSSyA9PT0gdm9pZCAwIHx8IF9jb250YWluZXIkTUFSSy51bm1vdW50KCk7XG4gICAgICAgICAgICBkZWxldGUgY29udGFpbmVyW01BUktdO1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlKTtcbiAgfSkpO1xuICByZXR1cm4gX21vZGVyblVubW91bnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmZ1bmN0aW9uIGxlZ2FjeVVubW91bnQoY29udGFpbmVyKSB7XG4gIHVubW91bnRDb21wb25lbnRBdE5vZGUoY29udGFpbmVyKTtcbn1cblxuLyoqIEBwcml2YXRlIFRlc3QgdXNhZ2UuIE5vdCB3b3JrIGluIHByb2QgKi9cbmV4cG9ydCBmdW5jdGlvbiBfdShjb250YWluZXIpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICByZXR1cm4gbGVnYWN5VW5tb3VudChjb250YWluZXIpO1xuICB9XG59XG5leHBvcnQgZnVuY3Rpb24gdW5tb3VudChfeDIpIHtcbiAgcmV0dXJuIF91bm1vdW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5mdW5jdGlvbiBfdW5tb3VudCgpIHtcbiAgX3VubW91bnQgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKGNvbnRhaW5lcikge1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lKCkud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7XG4gICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBpZiAoIShjcmVhdGVSb290ICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoXCJyZXR1cm5cIiwgbW9kZXJuVW5tb3VudChjb250YWluZXIpKTtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIGxlZ2FjeVVubW91bnQoY29udGFpbmVyKTtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTIpO1xuICB9KSk7XG4gIHJldHVybiBfdW5tb3VudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufSIsICJpbXBvcnQgeyBkZWZhdWx0UHJlZml4Q2xzIH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbi8vID09PT09PT09PT09PT09PT09PSBDb2xsYXBzZSBNb3Rpb24gPT09PT09PT09PT09PT09PT09XG5jb25zdCBnZXRDb2xsYXBzZWRIZWlnaHQgPSAoKSA9PiAoe1xuICBoZWlnaHQ6IDAsXG4gIG9wYWNpdHk6IDBcbn0pO1xuY29uc3QgZ2V0UmVhbEhlaWdodCA9IG5vZGUgPT4ge1xuICBjb25zdCB7XG4gICAgc2Nyb2xsSGVpZ2h0XG4gIH0gPSBub2RlO1xuICByZXR1cm4ge1xuICAgIGhlaWdodDogc2Nyb2xsSGVpZ2h0LFxuICAgIG9wYWNpdHk6IDFcbiAgfTtcbn07XG5jb25zdCBnZXRDdXJyZW50SGVpZ2h0ID0gbm9kZSA9PiAoe1xuICBoZWlnaHQ6IG5vZGUgPyBub2RlLm9mZnNldEhlaWdodCA6IDBcbn0pO1xuY29uc3Qgc2tpcE9wYWNpdHlUcmFuc2l0aW9uID0gKF8sIGV2ZW50KSA9PiAoZXZlbnQgPT09IG51bGwgfHwgZXZlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGV2ZW50LmRlYWRsaW5lKSA9PT0gdHJ1ZSB8fCBldmVudC5wcm9wZXJ0eU5hbWUgPT09ICdoZWlnaHQnO1xuY29uc3QgaW5pdENvbGxhcHNlTW90aW9uID0gZnVuY3Rpb24gKCkge1xuICBsZXQgcm9vdENscyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZGVmYXVsdFByZWZpeENscztcbiAgcmV0dXJuIHtcbiAgICBtb3Rpb25OYW1lOiBgJHtyb290Q2xzfS1tb3Rpb24tY29sbGFwc2VgLFxuICAgIG9uQXBwZWFyU3RhcnQ6IGdldENvbGxhcHNlZEhlaWdodCxcbiAgICBvbkVudGVyU3RhcnQ6IGdldENvbGxhcHNlZEhlaWdodCxcbiAgICBvbkFwcGVhckFjdGl2ZTogZ2V0UmVhbEhlaWdodCxcbiAgICBvbkVudGVyQWN0aXZlOiBnZXRSZWFsSGVpZ2h0LFxuICAgIG9uTGVhdmVTdGFydDogZ2V0Q3VycmVudEhlaWdodCxcbiAgICBvbkxlYXZlQWN0aXZlOiBnZXRDb2xsYXBzZWRIZWlnaHQsXG4gICAgb25BcHBlYXJFbmQ6IHNraXBPcGFjaXR5VHJhbnNpdGlvbixcbiAgICBvbkVudGVyRW5kOiBza2lwT3BhY2l0eVRyYW5zaXRpb24sXG4gICAgb25MZWF2ZUVuZDogc2tpcE9wYWNpdHlUcmFuc2l0aW9uLFxuICAgIG1vdGlvbkRlYWRsaW5lOiA1MDBcbiAgfTtcbn07XG5jb25zdCBfU2VsZWN0UGxhY2VtZW50cyA9IFsnYm90dG9tTGVmdCcsICdib3R0b21SaWdodCcsICd0b3BMZWZ0JywgJ3RvcFJpZ2h0J107XG5jb25zdCBnZXRUcmFuc2l0aW9uTmFtZSA9IChyb290UHJlZml4Q2xzLCBtb3Rpb24sIHRyYW5zaXRpb25OYW1lKSA9PiB7XG4gIGlmICh0cmFuc2l0aW9uTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHRyYW5zaXRpb25OYW1lO1xuICB9XG4gIHJldHVybiBgJHtyb290UHJlZml4Q2xzfS0ke21vdGlvbn1gO1xufTtcbmV4cG9ydCB7IGdldFRyYW5zaXRpb25OYW1lIH07XG5leHBvcnQgZGVmYXVsdCBpbml0Q29sbGFwc2VNb3Rpb247IiwgIlwidXNlIGNsaWVudFwiO1xuXG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IFJlYWN0LCB7IENoaWxkcmVuLCB1c2VDb250ZXh0LCB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBvbWl0IGZyb20gXCJyYy11dGlsL2VzL29taXRcIjtcbmltcG9ydCB7IHVzZUNvbXBvc2VSZWYgfSBmcm9tIFwicmMtdXRpbC9lcy9yZWZcIjtcbmltcG9ydCB7IGRldlVzZVdhcm5pbmcgfSBmcm9tICcuLi9fdXRpbC93YXJuaW5nJztcbmltcG9ydCBXYXZlIGZyb20gJy4uL191dGlsL3dhdmUnO1xuaW1wb3J0IHsgdXNlQ29tcG9uZW50Q29uZmlnIH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL2NvbnRleHQnO1xuaW1wb3J0IERpc2FibGVkQ29udGV4dCBmcm9tICcuLi9jb25maWctcHJvdmlkZXIvRGlzYWJsZWRDb250ZXh0JztcbmltcG9ydCB1c2VTaXplIGZyb20gJy4uL2NvbmZpZy1wcm92aWRlci9ob29rcy91c2VTaXplJztcbmltcG9ydCB7IHVzZUNvbXBhY3RJdGVtQ29udGV4dCB9IGZyb20gJy4uL3NwYWNlL0NvbXBhY3QnO1xuaW1wb3J0IEdyb3VwLCB7IEdyb3VwU2l6ZUNvbnRleHQgfSBmcm9tICcuL2J1dHRvbi1ncm91cCc7XG5pbXBvcnQgeyBpc1R3b0NOQ2hhciwgaXNVbkJvcmRlcmVkQnV0dG9uVmFyaWFudCwgc3BhY2VDaGlsZHJlbiB9IGZyb20gJy4vYnV0dG9uSGVscGVycyc7XG5pbXBvcnQgRGVmYXVsdExvYWRpbmdJY29uIGZyb20gJy4vRGVmYXVsdExvYWRpbmdJY29uJztcbmltcG9ydCBJY29uV3JhcHBlciBmcm9tICcuL0ljb25XcmFwcGVyJztcbmltcG9ydCB1c2VTdHlsZSBmcm9tICcuL3N0eWxlJztcbmltcG9ydCBDb21wYWN0IGZyb20gJy4vc3R5bGUvY29tcGFjdCc7XG5mdW5jdGlvbiBnZXRMb2FkaW5nQ29uZmlnKGxvYWRpbmcpIHtcbiAgaWYgKHR5cGVvZiBsb2FkaW5nID09PSAnb2JqZWN0JyAmJiBsb2FkaW5nKSB7XG4gICAgbGV0IGRlbGF5ID0gbG9hZGluZyA9PT0gbnVsbCB8fCBsb2FkaW5nID09PSB2b2lkIDAgPyB2b2lkIDAgOiBsb2FkaW5nLmRlbGF5O1xuICAgIGRlbGF5ID0gIU51bWJlci5pc05hTihkZWxheSkgJiYgdHlwZW9mIGRlbGF5ID09PSAnbnVtYmVyJyA/IGRlbGF5IDogMDtcbiAgICByZXR1cm4ge1xuICAgICAgbG9hZGluZzogZGVsYXkgPD0gMCxcbiAgICAgIGRlbGF5XG4gICAgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGxvYWRpbmc6ICEhbG9hZGluZyxcbiAgICBkZWxheTogMFxuICB9O1xufVxuY29uc3QgQnV0dG9uVHlwZU1hcCA9IHtcbiAgZGVmYXVsdDogWydkZWZhdWx0JywgJ291dGxpbmVkJ10sXG4gIHByaW1hcnk6IFsncHJpbWFyeScsICdzb2xpZCddLFxuICBkYXNoZWQ6IFsnZGVmYXVsdCcsICdkYXNoZWQnXSxcbiAgLy8gYGxpbmtgIGlzIG5vdCBhIHJlYWwgY29sb3IgYnV0IHdlIHNob3VsZCBjb21wYXRpYmxlIHdpdGggaXRcbiAgbGluazogWydsaW5rJywgJ2xpbmsnXSxcbiAgdGV4dDogWydkZWZhdWx0JywgJ3RleHQnXVxufTtcbmNvbnN0IEludGVybmFsQ29tcG91bmRlZEJ1dHRvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgcmVmKSA9PiB7XG4gIHZhciBfYSwgX2I7XG4gIGNvbnN0IHtcbiAgICAgIGxvYWRpbmcgPSBmYWxzZSxcbiAgICAgIHByZWZpeENsczogY3VzdG9taXplUHJlZml4Q2xzLFxuICAgICAgY29sb3IsXG4gICAgICB2YXJpYW50LFxuICAgICAgdHlwZSxcbiAgICAgIGRhbmdlciA9IGZhbHNlLFxuICAgICAgc2hhcGUgPSAnZGVmYXVsdCcsXG4gICAgICBzaXplOiBjdXN0b21pemVTaXplLFxuICAgICAgc3R5bGVzLFxuICAgICAgZGlzYWJsZWQ6IGN1c3RvbURpc2FibGVkLFxuICAgICAgY2xhc3NOYW1lLFxuICAgICAgcm9vdENsYXNzTmFtZSxcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgaWNvbixcbiAgICAgIGljb25Qb3NpdGlvbiA9ICdzdGFydCcsXG4gICAgICBnaG9zdCA9IGZhbHNlLFxuICAgICAgYmxvY2sgPSBmYWxzZSxcbiAgICAgIC8vIFJlYWN0IGRvZXMgbm90IHJlY29nbml6ZSB0aGUgYGh0bWxUeXBlYCBwcm9wIG9uIGEgRE9NIGVsZW1lbnQuIEhlcmUgd2UgcGljayBpdCBvdXQgb2YgYHJlc3RgLlxuICAgICAgaHRtbFR5cGUgPSAnYnV0dG9uJyxcbiAgICAgIGNsYXNzTmFtZXM6IGN1c3RvbUNsYXNzTmFtZXMsXG4gICAgICBzdHlsZTogY3VzdG9tU3R5bGUgPSB7fSxcbiAgICAgIGF1dG9JbnNlcnRTcGFjZSxcbiAgICAgIGF1dG9Gb2N1c1xuICAgIH0gPSBwcm9wcyxcbiAgICByZXN0ID0gX19yZXN0KHByb3BzLCBbXCJsb2FkaW5nXCIsIFwicHJlZml4Q2xzXCIsIFwiY29sb3JcIiwgXCJ2YXJpYW50XCIsIFwidHlwZVwiLCBcImRhbmdlclwiLCBcInNoYXBlXCIsIFwic2l6ZVwiLCBcInN0eWxlc1wiLCBcImRpc2FibGVkXCIsIFwiY2xhc3NOYW1lXCIsIFwicm9vdENsYXNzTmFtZVwiLCBcImNoaWxkcmVuXCIsIFwiaWNvblwiLCBcImljb25Qb3NpdGlvblwiLCBcImdob3N0XCIsIFwiYmxvY2tcIiwgXCJodG1sVHlwZVwiLCBcImNsYXNzTmFtZXNcIiwgXCJzdHlsZVwiLCBcImF1dG9JbnNlcnRTcGFjZVwiLCBcImF1dG9Gb2N1c1wiXSk7XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzQ3NjA1XG4gIC8vIENvbXBhdGlibGUgd2l0aCBvcmlnaW5hbCBgdHlwZWAgYmVoYXZpb3JcbiAgY29uc3QgbWVyZ2VkVHlwZSA9IHR5cGUgfHwgJ2RlZmF1bHQnO1xuICBjb25zdCBbbWVyZ2VkQ29sb3IsIG1lcmdlZFZhcmlhbnRdID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKGNvbG9yICYmIHZhcmlhbnQpIHtcbiAgICAgIHJldHVybiBbY29sb3IsIHZhcmlhbnRdO1xuICAgIH1cbiAgICBjb25zdCBjb2xvclZhcmlhbnRQYWlyID0gQnV0dG9uVHlwZU1hcFttZXJnZWRUeXBlXSB8fCBbXTtcbiAgICBpZiAoZGFuZ2VyKSB7XG4gICAgICByZXR1cm4gWydkYW5nZXInLCBjb2xvclZhcmlhbnRQYWlyWzFdXTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbG9yVmFyaWFudFBhaXI7XG4gIH0sIFt0eXBlLCBjb2xvciwgdmFyaWFudCwgZGFuZ2VyXSk7XG4gIGNvbnN0IGlzRGFuZ2VyID0gbWVyZ2VkQ29sb3IgPT09ICdkYW5nZXInO1xuICBjb25zdCBtZXJnZWRDb2xvclRleHQgPSBpc0RhbmdlciA/ICdkYW5nZXJvdXMnIDogbWVyZ2VkQ29sb3I7XG4gIGNvbnN0IHtcbiAgICBnZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uLFxuICAgIGF1dG9JbnNlcnRTcGFjZTogY29udGV4dEF1dG9JbnNlcnRTcGFjZSxcbiAgICBjbGFzc05hbWU6IGNvbnRleHRDbGFzc05hbWUsXG4gICAgc3R5bGU6IGNvbnRleHRTdHlsZSxcbiAgICBjbGFzc05hbWVzOiBjb250ZXh0Q2xhc3NOYW1lcyxcbiAgICBzdHlsZXM6IGNvbnRleHRTdHlsZXNcbiAgfSA9IHVzZUNvbXBvbmVudENvbmZpZygnYnV0dG9uJyk7XG4gIGNvbnN0IG1lcmdlZEluc2VydFNwYWNlID0gKF9hID0gYXV0b0luc2VydFNwYWNlICE9PSBudWxsICYmIGF1dG9JbnNlcnRTcGFjZSAhPT0gdm9pZCAwID8gYXV0b0luc2VydFNwYWNlIDogY29udGV4dEF1dG9JbnNlcnRTcGFjZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdHJ1ZTtcbiAgY29uc3QgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdidG4nLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICBjb25zdCBbd3JhcENTU1ZhciwgaGFzaElkLCBjc3NWYXJDbHNdID0gdXNlU3R5bGUocHJlZml4Q2xzKTtcbiAgY29uc3QgZGlzYWJsZWQgPSB1c2VDb250ZXh0KERpc2FibGVkQ29udGV4dCk7XG4gIGNvbnN0IG1lcmdlZERpc2FibGVkID0gY3VzdG9tRGlzYWJsZWQgIT09IG51bGwgJiYgY3VzdG9tRGlzYWJsZWQgIT09IHZvaWQgMCA/IGN1c3RvbURpc2FibGVkIDogZGlzYWJsZWQ7XG4gIGNvbnN0IGdyb3VwU2l6ZSA9IHVzZUNvbnRleHQoR3JvdXBTaXplQ29udGV4dCk7XG4gIGNvbnN0IGxvYWRpbmdPckRlbGF5ID0gdXNlTWVtbygoKSA9PiBnZXRMb2FkaW5nQ29uZmlnKGxvYWRpbmcpLCBbbG9hZGluZ10pO1xuICBjb25zdCBbaW5uZXJMb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlKGxvYWRpbmdPckRlbGF5LmxvYWRpbmcpO1xuICBjb25zdCBbaGFzVHdvQ05DaGFyLCBzZXRIYXNUd29DTkNoYXJdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBidXR0b25SZWYgPSB1c2VSZWYobnVsbCk7XG4gIGNvbnN0IG1lcmdlZFJlZiA9IHVzZUNvbXBvc2VSZWYocmVmLCBidXR0b25SZWYpO1xuICBjb25zdCBuZWVkSW5zZXJ0ZWQgPSBDaGlsZHJlbi5jb3VudChjaGlsZHJlbikgPT09IDEgJiYgIWljb24gJiYgIWlzVW5Cb3JkZXJlZEJ1dHRvblZhcmlhbnQobWVyZ2VkVmFyaWFudCk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gTW91bnQgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUmVjb3JkIGZvciBtb3VudCBzdGF0dXMuXG4gIC8vIFRoaXMgd2lsbCBoZWxwIHRvIG5vIHRvIHNob3cgdGhlIGFuaW1hdGlvbiBvZiBsb2FkaW5nIG9uIHRoZSBmaXJzdCBtb3VudC5cbiAgY29uc3QgaXNNb3VudFJlZiA9IHVzZVJlZih0cnVlKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpc01vdW50UmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaXNNb3VudFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gRWZmZWN0ID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTG9hZGluZ1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGxldCBkZWxheVRpbWVyID0gbnVsbDtcbiAgICBpZiAobG9hZGluZ09yRGVsYXkuZGVsYXkgPiAwKSB7XG4gICAgICBkZWxheVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGRlbGF5VGltZXIgPSBudWxsO1xuICAgICAgICBzZXRMb2FkaW5nKHRydWUpO1xuICAgICAgfSwgbG9hZGluZ09yRGVsYXkuZGVsYXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRMb2FkaW5nKGxvYWRpbmdPckRlbGF5LmxvYWRpbmcpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjbGVhbnVwVGltZXIoKSB7XG4gICAgICBpZiAoZGVsYXlUaW1lcikge1xuICAgICAgICBjbGVhclRpbWVvdXQoZGVsYXlUaW1lcik7XG4gICAgICAgIGRlbGF5VGltZXIgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2xlYW51cFRpbWVyO1xuICB9LCBbbG9hZGluZ09yRGVsYXldKTtcbiAgLy8gVHdvIGNoaW5lc2UgY2hhcmFjdGVycyBjaGVja1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIEZJWE1FOiBmb3IgSE9DIHVzYWdlIGxpa2UgPEZvcm1hdE1lc3NhZ2UgLz5cbiAgICBpZiAoIWJ1dHRvblJlZi5jdXJyZW50IHx8ICFtZXJnZWRJbnNlcnRTcGFjZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBidXR0b25UZXh0ID0gYnV0dG9uUmVmLmN1cnJlbnQudGV4dENvbnRlbnQgfHwgJyc7XG4gICAgaWYgKG5lZWRJbnNlcnRlZCAmJiBpc1R3b0NOQ2hhcihidXR0b25UZXh0KSkge1xuICAgICAgaWYgKCFoYXNUd29DTkNoYXIpIHtcbiAgICAgICAgc2V0SGFzVHdvQ05DaGFyKHRydWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaGFzVHdvQ05DaGFyKSB7XG4gICAgICBzZXRIYXNUd29DTkNoYXIoZmFsc2UpO1xuICAgIH1cbiAgfSk7XG4gIC8vIEF1dG8gZm9jdXNcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoYXV0b0ZvY3VzICYmIGJ1dHRvblJlZi5jdXJyZW50KSB7XG4gICAgICBidXR0b25SZWYuY3VycmVudC5mb2N1cygpO1xuICAgIH1cbiAgfSwgW10pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IEV2ZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IGhhbmRsZUNsaWNrID0gUmVhY3QudXNlQ2FsbGJhY2soZSA9PiB7XG4gICAgdmFyIF9hO1xuICAgIC8vIEZJWE1FOiBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8zMDIwN1xuICAgIGlmIChpbm5lckxvYWRpbmcgfHwgbWVyZ2VkRGlzYWJsZWQpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgKF9hID0gcHJvcHMub25DbGljaykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwocHJvcHMsICdocmVmJyBpbiBwcm9wcyA/IGUgOiBlKTtcbiAgfSwgW3Byb3BzLm9uQ2xpY2ssIGlubmVyTG9hZGluZywgbWVyZ2VkRGlzYWJsZWRdKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gV2FybiA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGNvbnN0IHdhcm5pbmcgPSBkZXZVc2VXYXJuaW5nKCdCdXR0b24nKTtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCEodHlwZW9mIGljb24gPT09ICdzdHJpbmcnICYmIGljb24ubGVuZ3RoID4gMiksICdicmVha2luZycsIGBcXGBpY29uXFxgIGlzIHVzaW5nIFJlYWN0Tm9kZSBpbnN0ZWFkIG9mIHN0cmluZyBuYW1pbmcgaW4gdjQuIFBsZWFzZSBjaGVjayBcXGAke2ljb259XFxgIGF0IGh0dHBzOi8vYW50LmRlc2lnbi9jb21wb25lbnRzL2ljb25gKSA6IHZvaWQgMDtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCEoZ2hvc3QgJiYgaXNVbkJvcmRlcmVkQnV0dG9uVmFyaWFudChtZXJnZWRWYXJpYW50KSksICd1c2FnZScsIFwiYGxpbmtgIG9yIGB0ZXh0YCBidXR0b24gY2FuJ3QgYmUgYSBgZ2hvc3RgIGJ1dHRvbi5cIikgOiB2b2lkIDA7XG4gIH1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gU2l6ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCB7XG4gICAgY29tcGFjdFNpemUsXG4gICAgY29tcGFjdEl0ZW1DbGFzc25hbWVzXG4gIH0gPSB1c2VDb21wYWN0SXRlbUNvbnRleHQocHJlZml4Q2xzLCBkaXJlY3Rpb24pO1xuICBjb25zdCBzaXplQ2xhc3NOYW1lTWFwID0ge1xuICAgIGxhcmdlOiAnbGcnLFxuICAgIHNtYWxsOiAnc20nLFxuICAgIG1pZGRsZTogdW5kZWZpbmVkXG4gIH07XG4gIGNvbnN0IHNpemVGdWxsTmFtZSA9IHVzZVNpemUoY3R4U2l6ZSA9PiB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gKF9iID0gKF9hID0gY3VzdG9taXplU2l6ZSAhPT0gbnVsbCAmJiBjdXN0b21pemVTaXplICE9PSB2b2lkIDAgPyBjdXN0b21pemVTaXplIDogY29tcGFjdFNpemUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGdyb3VwU2l6ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogY3R4U2l6ZTtcbiAgfSk7XG4gIGNvbnN0IHNpemVDbHMgPSBzaXplRnVsbE5hbWUgPyAoX2IgPSBzaXplQ2xhc3NOYW1lTWFwW3NpemVGdWxsTmFtZV0pICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnIDogJyc7XG4gIGNvbnN0IGljb25UeXBlID0gaW5uZXJMb2FkaW5nID8gJ2xvYWRpbmcnIDogaWNvbjtcbiAgY29uc3QgbGlua0J1dHRvblJlc3RQcm9wcyA9IG9taXQocmVzdCwgWyduYXZpZ2F0ZSddKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBjbGFzc2VzID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIGhhc2hJZCwgY3NzVmFyQ2xzLCB7XG4gICAgW2Ake3ByZWZpeENsc30tJHtzaGFwZX1gXTogc2hhcGUgIT09ICdkZWZhdWx0JyAmJiBzaGFwZSxcbiAgICAvLyBsaW5lKDI1MyAtIDI1NCk6IENvbXBhdGlibGUgd2l0aCB2ZXJzaW9ucyBlYXJsaWVyIHRoYW4gNS4yMS4wXG4gICAgW2Ake3ByZWZpeENsc30tJHttZXJnZWRUeXBlfWBdOiBtZXJnZWRUeXBlLFxuICAgIFtgJHtwcmVmaXhDbHN9LWRhbmdlcm91c2BdOiBkYW5nZXIsXG4gICAgW2Ake3ByZWZpeENsc30tY29sb3ItJHttZXJnZWRDb2xvclRleHR9YF06IG1lcmdlZENvbG9yVGV4dCxcbiAgICBbYCR7cHJlZml4Q2xzfS12YXJpYW50LSR7bWVyZ2VkVmFyaWFudH1gXTogbWVyZ2VkVmFyaWFudCxcbiAgICBbYCR7cHJlZml4Q2xzfS0ke3NpemVDbHN9YF06IHNpemVDbHMsXG4gICAgW2Ake3ByZWZpeENsc30taWNvbi1vbmx5YF06ICFjaGlsZHJlbiAmJiBjaGlsZHJlbiAhPT0gMCAmJiAhIWljb25UeXBlLFxuICAgIFtgJHtwcmVmaXhDbHN9LWJhY2tncm91bmQtZ2hvc3RgXTogZ2hvc3QgJiYgIWlzVW5Cb3JkZXJlZEJ1dHRvblZhcmlhbnQobWVyZ2VkVmFyaWFudCksXG4gICAgW2Ake3ByZWZpeENsc30tbG9hZGluZ2BdOiBpbm5lckxvYWRpbmcsXG4gICAgW2Ake3ByZWZpeENsc30tdHdvLWNoaW5lc2UtY2hhcnNgXTogaGFzVHdvQ05DaGFyICYmIG1lcmdlZEluc2VydFNwYWNlICYmICFpbm5lckxvYWRpbmcsXG4gICAgW2Ake3ByZWZpeENsc30tYmxvY2tgXTogYmxvY2ssXG4gICAgW2Ake3ByZWZpeENsc30tcnRsYF06IGRpcmVjdGlvbiA9PT0gJ3J0bCcsXG4gICAgW2Ake3ByZWZpeENsc30taWNvbi1lbmRgXTogaWNvblBvc2l0aW9uID09PSAnZW5kJ1xuICB9LCBjb21wYWN0SXRlbUNsYXNzbmFtZXMsIGNsYXNzTmFtZSwgcm9vdENsYXNzTmFtZSwgY29udGV4dENsYXNzTmFtZSk7XG4gIGNvbnN0IGZ1bGxTdHlsZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY29udGV4dFN0eWxlKSwgY3VzdG9tU3R5bGUpO1xuICBjb25zdCBpY29uQ2xhc3NlcyA9IGNsYXNzTmFtZXMoY3VzdG9tQ2xhc3NOYW1lcyA9PT0gbnVsbCB8fCBjdXN0b21DbGFzc05hbWVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjdXN0b21DbGFzc05hbWVzLmljb24sIGNvbnRleHRDbGFzc05hbWVzLmljb24pO1xuICBjb25zdCBpY29uU3R5bGUgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIChzdHlsZXMgPT09IG51bGwgfHwgc3R5bGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdHlsZXMuaWNvbikgfHwge30pLCBjb250ZXh0U3R5bGVzLmljb24gfHwge30pO1xuICBjb25zdCBpY29uTm9kZSA9IGljb24gJiYgIWlubmVyTG9hZGluZyA/ICgvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJY29uV3JhcHBlciwge1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZTogaWNvbkNsYXNzZXMsXG4gICAgc3R5bGU6IGljb25TdHlsZVxuICB9LCBpY29uKSkgOiBsb2FkaW5nICYmIHR5cGVvZiBsb2FkaW5nID09PSAnb2JqZWN0JyAmJiBsb2FkaW5nLmljb24gPyAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSWNvbldyYXBwZXIsIHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBjbGFzc05hbWU6IGljb25DbGFzc2VzLFxuICAgIHN0eWxlOiBpY29uU3R5bGVcbiAgfSwgbG9hZGluZy5pY29uKSkgOiAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRGVmYXVsdExvYWRpbmdJY29uLCB7XG4gICAgZXhpc3RJY29uOiAhIWljb24sXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgbG9hZGluZzogaW5uZXJMb2FkaW5nLFxuICAgIG1vdW50OiBpc01vdW50UmVmLmN1cnJlbnRcbiAgfSkpO1xuICBjb25zdCBraWRzID0gY2hpbGRyZW4gfHwgY2hpbGRyZW4gPT09IDAgPyBzcGFjZUNoaWxkcmVuKGNoaWxkcmVuLCBuZWVkSW5zZXJ0ZWQgJiYgbWVyZ2VkSW5zZXJ0U3BhY2UpIDogbnVsbDtcbiAgaWYgKGxpbmtCdXR0b25SZXN0UHJvcHMuaHJlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHdyYXBDU1NWYXIoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJhXCIsIE9iamVjdC5hc3NpZ24oe30sIGxpbmtCdXR0b25SZXN0UHJvcHMsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc2VzLCB7XG4gICAgICAgIFtgJHtwcmVmaXhDbHN9LWRpc2FibGVkYF06IG1lcmdlZERpc2FibGVkXG4gICAgICB9KSxcbiAgICAgIGhyZWY6IG1lcmdlZERpc2FibGVkID8gdW5kZWZpbmVkIDogbGlua0J1dHRvblJlc3RQcm9wcy5ocmVmLFxuICAgICAgc3R5bGU6IGZ1bGxTdHlsZSxcbiAgICAgIG9uQ2xpY2s6IGhhbmRsZUNsaWNrLFxuICAgICAgcmVmOiBtZXJnZWRSZWYsXG4gICAgICB0YWJJbmRleDogbWVyZ2VkRGlzYWJsZWQgPyAtMSA6IDBcbiAgICB9KSwgaWNvbk5vZGUsIGtpZHMpKTtcbiAgfVxuICBsZXQgYnV0dG9uTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIE9iamVjdC5hc3NpZ24oe30sIHJlc3QsIHtcbiAgICB0eXBlOiBodG1sVHlwZSxcbiAgICBjbGFzc05hbWU6IGNsYXNzZXMsXG4gICAgc3R5bGU6IGZ1bGxTdHlsZSxcbiAgICBvbkNsaWNrOiBoYW5kbGVDbGljayxcbiAgICBkaXNhYmxlZDogbWVyZ2VkRGlzYWJsZWQsXG4gICAgcmVmOiBtZXJnZWRSZWZcbiAgfSksIGljb25Ob2RlLCBraWRzLCBjb21wYWN0SXRlbUNsYXNzbmFtZXMgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcGFjdCwge1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzXG4gIH0pKTtcbiAgaWYgKCFpc1VuQm9yZGVyZWRCdXR0b25WYXJpYW50KG1lcmdlZFZhcmlhbnQpKSB7XG4gICAgYnV0dG9uTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFdhdmUsIHtcbiAgICAgIGNvbXBvbmVudDogXCJCdXR0b25cIixcbiAgICAgIGRpc2FibGVkOiBpbm5lckxvYWRpbmdcbiAgICB9LCBidXR0b25Ob2RlKTtcbiAgfVxuICByZXR1cm4gd3JhcENTU1ZhcihidXR0b25Ob2RlKTtcbn0pO1xuY29uc3QgQnV0dG9uID0gSW50ZXJuYWxDb21wb3VuZGVkQnV0dG9uO1xuQnV0dG9uLkdyb3VwID0gR3JvdXA7XG5CdXR0b24uX19BTlRfQlVUVE9OID0gdHJ1ZTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIEJ1dHRvbi5kaXNwbGF5TmFtZSA9ICdCdXR0b24nO1xufVxuZXhwb3J0IGRlZmF1bHQgQnV0dG9uOyIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBvbWl0KG9iaiwgZmllbGRzKSB7XG4gIHZhciBjbG9uZSA9IE9iamVjdC5hc3NpZ24oe30sIG9iaik7XG4gIGlmIChBcnJheS5pc0FycmF5KGZpZWxkcykpIHtcbiAgICBmaWVsZHMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBkZWxldGUgY2xvbmVba2V5XTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gY2xvbmU7XG59IiwgImltcG9ydCBSZWFjdCwgeyB1c2VDb250ZXh0LCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBpc1Zpc2libGUgZnJvbSBcInJjLXV0aWwvZXMvRG9tL2lzVmlzaWJsZVwiO1xuaW1wb3J0IHsgY29tcG9zZVJlZiwgZ2V0Tm9kZVJlZiwgc3VwcG9ydFJlZiB9IGZyb20gXCJyYy11dGlsL2VzL3JlZlwiO1xuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uLy4uL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgeyBjbG9uZUVsZW1lbnQgfSBmcm9tICcuLi9yZWFjdE5vZGUnO1xuaW1wb3J0IHVzZVN0eWxlIGZyb20gJy4vc3R5bGUnO1xuaW1wb3J0IHVzZVdhdmUgZnJvbSAnLi91c2VXYXZlJztcbmNvbnN0IFdhdmUgPSBwcm9wcyA9PiB7XG4gIGNvbnN0IHtcbiAgICBjaGlsZHJlbixcbiAgICBkaXNhYmxlZCxcbiAgICBjb21wb25lbnRcbiAgfSA9IHByb3BzO1xuICBjb25zdCB7XG4gICAgZ2V0UHJlZml4Q2xzXG4gIH0gPSB1c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpO1xuICBjb25zdCBjb250YWluZXJSZWYgPSB1c2VSZWYobnVsbCk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTdHlsZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IHByZWZpeENscyA9IGdldFByZWZpeENscygnd2F2ZScpO1xuICBjb25zdCBbLCBoYXNoSWRdID0gdXNlU3R5bGUocHJlZml4Q2xzKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBXYXZlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3Qgc2hvd1dhdmUgPSB1c2VXYXZlKGNvbnRhaW5lclJlZiwgY2xhc3NOYW1lcyhwcmVmaXhDbHMsIGhhc2hJZCksIGNvbXBvbmVudCk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFZmZlY3QgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgbm9kZSA9IGNvbnRhaW5lclJlZi5jdXJyZW50O1xuICAgIGlmICghbm9kZSB8fCBub2RlLm5vZGVUeXBlICE9PSAxIHx8IGRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIENsaWNrIGhhbmRsZXJcbiAgICBjb25zdCBvbkNsaWNrID0gZSA9PiB7XG4gICAgICAvLyBGaXggcmFkaW8gYnV0dG9uIGNsaWNrIHR3aWNlXG4gICAgICBpZiAoIWlzVmlzaWJsZShlLnRhcmdldCkgfHxcbiAgICAgIC8vIE5vIG5lZWQgd2F2ZVxuICAgICAgIW5vZGUuZ2V0QXR0cmlidXRlIHx8IG5vZGUuZ2V0QXR0cmlidXRlKCdkaXNhYmxlZCcpIHx8IG5vZGUuZGlzYWJsZWQgfHwgbm9kZS5jbGFzc05hbWUuaW5jbHVkZXMoJ2Rpc2FibGVkJykgfHwgbm9kZS5jbGFzc05hbWUuaW5jbHVkZXMoJy1sZWF2ZScpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHNob3dXYXZlKGUpO1xuICAgIH07XG4gICAgLy8gQmluZCBldmVudHNcbiAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb25DbGljaywgdHJ1ZSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvbkNsaWNrLCB0cnVlKTtcbiAgICB9O1xuICB9LCBbZGlzYWJsZWRdKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgaWYgKCEgLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSkge1xuICAgIHJldHVybiBjaGlsZHJlbiAhPT0gbnVsbCAmJiBjaGlsZHJlbiAhPT0gdm9pZCAwID8gY2hpbGRyZW4gOiBudWxsO1xuICB9XG4gIGNvbnN0IHJlZiA9IHN1cHBvcnRSZWYoY2hpbGRyZW4pID8gY29tcG9zZVJlZihnZXROb2RlUmVmKGNoaWxkcmVuKSwgY29udGFpbmVyUmVmKSA6IGNvbnRhaW5lclJlZjtcbiAgcmV0dXJuIGNsb25lRWxlbWVudChjaGlsZHJlbiwge1xuICAgIHJlZlxuICB9KTtcbn07XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBXYXZlLmRpc3BsYXlOYW1lID0gJ1dhdmUnO1xufVxuZXhwb3J0IGRlZmF1bHQgV2F2ZTsiLCAiZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICBpZiAoZWxlbWVudC5vZmZzZXRQYXJlbnQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoZWxlbWVudC5nZXRCQm94KSB7XG4gICAgICB2YXIgX2dldEJCb3ggPSBlbGVtZW50LmdldEJCb3goKSxcbiAgICAgICAgd2lkdGggPSBfZ2V0QkJveC53aWR0aCxcbiAgICAgICAgaGVpZ2h0ID0gX2dldEJCb3guaGVpZ2h0O1xuICAgICAgaWYgKHdpZHRoIHx8IGhlaWdodCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KSB7XG4gICAgICB2YXIgX2VsZW1lbnQkZ2V0Qm91bmRpbmdDID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgX3dpZHRoID0gX2VsZW1lbnQkZ2V0Qm91bmRpbmdDLndpZHRoLFxuICAgICAgICBfaGVpZ2h0ID0gX2VsZW1lbnQkZ2V0Qm91bmRpbmdDLmhlaWdodDtcbiAgICAgIGlmIChfd2lkdGggfHwgX2hlaWdodCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufSk7IiwgImltcG9ydCB7IGdlbkNvbXBvbmVudFN0eWxlSG9vayB9IGZyb20gJy4uLy4uL3RoZW1lL2ludGVybmFsJztcbmNvbnN0IGdlbldhdmVTdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENscyxcbiAgICBjb2xvclByaW1hcnlcbiAgfSA9IHRva2VuO1xuICByZXR1cm4ge1xuICAgIFtjb21wb25lbnRDbHNdOiB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCcsXG4gICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gICAgICBib3hTaXppbmc6ICdib3JkZXItYm94JyxcbiAgICAgIGNvbG9yOiBgdmFyKC0td2F2ZS1jb2xvciwgJHtjb2xvclByaW1hcnl9KWAsXG4gICAgICBib3hTaGFkb3c6IGAwIDAgMCAwIGN1cnJlbnRjb2xvcmAsXG4gICAgICBvcGFjaXR5OiAwLjIsXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09IE1vdGlvbiA9PT09PT09PT09PT09PT09PT09XG4gICAgICAnJi53YXZlLW1vdGlvbi1hcHBlYXInOiB7XG4gICAgICAgIHRyYW5zaXRpb246IFtgYm94LXNoYWRvdyAwLjRzICR7dG9rZW4ubW90aW9uRWFzZU91dENpcmN9YCwgYG9wYWNpdHkgMnMgJHt0b2tlbi5tb3Rpb25FYXNlT3V0Q2lyY31gXS5qb2luKCcsJyksXG4gICAgICAgICcmLWFjdGl2ZSc6IHtcbiAgICAgICAgICBib3hTaGFkb3c6IGAwIDAgMCA2cHggY3VycmVudGNvbG9yYCxcbiAgICAgICAgICBvcGFjaXR5OiAwXG4gICAgICAgIH0sXG4gICAgICAgICcmLndhdmUtcXVpY2snOiB7XG4gICAgICAgICAgdHJhbnNpdGlvbjogW2Bib3gtc2hhZG93ICR7dG9rZW4ubW90aW9uRHVyYXRpb25TbG93fSAke3Rva2VuLm1vdGlvbkVhc2VJbk91dH1gLCBgb3BhY2l0eSAke3Rva2VuLm1vdGlvbkR1cmF0aW9uU2xvd30gJHt0b2tlbi5tb3Rpb25FYXNlSW5PdXR9YF0uam9pbignLCcpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xuZXhwb3J0IGRlZmF1bHQgZ2VuQ29tcG9uZW50U3R5bGVIb29rKCdXYXZlJywgdG9rZW4gPT4gW2dlbldhdmVTdHlsZSh0b2tlbildKTsiLCAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZUV2ZW50IGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZUV2ZW50XCI7XG5pbXBvcnQgcmFmIGZyb20gXCJyYy11dGlsL2VzL3JhZlwiO1xuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uLy4uL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgdXNlVG9rZW4gZnJvbSAnLi4vLi4vdGhlbWUvdXNlVG9rZW4nO1xuaW1wb3J0IHsgVEFSR0VUX0NMUyB9IGZyb20gJy4vaW50ZXJmYWNlJztcbmltcG9ydCBzaG93V2F2ZUVmZmVjdCBmcm9tICcuL1dhdmVFZmZlY3QnO1xuY29uc3QgdXNlV2F2ZSA9IChub2RlUmVmLCBjbGFzc05hbWUsIGNvbXBvbmVudCkgPT4ge1xuICBjb25zdCB7XG4gICAgd2F2ZVxuICB9ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KTtcbiAgY29uc3QgWywgdG9rZW4sIGhhc2hJZF0gPSB1c2VUb2tlbigpO1xuICBjb25zdCBzaG93V2F2ZSA9IHVzZUV2ZW50KGV2ZW50ID0+IHtcbiAgICBjb25zdCBub2RlID0gbm9kZVJlZi5jdXJyZW50O1xuICAgIGlmICgod2F2ZSA9PT0gbnVsbCB8fCB3YXZlID09PSB2b2lkIDAgPyB2b2lkIDAgOiB3YXZlLmRpc2FibGVkKSB8fCAhbm9kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXROb2RlID0gbm9kZS5xdWVyeVNlbGVjdG9yKGAuJHtUQVJHRVRfQ0xTfWApIHx8IG5vZGU7XG4gICAgY29uc3Qge1xuICAgICAgc2hvd0VmZmVjdFxuICAgIH0gPSB3YXZlIHx8IHt9O1xuICAgIC8vIEN1c3RvbWl6ZSB3YXZlIGVmZmVjdFxuICAgIChzaG93RWZmZWN0IHx8IHNob3dXYXZlRWZmZWN0KSh0YXJnZXROb2RlLCB7XG4gICAgICBjbGFzc05hbWUsXG4gICAgICB0b2tlbixcbiAgICAgIGNvbXBvbmVudCxcbiAgICAgIGV2ZW50LFxuICAgICAgaGFzaElkXG4gICAgfSk7XG4gIH0pO1xuICBjb25zdCByYWZJZCA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgLy8gTWVyZ2UgdHJpZ2dlciBldmVudCBpbnRvIG9uZSBmb3IgZWFjaCBmcmFtZVxuICBjb25zdCBzaG93RGVib3VuY2VXYXZlID0gZXZlbnQgPT4ge1xuICAgIHJhZi5jYW5jZWwocmFmSWQuY3VycmVudCk7XG4gICAgcmFmSWQuY3VycmVudCA9IHJhZigoKSA9PiB7XG4gICAgICBzaG93V2F2ZShldmVudCk7XG4gICAgfSk7XG4gIH07XG4gIHJldHVybiBzaG93RGVib3VuY2VXYXZlO1xufTtcbmV4cG9ydCBkZWZhdWx0IHVzZVdhdmU7IiwgImltcG9ydCB7IGRlZmF1bHRQcmVmaXhDbHMgfSBmcm9tICcuLi8uLi9jb25maWctcHJvdmlkZXInO1xuZXhwb3J0IGNvbnN0IFRBUkdFVF9DTFMgPSBgJHtkZWZhdWx0UHJlZml4Q2xzfS13YXZlLXRhcmdldGA7IiwgIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBDU1NNb3Rpb24gZnJvbSAncmMtbW90aW9uJztcbmltcG9ydCByYWYgZnJvbSBcInJjLXV0aWwvZXMvcmFmXCI7XG5pbXBvcnQgeyBjb21wb3NlUmVmIH0gZnJvbSBcInJjLXV0aWwvZXMvcmVmXCI7XG5pbXBvcnQgeyBnZXRSZWFjdFJlbmRlciB9IGZyb20gJy4uLy4uL2NvbmZpZy1wcm92aWRlci9VbnN0YWJsZUNvbnRleHQnO1xuaW1wb3J0IHsgVEFSR0VUX0NMUyB9IGZyb20gJy4vaW50ZXJmYWNlJztcbmltcG9ydCB7IGdldFRhcmdldFdhdmVDb2xvciB9IGZyb20gJy4vdXRpbCc7XG5mdW5jdGlvbiB2YWxpZGF0ZU51bSh2YWx1ZSkge1xuICByZXR1cm4gTnVtYmVyLmlzTmFOKHZhbHVlKSA/IDAgOiB2YWx1ZTtcbn1cbmNvbnN0IFdhdmVFZmZlY3QgPSBwcm9wcyA9PiB7XG4gIGNvbnN0IHtcbiAgICBjbGFzc05hbWUsXG4gICAgdGFyZ2V0LFxuICAgIGNvbXBvbmVudCxcbiAgICByZWdpc3RlclVubW91bnRcbiAgfSA9IHByb3BzO1xuICBjb25zdCBkaXZSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT0gUmVmcyA9PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IHVubW91bnRSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgdW5tb3VudFJlZi5jdXJyZW50ID0gcmVnaXN0ZXJVbm1vdW50KCk7XG4gIH0sIFtdKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09IEVmZmVjdCA9PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3QgW2NvbG9yLCBzZXRXYXZlQ29sb3JdID0gUmVhY3QudXNlU3RhdGUobnVsbCk7XG4gIGNvbnN0IFtib3JkZXJSYWRpdXMsIHNldEJvcmRlclJhZGl1c10gPSBSZWFjdC51c2VTdGF0ZShbXSk7XG4gIGNvbnN0IFtsZWZ0LCBzZXRMZWZ0XSA9IFJlYWN0LnVzZVN0YXRlKDApO1xuICBjb25zdCBbdG9wLCBzZXRUb3BdID0gUmVhY3QudXNlU3RhdGUoMCk7XG4gIGNvbnN0IFt3aWR0aCwgc2V0V2lkdGhdID0gUmVhY3QudXNlU3RhdGUoMCk7XG4gIGNvbnN0IFtoZWlnaHQsIHNldEhlaWdodF0gPSBSZWFjdC51c2VTdGF0ZSgwKTtcbiAgY29uc3QgW2VuYWJsZWQsIHNldEVuYWJsZWRdID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCB3YXZlU3R5bGUgPSB7XG4gICAgbGVmdCxcbiAgICB0b3AsXG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIGJvcmRlclJhZGl1czogYm9yZGVyUmFkaXVzLm1hcChyYWRpdXMgPT4gYCR7cmFkaXVzfXB4YCkuam9pbignICcpXG4gIH07XG4gIGlmIChjb2xvcikge1xuICAgIHdhdmVTdHlsZVsnLS13YXZlLWNvbG9yJ10gPSBjb2xvcjtcbiAgfVxuICBmdW5jdGlvbiBzeW5jUG9zKCkge1xuICAgIGNvbnN0IG5vZGVTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUodGFyZ2V0KTtcbiAgICAvLyBHZXQgd2F2ZSBjb2xvciBmcm9tIHRhcmdldFxuICAgIHNldFdhdmVDb2xvcihnZXRUYXJnZXRXYXZlQ29sb3IodGFyZ2V0KSk7XG4gICAgY29uc3QgaXNTdGF0aWMgPSBub2RlU3R5bGUucG9zaXRpb24gPT09ICdzdGF0aWMnO1xuICAgIC8vIFJlY3RcbiAgICBjb25zdCB7XG4gICAgICBib3JkZXJMZWZ0V2lkdGgsXG4gICAgICBib3JkZXJUb3BXaWR0aFxuICAgIH0gPSBub2RlU3R5bGU7XG4gICAgc2V0TGVmdChpc1N0YXRpYyA/IHRhcmdldC5vZmZzZXRMZWZ0IDogdmFsaWRhdGVOdW0oLXBhcnNlRmxvYXQoYm9yZGVyTGVmdFdpZHRoKSkpO1xuICAgIHNldFRvcChpc1N0YXRpYyA/IHRhcmdldC5vZmZzZXRUb3AgOiB2YWxpZGF0ZU51bSgtcGFyc2VGbG9hdChib3JkZXJUb3BXaWR0aCkpKTtcbiAgICBzZXRXaWR0aCh0YXJnZXQub2Zmc2V0V2lkdGgpO1xuICAgIHNldEhlaWdodCh0YXJnZXQub2Zmc2V0SGVpZ2h0KTtcbiAgICAvLyBHZXQgYm9yZGVyIHJhZGl1c1xuICAgIGNvbnN0IHtcbiAgICAgIGJvcmRlclRvcExlZnRSYWRpdXMsXG4gICAgICBib3JkZXJUb3BSaWdodFJhZGl1cyxcbiAgICAgIGJvcmRlckJvdHRvbUxlZnRSYWRpdXMsXG4gICAgICBib3JkZXJCb3R0b21SaWdodFJhZGl1c1xuICAgIH0gPSBub2RlU3R5bGU7XG4gICAgc2V0Qm9yZGVyUmFkaXVzKFtib3JkZXJUb3BMZWZ0UmFkaXVzLCBib3JkZXJUb3BSaWdodFJhZGl1cywgYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMsIGJvcmRlckJvdHRvbUxlZnRSYWRpdXNdLm1hcChyYWRpdXMgPT4gdmFsaWRhdGVOdW0ocGFyc2VGbG9hdChyYWRpdXMpKSkpO1xuICB9XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHRhcmdldCkge1xuICAgICAgLy8gV2UgbmVlZCBkZWxheSB0byBjaGVjayBwb3NpdGlvbiBoZXJlXG4gICAgICAvLyBzaW5jZSBVSSBtYXkgY2hhbmdlIGFmdGVyIGNsaWNrXG4gICAgICBjb25zdCBpZCA9IHJhZigoKSA9PiB7XG4gICAgICAgIHN5bmNQb3MoKTtcbiAgICAgICAgc2V0RW5hYmxlZCh0cnVlKTtcbiAgICAgIH0pO1xuICAgICAgLy8gQWRkIHJlc2l6ZSBvYnNlcnZlciB0byBmb2xsb3cgc2l6ZVxuICAgICAgbGV0IHJlc2l6ZU9ic2VydmVyO1xuICAgICAgaWYgKHR5cGVvZiBSZXNpemVPYnNlcnZlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoc3luY1Bvcyk7XG4gICAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUodGFyZ2V0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIHJhZi5jYW5jZWwoaWQpO1xuICAgICAgICByZXNpemVPYnNlcnZlciA9PT0gbnVsbCB8fCByZXNpemVPYnNlcnZlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgfTtcbiAgICB9XG4gIH0sIFtdKTtcbiAgaWYgKCFlbmFibGVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgaXNTbWFsbENvbXBvbmVudCA9IChjb21wb25lbnQgPT09ICdDaGVja2JveCcgfHwgY29tcG9uZW50ID09PSAnUmFkaW8nKSAmJiAodGFyZ2V0ID09PSBudWxsIHx8IHRhcmdldCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucyhUQVJHRVRfQ0xTKSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDU1NNb3Rpb24sIHtcbiAgICB2aXNpYmxlOiB0cnVlLFxuICAgIG1vdGlvbkFwcGVhcjogdHJ1ZSxcbiAgICBtb3Rpb25OYW1lOiBcIndhdmUtbW90aW9uXCIsXG4gICAgbW90aW9uRGVhZGxpbmU6IDUwMDAsXG4gICAgb25BcHBlYXJFbmQ6IChfLCBldmVudCkgPT4ge1xuICAgICAgdmFyIF9hLCBfYjtcbiAgICAgIGlmIChldmVudC5kZWFkbGluZSB8fCBldmVudC5wcm9wZXJ0eU5hbWUgPT09ICdvcGFjaXR5Jykge1xuICAgICAgICBjb25zdCBob2xkZXIgPSAoX2EgPSBkaXZSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgIChfYiA9IHVubW91bnRSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwodW5tb3VudFJlZikudGhlbigoKSA9PiB7XG4gICAgICAgICAgaG9sZGVyID09PSBudWxsIHx8IGhvbGRlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogaG9sZGVyLnJlbW92ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sIChfcmVmLCByZWYpID0+IHtcbiAgICBsZXQge1xuICAgICAgY2xhc3NOYW1lOiBtb3Rpb25DbGFzc05hbWVcbiAgICB9ID0gX3JlZjtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgcmVmOiBjb21wb3NlUmVmKGRpdlJlZiwgcmVmKSxcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIG1vdGlvbkNsYXNzTmFtZSwge1xuICAgICAgICAnd2F2ZS1xdWljayc6IGlzU21hbGxDb21wb25lbnRcbiAgICAgIH0pLFxuICAgICAgc3R5bGU6IHdhdmVTdHlsZVxuICAgIH0pO1xuICB9KTtcbn07XG5jb25zdCBzaG93V2F2ZUVmZmVjdCA9ICh0YXJnZXQsIGluZm8pID0+IHtcbiAgdmFyIF9hO1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50XG4gIH0gPSBpbmZvO1xuICAvLyBTa2lwIGZvciB1bmNoZWNrZWQgY2hlY2tib3hcbiAgaWYgKGNvbXBvbmVudCA9PT0gJ0NoZWNrYm94JyAmJiAhKChfYSA9IHRhcmdldC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2hlY2tlZCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gQ3JlYXRlIGhvbGRlclxuICBjb25zdCBob2xkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgaG9sZGVyLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgaG9sZGVyLnN0eWxlLmxlZnQgPSAnMHB4JztcbiAgaG9sZGVyLnN0eWxlLnRvcCA9ICcwcHgnO1xuICB0YXJnZXQgPT09IG51bGwgfHwgdGFyZ2V0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0YXJnZXQuaW5zZXJ0QmVmb3JlKGhvbGRlciwgdGFyZ2V0ID09PSBudWxsIHx8IHRhcmdldCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGFyZ2V0LmZpcnN0Q2hpbGQpO1xuICBjb25zdCByZWFjdFJlbmRlciA9IGdldFJlYWN0UmVuZGVyKCk7XG4gIGxldCB1bm1vdW50Q2FsbGJhY2sgPSBudWxsO1xuICBmdW5jdGlvbiByZWdpc3RlclVubW91bnQoKSB7XG4gICAgcmV0dXJuIHVubW91bnRDYWxsYmFjaztcbiAgfVxuICB1bm1vdW50Q2FsbGJhY2sgPSByZWFjdFJlbmRlcigvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChXYXZlRWZmZWN0LCBPYmplY3QuYXNzaWduKHt9LCBpbmZvLCB7XG4gICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgcmVnaXN0ZXJVbm1vdW50OiByZWdpc3RlclVubW91bnRcbiAgfSkpLCBob2xkZXIpO1xufTtcbmV4cG9ydCBkZWZhdWx0IHNob3dXYXZlRWZmZWN0OyIsICJleHBvcnQgZnVuY3Rpb24gaXNWYWxpZFdhdmVDb2xvcihjb2xvcikge1xuICByZXR1cm4gY29sb3IgJiYgY29sb3IgIT09ICcjZmZmJyAmJiBjb2xvciAhPT0gJyNmZmZmZmYnICYmIGNvbG9yICE9PSAncmdiKDI1NSwgMjU1LCAyNTUpJyAmJiBjb2xvciAhPT0gJ3JnYmEoMjU1LCAyNTUsIDI1NSwgMSknICYmICEvcmdiYVxcKCg/OlxcZCosICl7M30wXFwpLy50ZXN0KGNvbG9yKSAmJlxuICAvLyBhbnkgdHJhbnNwYXJlbnQgcmdiYSBjb2xvclxuICBjb2xvciAhPT0gJ3RyYW5zcGFyZW50Jztcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYXJnZXRXYXZlQ29sb3Iobm9kZSkge1xuICBjb25zdCB7XG4gICAgYm9yZGVyVG9wQ29sb3IsXG4gICAgYm9yZGVyQ29sb3IsXG4gICAgYmFja2dyb3VuZENvbG9yXG4gIH0gPSBnZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuICBpZiAoaXNWYWxpZFdhdmVDb2xvcihib3JkZXJUb3BDb2xvcikpIHtcbiAgICByZXR1cm4gYm9yZGVyVG9wQ29sb3I7XG4gIH1cbiAgaWYgKGlzVmFsaWRXYXZlQ29sb3IoYm9yZGVyQ29sb3IpKSB7XG4gICAgcmV0dXJuIGJvcmRlckNvbG9yO1xuICB9XG4gIGlmIChpc1ZhbGlkV2F2ZUNvbG9yKGJhY2tncm91bmRDb2xvcikpIHtcbiAgICByZXR1cm4gYmFja2dyb3VuZENvbG9yO1xuICB9XG4gIHJldHVybiBudWxsO1xufSIsICJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFNpemVDb250ZXh0IGZyb20gJy4uL1NpemVDb250ZXh0JztcbmNvbnN0IHVzZVNpemUgPSBjdXN0b21TaXplID0+IHtcbiAgY29uc3Qgc2l6ZSA9IFJlYWN0LnVzZUNvbnRleHQoU2l6ZUNvbnRleHQpO1xuICBjb25zdCBtZXJnZWRTaXplID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCFjdXN0b21TaXplKSB7XG4gICAgICByZXR1cm4gc2l6ZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjdXN0b21TaXplID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGN1c3RvbVNpemUgIT09IG51bGwgJiYgY3VzdG9tU2l6ZSAhPT0gdm9pZCAwID8gY3VzdG9tU2l6ZSA6IHNpemU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY3VzdG9tU2l6ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGN1c3RvbVNpemUoc2l6ZSk7XG4gICAgfVxuICAgIHJldHVybiBzaXplO1xuICB9LCBbY3VzdG9tU2l6ZSwgc2l6ZV0pO1xuICByZXR1cm4gbWVyZ2VkU2l6ZTtcbn07XG5leHBvcnQgZGVmYXVsdCB1c2VTaXplOyIsICJcInVzZSBjbGllbnRcIjtcblxudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHRvQXJyYXkgZnJvbSBcInJjLXV0aWwvZXMvQ2hpbGRyZW4vdG9BcnJheVwiO1xuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgdXNlU2l6ZSBmcm9tICcuLi9jb25maWctcHJvdmlkZXIvaG9va3MvdXNlU2l6ZSc7XG5pbXBvcnQgdXNlU3R5bGUgZnJvbSAnLi9zdHlsZSc7XG5leHBvcnQgY29uc3QgU3BhY2VDb21wYWN0SXRlbUNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmV4cG9ydCBjb25zdCB1c2VDb21wYWN0SXRlbUNvbnRleHQgPSAocHJlZml4Q2xzLCBkaXJlY3Rpb24pID0+IHtcbiAgY29uc3QgY29tcGFjdEl0ZW1Db250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChTcGFjZUNvbXBhY3RJdGVtQ29udGV4dCk7XG4gIGNvbnN0IGNvbXBhY3RJdGVtQ2xhc3NuYW1lcyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICghY29tcGFjdEl0ZW1Db250ZXh0KSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIGNvbXBhY3REaXJlY3Rpb24sXG4gICAgICBpc0ZpcnN0SXRlbSxcbiAgICAgIGlzTGFzdEl0ZW1cbiAgICB9ID0gY29tcGFjdEl0ZW1Db250ZXh0O1xuICAgIGNvbnN0IHNlcGFyYXRvciA9IGNvbXBhY3REaXJlY3Rpb24gPT09ICd2ZXJ0aWNhbCcgPyAnLXZlcnRpY2FsLScgOiAnLSc7XG4gICAgcmV0dXJuIGNsYXNzTmFtZXMoYCR7cHJlZml4Q2xzfS1jb21wYWN0JHtzZXBhcmF0b3J9aXRlbWAsIHtcbiAgICAgIFtgJHtwcmVmaXhDbHN9LWNvbXBhY3Qke3NlcGFyYXRvcn1maXJzdC1pdGVtYF06IGlzRmlyc3RJdGVtLFxuICAgICAgW2Ake3ByZWZpeENsc30tY29tcGFjdCR7c2VwYXJhdG9yfWxhc3QtaXRlbWBdOiBpc0xhc3RJdGVtLFxuICAgICAgW2Ake3ByZWZpeENsc30tY29tcGFjdCR7c2VwYXJhdG9yfWl0ZW0tcnRsYF06IGRpcmVjdGlvbiA9PT0gJ3J0bCdcbiAgICB9KTtcbiAgfSwgW3ByZWZpeENscywgZGlyZWN0aW9uLCBjb21wYWN0SXRlbUNvbnRleHRdKTtcbiAgcmV0dXJuIHtcbiAgICBjb21wYWN0U2l6ZTogY29tcGFjdEl0ZW1Db250ZXh0ID09PSBudWxsIHx8IGNvbXBhY3RJdGVtQ29udGV4dCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29tcGFjdEl0ZW1Db250ZXh0LmNvbXBhY3RTaXplLFxuICAgIGNvbXBhY3REaXJlY3Rpb246IGNvbXBhY3RJdGVtQ29udGV4dCA9PT0gbnVsbCB8fCBjb21wYWN0SXRlbUNvbnRleHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbXBhY3RJdGVtQ29udGV4dC5jb21wYWN0RGlyZWN0aW9uLFxuICAgIGNvbXBhY3RJdGVtQ2xhc3NuYW1lc1xuICB9O1xufTtcbmV4cG9ydCBjb25zdCBOb0NvbXBhY3RTdHlsZSA9IHByb3BzID0+IHtcbiAgY29uc3Qge1xuICAgIGNoaWxkcmVuXG4gIH0gPSBwcm9wcztcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNwYWNlQ29tcGFjdEl0ZW1Db250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IG51bGxcbiAgfSwgY2hpbGRyZW4pO1xufTtcbmNvbnN0IENvbXBhY3RJdGVtID0gcHJvcHMgPT4ge1xuICBjb25zdCB7XG4gICAgICBjaGlsZHJlblxuICAgIH0gPSBwcm9wcyxcbiAgICBvdGhlcnMgPSBfX3Jlc3QocHJvcHMsIFtcImNoaWxkcmVuXCJdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNwYWNlQ29tcGFjdEl0ZW1Db250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IFJlYWN0LnVzZU1lbW8oKCkgPT4gb3RoZXJzLCBbb3RoZXJzXSlcbiAgfSwgY2hpbGRyZW4pO1xufTtcbmNvbnN0IENvbXBhY3QgPSBwcm9wcyA9PiB7XG4gIGNvbnN0IHtcbiAgICBnZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uOiBkaXJlY3Rpb25Db25maWdcbiAgfSA9IFJlYWN0LnVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCk7XG4gIGNvbnN0IHtcbiAgICAgIHNpemUsXG4gICAgICBkaXJlY3Rpb24sXG4gICAgICBibG9jayxcbiAgICAgIHByZWZpeENsczogY3VzdG9taXplUHJlZml4Q2xzLFxuICAgICAgY2xhc3NOYW1lLFxuICAgICAgcm9vdENsYXNzTmFtZSxcbiAgICAgIGNoaWxkcmVuXG4gICAgfSA9IHByb3BzLFxuICAgIHJlc3RQcm9wcyA9IF9fcmVzdChwcm9wcywgW1wic2l6ZVwiLCBcImRpcmVjdGlvblwiLCBcImJsb2NrXCIsIFwicHJlZml4Q2xzXCIsIFwiY2xhc3NOYW1lXCIsIFwicm9vdENsYXNzTmFtZVwiLCBcImNoaWxkcmVuXCJdKTtcbiAgY29uc3QgbWVyZ2VkU2l6ZSA9IHVzZVNpemUoY3R4ID0+IHNpemUgIT09IG51bGwgJiYgc2l6ZSAhPT0gdm9pZCAwID8gc2l6ZSA6IGN0eCk7XG4gIGNvbnN0IHByZWZpeENscyA9IGdldFByZWZpeENscygnc3BhY2UtY29tcGFjdCcsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIGNvbnN0IFt3cmFwQ1NTVmFyLCBoYXNoSWRdID0gdXNlU3R5bGUocHJlZml4Q2xzKTtcbiAgY29uc3QgY2x4ID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIGhhc2hJZCwge1xuICAgIFtgJHtwcmVmaXhDbHN9LXJ0bGBdOiBkaXJlY3Rpb25Db25maWcgPT09ICdydGwnLFxuICAgIFtgJHtwcmVmaXhDbHN9LWJsb2NrYF06IGJsb2NrLFxuICAgIFtgJHtwcmVmaXhDbHN9LXZlcnRpY2FsYF06IGRpcmVjdGlvbiA9PT0gJ3ZlcnRpY2FsJ1xuICB9LCBjbGFzc05hbWUsIHJvb3RDbGFzc05hbWUpO1xuICBjb25zdCBjb21wYWN0SXRlbUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KFNwYWNlQ29tcGFjdEl0ZW1Db250ZXh0KTtcbiAgY29uc3QgY2hpbGROb2RlcyA9IHRvQXJyYXkoY2hpbGRyZW4pO1xuICBjb25zdCBub2RlcyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gY2hpbGROb2Rlcy5tYXAoKGNoaWxkLCBpKSA9PiB7XG4gICAgY29uc3Qga2V5ID0gKGNoaWxkID09PSBudWxsIHx8IGNoaWxkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjaGlsZC5rZXkpIHx8IGAke3ByZWZpeENsc30taXRlbS0ke2l9YDtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcGFjdEl0ZW0sIHtcbiAgICAgIGtleToga2V5LFxuICAgICAgY29tcGFjdFNpemU6IG1lcmdlZFNpemUsXG4gICAgICBjb21wYWN0RGlyZWN0aW9uOiBkaXJlY3Rpb24sXG4gICAgICBpc0ZpcnN0SXRlbTogaSA9PT0gMCAmJiAoIWNvbXBhY3RJdGVtQ29udGV4dCB8fCAoY29tcGFjdEl0ZW1Db250ZXh0ID09PSBudWxsIHx8IGNvbXBhY3RJdGVtQ29udGV4dCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29tcGFjdEl0ZW1Db250ZXh0LmlzRmlyc3RJdGVtKSksXG4gICAgICBpc0xhc3RJdGVtOiBpID09PSBjaGlsZE5vZGVzLmxlbmd0aCAtIDEgJiYgKCFjb21wYWN0SXRlbUNvbnRleHQgfHwgKGNvbXBhY3RJdGVtQ29udGV4dCA9PT0gbnVsbCB8fCBjb21wYWN0SXRlbUNvbnRleHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbXBhY3RJdGVtQ29udGV4dC5pc0xhc3RJdGVtKSlcbiAgICB9LCBjaGlsZCk7XG4gIH0pLCBbc2l6ZSwgY2hpbGROb2RlcywgY29tcGFjdEl0ZW1Db250ZXh0XSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGlmIChjaGlsZE5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiB3cmFwQ1NTVmFyKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIE9iamVjdC5hc3NpZ24oe1xuICAgIGNsYXNzTmFtZTogY2x4XG4gIH0sIHJlc3RQcm9wcyksIG5vZGVzKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgQ29tcGFjdDsiLCAiXCJ1c2UgY2xpZW50XCI7XG5cbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IGRldlVzZVdhcm5pbmcgfSBmcm9tICcuLi9fdXRpbC93YXJuaW5nJztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHsgdXNlVG9rZW4gfSBmcm9tICcuLi90aGVtZS9pbnRlcm5hbCc7XG5leHBvcnQgY29uc3QgR3JvdXBTaXplQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHVuZGVmaW5lZCk7XG5jb25zdCBCdXR0b25Hcm91cCA9IHByb3BzID0+IHtcbiAgY29uc3Qge1xuICAgIGdldFByZWZpeENscyxcbiAgICBkaXJlY3Rpb25cbiAgfSA9IFJlYWN0LnVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCk7XG4gIGNvbnN0IHtcbiAgICAgIHByZWZpeENsczogY3VzdG9taXplUHJlZml4Q2xzLFxuICAgICAgc2l6ZSxcbiAgICAgIGNsYXNzTmFtZVxuICAgIH0gPSBwcm9wcyxcbiAgICBvdGhlcnMgPSBfX3Jlc3QocHJvcHMsIFtcInByZWZpeENsc1wiLCBcInNpemVcIiwgXCJjbGFzc05hbWVcIl0pO1xuICBjb25zdCBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2J0bi1ncm91cCcsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIGNvbnN0IFssLCBoYXNoSWRdID0gdXNlVG9rZW4oKTtcbiAgY29uc3Qgc2l6ZUNscyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIHN3aXRjaCAoc2l6ZSkge1xuICAgICAgY2FzZSAnbGFyZ2UnOlxuICAgICAgICByZXR1cm4gJ2xnJztcbiAgICAgIGNhc2UgJ3NtYWxsJzpcbiAgICAgICAgcmV0dXJuICdzbSc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9LCBbc2l6ZV0pO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGNvbnN0IHdhcm5pbmcgPSBkZXZVc2VXYXJuaW5nKCdCdXR0b24uR3JvdXAnKTtcbiAgICB3YXJuaW5nLmRlcHJlY2F0ZWQoZmFsc2UsICdCdXR0b24uR3JvdXAnLCAnU3BhY2UuQ29tcGFjdCcpO1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoIXNpemUgfHwgWydsYXJnZScsICdzbWFsbCcsICdtaWRkbGUnXS5pbmNsdWRlcyhzaXplKSwgJ3VzYWdlJywgJ0ludmFsaWQgcHJvcCBgc2l6ZWAuJykgOiB2b2lkIDA7XG4gIH1cbiAgY29uc3QgY2xhc3NlcyA9IGNsYXNzTmFtZXMocHJlZml4Q2xzLCB7XG4gICAgW2Ake3ByZWZpeENsc30tJHtzaXplQ2xzfWBdOiBzaXplQ2xzLFxuICAgIFtgJHtwcmVmaXhDbHN9LXJ0bGBdOiBkaXJlY3Rpb24gPT09ICdydGwnXG4gIH0sIGNsYXNzTmFtZSwgaGFzaElkKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEdyb3VwU2l6ZUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogc2l6ZVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBPYmplY3QuYXNzaWduKHt9LCBvdGhlcnMsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgfSkpKTtcbn07XG5leHBvcnQgZGVmYXVsdCBCdXR0b25Hcm91cDsiLCAiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY2xvbmVFbGVtZW50LCBpc0ZyYWdtZW50IH0gZnJvbSAnLi4vX3V0aWwvcmVhY3ROb2RlJztcbmltcG9ydCB7IFByZXNldENvbG9ycyB9IGZyb20gJy4uL3RoZW1lL2ludGVyZmFjZSc7XG5jb25zdCByeFR3b0NOQ2hhciA9IC9eW1xcdTRFMDAtXFx1OUZBNV17Mn0kLztcbmV4cG9ydCBjb25zdCBpc1R3b0NOQ2hhciA9IHJ4VHdvQ05DaGFyLnRlc3QuYmluZChyeFR3b0NOQ2hhcik7XG5leHBvcnQgZnVuY3Rpb24gY29udmVydExlZ2FjeVByb3BzKHR5cGUpIHtcbiAgaWYgKHR5cGUgPT09ICdkYW5nZXInKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRhbmdlcjogdHJ1ZVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0eXBlXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmcoc3RyKSB7XG4gIHJldHVybiB0eXBlb2Ygc3RyID09PSAnc3RyaW5nJztcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1VuQm9yZGVyZWRCdXR0b25WYXJpYW50KHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUgPT09ICd0ZXh0JyB8fCB0eXBlID09PSAnbGluayc7XG59XG5mdW5jdGlvbiBzcGxpdENOQ2hhcnNCeVNwYWNlKGNoaWxkLCBuZWVkSW5zZXJ0ZWQpIHtcbiAgaWYgKGNoaWxkID09PSBudWxsIHx8IGNoaWxkID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgU1BBQ0UgPSBuZWVkSW5zZXJ0ZWQgPyAnICcgOiAnJztcbiAgaWYgKHR5cGVvZiBjaGlsZCAhPT0gJ3N0cmluZycgJiYgdHlwZW9mIGNoaWxkICE9PSAnbnVtYmVyJyAmJiBpc1N0cmluZyhjaGlsZC50eXBlKSAmJiBpc1R3b0NOQ2hhcihjaGlsZC5wcm9wcy5jaGlsZHJlbikpIHtcbiAgICByZXR1cm4gY2xvbmVFbGVtZW50KGNoaWxkLCB7XG4gICAgICBjaGlsZHJlbjogY2hpbGQucHJvcHMuY2hpbGRyZW4uc3BsaXQoJycpLmpvaW4oU1BBQ0UpXG4gICAgfSk7XG4gIH1cbiAgaWYgKGlzU3RyaW5nKGNoaWxkKSkge1xuICAgIHJldHVybiBpc1R3b0NOQ2hhcihjaGlsZCkgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgY2hpbGQuc3BsaXQoJycpLmpvaW4oU1BBQ0UpKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBjaGlsZCk7XG4gIH1cbiAgaWYgKGlzRnJhZ21lbnQoY2hpbGQpKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBjaGlsZCk7XG4gIH1cbiAgcmV0dXJuIGNoaWxkO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNwYWNlQ2hpbGRyZW4oY2hpbGRyZW4sIG5lZWRJbnNlcnRlZCkge1xuICBsZXQgaXNQcmV2Q2hpbGRQdXJlID0gZmFsc2U7XG4gIGNvbnN0IGNoaWxkTGlzdCA9IFtdO1xuICBSZWFjdC5DaGlsZHJlbi5mb3JFYWNoKGNoaWxkcmVuLCBjaGlsZCA9PiB7XG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiBjaGlsZDtcbiAgICBjb25zdCBpc0N1cnJlbnRDaGlsZFB1cmUgPSB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlID09PSAnbnVtYmVyJztcbiAgICBpZiAoaXNQcmV2Q2hpbGRQdXJlICYmIGlzQ3VycmVudENoaWxkUHVyZSkge1xuICAgICAgY29uc3QgbGFzdEluZGV4ID0gY2hpbGRMaXN0Lmxlbmd0aCAtIDE7XG4gICAgICBjb25zdCBsYXN0Q2hpbGQgPSBjaGlsZExpc3RbbGFzdEluZGV4XTtcbiAgICAgIGNoaWxkTGlzdFtsYXN0SW5kZXhdID0gYCR7bGFzdENoaWxkfSR7Y2hpbGR9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hpbGRMaXN0LnB1c2goY2hpbGQpO1xuICAgIH1cbiAgICBpc1ByZXZDaGlsZFB1cmUgPSBpc0N1cnJlbnRDaGlsZFB1cmU7XG4gIH0pO1xuICByZXR1cm4gUmVhY3QuQ2hpbGRyZW4ubWFwKGNoaWxkTGlzdCwgY2hpbGQgPT4gc3BsaXRDTkNoYXJzQnlTcGFjZShjaGlsZCwgbmVlZEluc2VydGVkKSk7XG59XG5jb25zdCBfQnV0dG9uVHlwZXMgPSBbJ2RlZmF1bHQnLCAncHJpbWFyeScsICdkYXNoZWQnLCAnbGluaycsICd0ZXh0J107XG5jb25zdCBfQnV0dG9uU2hhcGVzID0gWydkZWZhdWx0JywgJ2NpcmNsZScsICdyb3VuZCddO1xuY29uc3QgX0J1dHRvbkhUTUxUeXBlcyA9IFsnc3VibWl0JywgJ2J1dHRvbicsICdyZXNldCddO1xuZXhwb3J0IGNvbnN0IF9CdXR0b25WYXJpYW50VHlwZXMgPSBbJ291dGxpbmVkJywgJ2Rhc2hlZCcsICdzb2xpZCcsICdmaWxsZWQnLCAndGV4dCcsICdsaW5rJ107XG5leHBvcnQgY29uc3QgX0J1dHRvbkNvbG9yVHlwZXMgPSBbJ2RlZmF1bHQnLCAncHJpbWFyeScsICdkYW5nZXInXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KFByZXNldENvbG9ycykpOyIsICJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0IFJlYWN0LCB7IGZvcndhcmRSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgTG9hZGluZ091dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9Mb2FkaW5nT3V0bGluZWRcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IENTU01vdGlvbiBmcm9tICdyYy1tb3Rpb24nO1xuaW1wb3J0IEljb25XcmFwcGVyIGZyb20gJy4vSWNvbldyYXBwZXInO1xuY29uc3QgSW5uZXJMb2FkaW5nSWNvbiA9IC8qI19fUFVSRV9fKi9mb3J3YXJkUmVmKChwcm9wcywgcmVmKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBwcmVmaXhDbHMsXG4gICAgY2xhc3NOYW1lLFxuICAgIHN0eWxlLFxuICAgIGljb25DbGFzc05hbWVcbiAgfSA9IHByb3BzO1xuICBjb25zdCBtZXJnZWRJY29uQ2xzID0gY2xhc3NOYW1lcyhgJHtwcmVmaXhDbHN9LWxvYWRpbmctaWNvbmAsIGNsYXNzTmFtZSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJY29uV3JhcHBlciwge1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZTogbWVyZ2VkSWNvbkNscyxcbiAgICBzdHlsZTogc3R5bGUsXG4gICAgcmVmOiByZWZcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTG9hZGluZ091dGxpbmVkLCB7XG4gICAgY2xhc3NOYW1lOiBpY29uQ2xhc3NOYW1lXG4gIH0pKTtcbn0pO1xuY29uc3QgZ2V0Q29sbGFwc2VkV2lkdGggPSAoKSA9PiAoe1xuICB3aWR0aDogMCxcbiAgb3BhY2l0eTogMCxcbiAgdHJhbnNmb3JtOiAnc2NhbGUoMCknXG59KTtcbmNvbnN0IGdldFJlYWxXaWR0aCA9IG5vZGUgPT4gKHtcbiAgd2lkdGg6IG5vZGUuc2Nyb2xsV2lkdGgsXG4gIG9wYWNpdHk6IDEsXG4gIHRyYW5zZm9ybTogJ3NjYWxlKDEpJ1xufSk7XG5jb25zdCBEZWZhdWx0TG9hZGluZ0ljb24gPSBwcm9wcyA9PiB7XG4gIGNvbnN0IHtcbiAgICBwcmVmaXhDbHMsXG4gICAgbG9hZGluZyxcbiAgICBleGlzdEljb24sXG4gICAgY2xhc3NOYW1lLFxuICAgIHN0eWxlLFxuICAgIG1vdW50XG4gIH0gPSBwcm9wcztcbiAgY29uc3QgdmlzaWJsZSA9ICEhbG9hZGluZztcbiAgaWYgKGV4aXN0SWNvbikge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJbm5lckxvYWRpbmdJY29uLCB7XG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgICAgc3R5bGU6IHN0eWxlXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENTU01vdGlvbiwge1xuICAgIHZpc2libGU6IHZpc2libGUsXG4gICAgLy8gVXNlZCBmb3IgbWludXMgZmxleCBnYXAgc3R5bGUgb25seVxuICAgIG1vdGlvbk5hbWU6IGAke3ByZWZpeENsc30tbG9hZGluZy1pY29uLW1vdGlvbmAsXG4gICAgbW90aW9uQXBwZWFyOiAhbW91bnQsXG4gICAgbW90aW9uRW50ZXI6ICFtb3VudCxcbiAgICBtb3Rpb25MZWF2ZTogIW1vdW50LFxuICAgIHJlbW92ZU9uTGVhdmU6IHRydWUsXG4gICAgb25BcHBlYXJTdGFydDogZ2V0Q29sbGFwc2VkV2lkdGgsXG4gICAgb25BcHBlYXJBY3RpdmU6IGdldFJlYWxXaWR0aCxcbiAgICBvbkVudGVyU3RhcnQ6IGdldENvbGxhcHNlZFdpZHRoLFxuICAgIG9uRW50ZXJBY3RpdmU6IGdldFJlYWxXaWR0aCxcbiAgICBvbkxlYXZlU3RhcnQ6IGdldFJlYWxXaWR0aCxcbiAgICBvbkxlYXZlQWN0aXZlOiBnZXRDb2xsYXBzZWRXaWR0aFxuICB9LCAoX3JlZiwgcmVmKSA9PiB7XG4gICAgbGV0IHtcbiAgICAgIGNsYXNzTmFtZTogbW90aW9uQ2xzLFxuICAgICAgc3R5bGU6IG1vdGlvblN0eWxlXG4gICAgfSA9IF9yZWY7XG4gICAgY29uc3QgbWVyZ2VkU3R5bGUgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0eWxlKSwgbW90aW9uU3R5bGUpO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJbm5lckxvYWRpbmdJY29uLCB7XG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIG1vdGlvbkNscyksXG4gICAgICBzdHlsZTogbWVyZ2VkU3R5bGUsXG4gICAgICByZWY6IHJlZlxuICAgIH0pO1xuICB9KTtcbn07XG5leHBvcnQgZGVmYXVsdCBEZWZhdWx0TG9hZGluZ0ljb247IiwgIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgUmVhY3QsIHsgZm9yd2FyZFJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuY29uc3QgSWNvbldyYXBwZXIgPSAvKiNfX1BVUkVfXyovZm9yd2FyZFJlZigocHJvcHMsIHJlZikgPT4ge1xuICBjb25zdCB7XG4gICAgY2xhc3NOYW1lLFxuICAgIHN0eWxlLFxuICAgIGNoaWxkcmVuLFxuICAgIHByZWZpeENsc1xuICB9ID0gcHJvcHM7XG4gIGNvbnN0IGljb25XcmFwcGVyQ2xzID0gY2xhc3NOYW1lcyhgJHtwcmVmaXhDbHN9LWljb25gLCBjbGFzc05hbWUpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICByZWY6IHJlZixcbiAgICBjbGFzc05hbWU6IGljb25XcmFwcGVyQ2xzLFxuICAgIHN0eWxlOiBzdHlsZVxuICB9LCBjaGlsZHJlbik7XG59KTtcbmV4cG9ydCBkZWZhdWx0IEljb25XcmFwcGVyOyIsICJjb25zdCBnZW5CdXR0b25Cb3JkZXJTdHlsZSA9IChidXR0b25UeXBlQ2xzLCBib3JkZXJDb2xvcikgPT4gKHtcbiAgLy8gQm9yZGVyXG4gIFtgPiBzcGFuLCA+ICR7YnV0dG9uVHlwZUNsc31gXToge1xuICAgICcmOm5vdCg6bGFzdC1jaGlsZCknOiB7XG4gICAgICBbYCYsICYgPiAke2J1dHRvblR5cGVDbHN9YF06IHtcbiAgICAgICAgJyY6bm90KDpkaXNhYmxlZCknOiB7XG4gICAgICAgICAgYm9yZGVySW5saW5lRW5kQ29sb3I6IGJvcmRlckNvbG9yXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgICcmOm5vdCg6Zmlyc3QtY2hpbGQpJzoge1xuICAgICAgW2AmLCAmID4gJHtidXR0b25UeXBlQ2xzfWBdOiB7XG4gICAgICAgICcmOm5vdCg6ZGlzYWJsZWQpJzoge1xuICAgICAgICAgIGJvcmRlcklubGluZVN0YXJ0Q29sb3I6IGJvcmRlckNvbG9yXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pO1xuY29uc3QgZ2VuR3JvdXBTdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENscyxcbiAgICBmb250U2l6ZSxcbiAgICBsaW5lV2lkdGgsXG4gICAgZ3JvdXBCb3JkZXJDb2xvcixcbiAgICBjb2xvckVycm9ySG92ZXJcbiAgfSA9IHRva2VuO1xuICByZXR1cm4ge1xuICAgIFtgJHtjb21wb25lbnRDbHN9LWdyb3VwYF06IFt7XG4gICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgIGRpc3BsYXk6ICdpbmxpbmUtZmxleCcsXG4gICAgICAvLyBCb3JkZXJcbiAgICAgIFtgPiBzcGFuLCA+ICR7Y29tcG9uZW50Q2xzfWBdOiB7XG4gICAgICAgICcmOm5vdCg6bGFzdC1jaGlsZCknOiB7XG4gICAgICAgICAgW2AmLCAmID4gJHtjb21wb25lbnRDbHN9YF06IHtcbiAgICAgICAgICAgIGJvcmRlclN0YXJ0RW5kUmFkaXVzOiAwLFxuICAgICAgICAgICAgYm9yZGVyRW5kRW5kUmFkaXVzOiAwXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAnJjpub3QoOmZpcnN0LWNoaWxkKSc6IHtcbiAgICAgICAgICBtYXJnaW5JbmxpbmVTdGFydDogdG9rZW4uY2FsYyhsaW5lV2lkdGgpLm11bCgtMSkuZXF1YWwoKSxcbiAgICAgICAgICBbYCYsICYgPiAke2NvbXBvbmVudENsc31gXToge1xuICAgICAgICAgICAgYm9yZGVyU3RhcnRTdGFydFJhZGl1czogMCxcbiAgICAgICAgICAgIGJvcmRlckVuZFN0YXJ0UmFkaXVzOiAwXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2NvbXBvbmVudENsc106IHtcbiAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICAgIHpJbmRleDogMSxcbiAgICAgICAgJyY6aG92ZXIsICY6Zm9jdXMsICY6YWN0aXZlJzoge1xuICAgICAgICAgIHpJbmRleDogMlxuICAgICAgICB9LFxuICAgICAgICAnJltkaXNhYmxlZF0nOiB7XG4gICAgICAgICAgekluZGV4OiAwXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1pY29uLW9ubHlgXToge1xuICAgICAgICBmb250U2l6ZVxuICAgICAgfVxuICAgIH0sXG4gICAgLy8gQm9yZGVyIENvbG9yXG4gICAgZ2VuQnV0dG9uQm9yZGVyU3R5bGUoYCR7Y29tcG9uZW50Q2xzfS1wcmltYXJ5YCwgZ3JvdXBCb3JkZXJDb2xvciksIGdlbkJ1dHRvbkJvcmRlclN0eWxlKGAke2NvbXBvbmVudENsc30tZGFuZ2VyYCwgY29sb3JFcnJvckhvdmVyKV1cbiAgfTtcbn07XG5leHBvcnQgZGVmYXVsdCBnZW5Hcm91cFN0eWxlOyIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBSZWFjdCwgeyBmb3J3YXJkUmVmLCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29sb3JQaWNrZXJQcmVmaXhDbHMsIGRlZmF1bHRDb2xvciB9IGZyb20gXCIuL3V0aWxcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgQ29sb3IgfSBmcm9tIFwiLi9jb2xvclwiO1xuaW1wb3J0IENvbG9yQmxvY2sgZnJvbSBcIi4vY29tcG9uZW50cy9Db2xvckJsb2NrXCI7XG5pbXBvcnQgUGlja2VyIGZyb20gXCIuL2NvbXBvbmVudHMvUGlja2VyXCI7XG5pbXBvcnQgdXNlQ29sb3JTdGF0ZSBmcm9tIFwiLi9ob29rcy91c2VDb2xvclN0YXRlXCI7XG5pbXBvcnQgdXNlQ29tcG9uZW50IGZyb20gXCIuL2hvb2tzL3VzZUNvbXBvbmVudFwiO1xudmFyIEhVRV9DT0xPUlMgPSBbe1xuICBjb2xvcjogJ3JnYigyNTUsIDAsIDApJyxcbiAgcGVyY2VudDogMFxufSwge1xuICBjb2xvcjogJ3JnYigyNTUsIDI1NSwgMCknLFxuICBwZXJjZW50OiAxN1xufSwge1xuICBjb2xvcjogJ3JnYigwLCAyNTUsIDApJyxcbiAgcGVyY2VudDogMzNcbn0sIHtcbiAgY29sb3I6ICdyZ2IoMCwgMjU1LCAyNTUpJyxcbiAgcGVyY2VudDogNTBcbn0sIHtcbiAgY29sb3I6ICdyZ2IoMCwgMCwgMjU1KScsXG4gIHBlcmNlbnQ6IDY3XG59LCB7XG4gIGNvbG9yOiAncmdiKDI1NSwgMCwgMjU1KScsXG4gIHBlcmNlbnQ6IDgzXG59LCB7XG4gIGNvbG9yOiAncmdiKDI1NSwgMCwgMCknLFxuICBwZXJjZW50OiAxMDBcbn1dO1xudmFyIENvbG9yUGlja2VyID0gLyojX19QVVJFX18qL2ZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIHZhbHVlID0gcHJvcHMudmFsdWUsXG4gICAgZGVmYXVsdFZhbHVlID0gcHJvcHMuZGVmYXVsdFZhbHVlLFxuICAgIF9wcm9wcyRwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgcHJlZml4Q2xzID0gX3Byb3BzJHByZWZpeENscyA9PT0gdm9pZCAwID8gQ29sb3JQaWNrZXJQcmVmaXhDbHMgOiBfcHJvcHMkcHJlZml4Q2xzLFxuICAgIG9uQ2hhbmdlID0gcHJvcHMub25DaGFuZ2UsXG4gICAgb25DaGFuZ2VDb21wbGV0ZSA9IHByb3BzLm9uQ2hhbmdlQ29tcGxldGUsXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgcGFuZWxSZW5kZXIgPSBwcm9wcy5wYW5lbFJlbmRlcixcbiAgICBfcHJvcHMkZGlzYWJsZWRBbHBoYSA9IHByb3BzLmRpc2FibGVkQWxwaGEsXG4gICAgZGlzYWJsZWRBbHBoYSA9IF9wcm9wcyRkaXNhYmxlZEFscGhhID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRkaXNhYmxlZEFscGhhLFxuICAgIF9wcm9wcyRkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkLFxuICAgIGRpc2FibGVkID0gX3Byb3BzJGRpc2FibGVkID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRkaXNhYmxlZCxcbiAgICBjb21wb25lbnRzID0gcHJvcHMuY29tcG9uZW50cztcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBDb21wb25lbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfdXNlQ29tcG9uZW50ID0gdXNlQ29tcG9uZW50KGNvbXBvbmVudHMpLFxuICAgIF91c2VDb21wb25lbnQyID0gX3NsaWNlZFRvQXJyYXkoX3VzZUNvbXBvbmVudCwgMSksXG4gICAgU2xpZGVyID0gX3VzZUNvbXBvbmVudDJbMF07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDb2xvciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX3VzZUNvbG9yU3RhdGUgPSB1c2VDb2xvclN0YXRlKGRlZmF1bHRWYWx1ZSB8fCBkZWZhdWx0Q29sb3IsIHZhbHVlKSxcbiAgICBfdXNlQ29sb3JTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlQ29sb3JTdGF0ZSwgMiksXG4gICAgY29sb3JWYWx1ZSA9IF91c2VDb2xvclN0YXRlMlswXSxcbiAgICBzZXRDb2xvclZhbHVlID0gX3VzZUNvbG9yU3RhdGUyWzFdO1xuICB2YXIgYWxwaGFDb2xvciA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjb2xvclZhbHVlLnNldEEoMSkudG9SZ2JTdHJpbmcoKTtcbiAgfSwgW2NvbG9yVmFsdWVdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IEV2ZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBoYW5kbGVDaGFuZ2UgPSBmdW5jdGlvbiBoYW5kbGVDaGFuZ2UoZGF0YSwgdHlwZSkge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHNldENvbG9yVmFsdWUoZGF0YSk7XG4gICAgfVxuICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgfHwgb25DaGFuZ2UoZGF0YSwgdHlwZSk7XG4gIH07XG5cbiAgLy8gQ29udmVydFxuICB2YXIgZ2V0SHVlQ29sb3IgPSBmdW5jdGlvbiBnZXRIdWVDb2xvcihodWUpIHtcbiAgICByZXR1cm4gbmV3IENvbG9yKGNvbG9yVmFsdWUuc2V0SHVlKGh1ZSkpO1xuICB9O1xuICB2YXIgZ2V0QWxwaGFDb2xvciA9IGZ1bmN0aW9uIGdldEFscGhhQ29sb3IoYWxwaGEpIHtcbiAgICByZXR1cm4gbmV3IENvbG9yKGNvbG9yVmFsdWUuc2V0QShhbHBoYSAvIDEwMCkpO1xuICB9O1xuXG4gIC8vIFNsaWRlciBjaGFuZ2VcbiAgdmFyIG9uSHVlQ2hhbmdlID0gZnVuY3Rpb24gb25IdWVDaGFuZ2UoaHVlKSB7XG4gICAgaGFuZGxlQ2hhbmdlKGdldEh1ZUNvbG9yKGh1ZSksIHtcbiAgICAgIHR5cGU6ICdodWUnLFxuICAgICAgdmFsdWU6IGh1ZVxuICAgIH0pO1xuICB9O1xuICB2YXIgb25BbHBoYUNoYW5nZSA9IGZ1bmN0aW9uIG9uQWxwaGFDaGFuZ2UoYWxwaGEpIHtcbiAgICBoYW5kbGVDaGFuZ2UoZ2V0QWxwaGFDb2xvcihhbHBoYSksIHtcbiAgICAgIHR5cGU6ICdhbHBoYScsXG4gICAgICB2YWx1ZTogYWxwaGFcbiAgICB9KTtcbiAgfTtcblxuICAvLyBDb21wbGV0ZVxuICB2YXIgb25IdWVDaGFuZ2VDb21wbGV0ZSA9IGZ1bmN0aW9uIG9uSHVlQ2hhbmdlQ29tcGxldGUoaHVlKSB7XG4gICAgaWYgKG9uQ2hhbmdlQ29tcGxldGUpIHtcbiAgICAgIG9uQ2hhbmdlQ29tcGxldGUoZ2V0SHVlQ29sb3IoaHVlKSk7XG4gICAgfVxuICB9O1xuICB2YXIgb25BbHBoYUNoYW5nZUNvbXBsZXRlID0gZnVuY3Rpb24gb25BbHBoYUNoYW5nZUNvbXBsZXRlKGFscGhhKSB7XG4gICAgaWYgKG9uQ2hhbmdlQ29tcGxldGUpIHtcbiAgICAgIG9uQ2hhbmdlQ29tcGxldGUoZ2V0QWxwaGFDb2xvcihhbHBoYSkpO1xuICAgIH1cbiAgfTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBtZXJnZUNscyA9IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1wYW5lbFwiKSwgY2xhc3NOYW1lLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcGFuZWwtZGlzYWJsZWRcIiksIGRpc2FibGVkKSk7XG4gIHZhciBzaGFyZWRTbGlkZXJQcm9wcyA9IHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgY29sb3I6IGNvbG9yVmFsdWVcbiAgfTtcbiAgdmFyIGRlZmF1bHRQYW5lbCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQaWNrZXIsIF9leHRlbmRzKHtcbiAgICBvbkNoYW5nZTogaGFuZGxlQ2hhbmdlXG4gIH0sIHNoYXJlZFNsaWRlclByb3BzLCB7XG4gICAgb25DaGFuZ2VDb21wbGV0ZTogb25DaGFuZ2VDb21wbGV0ZVxuICB9KSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2xpZGVyLWNvbnRhaW5lclwiKVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2xpZGVyLWdyb3VwXCIpLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2xpZGVyLWdyb3VwLWRpc2FibGVkLWFscGhhXCIpLCBkaXNhYmxlZEFscGhhKSlcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU2xpZGVyLCBfZXh0ZW5kcyh7fSwgc2hhcmVkU2xpZGVyUHJvcHMsIHtcbiAgICB0eXBlOiBcImh1ZVwiLFxuICAgIGNvbG9yczogSFVFX0NPTE9SUyxcbiAgICBtaW46IDAsXG4gICAgbWF4OiAzNTksXG4gICAgdmFsdWU6IGNvbG9yVmFsdWUuZ2V0SHVlKCksXG4gICAgb25DaGFuZ2U6IG9uSHVlQ2hhbmdlLFxuICAgIG9uQ2hhbmdlQ29tcGxldGU6IG9uSHVlQ2hhbmdlQ29tcGxldGVcbiAgfSkpLCAhZGlzYWJsZWRBbHBoYSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTbGlkZXIsIF9leHRlbmRzKHt9LCBzaGFyZWRTbGlkZXJQcm9wcywge1xuICAgIHR5cGU6IFwiYWxwaGFcIixcbiAgICBjb2xvcnM6IFt7XG4gICAgICBwZXJjZW50OiAwLFxuICAgICAgY29sb3I6ICdyZ2JhKDI1NSwgMCwgNCwgMCknXG4gICAgfSwge1xuICAgICAgcGVyY2VudDogMTAwLFxuICAgICAgY29sb3I6IGFscGhhQ29sb3JcbiAgICB9XSxcbiAgICBtaW46IDAsXG4gICAgbWF4OiAxMDAsXG4gICAgdmFsdWU6IGNvbG9yVmFsdWUuYSAqIDEwMCxcbiAgICBvbkNoYW5nZTogb25BbHBoYUNoYW5nZSxcbiAgICBvbkNoYW5nZUNvbXBsZXRlOiBvbkFscGhhQ2hhbmdlQ29tcGxldGVcbiAgfSkpKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29sb3JCbG9jaywge1xuICAgIGNvbG9yOiBjb2xvclZhbHVlLnRvUmdiU3RyaW5nKCksXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHNcbiAgfSkpKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IG1lcmdlQ2xzLFxuICAgIHN0eWxlOiBzdHlsZSxcbiAgICByZWY6IHJlZlxuICB9LCB0eXBlb2YgcGFuZWxSZW5kZXIgPT09ICdmdW5jdGlvbicgPyBwYW5lbFJlbmRlcihkZWZhdWx0UGFuZWwpIDogZGVmYXVsdFBhbmVsKTtcbn0pO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgQ29sb3JQaWNrZXIuZGlzcGxheU5hbWUgPSAnQ29sb3JQaWNrZXInO1xufVxuZXhwb3J0IGRlZmF1bHQgQ29sb3JQaWNrZXI7IiwgImltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNcIjtcbmltcG9ydCBfY3JlYXRlU3VwZXIgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZVN1cGVyXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJiXCJdLFxuICBfZXhjbHVkZWQyID0gW1widlwiXTtcbmltcG9ydCB7IEZhc3RDb2xvciB9IGZyb20gJ0BhbnQtZGVzaWduL2Zhc3QtY29sb3InO1xuZXhwb3J0IHZhciBnZXRSb3VuZE51bWJlciA9IGZ1bmN0aW9uIGdldFJvdW5kTnVtYmVyKHZhbHVlKSB7XG4gIHJldHVybiBNYXRoLnJvdW5kKE51bWJlcih2YWx1ZSB8fCAwKSk7XG59O1xudmFyIGNvbnZlcnRIc2IySHN2ID0gZnVuY3Rpb24gY29udmVydEhzYjJIc3YoY29sb3IpIHtcbiAgaWYgKGNvbG9yIGluc3RhbmNlb2YgRmFzdENvbG9yKSB7XG4gICAgcmV0dXJuIGNvbG9yO1xuICB9XG4gIGlmIChjb2xvciAmJiBfdHlwZW9mKGNvbG9yKSA9PT0gJ29iamVjdCcgJiYgJ2gnIGluIGNvbG9yICYmICdiJyBpbiBjb2xvcikge1xuICAgIHZhciBfcmVmID0gY29sb3IsXG4gICAgICBiID0gX3JlZi5iLFxuICAgICAgcmVzZXRzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYsIF9leGNsdWRlZCk7XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcmVzZXRzKSwge30sIHtcbiAgICAgIHY6IGJcbiAgICB9KTtcbiAgfVxuICBpZiAodHlwZW9mIGNvbG9yID09PSAnc3RyaW5nJyAmJiAvaHNiLy50ZXN0KGNvbG9yKSkge1xuICAgIHJldHVybiBjb2xvci5yZXBsYWNlKC9oc2IvLCAnaHN2Jyk7XG4gIH1cbiAgcmV0dXJuIGNvbG9yO1xufTtcbmV4cG9ydCB2YXIgQ29sb3IgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9GYXN0Q29sb3IpIHtcbiAgX2luaGVyaXRzKENvbG9yLCBfRmFzdENvbG9yKTtcbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihDb2xvcik7XG4gIGZ1bmN0aW9uIENvbG9yKGNvbG9yKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENvbG9yKTtcbiAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgY29udmVydEhzYjJIc3YoY29sb3IpKTtcbiAgfVxuICBfY3JlYXRlQ2xhc3MoQ29sb3IsIFt7XG4gICAga2V5OiBcInRvSHNiU3RyaW5nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvSHNiU3RyaW5nKCkge1xuICAgICAgdmFyIGhzYiA9IHRoaXMudG9Ic2IoKTtcbiAgICAgIHZhciBzYXR1cmF0aW9uID0gZ2V0Um91bmROdW1iZXIoaHNiLnMgKiAxMDApO1xuICAgICAgdmFyIGxpZ2h0bmVzcyA9IGdldFJvdW5kTnVtYmVyKGhzYi5iICogMTAwKTtcbiAgICAgIHZhciBodWUgPSBnZXRSb3VuZE51bWJlcihoc2IuaCk7XG4gICAgICB2YXIgYWxwaGEgPSBoc2IuYTtcbiAgICAgIHZhciBoc2JTdHJpbmcgPSBcImhzYihcIi5jb25jYXQoaHVlLCBcIiwgXCIpLmNvbmNhdChzYXR1cmF0aW9uLCBcIiUsIFwiKS5jb25jYXQobGlnaHRuZXNzLCBcIiUpXCIpO1xuICAgICAgdmFyIGhzYmFTdHJpbmcgPSBcImhzYmEoXCIuY29uY2F0KGh1ZSwgXCIsIFwiKS5jb25jYXQoc2F0dXJhdGlvbiwgXCIlLCBcIikuY29uY2F0KGxpZ2h0bmVzcywgXCIlLCBcIikuY29uY2F0KGFscGhhLnRvRml4ZWQoYWxwaGEgPT09IDAgPyAwIDogMiksIFwiKVwiKTtcbiAgICAgIHJldHVybiBhbHBoYSA9PT0gMSA/IGhzYlN0cmluZyA6IGhzYmFTdHJpbmc7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRvSHNiXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvSHNiKCkge1xuICAgICAgdmFyIF90aGlzJHRvSHN2ID0gdGhpcy50b0hzdigpLFxuICAgICAgICB2ID0gX3RoaXMkdG9Ic3YudixcbiAgICAgICAgcmVzZXRzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF90aGlzJHRvSHN2LCBfZXhjbHVkZWQyKTtcbiAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHJlc2V0cyksIHt9LCB7XG4gICAgICAgIGI6IHYsXG4gICAgICAgIGE6IHRoaXMuYVxuICAgICAgfSk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBDb2xvcjtcbn0oRmFzdENvbG9yKTsiLCAiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCB7IENvbG9yIH0gZnJvbSBcIi4vY29sb3JcIjtcbmV4cG9ydCB2YXIgQ29sb3JQaWNrZXJQcmVmaXhDbHMgPSAncmMtY29sb3ItcGlja2VyJztcbmV4cG9ydCB2YXIgZ2VuZXJhdGVDb2xvciA9IGZ1bmN0aW9uIGdlbmVyYXRlQ29sb3IoY29sb3IpIHtcbiAgaWYgKGNvbG9yIGluc3RhbmNlb2YgQ29sb3IpIHtcbiAgICByZXR1cm4gY29sb3I7XG4gIH1cbiAgcmV0dXJuIG5ldyBDb2xvcihjb2xvcik7XG59O1xuZXhwb3J0IHZhciBkZWZhdWx0Q29sb3IgPSBnZW5lcmF0ZUNvbG9yKCcjMTY3N2ZmJyk7XG5leHBvcnQgdmFyIGNhbGN1bGF0ZUNvbG9yID0gZnVuY3Rpb24gY2FsY3VsYXRlQ29sb3IocHJvcHMpIHtcbiAgdmFyIG9mZnNldCA9IHByb3BzLm9mZnNldCxcbiAgICB0YXJnZXRSZWYgPSBwcm9wcy50YXJnZXRSZWYsXG4gICAgY29udGFpbmVyUmVmID0gcHJvcHMuY29udGFpbmVyUmVmLFxuICAgIGNvbG9yID0gcHJvcHMuY29sb3IsXG4gICAgdHlwZSA9IHByb3BzLnR5cGU7XG4gIHZhciBfY29udGFpbmVyUmVmJGN1cnJlbnQgPSBjb250YWluZXJSZWYuY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICB3aWR0aCA9IF9jb250YWluZXJSZWYkY3VycmVudC53aWR0aCxcbiAgICBoZWlnaHQgPSBfY29udGFpbmVyUmVmJGN1cnJlbnQuaGVpZ2h0O1xuICB2YXIgX3RhcmdldFJlZiRjdXJyZW50JGdlID0gdGFyZ2V0UmVmLmN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgdGFyZ2V0V2lkdGggPSBfdGFyZ2V0UmVmJGN1cnJlbnQkZ2Uud2lkdGgsXG4gICAgdGFyZ2V0SGVpZ2h0ID0gX3RhcmdldFJlZiRjdXJyZW50JGdlLmhlaWdodDtcbiAgdmFyIGNlbnRlck9mZnNldFggPSB0YXJnZXRXaWR0aCAvIDI7XG4gIHZhciBjZW50ZXJPZmZzZXRZID0gdGFyZ2V0SGVpZ2h0IC8gMjtcbiAgdmFyIHNhdHVyYXRpb24gPSAob2Zmc2V0LnggKyBjZW50ZXJPZmZzZXRYKSAvIHdpZHRoO1xuICB2YXIgYnJpZ2h0ID0gMSAtIChvZmZzZXQueSArIGNlbnRlck9mZnNldFkpIC8gaGVpZ2h0O1xuICB2YXIgaHNiID0gY29sb3IudG9Ic2IoKTtcbiAgdmFyIGFscGhhT2Zmc2V0ID0gc2F0dXJhdGlvbjtcbiAgdmFyIGh1ZU9mZnNldCA9IChvZmZzZXQueCArIGNlbnRlck9mZnNldFgpIC8gd2lkdGggKiAzNjA7XG4gIGlmICh0eXBlKSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdodWUnOlxuICAgICAgICByZXR1cm4gZ2VuZXJhdGVDb2xvcihfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGhzYiksIHt9LCB7XG4gICAgICAgICAgaDogaHVlT2Zmc2V0IDw9IDAgPyAwIDogaHVlT2Zmc2V0XG4gICAgICAgIH0pKTtcbiAgICAgIGNhc2UgJ2FscGhhJzpcbiAgICAgICAgcmV0dXJuIGdlbmVyYXRlQ29sb3IoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBoc2IpLCB7fSwge1xuICAgICAgICAgIGE6IGFscGhhT2Zmc2V0IDw9IDAgPyAwIDogYWxwaGFPZmZzZXRcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZ2VuZXJhdGVDb2xvcih7XG4gICAgaDogaHNiLmgsXG4gICAgczogc2F0dXJhdGlvbiA8PSAwID8gMCA6IHNhdHVyYXRpb24sXG4gICAgYjogYnJpZ2h0ID49IDEgPyAxIDogYnJpZ2h0LFxuICAgIGE6IGhzYi5hXG4gIH0pO1xufTtcbmV4cG9ydCB2YXIgY2FsY09mZnNldCA9IGZ1bmN0aW9uIGNhbGNPZmZzZXQoY29sb3IsIHR5cGUpIHtcbiAgdmFyIGhzYiA9IGNvbG9yLnRvSHNiKCk7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ2h1ZSc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiBoc2IuaCAvIDM2MCAqIDEwMCxcbiAgICAgICAgeTogNTBcbiAgICAgIH07XG4gICAgY2FzZSAnYWxwaGEnOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogY29sb3IuYSAqIDEwMCxcbiAgICAgICAgeTogNTBcbiAgICAgIH07XG5cbiAgICAvLyBQaWNrZXIgcGFuZWxcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogaHNiLnMgKiAxMDAsXG4gICAgICAgIHk6ICgxIC0gaHNiLmIpICogMTAwXG4gICAgICB9O1xuICB9XG59OyIsICJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG52YXIgQ29sb3JCbG9jayA9IGZ1bmN0aW9uIENvbG9yQmxvY2soX3JlZikge1xuICB2YXIgY29sb3IgPSBfcmVmLmNvbG9yLFxuICAgIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLFxuICAgIHN0eWxlID0gX3JlZi5zdHlsZSxcbiAgICBvbkNsaWNrID0gX3JlZi5vbkNsaWNrO1xuICB2YXIgY29sb3JCbG9ja0NscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29sb3ItYmxvY2tcIik7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNvbG9yQmxvY2tDbHMsIGNsYXNzTmFtZSksXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIG9uQ2xpY2s6IG9uQ2xpY2tcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQoY29sb3JCbG9ja0NscywgXCItaW5uZXJcIiksXG4gICAgc3R5bGU6IHtcbiAgICAgIGJhY2tncm91bmQ6IGNvbG9yXG4gICAgfVxuICB9KSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgQ29sb3JCbG9jazsiLCAiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgUmVhY3QsIHsgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZUNvbG9yRHJhZyBmcm9tIFwiLi4vaG9va3MvdXNlQ29sb3JEcmFnXCI7XG5pbXBvcnQgeyBjYWxjT2Zmc2V0LCBjYWxjdWxhdGVDb2xvciB9IGZyb20gXCIuLi91dGlsXCI7XG5pbXBvcnQgeyB1c2VFdmVudCB9IGZyb20gJ3JjLXV0aWwnO1xuaW1wb3J0IEhhbmRsZXIgZnJvbSBcIi4vSGFuZGxlclwiO1xuaW1wb3J0IFBhbGV0dGUgZnJvbSBcIi4vUGFsZXR0ZVwiO1xuaW1wb3J0IFRyYW5zZm9ybSBmcm9tIFwiLi9UcmFuc2Zvcm1cIjtcbnZhciBQaWNrZXIgPSBmdW5jdGlvbiBQaWNrZXIoX3JlZikge1xuICB2YXIgY29sb3IgPSBfcmVmLmNvbG9yLFxuICAgIG9uQ2hhbmdlID0gX3JlZi5vbkNoYW5nZSxcbiAgICBwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscyxcbiAgICBvbkNoYW5nZUNvbXBsZXRlID0gX3JlZi5vbkNoYW5nZUNvbXBsZXRlLFxuICAgIGRpc2FibGVkID0gX3JlZi5kaXNhYmxlZDtcbiAgdmFyIHBpY2tlclJlZiA9IHVzZVJlZigpO1xuICB2YXIgdHJhbnNmb3JtUmVmID0gdXNlUmVmKCk7XG4gIHZhciBjb2xvclJlZiA9IHVzZVJlZihjb2xvcik7XG4gIHZhciBvbkRyYWdDaGFuZ2UgPSB1c2VFdmVudChmdW5jdGlvbiAob2Zmc2V0VmFsdWUpIHtcbiAgICB2YXIgY2FsY0NvbG9yID0gY2FsY3VsYXRlQ29sb3Ioe1xuICAgICAgb2Zmc2V0OiBvZmZzZXRWYWx1ZSxcbiAgICAgIHRhcmdldFJlZjogdHJhbnNmb3JtUmVmLFxuICAgICAgY29udGFpbmVyUmVmOiBwaWNrZXJSZWYsXG4gICAgICBjb2xvcjogY29sb3JcbiAgICB9KTtcbiAgICBjb2xvclJlZi5jdXJyZW50ID0gY2FsY0NvbG9yO1xuICAgIG9uQ2hhbmdlKGNhbGNDb2xvcik7XG4gIH0pO1xuICB2YXIgX3VzZUNvbG9yRHJhZyA9IHVzZUNvbG9yRHJhZyh7XG4gICAgICBjb2xvcjogY29sb3IsXG4gICAgICBjb250YWluZXJSZWY6IHBpY2tlclJlZixcbiAgICAgIHRhcmdldFJlZjogdHJhbnNmb3JtUmVmLFxuICAgICAgY2FsY3VsYXRlOiBmdW5jdGlvbiBjYWxjdWxhdGUoKSB7XG4gICAgICAgIHJldHVybiBjYWxjT2Zmc2V0KGNvbG9yKTtcbiAgICAgIH0sXG4gICAgICBvbkRyYWdDaGFuZ2U6IG9uRHJhZ0NoYW5nZSxcbiAgICAgIG9uRHJhZ0NoYW5nZUNvbXBsZXRlOiBmdW5jdGlvbiBvbkRyYWdDaGFuZ2VDb21wbGV0ZSgpIHtcbiAgICAgICAgcmV0dXJuIG9uQ2hhbmdlQ29tcGxldGUgPT09IG51bGwgfHwgb25DaGFuZ2VDb21wbGV0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2VDb21wbGV0ZShjb2xvclJlZi5jdXJyZW50KTtcbiAgICAgIH0sXG4gICAgICBkaXNhYmxlZERyYWc6IGRpc2FibGVkXG4gICAgfSksXG4gICAgX3VzZUNvbG9yRHJhZzIgPSBfc2xpY2VkVG9BcnJheShfdXNlQ29sb3JEcmFnLCAyKSxcbiAgICBvZmZzZXQgPSBfdXNlQ29sb3JEcmFnMlswXSxcbiAgICBkcmFnU3RhcnRIYW5kbGUgPSBfdXNlQ29sb3JEcmFnMlsxXTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICByZWY6IHBpY2tlclJlZixcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2VsZWN0XCIpLFxuICAgIG9uTW91c2VEb3duOiBkcmFnU3RhcnRIYW5kbGUsXG4gICAgb25Ub3VjaFN0YXJ0OiBkcmFnU3RhcnRIYW5kbGVcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUGFsZXR0ZSwge1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRyYW5zZm9ybSwge1xuICAgIHg6IG9mZnNldC54LFxuICAgIHk6IG9mZnNldC55LFxuICAgIHJlZjogdHJhbnNmb3JtUmVmXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEhhbmRsZXIsIHtcbiAgICBjb2xvcjogY29sb3IudG9SZ2JTdHJpbmcoKSxcbiAgICBwcmVmaXhDbHM6IHByZWZpeENsc1xuICB9KSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2F0dXJhdGlvblwiKSxcbiAgICBzdHlsZToge1xuICAgICAgYmFja2dyb3VuZENvbG9yOiBcImhzbChcIi5jb25jYXQoY29sb3IudG9Ic2IoKS5oLCBcIiwxMDAlLCA1MCUpXCIpLFxuICAgICAgYmFja2dyb3VuZEltYWdlOiAnbGluZWFyLWdyYWRpZW50KDBkZWcsICMwMDAsIHRyYW5zcGFyZW50KSxsaW5lYXItZ3JhZGllbnQoOTBkZWcsICNmZmYsIGhzbGEoMCwgMCUsIDEwMCUsIDApKSdcbiAgICB9XG4gIH0pKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgUGlja2VyOyIsICJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmZ1bmN0aW9uIGdldFBvc2l0aW9uKGUpIHtcbiAgdmFyIG9iaiA9ICd0b3VjaGVzJyBpbiBlID8gZS50b3VjaGVzWzBdIDogZTtcbiAgdmFyIHNjcm9sbFhPZmZzZXQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQgfHwgd2luZG93LnBhZ2VYT2Zmc2V0O1xuICB2YXIgc2Nyb2xsWU9mZnNldCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgfHwgd2luZG93LnBhZ2VZT2Zmc2V0O1xuICByZXR1cm4ge1xuICAgIHBhZ2VYOiBvYmoucGFnZVggLSBzY3JvbGxYT2Zmc2V0LFxuICAgIHBhZ2VZOiBvYmoucGFnZVkgLSBzY3JvbGxZT2Zmc2V0XG4gIH07XG59XG5mdW5jdGlvbiB1c2VDb2xvckRyYWcocHJvcHMpIHtcbiAgdmFyIHRhcmdldFJlZiA9IHByb3BzLnRhcmdldFJlZixcbiAgICBjb250YWluZXJSZWYgPSBwcm9wcy5jb250YWluZXJSZWYsXG4gICAgZGlyZWN0aW9uID0gcHJvcHMuZGlyZWN0aW9uLFxuICAgIG9uRHJhZ0NoYW5nZSA9IHByb3BzLm9uRHJhZ0NoYW5nZSxcbiAgICBvbkRyYWdDaGFuZ2VDb21wbGV0ZSA9IHByb3BzLm9uRHJhZ0NoYW5nZUNvbXBsZXRlLFxuICAgIGNhbGN1bGF0ZSA9IHByb3BzLmNhbGN1bGF0ZSxcbiAgICBjb2xvciA9IHByb3BzLmNvbG9yLFxuICAgIGRpc2FibGVkRHJhZyA9IHByb3BzLmRpc2FibGVkRHJhZztcbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwXG4gICAgfSksXG4gICAgX3VzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZSwgMiksXG4gICAgb2Zmc2V0VmFsdWUgPSBfdXNlU3RhdGUyWzBdLFxuICAgIHNldE9mZnNldFZhbHVlID0gX3VzZVN0YXRlMlsxXTtcbiAgdmFyIG1vdXNlTW92ZVJlZiA9IHVzZVJlZihudWxsKTtcbiAgdmFyIG1vdXNlVXBSZWYgPSB1c2VSZWYobnVsbCk7XG5cbiAgLy8gQWx3YXlzIGdldCBwb3NpdGlvbiBmcm9tIGBjb2xvcmBcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBzZXRPZmZzZXRWYWx1ZShjYWxjdWxhdGUoKSk7XG4gIH0sIFtjb2xvcl0pO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBtb3VzZU1vdmVSZWYuY3VycmVudCk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgbW91c2VVcFJlZi5jdXJyZW50KTtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIG1vdXNlTW92ZVJlZi5jdXJyZW50KTtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgbW91c2VVcFJlZi5jdXJyZW50KTtcbiAgICAgIG1vdXNlTW92ZVJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgIG1vdXNlVXBSZWYuY3VycmVudCA9IG51bGw7XG4gICAgfTtcbiAgfSwgW10pO1xuICB2YXIgdXBkYXRlT2Zmc2V0ID0gZnVuY3Rpb24gdXBkYXRlT2Zmc2V0KGUpIHtcbiAgICB2YXIgX2dldFBvc2l0aW9uID0gZ2V0UG9zaXRpb24oZSksXG4gICAgICBwYWdlWCA9IF9nZXRQb3NpdGlvbi5wYWdlWCxcbiAgICAgIHBhZ2VZID0gX2dldFBvc2l0aW9uLnBhZ2VZO1xuICAgIHZhciBfY29udGFpbmVyUmVmJGN1cnJlbnQgPSBjb250YWluZXJSZWYuY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgIHJlY3RYID0gX2NvbnRhaW5lclJlZiRjdXJyZW50LngsXG4gICAgICByZWN0WSA9IF9jb250YWluZXJSZWYkY3VycmVudC55LFxuICAgICAgd2lkdGggPSBfY29udGFpbmVyUmVmJGN1cnJlbnQud2lkdGgsXG4gICAgICBoZWlnaHQgPSBfY29udGFpbmVyUmVmJGN1cnJlbnQuaGVpZ2h0O1xuICAgIHZhciBfdGFyZ2V0UmVmJGN1cnJlbnQkZ2UgPSB0YXJnZXRSZWYuY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgIHRhcmdldFdpZHRoID0gX3RhcmdldFJlZiRjdXJyZW50JGdlLndpZHRoLFxuICAgICAgdGFyZ2V0SGVpZ2h0ID0gX3RhcmdldFJlZiRjdXJyZW50JGdlLmhlaWdodDtcbiAgICB2YXIgY2VudGVyT2Zmc2V0WCA9IHRhcmdldFdpZHRoIC8gMjtcbiAgICB2YXIgY2VudGVyT2Zmc2V0WSA9IHRhcmdldEhlaWdodCAvIDI7XG4gICAgdmFyIG9mZnNldFggPSBNYXRoLm1heCgwLCBNYXRoLm1pbihwYWdlWCAtIHJlY3RYLCB3aWR0aCkpIC0gY2VudGVyT2Zmc2V0WDtcbiAgICB2YXIgb2Zmc2V0WSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHBhZ2VZIC0gcmVjdFksIGhlaWdodCkpIC0gY2VudGVyT2Zmc2V0WTtcbiAgICB2YXIgY2FsY09mZnNldCA9IHtcbiAgICAgIHg6IG9mZnNldFgsXG4gICAgICB5OiBkaXJlY3Rpb24gPT09ICd4JyA/IG9mZnNldFZhbHVlLnkgOiBvZmZzZXRZXG4gICAgfTtcblxuICAgIC8vIEV4Y2x1c2lvbiBvZiBib3VuZGFyeSBjYXNlc1xuICAgIGlmICh0YXJnZXRXaWR0aCA9PT0gMCAmJiB0YXJnZXRIZWlnaHQgPT09IDAgfHwgdGFyZ2V0V2lkdGggIT09IHRhcmdldEhlaWdodCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBvbkRyYWdDaGFuZ2UgPT09IG51bGwgfHwgb25EcmFnQ2hhbmdlID09PSB2b2lkIDAgfHwgb25EcmFnQ2hhbmdlKGNhbGNPZmZzZXQpO1xuICB9O1xuICB2YXIgb25EcmFnTW92ZSA9IGZ1bmN0aW9uIG9uRHJhZ01vdmUoZSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB1cGRhdGVPZmZzZXQoZSk7XG4gIH07XG4gIHZhciBvbkRyYWdTdG9wID0gZnVuY3Rpb24gb25EcmFnU3RvcChlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG1vdXNlTW92ZVJlZi5jdXJyZW50KTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgbW91c2VVcFJlZi5jdXJyZW50KTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBtb3VzZU1vdmVSZWYuY3VycmVudCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBtb3VzZVVwUmVmLmN1cnJlbnQpO1xuICAgIG1vdXNlTW92ZVJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICBtb3VzZVVwUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgIG9uRHJhZ0NoYW5nZUNvbXBsZXRlID09PSBudWxsIHx8IG9uRHJhZ0NoYW5nZUNvbXBsZXRlID09PSB2b2lkIDAgfHwgb25EcmFnQ2hhbmdlQ29tcGxldGUoKTtcbiAgfTtcbiAgdmFyIG9uRHJhZ1N0YXJ0ID0gZnVuY3Rpb24gb25EcmFnU3RhcnQoZSkge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzQzNTI5XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgbW91c2VNb3ZlUmVmLmN1cnJlbnQpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBtb3VzZVVwUmVmLmN1cnJlbnQpO1xuICAgIGlmIChkaXNhYmxlZERyYWcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdXBkYXRlT2Zmc2V0KGUpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uRHJhZ01vdmUpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbkRyYWdTdG9wKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBvbkRyYWdNb3ZlKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIG9uRHJhZ1N0b3ApO1xuICAgIG1vdXNlTW92ZVJlZi5jdXJyZW50ID0gb25EcmFnTW92ZTtcbiAgICBtb3VzZVVwUmVmLmN1cnJlbnQgPSBvbkRyYWdTdG9wO1xuICB9O1xuICByZXR1cm4gW29mZnNldFZhbHVlLCBvbkRyYWdTdGFydF07XG59XG5leHBvcnQgZGVmYXVsdCB1c2VDb2xvckRyYWc7IiwgImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG52YXIgSGFuZGxlciA9IGZ1bmN0aW9uIEhhbmRsZXIoX3JlZikge1xuICB2YXIgX3JlZiRzaXplID0gX3JlZi5zaXplLFxuICAgIHNpemUgPSBfcmVmJHNpemUgPT09IHZvaWQgMCA/ICdkZWZhdWx0JyA6IF9yZWYkc2l6ZSxcbiAgICBjb2xvciA9IF9yZWYuY29sb3IsXG4gICAgcHJlZml4Q2xzID0gX3JlZi5wcmVmaXhDbHM7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaGFuZGxlclwiKSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhhbmRsZXItc21cIiksIHNpemUgPT09ICdzbWFsbCcpKSxcbiAgICBzdHlsZToge1xuICAgICAgYmFja2dyb3VuZENvbG9yOiBjb2xvclxuICAgIH1cbiAgfSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgSGFuZGxlcjsiLCAiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG52YXIgUGFsZXR0ZSA9IGZ1bmN0aW9uIFBhbGV0dGUoX3JlZikge1xuICB2YXIgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuLFxuICAgIHN0eWxlID0gX3JlZi5zdHlsZSxcbiAgICBwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscztcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcGFsZXR0ZVwiKSxcbiAgICBzdHlsZTogX29iamVjdFNwcmVhZCh7XG4gICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJ1xuICAgIH0sIHN0eWxlKVxuICB9LCBjaGlsZHJlbik7XG59O1xuZXhwb3J0IGRlZmF1bHQgUGFsZXR0ZTsiLCAiaW1wb3J0IFJlYWN0LCB7IGZvcndhcmRSZWYgfSBmcm9tICdyZWFjdCc7XG52YXIgVHJhbnNmb3JtID0gLyojX19QVVJFX18qL2ZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgeCA9IHByb3BzLngsXG4gICAgeSA9IHByb3BzLnk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgcmVmOiByZWYsXG4gICAgc3R5bGU6IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgbGVmdDogXCJcIi5jb25jYXQoeCwgXCIlXCIpLFxuICAgICAgdG9wOiBcIlwiLmNvbmNhdCh5LCBcIiVcIiksXG4gICAgICB6SW5kZXg6IDEsXG4gICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUoLTUwJSwgLTUwJSknXG4gICAgfVxuICB9LCBjaGlsZHJlbik7XG59KTtcbmV4cG9ydCBkZWZhdWx0IFRyYW5zZm9ybTsiLCAiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgeyB1c2VNZXJnZWRTdGF0ZSB9IGZyb20gJ3JjLXV0aWwnO1xuaW1wb3J0IHsgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGdlbmVyYXRlQ29sb3IgfSBmcm9tIFwiLi4vdXRpbFwiO1xudmFyIHVzZUNvbG9yU3RhdGUgPSBmdW5jdGlvbiB1c2VDb2xvclN0YXRlKGRlZmF1bHRWYWx1ZSwgdmFsdWUpIHtcbiAgdmFyIF91c2VNZXJnZWRTdGF0ZSA9IHVzZU1lcmdlZFN0YXRlKGRlZmF1bHRWYWx1ZSwge1xuICAgICAgdmFsdWU6IHZhbHVlXG4gICAgfSksXG4gICAgX3VzZU1lcmdlZFN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VNZXJnZWRTdGF0ZSwgMiksXG4gICAgbWVyZ2VkVmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGUyWzBdLFxuICAgIHNldFZhbHVlID0gX3VzZU1lcmdlZFN0YXRlMlsxXTtcbiAgdmFyIGNvbG9yID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGdlbmVyYXRlQ29sb3IobWVyZ2VkVmFsdWUpO1xuICB9LCBbbWVyZ2VkVmFsdWVdKTtcbiAgcmV0dXJuIFtjb2xvciwgc2V0VmFsdWVdO1xufTtcbmV4cG9ydCBkZWZhdWx0IHVzZUNvbG9yU3RhdGU7IiwgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBTbGlkZXIgZnJvbSBcIi4uL2NvbXBvbmVudHMvU2xpZGVyXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VDb21wb25lbnQoY29tcG9uZW50cykge1xuICByZXR1cm4gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9yZWYgPSBjb21wb25lbnRzIHx8IHt9LFxuICAgICAgc2xpZGVyID0gX3JlZi5zbGlkZXI7XG4gICAgcmV0dXJuIFtzbGlkZXIgfHwgU2xpZGVyXTtcbiAgfSwgW2NvbXBvbmVudHNdKTtcbn0iLCAiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgUmVhY3QsIHsgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZUNvbG9yRHJhZyBmcm9tIFwiLi4vaG9va3MvdXNlQ29sb3JEcmFnXCI7XG5pbXBvcnQgUGFsZXR0ZSBmcm9tIFwiLi9QYWxldHRlXCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IHVzZUV2ZW50IH0gZnJvbSAncmMtdXRpbCc7XG5pbXBvcnQgeyBDb2xvciB9IGZyb20gXCIuLi9jb2xvclwiO1xuaW1wb3J0IHsgY2FsY09mZnNldCwgY2FsY3VsYXRlQ29sb3IgfSBmcm9tIFwiLi4vdXRpbFwiO1xuaW1wb3J0IEdyYWRpZW50IGZyb20gXCIuL0dyYWRpZW50XCI7XG5pbXBvcnQgSGFuZGxlciBmcm9tIFwiLi9IYW5kbGVyXCI7XG5pbXBvcnQgVHJhbnNmb3JtIGZyb20gXCIuL1RyYW5zZm9ybVwiO1xudmFyIFNsaWRlciA9IGZ1bmN0aW9uIFNsaWRlcihwcm9wcykge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIGNvbG9ycyA9IHByb3BzLmNvbG9ycyxcbiAgICBkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkLFxuICAgIG9uQ2hhbmdlID0gcHJvcHMub25DaGFuZ2UsXG4gICAgb25DaGFuZ2VDb21wbGV0ZSA9IHByb3BzLm9uQ2hhbmdlQ29tcGxldGUsXG4gICAgY29sb3IgPSBwcm9wcy5jb2xvcixcbiAgICB0eXBlID0gcHJvcHMudHlwZTtcbiAgdmFyIHNsaWRlclJlZiA9IHVzZVJlZigpO1xuICB2YXIgdHJhbnNmb3JtUmVmID0gdXNlUmVmKCk7XG4gIHZhciBjb2xvclJlZiA9IHVzZVJlZihjb2xvcik7XG4gIHZhciBnZXRWYWx1ZSA9IGZ1bmN0aW9uIGdldFZhbHVlKGMpIHtcbiAgICByZXR1cm4gdHlwZSA9PT0gJ2h1ZScgPyBjLmdldEh1ZSgpIDogYy5hICogMTAwO1xuICB9O1xuICB2YXIgb25EcmFnQ2hhbmdlID0gdXNlRXZlbnQoZnVuY3Rpb24gKG9mZnNldFZhbHVlKSB7XG4gICAgdmFyIGNhbGNDb2xvciA9IGNhbGN1bGF0ZUNvbG9yKHtcbiAgICAgIG9mZnNldDogb2Zmc2V0VmFsdWUsXG4gICAgICB0YXJnZXRSZWY6IHRyYW5zZm9ybVJlZixcbiAgICAgIGNvbnRhaW5lclJlZjogc2xpZGVyUmVmLFxuICAgICAgY29sb3I6IGNvbG9yLFxuICAgICAgdHlwZTogdHlwZVxuICAgIH0pO1xuICAgIGNvbG9yUmVmLmN1cnJlbnQgPSBjYWxjQ29sb3I7XG4gICAgb25DaGFuZ2UoZ2V0VmFsdWUoY2FsY0NvbG9yKSk7XG4gIH0pO1xuICB2YXIgX3VzZUNvbG9yRHJhZyA9IHVzZUNvbG9yRHJhZyh7XG4gICAgICBjb2xvcjogY29sb3IsXG4gICAgICB0YXJnZXRSZWY6IHRyYW5zZm9ybVJlZixcbiAgICAgIGNvbnRhaW5lclJlZjogc2xpZGVyUmVmLFxuICAgICAgY2FsY3VsYXRlOiBmdW5jdGlvbiBjYWxjdWxhdGUoKSB7XG4gICAgICAgIHJldHVybiBjYWxjT2Zmc2V0KGNvbG9yLCB0eXBlKTtcbiAgICAgIH0sXG4gICAgICBvbkRyYWdDaGFuZ2U6IG9uRHJhZ0NoYW5nZSxcbiAgICAgIG9uRHJhZ0NoYW5nZUNvbXBsZXRlOiBmdW5jdGlvbiBvbkRyYWdDaGFuZ2VDb21wbGV0ZSgpIHtcbiAgICAgICAgb25DaGFuZ2VDb21wbGV0ZShnZXRWYWx1ZShjb2xvclJlZi5jdXJyZW50KSk7XG4gICAgICB9LFxuICAgICAgZGlyZWN0aW9uOiAneCcsXG4gICAgICBkaXNhYmxlZERyYWc6IGRpc2FibGVkXG4gICAgfSksXG4gICAgX3VzZUNvbG9yRHJhZzIgPSBfc2xpY2VkVG9BcnJheShfdXNlQ29sb3JEcmFnLCAyKSxcbiAgICBvZmZzZXQgPSBfdXNlQ29sb3JEcmFnMlswXSxcbiAgICBkcmFnU3RhcnRIYW5kbGUgPSBfdXNlQ29sb3JEcmFnMlsxXTtcbiAgdmFyIGhhbmRsZUNvbG9yID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHR5cGUgPT09ICdodWUnKSB7XG4gICAgICB2YXIgaHNiID0gY29sb3IudG9Ic2IoKTtcbiAgICAgIGhzYi5zID0gMTtcbiAgICAgIGhzYi5iID0gMTtcbiAgICAgIGhzYi5hID0gMTtcbiAgICAgIHZhciBsaWdodENvbG9yID0gbmV3IENvbG9yKGhzYik7XG4gICAgICByZXR1cm4gbGlnaHRDb2xvcjtcbiAgICB9XG4gICAgcmV0dXJuIGNvbG9yO1xuICB9LCBbY29sb3IsIHR5cGVdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IEdyYWRpZW50ID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGdyYWRpZW50TGlzdCA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjb2xvcnMubWFwKGZ1bmN0aW9uIChpbmZvKSB7XG4gICAgICByZXR1cm4gXCJcIi5jb25jYXQoaW5mby5jb2xvciwgXCIgXCIpLmNvbmNhdChpbmZvLnBlcmNlbnQsIFwiJVwiKTtcbiAgICB9KTtcbiAgfSwgW2NvbG9yc10pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHJlZjogc2xpZGVyUmVmLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNsaWRlclwiKSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zbGlkZXItXCIpLmNvbmNhdCh0eXBlKSksXG4gICAgb25Nb3VzZURvd246IGRyYWdTdGFydEhhbmRsZSxcbiAgICBvblRvdWNoU3RhcnQ6IGRyYWdTdGFydEhhbmRsZVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQYWxldHRlLCB7XG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHNcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVHJhbnNmb3JtLCB7XG4gICAgeDogb2Zmc2V0LngsXG4gICAgeTogb2Zmc2V0LnksXG4gICAgcmVmOiB0cmFuc2Zvcm1SZWZcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSGFuZGxlciwge1xuICAgIHNpemU6IFwic21hbGxcIixcbiAgICBjb2xvcjogaGFuZGxlQ29sb3IudG9IZXhTdHJpbmcoKSxcbiAgICBwcmVmaXhDbHM6IHByZWZpeENsc1xuICB9KSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEdyYWRpZW50LCB7XG4gICAgY29sb3JzOiBncmFkaWVudExpc3QsXG4gICAgdHlwZTogdHlwZSxcbiAgICBwcmVmaXhDbHM6IHByZWZpeENsc1xuICB9KSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFNsaWRlcjsiLCAiaW1wb3J0IFJlYWN0LCB7IHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb2xvciB9IGZyb20gXCIuLi9jb2xvclwiO1xuaW1wb3J0IHsgZ2VuZXJhdGVDb2xvciB9IGZyb20gXCIuLi91dGlsXCI7XG52YXIgR3JhZGllbnQgPSBmdW5jdGlvbiBHcmFkaWVudChfcmVmKSB7XG4gIHZhciBjb2xvcnMgPSBfcmVmLmNvbG9ycyxcbiAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgX3JlZiRkaXJlY3Rpb24gPSBfcmVmLmRpcmVjdGlvbixcbiAgICBkaXJlY3Rpb24gPSBfcmVmJGRpcmVjdGlvbiA9PT0gdm9pZCAwID8gJ3RvIHJpZ2h0JyA6IF9yZWYkZGlyZWN0aW9uLFxuICAgIHR5cGUgPSBfcmVmLnR5cGUsXG4gICAgcHJlZml4Q2xzID0gX3JlZi5wcmVmaXhDbHM7XG4gIHZhciBncmFkaWVudENvbG9ycyA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjb2xvcnMubWFwKGZ1bmN0aW9uIChjb2xvciwgaWR4KSB7XG4gICAgICB2YXIgcmVzdWx0ID0gZ2VuZXJhdGVDb2xvcihjb2xvcik7XG4gICAgICBpZiAodHlwZSA9PT0gJ2FscGhhJyAmJiBpZHggPT09IGNvbG9ycy5sZW5ndGggLSAxKSB7XG4gICAgICAgIHJlc3VsdCA9IG5ldyBDb2xvcihyZXN1bHQuc2V0QSgxKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0LnRvUmdiU3RyaW5nKCk7XG4gICAgfSkuam9pbignLCcpO1xuICB9LCBbY29sb3JzLCB0eXBlXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWdyYWRpZW50XCIpLFxuICAgIHN0eWxlOiB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIGluc2V0OiAwLFxuICAgICAgYmFja2dyb3VuZDogXCJsaW5lYXItZ3JhZGllbnQoXCIuY29uY2F0KGRpcmVjdGlvbiwgXCIsIFwiKS5jb25jYXQoZ3JhZGllbnRDb2xvcnMsIFwiKVwiKVxuICAgIH1cbiAgfSwgY2hpbGRyZW4pO1xufTtcbmV4cG9ydCBkZWZhdWx0IEdyYWRpZW50OyIsICJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCB7IENvbG9yIGFzIFJjQ29sb3IgfSBmcm9tICdAcmMtY29tcG9uZW50L2NvbG9yLXBpY2tlcic7XG5leHBvcnQgY29uc3QgdG9IZXhGb3JtYXQgPSAodmFsdWUsIGFscGhhKSA9PiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHZhbHVlLnJlcGxhY2UoL1teXFx3L10vZywgJycpLnNsaWNlKDAsIGFscGhhID8gOCA6IDYpKSB8fCAnJztcbmV4cG9ydCBjb25zdCBnZXRIZXggPSAodmFsdWUsIGFscGhhKSA9PiB2YWx1ZSA/IHRvSGV4Rm9ybWF0KHZhbHVlLCBhbHBoYSkgOiAnJztcbmV4cG9ydCBsZXQgQWdncmVnYXRpb25Db2xvciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEFnZ3JlZ2F0aW9uQ29sb3IoY29sb3IpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQWdncmVnYXRpb25Db2xvcik7XG4gICAgdmFyIF9hO1xuICAgIHRoaXMuY2xlYXJlZCA9IGZhbHNlO1xuICAgIC8vIENsb25lIGZyb20gYW5vdGhlciBBZ2dyZWdhdGlvbkNvbG9yXG4gICAgaWYgKGNvbG9yIGluc3RhbmNlb2YgQWdncmVnYXRpb25Db2xvcikge1xuICAgICAgdGhpcy5tZXRhQ29sb3IgPSBjb2xvci5tZXRhQ29sb3IuY2xvbmUoKTtcbiAgICAgIHRoaXMuY29sb3JzID0gKF9hID0gY29sb3IuY29sb3JzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubWFwKGluZm8gPT4gKHtcbiAgICAgICAgY29sb3I6IG5ldyBBZ2dyZWdhdGlvbkNvbG9yKGluZm8uY29sb3IpLFxuICAgICAgICBwZXJjZW50OiBpbmZvLnBlcmNlbnRcbiAgICAgIH0pKTtcbiAgICAgIHRoaXMuY2xlYXJlZCA9IGNvbG9yLmNsZWFyZWQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KGNvbG9yKTtcbiAgICBpZiAoaXNBcnJheSAmJiBjb2xvci5sZW5ndGgpIHtcbiAgICAgIHRoaXMuY29sb3JzID0gY29sb3IubWFwKF9yZWYgPT4ge1xuICAgICAgICBsZXQge1xuICAgICAgICAgIGNvbG9yOiBjLFxuICAgICAgICAgIHBlcmNlbnRcbiAgICAgICAgfSA9IF9yZWY7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29sb3I6IG5ldyBBZ2dyZWdhdGlvbkNvbG9yKGMpLFxuICAgICAgICAgIHBlcmNlbnRcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5tZXRhQ29sb3IgPSBuZXcgUmNDb2xvcih0aGlzLmNvbG9yc1swXS5jb2xvci5tZXRhQ29sb3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1ldGFDb2xvciA9IG5ldyBSY0NvbG9yKGlzQXJyYXkgPyAnJyA6IGNvbG9yKTtcbiAgICB9XG4gICAgaWYgKCFjb2xvciB8fCBpc0FycmF5ICYmICF0aGlzLmNvbG9ycykge1xuICAgICAgdGhpcy5tZXRhQ29sb3IgPSB0aGlzLm1ldGFDb2xvci5zZXRBKDApO1xuICAgICAgdGhpcy5jbGVhcmVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIF9jcmVhdGVDbGFzcyhBZ2dyZWdhdGlvbkNvbG9yLCBbe1xuICAgIGtleTogXCJ0b0hzYlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b0hzYigpIHtcbiAgICAgIHJldHVybiB0aGlzLm1ldGFDb2xvci50b0hzYigpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0b0hzYlN0cmluZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b0hzYlN0cmluZygpIHtcbiAgICAgIHJldHVybiB0aGlzLm1ldGFDb2xvci50b0hzYlN0cmluZygpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0b0hleFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b0hleCgpIHtcbiAgICAgIHJldHVybiBnZXRIZXgodGhpcy50b0hleFN0cmluZygpLCB0aGlzLm1ldGFDb2xvci5hIDwgMSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRvSGV4U3RyaW5nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvSGV4U3RyaW5nKCkge1xuICAgICAgcmV0dXJuIHRoaXMubWV0YUNvbG9yLnRvSGV4U3RyaW5nKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRvUmdiXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvUmdiKCkge1xuICAgICAgcmV0dXJuIHRoaXMubWV0YUNvbG9yLnRvUmdiKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRvUmdiU3RyaW5nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvUmdiU3RyaW5nKCkge1xuICAgICAgcmV0dXJuIHRoaXMubWV0YUNvbG9yLnRvUmdiU3RyaW5nKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzR3JhZGllbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNHcmFkaWVudCgpIHtcbiAgICAgIHJldHVybiAhIXRoaXMuY29sb3JzICYmICF0aGlzLmNsZWFyZWQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldENvbG9yc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDb2xvcnMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb2xvcnMgfHwgW3tcbiAgICAgICAgY29sb3I6IHRoaXMsXG4gICAgICAgIHBlcmNlbnQ6IDBcbiAgICAgIH1dO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0b0Nzc1N0cmluZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b0Nzc1N0cmluZygpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgY29sb3JzXG4gICAgICB9ID0gdGhpcztcbiAgICAgIC8vIENTUyBsaW5lLWdyYWRpZW50XG4gICAgICBpZiAoY29sb3JzKSB7XG4gICAgICAgIGNvbnN0IGNvbG9yc1N0ciA9IGNvbG9ycy5tYXAoYyA9PiBgJHtjLmNvbG9yLnRvUmdiU3RyaW5nKCl9ICR7Yy5wZXJjZW50fSVgKS5qb2luKCcsICcpO1xuICAgICAgICByZXR1cm4gYGxpbmVhci1ncmFkaWVudCg5MGRlZywgJHtjb2xvcnNTdHJ9KWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5tZXRhQ29sb3IudG9SZ2JTdHJpbmcoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZXF1YWxzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVxdWFscyhjb2xvcikge1xuICAgICAgaWYgKCFjb2xvciB8fCB0aGlzLmlzR3JhZGllbnQoKSAhPT0gY29sb3IuaXNHcmFkaWVudCgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5pc0dyYWRpZW50KCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9IZXhTdHJpbmcoKSA9PT0gY29sb3IudG9IZXhTdHJpbmcoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmNvbG9ycy5sZW5ndGggPT09IGNvbG9yLmNvbG9ycy5sZW5ndGggJiYgdGhpcy5jb2xvcnMuZXZlcnkoKGMsIGkpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gY29sb3IuY29sb3JzW2ldO1xuICAgICAgICByZXR1cm4gYy5wZXJjZW50ID09PSB0YXJnZXQucGVyY2VudCAmJiBjLmNvbG9yLmVxdWFscyh0YXJnZXQuY29sb3IpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XSk7XG59KCk7IiwgIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgUmVhY3QsIHsgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbG9yQmxvY2ssIENvbG9yIGFzIFJjQ29sb3IgfSBmcm9tICdAcmMtY29tcG9uZW50L2NvbG9yLXBpY2tlcic7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB1c2VNZXJnZWRTdGF0ZSBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VNZXJnZWRTdGF0ZVwiO1xuaW1wb3J0IENvbGxhcHNlIGZyb20gJy4uLy4uL2NvbGxhcHNlJztcbmltcG9ydCB7IHVzZUxvY2FsZSB9IGZyb20gJy4uLy4uL2xvY2FsZSc7XG5pbXBvcnQgeyB1c2VUb2tlbiB9IGZyb20gJy4uLy4uL3RoZW1lL2ludGVybmFsJztcbmltcG9ydCB7IGdlbmVyYXRlQ29sb3IgfSBmcm9tICcuLi91dGlsJztcbmNvbnN0IGdlblByZXNldENvbG9yID0gbGlzdCA9PiBsaXN0Lm1hcCh2YWx1ZSA9PiB7XG4gIHZhbHVlLmNvbG9ycyA9IHZhbHVlLmNvbG9ycy5tYXAoZ2VuZXJhdGVDb2xvcik7XG4gIHJldHVybiB2YWx1ZTtcbn0pO1xuZXhwb3J0IGNvbnN0IGlzQnJpZ2h0ID0gKHZhbHVlLCBiZ0NvbG9yVG9rZW4pID0+IHtcbiAgY29uc3Qge1xuICAgIHIsXG4gICAgZyxcbiAgICBiLFxuICAgIGFcbiAgfSA9IHZhbHVlLnRvUmdiKCk7XG4gIGNvbnN0IGhzdiA9IG5ldyBSY0NvbG9yKHZhbHVlLnRvUmdiU3RyaW5nKCkpLm9uQmFja2dyb3VuZChiZ0NvbG9yVG9rZW4pLnRvSHN2KCk7XG4gIGlmIChhIDw9IDAuNSkge1xuICAgIC8vIEFkYXB0ZWQgdG8gZGFyayBtb2RlXG4gICAgcmV0dXJuIGhzdi52ID4gMC41O1xuICB9XG4gIHJldHVybiByICogMC4yOTkgKyBnICogMC41ODcgKyBiICogMC4xMTQgPiAxOTI7XG59O1xuY29uc3QgZ2VuQ29sbGFwc2VQYW5lbEtleSA9IChwcmVzZXQsIGluZGV4KSA9PiB7XG4gIHZhciBfYTtcbiAgY29uc3QgbWVyZ2VkS2V5ID0gKF9hID0gcHJlc2V0LmtleSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogaW5kZXg7XG4gIHJldHVybiBgcGFuZWwtJHttZXJnZWRLZXl9YDtcbn07XG5jb25zdCBDb2xvclByZXNldHMgPSBfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBwcmVmaXhDbHMsXG4gICAgcHJlc2V0cyxcbiAgICB2YWx1ZTogY29sb3IsXG4gICAgb25DaGFuZ2VcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IFtsb2NhbGVdID0gdXNlTG9jYWxlKCdDb2xvclBpY2tlcicpO1xuICBjb25zdCBbLCB0b2tlbl0gPSB1c2VUb2tlbigpO1xuICBjb25zdCBbcHJlc2V0c1ZhbHVlXSA9IHVzZU1lcmdlZFN0YXRlKGdlblByZXNldENvbG9yKHByZXNldHMpLCB7XG4gICAgdmFsdWU6IGdlblByZXNldENvbG9yKHByZXNldHMpLFxuICAgIHBvc3RTdGF0ZTogZ2VuUHJlc2V0Q29sb3JcbiAgfSk7XG4gIGNvbnN0IGNvbG9yUHJlc2V0c1ByZWZpeENscyA9IGAke3ByZWZpeENsc30tcHJlc2V0c2A7XG4gIGNvbnN0IGFjdGl2ZUtleXMgPSB1c2VNZW1vKCgpID0+IHByZXNldHNWYWx1ZS5yZWR1Y2UoKGFjYywgcHJlc2V0LCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGRlZmF1bHRPcGVuID0gdHJ1ZVxuICAgIH0gPSBwcmVzZXQ7XG4gICAgaWYgKGRlZmF1bHRPcGVuKSB7XG4gICAgICBhY2MucHVzaChnZW5Db2xsYXBzZVBhbmVsS2V5KHByZXNldCwgaW5kZXgpKTtcbiAgICB9XG4gICAgcmV0dXJuIGFjYztcbiAgfSwgW10pLCBbcHJlc2V0c1ZhbHVlXSk7XG4gIGNvbnN0IGhhbmRsZUNsaWNrID0gY29sb3JWYWx1ZSA9PiB7XG4gICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKGNvbG9yVmFsdWUpO1xuICB9O1xuICBjb25zdCBpdGVtcyA9IHByZXNldHNWYWx1ZS5tYXAoKHByZXNldCwgaW5kZXgpID0+IHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleTogZ2VuQ29sbGFwc2VQYW5lbEtleShwcmVzZXQsIGluZGV4KSxcbiAgICAgIGxhYmVsOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogYCR7Y29sb3JQcmVzZXRzUHJlZml4Q2xzfS1sYWJlbGBcbiAgICAgIH0sIHByZXNldCA9PT0gbnVsbCB8fCBwcmVzZXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHByZXNldC5sYWJlbCksXG4gICAgICBjaGlsZHJlbjogKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBgJHtjb2xvclByZXNldHNQcmVmaXhDbHN9LWl0ZW1zYFxuICAgICAgfSwgQXJyYXkuaXNBcnJheShwcmVzZXQgPT09IG51bGwgfHwgcHJlc2V0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwcmVzZXQuY29sb3JzKSAmJiAoKF9hID0gcHJlc2V0LmNvbG9ycykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCkgPiAwID8gcHJlc2V0LmNvbG9ycy5tYXAoKHByZXNldENvbG9yLCBpbmRleCkgPT4gKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbG9yQmxvY2tcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC9uby1hcnJheS1pbmRleC1rZXlcbiAgICAgICwge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3Qvbm8tYXJyYXktaW5kZXgta2V5XG4gICAgICAgIGtleTogYHByZXNldC0ke2luZGV4fS0ke3ByZXNldENvbG9yLnRvSGV4U3RyaW5nKCl9YCxcbiAgICAgICAgY29sb3I6IGdlbmVyYXRlQ29sb3IocHJlc2V0Q29sb3IpLnRvUmdiU3RyaW5nKCksXG4gICAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoYCR7Y29sb3JQcmVzZXRzUHJlZml4Q2xzfS1jb2xvcmAsIHtcbiAgICAgICAgICBbYCR7Y29sb3JQcmVzZXRzUHJlZml4Q2xzfS1jb2xvci1jaGVja2VkYF06IHByZXNldENvbG9yLnRvSGV4U3RyaW5nKCkgPT09IChjb2xvciA9PT0gbnVsbCB8fCBjb2xvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29sb3IudG9IZXhTdHJpbmcoKSksXG4gICAgICAgICAgW2Ake2NvbG9yUHJlc2V0c1ByZWZpeENsc30tY29sb3ItYnJpZ2h0YF06IGlzQnJpZ2h0KHByZXNldENvbG9yLCB0b2tlbi5jb2xvckJnRWxldmF0ZWQpXG4gICAgICAgIH0pLFxuICAgICAgICBvbkNsaWNrOiAoKSA9PiBoYW5kbGVDbGljayhwcmVzZXRDb2xvcilcbiAgICAgIH0pKSkgOiAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBgJHtjb2xvclByZXNldHNQcmVmaXhDbHN9LWVtcHR5YFxuICAgICAgfSwgbG9jYWxlLnByZXNldEVtcHR5KSkpKVxuICAgIH07XG4gIH0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogY29sb3JQcmVzZXRzUHJlZml4Q2xzXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbGxhcHNlLCB7XG4gICAgZGVmYXVsdEFjdGl2ZUtleTogYWN0aXZlS2V5cyxcbiAgICBnaG9zdDogdHJ1ZSxcbiAgICBpdGVtczogaXRlbXNcbiAgfSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IENvbG9yUHJlc2V0czsiLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUmlnaHRPdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9SaWdodE91dGxpbmVkXCI7XG5pbXBvcnQgQW50ZEljb24gZnJvbSBcIi4uL2NvbXBvbmVudHMvQW50ZEljb25cIjtcbnZhciBSaWdodE91dGxpbmVkID0gZnVuY3Rpb24gUmlnaHRPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbnRkSWNvbiwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogUmlnaHRPdXRsaW5lZFN2Z1xuICB9KSk7XG59O1xuXG4vKiohW3JpZ2h0XShkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUIzYVdSMGFEMGlOVEFpSUdobGFXZG9kRDBpTlRBaUlHWnBiR3c5SWlOallXTmhZMkVpSUhacFpYZENiM2c5SWpZMElEWTBJRGc1TmlBNE9UWWlJR1p2WTNWellXSnNaVDBpWm1Gc2MyVWlJSGh0Ykc1elBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5SStQSEJoZEdnZ1pEMGlUVGMyTlM0M0lEUTROaTQ0VERNeE5DNDVJREV6TkM0M1FUY3VPVGNnTnk0NU55QXdJREF3TXpBeUlERTBNWFkzTnk0ell6QWdOQzQ1SURJdU15QTVMallnTmk0eElERXlMalpzTXpZd0lESTRNUzR4TFRNMk1DQXlPREV1TVdNdE15NDVJRE10Tmk0eElEY3VOeTAyTGpFZ01USXVObFk0T0ROak1DQTJMamNnTnk0M0lERXdMalFnTVRJdU9TQTJMak5zTkRVd0xqZ3RNelV5TGpGaE16RXVPVFlnTXpFdU9UWWdNQ0F3TURBdE5UQXVOSG9pSUM4K1BDOXpkbWMrKSAqL1xudmFyIFJlZkljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihSaWdodE91dGxpbmVkKTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFJlZkljb24uZGlzcGxheU5hbWUgPSAnUmlnaHRPdXRsaW5lZCc7XG59XG5leHBvcnQgZGVmYXVsdCBSZWZJY29uOyIsICIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBSaWdodE91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk03NjUuNyA0ODYuOEwzMTQuOSAxMzQuN0E3Ljk3IDcuOTcgMCAwMDMwMiAxNDF2NzcuM2MwIDQuOSAyLjMgOS42IDYuMSAxMi42bDM2MCAyODEuMS0zNjAgMjgxLjFjLTMuOSAzLTYuMSA3LjctNi4xIDEyLjZWODgzYzAgNi43IDcuNyAxMC40IDEyLjkgNi4zbDQ1MC44LTM1Mi4xYTMxLjk2IDMxLjk2IDAgMDAwLTUwLjR6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJyaWdodFwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgUmlnaHRPdXRsaW5lZDtcbiIsICJjb25zdCBnZW5Db2xsYXBzZU1vdGlvbiA9IHRva2VuID0+ICh7XG4gIFt0b2tlbi5jb21wb25lbnRDbHNdOiB7XG4gICAgLy8gRm9yIGNvbW1vbi9vcGVuQW5pbWF0aW9uXG4gICAgW2Ake3Rva2VuLmFudENsc30tbW90aW9uLWNvbGxhcHNlLWxlZ2FjeWBdOiB7XG4gICAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgICAnJi1hY3RpdmUnOiB7XG4gICAgICAgIHRyYW5zaXRpb246IGBoZWlnaHQgJHt0b2tlbi5tb3Rpb25EdXJhdGlvbk1pZH0gJHt0b2tlbi5tb3Rpb25FYXNlSW5PdXR9LFxuICAgICAgICBvcGFjaXR5ICR7dG9rZW4ubW90aW9uRHVyYXRpb25NaWR9ICR7dG9rZW4ubW90aW9uRWFzZUluT3V0fSAhaW1wb3J0YW50YFxuICAgICAgfVxuICAgIH0sXG4gICAgW2Ake3Rva2VuLmFudENsc30tbW90aW9uLWNvbGxhcHNlYF06IHtcbiAgICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICAgIHRyYW5zaXRpb246IGBoZWlnaHQgJHt0b2tlbi5tb3Rpb25EdXJhdGlvbk1pZH0gJHt0b2tlbi5tb3Rpb25FYXNlSW5PdXR9LFxuICAgICAgICBvcGFjaXR5ICR7dG9rZW4ubW90aW9uRHVyYXRpb25NaWR9ICR7dG9rZW4ubW90aW9uRWFzZUluT3V0fSAhaW1wb3J0YW50YFxuICAgIH1cbiAgfVxufSk7XG5leHBvcnQgZGVmYXVsdCBnZW5Db2xsYXBzZU1vdGlvbjsiLCAiY29uc3QgaW5pdE1vdGlvbkNvbW1vbiA9IGR1cmF0aW9uID0+ICh7XG4gIGFuaW1hdGlvbkR1cmF0aW9uOiBkdXJhdGlvbixcbiAgYW5pbWF0aW9uRmlsbE1vZGU6ICdib3RoJ1xufSk7XG4vLyBGSVhNRTogb3JpZ2luIGxlc3MgY29kZSBzZWVtcyBzYW1lIGFzIGluaXRNb3Rpb25Db21tb24uIE1heWJlIHdlIGNhbiBzYWZlIHJlbW92ZVxuY29uc3QgaW5pdE1vdGlvbkNvbW1vbkxlYXZlID0gZHVyYXRpb24gPT4gKHtcbiAgYW5pbWF0aW9uRHVyYXRpb246IGR1cmF0aW9uLFxuICBhbmltYXRpb25GaWxsTW9kZTogJ2JvdGgnXG59KTtcbmV4cG9ydCBjb25zdCBpbml0TW90aW9uID0gZnVuY3Rpb24gKG1vdGlvbkNscywgaW5LZXlmcmFtZXMsIG91dEtleWZyYW1lcywgZHVyYXRpb24pIHtcbiAgbGV0IHNhbWVMZXZlbCA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogZmFsc2U7XG4gIGNvbnN0IHNhbWVMZXZlbFByZWZpeCA9IHNhbWVMZXZlbCA/ICcmJyA6ICcnO1xuICByZXR1cm4ge1xuICAgIFtgXG4gICAgICAke3NhbWVMZXZlbFByZWZpeH0ke21vdGlvbkNsc30tZW50ZXIsXG4gICAgICAke3NhbWVMZXZlbFByZWZpeH0ke21vdGlvbkNsc30tYXBwZWFyXG4gICAgYF06IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgaW5pdE1vdGlvbkNvbW1vbihkdXJhdGlvbikpLCB7XG4gICAgICBhbmltYXRpb25QbGF5U3RhdGU6ICdwYXVzZWQnXG4gICAgfSksXG4gICAgW2Ake3NhbWVMZXZlbFByZWZpeH0ke21vdGlvbkNsc30tbGVhdmVgXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBpbml0TW90aW9uQ29tbW9uTGVhdmUoZHVyYXRpb24pKSwge1xuICAgICAgYW5pbWF0aW9uUGxheVN0YXRlOiAncGF1c2VkJ1xuICAgIH0pLFxuICAgIFtgXG4gICAgICAke3NhbWVMZXZlbFByZWZpeH0ke21vdGlvbkNsc30tZW50ZXIke21vdGlvbkNsc30tZW50ZXItYWN0aXZlLFxuICAgICAgJHtzYW1lTGV2ZWxQcmVmaXh9JHttb3Rpb25DbHN9LWFwcGVhciR7bW90aW9uQ2xzfS1hcHBlYXItYWN0aXZlXG4gICAgYF06IHtcbiAgICAgIGFuaW1hdGlvbk5hbWU6IGluS2V5ZnJhbWVzLFxuICAgICAgYW5pbWF0aW9uUGxheVN0YXRlOiAncnVubmluZydcbiAgICB9LFxuICAgIFtgJHtzYW1lTGV2ZWxQcmVmaXh9JHttb3Rpb25DbHN9LWxlYXZlJHttb3Rpb25DbHN9LWxlYXZlLWFjdGl2ZWBdOiB7XG4gICAgICBhbmltYXRpb25OYW1lOiBvdXRLZXlmcmFtZXMsXG4gICAgICBhbmltYXRpb25QbGF5U3RhdGU6ICdydW5uaW5nJyxcbiAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJ1xuICAgIH1cbiAgfTtcbn07IiwgImltcG9ydCB7IEtleWZyYW1lcyB9IGZyb20gJ0BhbnQtZGVzaWduL2Nzc2luanMnO1xuaW1wb3J0IHsgaW5pdE1vdGlvbiB9IGZyb20gJy4vbW90aW9uJztcbmV4cG9ydCBjb25zdCBmYWRlSW4gPSBuZXcgS2V5ZnJhbWVzKCdhbnRGYWRlSW4nLCB7XG4gICcwJSc6IHtcbiAgICBvcGFjaXR5OiAwXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIG9wYWNpdHk6IDFcbiAgfVxufSk7XG5leHBvcnQgY29uc3QgZmFkZU91dCA9IG5ldyBLZXlmcmFtZXMoJ2FudEZhZGVPdXQnLCB7XG4gICcwJSc6IHtcbiAgICBvcGFjaXR5OiAxXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIG9wYWNpdHk6IDBcbiAgfVxufSk7XG5leHBvcnQgY29uc3QgaW5pdEZhZGVNb3Rpb24gPSBmdW5jdGlvbiAodG9rZW4pIHtcbiAgbGV0IHNhbWVMZXZlbCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG4gIGNvbnN0IHtcbiAgICBhbnRDbHNcbiAgfSA9IHRva2VuO1xuICBjb25zdCBtb3Rpb25DbHMgPSBgJHthbnRDbHN9LWZhZGVgO1xuICBjb25zdCBzYW1lTGV2ZWxQcmVmaXggPSBzYW1lTGV2ZWwgPyAnJicgOiAnJztcbiAgcmV0dXJuIFtpbml0TW90aW9uKG1vdGlvbkNscywgZmFkZUluLCBmYWRlT3V0LCB0b2tlbi5tb3Rpb25EdXJhdGlvbk1pZCwgc2FtZUxldmVsKSwge1xuICAgIFtgXG4gICAgICAgICR7c2FtZUxldmVsUHJlZml4fSR7bW90aW9uQ2xzfS1lbnRlcixcbiAgICAgICAgJHtzYW1lTGV2ZWxQcmVmaXh9JHttb3Rpb25DbHN9LWFwcGVhclxuICAgICAgYF06IHtcbiAgICAgIG9wYWNpdHk6IDAsXG4gICAgICBhbmltYXRpb25UaW1pbmdGdW5jdGlvbjogJ2xpbmVhcidcbiAgICB9LFxuICAgIFtgJHtzYW1lTGV2ZWxQcmVmaXh9JHttb3Rpb25DbHN9LWxlYXZlYF06IHtcbiAgICAgIGFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uOiAnbGluZWFyJ1xuICAgIH1cbiAgfV07XG59OyIsICJpbXBvcnQgeyBLZXlmcmFtZXMgfSBmcm9tICdAYW50LWRlc2lnbi9jc3NpbmpzJztcbmltcG9ydCB7IGluaXRNb3Rpb24gfSBmcm9tICcuL21vdGlvbic7XG5leHBvcnQgY29uc3QgbW92ZURvd25JbiA9IG5ldyBLZXlmcmFtZXMoJ2FudE1vdmVEb3duSW4nLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAxMDAlLCAwKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCAwJyxcbiAgICBvcGFjaXR5OiAwXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcwIDAnLFxuICAgIG9wYWNpdHk6IDFcbiAgfVxufSk7XG5leHBvcnQgY29uc3QgbW92ZURvd25PdXQgPSBuZXcgS2V5ZnJhbWVzKCdhbnRNb3ZlRG93bk91dCcsIHtcbiAgJzAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcwIDAnLFxuICAgIG9wYWNpdHk6IDFcbiAgfSxcbiAgJzEwMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMTAwJSwgMCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzAgMCcsXG4gICAgb3BhY2l0eTogMFxuICB9XG59KTtcbmV4cG9ydCBjb25zdCBtb3ZlTGVmdEluID0gbmV3IEtleWZyYW1lcygnYW50TW92ZUxlZnRJbicsIHtcbiAgJzAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKC0xMDAlLCAwLCAwKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCAwJyxcbiAgICBvcGFjaXR5OiAwXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcwIDAnLFxuICAgIG9wYWNpdHk6IDFcbiAgfVxufSk7XG5leHBvcnQgY29uc3QgbW92ZUxlZnRPdXQgPSBuZXcgS2V5ZnJhbWVzKCdhbnRNb3ZlTGVmdE91dCcsIHtcbiAgJzAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcwIDAnLFxuICAgIG9wYWNpdHk6IDFcbiAgfSxcbiAgJzEwMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoLTEwMCUsIDAsIDApJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcwIDAnLFxuICAgIG9wYWNpdHk6IDBcbiAgfVxufSk7XG5leHBvcnQgY29uc3QgbW92ZVJpZ2h0SW4gPSBuZXcgS2V5ZnJhbWVzKCdhbnRNb3ZlUmlnaHRJbicsIHtcbiAgJzAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDEwMCUsIDAsIDApJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcwIDAnLFxuICAgIG9wYWNpdHk6IDBcbiAgfSxcbiAgJzEwMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzAgMCcsXG4gICAgb3BhY2l0eTogMVxuICB9XG59KTtcbmV4cG9ydCBjb25zdCBtb3ZlUmlnaHRPdXQgPSBuZXcgS2V5ZnJhbWVzKCdhbnRNb3ZlUmlnaHRPdXQnLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCAwJyxcbiAgICBvcGFjaXR5OiAxXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDEwMCUsIDAsIDApJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcwIDAnLFxuICAgIG9wYWNpdHk6IDBcbiAgfVxufSk7XG5leHBvcnQgY29uc3QgbW92ZVVwSW4gPSBuZXcgS2V5ZnJhbWVzKCdhbnRNb3ZlVXBJbicsIHtcbiAgJzAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIC0xMDAlLCAwKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCAwJyxcbiAgICBvcGFjaXR5OiAwXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcwIDAnLFxuICAgIG9wYWNpdHk6IDFcbiAgfVxufSk7XG5leHBvcnQgY29uc3QgbW92ZVVwT3V0ID0gbmV3IEtleWZyYW1lcygnYW50TW92ZVVwT3V0Jywge1xuICAnMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzAgMCcsXG4gICAgb3BhY2l0eTogMVxuICB9LFxuICAnMTAwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAtMTAwJSwgMCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzAgMCcsXG4gICAgb3BhY2l0eTogMFxuICB9XG59KTtcbmNvbnN0IG1vdmVNb3Rpb24gPSB7XG4gICdtb3ZlLXVwJzoge1xuICAgIGluS2V5ZnJhbWVzOiBtb3ZlVXBJbixcbiAgICBvdXRLZXlmcmFtZXM6IG1vdmVVcE91dFxuICB9LFxuICAnbW92ZS1kb3duJzoge1xuICAgIGluS2V5ZnJhbWVzOiBtb3ZlRG93bkluLFxuICAgIG91dEtleWZyYW1lczogbW92ZURvd25PdXRcbiAgfSxcbiAgJ21vdmUtbGVmdCc6IHtcbiAgICBpbktleWZyYW1lczogbW92ZUxlZnRJbixcbiAgICBvdXRLZXlmcmFtZXM6IG1vdmVMZWZ0T3V0XG4gIH0sXG4gICdtb3ZlLXJpZ2h0Jzoge1xuICAgIGluS2V5ZnJhbWVzOiBtb3ZlUmlnaHRJbixcbiAgICBvdXRLZXlmcmFtZXM6IG1vdmVSaWdodE91dFxuICB9XG59O1xuZXhwb3J0IGNvbnN0IGluaXRNb3ZlTW90aW9uID0gKHRva2VuLCBtb3Rpb25OYW1lKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBhbnRDbHNcbiAgfSA9IHRva2VuO1xuICBjb25zdCBtb3Rpb25DbHMgPSBgJHthbnRDbHN9LSR7bW90aW9uTmFtZX1gO1xuICBjb25zdCB7XG4gICAgaW5LZXlmcmFtZXMsXG4gICAgb3V0S2V5ZnJhbWVzXG4gIH0gPSBtb3ZlTW90aW9uW21vdGlvbk5hbWVdO1xuICByZXR1cm4gW2luaXRNb3Rpb24obW90aW9uQ2xzLCBpbktleWZyYW1lcywgb3V0S2V5ZnJhbWVzLCB0b2tlbi5tb3Rpb25EdXJhdGlvbk1pZCksIHtcbiAgICBbYFxuICAgICAgICAke21vdGlvbkNsc30tZW50ZXIsXG4gICAgICAgICR7bW90aW9uQ2xzfS1hcHBlYXJcbiAgICAgIGBdOiB7XG4gICAgICBvcGFjaXR5OiAwLFxuICAgICAgYW5pbWF0aW9uVGltaW5nRnVuY3Rpb246IHRva2VuLm1vdGlvbkVhc2VPdXRDaXJjXG4gICAgfSxcbiAgICBbYCR7bW90aW9uQ2xzfS1sZWF2ZWBdOiB7XG4gICAgICBhbmltYXRpb25UaW1pbmdGdW5jdGlvbjogdG9rZW4ubW90aW9uRWFzZUluT3V0Q2lyY1xuICAgIH1cbiAgfV07XG59OyIsICJpbXBvcnQgeyBLZXlmcmFtZXMgfSBmcm9tICdAYW50LWRlc2lnbi9jc3NpbmpzJztcbmltcG9ydCB7IGluaXRNb3Rpb24gfSBmcm9tICcuL21vdGlvbic7XG5leHBvcnQgY29uc3Qgc2xpZGVVcEluID0gbmV3IEtleWZyYW1lcygnYW50U2xpZGVVcEluJywge1xuICAnMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGVZKDAuOCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzAlIDAlJyxcbiAgICBvcGFjaXR5OiAwXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlWSgxKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCUgMCUnLFxuICAgIG9wYWNpdHk6IDFcbiAgfVxufSk7XG5leHBvcnQgY29uc3Qgc2xpZGVVcE91dCA9IG5ldyBLZXlmcmFtZXMoJ2FudFNsaWRlVXBPdXQnLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZVkoMSknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzAlIDAlJyxcbiAgICBvcGFjaXR5OiAxXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlWSgwLjgpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcwJSAwJScsXG4gICAgb3BhY2l0eTogMFxuICB9XG59KTtcbmV4cG9ydCBjb25zdCBzbGlkZURvd25JbiA9IG5ldyBLZXlmcmFtZXMoJ2FudFNsaWRlRG93bkluJywge1xuICAnMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGVZKDAuOCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzEwMCUgMTAwJScsXG4gICAgb3BhY2l0eTogMFxuICB9LFxuICAnMTAwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZVkoMSknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzEwMCUgMTAwJScsXG4gICAgb3BhY2l0eTogMVxuICB9XG59KTtcbmV4cG9ydCBjb25zdCBzbGlkZURvd25PdXQgPSBuZXcgS2V5ZnJhbWVzKCdhbnRTbGlkZURvd25PdXQnLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZVkoMSknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzEwMCUgMTAwJScsXG4gICAgb3BhY2l0eTogMVxuICB9LFxuICAnMTAwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZVkoMC44KScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMTAwJSAxMDAlJyxcbiAgICBvcGFjaXR5OiAwXG4gIH1cbn0pO1xuZXhwb3J0IGNvbnN0IHNsaWRlTGVmdEluID0gbmV3IEtleWZyYW1lcygnYW50U2xpZGVMZWZ0SW4nLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZVgoMC44KScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCUgMCUnLFxuICAgIG9wYWNpdHk6IDBcbiAgfSxcbiAgJzEwMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGVYKDEpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcwJSAwJScsXG4gICAgb3BhY2l0eTogMVxuICB9XG59KTtcbmV4cG9ydCBjb25zdCBzbGlkZUxlZnRPdXQgPSBuZXcgS2V5ZnJhbWVzKCdhbnRTbGlkZUxlZnRPdXQnLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZVgoMSknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzAlIDAlJyxcbiAgICBvcGFjaXR5OiAxXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlWCgwLjgpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcwJSAwJScsXG4gICAgb3BhY2l0eTogMFxuICB9XG59KTtcbmV4cG9ydCBjb25zdCBzbGlkZVJpZ2h0SW4gPSBuZXcgS2V5ZnJhbWVzKCdhbnRTbGlkZVJpZ2h0SW4nLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZVgoMC44KScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMTAwJSAwJScsXG4gICAgb3BhY2l0eTogMFxuICB9LFxuICAnMTAwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZVgoMSknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzEwMCUgMCUnLFxuICAgIG9wYWNpdHk6IDFcbiAgfVxufSk7XG5leHBvcnQgY29uc3Qgc2xpZGVSaWdodE91dCA9IG5ldyBLZXlmcmFtZXMoJ2FudFNsaWRlUmlnaHRPdXQnLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZVgoMSknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzEwMCUgMCUnLFxuICAgIG9wYWNpdHk6IDFcbiAgfSxcbiAgJzEwMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGVYKDAuOCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzEwMCUgMCUnLFxuICAgIG9wYWNpdHk6IDBcbiAgfVxufSk7XG5jb25zdCBzbGlkZU1vdGlvbiA9IHtcbiAgJ3NsaWRlLXVwJzoge1xuICAgIGluS2V5ZnJhbWVzOiBzbGlkZVVwSW4sXG4gICAgb3V0S2V5ZnJhbWVzOiBzbGlkZVVwT3V0XG4gIH0sXG4gICdzbGlkZS1kb3duJzoge1xuICAgIGluS2V5ZnJhbWVzOiBzbGlkZURvd25JbixcbiAgICBvdXRLZXlmcmFtZXM6IHNsaWRlRG93bk91dFxuICB9LFxuICAnc2xpZGUtbGVmdCc6IHtcbiAgICBpbktleWZyYW1lczogc2xpZGVMZWZ0SW4sXG4gICAgb3V0S2V5ZnJhbWVzOiBzbGlkZUxlZnRPdXRcbiAgfSxcbiAgJ3NsaWRlLXJpZ2h0Jzoge1xuICAgIGluS2V5ZnJhbWVzOiBzbGlkZVJpZ2h0SW4sXG4gICAgb3V0S2V5ZnJhbWVzOiBzbGlkZVJpZ2h0T3V0XG4gIH1cbn07XG5leHBvcnQgY29uc3QgaW5pdFNsaWRlTW90aW9uID0gKHRva2VuLCBtb3Rpb25OYW1lKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBhbnRDbHNcbiAgfSA9IHRva2VuO1xuICBjb25zdCBtb3Rpb25DbHMgPSBgJHthbnRDbHN9LSR7bW90aW9uTmFtZX1gO1xuICBjb25zdCB7XG4gICAgaW5LZXlmcmFtZXMsXG4gICAgb3V0S2V5ZnJhbWVzXG4gIH0gPSBzbGlkZU1vdGlvblttb3Rpb25OYW1lXTtcbiAgcmV0dXJuIFtpbml0TW90aW9uKG1vdGlvbkNscywgaW5LZXlmcmFtZXMsIG91dEtleWZyYW1lcywgdG9rZW4ubW90aW9uRHVyYXRpb25NaWQpLCB7XG4gICAgW2BcbiAgICAgICR7bW90aW9uQ2xzfS1lbnRlcixcbiAgICAgICR7bW90aW9uQ2xzfS1hcHBlYXJcbiAgICBgXToge1xuICAgICAgdHJhbnNmb3JtOiAnc2NhbGUoMCknLFxuICAgICAgdHJhbnNmb3JtT3JpZ2luOiAnMCUgMCUnLFxuICAgICAgb3BhY2l0eTogMCxcbiAgICAgIGFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uOiB0b2tlbi5tb3Rpb25FYXNlT3V0UXVpbnQsXG4gICAgICAnJi1wcmVwYXJlJzoge1xuICAgICAgICB0cmFuc2Zvcm06ICdzY2FsZSgxKSdcbiAgICAgIH1cbiAgICB9LFxuICAgIFtgJHttb3Rpb25DbHN9LWxlYXZlYF06IHtcbiAgICAgIGFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uOiB0b2tlbi5tb3Rpb25FYXNlSW5RdWludFxuICAgIH1cbiAgfV07XG59OyIsICJpbXBvcnQgeyBLZXlmcmFtZXMgfSBmcm9tICdAYW50LWRlc2lnbi9jc3NpbmpzJztcbmltcG9ydCB7IGluaXRNb3Rpb24gfSBmcm9tICcuL21vdGlvbic7XG5leHBvcnQgY29uc3Qgem9vbUluID0gbmV3IEtleWZyYW1lcygnYW50Wm9vbUluJywge1xuICAnMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGUoMC4yKScsXG4gICAgb3BhY2l0eTogMFxuICB9LFxuICAnMTAwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgxKScsXG4gICAgb3BhY2l0eTogMVxuICB9XG59KTtcbmV4cG9ydCBjb25zdCB6b29tT3V0ID0gbmV3IEtleWZyYW1lcygnYW50Wm9vbU91dCcsIHtcbiAgJzAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDEpJ1xuICB9LFxuICAnMTAwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgwLjIpJyxcbiAgICBvcGFjaXR5OiAwXG4gIH1cbn0pO1xuZXhwb3J0IGNvbnN0IHpvb21CaWdJbiA9IG5ldyBLZXlmcmFtZXMoJ2FudFpvb21CaWdJbicsIHtcbiAgJzAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDAuOCknLFxuICAgIG9wYWNpdHk6IDBcbiAgfSxcbiAgJzEwMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGUoMSknLFxuICAgIG9wYWNpdHk6IDFcbiAgfVxufSk7XG5leHBvcnQgY29uc3Qgem9vbUJpZ091dCA9IG5ldyBLZXlmcmFtZXMoJ2FudFpvb21CaWdPdXQnLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgxKSdcbiAgfSxcbiAgJzEwMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGUoMC44KScsXG4gICAgb3BhY2l0eTogMFxuICB9XG59KTtcbmV4cG9ydCBjb25zdCB6b29tVXBJbiA9IG5ldyBLZXlmcmFtZXMoJ2FudFpvb21VcEluJywge1xuICAnMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGUoMC44KScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnNTAlIDAlJyxcbiAgICBvcGFjaXR5OiAwXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDEpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICc1MCUgMCUnXG4gIH1cbn0pO1xuZXhwb3J0IGNvbnN0IHpvb21VcE91dCA9IG5ldyBLZXlmcmFtZXMoJ2FudFpvb21VcE91dCcsIHtcbiAgJzAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDEpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICc1MCUgMCUnXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDAuOCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzUwJSAwJScsXG4gICAgb3BhY2l0eTogMFxuICB9XG59KTtcbmV4cG9ydCBjb25zdCB6b29tTGVmdEluID0gbmV3IEtleWZyYW1lcygnYW50Wm9vbUxlZnRJbicsIHtcbiAgJzAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDAuOCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzAlIDUwJScsXG4gICAgb3BhY2l0eTogMFxuICB9LFxuICAnMTAwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgxKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCUgNTAlJ1xuICB9XG59KTtcbmV4cG9ydCBjb25zdCB6b29tTGVmdE91dCA9IG5ldyBLZXlmcmFtZXMoJ2FudFpvb21MZWZ0T3V0Jywge1xuICAnMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGUoMSknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzAlIDUwJSdcbiAgfSxcbiAgJzEwMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGUoMC44KScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCUgNTAlJyxcbiAgICBvcGFjaXR5OiAwXG4gIH1cbn0pO1xuZXhwb3J0IGNvbnN0IHpvb21SaWdodEluID0gbmV3IEtleWZyYW1lcygnYW50Wm9vbVJpZ2h0SW4nLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgwLjgpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcxMDAlIDUwJScsXG4gICAgb3BhY2l0eTogMFxuICB9LFxuICAnMTAwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgxKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMTAwJSA1MCUnXG4gIH1cbn0pO1xuZXhwb3J0IGNvbnN0IHpvb21SaWdodE91dCA9IG5ldyBLZXlmcmFtZXMoJ2FudFpvb21SaWdodE91dCcsIHtcbiAgJzAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDEpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcxMDAlIDUwJSdcbiAgfSxcbiAgJzEwMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGUoMC44KScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMTAwJSA1MCUnLFxuICAgIG9wYWNpdHk6IDBcbiAgfVxufSk7XG5leHBvcnQgY29uc3Qgem9vbURvd25JbiA9IG5ldyBLZXlmcmFtZXMoJ2FudFpvb21Eb3duSW4nLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgwLjgpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICc1MCUgMTAwJScsXG4gICAgb3BhY2l0eTogMFxuICB9LFxuICAnMTAwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgxKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnNTAlIDEwMCUnXG4gIH1cbn0pO1xuZXhwb3J0IGNvbnN0IHpvb21Eb3duT3V0ID0gbmV3IEtleWZyYW1lcygnYW50Wm9vbURvd25PdXQnLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgxKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnNTAlIDEwMCUnXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDAuOCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzUwJSAxMDAlJyxcbiAgICBvcGFjaXR5OiAwXG4gIH1cbn0pO1xuY29uc3Qgem9vbU1vdGlvbiA9IHtcbiAgem9vbToge1xuICAgIGluS2V5ZnJhbWVzOiB6b29tSW4sXG4gICAgb3V0S2V5ZnJhbWVzOiB6b29tT3V0XG4gIH0sXG4gICd6b29tLWJpZyc6IHtcbiAgICBpbktleWZyYW1lczogem9vbUJpZ0luLFxuICAgIG91dEtleWZyYW1lczogem9vbUJpZ091dFxuICB9LFxuICAnem9vbS1iaWctZmFzdCc6IHtcbiAgICBpbktleWZyYW1lczogem9vbUJpZ0luLFxuICAgIG91dEtleWZyYW1lczogem9vbUJpZ091dFxuICB9LFxuICAnem9vbS1sZWZ0Jzoge1xuICAgIGluS2V5ZnJhbWVzOiB6b29tTGVmdEluLFxuICAgIG91dEtleWZyYW1lczogem9vbUxlZnRPdXRcbiAgfSxcbiAgJ3pvb20tcmlnaHQnOiB7XG4gICAgaW5LZXlmcmFtZXM6IHpvb21SaWdodEluLFxuICAgIG91dEtleWZyYW1lczogem9vbVJpZ2h0T3V0XG4gIH0sXG4gICd6b29tLXVwJzoge1xuICAgIGluS2V5ZnJhbWVzOiB6b29tVXBJbixcbiAgICBvdXRLZXlmcmFtZXM6IHpvb21VcE91dFxuICB9LFxuICAnem9vbS1kb3duJzoge1xuICAgIGluS2V5ZnJhbWVzOiB6b29tRG93bkluLFxuICAgIG91dEtleWZyYW1lczogem9vbURvd25PdXRcbiAgfVxufTtcbmV4cG9ydCBjb25zdCBpbml0Wm9vbU1vdGlvbiA9ICh0b2tlbiwgbW90aW9uTmFtZSkgPT4ge1xuICBjb25zdCB7XG4gICAgYW50Q2xzXG4gIH0gPSB0b2tlbjtcbiAgY29uc3QgbW90aW9uQ2xzID0gYCR7YW50Q2xzfS0ke21vdGlvbk5hbWV9YDtcbiAgY29uc3Qge1xuICAgIGluS2V5ZnJhbWVzLFxuICAgIG91dEtleWZyYW1lc1xuICB9ID0gem9vbU1vdGlvblttb3Rpb25OYW1lXTtcbiAgcmV0dXJuIFtpbml0TW90aW9uKG1vdGlvbkNscywgaW5LZXlmcmFtZXMsIG91dEtleWZyYW1lcywgbW90aW9uTmFtZSA9PT0gJ3pvb20tYmlnLWZhc3QnID8gdG9rZW4ubW90aW9uRHVyYXRpb25GYXN0IDogdG9rZW4ubW90aW9uRHVyYXRpb25NaWQpLCB7XG4gICAgW2BcbiAgICAgICAgJHttb3Rpb25DbHN9LWVudGVyLFxuICAgICAgICAke21vdGlvbkNsc30tYXBwZWFyXG4gICAgICBgXToge1xuICAgICAgdHJhbnNmb3JtOiAnc2NhbGUoMCknLFxuICAgICAgb3BhY2l0eTogMCxcbiAgICAgIGFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uOiB0b2tlbi5tb3Rpb25FYXNlT3V0Q2lyYyxcbiAgICAgICcmLXByZXBhcmUnOiB7XG4gICAgICAgIHRyYW5zZm9ybTogJ25vbmUnXG4gICAgICB9XG4gICAgfSxcbiAgICBbYCR7bW90aW9uQ2xzfS1sZWF2ZWBdOiB7XG4gICAgICBhbmltYXRpb25UaW1pbmdGdW5jdGlvbjogdG9rZW4ubW90aW9uRWFzZUluT3V0Q2lyY1xuICAgIH1cbiAgfV07XG59OyIsICJpbXBvcnQgeyB1bml0IH0gZnJvbSAnQGFudC1kZXNpZ24vY3NzaW5qcyc7XG5pbXBvcnQgeyBBZ2dyZWdhdGlvbkNvbG9yIH0gZnJvbSAnLi4vLi4vY29sb3ItcGlja2VyL2NvbG9yJztcbmltcG9ydCB7IGlzQnJpZ2h0IH0gZnJvbSAnLi4vLi4vY29sb3ItcGlja2VyL2NvbXBvbmVudHMvQ29sb3JQcmVzZXRzJztcbmltcG9ydCB7IGdldExpbmVIZWlnaHQsIG1lcmdlVG9rZW4gfSBmcm9tICcuLi8uLi90aGVtZS9pbnRlcm5hbCc7XG5pbXBvcnQgeyBQcmVzZXRDb2xvcnMgfSBmcm9tICcuLi8uLi90aGVtZS9pbnRlcmZhY2UnO1xuaW1wb3J0IGdldEFscGhhQ29sb3IgZnJvbSAnLi4vLi4vdGhlbWUvdXRpbC9nZXRBbHBoYUNvbG9yJztcbmV4cG9ydCBjb25zdCBwcmVwYXJlVG9rZW4gPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBwYWRkaW5nSW5saW5lLFxuICAgIG9ubHlJY29uU2l6ZVxuICB9ID0gdG9rZW47XG4gIGNvbnN0IGJ1dHRvblRva2VuID0gbWVyZ2VUb2tlbih0b2tlbiwge1xuICAgIGJ1dHRvblBhZGRpbmdIb3Jpem9udGFsOiBwYWRkaW5nSW5saW5lLFxuICAgIGJ1dHRvblBhZGRpbmdWZXJ0aWNhbDogMCxcbiAgICBidXR0b25JY29uT25seUZvbnRTaXplOiBvbmx5SWNvblNpemVcbiAgfSk7XG4gIHJldHVybiBidXR0b25Ub2tlbjtcbn07XG5leHBvcnQgY29uc3QgcHJlcGFyZUNvbXBvbmVudFRva2VuID0gdG9rZW4gPT4ge1xuICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZjtcbiAgY29uc3QgY29udGVudEZvbnRTaXplID0gKF9hID0gdG9rZW4uY29udGVudEZvbnRTaXplKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0b2tlbi5mb250U2l6ZTtcbiAgY29uc3QgY29udGVudEZvbnRTaXplU00gPSAoX2IgPSB0b2tlbi5jb250ZW50Rm9udFNpemVTTSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogdG9rZW4uZm9udFNpemU7XG4gIGNvbnN0IGNvbnRlbnRGb250U2l6ZUxHID0gKF9jID0gdG9rZW4uY29udGVudEZvbnRTaXplTEcpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IHRva2VuLmZvbnRTaXplTEc7XG4gIGNvbnN0IGNvbnRlbnRMaW5lSGVpZ2h0ID0gKF9kID0gdG9rZW4uY29udGVudExpbmVIZWlnaHQpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IGdldExpbmVIZWlnaHQoY29udGVudEZvbnRTaXplKTtcbiAgY29uc3QgY29udGVudExpbmVIZWlnaHRTTSA9IChfZSA9IHRva2VuLmNvbnRlbnRMaW5lSGVpZ2h0U00pICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IGdldExpbmVIZWlnaHQoY29udGVudEZvbnRTaXplU00pO1xuICBjb25zdCBjb250ZW50TGluZUhlaWdodExHID0gKF9mID0gdG9rZW4uY29udGVudExpbmVIZWlnaHRMRykgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogZ2V0TGluZUhlaWdodChjb250ZW50Rm9udFNpemVMRyk7XG4gIGNvbnN0IHNvbGlkVGV4dENvbG9yID0gaXNCcmlnaHQobmV3IEFnZ3JlZ2F0aW9uQ29sb3IodG9rZW4uY29sb3JCZ1NvbGlkKSwgJyNmZmYnKSA/ICcjMDAwJyA6ICcjZmZmJztcbiAgY29uc3Qgc2hhZG93Q29sb3JUb2tlbnMgPSBQcmVzZXRDb2xvcnMucmVkdWNlKChwcmV2LCBjb2xvcktleSkgPT4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwge1xuICAgIFtgJHtjb2xvcktleX1TaGFkb3dDb2xvcmBdOiBgMCAke3VuaXQodG9rZW4uY29udHJvbE91dGxpbmVXaWR0aCl9IDAgJHtnZXRBbHBoYUNvbG9yKHRva2VuW2Ake2NvbG9yS2V5fTFgXSwgdG9rZW4uY29sb3JCZ0NvbnRhaW5lcil9YFxuICB9KSwge30pO1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzaGFkb3dDb2xvclRva2VucyksIHtcbiAgICBmb250V2VpZ2h0OiA0MDAsXG4gICAgZGVmYXVsdFNoYWRvdzogYDAgJHt0b2tlbi5jb250cm9sT3V0bGluZVdpZHRofXB4IDAgJHt0b2tlbi5jb250cm9sVG1wT3V0bGluZX1gLFxuICAgIHByaW1hcnlTaGFkb3c6IGAwICR7dG9rZW4uY29udHJvbE91dGxpbmVXaWR0aH1weCAwICR7dG9rZW4uY29udHJvbE91dGxpbmV9YCxcbiAgICBkYW5nZXJTaGFkb3c6IGAwICR7dG9rZW4uY29udHJvbE91dGxpbmVXaWR0aH1weCAwICR7dG9rZW4uY29sb3JFcnJvck91dGxpbmV9YCxcbiAgICBwcmltYXJ5Q29sb3I6IHRva2VuLmNvbG9yVGV4dExpZ2h0U29saWQsXG4gICAgZGFuZ2VyQ29sb3I6IHRva2VuLmNvbG9yVGV4dExpZ2h0U29saWQsXG4gICAgYm9yZGVyQ29sb3JEaXNhYmxlZDogdG9rZW4uY29sb3JCb3JkZXIsXG4gICAgZGVmYXVsdEdob3N0Q29sb3I6IHRva2VuLmNvbG9yQmdDb250YWluZXIsXG4gICAgZ2hvc3RCZzogJ3RyYW5zcGFyZW50JyxcbiAgICBkZWZhdWx0R2hvc3RCb3JkZXJDb2xvcjogdG9rZW4uY29sb3JCZ0NvbnRhaW5lcixcbiAgICBwYWRkaW5nSW5saW5lOiB0b2tlbi5wYWRkaW5nQ29udGVudEhvcml6b250YWwgLSB0b2tlbi5saW5lV2lkdGgsXG4gICAgcGFkZGluZ0lubGluZUxHOiB0b2tlbi5wYWRkaW5nQ29udGVudEhvcml6b250YWwgLSB0b2tlbi5saW5lV2lkdGgsXG4gICAgcGFkZGluZ0lubGluZVNNOiA4IC0gdG9rZW4ubGluZVdpZHRoLFxuICAgIG9ubHlJY29uU2l6ZTogJ2luaGVyaXQnLFxuICAgIG9ubHlJY29uU2l6ZVNNOiAnaW5oZXJpdCcsXG4gICAgb25seUljb25TaXplTEc6ICdpbmhlcml0JyxcbiAgICBncm91cEJvcmRlckNvbG9yOiB0b2tlbi5jb2xvclByaW1hcnlIb3ZlcixcbiAgICBsaW5rSG92ZXJCZzogJ3RyYW5zcGFyZW50JyxcbiAgICB0ZXh0VGV4dENvbG9yOiB0b2tlbi5jb2xvclRleHQsXG4gICAgdGV4dFRleHRIb3ZlckNvbG9yOiB0b2tlbi5jb2xvclRleHQsXG4gICAgdGV4dFRleHRBY3RpdmVDb2xvcjogdG9rZW4uY29sb3JUZXh0LFxuICAgIHRleHRIb3ZlckJnOiB0b2tlbi5jb2xvckZpbGxUZXJ0aWFyeSxcbiAgICBkZWZhdWx0Q29sb3I6IHRva2VuLmNvbG9yVGV4dCxcbiAgICBkZWZhdWx0Qmc6IHRva2VuLmNvbG9yQmdDb250YWluZXIsXG4gICAgZGVmYXVsdEJvcmRlckNvbG9yOiB0b2tlbi5jb2xvckJvcmRlcixcbiAgICBkZWZhdWx0Qm9yZGVyQ29sb3JEaXNhYmxlZDogdG9rZW4uY29sb3JCb3JkZXIsXG4gICAgZGVmYXVsdEhvdmVyQmc6IHRva2VuLmNvbG9yQmdDb250YWluZXIsXG4gICAgZGVmYXVsdEhvdmVyQ29sb3I6IHRva2VuLmNvbG9yUHJpbWFyeUhvdmVyLFxuICAgIGRlZmF1bHRIb3ZlckJvcmRlckNvbG9yOiB0b2tlbi5jb2xvclByaW1hcnlIb3ZlcixcbiAgICBkZWZhdWx0QWN0aXZlQmc6IHRva2VuLmNvbG9yQmdDb250YWluZXIsXG4gICAgZGVmYXVsdEFjdGl2ZUNvbG9yOiB0b2tlbi5jb2xvclByaW1hcnlBY3RpdmUsXG4gICAgZGVmYXVsdEFjdGl2ZUJvcmRlckNvbG9yOiB0b2tlbi5jb2xvclByaW1hcnlBY3RpdmUsXG4gICAgc29saWRUZXh0Q29sb3IsXG4gICAgY29udGVudEZvbnRTaXplLFxuICAgIGNvbnRlbnRGb250U2l6ZVNNLFxuICAgIGNvbnRlbnRGb250U2l6ZUxHLFxuICAgIGNvbnRlbnRMaW5lSGVpZ2h0LFxuICAgIGNvbnRlbnRMaW5lSGVpZ2h0U00sXG4gICAgY29udGVudExpbmVIZWlnaHRMRyxcbiAgICBwYWRkaW5nQmxvY2s6IE1hdGgubWF4KCh0b2tlbi5jb250cm9sSGVpZ2h0IC0gY29udGVudEZvbnRTaXplICogY29udGVudExpbmVIZWlnaHQpIC8gMiAtIHRva2VuLmxpbmVXaWR0aCwgMCksXG4gICAgcGFkZGluZ0Jsb2NrU006IE1hdGgubWF4KCh0b2tlbi5jb250cm9sSGVpZ2h0U00gLSBjb250ZW50Rm9udFNpemVTTSAqIGNvbnRlbnRMaW5lSGVpZ2h0U00pIC8gMiAtIHRva2VuLmxpbmVXaWR0aCwgMCksXG4gICAgcGFkZGluZ0Jsb2NrTEc6IE1hdGgubWF4KCh0b2tlbi5jb250cm9sSGVpZ2h0TEcgLSBjb250ZW50Rm9udFNpemVMRyAqIGNvbnRlbnRMaW5lSGVpZ2h0TEcpIC8gMiAtIHRva2VuLmxpbmVXaWR0aCwgMClcbiAgfSk7XG59OyIsICJpbXBvcnQgeyB1bml0IH0gZnJvbSAnQGFudC1kZXNpZ24vY3NzaW5qcyc7XG5pbXBvcnQgeyBnZW5Gb2N1c1N0eWxlLCByZXNldEljb24gfSBmcm9tICcuLi8uLi9zdHlsZSc7XG5pbXBvcnQgeyBQcmVzZXRDb2xvcnMgfSBmcm9tICcuLi8uLi90aGVtZS9pbnRlcmZhY2UnO1xuaW1wb3J0IHsgZ2VuU3R5bGVIb29rcywgbWVyZ2VUb2tlbiB9IGZyb20gJy4uLy4uL3RoZW1lL2ludGVybmFsJztcbmltcG9ydCBnZW5Hcm91cFN0eWxlIGZyb20gJy4vZ3JvdXAnO1xuaW1wb3J0IHsgcHJlcGFyZUNvbXBvbmVudFRva2VuLCBwcmVwYXJlVG9rZW4gfSBmcm9tICcuL3Rva2VuJztcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTaGFyZWQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5jb25zdCBnZW5TaGFyZWRCdXR0b25TdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENscyxcbiAgICBpY29uQ2xzLFxuICAgIGZvbnRXZWlnaHQsXG4gICAgb3BhY2l0eUxvYWRpbmcsXG4gICAgbW90aW9uRHVyYXRpb25TbG93LFxuICAgIG1vdGlvbkVhc2VJbk91dCxcbiAgICBtYXJnaW5YUyxcbiAgICBjYWxjXG4gIH0gPSB0b2tlbjtcbiAgcmV0dXJuIHtcbiAgICBbY29tcG9uZW50Q2xzXToge1xuICAgICAgb3V0bGluZTogJ25vbmUnLFxuICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICBkaXNwbGF5OiAnaW5saW5lLWZsZXgnLFxuICAgICAgZ2FwOiB0b2tlbi5tYXJnaW5YUyxcbiAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLFxuICAgICAgZm9udFdlaWdodCxcbiAgICAgIHdoaXRlU3BhY2U6ICdub3dyYXAnLFxuICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgIGJhY2tncm91bmRJbWFnZTogJ25vbmUnLFxuICAgICAgYmFja2dyb3VuZDogJ3RyYW5zcGFyZW50JyxcbiAgICAgIGJvcmRlcjogYCR7dW5pdCh0b2tlbi5saW5lV2lkdGgpfSAke3Rva2VuLmxpbmVUeXBlfSB0cmFuc3BhcmVudGAsXG4gICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgIHRyYW5zaXRpb246IGBhbGwgJHt0b2tlbi5tb3Rpb25EdXJhdGlvbk1pZH0gJHt0b2tlbi5tb3Rpb25FYXNlSW5PdXR9YCxcbiAgICAgIHVzZXJTZWxlY3Q6ICdub25lJyxcbiAgICAgIHRvdWNoQWN0aW9uOiAnbWFuaXB1bGF0aW9uJyxcbiAgICAgIGNvbG9yOiB0b2tlbi5jb2xvclRleHQsXG4gICAgICAnJjpkaXNhYmxlZCA+IConOiB7XG4gICAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJ1xuICAgICAgfSxcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzUxMzgwXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1pY29uID4gc3ZnYF06IHJlc2V0SWNvbigpLFxuICAgICAgJz4gYSc6IHtcbiAgICAgICAgY29sb3I6ICdjdXJyZW50Q29sb3InXG4gICAgICB9LFxuICAgICAgJyY6bm90KDpkaXNhYmxlZCknOiBnZW5Gb2N1c1N0eWxlKHRva2VuKSxcbiAgICAgIFtgJiR7Y29tcG9uZW50Q2xzfS10d28tY2hpbmVzZS1jaGFyczo6Zmlyc3QtbGV0dGVyYF06IHtcbiAgICAgICAgbGV0dGVyU3BhY2luZzogJzAuMzRlbSdcbiAgICAgIH0sXG4gICAgICBbYCYke2NvbXBvbmVudENsc30tdHdvLWNoaW5lc2UtY2hhcnMgPiAqOm5vdCgke2ljb25DbHN9KWBdOiB7XG4gICAgICAgIG1hcmdpbklubGluZUVuZDogJy0wLjM0ZW0nLFxuICAgICAgICBsZXR0ZXJTcGFjaW5nOiAnMC4zNGVtJ1xuICAgICAgfSxcbiAgICAgIFtgJiR7Y29tcG9uZW50Q2xzfS1pY29uLW9ubHlgXToge1xuICAgICAgICBwYWRkaW5nSW5saW5lOiAwLFxuICAgICAgICAvLyBtYWtlIGBidG4taWNvbi1vbmx5YCBub3QgdG9vIG5hcnJvd1xuICAgICAgICBbYCYke2NvbXBvbmVudENsc30tY29tcGFjdC1pdGVtYF06IHtcbiAgICAgICAgICBmbGV4OiAnbm9uZSdcbiAgICAgICAgfSxcbiAgICAgICAgW2AmJHtjb21wb25lbnRDbHN9LXJvdW5kYF06IHtcbiAgICAgICAgICB3aWR0aDogJ2F1dG8nXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyBMb2FkaW5nXG4gICAgICBbYCYke2NvbXBvbmVudENsc30tbG9hZGluZ2BdOiB7XG4gICAgICAgIG9wYWNpdHk6IG9wYWNpdHlMb2FkaW5nLFxuICAgICAgICBjdXJzb3I6ICdkZWZhdWx0J1xuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWxvYWRpbmctaWNvbmBdOiB7XG4gICAgICAgIHRyYW5zaXRpb246IFsnd2lkdGgnLCAnb3BhY2l0eScsICdtYXJnaW4nXS5tYXAodHJhbnNpdGlvbiA9PiBgJHt0cmFuc2l0aW9ufSAke21vdGlvbkR1cmF0aW9uU2xvd30gJHttb3Rpb25FYXNlSW5PdXR9YCkuam9pbignLCcpXG4gICAgICB9LFxuICAgICAgLy8gaWNvblBvc2l0aW9uXG4gICAgICBbYCY6bm90KCR7Y29tcG9uZW50Q2xzfS1pY29uLWVuZClgXToge1xuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1sb2FkaW5nLWljb24tbW90aW9uYF06IHtcbiAgICAgICAgICAnJi1hcHBlYXItc3RhcnQsICYtZW50ZXItc3RhcnQnOiB7XG4gICAgICAgICAgICBtYXJnaW5JbmxpbmVFbmQ6IGNhbGMobWFyZ2luWFMpLm11bCgtMSkuZXF1YWwoKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgJyYtYXBwZWFyLWFjdGl2ZSwgJi1lbnRlci1hY3RpdmUnOiB7XG4gICAgICAgICAgICBtYXJnaW5JbmxpbmVFbmQ6IDBcbiAgICAgICAgICB9LFxuICAgICAgICAgICcmLWxlYXZlLXN0YXJ0Jzoge1xuICAgICAgICAgICAgbWFyZ2luSW5saW5lRW5kOiAwXG4gICAgICAgICAgfSxcbiAgICAgICAgICAnJi1sZWF2ZS1hY3RpdmUnOiB7XG4gICAgICAgICAgICBtYXJnaW5JbmxpbmVFbmQ6IGNhbGMobWFyZ2luWFMpLm11bCgtMSkuZXF1YWwoKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICcmLWljb24tZW5kJzoge1xuICAgICAgICBmbGV4RGlyZWN0aW9uOiAncm93LXJldmVyc2UnLFxuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1sb2FkaW5nLWljb24tbW90aW9uYF06IHtcbiAgICAgICAgICAnJi1hcHBlYXItc3RhcnQsICYtZW50ZXItc3RhcnQnOiB7XG4gICAgICAgICAgICBtYXJnaW5JbmxpbmVTdGFydDogY2FsYyhtYXJnaW5YUykubXVsKC0xKS5lcXVhbCgpXG4gICAgICAgICAgfSxcbiAgICAgICAgICAnJi1hcHBlYXItYWN0aXZlLCAmLWVudGVyLWFjdGl2ZSc6IHtcbiAgICAgICAgICAgIG1hcmdpbklubGluZVN0YXJ0OiAwXG4gICAgICAgICAgfSxcbiAgICAgICAgICAnJi1sZWF2ZS1zdGFydCc6IHtcbiAgICAgICAgICAgIG1hcmdpbklubGluZVN0YXJ0OiAwXG4gICAgICAgICAgfSxcbiAgICAgICAgICAnJi1sZWF2ZS1hY3RpdmUnOiB7XG4gICAgICAgICAgICBtYXJnaW5JbmxpbmVTdGFydDogY2FsYyhtYXJnaW5YUykubXVsKC0xKS5lcXVhbCgpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbmNvbnN0IGdlbkhvdmVyQWN0aXZlQnV0dG9uU3R5bGUgPSAoYnRuQ2xzLCBob3ZlclN0eWxlLCBhY3RpdmVTdHlsZSkgPT4gKHtcbiAgW2AmOm5vdCg6ZGlzYWJsZWQpOm5vdCgke2J0bkNsc30tZGlzYWJsZWQpYF06IHtcbiAgICAnJjpob3Zlcic6IGhvdmVyU3R5bGUsXG4gICAgJyY6YWN0aXZlJzogYWN0aXZlU3R5bGVcbiAgfVxufSk7XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU2hhcGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuY29uc3QgZ2VuQ2lyY2xlQnV0dG9uU3R5bGUgPSB0b2tlbiA9PiAoe1xuICBtaW5XaWR0aDogdG9rZW4uY29udHJvbEhlaWdodCxcbiAgcGFkZGluZ0lubGluZVN0YXJ0OiAwLFxuICBwYWRkaW5nSW5saW5lRW5kOiAwLFxuICBib3JkZXJSYWRpdXM6ICc1MCUnXG59KTtcbmNvbnN0IGdlblJvdW5kQnV0dG9uU3R5bGUgPSB0b2tlbiA9PiAoe1xuICBib3JkZXJSYWRpdXM6IHRva2VuLmNvbnRyb2xIZWlnaHQsXG4gIHBhZGRpbmdJbmxpbmVTdGFydDogdG9rZW4uY2FsYyh0b2tlbi5jb250cm9sSGVpZ2h0KS5kaXYoMikuZXF1YWwoKSxcbiAgcGFkZGluZ0lubGluZUVuZDogdG9rZW4uY2FsYyh0b2tlbi5jb250cm9sSGVpZ2h0KS5kaXYoMikuZXF1YWwoKVxufSk7XG5jb25zdCBnZW5EaXNhYmxlZFN0eWxlID0gdG9rZW4gPT4gKHtcbiAgY3Vyc29yOiAnbm90LWFsbG93ZWQnLFxuICBib3JkZXJDb2xvcjogdG9rZW4uYm9yZGVyQ29sb3JEaXNhYmxlZCxcbiAgY29sb3I6IHRva2VuLmNvbG9yVGV4dERpc2FibGVkLFxuICBiYWNrZ3JvdW5kOiB0b2tlbi5jb2xvckJnQ29udGFpbmVyRGlzYWJsZWQsXG4gIGJveFNoYWRvdzogJ25vbmUnXG59KTtcbmNvbnN0IGdlbkdob3N0QnV0dG9uU3R5bGUgPSAoYnRuQ2xzLCBiYWNrZ3JvdW5kLCB0ZXh0Q29sb3IsIGJvcmRlckNvbG9yLCB0ZXh0Q29sb3JEaXNhYmxlZCwgYm9yZGVyQ29sb3JEaXNhYmxlZCwgaG92ZXJTdHlsZSwgYWN0aXZlU3R5bGUpID0+ICh7XG4gIFtgJiR7YnRuQ2xzfS1iYWNrZ3JvdW5kLWdob3N0YF06IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7XG4gICAgY29sb3I6IHRleHRDb2xvciB8fCB1bmRlZmluZWQsXG4gICAgYmFja2dyb3VuZCxcbiAgICBib3JkZXJDb2xvcjogYm9yZGVyQ29sb3IgfHwgdW5kZWZpbmVkLFxuICAgIGJveFNoYWRvdzogJ25vbmUnXG4gIH0sIGdlbkhvdmVyQWN0aXZlQnV0dG9uU3R5bGUoYnRuQ2xzLCBPYmplY3QuYXNzaWduKHtcbiAgICBiYWNrZ3JvdW5kXG4gIH0sIGhvdmVyU3R5bGUpLCBPYmplY3QuYXNzaWduKHtcbiAgICBiYWNrZ3JvdW5kXG4gIH0sIGFjdGl2ZVN0eWxlKSkpLCB7XG4gICAgJyY6ZGlzYWJsZWQnOiB7XG4gICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCcsXG4gICAgICBjb2xvcjogdGV4dENvbG9yRGlzYWJsZWQgfHwgdW5kZWZpbmVkLFxuICAgICAgYm9yZGVyQ29sb3I6IGJvcmRlckNvbG9yRGlzYWJsZWQgfHwgdW5kZWZpbmVkXG4gICAgfVxuICB9KVxufSk7XG5jb25zdCBnZW5Tb2xpZERpc2FibGVkQnV0dG9uU3R5bGUgPSB0b2tlbiA9PiAoe1xuICBbYCY6ZGlzYWJsZWQsICYke3Rva2VuLmNvbXBvbmVudENsc30tZGlzYWJsZWRgXTogT2JqZWN0LmFzc2lnbih7fSwgZ2VuRGlzYWJsZWRTdHlsZSh0b2tlbikpXG59KTtcbmNvbnN0IGdlblB1cmVEaXNhYmxlZEJ1dHRvblN0eWxlID0gdG9rZW4gPT4gKHtcbiAgW2AmOmRpc2FibGVkLCAmJHt0b2tlbi5jb21wb25lbnRDbHN9LWRpc2FibGVkYF06IHtcbiAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCcsXG4gICAgY29sb3I6IHRva2VuLmNvbG9yVGV4dERpc2FibGVkXG4gIH1cbn0pO1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFZhcmlhbnQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmNvbnN0IGdlblZhcmlhbnRCdXR0b25TdHlsZSA9ICh0b2tlbiwgaG92ZXJTdHlsZSwgYWN0aXZlU3R5bGUsIHZhcmlhbnQpID0+IHtcbiAgY29uc3QgaXNQdXJlRGlzYWJsZWQgPSB2YXJpYW50ICYmIFsnbGluaycsICd0ZXh0J10uaW5jbHVkZXModmFyaWFudCk7XG4gIGNvbnN0IGdlbkRpc2FibGVkQnV0dG9uU3R5bGUgPSBpc1B1cmVEaXNhYmxlZCA/IGdlblB1cmVEaXNhYmxlZEJ1dHRvblN0eWxlIDogZ2VuU29saWREaXNhYmxlZEJ1dHRvblN0eWxlO1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBnZW5EaXNhYmxlZEJ1dHRvblN0eWxlKHRva2VuKSksIGdlbkhvdmVyQWN0aXZlQnV0dG9uU3R5bGUodG9rZW4uY29tcG9uZW50Q2xzLCBob3ZlclN0eWxlLCBhY3RpdmVTdHlsZSkpO1xufTtcbmNvbnN0IGdlblNvbGlkQnV0dG9uU3R5bGUgPSAodG9rZW4sIHRleHRDb2xvciwgYmFja2dyb3VuZCwgaG92ZXJTdHlsZSwgYWN0aXZlU3R5bGUpID0+ICh7XG4gIFtgJiR7dG9rZW4uY29tcG9uZW50Q2xzfS12YXJpYW50LXNvbGlkYF06IE9iamVjdC5hc3NpZ24oe1xuICAgIGNvbG9yOiB0ZXh0Q29sb3IsXG4gICAgYmFja2dyb3VuZFxuICB9LCBnZW5WYXJpYW50QnV0dG9uU3R5bGUodG9rZW4sIGhvdmVyU3R5bGUsIGFjdGl2ZVN0eWxlKSlcbn0pO1xuY29uc3QgZ2VuT3V0bGluZWREYXNoZWRCdXR0b25TdHlsZSA9ICh0b2tlbiwgYm9yZGVyQ29sb3IsIGJhY2tncm91bmQsIGhvdmVyU3R5bGUsIGFjdGl2ZVN0eWxlKSA9PiAoe1xuICBbYCYke3Rva2VuLmNvbXBvbmVudENsc30tdmFyaWFudC1vdXRsaW5lZCwgJiR7dG9rZW4uY29tcG9uZW50Q2xzfS12YXJpYW50LWRhc2hlZGBdOiBPYmplY3QuYXNzaWduKHtcbiAgICBib3JkZXJDb2xvcixcbiAgICBiYWNrZ3JvdW5kXG4gIH0sIGdlblZhcmlhbnRCdXR0b25TdHlsZSh0b2tlbiwgaG92ZXJTdHlsZSwgYWN0aXZlU3R5bGUpKVxufSk7XG5jb25zdCBnZW5EYXNoZWRCdXR0b25TdHlsZSA9IHRva2VuID0+ICh7XG4gIFtgJiR7dG9rZW4uY29tcG9uZW50Q2xzfS12YXJpYW50LWRhc2hlZGBdOiB7XG4gICAgYm9yZGVyU3R5bGU6ICdkYXNoZWQnXG4gIH1cbn0pO1xuY29uc3QgZ2VuRmlsbGVkQnV0dG9uU3R5bGUgPSAodG9rZW4sIGJhY2tncm91bmQsIGhvdmVyU3R5bGUsIGFjdGl2ZVN0eWxlKSA9PiAoe1xuICBbYCYke3Rva2VuLmNvbXBvbmVudENsc30tdmFyaWFudC1maWxsZWRgXTogT2JqZWN0LmFzc2lnbih7XG4gICAgYm94U2hhZG93OiAnbm9uZScsXG4gICAgYmFja2dyb3VuZFxuICB9LCBnZW5WYXJpYW50QnV0dG9uU3R5bGUodG9rZW4sIGhvdmVyU3R5bGUsIGFjdGl2ZVN0eWxlKSlcbn0pO1xuY29uc3QgZ2VuVGV4dExpbmtCdXR0b25TdHlsZSA9ICh0b2tlbiwgdGV4dENvbG9yLCB2YXJpYW50LCBob3ZlclN0eWxlLCBhY3RpdmVTdHlsZSkgPT4gKHtcbiAgW2AmJHt0b2tlbi5jb21wb25lbnRDbHN9LXZhcmlhbnQtJHt2YXJpYW50fWBdOiBPYmplY3QuYXNzaWduKHtcbiAgICBjb2xvcjogdGV4dENvbG9yLFxuICAgIGJveFNoYWRvdzogJ25vbmUnXG4gIH0sIGdlblZhcmlhbnRCdXR0b25TdHlsZSh0b2tlbiwgaG92ZXJTdHlsZSwgYWN0aXZlU3R5bGUsIHZhcmlhbnQpKVxufSk7XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IENvbG9yID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuY29uc3QgZ2VuUHJlc2V0Q29sb3JTdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENsc1xuICB9ID0gdG9rZW47XG4gIHJldHVybiBQcmVzZXRDb2xvcnMucmVkdWNlKChwcmV2LCBjb2xvcktleSkgPT4ge1xuICAgIGNvbnN0IGRhcmtDb2xvciA9IHRva2VuW2Ake2NvbG9yS2V5fTZgXTtcbiAgICBjb25zdCBsaWdodENvbG9yID0gdG9rZW5bYCR7Y29sb3JLZXl9MWBdO1xuICAgIGNvbnN0IGhvdmVyQ29sb3IgPSB0b2tlbltgJHtjb2xvcktleX01YF07XG4gICAgY29uc3QgbGlnaHRIb3ZlckNvbG9yID0gdG9rZW5bYCR7Y29sb3JLZXl9MmBdO1xuICAgIGNvbnN0IGxpZ2h0Qm9yZGVyQ29sb3IgPSB0b2tlbltgJHtjb2xvcktleX0zYF07XG4gICAgY29uc3QgYWN0aXZlQ29sb3IgPSB0b2tlbltgJHtjb2xvcktleX03YF07XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHtcbiAgICAgIFtgJiR7Y29tcG9uZW50Q2xzfS1jb2xvci0ke2NvbG9yS2V5fWBdOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIGNvbG9yOiBkYXJrQ29sb3IsXG4gICAgICAgIGJveFNoYWRvdzogdG9rZW5bYCR7Y29sb3JLZXl9U2hhZG93Q29sb3JgXVxuICAgICAgfSwgZ2VuU29saWRCdXR0b25TdHlsZSh0b2tlbiwgdG9rZW4uY29sb3JUZXh0TGlnaHRTb2xpZCwgZGFya0NvbG9yLCB7XG4gICAgICAgIGJhY2tncm91bmQ6IGhvdmVyQ29sb3JcbiAgICAgIH0sIHtcbiAgICAgICAgYmFja2dyb3VuZDogYWN0aXZlQ29sb3JcbiAgICAgIH0pKSwgZ2VuT3V0bGluZWREYXNoZWRCdXR0b25TdHlsZSh0b2tlbiwgZGFya0NvbG9yLCB0b2tlbi5jb2xvckJnQ29udGFpbmVyLCB7XG4gICAgICAgIGNvbG9yOiBob3ZlckNvbG9yLFxuICAgICAgICBib3JkZXJDb2xvcjogaG92ZXJDb2xvcixcbiAgICAgICAgYmFja2dyb3VuZDogdG9rZW4uY29sb3JCZ0NvbnRhaW5lclxuICAgICAgfSwge1xuICAgICAgICBjb2xvcjogYWN0aXZlQ29sb3IsXG4gICAgICAgIGJvcmRlckNvbG9yOiBhY3RpdmVDb2xvcixcbiAgICAgICAgYmFja2dyb3VuZDogdG9rZW4uY29sb3JCZ0NvbnRhaW5lclxuICAgICAgfSkpLCBnZW5EYXNoZWRCdXR0b25TdHlsZSh0b2tlbikpLCBnZW5GaWxsZWRCdXR0b25TdHlsZSh0b2tlbiwgbGlnaHRDb2xvciwge1xuICAgICAgICBiYWNrZ3JvdW5kOiBsaWdodEhvdmVyQ29sb3JcbiAgICAgIH0sIHtcbiAgICAgICAgYmFja2dyb3VuZDogbGlnaHRCb3JkZXJDb2xvclxuICAgICAgfSkpLCBnZW5UZXh0TGlua0J1dHRvblN0eWxlKHRva2VuLCBkYXJrQ29sb3IsICdsaW5rJywge1xuICAgICAgICBjb2xvcjogaG92ZXJDb2xvclxuICAgICAgfSwge1xuICAgICAgICBjb2xvcjogYWN0aXZlQ29sb3JcbiAgICAgIH0pKSwgZ2VuVGV4dExpbmtCdXR0b25TdHlsZSh0b2tlbiwgZGFya0NvbG9yLCAndGV4dCcsIHtcbiAgICAgICAgY29sb3I6IGhvdmVyQ29sb3IsXG4gICAgICAgIGJhY2tncm91bmQ6IGxpZ2h0Q29sb3JcbiAgICAgIH0sIHtcbiAgICAgICAgY29sb3I6IGFjdGl2ZUNvbG9yLFxuICAgICAgICBiYWNrZ3JvdW5kOiBsaWdodEJvcmRlckNvbG9yXG4gICAgICB9KSlcbiAgICB9KTtcbiAgfSwge30pO1xufTtcbmNvbnN0IGdlbkRlZmF1bHRCdXR0b25TdHlsZSA9IHRva2VuID0+IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7XG4gIGNvbG9yOiB0b2tlbi5kZWZhdWx0Q29sb3IsXG4gIGJveFNoYWRvdzogdG9rZW4uZGVmYXVsdFNoYWRvd1xufSwgZ2VuU29saWRCdXR0b25TdHlsZSh0b2tlbiwgdG9rZW4uc29saWRUZXh0Q29sb3IsIHRva2VuLmNvbG9yQmdTb2xpZCwge1xuICBjb2xvcjogdG9rZW4uc29saWRUZXh0Q29sb3IsXG4gIGJhY2tncm91bmQ6IHRva2VuLmNvbG9yQmdTb2xpZEhvdmVyXG59LCB7XG4gIGNvbG9yOiB0b2tlbi5zb2xpZFRleHRDb2xvcixcbiAgYmFja2dyb3VuZDogdG9rZW4uY29sb3JCZ1NvbGlkQWN0aXZlXG59KSksIGdlbkRhc2hlZEJ1dHRvblN0eWxlKHRva2VuKSksIGdlbkZpbGxlZEJ1dHRvblN0eWxlKHRva2VuLCB0b2tlbi5jb2xvckZpbGxUZXJ0aWFyeSwge1xuICBiYWNrZ3JvdW5kOiB0b2tlbi5jb2xvckZpbGxTZWNvbmRhcnlcbn0sIHtcbiAgYmFja2dyb3VuZDogdG9rZW4uY29sb3JGaWxsXG59KSksIGdlbkdob3N0QnV0dG9uU3R5bGUodG9rZW4uY29tcG9uZW50Q2xzLCB0b2tlbi5naG9zdEJnLCB0b2tlbi5kZWZhdWx0R2hvc3RDb2xvciwgdG9rZW4uZGVmYXVsdEdob3N0Qm9yZGVyQ29sb3IsIHRva2VuLmNvbG9yVGV4dERpc2FibGVkLCB0b2tlbi5jb2xvckJvcmRlcikpLCBnZW5UZXh0TGlua0J1dHRvblN0eWxlKHRva2VuLCB0b2tlbi50ZXh0VGV4dENvbG9yLCAnbGluaycsIHtcbiAgY29sb3I6IHRva2VuLmNvbG9yTGlua0hvdmVyLFxuICBiYWNrZ3JvdW5kOiB0b2tlbi5saW5rSG92ZXJCZ1xufSwge1xuICBjb2xvcjogdG9rZW4uY29sb3JMaW5rQWN0aXZlXG59KSk7XG5jb25zdCBnZW5QcmltYXJ5QnV0dG9uU3R5bGUgPSB0b2tlbiA9PiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7XG4gIGNvbG9yOiB0b2tlbi5jb2xvclByaW1hcnksXG4gIGJveFNoYWRvdzogdG9rZW4ucHJpbWFyeVNoYWRvd1xufSwgZ2VuT3V0bGluZWREYXNoZWRCdXR0b25TdHlsZSh0b2tlbiwgdG9rZW4uY29sb3JQcmltYXJ5LCB0b2tlbi5jb2xvckJnQ29udGFpbmVyLCB7XG4gIGNvbG9yOiB0b2tlbi5jb2xvclByaW1hcnlUZXh0SG92ZXIsXG4gIGJvcmRlckNvbG9yOiB0b2tlbi5jb2xvclByaW1hcnlIb3ZlcixcbiAgYmFja2dyb3VuZDogdG9rZW4uY29sb3JCZ0NvbnRhaW5lclxufSwge1xuICBjb2xvcjogdG9rZW4uY29sb3JQcmltYXJ5VGV4dEFjdGl2ZSxcbiAgYm9yZGVyQ29sb3I6IHRva2VuLmNvbG9yUHJpbWFyeUFjdGl2ZSxcbiAgYmFja2dyb3VuZDogdG9rZW4uY29sb3JCZ0NvbnRhaW5lclxufSkpLCBnZW5EYXNoZWRCdXR0b25TdHlsZSh0b2tlbikpLCBnZW5GaWxsZWRCdXR0b25TdHlsZSh0b2tlbiwgdG9rZW4uY29sb3JQcmltYXJ5QmcsIHtcbiAgYmFja2dyb3VuZDogdG9rZW4uY29sb3JQcmltYXJ5QmdIb3ZlclxufSwge1xuICBiYWNrZ3JvdW5kOiB0b2tlbi5jb2xvclByaW1hcnlCb3JkZXJcbn0pKSwgZ2VuVGV4dExpbmtCdXR0b25TdHlsZSh0b2tlbiwgdG9rZW4uY29sb3JQcmltYXJ5VGV4dCwgJ3RleHQnLCB7XG4gIGNvbG9yOiB0b2tlbi5jb2xvclByaW1hcnlUZXh0SG92ZXIsXG4gIGJhY2tncm91bmQ6IHRva2VuLmNvbG9yUHJpbWFyeUJnXG59LCB7XG4gIGNvbG9yOiB0b2tlbi5jb2xvclByaW1hcnlUZXh0QWN0aXZlLFxuICBiYWNrZ3JvdW5kOiB0b2tlbi5jb2xvclByaW1hcnlCb3JkZXJcbn0pKSwgZ2VuVGV4dExpbmtCdXR0b25TdHlsZSh0b2tlbiwgdG9rZW4uY29sb3JQcmltYXJ5VGV4dCwgJ2xpbmsnLCB7XG4gIGNvbG9yOiB0b2tlbi5jb2xvclByaW1hcnlUZXh0SG92ZXIsXG4gIGJhY2tncm91bmQ6IHRva2VuLmxpbmtIb3ZlckJnXG59LCB7XG4gIGNvbG9yOiB0b2tlbi5jb2xvclByaW1hcnlUZXh0QWN0aXZlXG59KSksIGdlbkdob3N0QnV0dG9uU3R5bGUodG9rZW4uY29tcG9uZW50Q2xzLCB0b2tlbi5naG9zdEJnLCB0b2tlbi5jb2xvclByaW1hcnksIHRva2VuLmNvbG9yUHJpbWFyeSwgdG9rZW4uY29sb3JUZXh0RGlzYWJsZWQsIHRva2VuLmNvbG9yQm9yZGVyLCB7XG4gIGNvbG9yOiB0b2tlbi5jb2xvclByaW1hcnlIb3ZlcixcbiAgYm9yZGVyQ29sb3I6IHRva2VuLmNvbG9yUHJpbWFyeUhvdmVyXG59LCB7XG4gIGNvbG9yOiB0b2tlbi5jb2xvclByaW1hcnlBY3RpdmUsXG4gIGJvcmRlckNvbG9yOiB0b2tlbi5jb2xvclByaW1hcnlBY3RpdmVcbn0pKTtcbmNvbnN0IGdlbkRhbmdlcm91c1N0eWxlID0gdG9rZW4gPT4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7XG4gIGNvbG9yOiB0b2tlbi5jb2xvckVycm9yLFxuICBib3hTaGFkb3c6IHRva2VuLmRhbmdlclNoYWRvd1xufSwgZ2VuU29saWRCdXR0b25TdHlsZSh0b2tlbiwgdG9rZW4uZGFuZ2VyQ29sb3IsIHRva2VuLmNvbG9yRXJyb3IsIHtcbiAgYmFja2dyb3VuZDogdG9rZW4uY29sb3JFcnJvckhvdmVyXG59LCB7XG4gIGJhY2tncm91bmQ6IHRva2VuLmNvbG9yRXJyb3JBY3RpdmVcbn0pKSwgZ2VuT3V0bGluZWREYXNoZWRCdXR0b25TdHlsZSh0b2tlbiwgdG9rZW4uY29sb3JFcnJvciwgdG9rZW4uY29sb3JCZ0NvbnRhaW5lciwge1xuICBjb2xvcjogdG9rZW4uY29sb3JFcnJvckhvdmVyLFxuICBib3JkZXJDb2xvcjogdG9rZW4uY29sb3JFcnJvckJvcmRlckhvdmVyXG59LCB7XG4gIGNvbG9yOiB0b2tlbi5jb2xvckVycm9yQWN0aXZlLFxuICBib3JkZXJDb2xvcjogdG9rZW4uY29sb3JFcnJvckFjdGl2ZVxufSkpLCBnZW5EYXNoZWRCdXR0b25TdHlsZSh0b2tlbikpLCBnZW5GaWxsZWRCdXR0b25TdHlsZSh0b2tlbiwgdG9rZW4uY29sb3JFcnJvckJnLCB7XG4gIGJhY2tncm91bmQ6IHRva2VuLmNvbG9yRXJyb3JCZ0ZpbGxlZEhvdmVyXG59LCB7XG4gIGJhY2tncm91bmQ6IHRva2VuLmNvbG9yRXJyb3JCZ0FjdGl2ZVxufSkpLCBnZW5UZXh0TGlua0J1dHRvblN0eWxlKHRva2VuLCB0b2tlbi5jb2xvckVycm9yLCAndGV4dCcsIHtcbiAgY29sb3I6IHRva2VuLmNvbG9yRXJyb3JIb3ZlcixcbiAgYmFja2dyb3VuZDogdG9rZW4uY29sb3JFcnJvckJnXG59LCB7XG4gIGNvbG9yOiB0b2tlbi5jb2xvckVycm9ySG92ZXIsXG4gIGJhY2tncm91bmQ6IHRva2VuLmNvbG9yRXJyb3JCZ0FjdGl2ZVxufSkpLCBnZW5UZXh0TGlua0J1dHRvblN0eWxlKHRva2VuLCB0b2tlbi5jb2xvckVycm9yLCAnbGluaycsIHtcbiAgY29sb3I6IHRva2VuLmNvbG9yRXJyb3JIb3ZlclxufSwge1xuICBjb2xvcjogdG9rZW4uY29sb3JFcnJvckFjdGl2ZVxufSkpLCBnZW5HaG9zdEJ1dHRvblN0eWxlKHRva2VuLmNvbXBvbmVudENscywgdG9rZW4uZ2hvc3RCZywgdG9rZW4uY29sb3JFcnJvciwgdG9rZW4uY29sb3JFcnJvciwgdG9rZW4uY29sb3JUZXh0RGlzYWJsZWQsIHRva2VuLmNvbG9yQm9yZGVyLCB7XG4gIGNvbG9yOiB0b2tlbi5jb2xvckVycm9ySG92ZXIsXG4gIGJvcmRlckNvbG9yOiB0b2tlbi5jb2xvckVycm9ySG92ZXJcbn0sIHtcbiAgY29sb3I6IHRva2VuLmNvbG9yRXJyb3JBY3RpdmUsXG4gIGJvcmRlckNvbG9yOiB0b2tlbi5jb2xvckVycm9yQWN0aXZlXG59KSk7XG5jb25zdCBnZW5MaW5rU3R5bGUgPSB0b2tlbiA9PiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGdlblRleHRMaW5rQnV0dG9uU3R5bGUodG9rZW4sIHRva2VuLmNvbG9yTGluaywgJ2xpbmsnLCB7XG4gIGNvbG9yOiB0b2tlbi5jb2xvckxpbmtIb3ZlclxufSwge1xuICBjb2xvcjogdG9rZW4uY29sb3JMaW5rQWN0aXZlXG59KSksIGdlbkdob3N0QnV0dG9uU3R5bGUodG9rZW4uY29tcG9uZW50Q2xzLCB0b2tlbi5naG9zdEJnLCB0b2tlbi5jb2xvckluZm8sIHRva2VuLmNvbG9ySW5mbywgdG9rZW4uY29sb3JUZXh0RGlzYWJsZWQsIHRva2VuLmNvbG9yQm9yZGVyLCB7XG4gIGNvbG9yOiB0b2tlbi5jb2xvckluZm9Ib3ZlcixcbiAgYm9yZGVyQ29sb3I6IHRva2VuLmNvbG9ySW5mb0hvdmVyXG59LCB7XG4gIGNvbG9yOiB0b2tlbi5jb2xvckluZm9BY3RpdmUsXG4gIGJvcmRlckNvbG9yOiB0b2tlbi5jb2xvckluZm9BY3RpdmVcbn0pKTtcbmNvbnN0IGdlbkNvbG9yQnV0dG9uU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHNcbiAgfSA9IHRva2VuO1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7XG4gICAgW2Ake2NvbXBvbmVudENsc30tY29sb3ItZGVmYXVsdGBdOiBnZW5EZWZhdWx0QnV0dG9uU3R5bGUodG9rZW4pLFxuICAgIFtgJHtjb21wb25lbnRDbHN9LWNvbG9yLXByaW1hcnlgXTogZ2VuUHJpbWFyeUJ1dHRvblN0eWxlKHRva2VuKSxcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS1jb2xvci1kYW5nZXJvdXNgXTogZ2VuRGFuZ2Vyb3VzU3R5bGUodG9rZW4pLFxuICAgIFtgJHtjb21wb25lbnRDbHN9LWNvbG9yLWxpbmtgXTogZ2VuTGlua1N0eWxlKHRva2VuKVxuICB9LCBnZW5QcmVzZXRDb2xvclN0eWxlKHRva2VuKSk7XG59O1xuLy8gPT09PT09PT09PT0gQ29tcGF0aWJsZSB3aXRoIHZlcnNpb25zIGVhcmxpZXIgdGhhbiA1LjIxLjAgPT09PT09PT09PT1cbmNvbnN0IGdlbkNvbXBhdGlibGVCdXR0b25TdHlsZSA9IHRva2VuID0+IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGdlbk91dGxpbmVkRGFzaGVkQnV0dG9uU3R5bGUodG9rZW4sIHRva2VuLmRlZmF1bHRCb3JkZXJDb2xvciwgdG9rZW4uZGVmYXVsdEJnLCB7XG4gIGNvbG9yOiB0b2tlbi5kZWZhdWx0SG92ZXJDb2xvcixcbiAgYm9yZGVyQ29sb3I6IHRva2VuLmRlZmF1bHRIb3ZlckJvcmRlckNvbG9yLFxuICBiYWNrZ3JvdW5kOiB0b2tlbi5kZWZhdWx0SG92ZXJCZ1xufSwge1xuICBjb2xvcjogdG9rZW4uZGVmYXVsdEFjdGl2ZUNvbG9yLFxuICBib3JkZXJDb2xvcjogdG9rZW4uZGVmYXVsdEFjdGl2ZUJvcmRlckNvbG9yLFxuICBiYWNrZ3JvdW5kOiB0b2tlbi5kZWZhdWx0QWN0aXZlQmdcbn0pKSwgZ2VuVGV4dExpbmtCdXR0b25TdHlsZSh0b2tlbiwgdG9rZW4udGV4dFRleHRDb2xvciwgJ3RleHQnLCB7XG4gIGNvbG9yOiB0b2tlbi50ZXh0VGV4dEhvdmVyQ29sb3IsXG4gIGJhY2tncm91bmQ6IHRva2VuLnRleHRIb3ZlckJnXG59LCB7XG4gIGNvbG9yOiB0b2tlbi50ZXh0VGV4dEFjdGl2ZUNvbG9yLFxuICBiYWNrZ3JvdW5kOiB0b2tlbi5jb2xvckJnVGV4dEFjdGl2ZVxufSkpLCBnZW5Tb2xpZEJ1dHRvblN0eWxlKHRva2VuLCB0b2tlbi5wcmltYXJ5Q29sb3IsIHRva2VuLmNvbG9yUHJpbWFyeSwge1xuICBiYWNrZ3JvdW5kOiB0b2tlbi5jb2xvclByaW1hcnlIb3ZlcixcbiAgY29sb3I6IHRva2VuLnByaW1hcnlDb2xvclxufSwge1xuICBiYWNrZ3JvdW5kOiB0b2tlbi5jb2xvclByaW1hcnlBY3RpdmUsXG4gIGNvbG9yOiB0b2tlbi5wcmltYXJ5Q29sb3Jcbn0pKSwgZ2VuVGV4dExpbmtCdXR0b25TdHlsZSh0b2tlbiwgdG9rZW4uY29sb3JMaW5rLCAnbGluaycsIHtcbiAgY29sb3I6IHRva2VuLmNvbG9yTGlua0hvdmVyLFxuICBiYWNrZ3JvdW5kOiB0b2tlbi5saW5rSG92ZXJCZ1xufSwge1xuICBjb2xvcjogdG9rZW4uY29sb3JMaW5rQWN0aXZlXG59KSk7XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNpemUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuY29uc3QgZ2VuQnV0dG9uU3R5bGUgPSBmdW5jdGlvbiAodG9rZW4pIHtcbiAgbGV0IHByZWZpeENscyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogJyc7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHMsXG4gICAgY29udHJvbEhlaWdodCxcbiAgICBmb250U2l6ZSxcbiAgICBib3JkZXJSYWRpdXMsXG4gICAgYnV0dG9uUGFkZGluZ0hvcml6b250YWwsXG4gICAgaWNvbkNscyxcbiAgICBidXR0b25QYWRkaW5nVmVydGljYWwsXG4gICAgYnV0dG9uSWNvbk9ubHlGb250U2l6ZVxuICB9ID0gdG9rZW47XG4gIHJldHVybiBbe1xuICAgIFtwcmVmaXhDbHNdOiB7XG4gICAgICBmb250U2l6ZSxcbiAgICAgIGhlaWdodDogY29udHJvbEhlaWdodCxcbiAgICAgIHBhZGRpbmc6IGAke3VuaXQoYnV0dG9uUGFkZGluZ1ZlcnRpY2FsKX0gJHt1bml0KGJ1dHRvblBhZGRpbmdIb3Jpem9udGFsKX1gLFxuICAgICAgYm9yZGVyUmFkaXVzLFxuICAgICAgW2AmJHtjb21wb25lbnRDbHN9LWljb24tb25seWBdOiB7XG4gICAgICAgIHdpZHRoOiBjb250cm9sSGVpZ2h0LFxuICAgICAgICBbaWNvbkNsc106IHtcbiAgICAgICAgICBmb250U2l6ZTogYnV0dG9uSWNvbk9ubHlGb250U2l6ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuICAvLyBTaGFwZSAtIHBhdGNoIHByZWZpeENscyBhZ2FpbiB0byBvdmVycmlkZSBzb2xpZCBib3JkZXIgcmFkaXVzIHN0eWxlXG4gIHtcbiAgICBbYCR7Y29tcG9uZW50Q2xzfSR7Y29tcG9uZW50Q2xzfS1jaXJjbGUke3ByZWZpeENsc31gXTogZ2VuQ2lyY2xlQnV0dG9uU3R5bGUodG9rZW4pXG4gIH0sIHtcbiAgICBbYCR7Y29tcG9uZW50Q2xzfSR7Y29tcG9uZW50Q2xzfS1yb3VuZCR7cHJlZml4Q2xzfWBdOiBnZW5Sb3VuZEJ1dHRvblN0eWxlKHRva2VuKVxuICB9XTtcbn07XG5jb25zdCBnZW5TaXplQmFzZUJ1dHRvblN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCBiYXNlVG9rZW4gPSBtZXJnZVRva2VuKHRva2VuLCB7XG4gICAgZm9udFNpemU6IHRva2VuLmNvbnRlbnRGb250U2l6ZVxuICB9KTtcbiAgcmV0dXJuIGdlbkJ1dHRvblN0eWxlKGJhc2VUb2tlbiwgdG9rZW4uY29tcG9uZW50Q2xzKTtcbn07XG5jb25zdCBnZW5TaXplU21hbGxCdXR0b25TdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qgc21hbGxUb2tlbiA9IG1lcmdlVG9rZW4odG9rZW4sIHtcbiAgICBjb250cm9sSGVpZ2h0OiB0b2tlbi5jb250cm9sSGVpZ2h0U00sXG4gICAgZm9udFNpemU6IHRva2VuLmNvbnRlbnRGb250U2l6ZVNNLFxuICAgIHBhZGRpbmc6IHRva2VuLnBhZGRpbmdYUyxcbiAgICBidXR0b25QYWRkaW5nSG9yaXpvbnRhbDogdG9rZW4ucGFkZGluZ0lubGluZVNNLFxuICAgIGJ1dHRvblBhZGRpbmdWZXJ0aWNhbDogMCxcbiAgICBib3JkZXJSYWRpdXM6IHRva2VuLmJvcmRlclJhZGl1c1NNLFxuICAgIGJ1dHRvbkljb25Pbmx5Rm9udFNpemU6IHRva2VuLm9ubHlJY29uU2l6ZVNNXG4gIH0pO1xuICByZXR1cm4gZ2VuQnV0dG9uU3R5bGUoc21hbGxUb2tlbiwgYCR7dG9rZW4uY29tcG9uZW50Q2xzfS1zbWApO1xufTtcbmNvbnN0IGdlblNpemVMYXJnZUJ1dHRvblN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCBsYXJnZVRva2VuID0gbWVyZ2VUb2tlbih0b2tlbiwge1xuICAgIGNvbnRyb2xIZWlnaHQ6IHRva2VuLmNvbnRyb2xIZWlnaHRMRyxcbiAgICBmb250U2l6ZTogdG9rZW4uY29udGVudEZvbnRTaXplTEcsXG4gICAgYnV0dG9uUGFkZGluZ0hvcml6b250YWw6IHRva2VuLnBhZGRpbmdJbmxpbmVMRyxcbiAgICBidXR0b25QYWRkaW5nVmVydGljYWw6IDAsXG4gICAgYm9yZGVyUmFkaXVzOiB0b2tlbi5ib3JkZXJSYWRpdXNMRyxcbiAgICBidXR0b25JY29uT25seUZvbnRTaXplOiB0b2tlbi5vbmx5SWNvblNpemVMR1xuICB9KTtcbiAgcmV0dXJuIGdlbkJ1dHRvblN0eWxlKGxhcmdlVG9rZW4sIGAke3Rva2VuLmNvbXBvbmVudENsc30tbGdgKTtcbn07XG5jb25zdCBnZW5CbG9ja0J1dHRvblN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzXG4gIH0gPSB0b2tlbjtcbiAgcmV0dXJuIHtcbiAgICBbY29tcG9uZW50Q2xzXToge1xuICAgICAgW2AmJHtjb21wb25lbnRDbHN9LWJsb2NrYF06IHtcbiAgICAgICAgd2lkdGg6ICcxMDAlJ1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRXhwb3J0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuZXhwb3J0IGRlZmF1bHQgZ2VuU3R5bGVIb29rcygnQnV0dG9uJywgdG9rZW4gPT4ge1xuICBjb25zdCBidXR0b25Ub2tlbiA9IHByZXBhcmVUb2tlbih0b2tlbik7XG4gIHJldHVybiBbXG4gIC8vIFNoYXJlZFxuICBnZW5TaGFyZWRCdXR0b25TdHlsZShidXR0b25Ub2tlbiksXG4gIC8vIFNpemVcbiAgZ2VuU2l6ZUJhc2VCdXR0b25TdHlsZShidXR0b25Ub2tlbiksIGdlblNpemVTbWFsbEJ1dHRvblN0eWxlKGJ1dHRvblRva2VuKSwgZ2VuU2l6ZUxhcmdlQnV0dG9uU3R5bGUoYnV0dG9uVG9rZW4pLFxuICAvLyBCbG9ja1xuICBnZW5CbG9ja0J1dHRvblN0eWxlKGJ1dHRvblRva2VuKSxcbiAgLy8gQ29sb3JcbiAgZ2VuQ29sb3JCdXR0b25TdHlsZShidXR0b25Ub2tlbiksXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzUwOTY5XG4gIGdlbkNvbXBhdGlibGVCdXR0b25TdHlsZShidXR0b25Ub2tlbiksXG4gIC8vIEJ1dHRvbiBHcm91cFxuICBnZW5Hcm91cFN0eWxlKGJ1dHRvblRva2VuKV07XG59LCBwcmVwYXJlQ29tcG9uZW50VG9rZW4sIHtcbiAgdW5pdGxlc3M6IHtcbiAgICBmb250V2VpZ2h0OiB0cnVlLFxuICAgIGNvbnRlbnRMaW5lSGVpZ2h0OiB0cnVlLFxuICAgIGNvbnRlbnRMaW5lSGVpZ2h0U006IHRydWUsXG4gICAgY29udGVudExpbmVIZWlnaHRMRzogdHJ1ZVxuICB9XG59KTsiLCAiLy8gaGFuZGxlIGJvcmRlciBjb2xsYXBzZVxuZnVuY3Rpb24gY29tcGFjdEl0ZW1Cb3JkZXIodG9rZW4sIHBhcmVudENscywgb3B0aW9ucykge1xuICBjb25zdCB7XG4gICAgZm9jdXNFbENscyxcbiAgICBmb2N1cyxcbiAgICBib3JkZXJFbENsc1xuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgY2hpbGRDb21iaW5hdG9yID0gYm9yZGVyRWxDbHMgPyAnPiAqJyA6ICcnO1xuICBjb25zdCBob3ZlckVmZmVjdHMgPSBbJ2hvdmVyJywgZm9jdXMgPyAnZm9jdXMnIDogbnVsbCwgJ2FjdGl2ZSddLmZpbHRlcihCb29sZWFuKS5tYXAobiA9PiBgJjoke259ICR7Y2hpbGRDb21iaW5hdG9yfWApLmpvaW4oJywnKTtcbiAgcmV0dXJuIHtcbiAgICBbYCYtaXRlbTpub3QoJHtwYXJlbnRDbHN9LWxhc3QtaXRlbSlgXToge1xuICAgICAgbWFyZ2luSW5saW5lRW5kOiB0b2tlbi5jYWxjKHRva2VuLmxpbmVXaWR0aCkubXVsKC0xKS5lcXVhbCgpXG4gICAgfSxcbiAgICAnJi1pdGVtJzogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHtcbiAgICAgIFtob3ZlckVmZmVjdHNdOiB7XG4gICAgICAgIHpJbmRleDogMlxuICAgICAgfVxuICAgIH0sIGZvY3VzRWxDbHMgPyB7XG4gICAgICBbYCYke2ZvY3VzRWxDbHN9YF06IHtcbiAgICAgICAgekluZGV4OiAyXG4gICAgICB9XG4gICAgfSA6IHt9KSwge1xuICAgICAgW2AmW2Rpc2FibGVkXSAke2NoaWxkQ29tYmluYXRvcn1gXToge1xuICAgICAgICB6SW5kZXg6IDBcbiAgICAgIH1cbiAgICB9KVxuICB9O1xufVxuLy8gaGFuZGxlIGJvcmRlci1yYWRpdXNcbmZ1bmN0aW9uIGNvbXBhY3RJdGVtQm9yZGVyUmFkaXVzKHByZWZpeENscywgcGFyZW50Q2xzLCBvcHRpb25zKSB7XG4gIGNvbnN0IHtcbiAgICBib3JkZXJFbENsc1xuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgY2hpbGRDb21iaW5hdG9yID0gYm9yZGVyRWxDbHMgPyBgPiAke2JvcmRlckVsQ2xzfWAgOiAnJztcbiAgcmV0dXJuIHtcbiAgICBbYCYtaXRlbTpub3QoJHtwYXJlbnRDbHN9LWZpcnN0LWl0ZW0pOm5vdCgke3BhcmVudENsc30tbGFzdC1pdGVtKSAke2NoaWxkQ29tYmluYXRvcn1gXToge1xuICAgICAgYm9yZGVyUmFkaXVzOiAwXG4gICAgfSxcbiAgICBbYCYtaXRlbTpub3QoJHtwYXJlbnRDbHN9LWxhc3QtaXRlbSkke3BhcmVudENsc30tZmlyc3QtaXRlbWBdOiB7XG4gICAgICBbYCYgJHtjaGlsZENvbWJpbmF0b3J9LCAmJHtwcmVmaXhDbHN9LXNtICR7Y2hpbGRDb21iaW5hdG9yfSwgJiR7cHJlZml4Q2xzfS1sZyAke2NoaWxkQ29tYmluYXRvcn1gXToge1xuICAgICAgICBib3JkZXJTdGFydEVuZFJhZGl1czogMCxcbiAgICAgICAgYm9yZGVyRW5kRW5kUmFkaXVzOiAwXG4gICAgICB9XG4gICAgfSxcbiAgICBbYCYtaXRlbTpub3QoJHtwYXJlbnRDbHN9LWZpcnN0LWl0ZW0pJHtwYXJlbnRDbHN9LWxhc3QtaXRlbWBdOiB7XG4gICAgICBbYCYgJHtjaGlsZENvbWJpbmF0b3J9LCAmJHtwcmVmaXhDbHN9LXNtICR7Y2hpbGRDb21iaW5hdG9yfSwgJiR7cHJlZml4Q2xzfS1sZyAke2NoaWxkQ29tYmluYXRvcn1gXToge1xuICAgICAgICBib3JkZXJTdGFydFN0YXJ0UmFkaXVzOiAwLFxuICAgICAgICBib3JkZXJFbmRTdGFydFJhZGl1czogMFxuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZW5Db21wYWN0SXRlbVN0eWxlKHRva2VuKSB7XG4gIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7XG4gICAgZm9jdXM6IHRydWVcbiAgfTtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENsc1xuICB9ID0gdG9rZW47XG4gIGNvbnN0IGNvbXBhY3RDbHMgPSBgJHtjb21wb25lbnRDbHN9LWNvbXBhY3RgO1xuICByZXR1cm4ge1xuICAgIFtjb21wYWN0Q2xzXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjb21wYWN0SXRlbUJvcmRlcih0b2tlbiwgY29tcGFjdENscywgb3B0aW9ucykpLCBjb21wYWN0SXRlbUJvcmRlclJhZGl1cyhjb21wb25lbnRDbHMsIGNvbXBhY3RDbHMsIG9wdGlvbnMpKVxuICB9O1xufSIsICJmdW5jdGlvbiBjb21wYWN0SXRlbVZlcnRpY2FsQm9yZGVyKHRva2VuLCBwYXJlbnRDbHMpIHtcbiAgcmV0dXJuIHtcbiAgICAvLyBib3JkZXIgY29sbGFwc2VcbiAgICBbYCYtaXRlbTpub3QoJHtwYXJlbnRDbHN9LWxhc3QtaXRlbSlgXToge1xuICAgICAgbWFyZ2luQm90dG9tOiB0b2tlbi5jYWxjKHRva2VuLmxpbmVXaWR0aCkubXVsKC0xKS5lcXVhbCgpXG4gICAgfSxcbiAgICAnJi1pdGVtJzoge1xuICAgICAgJyY6aG92ZXIsJjpmb2N1cywmOmFjdGl2ZSc6IHtcbiAgICAgICAgekluZGV4OiAyXG4gICAgICB9LFxuICAgICAgJyZbZGlzYWJsZWRdJzoge1xuICAgICAgICB6SW5kZXg6IDBcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiBjb21wYWN0SXRlbUJvcmRlclZlcnRpY2FsUmFkaXVzKHByZWZpeENscywgcGFyZW50Q2xzKSB7XG4gIHJldHVybiB7XG4gICAgW2AmLWl0ZW06bm90KCR7cGFyZW50Q2xzfS1maXJzdC1pdGVtKTpub3QoJHtwYXJlbnRDbHN9LWxhc3QtaXRlbSlgXToge1xuICAgICAgYm9yZGVyUmFkaXVzOiAwXG4gICAgfSxcbiAgICBbYCYtaXRlbSR7cGFyZW50Q2xzfS1maXJzdC1pdGVtOm5vdCgke3BhcmVudENsc30tbGFzdC1pdGVtKWBdOiB7XG4gICAgICBbYCYsICYke3ByZWZpeENsc30tc20sICYke3ByZWZpeENsc30tbGdgXToge1xuICAgICAgICBib3JkZXJFbmRFbmRSYWRpdXM6IDAsXG4gICAgICAgIGJvcmRlckVuZFN0YXJ0UmFkaXVzOiAwXG4gICAgICB9XG4gICAgfSxcbiAgICBbYCYtaXRlbSR7cGFyZW50Q2xzfS1sYXN0LWl0ZW06bm90KCR7cGFyZW50Q2xzfS1maXJzdC1pdGVtKWBdOiB7XG4gICAgICBbYCYsICYke3ByZWZpeENsc30tc20sICYke3ByZWZpeENsc30tbGdgXToge1xuICAgICAgICBib3JkZXJTdGFydFN0YXJ0UmFkaXVzOiAwLFxuICAgICAgICBib3JkZXJTdGFydEVuZFJhZGl1czogMFxuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZW5Db21wYWN0SXRlbVZlcnRpY2FsU3R5bGUodG9rZW4pIHtcbiAgY29uc3QgY29tcGFjdENscyA9IGAke3Rva2VuLmNvbXBvbmVudENsc30tY29tcGFjdC12ZXJ0aWNhbGA7XG4gIHJldHVybiB7XG4gICAgW2NvbXBhY3RDbHNdOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGNvbXBhY3RJdGVtVmVydGljYWxCb3JkZXIodG9rZW4sIGNvbXBhY3RDbHMpKSwgY29tcGFjdEl0ZW1Cb3JkZXJWZXJ0aWNhbFJhZGl1cyh0b2tlbi5jb21wb25lbnRDbHMsIGNvbXBhY3RDbHMpKVxuICB9O1xufSIsICJpbXBvcnQgeyBnZW5Db21wYWN0SXRlbVN0eWxlIH0gZnJvbSAnLi4vLi4vc3R5bGUvY29tcGFjdC1pdGVtJztcbmltcG9ydCB7IGdlbkNvbXBhY3RJdGVtVmVydGljYWxTdHlsZSB9IGZyb20gJy4uLy4uL3N0eWxlL2NvbXBhY3QtaXRlbS12ZXJ0aWNhbCc7XG5pbXBvcnQgeyBnZW5TdWJTdHlsZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3RoZW1lL2ludGVybmFsJztcbmltcG9ydCB7IHByZXBhcmVDb21wb25lbnRUb2tlbiwgcHJlcGFyZVRva2VuIH0gZnJvbSAnLi90b2tlbic7XG5jb25zdCBnZW5CdXR0b25Db21wYWN0U3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHMsXG4gICAgY29sb3JQcmltYXJ5SG92ZXIsXG4gICAgbGluZVdpZHRoLFxuICAgIGNhbGNcbiAgfSA9IHRva2VuO1xuICBjb25zdCBpbnNldE9mZnNldCA9IGNhbGMobGluZVdpZHRoKS5tdWwoLTEpLmVxdWFsKCk7XG4gIGNvbnN0IGdldENvbXBhY3RCb3JkZXJTdHlsZSA9IHZlcnRpY2FsID0+IHtcbiAgICBjb25zdCBzZWxlY3RvciA9IGAke2NvbXBvbmVudENsc30tY29tcGFjdCR7dmVydGljYWwgPyAnLXZlcnRpY2FsJyA6ICcnfS1pdGVtJHtjb21wb25lbnRDbHN9LXByaW1hcnk6bm90KFtkaXNhYmxlZF0pYDtcbiAgICByZXR1cm4ge1xuICAgICAgW2Ake3NlbGVjdG9yfSArICR7c2VsZWN0b3J9OjpiZWZvcmVgXToge1xuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgdG9wOiB2ZXJ0aWNhbCA/IGluc2V0T2Zmc2V0IDogMCxcbiAgICAgICAgaW5zZXRJbmxpbmVTdGFydDogdmVydGljYWwgPyAwIDogaW5zZXRPZmZzZXQsXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogY29sb3JQcmltYXJ5SG92ZXIsXG4gICAgICAgIGNvbnRlbnQ6ICdcIlwiJyxcbiAgICAgICAgd2lkdGg6IHZlcnRpY2FsID8gJzEwMCUnIDogbGluZVdpZHRoLFxuICAgICAgICBoZWlnaHQ6IHZlcnRpY2FsID8gbGluZVdpZHRoIDogJzEwMCUnXG4gICAgICB9XG4gICAgfTtcbiAgfTtcbiAgLy8gU3BlY2lhbCBzdHlsZXMgZm9yIFByaW1hcnkgQnV0dG9uXG4gIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGdldENvbXBhY3RCb3JkZXJTdHlsZSgpKSwgZ2V0Q29tcGFjdEJvcmRlclN0eWxlKHRydWUpKTtcbn07XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRXhwb3J0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuZXhwb3J0IGRlZmF1bHQgZ2VuU3ViU3R5bGVDb21wb25lbnQoWydCdXR0b24nLCAnY29tcGFjdCddLCB0b2tlbiA9PiB7XG4gIGNvbnN0IGJ1dHRvblRva2VuID0gcHJlcGFyZVRva2VuKHRva2VuKTtcbiAgcmV0dXJuIFtcbiAgLy8gU3BhY2UgQ29tcGFjdFxuICBnZW5Db21wYWN0SXRlbVN0eWxlKGJ1dHRvblRva2VuKSwgZ2VuQ29tcGFjdEl0ZW1WZXJ0aWNhbFN0eWxlKGJ1dHRvblRva2VuKSwgZ2VuQnV0dG9uQ29tcGFjdFN0eWxlKGJ1dHRvblRva2VuKV07XG59LCBwcmVwYXJlQ29tcG9uZW50VG9rZW4pOyIsICJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0IEJ1dHRvbiBmcm9tICcuL2J1dHRvbic7XG5leHBvcnQgKiBmcm9tICcuL2J1dHRvbkhlbHBlcnMnO1xuZXhwb3J0IGRlZmF1bHQgQnV0dG9uOyIsICJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNyZWF0ZVBvcnRhbCB9IGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgY2FuVXNlRG9tIGZyb20gXCJyYy11dGlsL2VzL0RvbS9jYW5Vc2VEb21cIjtcbmltcG9ydCB3YXJuaW5nIGZyb20gXCJyYy11dGlsL2VzL3dhcm5pbmdcIjtcbmltcG9ydCB7IHN1cHBvcnRSZWYsIHVzZUNvbXBvc2VSZWYgfSBmcm9tIFwicmMtdXRpbC9lcy9yZWZcIjtcbmltcG9ydCBPcmRlckNvbnRleHQgZnJvbSBcIi4vQ29udGV4dFwiO1xuaW1wb3J0IHVzZURvbSBmcm9tIFwiLi91c2VEb21cIjtcbmltcG9ydCB1c2VTY3JvbGxMb2NrZXIgZnJvbSBcIi4vdXNlU2Nyb2xsTG9ja2VyXCI7XG5pbXBvcnQgeyBpbmxpbmVNb2NrIH0gZnJvbSBcIi4vbW9ja1wiO1xudmFyIGdldFBvcnRhbENvbnRhaW5lciA9IGZ1bmN0aW9uIGdldFBvcnRhbENvbnRhaW5lcihnZXRDb250YWluZXIpIHtcbiAgaWYgKGdldENvbnRhaW5lciA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKCFjYW5Vc2VEb20oKSB8fCAhZ2V0Q29udGFpbmVyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKHR5cGVvZiBnZXRDb250YWluZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZ2V0Q29udGFpbmVyKTtcbiAgfVxuICBpZiAodHlwZW9mIGdldENvbnRhaW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBnZXRDb250YWluZXIoKTtcbiAgfVxuICByZXR1cm4gZ2V0Q29udGFpbmVyO1xufTtcbnZhciBQb3J0YWwgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICB2YXIgb3BlbiA9IHByb3BzLm9wZW4sXG4gICAgYXV0b0xvY2sgPSBwcm9wcy5hdXRvTG9jayxcbiAgICBnZXRDb250YWluZXIgPSBwcm9wcy5nZXRDb250YWluZXIsXG4gICAgZGVidWcgPSBwcm9wcy5kZWJ1ZyxcbiAgICBfcHJvcHMkYXV0b0Rlc3Ryb3kgPSBwcm9wcy5hdXRvRGVzdHJveSxcbiAgICBhdXRvRGVzdHJveSA9IF9wcm9wcyRhdXRvRGVzdHJveSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyRhdXRvRGVzdHJveSxcbiAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUob3BlbiksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgc2hvdWxkUmVuZGVyID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXRTaG91bGRSZW5kZXIgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICB2YXIgbWVyZ2VkUmVuZGVyID0gc2hvdWxkUmVuZGVyIHx8IG9wZW47XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBXYXJuaW5nID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB3YXJuaW5nKGNhblVzZURvbSgpIHx8ICFvcGVuLCBcIlBvcnRhbCBvbmx5IHdvcmsgaW4gY2xpZW50IHNpZGUuIFBsZWFzZSBjYWxsICd1c2VFZmZlY3QnIHRvIHNob3cgUG9ydGFsIGluc3RlYWQgZGVmYXVsdCByZW5kZXIgaW4gU1NSLlwiKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT0gU2hvdWxkIFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGF1dG9EZXN0cm95IHx8IG9wZW4pIHtcbiAgICAgIHNldFNob3VsZFJlbmRlcihvcGVuKTtcbiAgICB9XG4gIH0sIFtvcGVuLCBhdXRvRGVzdHJveV0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBDb250YWluZXIgPT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUzID0gUmVhY3QudXNlU3RhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGdldFBvcnRhbENvbnRhaW5lcihnZXRDb250YWluZXIpO1xuICAgIH0pLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUzLCAyKSxcbiAgICBpbm5lckNvbnRhaW5lciA9IF9SZWFjdCR1c2VTdGF0ZTRbMF0sXG4gICAgc2V0SW5uZXJDb250YWluZXIgPSBfUmVhY3QkdXNlU3RhdGU0WzFdO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBjdXN0b21pemVDb250YWluZXIgPSBnZXRQb3J0YWxDb250YWluZXIoZ2V0Q29udGFpbmVyKTtcblxuICAgIC8vIFRlbGwgY29tcG9uZW50IHRoYXQgd2UgY2hlY2sgdGhpcyBpbiBlZmZlY3Qgd2hpY2ggaXMgc2FmZSB0byBiZSBgbnVsbGBcbiAgICBzZXRJbm5lckNvbnRhaW5lcihjdXN0b21pemVDb250YWluZXIgIT09IG51bGwgJiYgY3VzdG9taXplQ29udGFpbmVyICE9PSB2b2lkIDAgPyBjdXN0b21pemVDb250YWluZXIgOiBudWxsKTtcbiAgfSk7XG4gIHZhciBfdXNlRG9tID0gdXNlRG9tKG1lcmdlZFJlbmRlciAmJiAhaW5uZXJDb250YWluZXIsIGRlYnVnKSxcbiAgICBfdXNlRG9tMiA9IF9zbGljZWRUb0FycmF5KF91c2VEb20sIDIpLFxuICAgIGRlZmF1bHRDb250YWluZXIgPSBfdXNlRG9tMlswXSxcbiAgICBxdWV1ZUNyZWF0ZSA9IF91c2VEb20yWzFdO1xuICB2YXIgbWVyZ2VkQ29udGFpbmVyID0gaW5uZXJDb250YWluZXIgIT09IG51bGwgJiYgaW5uZXJDb250YWluZXIgIT09IHZvaWQgMCA/IGlubmVyQ29udGFpbmVyIDogZGVmYXVsdENvbnRhaW5lcjtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IExvY2tlciA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB1c2VTY3JvbGxMb2NrZXIoYXV0b0xvY2sgJiYgb3BlbiAmJiBjYW5Vc2VEb20oKSAmJiAobWVyZ2VkQ29udGFpbmVyID09PSBkZWZhdWx0Q29udGFpbmVyIHx8IG1lcmdlZENvbnRhaW5lciA9PT0gZG9jdW1lbnQuYm9keSkpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZWYgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBjaGlsZFJlZiA9IG51bGw7XG4gIGlmIChjaGlsZHJlbiAmJiBzdXBwb3J0UmVmKGNoaWxkcmVuKSAmJiByZWYpIHtcbiAgICB2YXIgX3JlZiA9IGNoaWxkcmVuO1xuICAgIGNoaWxkUmVmID0gX3JlZi5yZWY7XG4gIH1cbiAgdmFyIG1lcmdlZFJlZiA9IHVzZUNvbXBvc2VSZWYoY2hpbGRSZWYsIHJlZik7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRG8gbm90IHJlbmRlciB3aGVuIG5vdGhpbmcgbmVlZCByZW5kZXJcbiAgLy8gV2hlbiBpbm5lckNvbnRhaW5lciBpcyBgdW5kZWZpbmVkYCwgaXQgbWF5IG5vdCByZWFkeSBzaW5jZSB1c2VyIHVzZSByZWYgaW4gdGhlIHNhbWUgcmVuZGVyXG4gIGlmICghbWVyZ2VkUmVuZGVyIHx8ICFjYW5Vc2VEb20oKSB8fCBpbm5lckNvbnRhaW5lciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBSZW5kZXIgaW5saW5lXG4gIHZhciByZW5kZXJJbmxpbmUgPSBtZXJnZWRDb250YWluZXIgPT09IGZhbHNlIHx8IGlubGluZU1vY2soKTtcbiAgdmFyIHJlZmZlZENoaWxkcmVuID0gY2hpbGRyZW47XG4gIGlmIChyZWYpIHtcbiAgICByZWZmZWRDaGlsZHJlbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGRyZW4sIHtcbiAgICAgIHJlZjogbWVyZ2VkUmVmXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE9yZGVyQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBxdWV1ZUNyZWF0ZVxuICB9LCByZW5kZXJJbmxpbmUgPyByZWZmZWRDaGlsZHJlbiA6IC8qI19fUFVSRV9fKi9jcmVhdGVQb3J0YWwocmVmZmVkQ2hpbGRyZW4sIG1lcmdlZENvbnRhaW5lcikpO1xufSk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBQb3J0YWwuZGlzcGxheU5hbWUgPSAnUG9ydGFsJztcbn1cbmV4cG9ydCBkZWZhdWx0IFBvcnRhbDsiLCAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xudmFyIE9yZGVyQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuZXhwb3J0IGRlZmF1bHQgT3JkZXJDb250ZXh0OyIsICJpbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlTGF5b3V0RWZmZWN0IGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZUxheW91dEVmZmVjdFwiO1xuaW1wb3J0IGNhblVzZURvbSBmcm9tIFwicmMtdXRpbC9lcy9Eb20vY2FuVXNlRG9tXCI7XG5pbXBvcnQgT3JkZXJDb250ZXh0IGZyb20gXCIuL0NvbnRleHRcIjtcbnZhciBFTVBUWV9MSVNUID0gW107XG5cbi8qKlxuICogV2lsbCBhZGQgYGRpdmAgdG8gZG9jdW1lbnQuIE5lc3QgY2FsbCB3aWxsIGtlZXAgb3JkZXJcbiAqIEBwYXJhbSByZW5kZXIgUmVuZGVyIERPTSBpbiBkb2N1bWVudFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VEb20ocmVuZGVyLCBkZWJ1Zykge1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFjYW5Vc2VEb20oKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHZhciBkZWZhdWx0RWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBkZWJ1Zykge1xuICAgICAgICBkZWZhdWx0RWxlLnNldEF0dHJpYnV0ZSgnZGF0YS1kZWJ1ZycsIGRlYnVnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZWZhdWx0RWxlO1xuICAgIH0pLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDEpLFxuICAgIGVsZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMF07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gT3JkZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGFwcGVuZGVkUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgdmFyIHF1ZXVlQ3JlYXRlID0gUmVhY3QudXNlQ29udGV4dChPcmRlckNvbnRleHQpO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlMyA9IFJlYWN0LnVzZVN0YXRlKEVNUFRZX0xJU1QpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUzLCAyKSxcbiAgICBxdWV1ZSA9IF9SZWFjdCR1c2VTdGF0ZTRbMF0sXG4gICAgc2V0UXVldWUgPSBfUmVhY3QkdXNlU3RhdGU0WzFdO1xuICB2YXIgbWVyZ2VkUXVldWVDcmVhdGUgPSBxdWV1ZUNyZWF0ZSB8fCAoYXBwZW5kZWRSZWYuY3VycmVudCA/IHVuZGVmaW5lZCA6IGZ1bmN0aW9uIChhcHBlbmRGbikge1xuICAgIHNldFF1ZXVlKGZ1bmN0aW9uIChvcmlnaW4pIHtcbiAgICAgIHZhciBuZXdRdWV1ZSA9IFthcHBlbmRGbl0uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShvcmlnaW4pKTtcbiAgICAgIHJldHVybiBuZXdRdWV1ZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IERPTSA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgZnVuY3Rpb24gYXBwZW5kKCkge1xuICAgIGlmICghZWxlLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZWxlKTtcbiAgICB9XG4gICAgYXBwZW5kZWRSZWYuY3VycmVudCA9IHRydWU7XG4gIH1cbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICB2YXIgX2VsZSRwYXJlbnRFbGVtZW50O1xuICAgIChfZWxlJHBhcmVudEVsZW1lbnQgPSBlbGUucGFyZW50RWxlbWVudCkgPT09IG51bGwgfHwgX2VsZSRwYXJlbnRFbGVtZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZWxlJHBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoZWxlKTtcbiAgICBhcHBlbmRlZFJlZi5jdXJyZW50ID0gZmFsc2U7XG4gIH1cbiAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocmVuZGVyKSB7XG4gICAgICBpZiAocXVldWVDcmVhdGUpIHtcbiAgICAgICAgcXVldWVDcmVhdGUoYXBwZW5kKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFwcGVuZCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjbGVhbnVwKCk7XG4gICAgfVxuICAgIHJldHVybiBjbGVhbnVwO1xuICB9LCBbcmVuZGVyXSk7XG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgcXVldWUuZm9yRWFjaChmdW5jdGlvbiAoYXBwZW5kRm4pIHtcbiAgICAgICAgcmV0dXJuIGFwcGVuZEZuKCk7XG4gICAgICB9KTtcbiAgICAgIHNldFF1ZXVlKEVNUFRZX0xJU1QpO1xuICAgIH1cbiAgfSwgW3F1ZXVlXSk7XG4gIHJldHVybiBbZWxlLCBtZXJnZWRRdWV1ZUNyZWF0ZV07XG59IiwgImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXBkYXRlQ1NTLCByZW1vdmVDU1MgfSBmcm9tIFwicmMtdXRpbC9lcy9Eb20vZHluYW1pY0NTU1wiO1xuaW1wb3J0IHVzZUxheW91dEVmZmVjdCBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VMYXlvdXRFZmZlY3RcIjtcbmltcG9ydCB7IGdldFRhcmdldFNjcm9sbEJhclNpemUgfSBmcm9tIFwicmMtdXRpbC9lcy9nZXRTY3JvbGxCYXJTaXplXCI7XG5pbXBvcnQgeyBpc0JvZHlPdmVyZmxvd2luZyB9IGZyb20gXCIuL3V0aWxcIjtcbnZhciBVTklRVUVfSUQgPSBcInJjLXV0aWwtbG9ja2VyLVwiLmNvbmNhdChEYXRlLm5vdygpKTtcbnZhciB1dWlkID0gMDtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVNjcm9sbExvY2tlcihsb2NrKSB7XG4gIHZhciBtZXJnZWRMb2NrID0gISFsb2NrO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgdXVpZCArPSAxO1xuICAgICAgcmV0dXJuIFwiXCIuY29uY2F0KFVOSVFVRV9JRCwgXCJfXCIpLmNvbmNhdCh1dWlkKTtcbiAgICB9KSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAxKSxcbiAgICBpZCA9IF9SZWFjdCR1c2VTdGF0ZTJbMF07XG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKG1lcmdlZExvY2spIHtcbiAgICAgIHZhciBzY3JvbGxiYXJTaXplID0gZ2V0VGFyZ2V0U2Nyb2xsQmFyU2l6ZShkb2N1bWVudC5ib2R5KS53aWR0aDtcbiAgICAgIHZhciBpc092ZXJmbG93ID0gaXNCb2R5T3ZlcmZsb3dpbmcoKTtcbiAgICAgIHVwZGF0ZUNTUyhcIlxcbmh0bWwgYm9keSB7XFxuICBvdmVyZmxvdy15OiBoaWRkZW47XFxuICBcIi5jb25jYXQoaXNPdmVyZmxvdyA/IFwid2lkdGg6IGNhbGMoMTAwJSAtIFwiLmNvbmNhdChzY3JvbGxiYXJTaXplLCBcInB4KTtcIikgOiAnJywgXCJcXG59XCIpLCBpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlbW92ZUNTUyhpZCk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZW1vdmVDU1MoaWQpO1xuICAgIH07XG4gIH0sIFttZXJnZWRMb2NrLCBpZF0pO1xufSIsICIvKiBlc2xpbnQtZGlzYWJsZSBuby1wYXJhbS1yZWFzc2lnbiAqL1xuaW1wb3J0IHsgcmVtb3ZlQ1NTLCB1cGRhdGVDU1MgfSBmcm9tIFwiLi9Eb20vZHluYW1pY0NTU1wiO1xudmFyIGNhY2hlZDtcbmZ1bmN0aW9uIG1lYXN1cmVTY3JvbGxiYXJTaXplKGVsZSkge1xuICB2YXIgcmFuZG9tSWQgPSBcInJjLXNjcm9sbGJhci1tZWFzdXJlLVwiLmNvbmNhdChNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoNykpO1xuICB2YXIgbWVhc3VyZUVsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBtZWFzdXJlRWxlLmlkID0gcmFuZG9tSWQ7XG5cbiAgLy8gQ3JlYXRlIFN0eWxlXG4gIHZhciBtZWFzdXJlU3R5bGUgPSBtZWFzdXJlRWxlLnN0eWxlO1xuICBtZWFzdXJlU3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICBtZWFzdXJlU3R5bGUubGVmdCA9ICcwJztcbiAgbWVhc3VyZVN0eWxlLnRvcCA9ICcwJztcbiAgbWVhc3VyZVN0eWxlLndpZHRoID0gJzEwMHB4JztcbiAgbWVhc3VyZVN0eWxlLmhlaWdodCA9ICcxMDBweCc7XG4gIG1lYXN1cmVTdHlsZS5vdmVyZmxvdyA9ICdzY3JvbGwnO1xuXG4gIC8vIENsb25lIFN0eWxlIGlmIG5lZWRlZFxuICB2YXIgZmFsbGJhY2tXaWR0aDtcbiAgdmFyIGZhbGxiYWNrSGVpZ2h0O1xuICBpZiAoZWxlKSB7XG4gICAgdmFyIHRhcmdldFN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGUpO1xuICAgIG1lYXN1cmVTdHlsZS5zY3JvbGxiYXJDb2xvciA9IHRhcmdldFN0eWxlLnNjcm9sbGJhckNvbG9yO1xuICAgIG1lYXN1cmVTdHlsZS5zY3JvbGxiYXJXaWR0aCA9IHRhcmdldFN0eWxlLnNjcm9sbGJhcldpZHRoO1xuXG4gICAgLy8gU2V0IFdlYmtpdCBzdHlsZVxuICAgIHZhciB3ZWJraXRTY3JvbGxiYXJTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoZWxlLCAnOjotd2Via2l0LXNjcm9sbGJhcicpO1xuICAgIHZhciB3aWR0aCA9IHBhcnNlSW50KHdlYmtpdFNjcm9sbGJhclN0eWxlLndpZHRoLCAxMCk7XG4gICAgdmFyIGhlaWdodCA9IHBhcnNlSW50KHdlYmtpdFNjcm9sbGJhclN0eWxlLmhlaWdodCwgMTApO1xuXG4gICAgLy8gVHJ5IHdyYXAgdG8gaGFuZGxlIENTUCBjYXNlXG4gICAgdHJ5IHtcbiAgICAgIHZhciB3aWR0aFN0eWxlID0gd2lkdGggPyBcIndpZHRoOiBcIi5jb25jYXQod2Via2l0U2Nyb2xsYmFyU3R5bGUud2lkdGgsIFwiO1wiKSA6ICcnO1xuICAgICAgdmFyIGhlaWdodFN0eWxlID0gaGVpZ2h0ID8gXCJoZWlnaHQ6IFwiLmNvbmNhdCh3ZWJraXRTY3JvbGxiYXJTdHlsZS5oZWlnaHQsIFwiO1wiKSA6ICcnO1xuICAgICAgdXBkYXRlQ1NTKFwiXFxuI1wiLmNvbmNhdChyYW5kb21JZCwgXCI6Oi13ZWJraXQtc2Nyb2xsYmFyIHtcXG5cIikuY29uY2F0KHdpZHRoU3R5bGUsIFwiXFxuXCIpLmNvbmNhdChoZWlnaHRTdHlsZSwgXCJcXG59XCIpLCByYW5kb21JZCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gQ2FuJ3Qgd3JhcCwganVzdCBsb2cgZXJyb3JcbiAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG5cbiAgICAgIC8vIEdldCBmcm9tIHN0eWxlIGRpcmVjdGx5XG4gICAgICBmYWxsYmFja1dpZHRoID0gd2lkdGg7XG4gICAgICBmYWxsYmFja0hlaWdodCA9IGhlaWdodDtcbiAgICB9XG4gIH1cbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChtZWFzdXJlRWxlKTtcblxuICAvLyBNZWFzdXJlLiBHZXQgZmFsbGJhY2sgc3R5bGUgaWYgcHJvdmlkZWRcbiAgdmFyIHNjcm9sbFdpZHRoID0gZWxlICYmIGZhbGxiYWNrV2lkdGggJiYgIWlzTmFOKGZhbGxiYWNrV2lkdGgpID8gZmFsbGJhY2tXaWR0aCA6IG1lYXN1cmVFbGUub2Zmc2V0V2lkdGggLSBtZWFzdXJlRWxlLmNsaWVudFdpZHRoO1xuICB2YXIgc2Nyb2xsSGVpZ2h0ID0gZWxlICYmIGZhbGxiYWNrSGVpZ2h0ICYmICFpc05hTihmYWxsYmFja0hlaWdodCkgPyBmYWxsYmFja0hlaWdodCA6IG1lYXN1cmVFbGUub2Zmc2V0SGVpZ2h0IC0gbWVhc3VyZUVsZS5jbGllbnRIZWlnaHQ7XG5cbiAgLy8gQ2xlYW4gdXBcbiAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChtZWFzdXJlRWxlKTtcbiAgcmVtb3ZlQ1NTKHJhbmRvbUlkKTtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogc2Nyb2xsV2lkdGgsXG4gICAgaGVpZ2h0OiBzY3JvbGxIZWlnaHRcbiAgfTtcbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFNjcm9sbEJhclNpemUoZnJlc2gpIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBpZiAoZnJlc2ggfHwgY2FjaGVkID09PSB1bmRlZmluZWQpIHtcbiAgICBjYWNoZWQgPSBtZWFzdXJlU2Nyb2xsYmFyU2l6ZSgpO1xuICB9XG4gIHJldHVybiBjYWNoZWQud2lkdGg7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFyZ2V0U2Nyb2xsQmFyU2l6ZSh0YXJnZXQpIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcgfHwgIXRhcmdldCB8fCAhKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdpZHRoOiAwLFxuICAgICAgaGVpZ2h0OiAwXG4gICAgfTtcbiAgfVxuICByZXR1cm4gbWVhc3VyZVNjcm9sbGJhclNpemUodGFyZ2V0KTtcbn0iLCAiLyoqXG4gKiBUZXN0IHVzYWdlIGV4cG9ydC4gRG8gbm90IHVzZSBpbiB5b3VyIHByb2R1Y3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQm9keU92ZXJmbG93aW5nKCkge1xuICByZXR1cm4gZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQgPiAod2luZG93LmlubmVySGVpZ2h0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpICYmIHdpbmRvdy5pbm5lcldpZHRoID4gZG9jdW1lbnQuYm9keS5vZmZzZXRXaWR0aDtcbn0iLCAiZXhwb3J0IHZhciBpbmxpbmUgPSBmYWxzZTtcbmV4cG9ydCBmdW5jdGlvbiBpbmxpbmVNb2NrKG5leHRJbmxpbmUpIHtcbiAgaWYgKHR5cGVvZiBuZXh0SW5saW5lID09PSAnYm9vbGVhbicpIHtcbiAgICBpbmxpbmUgPSBuZXh0SW5saW5lO1xuICB9XG4gIHJldHVybiBpbmxpbmU7XG59IiwgImltcG9ydCBQb3J0YWwgZnJvbSBcIi4vUG9ydGFsXCI7XG5pbXBvcnQgeyBpbmxpbmVNb2NrIH0gZnJvbSBcIi4vbW9ja1wiO1xuZXhwb3J0IHsgaW5saW5lTW9jayB9O1xuZXhwb3J0IGRlZmF1bHQgUG9ydGFsOyIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IFBvcnRhbCBmcm9tICdAcmMtY29tcG9uZW50L3BvcnRhbCc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBSZWZDb250ZXh0IH0gZnJvbSBcIi4vY29udGV4dFwiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwiLi9EaWFsb2dcIjtcbi8vIGZpeCBpc3N1ZSAjMTA2NTZcbi8qXG4gKiBnZXRDb250YWluZXIgcmVtYXJrc1xuICogQ3VzdG9tIGNvbnRhaW5lciBzaG91bGQgbm90IGJlIHJldHVybiwgYmVjYXVzZSBpbiB0aGUgUG9ydGFsIGNvbXBvbmVudCwgaXQgd2lsbCByZW1vdmUgdGhlXG4gKiByZXR1cm4gY29udGFpbmVyIGVsZW1lbnQgaGVyZSwgaWYgdGhlIGN1c3RvbSBjb250YWluZXIgaXMgdGhlIG9ubHkgY2hpbGQgb2YgaXQncyBjb21wb25lbnQsXG4gKiBsaWtlIGlzc3VlICMxMDY1NiwgSXQgd2lsbCBoYXMgYSBjb25mbGljdCB3aXRoIHJlbW92ZUNoaWxkIG1ldGhvZCBpbiByZWFjdC1kb20uXG4gKiBTbyBoZXJlIHNob3VsZCBhZGQgYSBjaGlsZCAoZGl2IGVsZW1lbnQpIHRvIGN1c3RvbSBjb250YWluZXIuXG4gKiAqL1xuXG52YXIgRGlhbG9nV3JhcCA9IGZ1bmN0aW9uIERpYWxvZ1dyYXAocHJvcHMpIHtcbiAgdmFyIHZpc2libGUgPSBwcm9wcy52aXNpYmxlLFxuICAgIGdldENvbnRhaW5lciA9IHByb3BzLmdldENvbnRhaW5lcixcbiAgICBmb3JjZVJlbmRlciA9IHByb3BzLmZvcmNlUmVuZGVyLFxuICAgIF9wcm9wcyRkZXN0cm95T25DbG9zZSA9IHByb3BzLmRlc3Ryb3lPbkNsb3NlLFxuICAgIGRlc3Ryb3lPbkNsb3NlID0gX3Byb3BzJGRlc3Ryb3lPbkNsb3NlID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRkZXN0cm95T25DbG9zZSxcbiAgICBfYWZ0ZXJDbG9zZSA9IHByb3BzLmFmdGVyQ2xvc2UsXG4gICAgcGFuZWxSZWYgPSBwcm9wcy5wYW5lbFJlZjtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKHZpc2libGUpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIGFuaW1hdGVkVmlzaWJsZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0QW5pbWF0ZWRWaXNpYmxlID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIHJlZkNvbnRleHQgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFuZWw6IHBhbmVsUmVmXG4gICAgfTtcbiAgfSwgW3BhbmVsUmVmXSk7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHZpc2libGUpIHtcbiAgICAgIHNldEFuaW1hdGVkVmlzaWJsZSh0cnVlKTtcbiAgICB9XG4gIH0sIFt2aXNpYmxlXSk7XG5cbiAgLy8gRGVzdHJveSBvbiBjbG9zZSB3aWxsIHJlbW92ZSB3cmFwcGVkIGRpdlxuICBpZiAoIWZvcmNlUmVuZGVyICYmIGRlc3Ryb3lPbkNsb3NlICYmICFhbmltYXRlZFZpc2libGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVmQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiByZWZDb250ZXh0XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBvcnRhbCwge1xuICAgIG9wZW46IHZpc2libGUgfHwgZm9yY2VSZW5kZXIgfHwgYW5pbWF0ZWRWaXNpYmxlLFxuICAgIGF1dG9EZXN0cm95OiBmYWxzZSxcbiAgICBnZXRDb250YWluZXI6IGdldENvbnRhaW5lcixcbiAgICBhdXRvTG9jazogdmlzaWJsZSB8fCBhbmltYXRlZFZpc2libGVcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRGlhbG9nLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICBkZXN0cm95T25DbG9zZTogZGVzdHJveU9uQ2xvc2UsXG4gICAgYWZ0ZXJDbG9zZTogZnVuY3Rpb24gYWZ0ZXJDbG9zZSgpIHtcbiAgICAgIF9hZnRlckNsb3NlID09PSBudWxsIHx8IF9hZnRlckNsb3NlID09PSB2b2lkIDAgfHwgX2FmdGVyQ2xvc2UoKTtcbiAgICAgIHNldEFuaW1hdGVkVmlzaWJsZShmYWxzZSk7XG4gICAgfVxuICB9KSkpKTtcbn07XG5EaWFsb2dXcmFwLmRpc3BsYXlOYW1lID0gJ0RpYWxvZyc7XG5leHBvcnQgZGVmYXVsdCBEaWFsb2dXcmFwOyIsICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5leHBvcnQgdmFyIFJlZkNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh7fSk7IiwgImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgY29udGFpbnMgZnJvbSBcInJjLXV0aWwvZXMvRG9tL2NvbnRhaW5zXCI7XG5pbXBvcnQgdXNlSWQgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlSWRcIjtcbmltcG9ydCBLZXlDb2RlIGZyb20gXCJyYy11dGlsL2VzL0tleUNvZGVcIjtcbmltcG9ydCBwaWNrQXR0cnMgZnJvbSBcInJjLXV0aWwvZXMvcGlja0F0dHJzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGdldE1vdGlvbk5hbWUgfSBmcm9tIFwiLi4vdXRpbFwiO1xuaW1wb3J0IENvbnRlbnQgZnJvbSBcIi4vQ29udGVudFwiO1xuaW1wb3J0IE1hc2sgZnJvbSBcIi4vTWFza1wiO1xuaW1wb3J0IHsgd2FybmluZyB9IGZyb20gXCJyYy11dGlsL2VzL3dhcm5pbmdcIjtcbnZhciBEaWFsb2cgPSBmdW5jdGlvbiBEaWFsb2cocHJvcHMpIHtcbiAgdmFyIF9wcm9wcyRwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgcHJlZml4Q2xzID0gX3Byb3BzJHByZWZpeENscyA9PT0gdm9pZCAwID8gJ3JjLWRpYWxvZycgOiBfcHJvcHMkcHJlZml4Q2xzLFxuICAgIHpJbmRleCA9IHByb3BzLnpJbmRleCxcbiAgICBfcHJvcHMkdmlzaWJsZSA9IHByb3BzLnZpc2libGUsXG4gICAgdmlzaWJsZSA9IF9wcm9wcyR2aXNpYmxlID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyR2aXNpYmxlLFxuICAgIF9wcm9wcyRrZXlib2FyZCA9IHByb3BzLmtleWJvYXJkLFxuICAgIGtleWJvYXJkID0gX3Byb3BzJGtleWJvYXJkID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJGtleWJvYXJkLFxuICAgIF9wcm9wcyRmb2N1c1RyaWdnZXJBZiA9IHByb3BzLmZvY3VzVHJpZ2dlckFmdGVyQ2xvc2UsXG4gICAgZm9jdXNUcmlnZ2VyQWZ0ZXJDbG9zZSA9IF9wcm9wcyRmb2N1c1RyaWdnZXJBZiA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyRmb2N1c1RyaWdnZXJBZixcbiAgICB3cmFwU3R5bGUgPSBwcm9wcy53cmFwU3R5bGUsXG4gICAgd3JhcENsYXNzTmFtZSA9IHByb3BzLndyYXBDbGFzc05hbWUsXG4gICAgd3JhcFByb3BzID0gcHJvcHMud3JhcFByb3BzLFxuICAgIG9uQ2xvc2UgPSBwcm9wcy5vbkNsb3NlLFxuICAgIGFmdGVyT3BlbkNoYW5nZSA9IHByb3BzLmFmdGVyT3BlbkNoYW5nZSxcbiAgICBhZnRlckNsb3NlID0gcHJvcHMuYWZ0ZXJDbG9zZSxcbiAgICB0cmFuc2l0aW9uTmFtZSA9IHByb3BzLnRyYW5zaXRpb25OYW1lLFxuICAgIGFuaW1hdGlvbiA9IHByb3BzLmFuaW1hdGlvbixcbiAgICBfcHJvcHMkY2xvc2FibGUgPSBwcm9wcy5jbG9zYWJsZSxcbiAgICBjbG9zYWJsZSA9IF9wcm9wcyRjbG9zYWJsZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyRjbG9zYWJsZSxcbiAgICBfcHJvcHMkbWFzayA9IHByb3BzLm1hc2ssXG4gICAgbWFzayA9IF9wcm9wcyRtYXNrID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJG1hc2ssXG4gICAgbWFza1RyYW5zaXRpb25OYW1lID0gcHJvcHMubWFza1RyYW5zaXRpb25OYW1lLFxuICAgIG1hc2tBbmltYXRpb24gPSBwcm9wcy5tYXNrQW5pbWF0aW9uLFxuICAgIF9wcm9wcyRtYXNrQ2xvc2FibGUgPSBwcm9wcy5tYXNrQ2xvc2FibGUsXG4gICAgbWFza0Nsb3NhYmxlID0gX3Byb3BzJG1hc2tDbG9zYWJsZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyRtYXNrQ2xvc2FibGUsXG4gICAgbWFza1N0eWxlID0gcHJvcHMubWFza1N0eWxlLFxuICAgIG1hc2tQcm9wcyA9IHByb3BzLm1hc2tQcm9wcyxcbiAgICByb290Q2xhc3NOYW1lID0gcHJvcHMucm9vdENsYXNzTmFtZSxcbiAgICBtb2RhbENsYXNzTmFtZXMgPSBwcm9wcy5jbGFzc05hbWVzLFxuICAgIG1vZGFsU3R5bGVzID0gcHJvcHMuc3R5bGVzO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIFsnd3JhcFN0eWxlJywgJ2JvZHlTdHlsZScsICdtYXNrU3R5bGUnXS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICAvLyAocHJvcCBpbiBwcm9wcykgJiYgY29uc29sZS5lcnJvcihgV2FybmluZzogJHtwcm9wfSBpcyBkZXByZWNhdGVkLCBwbGVhc2UgdXNlIHN0eWxlcyBpbnN0ZWFkLmApXG4gICAgICB3YXJuaW5nKCEocHJvcCBpbiBwcm9wcyksIFwiXCIuY29uY2F0KHByb3AsIFwiIGlzIGRlcHJlY2F0ZWQsIHBsZWFzZSB1c2Ugc3R5bGVzIGluc3RlYWQuXCIpKTtcbiAgICB9KTtcbiAgICBpZiAoJ3dyYXBDbGFzc05hbWUnIGluIHByb3BzKSB7XG4gICAgICB3YXJuaW5nKGZhbHNlLCBcIndyYXBDbGFzc05hbWUgaXMgZGVwcmVjYXRlZCwgcGxlYXNlIHVzZSBjbGFzc05hbWVzIGluc3RlYWQuXCIpO1xuICAgIH1cbiAgfVxuICB2YXIgbGFzdE91dFNpZGVBY3RpdmVFbGVtZW50UmVmID0gdXNlUmVmKCk7XG4gIHZhciB3cmFwcGVyUmVmID0gdXNlUmVmKCk7XG4gIHZhciBjb250ZW50UmVmID0gdXNlUmVmKCk7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZSh2aXNpYmxlKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBhbmltYXRlZFZpc2libGUgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldEFuaW1hdGVkVmlzaWJsZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gSW5pdCA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgYXJpYUlkID0gdXNlSWQoKTtcbiAgZnVuY3Rpb24gc2F2ZUxhc3RPdXRTaWRlQWN0aXZlRWxlbWVudFJlZigpIHtcbiAgICBpZiAoIWNvbnRhaW5zKHdyYXBwZXJSZWYuY3VycmVudCwgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpIHtcbiAgICAgIGxhc3RPdXRTaWRlQWN0aXZlRWxlbWVudFJlZi5jdXJyZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZm9jdXNEaWFsb2dDb250ZW50KCkge1xuICAgIGlmICghY29udGFpbnMod3JhcHBlclJlZi5jdXJyZW50LCBkb2N1bWVudC5hY3RpdmVFbGVtZW50KSkge1xuICAgICAgdmFyIF9jb250ZW50UmVmJGN1cnJlbnQ7XG4gICAgICAoX2NvbnRlbnRSZWYkY3VycmVudCA9IGNvbnRlbnRSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2NvbnRlbnRSZWYkY3VycmVudCA9PT0gdm9pZCAwIHx8IF9jb250ZW50UmVmJGN1cnJlbnQuZm9jdXMoKTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IEV2ZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGZ1bmN0aW9uIG9uRGlhbG9nVmlzaWJsZUNoYW5nZWQobmV3VmlzaWJsZSkge1xuICAgIC8vIFRyeSB0byBmb2N1c1xuICAgIGlmIChuZXdWaXNpYmxlKSB7XG4gICAgICBmb2N1c0RpYWxvZ0NvbnRlbnQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ2xlYW4gdXAgc2Nyb2xsIGJhciAmIGZvY3VzIGJhY2tcbiAgICAgIHNldEFuaW1hdGVkVmlzaWJsZShmYWxzZSk7XG4gICAgICBpZiAobWFzayAmJiBsYXN0T3V0U2lkZUFjdGl2ZUVsZW1lbnRSZWYuY3VycmVudCAmJiBmb2N1c1RyaWdnZXJBZnRlckNsb3NlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbGFzdE91dFNpZGVBY3RpdmVFbGVtZW50UmVmLmN1cnJlbnQuZm9jdXMoe1xuICAgICAgICAgICAgcHJldmVudFNjcm9sbDogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gRG8gbm90aGluZ1xuICAgICAgICB9XG4gICAgICAgIGxhc3RPdXRTaWRlQWN0aXZlRWxlbWVudFJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gVHJpZ2dlciBhZnRlckNsb3NlIG9ubHkgd2hlbiBjaGFuZ2UgdmlzaWJsZSBmcm9tIHRydWUgdG8gZmFsc2VcbiAgICAgIGlmIChhbmltYXRlZFZpc2libGUpIHtcbiAgICAgICAgYWZ0ZXJDbG9zZSA9PT0gbnVsbCB8fCBhZnRlckNsb3NlID09PSB2b2lkIDAgfHwgYWZ0ZXJDbG9zZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICBhZnRlck9wZW5DaGFuZ2UgPT09IG51bGwgfHwgYWZ0ZXJPcGVuQ2hhbmdlID09PSB2b2lkIDAgfHwgYWZ0ZXJPcGVuQ2hhbmdlKG5ld1Zpc2libGUpO1xuICB9XG4gIGZ1bmN0aW9uIG9uSW50ZXJuYWxDbG9zZShlKSB7XG4gICAgb25DbG9zZSA9PT0gbnVsbCB8fCBvbkNsb3NlID09PSB2b2lkIDAgfHwgb25DbG9zZShlKTtcbiAgfVxuXG4gIC8vID4+PiBDb250ZW50XG4gIHZhciBjb250ZW50Q2xpY2tSZWYgPSB1c2VSZWYoZmFsc2UpO1xuICB2YXIgY29udGVudFRpbWVvdXRSZWYgPSB1c2VSZWYoKTtcblxuICAvLyBXZSBuZWVkIHJlY29yZCBjb250ZW50IGNsaWNrIGluY2FzZSBjb250ZW50IHBvcHVwIG91dCBvZiBkaWFsb2dcbiAgdmFyIG9uQ29udGVudE1vdXNlRG93biA9IGZ1bmN0aW9uIG9uQ29udGVudE1vdXNlRG93bigpIHtcbiAgICBjbGVhclRpbWVvdXQoY29udGVudFRpbWVvdXRSZWYuY3VycmVudCk7XG4gICAgY29udGVudENsaWNrUmVmLmN1cnJlbnQgPSB0cnVlO1xuICB9O1xuICB2YXIgb25Db250ZW50TW91c2VVcCA9IGZ1bmN0aW9uIG9uQ29udGVudE1vdXNlVXAoKSB7XG4gICAgY29udGVudFRpbWVvdXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgY29udGVudENsaWNrUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9KTtcbiAgfTtcblxuICAvLyA+Pj4gV3JhcHBlclxuICAvLyBDbG9zZSBvbmx5IHdoZW4gZWxlbWVudCBub3Qgb24gZGlhbG9nXG4gIHZhciBvbldyYXBwZXJDbGljayA9IG51bGw7XG4gIGlmIChtYXNrQ2xvc2FibGUpIHtcbiAgICBvbldyYXBwZXJDbGljayA9IGZ1bmN0aW9uIG9uV3JhcHBlckNsaWNrKGUpIHtcbiAgICAgIGlmIChjb250ZW50Q2xpY2tSZWYuY3VycmVudCkge1xuICAgICAgICBjb250ZW50Q2xpY2tSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmICh3cmFwcGVyUmVmLmN1cnJlbnQgPT09IGUudGFyZ2V0KSB7XG4gICAgICAgIG9uSW50ZXJuYWxDbG9zZShlKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIG9uV3JhcHBlcktleURvd24oZSkge1xuICAgIGlmIChrZXlib2FyZCAmJiBlLmtleUNvZGUgPT09IEtleUNvZGUuRVNDKSB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgb25JbnRlcm5hbENsb3NlKGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGtlZXAgZm9jdXMgaW5zaWRlIGRpYWxvZ1xuICAgIGlmICh2aXNpYmxlICYmIGUua2V5Q29kZSA9PT0gS2V5Q29kZS5UQUIpIHtcbiAgICAgIGNvbnRlbnRSZWYuY3VycmVudC5jaGFuZ2VBY3RpdmUoIWUuc2hpZnRLZXkpO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gRWZmZWN0ID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodmlzaWJsZSkge1xuICAgICAgc2V0QW5pbWF0ZWRWaXNpYmxlKHRydWUpO1xuICAgICAgc2F2ZUxhc3RPdXRTaWRlQWN0aXZlRWxlbWVudFJlZigpO1xuICAgIH1cbiAgfSwgW3Zpc2libGVdKTtcblxuICAvLyBSZW1vdmUgZGlyZWN0IHNob3VsZCBhbHNvIGNoZWNrIHRoZSBzY3JvbGwgYmFyIHVwZGF0ZVxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBjbGVhclRpbWVvdXQoY29udGVudFRpbWVvdXRSZWYuY3VycmVudCk7XG4gICAgfTtcbiAgfSwgW10pO1xuICB2YXIgbWVyZ2VkU3R5bGUgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7XG4gICAgekluZGV4OiB6SW5kZXhcbiAgfSwgd3JhcFN0eWxlKSwgbW9kYWxTdHlsZXMgPT09IG51bGwgfHwgbW9kYWxTdHlsZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1vZGFsU3R5bGVzLndyYXBwZXIpLCB7fSwge1xuICAgIGRpc3BsYXk6ICFhbmltYXRlZFZpc2libGUgPyAnbm9uZScgOiBudWxsXG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1yb290XCIpLCByb290Q2xhc3NOYW1lKVxuICB9LCBwaWNrQXR0cnMocHJvcHMsIHtcbiAgICBkYXRhOiB0cnVlXG4gIH0pKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTWFzaywge1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIHZpc2libGU6IG1hc2sgJiYgdmlzaWJsZSxcbiAgICBtb3Rpb25OYW1lOiBnZXRNb3Rpb25OYW1lKHByZWZpeENscywgbWFza1RyYW5zaXRpb25OYW1lLCBtYXNrQW5pbWF0aW9uKSxcbiAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHtcbiAgICAgIHpJbmRleDogekluZGV4XG4gICAgfSwgbWFza1N0eWxlKSwgbW9kYWxTdHlsZXMgPT09IG51bGwgfHwgbW9kYWxTdHlsZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1vZGFsU3R5bGVzLm1hc2spLFxuICAgIG1hc2tQcm9wczogbWFza1Byb3BzLFxuICAgIGNsYXNzTmFtZTogbW9kYWxDbGFzc05hbWVzID09PSBudWxsIHx8IG1vZGFsQ2xhc3NOYW1lcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogbW9kYWxDbGFzc05hbWVzLm1hc2tcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHtcbiAgICB0YWJJbmRleDogLTEsXG4gICAgb25LZXlEb3duOiBvbldyYXBwZXJLZXlEb3duLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXdyYXBcIiksIHdyYXBDbGFzc05hbWUsIG1vZGFsQ2xhc3NOYW1lcyA9PT0gbnVsbCB8fCBtb2RhbENsYXNzTmFtZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1vZGFsQ2xhc3NOYW1lcy53cmFwcGVyKSxcbiAgICByZWY6IHdyYXBwZXJSZWYsXG4gICAgb25DbGljazogb25XcmFwcGVyQ2xpY2ssXG4gICAgc3R5bGU6IG1lcmdlZFN0eWxlXG4gIH0sIHdyYXBQcm9wcyksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbnRlbnQsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIG9uTW91c2VEb3duOiBvbkNvbnRlbnRNb3VzZURvd24sXG4gICAgb25Nb3VzZVVwOiBvbkNvbnRlbnRNb3VzZVVwLFxuICAgIHJlZjogY29udGVudFJlZixcbiAgICBjbG9zYWJsZTogY2xvc2FibGUsXG4gICAgYXJpYUlkOiBhcmlhSWQsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgdmlzaWJsZTogdmlzaWJsZSAmJiBhbmltYXRlZFZpc2libGUsXG4gICAgb25DbG9zZTogb25JbnRlcm5hbENsb3NlLFxuICAgIG9uVmlzaWJsZUNoYW5nZWQ6IG9uRGlhbG9nVmlzaWJsZUNoYW5nZWQsXG4gICAgbW90aW9uTmFtZTogZ2V0TW90aW9uTmFtZShwcmVmaXhDbHMsIHRyYW5zaXRpb25OYW1lLCBhbmltYXRpb24pXG4gIH0pKSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IERpYWxvZzsiLCAiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuZnVuY3Rpb24gZ2V0VXNlSWQoKSB7XG4gIC8vIFdlIG5lZWQgZnVsbHkgY2xvbmUgUmVhY3QgZnVuY3Rpb24gaGVyZSB0byBhdm9pZCB3ZWJwYWNrIHdhcm5pbmcgUmVhY3QgMTcgZG8gbm90IGV4cG9ydCBgdXNlSWRgXG4gIHZhciBmdWxsQ2xvbmUgPSBfb2JqZWN0U3ByZWFkKHt9LCBSZWFjdCk7XG4gIHJldHVybiBmdWxsQ2xvbmUudXNlSWQ7XG59XG52YXIgdXVpZCA9IDA7XG5cbi8qKiBAcHJpdmF0ZSBOb3RlIG9ubHkgd29ya2VkIGluIGRldmVsb3AgZW52LiBOb3Qgd29yayBpbiBwcm9kdWN0aW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0VXVpZCgpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB1dWlkID0gMDtcbiAgfVxufVxudmFyIHVzZU9yaWdpbklkID0gZ2V0VXNlSWQoKTtcbmV4cG9ydCBkZWZhdWx0IHVzZU9yaWdpbklkID9cbi8vIFVzZSBSZWFjdCBgdXNlSWRgXG5mdW5jdGlvbiB1c2VJZChpZCkge1xuICB2YXIgcmVhY3RJZCA9IHVzZU9yaWdpbklkKCk7XG5cbiAgLy8gRGV2ZWxvcGVyIHBhc3NlZCBpZCBpcyBzaW5nbGUgc291cmNlIG9mIHRydXRoXG4gIGlmIChpZCkge1xuICAgIHJldHVybiBpZDtcbiAgfVxuXG4gIC8vIFRlc3QgZW52IGFsd2F5cyByZXR1cm4gbW9jayBpZFxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICd0ZXN0Jykge1xuICAgIHJldHVybiAndGVzdC1pZCc7XG4gIH1cbiAgcmV0dXJuIHJlYWN0SWQ7XG59IDpcbi8vIFVzZSBjb21wYXRpYmxlIG9mIGB1c2VJZGBcbmZ1bmN0aW9uIHVzZUNvbXBhdElkKGlkKSB7XG4gIC8vIElubmVyIGlkIGZvciBhY2Nlc3NpYmlsaXR5IHVzYWdlLiBPbmx5IHdvcmsgaW4gY2xpZW50IHNpZGVcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKCdzc3ItaWQnKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBpbm5lcklkID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXRJbm5lcklkID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbmV4dElkID0gdXVpZDtcbiAgICB1dWlkICs9IDE7XG4gICAgc2V0SW5uZXJJZChcInJjX3VuaXF1ZV9cIi5jb25jYXQobmV4dElkKSk7XG4gIH0sIFtdKTtcblxuICAvLyBEZXZlbG9wZXIgcGFzc2VkIGlkIGlzIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGhcbiAgaWYgKGlkKSB7XG4gICAgcmV0dXJuIGlkO1xuICB9XG5cbiAgLy8gVGVzdCBlbnYgYWx3YXlzIHJldHVybiBtb2NrIGlkXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Rlc3QnKSB7XG4gICAgcmV0dXJuICd0ZXN0LWlkJztcbiAgfVxuXG4gIC8vIFJldHVybiByZWFjdCBuYXRpdmUgaWQgb3IgaW5uZXIgaWRcbiAgcmV0dXJuIGlubmVySWQ7XG59OyIsICIvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IE1vdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgZnVuY3Rpb24gZ2V0TW90aW9uTmFtZShwcmVmaXhDbHMsIHRyYW5zaXRpb25OYW1lLCBhbmltYXRpb25OYW1lKSB7XG4gIHZhciBtb3Rpb25OYW1lID0gdHJhbnNpdGlvbk5hbWU7XG4gIGlmICghbW90aW9uTmFtZSAmJiBhbmltYXRpb25OYW1lKSB7XG4gICAgbW90aW9uTmFtZSA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdChhbmltYXRpb25OYW1lKTtcbiAgfVxuICByZXR1cm4gbW90aW9uTmFtZTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBPZmZzZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuZnVuY3Rpb24gZ2V0U2Nyb2xsKHcsIHRvcCkge1xuICB2YXIgcmV0ID0gd1tcInBhZ2VcIi5jb25jYXQodG9wID8gJ1knIDogJ1gnLCBcIk9mZnNldFwiKV07XG4gIHZhciBtZXRob2QgPSBcInNjcm9sbFwiLmNvbmNhdCh0b3AgPyAnVG9wJyA6ICdMZWZ0Jyk7XG4gIGlmICh0eXBlb2YgcmV0ICE9PSAnbnVtYmVyJykge1xuICAgIHZhciBkID0gdy5kb2N1bWVudDtcbiAgICByZXQgPSBkLmRvY3VtZW50RWxlbWVudFttZXRob2RdO1xuICAgIGlmICh0eXBlb2YgcmV0ICE9PSAnbnVtYmVyJykge1xuICAgICAgcmV0ID0gZC5ib2R5W21ldGhvZF07XG4gICAgfVxuICB9XG4gIHJldHVybiByZXQ7XG59XG5leHBvcnQgZnVuY3Rpb24gb2Zmc2V0KGVsKSB7XG4gIHZhciByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHZhciBwb3MgPSB7XG4gICAgbGVmdDogcmVjdC5sZWZ0LFxuICAgIHRvcDogcmVjdC50b3BcbiAgfTtcbiAgdmFyIGRvYyA9IGVsLm93bmVyRG9jdW1lbnQ7XG4gIHZhciB3ID0gZG9jLmRlZmF1bHRWaWV3IHx8IGRvYy5wYXJlbnRXaW5kb3c7XG4gIHBvcy5sZWZ0ICs9IGdldFNjcm9sbCh3KTtcbiAgcG9zLnRvcCArPSBnZXRTY3JvbGwodywgdHJ1ZSk7XG4gIHJldHVybiBwb3M7XG59IiwgImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgQ1NTTW90aW9uIGZyb20gJ3JjLW1vdGlvbic7XG5pbXBvcnQgeyBvZmZzZXQgfSBmcm9tIFwiLi4vLi4vdXRpbFwiO1xuaW1wb3J0IFBhbmVsIGZyb20gXCIuL1BhbmVsXCI7XG52YXIgQ29udGVudCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgdGl0bGUgPSBwcm9wcy50aXRsZSxcbiAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICB2aXNpYmxlID0gcHJvcHMudmlzaWJsZSxcbiAgICBmb3JjZVJlbmRlciA9IHByb3BzLmZvcmNlUmVuZGVyLFxuICAgIGRlc3Ryb3lPbkNsb3NlID0gcHJvcHMuZGVzdHJveU9uQ2xvc2UsXG4gICAgbW90aW9uTmFtZSA9IHByb3BzLm1vdGlvbk5hbWUsXG4gICAgYXJpYUlkID0gcHJvcHMuYXJpYUlkLFxuICAgIG9uVmlzaWJsZUNoYW5nZWQgPSBwcm9wcy5vblZpc2libGVDaGFuZ2VkLFxuICAgIG1vdXNlUG9zaXRpb24gPSBwcm9wcy5tb3VzZVBvc2l0aW9uO1xuICB2YXIgZGlhbG9nUmVmID0gdXNlUmVmKCk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU3R5bGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZSgpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIHRyYW5zZm9ybU9yaWdpbiA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0VHJhbnNmb3JtT3JpZ2luID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIGNvbnRlbnRTdHlsZSA9IHt9O1xuICBpZiAodHJhbnNmb3JtT3JpZ2luKSB7XG4gICAgY29udGVudFN0eWxlLnRyYW5zZm9ybU9yaWdpbiA9IHRyYW5zZm9ybU9yaWdpbjtcbiAgfVxuICBmdW5jdGlvbiBvblByZXBhcmUoKSB7XG4gICAgdmFyIGVsZW1lbnRPZmZzZXQgPSBvZmZzZXQoZGlhbG9nUmVmLmN1cnJlbnQpO1xuICAgIHNldFRyYW5zZm9ybU9yaWdpbihtb3VzZVBvc2l0aW9uICYmIChtb3VzZVBvc2l0aW9uLnggfHwgbW91c2VQb3NpdGlvbi55KSA/IFwiXCIuY29uY2F0KG1vdXNlUG9zaXRpb24ueCAtIGVsZW1lbnRPZmZzZXQubGVmdCwgXCJweCBcIikuY29uY2F0KG1vdXNlUG9zaXRpb24ueSAtIGVsZW1lbnRPZmZzZXQudG9wLCBcInB4XCIpIDogJycpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDU1NNb3Rpb24sIHtcbiAgICB2aXNpYmxlOiB2aXNpYmxlLFxuICAgIG9uVmlzaWJsZUNoYW5nZWQ6IG9uVmlzaWJsZUNoYW5nZWQsXG4gICAgb25BcHBlYXJQcmVwYXJlOiBvblByZXBhcmUsXG4gICAgb25FbnRlclByZXBhcmU6IG9uUHJlcGFyZSxcbiAgICBmb3JjZVJlbmRlcjogZm9yY2VSZW5kZXIsXG4gICAgbW90aW9uTmFtZTogbW90aW9uTmFtZSxcbiAgICByZW1vdmVPbkxlYXZlOiBkZXN0cm95T25DbG9zZSxcbiAgICByZWY6IGRpYWxvZ1JlZlxuICB9LCBmdW5jdGlvbiAoX3JlZiwgbW90aW9uUmVmKSB7XG4gICAgdmFyIG1vdGlvbkNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLFxuICAgICAgbW90aW9uU3R5bGUgPSBfcmVmLnN0eWxlO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQYW5lbCwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgICByZWY6IHJlZixcbiAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgIGFyaWFJZDogYXJpYUlkLFxuICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICBob2xkZXJSZWY6IG1vdGlvblJlZixcbiAgICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgbW90aW9uU3R5bGUpLCBzdHlsZSksIGNvbnRlbnRTdHlsZSksXG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBtb3Rpb25DbGFzc05hbWUpXG4gICAgfSkpO1xuICB9KTtcbn0pO1xuQ29udGVudC5kaXNwbGF5TmFtZSA9ICdDb250ZW50JztcbmV4cG9ydCBkZWZhdWx0IENvbnRlbnQ7IiwgImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgdXNlQ29tcG9zZVJlZiB9IGZyb20gXCJyYy11dGlsL2VzL3JlZlwiO1xuaW1wb3J0IFJlYWN0LCB7IHVzZU1lbW8sIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFJlZkNvbnRleHQgfSBmcm9tIFwiLi4vLi4vY29udGV4dFwiO1xuaW1wb3J0IE1lbW9DaGlsZHJlbiBmcm9tIFwiLi9NZW1vQ2hpbGRyZW5cIjtcbmltcG9ydCBwaWNrQXR0cnMgZnJvbSBcInJjLXV0aWwvZXMvcGlja0F0dHJzXCI7XG52YXIgc2VudGluZWxTdHlsZSA9IHtcbiAgd2lkdGg6IDAsXG4gIGhlaWdodDogMCxcbiAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICBvdXRsaW5lOiAnbm9uZSdcbn07XG52YXIgZW50aXR5U3R5bGUgPSB7XG4gIG91dGxpbmU6ICdub25lJ1xufTtcbnZhciBQYW5lbCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgdGl0bGUgPSBwcm9wcy50aXRsZSxcbiAgICBhcmlhSWQgPSBwcm9wcy5hcmlhSWQsXG4gICAgZm9vdGVyID0gcHJvcHMuZm9vdGVyLFxuICAgIGNsb3NhYmxlID0gcHJvcHMuY2xvc2FibGUsXG4gICAgY2xvc2VJY29uID0gcHJvcHMuY2xvc2VJY29uLFxuICAgIG9uQ2xvc2UgPSBwcm9wcy5vbkNsb3NlLFxuICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgYm9keVN0eWxlID0gcHJvcHMuYm9keVN0eWxlLFxuICAgIGJvZHlQcm9wcyA9IHByb3BzLmJvZHlQcm9wcyxcbiAgICBtb2RhbFJlbmRlciA9IHByb3BzLm1vZGFsUmVuZGVyLFxuICAgIG9uTW91c2VEb3duID0gcHJvcHMub25Nb3VzZURvd24sXG4gICAgb25Nb3VzZVVwID0gcHJvcHMub25Nb3VzZVVwLFxuICAgIGhvbGRlclJlZiA9IHByb3BzLmhvbGRlclJlZixcbiAgICB2aXNpYmxlID0gcHJvcHMudmlzaWJsZSxcbiAgICBmb3JjZVJlbmRlciA9IHByb3BzLmZvcmNlUmVuZGVyLFxuICAgIHdpZHRoID0gcHJvcHMud2lkdGgsXG4gICAgaGVpZ2h0ID0gcHJvcHMuaGVpZ2h0LFxuICAgIG1vZGFsQ2xhc3NOYW1lcyA9IHByb3BzLmNsYXNzTmFtZXMsXG4gICAgbW9kYWxTdHlsZXMgPSBwcm9wcy5zdHlsZXM7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlZnMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoUmVmQ29udGV4dCksXG4gICAgcGFuZWxSZWYgPSBfUmVhY3QkdXNlQ29udGV4dC5wYW5lbDtcbiAgdmFyIG1lcmdlZFJlZiA9IHVzZUNvbXBvc2VSZWYoaG9sZGVyUmVmLCBwYW5lbFJlZik7XG4gIHZhciBzZW50aW5lbFN0YXJ0UmVmID0gdXNlUmVmKCk7XG4gIHZhciBzZW50aW5lbEVuZFJlZiA9IHVzZVJlZigpO1xuICBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBmb2N1czogZnVuY3Rpb24gZm9jdXMoKSB7XG4gICAgICAgIHZhciBfc2VudGluZWxTdGFydFJlZiRjdXI7XG4gICAgICAgIChfc2VudGluZWxTdGFydFJlZiRjdXIgPSBzZW50aW5lbFN0YXJ0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9zZW50aW5lbFN0YXJ0UmVmJGN1ciA9PT0gdm9pZCAwIHx8IF9zZW50aW5lbFN0YXJ0UmVmJGN1ci5mb2N1cyh7XG4gICAgICAgICAgcHJldmVudFNjcm9sbDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBjaGFuZ2VBY3RpdmU6IGZ1bmN0aW9uIGNoYW5nZUFjdGl2ZShuZXh0KSB7XG4gICAgICAgIHZhciBfZG9jdW1lbnQgPSBkb2N1bWVudCxcbiAgICAgICAgICBhY3RpdmVFbGVtZW50ID0gX2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGlmIChuZXh0ICYmIGFjdGl2ZUVsZW1lbnQgPT09IHNlbnRpbmVsRW5kUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBzZW50aW5lbFN0YXJ0UmVmLmN1cnJlbnQuZm9jdXMoe1xuICAgICAgICAgICAgcHJldmVudFNjcm9sbDogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKCFuZXh0ICYmIGFjdGl2ZUVsZW1lbnQgPT09IHNlbnRpbmVsU3RhcnRSZWYuY3VycmVudCkge1xuICAgICAgICAgIHNlbnRpbmVsRW5kUmVmLmN1cnJlbnQuZm9jdXMoe1xuICAgICAgICAgICAgcHJldmVudFNjcm9sbDogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU3R5bGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBjb250ZW50U3R5bGUgPSB7fTtcbiAgaWYgKHdpZHRoICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb250ZW50U3R5bGUud2lkdGggPSB3aWR0aDtcbiAgfVxuICBpZiAoaGVpZ2h0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb250ZW50U3R5bGUuaGVpZ2h0ID0gaGVpZ2h0O1xuICB9XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgZm9vdGVyTm9kZSA9IGZvb3RlciA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1mb290ZXJcIiksIG1vZGFsQ2xhc3NOYW1lcyA9PT0gbnVsbCB8fCBtb2RhbENsYXNzTmFtZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1vZGFsQ2xhc3NOYW1lcy5mb290ZXIpLFxuICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKHt9LCBtb2RhbFN0eWxlcyA9PT0gbnVsbCB8fCBtb2RhbFN0eWxlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogbW9kYWxTdHlsZXMuZm9vdGVyKVxuICB9LCBmb290ZXIpIDogbnVsbDtcbiAgdmFyIGhlYWRlck5vZGUgPSB0aXRsZSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oZWFkZXJcIiksIG1vZGFsQ2xhc3NOYW1lcyA9PT0gbnVsbCB8fCBtb2RhbENsYXNzTmFtZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1vZGFsQ2xhc3NOYW1lcy5oZWFkZXIpLFxuICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKHt9LCBtb2RhbFN0eWxlcyA9PT0gbnVsbCB8fCBtb2RhbFN0eWxlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogbW9kYWxTdHlsZXMuaGVhZGVyKVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRpdGxlXCIpLFxuICAgIGlkOiBhcmlhSWRcbiAgfSwgdGl0bGUpKSA6IG51bGw7XG4gIHZhciBjbG9zYWJsZU9iaiA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGlmIChfdHlwZW9mKGNsb3NhYmxlKSA9PT0gJ29iamVjdCcgJiYgY2xvc2FibGUgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBjbG9zYWJsZTtcbiAgICB9XG4gICAgaWYgKGNsb3NhYmxlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjbG9zZUljb246IGNsb3NlSWNvbiAhPT0gbnVsbCAmJiBjbG9zZUljb24gIT09IHZvaWQgMCA/IGNsb3NlSWNvbiA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNsb3NlLXhcIilcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7fTtcbiAgfSwgW2Nsb3NhYmxlLCBjbG9zZUljb24sIHByZWZpeENsc10pO1xuICB2YXIgYXJpYVByb3BzID0gcGlja0F0dHJzKGNsb3NhYmxlT2JqLCB0cnVlKTtcbiAgdmFyIGNsb3NlQnRuSXNEaXNhYmxlZCA9IF90eXBlb2YoY2xvc2FibGUpID09PSAnb2JqZWN0JyAmJiBjbG9zYWJsZS5kaXNhYmxlZDtcbiAgdmFyIGNsb3Nlck5vZGUgPSBjbG9zYWJsZSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIF9leHRlbmRzKHtcbiAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgIG9uQ2xpY2s6IG9uQ2xvc2UsXG4gICAgXCJhcmlhLWxhYmVsXCI6IFwiQ2xvc2VcIlxuICB9LCBhcmlhUHJvcHMsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2xvc2VcIiksXG4gICAgZGlzYWJsZWQ6IGNsb3NlQnRuSXNEaXNhYmxlZFxuICB9KSwgY2xvc2FibGVPYmouY2xvc2VJY29uKSA6IG51bGw7XG4gIHZhciBjb250ZW50ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNvbnRlbnRcIiksIG1vZGFsQ2xhc3NOYW1lcyA9PT0gbnVsbCB8fCBtb2RhbENsYXNzTmFtZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1vZGFsQ2xhc3NOYW1lcy5jb250ZW50KSxcbiAgICBzdHlsZTogbW9kYWxTdHlsZXMgPT09IG51bGwgfHwgbW9kYWxTdHlsZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1vZGFsU3R5bGVzLmNvbnRlbnRcbiAgfSwgY2xvc2VyTm9kZSwgaGVhZGVyTm9kZSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWJvZHlcIiksIG1vZGFsQ2xhc3NOYW1lcyA9PT0gbnVsbCB8fCBtb2RhbENsYXNzTmFtZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1vZGFsQ2xhc3NOYW1lcy5ib2R5KSxcbiAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBib2R5U3R5bGUpLCBtb2RhbFN0eWxlcyA9PT0gbnVsbCB8fCBtb2RhbFN0eWxlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogbW9kYWxTdHlsZXMuYm9keSlcbiAgfSwgYm9keVByb3BzKSwgY2hpbGRyZW4pLCBmb290ZXJOb2RlKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBrZXk6IFwiZGlhbG9nLWVsZW1lbnRcIixcbiAgICByb2xlOiBcImRpYWxvZ1wiLFxuICAgIFwiYXJpYS1sYWJlbGxlZGJ5XCI6IHRpdGxlID8gYXJpYUlkIDogbnVsbCxcbiAgICBcImFyaWEtbW9kYWxcIjogXCJ0cnVlXCIsXG4gICAgcmVmOiBtZXJnZWRSZWYsXG4gICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3R5bGUpLCBjb250ZW50U3R5bGUpLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhwcmVmaXhDbHMsIGNsYXNzTmFtZSksXG4gICAgb25Nb3VzZURvd246IG9uTW91c2VEb3duLFxuICAgIG9uTW91c2VVcDogb25Nb3VzZVVwXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICByZWY6IHNlbnRpbmVsU3RhcnRSZWYsXG4gICAgdGFiSW5kZXg6IDAsXG4gICAgc3R5bGU6IGVudGl0eVN0eWxlXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE1lbW9DaGlsZHJlbiwge1xuICAgIHNob3VsZFVwZGF0ZTogdmlzaWJsZSB8fCBmb3JjZVJlbmRlclxuICB9LCBtb2RhbFJlbmRlciA/IG1vZGFsUmVuZGVyKGNvbnRlbnQpIDogY29udGVudCkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgdGFiSW5kZXg6IDAsXG4gICAgcmVmOiBzZW50aW5lbEVuZFJlZixcbiAgICBzdHlsZTogc2VudGluZWxTdHlsZVxuICB9KSk7XG59KTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFBhbmVsLmRpc3BsYXlOYW1lID0gJ1BhbmVsJztcbn1cbmV4cG9ydCBkZWZhdWx0IFBhbmVsOyIsICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovUmVhY3QubWVtbyhmdW5jdGlvbiAoX3JlZikge1xuICB2YXIgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuO1xuICByZXR1cm4gY2hpbGRyZW47XG59LCBmdW5jdGlvbiAoXywgX3JlZjIpIHtcbiAgdmFyIHNob3VsZFVwZGF0ZSA9IF9yZWYyLnNob3VsZFVwZGF0ZTtcbiAgcmV0dXJuICFzaG91bGRVcGRhdGU7XG59KTsiLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgQ1NTTW90aW9uIGZyb20gJ3JjLW1vdGlvbic7XG52YXIgTWFzayA9IGZ1bmN0aW9uIE1hc2socHJvcHMpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgIHZpc2libGUgPSBwcm9wcy52aXNpYmxlLFxuICAgIG1hc2tQcm9wcyA9IHByb3BzLm1hc2tQcm9wcyxcbiAgICBtb3Rpb25OYW1lID0gcHJvcHMubW90aW9uTmFtZSxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWU7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDU1NNb3Rpb24sIHtcbiAgICBrZXk6IFwibWFza1wiLFxuICAgIHZpc2libGU6IHZpc2libGUsXG4gICAgbW90aW9uTmFtZTogbW90aW9uTmFtZSxcbiAgICBsZWF2ZWRDbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbWFzay1oaWRkZW5cIilcbiAgfSwgZnVuY3Rpb24gKF9yZWYsIHJlZikge1xuICAgIHZhciBtb3Rpb25DbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICAgIG1vdGlvblN0eWxlID0gX3JlZi5zdHlsZTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgICAgcmVmOiByZWYsXG4gICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBtb3Rpb25TdHlsZSksIHN0eWxlKSxcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW1hc2tcIiksIG1vdGlvbkNsYXNzTmFtZSwgY2xhc3NOYW1lKVxuICAgIH0sIG1hc2tQcm9wcykpO1xuICB9KTtcbn07XG5leHBvcnQgZGVmYXVsdCBNYXNrOyIsICJpbXBvcnQgRGlhbG9nV3JhcCBmcm9tIFwiLi9EaWFsb2dXcmFwXCI7XG5pbXBvcnQgUGFuZWwgZnJvbSBcIi4vRGlhbG9nL0NvbnRlbnQvUGFuZWxcIjtcbmV4cG9ydCB7IFBhbmVsIH07XG5leHBvcnQgZGVmYXVsdCBEaWFsb2dXcmFwOyIsICJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IE5vRm9ybVN0eWxlIH0gZnJvbSAnLi4vZm9ybS9jb250ZXh0JztcbmltcG9ydCB7IE5vQ29tcGFjdFN0eWxlIH0gZnJvbSAnLi4vc3BhY2UvQ29tcGFjdCc7XG5jb25zdCBDb250ZXh0SXNvbGF0b3IgPSBwcm9wcyA9PiB7XG4gIGNvbnN0IHtcbiAgICBzcGFjZSxcbiAgICBmb3JtLFxuICAgIGNoaWxkcmVuXG4gIH0gPSBwcm9wcztcbiAgaWYgKGNoaWxkcmVuID09PSB1bmRlZmluZWQgfHwgY2hpbGRyZW4gPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBsZXQgcmVzdWx0ID0gY2hpbGRyZW47XG4gIGlmIChmb3JtKSB7XG4gICAgcmVzdWx0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTm9Gb3JtU3R5bGUsIHtcbiAgICAgIG92ZXJyaWRlOiB0cnVlLFxuICAgICAgc3RhdHVzOiB0cnVlXG4gICAgfSwgcmVzdWx0KTtcbiAgfVxuICBpZiAoc3BhY2UpIHtcbiAgICByZXN1bHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChOb0NvbXBhY3RTdHlsZSwgbnVsbCwgcmVzdWx0KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbmV4cG9ydCBkZWZhdWx0IENvbnRleHRJc29sYXRvcjsiLCAiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEZvcm1Qcm92aWRlciBhcyBSY0Zvcm1Qcm92aWRlciB9IGZyb20gJ3JjLWZpZWxkLWZvcm0nO1xuaW1wb3J0IG9taXQgZnJvbSBcInJjLXV0aWwvZXMvb21pdFwiO1xuZXhwb3J0IGNvbnN0IEZvcm1Db250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQoe1xuICBsYWJlbEFsaWduOiAncmlnaHQnLFxuICB2ZXJ0aWNhbDogZmFsc2UsXG4gIGl0ZW1SZWY6ICgpID0+IHt9XG59KTtcbmV4cG9ydCBjb25zdCBOb1N0eWxlSXRlbUNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmV4cG9ydCBjb25zdCBGb3JtUHJvdmlkZXIgPSBwcm9wcyA9PiB7XG4gIGNvbnN0IHByb3ZpZGVyUHJvcHMgPSBvbWl0KHByb3BzLCBbJ3ByZWZpeENscyddKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJjRm9ybVByb3ZpZGVyLCBPYmplY3QuYXNzaWduKHt9LCBwcm92aWRlclByb3BzKSk7XG59O1xuZXhwb3J0IGNvbnN0IEZvcm1JdGVtUHJlZml4Q29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHtcbiAgcHJlZml4Q2xzOiAnJ1xufSk7XG5leHBvcnQgY29uc3QgRm9ybUl0ZW1JbnB1dENvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh7fSk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBGb3JtSXRlbUlucHV0Q29udGV4dC5kaXNwbGF5TmFtZSA9ICdGb3JtSXRlbUlucHV0Q29udGV4dCc7XG59XG5leHBvcnQgY29uc3QgTm9Gb3JtU3R5bGUgPSBfcmVmID0+IHtcbiAgbGV0IHtcbiAgICBjaGlsZHJlbixcbiAgICBzdGF0dXMsXG4gICAgb3ZlcnJpZGVcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IGZvcm1JdGVtSW5wdXRDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChGb3JtSXRlbUlucHV0Q29udGV4dCk7XG4gIGNvbnN0IG5ld0Zvcm1JdGVtSW5wdXRDb250ZXh0ID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgbmV3Q29udGV4dCA9IE9iamVjdC5hc3NpZ24oe30sIGZvcm1JdGVtSW5wdXRDb250ZXh0KTtcbiAgICBpZiAob3ZlcnJpZGUpIHtcbiAgICAgIGRlbGV0ZSBuZXdDb250ZXh0LmlzRm9ybUl0ZW1JbnB1dDtcbiAgICB9XG4gICAgaWYgKHN0YXR1cykge1xuICAgICAgZGVsZXRlIG5ld0NvbnRleHQuc3RhdHVzO1xuICAgICAgZGVsZXRlIG5ld0NvbnRleHQuaGFzRmVlZGJhY2s7XG4gICAgICBkZWxldGUgbmV3Q29udGV4dC5mZWVkYmFja0ljb247XG4gICAgfVxuICAgIHJldHVybiBuZXdDb250ZXh0O1xuICB9LCBbc3RhdHVzLCBvdmVycmlkZSwgZm9ybUl0ZW1JbnB1dENvbnRleHRdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZvcm1JdGVtSW5wdXRDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IG5ld0Zvcm1JdGVtSW5wdXRDb250ZXh0XG4gIH0sIGNoaWxkcmVuKTtcbn07XG5leHBvcnQgY29uc3QgVmFyaWFudENvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh1bmRlZmluZWQpOyIsICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRmllbGQgZnJvbSBcIi4vRmllbGRcIjtcbmltcG9ydCBMaXN0IGZyb20gXCIuL0xpc3RcIjtcbmltcG9ydCB1c2VGb3JtIGZyb20gXCIuL3VzZUZvcm1cIjtcbmltcG9ydCBGaWVsZEZvcm0gZnJvbSBcIi4vRm9ybVwiO1xuaW1wb3J0IHsgRm9ybVByb3ZpZGVyIH0gZnJvbSBcIi4vRm9ybUNvbnRleHRcIjtcbmltcG9ydCBGaWVsZENvbnRleHQgZnJvbSBcIi4vRmllbGRDb250ZXh0XCI7XG5pbXBvcnQgTGlzdENvbnRleHQgZnJvbSBcIi4vTGlzdENvbnRleHRcIjtcbmltcG9ydCB1c2VXYXRjaCBmcm9tIFwiLi91c2VXYXRjaFwiO1xudmFyIEludGVybmFsRm9ybSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKEZpZWxkRm9ybSk7XG52YXIgUmVmRm9ybSA9IEludGVybmFsRm9ybTtcblJlZkZvcm0uRm9ybVByb3ZpZGVyID0gRm9ybVByb3ZpZGVyO1xuUmVmRm9ybS5GaWVsZCA9IEZpZWxkO1xuUmVmRm9ybS5MaXN0ID0gTGlzdDtcblJlZkZvcm0udXNlRm9ybSA9IHVzZUZvcm07XG5SZWZGb3JtLnVzZVdhdGNoID0gdXNlV2F0Y2g7XG5leHBvcnQgeyBGaWVsZCwgTGlzdCwgdXNlRm9ybSwgRm9ybVByb3ZpZGVyLCBGaWVsZENvbnRleHQsIExpc3RDb250ZXh0LCB1c2VXYXRjaCB9O1xuZXhwb3J0IGRlZmF1bHQgUmVmRm9ybTsiLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0IF9yZWdlbmVyYXRvclJ1bnRpbWUgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3JlZ2VuZXJhdG9yUnVudGltZVwiO1xuaW1wb3J0IF9hc3luY1RvR2VuZXJhdG9yIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3luY1RvR2VuZXJhdG9yXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2Fzc2VydFRoaXNJbml0aWFsaXplZFwiO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNcIjtcbmltcG9ydCBfY3JlYXRlU3VwZXIgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZVN1cGVyXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xudmFyIF9leGNsdWRlZCA9IFtcIm5hbWVcIl07XG5pbXBvcnQgdG9DaGlsZHJlbkFycmF5IGZyb20gXCJyYy11dGlsL2VzL0NoaWxkcmVuL3RvQXJyYXlcIjtcbmltcG9ydCBpc0VxdWFsIGZyb20gXCJyYy11dGlsL2VzL2lzRXF1YWxcIjtcbmltcG9ydCB3YXJuaW5nIGZyb20gXCJyYy11dGlsL2VzL3dhcm5pbmdcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBGaWVsZENvbnRleHQsIHsgSE9PS19NQVJLIH0gZnJvbSBcIi4vRmllbGRDb250ZXh0XCI7XG5pbXBvcnQgTGlzdENvbnRleHQgZnJvbSBcIi4vTGlzdENvbnRleHRcIjtcbmltcG9ydCB7IHRvQXJyYXkgfSBmcm9tIFwiLi91dGlscy90eXBlVXRpbFwiO1xuaW1wb3J0IHsgdmFsaWRhdGVSdWxlcyB9IGZyb20gXCIuL3V0aWxzL3ZhbGlkYXRlVXRpbFwiO1xuaW1wb3J0IHsgY29udGFpbnNOYW1lUGF0aCwgZGVmYXVsdEdldFZhbHVlRnJvbUV2ZW50LCBnZXROYW1lUGF0aCwgZ2V0VmFsdWUgfSBmcm9tIFwiLi91dGlscy92YWx1ZVV0aWxcIjtcbnZhciBFTVBUWV9FUlJPUlMgPSBbXTtcbmZ1bmN0aW9uIHJlcXVpcmVVcGRhdGUoc2hvdWxkVXBkYXRlLCBwcmV2LCBuZXh0LCBwcmV2VmFsdWUsIG5leHRWYWx1ZSwgaW5mbykge1xuICBpZiAodHlwZW9mIHNob3VsZFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBzaG91bGRVcGRhdGUocHJldiwgbmV4dCwgJ3NvdXJjZScgaW4gaW5mbyA/IHtcbiAgICAgIHNvdXJjZTogaW5mby5zb3VyY2VcbiAgICB9IDoge30pO1xuICB9XG4gIHJldHVybiBwcmV2VmFsdWUgIT09IG5leHRWYWx1ZTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9jb25zaXN0ZW50LWluZGV4ZWQtb2JqZWN0LXN0eWxlXG4vLyBXZSB1c2UgQ2xhc3MgaW5zdGVhZCBvZiBIb29rcyBoZXJlIHNpbmNlIGl0IHdpbGwgY29zdCBtdWNoIGNvZGUgYnkgdXNpbmcgSG9va3MuXG52YXIgRmllbGQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKEZpZWxkLCBfUmVhY3QkQ29tcG9uZW50KTtcbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihGaWVsZCk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTdWJzY3JpcHRpb25zID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBmdW5jdGlvbiBGaWVsZChwcm9wcykge1xuICAgIHZhciBfdGhpcztcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRmllbGQpO1xuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcHJvcHMpO1xuXG4gICAgLy8gUmVnaXN0ZXIgb24gaW5pdFxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJzdGF0ZVwiLCB7XG4gICAgICByZXNldENvdW50OiAwXG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImNhbmNlbFJlZ2lzdGVyRnVuY1wiLCBudWxsKTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwibW91bnRlZFwiLCBmYWxzZSk7XG4gICAgLyoqXG4gICAgICogRm9sbG93IHN0YXRlIHNob3VsZCBub3QgbWFuYWdlbWVudCBpbiBTdGF0ZSBzaW5jZSBpdCB3aWxsIGFzeW5jIHVwZGF0ZSBieSBSZWFjdC5cbiAgICAgKiBUaGlzIG1ha2VzIGZpcnN0IHJlbmRlciBvZiBmb3JtIGNhbiBub3QgZ2V0IGNvcnJlY3Qgc3RhdGUgdmFsdWUuXG4gICAgICovXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInRvdWNoZWRcIiwgZmFsc2UpO1xuICAgIC8qKlxuICAgICAqIE1hcmsgd2hlbiB0b3VjaGVkICYgdmFsaWRhdGVkLiBDdXJyZW50bHkgb25seSB1c2VkIGZvciBgZGVwZW5kZW5jaWVzYC5cbiAgICAgKiBOb3RlIHRoYXQgd2UgZG8gbm90IHRoaW5rIGZpZWxkIHdpdGggYGluaXRpYWxWYWx1ZWAgaXMgZGlydHlcbiAgICAgKiBidXQgdGhpcyB3aWxsIGJlIGJ5IGBpc0ZpZWxkRGlydHlgIGZ1bmMuXG4gICAgICovXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImRpcnR5XCIsIGZhbHNlKTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwidmFsaWRhdGVQcm9taXNlXCIsIHZvaWQgMCk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInByZXZWYWxpZGF0aW5nXCIsIHZvaWQgMCk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImVycm9yc1wiLCBFTVBUWV9FUlJPUlMpO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJ3YXJuaW5nc1wiLCBFTVBUWV9FUlJPUlMpO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJjYW5jZWxSZWdpc3RlclwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgcHJlc2VydmUgPSBfdGhpcyRwcm9wcy5wcmVzZXJ2ZSxcbiAgICAgICAgaXNMaXN0RmllbGQgPSBfdGhpcyRwcm9wcy5pc0xpc3RGaWVsZCxcbiAgICAgICAgbmFtZSA9IF90aGlzJHByb3BzLm5hbWU7XG4gICAgICBpZiAoX3RoaXMuY2FuY2VsUmVnaXN0ZXJGdW5jKSB7XG4gICAgICAgIF90aGlzLmNhbmNlbFJlZ2lzdGVyRnVuYyhpc0xpc3RGaWVsZCwgcHJlc2VydmUsIGdldE5hbWVQYXRoKG5hbWUpKTtcbiAgICAgIH1cbiAgICAgIF90aGlzLmNhbmNlbFJlZ2lzdGVyRnVuYyA9IG51bGw7XG4gICAgfSk7XG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBVdGlscyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImdldE5hbWVQYXRoXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgbmFtZSA9IF90aGlzJHByb3BzMi5uYW1lLFxuICAgICAgICBmaWVsZENvbnRleHQgPSBfdGhpcyRwcm9wczIuZmllbGRDb250ZXh0O1xuICAgICAgdmFyIF9maWVsZENvbnRleHQkcHJlZml4TiA9IGZpZWxkQ29udGV4dC5wcmVmaXhOYW1lLFxuICAgICAgICBwcmVmaXhOYW1lID0gX2ZpZWxkQ29udGV4dCRwcmVmaXhOID09PSB2b2lkIDAgPyBbXSA6IF9maWVsZENvbnRleHQkcHJlZml4TjtcbiAgICAgIHJldHVybiBuYW1lICE9PSB1bmRlZmluZWQgPyBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHByZWZpeE5hbWUpLCBfdG9Db25zdW1hYmxlQXJyYXkobmFtZSkpIDogW107XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImdldFJ1bGVzXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgX3RoaXMkcHJvcHMzJHJ1bGVzID0gX3RoaXMkcHJvcHMzLnJ1bGVzLFxuICAgICAgICBydWxlcyA9IF90aGlzJHByb3BzMyRydWxlcyA9PT0gdm9pZCAwID8gW10gOiBfdGhpcyRwcm9wczMkcnVsZXMsXG4gICAgICAgIGZpZWxkQ29udGV4dCA9IF90aGlzJHByb3BzMy5maWVsZENvbnRleHQ7XG4gICAgICByZXR1cm4gcnVsZXMubWFwKGZ1bmN0aW9uIChydWxlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcnVsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBydWxlKGZpZWxkQ29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJ1bGU7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwicmVmcmVzaFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIV90aGlzLm1vdW50ZWQpIHJldHVybjtcblxuICAgICAgLyoqXG4gICAgICAgKiBDbGVhbiB1cCBjdXJyZW50IG5vZGUuXG4gICAgICAgKi9cbiAgICAgIF90aGlzLnNldFN0YXRlKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICAgIHZhciByZXNldENvdW50ID0gX3JlZi5yZXNldENvdW50O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJlc2V0Q291bnQ6IHJlc2V0Q291bnQgKyAxXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICAvLyBFdmVudCBzaG91bGQgb25seSB0cmlnZ2VyIHdoZW4gbWV0YSBjaGFuZ2VkXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm1ldGFDYWNoZVwiLCBudWxsKTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwidHJpZ2dlck1ldGFFdmVudFwiLCBmdW5jdGlvbiAoZGVzdHJveSkge1xuICAgICAgdmFyIG9uTWV0YUNoYW5nZSA9IF90aGlzLnByb3BzLm9uTWV0YUNoYW5nZTtcbiAgICAgIGlmIChvbk1ldGFDaGFuZ2UpIHtcbiAgICAgICAgdmFyIF9tZXRhID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBfdGhpcy5nZXRNZXRhKCkpLCB7fSwge1xuICAgICAgICAgIGRlc3Ryb3k6IGRlc3Ryb3lcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghaXNFcXVhbChfdGhpcy5tZXRhQ2FjaGUsIF9tZXRhKSkge1xuICAgICAgICAgIG9uTWV0YUNoYW5nZShfbWV0YSk7XG4gICAgICAgIH1cbiAgICAgICAgX3RoaXMubWV0YUNhY2hlID0gX21ldGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfdGhpcy5tZXRhQ2FjaGUgPSBudWxsO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gRmllbGQgRW50aXR5IEludGVyZmFjZXMgPT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIFRyaWdnZXIgYnkgc3RvcmUgdXBkYXRlLiBDaGVjayBpZiBuZWVkIHVwZGF0ZSB0aGUgY29tcG9uZW50XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm9uU3RvcmVDaGFuZ2VcIiwgZnVuY3Rpb24gKHByZXZTdG9yZSwgbmFtZVBhdGhMaXN0LCBpbmZvKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM0ID0gX3RoaXMucHJvcHMsXG4gICAgICAgIHNob3VsZFVwZGF0ZSA9IF90aGlzJHByb3BzNC5zaG91bGRVcGRhdGUsXG4gICAgICAgIF90aGlzJHByb3BzNCRkZXBlbmRlbiA9IF90aGlzJHByb3BzNC5kZXBlbmRlbmNpZXMsXG4gICAgICAgIGRlcGVuZGVuY2llcyA9IF90aGlzJHByb3BzNCRkZXBlbmRlbiA9PT0gdm9pZCAwID8gW10gOiBfdGhpcyRwcm9wczQkZGVwZW5kZW4sXG4gICAgICAgIG9uUmVzZXQgPSBfdGhpcyRwcm9wczQub25SZXNldDtcbiAgICAgIHZhciBzdG9yZSA9IGluZm8uc3RvcmU7XG4gICAgICB2YXIgbmFtZVBhdGggPSBfdGhpcy5nZXROYW1lUGF0aCgpO1xuICAgICAgdmFyIHByZXZWYWx1ZSA9IF90aGlzLmdldFZhbHVlKHByZXZTdG9yZSk7XG4gICAgICB2YXIgY3VyVmFsdWUgPSBfdGhpcy5nZXRWYWx1ZShzdG9yZSk7XG4gICAgICB2YXIgbmFtZVBhdGhNYXRjaCA9IG5hbWVQYXRoTGlzdCAmJiBjb250YWluc05hbWVQYXRoKG5hbWVQYXRoTGlzdCwgbmFtZVBhdGgpO1xuXG4gICAgICAvLyBgc2V0RmllbGRzVmFsdWVgIGlzIGEgcXVpY2sgYWNjZXNzIHRvIHVwZGF0ZSByZWxhdGVkIHN0YXR1c1xuICAgICAgaWYgKGluZm8udHlwZSA9PT0gJ3ZhbHVlVXBkYXRlJyAmJiBpbmZvLnNvdXJjZSA9PT0gJ2V4dGVybmFsJyAmJiAhaXNFcXVhbChwcmV2VmFsdWUsIGN1clZhbHVlKSkge1xuICAgICAgICBfdGhpcy50b3VjaGVkID0gdHJ1ZTtcbiAgICAgICAgX3RoaXMuZGlydHkgPSB0cnVlO1xuICAgICAgICBfdGhpcy52YWxpZGF0ZVByb21pc2UgPSBudWxsO1xuICAgICAgICBfdGhpcy5lcnJvcnMgPSBFTVBUWV9FUlJPUlM7XG4gICAgICAgIF90aGlzLndhcm5pbmdzID0gRU1QVFlfRVJST1JTO1xuICAgICAgICBfdGhpcy50cmlnZ2VyTWV0YUV2ZW50KCk7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKGluZm8udHlwZSkge1xuICAgICAgICBjYXNlICdyZXNldCc6XG4gICAgICAgICAgaWYgKCFuYW1lUGF0aExpc3QgfHwgbmFtZVBhdGhNYXRjaCkge1xuICAgICAgICAgICAgLy8gQ2xlYW4gdXAgc3RhdGVcbiAgICAgICAgICAgIF90aGlzLnRvdWNoZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIF90aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgICAgICAgICBfdGhpcy52YWxpZGF0ZVByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBfdGhpcy5lcnJvcnMgPSBFTVBUWV9FUlJPUlM7XG4gICAgICAgICAgICBfdGhpcy53YXJuaW5ncyA9IEVNUFRZX0VSUk9SUztcbiAgICAgICAgICAgIF90aGlzLnRyaWdnZXJNZXRhRXZlbnQoKTtcbiAgICAgICAgICAgIG9uUmVzZXQgPT09IG51bGwgfHwgb25SZXNldCA9PT0gdm9pZCAwIHx8IG9uUmVzZXQoKTtcbiAgICAgICAgICAgIF90aGlzLnJlZnJlc2goKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluIGNhc2UgZmllbGQgd2l0aCBgcHJlc2VydmUgPSBmYWxzZWAgbmVzdCBkZXBzIGxpa2U6XG4gICAgICAgICAqIC0gQSA9IDEgPT4gc2hvdyBCXG4gICAgICAgICAqIC0gQiA9IDEgPT4gc2hvdyBDXG4gICAgICAgICAqIC0gUmVzZXQgQSwgbmVlZCBjbGVhbiBCLCBDXG4gICAgICAgICAqL1xuICAgICAgICBjYXNlICdyZW1vdmUnOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmIChzaG91bGRVcGRhdGUgJiYgcmVxdWlyZVVwZGF0ZShzaG91bGRVcGRhdGUsIHByZXZTdG9yZSwgc3RvcmUsIHByZXZWYWx1ZSwgY3VyVmFsdWUsIGluZm8pKSB7XG4gICAgICAgICAgICAgIF90aGlzLnJlUmVuZGVyKCk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSAnc2V0RmllbGQnOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBkYXRhID0gaW5mby5kYXRhO1xuICAgICAgICAgICAgaWYgKG5hbWVQYXRoTWF0Y2gpIHtcbiAgICAgICAgICAgICAgaWYgKCd0b3VjaGVkJyBpbiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMudG91Y2hlZCA9IGRhdGEudG91Y2hlZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoJ3ZhbGlkYXRpbmcnIGluIGRhdGEgJiYgISgnb3JpZ2luUkNGaWVsZCcgaW4gZGF0YSkpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy52YWxpZGF0ZVByb21pc2UgPSBkYXRhLnZhbGlkYXRpbmcgPyBQcm9taXNlLnJlc29sdmUoW10pIDogbnVsbDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoJ2Vycm9ycycgaW4gZGF0YSkge1xuICAgICAgICAgICAgICAgIF90aGlzLmVycm9ycyA9IGRhdGEuZXJyb3JzIHx8IEVNUFRZX0VSUk9SUztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoJ3dhcm5pbmdzJyBpbiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMud2FybmluZ3MgPSBkYXRhLndhcm5pbmdzIHx8IEVNUFRZX0VSUk9SUztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBfdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgICAgICAgICAgIF90aGlzLnRyaWdnZXJNZXRhRXZlbnQoKTtcbiAgICAgICAgICAgICAgX3RoaXMucmVSZW5kZXIoKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgndmFsdWUnIGluIGRhdGEgJiYgY29udGFpbnNOYW1lUGF0aChuYW1lUGF0aExpc3QsIG5hbWVQYXRoLCB0cnVlKSkge1xuICAgICAgICAgICAgICAvLyBDb250YWlucyBwYXRoIHdpdGggdmFsdWUgc2hvdWxkIGFsc28gY2hlY2tcbiAgICAgICAgICAgICAgX3RoaXMucmVSZW5kZXIoKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBIYW5kbGUgdXBkYXRlIGJ5IGBzZXRGaWVsZGAgd2l0aCBgc2hvdWxkVXBkYXRlYFxuICAgICAgICAgICAgaWYgKHNob3VsZFVwZGF0ZSAmJiAhbmFtZVBhdGgubGVuZ3RoICYmIHJlcXVpcmVVcGRhdGUoc2hvdWxkVXBkYXRlLCBwcmV2U3RvcmUsIHN0b3JlLCBwcmV2VmFsdWUsIGN1clZhbHVlLCBpbmZvKSkge1xuICAgICAgICAgICAgICBfdGhpcy5yZVJlbmRlcigpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RlcGVuZGVuY2llc1VwZGF0ZSc6XG4gICAgICAgICAge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBUcmlnZ2VyIHdoZW4gbWFya2VkIGBkZXBlbmRlbmNpZXNgIHVwZGF0ZWQuIFJlbGF0ZWQgZmllbGRzIHdpbGwgYWxsIHVwZGF0ZVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICB2YXIgZGVwZW5kZW5jeUxpc3QgPSBkZXBlbmRlbmNpZXMubWFwKGdldE5hbWVQYXRoKTtcbiAgICAgICAgICAgIC8vIE5vIG5lZWQgZm9yIGBuYW1lUGF0aE1hdGhgIGNoZWNrIGFuZCBgc2hvdWxkVXBkYXRlYCBjaGVjaywgc2luY2UgYHZhbHVlVXBkYXRlYCB3aWxsIGJlXG4gICAgICAgICAgICAvLyBlbWl0dGVkIGVhcmxpZXIgYW5kIHRoZXkgd2lsbCB3b3JrIHRoZXJlXG4gICAgICAgICAgICAvLyBJZiBzZXQgaXQgbWF5IGNhdXNlIHVubmVjZXNzYXJ5IHR3aWNlIHJlcmVuZGVyaW5nXG4gICAgICAgICAgICBpZiAoZGVwZW5kZW5jeUxpc3Quc29tZShmdW5jdGlvbiAoZGVwZW5kZW5jeSkge1xuICAgICAgICAgICAgICByZXR1cm4gY29udGFpbnNOYW1lUGF0aChpbmZvLnJlbGF0ZWRGaWVsZHMsIGRlcGVuZGVuY3kpO1xuICAgICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgICAgX3RoaXMucmVSZW5kZXIoKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIDEuIElmIGBuYW1lUGF0aGAgZXhpc3RzIGluIGBuYW1lUGF0aExpc3RgLCBtZWFucyBpdCdzIHJlbGF0ZWQgdmFsdWUgYW5kIHNob3VsZCB1cGRhdGVcbiAgICAgICAgICAvLyAgICAgIEZvciBleGFtcGxlIDxMaXN0IG5hbWU9XCJsaXN0XCI+PEZpZWxkIG5hbWU9e1snbGlzdCcsIDBdfT48L0xpc3Q+XG4gICAgICAgICAgLy8gICAgICBJZiBgbmFtZVBhdGhMaXN0YCBpcyBbWydsaXN0J11dIChMaXN0IHZhbHVlIHVwZGF0ZSksIEZpZWxkIHNob3VsZCBiZSB1cGRhdGVkXG4gICAgICAgICAgLy8gICAgICBJZiBgbmFtZVBhdGhMaXN0YCBpcyBbWydsaXN0JywgMF1dIChGaWVsZCB2YWx1ZSB1cGRhdGUpLCBMaXN0IHNob3VsZG4ndCBiZSB1cGRhdGVkXG4gICAgICAgICAgLy8gMi5cbiAgICAgICAgICAvLyAgIDIuMSBJZiBgZGVwZW5kZW5jaWVzYCBpcyBzZXQsIGBuYW1lYCBpcyBub3Qgc2V0IGFuZCBgc2hvdWxkVXBkYXRlYCBpcyBub3Qgc2V0LFxuICAgICAgICAgIC8vICAgICAgIGRvbid0IHVzZSBgc2hvdWxkVXBkYXRlYC4gYGRlcGVuZGVuY2llc2AgaXMgdmlldyBhcyBhIHNob3J0Y3V0IGlmIGBzaG91bGRVcGRhdGVgXG4gICAgICAgICAgLy8gICAgICAgaXMgbm90IHByb3ZpZGVkXG4gICAgICAgICAgLy8gICAyLjIgSWYgYHNob3VsZFVwZGF0ZWAgcHJvdmlkZWQsIHVzZSBjdXN0b21pemUgbG9naWMgdG8gdXBkYXRlIHRoZSBmaWVsZFxuICAgICAgICAgIC8vICAgICAgIGVsc2UgdG8gY2hlY2sgaWYgdmFsdWUgY2hhbmdlZFxuICAgICAgICAgIGlmIChuYW1lUGF0aE1hdGNoIHx8ICghZGVwZW5kZW5jaWVzLmxlbmd0aCB8fCBuYW1lUGF0aC5sZW5ndGggfHwgc2hvdWxkVXBkYXRlKSAmJiByZXF1aXJlVXBkYXRlKHNob3VsZFVwZGF0ZSwgcHJldlN0b3JlLCBzdG9yZSwgcHJldlZhbHVlLCBjdXJWYWx1ZSwgaW5mbykpIHtcbiAgICAgICAgICAgIF90aGlzLnJlUmVuZGVyKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFVwZGF0ZSA9PT0gdHJ1ZSkge1xuICAgICAgICBfdGhpcy5yZVJlbmRlcigpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJ2YWxpZGF0ZVJ1bGVzXCIsIGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAvLyBXZSBzaG91bGQgZml4ZWQgbmFtZVBhdGggJiB2YWx1ZSB0byBhdm9pZCBkZXZlbG9wZXIgY2hhbmdlIHRoZW4gYnkgZm9ybSBmdW5jdGlvblxuICAgICAgdmFyIG5hbWVQYXRoID0gX3RoaXMuZ2V0TmFtZVBhdGgoKTtcbiAgICAgIHZhciBjdXJyZW50VmFsdWUgPSBfdGhpcy5nZXRWYWx1ZSgpO1xuICAgICAgdmFyIF9yZWYyID0gb3B0aW9ucyB8fCB7fSxcbiAgICAgICAgdHJpZ2dlck5hbWUgPSBfcmVmMi50cmlnZ2VyTmFtZSxcbiAgICAgICAgX3JlZjIkdmFsaWRhdGVPbmx5ID0gX3JlZjIudmFsaWRhdGVPbmx5LFxuICAgICAgICB2YWxpZGF0ZU9ubHkgPSBfcmVmMiR2YWxpZGF0ZU9ubHkgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZjIkdmFsaWRhdGVPbmx5O1xuXG4gICAgICAvLyBGb3JjZSBjaGFuZ2UgdG8gYXN5bmMgdG8gYXZvaWQgcnVsZSBPT0QgdW5kZXIgcmVuZGVyUHJvcHMgZmllbGRcbiAgICAgIHZhciByb290UHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oIC8qI19fUFVSRV9fKi9fYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7XG4gICAgICAgIHZhciBfdGhpcyRwcm9wczUsIF90aGlzJHByb3BzNSR2YWxpZGF0ZSwgdmFsaWRhdGVGaXJzdCwgbWVzc2FnZVZhcmlhYmxlcywgdmFsaWRhdGVEZWJvdW5jZSwgZmlsdGVyZWRSdWxlcywgcHJvbWlzZTtcbiAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgaWYgKF90aGlzLm1vdW50ZWQpIHtcbiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIFtdKTtcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgX3RoaXMkcHJvcHM1ID0gX3RoaXMucHJvcHMsIF90aGlzJHByb3BzNSR2YWxpZGF0ZSA9IF90aGlzJHByb3BzNS52YWxpZGF0ZUZpcnN0LCB2YWxpZGF0ZUZpcnN0ID0gX3RoaXMkcHJvcHM1JHZhbGlkYXRlID09PSB2b2lkIDAgPyBmYWxzZSA6IF90aGlzJHByb3BzNSR2YWxpZGF0ZSwgbWVzc2FnZVZhcmlhYmxlcyA9IF90aGlzJHByb3BzNS5tZXNzYWdlVmFyaWFibGVzLCB2YWxpZGF0ZURlYm91bmNlID0gX3RoaXMkcHJvcHM1LnZhbGlkYXRlRGVib3VuY2U7IC8vIFN0YXJ0IHZhbGlkYXRlXG4gICAgICAgICAgICAgIGZpbHRlcmVkUnVsZXMgPSBfdGhpcy5nZXRSdWxlcygpO1xuICAgICAgICAgICAgICBpZiAodHJpZ2dlck5hbWUpIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXJlZFJ1bGVzID0gZmlsdGVyZWRSdWxlcy5maWx0ZXIoZnVuY3Rpb24gKHJ1bGUpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBydWxlO1xuICAgICAgICAgICAgICAgIH0pLmZpbHRlcihmdW5jdGlvbiAocnVsZSkge1xuICAgICAgICAgICAgICAgICAgdmFyIHZhbGlkYXRlVHJpZ2dlciA9IHJ1bGUudmFsaWRhdGVUcmlnZ2VyO1xuICAgICAgICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZVRyaWdnZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB2YXIgdHJpZ2dlckxpc3QgPSB0b0FycmF5KHZhbGlkYXRlVHJpZ2dlcik7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gdHJpZ2dlckxpc3QuaW5jbHVkZXModHJpZ2dlck5hbWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gV2FpdCBmb3IgZGVib3VuY2UuIFNraXAgaWYgbm8gYHRyaWdnZXJOYW1lYCBzaW5jZSBpdHMgZnJvbSBgdmFsaWRhdGVGaWVsZHMgLyBzdWJtaXRgXG4gICAgICAgICAgICAgIGlmICghKHZhbGlkYXRlRGVib3VuY2UgJiYgdHJpZ2dlck5hbWUpKSB7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEwO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA4O1xuICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIHZhbGlkYXRlRGVib3VuY2UpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgaWYgKCEoX3RoaXMudmFsaWRhdGVQcm9taXNlICE9PSByb290UHJvbWlzZSkpIHtcbiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdChcInJldHVyblwiLCBbXSk7XG4gICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICBwcm9taXNlID0gdmFsaWRhdGVSdWxlcyhuYW1lUGF0aCwgY3VycmVudFZhbHVlLCBmaWx0ZXJlZFJ1bGVzLCBvcHRpb25zLCB2YWxpZGF0ZUZpcnN0LCBtZXNzYWdlVmFyaWFibGVzKTtcbiAgICAgICAgICAgICAgcHJvbWlzZS5jYXRjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgcnVsZUVycm9ycyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogRU1QVFlfRVJST1JTO1xuICAgICAgICAgICAgICAgIGlmIChfdGhpcy52YWxpZGF0ZVByb21pc2UgPT09IHJvb3RQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgX3J1bGVFcnJvcnMkZm9yRWFjaDtcbiAgICAgICAgICAgICAgICAgIF90aGlzLnZhbGlkYXRlUHJvbWlzZSA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgIC8vIEdldCBlcnJvcnMgJiB3YXJuaW5nc1xuICAgICAgICAgICAgICAgICAgdmFyIG5leHRFcnJvcnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgIHZhciBuZXh0V2FybmluZ3MgPSBbXTtcbiAgICAgICAgICAgICAgICAgIChfcnVsZUVycm9ycyRmb3JFYWNoID0gcnVsZUVycm9ycy5mb3JFYWNoKSA9PT0gbnVsbCB8fCBfcnVsZUVycm9ycyRmb3JFYWNoID09PSB2b2lkIDAgfHwgX3J1bGVFcnJvcnMkZm9yRWFjaC5jYWxsKHJ1bGVFcnJvcnMsIGZ1bmN0aW9uIChfcmVmNCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgd2FybmluZ09ubHkgPSBfcmVmNC5ydWxlLndhcm5pbmdPbmx5LFxuICAgICAgICAgICAgICAgICAgICAgIF9yZWY0JGVycm9ycyA9IF9yZWY0LmVycm9ycyxcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMgPSBfcmVmNCRlcnJvcnMgPT09IHZvaWQgMCA/IEVNUFRZX0VSUk9SUyA6IF9yZWY0JGVycm9ycztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdhcm5pbmdPbmx5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgbmV4dFdhcm5pbmdzLnB1c2guYXBwbHkobmV4dFdhcm5pbmdzLCBfdG9Db25zdW1hYmxlQXJyYXkoZXJyb3JzKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgbmV4dEVycm9ycy5wdXNoLmFwcGx5KG5leHRFcnJvcnMsIF90b0NvbnN1bWFibGVBcnJheShlcnJvcnMpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBfdGhpcy5lcnJvcnMgPSBuZXh0RXJyb3JzO1xuICAgICAgICAgICAgICAgICAgX3RoaXMud2FybmluZ3MgPSBuZXh0V2FybmluZ3M7XG4gICAgICAgICAgICAgICAgICBfdGhpcy50cmlnZ2VyTWV0YUV2ZW50KCk7XG4gICAgICAgICAgICAgICAgICBfdGhpcy5yZVJlbmRlcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgcHJvbWlzZSk7XG4gICAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgX2NhbGxlZSk7XG4gICAgICB9KSkpO1xuICAgICAgaWYgKHZhbGlkYXRlT25seSkge1xuICAgICAgICByZXR1cm4gcm9vdFByb21pc2U7XG4gICAgICB9XG4gICAgICBfdGhpcy52YWxpZGF0ZVByb21pc2UgPSByb290UHJvbWlzZTtcbiAgICAgIF90aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICAgIF90aGlzLmVycm9ycyA9IEVNUFRZX0VSUk9SUztcbiAgICAgIF90aGlzLndhcm5pbmdzID0gRU1QVFlfRVJST1JTO1xuICAgICAgX3RoaXMudHJpZ2dlck1ldGFFdmVudCgpO1xuXG4gICAgICAvLyBGb3JjZSB0cmlnZ2VyIHJlLXJlbmRlciBzaW5jZSB3ZSBuZWVkIHN5bmMgcmVuZGVyUHJvcHMgd2l0aCBuZXcgbWV0YVxuICAgICAgX3RoaXMucmVSZW5kZXIoKTtcbiAgICAgIHJldHVybiByb290UHJvbWlzZTtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiaXNGaWVsZFZhbGlkYXRpbmdcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICEhX3RoaXMudmFsaWRhdGVQcm9taXNlO1xuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJpc0ZpZWxkVG91Y2hlZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMudG91Y2hlZDtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiaXNGaWVsZERpcnR5XCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFRvdWNoZWQgb3IgdmFsaWRhdGUgb3IgaGFzIGluaXRpYWxWYWx1ZVxuICAgICAgaWYgKF90aGlzLmRpcnR5IHx8IF90aGlzLnByb3BzLmluaXRpYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBGb3JtIHNldCBpbml0aWFsVmFsdWVcbiAgICAgIHZhciBmaWVsZENvbnRleHQgPSBfdGhpcy5wcm9wcy5maWVsZENvbnRleHQ7XG4gICAgICB2YXIgX2ZpZWxkQ29udGV4dCRnZXRJbnRlID0gZmllbGRDb250ZXh0LmdldEludGVybmFsSG9va3MoSE9PS19NQVJLKSxcbiAgICAgICAgZ2V0SW5pdGlhbFZhbHVlID0gX2ZpZWxkQ29udGV4dCRnZXRJbnRlLmdldEluaXRpYWxWYWx1ZTtcbiAgICAgIGlmIChnZXRJbml0aWFsVmFsdWUoX3RoaXMuZ2V0TmFtZVBhdGgoKSkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiZ2V0RXJyb3JzXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy5lcnJvcnM7XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImdldFdhcm5pbmdzXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy53YXJuaW5ncztcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiaXNMaXN0RmllbGRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLnByb3BzLmlzTGlzdEZpZWxkO1xuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJpc0xpc3RcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLnByb3BzLmlzTGlzdDtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiaXNQcmVzZXJ2ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMucHJvcHMucHJlc2VydmU7XG4gICAgfSk7XG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQ2hpbGQgQ29tcG9uZW50ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImdldE1ldGFcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gTWFrZSBlcnJvciAmIHZhbGlkYXRpbmcgaW4gY2FjaGUgdG8gc2F2ZSBwZXJmXG4gICAgICBfdGhpcy5wcmV2VmFsaWRhdGluZyA9IF90aGlzLmlzRmllbGRWYWxpZGF0aW5nKCk7XG4gICAgICB2YXIgbWV0YSA9IHtcbiAgICAgICAgdG91Y2hlZDogX3RoaXMuaXNGaWVsZFRvdWNoZWQoKSxcbiAgICAgICAgdmFsaWRhdGluZzogX3RoaXMucHJldlZhbGlkYXRpbmcsXG4gICAgICAgIGVycm9yczogX3RoaXMuZXJyb3JzLFxuICAgICAgICB3YXJuaW5nczogX3RoaXMud2FybmluZ3MsXG4gICAgICAgIG5hbWU6IF90aGlzLmdldE5hbWVQYXRoKCksXG4gICAgICAgIHZhbGlkYXRlZDogX3RoaXMudmFsaWRhdGVQcm9taXNlID09PSBudWxsXG4gICAgICB9O1xuICAgICAgcmV0dXJuIG1ldGE7XG4gICAgfSk7XG4gICAgLy8gT25seSByZXR1cm4gdmFsaWRhdGUgY2hpbGQgbm9kZS4gSWYgaW52YWxpZGF0ZSwgd2lsbCBkbyBub3RoaW5nIGFib3V0IGZpZWxkLlxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJnZXRPbmx5Q2hpbGRcIiwgZnVuY3Rpb24gKGNoaWxkcmVuKSB7XG4gICAgICAvLyBTdXBwb3J0IHJlbmRlciBwcm9wc1xuICAgICAgaWYgKHR5cGVvZiBjaGlsZHJlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YXIgX21ldGEyID0gX3RoaXMuZ2V0TWV0YSgpO1xuICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBfdGhpcy5nZXRPbmx5Q2hpbGQoY2hpbGRyZW4oX3RoaXMuZ2V0Q29udHJvbGxlZCgpLCBfbWV0YTIsIF90aGlzLnByb3BzLmZpZWxkQ29udGV4dCkpKSwge30sIHtcbiAgICAgICAgICBpc0Z1bmN0aW9uOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBGaWxlZCBlbGVtZW50IG9ubHlcbiAgICAgIHZhciBjaGlsZExpc3QgPSB0b0NoaWxkcmVuQXJyYXkoY2hpbGRyZW4pO1xuICAgICAgaWYgKGNoaWxkTGlzdC5sZW5ndGggIT09IDEgfHwgISAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoY2hpbGRMaXN0WzBdKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNoaWxkOiBjaGlsZExpc3QsXG4gICAgICAgICAgaXNGdW5jdGlvbjogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNoaWxkOiBjaGlsZExpc3RbMF0sXG4gICAgICAgIGlzRnVuY3Rpb246IGZhbHNlXG4gICAgICB9O1xuICAgIH0pO1xuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBGaWVsZCBDb250cm9sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJnZXRWYWx1ZVwiLCBmdW5jdGlvbiAoc3RvcmUpIHtcbiAgICAgIHZhciBnZXRGaWVsZHNWYWx1ZSA9IF90aGlzLnByb3BzLmZpZWxkQ29udGV4dC5nZXRGaWVsZHNWYWx1ZTtcbiAgICAgIHZhciBuYW1lUGF0aCA9IF90aGlzLmdldE5hbWVQYXRoKCk7XG4gICAgICByZXR1cm4gZ2V0VmFsdWUoc3RvcmUgfHwgZ2V0RmllbGRzVmFsdWUodHJ1ZSksIG5hbWVQYXRoKTtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiZ2V0Q29udHJvbGxlZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgY2hpbGRQcm9wcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICB2YXIgX3RoaXMkcHJvcHM2ID0gX3RoaXMucHJvcHMsXG4gICAgICAgIG5hbWUgPSBfdGhpcyRwcm9wczYubmFtZSxcbiAgICAgICAgdHJpZ2dlciA9IF90aGlzJHByb3BzNi50cmlnZ2VyLFxuICAgICAgICB2YWxpZGF0ZVRyaWdnZXIgPSBfdGhpcyRwcm9wczYudmFsaWRhdGVUcmlnZ2VyLFxuICAgICAgICBnZXRWYWx1ZUZyb21FdmVudCA9IF90aGlzJHByb3BzNi5nZXRWYWx1ZUZyb21FdmVudCxcbiAgICAgICAgbm9ybWFsaXplID0gX3RoaXMkcHJvcHM2Lm5vcm1hbGl6ZSxcbiAgICAgICAgdmFsdWVQcm9wTmFtZSA9IF90aGlzJHByb3BzNi52YWx1ZVByb3BOYW1lLFxuICAgICAgICBnZXRWYWx1ZVByb3BzID0gX3RoaXMkcHJvcHM2LmdldFZhbHVlUHJvcHMsXG4gICAgICAgIGZpZWxkQ29udGV4dCA9IF90aGlzJHByb3BzNi5maWVsZENvbnRleHQ7XG4gICAgICB2YXIgbWVyZ2VkVmFsaWRhdGVUcmlnZ2VyID0gdmFsaWRhdGVUcmlnZ2VyICE9PSB1bmRlZmluZWQgPyB2YWxpZGF0ZVRyaWdnZXIgOiBmaWVsZENvbnRleHQudmFsaWRhdGVUcmlnZ2VyO1xuICAgICAgdmFyIG5hbWVQYXRoID0gX3RoaXMuZ2V0TmFtZVBhdGgoKTtcbiAgICAgIHZhciBnZXRJbnRlcm5hbEhvb2tzID0gZmllbGRDb250ZXh0LmdldEludGVybmFsSG9va3MsXG4gICAgICAgIGdldEZpZWxkc1ZhbHVlID0gZmllbGRDb250ZXh0LmdldEZpZWxkc1ZhbHVlO1xuICAgICAgdmFyIF9nZXRJbnRlcm5hbEhvb2tzID0gZ2V0SW50ZXJuYWxIb29rcyhIT09LX01BUkspLFxuICAgICAgICBkaXNwYXRjaCA9IF9nZXRJbnRlcm5hbEhvb2tzLmRpc3BhdGNoO1xuICAgICAgdmFyIHZhbHVlID0gX3RoaXMuZ2V0VmFsdWUoKTtcbiAgICAgIHZhciBtZXJnZWRHZXRWYWx1ZVByb3BzID0gZ2V0VmFsdWVQcm9wcyB8fCBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgIHJldHVybiBfZGVmaW5lUHJvcGVydHkoe30sIHZhbHVlUHJvcE5hbWUsIHZhbCk7XG4gICAgICB9O1xuICAgICAgdmFyIG9yaWdpblRyaWdnZXJGdW5jID0gY2hpbGRQcm9wc1t0cmlnZ2VyXTtcbiAgICAgIHZhciB2YWx1ZVByb3BzID0gbmFtZSAhPT0gdW5kZWZpbmVkID8gbWVyZ2VkR2V0VmFsdWVQcm9wcyh2YWx1ZSkgOiB7fTtcblxuICAgICAgLy8gd2FybmluZyB3aGVuIHByb3AgdmFsdWUgaXMgZnVuY3Rpb25cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHZhbHVlUHJvcHMpIHtcbiAgICAgICAgT2JqZWN0LmtleXModmFsdWVQcm9wcykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgd2FybmluZyh0eXBlb2YgdmFsdWVQcm9wc1trZXldICE9PSAnZnVuY3Rpb24nLCBcIkl0J3Mgbm90IHJlY29tbWVuZGVkIHRvIGdlbmVyYXRlIGR5bmFtaWMgZnVuY3Rpb24gcHJvcCBieSBgZ2V0VmFsdWVQcm9wc2AuIFBsZWFzZSBwYXNzIGl0IHRvIGNoaWxkIGNvbXBvbmVudCBkaXJlY3RseSAocHJvcDogXCIuY29uY2F0KGtleSwgXCIpXCIpKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB2YXIgY29udHJvbCA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgY2hpbGRQcm9wcyksIHZhbHVlUHJvcHMpO1xuXG4gICAgICAvLyBBZGQgdHJpZ2dlclxuICAgICAgY29udHJvbFt0cmlnZ2VyXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gTWFyayBhcyB0b3VjaGVkXG4gICAgICAgIF90aGlzLnRvdWNoZWQgPSB0cnVlO1xuICAgICAgICBfdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgICAgIF90aGlzLnRyaWdnZXJNZXRhRXZlbnQoKTtcbiAgICAgICAgdmFyIG5ld1ZhbHVlO1xuICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgICB9XG4gICAgICAgIGlmIChnZXRWYWx1ZUZyb21FdmVudCkge1xuICAgICAgICAgIG5ld1ZhbHVlID0gZ2V0VmFsdWVGcm9tRXZlbnQuYXBwbHkodm9pZCAwLCBhcmdzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IGRlZmF1bHRHZXRWYWx1ZUZyb21FdmVudC5hcHBseSh2b2lkIDAsIFt2YWx1ZVByb3BOYW1lXS5jb25jYXQoYXJncykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub3JtYWxpemUpIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IG5vcm1hbGl6ZShuZXdWYWx1ZSwgdmFsdWUsIGdldEZpZWxkc1ZhbHVlKHRydWUpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobmV3VmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgICAgdHlwZTogJ3VwZGF0ZVZhbHVlJyxcbiAgICAgICAgICAgIG5hbWVQYXRoOiBuYW1lUGF0aCxcbiAgICAgICAgICAgIHZhbHVlOiBuZXdWYWx1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcmlnaW5UcmlnZ2VyRnVuYykge1xuICAgICAgICAgIG9yaWdpblRyaWdnZXJGdW5jLmFwcGx5KHZvaWQgMCwgYXJncyk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIC8vIEFkZCB2YWxpZGF0ZVRyaWdnZXJcbiAgICAgIHZhciB2YWxpZGF0ZVRyaWdnZXJMaXN0ID0gdG9BcnJheShtZXJnZWRWYWxpZGF0ZVRyaWdnZXIgfHwgW10pO1xuICAgICAgdmFsaWRhdGVUcmlnZ2VyTGlzdC5mb3JFYWNoKGZ1bmN0aW9uICh0cmlnZ2VyTmFtZSkge1xuICAgICAgICAvLyBXcmFwIGFkZGl0aW9uYWwgZnVuY3Rpb24gb2YgY29tcG9uZW50LCBzbyB0aGF0IHdlIGNhbiBnZXQgbGF0ZXN0IHZhbHVlIGZyb20gc3RvcmVcbiAgICAgICAgdmFyIG9yaWdpblRyaWdnZXIgPSBjb250cm9sW3RyaWdnZXJOYW1lXTtcbiAgICAgICAgY29udHJvbFt0cmlnZ2VyTmFtZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKG9yaWdpblRyaWdnZXIpIHtcbiAgICAgICAgICAgIG9yaWdpblRyaWdnZXIuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEFsd2F5cyB1c2UgbGF0ZXN0IHJ1bGVzXG4gICAgICAgICAgdmFyIHJ1bGVzID0gX3RoaXMucHJvcHMucnVsZXM7XG4gICAgICAgICAgaWYgKHJ1bGVzICYmIHJ1bGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gV2UgZGlzcGF0Y2ggdmFsaWRhdGUgdG8gcm9vdCxcbiAgICAgICAgICAgIC8vIHNpbmNlIGl0IHdpbGwgdXBkYXRlIHJlbGF0ZWQgZGF0YSB3aXRoIG90aGVyIGZpZWxkIHdpdGggc2FtZSBuYW1lXG4gICAgICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgICAgIHR5cGU6ICd2YWxpZGF0ZUZpZWxkJyxcbiAgICAgICAgICAgICAgbmFtZVBhdGg6IG5hbWVQYXRoLFxuICAgICAgICAgICAgICB0cmlnZ2VyTmFtZTogdHJpZ2dlck5hbWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGNvbnRyb2w7XG4gICAgfSk7XG4gICAgaWYgKHByb3BzLmZpZWxkQ29udGV4dCkge1xuICAgICAgdmFyIGdldEludGVybmFsSG9va3MgPSBwcm9wcy5maWVsZENvbnRleHQuZ2V0SW50ZXJuYWxIb29rcztcbiAgICAgIHZhciBfZ2V0SW50ZXJuYWxIb29rczIgPSBnZXRJbnRlcm5hbEhvb2tzKEhPT0tfTUFSSyksXG4gICAgICAgIGluaXRFbnRpdHlWYWx1ZSA9IF9nZXRJbnRlcm5hbEhvb2tzMi5pbml0RW50aXR5VmFsdWU7XG4gICAgICBpbml0RW50aXR5VmFsdWUoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuICAgIH1cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgX2NyZWF0ZUNsYXNzKEZpZWxkLCBbe1xuICAgIGtleTogXCJjb21wb25lbnREaWRNb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczcgPSB0aGlzLnByb3BzLFxuICAgICAgICBzaG91bGRVcGRhdGUgPSBfdGhpcyRwcm9wczcuc2hvdWxkVXBkYXRlLFxuICAgICAgICBmaWVsZENvbnRleHQgPSBfdGhpcyRwcm9wczcuZmllbGRDb250ZXh0O1xuICAgICAgdGhpcy5tb3VudGVkID0gdHJ1ZTtcblxuICAgICAgLy8gUmVnaXN0ZXIgb24gaW5pdFxuICAgICAgaWYgKGZpZWxkQ29udGV4dCkge1xuICAgICAgICB2YXIgZ2V0SW50ZXJuYWxIb29rcyA9IGZpZWxkQ29udGV4dC5nZXRJbnRlcm5hbEhvb2tzO1xuICAgICAgICB2YXIgX2dldEludGVybmFsSG9va3MzID0gZ2V0SW50ZXJuYWxIb29rcyhIT09LX01BUkspLFxuICAgICAgICAgIHJlZ2lzdGVyRmllbGQgPSBfZ2V0SW50ZXJuYWxIb29rczMucmVnaXN0ZXJGaWVsZDtcbiAgICAgICAgdGhpcy5jYW5jZWxSZWdpc3RlckZ1bmMgPSByZWdpc3RlckZpZWxkKHRoaXMpO1xuICAgICAgfVxuXG4gICAgICAvLyBPbmUgbW9yZSByZW5kZXIgZm9yIGNvbXBvbmVudCBpbiBjYXNlIGZpZWxkcyBub3QgcmVhZHlcbiAgICAgIGlmIChzaG91bGRVcGRhdGUgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5yZVJlbmRlcigpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnRXaWxsVW5tb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIHRoaXMuY2FuY2VsUmVnaXN0ZXIoKTtcbiAgICAgIHRoaXMudHJpZ2dlck1ldGFFdmVudCh0cnVlKTtcbiAgICAgIHRoaXMubW91bnRlZCA9IGZhbHNlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZVJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZVJlbmRlcigpIHtcbiAgICAgIGlmICghdGhpcy5tb3VudGVkKSByZXR1cm47XG4gICAgICB0aGlzLmZvcmNlVXBkYXRlKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgcmVzZXRDb3VudCA9IHRoaXMuc3RhdGUucmVzZXRDb3VudDtcbiAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMucHJvcHMuY2hpbGRyZW47XG4gICAgICB2YXIgX3RoaXMkZ2V0T25seUNoaWxkID0gdGhpcy5nZXRPbmx5Q2hpbGQoY2hpbGRyZW4pLFxuICAgICAgICBjaGlsZCA9IF90aGlzJGdldE9ubHlDaGlsZC5jaGlsZCxcbiAgICAgICAgaXNGdW5jdGlvbiA9IF90aGlzJGdldE9ubHlDaGlsZC5pc0Z1bmN0aW9uO1xuXG4gICAgICAvLyBOb3QgbmVlZCB0byBgY2xvbmVFbGVtZW50YCBzaW5jZSB1c2VyIGNhbiBoYW5kbGUgdGhpcyBpbiByZW5kZXIgZnVuY3Rpb24gc2VsZlxuICAgICAgdmFyIHJldHVybkNoaWxkTm9kZTtcbiAgICAgIGlmIChpc0Z1bmN0aW9uKSB7XG4gICAgICAgIHJldHVybkNoaWxkTm9kZSA9IGNoaWxkO1xuICAgICAgfSBlbHNlIGlmICggLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KGNoaWxkKSkge1xuICAgICAgICByZXR1cm5DaGlsZE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkLCB0aGlzLmdldENvbnRyb2xsZWQoY2hpbGQucHJvcHMpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdhcm5pbmcoIWNoaWxkLCAnYGNoaWxkcmVuYCBvZiBGaWVsZCBpcyBub3QgdmFsaWRhdGUgUmVhY3RFbGVtZW50LicpO1xuICAgICAgICByZXR1cm5DaGlsZE5vZGUgPSBjaGlsZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwge1xuICAgICAgICBrZXk6IHJlc2V0Q291bnRcbiAgICAgIH0sIHJldHVybkNoaWxkTm9kZSk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBGaWVsZDtcbn0oUmVhY3QuQ29tcG9uZW50KTtcbl9kZWZpbmVQcm9wZXJ0eShGaWVsZCwgXCJjb250ZXh0VHlwZVwiLCBGaWVsZENvbnRleHQpO1xuX2RlZmluZVByb3BlcnR5KEZpZWxkLCBcImRlZmF1bHRQcm9wc1wiLCB7XG4gIHRyaWdnZXI6ICdvbkNoYW5nZScsXG4gIHZhbHVlUHJvcE5hbWU6ICd2YWx1ZSdcbn0pO1xuZnVuY3Rpb24gV3JhcHBlckZpZWxkKF9yZWY2KSB7XG4gIHZhciBfcmVzdFByb3BzJGlzTGlzdEZpZWw7XG4gIHZhciBuYW1lID0gX3JlZjYubmFtZSxcbiAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZjYsIF9leGNsdWRlZCk7XG4gIHZhciBmaWVsZENvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KEZpZWxkQ29udGV4dCk7XG4gIHZhciBsaXN0Q29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoTGlzdENvbnRleHQpO1xuICB2YXIgbmFtZVBhdGggPSBuYW1lICE9PSB1bmRlZmluZWQgPyBnZXROYW1lUGF0aChuYW1lKSA6IHVuZGVmaW5lZDtcbiAgdmFyIGlzTWVyZ2VkTGlzdEZpZWxkID0gKF9yZXN0UHJvcHMkaXNMaXN0RmllbCA9IHJlc3RQcm9wcy5pc0xpc3RGaWVsZCkgIT09IG51bGwgJiYgX3Jlc3RQcm9wcyRpc0xpc3RGaWVsICE9PSB2b2lkIDAgPyBfcmVzdFByb3BzJGlzTGlzdEZpZWwgOiAhIWxpc3RDb250ZXh0O1xuICB2YXIga2V5ID0gJ2tlZXAnO1xuICBpZiAoIWlzTWVyZ2VkTGlzdEZpZWxkKSB7XG4gICAga2V5ID0gXCJfXCIuY29uY2F0KChuYW1lUGF0aCB8fCBbXSkuam9pbignXycpKTtcbiAgfVxuXG4gIC8vIFdhcm5pbmcgaWYgaXQncyBhIGRpcmVjdGx5IGxpc3QgZmllbGQuXG4gIC8vIFdlIGNhbiBzdGlsbCBzdXBwb3J0IG11bHRpcGxlIGxldmVsIGZpZWxkIHByZXNlcnZlLlxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiByZXN0UHJvcHMucHJlc2VydmUgPT09IGZhbHNlICYmIGlzTWVyZ2VkTGlzdEZpZWxkICYmIG5hbWVQYXRoLmxlbmd0aCA8PSAxKSB7XG4gICAgd2FybmluZyhmYWxzZSwgJ2BwcmVzZXJ2ZWAgc2hvdWxkIG5vdCBhcHBseSBvbiBGb3JtLkxpc3QgZmllbGRzLicpO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGaWVsZCwgX2V4dGVuZHMoe1xuICAgIGtleToga2V5LFxuICAgIG5hbWU6IG5hbWVQYXRoLFxuICAgIGlzTGlzdEZpZWxkOiBpc01lcmdlZExpc3RGaWVsZFxuICB9LCByZXN0UHJvcHMsIHtcbiAgICBmaWVsZENvbnRleHQ6IGZpZWxkQ29udGV4dFxuICB9KSk7XG59XG5leHBvcnQgZGVmYXVsdCBXcmFwcGVyRmllbGQ7IiwgImltcG9ydCB3YXJuaW5nIGZyb20gXCJyYy11dGlsL2VzL3dhcm5pbmdcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCB2YXIgSE9PS19NQVJLID0gJ1JDX0ZPUk1fSU5URVJOQUxfSE9PS1MnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxudmFyIHdhcm5pbmdGdW5jID0gZnVuY3Rpb24gd2FybmluZ0Z1bmMoKSB7XG4gIHdhcm5pbmcoZmFsc2UsICdDYW4gbm90IGZpbmQgRm9ybUNvbnRleHQuIFBsZWFzZSBtYWtlIHN1cmUgeW91IHdyYXAgRmllbGQgdW5kZXIgRm9ybS4nKTtcbn07XG52YXIgQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHtcbiAgZ2V0RmllbGRWYWx1ZTogd2FybmluZ0Z1bmMsXG4gIGdldEZpZWxkc1ZhbHVlOiB3YXJuaW5nRnVuYyxcbiAgZ2V0RmllbGRFcnJvcjogd2FybmluZ0Z1bmMsXG4gIGdldEZpZWxkV2FybmluZzogd2FybmluZ0Z1bmMsXG4gIGdldEZpZWxkc0Vycm9yOiB3YXJuaW5nRnVuYyxcbiAgaXNGaWVsZHNUb3VjaGVkOiB3YXJuaW5nRnVuYyxcbiAgaXNGaWVsZFRvdWNoZWQ6IHdhcm5pbmdGdW5jLFxuICBpc0ZpZWxkVmFsaWRhdGluZzogd2FybmluZ0Z1bmMsXG4gIGlzRmllbGRzVmFsaWRhdGluZzogd2FybmluZ0Z1bmMsXG4gIHJlc2V0RmllbGRzOiB3YXJuaW5nRnVuYyxcbiAgc2V0RmllbGRzOiB3YXJuaW5nRnVuYyxcbiAgc2V0RmllbGRWYWx1ZTogd2FybmluZ0Z1bmMsXG4gIHNldEZpZWxkc1ZhbHVlOiB3YXJuaW5nRnVuYyxcbiAgdmFsaWRhdGVGaWVsZHM6IHdhcm5pbmdGdW5jLFxuICBzdWJtaXQ6IHdhcm5pbmdGdW5jLFxuICBnZXRJbnRlcm5hbEhvb2tzOiBmdW5jdGlvbiBnZXRJbnRlcm5hbEhvb2tzKCkge1xuICAgIHdhcm5pbmdGdW5jKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc3BhdGNoOiB3YXJuaW5nRnVuYyxcbiAgICAgIGluaXRFbnRpdHlWYWx1ZTogd2FybmluZ0Z1bmMsXG4gICAgICByZWdpc3RlckZpZWxkOiB3YXJuaW5nRnVuYyxcbiAgICAgIHVzZVN1YnNjcmliZTogd2FybmluZ0Z1bmMsXG4gICAgICBzZXRJbml0aWFsVmFsdWVzOiB3YXJuaW5nRnVuYyxcbiAgICAgIGRlc3Ryb3lGb3JtOiB3YXJuaW5nRnVuYyxcbiAgICAgIHNldENhbGxiYWNrczogd2FybmluZ0Z1bmMsXG4gICAgICByZWdpc3RlcldhdGNoOiB3YXJuaW5nRnVuYyxcbiAgICAgIGdldEZpZWxkczogd2FybmluZ0Z1bmMsXG4gICAgICBzZXRWYWxpZGF0ZU1lc3NhZ2VzOiB3YXJuaW5nRnVuYyxcbiAgICAgIHNldFByZXNlcnZlOiB3YXJuaW5nRnVuYyxcbiAgICAgIGdldEluaXRpYWxWYWx1ZTogd2FybmluZ0Z1bmNcbiAgICB9O1xuICB9XG59KTtcbmV4cG9ydCBkZWZhdWx0IENvbnRleHQ7IiwgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbnZhciBMaXN0Q29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuZXhwb3J0IGRlZmF1bHQgTGlzdENvbnRleHQ7IiwgImV4cG9ydCBmdW5jdGlvbiB0b0FycmF5KHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0Zvcm1JbnN0YW5jZShmb3JtKSB7XG4gIHJldHVybiBmb3JtICYmICEhZm9ybS5faW5pdDtcbn0iLCAiZXhwb3J0IGZ1bmN0aW9uIG5ld01lc3NhZ2VzKCkge1xuICByZXR1cm4ge1xuICAgIGRlZmF1bHQ6ICdWYWxpZGF0aW9uIGVycm9yIG9uIGZpZWxkICVzJyxcbiAgICByZXF1aXJlZDogJyVzIGlzIHJlcXVpcmVkJyxcbiAgICBlbnVtOiAnJXMgbXVzdCBiZSBvbmUgb2YgJXMnLFxuICAgIHdoaXRlc3BhY2U6ICclcyBjYW5ub3QgYmUgZW1wdHknLFxuICAgIGRhdGU6IHtcbiAgICAgIGZvcm1hdDogJyVzIGRhdGUgJXMgaXMgaW52YWxpZCBmb3IgZm9ybWF0ICVzJyxcbiAgICAgIHBhcnNlOiAnJXMgZGF0ZSBjb3VsZCBub3QgYmUgcGFyc2VkLCAlcyBpcyBpbnZhbGlkICcsXG4gICAgICBpbnZhbGlkOiAnJXMgZGF0ZSAlcyBpcyBpbnZhbGlkJ1xuICAgIH0sXG4gICAgdHlwZXM6IHtcbiAgICAgIHN0cmluZzogJyVzIGlzIG5vdCBhICVzJyxcbiAgICAgIG1ldGhvZDogJyVzIGlzIG5vdCBhICVzIChmdW5jdGlvbiknLFxuICAgICAgYXJyYXk6ICclcyBpcyBub3QgYW4gJXMnLFxuICAgICAgb2JqZWN0OiAnJXMgaXMgbm90IGFuICVzJyxcbiAgICAgIG51bWJlcjogJyVzIGlzIG5vdCBhICVzJyxcbiAgICAgIGRhdGU6ICclcyBpcyBub3QgYSAlcycsXG4gICAgICBib29sZWFuOiAnJXMgaXMgbm90IGEgJXMnLFxuICAgICAgaW50ZWdlcjogJyVzIGlzIG5vdCBhbiAlcycsXG4gICAgICBmbG9hdDogJyVzIGlzIG5vdCBhICVzJyxcbiAgICAgIHJlZ2V4cDogJyVzIGlzIG5vdCBhIHZhbGlkICVzJyxcbiAgICAgIGVtYWlsOiAnJXMgaXMgbm90IGEgdmFsaWQgJXMnLFxuICAgICAgdXJsOiAnJXMgaXMgbm90IGEgdmFsaWQgJXMnLFxuICAgICAgaGV4OiAnJXMgaXMgbm90IGEgdmFsaWQgJXMnXG4gICAgfSxcbiAgICBzdHJpbmc6IHtcbiAgICAgIGxlbjogJyVzIG11c3QgYmUgZXhhY3RseSAlcyBjaGFyYWN0ZXJzJyxcbiAgICAgIG1pbjogJyVzIG11c3QgYmUgYXQgbGVhc3QgJXMgY2hhcmFjdGVycycsXG4gICAgICBtYXg6ICclcyBjYW5ub3QgYmUgbG9uZ2VyIHRoYW4gJXMgY2hhcmFjdGVycycsXG4gICAgICByYW5nZTogJyVzIG11c3QgYmUgYmV0d2VlbiAlcyBhbmQgJXMgY2hhcmFjdGVycydcbiAgICB9LFxuICAgIG51bWJlcjoge1xuICAgICAgbGVuOiAnJXMgbXVzdCBlcXVhbCAlcycsXG4gICAgICBtaW46ICclcyBjYW5ub3QgYmUgbGVzcyB0aGFuICVzJyxcbiAgICAgIG1heDogJyVzIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gJXMnLFxuICAgICAgcmFuZ2U6ICclcyBtdXN0IGJlIGJldHdlZW4gJXMgYW5kICVzJ1xuICAgIH0sXG4gICAgYXJyYXk6IHtcbiAgICAgIGxlbjogJyVzIG11c3QgYmUgZXhhY3RseSAlcyBpbiBsZW5ndGgnLFxuICAgICAgbWluOiAnJXMgY2Fubm90IGJlIGxlc3MgdGhhbiAlcyBpbiBsZW5ndGgnLFxuICAgICAgbWF4OiAnJXMgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiAlcyBpbiBsZW5ndGgnLFxuICAgICAgcmFuZ2U6ICclcyBtdXN0IGJlIGJldHdlZW4gJXMgYW5kICVzIGluIGxlbmd0aCdcbiAgICB9LFxuICAgIHBhdHRlcm46IHtcbiAgICAgIG1pc21hdGNoOiAnJXMgdmFsdWUgJXMgZG9lcyBub3QgbWF0Y2ggcGF0dGVybiAlcydcbiAgICB9LFxuICAgIGNsb25lOiBmdW5jdGlvbiBjbG9uZSgpIHtcbiAgICAgIHZhciBjbG9uZWQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMpKTtcbiAgICAgIGNsb25lZC5jbG9uZSA9IHRoaXMuY2xvbmU7XG4gICAgICByZXR1cm4gY2xvbmVkO1xuICAgIH1cbiAgfTtcbn1cbmV4cG9ydCB2YXIgbWVzc2FnZXMgPSBuZXdNZXNzYWdlcygpOyIsICJmdW5jdGlvbiBfaXNOYXRpdmVGdW5jdGlvbih0KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIC0xICE9PSBGdW5jdGlvbi50b1N0cmluZy5jYWxsKHQpLmluZGV4T2YoXCJbbmF0aXZlIGNvZGVdXCIpO1xuICB9IGNhdGNoIChuKSB7XG4gICAgcmV0dXJuIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgdDtcbiAgfVxufVxuZXhwb3J0IHsgX2lzTmF0aXZlRnVuY3Rpb24gYXMgZGVmYXVsdCB9OyIsICJpbXBvcnQgaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IGZyb20gXCIuL2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdC5qc1wiO1xuaW1wb3J0IHNldFByb3RvdHlwZU9mIGZyb20gXCIuL3NldFByb3RvdHlwZU9mLmpzXCI7XG5mdW5jdGlvbiBfY29uc3RydWN0KHQsIGUsIHIpIHtcbiAgaWYgKGlzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpKSByZXR1cm4gUmVmbGVjdC5jb25zdHJ1Y3QuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgdmFyIG8gPSBbbnVsbF07XG4gIG8ucHVzaC5hcHBseShvLCBlKTtcbiAgdmFyIHAgPSBuZXcgKHQuYmluZC5hcHBseSh0LCBvKSkoKTtcbiAgcmV0dXJuIHIgJiYgc2V0UHJvdG90eXBlT2YocCwgci5wcm90b3R5cGUpLCBwO1xufVxuZXhwb3J0IHsgX2NvbnN0cnVjdCBhcyBkZWZhdWx0IH07IiwgImltcG9ydCBnZXRQcm90b3R5cGVPZiBmcm9tIFwiLi9nZXRQcm90b3R5cGVPZi5qc1wiO1xuaW1wb3J0IHNldFByb3RvdHlwZU9mIGZyb20gXCIuL3NldFByb3RvdHlwZU9mLmpzXCI7XG5pbXBvcnQgaXNOYXRpdmVGdW5jdGlvbiBmcm9tIFwiLi9pc05hdGl2ZUZ1bmN0aW9uLmpzXCI7XG5pbXBvcnQgY29uc3RydWN0IGZyb20gXCIuL2NvbnN0cnVjdC5qc1wiO1xuZnVuY3Rpb24gX3dyYXBOYXRpdmVTdXBlcih0KSB7XG4gIHZhciByID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBNYXAgPyBuZXcgTWFwKCkgOiB2b2lkIDA7XG4gIHJldHVybiBfd3JhcE5hdGl2ZVN1cGVyID0gZnVuY3Rpb24gX3dyYXBOYXRpdmVTdXBlcih0KSB7XG4gICAgaWYgKG51bGwgPT09IHQgfHwgIWlzTmF0aXZlRnVuY3Rpb24odCkpIHJldHVybiB0O1xuICAgIGlmIChcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIHQpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTtcbiAgICBpZiAodm9pZCAwICE9PSByKSB7XG4gICAgICBpZiAoci5oYXModCkpIHJldHVybiByLmdldCh0KTtcbiAgICAgIHIuc2V0KHQsIFdyYXBwZXIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBXcmFwcGVyKCkge1xuICAgICAgcmV0dXJuIGNvbnN0cnVjdCh0LCBhcmd1bWVudHMsIGdldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yKTtcbiAgICB9XG4gICAgcmV0dXJuIFdyYXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IFdyYXBwZXIsXG4gICAgICAgIGVudW1lcmFibGU6ICExLFxuICAgICAgICB3cml0YWJsZTogITAsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgIH1cbiAgICB9KSwgc2V0UHJvdG90eXBlT2YoV3JhcHBlciwgdCk7XG4gIH0sIF93cmFwTmF0aXZlU3VwZXIodCk7XG59XG5leHBvcnQgeyBfd3JhcE5hdGl2ZVN1cGVyIGFzIGRlZmF1bHQgfTsiLCAiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2Fzc2VydFRoaXNJbml0aWFsaXplZFwiO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNcIjtcbmltcG9ydCBfY3JlYXRlU3VwZXIgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZVN1cGVyXCI7XG5pbXBvcnQgX3dyYXBOYXRpdmVTdXBlciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vd3JhcE5hdGl2ZVN1cGVyXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbi8qIGVzbGludCBuby1jb25zb2xlOjAgKi9cblxudmFyIGZvcm1hdFJlZ0V4cCA9IC8lW3NkaiVdL2c7XG5leHBvcnQgdmFyIHdhcm5pbmcgPSBmdW5jdGlvbiB3YXJuaW5nKCkge307XG5cbi8vIGRvbid0IHByaW50IHdhcm5pbmcgbWVzc2FnZSB3aGVuIGluIHByb2R1Y3Rpb24gZW52IG9yIG5vZGUgcnVudGltZVxuaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLmVudiAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgd2FybmluZyA9IGZ1bmN0aW9uIHdhcm5pbmcodHlwZSwgZXJyb3JzKSB7XG4gICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJiBjb25zb2xlLndhcm4gJiYgdHlwZW9mIEFTWU5DX1ZBTElEQVRPUl9OT19XQVJOSU5HID09PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKGVycm9ycy5ldmVyeShmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIGUgPT09ICdzdHJpbmcnO1xuICAgICAgfSkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKHR5cGUsIGVycm9ycyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRGaWVsZHNFcnJvcihlcnJvcnMpIHtcbiAgaWYgKCFlcnJvcnMgfHwgIWVycm9ycy5sZW5ndGgpIHJldHVybiBudWxsO1xuICB2YXIgZmllbGRzID0ge307XG4gIGVycm9ycy5mb3JFYWNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgIHZhciBmaWVsZCA9IGVycm9yLmZpZWxkO1xuICAgIGZpZWxkc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdIHx8IFtdO1xuICAgIGZpZWxkc1tmaWVsZF0ucHVzaChlcnJvcik7XG4gIH0pO1xuICByZXR1cm4gZmllbGRzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdCh0ZW1wbGF0ZSkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cbiAgdmFyIGkgPSAwO1xuICB2YXIgbGVuID0gYXJncy5sZW5ndGg7XG4gIGlmICh0eXBlb2YgdGVtcGxhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLXNwcmVhZFxuICAgIHJldHVybiB0ZW1wbGF0ZS5hcHBseShudWxsLCBhcmdzKTtcbiAgfVxuICBpZiAodHlwZW9mIHRlbXBsYXRlID09PSAnc3RyaW5nJykge1xuICAgIHZhciBzdHIgPSB0ZW1wbGF0ZS5yZXBsYWNlKGZvcm1hdFJlZ0V4cCwgZnVuY3Rpb24gKHgpIHtcbiAgICAgIGlmICh4ID09PSAnJSUnKSB7XG4gICAgICAgIHJldHVybiAnJSc7XG4gICAgICB9XG4gICAgICBpZiAoaSA+PSBsZW4pIHtcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKHgpIHtcbiAgICAgICAgY2FzZSAnJXMnOlxuICAgICAgICAgIHJldHVybiBTdHJpbmcoYXJnc1tpKytdKTtcbiAgICAgICAgY2FzZSAnJWQnOlxuICAgICAgICAgIHJldHVybiBOdW1iZXIoYXJnc1tpKytdKTtcbiAgICAgICAgY2FzZSAnJWonOlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnc1tpKytdKTtcbiAgICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgICByZXR1cm4gJ1tDaXJjdWxhcl0nO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4geDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gc3RyO1xuICB9XG4gIHJldHVybiB0ZW1wbGF0ZTtcbn1cbmZ1bmN0aW9uIGlzTmF0aXZlU3RyaW5nVHlwZSh0eXBlKSB7XG4gIHJldHVybiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlID09PSAndXJsJyB8fCB0eXBlID09PSAnaGV4JyB8fCB0eXBlID09PSAnZW1haWwnIHx8IHR5cGUgPT09ICdkYXRlJyB8fCB0eXBlID09PSAncGF0dGVybic7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eVZhbHVlKHZhbHVlLCB0eXBlKSB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdhcnJheScgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgIXZhbHVlLmxlbmd0aCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChpc05hdGl2ZVN0cmluZ1R5cGUodHlwZSkgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAhdmFsdWUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eU9iamVjdChvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikubGVuZ3RoID09PSAwO1xufVxuZnVuY3Rpb24gYXN5bmNQYXJhbGxlbEFycmF5KGFyciwgZnVuYywgY2FsbGJhY2spIHtcbiAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgdmFyIHRvdGFsID0gMDtcbiAgdmFyIGFyckxlbmd0aCA9IGFyci5sZW5ndGg7XG4gIGZ1bmN0aW9uIGNvdW50KGVycm9ycykge1xuICAgIHJlc3VsdHMucHVzaC5hcHBseShyZXN1bHRzLCBfdG9Db25zdW1hYmxlQXJyYXkoZXJyb3JzIHx8IFtdKSk7XG4gICAgdG90YWwrKztcbiAgICBpZiAodG90YWwgPT09IGFyckxlbmd0aCkge1xuICAgICAgY2FsbGJhY2socmVzdWx0cyk7XG4gICAgfVxuICB9XG4gIGFyci5mb3JFYWNoKGZ1bmN0aW9uIChhKSB7XG4gICAgZnVuYyhhLCBjb3VudCk7XG4gIH0pO1xufVxuZnVuY3Rpb24gYXN5bmNTZXJpYWxBcnJheShhcnIsIGZ1bmMsIGNhbGxiYWNrKSB7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBhcnJMZW5ndGggPSBhcnIubGVuZ3RoO1xuICBmdW5jdGlvbiBuZXh0KGVycm9ycykge1xuICAgIGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCkge1xuICAgICAgY2FsbGJhY2soZXJyb3JzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIG9yaWdpbmFsID0gaW5kZXg7XG4gICAgaW5kZXggPSBpbmRleCArIDE7XG4gICAgaWYgKG9yaWdpbmFsIDwgYXJyTGVuZ3RoKSB7XG4gICAgICBmdW5jKGFycltvcmlnaW5hbF0sIG5leHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsYmFjayhbXSk7XG4gICAgfVxuICB9XG4gIG5leHQoW10pO1xufVxuZnVuY3Rpb24gZmxhdHRlbk9iakFycihvYmpBcnIpIHtcbiAgdmFyIHJldCA9IFtdO1xuICBPYmplY3Qua2V5cyhvYmpBcnIpLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICByZXQucHVzaC5hcHBseShyZXQsIF90b0NvbnN1bWFibGVBcnJheShvYmpBcnJba10gfHwgW10pKTtcbiAgfSk7XG4gIHJldHVybiByZXQ7XG59XG5leHBvcnQgdmFyIEFzeW5jVmFsaWRhdGlvbkVycm9yID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfRXJyb3IpIHtcbiAgX2luaGVyaXRzKEFzeW5jVmFsaWRhdGlvbkVycm9yLCBfRXJyb3IpO1xuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKEFzeW5jVmFsaWRhdGlvbkVycm9yKTtcbiAgZnVuY3Rpb24gQXN5bmNWYWxpZGF0aW9uRXJyb3IoZXJyb3JzLCBmaWVsZHMpIHtcbiAgICB2YXIgX3RoaXM7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEFzeW5jVmFsaWRhdGlvbkVycm9yKTtcbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsICdBc3luYyBWYWxpZGF0aW9uIEVycm9yJyk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImVycm9yc1wiLCB2b2lkIDApO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJmaWVsZHNcIiwgdm9pZCAwKTtcbiAgICBfdGhpcy5lcnJvcnMgPSBlcnJvcnM7XG4gICAgX3RoaXMuZmllbGRzID0gZmllbGRzO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICByZXR1cm4gX2NyZWF0ZUNsYXNzKEFzeW5jVmFsaWRhdGlvbkVycm9yKTtcbn0oIC8qI19fUFVSRV9fKi9fd3JhcE5hdGl2ZVN1cGVyKEVycm9yKSk7XG5leHBvcnQgZnVuY3Rpb24gYXN5bmNNYXAob2JqQXJyLCBvcHRpb24sIGZ1bmMsIGNhbGxiYWNrLCBzb3VyY2UpIHtcbiAgaWYgKG9wdGlvbi5maXJzdCkge1xuICAgIHZhciBfcGVuZGluZyA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciBuZXh0ID0gZnVuY3Rpb24gbmV4dChlcnJvcnMpIHtcbiAgICAgICAgY2FsbGJhY2soZXJyb3JzKTtcbiAgICAgICAgcmV0dXJuIGVycm9ycy5sZW5ndGggPyByZWplY3QobmV3IEFzeW5jVmFsaWRhdGlvbkVycm9yKGVycm9ycywgY29udmVydEZpZWxkc0Vycm9yKGVycm9ycykpKSA6IHJlc29sdmUoc291cmNlKTtcbiAgICAgIH07XG4gICAgICB2YXIgZmxhdHRlbkFyciA9IGZsYXR0ZW5PYmpBcnIob2JqQXJyKTtcbiAgICAgIGFzeW5jU2VyaWFsQXJyYXkoZmxhdHRlbkFyciwgZnVuYywgbmV4dCk7XG4gICAgfSk7XG4gICAgX3BlbmRpbmcuY2F0Y2goZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJldHVybiBlO1xuICAgIH0pO1xuICAgIHJldHVybiBfcGVuZGluZztcbiAgfVxuICB2YXIgZmlyc3RGaWVsZHMgPSBvcHRpb24uZmlyc3RGaWVsZHMgPT09IHRydWUgPyBPYmplY3Qua2V5cyhvYmpBcnIpIDogb3B0aW9uLmZpcnN0RmllbGRzIHx8IFtdO1xuICB2YXIgb2JqQXJyS2V5cyA9IE9iamVjdC5rZXlzKG9iakFycik7XG4gIHZhciBvYmpBcnJMZW5ndGggPSBvYmpBcnJLZXlzLmxlbmd0aDtcbiAgdmFyIHRvdGFsID0gMDtcbiAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgdmFyIHBlbmRpbmcgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgdmFyIG5leHQgPSBmdW5jdGlvbiBuZXh0KGVycm9ycykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1zcHJlYWRcbiAgICAgIHJlc3VsdHMucHVzaC5hcHBseShyZXN1bHRzLCBlcnJvcnMpO1xuICAgICAgdG90YWwrKztcbiAgICAgIGlmICh0b3RhbCA9PT0gb2JqQXJyTGVuZ3RoKSB7XG4gICAgICAgIGNhbGxiYWNrKHJlc3VsdHMpO1xuICAgICAgICByZXR1cm4gcmVzdWx0cy5sZW5ndGggPyByZWplY3QobmV3IEFzeW5jVmFsaWRhdGlvbkVycm9yKHJlc3VsdHMsIGNvbnZlcnRGaWVsZHNFcnJvcihyZXN1bHRzKSkpIDogcmVzb2x2ZShzb3VyY2UpO1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKCFvYmpBcnJLZXlzLmxlbmd0aCkge1xuICAgICAgY2FsbGJhY2socmVzdWx0cyk7XG4gICAgICByZXNvbHZlKHNvdXJjZSk7XG4gICAgfVxuICAgIG9iakFycktleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICB2YXIgYXJyID0gb2JqQXJyW2tleV07XG4gICAgICBpZiAoZmlyc3RGaWVsZHMuaW5kZXhPZihrZXkpICE9PSAtMSkge1xuICAgICAgICBhc3luY1NlcmlhbEFycmF5KGFyciwgZnVuYywgbmV4dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhc3luY1BhcmFsbGVsQXJyYXkoYXJyLCBmdW5jLCBuZXh0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG4gIHBlbmRpbmcuY2F0Y2goZnVuY3Rpb24gKGUpIHtcbiAgICByZXR1cm4gZTtcbiAgfSk7XG4gIHJldHVybiBwZW5kaW5nO1xufVxuZnVuY3Rpb24gaXNFcnJvck9iaihvYmopIHtcbiAgcmV0dXJuICEhKG9iaiAmJiBvYmoubWVzc2FnZSAhPT0gdW5kZWZpbmVkKTtcbn1cbmZ1bmN0aW9uIGdldFZhbHVlKHZhbHVlLCBwYXRoKSB7XG4gIHZhciB2ID0gdmFsdWU7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgIGlmICh2ID09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHY7XG4gICAgfVxuICAgIHYgPSB2W3BhdGhbaV1dO1xuICB9XG4gIHJldHVybiB2O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBsZW1lbnRFcnJvcihydWxlLCBzb3VyY2UpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChvZSkge1xuICAgIHZhciBmaWVsZFZhbHVlO1xuICAgIGlmIChydWxlLmZ1bGxGaWVsZHMpIHtcbiAgICAgIGZpZWxkVmFsdWUgPSBnZXRWYWx1ZShzb3VyY2UsIHJ1bGUuZnVsbEZpZWxkcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZpZWxkVmFsdWUgPSBzb3VyY2Vbb2UuZmllbGQgfHwgcnVsZS5mdWxsRmllbGRdO1xuICAgIH1cbiAgICBpZiAoaXNFcnJvck9iaihvZSkpIHtcbiAgICAgIG9lLmZpZWxkID0gb2UuZmllbGQgfHwgcnVsZS5mdWxsRmllbGQ7XG4gICAgICBvZS5maWVsZFZhbHVlID0gZmllbGRWYWx1ZTtcbiAgICAgIHJldHVybiBvZTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2U6IHR5cGVvZiBvZSA9PT0gJ2Z1bmN0aW9uJyA/IG9lKCkgOiBvZSxcbiAgICAgIGZpZWxkVmFsdWU6IGZpZWxkVmFsdWUsXG4gICAgICBmaWVsZDogb2UuZmllbGQgfHwgcnVsZS5mdWxsRmllbGRcbiAgICB9O1xuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBNZXJnZSh0YXJnZXQsIHNvdXJjZSkge1xuICBpZiAoc291cmNlKSB7XG4gICAgZm9yICh2YXIgcyBpbiBzb3VyY2UpIHtcbiAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkocykpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gc291cmNlW3NdO1xuICAgICAgICBpZiAoX3R5cGVvZih2YWx1ZSkgPT09ICdvYmplY3QnICYmIF90eXBlb2YodGFyZ2V0W3NdKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICB0YXJnZXRbc10gPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHRhcmdldFtzXSksIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YXJnZXRbc10gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdGFyZ2V0O1xufSIsICJpbXBvcnQgeyBmb3JtYXQgfSBmcm9tIFwiLi4vdXRpbFwiO1xudmFyIEVOVU0gPSAnZW51bSc7XG52YXIgZW51bWVyYWJsZSA9IGZ1bmN0aW9uIGVudW1lcmFibGUocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKSB7XG4gIHJ1bGVbRU5VTV0gPSBBcnJheS5pc0FycmF5KHJ1bGVbRU5VTV0pID8gcnVsZVtFTlVNXSA6IFtdO1xuICBpZiAocnVsZVtFTlVNXS5pbmRleE9mKHZhbHVlKSA9PT0gLTEpIHtcbiAgICBlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlc1tFTlVNXSwgcnVsZS5mdWxsRmllbGQsIHJ1bGVbRU5VTV0uam9pbignLCAnKSkpO1xuICB9XG59O1xuZXhwb3J0IGRlZmF1bHQgZW51bWVyYWJsZTsiLCAiaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSBcIi4uL3V0aWxcIjtcbnZhciBwYXR0ZXJuID0gZnVuY3Rpb24gcGF0dGVybihydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpIHtcbiAgaWYgKHJ1bGUucGF0dGVybikge1xuICAgIGlmIChydWxlLnBhdHRlcm4gaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgIC8vIGlmIGEgUmVnRXhwIGluc3RhbmNlIGlzIHBhc3NlZCwgcmVzZXQgYGxhc3RJbmRleGAgaW4gY2FzZSBpdHMgYGdsb2JhbGBcbiAgICAgIC8vIGZsYWcgaXMgYWNjaWRlbnRhbGx5IHNldCB0byBgdHJ1ZWAsIHdoaWNoIGluIGEgdmFsaWRhdGlvbiBzY2VuYXJpb1xuICAgICAgLy8gaXMgbm90IG5lY2Vzc2FyeSBhbmQgdGhlIHJlc3VsdCBtaWdodCBiZSBtaXNsZWFkaW5nXG4gICAgICBydWxlLnBhdHRlcm4ubGFzdEluZGV4ID0gMDtcbiAgICAgIGlmICghcnVsZS5wYXR0ZXJuLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzLnBhdHRlcm4ubWlzbWF0Y2gsIHJ1bGUuZnVsbEZpZWxkLCB2YWx1ZSwgcnVsZS5wYXR0ZXJuKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcnVsZS5wYXR0ZXJuID09PSAnc3RyaW5nJykge1xuICAgICAgdmFyIF9wYXR0ZXJuID0gbmV3IFJlZ0V4cChydWxlLnBhdHRlcm4pO1xuICAgICAgaWYgKCFfcGF0dGVybi50ZXN0KHZhbHVlKSkge1xuICAgICAgICBlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlcy5wYXR0ZXJuLm1pc21hdGNoLCBydWxlLmZ1bGxGaWVsZCwgdmFsdWUsIHJ1bGUucGF0dGVybikpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcbmV4cG9ydCBkZWZhdWx0IHBhdHRlcm47IiwgImltcG9ydCB7IGZvcm1hdCB9IGZyb20gXCIuLi91dGlsXCI7XG52YXIgcmFuZ2UgPSBmdW5jdGlvbiByYW5nZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpIHtcbiAgdmFyIGxlbiA9IHR5cGVvZiBydWxlLmxlbiA9PT0gJ251bWJlcic7XG4gIHZhciBtaW4gPSB0eXBlb2YgcnVsZS5taW4gPT09ICdudW1iZXInO1xuICB2YXIgbWF4ID0gdHlwZW9mIHJ1bGUubWF4ID09PSAnbnVtYmVyJztcbiAgLy8gXHU2QjYzXHU1MjE5XHU1MzM5XHU5MTREXHU3ODAxXHU3MEI5XHU4MzAzXHU1NkY0XHU0RUNFVSswMTAwMDBcdTRFMDBcdTc2RjRcdTUyMzBVKzEwRkZGRlx1NzY4NFx1NjU4N1x1NUI1N1x1RkYwOFx1ODg2NVx1NTE0NVx1NUU3M1x1OTc2MlN1cHBsZW1lbnRhcnkgUGxhbmVcdUZGMDlcbiAgdmFyIHNwUmVnZXhwID0gL1tcXHVEODAwLVxcdURCRkZdW1xcdURDMDAtXFx1REZGRl0vZztcbiAgdmFyIHZhbCA9IHZhbHVlO1xuICB2YXIga2V5ID0gbnVsbDtcbiAgdmFyIG51bSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gIHZhciBzdHIgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xuICB2YXIgYXJyID0gQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG4gIGlmIChudW0pIHtcbiAgICBrZXkgPSAnbnVtYmVyJztcbiAgfSBlbHNlIGlmIChzdHIpIHtcbiAgICBrZXkgPSAnc3RyaW5nJztcbiAgfSBlbHNlIGlmIChhcnIpIHtcbiAgICBrZXkgPSAnYXJyYXknO1xuICB9XG4gIC8vIGlmIHRoZSB2YWx1ZSBpcyBub3Qgb2YgYSBzdXBwb3J0ZWQgdHlwZSBmb3IgcmFuZ2UgdmFsaWRhdGlvblxuICAvLyB0aGUgdmFsaWRhdGlvbiBydWxlIHJ1bGUgc2hvdWxkIHVzZSB0aGVcbiAgLy8gdHlwZSBwcm9wZXJ0eSB0byBhbHNvIHRlc3QgZm9yIGEgcGFydGljdWxhciB0eXBlXG4gIGlmICgha2V5KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChhcnIpIHtcbiAgICB2YWwgPSB2YWx1ZS5sZW5ndGg7XG4gIH1cbiAgaWYgKHN0cikge1xuICAgIC8vIFx1NTkwNFx1NzQwNlx1NzgwMVx1NzBCOVx1NTkyN1x1NEU4RVUrMDEwMDAwXHU3Njg0XHU2NTg3XHU1QjU3bGVuZ3RoXHU1QzVFXHU2MDI3XHU0RTBEXHU1MUM2XHU3ODZFXHU3Njg0YnVnXHVGRjBDXHU1OTgyXCJcdUQ4NDJcdURGQjdcdUQ4NDJcdURGQjdcdUQ4NDJcdURGQjdcIi5sZW5ndGggIT09IDNcbiAgICB2YWwgPSB2YWx1ZS5yZXBsYWNlKHNwUmVnZXhwLCAnXycpLmxlbmd0aDtcbiAgfVxuICBpZiAobGVuKSB7XG4gICAgaWYgKHZhbCAhPT0gcnVsZS5sZW4pIHtcbiAgICAgIGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzW2tleV0ubGVuLCBydWxlLmZ1bGxGaWVsZCwgcnVsZS5sZW4pKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAobWluICYmICFtYXggJiYgdmFsIDwgcnVsZS5taW4pIHtcbiAgICBlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlc1trZXldLm1pbiwgcnVsZS5mdWxsRmllbGQsIHJ1bGUubWluKSk7XG4gIH0gZWxzZSBpZiAobWF4ICYmICFtaW4gJiYgdmFsID4gcnVsZS5tYXgpIHtcbiAgICBlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlc1trZXldLm1heCwgcnVsZS5mdWxsRmllbGQsIHJ1bGUubWF4KSk7XG4gIH0gZWxzZSBpZiAobWluICYmIG1heCAmJiAodmFsIDwgcnVsZS5taW4gfHwgdmFsID4gcnVsZS5tYXgpKSB7XG4gICAgZXJyb3JzLnB1c2goZm9ybWF0KG9wdGlvbnMubWVzc2FnZXNba2V5XS5yYW5nZSwgcnVsZS5mdWxsRmllbGQsIHJ1bGUubWluLCBydWxlLm1heCkpO1xuICB9XG59O1xuZXhwb3J0IGRlZmF1bHQgcmFuZ2U7IiwgImltcG9ydCB7IGZvcm1hdCwgaXNFbXB0eVZhbHVlIH0gZnJvbSBcIi4uL3V0aWxcIjtcbnZhciByZXF1aXJlZCA9IGZ1bmN0aW9uIHJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucywgdHlwZSkge1xuICBpZiAocnVsZS5yZXF1aXJlZCAmJiAoIXNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKSB8fCBpc0VtcHR5VmFsdWUodmFsdWUsIHR5cGUgfHwgcnVsZS50eXBlKSkpIHtcbiAgICBlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlcy5yZXF1aXJlZCwgcnVsZS5mdWxsRmllbGQpKTtcbiAgfVxufTtcbmV4cG9ydCBkZWZhdWx0IHJlcXVpcmVkOyIsICIvLyBodHRwczovL2dpdGh1Yi5jb20va2V2dmEvdXJsLXJlZ2V4L2Jsb2IvbWFzdGVyL2luZGV4LmpzXG52YXIgdXJsUmVnO1xuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uICgpIHtcbiAgaWYgKHVybFJlZykge1xuICAgIHJldHVybiB1cmxSZWc7XG4gIH1cbiAgdmFyIHdvcmQgPSAnW2EtZkEtRlxcXFxkOl0nO1xuICB2YXIgYiA9IGZ1bmN0aW9uIGIob3B0aW9ucykge1xuICAgIHJldHVybiBvcHRpb25zICYmIG9wdGlvbnMuaW5jbHVkZUJvdW5kYXJpZXMgPyBcIig/Oig/PD1cXFxcc3xeKSg/PVwiLmNvbmNhdCh3b3JkLCBcIil8KD88PVwiKS5jb25jYXQod29yZCwgXCIpKD89XFxcXHN8JCkpXCIpIDogJyc7XG4gIH07XG4gIHZhciB2NCA9ICcoPzoyNVswLTVdfDJbMC00XVxcXFxkfDFcXFxcZFxcXFxkfFsxLTldXFxcXGR8XFxcXGQpKD86XFxcXC4oPzoyNVswLTVdfDJbMC00XVxcXFxkfDFcXFxcZFxcXFxkfFsxLTldXFxcXGR8XFxcXGQpKXszfSc7XG4gIHZhciB2NnNlZyA9ICdbYS1mQS1GXFxcXGRdezEsNH0nO1xuICB2YXIgdjZMaXN0ID0gW1wiKD86XCIuY29uY2F0KHY2c2VnLCBcIjopezd9KD86XCIpLmNvbmNhdCh2NnNlZywgXCJ8OilcIiksIC8vIDE6MjozOjQ6NTo2Ojc6OiAgMToyOjM6NDo1OjY6Nzo4XG4gIFwiKD86XCIuY29uY2F0KHY2c2VnLCBcIjopezZ9KD86XCIpLmNvbmNhdCh2NCwgXCJ8OlwiKS5jb25jYXQodjZzZWcsIFwifDopXCIpLCAvLyAxOjI6Mzo0OjU6Njo6ICAgIDE6MjozOjQ6NTo2Ojo4ICAgMToyOjM6NDo1OjY6OjggIDE6MjozOjQ6NTo2OjpcbiAgXCIoPzpcIi5jb25jYXQodjZzZWcsIFwiOil7NX0oPzo6XCIpLmNvbmNhdCh2NCwgXCJ8KD86OlwiKS5jb25jYXQodjZzZWcsIFwiKXsxLDJ9fDopXCIpLCAvLyAxOjI6Mzo0OjU6OiAgICAgIDE6MjozOjQ6NTo6Nzo4ICAgMToyOjM6NDo1Ojo4ICAgIDE6MjozOjQ6NTo6XG4gIFwiKD86XCIuY29uY2F0KHY2c2VnLCBcIjopezR9KD86KD86OlwiKS5jb25jYXQodjZzZWcsIFwiKXswLDF9OlwiKS5jb25jYXQodjQsIFwifCg/OjpcIikuY29uY2F0KHY2c2VnLCBcIil7MSwzfXw6KVwiKSwgLy8gMToyOjM6NDo6ICAgICAgICAxOjI6Mzo0Ojo2Ojc6OCAgIDE6MjozOjQ6OjggICAgICAxOjI6Mzo0OjpcbiAgXCIoPzpcIi5jb25jYXQodjZzZWcsIFwiOil7M30oPzooPzo6XCIpLmNvbmNhdCh2NnNlZywgXCIpezAsMn06XCIpLmNvbmNhdCh2NCwgXCJ8KD86OlwiKS5jb25jYXQodjZzZWcsIFwiKXsxLDR9fDopXCIpLCAvLyAxOjI6Mzo6ICAgICAgICAgIDE6MjozOjo1OjY6Nzo4ICAgMToyOjM6OjggICAgICAgIDE6MjozOjpcbiAgXCIoPzpcIi5jb25jYXQodjZzZWcsIFwiOil7Mn0oPzooPzo6XCIpLmNvbmNhdCh2NnNlZywgXCIpezAsM306XCIpLmNvbmNhdCh2NCwgXCJ8KD86OlwiKS5jb25jYXQodjZzZWcsIFwiKXsxLDV9fDopXCIpLCAvLyAxOjI6OiAgICAgICAgICAgIDE6Mjo6NDo1OjY6Nzo4ICAgMToyOjo4ICAgICAgICAgIDE6Mjo6XG4gIFwiKD86XCIuY29uY2F0KHY2c2VnLCBcIjopezF9KD86KD86OlwiKS5jb25jYXQodjZzZWcsIFwiKXswLDR9OlwiKS5jb25jYXQodjQsIFwifCg/OjpcIikuY29uY2F0KHY2c2VnLCBcIil7MSw2fXw6KVwiKSwgLy8gMTo6ICAgICAgICAgICAgICAxOjozOjQ6NTo2Ojc6OCAgIDE6OjggICAgICAgICAgICAxOjpcbiAgXCIoPzo6KD86KD86OlwiLmNvbmNhdCh2NnNlZywgXCIpezAsNX06XCIpLmNvbmNhdCh2NCwgXCJ8KD86OlwiKS5jb25jYXQodjZzZWcsIFwiKXsxLDd9fDopKVwiKSAvLyA6OjI6Mzo0OjU6Njo3OjggIDo6MjozOjQ6NTo2Ojc6OCAgOjo4ICAgICAgICAgICAgIDo6XG4gIF07XG4gIHZhciB2NkV0aDAgPSBcIig/OiVbMC05YS16QS1aXXsxLH0pP1wiOyAvLyAlZXRoMCAgICAgICAgICAgICUxXG5cbiAgdmFyIHY2ID0gXCIoPzpcIi5jb25jYXQodjZMaXN0LmpvaW4oJ3wnKSwgXCIpXCIpLmNvbmNhdCh2NkV0aDApO1xuXG4gIC8vIFByZS1jb21waWxlIG9ubHkgdGhlIGV4YWN0IHJlZ2V4ZXMgYmVjYXVzZSBhZGRpbmcgYSBnbG9iYWwgZmxhZyBtYWtlIHJlZ2V4ZXMgc3RhdGVmdWxcbiAgdmFyIHY0NkV4YWN0ID0gbmV3IFJlZ0V4cChcIig/Ol5cIi5jb25jYXQodjQsIFwiJCl8KD86XlwiKS5jb25jYXQodjYsIFwiJClcIikpO1xuICB2YXIgdjRleGFjdCA9IG5ldyBSZWdFeHAoXCJeXCIuY29uY2F0KHY0LCBcIiRcIikpO1xuICB2YXIgdjZleGFjdCA9IG5ldyBSZWdFeHAoXCJeXCIuY29uY2F0KHY2LCBcIiRcIikpO1xuICB2YXIgaXAgPSBmdW5jdGlvbiBpcChvcHRpb25zKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMgJiYgb3B0aW9ucy5leGFjdCA/IHY0NkV4YWN0IDogbmV3IFJlZ0V4cChcIig/OlwiLmNvbmNhdChiKG9wdGlvbnMpKS5jb25jYXQodjQpLmNvbmNhdChiKG9wdGlvbnMpLCBcIil8KD86XCIpLmNvbmNhdChiKG9wdGlvbnMpKS5jb25jYXQodjYpLmNvbmNhdChiKG9wdGlvbnMpLCBcIilcIiksICdnJyk7XG4gIH07XG4gIGlwLnY0ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gb3B0aW9ucyAmJiBvcHRpb25zLmV4YWN0ID8gdjRleGFjdCA6IG5ldyBSZWdFeHAoXCJcIi5jb25jYXQoYihvcHRpb25zKSkuY29uY2F0KHY0KS5jb25jYXQoYihvcHRpb25zKSksICdnJyk7XG4gIH07XG4gIGlwLnY2ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gb3B0aW9ucyAmJiBvcHRpb25zLmV4YWN0ID8gdjZleGFjdCA6IG5ldyBSZWdFeHAoXCJcIi5jb25jYXQoYihvcHRpb25zKSkuY29uY2F0KHY2KS5jb25jYXQoYihvcHRpb25zKSksICdnJyk7XG4gIH07XG4gIHZhciBwcm90b2NvbCA9IFwiKD86KD86W2Etel0rOik/Ly8pXCI7XG4gIHZhciBhdXRoID0gJyg/OlxcXFxTKyg/OjpcXFxcUyopP0ApPyc7XG4gIHZhciBpcHY0ID0gaXAudjQoKS5zb3VyY2U7XG4gIHZhciBpcHY2ID0gaXAudjYoKS5zb3VyY2U7XG4gIHZhciBob3N0ID0gXCIoPzooPzpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZjAtOV1bLV9dKikqW2EtelxcXFx1MDBhMS1cXFxcdWZmZmYwLTldKylcIjtcbiAgdmFyIGRvbWFpbiA9IFwiKD86XFxcXC4oPzpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZjAtOV0tKikqW2EtelxcXFx1MDBhMS1cXFxcdWZmZmYwLTldKykqXCI7XG4gIHZhciB0bGQgPSBcIig/OlxcXFwuKD86W2EtelxcXFx1MDBhMS1cXFxcdWZmZmZdezIsfSkpXCI7XG4gIHZhciBwb3J0ID0gJyg/OjpcXFxcZHsyLDV9KT8nO1xuICB2YXIgcGF0aCA9ICcoPzpbLz8jXVteXFxcXHNcIl0qKT8nO1xuICB2YXIgcmVnZXggPSBcIig/OlwiLmNvbmNhdChwcm90b2NvbCwgXCJ8d3d3XFxcXC4pXCIpLmNvbmNhdChhdXRoLCBcIig/OmxvY2FsaG9zdHxcIikuY29uY2F0KGlwdjQsIFwifFwiKS5jb25jYXQoaXB2NiwgXCJ8XCIpLmNvbmNhdChob3N0KS5jb25jYXQoZG9tYWluKS5jb25jYXQodGxkLCBcIilcIikuY29uY2F0KHBvcnQpLmNvbmNhdChwYXRoKTtcbiAgdXJsUmVnID0gbmV3IFJlZ0V4cChcIig/Ol5cIi5jb25jYXQocmVnZXgsIFwiJClcIiksICdpJyk7XG4gIHJldHVybiB1cmxSZWc7XG59KTsiLCAiaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSBcIi4uL3V0aWxcIjtcbmltcG9ydCByZXF1aXJlZCBmcm9tIFwiLi9yZXF1aXJlZFwiO1xuaW1wb3J0IGdldFVybFJlZ2V4IGZyb20gXCIuL3VybFwiO1xuLyogZXNsaW50IG1heC1sZW46MCAqL1xuXG52YXIgcGF0dGVybiA9IHtcbiAgLy8gaHR0cDovL2VtYWlscmVnZXguY29tL1xuICBlbWFpbDogL14oKFtePD4oKVxcW1xcXVxcXFwuLDs6XFxzQFwiXSsoXFwuW148PigpXFxbXFxdXFxcXC4sOzpcXHNAXCJdKykqKXwoXCIuK1wiKSlAKChcXFtbMC05XXsxLDN9XFwuWzAtOV17MSwzfVxcLlswLTldezEsM31cXC5bMC05XXsxLDN9XSl8KChbYS16QS1aXFwtMC05XFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXStcXC4pK1thLXpBLVpcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdezIsfSkpJC8sXG4gIC8vIHVybDogbmV3IFJlZ0V4cChcbiAgLy8gICAnXig/IW1haWx0bzopKD86KD86aHR0cHxodHRwc3xmdHApOi8vfC8vKSg/OlxcXFxTKyg/OjpcXFxcUyopP0ApPyg/Oig/Oig/OlsxLTldXFxcXGQ/fDFcXFxcZFxcXFxkfDJbMDFdXFxcXGR8MjJbMC0zXSkoPzpcXFxcLig/OjE/XFxcXGR7MSwyfXwyWzAtNF1cXFxcZHwyNVswLTVdKSl7Mn0oPzpcXFxcLig/OlswLTldXFxcXGQ/fDFcXFxcZFxcXFxkfDJbMC00XVxcXFxkfDI1WzAtNF0pKXwoPzooPzpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZjAtOV0rLSopKlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmMC05XSspKD86XFxcXC4oPzpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZjAtOV0rLSopKlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmMC05XSspKig/OlxcXFwuKD86W2EtelxcXFx1MDBhMS1cXFxcdWZmZmZdezIsfSkpKXxsb2NhbGhvc3QpKD86OlxcXFxkezIsNX0pPyg/OigvfFxcXFw/fCMpW15cXFxcc10qKT8kJyxcbiAgLy8gICAnaScsXG4gIC8vICksXG4gIGhleDogL14jPyhbYS1mMC05XXs2fXxbYS1mMC05XXszfSkkL2lcbn07XG52YXIgdHlwZXMgPSB7XG4gIGludGVnZXI6IGZ1bmN0aW9uIGludGVnZXIodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZXMubnVtYmVyKHZhbHVlKSAmJiBwYXJzZUludCh2YWx1ZSwgMTApID09PSB2YWx1ZTtcbiAgfSxcbiAgZmxvYXQ6IGZ1bmN0aW9uIGZsb2F0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVzLm51bWJlcih2YWx1ZSkgJiYgIXR5cGVzLmludGVnZXIodmFsdWUpO1xuICB9LFxuICBhcnJheTogZnVuY3Rpb24gYXJyYXkodmFsdWUpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG4gIH0sXG4gIHJlZ2V4cDogZnVuY3Rpb24gcmVnZXhwKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhIW5ldyBSZWdFeHAodmFsdWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG4gIGRhdGU6IGZ1bmN0aW9uIGRhdGUodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlLmdldFRpbWUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHZhbHVlLmdldE1vbnRoID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZS5nZXRZZWFyID09PSAnZnVuY3Rpb24nICYmICFpc05hTih2YWx1ZS5nZXRUaW1lKCkpO1xuICB9LFxuICBudW1iZXI6IGZ1bmN0aW9uIG51bWJlcih2YWx1ZSkge1xuICAgIGlmIChpc05hTih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gIH0sXG4gIG9iamVjdDogZnVuY3Rpb24gb2JqZWN0KHZhbHVlKSB7XG4gICAgcmV0dXJuIF90eXBlb2YodmFsdWUpID09PSAnb2JqZWN0JyAmJiAhdHlwZXMuYXJyYXkodmFsdWUpO1xuICB9LFxuICBtZXRob2Q6IGZ1bmN0aW9uIG1ldGhvZCh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbic7XG4gIH0sXG4gIGVtYWlsOiBmdW5jdGlvbiBlbWFpbCh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmxlbmd0aCA8PSAzMjAgJiYgISF2YWx1ZS5tYXRjaChwYXR0ZXJuLmVtYWlsKTtcbiAgfSxcbiAgdXJsOiBmdW5jdGlvbiB1cmwodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPD0gMjA0OCAmJiAhIXZhbHVlLm1hdGNoKGdldFVybFJlZ2V4KCkpO1xuICB9LFxuICBoZXg6IGZ1bmN0aW9uIGhleCh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmICEhdmFsdWUubWF0Y2gocGF0dGVybi5oZXgpO1xuICB9XG59O1xudmFyIHR5cGUgPSBmdW5jdGlvbiB0eXBlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucykge1xuICBpZiAocnVsZS5yZXF1aXJlZCAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIGN1c3RvbSA9IFsnaW50ZWdlcicsICdmbG9hdCcsICdhcnJheScsICdyZWdleHAnLCAnb2JqZWN0JywgJ21ldGhvZCcsICdlbWFpbCcsICdudW1iZXInLCAnZGF0ZScsICd1cmwnLCAnaGV4J107XG4gIHZhciBydWxlVHlwZSA9IHJ1bGUudHlwZTtcbiAgaWYgKGN1c3RvbS5pbmRleE9mKHJ1bGVUeXBlKSA+IC0xKSB7XG4gICAgaWYgKCF0eXBlc1tydWxlVHlwZV0odmFsdWUpKSB7XG4gICAgICBlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlcy50eXBlc1tydWxlVHlwZV0sIHJ1bGUuZnVsbEZpZWxkLCBydWxlLnR5cGUpKTtcbiAgICB9XG4gICAgLy8gc3RyYWlnaHQgdHlwZW9mIGNoZWNrXG4gIH0gZWxzZSBpZiAocnVsZVR5cGUgJiYgX3R5cGVvZih2YWx1ZSkgIT09IHJ1bGUudHlwZSkge1xuICAgIGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzLnR5cGVzW3J1bGVUeXBlXSwgcnVsZS5mdWxsRmllbGQsIHJ1bGUudHlwZSkpO1xuICB9XG59O1xuZXhwb3J0IGRlZmF1bHQgdHlwZTsiLCAiaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSBcIi4uL3V0aWxcIjtcblxuLyoqXG4gKiAgUnVsZSBmb3IgdmFsaWRhdGluZyB3aGl0ZXNwYWNlLlxuICpcbiAqICBAcGFyYW0gcnVsZSBUaGUgdmFsaWRhdGlvbiBydWxlLlxuICogIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9uIHRoZSBzb3VyY2Ugb2JqZWN0LlxuICogIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgYmVpbmcgdmFsaWRhdGVkLlxuICogIEBwYXJhbSBlcnJvcnMgQW4gYXJyYXkgb2YgZXJyb3JzIHRoYXQgdGhpcyBydWxlIG1heSBhZGRcbiAqICB2YWxpZGF0aW9uIGVycm9ycyB0by5cbiAqICBAcGFyYW0gb3B0aW9ucyBUaGUgdmFsaWRhdGlvbiBvcHRpb25zLlxuICogIEBwYXJhbSBvcHRpb25zLm1lc3NhZ2VzIFRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLlxuICovXG52YXIgd2hpdGVzcGFjZSA9IGZ1bmN0aW9uIHdoaXRlc3BhY2UocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKSB7XG4gIGlmICgvXlxccyskLy50ZXN0KHZhbHVlKSB8fCB2YWx1ZSA9PT0gJycpIHtcbiAgICBlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlcy53aGl0ZXNwYWNlLCBydWxlLmZ1bGxGaWVsZCkpO1xuICB9XG59O1xuZXhwb3J0IGRlZmF1bHQgd2hpdGVzcGFjZTsiLCAiaW1wb3J0IGVudW1SdWxlIGZyb20gXCIuL2VudW1cIjtcbmltcG9ydCBwYXR0ZXJuIGZyb20gXCIuL3BhdHRlcm5cIjtcbmltcG9ydCByYW5nZSBmcm9tIFwiLi9yYW5nZVwiO1xuaW1wb3J0IHJlcXVpcmVkIGZyb20gXCIuL3JlcXVpcmVkXCI7XG5pbXBvcnQgdHlwZSBmcm9tIFwiLi90eXBlXCI7XG5pbXBvcnQgd2hpdGVzcGFjZSBmcm9tIFwiLi93aGl0ZXNwYWNlXCI7XG5leHBvcnQgZGVmYXVsdCB7XG4gIHJlcXVpcmVkOiByZXF1aXJlZCxcbiAgd2hpdGVzcGFjZTogd2hpdGVzcGFjZSxcbiAgdHlwZTogdHlwZSxcbiAgcmFuZ2U6IHJhbmdlLFxuICBlbnVtOiBlbnVtUnVsZSxcbiAgcGF0dGVybjogcGF0dGVyblxufTsiLCAiaW1wb3J0IHJ1bGVzIGZyb20gXCIuLi9ydWxlXCI7XG5pbXBvcnQgeyBpc0VtcHR5VmFsdWUgfSBmcm9tIFwiLi4vdXRpbFwiO1xudmFyIGFueSA9IGZ1bmN0aW9uIGFueShydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gIH1cbiAgY2FsbGJhY2soZXJyb3JzKTtcbn07XG5leHBvcnQgZGVmYXVsdCBhbnk7IiwgImltcG9ydCBydWxlcyBmcm9tIFwiLi4vcnVsZS9pbmRleFwiO1xudmFyIGFycmF5ID0gZnVuY3Rpb24gYXJyYXkocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcbiAgaWYgKHZhbGlkYXRlKSB7XG4gICAgaWYgKCh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucywgJ2FycmF5Jyk7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHJ1bGVzLnR5cGUocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICAgIHJ1bGVzLnJhbmdlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgfVxuICB9XG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuZXhwb3J0IGRlZmF1bHQgYXJyYXk7IiwgImltcG9ydCBydWxlcyBmcm9tIFwiLi4vcnVsZVwiO1xuaW1wb3J0IHsgaXNFbXB0eVZhbHVlIH0gZnJvbSBcIi4uL3V0aWxcIjtcbnZhciBib29sZWFuID0gZnVuY3Rpb24gYm9vbGVhbihydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJ1bGVzLnR5cGUocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cbiAgY2FsbGJhY2soZXJyb3JzKTtcbn07XG5leHBvcnQgZGVmYXVsdCBib29sZWFuOyIsICJpbXBvcnQgcnVsZXMgZnJvbSBcIi4uL3J1bGVcIjtcbmltcG9ydCB7IGlzRW1wdHlWYWx1ZSB9IGZyb20gXCIuLi91dGlsXCI7XG52YXIgZGF0ZSA9IGZ1bmN0aW9uIGRhdGUocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgLy8gY29uc29sZS5sb2coJ2ludGVnZXIgcnVsZSBjYWxsZWQgJWonLCBydWxlKTtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcbiAgLy8gY29uc29sZS5sb2coJ3ZhbGlkYXRlIG9uICVzIHZhbHVlJywgdmFsdWUpO1xuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlLCAnZGF0ZScpICYmICFydWxlLnJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICBpZiAoIWlzRW1wdHlWYWx1ZSh2YWx1ZSwgJ2RhdGUnKSkge1xuICAgICAgdmFyIGRhdGVPYmplY3Q7XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIGRhdGVPYmplY3QgPSB2YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRhdGVPYmplY3QgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBydWxlcy50eXBlKHJ1bGUsIGRhdGVPYmplY3QsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICAgIGlmIChkYXRlT2JqZWN0KSB7XG4gICAgICAgIHJ1bGVzLnJhbmdlKHJ1bGUsIGRhdGVPYmplY3QuZ2V0VGltZSgpLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuZXhwb3J0IGRlZmF1bHQgZGF0ZTsiLCAiaW1wb3J0IHJ1bGVzIGZyb20gXCIuLi9ydWxlXCI7XG5pbXBvcnQgeyBpc0VtcHR5VmFsdWUgfSBmcm9tIFwiLi4vdXRpbFwiO1xudmFyIEVOVU0gPSAnZW51bSc7XG52YXIgZW51bWVyYWJsZSA9IGZ1bmN0aW9uIGVudW1lcmFibGUocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcbiAgaWYgKHZhbGlkYXRlKSB7XG4gICAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cbiAgICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBydWxlc1tFTlVNXShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcbmV4cG9ydCBkZWZhdWx0IGVudW1lcmFibGU7IiwgImltcG9ydCBydWxlcyBmcm9tIFwiLi4vcnVsZVwiO1xuaW1wb3J0IHsgaXNFbXB0eVZhbHVlIH0gZnJvbSBcIi4uL3V0aWxcIjtcbnZhciBmbG9hdEZuID0gZnVuY3Rpb24gZmxvYXRGbihydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJ1bGVzLnR5cGUocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICAgIHJ1bGVzLnJhbmdlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgfVxuICB9XG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuZXhwb3J0IGRlZmF1bHQgZmxvYXRGbjsiLCAiaW1wb3J0IHJ1bGVzIGZyb20gXCIuLi9ydWxlXCI7XG5pbXBvcnQgeyBpc0VtcHR5VmFsdWUgfSBmcm9tIFwiLi4vdXRpbFwiO1xudmFyIGludGVnZXIgPSBmdW5jdGlvbiBpbnRlZ2VyKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmIChpc0VtcHR5VmFsdWUodmFsdWUpICYmICFydWxlLnJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgICAgcnVsZXMucmFuZ2UocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cbiAgY2FsbGJhY2soZXJyb3JzKTtcbn07XG5leHBvcnQgZGVmYXVsdCBpbnRlZ2VyOyIsICJpbXBvcnQgcnVsZXMgZnJvbSBcIi4uL3J1bGVcIjtcbmltcG9ydCB7IGlzRW1wdHlWYWx1ZSB9IGZyb20gXCIuLi91dGlsXCI7XG52YXIgbWV0aG9kID0gZnVuY3Rpb24gbWV0aG9kKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmIChpc0VtcHR5VmFsdWUodmFsdWUpICYmICFydWxlLnJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcbmV4cG9ydCBkZWZhdWx0IG1ldGhvZDsiLCAiaW1wb3J0IHJ1bGVzIGZyb20gXCIuLi9ydWxlXCI7XG5pbXBvcnQgeyBpc0VtcHR5VmFsdWUgfSBmcm9tIFwiLi4vdXRpbFwiO1xudmFyIG51bWJlciA9IGZ1bmN0aW9uIG51bWJlcihydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAodmFsdWUgPT09ICcnKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgIHZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJ1bGVzLnR5cGUocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICAgIHJ1bGVzLnJhbmdlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgfVxuICB9XG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuZXhwb3J0IGRlZmF1bHQgbnVtYmVyOyIsICJpbXBvcnQgcnVsZXMgZnJvbSBcIi4uL3J1bGVcIjtcbmltcG9ydCB7IGlzRW1wdHlWYWx1ZSB9IGZyb20gXCIuLi91dGlsXCI7XG52YXIgb2JqZWN0ID0gZnVuY3Rpb24gb2JqZWN0KHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmIChpc0VtcHR5VmFsdWUodmFsdWUpICYmICFydWxlLnJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcbmV4cG9ydCBkZWZhdWx0IG9iamVjdDsiLCAiaW1wb3J0IHJ1bGVzIGZyb20gXCIuLi9ydWxlXCI7XG5pbXBvcnQgeyBpc0VtcHR5VmFsdWUgfSBmcm9tIFwiLi4vdXRpbFwiO1xudmFyIHBhdHRlcm4gPSBmdW5jdGlvbiBwYXR0ZXJuKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmIChpc0VtcHR5VmFsdWUodmFsdWUsICdzdHJpbmcnKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgaWYgKCFpc0VtcHR5VmFsdWUodmFsdWUsICdzdHJpbmcnKSkge1xuICAgICAgcnVsZXMucGF0dGVybihydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcbmV4cG9ydCBkZWZhdWx0IHBhdHRlcm47IiwgImltcG9ydCBydWxlcyBmcm9tIFwiLi4vcnVsZVwiO1xuaW1wb3J0IHsgaXNFbXB0eVZhbHVlIH0gZnJvbSBcIi4uL3V0aWxcIjtcbnZhciByZWdleHAgPSBmdW5jdGlvbiByZWdleHAocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcbiAgaWYgKHZhbGlkYXRlKSB7XG4gICAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cbiAgICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIGlmICghaXNFbXB0eVZhbHVlKHZhbHVlKSkge1xuICAgICAgcnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcbmV4cG9ydCBkZWZhdWx0IHJlZ2V4cDsiLCAiaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IHJ1bGVzIGZyb20gXCIuLi9ydWxlXCI7XG52YXIgcmVxdWlyZWQgPSBmdW5jdGlvbiByZXF1aXJlZChydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB0eXBlID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyAnYXJyYXknIDogX3R5cGVvZih2YWx1ZSk7XG4gIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucywgdHlwZSk7XG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuZXhwb3J0IGRlZmF1bHQgcmVxdWlyZWQ7IiwgImltcG9ydCBydWxlcyBmcm9tIFwiLi4vcnVsZVwiO1xuaW1wb3J0IHsgaXNFbXB0eVZhbHVlIH0gZnJvbSBcIi4uL3V0aWxcIjtcbnZhciBzdHJpbmcgPSBmdW5jdGlvbiBzdHJpbmcocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcbiAgaWYgKHZhbGlkYXRlKSB7XG4gICAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSwgJ3N0cmluZycpICYmICFydWxlLnJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zLCAnc3RyaW5nJyk7XG4gICAgaWYgKCFpc0VtcHR5VmFsdWUodmFsdWUsICdzdHJpbmcnKSkge1xuICAgICAgcnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgICAgcnVsZXMucmFuZ2UocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICAgIHJ1bGVzLnBhdHRlcm4ocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICAgIGlmIChydWxlLndoaXRlc3BhY2UgPT09IHRydWUpIHtcbiAgICAgICAgcnVsZXMud2hpdGVzcGFjZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcbmV4cG9ydCBkZWZhdWx0IHN0cmluZzsiLCAiaW1wb3J0IHJ1bGVzIGZyb20gXCIuLi9ydWxlXCI7XG5pbXBvcnQgeyBpc0VtcHR5VmFsdWUgfSBmcm9tIFwiLi4vdXRpbFwiO1xudmFyIHR5cGUgPSBmdW5jdGlvbiB0eXBlKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBydWxlVHlwZSA9IHJ1bGUudHlwZTtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcbiAgaWYgKHZhbGlkYXRlKSB7XG4gICAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSwgcnVsZVR5cGUpICYmICFydWxlLnJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zLCBydWxlVHlwZSk7XG4gICAgaWYgKCFpc0VtcHR5VmFsdWUodmFsdWUsIHJ1bGVUeXBlKSkge1xuICAgICAgcnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcbmV4cG9ydCBkZWZhdWx0IHR5cGU7IiwgImltcG9ydCBhbnkgZnJvbSBcIi4vYW55XCI7XG5pbXBvcnQgYXJyYXkgZnJvbSBcIi4vYXJyYXlcIjtcbmltcG9ydCBib29sZWFuIGZyb20gXCIuL2Jvb2xlYW5cIjtcbmltcG9ydCBkYXRlIGZyb20gXCIuL2RhdGVcIjtcbmltcG9ydCBlbnVtVmFsaWRhdG9yIGZyb20gXCIuL2VudW1cIjtcbmltcG9ydCBmbG9hdCBmcm9tIFwiLi9mbG9hdFwiO1xuaW1wb3J0IGludGVnZXIgZnJvbSBcIi4vaW50ZWdlclwiO1xuaW1wb3J0IG1ldGhvZCBmcm9tIFwiLi9tZXRob2RcIjtcbmltcG9ydCBudW1iZXIgZnJvbSBcIi4vbnVtYmVyXCI7XG5pbXBvcnQgb2JqZWN0IGZyb20gXCIuL29iamVjdFwiO1xuaW1wb3J0IHBhdHRlcm4gZnJvbSBcIi4vcGF0dGVyblwiO1xuaW1wb3J0IHJlZ2V4cCBmcm9tIFwiLi9yZWdleHBcIjtcbmltcG9ydCByZXF1aXJlZCBmcm9tIFwiLi9yZXF1aXJlZFwiO1xuaW1wb3J0IHN0cmluZyBmcm9tIFwiLi9zdHJpbmdcIjtcbmltcG9ydCB0eXBlIGZyb20gXCIuL3R5cGVcIjtcbmV4cG9ydCBkZWZhdWx0IHtcbiAgc3RyaW5nOiBzdHJpbmcsXG4gIG1ldGhvZDogbWV0aG9kLFxuICBudW1iZXI6IG51bWJlcixcbiAgYm9vbGVhbjogYm9vbGVhbixcbiAgcmVnZXhwOiByZWdleHAsXG4gIGludGVnZXI6IGludGVnZXIsXG4gIGZsb2F0OiBmbG9hdCxcbiAgYXJyYXk6IGFycmF5LFxuICBvYmplY3Q6IG9iamVjdCxcbiAgZW51bTogZW51bVZhbGlkYXRvcixcbiAgcGF0dGVybjogcGF0dGVybixcbiAgZGF0ZTogZGF0ZSxcbiAgdXJsOiB0eXBlLFxuICBoZXg6IHR5cGUsXG4gIGVtYWlsOiB0eXBlLFxuICByZXF1aXJlZDogcmVxdWlyZWQsXG4gIGFueTogYW55XG59OyIsICJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCB7IG1lc3NhZ2VzIGFzIGRlZmF1bHRNZXNzYWdlcywgbmV3TWVzc2FnZXMgfSBmcm9tIFwiLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHsgYXN5bmNNYXAsIGNvbXBsZW1lbnRFcnJvciwgY29udmVydEZpZWxkc0Vycm9yLCBkZWVwTWVyZ2UsIGZvcm1hdCwgd2FybmluZyB9IGZyb20gXCIuL3V0aWxcIjtcbmltcG9ydCB2YWxpZGF0b3JzIGZyb20gXCIuL3ZhbGlkYXRvci9pbmRleFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vaW50ZXJmYWNlXCI7XG5cbi8qKlxuICogIEVuY2Fwc3VsYXRlcyBhIHZhbGlkYXRpb24gc2NoZW1hLlxuICpcbiAqICBAcGFyYW0gZGVzY3JpcHRvciBBbiBvYmplY3QgZGVjbGFyaW5nIHZhbGlkYXRpb24gcnVsZXNcbiAqICBmb3IgdGhpcyBzY2hlbWEuXG4gKi9cbnZhciBTY2hlbWEgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBTY2hlbWEoZGVzY3JpcHRvcikge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTY2hlbWEpO1xuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBJbnN0YW5jZSA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJydWxlc1wiLCBudWxsKTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJfbWVzc2FnZXNcIiwgZGVmYXVsdE1lc3NhZ2VzKTtcbiAgICB0aGlzLmRlZmluZShkZXNjcmlwdG9yKTtcbiAgfVxuICBfY3JlYXRlQ2xhc3MoU2NoZW1hLCBbe1xuICAgIGtleTogXCJkZWZpbmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVmaW5lKHJ1bGVzKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgaWYgKCFydWxlcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjb25maWd1cmUgYSBzY2hlbWEgd2l0aCBubyBydWxlcycpO1xuICAgICAgfVxuICAgICAgaWYgKF90eXBlb2YocnVsZXMpICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHJ1bGVzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1J1bGVzIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgICB9XG4gICAgICB0aGlzLnJ1bGVzID0ge307XG4gICAgICBPYmplY3Qua2V5cyhydWxlcykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICB2YXIgaXRlbSA9IHJ1bGVzW25hbWVdO1xuICAgICAgICBfdGhpcy5ydWxlc1tuYW1lXSA9IEFycmF5LmlzQXJyYXkoaXRlbSkgPyBpdGVtIDogW2l0ZW1dO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm1lc3NhZ2VzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1lc3NhZ2VzKF9tZXNzYWdlcykge1xuICAgICAgaWYgKF9tZXNzYWdlcykge1xuICAgICAgICB0aGlzLl9tZXNzYWdlcyA9IGRlZXBNZXJnZShuZXdNZXNzYWdlcygpLCBfbWVzc2FnZXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuX21lc3NhZ2VzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ2YWxpZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB2YWxpZGF0ZShzb3VyY2VfKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcbiAgICAgIHZhciBvID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICAgIHZhciBvYyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogZnVuY3Rpb24gKCkge307XG4gICAgICB2YXIgc291cmNlID0gc291cmNlXztcbiAgICAgIHZhciBvcHRpb25zID0gbztcbiAgICAgIHZhciBjYWxsYmFjayA9IG9jO1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLnJ1bGVzIHx8IE9iamVjdC5rZXlzKHRoaXMucnVsZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICBjYWxsYmFjayhudWxsLCBzb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoc291cmNlKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGNvbXBsZXRlKHJlc3VsdHMpIHtcbiAgICAgICAgdmFyIGVycm9ycyA9IFtdO1xuICAgICAgICB2YXIgZmllbGRzID0ge307XG4gICAgICAgIGZ1bmN0aW9uIGFkZChlKSB7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZSkpIHtcbiAgICAgICAgICAgIHZhciBfZXJyb3JzO1xuICAgICAgICAgICAgZXJyb3JzID0gKF9lcnJvcnMgPSBlcnJvcnMpLmNvbmNhdC5hcHBseShfZXJyb3JzLCBfdG9Db25zdW1hYmxlQXJyYXkoZSkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgYWRkKHJlc3VsdHNbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHNvdXJjZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmllbGRzID0gY29udmVydEZpZWxkc0Vycm9yKGVycm9ycyk7XG4gICAgICAgICAgY2FsbGJhY2soZXJyb3JzLCBmaWVsZHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucy5tZXNzYWdlcykge1xuICAgICAgICB2YXIgbWVzc2FnZXMgPSB0aGlzLm1lc3NhZ2VzKCk7XG4gICAgICAgIGlmIChtZXNzYWdlcyA9PT0gZGVmYXVsdE1lc3NhZ2VzKSB7XG4gICAgICAgICAgbWVzc2FnZXMgPSBuZXdNZXNzYWdlcygpO1xuICAgICAgICB9XG4gICAgICAgIGRlZXBNZXJnZShtZXNzYWdlcywgb3B0aW9ucy5tZXNzYWdlcyk7XG4gICAgICAgIG9wdGlvbnMubWVzc2FnZXMgPSBtZXNzYWdlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wdGlvbnMubWVzc2FnZXMgPSB0aGlzLm1lc3NhZ2VzKCk7XG4gICAgICB9XG4gICAgICB2YXIgc2VyaWVzID0ge307XG4gICAgICB2YXIga2V5cyA9IG9wdGlvbnMua2V5cyB8fCBPYmplY3Qua2V5cyh0aGlzLnJ1bGVzKTtcbiAgICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoeikge1xuICAgICAgICB2YXIgYXJyID0gX3RoaXMyLnJ1bGVzW3pdO1xuICAgICAgICB2YXIgdmFsdWUgPSBzb3VyY2Vbel07XG4gICAgICAgIGFyci5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7XG4gICAgICAgICAgdmFyIHJ1bGUgPSByO1xuICAgICAgICAgIGlmICh0eXBlb2YgcnVsZS50cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGlmIChzb3VyY2UgPT09IHNvdXJjZV8pIHtcbiAgICAgICAgICAgICAgc291cmNlID0gX29iamVjdFNwcmVhZCh7fSwgc291cmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbHVlID0gc291cmNlW3pdID0gcnVsZS50cmFuc2Zvcm0odmFsdWUpO1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgcnVsZS50eXBlID0gcnVsZS50eXBlIHx8IChBcnJheS5pc0FycmF5KHZhbHVlKSA/ICdhcnJheScgOiBfdHlwZW9mKHZhbHVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlb2YgcnVsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcnVsZSA9IHtcbiAgICAgICAgICAgICAgdmFsaWRhdG9yOiBydWxlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBydWxlID0gX29iamVjdFNwcmVhZCh7fSwgcnVsZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRmlsbCB2YWxpZGF0b3IuIFNraXAgaWYgbm90aGluZyBuZWVkIHRvIHZhbGlkYXRlXG4gICAgICAgICAgcnVsZS52YWxpZGF0b3IgPSBfdGhpczIuZ2V0VmFsaWRhdGlvbk1ldGhvZChydWxlKTtcbiAgICAgICAgICBpZiAoIXJ1bGUudmFsaWRhdG9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHJ1bGUuZmllbGQgPSB6O1xuICAgICAgICAgIHJ1bGUuZnVsbEZpZWxkID0gcnVsZS5mdWxsRmllbGQgfHwgejtcbiAgICAgICAgICBydWxlLnR5cGUgPSBfdGhpczIuZ2V0VHlwZShydWxlKTtcbiAgICAgICAgICBzZXJpZXNbel0gPSBzZXJpZXNbel0gfHwgW107XG4gICAgICAgICAgc2VyaWVzW3pdLnB1c2goe1xuICAgICAgICAgICAgcnVsZTogcnVsZSxcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICAgICAgZmllbGQ6IHpcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHZhciBlcnJvckZpZWxkcyA9IHt9O1xuICAgICAgcmV0dXJuIGFzeW5jTWFwKHNlcmllcywgb3B0aW9ucywgZnVuY3Rpb24gKGRhdGEsIGRvSXQpIHtcbiAgICAgICAgdmFyIHJ1bGUgPSBkYXRhLnJ1bGU7XG4gICAgICAgIHZhciBkZWVwID0gKHJ1bGUudHlwZSA9PT0gJ29iamVjdCcgfHwgcnVsZS50eXBlID09PSAnYXJyYXknKSAmJiAoX3R5cGVvZihydWxlLmZpZWxkcykgPT09ICdvYmplY3QnIHx8IF90eXBlb2YocnVsZS5kZWZhdWx0RmllbGQpID09PSAnb2JqZWN0Jyk7XG4gICAgICAgIGRlZXAgPSBkZWVwICYmIChydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIGRhdGEudmFsdWUpO1xuICAgICAgICBydWxlLmZpZWxkID0gZGF0YS5maWVsZDtcbiAgICAgICAgZnVuY3Rpb24gYWRkRnVsbEZpZWxkKGtleSwgc2NoZW1hKSB7XG4gICAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc2NoZW1hKSwge30sIHtcbiAgICAgICAgICAgIGZ1bGxGaWVsZDogXCJcIi5jb25jYXQocnVsZS5mdWxsRmllbGQsIFwiLlwiKS5jb25jYXQoa2V5KSxcbiAgICAgICAgICAgIGZ1bGxGaWVsZHM6IHJ1bGUuZnVsbEZpZWxkcyA/IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkocnVsZS5mdWxsRmllbGRzKSwgW2tleV0pIDogW2tleV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBjYigpIHtcbiAgICAgICAgICB2YXIgZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogW107XG4gICAgICAgICAgdmFyIGVycm9yTGlzdCA9IEFycmF5LmlzQXJyYXkoZSkgPyBlIDogW2VdO1xuICAgICAgICAgIGlmICghb3B0aW9ucy5zdXBwcmVzc1dhcm5pbmcgJiYgZXJyb3JMaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgU2NoZW1hLndhcm5pbmcoJ2FzeW5jLXZhbGlkYXRvcjonLCBlcnJvckxpc3QpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZXJyb3JMaXN0Lmxlbmd0aCAmJiBydWxlLm1lc3NhZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZXJyb3JMaXN0ID0gW10uY29uY2F0KHJ1bGUubWVzc2FnZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRmlsbCBlcnJvciBpbmZvXG4gICAgICAgICAgdmFyIGZpbGxlZEVycm9ycyA9IGVycm9yTGlzdC5tYXAoY29tcGxlbWVudEVycm9yKHJ1bGUsIHNvdXJjZSkpO1xuICAgICAgICAgIGlmIChvcHRpb25zLmZpcnN0ICYmIGZpbGxlZEVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGVycm9yRmllbGRzW3J1bGUuZmllbGRdID0gMTtcbiAgICAgICAgICAgIHJldHVybiBkb0l0KGZpbGxlZEVycm9ycyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghZGVlcCkge1xuICAgICAgICAgICAgZG9JdChmaWxsZWRFcnJvcnMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBpZiBydWxlIGlzIHJlcXVpcmVkIGJ1dCB0aGUgdGFyZ2V0IG9iamVjdFxuICAgICAgICAgICAgLy8gZG9lcyBub3QgZXhpc3QgZmFpbCBhdCB0aGUgcnVsZSBsZXZlbCBhbmQgZG9uJ3RcbiAgICAgICAgICAgIC8vIGdvIGRlZXBlclxuICAgICAgICAgICAgaWYgKHJ1bGUucmVxdWlyZWQgJiYgIWRhdGEudmFsdWUpIHtcbiAgICAgICAgICAgICAgaWYgKHJ1bGUubWVzc2FnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZmlsbGVkRXJyb3JzID0gW10uY29uY2F0KHJ1bGUubWVzc2FnZSkubWFwKGNvbXBsZW1lbnRFcnJvcihydWxlLCBzb3VyY2UpKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgZmlsbGVkRXJyb3JzID0gW29wdGlvbnMuZXJyb3IocnVsZSwgZm9ybWF0KG9wdGlvbnMubWVzc2FnZXMucmVxdWlyZWQsIHJ1bGUuZmllbGQpKV07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGRvSXQoZmlsbGVkRXJyb3JzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBmaWVsZHNTY2hlbWEgPSB7fTtcbiAgICAgICAgICAgIGlmIChydWxlLmRlZmF1bHRGaWVsZCkge1xuICAgICAgICAgICAgICBPYmplY3Qua2V5cyhkYXRhLnZhbHVlKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIGZpZWxkc1NjaGVtYVtrZXldID0gcnVsZS5kZWZhdWx0RmllbGQ7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmllbGRzU2NoZW1hID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBmaWVsZHNTY2hlbWEpLCBkYXRhLnJ1bGUuZmllbGRzKTtcbiAgICAgICAgICAgIHZhciBwYXJlZEZpZWxkc1NjaGVtYSA9IHt9O1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZmllbGRzU2NoZW1hKS5mb3JFYWNoKGZ1bmN0aW9uIChmaWVsZCkge1xuICAgICAgICAgICAgICB2YXIgZmllbGRTY2hlbWEgPSBmaWVsZHNTY2hlbWFbZmllbGRdO1xuICAgICAgICAgICAgICB2YXIgZmllbGRTY2hlbWFMaXN0ID0gQXJyYXkuaXNBcnJheShmaWVsZFNjaGVtYSkgPyBmaWVsZFNjaGVtYSA6IFtmaWVsZFNjaGVtYV07XG4gICAgICAgICAgICAgIHBhcmVkRmllbGRzU2NoZW1hW2ZpZWxkXSA9IGZpZWxkU2NoZW1hTGlzdC5tYXAoYWRkRnVsbEZpZWxkLmJpbmQobnVsbCwgZmllbGQpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdmFyIHNjaGVtYSA9IG5ldyBTY2hlbWEocGFyZWRGaWVsZHNTY2hlbWEpO1xuICAgICAgICAgICAgc2NoZW1hLm1lc3NhZ2VzKG9wdGlvbnMubWVzc2FnZXMpO1xuICAgICAgICAgICAgaWYgKGRhdGEucnVsZS5vcHRpb25zKSB7XG4gICAgICAgICAgICAgIGRhdGEucnVsZS5vcHRpb25zLm1lc3NhZ2VzID0gb3B0aW9ucy5tZXNzYWdlcztcbiAgICAgICAgICAgICAgZGF0YS5ydWxlLm9wdGlvbnMuZXJyb3IgPSBvcHRpb25zLmVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2NoZW1hLnZhbGlkYXRlKGRhdGEudmFsdWUsIGRhdGEucnVsZS5vcHRpb25zIHx8IG9wdGlvbnMsIGZ1bmN0aW9uIChlcnJzKSB7XG4gICAgICAgICAgICAgIHZhciBmaW5hbEVycm9ycyA9IFtdO1xuICAgICAgICAgICAgICBpZiAoZmlsbGVkRXJyb3JzICYmIGZpbGxlZEVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBmaW5hbEVycm9ycy5wdXNoLmFwcGx5KGZpbmFsRXJyb3JzLCBfdG9Db25zdW1hYmxlQXJyYXkoZmlsbGVkRXJyb3JzKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGVycnMgJiYgZXJycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBmaW5hbEVycm9ycy5wdXNoLmFwcGx5KGZpbmFsRXJyb3JzLCBfdG9Db25zdW1hYmxlQXJyYXkoZXJycykpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGRvSXQoZmluYWxFcnJvcnMubGVuZ3RoID8gZmluYWxFcnJvcnMgOiBudWxsKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVzO1xuICAgICAgICBpZiAocnVsZS5hc3luY1ZhbGlkYXRvcikge1xuICAgICAgICAgIHJlcyA9IHJ1bGUuYXN5bmNWYWxpZGF0b3IocnVsZSwgZGF0YS52YWx1ZSwgY2IsIGRhdGEuc291cmNlLCBvcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIGlmIChydWxlLnZhbGlkYXRvcikge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXMgPSBydWxlLnZhbGlkYXRvcihydWxlLCBkYXRhLnZhbHVlLCBjYiwgZGF0YS5zb3VyY2UsIG9wdGlvbnMpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB2YXIgX2NvbnNvbGUkZXJyb3IsIF9jb25zb2xlO1xuICAgICAgICAgICAgKF9jb25zb2xlJGVycm9yID0gKF9jb25zb2xlID0gY29uc29sZSkuZXJyb3IpID09PSBudWxsIHx8IF9jb25zb2xlJGVycm9yID09PSB2b2lkIDAgfHwgX2NvbnNvbGUkZXJyb3IuY2FsbChfY29uc29sZSwgZXJyb3IpO1xuICAgICAgICAgICAgLy8gcmV0aHJvdyB0byByZXBvcnQgZXJyb3JcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5zdXBwcmVzc1ZhbGlkYXRvckVycm9yKSB7XG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNiKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzID09PSB0cnVlKSB7XG4gICAgICAgICAgICBjYigpO1xuICAgICAgICAgIH0gZWxzZSBpZiAocmVzID09PSBmYWxzZSkge1xuICAgICAgICAgICAgY2IodHlwZW9mIHJ1bGUubWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJyA/IHJ1bGUubWVzc2FnZShydWxlLmZ1bGxGaWVsZCB8fCBydWxlLmZpZWxkKSA6IHJ1bGUubWVzc2FnZSB8fCBcIlwiLmNvbmNhdChydWxlLmZ1bGxGaWVsZCB8fCBydWxlLmZpZWxkLCBcIiBmYWlsc1wiKSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChyZXMgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgY2IocmVzKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICBjYihyZXMubWVzc2FnZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZXMgJiYgcmVzLnRoZW4pIHtcbiAgICAgICAgICByZXMudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gY2IoKTtcbiAgICAgICAgICB9LCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNiKGUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LCBmdW5jdGlvbiAocmVzdWx0cykge1xuICAgICAgICBjb21wbGV0ZShyZXN1bHRzKTtcbiAgICAgIH0sIHNvdXJjZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFR5cGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VHlwZShydWxlKSB7XG4gICAgICBpZiAocnVsZS50eXBlID09PSB1bmRlZmluZWQgJiYgcnVsZS5wYXR0ZXJuIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIHJ1bGUudHlwZSA9ICdwYXR0ZXJuJztcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgcnVsZS52YWxpZGF0b3IgIT09ICdmdW5jdGlvbicgJiYgcnVsZS50eXBlICYmICF2YWxpZGF0b3JzLmhhc093blByb3BlcnR5KHJ1bGUudHlwZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGZvcm1hdCgnVW5rbm93biBydWxlIHR5cGUgJXMnLCBydWxlLnR5cGUpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBydWxlLnR5cGUgfHwgJ3N0cmluZyc7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFZhbGlkYXRpb25NZXRob2RcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VmFsaWRhdGlvbk1ldGhvZChydWxlKSB7XG4gICAgICBpZiAodHlwZW9mIHJ1bGUudmFsaWRhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBydWxlLnZhbGlkYXRvcjtcbiAgICAgIH1cbiAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMocnVsZSk7XG4gICAgICB2YXIgbWVzc2FnZUluZGV4ID0ga2V5cy5pbmRleE9mKCdtZXNzYWdlJyk7XG4gICAgICBpZiAobWVzc2FnZUluZGV4ICE9PSAtMSkge1xuICAgICAgICBrZXlzLnNwbGljZShtZXNzYWdlSW5kZXgsIDEpO1xuICAgICAgfVxuICAgICAgaWYgKGtleXMubGVuZ3RoID09PSAxICYmIGtleXNbMF0gPT09ICdyZXF1aXJlZCcpIHtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRvcnMucmVxdWlyZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsaWRhdG9yc1t0aGlzLmdldFR5cGUocnVsZSldIHx8IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIFNjaGVtYTtcbn0oKTtcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT0gU3RhdGljID09PT09PT09PT09PT09PT09PT09PT09PT1cbl9kZWZpbmVQcm9wZXJ0eShTY2hlbWEsIFwicmVnaXN0ZXJcIiwgZnVuY3Rpb24gcmVnaXN0ZXIodHlwZSwgdmFsaWRhdG9yKSB7XG4gIGlmICh0eXBlb2YgdmFsaWRhdG9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVnaXN0ZXIgYSB2YWxpZGF0b3IgYnkgdHlwZSwgdmFsaWRhdG9yIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gIH1cbiAgdmFsaWRhdG9yc1t0eXBlXSA9IHZhbGlkYXRvcjtcbn0pO1xuX2RlZmluZVByb3BlcnR5KFNjaGVtYSwgXCJ3YXJuaW5nXCIsIHdhcm5pbmcpO1xuX2RlZmluZVByb3BlcnR5KFNjaGVtYSwgXCJtZXNzYWdlc1wiLCBkZWZhdWx0TWVzc2FnZXMpO1xuX2RlZmluZVByb3BlcnR5KFNjaGVtYSwgXCJ2YWxpZGF0b3JzXCIsIHZhbGlkYXRvcnMpO1xuZXhwb3J0IGRlZmF1bHQgU2NoZW1hOyIsICJpbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfcmVnZW5lcmF0b3JSdW50aW1lIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9yZWdlbmVyYXRvclJ1bnRpbWVcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX2FzeW5jVG9HZW5lcmF0b3IgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2FzeW5jVG9HZW5lcmF0b3JcIjtcbmltcG9ydCBSYXdBc3luY1ZhbGlkYXRvciBmcm9tICdAcmMtY29tcG9uZW50L2FzeW5jLXZhbGlkYXRvcic7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgd2FybmluZyBmcm9tIFwicmMtdXRpbC9lcy93YXJuaW5nXCI7XG5pbXBvcnQgeyBkZWZhdWx0VmFsaWRhdGVNZXNzYWdlcyB9IGZyb20gXCIuL21lc3NhZ2VzXCI7XG5pbXBvcnQgeyBtZXJnZSB9IGZyb20gXCJyYy11dGlsL2VzL3V0aWxzL3NldFwiO1xuXG4vLyBSZW1vdmUgaW5jb3JyZWN0IG9yaWdpbmFsIHRzIGRlZmluZVxudmFyIEFzeW5jVmFsaWRhdG9yID0gUmF3QXN5bmNWYWxpZGF0b3I7XG5cbi8qKlxuICogUmVwbGFjZSB3aXRoIHRlbXBsYXRlLlxuICogICBgSSdtICR7bmFtZX1gICsgeyBuYW1lOiAnYmFtYm9vJyB9ID0gSSdtIGJhbWJvb1xuICovXG5mdW5jdGlvbiByZXBsYWNlTWVzc2FnZSh0ZW1wbGF0ZSwga3YpIHtcbiAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2UoL1xcXFw/XFwkXFx7XFx3K1xcfS9nLCBmdW5jdGlvbiAoc3RyKSB7XG4gICAgaWYgKHN0ci5zdGFydHNXaXRoKCdcXFxcJykpIHtcbiAgICAgIHJldHVybiBzdHIuc2xpY2UoMSk7XG4gICAgfVxuICAgIHZhciBrZXkgPSBzdHIuc2xpY2UoMiwgLTEpO1xuICAgIHJldHVybiBrdltrZXldO1xuICB9KTtcbn1cbnZhciBDT0RFX0xPR0lDX0VSUk9SID0gJ0NPREVfTE9HSUNfRVJST1InO1xuZnVuY3Rpb24gdmFsaWRhdGVSdWxlKF94LCBfeDIsIF94MywgX3g0LCBfeDUpIHtcbiAgcmV0dXJuIF92YWxpZGF0ZVJ1bGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbi8qKlxuICogV2UgdXNlIGBhc3luYy12YWxpZGF0b3JgIHRvIHZhbGlkYXRlIHRoZSB2YWx1ZS5cbiAqIEJ1dCBvbmx5IGNoZWNrIG9uZSB2YWx1ZSBpbiBhIHRpbWUgdG8gYXZvaWQgbmFtZVBhdGggdmFsaWRhdGUgaXNzdWUuXG4gKi9cbmZ1bmN0aW9uIF92YWxpZGF0ZVJ1bGUoKSB7XG4gIF92YWxpZGF0ZVJ1bGUgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKG5hbWUsIHZhbHVlLCBydWxlLCBvcHRpb25zLCBtZXNzYWdlVmFyaWFibGVzKSB7XG4gICAgdmFyIGNsb25lUnVsZSwgb3JpZ2luVmFsaWRhdG9yLCBzdWJSdWxlRmllbGQsIHZhbGlkYXRvciwgbWVzc2FnZXMsIHJlc3VsdCwgc3ViUmVzdWx0cywga3YsIGZpbGxWYXJpYWJsZVJlc3VsdDtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZSgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0Mikge1xuICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgY2xvbmVSdWxlID0gX29iamVjdFNwcmVhZCh7fSwgcnVsZSk7IC8vIEJ1ZyBvZiBgYXN5bmMtdmFsaWRhdG9yYFxuICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1jb21wb25lbnQvZmllbGQtZm9ybS9pc3N1ZXMvMzE2XG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LWNvbXBvbmVudC9maWVsZC1mb3JtL2lzc3Vlcy8zMTNcbiAgICAgICAgICBkZWxldGUgY2xvbmVSdWxlLnJ1bGVJbmRleDtcblxuICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzQwNDk3I2lzc3VlY29tbWVudC0xNDIyMjgyMzc4XG4gICAgICAgICAgQXN5bmNWYWxpZGF0b3Iud2FybmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoY2xvbmVSdWxlLnZhbGlkYXRvcikge1xuICAgICAgICAgICAgb3JpZ2luVmFsaWRhdG9yID0gY2xvbmVSdWxlLnZhbGlkYXRvcjtcbiAgICAgICAgICAgIGNsb25lUnVsZS52YWxpZGF0b3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpblZhbGlkYXRvci5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KENPREVfTE9HSUNfRVJST1IpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFdlIHNob3VsZCBzcGVjaWFsIGhhbmRsZSBhcnJheSB2YWxpZGF0ZVxuICAgICAgICAgIHN1YlJ1bGVGaWVsZCA9IG51bGw7XG4gICAgICAgICAgaWYgKGNsb25lUnVsZSAmJiBjbG9uZVJ1bGUudHlwZSA9PT0gJ2FycmF5JyAmJiBjbG9uZVJ1bGUuZGVmYXVsdEZpZWxkKSB7XG4gICAgICAgICAgICBzdWJSdWxlRmllbGQgPSBjbG9uZVJ1bGUuZGVmYXVsdEZpZWxkO1xuICAgICAgICAgICAgZGVsZXRlIGNsb25lUnVsZS5kZWZhdWx0RmllbGQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhbGlkYXRvciA9IG5ldyBBc3luY1ZhbGlkYXRvcihfZGVmaW5lUHJvcGVydHkoe30sIG5hbWUsIFtjbG9uZVJ1bGVdKSk7XG4gICAgICAgICAgbWVzc2FnZXMgPSBtZXJnZShkZWZhdWx0VmFsaWRhdGVNZXNzYWdlcywgb3B0aW9ucy52YWxpZGF0ZU1lc3NhZ2VzKTtcbiAgICAgICAgICB2YWxpZGF0b3IubWVzc2FnZXMobWVzc2FnZXMpO1xuICAgICAgICAgIHJlc3VsdCA9IFtdO1xuICAgICAgICAgIF9jb250ZXh0Mi5wcmV2ID0gMTA7XG4gICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxMztcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbGlkYXRvci52YWxpZGF0ZShfZGVmaW5lUHJvcGVydHkoe30sIG5hbWUsIHZhbHVlKSwgX29iamVjdFNwcmVhZCh7fSwgb3B0aW9ucykpKTtcbiAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDE4O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgIF9jb250ZXh0Mi5wcmV2ID0gMTU7XG4gICAgICAgICAgX2NvbnRleHQyLnQwID0gX2NvbnRleHQyW1wiY2F0Y2hcIl0oMTApO1xuICAgICAgICAgIGlmIChfY29udGV4dDIudDAuZXJyb3JzKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBfY29udGV4dDIudDAuZXJyb3JzLm1hcChmdW5jdGlvbiAoX3JlZjQsIGluZGV4KSB7XG4gICAgICAgICAgICAgIHZhciBtZXNzYWdlID0gX3JlZjQubWVzc2FnZTtcbiAgICAgICAgICAgICAgdmFyIG1lcmdlZE1lc3NhZ2UgPSBtZXNzYWdlID09PSBDT0RFX0xPR0lDX0VSUk9SID8gbWVzc2FnZXMuZGVmYXVsdCA6IG1lc3NhZ2U7XG4gICAgICAgICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQobWVyZ2VkTWVzc2FnZSkgP1xuICAgICAgICAgICAgICAvKiNfX1BVUkVfXyovXG4gICAgICAgICAgICAgIC8vIFdyYXAgUmVhY3ROb2RlIHdpdGggYGtleWBcbiAgICAgICAgICAgICAgUmVhY3QuY2xvbmVFbGVtZW50KG1lcmdlZE1lc3NhZ2UsIHtcbiAgICAgICAgICAgICAgICBrZXk6IFwiZXJyb3JfXCIuY29uY2F0KGluZGV4KVxuICAgICAgICAgICAgICB9KSA6IG1lcmdlZE1lc3NhZ2U7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgaWYgKCEoIXJlc3VsdC5sZW5ndGggJiYgc3ViUnVsZUZpZWxkKSkge1xuICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyMztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDIxO1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbCh2YWx1ZS5tYXAoZnVuY3Rpb24gKHN1YlZhbHVlLCBpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVSdWxlKFwiXCIuY29uY2F0KG5hbWUsIFwiLlwiKS5jb25jYXQoaSksIHN1YlZhbHVlLCBzdWJSdWxlRmllbGQsIG9wdGlvbnMsIG1lc3NhZ2VWYXJpYWJsZXMpO1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgY2FzZSAyMTpcbiAgICAgICAgICBzdWJSZXN1bHRzID0gX2NvbnRleHQyLnNlbnQ7XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoXCJyZXR1cm5cIiwgc3ViUmVzdWx0cy5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIGVycm9ycykge1xuICAgICAgICAgICAgcmV0dXJuIFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkocHJldiksIF90b0NvbnN1bWFibGVBcnJheShlcnJvcnMpKTtcbiAgICAgICAgICB9LCBbXSkpO1xuICAgICAgICBjYXNlIDIzOlxuICAgICAgICAgIC8vIFJlcGxhY2UgbWVzc2FnZSB3aXRoIHZhcmlhYmxlc1xuICAgICAgICAgIGt2ID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBydWxlKSwge30sIHtcbiAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICBlbnVtOiAocnVsZS5lbnVtIHx8IFtdKS5qb2luKCcsICcpXG4gICAgICAgICAgfSwgbWVzc2FnZVZhcmlhYmxlcyk7XG4gICAgICAgICAgZmlsbFZhcmlhYmxlUmVzdWx0ID0gcmVzdWx0Lm1hcChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXBsYWNlTWVzc2FnZShlcnJvciwga3YpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KFwicmV0dXJuXCIsIGZpbGxWYXJpYWJsZVJlc3VsdCk7XG4gICAgICAgIGNhc2UgMjY6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTtcbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlMiwgbnVsbCwgW1sxMCwgMTVdXSk7XG4gIH0pKTtcbiAgcmV0dXJuIF92YWxpZGF0ZVJ1bGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVJ1bGVzKG5hbWVQYXRoLCB2YWx1ZSwgcnVsZXMsIG9wdGlvbnMsIHZhbGlkYXRlRmlyc3QsIG1lc3NhZ2VWYXJpYWJsZXMpIHtcbiAgdmFyIG5hbWUgPSBuYW1lUGF0aC5qb2luKCcuJyk7XG5cbiAgLy8gRmlsbCBydWxlIHdpdGggY29udGV4dFxuICB2YXIgZmlsbGVkUnVsZXMgPSBydWxlcy5tYXAoZnVuY3Rpb24gKGN1cnJlbnRSdWxlLCBydWxlSW5kZXgpIHtcbiAgICB2YXIgb3JpZ2luVmFsaWRhdG9yRnVuYyA9IGN1cnJlbnRSdWxlLnZhbGlkYXRvcjtcbiAgICB2YXIgY2xvbmVSdWxlID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBjdXJyZW50UnVsZSksIHt9LCB7XG4gICAgICBydWxlSW5kZXg6IHJ1bGVJbmRleFxuICAgIH0pO1xuXG4gICAgLy8gUmVwbGFjZSB2YWxpZGF0b3IgaWYgbmVlZGVkXG4gICAgaWYgKG9yaWdpblZhbGlkYXRvckZ1bmMpIHtcbiAgICAgIGNsb25lUnVsZS52YWxpZGF0b3IgPSBmdW5jdGlvbiAocnVsZSwgdmFsLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgaGFzUHJvbWlzZSA9IGZhbHNlO1xuXG4gICAgICAgIC8vIFdyYXAgY2FsbGJhY2sgb25seSBhY2NlcHQgd2hlbiBwcm9taXNlIG5vdCBwcm92aWRlZFxuICAgICAgICB2YXIgd3JhcHBlZENhbGxiYWNrID0gZnVuY3Rpb24gd3JhcHBlZENhbGxiYWNrKCkge1xuICAgICAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gV2FpdCBhIHRpY2sgdG8gbWFrZSBzdXJlIHJldHVybiB0eXBlIGlzIGEgcHJvbWlzZVxuICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgd2FybmluZyghaGFzUHJvbWlzZSwgJ1lvdXIgdmFsaWRhdG9yIGZ1bmN0aW9uIGhhcyBhbHJlYWR5IHJldHVybiBhIHByb21pc2UuIGBjYWxsYmFja2Agd2lsbCBiZSBpZ25vcmVkLicpO1xuICAgICAgICAgICAgaWYgKCFoYXNQcm9taXNlKSB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KHZvaWQgMCwgYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gR2V0IHByb21pc2VcbiAgICAgICAgdmFyIHByb21pc2UgPSBvcmlnaW5WYWxpZGF0b3JGdW5jKHJ1bGUsIHZhbCwgd3JhcHBlZENhbGxiYWNrKTtcbiAgICAgICAgaGFzUHJvbWlzZSA9IHByb21pc2UgJiYgdHlwZW9mIHByb21pc2UudGhlbiA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgcHJvbWlzZS5jYXRjaCA9PT0gJ2Z1bmN0aW9uJztcblxuICAgICAgICAvKipcbiAgICAgICAgICogMS4gVXNlIHByb21pc2UgYXMgdGhlIGZpcnN0IHByaW9yaXR5LlxuICAgICAgICAgKiAyLiBJZiBwcm9taXNlIG5vdCBleGlzdCwgdXNlIGNhbGxiYWNrIHdpdGggd2FybmluZyBpbnN0ZWFkXG4gICAgICAgICAqL1xuICAgICAgICB3YXJuaW5nKGhhc1Byb21pc2UsICdgY2FsbGJhY2tgIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSByZXR1cm4gYSBwcm9taXNlIGluc3RlYWQuJyk7XG4gICAgICAgIGlmIChoYXNQcm9taXNlKSB7XG4gICAgICAgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgY2FsbGJhY2soZXJyIHx8ICcgJyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBjbG9uZVJ1bGU7XG4gIH0pLnNvcnQoZnVuY3Rpb24gKF9yZWYsIF9yZWYyKSB7XG4gICAgdmFyIHcxID0gX3JlZi53YXJuaW5nT25seSxcbiAgICAgIGkxID0gX3JlZi5ydWxlSW5kZXg7XG4gICAgdmFyIHcyID0gX3JlZjIud2FybmluZ09ubHksXG4gICAgICBpMiA9IF9yZWYyLnJ1bGVJbmRleDtcbiAgICBpZiAoISF3MSA9PT0gISF3Mikge1xuICAgICAgLy8gTGV0IGtlZXAgb3JpZ2luIG9yZGVyXG4gICAgICByZXR1cm4gaTEgLSBpMjtcbiAgICB9XG4gICAgaWYgKHcxKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9KTtcblxuICAvLyBEbyB2YWxpZGF0ZSBydWxlc1xuICB2YXIgc3VtbWFyeVByb21pc2U7XG4gIGlmICh2YWxpZGF0ZUZpcnN0ID09PSB0cnVlKSB7XG4gICAgLy8gPj4+Pj4gVmFsaWRhdGUgYnkgc2VyaWFsaXphdGlvblxuICAgIHN1bW1hcnlQcm9taXNlID0gbmV3IFByb21pc2UoIC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3JlZjMgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHZhciBpLCBydWxlLCBlcnJvcnM7XG4gICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lKCkud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIGkgPSAwO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICBpZiAoIShpIDwgZmlsbGVkUnVsZXMubGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBydWxlID0gZmlsbGVkUnVsZXNbaV07XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA1O1xuICAgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVSdWxlKG5hbWUsIHZhbHVlLCBydWxlLCBvcHRpb25zLCBtZXNzYWdlVmFyaWFibGVzKTtcbiAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgZXJyb3JzID0gX2NvbnRleHQuc2VudDtcbiAgICAgICAgICAgICAgaWYgKCFlcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVqZWN0KFt7XG4gICAgICAgICAgICAgICAgZXJyb3JzOiBlcnJvcnMsXG4gICAgICAgICAgICAgICAgcnVsZTogcnVsZVxuICAgICAgICAgICAgICB9XSk7XG4gICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIik7XG4gICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgLyogZXNsaW50LWVuYWJsZSAqL1xuXG4gICAgICAgICAgICAgIHJlc29sdmUoW10pO1xuICAgICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWUpO1xuICAgICAgfSkpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfeDYsIF94Nykge1xuICAgICAgICByZXR1cm4gX3JlZjMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgfSgpKTtcbiAgfSBlbHNlIHtcbiAgICAvLyA+Pj4+PiBWYWxpZGF0ZSBieSBwYXJhbGxlbFxuICAgIHZhciBydWxlUHJvbWlzZXMgPSBmaWxsZWRSdWxlcy5tYXAoZnVuY3Rpb24gKHJ1bGUpIHtcbiAgICAgIHJldHVybiB2YWxpZGF0ZVJ1bGUobmFtZSwgdmFsdWUsIHJ1bGUsIG9wdGlvbnMsIG1lc3NhZ2VWYXJpYWJsZXMpLnRoZW4oZnVuY3Rpb24gKGVycm9ycykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGVycm9yczogZXJyb3JzLFxuICAgICAgICAgIHJ1bGU6IHJ1bGVcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHN1bW1hcnlQcm9taXNlID0gKHZhbGlkYXRlRmlyc3QgPyBmaW5pc2hPbkZpcnN0RmFpbGVkKHJ1bGVQcm9taXNlcykgOiBmaW5pc2hPbkFsbEZhaWxlZChydWxlUHJvbWlzZXMpKS50aGVuKGZ1bmN0aW9uIChlcnJvcnMpIHtcbiAgICAgIC8vIEFsd2F5cyBjaGFuZ2UgdG8gcmVqZWN0aW9uIGZvciBGaWVsZCB0byBjYXRjaFxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9ycyk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBJbnRlcm5hbCBjYXRjaCBlcnJvciB0byBhdm9pZCBjb25zb2xlIGVycm9yIGxvZy5cbiAgc3VtbWFyeVByb21pc2UuY2F0Y2goZnVuY3Rpb24gKGUpIHtcbiAgICByZXR1cm4gZTtcbiAgfSk7XG4gIHJldHVybiBzdW1tYXJ5UHJvbWlzZTtcbn1cbmZ1bmN0aW9uIGZpbmlzaE9uQWxsRmFpbGVkKF94OCkge1xuICByZXR1cm4gX2ZpbmlzaE9uQWxsRmFpbGVkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5mdW5jdGlvbiBfZmluaXNoT25BbGxGYWlsZWQoKSB7XG4gIF9maW5pc2hPbkFsbEZhaWxlZCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZSgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTMocnVsZVByb21pc2VzKSB7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUzJChfY29udGV4dDMpIHtcbiAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0My5wcmV2ID0gX2NvbnRleHQzLm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dDMuYWJydXB0KFwicmV0dXJuXCIsIFByb21pc2UuYWxsKHJ1bGVQcm9taXNlcykudGhlbihmdW5jdGlvbiAoZXJyb3JzTGlzdCkge1xuICAgICAgICAgICAgdmFyIF9yZWY1O1xuICAgICAgICAgICAgdmFyIGVycm9ycyA9IChfcmVmNSA9IFtdKS5jb25jYXQuYXBwbHkoX3JlZjUsIF90b0NvbnN1bWFibGVBcnJheShlcnJvcnNMaXN0KSk7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3JzO1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5zdG9wKCk7XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTMpO1xuICB9KSk7XG4gIHJldHVybiBfZmluaXNoT25BbGxGYWlsZWQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmZ1bmN0aW9uIGZpbmlzaE9uRmlyc3RGYWlsZWQoX3g5KSB7XG4gIHJldHVybiBfZmluaXNoT25GaXJzdEZhaWxlZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuZnVuY3Rpb24gX2ZpbmlzaE9uRmlyc3RGYWlsZWQoKSB7XG4gIF9maW5pc2hPbkZpcnN0RmFpbGVkID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lKCkubWFyayhmdW5jdGlvbiBfY2FsbGVlNChydWxlUHJvbWlzZXMpIHtcbiAgICB2YXIgY291bnQ7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWU0JChfY29udGV4dDQpIHtcbiAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0NC5wcmV2ID0gX2NvbnRleHQ0Lm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGNvdW50ID0gMDtcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0LmFicnVwdChcInJldHVyblwiLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgICAgcnVsZVByb21pc2VzLmZvckVhY2goZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgICAgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uIChydWxlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAocnVsZUVycm9yLmVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgIHJlc29sdmUoW3J1bGVFcnJvcl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb3VudCArPSAxO1xuICAgICAgICAgICAgICAgIGlmIChjb3VudCA9PT0gcnVsZVByb21pc2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgcmVzb2x2ZShbXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5zdG9wKCk7XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTQpO1xuICB9KSk7XG4gIHJldHVybiBfZmluaXNoT25GaXJzdEZhaWxlZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufSIsICJ2YXIgdHlwZVRlbXBsYXRlID0gXCInJHtuYW1lfScgaXMgbm90IGEgdmFsaWQgJHt0eXBlfVwiO1xuZXhwb3J0IHZhciBkZWZhdWx0VmFsaWRhdGVNZXNzYWdlcyA9IHtcbiAgZGVmYXVsdDogXCJWYWxpZGF0aW9uIGVycm9yIG9uIGZpZWxkICcke25hbWV9J1wiLFxuICByZXF1aXJlZDogXCInJHtuYW1lfScgaXMgcmVxdWlyZWRcIixcbiAgZW51bTogXCInJHtuYW1lfScgbXVzdCBiZSBvbmUgb2YgWyR7ZW51bX1dXCIsXG4gIHdoaXRlc3BhY2U6IFwiJyR7bmFtZX0nIGNhbm5vdCBiZSBlbXB0eVwiLFxuICBkYXRlOiB7XG4gICAgZm9ybWF0OiBcIicke25hbWV9JyBpcyBpbnZhbGlkIGZvciBmb3JtYXQgZGF0ZVwiLFxuICAgIHBhcnNlOiBcIicke25hbWV9JyBjb3VsZCBub3QgYmUgcGFyc2VkIGFzIGRhdGVcIixcbiAgICBpbnZhbGlkOiBcIicke25hbWV9JyBpcyBpbnZhbGlkIGRhdGVcIlxuICB9LFxuICB0eXBlczoge1xuICAgIHN0cmluZzogdHlwZVRlbXBsYXRlLFxuICAgIG1ldGhvZDogdHlwZVRlbXBsYXRlLFxuICAgIGFycmF5OiB0eXBlVGVtcGxhdGUsXG4gICAgb2JqZWN0OiB0eXBlVGVtcGxhdGUsXG4gICAgbnVtYmVyOiB0eXBlVGVtcGxhdGUsXG4gICAgZGF0ZTogdHlwZVRlbXBsYXRlLFxuICAgIGJvb2xlYW46IHR5cGVUZW1wbGF0ZSxcbiAgICBpbnRlZ2VyOiB0eXBlVGVtcGxhdGUsXG4gICAgZmxvYXQ6IHR5cGVUZW1wbGF0ZSxcbiAgICByZWdleHA6IHR5cGVUZW1wbGF0ZSxcbiAgICBlbWFpbDogdHlwZVRlbXBsYXRlLFxuICAgIHVybDogdHlwZVRlbXBsYXRlLFxuICAgIGhleDogdHlwZVRlbXBsYXRlXG4gIH0sXG4gIHN0cmluZzoge1xuICAgIGxlbjogXCInJHtuYW1lfScgbXVzdCBiZSBleGFjdGx5ICR7bGVufSBjaGFyYWN0ZXJzXCIsXG4gICAgbWluOiBcIicke25hbWV9JyBtdXN0IGJlIGF0IGxlYXN0ICR7bWlufSBjaGFyYWN0ZXJzXCIsXG4gICAgbWF4OiBcIicke25hbWV9JyBjYW5ub3QgYmUgbG9uZ2VyIHRoYW4gJHttYXh9IGNoYXJhY3RlcnNcIixcbiAgICByYW5nZTogXCInJHtuYW1lfScgbXVzdCBiZSBiZXR3ZWVuICR7bWlufSBhbmQgJHttYXh9IGNoYXJhY3RlcnNcIlxuICB9LFxuICBudW1iZXI6IHtcbiAgICBsZW46IFwiJyR7bmFtZX0nIG11c3QgZXF1YWwgJHtsZW59XCIsXG4gICAgbWluOiBcIicke25hbWV9JyBjYW5ub3QgYmUgbGVzcyB0aGFuICR7bWlufVwiLFxuICAgIG1heDogXCInJHtuYW1lfScgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiAke21heH1cIixcbiAgICByYW5nZTogXCInJHtuYW1lfScgbXVzdCBiZSBiZXR3ZWVuICR7bWlufSBhbmQgJHttYXh9XCJcbiAgfSxcbiAgYXJyYXk6IHtcbiAgICBsZW46IFwiJyR7bmFtZX0nIG11c3QgYmUgZXhhY3RseSAke2xlbn0gaW4gbGVuZ3RoXCIsXG4gICAgbWluOiBcIicke25hbWV9JyBjYW5ub3QgYmUgbGVzcyB0aGFuICR7bWlufSBpbiBsZW5ndGhcIixcbiAgICBtYXg6IFwiJyR7bmFtZX0nIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gJHttYXh9IGluIGxlbmd0aFwiLFxuICAgIHJhbmdlOiBcIicke25hbWV9JyBtdXN0IGJlIGJldHdlZW4gJHttaW59IGFuZCAke21heH0gaW4gbGVuZ3RoXCJcbiAgfSxcbiAgcGF0dGVybjoge1xuICAgIG1pc21hdGNoOiBcIicke25hbWV9JyBkb2VzIG5vdCBtYXRjaCBwYXR0ZXJuICR7cGF0dGVybn1cIlxuICB9XG59OyIsICJpbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IGdldFZhbHVlIGZyb20gXCJyYy11dGlsL2VzL3V0aWxzL2dldFwiO1xuaW1wb3J0IHNldFZhbHVlIGZyb20gXCJyYy11dGlsL2VzL3V0aWxzL3NldFwiO1xuaW1wb3J0IHsgdG9BcnJheSB9IGZyb20gXCIuL3R5cGVVdGlsXCI7XG5leHBvcnQgeyBnZXRWYWx1ZSwgc2V0VmFsdWUgfTtcblxuLyoqXG4gKiBDb252ZXJ0IG5hbWUgdG8gaW50ZXJuYWwgc3VwcG9ydGVkIGZvcm1hdC5cbiAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGtlZXAgc2luY2Ugd2Ugc3RpbGwgdGhpbmtpbmcgaWYgbmVlZCBzdXBwb3J0IGxpa2UgYGEuYi5jYCBmb3JtYXQuXG4gKiAnYScgPT4gWydhJ11cbiAqIDEyMyA9PiBbMTIzXVxuICogWydhJywgMTIzXSA9PiBbJ2EnLCAxMjNdXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROYW1lUGF0aChwYXRoKSB7XG4gIHJldHVybiB0b0FycmF5KHBhdGgpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNsb25lQnlOYW1lUGF0aExpc3Qoc3RvcmUsIG5hbWVQYXRoTGlzdCkge1xuICB2YXIgbmV3U3RvcmUgPSB7fTtcbiAgbmFtZVBhdGhMaXN0LmZvckVhY2goZnVuY3Rpb24gKG5hbWVQYXRoKSB7XG4gICAgdmFyIHZhbHVlID0gZ2V0VmFsdWUoc3RvcmUsIG5hbWVQYXRoKTtcbiAgICBuZXdTdG9yZSA9IHNldFZhbHVlKG5ld1N0b3JlLCBuYW1lUGF0aCwgdmFsdWUpO1xuICB9KTtcbiAgcmV0dXJuIG5ld1N0b3JlO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGBuYW1lUGF0aExpc3RgIGluY2x1ZGVzIGBuYW1lUGF0aGAuXG4gKiBAcGFyYW0gbmFtZVBhdGhMaXN0IEEgbGlzdCBvZiBgSW50ZXJuYWxOYW1lUGF0aFtdYFxuICogQHBhcmFtIG5hbWVQYXRoIENvbXBhcmUgYEludGVybmFsTmFtZVBhdGhgXG4gKiBAcGFyYW0gcGFydGlhbE1hdGNoIFRydWUgd2lsbCBtYWtlIGBbYSwgYl1gIG1hdGNoIGBbYSwgYiwgY11gXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb250YWluc05hbWVQYXRoKG5hbWVQYXRoTGlzdCwgbmFtZVBhdGgpIHtcbiAgdmFyIHBhcnRpYWxNYXRjaCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogZmFsc2U7XG4gIHJldHVybiBuYW1lUGF0aExpc3QgJiYgbmFtZVBhdGhMaXN0LnNvbWUoZnVuY3Rpb24gKHBhdGgpIHtcbiAgICByZXR1cm4gbWF0Y2hOYW1lUGF0aChuYW1lUGF0aCwgcGF0aCwgcGFydGlhbE1hdGNoKTtcbiAgfSk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYG5hbWVQYXRoYCBpcyBzdXBlciBzZXQgb3IgZXF1YWwgb2YgYHN1Yk5hbWVQYXRoYC5cbiAqIEBwYXJhbSBuYW1lUGF0aCBBIGxpc3Qgb2YgYEludGVybmFsTmFtZVBhdGhbXWBcbiAqIEBwYXJhbSBzdWJOYW1lUGF0aCBDb21wYXJlIGBJbnRlcm5hbE5hbWVQYXRoYFxuICogQHBhcmFtIHBhcnRpYWxNYXRjaCBUcnVlIHdpbGwgbWFrZSBgW2EsIGJdYCBtYXRjaCBgW2EsIGIsIGNdYFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hOYW1lUGF0aChuYW1lUGF0aCwgc3ViTmFtZVBhdGgpIHtcbiAgdmFyIHBhcnRpYWxNYXRjaCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogZmFsc2U7XG4gIGlmICghbmFtZVBhdGggfHwgIXN1Yk5hbWVQYXRoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICghcGFydGlhbE1hdGNoICYmIG5hbWVQYXRoLmxlbmd0aCAhPT0gc3ViTmFtZVBhdGgubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBzdWJOYW1lUGF0aC5ldmVyeShmdW5jdGlvbiAobmFtZVVuaXQsIGkpIHtcbiAgICByZXR1cm4gbmFtZVBhdGhbaV0gPT09IG5hbWVVbml0O1xuICB9KTtcbn1cblxuLy8gTGlrZSBgc2hhbGxvd0VxdWFsYCwgYnV0IHdlIG5vdCBjaGVjayB0aGUgZGF0YSB3aGljaCBtYXkgY2F1c2UgcmUtcmVuZGVyXG5cbmV4cG9ydCBmdW5jdGlvbiBpc1NpbWlsYXIoc291cmNlLCB0YXJnZXQpIHtcbiAgaWYgKHNvdXJjZSA9PT0gdGFyZ2V0KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKCFzb3VyY2UgJiYgdGFyZ2V0IHx8IHNvdXJjZSAmJiAhdGFyZ2V0KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICghc291cmNlIHx8ICF0YXJnZXQgfHwgX3R5cGVvZihzb3VyY2UpICE9PSAnb2JqZWN0JyB8fCBfdHlwZW9mKHRhcmdldCkgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgdmFyIHRhcmdldEtleXMgPSBPYmplY3Qua2V5cyh0YXJnZXQpO1xuICB2YXIga2V5cyA9IG5ldyBTZXQoW10uY29uY2F0KHNvdXJjZUtleXMsIHRhcmdldEtleXMpKTtcbiAgcmV0dXJuIF90b0NvbnN1bWFibGVBcnJheShrZXlzKS5ldmVyeShmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIHNvdXJjZVZhbHVlID0gc291cmNlW2tleV07XG4gICAgdmFyIHRhcmdldFZhbHVlID0gdGFyZ2V0W2tleV07XG4gICAgaWYgKHR5cGVvZiBzb3VyY2VWYWx1ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdGFyZ2V0VmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gc291cmNlVmFsdWUgPT09IHRhcmdldFZhbHVlO1xuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0R2V0VmFsdWVGcm9tRXZlbnQodmFsdWVQcm9wTmFtZSkge1xuICB2YXIgZXZlbnQgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgPyB1bmRlZmluZWQgOiBhcmd1bWVudHNbMV07XG4gIGlmIChldmVudCAmJiBldmVudC50YXJnZXQgJiYgX3R5cGVvZihldmVudC50YXJnZXQpID09PSAnb2JqZWN0JyAmJiB2YWx1ZVByb3BOYW1lIGluIGV2ZW50LnRhcmdldCkge1xuICAgIHJldHVybiBldmVudC50YXJnZXRbdmFsdWVQcm9wTmFtZV07XG4gIH1cbiAgcmV0dXJuIGV2ZW50O1xufVxuXG4vKipcbiAqIE1vdmVzIGFuIGFycmF5IGl0ZW0gZnJvbSBvbmUgcG9zaXRpb24gaW4gYW4gYXJyYXkgdG8gYW5vdGhlci5cbiAqXG4gKiBOb3RlOiBUaGlzIGlzIGEgcHVyZSBmdW5jdGlvbiBzbyBhIG5ldyBhcnJheSB3aWxsIGJlIHJldHVybmVkLCBpbnN0ZWFkXG4gKiBvZiBhbHRlcmluZyB0aGUgYXJyYXkgYXJndW1lbnQuXG4gKlxuICogQHBhcmFtIGFycmF5ICAgICAgICAgQXJyYXkgaW4gd2hpY2ggdG8gbW92ZSBhbiBpdGVtLiAgICAgICAgIChyZXF1aXJlZClcbiAqIEBwYXJhbSBtb3ZlSW5kZXggICAgIFRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byBtb3ZlLiAgICAgICAgICAocmVxdWlyZWQpXG4gKiBAcGFyYW0gdG9JbmRleCAgICAgICBUaGUgaW5kZXggdG8gbW92ZSBpdGVtIGF0IG1vdmVJbmRleCB0by4gKHJlcXVpcmVkKVxuICovXG5leHBvcnQgZnVuY3Rpb24gbW92ZShhcnJheSwgbW92ZUluZGV4LCB0b0luZGV4KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gIGlmIChtb3ZlSW5kZXggPCAwIHx8IG1vdmVJbmRleCA+PSBsZW5ndGggfHwgdG9JbmRleCA8IDAgfHwgdG9JbmRleCA+PSBsZW5ndGgpIHtcbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cbiAgdmFyIGl0ZW0gPSBhcnJheVttb3ZlSW5kZXhdO1xuICB2YXIgZGlmZiA9IG1vdmVJbmRleCAtIHRvSW5kZXg7XG4gIGlmIChkaWZmID4gMCkge1xuICAgIC8vIG1vdmUgbGVmdFxuICAgIHJldHVybiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGFycmF5LnNsaWNlKDAsIHRvSW5kZXgpKSwgW2l0ZW1dLCBfdG9Db25zdW1hYmxlQXJyYXkoYXJyYXkuc2xpY2UodG9JbmRleCwgbW92ZUluZGV4KSksIF90b0NvbnN1bWFibGVBcnJheShhcnJheS5zbGljZShtb3ZlSW5kZXggKyAxLCBsZW5ndGgpKSk7XG4gIH1cbiAgaWYgKGRpZmYgPCAwKSB7XG4gICAgLy8gbW92ZSByaWdodFxuICAgIHJldHVybiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGFycmF5LnNsaWNlKDAsIG1vdmVJbmRleCkpLCBfdG9Db25zdW1hYmxlQXJyYXkoYXJyYXkuc2xpY2UobW92ZUluZGV4ICsgMSwgdG9JbmRleCArIDEpKSwgW2l0ZW1dLCBfdG9Db25zdW1hYmxlQXJyYXkoYXJyYXkuc2xpY2UodG9JbmRleCArIDEsIGxlbmd0aCkpKTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59IiwgImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuaW1wb3J0IEZpZWxkQ29udGV4dCBmcm9tIFwiLi9GaWVsZENvbnRleHRcIjtcbmltcG9ydCBGaWVsZCBmcm9tIFwiLi9GaWVsZFwiO1xuaW1wb3J0IHsgbW92ZSBhcyBfbW92ZSwgZ2V0TmFtZVBhdGggfSBmcm9tIFwiLi91dGlscy92YWx1ZVV0aWxcIjtcbmltcG9ydCBMaXN0Q29udGV4dCBmcm9tIFwiLi9MaXN0Q29udGV4dFwiO1xuZnVuY3Rpb24gTGlzdChfcmVmKSB7XG4gIHZhciBuYW1lID0gX3JlZi5uYW1lLFxuICAgIGluaXRpYWxWYWx1ZSA9IF9yZWYuaW5pdGlhbFZhbHVlLFxuICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICBydWxlcyA9IF9yZWYucnVsZXMsXG4gICAgdmFsaWRhdGVUcmlnZ2VyID0gX3JlZi52YWxpZGF0ZVRyaWdnZXIsXG4gICAgaXNMaXN0RmllbGQgPSBfcmVmLmlzTGlzdEZpZWxkO1xuICB2YXIgY29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoRmllbGRDb250ZXh0KTtcbiAgdmFyIHdyYXBwZXJMaXN0Q29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoTGlzdENvbnRleHQpO1xuICB2YXIga2V5UmVmID0gUmVhY3QudXNlUmVmKHtcbiAgICBrZXlzOiBbXSxcbiAgICBpZDogMFxuICB9KTtcbiAgdmFyIGtleU1hbmFnZXIgPSBrZXlSZWYuY3VycmVudDtcbiAgdmFyIHByZWZpeE5hbWUgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcGFyZW50UHJlZml4TmFtZSA9IGdldE5hbWVQYXRoKGNvbnRleHQucHJlZml4TmFtZSkgfHwgW107XG4gICAgcmV0dXJuIFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkocGFyZW50UHJlZml4TmFtZSksIF90b0NvbnN1bWFibGVBcnJheShnZXROYW1lUGF0aChuYW1lKSkpO1xuICB9LCBbY29udGV4dC5wcmVmaXhOYW1lLCBuYW1lXSk7XG4gIHZhciBmaWVsZENvbnRleHQgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBjb250ZXh0KSwge30sIHtcbiAgICAgIHByZWZpeE5hbWU6IHByZWZpeE5hbWVcbiAgICB9KTtcbiAgfSwgW2NvbnRleHQsIHByZWZpeE5hbWVdKTtcblxuICAvLyBMaXN0IGNvbnRleHRcbiAgdmFyIGxpc3RDb250ZXh0ID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdldEtleTogZnVuY3Rpb24gZ2V0S2V5KG5hbWVQYXRoKSB7XG4gICAgICAgIHZhciBsZW4gPSBwcmVmaXhOYW1lLmxlbmd0aDtcbiAgICAgICAgdmFyIHBhdGhOYW1lID0gbmFtZVBhdGhbbGVuXTtcbiAgICAgICAgcmV0dXJuIFtrZXlNYW5hZ2VyLmtleXNbcGF0aE5hbWVdLCBuYW1lUGF0aC5zbGljZShsZW4gKyAxKV07XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW3ByZWZpeE5hbWVdKTtcblxuICAvLyBVc2VyIHNob3VsZCBub3QgcGFzcyBgY2hpbGRyZW5gIGFzIG90aGVyIHR5cGUuXG4gIGlmICh0eXBlb2YgY2hpbGRyZW4gIT09ICdmdW5jdGlvbicpIHtcbiAgICB3YXJuaW5nKGZhbHNlLCAnRm9ybS5MaXN0IG9ubHkgYWNjZXB0cyBmdW5jdGlvbiBhcyBjaGlsZHJlbi4nKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2YXIgc2hvdWxkVXBkYXRlID0gZnVuY3Rpb24gc2hvdWxkVXBkYXRlKHByZXZWYWx1ZSwgbmV4dFZhbHVlLCBfcmVmMikge1xuICAgIHZhciBzb3VyY2UgPSBfcmVmMi5zb3VyY2U7XG4gICAgaWYgKHNvdXJjZSA9PT0gJ2ludGVybmFsJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gcHJldlZhbHVlICE9PSBuZXh0VmFsdWU7XG4gIH07XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMaXN0Q29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBsaXN0Q29udGV4dFxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGaWVsZENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogZmllbGRDb250ZXh0XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZpZWxkLCB7XG4gICAgbmFtZTogW10sXG4gICAgc2hvdWxkVXBkYXRlOiBzaG91bGRVcGRhdGUsXG4gICAgcnVsZXM6IHJ1bGVzLFxuICAgIHZhbGlkYXRlVHJpZ2dlcjogdmFsaWRhdGVUcmlnZ2VyLFxuICAgIGluaXRpYWxWYWx1ZTogaW5pdGlhbFZhbHVlLFxuICAgIGlzTGlzdDogdHJ1ZSxcbiAgICBpc0xpc3RGaWVsZDogaXNMaXN0RmllbGQgIT09IG51bGwgJiYgaXNMaXN0RmllbGQgIT09IHZvaWQgMCA/IGlzTGlzdEZpZWxkIDogISF3cmFwcGVyTGlzdENvbnRleHRcbiAgfSwgZnVuY3Rpb24gKF9yZWYzLCBtZXRhKSB7XG4gICAgdmFyIF9yZWYzJHZhbHVlID0gX3JlZjMudmFsdWUsXG4gICAgICB2YWx1ZSA9IF9yZWYzJHZhbHVlID09PSB2b2lkIDAgPyBbXSA6IF9yZWYzJHZhbHVlLFxuICAgICAgb25DaGFuZ2UgPSBfcmVmMy5vbkNoYW5nZTtcbiAgICB2YXIgZ2V0RmllbGRWYWx1ZSA9IGNvbnRleHQuZ2V0RmllbGRWYWx1ZTtcbiAgICB2YXIgZ2V0TmV3VmFsdWUgPSBmdW5jdGlvbiBnZXROZXdWYWx1ZSgpIHtcbiAgICAgIHZhciB2YWx1ZXMgPSBnZXRGaWVsZFZhbHVlKHByZWZpeE5hbWUgfHwgW10pO1xuICAgICAgcmV0dXJuIHZhbHVlcyB8fCBbXTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFsd2F5cyBnZXQgbGF0ZXN0IHZhbHVlIGluIGNhc2UgdXNlciB1cGRhdGUgZmllbGRzIGJ5IGBmb3JtYCBhcGkuXG4gICAgICovXG4gICAgdmFyIG9wZXJhdGlvbnMgPSB7XG4gICAgICBhZGQ6IGZ1bmN0aW9uIGFkZChkZWZhdWx0VmFsdWUsIGluZGV4KSB7XG4gICAgICAgIC8vIE1hcHBpbmcga2V5c1xuICAgICAgICB2YXIgbmV3VmFsdWUgPSBnZXROZXdWYWx1ZSgpO1xuICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8PSBuZXdWYWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICBrZXlNYW5hZ2VyLmtleXMgPSBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGtleU1hbmFnZXIua2V5cy5zbGljZSgwLCBpbmRleCkpLCBba2V5TWFuYWdlci5pZF0sIF90b0NvbnN1bWFibGVBcnJheShrZXlNYW5hZ2VyLmtleXMuc2xpY2UoaW5kZXgpKSk7XG4gICAgICAgICAgb25DaGFuZ2UoW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShuZXdWYWx1ZS5zbGljZSgwLCBpbmRleCkpLCBbZGVmYXVsdFZhbHVlXSwgX3RvQ29uc3VtYWJsZUFycmF5KG5ld1ZhbHVlLnNsaWNlKGluZGV4KSkpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAoaW5kZXggPCAwIHx8IGluZGV4ID4gbmV3VmFsdWUubGVuZ3RoKSkge1xuICAgICAgICAgICAgd2FybmluZyhmYWxzZSwgJ1RoZSBzZWNvbmQgcGFyYW1ldGVyIG9mIHRoZSBhZGQgZnVuY3Rpb24gc2hvdWxkIGJlIGEgdmFsaWQgcG9zaXRpdmUgbnVtYmVyLicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBrZXlNYW5hZ2VyLmtleXMgPSBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGtleU1hbmFnZXIua2V5cyksIFtrZXlNYW5hZ2VyLmlkXSk7XG4gICAgICAgICAgb25DaGFuZ2UoW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShuZXdWYWx1ZSksIFtkZWZhdWx0VmFsdWVdKSk7XG4gICAgICAgIH1cbiAgICAgICAga2V5TWFuYWdlci5pZCArPSAxO1xuICAgICAgfSxcbiAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKGluZGV4KSB7XG4gICAgICAgIHZhciBuZXdWYWx1ZSA9IGdldE5ld1ZhbHVlKCk7XG4gICAgICAgIHZhciBpbmRleFNldCA9IG5ldyBTZXQoQXJyYXkuaXNBcnJheShpbmRleCkgPyBpbmRleCA6IFtpbmRleF0pO1xuICAgICAgICBpZiAoaW5kZXhTZXQuc2l6ZSA8PSAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGtleU1hbmFnZXIua2V5cyA9IGtleU1hbmFnZXIua2V5cy5maWx0ZXIoZnVuY3Rpb24gKF8sIGtleXNJbmRleCkge1xuICAgICAgICAgIHJldHVybiAhaW5kZXhTZXQuaGFzKGtleXNJbmRleCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFRyaWdnZXIgc3RvcmUgY2hhbmdlXG4gICAgICAgIG9uQ2hhbmdlKG5ld1ZhbHVlLmZpbHRlcihmdW5jdGlvbiAoXywgdmFsdWVJbmRleCkge1xuICAgICAgICAgIHJldHVybiAhaW5kZXhTZXQuaGFzKHZhbHVlSW5kZXgpO1xuICAgICAgICB9KSk7XG4gICAgICB9LFxuICAgICAgbW92ZTogZnVuY3Rpb24gbW92ZShmcm9tLCB0bykge1xuICAgICAgICBpZiAoZnJvbSA9PT0gdG8pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5ld1ZhbHVlID0gZ2V0TmV3VmFsdWUoKTtcblxuICAgICAgICAvLyBEbyBub3QgaGFuZGxlIG91dCBvZiByYW5nZVxuICAgICAgICBpZiAoZnJvbSA8IDAgfHwgZnJvbSA+PSBuZXdWYWx1ZS5sZW5ndGggfHwgdG8gPCAwIHx8IHRvID49IG5ld1ZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBrZXlNYW5hZ2VyLmtleXMgPSBfbW92ZShrZXlNYW5hZ2VyLmtleXMsIGZyb20sIHRvKTtcblxuICAgICAgICAvLyBUcmlnZ2VyIHN0b3JlIGNoYW5nZVxuICAgICAgICBvbkNoYW5nZShfbW92ZShuZXdWYWx1ZSwgZnJvbSwgdG8pKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciBsaXN0VmFsdWUgPSB2YWx1ZSB8fCBbXTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobGlzdFZhbHVlKSkge1xuICAgICAgbGlzdFZhbHVlID0gW107XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICB3YXJuaW5nKGZhbHNlLCBcIkN1cnJlbnQgdmFsdWUgb2YgJ1wiLmNvbmNhdChwcmVmaXhOYW1lLmpvaW4oJyA+ICcpLCBcIicgaXMgbm90IGFuIGFycmF5IHR5cGUuXCIpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNoaWxkcmVuKGxpc3RWYWx1ZS5tYXAoZnVuY3Rpb24gKF9fLCBpbmRleCkge1xuICAgICAgdmFyIGtleSA9IGtleU1hbmFnZXIua2V5c1tpbmRleF07XG4gICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAga2V5TWFuYWdlci5rZXlzW2luZGV4XSA9IGtleU1hbmFnZXIuaWQ7XG4gICAgICAgIGtleSA9IGtleU1hbmFnZXIua2V5c1tpbmRleF07XG4gICAgICAgIGtleU1hbmFnZXIuaWQgKz0gMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IGluZGV4LFxuICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgaXNMaXN0RmllbGQ6IHRydWVcbiAgICAgIH07XG4gICAgfSksIG9wZXJhdGlvbnMsIG1ldGEpO1xuICB9KSkpO1xufVxuZXhwb3J0IGRlZmF1bHQgTGlzdDsiLCAiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wibmFtZVwiXTtcbmltcG9ydCB7IG1lcmdlIH0gZnJvbSBcInJjLXV0aWwvZXMvdXRpbHMvc2V0XCI7XG5pbXBvcnQgd2FybmluZyBmcm9tIFwicmMtdXRpbC9lcy93YXJuaW5nXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBIT09LX01BUksgfSBmcm9tIFwiLi9GaWVsZENvbnRleHRcIjtcbmltcG9ydCB7IGFsbFByb21pc2VGaW5pc2ggfSBmcm9tIFwiLi91dGlscy9hc3luY1V0aWxcIjtcbmltcG9ydCB7IGRlZmF1bHRWYWxpZGF0ZU1lc3NhZ2VzIH0gZnJvbSBcIi4vdXRpbHMvbWVzc2FnZXNcIjtcbmltcG9ydCBOYW1lTWFwIGZyb20gXCIuL3V0aWxzL05hbWVNYXBcIjtcbmltcG9ydCB7IGNsb25lQnlOYW1lUGF0aExpc3QsIGNvbnRhaW5zTmFtZVBhdGgsIGdldE5hbWVQYXRoLCBnZXRWYWx1ZSwgbWF0Y2hOYW1lUGF0aCwgc2V0VmFsdWUgfSBmcm9tIFwiLi91dGlscy92YWx1ZVV0aWxcIjtcbmV4cG9ydCB2YXIgRm9ybVN0b3JlID0gLyojX19QVVJFX18qL19jcmVhdGVDbGFzcyhmdW5jdGlvbiBGb3JtU3RvcmUoZm9yY2VSb290VXBkYXRlKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG4gIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBGb3JtU3RvcmUpO1xuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJmb3JtSG9va2VkXCIsIGZhbHNlKTtcbiAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiZm9yY2VSb290VXBkYXRlXCIsIHZvaWQgMCk7XG4gIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInN1YnNjcmliYWJsZVwiLCB0cnVlKTtcbiAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwic3RvcmVcIiwge30pO1xuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJmaWVsZEVudGl0aWVzXCIsIFtdKTtcbiAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiaW5pdGlhbFZhbHVlc1wiLCB7fSk7XG4gIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImNhbGxiYWNrc1wiLCB7fSk7XG4gIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInZhbGlkYXRlTWVzc2FnZXNcIiwgbnVsbCk7XG4gIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInByZXNlcnZlXCIsIG51bGwpO1xuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJsYXN0VmFsaWRhdGVQcm9taXNlXCIsIG51bGwpO1xuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJnZXRGb3JtXCIsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZ2V0RmllbGRWYWx1ZTogX3RoaXMuZ2V0RmllbGRWYWx1ZSxcbiAgICAgIGdldEZpZWxkc1ZhbHVlOiBfdGhpcy5nZXRGaWVsZHNWYWx1ZSxcbiAgICAgIGdldEZpZWxkRXJyb3I6IF90aGlzLmdldEZpZWxkRXJyb3IsXG4gICAgICBnZXRGaWVsZFdhcm5pbmc6IF90aGlzLmdldEZpZWxkV2FybmluZyxcbiAgICAgIGdldEZpZWxkc0Vycm9yOiBfdGhpcy5nZXRGaWVsZHNFcnJvcixcbiAgICAgIGlzRmllbGRzVG91Y2hlZDogX3RoaXMuaXNGaWVsZHNUb3VjaGVkLFxuICAgICAgaXNGaWVsZFRvdWNoZWQ6IF90aGlzLmlzRmllbGRUb3VjaGVkLFxuICAgICAgaXNGaWVsZFZhbGlkYXRpbmc6IF90aGlzLmlzRmllbGRWYWxpZGF0aW5nLFxuICAgICAgaXNGaWVsZHNWYWxpZGF0aW5nOiBfdGhpcy5pc0ZpZWxkc1ZhbGlkYXRpbmcsXG4gICAgICByZXNldEZpZWxkczogX3RoaXMucmVzZXRGaWVsZHMsXG4gICAgICBzZXRGaWVsZHM6IF90aGlzLnNldEZpZWxkcyxcbiAgICAgIHNldEZpZWxkVmFsdWU6IF90aGlzLnNldEZpZWxkVmFsdWUsXG4gICAgICBzZXRGaWVsZHNWYWx1ZTogX3RoaXMuc2V0RmllbGRzVmFsdWUsXG4gICAgICB2YWxpZGF0ZUZpZWxkczogX3RoaXMudmFsaWRhdGVGaWVsZHMsXG4gICAgICBzdWJtaXQ6IF90aGlzLnN1Ym1pdCxcbiAgICAgIF9pbml0OiB0cnVlLFxuICAgICAgZ2V0SW50ZXJuYWxIb29rczogX3RoaXMuZ2V0SW50ZXJuYWxIb29rc1xuICAgIH07XG4gIH0pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gSW50ZXJuYWwgSG9va3MgPT09PT09PT09PT09PT09PT09PT09PT09XG4gIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImdldEludGVybmFsSG9va3NcIiwgZnVuY3Rpb24gKGtleSkge1xuICAgIGlmIChrZXkgPT09IEhPT0tfTUFSSykge1xuICAgICAgX3RoaXMuZm9ybUhvb2tlZCA9IHRydWU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXNwYXRjaDogX3RoaXMuZGlzcGF0Y2gsXG4gICAgICAgIGluaXRFbnRpdHlWYWx1ZTogX3RoaXMuaW5pdEVudGl0eVZhbHVlLFxuICAgICAgICByZWdpc3RlckZpZWxkOiBfdGhpcy5yZWdpc3RlckZpZWxkLFxuICAgICAgICB1c2VTdWJzY3JpYmU6IF90aGlzLnVzZVN1YnNjcmliZSxcbiAgICAgICAgc2V0SW5pdGlhbFZhbHVlczogX3RoaXMuc2V0SW5pdGlhbFZhbHVlcyxcbiAgICAgICAgZGVzdHJveUZvcm06IF90aGlzLmRlc3Ryb3lGb3JtLFxuICAgICAgICBzZXRDYWxsYmFja3M6IF90aGlzLnNldENhbGxiYWNrcyxcbiAgICAgICAgc2V0VmFsaWRhdGVNZXNzYWdlczogX3RoaXMuc2V0VmFsaWRhdGVNZXNzYWdlcyxcbiAgICAgICAgZ2V0RmllbGRzOiBfdGhpcy5nZXRGaWVsZHMsXG4gICAgICAgIHNldFByZXNlcnZlOiBfdGhpcy5zZXRQcmVzZXJ2ZSxcbiAgICAgICAgZ2V0SW5pdGlhbFZhbHVlOiBfdGhpcy5nZXRJbml0aWFsVmFsdWUsXG4gICAgICAgIHJlZ2lzdGVyV2F0Y2g6IF90aGlzLnJlZ2lzdGVyV2F0Y2hcbiAgICAgIH07XG4gICAgfVxuICAgIHdhcm5pbmcoZmFsc2UsICdgZ2V0SW50ZXJuYWxIb29rc2AgaXMgaW50ZXJuYWwgdXNhZ2UuIFNob3VsZCBub3QgY2FsbCBkaXJlY3RseS4nKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSk7XG4gIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInVzZVN1YnNjcmliZVwiLCBmdW5jdGlvbiAoc3Vic2NyaWJhYmxlKSB7XG4gICAgX3RoaXMuc3Vic2NyaWJhYmxlID0gc3Vic2NyaWJhYmxlO1xuICB9KTtcbiAgLyoqXG4gICAqIFJlY29yZCBwcmV2IEZvcm0gdW5tb3VudCBmaWVsZEVudGl0aWVzIHdoaWNoIGNvbmZpZyBwcmVzZXJ2ZSBmYWxzZS5cbiAgICogVGhpcyBuZWVkIHRvIGJlIHJlZmlsbCB3aXRoIGluaXRpYWxWYWx1ZXMgaW5zdGVhZCBvZiBzdG9yZSB2YWx1ZS5cbiAgICovXG4gIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInByZXZXaXRob3V0UHJlc2VydmVzXCIsIG51bGwpO1xuICAvKipcbiAgICogRmlyc3QgdGltZSBgc2V0SW5pdGlhbFZhbHVlc2Agc2hvdWxkIHVwZGF0ZSBzdG9yZSB3aXRoIGluaXRpYWwgdmFsdWVcbiAgICovXG4gIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInNldEluaXRpYWxWYWx1ZXNcIiwgZnVuY3Rpb24gKGluaXRpYWxWYWx1ZXMsIGluaXQpIHtcbiAgICBfdGhpcy5pbml0aWFsVmFsdWVzID0gaW5pdGlhbFZhbHVlcyB8fCB7fTtcbiAgICBpZiAoaW5pdCkge1xuICAgICAgdmFyIF90aGlzJHByZXZXaXRob3V0UHJlcztcbiAgICAgIHZhciBuZXh0U3RvcmUgPSBtZXJnZShpbml0aWFsVmFsdWVzLCBfdGhpcy5zdG9yZSk7XG5cbiAgICAgIC8vIFdlIHdpbGwgdGFrZSBjb25zaWRlciBwcmV2IGZvcm0gdW5tb3VudCBmaWVsZHMuXG4gICAgICAvLyBXaGVuIHRoZSBmaWVsZCBpcyBub3QgYHByZXNlcnZlYCwgd2UgbmVlZCBmaWxsIHRoaXMgd2l0aCBpbml0aWFsVmFsdWVzIGluc3RlYWQgb2Ygc3RvcmUuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgYXJyYXktY2FsbGJhY2stcmV0dXJuXG4gICAgICAoX3RoaXMkcHJldldpdGhvdXRQcmVzID0gX3RoaXMucHJldldpdGhvdXRQcmVzZXJ2ZXMpID09PSBudWxsIHx8IF90aGlzJHByZXZXaXRob3V0UHJlcyA9PT0gdm9pZCAwIHx8IF90aGlzJHByZXZXaXRob3V0UHJlcy5tYXAoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgdmFyIG5hbWVQYXRoID0gX3JlZi5rZXk7XG4gICAgICAgIG5leHRTdG9yZSA9IHNldFZhbHVlKG5leHRTdG9yZSwgbmFtZVBhdGgsIGdldFZhbHVlKGluaXRpYWxWYWx1ZXMsIG5hbWVQYXRoKSk7XG4gICAgICB9KTtcbiAgICAgIF90aGlzLnByZXZXaXRob3V0UHJlc2VydmVzID0gbnVsbDtcbiAgICAgIF90aGlzLnVwZGF0ZVN0b3JlKG5leHRTdG9yZSk7XG4gICAgfVxuICB9KTtcbiAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiZGVzdHJveUZvcm1cIiwgZnVuY3Rpb24gKGNsZWFyT25EZXN0cm95KSB7XG4gICAgaWYgKGNsZWFyT25EZXN0cm95KSB7XG4gICAgICAvLyBkZXN0cm95IGZvcm0gcmVzZXQgc3RvcmVcbiAgICAgIF90aGlzLnVwZGF0ZVN0b3JlKHt9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRmlsbCBwcmVzZXJ2ZSBmaWVsZHNcbiAgICAgIHZhciBwcmV2V2l0aG91dFByZXNlcnZlcyA9IG5ldyBOYW1lTWFwKCk7XG4gICAgICBfdGhpcy5nZXRGaWVsZEVudGl0aWVzKHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eSkge1xuICAgICAgICBpZiAoIV90aGlzLmlzTWVyZ2VkUHJlc2VydmUoZW50aXR5LmlzUHJlc2VydmUoKSkpIHtcbiAgICAgICAgICBwcmV2V2l0aG91dFByZXNlcnZlcy5zZXQoZW50aXR5LmdldE5hbWVQYXRoKCksIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIF90aGlzLnByZXZXaXRob3V0UHJlc2VydmVzID0gcHJldldpdGhvdXRQcmVzZXJ2ZXM7XG4gICAgfVxuICB9KTtcbiAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiZ2V0SW5pdGlhbFZhbHVlXCIsIGZ1bmN0aW9uIChuYW1lUGF0aCkge1xuICAgIHZhciBpbml0VmFsdWUgPSBnZXRWYWx1ZShfdGhpcy5pbml0aWFsVmFsdWVzLCBuYW1lUGF0aCk7XG5cbiAgICAvLyBOb3QgY2xvbmVEZWVwIHdoZW4gd2l0aG91dCBgbmFtZVBhdGhgXG4gICAgcmV0dXJuIG5hbWVQYXRoLmxlbmd0aCA/IG1lcmdlKGluaXRWYWx1ZSkgOiBpbml0VmFsdWU7XG4gIH0pO1xuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJzZXRDYWxsYmFja3NcIiwgZnVuY3Rpb24gKGNhbGxiYWNrcykge1xuICAgIF90aGlzLmNhbGxiYWNrcyA9IGNhbGxiYWNrcztcbiAgfSk7XG4gIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInNldFZhbGlkYXRlTWVzc2FnZXNcIiwgZnVuY3Rpb24gKHZhbGlkYXRlTWVzc2FnZXMpIHtcbiAgICBfdGhpcy52YWxpZGF0ZU1lc3NhZ2VzID0gdmFsaWRhdGVNZXNzYWdlcztcbiAgfSk7XG4gIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInNldFByZXNlcnZlXCIsIGZ1bmN0aW9uIChwcmVzZXJ2ZSkge1xuICAgIF90aGlzLnByZXNlcnZlID0gcHJlc2VydmU7XG4gIH0pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBXYXRjaCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIndhdGNoTGlzdFwiLCBbXSk7XG4gIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInJlZ2lzdGVyV2F0Y2hcIiwgZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgX3RoaXMud2F0Y2hMaXN0LnB1c2goY2FsbGJhY2spO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy53YXRjaExpc3QgPSBfdGhpcy53YXRjaExpc3QuZmlsdGVyKGZ1bmN0aW9uIChmbikge1xuICAgICAgICByZXR1cm4gZm4gIT09IGNhbGxiYWNrO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfSk7XG4gIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm5vdGlmeVdhdGNoXCIsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbmFtZVBhdGggPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFtdO1xuICAgIC8vIE5vIG5lZWQgdG8gY29zdCBwZXJmIHdoZW4gbm90aGluZyBuZWVkIHRvIHdhdGNoXG4gICAgaWYgKF90aGlzLndhdGNoTGlzdC5sZW5ndGgpIHtcbiAgICAgIHZhciB2YWx1ZXMgPSBfdGhpcy5nZXRGaWVsZHNWYWx1ZSgpO1xuICAgICAgdmFyIGFsbFZhbHVlcyA9IF90aGlzLmdldEZpZWxkc1ZhbHVlKHRydWUpO1xuICAgICAgX3RoaXMud2F0Y2hMaXN0LmZvckVhY2goZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrKHZhbHVlcywgYWxsVmFsdWVzLCBuYW1lUGF0aCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBEZXYgV2FybmluZyA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInRpbWVvdXRJZFwiLCBudWxsKTtcbiAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwid2FybmluZ1VuaG9va2VkXCIsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAhX3RoaXMudGltZW91dElkICYmIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBfdGhpcy50aW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMudGltZW91dElkID0gbnVsbDtcbiAgICAgICAgaWYgKCFfdGhpcy5mb3JtSG9va2VkKSB7XG4gICAgICAgICAgd2FybmluZyhmYWxzZSwgJ0luc3RhbmNlIGNyZWF0ZWQgYnkgYHVzZUZvcm1gIGlzIG5vdCBjb25uZWN0ZWQgdG8gYW55IEZvcm0gZWxlbWVudC4gRm9yZ2V0IHRvIHBhc3MgYGZvcm1gIHByb3A/Jyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU3RvcmUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwidXBkYXRlU3RvcmVcIiwgZnVuY3Rpb24gKG5leHRTdG9yZSkge1xuICAgIF90aGlzLnN0b3JlID0gbmV4dFN0b3JlO1xuICB9KTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBGaWVsZHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvKipcbiAgICogR2V0IHJlZ2lzdGVyZWQgZmllbGQgZW50aXRpZXMuXG4gICAqIEBwYXJhbSBwdXJlIE9ubHkgcmV0dXJuIGZpZWxkIHdoaWNoIGhhcyBhIGBuYW1lYC4gRGVmYXVsdDogZmFsc2VcbiAgICovXG4gIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImdldEZpZWxkRW50aXRpZXNcIiwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBwdXJlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcbiAgICBpZiAoIXB1cmUpIHtcbiAgICAgIHJldHVybiBfdGhpcy5maWVsZEVudGl0aWVzO1xuICAgIH1cbiAgICByZXR1cm4gX3RoaXMuZmllbGRFbnRpdGllcy5maWx0ZXIoZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICByZXR1cm4gZmllbGQuZ2V0TmFtZVBhdGgoKS5sZW5ndGg7XG4gICAgfSk7XG4gIH0pO1xuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJnZXRGaWVsZHNNYXBcIiwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBwdXJlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcbiAgICB2YXIgY2FjaGUgPSBuZXcgTmFtZU1hcCgpO1xuICAgIF90aGlzLmdldEZpZWxkRW50aXRpZXMocHVyZSkuZm9yRWFjaChmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgIHZhciBuYW1lUGF0aCA9IGZpZWxkLmdldE5hbWVQYXRoKCk7XG4gICAgICBjYWNoZS5zZXQobmFtZVBhdGgsIGZpZWxkKTtcbiAgICB9KTtcbiAgICByZXR1cm4gY2FjaGU7XG4gIH0pO1xuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJnZXRGaWVsZEVudGl0aWVzRm9yTmFtZVBhdGhMaXN0XCIsIGZ1bmN0aW9uIChuYW1lTGlzdCkge1xuICAgIGlmICghbmFtZUxpc3QpIHtcbiAgICAgIHJldHVybiBfdGhpcy5nZXRGaWVsZEVudGl0aWVzKHRydWUpO1xuICAgIH1cbiAgICB2YXIgY2FjaGUgPSBfdGhpcy5nZXRGaWVsZHNNYXAodHJ1ZSk7XG4gICAgcmV0dXJuIG5hbWVMaXN0Lm1hcChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgdmFyIG5hbWVQYXRoID0gZ2V0TmFtZVBhdGgobmFtZSk7XG4gICAgICByZXR1cm4gY2FjaGUuZ2V0KG5hbWVQYXRoKSB8fCB7XG4gICAgICAgIElOVkFMSURBVEVfTkFNRV9QQVRIOiBnZXROYW1lUGF0aChuYW1lKVxuICAgICAgfTtcbiAgICB9KTtcbiAgfSk7XG4gIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImdldEZpZWxkc1ZhbHVlXCIsIGZ1bmN0aW9uIChuYW1lTGlzdCwgZmlsdGVyRnVuYykge1xuICAgIF90aGlzLndhcm5pbmdVbmhvb2tlZCgpO1xuXG4gICAgLy8gRmlsbCBhcmdzXG4gICAgdmFyIG1lcmdlZE5hbWVMaXN0O1xuICAgIHZhciBtZXJnZWRGaWx0ZXJGdW5jO1xuICAgIHZhciBtZXJnZWRTdHJpY3Q7XG4gICAgaWYgKG5hbWVMaXN0ID09PSB0cnVlIHx8IEFycmF5LmlzQXJyYXkobmFtZUxpc3QpKSB7XG4gICAgICBtZXJnZWROYW1lTGlzdCA9IG5hbWVMaXN0O1xuICAgICAgbWVyZ2VkRmlsdGVyRnVuYyA9IGZpbHRlckZ1bmM7XG4gICAgfSBlbHNlIGlmIChuYW1lTGlzdCAmJiBfdHlwZW9mKG5hbWVMaXN0KSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIG1lcmdlZFN0cmljdCA9IG5hbWVMaXN0LnN0cmljdDtcbiAgICAgIG1lcmdlZEZpbHRlckZ1bmMgPSBuYW1lTGlzdC5maWx0ZXI7XG4gICAgfVxuICAgIGlmIChtZXJnZWROYW1lTGlzdCA9PT0gdHJ1ZSAmJiAhbWVyZ2VkRmlsdGVyRnVuYykge1xuICAgICAgcmV0dXJuIF90aGlzLnN0b3JlO1xuICAgIH1cbiAgICB2YXIgZmllbGRFbnRpdGllcyA9IF90aGlzLmdldEZpZWxkRW50aXRpZXNGb3JOYW1lUGF0aExpc3QoQXJyYXkuaXNBcnJheShtZXJnZWROYW1lTGlzdCkgPyBtZXJnZWROYW1lTGlzdCA6IG51bGwpO1xuICAgIHZhciBmaWx0ZXJlZE5hbWVMaXN0ID0gW107XG4gICAgZmllbGRFbnRpdGllcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgIHZhciBfaXNMaXN0RmllbGQsIF9yZWYzO1xuICAgICAgdmFyIG5hbWVQYXRoID0gJ0lOVkFMSURBVEVfTkFNRV9QQVRIJyBpbiBlbnRpdHkgPyBlbnRpdHkuSU5WQUxJREFURV9OQU1FX1BBVEggOiBlbnRpdHkuZ2V0TmFtZVBhdGgoKTtcblxuICAgICAgLy8gSWdub3JlIHdoZW4gaXQncyBhIGxpc3QgaXRlbSBhbmQgbm90IHNwZWNpZmljIHRoZSBuYW1lUGF0aCxcbiAgICAgIC8vIHNpbmNlIHBhcmVudCBmaWVsZCBpcyBhbHJlYWR5IHRha2UgaW4gY291bnRcbiAgICAgIGlmIChtZXJnZWRTdHJpY3QpIHtcbiAgICAgICAgdmFyIF9pc0xpc3QsIF9yZWYyO1xuICAgICAgICBpZiAoKF9pc0xpc3QgPSAoX3JlZjIgPSBlbnRpdHkpLmlzTGlzdCkgIT09IG51bGwgJiYgX2lzTGlzdCAhPT0gdm9pZCAwICYmIF9pc0xpc3QuY2FsbChfcmVmMikpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIW1lcmdlZE5hbWVMaXN0ICYmIChfaXNMaXN0RmllbGQgPSAoX3JlZjMgPSBlbnRpdHkpLmlzTGlzdEZpZWxkKSAhPT0gbnVsbCAmJiBfaXNMaXN0RmllbGQgIT09IHZvaWQgMCAmJiBfaXNMaXN0RmllbGQuY2FsbChfcmVmMykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCFtZXJnZWRGaWx0ZXJGdW5jKSB7XG4gICAgICAgIGZpbHRlcmVkTmFtZUxpc3QucHVzaChuYW1lUGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgbWV0YSA9ICdnZXRNZXRhJyBpbiBlbnRpdHkgPyBlbnRpdHkuZ2V0TWV0YSgpIDogbnVsbDtcbiAgICAgICAgaWYgKG1lcmdlZEZpbHRlckZ1bmMobWV0YSkpIHtcbiAgICAgICAgICBmaWx0ZXJlZE5hbWVMaXN0LnB1c2gobmFtZVBhdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNsb25lQnlOYW1lUGF0aExpc3QoX3RoaXMuc3RvcmUsIGZpbHRlcmVkTmFtZUxpc3QubWFwKGdldE5hbWVQYXRoKSk7XG4gIH0pO1xuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJnZXRGaWVsZFZhbHVlXCIsIGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgX3RoaXMud2FybmluZ1VuaG9va2VkKCk7XG4gICAgdmFyIG5hbWVQYXRoID0gZ2V0TmFtZVBhdGgobmFtZSk7XG4gICAgcmV0dXJuIGdldFZhbHVlKF90aGlzLnN0b3JlLCBuYW1lUGF0aCk7XG4gIH0pO1xuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJnZXRGaWVsZHNFcnJvclwiLCBmdW5jdGlvbiAobmFtZUxpc3QpIHtcbiAgICBfdGhpcy53YXJuaW5nVW5ob29rZWQoKTtcbiAgICB2YXIgZmllbGRFbnRpdGllcyA9IF90aGlzLmdldEZpZWxkRW50aXRpZXNGb3JOYW1lUGF0aExpc3QobmFtZUxpc3QpO1xuICAgIHJldHVybiBmaWVsZEVudGl0aWVzLm1hcChmdW5jdGlvbiAoZW50aXR5LCBpbmRleCkge1xuICAgICAgaWYgKGVudGl0eSAmJiAhKCdJTlZBTElEQVRFX05BTUVfUEFUSCcgaW4gZW50aXR5KSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWU6IGVudGl0eS5nZXROYW1lUGF0aCgpLFxuICAgICAgICAgIGVycm9yczogZW50aXR5LmdldEVycm9ycygpLFxuICAgICAgICAgIHdhcm5pbmdzOiBlbnRpdHkuZ2V0V2FybmluZ3MoKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogZ2V0TmFtZVBhdGgobmFtZUxpc3RbaW5kZXhdKSxcbiAgICAgICAgZXJyb3JzOiBbXSxcbiAgICAgICAgd2FybmluZ3M6IFtdXG4gICAgICB9O1xuICAgIH0pO1xuICB9KTtcbiAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiZ2V0RmllbGRFcnJvclwiLCBmdW5jdGlvbiAobmFtZSkge1xuICAgIF90aGlzLndhcm5pbmdVbmhvb2tlZCgpO1xuICAgIHZhciBuYW1lUGF0aCA9IGdldE5hbWVQYXRoKG5hbWUpO1xuICAgIHZhciBmaWVsZEVycm9yID0gX3RoaXMuZ2V0RmllbGRzRXJyb3IoW25hbWVQYXRoXSlbMF07XG4gICAgcmV0dXJuIGZpZWxkRXJyb3IuZXJyb3JzO1xuICB9KTtcbiAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiZ2V0RmllbGRXYXJuaW5nXCIsIGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgX3RoaXMud2FybmluZ1VuaG9va2VkKCk7XG4gICAgdmFyIG5hbWVQYXRoID0gZ2V0TmFtZVBhdGgobmFtZSk7XG4gICAgdmFyIGZpZWxkRXJyb3IgPSBfdGhpcy5nZXRGaWVsZHNFcnJvcihbbmFtZVBhdGhdKVswXTtcbiAgICByZXR1cm4gZmllbGRFcnJvci53YXJuaW5ncztcbiAgfSk7XG4gIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImlzRmllbGRzVG91Y2hlZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgX3RoaXMud2FybmluZ1VuaG9va2VkKCk7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cbiAgICB2YXIgYXJnMCA9IGFyZ3NbMF0sXG4gICAgICBhcmcxID0gYXJnc1sxXTtcbiAgICB2YXIgbmFtZVBhdGhMaXN0O1xuICAgIHZhciBpc0FsbEZpZWxkc1RvdWNoZWQgPSBmYWxzZTtcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgIG5hbWVQYXRoTGlzdCA9IG51bGw7XG4gICAgfSBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYXJnMCkpIHtcbiAgICAgICAgbmFtZVBhdGhMaXN0ID0gYXJnMC5tYXAoZ2V0TmFtZVBhdGgpO1xuICAgICAgICBpc0FsbEZpZWxkc1RvdWNoZWQgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5hbWVQYXRoTGlzdCA9IG51bGw7XG4gICAgICAgIGlzQWxsRmllbGRzVG91Y2hlZCA9IGFyZzA7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWVQYXRoTGlzdCA9IGFyZzAubWFwKGdldE5hbWVQYXRoKTtcbiAgICAgIGlzQWxsRmllbGRzVG91Y2hlZCA9IGFyZzE7XG4gICAgfVxuICAgIHZhciBmaWVsZEVudGl0aWVzID0gX3RoaXMuZ2V0RmllbGRFbnRpdGllcyh0cnVlKTtcbiAgICB2YXIgaXNGaWVsZFRvdWNoZWQgPSBmdW5jdGlvbiBpc0ZpZWxkVG91Y2hlZChmaWVsZCkge1xuICAgICAgcmV0dXJuIGZpZWxkLmlzRmllbGRUb3VjaGVkKCk7XG4gICAgfTtcblxuICAgIC8vID09PT09IFdpbGwgZ2V0IGZ1bGx5IGNvbXBhcmUgd2hlbiBub3QgY29uZmlnIG5hbWVQYXRoTGlzdCA9PT09PVxuICAgIGlmICghbmFtZVBhdGhMaXN0KSB7XG4gICAgICByZXR1cm4gaXNBbGxGaWVsZHNUb3VjaGVkID8gZmllbGRFbnRpdGllcy5ldmVyeShmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgICAgIHJldHVybiBpc0ZpZWxkVG91Y2hlZChlbnRpdHkpIHx8IGVudGl0eS5pc0xpc3QoKTtcbiAgICAgIH0pIDogZmllbGRFbnRpdGllcy5zb21lKGlzRmllbGRUb3VjaGVkKTtcbiAgICB9XG5cbiAgICAvLyBHZW5lcmF0ZSBhIG5lc3QgdHJlZSBmb3IgdmFsaWRhdGVcbiAgICB2YXIgbWFwID0gbmV3IE5hbWVNYXAoKTtcbiAgICBuYW1lUGF0aExpc3QuZm9yRWFjaChmdW5jdGlvbiAoc2hvcnROYW1lUGF0aCkge1xuICAgICAgbWFwLnNldChzaG9ydE5hbWVQYXRoLCBbXSk7XG4gICAgfSk7XG4gICAgZmllbGRFbnRpdGllcy5mb3JFYWNoKGZ1bmN0aW9uIChmaWVsZCkge1xuICAgICAgdmFyIGZpZWxkTmFtZVBhdGggPSBmaWVsZC5nZXROYW1lUGF0aCgpO1xuXG4gICAgICAvLyBGaW5kIG1hdGNoZWQgZW50aXR5IGFuZCBwdXQgaW50byBsaXN0XG4gICAgICBuYW1lUGF0aExpc3QuZm9yRWFjaChmdW5jdGlvbiAoc2hvcnROYW1lUGF0aCkge1xuICAgICAgICBpZiAoc2hvcnROYW1lUGF0aC5ldmVyeShmdW5jdGlvbiAobmFtZVVuaXQsIGkpIHtcbiAgICAgICAgICByZXR1cm4gZmllbGROYW1lUGF0aFtpXSA9PT0gbmFtZVVuaXQ7XG4gICAgICAgIH0pKSB7XG4gICAgICAgICAgbWFwLnVwZGF0ZShzaG9ydE5hbWVQYXRoLCBmdW5jdGlvbiAobGlzdCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkobGlzdCksIFtmaWVsZF0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIENoZWNrIGlmIE5hbWVNYXAgdmFsdWUgaXMgdG91Y2hlZFxuICAgIHZhciBpc05hbWVQYXRoTGlzdFRvdWNoZWQgPSBmdW5jdGlvbiBpc05hbWVQYXRoTGlzdFRvdWNoZWQoZW50aXRpZXMpIHtcbiAgICAgIHJldHVybiBlbnRpdGllcy5zb21lKGlzRmllbGRUb3VjaGVkKTtcbiAgICB9O1xuICAgIHZhciBuYW1lUGF0aExpc3RFbnRpdGllcyA9IG1hcC5tYXAoZnVuY3Rpb24gKF9yZWY0KSB7XG4gICAgICB2YXIgdmFsdWUgPSBfcmVmNC52YWx1ZTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gaXNBbGxGaWVsZHNUb3VjaGVkID8gbmFtZVBhdGhMaXN0RW50aXRpZXMuZXZlcnkoaXNOYW1lUGF0aExpc3RUb3VjaGVkKSA6IG5hbWVQYXRoTGlzdEVudGl0aWVzLnNvbWUoaXNOYW1lUGF0aExpc3RUb3VjaGVkKTtcbiAgfSk7XG4gIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImlzRmllbGRUb3VjaGVkXCIsIGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgX3RoaXMud2FybmluZ1VuaG9va2VkKCk7XG4gICAgcmV0dXJuIF90aGlzLmlzRmllbGRzVG91Y2hlZChbbmFtZV0pO1xuICB9KTtcbiAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiaXNGaWVsZHNWYWxpZGF0aW5nXCIsIGZ1bmN0aW9uIChuYW1lTGlzdCkge1xuICAgIF90aGlzLndhcm5pbmdVbmhvb2tlZCgpO1xuICAgIHZhciBmaWVsZEVudGl0aWVzID0gX3RoaXMuZ2V0RmllbGRFbnRpdGllcygpO1xuICAgIGlmICghbmFtZUxpc3QpIHtcbiAgICAgIHJldHVybiBmaWVsZEVudGl0aWVzLnNvbWUoZnVuY3Rpb24gKHRlc3RGaWVsZCkge1xuICAgICAgICByZXR1cm4gdGVzdEZpZWxkLmlzRmllbGRWYWxpZGF0aW5nKCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdmFyIG5hbWVQYXRoTGlzdCA9IG5hbWVMaXN0Lm1hcChnZXROYW1lUGF0aCk7XG4gICAgcmV0dXJuIGZpZWxkRW50aXRpZXMuc29tZShmdW5jdGlvbiAodGVzdEZpZWxkKSB7XG4gICAgICB2YXIgZmllbGROYW1lUGF0aCA9IHRlc3RGaWVsZC5nZXROYW1lUGF0aCgpO1xuICAgICAgcmV0dXJuIGNvbnRhaW5zTmFtZVBhdGgobmFtZVBhdGhMaXN0LCBmaWVsZE5hbWVQYXRoKSAmJiB0ZXN0RmllbGQuaXNGaWVsZFZhbGlkYXRpbmcoKTtcbiAgICB9KTtcbiAgfSk7XG4gIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImlzRmllbGRWYWxpZGF0aW5nXCIsIGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgX3RoaXMud2FybmluZ1VuaG9va2VkKCk7XG4gICAgcmV0dXJuIF90aGlzLmlzRmllbGRzVmFsaWRhdGluZyhbbmFtZV0pO1xuICB9KTtcbiAgLyoqXG4gICAqIFJlc2V0IEZpZWxkIHdpdGggZmllbGQgYGluaXRpYWxWYWx1ZWAgcHJvcC5cbiAgICogQ2FuIHBhc3MgYGVudGl0aWVzYCBvciBgbmFtZVBhdGhMaXN0YCBvciBqdXN0IG5vdGhpbmcuXG4gICAqL1xuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJyZXNldFdpdGhGaWVsZEluaXRpYWxWYWx1ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGluZm8gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIC8vIENyZWF0ZSBjYWNoZVxuICAgIHZhciBjYWNoZSA9IG5ldyBOYW1lTWFwKCk7XG4gICAgdmFyIGZpZWxkRW50aXRpZXMgPSBfdGhpcy5nZXRGaWVsZEVudGl0aWVzKHRydWUpO1xuICAgIGZpZWxkRW50aXRpZXMuZm9yRWFjaChmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgIHZhciBpbml0aWFsVmFsdWUgPSBmaWVsZC5wcm9wcy5pbml0aWFsVmFsdWU7XG4gICAgICB2YXIgbmFtZVBhdGggPSBmaWVsZC5nZXROYW1lUGF0aCgpO1xuXG4gICAgICAvLyBSZWNvcmQgb25seSBpZiBoYXMgYGluaXRpYWxWYWx1ZWBcbiAgICAgIGlmIChpbml0aWFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YXIgcmVjb3JkcyA9IGNhY2hlLmdldChuYW1lUGF0aCkgfHwgbmV3IFNldCgpO1xuICAgICAgICByZWNvcmRzLmFkZCh7XG4gICAgICAgICAgZW50aXR5OiBmaWVsZCxcbiAgICAgICAgICB2YWx1ZTogaW5pdGlhbFZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgICBjYWNoZS5zZXQobmFtZVBhdGgsIHJlY29yZHMpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gUmVzZXRcbiAgICB2YXIgcmVzZXRXaXRoRmllbGRzID0gZnVuY3Rpb24gcmVzZXRXaXRoRmllbGRzKGVudGl0aWVzKSB7XG4gICAgICBlbnRpdGllcy5mb3JFYWNoKGZ1bmN0aW9uIChmaWVsZCkge1xuICAgICAgICB2YXIgaW5pdGlhbFZhbHVlID0gZmllbGQucHJvcHMuaW5pdGlhbFZhbHVlO1xuICAgICAgICBpZiAoaW5pdGlhbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB2YXIgbmFtZVBhdGggPSBmaWVsZC5nZXROYW1lUGF0aCgpO1xuICAgICAgICAgIHZhciBmb3JtSW5pdGlhbFZhbHVlID0gX3RoaXMuZ2V0SW5pdGlhbFZhbHVlKG5hbWVQYXRoKTtcbiAgICAgICAgICBpZiAoZm9ybUluaXRpYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBXYXJuaW5nIGlmIGNvbmZsaWN0IHdpdGggZm9ybSBpbml0aWFsVmFsdWVzIGFuZCBkbyBub3QgbW9kaWZ5IHZhbHVlXG4gICAgICAgICAgICB3YXJuaW5nKGZhbHNlLCBcIkZvcm0gYWxyZWFkeSBzZXQgJ2luaXRpYWxWYWx1ZXMnIHdpdGggcGF0aCAnXCIuY29uY2F0KG5hbWVQYXRoLmpvaW4oJy4nKSwgXCInLiBGaWVsZCBjYW4gbm90IG92ZXJ3cml0ZSBpdC5cIikpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgcmVjb3JkcyA9IGNhY2hlLmdldChuYW1lUGF0aCk7XG4gICAgICAgICAgICBpZiAocmVjb3JkcyAmJiByZWNvcmRzLnNpemUgPiAxKSB7XG4gICAgICAgICAgICAgIC8vIFdhcm5pbmcgaWYgbXVsdGlwbGUgZmllbGQgc2V0IGBpbml0aWFsVmFsdWVgYW5kIGRvIG5vdCBtb2RpZnkgdmFsdWVcbiAgICAgICAgICAgICAgd2FybmluZyhmYWxzZSwgXCJNdWx0aXBsZSBGaWVsZCB3aXRoIHBhdGggJ1wiLmNvbmNhdChuYW1lUGF0aC5qb2luKCcuJyksIFwiJyBzZXQgJ2luaXRpYWxWYWx1ZScuIENhbiBub3QgZGVjaWRlIHdoaWNoIG9uZSB0byBwaWNrLlwiKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlY29yZHMpIHtcbiAgICAgICAgICAgICAgdmFyIG9yaWdpblZhbHVlID0gX3RoaXMuZ2V0RmllbGRWYWx1ZShuYW1lUGF0aCk7XG4gICAgICAgICAgICAgIHZhciBpc0xpc3RGaWVsZCA9IGZpZWxkLmlzTGlzdEZpZWxkKCk7XG5cbiAgICAgICAgICAgICAgLy8gU2V0IGBpbml0aWFsVmFsdWVgXG4gICAgICAgICAgICAgIGlmICghaXNMaXN0RmllbGQgJiYgKCFpbmZvLnNraXBFeGlzdCB8fCBvcmlnaW5WYWx1ZSA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgICAgIF90aGlzLnVwZGF0ZVN0b3JlKHNldFZhbHVlKF90aGlzLnN0b3JlLCBuYW1lUGF0aCwgX3RvQ29uc3VtYWJsZUFycmF5KHJlY29yZHMpWzBdLnZhbHVlKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG4gICAgdmFyIHJlcXVpcmVkRmllbGRFbnRpdGllcztcbiAgICBpZiAoaW5mby5lbnRpdGllcykge1xuICAgICAgcmVxdWlyZWRGaWVsZEVudGl0aWVzID0gaW5mby5lbnRpdGllcztcbiAgICB9IGVsc2UgaWYgKGluZm8ubmFtZVBhdGhMaXN0KSB7XG4gICAgICByZXF1aXJlZEZpZWxkRW50aXRpZXMgPSBbXTtcbiAgICAgIGluZm8ubmFtZVBhdGhMaXN0LmZvckVhY2goZnVuY3Rpb24gKG5hbWVQYXRoKSB7XG4gICAgICAgIHZhciByZWNvcmRzID0gY2FjaGUuZ2V0KG5hbWVQYXRoKTtcbiAgICAgICAgaWYgKHJlY29yZHMpIHtcbiAgICAgICAgICB2YXIgX3JlcXVpcmVkRmllbGRFbnRpdGllO1xuICAgICAgICAgIChfcmVxdWlyZWRGaWVsZEVudGl0aWUgPSByZXF1aXJlZEZpZWxkRW50aXRpZXMpLnB1c2guYXBwbHkoX3JlcXVpcmVkRmllbGRFbnRpdGllLCBfdG9Db25zdW1hYmxlQXJyYXkoX3RvQ29uc3VtYWJsZUFycmF5KHJlY29yZHMpLm1hcChmdW5jdGlvbiAocikge1xuICAgICAgICAgICAgcmV0dXJuIHIuZW50aXR5O1xuICAgICAgICAgIH0pKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXF1aXJlZEZpZWxkRW50aXRpZXMgPSBmaWVsZEVudGl0aWVzO1xuICAgIH1cbiAgICByZXNldFdpdGhGaWVsZHMocmVxdWlyZWRGaWVsZEVudGl0aWVzKTtcbiAgfSk7XG4gIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInJlc2V0RmllbGRzXCIsIGZ1bmN0aW9uIChuYW1lTGlzdCkge1xuICAgIF90aGlzLndhcm5pbmdVbmhvb2tlZCgpO1xuICAgIHZhciBwcmV2U3RvcmUgPSBfdGhpcy5zdG9yZTtcbiAgICBpZiAoIW5hbWVMaXN0KSB7XG4gICAgICBfdGhpcy51cGRhdGVTdG9yZShtZXJnZShfdGhpcy5pbml0aWFsVmFsdWVzKSk7XG4gICAgICBfdGhpcy5yZXNldFdpdGhGaWVsZEluaXRpYWxWYWx1ZSgpO1xuICAgICAgX3RoaXMubm90aWZ5T2JzZXJ2ZXJzKHByZXZTdG9yZSwgbnVsbCwge1xuICAgICAgICB0eXBlOiAncmVzZXQnXG4gICAgICB9KTtcbiAgICAgIF90aGlzLm5vdGlmeVdhdGNoKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmVzZXQgYnkgYG5hbWVMaXN0YFxuICAgIHZhciBuYW1lUGF0aExpc3QgPSBuYW1lTGlzdC5tYXAoZ2V0TmFtZVBhdGgpO1xuICAgIG5hbWVQYXRoTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lUGF0aCkge1xuICAgICAgdmFyIGluaXRpYWxWYWx1ZSA9IF90aGlzLmdldEluaXRpYWxWYWx1ZShuYW1lUGF0aCk7XG4gICAgICBfdGhpcy51cGRhdGVTdG9yZShzZXRWYWx1ZShfdGhpcy5zdG9yZSwgbmFtZVBhdGgsIGluaXRpYWxWYWx1ZSkpO1xuICAgIH0pO1xuICAgIF90aGlzLnJlc2V0V2l0aEZpZWxkSW5pdGlhbFZhbHVlKHtcbiAgICAgIG5hbWVQYXRoTGlzdDogbmFtZVBhdGhMaXN0XG4gICAgfSk7XG4gICAgX3RoaXMubm90aWZ5T2JzZXJ2ZXJzKHByZXZTdG9yZSwgbmFtZVBhdGhMaXN0LCB7XG4gICAgICB0eXBlOiAncmVzZXQnXG4gICAgfSk7XG4gICAgX3RoaXMubm90aWZ5V2F0Y2gobmFtZVBhdGhMaXN0KTtcbiAgfSk7XG4gIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInNldEZpZWxkc1wiLCBmdW5jdGlvbiAoZmllbGRzKSB7XG4gICAgX3RoaXMud2FybmluZ1VuaG9va2VkKCk7XG4gICAgdmFyIHByZXZTdG9yZSA9IF90aGlzLnN0b3JlO1xuICAgIHZhciBuYW1lUGF0aExpc3QgPSBbXTtcbiAgICBmaWVsZHMuZm9yRWFjaChmdW5jdGlvbiAoZmllbGREYXRhKSB7XG4gICAgICB2YXIgbmFtZSA9IGZpZWxkRGF0YS5uYW1lLFxuICAgICAgICBkYXRhID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKGZpZWxkRGF0YSwgX2V4Y2x1ZGVkKTtcbiAgICAgIHZhciBuYW1lUGF0aCA9IGdldE5hbWVQYXRoKG5hbWUpO1xuICAgICAgbmFtZVBhdGhMaXN0LnB1c2gobmFtZVBhdGgpO1xuXG4gICAgICAvLyBWYWx1ZVxuICAgICAgaWYgKCd2YWx1ZScgaW4gZGF0YSkge1xuICAgICAgICBfdGhpcy51cGRhdGVTdG9yZShzZXRWYWx1ZShfdGhpcy5zdG9yZSwgbmFtZVBhdGgsIGRhdGEudmFsdWUpKTtcbiAgICAgIH1cbiAgICAgIF90aGlzLm5vdGlmeU9ic2VydmVycyhwcmV2U3RvcmUsIFtuYW1lUGF0aF0sIHtcbiAgICAgICAgdHlwZTogJ3NldEZpZWxkJyxcbiAgICAgICAgZGF0YTogZmllbGREYXRhXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBfdGhpcy5ub3RpZnlXYXRjaChuYW1lUGF0aExpc3QpO1xuICB9KTtcbiAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiZ2V0RmllbGRzXCIsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZW50aXRpZXMgPSBfdGhpcy5nZXRGaWVsZEVudGl0aWVzKHRydWUpO1xuICAgIHZhciBmaWVsZHMgPSBlbnRpdGllcy5tYXAoZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICB2YXIgbmFtZVBhdGggPSBmaWVsZC5nZXROYW1lUGF0aCgpO1xuICAgICAgdmFyIG1ldGEgPSBmaWVsZC5nZXRNZXRhKCk7XG4gICAgICB2YXIgZmllbGREYXRhID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBtZXRhKSwge30sIHtcbiAgICAgICAgbmFtZTogbmFtZVBhdGgsXG4gICAgICAgIHZhbHVlOiBfdGhpcy5nZXRGaWVsZFZhbHVlKG5hbWVQYXRoKVxuICAgICAgfSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZmllbGREYXRhLCAnb3JpZ2luUkNGaWVsZCcsIHtcbiAgICAgICAgdmFsdWU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZpZWxkRGF0YTtcbiAgICB9KTtcbiAgICByZXR1cm4gZmllbGRzO1xuICB9KTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IE9ic2VydmVyID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvKipcbiAgICogVGhpcyBvbmx5IHRyaWdnZXIgd2hlbiBhIGZpZWxkIGlzIG9uIGNvbnN0cnVjdG9yIHRvIGF2b2lkIHdlIGdldCBpbml0aWFsVmFsdWUgdG9vIGxhdGVcbiAgICovXG4gIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImluaXRFbnRpdHlWYWx1ZVwiLCBmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgdmFyIGluaXRpYWxWYWx1ZSA9IGVudGl0eS5wcm9wcy5pbml0aWFsVmFsdWU7XG4gICAgaWYgKGluaXRpYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgbmFtZVBhdGggPSBlbnRpdHkuZ2V0TmFtZVBhdGgoKTtcbiAgICAgIHZhciBwcmV2VmFsdWUgPSBnZXRWYWx1ZShfdGhpcy5zdG9yZSwgbmFtZVBhdGgpO1xuICAgICAgaWYgKHByZXZWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIF90aGlzLnVwZGF0ZVN0b3JlKHNldFZhbHVlKF90aGlzLnN0b3JlLCBuYW1lUGF0aCwgaW5pdGlhbFZhbHVlKSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiaXNNZXJnZWRQcmVzZXJ2ZVwiLCBmdW5jdGlvbiAoZmllbGRQcmVzZXJ2ZSkge1xuICAgIHZhciBtZXJnZWRQcmVzZXJ2ZSA9IGZpZWxkUHJlc2VydmUgIT09IHVuZGVmaW5lZCA/IGZpZWxkUHJlc2VydmUgOiBfdGhpcy5wcmVzZXJ2ZTtcbiAgICByZXR1cm4gbWVyZ2VkUHJlc2VydmUgIT09IG51bGwgJiYgbWVyZ2VkUHJlc2VydmUgIT09IHZvaWQgMCA/IG1lcmdlZFByZXNlcnZlIDogdHJ1ZTtcbiAgfSk7XG4gIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInJlZ2lzdGVyRmllbGRcIiwgZnVuY3Rpb24gKGVudGl0eSkge1xuICAgIF90aGlzLmZpZWxkRW50aXRpZXMucHVzaChlbnRpdHkpO1xuICAgIHZhciBuYW1lUGF0aCA9IGVudGl0eS5nZXROYW1lUGF0aCgpO1xuICAgIF90aGlzLm5vdGlmeVdhdGNoKFtuYW1lUGF0aF0pO1xuXG4gICAgLy8gU2V0IGluaXRpYWwgdmFsdWVzXG4gICAgaWYgKGVudGl0eS5wcm9wcy5pbml0aWFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIHByZXZTdG9yZSA9IF90aGlzLnN0b3JlO1xuICAgICAgX3RoaXMucmVzZXRXaXRoRmllbGRJbml0aWFsVmFsdWUoe1xuICAgICAgICBlbnRpdGllczogW2VudGl0eV0sXG4gICAgICAgIHNraXBFeGlzdDogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBfdGhpcy5ub3RpZnlPYnNlcnZlcnMocHJldlN0b3JlLCBbZW50aXR5LmdldE5hbWVQYXRoKCldLCB7XG4gICAgICAgIHR5cGU6ICd2YWx1ZVVwZGF0ZScsXG4gICAgICAgIHNvdXJjZTogJ2ludGVybmFsJ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gdW4tcmVnaXN0ZXIgZmllbGQgY2FsbGJhY2tcbiAgICByZXR1cm4gZnVuY3Rpb24gKGlzTGlzdEZpZWxkLCBwcmVzZXJ2ZSkge1xuICAgICAgdmFyIHN1Yk5hbWVQYXRoID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBbXTtcbiAgICAgIF90aGlzLmZpZWxkRW50aXRpZXMgPSBfdGhpcy5maWVsZEVudGl0aWVzLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICByZXR1cm4gaXRlbSAhPT0gZW50aXR5O1xuICAgICAgfSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHN0b3JlIHZhbHVlIGlmIG5vdCBwcmVzZXJ2ZVxuICAgICAgaWYgKCFfdGhpcy5pc01lcmdlZFByZXNlcnZlKHByZXNlcnZlKSAmJiAoIWlzTGlzdEZpZWxkIHx8IHN1Yk5hbWVQYXRoLmxlbmd0aCA+IDEpKSB7XG4gICAgICAgIHZhciBkZWZhdWx0VmFsdWUgPSBpc0xpc3RGaWVsZCA/IHVuZGVmaW5lZCA6IF90aGlzLmdldEluaXRpYWxWYWx1ZShuYW1lUGF0aCk7XG4gICAgICAgIGlmIChuYW1lUGF0aC5sZW5ndGggJiYgX3RoaXMuZ2V0RmllbGRWYWx1ZShuYW1lUGF0aCkgIT09IGRlZmF1bHRWYWx1ZSAmJiBfdGhpcy5maWVsZEVudGl0aWVzLmV2ZXJ5KGZ1bmN0aW9uIChmaWVsZCkge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAvLyBPbmx5IHJlc2V0IHdoZW4gbm8gbmFtZVBhdGggZXhpc3RcbiAgICAgICAgICAgICFtYXRjaE5hbWVQYXRoKGZpZWxkLmdldE5hbWVQYXRoKCksIG5hbWVQYXRoKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pKSB7XG4gICAgICAgICAgdmFyIF9wcmV2U3RvcmUgPSBfdGhpcy5zdG9yZTtcbiAgICAgICAgICBfdGhpcy51cGRhdGVTdG9yZShzZXRWYWx1ZShfcHJldlN0b3JlLCBuYW1lUGF0aCwgZGVmYXVsdFZhbHVlLCB0cnVlKSk7XG5cbiAgICAgICAgICAvLyBOb3RpZnkgdGhhdCBmaWVsZCBpcyB1bm1vdW50XG4gICAgICAgICAgX3RoaXMubm90aWZ5T2JzZXJ2ZXJzKF9wcmV2U3RvcmUsIFtuYW1lUGF0aF0sIHtcbiAgICAgICAgICAgIHR5cGU6ICdyZW1vdmUnXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBEZXBlbmRlbmNpZXMgdXBkYXRlXG4gICAgICAgICAgX3RoaXMudHJpZ2dlckRlcGVuZGVuY2llc1VwZGF0ZShfcHJldlN0b3JlLCBuYW1lUGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIF90aGlzLm5vdGlmeVdhdGNoKFtuYW1lUGF0aF0pO1xuICAgIH07XG4gIH0pO1xuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJkaXNwYXRjaFwiLCBmdW5jdGlvbiAoYWN0aW9uKSB7XG4gICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgY2FzZSAndXBkYXRlVmFsdWUnOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIG5hbWVQYXRoID0gYWN0aW9uLm5hbWVQYXRoLFxuICAgICAgICAgICAgdmFsdWUgPSBhY3Rpb24udmFsdWU7XG4gICAgICAgICAgX3RoaXMudXBkYXRlVmFsdWUobmFtZVBhdGgsIHZhbHVlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgY2FzZSAndmFsaWRhdGVGaWVsZCc6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgX25hbWVQYXRoID0gYWN0aW9uLm5hbWVQYXRoLFxuICAgICAgICAgICAgdHJpZ2dlck5hbWUgPSBhY3Rpb24udHJpZ2dlck5hbWU7XG4gICAgICAgICAgX3RoaXMudmFsaWRhdGVGaWVsZHMoW19uYW1lUGF0aF0sIHtcbiAgICAgICAgICAgIHRyaWdnZXJOYW1lOiB0cmlnZ2VyTmFtZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgLy8gQ3VycmVudGx5IHdlIGRvbid0IGhhdmUgb3RoZXIgYWN0aW9uLiBEbyBub3RoaW5nLlxuICAgIH1cbiAgfSk7XG4gIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm5vdGlmeU9ic2VydmVyc1wiLCBmdW5jdGlvbiAocHJldlN0b3JlLCBuYW1lUGF0aExpc3QsIGluZm8pIHtcbiAgICBpZiAoX3RoaXMuc3Vic2NyaWJhYmxlKSB7XG4gICAgICB2YXIgbWVyZ2VkSW5mbyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgaW5mbyksIHt9LCB7XG4gICAgICAgIHN0b3JlOiBfdGhpcy5nZXRGaWVsZHNWYWx1ZSh0cnVlKVxuICAgICAgfSk7XG4gICAgICBfdGhpcy5nZXRGaWVsZEVudGl0aWVzKCkuZm9yRWFjaChmdW5jdGlvbiAoX3JlZjUpIHtcbiAgICAgICAgdmFyIG9uU3RvcmVDaGFuZ2UgPSBfcmVmNS5vblN0b3JlQ2hhbmdlO1xuICAgICAgICBvblN0b3JlQ2hhbmdlKHByZXZTdG9yZSwgbmFtZVBhdGhMaXN0LCBtZXJnZWRJbmZvKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBfdGhpcy5mb3JjZVJvb3RVcGRhdGUoKTtcbiAgICB9XG4gIH0pO1xuICAvKipcbiAgICogTm90aWZ5IGRlcGVuZGVuY2llcyBjaGlsZHJlbiB3aXRoIHBhcmVudCB1cGRhdGVcbiAgICogV2UgbmVlZCBkZWxheSB0byB0cmlnZ2VyIHZhbGlkYXRlIGluIGNhc2UgRmllbGQgaXMgdW5kZXIgcmVuZGVyIHByb3BzXG4gICAqL1xuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJ0cmlnZ2VyRGVwZW5kZW5jaWVzVXBkYXRlXCIsIGZ1bmN0aW9uIChwcmV2U3RvcmUsIG5hbWVQYXRoKSB7XG4gICAgdmFyIGNoaWxkcmVuRmllbGRzID0gX3RoaXMuZ2V0RGVwZW5kZW5jeUNoaWxkcmVuRmllbGRzKG5hbWVQYXRoKTtcbiAgICBpZiAoY2hpbGRyZW5GaWVsZHMubGVuZ3RoKSB7XG4gICAgICBfdGhpcy52YWxpZGF0ZUZpZWxkcyhjaGlsZHJlbkZpZWxkcyk7XG4gICAgfVxuICAgIF90aGlzLm5vdGlmeU9ic2VydmVycyhwcmV2U3RvcmUsIGNoaWxkcmVuRmllbGRzLCB7XG4gICAgICB0eXBlOiAnZGVwZW5kZW5jaWVzVXBkYXRlJyxcbiAgICAgIHJlbGF0ZWRGaWVsZHM6IFtuYW1lUGF0aF0uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShjaGlsZHJlbkZpZWxkcykpXG4gICAgfSk7XG4gICAgcmV0dXJuIGNoaWxkcmVuRmllbGRzO1xuICB9KTtcbiAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwidXBkYXRlVmFsdWVcIiwgZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgdmFyIG5hbWVQYXRoID0gZ2V0TmFtZVBhdGgobmFtZSk7XG4gICAgdmFyIHByZXZTdG9yZSA9IF90aGlzLnN0b3JlO1xuICAgIF90aGlzLnVwZGF0ZVN0b3JlKHNldFZhbHVlKF90aGlzLnN0b3JlLCBuYW1lUGF0aCwgdmFsdWUpKTtcbiAgICBfdGhpcy5ub3RpZnlPYnNlcnZlcnMocHJldlN0b3JlLCBbbmFtZVBhdGhdLCB7XG4gICAgICB0eXBlOiAndmFsdWVVcGRhdGUnLFxuICAgICAgc291cmNlOiAnaW50ZXJuYWwnXG4gICAgfSk7XG4gICAgX3RoaXMubm90aWZ5V2F0Y2goW25hbWVQYXRoXSk7XG5cbiAgICAvLyBEZXBlbmRlbmNpZXMgdXBkYXRlXG4gICAgdmFyIGNoaWxkcmVuRmllbGRzID0gX3RoaXMudHJpZ2dlckRlcGVuZGVuY2llc1VwZGF0ZShwcmV2U3RvcmUsIG5hbWVQYXRoKTtcblxuICAgIC8vIHRyaWdnZXIgY2FsbGJhY2sgZnVuY3Rpb25cbiAgICB2YXIgb25WYWx1ZXNDaGFuZ2UgPSBfdGhpcy5jYWxsYmFja3Mub25WYWx1ZXNDaGFuZ2U7XG4gICAgaWYgKG9uVmFsdWVzQ2hhbmdlKSB7XG4gICAgICB2YXIgY2hhbmdlZFZhbHVlcyA9IGNsb25lQnlOYW1lUGF0aExpc3QoX3RoaXMuc3RvcmUsIFtuYW1lUGF0aF0pO1xuICAgICAgb25WYWx1ZXNDaGFuZ2UoY2hhbmdlZFZhbHVlcywgX3RoaXMuZ2V0RmllbGRzVmFsdWUoKSk7XG4gICAgfVxuICAgIF90aGlzLnRyaWdnZXJPbkZpZWxkc0NoYW5nZShbbmFtZVBhdGhdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoY2hpbGRyZW5GaWVsZHMpKSk7XG4gIH0pO1xuICAvLyBMZXQgYWxsIGNoaWxkIEZpZWxkIGdldCB1cGRhdGUuXG4gIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInNldEZpZWxkc1ZhbHVlXCIsIGZ1bmN0aW9uIChzdG9yZSkge1xuICAgIF90aGlzLndhcm5pbmdVbmhvb2tlZCgpO1xuICAgIHZhciBwcmV2U3RvcmUgPSBfdGhpcy5zdG9yZTtcbiAgICBpZiAoc3RvcmUpIHtcbiAgICAgIHZhciBuZXh0U3RvcmUgPSBtZXJnZShfdGhpcy5zdG9yZSwgc3RvcmUpO1xuICAgICAgX3RoaXMudXBkYXRlU3RvcmUobmV4dFN0b3JlKTtcbiAgICB9XG4gICAgX3RoaXMubm90aWZ5T2JzZXJ2ZXJzKHByZXZTdG9yZSwgbnVsbCwge1xuICAgICAgdHlwZTogJ3ZhbHVlVXBkYXRlJyxcbiAgICAgIHNvdXJjZTogJ2V4dGVybmFsJ1xuICAgIH0pO1xuICAgIF90aGlzLm5vdGlmeVdhdGNoKCk7XG4gIH0pO1xuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJzZXRGaWVsZFZhbHVlXCIsIGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIF90aGlzLnNldEZpZWxkcyhbe1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVycm9yczogW10sXG4gICAgICB3YXJuaW5nczogW11cbiAgICB9XSk7XG4gIH0pO1xuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJnZXREZXBlbmRlbmN5Q2hpbGRyZW5GaWVsZHNcIiwgZnVuY3Rpb24gKHJvb3ROYW1lUGF0aCkge1xuICAgIHZhciBjaGlsZHJlbiA9IG5ldyBTZXQoKTtcbiAgICB2YXIgY2hpbGRyZW5GaWVsZHMgPSBbXTtcbiAgICB2YXIgZGVwZW5kZW5jaWVzMmZpZWxkcyA9IG5ldyBOYW1lTWFwKCk7XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSBtYXBzXG4gICAgICogQ2FuIHVzZSBjYWNoZSB0byBzYXZlIHBlcmYgaWYgdXNlciByZXBvcnQgcGVyZm9ybWFuY2UgaXNzdWUgd2l0aCB0aGlzXG4gICAgICovXG4gICAgX3RoaXMuZ2V0RmllbGRFbnRpdGllcygpLmZvckVhY2goZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICB2YXIgZGVwZW5kZW5jaWVzID0gZmllbGQucHJvcHMuZGVwZW5kZW5jaWVzO1xuICAgICAgKGRlcGVuZGVuY2llcyB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoZGVwZW5kZW5jeSkge1xuICAgICAgICB2YXIgZGVwZW5kZW5jeU5hbWVQYXRoID0gZ2V0TmFtZVBhdGgoZGVwZW5kZW5jeSk7XG4gICAgICAgIGRlcGVuZGVuY2llczJmaWVsZHMudXBkYXRlKGRlcGVuZGVuY3lOYW1lUGF0aCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBmaWVsZHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG5ldyBTZXQoKTtcbiAgICAgICAgICBmaWVsZHMuYWRkKGZpZWxkKTtcbiAgICAgICAgICByZXR1cm4gZmllbGRzO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHZhciBmaWxsQ2hpbGRyZW4gPSBmdW5jdGlvbiBmaWxsQ2hpbGRyZW4obmFtZVBhdGgpIHtcbiAgICAgIHZhciBmaWVsZHMgPSBkZXBlbmRlbmNpZXMyZmllbGRzLmdldChuYW1lUGF0aCkgfHwgbmV3IFNldCgpO1xuICAgICAgZmllbGRzLmZvckVhY2goZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICAgIGlmICghY2hpbGRyZW4uaGFzKGZpZWxkKSkge1xuICAgICAgICAgIGNoaWxkcmVuLmFkZChmaWVsZCk7XG4gICAgICAgICAgdmFyIGZpZWxkTmFtZVBhdGggPSBmaWVsZC5nZXROYW1lUGF0aCgpO1xuICAgICAgICAgIGlmIChmaWVsZC5pc0ZpZWxkRGlydHkoKSAmJiBmaWVsZE5hbWVQYXRoLmxlbmd0aCkge1xuICAgICAgICAgICAgY2hpbGRyZW5GaWVsZHMucHVzaChmaWVsZE5hbWVQYXRoKTtcbiAgICAgICAgICAgIGZpbGxDaGlsZHJlbihmaWVsZE5hbWVQYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG4gICAgZmlsbENoaWxkcmVuKHJvb3ROYW1lUGF0aCk7XG4gICAgcmV0dXJuIGNoaWxkcmVuRmllbGRzO1xuICB9KTtcbiAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwidHJpZ2dlck9uRmllbGRzQ2hhbmdlXCIsIGZ1bmN0aW9uIChuYW1lUGF0aExpc3QsIGZpbGVkRXJyb3JzKSB7XG4gICAgdmFyIG9uRmllbGRzQ2hhbmdlID0gX3RoaXMuY2FsbGJhY2tzLm9uRmllbGRzQ2hhbmdlO1xuICAgIGlmIChvbkZpZWxkc0NoYW5nZSkge1xuICAgICAgdmFyIGZpZWxkcyA9IF90aGlzLmdldEZpZWxkcygpO1xuXG4gICAgICAvKipcbiAgICAgICAqIEZpbGwgZXJyb3JzIHNpbmNlIGBmaWVsZHNgIG1heSBiZSByZXBsYWNlZCBieSBjb250cm9sbGVkIGZpZWxkc1xuICAgICAgICovXG4gICAgICBpZiAoZmlsZWRFcnJvcnMpIHtcbiAgICAgICAgdmFyIGNhY2hlID0gbmV3IE5hbWVNYXAoKTtcbiAgICAgICAgZmlsZWRFcnJvcnMuZm9yRWFjaChmdW5jdGlvbiAoX3JlZjYpIHtcbiAgICAgICAgICB2YXIgbmFtZSA9IF9yZWY2Lm5hbWUsXG4gICAgICAgICAgICBlcnJvcnMgPSBfcmVmNi5lcnJvcnM7XG4gICAgICAgICAgY2FjaGUuc2V0KG5hbWUsIGVycm9ycyk7XG4gICAgICAgIH0pO1xuICAgICAgICBmaWVsZHMuZm9yRWFjaChmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICBmaWVsZC5lcnJvcnMgPSBjYWNoZS5nZXQoZmllbGQubmFtZSkgfHwgZmllbGQuZXJyb3JzO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHZhciBjaGFuZ2VkRmllbGRzID0gZmllbGRzLmZpbHRlcihmdW5jdGlvbiAoX3JlZjcpIHtcbiAgICAgICAgdmFyIGZpZWxkTmFtZSA9IF9yZWY3Lm5hbWU7XG4gICAgICAgIHJldHVybiBjb250YWluc05hbWVQYXRoKG5hbWVQYXRoTGlzdCwgZmllbGROYW1lKTtcbiAgICAgIH0pO1xuICAgICAgaWYgKGNoYW5nZWRGaWVsZHMubGVuZ3RoKSB7XG4gICAgICAgIG9uRmllbGRzQ2hhbmdlKGNoYW5nZWRGaWVsZHMsIGZpZWxkcyk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IFZhbGlkYXRlID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJ2YWxpZGF0ZUZpZWxkc1wiLCBmdW5jdGlvbiAoYXJnMSwgYXJnMikge1xuICAgIF90aGlzLndhcm5pbmdVbmhvb2tlZCgpO1xuICAgIHZhciBuYW1lTGlzdDtcbiAgICB2YXIgb3B0aW9ucztcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmcxKSB8fCB0eXBlb2YgYXJnMSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGFyZzIgPT09ICdzdHJpbmcnKSB7XG4gICAgICBuYW1lTGlzdCA9IGFyZzE7XG4gICAgICBvcHRpb25zID0gYXJnMjtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucyA9IGFyZzE7XG4gICAgfVxuICAgIHZhciBwcm92aWRlTmFtZUxpc3QgPSAhIW5hbWVMaXN0O1xuICAgIHZhciBuYW1lUGF0aExpc3QgPSBwcm92aWRlTmFtZUxpc3QgPyBuYW1lTGlzdC5tYXAoZ2V0TmFtZVBhdGgpIDogW107XG5cbiAgICAvLyBDb2xsZWN0IHJlc3VsdCBpbiBwcm9taXNlIGxpc3RcbiAgICB2YXIgcHJvbWlzZUxpc3QgPSBbXTtcblxuICAgIC8vIFdlIHRlbXAgc2F2ZSB0aGUgcGF0aCB3aGljaCBuZWVkIHRyaWdnZXIgZm9yIGBvbkZpZWxkc0NoYW5nZWBcbiAgICB2YXIgVE1QX1NQTElUID0gU3RyaW5nKERhdGUubm93KCkpO1xuICAgIHZhciB2YWxpZGF0ZU5hbWVQYXRoTGlzdCA9IG5ldyBTZXQoKTtcbiAgICB2YXIgX3JlZjggPSBvcHRpb25zIHx8IHt9LFxuICAgICAgcmVjdXJzaXZlID0gX3JlZjgucmVjdXJzaXZlLFxuICAgICAgZGlydHkgPSBfcmVmOC5kaXJ0eTtcbiAgICBfdGhpcy5nZXRGaWVsZEVudGl0aWVzKHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICAvLyBBZGQgZmllbGQgaWYgbm90IHByb3ZpZGUgYG5hbWVMaXN0YFxuICAgICAgaWYgKCFwcm92aWRlTmFtZUxpc3QpIHtcbiAgICAgICAgbmFtZVBhdGhMaXN0LnB1c2goZmllbGQuZ2V0TmFtZVBhdGgoKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNraXAgaWYgd2l0aG91dCBydWxlXG4gICAgICBpZiAoIWZpZWxkLnByb3BzLnJ1bGVzIHx8ICFmaWVsZC5wcm9wcy5ydWxlcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBTa2lwIGlmIG9ubHkgdmFsaWRhdGUgZGlydHkgZmllbGRcbiAgICAgIGlmIChkaXJ0eSAmJiAhZmllbGQuaXNGaWVsZERpcnR5KCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIGZpZWxkTmFtZVBhdGggPSBmaWVsZC5nZXROYW1lUGF0aCgpO1xuICAgICAgdmFsaWRhdGVOYW1lUGF0aExpc3QuYWRkKGZpZWxkTmFtZVBhdGguam9pbihUTVBfU1BMSVQpKTtcblxuICAgICAgLy8gQWRkIGZpZWxkIHZhbGlkYXRlIHJ1bGUgaW4gdG8gcHJvbWlzZSBsaXN0XG4gICAgICBpZiAoIXByb3ZpZGVOYW1lTGlzdCB8fCBjb250YWluc05hbWVQYXRoKG5hbWVQYXRoTGlzdCwgZmllbGROYW1lUGF0aCwgcmVjdXJzaXZlKSkge1xuICAgICAgICB2YXIgcHJvbWlzZSA9IGZpZWxkLnZhbGlkYXRlUnVsZXMoX29iamVjdFNwcmVhZCh7XG4gICAgICAgICAgdmFsaWRhdGVNZXNzYWdlczogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBkZWZhdWx0VmFsaWRhdGVNZXNzYWdlcyksIF90aGlzLnZhbGlkYXRlTWVzc2FnZXMpXG4gICAgICAgIH0sIG9wdGlvbnMpKTtcblxuICAgICAgICAvLyBXcmFwIHByb21pc2Ugd2l0aCBmaWVsZFxuICAgICAgICBwcm9taXNlTGlzdC5wdXNoKHByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IGZpZWxkTmFtZVBhdGgsXG4gICAgICAgICAgICBlcnJvcnM6IFtdLFxuICAgICAgICAgICAgd2FybmluZ3M6IFtdXG4gICAgICAgICAgfTtcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJ1bGVFcnJvcnMpIHtcbiAgICAgICAgICB2YXIgX3J1bGVFcnJvcnMkZm9yRWFjaDtcbiAgICAgICAgICB2YXIgbWVyZ2VkRXJyb3JzID0gW107XG4gICAgICAgICAgdmFyIG1lcmdlZFdhcm5pbmdzID0gW107XG4gICAgICAgICAgKF9ydWxlRXJyb3JzJGZvckVhY2ggPSBydWxlRXJyb3JzLmZvckVhY2gpID09PSBudWxsIHx8IF9ydWxlRXJyb3JzJGZvckVhY2ggPT09IHZvaWQgMCB8fCBfcnVsZUVycm9ycyRmb3JFYWNoLmNhbGwocnVsZUVycm9ycywgZnVuY3Rpb24gKF9yZWY5KSB7XG4gICAgICAgICAgICB2YXIgd2FybmluZ09ubHkgPSBfcmVmOS5ydWxlLndhcm5pbmdPbmx5LFxuICAgICAgICAgICAgICBlcnJvcnMgPSBfcmVmOS5lcnJvcnM7XG4gICAgICAgICAgICBpZiAod2FybmluZ09ubHkpIHtcbiAgICAgICAgICAgICAgbWVyZ2VkV2FybmluZ3MucHVzaC5hcHBseShtZXJnZWRXYXJuaW5ncywgX3RvQ29uc3VtYWJsZUFycmF5KGVycm9ycykpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbWVyZ2VkRXJyb3JzLnB1c2guYXBwbHkobWVyZ2VkRXJyb3JzLCBfdG9Db25zdW1hYmxlQXJyYXkoZXJyb3JzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKG1lcmdlZEVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCh7XG4gICAgICAgICAgICAgIG5hbWU6IGZpZWxkTmFtZVBhdGgsXG4gICAgICAgICAgICAgIGVycm9yczogbWVyZ2VkRXJyb3JzLFxuICAgICAgICAgICAgICB3YXJuaW5nczogbWVyZ2VkV2FybmluZ3NcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogZmllbGROYW1lUGF0aCxcbiAgICAgICAgICAgIGVycm9yczogbWVyZ2VkRXJyb3JzLFxuICAgICAgICAgICAgd2FybmluZ3M6IG1lcmdlZFdhcm5pbmdzXG4gICAgICAgICAgfTtcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHZhciBzdW1tYXJ5UHJvbWlzZSA9IGFsbFByb21pc2VGaW5pc2gocHJvbWlzZUxpc3QpO1xuICAgIF90aGlzLmxhc3RWYWxpZGF0ZVByb21pc2UgPSBzdW1tYXJ5UHJvbWlzZTtcblxuICAgIC8vIE5vdGlmeSBmaWVsZHMgd2l0aCBydWxlIHRoYXQgdmFsaWRhdGUgaGFzIGZpbmlzaGVkIGFuZCBuZWVkIHVwZGF0ZVxuICAgIHN1bW1hcnlQcm9taXNlLmNhdGNoKGZ1bmN0aW9uIChyZXN1bHRzKSB7XG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXN1bHRzKSB7XG4gICAgICB2YXIgcmVzdWx0TmFtZVBhdGhMaXN0ID0gcmVzdWx0cy5tYXAoZnVuY3Rpb24gKF9yZWYxMCkge1xuICAgICAgICB2YXIgbmFtZSA9IF9yZWYxMC5uYW1lO1xuICAgICAgICByZXR1cm4gbmFtZTtcbiAgICAgIH0pO1xuICAgICAgX3RoaXMubm90aWZ5T2JzZXJ2ZXJzKF90aGlzLnN0b3JlLCByZXN1bHROYW1lUGF0aExpc3QsIHtcbiAgICAgICAgdHlwZTogJ3ZhbGlkYXRlRmluaXNoJ1xuICAgICAgfSk7XG4gICAgICBfdGhpcy50cmlnZ2VyT25GaWVsZHNDaGFuZ2UocmVzdWx0TmFtZVBhdGhMaXN0LCByZXN1bHRzKTtcbiAgICB9KTtcbiAgICB2YXIgcmV0dXJuUHJvbWlzZSA9IHN1bW1hcnlQcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLmxhc3RWYWxpZGF0ZVByb21pc2UgPT09IHN1bW1hcnlQcm9taXNlKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoX3RoaXMuZ2V0RmllbGRzVmFsdWUobmFtZVBhdGhMaXN0KSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoW10pO1xuICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZXN1bHRzKSB7XG4gICAgICB2YXIgZXJyb3JMaXN0ID0gcmVzdWx0cy5maWx0ZXIoZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0ICYmIHJlc3VsdC5lcnJvcnMubGVuZ3RoO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3Qoe1xuICAgICAgICB2YWx1ZXM6IF90aGlzLmdldEZpZWxkc1ZhbHVlKG5hbWVQYXRoTGlzdCksXG4gICAgICAgIGVycm9yRmllbGRzOiBlcnJvckxpc3QsXG4gICAgICAgIG91dE9mRGF0ZTogX3RoaXMubGFzdFZhbGlkYXRlUHJvbWlzZSAhPT0gc3VtbWFyeVByb21pc2VcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gRG8gbm90IHRocm93IGluIGNvbnNvbGVcbiAgICByZXR1cm5Qcm9taXNlLmNhdGNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gZTtcbiAgICB9KTtcblxuICAgIC8vIGB2YWxpZGF0aW5nYCBjaGFuZ2VkLiBUcmlnZ2VyIGBvbkZpZWxkc0NoYW5nZWBcbiAgICB2YXIgdHJpZ2dlck5hbWVQYXRoTGlzdCA9IG5hbWVQYXRoTGlzdC5maWx0ZXIoZnVuY3Rpb24gKG5hbWVQYXRoKSB7XG4gICAgICByZXR1cm4gdmFsaWRhdGVOYW1lUGF0aExpc3QuaGFzKG5hbWVQYXRoLmpvaW4oVE1QX1NQTElUKSk7XG4gICAgfSk7XG4gICAgX3RoaXMudHJpZ2dlck9uRmllbGRzQ2hhbmdlKHRyaWdnZXJOYW1lUGF0aExpc3QpO1xuICAgIHJldHVybiByZXR1cm5Qcm9taXNlO1xuICB9KTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTdWJtaXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJzdWJtaXRcIiwgZnVuY3Rpb24gKCkge1xuICAgIF90aGlzLndhcm5pbmdVbmhvb2tlZCgpO1xuICAgIF90aGlzLnZhbGlkYXRlRmllbGRzKCkudGhlbihmdW5jdGlvbiAodmFsdWVzKSB7XG4gICAgICB2YXIgb25GaW5pc2ggPSBfdGhpcy5jYWxsYmFja3Mub25GaW5pc2g7XG4gICAgICBpZiAob25GaW5pc2gpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBvbkZpbmlzaCh2YWx1ZXMpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAvLyBTaG91bGQgcHJpbnQgZXJyb3IgaWYgdXNlciBgb25GaW5pc2hgIGNhbGxiYWNrIGZhaWxlZFxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgb25GaW5pc2hGYWlsZWQgPSBfdGhpcy5jYWxsYmFja3Mub25GaW5pc2hGYWlsZWQ7XG4gICAgICBpZiAob25GaW5pc2hGYWlsZWQpIHtcbiAgICAgICAgb25GaW5pc2hGYWlsZWQoZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuICB0aGlzLmZvcmNlUm9vdFVwZGF0ZSA9IGZvcmNlUm9vdFVwZGF0ZTtcbn0pO1xuZnVuY3Rpb24gdXNlRm9ybShmb3JtKSB7XG4gIHZhciBmb3JtUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZSh7fSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgZm9yY2VVcGRhdGUgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICBpZiAoIWZvcm1SZWYuY3VycmVudCkge1xuICAgIGlmIChmb3JtKSB7XG4gICAgICBmb3JtUmVmLmN1cnJlbnQgPSBmb3JtO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDcmVhdGUgYSBuZXcgRm9ybVN0b3JlIGlmIG5vdCBwcm92aWRlZFxuICAgICAgdmFyIGZvcmNlUmVSZW5kZXIgPSBmdW5jdGlvbiBmb3JjZVJlUmVuZGVyKCkge1xuICAgICAgICBmb3JjZVVwZGF0ZSh7fSk7XG4gICAgICB9O1xuICAgICAgdmFyIGZvcm1TdG9yZSA9IG5ldyBGb3JtU3RvcmUoZm9yY2VSZVJlbmRlcik7XG4gICAgICBmb3JtUmVmLmN1cnJlbnQgPSBmb3JtU3RvcmUuZ2V0Rm9ybSgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW2Zvcm1SZWYuY3VycmVudF07XG59XG5leHBvcnQgZGVmYXVsdCB1c2VGb3JtOyIsICJleHBvcnQgZnVuY3Rpb24gYWxsUHJvbWlzZUZpbmlzaChwcm9taXNlTGlzdCkge1xuICB2YXIgaGFzRXJyb3IgPSBmYWxzZTtcbiAgdmFyIGNvdW50ID0gcHJvbWlzZUxpc3QubGVuZ3RoO1xuICB2YXIgcmVzdWx0cyA9IFtdO1xuICBpZiAoIXByb21pc2VMaXN0Lmxlbmd0aCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoW10pO1xuICB9XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgcHJvbWlzZUxpc3QuZm9yRWFjaChmdW5jdGlvbiAocHJvbWlzZSwgaW5kZXgpIHtcbiAgICAgIHByb21pc2UuY2F0Y2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICBjb3VudCAtPSAxO1xuICAgICAgICByZXN1bHRzW2luZGV4XSA9IHJlc3VsdDtcbiAgICAgICAgaWYgKGNvdW50ID4gMCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzRXJyb3IpIHtcbiAgICAgICAgICByZWplY3QocmVzdWx0cyk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShyZXN1bHRzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0iLCAiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xudmFyIFNQTElUID0gJ19fQGZpZWxkX3NwbGl0X18nO1xuXG4vKipcbiAqIENvbnZlcnQgbmFtZSBwYXRoIGludG8gc3RyaW5nIHRvIGZhc3QgdGhlIGZldGNoIHNwZWVkIG9mIE1hcC5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplKG5hbWVQYXRoKSB7XG4gIHJldHVybiBuYW1lUGF0aC5tYXAoZnVuY3Rpb24gKGNlbGwpIHtcbiAgICByZXR1cm4gXCJcIi5jb25jYXQoX3R5cGVvZihjZWxsKSwgXCI6XCIpLmNvbmNhdChjZWxsKTtcbiAgfSlcbiAgLy8gTWFnaWMgc3BsaXRcbiAgLmpvaW4oU1BMSVQpO1xufVxuXG4vKipcbiAqIE5hbWVNYXAgbGlrZSBhIGBNYXBgIGJ1dCBhY2NlcHRzIGBzdHJpbmdbXWAgYXMga2V5LlxuICovXG52YXIgTmFtZU1hcCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE5hbWVNYXAoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE5hbWVNYXApO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImt2c1wiLCBuZXcgTWFwKCkpO1xuICB9XG4gIF9jcmVhdGVDbGFzcyhOYW1lTWFwLCBbe1xuICAgIGtleTogXCJzZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHRoaXMua3ZzLnNldChub3JtYWxpemUoa2V5KSwgdmFsdWUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMua3ZzLmdldChub3JtYWxpemUoa2V5KSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGUoa2V5LCB1cGRhdGVyKSB7XG4gICAgICB2YXIgb3JpZ2luID0gdGhpcy5nZXQoa2V5KTtcbiAgICAgIHZhciBuZXh0ID0gdXBkYXRlcihvcmlnaW4pO1xuICAgICAgaWYgKCFuZXh0KSB7XG4gICAgICAgIHRoaXMuZGVsZXRlKGtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldChrZXksIG5leHQpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkZWxldGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2RlbGV0ZShrZXkpIHtcbiAgICAgIHRoaXMua3ZzLmRlbGV0ZShub3JtYWxpemUoa2V5KSk7XG4gICAgfVxuXG4gICAgLy8gU2luY2Ugd2Ugb25seSB1c2UgdGhpcyBpbiB0ZXN0LCBsZXQgc2ltcGx5IHJlYWxpemUgdGhpc1xuICB9LCB7XG4gICAga2V5OiBcIm1hcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXAoY2FsbGJhY2spIHtcbiAgICAgIHJldHVybiBfdG9Db25zdW1hYmxlQXJyYXkodGhpcy5rdnMuZW50cmllcygpKS5tYXAoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgdmFyIF9yZWYyID0gX3NsaWNlZFRvQXJyYXkoX3JlZiwgMiksXG4gICAgICAgICAga2V5ID0gX3JlZjJbMF0sXG4gICAgICAgICAgdmFsdWUgPSBfcmVmMlsxXTtcbiAgICAgICAgdmFyIGNlbGxzID0ga2V5LnNwbGl0KFNQTElUKTtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKHtcbiAgICAgICAgICBrZXk6IGNlbGxzLm1hcChmdW5jdGlvbiAoY2VsbCkge1xuICAgICAgICAgICAgdmFyIF9jZWxsJG1hdGNoID0gY2VsbC5tYXRjaCgvXihbXjpdKik6KC4qKSQvKSxcbiAgICAgICAgICAgICAgX2NlbGwkbWF0Y2gyID0gX3NsaWNlZFRvQXJyYXkoX2NlbGwkbWF0Y2gsIDMpLFxuICAgICAgICAgICAgICB0eXBlID0gX2NlbGwkbWF0Y2gyWzFdLFxuICAgICAgICAgICAgICB1bml0ID0gX2NlbGwkbWF0Y2gyWzJdO1xuICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT09ICdudW1iZXInID8gTnVtYmVyKHVuaXQpIDogdW5pdDtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidG9KU09OXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICAgIHZhciBqc29uID0ge307XG4gICAgICB0aGlzLm1hcChmdW5jdGlvbiAoX3JlZjMpIHtcbiAgICAgICAgdmFyIGtleSA9IF9yZWYzLmtleSxcbiAgICAgICAgICB2YWx1ZSA9IF9yZWYzLnZhbHVlO1xuICAgICAgICBqc29uW2tleS5qb2luKCcuJyldID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4ganNvbjtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIE5hbWVNYXA7XG59KCk7XG5leHBvcnQgZGVmYXVsdCBOYW1lTWFwOyIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wibmFtZVwiLCBcImluaXRpYWxWYWx1ZXNcIiwgXCJmaWVsZHNcIiwgXCJmb3JtXCIsIFwicHJlc2VydmVcIiwgXCJjaGlsZHJlblwiLCBcImNvbXBvbmVudFwiLCBcInZhbGlkYXRlTWVzc2FnZXNcIiwgXCJ2YWxpZGF0ZVRyaWdnZXJcIiwgXCJvblZhbHVlc0NoYW5nZVwiLCBcIm9uRmllbGRzQ2hhbmdlXCIsIFwib25GaW5pc2hcIiwgXCJvbkZpbmlzaEZhaWxlZFwiLCBcImNsZWFyT25EZXN0cm95XCJdO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZUZvcm0gZnJvbSBcIi4vdXNlRm9ybVwiO1xuaW1wb3J0IEZpZWxkQ29udGV4dCwgeyBIT09LX01BUksgfSBmcm9tIFwiLi9GaWVsZENvbnRleHRcIjtcbmltcG9ydCBGb3JtQ29udGV4dCBmcm9tIFwiLi9Gb3JtQ29udGV4dFwiO1xuaW1wb3J0IHsgaXNTaW1pbGFyIH0gZnJvbSBcIi4vdXRpbHMvdmFsdWVVdGlsXCI7XG5pbXBvcnQgTGlzdENvbnRleHQgZnJvbSBcIi4vTGlzdENvbnRleHRcIjtcbnZhciBGb3JtID0gZnVuY3Rpb24gRm9ybShfcmVmLCByZWYpIHtcbiAgdmFyIG5hbWUgPSBfcmVmLm5hbWUsXG4gICAgaW5pdGlhbFZhbHVlcyA9IF9yZWYuaW5pdGlhbFZhbHVlcyxcbiAgICBmaWVsZHMgPSBfcmVmLmZpZWxkcyxcbiAgICBmb3JtID0gX3JlZi5mb3JtLFxuICAgIHByZXNlcnZlID0gX3JlZi5wcmVzZXJ2ZSxcbiAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgX3JlZiRjb21wb25lbnQgPSBfcmVmLmNvbXBvbmVudCxcbiAgICBDb21wb25lbnQgPSBfcmVmJGNvbXBvbmVudCA9PT0gdm9pZCAwID8gJ2Zvcm0nIDogX3JlZiRjb21wb25lbnQsXG4gICAgdmFsaWRhdGVNZXNzYWdlcyA9IF9yZWYudmFsaWRhdGVNZXNzYWdlcyxcbiAgICBfcmVmJHZhbGlkYXRlVHJpZ2dlciA9IF9yZWYudmFsaWRhdGVUcmlnZ2VyLFxuICAgIHZhbGlkYXRlVHJpZ2dlciA9IF9yZWYkdmFsaWRhdGVUcmlnZ2VyID09PSB2b2lkIDAgPyAnb25DaGFuZ2UnIDogX3JlZiR2YWxpZGF0ZVRyaWdnZXIsXG4gICAgb25WYWx1ZXNDaGFuZ2UgPSBfcmVmLm9uVmFsdWVzQ2hhbmdlLFxuICAgIF9vbkZpZWxkc0NoYW5nZSA9IF9yZWYub25GaWVsZHNDaGFuZ2UsXG4gICAgX29uRmluaXNoID0gX3JlZi5vbkZpbmlzaCxcbiAgICBvbkZpbmlzaEZhaWxlZCA9IF9yZWYub25GaW5pc2hGYWlsZWQsXG4gICAgY2xlYXJPbkRlc3Ryb3kgPSBfcmVmLmNsZWFyT25EZXN0cm95LFxuICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBfZXhjbHVkZWQpO1xuICB2YXIgbmF0aXZlRWxlbWVudFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIGZvcm1Db250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChGb3JtQ29udGV4dCk7XG5cbiAgLy8gV2UgY3VzdG9taXplIGhhbmRsZSBldmVudCBzaW5jZSBDb250ZXh0IHdpbGwgbWFrZXMgYWxsIHRoZSBjb25zdW1lciByZS1yZW5kZXI6XG4gIC8vIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9jb250ZXh0Lmh0bWwjY29udGV4dHByb3ZpZGVyXG4gIHZhciBfdXNlRm9ybSA9IHVzZUZvcm0oZm9ybSksXG4gICAgX3VzZUZvcm0yID0gX3NsaWNlZFRvQXJyYXkoX3VzZUZvcm0sIDEpLFxuICAgIGZvcm1JbnN0YW5jZSA9IF91c2VGb3JtMlswXTtcbiAgdmFyIF9nZXRJbnRlcm5hbEhvb2tzID0gZm9ybUluc3RhbmNlLmdldEludGVybmFsSG9va3MoSE9PS19NQVJLKSxcbiAgICB1c2VTdWJzY3JpYmUgPSBfZ2V0SW50ZXJuYWxIb29rcy51c2VTdWJzY3JpYmUsXG4gICAgc2V0SW5pdGlhbFZhbHVlcyA9IF9nZXRJbnRlcm5hbEhvb2tzLnNldEluaXRpYWxWYWx1ZXMsXG4gICAgc2V0Q2FsbGJhY2tzID0gX2dldEludGVybmFsSG9va3Muc2V0Q2FsbGJhY2tzLFxuICAgIHNldFZhbGlkYXRlTWVzc2FnZXMgPSBfZ2V0SW50ZXJuYWxIb29rcy5zZXRWYWxpZGF0ZU1lc3NhZ2VzLFxuICAgIHNldFByZXNlcnZlID0gX2dldEludGVybmFsSG9va3Muc2V0UHJlc2VydmUsXG4gICAgZGVzdHJveUZvcm0gPSBfZ2V0SW50ZXJuYWxIb29rcy5kZXN0cm95Rm9ybTtcblxuICAvLyBQYXNzIHJlZiB3aXRoIGZvcm0gaW5zdGFuY2VcbiAgUmVhY3QudXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBmb3JtSW5zdGFuY2UpLCB7fSwge1xuICAgICAgbmF0aXZlRWxlbWVudDogbmF0aXZlRWxlbWVudFJlZi5jdXJyZW50XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIFJlZ2lzdGVyIGZvcm0gaW50byBDb250ZXh0XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgZm9ybUNvbnRleHQucmVnaXN0ZXJGb3JtKG5hbWUsIGZvcm1JbnN0YW5jZSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvcm1Db250ZXh0LnVucmVnaXN0ZXJGb3JtKG5hbWUpO1xuICAgIH07XG4gIH0sIFtmb3JtQ29udGV4dCwgZm9ybUluc3RhbmNlLCBuYW1lXSk7XG5cbiAgLy8gUGFzcyBwcm9wcyB0byBzdG9yZVxuICBzZXRWYWxpZGF0ZU1lc3NhZ2VzKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZm9ybUNvbnRleHQudmFsaWRhdGVNZXNzYWdlcyksIHZhbGlkYXRlTWVzc2FnZXMpKTtcbiAgc2V0Q2FsbGJhY2tzKHtcbiAgICBvblZhbHVlc0NoYW5nZTogb25WYWx1ZXNDaGFuZ2UsXG4gICAgb25GaWVsZHNDaGFuZ2U6IGZ1bmN0aW9uIG9uRmllbGRzQ2hhbmdlKGNoYW5nZWRGaWVsZHMpIHtcbiAgICAgIGZvcm1Db250ZXh0LnRyaWdnZXJGb3JtQ2hhbmdlKG5hbWUsIGNoYW5nZWRGaWVsZHMpO1xuICAgICAgaWYgKF9vbkZpZWxkc0NoYW5nZSkge1xuICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgcmVzdCA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgICAgcmVzdFtfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICAgIH1cbiAgICAgICAgX29uRmllbGRzQ2hhbmdlLmFwcGx5KHZvaWQgMCwgW2NoYW5nZWRGaWVsZHNdLmNvbmNhdChyZXN0KSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBvbkZpbmlzaDogZnVuY3Rpb24gb25GaW5pc2godmFsdWVzKSB7XG4gICAgICBmb3JtQ29udGV4dC50cmlnZ2VyRm9ybUZpbmlzaChuYW1lLCB2YWx1ZXMpO1xuICAgICAgaWYgKF9vbkZpbmlzaCkge1xuICAgICAgICBfb25GaW5pc2godmFsdWVzKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9uRmluaXNoRmFpbGVkOiBvbkZpbmlzaEZhaWxlZFxuICB9KTtcbiAgc2V0UHJlc2VydmUocHJlc2VydmUpO1xuXG4gIC8vIFNldCBpbml0aWFsIHZhbHVlLCBpbml0IHN0b3JlIHZhbHVlIHdoZW4gZmlyc3QgbW91bnRcbiAgdmFyIG1vdW50UmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBzZXRJbml0aWFsVmFsdWVzKGluaXRpYWxWYWx1ZXMsICFtb3VudFJlZi5jdXJyZW50KTtcbiAgaWYgKCFtb3VudFJlZi5jdXJyZW50KSB7XG4gICAgbW91bnRSZWYuY3VycmVudCA9IHRydWU7XG4gIH1cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGRlc3Ryb3lGb3JtKGNsZWFyT25EZXN0cm95KTtcbiAgICB9O1xuICB9LFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIFtdKTtcblxuICAvLyBQcmVwYXJlIGNoaWxkcmVuIGJ5IGBjaGlsZHJlbmAgdHlwZVxuICB2YXIgY2hpbGRyZW5Ob2RlO1xuICB2YXIgY2hpbGRyZW5SZW5kZXJQcm9wcyA9IHR5cGVvZiBjaGlsZHJlbiA9PT0gJ2Z1bmN0aW9uJztcbiAgaWYgKGNoaWxkcmVuUmVuZGVyUHJvcHMpIHtcbiAgICB2YXIgX3ZhbHVlcyA9IGZvcm1JbnN0YW5jZS5nZXRGaWVsZHNWYWx1ZSh0cnVlKTtcbiAgICBjaGlsZHJlbk5vZGUgPSBjaGlsZHJlbihfdmFsdWVzLCBmb3JtSW5zdGFuY2UpO1xuICB9IGVsc2Uge1xuICAgIGNoaWxkcmVuTm9kZSA9IGNoaWxkcmVuO1xuICB9XG5cbiAgLy8gTm90IHVzZSBzdWJzY3JpYmUgd2hlbiB1c2luZyByZW5kZXIgcHJvcHNcbiAgdXNlU3Vic2NyaWJlKCFjaGlsZHJlblJlbmRlclByb3BzKTtcblxuICAvLyBMaXN0ZW4gaWYgZmllbGRzIHByb3ZpZGVkLiBXZSB1c2UgcmVmIHRvIHNhdmUgcHJldiBkYXRhIGhlcmUgdG8gYXZvaWQgYWRkaXRpb25hbCByZW5kZXJcbiAgdmFyIHByZXZGaWVsZHNSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWlzU2ltaWxhcihwcmV2RmllbGRzUmVmLmN1cnJlbnQgfHwgW10sIGZpZWxkcyB8fCBbXSkpIHtcbiAgICAgIGZvcm1JbnN0YW5jZS5zZXRGaWVsZHMoZmllbGRzIHx8IFtdKTtcbiAgICB9XG4gICAgcHJldkZpZWxkc1JlZi5jdXJyZW50ID0gZmllbGRzO1xuICB9LCBbZmllbGRzLCBmb3JtSW5zdGFuY2VdKTtcbiAgdmFyIGZvcm1Db250ZXh0VmFsdWUgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBmb3JtSW5zdGFuY2UpLCB7fSwge1xuICAgICAgdmFsaWRhdGVUcmlnZ2VyOiB2YWxpZGF0ZVRyaWdnZXJcbiAgICB9KTtcbiAgfSwgW2Zvcm1JbnN0YW5jZSwgdmFsaWRhdGVUcmlnZ2VyXSk7XG4gIHZhciB3cmFwcGVyTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExpc3RDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IG51bGxcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRmllbGRDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IGZvcm1Db250ZXh0VmFsdWVcbiAgfSwgY2hpbGRyZW5Ob2RlKSk7XG4gIGlmIChDb21wb25lbnQgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIHdyYXBwZXJOb2RlO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb25lbnQsIF9leHRlbmRzKHt9LCByZXN0UHJvcHMsIHtcbiAgICByZWY6IG5hdGl2ZUVsZW1lbnRSZWYsXG4gICAgb25TdWJtaXQ6IGZ1bmN0aW9uIG9uU3VibWl0KGV2ZW50KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBmb3JtSW5zdGFuY2Uuc3VibWl0KCk7XG4gICAgfSxcbiAgICBvblJlc2V0OiBmdW5jdGlvbiBvblJlc2V0KGV2ZW50KSB7XG4gICAgICB2YXIgX3Jlc3RQcm9wcyRvblJlc2V0O1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGZvcm1JbnN0YW5jZS5yZXNldEZpZWxkcygpO1xuICAgICAgKF9yZXN0UHJvcHMkb25SZXNldCA9IHJlc3RQcm9wcy5vblJlc2V0KSA9PT0gbnVsbCB8fCBfcmVzdFByb3BzJG9uUmVzZXQgPT09IHZvaWQgMCB8fCBfcmVzdFByb3BzJG9uUmVzZXQuY2FsbChyZXN0UHJvcHMsIGV2ZW50KTtcbiAgICB9XG4gIH0pLCB3cmFwcGVyTm9kZSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgRm9ybTsiLCAiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG52YXIgRm9ybUNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh7XG4gIHRyaWdnZXJGb3JtQ2hhbmdlOiBmdW5jdGlvbiB0cmlnZ2VyRm9ybUNoYW5nZSgpIHt9LFxuICB0cmlnZ2VyRm9ybUZpbmlzaDogZnVuY3Rpb24gdHJpZ2dlckZvcm1GaW5pc2goKSB7fSxcbiAgcmVnaXN0ZXJGb3JtOiBmdW5jdGlvbiByZWdpc3RlckZvcm0oKSB7fSxcbiAgdW5yZWdpc3RlckZvcm06IGZ1bmN0aW9uIHVucmVnaXN0ZXJGb3JtKCkge31cbn0pO1xudmFyIEZvcm1Qcm92aWRlciA9IGZ1bmN0aW9uIEZvcm1Qcm92aWRlcihfcmVmKSB7XG4gIHZhciB2YWxpZGF0ZU1lc3NhZ2VzID0gX3JlZi52YWxpZGF0ZU1lc3NhZ2VzLFxuICAgIG9uRm9ybUNoYW5nZSA9IF9yZWYub25Gb3JtQ2hhbmdlLFxuICAgIG9uRm9ybUZpbmlzaCA9IF9yZWYub25Gb3JtRmluaXNoLFxuICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbjtcbiAgdmFyIGZvcm1Db250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChGb3JtQ29udGV4dCk7XG4gIHZhciBmb3Jtc1JlZiA9IFJlYWN0LnVzZVJlZih7fSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGb3JtQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGZvcm1Db250ZXh0KSwge30sIHtcbiAgICAgIHZhbGlkYXRlTWVzc2FnZXM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZm9ybUNvbnRleHQudmFsaWRhdGVNZXNzYWdlcyksIHZhbGlkYXRlTWVzc2FnZXMpLFxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAvLyA9ICAgICAgICAgICAgICAgICAgR2xvYmFsIEZvcm0gQ29udHJvbCAgICAgICAgICAgICAgICAgID1cbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgdHJpZ2dlckZvcm1DaGFuZ2U6IGZ1bmN0aW9uIHRyaWdnZXJGb3JtQ2hhbmdlKG5hbWUsIGNoYW5nZWRGaWVsZHMpIHtcbiAgICAgICAgaWYgKG9uRm9ybUNoYW5nZSkge1xuICAgICAgICAgIG9uRm9ybUNoYW5nZShuYW1lLCB7XG4gICAgICAgICAgICBjaGFuZ2VkRmllbGRzOiBjaGFuZ2VkRmllbGRzLFxuICAgICAgICAgICAgZm9ybXM6IGZvcm1zUmVmLmN1cnJlbnRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmb3JtQ29udGV4dC50cmlnZ2VyRm9ybUNoYW5nZShuYW1lLCBjaGFuZ2VkRmllbGRzKTtcbiAgICAgIH0sXG4gICAgICB0cmlnZ2VyRm9ybUZpbmlzaDogZnVuY3Rpb24gdHJpZ2dlckZvcm1GaW5pc2gobmFtZSwgdmFsdWVzKSB7XG4gICAgICAgIGlmIChvbkZvcm1GaW5pc2gpIHtcbiAgICAgICAgICBvbkZvcm1GaW5pc2gobmFtZSwge1xuICAgICAgICAgICAgdmFsdWVzOiB2YWx1ZXMsXG4gICAgICAgICAgICBmb3JtczogZm9ybXNSZWYuY3VycmVudFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZvcm1Db250ZXh0LnRyaWdnZXJGb3JtRmluaXNoKG5hbWUsIHZhbHVlcyk7XG4gICAgICB9LFxuICAgICAgcmVnaXN0ZXJGb3JtOiBmdW5jdGlvbiByZWdpc3RlckZvcm0obmFtZSwgZm9ybSkge1xuICAgICAgICBpZiAobmFtZSkge1xuICAgICAgICAgIGZvcm1zUmVmLmN1cnJlbnQgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGZvcm1zUmVmLmN1cnJlbnQpLCB7fSwgX2RlZmluZVByb3BlcnR5KHt9LCBuYW1lLCBmb3JtKSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9ybUNvbnRleHQucmVnaXN0ZXJGb3JtKG5hbWUsIGZvcm0pO1xuICAgICAgfSxcbiAgICAgIHVucmVnaXN0ZXJGb3JtOiBmdW5jdGlvbiB1bnJlZ2lzdGVyRm9ybShuYW1lKSB7XG4gICAgICAgIHZhciBuZXdGb3JtcyA9IF9vYmplY3RTcHJlYWQoe30sIGZvcm1zUmVmLmN1cnJlbnQpO1xuICAgICAgICBkZWxldGUgbmV3Rm9ybXNbbmFtZV07XG4gICAgICAgIGZvcm1zUmVmLmN1cnJlbnQgPSBuZXdGb3JtcztcbiAgICAgICAgZm9ybUNvbnRleHQudW5yZWdpc3RlckZvcm0obmFtZSk7XG4gICAgICB9XG4gICAgfSlcbiAgfSwgY2hpbGRyZW4pO1xufTtcbmV4cG9ydCB7IEZvcm1Qcm92aWRlciB9O1xuZXhwb3J0IGRlZmF1bHQgRm9ybUNvbnRleHQ7IiwgImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuaW1wb3J0IHsgdXNlQ29udGV4dCwgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IEZpZWxkQ29udGV4dCwgeyBIT09LX01BUksgfSBmcm9tIFwiLi9GaWVsZENvbnRleHRcIjtcbmltcG9ydCB7IGlzRm9ybUluc3RhbmNlIH0gZnJvbSBcIi4vdXRpbHMvdHlwZVV0aWxcIjtcbmltcG9ydCB7IGdldE5hbWVQYXRoLCBnZXRWYWx1ZSB9IGZyb20gXCIuL3V0aWxzL3ZhbHVlVXRpbFwiO1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeSh2YWx1ZSkge1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBNYXRoLnJhbmRvbSgpO1xuICB9XG59XG52YXIgdXNlV2F0Y2hXYXJuaW5nID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGZ1bmN0aW9uIChuYW1lUGF0aCkge1xuICB2YXIgZnVsbHlTdHIgPSBuYW1lUGF0aC5qb2luKCdfX1JDX0ZJRUxEX0ZPUk1fU1BMSVRfXycpO1xuICB2YXIgbmFtZVN0clJlZiA9IHVzZVJlZihmdWxseVN0cik7XG4gIHdhcm5pbmcobmFtZVN0clJlZi5jdXJyZW50ID09PSBmdWxseVN0ciwgJ2B1c2VXYXRjaGAgaXMgbm90IHN1cHBvcnQgZHluYW1pYyBgbmFtZVBhdGhgLiBQbGVhc2UgcHJvdmlkZSBzdGF0aWMgaW5zdGVhZC4nKTtcbn0gOiBmdW5jdGlvbiAoKSB7fTtcblxuLy8gLS0tLS0tLSBzZWxlY3RvciB0eXBlIC0tLS0tLS1cblxuLy8gLS0tLS0tLSBzZWxlY3RvciB0eXBlIGVuZCAtLS0tLS0tXG5cbmZ1bmN0aW9uIHVzZVdhdGNoKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG4gIHZhciBkZXBlbmRlbmNpZXMgPSBhcmdzWzBdLFxuICAgIF9hcmdzJCA9IGFyZ3NbMV0sXG4gICAgX2Zvcm0gPSBfYXJncyQgPT09IHZvaWQgMCA/IHt9IDogX2FyZ3MkO1xuICB2YXIgb3B0aW9ucyA9IGlzRm9ybUluc3RhbmNlKF9mb3JtKSA/IHtcbiAgICBmb3JtOiBfZm9ybVxuICB9IDogX2Zvcm07XG4gIHZhciBmb3JtID0gb3B0aW9ucy5mb3JtO1xuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUoKSxcbiAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICB2YWx1ZSA9IF91c2VTdGF0ZTJbMF0sXG4gICAgc2V0VmFsdWUgPSBfdXNlU3RhdGUyWzFdO1xuICB2YXIgdmFsdWVTdHIgPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gc3RyaW5naWZ5KHZhbHVlKTtcbiAgfSwgW3ZhbHVlXSk7XG4gIHZhciB2YWx1ZVN0clJlZiA9IHVzZVJlZih2YWx1ZVN0cik7XG4gIHZhbHVlU3RyUmVmLmN1cnJlbnQgPSB2YWx1ZVN0cjtcbiAgdmFyIGZpZWxkQ29udGV4dCA9IHVzZUNvbnRleHQoRmllbGRDb250ZXh0KTtcbiAgdmFyIGZvcm1JbnN0YW5jZSA9IGZvcm0gfHwgZmllbGRDb250ZXh0O1xuICB2YXIgaXNWYWxpZEZvcm0gPSBmb3JtSW5zdGFuY2UgJiYgZm9ybUluc3RhbmNlLl9pbml0O1xuXG4gIC8vIFdhcm5pbmcgaWYgbm90IGV4aXN0IGZvcm0gaW5zdGFuY2VcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB3YXJuaW5nKGFyZ3MubGVuZ3RoID09PSAyID8gZm9ybSA/IGlzVmFsaWRGb3JtIDogdHJ1ZSA6IGlzVmFsaWRGb3JtLCAndXNlV2F0Y2ggcmVxdWlyZXMgYSBmb3JtIGluc3RhbmNlIHNpbmNlIGl0IGNhbiBub3QgYXV0byBkZXRlY3QgZnJvbSBjb250ZXh0LicpO1xuICB9XG4gIHZhciBuYW1lUGF0aCA9IGdldE5hbWVQYXRoKGRlcGVuZGVuY2llcyk7XG4gIHZhciBuYW1lUGF0aFJlZiA9IHVzZVJlZihuYW1lUGF0aCk7XG4gIG5hbWVQYXRoUmVmLmN1cnJlbnQgPSBuYW1lUGF0aDtcbiAgdXNlV2F0Y2hXYXJuaW5nKG5hbWVQYXRoKTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAvLyBTa2lwIGlmIG5vdCBleGlzdCBmb3JtIGluc3RhbmNlXG4gICAgaWYgKCFpc1ZhbGlkRm9ybSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgZ2V0RmllbGRzVmFsdWUgPSBmb3JtSW5zdGFuY2UuZ2V0RmllbGRzVmFsdWUsXG4gICAgICBnZXRJbnRlcm5hbEhvb2tzID0gZm9ybUluc3RhbmNlLmdldEludGVybmFsSG9va3M7XG4gICAgdmFyIF9nZXRJbnRlcm5hbEhvb2tzID0gZ2V0SW50ZXJuYWxIb29rcyhIT09LX01BUkspLFxuICAgICAgcmVnaXN0ZXJXYXRjaCA9IF9nZXRJbnRlcm5hbEhvb2tzLnJlZ2lzdGVyV2F0Y2g7XG4gICAgdmFyIGdldFdhdGNoVmFsdWUgPSBmdW5jdGlvbiBnZXRXYXRjaFZhbHVlKHZhbHVlcywgYWxsVmFsdWVzKSB7XG4gICAgICB2YXIgd2F0Y2hWYWx1ZSA9IG9wdGlvbnMucHJlc2VydmUgPyBhbGxWYWx1ZXMgOiB2YWx1ZXM7XG4gICAgICByZXR1cm4gdHlwZW9mIGRlcGVuZGVuY2llcyA9PT0gJ2Z1bmN0aW9uJyA/IGRlcGVuZGVuY2llcyh3YXRjaFZhbHVlKSA6IGdldFZhbHVlKHdhdGNoVmFsdWUsIG5hbWVQYXRoUmVmLmN1cnJlbnQpO1xuICAgIH07XG4gICAgdmFyIGNhbmNlbFJlZ2lzdGVyID0gcmVnaXN0ZXJXYXRjaChmdW5jdGlvbiAodmFsdWVzLCBhbGxWYWx1ZXMpIHtcbiAgICAgIHZhciBuZXdWYWx1ZSA9IGdldFdhdGNoVmFsdWUodmFsdWVzLCBhbGxWYWx1ZXMpO1xuICAgICAgdmFyIG5leHRWYWx1ZVN0ciA9IHN0cmluZ2lmeShuZXdWYWx1ZSk7XG5cbiAgICAgIC8vIENvbXBhcmUgc3RyaW5naWZ5IGluIGNhc2UgaXQncyBuZXN0IG9iamVjdFxuICAgICAgaWYgKHZhbHVlU3RyUmVmLmN1cnJlbnQgIT09IG5leHRWYWx1ZVN0cikge1xuICAgICAgICB2YWx1ZVN0clJlZi5jdXJyZW50ID0gbmV4dFZhbHVlU3RyO1xuICAgICAgICBzZXRWYWx1ZShuZXdWYWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBUT0RPOiBXZSBjYW4gaW1wcm92ZSB0aGlzIHBlcmYgaW4gZnV0dXJlXG4gICAgdmFyIGluaXRpYWxWYWx1ZSA9IGdldFdhdGNoVmFsdWUoZ2V0RmllbGRzVmFsdWUoKSwgZ2V0RmllbGRzVmFsdWUodHJ1ZSkpO1xuXG4gICAgLy8gUmVhY3QgMTggaGFzIHRoZSBidWcgdGhhdCB3aWxsIHF1ZXVlIHVwZGF0ZSB0d2ljZSBldmVuIHRoZSB2YWx1ZSBpcyBub3QgY2hhbmdlZFxuICAgIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8yNzIxM1xuICAgIGlmICh2YWx1ZSAhPT0gaW5pdGlhbFZhbHVlKSB7XG4gICAgICBzZXRWYWx1ZShpbml0aWFsVmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gY2FuY2VsUmVnaXN0ZXI7XG4gIH0sXG4gIC8vIFdlIGRvIG5vdCBuZWVkIHJlLXJlZ2lzdGVyIHNpbmNlIG5hbWVQYXRoIGNvbnRlbnQgaXMgdGhlIHNhbWVcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICBbaXNWYWxpZEZvcm1dKTtcbiAgcmV0dXJuIHZhbHVlO1xufVxuZXhwb3J0IGRlZmF1bHQgdXNlV2F0Y2g7IiwgImltcG9ydCB7IHVuaXQgfSBmcm9tICdAYW50LWRlc2lnbi9jc3NpbmpzJztcbmltcG9ydCB7IGdlblN0eWxlSG9va3MsIG1lcmdlVG9rZW4gfSBmcm9tICcuLi8uLi90aGVtZS9pbnRlcm5hbCc7XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUm93LVNoYXJlZCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmNvbnN0IGdlbkdyaWRSb3dTdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENsc1xuICB9ID0gdG9rZW47XG4gIHJldHVybiB7XG4gICAgLy8gR3JpZCBzeXN0ZW1cbiAgICBbY29tcG9uZW50Q2xzXToge1xuICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgZmxleEZsb3c6ICdyb3cgd3JhcCcsXG4gICAgICBtaW5XaWR0aDogMCxcbiAgICAgICcmOjpiZWZvcmUsICY6OmFmdGVyJzoge1xuICAgICAgICBkaXNwbGF5OiAnZmxleCdcbiAgICAgIH0sXG4gICAgICAnJi1uby13cmFwJzoge1xuICAgICAgICBmbGV4V3JhcDogJ25vd3JhcCdcbiAgICAgIH0sXG4gICAgICAvLyBUaGUgb3JpZ2luIG9mIHRoZSBYLWF4aXNcbiAgICAgICcmLXN0YXJ0Jzoge1xuICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2ZsZXgtc3RhcnQnXG4gICAgICB9LFxuICAgICAgLy8gVGhlIGNlbnRlciBvZiB0aGUgWC1heGlzXG4gICAgICAnJi1jZW50ZXInOiB7XG4gICAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJ1xuICAgICAgfSxcbiAgICAgIC8vIFRoZSBvcHBvc2l0ZSBvZiB0aGUgWC1heGlzXG4gICAgICAnJi1lbmQnOiB7XG4gICAgICAgIGp1c3RpZnlDb250ZW50OiAnZmxleC1lbmQnXG4gICAgICB9LFxuICAgICAgJyYtc3BhY2UtYmV0d2Vlbic6IHtcbiAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdzcGFjZS1iZXR3ZWVuJ1xuICAgICAgfSxcbiAgICAgICcmLXNwYWNlLWFyb3VuZCc6IHtcbiAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdzcGFjZS1hcm91bmQnXG4gICAgICB9LFxuICAgICAgJyYtc3BhY2UtZXZlbmx5Jzoge1xuICAgICAgICBqdXN0aWZ5Q29udGVudDogJ3NwYWNlLWV2ZW5seSdcbiAgICAgIH0sXG4gICAgICAvLyBBbGlnbiBhdCB0aGUgdG9wXG4gICAgICAnJi10b3AnOiB7XG4gICAgICAgIGFsaWduSXRlbXM6ICdmbGV4LXN0YXJ0J1xuICAgICAgfSxcbiAgICAgIC8vIEFsaWduIGF0IHRoZSBjZW50ZXJcbiAgICAgICcmLW1pZGRsZSc6IHtcbiAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcidcbiAgICAgIH0sXG4gICAgICAnJi1ib3R0b20nOiB7XG4gICAgICAgIGFsaWduSXRlbXM6ICdmbGV4LWVuZCdcbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IENvbC1TaGFyZWQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5jb25zdCBnZW5HcmlkQ29sU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHNcbiAgfSA9IHRva2VuO1xuICByZXR1cm4ge1xuICAgIC8vIEdyaWQgc3lzdGVtXG4gICAgW2NvbXBvbmVudENsc106IHtcbiAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgbWF4V2lkdGg6ICcxMDAlJyxcbiAgICAgIC8vIFByZXZlbnQgY29sdW1ucyBmcm9tIGNvbGxhcHNpbmcgd2hlbiBlbXB0eVxuICAgICAgbWluSGVpZ2h0OiAxXG4gICAgfVxuICB9O1xufTtcbmNvbnN0IGdlbkxvb3BHcmlkQ29sdW1uc1N0eWxlID0gKHRva2VuLCBzaXplQ2xzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBwcmVmaXhDbHMsXG4gICAgY29tcG9uZW50Q2xzLFxuICAgIGdyaWRDb2x1bW5zXG4gIH0gPSB0b2tlbjtcbiAgY29uc3QgZ3JpZENvbHVtbnNTdHlsZSA9IHt9O1xuICBmb3IgKGxldCBpID0gZ3JpZENvbHVtbnM7IGkgPj0gMDsgaS0tKSB7XG4gICAgaWYgKGkgPT09IDApIHtcbiAgICAgIGdyaWRDb2x1bW5zU3R5bGVbYCR7Y29tcG9uZW50Q2xzfSR7c2l6ZUNsc30tJHtpfWBdID0ge1xuICAgICAgICBkaXNwbGF5OiAnbm9uZSdcbiAgICAgIH07XG4gICAgICBncmlkQ29sdW1uc1N0eWxlW2Ake2NvbXBvbmVudENsc30tcHVzaC0ke2l9YF0gPSB7XG4gICAgICAgIGluc2V0SW5saW5lU3RhcnQ6ICdhdXRvJ1xuICAgICAgfTtcbiAgICAgIGdyaWRDb2x1bW5zU3R5bGVbYCR7Y29tcG9uZW50Q2xzfS1wdWxsLSR7aX1gXSA9IHtcbiAgICAgICAgaW5zZXRJbmxpbmVFbmQ6ICdhdXRvJ1xuICAgICAgfTtcbiAgICAgIGdyaWRDb2x1bW5zU3R5bGVbYCR7Y29tcG9uZW50Q2xzfSR7c2l6ZUNsc30tcHVzaC0ke2l9YF0gPSB7XG4gICAgICAgIGluc2V0SW5saW5lU3RhcnQ6ICdhdXRvJ1xuICAgICAgfTtcbiAgICAgIGdyaWRDb2x1bW5zU3R5bGVbYCR7Y29tcG9uZW50Q2xzfSR7c2l6ZUNsc30tcHVsbC0ke2l9YF0gPSB7XG4gICAgICAgIGluc2V0SW5saW5lRW5kOiAnYXV0bydcbiAgICAgIH07XG4gICAgICBncmlkQ29sdW1uc1N0eWxlW2Ake2NvbXBvbmVudENsc30ke3NpemVDbHN9LW9mZnNldC0ke2l9YF0gPSB7XG4gICAgICAgIG1hcmdpbklubGluZVN0YXJ0OiAwXG4gICAgICB9O1xuICAgICAgZ3JpZENvbHVtbnNTdHlsZVtgJHtjb21wb25lbnRDbHN9JHtzaXplQ2xzfS1vcmRlci0ke2l9YF0gPSB7XG4gICAgICAgIG9yZGVyOiAwXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBncmlkQ29sdW1uc1N0eWxlW2Ake2NvbXBvbmVudENsc30ke3NpemVDbHN9LSR7aX1gXSA9IFtcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzQ0NDU2XG4gICAgICAvLyBGb3JtIHNldCBgZGlzcGxheTogZmxleGAgb24gQ29sIHdoaWNoIHdpbGwgb3ZlcnJpZGUgYGRpc3BsYXk6IGJsb2NrYC5cbiAgICAgIC8vIExldCdzIGdldCBpdCBmcm9tIGNzcyB2YXJpYWJsZSB0byBzdXBwb3J0IG92ZXJyaWRlLlxuICAgICAge1xuICAgICAgICBbJy0tYW50LWRpc3BsYXknXTogJ2Jsb2NrJyxcbiAgICAgICAgLy8gRmFsbGJhY2sgdG8gZGlzcGxheSBpZiB2YXJpYWJsZSBub3Qgc3VwcG9ydFxuICAgICAgICBkaXNwbGF5OiAnYmxvY2snXG4gICAgICB9LCB7XG4gICAgICAgIGRpc3BsYXk6ICd2YXIoLS1hbnQtZGlzcGxheSknLFxuICAgICAgICBmbGV4OiBgMCAwICR7aSAvIGdyaWRDb2x1bW5zICogMTAwfSVgLFxuICAgICAgICBtYXhXaWR0aDogYCR7aSAvIGdyaWRDb2x1bW5zICogMTAwfSVgXG4gICAgICB9XTtcbiAgICAgIGdyaWRDb2x1bW5zU3R5bGVbYCR7Y29tcG9uZW50Q2xzfSR7c2l6ZUNsc30tcHVzaC0ke2l9YF0gPSB7XG4gICAgICAgIGluc2V0SW5saW5lU3RhcnQ6IGAke2kgLyBncmlkQ29sdW1ucyAqIDEwMH0lYFxuICAgICAgfTtcbiAgICAgIGdyaWRDb2x1bW5zU3R5bGVbYCR7Y29tcG9uZW50Q2xzfSR7c2l6ZUNsc30tcHVsbC0ke2l9YF0gPSB7XG4gICAgICAgIGluc2V0SW5saW5lRW5kOiBgJHtpIC8gZ3JpZENvbHVtbnMgKiAxMDB9JWBcbiAgICAgIH07XG4gICAgICBncmlkQ29sdW1uc1N0eWxlW2Ake2NvbXBvbmVudENsc30ke3NpemVDbHN9LW9mZnNldC0ke2l9YF0gPSB7XG4gICAgICAgIG1hcmdpbklubGluZVN0YXJ0OiBgJHtpIC8gZ3JpZENvbHVtbnMgKiAxMDB9JWBcbiAgICAgIH07XG4gICAgICBncmlkQ29sdW1uc1N0eWxlW2Ake2NvbXBvbmVudENsc30ke3NpemVDbHN9LW9yZGVyLSR7aX1gXSA9IHtcbiAgICAgICAgb3JkZXI6IGlcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIC8vIEZsZXggQ1NTIFZhclxuICBncmlkQ29sdW1uc1N0eWxlW2Ake2NvbXBvbmVudENsc30ke3NpemVDbHN9LWZsZXhgXSA9IHtcbiAgICBmbGV4OiBgdmFyKC0tJHtwcmVmaXhDbHN9JHtzaXplQ2xzfS1mbGV4KWBcbiAgfTtcbiAgcmV0dXJuIGdyaWRDb2x1bW5zU3R5bGU7XG59O1xuY29uc3QgZ2VuR3JpZFN0eWxlID0gKHRva2VuLCBzaXplQ2xzKSA9PiBnZW5Mb29wR3JpZENvbHVtbnNTdHlsZSh0b2tlbiwgc2l6ZUNscyk7XG5jb25zdCBnZW5HcmlkTWVkaWFTdHlsZSA9ICh0b2tlbiwgc2NyZWVuU2l6ZSwgc2l6ZUNscykgPT4gKHtcbiAgW2BAbWVkaWEgKG1pbi13aWR0aDogJHt1bml0KHNjcmVlblNpemUpfSlgXTogT2JqZWN0LmFzc2lnbih7fSwgZ2VuR3JpZFN0eWxlKHRva2VuLCBzaXplQ2xzKSlcbn0pO1xuZXhwb3J0IGNvbnN0IHByZXBhcmVSb3dDb21wb25lbnRUb2tlbiA9ICgpID0+ICh7fSk7XG5leHBvcnQgY29uc3QgcHJlcGFyZUNvbENvbXBvbmVudFRva2VuID0gKCkgPT4gKHt9KTtcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFeHBvcnQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgY29uc3QgdXNlUm93U3R5bGUgPSBnZW5TdHlsZUhvb2tzKCdHcmlkJywgZ2VuR3JpZFJvd1N0eWxlLCBwcmVwYXJlUm93Q29tcG9uZW50VG9rZW4pO1xuZXhwb3J0IGNvbnN0IGdldE1lZGlhU2l6ZSA9IHRva2VuID0+IHtcbiAgY29uc3QgbWVkaWFTaXplc01hcCA9IHtcbiAgICB4czogdG9rZW4uc2NyZWVuWFNNaW4sXG4gICAgc206IHRva2VuLnNjcmVlblNNTWluLFxuICAgIG1kOiB0b2tlbi5zY3JlZW5NRE1pbixcbiAgICBsZzogdG9rZW4uc2NyZWVuTEdNaW4sXG4gICAgeGw6IHRva2VuLnNjcmVlblhMTWluLFxuICAgIHh4bDogdG9rZW4uc2NyZWVuWFhMTWluXG4gIH07XG4gIHJldHVybiBtZWRpYVNpemVzTWFwO1xufTtcbmV4cG9ydCBjb25zdCB1c2VDb2xTdHlsZSA9IGdlblN0eWxlSG9va3MoJ0dyaWQnLCB0b2tlbiA9PiB7XG4gIGNvbnN0IGdyaWRUb2tlbiA9IG1lcmdlVG9rZW4odG9rZW4sIHtcbiAgICBncmlkQ29sdW1uczogMjQgLy8gUm93IGlzIGRpdmlkZWQgaW50byAyNCBwYXJ0cyBpbiBHcmlkXG4gIH0pO1xuICBjb25zdCBncmlkTWVkaWFTaXplc01hcCA9IGdldE1lZGlhU2l6ZShncmlkVG9rZW4pO1xuICBkZWxldGUgZ3JpZE1lZGlhU2l6ZXNNYXAueHM7XG4gIHJldHVybiBbZ2VuR3JpZENvbFN0eWxlKGdyaWRUb2tlbiksIGdlbkdyaWRTdHlsZShncmlkVG9rZW4sICcnKSwgZ2VuR3JpZFN0eWxlKGdyaWRUb2tlbiwgJy14cycpLCBPYmplY3Qua2V5cyhncmlkTWVkaWFTaXplc01hcCkubWFwKGtleSA9PiBnZW5HcmlkTWVkaWFTdHlsZShncmlkVG9rZW4sIGdyaWRNZWRpYVNpemVzTWFwW2tleV0sIGAtJHtrZXl9YCkpLnJlZHVjZSgocHJlLCBjdXIpID0+IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJlKSwgY3VyKSwge30pXTtcbn0sIHByZXBhcmVDb2xDb21wb25lbnRUb2tlbik7IiwgImltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgeyB1bml0IH0gZnJvbSAnQGFudC1kZXNpZ24vY3NzaW5qcyc7XG5pbXBvcnQgeyBnZXRNZWRpYVNpemUgfSBmcm9tICcuLi8uLi9ncmlkL3N0eWxlJztcbmltcG9ydCB7IGdlbkZvY3VzU3R5bGUsIHJlc2V0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc3R5bGUnO1xuaW1wb3J0IHsgaW5pdEZhZGVNb3Rpb24sIGluaXRab29tTW90aW9uIH0gZnJvbSAnLi4vLi4vc3R5bGUvbW90aW9uJztcbmltcG9ydCB7IGdlblN0eWxlSG9va3MsIG1lcmdlVG9rZW4gfSBmcm9tICcuLi8uLi90aGVtZS9pbnRlcm5hbCc7XG5mdW5jdGlvbiBib3gocG9zaXRpb24pIHtcbiAgcmV0dXJuIHtcbiAgICBwb3NpdGlvbixcbiAgICBpbnNldDogMFxuICB9O1xufVxuZXhwb3J0IGNvbnN0IGdlbk1vZGFsTWFza1N0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzLFxuICAgIGFudENsc1xuICB9ID0gdG9rZW47XG4gIHJldHVybiBbe1xuICAgIFtgJHtjb21wb25lbnRDbHN9LXJvb3RgXToge1xuICAgICAgW2Ake2NvbXBvbmVudENsc30ke2FudENsc30tem9vbS1lbnRlciwgJHtjb21wb25lbnRDbHN9JHthbnRDbHN9LXpvb20tYXBwZWFyYF06IHtcbiAgICAgICAgLy8gcmVzZXQgc2NhbGUgYXZvaWQgbW91c2VQb3NpdGlvbiBidWdcbiAgICAgICAgdHJhbnNmb3JtOiAnbm9uZScsXG4gICAgICAgIG9wYWNpdHk6IDAsXG4gICAgICAgIGFuaW1hdGlvbkR1cmF0aW9uOiB0b2tlbi5tb3Rpb25EdXJhdGlvblNsb3csXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzExNzc3XG4gICAgICAgIHVzZXJTZWxlY3Q6ICdub25lJ1xuICAgICAgfSxcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzM3MzI5XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy80MDI3MlxuICAgICAgW2Ake2NvbXBvbmVudENsc30ke2FudENsc30tem9vbS1sZWF2ZSAke2NvbXBvbmVudENsc30tY29udGVudGBdOiB7XG4gICAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJ1xuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LW1hc2tgXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBib3goJ2ZpeGVkJykpLCB7XG4gICAgICAgIHpJbmRleDogdG9rZW4uekluZGV4UG9wdXBCYXNlLFxuICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0b2tlbi5jb2xvckJnTWFzayxcbiAgICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1oaWRkZW5gXToge1xuICAgICAgICAgIGRpc3BsYXk6ICdub25lJ1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LXdyYXBgXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBib3goJ2ZpeGVkJykpLCB7XG4gICAgICAgIHpJbmRleDogdG9rZW4uekluZGV4UG9wdXBCYXNlLFxuICAgICAgICBvdmVyZmxvdzogJ2F1dG8nLFxuICAgICAgICBvdXRsaW5lOiAwLFxuICAgICAgICBXZWJraXRPdmVyZmxvd1Njcm9sbGluZzogJ3RvdWNoJ1xuICAgICAgfSlcbiAgICB9XG4gIH0sIHtcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS1yb290YF06IGluaXRGYWRlTW90aW9uKHRva2VuKVxuICB9XTtcbn07XG5jb25zdCBnZW5Nb2RhbFN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzXG4gIH0gPSB0b2tlbjtcbiAgcmV0dXJuIFtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IFJvb3QgPT09PT09PT09PT09PT09PT09PT09PT09PVxuICB7XG4gICAgW2Ake2NvbXBvbmVudENsc30tcm9vdGBdOiB7XG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS13cmFwLXJ0bGBdOiB7XG4gICAgICAgIGRpcmVjdGlvbjogJ3J0bCdcbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1jZW50ZXJlZGBdOiB7XG4gICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAgICcmOjpiZWZvcmUnOiB7XG4gICAgICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgICAgdmVydGljYWxBbGlnbjogJ21pZGRsZScsXG4gICAgICAgICAgY29udGVudDogJ1wiXCInXG4gICAgICAgIH0sXG4gICAgICAgIFtjb21wb25lbnRDbHNdOiB7XG4gICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgICAgIHBhZGRpbmdCb3R0b206IDAsXG4gICAgICAgICAgdGV4dEFsaWduOiAnc3RhcnQnLFxuICAgICAgICAgIHZlcnRpY2FsQWxpZ246ICdtaWRkbGUnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbYEBtZWRpYSAobWF4LXdpZHRoOiAke3Rva2VuLnNjcmVlblNNTWF4fXB4KWBdOiB7XG4gICAgICAgIFtjb21wb25lbnRDbHNdOiB7XG4gICAgICAgICAgbWF4V2lkdGg6ICdjYWxjKDEwMHZ3IC0gMTZweCknLFxuICAgICAgICAgIG1hcmdpbjogYCR7dW5pdCh0b2tlbi5tYXJnaW5YUyl9IGF1dG9gXG4gICAgICAgIH0sXG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LWNlbnRlcmVkYF06IHtcbiAgICAgICAgICBbY29tcG9uZW50Q2xzXToge1xuICAgICAgICAgICAgZmxleDogMVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IE1vZGFsID09PT09PT09PT09PT09PT09PT09PT09PVxuICB7XG4gICAgW2NvbXBvbmVudENsc106IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVzZXRDb21wb25lbnQodG9rZW4pKSwge1xuICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICB0b3A6IDEwMCxcbiAgICAgIHdpZHRoOiAnYXV0bycsXG4gICAgICBtYXhXaWR0aDogYGNhbGMoMTAwdncgLSAke3VuaXQodG9rZW4uY2FsYyh0b2tlbi5tYXJnaW4pLm11bCgyKS5lcXVhbCgpKX0pYCxcbiAgICAgIG1hcmdpbjogJzAgYXV0bycsXG4gICAgICBwYWRkaW5nQm90dG9tOiB0b2tlbi5wYWRkaW5nTEcsXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS10aXRsZWBdOiB7XG4gICAgICAgIG1hcmdpbjogMCxcbiAgICAgICAgY29sb3I6IHRva2VuLnRpdGxlQ29sb3IsXG4gICAgICAgIGZvbnRXZWlnaHQ6IHRva2VuLmZvbnRXZWlnaHRTdHJvbmcsXG4gICAgICAgIGZvbnRTaXplOiB0b2tlbi50aXRsZUZvbnRTaXplLFxuICAgICAgICBsaW5lSGVpZ2h0OiB0b2tlbi50aXRsZUxpbmVIZWlnaHQsXG4gICAgICAgIHdvcmRXcmFwOiAnYnJlYWstd29yZCdcbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1jb250ZW50YF06IHtcbiAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogdG9rZW4uY29udGVudEJnLFxuICAgICAgICBiYWNrZ3JvdW5kQ2xpcDogJ3BhZGRpbmctYm94JyxcbiAgICAgICAgYm9yZGVyOiAwLFxuICAgICAgICBib3JkZXJSYWRpdXM6IHRva2VuLmJvcmRlclJhZGl1c0xHLFxuICAgICAgICBib3hTaGFkb3c6IHRva2VuLmJveFNoYWRvdyxcbiAgICAgICAgcG9pbnRlckV2ZW50czogJ2F1dG8nLFxuICAgICAgICBwYWRkaW5nOiB0b2tlbi5jb250ZW50UGFkZGluZ1xuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWNsb3NlYF06IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgdG9wOiB0b2tlbi5jYWxjKHRva2VuLm1vZGFsSGVhZGVySGVpZ2h0KS5zdWIodG9rZW4ubW9kYWxDbG9zZUJ0blNpemUpLmRpdigyKS5lcXVhbCgpLFxuICAgICAgICBpbnNldElubGluZUVuZDogdG9rZW4uY2FsYyh0b2tlbi5tb2RhbEhlYWRlckhlaWdodCkuc3ViKHRva2VuLm1vZGFsQ2xvc2VCdG5TaXplKS5kaXYoMikuZXF1YWwoKSxcbiAgICAgICAgekluZGV4OiB0b2tlbi5jYWxjKHRva2VuLnpJbmRleFBvcHVwQmFzZSkuYWRkKDEwKS5lcXVhbCgpLFxuICAgICAgICBwYWRkaW5nOiAwLFxuICAgICAgICBjb2xvcjogdG9rZW4ubW9kYWxDbG9zZUljb25Db2xvcixcbiAgICAgICAgZm9udFdlaWdodDogdG9rZW4uZm9udFdlaWdodFN0cm9uZyxcbiAgICAgICAgbGluZUhlaWdodDogMSxcbiAgICAgICAgdGV4dERlY29yYXRpb246ICdub25lJyxcbiAgICAgICAgYmFja2dyb3VuZDogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiB0b2tlbi5ib3JkZXJSYWRpdXNTTSxcbiAgICAgICAgd2lkdGg6IHRva2VuLm1vZGFsQ2xvc2VCdG5TaXplLFxuICAgICAgICBoZWlnaHQ6IHRva2VuLm1vZGFsQ2xvc2VCdG5TaXplLFxuICAgICAgICBib3JkZXI6IDAsXG4gICAgICAgIG91dGxpbmU6IDAsXG4gICAgICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgICAgICB0cmFuc2l0aW9uOiBgY29sb3IgJHt0b2tlbi5tb3Rpb25EdXJhdGlvbk1pZH0sIGJhY2tncm91bmQtY29sb3IgJHt0b2tlbi5tb3Rpb25EdXJhdGlvbk1pZH1gLFxuICAgICAgICAnJi14Jzoge1xuICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgICBmb250U2l6ZTogdG9rZW4uZm9udFNpemVMRyxcbiAgICAgICAgICBmb250U3R5bGU6ICdub3JtYWwnLFxuICAgICAgICAgIGxpbmVIZWlnaHQ6IHVuaXQodG9rZW4ubW9kYWxDbG9zZUJ0blNpemUpLFxuICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJyxcbiAgICAgICAgICB0ZXh0VHJhbnNmb3JtOiAnbm9uZScsXG4gICAgICAgICAgdGV4dFJlbmRlcmluZzogJ2F1dG8nXG4gICAgICAgIH0sXG4gICAgICAgICcmOmRpc2FibGVkJzoge1xuICAgICAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJ1xuICAgICAgICB9LFxuICAgICAgICAnJjpob3Zlcic6IHtcbiAgICAgICAgICBjb2xvcjogdG9rZW4ubW9kYWxDbG9zZUljb25Ib3ZlckNvbG9yLFxuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdG9rZW4uY29sb3JCZ1RleHRIb3ZlcixcbiAgICAgICAgICB0ZXh0RGVjb3JhdGlvbjogJ25vbmUnXG4gICAgICAgIH0sXG4gICAgICAgICcmOmFjdGl2ZSc6IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRva2VuLmNvbG9yQmdUZXh0QWN0aXZlXG4gICAgICAgIH1cbiAgICAgIH0sIGdlbkZvY3VzU3R5bGUodG9rZW4pKSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWhlYWRlcmBdOiB7XG4gICAgICAgIGNvbG9yOiB0b2tlbi5jb2xvclRleHQsXG4gICAgICAgIGJhY2tncm91bmQ6IHRva2VuLmhlYWRlckJnLFxuICAgICAgICBib3JkZXJSYWRpdXM6IGAke3VuaXQodG9rZW4uYm9yZGVyUmFkaXVzTEcpfSAke3VuaXQodG9rZW4uYm9yZGVyUmFkaXVzTEcpfSAwIDBgLFxuICAgICAgICBtYXJnaW5Cb3R0b206IHRva2VuLmhlYWRlck1hcmdpbkJvdHRvbSxcbiAgICAgICAgcGFkZGluZzogdG9rZW4uaGVhZGVyUGFkZGluZyxcbiAgICAgICAgYm9yZGVyQm90dG9tOiB0b2tlbi5oZWFkZXJCb3JkZXJCb3R0b21cbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1ib2R5YF06IHtcbiAgICAgICAgZm9udFNpemU6IHRva2VuLmZvbnRTaXplLFxuICAgICAgICBsaW5lSGVpZ2h0OiB0b2tlbi5saW5lSGVpZ2h0LFxuICAgICAgICB3b3JkV3JhcDogJ2JyZWFrLXdvcmQnLFxuICAgICAgICBwYWRkaW5nOiB0b2tlbi5ib2R5UGFkZGluZyxcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30tYm9keS1za2VsZXRvbmBdOiB7XG4gICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLFxuICAgICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICAgIG1hcmdpbjogYCR7dW5pdCh0b2tlbi5tYXJnaW4pfSBhdXRvYFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tZm9vdGVyYF06IHtcbiAgICAgICAgdGV4dEFsaWduOiAnZW5kJyxcbiAgICAgICAgYmFja2dyb3VuZDogdG9rZW4uZm9vdGVyQmcsXG4gICAgICAgIG1hcmdpblRvcDogdG9rZW4uZm9vdGVyTWFyZ2luVG9wLFxuICAgICAgICBwYWRkaW5nOiB0b2tlbi5mb290ZXJQYWRkaW5nLFxuICAgICAgICBib3JkZXJUb3A6IHRva2VuLmZvb3RlckJvcmRlclRvcCxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiB0b2tlbi5mb290ZXJCb3JkZXJSYWRpdXMsXG4gICAgICAgIFtgPiAke3Rva2VuLmFudENsc30tYnRuICsgJHt0b2tlbi5hbnRDbHN9LWJ0bmBdOiB7XG4gICAgICAgICAgbWFyZ2luSW5saW5lU3RhcnQ6IHRva2VuLm1hcmdpblhTXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1vcGVuYF06IHtcbiAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nXG4gICAgICB9XG4gICAgfSlcbiAgfSxcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IFB1cmUgPT09PT09PT09PT09PT09PT09PT09PT09PVxuICB7XG4gICAgW2Ake2NvbXBvbmVudENsc30tcHVyZS1wYW5lbGBdOiB7XG4gICAgICB0b3A6ICdhdXRvJyxcbiAgICAgIHBhZGRpbmc6IDAsXG4gICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJyxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWNvbnRlbnQsXG4gICAgICAgICAgJHtjb21wb25lbnRDbHN9LWJvZHksXG4gICAgICAgICAgJHtjb21wb25lbnRDbHN9LWNvbmZpcm0tYm9keS13cmFwcGVyYF06IHtcbiAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJyxcbiAgICAgICAgZmxleDogJ2F1dG8nXG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tY29uZmlybS1ib2R5YF06IHtcbiAgICAgICAgbWFyZ2luQm90dG9tOiAnYXV0bydcbiAgICAgIH1cbiAgICB9XG4gIH1dO1xufTtcbmNvbnN0IGdlblJUTFN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzXG4gIH0gPSB0b2tlbjtcbiAgcmV0dXJuIHtcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS1yb290YF06IHtcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LXdyYXAtcnRsYF06IHtcbiAgICAgICAgZGlyZWN0aW9uOiAncnRsJyxcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30tY29uZmlybS1ib2R5YF06IHtcbiAgICAgICAgICBkaXJlY3Rpb246ICdydGwnXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xuY29uc3QgZ2VuUmVzcG9uc2l2ZVdpZHRoU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHNcbiAgfSA9IHRva2VuO1xuICBjb25zdCBncmlkTWVkaWFTaXplc01hcCA9IGdldE1lZGlhU2l6ZSh0b2tlbik7XG4gIGRlbGV0ZSBncmlkTWVkaWFTaXplc01hcC54cztcbiAgY29uc3QgcmVzcG9uc2l2ZVN0eWxlcyA9IE9iamVjdC5rZXlzKGdyaWRNZWRpYVNpemVzTWFwKS5tYXAoa2V5ID0+ICh7XG4gICAgW2BAbWVkaWEgKG1pbi13aWR0aDogJHt1bml0KGdyaWRNZWRpYVNpemVzTWFwW2tleV0pfSlgXToge1xuICAgICAgd2lkdGg6IGB2YXIoLS0ke2NvbXBvbmVudENscy5yZXBsYWNlKCcuJywgJycpfS0ke2tleX0td2lkdGgpYFxuICAgIH1cbiAgfSkpO1xuICByZXR1cm4ge1xuICAgIFtgJHtjb21wb25lbnRDbHN9LXJvb3RgXToge1xuICAgICAgW2NvbXBvbmVudENsc106IFt7XG4gICAgICAgIHdpZHRoOiBgdmFyKC0tJHtjb21wb25lbnRDbHMucmVwbGFjZSgnLicsICcnKX0teHMtd2lkdGgpYFxuICAgICAgfV0uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShyZXNwb25zaXZlU3R5bGVzKSlcbiAgICB9XG4gIH07XG59O1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEV4cG9ydCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmV4cG9ydCBjb25zdCBwcmVwYXJlVG9rZW4gPSB0b2tlbiA9PiB7XG4gIGNvbnN0IGhlYWRlclBhZGRpbmdWZXJ0aWNhbCA9IHRva2VuLnBhZGRpbmc7XG4gIGNvbnN0IGhlYWRlckZvbnRTaXplID0gdG9rZW4uZm9udFNpemVIZWFkaW5nNTtcbiAgY29uc3QgaGVhZGVyTGluZUhlaWdodCA9IHRva2VuLmxpbmVIZWlnaHRIZWFkaW5nNTtcbiAgY29uc3QgbW9kYWxUb2tlbiA9IG1lcmdlVG9rZW4odG9rZW4sIHtcbiAgICBtb2RhbEhlYWRlckhlaWdodDogdG9rZW4uY2FsYyh0b2tlbi5jYWxjKGhlYWRlckxpbmVIZWlnaHQpLm11bChoZWFkZXJGb250U2l6ZSkuZXF1YWwoKSkuYWRkKHRva2VuLmNhbGMoaGVhZGVyUGFkZGluZ1ZlcnRpY2FsKS5tdWwoMikuZXF1YWwoKSkuZXF1YWwoKSxcbiAgICBtb2RhbEZvb3RlckJvcmRlckNvbG9yU3BsaXQ6IHRva2VuLmNvbG9yU3BsaXQsXG4gICAgbW9kYWxGb290ZXJCb3JkZXJTdHlsZTogdG9rZW4ubGluZVR5cGUsXG4gICAgbW9kYWxGb290ZXJCb3JkZXJXaWR0aDogdG9rZW4ubGluZVdpZHRoLFxuICAgIG1vZGFsQ2xvc2VJY29uQ29sb3I6IHRva2VuLmNvbG9ySWNvbixcbiAgICBtb2RhbENsb3NlSWNvbkhvdmVyQ29sb3I6IHRva2VuLmNvbG9ySWNvbkhvdmVyLFxuICAgIG1vZGFsQ2xvc2VCdG5TaXplOiB0b2tlbi5jb250cm9sSGVpZ2h0LFxuICAgIG1vZGFsQ29uZmlybUljb25TaXplOiB0b2tlbi5mb250SGVpZ2h0LFxuICAgIG1vZGFsVGl0bGVIZWlnaHQ6IHRva2VuLmNhbGModG9rZW4udGl0bGVGb250U2l6ZSkubXVsKHRva2VuLnRpdGxlTGluZUhlaWdodCkuZXF1YWwoKVxuICB9KTtcbiAgcmV0dXJuIG1vZGFsVG9rZW47XG59O1xuZXhwb3J0IGNvbnN0IHByZXBhcmVDb21wb25lbnRUb2tlbiA9IHRva2VuID0+ICh7XG4gIGZvb3RlckJnOiAndHJhbnNwYXJlbnQnLFxuICBoZWFkZXJCZzogdG9rZW4uY29sb3JCZ0VsZXZhdGVkLFxuICB0aXRsZUxpbmVIZWlnaHQ6IHRva2VuLmxpbmVIZWlnaHRIZWFkaW5nNSxcbiAgdGl0bGVGb250U2l6ZTogdG9rZW4uZm9udFNpemVIZWFkaW5nNSxcbiAgY29udGVudEJnOiB0b2tlbi5jb2xvckJnRWxldmF0ZWQsXG4gIHRpdGxlQ29sb3I6IHRva2VuLmNvbG9yVGV4dEhlYWRpbmcsXG4gIC8vIGludGVybmFsXG4gIGNvbnRlbnRQYWRkaW5nOiB0b2tlbi53aXJlZnJhbWUgPyAwIDogYCR7dW5pdCh0b2tlbi5wYWRkaW5nTUQpfSAke3VuaXQodG9rZW4ucGFkZGluZ0NvbnRlbnRIb3Jpem9udGFsTEcpfWAsXG4gIGhlYWRlclBhZGRpbmc6IHRva2VuLndpcmVmcmFtZSA/IGAke3VuaXQodG9rZW4ucGFkZGluZyl9ICR7dW5pdCh0b2tlbi5wYWRkaW5nTEcpfWAgOiAwLFxuICBoZWFkZXJCb3JkZXJCb3R0b206IHRva2VuLndpcmVmcmFtZSA/IGAke3VuaXQodG9rZW4ubGluZVdpZHRoKX0gJHt0b2tlbi5saW5lVHlwZX0gJHt0b2tlbi5jb2xvclNwbGl0fWAgOiAnbm9uZScsXG4gIGhlYWRlck1hcmdpbkJvdHRvbTogdG9rZW4ud2lyZWZyYW1lID8gMCA6IHRva2VuLm1hcmdpblhTLFxuICBib2R5UGFkZGluZzogdG9rZW4ud2lyZWZyYW1lID8gdG9rZW4ucGFkZGluZ0xHIDogMCxcbiAgZm9vdGVyUGFkZGluZzogdG9rZW4ud2lyZWZyYW1lID8gYCR7dW5pdCh0b2tlbi5wYWRkaW5nWFMpfSAke3VuaXQodG9rZW4ucGFkZGluZyl9YCA6IDAsXG4gIGZvb3RlckJvcmRlclRvcDogdG9rZW4ud2lyZWZyYW1lID8gYCR7dW5pdCh0b2tlbi5saW5lV2lkdGgpfSAke3Rva2VuLmxpbmVUeXBlfSAke3Rva2VuLmNvbG9yU3BsaXR9YCA6ICdub25lJyxcbiAgZm9vdGVyQm9yZGVyUmFkaXVzOiB0b2tlbi53aXJlZnJhbWUgPyBgMCAwICR7dW5pdCh0b2tlbi5ib3JkZXJSYWRpdXNMRyl9ICR7dW5pdCh0b2tlbi5ib3JkZXJSYWRpdXNMRyl9YCA6IDAsXG4gIGZvb3Rlck1hcmdpblRvcDogdG9rZW4ud2lyZWZyYW1lID8gMCA6IHRva2VuLm1hcmdpblNNLFxuICBjb25maXJtQm9keVBhZGRpbmc6IHRva2VuLndpcmVmcmFtZSA/IGAke3VuaXQodG9rZW4ucGFkZGluZyAqIDIpfSAke3VuaXQodG9rZW4ucGFkZGluZyAqIDIpfSAke3VuaXQodG9rZW4ucGFkZGluZ0xHKX1gIDogMCxcbiAgY29uZmlybUljb25NYXJnaW5JbmxpbmVFbmQ6IHRva2VuLndpcmVmcmFtZSA/IHRva2VuLm1hcmdpbiA6IHRva2VuLm1hcmdpblNNLFxuICBjb25maXJtQnRuc01hcmdpblRvcDogdG9rZW4ud2lyZWZyYW1lID8gdG9rZW4ubWFyZ2luTEcgOiB0b2tlbi5tYXJnaW5TTVxufSk7XG5leHBvcnQgZGVmYXVsdCBnZW5TdHlsZUhvb2tzKCdNb2RhbCcsIHRva2VuID0+IHtcbiAgY29uc3QgbW9kYWxUb2tlbiA9IHByZXBhcmVUb2tlbih0b2tlbik7XG4gIHJldHVybiBbZ2VuTW9kYWxTdHlsZShtb2RhbFRva2VuKSwgZ2VuUlRMU3R5bGUobW9kYWxUb2tlbiksIGdlbk1vZGFsTWFza1N0eWxlKG1vZGFsVG9rZW4pLCBpbml0Wm9vbU1vdGlvbihtb2RhbFRva2VuLCAnem9vbScpLCBnZW5SZXNwb25zaXZlV2lkdGhTdHlsZShtb2RhbFRva2VuKV07XG59LCBwcmVwYXJlQ29tcG9uZW50VG9rZW4sIHtcbiAgdW5pdGxlc3M6IHtcbiAgICB0aXRsZUxpbmVIZWlnaHQ6IHRydWVcbiAgfVxufSk7IiwgIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlTWVyZ2VkU3RhdGUgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlTWVyZ2VkU3RhdGVcIjtcbmltcG9ydCBDb25maWdQcm92aWRlciwgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbmV4cG9ydCBmdW5jdGlvbiB3aXRoUHVyZVJlbmRlclRoZW1lKENvbXBvbmVudCkge1xuICByZXR1cm4gcHJvcHMgPT4gKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbmZpZ1Byb3ZpZGVyLCB7XG4gICAgdGhlbWU6IHtcbiAgICAgIHRva2VuOiB7XG4gICAgICAgIG1vdGlvbjogZmFsc2UsXG4gICAgICAgIHpJbmRleFBvcHVwQmFzZTogMFxuICAgICAgfVxuICAgIH1cbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcykpKSk7XG59XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuY29uc3QgZ2VuUHVyZVBhbmVsID0gKENvbXBvbmVudCwgYWxpZ25Qcm9wTmFtZSwgcG9zdFByb3BzLCBkZWZhdWx0UHJlZml4Q2xzLCBnZXREcm9wZG93bkNscykgPT4ge1xuICBjb25zdCBQdXJlUGFuZWwgPSBwcm9wcyA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgcHJlZml4Q2xzOiBjdXN0b21pemVQcmVmaXhDbHMsXG4gICAgICBzdHlsZVxuICAgIH0gPSBwcm9wcztcbiAgICBjb25zdCBob2xkZXJSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gICAgY29uc3QgW3BvcHVwSGVpZ2h0LCBzZXRQb3B1cEhlaWdodF0gPSBSZWFjdC51c2VTdGF0ZSgwKTtcbiAgICBjb25zdCBbcG9wdXBXaWR0aCwgc2V0UG9wdXBXaWR0aF0gPSBSZWFjdC51c2VTdGF0ZSgwKTtcbiAgICBjb25zdCBbb3Blbiwgc2V0T3Blbl0gPSB1c2VNZXJnZWRTdGF0ZShmYWxzZSwge1xuICAgICAgdmFsdWU6IHByb3BzLm9wZW5cbiAgICB9KTtcbiAgICBjb25zdCB7XG4gICAgICBnZXRQcmVmaXhDbHNcbiAgICB9ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KTtcbiAgICBjb25zdCBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoZGVmYXVsdFByZWZpeENscyB8fCAnc2VsZWN0JywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgLy8gV2UgZG8gbm90IGNhcmUgYWJvdXQgc3NyXG4gICAgICBzZXRPcGVuKHRydWUpO1xuICAgICAgaWYgKHR5cGVvZiBSZXNpemVPYnNlcnZlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoZW50cmllcyA9PiB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudCA9IGVudHJpZXNbMF0udGFyZ2V0O1xuICAgICAgICAgIHNldFBvcHVwSGVpZ2h0KGVsZW1lbnQub2Zmc2V0SGVpZ2h0ICsgOCk7XG4gICAgICAgICAgc2V0UG9wdXBXaWR0aChlbGVtZW50Lm9mZnNldFdpZHRoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICBjb25zdCBkcm9wZG93bkNscyA9IGdldERyb3Bkb3duQ2xzID8gYC4ke2dldERyb3Bkb3duQ2xzKHByZWZpeENscyl9YCA6IGAuJHtwcmVmaXhDbHN9LWRyb3Bkb3duYDtcbiAgICAgICAgICBjb25zdCBwb3B1cCA9IChfYSA9IGhvbGRlclJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucXVlcnlTZWxlY3Rvcihkcm9wZG93bkNscyk7XG4gICAgICAgICAgaWYgKHBvcHVwKSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsKTtcbiAgICAgICAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUocG9wdXApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgMTApO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICAgIHJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9LCBbXSk7XG4gICAgbGV0IG1lcmdlZFByb3BzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcm9wcyksIHtcbiAgICAgIHN0eWxlOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0eWxlKSwge1xuICAgICAgICBtYXJnaW46IDBcbiAgICAgIH0pLFxuICAgICAgb3BlbixcbiAgICAgIHZpc2libGU6IG9wZW4sXG4gICAgICBnZXRQb3B1cENvbnRhaW5lcjogKCkgPT4gaG9sZGVyUmVmLmN1cnJlbnRcbiAgICB9KTtcbiAgICBpZiAocG9zdFByb3BzKSB7XG4gICAgICBtZXJnZWRQcm9wcyA9IHBvc3RQcm9wcyhtZXJnZWRQcm9wcyk7XG4gICAgfVxuICAgIGlmIChhbGlnblByb3BOYW1lKSB7XG4gICAgICBPYmplY3QuYXNzaWduKG1lcmdlZFByb3BzLCB7XG4gICAgICAgIFthbGlnblByb3BOYW1lXToge1xuICAgICAgICAgIG92ZXJmbG93OiB7XG4gICAgICAgICAgICBhZGp1c3RYOiBmYWxzZSxcbiAgICAgICAgICAgIGFkanVzdFk6IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgbWVyZ2VkU3R5bGUgPSB7XG4gICAgICBwYWRkaW5nQm90dG9tOiBwb3B1cEhlaWdodCxcbiAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgbWluV2lkdGg6IHBvcHVwV2lkdGhcbiAgICB9O1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICByZWY6IGhvbGRlclJlZixcbiAgICAgIHN0eWxlOiBtZXJnZWRTdHlsZVxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgT2JqZWN0LmFzc2lnbih7fSwgbWVyZ2VkUHJvcHMpKSk7XG4gIH07XG4gIHJldHVybiB3aXRoUHVyZVJlbmRlclRoZW1lKFB1cmVQYW5lbCk7XG59O1xuZXhwb3J0IGRlZmF1bHQgZ2VuUHVyZVBhbmVsOyIsICJcInVzZSBjbGllbnRcIjtcblxudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbi8vIFRPRE86IDQuMCAtIGNvZGVtb2Qgc2hvdWxkIGhlbHAgdG8gY2hhbmdlIGBmaWx0ZXJPcHRpb25gIHRvIHN1cHBvcnQgbm9kZSBwcm9wcy5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFJjU2VsZWN0LCB7IE9wdEdyb3VwLCBPcHRpb24gfSBmcm9tICdyYy1zZWxlY3QnO1xuaW1wb3J0IG9taXQgZnJvbSBcInJjLXV0aWwvZXMvb21pdFwiO1xuaW1wb3J0IHsgdXNlWkluZGV4IH0gZnJvbSAnLi4vX3V0aWwvaG9va3MvdXNlWkluZGV4JztcbmltcG9ydCB7IGdldFRyYW5zaXRpb25OYW1lIH0gZnJvbSAnLi4vX3V0aWwvbW90aW9uJztcbmltcG9ydCBnZW5QdXJlUGFuZWwgZnJvbSAnLi4vX3V0aWwvUHVyZVBhbmVsJztcbmltcG9ydCB7IGdldE1lcmdlZFN0YXR1cywgZ2V0U3RhdHVzQ2xhc3NOYW1lcyB9IGZyb20gJy4uL191dGlsL3N0YXR1c1V0aWxzJztcbmltcG9ydCB7IGRldlVzZVdhcm5pbmcgfSBmcm9tICcuLi9fdXRpbC93YXJuaW5nJztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHsgdXNlQ29tcG9uZW50Q29uZmlnIH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL2NvbnRleHQnO1xuaW1wb3J0IERlZmF1bHRSZW5kZXJFbXB0eSBmcm9tICcuLi9jb25maWctcHJvdmlkZXIvZGVmYXVsdFJlbmRlckVtcHR5JztcbmltcG9ydCBEaXNhYmxlZENvbnRleHQgZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL0Rpc2FibGVkQ29udGV4dCc7XG5pbXBvcnQgdXNlQ1NTVmFyQ2xzIGZyb20gJy4uL2NvbmZpZy1wcm92aWRlci9ob29rcy91c2VDU1NWYXJDbHMnO1xuaW1wb3J0IHVzZVNpemUgZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL2hvb2tzL3VzZVNpemUnO1xuaW1wb3J0IHsgRm9ybUl0ZW1JbnB1dENvbnRleHQgfSBmcm9tICcuLi9mb3JtL2NvbnRleHQnO1xuaW1wb3J0IHVzZVZhcmlhbnRzIGZyb20gJy4uL2Zvcm0vaG9va3MvdXNlVmFyaWFudHMnO1xuaW1wb3J0IHsgdXNlQ29tcGFjdEl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vc3BhY2UvQ29tcGFjdCc7XG5pbXBvcnQgeyB1c2VUb2tlbiB9IGZyb20gJy4uL3RoZW1lL2ludGVybmFsJztcbmltcG9ydCBtZXJnZWRCdWlsdGluUGxhY2VtZW50cyBmcm9tICcuL21lcmdlZEJ1aWx0aW5QbGFjZW1lbnRzJztcbmltcG9ydCB1c2VTdHlsZSBmcm9tICcuL3N0eWxlJztcbmltcG9ydCB1c2VJY29ucyBmcm9tICcuL3VzZUljb25zJztcbmltcG9ydCB1c2VTaG93QXJyb3cgZnJvbSAnLi91c2VTaG93QXJyb3cnO1xuY29uc3QgU0VDUkVUX0NPTUJPQk9YX01PREVfRE9fTk9UX1VTRSA9ICdTRUNSRVRfQ09NQk9CT1hfTU9ERV9ET19OT1RfVVNFJztcbmNvbnN0IEludGVybmFsU2VsZWN0ID0gKHByb3BzLCByZWYpID0+IHtcbiAgdmFyIF9hO1xuICBjb25zdCB7XG4gICAgICBwcmVmaXhDbHM6IGN1c3RvbWl6ZVByZWZpeENscyxcbiAgICAgIGJvcmRlcmVkLFxuICAgICAgY2xhc3NOYW1lLFxuICAgICAgcm9vdENsYXNzTmFtZSxcbiAgICAgIGdldFBvcHVwQ29udGFpbmVyLFxuICAgICAgcG9wdXBDbGFzc05hbWUsXG4gICAgICBkcm9wZG93bkNsYXNzTmFtZSxcbiAgICAgIGxpc3RIZWlnaHQgPSAyNTYsXG4gICAgICBwbGFjZW1lbnQsXG4gICAgICBsaXN0SXRlbUhlaWdodDogY3VzdG9tTGlzdEl0ZW1IZWlnaHQsXG4gICAgICBzaXplOiBjdXN0b21pemVTaXplLFxuICAgICAgZGlzYWJsZWQ6IGN1c3RvbURpc2FibGVkLFxuICAgICAgbm90Rm91bmRDb250ZW50LFxuICAgICAgc3RhdHVzOiBjdXN0b21TdGF0dXMsXG4gICAgICBidWlsdGluUGxhY2VtZW50cyxcbiAgICAgIGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCxcbiAgICAgIHBvcHVwTWF0Y2hTZWxlY3RXaWR0aCxcbiAgICAgIGRpcmVjdGlvbjogcHJvcERpcmVjdGlvbixcbiAgICAgIHN0eWxlLFxuICAgICAgYWxsb3dDbGVhcixcbiAgICAgIHZhcmlhbnQ6IGN1c3RvbWl6ZVZhcmlhbnQsXG4gICAgICBkcm9wZG93blN0eWxlLFxuICAgICAgdHJhbnNpdGlvbk5hbWUsXG4gICAgICB0YWdSZW5kZXIsXG4gICAgICBtYXhDb3VudCxcbiAgICAgIHByZWZpeFxuICAgIH0gPSBwcm9wcyxcbiAgICByZXN0ID0gX19yZXN0KHByb3BzLCBbXCJwcmVmaXhDbHNcIiwgXCJib3JkZXJlZFwiLCBcImNsYXNzTmFtZVwiLCBcInJvb3RDbGFzc05hbWVcIiwgXCJnZXRQb3B1cENvbnRhaW5lclwiLCBcInBvcHVwQ2xhc3NOYW1lXCIsIFwiZHJvcGRvd25DbGFzc05hbWVcIiwgXCJsaXN0SGVpZ2h0XCIsIFwicGxhY2VtZW50XCIsIFwibGlzdEl0ZW1IZWlnaHRcIiwgXCJzaXplXCIsIFwiZGlzYWJsZWRcIiwgXCJub3RGb3VuZENvbnRlbnRcIiwgXCJzdGF0dXNcIiwgXCJidWlsdGluUGxhY2VtZW50c1wiLCBcImRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aFwiLCBcInBvcHVwTWF0Y2hTZWxlY3RXaWR0aFwiLCBcImRpcmVjdGlvblwiLCBcInN0eWxlXCIsIFwiYWxsb3dDbGVhclwiLCBcInZhcmlhbnRcIiwgXCJkcm9wZG93blN0eWxlXCIsIFwidHJhbnNpdGlvbk5hbWVcIiwgXCJ0YWdSZW5kZXJcIiwgXCJtYXhDb3VudFwiLCBcInByZWZpeFwiXSk7XG4gIGNvbnN0IHtcbiAgICBnZXRQb3B1cENvbnRhaW5lcjogZ2V0Q29udGV4dFBvcHVwQ29udGFpbmVyLFxuICAgIGdldFByZWZpeENscyxcbiAgICByZW5kZXJFbXB0eSxcbiAgICBkaXJlY3Rpb246IGNvbnRleHREaXJlY3Rpb24sXG4gICAgdmlydHVhbCxcbiAgICBwb3B1cE1hdGNoU2VsZWN0V2lkdGg6IGNvbnRleHRQb3B1cE1hdGNoU2VsZWN0V2lkdGgsXG4gICAgcG9wdXBPdmVyZmxvd1xuICB9ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KTtcbiAgY29uc3QgY29udGV4dFNlbGVjdCA9IHVzZUNvbXBvbmVudENvbmZpZygnc2VsZWN0Jyk7XG4gIGNvbnN0IFssIHRva2VuXSA9IHVzZVRva2VuKCk7XG4gIGNvbnN0IGxpc3RJdGVtSGVpZ2h0ID0gY3VzdG9tTGlzdEl0ZW1IZWlnaHQgIT09IG51bGwgJiYgY3VzdG9tTGlzdEl0ZW1IZWlnaHQgIT09IHZvaWQgMCA/IGN1c3RvbUxpc3RJdGVtSGVpZ2h0IDogdG9rZW4gPT09IG51bGwgfHwgdG9rZW4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRva2VuLmNvbnRyb2xIZWlnaHQ7XG4gIGNvbnN0IHByZWZpeENscyA9IGdldFByZWZpeENscygnc2VsZWN0JywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgY29uc3Qgcm9vdFByZWZpeENscyA9IGdldFByZWZpeENscygpO1xuICBjb25zdCBkaXJlY3Rpb24gPSBwcm9wRGlyZWN0aW9uICE9PSBudWxsICYmIHByb3BEaXJlY3Rpb24gIT09IHZvaWQgMCA/IHByb3BEaXJlY3Rpb24gOiBjb250ZXh0RGlyZWN0aW9uO1xuICBjb25zdCB7XG4gICAgY29tcGFjdFNpemUsXG4gICAgY29tcGFjdEl0ZW1DbGFzc25hbWVzXG4gIH0gPSB1c2VDb21wYWN0SXRlbUNvbnRleHQocHJlZml4Q2xzLCBkaXJlY3Rpb24pO1xuICBjb25zdCBbdmFyaWFudCwgZW5hYmxlVmFyaWFudENsc10gPSB1c2VWYXJpYW50cygnc2VsZWN0JywgY3VzdG9taXplVmFyaWFudCwgYm9yZGVyZWQpO1xuICBjb25zdCByb290Q2xzID0gdXNlQ1NTVmFyQ2xzKHByZWZpeENscyk7XG4gIGNvbnN0IFt3cmFwQ1NTVmFyLCBoYXNoSWQsIGNzc1ZhckNsc10gPSB1c2VTdHlsZShwcmVmaXhDbHMsIHJvb3RDbHMpO1xuICBjb25zdCBtb2RlID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgbW9kZTogbVxuICAgIH0gPSBwcm9wcztcbiAgICBpZiAobSA9PT0gJ2NvbWJvYm94Jykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKG0gPT09IFNFQ1JFVF9DT01CT0JPWF9NT0RFX0RPX05PVF9VU0UpIHtcbiAgICAgIHJldHVybiAnY29tYm9ib3gnO1xuICAgIH1cbiAgICByZXR1cm4gbTtcbiAgfSwgW3Byb3BzLm1vZGVdKTtcbiAgY29uc3QgaXNNdWx0aXBsZSA9IG1vZGUgPT09ICdtdWx0aXBsZScgfHwgbW9kZSA9PT0gJ3RhZ3MnO1xuICBjb25zdCBzaG93U3VmZml4SWNvbiA9IHVzZVNob3dBcnJvdyhwcm9wcy5zdWZmaXhJY29uLCBwcm9wcy5zaG93QXJyb3cpO1xuICBjb25zdCBtZXJnZWRQb3B1cE1hdGNoU2VsZWN0V2lkdGggPSAoX2EgPSBwb3B1cE1hdGNoU2VsZWN0V2lkdGggIT09IG51bGwgJiYgcG9wdXBNYXRjaFNlbGVjdFdpZHRoICE9PSB2b2lkIDAgPyBwb3B1cE1hdGNoU2VsZWN0V2lkdGggOiBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGgpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGNvbnRleHRQb3B1cE1hdGNoU2VsZWN0V2lkdGg7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PSBGb3JtIFN0YXR1cyA9PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3Qge1xuICAgIHN0YXR1czogY29udGV4dFN0YXR1cyxcbiAgICBoYXNGZWVkYmFjayxcbiAgICBpc0Zvcm1JdGVtSW5wdXQsXG4gICAgZmVlZGJhY2tJY29uXG4gIH0gPSBSZWFjdC51c2VDb250ZXh0KEZvcm1JdGVtSW5wdXRDb250ZXh0KTtcbiAgY29uc3QgbWVyZ2VkU3RhdHVzID0gZ2V0TWVyZ2VkU3RhdHVzKGNvbnRleHRTdGF0dXMsIGN1c3RvbVN0YXR1cyk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PSBFbXB0eSA9PT09PT09PT09PT09PT09PT09PT1cbiAgbGV0IG1lcmdlZE5vdEZvdW5kO1xuICBpZiAobm90Rm91bmRDb250ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICBtZXJnZWROb3RGb3VuZCA9IG5vdEZvdW5kQ29udGVudDtcbiAgfSBlbHNlIGlmIChtb2RlID09PSAnY29tYm9ib3gnKSB7XG4gICAgbWVyZ2VkTm90Rm91bmQgPSBudWxsO1xuICB9IGVsc2Uge1xuICAgIG1lcmdlZE5vdEZvdW5kID0gKHJlbmRlckVtcHR5ID09PSBudWxsIHx8IHJlbmRlckVtcHR5ID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZW5kZXJFbXB0eSgnU2VsZWN0JykpIHx8IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERlZmF1bHRSZW5kZXJFbXB0eSwge1xuICAgICAgY29tcG9uZW50TmFtZTogXCJTZWxlY3RcIlxuICAgIH0pO1xuICB9XG4gIC8vID09PT09PT09PT09PT09PT09PT09PSBJY29ucyA9PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3Qge1xuICAgIHN1ZmZpeEljb24sXG4gICAgaXRlbUljb24sXG4gICAgcmVtb3ZlSWNvbixcbiAgICBjbGVhckljb25cbiAgfSA9IHVzZUljb25zKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVzdCksIHtcbiAgICBtdWx0aXBsZTogaXNNdWx0aXBsZSxcbiAgICBoYXNGZWVkYmFjayxcbiAgICBmZWVkYmFja0ljb24sXG4gICAgc2hvd1N1ZmZpeEljb24sXG4gICAgcHJlZml4Q2xzLFxuICAgIGNvbXBvbmVudE5hbWU6ICdTZWxlY3QnXG4gIH0pKTtcbiAgY29uc3QgbWVyZ2VkQWxsb3dDbGVhciA9IGFsbG93Q2xlYXIgPT09IHRydWUgPyB7XG4gICAgY2xlYXJJY29uXG4gIH0gOiBhbGxvd0NsZWFyO1xuICBjb25zdCBzZWxlY3RQcm9wcyA9IG9taXQocmVzdCwgWydzdWZmaXhJY29uJywgJ2l0ZW1JY29uJ10pO1xuICBjb25zdCBtZXJnZWRQb3B1cENsYXNzTmFtZSA9IGNsYXNzTmFtZXMocG9wdXBDbGFzc05hbWUgfHwgZHJvcGRvd25DbGFzc05hbWUsIHtcbiAgICBbYCR7cHJlZml4Q2xzfS1kcm9wZG93bi0ke2RpcmVjdGlvbn1gXTogZGlyZWN0aW9uID09PSAncnRsJ1xuICB9LCByb290Q2xhc3NOYW1lLCBjc3NWYXJDbHMsIHJvb3RDbHMsIGhhc2hJZCk7XG4gIGNvbnN0IG1lcmdlZFNpemUgPSB1c2VTaXplKGN0eCA9PiB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiAoX2EgPSBjdXN0b21pemVTaXplICE9PSBudWxsICYmIGN1c3RvbWl6ZVNpemUgIT09IHZvaWQgMCA/IGN1c3RvbWl6ZVNpemUgOiBjb21wYWN0U2l6ZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogY3R4O1xuICB9KTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09IERpc2FibGVkID09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBkaXNhYmxlZCA9IFJlYWN0LnVzZUNvbnRleHQoRGlzYWJsZWRDb250ZXh0KTtcbiAgY29uc3QgbWVyZ2VkRGlzYWJsZWQgPSBjdXN0b21EaXNhYmxlZCAhPT0gbnVsbCAmJiBjdXN0b21EaXNhYmxlZCAhPT0gdm9pZCAwID8gY3VzdG9tRGlzYWJsZWQgOiBkaXNhYmxlZDtcbiAgY29uc3QgbWVyZ2VkQ2xhc3NOYW1lID0gY2xhc3NOYW1lcyh7XG4gICAgW2Ake3ByZWZpeENsc30tbGdgXTogbWVyZ2VkU2l6ZSA9PT0gJ2xhcmdlJyxcbiAgICBbYCR7cHJlZml4Q2xzfS1zbWBdOiBtZXJnZWRTaXplID09PSAnc21hbGwnLFxuICAgIFtgJHtwcmVmaXhDbHN9LXJ0bGBdOiBkaXJlY3Rpb24gPT09ICdydGwnLFxuICAgIFtgJHtwcmVmaXhDbHN9LSR7dmFyaWFudH1gXTogZW5hYmxlVmFyaWFudENscyxcbiAgICBbYCR7cHJlZml4Q2xzfS1pbi1mb3JtLWl0ZW1gXTogaXNGb3JtSXRlbUlucHV0XG4gIH0sIGdldFN0YXR1c0NsYXNzTmFtZXMocHJlZml4Q2xzLCBtZXJnZWRTdGF0dXMsIGhhc0ZlZWRiYWNrKSwgY29tcGFjdEl0ZW1DbGFzc25hbWVzLCBjb250ZXh0U2VsZWN0LmNsYXNzTmFtZSwgY2xhc3NOYW1lLCByb290Q2xhc3NOYW1lLCBjc3NWYXJDbHMsIHJvb3RDbHMsIGhhc2hJZCk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PSBQbGFjZW1lbnQgPT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IG1lbW9QbGFjZW1lbnQgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBpZiAocGxhY2VtZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBwbGFjZW1lbnQ7XG4gICAgfVxuICAgIHJldHVybiBkaXJlY3Rpb24gPT09ICdydGwnID8gJ2JvdHRvbVJpZ2h0JyA6ICdib3R0b21MZWZ0JztcbiAgfSwgW3BsYWNlbWVudCwgZGlyZWN0aW9uXSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT0gV2FybmluZyA9PT09PT09PT09PT09PT09PT09PT09XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgY29uc3Qgd2FybmluZyA9IGRldlVzZVdhcm5pbmcoJ1NlbGVjdCcpO1xuICAgIHdhcm5pbmcuZGVwcmVjYXRlZCghZHJvcGRvd25DbGFzc05hbWUsICdkcm9wZG93bkNsYXNzTmFtZScsICdwb3B1cENsYXNzTmFtZScpO1xuICAgIHdhcm5pbmcuZGVwcmVjYXRlZChkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGggPT09IHVuZGVmaW5lZCwgJ2Ryb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCcsICdwb3B1cE1hdGNoU2VsZWN0V2lkdGgnKTtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCEoJ3Nob3dBcnJvdycgaW4gcHJvcHMpLCAnZGVwcmVjYXRlZCcsICdgc2hvd0Fycm93YCBpcyBkZXByZWNhdGVkIHdoaWNoIHdpbGwgYmUgcmVtb3ZlZCBpbiBuZXh0IG1ham9yIHZlcnNpb24uIEl0IHdpbGwgYmUgYSBkZWZhdWx0IGJlaGF2aW9yLCB5b3UgY2FuIGhpZGUgaXQgYnkgc2V0dGluZyBgc3VmZml4SWNvbmAgdG8gbnVsbC4nKSA6IHZvaWQgMDtcbiAgICB3YXJuaW5nLmRlcHJlY2F0ZWQoISgnYm9yZGVyZWQnIGluIHByb3BzKSwgJ2JvcmRlcmVkJywgJ3ZhcmlhbnQnKTtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCEodHlwZW9mIG1heENvdW50ICE9PSAndW5kZWZpbmVkJyAmJiAhaXNNdWx0aXBsZSksICd1c2FnZScsICdgbWF4Q291bnRgIG9ubHkgd29ya3Mgd2l0aCBtb2RlIGBtdWx0aXBsZWAgb3IgYHRhZ3NgJykgOiB2b2lkIDA7XG4gIH1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PSB6SW5kZXggPT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBbekluZGV4XSA9IHVzZVpJbmRleCgnU2VsZWN0TGlrZScsIGRyb3Bkb3duU3R5bGUgPT09IG51bGwgfHwgZHJvcGRvd25TdHlsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZHJvcGRvd25TdHlsZS56SW5kZXgpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PVxuICByZXR1cm4gd3JhcENTU1ZhcigvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSY1NlbGVjdCwgT2JqZWN0LmFzc2lnbih7XG4gICAgcmVmOiByZWYsXG4gICAgdmlydHVhbDogdmlydHVhbCxcbiAgICBzaG93U2VhcmNoOiBjb250ZXh0U2VsZWN0LnNob3dTZWFyY2hcbiAgfSwgc2VsZWN0UHJvcHMsIHtcbiAgICBzdHlsZTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjb250ZXh0U2VsZWN0LnN0eWxlKSwgc3R5bGUpLFxuICAgIGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aDogbWVyZ2VkUG9wdXBNYXRjaFNlbGVjdFdpZHRoLFxuICAgIHRyYW5zaXRpb25OYW1lOiBnZXRUcmFuc2l0aW9uTmFtZShyb290UHJlZml4Q2xzLCAnc2xpZGUtdXAnLCB0cmFuc2l0aW9uTmFtZSksXG4gICAgYnVpbHRpblBsYWNlbWVudHM6IG1lcmdlZEJ1aWx0aW5QbGFjZW1lbnRzKGJ1aWx0aW5QbGFjZW1lbnRzLCBwb3B1cE92ZXJmbG93KSxcbiAgICBsaXN0SGVpZ2h0OiBsaXN0SGVpZ2h0LFxuICAgIGxpc3RJdGVtSGVpZ2h0OiBsaXN0SXRlbUhlaWdodCxcbiAgICBtb2RlOiBtb2RlLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIHBsYWNlbWVudDogbWVtb1BsYWNlbWVudCxcbiAgICBkaXJlY3Rpb246IGRpcmVjdGlvbixcbiAgICBwcmVmaXg6IHByZWZpeCxcbiAgICBzdWZmaXhJY29uOiBzdWZmaXhJY29uLFxuICAgIG1lbnVJdGVtU2VsZWN0ZWRJY29uOiBpdGVtSWNvbixcbiAgICByZW1vdmVJY29uOiByZW1vdmVJY29uLFxuICAgIGFsbG93Q2xlYXI6IG1lcmdlZEFsbG93Q2xlYXIsXG4gICAgbm90Rm91bmRDb250ZW50OiBtZXJnZWROb3RGb3VuZCxcbiAgICBjbGFzc05hbWU6IG1lcmdlZENsYXNzTmFtZSxcbiAgICBnZXRQb3B1cENvbnRhaW5lcjogZ2V0UG9wdXBDb250YWluZXIgfHwgZ2V0Q29udGV4dFBvcHVwQ29udGFpbmVyLFxuICAgIGRyb3Bkb3duQ2xhc3NOYW1lOiBtZXJnZWRQb3B1cENsYXNzTmFtZSxcbiAgICBkaXNhYmxlZDogbWVyZ2VkRGlzYWJsZWQsXG4gICAgZHJvcGRvd25TdHlsZTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkcm9wZG93blN0eWxlKSwge1xuICAgICAgekluZGV4XG4gICAgfSksXG4gICAgbWF4Q291bnQ6IGlzTXVsdGlwbGUgPyBtYXhDb3VudCA6IHVuZGVmaW5lZCxcbiAgICB0YWdSZW5kZXI6IGlzTXVsdGlwbGUgPyB0YWdSZW5kZXIgOiB1bmRlZmluZWRcbiAgfSkpKTtcbn07XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBJbnRlcm5hbFNlbGVjdC5kaXNwbGF5TmFtZSA9ICdTZWxlY3QnO1xufVxuY29uc3QgU2VsZWN0ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoSW50ZXJuYWxTZWxlY3QpO1xuLy8gV2UgZG9uJ3QgY2FyZSBkZWJ1ZyBwYW5lbFxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmNvbnN0IFB1cmVQYW5lbCA9IGdlblB1cmVQYW5lbChTZWxlY3QsICdkcm9wZG93bkFsaWduJyk7XG5TZWxlY3QuU0VDUkVUX0NPTUJPQk9YX01PREVfRE9fTk9UX1VTRSA9IFNFQ1JFVF9DT01CT0JPWF9NT0RFX0RPX05PVF9VU0U7XG5TZWxlY3QuT3B0aW9uID0gT3B0aW9uO1xuU2VsZWN0Lk9wdEdyb3VwID0gT3B0R3JvdXA7XG5TZWxlY3QuX0ludGVybmFsUGFuZWxEb05vdFVzZU9yWW91V2lsbEJlRmlyZWQgPSBQdXJlUGFuZWw7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBTZWxlY3QuZGlzcGxheU5hbWUgPSAnU2VsZWN0Jztcbn1cbmV4cG9ydCBkZWZhdWx0IFNlbGVjdDsiLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiaWRcIiwgXCJtb2RlXCIsIFwicHJlZml4Q2xzXCIsIFwiYmFja2ZpbGxcIiwgXCJmaWVsZE5hbWVzXCIsIFwiaW5wdXRWYWx1ZVwiLCBcInNlYXJjaFZhbHVlXCIsIFwib25TZWFyY2hcIiwgXCJhdXRvQ2xlYXJTZWFyY2hWYWx1ZVwiLCBcIm9uU2VsZWN0XCIsIFwib25EZXNlbGVjdFwiLCBcImRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aFwiLCBcImZpbHRlck9wdGlvblwiLCBcImZpbHRlclNvcnRcIiwgXCJvcHRpb25GaWx0ZXJQcm9wXCIsIFwib3B0aW9uTGFiZWxQcm9wXCIsIFwib3B0aW9uc1wiLCBcIm9wdGlvblJlbmRlclwiLCBcImNoaWxkcmVuXCIsIFwiZGVmYXVsdEFjdGl2ZUZpcnN0T3B0aW9uXCIsIFwibWVudUl0ZW1TZWxlY3RlZEljb25cIiwgXCJ2aXJ0dWFsXCIsIFwiZGlyZWN0aW9uXCIsIFwibGlzdEhlaWdodFwiLCBcImxpc3RJdGVtSGVpZ2h0XCIsIFwibGFiZWxSZW5kZXJcIiwgXCJ2YWx1ZVwiLCBcImRlZmF1bHRWYWx1ZVwiLCBcImxhYmVsSW5WYWx1ZVwiLCBcIm9uQ2hhbmdlXCIsIFwibWF4Q291bnRcIl07XG4vKipcbiAqIFRvIG1hdGNoIGFjY2Vzc2liaWxpdHkgcmVxdWlyZW1lbnQsIHdlIGFsd2F5cyBwcm92aWRlIGFuIGlucHV0IGluIHRoZSBjb21wb25lbnQuXG4gKiBPdGhlciBlbGVtZW50IHdpbGwgbm90IHNldCBgdGFiSW5kZXhgIHRvIGF2b2lkIGBvbkJsdXJgIHNlcXVlbmNlIHByb2JsZW0uXG4gKiBGb3IgZm9jdXNlZCBzZWxlY3QsIHdlIHNldCBgYXJpYS1saXZlPVwicG9saXRlXCJgIHRvIHVwZGF0ZSB0aGUgYWNjZXNzaWJpbGl0eSBjb250ZW50LlxuICpcbiAqIHJlZjpcbiAqIC0ga2V5Ym9hcmQ6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FjY2Vzc2liaWxpdHkvQVJJQS9Sb2xlcy9saXN0Ym94X3JvbGUjS2V5Ym9hcmRfaW50ZXJhY3Rpb25zXG4gKlxuICogTmV3IGFwaTpcbiAqIC0gbGlzdEhlaWdodFxuICogLSBsaXN0SXRlbUhlaWdodFxuICogLSBjb21wb25lbnRcbiAqXG4gKiBSZW1vdmUgZGVwcmVjYXRlZCBhcGk6XG4gKiAtIG11bHRpcGxlXG4gKiAtIHRhZ3NcbiAqIC0gY29tYm9ib3hcbiAqIC0gZmlyc3RBY3RpdmVWYWx1ZVxuICogLSBkcm9wZG93bk1lbnVTdHlsZVxuICogLSBvcGVuQ2xhc3NOYW1lIChOb3QgbGlzdCBpbiBhcGkpXG4gKlxuICogVXBkYXRlOlxuICogLSBgYmFja2ZpbGxgIG9ubHkgc3VwcG9ydCBgY29tYm9ib3hgIG1vZGVcbiAqIC0gYGNvbWJvYm94YCBtb2RlIG5vdCBzdXBwb3J0IGBsYWJlbEluVmFsdWVgIHNpbmNlIGl0J3MgbWVhbmluZ2xlc3NcbiAqIC0gYGdldElucHV0RWxlbWVudGAgb25seSBzdXBwb3J0IGBjb21ib2JveGAgbW9kZVxuICogLSBgb25DaGFuZ2VgIHJldHVybiBPcHRpb25EYXRhIGluc3RlYWQgb2YgUmVhY3ROb2RlXG4gKiAtIGBmaWx0ZXJPcHRpb25gIGBvbkNoYW5nZWAgYG9uU2VsZWN0YCBhY2NlcHQgT3B0aW9uRGF0YSBpbnN0ZWFkIG9mIFJlYWN0Tm9kZVxuICogLSBgY29tYm9ib3hgIG1vZGUgdHJpZ2dlciBgb25DaGFuZ2VgIHdpbGwgZ2V0IGB1bmRlZmluZWRgIGlmIG5vIGB2YWx1ZWAgbWF0Y2ggaW4gT3B0aW9uXG4gKiAtIGBjb21ib2JveGAgbW9kZSBub3Qgc3VwcG9ydCBgb3B0aW9uTGFiZWxQcm9wYFxuICovXG5cbmltcG9ydCB1c2VNZXJnZWRTdGF0ZSBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VNZXJnZWRTdGF0ZVwiO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEJhc2VTZWxlY3QsIHsgaXNNdWx0aXBsZSB9IGZyb20gXCIuL0Jhc2VTZWxlY3RcIjtcbmltcG9ydCBPcHRHcm91cCBmcm9tIFwiLi9PcHRHcm91cFwiO1xuaW1wb3J0IE9wdGlvbiBmcm9tIFwiLi9PcHRpb25cIjtcbmltcG9ydCBPcHRpb25MaXN0IGZyb20gXCIuL09wdGlvbkxpc3RcIjtcbmltcG9ydCBTZWxlY3RDb250ZXh0IGZyb20gXCIuL1NlbGVjdENvbnRleHRcIjtcbmltcG9ydCB1c2VDYWNoZSBmcm9tIFwiLi9ob29rcy91c2VDYWNoZVwiO1xuaW1wb3J0IHVzZUZpbHRlck9wdGlvbnMgZnJvbSBcIi4vaG9va3MvdXNlRmlsdGVyT3B0aW9uc1wiO1xuaW1wb3J0IHVzZUlkIGZyb20gXCIuL2hvb2tzL3VzZUlkXCI7XG5pbXBvcnQgdXNlT3B0aW9ucyBmcm9tIFwiLi9ob29rcy91c2VPcHRpb25zXCI7XG5pbXBvcnQgdXNlUmVmRnVuYyBmcm9tIFwiLi9ob29rcy91c2VSZWZGdW5jXCI7XG5pbXBvcnQgeyBoYXNWYWx1ZSwgaXNDb21ib05vVmFsdWUsIHRvQXJyYXkgfSBmcm9tIFwiLi91dGlscy9jb21tb25VdGlsXCI7XG5pbXBvcnQgeyBmaWxsRmllbGROYW1lcywgZmxhdHRlbk9wdGlvbnMsIGluamVjdFByb3BzV2l0aE9wdGlvbiB9IGZyb20gXCIuL3V0aWxzL3ZhbHVlVXRpbFwiO1xuaW1wb3J0IHdhcm5pbmdQcm9wcywgeyB3YXJuaW5nTnVsbE9wdGlvbnMgfSBmcm9tIFwiLi91dGlscy93YXJuaW5nUHJvcHNVdGlsXCI7XG52YXIgT01JVF9ET01fUFJPUFMgPSBbJ2lucHV0VmFsdWUnXTtcbmZ1bmN0aW9uIGlzUmF3VmFsdWUodmFsdWUpIHtcbiAgcmV0dXJuICF2YWx1ZSB8fCBfdHlwZW9mKHZhbHVlKSAhPT0gJ29iamVjdCc7XG59XG52YXIgU2VsZWN0ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIGlkID0gcHJvcHMuaWQsXG4gICAgbW9kZSA9IHByb3BzLm1vZGUsXG4gICAgX3Byb3BzJHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBwcmVmaXhDbHMgPSBfcHJvcHMkcHJlZml4Q2xzID09PSB2b2lkIDAgPyAncmMtc2VsZWN0JyA6IF9wcm9wcyRwcmVmaXhDbHMsXG4gICAgYmFja2ZpbGwgPSBwcm9wcy5iYWNrZmlsbCxcbiAgICBmaWVsZE5hbWVzID0gcHJvcHMuZmllbGROYW1lcyxcbiAgICBpbnB1dFZhbHVlID0gcHJvcHMuaW5wdXRWYWx1ZSxcbiAgICBzZWFyY2hWYWx1ZSA9IHByb3BzLnNlYXJjaFZhbHVlLFxuICAgIG9uU2VhcmNoID0gcHJvcHMub25TZWFyY2gsXG4gICAgX3Byb3BzJGF1dG9DbGVhclNlYXJjID0gcHJvcHMuYXV0b0NsZWFyU2VhcmNoVmFsdWUsXG4gICAgYXV0b0NsZWFyU2VhcmNoVmFsdWUgPSBfcHJvcHMkYXV0b0NsZWFyU2VhcmMgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkYXV0b0NsZWFyU2VhcmMsXG4gICAgb25TZWxlY3QgPSBwcm9wcy5vblNlbGVjdCxcbiAgICBvbkRlc2VsZWN0ID0gcHJvcHMub25EZXNlbGVjdCxcbiAgICBfcHJvcHMkZHJvcGRvd25NYXRjaFMgPSBwcm9wcy5kcm9wZG93bk1hdGNoU2VsZWN0V2lkdGgsXG4gICAgZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoID0gX3Byb3BzJGRyb3Bkb3duTWF0Y2hTID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJGRyb3Bkb3duTWF0Y2hTLFxuICAgIGZpbHRlck9wdGlvbiA9IHByb3BzLmZpbHRlck9wdGlvbixcbiAgICBmaWx0ZXJTb3J0ID0gcHJvcHMuZmlsdGVyU29ydCxcbiAgICBvcHRpb25GaWx0ZXJQcm9wID0gcHJvcHMub3B0aW9uRmlsdGVyUHJvcCxcbiAgICBvcHRpb25MYWJlbFByb3AgPSBwcm9wcy5vcHRpb25MYWJlbFByb3AsXG4gICAgb3B0aW9ucyA9IHByb3BzLm9wdGlvbnMsXG4gICAgb3B0aW9uUmVuZGVyID0gcHJvcHMub3B0aW9uUmVuZGVyLFxuICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgZGVmYXVsdEFjdGl2ZUZpcnN0T3B0aW9uID0gcHJvcHMuZGVmYXVsdEFjdGl2ZUZpcnN0T3B0aW9uLFxuICAgIG1lbnVJdGVtU2VsZWN0ZWRJY29uID0gcHJvcHMubWVudUl0ZW1TZWxlY3RlZEljb24sXG4gICAgdmlydHVhbCA9IHByb3BzLnZpcnR1YWwsXG4gICAgZGlyZWN0aW9uID0gcHJvcHMuZGlyZWN0aW9uLFxuICAgIF9wcm9wcyRsaXN0SGVpZ2h0ID0gcHJvcHMubGlzdEhlaWdodCxcbiAgICBsaXN0SGVpZ2h0ID0gX3Byb3BzJGxpc3RIZWlnaHQgPT09IHZvaWQgMCA/IDIwMCA6IF9wcm9wcyRsaXN0SGVpZ2h0LFxuICAgIF9wcm9wcyRsaXN0SXRlbUhlaWdodCA9IHByb3BzLmxpc3RJdGVtSGVpZ2h0LFxuICAgIGxpc3RJdGVtSGVpZ2h0ID0gX3Byb3BzJGxpc3RJdGVtSGVpZ2h0ID09PSB2b2lkIDAgPyAyMCA6IF9wcm9wcyRsaXN0SXRlbUhlaWdodCxcbiAgICBsYWJlbFJlbmRlciA9IHByb3BzLmxhYmVsUmVuZGVyLFxuICAgIHZhbHVlID0gcHJvcHMudmFsdWUsXG4gICAgZGVmYXVsdFZhbHVlID0gcHJvcHMuZGVmYXVsdFZhbHVlLFxuICAgIGxhYmVsSW5WYWx1ZSA9IHByb3BzLmxhYmVsSW5WYWx1ZSxcbiAgICBvbkNoYW5nZSA9IHByb3BzLm9uQ2hhbmdlLFxuICAgIG1heENvdW50ID0gcHJvcHMubWF4Q291bnQsXG4gICAgcmVzdFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBfZXhjbHVkZWQpO1xuICB2YXIgbWVyZ2VkSWQgPSB1c2VJZChpZCk7XG4gIHZhciBtdWx0aXBsZSA9IGlzTXVsdGlwbGUobW9kZSk7XG4gIHZhciBjaGlsZHJlbkFzRGF0YSA9ICEhKCFvcHRpb25zICYmIGNoaWxkcmVuKTtcbiAgdmFyIG1lcmdlZEZpbHRlck9wdGlvbiA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGlmIChmaWx0ZXJPcHRpb24gPT09IHVuZGVmaW5lZCAmJiBtb2RlID09PSAnY29tYm9ib3gnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBmaWx0ZXJPcHRpb247XG4gIH0sIFtmaWx0ZXJPcHRpb24sIG1vZGVdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IEZpZWxkTmFtZXMgPT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgbWVyZ2VkRmllbGROYW1lcyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmaWxsRmllbGROYW1lcyhmaWVsZE5hbWVzLCBjaGlsZHJlbkFzRGF0YSk7XG4gIH0sIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwcyAqL1xuICBbXG4gIC8vIFdlIHN0cmluZ2lmeSBmaWVsZE5hbWVzIHRvIGF2b2lkIHVubmVjZXNzYXJ5IHJlLXJlbmRlcnMuXG4gIEpTT04uc3RyaW5naWZ5KGZpZWxkTmFtZXMpLCBjaGlsZHJlbkFzRGF0YV1cbiAgLyogZXNsaW50LWVuYWJsZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHMgKi8pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBTZWFyY2ggPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfdXNlTWVyZ2VkU3RhdGUgPSB1c2VNZXJnZWRTdGF0ZSgnJywge1xuICAgICAgdmFsdWU6IHNlYXJjaFZhbHVlICE9PSB1bmRlZmluZWQgPyBzZWFyY2hWYWx1ZSA6IGlucHV0VmFsdWUsXG4gICAgICBwb3N0U3RhdGU6IGZ1bmN0aW9uIHBvc3RTdGF0ZShzZWFyY2gpIHtcbiAgICAgICAgcmV0dXJuIHNlYXJjaCB8fCAnJztcbiAgICAgIH1cbiAgICB9KSxcbiAgICBfdXNlTWVyZ2VkU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZU1lcmdlZFN0YXRlLCAyKSxcbiAgICBtZXJnZWRTZWFyY2hWYWx1ZSA9IF91c2VNZXJnZWRTdGF0ZTJbMF0sXG4gICAgc2V0U2VhcmNoVmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGUyWzFdO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBPcHRpb24gPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBwYXJzZWRPcHRpb25zID0gdXNlT3B0aW9ucyhvcHRpb25zLCBjaGlsZHJlbiwgbWVyZ2VkRmllbGROYW1lcywgb3B0aW9uRmlsdGVyUHJvcCwgb3B0aW9uTGFiZWxQcm9wKTtcbiAgdmFyIHZhbHVlT3B0aW9ucyA9IHBhcnNlZE9wdGlvbnMudmFsdWVPcHRpb25zLFxuICAgIGxhYmVsT3B0aW9ucyA9IHBhcnNlZE9wdGlvbnMubGFiZWxPcHRpb25zLFxuICAgIG1lcmdlZE9wdGlvbnMgPSBwYXJzZWRPcHRpb25zLm9wdGlvbnM7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBXcmFwIFZhbHVlID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGNvbnZlcnQyTGFiZWxWYWx1ZXMgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoZHJhZnRWYWx1ZXMpIHtcbiAgICAvLyBDb252ZXJ0IHRvIGFycmF5XG4gICAgdmFyIHZhbHVlTGlzdCA9IHRvQXJyYXkoZHJhZnRWYWx1ZXMpO1xuXG4gICAgLy8gQ29udmVydCB0byBsYWJlbEluVmFsdWUgdHlwZVxuICAgIHJldHVybiB2YWx1ZUxpc3QubWFwKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIHZhciByYXdWYWx1ZTtcbiAgICAgIHZhciByYXdMYWJlbDtcbiAgICAgIHZhciByYXdLZXk7XG4gICAgICB2YXIgcmF3RGlzYWJsZWQ7XG4gICAgICB2YXIgcmF3VGl0bGU7XG5cbiAgICAgIC8vIEZpbGwgbGFiZWwgJiB2YWx1ZVxuICAgICAgaWYgKGlzUmF3VmFsdWUodmFsKSkge1xuICAgICAgICByYXdWYWx1ZSA9IHZhbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBfdmFsJHZhbHVlO1xuICAgICAgICByYXdLZXkgPSB2YWwua2V5O1xuICAgICAgICByYXdMYWJlbCA9IHZhbC5sYWJlbDtcbiAgICAgICAgcmF3VmFsdWUgPSAoX3ZhbCR2YWx1ZSA9IHZhbC52YWx1ZSkgIT09IG51bGwgJiYgX3ZhbCR2YWx1ZSAhPT0gdm9pZCAwID8gX3ZhbCR2YWx1ZSA6IHJhd0tleTtcbiAgICAgIH1cbiAgICAgIHZhciBvcHRpb24gPSB2YWx1ZU9wdGlvbnMuZ2V0KHJhd1ZhbHVlKTtcbiAgICAgIGlmIChvcHRpb24pIHtcbiAgICAgICAgdmFyIF9vcHRpb24ka2V5O1xuICAgICAgICAvLyBGaWxsIG1pc3NpbmcgcHJvcHNcbiAgICAgICAgaWYgKHJhd0xhYmVsID09PSB1bmRlZmluZWQpIHJhd0xhYmVsID0gb3B0aW9uID09PSBudWxsIHx8IG9wdGlvbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9uW29wdGlvbkxhYmVsUHJvcCB8fCBtZXJnZWRGaWVsZE5hbWVzLmxhYmVsXTtcbiAgICAgICAgaWYgKHJhd0tleSA9PT0gdW5kZWZpbmVkKSByYXdLZXkgPSAoX29wdGlvbiRrZXkgPSBvcHRpb24gPT09IG51bGwgfHwgb3B0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb24ua2V5KSAhPT0gbnVsbCAmJiBfb3B0aW9uJGtleSAhPT0gdm9pZCAwID8gX29wdGlvbiRrZXkgOiByYXdWYWx1ZTtcbiAgICAgICAgcmF3RGlzYWJsZWQgPSBvcHRpb24gPT09IG51bGwgfHwgb3B0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb24uZGlzYWJsZWQ7XG4gICAgICAgIHJhd1RpdGxlID0gb3B0aW9uID09PSBudWxsIHx8IG9wdGlvbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9uLnRpdGxlO1xuXG4gICAgICAgIC8vIFdhcm5pbmcgaWYgbGFiZWwgbm90IHNhbWUgYXMgcHJvdmlkZWRcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIW9wdGlvbkxhYmVsUHJvcCkge1xuICAgICAgICAgIHZhciBvcHRpb25MYWJlbCA9IG9wdGlvbiA9PT0gbnVsbCB8fCBvcHRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvblttZXJnZWRGaWVsZE5hbWVzLmxhYmVsXTtcbiAgICAgICAgICBpZiAob3B0aW9uTGFiZWwgIT09IHVuZGVmaW5lZCAmJiAhIC8qI19fUFVSRV9fKi9SZWFjdC5pc1ZhbGlkRWxlbWVudChvcHRpb25MYWJlbCkgJiYgISAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQocmF3TGFiZWwpICYmIG9wdGlvbkxhYmVsICE9PSByYXdMYWJlbCkge1xuICAgICAgICAgICAgd2FybmluZyhmYWxzZSwgJ2BsYWJlbGAgb2YgYHZhbHVlYCBpcyBub3Qgc2FtZSBhcyBgbGFiZWxgIGluIFNlbGVjdCBvcHRpb25zLicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGFiZWw6IHJhd0xhYmVsLFxuICAgICAgICB2YWx1ZTogcmF3VmFsdWUsXG4gICAgICAgIGtleTogcmF3S2V5LFxuICAgICAgICBkaXNhYmxlZDogcmF3RGlzYWJsZWQsXG4gICAgICAgIHRpdGxlOiByYXdUaXRsZVxuICAgICAgfTtcbiAgICB9KTtcbiAgfSwgW21lcmdlZEZpZWxkTmFtZXMsIG9wdGlvbkxhYmVsUHJvcCwgdmFsdWVPcHRpb25zXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IFZhbHVlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF91c2VNZXJnZWRTdGF0ZTMgPSB1c2VNZXJnZWRTdGF0ZShkZWZhdWx0VmFsdWUsIHtcbiAgICAgIHZhbHVlOiB2YWx1ZVxuICAgIH0pLFxuICAgIF91c2VNZXJnZWRTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfdXNlTWVyZ2VkU3RhdGUzLCAyKSxcbiAgICBpbnRlcm5hbFZhbHVlID0gX3VzZU1lcmdlZFN0YXRlNFswXSxcbiAgICBzZXRJbnRlcm5hbFZhbHVlID0gX3VzZU1lcmdlZFN0YXRlNFsxXTtcblxuICAvLyBNZXJnZWQgdmFsdWUgd2l0aCBMYWJlbFZhbHVlVHlwZVxuICB2YXIgcmF3TGFiZWxlZFZhbHVlcyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBfdmFsdWVzJDtcbiAgICB2YXIgbmV3SW50ZXJuYWxWYWx1ZSA9IG11bHRpcGxlICYmIGludGVybmFsVmFsdWUgPT09IG51bGwgPyBbXSA6IGludGVybmFsVmFsdWU7XG4gICAgdmFyIHZhbHVlcyA9IGNvbnZlcnQyTGFiZWxWYWx1ZXMobmV3SW50ZXJuYWxWYWx1ZSk7XG5cbiAgICAvLyBjb21ib2JveCBubyBuZWVkIHNhdmUgdmFsdWUgd2hlbiBpdCdzIG5vIHZhbHVlIChleGNsdWRlIHZhbHVlIGVxdWFsIDApXG4gICAgaWYgKG1vZGUgPT09ICdjb21ib2JveCcgJiYgaXNDb21ib05vVmFsdWUoKF92YWx1ZXMkID0gdmFsdWVzWzBdKSA9PT0gbnVsbCB8fCBfdmFsdWVzJCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3ZhbHVlcyQudmFsdWUpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH0sIFtpbnRlcm5hbFZhbHVlLCBjb252ZXJ0MkxhYmVsVmFsdWVzLCBtb2RlLCBtdWx0aXBsZV0pO1xuXG4gIC8vIEZpbGwgbGFiZWwgd2l0aCBjYWNoZSB0byBhdm9pZCBvcHRpb24gcmVtb3ZlXG4gIHZhciBfdXNlQ2FjaGUgPSB1c2VDYWNoZShyYXdMYWJlbGVkVmFsdWVzLCB2YWx1ZU9wdGlvbnMpLFxuICAgIF91c2VDYWNoZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlQ2FjaGUsIDIpLFxuICAgIG1lcmdlZFZhbHVlcyA9IF91c2VDYWNoZTJbMF0sXG4gICAgZ2V0TWl4ZWRPcHRpb24gPSBfdXNlQ2FjaGUyWzFdO1xuICB2YXIgZGlzcGxheVZhbHVlcyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIC8vIGBudWxsYCBuZWVkIHNob3cgYXMgcGxhY2Vob2xkZXIgaW5zdGVhZFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzI1MDU3XG4gICAgaWYgKCFtb2RlICYmIG1lcmdlZFZhbHVlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHZhciBmaXJzdFZhbHVlID0gbWVyZ2VkVmFsdWVzWzBdO1xuICAgICAgaWYgKGZpcnN0VmFsdWUudmFsdWUgPT09IG51bGwgJiYgKGZpcnN0VmFsdWUubGFiZWwgPT09IG51bGwgfHwgZmlyc3RWYWx1ZS5sYWJlbCA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtZXJnZWRWYWx1ZXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICB2YXIgX3JlZjtcbiAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGl0ZW0pLCB7fSwge1xuICAgICAgICBsYWJlbDogKF9yZWYgPSB0eXBlb2YgbGFiZWxSZW5kZXIgPT09ICdmdW5jdGlvbicgPyBsYWJlbFJlbmRlcihpdGVtKSA6IGl0ZW0ubGFiZWwpICE9PSBudWxsICYmIF9yZWYgIT09IHZvaWQgMCA/IF9yZWYgOiBpdGVtLnZhbHVlXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSwgW21vZGUsIG1lcmdlZFZhbHVlcywgbGFiZWxSZW5kZXJdKTtcblxuICAvKiogQ29udmVydCBgZGlzcGxheVZhbHVlc2AgdG8gcmF3IHZhbHVlIHR5cGUgc2V0ICovXG4gIHZhciByYXdWYWx1ZXMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IFNldChtZXJnZWRWYWx1ZXMubWFwKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIHJldHVybiB2YWwudmFsdWU7XG4gICAgfSkpO1xuICB9LCBbbWVyZ2VkVmFsdWVzXSk7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKG1vZGUgPT09ICdjb21ib2JveCcpIHtcbiAgICAgIHZhciBfbWVyZ2VkVmFsdWVzJDtcbiAgICAgIHZhciBzdHJWYWx1ZSA9IChfbWVyZ2VkVmFsdWVzJCA9IG1lcmdlZFZhbHVlc1swXSkgPT09IG51bGwgfHwgX21lcmdlZFZhbHVlcyQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9tZXJnZWRWYWx1ZXMkLnZhbHVlO1xuICAgICAgc2V0U2VhcmNoVmFsdWUoaGFzVmFsdWUoc3RyVmFsdWUpID8gU3RyaW5nKHN0clZhbHVlKSA6ICcnKTtcbiAgICB9XG4gIH0sIFttZXJnZWRWYWx1ZXNdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBEaXNwbGF5IE9wdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDcmVhdGUgYSBwbGFjZWhvbGRlciBpdGVtIGlmIG5vdCBleGlzdCBpbiBgb3B0aW9uc2BcbiAgdmFyIGNyZWF0ZVRhZ09wdGlvbiA9IHVzZVJlZkZ1bmMoZnVuY3Rpb24gKHZhbCwgbGFiZWwpIHtcbiAgICB2YXIgbWVyZ2VkTGFiZWwgPSBsYWJlbCAhPT0gbnVsbCAmJiBsYWJlbCAhPT0gdm9pZCAwID8gbGFiZWwgOiB2YWw7XG4gICAgcmV0dXJuIF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoe30sIG1lcmdlZEZpZWxkTmFtZXMudmFsdWUsIHZhbCksIG1lcmdlZEZpZWxkTmFtZXMubGFiZWwsIG1lcmdlZExhYmVsKTtcbiAgfSk7XG5cbiAgLy8gRmlsbCB0YWcgYXMgb3B0aW9uIGlmIG1vZGUgaXMgYHRhZ3NgXG4gIHZhciBmaWxsZWRUYWdPcHRpb25zID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKG1vZGUgIT09ICd0YWdzJykge1xuICAgICAgcmV0dXJuIG1lcmdlZE9wdGlvbnM7XG4gICAgfVxuXG4gICAgLy8gPj4+IFRhZyBtb2RlXG4gICAgdmFyIGNsb25lT3B0aW9ucyA9IF90b0NvbnN1bWFibGVBcnJheShtZXJnZWRPcHRpb25zKTtcblxuICAgIC8vIENoZWNrIGlmIHZhbHVlIGV4aXN0IGluIG9wdGlvbnMgKGluY2x1ZGUgbmV3IHBhdGNoIGl0ZW0pXG4gICAgdmFyIGV4aXN0T3B0aW9ucyA9IGZ1bmN0aW9uIGV4aXN0T3B0aW9ucyh2YWwpIHtcbiAgICAgIHJldHVybiB2YWx1ZU9wdGlvbnMuaGFzKHZhbCk7XG4gICAgfTtcblxuICAgIC8vIEZpbGwgY3VycmVudCB2YWx1ZSBhcyBvcHRpb25cbiAgICBfdG9Db25zdW1hYmxlQXJyYXkobWVyZ2VkVmFsdWVzKS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gYS52YWx1ZSA8IGIudmFsdWUgPyAtMSA6IDE7XG4gICAgfSkuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIHZhbCA9IGl0ZW0udmFsdWU7XG4gICAgICBpZiAoIWV4aXN0T3B0aW9ucyh2YWwpKSB7XG4gICAgICAgIGNsb25lT3B0aW9ucy5wdXNoKGNyZWF0ZVRhZ09wdGlvbih2YWwsIGl0ZW0ubGFiZWwpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY2xvbmVPcHRpb25zO1xuICB9LCBbY3JlYXRlVGFnT3B0aW9uLCBtZXJnZWRPcHRpb25zLCB2YWx1ZU9wdGlvbnMsIG1lcmdlZFZhbHVlcywgbW9kZV0pO1xuICB2YXIgZmlsdGVyZWRPcHRpb25zID0gdXNlRmlsdGVyT3B0aW9ucyhmaWxsZWRUYWdPcHRpb25zLCBtZXJnZWRGaWVsZE5hbWVzLCBtZXJnZWRTZWFyY2hWYWx1ZSwgbWVyZ2VkRmlsdGVyT3B0aW9uLCBvcHRpb25GaWx0ZXJQcm9wKTtcblxuICAvLyBGaWxsIG9wdGlvbnMgd2l0aCBzZWFyY2ggdmFsdWUgaWYgbmVlZGVkXG4gIHZhciBmaWxsZWRTZWFyY2hPcHRpb25zID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKG1vZGUgIT09ICd0YWdzJyB8fCAhbWVyZ2VkU2VhcmNoVmFsdWUgfHwgZmlsdGVyZWRPcHRpb25zLnNvbWUoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBpdGVtW29wdGlvbkZpbHRlclByb3AgfHwgJ3ZhbHVlJ10gPT09IG1lcmdlZFNlYXJjaFZhbHVlO1xuICAgIH0pKSB7XG4gICAgICByZXR1cm4gZmlsdGVyZWRPcHRpb25zO1xuICAgIH1cbiAgICAvLyBpZ25vcmUgd2hlbiBzZWFyY2ggdmFsdWUgZXF1YWwgc2VsZWN0IGlucHV0IHZhbHVlXG4gICAgaWYgKGZpbHRlcmVkT3B0aW9ucy5zb21lKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICByZXR1cm4gaXRlbVttZXJnZWRGaWVsZE5hbWVzLnZhbHVlXSA9PT0gbWVyZ2VkU2VhcmNoVmFsdWU7XG4gICAgfSkpIHtcbiAgICAgIHJldHVybiBmaWx0ZXJlZE9wdGlvbnM7XG4gICAgfVxuICAgIC8vIEZpbGwgc2VhcmNoIHZhbHVlIGFzIG9wdGlvblxuICAgIHJldHVybiBbY3JlYXRlVGFnT3B0aW9uKG1lcmdlZFNlYXJjaFZhbHVlKV0uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShmaWx0ZXJlZE9wdGlvbnMpKTtcbiAgfSwgW2NyZWF0ZVRhZ09wdGlvbiwgb3B0aW9uRmlsdGVyUHJvcCwgbW9kZSwgZmlsdGVyZWRPcHRpb25zLCBtZXJnZWRTZWFyY2hWYWx1ZSwgbWVyZ2VkRmllbGROYW1lc10pO1xuICB2YXIgc29ydGVyID0gZnVuY3Rpb24gc29ydGVyKGlucHV0T3B0aW9ucykge1xuICAgIHZhciBzb3J0ZWRPcHRpb25zID0gX3RvQ29uc3VtYWJsZUFycmF5KGlucHV0T3B0aW9ucykuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGZpbHRlclNvcnQoYSwgYiwge1xuICAgICAgICBzZWFyY2hWYWx1ZTogbWVyZ2VkU2VhcmNoVmFsdWVcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBzb3J0ZWRPcHRpb25zLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbS5vcHRpb25zKSkge1xuICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBpdGVtKSwge30sIHtcbiAgICAgICAgICBvcHRpb25zOiBpdGVtLm9wdGlvbnMubGVuZ3RoID4gMCA/IHNvcnRlcihpdGVtLm9wdGlvbnMpIDogaXRlbS5vcHRpb25zXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfSk7XG4gIH07XG4gIHZhciBvcmRlcmVkRmlsdGVyZWRPcHRpb25zID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFmaWx0ZXJTb3J0KSB7XG4gICAgICByZXR1cm4gZmlsbGVkU2VhcmNoT3B0aW9ucztcbiAgICB9XG4gICAgcmV0dXJuIHNvcnRlcihmaWxsZWRTZWFyY2hPcHRpb25zKTtcbiAgfSwgW2ZpbGxlZFNlYXJjaE9wdGlvbnMsIGZpbHRlclNvcnQsIG1lcmdlZFNlYXJjaFZhbHVlXSk7XG4gIHZhciBkaXNwbGF5T3B0aW9ucyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmbGF0dGVuT3B0aW9ucyhvcmRlcmVkRmlsdGVyZWRPcHRpb25zLCB7XG4gICAgICBmaWVsZE5hbWVzOiBtZXJnZWRGaWVsZE5hbWVzLFxuICAgICAgY2hpbGRyZW5Bc0RhdGE6IGNoaWxkcmVuQXNEYXRhXG4gICAgfSk7XG4gIH0sIFtvcmRlcmVkRmlsdGVyZWRPcHRpb25zLCBtZXJnZWRGaWVsZE5hbWVzLCBjaGlsZHJlbkFzRGF0YV0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBDaGFuZ2UgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciB0cmlnZ2VyQ2hhbmdlID0gZnVuY3Rpb24gdHJpZ2dlckNoYW5nZSh2YWx1ZXMpIHtcbiAgICB2YXIgbGFiZWxlZFZhbHVlcyA9IGNvbnZlcnQyTGFiZWxWYWx1ZXModmFsdWVzKTtcbiAgICBzZXRJbnRlcm5hbFZhbHVlKGxhYmVsZWRWYWx1ZXMpO1xuICAgIGlmIChvbkNoYW5nZSAmJiAoXG4gICAgLy8gVHJpZ2dlciBldmVudCBvbmx5IHdoZW4gdmFsdWUgY2hhbmdlZFxuICAgIGxhYmVsZWRWYWx1ZXMubGVuZ3RoICE9PSBtZXJnZWRWYWx1ZXMubGVuZ3RoIHx8IGxhYmVsZWRWYWx1ZXMuc29tZShmdW5jdGlvbiAobmV3VmFsLCBpbmRleCkge1xuICAgICAgdmFyIF9tZXJnZWRWYWx1ZXMkaW5kZXg7XG4gICAgICByZXR1cm4gKChfbWVyZ2VkVmFsdWVzJGluZGV4ID0gbWVyZ2VkVmFsdWVzW2luZGV4XSkgPT09IG51bGwgfHwgX21lcmdlZFZhbHVlcyRpbmRleCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX21lcmdlZFZhbHVlcyRpbmRleC52YWx1ZSkgIT09IChuZXdWYWwgPT09IG51bGwgfHwgbmV3VmFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBuZXdWYWwudmFsdWUpO1xuICAgIH0pKSkge1xuICAgICAgdmFyIHJldHVyblZhbHVlcyA9IGxhYmVsSW5WYWx1ZSA/IGxhYmVsZWRWYWx1ZXMgOiBsYWJlbGVkVmFsdWVzLm1hcChmdW5jdGlvbiAodikge1xuICAgICAgICByZXR1cm4gdi52YWx1ZTtcbiAgICAgIH0pO1xuICAgICAgdmFyIHJldHVybk9wdGlvbnMgPSBsYWJlbGVkVmFsdWVzLm1hcChmdW5jdGlvbiAodikge1xuICAgICAgICByZXR1cm4gaW5qZWN0UHJvcHNXaXRoT3B0aW9uKGdldE1peGVkT3B0aW9uKHYudmFsdWUpKTtcbiAgICAgIH0pO1xuICAgICAgb25DaGFuZ2UoXG4gICAgICAvLyBWYWx1ZVxuICAgICAgbXVsdGlwbGUgPyByZXR1cm5WYWx1ZXMgOiByZXR1cm5WYWx1ZXNbMF0sXG4gICAgICAvLyBPcHRpb25cbiAgICAgIG11bHRpcGxlID8gcmV0dXJuT3B0aW9ucyA6IHJldHVybk9wdGlvbnNbMF0pO1xuICAgIH1cbiAgfTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBBY2Nlc3NpYmlsaXR5ID09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUobnVsbCksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgYWN0aXZlVmFsdWUgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldEFjdGl2ZVZhbHVlID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTMgPSBSZWFjdC51c2VTdGF0ZSgwKSxcbiAgICBfUmVhY3QkdXNlU3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlMywgMiksXG4gICAgYWNjZXNzaWJpbGl0eUluZGV4ID0gX1JlYWN0JHVzZVN0YXRlNFswXSxcbiAgICBzZXRBY2Nlc3NpYmlsaXR5SW5kZXggPSBfUmVhY3QkdXNlU3RhdGU0WzFdO1xuICB2YXIgbWVyZ2VkRGVmYXVsdEFjdGl2ZUZpcnN0T3B0aW9uID0gZGVmYXVsdEFjdGl2ZUZpcnN0T3B0aW9uICE9PSB1bmRlZmluZWQgPyBkZWZhdWx0QWN0aXZlRmlyc3RPcHRpb24gOiBtb2RlICE9PSAnY29tYm9ib3gnO1xuICB2YXIgb25BY3RpdmVWYWx1ZSA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChhY3RpdmUsIGluZGV4KSB7XG4gICAgdmFyIF9yZWYzID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fSxcbiAgICAgIF9yZWYzJHNvdXJjZSA9IF9yZWYzLnNvdXJjZSxcbiAgICAgIHNvdXJjZSA9IF9yZWYzJHNvdXJjZSA9PT0gdm9pZCAwID8gJ2tleWJvYXJkJyA6IF9yZWYzJHNvdXJjZTtcbiAgICBzZXRBY2Nlc3NpYmlsaXR5SW5kZXgoaW5kZXgpO1xuICAgIGlmIChiYWNrZmlsbCAmJiBtb2RlID09PSAnY29tYm9ib3gnICYmIGFjdGl2ZSAhPT0gbnVsbCAmJiBzb3VyY2UgPT09ICdrZXlib2FyZCcpIHtcbiAgICAgIHNldEFjdGl2ZVZhbHVlKFN0cmluZyhhY3RpdmUpKTtcbiAgICB9XG4gIH0sIFtiYWNrZmlsbCwgbW9kZV0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gT3B0aW9uTGlzdCA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciB0cmlnZ2VyU2VsZWN0ID0gZnVuY3Rpb24gdHJpZ2dlclNlbGVjdCh2YWwsIHNlbGVjdGVkLCB0eXBlKSB7XG4gICAgdmFyIGdldFNlbGVjdEVudCA9IGZ1bmN0aW9uIGdldFNlbGVjdEVudCgpIHtcbiAgICAgIHZhciBfb3B0aW9uJGtleTI7XG4gICAgICB2YXIgb3B0aW9uID0gZ2V0TWl4ZWRPcHRpb24odmFsKTtcbiAgICAgIHJldHVybiBbbGFiZWxJblZhbHVlID8ge1xuICAgICAgICBsYWJlbDogb3B0aW9uID09PSBudWxsIHx8IG9wdGlvbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9uW21lcmdlZEZpZWxkTmFtZXMubGFiZWxdLFxuICAgICAgICB2YWx1ZTogdmFsLFxuICAgICAgICBrZXk6IChfb3B0aW9uJGtleTIgPSBvcHRpb24gPT09IG51bGwgfHwgb3B0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb24ua2V5KSAhPT0gbnVsbCAmJiBfb3B0aW9uJGtleTIgIT09IHZvaWQgMCA/IF9vcHRpb24ka2V5MiA6IHZhbFxuICAgICAgfSA6IHZhbCwgaW5qZWN0UHJvcHNXaXRoT3B0aW9uKG9wdGlvbildO1xuICAgIH07XG4gICAgaWYgKHNlbGVjdGVkICYmIG9uU2VsZWN0KSB7XG4gICAgICB2YXIgX2dldFNlbGVjdEVudCA9IGdldFNlbGVjdEVudCgpLFxuICAgICAgICBfZ2V0U2VsZWN0RW50MiA9IF9zbGljZWRUb0FycmF5KF9nZXRTZWxlY3RFbnQsIDIpLFxuICAgICAgICB3cmFwcGVkVmFsdWUgPSBfZ2V0U2VsZWN0RW50MlswXSxcbiAgICAgICAgX29wdGlvbiA9IF9nZXRTZWxlY3RFbnQyWzFdO1xuICAgICAgb25TZWxlY3Qod3JhcHBlZFZhbHVlLCBfb3B0aW9uKTtcbiAgICB9IGVsc2UgaWYgKCFzZWxlY3RlZCAmJiBvbkRlc2VsZWN0ICYmIHR5cGUgIT09ICdjbGVhcicpIHtcbiAgICAgIHZhciBfZ2V0U2VsZWN0RW50MyA9IGdldFNlbGVjdEVudCgpLFxuICAgICAgICBfZ2V0U2VsZWN0RW50NCA9IF9zbGljZWRUb0FycmF5KF9nZXRTZWxlY3RFbnQzLCAyKSxcbiAgICAgICAgX3dyYXBwZWRWYWx1ZSA9IF9nZXRTZWxlY3RFbnQ0WzBdLFxuICAgICAgICBfb3B0aW9uMiA9IF9nZXRTZWxlY3RFbnQ0WzFdO1xuICAgICAgb25EZXNlbGVjdChfd3JhcHBlZFZhbHVlLCBfb3B0aW9uMik7XG4gICAgfVxuICB9O1xuXG4gIC8vIFVzZWQgZm9yIE9wdGlvbkxpc3Qgc2VsZWN0aW9uXG4gIHZhciBvbkludGVybmFsU2VsZWN0ID0gdXNlUmVmRnVuYyhmdW5jdGlvbiAodmFsLCBpbmZvKSB7XG4gICAgdmFyIGNsb25lVmFsdWVzO1xuXG4gICAgLy8gU2luZ2xlIG1vZGUgYWx3YXlzIHRyaWdnZXIgc2VsZWN0IG9ubHkgd2l0aCBvcHRpb24gbGlzdFxuICAgIHZhciBtZXJnZWRTZWxlY3QgPSBtdWx0aXBsZSA/IGluZm8uc2VsZWN0ZWQgOiB0cnVlO1xuICAgIGlmIChtZXJnZWRTZWxlY3QpIHtcbiAgICAgIGNsb25lVmFsdWVzID0gbXVsdGlwbGUgPyBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KG1lcmdlZFZhbHVlcyksIFt2YWxdKSA6IFt2YWxdO1xuICAgIH0gZWxzZSB7XG4gICAgICBjbG9uZVZhbHVlcyA9IG1lcmdlZFZhbHVlcy5maWx0ZXIoZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgcmV0dXJuIHYudmFsdWUgIT09IHZhbDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0cmlnZ2VyQ2hhbmdlKGNsb25lVmFsdWVzKTtcbiAgICB0cmlnZ2VyU2VsZWN0KHZhbCwgbWVyZ2VkU2VsZWN0KTtcblxuICAgIC8vIENsZWFuIHNlYXJjaCB2YWx1ZSBpZiBzaW5nbGUgb3IgY29uZmlndXJlZFxuICAgIGlmIChtb2RlID09PSAnY29tYm9ib3gnKSB7XG4gICAgICAvLyBzZXRTZWFyY2hWYWx1ZShTdHJpbmcodmFsKSk7XG4gICAgICBzZXRBY3RpdmVWYWx1ZSgnJyk7XG4gICAgfSBlbHNlIGlmICghaXNNdWx0aXBsZSB8fCBhdXRvQ2xlYXJTZWFyY2hWYWx1ZSkge1xuICAgICAgc2V0U2VhcmNoVmFsdWUoJycpO1xuICAgICAgc2V0QWN0aXZlVmFsdWUoJycpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT0gRGlzcGxheSBDaGFuZ2UgPT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQmFzZVNlbGVjdCBkaXNwbGF5IHZhbHVlcyBjaGFuZ2VcbiAgdmFyIG9uRGlzcGxheVZhbHVlc0NoYW5nZSA9IGZ1bmN0aW9uIG9uRGlzcGxheVZhbHVlc0NoYW5nZShuZXh0VmFsdWVzLCBpbmZvKSB7XG4gICAgdHJpZ2dlckNoYW5nZShuZXh0VmFsdWVzKTtcbiAgICB2YXIgdHlwZSA9IGluZm8udHlwZSxcbiAgICAgIHZhbHVlcyA9IGluZm8udmFsdWVzO1xuICAgIGlmICh0eXBlID09PSAncmVtb3ZlJyB8fCB0eXBlID09PSAnY2xlYXInKSB7XG4gICAgICB2YWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICB0cmlnZ2VyU2VsZWN0KGl0ZW0udmFsdWUsIGZhbHNlLCB0eXBlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gU2VhcmNoID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgb25JbnRlcm5hbFNlYXJjaCA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxTZWFyY2goc2VhcmNoVGV4dCwgaW5mbykge1xuICAgIHNldFNlYXJjaFZhbHVlKHNlYXJjaFRleHQpO1xuICAgIHNldEFjdGl2ZVZhbHVlKG51bGwpO1xuXG4gICAgLy8gW1N1Ym1pdF0gVGFnIG1vZGUgc2hvdWxkIGZsdXNoIGlucHV0XG4gICAgaWYgKGluZm8uc291cmNlID09PSAnc3VibWl0Jykge1xuICAgICAgdmFyIGZvcm1hdHRlZCA9IChzZWFyY2hUZXh0IHx8ICcnKS50cmltKCk7XG4gICAgICAvLyBwcmV2ZW50IGVtcHR5IHRhZ3MgZnJvbSBhcHBlYXJpbmcgd2hlbiB5b3UgY2xpY2sgdGhlIEVudGVyIGJ1dHRvblxuICAgICAgaWYgKGZvcm1hdHRlZCkge1xuICAgICAgICB2YXIgbmV3UmF3VmFsdWVzID0gQXJyYXkuZnJvbShuZXcgU2V0KFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkocmF3VmFsdWVzKSwgW2Zvcm1hdHRlZF0pKSk7XG4gICAgICAgIHRyaWdnZXJDaGFuZ2UobmV3UmF3VmFsdWVzKTtcbiAgICAgICAgdHJpZ2dlclNlbGVjdChmb3JtYXR0ZWQsIHRydWUpO1xuICAgICAgICBzZXRTZWFyY2hWYWx1ZSgnJyk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpbmZvLnNvdXJjZSAhPT0gJ2JsdXInKSB7XG4gICAgICBpZiAobW9kZSA9PT0gJ2NvbWJvYm94Jykge1xuICAgICAgICB0cmlnZ2VyQ2hhbmdlKHNlYXJjaFRleHQpO1xuICAgICAgfVxuICAgICAgb25TZWFyY2ggPT09IG51bGwgfHwgb25TZWFyY2ggPT09IHZvaWQgMCB8fCBvblNlYXJjaChzZWFyY2hUZXh0KTtcbiAgICB9XG4gIH07XG4gIHZhciBvbkludGVybmFsU2VhcmNoU3BsaXQgPSBmdW5jdGlvbiBvbkludGVybmFsU2VhcmNoU3BsaXQod29yZHMpIHtcbiAgICB2YXIgcGF0Y2hWYWx1ZXMgPSB3b3JkcztcbiAgICBpZiAobW9kZSAhPT0gJ3RhZ3MnKSB7XG4gICAgICBwYXRjaFZhbHVlcyA9IHdvcmRzLm1hcChmdW5jdGlvbiAod29yZCkge1xuICAgICAgICB2YXIgb3B0ID0gbGFiZWxPcHRpb25zLmdldCh3b3JkKTtcbiAgICAgICAgcmV0dXJuIG9wdCA9PT0gbnVsbCB8fCBvcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdC52YWx1ZTtcbiAgICAgIH0pLmZpbHRlcihmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgIHJldHVybiB2YWwgIT09IHVuZGVmaW5lZDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB2YXIgbmV3UmF3VmFsdWVzID0gQXJyYXkuZnJvbShuZXcgU2V0KFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkocmF3VmFsdWVzKSwgX3RvQ29uc3VtYWJsZUFycmF5KHBhdGNoVmFsdWVzKSkpKTtcbiAgICB0cmlnZ2VyQ2hhbmdlKG5ld1Jhd1ZhbHVlcyk7XG4gICAgbmV3UmF3VmFsdWVzLmZvckVhY2goZnVuY3Rpb24gKG5ld1Jhd1ZhbHVlKSB7XG4gICAgICB0cmlnZ2VyU2VsZWN0KG5ld1Jhd1ZhbHVlLCB0cnVlKTtcbiAgICB9KTtcbiAgfTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBDb250ZXh0ID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgc2VsZWN0Q29udGV4dCA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciByZWFsVmlydHVhbCA9IHZpcnR1YWwgIT09IGZhbHNlICYmIGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCAhPT0gZmFsc2U7XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcGFyc2VkT3B0aW9ucyksIHt9LCB7XG4gICAgICBmbGF0dGVuT3B0aW9uczogZGlzcGxheU9wdGlvbnMsXG4gICAgICBvbkFjdGl2ZVZhbHVlOiBvbkFjdGl2ZVZhbHVlLFxuICAgICAgZGVmYXVsdEFjdGl2ZUZpcnN0T3B0aW9uOiBtZXJnZWREZWZhdWx0QWN0aXZlRmlyc3RPcHRpb24sXG4gICAgICBvblNlbGVjdDogb25JbnRlcm5hbFNlbGVjdCxcbiAgICAgIG1lbnVJdGVtU2VsZWN0ZWRJY29uOiBtZW51SXRlbVNlbGVjdGVkSWNvbixcbiAgICAgIHJhd1ZhbHVlczogcmF3VmFsdWVzLFxuICAgICAgZmllbGROYW1lczogbWVyZ2VkRmllbGROYW1lcyxcbiAgICAgIHZpcnR1YWw6IHJlYWxWaXJ0dWFsLFxuICAgICAgZGlyZWN0aW9uOiBkaXJlY3Rpb24sXG4gICAgICBsaXN0SGVpZ2h0OiBsaXN0SGVpZ2h0LFxuICAgICAgbGlzdEl0ZW1IZWlnaHQ6IGxpc3RJdGVtSGVpZ2h0LFxuICAgICAgY2hpbGRyZW5Bc0RhdGE6IGNoaWxkcmVuQXNEYXRhLFxuICAgICAgbWF4Q291bnQ6IG1heENvdW50LFxuICAgICAgb3B0aW9uUmVuZGVyOiBvcHRpb25SZW5kZXJcbiAgICB9KTtcbiAgfSwgW21heENvdW50LCBwYXJzZWRPcHRpb25zLCBkaXNwbGF5T3B0aW9ucywgb25BY3RpdmVWYWx1ZSwgbWVyZ2VkRGVmYXVsdEFjdGl2ZUZpcnN0T3B0aW9uLCBvbkludGVybmFsU2VsZWN0LCBtZW51SXRlbVNlbGVjdGVkSWNvbiwgcmF3VmFsdWVzLCBtZXJnZWRGaWVsZE5hbWVzLCB2aXJ0dWFsLCBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGgsIGRpcmVjdGlvbiwgbGlzdEhlaWdodCwgbGlzdEl0ZW1IZWlnaHQsIGNoaWxkcmVuQXNEYXRhLCBvcHRpb25SZW5kZXJdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBXYXJuaW5nID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHdhcm5pbmdQcm9wcyhwcm9wcyk7XG4gICAgd2FybmluZ051bGxPcHRpb25zKG1lcmdlZE9wdGlvbnMsIG1lcmdlZEZpZWxkTmFtZXMpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gPT0gICAgICAgICAgICAgICAgICAgICAgICAgIFJlbmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgPT1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNlbGVjdENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogc2VsZWN0Q29udGV4dFxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChCYXNlU2VsZWN0LCBfZXh0ZW5kcyh7fSwgcmVzdFByb3BzLCB7XG4gICAgLy8gPj4+IE1JU0NcbiAgICBpZDogbWVyZ2VkSWQsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgcmVmOiByZWYsXG4gICAgb21pdERvbVByb3BzOiBPTUlUX0RPTV9QUk9QUyxcbiAgICBtb2RlOiBtb2RlXG4gICAgLy8gPj4+IFZhbHVlc1xuICAgICxcbiAgICBkaXNwbGF5VmFsdWVzOiBkaXNwbGF5VmFsdWVzLFxuICAgIG9uRGlzcGxheVZhbHVlc0NoYW5nZTogb25EaXNwbGF5VmFsdWVzQ2hhbmdlXG4gICAgLy8gPj4+IFRyaWdnZXJcbiAgICAsXG4gICAgZGlyZWN0aW9uOiBkaXJlY3Rpb25cbiAgICAvLyA+Pj4gU2VhcmNoXG4gICAgLFxuICAgIHNlYXJjaFZhbHVlOiBtZXJnZWRTZWFyY2hWYWx1ZSxcbiAgICBvblNlYXJjaDogb25JbnRlcm5hbFNlYXJjaCxcbiAgICBhdXRvQ2xlYXJTZWFyY2hWYWx1ZTogYXV0b0NsZWFyU2VhcmNoVmFsdWUsXG4gICAgb25TZWFyY2hTcGxpdDogb25JbnRlcm5hbFNlYXJjaFNwbGl0LFxuICAgIGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aDogZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoXG4gICAgLy8gPj4+IE9wdGlvbkxpc3RcbiAgICAsXG4gICAgT3B0aW9uTGlzdDogT3B0aW9uTGlzdCxcbiAgICBlbXB0eU9wdGlvbnM6ICFkaXNwbGF5T3B0aW9ucy5sZW5ndGhcbiAgICAvLyA+Pj4gQWNjZXNzaWJpbGl0eVxuICAgICxcbiAgICBhY3RpdmVWYWx1ZTogYWN0aXZlVmFsdWUsXG4gICAgYWN0aXZlRGVzY2VuZGFudElkOiBcIlwiLmNvbmNhdChtZXJnZWRJZCwgXCJfbGlzdF9cIikuY29uY2F0KGFjY2Vzc2liaWxpdHlJbmRleClcbiAgfSkpKTtcbn0pO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgU2VsZWN0LmRpc3BsYXlOYW1lID0gJ1NlbGVjdCc7XG59XG52YXIgVHlwZWRTZWxlY3QgPSBTZWxlY3Q7XG5UeXBlZFNlbGVjdC5PcHRpb24gPSBPcHRpb247XG5UeXBlZFNlbGVjdC5PcHRHcm91cCA9IE9wdEdyb3VwO1xuZXhwb3J0IGRlZmF1bHQgVHlwZWRTZWxlY3Q7IiwgImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcImlkXCIsIFwicHJlZml4Q2xzXCIsIFwiY2xhc3NOYW1lXCIsIFwic2hvd1NlYXJjaFwiLCBcInRhZ1JlbmRlclwiLCBcImRpcmVjdGlvblwiLCBcIm9taXREb21Qcm9wc1wiLCBcImRpc3BsYXlWYWx1ZXNcIiwgXCJvbkRpc3BsYXlWYWx1ZXNDaGFuZ2VcIiwgXCJlbXB0eU9wdGlvbnNcIiwgXCJub3RGb3VuZENvbnRlbnRcIiwgXCJvbkNsZWFyXCIsIFwibW9kZVwiLCBcImRpc2FibGVkXCIsIFwibG9hZGluZ1wiLCBcImdldElucHV0RWxlbWVudFwiLCBcImdldFJhd0lucHV0RWxlbWVudFwiLCBcIm9wZW5cIiwgXCJkZWZhdWx0T3BlblwiLCBcIm9uRHJvcGRvd25WaXNpYmxlQ2hhbmdlXCIsIFwiYWN0aXZlVmFsdWVcIiwgXCJvbkFjdGl2ZVZhbHVlQ2hhbmdlXCIsIFwiYWN0aXZlRGVzY2VuZGFudElkXCIsIFwic2VhcmNoVmFsdWVcIiwgXCJhdXRvQ2xlYXJTZWFyY2hWYWx1ZVwiLCBcIm9uU2VhcmNoXCIsIFwib25TZWFyY2hTcGxpdFwiLCBcInRva2VuU2VwYXJhdG9yc1wiLCBcImFsbG93Q2xlYXJcIiwgXCJwcmVmaXhcIiwgXCJzdWZmaXhJY29uXCIsIFwiY2xlYXJJY29uXCIsIFwiT3B0aW9uTGlzdFwiLCBcImFuaW1hdGlvblwiLCBcInRyYW5zaXRpb25OYW1lXCIsIFwiZHJvcGRvd25TdHlsZVwiLCBcImRyb3Bkb3duQ2xhc3NOYW1lXCIsIFwiZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoXCIsIFwiZHJvcGRvd25SZW5kZXJcIiwgXCJkcm9wZG93bkFsaWduXCIsIFwicGxhY2VtZW50XCIsIFwiYnVpbHRpblBsYWNlbWVudHNcIiwgXCJnZXRQb3B1cENvbnRhaW5lclwiLCBcInNob3dBY3Rpb25cIiwgXCJvbkZvY3VzXCIsIFwib25CbHVyXCIsIFwib25LZXlVcFwiLCBcIm9uS2V5RG93blwiLCBcIm9uTW91c2VEb3duXCJdO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgdXNlTGF5b3V0RWZmZWN0IGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZUxheW91dEVmZmVjdFwiO1xuaW1wb3J0IHVzZU1lcmdlZFN0YXRlIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZU1lcmdlZFN0YXRlXCI7XG5pbXBvcnQgaXNNb2JpbGUgZnJvbSBcInJjLXV0aWwvZXMvaXNNb2JpbGVcIjtcbmltcG9ydCB7IHVzZUNvbXBvc2VSZWYgfSBmcm9tIFwicmMtdXRpbC9lcy9yZWZcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUFsbG93Q2xlYXIgfSBmcm9tIFwiLi4vaG9va3MvdXNlQWxsb3dDbGVhclwiO1xuaW1wb3J0IHsgQmFzZVNlbGVjdENvbnRleHQgfSBmcm9tIFwiLi4vaG9va3MvdXNlQmFzZVByb3BzXCI7XG5pbXBvcnQgdXNlRGVsYXlSZXNldCBmcm9tIFwiLi4vaG9va3MvdXNlRGVsYXlSZXNldFwiO1xuaW1wb3J0IHVzZUxvY2sgZnJvbSBcIi4uL2hvb2tzL3VzZUxvY2tcIjtcbmltcG9ydCB1c2VTZWxlY3RUcmlnZ2VyQ29udHJvbCBmcm9tIFwiLi4vaG9va3MvdXNlU2VsZWN0VHJpZ2dlckNvbnRyb2xcIjtcbmltcG9ydCBTZWxlY3RvciBmcm9tIFwiLi4vU2VsZWN0b3JcIjtcbmltcG9ydCBTZWxlY3RUcmlnZ2VyIGZyb20gXCIuLi9TZWxlY3RUcmlnZ2VyXCI7XG5pbXBvcnQgVHJhbnNCdG4gZnJvbSBcIi4uL1RyYW5zQnRuXCI7XG5pbXBvcnQgeyBnZXRTZXBhcmF0ZWRDb250ZW50LCBpc1ZhbGlkQ291bnQgfSBmcm9tIFwiLi4vdXRpbHMvdmFsdWVVdGlsXCI7XG5pbXBvcnQgU2VsZWN0Q29udGV4dCBmcm9tIFwiLi4vU2VsZWN0Q29udGV4dFwiO1xuaW1wb3J0IFBvbGl0ZSBmcm9tIFwiLi9Qb2xpdGVcIjtcbnZhciBERUZBVUxUX09NSVRfUFJPUFMgPSBbJ3ZhbHVlJywgJ29uQ2hhbmdlJywgJ3JlbW92ZUljb24nLCAncGxhY2Vob2xkZXInLCAnYXV0b0ZvY3VzJywgJ21heFRhZ0NvdW50JywgJ21heFRhZ1RleHRMZW5ndGgnLCAnbWF4VGFnUGxhY2Vob2xkZXInLCAnY2hvaWNlVHJhbnNpdGlvbk5hbWUnLCAnb25JbnB1dEtleURvd24nLCAnb25Qb3B1cFNjcm9sbCcsICd0YWJJbmRleCddO1xuZXhwb3J0IHZhciBpc011bHRpcGxlID0gZnVuY3Rpb24gaXNNdWx0aXBsZShtb2RlKSB7XG4gIHJldHVybiBtb2RlID09PSAndGFncycgfHwgbW9kZSA9PT0gJ211bHRpcGxlJztcbn07XG52YXIgQmFzZVNlbGVjdCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBfY3VzdG9taXplUmF3SW5wdXRFbGU7XG4gIHZhciBpZCA9IHByb3BzLmlkLFxuICAgIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgc2hvd1NlYXJjaCA9IHByb3BzLnNob3dTZWFyY2gsXG4gICAgdGFnUmVuZGVyID0gcHJvcHMudGFnUmVuZGVyLFxuICAgIGRpcmVjdGlvbiA9IHByb3BzLmRpcmVjdGlvbixcbiAgICBvbWl0RG9tUHJvcHMgPSBwcm9wcy5vbWl0RG9tUHJvcHMsXG4gICAgZGlzcGxheVZhbHVlcyA9IHByb3BzLmRpc3BsYXlWYWx1ZXMsXG4gICAgb25EaXNwbGF5VmFsdWVzQ2hhbmdlID0gcHJvcHMub25EaXNwbGF5VmFsdWVzQ2hhbmdlLFxuICAgIGVtcHR5T3B0aW9ucyA9IHByb3BzLmVtcHR5T3B0aW9ucyxcbiAgICBfcHJvcHMkbm90Rm91bmRDb250ZW4gPSBwcm9wcy5ub3RGb3VuZENvbnRlbnQsXG4gICAgbm90Rm91bmRDb250ZW50ID0gX3Byb3BzJG5vdEZvdW5kQ29udGVuID09PSB2b2lkIDAgPyAnTm90IEZvdW5kJyA6IF9wcm9wcyRub3RGb3VuZENvbnRlbixcbiAgICBvbkNsZWFyID0gcHJvcHMub25DbGVhcixcbiAgICBtb2RlID0gcHJvcHMubW9kZSxcbiAgICBkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkLFxuICAgIGxvYWRpbmcgPSBwcm9wcy5sb2FkaW5nLFxuICAgIGdldElucHV0RWxlbWVudCA9IHByb3BzLmdldElucHV0RWxlbWVudCxcbiAgICBnZXRSYXdJbnB1dEVsZW1lbnQgPSBwcm9wcy5nZXRSYXdJbnB1dEVsZW1lbnQsXG4gICAgb3BlbiA9IHByb3BzLm9wZW4sXG4gICAgZGVmYXVsdE9wZW4gPSBwcm9wcy5kZWZhdWx0T3BlbixcbiAgICBvbkRyb3Bkb3duVmlzaWJsZUNoYW5nZSA9IHByb3BzLm9uRHJvcGRvd25WaXNpYmxlQ2hhbmdlLFxuICAgIGFjdGl2ZVZhbHVlID0gcHJvcHMuYWN0aXZlVmFsdWUsXG4gICAgb25BY3RpdmVWYWx1ZUNoYW5nZSA9IHByb3BzLm9uQWN0aXZlVmFsdWVDaGFuZ2UsXG4gICAgYWN0aXZlRGVzY2VuZGFudElkID0gcHJvcHMuYWN0aXZlRGVzY2VuZGFudElkLFxuICAgIHNlYXJjaFZhbHVlID0gcHJvcHMuc2VhcmNoVmFsdWUsXG4gICAgYXV0b0NsZWFyU2VhcmNoVmFsdWUgPSBwcm9wcy5hdXRvQ2xlYXJTZWFyY2hWYWx1ZSxcbiAgICBvblNlYXJjaCA9IHByb3BzLm9uU2VhcmNoLFxuICAgIG9uU2VhcmNoU3BsaXQgPSBwcm9wcy5vblNlYXJjaFNwbGl0LFxuICAgIHRva2VuU2VwYXJhdG9ycyA9IHByb3BzLnRva2VuU2VwYXJhdG9ycyxcbiAgICBhbGxvd0NsZWFyID0gcHJvcHMuYWxsb3dDbGVhcixcbiAgICBwcmVmaXggPSBwcm9wcy5wcmVmaXgsXG4gICAgc3VmZml4SWNvbiA9IHByb3BzLnN1ZmZpeEljb24sXG4gICAgY2xlYXJJY29uID0gcHJvcHMuY2xlYXJJY29uLFxuICAgIE9wdGlvbkxpc3QgPSBwcm9wcy5PcHRpb25MaXN0LFxuICAgIGFuaW1hdGlvbiA9IHByb3BzLmFuaW1hdGlvbixcbiAgICB0cmFuc2l0aW9uTmFtZSA9IHByb3BzLnRyYW5zaXRpb25OYW1lLFxuICAgIGRyb3Bkb3duU3R5bGUgPSBwcm9wcy5kcm9wZG93blN0eWxlLFxuICAgIGRyb3Bkb3duQ2xhc3NOYW1lID0gcHJvcHMuZHJvcGRvd25DbGFzc05hbWUsXG4gICAgZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoID0gcHJvcHMuZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoLFxuICAgIGRyb3Bkb3duUmVuZGVyID0gcHJvcHMuZHJvcGRvd25SZW5kZXIsXG4gICAgZHJvcGRvd25BbGlnbiA9IHByb3BzLmRyb3Bkb3duQWxpZ24sXG4gICAgcGxhY2VtZW50ID0gcHJvcHMucGxhY2VtZW50LFxuICAgIGJ1aWx0aW5QbGFjZW1lbnRzID0gcHJvcHMuYnVpbHRpblBsYWNlbWVudHMsXG4gICAgZ2V0UG9wdXBDb250YWluZXIgPSBwcm9wcy5nZXRQb3B1cENvbnRhaW5lcixcbiAgICBfcHJvcHMkc2hvd0FjdGlvbiA9IHByb3BzLnNob3dBY3Rpb24sXG4gICAgc2hvd0FjdGlvbiA9IF9wcm9wcyRzaG93QWN0aW9uID09PSB2b2lkIDAgPyBbXSA6IF9wcm9wcyRzaG93QWN0aW9uLFxuICAgIG9uRm9jdXMgPSBwcm9wcy5vbkZvY3VzLFxuICAgIG9uQmx1ciA9IHByb3BzLm9uQmx1cixcbiAgICBvbktleVVwID0gcHJvcHMub25LZXlVcCxcbiAgICBvbktleURvd24gPSBwcm9wcy5vbktleURvd24sXG4gICAgb25Nb3VzZURvd24gPSBwcm9wcy5vbk1vdXNlRG93bixcbiAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIF9leGNsdWRlZCk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IE1JU0MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBtdWx0aXBsZSA9IGlzTXVsdGlwbGUobW9kZSk7XG4gIHZhciBtZXJnZWRTaG93U2VhcmNoID0gKHNob3dTZWFyY2ggIT09IHVuZGVmaW5lZCA/IHNob3dTZWFyY2ggOiBtdWx0aXBsZSkgfHwgbW9kZSA9PT0gJ2NvbWJvYm94JztcbiAgdmFyIGRvbVByb3BzID0gX29iamVjdFNwcmVhZCh7fSwgcmVzdFByb3BzKTtcbiAgREVGQVVMVF9PTUlUX1BST1BTLmZvckVhY2goZnVuY3Rpb24gKHByb3BOYW1lKSB7XG4gICAgZGVsZXRlIGRvbVByb3BzW3Byb3BOYW1lXTtcbiAgfSk7XG4gIG9taXREb21Qcm9wcyA9PT0gbnVsbCB8fCBvbWl0RG9tUHJvcHMgPT09IHZvaWQgMCB8fCBvbWl0RG9tUHJvcHMuZm9yRWFjaChmdW5jdGlvbiAocHJvcE5hbWUpIHtcbiAgICBkZWxldGUgZG9tUHJvcHNbcHJvcE5hbWVdO1xuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBNb2JpbGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBtb2JpbGUgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldE1vYmlsZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgLy8gT25seSB1cGRhdGUgb24gdGhlIGNsaWVudCBzaWRlXG4gICAgc2V0TW9iaWxlKGlzTW9iaWxlKCkpO1xuICB9LCBbXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlZnMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBjb250YWluZXJSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHZhciBzZWxlY3RvckRvbVJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIHRyaWdnZXJSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHZhciBzZWxlY3RvclJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIGxpc3RSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHZhciBibHVyUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcblxuICAvKiogVXNlZCBmb3IgY29tcG9uZW50IGZvY3VzZWQgbWFuYWdlbWVudCAqL1xuICB2YXIgX3VzZURlbGF5UmVzZXQgPSB1c2VEZWxheVJlc2V0KCksXG4gICAgX3VzZURlbGF5UmVzZXQyID0gX3NsaWNlZFRvQXJyYXkoX3VzZURlbGF5UmVzZXQsIDMpLFxuICAgIG1vY2tGb2N1c2VkID0gX3VzZURlbGF5UmVzZXQyWzBdLFxuICAgIHNldE1vY2tGb2N1c2VkID0gX3VzZURlbGF5UmVzZXQyWzFdLFxuICAgIGNhbmNlbFNldE1vY2tGb2N1c2VkID0gX3VzZURlbGF5UmVzZXQyWzJdO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBJbXBlcmF0aXZlID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBfc2VsZWN0b3JSZWYkY3VycmVudCwgX3NlbGVjdG9yUmVmJGN1cnJlbnQyO1xuICAgIHJldHVybiB7XG4gICAgICBmb2N1czogKF9zZWxlY3RvclJlZiRjdXJyZW50ID0gc2VsZWN0b3JSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX3NlbGVjdG9yUmVmJGN1cnJlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9zZWxlY3RvclJlZiRjdXJyZW50LmZvY3VzLFxuICAgICAgYmx1cjogKF9zZWxlY3RvclJlZiRjdXJyZW50MiA9IHNlbGVjdG9yUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9zZWxlY3RvclJlZiRjdXJyZW50MiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3NlbGVjdG9yUmVmJGN1cnJlbnQyLmJsdXIsXG4gICAgICBzY3JvbGxUbzogZnVuY3Rpb24gc2Nyb2xsVG8oYXJnKSB7XG4gICAgICAgIHZhciBfbGlzdFJlZiRjdXJyZW50O1xuICAgICAgICByZXR1cm4gKF9saXN0UmVmJGN1cnJlbnQgPSBsaXN0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9saXN0UmVmJGN1cnJlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9saXN0UmVmJGN1cnJlbnQuc2Nyb2xsVG8oYXJnKTtcbiAgICAgIH0sXG4gICAgICBuYXRpdmVFbGVtZW50OiBjb250YWluZXJSZWYuY3VycmVudCB8fCBzZWxlY3RvckRvbVJlZi5jdXJyZW50XG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gU2VhcmNoIFZhbHVlID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBtZXJnZWRTZWFyY2hWYWx1ZSA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBfZGlzcGxheVZhbHVlcyQ7XG4gICAgaWYgKG1vZGUgIT09ICdjb21ib2JveCcpIHtcbiAgICAgIHJldHVybiBzZWFyY2hWYWx1ZTtcbiAgICB9XG4gICAgdmFyIHZhbCA9IChfZGlzcGxheVZhbHVlcyQgPSBkaXNwbGF5VmFsdWVzWzBdKSA9PT0gbnVsbCB8fCBfZGlzcGxheVZhbHVlcyQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kaXNwbGF5VmFsdWVzJC52YWx1ZTtcbiAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbCA9PT0gJ251bWJlcicgPyBTdHJpbmcodmFsKSA6ICcnO1xuICB9LCBbc2VhcmNoVmFsdWUsIG1vZGUsIGRpc3BsYXlWYWx1ZXNdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBDdXN0b20gSW5wdXQgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gT25seSB3b3JrcyBpbiBgY29tYm9ib3hgXG4gIHZhciBjdXN0b21pemVJbnB1dEVsZW1lbnQgPSBtb2RlID09PSAnY29tYm9ib3gnICYmIHR5cGVvZiBnZXRJbnB1dEVsZW1lbnQgPT09ICdmdW5jdGlvbicgJiYgZ2V0SW5wdXRFbGVtZW50KCkgfHwgbnVsbDtcblxuICAvLyBVc2VkIGZvciBjdXN0b21pemUgcmVwbGFjZW1lbnQgZm9yIGByYy1jYXNjYWRlcmBcbiAgdmFyIGN1c3RvbWl6ZVJhd0lucHV0RWxlbWVudCA9IHR5cGVvZiBnZXRSYXdJbnB1dEVsZW1lbnQgPT09ICdmdW5jdGlvbicgJiYgZ2V0UmF3SW5wdXRFbGVtZW50KCk7XG4gIHZhciBjdXN0b21pemVSYXdJbnB1dFJlZiA9IHVzZUNvbXBvc2VSZWYoc2VsZWN0b3JEb21SZWYsIGN1c3RvbWl6ZVJhd0lucHV0RWxlbWVudCA9PT0gbnVsbCB8fCBjdXN0b21pemVSYXdJbnB1dEVsZW1lbnQgPT09IHZvaWQgMCB8fCAoX2N1c3RvbWl6ZVJhd0lucHV0RWxlID0gY3VzdG9taXplUmF3SW5wdXRFbGVtZW50LnByb3BzKSA9PT0gbnVsbCB8fCBfY3VzdG9taXplUmF3SW5wdXRFbGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jdXN0b21pemVSYXdJbnB1dEVsZS5yZWYpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBPcGVuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTU1Igbm90IHN1cHBvcnQgUG9ydGFsIHdoaWNoIG1lYW5zIHdlIG5lZWQgZGVsYXkgYG9wZW5gIGZvciB0aGUgZmlyc3QgdGltZSByZW5kZXJcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTMgPSBSZWFjdC51c2VTdGF0ZShmYWxzZSksXG4gICAgX1JlYWN0JHVzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTMsIDIpLFxuICAgIHJlbmRlcmVkID0gX1JlYWN0JHVzZVN0YXRlNFswXSxcbiAgICBzZXRSZW5kZXJlZCA9IF9SZWFjdCR1c2VTdGF0ZTRbMV07XG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgc2V0UmVuZGVyZWQodHJ1ZSk7XG4gIH0sIFtdKTtcbiAgdmFyIF91c2VNZXJnZWRTdGF0ZSA9IHVzZU1lcmdlZFN0YXRlKGZhbHNlLCB7XG4gICAgICBkZWZhdWx0VmFsdWU6IGRlZmF1bHRPcGVuLFxuICAgICAgdmFsdWU6IG9wZW5cbiAgICB9KSxcbiAgICBfdXNlTWVyZ2VkU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZU1lcmdlZFN0YXRlLCAyKSxcbiAgICBpbm5lck9wZW4gPSBfdXNlTWVyZ2VkU3RhdGUyWzBdLFxuICAgIHNldElubmVyT3BlbiA9IF91c2VNZXJnZWRTdGF0ZTJbMV07XG4gIHZhciBtZXJnZWRPcGVuID0gcmVuZGVyZWQgPyBpbm5lck9wZW4gOiBmYWxzZTtcblxuICAvLyBOb3QgdHJpZ2dlciBgb3BlbmAgaW4gYGNvbWJvYm94YCB3aGVuIGBub3RGb3VuZENvbnRlbnRgIGlzIGVtcHR5XG4gIHZhciBlbXB0eUxpc3RDb250ZW50ID0gIW5vdEZvdW5kQ29udGVudCAmJiBlbXB0eU9wdGlvbnM7XG4gIGlmIChkaXNhYmxlZCB8fCBlbXB0eUxpc3RDb250ZW50ICYmIG1lcmdlZE9wZW4gJiYgbW9kZSA9PT0gJ2NvbWJvYm94Jykge1xuICAgIG1lcmdlZE9wZW4gPSBmYWxzZTtcbiAgfVxuICB2YXIgdHJpZ2dlck9wZW4gPSBlbXB0eUxpc3RDb250ZW50ID8gZmFsc2UgOiBtZXJnZWRPcGVuO1xuICB2YXIgb25Ub2dnbGVPcGVuID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKG5ld09wZW4pIHtcbiAgICB2YXIgbmV4dE9wZW4gPSBuZXdPcGVuICE9PSB1bmRlZmluZWQgPyBuZXdPcGVuIDogIW1lcmdlZE9wZW47XG4gICAgaWYgKCFkaXNhYmxlZCkge1xuICAgICAgc2V0SW5uZXJPcGVuKG5leHRPcGVuKTtcbiAgICAgIGlmIChtZXJnZWRPcGVuICE9PSBuZXh0T3Blbikge1xuICAgICAgICBvbkRyb3Bkb3duVmlzaWJsZUNoYW5nZSA9PT0gbnVsbCB8fCBvbkRyb3Bkb3duVmlzaWJsZUNoYW5nZSA9PT0gdm9pZCAwIHx8IG9uRHJvcGRvd25WaXNpYmxlQ2hhbmdlKG5leHRPcGVuKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtkaXNhYmxlZCwgbWVyZ2VkT3Blbiwgc2V0SW5uZXJPcGVuLCBvbkRyb3Bkb3duVmlzaWJsZUNoYW5nZV0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNlYXJjaCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgdG9rZW5XaXRoRW50ZXIgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gKHRva2VuU2VwYXJhdG9ycyB8fCBbXSkuc29tZShmdW5jdGlvbiAodG9rZW5TZXBhcmF0b3IpIHtcbiAgICAgIHJldHVybiBbJ1xcbicsICdcXHJcXG4nXS5pbmNsdWRlcyh0b2tlblNlcGFyYXRvcik7XG4gICAgfSk7XG4gIH0sIFt0b2tlblNlcGFyYXRvcnNdKTtcbiAgdmFyIF9yZWYgPSBSZWFjdC51c2VDb250ZXh0KFNlbGVjdENvbnRleHQpIHx8IHt9LFxuICAgIG1heENvdW50ID0gX3JlZi5tYXhDb3VudCxcbiAgICByYXdWYWx1ZXMgPSBfcmVmLnJhd1ZhbHVlcztcbiAgdmFyIG9uSW50ZXJuYWxTZWFyY2ggPSBmdW5jdGlvbiBvbkludGVybmFsU2VhcmNoKHNlYXJjaFRleHQsIGZyb21UeXBpbmcsIGlzQ29tcG9zaXRpbmcpIHtcbiAgICBpZiAobXVsdGlwbGUgJiYgaXNWYWxpZENvdW50KG1heENvdW50KSAmJiAocmF3VmFsdWVzID09PSBudWxsIHx8IHJhd1ZhbHVlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmF3VmFsdWVzLnNpemUpID49IG1heENvdW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciByZXQgPSB0cnVlO1xuICAgIHZhciBuZXdTZWFyY2hUZXh0ID0gc2VhcmNoVGV4dDtcbiAgICBvbkFjdGl2ZVZhbHVlQ2hhbmdlID09PSBudWxsIHx8IG9uQWN0aXZlVmFsdWVDaGFuZ2UgPT09IHZvaWQgMCB8fCBvbkFjdGl2ZVZhbHVlQ2hhbmdlKG51bGwpO1xuICAgIHZhciBzZXBhcmF0ZWRMaXN0ID0gZ2V0U2VwYXJhdGVkQ29udGVudChzZWFyY2hUZXh0LCB0b2tlblNlcGFyYXRvcnMsIGlzVmFsaWRDb3VudChtYXhDb3VudCkgPyBtYXhDb3VudCAtIHJhd1ZhbHVlcy5zaXplIDogdW5kZWZpbmVkKTtcblxuICAgIC8vIENoZWNrIGlmIG1hdGNoIHRoZSBgdG9rZW5TZXBhcmF0b3JzYFxuICAgIHZhciBwYXRjaExhYmVscyA9IGlzQ29tcG9zaXRpbmcgPyBudWxsIDogc2VwYXJhdGVkTGlzdDtcblxuICAgIC8vIElnbm9yZSBjb21ib2JveCBzaW5jZSBpdCdzIG5vdCBzcGxpdC1hYmxlXG4gICAgaWYgKG1vZGUgIT09ICdjb21ib2JveCcgJiYgcGF0Y2hMYWJlbHMpIHtcbiAgICAgIG5ld1NlYXJjaFRleHQgPSAnJztcbiAgICAgIG9uU2VhcmNoU3BsaXQgPT09IG51bGwgfHwgb25TZWFyY2hTcGxpdCA9PT0gdm9pZCAwIHx8IG9uU2VhcmNoU3BsaXQocGF0Y2hMYWJlbHMpO1xuXG4gICAgICAvLyBTaG91bGQgY2xvc2Ugd2hlbiBwYXN0ZSBmaW5pc2hcbiAgICAgIG9uVG9nZ2xlT3BlbihmYWxzZSk7XG5cbiAgICAgIC8vIFRlbGwgU2VsZWN0b3IgdGhhdCBicmVhayBuZXh0IGFjdGlvbnNcbiAgICAgIHJldCA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAob25TZWFyY2ggJiYgbWVyZ2VkU2VhcmNoVmFsdWUgIT09IG5ld1NlYXJjaFRleHQpIHtcbiAgICAgIG9uU2VhcmNoKG5ld1NlYXJjaFRleHQsIHtcbiAgICAgICAgc291cmNlOiBmcm9tVHlwaW5nID8gJ3R5cGluZycgOiAnZWZmZWN0J1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH07XG5cbiAgLy8gT25seSB0cmlnZ2VyZWQgd2hlbiBtZW51IGlzIGNsb3NlZCAmIG1vZGUgaXMgdGFnc1xuICAvLyBJZiBtZW51IGlzIG9wZW4sIE9wdGlvbkxpc3Qgd2lsbCB0YWtlIGNoYXJnZVxuICAvLyBJZiBtb2RlIGlzbid0IHRhZ3MsIHByZXNzIGVudGVyIGlzIG5vdCBtZWFuaW5nZnVsIHdoZW4geW91IGNhbid0IHNlZSBhbnkgb3B0aW9uXG4gIHZhciBvbkludGVybmFsU2VhcmNoU3VibWl0ID0gZnVuY3Rpb24gb25JbnRlcm5hbFNlYXJjaFN1Ym1pdChzZWFyY2hUZXh0KSB7XG4gICAgLy8gcHJldmVudCBlbXB0eSB0YWdzIGZyb20gYXBwZWFyaW5nIHdoZW4geW91IGNsaWNrIHRoZSBFbnRlciBidXR0b25cbiAgICBpZiAoIXNlYXJjaFRleHQgfHwgIXNlYXJjaFRleHQudHJpbSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG9uU2VhcmNoKHNlYXJjaFRleHQsIHtcbiAgICAgIHNvdXJjZTogJ3N1Ym1pdCdcbiAgICB9KTtcbiAgfTtcblxuICAvLyBDbG9zZSB3aWxsIGNsZWFuIHVwIHNpbmdsZSBtb2RlIHNlYXJjaCB0ZXh0XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFtZXJnZWRPcGVuICYmICFtdWx0aXBsZSAmJiBtb2RlICE9PSAnY29tYm9ib3gnKSB7XG4gICAgICBvbkludGVybmFsU2VhcmNoKCcnLCBmYWxzZSwgZmFsc2UpO1xuICAgIH1cbiAgfSwgW21lcmdlZE9wZW5dKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IERpc2FibGVkID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ2xvc2UgZHJvcGRvd24gJiByZW1vdmUgZm9jdXMgc3RhdGUgd2hlbiBkaXNhYmxlZCBjaGFuZ2VcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoaW5uZXJPcGVuICYmIGRpc2FibGVkKSB7XG4gICAgICBzZXRJbm5lck9wZW4oZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIEFmdGVyIG9uQmx1ciBpcyB0cmlnZ2VyZWQsIHRoZSBmb2N1c2VkIGRvZXMgbm90IG5lZWQgdG8gYmUgcmVzZXRcbiAgICBpZiAoZGlzYWJsZWQgJiYgIWJsdXJSZWYuY3VycmVudCkge1xuICAgICAgc2V0TW9ja0ZvY3VzZWQoZmFsc2UpO1xuICAgIH1cbiAgfSwgW2Rpc2FibGVkXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBLZXlib2FyZCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8qKlxuICAgKiBXZSByZWNvcmQgaW5wdXQgdmFsdWUgaGVyZSB0byBjaGVjayBpZiBjYW4gcHJlc3MgdG8gY2xlYW4gdXAgYnkgYmFja3NwYWNlXG4gICAqIC0gbnVsbDogS2V5IGlzIG5vdCBkb3duLCB0aGlzIGlzIHJlc2V0IGJ5IGtleSB1cFxuICAgKiAtIHRydWU6IFNlYXJjaCB0ZXh0IGlzIGVtcHR5IHdoZW4gZmlyc3QgdGltZSBiYWNrc3BhY2UgZG93blxuICAgKiAtIGZhbHNlOiBTZWFyY2ggdGV4dCBpcyBub3QgZW1wdHkgd2hlbiBmaXJzdCB0aW1lIGJhY2tzcGFjZSBkb3duXG4gICAqL1xuICB2YXIgX3VzZUxvY2sgPSB1c2VMb2NrKCksXG4gICAgX3VzZUxvY2syID0gX3NsaWNlZFRvQXJyYXkoX3VzZUxvY2ssIDIpLFxuICAgIGdldENsZWFyTG9jayA9IF91c2VMb2NrMlswXSxcbiAgICBzZXRDbGVhckxvY2sgPSBfdXNlTG9jazJbMV07XG4gIHZhciBrZXlMb2NrUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcblxuICAvLyBLZXlEb3duXG4gIHZhciBvbkludGVybmFsS2V5RG93biA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxLZXlEb3duKGV2ZW50KSB7XG4gICAgdmFyIGNsZWFyTG9jayA9IGdldENsZWFyTG9jaygpO1xuICAgIHZhciBrZXkgPSBldmVudC5rZXk7XG4gICAgdmFyIGlzRW50ZXJLZXkgPSBrZXkgPT09ICdFbnRlcic7XG4gICAgaWYgKGlzRW50ZXJLZXkpIHtcbiAgICAgIC8vIERvIG5vdCBzdWJtaXQgZm9ybSB3aGVuIHR5cGUgaW4gdGhlIGlucHV0XG4gICAgICBpZiAobW9kZSAhPT0gJ2NvbWJvYm94Jykge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBXZSBvbmx5IG1hbmFnZSBvcGVuIHN0YXRlIGhlcmUsIGNsb3NlIGxvZ2ljIHNob3VsZCBoYW5kbGUgYnkgbGlzdCBjb21wb25lbnRcbiAgICAgIGlmICghbWVyZ2VkT3Blbikge1xuICAgICAgICBvblRvZ2dsZU9wZW4odHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHNldENsZWFyTG9jayghIW1lcmdlZFNlYXJjaFZhbHVlKTtcblxuICAgIC8vIFJlbW92ZSB2YWx1ZSBieSBgYmFja3NwYWNlYFxuICAgIGlmIChrZXkgPT09ICdCYWNrc3BhY2UnICYmICFjbGVhckxvY2sgJiYgbXVsdGlwbGUgJiYgIW1lcmdlZFNlYXJjaFZhbHVlICYmIGRpc3BsYXlWYWx1ZXMubGVuZ3RoKSB7XG4gICAgICB2YXIgY2xvbmVEaXNwbGF5VmFsdWVzID0gX3RvQ29uc3VtYWJsZUFycmF5KGRpc3BsYXlWYWx1ZXMpO1xuICAgICAgdmFyIHJlbW92ZWREaXNwbGF5VmFsdWUgPSBudWxsO1xuICAgICAgZm9yICh2YXIgaSA9IGNsb25lRGlzcGxheVZhbHVlcy5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgICB2YXIgY3VycmVudCA9IGNsb25lRGlzcGxheVZhbHVlc1tpXTtcbiAgICAgICAgaWYgKCFjdXJyZW50LmRpc2FibGVkKSB7XG4gICAgICAgICAgY2xvbmVEaXNwbGF5VmFsdWVzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICByZW1vdmVkRGlzcGxheVZhbHVlID0gY3VycmVudDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHJlbW92ZWREaXNwbGF5VmFsdWUpIHtcbiAgICAgICAgb25EaXNwbGF5VmFsdWVzQ2hhbmdlKGNsb25lRGlzcGxheVZhbHVlcywge1xuICAgICAgICAgIHR5cGU6ICdyZW1vdmUnLFxuICAgICAgICAgIHZhbHVlczogW3JlbW92ZWREaXNwbGF5VmFsdWVdXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgcmVzdCA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICByZXN0W19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG4gICAgaWYgKG1lcmdlZE9wZW4gJiYgKCFpc0VudGVyS2V5IHx8ICFrZXlMb2NrUmVmLmN1cnJlbnQpKSB7XG4gICAgICB2YXIgX2xpc3RSZWYkY3VycmVudDI7XG4gICAgICAvLyBMb2NrIHRoZSBFbnRlciBrZXkgYWZ0ZXIgaXQgaXMgcHJlc3NlZCB0byBhdm9pZCByZXBlYXRlZCB0cmlnZ2VyaW5nIG9mIHRoZSBvbkNoYW5nZSBldmVudC5cbiAgICAgIGlmIChpc0VudGVyS2V5KSB7XG4gICAgICAgIGtleUxvY2tSZWYuY3VycmVudCA9IHRydWU7XG4gICAgICB9XG4gICAgICAoX2xpc3RSZWYkY3VycmVudDIgPSBsaXN0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9saXN0UmVmJGN1cnJlbnQyID09PSB2b2lkIDAgfHwgX2xpc3RSZWYkY3VycmVudDIub25LZXlEb3duLmFwcGx5KF9saXN0UmVmJGN1cnJlbnQyLCBbZXZlbnRdLmNvbmNhdChyZXN0KSk7XG4gICAgfVxuICAgIG9uS2V5RG93biA9PT0gbnVsbCB8fCBvbktleURvd24gPT09IHZvaWQgMCB8fCBvbktleURvd24uYXBwbHkodm9pZCAwLCBbZXZlbnRdLmNvbmNhdChyZXN0KSk7XG4gIH07XG5cbiAgLy8gS2V5VXBcbiAgdmFyIG9uSW50ZXJuYWxLZXlVcCA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxLZXlVcChldmVudCkge1xuICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgcmVzdCA9IG5ldyBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICByZXN0W19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgIH1cbiAgICBpZiAobWVyZ2VkT3Blbikge1xuICAgICAgdmFyIF9saXN0UmVmJGN1cnJlbnQzO1xuICAgICAgKF9saXN0UmVmJGN1cnJlbnQzID0gbGlzdFJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfbGlzdFJlZiRjdXJyZW50MyA9PT0gdm9pZCAwIHx8IF9saXN0UmVmJGN1cnJlbnQzLm9uS2V5VXAuYXBwbHkoX2xpc3RSZWYkY3VycmVudDMsIFtldmVudF0uY29uY2F0KHJlc3QpKTtcbiAgICB9XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJykge1xuICAgICAga2V5TG9ja1JlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgfVxuICAgIG9uS2V5VXAgPT09IG51bGwgfHwgb25LZXlVcCA9PT0gdm9pZCAwIHx8IG9uS2V5VXAuYXBwbHkodm9pZCAwLCBbZXZlbnRdLmNvbmNhdChyZXN0KSk7XG4gIH07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTZWxlY3RvciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBvblNlbGVjdG9yUmVtb3ZlID0gZnVuY3Rpb24gb25TZWxlY3RvclJlbW92ZSh2YWwpIHtcbiAgICB2YXIgbmV3VmFsdWVzID0gZGlzcGxheVZhbHVlcy5maWx0ZXIoZnVuY3Rpb24gKGkpIHtcbiAgICAgIHJldHVybiBpICE9PSB2YWw7XG4gICAgfSk7XG4gICAgb25EaXNwbGF5VmFsdWVzQ2hhbmdlKG5ld1ZhbHVlcywge1xuICAgICAgdHlwZTogJ3JlbW92ZScsXG4gICAgICB2YWx1ZXM6IFt2YWxdXG4gICAgfSk7XG4gIH07XG4gIHZhciBvbklucHV0Qmx1ciA9IGZ1bmN0aW9uIG9uSW5wdXRCbHVyKCkge1xuICAgIC8vIFVubG9jayB0aGUgRW50ZXIga2V5IGFmdGVyIHRoZSBpbnB1dCBibHVyOyBvdGhlcndpc2UsIHRoZSBFbnRlciBrZXkgbmVlZHMgdG8gYmUgcHJlc3NlZCB0d2ljZSB0byB0cmlnZ2VyIHRoZSBjb3JyZWN0IGVmZmVjdC5cbiAgICBrZXlMb2NrUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgfTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBGb2N1cyAvIEJsdXIgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLyoqIFJlY29yZCByZWFsIGZvY3VzIHN0YXR1cyAqL1xuICB2YXIgZm9jdXNSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICB2YXIgb25Db250YWluZXJGb2N1cyA9IGZ1bmN0aW9uIG9uQ29udGFpbmVyRm9jdXMoKSB7XG4gICAgc2V0TW9ja0ZvY3VzZWQodHJ1ZSk7XG4gICAgaWYgKCFkaXNhYmxlZCkge1xuICAgICAgaWYgKG9uRm9jdXMgJiYgIWZvY3VzUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgb25Gb2N1cy5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIC8vIGBzaG93QWN0aW9uYCBzaG91bGQgaGFuZGxlIGBmb2N1c2AgaWYgc2V0XG4gICAgICBpZiAoc2hvd0FjdGlvbi5pbmNsdWRlcygnZm9jdXMnKSkge1xuICAgICAgICBvblRvZ2dsZU9wZW4odHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvY3VzUmVmLmN1cnJlbnQgPSB0cnVlO1xuICB9O1xuICB2YXIgb25Db250YWluZXJCbHVyID0gZnVuY3Rpb24gb25Db250YWluZXJCbHVyKCkge1xuICAgIGJsdXJSZWYuY3VycmVudCA9IHRydWU7XG4gICAgc2V0TW9ja0ZvY3VzZWQoZmFsc2UsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvY3VzUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgIGJsdXJSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgb25Ub2dnbGVPcGVuKGZhbHNlKTtcbiAgICB9KTtcbiAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG1lcmdlZFNlYXJjaFZhbHVlKSB7XG4gICAgICAvLyBgdGFnc2AgbW9kZSBzaG91bGQgbW92ZSBgc2VhcmNoVmFsdWVgIGludG8gdmFsdWVzXG4gICAgICBpZiAobW9kZSA9PT0gJ3RhZ3MnKSB7XG4gICAgICAgIG9uU2VhcmNoKG1lcmdlZFNlYXJjaFZhbHVlLCB7XG4gICAgICAgICAgc291cmNlOiAnc3VibWl0J1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ211bHRpcGxlJykge1xuICAgICAgICAvLyBgbXVsdGlwbGVgIG1vZGUgb25seSBjbGVhbiB0aGUgc2VhcmNoIHZhbHVlIGJ1dCBub3QgdHJpZ2dlciBldmVudFxuICAgICAgICBvblNlYXJjaCgnJywge1xuICAgICAgICAgIHNvdXJjZTogJ2JsdXInXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAob25CbHVyKSB7XG4gICAgICBvbkJsdXIuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfTtcblxuICAvLyBHaXZlIGZvY3VzIGJhY2sgb2YgU2VsZWN0XG4gIHZhciBhY3RpdmVUaW1lb3V0SWRzID0gW107XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFjdGl2ZVRpbWVvdXRJZHMuZm9yRWFjaChmdW5jdGlvbiAodGltZW91dElkKSB7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgIH0pO1xuICAgICAgYWN0aXZlVGltZW91dElkcy5zcGxpY2UoMCwgYWN0aXZlVGltZW91dElkcy5sZW5ndGgpO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgdmFyIG9uSW50ZXJuYWxNb3VzZURvd24gPSBmdW5jdGlvbiBvbkludGVybmFsTW91c2VEb3duKGV2ZW50KSB7XG4gICAgdmFyIF90cmlnZ2VyUmVmJGN1cnJlbnQ7XG4gICAgdmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICB2YXIgcG9wdXBFbGVtZW50ID0gKF90cmlnZ2VyUmVmJGN1cnJlbnQgPSB0cmlnZ2VyUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF90cmlnZ2VyUmVmJGN1cnJlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90cmlnZ2VyUmVmJGN1cnJlbnQuZ2V0UG9wdXBFbGVtZW50KCk7XG5cbiAgICAvLyBXZSBzaG91bGQgZ2l2ZSBmb2N1cyBiYWNrIHRvIHNlbGVjdG9yIGlmIGNsaWNrZWQgaXRlbSBpcyBub3QgZm9jdXNhYmxlXG4gICAgaWYgKHBvcHVwRWxlbWVudCAmJiBwb3B1cEVsZW1lbnQuY29udGFpbnModGFyZ2V0KSkge1xuICAgICAgdmFyIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaW5kZXggPSBhY3RpdmVUaW1lb3V0SWRzLmluZGV4T2YodGltZW91dElkKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgIGFjdGl2ZVRpbWVvdXRJZHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgICBjYW5jZWxTZXRNb2NrRm9jdXNlZCgpO1xuICAgICAgICBpZiAoIW1vYmlsZSAmJiAhcG9wdXBFbGVtZW50LmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgICAgdmFyIF9zZWxlY3RvclJlZiRjdXJyZW50MztcbiAgICAgICAgICAoX3NlbGVjdG9yUmVmJGN1cnJlbnQzID0gc2VsZWN0b3JSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX3NlbGVjdG9yUmVmJGN1cnJlbnQzID09PSB2b2lkIDAgfHwgX3NlbGVjdG9yUmVmJGN1cnJlbnQzLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgYWN0aXZlVGltZW91dElkcy5wdXNoKHRpbWVvdXRJZCk7XG4gICAgfVxuICAgIGZvciAodmFyIF9sZW4zID0gYXJndW1lbnRzLmxlbmd0aCwgcmVzdEFyZ3MgPSBuZXcgQXJyYXkoX2xlbjMgPiAxID8gX2xlbjMgLSAxIDogMCksIF9rZXkzID0gMTsgX2tleTMgPCBfbGVuMzsgX2tleTMrKykge1xuICAgICAgcmVzdEFyZ3NbX2tleTMgLSAxXSA9IGFyZ3VtZW50c1tfa2V5M107XG4gICAgfVxuICAgIG9uTW91c2VEb3duID09PSBudWxsIHx8IG9uTW91c2VEb3duID09PSB2b2lkIDAgfHwgb25Nb3VzZURvd24uYXBwbHkodm9pZCAwLCBbZXZlbnRdLmNvbmNhdChyZXN0QXJncykpO1xuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRHJvcGRvd24gPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX1JlYWN0JHVzZVN0YXRlNSA9IFJlYWN0LnVzZVN0YXRlKHt9KSxcbiAgICBfUmVhY3QkdXNlU3RhdGU2ID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlNSwgMiksXG4gICAgZm9yY2VVcGRhdGUgPSBfUmVhY3QkdXNlU3RhdGU2WzFdO1xuICAvLyBXZSBuZWVkIGZvcmNlIHVwZGF0ZSBoZXJlIHNpbmNlIHBvcHVwIGRvbSBpcyByZW5kZXIgYXN5bmNcbiAgZnVuY3Rpb24gb25Qb3B1cE1vdXNlRW50ZXIoKSB7XG4gICAgZm9yY2VVcGRhdGUoe30pO1xuICB9XG5cbiAgLy8gVXNlZCBmb3IgcmF3IGN1c3RvbSBpbnB1dCB0cmlnZ2VyXG4gIHZhciBvblRyaWdnZXJWaXNpYmxlQ2hhbmdlO1xuICBpZiAoY3VzdG9taXplUmF3SW5wdXRFbGVtZW50KSB7XG4gICAgb25UcmlnZ2VyVmlzaWJsZUNoYW5nZSA9IGZ1bmN0aW9uIG9uVHJpZ2dlclZpc2libGVDaGFuZ2UobmV3T3Blbikge1xuICAgICAgb25Ub2dnbGVPcGVuKG5ld09wZW4pO1xuICAgIH07XG4gIH1cblxuICAvLyBDbG9zZSB3aGVuIGNsaWNrIG9uIG5vbi1zZWxlY3QgZWxlbWVudFxuICB1c2VTZWxlY3RUcmlnZ2VyQ29udHJvbChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF90cmlnZ2VyUmVmJGN1cnJlbnQyO1xuICAgIHJldHVybiBbY29udGFpbmVyUmVmLmN1cnJlbnQsIChfdHJpZ2dlclJlZiRjdXJyZW50MiA9IHRyaWdnZXJSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX3RyaWdnZXJSZWYkY3VycmVudDIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90cmlnZ2VyUmVmJGN1cnJlbnQyLmdldFBvcHVwRWxlbWVudCgpXTtcbiAgfSwgdHJpZ2dlck9wZW4sIG9uVG9nZ2xlT3BlbiwgISFjdXN0b21pemVSYXdJbnB1dEVsZW1lbnQpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQ29udGV4dCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgYmFzZVNlbGVjdENvbnRleHQgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyksIHt9LCB7XG4gICAgICBub3RGb3VuZENvbnRlbnQ6IG5vdEZvdW5kQ29udGVudCxcbiAgICAgIG9wZW46IG1lcmdlZE9wZW4sXG4gICAgICB0cmlnZ2VyT3BlbjogdHJpZ2dlck9wZW4sXG4gICAgICBpZDogaWQsXG4gICAgICBzaG93U2VhcmNoOiBtZXJnZWRTaG93U2VhcmNoLFxuICAgICAgbXVsdGlwbGU6IG11bHRpcGxlLFxuICAgICAgdG9nZ2xlT3Blbjogb25Ub2dnbGVPcGVuXG4gICAgfSk7XG4gIH0sIFtwcm9wcywgbm90Rm91bmRDb250ZW50LCB0cmlnZ2VyT3BlbiwgbWVyZ2VkT3BlbiwgaWQsIG1lcmdlZFNob3dTZWFyY2gsIG11bHRpcGxlLCBvblRvZ2dsZU9wZW5dKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gPT0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVuZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgID09XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEFycm93ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgc2hvd1N1ZmZpeEljb24gPSAhIXN1ZmZpeEljb24gfHwgbG9hZGluZztcbiAgdmFyIGFycm93Tm9kZTtcbiAgaWYgKHNob3dTdWZmaXhJY29uKSB7XG4gICAgYXJyb3dOb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVHJhbnNCdG4sIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWFycm93XCIpLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYXJyb3ctbG9hZGluZ1wiKSwgbG9hZGluZykpLFxuICAgICAgY3VzdG9taXplSWNvbjogc3VmZml4SWNvbixcbiAgICAgIGN1c3RvbWl6ZUljb25Qcm9wczoge1xuICAgICAgICBsb2FkaW5nOiBsb2FkaW5nLFxuICAgICAgICBzZWFyY2hWYWx1ZTogbWVyZ2VkU2VhcmNoVmFsdWUsXG4gICAgICAgIG9wZW46IG1lcmdlZE9wZW4sXG4gICAgICAgIGZvY3VzZWQ6IG1vY2tGb2N1c2VkLFxuICAgICAgICBzaG93U2VhcmNoOiBtZXJnZWRTaG93U2VhcmNoXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDbGVhciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG9uQ2xlYXJNb3VzZURvd24gPSBmdW5jdGlvbiBvbkNsZWFyTW91c2VEb3duKCkge1xuICAgIHZhciBfc2VsZWN0b3JSZWYkY3VycmVudDQ7XG4gICAgb25DbGVhciA9PT0gbnVsbCB8fCBvbkNsZWFyID09PSB2b2lkIDAgfHwgb25DbGVhcigpO1xuICAgIChfc2VsZWN0b3JSZWYkY3VycmVudDQgPSBzZWxlY3RvclJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfc2VsZWN0b3JSZWYkY3VycmVudDQgPT09IHZvaWQgMCB8fCBfc2VsZWN0b3JSZWYkY3VycmVudDQuZm9jdXMoKTtcbiAgICBvbkRpc3BsYXlWYWx1ZXNDaGFuZ2UoW10sIHtcbiAgICAgIHR5cGU6ICdjbGVhcicsXG4gICAgICB2YWx1ZXM6IGRpc3BsYXlWYWx1ZXNcbiAgICB9KTtcbiAgICBvbkludGVybmFsU2VhcmNoKCcnLCBmYWxzZSwgZmFsc2UpO1xuICB9O1xuICB2YXIgX3VzZUFsbG93Q2xlYXIgPSB1c2VBbGxvd0NsZWFyKHByZWZpeENscywgb25DbGVhck1vdXNlRG93biwgZGlzcGxheVZhbHVlcywgYWxsb3dDbGVhciwgY2xlYXJJY29uLCBkaXNhYmxlZCwgbWVyZ2VkU2VhcmNoVmFsdWUsIG1vZGUpLFxuICAgIG1lcmdlZEFsbG93Q2xlYXIgPSBfdXNlQWxsb3dDbGVhci5hbGxvd0NsZWFyLFxuICAgIGNsZWFyTm9kZSA9IF91c2VBbGxvd0NsZWFyLmNsZWFySWNvbjtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gT3B0aW9uTGlzdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG9wdGlvbkxpc3QgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChPcHRpb25MaXN0LCB7XG4gICAgcmVmOiBsaXN0UmVmXG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNlbGVjdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgbWVyZ2VkQ2xhc3NOYW1lID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIGNsYXNzTmFtZSwgX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWZvY3VzZWRcIiksIG1vY2tGb2N1c2VkKSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1tdWx0aXBsZVwiKSwgbXVsdGlwbGUpLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNpbmdsZVwiKSwgIW11bHRpcGxlKSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hbGxvdy1jbGVhclwiKSwgYWxsb3dDbGVhciksIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2hvdy1hcnJvd1wiKSwgc2hvd1N1ZmZpeEljb24pLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRpc2FibGVkXCIpLCBkaXNhYmxlZCksIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbG9hZGluZ1wiKSwgbG9hZGluZyksIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItb3BlblwiKSwgbWVyZ2VkT3BlbiksIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY3VzdG9taXplLWlucHV0XCIpLCBjdXN0b21pemVJbnB1dEVsZW1lbnQpLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNob3ctc2VhcmNoXCIpLCBtZXJnZWRTaG93U2VhcmNoKSk7XG5cbiAgLy8gPj4+IFNlbGVjdG9yXG4gIHZhciBzZWxlY3Rvck5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTZWxlY3RUcmlnZ2VyLCB7XG4gICAgcmVmOiB0cmlnZ2VyUmVmLFxuICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICB2aXNpYmxlOiB0cmlnZ2VyT3BlbixcbiAgICBwb3B1cEVsZW1lbnQ6IG9wdGlvbkxpc3QsXG4gICAgYW5pbWF0aW9uOiBhbmltYXRpb24sXG4gICAgdHJhbnNpdGlvbk5hbWU6IHRyYW5zaXRpb25OYW1lLFxuICAgIGRyb3Bkb3duU3R5bGU6IGRyb3Bkb3duU3R5bGUsXG4gICAgZHJvcGRvd25DbGFzc05hbWU6IGRyb3Bkb3duQ2xhc3NOYW1lLFxuICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uLFxuICAgIGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aDogZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoLFxuICAgIGRyb3Bkb3duUmVuZGVyOiBkcm9wZG93blJlbmRlcixcbiAgICBkcm9wZG93bkFsaWduOiBkcm9wZG93bkFsaWduLFxuICAgIHBsYWNlbWVudDogcGxhY2VtZW50LFxuICAgIGJ1aWx0aW5QbGFjZW1lbnRzOiBidWlsdGluUGxhY2VtZW50cyxcbiAgICBnZXRQb3B1cENvbnRhaW5lcjogZ2V0UG9wdXBDb250YWluZXIsXG4gICAgZW1wdHk6IGVtcHR5T3B0aW9ucyxcbiAgICBnZXRUcmlnZ2VyRE9NTm9kZTogZnVuY3Rpb24gZ2V0VHJpZ2dlckRPTU5vZGUobm9kZSkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgLy8gVE9ETzogVGhpcyBpcyB3b3JrYXJvdW5kIGFuZCBzaG91bGQgYmUgcmVtb3ZlZCBpbiBgcmMtc2VsZWN0YFxuICAgICAgICAvLyBBbmQgdXNlIG5ldyBzdGFuZGFyZCBgbmF0aXZlRWxlbWVudGAgZm9yIHJlZi5cbiAgICAgICAgLy8gQnV0IHdlIHNob3VsZCB1cGRhdGUgYHJjLXJlc2l6ZS1vYnNlcnZlcmAgZmlyc3QuXG4gICAgICAgIHNlbGVjdG9yRG9tUmVmLmN1cnJlbnQgfHwgbm9kZVxuICAgICAgKTtcbiAgICB9LFxuICAgIG9uUG9wdXBWaXNpYmxlQ2hhbmdlOiBvblRyaWdnZXJWaXNpYmxlQ2hhbmdlLFxuICAgIG9uUG9wdXBNb3VzZUVudGVyOiBvblBvcHVwTW91c2VFbnRlclxuICB9LCBjdXN0b21pemVSYXdJbnB1dEVsZW1lbnQgPyAoIC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoY3VzdG9taXplUmF3SW5wdXRFbGVtZW50LCB7XG4gICAgcmVmOiBjdXN0b21pemVSYXdJbnB1dFJlZlxuICB9KSkgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTZWxlY3RvciwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgZG9tUmVmOiBzZWxlY3RvckRvbVJlZixcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBpbnB1dEVsZW1lbnQ6IGN1c3RvbWl6ZUlucHV0RWxlbWVudCxcbiAgICByZWY6IHNlbGVjdG9yUmVmLFxuICAgIGlkOiBpZCxcbiAgICBwcmVmaXg6IHByZWZpeCxcbiAgICBzaG93U2VhcmNoOiBtZXJnZWRTaG93U2VhcmNoLFxuICAgIGF1dG9DbGVhclNlYXJjaFZhbHVlOiBhdXRvQ2xlYXJTZWFyY2hWYWx1ZSxcbiAgICBtb2RlOiBtb2RlLFxuICAgIGFjdGl2ZURlc2NlbmRhbnRJZDogYWN0aXZlRGVzY2VuZGFudElkLFxuICAgIHRhZ1JlbmRlcjogdGFnUmVuZGVyLFxuICAgIHZhbHVlczogZGlzcGxheVZhbHVlcyxcbiAgICBvcGVuOiBtZXJnZWRPcGVuLFxuICAgIG9uVG9nZ2xlT3Blbjogb25Ub2dnbGVPcGVuLFxuICAgIGFjdGl2ZVZhbHVlOiBhY3RpdmVWYWx1ZSxcbiAgICBzZWFyY2hWYWx1ZTogbWVyZ2VkU2VhcmNoVmFsdWUsXG4gICAgb25TZWFyY2g6IG9uSW50ZXJuYWxTZWFyY2gsXG4gICAgb25TZWFyY2hTdWJtaXQ6IG9uSW50ZXJuYWxTZWFyY2hTdWJtaXQsXG4gICAgb25SZW1vdmU6IG9uU2VsZWN0b3JSZW1vdmUsXG4gICAgdG9rZW5XaXRoRW50ZXI6IHRva2VuV2l0aEVudGVyLFxuICAgIG9uSW5wdXRCbHVyOiBvbklucHV0Qmx1clxuICB9KSkpO1xuXG4gIC8vID4+PiBSZW5kZXJcbiAgdmFyIHJlbmRlck5vZGU7XG5cbiAgLy8gUmVuZGVyIHJhd1xuICBpZiAoY3VzdG9taXplUmF3SW5wdXRFbGVtZW50KSB7XG4gICAgcmVuZGVyTm9kZSA9IHNlbGVjdG9yTm9kZTtcbiAgfSBlbHNlIHtcbiAgICByZW5kZXJOb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgICAgY2xhc3NOYW1lOiBtZXJnZWRDbGFzc05hbWVcbiAgICB9LCBkb21Qcm9wcywge1xuICAgICAgcmVmOiBjb250YWluZXJSZWYsXG4gICAgICBvbk1vdXNlRG93bjogb25JbnRlcm5hbE1vdXNlRG93bixcbiAgICAgIG9uS2V5RG93bjogb25JbnRlcm5hbEtleURvd24sXG4gICAgICBvbktleVVwOiBvbkludGVybmFsS2V5VXAsXG4gICAgICBvbkZvY3VzOiBvbkNvbnRhaW5lckZvY3VzLFxuICAgICAgb25CbHVyOiBvbkNvbnRhaW5lckJsdXJcbiAgICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUG9saXRlLCB7XG4gICAgICB2aXNpYmxlOiBtb2NrRm9jdXNlZCAmJiAhbWVyZ2VkT3BlbixcbiAgICAgIHZhbHVlczogZGlzcGxheVZhbHVlc1xuICAgIH0pLCBzZWxlY3Rvck5vZGUsIGFycm93Tm9kZSwgbWVyZ2VkQWxsb3dDbGVhciAmJiBjbGVhck5vZGUpO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChCYXNlU2VsZWN0Q29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBiYXNlU2VsZWN0Q29udGV4dFxuICB9LCByZW5kZXJOb2RlKTtcbn0pO1xuXG4vLyBTZXQgZGlzcGxheSBuYW1lIGZvciBkZXZcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIEJhc2VTZWxlY3QuZGlzcGxheU5hbWUgPSAnQmFzZVNlbGVjdCc7XG59XG5leHBvcnQgZGVmYXVsdCBCYXNlU2VsZWN0OyIsICJleHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gKCkge1xuICBpZiAodHlwZW9mIG5hdmlnYXRvciA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGFnZW50ID0gbmF2aWdhdG9yLnVzZXJBZ2VudCB8fCBuYXZpZ2F0b3IudmVuZG9yIHx8IHdpbmRvdy5vcGVyYTtcbiAgcmV0dXJuIC8oYW5kcm9pZHxiYlxcZCt8bWVlZ28pLittb2JpbGV8YXZhbnRnb3xiYWRhXFwvfGJsYWNrYmVycnl8YmxhemVyfGNvbXBhbHxlbGFpbmV8ZmVubmVjfGhpcHRvcHxpZW1vYmlsZXxpcChob25lfG9kKXxpcmlzfGtpbmRsZXxsZ2UgfG1hZW1vfG1pZHB8bW1wfG1vYmlsZS4rZmlyZWZveHxuZXRmcm9udHxvcGVyYSBtKG9ifGluKWl8cGFsbSggb3MpP3xwaG9uZXxwKGl4aXxyZSlcXC98cGx1Y2tlcnxwb2NrZXR8cHNwfHNlcmllcyg0fDYpMHxzeW1iaWFufHRyZW98dXBcXC4oYnJvd3NlcnxsaW5rKXx2b2RhZm9uZXx3YXB8d2luZG93cyBjZXx4ZGF8eGlpbm98YW5kcm9pZHxpcGFkfHBsYXlib29rfHNpbGsvaS50ZXN0KGFnZW50KSB8fCAvMTIwN3w2MzEwfDY1OTB8M2dzb3w0dGhwfDUwWzEtNl1pfDc3MHN8ODAyc3xhIHdhfGFiYWN8YWMoZXJ8b298cy0pfGFpKGtvfHJuKXxhbChhdnxjYXxjbyl8YW1vaXxhbihleHxueXx5dyl8YXB0dXxhcihjaHxnbyl8YXModGV8dXMpfGF0dHd8YXUoZGl8LW18ciB8cyApfGF2YW58YmUoY2t8bGx8bnEpfGJpKGxifHJkKXxibChhY3xheil8YnIoZXx2KXd8YnVtYnxidy0obnx1KXxjNTVcXC98Y2FwaXxjY3dhfGNkbS18Y2VsbHxjaHRtfGNsZGN8Y21kLXxjbyhtcHxuZCl8Y3Jhd3xkYShpdHxsbHxuZyl8ZGJ0ZXxkYy1zfGRldml8ZGljYXxkbW9ifGRvKGN8cClvfGRzKDEyfC1kKXxlbCg0OXxhaSl8ZW0obDJ8dWwpfGVyKGljfGswKXxlc2w4fGV6KFs0LTddMHxvc3x3YXx6ZSl8ZmV0Y3xmbHkoLXxfKXxnMSB1fGc1NjB8Z2VuZXxnZi01fGctbW98Z28oXFwud3xvZCl8Z3IoYWR8dW4pfGhhaWV8aGNpdHxoZC0obXxwfHQpfGhlaS18aGkocHR8dGEpfGhwKCBpfGlwKXxocy1jfGh0KGMoLXwgfF98YXxnfHB8c3x0KXx0cCl8aHUoYXd8dGMpfGktKDIwfGdvfG1hKXxpMjMwfGlhYyggfC18XFwvKXxpYnJvfGlkZWF8aWcwMXxpa29tfGltMWt8aW5ub3xpcGFxfGlyaXN8amEodHx2KWF8amJyb3xqZW11fGppZ3N8a2RkaXxrZWppfGtndCggfFxcLyl8a2xvbnxrcHQgfGt3Yy18a3lvKGN8ayl8bGUobm98eGkpfGxnKCBnfFxcLyhrfGx8dSl8NTB8NTR8LVthLXddKXxsaWJ3fGx5bnh8bTEtd3xtM2dhfG01MFxcL3xtYSh0ZXx1aXx4byl8bWMoMDF8MjF8Y2EpfG0tY3J8bWUocmN8cmkpfG1pKG84fG9hfHRzKXxtbWVmfG1vKDAxfDAyfGJpfGRlfGRvfHQoLXwgfG98dil8enopfG10KDUwfHAxfHYgKXxtd2JwfG15d2F8bjEwWzAtMl18bjIwWzItM118bjMwKDB8Mil8bjUwKDB8Mnw1KXxuNygwKDB8MSl8MTApfG5lKChjfG0pLXxvbnx0Znx3Znx3Z3x3dCl8bm9rKDZ8aSl8bnpwaHxvMmltfG9wKHRpfHd2KXxvcmFufG93ZzF8cDgwMHxwYW4oYXxkfHQpfHBkeGd8cGcoMTN8LShbMS04XXxjKSl8cGhpbHxwaXJlfHBsKGF5fHVjKXxwbi0yfHBvKGNrfHJ0fHNlKXxwcm94fHBzaW98cHQtZ3xxYS1hfHFjKDA3fDEyfDIxfDMyfDYwfC1bMi03XXxpLSl8cXRla3xyMzgwfHI2MDB8cmFrc3xyaW05fHJvKHZlfHpvKXxzNTVcXC98c2EoZ2V8bWF8bW18bXN8bnl8dmEpfHNjKDAxfGgtfG9vfHAtKXxzZGtcXC98c2UoYygtfDB8MSl8NDd8bWN8bmR8cmkpfHNnaC18c2hhcnxzaWUoLXxtKXxzay0wfHNsKDQ1fGlkKXxzbShhbHxhcnxiM3xpdHx0NSl8c28oZnR8bnkpfHNwKDAxfGgtfHYtfHYgKXxzeSgwMXxtYil8dDIoMTh8NTApfHQ2KDAwfDEwfDE4KXx0YShndHxsayl8dGNsLXx0ZGctfHRlbChpfG0pfHRpbS18dC1tb3x0byhwbHxzaCl8dHMoNzB8bS18bTN8bTUpfHR4LTl8dXAoXFwuYnxnMXxzaSl8dXRzdHx2NDAwfHY3NTB8dmVyaXx2aShyZ3x0ZSl8dmsoNDB8NVswLTNdfC12KXx2bTQwfHZvZGF8dnVsY3x2eCg1Mnw1M3w2MHw2MXw3MHw4MHw4MXw4M3w4NXw5OCl8dzNjKC18ICl8d2ViY3x3aGl0fHdpKGcgfG5jfG53KXx3bWxifHdvbnV8eDcwMHx5YXMtfHlvdXJ8emV0b3x6dGUtL2kudGVzdChhZ2VudCA9PT0gbnVsbCB8fCBhZ2VudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYWdlbnQuc3Vic3RyKDAsIDQpKTtcbn0pOyIsICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbnZhciBUcmFuc0J0biA9IGZ1bmN0aW9uIFRyYW5zQnRuKHByb3BzKSB7XG4gIHZhciBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgY3VzdG9taXplSWNvbiA9IHByb3BzLmN1c3RvbWl6ZUljb24sXG4gICAgY3VzdG9taXplSWNvblByb3BzID0gcHJvcHMuY3VzdG9taXplSWNvblByb3BzLFxuICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgX29uTW91c2VEb3duID0gcHJvcHMub25Nb3VzZURvd24sXG4gICAgb25DbGljayA9IHByb3BzLm9uQ2xpY2s7XG4gIHZhciBpY29uID0gdHlwZW9mIGN1c3RvbWl6ZUljb24gPT09ICdmdW5jdGlvbicgPyBjdXN0b21pemVJY29uKGN1c3RvbWl6ZUljb25Qcm9wcykgOiBjdXN0b21pemVJY29uO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICBvbk1vdXNlRG93bjogZnVuY3Rpb24gb25Nb3VzZURvd24oZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBfb25Nb3VzZURvd24gPT09IG51bGwgfHwgX29uTW91c2VEb3duID09PSB2b2lkIDAgfHwgX29uTW91c2VEb3duKGV2ZW50KTtcbiAgICB9LFxuICAgIHN0eWxlOiB7XG4gICAgICB1c2VyU2VsZWN0OiAnbm9uZScsXG4gICAgICBXZWJraXRVc2VyU2VsZWN0OiAnbm9uZSdcbiAgICB9LFxuICAgIHVuc2VsZWN0YWJsZTogXCJvblwiLFxuICAgIG9uQ2xpY2s6IG9uQ2xpY2ssXG4gICAgXCJhcmlhLWhpZGRlblwiOiB0cnVlXG4gIH0sIGljb24gIT09IHVuZGVmaW5lZCA/IGljb24gOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUuc3BsaXQoL1xccysvKS5tYXAoZnVuY3Rpb24gKGNscykge1xuICAgICAgcmV0dXJuIFwiXCIuY29uY2F0KGNscywgXCItaWNvblwiKTtcbiAgICB9KSlcbiAgfSwgY2hpbGRyZW4pKTtcbn07XG5leHBvcnQgZGVmYXVsdCBUcmFuc0J0bjsiLCAiaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IFRyYW5zQnRuIGZyb20gXCIuLi9UcmFuc0J0blwiO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCB2YXIgdXNlQWxsb3dDbGVhciA9IGZ1bmN0aW9uIHVzZUFsbG93Q2xlYXIocHJlZml4Q2xzLCBvbkNsZWFyTW91c2VEb3duLCBkaXNwbGF5VmFsdWVzLCBhbGxvd0NsZWFyLCBjbGVhckljb24pIHtcbiAgdmFyIGRpc2FibGVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiBmYWxzZTtcbiAgdmFyIG1lcmdlZFNlYXJjaFZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDYgPyBhcmd1bWVudHNbNl0gOiB1bmRlZmluZWQ7XG4gIHZhciBtb2RlID0gYXJndW1lbnRzLmxlbmd0aCA+IDcgPyBhcmd1bWVudHNbN10gOiB1bmRlZmluZWQ7XG4gIHZhciBtZXJnZWRDbGVhckljb24gPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoX3R5cGVvZihhbGxvd0NsZWFyKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBhbGxvd0NsZWFyLmNsZWFySWNvbjtcbiAgICB9XG4gICAgaWYgKGNsZWFySWNvbikge1xuICAgICAgcmV0dXJuIGNsZWFySWNvbjtcbiAgICB9XG4gIH0sIFthbGxvd0NsZWFyLCBjbGVhckljb25dKTtcbiAgdmFyIG1lcmdlZEFsbG93Q2xlYXIgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWRpc2FibGVkICYmICEhYWxsb3dDbGVhciAmJiAoZGlzcGxheVZhbHVlcy5sZW5ndGggfHwgbWVyZ2VkU2VhcmNoVmFsdWUpICYmICEobW9kZSA9PT0gJ2NvbWJvYm94JyAmJiBtZXJnZWRTZWFyY2hWYWx1ZSA9PT0gJycpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LCBbYWxsb3dDbGVhciwgZGlzYWJsZWQsIGRpc3BsYXlWYWx1ZXMubGVuZ3RoLCBtZXJnZWRTZWFyY2hWYWx1ZSwgbW9kZV0pO1xuICByZXR1cm4ge1xuICAgIGFsbG93Q2xlYXI6IG1lcmdlZEFsbG93Q2xlYXIsXG4gICAgY2xlYXJJY29uOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUcmFuc0J0biwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNsZWFyXCIpLFxuICAgICAgb25Nb3VzZURvd246IG9uQ2xlYXJNb3VzZURvd24sXG4gICAgICBjdXN0b21pemVJY29uOiBtZXJnZWRDbGVhckljb25cbiAgICB9LCBcIlxceEQ3XCIpXG4gIH07XG59OyIsICIvKipcbiAqIEJhc2VTZWxlY3QgcHJvdmlkZSBzb21lIHBhcnNlZCBkYXRhIGludG8gY29udGV4dC5cbiAqIFlvdSBjYW4gdXNlIHRoaXMgaG9va3MgdG8gZ2V0IHRoZW0uXG4gKi9cblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuZXhwb3J0IHZhciBCYXNlU2VsZWN0Q29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlQmFzZVByb3BzKCkge1xuICByZXR1cm4gUmVhY3QudXNlQ29udGV4dChCYXNlU2VsZWN0Q29udGV4dCk7XG59IiwgImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG4vKipcbiAqIFNpbWlsYXIgd2l0aCBgdXNlTG9ja2AsIGJ1dCB0aGlzIGhvb2sgd2lsbCBhbHdheXMgZXhlY3V0ZSBsYXN0IHZhbHVlLlxuICogV2hlbiBzZXQgdG8gYHRydWVgLCBpdCB3aWxsIGtlZXAgYHRydWVgIGZvciBhIHNob3J0IHRpbWUgZXZlbiBpZiBgZmFsc2VgIGlzIHNldC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlRGVsYXlSZXNldCgpIHtcbiAgdmFyIHRpbWVvdXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IDEwO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIGJvb2wgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldEJvb2wgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICB2YXIgZGVsYXlSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHZhciBjYW5jZWxMYXRlc3QgPSBmdW5jdGlvbiBjYW5jZWxMYXRlc3QoKSB7XG4gICAgd2luZG93LmNsZWFyVGltZW91dChkZWxheVJlZi5jdXJyZW50KTtcbiAgfTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gY2FuY2VsTGF0ZXN0O1xuICB9LCBbXSk7XG4gIHZhciBkZWxheVNldEJvb2wgPSBmdW5jdGlvbiBkZWxheVNldEJvb2wodmFsdWUsIGNhbGxiYWNrKSB7XG4gICAgY2FuY2VsTGF0ZXN0KCk7XG4gICAgZGVsYXlSZWYuY3VycmVudCA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHNldEJvb2wodmFsdWUpO1xuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSwgdGltZW91dCk7XG4gIH07XG4gIHJldHVybiBbYm9vbCwgZGVsYXlTZXRCb29sLCBjYW5jZWxMYXRlc3RdO1xufSIsICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbi8qKlxuICogTG9ja2VyIHJldHVybiBjYWNoZWQgbWFyay5cbiAqIElmIHNldCB0byBgdHJ1ZWAsIHdpbGwgcmV0dXJuIGB0cnVlYCBpbiBhIHNob3J0IHRpbWUgZXZlbiBpZiBzZXQgYGZhbHNlYC5cbiAqIElmIHNldCB0byBgZmFsc2VgIGFuZCB0aGVuIHNldCB0byBgdHJ1ZWAsIHdpbGwgY2hhbmdlIHRvIGB0cnVlYC5cbiAqIEFuZCBhZnRlciB0aW1lIGR1cmF0aW9uLCBpdCB3aWxsIGJhY2sgdG8gYG51bGxgIGF1dG9tYXRpY2FsbHkuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUxvY2soKSB7XG4gIHZhciBkdXJhdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogMjUwO1xuICB2YXIgbG9ja1JlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIHRpbWVvdXRSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG5cbiAgLy8gQ2xlYW4gdXBcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgZnVuY3Rpb24gZG9Mb2NrKGxvY2tlZCkge1xuICAgIGlmIChsb2NrZWQgfHwgbG9ja1JlZi5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgICBsb2NrUmVmLmN1cnJlbnQgPSBsb2NrZWQ7XG4gICAgfVxuICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGltZW91dFJlZi5jdXJyZW50KTtcbiAgICB0aW1lb3V0UmVmLmN1cnJlbnQgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBsb2NrUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgIH0sIGR1cmF0aW9uKTtcbiAgfVxuICByZXR1cm4gW2Z1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbG9ja1JlZi5jdXJyZW50O1xuICB9LCBkb0xvY2tdO1xufSIsICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VTZWxlY3RUcmlnZ2VyQ29udHJvbChlbGVtZW50cywgb3BlbiwgdHJpZ2dlck9wZW4sIGN1c3RvbWl6ZWRUcmlnZ2VyKSB7XG4gIHZhciBwcm9wc1JlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgcHJvcHNSZWYuY3VycmVudCA9IHtcbiAgICBvcGVuOiBvcGVuLFxuICAgIHRyaWdnZXJPcGVuOiB0cmlnZ2VyT3BlbixcbiAgICBjdXN0b21pemVkVHJpZ2dlcjogY3VzdG9taXplZFRyaWdnZXJcbiAgfTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBvbkdsb2JhbE1vdXNlRG93bihldmVudCkge1xuICAgICAgdmFyIF9wcm9wc1JlZiRjdXJyZW50O1xuICAgICAgLy8gSWYgdHJpZ2dlciBpcyBjdXN0b21pemVkLCBUcmlnZ2VyIHdpbGwgdGFrZSBjb250cm9sIG9mIHBvcHVwVmlzaWJsZVxuICAgICAgaWYgKChfcHJvcHNSZWYkY3VycmVudCA9IHByb3BzUmVmLmN1cnJlbnQpICE9PSBudWxsICYmIF9wcm9wc1JlZiRjdXJyZW50ICE9PSB2b2lkIDAgJiYgX3Byb3BzUmVmJGN1cnJlbnQuY3VzdG9taXplZFRyaWdnZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICAgIGlmICh0YXJnZXQuc2hhZG93Um9vdCAmJiBldmVudC5jb21wb3NlZCkge1xuICAgICAgICB0YXJnZXQgPSBldmVudC5jb21wb3NlZFBhdGgoKVswXSB8fCB0YXJnZXQ7XG4gICAgICB9XG4gICAgICBpZiAocHJvcHNSZWYuY3VycmVudC5vcGVuICYmIGVsZW1lbnRzKCkuZmlsdGVyKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgfSkuZXZlcnkoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuICFlbGVtZW50LmNvbnRhaW5zKHRhcmdldCkgJiYgZWxlbWVudCAhPT0gdGFyZ2V0O1xuICAgICAgfSkpIHtcbiAgICAgICAgLy8gU2hvdWxkIHRyaWdnZXIgY2xvc2VcbiAgICAgICAgcHJvcHNSZWYuY3VycmVudC50cmlnZ2VyT3BlbihmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbkdsb2JhbE1vdXNlRG93bik7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgb25HbG9iYWxNb3VzZURvd24pO1xuICAgIH07XG4gIH0sIFtdKTtcbn0iLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbi8qKlxuICogQ3Vyc29yIHJ1bGU6XG4gKiAxLiBPbmx5IGBzaG93U2VhcmNoYCBlbmFibGVkXG4gKiAyLiBPbmx5IGBvcGVuYCBpcyBgdHJ1ZWBcbiAqIDMuIFdoZW4gdHlwaW5nLCBzZXQgYG9wZW5gIHRvIGB0cnVlYCB3aGljaCBoaXQgcnVsZSBvZiAyXG4gKlxuICogQWNjZXNzaWJpbGl0eTpcbiAqIC0gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dhaS1hcmlhLXByYWN0aWNlcy9leGFtcGxlcy9jb21ib2JveC9hcmlhMS4xcGF0dGVybi9saXN0Ym94LWNvbWJvLmh0bWxcbiAqL1xuXG5pbXBvcnQgS2V5Q29kZSBmcm9tIFwicmMtdXRpbC9lcy9LZXlDb2RlXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlTG9jayBmcm9tIFwiLi4vaG9va3MvdXNlTG9ja1wiO1xuaW1wb3J0IHsgaXNWYWxpZGF0ZU9wZW5LZXkgfSBmcm9tIFwiLi4vdXRpbHMva2V5VXRpbFwiO1xuaW1wb3J0IE11bHRpcGxlU2VsZWN0b3IgZnJvbSBcIi4vTXVsdGlwbGVTZWxlY3RvclwiO1xuaW1wb3J0IFNpbmdsZVNlbGVjdG9yIGZyb20gXCIuL1NpbmdsZVNlbGVjdG9yXCI7XG52YXIgU2VsZWN0b3IgPSBmdW5jdGlvbiBTZWxlY3Rvcihwcm9wcywgcmVmKSB7XG4gIHZhciBpbnB1dFJlZiA9IHVzZVJlZihudWxsKTtcbiAgdmFyIGNvbXBvc2l0aW9uU3RhdHVzUmVmID0gdXNlUmVmKGZhbHNlKTtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBvcGVuID0gcHJvcHMub3BlbixcbiAgICBtb2RlID0gcHJvcHMubW9kZSxcbiAgICBzaG93U2VhcmNoID0gcHJvcHMuc2hvd1NlYXJjaCxcbiAgICB0b2tlbldpdGhFbnRlciA9IHByb3BzLnRva2VuV2l0aEVudGVyLFxuICAgIGRpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgcHJlZml4ID0gcHJvcHMucHJlZml4LFxuICAgIGF1dG9DbGVhclNlYXJjaFZhbHVlID0gcHJvcHMuYXV0b0NsZWFyU2VhcmNoVmFsdWUsXG4gICAgb25TZWFyY2ggPSBwcm9wcy5vblNlYXJjaCxcbiAgICBvblNlYXJjaFN1Ym1pdCA9IHByb3BzLm9uU2VhcmNoU3VibWl0LFxuICAgIG9uVG9nZ2xlT3BlbiA9IHByb3BzLm9uVG9nZ2xlT3BlbixcbiAgICBvbklucHV0S2V5RG93biA9IHByb3BzLm9uSW5wdXRLZXlEb3duLFxuICAgIG9uSW5wdXRCbHVyID0gcHJvcHMub25JbnB1dEJsdXIsXG4gICAgZG9tUmVmID0gcHJvcHMuZG9tUmVmO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09IFJlZiA9PT09PT09PT09PT09PT09PT09PT09PVxuICBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBmb2N1czogZnVuY3Rpb24gZm9jdXMob3B0aW9ucykge1xuICAgICAgICBpbnB1dFJlZi5jdXJyZW50LmZvY3VzKG9wdGlvbnMpO1xuICAgICAgfSxcbiAgICAgIGJsdXI6IGZ1bmN0aW9uIGJsdXIoKSB7XG4gICAgICAgIGlucHV0UmVmLmN1cnJlbnQuYmx1cigpO1xuICAgICAgfVxuICAgIH07XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT0gSW5wdXQgPT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX3VzZUxvY2sgPSB1c2VMb2NrKDApLFxuICAgIF91c2VMb2NrMiA9IF9zbGljZWRUb0FycmF5KF91c2VMb2NrLCAyKSxcbiAgICBnZXRJbnB1dE1vdXNlRG93biA9IF91c2VMb2NrMlswXSxcbiAgICBzZXRJbnB1dE1vdXNlRG93biA9IF91c2VMb2NrMlsxXTtcbiAgdmFyIG9uSW50ZXJuYWxJbnB1dEtleURvd24gPSBmdW5jdGlvbiBvbkludGVybmFsSW5wdXRLZXlEb3duKGV2ZW50KSB7XG4gICAgdmFyIHdoaWNoID0gZXZlbnQud2hpY2g7XG5cbiAgICAvLyBDb21wYXRpYmxlIHdpdGggbXVsdGlwbGUgbGluZXMgaW4gVGV4dEFyZWFcbiAgICB2YXIgaXNUZXh0QXJlYUVsZW1lbnQgPSBpbnB1dFJlZi5jdXJyZW50IGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudDtcbiAgICBpZiAoIWlzVGV4dEFyZWFFbGVtZW50ICYmIG9wZW4gJiYgKHdoaWNoID09PSBLZXlDb2RlLlVQIHx8IHdoaWNoID09PSBLZXlDb2RlLkRPV04pKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBpZiAob25JbnB1dEtleURvd24pIHtcbiAgICAgIG9uSW5wdXRLZXlEb3duKGV2ZW50KTtcbiAgICB9XG4gICAgaWYgKHdoaWNoID09PSBLZXlDb2RlLkVOVEVSICYmIG1vZGUgPT09ICd0YWdzJyAmJiAhY29tcG9zaXRpb25TdGF0dXNSZWYuY3VycmVudCAmJiAhb3Blbikge1xuICAgICAgLy8gV2hlbiBtZW51IGlzbid0IG9wZW4sIE9wdGlvbkxpc3Qgd29uJ3QgdHJpZ2dlciBhIHZhbHVlIGNoYW5nZVxuICAgICAgLy8gU28gd2hlbiBlbnRlciBpcyBwcmVzc2VkLCB0aGUgdGFnJ3MgaW5wdXQgdmFsdWUgc2hvdWxkIGJlIGVtaXR0ZWQgaGVyZSB0byBsZXQgc2VsZWN0b3Iga25vd1xuICAgICAgb25TZWFyY2hTdWJtaXQgPT09IG51bGwgfHwgb25TZWFyY2hTdWJtaXQgPT09IHZvaWQgMCB8fCBvblNlYXJjaFN1Ym1pdChldmVudC50YXJnZXQudmFsdWUpO1xuICAgIH1cbiAgICAvLyBNb3ZlIHdpdGhpbiB0aGUgdGV4dCBib3hcbiAgICBpZiAoaXNUZXh0QXJlYUVsZW1lbnQgJiYgIW9wZW4gJiYgfltLZXlDb2RlLlVQLCBLZXlDb2RlLkRPV04sIEtleUNvZGUuTEVGVCwgS2V5Q29kZS5SSUdIVF0uaW5kZXhPZih3aGljaCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGlzVmFsaWRhdGVPcGVuS2V5KHdoaWNoKSkge1xuICAgICAgb25Ub2dnbGVPcGVuKHRydWUpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogV2UgY2FuIG5vdCB1c2UgYGZpbmRET01Ob2RlYCBzaW5lIGl0IHdpbGwgZ2V0IHdhcm5pbmcsXG4gICAqIGhhdmUgdG8gdXNlIHRpbWVyIHRvIGNoZWNrIGlmIGlzIGlucHV0IGVsZW1lbnQuXG4gICAqL1xuICB2YXIgb25JbnRlcm5hbElucHV0TW91c2VEb3duID0gZnVuY3Rpb24gb25JbnRlcm5hbElucHV0TW91c2VEb3duKCkge1xuICAgIHNldElucHV0TW91c2VEb3duKHRydWUpO1xuICB9O1xuXG4gIC8vIFdoZW4gcGFzdGUgY29tZSwgaWdub3JlIG5leHQgb25DaGFuZ2VcbiAgdmFyIHBhc3RlZFRleHRSZWYgPSB1c2VSZWYobnVsbCk7XG4gIHZhciB0cmlnZ2VyT25TZWFyY2ggPSBmdW5jdGlvbiB0cmlnZ2VyT25TZWFyY2godmFsdWUpIHtcbiAgICBpZiAob25TZWFyY2godmFsdWUsIHRydWUsIGNvbXBvc2l0aW9uU3RhdHVzUmVmLmN1cnJlbnQpICE9PSBmYWxzZSkge1xuICAgICAgb25Ub2dnbGVPcGVuKHRydWUpO1xuICAgIH1cbiAgfTtcbiAgdmFyIG9uSW5wdXRDb21wb3NpdGlvblN0YXJ0ID0gZnVuY3Rpb24gb25JbnB1dENvbXBvc2l0aW9uU3RhcnQoKSB7XG4gICAgY29tcG9zaXRpb25TdGF0dXNSZWYuY3VycmVudCA9IHRydWU7XG4gIH07XG4gIHZhciBvbklucHV0Q29tcG9zaXRpb25FbmQgPSBmdW5jdGlvbiBvbklucHV0Q29tcG9zaXRpb25FbmQoZSkge1xuICAgIGNvbXBvc2l0aW9uU3RhdHVzUmVmLmN1cnJlbnQgPSBmYWxzZTtcblxuICAgIC8vIFRyaWdnZXIgc2VhcmNoIGFnYWluIHRvIHN1cHBvcnQgYHRva2VuU2VwYXJhdG9yc2Agd2l0aCB0eXBld3JpdGluZ1xuICAgIGlmIChtb2RlICE9PSAnY29tYm9ib3gnKSB7XG4gICAgICB0cmlnZ2VyT25TZWFyY2goZS50YXJnZXQudmFsdWUpO1xuICAgIH1cbiAgfTtcbiAgdmFyIG9uSW5wdXRDaGFuZ2UgPSBmdW5jdGlvbiBvbklucHV0Q2hhbmdlKGV2ZW50KSB7XG4gICAgdmFyIHZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuXG4gICAgLy8gUGFzdGVkIHRleHQgc2hvdWxkIHJlcGxhY2UgYmFjayB0byBvcmlnaW4gY29udGVudFxuICAgIGlmICh0b2tlbldpdGhFbnRlciAmJiBwYXN0ZWRUZXh0UmVmLmN1cnJlbnQgJiYgL1tcXHJcXG5dLy50ZXN0KHBhc3RlZFRleHRSZWYuY3VycmVudCkpIHtcbiAgICAgIC8vIENSTEYgd2lsbCBiZSB0cmVhdGVkIGFzIGEgc2luZ2xlIHNwYWNlIGZvciBpbnB1dCBlbGVtZW50XG4gICAgICB2YXIgcmVwbGFjZWRUZXh0ID0gcGFzdGVkVGV4dFJlZi5jdXJyZW50LnJlcGxhY2UoL1tcXHJcXG5dKyQvLCAnJykucmVwbGFjZSgvXFxyXFxuL2csICcgJykucmVwbGFjZSgvW1xcclxcbl0vZywgJyAnKTtcbiAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShyZXBsYWNlZFRleHQsIHBhc3RlZFRleHRSZWYuY3VycmVudCk7XG4gICAgfVxuICAgIHBhc3RlZFRleHRSZWYuY3VycmVudCA9IG51bGw7XG4gICAgdHJpZ2dlck9uU2VhcmNoKHZhbHVlKTtcbiAgfTtcbiAgdmFyIG9uSW5wdXRQYXN0ZSA9IGZ1bmN0aW9uIG9uSW5wdXRQYXN0ZShlKSB7XG4gICAgdmFyIGNsaXBib2FyZERhdGEgPSBlLmNsaXBib2FyZERhdGE7XG4gICAgdmFyIHZhbHVlID0gY2xpcGJvYXJkRGF0YSA9PT0gbnVsbCB8fCBjbGlwYm9hcmREYXRhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcbiAgICBwYXN0ZWRUZXh0UmVmLmN1cnJlbnQgPSB2YWx1ZSB8fCAnJztcbiAgfTtcbiAgdmFyIG9uQ2xpY2sgPSBmdW5jdGlvbiBvbkNsaWNrKF9yZWYpIHtcbiAgICB2YXIgdGFyZ2V0ID0gX3JlZi50YXJnZXQ7XG4gICAgaWYgKHRhcmdldCAhPT0gaW5wdXRSZWYuY3VycmVudCkge1xuICAgICAgLy8gU2hvdWxkIGZvY3VzIGlucHV0IGlmIGNsaWNrIHRoZSBzZWxlY3RvclxuICAgICAgdmFyIGlzSUUgPSBkb2N1bWVudC5ib2R5LnN0eWxlLm1zVG91Y2hBY3Rpb24gIT09IHVuZGVmaW5lZDtcbiAgICAgIGlmIChpc0lFKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlucHV0UmVmLmN1cnJlbnQuZm9jdXMoKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnB1dFJlZi5jdXJyZW50LmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICB2YXIgb25Nb3VzZURvd24gPSBmdW5jdGlvbiBvbk1vdXNlRG93bihldmVudCkge1xuICAgIHZhciBpbnB1dE1vdXNlRG93biA9IGdldElucHV0TW91c2VEb3duKCk7XG5cbiAgICAvLyB3aGVuIG1vZGUgaXMgY29tYm9ib3ggYW5kIGl0IGlzIGRpc2FibGVkLCBkb24ndCBwcmV2ZW50IGRlZmF1bHQgYmVoYXZpb3JcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8zNzMyMFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzQ4MjgxXG4gICAgaWYgKGV2ZW50LnRhcmdldCAhPT0gaW5wdXRSZWYuY3VycmVudCAmJiAhaW5wdXRNb3VzZURvd24gJiYgIShtb2RlID09PSAnY29tYm9ib3gnICYmIGRpc2FibGVkKSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgaWYgKG1vZGUgIT09ICdjb21ib2JveCcgJiYgKCFzaG93U2VhcmNoIHx8ICFpbnB1dE1vdXNlRG93bikgfHwgIW9wZW4pIHtcbiAgICAgIGlmIChvcGVuICYmIGF1dG9DbGVhclNlYXJjaFZhbHVlICE9PSBmYWxzZSkge1xuICAgICAgICBvblNlYXJjaCgnJywgdHJ1ZSwgZmFsc2UpO1xuICAgICAgfVxuICAgICAgb25Ub2dnbGVPcGVuKCk7XG4gICAgfVxuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09IElubmVyIFNlbGVjdG9yID09PT09PT09PT09PT09PT09PVxuICB2YXIgc2hhcmVkUHJvcHMgPSB7XG4gICAgaW5wdXRSZWY6IGlucHV0UmVmLFxuICAgIG9uSW5wdXRLZXlEb3duOiBvbkludGVybmFsSW5wdXRLZXlEb3duLFxuICAgIG9uSW5wdXRNb3VzZURvd246IG9uSW50ZXJuYWxJbnB1dE1vdXNlRG93bixcbiAgICBvbklucHV0Q2hhbmdlOiBvbklucHV0Q2hhbmdlLFxuICAgIG9uSW5wdXRQYXN0ZTogb25JbnB1dFBhc3RlLFxuICAgIG9uSW5wdXRDb21wb3NpdGlvblN0YXJ0OiBvbklucHV0Q29tcG9zaXRpb25TdGFydCxcbiAgICBvbklucHV0Q29tcG9zaXRpb25FbmQ6IG9uSW5wdXRDb21wb3NpdGlvbkVuZCxcbiAgICBvbklucHV0Qmx1cjogb25JbnB1dEJsdXJcbiAgfTtcbiAgdmFyIHNlbGVjdE5vZGUgPSBtb2RlID09PSAnbXVsdGlwbGUnIHx8IG1vZGUgPT09ICd0YWdzJyA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE11bHRpcGxlU2VsZWN0b3IsIF9leHRlbmRzKHt9LCBwcm9wcywgc2hhcmVkUHJvcHMpKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNpbmdsZVNlbGVjdG9yLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHNoYXJlZFByb3BzKSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgcmVmOiBkb21SZWYsXG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNlbGVjdG9yXCIpLFxuICAgIG9uQ2xpY2s6IG9uQ2xpY2ssXG4gICAgb25Nb3VzZURvd246IG9uTW91c2VEb3duXG4gIH0sIHByZWZpeCAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXByZWZpeFwiKVxuICB9LCBwcmVmaXgpLCBzZWxlY3ROb2RlKTtcbn07XG52YXIgRm9yd2FyZFNlbGVjdG9yID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoU2VsZWN0b3IpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgRm9yd2FyZFNlbGVjdG9yLmRpc3BsYXlOYW1lID0gJ1NlbGVjdG9yJztcbn1cbmV4cG9ydCBkZWZhdWx0IEZvcndhcmRTZWxlY3RvcjsiLCAiaW1wb3J0IEtleUNvZGUgZnJvbSBcInJjLXV0aWwvZXMvS2V5Q29kZVwiO1xuXG4vKioga2V5Q29kZSBKdWRnbWVudCBmdW5jdGlvbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRhdGVPcGVuS2V5KGN1cnJlbnRLZXlDb2RlKSB7XG4gIHJldHVybiAoXG4gICAgLy8gVW5kZWZpbmVkIGZvciBFZGdlIGJ1ZzpcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy81MTI5MlxuICAgIGN1cnJlbnRLZXlDb2RlICYmXG4gICAgLy8gT3RoZXIga2V5c1xuICAgICFbXG4gICAgLy8gU3lzdGVtIGZ1bmN0aW9uIGJ1dHRvblxuICAgIEtleUNvZGUuRVNDLCBLZXlDb2RlLlNISUZULCBLZXlDb2RlLkJBQ0tTUEFDRSwgS2V5Q29kZS5UQUIsIEtleUNvZGUuV0lOX0tFWSwgS2V5Q29kZS5BTFQsIEtleUNvZGUuTUVUQSwgS2V5Q29kZS5XSU5fS0VZX1JJR0hULCBLZXlDb2RlLkNUUkwsIEtleUNvZGUuU0VNSUNPTE9OLCBLZXlDb2RlLkVRVUFMUywgS2V5Q29kZS5DQVBTX0xPQ0ssIEtleUNvZGUuQ09OVEVYVF9NRU5VLFxuICAgIC8vIEYxLUYxMlxuICAgIEtleUNvZGUuRjEsIEtleUNvZGUuRjIsIEtleUNvZGUuRjMsIEtleUNvZGUuRjQsIEtleUNvZGUuRjUsIEtleUNvZGUuRjYsIEtleUNvZGUuRjcsIEtleUNvZGUuRjgsIEtleUNvZGUuRjksIEtleUNvZGUuRjEwLCBLZXlDb2RlLkYxMSwgS2V5Q29kZS5GMTJdLmluY2x1ZGVzKGN1cnJlbnRLZXlDb2RlKVxuICApO1xufSIsICJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHBpY2tBdHRycyBmcm9tIFwicmMtdXRpbC9lcy9waWNrQXR0cnNcIjtcbmltcG9ydCBPdmVyZmxvdyBmcm9tICdyYy1vdmVyZmxvdyc7XG5pbXBvcnQgVHJhbnNCdG4gZnJvbSBcIi4uL1RyYW5zQnRuXCI7XG5pbXBvcnQgSW5wdXQgZnJvbSBcIi4vSW5wdXRcIjtcbmltcG9ydCB1c2VMYXlvdXRFZmZlY3QgZnJvbSBcIi4uL2hvb2tzL3VzZUxheW91dEVmZmVjdFwiO1xuaW1wb3J0IHsgZ2V0VGl0bGUgfSBmcm9tIFwiLi4vdXRpbHMvY29tbW9uVXRpbFwiO1xuZnVuY3Rpb24gaXRlbUtleSh2YWx1ZSkge1xuICB2YXIgX3ZhbHVlJGtleTtcbiAgcmV0dXJuIChfdmFsdWUka2V5ID0gdmFsdWUua2V5KSAhPT0gbnVsbCAmJiBfdmFsdWUka2V5ICE9PSB2b2lkIDAgPyBfdmFsdWUka2V5IDogdmFsdWUudmFsdWU7XG59XG52YXIgb25QcmV2ZW50TW91c2VEb3duID0gZnVuY3Rpb24gb25QcmV2ZW50TW91c2VEb3duKGV2ZW50KSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xufTtcbnZhciBTZWxlY3RTZWxlY3RvciA9IGZ1bmN0aW9uIFNlbGVjdFNlbGVjdG9yKHByb3BzKSB7XG4gIHZhciBpZCA9IHByb3BzLmlkLFxuICAgIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICB2YWx1ZXMgPSBwcm9wcy52YWx1ZXMsXG4gICAgb3BlbiA9IHByb3BzLm9wZW4sXG4gICAgc2VhcmNoVmFsdWUgPSBwcm9wcy5zZWFyY2hWYWx1ZSxcbiAgICBhdXRvQ2xlYXJTZWFyY2hWYWx1ZSA9IHByb3BzLmF1dG9DbGVhclNlYXJjaFZhbHVlLFxuICAgIGlucHV0UmVmID0gcHJvcHMuaW5wdXRSZWYsXG4gICAgcGxhY2Vob2xkZXIgPSBwcm9wcy5wbGFjZWhvbGRlcixcbiAgICBkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkLFxuICAgIG1vZGUgPSBwcm9wcy5tb2RlLFxuICAgIHNob3dTZWFyY2ggPSBwcm9wcy5zaG93U2VhcmNoLFxuICAgIGF1dG9Gb2N1cyA9IHByb3BzLmF1dG9Gb2N1cyxcbiAgICBhdXRvQ29tcGxldGUgPSBwcm9wcy5hdXRvQ29tcGxldGUsXG4gICAgYWN0aXZlRGVzY2VuZGFudElkID0gcHJvcHMuYWN0aXZlRGVzY2VuZGFudElkLFxuICAgIHRhYkluZGV4ID0gcHJvcHMudGFiSW5kZXgsXG4gICAgcmVtb3ZlSWNvbiA9IHByb3BzLnJlbW92ZUljb24sXG4gICAgbWF4VGFnQ291bnQgPSBwcm9wcy5tYXhUYWdDb3VudCxcbiAgICBtYXhUYWdUZXh0TGVuZ3RoID0gcHJvcHMubWF4VGFnVGV4dExlbmd0aCxcbiAgICBfcHJvcHMkbWF4VGFnUGxhY2Vob2wgPSBwcm9wcy5tYXhUYWdQbGFjZWhvbGRlcixcbiAgICBtYXhUYWdQbGFjZWhvbGRlciA9IF9wcm9wcyRtYXhUYWdQbGFjZWhvbCA9PT0gdm9pZCAwID8gZnVuY3Rpb24gKG9taXR0ZWRWYWx1ZXMpIHtcbiAgICAgIHJldHVybiBcIisgXCIuY29uY2F0KG9taXR0ZWRWYWx1ZXMubGVuZ3RoLCBcIiAuLi5cIik7XG4gICAgfSA6IF9wcm9wcyRtYXhUYWdQbGFjZWhvbCxcbiAgICB0YWdSZW5kZXIgPSBwcm9wcy50YWdSZW5kZXIsXG4gICAgb25Ub2dnbGVPcGVuID0gcHJvcHMub25Ub2dnbGVPcGVuLFxuICAgIG9uUmVtb3ZlID0gcHJvcHMub25SZW1vdmUsXG4gICAgb25JbnB1dENoYW5nZSA9IHByb3BzLm9uSW5wdXRDaGFuZ2UsXG4gICAgb25JbnB1dFBhc3RlID0gcHJvcHMub25JbnB1dFBhc3RlLFxuICAgIG9uSW5wdXRLZXlEb3duID0gcHJvcHMub25JbnB1dEtleURvd24sXG4gICAgb25JbnB1dE1vdXNlRG93biA9IHByb3BzLm9uSW5wdXRNb3VzZURvd24sXG4gICAgb25JbnB1dENvbXBvc2l0aW9uU3RhcnQgPSBwcm9wcy5vbklucHV0Q29tcG9zaXRpb25TdGFydCxcbiAgICBvbklucHV0Q29tcG9zaXRpb25FbmQgPSBwcm9wcy5vbklucHV0Q29tcG9zaXRpb25FbmQsXG4gICAgb25JbnB1dEJsdXIgPSBwcm9wcy5vbklucHV0Qmx1cjtcbiAgdmFyIG1lYXN1cmVSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZSgwKSxcbiAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICBpbnB1dFdpZHRoID0gX3VzZVN0YXRlMlswXSxcbiAgICBzZXRJbnB1dFdpZHRoID0gX3VzZVN0YXRlMlsxXTtcbiAgdmFyIF91c2VTdGF0ZTMgPSB1c2VTdGF0ZShmYWxzZSksXG4gICAgX3VzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZTMsIDIpLFxuICAgIGZvY3VzZWQgPSBfdXNlU3RhdGU0WzBdLFxuICAgIHNldEZvY3VzZWQgPSBfdXNlU3RhdGU0WzFdO1xuICB2YXIgc2VsZWN0aW9uUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zZWxlY3Rpb25cIik7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09IFNlYXJjaCA9PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBpbnB1dFZhbHVlID0gb3BlbiB8fCBtb2RlID09PSAnbXVsdGlwbGUnICYmIGF1dG9DbGVhclNlYXJjaFZhbHVlID09PSBmYWxzZSB8fCBtb2RlID09PSAndGFncycgPyBzZWFyY2hWYWx1ZSA6ICcnO1xuICB2YXIgaW5wdXRFZGl0YWJsZSA9IG1vZGUgPT09ICd0YWdzJyB8fCBtb2RlID09PSAnbXVsdGlwbGUnICYmIGF1dG9DbGVhclNlYXJjaFZhbHVlID09PSBmYWxzZSB8fCBzaG93U2VhcmNoICYmIChvcGVuIHx8IGZvY3VzZWQpO1xuXG4gIC8vIFdlIG1lYXN1cmUgd2lkdGggYW5kIHNldCB0byB0aGUgaW5wdXQgaW1tZWRpYXRlbHlcbiAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBzZXRJbnB1dFdpZHRoKG1lYXN1cmVSZWYuY3VycmVudC5zY3JvbGxXaWR0aCk7XG4gIH0sIFtpbnB1dFZhbHVlXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09XG4gIC8vID4+PiBSZW5kZXIgU2VsZWN0b3IgTm9kZS4gSW5jbHVkZXMgSXRlbSAmIFJlc3RcbiAgdmFyIGRlZmF1bHRSZW5kZXJTZWxlY3RvciA9IGZ1bmN0aW9uIGRlZmF1bHRSZW5kZXJTZWxlY3RvcihpdGVtLCBjb250ZW50LCBpdGVtRGlzYWJsZWQsIGNsb3NhYmxlLCBvbkNsb3NlKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICB0aXRsZTogZ2V0VGl0bGUoaXRlbSksXG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQoc2VsZWN0aW9uUHJlZml4Q2xzLCBcIi1pdGVtXCIpLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHNlbGVjdGlvblByZWZpeENscywgXCItaXRlbS1kaXNhYmxlZFwiKSwgaXRlbURpc2FibGVkKSlcbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChzZWxlY3Rpb25QcmVmaXhDbHMsIFwiLWl0ZW0tY29udGVudFwiKVxuICAgIH0sIGNvbnRlbnQpLCBjbG9zYWJsZSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUcmFuc0J0biwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChzZWxlY3Rpb25QcmVmaXhDbHMsIFwiLWl0ZW0tcmVtb3ZlXCIpLFxuICAgICAgb25Nb3VzZURvd246IG9uUHJldmVudE1vdXNlRG93bixcbiAgICAgIG9uQ2xpY2s6IG9uQ2xvc2UsXG4gICAgICBjdXN0b21pemVJY29uOiByZW1vdmVJY29uXG4gICAgfSwgXCJcXHhEN1wiKSk7XG4gIH07XG4gIHZhciBjdXN0b21pemVSZW5kZXJTZWxlY3RvciA9IGZ1bmN0aW9uIGN1c3RvbWl6ZVJlbmRlclNlbGVjdG9yKHZhbHVlLCBjb250ZW50LCBpdGVtRGlzYWJsZWQsIGNsb3NhYmxlLCBvbkNsb3NlLCBpc01heFRhZykge1xuICAgIHZhciBvbk1vdXNlRG93biA9IGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICAgIG9uUHJldmVudE1vdXNlRG93bihlKTtcbiAgICAgIG9uVG9nZ2xlT3Blbighb3Blbik7XG4gICAgfTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIG9uTW91c2VEb3duOiBvbk1vdXNlRG93blxuICAgIH0sIHRhZ1JlbmRlcih7XG4gICAgICBsYWJlbDogY29udGVudCxcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGRpc2FibGVkOiBpdGVtRGlzYWJsZWQsXG4gICAgICBjbG9zYWJsZTogY2xvc2FibGUsXG4gICAgICBvbkNsb3NlOiBvbkNsb3NlLFxuICAgICAgaXNNYXhUYWc6ICEhaXNNYXhUYWdcbiAgICB9KSk7XG4gIH07XG4gIHZhciByZW5kZXJJdGVtID0gZnVuY3Rpb24gcmVuZGVySXRlbSh2YWx1ZUl0ZW0pIHtcbiAgICB2YXIgaXRlbURpc2FibGVkID0gdmFsdWVJdGVtLmRpc2FibGVkLFxuICAgICAgbGFiZWwgPSB2YWx1ZUl0ZW0ubGFiZWwsXG4gICAgICB2YWx1ZSA9IHZhbHVlSXRlbS52YWx1ZTtcbiAgICB2YXIgY2xvc2FibGUgPSAhZGlzYWJsZWQgJiYgIWl0ZW1EaXNhYmxlZDtcbiAgICB2YXIgZGlzcGxheUxhYmVsID0gbGFiZWw7XG4gICAgaWYgKHR5cGVvZiBtYXhUYWdUZXh0TGVuZ3RoID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKHR5cGVvZiBsYWJlbCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGxhYmVsID09PSAnbnVtYmVyJykge1xuICAgICAgICB2YXIgc3RyTGFiZWwgPSBTdHJpbmcoZGlzcGxheUxhYmVsKTtcbiAgICAgICAgaWYgKHN0ckxhYmVsLmxlbmd0aCA+IG1heFRhZ1RleHRMZW5ndGgpIHtcbiAgICAgICAgICBkaXNwbGF5TGFiZWwgPSBcIlwiLmNvbmNhdChzdHJMYWJlbC5zbGljZSgwLCBtYXhUYWdUZXh0TGVuZ3RoKSwgXCIuLi5cIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIG9uQ2xvc2UgPSBmdW5jdGlvbiBvbkNsb3NlKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgICBvblJlbW92ZSh2YWx1ZUl0ZW0pO1xuICAgIH07XG4gICAgcmV0dXJuIHR5cGVvZiB0YWdSZW5kZXIgPT09ICdmdW5jdGlvbicgPyBjdXN0b21pemVSZW5kZXJTZWxlY3Rvcih2YWx1ZSwgZGlzcGxheUxhYmVsLCBpdGVtRGlzYWJsZWQsIGNsb3NhYmxlLCBvbkNsb3NlKSA6IGRlZmF1bHRSZW5kZXJTZWxlY3Rvcih2YWx1ZUl0ZW0sIGRpc3BsYXlMYWJlbCwgaXRlbURpc2FibGVkLCBjbG9zYWJsZSwgb25DbG9zZSk7XG4gIH07XG4gIHZhciByZW5kZXJSZXN0ID0gZnVuY3Rpb24gcmVuZGVyUmVzdChvbWl0dGVkVmFsdWVzKSB7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvNDg5MzBcbiAgICBpZiAoIXZhbHVlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgY29udGVudCA9IHR5cGVvZiBtYXhUYWdQbGFjZWhvbGRlciA9PT0gJ2Z1bmN0aW9uJyA/IG1heFRhZ1BsYWNlaG9sZGVyKG9taXR0ZWRWYWx1ZXMpIDogbWF4VGFnUGxhY2Vob2xkZXI7XG4gICAgcmV0dXJuIHR5cGVvZiB0YWdSZW5kZXIgPT09ICdmdW5jdGlvbicgPyBjdXN0b21pemVSZW5kZXJTZWxlY3Rvcih1bmRlZmluZWQsIGNvbnRlbnQsIGZhbHNlLCBmYWxzZSwgdW5kZWZpbmVkLCB0cnVlKSA6IGRlZmF1bHRSZW5kZXJTZWxlY3Rvcih7XG4gICAgICB0aXRsZTogY29udGVudFxuICAgIH0sIGNvbnRlbnQsIGZhbHNlKTtcbiAgfTtcblxuICAvLyA+Pj4gSW5wdXQgTm9kZVxuICB2YXIgaW5wdXROb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQoc2VsZWN0aW9uUHJlZml4Q2xzLCBcIi1zZWFyY2hcIiksXG4gICAgc3R5bGU6IHtcbiAgICAgIHdpZHRoOiBpbnB1dFdpZHRoXG4gICAgfSxcbiAgICBvbkZvY3VzOiBmdW5jdGlvbiBvbkZvY3VzKCkge1xuICAgICAgc2V0Rm9jdXNlZCh0cnVlKTtcbiAgICB9LFxuICAgIG9uQmx1cjogZnVuY3Rpb24gb25CbHVyKCkge1xuICAgICAgc2V0Rm9jdXNlZChmYWxzZSk7XG4gICAgfVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJbnB1dCwge1xuICAgIHJlZjogaW5wdXRSZWYsXG4gICAgb3Blbjogb3BlbixcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBpZDogaWQsXG4gICAgaW5wdXRFbGVtZW50OiBudWxsLFxuICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICBhdXRvRm9jdXM6IGF1dG9Gb2N1cyxcbiAgICBhdXRvQ29tcGxldGU6IGF1dG9Db21wbGV0ZSxcbiAgICBlZGl0YWJsZTogaW5wdXRFZGl0YWJsZSxcbiAgICBhY3RpdmVEZXNjZW5kYW50SWQ6IGFjdGl2ZURlc2NlbmRhbnRJZCxcbiAgICB2YWx1ZTogaW5wdXRWYWx1ZSxcbiAgICBvbktleURvd246IG9uSW5wdXRLZXlEb3duLFxuICAgIG9uTW91c2VEb3duOiBvbklucHV0TW91c2VEb3duLFxuICAgIG9uQ2hhbmdlOiBvbklucHV0Q2hhbmdlLFxuICAgIG9uUGFzdGU6IG9uSW5wdXRQYXN0ZSxcbiAgICBvbkNvbXBvc2l0aW9uU3RhcnQ6IG9uSW5wdXRDb21wb3NpdGlvblN0YXJ0LFxuICAgIG9uQ29tcG9zaXRpb25FbmQ6IG9uSW5wdXRDb21wb3NpdGlvbkVuZCxcbiAgICBvbkJsdXI6IG9uSW5wdXRCbHVyLFxuICAgIHRhYkluZGV4OiB0YWJJbmRleCxcbiAgICBhdHRyczogcGlja0F0dHJzKHByb3BzLCB0cnVlKVxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICByZWY6IG1lYXN1cmVSZWYsXG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChzZWxlY3Rpb25QcmVmaXhDbHMsIFwiLXNlYXJjaC1taXJyb3JcIiksXG4gICAgXCJhcmlhLWhpZGRlblwiOiB0cnVlXG4gIH0sIGlucHV0VmFsdWUsIFwiXFx4QTBcIikpO1xuXG4gIC8vID4+PiBTZWxlY3Rpb25zXG4gIHZhciBzZWxlY3Rpb25Ob2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoT3ZlcmZsb3csIHtcbiAgICBwcmVmaXhDbHM6IFwiXCIuY29uY2F0KHNlbGVjdGlvblByZWZpeENscywgXCItb3ZlcmZsb3dcIiksXG4gICAgZGF0YTogdmFsdWVzLFxuICAgIHJlbmRlckl0ZW06IHJlbmRlckl0ZW0sXG4gICAgcmVuZGVyUmVzdDogcmVuZGVyUmVzdCxcbiAgICBzdWZmaXg6IGlucHV0Tm9kZSxcbiAgICBpdGVtS2V5OiBpdGVtS2V5LFxuICAgIG1heENvdW50OiBtYXhUYWdDb3VudFxuICB9KTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChzZWxlY3Rpb25QcmVmaXhDbHMsIFwiLXdyYXBcIilcbiAgfSwgc2VsZWN0aW9uTm9kZSwgIXZhbHVlcy5sZW5ndGggJiYgIWlucHV0VmFsdWUgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHNlbGVjdGlvblByZWZpeENscywgXCItcGxhY2Vob2xkZXJcIilcbiAgfSwgcGxhY2Vob2xkZXIpKTtcbn07XG5leHBvcnQgZGVmYXVsdCBTZWxlY3RTZWxlY3RvcjsiLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcInByZWZpeENsc1wiLCBcImRhdGFcIiwgXCJyZW5kZXJJdGVtXCIsIFwicmVuZGVyUmF3SXRlbVwiLCBcIml0ZW1LZXlcIiwgXCJpdGVtV2lkdGhcIiwgXCJzc3JcIiwgXCJzdHlsZVwiLCBcImNsYXNzTmFtZVwiLCBcIm1heENvdW50XCIsIFwicmVuZGVyUmVzdFwiLCBcInJlbmRlclJhd1Jlc3RcIiwgXCJzdWZmaXhcIiwgXCJjb21wb25lbnRcIiwgXCJpdGVtQ29tcG9uZW50XCIsIFwib25WaXNpYmxlQ2hhbmdlXCJdO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlU3RhdGUsIHVzZU1lbW8sIHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUmVzaXplT2JzZXJ2ZXIgZnJvbSAncmMtcmVzaXplLW9ic2VydmVyJztcbmltcG9ydCB1c2VMYXlvdXRFZmZlY3QgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlTGF5b3V0RWZmZWN0XCI7XG5pbXBvcnQgSXRlbSBmcm9tIFwiLi9JdGVtXCI7XG5pbXBvcnQgdXNlRWZmZWN0U3RhdGUsIHsgdXNlQmF0Y2hlciB9IGZyb20gXCIuL2hvb2tzL3VzZUVmZmVjdFN0YXRlXCI7XG5pbXBvcnQgUmF3SXRlbSBmcm9tIFwiLi9SYXdJdGVtXCI7XG5pbXBvcnQgeyBPdmVyZmxvd0NvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0XCI7XG52YXIgUkVTUE9OU0lWRSA9ICdyZXNwb25zaXZlJztcbnZhciBJTlZBTElEQVRFID0gJ2ludmFsaWRhdGUnO1xuZXhwb3J0IHsgT3ZlcmZsb3dDb250ZXh0IH0gZnJvbSBcIi4vY29udGV4dFwiO1xuZnVuY3Rpb24gZGVmYXVsdFJlbmRlclJlc3Qob21pdHRlZEl0ZW1zKSB7XG4gIHJldHVybiBcIisgXCIuY29uY2F0KG9taXR0ZWRJdGVtcy5sZW5ndGgsIFwiIC4uLlwiKTtcbn1cbmZ1bmN0aW9uIE92ZXJmbG93KHByb3BzLCByZWYpIHtcbiAgdmFyIF9wcm9wcyRwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgcHJlZml4Q2xzID0gX3Byb3BzJHByZWZpeENscyA9PT0gdm9pZCAwID8gJ3JjLW92ZXJmbG93JyA6IF9wcm9wcyRwcmVmaXhDbHMsXG4gICAgX3Byb3BzJGRhdGEgPSBwcm9wcy5kYXRhLFxuICAgIGRhdGEgPSBfcHJvcHMkZGF0YSA9PT0gdm9pZCAwID8gW10gOiBfcHJvcHMkZGF0YSxcbiAgICByZW5kZXJJdGVtID0gcHJvcHMucmVuZGVySXRlbSxcbiAgICByZW5kZXJSYXdJdGVtID0gcHJvcHMucmVuZGVyUmF3SXRlbSxcbiAgICBpdGVtS2V5ID0gcHJvcHMuaXRlbUtleSxcbiAgICBfcHJvcHMkaXRlbVdpZHRoID0gcHJvcHMuaXRlbVdpZHRoLFxuICAgIGl0ZW1XaWR0aCA9IF9wcm9wcyRpdGVtV2lkdGggPT09IHZvaWQgMCA/IDEwIDogX3Byb3BzJGl0ZW1XaWR0aCxcbiAgICBzc3IgPSBwcm9wcy5zc3IsXG4gICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgbWF4Q291bnQgPSBwcm9wcy5tYXhDb3VudCxcbiAgICByZW5kZXJSZXN0ID0gcHJvcHMucmVuZGVyUmVzdCxcbiAgICByZW5kZXJSYXdSZXN0ID0gcHJvcHMucmVuZGVyUmF3UmVzdCxcbiAgICBzdWZmaXggPSBwcm9wcy5zdWZmaXgsXG4gICAgX3Byb3BzJGNvbXBvbmVudCA9IHByb3BzLmNvbXBvbmVudCxcbiAgICBDb21wb25lbnQgPSBfcHJvcHMkY29tcG9uZW50ID09PSB2b2lkIDAgPyAnZGl2JyA6IF9wcm9wcyRjb21wb25lbnQsXG4gICAgaXRlbUNvbXBvbmVudCA9IHByb3BzLml0ZW1Db21wb25lbnQsXG4gICAgb25WaXNpYmxlQ2hhbmdlID0gcHJvcHMub25WaXNpYmxlQ2hhbmdlLFxuICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgX2V4Y2x1ZGVkKTtcbiAgdmFyIGZ1bGx5U1NSID0gc3NyID09PSAnZnVsbCc7XG4gIHZhciBub3RpZnlFZmZlY3RVcGRhdGUgPSB1c2VCYXRjaGVyKCk7XG4gIHZhciBfdXNlRWZmZWN0U3RhdGUgPSB1c2VFZmZlY3RTdGF0ZShub3RpZnlFZmZlY3RVcGRhdGUsIG51bGwpLFxuICAgIF91c2VFZmZlY3RTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlRWZmZWN0U3RhdGUsIDIpLFxuICAgIGNvbnRhaW5lcldpZHRoID0gX3VzZUVmZmVjdFN0YXRlMlswXSxcbiAgICBzZXRDb250YWluZXJXaWR0aCA9IF91c2VFZmZlY3RTdGF0ZTJbMV07XG4gIHZhciBtZXJnZWRDb250YWluZXJXaWR0aCA9IGNvbnRhaW5lcldpZHRoIHx8IDA7XG4gIHZhciBfdXNlRWZmZWN0U3RhdGUzID0gdXNlRWZmZWN0U3RhdGUobm90aWZ5RWZmZWN0VXBkYXRlLCBuZXcgTWFwKCkpLFxuICAgIF91c2VFZmZlY3RTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfdXNlRWZmZWN0U3RhdGUzLCAyKSxcbiAgICBpdGVtV2lkdGhzID0gX3VzZUVmZmVjdFN0YXRlNFswXSxcbiAgICBzZXRJdGVtV2lkdGhzID0gX3VzZUVmZmVjdFN0YXRlNFsxXTtcbiAgdmFyIF91c2VFZmZlY3RTdGF0ZTUgPSB1c2VFZmZlY3RTdGF0ZShub3RpZnlFZmZlY3RVcGRhdGUsIDApLFxuICAgIF91c2VFZmZlY3RTdGF0ZTYgPSBfc2xpY2VkVG9BcnJheShfdXNlRWZmZWN0U3RhdGU1LCAyKSxcbiAgICBwcmV2UmVzdFdpZHRoID0gX3VzZUVmZmVjdFN0YXRlNlswXSxcbiAgICBzZXRQcmV2UmVzdFdpZHRoID0gX3VzZUVmZmVjdFN0YXRlNlsxXTtcbiAgdmFyIF91c2VFZmZlY3RTdGF0ZTcgPSB1c2VFZmZlY3RTdGF0ZShub3RpZnlFZmZlY3RVcGRhdGUsIDApLFxuICAgIF91c2VFZmZlY3RTdGF0ZTggPSBfc2xpY2VkVG9BcnJheShfdXNlRWZmZWN0U3RhdGU3LCAyKSxcbiAgICByZXN0V2lkdGggPSBfdXNlRWZmZWN0U3RhdGU4WzBdLFxuICAgIHNldFJlc3RXaWR0aCA9IF91c2VFZmZlY3RTdGF0ZThbMV07XG4gIHZhciBfdXNlRWZmZWN0U3RhdGU5ID0gdXNlRWZmZWN0U3RhdGUobm90aWZ5RWZmZWN0VXBkYXRlLCAwKSxcbiAgICBfdXNlRWZmZWN0U3RhdGUxMCA9IF9zbGljZWRUb0FycmF5KF91c2VFZmZlY3RTdGF0ZTksIDIpLFxuICAgIHN1ZmZpeFdpZHRoID0gX3VzZUVmZmVjdFN0YXRlMTBbMF0sXG4gICAgc2V0U3VmZml4V2lkdGggPSBfdXNlRWZmZWN0U3RhdGUxMFsxXTtcbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKG51bGwpLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIHN1ZmZpeEZpeGVkU3RhcnQgPSBfdXNlU3RhdGUyWzBdLFxuICAgIHNldFN1ZmZpeEZpeGVkU3RhcnQgPSBfdXNlU3RhdGUyWzFdO1xuICB2YXIgX3VzZVN0YXRlMyA9IHVzZVN0YXRlKG51bGwpLFxuICAgIF91c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUzLCAyKSxcbiAgICBkaXNwbGF5Q291bnQgPSBfdXNlU3RhdGU0WzBdLFxuICAgIHNldERpc3BsYXlDb3VudCA9IF91c2VTdGF0ZTRbMV07XG4gIHZhciBtZXJnZWREaXNwbGF5Q291bnQgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZGlzcGxheUNvdW50ID09PSBudWxsICYmIGZ1bGx5U1NSKSB7XG4gICAgICByZXR1cm4gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XG4gICAgfVxuICAgIHJldHVybiBkaXNwbGF5Q291bnQgfHwgMDtcbiAgfSwgW2Rpc3BsYXlDb3VudCwgY29udGFpbmVyV2lkdGhdKTtcbiAgdmFyIF91c2VTdGF0ZTUgPSB1c2VTdGF0ZShmYWxzZSksXG4gICAgX3VzZVN0YXRlNiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZTUsIDIpLFxuICAgIHJlc3RSZWFkeSA9IF91c2VTdGF0ZTZbMF0sXG4gICAgc2V0UmVzdFJlYWR5ID0gX3VzZVN0YXRlNlsxXTtcbiAgdmFyIGl0ZW1QcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW1cIik7XG5cbiAgLy8gQWx3YXlzIHVzZSB0aGUgbWF4IHdpZHRoIHRvIGF2b2lkIGJsaW5rXG4gIHZhciBtZXJnZWRSZXN0V2lkdGggPSBNYXRoLm1heChwcmV2UmVzdFdpZHRoLCByZXN0V2lkdGgpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBEYXRhID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgaXNSZXNwb25zaXZlID0gbWF4Q291bnQgPT09IFJFU1BPTlNJVkU7XG4gIHZhciBzaG91bGRSZXNwb25zaXZlID0gZGF0YS5sZW5ndGggJiYgaXNSZXNwb25zaXZlO1xuICB2YXIgaW52YWxpZGF0ZSA9IG1heENvdW50ID09PSBJTlZBTElEQVRFO1xuXG4gIC8qKlxuICAgKiBXaGVuIGlzIGByZXNwb25zaXZlYCwgd2Ugd2lsbCBhbHdheXMgcmVuZGVyIHJlc3Qgbm9kZSB0byBnZXQgdGhlIHJlYWwgd2lkdGggb2YgaXQgZm9yIGNhbGN1bGF0aW9uXG4gICAqL1xuICB2YXIgc2hvd1Jlc3QgPSBzaG91bGRSZXNwb25zaXZlIHx8IHR5cGVvZiBtYXhDb3VudCA9PT0gJ251bWJlcicgJiYgZGF0YS5sZW5ndGggPiBtYXhDb3VudDtcbiAgdmFyIG1lcmdlZERhdGEgPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaXRlbXMgPSBkYXRhO1xuICAgIGlmIChzaG91bGRSZXNwb25zaXZlKSB7XG4gICAgICBpZiAoY29udGFpbmVyV2lkdGggPT09IG51bGwgJiYgZnVsbHlTU1IpIHtcbiAgICAgICAgaXRlbXMgPSBkYXRhO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXRlbXMgPSBkYXRhLnNsaWNlKDAsIE1hdGgubWluKGRhdGEubGVuZ3RoLCBtZXJnZWRDb250YWluZXJXaWR0aCAvIGl0ZW1XaWR0aCkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1heENvdW50ID09PSAnbnVtYmVyJykge1xuICAgICAgaXRlbXMgPSBkYXRhLnNsaWNlKDAsIG1heENvdW50KTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9LCBbZGF0YSwgaXRlbVdpZHRoLCBjb250YWluZXJXaWR0aCwgbWF4Q291bnQsIHNob3VsZFJlc3BvbnNpdmVdKTtcbiAgdmFyIG9taXR0ZWRJdGVtcyA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGlmIChzaG91bGRSZXNwb25zaXZlKSB7XG4gICAgICByZXR1cm4gZGF0YS5zbGljZShtZXJnZWREaXNwbGF5Q291bnQgKyAxKTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGEuc2xpY2UobWVyZ2VkRGF0YS5sZW5ndGgpO1xuICB9LCBbZGF0YSwgbWVyZ2VkRGF0YSwgc2hvdWxkUmVzcG9uc2l2ZSwgbWVyZ2VkRGlzcGxheUNvdW50XSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEl0ZW0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBnZXRLZXkgPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHtcbiAgICB2YXIgX3JlZjtcbiAgICBpZiAodHlwZW9mIGl0ZW1LZXkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBpdGVtS2V5KGl0ZW0pO1xuICAgIH1cbiAgICByZXR1cm4gKF9yZWYgPSBpdGVtS2V5ICYmIChpdGVtID09PSBudWxsIHx8IGl0ZW0gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGl0ZW1baXRlbUtleV0pKSAhPT0gbnVsbCAmJiBfcmVmICE9PSB2b2lkIDAgPyBfcmVmIDogaW5kZXg7XG4gIH0sIFtpdGVtS2V5XSk7XG4gIHZhciBtZXJnZWRSZW5kZXJJdGVtID0gdXNlQ2FsbGJhY2socmVuZGVySXRlbSB8fCBmdW5jdGlvbiAoaXRlbSkge1xuICAgIHJldHVybiBpdGVtO1xuICB9LCBbcmVuZGVySXRlbV0pO1xuICBmdW5jdGlvbiB1cGRhdGVEaXNwbGF5Q291bnQoY291bnQsIHN1ZmZpeEZpeGVkU3RhcnRWYWwsIG5vdFJlYWR5KSB7XG4gICAgLy8gUmVhY3QgMTggd2lsbCBzeW5jIHJlbmRlciBldmVuIHdoZW4gdGhlIHZhbHVlIGlzIHNhbWUgaW4gc29tZSBjYXNlLlxuICAgIC8vIFdlIHRha2UgYG1lcmdlZERhdGFgIGFzIGRlcHMgd2hpY2ggbWF5IGNhdXNlIGRlYWQgbG9vcCBpZiBpdCdzIGR5bmFtaWMgZ2VuZXJhdGUuXG4gICAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8zNjU1OVxuICAgIGlmIChkaXNwbGF5Q291bnQgPT09IGNvdW50ICYmIChzdWZmaXhGaXhlZFN0YXJ0VmFsID09PSB1bmRlZmluZWQgfHwgc3VmZml4Rml4ZWRTdGFydFZhbCA9PT0gc3VmZml4Rml4ZWRTdGFydCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2V0RGlzcGxheUNvdW50KGNvdW50KTtcbiAgICBpZiAoIW5vdFJlYWR5KSB7XG4gICAgICBzZXRSZXN0UmVhZHkoY291bnQgPCBkYXRhLmxlbmd0aCAtIDEpO1xuICAgICAgb25WaXNpYmxlQ2hhbmdlID09PSBudWxsIHx8IG9uVmlzaWJsZUNoYW5nZSA9PT0gdm9pZCAwIHx8IG9uVmlzaWJsZUNoYW5nZShjb3VudCk7XG4gICAgfVxuICAgIGlmIChzdWZmaXhGaXhlZFN0YXJ0VmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNldFN1ZmZpeEZpeGVkU3RhcnQoc3VmZml4Rml4ZWRTdGFydFZhbCk7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNpemUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGZ1bmN0aW9uIG9uT3ZlcmZsb3dSZXNpemUoXywgZWxlbWVudCkge1xuICAgIHNldENvbnRhaW5lcldpZHRoKGVsZW1lbnQuY2xpZW50V2lkdGgpO1xuICB9XG4gIGZ1bmN0aW9uIHJlZ2lzdGVyU2l6ZShrZXksIHdpZHRoKSB7XG4gICAgc2V0SXRlbVdpZHRocyhmdW5jdGlvbiAob3JpZ2luKSB7XG4gICAgICB2YXIgY2xvbmUgPSBuZXcgTWFwKG9yaWdpbik7XG4gICAgICBpZiAod2lkdGggPT09IG51bGwpIHtcbiAgICAgICAgY2xvbmUuZGVsZXRlKGtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbG9uZS5zZXQoa2V5LCB3aWR0aCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2xvbmU7XG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gcmVnaXN0ZXJPdmVyZmxvd1NpemUoXywgd2lkdGgpIHtcbiAgICBzZXRSZXN0V2lkdGgod2lkdGgpO1xuICAgIHNldFByZXZSZXN0V2lkdGgocmVzdFdpZHRoKTtcbiAgfVxuICBmdW5jdGlvbiByZWdpc3RlclN1ZmZpeFNpemUoXywgd2lkdGgpIHtcbiAgICBzZXRTdWZmaXhXaWR0aCh3aWR0aCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFZmZlY3QgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgZnVuY3Rpb24gZ2V0SXRlbVdpZHRoKGluZGV4KSB7XG4gICAgcmV0dXJuIGl0ZW1XaWR0aHMuZ2V0KGdldEtleShtZXJnZWREYXRhW2luZGV4XSwgaW5kZXgpKTtcbiAgfVxuICB1c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChtZXJnZWRDb250YWluZXJXaWR0aCAmJiB0eXBlb2YgbWVyZ2VkUmVzdFdpZHRoID09PSAnbnVtYmVyJyAmJiBtZXJnZWREYXRhKSB7XG4gICAgICB2YXIgdG90YWxXaWR0aCA9IHN1ZmZpeFdpZHRoO1xuICAgICAgdmFyIGxlbiA9IG1lcmdlZERhdGEubGVuZ3RoO1xuICAgICAgdmFyIGxhc3RJbmRleCA9IGxlbiAtIDE7XG5cbiAgICAgIC8vIFdoZW4gZGF0YSBjb3VudCBjaGFuZ2UgdG8gMCwgcmVzZXQgdGhpcyBzaW5jZSBub3QgbG9vcCB3aWxsIHJlYWNoXG4gICAgICBpZiAoIWxlbikge1xuICAgICAgICB1cGRhdGVEaXNwbGF5Q291bnQoMCwgbnVsbCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRJdGVtV2lkdGggPSBnZXRJdGVtV2lkdGgoaSk7XG5cbiAgICAgICAgLy8gRnVsbHkgd2lsbCBhbHdheXMgcmVuZGVyXG4gICAgICAgIGlmIChmdWxseVNTUikge1xuICAgICAgICAgIGN1cnJlbnRJdGVtV2lkdGggPSBjdXJyZW50SXRlbVdpZHRoIHx8IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCcmVhayBzaW5jZSBkYXRhIG5vdCByZWFkeVxuICAgICAgICBpZiAoY3VycmVudEl0ZW1XaWR0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdXBkYXRlRGlzcGxheUNvdW50KGkgLSAxLCB1bmRlZmluZWQsIHRydWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmluZCBiZXN0IG1hdGNoXG4gICAgICAgIHRvdGFsV2lkdGggKz0gY3VycmVudEl0ZW1XaWR0aDtcbiAgICAgICAgaWYgKFxuICAgICAgICAvLyBPbmx5IG9uZSBtZWFucyBgdG90YWxXaWR0aGAgaXMgdGhlIGZpbmFsIHdpZHRoXG4gICAgICAgIGxhc3RJbmRleCA9PT0gMCAmJiB0b3RhbFdpZHRoIDw9IG1lcmdlZENvbnRhaW5lcldpZHRoIHx8XG4gICAgICAgIC8vIExhc3QgdHdvIHdpZHRoIHdpbGwgYmUgdGhlIGZpbmFsIHdpZHRoXG4gICAgICAgIGkgPT09IGxhc3RJbmRleCAtIDEgJiYgdG90YWxXaWR0aCArIGdldEl0ZW1XaWR0aChsYXN0SW5kZXgpIDw9IG1lcmdlZENvbnRhaW5lcldpZHRoKSB7XG4gICAgICAgICAgLy8gQWRkaXRpb25hbCBjaGVjayBpZiBtYXRjaCB0aGUgZW5kXG4gICAgICAgICAgdXBkYXRlRGlzcGxheUNvdW50KGxhc3RJbmRleCwgbnVsbCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSBpZiAodG90YWxXaWR0aCArIG1lcmdlZFJlc3RXaWR0aCA+IG1lcmdlZENvbnRhaW5lcldpZHRoKSB7XG4gICAgICAgICAgLy8gQ2FuIG5vdCBob2xkIGFsbCB0aGUgY29udGVudCB0byBzaG93IHJlc3RcbiAgICAgICAgICB1cGRhdGVEaXNwbGF5Q291bnQoaSAtIDEsIHRvdGFsV2lkdGggLSBjdXJyZW50SXRlbVdpZHRoIC0gc3VmZml4V2lkdGggKyByZXN0V2lkdGgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc3VmZml4ICYmIGdldEl0ZW1XaWR0aCgwKSArIHN1ZmZpeFdpZHRoID4gbWVyZ2VkQ29udGFpbmVyV2lkdGgpIHtcbiAgICAgICAgc2V0U3VmZml4Rml4ZWRTdGFydChudWxsKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIFttZXJnZWRDb250YWluZXJXaWR0aCwgaXRlbVdpZHRocywgcmVzdFdpZHRoLCBzdWZmaXhXaWR0aCwgZ2V0S2V5LCBtZXJnZWREYXRhXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBkaXNwbGF5UmVzdCA9IHJlc3RSZWFkeSAmJiAhIW9taXR0ZWRJdGVtcy5sZW5ndGg7XG4gIHZhciBzdWZmaXhTdHlsZSA9IHt9O1xuICBpZiAoc3VmZml4Rml4ZWRTdGFydCAhPT0gbnVsbCAmJiBzaG91bGRSZXNwb25zaXZlKSB7XG4gICAgc3VmZml4U3R5bGUgPSB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIGxlZnQ6IHN1ZmZpeEZpeGVkU3RhcnQsXG4gICAgICB0b3A6IDBcbiAgICB9O1xuICB9XG4gIHZhciBpdGVtU2hhcmVkUHJvcHMgPSB7XG4gICAgcHJlZml4Q2xzOiBpdGVtUHJlZml4Q2xzLFxuICAgIHJlc3BvbnNpdmU6IHNob3VsZFJlc3BvbnNpdmUsXG4gICAgY29tcG9uZW50OiBpdGVtQ29tcG9uZW50LFxuICAgIGludmFsaWRhdGU6IGludmFsaWRhdGVcbiAgfTtcblxuICAvLyA+Pj4+PiBDaG9pY2UgcmVuZGVyIGZ1biBieSBgcmVuZGVyUmF3SXRlbWBcbiAgdmFyIGludGVybmFsUmVuZGVySXRlbU5vZGUgPSByZW5kZXJSYXdJdGVtID8gZnVuY3Rpb24gKGl0ZW0sIGluZGV4KSB7XG4gICAgdmFyIGtleSA9IGdldEtleShpdGVtLCBpbmRleCk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE92ZXJmbG93Q29udGV4dC5Qcm92aWRlciwge1xuICAgICAga2V5OiBrZXksXG4gICAgICB2YWx1ZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBpdGVtU2hhcmVkUHJvcHMpLCB7fSwge1xuICAgICAgICBvcmRlcjogaW5kZXgsXG4gICAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICAgIGl0ZW1LZXk6IGtleSxcbiAgICAgICAgcmVnaXN0ZXJTaXplOiByZWdpc3RlclNpemUsXG4gICAgICAgIGRpc3BsYXk6IGluZGV4IDw9IG1lcmdlZERpc3BsYXlDb3VudFxuICAgICAgfSlcbiAgICB9LCByZW5kZXJSYXdJdGVtKGl0ZW0sIGluZGV4KSk7XG4gIH0gOiBmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHtcbiAgICB2YXIga2V5ID0gZ2V0S2V5KGl0ZW0sIGluZGV4KTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSXRlbSwgX2V4dGVuZHMoe30sIGl0ZW1TaGFyZWRQcm9wcywge1xuICAgICAgb3JkZXI6IGluZGV4LFxuICAgICAga2V5OiBrZXksXG4gICAgICBpdGVtOiBpdGVtLFxuICAgICAgcmVuZGVySXRlbTogbWVyZ2VkUmVuZGVySXRlbSxcbiAgICAgIGl0ZW1LZXk6IGtleSxcbiAgICAgIHJlZ2lzdGVyU2l6ZTogcmVnaXN0ZXJTaXplLFxuICAgICAgZGlzcGxheTogaW5kZXggPD0gbWVyZ2VkRGlzcGxheUNvdW50XG4gICAgfSkpO1xuICB9O1xuXG4gIC8vID4+Pj4+IFJlc3Qgbm9kZVxuICB2YXIgcmVzdENvbnRleHRQcm9wcyA9IHtcbiAgICBvcmRlcjogZGlzcGxheVJlc3QgPyBtZXJnZWREaXNwbGF5Q291bnQgOiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KGl0ZW1QcmVmaXhDbHMsIFwiLXJlc3RcIiksXG4gICAgcmVnaXN0ZXJTaXplOiByZWdpc3Rlck92ZXJmbG93U2l6ZSxcbiAgICBkaXNwbGF5OiBkaXNwbGF5UmVzdFxuICB9O1xuICB2YXIgbWVyZ2VkUmVuZGVyUmVzdCA9IHJlbmRlclJlc3QgfHwgZGVmYXVsdFJlbmRlclJlc3Q7XG4gIHZhciByZXN0Tm9kZSA9IHJlbmRlclJhd1Jlc3QgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChPdmVyZmxvd0NvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBpdGVtU2hhcmVkUHJvcHMpLCByZXN0Q29udGV4dFByb3BzKVxuICB9LCByZW5kZXJSYXdSZXN0KG9taXR0ZWRJdGVtcykpIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSXRlbSwgX2V4dGVuZHMoe30sIGl0ZW1TaGFyZWRQcm9wcywgcmVzdENvbnRleHRQcm9wcyksIHR5cGVvZiBtZXJnZWRSZW5kZXJSZXN0ID09PSAnZnVuY3Rpb24nID8gbWVyZ2VkUmVuZGVyUmVzdChvbWl0dGVkSXRlbXMpIDogbWVyZ2VkUmVuZGVyUmVzdCk7XG4gIHZhciBvdmVyZmxvd05vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb25lbnQsIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoIWludmFsaWRhdGUgJiYgcHJlZml4Q2xzLCBjbGFzc05hbWUpLFxuICAgIHN0eWxlOiBzdHlsZSxcbiAgICByZWY6IHJlZlxuICB9LCByZXN0UHJvcHMpLCBtZXJnZWREYXRhLm1hcChpbnRlcm5hbFJlbmRlckl0ZW1Ob2RlKSwgc2hvd1Jlc3QgPyByZXN0Tm9kZSA6IG51bGwsIHN1ZmZpeCAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJdGVtLCBfZXh0ZW5kcyh7fSwgaXRlbVNoYXJlZFByb3BzLCB7XG4gICAgcmVzcG9uc2l2ZTogaXNSZXNwb25zaXZlLFxuICAgIHJlc3BvbnNpdmVEaXNhYmxlZDogIXNob3VsZFJlc3BvbnNpdmUsXG4gICAgb3JkZXI6IG1lcmdlZERpc3BsYXlDb3VudCxcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KGl0ZW1QcmVmaXhDbHMsIFwiLXN1ZmZpeFwiKSxcbiAgICByZWdpc3RlclNpemU6IHJlZ2lzdGVyU3VmZml4U2l6ZSxcbiAgICBkaXNwbGF5OiB0cnVlLFxuICAgIHN0eWxlOiBzdWZmaXhTdHlsZVxuICB9KSwgc3VmZml4KSk7XG4gIHJldHVybiBpc1Jlc3BvbnNpdmUgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZXNpemVPYnNlcnZlciwge1xuICAgIG9uUmVzaXplOiBvbk92ZXJmbG93UmVzaXplLFxuICAgIGRpc2FibGVkOiAhc2hvdWxkUmVzcG9uc2l2ZVxuICB9LCBvdmVyZmxvd05vZGUpIDogb3ZlcmZsb3dOb2RlO1xufVxudmFyIEZvcndhcmRPdmVyZmxvdyA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKE92ZXJmbG93KTtcbkZvcndhcmRPdmVyZmxvdy5kaXNwbGF5TmFtZSA9ICdPdmVyZmxvdyc7XG5Gb3J3YXJkT3ZlcmZsb3cuSXRlbSA9IFJhd0l0ZW07XG5Gb3J3YXJkT3ZlcmZsb3cuUkVTUE9OU0lWRSA9IFJFU1BPTlNJVkU7XG5Gb3J3YXJkT3ZlcmZsb3cuSU5WQUxJREFURSA9IElOVkFMSURBVEU7XG5cbi8vIENvbnZlcnQgdG8gZ2VuZXJpYyB0eXBlXG5leHBvcnQgZGVmYXVsdCBGb3J3YXJkT3ZlcmZsb3c7IiwgImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wicHJlZml4Q2xzXCIsIFwiaW52YWxpZGF0ZVwiLCBcIml0ZW1cIiwgXCJyZW5kZXJJdGVtXCIsIFwicmVzcG9uc2l2ZVwiLCBcInJlc3BvbnNpdmVEaXNhYmxlZFwiLCBcInJlZ2lzdGVyU2l6ZVwiLCBcIml0ZW1LZXlcIiwgXCJjbGFzc05hbWVcIiwgXCJzdHlsZVwiLCBcImNoaWxkcmVuXCIsIFwiZGlzcGxheVwiLCBcIm9yZGVyXCIsIFwiY29tcG9uZW50XCJdO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUmVzaXplT2JzZXJ2ZXIgZnJvbSAncmMtcmVzaXplLW9ic2VydmVyJztcbi8vIFVzZSBzaGFyZWQgdmFyaWFibGUgdG8gc2F2ZSBidW5kbGUgc2l6ZVxudmFyIFVOREVGSU5FRCA9IHVuZGVmaW5lZDtcbmZ1bmN0aW9uIEludGVybmFsSXRlbShwcm9wcywgcmVmKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgaW52YWxpZGF0ZSA9IHByb3BzLmludmFsaWRhdGUsXG4gICAgaXRlbSA9IHByb3BzLml0ZW0sXG4gICAgcmVuZGVySXRlbSA9IHByb3BzLnJlbmRlckl0ZW0sXG4gICAgcmVzcG9uc2l2ZSA9IHByb3BzLnJlc3BvbnNpdmUsXG4gICAgcmVzcG9uc2l2ZURpc2FibGVkID0gcHJvcHMucmVzcG9uc2l2ZURpc2FibGVkLFxuICAgIHJlZ2lzdGVyU2l6ZSA9IHByb3BzLnJlZ2lzdGVyU2l6ZSxcbiAgICBpdGVtS2V5ID0gcHJvcHMuaXRlbUtleSxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgIGRpc3BsYXkgPSBwcm9wcy5kaXNwbGF5LFxuICAgIG9yZGVyID0gcHJvcHMub3JkZXIsXG4gICAgX3Byb3BzJGNvbXBvbmVudCA9IHByb3BzLmNvbXBvbmVudCxcbiAgICBDb21wb25lbnQgPSBfcHJvcHMkY29tcG9uZW50ID09PSB2b2lkIDAgPyAnZGl2JyA6IF9wcm9wcyRjb21wb25lbnQsXG4gICAgcmVzdFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBfZXhjbHVkZWQpO1xuICB2YXIgbWVyZ2VkSGlkZGVuID0gcmVzcG9uc2l2ZSAmJiAhZGlzcGxheTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFZmZlY3QgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgZnVuY3Rpb24gaW50ZXJuYWxSZWdpc3RlclNpemUod2lkdGgpIHtcbiAgICByZWdpc3RlclNpemUoaXRlbUtleSwgd2lkdGgpO1xuICB9XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGludGVybmFsUmVnaXN0ZXJTaXplKG51bGwpO1xuICAgIH07XG4gIH0sIFtdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGNoaWxkTm9kZSA9IHJlbmRlckl0ZW0gJiYgaXRlbSAhPT0gVU5ERUZJTkVEID8gcmVuZGVySXRlbShpdGVtLCB7XG4gICAgaW5kZXg6IG9yZGVyXG4gIH0pIDogY2hpbGRyZW47XG4gIHZhciBvdmVyZmxvd1N0eWxlO1xuICBpZiAoIWludmFsaWRhdGUpIHtcbiAgICBvdmVyZmxvd1N0eWxlID0ge1xuICAgICAgb3BhY2l0eTogbWVyZ2VkSGlkZGVuID8gMCA6IDEsXG4gICAgICBoZWlnaHQ6IG1lcmdlZEhpZGRlbiA/IDAgOiBVTkRFRklORUQsXG4gICAgICBvdmVyZmxvd1k6IG1lcmdlZEhpZGRlbiA/ICdoaWRkZW4nIDogVU5ERUZJTkVELFxuICAgICAgb3JkZXI6IHJlc3BvbnNpdmUgPyBvcmRlciA6IFVOREVGSU5FRCxcbiAgICAgIHBvaW50ZXJFdmVudHM6IG1lcmdlZEhpZGRlbiA/ICdub25lJyA6IFVOREVGSU5FRCxcbiAgICAgIHBvc2l0aW9uOiBtZXJnZWRIaWRkZW4gPyAnYWJzb2x1dGUnIDogVU5ERUZJTkVEXG4gICAgfTtcbiAgfVxuICB2YXIgb3ZlcmZsb3dQcm9wcyA9IHt9O1xuICBpZiAobWVyZ2VkSGlkZGVuKSB7XG4gICAgb3ZlcmZsb3dQcm9wc1snYXJpYS1oaWRkZW4nXSA9IHRydWU7XG4gIH1cbiAgdmFyIGl0ZW1Ob2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKCFpbnZhbGlkYXRlICYmIHByZWZpeENscywgY2xhc3NOYW1lKSxcbiAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBvdmVyZmxvd1N0eWxlKSwgc3R5bGUpXG4gIH0sIG92ZXJmbG93UHJvcHMsIHJlc3RQcm9wcywge1xuICAgIHJlZjogcmVmXG4gIH0pLCBjaGlsZE5vZGUpO1xuICBpZiAocmVzcG9uc2l2ZSkge1xuICAgIGl0ZW1Ob2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVzaXplT2JzZXJ2ZXIsIHtcbiAgICAgIG9uUmVzaXplOiBmdW5jdGlvbiBvblJlc2l6ZShfcmVmKSB7XG4gICAgICAgIHZhciBvZmZzZXRXaWR0aCA9IF9yZWYub2Zmc2V0V2lkdGg7XG4gICAgICAgIGludGVybmFsUmVnaXN0ZXJTaXplKG9mZnNldFdpZHRoKTtcbiAgICAgIH0sXG4gICAgICBkaXNhYmxlZDogcmVzcG9uc2l2ZURpc2FibGVkXG4gICAgfSwgaXRlbU5vZGUpO1xuICB9XG4gIHJldHVybiBpdGVtTm9kZTtcbn1cbnZhciBJdGVtID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoSW50ZXJuYWxJdGVtKTtcbkl0ZW0uZGlzcGxheU5hbWUgPSAnSXRlbSc7XG5leHBvcnQgZGVmYXVsdCBJdGVtOyIsICJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCB1c2VFdmVudCBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VFdmVudFwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMgfSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IGNoYW5uZWxVcGRhdGUgZnJvbSBcIi4vY2hhbm5lbFVwZGF0ZVwiO1xuLyoqXG4gKiBCYXRjaGVyIGZvciByZWNvcmQgYW55IGB1c2VFZmZlY3RTdGF0ZWAgbmVlZCB1cGRhdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VCYXRjaGVyKCkge1xuICAvLyBVcGRhdGVyIFRyaWdnZXJcbiAgdmFyIHVwZGF0ZUZ1bmNSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG5cbiAgLy8gTm90aWZ5IHVwZGF0ZVxuICB2YXIgbm90aWZ5RWZmZWN0VXBkYXRlID0gZnVuY3Rpb24gbm90aWZ5RWZmZWN0VXBkYXRlKGNhbGxiYWNrKSB7XG4gICAgaWYgKCF1cGRhdGVGdW5jUmVmLmN1cnJlbnQpIHtcbiAgICAgIHVwZGF0ZUZ1bmNSZWYuY3VycmVudCA9IFtdO1xuICAgICAgY2hhbm5lbFVwZGF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB1cGRhdGVGdW5jUmVmLmN1cnJlbnQuZm9yRWFjaChmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgICAgIGZuKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdXBkYXRlRnVuY1JlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdXBkYXRlRnVuY1JlZi5jdXJyZW50LnB1c2goY2FsbGJhY2spO1xuICB9O1xuICByZXR1cm4gbm90aWZ5RWZmZWN0VXBkYXRlO1xufVxuXG4vKipcbiAqIFRyaWdnZXIgc3RhdGUgdXBkYXRlIGJ5IGB1c2VMYXlvdXRFZmZlY3RgIHRvIHNhdmUgcGVyZi5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlRWZmZWN0U3RhdGUobm90aWZ5RWZmZWN0VXBkYXRlLCBkZWZhdWx0VmFsdWUpIHtcbiAgLy8gVmFsdWVcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGRlZmF1bHRWYWx1ZSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgc3RhdGVWYWx1ZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0U3RhdGVWYWx1ZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG5cbiAgLy8gU2V0IFN0YXRlXG4gIHZhciBzZXRFZmZlY3RWYWwgPSB1c2VFdmVudChmdW5jdGlvbiAobmV4dFZhbHVlKSB7XG4gICAgbm90aWZ5RWZmZWN0VXBkYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNldFN0YXRlVmFsdWUobmV4dFZhbHVlKTtcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBbc3RhdGVWYWx1ZSwgc2V0RWZmZWN0VmFsXTtcbn0iLCAiaW1wb3J0IHJhZiBmcm9tIFwicmMtdXRpbC9lcy9yYWZcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNoYW5uZWxVcGRhdGUoY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBNZXNzYWdlQ2hhbm5lbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByYWYoY2FsbGJhY2spO1xuICB9IGVsc2Uge1xuICAgIHZhciBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9O1xuICAgIGNoYW5uZWwucG9ydDIucG9zdE1lc3NhZ2UodW5kZWZpbmVkKTtcbiAgfVxufSIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiY29tcG9uZW50XCJdLFxuICBfZXhjbHVkZWQyID0gW1wiY2xhc3NOYW1lXCJdLFxuICBfZXhjbHVkZWQzID0gW1wiY2xhc3NOYW1lXCJdO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgSXRlbSBmcm9tIFwiLi9JdGVtXCI7XG5pbXBvcnQgeyBPdmVyZmxvd0NvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0XCI7XG52YXIgSW50ZXJuYWxSYXdJdGVtID0gZnVuY3Rpb24gSW50ZXJuYWxSYXdJdGVtKHByb3BzLCByZWYpIHtcbiAgdmFyIGNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KE92ZXJmbG93Q29udGV4dCk7XG5cbiAgLy8gUmVuZGVyIGRpcmVjdGx5IHdoZW4gY29udGV4dCBub3QgcHJvdmlkZWRcbiAgaWYgKCFjb250ZXh0KSB7XG4gICAgdmFyIF9wcm9wcyRjb21wb25lbnQgPSBwcm9wcy5jb21wb25lbnQsXG4gICAgICBDb21wb25lbnQgPSBfcHJvcHMkY29tcG9uZW50ID09PSB2b2lkIDAgPyAnZGl2JyA6IF9wcm9wcyRjb21wb25lbnQsXG4gICAgICBfcmVzdFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBfZXhjbHVkZWQpO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb25lbnQsIF9leHRlbmRzKHt9LCBfcmVzdFByb3BzLCB7XG4gICAgICByZWY6IHJlZlxuICAgIH0pKTtcbiAgfVxuICB2YXIgY29udGV4dENsYXNzTmFtZSA9IGNvbnRleHQuY2xhc3NOYW1lLFxuICAgIHJlc3RDb250ZXh0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKGNvbnRleHQsIF9leGNsdWRlZDIpO1xuICB2YXIgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgX2V4Y2x1ZGVkMyk7XG5cbiAgLy8gRG8gbm90IHBhc3MgY29udGV4dCB0byBzdWIgaXRlbSB0byBhdm9pZCBtdWx0aXBsZSBtZWFzdXJlXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChPdmVyZmxvd0NvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogbnVsbFxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJdGVtLCBfZXh0ZW5kcyh7XG4gICAgcmVmOiByZWYsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNvbnRleHRDbGFzc05hbWUsIGNsYXNzTmFtZSlcbiAgfSwgcmVzdENvbnRleHQsIHJlc3RQcm9wcykpKTtcbn07XG52YXIgUmF3SXRlbSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKEludGVybmFsUmF3SXRlbSk7XG5SYXdJdGVtLmRpc3BsYXlOYW1lID0gJ1Jhd0l0ZW0nO1xuZXhwb3J0IGRlZmF1bHQgUmF3SXRlbTsiLCAiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCB2YXIgT3ZlcmZsb3dDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQobnVsbCk7IiwgImltcG9ydCBPdmVyZmxvdyBmcm9tIFwiLi9PdmVyZmxvd1wiO1xuZXhwb3J0IGRlZmF1bHQgT3ZlcmZsb3c7IiwgImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IGNvbXBvc2VSZWYgfSBmcm9tIFwicmMtdXRpbC9lcy9yZWZcIjtcbmltcG9ydCB7IHdhcm5pbmcgfSBmcm9tIFwicmMtdXRpbC9lcy93YXJuaW5nXCI7XG52YXIgSW5wdXQgPSBmdW5jdGlvbiBJbnB1dChwcm9wcywgcmVmKSB7XG4gIHZhciBfaW5wdXROb2RlMjtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBpZCA9IHByb3BzLmlkLFxuICAgIGlucHV0RWxlbWVudCA9IHByb3BzLmlucHV0RWxlbWVudCxcbiAgICBkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkLFxuICAgIHRhYkluZGV4ID0gcHJvcHMudGFiSW5kZXgsXG4gICAgYXV0b0ZvY3VzID0gcHJvcHMuYXV0b0ZvY3VzLFxuICAgIGF1dG9Db21wbGV0ZSA9IHByb3BzLmF1dG9Db21wbGV0ZSxcbiAgICBlZGl0YWJsZSA9IHByb3BzLmVkaXRhYmxlLFxuICAgIGFjdGl2ZURlc2NlbmRhbnRJZCA9IHByb3BzLmFjdGl2ZURlc2NlbmRhbnRJZCxcbiAgICB2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgIG1heExlbmd0aCA9IHByb3BzLm1heExlbmd0aCxcbiAgICBfb25LZXlEb3duID0gcHJvcHMub25LZXlEb3duLFxuICAgIF9vbk1vdXNlRG93biA9IHByb3BzLm9uTW91c2VEb3duLFxuICAgIF9vbkNoYW5nZSA9IHByb3BzLm9uQ2hhbmdlLFxuICAgIG9uUGFzdGUgPSBwcm9wcy5vblBhc3RlLFxuICAgIF9vbkNvbXBvc2l0aW9uU3RhcnQgPSBwcm9wcy5vbkNvbXBvc2l0aW9uU3RhcnQsXG4gICAgX29uQ29tcG9zaXRpb25FbmQgPSBwcm9wcy5vbkNvbXBvc2l0aW9uRW5kLFxuICAgIF9vbkJsdXIgPSBwcm9wcy5vbkJsdXIsXG4gICAgb3BlbiA9IHByb3BzLm9wZW4sXG4gICAgYXR0cnMgPSBwcm9wcy5hdHRycztcbiAgdmFyIGlucHV0Tm9kZSA9IGlucHV0RWxlbWVudCB8fCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImlucHV0XCIsIG51bGwpO1xuICB2YXIgX2lucHV0Tm9kZSA9IGlucHV0Tm9kZSxcbiAgICBvcmlnaW5SZWYgPSBfaW5wdXROb2RlLnJlZixcbiAgICBvcmlnaW5Qcm9wcyA9IF9pbnB1dE5vZGUucHJvcHM7XG4gIHZhciBvbk9yaWdpbktleURvd24gPSBvcmlnaW5Qcm9wcy5vbktleURvd24sXG4gICAgb25PcmlnaW5DaGFuZ2UgPSBvcmlnaW5Qcm9wcy5vbkNoYW5nZSxcbiAgICBvbk9yaWdpbk1vdXNlRG93biA9IG9yaWdpblByb3BzLm9uTW91c2VEb3duLFxuICAgIG9uT3JpZ2luQ29tcG9zaXRpb25TdGFydCA9IG9yaWdpblByb3BzLm9uQ29tcG9zaXRpb25TdGFydCxcbiAgICBvbk9yaWdpbkNvbXBvc2l0aW9uRW5kID0gb3JpZ2luUHJvcHMub25Db21wb3NpdGlvbkVuZCxcbiAgICBvbk9yaWdpbkJsdXIgPSBvcmlnaW5Qcm9wcy5vbkJsdXIsXG4gICAgc3R5bGUgPSBvcmlnaW5Qcm9wcy5zdHlsZTtcbiAgd2FybmluZyghKCdtYXhMZW5ndGgnIGluIGlucHV0Tm9kZS5wcm9wcyksIFwiUGFzc2luZyAnbWF4TGVuZ3RoJyB0byBpbnB1dCBlbGVtZW50IGRpcmVjdGx5IG1heSBub3Qgd29yayBiZWNhdXNlIGlucHV0IGluIEJhc2VTZWxlY3QgaXMgY29udHJvbGxlZC5cIik7XG4gIGlucHV0Tm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoaW5wdXROb2RlLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7XG4gICAgdHlwZTogJ3NlYXJjaCdcbiAgfSwgb3JpZ2luUHJvcHMpLCB7fSwge1xuICAgIC8vIE92ZXJyaWRlIG92ZXIgb3JpZ2luIHByb3BzXG4gICAgaWQ6IGlkLFxuICAgIHJlZjogY29tcG9zZVJlZihyZWYsIG9yaWdpblJlZiksXG4gICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgIHRhYkluZGV4OiB0YWJJbmRleCxcbiAgICBhdXRvQ29tcGxldGU6IGF1dG9Db21wbGV0ZSB8fCAnb2ZmJyxcbiAgICBhdXRvRm9jdXM6IGF1dG9Gb2N1cyxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zZWxlY3Rpb24tc2VhcmNoLWlucHV0XCIpLCAoX2lucHV0Tm9kZTIgPSBpbnB1dE5vZGUpID09PSBudWxsIHx8IF9pbnB1dE5vZGUyID09PSB2b2lkIDAgfHwgKF9pbnB1dE5vZGUyID0gX2lucHV0Tm9kZTIucHJvcHMpID09PSBudWxsIHx8IF9pbnB1dE5vZGUyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfaW5wdXROb2RlMi5jbGFzc05hbWUpLFxuICAgIHJvbGU6ICdjb21ib2JveCcsXG4gICAgJ2FyaWEtZXhwYW5kZWQnOiBvcGVuIHx8IGZhbHNlLFxuICAgICdhcmlhLWhhc3BvcHVwJzogJ2xpc3Rib3gnLFxuICAgICdhcmlhLW93bnMnOiBcIlwiLmNvbmNhdChpZCwgXCJfbGlzdFwiKSxcbiAgICAnYXJpYS1hdXRvY29tcGxldGUnOiAnbGlzdCcsXG4gICAgJ2FyaWEtY29udHJvbHMnOiBcIlwiLmNvbmNhdChpZCwgXCJfbGlzdFwiKSxcbiAgICAnYXJpYS1hY3RpdmVkZXNjZW5kYW50Jzogb3BlbiA/IGFjdGl2ZURlc2NlbmRhbnRJZCA6IHVuZGVmaW5lZFxuICB9LCBhdHRycyksIHt9LCB7XG4gICAgdmFsdWU6IGVkaXRhYmxlID8gdmFsdWUgOiAnJyxcbiAgICBtYXhMZW5ndGg6IG1heExlbmd0aCxcbiAgICByZWFkT25seTogIWVkaXRhYmxlLFxuICAgIHVuc2VsZWN0YWJsZTogIWVkaXRhYmxlID8gJ29uJyA6IG51bGwsXG4gICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3R5bGUpLCB7fSwge1xuICAgICAgb3BhY2l0eTogZWRpdGFibGUgPyBudWxsIDogMFxuICAgIH0pLFxuICAgIG9uS2V5RG93bjogZnVuY3Rpb24gb25LZXlEb3duKGV2ZW50KSB7XG4gICAgICBfb25LZXlEb3duKGV2ZW50KTtcbiAgICAgIGlmIChvbk9yaWdpbktleURvd24pIHtcbiAgICAgICAgb25PcmlnaW5LZXlEb3duKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9uTW91c2VEb3duOiBmdW5jdGlvbiBvbk1vdXNlRG93bihldmVudCkge1xuICAgICAgX29uTW91c2VEb3duKGV2ZW50KTtcbiAgICAgIGlmIChvbk9yaWdpbk1vdXNlRG93bikge1xuICAgICAgICBvbk9yaWdpbk1vdXNlRG93bihldmVudCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UoZXZlbnQpIHtcbiAgICAgIF9vbkNoYW5nZShldmVudCk7XG4gICAgICBpZiAob25PcmlnaW5DaGFuZ2UpIHtcbiAgICAgICAgb25PcmlnaW5DaGFuZ2UoZXZlbnQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgb25Db21wb3NpdGlvblN0YXJ0OiBmdW5jdGlvbiBvbkNvbXBvc2l0aW9uU3RhcnQoZXZlbnQpIHtcbiAgICAgIF9vbkNvbXBvc2l0aW9uU3RhcnQoZXZlbnQpO1xuICAgICAgaWYgKG9uT3JpZ2luQ29tcG9zaXRpb25TdGFydCkge1xuICAgICAgICBvbk9yaWdpbkNvbXBvc2l0aW9uU3RhcnQoZXZlbnQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgb25Db21wb3NpdGlvbkVuZDogZnVuY3Rpb24gb25Db21wb3NpdGlvbkVuZChldmVudCkge1xuICAgICAgX29uQ29tcG9zaXRpb25FbmQoZXZlbnQpO1xuICAgICAgaWYgKG9uT3JpZ2luQ29tcG9zaXRpb25FbmQpIHtcbiAgICAgICAgb25PcmlnaW5Db21wb3NpdGlvbkVuZChldmVudCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBvblBhc3RlOiBvblBhc3RlLFxuICAgIG9uQmx1cjogZnVuY3Rpb24gb25CbHVyKGV2ZW50KSB7XG4gICAgICBfb25CbHVyKGV2ZW50KTtcbiAgICAgIGlmIChvbk9yaWdpbkJsdXIpIHtcbiAgICAgICAgb25PcmlnaW5CbHVyKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pKTtcbiAgcmV0dXJuIGlucHV0Tm9kZTtcbn07XG52YXIgUmVmSW5wdXQgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihJbnB1dCk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBSZWZJbnB1dC5kaXNwbGF5TmFtZSA9ICdJbnB1dCc7XG59XG5leHBvcnQgZGVmYXVsdCBSZWZJbnB1dDsiLCAiLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaG9va3MvcnVsZXMtb2YtaG9va3MgKi9cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGlzQnJvd3NlckNsaWVudCB9IGZyb20gXCIuLi91dGlscy9jb21tb25VdGlsXCI7XG5cbi8qKlxuICogV3JhcCBgUmVhY3QudXNlTGF5b3V0RWZmZWN0YCB3aGljaCB3aWxsIG5vdCB0aHJvdyB3YXJuaW5nIG1lc3NhZ2UgaW4gdGVzdCBlbnZcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlTGF5b3V0RWZmZWN0KGVmZmVjdCwgZGVwcykge1xuICAvLyBOZXZlciBoYXBwZW4gaW4gdGVzdCBlbnZcbiAgaWYgKGlzQnJvd3NlckNsaWVudCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgUmVhY3QudXNlTGF5b3V0RWZmZWN0KGVmZmVjdCwgZGVwcyk7XG4gIH0gZWxzZSB7XG4gICAgUmVhY3QudXNlRWZmZWN0KGVmZmVjdCwgZGVwcyk7XG4gIH1cbn1cbi8qIGVzbGludC1lbmFibGUgKi8iLCAiaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuZXhwb3J0IGZ1bmN0aW9uIHRvQXJyYXkodmFsdWUpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gW3ZhbHVlXSA6IFtdO1xufVxuZXhwb3J0IHZhciBpc0NsaWVudCA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kb2N1bWVudCAmJiB3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG4vKiogSXMgY2xpZW50IHNpZGUgYW5kIG5vdCBqc2RvbSAqL1xuZXhwb3J0IHZhciBpc0Jyb3dzZXJDbGllbnQgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Rlc3QnICYmIGlzQ2xpZW50O1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1ZhbHVlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsO1xufVxuXG4vKiogY29tYm8gbW9kZSBubyB2YWx1ZSBqdWRnbWVudCBmdW5jdGlvbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ29tYm9Ob1ZhbHVlKHZhbHVlKSB7XG4gIHJldHVybiAhdmFsdWUgJiYgdmFsdWUgIT09IDA7XG59XG5mdW5jdGlvbiBpc1RpdGxlVHlwZSh0aXRsZSkge1xuICByZXR1cm4gWydzdHJpbmcnLCAnbnVtYmVyJ10uaW5jbHVkZXMoX3R5cGVvZih0aXRsZSkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFRpdGxlKGl0ZW0pIHtcbiAgdmFyIHRpdGxlID0gdW5kZWZpbmVkO1xuICBpZiAoaXRlbSkge1xuICAgIGlmIChpc1RpdGxlVHlwZShpdGVtLnRpdGxlKSkge1xuICAgICAgdGl0bGUgPSBpdGVtLnRpdGxlLnRvU3RyaW5nKCk7XG4gICAgfSBlbHNlIGlmIChpc1RpdGxlVHlwZShpdGVtLmxhYmVsKSkge1xuICAgICAgdGl0bGUgPSBpdGVtLmxhYmVsLnRvU3RyaW5nKCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aXRsZTtcbn0iLCAiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgcGlja0F0dHJzIGZyb20gXCJyYy11dGlsL2VzL3BpY2tBdHRyc1wiO1xuaW1wb3J0IElucHV0IGZyb20gXCIuL0lucHV0XCI7XG5pbXBvcnQgeyBnZXRUaXRsZSB9IGZyb20gXCIuLi91dGlscy9jb21tb25VdGlsXCI7XG52YXIgU2luZ2xlU2VsZWN0b3IgPSBmdW5jdGlvbiBTaW5nbGVTZWxlY3Rvcihwcm9wcykge1xuICB2YXIgaW5wdXRFbGVtZW50ID0gcHJvcHMuaW5wdXRFbGVtZW50LFxuICAgIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBpZCA9IHByb3BzLmlkLFxuICAgIGlucHV0UmVmID0gcHJvcHMuaW5wdXRSZWYsXG4gICAgZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICBhdXRvRm9jdXMgPSBwcm9wcy5hdXRvRm9jdXMsXG4gICAgYXV0b0NvbXBsZXRlID0gcHJvcHMuYXV0b0NvbXBsZXRlLFxuICAgIGFjdGl2ZURlc2NlbmRhbnRJZCA9IHByb3BzLmFjdGl2ZURlc2NlbmRhbnRJZCxcbiAgICBtb2RlID0gcHJvcHMubW9kZSxcbiAgICBvcGVuID0gcHJvcHMub3BlbixcbiAgICB2YWx1ZXMgPSBwcm9wcy52YWx1ZXMsXG4gICAgcGxhY2Vob2xkZXIgPSBwcm9wcy5wbGFjZWhvbGRlcixcbiAgICB0YWJJbmRleCA9IHByb3BzLnRhYkluZGV4LFxuICAgIHNob3dTZWFyY2ggPSBwcm9wcy5zaG93U2VhcmNoLFxuICAgIHNlYXJjaFZhbHVlID0gcHJvcHMuc2VhcmNoVmFsdWUsXG4gICAgYWN0aXZlVmFsdWUgPSBwcm9wcy5hY3RpdmVWYWx1ZSxcbiAgICBtYXhMZW5ndGggPSBwcm9wcy5tYXhMZW5ndGgsXG4gICAgb25JbnB1dEtleURvd24gPSBwcm9wcy5vbklucHV0S2V5RG93bixcbiAgICBvbklucHV0TW91c2VEb3duID0gcHJvcHMub25JbnB1dE1vdXNlRG93bixcbiAgICBvbklucHV0Q2hhbmdlID0gcHJvcHMub25JbnB1dENoYW5nZSxcbiAgICBvbklucHV0UGFzdGUgPSBwcm9wcy5vbklucHV0UGFzdGUsXG4gICAgb25JbnB1dENvbXBvc2l0aW9uU3RhcnQgPSBwcm9wcy5vbklucHV0Q29tcG9zaXRpb25TdGFydCxcbiAgICBvbklucHV0Q29tcG9zaXRpb25FbmQgPSBwcm9wcy5vbklucHV0Q29tcG9zaXRpb25FbmQsXG4gICAgb25JbnB1dEJsdXIgPSBwcm9wcy5vbklucHV0Qmx1cixcbiAgICB0aXRsZSA9IHByb3BzLnRpdGxlO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIGlucHV0Q2hhbmdlZCA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0SW5wdXRDaGFuZ2VkID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIGNvbWJvYm94ID0gbW9kZSA9PT0gJ2NvbWJvYm94JztcbiAgdmFyIGlucHV0RWRpdGFibGUgPSBjb21ib2JveCB8fCBzaG93U2VhcmNoO1xuICB2YXIgaXRlbSA9IHZhbHVlc1swXTtcbiAgdmFyIGlucHV0VmFsdWUgPSBzZWFyY2hWYWx1ZSB8fCAnJztcbiAgaWYgKGNvbWJvYm94ICYmIGFjdGl2ZVZhbHVlICYmICFpbnB1dENoYW5nZWQpIHtcbiAgICBpbnB1dFZhbHVlID0gYWN0aXZlVmFsdWU7XG4gIH1cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoY29tYm9ib3gpIHtcbiAgICAgIHNldElucHV0Q2hhbmdlZChmYWxzZSk7XG4gICAgfVxuICB9LCBbY29tYm9ib3gsIGFjdGl2ZVZhbHVlXSk7XG5cbiAgLy8gTm90IHNob3cgdGV4dCB3aGVuIGNsb3NlZCBleHBlY3QgY29tYm9ib3ggbW9kZVxuICB2YXIgaGFzVGV4dElucHV0ID0gbW9kZSAhPT0gJ2NvbWJvYm94JyAmJiAhb3BlbiAmJiAhc2hvd1NlYXJjaCA/IGZhbHNlIDogISFpbnB1dFZhbHVlO1xuXG4gIC8vIEdldCB0aXRsZSBvZiBzZWxlY3Rpb24gaXRlbVxuICB2YXIgc2VsZWN0aW9uVGl0bGUgPSB0aXRsZSA9PT0gdW5kZWZpbmVkID8gZ2V0VGl0bGUoaXRlbSkgOiB0aXRsZTtcbiAgdmFyIHBsYWNlaG9sZGVyTm9kZSA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGlmIChpdGVtKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2VsZWN0aW9uLXBsYWNlaG9sZGVyXCIpLFxuICAgICAgc3R5bGU6IGhhc1RleHRJbnB1dCA/IHtcbiAgICAgICAgdmlzaWJpbGl0eTogJ2hpZGRlbidcbiAgICAgIH0gOiB1bmRlZmluZWRcbiAgICB9LCBwbGFjZWhvbGRlcik7XG4gIH0sIFtpdGVtLCBoYXNUZXh0SW5wdXQsIHBsYWNlaG9sZGVyLCBwcmVmaXhDbHNdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNlbGVjdGlvbi13cmFwXCIpXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNlbGVjdGlvbi1zZWFyY2hcIilcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSW5wdXQsIHtcbiAgICByZWY6IGlucHV0UmVmLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGlkOiBpZCxcbiAgICBvcGVuOiBvcGVuLFxuICAgIGlucHV0RWxlbWVudDogaW5wdXRFbGVtZW50LFxuICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICBhdXRvRm9jdXM6IGF1dG9Gb2N1cyxcbiAgICBhdXRvQ29tcGxldGU6IGF1dG9Db21wbGV0ZSxcbiAgICBlZGl0YWJsZTogaW5wdXRFZGl0YWJsZSxcbiAgICBhY3RpdmVEZXNjZW5kYW50SWQ6IGFjdGl2ZURlc2NlbmRhbnRJZCxcbiAgICB2YWx1ZTogaW5wdXRWYWx1ZSxcbiAgICBvbktleURvd246IG9uSW5wdXRLZXlEb3duLFxuICAgIG9uTW91c2VEb3duOiBvbklucHV0TW91c2VEb3duLFxuICAgIG9uQ2hhbmdlOiBmdW5jdGlvbiBvbkNoYW5nZShlKSB7XG4gICAgICBzZXRJbnB1dENoYW5nZWQodHJ1ZSk7XG4gICAgICBvbklucHV0Q2hhbmdlKGUpO1xuICAgIH0sXG4gICAgb25QYXN0ZTogb25JbnB1dFBhc3RlLFxuICAgIG9uQ29tcG9zaXRpb25TdGFydDogb25JbnB1dENvbXBvc2l0aW9uU3RhcnQsXG4gICAgb25Db21wb3NpdGlvbkVuZDogb25JbnB1dENvbXBvc2l0aW9uRW5kLFxuICAgIG9uQmx1cjogb25JbnB1dEJsdXIsXG4gICAgdGFiSW5kZXg6IHRhYkluZGV4LFxuICAgIGF0dHJzOiBwaWNrQXR0cnMocHJvcHMsIHRydWUpLFxuICAgIG1heExlbmd0aDogY29tYm9ib3ggPyBtYXhMZW5ndGggOiB1bmRlZmluZWRcbiAgfSkpLCAhY29tYm9ib3ggJiYgaXRlbSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNlbGVjdGlvbi1pdGVtXCIpLFxuICAgIHRpdGxlOiBzZWxlY3Rpb25UaXRsZVxuICAgIC8vIFx1NUY1MyBTZWxlY3QgXHU1REYyXHU3RUNGXHU5MDA5XHU0RTJEXHU5MDA5XHU5ODc5XHU2NUY2XHVGRjBDXHU4RkQ4XHU5NzAwIHNlbGVjdGlvbiBcdTk2OTBcdTg1Q0ZcdTRGNDZcdTc1NTlcdTU3MjhcdTUzOUZcdTU3MzBcdTUzNjBcdTRGNERcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8yNzY4OFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzQxNTMwXG4gICAgLFxuICAgIHN0eWxlOiBoYXNUZXh0SW5wdXQgPyB7XG4gICAgICB2aXNpYmlsaXR5OiAnaGlkZGVuJ1xuICAgIH0gOiB1bmRlZmluZWRcbiAgfSwgaXRlbS5sYWJlbCkgOiBudWxsLCBwbGFjZWhvbGRlck5vZGUpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFNpbmdsZVNlbGVjdG9yOyIsICJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcInByZWZpeENsc1wiLCBcImNoaWxkcmVuXCIsIFwiYWN0aW9uXCIsIFwic2hvd0FjdGlvblwiLCBcImhpZGVBY3Rpb25cIiwgXCJwb3B1cFZpc2libGVcIiwgXCJkZWZhdWx0UG9wdXBWaXNpYmxlXCIsIFwib25Qb3B1cFZpc2libGVDaGFuZ2VcIiwgXCJhZnRlclBvcHVwVmlzaWJsZUNoYW5nZVwiLCBcIm1vdXNlRW50ZXJEZWxheVwiLCBcIm1vdXNlTGVhdmVEZWxheVwiLCBcImZvY3VzRGVsYXlcIiwgXCJibHVyRGVsYXlcIiwgXCJtYXNrXCIsIFwibWFza0Nsb3NhYmxlXCIsIFwiZ2V0UG9wdXBDb250YWluZXJcIiwgXCJmb3JjZVJlbmRlclwiLCBcImF1dG9EZXN0cm95XCIsIFwiZGVzdHJveVBvcHVwT25IaWRlXCIsIFwicG9wdXBcIiwgXCJwb3B1cENsYXNzTmFtZVwiLCBcInBvcHVwU3R5bGVcIiwgXCJwb3B1cFBsYWNlbWVudFwiLCBcImJ1aWx0aW5QbGFjZW1lbnRzXCIsIFwicG9wdXBBbGlnblwiLCBcInpJbmRleFwiLCBcInN0cmV0Y2hcIiwgXCJnZXRQb3B1cENsYXNzTmFtZUZyb21BbGlnblwiLCBcImZyZXNoXCIsIFwiYWxpZ25Qb2ludFwiLCBcIm9uUG9wdXBDbGlja1wiLCBcIm9uUG9wdXBBbGlnblwiLCBcImFycm93XCIsIFwicG9wdXBNb3Rpb25cIiwgXCJtYXNrTW90aW9uXCIsIFwicG9wdXBUcmFuc2l0aW9uTmFtZVwiLCBcInBvcHVwQW5pbWF0aW9uXCIsIFwibWFza1RyYW5zaXRpb25OYW1lXCIsIFwibWFza0FuaW1hdGlvblwiLCBcImNsYXNzTmFtZVwiLCBcImdldFRyaWdnZXJET01Ob2RlXCJdO1xuaW1wb3J0IFBvcnRhbCBmcm9tICdAcmMtY29tcG9uZW50L3BvcnRhbCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBSZXNpemVPYnNlcnZlciBmcm9tICdyYy1yZXNpemUtb2JzZXJ2ZXInO1xuaW1wb3J0IHsgaXNET00gfSBmcm9tIFwicmMtdXRpbC9lcy9Eb20vZmluZERPTU5vZGVcIjtcbmltcG9ydCB7IGdldFNoYWRvd1Jvb3QgfSBmcm9tIFwicmMtdXRpbC9lcy9Eb20vc2hhZG93XCI7XG5pbXBvcnQgdXNlRXZlbnQgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlRXZlbnRcIjtcbmltcG9ydCB1c2VJZCBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VJZFwiO1xuaW1wb3J0IHVzZUxheW91dEVmZmVjdCBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VMYXlvdXRFZmZlY3RcIjtcbmltcG9ydCBpc01vYmlsZSBmcm9tIFwicmMtdXRpbC9lcy9pc01vYmlsZVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFBvcHVwIGZyb20gXCIuL1BvcHVwXCI7XG5pbXBvcnQgVHJpZ2dlcldyYXBwZXIgZnJvbSBcIi4vVHJpZ2dlcldyYXBwZXJcIjtcbmltcG9ydCBUcmlnZ2VyQ29udGV4dCBmcm9tIFwiLi9jb250ZXh0XCI7XG5pbXBvcnQgdXNlQWN0aW9uIGZyb20gXCIuL2hvb2tzL3VzZUFjdGlvblwiO1xuaW1wb3J0IHVzZUFsaWduIGZyb20gXCIuL2hvb2tzL3VzZUFsaWduXCI7XG5pbXBvcnQgdXNlV2F0Y2ggZnJvbSBcIi4vaG9va3MvdXNlV2F0Y2hcIjtcbmltcG9ydCB1c2VXaW5DbGljayBmcm9tIFwiLi9ob29rcy91c2VXaW5DbGlja1wiO1xuaW1wb3J0IHsgZ2V0QWxpZ25Qb3B1cENsYXNzTmFtZSwgZ2V0TW90aW9uIH0gZnJvbSBcIi4vdXRpbFwiO1xuXG4vLyBSZW1vdmVkIFByb3BzIExpc3Rcbi8vIFNlZW1zIHRoaXMgY2FuIGJlIGF1dG9cbi8vIGdldERvY3VtZW50PzogKGVsZW1lbnQ/OiBIVE1MRWxlbWVudCkgPT4gRG9jdW1lbnQ7XG5cbi8vIE5ldyB2ZXJzaW9uIHdpbGwgbm90IHdyYXAgcG9wdXAgd2l0aCBgcmMtdHJpZ2dlci1wb3B1cC1jb250ZW50YCB3aGVuIG11bHRpcGxlIGNoaWxkcmVuXG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVRyaWdnZXIoKSB7XG4gIHZhciBQb3J0YWxDb21wb25lbnQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFBvcnRhbDtcbiAgdmFyIFRyaWdnZXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICAgIHZhciBfcHJvcHMkcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgcHJlZml4Q2xzID0gX3Byb3BzJHByZWZpeENscyA9PT0gdm9pZCAwID8gJ3JjLXRyaWdnZXItcG9wdXAnIDogX3Byb3BzJHByZWZpeENscyxcbiAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBfcHJvcHMkYWN0aW9uID0gcHJvcHMuYWN0aW9uLFxuICAgICAgYWN0aW9uID0gX3Byb3BzJGFjdGlvbiA9PT0gdm9pZCAwID8gJ2hvdmVyJyA6IF9wcm9wcyRhY3Rpb24sXG4gICAgICBzaG93QWN0aW9uID0gcHJvcHMuc2hvd0FjdGlvbixcbiAgICAgIGhpZGVBY3Rpb24gPSBwcm9wcy5oaWRlQWN0aW9uLFxuICAgICAgcG9wdXBWaXNpYmxlID0gcHJvcHMucG9wdXBWaXNpYmxlLFxuICAgICAgZGVmYXVsdFBvcHVwVmlzaWJsZSA9IHByb3BzLmRlZmF1bHRQb3B1cFZpc2libGUsXG4gICAgICBvblBvcHVwVmlzaWJsZUNoYW5nZSA9IHByb3BzLm9uUG9wdXBWaXNpYmxlQ2hhbmdlLFxuICAgICAgYWZ0ZXJQb3B1cFZpc2libGVDaGFuZ2UgPSBwcm9wcy5hZnRlclBvcHVwVmlzaWJsZUNoYW5nZSxcbiAgICAgIG1vdXNlRW50ZXJEZWxheSA9IHByb3BzLm1vdXNlRW50ZXJEZWxheSxcbiAgICAgIF9wcm9wcyRtb3VzZUxlYXZlRGVsYSA9IHByb3BzLm1vdXNlTGVhdmVEZWxheSxcbiAgICAgIG1vdXNlTGVhdmVEZWxheSA9IF9wcm9wcyRtb3VzZUxlYXZlRGVsYSA9PT0gdm9pZCAwID8gMC4xIDogX3Byb3BzJG1vdXNlTGVhdmVEZWxhLFxuICAgICAgZm9jdXNEZWxheSA9IHByb3BzLmZvY3VzRGVsYXksXG4gICAgICBibHVyRGVsYXkgPSBwcm9wcy5ibHVyRGVsYXksXG4gICAgICBtYXNrID0gcHJvcHMubWFzayxcbiAgICAgIF9wcm9wcyRtYXNrQ2xvc2FibGUgPSBwcm9wcy5tYXNrQ2xvc2FibGUsXG4gICAgICBtYXNrQ2xvc2FibGUgPSBfcHJvcHMkbWFza0Nsb3NhYmxlID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJG1hc2tDbG9zYWJsZSxcbiAgICAgIGdldFBvcHVwQ29udGFpbmVyID0gcHJvcHMuZ2V0UG9wdXBDb250YWluZXIsXG4gICAgICBmb3JjZVJlbmRlciA9IHByb3BzLmZvcmNlUmVuZGVyLFxuICAgICAgYXV0b0Rlc3Ryb3kgPSBwcm9wcy5hdXRvRGVzdHJveSxcbiAgICAgIGRlc3Ryb3lQb3B1cE9uSGlkZSA9IHByb3BzLmRlc3Ryb3lQb3B1cE9uSGlkZSxcbiAgICAgIHBvcHVwID0gcHJvcHMucG9wdXAsXG4gICAgICBwb3B1cENsYXNzTmFtZSA9IHByb3BzLnBvcHVwQ2xhc3NOYW1lLFxuICAgICAgcG9wdXBTdHlsZSA9IHByb3BzLnBvcHVwU3R5bGUsXG4gICAgICBwb3B1cFBsYWNlbWVudCA9IHByb3BzLnBvcHVwUGxhY2VtZW50LFxuICAgICAgX3Byb3BzJGJ1aWx0aW5QbGFjZW1lID0gcHJvcHMuYnVpbHRpblBsYWNlbWVudHMsXG4gICAgICBidWlsdGluUGxhY2VtZW50cyA9IF9wcm9wcyRidWlsdGluUGxhY2VtZSA9PT0gdm9pZCAwID8ge30gOiBfcHJvcHMkYnVpbHRpblBsYWNlbWUsXG4gICAgICBwb3B1cEFsaWduID0gcHJvcHMucG9wdXBBbGlnbixcbiAgICAgIHpJbmRleCA9IHByb3BzLnpJbmRleCxcbiAgICAgIHN0cmV0Y2ggPSBwcm9wcy5zdHJldGNoLFxuICAgICAgZ2V0UG9wdXBDbGFzc05hbWVGcm9tQWxpZ24gPSBwcm9wcy5nZXRQb3B1cENsYXNzTmFtZUZyb21BbGlnbixcbiAgICAgIGZyZXNoID0gcHJvcHMuZnJlc2gsXG4gICAgICBhbGlnblBvaW50ID0gcHJvcHMuYWxpZ25Qb2ludCxcbiAgICAgIG9uUG9wdXBDbGljayA9IHByb3BzLm9uUG9wdXBDbGljayxcbiAgICAgIG9uUG9wdXBBbGlnbiA9IHByb3BzLm9uUG9wdXBBbGlnbixcbiAgICAgIGFycm93ID0gcHJvcHMuYXJyb3csXG4gICAgICBwb3B1cE1vdGlvbiA9IHByb3BzLnBvcHVwTW90aW9uLFxuICAgICAgbWFza01vdGlvbiA9IHByb3BzLm1hc2tNb3Rpb24sXG4gICAgICBwb3B1cFRyYW5zaXRpb25OYW1lID0gcHJvcHMucG9wdXBUcmFuc2l0aW9uTmFtZSxcbiAgICAgIHBvcHVwQW5pbWF0aW9uID0gcHJvcHMucG9wdXBBbmltYXRpb24sXG4gICAgICBtYXNrVHJhbnNpdGlvbk5hbWUgPSBwcm9wcy5tYXNrVHJhbnNpdGlvbk5hbWUsXG4gICAgICBtYXNrQW5pbWF0aW9uID0gcHJvcHMubWFza0FuaW1hdGlvbixcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGdldFRyaWdnZXJET01Ob2RlID0gcHJvcHMuZ2V0VHJpZ2dlckRPTU5vZGUsXG4gICAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIF9leGNsdWRlZCk7XG4gICAgdmFyIG1lcmdlZEF1dG9EZXN0cm95ID0gYXV0b0Rlc3Ryb3kgfHwgZGVzdHJveVBvcHVwT25IaWRlIHx8IGZhbHNlO1xuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IE1vYmlsZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpLFxuICAgICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgICBtb2JpbGUgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgICAgc2V0TW9iaWxlID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgICB1c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgc2V0TW9iaWxlKGlzTW9iaWxlKCkpO1xuICAgIH0sIFtdKTtcblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IENvbnRleHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgdmFyIHN1YlBvcHVwRWxlbWVudHMgPSBSZWFjdC51c2VSZWYoe30pO1xuICAgIHZhciBwYXJlbnRDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChUcmlnZ2VyQ29udGV4dCk7XG4gICAgdmFyIGNvbnRleHQgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlZ2lzdGVyU3ViUG9wdXA6IGZ1bmN0aW9uIHJlZ2lzdGVyU3ViUG9wdXAoaWQsIHN1YlBvcHVwRWxlKSB7XG4gICAgICAgICAgc3ViUG9wdXBFbGVtZW50cy5jdXJyZW50W2lkXSA9IHN1YlBvcHVwRWxlO1xuICAgICAgICAgIHBhcmVudENvbnRleHQgPT09IG51bGwgfHwgcGFyZW50Q29udGV4dCA9PT0gdm9pZCAwIHx8IHBhcmVudENvbnRleHQucmVnaXN0ZXJTdWJQb3B1cChpZCwgc3ViUG9wdXBFbGUpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sIFtwYXJlbnRDb250ZXh0XSk7XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gUG9wdXAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIHZhciBpZCA9IHVzZUlkKCk7XG4gICAgdmFyIF9SZWFjdCR1c2VTdGF0ZTMgPSBSZWFjdC51c2VTdGF0ZShudWxsKSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUzLCAyKSxcbiAgICAgIHBvcHVwRWxlID0gX1JlYWN0JHVzZVN0YXRlNFswXSxcbiAgICAgIHNldFBvcHVwRWxlID0gX1JlYWN0JHVzZVN0YXRlNFsxXTtcblxuICAgIC8vIFVzZWQgZm9yIGZvcndhcmRSZWYgcG9wdXAuIE5vdCB1c2UgaW50ZXJuYWxcbiAgICB2YXIgZXh0ZXJuYWxQb3B1cFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgICB2YXIgc2V0UG9wdXBSZWYgPSB1c2VFdmVudChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgZXh0ZXJuYWxQb3B1cFJlZi5jdXJyZW50ID0gbm9kZTtcbiAgICAgIGlmIChpc0RPTShub2RlKSAmJiBwb3B1cEVsZSAhPT0gbm9kZSkge1xuICAgICAgICBzZXRQb3B1cEVsZShub2RlKTtcbiAgICAgIH1cbiAgICAgIHBhcmVudENvbnRleHQgPT09IG51bGwgfHwgcGFyZW50Q29udGV4dCA9PT0gdm9pZCAwIHx8IHBhcmVudENvbnRleHQucmVnaXN0ZXJTdWJQb3B1cChpZCwgbm9kZSk7XG4gICAgfSk7XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gVGFyZ2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIFVzZSBzdGF0ZSB0byBjb250cm9sIGhlcmUgc2luY2UgYHVzZVJlZmAgdXBkYXRlIG5vdCB0cmlnZ2VyIHJlbmRlclxuICAgIHZhciBfUmVhY3QkdXNlU3RhdGU1ID0gUmVhY3QudXNlU3RhdGUobnVsbCksXG4gICAgICBfUmVhY3QkdXNlU3RhdGU2ID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlNSwgMiksXG4gICAgICB0YXJnZXRFbGUgPSBfUmVhY3QkdXNlU3RhdGU2WzBdLFxuICAgICAgc2V0VGFyZ2V0RWxlID0gX1JlYWN0JHVzZVN0YXRlNlsxXTtcblxuICAgIC8vIFVzZWQgZm9yIGZvcndhcmRSZWYgdGFyZ2V0LiBOb3QgdXNlIGludGVybmFsXG4gICAgdmFyIGV4dGVybmFsRm9yd2FyZFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgICB2YXIgc2V0VGFyZ2V0UmVmID0gdXNlRXZlbnQoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIGlmIChpc0RPTShub2RlKSAmJiB0YXJnZXRFbGUgIT09IG5vZGUpIHtcbiAgICAgICAgc2V0VGFyZ2V0RWxlKG5vZGUpO1xuICAgICAgICBleHRlcm5hbEZvcndhcmRSZWYuY3VycmVudCA9IG5vZGU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBDaGlsZHJlbiA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIHZhciBjaGlsZCA9IFJlYWN0LkNoaWxkcmVuLm9ubHkoY2hpbGRyZW4pO1xuICAgIHZhciBvcmlnaW5DaGlsZFByb3BzID0gKGNoaWxkID09PSBudWxsIHx8IGNoaWxkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjaGlsZC5wcm9wcykgfHwge307XG4gICAgdmFyIGNsb25lUHJvcHMgPSB7fTtcbiAgICB2YXIgaW5Qb3B1cE9yQ2hpbGQgPSB1c2VFdmVudChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICB2YXIgX2dldFNoYWRvd1Jvb3QsIF9nZXRTaGFkb3dSb290MjtcbiAgICAgIHZhciBjaGlsZERPTSA9IHRhcmdldEVsZTtcbiAgICAgIHJldHVybiAoY2hpbGRET00gPT09IG51bGwgfHwgY2hpbGRET00gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNoaWxkRE9NLmNvbnRhaW5zKGVsZSkpIHx8ICgoX2dldFNoYWRvd1Jvb3QgPSBnZXRTaGFkb3dSb290KGNoaWxkRE9NKSkgPT09IG51bGwgfHwgX2dldFNoYWRvd1Jvb3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9nZXRTaGFkb3dSb290Lmhvc3QpID09PSBlbGUgfHwgZWxlID09PSBjaGlsZERPTSB8fCAocG9wdXBFbGUgPT09IG51bGwgfHwgcG9wdXBFbGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBvcHVwRWxlLmNvbnRhaW5zKGVsZSkpIHx8ICgoX2dldFNoYWRvd1Jvb3QyID0gZ2V0U2hhZG93Um9vdChwb3B1cEVsZSkpID09PSBudWxsIHx8IF9nZXRTaGFkb3dSb290MiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2dldFNoYWRvd1Jvb3QyLmhvc3QpID09PSBlbGUgfHwgZWxlID09PSBwb3B1cEVsZSB8fCBPYmplY3QudmFsdWVzKHN1YlBvcHVwRWxlbWVudHMuY3VycmVudCkuc29tZShmdW5jdGlvbiAoc3ViUG9wdXBFbGUpIHtcbiAgICAgICAgcmV0dXJuIChzdWJQb3B1cEVsZSA9PT0gbnVsbCB8fCBzdWJQb3B1cEVsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3ViUG9wdXBFbGUuY29udGFpbnMoZWxlKSkgfHwgZWxlID09PSBzdWJQb3B1cEVsZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IE1vdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICB2YXIgbWVyZ2VQb3B1cE1vdGlvbiA9IGdldE1vdGlvbihwcmVmaXhDbHMsIHBvcHVwTW90aW9uLCBwb3B1cEFuaW1hdGlvbiwgcG9wdXBUcmFuc2l0aW9uTmFtZSk7XG4gICAgdmFyIG1lcmdlTWFza01vdGlvbiA9IGdldE1vdGlvbihwcmVmaXhDbHMsIG1hc2tNb3Rpb24sIG1hc2tBbmltYXRpb24sIG1hc2tUcmFuc2l0aW9uTmFtZSk7XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IE9wZW4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIHZhciBfUmVhY3QkdXNlU3RhdGU3ID0gUmVhY3QudXNlU3RhdGUoZGVmYXVsdFBvcHVwVmlzaWJsZSB8fCBmYWxzZSksXG4gICAgICBfUmVhY3QkdXNlU3RhdGU4ID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlNywgMiksXG4gICAgICBpbnRlcm5hbE9wZW4gPSBfUmVhY3QkdXNlU3RhdGU4WzBdLFxuICAgICAgc2V0SW50ZXJuYWxPcGVuID0gX1JlYWN0JHVzZVN0YXRlOFsxXTtcblxuICAgIC8vIFJlbmRlciBzdGlsbCB1c2UgcHJvcHMgYXMgZmlyc3QgcHJpb3JpdHlcbiAgICB2YXIgbWVyZ2VkT3BlbiA9IHBvcHVwVmlzaWJsZSAhPT0gbnVsbCAmJiBwb3B1cFZpc2libGUgIT09IHZvaWQgMCA/IHBvcHVwVmlzaWJsZSA6IGludGVybmFsT3BlbjtcblxuICAgIC8vIFdlIHVzZSBlZmZlY3Qgc3luYyBoZXJlIGluIGNhc2UgYHBvcHVwVmlzaWJsZWAgYmFjayB0byBgdW5kZWZpbmVkYFxuICAgIHZhciBzZXRNZXJnZWRPcGVuID0gdXNlRXZlbnQoZnVuY3Rpb24gKG5leHRPcGVuKSB7XG4gICAgICBpZiAocG9wdXBWaXNpYmxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2V0SW50ZXJuYWxPcGVuKG5leHRPcGVuKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB1c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgc2V0SW50ZXJuYWxPcGVuKHBvcHVwVmlzaWJsZSB8fCBmYWxzZSk7XG4gICAgfSwgW3BvcHVwVmlzaWJsZV0pO1xuICAgIHZhciBvcGVuUmVmID0gUmVhY3QudXNlUmVmKG1lcmdlZE9wZW4pO1xuICAgIG9wZW5SZWYuY3VycmVudCA9IG1lcmdlZE9wZW47XG4gICAgdmFyIGxhc3RUcmlnZ2VyUmVmID0gUmVhY3QudXNlUmVmKFtdKTtcbiAgICBsYXN0VHJpZ2dlclJlZi5jdXJyZW50ID0gW107XG4gICAgdmFyIGludGVybmFsVHJpZ2dlck9wZW4gPSB1c2VFdmVudChmdW5jdGlvbiAobmV4dE9wZW4pIHtcbiAgICAgIHZhciBfbGFzdFRyaWdnZXJSZWYkY3VycmU7XG4gICAgICBzZXRNZXJnZWRPcGVuKG5leHRPcGVuKTtcblxuICAgICAgLy8gRW50ZXIgb3IgUG9pbnRlciB3aWxsIGJvdGggdHJpZ2dlciBvcGVuIHN0YXRlIGNoYW5nZVxuICAgICAgLy8gV2Ugb25seSBuZWVkIHRha2Ugb25lIHRvIGF2b2lkIGR1cGxpY2F0ZWQgY2hhbmdlIGV2ZW50IHRyaWdnZXJcbiAgICAgIC8vIFVzZSBgbGFzdFRyaWdnZXJSZWZgIHRvIHJlY29yZCBsYXN0IG9wZW4gdHlwZVxuICAgICAgaWYgKCgoX2xhc3RUcmlnZ2VyUmVmJGN1cnJlID0gbGFzdFRyaWdnZXJSZWYuY3VycmVudFtsYXN0VHJpZ2dlclJlZi5jdXJyZW50Lmxlbmd0aCAtIDFdKSAhPT0gbnVsbCAmJiBfbGFzdFRyaWdnZXJSZWYkY3VycmUgIT09IHZvaWQgMCA/IF9sYXN0VHJpZ2dlclJlZiRjdXJyZSA6IG1lcmdlZE9wZW4pICE9PSBuZXh0T3Blbikge1xuICAgICAgICBsYXN0VHJpZ2dlclJlZi5jdXJyZW50LnB1c2gobmV4dE9wZW4pO1xuICAgICAgICBvblBvcHVwVmlzaWJsZUNoYW5nZSA9PT0gbnVsbCB8fCBvblBvcHVwVmlzaWJsZUNoYW5nZSA9PT0gdm9pZCAwIHx8IG9uUG9wdXBWaXNpYmxlQ2hhbmdlKG5leHRPcGVuKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFRyaWdnZXIgZm9yIGRlbGF5XG4gICAgdmFyIGRlbGF5UmVmID0gUmVhY3QudXNlUmVmKCk7XG4gICAgdmFyIGNsZWFyRGVsYXkgPSBmdW5jdGlvbiBjbGVhckRlbGF5KCkge1xuICAgICAgY2xlYXJUaW1lb3V0KGRlbGF5UmVmLmN1cnJlbnQpO1xuICAgIH07XG4gICAgdmFyIHRyaWdnZXJPcGVuID0gZnVuY3Rpb24gdHJpZ2dlck9wZW4obmV4dE9wZW4pIHtcbiAgICAgIHZhciBkZWxheSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMDtcbiAgICAgIGNsZWFyRGVsYXkoKTtcbiAgICAgIGlmIChkZWxheSA9PT0gMCkge1xuICAgICAgICBpbnRlcm5hbFRyaWdnZXJPcGVuKG5leHRPcGVuKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGF5UmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpbnRlcm5hbFRyaWdnZXJPcGVuKG5leHRPcGVuKTtcbiAgICAgICAgfSwgZGVsYXkgKiAxMDAwKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gY2xlYXJEZWxheTtcbiAgICB9LCBbXSk7XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBNb3Rpb24gPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIHZhciBfUmVhY3QkdXNlU3RhdGU5ID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpLFxuICAgICAgX1JlYWN0JHVzZVN0YXRlMTAgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGU5LCAyKSxcbiAgICAgIGluTW90aW9uID0gX1JlYWN0JHVzZVN0YXRlMTBbMF0sXG4gICAgICBzZXRJbk1vdGlvbiA9IF9SZWFjdCR1c2VTdGF0ZTEwWzFdO1xuICAgIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoZmlyc3RNb3VudCkge1xuICAgICAgaWYgKCFmaXJzdE1vdW50IHx8IG1lcmdlZE9wZW4pIHtcbiAgICAgICAgc2V0SW5Nb3Rpb24odHJ1ZSk7XG4gICAgICB9XG4gICAgfSwgW21lcmdlZE9wZW5dKTtcbiAgICB2YXIgX1JlYWN0JHVzZVN0YXRlMTEgPSBSZWFjdC51c2VTdGF0ZShudWxsKSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTEyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlMTEsIDIpLFxuICAgICAgbW90aW9uUHJlcGFyZVJlc29sdmUgPSBfUmVhY3QkdXNlU3RhdGUxMlswXSxcbiAgICAgIHNldE1vdGlvblByZXBhcmVSZXNvbHZlID0gX1JlYWN0JHVzZVN0YXRlMTJbMV07XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gQWxpZ24gPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIHZhciBfUmVhY3QkdXNlU3RhdGUxMyA9IFJlYWN0LnVzZVN0YXRlKG51bGwpLFxuICAgICAgX1JlYWN0JHVzZVN0YXRlMTQgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUxMywgMiksXG4gICAgICBtb3VzZVBvcyA9IF9SZWFjdCR1c2VTdGF0ZTE0WzBdLFxuICAgICAgc2V0TW91c2VQb3MgPSBfUmVhY3QkdXNlU3RhdGUxNFsxXTtcbiAgICB2YXIgc2V0TW91c2VQb3NCeUV2ZW50ID0gZnVuY3Rpb24gc2V0TW91c2VQb3NCeUV2ZW50KGV2ZW50KSB7XG4gICAgICBzZXRNb3VzZVBvcyhbZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WV0pO1xuICAgIH07XG4gICAgdmFyIF91c2VBbGlnbiA9IHVzZUFsaWduKG1lcmdlZE9wZW4sIHBvcHVwRWxlLCBhbGlnblBvaW50ICYmIG1vdXNlUG9zICE9PSBudWxsID8gbW91c2VQb3MgOiB0YXJnZXRFbGUsIHBvcHVwUGxhY2VtZW50LCBidWlsdGluUGxhY2VtZW50cywgcG9wdXBBbGlnbiwgb25Qb3B1cEFsaWduKSxcbiAgICAgIF91c2VBbGlnbjIgPSBfc2xpY2VkVG9BcnJheShfdXNlQWxpZ24sIDExKSxcbiAgICAgIHJlYWR5ID0gX3VzZUFsaWduMlswXSxcbiAgICAgIG9mZnNldFggPSBfdXNlQWxpZ24yWzFdLFxuICAgICAgb2Zmc2V0WSA9IF91c2VBbGlnbjJbMl0sXG4gICAgICBvZmZzZXRSID0gX3VzZUFsaWduMlszXSxcbiAgICAgIG9mZnNldEIgPSBfdXNlQWxpZ24yWzRdLFxuICAgICAgYXJyb3dYID0gX3VzZUFsaWduMls1XSxcbiAgICAgIGFycm93WSA9IF91c2VBbGlnbjJbNl0sXG4gICAgICBzY2FsZVggPSBfdXNlQWxpZ24yWzddLFxuICAgICAgc2NhbGVZID0gX3VzZUFsaWduMls4XSxcbiAgICAgIGFsaWduSW5mbyA9IF91c2VBbGlnbjJbOV0sXG4gICAgICBvbkFsaWduID0gX3VzZUFsaWduMlsxMF07XG4gICAgdmFyIF91c2VBY3Rpb24gPSB1c2VBY3Rpb24obW9iaWxlLCBhY3Rpb24sIHNob3dBY3Rpb24sIGhpZGVBY3Rpb24pLFxuICAgICAgX3VzZUFjdGlvbjIgPSBfc2xpY2VkVG9BcnJheShfdXNlQWN0aW9uLCAyKSxcbiAgICAgIHNob3dBY3Rpb25zID0gX3VzZUFjdGlvbjJbMF0sXG4gICAgICBoaWRlQWN0aW9ucyA9IF91c2VBY3Rpb24yWzFdO1xuICAgIHZhciBjbGlja1RvU2hvdyA9IHNob3dBY3Rpb25zLmhhcygnY2xpY2snKTtcbiAgICB2YXIgY2xpY2tUb0hpZGUgPSBoaWRlQWN0aW9ucy5oYXMoJ2NsaWNrJykgfHwgaGlkZUFjdGlvbnMuaGFzKCdjb250ZXh0TWVudScpO1xuICAgIHZhciB0cmlnZ2VyQWxpZ24gPSB1c2VFdmVudChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIWluTW90aW9uKSB7XG4gICAgICAgIG9uQWxpZ24oKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB2YXIgb25TY3JvbGwgPSBmdW5jdGlvbiBvblNjcm9sbCgpIHtcbiAgICAgIGlmIChvcGVuUmVmLmN1cnJlbnQgJiYgYWxpZ25Qb2ludCAmJiBjbGlja1RvSGlkZSkge1xuICAgICAgICB0cmlnZ2VyT3BlbihmYWxzZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB1c2VXYXRjaChtZXJnZWRPcGVuLCB0YXJnZXRFbGUsIHBvcHVwRWxlLCB0cmlnZ2VyQWxpZ24sIG9uU2Nyb2xsKTtcbiAgICB1c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgdHJpZ2dlckFsaWduKCk7XG4gICAgfSwgW21vdXNlUG9zLCBwb3B1cFBsYWNlbWVudF0pO1xuXG4gICAgLy8gV2hlbiBubyBidWlsdGluUGxhY2VtZW50cyBhbmQgcG9wdXBBbGlnbiBjaGFuZ2VkXG4gICAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChtZXJnZWRPcGVuICYmICEoYnVpbHRpblBsYWNlbWVudHMgIT09IG51bGwgJiYgYnVpbHRpblBsYWNlbWVudHMgIT09IHZvaWQgMCAmJiBidWlsdGluUGxhY2VtZW50c1twb3B1cFBsYWNlbWVudF0pKSB7XG4gICAgICAgIHRyaWdnZXJBbGlnbigpO1xuICAgICAgfVxuICAgIH0sIFtKU09OLnN0cmluZ2lmeShwb3B1cEFsaWduKV0pO1xuICAgIHZhciBhbGlnbmVkQ2xhc3NOYW1lID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgYmFzZUNsYXNzTmFtZSA9IGdldEFsaWduUG9wdXBDbGFzc05hbWUoYnVpbHRpblBsYWNlbWVudHMsIHByZWZpeENscywgYWxpZ25JbmZvLCBhbGlnblBvaW50KTtcbiAgICAgIHJldHVybiBjbGFzc05hbWVzKGJhc2VDbGFzc05hbWUsIGdldFBvcHVwQ2xhc3NOYW1lRnJvbUFsaWduID09PSBudWxsIHx8IGdldFBvcHVwQ2xhc3NOYW1lRnJvbUFsaWduID09PSB2b2lkIDAgPyB2b2lkIDAgOiBnZXRQb3B1cENsYXNzTmFtZUZyb21BbGlnbihhbGlnbkluZm8pKTtcbiAgICB9LCBbYWxpZ25JbmZvLCBnZXRQb3B1cENsYXNzTmFtZUZyb21BbGlnbiwgYnVpbHRpblBsYWNlbWVudHMsIHByZWZpeENscywgYWxpZ25Qb2ludF0pO1xuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZWZzID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmF0aXZlRWxlbWVudDogZXh0ZXJuYWxGb3J3YXJkUmVmLmN1cnJlbnQsXG4gICAgICAgIHBvcHVwRWxlbWVudDogZXh0ZXJuYWxQb3B1cFJlZi5jdXJyZW50LFxuICAgICAgICBmb3JjZUFsaWduOiB0cmlnZ2VyQWxpZ25cbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBTdHJldGNoID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIHZhciBfUmVhY3QkdXNlU3RhdGUxNSA9IFJlYWN0LnVzZVN0YXRlKDApLFxuICAgICAgX1JlYWN0JHVzZVN0YXRlMTYgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUxNSwgMiksXG4gICAgICB0YXJnZXRXaWR0aCA9IF9SZWFjdCR1c2VTdGF0ZTE2WzBdLFxuICAgICAgc2V0VGFyZ2V0V2lkdGggPSBfUmVhY3QkdXNlU3RhdGUxNlsxXTtcbiAgICB2YXIgX1JlYWN0JHVzZVN0YXRlMTcgPSBSZWFjdC51c2VTdGF0ZSgwKSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTE4ID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlMTcsIDIpLFxuICAgICAgdGFyZ2V0SGVpZ2h0ID0gX1JlYWN0JHVzZVN0YXRlMThbMF0sXG4gICAgICBzZXRUYXJnZXRIZWlnaHQgPSBfUmVhY3QkdXNlU3RhdGUxOFsxXTtcbiAgICB2YXIgc3luY1RhcmdldFNpemUgPSBmdW5jdGlvbiBzeW5jVGFyZ2V0U2l6ZSgpIHtcbiAgICAgIGlmIChzdHJldGNoICYmIHRhcmdldEVsZSkge1xuICAgICAgICB2YXIgcmVjdCA9IHRhcmdldEVsZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgc2V0VGFyZ2V0V2lkdGgocmVjdC53aWR0aCk7XG4gICAgICAgIHNldFRhcmdldEhlaWdodChyZWN0LmhlaWdodCk7XG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgb25UYXJnZXRSZXNpemUgPSBmdW5jdGlvbiBvblRhcmdldFJlc2l6ZSgpIHtcbiAgICAgIHN5bmNUYXJnZXRTaXplKCk7XG4gICAgICB0cmlnZ2VyQWxpZ24oKTtcbiAgICB9O1xuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gTW90aW9uID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICB2YXIgb25WaXNpYmxlQ2hhbmdlZCA9IGZ1bmN0aW9uIG9uVmlzaWJsZUNoYW5nZWQodmlzaWJsZSkge1xuICAgICAgc2V0SW5Nb3Rpb24oZmFsc2UpO1xuICAgICAgb25BbGlnbigpO1xuICAgICAgYWZ0ZXJQb3B1cFZpc2libGVDaGFuZ2UgPT09IG51bGwgfHwgYWZ0ZXJQb3B1cFZpc2libGVDaGFuZ2UgPT09IHZvaWQgMCB8fCBhZnRlclBvcHVwVmlzaWJsZUNoYW5nZSh2aXNpYmxlKTtcbiAgICB9O1xuXG4gICAgLy8gV2Ugd2lsbCB0cmlnZ2VyIGFsaWduIHdoZW4gbW90aW9uIGlzIGluIHByZXBhcmVcbiAgICB2YXIgb25QcmVwYXJlID0gZnVuY3Rpb24gb25QcmVwYXJlKCkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIHN5bmNUYXJnZXRTaXplKCk7XG4gICAgICAgIHNldE1vdGlvblByZXBhcmVSZXNvbHZlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuICAgIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAobW90aW9uUHJlcGFyZVJlc29sdmUpIHtcbiAgICAgICAgb25BbGlnbigpO1xuICAgICAgICBtb3Rpb25QcmVwYXJlUmVzb2x2ZSgpO1xuICAgICAgICBzZXRNb3Rpb25QcmVwYXJlUmVzb2x2ZShudWxsKTtcbiAgICAgIH1cbiAgICB9LCBbbW90aW9uUHJlcGFyZVJlc29sdmVdKTtcblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBBY3Rpb24gPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLyoqXG4gICAgICogVXRpbCB3cmFwcGVyIGZvciB0cmlnZ2VyIGFjdGlvblxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJBY3Rpb24oZXZlbnROYW1lLCBuZXh0T3BlbiwgZGVsYXksIHByZUV2ZW50KSB7XG4gICAgICBjbG9uZVByb3BzW2V2ZW50TmFtZV0gPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdmFyIF9vcmlnaW5DaGlsZFByb3BzJGV2ZTtcbiAgICAgICAgcHJlRXZlbnQgPT09IG51bGwgfHwgcHJlRXZlbnQgPT09IHZvaWQgMCB8fCBwcmVFdmVudChldmVudCk7XG4gICAgICAgIHRyaWdnZXJPcGVuKG5leHRPcGVuLCBkZWxheSk7XG5cbiAgICAgICAgLy8gUGFzcyB0byBvcmlnaW5cbiAgICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgICB9XG4gICAgICAgIChfb3JpZ2luQ2hpbGRQcm9wcyRldmUgPSBvcmlnaW5DaGlsZFByb3BzW2V2ZW50TmFtZV0pID09PSBudWxsIHx8IF9vcmlnaW5DaGlsZFByb3BzJGV2ZSA9PT0gdm9pZCAwIHx8IF9vcmlnaW5DaGlsZFByb3BzJGV2ZS5jYWxsLmFwcGx5KF9vcmlnaW5DaGlsZFByb3BzJGV2ZSwgW29yaWdpbkNoaWxkUHJvcHMsIGV2ZW50XS5jb25jYXQoYXJncykpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBBY3Rpb246IENsaWNrID09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGlmIChjbGlja1RvU2hvdyB8fCBjbGlja1RvSGlkZSkge1xuICAgICAgY2xvbmVQcm9wcy5vbkNsaWNrID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHZhciBfb3JpZ2luQ2hpbGRQcm9wcyRvbkM7XG4gICAgICAgIGlmIChvcGVuUmVmLmN1cnJlbnQgJiYgY2xpY2tUb0hpZGUpIHtcbiAgICAgICAgICB0cmlnZ2VyT3BlbihmYWxzZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIW9wZW5SZWYuY3VycmVudCAmJiBjbGlja1RvU2hvdykge1xuICAgICAgICAgIHNldE1vdXNlUG9zQnlFdmVudChldmVudCk7XG4gICAgICAgICAgdHJpZ2dlck9wZW4odHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQYXNzIHRvIG9yaWdpblxuICAgICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICAgIGFyZ3NbX2tleTIgLSAxXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICAgIH1cbiAgICAgICAgKF9vcmlnaW5DaGlsZFByb3BzJG9uQyA9IG9yaWdpbkNoaWxkUHJvcHMub25DbGljaykgPT09IG51bGwgfHwgX29yaWdpbkNoaWxkUHJvcHMkb25DID09PSB2b2lkIDAgfHwgX29yaWdpbkNoaWxkUHJvcHMkb25DLmNhbGwuYXBwbHkoX29yaWdpbkNoaWxkUHJvcHMkb25DLCBbb3JpZ2luQ2hpbGRQcm9wcywgZXZlbnRdLmNvbmNhdChhcmdzKSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIENsaWNrIHRvIGhpZGUgaXMgc3BlY2lhbCBhY3Rpb24gc2luY2UgY2xpY2sgcG9wdXAgZWxlbWVudCBzaG91bGQgbm90IGhpZGVcbiAgICB2YXIgb25Qb3B1cFBvaW50ZXJEb3duID0gdXNlV2luQ2xpY2sobWVyZ2VkT3BlbiwgY2xpY2tUb0hpZGUsIHRhcmdldEVsZSwgcG9wdXBFbGUsIG1hc2ssIG1hc2tDbG9zYWJsZSwgaW5Qb3B1cE9yQ2hpbGQsIHRyaWdnZXJPcGVuKTtcblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09IEFjdGlvbjogSG92ZXIgPT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgdmFyIGhvdmVyVG9TaG93ID0gc2hvd0FjdGlvbnMuaGFzKCdob3ZlcicpO1xuICAgIHZhciBob3ZlclRvSGlkZSA9IGhpZGVBY3Rpb25zLmhhcygnaG92ZXInKTtcbiAgICB2YXIgb25Qb3B1cE1vdXNlRW50ZXI7XG4gICAgdmFyIG9uUG9wdXBNb3VzZUxlYXZlO1xuICAgIGlmIChob3ZlclRvU2hvdykge1xuICAgICAgLy8gQ29tcGF0aWJsZSB3aXRoIG9sZCBicm93c2VyIHdoaWNoIG5vdCBzdXBwb3J0IHBvaW50ZXIgZXZlbnRcbiAgICAgIHdyYXBwZXJBY3Rpb24oJ29uTW91c2VFbnRlcicsIHRydWUsIG1vdXNlRW50ZXJEZWxheSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHNldE1vdXNlUG9zQnlFdmVudChldmVudCk7XG4gICAgICB9KTtcbiAgICAgIHdyYXBwZXJBY3Rpb24oJ29uUG9pbnRlckVudGVyJywgdHJ1ZSwgbW91c2VFbnRlckRlbGF5LCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgc2V0TW91c2VQb3NCeUV2ZW50KGV2ZW50KTtcbiAgICAgIH0pO1xuICAgICAgb25Qb3B1cE1vdXNlRW50ZXIgPSBmdW5jdGlvbiBvblBvcHVwTW91c2VFbnRlcihldmVudCkge1xuICAgICAgICAvLyBPbmx5IHRyaWdnZXIgcmUtb3BlbiB3aGVuIHBvcHVwIGlzIHZpc2libGVcbiAgICAgICAgaWYgKChtZXJnZWRPcGVuIHx8IGluTW90aW9uKSAmJiBwb3B1cEVsZSAhPT0gbnVsbCAmJiBwb3B1cEVsZSAhPT0gdm9pZCAwICYmIHBvcHVwRWxlLmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgICAgICB0cmlnZ2VyT3Blbih0cnVlLCBtb3VzZUVudGVyRGVsYXkpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvLyBBbGlnbiBQb2ludFxuICAgICAgaWYgKGFsaWduUG9pbnQpIHtcbiAgICAgICAgY2xvbmVQcm9wcy5vbk1vdXNlTW92ZSA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIHZhciBfb3JpZ2luQ2hpbGRQcm9wcyRvbk07XG4gICAgICAgICAgLy8gc2V0TW91c2VQb3NCeUV2ZW50KGV2ZW50KTtcbiAgICAgICAgICAoX29yaWdpbkNoaWxkUHJvcHMkb25NID0gb3JpZ2luQ2hpbGRQcm9wcy5vbk1vdXNlTW92ZSkgPT09IG51bGwgfHwgX29yaWdpbkNoaWxkUHJvcHMkb25NID09PSB2b2lkIDAgfHwgX29yaWdpbkNoaWxkUHJvcHMkb25NLmNhbGwob3JpZ2luQ2hpbGRQcm9wcywgZXZlbnQpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaG92ZXJUb0hpZGUpIHtcbiAgICAgIHdyYXBwZXJBY3Rpb24oJ29uTW91c2VMZWF2ZScsIGZhbHNlLCBtb3VzZUxlYXZlRGVsYXkpO1xuICAgICAgd3JhcHBlckFjdGlvbignb25Qb2ludGVyTGVhdmUnLCBmYWxzZSwgbW91c2VMZWF2ZURlbGF5KTtcbiAgICAgIG9uUG9wdXBNb3VzZUxlYXZlID0gZnVuY3Rpb24gb25Qb3B1cE1vdXNlTGVhdmUoKSB7XG4gICAgICAgIHRyaWdnZXJPcGVuKGZhbHNlLCBtb3VzZUxlYXZlRGVsYXkpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBBY3Rpb246IEZvY3VzID09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGlmIChzaG93QWN0aW9ucy5oYXMoJ2ZvY3VzJykpIHtcbiAgICAgIHdyYXBwZXJBY3Rpb24oJ29uRm9jdXMnLCB0cnVlLCBmb2N1c0RlbGF5KTtcbiAgICB9XG4gICAgaWYgKGhpZGVBY3Rpb25zLmhhcygnZm9jdXMnKSkge1xuICAgICAgd3JhcHBlckFjdGlvbignb25CbHVyJywgZmFsc2UsIGJsdXJEZWxheSk7XG4gICAgfVxuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT0gQWN0aW9uOiBDb250ZXh0TWVudSA9PT09PT09PT09PT09PT09PT09PT1cbiAgICBpZiAoc2hvd0FjdGlvbnMuaGFzKCdjb250ZXh0TWVudScpKSB7XG4gICAgICBjbG9uZVByb3BzLm9uQ29udGV4dE1lbnUgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdmFyIF9vcmlnaW5DaGlsZFByb3BzJG9uQzI7XG4gICAgICAgIGlmIChvcGVuUmVmLmN1cnJlbnQgJiYgaGlkZUFjdGlvbnMuaGFzKCdjb250ZXh0TWVudScpKSB7XG4gICAgICAgICAgdHJpZ2dlck9wZW4oZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldE1vdXNlUG9zQnlFdmVudChldmVudCk7XG4gICAgICAgICAgdHJpZ2dlck9wZW4odHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAvLyBQYXNzIHRvIG9yaWdpblxuICAgICAgICBmb3IgKHZhciBfbGVuMyA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjMgPiAxID8gX2xlbjMgLSAxIDogMCksIF9rZXkzID0gMTsgX2tleTMgPCBfbGVuMzsgX2tleTMrKykge1xuICAgICAgICAgIGFyZ3NbX2tleTMgLSAxXSA9IGFyZ3VtZW50c1tfa2V5M107XG4gICAgICAgIH1cbiAgICAgICAgKF9vcmlnaW5DaGlsZFByb3BzJG9uQzIgPSBvcmlnaW5DaGlsZFByb3BzLm9uQ29udGV4dE1lbnUpID09PSBudWxsIHx8IF9vcmlnaW5DaGlsZFByb3BzJG9uQzIgPT09IHZvaWQgMCB8fCBfb3JpZ2luQ2hpbGRQcm9wcyRvbkMyLmNhbGwuYXBwbHkoX29yaWdpbkNoaWxkUHJvcHMkb25DMiwgW29yaWdpbkNoaWxkUHJvcHMsIGV2ZW50XS5jb25jYXQoYXJncykpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IENsYXNzTmFtZSA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGlmIChjbGFzc05hbWUpIHtcbiAgICAgIGNsb25lUHJvcHMuY2xhc3NOYW1lID0gY2xhc3NOYW1lcyhvcmlnaW5DaGlsZFByb3BzLmNsYXNzTmFtZSwgY2xhc3NOYW1lKTtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIHZhciBtZXJnZWRDaGlsZHJlblByb3BzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBvcmlnaW5DaGlsZFByb3BzKSwgY2xvbmVQcm9wcyk7XG5cbiAgICAvLyBQYXNzIHByb3BzIGludG8gY2xvbmVQcm9wcyBmb3IgbmVzdCB1c2FnZVxuICAgIHZhciBwYXNzZWRQcm9wcyA9IHt9O1xuICAgIHZhciBwYXNzZWRFdmVudExpc3QgPSBbJ29uQ29udGV4dE1lbnUnLCAnb25DbGljaycsICdvbk1vdXNlRG93bicsICdvblRvdWNoU3RhcnQnLCAnb25Nb3VzZUVudGVyJywgJ29uTW91c2VMZWF2ZScsICdvbkZvY3VzJywgJ29uQmx1ciddO1xuICAgIHBhc3NlZEV2ZW50TGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChldmVudE5hbWUpIHtcbiAgICAgIGlmIChyZXN0UHJvcHNbZXZlbnROYW1lXSkge1xuICAgICAgICBwYXNzZWRQcm9wc1tldmVudE5hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBfbWVyZ2VkQ2hpbGRyZW5Qcm9wcyQ7XG4gICAgICAgICAgZm9yICh2YXIgX2xlbjQgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW40KSwgX2tleTQgPSAwOyBfa2V5NCA8IF9sZW40OyBfa2V5NCsrKSB7XG4gICAgICAgICAgICBhcmdzW19rZXk0XSA9IGFyZ3VtZW50c1tfa2V5NF07XG4gICAgICAgICAgfVxuICAgICAgICAgIChfbWVyZ2VkQ2hpbGRyZW5Qcm9wcyQgPSBtZXJnZWRDaGlsZHJlblByb3BzW2V2ZW50TmFtZV0pID09PSBudWxsIHx8IF9tZXJnZWRDaGlsZHJlblByb3BzJCA9PT0gdm9pZCAwIHx8IF9tZXJnZWRDaGlsZHJlblByb3BzJC5jYWxsLmFwcGx5KF9tZXJnZWRDaGlsZHJlblByb3BzJCwgW21lcmdlZENoaWxkcmVuUHJvcHNdLmNvbmNhdChhcmdzKSk7XG4gICAgICAgICAgcmVzdFByb3BzW2V2ZW50TmFtZV0uYXBwbHkocmVzdFByb3BzLCBhcmdzKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIENoaWxkIE5vZGVcbiAgICB2YXIgdHJpZ2dlck5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG1lcmdlZENoaWxkcmVuUHJvcHMpLCBwYXNzZWRQcm9wcykpO1xuICAgIHZhciBhcnJvd1BvcyA9IHtcbiAgICAgIHg6IGFycm93WCxcbiAgICAgIHk6IGFycm93WVxuICAgIH07XG4gICAgdmFyIGlubmVyQXJyb3cgPSBhcnJvdyA/IF9vYmplY3RTcHJlYWQoe30sIGFycm93ICE9PSB0cnVlID8gYXJyb3cgOiB7fSkgOiBudWxsO1xuXG4gICAgLy8gUmVuZGVyXG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZXNpemVPYnNlcnZlciwge1xuICAgICAgZGlzYWJsZWQ6ICFtZXJnZWRPcGVuLFxuICAgICAgcmVmOiBzZXRUYXJnZXRSZWYsXG4gICAgICBvblJlc2l6ZTogb25UYXJnZXRSZXNpemVcbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUcmlnZ2VyV3JhcHBlciwge1xuICAgICAgZ2V0VHJpZ2dlckRPTU5vZGU6IGdldFRyaWdnZXJET01Ob2RlXG4gICAgfSwgdHJpZ2dlck5vZGUpKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVHJpZ2dlckNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgIHZhbHVlOiBjb250ZXh0XG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUG9wdXAsIHtcbiAgICAgIHBvcnRhbDogUG9ydGFsQ29tcG9uZW50LFxuICAgICAgcmVmOiBzZXRQb3B1cFJlZixcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgcG9wdXA6IHBvcHVwLFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKHBvcHVwQ2xhc3NOYW1lLCBhbGlnbmVkQ2xhc3NOYW1lKSxcbiAgICAgIHN0eWxlOiBwb3B1cFN0eWxlLFxuICAgICAgdGFyZ2V0OiB0YXJnZXRFbGUsXG4gICAgICBvbk1vdXNlRW50ZXI6IG9uUG9wdXBNb3VzZUVudGVyLFxuICAgICAgb25Nb3VzZUxlYXZlOiBvblBvcHVwTW91c2VMZWF2ZVxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvNDM5MjRcbiAgICAgICxcbiAgICAgIG9uUG9pbnRlckVudGVyOiBvblBvcHVwTW91c2VFbnRlcixcbiAgICAgIHpJbmRleDogekluZGV4XG4gICAgICAvLyBPcGVuXG4gICAgICAsXG4gICAgICBvcGVuOiBtZXJnZWRPcGVuLFxuICAgICAga2VlcERvbTogaW5Nb3Rpb24sXG4gICAgICBmcmVzaDogZnJlc2hcbiAgICAgIC8vIENsaWNrXG4gICAgICAsXG4gICAgICBvbkNsaWNrOiBvblBvcHVwQ2xpY2ssXG4gICAgICBvblBvaW50ZXJEb3duQ2FwdHVyZTogb25Qb3B1cFBvaW50ZXJEb3duXG4gICAgICAvLyBNYXNrXG4gICAgICAsXG4gICAgICBtYXNrOiBtYXNrXG4gICAgICAvLyBNb3Rpb25cbiAgICAgICxcbiAgICAgIG1vdGlvbjogbWVyZ2VQb3B1cE1vdGlvbixcbiAgICAgIG1hc2tNb3Rpb246IG1lcmdlTWFza01vdGlvbixcbiAgICAgIG9uVmlzaWJsZUNoYW5nZWQ6IG9uVmlzaWJsZUNoYW5nZWQsXG4gICAgICBvblByZXBhcmU6IG9uUHJlcGFyZVxuICAgICAgLy8gUG9ydGFsXG4gICAgICAsXG4gICAgICBmb3JjZVJlbmRlcjogZm9yY2VSZW5kZXIsXG4gICAgICBhdXRvRGVzdHJveTogbWVyZ2VkQXV0b0Rlc3Ryb3ksXG4gICAgICBnZXRQb3B1cENvbnRhaW5lcjogZ2V0UG9wdXBDb250YWluZXJcbiAgICAgIC8vIEFycm93XG4gICAgICAsXG4gICAgICBhbGlnbjogYWxpZ25JbmZvLFxuICAgICAgYXJyb3c6IGlubmVyQXJyb3csXG4gICAgICBhcnJvd1BvczogYXJyb3dQb3NcbiAgICAgIC8vIEFsaWduXG4gICAgICAsXG4gICAgICByZWFkeTogcmVhZHksXG4gICAgICBvZmZzZXRYOiBvZmZzZXRYLFxuICAgICAgb2Zmc2V0WTogb2Zmc2V0WSxcbiAgICAgIG9mZnNldFI6IG9mZnNldFIsXG4gICAgICBvZmZzZXRCOiBvZmZzZXRCLFxuICAgICAgb25BbGlnbjogdHJpZ2dlckFsaWduXG4gICAgICAvLyBTdHJldGNoXG4gICAgICAsXG4gICAgICBzdHJldGNoOiBzdHJldGNoLFxuICAgICAgdGFyZ2V0V2lkdGg6IHRhcmdldFdpZHRoIC8gc2NhbGVYLFxuICAgICAgdGFyZ2V0SGVpZ2h0OiB0YXJnZXRIZWlnaHQgLyBzY2FsZVlcbiAgICB9KSkpO1xuICB9KTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBUcmlnZ2VyLmRpc3BsYXlOYW1lID0gJ1RyaWdnZXInO1xuICB9XG4gIHJldHVybiBUcmlnZ2VyO1xufVxuZXhwb3J0IGRlZmF1bHQgZ2VuZXJhdGVUcmlnZ2VyKFBvcnRhbCk7IiwgImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgQ1NTTW90aW9uIGZyb20gJ3JjLW1vdGlvbic7XG5pbXBvcnQgUmVzaXplT2JzZXJ2ZXIgZnJvbSAncmMtcmVzaXplLW9ic2VydmVyJztcbmltcG9ydCB1c2VMYXlvdXRFZmZlY3QgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlTGF5b3V0RWZmZWN0XCI7XG5pbXBvcnQgeyBjb21wb3NlUmVmIH0gZnJvbSBcInJjLXV0aWwvZXMvcmVmXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQXJyb3cgZnJvbSBcIi4vQXJyb3dcIjtcbmltcG9ydCBNYXNrIGZyb20gXCIuL01hc2tcIjtcbmltcG9ydCBQb3B1cENvbnRlbnQgZnJvbSBcIi4vUG9wdXBDb250ZW50XCI7XG52YXIgUG9wdXAgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICB2YXIgcG9wdXAgPSBwcm9wcy5wb3B1cCxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgdGFyZ2V0ID0gcHJvcHMudGFyZ2V0LFxuICAgIF9vblZpc2libGVDaGFuZ2VkID0gcHJvcHMub25WaXNpYmxlQ2hhbmdlZCxcbiAgICBvcGVuID0gcHJvcHMub3BlbixcbiAgICBrZWVwRG9tID0gcHJvcHMua2VlcERvbSxcbiAgICBmcmVzaCA9IHByb3BzLmZyZXNoLFxuICAgIG9uQ2xpY2sgPSBwcm9wcy5vbkNsaWNrLFxuICAgIG1hc2sgPSBwcm9wcy5tYXNrLFxuICAgIGFycm93ID0gcHJvcHMuYXJyb3csXG4gICAgYXJyb3dQb3MgPSBwcm9wcy5hcnJvd1BvcyxcbiAgICBhbGlnbiA9IHByb3BzLmFsaWduLFxuICAgIG1vdGlvbiA9IHByb3BzLm1vdGlvbixcbiAgICBtYXNrTW90aW9uID0gcHJvcHMubWFza01vdGlvbixcbiAgICBmb3JjZVJlbmRlciA9IHByb3BzLmZvcmNlUmVuZGVyLFxuICAgIGdldFBvcHVwQ29udGFpbmVyID0gcHJvcHMuZ2V0UG9wdXBDb250YWluZXIsXG4gICAgYXV0b0Rlc3Ryb3kgPSBwcm9wcy5hdXRvRGVzdHJveSxcbiAgICBQb3J0YWwgPSBwcm9wcy5wb3J0YWwsXG4gICAgekluZGV4ID0gcHJvcHMuekluZGV4LFxuICAgIG9uTW91c2VFbnRlciA9IHByb3BzLm9uTW91c2VFbnRlcixcbiAgICBvbk1vdXNlTGVhdmUgPSBwcm9wcy5vbk1vdXNlTGVhdmUsXG4gICAgb25Qb2ludGVyRW50ZXIgPSBwcm9wcy5vblBvaW50ZXJFbnRlcixcbiAgICBvblBvaW50ZXJEb3duQ2FwdHVyZSA9IHByb3BzLm9uUG9pbnRlckRvd25DYXB0dXJlLFxuICAgIHJlYWR5ID0gcHJvcHMucmVhZHksXG4gICAgb2Zmc2V0WCA9IHByb3BzLm9mZnNldFgsXG4gICAgb2Zmc2V0WSA9IHByb3BzLm9mZnNldFksXG4gICAgb2Zmc2V0UiA9IHByb3BzLm9mZnNldFIsXG4gICAgb2Zmc2V0QiA9IHByb3BzLm9mZnNldEIsXG4gICAgb25BbGlnbiA9IHByb3BzLm9uQWxpZ24sXG4gICAgb25QcmVwYXJlID0gcHJvcHMub25QcmVwYXJlLFxuICAgIHN0cmV0Y2ggPSBwcm9wcy5zdHJldGNoLFxuICAgIHRhcmdldFdpZHRoID0gcHJvcHMudGFyZ2V0V2lkdGgsXG4gICAgdGFyZ2V0SGVpZ2h0ID0gcHJvcHMudGFyZ2V0SGVpZ2h0O1xuICB2YXIgY2hpbGROb2RlID0gdHlwZW9mIHBvcHVwID09PSAnZnVuY3Rpb24nID8gcG9wdXAoKSA6IHBvcHVwO1xuXG4gIC8vIFdlIGNhbiBub3QgcmVtb3ZlIGhvbGRlciBvbmx5IHdoZW4gbW90aW9uIGZpbmlzaGVkLlxuICB2YXIgaXNOb2RlVmlzaWJsZSA9IG9wZW4gfHwga2VlcERvbTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBDb250YWluZXIgPT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBnZXRQb3B1cENvbnRhaW5lck5lZWRQYXJhbXMgPSAoZ2V0UG9wdXBDb250YWluZXIgPT09IG51bGwgfHwgZ2V0UG9wdXBDb250YWluZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGdldFBvcHVwQ29udGFpbmVyLmxlbmd0aCkgPiAwO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoIWdldFBvcHVwQ29udGFpbmVyIHx8ICFnZXRQb3B1cENvbnRhaW5lck5lZWRQYXJhbXMpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIHNob3cgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldFNob3cgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuXG4gIC8vIERlbGF5IHRvIHNob3cgc2luY2UgYGdldFBvcHVwQ29udGFpbmVyYCBuZWVkIHRhcmdldCBlbGVtZW50XG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFzaG93ICYmIGdldFBvcHVwQ29udGFpbmVyTmVlZFBhcmFtcyAmJiB0YXJnZXQpIHtcbiAgICAgIHNldFNob3codHJ1ZSk7XG4gICAgfVxuICB9LCBbc2hvdywgZ2V0UG9wdXBDb250YWluZXJOZWVkUGFyYW1zLCB0YXJnZXRdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGlmICghc2hvdykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gPj4+Pj4gT2Zmc2V0XG4gIHZhciBBVVRPID0gJ2F1dG8nO1xuICB2YXIgb2Zmc2V0U3R5bGUgPSB7XG4gICAgbGVmdDogJy0xMDAwdncnLFxuICAgIHRvcDogJy0xMDAwdmgnLFxuICAgIHJpZ2h0OiBBVVRPLFxuICAgIGJvdHRvbTogQVVUT1xuICB9O1xuXG4gIC8vIFNldCBhbGlnbiBzdHlsZVxuICBpZiAocmVhZHkgfHwgIW9wZW4pIHtcbiAgICB2YXIgX2V4cGVyaW1lbnRhbDtcbiAgICB2YXIgcG9pbnRzID0gYWxpZ24ucG9pbnRzO1xuICAgIHZhciBkeW5hbWljSW5zZXQgPSBhbGlnbi5keW5hbWljSW5zZXQgfHwgKChfZXhwZXJpbWVudGFsID0gYWxpZ24uX2V4cGVyaW1lbnRhbCkgPT09IG51bGwgfHwgX2V4cGVyaW1lbnRhbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2V4cGVyaW1lbnRhbC5keW5hbWljSW5zZXQpO1xuICAgIHZhciBhbGlnblJpZ2h0ID0gZHluYW1pY0luc2V0ICYmIHBvaW50c1swXVsxXSA9PT0gJ3InO1xuICAgIHZhciBhbGlnbkJvdHRvbSA9IGR5bmFtaWNJbnNldCAmJiBwb2ludHNbMF1bMF0gPT09ICdiJztcbiAgICBpZiAoYWxpZ25SaWdodCkge1xuICAgICAgb2Zmc2V0U3R5bGUucmlnaHQgPSBvZmZzZXRSO1xuICAgICAgb2Zmc2V0U3R5bGUubGVmdCA9IEFVVE87XG4gICAgfSBlbHNlIHtcbiAgICAgIG9mZnNldFN0eWxlLmxlZnQgPSBvZmZzZXRYO1xuICAgICAgb2Zmc2V0U3R5bGUucmlnaHQgPSBBVVRPO1xuICAgIH1cbiAgICBpZiAoYWxpZ25Cb3R0b20pIHtcbiAgICAgIG9mZnNldFN0eWxlLmJvdHRvbSA9IG9mZnNldEI7XG4gICAgICBvZmZzZXRTdHlsZS50b3AgPSBBVVRPO1xuICAgIH0gZWxzZSB7XG4gICAgICBvZmZzZXRTdHlsZS50b3AgPSBvZmZzZXRZO1xuICAgICAgb2Zmc2V0U3R5bGUuYm90dG9tID0gQVVUTztcbiAgICB9XG4gIH1cblxuICAvLyA+Pj4+PiBNaXNjXG4gIHZhciBtaXNjU3R5bGUgPSB7fTtcbiAgaWYgKHN0cmV0Y2gpIHtcbiAgICBpZiAoc3RyZXRjaC5pbmNsdWRlcygnaGVpZ2h0JykgJiYgdGFyZ2V0SGVpZ2h0KSB7XG4gICAgICBtaXNjU3R5bGUuaGVpZ2h0ID0gdGFyZ2V0SGVpZ2h0O1xuICAgIH0gZWxzZSBpZiAoc3RyZXRjaC5pbmNsdWRlcygnbWluSGVpZ2h0JykgJiYgdGFyZ2V0SGVpZ2h0KSB7XG4gICAgICBtaXNjU3R5bGUubWluSGVpZ2h0ID0gdGFyZ2V0SGVpZ2h0O1xuICAgIH1cbiAgICBpZiAoc3RyZXRjaC5pbmNsdWRlcygnd2lkdGgnKSAmJiB0YXJnZXRXaWR0aCkge1xuICAgICAgbWlzY1N0eWxlLndpZHRoID0gdGFyZ2V0V2lkdGg7XG4gICAgfSBlbHNlIGlmIChzdHJldGNoLmluY2x1ZGVzKCdtaW5XaWR0aCcpICYmIHRhcmdldFdpZHRoKSB7XG4gICAgICBtaXNjU3R5bGUubWluV2lkdGggPSB0YXJnZXRXaWR0aDtcbiAgICB9XG4gIH1cbiAgaWYgKCFvcGVuKSB7XG4gICAgbWlzY1N0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBvcnRhbCwge1xuICAgIG9wZW46IGZvcmNlUmVuZGVyIHx8IGlzTm9kZVZpc2libGUsXG4gICAgZ2V0Q29udGFpbmVyOiBnZXRQb3B1cENvbnRhaW5lciAmJiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZ2V0UG9wdXBDb250YWluZXIodGFyZ2V0KTtcbiAgICB9LFxuICAgIGF1dG9EZXN0cm95OiBhdXRvRGVzdHJveVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChNYXNrLCB7XG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgb3Blbjogb3BlbixcbiAgICB6SW5kZXg6IHpJbmRleCxcbiAgICBtYXNrOiBtYXNrLFxuICAgIG1vdGlvbjogbWFza01vdGlvblxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVzaXplT2JzZXJ2ZXIsIHtcbiAgICBvblJlc2l6ZTogb25BbGlnbixcbiAgICBkaXNhYmxlZDogIW9wZW5cbiAgfSwgZnVuY3Rpb24gKHJlc2l6ZU9ic2VydmVyUmVmKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENTU01vdGlvbiwgX2V4dGVuZHMoe1xuICAgICAgbW90aW9uQXBwZWFyOiB0cnVlLFxuICAgICAgbW90aW9uRW50ZXI6IHRydWUsXG4gICAgICBtb3Rpb25MZWF2ZTogdHJ1ZSxcbiAgICAgIHJlbW92ZU9uTGVhdmU6IGZhbHNlLFxuICAgICAgZm9yY2VSZW5kZXI6IGZvcmNlUmVuZGVyLFxuICAgICAgbGVhdmVkQ2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhpZGRlblwiKVxuICAgIH0sIG1vdGlvbiwge1xuICAgICAgb25BcHBlYXJQcmVwYXJlOiBvblByZXBhcmUsXG4gICAgICBvbkVudGVyUHJlcGFyZTogb25QcmVwYXJlLFxuICAgICAgdmlzaWJsZTogb3BlbixcbiAgICAgIG9uVmlzaWJsZUNoYW5nZWQ6IGZ1bmN0aW9uIG9uVmlzaWJsZUNoYW5nZWQobmV4dFZpc2libGUpIHtcbiAgICAgICAgdmFyIF9tb3Rpb24kb25WaXNpYmxlQ2hhbjtcbiAgICAgICAgbW90aW9uID09PSBudWxsIHx8IG1vdGlvbiA9PT0gdm9pZCAwIHx8IChfbW90aW9uJG9uVmlzaWJsZUNoYW4gPSBtb3Rpb24ub25WaXNpYmxlQ2hhbmdlZCkgPT09IG51bGwgfHwgX21vdGlvbiRvblZpc2libGVDaGFuID09PSB2b2lkIDAgfHwgX21vdGlvbiRvblZpc2libGVDaGFuLmNhbGwobW90aW9uLCBuZXh0VmlzaWJsZSk7XG4gICAgICAgIF9vblZpc2libGVDaGFuZ2VkKG5leHRWaXNpYmxlKTtcbiAgICAgIH1cbiAgICB9KSwgZnVuY3Rpb24gKF9yZWYsIG1vdGlvblJlZikge1xuICAgICAgdmFyIG1vdGlvbkNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLFxuICAgICAgICBtb3Rpb25TdHlsZSA9IF9yZWYuc3R5bGU7XG4gICAgICB2YXIgY2xzID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIG1vdGlvbkNsYXNzTmFtZSwgY2xhc3NOYW1lKTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIHJlZjogY29tcG9zZVJlZihyZXNpemVPYnNlcnZlclJlZiwgcmVmLCBtb3Rpb25SZWYpLFxuICAgICAgICBjbGFzc05hbWU6IGNscyxcbiAgICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe1xuICAgICAgICAgICctLWFycm93LXgnOiBcIlwiLmNvbmNhdChhcnJvd1Bvcy54IHx8IDAsIFwicHhcIiksXG4gICAgICAgICAgJy0tYXJyb3cteSc6IFwiXCIuY29uY2F0KGFycm93UG9zLnkgfHwgMCwgXCJweFwiKVxuICAgICAgICB9LCBvZmZzZXRTdHlsZSksIG1pc2NTdHlsZSksIG1vdGlvblN0eWxlKSwge30sIHtcbiAgICAgICAgICBib3hTaXppbmc6ICdib3JkZXItYm94JyxcbiAgICAgICAgICB6SW5kZXg6IHpJbmRleFxuICAgICAgICB9LCBzdHlsZSksXG4gICAgICAgIG9uTW91c2VFbnRlcjogb25Nb3VzZUVudGVyLFxuICAgICAgICBvbk1vdXNlTGVhdmU6IG9uTW91c2VMZWF2ZSxcbiAgICAgICAgb25Qb2ludGVyRW50ZXI6IG9uUG9pbnRlckVudGVyLFxuICAgICAgICBvbkNsaWNrOiBvbkNsaWNrLFxuICAgICAgICBvblBvaW50ZXJEb3duQ2FwdHVyZTogb25Qb2ludGVyRG93bkNhcHR1cmVcbiAgICAgIH0sIGFycm93ICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFycm93LCB7XG4gICAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgICBhcnJvdzogYXJyb3csXG4gICAgICAgIGFycm93UG9zOiBhcnJvd1BvcyxcbiAgICAgICAgYWxpZ246IGFsaWduXG4gICAgICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUG9wdXBDb250ZW50LCB7XG4gICAgICAgIGNhY2hlOiAhb3BlbiAmJiAhZnJlc2hcbiAgICAgIH0sIGNoaWxkTm9kZSkpO1xuICAgIH0pO1xuICB9KSk7XG59KTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFBvcHVwLmRpc3BsYXlOYW1lID0gJ1BvcHVwJztcbn1cbmV4cG9ydCBkZWZhdWx0IFBvcHVwOyIsICJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEFycm93KHByb3BzKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgYWxpZ24gPSBwcm9wcy5hbGlnbixcbiAgICBhcnJvdyA9IHByb3BzLmFycm93LFxuICAgIGFycm93UG9zID0gcHJvcHMuYXJyb3dQb3M7XG4gIHZhciBfcmVmID0gYXJyb3cgfHwge30sXG4gICAgY2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsXG4gICAgY29udGVudCA9IF9yZWYuY29udGVudDtcbiAgdmFyIF9hcnJvd1BvcyR4ID0gYXJyb3dQb3MueCxcbiAgICB4ID0gX2Fycm93UG9zJHggPT09IHZvaWQgMCA/IDAgOiBfYXJyb3dQb3MkeCxcbiAgICBfYXJyb3dQb3MkeSA9IGFycm93UG9zLnksXG4gICAgeSA9IF9hcnJvd1BvcyR5ID09PSB2b2lkIDAgPyAwIDogX2Fycm93UG9zJHk7XG4gIHZhciBhcnJvd1JlZiA9IFJlYWN0LnVzZVJlZigpO1xuXG4gIC8vIFNraXAgaWYgbm8gYWxpZ25cbiAgaWYgKCFhbGlnbiB8fCAhYWxpZ24ucG9pbnRzKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIGFsaWduU3R5bGUgPSB7XG4gICAgcG9zaXRpb246ICdhYnNvbHV0ZSdcbiAgfTtcblxuICAvLyBTa2lwIGlmIG5vIG5lZWQgdG8gYWxpZ25cbiAgaWYgKGFsaWduLmF1dG9BcnJvdyAhPT0gZmFsc2UpIHtcbiAgICB2YXIgcG9wdXBQb2ludHMgPSBhbGlnbi5wb2ludHNbMF07XG4gICAgdmFyIHRhcmdldFBvaW50cyA9IGFsaWduLnBvaW50c1sxXTtcbiAgICB2YXIgcG9wdXBUQiA9IHBvcHVwUG9pbnRzWzBdO1xuICAgIHZhciBwb3B1cExSID0gcG9wdXBQb2ludHNbMV07XG4gICAgdmFyIHRhcmdldFRCID0gdGFyZ2V0UG9pbnRzWzBdO1xuICAgIHZhciB0YXJnZXRMUiA9IHRhcmdldFBvaW50c1sxXTtcblxuICAgIC8vIFRvcCAmIEJvdHRvbVxuICAgIGlmIChwb3B1cFRCID09PSB0YXJnZXRUQiB8fCAhWyd0JywgJ2InXS5pbmNsdWRlcyhwb3B1cFRCKSkge1xuICAgICAgYWxpZ25TdHlsZS50b3AgPSB5O1xuICAgIH0gZWxzZSBpZiAocG9wdXBUQiA9PT0gJ3QnKSB7XG4gICAgICBhbGlnblN0eWxlLnRvcCA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFsaWduU3R5bGUuYm90dG9tID0gMDtcbiAgICB9XG5cbiAgICAvLyBMZWZ0ICYgUmlnaHRcbiAgICBpZiAocG9wdXBMUiA9PT0gdGFyZ2V0TFIgfHwgIVsnbCcsICdyJ10uaW5jbHVkZXMocG9wdXBMUikpIHtcbiAgICAgIGFsaWduU3R5bGUubGVmdCA9IHg7XG4gICAgfSBlbHNlIGlmIChwb3B1cExSID09PSAnbCcpIHtcbiAgICAgIGFsaWduU3R5bGUubGVmdCA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFsaWduU3R5bGUucmlnaHQgPSAwO1xuICAgIH1cbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHJlZjogYXJyb3dSZWYsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYXJyb3dcIiksIGNsYXNzTmFtZSksXG4gICAgc3R5bGU6IGFsaWduU3R5bGVcbiAgfSwgY29udGVudCk7XG59IiwgImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgQ1NTTW90aW9uIGZyb20gJ3JjLW1vdGlvbic7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNYXNrKHByb3BzKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgb3BlbiA9IHByb3BzLm9wZW4sXG4gICAgekluZGV4ID0gcHJvcHMuekluZGV4LFxuICAgIG1hc2sgPSBwcm9wcy5tYXNrLFxuICAgIG1vdGlvbiA9IHByb3BzLm1vdGlvbjtcbiAgaWYgKCFtYXNrKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENTU01vdGlvbiwgX2V4dGVuZHMoe30sIG1vdGlvbiwge1xuICAgIG1vdGlvbkFwcGVhcjogdHJ1ZSxcbiAgICB2aXNpYmxlOiBvcGVuLFxuICAgIHJlbW92ZU9uTGVhdmU6IHRydWVcbiAgfSksIGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgdmFyIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBzdHlsZToge1xuICAgICAgICB6SW5kZXg6IHpJbmRleFxuICAgICAgfSxcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW1hc2tcIiksIGNsYXNzTmFtZSlcbiAgICB9KTtcbiAgfSk7XG59IiwgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbnZhciBQb3B1cENvbnRlbnQgPSAvKiNfX1BVUkVfXyovUmVhY3QubWVtbyhmdW5jdGlvbiAoX3JlZikge1xuICB2YXIgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuO1xuICByZXR1cm4gY2hpbGRyZW47XG59LCBmdW5jdGlvbiAoXywgbmV4dCkge1xuICByZXR1cm4gbmV4dC5jYWNoZTtcbn0pO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgUG9wdXBDb250ZW50LmRpc3BsYXlOYW1lID0gJ1BvcHVwQ29udGVudCc7XG59XG5leHBvcnQgZGVmYXVsdCBQb3B1cENvbnRlbnQ7IiwgImltcG9ydCB7IGZpbGxSZWYsIGdldE5vZGVSZWYsIHN1cHBvcnRSZWYsIHVzZUNvbXBvc2VSZWYgfSBmcm9tIFwicmMtdXRpbC9lcy9yZWZcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbnZhciBUcmlnZ2VyV3JhcHBlciA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgIGdldFRyaWdnZXJET01Ob2RlID0gcHJvcHMuZ2V0VHJpZ2dlckRPTU5vZGU7XG4gIHZhciBjYW5Vc2VSZWYgPSBzdXBwb3J0UmVmKGNoaWxkcmVuKTtcblxuICAvLyBXaGVuIHVzZSBgZ2V0VHJpZ2dlckRPTU5vZGVgLCB3ZSBzaG91bGQgZG8gYWRkaXRpb25hbCB3b3JrIHRvIGdldCB0aGUgcmVhbCBkb21cbiAgdmFyIHNldFJlZiA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgZmlsbFJlZihyZWYsIGdldFRyaWdnZXJET01Ob2RlID8gZ2V0VHJpZ2dlckRPTU5vZGUobm9kZSkgOiBub2RlKTtcbiAgfSwgW2dldFRyaWdnZXJET01Ob2RlXSk7XG4gIHZhciBtZXJnZWRSZWYgPSB1c2VDb21wb3NlUmVmKHNldFJlZiwgZ2V0Tm9kZVJlZihjaGlsZHJlbikpO1xuICByZXR1cm4gY2FuVXNlUmVmID8gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChjaGlsZHJlbiwge1xuICAgIHJlZjogbWVyZ2VkUmVmXG4gIH0pIDogY2hpbGRyZW47XG59KTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFRyaWdnZXJXcmFwcGVyLmRpc3BsYXlOYW1lID0gJ1RyaWdnZXJXcmFwcGVyJztcbn1cbmV4cG9ydCBkZWZhdWx0IFRyaWdnZXJXcmFwcGVyOyIsICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG52YXIgVHJpZ2dlckNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmV4cG9ydCBkZWZhdWx0IFRyaWdnZXJDb250ZXh0OyIsICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5mdW5jdGlvbiB0b0FycmF5KHZhbCkge1xuICByZXR1cm4gdmFsID8gQXJyYXkuaXNBcnJheSh2YWwpID8gdmFsIDogW3ZhbF0gOiBbXTtcbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUFjdGlvbihtb2JpbGUsIGFjdGlvbiwgc2hvd0FjdGlvbiwgaGlkZUFjdGlvbikge1xuICByZXR1cm4gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG1lcmdlZFNob3dBY3Rpb24gPSB0b0FycmF5KHNob3dBY3Rpb24gIT09IG51bGwgJiYgc2hvd0FjdGlvbiAhPT0gdm9pZCAwID8gc2hvd0FjdGlvbiA6IGFjdGlvbik7XG4gICAgdmFyIG1lcmdlZEhpZGVBY3Rpb24gPSB0b0FycmF5KGhpZGVBY3Rpb24gIT09IG51bGwgJiYgaGlkZUFjdGlvbiAhPT0gdm9pZCAwID8gaGlkZUFjdGlvbiA6IGFjdGlvbik7XG4gICAgdmFyIHNob3dBY3Rpb25TZXQgPSBuZXcgU2V0KG1lcmdlZFNob3dBY3Rpb24pO1xuICAgIHZhciBoaWRlQWN0aW9uU2V0ID0gbmV3IFNldChtZXJnZWRIaWRlQWN0aW9uKTtcbiAgICBpZiAobW9iaWxlKSB7XG4gICAgICBpZiAoc2hvd0FjdGlvblNldC5oYXMoJ2hvdmVyJykpIHtcbiAgICAgICAgc2hvd0FjdGlvblNldC5kZWxldGUoJ2hvdmVyJyk7XG4gICAgICAgIHNob3dBY3Rpb25TZXQuYWRkKCdjbGljaycpO1xuICAgICAgfVxuICAgICAgaWYgKGhpZGVBY3Rpb25TZXQuaGFzKCdob3ZlcicpKSB7XG4gICAgICAgIGhpZGVBY3Rpb25TZXQuZGVsZXRlKCdob3ZlcicpO1xuICAgICAgICBoaWRlQWN0aW9uU2V0LmFkZCgnY2xpY2snKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtzaG93QWN0aW9uU2V0LCBoaWRlQWN0aW9uU2V0XTtcbiAgfSwgW21vYmlsZSwgYWN0aW9uLCBzaG93QWN0aW9uLCBoaWRlQWN0aW9uXSk7XG59IiwgImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCB7IGlzRE9NIH0gZnJvbSBcInJjLXV0aWwvZXMvRG9tL2ZpbmRET01Ob2RlXCI7XG5pbXBvcnQgaXNWaXNpYmxlIGZyb20gXCJyYy11dGlsL2VzL0RvbS9pc1Zpc2libGVcIjtcbmltcG9ydCB1c2VFdmVudCBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VFdmVudFwiO1xuaW1wb3J0IHVzZUxheW91dEVmZmVjdCBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VMYXlvdXRFZmZlY3RcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNvbGxlY3RTY3JvbGxlciwgZ2V0VmlzaWJsZUFyZWEsIGdldFdpbiwgdG9OdW0gfSBmcm9tIFwiLi4vdXRpbFwiO1xuZnVuY3Rpb24gZ2V0VW5pdE9mZnNldChzaXplKSB7XG4gIHZhciBvZmZzZXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDA7XG4gIHZhciBvZmZzZXRTdHIgPSBcIlwiLmNvbmNhdChvZmZzZXQpO1xuICB2YXIgY2VsbHMgPSBvZmZzZXRTdHIubWF0Y2goL14oLiopXFwlJC8pO1xuICBpZiAoY2VsbHMpIHtcbiAgICByZXR1cm4gc2l6ZSAqIChwYXJzZUZsb2F0KGNlbGxzWzFdKSAvIDEwMCk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlRmxvYXQob2Zmc2V0U3RyKTtcbn1cbmZ1bmN0aW9uIGdldE51bWJlck9mZnNldChyZWN0LCBvZmZzZXQpIHtcbiAgdmFyIF9yZWYgPSBvZmZzZXQgfHwgW10sXG4gICAgX3JlZjIgPSBfc2xpY2VkVG9BcnJheShfcmVmLCAyKSxcbiAgICBvZmZzZXRYID0gX3JlZjJbMF0sXG4gICAgb2Zmc2V0WSA9IF9yZWYyWzFdO1xuICByZXR1cm4gW2dldFVuaXRPZmZzZXQocmVjdC53aWR0aCwgb2Zmc2V0WCksIGdldFVuaXRPZmZzZXQocmVjdC5oZWlnaHQsIG9mZnNldFkpXTtcbn1cbmZ1bmN0aW9uIHNwbGl0UG9pbnRzKCkge1xuICB2YXIgcG9pbnRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnJztcbiAgcmV0dXJuIFtwb2ludHNbMF0sIHBvaW50c1sxXV07XG59XG5mdW5jdGlvbiBnZXRBbGlnblBvaW50KHJlY3QsIHBvaW50cykge1xuICB2YXIgdG9wQm90dG9tID0gcG9pbnRzWzBdO1xuICB2YXIgbGVmdFJpZ2h0ID0gcG9pbnRzWzFdO1xuICB2YXIgeDtcbiAgdmFyIHk7XG5cbiAgLy8gVG9wICYgQm90dG9tXG4gIGlmICh0b3BCb3R0b20gPT09ICd0Jykge1xuICAgIHkgPSByZWN0Lnk7XG4gIH0gZWxzZSBpZiAodG9wQm90dG9tID09PSAnYicpIHtcbiAgICB5ID0gcmVjdC55ICsgcmVjdC5oZWlnaHQ7XG4gIH0gZWxzZSB7XG4gICAgeSA9IHJlY3QueSArIHJlY3QuaGVpZ2h0IC8gMjtcbiAgfVxuXG4gIC8vIExlZnQgJiBSaWdodFxuICBpZiAobGVmdFJpZ2h0ID09PSAnbCcpIHtcbiAgICB4ID0gcmVjdC54O1xuICB9IGVsc2UgaWYgKGxlZnRSaWdodCA9PT0gJ3InKSB7XG4gICAgeCA9IHJlY3QueCArIHJlY3Qud2lkdGg7XG4gIH0gZWxzZSB7XG4gICAgeCA9IHJlY3QueCArIHJlY3Qud2lkdGggLyAyO1xuICB9XG4gIHJldHVybiB7XG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH07XG59XG5mdW5jdGlvbiByZXZlcnNlUG9pbnRzKHBvaW50cywgaW5kZXgpIHtcbiAgdmFyIHJldmVyc2VNYXAgPSB7XG4gICAgdDogJ2InLFxuICAgIGI6ICd0JyxcbiAgICBsOiAncicsXG4gICAgcjogJ2wnXG4gIH07XG4gIHJldHVybiBwb2ludHMubWFwKGZ1bmN0aW9uIChwb2ludCwgaSkge1xuICAgIGlmIChpID09PSBpbmRleCkge1xuICAgICAgcmV0dXJuIHJldmVyc2VNYXBbcG9pbnRdIHx8ICdjJztcbiAgICB9XG4gICAgcmV0dXJuIHBvaW50O1xuICB9KS5qb2luKCcnKTtcbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUFsaWduKG9wZW4sIHBvcHVwRWxlLCB0YXJnZXQsIHBsYWNlbWVudCwgYnVpbHRpblBsYWNlbWVudHMsIHBvcHVwQWxpZ24sIG9uUG9wdXBBbGlnbikge1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoe1xuICAgICAgcmVhZHk6IGZhbHNlLFxuICAgICAgb2Zmc2V0WDogMCxcbiAgICAgIG9mZnNldFk6IDAsXG4gICAgICBvZmZzZXRSOiAwLFxuICAgICAgb2Zmc2V0QjogMCxcbiAgICAgIGFycm93WDogMCxcbiAgICAgIGFycm93WTogMCxcbiAgICAgIHNjYWxlWDogMSxcbiAgICAgIHNjYWxlWTogMSxcbiAgICAgIGFsaWduOiBidWlsdGluUGxhY2VtZW50c1twbGFjZW1lbnRdIHx8IHt9XG4gICAgfSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgb2Zmc2V0SW5mbyA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0T2Zmc2V0SW5mbyA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciBhbGlnbkNvdW50UmVmID0gUmVhY3QudXNlUmVmKDApO1xuICB2YXIgc2Nyb2xsZXJMaXN0ID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFwb3B1cEVsZSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gY29sbGVjdFNjcm9sbGVyKHBvcHVwRWxlKTtcbiAgfSwgW3BvcHVwRWxlXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBGbGlwID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFdlIHdpbGwgbWVtbyBmbGlwIGluZm8uXG4gIC8vIElmIHNpemUgY2hhbmdlIHRvIG1ha2UgZmxpcCwgaXQgd2lsbCBtZW1vIHRoZSBmbGlwIGluZm8gYW5kIHVzZSBpdCBpbiBuZXh0IGFsaWduLlxuICB2YXIgcHJldkZsaXBSZWYgPSBSZWFjdC51c2VSZWYoe30pO1xuICB2YXIgcmVzZXRGbGlwQ2FjaGUgPSBmdW5jdGlvbiByZXNldEZsaXBDYWNoZSgpIHtcbiAgICBwcmV2RmxpcFJlZi5jdXJyZW50ID0ge307XG4gIH07XG4gIGlmICghb3Blbikge1xuICAgIHJlc2V0RmxpcENhY2hlKCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IEFsaWduID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG9uQWxpZ24gPSB1c2VFdmVudChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHBvcHVwRWxlICYmIHRhcmdldCAmJiBvcGVuKSB7XG4gICAgICB2YXIgX3BvcHVwRWxlbWVudCRwYXJlbnRFLCBfcG9wdXBSZWN0JHgsIF9wb3B1cFJlY3QkeSwgX3BvcHVwRWxlbWVudCRwYXJlbnRFMjtcbiAgICAgIHZhciBwb3B1cEVsZW1lbnQgPSBwb3B1cEVsZTtcbiAgICAgIHZhciBkb2MgPSBwb3B1cEVsZW1lbnQub3duZXJEb2N1bWVudDtcbiAgICAgIHZhciB3aW4gPSBnZXRXaW4ocG9wdXBFbGVtZW50KTtcbiAgICAgIHZhciBfd2luJGdldENvbXB1dGVkU3R5bGUgPSB3aW4uZ2V0Q29tcHV0ZWRTdHlsZShwb3B1cEVsZW1lbnQpLFxuICAgICAgICB3aWR0aCA9IF93aW4kZ2V0Q29tcHV0ZWRTdHlsZS53aWR0aCxcbiAgICAgICAgaGVpZ2h0ID0gX3dpbiRnZXRDb21wdXRlZFN0eWxlLmhlaWdodCxcbiAgICAgICAgcG9wdXBQb3NpdGlvbiA9IF93aW4kZ2V0Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbjtcbiAgICAgIHZhciBvcmlnaW5MZWZ0ID0gcG9wdXBFbGVtZW50LnN0eWxlLmxlZnQ7XG4gICAgICB2YXIgb3JpZ2luVG9wID0gcG9wdXBFbGVtZW50LnN0eWxlLnRvcDtcbiAgICAgIHZhciBvcmlnaW5SaWdodCA9IHBvcHVwRWxlbWVudC5zdHlsZS5yaWdodDtcbiAgICAgIHZhciBvcmlnaW5Cb3R0b20gPSBwb3B1cEVsZW1lbnQuc3R5bGUuYm90dG9tO1xuICAgICAgdmFyIG9yaWdpbk92ZXJmbG93ID0gcG9wdXBFbGVtZW50LnN0eWxlLm92ZXJmbG93O1xuXG4gICAgICAvLyBQbGFjZW1lbnRcbiAgICAgIHZhciBwbGFjZW1lbnRJbmZvID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBidWlsdGluUGxhY2VtZW50c1twbGFjZW1lbnRdKSwgcG9wdXBBbGlnbik7XG5cbiAgICAgIC8vIHBsYWNlaG9sZGVyIGVsZW1lbnRcbiAgICAgIHZhciBwbGFjZWhvbGRlckVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAoX3BvcHVwRWxlbWVudCRwYXJlbnRFID0gcG9wdXBFbGVtZW50LnBhcmVudEVsZW1lbnQpID09PSBudWxsIHx8IF9wb3B1cEVsZW1lbnQkcGFyZW50RSA9PT0gdm9pZCAwIHx8IF9wb3B1cEVsZW1lbnQkcGFyZW50RS5hcHBlbmRDaGlsZChwbGFjZWhvbGRlckVsZW1lbnQpO1xuICAgICAgcGxhY2Vob2xkZXJFbGVtZW50LnN0eWxlLmxlZnQgPSBcIlwiLmNvbmNhdChwb3B1cEVsZW1lbnQub2Zmc2V0TGVmdCwgXCJweFwiKTtcbiAgICAgIHBsYWNlaG9sZGVyRWxlbWVudC5zdHlsZS50b3AgPSBcIlwiLmNvbmNhdChwb3B1cEVsZW1lbnQub2Zmc2V0VG9wLCBcInB4XCIpO1xuICAgICAgcGxhY2Vob2xkZXJFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gcG9wdXBQb3NpdGlvbjtcbiAgICAgIHBsYWNlaG9sZGVyRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBcIlwiLmNvbmNhdChwb3B1cEVsZW1lbnQub2Zmc2V0SGVpZ2h0LCBcInB4XCIpO1xuICAgICAgcGxhY2Vob2xkZXJFbGVtZW50LnN0eWxlLndpZHRoID0gXCJcIi5jb25jYXQocG9wdXBFbGVtZW50Lm9mZnNldFdpZHRoLCBcInB4XCIpO1xuXG4gICAgICAvLyBSZXNldCBmaXJzdFxuICAgICAgcG9wdXBFbGVtZW50LnN0eWxlLmxlZnQgPSAnMCc7XG4gICAgICBwb3B1cEVsZW1lbnQuc3R5bGUudG9wID0gJzAnO1xuICAgICAgcG9wdXBFbGVtZW50LnN0eWxlLnJpZ2h0ID0gJ2F1dG8nO1xuICAgICAgcG9wdXBFbGVtZW50LnN0eWxlLmJvdHRvbSA9ICdhdXRvJztcbiAgICAgIHBvcHVwRWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgYWxpZ24gc3R5bGUsIHdlIHNob3VsZCBjb25zaWRlciBgdHJhbnNmb3JtYCBjYXNlXG4gICAgICB2YXIgdGFyZ2V0UmVjdDtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0UmVjdCA9IHtcbiAgICAgICAgICB4OiB0YXJnZXRbMF0sXG4gICAgICAgICAgeTogdGFyZ2V0WzFdLFxuICAgICAgICAgIHdpZHRoOiAwLFxuICAgICAgICAgIGhlaWdodDogMFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIF9yZWN0JHgsIF9yZWN0JHk7XG4gICAgICAgIHZhciByZWN0ID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICByZWN0LnggPSAoX3JlY3QkeCA9IHJlY3QueCkgIT09IG51bGwgJiYgX3JlY3QkeCAhPT0gdm9pZCAwID8gX3JlY3QkeCA6IHJlY3QubGVmdDtcbiAgICAgICAgcmVjdC55ID0gKF9yZWN0JHkgPSByZWN0LnkpICE9PSBudWxsICYmIF9yZWN0JHkgIT09IHZvaWQgMCA/IF9yZWN0JHkgOiByZWN0LnRvcDtcbiAgICAgICAgdGFyZ2V0UmVjdCA9IHtcbiAgICAgICAgICB4OiByZWN0LngsXG4gICAgICAgICAgeTogcmVjdC55LFxuICAgICAgICAgIHdpZHRoOiByZWN0LndpZHRoLFxuICAgICAgICAgIGhlaWdodDogcmVjdC5oZWlnaHRcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHZhciBwb3B1cFJlY3QgPSBwb3B1cEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBwb3B1cFJlY3QueCA9IChfcG9wdXBSZWN0JHggPSBwb3B1cFJlY3QueCkgIT09IG51bGwgJiYgX3BvcHVwUmVjdCR4ICE9PSB2b2lkIDAgPyBfcG9wdXBSZWN0JHggOiBwb3B1cFJlY3QubGVmdDtcbiAgICAgIHBvcHVwUmVjdC55ID0gKF9wb3B1cFJlY3QkeSA9IHBvcHVwUmVjdC55KSAhPT0gbnVsbCAmJiBfcG9wdXBSZWN0JHkgIT09IHZvaWQgMCA/IF9wb3B1cFJlY3QkeSA6IHBvcHVwUmVjdC50b3A7XG4gICAgICB2YXIgX2RvYyRkb2N1bWVudEVsZW1lbnQgPSBkb2MuZG9jdW1lbnRFbGVtZW50LFxuICAgICAgICBjbGllbnRXaWR0aCA9IF9kb2MkZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLFxuICAgICAgICBjbGllbnRIZWlnaHQgPSBfZG9jJGRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQsXG4gICAgICAgIHNjcm9sbFdpZHRoID0gX2RvYyRkb2N1bWVudEVsZW1lbnQuc2Nyb2xsV2lkdGgsXG4gICAgICAgIHNjcm9sbEhlaWdodCA9IF9kb2MkZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCxcbiAgICAgICAgc2Nyb2xsVG9wID0gX2RvYyRkb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wLFxuICAgICAgICBzY3JvbGxMZWZ0ID0gX2RvYyRkb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdDtcbiAgICAgIHZhciBwb3B1cEhlaWdodCA9IHBvcHVwUmVjdC5oZWlnaHQ7XG4gICAgICB2YXIgcG9wdXBXaWR0aCA9IHBvcHVwUmVjdC53aWR0aDtcbiAgICAgIHZhciB0YXJnZXRIZWlnaHQgPSB0YXJnZXRSZWN0LmhlaWdodDtcbiAgICAgIHZhciB0YXJnZXRXaWR0aCA9IHRhcmdldFJlY3Qud2lkdGg7XG5cbiAgICAgIC8vIEdldCBib3VuZGluZyBvZiB2aXNpYmxlIGFyZWFcbiAgICAgIHZhciB2aXNpYmxlUmVnaW9uID0ge1xuICAgICAgICBsZWZ0OiAwLFxuICAgICAgICB0b3A6IDAsXG4gICAgICAgIHJpZ2h0OiBjbGllbnRXaWR0aCxcbiAgICAgICAgYm90dG9tOiBjbGllbnRIZWlnaHRcbiAgICAgIH07XG4gICAgICB2YXIgc2Nyb2xsUmVnaW9uID0ge1xuICAgICAgICBsZWZ0OiAtc2Nyb2xsTGVmdCxcbiAgICAgICAgdG9wOiAtc2Nyb2xsVG9wLFxuICAgICAgICByaWdodDogc2Nyb2xsV2lkdGggLSBzY3JvbGxMZWZ0LFxuICAgICAgICBib3R0b206IHNjcm9sbEhlaWdodCAtIHNjcm9sbFRvcFxuICAgICAgfTtcbiAgICAgIHZhciBodG1sUmVnaW9uID0gcGxhY2VtZW50SW5mby5odG1sUmVnaW9uO1xuICAgICAgdmFyIFZJU0lCTEUgPSAndmlzaWJsZSc7XG4gICAgICB2YXIgVklTSUJMRV9GSVJTVCA9ICd2aXNpYmxlRmlyc3QnO1xuICAgICAgaWYgKGh0bWxSZWdpb24gIT09ICdzY3JvbGwnICYmIGh0bWxSZWdpb24gIT09IFZJU0lCTEVfRklSU1QpIHtcbiAgICAgICAgaHRtbFJlZ2lvbiA9IFZJU0lCTEU7XG4gICAgICB9XG4gICAgICB2YXIgaXNWaXNpYmxlRmlyc3QgPSBodG1sUmVnaW9uID09PSBWSVNJQkxFX0ZJUlNUO1xuICAgICAgdmFyIHNjcm9sbFJlZ2lvbkFyZWEgPSBnZXRWaXNpYmxlQXJlYShzY3JvbGxSZWdpb24sIHNjcm9sbGVyTGlzdCk7XG4gICAgICB2YXIgdmlzaWJsZVJlZ2lvbkFyZWEgPSBnZXRWaXNpYmxlQXJlYSh2aXNpYmxlUmVnaW9uLCBzY3JvbGxlckxpc3QpO1xuICAgICAgdmFyIHZpc2libGVBcmVhID0gaHRtbFJlZ2lvbiA9PT0gVklTSUJMRSA/IHZpc2libGVSZWdpb25BcmVhIDogc2Nyb2xsUmVnaW9uQXJlYTtcblxuICAgICAgLy8gV2hlbiBzZXQgdG8gYHZpc2libGVGaXJzdGAsXG4gICAgICAvLyB0aGUgY2hlY2sgYGFkanVzdGAgbG9naWMgd2lsbCB1c2UgYHZpc2libGVSZWdpb25gIGZvciBjaGVjayBmaXJzdC5cbiAgICAgIHZhciBhZGp1c3RDaGVja1Zpc2libGVBcmVhID0gaXNWaXNpYmxlRmlyc3QgPyB2aXNpYmxlUmVnaW9uQXJlYSA6IHZpc2libGVBcmVhO1xuXG4gICAgICAvLyBSZWNvcmQgcmlnaHQgJiBib3R0b20gYWxpZ24gZGF0YVxuICAgICAgcG9wdXBFbGVtZW50LnN0eWxlLmxlZnQgPSAnYXV0byc7XG4gICAgICBwb3B1cEVsZW1lbnQuc3R5bGUudG9wID0gJ2F1dG8nO1xuICAgICAgcG9wdXBFbGVtZW50LnN0eWxlLnJpZ2h0ID0gJzAnO1xuICAgICAgcG9wdXBFbGVtZW50LnN0eWxlLmJvdHRvbSA9ICcwJztcbiAgICAgIHZhciBwb3B1cE1pcnJvclJlY3QgPSBwb3B1cEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgIC8vIFJlc2V0IGJhY2tcbiAgICAgIHBvcHVwRWxlbWVudC5zdHlsZS5sZWZ0ID0gb3JpZ2luTGVmdDtcbiAgICAgIHBvcHVwRWxlbWVudC5zdHlsZS50b3AgPSBvcmlnaW5Ub3A7XG4gICAgICBwb3B1cEVsZW1lbnQuc3R5bGUucmlnaHQgPSBvcmlnaW5SaWdodDtcbiAgICAgIHBvcHVwRWxlbWVudC5zdHlsZS5ib3R0b20gPSBvcmlnaW5Cb3R0b207XG4gICAgICBwb3B1cEVsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSBvcmlnaW5PdmVyZmxvdztcbiAgICAgIChfcG9wdXBFbGVtZW50JHBhcmVudEUyID0gcG9wdXBFbGVtZW50LnBhcmVudEVsZW1lbnQpID09PSBudWxsIHx8IF9wb3B1cEVsZW1lbnQkcGFyZW50RTIgPT09IHZvaWQgMCB8fCBfcG9wdXBFbGVtZW50JHBhcmVudEUyLnJlbW92ZUNoaWxkKHBsYWNlaG9sZGVyRWxlbWVudCk7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBzY2FsZVxuICAgICAgdmFyIF9zY2FsZVggPSB0b051bShNYXRoLnJvdW5kKHBvcHVwV2lkdGggLyBwYXJzZUZsb2F0KHdpZHRoKSAqIDEwMDApIC8gMTAwMCk7XG4gICAgICB2YXIgX3NjYWxlWSA9IHRvTnVtKE1hdGgucm91bmQocG9wdXBIZWlnaHQgLyBwYXJzZUZsb2F0KGhlaWdodCkgKiAxMDAwKSAvIDEwMDApO1xuXG4gICAgICAvLyBObyBuZWVkIHRvIGFsaWduIHNpbmNlIGl0J3Mgbm90IHZpc2libGUgaW4gdmlld1xuICAgICAgaWYgKF9zY2FsZVggPT09IDAgfHwgX3NjYWxlWSA9PT0gMCB8fCBpc0RPTSh0YXJnZXQpICYmICFpc1Zpc2libGUodGFyZ2V0KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIE9mZnNldFxuICAgICAgdmFyIG9mZnNldCA9IHBsYWNlbWVudEluZm8ub2Zmc2V0LFxuICAgICAgICB0YXJnZXRPZmZzZXQgPSBwbGFjZW1lbnRJbmZvLnRhcmdldE9mZnNldDtcbiAgICAgIHZhciBfZ2V0TnVtYmVyT2Zmc2V0ID0gZ2V0TnVtYmVyT2Zmc2V0KHBvcHVwUmVjdCwgb2Zmc2V0KSxcbiAgICAgICAgX2dldE51bWJlck9mZnNldDIgPSBfc2xpY2VkVG9BcnJheShfZ2V0TnVtYmVyT2Zmc2V0LCAyKSxcbiAgICAgICAgcG9wdXBPZmZzZXRYID0gX2dldE51bWJlck9mZnNldDJbMF0sXG4gICAgICAgIHBvcHVwT2Zmc2V0WSA9IF9nZXROdW1iZXJPZmZzZXQyWzFdO1xuICAgICAgdmFyIF9nZXROdW1iZXJPZmZzZXQzID0gZ2V0TnVtYmVyT2Zmc2V0KHRhcmdldFJlY3QsIHRhcmdldE9mZnNldCksXG4gICAgICAgIF9nZXROdW1iZXJPZmZzZXQ0ID0gX3NsaWNlZFRvQXJyYXkoX2dldE51bWJlck9mZnNldDMsIDIpLFxuICAgICAgICB0YXJnZXRPZmZzZXRYID0gX2dldE51bWJlck9mZnNldDRbMF0sXG4gICAgICAgIHRhcmdldE9mZnNldFkgPSBfZ2V0TnVtYmVyT2Zmc2V0NFsxXTtcbiAgICAgIHRhcmdldFJlY3QueCAtPSB0YXJnZXRPZmZzZXRYO1xuICAgICAgdGFyZ2V0UmVjdC55IC09IHRhcmdldE9mZnNldFk7XG5cbiAgICAgIC8vIFBvaW50c1xuICAgICAgdmFyIF9yZWYzID0gcGxhY2VtZW50SW5mby5wb2ludHMgfHwgW10sXG4gICAgICAgIF9yZWY0ID0gX3NsaWNlZFRvQXJyYXkoX3JlZjMsIDIpLFxuICAgICAgICBwb3B1cFBvaW50ID0gX3JlZjRbMF0sXG4gICAgICAgIHRhcmdldFBvaW50ID0gX3JlZjRbMV07XG4gICAgICB2YXIgdGFyZ2V0UG9pbnRzID0gc3BsaXRQb2ludHModGFyZ2V0UG9pbnQpO1xuICAgICAgdmFyIHBvcHVwUG9pbnRzID0gc3BsaXRQb2ludHMocG9wdXBQb2ludCk7XG4gICAgICB2YXIgdGFyZ2V0QWxpZ25Qb2ludCA9IGdldEFsaWduUG9pbnQodGFyZ2V0UmVjdCwgdGFyZ2V0UG9pbnRzKTtcbiAgICAgIHZhciBwb3B1cEFsaWduUG9pbnQgPSBnZXRBbGlnblBvaW50KHBvcHVwUmVjdCwgcG9wdXBQb2ludHMpO1xuXG4gICAgICAvLyBSZWFsIGFsaWduIGluZm8gbWF5IG5vdCBzYW1lIGFzIG9yaWdpbiBvbmVcbiAgICAgIHZhciBuZXh0QWxpZ25JbmZvID0gX29iamVjdFNwcmVhZCh7fSwgcGxhY2VtZW50SW5mbyk7XG5cbiAgICAgIC8vIE5leHQgT2Zmc2V0XG4gICAgICB2YXIgbmV4dE9mZnNldFggPSB0YXJnZXRBbGlnblBvaW50LnggLSBwb3B1cEFsaWduUG9pbnQueCArIHBvcHVwT2Zmc2V0WDtcbiAgICAgIHZhciBuZXh0T2Zmc2V0WSA9IHRhcmdldEFsaWduUG9pbnQueSAtIHBvcHVwQWxpZ25Qb2ludC55ICsgcG9wdXBPZmZzZXRZO1xuXG4gICAgICAvLyA9PT09PT09PT09PT09PSBJbnRlcnNlY3Rpb24gPT09PT09PT09PT09PT09XG4gICAgICAvLyBHZXQgYXJlYSBieSBwb3NpdGlvbi4gVXNlZCBmb3IgY2hlY2sgaWYgZmxpcCBhcmVhIGlzIGJldHRlclxuICAgICAgZnVuY3Rpb24gZ2V0SW50ZXJzZWN0aW9uVmlzaWJsZUFyZWEob2Zmc2V0WCwgb2Zmc2V0WSkge1xuICAgICAgICB2YXIgYXJlYSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogdmlzaWJsZUFyZWE7XG4gICAgICAgIHZhciBsID0gcG9wdXBSZWN0LnggKyBvZmZzZXRYO1xuICAgICAgICB2YXIgdCA9IHBvcHVwUmVjdC55ICsgb2Zmc2V0WTtcbiAgICAgICAgdmFyIHIgPSBsICsgcG9wdXBXaWR0aDtcbiAgICAgICAgdmFyIGIgPSB0ICsgcG9wdXBIZWlnaHQ7XG4gICAgICAgIHZhciB2aXNpYmxlTCA9IE1hdGgubWF4KGwsIGFyZWEubGVmdCk7XG4gICAgICAgIHZhciB2aXNpYmxlVCA9IE1hdGgubWF4KHQsIGFyZWEudG9wKTtcbiAgICAgICAgdmFyIHZpc2libGVSID0gTWF0aC5taW4ociwgYXJlYS5yaWdodCk7XG4gICAgICAgIHZhciB2aXNpYmxlQiA9IE1hdGgubWluKGIsIGFyZWEuYm90dG9tKTtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsICh2aXNpYmxlUiAtIHZpc2libGVMKSAqICh2aXNpYmxlQiAtIHZpc2libGVUKSk7XG4gICAgICB9XG4gICAgICB2YXIgb3JpZ2luSW50ZXJzZWN0aW9uVmlzaWJsZUFyZWEgPSBnZXRJbnRlcnNlY3Rpb25WaXNpYmxlQXJlYShuZXh0T2Zmc2V0WCwgbmV4dE9mZnNldFkpO1xuXG4gICAgICAvLyBBcyBgdmlzaWJsZUZpcnN0YCwgd2UgcHJlcGFyZSB0aGlzIGZvciBjaGVja1xuICAgICAgdmFyIG9yaWdpbkludGVyc2VjdGlvblJlY29tbWVuZEFyZWEgPSBnZXRJbnRlcnNlY3Rpb25WaXNpYmxlQXJlYShuZXh0T2Zmc2V0WCwgbmV4dE9mZnNldFksIHZpc2libGVSZWdpb25BcmVhKTtcblxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gT3ZlcmZsb3cgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICB2YXIgdGFyZ2V0QWxpZ25Qb2ludFRMID0gZ2V0QWxpZ25Qb2ludCh0YXJnZXRSZWN0LCBbJ3QnLCAnbCddKTtcbiAgICAgIHZhciBwb3B1cEFsaWduUG9pbnRUTCA9IGdldEFsaWduUG9pbnQocG9wdXBSZWN0LCBbJ3QnLCAnbCddKTtcbiAgICAgIHZhciB0YXJnZXRBbGlnblBvaW50QlIgPSBnZXRBbGlnblBvaW50KHRhcmdldFJlY3QsIFsnYicsICdyJ10pO1xuICAgICAgdmFyIHBvcHVwQWxpZ25Qb2ludEJSID0gZ2V0QWxpZ25Qb2ludChwb3B1cFJlY3QsIFsnYicsICdyJ10pO1xuICAgICAgdmFyIG92ZXJmbG93ID0gcGxhY2VtZW50SW5mby5vdmVyZmxvdyB8fCB7fTtcbiAgICAgIHZhciBhZGp1c3RYID0gb3ZlcmZsb3cuYWRqdXN0WCxcbiAgICAgICAgYWRqdXN0WSA9IG92ZXJmbG93LmFkanVzdFksXG4gICAgICAgIHNoaWZ0WCA9IG92ZXJmbG93LnNoaWZ0WCxcbiAgICAgICAgc2hpZnRZID0gb3ZlcmZsb3cuc2hpZnRZO1xuICAgICAgdmFyIHN1cHBvcnRBZGp1c3QgPSBmdW5jdGlvbiBzdXBwb3J0QWRqdXN0KHZhbCkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsID49IDA7XG4gICAgICB9O1xuXG4gICAgICAvLyBQcmVwYXJlIHBvc2l0aW9uXG4gICAgICB2YXIgbmV4dFBvcHVwWTtcbiAgICAgIHZhciBuZXh0UG9wdXBCb3R0b207XG4gICAgICB2YXIgbmV4dFBvcHVwWDtcbiAgICAgIHZhciBuZXh0UG9wdXBSaWdodDtcbiAgICAgIGZ1bmN0aW9uIHN5bmNOZXh0UG9wdXBQb3NpdGlvbigpIHtcbiAgICAgICAgbmV4dFBvcHVwWSA9IHBvcHVwUmVjdC55ICsgbmV4dE9mZnNldFk7XG4gICAgICAgIG5leHRQb3B1cEJvdHRvbSA9IG5leHRQb3B1cFkgKyBwb3B1cEhlaWdodDtcbiAgICAgICAgbmV4dFBvcHVwWCA9IHBvcHVwUmVjdC54ICsgbmV4dE9mZnNldFg7XG4gICAgICAgIG5leHRQb3B1cFJpZ2h0ID0gbmV4dFBvcHVwWCArIHBvcHVwV2lkdGg7XG4gICAgICB9XG4gICAgICBzeW5jTmV4dFBvcHVwUG9zaXRpb24oKTtcblxuICAgICAgLy8gPj4+Pj4+Pj4+PiBUb3AgJiBCb3R0b21cbiAgICAgIHZhciBuZWVkQWRqdXN0WSA9IHN1cHBvcnRBZGp1c3QoYWRqdXN0WSk7XG4gICAgICB2YXIgc2FtZVRCID0gcG9wdXBQb2ludHNbMF0gPT09IHRhcmdldFBvaW50c1swXTtcblxuICAgICAgLy8gQm90dG9tIHRvIFRvcFxuICAgICAgaWYgKG5lZWRBZGp1c3RZICYmIHBvcHVwUG9pbnRzWzBdID09PSAndCcgJiYgKG5leHRQb3B1cEJvdHRvbSA+IGFkanVzdENoZWNrVmlzaWJsZUFyZWEuYm90dG9tIHx8IHByZXZGbGlwUmVmLmN1cnJlbnQuYnQpKSB7XG4gICAgICAgIHZhciB0bXBOZXh0T2Zmc2V0WSA9IG5leHRPZmZzZXRZO1xuICAgICAgICBpZiAoc2FtZVRCKSB7XG4gICAgICAgICAgdG1wTmV4dE9mZnNldFkgLT0gcG9wdXBIZWlnaHQgLSB0YXJnZXRIZWlnaHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdG1wTmV4dE9mZnNldFkgPSB0YXJnZXRBbGlnblBvaW50VEwueSAtIHBvcHVwQWxpZ25Qb2ludEJSLnkgLSBwb3B1cE9mZnNldFk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5ld1Zpc2libGVBcmVhID0gZ2V0SW50ZXJzZWN0aW9uVmlzaWJsZUFyZWEobmV4dE9mZnNldFgsIHRtcE5leHRPZmZzZXRZKTtcbiAgICAgICAgdmFyIG5ld1Zpc2libGVSZWNvbW1lbmRBcmVhID0gZ2V0SW50ZXJzZWN0aW9uVmlzaWJsZUFyZWEobmV4dE9mZnNldFgsIHRtcE5leHRPZmZzZXRZLCB2aXNpYmxlUmVnaW9uQXJlYSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgLy8gT2YgY291cnNlIHVzZSBsYXJnZXIgb25lXG4gICAgICAgIG5ld1Zpc2libGVBcmVhID4gb3JpZ2luSW50ZXJzZWN0aW9uVmlzaWJsZUFyZWEgfHwgbmV3VmlzaWJsZUFyZWEgPT09IG9yaWdpbkludGVyc2VjdGlvblZpc2libGVBcmVhICYmICghaXNWaXNpYmxlRmlyc3QgfHxcbiAgICAgICAgLy8gQ2hvb3NlIHJlY29tbWVuZCBvbmVcbiAgICAgICAgbmV3VmlzaWJsZVJlY29tbWVuZEFyZWEgPj0gb3JpZ2luSW50ZXJzZWN0aW9uUmVjb21tZW5kQXJlYSkpIHtcbiAgICAgICAgICBwcmV2RmxpcFJlZi5jdXJyZW50LmJ0ID0gdHJ1ZTtcbiAgICAgICAgICBuZXh0T2Zmc2V0WSA9IHRtcE5leHRPZmZzZXRZO1xuICAgICAgICAgIHBvcHVwT2Zmc2V0WSA9IC1wb3B1cE9mZnNldFk7XG4gICAgICAgICAgbmV4dEFsaWduSW5mby5wb2ludHMgPSBbcmV2ZXJzZVBvaW50cyhwb3B1cFBvaW50cywgMCksIHJldmVyc2VQb2ludHModGFyZ2V0UG9pbnRzLCAwKV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldkZsaXBSZWYuY3VycmVudC5idCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRvcCB0byBCb3R0b21cbiAgICAgIGlmIChuZWVkQWRqdXN0WSAmJiBwb3B1cFBvaW50c1swXSA9PT0gJ2InICYmIChuZXh0UG9wdXBZIDwgYWRqdXN0Q2hlY2tWaXNpYmxlQXJlYS50b3AgfHwgcHJldkZsaXBSZWYuY3VycmVudC50YikpIHtcbiAgICAgICAgdmFyIF90bXBOZXh0T2Zmc2V0WSA9IG5leHRPZmZzZXRZO1xuICAgICAgICBpZiAoc2FtZVRCKSB7XG4gICAgICAgICAgX3RtcE5leHRPZmZzZXRZICs9IHBvcHVwSGVpZ2h0IC0gdGFyZ2V0SGVpZ2h0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF90bXBOZXh0T2Zmc2V0WSA9IHRhcmdldEFsaWduUG9pbnRCUi55IC0gcG9wdXBBbGlnblBvaW50VEwueSAtIHBvcHVwT2Zmc2V0WTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgX25ld1Zpc2libGVBcmVhID0gZ2V0SW50ZXJzZWN0aW9uVmlzaWJsZUFyZWEobmV4dE9mZnNldFgsIF90bXBOZXh0T2Zmc2V0WSk7XG4gICAgICAgIHZhciBfbmV3VmlzaWJsZVJlY29tbWVuZEFyZWEgPSBnZXRJbnRlcnNlY3Rpb25WaXNpYmxlQXJlYShuZXh0T2Zmc2V0WCwgX3RtcE5leHRPZmZzZXRZLCB2aXNpYmxlUmVnaW9uQXJlYSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgLy8gT2YgY291cnNlIHVzZSBsYXJnZXIgb25lXG4gICAgICAgIF9uZXdWaXNpYmxlQXJlYSA+IG9yaWdpbkludGVyc2VjdGlvblZpc2libGVBcmVhIHx8IF9uZXdWaXNpYmxlQXJlYSA9PT0gb3JpZ2luSW50ZXJzZWN0aW9uVmlzaWJsZUFyZWEgJiYgKCFpc1Zpc2libGVGaXJzdCB8fFxuICAgICAgICAvLyBDaG9vc2UgcmVjb21tZW5kIG9uZVxuICAgICAgICBfbmV3VmlzaWJsZVJlY29tbWVuZEFyZWEgPj0gb3JpZ2luSW50ZXJzZWN0aW9uUmVjb21tZW5kQXJlYSkpIHtcbiAgICAgICAgICBwcmV2RmxpcFJlZi5jdXJyZW50LnRiID0gdHJ1ZTtcbiAgICAgICAgICBuZXh0T2Zmc2V0WSA9IF90bXBOZXh0T2Zmc2V0WTtcbiAgICAgICAgICBwb3B1cE9mZnNldFkgPSAtcG9wdXBPZmZzZXRZO1xuICAgICAgICAgIG5leHRBbGlnbkluZm8ucG9pbnRzID0gW3JldmVyc2VQb2ludHMocG9wdXBQb2ludHMsIDApLCByZXZlcnNlUG9pbnRzKHRhcmdldFBvaW50cywgMCldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByZXZGbGlwUmVmLmN1cnJlbnQudGIgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyA+Pj4+Pj4+Pj4+IExlZnQgJiBSaWdodFxuICAgICAgdmFyIG5lZWRBZGp1c3RYID0gc3VwcG9ydEFkanVzdChhZGp1c3RYKTtcblxuICAgICAgLy8gPj4+Pj4gRmxpcFxuICAgICAgdmFyIHNhbWVMUiA9IHBvcHVwUG9pbnRzWzFdID09PSB0YXJnZXRQb2ludHNbMV07XG5cbiAgICAgIC8vIFJpZ2h0IHRvIExlZnRcbiAgICAgIGlmIChuZWVkQWRqdXN0WCAmJiBwb3B1cFBvaW50c1sxXSA9PT0gJ2wnICYmIChuZXh0UG9wdXBSaWdodCA+IGFkanVzdENoZWNrVmlzaWJsZUFyZWEucmlnaHQgfHwgcHJldkZsaXBSZWYuY3VycmVudC5ybCkpIHtcbiAgICAgICAgdmFyIHRtcE5leHRPZmZzZXRYID0gbmV4dE9mZnNldFg7XG4gICAgICAgIGlmIChzYW1lTFIpIHtcbiAgICAgICAgICB0bXBOZXh0T2Zmc2V0WCAtPSBwb3B1cFdpZHRoIC0gdGFyZ2V0V2lkdGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdG1wTmV4dE9mZnNldFggPSB0YXJnZXRBbGlnblBvaW50VEwueCAtIHBvcHVwQWxpZ25Qb2ludEJSLnggLSBwb3B1cE9mZnNldFg7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIF9uZXdWaXNpYmxlQXJlYTIgPSBnZXRJbnRlcnNlY3Rpb25WaXNpYmxlQXJlYSh0bXBOZXh0T2Zmc2V0WCwgbmV4dE9mZnNldFkpO1xuICAgICAgICB2YXIgX25ld1Zpc2libGVSZWNvbW1lbmRBcmVhMiA9IGdldEludGVyc2VjdGlvblZpc2libGVBcmVhKHRtcE5leHRPZmZzZXRYLCBuZXh0T2Zmc2V0WSwgdmlzaWJsZVJlZ2lvbkFyZWEpO1xuICAgICAgICBpZiAoXG4gICAgICAgIC8vIE9mIGNvdXJzZSB1c2UgbGFyZ2VyIG9uZVxuICAgICAgICBfbmV3VmlzaWJsZUFyZWEyID4gb3JpZ2luSW50ZXJzZWN0aW9uVmlzaWJsZUFyZWEgfHwgX25ld1Zpc2libGVBcmVhMiA9PT0gb3JpZ2luSW50ZXJzZWN0aW9uVmlzaWJsZUFyZWEgJiYgKCFpc1Zpc2libGVGaXJzdCB8fFxuICAgICAgICAvLyBDaG9vc2UgcmVjb21tZW5kIG9uZVxuICAgICAgICBfbmV3VmlzaWJsZVJlY29tbWVuZEFyZWEyID49IG9yaWdpbkludGVyc2VjdGlvblJlY29tbWVuZEFyZWEpKSB7XG4gICAgICAgICAgcHJldkZsaXBSZWYuY3VycmVudC5ybCA9IHRydWU7XG4gICAgICAgICAgbmV4dE9mZnNldFggPSB0bXBOZXh0T2Zmc2V0WDtcbiAgICAgICAgICBwb3B1cE9mZnNldFggPSAtcG9wdXBPZmZzZXRYO1xuICAgICAgICAgIG5leHRBbGlnbkluZm8ucG9pbnRzID0gW3JldmVyc2VQb2ludHMocG9wdXBQb2ludHMsIDEpLCByZXZlcnNlUG9pbnRzKHRhcmdldFBvaW50cywgMSldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByZXZGbGlwUmVmLmN1cnJlbnQucmwgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBMZWZ0IHRvIFJpZ2h0XG4gICAgICBpZiAobmVlZEFkanVzdFggJiYgcG9wdXBQb2ludHNbMV0gPT09ICdyJyAmJiAobmV4dFBvcHVwWCA8IGFkanVzdENoZWNrVmlzaWJsZUFyZWEubGVmdCB8fCBwcmV2RmxpcFJlZi5jdXJyZW50LmxyKSkge1xuICAgICAgICB2YXIgX3RtcE5leHRPZmZzZXRYID0gbmV4dE9mZnNldFg7XG4gICAgICAgIGlmIChzYW1lTFIpIHtcbiAgICAgICAgICBfdG1wTmV4dE9mZnNldFggKz0gcG9wdXBXaWR0aCAtIHRhcmdldFdpZHRoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF90bXBOZXh0T2Zmc2V0WCA9IHRhcmdldEFsaWduUG9pbnRCUi54IC0gcG9wdXBBbGlnblBvaW50VEwueCAtIHBvcHVwT2Zmc2V0WDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgX25ld1Zpc2libGVBcmVhMyA9IGdldEludGVyc2VjdGlvblZpc2libGVBcmVhKF90bXBOZXh0T2Zmc2V0WCwgbmV4dE9mZnNldFkpO1xuICAgICAgICB2YXIgX25ld1Zpc2libGVSZWNvbW1lbmRBcmVhMyA9IGdldEludGVyc2VjdGlvblZpc2libGVBcmVhKF90bXBOZXh0T2Zmc2V0WCwgbmV4dE9mZnNldFksIHZpc2libGVSZWdpb25BcmVhKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAvLyBPZiBjb3Vyc2UgdXNlIGxhcmdlciBvbmVcbiAgICAgICAgX25ld1Zpc2libGVBcmVhMyA+IG9yaWdpbkludGVyc2VjdGlvblZpc2libGVBcmVhIHx8IF9uZXdWaXNpYmxlQXJlYTMgPT09IG9yaWdpbkludGVyc2VjdGlvblZpc2libGVBcmVhICYmICghaXNWaXNpYmxlRmlyc3QgfHxcbiAgICAgICAgLy8gQ2hvb3NlIHJlY29tbWVuZCBvbmVcbiAgICAgICAgX25ld1Zpc2libGVSZWNvbW1lbmRBcmVhMyA+PSBvcmlnaW5JbnRlcnNlY3Rpb25SZWNvbW1lbmRBcmVhKSkge1xuICAgICAgICAgIHByZXZGbGlwUmVmLmN1cnJlbnQubHIgPSB0cnVlO1xuICAgICAgICAgIG5leHRPZmZzZXRYID0gX3RtcE5leHRPZmZzZXRYO1xuICAgICAgICAgIHBvcHVwT2Zmc2V0WCA9IC1wb3B1cE9mZnNldFg7XG4gICAgICAgICAgbmV4dEFsaWduSW5mby5wb2ludHMgPSBbcmV2ZXJzZVBvaW50cyhwb3B1cFBvaW50cywgMSksIHJldmVyc2VQb2ludHModGFyZ2V0UG9pbnRzLCAxKV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldkZsaXBSZWYuY3VycmVudC5sciA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU2hpZnQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgc3luY05leHRQb3B1cFBvc2l0aW9uKCk7XG4gICAgICB2YXIgbnVtU2hpZnRYID0gc2hpZnRYID09PSB0cnVlID8gMCA6IHNoaWZ0WDtcbiAgICAgIGlmICh0eXBlb2YgbnVtU2hpZnRYID09PSAnbnVtYmVyJykge1xuICAgICAgICAvLyBMZWZ0XG4gICAgICAgIGlmIChuZXh0UG9wdXBYIDwgdmlzaWJsZVJlZ2lvbkFyZWEubGVmdCkge1xuICAgICAgICAgIG5leHRPZmZzZXRYIC09IG5leHRQb3B1cFggLSB2aXNpYmxlUmVnaW9uQXJlYS5sZWZ0IC0gcG9wdXBPZmZzZXRYO1xuICAgICAgICAgIGlmICh0YXJnZXRSZWN0LnggKyB0YXJnZXRXaWR0aCA8IHZpc2libGVSZWdpb25BcmVhLmxlZnQgKyBudW1TaGlmdFgpIHtcbiAgICAgICAgICAgIG5leHRPZmZzZXRYICs9IHRhcmdldFJlY3QueCAtIHZpc2libGVSZWdpb25BcmVhLmxlZnQgKyB0YXJnZXRXaWR0aCAtIG51bVNoaWZ0WDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSaWdodFxuICAgICAgICBpZiAobmV4dFBvcHVwUmlnaHQgPiB2aXNpYmxlUmVnaW9uQXJlYS5yaWdodCkge1xuICAgICAgICAgIG5leHRPZmZzZXRYIC09IG5leHRQb3B1cFJpZ2h0IC0gdmlzaWJsZVJlZ2lvbkFyZWEucmlnaHQgLSBwb3B1cE9mZnNldFg7XG4gICAgICAgICAgaWYgKHRhcmdldFJlY3QueCA+IHZpc2libGVSZWdpb25BcmVhLnJpZ2h0IC0gbnVtU2hpZnRYKSB7XG4gICAgICAgICAgICBuZXh0T2Zmc2V0WCArPSB0YXJnZXRSZWN0LnggLSB2aXNpYmxlUmVnaW9uQXJlYS5yaWdodCArIG51bVNoaWZ0WDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBudW1TaGlmdFkgPSBzaGlmdFkgPT09IHRydWUgPyAwIDogc2hpZnRZO1xuICAgICAgaWYgKHR5cGVvZiBudW1TaGlmdFkgPT09ICdudW1iZXInKSB7XG4gICAgICAgIC8vIFRvcFxuICAgICAgICBpZiAobmV4dFBvcHVwWSA8IHZpc2libGVSZWdpb25BcmVhLnRvcCkge1xuICAgICAgICAgIG5leHRPZmZzZXRZIC09IG5leHRQb3B1cFkgLSB2aXNpYmxlUmVnaW9uQXJlYS50b3AgLSBwb3B1cE9mZnNldFk7XG5cbiAgICAgICAgICAvLyBXaGVuIHRhcmdldCBpZiBmYXIgYXdheSBmcm9tIHZpc2libGUgYXJlYVxuICAgICAgICAgIC8vIFN0b3Agc2hpZnRcbiAgICAgICAgICBpZiAodGFyZ2V0UmVjdC55ICsgdGFyZ2V0SGVpZ2h0IDwgdmlzaWJsZVJlZ2lvbkFyZWEudG9wICsgbnVtU2hpZnRZKSB7XG4gICAgICAgICAgICBuZXh0T2Zmc2V0WSArPSB0YXJnZXRSZWN0LnkgLSB2aXNpYmxlUmVnaW9uQXJlYS50b3AgKyB0YXJnZXRIZWlnaHQgLSBudW1TaGlmdFk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQm90dG9tXG4gICAgICAgIGlmIChuZXh0UG9wdXBCb3R0b20gPiB2aXNpYmxlUmVnaW9uQXJlYS5ib3R0b20pIHtcbiAgICAgICAgICBuZXh0T2Zmc2V0WSAtPSBuZXh0UG9wdXBCb3R0b20gLSB2aXNpYmxlUmVnaW9uQXJlYS5ib3R0b20gLSBwb3B1cE9mZnNldFk7XG4gICAgICAgICAgaWYgKHRhcmdldFJlY3QueSA+IHZpc2libGVSZWdpb25BcmVhLmJvdHRvbSAtIG51bVNoaWZ0WSkge1xuICAgICAgICAgICAgbmV4dE9mZnNldFkgKz0gdGFyZ2V0UmVjdC55IC0gdmlzaWJsZVJlZ2lvbkFyZWEuYm90dG9tICsgbnVtU2hpZnRZO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IEFycm93ID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIC8vIEFycm93IGNlbnRlciBhbGlnblxuICAgICAgdmFyIHBvcHVwTGVmdCA9IHBvcHVwUmVjdC54ICsgbmV4dE9mZnNldFg7XG4gICAgICB2YXIgcG9wdXBSaWdodCA9IHBvcHVwTGVmdCArIHBvcHVwV2lkdGg7XG4gICAgICB2YXIgcG9wdXBUb3AgPSBwb3B1cFJlY3QueSArIG5leHRPZmZzZXRZO1xuICAgICAgdmFyIHBvcHVwQm90dG9tID0gcG9wdXBUb3AgKyBwb3B1cEhlaWdodDtcbiAgICAgIHZhciB0YXJnZXRMZWZ0ID0gdGFyZ2V0UmVjdC54O1xuICAgICAgdmFyIHRhcmdldFJpZ2h0ID0gdGFyZ2V0TGVmdCArIHRhcmdldFdpZHRoO1xuICAgICAgdmFyIHRhcmdldFRvcCA9IHRhcmdldFJlY3QueTtcbiAgICAgIHZhciB0YXJnZXRCb3R0b20gPSB0YXJnZXRUb3AgKyB0YXJnZXRIZWlnaHQ7XG4gICAgICB2YXIgbWF4TGVmdCA9IE1hdGgubWF4KHBvcHVwTGVmdCwgdGFyZ2V0TGVmdCk7XG4gICAgICB2YXIgbWluUmlnaHQgPSBNYXRoLm1pbihwb3B1cFJpZ2h0LCB0YXJnZXRSaWdodCk7XG4gICAgICB2YXIgeENlbnRlciA9IChtYXhMZWZ0ICsgbWluUmlnaHQpIC8gMjtcbiAgICAgIHZhciBuZXh0QXJyb3dYID0geENlbnRlciAtIHBvcHVwTGVmdDtcbiAgICAgIHZhciBtYXhUb3AgPSBNYXRoLm1heChwb3B1cFRvcCwgdGFyZ2V0VG9wKTtcbiAgICAgIHZhciBtaW5Cb3R0b20gPSBNYXRoLm1pbihwb3B1cEJvdHRvbSwgdGFyZ2V0Qm90dG9tKTtcbiAgICAgIHZhciB5Q2VudGVyID0gKG1heFRvcCArIG1pbkJvdHRvbSkgLyAyO1xuICAgICAgdmFyIG5leHRBcnJvd1kgPSB5Q2VudGVyIC0gcG9wdXBUb3A7XG4gICAgICBvblBvcHVwQWxpZ24gPT09IG51bGwgfHwgb25Qb3B1cEFsaWduID09PSB2b2lkIDAgfHwgb25Qb3B1cEFsaWduKHBvcHVwRWxlLCBuZXh0QWxpZ25JbmZvKTtcblxuICAgICAgLy8gQWRkaXRpb25hbCBjYWxjdWxhdGUgcmlnaHQgJiBib3R0b20gcG9zaXRpb25cbiAgICAgIHZhciBvZmZzZXRYNFJpZ2h0ID0gcG9wdXBNaXJyb3JSZWN0LnJpZ2h0IC0gcG9wdXBSZWN0LnggLSAobmV4dE9mZnNldFggKyBwb3B1cFJlY3Qud2lkdGgpO1xuICAgICAgdmFyIG9mZnNldFk0Qm90dG9tID0gcG9wdXBNaXJyb3JSZWN0LmJvdHRvbSAtIHBvcHVwUmVjdC55IC0gKG5leHRPZmZzZXRZICsgcG9wdXBSZWN0LmhlaWdodCk7XG4gICAgICBpZiAoX3NjYWxlWCA9PT0gMSkge1xuICAgICAgICBuZXh0T2Zmc2V0WCA9IE1hdGgucm91bmQobmV4dE9mZnNldFgpO1xuICAgICAgICBvZmZzZXRYNFJpZ2h0ID0gTWF0aC5yb3VuZChvZmZzZXRYNFJpZ2h0KTtcbiAgICAgIH1cbiAgICAgIGlmIChfc2NhbGVZID09PSAxKSB7XG4gICAgICAgIG5leHRPZmZzZXRZID0gTWF0aC5yb3VuZChuZXh0T2Zmc2V0WSk7XG4gICAgICAgIG9mZnNldFk0Qm90dG9tID0gTWF0aC5yb3VuZChvZmZzZXRZNEJvdHRvbSk7XG4gICAgICB9XG4gICAgICB2YXIgbmV4dE9mZnNldEluZm8gPSB7XG4gICAgICAgIHJlYWR5OiB0cnVlLFxuICAgICAgICBvZmZzZXRYOiBuZXh0T2Zmc2V0WCAvIF9zY2FsZVgsXG4gICAgICAgIG9mZnNldFk6IG5leHRPZmZzZXRZIC8gX3NjYWxlWSxcbiAgICAgICAgb2Zmc2V0Ujogb2Zmc2V0WDRSaWdodCAvIF9zY2FsZVgsXG4gICAgICAgIG9mZnNldEI6IG9mZnNldFk0Qm90dG9tIC8gX3NjYWxlWSxcbiAgICAgICAgYXJyb3dYOiBuZXh0QXJyb3dYIC8gX3NjYWxlWCxcbiAgICAgICAgYXJyb3dZOiBuZXh0QXJyb3dZIC8gX3NjYWxlWSxcbiAgICAgICAgc2NhbGVYOiBfc2NhbGVYLFxuICAgICAgICBzY2FsZVk6IF9zY2FsZVksXG4gICAgICAgIGFsaWduOiBuZXh0QWxpZ25JbmZvXG4gICAgICB9O1xuICAgICAgc2V0T2Zmc2V0SW5mbyhuZXh0T2Zmc2V0SW5mbyk7XG4gICAgfVxuICB9KTtcbiAgdmFyIHRyaWdnZXJBbGlnbiA9IGZ1bmN0aW9uIHRyaWdnZXJBbGlnbigpIHtcbiAgICBhbGlnbkNvdW50UmVmLmN1cnJlbnQgKz0gMTtcbiAgICB2YXIgaWQgPSBhbGlnbkNvdW50UmVmLmN1cnJlbnQ7XG5cbiAgICAvLyBNZXJnZSBhbGwgYWxpZ24gcmVxdWlyZW1lbnQgaW50byBvbmUgZnJhbWVcbiAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChhbGlnbkNvdW50UmVmLmN1cnJlbnQgPT09IGlkKSB7XG4gICAgICAgIG9uQWxpZ24oKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICAvLyBSZXNldCByZWFkeSBzdGF0dXMgd2hlbiBwbGFjZW1lbnQgJiBvcGVuIGNoYW5nZWRcbiAgdmFyIHJlc2V0UmVhZHkgPSBmdW5jdGlvbiByZXNldFJlYWR5KCkge1xuICAgIHNldE9mZnNldEluZm8oZnVuY3Rpb24gKG9yaSkge1xuICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgb3JpKSwge30sIHtcbiAgICAgICAgcmVhZHk6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcbiAgdXNlTGF5b3V0RWZmZWN0KHJlc2V0UmVhZHksIFtwbGFjZW1lbnRdKTtcbiAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIW9wZW4pIHtcbiAgICAgIHJlc2V0UmVhZHkoKTtcbiAgICB9XG4gIH0sIFtvcGVuXSk7XG4gIHJldHVybiBbb2Zmc2V0SW5mby5yZWFkeSwgb2Zmc2V0SW5mby5vZmZzZXRYLCBvZmZzZXRJbmZvLm9mZnNldFksIG9mZnNldEluZm8ub2Zmc2V0Uiwgb2Zmc2V0SW5mby5vZmZzZXRCLCBvZmZzZXRJbmZvLmFycm93WCwgb2Zmc2V0SW5mby5hcnJvd1ksIG9mZnNldEluZm8uc2NhbGVYLCBvZmZzZXRJbmZvLnNjYWxlWSwgb2Zmc2V0SW5mby5hbGlnbiwgdHJpZ2dlckFsaWduXTtcbn0iLCAiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmZ1bmN0aW9uIGlzUG9pbnRzRXEoKSB7XG4gIHZhciBhMSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogW107XG4gIHZhciBhMiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogW107XG4gIHZhciBpc0FsaWduUG9pbnQgPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZDtcbiAgaWYgKGlzQWxpZ25Qb2ludCkge1xuICAgIHJldHVybiBhMVswXSA9PT0gYTJbMF07XG4gIH1cbiAgcmV0dXJuIGExWzBdID09PSBhMlswXSAmJiBhMVsxXSA9PT0gYTJbMV07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxpZ25Qb3B1cENsYXNzTmFtZShidWlsdGluUGxhY2VtZW50cywgcHJlZml4Q2xzLCBhbGlnbiwgaXNBbGlnblBvaW50KSB7XG4gIHZhciBwb2ludHMgPSBhbGlnbi5wb2ludHM7XG4gIHZhciBwbGFjZW1lbnRzID0gT2JqZWN0LmtleXMoYnVpbHRpblBsYWNlbWVudHMpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBsYWNlbWVudHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICB2YXIgX2J1aWx0aW5QbGFjZW1lbnRzJHBsO1xuICAgIHZhciBwbGFjZW1lbnQgPSBwbGFjZW1lbnRzW2ldO1xuICAgIGlmIChpc1BvaW50c0VxKChfYnVpbHRpblBsYWNlbWVudHMkcGwgPSBidWlsdGluUGxhY2VtZW50c1twbGFjZW1lbnRdKSA9PT0gbnVsbCB8fCBfYnVpbHRpblBsYWNlbWVudHMkcGwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9idWlsdGluUGxhY2VtZW50cyRwbC5wb2ludHMsIHBvaW50cywgaXNBbGlnblBvaW50KSkge1xuICAgICAgcmV0dXJuIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcGxhY2VtZW50LVwiKS5jb25jYXQocGxhY2VtZW50KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG4vKiogQGRlcHJlY2F0ZWQgV2Ugc2hvdWxkIG5vdCB1c2UgdGhpcyBpZiB3ZSBjYW4gcmVmYWN0b3IgYWxsIGRlcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb3Rpb24ocHJlZml4Q2xzLCBtb3Rpb24sIGFuaW1hdGlvbiwgdHJhbnNpdGlvbk5hbWUpIHtcbiAgaWYgKG1vdGlvbikge1xuICAgIHJldHVybiBtb3Rpb247XG4gIH1cbiAgaWYgKGFuaW1hdGlvbikge1xuICAgIHJldHVybiB7XG4gICAgICBtb3Rpb25OYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQoYW5pbWF0aW9uKVxuICAgIH07XG4gIH1cbiAgaWYgKHRyYW5zaXRpb25OYW1lKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1vdGlvbk5hbWU6IHRyYW5zaXRpb25OYW1lXG4gICAgfTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRXaW4oZWxlKSB7XG4gIHJldHVybiBlbGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldztcbn1cblxuLyoqXG4gKiBHZXQgYWxsIHRoZSBzY3JvbGxhYmxlIHBhcmVudCBlbGVtZW50cyBvZiB0aGUgZWxlbWVudFxuICogQHBhcmFtIGVsZSAgICAgICBUaGUgZWxlbWVudCB0byBiZSBkZXRlY3RlZFxuICogQHBhcmFtIGFyZWFPbmx5ICBPbmx5IHJldHVybiB0aGUgcGFyZW50IHdoaWNoIHdpbGwgY3V0IHZpc2libGUgYXJlYVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdFNjcm9sbGVyKGVsZSkge1xuICB2YXIgc2Nyb2xsZXJMaXN0ID0gW107XG4gIHZhciBjdXJyZW50ID0gZWxlID09PSBudWxsIHx8IGVsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWxlLnBhcmVudEVsZW1lbnQ7XG4gIHZhciBzY3JvbGxTdHlsZSA9IFsnaGlkZGVuJywgJ3Njcm9sbCcsICdjbGlwJywgJ2F1dG8nXTtcbiAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICB2YXIgX2dldFdpbiRnZXRDb21wdXRlZFN0ID0gZ2V0V2luKGN1cnJlbnQpLmdldENvbXB1dGVkU3R5bGUoY3VycmVudCksXG4gICAgICBvdmVyZmxvd1ggPSBfZ2V0V2luJGdldENvbXB1dGVkU3Qub3ZlcmZsb3dYLFxuICAgICAgb3ZlcmZsb3dZID0gX2dldFdpbiRnZXRDb21wdXRlZFN0Lm92ZXJmbG93WSxcbiAgICAgIG92ZXJmbG93ID0gX2dldFdpbiRnZXRDb21wdXRlZFN0Lm92ZXJmbG93O1xuICAgIGlmIChbb3ZlcmZsb3dYLCBvdmVyZmxvd1ksIG92ZXJmbG93XS5zb21lKGZ1bmN0aW9uIChvKSB7XG4gICAgICByZXR1cm4gc2Nyb2xsU3R5bGUuaW5jbHVkZXMobyk7XG4gICAgfSkpIHtcbiAgICAgIHNjcm9sbGVyTGlzdC5wdXNoKGN1cnJlbnQpO1xuICAgIH1cbiAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnRFbGVtZW50O1xuICB9XG4gIHJldHVybiBzY3JvbGxlckxpc3Q7XG59XG5leHBvcnQgZnVuY3Rpb24gdG9OdW0obnVtKSB7XG4gIHZhciBkZWZhdWx0VmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDE7XG4gIHJldHVybiBOdW1iZXIuaXNOYU4obnVtKSA/IGRlZmF1bHRWYWx1ZSA6IG51bTtcbn1cbmZ1bmN0aW9uIGdldFB4VmFsdWUodmFsKSB7XG4gIHJldHVybiB0b051bShwYXJzZUZsb2F0KHZhbCksIDApO1xufVxuLyoqXG4gKlxuICpcbiAqICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogICogICAgICAgICAgICAgIEJvcmRlciAgICAgICAgICAgICAgICAqXG4gKiAgKiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICpcbiAqICAqICAgICAqICAgICAgICAgICAgICAgICAgKiAgICAgKiAgICAgKlxuICogICogIEIgICogICAgICAgICAgICAgICAgICAqICBTICAqICBCICAqXG4gKiAgKiAgbyAgKiAgICAgICAgICAgICAgICAgICogIGMgICogIG8gICpcbiAqICAqICByICAqICAgICAgQ29udGVudCAgICAgKiAgciAgKiAgciAgKlxuICogICogIGQgICogICAgICAgICAgICAgICAgICAqICBvICAqICBkICAqXG4gKiAgKiAgZSAgKiAgICAgICAgICAgICAgICAgICogIGwgICogIGUgICpcbiAqICAqICByICAqKioqKioqKioqKioqKioqKioqKiAgbCAgKiAgciAgKlxuICogICogICAgICogICAgICAgIFNjcm9sbCAgICAgICAgICAqICAgICAqXG4gKiAgKiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICpcbiAqICAqICAgICAgICAgICAgICBCb3JkZXIgICAgICAgICAgICAgICAgKlxuICogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKlxuICovXG4vKipcbiAqIEdldCB2aXNpYmxlIGFyZWEgb2YgZWxlbWVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmlzaWJsZUFyZWEoaW5pdEFyZWEsIHNjcm9sbGVyTGlzdCkge1xuICB2YXIgdmlzaWJsZUFyZWEgPSBfb2JqZWN0U3ByZWFkKHt9LCBpbml0QXJlYSk7XG4gIChzY3JvbGxlckxpc3QgfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgIGlmIChlbGUgaW5zdGFuY2VvZiBIVE1MQm9keUVsZW1lbnQgfHwgZWxlIGluc3RhbmNlb2YgSFRNTEh0bWxFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2tpcCBpZiBzdGF0aWMgcG9zaXRpb24gd2hpY2ggd2lsbCBub3QgYWZmZWN0IHZpc2libGUgYXJlYVxuICAgIHZhciBfZ2V0V2luJGdldENvbXB1dGVkU3QyID0gZ2V0V2luKGVsZSkuZ2V0Q29tcHV0ZWRTdHlsZShlbGUpLFxuICAgICAgb3ZlcmZsb3cgPSBfZ2V0V2luJGdldENvbXB1dGVkU3QyLm92ZXJmbG93LFxuICAgICAgb3ZlcmZsb3dDbGlwTWFyZ2luID0gX2dldFdpbiRnZXRDb21wdXRlZFN0Mi5vdmVyZmxvd0NsaXBNYXJnaW4sXG4gICAgICBib3JkZXJUb3BXaWR0aCA9IF9nZXRXaW4kZ2V0Q29tcHV0ZWRTdDIuYm9yZGVyVG9wV2lkdGgsXG4gICAgICBib3JkZXJCb3R0b21XaWR0aCA9IF9nZXRXaW4kZ2V0Q29tcHV0ZWRTdDIuYm9yZGVyQm90dG9tV2lkdGgsXG4gICAgICBib3JkZXJMZWZ0V2lkdGggPSBfZ2V0V2luJGdldENvbXB1dGVkU3QyLmJvcmRlckxlZnRXaWR0aCxcbiAgICAgIGJvcmRlclJpZ2h0V2lkdGggPSBfZ2V0V2luJGdldENvbXB1dGVkU3QyLmJvcmRlclJpZ2h0V2lkdGg7XG4gICAgdmFyIGVsZVJlY3QgPSBlbGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdmFyIGVsZU91dEhlaWdodCA9IGVsZS5vZmZzZXRIZWlnaHQsXG4gICAgICBlbGVJbm5lckhlaWdodCA9IGVsZS5jbGllbnRIZWlnaHQsXG4gICAgICBlbGVPdXRXaWR0aCA9IGVsZS5vZmZzZXRXaWR0aCxcbiAgICAgIGVsZUlubmVyV2lkdGggPSBlbGUuY2xpZW50V2lkdGg7XG4gICAgdmFyIGJvcmRlclRvcE51bSA9IGdldFB4VmFsdWUoYm9yZGVyVG9wV2lkdGgpO1xuICAgIHZhciBib3JkZXJCb3R0b21OdW0gPSBnZXRQeFZhbHVlKGJvcmRlckJvdHRvbVdpZHRoKTtcbiAgICB2YXIgYm9yZGVyTGVmdE51bSA9IGdldFB4VmFsdWUoYm9yZGVyTGVmdFdpZHRoKTtcbiAgICB2YXIgYm9yZGVyUmlnaHROdW0gPSBnZXRQeFZhbHVlKGJvcmRlclJpZ2h0V2lkdGgpO1xuICAgIHZhciBzY2FsZVggPSB0b051bShNYXRoLnJvdW5kKGVsZVJlY3Qud2lkdGggLyBlbGVPdXRXaWR0aCAqIDEwMDApIC8gMTAwMCk7XG4gICAgdmFyIHNjYWxlWSA9IHRvTnVtKE1hdGgucm91bmQoZWxlUmVjdC5oZWlnaHQgLyBlbGVPdXRIZWlnaHQgKiAxMDAwKSAvIDEwMDApO1xuXG4gICAgLy8gT3JpZ2luYWwgdmlzaWJsZSBhcmVhXG4gICAgdmFyIGVsZVNjcm9sbFdpZHRoID0gKGVsZU91dFdpZHRoIC0gZWxlSW5uZXJXaWR0aCAtIGJvcmRlckxlZnROdW0gLSBib3JkZXJSaWdodE51bSkgKiBzY2FsZVg7XG4gICAgdmFyIGVsZVNjcm9sbEhlaWdodCA9IChlbGVPdXRIZWlnaHQgLSBlbGVJbm5lckhlaWdodCAtIGJvcmRlclRvcE51bSAtIGJvcmRlckJvdHRvbU51bSkgKiBzY2FsZVk7XG5cbiAgICAvLyBDdXQgYm9yZGVyIHNpemVcbiAgICB2YXIgc2NhbGVkQm9yZGVyVG9wV2lkdGggPSBib3JkZXJUb3BOdW0gKiBzY2FsZVk7XG4gICAgdmFyIHNjYWxlZEJvcmRlckJvdHRvbVdpZHRoID0gYm9yZGVyQm90dG9tTnVtICogc2NhbGVZO1xuICAgIHZhciBzY2FsZWRCb3JkZXJMZWZ0V2lkdGggPSBib3JkZXJMZWZ0TnVtICogc2NhbGVYO1xuICAgIHZhciBzY2FsZWRCb3JkZXJSaWdodFdpZHRoID0gYm9yZGVyUmlnaHROdW0gKiBzY2FsZVg7XG5cbiAgICAvLyBDbGlwIG1hcmdpblxuICAgIHZhciBjbGlwTWFyZ2luV2lkdGggPSAwO1xuICAgIHZhciBjbGlwTWFyZ2luSGVpZ2h0ID0gMDtcbiAgICBpZiAob3ZlcmZsb3cgPT09ICdjbGlwJykge1xuICAgICAgdmFyIGNsaXBOdW0gPSBnZXRQeFZhbHVlKG92ZXJmbG93Q2xpcE1hcmdpbik7XG4gICAgICBjbGlwTWFyZ2luV2lkdGggPSBjbGlwTnVtICogc2NhbGVYO1xuICAgICAgY2xpcE1hcmdpbkhlaWdodCA9IGNsaXBOdW0gKiBzY2FsZVk7XG4gICAgfVxuXG4gICAgLy8gUmVnaW9uXG4gICAgdmFyIGVsZUxlZnQgPSBlbGVSZWN0LnggKyBzY2FsZWRCb3JkZXJMZWZ0V2lkdGggLSBjbGlwTWFyZ2luV2lkdGg7XG4gICAgdmFyIGVsZVRvcCA9IGVsZVJlY3QueSArIHNjYWxlZEJvcmRlclRvcFdpZHRoIC0gY2xpcE1hcmdpbkhlaWdodDtcbiAgICB2YXIgZWxlUmlnaHQgPSBlbGVMZWZ0ICsgZWxlUmVjdC53aWR0aCArIDIgKiBjbGlwTWFyZ2luV2lkdGggLSBzY2FsZWRCb3JkZXJMZWZ0V2lkdGggLSBzY2FsZWRCb3JkZXJSaWdodFdpZHRoIC0gZWxlU2Nyb2xsV2lkdGg7XG4gICAgdmFyIGVsZUJvdHRvbSA9IGVsZVRvcCArIGVsZVJlY3QuaGVpZ2h0ICsgMiAqIGNsaXBNYXJnaW5IZWlnaHQgLSBzY2FsZWRCb3JkZXJUb3BXaWR0aCAtIHNjYWxlZEJvcmRlckJvdHRvbVdpZHRoIC0gZWxlU2Nyb2xsSGVpZ2h0O1xuICAgIHZpc2libGVBcmVhLmxlZnQgPSBNYXRoLm1heCh2aXNpYmxlQXJlYS5sZWZ0LCBlbGVMZWZ0KTtcbiAgICB2aXNpYmxlQXJlYS50b3AgPSBNYXRoLm1heCh2aXNpYmxlQXJlYS50b3AsIGVsZVRvcCk7XG4gICAgdmlzaWJsZUFyZWEucmlnaHQgPSBNYXRoLm1pbih2aXNpYmxlQXJlYS5yaWdodCwgZWxlUmlnaHQpO1xuICAgIHZpc2libGVBcmVhLmJvdHRvbSA9IE1hdGgubWluKHZpc2libGVBcmVhLmJvdHRvbSwgZWxlQm90dG9tKTtcbiAgfSk7XG4gIHJldHVybiB2aXNpYmxlQXJlYTtcbn0iLCAiaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCB1c2VMYXlvdXRFZmZlY3QgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlTGF5b3V0RWZmZWN0XCI7XG5pbXBvcnQgeyBjb2xsZWN0U2Nyb2xsZXIsIGdldFdpbiB9IGZyb20gXCIuLi91dGlsXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VXYXRjaChvcGVuLCB0YXJnZXQsIHBvcHVwLCBvbkFsaWduLCBvblNjcm9sbCkge1xuICB1c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChvcGVuICYmIHRhcmdldCAmJiBwb3B1cCkge1xuICAgICAgdmFyIHRhcmdldEVsZW1lbnQgPSB0YXJnZXQ7XG4gICAgICB2YXIgcG9wdXBFbGVtZW50ID0gcG9wdXA7XG4gICAgICB2YXIgdGFyZ2V0U2Nyb2xsTGlzdCA9IGNvbGxlY3RTY3JvbGxlcih0YXJnZXRFbGVtZW50KTtcbiAgICAgIHZhciBwb3B1cFNjcm9sbExpc3QgPSBjb2xsZWN0U2Nyb2xsZXIocG9wdXBFbGVtZW50KTtcbiAgICAgIHZhciB3aW4gPSBnZXRXaW4ocG9wdXBFbGVtZW50KTtcbiAgICAgIHZhciBtZXJnZWRMaXN0ID0gbmV3IFNldChbd2luXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHRhcmdldFNjcm9sbExpc3QpLCBfdG9Db25zdW1hYmxlQXJyYXkocG9wdXBTY3JvbGxMaXN0KSkpO1xuICAgICAgZnVuY3Rpb24gbm90aWZ5U2Nyb2xsKCkge1xuICAgICAgICBvbkFsaWduKCk7XG4gICAgICAgIG9uU2Nyb2xsKCk7XG4gICAgICB9XG4gICAgICBtZXJnZWRMaXN0LmZvckVhY2goZnVuY3Rpb24gKHNjcm9sbGVyKSB7XG4gICAgICAgIHNjcm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIG5vdGlmeVNjcm9sbCwge1xuICAgICAgICAgIHBhc3NpdmU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHdpbi5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBub3RpZnlTY3JvbGwsIHtcbiAgICAgICAgcGFzc2l2ZTogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIC8vIEZpcnN0IHRpbWUgYWx3YXlzIGRvIGFsaWduXG4gICAgICBvbkFsaWduKCk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICBtZXJnZWRMaXN0LmZvckVhY2goZnVuY3Rpb24gKHNjcm9sbGVyKSB7XG4gICAgICAgICAgc2Nyb2xsZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgbm90aWZ5U2Nyb2xsKTtcbiAgICAgICAgICB3aW4ucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgbm90aWZ5U2Nyb2xsKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH1cbiAgfSwgW29wZW4sIHRhcmdldCwgcG9wdXBdKTtcbn0iLCAiaW1wb3J0IHsgZ2V0U2hhZG93Um9vdCB9IGZyb20gXCJyYy11dGlsL2VzL0RvbS9zaGFkb3dcIjtcbmltcG9ydCB7IHdhcm5pbmcgfSBmcm9tIFwicmMtdXRpbC9lcy93YXJuaW5nXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBnZXRXaW4gfSBmcm9tIFwiLi4vdXRpbFwiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlV2luQ2xpY2sob3BlbiwgY2xpY2tUb0hpZGUsIHRhcmdldEVsZSwgcG9wdXBFbGUsIG1hc2ssIG1hc2tDbG9zYWJsZSwgaW5Qb3B1cE9yQ2hpbGQsIHRyaWdnZXJPcGVuKSB7XG4gIHZhciBvcGVuUmVmID0gUmVhY3QudXNlUmVmKG9wZW4pO1xuICBvcGVuUmVmLmN1cnJlbnQgPSBvcGVuO1xuICB2YXIgcG9wdXBQb2ludGVyRG93blJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG5cbiAgLy8gQ2xpY2sgdG8gaGlkZSBpcyBzcGVjaWFsIGFjdGlvbiBzaW5jZSBjbGljayBwb3B1cCBlbGVtZW50IHNob3VsZCBub3QgaGlkZVxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChjbGlja1RvSGlkZSAmJiBwb3B1cEVsZSAmJiAoIW1hc2sgfHwgbWFza0Nsb3NhYmxlKSkge1xuICAgICAgdmFyIG9uUG9pbnRlckRvd24gPSBmdW5jdGlvbiBvblBvaW50ZXJEb3duKCkge1xuICAgICAgICBwb3B1cFBvaW50ZXJEb3duUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgIH07XG4gICAgICB2YXIgb25UcmlnZ2VyQ2xvc2UgPSBmdW5jdGlvbiBvblRyaWdnZXJDbG9zZShlKSB7XG4gICAgICAgIHZhciBfZSRjb21wb3NlZFBhdGg7XG4gICAgICAgIGlmIChvcGVuUmVmLmN1cnJlbnQgJiYgIWluUG9wdXBPckNoaWxkKCgoX2UkY29tcG9zZWRQYXRoID0gZS5jb21wb3NlZFBhdGgpID09PSBudWxsIHx8IF9lJGNvbXBvc2VkUGF0aCA9PT0gdm9pZCAwIHx8IChfZSRjb21wb3NlZFBhdGggPSBfZSRjb21wb3NlZFBhdGguY2FsbChlKSkgPT09IG51bGwgfHwgX2UkY29tcG9zZWRQYXRoID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZSRjb21wb3NlZFBhdGhbMF0pIHx8IGUudGFyZ2V0KSAmJiAhcG9wdXBQb2ludGVyRG93blJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgdHJpZ2dlck9wZW4oZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdmFyIHdpbiA9IGdldFdpbihwb3B1cEVsZSk7XG4gICAgICB3aW4uYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCBvblBvaW50ZXJEb3duLCB0cnVlKTtcbiAgICAgIHdpbi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvblRyaWdnZXJDbG9zZSwgdHJ1ZSk7XG4gICAgICB3aW4uYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCBvblRyaWdnZXJDbG9zZSwgdHJ1ZSk7XG5cbiAgICAgIC8vIHNoYWRvdyByb290XG4gICAgICB2YXIgdGFyZ2V0U2hhZG93Um9vdCA9IGdldFNoYWRvd1Jvb3QodGFyZ2V0RWxlKTtcbiAgICAgIGlmICh0YXJnZXRTaGFkb3dSb290KSB7XG4gICAgICAgIHRhcmdldFNoYWRvd1Jvb3QuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgb25UcmlnZ2VyQ2xvc2UsIHRydWUpO1xuICAgICAgICB0YXJnZXRTaGFkb3dSb290LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51Jywgb25UcmlnZ2VyQ2xvc2UsIHRydWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBXYXJuaW5nIGlmIHRhcmdldCBhbmQgcG9wdXAgbm90IGluIHNhbWUgcm9vdFxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgdmFyIF90YXJnZXRFbGUkZ2V0Um9vdE5vZCwgX3BvcHVwRWxlJGdldFJvb3ROb2RlO1xuICAgICAgICB2YXIgdGFyZ2V0Um9vdCA9IHRhcmdldEVsZSA9PT0gbnVsbCB8fCB0YXJnZXRFbGUgPT09IHZvaWQgMCB8fCAoX3RhcmdldEVsZSRnZXRSb290Tm9kID0gdGFyZ2V0RWxlLmdldFJvb3ROb2RlKSA9PT0gbnVsbCB8fCBfdGFyZ2V0RWxlJGdldFJvb3ROb2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90YXJnZXRFbGUkZ2V0Um9vdE5vZC5jYWxsKHRhcmdldEVsZSk7XG4gICAgICAgIHZhciBwb3B1cFJvb3QgPSAoX3BvcHVwRWxlJGdldFJvb3ROb2RlID0gcG9wdXBFbGUuZ2V0Um9vdE5vZGUpID09PSBudWxsIHx8IF9wb3B1cEVsZSRnZXRSb290Tm9kZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3BvcHVwRWxlJGdldFJvb3ROb2RlLmNhbGwocG9wdXBFbGUpO1xuICAgICAgICB3YXJuaW5nKHRhcmdldFJvb3QgPT09IHBvcHVwUm9vdCwgXCJ0cmlnZ2VyIGVsZW1lbnQgYW5kIHBvcHVwIGVsZW1lbnQgc2hvdWxkIGluIHNhbWUgc2hhZG93IHJvb3QuXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2luLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgb25Qb2ludGVyRG93biwgdHJ1ZSk7XG4gICAgICAgIHdpbi5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvblRyaWdnZXJDbG9zZSwgdHJ1ZSk7XG4gICAgICAgIHdpbi5yZW1vdmVFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIG9uVHJpZ2dlckNsb3NlLCB0cnVlKTtcbiAgICAgICAgaWYgKHRhcmdldFNoYWRvd1Jvb3QpIHtcbiAgICAgICAgICB0YXJnZXRTaGFkb3dSb290LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIG9uVHJpZ2dlckNsb3NlLCB0cnVlKTtcbiAgICAgICAgICB0YXJnZXRTaGFkb3dSb290LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51Jywgb25UcmlnZ2VyQ2xvc2UsIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfSwgW2NsaWNrVG9IaWRlLCB0YXJnZXRFbGUsIHBvcHVwRWxlLCBtYXNrLCBtYXNrQ2xvc2FibGVdKTtcbiAgZnVuY3Rpb24gb25Qb3B1cFBvaW50ZXJEb3duKCkge1xuICAgIHBvcHVwUG9pbnRlckRvd25SZWYuY3VycmVudCA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIG9uUG9wdXBQb2ludGVyRG93bjtcbn0iLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wicHJlZml4Q2xzXCIsIFwiZGlzYWJsZWRcIiwgXCJ2aXNpYmxlXCIsIFwiY2hpbGRyZW5cIiwgXCJwb3B1cEVsZW1lbnRcIiwgXCJhbmltYXRpb25cIiwgXCJ0cmFuc2l0aW9uTmFtZVwiLCBcImRyb3Bkb3duU3R5bGVcIiwgXCJkcm9wZG93bkNsYXNzTmFtZVwiLCBcImRpcmVjdGlvblwiLCBcInBsYWNlbWVudFwiLCBcImJ1aWx0aW5QbGFjZW1lbnRzXCIsIFwiZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoXCIsIFwiZHJvcGRvd25SZW5kZXJcIiwgXCJkcm9wZG93bkFsaWduXCIsIFwiZ2V0UG9wdXBDb250YWluZXJcIiwgXCJlbXB0eVwiLCBcImdldFRyaWdnZXJET01Ob2RlXCIsIFwib25Qb3B1cFZpc2libGVDaGFuZ2VcIiwgXCJvblBvcHVwTW91c2VFbnRlclwiXTtcbmltcG9ydCBUcmlnZ2VyIGZyb20gJ0ByYy1jb21wb25lbnQvdHJpZ2dlcic7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbnZhciBnZXRCdWlsdEluUGxhY2VtZW50cyA9IGZ1bmN0aW9uIGdldEJ1aWx0SW5QbGFjZW1lbnRzKGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCkge1xuICAvLyBFbmFibGUgaG9yaXpvbnRhbCBvdmVyZmxvdyBhdXRvLWFkanVzdG1lbnQgd2hlbiBhIGN1c3RvbSBkcm9wZG93biB3aWR0aCBpcyBwcm92aWRlZFxuICB2YXIgYWRqdXN0WCA9IGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCA9PT0gdHJ1ZSA/IDAgOiAxO1xuICByZXR1cm4ge1xuICAgIGJvdHRvbUxlZnQ6IHtcbiAgICAgIHBvaW50czogWyd0bCcsICdibCddLFxuICAgICAgb2Zmc2V0OiBbMCwgNF0sXG4gICAgICBvdmVyZmxvdzoge1xuICAgICAgICBhZGp1c3RYOiBhZGp1c3RYLFxuICAgICAgICBhZGp1c3RZOiAxXG4gICAgICB9LFxuICAgICAgaHRtbFJlZ2lvbjogJ3Njcm9sbCdcbiAgICB9LFxuICAgIGJvdHRvbVJpZ2h0OiB7XG4gICAgICBwb2ludHM6IFsndHInLCAnYnInXSxcbiAgICAgIG9mZnNldDogWzAsIDRdLFxuICAgICAgb3ZlcmZsb3c6IHtcbiAgICAgICAgYWRqdXN0WDogYWRqdXN0WCxcbiAgICAgICAgYWRqdXN0WTogMVxuICAgICAgfSxcbiAgICAgIGh0bWxSZWdpb246ICdzY3JvbGwnXG4gICAgfSxcbiAgICB0b3BMZWZ0OiB7XG4gICAgICBwb2ludHM6IFsnYmwnLCAndGwnXSxcbiAgICAgIG9mZnNldDogWzAsIC00XSxcbiAgICAgIG92ZXJmbG93OiB7XG4gICAgICAgIGFkanVzdFg6IGFkanVzdFgsXG4gICAgICAgIGFkanVzdFk6IDFcbiAgICAgIH0sXG4gICAgICBodG1sUmVnaW9uOiAnc2Nyb2xsJ1xuICAgIH0sXG4gICAgdG9wUmlnaHQ6IHtcbiAgICAgIHBvaW50czogWydicicsICd0ciddLFxuICAgICAgb2Zmc2V0OiBbMCwgLTRdLFxuICAgICAgb3ZlcmZsb3c6IHtcbiAgICAgICAgYWRqdXN0WDogYWRqdXN0WCxcbiAgICAgICAgYWRqdXN0WTogMVxuICAgICAgfSxcbiAgICAgIGh0bWxSZWdpb246ICdzY3JvbGwnXG4gICAgfVxuICB9O1xufTtcbnZhciBTZWxlY3RUcmlnZ2VyID0gZnVuY3Rpb24gU2VsZWN0VHJpZ2dlcihwcm9wcywgcmVmKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICB2aXNpYmxlID0gcHJvcHMudmlzaWJsZSxcbiAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgIHBvcHVwRWxlbWVudCA9IHByb3BzLnBvcHVwRWxlbWVudCxcbiAgICBhbmltYXRpb24gPSBwcm9wcy5hbmltYXRpb24sXG4gICAgdHJhbnNpdGlvbk5hbWUgPSBwcm9wcy50cmFuc2l0aW9uTmFtZSxcbiAgICBkcm9wZG93blN0eWxlID0gcHJvcHMuZHJvcGRvd25TdHlsZSxcbiAgICBkcm9wZG93bkNsYXNzTmFtZSA9IHByb3BzLmRyb3Bkb3duQ2xhc3NOYW1lLFxuICAgIF9wcm9wcyRkaXJlY3Rpb24gPSBwcm9wcy5kaXJlY3Rpb24sXG4gICAgZGlyZWN0aW9uID0gX3Byb3BzJGRpcmVjdGlvbiA9PT0gdm9pZCAwID8gJ2x0cicgOiBfcHJvcHMkZGlyZWN0aW9uLFxuICAgIHBsYWNlbWVudCA9IHByb3BzLnBsYWNlbWVudCxcbiAgICBidWlsdGluUGxhY2VtZW50cyA9IHByb3BzLmJ1aWx0aW5QbGFjZW1lbnRzLFxuICAgIGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCA9IHByb3BzLmRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCxcbiAgICBkcm9wZG93blJlbmRlciA9IHByb3BzLmRyb3Bkb3duUmVuZGVyLFxuICAgIGRyb3Bkb3duQWxpZ24gPSBwcm9wcy5kcm9wZG93bkFsaWduLFxuICAgIGdldFBvcHVwQ29udGFpbmVyID0gcHJvcHMuZ2V0UG9wdXBDb250YWluZXIsXG4gICAgZW1wdHkgPSBwcm9wcy5lbXB0eSxcbiAgICBnZXRUcmlnZ2VyRE9NTm9kZSA9IHByb3BzLmdldFRyaWdnZXJET01Ob2RlLFxuICAgIG9uUG9wdXBWaXNpYmxlQ2hhbmdlID0gcHJvcHMub25Qb3B1cFZpc2libGVDaGFuZ2UsXG4gICAgb25Qb3B1cE1vdXNlRW50ZXIgPSBwcm9wcy5vblBvcHVwTW91c2VFbnRlcixcbiAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIF9leGNsdWRlZCk7XG4gIHZhciBkcm9wZG93blByZWZpeENscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZHJvcGRvd25cIik7XG4gIHZhciBwb3B1cE5vZGUgPSBwb3B1cEVsZW1lbnQ7XG4gIGlmIChkcm9wZG93blJlbmRlcikge1xuICAgIHBvcHVwTm9kZSA9IGRyb3Bkb3duUmVuZGVyKHBvcHVwRWxlbWVudCk7XG4gIH1cbiAgdmFyIG1lcmdlZEJ1aWx0aW5QbGFjZW1lbnRzID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGJ1aWx0aW5QbGFjZW1lbnRzIHx8IGdldEJ1aWx0SW5QbGFjZW1lbnRzKGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCk7XG4gIH0sIFtidWlsdGluUGxhY2VtZW50cywgZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09IE1vdGlvbiA9PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBtZXJnZWRUcmFuc2l0aW9uTmFtZSA9IGFuaW1hdGlvbiA/IFwiXCIuY29uY2F0KGRyb3Bkb3duUHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KGFuaW1hdGlvbikgOiB0cmFuc2l0aW9uTmFtZTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09IFBvcHVwIFdpZHRoID09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGlzTnVtYmVyUG9wdXBXaWR0aCA9IHR5cGVvZiBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGggPT09ICdudW1iZXInO1xuICB2YXIgc3RyZXRjaCA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGlmIChpc051bWJlclBvcHVwV2lkdGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoID09PSBmYWxzZSA/ICdtaW5XaWR0aCcgOiAnd2lkdGgnO1xuICB9LCBbZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoLCBpc051bWJlclBvcHVwV2lkdGhdKTtcbiAgdmFyIHBvcHVwU3R5bGUgPSBkcm9wZG93blN0eWxlO1xuICBpZiAoaXNOdW1iZXJQb3B1cFdpZHRoKSB7XG4gICAgcG9wdXBTdHlsZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcG9wdXBTdHlsZSksIHt9LCB7XG4gICAgICB3aWR0aDogZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoXG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBSZWYgPT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHRyaWdnZXJQb3B1cFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgUmVhY3QudXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZ2V0UG9wdXBFbGVtZW50OiBmdW5jdGlvbiBnZXRQb3B1cEVsZW1lbnQoKSB7XG4gICAgICAgIHZhciBfdHJpZ2dlclBvcHVwUmVmJGN1cnI7XG4gICAgICAgIHJldHVybiAoX3RyaWdnZXJQb3B1cFJlZiRjdXJyID0gdHJpZ2dlclBvcHVwUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF90cmlnZ2VyUG9wdXBSZWYkY3VyciA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RyaWdnZXJQb3B1cFJlZiRjdXJyLnBvcHVwRWxlbWVudDtcbiAgICAgIH1cbiAgICB9O1xuICB9KTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRyaWdnZXIsIF9leHRlbmRzKHt9LCByZXN0UHJvcHMsIHtcbiAgICBzaG93QWN0aW9uOiBvblBvcHVwVmlzaWJsZUNoYW5nZSA/IFsnY2xpY2snXSA6IFtdLFxuICAgIGhpZGVBY3Rpb246IG9uUG9wdXBWaXNpYmxlQ2hhbmdlID8gWydjbGljayddIDogW10sXG4gICAgcG9wdXBQbGFjZW1lbnQ6IHBsYWNlbWVudCB8fCAoZGlyZWN0aW9uID09PSAncnRsJyA/ICdib3R0b21SaWdodCcgOiAnYm90dG9tTGVmdCcpLFxuICAgIGJ1aWx0aW5QbGFjZW1lbnRzOiBtZXJnZWRCdWlsdGluUGxhY2VtZW50cyxcbiAgICBwcmVmaXhDbHM6IGRyb3Bkb3duUHJlZml4Q2xzLFxuICAgIHBvcHVwVHJhbnNpdGlvbk5hbWU6IG1lcmdlZFRyYW5zaXRpb25OYW1lLFxuICAgIHBvcHVwOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBvbk1vdXNlRW50ZXI6IG9uUG9wdXBNb3VzZUVudGVyXG4gICAgfSwgcG9wdXBOb2RlKSxcbiAgICByZWY6IHRyaWdnZXJQb3B1cFJlZixcbiAgICBzdHJldGNoOiBzdHJldGNoLFxuICAgIHBvcHVwQWxpZ246IGRyb3Bkb3duQWxpZ24sXG4gICAgcG9wdXBWaXNpYmxlOiB2aXNpYmxlLFxuICAgIGdldFBvcHVwQ29udGFpbmVyOiBnZXRQb3B1cENvbnRhaW5lcixcbiAgICBwb3B1cENsYXNzTmFtZTogY2xhc3NOYW1lcyhkcm9wZG93bkNsYXNzTmFtZSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChkcm9wZG93blByZWZpeENscywgXCItZW1wdHlcIiksIGVtcHR5KSksXG4gICAgcG9wdXBTdHlsZTogcG9wdXBTdHlsZSxcbiAgICBnZXRUcmlnZ2VyRE9NTm9kZTogZ2V0VHJpZ2dlckRPTU5vZGUsXG4gICAgb25Qb3B1cFZpc2libGVDaGFuZ2U6IG9uUG9wdXBWaXNpYmxlQ2hhbmdlXG4gIH0pLCBjaGlsZHJlbik7XG59O1xudmFyIFJlZlNlbGVjdFRyaWdnZXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihTZWxlY3RUcmlnZ2VyKTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFJlZlNlbGVjdFRyaWdnZXIuZGlzcGxheU5hbWUgPSAnU2VsZWN0VHJpZ2dlcic7XG59XG5leHBvcnQgZGVmYXVsdCBSZWZTZWxlY3RUcmlnZ2VyOyIsICJpbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF90b0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0FycmF5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuZnVuY3Rpb24gZ2V0S2V5KGRhdGEsIGluZGV4KSB7XG4gIHZhciBrZXkgPSBkYXRhLmtleTtcbiAgdmFyIHZhbHVlO1xuICBpZiAoJ3ZhbHVlJyBpbiBkYXRhKSB7XG4gICAgdmFsdWUgPSBkYXRhLnZhbHVlO1xuICB9XG4gIGlmIChrZXkgIT09IG51bGwgJiYga2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4ga2V5O1xuICB9XG4gIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiBcInJjLWluZGV4LWtleS1cIi5jb25jYXQoaW5kZXgpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRDb3VudCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJyAmJiAhTnVtYmVyLmlzTmFOKHZhbHVlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmaWxsRmllbGROYW1lcyhmaWVsZE5hbWVzLCBjaGlsZHJlbkFzRGF0YSkge1xuICB2YXIgX3JlZiA9IGZpZWxkTmFtZXMgfHwge30sXG4gICAgbGFiZWwgPSBfcmVmLmxhYmVsLFxuICAgIHZhbHVlID0gX3JlZi52YWx1ZSxcbiAgICBvcHRpb25zID0gX3JlZi5vcHRpb25zLFxuICAgIGdyb3VwTGFiZWwgPSBfcmVmLmdyb3VwTGFiZWw7XG4gIHZhciBtZXJnZWRMYWJlbCA9IGxhYmVsIHx8IChjaGlsZHJlbkFzRGF0YSA/ICdjaGlsZHJlbicgOiAnbGFiZWwnKTtcbiAgcmV0dXJuIHtcbiAgICBsYWJlbDogbWVyZ2VkTGFiZWwsXG4gICAgdmFsdWU6IHZhbHVlIHx8ICd2YWx1ZScsXG4gICAgb3B0aW9uczogb3B0aW9ucyB8fCAnb3B0aW9ucycsXG4gICAgZ3JvdXBMYWJlbDogZ3JvdXBMYWJlbCB8fCBtZXJnZWRMYWJlbFxuICB9O1xufVxuXG4vKipcbiAqIEZsYXQgb3B0aW9ucyBpbnRvIGZsYXR0ZW4gbGlzdC5cbiAqIFdlIHVzZSBgb3B0aW9uT25seWAgaGVyZSBpcyBhaW0gdG8gYXZvaWQgdXNlciB1c2UgbmVzdGVkIG9wdGlvbiBncm91cC5cbiAqIEhlcmUgaXMgc2ltcGx5IHNldCBga2V5YCB0byB0aGUgaW5kZXggaWYgbm90IHByb3ZpZGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmxhdHRlbk9wdGlvbnMob3B0aW9ucykge1xuICB2YXIgX3JlZjIgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9LFxuICAgIGZpZWxkTmFtZXMgPSBfcmVmMi5maWVsZE5hbWVzLFxuICAgIGNoaWxkcmVuQXNEYXRhID0gX3JlZjIuY2hpbGRyZW5Bc0RhdGE7XG4gIHZhciBmbGF0dGVuTGlzdCA9IFtdO1xuICB2YXIgX2ZpbGxGaWVsZE5hbWVzID0gZmlsbEZpZWxkTmFtZXMoZmllbGROYW1lcywgZmFsc2UpLFxuICAgIGZpZWxkTGFiZWwgPSBfZmlsbEZpZWxkTmFtZXMubGFiZWwsXG4gICAgZmllbGRWYWx1ZSA9IF9maWxsRmllbGROYW1lcy52YWx1ZSxcbiAgICBmaWVsZE9wdGlvbnMgPSBfZmlsbEZpZWxkTmFtZXMub3B0aW9ucyxcbiAgICBncm91cExhYmVsID0gX2ZpbGxGaWVsZE5hbWVzLmdyb3VwTGFiZWw7XG4gIGZ1bmN0aW9uIGRpZyhsaXN0LCBpc0dyb3VwT3B0aW9uKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGxpc3QpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxpc3QuZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgaWYgKGlzR3JvdXBPcHRpb24gfHwgIShmaWVsZE9wdGlvbnMgaW4gZGF0YSkpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gZGF0YVtmaWVsZFZhbHVlXTtcblxuICAgICAgICAvLyBPcHRpb25cbiAgICAgICAgZmxhdHRlbkxpc3QucHVzaCh7XG4gICAgICAgICAga2V5OiBnZXRLZXkoZGF0YSwgZmxhdHRlbkxpc3QubGVuZ3RoKSxcbiAgICAgICAgICBncm91cE9wdGlvbjogaXNHcm91cE9wdGlvbixcbiAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICAgIGxhYmVsOiBkYXRhW2ZpZWxkTGFiZWxdLFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBncnBMYWJlbCA9IGRhdGFbZ3JvdXBMYWJlbF07XG4gICAgICAgIGlmIChncnBMYWJlbCA9PT0gdW5kZWZpbmVkICYmIGNoaWxkcmVuQXNEYXRhKSB7XG4gICAgICAgICAgZ3JwTGFiZWwgPSBkYXRhLmxhYmVsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3B0aW9uIEdyb3VwXG4gICAgICAgIGZsYXR0ZW5MaXN0LnB1c2goe1xuICAgICAgICAgIGtleTogZ2V0S2V5KGRhdGEsIGZsYXR0ZW5MaXN0Lmxlbmd0aCksXG4gICAgICAgICAgZ3JvdXA6IHRydWUsXG4gICAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgICBsYWJlbDogZ3JwTGFiZWxcbiAgICAgICAgfSk7XG4gICAgICAgIGRpZyhkYXRhW2ZpZWxkT3B0aW9uc10sIHRydWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGRpZyhvcHRpb25zLCBmYWxzZSk7XG4gIHJldHVybiBmbGF0dGVuTGlzdDtcbn1cblxuLyoqXG4gKiBJbmplY3QgYHByb3BzYCBpbnRvIGBvcHRpb25gIGZvciBsZWdhY3kgdXNhZ2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdFByb3BzV2l0aE9wdGlvbihvcHRpb24pIHtcbiAgdmFyIG5ld09wdGlvbiA9IF9vYmplY3RTcHJlYWQoe30sIG9wdGlvbik7XG4gIGlmICghKCdwcm9wcycgaW4gbmV3T3B0aW9uKSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdPcHRpb24sICdwcm9wcycsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICB3YXJuaW5nKGZhbHNlLCAnUmV0dXJuIHR5cGUgaXMgb3B0aW9uIGluc3RlYWQgb2YgT3B0aW9uIGluc3RhbmNlLiBQbGVhc2UgcmVhZCB2YWx1ZSBkaXJlY3RseSBpbnN0ZWFkIG9mIHJlYWRpbmcgZnJvbSBgcHJvcHNgLicpO1xuICAgICAgICByZXR1cm4gbmV3T3B0aW9uO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiBuZXdPcHRpb247XG59XG5leHBvcnQgdmFyIGdldFNlcGFyYXRlZENvbnRlbnQgPSBmdW5jdGlvbiBnZXRTZXBhcmF0ZWRDb250ZW50KHRleHQsIHRva2VucywgZW5kKSB7XG4gIGlmICghdG9rZW5zIHx8ICF0b2tlbnMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIG1hdGNoID0gZmFsc2U7XG4gIHZhciBzZXBhcmF0ZSA9IGZ1bmN0aW9uIHNlcGFyYXRlKHN0ciwgX3JlZjMpIHtcbiAgICB2YXIgX3JlZjQgPSBfdG9BcnJheShfcmVmMyksXG4gICAgICB0b2tlbiA9IF9yZWY0WzBdLFxuICAgICAgcmVzdFRva2VucyA9IF9yZWY0LnNsaWNlKDEpO1xuICAgIGlmICghdG9rZW4pIHtcbiAgICAgIHJldHVybiBbc3RyXTtcbiAgICB9XG4gICAgdmFyIGxpc3QgPSBzdHIuc3BsaXQodG9rZW4pO1xuICAgIG1hdGNoID0gbWF0Y2ggfHwgbGlzdC5sZW5ndGggPiAxO1xuICAgIHJldHVybiBsaXN0LnJlZHVjZShmdW5jdGlvbiAocHJldkxpc3QsIHVuaXRTdHIpIHtcbiAgICAgIHJldHVybiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHByZXZMaXN0KSwgX3RvQ29uc3VtYWJsZUFycmF5KHNlcGFyYXRlKHVuaXRTdHIsIHJlc3RUb2tlbnMpKSk7XG4gICAgfSwgW10pLmZpbHRlcihCb29sZWFuKTtcbiAgfTtcbiAgdmFyIGxpc3QgPSBzZXBhcmF0ZSh0ZXh0LCB0b2tlbnMpO1xuICBpZiAobWF0Y2gpIHtcbiAgICByZXR1cm4gdHlwZW9mIGVuZCAhPT0gJ3VuZGVmaW5lZCcgPyBsaXN0LnNsaWNlKDAsIGVuZCkgOiBsaXN0O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59OyIsICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbi8vIFVzZSBhbnkgaGVyZSBzaW5jZSB3ZSBkbyBub3QgZ2V0IHRoZSB0eXBlIGR1cmluZyBjb21waWxhdGlvblxuXG52YXIgU2VsZWN0Q29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuZXhwb3J0IGRlZmF1bHQgU2VsZWN0Q29udGV4dDsiLCAiaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gUG9saXRlKHByb3BzKSB7XG4gIHZhciB2aXNpYmxlID0gcHJvcHMudmlzaWJsZSxcbiAgICB2YWx1ZXMgPSBwcm9wcy52YWx1ZXM7XG4gIGlmICghdmlzaWJsZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gT25seSBjdXQgcGFydCBvZiB2YWx1ZXMgc2luY2UgaXQncyBhIHNjcmVlbiByZWFkZXJcbiAgdmFyIE1BWF9DT1VOVCA9IDUwO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBcImFyaWEtbGl2ZVwiOiBcInBvbGl0ZVwiLFxuICAgIHN0eWxlOiB7XG4gICAgICB3aWR0aDogMCxcbiAgICAgIGhlaWdodDogMCxcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgb3BhY2l0eTogMFxuICAgIH1cbiAgfSwgXCJcIi5jb25jYXQodmFsdWVzLnNsaWNlKDAsIE1BWF9DT1VOVCkubWFwKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgdmFyIGxhYmVsID0gX3JlZi5sYWJlbCxcbiAgICAgIHZhbHVlID0gX3JlZi52YWx1ZTtcbiAgICByZXR1cm4gWydudW1iZXInLCAnc3RyaW5nJ10uaW5jbHVkZXMoX3R5cGVvZihsYWJlbCkpID8gbGFiZWwgOiB2YWx1ZTtcbiAgfSkuam9pbignLCAnKSksIHZhbHVlcy5sZW5ndGggPiBNQVhfQ09VTlQgPyAnLCAuLi4nIDogbnVsbCk7XG59IiwgIi8qIGlzdGFuYnVsIGlnbm9yZSBmaWxlICovXG5cbi8qKiBUaGlzIGlzIGEgcGxhY2Vob2xkZXIsIG5vdCByZWFsIHJlbmRlciBpbiBkb20gKi9cbnZhciBPcHRHcm91cCA9IGZ1bmN0aW9uIE9wdEdyb3VwKCkge1xuICByZXR1cm4gbnVsbDtcbn07XG5PcHRHcm91cC5pc1NlbGVjdE9wdEdyb3VwID0gdHJ1ZTtcbmV4cG9ydCBkZWZhdWx0IE9wdEdyb3VwOyIsICIvKiBpc3RhbmJ1bCBpZ25vcmUgZmlsZSAqL1xuXG4vKiogVGhpcyBpcyBhIHBsYWNlaG9sZGVyLCBub3QgcmVhbCByZW5kZXIgaW4gZG9tICovXG52YXIgT3B0aW9uID0gZnVuY3Rpb24gT3B0aW9uKCkge1xuICByZXR1cm4gbnVsbDtcbn07XG5PcHRpb24uaXNTZWxlY3RPcHRpb24gPSB0cnVlO1xuZXhwb3J0IGRlZmF1bHQgT3B0aW9uOyIsICJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xudmFyIF9leGNsdWRlZCA9IFtcImRpc2FibGVkXCIsIFwidGl0bGVcIiwgXCJjaGlsZHJlblwiLCBcInN0eWxlXCIsIFwiY2xhc3NOYW1lXCJdO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgS2V5Q29kZSBmcm9tIFwicmMtdXRpbC9lcy9LZXlDb2RlXCI7XG5pbXBvcnQgdXNlTWVtbyBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VNZW1vXCI7XG5pbXBvcnQgb21pdCBmcm9tIFwicmMtdXRpbC9lcy9vbWl0XCI7XG5pbXBvcnQgcGlja0F0dHJzIGZyb20gXCJyYy11dGlsL2VzL3BpY2tBdHRyc1wiO1xuaW1wb3J0IExpc3QgZnJvbSAncmMtdmlydHVhbC1saXN0JztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBTZWxlY3RDb250ZXh0IGZyb20gXCIuL1NlbGVjdENvbnRleHRcIjtcbmltcG9ydCBUcmFuc0J0biBmcm9tIFwiLi9UcmFuc0J0blwiO1xuaW1wb3J0IHVzZUJhc2VQcm9wcyBmcm9tIFwiLi9ob29rcy91c2VCYXNlUHJvcHNcIjtcbmltcG9ydCB7IGlzUGxhdGZvcm1NYWMgfSBmcm9tIFwiLi91dGlscy9wbGF0Zm9ybVV0aWxcIjtcbmltcG9ydCB7IGlzVmFsaWRDb3VudCB9IGZyb20gXCIuL3V0aWxzL3ZhbHVlVXRpbFwiO1xuXG4vLyBleHBvcnQgaW50ZXJmYWNlIE9wdGlvbkxpc3RQcm9wczxPcHRpb25zVHlwZSBleHRlbmRzIG9iamVjdFtdPiB7XG5cbmZ1bmN0aW9uIGlzVGl0bGVUeXBlKGNvbnRlbnQpIHtcbiAgcmV0dXJuIHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgY29udGVudCA9PT0gJ251bWJlcic7XG59XG5cbi8qKlxuICogVXNpbmcgdmlydHVhbCBsaXN0IG9mIG9wdGlvbiBkaXNwbGF5LlxuICogV2lsbCBmYWxsYmFjayB0byBkb20gaWYgdXNlIGN1c3RvbWl6ZSByZW5kZXIuXG4gKi9cbnZhciBPcHRpb25MaXN0ID0gZnVuY3Rpb24gT3B0aW9uTGlzdChfLCByZWYpIHtcbiAgdmFyIF91c2VCYXNlUHJvcHMgPSB1c2VCYXNlUHJvcHMoKSxcbiAgICBwcmVmaXhDbHMgPSBfdXNlQmFzZVByb3BzLnByZWZpeENscyxcbiAgICBpZCA9IF91c2VCYXNlUHJvcHMuaWQsXG4gICAgb3BlbiA9IF91c2VCYXNlUHJvcHMub3BlbixcbiAgICBtdWx0aXBsZSA9IF91c2VCYXNlUHJvcHMubXVsdGlwbGUsXG4gICAgbW9kZSA9IF91c2VCYXNlUHJvcHMubW9kZSxcbiAgICBzZWFyY2hWYWx1ZSA9IF91c2VCYXNlUHJvcHMuc2VhcmNoVmFsdWUsXG4gICAgdG9nZ2xlT3BlbiA9IF91c2VCYXNlUHJvcHMudG9nZ2xlT3BlbixcbiAgICBub3RGb3VuZENvbnRlbnQgPSBfdXNlQmFzZVByb3BzLm5vdEZvdW5kQ29udGVudCxcbiAgICBvblBvcHVwU2Nyb2xsID0gX3VzZUJhc2VQcm9wcy5vblBvcHVwU2Nyb2xsO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KFNlbGVjdENvbnRleHQpLFxuICAgIG1heENvdW50ID0gX1JlYWN0JHVzZUNvbnRleHQubWF4Q291bnQsXG4gICAgZmxhdHRlbk9wdGlvbnMgPSBfUmVhY3QkdXNlQ29udGV4dC5mbGF0dGVuT3B0aW9ucyxcbiAgICBvbkFjdGl2ZVZhbHVlID0gX1JlYWN0JHVzZUNvbnRleHQub25BY3RpdmVWYWx1ZSxcbiAgICBkZWZhdWx0QWN0aXZlRmlyc3RPcHRpb24gPSBfUmVhY3QkdXNlQ29udGV4dC5kZWZhdWx0QWN0aXZlRmlyc3RPcHRpb24sXG4gICAgb25TZWxlY3QgPSBfUmVhY3QkdXNlQ29udGV4dC5vblNlbGVjdCxcbiAgICBtZW51SXRlbVNlbGVjdGVkSWNvbiA9IF9SZWFjdCR1c2VDb250ZXh0Lm1lbnVJdGVtU2VsZWN0ZWRJY29uLFxuICAgIHJhd1ZhbHVlcyA9IF9SZWFjdCR1c2VDb250ZXh0LnJhd1ZhbHVlcyxcbiAgICBmaWVsZE5hbWVzID0gX1JlYWN0JHVzZUNvbnRleHQuZmllbGROYW1lcyxcbiAgICB2aXJ0dWFsID0gX1JlYWN0JHVzZUNvbnRleHQudmlydHVhbCxcbiAgICBkaXJlY3Rpb24gPSBfUmVhY3QkdXNlQ29udGV4dC5kaXJlY3Rpb24sXG4gICAgbGlzdEhlaWdodCA9IF9SZWFjdCR1c2VDb250ZXh0Lmxpc3RIZWlnaHQsXG4gICAgbGlzdEl0ZW1IZWlnaHQgPSBfUmVhY3QkdXNlQ29udGV4dC5saXN0SXRlbUhlaWdodCxcbiAgICBvcHRpb25SZW5kZXIgPSBfUmVhY3QkdXNlQ29udGV4dC5vcHRpb25SZW5kZXI7XG4gIHZhciBpdGVtUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtXCIpO1xuICB2YXIgbWVtb0ZsYXR0ZW5PcHRpb25zID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZsYXR0ZW5PcHRpb25zO1xuICB9LCBbb3BlbiwgZmxhdHRlbk9wdGlvbnNdLCBmdW5jdGlvbiAocHJldiwgbmV4dCkge1xuICAgIHJldHVybiBuZXh0WzBdICYmIHByZXZbMV0gIT09IG5leHRbMV07XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBMaXN0ID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgbGlzdFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIG92ZXJNYXhDb3VudCA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBtdWx0aXBsZSAmJiBpc1ZhbGlkQ291bnQobWF4Q291bnQpICYmIChyYXdWYWx1ZXMgPT09IG51bGwgfHwgcmF3VmFsdWVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiByYXdWYWx1ZXMuc2l6ZSkgPj0gbWF4Q291bnQ7XG4gIH0sIFttdWx0aXBsZSwgbWF4Q291bnQsIHJhd1ZhbHVlcyA9PT0gbnVsbCB8fCByYXdWYWx1ZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJhd1ZhbHVlcy5zaXplXSk7XG4gIHZhciBvbkxpc3RNb3VzZURvd24gPSBmdW5jdGlvbiBvbkxpc3RNb3VzZURvd24oZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9O1xuICB2YXIgc2Nyb2xsSW50b1ZpZXcgPSBmdW5jdGlvbiBzY3JvbGxJbnRvVmlldyhhcmdzKSB7XG4gICAgdmFyIF9saXN0UmVmJGN1cnJlbnQ7XG4gICAgKF9saXN0UmVmJGN1cnJlbnQgPSBsaXN0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9saXN0UmVmJGN1cnJlbnQgPT09IHZvaWQgMCB8fCBfbGlzdFJlZiRjdXJyZW50LnNjcm9sbFRvKHR5cGVvZiBhcmdzID09PSAnbnVtYmVyJyA/IHtcbiAgICAgIGluZGV4OiBhcmdzXG4gICAgfSA6IGFyZ3MpO1xuICB9O1xuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzM0OTc1XG4gIHZhciBpc1NlbGVjdGVkID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgaWYgKG1vZGUgPT09ICdjb21ib2JveCcpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHJhd1ZhbHVlcy5oYXModmFsdWUpO1xuICB9LCBbbW9kZSwgX3RvQ29uc3VtYWJsZUFycmF5KHJhd1ZhbHVlcykudG9TdHJpbmcoKSwgcmF3VmFsdWVzLnNpemVdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBBY3RpdmUgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGdldEVuYWJsZWRBY3RpdmVJbmRleCA9IGZ1bmN0aW9uIGdldEVuYWJsZWRBY3RpdmVJbmRleChpbmRleCkge1xuICAgIHZhciBvZmZzZXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDE7XG4gICAgdmFyIGxlbiA9IG1lbW9GbGF0dGVuT3B0aW9ucy5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgdmFyIGN1cnJlbnQgPSAoaW5kZXggKyBpICogb2Zmc2V0ICsgbGVuKSAlIGxlbjtcbiAgICAgIHZhciBfcmVmID0gbWVtb0ZsYXR0ZW5PcHRpb25zW2N1cnJlbnRdIHx8IHt9LFxuICAgICAgICBncm91cCA9IF9yZWYuZ3JvdXAsXG4gICAgICAgIGRhdGEgPSBfcmVmLmRhdGE7XG4gICAgICBpZiAoIWdyb3VwICYmICEoZGF0YSAhPT0gbnVsbCAmJiBkYXRhICE9PSB2b2lkIDAgJiYgZGF0YS5kaXNhYmxlZCkgJiYgKGlzU2VsZWN0ZWQoZGF0YS52YWx1ZSkgfHwgIW92ZXJNYXhDb3VudCkpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBnZXRFbmFibGVkQWN0aXZlSW5kZXgoMCk7XG4gICAgfSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgYWN0aXZlSW5kZXggPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldEFjdGl2ZUluZGV4ID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIHNldEFjdGl2ZSA9IGZ1bmN0aW9uIHNldEFjdGl2ZShpbmRleCkge1xuICAgIHZhciBmcm9tS2V5Ym9hcmQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuICAgIHNldEFjdGl2ZUluZGV4KGluZGV4KTtcbiAgICB2YXIgaW5mbyA9IHtcbiAgICAgIHNvdXJjZTogZnJvbUtleWJvYXJkID8gJ2tleWJvYXJkJyA6ICdtb3VzZSdcbiAgICB9O1xuXG4gICAgLy8gVHJpZ2dlciBhY3RpdmUgZXZlbnRcbiAgICB2YXIgZmxhdHRlbkl0ZW0gPSBtZW1vRmxhdHRlbk9wdGlvbnNbaW5kZXhdO1xuICAgIGlmICghZmxhdHRlbkl0ZW0pIHtcbiAgICAgIG9uQWN0aXZlVmFsdWUobnVsbCwgLTEsIGluZm8pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBvbkFjdGl2ZVZhbHVlKGZsYXR0ZW5JdGVtLnZhbHVlLCBpbmRleCwgaW5mbyk7XG4gIH07XG5cbiAgLy8gQXV0byBhY3RpdmUgZmlyc3QgaXRlbSB3aGVuIGxpc3QgbGVuZ3RoIG9yIHNlYXJjaFZhbHVlIGNoYW5nZWRcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBzZXRBY3RpdmUoZGVmYXVsdEFjdGl2ZUZpcnN0T3B0aW9uICE9PSBmYWxzZSA/IGdldEVuYWJsZWRBY3RpdmVJbmRleCgwKSA6IC0xKTtcbiAgfSwgW21lbW9GbGF0dGVuT3B0aW9ucy5sZW5ndGgsIHNlYXJjaFZhbHVlXSk7XG5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvNDgwMzZcbiAgdmFyIGlzQXJpYVNlbGVjdGVkID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgaWYgKG1vZGUgPT09ICdjb21ib2JveCcpIHtcbiAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpLnRvTG93ZXJDYXNlKCkgPT09IHNlYXJjaFZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIHJldHVybiByYXdWYWx1ZXMuaGFzKHZhbHVlKTtcbiAgfSwgW21vZGUsIHNlYXJjaFZhbHVlLCBfdG9Db25zdW1hYmxlQXJyYXkocmF3VmFsdWVzKS50b1N0cmluZygpLCByYXdWYWx1ZXMuc2l6ZV0pO1xuXG4gIC8vIEF1dG8gc2Nyb2xsIHRvIGl0ZW0gcG9zaXRpb24gaW4gc2luZ2xlIG1vZGVcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBSZWFjdCB3aWxsIHNraXAgYG9uQ2hhbmdlYCB3aGVuIGNvbXBvbmVudCB1cGRhdGUuXG4gICAgICogYHNldEFjdGl2ZWAgZnVuY3Rpb24gd2lsbCBjYWxsIHJvb3QgYWNjZXNzaWJpbGl0eSBzdGF0ZSB1cGRhdGUgd2hpY2ggbWFrZXMgcmUtcmVuZGVyLlxuICAgICAqIFNvIHdlIG5lZWQgdG8gZGVsYXkgdG8gbGV0IElucHV0IGNvbXBvbmVudCB0cmlnZ2VyIG9uQ2hhbmdlIGZpcnN0LlxuICAgICAqL1xuICAgIHZhciB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghbXVsdGlwbGUgJiYgb3BlbiAmJiByYXdWYWx1ZXMuc2l6ZSA9PT0gMSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBBcnJheS5mcm9tKHJhd1ZhbHVlcylbMF07XG4gICAgICAgIHZhciBpbmRleCA9IG1lbW9GbGF0dGVuT3B0aW9ucy5maW5kSW5kZXgoZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgICAgICAgdmFyIGRhdGEgPSBfcmVmMi5kYXRhO1xuICAgICAgICAgIHJldHVybiBkYXRhLnZhbHVlID09PSB2YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICBzZXRBY3RpdmUoaW5kZXgpO1xuICAgICAgICAgIHNjcm9sbEludG9WaWV3KGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gRm9yY2UgdHJpZ2dlciBzY3JvbGxiYXIgdmlzaWJsZSB3aGVuIG9wZW5cbiAgICBpZiAob3Blbikge1xuICAgICAgdmFyIF9saXN0UmVmJGN1cnJlbnQyO1xuICAgICAgKF9saXN0UmVmJGN1cnJlbnQyID0gbGlzdFJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfbGlzdFJlZiRjdXJyZW50MiA9PT0gdm9pZCAwIHx8IF9saXN0UmVmJGN1cnJlbnQyLnNjcm9sbFRvKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgfTtcbiAgfSwgW29wZW4sIHNlYXJjaFZhbHVlXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gVmFsdWVzID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBvblNlbGVjdFZhbHVlID0gZnVuY3Rpb24gb25TZWxlY3RWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBvblNlbGVjdCh2YWx1ZSwge1xuICAgICAgICBzZWxlY3RlZDogIXJhd1ZhbHVlcy5oYXModmFsdWUpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBTaW5nbGUgbW9kZSBzaG91bGQgYWx3YXlzIGNsb3NlIGJ5IHNlbGVjdFxuICAgIGlmICghbXVsdGlwbGUpIHtcbiAgICAgIHRvZ2dsZU9wZW4oZmFsc2UpO1xuICAgIH1cbiAgfTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IEtleWJvYXJkID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgUmVhY3QudXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgb25LZXlEb3duOiBmdW5jdGlvbiBvbktleURvd24oZXZlbnQpIHtcbiAgICAgICAgdmFyIHdoaWNoID0gZXZlbnQud2hpY2gsXG4gICAgICAgICAgY3RybEtleSA9IGV2ZW50LmN0cmxLZXk7XG4gICAgICAgIHN3aXRjaCAod2hpY2gpIHtcbiAgICAgICAgICAvLyA+Pj4gQXJyb3cga2V5cyAmIGN0cmwgKyBuL3Agb24gTWFjXG4gICAgICAgICAgY2FzZSBLZXlDb2RlLk46XG4gICAgICAgICAgY2FzZSBLZXlDb2RlLlA6XG4gICAgICAgICAgY2FzZSBLZXlDb2RlLlVQOlxuICAgICAgICAgIGNhc2UgS2V5Q29kZS5ET1dOOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gMDtcbiAgICAgICAgICAgICAgaWYgKHdoaWNoID09PSBLZXlDb2RlLlVQKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gLTE7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hpY2ggPT09IEtleUNvZGUuRE9XTikge1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IDE7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNQbGF0Zm9ybU1hYygpICYmIGN0cmxLZXkpIHtcbiAgICAgICAgICAgICAgICBpZiAod2hpY2ggPT09IEtleUNvZGUuTikge1xuICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gMTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoaWNoID09PSBLZXlDb2RlLlApIHtcbiAgICAgICAgICAgICAgICAgIG9mZnNldCA9IC0xO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAob2Zmc2V0ICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5leHRBY3RpdmVJbmRleCA9IGdldEVuYWJsZWRBY3RpdmVJbmRleChhY3RpdmVJbmRleCArIG9mZnNldCwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBzY3JvbGxJbnRvVmlldyhuZXh0QWN0aXZlSW5kZXgpO1xuICAgICAgICAgICAgICAgIHNldEFjdGl2ZShuZXh0QWN0aXZlSW5kZXgsIHRydWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gPj4+IFNlbGVjdCAoVGFiIC8gRW50ZXIpXG4gICAgICAgICAgY2FzZSBLZXlDb2RlLlRBQjpcbiAgICAgICAgICBjYXNlIEtleUNvZGUuRU5URVI6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHZhciBfaXRlbSRkYXRhO1xuICAgICAgICAgICAgICAvLyB2YWx1ZVxuICAgICAgICAgICAgICB2YXIgaXRlbSA9IG1lbW9GbGF0dGVuT3B0aW9uc1thY3RpdmVJbmRleF07XG4gICAgICAgICAgICAgIGlmIChpdGVtICYmICEoaXRlbSAhPT0gbnVsbCAmJiBpdGVtICE9PSB2b2lkIDAgJiYgKF9pdGVtJGRhdGEgPSBpdGVtLmRhdGEpICE9PSBudWxsICYmIF9pdGVtJGRhdGEgIT09IHZvaWQgMCAmJiBfaXRlbSRkYXRhLmRpc2FibGVkKSAmJiAhb3Zlck1heENvdW50KSB7XG4gICAgICAgICAgICAgICAgb25TZWxlY3RWYWx1ZShpdGVtLnZhbHVlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvblNlbGVjdFZhbHVlKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKG9wZW4pIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gPj4+IENsb3NlXG4gICAgICAgICAgY2FzZSBLZXlDb2RlLkVTQzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdG9nZ2xlT3BlbihmYWxzZSk7XG4gICAgICAgICAgICAgIGlmIChvcGVuKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9uS2V5VXA6IGZ1bmN0aW9uIG9uS2V5VXAoKSB7fSxcbiAgICAgIHNjcm9sbFRvOiBmdW5jdGlvbiBzY3JvbGxUbyhpbmRleCkge1xuICAgICAgICBzY3JvbGxJbnRvVmlldyhpbmRleCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGlmIChtZW1vRmxhdHRlbk9wdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIHJvbGU6IFwibGlzdGJveFwiLFxuICAgICAgaWQ6IFwiXCIuY29uY2F0KGlkLCBcIl9saXN0XCIpLFxuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChpdGVtUHJlZml4Q2xzLCBcIi1lbXB0eVwiKSxcbiAgICAgIG9uTW91c2VEb3duOiBvbkxpc3RNb3VzZURvd25cbiAgICB9LCBub3RGb3VuZENvbnRlbnQpO1xuICB9XG4gIHZhciBvbWl0RmllbGROYW1lTGlzdCA9IE9iamVjdC5rZXlzKGZpZWxkTmFtZXMpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIGZpZWxkTmFtZXNba2V5XTtcbiAgfSk7XG4gIHZhciBnZXRMYWJlbCA9IGZ1bmN0aW9uIGdldExhYmVsKGl0ZW0pIHtcbiAgICByZXR1cm4gaXRlbS5sYWJlbDtcbiAgfTtcbiAgZnVuY3Rpb24gZ2V0SXRlbUFyaWFQcm9wcyhpdGVtLCBpbmRleCkge1xuICAgIHZhciBncm91cCA9IGl0ZW0uZ3JvdXA7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJvbGU6IGdyb3VwID8gJ3ByZXNlbnRhdGlvbicgOiAnb3B0aW9uJyxcbiAgICAgIGlkOiBcIlwiLmNvbmNhdChpZCwgXCJfbGlzdF9cIikuY29uY2F0KGluZGV4KVxuICAgIH07XG4gIH1cbiAgdmFyIHJlbmRlckl0ZW0gPSBmdW5jdGlvbiByZW5kZXJJdGVtKGluZGV4KSB7XG4gICAgdmFyIGl0ZW0gPSBtZW1vRmxhdHRlbk9wdGlvbnNbaW5kZXhdO1xuICAgIGlmICghaXRlbSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBpdGVtRGF0YSA9IGl0ZW0uZGF0YSB8fCB7fTtcbiAgICB2YXIgdmFsdWUgPSBpdGVtRGF0YS52YWx1ZTtcbiAgICB2YXIgZ3JvdXAgPSBpdGVtLmdyb3VwO1xuICAgIHZhciBhdHRycyA9IHBpY2tBdHRycyhpdGVtRGF0YSwgdHJ1ZSk7XG4gICAgdmFyIG1lcmdlZExhYmVsID0gZ2V0TGFiZWwoaXRlbSk7XG4gICAgcmV0dXJuIGl0ZW0gPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgICBcImFyaWEtbGFiZWxcIjogdHlwZW9mIG1lcmdlZExhYmVsID09PSAnc3RyaW5nJyAmJiAhZ3JvdXAgPyBtZXJnZWRMYWJlbCA6IG51bGxcbiAgICB9LCBhdHRycywge1xuICAgICAga2V5OiBpbmRleFxuICAgIH0sIGdldEl0ZW1BcmlhUHJvcHMoaXRlbSwgaW5kZXgpLCB7XG4gICAgICBcImFyaWEtc2VsZWN0ZWRcIjogaXNBcmlhU2VsZWN0ZWQodmFsdWUpXG4gICAgfSksIHZhbHVlKSA6IG51bGw7XG4gIH07XG4gIHZhciBhMTF5UHJvcHMgPSB7XG4gICAgcm9sZTogJ2xpc3Rib3gnLFxuICAgIGlkOiBcIlwiLmNvbmNhdChpZCwgXCJfbGlzdFwiKVxuICB9O1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIHZpcnR1YWwgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe30sIGExMXlQcm9wcywge1xuICAgIHN0eWxlOiB7XG4gICAgICBoZWlnaHQ6IDAsXG4gICAgICB3aWR0aDogMCxcbiAgICAgIG92ZXJmbG93OiAnaGlkZGVuJ1xuICAgIH1cbiAgfSksIHJlbmRlckl0ZW0oYWN0aXZlSW5kZXggLSAxKSwgcmVuZGVySXRlbShhY3RpdmVJbmRleCksIHJlbmRlckl0ZW0oYWN0aXZlSW5kZXggKyAxKSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExpc3QsIHtcbiAgICBpdGVtS2V5OiBcImtleVwiLFxuICAgIHJlZjogbGlzdFJlZixcbiAgICBkYXRhOiBtZW1vRmxhdHRlbk9wdGlvbnMsXG4gICAgaGVpZ2h0OiBsaXN0SGVpZ2h0LFxuICAgIGl0ZW1IZWlnaHQ6IGxpc3RJdGVtSGVpZ2h0LFxuICAgIGZ1bGxIZWlnaHQ6IGZhbHNlLFxuICAgIG9uTW91c2VEb3duOiBvbkxpc3RNb3VzZURvd24sXG4gICAgb25TY3JvbGw6IG9uUG9wdXBTY3JvbGwsXG4gICAgdmlydHVhbDogdmlydHVhbCxcbiAgICBkaXJlY3Rpb246IGRpcmVjdGlvbixcbiAgICBpbm5lclByb3BzOiB2aXJ0dWFsID8gbnVsbCA6IGExMXlQcm9wc1xuICB9LCBmdW5jdGlvbiAoaXRlbSwgaXRlbUluZGV4KSB7XG4gICAgdmFyIGdyb3VwID0gaXRlbS5ncm91cCxcbiAgICAgIGdyb3VwT3B0aW9uID0gaXRlbS5ncm91cE9wdGlvbixcbiAgICAgIGRhdGEgPSBpdGVtLmRhdGEsXG4gICAgICBsYWJlbCA9IGl0ZW0ubGFiZWwsXG4gICAgICB2YWx1ZSA9IGl0ZW0udmFsdWU7XG4gICAgdmFyIGtleSA9IGRhdGEua2V5O1xuXG4gICAgLy8gR3JvdXBcbiAgICBpZiAoZ3JvdXApIHtcbiAgICAgIHZhciBfZGF0YSR0aXRsZTtcbiAgICAgIHZhciBncm91cFRpdGxlID0gKF9kYXRhJHRpdGxlID0gZGF0YS50aXRsZSkgIT09IG51bGwgJiYgX2RhdGEkdGl0bGUgIT09IHZvaWQgMCA/IF9kYXRhJHRpdGxlIDogaXNUaXRsZVR5cGUobGFiZWwpID8gbGFiZWwudG9TdHJpbmcoKSA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhpdGVtUHJlZml4Q2xzLCBcIlwiLmNvbmNhdChpdGVtUHJlZml4Q2xzLCBcIi1ncm91cFwiKSwgZGF0YS5jbGFzc05hbWUpLFxuICAgICAgICB0aXRsZTogZ3JvdXBUaXRsZVxuICAgICAgfSwgbGFiZWwgIT09IHVuZGVmaW5lZCA/IGxhYmVsIDoga2V5KTtcbiAgICB9XG4gICAgdmFyIGRpc2FibGVkID0gZGF0YS5kaXNhYmxlZCxcbiAgICAgIHRpdGxlID0gZGF0YS50aXRsZSxcbiAgICAgIGNoaWxkcmVuID0gZGF0YS5jaGlsZHJlbixcbiAgICAgIHN0eWxlID0gZGF0YS5zdHlsZSxcbiAgICAgIGNsYXNzTmFtZSA9IGRhdGEuY2xhc3NOYW1lLFxuICAgICAgb3RoZXJQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhkYXRhLCBfZXhjbHVkZWQpO1xuICAgIHZhciBwYXNzZWRQcm9wcyA9IG9taXQob3RoZXJQcm9wcywgb21pdEZpZWxkTmFtZUxpc3QpO1xuXG4gICAgLy8gT3B0aW9uXG4gICAgdmFyIHNlbGVjdGVkID0gaXNTZWxlY3RlZCh2YWx1ZSk7XG4gICAgdmFyIG1lcmdlZERpc2FibGVkID0gZGlzYWJsZWQgfHwgIXNlbGVjdGVkICYmIG92ZXJNYXhDb3VudDtcbiAgICB2YXIgb3B0aW9uUHJlZml4Q2xzID0gXCJcIi5jb25jYXQoaXRlbVByZWZpeENscywgXCItb3B0aW9uXCIpO1xuICAgIHZhciBvcHRpb25DbGFzc05hbWUgPSBjbGFzc05hbWVzKGl0ZW1QcmVmaXhDbHMsIG9wdGlvblByZWZpeENscywgY2xhc3NOYW1lLCBfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KG9wdGlvblByZWZpeENscywgXCItZ3JvdXBlZFwiKSwgZ3JvdXBPcHRpb24pLCBcIlwiLmNvbmNhdChvcHRpb25QcmVmaXhDbHMsIFwiLWFjdGl2ZVwiKSwgYWN0aXZlSW5kZXggPT09IGl0ZW1JbmRleCAmJiAhbWVyZ2VkRGlzYWJsZWQpLCBcIlwiLmNvbmNhdChvcHRpb25QcmVmaXhDbHMsIFwiLWRpc2FibGVkXCIpLCBtZXJnZWREaXNhYmxlZCksIFwiXCIuY29uY2F0KG9wdGlvblByZWZpeENscywgXCItc2VsZWN0ZWRcIiksIHNlbGVjdGVkKSk7XG4gICAgdmFyIG1lcmdlZExhYmVsID0gZ2V0TGFiZWwoaXRlbSk7XG4gICAgdmFyIGljb25WaXNpYmxlID0gIW1lbnVJdGVtU2VsZWN0ZWRJY29uIHx8IHR5cGVvZiBtZW51SXRlbVNlbGVjdGVkSWNvbiA9PT0gJ2Z1bmN0aW9uJyB8fCBzZWxlY3RlZDtcblxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzM0MTQ1XG4gICAgdmFyIGNvbnRlbnQgPSB0eXBlb2YgbWVyZ2VkTGFiZWwgPT09ICdudW1iZXInID8gbWVyZ2VkTGFiZWwgOiBtZXJnZWRMYWJlbCB8fCB2YWx1ZTtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8yNjcxN1xuICAgIHZhciBvcHRpb25UaXRsZSA9IGlzVGl0bGVUeXBlKGNvbnRlbnQpID8gY29udGVudC50b1N0cmluZygpIDogdW5kZWZpbmVkO1xuICAgIGlmICh0aXRsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBvcHRpb25UaXRsZSA9IHRpdGxlO1xuICAgIH1cbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe30sIHBpY2tBdHRycyhwYXNzZWRQcm9wcyksICF2aXJ0dWFsID8gZ2V0SXRlbUFyaWFQcm9wcyhpdGVtLCBpdGVtSW5kZXgpIDoge30sIHtcbiAgICAgIFwiYXJpYS1zZWxlY3RlZFwiOiBpc0FyaWFTZWxlY3RlZCh2YWx1ZSksXG4gICAgICBjbGFzc05hbWU6IG9wdGlvbkNsYXNzTmFtZSxcbiAgICAgIHRpdGxlOiBvcHRpb25UaXRsZSxcbiAgICAgIG9uTW91c2VNb3ZlOiBmdW5jdGlvbiBvbk1vdXNlTW92ZSgpIHtcbiAgICAgICAgaWYgKGFjdGl2ZUluZGV4ID09PSBpdGVtSW5kZXggfHwgbWVyZ2VkRGlzYWJsZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2V0QWN0aXZlKGl0ZW1JbmRleCk7XG4gICAgICB9LFxuICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgICAgaWYgKCFtZXJnZWREaXNhYmxlZCkge1xuICAgICAgICAgIG9uU2VsZWN0VmFsdWUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc3R5bGU6IHN0eWxlXG4gICAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQob3B0aW9uUHJlZml4Q2xzLCBcIi1jb250ZW50XCIpXG4gICAgfSwgdHlwZW9mIG9wdGlvblJlbmRlciA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvblJlbmRlcihpdGVtLCB7XG4gICAgICBpbmRleDogaXRlbUluZGV4XG4gICAgfSkgOiBjb250ZW50KSwgLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KG1lbnVJdGVtU2VsZWN0ZWRJY29uKSB8fCBzZWxlY3RlZCwgaWNvblZpc2libGUgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVHJhbnNCdG4sIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQoaXRlbVByZWZpeENscywgXCItb3B0aW9uLXN0YXRlXCIpLFxuICAgICAgY3VzdG9taXplSWNvbjogbWVudUl0ZW1TZWxlY3RlZEljb24sXG4gICAgICBjdXN0b21pemVJY29uUHJvcHM6IHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICBkaXNhYmxlZDogbWVyZ2VkRGlzYWJsZWQsXG4gICAgICAgIGlzU2VsZWN0ZWQ6IHNlbGVjdGVkXG4gICAgICB9XG4gICAgfSwgc2VsZWN0ZWQgPyAnXHUyNzEzJyA6IG51bGwpKTtcbiAgfSkpO1xufTtcbnZhciBSZWZPcHRpb25MaXN0ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoT3B0aW9uTGlzdCk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBSZWZPcHRpb25MaXN0LmRpc3BsYXlOYW1lID0gJ09wdGlvbkxpc3QnO1xufVxuZXhwb3J0IGRlZmF1bHQgUmVmT3B0aW9uTGlzdDsiLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJwcmVmaXhDbHNcIiwgXCJjbGFzc05hbWVcIiwgXCJoZWlnaHRcIiwgXCJpdGVtSGVpZ2h0XCIsIFwiZnVsbEhlaWdodFwiLCBcInN0eWxlXCIsIFwiZGF0YVwiLCBcImNoaWxkcmVuXCIsIFwiaXRlbUtleVwiLCBcInZpcnR1YWxcIiwgXCJkaXJlY3Rpb25cIiwgXCJzY3JvbGxXaWR0aFwiLCBcImNvbXBvbmVudFwiLCBcIm9uU2Nyb2xsXCIsIFwib25WaXJ0dWFsU2Nyb2xsXCIsIFwib25WaXNpYmxlQ2hhbmdlXCIsIFwiaW5uZXJQcm9wc1wiLCBcImV4dHJhUmVuZGVyXCIsIFwic3R5bGVzXCIsIFwic2hvd1Njcm9sbEJhclwiXTtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFJlc2l6ZU9ic2VydmVyIGZyb20gJ3JjLXJlc2l6ZS1vYnNlcnZlcic7XG5pbXBvcnQgeyB1c2VFdmVudCB9IGZyb20gJ3JjLXV0aWwnO1xuaW1wb3J0IHVzZUxheW91dEVmZmVjdCBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VMYXlvdXRFZmZlY3RcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBmbHVzaFN5bmMgfSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IEZpbGxlciBmcm9tIFwiLi9GaWxsZXJcIjtcbmltcG9ydCB1c2VDaGlsZHJlbiBmcm9tIFwiLi9ob29rcy91c2VDaGlsZHJlblwiO1xuaW1wb3J0IHVzZURpZmZJdGVtIGZyb20gXCIuL2hvb2tzL3VzZURpZmZJdGVtXCI7XG5pbXBvcnQgdXNlRnJhbWVXaGVlbCBmcm9tIFwiLi9ob29rcy91c2VGcmFtZVdoZWVsXCI7XG5pbXBvcnQgeyB1c2VHZXRTaXplIH0gZnJvbSBcIi4vaG9va3MvdXNlR2V0U2l6ZVwiO1xuaW1wb3J0IHVzZUhlaWdodHMgZnJvbSBcIi4vaG9va3MvdXNlSGVpZ2h0c1wiO1xuaW1wb3J0IHVzZU1vYmlsZVRvdWNoTW92ZSBmcm9tIFwiLi9ob29rcy91c2VNb2JpbGVUb3VjaE1vdmVcIjtcbmltcG9ydCB1c2VPcmlnaW5TY3JvbGwgZnJvbSBcIi4vaG9va3MvdXNlT3JpZ2luU2Nyb2xsXCI7XG5pbXBvcnQgdXNlU2Nyb2xsRHJhZyBmcm9tIFwiLi9ob29rcy91c2VTY3JvbGxEcmFnXCI7XG5pbXBvcnQgdXNlU2Nyb2xsVG8gZnJvbSBcIi4vaG9va3MvdXNlU2Nyb2xsVG9cIjtcbmltcG9ydCBTY3JvbGxCYXIgZnJvbSBcIi4vU2Nyb2xsQmFyXCI7XG5pbXBvcnQgeyBnZXRTcGluU2l6ZSB9IGZyb20gXCIuL3V0aWxzL3Njcm9sbGJhclV0aWxcIjtcbnZhciBFTVBUWV9EQVRBID0gW107XG52YXIgU2Nyb2xsU3R5bGUgPSB7XG4gIG92ZXJmbG93WTogJ2F1dG8nLFxuICBvdmVyZmxvd0FuY2hvcjogJ25vbmUnXG59O1xuZXhwb3J0IGZ1bmN0aW9uIFJhd0xpc3QocHJvcHMsIHJlZikge1xuICB2YXIgX3Byb3BzJHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBwcmVmaXhDbHMgPSBfcHJvcHMkcHJlZml4Q2xzID09PSB2b2lkIDAgPyAncmMtdmlydHVhbC1saXN0JyA6IF9wcm9wcyRwcmVmaXhDbHMsXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIGhlaWdodCA9IHByb3BzLmhlaWdodCxcbiAgICBpdGVtSGVpZ2h0ID0gcHJvcHMuaXRlbUhlaWdodCxcbiAgICBfcHJvcHMkZnVsbEhlaWdodCA9IHByb3BzLmZ1bGxIZWlnaHQsXG4gICAgZnVsbEhlaWdodCA9IF9wcm9wcyRmdWxsSGVpZ2h0ID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJGZ1bGxIZWlnaHQsXG4gICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICBkYXRhID0gcHJvcHMuZGF0YSxcbiAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgIGl0ZW1LZXkgPSBwcm9wcy5pdGVtS2V5LFxuICAgIHZpcnR1YWwgPSBwcm9wcy52aXJ0dWFsLFxuICAgIGRpcmVjdGlvbiA9IHByb3BzLmRpcmVjdGlvbixcbiAgICBzY3JvbGxXaWR0aCA9IHByb3BzLnNjcm9sbFdpZHRoLFxuICAgIF9wcm9wcyRjb21wb25lbnQgPSBwcm9wcy5jb21wb25lbnQsXG4gICAgQ29tcG9uZW50ID0gX3Byb3BzJGNvbXBvbmVudCA9PT0gdm9pZCAwID8gJ2RpdicgOiBfcHJvcHMkY29tcG9uZW50LFxuICAgIG9uU2Nyb2xsID0gcHJvcHMub25TY3JvbGwsXG4gICAgb25WaXJ0dWFsU2Nyb2xsID0gcHJvcHMub25WaXJ0dWFsU2Nyb2xsLFxuICAgIG9uVmlzaWJsZUNoYW5nZSA9IHByb3BzLm9uVmlzaWJsZUNoYW5nZSxcbiAgICBpbm5lclByb3BzID0gcHJvcHMuaW5uZXJQcm9wcyxcbiAgICBleHRyYVJlbmRlciA9IHByb3BzLmV4dHJhUmVuZGVyLFxuICAgIHN0eWxlcyA9IHByb3BzLnN0eWxlcyxcbiAgICBfcHJvcHMkc2hvd1Njcm9sbEJhciA9IHByb3BzLnNob3dTY3JvbGxCYXIsXG4gICAgc2hvd1Njcm9sbEJhciA9IF9wcm9wcyRzaG93U2Nyb2xsQmFyID09PSB2b2lkIDAgPyAnb3B0aW9uYWwnIDogX3Byb3BzJHNob3dTY3JvbGxCYXIsXG4gICAgcmVzdFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBfZXhjbHVkZWQpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSXRlbSBLZXkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgZ2V0S2V5ID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICBpZiAodHlwZW9mIGl0ZW1LZXkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBpdGVtS2V5KGl0ZW0pO1xuICAgIH1cbiAgICByZXR1cm4gaXRlbSA9PT0gbnVsbCB8fCBpdGVtID09PSB2b2lkIDAgPyB2b2lkIDAgOiBpdGVtW2l0ZW1LZXldO1xuICB9LCBbaXRlbUtleV0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEhlaWdodCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX3VzZUhlaWdodHMgPSB1c2VIZWlnaHRzKGdldEtleSwgbnVsbCwgbnVsbCksXG4gICAgX3VzZUhlaWdodHMyID0gX3NsaWNlZFRvQXJyYXkoX3VzZUhlaWdodHMsIDQpLFxuICAgIHNldEluc3RhbmNlUmVmID0gX3VzZUhlaWdodHMyWzBdLFxuICAgIGNvbGxlY3RIZWlnaHQgPSBfdXNlSGVpZ2h0czJbMV0sXG4gICAgaGVpZ2h0cyA9IF91c2VIZWlnaHRzMlsyXSxcbiAgICBoZWlnaHRVcGRhdGVkTWFyayA9IF91c2VIZWlnaHRzMlszXTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gTUlTQyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHVzZVZpcnR1YWwgPSAhISh2aXJ0dWFsICE9PSBmYWxzZSAmJiBoZWlnaHQgJiYgaXRlbUhlaWdodCk7XG4gIHZhciBjb250YWluZXJIZWlnaHQgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhoZWlnaHRzLm1hcHMpLnJlZHVjZShmdW5jdGlvbiAodG90YWwsIGN1cnIpIHtcbiAgICAgIHJldHVybiB0b3RhbCArIGN1cnI7XG4gICAgfSwgMCk7XG4gIH0sIFtoZWlnaHRzLmlkLCBoZWlnaHRzLm1hcHNdKTtcbiAgdmFyIGluVmlydHVhbCA9IHVzZVZpcnR1YWwgJiYgZGF0YSAmJiAoTWF0aC5tYXgoaXRlbUhlaWdodCAqIGRhdGEubGVuZ3RoLCBjb250YWluZXJIZWlnaHQpID4gaGVpZ2h0IHx8ICEhc2Nyb2xsV2lkdGgpO1xuICB2YXIgaXNSVEwgPSBkaXJlY3Rpb24gPT09ICdydGwnO1xuICB2YXIgbWVyZ2VkQ2xhc3NOYW1lID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIGlzUlRMKSwgY2xhc3NOYW1lKTtcbiAgdmFyIG1lcmdlZERhdGEgPSBkYXRhIHx8IEVNUFRZX0RBVEE7XG4gIHZhciBjb21wb25lbnRSZWYgPSB1c2VSZWYoKTtcbiAgdmFyIGZpbGxlcklubmVyUmVmID0gdXNlUmVmKCk7XG4gIHZhciBjb250YWluZXJSZWYgPSB1c2VSZWYoKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEl0ZW0gS2V5ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUoMCksXG4gICAgX3VzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZSwgMiksXG4gICAgb2Zmc2V0VG9wID0gX3VzZVN0YXRlMlswXSxcbiAgICBzZXRPZmZzZXRUb3AgPSBfdXNlU3RhdGUyWzFdO1xuICB2YXIgX3VzZVN0YXRlMyA9IHVzZVN0YXRlKDApLFxuICAgIF91c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUzLCAyKSxcbiAgICBvZmZzZXRMZWZ0ID0gX3VzZVN0YXRlNFswXSxcbiAgICBzZXRPZmZzZXRMZWZ0ID0gX3VzZVN0YXRlNFsxXTtcbiAgdmFyIF91c2VTdGF0ZTUgPSB1c2VTdGF0ZShmYWxzZSksXG4gICAgX3VzZVN0YXRlNiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZTUsIDIpLFxuICAgIHNjcm9sbE1vdmluZyA9IF91c2VTdGF0ZTZbMF0sXG4gICAgc2V0U2Nyb2xsTW92aW5nID0gX3VzZVN0YXRlNlsxXTtcbiAgdmFyIG9uU2Nyb2xsYmFyU3RhcnRNb3ZlID0gZnVuY3Rpb24gb25TY3JvbGxiYXJTdGFydE1vdmUoKSB7XG4gICAgc2V0U2Nyb2xsTW92aW5nKHRydWUpO1xuICB9O1xuICB2YXIgb25TY3JvbGxiYXJTdG9wTW92ZSA9IGZ1bmN0aW9uIG9uU2Nyb2xsYmFyU3RvcE1vdmUoKSB7XG4gICAgc2V0U2Nyb2xsTW92aW5nKGZhbHNlKTtcbiAgfTtcbiAgdmFyIHNoYXJlZENvbmZpZyA9IHtcbiAgICBnZXRLZXk6IGdldEtleVxuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNjcm9sbCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBmdW5jdGlvbiBzeW5jU2Nyb2xsVG9wKG5ld1RvcCkge1xuICAgIHNldE9mZnNldFRvcChmdW5jdGlvbiAob3JpZ2luKSB7XG4gICAgICB2YXIgdmFsdWU7XG4gICAgICBpZiAodHlwZW9mIG5ld1RvcCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YWx1ZSA9IG5ld1RvcChvcmlnaW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSBuZXdUb3A7XG4gICAgICB9XG4gICAgICB2YXIgYWxpZ25lZFRvcCA9IGtlZXBJblJhbmdlKHZhbHVlKTtcbiAgICAgIGNvbXBvbmVudFJlZi5jdXJyZW50LnNjcm9sbFRvcCA9IGFsaWduZWRUb3A7XG4gICAgICByZXR1cm4gYWxpZ25lZFRvcDtcbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IExlZ2FjeSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQdXQgcmVmIGhlcmUgc2luY2UgdGhlIHJhbmdlIGlzIGdlbmVyYXRlIGJ5IGZvbGxvd1xuICB2YXIgcmFuZ2VSZWYgPSB1c2VSZWYoe1xuICAgIHN0YXJ0OiAwLFxuICAgIGVuZDogbWVyZ2VkRGF0YS5sZW5ndGhcbiAgfSk7XG4gIHZhciBkaWZmSXRlbVJlZiA9IHVzZVJlZigpO1xuICB2YXIgX3VzZURpZmZJdGVtID0gdXNlRGlmZkl0ZW0obWVyZ2VkRGF0YSwgZ2V0S2V5KSxcbiAgICBfdXNlRGlmZkl0ZW0yID0gX3NsaWNlZFRvQXJyYXkoX3VzZURpZmZJdGVtLCAxKSxcbiAgICBkaWZmSXRlbSA9IF91c2VEaWZmSXRlbTJbMF07XG4gIGRpZmZJdGVtUmVmLmN1cnJlbnQgPSBkaWZmSXRlbTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBWaXNpYmxlIENhbGN1bGF0aW9uID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF9SZWFjdCR1c2VNZW1vID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIXVzZVZpcnR1YWwpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzY3JvbGxIZWlnaHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICBzdGFydDogMCxcbiAgICAgICAgICBlbmQ6IG1lcmdlZERhdGEubGVuZ3RoIC0gMSxcbiAgICAgICAgICBvZmZzZXQ6IHVuZGVmaW5lZFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBBbHdheXMgdXNlIHZpcnR1YWwgc2Nyb2xsIGJhciBpbiBhdm9pZCBzaGFraW5nXG4gICAgICBpZiAoIWluVmlydHVhbCkge1xuICAgICAgICB2YXIgX2ZpbGxlcklubmVyUmVmJGN1cnJlO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNjcm9sbEhlaWdodDogKChfZmlsbGVySW5uZXJSZWYkY3VycmUgPSBmaWxsZXJJbm5lclJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfZmlsbGVySW5uZXJSZWYkY3VycmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9maWxsZXJJbm5lclJlZiRjdXJyZS5vZmZzZXRIZWlnaHQpIHx8IDAsXG4gICAgICAgICAgc3RhcnQ6IDAsXG4gICAgICAgICAgZW5kOiBtZXJnZWREYXRhLmxlbmd0aCAtIDEsXG4gICAgICAgICAgb2Zmc2V0OiB1bmRlZmluZWRcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHZhciBpdGVtVG9wID0gMDtcbiAgICAgIHZhciBzdGFydEluZGV4O1xuICAgICAgdmFyIHN0YXJ0T2Zmc2V0O1xuICAgICAgdmFyIGVuZEluZGV4O1xuICAgICAgdmFyIGRhdGFMZW4gPSBtZXJnZWREYXRhLmxlbmd0aDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YUxlbjsgaSArPSAxKSB7XG4gICAgICAgIHZhciBfaXRlbSA9IG1lcmdlZERhdGFbaV07XG4gICAgICAgIHZhciBrZXkgPSBnZXRLZXkoX2l0ZW0pO1xuICAgICAgICB2YXIgY2FjaGVIZWlnaHQgPSBoZWlnaHRzLmdldChrZXkpO1xuICAgICAgICB2YXIgY3VycmVudEl0ZW1Cb3R0b20gPSBpdGVtVG9wICsgKGNhY2hlSGVpZ2h0ID09PSB1bmRlZmluZWQgPyBpdGVtSGVpZ2h0IDogY2FjaGVIZWlnaHQpO1xuXG4gICAgICAgIC8vIENoZWNrIGl0ZW0gdG9wIGluIHRoZSByYW5nZVxuICAgICAgICBpZiAoY3VycmVudEl0ZW1Cb3R0b20gPj0gb2Zmc2V0VG9wICYmIHN0YXJ0SW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHN0YXJ0SW5kZXggPSBpO1xuICAgICAgICAgIHN0YXJ0T2Zmc2V0ID0gaXRlbVRvcDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGl0ZW0gYm90dG9tIGluIHRoZSByYW5nZS4gV2Ugd2lsbCByZW5kZXIgYWRkaXRpb25hbCBvbmUgaXRlbSBmb3IgbW90aW9uIHVzYWdlXG4gICAgICAgIGlmIChjdXJyZW50SXRlbUJvdHRvbSA+IG9mZnNldFRvcCArIGhlaWdodCAmJiBlbmRJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZW5kSW5kZXggPSBpO1xuICAgICAgICB9XG4gICAgICAgIGl0ZW1Ub3AgPSBjdXJyZW50SXRlbUJvdHRvbTtcbiAgICAgIH1cblxuICAgICAgLy8gV2hlbiBzY3JvbGxUb3AgYXQgdGhlIGVuZCBidXQgZGF0YSBjdXQgdG8gc21hbGwgY291bnQgd2lsbCByZWFjaCB0aGlzXG4gICAgICBpZiAoc3RhcnRJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHN0YXJ0SW5kZXggPSAwO1xuICAgICAgICBzdGFydE9mZnNldCA9IDA7XG4gICAgICAgIGVuZEluZGV4ID0gTWF0aC5jZWlsKGhlaWdodCAvIGl0ZW1IZWlnaHQpO1xuICAgICAgfVxuICAgICAgaWYgKGVuZEluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZW5kSW5kZXggPSBtZXJnZWREYXRhLmxlbmd0aCAtIDE7XG4gICAgICB9XG5cbiAgICAgIC8vIEdpdmUgY2FjaGUgdG8gaW1wcm92ZSBzY3JvbGwgZXhwZXJpZW5jZVxuICAgICAgZW5kSW5kZXggPSBNYXRoLm1pbihlbmRJbmRleCArIDEsIG1lcmdlZERhdGEubGVuZ3RoIC0gMSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzY3JvbGxIZWlnaHQ6IGl0ZW1Ub3AsXG4gICAgICAgIHN0YXJ0OiBzdGFydEluZGV4LFxuICAgICAgICBlbmQ6IGVuZEluZGV4LFxuICAgICAgICBvZmZzZXQ6IHN0YXJ0T2Zmc2V0XG4gICAgICB9O1xuICAgIH0sIFtpblZpcnR1YWwsIHVzZVZpcnR1YWwsIG9mZnNldFRvcCwgbWVyZ2VkRGF0YSwgaGVpZ2h0VXBkYXRlZE1hcmssIGhlaWdodF0pLFxuICAgIHNjcm9sbEhlaWdodCA9IF9SZWFjdCR1c2VNZW1vLnNjcm9sbEhlaWdodCxcbiAgICBzdGFydCA9IF9SZWFjdCR1c2VNZW1vLnN0YXJ0LFxuICAgIGVuZCA9IF9SZWFjdCR1c2VNZW1vLmVuZCxcbiAgICBmaWxsZXJPZmZzZXQgPSBfUmVhY3QkdXNlTWVtby5vZmZzZXQ7XG4gIHJhbmdlUmVmLmN1cnJlbnQuc3RhcnQgPSBzdGFydDtcbiAgcmFuZ2VSZWYuY3VycmVudC5lbmQgPSBlbmQ7XG5cbiAgLy8gV2hlbiBzY3JvbGwgdXAsIGZpcnN0IHZpc2libGUgaXRlbSBnZXQgcmVhbCBoZWlnaHQgbWF5IG5vdCBzYW1lIGFzIGBpdGVtSGVpZ2h0YCxcbiAgLy8gV2hpY2ggd2lsbCBtYWtlIHNjcm9sbCBqdW1wLlxuICAvLyBMZXQncyBzeW5jIHNjcm9sbCB0b3AgdG8gYXZvaWQganVtcFxuICBSZWFjdC51c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBjaGFuZ2VkUmVjb3JkID0gaGVpZ2h0cy5nZXRSZWNvcmQoKTtcbiAgICBpZiAoY2hhbmdlZFJlY29yZC5zaXplID09PSAxKSB7XG4gICAgICB2YXIgcmVjb3JkS2V5ID0gQXJyYXkuZnJvbShjaGFuZ2VkUmVjb3JkKVswXTtcbiAgICAgIC8vIFF1aWNrIHN3aXRjaCBkYXRhIG1heSBjYXVzZSBgc3RhcnRgIG5vdCBpbiBgbWVyZ2VkRGF0YWAgYW55bW9yZVxuICAgICAgdmFyIHN0YXJ0SXRlbSA9IG1lcmdlZERhdGFbc3RhcnRdO1xuICAgICAgaWYgKHN0YXJ0SXRlbSkge1xuICAgICAgICB2YXIgc3RhcnRJbmRleEtleSA9IGdldEtleShzdGFydEl0ZW0pO1xuICAgICAgICBpZiAoc3RhcnRJbmRleEtleSA9PT0gcmVjb3JkS2V5KSB7XG4gICAgICAgICAgdmFyIHJlYWxTdGFydEhlaWdodCA9IGhlaWdodHMuZ2V0KHJlY29yZEtleSk7XG4gICAgICAgICAgdmFyIGRpZmZIZWlnaHQgPSByZWFsU3RhcnRIZWlnaHQgLSBpdGVtSGVpZ2h0O1xuICAgICAgICAgIHN5bmNTY3JvbGxUb3AoZnVuY3Rpb24gKG9yaSkge1xuICAgICAgICAgICAgcmV0dXJuIG9yaSArIGRpZmZIZWlnaHQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaGVpZ2h0cy5yZXNldFJlY29yZCgpO1xuICB9LCBbc2Nyb2xsSGVpZ2h0XSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNpemUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZSh7XG4gICAgICB3aWR0aDogMCxcbiAgICAgIGhlaWdodDogaGVpZ2h0XG4gICAgfSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgc2l6ZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0U2l6ZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciBvbkhvbGRlclJlc2l6ZSA9IGZ1bmN0aW9uIG9uSG9sZGVyUmVzaXplKHNpemVJbmZvKSB7XG4gICAgc2V0U2l6ZSh7XG4gICAgICB3aWR0aDogc2l6ZUluZm8ub2Zmc2V0V2lkdGgsXG4gICAgICBoZWlnaHQ6IHNpemVJbmZvLm9mZnNldEhlaWdodFxuICAgIH0pO1xuICB9O1xuXG4gIC8vIEhhY2sgb24gc2Nyb2xsYmFyIHRvIGVuYWJsZSBmbGFzaCBjYWxsXG4gIHZhciB2ZXJ0aWNhbFNjcm9sbEJhclJlZiA9IHVzZVJlZigpO1xuICB2YXIgaG9yaXpvbnRhbFNjcm9sbEJhclJlZiA9IHVzZVJlZigpO1xuICB2YXIgaG9yaXpvbnRhbFNjcm9sbEJhclNwaW5TaXplID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGdldFNwaW5TaXplKHNpemUud2lkdGgsIHNjcm9sbFdpZHRoKTtcbiAgfSwgW3NpemUud2lkdGgsIHNjcm9sbFdpZHRoXSk7XG4gIHZhciB2ZXJ0aWNhbFNjcm9sbEJhclNwaW5TaXplID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGdldFNwaW5TaXplKHNpemUuaGVpZ2h0LCBzY3JvbGxIZWlnaHQpO1xuICB9LCBbc2l6ZS5oZWlnaHQsIHNjcm9sbEhlaWdodF0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSW4gUmFuZ2UgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgbWF4U2Nyb2xsSGVpZ2h0ID0gc2Nyb2xsSGVpZ2h0IC0gaGVpZ2h0O1xuICB2YXIgbWF4U2Nyb2xsSGVpZ2h0UmVmID0gdXNlUmVmKG1heFNjcm9sbEhlaWdodCk7XG4gIG1heFNjcm9sbEhlaWdodFJlZi5jdXJyZW50ID0gbWF4U2Nyb2xsSGVpZ2h0O1xuICBmdW5jdGlvbiBrZWVwSW5SYW5nZShuZXdTY3JvbGxUb3ApIHtcbiAgICB2YXIgbmV3VG9wID0gbmV3U2Nyb2xsVG9wO1xuICAgIGlmICghTnVtYmVyLmlzTmFOKG1heFNjcm9sbEhlaWdodFJlZi5jdXJyZW50KSkge1xuICAgICAgbmV3VG9wID0gTWF0aC5taW4obmV3VG9wLCBtYXhTY3JvbGxIZWlnaHRSZWYuY3VycmVudCk7XG4gICAgfVxuICAgIG5ld1RvcCA9IE1hdGgubWF4KG5ld1RvcCwgMCk7XG4gICAgcmV0dXJuIG5ld1RvcDtcbiAgfVxuICB2YXIgaXNTY3JvbGxBdFRvcCA9IG9mZnNldFRvcCA8PSAwO1xuICB2YXIgaXNTY3JvbGxBdEJvdHRvbSA9IG9mZnNldFRvcCA+PSBtYXhTY3JvbGxIZWlnaHQ7XG4gIHZhciBpc1Njcm9sbEF0TGVmdCA9IG9mZnNldExlZnQgPD0gMDtcbiAgdmFyIGlzU2Nyb2xsQXRSaWdodCA9IG9mZnNldExlZnQgPj0gc2Nyb2xsV2lkdGg7XG4gIHZhciBvcmlnaW5TY3JvbGwgPSB1c2VPcmlnaW5TY3JvbGwoaXNTY3JvbGxBdFRvcCwgaXNTY3JvbGxBdEJvdHRvbSwgaXNTY3JvbGxBdExlZnQsIGlzU2Nyb2xsQXRSaWdodCk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU2Nyb2xsID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBnZXRWaXJ0dWFsU2Nyb2xsSW5mbyA9IGZ1bmN0aW9uIGdldFZpcnR1YWxTY3JvbGxJbmZvKCkge1xuICAgIHJldHVybiB7XG4gICAgICB4OiBpc1JUTCA/IC1vZmZzZXRMZWZ0IDogb2Zmc2V0TGVmdCxcbiAgICAgIHk6IG9mZnNldFRvcFxuICAgIH07XG4gIH07XG4gIHZhciBsYXN0VmlydHVhbFNjcm9sbEluZm9SZWYgPSB1c2VSZWYoZ2V0VmlydHVhbFNjcm9sbEluZm8oKSk7XG4gIHZhciB0cmlnZ2VyU2Nyb2xsID0gdXNlRXZlbnQoZnVuY3Rpb24gKHBhcmFtcykge1xuICAgIGlmIChvblZpcnR1YWxTY3JvbGwpIHtcbiAgICAgIHZhciBuZXh0SW5mbyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZ2V0VmlydHVhbFNjcm9sbEluZm8oKSksIHBhcmFtcyk7XG5cbiAgICAgIC8vIFRyaWdnZXIgd2hlbiBvZmZzZXQgY2hhbmdlZFxuICAgICAgaWYgKGxhc3RWaXJ0dWFsU2Nyb2xsSW5mb1JlZi5jdXJyZW50LnggIT09IG5leHRJbmZvLnggfHwgbGFzdFZpcnR1YWxTY3JvbGxJbmZvUmVmLmN1cnJlbnQueSAhPT0gbmV4dEluZm8ueSkge1xuICAgICAgICBvblZpcnR1YWxTY3JvbGwobmV4dEluZm8pO1xuICAgICAgICBsYXN0VmlydHVhbFNjcm9sbEluZm9SZWYuY3VycmVudCA9IG5leHRJbmZvO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIGZ1bmN0aW9uIG9uU2Nyb2xsQmFyKG5ld1Njcm9sbE9mZnNldCwgaG9yaXpvbnRhbCkge1xuICAgIHZhciBuZXdPZmZzZXQgPSBuZXdTY3JvbGxPZmZzZXQ7XG4gICAgaWYgKGhvcml6b250YWwpIHtcbiAgICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNldE9mZnNldExlZnQobmV3T2Zmc2V0KTtcbiAgICAgIH0pO1xuICAgICAgdHJpZ2dlclNjcm9sbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzeW5jU2Nyb2xsVG9wKG5ld09mZnNldCk7XG4gICAgfVxuICB9XG5cbiAgLy8gV2hlbiBkYXRhIHNpemUgcmVkdWNlLiBJdCBtYXkgdHJpZ2dlciBuYXRpdmUgc2Nyb2xsIGV2ZW50IGJhY2sgdG8gZml0IHNjcm9sbCBwb3NpdGlvblxuICBmdW5jdGlvbiBvbkZhbGxiYWNrU2Nyb2xsKGUpIHtcbiAgICB2YXIgbmV3U2Nyb2xsVG9wID0gZS5jdXJyZW50VGFyZ2V0LnNjcm9sbFRvcDtcbiAgICBpZiAobmV3U2Nyb2xsVG9wICE9PSBvZmZzZXRUb3ApIHtcbiAgICAgIHN5bmNTY3JvbGxUb3AobmV3U2Nyb2xsVG9wKTtcbiAgICB9XG5cbiAgICAvLyBUcmlnZ2VyIG9yaWdpbiBvblNjcm9sbFxuICAgIG9uU2Nyb2xsID09PSBudWxsIHx8IG9uU2Nyb2xsID09PSB2b2lkIDAgfHwgb25TY3JvbGwoZSk7XG4gICAgdHJpZ2dlclNjcm9sbCgpO1xuICB9XG4gIHZhciBrZWVwSW5Ib3Jpem9udGFsUmFuZ2UgPSBmdW5jdGlvbiBrZWVwSW5Ib3Jpem9udGFsUmFuZ2UobmV4dE9mZnNldExlZnQpIHtcbiAgICB2YXIgdG1wT2Zmc2V0TGVmdCA9IG5leHRPZmZzZXRMZWZ0O1xuICAgIHZhciBtYXggPSAhIXNjcm9sbFdpZHRoID8gc2Nyb2xsV2lkdGggLSBzaXplLndpZHRoIDogMDtcbiAgICB0bXBPZmZzZXRMZWZ0ID0gTWF0aC5tYXgodG1wT2Zmc2V0TGVmdCwgMCk7XG4gICAgdG1wT2Zmc2V0TGVmdCA9IE1hdGgubWluKHRtcE9mZnNldExlZnQsIG1heCk7XG4gICAgcmV0dXJuIHRtcE9mZnNldExlZnQ7XG4gIH07XG4gIHZhciBvbldoZWVsRGVsdGEgPSB1c2VFdmVudChmdW5jdGlvbiAob2Zmc2V0WFksIGZyb21Ib3Jpem9udGFsKSB7XG4gICAgaWYgKGZyb21Ib3Jpem9udGFsKSB7XG4gICAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgICBzZXRPZmZzZXRMZWZ0KGZ1bmN0aW9uIChsZWZ0KSB7XG4gICAgICAgICAgdmFyIG5leHRPZmZzZXRMZWZ0ID0gbGVmdCArIChpc1JUTCA/IC1vZmZzZXRYWSA6IG9mZnNldFhZKTtcbiAgICAgICAgICByZXR1cm4ga2VlcEluSG9yaXpvbnRhbFJhbmdlKG5leHRPZmZzZXRMZWZ0KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHRyaWdnZXJTY3JvbGwoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3luY1Njcm9sbFRvcChmdW5jdGlvbiAodG9wKSB7XG4gICAgICAgIHZhciBuZXdUb3AgPSB0b3AgKyBvZmZzZXRYWTtcbiAgICAgICAgcmV0dXJuIG5ld1RvcDtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gU2luY2UgdGhpcyBhZGRlZCBpbiBnbG9iYWwsc2hvdWxkIHVzZSByZWYgdG8ga2VlcCB1cGRhdGVcbiAgdmFyIF91c2VGcmFtZVdoZWVsID0gdXNlRnJhbWVXaGVlbCh1c2VWaXJ0dWFsLCBpc1Njcm9sbEF0VG9wLCBpc1Njcm9sbEF0Qm90dG9tLCBpc1Njcm9sbEF0TGVmdCwgaXNTY3JvbGxBdFJpZ2h0LCAhIXNjcm9sbFdpZHRoLCBvbldoZWVsRGVsdGEpLFxuICAgIF91c2VGcmFtZVdoZWVsMiA9IF9zbGljZWRUb0FycmF5KF91c2VGcmFtZVdoZWVsLCAyKSxcbiAgICBvblJhd1doZWVsID0gX3VzZUZyYW1lV2hlZWwyWzBdLFxuICAgIG9uRmlyZUZveFNjcm9sbCA9IF91c2VGcmFtZVdoZWVsMlsxXTtcblxuICAvLyBNb2JpbGUgdG91Y2ggbW92ZVxuICB1c2VNb2JpbGVUb3VjaE1vdmUodXNlVmlydHVhbCwgY29tcG9uZW50UmVmLCBmdW5jdGlvbiAoaXNIb3Jpem9udGFsLCBkZWx0YSwgc21vb3RoT2Zmc2V0LCBlKSB7XG4gICAgdmFyIGV2ZW50ID0gZTtcbiAgICBpZiAob3JpZ2luU2Nyb2xsKGlzSG9yaXpvbnRhbCwgZGVsdGEsIHNtb290aE9mZnNldCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBGaXggbmVzdCBMaXN0IHRyaWdnZXIgVG91Y2hNb3ZlIGV2ZW50XG4gICAgaWYgKCFldmVudCB8fCAhZXZlbnQuX3ZpcnR1YWxIYW5kbGVkKSB7XG4gICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgZXZlbnQuX3ZpcnR1YWxIYW5kbGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIG9uUmF3V2hlZWwoe1xuICAgICAgICBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24gcHJldmVudERlZmF1bHQoKSB7fSxcbiAgICAgICAgZGVsdGFYOiBpc0hvcml6b250YWwgPyBkZWx0YSA6IDAsXG4gICAgICAgIGRlbHRhWTogaXNIb3Jpem9udGFsID8gMCA6IGRlbHRhXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0pO1xuXG4gIC8vIE1vdXNlRG93biBkcmFnIGZvciBzY3JvbGxcbiAgdXNlU2Nyb2xsRHJhZyhpblZpcnR1YWwsIGNvbXBvbmVudFJlZiwgZnVuY3Rpb24gKG9mZnNldCkge1xuICAgIHN5bmNTY3JvbGxUb3AoZnVuY3Rpb24gKHRvcCkge1xuICAgICAgcmV0dXJuIHRvcCArIG9mZnNldDtcbiAgICB9KTtcbiAgfSk7XG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgLy8gRmlyZWZveCBvbmx5XG4gICAgZnVuY3Rpb24gb25Nb3pNb3VzZVBpeGVsU2Nyb2xsKGUpIHtcbiAgICAgIC8vIHNjcm9sbGluZyBhdCB0b3AvYm90dG9tIGxpbWl0XG4gICAgICB2YXIgc2Nyb2xsaW5nVXBBdFRvcCA9IGlzU2Nyb2xsQXRUb3AgJiYgZS5kZXRhaWwgPCAwO1xuICAgICAgdmFyIHNjcm9sbGluZ0Rvd25BdEJvdHRvbSA9IGlzU2Nyb2xsQXRCb3R0b20gJiYgZS5kZXRhaWwgPiAwO1xuICAgICAgaWYgKHVzZVZpcnR1YWwgJiYgIXNjcm9sbGluZ1VwQXRUb3AgJiYgIXNjcm9sbGluZ0Rvd25BdEJvdHRvbSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBjb21wb25lbnRFbGUgPSBjb21wb25lbnRSZWYuY3VycmVudDtcbiAgICBjb21wb25lbnRFbGUuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCBvblJhd1doZWVsLCB7XG4gICAgICBwYXNzaXZlOiBmYWxzZVxuICAgIH0pO1xuICAgIGNvbXBvbmVudEVsZS5hZGRFdmVudExpc3RlbmVyKCdET01Nb3VzZVNjcm9sbCcsIG9uRmlyZUZveFNjcm9sbCwge1xuICAgICAgcGFzc2l2ZTogdHJ1ZVxuICAgIH0pO1xuICAgIGNvbXBvbmVudEVsZS5hZGRFdmVudExpc3RlbmVyKCdNb3pNb3VzZVBpeGVsU2Nyb2xsJywgb25Nb3pNb3VzZVBpeGVsU2Nyb2xsLCB7XG4gICAgICBwYXNzaXZlOiBmYWxzZVxuICAgIH0pO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBjb21wb25lbnRFbGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCBvblJhd1doZWVsKTtcbiAgICAgIGNvbXBvbmVudEVsZS5yZW1vdmVFdmVudExpc3RlbmVyKCdET01Nb3VzZVNjcm9sbCcsIG9uRmlyZUZveFNjcm9sbCk7XG4gICAgICBjb21wb25lbnRFbGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignTW96TW91c2VQaXhlbFNjcm9sbCcsIG9uTW96TW91c2VQaXhlbFNjcm9sbCk7XG4gICAgfTtcbiAgfSwgW3VzZVZpcnR1YWwsIGlzU2Nyb2xsQXRUb3AsIGlzU2Nyb2xsQXRCb3R0b21dKTtcblxuICAvLyBTeW5jIHNjcm9sbCBsZWZ0XG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHNjcm9sbFdpZHRoKSB7XG4gICAgICB2YXIgbmV3T2Zmc2V0TGVmdCA9IGtlZXBJbkhvcml6b250YWxSYW5nZShvZmZzZXRMZWZ0KTtcbiAgICAgIHNldE9mZnNldExlZnQobmV3T2Zmc2V0TGVmdCk7XG4gICAgICB0cmlnZ2VyU2Nyb2xsKHtcbiAgICAgICAgeDogbmV3T2Zmc2V0TGVmdFxuICAgICAgfSk7XG4gICAgfVxuICB9LCBbc2l6ZS53aWR0aCwgc2Nyb2xsV2lkdGhdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVmID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGRlbGF5SGlkZVNjcm9sbEJhciA9IGZ1bmN0aW9uIGRlbGF5SGlkZVNjcm9sbEJhcigpIHtcbiAgICB2YXIgX3ZlcnRpY2FsU2Nyb2xsQmFyUmVmLCBfaG9yaXpvbnRhbFNjcm9sbEJhclI7XG4gICAgKF92ZXJ0aWNhbFNjcm9sbEJhclJlZiA9IHZlcnRpY2FsU2Nyb2xsQmFyUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF92ZXJ0aWNhbFNjcm9sbEJhclJlZiA9PT0gdm9pZCAwIHx8IF92ZXJ0aWNhbFNjcm9sbEJhclJlZi5kZWxheUhpZGRlbigpO1xuICAgIChfaG9yaXpvbnRhbFNjcm9sbEJhclIgPSBob3Jpem9udGFsU2Nyb2xsQmFyUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9ob3Jpem9udGFsU2Nyb2xsQmFyUiA9PT0gdm9pZCAwIHx8IF9ob3Jpem9udGFsU2Nyb2xsQmFyUi5kZWxheUhpZGRlbigpO1xuICB9O1xuICB2YXIgX3Njcm9sbFRvID0gdXNlU2Nyb2xsVG8oY29tcG9uZW50UmVmLCBtZXJnZWREYXRhLCBoZWlnaHRzLCBpdGVtSGVpZ2h0LCBnZXRLZXksIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gY29sbGVjdEhlaWdodCh0cnVlKTtcbiAgfSwgc3luY1Njcm9sbFRvcCwgZGVsYXlIaWRlU2Nyb2xsQmFyKTtcbiAgUmVhY3QudXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmF0aXZlRWxlbWVudDogY29udGFpbmVyUmVmLmN1cnJlbnQsXG4gICAgICBnZXRTY3JvbGxJbmZvOiBnZXRWaXJ0dWFsU2Nyb2xsSW5mbyxcbiAgICAgIHNjcm9sbFRvOiBmdW5jdGlvbiBzY3JvbGxUbyhjb25maWcpIHtcbiAgICAgICAgZnVuY3Rpb24gaXNQb3NTY3JvbGwoYXJnKSB7XG4gICAgICAgICAgcmV0dXJuIGFyZyAmJiBfdHlwZW9mKGFyZykgPT09ICdvYmplY3QnICYmICgnbGVmdCcgaW4gYXJnIHx8ICd0b3AnIGluIGFyZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUG9zU2Nyb2xsKGNvbmZpZykpIHtcbiAgICAgICAgICAvLyBTY3JvbGwgWFxuICAgICAgICAgIGlmIChjb25maWcubGVmdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBzZXRPZmZzZXRMZWZ0KGtlZXBJbkhvcml6b250YWxSYW5nZShjb25maWcubGVmdCkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNjcm9sbCBZXG4gICAgICAgICAgX3Njcm9sbFRvKGNvbmZpZy50b3ApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF9zY3JvbGxUbyhjb25maWcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRWZmZWN0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8qKiBXZSBuZWVkIHRvbGQgb3V0c2lkZSB0aGF0IHNvbWUgbGlzdCBub3QgcmVuZGVyZWQgKi9cbiAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAob25WaXNpYmxlQ2hhbmdlKSB7XG4gICAgICB2YXIgcmVuZGVyTGlzdCA9IG1lcmdlZERhdGEuc2xpY2Uoc3RhcnQsIGVuZCArIDEpO1xuICAgICAgb25WaXNpYmxlQ2hhbmdlKHJlbmRlckxpc3QsIG1lcmdlZERhdGEpO1xuICAgIH1cbiAgfSwgW3N0YXJ0LCBlbmQsIG1lcmdlZERhdGFdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFeHRyYSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGdldFNpemUgPSB1c2VHZXRTaXplKG1lcmdlZERhdGEsIGdldEtleSwgaGVpZ2h0cywgaXRlbUhlaWdodCk7XG4gIHZhciBleHRyYUNvbnRlbnQgPSBleHRyYVJlbmRlciA9PT0gbnVsbCB8fCBleHRyYVJlbmRlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXh0cmFSZW5kZXIoe1xuICAgIHN0YXJ0OiBzdGFydCxcbiAgICBlbmQ6IGVuZCxcbiAgICB2aXJ0dWFsOiBpblZpcnR1YWwsXG4gICAgb2Zmc2V0WDogb2Zmc2V0TGVmdCxcbiAgICBvZmZzZXRZOiBmaWxsZXJPZmZzZXQsXG4gICAgcnRsOiBpc1JUTCxcbiAgICBnZXRTaXplOiBnZXRTaXplXG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgbGlzdENoaWxkcmVuID0gdXNlQ2hpbGRyZW4obWVyZ2VkRGF0YSwgc3RhcnQsIGVuZCwgc2Nyb2xsV2lkdGgsIG9mZnNldExlZnQsIHNldEluc3RhbmNlUmVmLCBjaGlsZHJlbiwgc2hhcmVkQ29uZmlnKTtcbiAgdmFyIGNvbXBvbmVudFN0eWxlID0gbnVsbDtcbiAgaWYgKGhlaWdodCkge1xuICAgIGNvbXBvbmVudFN0eWxlID0gX29iamVjdFNwcmVhZChfZGVmaW5lUHJvcGVydHkoe30sIGZ1bGxIZWlnaHQgPyAnaGVpZ2h0JyA6ICdtYXhIZWlnaHQnLCBoZWlnaHQpLCBTY3JvbGxTdHlsZSk7XG4gICAgaWYgKHVzZVZpcnR1YWwpIHtcbiAgICAgIGNvbXBvbmVudFN0eWxlLm92ZXJmbG93WSA9ICdoaWRkZW4nO1xuICAgICAgaWYgKHNjcm9sbFdpZHRoKSB7XG4gICAgICAgIGNvbXBvbmVudFN0eWxlLm92ZXJmbG93WCA9ICdoaWRkZW4nO1xuICAgICAgfVxuICAgICAgaWYgKHNjcm9sbE1vdmluZykge1xuICAgICAgICBjb21wb25lbnRTdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICB2YXIgY29udGFpbmVyUHJvcHMgPSB7fTtcbiAgaWYgKGlzUlRMKSB7XG4gICAgY29udGFpbmVyUHJvcHMuZGlyID0gJ3J0bCc7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHtcbiAgICByZWY6IGNvbnRhaW5lclJlZixcbiAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJ1xuICAgIH0pLFxuICAgIGNsYXNzTmFtZTogbWVyZ2VkQ2xhc3NOYW1lXG4gIH0sIGNvbnRhaW5lclByb3BzLCByZXN0UHJvcHMpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZXNpemVPYnNlcnZlciwge1xuICAgIG9uUmVzaXplOiBvbkhvbGRlclJlc2l6ZVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb25lbnQsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaG9sZGVyXCIpLFxuICAgIHN0eWxlOiBjb21wb25lbnRTdHlsZSxcbiAgICByZWY6IGNvbXBvbmVudFJlZixcbiAgICBvblNjcm9sbDogb25GYWxsYmFja1Njcm9sbCxcbiAgICBvbk1vdXNlRW50ZXI6IGRlbGF5SGlkZVNjcm9sbEJhclxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGaWxsZXIsIHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBoZWlnaHQ6IHNjcm9sbEhlaWdodCxcbiAgICBvZmZzZXRYOiBvZmZzZXRMZWZ0LFxuICAgIG9mZnNldFk6IGZpbGxlck9mZnNldCxcbiAgICBzY3JvbGxXaWR0aDogc2Nyb2xsV2lkdGgsXG4gICAgb25Jbm5lclJlc2l6ZTogY29sbGVjdEhlaWdodCxcbiAgICByZWY6IGZpbGxlcklubmVyUmVmLFxuICAgIGlubmVyUHJvcHM6IGlubmVyUHJvcHMsXG4gICAgcnRsOiBpc1JUTCxcbiAgICBleHRyYTogZXh0cmFDb250ZW50XG4gIH0sIGxpc3RDaGlsZHJlbikpKSwgaW5WaXJ0dWFsICYmIHNjcm9sbEhlaWdodCA+IGhlaWdodCAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTY3JvbGxCYXIsIHtcbiAgICByZWY6IHZlcnRpY2FsU2Nyb2xsQmFyUmVmLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIHNjcm9sbE9mZnNldDogb2Zmc2V0VG9wLFxuICAgIHNjcm9sbFJhbmdlOiBzY3JvbGxIZWlnaHQsXG4gICAgcnRsOiBpc1JUTCxcbiAgICBvblNjcm9sbDogb25TY3JvbGxCYXIsXG4gICAgb25TdGFydE1vdmU6IG9uU2Nyb2xsYmFyU3RhcnRNb3ZlLFxuICAgIG9uU3RvcE1vdmU6IG9uU2Nyb2xsYmFyU3RvcE1vdmUsXG4gICAgc3BpblNpemU6IHZlcnRpY2FsU2Nyb2xsQmFyU3BpblNpemUsXG4gICAgY29udGFpbmVyU2l6ZTogc2l6ZS5oZWlnaHQsXG4gICAgc3R5bGU6IHN0eWxlcyA9PT0gbnVsbCB8fCBzdHlsZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0eWxlcy52ZXJ0aWNhbFNjcm9sbEJhcixcbiAgICB0aHVtYlN0eWxlOiBzdHlsZXMgPT09IG51bGwgfHwgc3R5bGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdHlsZXMudmVydGljYWxTY3JvbGxCYXJUaHVtYixcbiAgICBzaG93U2Nyb2xsQmFyOiBzaG93U2Nyb2xsQmFyXG4gIH0pLCBpblZpcnR1YWwgJiYgc2Nyb2xsV2lkdGggPiBzaXplLndpZHRoICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNjcm9sbEJhciwge1xuICAgIHJlZjogaG9yaXpvbnRhbFNjcm9sbEJhclJlZixcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBzY3JvbGxPZmZzZXQ6IG9mZnNldExlZnQsXG4gICAgc2Nyb2xsUmFuZ2U6IHNjcm9sbFdpZHRoLFxuICAgIHJ0bDogaXNSVEwsXG4gICAgb25TY3JvbGw6IG9uU2Nyb2xsQmFyLFxuICAgIG9uU3RhcnRNb3ZlOiBvblNjcm9sbGJhclN0YXJ0TW92ZSxcbiAgICBvblN0b3BNb3ZlOiBvblNjcm9sbGJhclN0b3BNb3ZlLFxuICAgIHNwaW5TaXplOiBob3Jpem9udGFsU2Nyb2xsQmFyU3BpblNpemUsXG4gICAgY29udGFpbmVyU2l6ZTogc2l6ZS53aWR0aCxcbiAgICBob3Jpem9udGFsOiB0cnVlLFxuICAgIHN0eWxlOiBzdHlsZXMgPT09IG51bGwgfHwgc3R5bGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdHlsZXMuaG9yaXpvbnRhbFNjcm9sbEJhcixcbiAgICB0aHVtYlN0eWxlOiBzdHlsZXMgPT09IG51bGwgfHwgc3R5bGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdHlsZXMuaG9yaXpvbnRhbFNjcm9sbEJhclRodW1iLFxuICAgIHNob3dTY3JvbGxCYXI6IHNob3dTY3JvbGxCYXJcbiAgfSkpO1xufVxudmFyIExpc3QgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihSYXdMaXN0KTtcbkxpc3QuZGlzcGxheU5hbWUgPSAnTGlzdCc7XG5leHBvcnQgZGVmYXVsdCBMaXN0OyIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJlc2l6ZU9ic2VydmVyIGZyb20gJ3JjLXJlc2l6ZS1vYnNlcnZlcic7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbi8qKlxuICogRmlsbCBjb21wb25lbnQgdG8gcHJvdmlkZWQgdGhlIHNjcm9sbCBjb250ZW50IHJlYWwgaGVpZ2h0LlxuICovXG52YXIgRmlsbGVyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKF9yZWYsIHJlZikge1xuICB2YXIgaGVpZ2h0ID0gX3JlZi5oZWlnaHQsXG4gICAgb2Zmc2V0WSA9IF9yZWYub2Zmc2V0WSxcbiAgICBvZmZzZXRYID0gX3JlZi5vZmZzZXRYLFxuICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICBwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscyxcbiAgICBvbklubmVyUmVzaXplID0gX3JlZi5vbklubmVyUmVzaXplLFxuICAgIGlubmVyUHJvcHMgPSBfcmVmLmlubmVyUHJvcHMsXG4gICAgcnRsID0gX3JlZi5ydGwsXG4gICAgZXh0cmEgPSBfcmVmLmV4dHJhO1xuICB2YXIgb3V0ZXJTdHlsZSA9IHt9O1xuICB2YXIgaW5uZXJTdHlsZSA9IHtcbiAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgZmxleERpcmVjdGlvbjogJ2NvbHVtbidcbiAgfTtcbiAgaWYgKG9mZnNldFkgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIE5vdCBzZXQgYHdpZHRoYCBzaW5jZSB0aGlzIHdpbGwgYnJlYWsgYHN0aWNreTogcmlnaHRgXG4gICAgb3V0ZXJTdHlsZSA9IHtcbiAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICBvdmVyZmxvdzogJ2hpZGRlbidcbiAgICB9O1xuICAgIGlubmVyU3R5bGUgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGlubmVyU3R5bGUpLCB7fSwgX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eSh7XG4gICAgICB0cmFuc2Zvcm06IFwidHJhbnNsYXRlWShcIi5jb25jYXQob2Zmc2V0WSwgXCJweClcIilcbiAgICB9LCBydGwgPyAnbWFyZ2luUmlnaHQnIDogJ21hcmdpbkxlZnQnLCAtb2Zmc2V0WCksIFwicG9zaXRpb25cIiwgJ2Fic29sdXRlJyksIFwibGVmdFwiLCAwKSwgXCJyaWdodFwiLCAwKSwgXCJ0b3BcIiwgMCkpO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgc3R5bGU6IG91dGVyU3R5bGVcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVzaXplT2JzZXJ2ZXIsIHtcbiAgICBvblJlc2l6ZTogZnVuY3Rpb24gb25SZXNpemUoX3JlZjIpIHtcbiAgICAgIHZhciBvZmZzZXRIZWlnaHQgPSBfcmVmMi5vZmZzZXRIZWlnaHQ7XG4gICAgICBpZiAob2Zmc2V0SGVpZ2h0ICYmIG9uSW5uZXJSZXNpemUpIHtcbiAgICAgICAgb25Jbm5lclJlc2l6ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIHN0eWxlOiBpbm5lclN0eWxlLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaG9sZGVyLWlubmVyXCIpLCBwcmVmaXhDbHMpKSxcbiAgICByZWY6IHJlZlxuICB9LCBpbm5lclByb3BzKSwgY2hpbGRyZW4sIGV4dHJhKSkpO1xufSk7XG5GaWxsZXIuZGlzcGxheU5hbWUgPSAnRmlsbGVyJztcbmV4cG9ydCBkZWZhdWx0IEZpbGxlcjsiLCAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgSXRlbSB9IGZyb20gXCIuLi9JdGVtXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VDaGlsZHJlbihsaXN0LCBzdGFydEluZGV4LCBlbmRJbmRleCwgc2Nyb2xsV2lkdGgsIG9mZnNldFgsIHNldE5vZGVSZWYsIHJlbmRlckZ1bmMsIF9yZWYpIHtcbiAgdmFyIGdldEtleSA9IF9yZWYuZ2V0S2V5O1xuICByZXR1cm4gbGlzdC5zbGljZShzdGFydEluZGV4LCBlbmRJbmRleCArIDEpLm1hcChmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHtcbiAgICB2YXIgZWxlSW5kZXggPSBzdGFydEluZGV4ICsgaW5kZXg7XG4gICAgdmFyIG5vZGUgPSByZW5kZXJGdW5jKGl0ZW0sIGVsZUluZGV4LCB7XG4gICAgICBzdHlsZToge1xuICAgICAgICB3aWR0aDogc2Nyb2xsV2lkdGhcbiAgICAgIH0sXG4gICAgICBvZmZzZXRYOiBvZmZzZXRYXG4gICAgfSk7XG4gICAgdmFyIGtleSA9IGdldEtleShpdGVtKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSXRlbSwge1xuICAgICAga2V5OiBrZXksXG4gICAgICBzZXRSZWY6IGZ1bmN0aW9uIHNldFJlZihlbGUpIHtcbiAgICAgICAgcmV0dXJuIHNldE5vZGVSZWYoaXRlbSwgZWxlKTtcbiAgICAgIH1cbiAgICB9LCBub2RlKTtcbiAgfSk7XG59IiwgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCBmdW5jdGlvbiBJdGVtKF9yZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICBzZXRSZWYgPSBfcmVmLnNldFJlZjtcbiAgdmFyIHJlZkZ1bmMgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAobm9kZSkge1xuICAgIHNldFJlZihub2RlKTtcbiAgfSwgW10pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChjaGlsZHJlbiwge1xuICAgIHJlZjogcmVmRnVuY1xuICB9KTtcbn0iLCAiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBmaW5kTGlzdERpZmZJbmRleCB9IGZyb20gXCIuLi91dGlscy9hbGdvcml0aG1VdGlsXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VEaWZmSXRlbShkYXRhLCBnZXRLZXksIG9uRGlmZikge1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZGF0YSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgcHJldkRhdGEgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldFByZXZEYXRhID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTMgPSBSZWFjdC51c2VTdGF0ZShudWxsKSxcbiAgICBfUmVhY3QkdXNlU3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlMywgMiksXG4gICAgZGlmZkl0ZW0gPSBfUmVhY3QkdXNlU3RhdGU0WzBdLFxuICAgIHNldERpZmZJdGVtID0gX1JlYWN0JHVzZVN0YXRlNFsxXTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZGlmZiA9IGZpbmRMaXN0RGlmZkluZGV4KHByZXZEYXRhIHx8IFtdLCBkYXRhIHx8IFtdLCBnZXRLZXkpO1xuICAgIGlmICgoZGlmZiA9PT0gbnVsbCB8fCBkaWZmID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkaWZmLmluZGV4KSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBvbkRpZmYgPT09IG51bGwgfHwgb25EaWZmID09PSB2b2lkIDAgfHwgb25EaWZmKGRpZmYuaW5kZXgpO1xuICAgICAgc2V0RGlmZkl0ZW0oZGF0YVtkaWZmLmluZGV4XSk7XG4gICAgfVxuICAgIHNldFByZXZEYXRhKGRhdGEpO1xuICB9LCBbZGF0YV0pO1xuICByZXR1cm4gW2RpZmZJdGVtXTtcbn0iLCAiLyoqXG4gKiBHZXQgaW5kZXggd2l0aCBzcGVjaWZpYyBzdGFydCBpbmRleCBvbmUgYnkgb25lLiBlLmcuXG4gKiBtaW46IDMsIG1heDogOSwgc3RhcnQ6IDZcbiAqXG4gKiBSZXR1cm4gaW5kZXggaXM6XG4gKiBbMF06IDZcbiAqIFsxXTogN1xuICogWzJdOiA1XG4gKiBbM106IDhcbiAqIFs0XTogNFxuICogWzVdOiA5XG4gKiBbNl06IDNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEluZGV4QnlTdGFydExvYyhtaW4sIG1heCwgc3RhcnQsIGluZGV4KSB7XG4gIHZhciBiZWZvcmVDb3VudCA9IHN0YXJ0IC0gbWluO1xuICB2YXIgYWZ0ZXJDb3VudCA9IG1heCAtIHN0YXJ0O1xuICB2YXIgYmFsYW5jZUNvdW50ID0gTWF0aC5taW4oYmVmb3JlQ291bnQsIGFmdGVyQ291bnQpICogMjtcblxuICAvLyBCYWxhbmNlXG4gIGlmIChpbmRleCA8PSBiYWxhbmNlQ291bnQpIHtcbiAgICB2YXIgc3RlcEluZGV4ID0gTWF0aC5mbG9vcihpbmRleCAvIDIpO1xuICAgIGlmIChpbmRleCAlIDIpIHtcbiAgICAgIHJldHVybiBzdGFydCArIHN0ZXBJbmRleCArIDE7XG4gICAgfVxuICAgIHJldHVybiBzdGFydCAtIHN0ZXBJbmRleDtcbiAgfVxuXG4gIC8vIE9uZSBpcyBvdXQgb2YgcmFuZ2VcbiAgaWYgKGJlZm9yZUNvdW50ID4gYWZ0ZXJDb3VudCkge1xuICAgIHJldHVybiBzdGFydCAtIChpbmRleCAtIGFmdGVyQ291bnQpO1xuICB9XG4gIHJldHVybiBzdGFydCArIChpbmRleCAtIGJlZm9yZUNvdW50KTtcbn1cblxuLyoqXG4gKiBXZSBhc3N1bWUgdGhhdCAyIGxpc3QgaGFzIG9ubHkgMSBpdGVtIGRpZmYgYW5kIG90aGVycyBrZWVwaW5nIHRoZSBvcmRlci5cbiAqIFNvIHdlIGNhbiB1c2UgZGljaG90b215IGFsZ29yaXRobSB0byBmaW5kIGNoYW5nZWQgb25lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZExpc3REaWZmSW5kZXgob3JpZ2luTGlzdCwgdGFyZ2V0TGlzdCwgZ2V0S2V5KSB7XG4gIHZhciBvcmlnaW5MZW4gPSBvcmlnaW5MaXN0Lmxlbmd0aDtcbiAgdmFyIHRhcmdldExlbiA9IHRhcmdldExpc3QubGVuZ3RoO1xuICB2YXIgc2hvcnRMaXN0O1xuICB2YXIgbG9uZ0xpc3Q7XG4gIGlmIChvcmlnaW5MZW4gPT09IDAgJiYgdGFyZ2V0TGVuID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKG9yaWdpbkxlbiA8IHRhcmdldExlbikge1xuICAgIHNob3J0TGlzdCA9IG9yaWdpbkxpc3Q7XG4gICAgbG9uZ0xpc3QgPSB0YXJnZXRMaXN0O1xuICB9IGVsc2Uge1xuICAgIHNob3J0TGlzdCA9IHRhcmdldExpc3Q7XG4gICAgbG9uZ0xpc3QgPSBvcmlnaW5MaXN0O1xuICB9XG4gIHZhciBub3RFeGlzdEtleSA9IHtcbiAgICBfX0VNUFRZX0lURU1fXzogdHJ1ZVxuICB9O1xuICBmdW5jdGlvbiBnZXRJdGVtS2V5KGl0ZW0pIHtcbiAgICBpZiAoaXRlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZ2V0S2V5KGl0ZW0pO1xuICAgIH1cbiAgICByZXR1cm4gbm90RXhpc3RLZXk7XG4gIH1cblxuICAvLyBMb29wIHRvIGZpbmQgZGlmZiBvbmVcbiAgdmFyIGRpZmZJbmRleCA9IG51bGw7XG4gIHZhciBtdWx0aXBsZSA9IE1hdGguYWJzKG9yaWdpbkxlbiAtIHRhcmdldExlbikgIT09IDE7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbG9uZ0xpc3QubGVuZ3RoOyBpICs9IDEpIHtcbiAgICB2YXIgc2hvcnRLZXkgPSBnZXRJdGVtS2V5KHNob3J0TGlzdFtpXSk7XG4gICAgdmFyIGxvbmdLZXkgPSBnZXRJdGVtS2V5KGxvbmdMaXN0W2ldKTtcbiAgICBpZiAoc2hvcnRLZXkgIT09IGxvbmdLZXkpIHtcbiAgICAgIGRpZmZJbmRleCA9IGk7XG4gICAgICBtdWx0aXBsZSA9IG11bHRpcGxlIHx8IHNob3J0S2V5ICE9PSBnZXRJdGVtS2V5KGxvbmdMaXN0W2kgKyAxXSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRpZmZJbmRleCA9PT0gbnVsbCA/IG51bGwgOiB7XG4gICAgaW5kZXg6IGRpZmZJbmRleCxcbiAgICBtdWx0aXBsZTogbXVsdGlwbGVcbiAgfTtcbn0iLCAiaW1wb3J0IHJhZiBmcm9tIFwicmMtdXRpbC9lcy9yYWZcIjtcbmltcG9ydCB7IHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBpc0ZGIGZyb20gXCIuLi91dGlscy9pc0ZpcmVmb3hcIjtcbmltcG9ydCB1c2VPcmlnaW5TY3JvbGwgZnJvbSBcIi4vdXNlT3JpZ2luU2Nyb2xsXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VGcmFtZVdoZWVsKGluVmlydHVhbCwgaXNTY3JvbGxBdFRvcCwgaXNTY3JvbGxBdEJvdHRvbSwgaXNTY3JvbGxBdExlZnQsIGlzU2Nyb2xsQXRSaWdodCwgaG9yaXpvbnRhbFNjcm9sbCxcbi8qKipcbiAqIFJldHVybiBgdHJ1ZWAgd2hlbiB5b3UgbmVlZCB0byBwcmV2ZW50IGRlZmF1bHQgZXZlbnRcbiAqL1xub25XaGVlbERlbHRhKSB7XG4gIHZhciBvZmZzZXRSZWYgPSB1c2VSZWYoMCk7XG4gIHZhciBuZXh0RnJhbWVSZWYgPSB1c2VSZWYobnVsbCk7XG5cbiAgLy8gRmlyZWZveCBwYXRjaFxuICB2YXIgd2hlZWxWYWx1ZVJlZiA9IHVzZVJlZihudWxsKTtcbiAgdmFyIGlzTW91c2VTY3JvbGxSZWYgPSB1c2VSZWYoZmFsc2UpO1xuXG4gIC8vIFNjcm9sbCBzdGF0dXMgc3luY1xuICB2YXIgb3JpZ2luU2Nyb2xsID0gdXNlT3JpZ2luU2Nyb2xsKGlzU2Nyb2xsQXRUb3AsIGlzU2Nyb2xsQXRCb3R0b20sIGlzU2Nyb2xsQXRMZWZ0LCBpc1Njcm9sbEF0UmlnaHQpO1xuICBmdW5jdGlvbiBvbldoZWVsWShlLCBkZWx0YVkpIHtcbiAgICByYWYuY2FuY2VsKG5leHRGcmFtZVJlZi5jdXJyZW50KTtcblxuICAgIC8vIERvIG5vdGhpbmcgd2hlbiBzY3JvbGwgYXQgdGhlIGVkZ2UsIFNraXAgY2hlY2sgd2hlbiBpcyBpbiBzY3JvbGxcbiAgICBpZiAob3JpZ2luU2Nyb2xsKGZhbHNlLCBkZWx0YVkpKSByZXR1cm47XG5cbiAgICAvLyBTa2lwIGlmIG5lc3QgTGlzdCBoYXMgaGFuZGxlZCB0aGlzIGV2ZW50XG4gICAgdmFyIGV2ZW50ID0gZTtcbiAgICBpZiAoIWV2ZW50Ll92aXJ0dWFsSGFuZGxlZCkge1xuICAgICAgZXZlbnQuX3ZpcnR1YWxIYW5kbGVkID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBvZmZzZXRSZWYuY3VycmVudCArPSBkZWx0YVk7XG4gICAgd2hlZWxWYWx1ZVJlZi5jdXJyZW50ID0gZGVsdGFZO1xuXG4gICAgLy8gUHJveHkgb2Ygc2Nyb2xsIGV2ZW50c1xuICAgIGlmICghaXNGRikge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgbmV4dEZyYW1lUmVmLmN1cnJlbnQgPSByYWYoZnVuY3Rpb24gKCkge1xuICAgICAgLy8gUGF0Y2ggYSBtdWx0aXBsZSBmb3IgRmlyZWZveCB0byBmaXggd2hlZWwgbnVtYmVyIHRvbyBzbWFsbFxuICAgICAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8yNjM3MiNpc3N1ZWNvbW1lbnQtNjc5NDYwMjY2XG4gICAgICB2YXIgcGF0Y2hNdWx0aXBsZSA9IGlzTW91c2VTY3JvbGxSZWYuY3VycmVudCA/IDEwIDogMTtcbiAgICAgIG9uV2hlZWxEZWx0YShvZmZzZXRSZWYuY3VycmVudCAqIHBhdGNoTXVsdGlwbGUsIGZhbHNlKTtcbiAgICAgIG9mZnNldFJlZi5jdXJyZW50ID0gMDtcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBvbldoZWVsWChldmVudCwgZGVsdGFYKSB7XG4gICAgb25XaGVlbERlbHRhKGRlbHRhWCwgdHJ1ZSk7XG4gICAgaWYgKCFpc0ZGKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIENoZWNrIGZvciB3aGljaCBkaXJlY3Rpb24gZG9lcyB3aGVlbCBkby4gYHN4YCBtZWFucyBgc2hpZnQgKyB3aGVlbGBcbiAgdmFyIHdoZWVsRGlyZWN0aW9uUmVmID0gdXNlUmVmKG51bGwpO1xuICB2YXIgd2hlZWxEaXJlY3Rpb25DbGVhblJlZiA9IHVzZVJlZihudWxsKTtcbiAgZnVuY3Rpb24gb25XaGVlbChldmVudCkge1xuICAgIGlmICghaW5WaXJ0dWFsKSByZXR1cm47XG5cbiAgICAvLyBXYWl0IGZvciAyIGZyYW1lIHRvIGNsZWFuIGRpcmVjdGlvblxuICAgIHJhZi5jYW5jZWwod2hlZWxEaXJlY3Rpb25DbGVhblJlZi5jdXJyZW50KTtcbiAgICB3aGVlbERpcmVjdGlvbkNsZWFuUmVmLmN1cnJlbnQgPSByYWYoZnVuY3Rpb24gKCkge1xuICAgICAgd2hlZWxEaXJlY3Rpb25SZWYuY3VycmVudCA9IG51bGw7XG4gICAgfSwgMik7XG4gICAgdmFyIGRlbHRhWCA9IGV2ZW50LmRlbHRhWCxcbiAgICAgIGRlbHRhWSA9IGV2ZW50LmRlbHRhWSxcbiAgICAgIHNoaWZ0S2V5ID0gZXZlbnQuc2hpZnRLZXk7XG4gICAgdmFyIG1lcmdlZERlbHRhWCA9IGRlbHRhWDtcbiAgICB2YXIgbWVyZ2VkRGVsdGFZID0gZGVsdGFZO1xuICAgIGlmICh3aGVlbERpcmVjdGlvblJlZi5jdXJyZW50ID09PSAnc3gnIHx8ICF3aGVlbERpcmVjdGlvblJlZi5jdXJyZW50ICYmIChzaGlmdEtleSB8fCBmYWxzZSkgJiYgZGVsdGFZICYmICFkZWx0YVgpIHtcbiAgICAgIG1lcmdlZERlbHRhWCA9IGRlbHRhWTtcbiAgICAgIG1lcmdlZERlbHRhWSA9IDA7XG4gICAgICB3aGVlbERpcmVjdGlvblJlZi5jdXJyZW50ID0gJ3N4JztcbiAgICB9XG4gICAgdmFyIGFic1ggPSBNYXRoLmFicyhtZXJnZWREZWx0YVgpO1xuICAgIHZhciBhYnNZID0gTWF0aC5hYnMobWVyZ2VkRGVsdGFZKTtcbiAgICBpZiAod2hlZWxEaXJlY3Rpb25SZWYuY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgd2hlZWxEaXJlY3Rpb25SZWYuY3VycmVudCA9IGhvcml6b250YWxTY3JvbGwgJiYgYWJzWCA+IGFic1kgPyAneCcgOiAneSc7XG4gICAgfVxuICAgIGlmICh3aGVlbERpcmVjdGlvblJlZi5jdXJyZW50ID09PSAneScpIHtcbiAgICAgIG9uV2hlZWxZKGV2ZW50LCBtZXJnZWREZWx0YVkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvbldoZWVsWChldmVudCwgbWVyZ2VkRGVsdGFYKTtcbiAgICB9XG4gIH1cblxuICAvLyBBIHBhdGNoIGZvciBmaXJlZm94XG4gIGZ1bmN0aW9uIG9uRmlyZUZveFNjcm9sbChldmVudCkge1xuICAgIGlmICghaW5WaXJ0dWFsKSByZXR1cm47XG4gICAgaXNNb3VzZVNjcm9sbFJlZi5jdXJyZW50ID0gZXZlbnQuZGV0YWlsID09PSB3aGVlbFZhbHVlUmVmLmN1cnJlbnQ7XG4gIH1cbiAgcmV0dXJuIFtvbldoZWVsLCBvbkZpcmVGb3hTY3JvbGxdO1xufSIsICJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG52YXIgaXNGRiA9ICh0eXBlb2YgbmF2aWdhdG9yID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2YobmF2aWdhdG9yKSkgPT09ICdvYmplY3QnICYmIC9GaXJlZm94L2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbmV4cG9ydCBkZWZhdWx0IGlzRkY7IiwgImltcG9ydCB7IHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAoaXNTY3JvbGxBdFRvcCwgaXNTY3JvbGxBdEJvdHRvbSwgaXNTY3JvbGxBdExlZnQsIGlzU2Nyb2xsQXRSaWdodCkge1xuICAvLyBEbyBsb2NrIGZvciBhIHdoZWVsIHdoZW4gc2Nyb2xsaW5nXG4gIHZhciBsb2NrUmVmID0gdXNlUmVmKGZhbHNlKTtcbiAgdmFyIGxvY2tUaW1lb3V0UmVmID0gdXNlUmVmKG51bGwpO1xuICBmdW5jdGlvbiBsb2NrU2Nyb2xsKCkge1xuICAgIGNsZWFyVGltZW91dChsb2NrVGltZW91dFJlZi5jdXJyZW50KTtcbiAgICBsb2NrUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgIGxvY2tUaW1lb3V0UmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGxvY2tSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIH0sIDUwKTtcbiAgfVxuXG4gIC8vIFBhc3MgdG8gcmVmIHNpbmNlIGdsb2JhbCBhZGQgaXMgaW4gY2xvc3VyZVxuICB2YXIgc2Nyb2xsUGluZ1JlZiA9IHVzZVJlZih7XG4gICAgdG9wOiBpc1Njcm9sbEF0VG9wLFxuICAgIGJvdHRvbTogaXNTY3JvbGxBdEJvdHRvbSxcbiAgICBsZWZ0OiBpc1Njcm9sbEF0TGVmdCxcbiAgICByaWdodDogaXNTY3JvbGxBdFJpZ2h0XG4gIH0pO1xuICBzY3JvbGxQaW5nUmVmLmN1cnJlbnQudG9wID0gaXNTY3JvbGxBdFRvcDtcbiAgc2Nyb2xsUGluZ1JlZi5jdXJyZW50LmJvdHRvbSA9IGlzU2Nyb2xsQXRCb3R0b207XG4gIHNjcm9sbFBpbmdSZWYuY3VycmVudC5sZWZ0ID0gaXNTY3JvbGxBdExlZnQ7XG4gIHNjcm9sbFBpbmdSZWYuY3VycmVudC5yaWdodCA9IGlzU2Nyb2xsQXRSaWdodDtcbiAgcmV0dXJuIGZ1bmN0aW9uIChpc0hvcml6b250YWwsIGRlbHRhKSB7XG4gICAgdmFyIHNtb290aE9mZnNldCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogZmFsc2U7XG4gICAgdmFyIG9yaWdpblNjcm9sbCA9IGlzSG9yaXpvbnRhbCA/XG4gICAgLy8gUGFzcyBvcmlnaW4gd2hlZWwgd2hlbiBvbiB0aGUgbGVmdFxuICAgIGRlbHRhIDwgMCAmJiBzY3JvbGxQaW5nUmVmLmN1cnJlbnQubGVmdCB8fFxuICAgIC8vIFBhc3Mgb3JpZ2luIHdoZWVsIHdoZW4gb24gdGhlIHJpZ2h0XG4gICAgZGVsdGEgPiAwICYmIHNjcm9sbFBpbmdSZWYuY3VycmVudC5yaWdodCAvLyBQYXNzIG9yaWdpbiB3aGVlbCB3aGVuIG9uIHRoZSB0b3BcbiAgICA6IGRlbHRhIDwgMCAmJiBzY3JvbGxQaW5nUmVmLmN1cnJlbnQudG9wIHx8XG4gICAgLy8gUGFzcyBvcmlnaW4gd2hlZWwgd2hlbiBvbiB0aGUgYm90dG9tXG4gICAgZGVsdGEgPiAwICYmIHNjcm9sbFBpbmdSZWYuY3VycmVudC5ib3R0b207XG4gICAgaWYgKHNtb290aE9mZnNldCAmJiBvcmlnaW5TY3JvbGwpIHtcbiAgICAgIC8vIE5vIG5lZWQgbG9jayBhbnltb3JlIHdoZW4gaXQncyBzbW9vdGggb2Zmc2V0IGZyb20gdG91Y2hNb3ZlIGludGVydmFsXG4gICAgICBjbGVhclRpbWVvdXQobG9ja1RpbWVvdXRSZWYuY3VycmVudCk7XG4gICAgICBsb2NrUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKCFvcmlnaW5TY3JvbGwgfHwgbG9ja1JlZi5jdXJyZW50KSB7XG4gICAgICBsb2NrU2Nyb2xsKCk7XG4gICAgfVxuICAgIHJldHVybiAhbG9ja1JlZi5jdXJyZW50ICYmIG9yaWdpblNjcm9sbDtcbiAgfTtcbn0pOyIsICJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcblxuLyoqXG4gKiBTaXplIGluZm8gbmVlZCBsb29wIHF1ZXJ5IGZvciB0aGUgYGhlaWdodHNgIHdoaWNoIHdpbGwgaGFzIHRoZSBwZXJmIGlzc3VlLlxuICogTGV0IGNhY2hlIHJlc3VsdCBmb3IgZWFjaCByZW5kZXIgcGhhc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VHZXRTaXplKG1lcmdlZERhdGEsIGdldEtleSwgaGVpZ2h0cywgaXRlbUhlaWdodCkge1xuICB2YXIgX1JlYWN0JHVzZU1lbW8gPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBbbmV3IE1hcCgpLCBbXV07XG4gICAgfSwgW21lcmdlZERhdGEsIGhlaWdodHMuaWQsIGl0ZW1IZWlnaHRdKSxcbiAgICBfUmVhY3QkdXNlTWVtbzIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlTWVtbywgMiksXG4gICAga2V5MkluZGV4ID0gX1JlYWN0JHVzZU1lbW8yWzBdLFxuICAgIGJvdHRvbUxpc3QgPSBfUmVhY3QkdXNlTWVtbzJbMV07XG4gIHZhciBnZXRTaXplID0gZnVuY3Rpb24gZ2V0U2l6ZShzdGFydEtleSkge1xuICAgIHZhciBlbmRLZXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHN0YXJ0S2V5O1xuICAgIC8vIEdldCBmcm9tIGNhY2hlIGZpcnN0XG4gICAgdmFyIHN0YXJ0SW5kZXggPSBrZXkySW5kZXguZ2V0KHN0YXJ0S2V5KTtcbiAgICB2YXIgZW5kSW5kZXggPSBrZXkySW5kZXguZ2V0KGVuZEtleSk7XG5cbiAgICAvLyBMb29wIHRvIGZpbGwgdGhlIGNhY2hlXG4gICAgaWYgKHN0YXJ0SW5kZXggPT09IHVuZGVmaW5lZCB8fCBlbmRJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgZGF0YUxlbiA9IG1lcmdlZERhdGEubGVuZ3RoO1xuICAgICAgZm9yICh2YXIgaSA9IGJvdHRvbUxpc3QubGVuZ3RoOyBpIDwgZGF0YUxlbjsgaSArPSAxKSB7XG4gICAgICAgIHZhciBfaGVpZ2h0cyRnZXQ7XG4gICAgICAgIHZhciBpdGVtID0gbWVyZ2VkRGF0YVtpXTtcbiAgICAgICAgdmFyIGtleSA9IGdldEtleShpdGVtKTtcbiAgICAgICAga2V5MkluZGV4LnNldChrZXksIGkpO1xuICAgICAgICB2YXIgY2FjaGVIZWlnaHQgPSAoX2hlaWdodHMkZ2V0ID0gaGVpZ2h0cy5nZXQoa2V5KSkgIT09IG51bGwgJiYgX2hlaWdodHMkZ2V0ICE9PSB2b2lkIDAgPyBfaGVpZ2h0cyRnZXQgOiBpdGVtSGVpZ2h0O1xuICAgICAgICBib3R0b21MaXN0W2ldID0gKGJvdHRvbUxpc3RbaSAtIDFdIHx8IDApICsgY2FjaGVIZWlnaHQ7XG4gICAgICAgIGlmIChrZXkgPT09IHN0YXJ0S2V5KSB7XG4gICAgICAgICAgc3RhcnRJbmRleCA9IGk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleSA9PT0gZW5kS2V5KSB7XG4gICAgICAgICAgZW5kSW5kZXggPSBpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydEluZGV4ICE9PSB1bmRlZmluZWQgJiYgZW5kSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB0b3A6IGJvdHRvbUxpc3Rbc3RhcnRJbmRleCAtIDFdIHx8IDAsXG4gICAgICBib3R0b206IGJvdHRvbUxpc3RbZW5kSW5kZXhdXG4gICAgfTtcbiAgfTtcbiAgcmV0dXJuIGdldFNpemU7XG59IiwgImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQ2FjaGVNYXAgZnJvbSBcIi4uL3V0aWxzL0NhY2hlTWFwXCI7XG5mdW5jdGlvbiBwYXJzZU51bWJlcih2YWx1ZSkge1xuICB2YXIgbnVtID0gcGFyc2VGbG9hdCh2YWx1ZSk7XG4gIHJldHVybiBpc05hTihudW0pID8gMCA6IG51bTtcbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUhlaWdodHMoZ2V0S2V5LCBvbkl0ZW1BZGQsIG9uSXRlbVJlbW92ZSkge1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoMCksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgdXBkYXRlZE1hcmsgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldFVwZGF0ZWRNYXJrID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIGluc3RhbmNlUmVmID0gdXNlUmVmKG5ldyBNYXAoKSk7XG4gIHZhciBoZWlnaHRzUmVmID0gdXNlUmVmKG5ldyBDYWNoZU1hcCgpKTtcbiAgdmFyIHByb21pc2VJZFJlZiA9IHVzZVJlZigwKTtcbiAgZnVuY3Rpb24gY2FuY2VsUmFmKCkge1xuICAgIHByb21pc2VJZFJlZi5jdXJyZW50ICs9IDE7XG4gIH1cbiAgZnVuY3Rpb24gY29sbGVjdEhlaWdodCgpIHtcbiAgICB2YXIgc3luYyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZmFsc2U7XG4gICAgY2FuY2VsUmFmKCk7XG4gICAgdmFyIGRvQ29sbGVjdCA9IGZ1bmN0aW9uIGRvQ29sbGVjdCgpIHtcbiAgICAgIHZhciBjaGFuZ2VkID0gZmFsc2U7XG4gICAgICBpbnN0YW5jZVJlZi5jdXJyZW50LmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQsIGtleSkge1xuICAgICAgICBpZiAoZWxlbWVudCAmJiBlbGVtZW50Lm9mZnNldFBhcmVudCkge1xuICAgICAgICAgIHZhciBvZmZzZXRIZWlnaHQgPSBlbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICAgICAgICB2YXIgX2dldENvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLFxuICAgICAgICAgICAgbWFyZ2luVG9wID0gX2dldENvbXB1dGVkU3R5bGUubWFyZ2luVG9wLFxuICAgICAgICAgICAgbWFyZ2luQm90dG9tID0gX2dldENvbXB1dGVkU3R5bGUubWFyZ2luQm90dG9tO1xuICAgICAgICAgIHZhciBtYXJnaW5Ub3BOdW0gPSBwYXJzZU51bWJlcihtYXJnaW5Ub3ApO1xuICAgICAgICAgIHZhciBtYXJnaW5Cb3R0b21OdW0gPSBwYXJzZU51bWJlcihtYXJnaW5Cb3R0b20pO1xuICAgICAgICAgIHZhciB0b3RhbEhlaWdodCA9IG9mZnNldEhlaWdodCArIG1hcmdpblRvcE51bSArIG1hcmdpbkJvdHRvbU51bTtcbiAgICAgICAgICBpZiAoaGVpZ2h0c1JlZi5jdXJyZW50LmdldChrZXkpICE9PSB0b3RhbEhlaWdodCkge1xuICAgICAgICAgICAgaGVpZ2h0c1JlZi5jdXJyZW50LnNldChrZXksIHRvdGFsSGVpZ2h0KTtcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIEFsd2F5cyB0cmlnZ2VyIHVwZGF0ZSBtYXJrIHRvIHRlbGwgcGFyZW50IHRoYXQgc2hvdWxkIHJlLWNhbGN1bGF0ZSBoZWlnaHRzIHdoZW4gcmVzaXplZFxuICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgc2V0VXBkYXRlZE1hcmsoZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgICByZXR1cm4gYyArIDE7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKHN5bmMpIHtcbiAgICAgIGRvQ29sbGVjdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9taXNlSWRSZWYuY3VycmVudCArPSAxO1xuICAgICAgdmFyIGlkID0gcHJvbWlzZUlkUmVmLmN1cnJlbnQ7XG4gICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGlkID09PSBwcm9taXNlSWRSZWYuY3VycmVudCkge1xuICAgICAgICAgIGRvQ29sbGVjdCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gc2V0SW5zdGFuY2VSZWYoaXRlbSwgaW5zdGFuY2UpIHtcbiAgICB2YXIga2V5ID0gZ2V0S2V5KGl0ZW0pO1xuICAgIHZhciBvcmlnaW4gPSBpbnN0YW5jZVJlZi5jdXJyZW50LmdldChrZXkpO1xuICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgaW5zdGFuY2VSZWYuY3VycmVudC5zZXQoa2V5LCBpbnN0YW5jZSk7XG4gICAgICBjb2xsZWN0SGVpZ2h0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluc3RhbmNlUmVmLmN1cnJlbnQuZGVsZXRlKGtleSk7XG4gICAgfVxuXG4gICAgLy8gSW5zdGFuY2UgY2hhbmdlZFxuICAgIGlmICghb3JpZ2luICE9PSAhaW5zdGFuY2UpIHtcbiAgICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgICBvbkl0ZW1BZGQgPT09IG51bGwgfHwgb25JdGVtQWRkID09PSB2b2lkIDAgfHwgb25JdGVtQWRkKGl0ZW0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25JdGVtUmVtb3ZlID09PSBudWxsIHx8IG9uSXRlbVJlbW92ZSA9PT0gdm9pZCAwIHx8IG9uSXRlbVJlbW92ZShpdGVtKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gY2FuY2VsUmFmO1xuICB9LCBbXSk7XG4gIHJldHVybiBbc2V0SW5zdGFuY2VSZWYsIGNvbGxlY3RIZWlnaHQsIGhlaWdodHNSZWYuY3VycmVudCwgdXBkYXRlZE1hcmtdO1xufSIsICJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG4vLyBGaXJlZm94IGhhcyBsb3cgcGVyZm9ybWFuY2Ugb2YgbWFwLlxudmFyIENhY2hlTWFwID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQ2FjaGVNYXAoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENhY2hlTWFwKTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJtYXBzXCIsIHZvaWQgMCk7XG4gICAgLy8gVXNlZCBmb3IgY2FjaGUga2V5XG4gICAgLy8gYHVzZU1lbW9gIG5vIG5lZWQgdG8gdXBkYXRlIGlmIGBpZGAgbm90IGNoYW5nZVxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImlkXCIsIDApO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImRpZmZLZXlzXCIsIG5ldyBTZXQoKSk7XG4gICAgdGhpcy5tYXBzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuICBfY3JlYXRlQ2xhc3MoQ2FjaGVNYXAsIFt7XG4gICAga2V5OiBcInNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgdGhpcy5tYXBzW2tleV0gPSB2YWx1ZTtcbiAgICAgIHRoaXMuaWQgKz0gMTtcbiAgICAgIHRoaXMuZGlmZktleXMuYWRkKGtleSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5tYXBzW2tleV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FjaGVNYXAgd2lsbCByZWNvcmQgdGhlIGtleSBjaGFuZ2VkLlxuICAgICAqIFRvIGhlbHAgdG8ga25vdyB3aGF0J3MgdXBkYXRlIGluIHRoZSBuZXh0IHJlbmRlci5cbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogXCJyZXNldFJlY29yZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNldFJlY29yZCgpIHtcbiAgICAgIHRoaXMuZGlmZktleXMuY2xlYXIoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0UmVjb3JkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFJlY29yZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpZmZLZXlzO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gQ2FjaGVNYXA7XG59KCk7XG5leHBvcnQgZGVmYXVsdCBDYWNoZU1hcDsiLCAiaW1wb3J0IHVzZUxheW91dEVmZmVjdCBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VMYXlvdXRFZmZlY3RcIjtcbmltcG9ydCB7IHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbnZhciBTTU9PVEhfUFRHID0gMTQgLyAxNTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZU1vYmlsZVRvdWNoTW92ZShpblZpcnR1YWwsIGxpc3RSZWYsIGNhbGxiYWNrKSB7XG4gIHZhciB0b3VjaGVkUmVmID0gdXNlUmVmKGZhbHNlKTtcbiAgdmFyIHRvdWNoWFJlZiA9IHVzZVJlZigwKTtcbiAgdmFyIHRvdWNoWVJlZiA9IHVzZVJlZigwKTtcbiAgdmFyIGVsZW1lbnRSZWYgPSB1c2VSZWYobnVsbCk7XG5cbiAgLy8gU21vb3RoIHNjcm9sbFxuICB2YXIgaW50ZXJ2YWxSZWYgPSB1c2VSZWYobnVsbCk7XG5cbiAgLyogZXNsaW50LWRpc2FibGUgcHJlZmVyLWNvbnN0ICovXG4gIHZhciBjbGVhblVwRXZlbnRzO1xuICB2YXIgb25Ub3VjaE1vdmUgPSBmdW5jdGlvbiBvblRvdWNoTW92ZShlKSB7XG4gICAgaWYgKHRvdWNoZWRSZWYuY3VycmVudCkge1xuICAgICAgdmFyIGN1cnJlbnRYID0gTWF0aC5jZWlsKGUudG91Y2hlc1swXS5wYWdlWCk7XG4gICAgICB2YXIgY3VycmVudFkgPSBNYXRoLmNlaWwoZS50b3VjaGVzWzBdLnBhZ2VZKTtcbiAgICAgIHZhciBvZmZzZXRYID0gdG91Y2hYUmVmLmN1cnJlbnQgLSBjdXJyZW50WDtcbiAgICAgIHZhciBvZmZzZXRZID0gdG91Y2hZUmVmLmN1cnJlbnQgLSBjdXJyZW50WTtcbiAgICAgIHZhciBfaXNIb3Jpem9udGFsID0gTWF0aC5hYnMob2Zmc2V0WCkgPiBNYXRoLmFicyhvZmZzZXRZKTtcbiAgICAgIGlmIChfaXNIb3Jpem9udGFsKSB7XG4gICAgICAgIHRvdWNoWFJlZi5jdXJyZW50ID0gY3VycmVudFg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0b3VjaFlSZWYuY3VycmVudCA9IGN1cnJlbnRZO1xuICAgICAgfVxuICAgICAgdmFyIHNjcm9sbEhhbmRsZWQgPSBjYWxsYmFjayhfaXNIb3Jpem9udGFsLCBfaXNIb3Jpem9udGFsID8gb2Zmc2V0WCA6IG9mZnNldFksIGZhbHNlLCBlKTtcbiAgICAgIGlmIChzY3JvbGxIYW5kbGVkKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cblxuICAgICAgLy8gU21vb3RoIGludGVydmFsXG4gICAgICBjbGVhckludGVydmFsKGludGVydmFsUmVmLmN1cnJlbnQpO1xuICAgICAgaWYgKHNjcm9sbEhhbmRsZWQpIHtcbiAgICAgICAgaW50ZXJ2YWxSZWYuY3VycmVudCA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoX2lzSG9yaXpvbnRhbCkge1xuICAgICAgICAgICAgb2Zmc2V0WCAqPSBTTU9PVEhfUFRHO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvZmZzZXRZICo9IFNNT09USF9QVEc7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBvZmZzZXQgPSBNYXRoLmZsb29yKF9pc0hvcml6b250YWwgPyBvZmZzZXRYIDogb2Zmc2V0WSk7XG4gICAgICAgICAgaWYgKCFjYWxsYmFjayhfaXNIb3Jpem9udGFsLCBvZmZzZXQsIHRydWUpIHx8IE1hdGguYWJzKG9mZnNldCkgPD0gMC4xKSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsUmVmLmN1cnJlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgMTYpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgdmFyIG9uVG91Y2hFbmQgPSBmdW5jdGlvbiBvblRvdWNoRW5kKCkge1xuICAgIHRvdWNoZWRSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIGNsZWFuVXBFdmVudHMoKTtcbiAgfTtcbiAgdmFyIG9uVG91Y2hTdGFydCA9IGZ1bmN0aW9uIG9uVG91Y2hTdGFydChlKSB7XG4gICAgY2xlYW5VcEV2ZW50cygpO1xuICAgIGlmIChlLnRvdWNoZXMubGVuZ3RoID09PSAxICYmICF0b3VjaGVkUmVmLmN1cnJlbnQpIHtcbiAgICAgIHRvdWNoZWRSZWYuY3VycmVudCA9IHRydWU7XG4gICAgICB0b3VjaFhSZWYuY3VycmVudCA9IE1hdGguY2VpbChlLnRvdWNoZXNbMF0ucGFnZVgpO1xuICAgICAgdG91Y2hZUmVmLmN1cnJlbnQgPSBNYXRoLmNlaWwoZS50b3VjaGVzWzBdLnBhZ2VZKTtcbiAgICAgIGVsZW1lbnRSZWYuY3VycmVudCA9IGUudGFyZ2V0O1xuICAgICAgZWxlbWVudFJlZi5jdXJyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIG9uVG91Y2hNb3ZlLCB7XG4gICAgICAgIHBhc3NpdmU6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIGVsZW1lbnRSZWYuY3VycmVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIG9uVG91Y2hFbmQsIHtcbiAgICAgICAgcGFzc2l2ZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICBjbGVhblVwRXZlbnRzID0gZnVuY3Rpb24gY2xlYW5VcEV2ZW50cygpIHtcbiAgICBpZiAoZWxlbWVudFJlZi5jdXJyZW50KSB7XG4gICAgICBlbGVtZW50UmVmLmN1cnJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgb25Ub3VjaE1vdmUpO1xuICAgICAgZWxlbWVudFJlZi5jdXJyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgb25Ub3VjaEVuZCk7XG4gICAgfVxuICB9O1xuICB1c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChpblZpcnR1YWwpIHtcbiAgICAgIGxpc3RSZWYuY3VycmVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0Jywgb25Ub3VjaFN0YXJ0LCB7XG4gICAgICAgIHBhc3NpdmU6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9saXN0UmVmJGN1cnJlbnQ7XG4gICAgICAoX2xpc3RSZWYkY3VycmVudCA9IGxpc3RSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2xpc3RSZWYkY3VycmVudCA9PT0gdm9pZCAwIHx8IF9saXN0UmVmJGN1cnJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIG9uVG91Y2hTdGFydCk7XG4gICAgICBjbGVhblVwRXZlbnRzKCk7XG4gICAgICBjbGVhckludGVydmFsKGludGVydmFsUmVmLmN1cnJlbnQpO1xuICAgIH07XG4gIH0sIFtpblZpcnR1YWxdKTtcbn0iLCAiaW1wb3J0IHJhZiBmcm9tIFwicmMtdXRpbC9lcy9yYWZcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmZ1bmN0aW9uIHNtb290aFNjcm9sbE9mZnNldChvZmZzZXQpIHtcbiAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5wb3cob2Zmc2V0LCAwLjUpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWdlWFkoZSwgaG9yaXpvbnRhbCkge1xuICB2YXIgb2JqID0gJ3RvdWNoZXMnIGluIGUgPyBlLnRvdWNoZXNbMF0gOiBlO1xuICByZXR1cm4gb2JqW2hvcml6b250YWwgPyAncGFnZVgnIDogJ3BhZ2VZJ10gLSB3aW5kb3dbaG9yaXpvbnRhbCA/ICdzY3JvbGxYJyA6ICdzY3JvbGxZJ107XG59XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VTY3JvbGxEcmFnKGluVmlydHVhbCwgY29tcG9uZW50UmVmLCBvblNjcm9sbE9mZnNldCkge1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBlbGUgPSBjb21wb25lbnRSZWYuY3VycmVudDtcbiAgICBpZiAoaW5WaXJ0dWFsICYmIGVsZSkge1xuICAgICAgdmFyIG1vdXNlRG93bkxvY2sgPSBmYWxzZTtcbiAgICAgIHZhciByYWZJZDtcbiAgICAgIHZhciBfb2Zmc2V0O1xuICAgICAgdmFyIHN0b3BTY3JvbGwgPSBmdW5jdGlvbiBzdG9wU2Nyb2xsKCkge1xuICAgICAgICByYWYuY2FuY2VsKHJhZklkKTtcbiAgICAgIH07XG4gICAgICB2YXIgY29udGludWVTY3JvbGwgPSBmdW5jdGlvbiBjb250aW51ZVNjcm9sbCgpIHtcbiAgICAgICAgc3RvcFNjcm9sbCgpO1xuICAgICAgICByYWZJZCA9IHJhZihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgb25TY3JvbGxPZmZzZXQoX29mZnNldCk7XG4gICAgICAgICAgY29udGludWVTY3JvbGwoKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgdmFyIG9uTW91c2VEb3duID0gZnVuY3Rpb24gb25Nb3VzZURvd24oZSkge1xuICAgICAgICAvLyBTa2lwIGlmIGVsZW1lbnQgc2V0IGRyYWdnYWJsZVxuICAgICAgICBpZiAoZS50YXJnZXQuZHJhZ2dhYmxlIHx8IGUuYnV0dG9uICE9PSAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNraXAgaWYgbmVzdCBMaXN0IGhhcyBoYW5kbGVkIHRoaXMgZXZlbnRcbiAgICAgICAgdmFyIGV2ZW50ID0gZTtcbiAgICAgICAgaWYgKCFldmVudC5fdmlydHVhbEhhbmRsZWQpIHtcbiAgICAgICAgICBldmVudC5fdmlydHVhbEhhbmRsZWQgPSB0cnVlO1xuICAgICAgICAgIG1vdXNlRG93bkxvY2sgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdmFyIG9uTW91c2VVcCA9IGZ1bmN0aW9uIG9uTW91c2VVcCgpIHtcbiAgICAgICAgbW91c2VEb3duTG9jayA9IGZhbHNlO1xuICAgICAgICBzdG9wU2Nyb2xsKCk7XG4gICAgICB9O1xuICAgICAgdmFyIG9uTW91c2VNb3ZlID0gZnVuY3Rpb24gb25Nb3VzZU1vdmUoZSkge1xuICAgICAgICBpZiAobW91c2VEb3duTG9jaykge1xuICAgICAgICAgIHZhciBtb3VzZVkgPSBnZXRQYWdlWFkoZSwgZmFsc2UpO1xuICAgICAgICAgIHZhciBfZWxlJGdldEJvdW5kaW5nQ2xpZW4gPSBlbGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgICAgICB0b3AgPSBfZWxlJGdldEJvdW5kaW5nQ2xpZW4udG9wLFxuICAgICAgICAgICAgYm90dG9tID0gX2VsZSRnZXRCb3VuZGluZ0NsaWVuLmJvdHRvbTtcbiAgICAgICAgICBpZiAobW91c2VZIDw9IHRvcCkge1xuICAgICAgICAgICAgdmFyIGRpZmYgPSB0b3AgLSBtb3VzZVk7XG4gICAgICAgICAgICBfb2Zmc2V0ID0gLXNtb290aFNjcm9sbE9mZnNldChkaWZmKTtcbiAgICAgICAgICAgIGNvbnRpbnVlU2Nyb2xsKCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChtb3VzZVkgPj0gYm90dG9tKSB7XG4gICAgICAgICAgICB2YXIgX2RpZmYgPSBtb3VzZVkgLSBib3R0b207XG4gICAgICAgICAgICBfb2Zmc2V0ID0gc21vb3RoU2Nyb2xsT2Zmc2V0KF9kaWZmKTtcbiAgICAgICAgICAgIGNvbnRpbnVlU2Nyb2xsKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0b3BTY3JvbGwoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBlbGUuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgb25Nb3VzZURvd24pO1xuICAgICAgZWxlLm93bmVyRG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XG4gICAgICBlbGUub3duZXJEb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICBlbGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgb25Nb3VzZURvd24pO1xuICAgICAgICBlbGUub3duZXJEb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Nb3VzZVVwKTtcbiAgICAgICAgZWxlLm93bmVyRG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xuICAgICAgICBzdG9wU2Nyb2xsKCk7XG4gICAgICB9O1xuICAgIH1cbiAgfSwgW2luVmlydHVhbF0pO1xufSIsICJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wYXJhbS1yZWFzc2lnbiAqL1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHJhZiBmcm9tIFwicmMtdXRpbC9lcy9yYWZcIjtcbmltcG9ydCB1c2VMYXlvdXRFZmZlY3QgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlTGF5b3V0RWZmZWN0XCI7XG5pbXBvcnQgeyB3YXJuaW5nIH0gZnJvbSAncmMtdXRpbCc7XG52YXIgTUFYX1RJTUVTID0gMTA7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VTY3JvbGxUbyhjb250YWluZXJSZWYsIGRhdGEsIGhlaWdodHMsIGl0ZW1IZWlnaHQsIGdldEtleSwgY29sbGVjdEhlaWdodCwgc3luY1Njcm9sbFRvcCwgdHJpZ2dlckZsYXNoKSB7XG4gIHZhciBzY3JvbGxSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKG51bGwpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIHN5bmNTdGF0ZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0U3luY1N0YXRlID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBTeW5jIFNjcm9sbCA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB1c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChzeW5jU3RhdGUgJiYgc3luY1N0YXRlLnRpbWVzIDwgTUFYX1RJTUVTKSB7XG4gICAgICAvLyBOZXZlciByZWFjaFxuICAgICAgaWYgKCFjb250YWluZXJSZWYuY3VycmVudCkge1xuICAgICAgICBzZXRTeW5jU3RhdGUoZnVuY3Rpb24gKG9yaSkge1xuICAgICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHt9LCBvcmkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29sbGVjdEhlaWdodCgpO1xuICAgICAgdmFyIHRhcmdldEFsaWduID0gc3luY1N0YXRlLnRhcmdldEFsaWduLFxuICAgICAgICBvcmlnaW5BbGlnbiA9IHN5bmNTdGF0ZS5vcmlnaW5BbGlnbixcbiAgICAgICAgaW5kZXggPSBzeW5jU3RhdGUuaW5kZXgsXG4gICAgICAgIG9mZnNldCA9IHN5bmNTdGF0ZS5vZmZzZXQ7XG4gICAgICB2YXIgaGVpZ2h0ID0gY29udGFpbmVyUmVmLmN1cnJlbnQuY2xpZW50SGVpZ2h0O1xuICAgICAgdmFyIG5lZWRDb2xsZWN0SGVpZ2h0ID0gZmFsc2U7XG4gICAgICB2YXIgbmV3VGFyZ2V0QWxpZ24gPSB0YXJnZXRBbGlnbjtcbiAgICAgIHZhciB0YXJnZXRUb3AgPSBudWxsO1xuXG4gICAgICAvLyBHbyB0byBuZXh0IGZyYW1lIGlmIGhlaWdodCBub3QgZXhpc3RcbiAgICAgIGlmIChoZWlnaHQpIHtcbiAgICAgICAgdmFyIG1lcmdlZEFsaWduID0gdGFyZ2V0QWxpZ24gfHwgb3JpZ2luQWxpZ247XG5cbiAgICAgICAgLy8gR2V0IHRvcCAmIGJvdHRvbVxuICAgICAgICB2YXIgc3RhY2tUb3AgPSAwO1xuICAgICAgICB2YXIgaXRlbVRvcCA9IDA7XG4gICAgICAgIHZhciBpdGVtQm90dG9tID0gMDtcbiAgICAgICAgdmFyIG1heExlbiA9IE1hdGgubWluKGRhdGEubGVuZ3RoIC0gMSwgaW5kZXgpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBtYXhMZW47IGkgKz0gMSkge1xuICAgICAgICAgIHZhciBrZXkgPSBnZXRLZXkoZGF0YVtpXSk7XG4gICAgICAgICAgaXRlbVRvcCA9IHN0YWNrVG9wO1xuICAgICAgICAgIHZhciBjYWNoZUhlaWdodCA9IGhlaWdodHMuZ2V0KGtleSk7XG4gICAgICAgICAgaXRlbUJvdHRvbSA9IGl0ZW1Ub3AgKyAoY2FjaGVIZWlnaHQgPT09IHVuZGVmaW5lZCA/IGl0ZW1IZWlnaHQgOiBjYWNoZUhlaWdodCk7XG4gICAgICAgICAgc3RhY2tUb3AgPSBpdGVtQm90dG9tO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgbmVlZCBzeW5jIGhlaWdodCAodmlzaWJsZSByYW5nZSBoYXMgaXRlbSBub3QgcmVjb3JkIGhlaWdodClcbiAgICAgICAgdmFyIGxlZnRIZWlnaHQgPSBtZXJnZWRBbGlnbiA9PT0gJ3RvcCcgPyBvZmZzZXQgOiBoZWlnaHQgLSBvZmZzZXQ7XG4gICAgICAgIGZvciAodmFyIF9pID0gbWF4TGVuOyBfaSA+PSAwOyBfaSAtPSAxKSB7XG4gICAgICAgICAgdmFyIF9rZXkgPSBnZXRLZXkoZGF0YVtfaV0pO1xuICAgICAgICAgIHZhciBfY2FjaGVIZWlnaHQgPSBoZWlnaHRzLmdldChfa2V5KTtcbiAgICAgICAgICBpZiAoX2NhY2hlSGVpZ2h0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG5lZWRDb2xsZWN0SGVpZ2h0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZWZ0SGVpZ2h0IC09IF9jYWNoZUhlaWdodDtcbiAgICAgICAgICBpZiAobGVmdEhlaWdodCA8PSAwKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTY3JvbGwgdG9cbiAgICAgICAgc3dpdGNoIChtZXJnZWRBbGlnbikge1xuICAgICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgICB0YXJnZXRUb3AgPSBpdGVtVG9wIC0gb2Zmc2V0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICAgIHRhcmdldFRvcCA9IGl0ZW1Cb3R0b20gLSBoZWlnaHQgKyBvZmZzZXQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB2YXIgc2Nyb2xsVG9wID0gY29udGFpbmVyUmVmLmN1cnJlbnQuc2Nyb2xsVG9wO1xuICAgICAgICAgICAgICB2YXIgc2Nyb2xsQm90dG9tID0gc2Nyb2xsVG9wICsgaGVpZ2h0O1xuICAgICAgICAgICAgICBpZiAoaXRlbVRvcCA8IHNjcm9sbFRvcCkge1xuICAgICAgICAgICAgICAgIG5ld1RhcmdldEFsaWduID0gJ3RvcCc7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbUJvdHRvbSA+IHNjcm9sbEJvdHRvbSkge1xuICAgICAgICAgICAgICAgIG5ld1RhcmdldEFsaWduID0gJ2JvdHRvbSc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGFyZ2V0VG9wICE9PSBudWxsKSB7XG4gICAgICAgICAgc3luY1Njcm9sbFRvcCh0YXJnZXRUb3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT25lIG1vcmUgdGltZSBmb3Igc3luY1xuICAgICAgICBpZiAodGFyZ2V0VG9wICE9PSBzeW5jU3RhdGUubGFzdFRvcCkge1xuICAgICAgICAgIG5lZWRDb2xsZWN0SGVpZ2h0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUcmlnZ2VyIG5leHQgZWZmZWN0XG4gICAgICBpZiAobmVlZENvbGxlY3RIZWlnaHQpIHtcbiAgICAgICAgc2V0U3luY1N0YXRlKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3luY1N0YXRlKSwge30sIHtcbiAgICAgICAgICB0aW1lczogc3luY1N0YXRlLnRpbWVzICsgMSxcbiAgICAgICAgICB0YXJnZXRBbGlnbjogbmV3VGFyZ2V0QWxpZ24sXG4gICAgICAgICAgbGFzdFRvcDogdGFyZ2V0VG9wXG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgKHN5bmNTdGF0ZSA9PT0gbnVsbCB8fCBzeW5jU3RhdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN5bmNTdGF0ZS50aW1lcykgPT09IE1BWF9USU1FUykge1xuICAgICAgd2FybmluZyhmYWxzZSwgJ1NlZW1zIGBzY3JvbGxUb2Agd2l0aCBgcmMtdmlydHVhbC1saXN0YCByZWFjaCB0aGUgbWF4IGxpbWl0YXRpb24uIFBsZWFzZSBmaXJlIGlzc3VlIGZvciB1cy4gVGhhbmtzLicpO1xuICAgIH1cbiAgfSwgW3N5bmNTdGF0ZSwgY29udGFpbmVyUmVmLmN1cnJlbnRdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gU2Nyb2xsIFRvID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICByZXR1cm4gZnVuY3Rpb24gKGFyZykge1xuICAgIC8vIFdoZW4gbm90IGFyZ3VtZW50IHByb3ZpZGVkLCB3ZSB0aGluayBkZXYgbWF5IHdhbnQgdG8gc2hvdyB0aGUgc2Nyb2xsYmFyXG4gICAgaWYgKGFyZyA9PT0gbnVsbCB8fCBhcmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdHJpZ2dlckZsYXNoKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gTm9ybWFsIHNjcm9sbCBsb2dpY1xuICAgIHJhZi5jYW5jZWwoc2Nyb2xsUmVmLmN1cnJlbnQpO1xuICAgIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgICAgc3luY1Njcm9sbFRvcChhcmcpO1xuICAgIH0gZWxzZSBpZiAoYXJnICYmIF90eXBlb2YoYXJnKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHZhciBpbmRleDtcbiAgICAgIHZhciBhbGlnbiA9IGFyZy5hbGlnbjtcbiAgICAgIGlmICgnaW5kZXgnIGluIGFyZykge1xuICAgICAgICBpbmRleCA9IGFyZy5pbmRleDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluZGV4ID0gZGF0YS5maW5kSW5kZXgoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICByZXR1cm4gZ2V0S2V5KGl0ZW0pID09PSBhcmcua2V5O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHZhciBfYXJnJG9mZnNldCA9IGFyZy5vZmZzZXQsXG4gICAgICAgIG9mZnNldCA9IF9hcmckb2Zmc2V0ID09PSB2b2lkIDAgPyAwIDogX2FyZyRvZmZzZXQ7XG4gICAgICBzZXRTeW5jU3RhdGUoe1xuICAgICAgICB0aW1lczogMCxcbiAgICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgICBvZmZzZXQ6IG9mZnNldCxcbiAgICAgICAgb3JpZ2luQWxpZ246IGFsaWduXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG59IiwgImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCByYWYgZnJvbSBcInJjLXV0aWwvZXMvcmFmXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBnZXRQYWdlWFkgfSBmcm9tIFwiLi9ob29rcy91c2VTY3JvbGxEcmFnXCI7XG52YXIgU2Nyb2xsQmFyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBydGwgPSBwcm9wcy5ydGwsXG4gICAgc2Nyb2xsT2Zmc2V0ID0gcHJvcHMuc2Nyb2xsT2Zmc2V0LFxuICAgIHNjcm9sbFJhbmdlID0gcHJvcHMuc2Nyb2xsUmFuZ2UsXG4gICAgb25TdGFydE1vdmUgPSBwcm9wcy5vblN0YXJ0TW92ZSxcbiAgICBvblN0b3BNb3ZlID0gcHJvcHMub25TdG9wTW92ZSxcbiAgICBvblNjcm9sbCA9IHByb3BzLm9uU2Nyb2xsLFxuICAgIGhvcml6b250YWwgPSBwcm9wcy5ob3Jpem9udGFsLFxuICAgIHNwaW5TaXplID0gcHJvcHMuc3BpblNpemUsXG4gICAgY29udGFpbmVyU2l6ZSA9IHByb3BzLmNvbnRhaW5lclNpemUsXG4gICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICBwcm9wc1RodW1iU3R5bGUgPSBwcm9wcy50aHVtYlN0eWxlLFxuICAgIHNob3dTY3JvbGxCYXIgPSBwcm9wcy5zaG93U2Nyb2xsQmFyO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIGRyYWdnaW5nID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXREcmFnZ2luZyA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUzID0gUmVhY3QudXNlU3RhdGUobnVsbCksXG4gICAgX1JlYWN0JHVzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTMsIDIpLFxuICAgIHBhZ2VYWSA9IF9SZWFjdCR1c2VTdGF0ZTRbMF0sXG4gICAgc2V0UGFnZVhZID0gX1JlYWN0JHVzZVN0YXRlNFsxXTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTUgPSBSZWFjdC51c2VTdGF0ZShudWxsKSxcbiAgICBfUmVhY3QkdXNlU3RhdGU2ID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlNSwgMiksXG4gICAgc3RhcnRUb3AgPSBfUmVhY3QkdXNlU3RhdGU2WzBdLFxuICAgIHNldFN0YXJ0VG9wID0gX1JlYWN0JHVzZVN0YXRlNlsxXTtcbiAgdmFyIGlzTFRSID0gIXJ0bDtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IFJlZnMgPT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgc2Nyb2xsYmFyUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIHZhciB0aHVtYlJlZiA9IFJlYWN0LnVzZVJlZigpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09IFZpc2libGUgPT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfUmVhY3QkdXNlU3RhdGU3ID0gUmVhY3QudXNlU3RhdGUoc2hvd1Njcm9sbEJhciksXG4gICAgX1JlYWN0JHVzZVN0YXRlOCA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTcsIDIpLFxuICAgIHZpc2libGUgPSBfUmVhY3QkdXNlU3RhdGU4WzBdLFxuICAgIHNldFZpc2libGUgPSBfUmVhY3QkdXNlU3RhdGU4WzFdO1xuICB2YXIgdmlzaWJsZVRpbWVvdXRSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgdmFyIGRlbGF5SGlkZGVuID0gZnVuY3Rpb24gZGVsYXlIaWRkZW4oKSB7XG4gICAgaWYgKHNob3dTY3JvbGxCYXIgPT09IHRydWUgfHwgc2hvd1Njcm9sbEJhciA9PT0gZmFsc2UpIHJldHVybjtcbiAgICBjbGVhclRpbWVvdXQodmlzaWJsZVRpbWVvdXRSZWYuY3VycmVudCk7XG4gICAgc2V0VmlzaWJsZSh0cnVlKTtcbiAgICB2aXNpYmxlVGltZW91dFJlZi5jdXJyZW50ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBzZXRWaXNpYmxlKGZhbHNlKTtcbiAgICB9LCAzMDAwKTtcbiAgfTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gUmFuZ2UgPT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgZW5hYmxlU2Nyb2xsUmFuZ2UgPSBzY3JvbGxSYW5nZSAtIGNvbnRhaW5lclNpemUgfHwgMDtcbiAgdmFyIGVuYWJsZU9mZnNldFJhbmdlID0gY29udGFpbmVyU2l6ZSAtIHNwaW5TaXplIHx8IDA7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBUb3AgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHRvcCA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGlmIChzY3JvbGxPZmZzZXQgPT09IDAgfHwgZW5hYmxlU2Nyb2xsUmFuZ2UgPT09IDApIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICB2YXIgcHRnID0gc2Nyb2xsT2Zmc2V0IC8gZW5hYmxlU2Nyb2xsUmFuZ2U7XG4gICAgcmV0dXJuIHB0ZyAqIGVuYWJsZU9mZnNldFJhbmdlO1xuICB9LCBbc2Nyb2xsT2Zmc2V0LCBlbmFibGVTY3JvbGxSYW5nZSwgZW5hYmxlT2Zmc2V0UmFuZ2VdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09IENvbnRhaW5lciA9PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgb25Db250YWluZXJNb3VzZURvd24gPSBmdW5jdGlvbiBvbkNvbnRhaW5lck1vdXNlRG93bihlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIH07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IFRodW1iID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHN0YXRlUmVmID0gUmVhY3QudXNlUmVmKHtcbiAgICB0b3A6IHRvcCxcbiAgICBkcmFnZ2luZzogZHJhZ2dpbmcsXG4gICAgcGFnZVk6IHBhZ2VYWSxcbiAgICBzdGFydFRvcDogc3RhcnRUb3BcbiAgfSk7XG4gIHN0YXRlUmVmLmN1cnJlbnQgPSB7XG4gICAgdG9wOiB0b3AsXG4gICAgZHJhZ2dpbmc6IGRyYWdnaW5nLFxuICAgIHBhZ2VZOiBwYWdlWFksXG4gICAgc3RhcnRUb3A6IHN0YXJ0VG9wXG4gIH07XG4gIHZhciBvblRodW1iTW91c2VEb3duID0gZnVuY3Rpb24gb25UaHVtYk1vdXNlRG93bihlKSB7XG4gICAgc2V0RHJhZ2dpbmcodHJ1ZSk7XG4gICAgc2V0UGFnZVhZKGdldFBhZ2VYWShlLCBob3Jpem9udGFsKSk7XG4gICAgc2V0U3RhcnRUb3Aoc3RhdGVSZWYuY3VycmVudC50b3ApO1xuICAgIG9uU3RhcnRNb3ZlKCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIH07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IEVmZmVjdCA9PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvLyBSZWFjdCBtYWtlIGV2ZW50IGFzIHBhc3NpdmUsIGJ1dCB3ZSBuZWVkIHRvIHByZXZlbnREZWZhdWx0XG4gIC8vIEFkZCBldmVudCBvbiBkb20gZGlyZWN0bHkgaW5zdGVhZC5cbiAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzk4MDlcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgb25TY3JvbGxiYXJUb3VjaFN0YXJ0ID0gZnVuY3Rpb24gb25TY3JvbGxiYXJUb3VjaFN0YXJ0KGUpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9O1xuICAgIHZhciBzY3JvbGxiYXJFbGUgPSBzY3JvbGxiYXJSZWYuY3VycmVudDtcbiAgICB2YXIgdGh1bWJFbGUgPSB0aHVtYlJlZi5jdXJyZW50O1xuICAgIHNjcm9sbGJhckVsZS5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0Jywgb25TY3JvbGxiYXJUb3VjaFN0YXJ0LCB7XG4gICAgICBwYXNzaXZlOiBmYWxzZVxuICAgIH0pO1xuICAgIHRodW1iRWxlLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBvblRodW1iTW91c2VEb3duLCB7XG4gICAgICBwYXNzaXZlOiBmYWxzZVxuICAgIH0pO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBzY3JvbGxiYXJFbGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIG9uU2Nyb2xsYmFyVG91Y2hTdGFydCk7XG4gICAgICB0aHVtYkVsZS5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0Jywgb25UaHVtYk1vdXNlRG93bik7XG4gICAgfTtcbiAgfSwgW10pO1xuXG4gIC8vIFBhc3MgdG8gZWZmZWN0XG4gIHZhciBlbmFibGVTY3JvbGxSYW5nZVJlZiA9IFJlYWN0LnVzZVJlZigpO1xuICBlbmFibGVTY3JvbGxSYW5nZVJlZi5jdXJyZW50ID0gZW5hYmxlU2Nyb2xsUmFuZ2U7XG4gIHZhciBlbmFibGVPZmZzZXRSYW5nZVJlZiA9IFJlYWN0LnVzZVJlZigpO1xuICBlbmFibGVPZmZzZXRSYW5nZVJlZi5jdXJyZW50ID0gZW5hYmxlT2Zmc2V0UmFuZ2U7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGRyYWdnaW5nKSB7XG4gICAgICB2YXIgbW92ZVJhZklkO1xuICAgICAgdmFyIG9uTW91c2VNb3ZlID0gZnVuY3Rpb24gb25Nb3VzZU1vdmUoZSkge1xuICAgICAgICB2YXIgX3N0YXRlUmVmJGN1cnJlbnQgPSBzdGF0ZVJlZi5jdXJyZW50LFxuICAgICAgICAgIHN0YXRlRHJhZ2dpbmcgPSBfc3RhdGVSZWYkY3VycmVudC5kcmFnZ2luZyxcbiAgICAgICAgICBzdGF0ZVBhZ2VZID0gX3N0YXRlUmVmJGN1cnJlbnQucGFnZVksXG4gICAgICAgICAgc3RhdGVTdGFydFRvcCA9IF9zdGF0ZVJlZiRjdXJyZW50LnN0YXJ0VG9wO1xuICAgICAgICByYWYuY2FuY2VsKG1vdmVSYWZJZCk7XG4gICAgICAgIHZhciByZWN0ID0gc2Nyb2xsYmFyUmVmLmN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHZhciBzY2FsZSA9IGNvbnRhaW5lclNpemUgLyAoaG9yaXpvbnRhbCA/IHJlY3Qud2lkdGggOiByZWN0LmhlaWdodCk7XG4gICAgICAgIGlmIChzdGF0ZURyYWdnaW5nKSB7XG4gICAgICAgICAgdmFyIG9mZnNldCA9IChnZXRQYWdlWFkoZSwgaG9yaXpvbnRhbCkgLSBzdGF0ZVBhZ2VZKSAqIHNjYWxlO1xuICAgICAgICAgIHZhciBuZXdUb3AgPSBzdGF0ZVN0YXJ0VG9wO1xuICAgICAgICAgIGlmICghaXNMVFIgJiYgaG9yaXpvbnRhbCkge1xuICAgICAgICAgICAgbmV3VG9wIC09IG9mZnNldDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3VG9wICs9IG9mZnNldDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIHRtcEVuYWJsZVNjcm9sbFJhbmdlID0gZW5hYmxlU2Nyb2xsUmFuZ2VSZWYuY3VycmVudDtcbiAgICAgICAgICB2YXIgdG1wRW5hYmxlT2Zmc2V0UmFuZ2UgPSBlbmFibGVPZmZzZXRSYW5nZVJlZi5jdXJyZW50O1xuICAgICAgICAgIHZhciBwdGcgPSB0bXBFbmFibGVPZmZzZXRSYW5nZSA/IG5ld1RvcCAvIHRtcEVuYWJsZU9mZnNldFJhbmdlIDogMDtcbiAgICAgICAgICB2YXIgbmV3U2Nyb2xsVG9wID0gTWF0aC5jZWlsKHB0ZyAqIHRtcEVuYWJsZVNjcm9sbFJhbmdlKTtcbiAgICAgICAgICBuZXdTY3JvbGxUb3AgPSBNYXRoLm1heChuZXdTY3JvbGxUb3AsIDApO1xuICAgICAgICAgIG5ld1Njcm9sbFRvcCA9IE1hdGgubWluKG5ld1Njcm9sbFRvcCwgdG1wRW5hYmxlU2Nyb2xsUmFuZ2UpO1xuICAgICAgICAgIG1vdmVSYWZJZCA9IHJhZihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBvblNjcm9sbChuZXdTY3JvbGxUb3AsIGhvcml6b250YWwpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdmFyIG9uTW91c2VVcCA9IGZ1bmN0aW9uIG9uTW91c2VVcCgpIHtcbiAgICAgICAgc2V0RHJhZ2dpbmcoZmFsc2UpO1xuICAgICAgICBvblN0b3BNb3ZlKCk7XG4gICAgICB9O1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlLCB7XG4gICAgICAgIHBhc3NpdmU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIG9uTW91c2VNb3ZlLCB7XG4gICAgICAgIHBhc3NpdmU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXAsIHtcbiAgICAgICAgcGFzc2l2ZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBvbk1vdXNlVXAsIHtcbiAgICAgICAgcGFzc2l2ZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgb25Nb3VzZU1vdmUpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIG9uTW91c2VVcCk7XG4gICAgICAgIHJhZi5jYW5jZWwobW92ZVJhZklkKTtcbiAgICAgIH07XG4gICAgfVxuICB9LCBbZHJhZ2dpbmddKTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBkZWxheUhpZGRlbigpO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBjbGVhclRpbWVvdXQodmlzaWJsZVRpbWVvdXRSZWYuY3VycmVudCk7XG4gICAgfTtcbiAgfSwgW3Njcm9sbE9mZnNldF0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT0gSW1wZXJhdGl2ZSA9PT09PT09PT09PT09PT09PT09PT09XG4gIFJlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRlbGF5SGlkZGVuOiBkZWxheUhpZGRlblxuICAgIH07XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBzY3JvbGxiYXJQcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNjcm9sbGJhclwiKTtcbiAgdmFyIGNvbnRhaW5lclN0eWxlID0ge1xuICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgIHZpc2liaWxpdHk6IHZpc2libGUgPyBudWxsIDogJ2hpZGRlbidcbiAgfTtcbiAgdmFyIHRodW1iU3R5bGUgPSB7XG4gICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgYmFja2dyb3VuZDogJ3JnYmEoMCwgMCwgMCwgMC41KScsXG4gICAgYm9yZGVyUmFkaXVzOiA5OSxcbiAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICB1c2VyU2VsZWN0OiAnbm9uZSdcbiAgfTtcbiAgaWYgKGhvcml6b250YWwpIHtcbiAgICAvLyBDb250YWluZXJcbiAgICBjb250YWluZXJTdHlsZS5oZWlnaHQgPSA4O1xuICAgIGNvbnRhaW5lclN0eWxlLmxlZnQgPSAwO1xuICAgIGNvbnRhaW5lclN0eWxlLnJpZ2h0ID0gMDtcbiAgICBjb250YWluZXJTdHlsZS5ib3R0b20gPSAwO1xuXG4gICAgLy8gVGh1bWJcbiAgICB0aHVtYlN0eWxlLmhlaWdodCA9ICcxMDAlJztcbiAgICB0aHVtYlN0eWxlLndpZHRoID0gc3BpblNpemU7XG4gICAgaWYgKGlzTFRSKSB7XG4gICAgICB0aHVtYlN0eWxlLmxlZnQgPSB0b3A7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRodW1iU3R5bGUucmlnaHQgPSB0b3A7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIENvbnRhaW5lclxuICAgIGNvbnRhaW5lclN0eWxlLndpZHRoID0gODtcbiAgICBjb250YWluZXJTdHlsZS50b3AgPSAwO1xuICAgIGNvbnRhaW5lclN0eWxlLmJvdHRvbSA9IDA7XG4gICAgaWYgKGlzTFRSKSB7XG4gICAgICBjb250YWluZXJTdHlsZS5yaWdodCA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRhaW5lclN0eWxlLmxlZnQgPSAwO1xuICAgIH1cblxuICAgIC8vIFRodW1iXG4gICAgdGh1bWJTdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICB0aHVtYlN0eWxlLmhlaWdodCA9IHNwaW5TaXplO1xuICAgIHRodW1iU3R5bGUudG9wID0gdG9wO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgcmVmOiBzY3JvbGxiYXJSZWYsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKHNjcm9sbGJhclByZWZpeENscywgX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHNjcm9sbGJhclByZWZpeENscywgXCItaG9yaXpvbnRhbFwiKSwgaG9yaXpvbnRhbCksIFwiXCIuY29uY2F0KHNjcm9sbGJhclByZWZpeENscywgXCItdmVydGljYWxcIiksICFob3Jpem9udGFsKSwgXCJcIi5jb25jYXQoc2Nyb2xsYmFyUHJlZml4Q2xzLCBcIi12aXNpYmxlXCIpLCB2aXNpYmxlKSksXG4gICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgY29udGFpbmVyU3R5bGUpLCBzdHlsZSksXG4gICAgb25Nb3VzZURvd246IG9uQ29udGFpbmVyTW91c2VEb3duLFxuICAgIG9uTW91c2VNb3ZlOiBkZWxheUhpZGRlblxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgcmVmOiB0aHVtYlJlZixcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQoc2Nyb2xsYmFyUHJlZml4Q2xzLCBcIi10aHVtYlwiKSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChzY3JvbGxiYXJQcmVmaXhDbHMsIFwiLXRodW1iLW1vdmluZ1wiKSwgZHJhZ2dpbmcpKSxcbiAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB0aHVtYlN0eWxlKSwgcHJvcHNUaHVtYlN0eWxlKSxcbiAgICBvbk1vdXNlRG93bjogb25UaHVtYk1vdXNlRG93blxuICB9KSk7XG59KTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFNjcm9sbEJhci5kaXNwbGF5TmFtZSA9ICdTY3JvbGxCYXInO1xufVxuZXhwb3J0IGRlZmF1bHQgU2Nyb2xsQmFyOyIsICJ2YXIgTUlOX1NJWkUgPSAyMDtcbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGluU2l6ZSgpIHtcbiAgdmFyIGNvbnRhaW5lclNpemUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IDA7XG4gIHZhciBzY3JvbGxSYW5nZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMDtcbiAgdmFyIGJhc2VTaXplID0gY29udGFpbmVyU2l6ZSAvIHNjcm9sbFJhbmdlICogY29udGFpbmVyU2l6ZTtcbiAgaWYgKGlzTmFOKGJhc2VTaXplKSkge1xuICAgIGJhc2VTaXplID0gMDtcbiAgfVxuICBiYXNlU2l6ZSA9IE1hdGgubWF4KGJhc2VTaXplLCBNSU5fU0laRSk7XG4gIHJldHVybiBNYXRoLmZsb29yKGJhc2VTaXplKTtcbn0iLCAiaW1wb3J0IExpc3QgZnJvbSBcIi4vTGlzdFwiO1xuZXhwb3J0IGRlZmF1bHQgTGlzdDsiLCAiLyogaXN0YW5idWwgaWdub3JlIGZpbGUgKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BsYXRmb3JtTWFjKCkge1xuICByZXR1cm4gLyhtYWNcXHNvc3xtYWNpbnRvc2gpL2kudGVzdChuYXZpZ2F0b3IuYXBwVmVyc2lvbik7XG59IiwgImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG4vKipcbiAqIENhY2hlIGB2YWx1ZWAgcmVsYXRlZCBMYWJlbGVkVmFsdWUgJiBvcHRpb25zLlxuICovXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gKGxhYmVsZWRWYWx1ZXMsIHZhbHVlT3B0aW9ucykge1xuICB2YXIgY2FjaGVSZWYgPSBSZWFjdC51c2VSZWYoe1xuICAgIHZhbHVlczogbmV3IE1hcCgpLFxuICAgIG9wdGlvbnM6IG5ldyBNYXAoKVxuICB9KTtcbiAgdmFyIGZpbGxlZExhYmVsZWRWYWx1ZXMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX2NhY2hlUmVmJGN1cnJlbnQgPSBjYWNoZVJlZi5jdXJyZW50LFxuICAgICAgcHJldlZhbHVlQ2FjaGUgPSBfY2FjaGVSZWYkY3VycmVudC52YWx1ZXMsXG4gICAgICBwcmV2T3B0aW9uQ2FjaGUgPSBfY2FjaGVSZWYkY3VycmVudC5vcHRpb25zO1xuXG4gICAgLy8gRmlsbCBsYWJlbCBieSBjYWNoZVxuICAgIHZhciBwYXRjaGVkVmFsdWVzID0gbGFiZWxlZFZhbHVlcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIGlmIChpdGVtLmxhYmVsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFyIF9wcmV2VmFsdWVDYWNoZSRnZXQ7XG4gICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGl0ZW0pLCB7fSwge1xuICAgICAgICAgIGxhYmVsOiAoX3ByZXZWYWx1ZUNhY2hlJGdldCA9IHByZXZWYWx1ZUNhY2hlLmdldChpdGVtLnZhbHVlKSkgPT09IG51bGwgfHwgX3ByZXZWYWx1ZUNhY2hlJGdldCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3ByZXZWYWx1ZUNhY2hlJGdldC5sYWJlbFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpdGVtO1xuICAgIH0pO1xuXG4gICAgLy8gUmVmcmVzaCBjYWNoZVxuICAgIHZhciB2YWx1ZUNhY2hlID0gbmV3IE1hcCgpO1xuICAgIHZhciBvcHRpb25DYWNoZSA9IG5ldyBNYXAoKTtcbiAgICBwYXRjaGVkVmFsdWVzLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHZhbHVlQ2FjaGUuc2V0KGl0ZW0udmFsdWUsIGl0ZW0pO1xuICAgICAgb3B0aW9uQ2FjaGUuc2V0KGl0ZW0udmFsdWUsIHZhbHVlT3B0aW9ucy5nZXQoaXRlbS52YWx1ZSkgfHwgcHJldk9wdGlvbkNhY2hlLmdldChpdGVtLnZhbHVlKSk7XG4gICAgfSk7XG4gICAgY2FjaGVSZWYuY3VycmVudC52YWx1ZXMgPSB2YWx1ZUNhY2hlO1xuICAgIGNhY2hlUmVmLmN1cnJlbnQub3B0aW9ucyA9IG9wdGlvbkNhY2hlO1xuICAgIHJldHVybiBwYXRjaGVkVmFsdWVzO1xuICB9LCBbbGFiZWxlZFZhbHVlcywgdmFsdWVPcHRpb25zXSk7XG4gIHZhciBnZXRPcHRpb24gPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAodmFsKSB7XG4gICAgcmV0dXJuIHZhbHVlT3B0aW9ucy5nZXQodmFsKSB8fCBjYWNoZVJlZi5jdXJyZW50Lm9wdGlvbnMuZ2V0KHZhbCk7XG4gIH0sIFt2YWx1ZU9wdGlvbnNdKTtcbiAgcmV0dXJuIFtmaWxsZWRMYWJlbGVkVmFsdWVzLCBnZXRPcHRpb25dO1xufSk7IiwgImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdG9BcnJheSB9IGZyb20gXCIuLi91dGlscy9jb21tb25VdGlsXCI7XG5pbXBvcnQgeyBpbmplY3RQcm9wc1dpdGhPcHRpb24gfSBmcm9tIFwiLi4vdXRpbHMvdmFsdWVVdGlsXCI7XG5mdW5jdGlvbiBpbmNsdWRlcyh0ZXN0LCBzZWFyY2gpIHtcbiAgcmV0dXJuIHRvQXJyYXkodGVzdCkuam9pbignJykudG9VcHBlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2gpO1xufVxuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIChvcHRpb25zLCBmaWVsZE5hbWVzLCBzZWFyY2hWYWx1ZSwgZmlsdGVyT3B0aW9uLCBvcHRpb25GaWx0ZXJQcm9wKSB7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXNlYXJjaFZhbHVlIHx8IGZpbHRlck9wdGlvbiA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIH1cbiAgICB2YXIgZmllbGRPcHRpb25zID0gZmllbGROYW1lcy5vcHRpb25zLFxuICAgICAgZmllbGRMYWJlbCA9IGZpZWxkTmFtZXMubGFiZWwsXG4gICAgICBmaWVsZFZhbHVlID0gZmllbGROYW1lcy52YWx1ZTtcbiAgICB2YXIgZmlsdGVyZWRPcHRpb25zID0gW107XG4gICAgdmFyIGN1c3RvbWl6ZUZpbHRlciA9IHR5cGVvZiBmaWx0ZXJPcHRpb24gPT09ICdmdW5jdGlvbic7XG4gICAgdmFyIHVwcGVyU2VhcmNoID0gc2VhcmNoVmFsdWUudG9VcHBlckNhc2UoKTtcbiAgICB2YXIgZmlsdGVyRnVuYyA9IGN1c3RvbWl6ZUZpbHRlciA/IGZpbHRlck9wdGlvbiA6IGZ1bmN0aW9uIChfLCBvcHRpb24pIHtcbiAgICAgIC8vIFVzZSBwcm92aWRlZCBgb3B0aW9uRmlsdGVyUHJvcGBcbiAgICAgIGlmIChvcHRpb25GaWx0ZXJQcm9wKSB7XG4gICAgICAgIHJldHVybiBpbmNsdWRlcyhvcHRpb25bb3B0aW9uRmlsdGVyUHJvcF0sIHVwcGVyU2VhcmNoKTtcbiAgICAgIH1cblxuICAgICAgLy8gQXV0byBzZWxlY3QgYGxhYmVsYCBvciBgdmFsdWVgIGJ5IG9wdGlvbiB0eXBlXG4gICAgICBpZiAob3B0aW9uW2ZpZWxkT3B0aW9uc10pIHtcbiAgICAgICAgLy8gaGFjayBgZmllbGRMYWJlbGAgc2luY2UgYE9wdGlvbkdyb3VwYCBjaGlsZHJlbiBpcyBub3QgYGxhYmVsYFxuICAgICAgICByZXR1cm4gaW5jbHVkZXMob3B0aW9uW2ZpZWxkTGFiZWwgIT09ICdjaGlsZHJlbicgPyBmaWVsZExhYmVsIDogJ2xhYmVsJ10sIHVwcGVyU2VhcmNoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpbmNsdWRlcyhvcHRpb25bZmllbGRWYWx1ZV0sIHVwcGVyU2VhcmNoKTtcbiAgICB9O1xuICAgIHZhciB3cmFwT3B0aW9uID0gY3VzdG9taXplRmlsdGVyID8gZnVuY3Rpb24gKG9wdCkge1xuICAgICAgcmV0dXJuIGluamVjdFByb3BzV2l0aE9wdGlvbihvcHQpO1xuICAgIH0gOiBmdW5jdGlvbiAob3B0KSB7XG4gICAgICByZXR1cm4gb3B0O1xuICAgIH07XG4gICAgb3B0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAvLyBHcm91cCBzaG91bGQgY2hlY2sgY2hpbGQgb3B0aW9uc1xuICAgICAgaWYgKGl0ZW1bZmllbGRPcHRpb25zXSkge1xuICAgICAgICAvLyBDaGVjayBncm91cCBmaXJzdFxuICAgICAgICB2YXIgbWF0Y2hHcm91cCA9IGZpbHRlckZ1bmMoc2VhcmNoVmFsdWUsIHdyYXBPcHRpb24oaXRlbSkpO1xuICAgICAgICBpZiAobWF0Y2hHcm91cCkge1xuICAgICAgICAgIGZpbHRlcmVkT3B0aW9ucy5wdXNoKGl0ZW0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIENoZWNrIG9wdGlvblxuICAgICAgICAgIHZhciBzdWJPcHRpb25zID0gaXRlbVtmaWVsZE9wdGlvbnNdLmZpbHRlcihmdW5jdGlvbiAoc3ViSXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIGZpbHRlckZ1bmMoc2VhcmNoVmFsdWUsIHdyYXBPcHRpb24oc3ViSXRlbSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChzdWJPcHRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgZmlsdGVyZWRPcHRpb25zLnB1c2goX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBpdGVtKSwge30sIF9kZWZpbmVQcm9wZXJ0eSh7fSwgZmllbGRPcHRpb25zLCBzdWJPcHRpb25zKSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZmlsdGVyRnVuYyhzZWFyY2hWYWx1ZSwgd3JhcE9wdGlvbihpdGVtKSkpIHtcbiAgICAgICAgZmlsdGVyZWRPcHRpb25zLnB1c2goaXRlbSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGZpbHRlcmVkT3B0aW9ucztcbiAgfSwgW29wdGlvbnMsIGZpbHRlck9wdGlvbiwgb3B0aW9uRmlsdGVyUHJvcCwgc2VhcmNoVmFsdWUsIGZpZWxkTmFtZXNdKTtcbn0pOyIsICJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjYW5Vc2VEb20gZnJvbSBcInJjLXV0aWwvZXMvRG9tL2NhblVzZURvbVwiO1xudmFyIHV1aWQgPSAwO1xuXG4vKiogSXMgY2xpZW50IHNpZGUgYW5kIG5vdCBqc2RvbSAqL1xuZXhwb3J0IHZhciBpc0Jyb3dzZXJDbGllbnQgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Rlc3QnICYmIGNhblVzZURvbSgpO1xuXG4vKiogR2V0IHVuaXF1ZSBpZCBmb3IgYWNjZXNzaWJpbGl0eSB1c2FnZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFVVSUQoKSB7XG4gIHZhciByZXRJZDtcblxuICAvLyBUZXN0IG5ldmVyIHJlYWNoXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoaXNCcm93c2VyQ2xpZW50KSB7XG4gICAgcmV0SWQgPSB1dWlkO1xuICAgIHV1aWQgKz0gMTtcbiAgfSBlbHNlIHtcbiAgICByZXRJZCA9ICdURVNUX09SX1NTUic7XG4gIH1cbiAgcmV0dXJuIHJldElkO1xufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlSWQoaWQpIHtcbiAgLy8gSW5uZXIgaWQgZm9yIGFjY2Vzc2liaWxpdHkgdXNhZ2UuIE9ubHkgd29yayBpbiBjbGllbnQgc2lkZVxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBpbm5lcklkID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXRJbm5lcklkID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBzZXRJbm5lcklkKFwicmNfc2VsZWN0X1wiLmNvbmNhdChnZXRVVUlEKCkpKTtcbiAgfSwgW10pO1xuICByZXR1cm4gaWQgfHwgaW5uZXJJZDtcbn0iLCAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY29udmVydENoaWxkcmVuVG9EYXRhIH0gZnJvbSBcIi4uL3V0aWxzL2xlZ2FjeVV0aWxcIjtcblxuLyoqXG4gKiBQYXJzZSBgY2hpbGRyZW5gIHRvIGBvcHRpb25zYCBpZiBgb3B0aW9uc2AgaXMgbm90IHByb3ZpZGVkLlxuICogVGhlbiBmbGF0dGVuIHRoZSBgb3B0aW9uc2AuXG4gKi9cbnZhciB1c2VPcHRpb25zID0gZnVuY3Rpb24gdXNlT3B0aW9ucyhvcHRpb25zLCBjaGlsZHJlbiwgZmllbGROYW1lcywgb3B0aW9uRmlsdGVyUHJvcCwgb3B0aW9uTGFiZWxQcm9wKSB7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbWVyZ2VkT3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdmFyIGNoaWxkcmVuQXNEYXRhID0gIW9wdGlvbnM7XG4gICAgaWYgKGNoaWxkcmVuQXNEYXRhKSB7XG4gICAgICBtZXJnZWRPcHRpb25zID0gY29udmVydENoaWxkcmVuVG9EYXRhKGNoaWxkcmVuKTtcbiAgICB9XG4gICAgdmFyIHZhbHVlT3B0aW9ucyA9IG5ldyBNYXAoKTtcbiAgICB2YXIgbGFiZWxPcHRpb25zID0gbmV3IE1hcCgpO1xuICAgIHZhciBzZXRMYWJlbE9wdGlvbnMgPSBmdW5jdGlvbiBzZXRMYWJlbE9wdGlvbnMobGFiZWxPcHRpb25zTWFwLCBvcHRpb24sIGtleSkge1xuICAgICAgaWYgKGtleSAmJiB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgICBsYWJlbE9wdGlvbnNNYXAuc2V0KG9wdGlvbltrZXldLCBvcHRpb24pO1xuICAgICAgfVxuICAgIH07XG4gICAgdmFyIGRpZyA9IGZ1bmN0aW9uIGRpZyhvcHRpb25MaXN0KSB7XG4gICAgICB2YXIgaXNDaGlsZHJlbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG4gICAgICAvLyBmb3IgbG9vcCB0byBzcGVlZCB1cCBjb2xsZWN0aW9uIHNwZWVkXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9wdGlvbkxpc3QubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIG9wdGlvbiA9IG9wdGlvbkxpc3RbaV07XG4gICAgICAgIGlmICghb3B0aW9uW2ZpZWxkTmFtZXMub3B0aW9uc10gfHwgaXNDaGlsZHJlbikge1xuICAgICAgICAgIHZhbHVlT3B0aW9ucy5zZXQob3B0aW9uW2ZpZWxkTmFtZXMudmFsdWVdLCBvcHRpb24pO1xuICAgICAgICAgIHNldExhYmVsT3B0aW9ucyhsYWJlbE9wdGlvbnMsIG9wdGlvbiwgZmllbGROYW1lcy5sYWJlbCk7XG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMzUzMDRcbiAgICAgICAgICBzZXRMYWJlbE9wdGlvbnMobGFiZWxPcHRpb25zLCBvcHRpb24sIG9wdGlvbkZpbHRlclByb3ApO1xuICAgICAgICAgIHNldExhYmVsT3B0aW9ucyhsYWJlbE9wdGlvbnMsIG9wdGlvbiwgb3B0aW9uTGFiZWxQcm9wKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkaWcob3B0aW9uW2ZpZWxkTmFtZXMub3B0aW9uc10sIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBkaWcobWVyZ2VkT3B0aW9ucyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9wdGlvbnM6IG1lcmdlZE9wdGlvbnMsXG4gICAgICB2YWx1ZU9wdGlvbnM6IHZhbHVlT3B0aW9ucyxcbiAgICAgIGxhYmVsT3B0aW9uczogbGFiZWxPcHRpb25zXG4gICAgfTtcbiAgfSwgW29wdGlvbnMsIGNoaWxkcmVuLCBmaWVsZE5hbWVzLCBvcHRpb25GaWx0ZXJQcm9wLCBvcHRpb25MYWJlbFByb3BdKTtcbn07XG5leHBvcnQgZGVmYXVsdCB1c2VPcHRpb25zOyIsICJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJjaGlsZHJlblwiLCBcInZhbHVlXCJdLFxuICBfZXhjbHVkZWQyID0gW1wiY2hpbGRyZW5cIl07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdG9BcnJheSBmcm9tIFwicmMtdXRpbC9lcy9DaGlsZHJlbi90b0FycmF5XCI7XG5mdW5jdGlvbiBjb252ZXJ0Tm9kZVRvT3B0aW9uKG5vZGUpIHtcbiAgdmFyIF9yZWYgPSBub2RlLFxuICAgIGtleSA9IF9yZWYua2V5LFxuICAgIF9yZWYkcHJvcHMgPSBfcmVmLnByb3BzLFxuICAgIGNoaWxkcmVuID0gX3JlZiRwcm9wcy5jaGlsZHJlbixcbiAgICB2YWx1ZSA9IF9yZWYkcHJvcHMudmFsdWUsXG4gICAgcmVzdFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYkcHJvcHMsIF9leGNsdWRlZCk7XG4gIHJldHVybiBfb2JqZWN0U3ByZWFkKHtcbiAgICBrZXk6IGtleSxcbiAgICB2YWx1ZTogdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoga2V5LFxuICAgIGNoaWxkcmVuOiBjaGlsZHJlblxuICB9LCByZXN0UHJvcHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRDaGlsZHJlblRvRGF0YShub2Rlcykge1xuICB2YXIgb3B0aW9uT25seSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG4gIHJldHVybiB0b0FycmF5KG5vZGVzKS5tYXAoZnVuY3Rpb24gKG5vZGUsIGluZGV4KSB7XG4gICAgaWYgKCEgLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KG5vZGUpIHx8ICFub2RlLnR5cGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgX3JlZjIgPSBub2RlLFxuICAgICAgaXNTZWxlY3RPcHRHcm91cCA9IF9yZWYyLnR5cGUuaXNTZWxlY3RPcHRHcm91cCxcbiAgICAgIGtleSA9IF9yZWYyLmtleSxcbiAgICAgIF9yZWYyJHByb3BzID0gX3JlZjIucHJvcHMsXG4gICAgICBjaGlsZHJlbiA9IF9yZWYyJHByb3BzLmNoaWxkcmVuLFxuICAgICAgcmVzdFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYyJHByb3BzLCBfZXhjbHVkZWQyKTtcbiAgICBpZiAob3B0aW9uT25seSB8fCAhaXNTZWxlY3RPcHRHcm91cCkge1xuICAgICAgcmV0dXJuIGNvbnZlcnROb2RlVG9PcHRpb24obm9kZSk7XG4gICAgfVxuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe1xuICAgICAga2V5OiBcIl9fUkNfU0VMRUNUX0dSUF9fXCIuY29uY2F0KGtleSA9PT0gbnVsbCA/IGluZGV4IDoga2V5LCBcIl9fXCIpLFxuICAgICAgbGFiZWw6IGtleVxuICAgIH0sIHJlc3RQcm9wcyksIHt9LCB7XG4gICAgICBvcHRpb25zOiBjb252ZXJ0Q2hpbGRyZW5Ub0RhdGEoY2hpbGRyZW4pXG4gICAgfSk7XG4gIH0pLmZpbHRlcihmdW5jdGlvbiAoZGF0YSkge1xuICAgIHJldHVybiBkYXRhO1xuICB9KTtcbn0iLCAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG4vKipcbiAqIFNhbWUgYXMgYFJlYWN0LnVzZUNhbGxiYWNrYCBidXQgYWx3YXlzIHJldHVybiBhIG1lbW9pemVkIGZ1bmN0aW9uXG4gKiBidXQgcmVkaXJlY3QgdG8gcmVhbCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlUmVmRnVuYyhjYWxsYmFjaykge1xuICB2YXIgZnVuY1JlZiA9IFJlYWN0LnVzZVJlZigpO1xuICBmdW5jUmVmLmN1cnJlbnQgPSBjYWxsYmFjaztcbiAgdmFyIGNhY2hlRm4gPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZ1bmNSZWYuY3VycmVudC5hcHBseShmdW5jUmVmLCBhcmd1bWVudHMpO1xuICB9LCBbXSk7XG4gIHJldHVybiBjYWNoZUZuO1xufSIsICJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgdG9Ob2RlQXJyYXkgZnJvbSBcInJjLXV0aWwvZXMvQ2hpbGRyZW4vdG9BcnJheVwiO1xuaW1wb3J0IHdhcm5pbmcsIHsgbm90ZU9uY2UgfSBmcm9tIFwicmMtdXRpbC9lcy93YXJuaW5nXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBpc011bHRpcGxlIH0gZnJvbSBcIi4uL0Jhc2VTZWxlY3RcIjtcbmltcG9ydCB7IHRvQXJyYXkgfSBmcm9tIFwiLi9jb21tb25VdGlsXCI7XG5pbXBvcnQgeyBjb252ZXJ0Q2hpbGRyZW5Ub0RhdGEgfSBmcm9tIFwiLi9sZWdhY3lVdGlsXCI7XG5mdW5jdGlvbiB3YXJuaW5nUHJvcHMocHJvcHMpIHtcbiAgdmFyIG1vZGUgPSBwcm9wcy5tb2RlLFxuICAgIG9wdGlvbnMgPSBwcm9wcy5vcHRpb25zLFxuICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgYmFja2ZpbGwgPSBwcm9wcy5iYWNrZmlsbCxcbiAgICBhbGxvd0NsZWFyID0gcHJvcHMuYWxsb3dDbGVhcixcbiAgICBwbGFjZWhvbGRlciA9IHByb3BzLnBsYWNlaG9sZGVyLFxuICAgIGdldElucHV0RWxlbWVudCA9IHByb3BzLmdldElucHV0RWxlbWVudCxcbiAgICBzaG93U2VhcmNoID0gcHJvcHMuc2hvd1NlYXJjaCxcbiAgICBvblNlYXJjaCA9IHByb3BzLm9uU2VhcmNoLFxuICAgIGRlZmF1bHRPcGVuID0gcHJvcHMuZGVmYXVsdE9wZW4sXG4gICAgYXV0b0ZvY3VzID0gcHJvcHMuYXV0b0ZvY3VzLFxuICAgIGxhYmVsSW5WYWx1ZSA9IHByb3BzLmxhYmVsSW5WYWx1ZSxcbiAgICB2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgIGlucHV0VmFsdWUgPSBwcm9wcy5pbnB1dFZhbHVlLFxuICAgIG9wdGlvbkxhYmVsUHJvcCA9IHByb3BzLm9wdGlvbkxhYmVsUHJvcDtcbiAgdmFyIG11bHRpcGxlID0gaXNNdWx0aXBsZShtb2RlKTtcbiAgdmFyIG1lcmdlZFNob3dTZWFyY2ggPSBzaG93U2VhcmNoICE9PSB1bmRlZmluZWQgPyBzaG93U2VhcmNoIDogbXVsdGlwbGUgfHwgbW9kZSA9PT0gJ2NvbWJvYm94JztcbiAgdmFyIG1lcmdlZE9wdGlvbnMgPSBvcHRpb25zIHx8IGNvbnZlcnRDaGlsZHJlblRvRGF0YShjaGlsZHJlbik7XG5cbiAgLy8gYHRhZ3NgIHNob3VsZCBub3Qgc2V0IG9wdGlvbiBhcyBkaXNhYmxlZFxuICB3YXJuaW5nKG1vZGUgIT09ICd0YWdzJyB8fCBtZXJnZWRPcHRpb25zLmV2ZXJ5KGZ1bmN0aW9uIChvcHQpIHtcbiAgICByZXR1cm4gIW9wdC5kaXNhYmxlZDtcbiAgfSksICdQbGVhc2UgYXZvaWQgc2V0dGluZyBvcHRpb24gdG8gZGlzYWJsZWQgaW4gdGFncyBtb2RlIHNpbmNlIHVzZXIgY2FuIGFsd2F5cyB0eXBlIHRleHQgYXMgdGFnLicpO1xuXG4gIC8vIGBjb21ib2JveGAgJiBgdGFnc2Agc2hvdWxkIG9wdGlvbiBiZSBgc3RyaW5nYCB0eXBlXG4gIGlmIChtb2RlID09PSAndGFncycgfHwgbW9kZSA9PT0gJ2NvbWJvYm94Jykge1xuICAgIHZhciBoYXNOdW1iZXJWYWx1ZSA9IG1lcmdlZE9wdGlvbnMuc29tZShmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgaWYgKGl0ZW0ub3B0aW9ucykge1xuICAgICAgICByZXR1cm4gaXRlbS5vcHRpb25zLnNvbWUoZnVuY3Rpb24gKG9wdCkge1xuICAgICAgICAgIHJldHVybiB0eXBlb2YgKCd2YWx1ZScgaW4gb3B0ID8gb3B0LnZhbHVlIDogb3B0LmtleSkgPT09ICdudW1iZXInO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0eXBlb2YgKCd2YWx1ZScgaW4gaXRlbSA/IGl0ZW0udmFsdWUgOiBpdGVtLmtleSkgPT09ICdudW1iZXInO1xuICAgIH0pO1xuICAgIHdhcm5pbmcoIWhhc051bWJlclZhbHVlLCAnYHZhbHVlYCBvZiBPcHRpb24gc2hvdWxkIG5vdCB1c2UgbnVtYmVyIHR5cGUgd2hlbiBgbW9kZWAgaXMgYHRhZ3NgIG9yIGBjb21ib2JveGAuJyk7XG4gIH1cblxuICAvLyBgY29tYm9ib3hgIHNob3VsZCBub3QgdXNlIGBvcHRpb25MYWJlbFByb3BgXG4gIHdhcm5pbmcobW9kZSAhPT0gJ2NvbWJvYm94JyB8fCAhb3B0aW9uTGFiZWxQcm9wLCAnYGNvbWJvYm94YCBtb2RlIG5vdCBzdXBwb3J0IGBvcHRpb25MYWJlbFByb3BgLiBQbGVhc2Ugc2V0IGB2YWx1ZWAgb24gT3B0aW9uIGRpcmVjdGx5LicpO1xuXG4gIC8vIE9ubHkgYGNvbWJvYm94YCBzdXBwb3J0IGBiYWNrZmlsbGBcbiAgd2FybmluZyhtb2RlID09PSAnY29tYm9ib3gnIHx8ICFiYWNrZmlsbCwgJ2BiYWNrZmlsbGAgb25seSB3b3JrcyB3aXRoIGBjb21ib2JveGAgbW9kZS4nKTtcblxuICAvLyBPbmx5IGBjb21ib2JveGAgc3VwcG9ydCBgZ2V0SW5wdXRFbGVtZW50YFxuICB3YXJuaW5nKG1vZGUgPT09ICdjb21ib2JveCcgfHwgIWdldElucHV0RWxlbWVudCwgJ2BnZXRJbnB1dEVsZW1lbnRgIG9ubHkgd29yayB3aXRoIGBjb21ib2JveGAgbW9kZS4nKTtcblxuICAvLyBDdXN0b21pemUgYGdldElucHV0RWxlbWVudGAgc2hvdWxkIG5vdCB1c2UgYGFsbG93Q2xlYXJgICYgYHBsYWNlaG9sZGVyYFxuICBub3RlT25jZShtb2RlICE9PSAnY29tYm9ib3gnIHx8ICFnZXRJbnB1dEVsZW1lbnQgfHwgIWFsbG93Q2xlYXIgfHwgIXBsYWNlaG9sZGVyLCAnQ3VzdG9taXplIGBnZXRJbnB1dEVsZW1lbnRgIHNob3VsZCBjdXN0b21pemUgY2xlYXIgYW5kIHBsYWNlaG9sZGVyIGxvZ2ljIGluc3RlYWQgb2YgY29uZmlndXJpbmcgYGFsbG93Q2xlYXJgIGFuZCBgcGxhY2Vob2xkZXJgLicpO1xuXG4gIC8vIGBvblNlYXJjaGAgc2hvdWxkIHVzZSBpbiBgY29tYm9ib3hgIG9yIGBzaG93U2VhcmNoYFxuICBpZiAob25TZWFyY2ggJiYgIW1lcmdlZFNob3dTZWFyY2ggJiYgbW9kZSAhPT0gJ2NvbWJvYm94JyAmJiBtb2RlICE9PSAndGFncycpIHtcbiAgICB3YXJuaW5nKGZhbHNlLCAnYG9uU2VhcmNoYCBzaG91bGQgd29yayB3aXRoIGBzaG93U2VhcmNoYCBpbnN0ZWFkIG9mIHVzZSBhbG9uZS4nKTtcbiAgfVxuICBub3RlT25jZSghZGVmYXVsdE9wZW4gfHwgYXV0b0ZvY3VzLCAnYGRlZmF1bHRPcGVuYCBtYWtlcyBTZWxlY3Qgb3BlbiB3aXRob3V0IGZvY3VzIHdoaWNoIG1lYW5zIGl0IHdpbGwgbm90IGNsb3NlIGJ5IGNsaWNrIG91dHNpZGUuIFlvdSBjYW4gc2V0IGBhdXRvRm9jdXNgIGlmIG5lZWRlZC4nKTtcbiAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICB2YXIgdmFsdWVzID0gdG9BcnJheSh2YWx1ZSk7XG4gICAgd2FybmluZyghbGFiZWxJblZhbHVlIHx8IHZhbHVlcy5ldmVyeShmdW5jdGlvbiAodmFsKSB7XG4gICAgICByZXR1cm4gX3R5cGVvZih2YWwpID09PSAnb2JqZWN0JyAmJiAoJ2tleScgaW4gdmFsIHx8ICd2YWx1ZScgaW4gdmFsKTtcbiAgICB9KSwgJ2B2YWx1ZWAgc2hvdWxkIGluIHNoYXBlIG9mIGB7IHZhbHVlOiBzdHJpbmcgfCBudW1iZXIsIGxhYmVsPzogUmVhY3ROb2RlIH1gIHdoZW4geW91IHNldCBgbGFiZWxJblZhbHVlYCB0byBgdHJ1ZWAnKTtcbiAgICB3YXJuaW5nKCFtdWx0aXBsZSB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSwgJ2B2YWx1ZWAgc2hvdWxkIGJlIGFycmF5IHdoZW4gYG1vZGVgIGlzIGBtdWx0aXBsZWAgb3IgYHRhZ3NgJyk7XG4gIH1cblxuICAvLyBTeW50YWN0aWMgc3VnYXIgc2hvdWxkIHVzZSBjb3JyZWN0IGNoaWxkcmVuIHR5cGVcbiAgaWYgKGNoaWxkcmVuKSB7XG4gICAgdmFyIGludmFsaWRhdGVDaGlsZFR5cGUgPSBudWxsO1xuICAgIHRvTm9kZUFycmF5KGNoaWxkcmVuKS5zb21lKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICBpZiAoISAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQobm9kZSkgfHwgIW5vZGUudHlwZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgX3JlZiA9IG5vZGUsXG4gICAgICAgIHR5cGUgPSBfcmVmLnR5cGU7XG4gICAgICBpZiAodHlwZS5pc1NlbGVjdE9wdGlvbikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAodHlwZS5pc1NlbGVjdE9wdEdyb3VwKSB7XG4gICAgICAgIHZhciBhbGxDaGlsZHJlblZhbGlkID0gdG9Ob2RlQXJyYXkobm9kZS5wcm9wcy5jaGlsZHJlbikuZXZlcnkoZnVuY3Rpb24gKHN1Yk5vZGUpIHtcbiAgICAgICAgICBpZiAoISAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoc3ViTm9kZSkgfHwgIW5vZGUudHlwZSB8fCBzdWJOb2RlLnR5cGUuaXNTZWxlY3RPcHRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpbnZhbGlkYXRlQ2hpbGRUeXBlID0gc3ViTm9kZS50eXBlO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChhbGxDaGlsZHJlblZhbGlkKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaW52YWxpZGF0ZUNoaWxkVHlwZSA9IHR5cGU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgICBpZiAoaW52YWxpZGF0ZUNoaWxkVHlwZSkge1xuICAgICAgd2FybmluZyhmYWxzZSwgXCJgY2hpbGRyZW5gIHNob3VsZCBiZSBgU2VsZWN0Lk9wdGlvbmAgb3IgYFNlbGVjdC5PcHRHcm91cGAgaW5zdGVhZCBvZiBgXCIuY29uY2F0KGludmFsaWRhdGVDaGlsZFR5cGUuZGlzcGxheU5hbWUgfHwgaW52YWxpZGF0ZUNoaWxkVHlwZS5uYW1lIHx8IGludmFsaWRhdGVDaGlsZFR5cGUsIFwiYC5cIikpO1xuICAgIH1cbiAgICB3YXJuaW5nKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZCwgJ2BpbnB1dFZhbHVlYCBpcyBkZXByZWNhdGVkLCBwbGVhc2UgdXNlIGBzZWFyY2hWYWx1ZWAgaW5zdGVhZC4nKTtcbiAgfVxufVxuXG4vLyB2YWx1ZSBpbiBTZWxlY3Qgb3B0aW9uIHNob3VsZCBub3QgYmUgbnVsbFxuLy8gbm90ZTogT3B0R3JvdXAgaGFzIG9wdGlvbnMgdG9vXG5leHBvcnQgZnVuY3Rpb24gd2FybmluZ051bGxPcHRpb25zKG9wdGlvbnMsIGZpZWxkTmFtZXMpIHtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICB2YXIgcmVjdXJzaXZlT3B0aW9ucyA9IGZ1bmN0aW9uIHJlY3Vyc2l2ZU9wdGlvbnMob3B0aW9uc0xpc3QpIHtcbiAgICAgIHZhciBpbkdyb3VwID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3B0aW9uc0xpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG9wdGlvbiA9IG9wdGlvbnNMaXN0W2ldO1xuICAgICAgICBpZiAob3B0aW9uW2ZpZWxkTmFtZXMgPT09IG51bGwgfHwgZmllbGROYW1lcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogZmllbGROYW1lcy52YWx1ZV0gPT09IG51bGwpIHtcbiAgICAgICAgICB3YXJuaW5nKGZhbHNlLCAnYHZhbHVlYCBpbiBTZWxlY3Qgb3B0aW9ucyBzaG91bGQgbm90IGJlIGBudWxsYC4nKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWluR3JvdXAgJiYgQXJyYXkuaXNBcnJheShvcHRpb25bZmllbGROYW1lcyA9PT0gbnVsbCB8fCBmaWVsZE5hbWVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmaWVsZE5hbWVzLm9wdGlvbnNdKSAmJiByZWN1cnNpdmVPcHRpb25zKG9wdGlvbltmaWVsZE5hbWVzID09PSBudWxsIHx8IGZpZWxkTmFtZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZpZWxkTmFtZXMub3B0aW9uc10sIHRydWUpKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHJlY3Vyc2l2ZU9wdGlvbnMob3B0aW9ucyk7XG4gIH1cbn1cbmV4cG9ydCBkZWZhdWx0IHdhcm5pbmdQcm9wczsiLCAiaW1wb3J0IFNlbGVjdCBmcm9tIFwiLi9TZWxlY3RcIjtcbmltcG9ydCBPcHRpb24gZnJvbSBcIi4vT3B0aW9uXCI7XG5pbXBvcnQgT3B0R3JvdXAgZnJvbSBcIi4vT3B0R3JvdXBcIjtcbmltcG9ydCBCYXNlU2VsZWN0IGZyb20gXCIuL0Jhc2VTZWxlY3RcIjtcbmltcG9ydCB1c2VCYXNlUHJvcHMgZnJvbSBcIi4vaG9va3MvdXNlQmFzZVByb3BzXCI7XG5leHBvcnQgeyBPcHRpb24sIE9wdEdyb3VwLCBCYXNlU2VsZWN0LCB1c2VCYXNlUHJvcHMgfTtcbmV4cG9ydCBkZWZhdWx0IFNlbGVjdDsiLCAiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5jb25zdCBfSW5wdXRTdGF0dXNlcyA9IFsnd2FybmluZycsICdlcnJvcicsICcnXTtcbmV4cG9ydCBmdW5jdGlvbiBnZXRTdGF0dXNDbGFzc05hbWVzKHByZWZpeENscywgc3RhdHVzLCBoYXNGZWVkYmFjaykge1xuICByZXR1cm4gY2xhc3NOYW1lcyh7XG4gICAgW2Ake3ByZWZpeENsc30tc3RhdHVzLXN1Y2Nlc3NgXTogc3RhdHVzID09PSAnc3VjY2VzcycsXG4gICAgW2Ake3ByZWZpeENsc30tc3RhdHVzLXdhcm5pbmdgXTogc3RhdHVzID09PSAnd2FybmluZycsXG4gICAgW2Ake3ByZWZpeENsc30tc3RhdHVzLWVycm9yYF06IHN0YXR1cyA9PT0gJ2Vycm9yJyxcbiAgICBbYCR7cHJlZml4Q2xzfS1zdGF0dXMtdmFsaWRhdGluZ2BdOiBzdGF0dXMgPT09ICd2YWxpZGF0aW5nJyxcbiAgICBbYCR7cHJlZml4Q2xzfS1oYXMtZmVlZGJhY2tgXTogaGFzRmVlZGJhY2tcbiAgfSk7XG59XG5leHBvcnQgY29uc3QgZ2V0TWVyZ2VkU3RhdHVzID0gKGNvbnRleHRTdGF0dXMsIGN1c3RvbVN0YXR1cykgPT4gY3VzdG9tU3RhdHVzIHx8IGNvbnRleHRTdGF0dXM7IiwgIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgUmVhY3QsIHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuJztcbmltcG9ydCBFbXB0eSBmcm9tICcuLi9lbXB0eSc7XG5jb25zdCBEZWZhdWx0UmVuZGVyRW1wdHkgPSBwcm9wcyA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnROYW1lXG4gIH0gPSBwcm9wcztcbiAgY29uc3Qge1xuICAgIGdldFByZWZpeENsc1xuICB9ID0gdXNlQ29udGV4dChDb25maWdDb250ZXh0KTtcbiAgY29uc3QgcHJlZml4ID0gZ2V0UHJlZml4Q2xzKCdlbXB0eScpO1xuICBzd2l0Y2ggKGNvbXBvbmVudE5hbWUpIHtcbiAgICBjYXNlICdUYWJsZSc6XG4gICAgY2FzZSAnTGlzdCc6XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRW1wdHksIHtcbiAgICAgICAgaW1hZ2U6IEVtcHR5LlBSRVNFTlRFRF9JTUFHRV9TSU1QTEVcbiAgICAgIH0pO1xuICAgIGNhc2UgJ1NlbGVjdCc6XG4gICAgY2FzZSAnVHJlZVNlbGVjdCc6XG4gICAgY2FzZSAnQ2FzY2FkZXInOlxuICAgIGNhc2UgJ1RyYW5zZmVyJzpcbiAgICBjYXNlICdNZW50aW9ucyc6XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRW1wdHksIHtcbiAgICAgICAgaW1hZ2U6IEVtcHR5LlBSRVNFTlRFRF9JTUFHRV9TSU1QTEUsXG4gICAgICAgIGNsYXNzTmFtZTogYCR7cHJlZml4fS1zbWFsbGBcbiAgICAgIH0pO1xuICAgIC8qKlxuICAgICAqIFRoaXMgdHlwZSBvZiBjb21wb25lbnQgc2hvdWxkIHNhdGlzZnkgdGhlIG51bGxpc2ggY29hbGVzY2luZyBvcGVyYXRvcig/Pykgb24gdGhlIGxlZnQtaGFuZCBzaWRlLlxuICAgICAqIHRvIGxldCB0aGUgY29tcG9uZW50IGl0c2VsZiBpbXBsZW1lbnQgdGhlIGxvZ2ljLlxuICAgICAqIEZvciBleGFtcGxlIGBUYWJsZS5maWx0ZXJgLlxuICAgICAqL1xuICAgIGNhc2UgJ1RhYmxlLmZpbHRlcic6XG4gICAgICAvLyB3aHkgYG51bGxgPyBsZWdhY3kgcmVhY3QxNiBub2RlIHR5cGUgYHVuZGVmaW5lZGAgaXMgbm90IGFsbG93ZWQuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBkZWZhdWx0OlxuICAgICAgLy8gU2hvdWxkIG5ldmVyIGhpdCBpZiB3ZSB0YWtlIGFsbCB0aGUgY29tcG9uZW50IGludG8gY29uc2lkZXIuXG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRW1wdHksIG51bGwpO1xuICB9XG59O1xuZXhwb3J0IGRlZmF1bHQgRGVmYXVsdFJlbmRlckVtcHR5OyIsICJcInVzZSBjbGllbnRcIjtcblxudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgZGV2VXNlV2FybmluZyB9IGZyb20gJy4uL191dGlsL3dhcm5pbmcnO1xuaW1wb3J0IHsgdXNlTG9jYWxlIH0gZnJvbSAnLi4vbG9jYWxlJztcbmltcG9ydCBEZWZhdWx0RW1wdHlJbWcgZnJvbSAnLi9lbXB0eSc7XG5pbXBvcnQgU2ltcGxlRW1wdHlJbWcgZnJvbSAnLi9zaW1wbGUnO1xuaW1wb3J0IHVzZVN0eWxlIGZyb20gJy4vc3R5bGUnO1xuaW1wb3J0IHsgdXNlQ29tcG9uZW50Q29uZmlnIH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL2NvbnRleHQnO1xuY29uc3QgZGVmYXVsdEVtcHR5SW1nID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRGVmYXVsdEVtcHR5SW1nLCBudWxsKTtcbmNvbnN0IHNpbXBsZUVtcHR5SW1nID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU2ltcGxlRW1wdHlJbWcsIG51bGwpO1xuY29uc3QgRW1wdHkgPSBwcm9wcyA9PiB7XG4gIGNvbnN0IHtcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIHJvb3RDbGFzc05hbWUsXG4gICAgICBwcmVmaXhDbHM6IGN1c3RvbWl6ZVByZWZpeENscyxcbiAgICAgIGltYWdlID0gZGVmYXVsdEVtcHR5SW1nLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICBjaGlsZHJlbixcbiAgICAgIGltYWdlU3R5bGUsXG4gICAgICBzdHlsZSxcbiAgICAgIGNsYXNzTmFtZXM6IGVtcHR5Q2xhc3NOYW1lcyxcbiAgICAgIHN0eWxlc1xuICAgIH0gPSBwcm9wcyxcbiAgICByZXN0UHJvcHMgPSBfX3Jlc3QocHJvcHMsIFtcImNsYXNzTmFtZVwiLCBcInJvb3RDbGFzc05hbWVcIiwgXCJwcmVmaXhDbHNcIiwgXCJpbWFnZVwiLCBcImRlc2NyaXB0aW9uXCIsIFwiY2hpbGRyZW5cIiwgXCJpbWFnZVN0eWxlXCIsIFwic3R5bGVcIiwgXCJjbGFzc05hbWVzXCIsIFwic3R5bGVzXCJdKTtcbiAgY29uc3Qge1xuICAgIGdldFByZWZpeENscyxcbiAgICBkaXJlY3Rpb24sXG4gICAgY2xhc3NOYW1lOiBjb250ZXh0Q2xhc3NOYW1lLFxuICAgIHN0eWxlOiBjb250ZXh0U3R5bGUsXG4gICAgY2xhc3NOYW1lczogY29udGV4dENsYXNzTmFtZXMsXG4gICAgc3R5bGVzOiBjb250ZXh0U3R5bGVzXG4gIH0gPSB1c2VDb21wb25lbnRDb25maWcoJ2VtcHR5Jyk7XG4gIGNvbnN0IHByZWZpeENscyA9IGdldFByZWZpeENscygnZW1wdHknLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICBjb25zdCBbd3JhcENTU1ZhciwgaGFzaElkLCBjc3NWYXJDbHNdID0gdXNlU3R5bGUocHJlZml4Q2xzKTtcbiAgY29uc3QgW2xvY2FsZV0gPSB1c2VMb2NhbGUoJ0VtcHR5Jyk7XG4gIGNvbnN0IGRlcyA9IHR5cGVvZiBkZXNjcmlwdGlvbiAhPT0gJ3VuZGVmaW5lZCcgPyBkZXNjcmlwdGlvbiA6IGxvY2FsZSA9PT0gbnVsbCB8fCBsb2NhbGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxvY2FsZS5kZXNjcmlwdGlvbjtcbiAgY29uc3QgYWx0ID0gdHlwZW9mIGRlcyA9PT0gJ3N0cmluZycgPyBkZXMgOiAnZW1wdHknO1xuICBsZXQgaW1hZ2VOb2RlID0gbnVsbDtcbiAgaWYgKHR5cGVvZiBpbWFnZSA9PT0gJ3N0cmluZycpIHtcbiAgICBpbWFnZU5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImltZ1wiLCB7XG4gICAgICBhbHQ6IGFsdCxcbiAgICAgIHNyYzogaW1hZ2VcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBpbWFnZU5vZGUgPSBpbWFnZTtcbiAgfVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBXYXJuaW5nID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGNvbnN0IHdhcm5pbmcgPSBkZXZVc2VXYXJuaW5nKCdFbXB0eScpO1xuICAgIFtbJ2ltYWdlU3R5bGUnLCAnc3R5bGVzOiB7IGltYWdlOiB7fSB9J11dLmZvckVhY2goX3JlZiA9PiB7XG4gICAgICBsZXQgW2RlcHJlY2F0ZWROYW1lLCBuZXdOYW1lXSA9IF9yZWY7XG4gICAgICB3YXJuaW5nLmRlcHJlY2F0ZWQoIShkZXByZWNhdGVkTmFtZSBpbiBwcm9wcyksIGRlcHJlY2F0ZWROYW1lLCBuZXdOYW1lKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gd3JhcENTU1ZhcigvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBPYmplY3QuYXNzaWduKHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoaGFzaElkLCBjc3NWYXJDbHMsIHByZWZpeENscywgY29udGV4dENsYXNzTmFtZSwge1xuICAgICAgW2Ake3ByZWZpeENsc30tbm9ybWFsYF06IGltYWdlID09PSBzaW1wbGVFbXB0eUltZyxcbiAgICAgIFtgJHtwcmVmaXhDbHN9LXJ0bGBdOiBkaXJlY3Rpb24gPT09ICdydGwnXG4gICAgfSwgY2xhc3NOYW1lLCByb290Q2xhc3NOYW1lLCBjb250ZXh0Q2xhc3NOYW1lcy5yb290LCBlbXB0eUNsYXNzTmFtZXMgPT09IG51bGwgfHwgZW1wdHlDbGFzc05hbWVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbXB0eUNsYXNzTmFtZXMucm9vdCksXG4gICAgc3R5bGU6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGNvbnRleHRTdHlsZXMucm9vdCksIGNvbnRleHRTdHlsZSksIHN0eWxlcyA9PT0gbnVsbCB8fCBzdHlsZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0eWxlcy5yb290KSwgc3R5bGUpXG4gIH0sIHJlc3RQcm9wcyksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoYCR7cHJlZml4Q2xzfS1pbWFnZWAsIGNvbnRleHRDbGFzc05hbWVzLmltYWdlLCBlbXB0eUNsYXNzTmFtZXMgPT09IG51bGwgfHwgZW1wdHlDbGFzc05hbWVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbXB0eUNsYXNzTmFtZXMuaW1hZ2UpLFxuICAgIHN0eWxlOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgaW1hZ2VTdHlsZSksIGNvbnRleHRTdHlsZXMuaW1hZ2UpLCBzdHlsZXMgPT09IG51bGwgfHwgc3R5bGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdHlsZXMuaW1hZ2UpXG4gIH0sIGltYWdlTm9kZSksIGRlcyAmJiAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhgJHtwcmVmaXhDbHN9LWRlc2NyaXB0aW9uYCwgY29udGV4dENsYXNzTmFtZXMuZGVzY3JpcHRpb24sIGVtcHR5Q2xhc3NOYW1lcyA9PT0gbnVsbCB8fCBlbXB0eUNsYXNzTmFtZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVtcHR5Q2xhc3NOYW1lcy5kZXNjcmlwdGlvbiksXG4gICAgc3R5bGU6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY29udGV4dFN0eWxlcy5kZXNjcmlwdGlvbiksIHN0eWxlcyA9PT0gbnVsbCB8fCBzdHlsZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0eWxlcy5kZXNjcmlwdGlvbilcbiAgfSwgZGVzKSksIGNoaWxkcmVuICYmICgvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGAke3ByZWZpeENsc30tZm9vdGVyYCwgY29udGV4dENsYXNzTmFtZXMuZm9vdGVyLCBlbXB0eUNsYXNzTmFtZXMgPT09IG51bGwgfHwgZW1wdHlDbGFzc05hbWVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbXB0eUNsYXNzTmFtZXMuZm9vdGVyKSxcbiAgICBzdHlsZTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjb250ZXh0U3R5bGVzLmZvb3RlciksIHN0eWxlcyA9PT0gbnVsbCB8fCBzdHlsZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0eWxlcy5mb290ZXIpXG4gIH0sIGNoaWxkcmVuKSkpKTtcbn07XG5FbXB0eS5QUkVTRU5URURfSU1BR0VfREVGQVVMVCA9IGRlZmF1bHRFbXB0eUltZztcbkVtcHR5LlBSRVNFTlRFRF9JTUFHRV9TSU1QTEUgPSBzaW1wbGVFbXB0eUltZztcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIEVtcHR5LmRpc3BsYXlOYW1lID0gJ0VtcHR5Jztcbn1cbmV4cG9ydCBkZWZhdWx0IEVtcHR5OyIsICJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgRmFzdENvbG9yIH0gZnJvbSAnQGFudC1kZXNpZ24vZmFzdC1jb2xvcic7XG5pbXBvcnQgeyB1c2VMb2NhbGUgfSBmcm9tICcuLi9sb2NhbGUnO1xuaW1wb3J0IHsgdXNlVG9rZW4gfSBmcm9tICcuLi90aGVtZS9pbnRlcm5hbCc7XG5jb25zdCBFbXB0eSA9ICgpID0+IHtcbiAgY29uc3QgWywgdG9rZW5dID0gdXNlVG9rZW4oKTtcbiAgY29uc3QgW2xvY2FsZV0gPSB1c2VMb2NhbGUoJ0VtcHR5Jyk7XG4gIGNvbnN0IGJnQ29sb3IgPSBuZXcgRmFzdENvbG9yKHRva2VuLmNvbG9yQmdCYXNlKTtcbiAgLy8gRGFyayBUaGVtZSBuZWVkIG1vcmUgZGFyayBvZiB0aGlzXG4gIGNvbnN0IHRoZW1lU3R5bGUgPSBiZ0NvbG9yLnRvSHNsKCkubCA8IDAuNSA/IHtcbiAgICBvcGFjaXR5OiAwLjY1XG4gIH0gOiB7fTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcbiAgICBzdHlsZTogdGhlbWVTdHlsZSxcbiAgICB3aWR0aDogXCIxODRcIixcbiAgICBoZWlnaHQ6IFwiMTUyXCIsXG4gICAgdmlld0JveDogXCIwIDAgMTg0IDE1MlwiLFxuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0aXRsZVwiLCBudWxsLCAobG9jYWxlID09PSBudWxsIHx8IGxvY2FsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbG9jYWxlLmRlc2NyaXB0aW9uKSB8fCAnRW1wdHknKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJnXCIsIHtcbiAgICBmaWxsOiBcIm5vbmVcIixcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCJcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJnXCIsIHtcbiAgICB0cmFuc2Zvcm06IFwidHJhbnNsYXRlKDI0IDMxLjY3KVwiXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZWxsaXBzZVwiLCB7XG4gICAgZmlsbE9wYWNpdHk6IFwiLjhcIixcbiAgICBmaWxsOiBcIiNGNUY1RjdcIixcbiAgICBjeDogXCI2Ny43OTdcIixcbiAgICBjeTogXCIxMDYuODlcIixcbiAgICByeDogXCI2Ny43OTdcIixcbiAgICByeTogXCIxMi42NjhcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMjIuMDM0IDY5LjY3NEw5OC4xMDkgNDAuMjI5Yy0xLjE0OC0xLjM4Ni0yLjgyNi0yLjIyNS00LjU5My0yLjIyNWgtNTEuNDRjLTEuNzY2IDAtMy40NDQuODM5LTQuNTkyIDIuMjI1TDEzLjU2IDY5LjY3NHYxNS4zODNoMTA4LjQ3NVY2OS42NzR6XCIsXG4gICAgZmlsbDogXCIjQUVCOEMyXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTAxLjUzNyA4Ni4yMTRMODAuNjMgNjEuMTAyYy0xLjAwMS0xLjIwNy0yLjUwNy0xLjg2Ny00LjA0OC0xLjg2N0gzMS43MjRjLTEuNTQgMC0zLjA0Ny42Ni00LjA0OCAxLjg2N0w2Ljc2OSA4Ni4yMTR2MTMuNzkyaDk0Ljc2OFY4Ni4yMTR6XCIsXG4gICAgZmlsbDogXCJ1cmwoI2xpbmVhckdyYWRpZW50LTEpXCIsXG4gICAgdHJhbnNmb3JtOiBcInRyYW5zbGF0ZSgxMy41NilcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0zMy44MyAwaDY3LjkzM2E0IDQgMCAwIDEgNCA0djkzLjM0NGE0IDQgMCAwIDEtNCA0SDMzLjgzYTQgNCAwIDAgMS00LTRWNGE0IDQgMCAwIDEgNC00elwiLFxuICAgIGZpbGw6IFwiI0Y1RjVGN1wiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTQyLjY3OCA5Ljk1M2g1MC4yMzdhMiAyIDAgMCAxIDIgMlYzNi45MWEyIDIgMCAwIDEtMiAySDQyLjY3OGEyIDIgMCAwIDEtMi0yVjExLjk1M2EyIDIgMCAwIDEgMi0yek00Mi45NCA0OS43NjdoNDkuNzEzYTIuMjYyIDIuMjYyIDAgMSAxIDAgNC41MjRINDIuOTRhMi4yNjIgMi4yNjIgMCAwIDEgMC00LjUyNHpNNDIuOTQgNjEuNTNoNDkuNzEzYTIuMjYyIDIuMjYyIDAgMSAxIDAgNC41MjVINDIuOTRhMi4yNjIgMi4yNjIgMCAwIDEgMC00LjUyNXpNMTIxLjgxMyAxMDUuMDMyYy0uNzc1IDMuMDcxLTMuNDk3IDUuMzYtNi43MzUgNS4zNkgyMC41MTVjLTMuMjM4IDAtNS45Ni0yLjI5LTYuNzM0LTUuMzZhNy4zMDkgNy4zMDkgMCAwIDEtLjIyMi0xLjc5VjY5LjY3NWgyNi4zMThjMi45MDcgMCA1LjI1IDIuNDQ4IDUuMjUgNS40MnYuMDRjMCAyLjk3MSAyLjM3IDUuMzcgNS4yNzcgNS4zN2gzNC43ODVjMi45MDcgMCA1LjI3Ny0yLjQyMSA1LjI3Ny01LjM5M1Y3NS4xYzAtMi45NzIgMi4zNDMtNS40MjYgNS4yNS01LjQyNmgyNi4zMTh2MzMuNTY5YzAgLjYxNy0uMDc3IDEuMjE2LS4yMjEgMS43ODl6XCIsXG4gICAgZmlsbDogXCIjRENFMEU2XCJcbiAgfSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTE0OS4xMjEgMzMuMjkybC02LjgzIDIuNjVhMSAxIDAgMCAxLTEuMzE3LTEuMjNsMS45MzctNi4yMDdjLTIuNTg5LTIuOTQ0LTQuMTA5LTYuNTM0LTQuMTA5LTEwLjQwOEMxMzguODAyIDguMTAyIDE0OC45MiAwIDE2MS40MDIgMCAxNzMuODgxIDAgMTg0IDguMTAyIDE4NCAxOC4wOTdjMCA5Ljk5NS0xMC4xMTggMTguMDk3LTIyLjU5OSAxOC4wOTctNC41MjggMC04Ljc0NC0xLjA2Ni0xMi4yOC0yLjkwMnpcIixcbiAgICBmaWxsOiBcIiNEQ0UwRTZcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJnXCIsIHtcbiAgICB0cmFuc2Zvcm06IFwidHJhbnNsYXRlKDE0OS42NSAxNS4zODMpXCIsXG4gICAgZmlsbDogXCIjRkZGXCJcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJlbGxpcHNlXCIsIHtcbiAgICBjeDogXCIyMC42NTRcIixcbiAgICBjeTogXCIzLjE2N1wiLFxuICAgIHJ4OiBcIjIuODQ5XCIsXG4gICAgcnk6IFwiMi44MTVcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk01LjY5OCA1LjYzSDBMMi44OTguNzA0ek05LjI1OS43MDRoNC45ODVWNS42M0g5LjI1OXpcIlxuICB9KSkpKTtcbn07XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBFbXB0eS5kaXNwbGF5TmFtZSA9ICdFbXB0eUltYWdlJztcbn1cbmV4cG9ydCBkZWZhdWx0IEVtcHR5OyIsICJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEZhc3RDb2xvciB9IGZyb20gJ0BhbnQtZGVzaWduL2Zhc3QtY29sb3InO1xuaW1wb3J0IHsgdXNlVG9rZW4gfSBmcm9tICcuLi90aGVtZS9pbnRlcm5hbCc7XG5pbXBvcnQgeyB1c2VMb2NhbGUgfSBmcm9tICcuLi9sb2NhbGUnO1xuY29uc3QgU2ltcGxlID0gKCkgPT4ge1xuICBjb25zdCBbLCB0b2tlbl0gPSB1c2VUb2tlbigpO1xuICBjb25zdCBbbG9jYWxlXSA9IHVzZUxvY2FsZSgnRW1wdHknKTtcbiAgY29uc3Qge1xuICAgIGNvbG9yRmlsbCxcbiAgICBjb2xvckZpbGxUZXJ0aWFyeSxcbiAgICBjb2xvckZpbGxRdWF0ZXJuYXJ5LFxuICAgIGNvbG9yQmdDb250YWluZXJcbiAgfSA9IHRva2VuO1xuICBjb25zdCB7XG4gICAgYm9yZGVyQ29sb3IsXG4gICAgc2hhZG93Q29sb3IsXG4gICAgY29udGVudENvbG9yXG4gIH0gPSB1c2VNZW1vKCgpID0+ICh7XG4gICAgYm9yZGVyQ29sb3I6IG5ldyBGYXN0Q29sb3IoY29sb3JGaWxsKS5vbkJhY2tncm91bmQoY29sb3JCZ0NvbnRhaW5lcikudG9IZXhTdHJpbmcoKSxcbiAgICBzaGFkb3dDb2xvcjogbmV3IEZhc3RDb2xvcihjb2xvckZpbGxUZXJ0aWFyeSkub25CYWNrZ3JvdW5kKGNvbG9yQmdDb250YWluZXIpLnRvSGV4U3RyaW5nKCksXG4gICAgY29udGVudENvbG9yOiBuZXcgRmFzdENvbG9yKGNvbG9yRmlsbFF1YXRlcm5hcnkpLm9uQmFja2dyb3VuZChjb2xvckJnQ29udGFpbmVyKS50b0hleFN0cmluZygpXG4gIH0pLCBbY29sb3JGaWxsLCBjb2xvckZpbGxUZXJ0aWFyeSwgY29sb3JGaWxsUXVhdGVybmFyeSwgY29sb3JCZ0NvbnRhaW5lcl0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge1xuICAgIHdpZHRoOiBcIjY0XCIsXG4gICAgaGVpZ2h0OiBcIjQxXCIsXG4gICAgdmlld0JveDogXCIwIDAgNjQgNDFcIixcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwidGl0bGVcIiwgbnVsbCwgKGxvY2FsZSA9PT0gbnVsbCB8fCBsb2NhbGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxvY2FsZS5kZXNjcmlwdGlvbikgfHwgJ0VtcHR5JyksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZ1wiLCB7XG4gICAgdHJhbnNmb3JtOiBcInRyYW5zbGF0ZSgwIDEpXCIsXG4gICAgZmlsbDogXCJub25lXCIsXG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZWxsaXBzZVwiLCB7XG4gICAgZmlsbDogc2hhZG93Q29sb3IsXG4gICAgY3g6IFwiMzJcIixcbiAgICBjeTogXCIzM1wiLFxuICAgIHJ4OiBcIjMyXCIsXG4gICAgcnk6IFwiN1wiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImdcIiwge1xuICAgIGZpbGxSdWxlOiBcIm5vbnplcm9cIixcbiAgICBzdHJva2U6IGJvcmRlckNvbG9yXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNTUgMTIuNzZMNDQuODU0IDEuMjU4QzQ0LjM2Ny40NzQgNDMuNjU2IDAgNDIuOTA3IDBIMjEuMDkzYy0uNzQ5IDAtMS40Ni40NzQtMS45NDcgMS4yNTdMOSAxMi43NjFWMjJoNDZ2LTkuMjR6XCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNDEuNjEzIDE1LjkzMWMwLTEuNjA1Ljk5NC0yLjkzIDIuMjI3LTIuOTMxSDU1djE4LjEzN0M1NSAzMy4yNiA1My42OCAzNSA1Mi4wNSAzNWgtNDAuMUMxMC4zMiAzNSA5IDMzLjI1OSA5IDMxLjEzN1YxM2gxMS4xNmMxLjIzMyAwIDIuMjI3IDEuMzIzIDIuMjI3IDIuOTI4di4wMjJjMCAxLjYwNSAxLjAwNSAyLjkwMSAyLjIzNyAyLjkwMWgxNC43NTJjMS4yMzIgMCAyLjIzNy0xLjMwOCAyLjIzNy0yLjkxM3YtLjAwN3pcIixcbiAgICBmaWxsOiBjb250ZW50Q29sb3JcbiAgfSkpKSk7XG59O1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgU2ltcGxlLmRpc3BsYXlOYW1lID0gJ1NpbXBsZUltYWdlJztcbn1cbmV4cG9ydCBkZWZhdWx0IFNpbXBsZTsiLCAiaW1wb3J0IHsgZ2VuU3R5bGVIb29rcywgbWVyZ2VUb2tlbiB9IGZyb20gJy4uLy4uL3RoZW1lL2ludGVybmFsJztcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTaGFyZWQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5jb25zdCBnZW5TaGFyZWRFbXB0eVN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzLFxuICAgIG1hcmdpbixcbiAgICBtYXJnaW5YUyxcbiAgICBtYXJnaW5YTCxcbiAgICBmb250U2l6ZSxcbiAgICBsaW5lSGVpZ2h0XG4gIH0gPSB0b2tlbjtcbiAgcmV0dXJuIHtcbiAgICBbY29tcG9uZW50Q2xzXToge1xuICAgICAgbWFyZ2luSW5saW5lOiBtYXJnaW5YUyxcbiAgICAgIGZvbnRTaXplLFxuICAgICAgbGluZUhlaWdodCxcbiAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAvLyBcdTUzOUZcdTY3NjUgJi1pbWFnZSBcdTZDQTFcdTY3MDlcdTcyMzZcdTVCNTBcdTdFRDNcdTY3ODRcdUZGMENcdTczQjBcdTU3MjhcdTRFM0FcdTRFODZcdTU5MTZcdTVDNDJcdTYyN0ZcdTYyQzVcdTYyMTFcdTRFRUNcdTc2ODQgaGFzaElkXHVGRjBDXHU2NTM5XHU2MjEwXHU3MjM2XHU1QjUwXHU3RUQzXHU2Nzg0XG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1pbWFnZWBdOiB7XG4gICAgICAgIGhlaWdodDogdG9rZW4uZW1wdHlJbWdIZWlnaHQsXG4gICAgICAgIG1hcmdpbkJvdHRvbTogbWFyZ2luWFMsXG4gICAgICAgIG9wYWNpdHk6IHRva2VuLm9wYWNpdHlJbWFnZSxcbiAgICAgICAgaW1nOiB7XG4gICAgICAgICAgaGVpZ2h0OiAnMTAwJSdcbiAgICAgICAgfSxcbiAgICAgICAgc3ZnOiB7XG4gICAgICAgICAgbWF4V2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAgICBtYXJnaW46ICdhdXRvJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tZGVzY3JpcHRpb25gXToge1xuICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JUZXh0RGVzY3JpcHRpb25cbiAgICAgIH0sXG4gICAgICAvLyBcdTUzOUZcdTY3NjUgJi1mb290ZXIgXHU2Q0ExXHU2NzA5XHU3MjM2XHU1QjUwXHU3RUQzXHU2Nzg0XHVGRjBDXHU3M0IwXHU1NzI4XHU0RTNBXHU0RTg2XHU1OTE2XHU1QzQyXHU2MjdGXHU2MkM1XHU2MjExXHU0RUVDXHU3Njg0IGhhc2hJZFx1RkYwQ1x1NjUzOVx1NjIxMFx1NzIzNlx1NUI1MFx1N0VEM1x1Njc4NFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tZm9vdGVyYF06IHtcbiAgICAgICAgbWFyZ2luVG9wOiBtYXJnaW5cbiAgICAgIH0sXG4gICAgICAnJi1ub3JtYWwnOiB7XG4gICAgICAgIG1hcmdpbkJsb2NrOiBtYXJnaW5YTCxcbiAgICAgICAgY29sb3I6IHRva2VuLmNvbG9yVGV4dERlc2NyaXB0aW9uLFxuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1kZXNjcmlwdGlvbmBdOiB7XG4gICAgICAgICAgY29sb3I6IHRva2VuLmNvbG9yVGV4dERlc2NyaXB0aW9uXG4gICAgICAgIH0sXG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LWltYWdlYF06IHtcbiAgICAgICAgICBoZWlnaHQ6IHRva2VuLmVtcHR5SW1nSGVpZ2h0TURcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICcmLXNtYWxsJzoge1xuICAgICAgICBtYXJnaW5CbG9jazogbWFyZ2luWFMsXG4gICAgICAgIGNvbG9yOiB0b2tlbi5jb2xvclRleHREZXNjcmlwdGlvbixcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30taW1hZ2VgXToge1xuICAgICAgICAgIGhlaWdodDogdG9rZW4uZW1wdHlJbWdIZWlnaHRTTVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFeHBvcnQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgZGVmYXVsdCBnZW5TdHlsZUhvb2tzKCdFbXB0eScsIHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENscyxcbiAgICBjb250cm9sSGVpZ2h0TEcsXG4gICAgY2FsY1xuICB9ID0gdG9rZW47XG4gIGNvbnN0IGVtcHR5VG9rZW4gPSBtZXJnZVRva2VuKHRva2VuLCB7XG4gICAgZW1wdHlJbWdDbHM6IGAke2NvbXBvbmVudENsc30taW1nYCxcbiAgICBlbXB0eUltZ0hlaWdodDogY2FsYyhjb250cm9sSGVpZ2h0TEcpLm11bCgyLjUpLmVxdWFsKCksXG4gICAgZW1wdHlJbWdIZWlnaHRNRDogY29udHJvbEhlaWdodExHLFxuICAgIGVtcHR5SW1nSGVpZ2h0U006IGNhbGMoY29udHJvbEhlaWdodExHKS5tdWwoMC44NzUpLmVxdWFsKClcbiAgfSk7XG4gIHJldHVybiBbZ2VuU2hhcmVkRW1wdHlTdHlsZShlbXB0eVRva2VuKV07XG59KTsiLCAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgVmFyaWFudENvbnRleHQgfSBmcm9tICcuLi9jb250ZXh0JztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQsIFZhcmlhbnRzIH0gZnJvbSAnLi4vLi4vY29uZmlnLXByb3ZpZGVyJztcbi8qKlxuICogQ29tcGF0aWJsZSBmb3IgbGVnYWN5IGBib3JkZXJlZGAgcHJvcC5cbiAqL1xuY29uc3QgdXNlVmFyaWFudCA9IGZ1bmN0aW9uIChjb21wb25lbnQsIHZhcmlhbnQpIHtcbiAgbGV0IGxlZ2FjeUJvcmRlcmVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQ7XG4gIHZhciBfYSwgX2I7XG4gIGNvbnN0IHtcbiAgICB2YXJpYW50OiBjb25maWdWYXJpYW50LFxuICAgIFtjb21wb25lbnRdOiBjb21wb25lbnRDb25maWdcbiAgfSA9IFJlYWN0LnVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCk7XG4gIGNvbnN0IGN0eFZhcmlhbnQgPSBSZWFjdC51c2VDb250ZXh0KFZhcmlhbnRDb250ZXh0KTtcbiAgY29uc3QgY29uZmlnQ29tcG9uZW50VmFyaWFudCA9IGNvbXBvbmVudENvbmZpZyA9PT0gbnVsbCB8fCBjb21wb25lbnRDb25maWcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbXBvbmVudENvbmZpZy52YXJpYW50O1xuICBsZXQgbWVyZ2VkVmFyaWFudDtcbiAgaWYgKHR5cGVvZiB2YXJpYW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgIG1lcmdlZFZhcmlhbnQgPSB2YXJpYW50O1xuICB9IGVsc2UgaWYgKGxlZ2FjeUJvcmRlcmVkID09PSBmYWxzZSkge1xuICAgIG1lcmdlZFZhcmlhbnQgPSAnYm9yZGVybGVzcyc7XG4gIH0gZWxzZSB7XG4gICAgLy8gZm9ybSB2YXJpYW50ID4gY29tcG9uZW50IGdsb2JhbCB2YXJpYW50ID4gZ2xvYmFsIHZhcmlhbnRcbiAgICBtZXJnZWRWYXJpYW50ID0gKF9iID0gKF9hID0gY3R4VmFyaWFudCAhPT0gbnVsbCAmJiBjdHhWYXJpYW50ICE9PSB2b2lkIDAgPyBjdHhWYXJpYW50IDogY29uZmlnQ29tcG9uZW50VmFyaWFudCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogY29uZmlnVmFyaWFudCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJ291dGxpbmVkJztcbiAgfVxuICBjb25zdCBlbmFibGVWYXJpYW50Q2xzID0gVmFyaWFudHMuaW5jbHVkZXMobWVyZ2VkVmFyaWFudCk7XG4gIHJldHVybiBbbWVyZ2VkVmFyaWFudCwgZW5hYmxlVmFyaWFudENsc107XG59O1xuZXhwb3J0IGRlZmF1bHQgdXNlVmFyaWFudDsiLCAiY29uc3QgZ2V0QnVpbHRJblBsYWNlbWVudHMgPSBwb3B1cE92ZXJmbG93ID0+IHtcbiAgY29uc3QgaHRtbFJlZ2lvbiA9IHBvcHVwT3ZlcmZsb3cgPT09ICdzY3JvbGwnID8gJ3Njcm9sbCcgOiAndmlzaWJsZSc7XG4gIGNvbnN0IHNoYXJlZENvbmZpZyA9IHtcbiAgICBvdmVyZmxvdzoge1xuICAgICAgYWRqdXN0WDogdHJ1ZSxcbiAgICAgIGFkanVzdFk6IHRydWUsXG4gICAgICBzaGlmdFk6IHRydWVcbiAgICB9LFxuICAgIGh0bWxSZWdpb24sXG4gICAgZHluYW1pY0luc2V0OiB0cnVlXG4gIH07XG4gIHJldHVybiB7XG4gICAgYm90dG9tTGVmdDogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzaGFyZWRDb25maWcpLCB7XG4gICAgICBwb2ludHM6IFsndGwnLCAnYmwnXSxcbiAgICAgIG9mZnNldDogWzAsIDRdXG4gICAgfSksXG4gICAgYm90dG9tUmlnaHQ6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc2hhcmVkQ29uZmlnKSwge1xuICAgICAgcG9pbnRzOiBbJ3RyJywgJ2JyJ10sXG4gICAgICBvZmZzZXQ6IFswLCA0XVxuICAgIH0pLFxuICAgIHRvcExlZnQ6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc2hhcmVkQ29uZmlnKSwge1xuICAgICAgcG9pbnRzOiBbJ2JsJywgJ3RsJ10sXG4gICAgICBvZmZzZXQ6IFswLCAtNF1cbiAgICB9KSxcbiAgICB0b3BSaWdodDogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzaGFyZWRDb25maWcpLCB7XG4gICAgICBwb2ludHM6IFsnYnInLCAndHInXSxcbiAgICAgIG9mZnNldDogWzAsIC00XVxuICAgIH0pXG4gIH07XG59O1xuZnVuY3Rpb24gbWVyZ2VkQnVpbHRpblBsYWNlbWVudHMoYnVpbGRJblBsYWNlbWVudHMsIHBvcHVwT3ZlcmZsb3cpIHtcbiAgcmV0dXJuIGJ1aWxkSW5QbGFjZW1lbnRzIHx8IGdldEJ1aWx0SW5QbGFjZW1lbnRzKHBvcHVwT3ZlcmZsb3cpO1xufVxuZXhwb3J0IGRlZmF1bHQgbWVyZ2VkQnVpbHRpblBsYWNlbWVudHM7IiwgImltcG9ydCB7IHJlc2V0Q29tcG9uZW50LCB0ZXh0RWxsaXBzaXMgfSBmcm9tICcuLi8uLi9zdHlsZSc7XG5pbXBvcnQgeyBpbml0TW92ZU1vdGlvbiwgaW5pdFNsaWRlTW90aW9uLCBzbGlkZURvd25Jbiwgc2xpZGVEb3duT3V0LCBzbGlkZVVwSW4sIHNsaWRlVXBPdXQgfSBmcm9tICcuLi8uLi9zdHlsZS9tb3Rpb24nO1xuY29uc3QgZ2VuSXRlbVN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgb3B0aW9uSGVpZ2h0LFxuICAgIG9wdGlvbkZvbnRTaXplLFxuICAgIG9wdGlvbkxpbmVIZWlnaHQsXG4gICAgb3B0aW9uUGFkZGluZ1xuICB9ID0gdG9rZW47XG4gIHJldHVybiB7XG4gICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgZGlzcGxheTogJ2Jsb2NrJyxcbiAgICBtaW5IZWlnaHQ6IG9wdGlvbkhlaWdodCxcbiAgICBwYWRkaW5nOiBvcHRpb25QYWRkaW5nLFxuICAgIGNvbG9yOiB0b2tlbi5jb2xvclRleHQsXG4gICAgZm9udFdlaWdodDogJ25vcm1hbCcsXG4gICAgZm9udFNpemU6IG9wdGlvbkZvbnRTaXplLFxuICAgIGxpbmVIZWlnaHQ6IG9wdGlvbkxpbmVIZWlnaHQsXG4gICAgYm94U2l6aW5nOiAnYm9yZGVyLWJveCdcbiAgfTtcbn07XG5jb25zdCBnZW5TaW5nbGVTdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGFudENscyxcbiAgICBjb21wb25lbnRDbHNcbiAgfSA9IHRva2VuO1xuICBjb25zdCBzZWxlY3RJdGVtQ2xzID0gYCR7Y29tcG9uZW50Q2xzfS1pdGVtYDtcbiAgY29uc3Qgc2xpZGVVcEVudGVyQWN0aXZlID0gYCYke2FudENsc30tc2xpZGUtdXAtZW50ZXIke2FudENsc30tc2xpZGUtdXAtZW50ZXItYWN0aXZlYDtcbiAgY29uc3Qgc2xpZGVVcEFwcGVhckFjdGl2ZSA9IGAmJHthbnRDbHN9LXNsaWRlLXVwLWFwcGVhciR7YW50Q2xzfS1zbGlkZS11cC1hcHBlYXItYWN0aXZlYDtcbiAgY29uc3Qgc2xpZGVVcExlYXZlQWN0aXZlID0gYCYke2FudENsc30tc2xpZGUtdXAtbGVhdmUke2FudENsc30tc2xpZGUtdXAtbGVhdmUtYWN0aXZlYDtcbiAgY29uc3QgZHJvcGRvd25QbGFjZW1lbnRDbHMgPSBgJHtjb21wb25lbnRDbHN9LWRyb3Bkb3duLXBsYWNlbWVudC1gO1xuICBjb25zdCBzZWxlY3RlZEl0ZW1DbHMgPSBgJHtzZWxlY3RJdGVtQ2xzfS1vcHRpb24tc2VsZWN0ZWRgO1xuICByZXR1cm4gW3tcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS1kcm9wZG93bmBdOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlc2V0Q29tcG9uZW50KHRva2VuKSksIHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgdG9wOiAtOTk5OSxcbiAgICAgIHpJbmRleDogdG9rZW4uekluZGV4UG9wdXAsXG4gICAgICBib3hTaXppbmc6ICdib3JkZXItYm94JyxcbiAgICAgIHBhZGRpbmc6IHRva2VuLnBhZGRpbmdYWFMsXG4gICAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgICBmb250U2l6ZTogdG9rZW4uZm9udFNpemUsXG4gICAgICAvLyBGaXggc2VsZWN0IHJlbmRlciBsYWcgb2YgbG9uZyB0ZXh0IGluIGNocm9tZVxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMTE0NTZcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzExODQzXG4gICAgICBmb250VmFyaWFudDogJ2luaXRpYWwnLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0b2tlbi5jb2xvckJnRWxldmF0ZWQsXG4gICAgICBib3JkZXJSYWRpdXM6IHRva2VuLmJvcmRlclJhZGl1c0xHLFxuICAgICAgb3V0bGluZTogJ25vbmUnLFxuICAgICAgYm94U2hhZG93OiB0b2tlbi5ib3hTaGFkb3dTZWNvbmRhcnksXG4gICAgICBbYFxuICAgICAgICAgICR7c2xpZGVVcEVudGVyQWN0aXZlfSR7ZHJvcGRvd25QbGFjZW1lbnRDbHN9Ym90dG9tTGVmdCxcbiAgICAgICAgICAke3NsaWRlVXBBcHBlYXJBY3RpdmV9JHtkcm9wZG93blBsYWNlbWVudENsc31ib3R0b21MZWZ0XG4gICAgICAgIGBdOiB7XG4gICAgICAgIGFuaW1hdGlvbk5hbWU6IHNsaWRlVXBJblxuICAgICAgfSxcbiAgICAgIFtgXG4gICAgICAgICAgJHtzbGlkZVVwRW50ZXJBY3RpdmV9JHtkcm9wZG93blBsYWNlbWVudENsc310b3BMZWZ0LFxuICAgICAgICAgICR7c2xpZGVVcEFwcGVhckFjdGl2ZX0ke2Ryb3Bkb3duUGxhY2VtZW50Q2xzfXRvcExlZnQsXG4gICAgICAgICAgJHtzbGlkZVVwRW50ZXJBY3RpdmV9JHtkcm9wZG93blBsYWNlbWVudENsc310b3BSaWdodCxcbiAgICAgICAgICAke3NsaWRlVXBBcHBlYXJBY3RpdmV9JHtkcm9wZG93blBsYWNlbWVudENsc310b3BSaWdodFxuICAgICAgICBgXToge1xuICAgICAgICBhbmltYXRpb25OYW1lOiBzbGlkZURvd25JblxuICAgICAgfSxcbiAgICAgIFtgJHtzbGlkZVVwTGVhdmVBY3RpdmV9JHtkcm9wZG93blBsYWNlbWVudENsc31ib3R0b21MZWZ0YF06IHtcbiAgICAgICAgYW5pbWF0aW9uTmFtZTogc2xpZGVVcE91dFxuICAgICAgfSxcbiAgICAgIFtgXG4gICAgICAgICAgJHtzbGlkZVVwTGVhdmVBY3RpdmV9JHtkcm9wZG93blBsYWNlbWVudENsc310b3BMZWZ0LFxuICAgICAgICAgICR7c2xpZGVVcExlYXZlQWN0aXZlfSR7ZHJvcGRvd25QbGFjZW1lbnRDbHN9dG9wUmlnaHRcbiAgICAgICAgYF06IHtcbiAgICAgICAgYW5pbWF0aW9uTmFtZTogc2xpZGVEb3duT3V0XG4gICAgICB9LFxuICAgICAgJyYtaGlkZGVuJzoge1xuICAgICAgICBkaXNwbGF5OiAnbm9uZSdcbiAgICAgIH0sXG4gICAgICBbc2VsZWN0SXRlbUNsc106IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZ2VuSXRlbVN0eWxlKHRva2VuKSksIHtcbiAgICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgICAgIHRyYW5zaXRpb246IGBiYWNrZ3JvdW5kICR7dG9rZW4ubW90aW9uRHVyYXRpb25TbG93fSBlYXNlYCxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiB0b2tlbi5ib3JkZXJSYWRpdXNTTSxcbiAgICAgICAgLy8gPT09PT09PT09PT0gR3JvdXAgPT09PT09PT09PT09XG4gICAgICAgICcmLWdyb3VwJzoge1xuICAgICAgICAgIGNvbG9yOiB0b2tlbi5jb2xvclRleHREZXNjcmlwdGlvbixcbiAgICAgICAgICBmb250U2l6ZTogdG9rZW4uZm9udFNpemVTTSxcbiAgICAgICAgICBjdXJzb3I6ICdkZWZhdWx0J1xuICAgICAgICB9LFxuICAgICAgICAvLyA9PT09PT09PT09PSBPcHRpb24gPT09PT09PT09PT1cbiAgICAgICAgJyYtb3B0aW9uJzoge1xuICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgICAnJi1jb250ZW50JzogT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICBmbGV4OiAnYXV0bydcbiAgICAgICAgICB9LCB0ZXh0RWxsaXBzaXMpLFxuICAgICAgICAgICcmLXN0YXRlJzoge1xuICAgICAgICAgICAgZmxleDogJ25vbmUnLFxuICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcidcbiAgICAgICAgICB9LFxuICAgICAgICAgIFtgJi1hY3RpdmU6bm90KCR7c2VsZWN0SXRlbUNsc30tb3B0aW9uLWRpc2FibGVkKWBdOiB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRva2VuLm9wdGlvbkFjdGl2ZUJnXG4gICAgICAgICAgfSxcbiAgICAgICAgICBbYCYtc2VsZWN0ZWQ6bm90KCR7c2VsZWN0SXRlbUNsc30tb3B0aW9uLWRpc2FibGVkKWBdOiB7XG4gICAgICAgICAgICBjb2xvcjogdG9rZW4ub3B0aW9uU2VsZWN0ZWRDb2xvcixcbiAgICAgICAgICAgIGZvbnRXZWlnaHQ6IHRva2VuLm9wdGlvblNlbGVjdGVkRm9udFdlaWdodCxcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdG9rZW4ub3B0aW9uU2VsZWN0ZWRCZyxcbiAgICAgICAgICAgIFtgJHtzZWxlY3RJdGVtQ2xzfS1vcHRpb24tc3RhdGVgXToge1xuICAgICAgICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JQcmltYXJ5XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICAnJi1kaXNhYmxlZCc6IHtcbiAgICAgICAgICAgIFtgJiR7c2VsZWN0SXRlbUNsc30tb3B0aW9uLXNlbGVjdGVkYF06IHtcbiAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0b2tlbi5jb2xvckJnQ29udGFpbmVyRGlzYWJsZWRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JUZXh0RGlzYWJsZWQsXG4gICAgICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCdcbiAgICAgICAgICB9LFxuICAgICAgICAgICcmLWdyb3VwZWQnOiB7XG4gICAgICAgICAgICBwYWRkaW5nSW5saW5lU3RhcnQ6IHRva2VuLmNhbGModG9rZW4uY29udHJvbFBhZGRpbmdIb3Jpem9udGFsKS5tdWwoMikuZXF1YWwoKVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgJyYtZW1wdHknOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGdlbkl0ZW1TdHlsZSh0b2tlbikpLCB7XG4gICAgICAgICAgY29sb3I6IHRva2VuLmNvbG9yVGV4dERpc2FibGVkXG4gICAgICAgIH0pXG4gICAgICB9KSxcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vcHVsbC80NjY0NlxuICAgICAgW2Ake3NlbGVjdGVkSXRlbUNsc306aGFzKCsgJHtzZWxlY3RlZEl0ZW1DbHN9KWBdOiB7XG4gICAgICAgIGJvcmRlckVuZFN0YXJ0UmFkaXVzOiAwLFxuICAgICAgICBib3JkZXJFbmRFbmRSYWRpdXM6IDAsXG4gICAgICAgIFtgJiArICR7c2VsZWN0ZWRJdGVtQ2xzfWBdOiB7XG4gICAgICAgICAgYm9yZGVyU3RhcnRTdGFydFJhZGl1czogMCxcbiAgICAgICAgICBib3JkZXJTdGFydEVuZFJhZGl1czogMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IFJUTCA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICcmLXJ0bCc6IHtcbiAgICAgICAgZGlyZWN0aW9uOiAncnRsJ1xuICAgICAgfVxuICAgIH0pXG4gIH0sXG4gIC8vIEZvbGxvdyBjb2RlIG1heSByZXVzZSBpbiBvdGhlciBjb21wb25lbnRzXG4gIGluaXRTbGlkZU1vdGlvbih0b2tlbiwgJ3NsaWRlLXVwJyksIGluaXRTbGlkZU1vdGlvbih0b2tlbiwgJ3NsaWRlLWRvd24nKSwgaW5pdE1vdmVNb3Rpb24odG9rZW4sICdtb3ZlLXVwJyksIGluaXRNb3ZlTW90aW9uKHRva2VuLCAnbW92ZS1kb3duJyldO1xufTtcbmV4cG9ydCBkZWZhdWx0IGdlblNpbmdsZVN0eWxlOyIsICJpbXBvcnQgeyB1bml0IH0gZnJvbSAnQGFudC1kZXNpZ24vY3NzaW5qcyc7XG5pbXBvcnQgeyByZXNldEljb24gfSBmcm9tICcuLi8uLi9zdHlsZSc7XG5pbXBvcnQgeyBtZXJnZVRva2VuIH0gZnJvbSAnLi4vLi4vdGhlbWUvaW50ZXJuYWwnO1xuLyoqXG4gKiBHZXQgbXVsdGlwbGUgc2VsZWN0b3IgbmVlZGVkIHN0eWxlLiBUaGUgY2FsY3VsYXRpb246XG4gKlxuICogQ29udGFpbmVyUGFkZGluZyA9IEJhc2VQYWRkaW5nIC0gSXRlbU1hcmdpblxuICpcbiAqIEJvcmRlcjogICAgICAgICAgICAgICAgICAgIFx1MjU1NFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1NyAgICAgICAgICAgICAgICAgXHUyNTJDXG4gKiBDb250YWluZXJQYWRkaW5nOiAgICAgICAgICBcdTI1NTEgICAgICAgICAgICAgICAgICAgICAgICAgICBcdTI1NTEgICAgICAgICAgICAgICAgIFx1MjUwMlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgXHUyNTVGXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTYyICAgICBcdTI1MkMgICAgICAgICAgIFx1MjUwMlxuICogSXRlbSBNYXJnaW46ICAgICAgICAgICAgICAgXHUyNTUxICAgICAgICAgICAgICAgICAgICAgICAgICAgXHUyNTUxICAgICBcdTI1MDIgICAgICAgICAgIFx1MjUwMlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgXHUyNTUxICAgICAgICAgICAgIFx1MjUwQ1x1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUxMCAgXHUyNTUxICAgICBcdTI1MDIgICAgICAgICAgIFx1MjUwMlxuICogSXRlbShtdWx0aXBsZUl0ZW1IZWlnaHQpOiAgXHUyNTUxIEJhc2VQYWRkaW5nIFx1MjUwMiAgIEl0ZW0gICBcdTI1MDIgIFx1MjU1MSAgT3ZlcmZsb3cgIENvbnRhaW5lcihDb250cm9sSGVpZ2h0KVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgXHUyNTUxICAgICAgICAgICAgIFx1MjUxNFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUxOCAgXHUyNTUxICAgICBcdTI1MDIgICAgICAgICAgIFx1MjUwMlxuICogSXRlbSBNYXJnaW46ICAgICAgICAgICAgICAgXHUyNTUxICAgICAgICAgICAgICAgICAgICAgICAgICAgXHUyNTUxICAgICBcdTI1MDIgICAgICAgICAgIFx1MjUwMlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgXHUyNTVGXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTYyICAgICBcdTI1MzQgICAgICAgICAgIFx1MjUwMlxuICogQ29udGFpbmVyUGFkZGluZzogICAgICAgICAgXHUyNTUxICAgICAgICAgICAgICAgICAgICAgICAgICAgXHUyNTUxICAgICAgICAgICAgICAgICBcdTI1MDJcbiAqIEJvcmRlcjogICAgICAgICAgICAgICAgICAgIFx1MjU1QVx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1RCAgICAgICAgICAgICAgICAgXHUyNTM0XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRNdWx0aXBsZVNlbGVjdG9yVW5pdCA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIG11bHRpcGxlU2VsZWN0SXRlbUhlaWdodCxcbiAgICBwYWRkaW5nWFhTLFxuICAgIGxpbmVXaWR0aCxcbiAgICBJTlRFUk5BTF9GSVhFRF9JVEVNX01BUkdJTlxuICB9ID0gdG9rZW47XG4gIGNvbnN0IGJhc2VQYWRkaW5nID0gdG9rZW4ubWF4KHRva2VuLmNhbGMocGFkZGluZ1hYUykuc3ViKGxpbmVXaWR0aCkuZXF1YWwoKSwgMCk7XG4gIGNvbnN0IGNvbnRhaW5lclBhZGRpbmcgPSB0b2tlbi5tYXgodG9rZW4uY2FsYyhiYXNlUGFkZGluZykuc3ViKElOVEVSTkFMX0ZJWEVEX0lURU1fTUFSR0lOKS5lcXVhbCgpLCAwKTtcbiAgcmV0dXJuIHtcbiAgICBiYXNlUGFkZGluZyxcbiAgICBjb250YWluZXJQYWRkaW5nLFxuICAgIGl0ZW1IZWlnaHQ6IHVuaXQobXVsdGlwbGVTZWxlY3RJdGVtSGVpZ2h0KSxcbiAgICBpdGVtTGluZUhlaWdodDogdW5pdCh0b2tlbi5jYWxjKG11bHRpcGxlU2VsZWN0SXRlbUhlaWdodCkuc3ViKHRva2VuLmNhbGModG9rZW4ubGluZVdpZHRoKS5tdWwoMikpLmVxdWFsKCkpXG4gIH07XG59O1xuY29uc3QgZ2V0U2VsZWN0SXRlbVN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgbXVsdGlwbGVTZWxlY3RJdGVtSGVpZ2h0LFxuICAgIHNlbGVjdEhlaWdodCxcbiAgICBsaW5lV2lkdGhcbiAgfSA9IHRva2VuO1xuICBjb25zdCBzZWxlY3RJdGVtRGlzdCA9IHRva2VuLmNhbGMoc2VsZWN0SGVpZ2h0KS5zdWIobXVsdGlwbGVTZWxlY3RJdGVtSGVpZ2h0KS5kaXYoMikuc3ViKGxpbmVXaWR0aCkuZXF1YWwoKTtcbiAgcmV0dXJuIHNlbGVjdEl0ZW1EaXN0O1xufTtcbi8qKlxuICogR2V0IHRoZSBgcmMtb3ZlcmZsb3dgIG5lZWRlZCBzdHlsZS5cbiAqIEl0J3MgYSBzaGFyZSBzdHlsZSB3aGljaCBtZWFucyBub3QgYWZmZWN0ZWQgYnkgYHNpemVgLlxuICovXG5leHBvcnQgY29uc3QgZ2VuT3ZlcmZsb3dTdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENscyxcbiAgICBpY29uQ2xzLFxuICAgIGJvcmRlclJhZGl1c1NNLFxuICAgIG1vdGlvbkR1cmF0aW9uU2xvdyxcbiAgICBwYWRkaW5nWFMsXG4gICAgbXVsdGlwbGVJdGVtQ29sb3JEaXNhYmxlZCxcbiAgICBtdWx0aXBsZUl0ZW1Cb3JkZXJDb2xvckRpc2FibGVkLFxuICAgIGNvbG9ySWNvbixcbiAgICBjb2xvckljb25Ib3ZlcixcbiAgICBJTlRFUk5BTF9GSVhFRF9JVEVNX01BUkdJTlxuICB9ID0gdG9rZW47XG4gIGNvbnN0IHNlbGVjdE92ZXJmbG93UHJlZml4Q2xzID0gYCR7Y29tcG9uZW50Q2xzfS1zZWxlY3Rpb24tb3ZlcmZsb3dgO1xuICByZXR1cm4ge1xuICAgIC8qKlxuICAgICAqIERvIG5vdCBtZXJnZSBgaGVpZ2h0YCAmIGBsaW5lLWhlaWdodGAgdW5kZXIgc3R5bGUgd2l0aCBgc2VsZWN0aW9uYCAmIGBzZWFyY2hgLCBzaW5jZSBjaHJvbWVcbiAgICAgKiBtYXkgdXBkYXRlIHRvIHJlZGVzaWduIHdpdGggaXRzIGFsaWduIGxvZ2ljLlxuICAgICAqL1xuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBPdmVyZmxvdyA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBbc2VsZWN0T3ZlcmZsb3dQcmVmaXhDbHNdOiB7XG4gICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgIGZsZXg6ICdhdXRvJyxcbiAgICAgIGZsZXhXcmFwOiAnd3JhcCcsXG4gICAgICBtYXhXaWR0aDogJzEwMCUnLFxuICAgICAgJyYtaXRlbSc6IHtcbiAgICAgICAgZmxleDogJ25vbmUnLFxuICAgICAgICBhbGlnblNlbGY6ICdjZW50ZXInLFxuICAgICAgICBtYXhXaWR0aDogJzEwMCUnLFxuICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWZsZXgnXG4gICAgICB9LFxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IFNlbGVjdGlvbnMgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LXNlbGVjdGlvbi1pdGVtYF06IHtcbiAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICBhbGlnblNlbGY6ICdjZW50ZXInLFxuICAgICAgICBmbGV4OiAnbm9uZScsXG4gICAgICAgIGJveFNpemluZzogJ2JvcmRlci1ib3gnLFxuICAgICAgICBtYXhXaWR0aDogJzEwMCUnLFxuICAgICAgICBtYXJnaW5CbG9jazogSU5URVJOQUxfRklYRURfSVRFTV9NQVJHSU4sXG4gICAgICAgIGJvcmRlclJhZGl1czogYm9yZGVyUmFkaXVzU00sXG4gICAgICAgIGN1cnNvcjogJ2RlZmF1bHQnLFxuICAgICAgICB0cmFuc2l0aW9uOiBgZm9udC1zaXplICR7bW90aW9uRHVyYXRpb25TbG93fSwgbGluZS1oZWlnaHQgJHttb3Rpb25EdXJhdGlvblNsb3d9LCBoZWlnaHQgJHttb3Rpb25EdXJhdGlvblNsb3d9YCxcbiAgICAgICAgbWFyZ2luSW5saW5lRW5kOiB0b2tlbi5jYWxjKElOVEVSTkFMX0ZJWEVEX0lURU1fTUFSR0lOKS5tdWwoMikuZXF1YWwoKSxcbiAgICAgICAgcGFkZGluZ0lubGluZVN0YXJ0OiBwYWRkaW5nWFMsXG4gICAgICAgIHBhZGRpbmdJbmxpbmVFbmQ6IHRva2VuLmNhbGMocGFkZGluZ1hTKS5kaXYoMikuZXF1YWwoKSxcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30tZGlzYWJsZWQmYF06IHtcbiAgICAgICAgICBjb2xvcjogbXVsdGlwbGVJdGVtQ29sb3JEaXNhYmxlZCxcbiAgICAgICAgICBib3JkZXJDb2xvcjogbXVsdGlwbGVJdGVtQm9yZGVyQ29sb3JEaXNhYmxlZCxcbiAgICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCdcbiAgICAgICAgfSxcbiAgICAgICAgLy8gSXQncyBvayBub3QgdG8gZG8gdGhpcywgYnV0IDI0cHggbWFrZXMgYm90dG9tIG5hcnJvdyBpbiB2aWV3IHNob3VsZCBhZGp1c3RcbiAgICAgICAgJyYtY29udGVudCc6IHtcbiAgICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJyxcbiAgICAgICAgICBtYXJnaW5JbmxpbmVFbmQ6IHRva2VuLmNhbGMocGFkZGluZ1hTKS5kaXYoMikuZXF1YWwoKSxcbiAgICAgICAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgICAgICAgd2hpdGVTcGFjZTogJ3ByZScsXG4gICAgICAgICAgLy8gZml4IHdoaXRlc3BhY2Ugd3JhcHBpbmcuIGN1c3RvbSB0YWdzIGRpc3BsYXkgYWxsIHdoaXRlc3BhY2Ugd2l0aGluLlxuICAgICAgICAgIHRleHRPdmVyZmxvdzogJ2VsbGlwc2lzJ1xuICAgICAgICB9LFxuICAgICAgICAnJi1yZW1vdmUnOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlc2V0SWNvbigpKSwge1xuICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtZmxleCcsXG4gICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAgY29sb3I6IGNvbG9ySWNvbixcbiAgICAgICAgICBmb250V2VpZ2h0OiAnYm9sZCcsXG4gICAgICAgICAgZm9udFNpemU6IDEwLFxuICAgICAgICAgIGxpbmVIZWlnaHQ6ICdpbmhlcml0JyxcbiAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgICAgICBbYD4gJHtpY29uQ2xzfWBdOiB7XG4gICAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiAnLTAuMmVtJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgJyY6aG92ZXInOiB7XG4gICAgICAgICAgICBjb2xvcjogY29sb3JJY29uSG92ZXJcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbmNvbnN0IGdlblNlbGVjdGlvblN0eWxlID0gKHRva2VuLCBzdWZmaXgpID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENscyxcbiAgICBJTlRFUk5BTF9GSVhFRF9JVEVNX01BUkdJTlxuICB9ID0gdG9rZW47XG4gIGNvbnN0IHNlbGVjdE92ZXJmbG93UHJlZml4Q2xzID0gYCR7Y29tcG9uZW50Q2xzfS1zZWxlY3Rpb24tb3ZlcmZsb3dgO1xuICBjb25zdCBzZWxlY3RJdGVtSGVpZ2h0ID0gdG9rZW4ubXVsdGlwbGVTZWxlY3RJdGVtSGVpZ2h0O1xuICBjb25zdCBzZWxlY3RJdGVtRGlzdCA9IGdldFNlbGVjdEl0ZW1TdHlsZSh0b2tlbik7XG4gIGNvbnN0IHN1ZmZpeENscyA9IHN1ZmZpeCA/IGAke2NvbXBvbmVudENsc30tJHtzdWZmaXh9YCA6ICcnO1xuICBjb25zdCBtdWx0aXBsZVNlbGVjdG9yVW5pdCA9IGdldE11bHRpcGxlU2VsZWN0b3JVbml0KHRva2VuKTtcbiAgcmV0dXJuIHtcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS1tdWx0aXBsZSR7c3VmZml4Q2xzfWBdOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGdlbk92ZXJmbG93U3R5bGUodG9rZW4pKSwge1xuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBTZWxlY3RvciA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1zZWxlY3RvcmBdOiB7XG4gICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgICAvLyBNdWx0aXBsZSBpcyBsaXR0bGUgZGlmZmVyZW50IHRoYXQgaG9yaXpvbnRhbCBpcyBmb2xsb3cgdGhlIHZlcnRpY2FsXG4gICAgICAgIHBhZGRpbmdJbmxpbmU6IG11bHRpcGxlU2VsZWN0b3JVbml0LmJhc2VQYWRkaW5nLFxuICAgICAgICBwYWRkaW5nQmxvY2s6IG11bHRpcGxlU2VsZWN0b3JVbml0LmNvbnRhaW5lclBhZGRpbmcsXG4gICAgICAgIGJvcmRlclJhZGl1czogdG9rZW4uYm9yZGVyUmFkaXVzLFxuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1kaXNhYmxlZCZgXToge1xuICAgICAgICAgIGJhY2tncm91bmQ6IHRva2VuLm11bHRpcGxlU2VsZWN0b3JCZ0Rpc2FibGVkLFxuICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkJ1xuICAgICAgICB9LFxuICAgICAgICAnJjphZnRlcic6IHtcbiAgICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJyxcbiAgICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgICBtYXJnaW46IGAke3VuaXQoSU5URVJOQUxfRklYRURfSVRFTV9NQVJHSU4pfSAwYCxcbiAgICAgICAgICBsaW5lSGVpZ2h0OiB1bml0KHNlbGVjdEl0ZW1IZWlnaHQpLFxuICAgICAgICAgIHZpc2liaWxpdHk6ICdoaWRkZW4nLFxuICAgICAgICAgIGNvbnRlbnQ6ICdcIlxcXFxhMFwiJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IFNlbGVjdGlvbnMgPT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1zZWxlY3Rpb24taXRlbWBdOiB7XG4gICAgICAgIGhlaWdodDogbXVsdGlwbGVTZWxlY3RvclVuaXQuaXRlbUhlaWdodCxcbiAgICAgICAgbGluZUhlaWdodDogdW5pdChtdWx0aXBsZVNlbGVjdG9yVW5pdC5pdGVtTGluZUhlaWdodClcbiAgICAgIH0sXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBXcmFwID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgW2Ake2NvbXBvbmVudENsc30tc2VsZWN0aW9uLXdyYXBgXToge1xuICAgICAgICBhbGlnblNlbGY6ICdmbGV4LXN0YXJ0JyxcbiAgICAgICAgJyY6YWZ0ZXInOiB7XG4gICAgICAgICAgbGluZUhlaWdodDogdW5pdChzZWxlY3RJdGVtSGVpZ2h0KSxcbiAgICAgICAgICBtYXJnaW5CbG9jazogSU5URVJOQUxfRklYRURfSVRFTV9NQVJHSU5cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IElucHV0ID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1wcmVmaXhgXToge1xuICAgICAgICBtYXJnaW5JbmxpbmVTdGFydDogdG9rZW4uY2FsYyh0b2tlbi5pbnB1dFBhZGRpbmdIb3Jpem9udGFsQmFzZSkuc3ViKG11bHRpcGxlU2VsZWN0b3JVbml0LmJhc2VQYWRkaW5nKS5lcXVhbCgpXG4gICAgICB9LFxuICAgICAgW2Ake3NlbGVjdE92ZXJmbG93UHJlZml4Q2xzfS1pdGVtICsgJHtzZWxlY3RPdmVyZmxvd1ByZWZpeENsc30taXRlbSxcbiAgICAgICAgJHtjb21wb25lbnRDbHN9LXByZWZpeCArICR7Y29tcG9uZW50Q2xzfS1zZWxlY3Rpb24td3JhcFxuICAgICAgYF06IHtcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30tc2VsZWN0aW9uLXNlYXJjaGBdOiB7XG4gICAgICAgICAgbWFyZ2luSW5saW5lU3RhcnQ6IDBcbiAgICAgICAgfSxcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30tc2VsZWN0aW9uLXBsYWNlaG9sZGVyYF06IHtcbiAgICAgICAgICBpbnNldElubGluZVN0YXJ0OiAwXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy80NDc1NFxuICAgICAgLy8gU2FtZSBhcyBgd3JhcDphZnRlcmBcbiAgICAgIFtgJHtzZWxlY3RPdmVyZmxvd1ByZWZpeENsc30taXRlbS1zdWZmaXhgXToge1xuICAgICAgICBtaW5IZWlnaHQ6IG11bHRpcGxlU2VsZWN0b3JVbml0Lml0ZW1IZWlnaHQsXG4gICAgICAgIG1hcmdpbkJsb2NrOiBJTlRFUk5BTF9GSVhFRF9JVEVNX01BUkdJTlxuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LXNlbGVjdGlvbi1zZWFyY2hgXToge1xuICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWZsZXgnLFxuICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgbWF4V2lkdGg6ICcxMDAlJyxcbiAgICAgICAgbWFyZ2luSW5saW5lU3RhcnQ6IHRva2VuLmNhbGModG9rZW4uaW5wdXRQYWRkaW5nSG9yaXpvbnRhbEJhc2UpLnN1YihzZWxlY3RJdGVtRGlzdCkuZXF1YWwoKSxcbiAgICAgICAgW2BcbiAgICAgICAgICAmLWlucHV0LFxuICAgICAgICAgICYtbWlycm9yXG4gICAgICAgIGBdOiB7XG4gICAgICAgICAgaGVpZ2h0OiBzZWxlY3RJdGVtSGVpZ2h0LFxuICAgICAgICAgIGZvbnRGYW1pbHk6IHRva2VuLmZvbnRGYW1pbHksXG4gICAgICAgICAgbGluZUhlaWdodDogdW5pdChzZWxlY3RJdGVtSGVpZ2h0KSxcbiAgICAgICAgICB0cmFuc2l0aW9uOiBgYWxsICR7dG9rZW4ubW90aW9uRHVyYXRpb25TbG93fWBcbiAgICAgICAgfSxcbiAgICAgICAgJyYtaW5wdXQnOiB7XG4gICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICBtaW5XaWR0aDogNC4xIC8vIGZpeCBzZWFyY2ggY3Vyc29yIG1pc3NpbmdcbiAgICAgICAgfSxcbiAgICAgICAgJyYtbWlycm9yJzoge1xuICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgIHRvcDogMCxcbiAgICAgICAgICBpbnNldElubGluZVN0YXJ0OiAwLFxuICAgICAgICAgIGluc2V0SW5saW5lRW5kOiAnYXV0bycsXG4gICAgICAgICAgekluZGV4OiA5OTksXG4gICAgICAgICAgd2hpdGVTcGFjZTogJ3ByZScsXG4gICAgICAgICAgLy8gZml4IHdoaXRlc3BhY2Ugd3JhcHBpbmcgY2F1c2VkIHdpZHRoIGNhbGN1bGF0aW9uIGJ1Z1xuICAgICAgICAgIHZpc2liaWxpdHk6ICdoaWRkZW4nXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBQbGFjZWhvbGRlciA9PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgW2Ake2NvbXBvbmVudENsc30tc2VsZWN0aW9uLXBsYWNlaG9sZGVyYF06IHtcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgIHRvcDogJzUwJScsXG4gICAgICAgIGluc2V0SW5saW5lU3RhcnQ6IHRva2VuLmNhbGModG9rZW4uaW5wdXRQYWRkaW5nSG9yaXpvbnRhbEJhc2UpLnN1YihtdWx0aXBsZVNlbGVjdG9yVW5pdC5iYXNlUGFkZGluZykuZXF1YWwoKSxcbiAgICAgICAgaW5zZXRJbmxpbmVFbmQ6IHRva2VuLmlucHV0UGFkZGluZ0hvcml6b250YWxCYXNlLFxuICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKC01MCUpJyxcbiAgICAgICAgdHJhbnNpdGlvbjogYGFsbCAke3Rva2VuLm1vdGlvbkR1cmF0aW9uU2xvd31gXG4gICAgICB9XG4gICAgfSlcbiAgfTtcbn07XG5mdW5jdGlvbiBnZW5TaXplU3R5bGUodG9rZW4sIHN1ZmZpeCkge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzXG4gIH0gPSB0b2tlbjtcbiAgY29uc3Qgc3VmZml4Q2xzID0gc3VmZml4ID8gYCR7Y29tcG9uZW50Q2xzfS0ke3N1ZmZpeH1gIDogJyc7XG4gIGNvbnN0IHJhd1N0eWxlID0ge1xuICAgIFtgJHtjb21wb25lbnRDbHN9LW11bHRpcGxlJHtzdWZmaXhDbHN9YF06IHtcbiAgICAgIGZvbnRTaXplOiB0b2tlbi5mb250U2l6ZSxcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gU2VsZWN0b3IgPT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgW2Ake2NvbXBvbmVudENsc30tc2VsZWN0b3JgXToge1xuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1zaG93LXNlYXJjaCZgXToge1xuICAgICAgICAgIGN1cnNvcjogJ3RleHQnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbYFxuICAgICAgICAmJHtjb21wb25lbnRDbHN9LXNob3ctYXJyb3cgJHtjb21wb25lbnRDbHN9LXNlbGVjdG9yLFxuICAgICAgICAmJHtjb21wb25lbnRDbHN9LWFsbG93LWNsZWFyICR7Y29tcG9uZW50Q2xzfS1zZWxlY3RvclxuICAgICAgYF06IHtcbiAgICAgICAgcGFkZGluZ0lubGluZUVuZDogdG9rZW4uY2FsYyh0b2tlbi5mb250U2l6ZUljb24pLmFkZCh0b2tlbi5jb250cm9sUGFkZGluZ0hvcml6b250YWwpLmVxdWFsKClcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBbZ2VuU2VsZWN0aW9uU3R5bGUodG9rZW4sIHN1ZmZpeCksIHJhd1N0eWxlXTtcbn1cbmNvbnN0IGdlbk11bHRpcGxlU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHNcbiAgfSA9IHRva2VuO1xuICBjb25zdCBzbWFsbFRva2VuID0gbWVyZ2VUb2tlbih0b2tlbiwge1xuICAgIHNlbGVjdEhlaWdodDogdG9rZW4uY29udHJvbEhlaWdodFNNLFxuICAgIG11bHRpcGxlU2VsZWN0SXRlbUhlaWdodDogdG9rZW4ubXVsdGlwbGVJdGVtSGVpZ2h0U00sXG4gICAgYm9yZGVyUmFkaXVzOiB0b2tlbi5ib3JkZXJSYWRpdXNTTSxcbiAgICBib3JkZXJSYWRpdXNTTTogdG9rZW4uYm9yZGVyUmFkaXVzWFNcbiAgfSk7XG4gIGNvbnN0IGxhcmdlVG9rZW4gPSBtZXJnZVRva2VuKHRva2VuLCB7XG4gICAgZm9udFNpemU6IHRva2VuLmZvbnRTaXplTEcsXG4gICAgc2VsZWN0SGVpZ2h0OiB0b2tlbi5jb250cm9sSGVpZ2h0TEcsXG4gICAgbXVsdGlwbGVTZWxlY3RJdGVtSGVpZ2h0OiB0b2tlbi5tdWx0aXBsZUl0ZW1IZWlnaHRMRyxcbiAgICBib3JkZXJSYWRpdXM6IHRva2VuLmJvcmRlclJhZGl1c0xHLFxuICAgIGJvcmRlclJhZGl1c1NNOiB0b2tlbi5ib3JkZXJSYWRpdXNcbiAgfSk7XG4gIHJldHVybiBbZ2VuU2l6ZVN0eWxlKHRva2VuKSxcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IFNtYWxsID09PT09PT09PT09PT09PT09PT09PT09PVxuICBnZW5TaXplU3R5bGUoc21hbGxUb2tlbiwgJ3NtJyksXG4gIC8vIFBhZGRpbmdcbiAge1xuICAgIFtgJHtjb21wb25lbnRDbHN9LW11bHRpcGxlJHtjb21wb25lbnRDbHN9LXNtYF06IHtcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LXNlbGVjdGlvbi1wbGFjZWhvbGRlcmBdOiB7XG4gICAgICAgIGluc2V0SW5saW5lOiB0b2tlbi5jYWxjKHRva2VuLmNvbnRyb2xQYWRkaW5nSG9yaXpvbnRhbFNNKS5zdWIodG9rZW4ubGluZVdpZHRoKS5lcXVhbCgpXG4gICAgICB9LFxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMjk1NTlcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LXNlbGVjdGlvbi1zZWFyY2hgXToge1xuICAgICAgICBtYXJnaW5JbmxpbmVTdGFydDogMiAvLyBNYWdpYyBOdW1iZXJcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBMYXJnZSA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgZ2VuU2l6ZVN0eWxlKGxhcmdlVG9rZW4sICdsZycpXTtcbn07XG5leHBvcnQgZGVmYXVsdCBnZW5NdWx0aXBsZVN0eWxlOyIsICJpbXBvcnQgeyB1bml0IH0gZnJvbSAnQGFudC1kZXNpZ24vY3NzaW5qcyc7XG5pbXBvcnQgeyByZXNldENvbXBvbmVudCB9IGZyb20gJy4uLy4uL3N0eWxlJztcbmltcG9ydCB7IG1lcmdlVG9rZW4gfSBmcm9tICcuLi8uLi90aGVtZS9pbnRlcm5hbCc7XG5mdW5jdGlvbiBnZW5TaXplU3R5bGUodG9rZW4sIHN1ZmZpeCkge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzLFxuICAgIGlucHV0UGFkZGluZ0hvcml6b250YWxCYXNlLFxuICAgIGJvcmRlclJhZGl1c1xuICB9ID0gdG9rZW47XG4gIGNvbnN0IHNlbGVjdEhlaWdodFdpdGhvdXRCb3JkZXIgPSB0b2tlbi5jYWxjKHRva2VuLmNvbnRyb2xIZWlnaHQpLnN1Yih0b2tlbi5jYWxjKHRva2VuLmxpbmVXaWR0aCkubXVsKDIpKS5lcXVhbCgpO1xuICBjb25zdCBzdWZmaXhDbHMgPSBzdWZmaXggPyBgJHtjb21wb25lbnRDbHN9LSR7c3VmZml4fWAgOiAnJztcbiAgcmV0dXJuIHtcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS1zaW5nbGUke3N1ZmZpeENsc31gXToge1xuICAgICAgZm9udFNpemU6IHRva2VuLmZvbnRTaXplLFxuICAgICAgaGVpZ2h0OiB0b2tlbi5jb250cm9sSGVpZ2h0LFxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBTZWxlY3RvciA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1zZWxlY3RvcmBdOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlc2V0Q29tcG9uZW50KHRva2VuLCB0cnVlKSksIHtcbiAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICBib3JkZXJSYWRpdXMsXG4gICAgICAgIGZsZXg6ICcxIDEgYXV0bycsXG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LXNlbGVjdGlvbi13cmFwOmFmdGVyYF06IHtcbiAgICAgICAgICBsaW5lSGVpZ2h0OiB1bml0KHNlbGVjdEhlaWdodFdpdGhvdXRCb3JkZXIpXG4gICAgICAgIH0sXG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LXNlbGVjdGlvbi1zZWFyY2hgXToge1xuICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgIGluc2V0OiAwLFxuICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgJyYtaW5wdXQnOiB7XG4gICAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgICAgV2Via2l0QXBwZWFyYW5jZTogJ3RleHRmaWVsZCdcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtgXG4gICAgICAgICAgJHtjb21wb25lbnRDbHN9LXNlbGVjdGlvbi1pdGVtLFxuICAgICAgICAgICR7Y29tcG9uZW50Q2xzfS1zZWxlY3Rpb24tcGxhY2Vob2xkZXJcbiAgICAgICAgYF06IHtcbiAgICAgICAgICBkaXNwbGF5OiAnYmxvY2snLFxuICAgICAgICAgIHBhZGRpbmc6IDAsXG4gICAgICAgICAgbGluZUhlaWdodDogdW5pdChzZWxlY3RIZWlnaHRXaXRob3V0Qm9yZGVyKSxcbiAgICAgICAgICB0cmFuc2l0aW9uOiBgYWxsICR7dG9rZW4ubW90aW9uRHVyYXRpb25TbG93fSwgdmlzaWJpbGl0eSAwc2AsXG4gICAgICAgICAgYWxpZ25TZWxmOiAnY2VudGVyJ1xuICAgICAgICB9LFxuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1zZWxlY3Rpb24tcGxhY2Vob2xkZXJgXToge1xuICAgICAgICAgIHRyYW5zaXRpb246ICdub25lJyxcbiAgICAgICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZSdcbiAgICAgICAgfSxcbiAgICAgICAgLy8gRm9yIGNvbW1vbiBiYXNlbGluZSBhbGlnblxuICAgICAgICBbWycmOmFmdGVyJywgLyogRm9yICcnIHZhbHVlIGJhc2VsaW5lIGFsaWduICovXG4gICAgICAgIGAke2NvbXBvbmVudENsc30tc2VsZWN0aW9uLWl0ZW06ZW1wdHk6YWZ0ZXJgLCAvKiBGb3IgdW5kZWZpbmVkIHZhbHVlIGJhc2VsaW5lIGFsaWduICovXG4gICAgICAgIGAke2NvbXBvbmVudENsc30tc2VsZWN0aW9uLXBsYWNlaG9sZGVyOmVtcHR5OmFmdGVyYF0uam9pbignLCcpXToge1xuICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgICAgIHdpZHRoOiAwLFxuICAgICAgICAgIHZpc2liaWxpdHk6ICdoaWRkZW4nLFxuICAgICAgICAgIGNvbnRlbnQ6ICdcIlxcXFxhMFwiJ1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIFtgXG4gICAgICAgICYke2NvbXBvbmVudENsc30tc2hvdy1hcnJvdyAke2NvbXBvbmVudENsc30tc2VsZWN0aW9uLWl0ZW0sXG4gICAgICAgICYke2NvbXBvbmVudENsc30tc2hvdy1hcnJvdyAke2NvbXBvbmVudENsc30tc2VsZWN0aW9uLXNlYXJjaCxcbiAgICAgICAgJiR7Y29tcG9uZW50Q2xzfS1zaG93LWFycm93ICR7Y29tcG9uZW50Q2xzfS1zZWxlY3Rpb24tcGxhY2Vob2xkZXJcbiAgICAgIGBdOiB7XG4gICAgICAgIHBhZGRpbmdJbmxpbmVFbmQ6IHRva2VuLnNob3dBcnJvd1BhZGRpbmdJbmxpbmVFbmRcbiAgICAgIH0sXG4gICAgICAvLyBPcGFjaXR5IHNlbGVjdGlvbiBpZiBvcGVuXG4gICAgICBbYCYke2NvbXBvbmVudENsc30tb3BlbiAke2NvbXBvbmVudENsc30tc2VsZWN0aW9uLWl0ZW1gXToge1xuICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JUZXh0UGxhY2Vob2xkZXJcbiAgICAgIH0sXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBJbnB1dCA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgLy8gV2Ugb25seSBjaGFuZ2UgdGhlIHN0eWxlIG9mIG5vbi1jdXN0b21pemUgaW5wdXQgd2hpY2ggaXMgb25seSBzdXBwb3J0IGJ5IGBjb21ib2JveGAgbW9kZS5cbiAgICAgIC8vIE5vdCBjdXN0b21pemVcbiAgICAgIFtgJjpub3QoJHtjb21wb25lbnRDbHN9LWN1c3RvbWl6ZS1pbnB1dClgXToge1xuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1zZWxlY3RvcmBdOiB7XG4gICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICBwYWRkaW5nOiBgMCAke3VuaXQoaW5wdXRQYWRkaW5nSG9yaXpvbnRhbEJhc2UpfWAsXG4gICAgICAgICAgW2Ake2NvbXBvbmVudENsc30tc2VsZWN0aW9uLXNlYXJjaC1pbnB1dGBdOiB7XG4gICAgICAgICAgICBoZWlnaHQ6IHNlbGVjdEhlaWdodFdpdGhvdXRCb3JkZXIsXG4gICAgICAgICAgICBmb250U2l6ZTogdG9rZW4uZm9udFNpemVcbiAgICAgICAgICB9LFxuICAgICAgICAgICcmOmFmdGVyJzoge1xuICAgICAgICAgICAgbGluZUhlaWdodDogdW5pdChzZWxlY3RIZWlnaHRXaXRob3V0Qm9yZGVyKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtgJiR7Y29tcG9uZW50Q2xzfS1jdXN0b21pemUtaW5wdXRgXToge1xuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1zZWxlY3RvcmBdOiB7XG4gICAgICAgICAgJyY6YWZ0ZXInOiB7XG4gICAgICAgICAgICBkaXNwbGF5OiAnbm9uZSdcbiAgICAgICAgICB9LFxuICAgICAgICAgIFtgJHtjb21wb25lbnRDbHN9LXNlbGVjdGlvbi1zZWFyY2hgXToge1xuICAgICAgICAgICAgcG9zaXRpb246ICdzdGF0aWMnLFxuICAgICAgICAgICAgd2lkdGg6ICcxMDAlJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgW2Ake2NvbXBvbmVudENsc30tc2VsZWN0aW9uLXBsYWNlaG9sZGVyYF06IHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgaW5zZXRJbmxpbmVTdGFydDogMCxcbiAgICAgICAgICAgIGluc2V0SW5saW5lRW5kOiAwLFxuICAgICAgICAgICAgcGFkZGluZzogYDAgJHt1bml0KGlucHV0UGFkZGluZ0hvcml6b250YWxCYXNlKX1gLFxuICAgICAgICAgICAgJyY6YWZ0ZXInOiB7XG4gICAgICAgICAgICAgIGRpc3BsYXk6ICdub25lJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdlblNpbmdsZVN0eWxlKHRva2VuKSB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHNcbiAgfSA9IHRva2VuO1xuICBjb25zdCBpbnB1dFBhZGRpbmdIb3Jpem9udGFsU00gPSB0b2tlbi5jYWxjKHRva2VuLmNvbnRyb2xQYWRkaW5nSG9yaXpvbnRhbFNNKS5zdWIodG9rZW4ubGluZVdpZHRoKS5lcXVhbCgpO1xuICByZXR1cm4gW2dlblNpemVTdHlsZSh0b2tlbiksXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBTbWFsbCA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gU2hhcmVkXG4gIGdlblNpemVTdHlsZShtZXJnZVRva2VuKHRva2VuLCB7XG4gICAgY29udHJvbEhlaWdodDogdG9rZW4uY29udHJvbEhlaWdodFNNLFxuICAgIGJvcmRlclJhZGl1czogdG9rZW4uYm9yZGVyUmFkaXVzU01cbiAgfSksICdzbScpLFxuICAvLyBwYWRkaW5nXG4gIHtcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS1zaW5nbGUke2NvbXBvbmVudENsc30tc21gXToge1xuICAgICAgW2AmOm5vdCgke2NvbXBvbmVudENsc30tY3VzdG9taXplLWlucHV0KWBdOiB7XG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LXNlbGVjdG9yYF06IHtcbiAgICAgICAgICBwYWRkaW5nOiBgMCAke3VuaXQoaW5wdXRQYWRkaW5nSG9yaXpvbnRhbFNNKX1gXG4gICAgICAgIH0sXG4gICAgICAgIC8vIFdpdGggYXJyb3cgc2hvdWxkIHByb3ZpZGVzIGBwYWRkaW5nLXJpZ2h0YCB0byBzaG93IHRoZSBhcnJvd1xuICAgICAgICBbYCYke2NvbXBvbmVudENsc30tc2hvdy1hcnJvdyAke2NvbXBvbmVudENsc30tc2VsZWN0aW9uLXNlYXJjaGBdOiB7XG4gICAgICAgICAgaW5zZXRJbmxpbmVFbmQ6IHRva2VuLmNhbGMoaW5wdXRQYWRkaW5nSG9yaXpvbnRhbFNNKS5hZGQodG9rZW4uY2FsYyh0b2tlbi5mb250U2l6ZSkubXVsKDEuNSkpLmVxdWFsKClcbiAgICAgICAgfSxcbiAgICAgICAgW2BcbiAgICAgICAgICAgICYke2NvbXBvbmVudENsc30tc2hvdy1hcnJvdyAke2NvbXBvbmVudENsc30tc2VsZWN0aW9uLWl0ZW0sXG4gICAgICAgICAgICAmJHtjb21wb25lbnRDbHN9LXNob3ctYXJyb3cgJHtjb21wb25lbnRDbHN9LXNlbGVjdGlvbi1wbGFjZWhvbGRlclxuICAgICAgICAgIGBdOiB7XG4gICAgICAgICAgcGFkZGluZ0lubGluZUVuZDogdG9rZW4uY2FsYyh0b2tlbi5mb250U2l6ZSkubXVsKDEuNSkuZXF1YWwoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gTGFyZ2UgPT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFNoYXJlZFxuICBnZW5TaXplU3R5bGUobWVyZ2VUb2tlbih0b2tlbiwge1xuICAgIGNvbnRyb2xIZWlnaHQ6IHRva2VuLnNpbmdsZUl0ZW1IZWlnaHRMRyxcbiAgICBmb250U2l6ZTogdG9rZW4uZm9udFNpemVMRyxcbiAgICBib3JkZXJSYWRpdXM6IHRva2VuLmJvcmRlclJhZGl1c0xHXG4gIH0pLCAnbGcnKV07XG59IiwgImV4cG9ydCBjb25zdCBwcmVwYXJlQ29tcG9uZW50VG9rZW4gPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBmb250U2l6ZSxcbiAgICBsaW5lSGVpZ2h0LFxuICAgIGxpbmVXaWR0aCxcbiAgICBjb250cm9sSGVpZ2h0LFxuICAgIGNvbnRyb2xIZWlnaHRTTSxcbiAgICBjb250cm9sSGVpZ2h0TEcsXG4gICAgcGFkZGluZ1hYUyxcbiAgICBjb250cm9sUGFkZGluZ0hvcml6b250YWwsXG4gICAgekluZGV4UG9wdXBCYXNlLFxuICAgIGNvbG9yVGV4dCxcbiAgICBmb250V2VpZ2h0U3Ryb25nLFxuICAgIGNvbnRyb2xJdGVtQmdBY3RpdmUsXG4gICAgY29udHJvbEl0ZW1CZ0hvdmVyLFxuICAgIGNvbG9yQmdDb250YWluZXIsXG4gICAgY29sb3JGaWxsU2Vjb25kYXJ5LFxuICAgIGNvbG9yQmdDb250YWluZXJEaXNhYmxlZCxcbiAgICBjb2xvclRleHREaXNhYmxlZCxcbiAgICBjb2xvclByaW1hcnlIb3ZlcixcbiAgICBjb2xvclByaW1hcnksXG4gICAgY29udHJvbE91dGxpbmVcbiAgfSA9IHRva2VuO1xuICAvLyBJdGVtIGhlaWdodCBkZWZhdWx0IHVzZSBgY29udHJvbEhlaWdodCAtIDIgKiBwYWRkaW5nWFhTYCxcbiAgLy8gYnV0IHNvbWUgY2FzZSBgcGFkZGluZ1hYUz0wYC5cbiAgLy8gTGV0J3MgZmFsbGJhY2sgaXQuXG4gIGNvbnN0IGRibFBhZGRpbmdYWFMgPSBwYWRkaW5nWFhTICogMjtcbiAgY29uc3QgZGJsTGluZVdpZHRoID0gbGluZVdpZHRoICogMjtcbiAgY29uc3QgbXVsdGlwbGVJdGVtSGVpZ2h0ID0gTWF0aC5taW4oY29udHJvbEhlaWdodCAtIGRibFBhZGRpbmdYWFMsIGNvbnRyb2xIZWlnaHQgLSBkYmxMaW5lV2lkdGgpO1xuICBjb25zdCBtdWx0aXBsZUl0ZW1IZWlnaHRTTSA9IE1hdGgubWluKGNvbnRyb2xIZWlnaHRTTSAtIGRibFBhZGRpbmdYWFMsIGNvbnRyb2xIZWlnaHRTTSAtIGRibExpbmVXaWR0aCk7XG4gIGNvbnN0IG11bHRpcGxlSXRlbUhlaWdodExHID0gTWF0aC5taW4oY29udHJvbEhlaWdodExHIC0gZGJsUGFkZGluZ1hYUywgY29udHJvbEhlaWdodExHIC0gZGJsTGluZVdpZHRoKTtcbiAgLy8gRklYRURfSVRFTV9NQVJHSU4gaXMgYSBoYXJkY29kZSBjYWxjdWxhdGlvbiBzaW5jZSBjYWxjIG5vdCBzdXBwb3J0IHJvdW5kaW5nXG4gIGNvbnN0IElOVEVSTkFMX0ZJWEVEX0lURU1fTUFSR0lOID0gTWF0aC5mbG9vcihwYWRkaW5nWFhTIC8gMik7XG4gIHJldHVybiB7XG4gICAgSU5URVJOQUxfRklYRURfSVRFTV9NQVJHSU4sXG4gICAgekluZGV4UG9wdXA6IHpJbmRleFBvcHVwQmFzZSArIDUwLFxuICAgIG9wdGlvblNlbGVjdGVkQ29sb3I6IGNvbG9yVGV4dCxcbiAgICBvcHRpb25TZWxlY3RlZEZvbnRXZWlnaHQ6IGZvbnRXZWlnaHRTdHJvbmcsXG4gICAgb3B0aW9uU2VsZWN0ZWRCZzogY29udHJvbEl0ZW1CZ0FjdGl2ZSxcbiAgICBvcHRpb25BY3RpdmVCZzogY29udHJvbEl0ZW1CZ0hvdmVyLFxuICAgIG9wdGlvblBhZGRpbmc6IGAkeyhjb250cm9sSGVpZ2h0IC0gZm9udFNpemUgKiBsaW5lSGVpZ2h0KSAvIDJ9cHggJHtjb250cm9sUGFkZGluZ0hvcml6b250YWx9cHhgLFxuICAgIG9wdGlvbkZvbnRTaXplOiBmb250U2l6ZSxcbiAgICBvcHRpb25MaW5lSGVpZ2h0OiBsaW5lSGVpZ2h0LFxuICAgIG9wdGlvbkhlaWdodDogY29udHJvbEhlaWdodCxcbiAgICBzZWxlY3RvckJnOiBjb2xvckJnQ29udGFpbmVyLFxuICAgIGNsZWFyQmc6IGNvbG9yQmdDb250YWluZXIsXG4gICAgc2luZ2xlSXRlbUhlaWdodExHOiBjb250cm9sSGVpZ2h0TEcsXG4gICAgbXVsdGlwbGVJdGVtQmc6IGNvbG9yRmlsbFNlY29uZGFyeSxcbiAgICBtdWx0aXBsZUl0ZW1Cb3JkZXJDb2xvcjogJ3RyYW5zcGFyZW50JyxcbiAgICBtdWx0aXBsZUl0ZW1IZWlnaHQsXG4gICAgbXVsdGlwbGVJdGVtSGVpZ2h0U00sXG4gICAgbXVsdGlwbGVJdGVtSGVpZ2h0TEcsXG4gICAgbXVsdGlwbGVTZWxlY3RvckJnRGlzYWJsZWQ6IGNvbG9yQmdDb250YWluZXJEaXNhYmxlZCxcbiAgICBtdWx0aXBsZUl0ZW1Db2xvckRpc2FibGVkOiBjb2xvclRleHREaXNhYmxlZCxcbiAgICBtdWx0aXBsZUl0ZW1Cb3JkZXJDb2xvckRpc2FibGVkOiAndHJhbnNwYXJlbnQnLFxuICAgIHNob3dBcnJvd1BhZGRpbmdJbmxpbmVFbmQ6IE1hdGguY2VpbCh0b2tlbi5mb250U2l6ZSAqIDEuMjUpLFxuICAgIGhvdmVyQm9yZGVyQ29sb3I6IGNvbG9yUHJpbWFyeUhvdmVyLFxuICAgIGFjdGl2ZUJvcmRlckNvbG9yOiBjb2xvclByaW1hcnksXG4gICAgYWN0aXZlT3V0bGluZUNvbG9yOiBjb250cm9sT3V0bGluZSxcbiAgICBzZWxlY3RBZmZpeFBhZGRpbmc6IHBhZGRpbmdYWFNcbiAgfTtcbn07IiwgImltcG9ydCB7IHVuaXQgfSBmcm9tICdAYW50LWRlc2lnbi9jc3NpbmpzJztcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyA9PSAgICAgICAgICAgICAgICAgIE91dGxpbmVkICAgICAgICAgICAgICAgICAgICAgICA9PVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmNvbnN0IGdlbkJhc2VPdXRsaW5lZFN0eWxlID0gKHRva2VuLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHMsXG4gICAgYW50Q2xzLFxuICAgIGNvbnRyb2xPdXRsaW5lV2lkdGhcbiAgfSA9IHRva2VuO1xuICByZXR1cm4ge1xuICAgIFtgJjpub3QoJHtjb21wb25lbnRDbHN9LWN1c3RvbWl6ZS1pbnB1dCkgJHtjb21wb25lbnRDbHN9LXNlbGVjdG9yYF06IHtcbiAgICAgIGJvcmRlcjogYCR7dW5pdCh0b2tlbi5saW5lV2lkdGgpfSAke3Rva2VuLmxpbmVUeXBlfSAke29wdGlvbnMuYm9yZGVyQ29sb3J9YCxcbiAgICAgIGJhY2tncm91bmQ6IHRva2VuLnNlbGVjdG9yQmdcbiAgICB9LFxuICAgIFtgJjpub3QoJHtjb21wb25lbnRDbHN9LWRpc2FibGVkKTpub3QoJHtjb21wb25lbnRDbHN9LWN1c3RvbWl6ZS1pbnB1dCk6bm90KCR7YW50Q2xzfS1wYWdpbmF0aW9uLXNpemUtY2hhbmdlcilgXToge1xuICAgICAgW2AmOmhvdmVyICR7Y29tcG9uZW50Q2xzfS1zZWxlY3RvcmBdOiB7XG4gICAgICAgIGJvcmRlckNvbG9yOiBvcHRpb25zLmhvdmVyQm9yZGVySG92ZXJcbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1mb2N1c2VkJiAke2NvbXBvbmVudENsc30tc2VsZWN0b3JgXToge1xuICAgICAgICBib3JkZXJDb2xvcjogb3B0aW9ucy5hY3RpdmVCb3JkZXJDb2xvcixcbiAgICAgICAgYm94U2hhZG93OiBgMCAwIDAgJHt1bml0KGNvbnRyb2xPdXRsaW5lV2lkdGgpfSAke29wdGlvbnMuYWN0aXZlT3V0bGluZUNvbG9yfWAsXG4gICAgICAgIG91dGxpbmU6IDBcbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1wcmVmaXhgXToge1xuICAgICAgICBjb2xvcjogb3B0aW9ucy5jb2xvclxuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG5jb25zdCBnZW5PdXRsaW5lZFN0YXR1c1N0eWxlID0gKHRva2VuLCBvcHRpb25zKSA9PiAoe1xuICBbYCYke3Rva2VuLmNvbXBvbmVudENsc30tc3RhdHVzLSR7b3B0aW9ucy5zdGF0dXN9YF06IE9iamVjdC5hc3NpZ24oe30sIGdlbkJhc2VPdXRsaW5lZFN0eWxlKHRva2VuLCBvcHRpb25zKSlcbn0pO1xuY29uc3QgZ2VuT3V0bGluZWRTdHlsZSA9IHRva2VuID0+ICh7XG4gICcmLW91dGxpbmVkJzogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZ2VuQmFzZU91dGxpbmVkU3R5bGUodG9rZW4sIHtcbiAgICBib3JkZXJDb2xvcjogdG9rZW4uY29sb3JCb3JkZXIsXG4gICAgaG92ZXJCb3JkZXJIb3ZlcjogdG9rZW4uaG92ZXJCb3JkZXJDb2xvcixcbiAgICBhY3RpdmVCb3JkZXJDb2xvcjogdG9rZW4uYWN0aXZlQm9yZGVyQ29sb3IsXG4gICAgYWN0aXZlT3V0bGluZUNvbG9yOiB0b2tlbi5hY3RpdmVPdXRsaW5lQ29sb3IsXG4gICAgY29sb3I6IHRva2VuLmNvbG9yVGV4dFxuICB9KSksIGdlbk91dGxpbmVkU3RhdHVzU3R5bGUodG9rZW4sIHtcbiAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgYm9yZGVyQ29sb3I6IHRva2VuLmNvbG9yRXJyb3IsXG4gICAgaG92ZXJCb3JkZXJIb3ZlcjogdG9rZW4uY29sb3JFcnJvckhvdmVyLFxuICAgIGFjdGl2ZUJvcmRlckNvbG9yOiB0b2tlbi5jb2xvckVycm9yLFxuICAgIGFjdGl2ZU91dGxpbmVDb2xvcjogdG9rZW4uY29sb3JFcnJvck91dGxpbmUsXG4gICAgY29sb3I6IHRva2VuLmNvbG9yRXJyb3JcbiAgfSkpLCBnZW5PdXRsaW5lZFN0YXR1c1N0eWxlKHRva2VuLCB7XG4gICAgc3RhdHVzOiAnd2FybmluZycsXG4gICAgYm9yZGVyQ29sb3I6IHRva2VuLmNvbG9yV2FybmluZyxcbiAgICBob3ZlckJvcmRlckhvdmVyOiB0b2tlbi5jb2xvcldhcm5pbmdIb3ZlcixcbiAgICBhY3RpdmVCb3JkZXJDb2xvcjogdG9rZW4uY29sb3JXYXJuaW5nLFxuICAgIGFjdGl2ZU91dGxpbmVDb2xvcjogdG9rZW4uY29sb3JXYXJuaW5nT3V0bGluZSxcbiAgICBjb2xvcjogdG9rZW4uY29sb3JXYXJuaW5nXG4gIH0pKSwge1xuICAgIFtgJiR7dG9rZW4uY29tcG9uZW50Q2xzfS1kaXNhYmxlZGBdOiB7XG4gICAgICBbYCY6bm90KCR7dG9rZW4uY29tcG9uZW50Q2xzfS1jdXN0b21pemUtaW5wdXQpICR7dG9rZW4uY29tcG9uZW50Q2xzfS1zZWxlY3RvcmBdOiB7XG4gICAgICAgIGJhY2tncm91bmQ6IHRva2VuLmNvbG9yQmdDb250YWluZXJEaXNhYmxlZCxcbiAgICAgICAgY29sb3I6IHRva2VuLmNvbG9yVGV4dERpc2FibGVkXG4gICAgICB9XG4gICAgfSxcbiAgICBbYCYke3Rva2VuLmNvbXBvbmVudENsc30tbXVsdGlwbGUgJHt0b2tlbi5jb21wb25lbnRDbHN9LXNlbGVjdGlvbi1pdGVtYF06IHtcbiAgICAgIGJhY2tncm91bmQ6IHRva2VuLm11bHRpcGxlSXRlbUJnLFxuICAgICAgYm9yZGVyOiBgJHt1bml0KHRva2VuLmxpbmVXaWR0aCl9ICR7dG9rZW4ubGluZVR5cGV9ICR7dG9rZW4ubXVsdGlwbGVJdGVtQm9yZGVyQ29sb3J9YFxuICAgIH1cbiAgfSlcbn0pO1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vID09ICAgICAgICAgICAgICAgICAgIEZpbGxlZCAgICAgICAgICAgICAgICAgICAgICAgID09XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuY29uc3QgZ2VuQmFzZUZpbGxlZFN0eWxlID0gKHRva2VuLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHMsXG4gICAgYW50Q2xzXG4gIH0gPSB0b2tlbjtcbiAgcmV0dXJuIHtcbiAgICBbYCY6bm90KCR7Y29tcG9uZW50Q2xzfS1jdXN0b21pemUtaW5wdXQpICR7Y29tcG9uZW50Q2xzfS1zZWxlY3RvcmBdOiB7XG4gICAgICBiYWNrZ3JvdW5kOiBvcHRpb25zLmJnLFxuICAgICAgYm9yZGVyOiBgJHt1bml0KHRva2VuLmxpbmVXaWR0aCl9ICR7dG9rZW4ubGluZVR5cGV9IHRyYW5zcGFyZW50YCxcbiAgICAgIGNvbG9yOiBvcHRpb25zLmNvbG9yXG4gICAgfSxcbiAgICBbYCY6bm90KCR7Y29tcG9uZW50Q2xzfS1kaXNhYmxlZCk6bm90KCR7Y29tcG9uZW50Q2xzfS1jdXN0b21pemUtaW5wdXQpOm5vdCgke2FudENsc30tcGFnaW5hdGlvbi1zaXplLWNoYW5nZXIpYF06IHtcbiAgICAgIFtgJjpob3ZlciAke2NvbXBvbmVudENsc30tc2VsZWN0b3JgXToge1xuICAgICAgICBiYWNrZ3JvdW5kOiBvcHRpb25zLmhvdmVyQmdcbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1mb2N1c2VkJiAke2NvbXBvbmVudENsc30tc2VsZWN0b3JgXToge1xuICAgICAgICBiYWNrZ3JvdW5kOiB0b2tlbi5zZWxlY3RvckJnLFxuICAgICAgICBib3JkZXJDb2xvcjogb3B0aW9ucy5hY3RpdmVCb3JkZXJDb2xvcixcbiAgICAgICAgb3V0bGluZTogMFxuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG5jb25zdCBnZW5GaWxsZWRTdGF0dXNTdHlsZSA9ICh0b2tlbiwgb3B0aW9ucykgPT4gKHtcbiAgW2AmJHt0b2tlbi5jb21wb25lbnRDbHN9LXN0YXR1cy0ke29wdGlvbnMuc3RhdHVzfWBdOiBPYmplY3QuYXNzaWduKHt9LCBnZW5CYXNlRmlsbGVkU3R5bGUodG9rZW4sIG9wdGlvbnMpKVxufSk7XG5jb25zdCBnZW5GaWxsZWRTdHlsZSA9IHRva2VuID0+ICh7XG4gICcmLWZpbGxlZCc6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGdlbkJhc2VGaWxsZWRTdHlsZSh0b2tlbiwge1xuICAgIGJnOiB0b2tlbi5jb2xvckZpbGxUZXJ0aWFyeSxcbiAgICBob3ZlckJnOiB0b2tlbi5jb2xvckZpbGxTZWNvbmRhcnksXG4gICAgYWN0aXZlQm9yZGVyQ29sb3I6IHRva2VuLmFjdGl2ZUJvcmRlckNvbG9yLFxuICAgIGNvbG9yOiB0b2tlbi5jb2xvclRleHRcbiAgfSkpLCBnZW5GaWxsZWRTdGF0dXNTdHlsZSh0b2tlbiwge1xuICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICBiZzogdG9rZW4uY29sb3JFcnJvckJnLFxuICAgIGhvdmVyQmc6IHRva2VuLmNvbG9yRXJyb3JCZ0hvdmVyLFxuICAgIGFjdGl2ZUJvcmRlckNvbG9yOiB0b2tlbi5jb2xvckVycm9yLFxuICAgIGNvbG9yOiB0b2tlbi5jb2xvckVycm9yXG4gIH0pKSwgZ2VuRmlsbGVkU3RhdHVzU3R5bGUodG9rZW4sIHtcbiAgICBzdGF0dXM6ICd3YXJuaW5nJyxcbiAgICBiZzogdG9rZW4uY29sb3JXYXJuaW5nQmcsXG4gICAgaG92ZXJCZzogdG9rZW4uY29sb3JXYXJuaW5nQmdIb3ZlcixcbiAgICBhY3RpdmVCb3JkZXJDb2xvcjogdG9rZW4uY29sb3JXYXJuaW5nLFxuICAgIGNvbG9yOiB0b2tlbi5jb2xvcldhcm5pbmdcbiAgfSkpLCB7XG4gICAgW2AmJHt0b2tlbi5jb21wb25lbnRDbHN9LWRpc2FibGVkYF06IHtcbiAgICAgIFtgJjpub3QoJHt0b2tlbi5jb21wb25lbnRDbHN9LWN1c3RvbWl6ZS1pbnB1dCkgJHt0b2tlbi5jb21wb25lbnRDbHN9LXNlbGVjdG9yYF06IHtcbiAgICAgICAgYm9yZGVyQ29sb3I6IHRva2VuLmNvbG9yQm9yZGVyLFxuICAgICAgICBiYWNrZ3JvdW5kOiB0b2tlbi5jb2xvckJnQ29udGFpbmVyRGlzYWJsZWQsXG4gICAgICAgIGNvbG9yOiB0b2tlbi5jb2xvclRleHREaXNhYmxlZFxuICAgICAgfVxuICAgIH0sXG4gICAgW2AmJHt0b2tlbi5jb21wb25lbnRDbHN9LW11bHRpcGxlICR7dG9rZW4uY29tcG9uZW50Q2xzfS1zZWxlY3Rpb24taXRlbWBdOiB7XG4gICAgICBiYWNrZ3JvdW5kOiB0b2tlbi5jb2xvckJnQ29udGFpbmVyLFxuICAgICAgYm9yZGVyOiBgJHt1bml0KHRva2VuLmxpbmVXaWR0aCl9ICR7dG9rZW4ubGluZVR5cGV9ICR7dG9rZW4uY29sb3JTcGxpdH1gXG4gICAgfVxuICB9KVxufSk7XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gPT0gICAgICAgICAgICAgICAgIEJvcmRlcmxlc3MgICAgICAgICAgICAgICAgICAgICAgPT1cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5jb25zdCBnZW5Cb3JkZXJsZXNzU3R5bGUgPSB0b2tlbiA9PiAoe1xuICAnJi1ib3JkZXJsZXNzJzoge1xuICAgIFtgJHt0b2tlbi5jb21wb25lbnRDbHN9LXNlbGVjdG9yYF06IHtcbiAgICAgIGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCcsXG4gICAgICBib3JkZXI6IGAke3VuaXQodG9rZW4ubGluZVdpZHRoKX0gJHt0b2tlbi5saW5lVHlwZX0gdHJhbnNwYXJlbnRgXG4gICAgfSxcbiAgICBbYCYke3Rva2VuLmNvbXBvbmVudENsc30tZGlzYWJsZWRgXToge1xuICAgICAgW2AmOm5vdCgke3Rva2VuLmNvbXBvbmVudENsc30tY3VzdG9taXplLWlucHV0KSAke3Rva2VuLmNvbXBvbmVudENsc30tc2VsZWN0b3JgXToge1xuICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JUZXh0RGlzYWJsZWRcbiAgICAgIH1cbiAgICB9LFxuICAgIFtgJiR7dG9rZW4uY29tcG9uZW50Q2xzfS1tdWx0aXBsZSAke3Rva2VuLmNvbXBvbmVudENsc30tc2VsZWN0aW9uLWl0ZW1gXToge1xuICAgICAgYmFja2dyb3VuZDogdG9rZW4ubXVsdGlwbGVJdGVtQmcsXG4gICAgICBib3JkZXI6IGAke3VuaXQodG9rZW4ubGluZVdpZHRoKX0gJHt0b2tlbi5saW5lVHlwZX0gJHt0b2tlbi5tdWx0aXBsZUl0ZW1Cb3JkZXJDb2xvcn1gXG4gICAgfSxcbiAgICAvLyBTdGF0dXNcbiAgICBbYCYke3Rva2VuLmNvbXBvbmVudENsc30tc3RhdHVzLWVycm9yYF06IHtcbiAgICAgIFtgJHt0b2tlbi5jb21wb25lbnRDbHN9LXByZWZpeCwgJHt0b2tlbi5jb21wb25lbnRDbHN9LXNlbGVjdGlvbi1pdGVtYF06IHtcbiAgICAgICAgY29sb3I6IHRva2VuLmNvbG9yRXJyb3JcbiAgICAgIH1cbiAgICB9LFxuICAgIFtgJiR7dG9rZW4uY29tcG9uZW50Q2xzfS1zdGF0dXMtd2FybmluZ2BdOiB7XG4gICAgICBbYCR7dG9rZW4uY29tcG9uZW50Q2xzfS1wcmVmaXgsICR7dG9rZW4uY29tcG9uZW50Q2xzfS1zZWxlY3Rpb24taXRlbWBdOiB7XG4gICAgICAgIGNvbG9yOiB0b2tlbi5jb2xvcldhcm5pbmdcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pO1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vID09ICAgICAgICAgICAgICAgICBVbmRlcmxpbmVkICAgICAgICAgICAgICAgICAgICAgID09XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuY29uc3QgZ2VuQmFzZVVuZGVybGluZWRTdHlsZSA9ICh0b2tlbiwgb3B0aW9ucykgPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzLFxuICAgIGFudENsc1xuICB9ID0gdG9rZW47XG4gIHJldHVybiB7XG4gICAgW2AmOm5vdCgke2NvbXBvbmVudENsc30tY3VzdG9taXplLWlucHV0KSAke2NvbXBvbmVudENsc30tc2VsZWN0b3JgXToge1xuICAgICAgYm9yZGVyV2lkdGg6IGAwIDAgJHt1bml0KHRva2VuLmxpbmVXaWR0aCl9IDBgLFxuICAgICAgYm9yZGVyU3R5bGU6IGBub25lIG5vbmUgJHt0b2tlbi5saW5lVHlwZX0gbm9uZWAsXG4gICAgICBib3JkZXJDb2xvcjogb3B0aW9ucy5ib3JkZXJDb2xvcixcbiAgICAgIGJhY2tncm91bmQ6IHRva2VuLnNlbGVjdG9yQmcsXG4gICAgICBib3JkZXJSYWRpdXM6IDBcbiAgICB9LFxuICAgIFtgJjpub3QoJHtjb21wb25lbnRDbHN9LWRpc2FibGVkKTpub3QoJHtjb21wb25lbnRDbHN9LWN1c3RvbWl6ZS1pbnB1dCk6bm90KCR7YW50Q2xzfS1wYWdpbmF0aW9uLXNpemUtY2hhbmdlcilgXToge1xuICAgICAgW2AmOmhvdmVyICR7Y29tcG9uZW50Q2xzfS1zZWxlY3RvcmBdOiB7XG4gICAgICAgIGJvcmRlckNvbG9yOiBvcHRpb25zLmhvdmVyQm9yZGVySG92ZXJcbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1mb2N1c2VkJiAke2NvbXBvbmVudENsc30tc2VsZWN0b3JgXToge1xuICAgICAgICBib3JkZXJDb2xvcjogb3B0aW9ucy5hY3RpdmVCb3JkZXJDb2xvcixcbiAgICAgICAgb3V0bGluZTogMFxuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LXByZWZpeGBdOiB7XG4gICAgICAgIGNvbG9yOiBvcHRpb25zLmNvbG9yXG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbmNvbnN0IGdlblVuZGVybGluZWRTdGF0dXNTdHlsZSA9ICh0b2tlbiwgb3B0aW9ucykgPT4gKHtcbiAgW2AmJHt0b2tlbi5jb21wb25lbnRDbHN9LXN0YXR1cy0ke29wdGlvbnMuc3RhdHVzfWBdOiBPYmplY3QuYXNzaWduKHt9LCBnZW5CYXNlVW5kZXJsaW5lZFN0eWxlKHRva2VuLCBvcHRpb25zKSlcbn0pO1xuY29uc3QgZ2VuVW5kZXJsaW5lZFN0eWxlID0gdG9rZW4gPT4gKHtcbiAgJyYtdW5kZXJsaW5lZCc6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGdlbkJhc2VVbmRlcmxpbmVkU3R5bGUodG9rZW4sIHtcbiAgICBib3JkZXJDb2xvcjogdG9rZW4uY29sb3JCb3JkZXIsXG4gICAgaG92ZXJCb3JkZXJIb3ZlcjogdG9rZW4uaG92ZXJCb3JkZXJDb2xvcixcbiAgICBhY3RpdmVCb3JkZXJDb2xvcjogdG9rZW4uYWN0aXZlQm9yZGVyQ29sb3IsXG4gICAgYWN0aXZlT3V0bGluZUNvbG9yOiB0b2tlbi5hY3RpdmVPdXRsaW5lQ29sb3IsXG4gICAgY29sb3I6IHRva2VuLmNvbG9yVGV4dFxuICB9KSksIGdlblVuZGVybGluZWRTdGF0dXNTdHlsZSh0b2tlbiwge1xuICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICBib3JkZXJDb2xvcjogdG9rZW4uY29sb3JFcnJvcixcbiAgICBob3ZlckJvcmRlckhvdmVyOiB0b2tlbi5jb2xvckVycm9ySG92ZXIsXG4gICAgYWN0aXZlQm9yZGVyQ29sb3I6IHRva2VuLmNvbG9yRXJyb3IsXG4gICAgYWN0aXZlT3V0bGluZUNvbG9yOiB0b2tlbi5jb2xvckVycm9yT3V0bGluZSxcbiAgICBjb2xvcjogdG9rZW4uY29sb3JFcnJvclxuICB9KSksIGdlblVuZGVybGluZWRTdGF0dXNTdHlsZSh0b2tlbiwge1xuICAgIHN0YXR1czogJ3dhcm5pbmcnLFxuICAgIGJvcmRlckNvbG9yOiB0b2tlbi5jb2xvcldhcm5pbmcsXG4gICAgaG92ZXJCb3JkZXJIb3ZlcjogdG9rZW4uY29sb3JXYXJuaW5nSG92ZXIsXG4gICAgYWN0aXZlQm9yZGVyQ29sb3I6IHRva2VuLmNvbG9yV2FybmluZyxcbiAgICBhY3RpdmVPdXRsaW5lQ29sb3I6IHRva2VuLmNvbG9yV2FybmluZ091dGxpbmUsXG4gICAgY29sb3I6IHRva2VuLmNvbG9yV2FybmluZ1xuICB9KSksIHtcbiAgICBbYCYke3Rva2VuLmNvbXBvbmVudENsc30tZGlzYWJsZWRgXToge1xuICAgICAgW2AmOm5vdCgke3Rva2VuLmNvbXBvbmVudENsc30tY3VzdG9taXplLWlucHV0KSAke3Rva2VuLmNvbXBvbmVudENsc30tc2VsZWN0b3JgXToge1xuICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JUZXh0RGlzYWJsZWRcbiAgICAgIH1cbiAgICB9LFxuICAgIFtgJiR7dG9rZW4uY29tcG9uZW50Q2xzfS1tdWx0aXBsZSAke3Rva2VuLmNvbXBvbmVudENsc30tc2VsZWN0aW9uLWl0ZW1gXToge1xuICAgICAgYmFja2dyb3VuZDogdG9rZW4ubXVsdGlwbGVJdGVtQmcsXG4gICAgICBib3JkZXI6IGAke3VuaXQodG9rZW4ubGluZVdpZHRoKX0gJHt0b2tlbi5saW5lVHlwZX0gJHt0b2tlbi5tdWx0aXBsZUl0ZW1Cb3JkZXJDb2xvcn1gXG4gICAgfVxuICB9KVxufSk7XG5jb25zdCBnZW5WYXJpYW50c1N0eWxlID0gdG9rZW4gPT4gKHtcbiAgW3Rva2VuLmNvbXBvbmVudENsc106IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGdlbk91dGxpbmVkU3R5bGUodG9rZW4pKSwgZ2VuRmlsbGVkU3R5bGUodG9rZW4pKSwgZ2VuQm9yZGVybGVzc1N0eWxlKHRva2VuKSksIGdlblVuZGVybGluZWRTdHlsZSh0b2tlbikpXG59KTtcbmV4cG9ydCBkZWZhdWx0IGdlblZhcmlhbnRzU3R5bGU7IiwgImltcG9ydCB7IHJlc2V0Q29tcG9uZW50LCByZXNldEljb24sIHRleHRFbGxpcHNpcyB9IGZyb20gJy4uLy4uL3N0eWxlJztcbmltcG9ydCB7IGdlbkNvbXBhY3RJdGVtU3R5bGUgfSBmcm9tICcuLi8uLi9zdHlsZS9jb21wYWN0LWl0ZW0nO1xuaW1wb3J0IHsgZ2VuU3R5bGVIb29rcywgbWVyZ2VUb2tlbiB9IGZyb20gJy4uLy4uL3RoZW1lL2ludGVybmFsJztcbmltcG9ydCBnZW5Ecm9wZG93blN0eWxlIGZyb20gJy4vZHJvcGRvd24nO1xuaW1wb3J0IGdlbk11bHRpcGxlU3R5bGUgZnJvbSAnLi9tdWx0aXBsZSc7XG5pbXBvcnQgZ2VuU2luZ2xlU3R5bGUgZnJvbSAnLi9zaW5nbGUnO1xuaW1wb3J0IHsgcHJlcGFyZUNvbXBvbmVudFRva2VuIH0gZnJvbSAnLi90b2tlbic7XG5pbXBvcnQgZ2VuVmFyaWFudHNTdHlsZSBmcm9tICcuL3ZhcmlhbnRzJztcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNlbGVjdG9yID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5jb25zdCBnZW5TZWxlY3RvclN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzXG4gIH0gPSB0b2tlbjtcbiAgcmV0dXJuIHtcbiAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICB0cmFuc2l0aW9uOiBgYWxsICR7dG9rZW4ubW90aW9uRHVyYXRpb25NaWR9ICR7dG9rZW4ubW90aW9uRWFzZUluT3V0fWAsXG4gICAgaW5wdXQ6IHtcbiAgICAgIGN1cnNvcjogJ3BvaW50ZXInXG4gICAgfSxcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS1zaG93LXNlYXJjaCZgXToge1xuICAgICAgY3Vyc29yOiAndGV4dCcsXG4gICAgICBpbnB1dDoge1xuICAgICAgICBjdXJzb3I6ICdhdXRvJyxcbiAgICAgICAgY29sb3I6ICdpbmhlcml0JyxcbiAgICAgICAgaGVpZ2h0OiAnMTAwJSdcbiAgICAgIH1cbiAgICB9LFxuICAgIFtgJHtjb21wb25lbnRDbHN9LWRpc2FibGVkJmBdOiB7XG4gICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCcsXG4gICAgICBpbnB1dDoge1xuICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCdcbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFN0eWxlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIC8qIFJlc2V0IHNlYXJjaCBpbnB1dCBzdHlsZSAqL1xuY29uc3QgZ2V0U2VhcmNoSW5wdXRXaXRob3V0Qm9yZGVyU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHNcbiAgfSA9IHRva2VuO1xuICByZXR1cm4ge1xuICAgIFtgJHtjb21wb25lbnRDbHN9LXNlbGVjdGlvbi1zZWFyY2gtaW5wdXRgXToge1xuICAgICAgbWFyZ2luOiAwLFxuICAgICAgcGFkZGluZzogMCxcbiAgICAgIGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCcsXG4gICAgICBib3JkZXI6ICdub25lJyxcbiAgICAgIG91dGxpbmU6ICdub25lJyxcbiAgICAgIGFwcGVhcmFuY2U6ICdub25lJyxcbiAgICAgIGZvbnRGYW1pbHk6ICdpbmhlcml0JyxcbiAgICAgICcmOjotd2Via2l0LXNlYXJjaC1jYW5jZWwtYnV0dG9uJzoge1xuICAgICAgICBkaXNwbGF5OiAnbm9uZScsXG4gICAgICAgIGFwcGVhcmFuY2U6ICdub25lJ1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEJhc2UgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuY29uc3QgZ2VuQmFzZVN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgYW50Q2xzLFxuICAgIGNvbXBvbmVudENscyxcbiAgICBpbnB1dFBhZGRpbmdIb3Jpem9udGFsQmFzZSxcbiAgICBpY29uQ2xzXG4gIH0gPSB0b2tlbjtcbiAgcmV0dXJuIHtcbiAgICBbY29tcG9uZW50Q2xzXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXNldENvbXBvbmVudCh0b2tlbikpLCB7XG4gICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgIGRpc3BsYXk6ICdpbmxpbmUtZmxleCcsXG4gICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgIFtgJjpub3QoJHtjb21wb25lbnRDbHN9LWN1c3RvbWl6ZS1pbnB1dCkgJHtjb21wb25lbnRDbHN9LXNlbGVjdG9yYF06IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZ2VuU2VsZWN0b3JTdHlsZSh0b2tlbikpLCBnZXRTZWFyY2hJbnB1dFdpdGhvdXRCb3JkZXJTdHlsZSh0b2tlbikpLFxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IFNlbGVjdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LXNlbGVjdGlvbi1pdGVtYF06IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIGZsZXg6IDEsXG4gICAgICAgIGZvbnRXZWlnaHQ6ICdub3JtYWwnLFxuICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgdXNlclNlbGVjdDogJ25vbmUnXG4gICAgICB9LCB0ZXh0RWxsaXBzaXMpLCB7XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzQwNDIxXG4gICAgICAgIFtgPiAke2FudENsc30tdHlwb2dyYXBoeWBdOiB7XG4gICAgICAgICAgZGlzcGxheTogJ2lubGluZSdcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBQbGFjZWhvbGRlciA9PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgW2Ake2NvbXBvbmVudENsc30tc2VsZWN0aW9uLXBsYWNlaG9sZGVyYF06IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGV4dEVsbGlwc2lzKSwge1xuICAgICAgICBmbGV4OiAxLFxuICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JUZXh0UGxhY2Vob2xkZXIsXG4gICAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJ1xuICAgICAgfSksXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBBcnJvdyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgW2Ake2NvbXBvbmVudENsc30tYXJyb3dgXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXNldEljb24oKSksIHtcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgIHRvcDogJzUwJScsXG4gICAgICAgIGluc2V0SW5saW5lU3RhcnQ6ICdhdXRvJyxcbiAgICAgICAgaW5zZXRJbmxpbmVFbmQ6IGlucHV0UGFkZGluZ0hvcml6b250YWxCYXNlLFxuICAgICAgICBoZWlnaHQ6IHRva2VuLmZvbnRTaXplSWNvbixcbiAgICAgICAgbWFyZ2luVG9wOiB0b2tlbi5jYWxjKHRva2VuLmZvbnRTaXplSWNvbikubXVsKC0xKS5kaXYoMikuZXF1YWwoKSxcbiAgICAgICAgY29sb3I6IHRva2VuLmNvbG9yVGV4dFF1YXRlcm5hcnksXG4gICAgICAgIGZvbnRTaXplOiB0b2tlbi5mb250U2l6ZUljb24sXG4gICAgICAgIGxpbmVIZWlnaHQ6IDEsXG4gICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgdHJhbnNpdGlvbjogYG9wYWNpdHkgJHt0b2tlbi5tb3Rpb25EdXJhdGlvblNsb3d9IGVhc2VgLFxuICAgICAgICBbaWNvbkNsc106IHtcbiAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiAndG9wJyxcbiAgICAgICAgICB0cmFuc2l0aW9uOiBgdHJhbnNmb3JtICR7dG9rZW4ubW90aW9uRHVyYXRpb25TbG93fWAsXG4gICAgICAgICAgJz4gc3ZnJzoge1xuICAgICAgICAgICAgdmVydGljYWxBbGlnbjogJ3RvcCdcbiAgICAgICAgICB9LFxuICAgICAgICAgIFtgJjpub3QoJHtjb21wb25lbnRDbHN9LXN1ZmZpeClgXToge1xuICAgICAgICAgICAgcG9pbnRlckV2ZW50czogJ2F1dG8nXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1kaXNhYmxlZCAmYF06IHtcbiAgICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCdcbiAgICAgICAgfSxcbiAgICAgICAgJz4gKjpub3QoOmxhc3QtY2hpbGQpJzoge1xuICAgICAgICAgIG1hcmdpbklubGluZUVuZDogOCAvLyBGSVhNRTogbWFnaWNcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBXcmFwID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgW2Ake2NvbXBvbmVudENsc30tc2VsZWN0aW9uLXdyYXBgXToge1xuICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgICBtaW5XaWR0aDogMCxcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvNTE2NjlcbiAgICAgICAgJyY6YWZ0ZXInOiB7XG4gICAgICAgICAgY29udGVudDogJ1wiXFxcXGEwXCInLFxuICAgICAgICAgIHdpZHRoOiAwLFxuICAgICAgICAgIG92ZXJmbG93OiAnaGlkZGVuJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBQcmVmaXggPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LXByZWZpeGBdOiB7XG4gICAgICAgIGZsZXg6ICdub25lJyxcbiAgICAgICAgbWFyZ2luSW5saW5lRW5kOiB0b2tlbi5zZWxlY3RBZmZpeFBhZGRpbmdcbiAgICAgIH0sXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBDbGVhciA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgW2Ake2NvbXBvbmVudENsc30tY2xlYXJgXToge1xuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgdG9wOiAnNTAlJyxcbiAgICAgICAgaW5zZXRJbmxpbmVTdGFydDogJ2F1dG8nLFxuICAgICAgICBpbnNldElubGluZUVuZDogaW5wdXRQYWRkaW5nSG9yaXpvbnRhbEJhc2UsXG4gICAgICAgIHpJbmRleDogMSxcbiAgICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICAgIHdpZHRoOiB0b2tlbi5mb250U2l6ZUljb24sXG4gICAgICAgIGhlaWdodDogdG9rZW4uZm9udFNpemVJY29uLFxuICAgICAgICBtYXJnaW5Ub3A6IHRva2VuLmNhbGModG9rZW4uZm9udFNpemVJY29uKS5tdWwoLTEpLmRpdigyKS5lcXVhbCgpLFxuICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JUZXh0UXVhdGVybmFyeSxcbiAgICAgICAgZm9udFNpemU6IHRva2VuLmZvbnRTaXplSWNvbixcbiAgICAgICAgZm9udFN0eWxlOiAnbm9ybWFsJyxcbiAgICAgICAgbGluZUhlaWdodDogMSxcbiAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgdGV4dFRyYW5zZm9ybTogJ25vbmUnLFxuICAgICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgICAgb3BhY2l0eTogMCxcbiAgICAgICAgdHJhbnNpdGlvbjogYGNvbG9yICR7dG9rZW4ubW90aW9uRHVyYXRpb25NaWR9IGVhc2UsIG9wYWNpdHkgJHt0b2tlbi5tb3Rpb25EdXJhdGlvblNsb3d9IGVhc2VgLFxuICAgICAgICB0ZXh0UmVuZGVyaW5nOiAnYXV0bycsXG4gICAgICAgICcmOmJlZm9yZSc6IHtcbiAgICAgICAgICBkaXNwbGF5OiAnYmxvY2snXG4gICAgICAgIH0sXG4gICAgICAgICcmOmhvdmVyJzoge1xuICAgICAgICAgIGNvbG9yOiB0b2tlbi5jb2xvclRleHRUZXJ0aWFyeVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2AmOmhvdmVyICR7Y29tcG9uZW50Q2xzfS1jbGVhcmBdOiB7XG4gICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgIGJhY2tncm91bmQ6IHRva2VuLmNvbG9yQmdCYXNlLFxuICAgICAgICBib3JkZXJSYWRpdXM6ICc1MCUnXG4gICAgICB9XG4gICAgfSksXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBGZWVkYmFjayA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIFtgJHtjb21wb25lbnRDbHN9LXN0YXR1c2BdOiB7XG4gICAgICAnJi1lcnJvciwgJi13YXJuaW5nLCAmLXN1Y2Nlc3MsICYtdmFsaWRhdGluZyc6IHtcbiAgICAgICAgW2AmJHtjb21wb25lbnRDbHN9LWhhcy1mZWVkYmFja2BdOiB7XG4gICAgICAgICAgW2Ake2NvbXBvbmVudENsc30tY2xlYXJgXToge1xuICAgICAgICAgICAgaW5zZXRJbmxpbmVFbmQ6IHRva2VuLmNhbGMoaW5wdXRQYWRkaW5nSG9yaXpvbnRhbEJhc2UpLmFkZCh0b2tlbi5mb250U2l6ZSkuYWRkKHRva2VuLnBhZGRpbmdYUykuZXF1YWwoKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU3R5bGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuY29uc3QgZ2VuU2VsZWN0U3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHNcbiAgfSA9IHRva2VuO1xuICByZXR1cm4gW3tcbiAgICBbY29tcG9uZW50Q2xzXToge1xuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT0gSW4gRm9ybSA9PT09PT09PT09PT09PT09PT09PVxuICAgICAgW2AmJHtjb21wb25lbnRDbHN9LWluLWZvcm0taXRlbWBdOiB7XG4gICAgICAgIHdpZHRoOiAnMTAwJSdcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vID09ICAgICAgICAgICAgICAgICAgICAgICBMVFIgICAgICAgICAgICAgICAgICAgICAgID09XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEJhc2VcbiAgZ2VuQmFzZVN0eWxlKHRva2VuKSxcbiAgLy8gU2luZ2xlXG4gIGdlblNpbmdsZVN0eWxlKHRva2VuKSxcbiAgLy8gTXVsdGlwbGVcbiAgZ2VuTXVsdGlwbGVTdHlsZSh0b2tlbiksXG4gIC8vIERyb3Bkb3duXG4gIGdlbkRyb3Bkb3duU3R5bGUodG9rZW4pLFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyA9PSAgICAgICAgICAgICAgICAgICAgICAgUlRMICAgICAgICAgICAgICAgICAgICAgICA9PVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB7XG4gICAgW2Ake2NvbXBvbmVudENsc30tcnRsYF06IHtcbiAgICAgIGRpcmVjdGlvbjogJ3J0bCdcbiAgICB9XG4gIH0sXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vID09ICAgICAgICAgICAgIFNwYWNlIENvbXBhY3QgICAgICAgICAgICAgICAgICAgICAgID09XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGdlbkNvbXBhY3RJdGVtU3R5bGUodG9rZW4sIHtcbiAgICBib3JkZXJFbENsczogYCR7Y29tcG9uZW50Q2xzfS1zZWxlY3RvcmAsXG4gICAgZm9jdXNFbENsczogYCR7Y29tcG9uZW50Q2xzfS1mb2N1c2VkYFxuICB9KV07XG59O1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEV4cG9ydCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmV4cG9ydCBkZWZhdWx0IGdlblN0eWxlSG9va3MoJ1NlbGVjdCcsICh0b2tlbiwgX3JlZikgPT4ge1xuICBsZXQge1xuICAgIHJvb3RQcmVmaXhDbHNcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IHNlbGVjdFRva2VuID0gbWVyZ2VUb2tlbih0b2tlbiwge1xuICAgIHJvb3RQcmVmaXhDbHMsXG4gICAgaW5wdXRQYWRkaW5nSG9yaXpvbnRhbEJhc2U6IHRva2VuLmNhbGModG9rZW4ucGFkZGluZ1NNKS5zdWIoMSkuZXF1YWwoKSxcbiAgICBtdWx0aXBsZVNlbGVjdEl0ZW1IZWlnaHQ6IHRva2VuLm11bHRpcGxlSXRlbUhlaWdodCxcbiAgICBzZWxlY3RIZWlnaHQ6IHRva2VuLmNvbnRyb2xIZWlnaHRcbiAgfSk7XG4gIHJldHVybiBbZ2VuU2VsZWN0U3R5bGUoc2VsZWN0VG9rZW4pLCBnZW5WYXJpYW50c1N0eWxlKHNlbGVjdFRva2VuKV07XG59LCBwcmVwYXJlQ29tcG9uZW50VG9rZW4sIHtcbiAgdW5pdGxlc3M6IHtcbiAgICBvcHRpb25MaW5lSGVpZ2h0OiB0cnVlLFxuICAgIG9wdGlvblNlbGVjdGVkRm9udFdlaWdodDogdHJ1ZVxuICB9XG59KTsiLCAiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBDaGVja091dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9DaGVja091dGxpbmVkXCI7XG5pbXBvcnQgQ2xvc2VDaXJjbGVGaWxsZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0Nsb3NlQ2lyY2xlRmlsbGVkXCI7XG5pbXBvcnQgQ2xvc2VPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvQ2xvc2VPdXRsaW5lZFwiO1xuaW1wb3J0IERvd25PdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvRG93bk91dGxpbmVkXCI7XG5pbXBvcnQgTG9hZGluZ091dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9Mb2FkaW5nT3V0bGluZWRcIjtcbmltcG9ydCBTZWFyY2hPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvU2VhcmNoT3V0bGluZWRcIjtcbmltcG9ydCB7IGRldlVzZVdhcm5pbmcgfSBmcm9tICcuLi9fdXRpbC93YXJuaW5nJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUljb25zKF9yZWYpIHtcbiAgbGV0IHtcbiAgICBzdWZmaXhJY29uLFxuICAgIGNsZWFySWNvbixcbiAgICBtZW51SXRlbVNlbGVjdGVkSWNvbixcbiAgICByZW1vdmVJY29uLFxuICAgIGxvYWRpbmcsXG4gICAgbXVsdGlwbGUsXG4gICAgaGFzRmVlZGJhY2ssXG4gICAgcHJlZml4Q2xzLFxuICAgIHNob3dTdWZmaXhJY29uLFxuICAgIGZlZWRiYWNrSWNvbixcbiAgICBzaG93QXJyb3csXG4gICAgY29tcG9uZW50TmFtZVxuICB9ID0gX3JlZjtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBjb25zdCB3YXJuaW5nID0gZGV2VXNlV2FybmluZyhjb21wb25lbnROYW1lKTtcbiAgICB3YXJuaW5nLmRlcHJlY2F0ZWQoIWNsZWFySWNvbiwgJ2NsZWFySWNvbicsICdhbGxvd0NsZWFyPXt7IGNsZWFySWNvbjogUmVhY3QuUmVhY3ROb2RlIH19Jyk7XG4gIH1cbiAgLy8gQ2xlYXIgSWNvblxuICBjb25zdCBtZXJnZWRDbGVhckljb24gPSBjbGVhckljb24gIT09IG51bGwgJiYgY2xlYXJJY29uICE9PSB2b2lkIDAgPyBjbGVhckljb24gOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDbG9zZUNpcmNsZUZpbGxlZCwgbnVsbCk7XG4gIC8vIFZhbGlkYXRpb24gRmVlZGJhY2sgSWNvblxuICBjb25zdCBnZXRTdWZmaXhJY29uTm9kZSA9IGFycm93SWNvbiA9PiB7XG4gICAgaWYgKHN1ZmZpeEljb24gPT09IG51bGwgJiYgIWhhc0ZlZWRiYWNrICYmICFzaG93QXJyb3cpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIHNob3dTdWZmaXhJY29uICE9PSBmYWxzZSAmJiBhcnJvd0ljb24sIGhhc0ZlZWRiYWNrICYmIGZlZWRiYWNrSWNvbik7XG4gIH07XG4gIC8vIEFycm93IGl0ZW0gaWNvblxuICBsZXQgbWVyZ2VkU3VmZml4SWNvbiA9IG51bGw7XG4gIGlmIChzdWZmaXhJY29uICE9PSB1bmRlZmluZWQpIHtcbiAgICBtZXJnZWRTdWZmaXhJY29uID0gZ2V0U3VmZml4SWNvbk5vZGUoc3VmZml4SWNvbik7XG4gIH0gZWxzZSBpZiAobG9hZGluZykge1xuICAgIG1lcmdlZFN1ZmZpeEljb24gPSBnZXRTdWZmaXhJY29uTm9kZSgvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMb2FkaW5nT3V0bGluZWQsIHtcbiAgICAgIHNwaW46IHRydWVcbiAgICB9KSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgaWNvbkNscyA9IGAke3ByZWZpeENsc30tc3VmZml4YDtcbiAgICBtZXJnZWRTdWZmaXhJY29uID0gX3JlZjIgPT4ge1xuICAgICAgbGV0IHtcbiAgICAgICAgb3BlbixcbiAgICAgICAgc2hvd1NlYXJjaFxuICAgICAgfSA9IF9yZWYyO1xuICAgICAgaWYgKG9wZW4gJiYgc2hvd1NlYXJjaCkge1xuICAgICAgICByZXR1cm4gZ2V0U3VmZml4SWNvbk5vZGUoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU2VhcmNoT3V0bGluZWQsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IGljb25DbHNcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGdldFN1ZmZpeEljb25Ob2RlKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERvd25PdXRsaW5lZCwge1xuICAgICAgICBjbGFzc05hbWU6IGljb25DbHNcbiAgICAgIH0pKTtcbiAgICB9O1xuICB9XG4gIC8vIENoZWNrZWQgaXRlbSBpY29uXG4gIGxldCBtZXJnZWRJdGVtSWNvbiA9IG51bGw7XG4gIGlmIChtZW51SXRlbVNlbGVjdGVkSWNvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbWVyZ2VkSXRlbUljb24gPSBtZW51SXRlbVNlbGVjdGVkSWNvbjtcbiAgfSBlbHNlIGlmIChtdWx0aXBsZSkge1xuICAgIG1lcmdlZEl0ZW1JY29uID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hlY2tPdXRsaW5lZCwgbnVsbCk7XG4gIH0gZWxzZSB7XG4gICAgbWVyZ2VkSXRlbUljb24gPSBudWxsO1xuICB9XG4gIGxldCBtZXJnZWRSZW1vdmVJY29uID0gbnVsbDtcbiAgaWYgKHJlbW92ZUljb24gIT09IHVuZGVmaW5lZCkge1xuICAgIG1lcmdlZFJlbW92ZUljb24gPSByZW1vdmVJY29uO1xuICB9IGVsc2Uge1xuICAgIG1lcmdlZFJlbW92ZUljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDbG9zZU91dGxpbmVkLCBudWxsKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGNsZWFySWNvbjogbWVyZ2VkQ2xlYXJJY29uLFxuICAgIHN1ZmZpeEljb246IG1lcmdlZFN1ZmZpeEljb24sXG4gICAgaXRlbUljb246IG1lcmdlZEl0ZW1JY29uLFxuICAgIHJlbW92ZUljb246IG1lcmdlZFJlbW92ZUljb25cbiAgfTtcbn0iLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQ2hlY2tPdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9DaGVja091dGxpbmVkXCI7XG5pbXBvcnQgQW50ZEljb24gZnJvbSBcIi4uL2NvbXBvbmVudHMvQW50ZEljb25cIjtcbnZhciBDaGVja091dGxpbmVkID0gZnVuY3Rpb24gQ2hlY2tPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbnRkSWNvbiwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogQ2hlY2tPdXRsaW5lZFN2Z1xuICB9KSk7XG59O1xuXG4vKiohW2NoZWNrXShkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUIzYVdSMGFEMGlOVEFpSUdobGFXZG9kRDBpTlRBaUlHWnBiR3c5SWlOallXTmhZMkVpSUhacFpYZENiM2c5SWpZMElEWTBJRGc1TmlBNE9UWWlJR1p2WTNWellXSnNaVDBpWm1Gc2MyVWlJSGh0Ykc1elBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5SStQSEJoZEdnZ1pEMGlUVGt4TWlBeE9UQm9MVFk1TGpsakxUa3VPQ0F3TFRFNUxqRWdOQzQxTFRJMUxqRWdNVEl1TWt3ME1EUXVOeUEzTWpRdU5TQXlNRGNnTkRjMFlUTXlJRE15SURBZ01EQXRNalV1TVMweE1pNHlTREV4TW1NdE5pNDNJREF0TVRBdU5DQTNMamN0Tmk0eklERXlMamxzTWpjekxqa2dNelEzWXpFeUxqZ2dNVFl1TWlBek55NDBJREUyTGpJZ05UQXVNeUF3YkRRNE9DNDBMVFl4T0M0NVl6UXVNUzAxTGpFdU5DMHhNaTQ0TFRZdU15MHhNaTQ0ZWlJZ0x6NDhMM04yWno0PSkgKi9cbnZhciBSZWZJY29uID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoQ2hlY2tPdXRsaW5lZCk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBSZWZJY29uLmRpc3BsYXlOYW1lID0gJ0NoZWNrT3V0bGluZWQnO1xufVxuZXhwb3J0IGRlZmF1bHQgUmVmSWNvbjsiLCAiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgQ2hlY2tPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNOTEyIDE5MGgtNjkuOWMtOS44IDAtMTkuMSA0LjUtMjUuMSAxMi4yTDQwNC43IDcyNC41IDIwNyA0NzRhMzIgMzIgMCAwMC0yNS4xLTEyLjJIMTEyYy02LjcgMC0xMC40IDcuNy02LjMgMTIuOWwyNzMuOSAzNDdjMTIuOCAxNi4yIDM3LjQgMTYuMiA1MC4zIDBsNDg4LjQtNjE4LjljNC4xLTUuMS40LTEyLjgtNi4zLTEyLjh6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJjaGVja1wiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgQ2hlY2tPdXRsaW5lZDtcbiIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBEb3duT3V0bGluZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vRG93bk91dGxpbmVkXCI7XG5pbXBvcnQgQW50ZEljb24gZnJvbSBcIi4uL2NvbXBvbmVudHMvQW50ZEljb25cIjtcbnZhciBEb3duT3V0bGluZWQgPSBmdW5jdGlvbiBEb3duT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IERvd25PdXRsaW5lZFN2Z1xuICB9KSk7XG59O1xuXG4vKiohW2Rvd25dKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjNhV1IwYUQwaU5UQWlJR2hsYVdkb2REMGlOVEFpSUdacGJHdzlJaU5qWVdOaFkyRWlJSFpwWlhkQ2IzZzlJalkwSURZMElEZzVOaUE0T1RZaUlHWnZZM1Z6WVdKc1pUMGlabUZzYzJVaUlIaHRiRzV6UFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eU1EQXdMM04yWnlJK1BIQmhkR2dnWkQwaVRUZzROQ0F5TlRab0xUYzFZeTAxTGpFZ01DMDVMamtnTWk0MUxURXlMamtnTmk0MlREVXhNaUEyTlRRdU1pQXlNamN1T1NBeU5qSXVObU10TXkwMExqRXROeTQ0TFRZdU5pMHhNaTQ1TFRZdU5tZ3ROelZqTFRZdU5TQXdMVEV3TGpNZ055NDBMVFl1TlNBeE1pNDNiRE0xTWk0MklEUTROaTR4WXpFeUxqZ2dNVGN1TmlBek9TQXhOeTQySURVeExqY2dNR3d6TlRJdU5pMDBPRFl1TVdNekxqa3ROUzR6TGpFdE1USXVOeTAyTGpRdE1USXVOM29pSUM4K1BDOXpkbWMrKSAqL1xudmFyIFJlZkljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihEb3duT3V0bGluZWQpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgUmVmSWNvbi5kaXNwbGF5TmFtZSA9ICdEb3duT3V0bGluZWQnO1xufVxuZXhwb3J0IGRlZmF1bHQgUmVmSWNvbjsiLCAiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgRG93bk91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk04ODQgMjU2aC03NWMtNS4xIDAtOS45IDIuNS0xMi45IDYuNkw1MTIgNjU0LjIgMjI3LjkgMjYyLjZjLTMtNC4xLTcuOC02LjYtMTIuOS02LjZoLTc1Yy02LjUgMC0xMC4zIDcuNC02LjUgMTIuN2wzNTIuNiA0ODYuMWMxMi44IDE3LjYgMzkgMTcuNiA1MS43IDBsMzUyLjYtNDg2LjFjMy45LTUuMy4xLTEyLjctNi40LTEyLjd6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJkb3duXCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnQgZGVmYXVsdCBEb3duT3V0bGluZWQ7XG4iLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgU2VhcmNoT3V0bGluZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vU2VhcmNoT3V0bGluZWRcIjtcbmltcG9ydCBBbnRkSWNvbiBmcm9tIFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiO1xudmFyIFNlYXJjaE91dGxpbmVkID0gZnVuY3Rpb24gU2VhcmNoT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IFNlYXJjaE91dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5cbi8qKiFbc2VhcmNoXShkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUIzYVdSMGFEMGlOVEFpSUdobGFXZG9kRDBpTlRBaUlHWnBiR3c5SWlOallXTmhZMkVpSUhacFpYZENiM2c5SWpZMElEWTBJRGc1TmlBNE9UWWlJR1p2WTNWellXSnNaVDBpWm1Gc2MyVWlJSGh0Ykc1elBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5SStQSEJoZEdnZ1pEMGlUVGt3T1M0MklEZzFOQzQxVERZME9TNDVJRFU1TkM0NFF6WTVNQzR5SURVME1pNDNJRGN4TWlBME56a2dOekV5SURReE1tTXdMVGd3TGpJdE16RXVNeTB4TlRVdU5DMDROeTQ1TFRJeE1pNHhMVFUyTGpZdE5UWXVOeTB4TXpJdE9EY3VPUzB5TVRJdU1TMDROeTQ1Y3kweE5UVXVOU0F6TVM0ekxUSXhNaTR4SURnM0xqbERNVFF6TGpJZ01qVTJMalVnTVRFeUlETXpNUzQ0SURFeE1pQTBNVEpqTUNBNE1DNHhJRE14TGpNZ01UVTFMalVnT0RjdU9TQXlNVEl1TVVNeU5UWXVOU0EyT0RBdU9DQXpNekV1T0NBM01USWdOREV5SURjeE1tTTJOeUF3SURFek1DNDJMVEl4TGpnZ01UZ3lMamN0TmpKc01qVTVMamNnTWpVNUxqWmhPQzR5SURndU1pQXdJREF3TVRFdU5pQXdiRFF6TGpZdE5ETXVOV0U0TGpJZ09DNHlJREFnTURBd0xURXhMalo2VFRVM01DNDBJRFUzTUM0MFF6VXlPQ0EyTVRJdU55QTBOekV1T0NBMk16WWdOREV5SURZek5uTXRNVEUyTFRJekxqTXRNVFU0TGpRdE5qVXVOa015TVRFdU15QTFNamdnTVRnNElEUTNNUzQ0SURFNE9DQTBNVEp6TWpNdU15MHhNVFl1TVNBMk5TNDJMVEUxT0M0MFF6STVOaUF5TVRFdU15QXpOVEl1TWlBeE9EZ2dOREV5SURFNE9ITXhNVFl1TVNBeU15NHlJREUxT0M0MElEWTFMalpUTmpNMklETTFNaTR5SURZek5pQTBNVEp6TFRJekxqTWdNVEUyTGpFdE5qVXVOaUF4TlRndU5Ib2lJQzgrUEM5emRtYyspICovXG52YXIgUmVmSWNvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKFNlYXJjaE91dGxpbmVkKTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFJlZkljb24uZGlzcGxheU5hbWUgPSAnU2VhcmNoT3V0bGluZWQnO1xufVxuZXhwb3J0IGRlZmF1bHQgUmVmSWNvbjsiLCAiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgU2VhcmNoT3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTkwOS42IDg1NC41TDY0OS45IDU5NC44QzY5MC4yIDU0Mi43IDcxMiA0NzkgNzEyIDQxMmMwLTgwLjItMzEuMy0xNTUuNC04Ny45LTIxMi4xLTU2LjYtNTYuNy0xMzItODcuOS0yMTIuMS04Ny45cy0xNTUuNSAzMS4zLTIxMi4xIDg3LjlDMTQzLjIgMjU2LjUgMTEyIDMzMS44IDExMiA0MTJjMCA4MC4xIDMxLjMgMTU1LjUgODcuOSAyMTIuMUMyNTYuNSA2ODAuOCAzMzEuOCA3MTIgNDEyIDcxMmM2NyAwIDEzMC42LTIxLjggMTgyLjctNjJsMjU5LjcgMjU5LjZhOC4yIDguMiAwIDAwMTEuNiAwbDQzLjYtNDMuNWE4LjIgOC4yIDAgMDAwLTExLjZ6TTU3MC40IDU3MC40QzUyOCA2MTIuNyA0NzEuOCA2MzYgNDEyIDYzNnMtMTE2LTIzLjMtMTU4LjQtNjUuNkMyMTEuMyA1MjggMTg4IDQ3MS44IDE4OCA0MTJzMjMuMy0xMTYuMSA2NS42LTE1OC40QzI5NiAyMTEuMyAzNTIuMiAxODggNDEyIDE4OHMxMTYuMSAyMy4yIDE1OC40IDY1LjZTNjM2IDM1Mi4yIDYzNiA0MTJzLTIzLjMgMTE2LjEtNjUuNiAxNTguNHpcIiB9IH1dIH0sIFwibmFtZVwiOiBcInNlYXJjaFwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgU2VhcmNoT3V0bGluZWQ7XG4iLCAiLyoqXG4gKiBTaW5jZSBTZWxlY3QsIFRyZWVTZWxlY3QsIENhc2NhZGVyIGlzIHNhbWUgU2VsZWN0IGxpa2UgY29tcG9uZW50LlxuICogV2UganVzdCB1c2Ugc2FtZSBob29rIHRvIGhhbmRsZSB0aGlzIGxvZ2ljLlxuICpcbiAqIElmIGBzdWZmaXhJY29uYCBpcyBub3QgZXF1YWwgdG8gYG51bGxgLCBhbHdheXMgc2hvdyBpdC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlU2hvd0Fycm93KHN1ZmZpeEljb24sIHNob3dBcnJvdykge1xuICByZXR1cm4gc2hvd0Fycm93ICE9PSB1bmRlZmluZWQgPyBzaG93QXJyb3cgOiBzdWZmaXhJY29uICE9PSBudWxsO1xufSIsICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VGb3JjZVVwZGF0ZSgpIHtcbiAgY29uc3QgWywgZm9yY2VVcGRhdGVdID0gUmVhY3QudXNlUmVkdWNlcih4ID0+IHggKyAxLCAwKTtcbiAgcmV0dXJuIGZvcmNlVXBkYXRlO1xufSIsICJcInVzZSBjbGllbnRcIjtcblxudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFJjVG9vbHRpcCBmcm9tICdyYy10b29sdGlwJztcbmltcG9ydCB1c2VNZXJnZWRTdGF0ZSBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VNZXJnZWRTdGF0ZVwiO1xuaW1wb3J0IENvbnRleHRJc29sYXRvciBmcm9tICcuLi9fdXRpbC9Db250ZXh0SXNvbGF0b3InO1xuaW1wb3J0IHsgdXNlWkluZGV4IH0gZnJvbSAnLi4vX3V0aWwvaG9va3MvdXNlWkluZGV4JztcbmltcG9ydCB7IGdldFRyYW5zaXRpb25OYW1lIH0gZnJvbSAnLi4vX3V0aWwvbW90aW9uJztcbmltcG9ydCBnZXRQbGFjZW1lbnRzIGZyb20gJy4uL191dGlsL3BsYWNlbWVudHMnO1xuaW1wb3J0IHsgY2xvbmVFbGVtZW50LCBpc0ZyYWdtZW50IH0gZnJvbSAnLi4vX3V0aWwvcmVhY3ROb2RlJztcbmltcG9ydCB7IGRldlVzZVdhcm5pbmcgfSBmcm9tICcuLi9fdXRpbC93YXJuaW5nJztcbmltcG9ydCB6SW5kZXhDb250ZXh0IGZyb20gJy4uL191dGlsL3ppbmRleENvbnRleHQnO1xuaW1wb3J0IHsgdXNlVG9rZW4gfSBmcm9tICcuLi90aGVtZS9pbnRlcm5hbCc7XG5pbXBvcnQgUHVyZVBhbmVsIGZyb20gJy4vUHVyZVBhbmVsJztcbmltcG9ydCB1c2VTdHlsZSBmcm9tICcuL3N0eWxlJztcbmltcG9ydCB7IHBhcnNlQ29sb3IgfSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IHsgdXNlQ29tcG9uZW50Q29uZmlnIH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL2NvbnRleHQnO1xuY29uc3QgSW50ZXJuYWxUb29sdGlwID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHByb3BzLCByZWYpID0+IHtcbiAgdmFyIF9hLCBfYjtcbiAgY29uc3Qge1xuICAgICAgcHJlZml4Q2xzOiBjdXN0b21pemVQcmVmaXhDbHMsXG4gICAgICBvcGVuQ2xhc3NOYW1lLFxuICAgICAgZ2V0VG9vbHRpcENvbnRhaW5lcixcbiAgICAgIGNvbG9yLFxuICAgICAgb3ZlcmxheUlubmVyU3R5bGUsXG4gICAgICBjaGlsZHJlbixcbiAgICAgIGFmdGVyT3BlbkNoYW5nZSxcbiAgICAgIGFmdGVyVmlzaWJsZUNoYW5nZSxcbiAgICAgIGRlc3Ryb3lUb29sdGlwT25IaWRlLFxuICAgICAgYXJyb3cgPSB0cnVlLFxuICAgICAgdGl0bGUsXG4gICAgICBvdmVybGF5LFxuICAgICAgYnVpbHRpblBsYWNlbWVudHMsXG4gICAgICBhcnJvd1BvaW50QXRDZW50ZXIgPSBmYWxzZSxcbiAgICAgIGF1dG9BZGp1c3RPdmVyZmxvdyA9IHRydWUsXG4gICAgICBtb3Rpb24sXG4gICAgICBnZXRQb3B1cENvbnRhaW5lcixcbiAgICAgIHBsYWNlbWVudCA9ICd0b3AnLFxuICAgICAgbW91c2VFbnRlckRlbGF5ID0gMC4xLFxuICAgICAgbW91c2VMZWF2ZURlbGF5ID0gMC4xLFxuICAgICAgb3ZlcmxheVN0eWxlLFxuICAgICAgcm9vdENsYXNzTmFtZSxcbiAgICAgIG92ZXJsYXlDbGFzc05hbWUsXG4gICAgICBzdHlsZXMsXG4gICAgICBjbGFzc05hbWVzOiB0b29sdGlwQ2xhc3NOYW1lc1xuICAgIH0gPSBwcm9wcyxcbiAgICByZXN0UHJvcHMgPSBfX3Jlc3QocHJvcHMsIFtcInByZWZpeENsc1wiLCBcIm9wZW5DbGFzc05hbWVcIiwgXCJnZXRUb29sdGlwQ29udGFpbmVyXCIsIFwiY29sb3JcIiwgXCJvdmVybGF5SW5uZXJTdHlsZVwiLCBcImNoaWxkcmVuXCIsIFwiYWZ0ZXJPcGVuQ2hhbmdlXCIsIFwiYWZ0ZXJWaXNpYmxlQ2hhbmdlXCIsIFwiZGVzdHJveVRvb2x0aXBPbkhpZGVcIiwgXCJhcnJvd1wiLCBcInRpdGxlXCIsIFwib3ZlcmxheVwiLCBcImJ1aWx0aW5QbGFjZW1lbnRzXCIsIFwiYXJyb3dQb2ludEF0Q2VudGVyXCIsIFwiYXV0b0FkanVzdE92ZXJmbG93XCIsIFwibW90aW9uXCIsIFwiZ2V0UG9wdXBDb250YWluZXJcIiwgXCJwbGFjZW1lbnRcIiwgXCJtb3VzZUVudGVyRGVsYXlcIiwgXCJtb3VzZUxlYXZlRGVsYXlcIiwgXCJvdmVybGF5U3R5bGVcIiwgXCJyb290Q2xhc3NOYW1lXCIsIFwib3ZlcmxheUNsYXNzTmFtZVwiLCBcInN0eWxlc1wiLCBcImNsYXNzTmFtZXNcIl0pO1xuICBjb25zdCBtZXJnZWRTaG93QXJyb3cgPSAhIWFycm93O1xuICBjb25zdCBbLCB0b2tlbl0gPSB1c2VUb2tlbigpO1xuICBjb25zdCB7XG4gICAgZ2V0UG9wdXBDb250YWluZXI6IGdldENvbnRleHRQb3B1cENvbnRhaW5lcixcbiAgICBnZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uLFxuICAgIGNsYXNzTmFtZTogY29udGV4dENsYXNzTmFtZSxcbiAgICBzdHlsZTogY29udGV4dFN0eWxlLFxuICAgIGNsYXNzTmFtZXM6IGNvbnRleHRDbGFzc05hbWVzLFxuICAgIHN0eWxlczogY29udGV4dFN0eWxlc1xuICB9ID0gdXNlQ29tcG9uZW50Q29uZmlnKCd0b29sdGlwJyk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZWYgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCB3YXJuaW5nID0gZGV2VXNlV2FybmluZygnVG9vbHRpcCcpO1xuICBjb25zdCB0b29sdGlwUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBjb25zdCBmb3JjZUFsaWduID0gKCkgPT4ge1xuICAgIHZhciBfYTtcbiAgICAoX2EgPSB0b29sdGlwUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5mb3JjZUFsaWduKCk7XG4gIH07XG4gIFJlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4ge1xuICAgICAgZm9yY2VBbGlnbixcbiAgICAgIGZvcmNlUG9wdXBBbGlnbjogKCkgPT4ge1xuICAgICAgICB3YXJuaW5nLmRlcHJlY2F0ZWQoZmFsc2UsICdmb3JjZVBvcHVwQWxpZ24nLCAnZm9yY2VBbGlnbicpO1xuICAgICAgICBmb3JjZUFsaWduKCk7XG4gICAgICB9LFxuICAgICAgbmF0aXZlRWxlbWVudDogKF9hID0gdG9vbHRpcFJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubmF0aXZlRWxlbWVudCxcbiAgICAgIHBvcHVwRWxlbWVudDogKF9iID0gdG9vbHRpcFJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IucG9wdXBFbGVtZW50XG4gICAgfTtcbiAgfSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBXYXJuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIFtbJ3Zpc2libGUnLCAnb3BlbiddLCBbJ2RlZmF1bHRWaXNpYmxlJywgJ2RlZmF1bHRPcGVuJ10sIFsnb25WaXNpYmxlQ2hhbmdlJywgJ29uT3BlbkNoYW5nZSddLCBbJ2FmdGVyVmlzaWJsZUNoYW5nZScsICdhZnRlck9wZW5DaGFuZ2UnXSwgWydhcnJvd1BvaW50QXRDZW50ZXInLCAnYXJyb3c9e3sgcG9pbnRBdENlbnRlcjogdHJ1ZSB9fSddLCBbJ292ZXJsYXlTdHlsZScsICdzdHlsZXM9e3sgcm9vdDoge30gfX0nXSwgWydvdmVybGF5SW5uZXJTdHlsZScsICdzdHlsZXM9e3sgYm9keToge30gfX0nXSwgWydvdmVybGF5Q2xhc3NOYW1lJywgJ2NsYXNzTmFtZXM9e3sgcm9vdDogXCJcIiB9fSddXS5mb3JFYWNoKF9yZWYgPT4ge1xuICAgICAgbGV0IFtkZXByZWNhdGVkTmFtZSwgbmV3TmFtZV0gPSBfcmVmO1xuICAgICAgd2FybmluZy5kZXByZWNhdGVkKCEoZGVwcmVjYXRlZE5hbWUgaW4gcHJvcHMpLCBkZXByZWNhdGVkTmFtZSwgbmV3TmFtZSk7XG4gICAgfSk7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyghZGVzdHJveVRvb2x0aXBPbkhpZGUgfHwgdHlwZW9mIGRlc3Ryb3lUb29sdGlwT25IaWRlID09PSAnYm9vbGVhbicsICd1c2FnZScsICdgZGVzdHJveVRvb2x0aXBPbkhpZGVgIG5vIG5lZWQgY29uZmlnIGBrZWVwUGFyZW50YCBhbnltb3JlLiBQbGVhc2UgdXNlIGBib29sZWFuYCB2YWx1ZSBkaXJlY3RseS4nKSA6IHZvaWQgMDtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCFhcnJvdyB8fCB0eXBlb2YgYXJyb3cgPT09ICdib29sZWFuJyB8fCAhKCdhcnJvd1BvaW50QXRDZW50ZXInIGluIGFycm93KSwgJ2RlcHJlY2F0ZWQnLCAnYGFycm93UG9pbnRBdENlbnRlcmAgaW4gYGFycm93YCBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIGBwb2ludEF0Q2VudGVyYCBpbnN0ZWFkLicpIDogdm9pZCAwO1xuICB9XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBPcGVuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBbb3Blbiwgc2V0T3Blbl0gPSB1c2VNZXJnZWRTdGF0ZShmYWxzZSwge1xuICAgIHZhbHVlOiAoX2EgPSBwcm9wcy5vcGVuKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBwcm9wcy52aXNpYmxlLFxuICAgIGRlZmF1bHRWYWx1ZTogKF9iID0gcHJvcHMuZGVmYXVsdE9wZW4pICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHByb3BzLmRlZmF1bHRWaXNpYmxlXG4gIH0pO1xuICBjb25zdCBub1RpdGxlID0gIXRpdGxlICYmICFvdmVybGF5ICYmIHRpdGxlICE9PSAwOyAvLyBvdmVybGF5IGZvciBvbGQgdmVyc2lvbiBjb21wYXRpYmlsaXR5XG4gIGNvbnN0IG9uT3BlbkNoYW5nZSA9IHZpcyA9PiB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICBzZXRPcGVuKG5vVGl0bGUgPyBmYWxzZSA6IHZpcyk7XG4gICAgaWYgKCFub1RpdGxlKSB7XG4gICAgICAoX2EgPSBwcm9wcy5vbk9wZW5DaGFuZ2UpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKHByb3BzLCB2aXMpO1xuICAgICAgKF9iID0gcHJvcHMub25WaXNpYmxlQ2hhbmdlKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChwcm9wcywgdmlzKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHRvb2x0aXBQbGFjZW1lbnRzID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICBsZXQgbWVyZ2VkQXJyb3dQb2ludEF0Q2VudGVyID0gYXJyb3dQb2ludEF0Q2VudGVyO1xuICAgIGlmICh0eXBlb2YgYXJyb3cgPT09ICdvYmplY3QnKSB7XG4gICAgICBtZXJnZWRBcnJvd1BvaW50QXRDZW50ZXIgPSAoX2IgPSAoX2EgPSBhcnJvdy5wb2ludEF0Q2VudGVyKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBhcnJvdy5hcnJvd1BvaW50QXRDZW50ZXIpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGFycm93UG9pbnRBdENlbnRlcjtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWx0aW5QbGFjZW1lbnRzIHx8IGdldFBsYWNlbWVudHMoe1xuICAgICAgYXJyb3dQb2ludEF0Q2VudGVyOiBtZXJnZWRBcnJvd1BvaW50QXRDZW50ZXIsXG4gICAgICBhdXRvQWRqdXN0T3ZlcmZsb3csXG4gICAgICBhcnJvd1dpZHRoOiBtZXJnZWRTaG93QXJyb3cgPyB0b2tlbi5zaXplUG9wdXBBcnJvdyA6IDAsXG4gICAgICBib3JkZXJSYWRpdXM6IHRva2VuLmJvcmRlclJhZGl1cyxcbiAgICAgIG9mZnNldDogdG9rZW4ubWFyZ2luWFhTLFxuICAgICAgdmlzaWJsZUZpcnN0OiB0cnVlXG4gICAgfSk7XG4gIH0sIFthcnJvd1BvaW50QXRDZW50ZXIsIGFycm93LCBidWlsdGluUGxhY2VtZW50cywgdG9rZW5dKTtcbiAgY29uc3QgbWVtb092ZXJsYXkgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBpZiAodGl0bGUgPT09IDApIHtcbiAgICAgIHJldHVybiB0aXRsZTtcbiAgICB9XG4gICAgcmV0dXJuIG92ZXJsYXkgfHwgdGl0bGUgfHwgJyc7XG4gIH0sIFtvdmVybGF5LCB0aXRsZV0pO1xuICBjb25zdCBtZW1vT3ZlcmxheVdyYXBwZXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb250ZXh0SXNvbGF0b3IsIHtcbiAgICBzcGFjZTogdHJ1ZVxuICB9LCB0eXBlb2YgbWVtb092ZXJsYXkgPT09ICdmdW5jdGlvbicgPyBtZW1vT3ZlcmxheSgpIDogbWVtb092ZXJsYXkpO1xuICBjb25zdCBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ3Rvb2x0aXAnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICBjb25zdCByb290UHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCk7XG4gIGNvbnN0IGluamVjdEZyb21Qb3BvdmVyID0gcHJvcHNbJ2RhdGEtcG9wb3Zlci1pbmplY3QnXTtcbiAgbGV0IHRlbXBPcGVuID0gb3BlbjtcbiAgLy8gSGlkZSB0b29sdGlwIHdoZW4gdGhlcmUgaXMgbm8gdGl0bGVcbiAgaWYgKCEoJ29wZW4nIGluIHByb3BzKSAmJiAhKCd2aXNpYmxlJyBpbiBwcm9wcykgJiYgbm9UaXRsZSkge1xuICAgIHRlbXBPcGVuID0gZmFsc2U7XG4gIH1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IGNoaWxkID0gLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSAmJiAhaXNGcmFnbWVudChjaGlsZHJlbikgPyBjaGlsZHJlbiA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBjaGlsZHJlbik7XG4gIGNvbnN0IGNoaWxkUHJvcHMgPSBjaGlsZC5wcm9wcztcbiAgY29uc3QgY2hpbGRDbHMgPSAhY2hpbGRQcm9wcy5jbGFzc05hbWUgfHwgdHlwZW9mIGNoaWxkUHJvcHMuY2xhc3NOYW1lID09PSAnc3RyaW5nJyA/IGNsYXNzTmFtZXMoY2hpbGRQcm9wcy5jbGFzc05hbWUsIG9wZW5DbGFzc05hbWUgfHwgYCR7cHJlZml4Q2xzfS1vcGVuYCkgOiBjaGlsZFByb3BzLmNsYXNzTmFtZTtcbiAgLy8gU3R5bGVcbiAgY29uc3QgW3dyYXBDU1NWYXIsIGhhc2hJZCwgY3NzVmFyQ2xzXSA9IHVzZVN0eWxlKHByZWZpeENscywgIWluamVjdEZyb21Qb3BvdmVyKTtcbiAgLy8gQ29sb3JcbiAgY29uc3QgY29sb3JJbmZvID0gcGFyc2VDb2xvcihwcmVmaXhDbHMsIGNvbG9yKTtcbiAgY29uc3QgYXJyb3dDb250ZW50U3R5bGUgPSBjb2xvckluZm8uYXJyb3dTdHlsZTtcbiAgY29uc3Qgcm9vdENsYXNzTmFtZXMgPSBjbGFzc05hbWVzKG92ZXJsYXlDbGFzc05hbWUsIHtcbiAgICBbYCR7cHJlZml4Q2xzfS1ydGxgXTogZGlyZWN0aW9uID09PSAncnRsJ1xuICB9LCBjb2xvckluZm8uY2xhc3NOYW1lLCByb290Q2xhc3NOYW1lLCBoYXNoSWQsIGNzc1ZhckNscywgY29udGV4dENsYXNzTmFtZSwgY29udGV4dENsYXNzTmFtZXMucm9vdCwgdG9vbHRpcENsYXNzTmFtZXMgPT09IG51bGwgfHwgdG9vbHRpcENsYXNzTmFtZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRvb2x0aXBDbGFzc05hbWVzLnJvb3QpO1xuICBjb25zdCBib2R5Q2xhc3NOYW1lcyA9IGNsYXNzTmFtZXMoY29udGV4dENsYXNzTmFtZXMuYm9keSwgdG9vbHRpcENsYXNzTmFtZXMgPT09IG51bGwgfHwgdG9vbHRpcENsYXNzTmFtZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRvb2x0aXBDbGFzc05hbWVzLmJvZHkpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IHpJbmRleCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IFt6SW5kZXgsIGNvbnRleHRaSW5kZXhdID0gdXNlWkluZGV4KCdUb29sdGlwJywgcmVzdFByb3BzLnpJbmRleCk7XG4gIGNvbnN0IGNvbnRlbnQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSY1Rvb2x0aXAsIE9iamVjdC5hc3NpZ24oe30sIHJlc3RQcm9wcywge1xuICAgIHpJbmRleDogekluZGV4LFxuICAgIHNob3dBcnJvdzogbWVyZ2VkU2hvd0Fycm93LFxuICAgIHBsYWNlbWVudDogcGxhY2VtZW50LFxuICAgIG1vdXNlRW50ZXJEZWxheTogbW91c2VFbnRlckRlbGF5LFxuICAgIG1vdXNlTGVhdmVEZWxheTogbW91c2VMZWF2ZURlbGF5LFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZXM6IHtcbiAgICAgIHJvb3Q6IHJvb3RDbGFzc05hbWVzLFxuICAgICAgYm9keTogYm9keUNsYXNzTmFtZXNcbiAgICB9LFxuICAgIHN0eWxlczoge1xuICAgICAgcm9vdDogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBhcnJvd0NvbnRlbnRTdHlsZSksIGNvbnRleHRTdHlsZXMucm9vdCksIGNvbnRleHRTdHlsZSksIG92ZXJsYXlTdHlsZSksIHN0eWxlcyA9PT0gbnVsbCB8fCBzdHlsZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0eWxlcy5yb290KSxcbiAgICAgIGJvZHk6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGNvbnRleHRTdHlsZXMuYm9keSksIG92ZXJsYXlJbm5lclN0eWxlKSwgc3R5bGVzID09PSBudWxsIHx8IHN0eWxlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3R5bGVzLmJvZHkpLCBjb2xvckluZm8ub3ZlcmxheVN0eWxlKVxuICAgIH0sXG4gICAgZ2V0VG9vbHRpcENvbnRhaW5lcjogZ2V0UG9wdXBDb250YWluZXIgfHwgZ2V0VG9vbHRpcENvbnRhaW5lciB8fCBnZXRDb250ZXh0UG9wdXBDb250YWluZXIsXG4gICAgcmVmOiB0b29sdGlwUmVmLFxuICAgIGJ1aWx0aW5QbGFjZW1lbnRzOiB0b29sdGlwUGxhY2VtZW50cyxcbiAgICBvdmVybGF5OiBtZW1vT3ZlcmxheVdyYXBwZXIsXG4gICAgdmlzaWJsZTogdGVtcE9wZW4sXG4gICAgb25WaXNpYmxlQ2hhbmdlOiBvbk9wZW5DaGFuZ2UsXG4gICAgYWZ0ZXJWaXNpYmxlQ2hhbmdlOiBhZnRlck9wZW5DaGFuZ2UgIT09IG51bGwgJiYgYWZ0ZXJPcGVuQ2hhbmdlICE9PSB2b2lkIDAgPyBhZnRlck9wZW5DaGFuZ2UgOiBhZnRlclZpc2libGVDaGFuZ2UsXG4gICAgYXJyb3dDb250ZW50OiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBgJHtwcmVmaXhDbHN9LWFycm93LWNvbnRlbnRgXG4gICAgfSksXG4gICAgbW90aW9uOiB7XG4gICAgICBtb3Rpb25OYW1lOiBnZXRUcmFuc2l0aW9uTmFtZShyb290UHJlZml4Q2xzLCAnem9vbS1iaWctZmFzdCcsIHByb3BzLnRyYW5zaXRpb25OYW1lKSxcbiAgICAgIG1vdGlvbkRlYWRsaW5lOiAxMDAwXG4gICAgfSxcbiAgICBkZXN0cm95VG9vbHRpcE9uSGlkZTogISFkZXN0cm95VG9vbHRpcE9uSGlkZVxuICB9KSwgdGVtcE9wZW4gPyBjbG9uZUVsZW1lbnQoY2hpbGQsIHtcbiAgICBjbGFzc05hbWU6IGNoaWxkQ2xzXG4gIH0pIDogY2hpbGQpO1xuICByZXR1cm4gd3JhcENTU1ZhcigvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudCh6SW5kZXhDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IGNvbnRleHRaSW5kZXhcbiAgfSwgY29udGVudCkpO1xufSk7XG5jb25zdCBUb29sdGlwID0gSW50ZXJuYWxUb29sdGlwO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgVG9vbHRpcC5kaXNwbGF5TmFtZSA9ICdUb29sdGlwJztcbn1cblRvb2x0aXAuX0ludGVybmFsUGFuZWxEb05vdFVzZU9yWW91V2lsbEJlRmlyZWQgPSBQdXJlUGFuZWw7XG5leHBvcnQgZGVmYXVsdCBUb29sdGlwOyIsICJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFBvcHVwKHByb3BzKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBpZCA9IHByb3BzLmlkLFxuICAgIGlubmVyU3R5bGUgPSBwcm9wcy5vdmVybGF5SW5uZXJTdHlsZSxcbiAgICBib2R5Q2xhc3NOYW1lID0gcHJvcHMuYm9keUNsYXNzTmFtZSxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgc3R5bGUgPSBwcm9wcy5zdHlsZTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb250ZW50XCIpLCBjbGFzc05hbWUpLFxuICAgIHN0eWxlOiBzdHlsZVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW5uZXJcIiksIGJvZHlDbGFzc05hbWUpLFxuICAgIGlkOiBpZCxcbiAgICByb2xlOiBcInRvb2x0aXBcIixcbiAgICBzdHlsZTogaW5uZXJTdHlsZVxuICB9LCB0eXBlb2YgY2hpbGRyZW4gPT09ICdmdW5jdGlvbicgPyBjaGlsZHJlbigpIDogY2hpbGRyZW4pKTtcbn0iLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJvdmVybGF5Q2xhc3NOYW1lXCIsIFwidHJpZ2dlclwiLCBcIm1vdXNlRW50ZXJEZWxheVwiLCBcIm1vdXNlTGVhdmVEZWxheVwiLCBcIm92ZXJsYXlTdHlsZVwiLCBcInByZWZpeENsc1wiLCBcImNoaWxkcmVuXCIsIFwib25WaXNpYmxlQ2hhbmdlXCIsIFwiYWZ0ZXJWaXNpYmxlQ2hhbmdlXCIsIFwidHJhbnNpdGlvbk5hbWVcIiwgXCJhbmltYXRpb25cIiwgXCJtb3Rpb25cIiwgXCJwbGFjZW1lbnRcIiwgXCJhbGlnblwiLCBcImRlc3Ryb3lUb29sdGlwT25IaWRlXCIsIFwiZGVmYXVsdFZpc2libGVcIiwgXCJnZXRUb29sdGlwQ29udGFpbmVyXCIsIFwib3ZlcmxheUlubmVyU3R5bGVcIiwgXCJhcnJvd0NvbnRlbnRcIiwgXCJvdmVybGF5XCIsIFwiaWRcIiwgXCJzaG93QXJyb3dcIiwgXCJjbGFzc05hbWVzXCIsIFwic3R5bGVzXCJdO1xuaW1wb3J0IFRyaWdnZXIgZnJvbSAnQHJjLWNvbXBvbmVudC90cmlnZ2VyJztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZm9yd2FyZFJlZiwgdXNlSW1wZXJhdGl2ZUhhbmRsZSwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgcGxhY2VtZW50cyB9IGZyb20gXCIuL3BsYWNlbWVudHNcIjtcbmltcG9ydCBQb3B1cCBmcm9tIFwiLi9Qb3B1cFwiO1xuaW1wb3J0IHVzZUlkIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZUlkXCI7XG52YXIgVG9vbHRpcCA9IGZ1bmN0aW9uIFRvb2x0aXAocHJvcHMsIHJlZikge1xuICB2YXIgb3ZlcmxheUNsYXNzTmFtZSA9IHByb3BzLm92ZXJsYXlDbGFzc05hbWUsXG4gICAgX3Byb3BzJHRyaWdnZXIgPSBwcm9wcy50cmlnZ2VyLFxuICAgIHRyaWdnZXIgPSBfcHJvcHMkdHJpZ2dlciA9PT0gdm9pZCAwID8gWydob3ZlciddIDogX3Byb3BzJHRyaWdnZXIsXG4gICAgX3Byb3BzJG1vdXNlRW50ZXJEZWxhID0gcHJvcHMubW91c2VFbnRlckRlbGF5LFxuICAgIG1vdXNlRW50ZXJEZWxheSA9IF9wcm9wcyRtb3VzZUVudGVyRGVsYSA9PT0gdm9pZCAwID8gMCA6IF9wcm9wcyRtb3VzZUVudGVyRGVsYSxcbiAgICBfcHJvcHMkbW91c2VMZWF2ZURlbGEgPSBwcm9wcy5tb3VzZUxlYXZlRGVsYXksXG4gICAgbW91c2VMZWF2ZURlbGF5ID0gX3Byb3BzJG1vdXNlTGVhdmVEZWxhID09PSB2b2lkIDAgPyAwLjEgOiBfcHJvcHMkbW91c2VMZWF2ZURlbGEsXG4gICAgb3ZlcmxheVN0eWxlID0gcHJvcHMub3ZlcmxheVN0eWxlLFxuICAgIF9wcm9wcyRwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgcHJlZml4Q2xzID0gX3Byb3BzJHByZWZpeENscyA9PT0gdm9pZCAwID8gJ3JjLXRvb2x0aXAnIDogX3Byb3BzJHByZWZpeENscyxcbiAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgIG9uVmlzaWJsZUNoYW5nZSA9IHByb3BzLm9uVmlzaWJsZUNoYW5nZSxcbiAgICBhZnRlclZpc2libGVDaGFuZ2UgPSBwcm9wcy5hZnRlclZpc2libGVDaGFuZ2UsXG4gICAgdHJhbnNpdGlvbk5hbWUgPSBwcm9wcy50cmFuc2l0aW9uTmFtZSxcbiAgICBhbmltYXRpb24gPSBwcm9wcy5hbmltYXRpb24sXG4gICAgbW90aW9uID0gcHJvcHMubW90aW9uLFxuICAgIF9wcm9wcyRwbGFjZW1lbnQgPSBwcm9wcy5wbGFjZW1lbnQsXG4gICAgcGxhY2VtZW50ID0gX3Byb3BzJHBsYWNlbWVudCA9PT0gdm9pZCAwID8gJ3JpZ2h0JyA6IF9wcm9wcyRwbGFjZW1lbnQsXG4gICAgX3Byb3BzJGFsaWduID0gcHJvcHMuYWxpZ24sXG4gICAgYWxpZ24gPSBfcHJvcHMkYWxpZ24gPT09IHZvaWQgMCA/IHt9IDogX3Byb3BzJGFsaWduLFxuICAgIF9wcm9wcyRkZXN0cm95VG9vbHRpcCA9IHByb3BzLmRlc3Ryb3lUb29sdGlwT25IaWRlLFxuICAgIGRlc3Ryb3lUb29sdGlwT25IaWRlID0gX3Byb3BzJGRlc3Ryb3lUb29sdGlwID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRkZXN0cm95VG9vbHRpcCxcbiAgICBkZWZhdWx0VmlzaWJsZSA9IHByb3BzLmRlZmF1bHRWaXNpYmxlLFxuICAgIGdldFRvb2x0aXBDb250YWluZXIgPSBwcm9wcy5nZXRUb29sdGlwQ29udGFpbmVyLFxuICAgIG92ZXJsYXlJbm5lclN0eWxlID0gcHJvcHMub3ZlcmxheUlubmVyU3R5bGUsXG4gICAgYXJyb3dDb250ZW50ID0gcHJvcHMuYXJyb3dDb250ZW50LFxuICAgIG92ZXJsYXkgPSBwcm9wcy5vdmVybGF5LFxuICAgIGlkID0gcHJvcHMuaWQsXG4gICAgX3Byb3BzJHNob3dBcnJvdyA9IHByb3BzLnNob3dBcnJvdyxcbiAgICBzaG93QXJyb3cgPSBfcHJvcHMkc2hvd0Fycm93ID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJHNob3dBcnJvdyxcbiAgICB0b29sdGlwQ2xhc3NOYW1lcyA9IHByb3BzLmNsYXNzTmFtZXMsXG4gICAgdG9vbHRpcFN0eWxlcyA9IHByb3BzLnN0eWxlcyxcbiAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIF9leGNsdWRlZCk7XG4gIHZhciBtZXJnZWRJZCA9IHVzZUlkKGlkKTtcbiAgdmFyIHRyaWdnZXJSZWYgPSB1c2VSZWYobnVsbCk7XG4gIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRyaWdnZXJSZWYuY3VycmVudDtcbiAgfSk7XG4gIHZhciBleHRyYVByb3BzID0gX29iamVjdFNwcmVhZCh7fSwgcmVzdFByb3BzKTtcbiAgaWYgKCd2aXNpYmxlJyBpbiBwcm9wcykge1xuICAgIGV4dHJhUHJvcHMucG9wdXBWaXNpYmxlID0gcHJvcHMudmlzaWJsZTtcbiAgfVxuICB2YXIgZ2V0UG9wdXBFbGVtZW50ID0gZnVuY3Rpb24gZ2V0UG9wdXBFbGVtZW50KCkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQb3B1cCwge1xuICAgICAga2V5OiBcImNvbnRlbnRcIixcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgaWQ6IG1lcmdlZElkLFxuICAgICAgYm9keUNsYXNzTmFtZTogdG9vbHRpcENsYXNzTmFtZXMgPT09IG51bGwgfHwgdG9vbHRpcENsYXNzTmFtZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRvb2x0aXBDbGFzc05hbWVzLmJvZHksXG4gICAgICBvdmVybGF5SW5uZXJTdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBvdmVybGF5SW5uZXJTdHlsZSksIHRvb2x0aXBTdHlsZXMgPT09IG51bGwgfHwgdG9vbHRpcFN0eWxlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogdG9vbHRpcFN0eWxlcy5ib2R5KVxuICAgIH0sIG92ZXJsYXkpO1xuICB9O1xuICB2YXIgZ2V0Q2hpbGRyZW4gPSBmdW5jdGlvbiBnZXRDaGlsZHJlbigpIHtcbiAgICB2YXIgY2hpbGQgPSBSZWFjdC5DaGlsZHJlbi5vbmx5KGNoaWxkcmVuKTtcbiAgICB2YXIgb3JpZ2luYWxQcm9wcyA9IChjaGlsZCA9PT0gbnVsbCB8fCBjaGlsZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2hpbGQucHJvcHMpIHx8IHt9O1xuICAgIHZhciBjaGlsZFByb3BzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBvcmlnaW5hbFByb3BzKSwge30sIHtcbiAgICAgICdhcmlhLWRlc2NyaWJlZGJ5Jzogb3ZlcmxheSA/IG1lcmdlZElkIDogbnVsbFxuICAgIH0pO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkcmVuLCBjaGlsZFByb3BzKTtcbiAgfTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRyaWdnZXIsIF9leHRlbmRzKHtcbiAgICBwb3B1cENsYXNzTmFtZTogY2xhc3NOYW1lcyhvdmVybGF5Q2xhc3NOYW1lLCB0b29sdGlwQ2xhc3NOYW1lcyA9PT0gbnVsbCB8fCB0b29sdGlwQ2xhc3NOYW1lcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogdG9vbHRpcENsYXNzTmFtZXMucm9vdCksXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgcG9wdXA6IGdldFBvcHVwRWxlbWVudCxcbiAgICBhY3Rpb246IHRyaWdnZXIsXG4gICAgYnVpbHRpblBsYWNlbWVudHM6IHBsYWNlbWVudHMsXG4gICAgcG9wdXBQbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICByZWY6IHRyaWdnZXJSZWYsXG4gICAgcG9wdXBBbGlnbjogYWxpZ24sXG4gICAgZ2V0UG9wdXBDb250YWluZXI6IGdldFRvb2x0aXBDb250YWluZXIsXG4gICAgb25Qb3B1cFZpc2libGVDaGFuZ2U6IG9uVmlzaWJsZUNoYW5nZSxcbiAgICBhZnRlclBvcHVwVmlzaWJsZUNoYW5nZTogYWZ0ZXJWaXNpYmxlQ2hhbmdlLFxuICAgIHBvcHVwVHJhbnNpdGlvbk5hbWU6IHRyYW5zaXRpb25OYW1lLFxuICAgIHBvcHVwQW5pbWF0aW9uOiBhbmltYXRpb24sXG4gICAgcG9wdXBNb3Rpb246IG1vdGlvbixcbiAgICBkZWZhdWx0UG9wdXBWaXNpYmxlOiBkZWZhdWx0VmlzaWJsZSxcbiAgICBhdXRvRGVzdHJveTogZGVzdHJveVRvb2x0aXBPbkhpZGUsXG4gICAgbW91c2VMZWF2ZURlbGF5OiBtb3VzZUxlYXZlRGVsYXksXG4gICAgcG9wdXBTdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBvdmVybGF5U3R5bGUpLCB0b29sdGlwU3R5bGVzID09PSBudWxsIHx8IHRvb2x0aXBTdHlsZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRvb2x0aXBTdHlsZXMucm9vdCksXG4gICAgbW91c2VFbnRlckRlbGF5OiBtb3VzZUVudGVyRGVsYXksXG4gICAgYXJyb3c6IHNob3dBcnJvd1xuICB9LCBleHRyYVByb3BzKSwgZ2V0Q2hpbGRyZW4oKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL2ZvcndhcmRSZWYoVG9vbHRpcCk7IiwgInZhciBhdXRvQWRqdXN0T3ZlcmZsb3dUb3BCb3R0b20gPSB7XG4gIHNoaWZ0WDogNjQsXG4gIGFkanVzdFk6IDFcbn07XG52YXIgYXV0b0FkanVzdE92ZXJmbG93TGVmdFJpZ2h0ID0ge1xuICBhZGp1c3RYOiAxLFxuICBzaGlmdFk6IHRydWVcbn07XG52YXIgdGFyZ2V0T2Zmc2V0ID0gWzAsIDBdO1xuZXhwb3J0IHZhciBwbGFjZW1lbnRzID0ge1xuICBsZWZ0OiB7XG4gICAgcG9pbnRzOiBbJ2NyJywgJ2NsJ10sXG4gICAgb3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvd0xlZnRSaWdodCxcbiAgICBvZmZzZXQ6IFstNCwgMF0sXG4gICAgdGFyZ2V0T2Zmc2V0OiB0YXJnZXRPZmZzZXRcbiAgfSxcbiAgcmlnaHQ6IHtcbiAgICBwb2ludHM6IFsnY2wnLCAnY3InXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93TGVmdFJpZ2h0LFxuICAgIG9mZnNldDogWzQsIDBdLFxuICAgIHRhcmdldE9mZnNldDogdGFyZ2V0T2Zmc2V0XG4gIH0sXG4gIHRvcDoge1xuICAgIHBvaW50czogWydiYycsICd0YyddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3dUb3BCb3R0b20sXG4gICAgb2Zmc2V0OiBbMCwgLTRdLFxuICAgIHRhcmdldE9mZnNldDogdGFyZ2V0T2Zmc2V0XG4gIH0sXG4gIGJvdHRvbToge1xuICAgIHBvaW50czogWyd0YycsICdiYyddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3dUb3BCb3R0b20sXG4gICAgb2Zmc2V0OiBbMCwgNF0sXG4gICAgdGFyZ2V0T2Zmc2V0OiB0YXJnZXRPZmZzZXRcbiAgfSxcbiAgdG9wTGVmdDoge1xuICAgIHBvaW50czogWydibCcsICd0bCddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3dUb3BCb3R0b20sXG4gICAgb2Zmc2V0OiBbMCwgLTRdLFxuICAgIHRhcmdldE9mZnNldDogdGFyZ2V0T2Zmc2V0XG4gIH0sXG4gIGxlZnRUb3A6IHtcbiAgICBwb2ludHM6IFsndHInLCAndGwnXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93TGVmdFJpZ2h0LFxuICAgIG9mZnNldDogWy00LCAwXSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICB0b3BSaWdodDoge1xuICAgIHBvaW50czogWydicicsICd0ciddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3dUb3BCb3R0b20sXG4gICAgb2Zmc2V0OiBbMCwgLTRdLFxuICAgIHRhcmdldE9mZnNldDogdGFyZ2V0T2Zmc2V0XG4gIH0sXG4gIHJpZ2h0VG9wOiB7XG4gICAgcG9pbnRzOiBbJ3RsJywgJ3RyJ10sXG4gICAgb3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvd0xlZnRSaWdodCxcbiAgICBvZmZzZXQ6IFs0LCAwXSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICBib3R0b21SaWdodDoge1xuICAgIHBvaW50czogWyd0cicsICdiciddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3dUb3BCb3R0b20sXG4gICAgb2Zmc2V0OiBbMCwgNF0sXG4gICAgdGFyZ2V0T2Zmc2V0OiB0YXJnZXRPZmZzZXRcbiAgfSxcbiAgcmlnaHRCb3R0b206IHtcbiAgICBwb2ludHM6IFsnYmwnLCAnYnInXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93TGVmdFJpZ2h0LFxuICAgIG9mZnNldDogWzQsIDBdLFxuICAgIHRhcmdldE9mZnNldDogdGFyZ2V0T2Zmc2V0XG4gIH0sXG4gIGJvdHRvbUxlZnQ6IHtcbiAgICBwb2ludHM6IFsndGwnLCAnYmwnXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93VG9wQm90dG9tLFxuICAgIG9mZnNldDogWzAsIDRdLFxuICAgIHRhcmdldE9mZnNldDogdGFyZ2V0T2Zmc2V0XG4gIH0sXG4gIGxlZnRCb3R0b206IHtcbiAgICBwb2ludHM6IFsnYnInLCAnYmwnXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93TGVmdFJpZ2h0LFxuICAgIG9mZnNldDogWy00LCAwXSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9XG59O1xuZXhwb3J0IGRlZmF1bHQgcGxhY2VtZW50czsiLCAiaW1wb3J0IFBvcHVwIGZyb20gXCIuL1BvcHVwXCI7XG5pbXBvcnQgVG9vbHRpcCBmcm9tIFwiLi9Ub29sdGlwXCI7XG5leHBvcnQgeyBQb3B1cCB9O1xuZXhwb3J0IGRlZmF1bHQgVG9vbHRpcDsiLCAiaW1wb3J0IHsgdW5pdCB9IGZyb20gJ0BhbnQtZGVzaWduL2Nzc2luanMnO1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFycm93VG9rZW4odG9rZW4pIHtcbiAgY29uc3Qge1xuICAgIHNpemVQb3B1cEFycm93LFxuICAgIGJvcmRlclJhZGl1c1hTLFxuICAgIGJvcmRlclJhZGl1c091dGVyXG4gIH0gPSB0b2tlbjtcbiAgY29uc3QgdW5pdFdpZHRoID0gc2l6ZVBvcHVwQXJyb3cgLyAyO1xuICBjb25zdCBheCA9IDA7XG4gIGNvbnN0IGF5ID0gdW5pdFdpZHRoO1xuICBjb25zdCBieCA9IGJvcmRlclJhZGl1c091dGVyICogMSAvIE1hdGguc3FydCgyKTtcbiAgY29uc3QgYnkgPSB1bml0V2lkdGggLSBib3JkZXJSYWRpdXNPdXRlciAqICgxIC0gMSAvIE1hdGguc3FydCgyKSk7XG4gIGNvbnN0IGN4ID0gdW5pdFdpZHRoIC0gYm9yZGVyUmFkaXVzWFMgKiAoMSAvIE1hdGguc3FydCgyKSk7XG4gIGNvbnN0IGN5ID0gYm9yZGVyUmFkaXVzT3V0ZXIgKiAoTWF0aC5zcXJ0KDIpIC0gMSkgKyBib3JkZXJSYWRpdXNYUyAqICgxIC8gTWF0aC5zcXJ0KDIpKTtcbiAgY29uc3QgZHggPSAyICogdW5pdFdpZHRoIC0gY3g7XG4gIGNvbnN0IGR5ID0gY3k7XG4gIGNvbnN0IGV4ID0gMiAqIHVuaXRXaWR0aCAtIGJ4O1xuICBjb25zdCBleSA9IGJ5O1xuICBjb25zdCBmeCA9IDIgKiB1bml0V2lkdGggLSBheDtcbiAgY29uc3QgZnkgPSBheTtcbiAgY29uc3Qgc2hhZG93V2lkdGggPSB1bml0V2lkdGggKiBNYXRoLnNxcnQoMikgKyBib3JkZXJSYWRpdXNPdXRlciAqIChNYXRoLnNxcnQoMikgLSAyKTtcbiAgY29uc3QgcG9seWdvbk9mZnNldCA9IGJvcmRlclJhZGl1c091dGVyICogKE1hdGguc3FydCgyKSAtIDEpO1xuICBjb25zdCBhcnJvd1BvbHlnb24gPSBgcG9seWdvbigke3BvbHlnb25PZmZzZXR9cHggMTAwJSwgNTAlICR7cG9seWdvbk9mZnNldH1weCwgJHsyICogdW5pdFdpZHRoIC0gcG9seWdvbk9mZnNldH1weCAxMDAlLCAke3BvbHlnb25PZmZzZXR9cHggMTAwJSlgO1xuICBjb25zdCBhcnJvd1BhdGggPSBgcGF0aCgnTSAke2F4fSAke2F5fSBBICR7Ym9yZGVyUmFkaXVzT3V0ZXJ9ICR7Ym9yZGVyUmFkaXVzT3V0ZXJ9IDAgMCAwICR7Ynh9ICR7Ynl9IEwgJHtjeH0gJHtjeX0gQSAke2JvcmRlclJhZGl1c1hTfSAke2JvcmRlclJhZGl1c1hTfSAwIDAgMSAke2R4fSAke2R5fSBMICR7ZXh9ICR7ZXl9IEEgJHtib3JkZXJSYWRpdXNPdXRlcn0gJHtib3JkZXJSYWRpdXNPdXRlcn0gMCAwIDAgJHtmeH0gJHtmeX0gWicpYDtcbiAgcmV0dXJuIHtcbiAgICBhcnJvd1NoYWRvd1dpZHRoOiBzaGFkb3dXaWR0aCxcbiAgICBhcnJvd1BhdGgsXG4gICAgYXJyb3dQb2x5Z29uXG4gIH07XG59XG5leHBvcnQgY29uc3QgZ2VuUm91bmRlZEFycm93ID0gKHRva2VuLCBiZ0NvbG9yLCBib3hTaGFkb3cpID0+IHtcbiAgY29uc3Qge1xuICAgIHNpemVQb3B1cEFycm93LFxuICAgIGFycm93UG9seWdvbixcbiAgICBhcnJvd1BhdGgsXG4gICAgYXJyb3dTaGFkb3dXaWR0aCxcbiAgICBib3JkZXJSYWRpdXNYUyxcbiAgICBjYWxjXG4gIH0gPSB0b2tlbjtcbiAgcmV0dXJuIHtcbiAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gICAgd2lkdGg6IHNpemVQb3B1cEFycm93LFxuICAgIGhlaWdodDogc2l6ZVBvcHVwQXJyb3csXG4gICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICcmOjpiZWZvcmUnOiB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIGJvdHRvbTogMCxcbiAgICAgIGluc2V0SW5saW5lU3RhcnQ6IDAsXG4gICAgICB3aWR0aDogc2l6ZVBvcHVwQXJyb3csXG4gICAgICBoZWlnaHQ6IGNhbGMoc2l6ZVBvcHVwQXJyb3cpLmRpdigyKS5lcXVhbCgpLFxuICAgICAgYmFja2dyb3VuZDogYmdDb2xvcixcbiAgICAgIGNsaXBQYXRoOiB7XG4gICAgICAgIF9tdWx0aV92YWx1ZV86IHRydWUsXG4gICAgICAgIHZhbHVlOiBbYXJyb3dQb2x5Z29uLCBhcnJvd1BhdGhdXG4gICAgICB9LFxuICAgICAgY29udGVudDogJ1wiXCInXG4gICAgfSxcbiAgICAnJjo6YWZ0ZXInOiB7XG4gICAgICBjb250ZW50OiAnXCJcIicsXG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIHdpZHRoOiBhcnJvd1NoYWRvd1dpZHRoLFxuICAgICAgaGVpZ2h0OiBhcnJvd1NoYWRvd1dpZHRoLFxuICAgICAgYm90dG9tOiAwLFxuICAgICAgaW5zZXRJbmxpbmU6IDAsXG4gICAgICBtYXJnaW46ICdhdXRvJyxcbiAgICAgIGJvcmRlclJhZGl1czoge1xuICAgICAgICBfc2tpcF9jaGVja186IHRydWUsXG4gICAgICAgIHZhbHVlOiBgMCAwICR7dW5pdChib3JkZXJSYWRpdXNYUyl9IDBgXG4gICAgICB9LFxuICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSg1MCUpIHJvdGF0ZSgtMTM1ZGVnKScsXG4gICAgICBib3hTaGFkb3csXG4gICAgICB6SW5kZXg6IDAsXG4gICAgICBiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnXG4gICAgfVxuICB9O1xufTsiLCAiaW1wb3J0IHsgdW5pdCB9IGZyb20gJ0BhbnQtZGVzaWduL2Nzc2luanMnO1xuaW1wb3J0IHsgZ2VuUm91bmRlZEFycm93IH0gZnJvbSAnLi9yb3VuZGVkQXJyb3cnO1xuZXhwb3J0IGNvbnN0IE1BWF9WRVJUSUNBTF9DT05URU5UX1JBRElVUyA9IDg7XG5leHBvcnQgZnVuY3Rpb24gZ2V0QXJyb3dPZmZzZXRUb2tlbihvcHRpb25zKSB7XG4gIGNvbnN0IHtcbiAgICBjb250ZW50UmFkaXVzLFxuICAgIGxpbWl0VmVydGljYWxSYWRpdXNcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGFycm93T2Zmc2V0ID0gY29udGVudFJhZGl1cyA+IDEyID8gY29udGVudFJhZGl1cyArIDIgOiAxMjtcbiAgY29uc3QgYXJyb3dPZmZzZXRWZXJ0aWNhbCA9IGxpbWl0VmVydGljYWxSYWRpdXMgPyBNQVhfVkVSVElDQUxfQ09OVEVOVF9SQURJVVMgOiBhcnJvd09mZnNldDtcbiAgcmV0dXJuIHtcbiAgICBhcnJvd09mZnNldEhvcml6b250YWw6IGFycm93T2Zmc2V0LFxuICAgIGFycm93T2Zmc2V0VmVydGljYWxcbiAgfTtcbn1cbmZ1bmN0aW9uIGlzSW5qZWN0KHZhbGlkLCBjb2RlKSB7XG4gIGlmICghdmFsaWQpIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgcmV0dXJuIGNvZGU7XG59XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRBcnJvd1N0eWxlKHRva2VuLCBjb2xvckJnLCBvcHRpb25zKSB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHMsXG4gICAgYm94U2hhZG93UG9wb3ZlckFycm93LFxuICAgIGFycm93T2Zmc2V0VmVydGljYWwsXG4gICAgYXJyb3dPZmZzZXRIb3Jpem9udGFsXG4gIH0gPSB0b2tlbjtcbiAgY29uc3Qge1xuICAgIGFycm93RGlzdGFuY2UgPSAwLFxuICAgIGFycm93UGxhY2VtZW50ID0ge1xuICAgICAgbGVmdDogdHJ1ZSxcbiAgICAgIHJpZ2h0OiB0cnVlLFxuICAgICAgdG9wOiB0cnVlLFxuICAgICAgYm90dG9tOiB0cnVlXG4gICAgfVxuICB9ID0gb3B0aW9ucyB8fCB7fTtcbiAgcmV0dXJuIHtcbiAgICBbY29tcG9uZW50Q2xzXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7XG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IEJhc2ljID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWFycm93YF06IFtPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe1xuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgekluZGV4OiAxLFxuICAgICAgICBkaXNwbGF5OiAnYmxvY2snXG4gICAgICB9LCBnZW5Sb3VuZGVkQXJyb3codG9rZW4sIGNvbG9yQmcsIGJveFNoYWRvd1BvcG92ZXJBcnJvdykpLCB7XG4gICAgICAgICcmOmJlZm9yZSc6IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kOiBjb2xvckJnXG4gICAgICAgIH1cbiAgICAgIH0pXVxuICAgIH0sIGlzSW5qZWN0KCEhYXJyb3dQbGFjZW1lbnQudG9wLCB7XG4gICAgICBbW2AmLXBsYWNlbWVudC10b3AgPiAke2NvbXBvbmVudENsc30tYXJyb3dgLCBgJi1wbGFjZW1lbnQtdG9wTGVmdCA+ICR7Y29tcG9uZW50Q2xzfS1hcnJvd2AsIGAmLXBsYWNlbWVudC10b3BSaWdodCA+ICR7Y29tcG9uZW50Q2xzfS1hcnJvd2BdLmpvaW4oJywnKV06IHtcbiAgICAgICAgYm90dG9tOiBhcnJvd0Rpc3RhbmNlLFxuICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDEwMCUpIHJvdGF0ZSgxODBkZWcpJ1xuICAgICAgfSxcbiAgICAgIFtgJi1wbGFjZW1lbnQtdG9wID4gJHtjb21wb25lbnRDbHN9LWFycm93YF06IHtcbiAgICAgICAgbGVmdDoge1xuICAgICAgICAgIF9za2lwX2NoZWNrXzogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZTogJzUwJSdcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgtNTAlKSB0cmFuc2xhdGVZKDEwMCUpIHJvdGF0ZSgxODBkZWcpJ1xuICAgICAgfSxcbiAgICAgICcmLXBsYWNlbWVudC10b3BMZWZ0Jzoge1xuICAgICAgICAnLS1hcnJvdy1vZmZzZXQtaG9yaXpvbnRhbCc6IGFycm93T2Zmc2V0SG9yaXpvbnRhbCxcbiAgICAgICAgW2A+ICR7Y29tcG9uZW50Q2xzfS1hcnJvd2BdOiB7XG4gICAgICAgICAgbGVmdDoge1xuICAgICAgICAgICAgX3NraXBfY2hlY2tfOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IGFycm93T2Zmc2V0SG9yaXpvbnRhbFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICcmLXBsYWNlbWVudC10b3BSaWdodCc6IHtcbiAgICAgICAgJy0tYXJyb3ctb2Zmc2V0LWhvcml6b250YWwnOiBgY2FsYygxMDAlIC0gJHt1bml0KGFycm93T2Zmc2V0SG9yaXpvbnRhbCl9KWAsXG4gICAgICAgIFtgPiAke2NvbXBvbmVudENsc30tYXJyb3dgXToge1xuICAgICAgICAgIHJpZ2h0OiB7XG4gICAgICAgICAgICBfc2tpcF9jaGVja186IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogYXJyb3dPZmZzZXRIb3Jpem9udGFsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkpLCBpc0luamVjdCghIWFycm93UGxhY2VtZW50LmJvdHRvbSwge1xuICAgICAgW1tgJi1wbGFjZW1lbnQtYm90dG9tID4gJHtjb21wb25lbnRDbHN9LWFycm93YCwgYCYtcGxhY2VtZW50LWJvdHRvbUxlZnQgPiAke2NvbXBvbmVudENsc30tYXJyb3dgLCBgJi1wbGFjZW1lbnQtYm90dG9tUmlnaHQgPiAke2NvbXBvbmVudENsc30tYXJyb3dgXS5qb2luKCcsJyldOiB7XG4gICAgICAgIHRvcDogYXJyb3dEaXN0YW5jZSxcbiAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlWSgtMTAwJSlgXG4gICAgICB9LFxuICAgICAgW2AmLXBsYWNlbWVudC1ib3R0b20gPiAke2NvbXBvbmVudENsc30tYXJyb3dgXToge1xuICAgICAgICBsZWZ0OiB7XG4gICAgICAgICAgX3NraXBfY2hlY2tfOiB0cnVlLFxuICAgICAgICAgIHZhbHVlOiAnNTAlJ1xuICAgICAgICB9LFxuICAgICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoLTEwMCUpYFxuICAgICAgfSxcbiAgICAgICcmLXBsYWNlbWVudC1ib3R0b21MZWZ0Jzoge1xuICAgICAgICAnLS1hcnJvdy1vZmZzZXQtaG9yaXpvbnRhbCc6IGFycm93T2Zmc2V0SG9yaXpvbnRhbCxcbiAgICAgICAgW2A+ICR7Y29tcG9uZW50Q2xzfS1hcnJvd2BdOiB7XG4gICAgICAgICAgbGVmdDoge1xuICAgICAgICAgICAgX3NraXBfY2hlY2tfOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IGFycm93T2Zmc2V0SG9yaXpvbnRhbFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICcmLXBsYWNlbWVudC1ib3R0b21SaWdodCc6IHtcbiAgICAgICAgJy0tYXJyb3ctb2Zmc2V0LWhvcml6b250YWwnOiBgY2FsYygxMDAlIC0gJHt1bml0KGFycm93T2Zmc2V0SG9yaXpvbnRhbCl9KWAsXG4gICAgICAgIFtgPiAke2NvbXBvbmVudENsc30tYXJyb3dgXToge1xuICAgICAgICAgIHJpZ2h0OiB7XG4gICAgICAgICAgICBfc2tpcF9jaGVja186IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogYXJyb3dPZmZzZXRIb3Jpem9udGFsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkpLCBpc0luamVjdCghIWFycm93UGxhY2VtZW50LmxlZnQsIHtcbiAgICAgIFtbYCYtcGxhY2VtZW50LWxlZnQgPiAke2NvbXBvbmVudENsc30tYXJyb3dgLCBgJi1wbGFjZW1lbnQtbGVmdFRvcCA+ICR7Y29tcG9uZW50Q2xzfS1hcnJvd2AsIGAmLXBsYWNlbWVudC1sZWZ0Qm90dG9tID4gJHtjb21wb25lbnRDbHN9LWFycm93YF0uam9pbignLCcpXToge1xuICAgICAgICByaWdodDoge1xuICAgICAgICAgIF9za2lwX2NoZWNrXzogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZTogYXJyb3dEaXN0YW5jZVxuICAgICAgICB9LFxuICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDEwMCUpIHJvdGF0ZSg5MGRlZyknXG4gICAgICB9LFxuICAgICAgW2AmLXBsYWNlbWVudC1sZWZ0ID4gJHtjb21wb25lbnRDbHN9LWFycm93YF06IHtcbiAgICAgICAgdG9wOiB7XG4gICAgICAgICAgX3NraXBfY2hlY2tfOiB0cnVlLFxuICAgICAgICAgIHZhbHVlOiAnNTAlJ1xuICAgICAgICB9LFxuICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKC01MCUpIHRyYW5zbGF0ZVgoMTAwJSkgcm90YXRlKDkwZGVnKSdcbiAgICAgIH0sXG4gICAgICBbYCYtcGxhY2VtZW50LWxlZnRUb3AgPiAke2NvbXBvbmVudENsc30tYXJyb3dgXToge1xuICAgICAgICB0b3A6IGFycm93T2Zmc2V0VmVydGljYWxcbiAgICAgIH0sXG4gICAgICBbYCYtcGxhY2VtZW50LWxlZnRCb3R0b20gPiAke2NvbXBvbmVudENsc30tYXJyb3dgXToge1xuICAgICAgICBib3R0b206IGFycm93T2Zmc2V0VmVydGljYWxcbiAgICAgIH1cbiAgICB9KSksIGlzSW5qZWN0KCEhYXJyb3dQbGFjZW1lbnQucmlnaHQsIHtcbiAgICAgIFtbYCYtcGxhY2VtZW50LXJpZ2h0ID4gJHtjb21wb25lbnRDbHN9LWFycm93YCwgYCYtcGxhY2VtZW50LXJpZ2h0VG9wID4gJHtjb21wb25lbnRDbHN9LWFycm93YCwgYCYtcGxhY2VtZW50LXJpZ2h0Qm90dG9tID4gJHtjb21wb25lbnRDbHN9LWFycm93YF0uam9pbignLCcpXToge1xuICAgICAgICBsZWZ0OiB7XG4gICAgICAgICAgX3NraXBfY2hlY2tfOiB0cnVlLFxuICAgICAgICAgIHZhbHVlOiBhcnJvd0Rpc3RhbmNlXG4gICAgICAgIH0sXG4gICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoLTEwMCUpIHJvdGF0ZSgtOTBkZWcpJ1xuICAgICAgfSxcbiAgICAgIFtgJi1wbGFjZW1lbnQtcmlnaHQgPiAke2NvbXBvbmVudENsc30tYXJyb3dgXToge1xuICAgICAgICB0b3A6IHtcbiAgICAgICAgICBfc2tpcF9jaGVja186IHRydWUsXG4gICAgICAgICAgdmFsdWU6ICc1MCUnXG4gICAgICAgIH0sXG4gICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoLTUwJSkgdHJhbnNsYXRlWCgtMTAwJSkgcm90YXRlKC05MGRlZyknXG4gICAgICB9LFxuICAgICAgW2AmLXBsYWNlbWVudC1yaWdodFRvcCA+ICR7Y29tcG9uZW50Q2xzfS1hcnJvd2BdOiB7XG4gICAgICAgIHRvcDogYXJyb3dPZmZzZXRWZXJ0aWNhbFxuICAgICAgfSxcbiAgICAgIFtgJi1wbGFjZW1lbnQtcmlnaHRCb3R0b20gPiAke2NvbXBvbmVudENsc30tYXJyb3dgXToge1xuICAgICAgICBib3R0b206IGFycm93T2Zmc2V0VmVydGljYWxcbiAgICAgIH1cbiAgICB9KSlcbiAgfTtcbn0iLCAiaW1wb3J0IHsgZ2V0QXJyb3dPZmZzZXRUb2tlbiB9IGZyb20gJy4uL3N0eWxlL3BsYWNlbWVudEFycm93JztcbmV4cG9ydCBmdW5jdGlvbiBnZXRPdmVyZmxvd09wdGlvbnMocGxhY2VtZW50LCBhcnJvd09mZnNldCwgYXJyb3dXaWR0aCwgYXV0b0FkanVzdE92ZXJmbG93KSB7XG4gIGlmIChhdXRvQWRqdXN0T3ZlcmZsb3cgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFkanVzdFg6IGZhbHNlLFxuICAgICAgYWRqdXN0WTogZmFsc2VcbiAgICB9O1xuICB9XG4gIGNvbnN0IG92ZXJmbG93ID0gYXV0b0FkanVzdE92ZXJmbG93ICYmIHR5cGVvZiBhdXRvQWRqdXN0T3ZlcmZsb3cgPT09ICdvYmplY3QnID8gYXV0b0FkanVzdE92ZXJmbG93IDoge307XG4gIGNvbnN0IGJhc2VPdmVyZmxvdyA9IHt9O1xuICBzd2l0Y2ggKHBsYWNlbWVudCkge1xuICAgIGNhc2UgJ3RvcCc6XG4gICAgY2FzZSAnYm90dG9tJzpcbiAgICAgIGJhc2VPdmVyZmxvdy5zaGlmdFggPSBhcnJvd09mZnNldC5hcnJvd09mZnNldEhvcml6b250YWwgKiAyICsgYXJyb3dXaWR0aDtcbiAgICAgIGJhc2VPdmVyZmxvdy5zaGlmdFkgPSB0cnVlO1xuICAgICAgYmFzZU92ZXJmbG93LmFkanVzdFkgPSB0cnVlO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbGVmdCc6XG4gICAgY2FzZSAncmlnaHQnOlxuICAgICAgYmFzZU92ZXJmbG93LnNoaWZ0WSA9IGFycm93T2Zmc2V0LmFycm93T2Zmc2V0VmVydGljYWwgKiAyICsgYXJyb3dXaWR0aDtcbiAgICAgIGJhc2VPdmVyZmxvdy5zaGlmdFggPSB0cnVlO1xuICAgICAgYmFzZU92ZXJmbG93LmFkanVzdFggPSB0cnVlO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgY29uc3QgbWVyZ2VkT3ZlcmZsb3cgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJhc2VPdmVyZmxvdyksIG92ZXJmbG93KTtcbiAgLy8gU3VwcG9ydCBhdXRvIHNoaWZ0XG4gIGlmICghbWVyZ2VkT3ZlcmZsb3cuc2hpZnRYKSB7XG4gICAgbWVyZ2VkT3ZlcmZsb3cuYWRqdXN0WCA9IHRydWU7XG4gIH1cbiAgaWYgKCFtZXJnZWRPdmVyZmxvdy5zaGlmdFkpIHtcbiAgICBtZXJnZWRPdmVyZmxvdy5hZGp1c3RZID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gbWVyZ2VkT3ZlcmZsb3c7XG59XG5jb25zdCBQbGFjZW1lbnRBbGlnbk1hcCA9IHtcbiAgbGVmdDoge1xuICAgIHBvaW50czogWydjcicsICdjbCddXG4gIH0sXG4gIHJpZ2h0OiB7XG4gICAgcG9pbnRzOiBbJ2NsJywgJ2NyJ11cbiAgfSxcbiAgdG9wOiB7XG4gICAgcG9pbnRzOiBbJ2JjJywgJ3RjJ11cbiAgfSxcbiAgYm90dG9tOiB7XG4gICAgcG9pbnRzOiBbJ3RjJywgJ2JjJ11cbiAgfSxcbiAgdG9wTGVmdDoge1xuICAgIHBvaW50czogWydibCcsICd0bCddXG4gIH0sXG4gIGxlZnRUb3A6IHtcbiAgICBwb2ludHM6IFsndHInLCAndGwnXVxuICB9LFxuICB0b3BSaWdodDoge1xuICAgIHBvaW50czogWydicicsICd0ciddXG4gIH0sXG4gIHJpZ2h0VG9wOiB7XG4gICAgcG9pbnRzOiBbJ3RsJywgJ3RyJ11cbiAgfSxcbiAgYm90dG9tUmlnaHQ6IHtcbiAgICBwb2ludHM6IFsndHInLCAnYnInXVxuICB9LFxuICByaWdodEJvdHRvbToge1xuICAgIHBvaW50czogWydibCcsICdiciddXG4gIH0sXG4gIGJvdHRvbUxlZnQ6IHtcbiAgICBwb2ludHM6IFsndGwnLCAnYmwnXVxuICB9LFxuICBsZWZ0Qm90dG9tOiB7XG4gICAgcG9pbnRzOiBbJ2JyJywgJ2JsJ11cbiAgfVxufTtcbmNvbnN0IEFycm93Q2VudGVyUGxhY2VtZW50QWxpZ25NYXAgPSB7XG4gIHRvcExlZnQ6IHtcbiAgICBwb2ludHM6IFsnYmwnLCAndGMnXVxuICB9LFxuICBsZWZ0VG9wOiB7XG4gICAgcG9pbnRzOiBbJ3RyJywgJ2NsJ11cbiAgfSxcbiAgdG9wUmlnaHQ6IHtcbiAgICBwb2ludHM6IFsnYnInLCAndGMnXVxuICB9LFxuICByaWdodFRvcDoge1xuICAgIHBvaW50czogWyd0bCcsICdjciddXG4gIH0sXG4gIGJvdHRvbVJpZ2h0OiB7XG4gICAgcG9pbnRzOiBbJ3RyJywgJ2JjJ11cbiAgfSxcbiAgcmlnaHRCb3R0b206IHtcbiAgICBwb2ludHM6IFsnYmwnLCAnY3InXVxuICB9LFxuICBib3R0b21MZWZ0OiB7XG4gICAgcG9pbnRzOiBbJ3RsJywgJ2JjJ11cbiAgfSxcbiAgbGVmdEJvdHRvbToge1xuICAgIHBvaW50czogWydicicsICdjbCddXG4gIH1cbn07XG5jb25zdCBEaXNhYmxlQXV0b0Fycm93TGlzdCA9IG5ldyBTZXQoWyd0b3BMZWZ0JywgJ3RvcFJpZ2h0JywgJ2JvdHRvbUxlZnQnLCAnYm90dG9tUmlnaHQnLCAnbGVmdFRvcCcsICdsZWZ0Qm90dG9tJywgJ3JpZ2h0VG9wJywgJ3JpZ2h0Qm90dG9tJ10pO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0UGxhY2VtZW50cyhjb25maWcpIHtcbiAgY29uc3Qge1xuICAgIGFycm93V2lkdGgsXG4gICAgYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIGFycm93UG9pbnRBdENlbnRlcixcbiAgICBvZmZzZXQsXG4gICAgYm9yZGVyUmFkaXVzLFxuICAgIHZpc2libGVGaXJzdFxuICB9ID0gY29uZmlnO1xuICBjb25zdCBoYWxmQXJyb3dXaWR0aCA9IGFycm93V2lkdGggLyAyO1xuICBjb25zdCBwbGFjZW1lbnRNYXAgPSB7fTtcbiAgT2JqZWN0LmtleXMoUGxhY2VtZW50QWxpZ25NYXApLmZvckVhY2goa2V5ID0+IHtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGFycm93UG9pbnRBdENlbnRlciAmJiBBcnJvd0NlbnRlclBsYWNlbWVudEFsaWduTWFwW2tleV0gfHwgUGxhY2VtZW50QWxpZ25NYXBba2V5XTtcbiAgICBjb25zdCBwbGFjZW1lbnRJbmZvID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0ZW1wbGF0ZSksIHtcbiAgICAgIG9mZnNldDogWzAsIDBdLFxuICAgICAgZHluYW1pY0luc2V0OiB0cnVlXG4gICAgfSk7XG4gICAgcGxhY2VtZW50TWFwW2tleV0gPSBwbGFjZW1lbnRJbmZvO1xuICAgIC8vIERpc2FibGUgYXV0b0Fycm93IHNpbmNlIGRlc2lnbiBpcyBmaXhlZCBwb3NpdGlvblxuICAgIGlmIChEaXNhYmxlQXV0b0Fycm93TGlzdC5oYXMoa2V5KSkge1xuICAgICAgcGxhY2VtZW50SW5mby5hdXRvQXJyb3cgPSBmYWxzZTtcbiAgICB9XG4gICAgLy8gU3RhdGljIG9mZnNldFxuICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICBjYXNlICd0b3AnOlxuICAgICAgY2FzZSAndG9wTGVmdCc6XG4gICAgICBjYXNlICd0b3BSaWdodCc6XG4gICAgICAgIHBsYWNlbWVudEluZm8ub2Zmc2V0WzFdID0gLWhhbGZBcnJvd1dpZHRoIC0gb2Zmc2V0O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICBjYXNlICdib3R0b21MZWZ0JzpcbiAgICAgIGNhc2UgJ2JvdHRvbVJpZ2h0JzpcbiAgICAgICAgcGxhY2VtZW50SW5mby5vZmZzZXRbMV0gPSBoYWxmQXJyb3dXaWR0aCArIG9mZnNldDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdsZWZ0JzpcbiAgICAgIGNhc2UgJ2xlZnRUb3AnOlxuICAgICAgY2FzZSAnbGVmdEJvdHRvbSc6XG4gICAgICAgIHBsYWNlbWVudEluZm8ub2Zmc2V0WzBdID0gLWhhbGZBcnJvd1dpZHRoIC0gb2Zmc2V0O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgIGNhc2UgJ3JpZ2h0VG9wJzpcbiAgICAgIGNhc2UgJ3JpZ2h0Qm90dG9tJzpcbiAgICAgICAgcGxhY2VtZW50SW5mby5vZmZzZXRbMF0gPSBoYWxmQXJyb3dXaWR0aCArIG9mZnNldDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC8vIER5bmFtaWMgb2Zmc2V0XG4gICAgY29uc3QgYXJyb3dPZmZzZXQgPSBnZXRBcnJvd09mZnNldFRva2VuKHtcbiAgICAgIGNvbnRlbnRSYWRpdXM6IGJvcmRlclJhZGl1cyxcbiAgICAgIGxpbWl0VmVydGljYWxSYWRpdXM6IHRydWVcbiAgICB9KTtcbiAgICBpZiAoYXJyb3dQb2ludEF0Q2VudGVyKSB7XG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlICd0b3BMZWZ0JzpcbiAgICAgICAgY2FzZSAnYm90dG9tTGVmdCc6XG4gICAgICAgICAgcGxhY2VtZW50SW5mby5vZmZzZXRbMF0gPSAtYXJyb3dPZmZzZXQuYXJyb3dPZmZzZXRIb3Jpem9udGFsIC0gaGFsZkFycm93V2lkdGg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RvcFJpZ2h0JzpcbiAgICAgICAgY2FzZSAnYm90dG9tUmlnaHQnOlxuICAgICAgICAgIHBsYWNlbWVudEluZm8ub2Zmc2V0WzBdID0gYXJyb3dPZmZzZXQuYXJyb3dPZmZzZXRIb3Jpem9udGFsICsgaGFsZkFycm93V2lkdGg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2xlZnRUb3AnOlxuICAgICAgICBjYXNlICdyaWdodFRvcCc6XG4gICAgICAgICAgcGxhY2VtZW50SW5mby5vZmZzZXRbMV0gPSAtYXJyb3dPZmZzZXQuYXJyb3dPZmZzZXRIb3Jpem9udGFsICogMiArIGhhbGZBcnJvd1dpZHRoO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdsZWZ0Qm90dG9tJzpcbiAgICAgICAgY2FzZSAncmlnaHRCb3R0b20nOlxuICAgICAgICAgIHBsYWNlbWVudEluZm8ub2Zmc2V0WzFdID0gYXJyb3dPZmZzZXQuYXJyb3dPZmZzZXRIb3Jpem9udGFsICogMiAtIGhhbGZBcnJvd1dpZHRoO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBPdmVyZmxvd1xuICAgIHBsYWNlbWVudEluZm8ub3ZlcmZsb3cgPSBnZXRPdmVyZmxvd09wdGlvbnMoa2V5LCBhcnJvd09mZnNldCwgYXJyb3dXaWR0aCwgYXV0b0FkanVzdE92ZXJmbG93KTtcbiAgICAvLyBWaXNpYmxlRmlyc3RcbiAgICBpZiAodmlzaWJsZUZpcnN0KSB7XG4gICAgICBwbGFjZW1lbnRJbmZvLmh0bWxSZWdpb24gPSAndmlzaWJsZUZpcnN0JztcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcGxhY2VtZW50TWFwO1xufSIsICJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyBQb3B1cCB9IGZyb20gJ3JjLXRvb2x0aXAnO1xuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgdXNlU3R5bGUgZnJvbSAnLi9zdHlsZSc7XG5pbXBvcnQgeyBwYXJzZUNvbG9yIH0gZnJvbSAnLi91dGlsJztcbi8qKiBAcHJpdmF0ZSBJbnRlcm5hbCBDb21wb25lbnQuIERvIG5vdCB1c2UgaW4geW91ciBwcm9kdWN0aW9uLiAqL1xuY29uc3QgUHVyZVBhbmVsID0gcHJvcHMgPT4ge1xuICBjb25zdCB7XG4gICAgcHJlZml4Q2xzOiBjdXN0b21pemVQcmVmaXhDbHMsXG4gICAgY2xhc3NOYW1lLFxuICAgIHBsYWNlbWVudCA9ICd0b3AnLFxuICAgIHRpdGxlLFxuICAgIGNvbG9yLFxuICAgIG92ZXJsYXlJbm5lclN0eWxlXG4gIH0gPSBwcm9wcztcbiAgY29uc3Qge1xuICAgIGdldFByZWZpeENsc1xuICB9ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KTtcbiAgY29uc3QgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCd0b29sdGlwJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgY29uc3QgW3dyYXBDU1NWYXIsIGhhc2hJZCwgY3NzVmFyQ2xzXSA9IHVzZVN0eWxlKHByZWZpeENscyk7XG4gIC8vIENvbG9yXG4gIGNvbnN0IGNvbG9ySW5mbyA9IHBhcnNlQ29sb3IocHJlZml4Q2xzLCBjb2xvcik7XG4gIGNvbnN0IGFycm93Q29udGVudFN0eWxlID0gY29sb3JJbmZvLmFycm93U3R5bGU7XG4gIGNvbnN0IGZvcm1hdHRlZE92ZXJsYXlJbm5lclN0eWxlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvdmVybGF5SW5uZXJTdHlsZSksIGNvbG9ySW5mby5vdmVybGF5U3R5bGUpO1xuICBjb25zdCBjbHMgPSBjbGFzc05hbWVzKGhhc2hJZCwgY3NzVmFyQ2xzLCBwcmVmaXhDbHMsIGAke3ByZWZpeENsc30tcHVyZWAsIGAke3ByZWZpeENsc30tcGxhY2VtZW50LSR7cGxhY2VtZW50fWAsIGNsYXNzTmFtZSwgY29sb3JJbmZvLmNsYXNzTmFtZSk7XG4gIHJldHVybiB3cmFwQ1NTVmFyKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNscyxcbiAgICBzdHlsZTogYXJyb3dDb250ZW50U3R5bGVcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogYCR7cHJlZml4Q2xzfS1hcnJvd2BcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBvcHVwLCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgIGNsYXNzTmFtZTogaGFzaElkLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIG92ZXJsYXlJbm5lclN0eWxlOiBmb3JtYXR0ZWRPdmVybGF5SW5uZXJTdHlsZVxuICB9KSwgdGl0bGUpKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgUHVyZVBhbmVsOyIsICJpbXBvcnQgeyB1bml0IH0gZnJvbSAnQGFudC1kZXNpZ24vY3NzaW5qcyc7XG5pbXBvcnQgeyByZXNldENvbXBvbmVudCB9IGZyb20gJy4uLy4uL3N0eWxlJztcbmltcG9ydCB7IGluaXRab29tTW90aW9uIH0gZnJvbSAnLi4vLi4vc3R5bGUvbW90aW9uJztcbmltcG9ydCBnZXRBcnJvd1N0eWxlLCB7IGdldEFycm93T2Zmc2V0VG9rZW4sIE1BWF9WRVJUSUNBTF9DT05URU5UX1JBRElVUyB9IGZyb20gJy4uLy4uL3N0eWxlL3BsYWNlbWVudEFycm93JztcbmltcG9ydCB7IGdldEFycm93VG9rZW4gfSBmcm9tICcuLi8uLi9zdHlsZS9yb3VuZGVkQXJyb3cnO1xuaW1wb3J0IHsgZ2VuUHJlc2V0Q29sb3IsIGdlblN0eWxlSG9va3MsIG1lcmdlVG9rZW4gfSBmcm9tICcuLi8uLi90aGVtZS9pbnRlcm5hbCc7XG5jb25zdCBnZW5Ub29sdGlwU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjYWxjLFxuICAgIGNvbXBvbmVudENscyxcbiAgICAvLyBhbnQtdG9vbHRpcFxuICAgIHRvb2x0aXBNYXhXaWR0aCxcbiAgICB0b29sdGlwQ29sb3IsXG4gICAgdG9vbHRpcEJnLFxuICAgIHRvb2x0aXBCb3JkZXJSYWRpdXMsXG4gICAgekluZGV4UG9wdXAsXG4gICAgY29udHJvbEhlaWdodCxcbiAgICBib3hTaGFkb3dTZWNvbmRhcnksXG4gICAgcGFkZGluZ1NNLFxuICAgIHBhZGRpbmdYUyxcbiAgICBhcnJvd09mZnNldEhvcml6b250YWwsXG4gICAgc2l6ZVBvcHVwQXJyb3dcbiAgfSA9IHRva2VuO1xuICAvLyBhcnJvd09mZnNldEhvcml6b250YWwgKyBhcnJvd1dpZHRoICsgYm9yZGVyUmFkaXVzXG4gIGNvbnN0IGVkZ2VBbGlnbk1pbldpZHRoID0gY2FsYyh0b29sdGlwQm9yZGVyUmFkaXVzKS5hZGQoc2l6ZVBvcHVwQXJyb3cpLmFkZChhcnJvd09mZnNldEhvcml6b250YWwpLmVxdWFsKCk7XG4gIC8vIGJvcmRlclJhZGl1cyAqIDIgKyBhcnJvd1dpZHRoXG4gIGNvbnN0IGNlbnRlckFsaWduTWluV2lkdGggPSBjYWxjKHRvb2x0aXBCb3JkZXJSYWRpdXMpLm11bCgyKS5hZGQoc2l6ZVBvcHVwQXJyb3cpLmVxdWFsKCk7XG4gIHJldHVybiBbe1xuICAgIFtjb21wb25lbnRDbHNdOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXNldENvbXBvbmVudCh0b2tlbikpLCB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIHpJbmRleDogekluZGV4UG9wdXAsXG4gICAgICBkaXNwbGF5OiAnYmxvY2snLFxuICAgICAgd2lkdGg6ICdtYXgtY29udGVudCcsXG4gICAgICBtYXhXaWR0aDogdG9vbHRpcE1heFdpZHRoLFxuICAgICAgdmlzaWJpbGl0eTogJ3Zpc2libGUnLFxuICAgICAgLy8gV2hlbiB1c2UgYGF1dG9BcnJvd2AsIG9yaWdpbiB3aWxsIGZvbGxvdyB0aGUgYXJyb3cgcG9zaXRpb25cbiAgICAgICctLXZhbGlkLW9mZnNldC14JzogJ3ZhcigtLWFycm93LW9mZnNldC1ob3Jpem9udGFsLCB2YXIoLS1hcnJvdy14KSknLFxuICAgICAgdHJhbnNmb3JtT3JpZ2luOiBbYHZhcigtLXZhbGlkLW9mZnNldC14LCA1MCUpYCwgYHZhcigtLWFycm93LXksIDUwJSlgXS5qb2luKCcgJyksXG4gICAgICAnJi1oaWRkZW4nOiB7XG4gICAgICAgIGRpc3BsYXk6ICdub25lJ1xuICAgICAgfSxcbiAgICAgICctLWFudGQtYXJyb3ctYmFja2dyb3VuZC1jb2xvcic6IHRvb2x0aXBCZyxcbiAgICAgIC8vIFdyYXBwZXIgZm9yIHRoZSB0b29sdGlwIGNvbnRlbnRcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWlubmVyYF06IHtcbiAgICAgICAgbWluV2lkdGg6IGNlbnRlckFsaWduTWluV2lkdGgsXG4gICAgICAgIG1pbkhlaWdodDogY29udHJvbEhlaWdodCxcbiAgICAgICAgcGFkZGluZzogYCR7dW5pdCh0b2tlbi5jYWxjKHBhZGRpbmdTTSkuZGl2KDIpLmVxdWFsKCkpfSAke3VuaXQocGFkZGluZ1hTKX1gLFxuICAgICAgICBjb2xvcjogdG9vbHRpcENvbG9yLFxuICAgICAgICB0ZXh0QWxpZ246ICdzdGFydCcsXG4gICAgICAgIHRleHREZWNvcmF0aW9uOiAnbm9uZScsXG4gICAgICAgIHdvcmRXcmFwOiAnYnJlYWstd29yZCcsXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogdG9vbHRpcEJnLFxuICAgICAgICBib3JkZXJSYWRpdXM6IHRvb2x0aXBCb3JkZXJSYWRpdXMsXG4gICAgICAgIGJveFNoYWRvdzogYm94U2hhZG93U2Vjb25kYXJ5LFxuICAgICAgICBib3hTaXppbmc6ICdib3JkZXItYm94J1xuICAgICAgfSxcbiAgICAgIC8vIEFsaWduIHBsYWNlbWVudCBzaG91bGQgaGF2ZSBhbm90aGVyIG1pbiB3aWR0aFxuICAgICAgW1tgJi1wbGFjZW1lbnQtdG9wTGVmdGAsIGAmLXBsYWNlbWVudC10b3BSaWdodGAsIGAmLXBsYWNlbWVudC1ib3R0b21MZWZ0YCwgYCYtcGxhY2VtZW50LWJvdHRvbVJpZ2h0YF0uam9pbignLCcpXToge1xuICAgICAgICBtaW5XaWR0aDogZWRnZUFsaWduTWluV2lkdGhcbiAgICAgIH0sXG4gICAgICAvLyBMaW1pdCBsZWZ0IGFuZCByaWdodCBwbGFjZW1lbnQgcmFkaXVzXG4gICAgICBbW2AmLXBsYWNlbWVudC1sZWZ0YCwgYCYtcGxhY2VtZW50LWxlZnRUb3BgLCBgJi1wbGFjZW1lbnQtbGVmdEJvdHRvbWAsIGAmLXBsYWNlbWVudC1yaWdodGAsIGAmLXBsYWNlbWVudC1yaWdodFRvcGAsIGAmLXBsYWNlbWVudC1yaWdodEJvdHRvbWBdLmpvaW4oJywnKV06IHtcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30taW5uZXJgXToge1xuICAgICAgICAgIGJvcmRlclJhZGl1czogdG9rZW4ubWluKHRvb2x0aXBCb3JkZXJSYWRpdXMsIE1BWF9WRVJUSUNBTF9DT05URU5UX1JBRElVUylcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWNvbnRlbnRgXToge1xuICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJ1xuICAgICAgfVxuICAgIH0pLCBnZW5QcmVzZXRDb2xvcih0b2tlbiwgKGNvbG9yS2V5LCBfcmVmKSA9PiB7XG4gICAgICBsZXQge1xuICAgICAgICBkYXJrQ29sb3JcbiAgICAgIH0gPSBfcmVmO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW2AmJHtjb21wb25lbnRDbHN9LSR7Y29sb3JLZXl9YF06IHtcbiAgICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1pbm5lcmBdOiB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGRhcmtDb2xvclxuICAgICAgICAgIH0sXG4gICAgICAgICAgW2Ake2NvbXBvbmVudENsc30tYXJyb3dgXToge1xuICAgICAgICAgICAgJy0tYW50ZC1hcnJvdy1iYWNrZ3JvdW5kLWNvbG9yJzogZGFya0NvbG9yXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pKSwge1xuICAgICAgLy8gUlRMXG4gICAgICAnJi1ydGwnOiB7XG4gICAgICAgIGRpcmVjdGlvbjogJ3J0bCdcbiAgICAgIH1cbiAgICB9KVxuICB9LFxuICAvLyBBcnJvdyBTdHlsZVxuICBnZXRBcnJvd1N0eWxlKHRva2VuLCAndmFyKC0tYW50ZC1hcnJvdy1iYWNrZ3JvdW5kLWNvbG9yKScpLFxuICAvLyBQdXJlIFJlbmRlclxuICB7XG4gICAgW2Ake2NvbXBvbmVudENsc30tcHVyZWBdOiB7XG4gICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgIG1heFdpZHRoOiAnbm9uZScsXG4gICAgICBtYXJnaW46IHRva2VuLnNpemVQb3B1cEFycm93XG4gICAgfVxuICB9XTtcbn07XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRXhwb3J0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuZXhwb3J0IGNvbnN0IHByZXBhcmVDb21wb25lbnRUb2tlbiA9IHRva2VuID0+IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7XG4gIHpJbmRleFBvcHVwOiB0b2tlbi56SW5kZXhQb3B1cEJhc2UgKyA3MFxufSwgZ2V0QXJyb3dPZmZzZXRUb2tlbih7XG4gIGNvbnRlbnRSYWRpdXM6IHRva2VuLmJvcmRlclJhZGl1cyxcbiAgbGltaXRWZXJ0aWNhbFJhZGl1czogdHJ1ZVxufSkpLCBnZXRBcnJvd1Rva2VuKG1lcmdlVG9rZW4odG9rZW4sIHtcbiAgYm9yZGVyUmFkaXVzT3V0ZXI6IE1hdGgubWluKHRva2VuLmJvcmRlclJhZGl1c091dGVyLCA0KVxufSkpKTtcbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAocHJlZml4Q2xzKSB7XG4gIGxldCBpbmplY3RTdHlsZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcbiAgY29uc3QgdXNlU3R5bGUgPSBnZW5TdHlsZUhvb2tzKCdUb29sdGlwJywgdG9rZW4gPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGJvcmRlclJhZGl1cyxcbiAgICAgIGNvbG9yVGV4dExpZ2h0U29saWQsXG4gICAgICBjb2xvckJnU3BvdGxpZ2h0XG4gICAgfSA9IHRva2VuO1xuICAgIGNvbnN0IFRvb2x0aXBUb2tlbiA9IG1lcmdlVG9rZW4odG9rZW4sIHtcbiAgICAgIC8vIGRlZmF1bHQgdmFyaWFibGVzXG4gICAgICB0b29sdGlwTWF4V2lkdGg6IDI1MCxcbiAgICAgIHRvb2x0aXBDb2xvcjogY29sb3JUZXh0TGlnaHRTb2xpZCxcbiAgICAgIHRvb2x0aXBCb3JkZXJSYWRpdXM6IGJvcmRlclJhZGl1cyxcbiAgICAgIHRvb2x0aXBCZzogY29sb3JCZ1Nwb3RsaWdodFxuICAgIH0pO1xuICAgIHJldHVybiBbZ2VuVG9vbHRpcFN0eWxlKFRvb2x0aXBUb2tlbiksIGluaXRab29tTW90aW9uKHRva2VuLCAnem9vbS1iaWctZmFzdCcpXTtcbiAgfSwgcHJlcGFyZUNvbXBvbmVudFRva2VuLCB7XG4gICAgcmVzZXRTdHlsZTogZmFsc2UsXG4gICAgLy8gUG9wb3ZlciB1c2UgVG9vbHRpcCBhcyBpbnRlcm5hbCBjb21wb25lbnQuIFdlIGRvIG5vdCBuZWVkIHRvIGhhbmRsZSB0aGlzLlxuICAgIGluamVjdFN0eWxlXG4gIH0pO1xuICByZXR1cm4gdXNlU3R5bGUocHJlZml4Q2xzKTtcbn0pOyIsICJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IGlzUHJlc2V0Q29sb3IgfSBmcm9tICcuLi9fdXRpbC9jb2xvcnMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ29sb3IocHJlZml4Q2xzLCBjb2xvcikge1xuICBjb25zdCBpc0ludGVybmFsQ29sb3IgPSBpc1ByZXNldENvbG9yKGNvbG9yKTtcbiAgY29uc3QgY2xhc3NOYW1lID0gY2xhc3NOYW1lcyh7XG4gICAgW2Ake3ByZWZpeENsc30tJHtjb2xvcn1gXTogY29sb3IgJiYgaXNJbnRlcm5hbENvbG9yXG4gIH0pO1xuICBjb25zdCBvdmVybGF5U3R5bGUgPSB7fTtcbiAgY29uc3QgYXJyb3dTdHlsZSA9IHt9O1xuICBpZiAoY29sb3IgJiYgIWlzSW50ZXJuYWxDb2xvcikge1xuICAgIG92ZXJsYXlTdHlsZS5iYWNrZ3JvdW5kID0gY29sb3I7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGFycm93U3R5bGVbJy0tYW50ZC1hcnJvdy1iYWNrZ3JvdW5kLWNvbG9yJ10gPSBjb2xvcjtcbiAgfVxuICByZXR1cm4ge1xuICAgIGNsYXNzTmFtZSxcbiAgICBvdmVybGF5U3R5bGUsXG4gICAgYXJyb3dTdHlsZVxuICB9O1xufSIsICJpbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IHsgUHJlc2V0Q29sb3JzIH0gZnJvbSAnLi4vdGhlbWUvaW50ZXJmYWNlJztcbmNvbnN0IGludmVyc2VDb2xvcnMgPSBQcmVzZXRDb2xvcnMubWFwKGNvbG9yID0+IGAke2NvbG9yfS1pbnZlcnNlYCk7XG5leHBvcnQgY29uc3QgUHJlc2V0U3RhdHVzQ29sb3JUeXBlcyA9IFsnc3VjY2VzcycsICdwcm9jZXNzaW5nJywgJ2Vycm9yJywgJ2RlZmF1bHQnLCAnd2FybmluZyddO1xuLyoqXG4gKiBkZXRlcm1pbmUgaWYgdGhlIGNvbG9yIGtleXdvcmQgYmVsb25ncyB0byB0aGUgYEFudCBEZXNpZ25gIHtAbGluayBQcmVzZXRDb2xvcnN9LlxuICogQHBhcmFtIGNvbG9yIGNvbG9yIHRvIGJlIGp1ZGdlZFxuICogQHBhcmFtIGluY2x1ZGVJbnZlcnNlIHdoZXRoZXIgdG8gaW5jbHVkZSByZXZlcnNlZCBjb2xvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUHJlc2V0Q29sb3IoY29sb3IpIHtcbiAgbGV0IGluY2x1ZGVJbnZlcnNlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB0cnVlO1xuICBpZiAoaW5jbHVkZUludmVyc2UpIHtcbiAgICByZXR1cm4gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShpbnZlcnNlQ29sb3JzKSwgX3RvQ29uc3VtYWJsZUFycmF5KFByZXNldENvbG9ycykpLmluY2x1ZGVzKGNvbG9yKTtcbiAgfVxuICByZXR1cm4gUHJlc2V0Q29sb3JzLmluY2x1ZGVzKGNvbG9yKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1ByZXNldFN0YXR1c0NvbG9yKGNvbG9yKSB7XG4gIHJldHVybiBQcmVzZXRTdGF0dXNDb2xvclR5cGVzLmluY2x1ZGVzKGNvbG9yKTtcbn0iLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgTGVmdE91dGxpbmVkU3ZnIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL0xlZnRPdXRsaW5lZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gXCIuLi9jb21wb25lbnRzL0FudGRJY29uXCI7XG52YXIgTGVmdE91dGxpbmVkID0gZnVuY3Rpb24gTGVmdE91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFudGRJY29uLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBMZWZ0T3V0bGluZWRTdmdcbiAgfSkpO1xufTtcblxuLyoqIVtsZWZ0XShkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUIzYVdSMGFEMGlOVEFpSUdobGFXZG9kRDBpTlRBaUlHWnBiR3c5SWlOallXTmhZMkVpSUhacFpYZENiM2c5SWpZMElEWTBJRGc1TmlBNE9UWWlJR1p2WTNWellXSnNaVDBpWm1Gc2MyVWlJSGh0Ykc1elBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5SStQSEJoZEdnZ1pEMGlUVGN5TkNBeU1UZ3VNMVl4TkRGak1DMDJMamN0Tnk0M0xURXdMalF0TVRJdU9TMDJMak5NTWpZd0xqTWdORGcyTGpoaE16RXVPRFlnTXpFdU9EWWdNQ0F3TURBZ05UQXVNMncwTlRBdU9DQXpOVEl1TVdNMUxqTWdOQzR4SURFeUxqa3VOQ0F4TWk0NUxUWXVNM1l0TnpjdU0yTXdMVFF1T1MweUxqTXRPUzQyTFRZdU1TMHhNaTQyYkMwek5qQXRNamd4SURNMk1DMHlPREV1TVdNekxqZ3RNeUEyTGpFdE55NDNJRFl1TVMweE1pNDJlaUlnTHo0OEwzTjJaejQ9KSAqL1xudmFyIFJlZkljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihMZWZ0T3V0bGluZWQpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgUmVmSWNvbi5kaXNwbGF5TmFtZSA9ICdMZWZ0T3V0bGluZWQnO1xufVxuZXhwb3J0IGRlZmF1bHQgUmVmSWNvbjsiLCAiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgTGVmdE91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk03MjQgMjE4LjNWMTQxYzAtNi43LTcuNy0xMC40LTEyLjktNi4zTDI2MC4zIDQ4Ni44YTMxLjg2IDMxLjg2IDAgMDAwIDUwLjNsNDUwLjggMzUyLjFjNS4zIDQuMSAxMi45LjQgMTIuOS02LjN2LTc3LjNjMC00LjktMi4zLTkuNi02LjEtMTIuNmwtMzYwLTI4MSAzNjAtMjgxLjFjMy44LTMgNi4xLTcuNyA2LjEtMTIuNnpcIiB9IH1dIH0sIFwibmFtZVwiOiBcImxlZnRcIiwgXCJ0aGVtZVwiOiBcIm91dGxpbmVkXCIgfTtcbmV4cG9ydCBkZWZhdWx0IExlZnRPdXRsaW5lZDtcbiIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcInByZWZpeENsc1wiLCBcImNsYXNzTmFtZVwiLCBcInN0eWxlXCIsIFwiY2hlY2tlZFwiLCBcImRpc2FibGVkXCIsIFwiZGVmYXVsdENoZWNrZWRcIiwgXCJ0eXBlXCIsIFwidGl0bGVcIiwgXCJvbkNoYW5nZVwiXTtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHVzZU1lcmdlZFN0YXRlIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZU1lcmdlZFN0YXRlXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBmb3J3YXJkUmVmLCB1c2VJbXBlcmF0aXZlSGFuZGxlLCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5leHBvcnQgdmFyIENoZWNrYm94ID0gLyojX19QVVJFX18qL2ZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIF9wcm9wcyRwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgcHJlZml4Q2xzID0gX3Byb3BzJHByZWZpeENscyA9PT0gdm9pZCAwID8gJ3JjLWNoZWNrYm94JyA6IF9wcm9wcyRwcmVmaXhDbHMsXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgY2hlY2tlZCA9IHByb3BzLmNoZWNrZWQsXG4gICAgZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICBfcHJvcHMkZGVmYXVsdENoZWNrZWQgPSBwcm9wcy5kZWZhdWx0Q2hlY2tlZCxcbiAgICBkZWZhdWx0Q2hlY2tlZCA9IF9wcm9wcyRkZWZhdWx0Q2hlY2tlZCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkZGVmYXVsdENoZWNrZWQsXG4gICAgX3Byb3BzJHR5cGUgPSBwcm9wcy50eXBlLFxuICAgIHR5cGUgPSBfcHJvcHMkdHlwZSA9PT0gdm9pZCAwID8gJ2NoZWNrYm94JyA6IF9wcm9wcyR0eXBlLFxuICAgIHRpdGxlID0gcHJvcHMudGl0bGUsXG4gICAgb25DaGFuZ2UgPSBwcm9wcy5vbkNoYW5nZSxcbiAgICBpbnB1dFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBfZXhjbHVkZWQpO1xuICB2YXIgaW5wdXRSZWYgPSB1c2VSZWYobnVsbCk7XG4gIHZhciBob2xkZXJSZWYgPSB1c2VSZWYobnVsbCk7XG4gIHZhciBfdXNlTWVyZ2VkU3RhdGUgPSB1c2VNZXJnZWRTdGF0ZShkZWZhdWx0Q2hlY2tlZCwge1xuICAgICAgdmFsdWU6IGNoZWNrZWRcbiAgICB9KSxcbiAgICBfdXNlTWVyZ2VkU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZU1lcmdlZFN0YXRlLCAyKSxcbiAgICByYXdWYWx1ZSA9IF91c2VNZXJnZWRTdGF0ZTJbMF0sXG4gICAgc2V0UmF3VmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGUyWzFdO1xuICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBmb2N1czogZnVuY3Rpb24gZm9jdXMob3B0aW9ucykge1xuICAgICAgICB2YXIgX2lucHV0UmVmJGN1cnJlbnQ7XG4gICAgICAgIChfaW5wdXRSZWYkY3VycmVudCA9IGlucHV0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9pbnB1dFJlZiRjdXJyZW50ID09PSB2b2lkIDAgfHwgX2lucHV0UmVmJGN1cnJlbnQuZm9jdXMob3B0aW9ucyk7XG4gICAgICB9LFxuICAgICAgYmx1cjogZnVuY3Rpb24gYmx1cigpIHtcbiAgICAgICAgdmFyIF9pbnB1dFJlZiRjdXJyZW50MjtcbiAgICAgICAgKF9pbnB1dFJlZiRjdXJyZW50MiA9IGlucHV0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9pbnB1dFJlZiRjdXJyZW50MiA9PT0gdm9pZCAwIHx8IF9pbnB1dFJlZiRjdXJyZW50Mi5ibHVyKCk7XG4gICAgICB9LFxuICAgICAgaW5wdXQ6IGlucHV0UmVmLmN1cnJlbnQsXG4gICAgICBuYXRpdmVFbGVtZW50OiBob2xkZXJSZWYuY3VycmVudFxuICAgIH07XG4gIH0pO1xuICB2YXIgY2xhc3NTdHJpbmcgPSBjbGFzc05hbWVzKHByZWZpeENscywgY2xhc3NOYW1lLCBfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNoZWNrZWRcIiksIHJhd1ZhbHVlKSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kaXNhYmxlZFwiKSwgZGlzYWJsZWQpKTtcbiAgdmFyIGhhbmRsZUNoYW5nZSA9IGZ1bmN0aW9uIGhhbmRsZUNoYW5nZShlKSB7XG4gICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghKCdjaGVja2VkJyBpbiBwcm9wcykpIHtcbiAgICAgIHNldFJhd1ZhbHVlKGUudGFyZ2V0LmNoZWNrZWQpO1xuICAgIH1cbiAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwIHx8IG9uQ2hhbmdlKHtcbiAgICAgIHRhcmdldDogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyksIHt9LCB7XG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIGNoZWNrZWQ6IGUudGFyZ2V0LmNoZWNrZWRcbiAgICAgIH0pLFxuICAgICAgc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbiBzdG9wUHJvcGFnYXRpb24oKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9LFxuICAgICAgcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uIHByZXZlbnREZWZhdWx0KCkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9LFxuICAgICAgbmF0aXZlRXZlbnQ6IGUubmF0aXZlRXZlbnRcbiAgICB9KTtcbiAgfTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc1N0cmluZyxcbiAgICB0aXRsZTogdGl0bGUsXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIHJlZjogaG9sZGVyUmVmXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwgX2V4dGVuZHMoe30sIGlucHV0UHJvcHMsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW5wdXRcIiksXG4gICAgcmVmOiBpbnB1dFJlZixcbiAgICBvbkNoYW5nZTogaGFuZGxlQ2hhbmdlLFxuICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICBjaGVja2VkOiAhIXJhd1ZhbHVlLFxuICAgIHR5cGU6IHR5cGVcbiAgfSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbm5lclwiKVxuICB9KSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IENoZWNrYm94OyIsICJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHJhZiBmcm9tIFwicmMtdXRpbC9lcy9yYWZcIjtcbi8qKlxuICogV2hlbiBjbGljayBvbiB0aGUgbGFiZWwsXG4gKiB0aGUgZXZlbnQgd2lsbCBiZSBzdG9wcGVkIHRvIHByZXZlbnQgdGhlIGxhYmVsIGZyb20gYmVpbmcgY2xpY2tlZCB0d2ljZS5cbiAqIGxhYmVsIGNsaWNrIC0+IGlucHV0IGNsaWNrIC0+IGxhYmVsIGNsaWNrIGFnYWluXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUJ1YmJsZUxvY2sob25PcmlnaW5JbnB1dENsaWNrKSB7XG4gIGNvbnN0IGxhYmVsQ2xpY2tMb2NrUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBjb25zdCBjbGVhckxvY2sgPSAoKSA9PiB7XG4gICAgcmFmLmNhbmNlbChsYWJlbENsaWNrTG9ja1JlZi5jdXJyZW50KTtcbiAgICBsYWJlbENsaWNrTG9ja1JlZi5jdXJyZW50ID0gbnVsbDtcbiAgfTtcbiAgY29uc3Qgb25MYWJlbENsaWNrID0gKCkgPT4ge1xuICAgIGNsZWFyTG9jaygpO1xuICAgIGxhYmVsQ2xpY2tMb2NrUmVmLmN1cnJlbnQgPSByYWYoKCkgPT4ge1xuICAgICAgbGFiZWxDbGlja0xvY2tSZWYuY3VycmVudCA9IG51bGw7XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IG9uSW5wdXRDbGljayA9IGUgPT4ge1xuICAgIGlmIChsYWJlbENsaWNrTG9ja1JlZi5jdXJyZW50KSB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgY2xlYXJMb2NrKCk7XG4gICAgfVxuICAgIG9uT3JpZ2luSW5wdXRDbGljayA9PT0gbnVsbCB8fCBvbk9yaWdpbklucHV0Q2xpY2sgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uT3JpZ2luSW5wdXRDbGljayhlKTtcbiAgfTtcbiAgcmV0dXJuIFtvbkxhYmVsQ2xpY2ssIG9uSW5wdXRDbGlja107XG59IiwgImltcG9ydCB7IG1lcmdlVG9rZW4gfSBmcm9tICcuLi8uLi90aGVtZS9pbnRlcm5hbCc7XG5leHBvcnQgZnVuY3Rpb24gaW5pdElucHV0VG9rZW4odG9rZW4pIHtcbiAgcmV0dXJuIG1lcmdlVG9rZW4odG9rZW4sIHtcbiAgICBpbnB1dEFmZml4UGFkZGluZzogdG9rZW4ucGFkZGluZ1hYU1xuICB9KTtcbn1cbmV4cG9ydCBjb25zdCBpbml0Q29tcG9uZW50VG9rZW4gPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb250cm9sSGVpZ2h0LFxuICAgIGZvbnRTaXplLFxuICAgIGxpbmVIZWlnaHQsXG4gICAgbGluZVdpZHRoLFxuICAgIGNvbnRyb2xIZWlnaHRTTSxcbiAgICBjb250cm9sSGVpZ2h0TEcsXG4gICAgZm9udFNpemVMRyxcbiAgICBsaW5lSGVpZ2h0TEcsXG4gICAgcGFkZGluZ1NNLFxuICAgIGNvbnRyb2xQYWRkaW5nSG9yaXpvbnRhbFNNLFxuICAgIGNvbnRyb2xQYWRkaW5nSG9yaXpvbnRhbCxcbiAgICBjb2xvckZpbGxBbHRlcixcbiAgICBjb2xvclByaW1hcnlIb3ZlcixcbiAgICBjb2xvclByaW1hcnksXG4gICAgY29udHJvbE91dGxpbmVXaWR0aCxcbiAgICBjb250cm9sT3V0bGluZSxcbiAgICBjb2xvckVycm9yT3V0bGluZSxcbiAgICBjb2xvcldhcm5pbmdPdXRsaW5lLFxuICAgIGNvbG9yQmdDb250YWluZXIsXG4gICAgaW5wdXRGb250U2l6ZSxcbiAgICBpbnB1dEZvbnRTaXplTEcsXG4gICAgaW5wdXRGb250U2l6ZVNNXG4gIH0gPSB0b2tlbjtcbiAgY29uc3QgbWVyZ2VkRm9udFNpemUgPSBpbnB1dEZvbnRTaXplIHx8IGZvbnRTaXplO1xuICBjb25zdCBtZXJnZWRGb250U2l6ZVNNID0gaW5wdXRGb250U2l6ZVNNIHx8IG1lcmdlZEZvbnRTaXplO1xuICBjb25zdCBtZXJnZWRGb250U2l6ZUxHID0gaW5wdXRGb250U2l6ZUxHIHx8IGZvbnRTaXplTEc7XG4gIGNvbnN0IHBhZGRpbmdCbG9jayA9IE1hdGgucm91bmQoKGNvbnRyb2xIZWlnaHQgLSBtZXJnZWRGb250U2l6ZSAqIGxpbmVIZWlnaHQpIC8gMiAqIDEwKSAvIDEwIC0gbGluZVdpZHRoO1xuICBjb25zdCBwYWRkaW5nQmxvY2tTTSA9IE1hdGgucm91bmQoKGNvbnRyb2xIZWlnaHRTTSAtIG1lcmdlZEZvbnRTaXplU00gKiBsaW5lSGVpZ2h0KSAvIDIgKiAxMCkgLyAxMCAtIGxpbmVXaWR0aDtcbiAgY29uc3QgcGFkZGluZ0Jsb2NrTEcgPSBNYXRoLmNlaWwoKGNvbnRyb2xIZWlnaHRMRyAtIG1lcmdlZEZvbnRTaXplTEcgKiBsaW5lSGVpZ2h0TEcpIC8gMiAqIDEwKSAvIDEwIC0gbGluZVdpZHRoO1xuICByZXR1cm4ge1xuICAgIHBhZGRpbmdCbG9jazogTWF0aC5tYXgocGFkZGluZ0Jsb2NrLCAwKSxcbiAgICBwYWRkaW5nQmxvY2tTTTogTWF0aC5tYXgocGFkZGluZ0Jsb2NrU00sIDApLFxuICAgIHBhZGRpbmdCbG9ja0xHOiBNYXRoLm1heChwYWRkaW5nQmxvY2tMRywgMCksXG4gICAgcGFkZGluZ0lubGluZTogcGFkZGluZ1NNIC0gbGluZVdpZHRoLFxuICAgIHBhZGRpbmdJbmxpbmVTTTogY29udHJvbFBhZGRpbmdIb3Jpem9udGFsU00gLSBsaW5lV2lkdGgsXG4gICAgcGFkZGluZ0lubGluZUxHOiBjb250cm9sUGFkZGluZ0hvcml6b250YWwgLSBsaW5lV2lkdGgsXG4gICAgYWRkb25CZzogY29sb3JGaWxsQWx0ZXIsXG4gICAgYWN0aXZlQm9yZGVyQ29sb3I6IGNvbG9yUHJpbWFyeSxcbiAgICBob3ZlckJvcmRlckNvbG9yOiBjb2xvclByaW1hcnlIb3ZlcixcbiAgICBhY3RpdmVTaGFkb3c6IGAwIDAgMCAke2NvbnRyb2xPdXRsaW5lV2lkdGh9cHggJHtjb250cm9sT3V0bGluZX1gLFxuICAgIGVycm9yQWN0aXZlU2hhZG93OiBgMCAwIDAgJHtjb250cm9sT3V0bGluZVdpZHRofXB4ICR7Y29sb3JFcnJvck91dGxpbmV9YCxcbiAgICB3YXJuaW5nQWN0aXZlU2hhZG93OiBgMCAwIDAgJHtjb250cm9sT3V0bGluZVdpZHRofXB4ICR7Y29sb3JXYXJuaW5nT3V0bGluZX1gLFxuICAgIGhvdmVyQmc6IGNvbG9yQmdDb250YWluZXIsXG4gICAgYWN0aXZlQmc6IGNvbG9yQmdDb250YWluZXIsXG4gICAgaW5wdXRGb250U2l6ZTogbWVyZ2VkRm9udFNpemUsXG4gICAgaW5wdXRGb250U2l6ZUxHOiBtZXJnZWRGb250U2l6ZUxHLFxuICAgIGlucHV0Rm9udFNpemVTTTogbWVyZ2VkRm9udFNpemVTTVxuICB9O1xufTsiLCAiaW1wb3J0IHsgdW5pdCB9IGZyb20gJ0BhbnQtZGVzaWduL2Nzc2luanMnO1xuaW1wb3J0IHsgbWVyZ2VUb2tlbiB9IGZyb20gJy4uLy4uL3RoZW1lL2ludGVybmFsJztcbmV4cG9ydCBjb25zdCBnZW5Ib3ZlclN0eWxlID0gdG9rZW4gPT4gKHtcbiAgYm9yZGVyQ29sb3I6IHRva2VuLmhvdmVyQm9yZGVyQ29sb3IsXG4gIGJhY2tncm91bmRDb2xvcjogdG9rZW4uaG92ZXJCZ1xufSk7XG5leHBvcnQgY29uc3QgZ2VuRGlzYWJsZWRTdHlsZSA9IHRva2VuID0+ICh7XG4gIGNvbG9yOiB0b2tlbi5jb2xvclRleHREaXNhYmxlZCxcbiAgYmFja2dyb3VuZENvbG9yOiB0b2tlbi5jb2xvckJnQ29udGFpbmVyRGlzYWJsZWQsXG4gIGJvcmRlckNvbG9yOiB0b2tlbi5jb2xvckJvcmRlcixcbiAgYm94U2hhZG93OiAnbm9uZScsXG4gIGN1cnNvcjogJ25vdC1hbGxvd2VkJyxcbiAgb3BhY2l0eTogMSxcbiAgJ2lucHV0W2Rpc2FibGVkXSwgdGV4dGFyZWFbZGlzYWJsZWRdJzoge1xuICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkJ1xuICB9LFxuICAnJjpob3Zlcjpub3QoW2Rpc2FibGVkXSknOiBPYmplY3QuYXNzaWduKHt9LCBnZW5Ib3ZlclN0eWxlKG1lcmdlVG9rZW4odG9rZW4sIHtcbiAgICBob3ZlckJvcmRlckNvbG9yOiB0b2tlbi5jb2xvckJvcmRlcixcbiAgICBob3ZlckJnOiB0b2tlbi5jb2xvckJnQ29udGFpbmVyRGlzYWJsZWRcbiAgfSkpKVxufSk7XG4vKiA9PT09PT09PT09PT09PSBPdXRsaW5lZCA9PT09PT09PT09PT09PSAqL1xuZXhwb3J0IGNvbnN0IGdlbkJhc2VPdXRsaW5lZFN0eWxlID0gKHRva2VuLCBvcHRpb25zKSA9PiAoe1xuICBiYWNrZ3JvdW5kOiB0b2tlbi5jb2xvckJnQ29udGFpbmVyLFxuICBib3JkZXJXaWR0aDogdG9rZW4ubGluZVdpZHRoLFxuICBib3JkZXJTdHlsZTogdG9rZW4ubGluZVR5cGUsXG4gIGJvcmRlckNvbG9yOiBvcHRpb25zLmJvcmRlckNvbG9yLFxuICAnJjpob3Zlcic6IHtcbiAgICBib3JkZXJDb2xvcjogb3B0aW9ucy5ob3ZlckJvcmRlckNvbG9yLFxuICAgIGJhY2tncm91bmRDb2xvcjogdG9rZW4uaG92ZXJCZ1xuICB9LFxuICAnJjpmb2N1cywgJjpmb2N1cy13aXRoaW4nOiB7XG4gICAgYm9yZGVyQ29sb3I6IG9wdGlvbnMuYWN0aXZlQm9yZGVyQ29sb3IsXG4gICAgYm94U2hhZG93OiBvcHRpb25zLmFjdGl2ZVNoYWRvdyxcbiAgICBvdXRsaW5lOiAwLFxuICAgIGJhY2tncm91bmRDb2xvcjogdG9rZW4uYWN0aXZlQmdcbiAgfVxufSk7XG5jb25zdCBnZW5PdXRsaW5lZFN0YXR1c1N0eWxlID0gKHRva2VuLCBvcHRpb25zKSA9PiAoe1xuICBbYCYke3Rva2VuLmNvbXBvbmVudENsc30tc3RhdHVzLSR7b3B0aW9ucy5zdGF0dXN9Om5vdCgke3Rva2VuLmNvbXBvbmVudENsc30tZGlzYWJsZWQpYF06IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZ2VuQmFzZU91dGxpbmVkU3R5bGUodG9rZW4sIG9wdGlvbnMpKSwge1xuICAgIFtgJHt0b2tlbi5jb21wb25lbnRDbHN9LXByZWZpeCwgJHt0b2tlbi5jb21wb25lbnRDbHN9LXN1ZmZpeGBdOiB7XG4gICAgICBjb2xvcjogb3B0aW9ucy5hZmZpeENvbG9yXG4gICAgfVxuICB9KSxcbiAgW2AmJHt0b2tlbi5jb21wb25lbnRDbHN9LXN0YXR1cy0ke29wdGlvbnMuc3RhdHVzfSR7dG9rZW4uY29tcG9uZW50Q2xzfS1kaXNhYmxlZGBdOiB7XG4gICAgYm9yZGVyQ29sb3I6IG9wdGlvbnMuYm9yZGVyQ29sb3JcbiAgfVxufSk7XG5leHBvcnQgY29uc3QgZ2VuT3V0bGluZWRTdHlsZSA9ICh0b2tlbiwgZXh0cmFTdHlsZXMpID0+ICh7XG4gICcmLW91dGxpbmVkJzogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBnZW5CYXNlT3V0bGluZWRTdHlsZSh0b2tlbiwge1xuICAgIGJvcmRlckNvbG9yOiB0b2tlbi5jb2xvckJvcmRlcixcbiAgICBob3ZlckJvcmRlckNvbG9yOiB0b2tlbi5ob3ZlckJvcmRlckNvbG9yLFxuICAgIGFjdGl2ZUJvcmRlckNvbG9yOiB0b2tlbi5hY3RpdmVCb3JkZXJDb2xvcixcbiAgICBhY3RpdmVTaGFkb3c6IHRva2VuLmFjdGl2ZVNoYWRvd1xuICB9KSksIHtcbiAgICBbYCYke3Rva2VuLmNvbXBvbmVudENsc30tZGlzYWJsZWQsICZbZGlzYWJsZWRdYF06IE9iamVjdC5hc3NpZ24oe30sIGdlbkRpc2FibGVkU3R5bGUodG9rZW4pKVxuICB9KSwgZ2VuT3V0bGluZWRTdGF0dXNTdHlsZSh0b2tlbiwge1xuICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICBib3JkZXJDb2xvcjogdG9rZW4uY29sb3JFcnJvcixcbiAgICBob3ZlckJvcmRlckNvbG9yOiB0b2tlbi5jb2xvckVycm9yQm9yZGVySG92ZXIsXG4gICAgYWN0aXZlQm9yZGVyQ29sb3I6IHRva2VuLmNvbG9yRXJyb3IsXG4gICAgYWN0aXZlU2hhZG93OiB0b2tlbi5lcnJvckFjdGl2ZVNoYWRvdyxcbiAgICBhZmZpeENvbG9yOiB0b2tlbi5jb2xvckVycm9yXG4gIH0pKSwgZ2VuT3V0bGluZWRTdGF0dXNTdHlsZSh0b2tlbiwge1xuICAgIHN0YXR1czogJ3dhcm5pbmcnLFxuICAgIGJvcmRlckNvbG9yOiB0b2tlbi5jb2xvcldhcm5pbmcsXG4gICAgaG92ZXJCb3JkZXJDb2xvcjogdG9rZW4uY29sb3JXYXJuaW5nQm9yZGVySG92ZXIsXG4gICAgYWN0aXZlQm9yZGVyQ29sb3I6IHRva2VuLmNvbG9yV2FybmluZyxcbiAgICBhY3RpdmVTaGFkb3c6IHRva2VuLndhcm5pbmdBY3RpdmVTaGFkb3csXG4gICAgYWZmaXhDb2xvcjogdG9rZW4uY29sb3JXYXJuaW5nXG4gIH0pKSwgZXh0cmFTdHlsZXMpXG59KTtcbmNvbnN0IGdlbk91dGxpbmVkR3JvdXBTdGF0dXNTdHlsZSA9ICh0b2tlbiwgb3B0aW9ucykgPT4gKHtcbiAgW2AmJHt0b2tlbi5jb21wb25lbnRDbHN9LWdyb3VwLXdyYXBwZXItc3RhdHVzLSR7b3B0aW9ucy5zdGF0dXN9YF06IHtcbiAgICBbYCR7dG9rZW4uY29tcG9uZW50Q2xzfS1ncm91cC1hZGRvbmBdOiB7XG4gICAgICBib3JkZXJDb2xvcjogb3B0aW9ucy5hZGRvbkJvcmRlckNvbG9yLFxuICAgICAgY29sb3I6IG9wdGlvbnMuYWRkb25Db2xvclxuICAgIH1cbiAgfVxufSk7XG5leHBvcnQgY29uc3QgZ2VuT3V0bGluZWRHcm91cFN0eWxlID0gdG9rZW4gPT4gKHtcbiAgJyYtb3V0bGluZWQnOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7XG4gICAgW2Ake3Rva2VuLmNvbXBvbmVudENsc30tZ3JvdXBgXToge1xuICAgICAgJyYtYWRkb24nOiB7XG4gICAgICAgIGJhY2tncm91bmQ6IHRva2VuLmFkZG9uQmcsXG4gICAgICAgIGJvcmRlcjogYCR7dW5pdCh0b2tlbi5saW5lV2lkdGgpfSAke3Rva2VuLmxpbmVUeXBlfSAke3Rva2VuLmNvbG9yQm9yZGVyfWBcbiAgICAgIH0sXG4gICAgICAnJi1hZGRvbjpmaXJzdC1jaGlsZCc6IHtcbiAgICAgICAgYm9yZGVySW5saW5lRW5kOiAwXG4gICAgICB9LFxuICAgICAgJyYtYWRkb246bGFzdC1jaGlsZCc6IHtcbiAgICAgICAgYm9yZGVySW5saW5lU3RhcnQ6IDBcbiAgICAgIH1cbiAgICB9XG4gIH0sIGdlbk91dGxpbmVkR3JvdXBTdGF0dXNTdHlsZSh0b2tlbiwge1xuICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICBhZGRvbkJvcmRlckNvbG9yOiB0b2tlbi5jb2xvckVycm9yLFxuICAgIGFkZG9uQ29sb3I6IHRva2VuLmNvbG9yRXJyb3JUZXh0XG4gIH0pKSwgZ2VuT3V0bGluZWRHcm91cFN0YXR1c1N0eWxlKHRva2VuLCB7XG4gICAgc3RhdHVzOiAnd2FybmluZycsXG4gICAgYWRkb25Cb3JkZXJDb2xvcjogdG9rZW4uY29sb3JXYXJuaW5nLFxuICAgIGFkZG9uQ29sb3I6IHRva2VuLmNvbG9yV2FybmluZ1RleHRcbiAgfSkpLCB7XG4gICAgW2AmJHt0b2tlbi5jb21wb25lbnRDbHN9LWdyb3VwLXdyYXBwZXItZGlzYWJsZWRgXToge1xuICAgICAgW2Ake3Rva2VuLmNvbXBvbmVudENsc30tZ3JvdXAtYWRkb25gXTogT2JqZWN0LmFzc2lnbih7fSwgZ2VuRGlzYWJsZWRTdHlsZSh0b2tlbikpXG4gICAgfVxuICB9KVxufSk7XG4vKiA9PT09PT09PT09PT0gQm9yZGVybGVzcyA9PT09PT09PT09PT0gKi9cbmV4cG9ydCBjb25zdCBnZW5Cb3JkZXJsZXNzU3R5bGUgPSAodG9rZW4sIGV4dHJhU3R5bGVzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHNcbiAgfSA9IHRva2VuO1xuICByZXR1cm4ge1xuICAgICcmLWJvcmRlcmxlc3MnOiBPYmplY3QuYXNzaWduKHtcbiAgICAgIGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCcsXG4gICAgICBib3JkZXI6ICdub25lJyxcbiAgICAgICcmOmZvY3VzLCAmOmZvY3VzLXdpdGhpbic6IHtcbiAgICAgICAgb3V0bGluZTogJ25vbmUnXG4gICAgICB9LFxuICAgICAgLy8gPj4+Pj4gRGlzYWJsZWRcbiAgICAgIFtgJiR7Y29tcG9uZW50Q2xzfS1kaXNhYmxlZCwgJltkaXNhYmxlZF1gXToge1xuICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JUZXh0RGlzYWJsZWQsXG4gICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkJ1xuICAgICAgfSxcbiAgICAgIC8vID4+Pj4+IFN0YXR1c1xuICAgICAgW2AmJHtjb21wb25lbnRDbHN9LXN0YXR1cy1lcnJvcmBdOiB7XG4gICAgICAgICcmLCAmIGlucHV0LCAmIHRleHRhcmVhJzoge1xuICAgICAgICAgIGNvbG9yOiB0b2tlbi5jb2xvckVycm9yXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbYCYke2NvbXBvbmVudENsc30tc3RhdHVzLXdhcm5pbmdgXToge1xuICAgICAgICAnJiwgJiBpbnB1dCwgJiB0ZXh0YXJlYSc6IHtcbiAgICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JXYXJuaW5nXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBleHRyYVN0eWxlcylcbiAgfTtcbn07XG4vKiA9PT09PT09PT09PT09PSBGaWxsZWQgPT09PT09PT09PT09PT0gKi9cbmNvbnN0IGdlbkJhc2VGaWxsZWRTdHlsZSA9ICh0b2tlbiwgb3B0aW9ucykgPT4ge1xuICB2YXIgX2E7XG4gIHJldHVybiB7XG4gICAgYmFja2dyb3VuZDogb3B0aW9ucy5iZyxcbiAgICBib3JkZXJXaWR0aDogdG9rZW4ubGluZVdpZHRoLFxuICAgIGJvcmRlclN0eWxlOiB0b2tlbi5saW5lVHlwZSxcbiAgICBib3JkZXJDb2xvcjogJ3RyYW5zcGFyZW50JyxcbiAgICAnaW5wdXQmLCAmIGlucHV0LCB0ZXh0YXJlYSYsICYgdGV4dGFyZWEnOiB7XG4gICAgICBjb2xvcjogKF9hID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmlucHV0Q29sb3IpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICd1bnNldCdcbiAgICB9LFxuICAgICcmOmhvdmVyJzoge1xuICAgICAgYmFja2dyb3VuZDogb3B0aW9ucy5ob3ZlckJnXG4gICAgfSxcbiAgICAnJjpmb2N1cywgJjpmb2N1cy13aXRoaW4nOiB7XG4gICAgICBvdXRsaW5lOiAwLFxuICAgICAgYm9yZGVyQ29sb3I6IG9wdGlvbnMuYWN0aXZlQm9yZGVyQ29sb3IsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRva2VuLmFjdGl2ZUJnXG4gICAgfVxuICB9O1xufTtcbmNvbnN0IGdlbkZpbGxlZFN0YXR1c1N0eWxlID0gKHRva2VuLCBvcHRpb25zKSA9PiAoe1xuICBbYCYke3Rva2VuLmNvbXBvbmVudENsc30tc3RhdHVzLSR7b3B0aW9ucy5zdGF0dXN9Om5vdCgke3Rva2VuLmNvbXBvbmVudENsc30tZGlzYWJsZWQpYF06IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZ2VuQmFzZUZpbGxlZFN0eWxlKHRva2VuLCBvcHRpb25zKSksIHtcbiAgICBbYCR7dG9rZW4uY29tcG9uZW50Q2xzfS1wcmVmaXgsICR7dG9rZW4uY29tcG9uZW50Q2xzfS1zdWZmaXhgXToge1xuICAgICAgY29sb3I6IG9wdGlvbnMuYWZmaXhDb2xvclxuICAgIH1cbiAgfSlcbn0pO1xuZXhwb3J0IGNvbnN0IGdlbkZpbGxlZFN0eWxlID0gKHRva2VuLCBleHRyYVN0eWxlcykgPT4gKHtcbiAgJyYtZmlsbGVkJzogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBnZW5CYXNlRmlsbGVkU3R5bGUodG9rZW4sIHtcbiAgICBiZzogdG9rZW4uY29sb3JGaWxsVGVydGlhcnksXG4gICAgaG92ZXJCZzogdG9rZW4uY29sb3JGaWxsU2Vjb25kYXJ5LFxuICAgIGFjdGl2ZUJvcmRlckNvbG9yOiB0b2tlbi5hY3RpdmVCb3JkZXJDb2xvclxuICB9KSksIHtcbiAgICBbYCYke3Rva2VuLmNvbXBvbmVudENsc30tZGlzYWJsZWQsICZbZGlzYWJsZWRdYF06IE9iamVjdC5hc3NpZ24oe30sIGdlbkRpc2FibGVkU3R5bGUodG9rZW4pKVxuICB9KSwgZ2VuRmlsbGVkU3RhdHVzU3R5bGUodG9rZW4sIHtcbiAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgYmc6IHRva2VuLmNvbG9yRXJyb3JCZyxcbiAgICBob3ZlckJnOiB0b2tlbi5jb2xvckVycm9yQmdIb3ZlcixcbiAgICBhY3RpdmVCb3JkZXJDb2xvcjogdG9rZW4uY29sb3JFcnJvcixcbiAgICBpbnB1dENvbG9yOiB0b2tlbi5jb2xvckVycm9yVGV4dCxcbiAgICBhZmZpeENvbG9yOiB0b2tlbi5jb2xvckVycm9yXG4gIH0pKSwgZ2VuRmlsbGVkU3RhdHVzU3R5bGUodG9rZW4sIHtcbiAgICBzdGF0dXM6ICd3YXJuaW5nJyxcbiAgICBiZzogdG9rZW4uY29sb3JXYXJuaW5nQmcsXG4gICAgaG92ZXJCZzogdG9rZW4uY29sb3JXYXJuaW5nQmdIb3ZlcixcbiAgICBhY3RpdmVCb3JkZXJDb2xvcjogdG9rZW4uY29sb3JXYXJuaW5nLFxuICAgIGlucHV0Q29sb3I6IHRva2VuLmNvbG9yV2FybmluZ1RleHQsXG4gICAgYWZmaXhDb2xvcjogdG9rZW4uY29sb3JXYXJuaW5nXG4gIH0pKSwgZXh0cmFTdHlsZXMpXG59KTtcbmNvbnN0IGdlbkZpbGxlZEdyb3VwU3RhdHVzU3R5bGUgPSAodG9rZW4sIG9wdGlvbnMpID0+ICh7XG4gIFtgJiR7dG9rZW4uY29tcG9uZW50Q2xzfS1ncm91cC13cmFwcGVyLXN0YXR1cy0ke29wdGlvbnMuc3RhdHVzfWBdOiB7XG4gICAgW2Ake3Rva2VuLmNvbXBvbmVudENsc30tZ3JvdXAtYWRkb25gXToge1xuICAgICAgYmFja2dyb3VuZDogb3B0aW9ucy5hZGRvbkJnLFxuICAgICAgY29sb3I6IG9wdGlvbnMuYWRkb25Db2xvclxuICAgIH1cbiAgfVxufSk7XG5leHBvcnQgY29uc3QgZ2VuRmlsbGVkR3JvdXBTdHlsZSA9IHRva2VuID0+ICh7XG4gICcmLWZpbGxlZCc6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHtcbiAgICBbYCR7dG9rZW4uY29tcG9uZW50Q2xzfS1ncm91cGBdOiB7XG4gICAgICAnJi1hZGRvbic6IHtcbiAgICAgICAgYmFja2dyb3VuZDogdG9rZW4uY29sb3JGaWxsVGVydGlhcnlcbiAgICAgIH0sXG4gICAgICBbYCR7dG9rZW4uY29tcG9uZW50Q2xzfS1maWxsZWQ6bm90KDpmb2N1cyk6bm90KDpmb2N1cy13aXRoaW4pYF06IHtcbiAgICAgICAgJyY6bm90KDpmaXJzdC1jaGlsZCknOiB7XG4gICAgICAgICAgYm9yZGVySW5saW5lU3RhcnQ6IGAke3VuaXQodG9rZW4ubGluZVdpZHRoKX0gJHt0b2tlbi5saW5lVHlwZX0gJHt0b2tlbi5jb2xvclNwbGl0fWBcbiAgICAgICAgfSxcbiAgICAgICAgJyY6bm90KDpsYXN0LWNoaWxkKSc6IHtcbiAgICAgICAgICBib3JkZXJJbmxpbmVFbmQ6IGAke3VuaXQodG9rZW4ubGluZVdpZHRoKX0gJHt0b2tlbi5saW5lVHlwZX0gJHt0b2tlbi5jb2xvclNwbGl0fWBcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwgZ2VuRmlsbGVkR3JvdXBTdGF0dXNTdHlsZSh0b2tlbiwge1xuICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICBhZGRvbkJnOiB0b2tlbi5jb2xvckVycm9yQmcsXG4gICAgYWRkb25Db2xvcjogdG9rZW4uY29sb3JFcnJvclRleHRcbiAgfSkpLCBnZW5GaWxsZWRHcm91cFN0YXR1c1N0eWxlKHRva2VuLCB7XG4gICAgc3RhdHVzOiAnd2FybmluZycsXG4gICAgYWRkb25CZzogdG9rZW4uY29sb3JXYXJuaW5nQmcsXG4gICAgYWRkb25Db2xvcjogdG9rZW4uY29sb3JXYXJuaW5nVGV4dFxuICB9KSksIHtcbiAgICBbYCYke3Rva2VuLmNvbXBvbmVudENsc30tZ3JvdXAtd3JhcHBlci1kaXNhYmxlZGBdOiB7XG4gICAgICBbYCR7dG9rZW4uY29tcG9uZW50Q2xzfS1ncm91cGBdOiB7XG4gICAgICAgICcmLWFkZG9uJzoge1xuICAgICAgICAgIGJhY2tncm91bmQ6IHRva2VuLmNvbG9yRmlsbFRlcnRpYXJ5LFxuICAgICAgICAgIGNvbG9yOiB0b2tlbi5jb2xvclRleHREaXNhYmxlZFxuICAgICAgICB9LFxuICAgICAgICAnJi1hZGRvbjpmaXJzdC1jaGlsZCc6IHtcbiAgICAgICAgICBib3JkZXJJbmxpbmVTdGFydDogYCR7dW5pdCh0b2tlbi5saW5lV2lkdGgpfSAke3Rva2VuLmxpbmVUeXBlfSAke3Rva2VuLmNvbG9yQm9yZGVyfWAsXG4gICAgICAgICAgYm9yZGVyVG9wOiBgJHt1bml0KHRva2VuLmxpbmVXaWR0aCl9ICR7dG9rZW4ubGluZVR5cGV9ICR7dG9rZW4uY29sb3JCb3JkZXJ9YCxcbiAgICAgICAgICBib3JkZXJCb3R0b206IGAke3VuaXQodG9rZW4ubGluZVdpZHRoKX0gJHt0b2tlbi5saW5lVHlwZX0gJHt0b2tlbi5jb2xvckJvcmRlcn1gXG4gICAgICAgIH0sXG4gICAgICAgICcmLWFkZG9uOmxhc3QtY2hpbGQnOiB7XG4gICAgICAgICAgYm9yZGVySW5saW5lRW5kOiBgJHt1bml0KHRva2VuLmxpbmVXaWR0aCl9ICR7dG9rZW4ubGluZVR5cGV9ICR7dG9rZW4uY29sb3JCb3JkZXJ9YCxcbiAgICAgICAgICBib3JkZXJUb3A6IGAke3VuaXQodG9rZW4ubGluZVdpZHRoKX0gJHt0b2tlbi5saW5lVHlwZX0gJHt0b2tlbi5jb2xvckJvcmRlcn1gLFxuICAgICAgICAgIGJvcmRlckJvdHRvbTogYCR7dW5pdCh0b2tlbi5saW5lV2lkdGgpfSAke3Rva2VuLmxpbmVUeXBlfSAke3Rva2VuLmNvbG9yQm9yZGVyfWBcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSlcbn0pO1xuLyogPT09PT09PT09PT09PT0gVW5kZXJsaW5lZCA9PT09PT09PT09PT09PSAqL1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvNTEzNzlcbmV4cG9ydCBjb25zdCBnZW5CYXNlVW5kZXJsaW5lZFN0eWxlID0gKHRva2VuLCBvcHRpb25zKSA9PiAoe1xuICBiYWNrZ3JvdW5kOiB0b2tlbi5jb2xvckJnQ29udGFpbmVyLFxuICBib3JkZXJXaWR0aDogYCR7dW5pdCh0b2tlbi5saW5lV2lkdGgpfSAwYCxcbiAgYm9yZGVyU3R5bGU6IGAke3Rva2VuLmxpbmVUeXBlfSBub25lYCxcbiAgYm9yZGVyQ29sb3I6IGB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCAke29wdGlvbnMuYm9yZGVyQ29sb3J9IHRyYW5zcGFyZW50YCxcbiAgYm9yZGVyUmFkaXVzOiAwLFxuICAnJjpob3Zlcic6IHtcbiAgICBib3JkZXJDb2xvcjogYHRyYW5zcGFyZW50IHRyYW5zcGFyZW50ICR7b3B0aW9ucy5ib3JkZXJDb2xvcn0gdHJhbnNwYXJlbnRgLFxuICAgIGJhY2tncm91bmRDb2xvcjogdG9rZW4uaG92ZXJCZ1xuICB9LFxuICAnJjpmb2N1cywgJjpmb2N1cy13aXRoaW4nOiB7XG4gICAgYm9yZGVyQ29sb3I6IGB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCAke29wdGlvbnMuYm9yZGVyQ29sb3J9IHRyYW5zcGFyZW50YCxcbiAgICBvdXRsaW5lOiAwLFxuICAgIGJhY2tncm91bmRDb2xvcjogdG9rZW4uYWN0aXZlQmdcbiAgfVxufSk7XG5jb25zdCBnZW5VbmRlcmxpbmVkU3RhdHVzU3R5bGUgPSAodG9rZW4sIG9wdGlvbnMpID0+ICh7XG4gIFtgJiR7dG9rZW4uY29tcG9uZW50Q2xzfS1zdGF0dXMtJHtvcHRpb25zLnN0YXR1c306bm90KCR7dG9rZW4uY29tcG9uZW50Q2xzfS1kaXNhYmxlZClgXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBnZW5CYXNlVW5kZXJsaW5lZFN0eWxlKHRva2VuLCBvcHRpb25zKSksIHtcbiAgICBbYCR7dG9rZW4uY29tcG9uZW50Q2xzfS1wcmVmaXgsICR7dG9rZW4uY29tcG9uZW50Q2xzfS1zdWZmaXhgXToge1xuICAgICAgY29sb3I6IG9wdGlvbnMuYWZmaXhDb2xvclxuICAgIH1cbiAgfSksXG4gIFtgJiR7dG9rZW4uY29tcG9uZW50Q2xzfS1zdGF0dXMtJHtvcHRpb25zLnN0YXR1c30ke3Rva2VuLmNvbXBvbmVudENsc30tZGlzYWJsZWRgXToge1xuICAgIGJvcmRlckNvbG9yOiBgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgJHtvcHRpb25zLmJvcmRlckNvbG9yfSB0cmFuc3BhcmVudGBcbiAgfVxufSk7XG5leHBvcnQgY29uc3QgZ2VuVW5kZXJsaW5lZFN0eWxlID0gKHRva2VuLCBleHRyYVN0eWxlcykgPT4gKHtcbiAgJyYtdW5kZXJsaW5lZCc6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZ2VuQmFzZVVuZGVybGluZWRTdHlsZSh0b2tlbiwge1xuICAgIGJvcmRlckNvbG9yOiB0b2tlbi5jb2xvckJvcmRlcixcbiAgICBob3ZlckJvcmRlckNvbG9yOiB0b2tlbi5ob3ZlckJvcmRlckNvbG9yLFxuICAgIGFjdGl2ZUJvcmRlckNvbG9yOiB0b2tlbi5hY3RpdmVCb3JkZXJDb2xvcixcbiAgICBhY3RpdmVTaGFkb3c6IHRva2VuLmFjdGl2ZVNoYWRvd1xuICB9KSksIHtcbiAgICAvLyA+Pj4+PiBEaXNhYmxlZFxuICAgIFtgJiR7dG9rZW4uY29tcG9uZW50Q2xzfS1kaXNhYmxlZCwgJltkaXNhYmxlZF1gXToge1xuICAgICAgY29sb3I6IHRva2VuLmNvbG9yVGV4dERpc2FibGVkLFxuICAgICAgYm94U2hhZG93OiAnbm9uZScsXG4gICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCcsXG4gICAgICAnJjpob3Zlcic6IHtcbiAgICAgICAgYm9yZGVyQ29sb3I6IGB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCAke3Rva2VuLmNvbG9yQm9yZGVyfSB0cmFuc3BhcmVudGBcbiAgICAgIH1cbiAgICB9LFxuICAgICdpbnB1dFtkaXNhYmxlZF0sIHRleHRhcmVhW2Rpc2FibGVkXSc6IHtcbiAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkJ1xuICAgIH1cbiAgfSksIGdlblVuZGVybGluZWRTdGF0dXNTdHlsZSh0b2tlbiwge1xuICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICBib3JkZXJDb2xvcjogdG9rZW4uY29sb3JFcnJvcixcbiAgICBob3ZlckJvcmRlckNvbG9yOiB0b2tlbi5jb2xvckVycm9yQm9yZGVySG92ZXIsXG4gICAgYWN0aXZlQm9yZGVyQ29sb3I6IHRva2VuLmNvbG9yRXJyb3IsXG4gICAgYWN0aXZlU2hhZG93OiB0b2tlbi5lcnJvckFjdGl2ZVNoYWRvdyxcbiAgICBhZmZpeENvbG9yOiB0b2tlbi5jb2xvckVycm9yXG4gIH0pKSwgZ2VuVW5kZXJsaW5lZFN0YXR1c1N0eWxlKHRva2VuLCB7XG4gICAgc3RhdHVzOiAnd2FybmluZycsXG4gICAgYm9yZGVyQ29sb3I6IHRva2VuLmNvbG9yV2FybmluZyxcbiAgICBob3ZlckJvcmRlckNvbG9yOiB0b2tlbi5jb2xvcldhcm5pbmdCb3JkZXJIb3ZlcixcbiAgICBhY3RpdmVCb3JkZXJDb2xvcjogdG9rZW4uY29sb3JXYXJuaW5nLFxuICAgIGFjdGl2ZVNoYWRvdzogdG9rZW4ud2FybmluZ0FjdGl2ZVNoYWRvdyxcbiAgICBhZmZpeENvbG9yOiB0b2tlbi5jb2xvcldhcm5pbmdcbiAgfSkpLCBleHRyYVN0eWxlcylcbn0pOyIsICJpbXBvcnQgeyB1bml0IH0gZnJvbSAnQGFudC1kZXNpZ24vY3NzaW5qcyc7XG5pbXBvcnQgeyBjbGVhckZpeCwgcmVzZXRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9zdHlsZSc7XG5pbXBvcnQgeyBnZW5Db21wYWN0SXRlbVN0eWxlIH0gZnJvbSAnLi4vLi4vc3R5bGUvY29tcGFjdC1pdGVtJztcbmltcG9ydCB7IGdlblN0eWxlSG9va3MsIG1lcmdlVG9rZW4gfSBmcm9tICcuLi8uLi90aGVtZS9pbnRlcm5hbCc7XG5pbXBvcnQgeyBpbml0Q29tcG9uZW50VG9rZW4sIGluaXRJbnB1dFRva2VuIH0gZnJvbSAnLi90b2tlbic7XG5pbXBvcnQgeyBnZW5Cb3JkZXJsZXNzU3R5bGUsIGdlbkZpbGxlZEdyb3VwU3R5bGUsIGdlbkZpbGxlZFN0eWxlLCBnZW5PdXRsaW5lZEdyb3VwU3R5bGUsIGdlbk91dGxpbmVkU3R5bGUsIGdlblVuZGVybGluZWRTdHlsZSB9IGZyb20gJy4vdmFyaWFudHMnO1xuZXhwb3J0IHsgaW5pdENvbXBvbmVudFRva2VuLCBpbml0SW5wdXRUb2tlbiB9O1xuZXhwb3J0IGNvbnN0IGdlblBsYWNlaG9sZGVyU3R5bGUgPSBjb2xvciA9PiAoe1xuICAvLyBGaXJlZm94XG4gICcmOjotbW96LXBsYWNlaG9sZGVyJzoge1xuICAgIG9wYWNpdHk6IDFcbiAgfSxcbiAgJyY6OnBsYWNlaG9sZGVyJzoge1xuICAgIGNvbG9yLFxuICAgIHVzZXJTZWxlY3Q6ICdub25lJyAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL3B1bGwvMzI2MzlcbiAgfSxcbiAgJyY6cGxhY2Vob2xkZXItc2hvd24nOiB7XG4gICAgdGV4dE92ZXJmbG93OiAnZWxsaXBzaXMnXG4gIH1cbn0pO1xuZXhwb3J0IGNvbnN0IGdlbkFjdGl2ZVN0eWxlID0gdG9rZW4gPT4gKHtcbiAgYm9yZGVyQ29sb3I6IHRva2VuLmFjdGl2ZUJvcmRlckNvbG9yLFxuICBib3hTaGFkb3c6IHRva2VuLmFjdGl2ZVNoYWRvdyxcbiAgb3V0bGluZTogMCxcbiAgYmFja2dyb3VuZENvbG9yOiB0b2tlbi5hY3RpdmVCZ1xufSk7XG5jb25zdCBnZW5JbnB1dExhcmdlU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBwYWRkaW5nQmxvY2tMRyxcbiAgICBsaW5lSGVpZ2h0TEcsXG4gICAgYm9yZGVyUmFkaXVzTEcsXG4gICAgcGFkZGluZ0lubGluZUxHXG4gIH0gPSB0b2tlbjtcbiAgcmV0dXJuIHtcbiAgICBwYWRkaW5nOiBgJHt1bml0KHBhZGRpbmdCbG9ja0xHKX0gJHt1bml0KHBhZGRpbmdJbmxpbmVMRyl9YCxcbiAgICBmb250U2l6ZTogdG9rZW4uaW5wdXRGb250U2l6ZUxHLFxuICAgIGxpbmVIZWlnaHQ6IGxpbmVIZWlnaHRMRyxcbiAgICBib3JkZXJSYWRpdXM6IGJvcmRlclJhZGl1c0xHXG4gIH07XG59O1xuZXhwb3J0IGNvbnN0IGdlbklucHV0U21hbGxTdHlsZSA9IHRva2VuID0+ICh7XG4gIHBhZGRpbmc6IGAke3VuaXQodG9rZW4ucGFkZGluZ0Jsb2NrU00pfSAke3VuaXQodG9rZW4ucGFkZGluZ0lubGluZVNNKX1gLFxuICBmb250U2l6ZTogdG9rZW4uaW5wdXRGb250U2l6ZVNNLFxuICBib3JkZXJSYWRpdXM6IHRva2VuLmJvcmRlclJhZGl1c1NNXG59KTtcbmV4cG9ydCBjb25zdCBnZW5CYXNpY0lucHV0U3R5bGUgPSB0b2tlbiA9PiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe1xuICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gIHdpZHRoOiAnMTAwJScsXG4gIG1pbldpZHRoOiAwLFxuICBwYWRkaW5nOiBgJHt1bml0KHRva2VuLnBhZGRpbmdCbG9jayl9ICR7dW5pdCh0b2tlbi5wYWRkaW5nSW5saW5lKX1gLFxuICBjb2xvcjogdG9rZW4uY29sb3JUZXh0LFxuICBmb250U2l6ZTogdG9rZW4uaW5wdXRGb250U2l6ZSxcbiAgbGluZUhlaWdodDogdG9rZW4ubGluZUhlaWdodCxcbiAgYm9yZGVyUmFkaXVzOiB0b2tlbi5ib3JkZXJSYWRpdXMsXG4gIHRyYW5zaXRpb246IGBhbGwgJHt0b2tlbi5tb3Rpb25EdXJhdGlvbk1pZH1gXG59LCBnZW5QbGFjZWhvbGRlclN0eWxlKHRva2VuLmNvbG9yVGV4dFBsYWNlaG9sZGVyKSksIHtcbiAgLy8gU2l6ZVxuICAnJi1sZyc6IE9iamVjdC5hc3NpZ24oe30sIGdlbklucHV0TGFyZ2VTdHlsZSh0b2tlbikpLFxuICAnJi1zbSc6IE9iamVjdC5hc3NpZ24oe30sIGdlbklucHV0U21hbGxTdHlsZSh0b2tlbikpLFxuICAvLyBSVExcbiAgJyYtcnRsLCAmLXRleHRhcmVhLXJ0bCc6IHtcbiAgICBkaXJlY3Rpb246ICdydGwnXG4gIH1cbn0pO1xuZXhwb3J0IGNvbnN0IGdlbklucHV0R3JvdXBTdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENscyxcbiAgICBhbnRDbHNcbiAgfSA9IHRva2VuO1xuICByZXR1cm4ge1xuICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgIGRpc3BsYXk6ICd0YWJsZScsXG4gICAgd2lkdGg6ICcxMDAlJyxcbiAgICBib3JkZXJDb2xsYXBzZTogJ3NlcGFyYXRlJyxcbiAgICBib3JkZXJTcGFjaW5nOiAwLFxuICAgIC8vIFVuZG8gcGFkZGluZyBhbmQgZmxvYXQgb2YgZ3JpZCBjbGFzc2VzXG4gICAgXCImW2NsYXNzKj0nY29sLSddXCI6IHtcbiAgICAgIHBhZGRpbmdJbmxpbmVFbmQ6IHRva2VuLnBhZGRpbmdYUyxcbiAgICAgICcmOmxhc3QtY2hpbGQnOiB7XG4gICAgICAgIHBhZGRpbmdJbmxpbmVFbmQ6IDBcbiAgICAgIH1cbiAgICB9LFxuICAgIC8vIFNpemluZyBvcHRpb25zXG4gICAgW2AmLWxnICR7Y29tcG9uZW50Q2xzfSwgJi1sZyA+ICR7Y29tcG9uZW50Q2xzfS1ncm91cC1hZGRvbmBdOiBPYmplY3QuYXNzaWduKHt9LCBnZW5JbnB1dExhcmdlU3R5bGUodG9rZW4pKSxcbiAgICBbYCYtc20gJHtjb21wb25lbnRDbHN9LCAmLXNtID4gJHtjb21wb25lbnRDbHN9LWdyb3VwLWFkZG9uYF06IE9iamVjdC5hc3NpZ24oe30sIGdlbklucHV0U21hbGxTdHlsZSh0b2tlbikpLFxuICAgIC8vIEZpeCBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy81NzU0XG4gICAgW2AmLWxnICR7YW50Q2xzfS1zZWxlY3Qtc2luZ2xlICR7YW50Q2xzfS1zZWxlY3Qtc2VsZWN0b3JgXToge1xuICAgICAgaGVpZ2h0OiB0b2tlbi5jb250cm9sSGVpZ2h0TEdcbiAgICB9LFxuICAgIFtgJi1zbSAke2FudENsc30tc2VsZWN0LXNpbmdsZSAke2FudENsc30tc2VsZWN0LXNlbGVjdG9yYF06IHtcbiAgICAgIGhlaWdodDogdG9rZW4uY29udHJvbEhlaWdodFNNXG4gICAgfSxcbiAgICBbYD4gJHtjb21wb25lbnRDbHN9YF06IHtcbiAgICAgIGRpc3BsYXk6ICd0YWJsZS1jZWxsJyxcbiAgICAgICcmOm5vdCg6Zmlyc3QtY2hpbGQpOm5vdCg6bGFzdC1jaGlsZCknOiB7XG4gICAgICAgIGJvcmRlclJhZGl1czogMFxuICAgICAgfVxuICAgIH0sXG4gICAgW2Ake2NvbXBvbmVudENsc30tZ3JvdXBgXToge1xuICAgICAgJyYtYWRkb24sICYtd3JhcCc6IHtcbiAgICAgICAgZGlzcGxheTogJ3RhYmxlLWNlbGwnLFxuICAgICAgICB3aWR0aDogMSxcbiAgICAgICAgd2hpdGVTcGFjZTogJ25vd3JhcCcsXG4gICAgICAgIHZlcnRpY2FsQWxpZ246ICdtaWRkbGUnLFxuICAgICAgICAnJjpub3QoOmZpcnN0LWNoaWxkKTpub3QoOmxhc3QtY2hpbGQpJzoge1xuICAgICAgICAgIGJvcmRlclJhZGl1czogMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgJyYtd3JhcCA+IConOiB7XG4gICAgICAgIGRpc3BsYXk6ICdibG9jayAhaW1wb3J0YW50J1xuICAgICAgfSxcbiAgICAgICcmLWFkZG9uJzoge1xuICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgcGFkZGluZzogYDAgJHt1bml0KHRva2VuLnBhZGRpbmdJbmxpbmUpfWAsXG4gICAgICAgIGNvbG9yOiB0b2tlbi5jb2xvclRleHQsXG4gICAgICAgIGZvbnRXZWlnaHQ6ICdub3JtYWwnLFxuICAgICAgICBmb250U2l6ZTogdG9rZW4uaW5wdXRGb250U2l6ZSxcbiAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiB0b2tlbi5ib3JkZXJSYWRpdXMsXG4gICAgICAgIHRyYW5zaXRpb246IGBhbGwgJHt0b2tlbi5tb3Rpb25EdXJhdGlvblNsb3d9YCxcbiAgICAgICAgbGluZUhlaWdodDogMSxcbiAgICAgICAgLy8gUmVzZXQgU2VsZWN0J3Mgc3R5bGUgaW4gYWRkb25cbiAgICAgICAgW2Ake2FudENsc30tc2VsZWN0YF06IHtcbiAgICAgICAgICBtYXJnaW46IGAke3VuaXQodG9rZW4uY2FsYyh0b2tlbi5wYWRkaW5nQmxvY2spLmFkZCgxKS5tdWwoLTEpLmVxdWFsKCkpfSAke3VuaXQodG9rZW4uY2FsYyh0b2tlbi5wYWRkaW5nSW5saW5lKS5tdWwoLTEpLmVxdWFsKCkpfWAsXG4gICAgICAgICAgW2AmJHthbnRDbHN9LXNlbGVjdC1zaW5nbGU6bm90KCR7YW50Q2xzfS1zZWxlY3QtY3VzdG9taXplLWlucHV0KTpub3QoJHthbnRDbHN9LXBhZ2luYXRpb24tc2l6ZS1jaGFuZ2VyKWBdOiB7XG4gICAgICAgICAgICBbYCR7YW50Q2xzfS1zZWxlY3Qtc2VsZWN0b3JgXToge1xuICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdpbmhlcml0JyxcbiAgICAgICAgICAgICAgYm9yZGVyOiBgJHt1bml0KHRva2VuLmxpbmVXaWR0aCl9ICR7dG9rZW4ubGluZVR5cGV9IHRyYW5zcGFyZW50YCxcbiAgICAgICAgICAgICAgYm94U2hhZG93OiAnbm9uZSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzMxMzMzXG4gICAgICAgIFtgJHthbnRDbHN9LWNhc2NhZGVyLXBpY2tlcmBdOiB7XG4gICAgICAgICAgbWFyZ2luOiBgLTlweCAke3VuaXQodG9rZW4uY2FsYyh0b2tlbi5wYWRkaW5nSW5saW5lKS5tdWwoLTEpLmVxdWFsKCkpfWAsXG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICAgIFtgJHthbnRDbHN9LWNhc2NhZGVyLWlucHV0YF06IHtcbiAgICAgICAgICAgIHRleHRBbGlnbjogJ3N0YXJ0JyxcbiAgICAgICAgICAgIGJvcmRlcjogMCxcbiAgICAgICAgICAgIGJveFNoYWRvdzogJ25vbmUnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbY29tcG9uZW50Q2xzXToge1xuICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgIG1hcmdpbkJvdHRvbTogMCxcbiAgICAgIHRleHRBbGlnbjogJ2luaGVyaXQnLFxuICAgICAgJyY6Zm9jdXMnOiB7XG4gICAgICAgIHpJbmRleDogMSxcbiAgICAgICAgLy8gRml4IGh0dHBzOi8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL3Jtc3BvcnRhbC9ESE5wb3FmTVhTZnJTbmxadmhzSi5wbmdcbiAgICAgICAgYm9yZGVySW5saW5lRW5kV2lkdGg6IDFcbiAgICAgIH0sXG4gICAgICAnJjpob3Zlcic6IHtcbiAgICAgICAgekluZGV4OiAxLFxuICAgICAgICBib3JkZXJJbmxpbmVFbmRXaWR0aDogMSxcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30tc2VhcmNoLXdpdGgtYnV0dG9uICZgXToge1xuICAgICAgICAgIHpJbmRleDogMFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICAvLyBSZXNldCByb3VuZGVkIGNvcm5lcnNcbiAgICBbYD4gJHtjb21wb25lbnRDbHN9OmZpcnN0LWNoaWxkLCAke2NvbXBvbmVudENsc30tZ3JvdXAtYWRkb246Zmlyc3QtY2hpbGRgXToge1xuICAgICAgYm9yZGVyU3RhcnRFbmRSYWRpdXM6IDAsXG4gICAgICBib3JkZXJFbmRFbmRSYWRpdXM6IDAsXG4gICAgICAvLyBSZXNldCBTZWxlY3QncyBzdHlsZSBpbiBhZGRvblxuICAgICAgW2Ake2FudENsc30tc2VsZWN0ICR7YW50Q2xzfS1zZWxlY3Qtc2VsZWN0b3JgXToge1xuICAgICAgICBib3JkZXJTdGFydEVuZFJhZGl1czogMCxcbiAgICAgICAgYm9yZGVyRW5kRW5kUmFkaXVzOiAwXG4gICAgICB9XG4gICAgfSxcbiAgICBbYD4gJHtjb21wb25lbnRDbHN9LWFmZml4LXdyYXBwZXJgXToge1xuICAgICAgW2AmOm5vdCg6Zmlyc3QtY2hpbGQpICR7Y29tcG9uZW50Q2xzfWBdOiB7XG4gICAgICAgIGJvcmRlclN0YXJ0U3RhcnRSYWRpdXM6IDAsXG4gICAgICAgIGJvcmRlckVuZFN0YXJ0UmFkaXVzOiAwXG4gICAgICB9LFxuICAgICAgW2AmOm5vdCg6bGFzdC1jaGlsZCkgJHtjb21wb25lbnRDbHN9YF06IHtcbiAgICAgICAgYm9yZGVyU3RhcnRFbmRSYWRpdXM6IDAsXG4gICAgICAgIGJvcmRlckVuZEVuZFJhZGl1czogMFxuICAgICAgfVxuICAgIH0sXG4gICAgW2A+ICR7Y29tcG9uZW50Q2xzfTpsYXN0LWNoaWxkLCAke2NvbXBvbmVudENsc30tZ3JvdXAtYWRkb246bGFzdC1jaGlsZGBdOiB7XG4gICAgICBib3JkZXJTdGFydFN0YXJ0UmFkaXVzOiAwLFxuICAgICAgYm9yZGVyRW5kU3RhcnRSYWRpdXM6IDAsXG4gICAgICAvLyBSZXNldCBTZWxlY3QncyBzdHlsZSBpbiBhZGRvblxuICAgICAgW2Ake2FudENsc30tc2VsZWN0ICR7YW50Q2xzfS1zZWxlY3Qtc2VsZWN0b3JgXToge1xuICAgICAgICBib3JkZXJTdGFydFN0YXJ0UmFkaXVzOiAwLFxuICAgICAgICBib3JkZXJFbmRTdGFydFJhZGl1czogMFxuICAgICAgfVxuICAgIH0sXG4gICAgW2Ake2NvbXBvbmVudENsc30tYWZmaXgtd3JhcHBlcmBdOiB7XG4gICAgICAnJjpub3QoOmxhc3QtY2hpbGQpJzoge1xuICAgICAgICBib3JkZXJTdGFydEVuZFJhZGl1czogMCxcbiAgICAgICAgYm9yZGVyRW5kRW5kUmFkaXVzOiAwLFxuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1zZWFyY2ggJmBdOiB7XG4gICAgICAgICAgYm9yZGVyU3RhcnRTdGFydFJhZGl1czogdG9rZW4uYm9yZGVyUmFkaXVzLFxuICAgICAgICAgIGJvcmRlckVuZFN0YXJ0UmFkaXVzOiB0b2tlbi5ib3JkZXJSYWRpdXNcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtgJjpub3QoOmZpcnN0LWNoaWxkKSwgJHtjb21wb25lbnRDbHN9LXNlYXJjaCAmOm5vdCg6Zmlyc3QtY2hpbGQpYF06IHtcbiAgICAgICAgYm9yZGVyU3RhcnRTdGFydFJhZGl1czogMCxcbiAgICAgICAgYm9yZGVyRW5kU3RhcnRSYWRpdXM6IDBcbiAgICAgIH1cbiAgICB9LFxuICAgIFtgJiR7Y29tcG9uZW50Q2xzfS1ncm91cC1jb21wYWN0YF06IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7XG4gICAgICBkaXNwbGF5OiAnYmxvY2snXG4gICAgfSwgY2xlYXJGaXgoKSksIHtcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWdyb3VwLWFkZG9uLCAke2NvbXBvbmVudENsc30tZ3JvdXAtd3JhcCwgPiAke2NvbXBvbmVudENsc31gXToge1xuICAgICAgICAnJjpub3QoOmZpcnN0LWNoaWxkKTpub3QoOmxhc3QtY2hpbGQpJzoge1xuICAgICAgICAgIGJvcmRlcklubGluZUVuZFdpZHRoOiB0b2tlbi5saW5lV2lkdGgsXG4gICAgICAgICAgJyY6aG92ZXIsICY6Zm9jdXMnOiB7XG4gICAgICAgICAgICB6SW5kZXg6IDFcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAnJiA+IConOiB7XG4gICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtZmxleCcsXG4gICAgICAgIGZsb2F0OiAnbm9uZScsXG4gICAgICAgIHZlcnRpY2FsQWxpZ246ICd0b3AnLFxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduLXByby9pc3N1ZXMvMTM5XG4gICAgICAgIGJvcmRlclJhZGl1czogMFxuICAgICAgfSxcbiAgICAgIFtgXG4gICAgICAgICYgPiAke2NvbXBvbmVudENsc30tYWZmaXgtd3JhcHBlcixcbiAgICAgICAgJiA+ICR7Y29tcG9uZW50Q2xzfS1udW1iZXItYWZmaXgtd3JhcHBlcixcbiAgICAgICAgJiA+ICR7YW50Q2xzfS1waWNrZXItcmFuZ2VcbiAgICAgIGBdOiB7XG4gICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtZmxleCdcbiAgICAgIH0sXG4gICAgICAnJiA+ICo6bm90KDpsYXN0LWNoaWxkKSc6IHtcbiAgICAgICAgbWFyZ2luSW5saW5lRW5kOiB0b2tlbi5jYWxjKHRva2VuLmxpbmVXaWR0aCkubXVsKC0xKS5lcXVhbCgpLFxuICAgICAgICBib3JkZXJJbmxpbmVFbmRXaWR0aDogdG9rZW4ubGluZVdpZHRoXG4gICAgICB9LFxuICAgICAgLy8gVW5kbyBmbG9hdCBmb3IgLmFudC1pbnB1dC1ncm91cCAuYW50LWlucHV0XG4gICAgICBbY29tcG9uZW50Q2xzXToge1xuICAgICAgICBmbG9hdDogJ25vbmUnXG4gICAgICB9LFxuICAgICAgLy8gcmVzZXQgYm9yZGVyIGZvciBTZWxlY3QsIERhdGVQaWNrZXIsIEF1dG9Db21wbGV0ZSwgQ2FzY2FkZXIsIE1lbnRpb24sIFRpbWVQaWNrZXIsIElucHV0XG4gICAgICBbYCYgPiAke2FudENsc30tc2VsZWN0ID4gJHthbnRDbHN9LXNlbGVjdC1zZWxlY3RvcixcbiAgICAgICYgPiAke2FudENsc30tc2VsZWN0LWF1dG8tY29tcGxldGUgJHtjb21wb25lbnRDbHN9LFxuICAgICAgJiA+ICR7YW50Q2xzfS1jYXNjYWRlci1waWNrZXIgJHtjb21wb25lbnRDbHN9LFxuICAgICAgJiA+ICR7Y29tcG9uZW50Q2xzfS1ncm91cC13cmFwcGVyICR7Y29tcG9uZW50Q2xzfWBdOiB7XG4gICAgICAgIGJvcmRlcklubGluZUVuZFdpZHRoOiB0b2tlbi5saW5lV2lkdGgsXG4gICAgICAgIGJvcmRlclJhZGl1czogMCxcbiAgICAgICAgJyY6aG92ZXIsICY6Zm9jdXMnOiB7XG4gICAgICAgICAgekluZGV4OiAxXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbYCYgPiAke2FudENsc30tc2VsZWN0LWZvY3VzZWRgXToge1xuICAgICAgICB6SW5kZXg6IDFcbiAgICAgIH0sXG4gICAgICAvLyB1cGRhdGUgei1pbmRleCBmb3IgYXJyb3cgaWNvblxuICAgICAgW2AmID4gJHthbnRDbHN9LXNlbGVjdCA+ICR7YW50Q2xzfS1zZWxlY3QtYXJyb3dgXToge1xuICAgICAgICB6SW5kZXg6IDEgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMjAzNzFcbiAgICAgIH0sXG4gICAgICBbYCYgPiAqOmZpcnN0LWNoaWxkLFxuICAgICAgJiA+ICR7YW50Q2xzfS1zZWxlY3Q6Zmlyc3QtY2hpbGQgPiAke2FudENsc30tc2VsZWN0LXNlbGVjdG9yLFxuICAgICAgJiA+ICR7YW50Q2xzfS1zZWxlY3QtYXV0by1jb21wbGV0ZTpmaXJzdC1jaGlsZCAke2NvbXBvbmVudENsc30sXG4gICAgICAmID4gJHthbnRDbHN9LWNhc2NhZGVyLXBpY2tlcjpmaXJzdC1jaGlsZCAke2NvbXBvbmVudENsc31gXToge1xuICAgICAgICBib3JkZXJTdGFydFN0YXJ0UmFkaXVzOiB0b2tlbi5ib3JkZXJSYWRpdXMsXG4gICAgICAgIGJvcmRlckVuZFN0YXJ0UmFkaXVzOiB0b2tlbi5ib3JkZXJSYWRpdXNcbiAgICAgIH0sXG4gICAgICBbYCYgPiAqOmxhc3QtY2hpbGQsXG4gICAgICAmID4gJHthbnRDbHN9LXNlbGVjdDpsYXN0LWNoaWxkID4gJHthbnRDbHN9LXNlbGVjdC1zZWxlY3RvcixcbiAgICAgICYgPiAke2FudENsc30tY2FzY2FkZXItcGlja2VyOmxhc3QtY2hpbGQgJHtjb21wb25lbnRDbHN9LFxuICAgICAgJiA+ICR7YW50Q2xzfS1jYXNjYWRlci1waWNrZXItZm9jdXNlZDpsYXN0LWNoaWxkICR7Y29tcG9uZW50Q2xzfWBdOiB7XG4gICAgICAgIGJvcmRlcklubGluZUVuZFdpZHRoOiB0b2tlbi5saW5lV2lkdGgsXG4gICAgICAgIGJvcmRlclN0YXJ0RW5kUmFkaXVzOiB0b2tlbi5ib3JkZXJSYWRpdXMsXG4gICAgICAgIGJvcmRlckVuZEVuZFJhZGl1czogdG9rZW4uYm9yZGVyUmFkaXVzXG4gICAgICB9LFxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMTI0OTNcbiAgICAgIFtgJiA+ICR7YW50Q2xzfS1zZWxlY3QtYXV0by1jb21wbGV0ZSAke2NvbXBvbmVudENsc31gXToge1xuICAgICAgICB2ZXJ0aWNhbEFsaWduOiAndG9wJ1xuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWdyb3VwLXdyYXBwZXIgKyAke2NvbXBvbmVudENsc30tZ3JvdXAtd3JhcHBlcmBdOiB7XG4gICAgICAgIG1hcmdpbklubGluZVN0YXJ0OiB0b2tlbi5jYWxjKHRva2VuLmxpbmVXaWR0aCkubXVsKC0xKS5lcXVhbCgpLFxuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1hZmZpeC13cmFwcGVyYF06IHtcbiAgICAgICAgICBib3JkZXJSYWRpdXM6IDBcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWdyb3VwLXdyYXBwZXI6bm90KDpsYXN0LWNoaWxkKWBdOiB7XG4gICAgICAgIFtgJiR7Y29tcG9uZW50Q2xzfS1zZWFyY2ggPiAke2NvbXBvbmVudENsc30tZ3JvdXBgXToge1xuICAgICAgICAgIFtgJiA+ICR7Y29tcG9uZW50Q2xzfS1ncm91cC1hZGRvbiA+ICR7Y29tcG9uZW50Q2xzfS1zZWFyY2gtYnV0dG9uYF06IHtcbiAgICAgICAgICAgIGJvcmRlclJhZGl1czogMFxuICAgICAgICAgIH0sXG4gICAgICAgICAgW2AmID4gJHtjb21wb25lbnRDbHN9YF06IHtcbiAgICAgICAgICAgIGJvcmRlclN0YXJ0U3RhcnRSYWRpdXM6IHRva2VuLmJvcmRlclJhZGl1cyxcbiAgICAgICAgICAgIGJvcmRlclN0YXJ0RW5kUmFkaXVzOiAwLFxuICAgICAgICAgICAgYm9yZGVyRW5kRW5kUmFkaXVzOiAwLFxuICAgICAgICAgICAgYm9yZGVyRW5kU3RhcnRSYWRpdXM6IHRva2VuLmJvcmRlclJhZGl1c1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH07XG59O1xuZXhwb3J0IGNvbnN0IGdlbklucHV0U3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHMsXG4gICAgY29udHJvbEhlaWdodFNNLFxuICAgIGxpbmVXaWR0aCxcbiAgICBjYWxjXG4gIH0gPSB0b2tlbjtcbiAgY29uc3QgRklYRURfQ0hST01FX0NPTE9SX0hFSUdIVCA9IDE2O1xuICBjb25zdCBjb2xvclNtYWxsUGFkZGluZyA9IGNhbGMoY29udHJvbEhlaWdodFNNKS5zdWIoY2FsYyhsaW5lV2lkdGgpLm11bCgyKSkuc3ViKEZJWEVEX0NIUk9NRV9DT0xPUl9IRUlHSFQpLmRpdigyKS5lcXVhbCgpO1xuICByZXR1cm4ge1xuICAgIFtjb21wb25lbnRDbHNdOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXNldENvbXBvbmVudCh0b2tlbikpLCBnZW5CYXNpY0lucHV0U3R5bGUodG9rZW4pKSwgZ2VuT3V0bGluZWRTdHlsZSh0b2tlbikpLCBnZW5GaWxsZWRTdHlsZSh0b2tlbikpLCBnZW5Cb3JkZXJsZXNzU3R5bGUodG9rZW4pKSwgZ2VuVW5kZXJsaW5lZFN0eWxlKHRva2VuKSksIHtcbiAgICAgICcmW3R5cGU9XCJjb2xvclwiXSc6IHtcbiAgICAgICAgaGVpZ2h0OiB0b2tlbi5jb250cm9sSGVpZ2h0LFxuICAgICAgICBbYCYke2NvbXBvbmVudENsc30tbGdgXToge1xuICAgICAgICAgIGhlaWdodDogdG9rZW4uY29udHJvbEhlaWdodExHXG4gICAgICAgIH0sXG4gICAgICAgIFtgJiR7Y29tcG9uZW50Q2xzfS1zbWBdOiB7XG4gICAgICAgICAgaGVpZ2h0OiBjb250cm9sSGVpZ2h0U00sXG4gICAgICAgICAgcGFkZGluZ1RvcDogY29sb3JTbWFsbFBhZGRpbmcsXG4gICAgICAgICAgcGFkZGluZ0JvdHRvbTogY29sb3JTbWFsbFBhZGRpbmdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICcmW3R5cGU9XCJzZWFyY2hcIl06Oi13ZWJraXQtc2VhcmNoLWNhbmNlbC1idXR0b24sICZbdHlwZT1cInNlYXJjaFwiXTo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbic6IHtcbiAgICAgICAgYXBwZWFyYW5jZTogJ25vbmUnXG4gICAgICB9XG4gICAgfSlcbiAgfTtcbn07XG5jb25zdCBnZW5BbGxvd0NsZWFyU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHNcbiAgfSA9IHRva2VuO1xuICByZXR1cm4ge1xuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gSW5wdXQgPT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIFtgJHtjb21wb25lbnRDbHN9LWNsZWFyLWljb25gXToge1xuICAgICAgbWFyZ2luOiAwLFxuICAgICAgcGFkZGluZzogMCxcbiAgICAgIGxpbmVIZWlnaHQ6IDAsXG4gICAgICBjb2xvcjogdG9rZW4uY29sb3JUZXh0UXVhdGVybmFyeSxcbiAgICAgIGZvbnRTaXplOiB0b2tlbi5mb250U2l6ZUljb24sXG4gICAgICB2ZXJ0aWNhbEFsaWduOiAtMSxcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vcHVsbC8xODE1MVxuICAgICAgLy8gaHR0cHM6Ly9jb2Rlc2FuZGJveC5pby9zL3dpemFyZGx5LXN1bi11MTBiclxuICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgICB0cmFuc2l0aW9uOiBgY29sb3IgJHt0b2tlbi5tb3Rpb25EdXJhdGlvblNsb3d9YCxcbiAgICAgIGJvcmRlcjogJ25vbmUnLFxuICAgICAgb3V0bGluZTogJ25vbmUnLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiAndHJhbnNwYXJlbnQnLFxuICAgICAgJyY6aG92ZXInOiB7XG4gICAgICAgIGNvbG9yOiB0b2tlbi5jb2xvclRleHRUZXJ0aWFyeVxuICAgICAgfSxcbiAgICAgICcmOmFjdGl2ZSc6IHtcbiAgICAgICAgY29sb3I6IHRva2VuLmNvbG9yVGV4dFxuICAgICAgfSxcbiAgICAgICcmLWhpZGRlbic6IHtcbiAgICAgICAgdmlzaWJpbGl0eTogJ2hpZGRlbidcbiAgICAgIH0sXG4gICAgICAnJi1oYXMtc3VmZml4Jzoge1xuICAgICAgICBtYXJnaW46IGAwICR7dW5pdCh0b2tlbi5pbnB1dEFmZml4UGFkZGluZyl9YFxuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG5leHBvcnQgY29uc3QgZ2VuQWZmaXhTdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENscyxcbiAgICBpbnB1dEFmZml4UGFkZGluZyxcbiAgICBjb2xvclRleHREZXNjcmlwdGlvbixcbiAgICBtb3Rpb25EdXJhdGlvblNsb3csXG4gICAgY29sb3JJY29uLFxuICAgIGNvbG9ySWNvbkhvdmVyLFxuICAgIGljb25DbHNcbiAgfSA9IHRva2VuO1xuICBjb25zdCBhZmZpeENscyA9IGAke2NvbXBvbmVudENsc30tYWZmaXgtd3JhcHBlcmA7XG4gIGNvbnN0IGFmZml4Q2xzRGlzYWJsZWQgPSBgJHtjb21wb25lbnRDbHN9LWFmZml4LXdyYXBwZXItZGlzYWJsZWRgO1xuICByZXR1cm4ge1xuICAgIFthZmZpeENsc106IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGdlbkJhc2ljSW5wdXRTdHlsZSh0b2tlbikpLCB7XG4gICAgICBkaXNwbGF5OiAnaW5saW5lLWZsZXgnLFxuICAgICAgW2AmOm5vdCgke2NvbXBvbmVudENsc30tZGlzYWJsZWQpOmhvdmVyYF06IHtcbiAgICAgICAgekluZGV4OiAxLFxuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1zZWFyY2gtd2l0aC1idXR0b24gJmBdOiB7XG4gICAgICAgICAgekluZGV4OiAwXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAnJi1mb2N1c2VkLCAmOmZvY3VzJzoge1xuICAgICAgICB6SW5kZXg6IDFcbiAgICAgIH0sXG4gICAgICBbYD4gaW5wdXQke2NvbXBvbmVudENsc31gXToge1xuICAgICAgICBwYWRkaW5nOiAwXG4gICAgICB9LFxuICAgICAgW2A+IGlucHV0JHtjb21wb25lbnRDbHN9LCA+IHRleHRhcmVhJHtjb21wb25lbnRDbHN9YF06IHtcbiAgICAgICAgZm9udFNpemU6ICdpbmhlcml0JyxcbiAgICAgICAgYm9yZGVyOiAnbm9uZScsXG4gICAgICAgIGJvcmRlclJhZGl1czogMCxcbiAgICAgICAgb3V0bGluZTogJ25vbmUnLFxuICAgICAgICBiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICBjb2xvcjogJ2luaGVyaXQnLFxuICAgICAgICAnJjo6LW1zLXJldmVhbCc6IHtcbiAgICAgICAgICBkaXNwbGF5OiAnbm9uZSdcbiAgICAgICAgfSxcbiAgICAgICAgJyY6Zm9jdXMnOiB7XG4gICAgICAgICAgYm94U2hhZG93OiAnbm9uZSAhaW1wb3J0YW50J1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgJyY6OmJlZm9yZSc6IHtcbiAgICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICAgIHdpZHRoOiAwLFxuICAgICAgICB2aXNpYmlsaXR5OiAnaGlkZGVuJyxcbiAgICAgICAgY29udGVudDogJ1wiXFxcXGEwXCInXG4gICAgICB9LFxuICAgICAgW2NvbXBvbmVudENsc106IHtcbiAgICAgICAgJyYtcHJlZml4LCAmLXN1ZmZpeCc6IHtcbiAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgZmxleDogJ25vbmUnLFxuICAgICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICAgICc+ICo6bm90KDpsYXN0LWNoaWxkKSc6IHtcbiAgICAgICAgICAgIG1hcmdpbklubGluZUVuZDogdG9rZW4ucGFkZGluZ1hTXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAnJi1zaG93LWNvdW50LXN1ZmZpeCc6IHtcbiAgICAgICAgICBjb2xvcjogY29sb3JUZXh0RGVzY3JpcHRpb25cbiAgICAgICAgfSxcbiAgICAgICAgJyYtc2hvdy1jb3VudC1oYXMtc3VmZml4Jzoge1xuICAgICAgICAgIG1hcmdpbklubGluZUVuZDogdG9rZW4ucGFkZGluZ1hYU1xuICAgICAgICB9LFxuICAgICAgICAnJi1wcmVmaXgnOiB7XG4gICAgICAgICAgbWFyZ2luSW5saW5lRW5kOiBpbnB1dEFmZml4UGFkZGluZ1xuICAgICAgICB9LFxuICAgICAgICAnJi1zdWZmaXgnOiB7XG4gICAgICAgICAgbWFyZ2luSW5saW5lU3RhcnQ6IGlucHV0QWZmaXhQYWRkaW5nXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSwgZ2VuQWxsb3dDbGVhclN0eWxlKHRva2VuKSksIHtcbiAgICAgIC8vIHBhc3N3b3JkXG4gICAgICBbYCR7aWNvbkNsc30ke2NvbXBvbmVudENsc30tcGFzc3dvcmQtaWNvbmBdOiB7XG4gICAgICAgIGNvbG9yOiBjb2xvckljb24sXG4gICAgICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgICAgICB0cmFuc2l0aW9uOiBgYWxsICR7bW90aW9uRHVyYXRpb25TbG93fWAsXG4gICAgICAgICcmOmhvdmVyJzoge1xuICAgICAgICAgIGNvbG9yOiBjb2xvckljb25Ib3ZlclxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSksXG4gICAgLy8gXHU4OTg2XHU3NkQ2IGFmZml4LXdyYXBwZXIgYm9yZGVyUmFkaXVzXHVGRjAxXG4gICAgW2Ake2NvbXBvbmVudENsc30tdW5kZXJsaW5lZGBdOiB7XG4gICAgICBib3JkZXJSYWRpdXM6IDBcbiAgICB9LFxuICAgIFthZmZpeENsc0Rpc2FibGVkXToge1xuICAgICAgLy8gcGFzc3dvcmQgZGlzYWJsZWRcbiAgICAgIFtgJHtpY29uQ2xzfSR7Y29tcG9uZW50Q2xzfS1wYXNzd29yZC1pY29uYF06IHtcbiAgICAgICAgY29sb3I6IGNvbG9ySWNvbixcbiAgICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQnLFxuICAgICAgICAnJjpob3Zlcic6IHtcbiAgICAgICAgICBjb2xvcjogY29sb3JJY29uXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xuY29uc3QgZ2VuR3JvdXBTdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENscyxcbiAgICBib3JkZXJSYWRpdXNMRyxcbiAgICBib3JkZXJSYWRpdXNTTVxuICB9ID0gdG9rZW47XG4gIHJldHVybiB7XG4gICAgW2Ake2NvbXBvbmVudENsc30tZ3JvdXBgXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlc2V0Q29tcG9uZW50KHRva2VuKSksIGdlbklucHV0R3JvdXBTdHlsZSh0b2tlbikpLCB7XG4gICAgICAnJi1ydGwnOiB7XG4gICAgICAgIGRpcmVjdGlvbjogJ3J0bCdcbiAgICAgIH0sXG4gICAgICAnJi13cmFwcGVyJzogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe1xuICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJyxcbiAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgdGV4dEFsaWduOiAnc3RhcnQnLFxuICAgICAgICB2ZXJ0aWNhbEFsaWduOiAndG9wJyxcbiAgICAgICAgJyYtcnRsJzoge1xuICAgICAgICAgIGRpcmVjdGlvbjogJ3J0bCdcbiAgICAgICAgfSxcbiAgICAgICAgLy8gU2l6ZVxuICAgICAgICAnJi1sZyc6IHtcbiAgICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1ncm91cC1hZGRvbmBdOiB7XG4gICAgICAgICAgICBib3JkZXJSYWRpdXM6IGJvcmRlclJhZGl1c0xHLFxuICAgICAgICAgICAgZm9udFNpemU6IHRva2VuLmlucHV0Rm9udFNpemVMR1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgJyYtc20nOiB7XG4gICAgICAgICAgW2Ake2NvbXBvbmVudENsc30tZ3JvdXAtYWRkb25gXToge1xuICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBib3JkZXJSYWRpdXNTTVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgZ2VuT3V0bGluZWRHcm91cFN0eWxlKHRva2VuKSksIGdlbkZpbGxlZEdyb3VwU3R5bGUodG9rZW4pKSwge1xuICAgICAgICAvLyAnJi1kaXNhYmxlZCc6IHtcbiAgICAgICAgLy8gICBbYCR7Y29tcG9uZW50Q2xzfS1ncm91cC1hZGRvbmBdOiB7XG4gICAgICAgIC8vICAgICAuLi5nZW5EaXNhYmxlZFN0eWxlKHRva2VuKSxcbiAgICAgICAgLy8gICB9LFxuICAgICAgICAvLyB9LFxuICAgICAgICAvLyBGaXggdGhlIGlzc3VlIG9mIHVzaW5nIGljb25zIGluIFNwYWNlIENvbXBhY3QgbW9kZVxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy80MjEyMlxuICAgICAgICBbYCY6bm90KCR7Y29tcG9uZW50Q2xzfS1jb21wYWN0LWZpcnN0LWl0ZW0pOm5vdCgke2NvbXBvbmVudENsc30tY29tcGFjdC1sYXN0LWl0ZW0pJHtjb21wb25lbnRDbHN9LWNvbXBhY3QtaXRlbWBdOiB7XG4gICAgICAgICAgW2Ake2NvbXBvbmVudENsc30sICR7Y29tcG9uZW50Q2xzfS1ncm91cC1hZGRvbmBdOiB7XG4gICAgICAgICAgICBib3JkZXJSYWRpdXM6IDBcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtgJjpub3QoJHtjb21wb25lbnRDbHN9LWNvbXBhY3QtbGFzdC1pdGVtKSR7Y29tcG9uZW50Q2xzfS1jb21wYWN0LWZpcnN0LWl0ZW1gXToge1xuICAgICAgICAgIFtgJHtjb21wb25lbnRDbHN9LCAke2NvbXBvbmVudENsc30tZ3JvdXAtYWRkb25gXToge1xuICAgICAgICAgICAgYm9yZGVyU3RhcnRFbmRSYWRpdXM6IDAsXG4gICAgICAgICAgICBib3JkZXJFbmRFbmRSYWRpdXM6IDBcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtgJjpub3QoJHtjb21wb25lbnRDbHN9LWNvbXBhY3QtZmlyc3QtaXRlbSkke2NvbXBvbmVudENsc30tY29tcGFjdC1sYXN0LWl0ZW1gXToge1xuICAgICAgICAgIFtgJHtjb21wb25lbnRDbHN9LCAke2NvbXBvbmVudENsc30tZ3JvdXAtYWRkb25gXToge1xuICAgICAgICAgICAgYm9yZGVyU3RhcnRTdGFydFJhZGl1czogMCxcbiAgICAgICAgICAgIGJvcmRlckVuZFN0YXJ0UmFkaXVzOiAwXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAvLyBGaXggdGhlIGlzc3VlIG9mIGlucHV0IHVzZSBzaG93LWNvdW50IHBhcmFtIGluIHNwYWNlIGNvbXBhY3QgbW9kZVxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy80Njg3MlxuICAgICAgICBbYCY6bm90KCR7Y29tcG9uZW50Q2xzfS1jb21wYWN0LWxhc3QtaXRlbSkke2NvbXBvbmVudENsc30tY29tcGFjdC1pdGVtYF06IHtcbiAgICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1hZmZpeC13cmFwcGVyYF06IHtcbiAgICAgICAgICAgIGJvcmRlclN0YXJ0RW5kUmFkaXVzOiAwLFxuICAgICAgICAgICAgYm9yZGVyRW5kRW5kUmFkaXVzOiAwXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAvLyBGaXggdGhlIGlzc3VlIG9mIGlucHV0IHVzZSBgYWRkb25BZnRlcmAgcGFyYW0gaW4gc3BhY2UgY29tcGFjdCBtb2RlXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzUyNDgzXG4gICAgICAgIFtgJjpub3QoJHtjb21wb25lbnRDbHN9LWNvbXBhY3QtZmlyc3QtaXRlbSkke2NvbXBvbmVudENsc30tY29tcGFjdC1pdGVtYF06IHtcbiAgICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1hZmZpeC13cmFwcGVyYF06IHtcbiAgICAgICAgICAgIGJvcmRlclN0YXJ0U3RhcnRSYWRpdXM6IDAsXG4gICAgICAgICAgICBib3JkZXJFbmRTdGFydFJhZGl1czogMFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuICB9O1xufTtcbmNvbnN0IGdlblNlYXJjaElucHV0U3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHMsXG4gICAgYW50Q2xzXG4gIH0gPSB0b2tlbjtcbiAgY29uc3Qgc2VhcmNoUHJlZml4Q2xzID0gYCR7Y29tcG9uZW50Q2xzfS1zZWFyY2hgO1xuICByZXR1cm4ge1xuICAgIFtzZWFyY2hQcmVmaXhDbHNdOiB7XG4gICAgICBbY29tcG9uZW50Q2xzXToge1xuICAgICAgICAnJjpob3ZlciwgJjpmb2N1cyc6IHtcbiAgICAgICAgICBbYCsgJHtjb21wb25lbnRDbHN9LWdyb3VwLWFkZG9uICR7c2VhcmNoUHJlZml4Q2xzfS1idXR0b246bm90KCR7YW50Q2xzfS1idG4tcHJpbWFyeSlgXToge1xuICAgICAgICAgICAgYm9yZGVySW5saW5lU3RhcnRDb2xvcjogdG9rZW4uY29sb3JQcmltYXJ5SG92ZXJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1hZmZpeC13cmFwcGVyYF06IHtcbiAgICAgICAgaGVpZ2h0OiB0b2tlbi5jb250cm9sSGVpZ2h0LFxuICAgICAgICBib3JkZXJSYWRpdXM6IDBcbiAgICAgIH0sXG4gICAgICAvLyBmaXggc2xpZ2h0IGhlaWdodCBkaWZmIGluIEZpcmVmb3g6XG4gICAgICAvLyBodHRwczovL2FudC5kZXNpZ24vY29tcG9uZW50cy9hdXRvLWNvbXBsZXRlLWNuLyNhdXRvLWNvbXBsZXRlLWRlbW8tY2VydGFpbi1jYXRlZ29yeVxuICAgICAgW2Ake2NvbXBvbmVudENsc30tbGdgXToge1xuICAgICAgICBsaW5lSGVpZ2h0OiB0b2tlbi5jYWxjKHRva2VuLmxpbmVIZWlnaHRMRykuc3ViKDAuMDAwMikuZXF1YWwoKVxuICAgICAgfSxcbiAgICAgIFtgPiAke2NvbXBvbmVudENsc30tZ3JvdXBgXToge1xuICAgICAgICBbYD4gJHtjb21wb25lbnRDbHN9LWdyb3VwLWFkZG9uOmxhc3QtY2hpbGRgXToge1xuICAgICAgICAgIGluc2V0SW5saW5lU3RhcnQ6IC0xLFxuICAgICAgICAgIHBhZGRpbmc6IDAsXG4gICAgICAgICAgYm9yZGVyOiAwLFxuICAgICAgICAgIFtgJHtzZWFyY2hQcmVmaXhDbHN9LWJ1dHRvbmBdOiB7XG4gICAgICAgICAgICAvLyBGaXggaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvNDcxNTBcbiAgICAgICAgICAgIG1hcmdpbklubGluZUVuZDogLTEsXG4gICAgICAgICAgICBib3JkZXJTdGFydFN0YXJ0UmFkaXVzOiAwLFxuICAgICAgICAgICAgYm9yZGVyRW5kU3RhcnRSYWRpdXM6IDAsXG4gICAgICAgICAgICBib3hTaGFkb3c6ICdub25lJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgW2Ake3NlYXJjaFByZWZpeENsc30tYnV0dG9uOm5vdCgke2FudENsc30tYnRuLXByaW1hcnkpYF06IHtcbiAgICAgICAgICAgIGNvbG9yOiB0b2tlbi5jb2xvclRleHREZXNjcmlwdGlvbixcbiAgICAgICAgICAgICcmOmhvdmVyJzoge1xuICAgICAgICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JQcmltYXJ5SG92ZXJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnJjphY3RpdmUnOiB7XG4gICAgICAgICAgICAgIGNvbG9yOiB0b2tlbi5jb2xvclByaW1hcnlBY3RpdmVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbYCYke2FudENsc30tYnRuLWxvYWRpbmc6OmJlZm9yZWBdOiB7XG4gICAgICAgICAgICAgIGluc2V0SW5saW5lU3RhcnQ6IDAsXG4gICAgICAgICAgICAgIGluc2V0SW5saW5lRW5kOiAwLFxuICAgICAgICAgICAgICBpbnNldEJsb2NrU3RhcnQ6IDAsXG4gICAgICAgICAgICAgIGluc2V0QmxvY2tFbmQ6IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbYCR7c2VhcmNoUHJlZml4Q2xzfS1idXR0b25gXToge1xuICAgICAgICBoZWlnaHQ6IHRva2VuLmNvbnRyb2xIZWlnaHQsXG4gICAgICAgICcmOmhvdmVyLCAmOmZvY3VzJzoge1xuICAgICAgICAgIHpJbmRleDogMVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgJyYtbGFyZ2UnOiB7XG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LWFmZml4LXdyYXBwZXIsICR7c2VhcmNoUHJlZml4Q2xzfS1idXR0b25gXToge1xuICAgICAgICAgIGhlaWdodDogdG9rZW4uY29udHJvbEhlaWdodExHXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAnJi1zbWFsbCc6IHtcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30tYWZmaXgtd3JhcHBlciwgJHtzZWFyY2hQcmVmaXhDbHN9LWJ1dHRvbmBdOiB7XG4gICAgICAgICAgaGVpZ2h0OiB0b2tlbi5jb250cm9sSGVpZ2h0U01cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICcmLXJ0bCc6IHtcbiAgICAgICAgZGlyZWN0aW9uOiAncnRsJ1xuICAgICAgfSxcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PSBDb21wYWN0IEl0ZW0gQ3VzdG9taXplZCBTdHlsZXMgPT09PT09PT09PT09PT09PT09PT09XG4gICAgICBbYCYke2NvbXBvbmVudENsc30tY29tcGFjdC1pdGVtYF06IHtcbiAgICAgICAgW2AmOm5vdCgke2NvbXBvbmVudENsc30tY29tcGFjdC1sYXN0LWl0ZW0pYF06IHtcbiAgICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1ncm91cC1hZGRvbmBdOiB7XG4gICAgICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1zZWFyY2gtYnV0dG9uYF06IHtcbiAgICAgICAgICAgICAgbWFyZ2luSW5saW5lRW5kOiB0b2tlbi5jYWxjKHRva2VuLmxpbmVXaWR0aCkubXVsKC0xKS5lcXVhbCgpLFxuICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtgJjpub3QoJHtjb21wb25lbnRDbHN9LWNvbXBhY3QtZmlyc3QtaXRlbSlgXToge1xuICAgICAgICAgIFtgJHtjb21wb25lbnRDbHN9LCR7Y29tcG9uZW50Q2xzfS1hZmZpeC13cmFwcGVyYF06IHtcbiAgICAgICAgICAgIGJvcmRlclJhZGl1czogMFxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgW2A+ICR7Y29tcG9uZW50Q2xzfS1ncm91cC1hZGRvbiAke2NvbXBvbmVudENsc30tc2VhcmNoLWJ1dHRvbixcbiAgICAgICAgPiAke2NvbXBvbmVudENsc30sXG4gICAgICAgICR7Y29tcG9uZW50Q2xzfS1hZmZpeC13cmFwcGVyYF06IHtcbiAgICAgICAgICAnJjpob3ZlciwgJjpmb2N1cywgJjphY3RpdmUnOiB7XG4gICAgICAgICAgICB6SW5kZXg6IDJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtgPiAke2NvbXBvbmVudENsc30tYWZmaXgtd3JhcHBlci1mb2N1c2VkYF06IHtcbiAgICAgICAgICB6SW5kZXg6IDJcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmFuZ2UgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuY29uc3QgZ2VuUmFuZ2VTdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENsc1xuICB9ID0gdG9rZW47XG4gIHJldHVybiB7XG4gICAgW2Ake2NvbXBvbmVudENsc30tb3V0LW9mLXJhbmdlYF06IHtcbiAgICAgIFtgJiwgJiBpbnB1dCwgJiB0ZXh0YXJlYSwgJHtjb21wb25lbnRDbHN9LXNob3ctY291bnQtc3VmZml4LCAke2NvbXBvbmVudENsc30tZGF0YS1jb3VudGBdOiB7XG4gICAgICAgIGNvbG9yOiB0b2tlbi5jb2xvckVycm9yXG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFeHBvcnQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgY29uc3QgdXNlU2hhcmVkU3R5bGUgPSBnZW5TdHlsZUhvb2tzKFsnSW5wdXQnLCAnU2hhcmVkJ10sIHRva2VuID0+IHtcbiAgY29uc3QgaW5wdXRUb2tlbiA9IG1lcmdlVG9rZW4odG9rZW4sIGluaXRJbnB1dFRva2VuKHRva2VuKSk7XG4gIHJldHVybiBbZ2VuSW5wdXRTdHlsZShpbnB1dFRva2VuKSwgZ2VuQWZmaXhTdHlsZShpbnB1dFRva2VuKV07XG59LCBpbml0Q29tcG9uZW50VG9rZW4sIHtcbiAgcmVzZXRGb250OiBmYWxzZVxufSk7XG5leHBvcnQgZGVmYXVsdCBnZW5TdHlsZUhvb2tzKFsnSW5wdXQnLCAnQ29tcG9uZW50J10sIHRva2VuID0+IHtcbiAgY29uc3QgaW5wdXRUb2tlbiA9IG1lcmdlVG9rZW4odG9rZW4sIGluaXRJbnB1dFRva2VuKHRva2VuKSk7XG4gIHJldHVybiBbZ2VuR3JvdXBTdHlsZShpbnB1dFRva2VuKSwgZ2VuU2VhcmNoSW5wdXRTdHlsZShpbnB1dFRva2VuKSwgZ2VuUmFuZ2VTdHlsZShpbnB1dFRva2VuKSxcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gPT0gICAgICAgICAgICAgU3BhY2UgQ29tcGFjdCAgICAgICAgICAgICAgICAgICAgICAgPT1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgZ2VuQ29tcGFjdEl0ZW1TdHlsZShpbnB1dFRva2VuKV07XG59LCBpbml0Q29tcG9uZW50VG9rZW4sIHtcbiAgcmVzZXRGb250OiBmYWxzZVxufSk7IiwgImltcG9ydCB7IHVuaXQgfSBmcm9tICdAYW50LWRlc2lnbi9jc3NpbmpzJztcbmltcG9ydCB7IGdlbkZvY3VzT3V0bGluZSwgcmVzZXRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9zdHlsZSc7XG5pbXBvcnQgeyBnZW5TdHlsZUhvb2tzLCBtZXJnZVRva2VuIH0gZnJvbSAnLi4vLi4vdGhlbWUvaW50ZXJuYWwnO1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFN0eWxlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmV4cG9ydCBjb25zdCBnZW5DaGVja2JveFN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY2hlY2tib3hDbHNcbiAgfSA9IHRva2VuO1xuICBjb25zdCB3cmFwcGVyQ2xzID0gYCR7Y2hlY2tib3hDbHN9LXdyYXBwZXJgO1xuICByZXR1cm4gW1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gQmFzaWMgPT09PT09PT09PT09PT09PT09PT09XG4gIHtcbiAgICAvLyBHcm91cFxuICAgIFtgJHtjaGVja2JveENsc30tZ3JvdXBgXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXNldENvbXBvbmVudCh0b2tlbikpLCB7XG4gICAgICBkaXNwbGF5OiAnaW5saW5lLWZsZXgnLFxuICAgICAgZmxleFdyYXA6ICd3cmFwJyxcbiAgICAgIGNvbHVtbkdhcDogdG9rZW4ubWFyZ2luWFMsXG4gICAgICAvLyBHcm91cCA+IEdyaWRcbiAgICAgIFtgPiAke3Rva2VuLmFudENsc30tcm93YF06IHtcbiAgICAgICAgZmxleDogMVxuICAgICAgfVxuICAgIH0pLFxuICAgIC8vIFdyYXBwZXJcbiAgICBbd3JhcHBlckNsc106IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVzZXRDb21wb25lbnQodG9rZW4pKSwge1xuICAgICAgZGlzcGxheTogJ2lubGluZS1mbGV4JyxcbiAgICAgIGFsaWduSXRlbXM6ICdiYXNlbGluZScsXG4gICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgIC8vIEZpeCBjaGVja2JveCAmIHJhZGlvIGluIGZsZXggYWxpZ24gIzMwMjYwXG4gICAgICAnJjphZnRlcic6IHtcbiAgICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICAgIHdpZHRoOiAwLFxuICAgICAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgICAgIGNvbnRlbnQ6IFwiJ1xcXFxhMCdcIlxuICAgICAgfSxcbiAgICAgIC8vIENoZWNrYm94IG5lYXIgY2hlY2tib3hcbiAgICAgIFtgJiArICR7d3JhcHBlckNsc31gXToge1xuICAgICAgICBtYXJnaW5JbmxpbmVTdGFydDogMFxuICAgICAgfSxcbiAgICAgIFtgJiR7d3JhcHBlckNsc30taW4tZm9ybS1pdGVtYF06IHtcbiAgICAgICAgJ2lucHV0W3R5cGU9XCJjaGVja2JveFwiXSc6IHtcbiAgICAgICAgICB3aWR0aDogMTQsXG4gICAgICAgICAgLy8gRklYTUU6IG1hZ2ljXG4gICAgICAgICAgaGVpZ2h0OiAxNCAvLyBGSVhNRTogbWFnaWNcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pLFxuICAgIC8vIFdyYXBwZXIgPiBDaGVja2JveFxuICAgIFtjaGVja2JveENsc106IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVzZXRDb21wb25lbnQodG9rZW4pKSwge1xuICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICB3aGl0ZVNwYWNlOiAnbm93cmFwJyxcbiAgICAgIGxpbmVIZWlnaHQ6IDEsXG4gICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgIGJvcmRlclJhZGl1czogdG9rZW4uYm9yZGVyUmFkaXVzU00sXG4gICAgICAvLyBUbyBtYWtlIGFsaWdubWVudCByaWdodCB3aGVuIGBjb250cm9sSGVpZ2h0YCBpcyBjaGFuZ2VkXG4gICAgICAvLyBSZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzQxNTY0XG4gICAgICBhbGlnblNlbGY6ICdjZW50ZXInLFxuICAgICAgLy8gV3JhcHBlciA+IENoZWNrYm94ID4gaW5wdXRcbiAgICAgIFtgJHtjaGVja2JveENsc30taW5wdXRgXToge1xuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgLy8gU2luY2UgYmFzZWxpbmUgYWxpZ24gd2lsbCBnZXQgYWRkaXRpb25hbCBzcGFjZSBvZmZzZXQsXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gbW92ZSBpbnB1dCB0byB0b3AgdG8gbWFrZSBpdCBhbGlnbiB3aXRoIHRleHQuXG4gICAgICAgIC8vIFJlZjogaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMzg5MjYjaXNzdWVjb21tZW50LTE0ODYxMzc3OTlcbiAgICAgICAgaW5zZXQ6IDAsXG4gICAgICAgIHpJbmRleDogMSxcbiAgICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgICAgIG9wYWNpdHk6IDAsXG4gICAgICAgIG1hcmdpbjogMCxcbiAgICAgICAgW2AmOmZvY3VzLXZpc2libGUgKyAke2NoZWNrYm94Q2xzfS1pbm5lcmBdOiBPYmplY3QuYXNzaWduKHt9LCBnZW5Gb2N1c091dGxpbmUodG9rZW4pKVxuICAgICAgfSxcbiAgICAgIC8vIFdyYXBwZXIgPiBDaGVja2JveCA+IGlubmVyXG4gICAgICBbYCR7Y2hlY2tib3hDbHN9LWlubmVyYF06IHtcbiAgICAgICAgYm94U2l6aW5nOiAnYm9yZGVyLWJveCcsXG4gICAgICAgIGRpc3BsYXk6ICdibG9jaycsXG4gICAgICAgIHdpZHRoOiB0b2tlbi5jaGVja2JveFNpemUsXG4gICAgICAgIGhlaWdodDogdG9rZW4uY2hlY2tib3hTaXplLFxuICAgICAgICBkaXJlY3Rpb246ICdsdHInLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRva2VuLmNvbG9yQmdDb250YWluZXIsXG4gICAgICAgIGJvcmRlcjogYCR7dW5pdCh0b2tlbi5saW5lV2lkdGgpfSAke3Rva2VuLmxpbmVUeXBlfSAke3Rva2VuLmNvbG9yQm9yZGVyfWAsXG4gICAgICAgIGJvcmRlclJhZGl1czogdG9rZW4uYm9yZGVyUmFkaXVzU00sXG4gICAgICAgIGJvcmRlckNvbGxhcHNlOiAnc2VwYXJhdGUnLFxuICAgICAgICB0cmFuc2l0aW9uOiBgYWxsICR7dG9rZW4ubW90aW9uRHVyYXRpb25TbG93fWAsXG4gICAgICAgICcmOmFmdGVyJzoge1xuICAgICAgICAgIGJveFNpemluZzogJ2JvcmRlci1ib3gnLFxuICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgIHRvcDogJzUwJScsXG4gICAgICAgICAgaW5zZXRJbmxpbmVTdGFydDogJzI1JScsXG4gICAgICAgICAgZGlzcGxheTogJ3RhYmxlJyxcbiAgICAgICAgICB3aWR0aDogdG9rZW4uY2FsYyh0b2tlbi5jaGVja2JveFNpemUpLmRpdigxNCkubXVsKDUpLmVxdWFsKCksXG4gICAgICAgICAgaGVpZ2h0OiB0b2tlbi5jYWxjKHRva2VuLmNoZWNrYm94U2l6ZSkuZGl2KDE0KS5tdWwoOCkuZXF1YWwoKSxcbiAgICAgICAgICBib3JkZXI6IGAke3VuaXQodG9rZW4ubGluZVdpZHRoQm9sZCl9IHNvbGlkICR7dG9rZW4uY29sb3JXaGl0ZX1gLFxuICAgICAgICAgIGJvcmRlclRvcDogMCxcbiAgICAgICAgICBib3JkZXJJbmxpbmVTdGFydDogMCxcbiAgICAgICAgICB0cmFuc2Zvcm06ICdyb3RhdGUoNDVkZWcpIHNjYWxlKDApIHRyYW5zbGF0ZSgtNTAlLC01MCUpJyxcbiAgICAgICAgICBvcGFjaXR5OiAwLFxuICAgICAgICAgIGNvbnRlbnQ6ICdcIlwiJyxcbiAgICAgICAgICB0cmFuc2l0aW9uOiBgYWxsICR7dG9rZW4ubW90aW9uRHVyYXRpb25GYXN0fSAke3Rva2VuLm1vdGlvbkVhc2VJbkJhY2t9LCBvcGFjaXR5ICR7dG9rZW4ubW90aW9uRHVyYXRpb25GYXN0fWBcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIFdyYXBwZXIgPiBDaGVja2JveCArIFRleHRcbiAgICAgICcmICsgc3Bhbic6IHtcbiAgICAgICAgcGFkZGluZ0lubGluZVN0YXJ0OiB0b2tlbi5wYWRkaW5nWFMsXG4gICAgICAgIHBhZGRpbmdJbmxpbmVFbmQ6IHRva2VuLnBhZGRpbmdYU1xuICAgICAgfVxuICAgIH0pXG4gIH0sXG4gIC8vID09PT09PT09PT09PT09PT09PT09PSBIb3ZlciA9PT09PT09PT09PT09PT09PT09PT1cbiAge1xuICAgIC8vIFdyYXBwZXIgJiBXcmFwcGVyID4gQ2hlY2tib3hcbiAgICBbYFxuICAgICAgICAke3dyYXBwZXJDbHN9Om5vdCgke3dyYXBwZXJDbHN9LWRpc2FibGVkKSxcbiAgICAgICAgJHtjaGVja2JveENsc306bm90KCR7Y2hlY2tib3hDbHN9LWRpc2FibGVkKVxuICAgICAgYF06IHtcbiAgICAgIFtgJjpob3ZlciAke2NoZWNrYm94Q2xzfS1pbm5lcmBdOiB7XG4gICAgICAgIGJvcmRlckNvbG9yOiB0b2tlbi5jb2xvclByaW1hcnlcbiAgICAgIH1cbiAgICB9LFxuICAgIFtgJHt3cmFwcGVyQ2xzfTpub3QoJHt3cmFwcGVyQ2xzfS1kaXNhYmxlZClgXToge1xuICAgICAgW2AmOmhvdmVyICR7Y2hlY2tib3hDbHN9LWNoZWNrZWQ6bm90KCR7Y2hlY2tib3hDbHN9LWRpc2FibGVkKSAke2NoZWNrYm94Q2xzfS1pbm5lcmBdOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogdG9rZW4uY29sb3JQcmltYXJ5SG92ZXIsXG4gICAgICAgIGJvcmRlckNvbG9yOiAndHJhbnNwYXJlbnQnXG4gICAgICB9LFxuICAgICAgW2AmOmhvdmVyICR7Y2hlY2tib3hDbHN9LWNoZWNrZWQ6bm90KCR7Y2hlY2tib3hDbHN9LWRpc2FibGVkKTphZnRlcmBdOiB7XG4gICAgICAgIGJvcmRlckNvbG9yOiB0b2tlbi5jb2xvclByaW1hcnlIb3ZlclxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gQ2hlY2tlZCA9PT09PT09PT09PT09PT09PT09PVxuICB7XG4gICAgLy8gV3JhcHBlciA+IENoZWNrYm94XG4gICAgW2Ake2NoZWNrYm94Q2xzfS1jaGVja2VkYF06IHtcbiAgICAgIFtgJHtjaGVja2JveENsc30taW5uZXJgXToge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRva2VuLmNvbG9yUHJpbWFyeSxcbiAgICAgICAgYm9yZGVyQ29sb3I6IHRva2VuLmNvbG9yUHJpbWFyeSxcbiAgICAgICAgJyY6YWZ0ZXInOiB7XG4gICAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgICB0cmFuc2Zvcm06ICdyb3RhdGUoNDVkZWcpIHNjYWxlKDEpIHRyYW5zbGF0ZSgtNTAlLC01MCUpJyxcbiAgICAgICAgICB0cmFuc2l0aW9uOiBgYWxsICR7dG9rZW4ubW90aW9uRHVyYXRpb25NaWR9ICR7dG9rZW4ubW90aW9uRWFzZU91dEJhY2t9ICR7dG9rZW4ubW90aW9uRHVyYXRpb25GYXN0fWBcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW2BcbiAgICAgICAgJHt3cmFwcGVyQ2xzfS1jaGVja2VkOm5vdCgke3dyYXBwZXJDbHN9LWRpc2FibGVkKSxcbiAgICAgICAgJHtjaGVja2JveENsc30tY2hlY2tlZDpub3QoJHtjaGVja2JveENsc30tZGlzYWJsZWQpXG4gICAgICBgXToge1xuICAgICAgW2AmOmhvdmVyICR7Y2hlY2tib3hDbHN9LWlubmVyYF06IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0b2tlbi5jb2xvclByaW1hcnlIb3ZlcixcbiAgICAgICAgYm9yZGVyQ29sb3I6ICd0cmFuc3BhcmVudCdcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIC8vID09PT09PT09PT09PT09PT09IEluZGV0ZXJtaW5hdGUgPT09PT09PT09PT09PT09PT1cbiAge1xuICAgIFtjaGVja2JveENsc106IHtcbiAgICAgICcmLWluZGV0ZXJtaW5hdGUnOiB7XG4gICAgICAgIC8vIFdyYXBwZXIgPiBDaGVja2JveCA+IGlubmVyXG4gICAgICAgIFtgJHtjaGVja2JveENsc30taW5uZXJgXToge1xuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogYCR7dG9rZW4uY29sb3JCZ0NvbnRhaW5lcn0gIWltcG9ydGFudGAsXG4gICAgICAgICAgYm9yZGVyQ29sb3I6IGAke3Rva2VuLmNvbG9yQm9yZGVyfSAhaW1wb3J0YW50YCxcbiAgICAgICAgICAnJjphZnRlcic6IHtcbiAgICAgICAgICAgIHRvcDogJzUwJScsXG4gICAgICAgICAgICBpbnNldElubGluZVN0YXJ0OiAnNTAlJyxcbiAgICAgICAgICAgIHdpZHRoOiB0b2tlbi5jYWxjKHRva2VuLmZvbnRTaXplTEcpLmRpdigyKS5lcXVhbCgpLFxuICAgICAgICAgICAgaGVpZ2h0OiB0b2tlbi5jYWxjKHRva2VuLmZvbnRTaXplTEcpLmRpdigyKS5lcXVhbCgpLFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0b2tlbi5jb2xvclByaW1hcnksXG4gICAgICAgICAgICBib3JkZXI6IDAsXG4gICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUoLTUwJSwgLTUwJSkgc2NhbGUoMSknLFxuICAgICAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgICAgIGNvbnRlbnQ6ICdcIlwiJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvNTAwNzRcbiAgICAgICAgW2AmOmhvdmVyICR7Y2hlY2tib3hDbHN9LWlubmVyYF06IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGAke3Rva2VuLmNvbG9yQmdDb250YWluZXJ9ICFpbXBvcnRhbnRgLFxuICAgICAgICAgIGJvcmRlckNvbG9yOiBgJHt0b2tlbi5jb2xvclByaW1hcnl9ICFpbXBvcnRhbnRgXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIC8vID09PT09PT09PT09PT09PT09PT09IERpc2FibGUgPT09PT09PT09PT09PT09PT09PT1cbiAge1xuICAgIC8vIFdyYXBwZXJcbiAgICBbYCR7d3JhcHBlckNsc30tZGlzYWJsZWRgXToge1xuICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQnXG4gICAgfSxcbiAgICAvLyBXcmFwcGVyID4gQ2hlY2tib3hcbiAgICBbYCR7Y2hlY2tib3hDbHN9LWRpc2FibGVkYF06IHtcbiAgICAgIC8vIFdyYXBwZXIgPiBDaGVja2JveCA+IGlucHV0XG4gICAgICBbYCYsICR7Y2hlY2tib3hDbHN9LWlucHV0YF06IHtcbiAgICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQnLFxuICAgICAgICAvLyBEaXNhYmxlZCBmb3IgbmF0aXZlIGlucHV0IHRvIGVuYWJsZSBUb29sdGlwIGV2ZW50IGhhbmRsZXJcbiAgICAgICAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8zOTgyMiNpc3N1ZWNvbW1lbnQtMTM2NTA3NTkwMVxuICAgICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZSdcbiAgICAgIH0sXG4gICAgICAvLyBXcmFwcGVyID4gQ2hlY2tib3ggPiBpbm5lclxuICAgICAgW2Ake2NoZWNrYm94Q2xzfS1pbm5lcmBdOiB7XG4gICAgICAgIGJhY2tncm91bmQ6IHRva2VuLmNvbG9yQmdDb250YWluZXJEaXNhYmxlZCxcbiAgICAgICAgYm9yZGVyQ29sb3I6IHRva2VuLmNvbG9yQm9yZGVyLFxuICAgICAgICAnJjphZnRlcic6IHtcbiAgICAgICAgICBib3JkZXJDb2xvcjogdG9rZW4uY29sb3JUZXh0RGlzYWJsZWRcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICcmOmFmdGVyJzoge1xuICAgICAgICBkaXNwbGF5OiAnbm9uZSdcbiAgICAgIH0sXG4gICAgICAnJiArIHNwYW4nOiB7XG4gICAgICAgIGNvbG9yOiB0b2tlbi5jb2xvclRleHREaXNhYmxlZFxuICAgICAgfSxcbiAgICAgIFtgJiR7Y2hlY2tib3hDbHN9LWluZGV0ZXJtaW5hdGUgJHtjaGVja2JveENsc30taW5uZXI6OmFmdGVyYF06IHtcbiAgICAgICAgYmFja2dyb3VuZDogdG9rZW4uY29sb3JUZXh0RGlzYWJsZWRcbiAgICAgIH1cbiAgICB9XG4gIH1dO1xufTtcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFeHBvcnQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgZnVuY3Rpb24gZ2V0U3R5bGUocHJlZml4Q2xzLCB0b2tlbikge1xuICBjb25zdCBjaGVja2JveFRva2VuID0gbWVyZ2VUb2tlbih0b2tlbiwge1xuICAgIGNoZWNrYm94Q2xzOiBgLiR7cHJlZml4Q2xzfWAsXG4gICAgY2hlY2tib3hTaXplOiB0b2tlbi5jb250cm9sSW50ZXJhY3RpdmVTaXplXG4gIH0pO1xuICByZXR1cm4gW2dlbkNoZWNrYm94U3R5bGUoY2hlY2tib3hUb2tlbildO1xufVxuZXhwb3J0IGRlZmF1bHQgZ2VuU3R5bGVIb29rcygnQ2hlY2tib3gnLCAodG9rZW4sIF9yZWYpID0+IHtcbiAgbGV0IHtcbiAgICBwcmVmaXhDbHNcbiAgfSA9IF9yZWY7XG4gIHJldHVybiBbZ2V0U3R5bGUocHJlZml4Q2xzLCB0b2tlbildO1xufSk7IiwgIlwidXNlIGNsaWVudFwiO1xuXG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUmNDaGVja2JveCBmcm9tICdyYy1jaGVja2JveCc7XG5pbXBvcnQgeyBjb21wb3NlUmVmIH0gZnJvbSBcInJjLXV0aWwvZXMvcmVmXCI7XG5pbXBvcnQgeyBkZXZVc2VXYXJuaW5nIH0gZnJvbSAnLi4vX3V0aWwvd2FybmluZyc7XG5pbXBvcnQgV2F2ZSBmcm9tICcuLi9fdXRpbC93YXZlJztcbmltcG9ydCB7IFRBUkdFVF9DTFMgfSBmcm9tICcuLi9fdXRpbC93YXZlL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCBEaXNhYmxlZENvbnRleHQgZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL0Rpc2FibGVkQ29udGV4dCc7XG5pbXBvcnQgdXNlQ1NTVmFyQ2xzIGZyb20gJy4uL2NvbmZpZy1wcm92aWRlci9ob29rcy91c2VDU1NWYXJDbHMnO1xuaW1wb3J0IHsgRm9ybUl0ZW1JbnB1dENvbnRleHQgfSBmcm9tICcuLi9mb3JtL2NvbnRleHQnO1xuaW1wb3J0IEdyb3VwQ29udGV4dCBmcm9tICcuL0dyb3VwQ29udGV4dCc7XG5pbXBvcnQgdXNlU3R5bGUgZnJvbSAnLi9zdHlsZSc7XG5pbXBvcnQgdXNlQnViYmxlTG9jayBmcm9tICcuL3VzZUJ1YmJsZUxvY2snO1xuY29uc3QgSW50ZXJuYWxDaGVja2JveCA9IChwcm9wcywgcmVmKSA9PiB7XG4gIHZhciBfYTtcbiAgY29uc3Qge1xuICAgICAgcHJlZml4Q2xzOiBjdXN0b21pemVQcmVmaXhDbHMsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICByb290Q2xhc3NOYW1lLFxuICAgICAgY2hpbGRyZW4sXG4gICAgICBpbmRldGVybWluYXRlID0gZmFsc2UsXG4gICAgICBzdHlsZSxcbiAgICAgIG9uTW91c2VFbnRlcixcbiAgICAgIG9uTW91c2VMZWF2ZSxcbiAgICAgIHNraXBHcm91cCA9IGZhbHNlLFxuICAgICAgZGlzYWJsZWRcbiAgICB9ID0gcHJvcHMsXG4gICAgcmVzdFByb3BzID0gX19yZXN0KHByb3BzLCBbXCJwcmVmaXhDbHNcIiwgXCJjbGFzc05hbWVcIiwgXCJyb290Q2xhc3NOYW1lXCIsIFwiY2hpbGRyZW5cIiwgXCJpbmRldGVybWluYXRlXCIsIFwic3R5bGVcIiwgXCJvbk1vdXNlRW50ZXJcIiwgXCJvbk1vdXNlTGVhdmVcIiwgXCJza2lwR3JvdXBcIiwgXCJkaXNhYmxlZFwiXSk7XG4gIGNvbnN0IHtcbiAgICBnZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uLFxuICAgIGNoZWNrYm94XG4gIH0gPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpO1xuICBjb25zdCBjaGVja2JveEdyb3VwID0gUmVhY3QudXNlQ29udGV4dChHcm91cENvbnRleHQpO1xuICBjb25zdCB7XG4gICAgaXNGb3JtSXRlbUlucHV0XG4gIH0gPSBSZWFjdC51c2VDb250ZXh0KEZvcm1JdGVtSW5wdXRDb250ZXh0KTtcbiAgY29uc3QgY29udGV4dERpc2FibGVkID0gUmVhY3QudXNlQ29udGV4dChEaXNhYmxlZENvbnRleHQpO1xuICBjb25zdCBtZXJnZWREaXNhYmxlZCA9IChfYSA9IChjaGVja2JveEdyb3VwID09PSBudWxsIHx8IGNoZWNrYm94R3JvdXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNoZWNrYm94R3JvdXAuZGlzYWJsZWQpIHx8IGRpc2FibGVkKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBjb250ZXh0RGlzYWJsZWQ7XG4gIGNvbnN0IHByZXZWYWx1ZSA9IFJlYWN0LnVzZVJlZihyZXN0UHJvcHMudmFsdWUpO1xuICBjb25zdCBjaGVja2JveFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3QgbWVyZ2VkUmVmID0gY29tcG9zZVJlZihyZWYsIGNoZWNrYm94UmVmKTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBjb25zdCB3YXJuaW5nID0gZGV2VXNlV2FybmluZygnQ2hlY2tib3gnKTtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCdjaGVja2VkJyBpbiByZXN0UHJvcHMgfHwgISFjaGVja2JveEdyb3VwIHx8ICEoJ3ZhbHVlJyBpbiByZXN0UHJvcHMpLCAndXNhZ2UnLCAnYHZhbHVlYCBpcyBub3QgYSB2YWxpZCBwcm9wLCBkbyB5b3UgbWVhbiBgY2hlY2tlZGA/JykgOiB2b2lkIDA7XG4gIH1cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBjaGVja2JveEdyb3VwID09PSBudWxsIHx8IGNoZWNrYm94R3JvdXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNoZWNrYm94R3JvdXAucmVnaXN0ZXJWYWx1ZShyZXN0UHJvcHMudmFsdWUpO1xuICB9LCBbXSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHNraXBHcm91cCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocmVzdFByb3BzLnZhbHVlICE9PSBwcmV2VmFsdWUuY3VycmVudCkge1xuICAgICAgY2hlY2tib3hHcm91cCA9PT0gbnVsbCB8fCBjaGVja2JveEdyb3VwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjaGVja2JveEdyb3VwLmNhbmNlbFZhbHVlKHByZXZWYWx1ZS5jdXJyZW50KTtcbiAgICAgIGNoZWNrYm94R3JvdXAgPT09IG51bGwgfHwgY2hlY2tib3hHcm91cCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2hlY2tib3hHcm91cC5yZWdpc3RlclZhbHVlKHJlc3RQcm9wcy52YWx1ZSk7XG4gICAgICBwcmV2VmFsdWUuY3VycmVudCA9IHJlc3RQcm9wcy52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuICgpID0+IGNoZWNrYm94R3JvdXAgPT09IG51bGwgfHwgY2hlY2tib3hHcm91cCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2hlY2tib3hHcm91cC5jYW5jZWxWYWx1ZShyZXN0UHJvcHMudmFsdWUpO1xuICB9LCBbcmVzdFByb3BzLnZhbHVlXSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgdmFyIF9hO1xuICAgIGlmICgoX2EgPSBjaGVja2JveFJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaW5wdXQpIHtcbiAgICAgIGNoZWNrYm94UmVmLmN1cnJlbnQuaW5wdXQuaW5kZXRlcm1pbmF0ZSA9IGluZGV0ZXJtaW5hdGU7XG4gICAgfVxuICB9LCBbaW5kZXRlcm1pbmF0ZV0pO1xuICBjb25zdCBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2NoZWNrYm94JywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgY29uc3Qgcm9vdENscyA9IHVzZUNTU1ZhckNscyhwcmVmaXhDbHMpO1xuICBjb25zdCBbd3JhcENTU1ZhciwgaGFzaElkLCBjc3NWYXJDbHNdID0gdXNlU3R5bGUocHJlZml4Q2xzLCByb290Q2xzKTtcbiAgY29uc3QgY2hlY2tib3hQcm9wcyA9IE9iamVjdC5hc3NpZ24oe30sIHJlc3RQcm9wcyk7XG4gIGlmIChjaGVja2JveEdyb3VwICYmICFza2lwR3JvdXApIHtcbiAgICBjaGVja2JveFByb3BzLm9uQ2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHJlc3RQcm9wcy5vbkNoYW5nZSkge1xuICAgICAgICByZXN0UHJvcHMub25DaGFuZ2UuYXBwbHkocmVzdFByb3BzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgICAgaWYgKGNoZWNrYm94R3JvdXAudG9nZ2xlT3B0aW9uKSB7XG4gICAgICAgIGNoZWNrYm94R3JvdXAudG9nZ2xlT3B0aW9uKHtcbiAgICAgICAgICBsYWJlbDogY2hpbGRyZW4sXG4gICAgICAgICAgdmFsdWU6IHJlc3RQcm9wcy52YWx1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGNoZWNrYm94UHJvcHMubmFtZSA9IGNoZWNrYm94R3JvdXAubmFtZTtcbiAgICBjaGVja2JveFByb3BzLmNoZWNrZWQgPSBjaGVja2JveEdyb3VwLnZhbHVlLmluY2x1ZGVzKHJlc3RQcm9wcy52YWx1ZSk7XG4gIH1cbiAgY29uc3QgY2xhc3NTdHJpbmcgPSBjbGFzc05hbWVzKGAke3ByZWZpeENsc30td3JhcHBlcmAsIHtcbiAgICBbYCR7cHJlZml4Q2xzfS1ydGxgXTogZGlyZWN0aW9uID09PSAncnRsJyxcbiAgICBbYCR7cHJlZml4Q2xzfS13cmFwcGVyLWNoZWNrZWRgXTogY2hlY2tib3hQcm9wcy5jaGVja2VkLFxuICAgIFtgJHtwcmVmaXhDbHN9LXdyYXBwZXItZGlzYWJsZWRgXTogbWVyZ2VkRGlzYWJsZWQsXG4gICAgW2Ake3ByZWZpeENsc30td3JhcHBlci1pbi1mb3JtLWl0ZW1gXTogaXNGb3JtSXRlbUlucHV0XG4gIH0sIGNoZWNrYm94ID09PSBudWxsIHx8IGNoZWNrYm94ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjaGVja2JveC5jbGFzc05hbWUsIGNsYXNzTmFtZSwgcm9vdENsYXNzTmFtZSwgY3NzVmFyQ2xzLCByb290Q2xzLCBoYXNoSWQpO1xuICBjb25zdCBjaGVja2JveENsYXNzID0gY2xhc3NOYW1lcyh7XG4gICAgW2Ake3ByZWZpeENsc30taW5kZXRlcm1pbmF0ZWBdOiBpbmRldGVybWluYXRlXG4gIH0sIFRBUkdFVF9DTFMsIGhhc2hJZCk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRXZlbnQgTG9jayA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IFtvbkxhYmVsQ2xpY2ssIG9uSW5wdXRDbGlja10gPSB1c2VCdWJibGVMb2NrKGNoZWNrYm94UHJvcHMub25DbGljayk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHJldHVybiB3cmFwQ1NTVmFyKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFdhdmUsIHtcbiAgICBjb21wb25lbnQ6IFwiQ2hlY2tib3hcIixcbiAgICBkaXNhYmxlZDogbWVyZ2VkRGlzYWJsZWRcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc1N0cmluZyxcbiAgICBzdHlsZTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjaGVja2JveCA9PT0gbnVsbCB8fCBjaGVja2JveCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2hlY2tib3guc3R5bGUpLCBzdHlsZSksXG4gICAgb25Nb3VzZUVudGVyOiBvbk1vdXNlRW50ZXIsXG4gICAgb25Nb3VzZUxlYXZlOiBvbk1vdXNlTGVhdmUsXG4gICAgb25DbGljazogb25MYWJlbENsaWNrXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJjQ2hlY2tib3gsIE9iamVjdC5hc3NpZ24oe30sIGNoZWNrYm94UHJvcHMsIHtcbiAgICBvbkNsaWNrOiBvbklucHV0Q2xpY2ssXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgY2xhc3NOYW1lOiBjaGVja2JveENsYXNzLFxuICAgIGRpc2FibGVkOiBtZXJnZWREaXNhYmxlZCxcbiAgICByZWY6IG1lcmdlZFJlZlxuICB9KSksIGNoaWxkcmVuICE9PSB1bmRlZmluZWQgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IGAke3ByZWZpeENsc30tbGFiZWxgXG4gIH0sIGNoaWxkcmVuKSkpKTtcbn07XG5jb25zdCBDaGVja2JveCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKEludGVybmFsQ2hlY2tib3gpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgQ2hlY2tib3guZGlzcGxheU5hbWUgPSAnQ2hlY2tib3gnO1xufVxuZXhwb3J0IGRlZmF1bHQgQ2hlY2tib3g7IiwgImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5jb25zdCBHcm91cENvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmV4cG9ydCBkZWZhdWx0IEdyb3VwQ29udGV4dDsiLCAiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgb21pdCBmcm9tIFwicmMtdXRpbC9lcy9vbWl0XCI7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCB1c2VDU1NWYXJDbHMgZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL2hvb2tzL3VzZUNTU1ZhckNscyc7XG5pbXBvcnQgQ2hlY2tib3ggZnJvbSAnLi9DaGVja2JveCc7XG5pbXBvcnQgR3JvdXBDb250ZXh0IGZyb20gJy4vR3JvdXBDb250ZXh0JztcbmltcG9ydCB1c2VTdHlsZSBmcm9tICcuL3N0eWxlJztcbmNvbnN0IENoZWNrYm94R3JvdXAgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIHJlZikgPT4ge1xuICBjb25zdCB7XG4gICAgICBkZWZhdWx0VmFsdWUsXG4gICAgICBjaGlsZHJlbixcbiAgICAgIG9wdGlvbnMgPSBbXSxcbiAgICAgIHByZWZpeENsczogY3VzdG9taXplUHJlZml4Q2xzLFxuICAgICAgY2xhc3NOYW1lLFxuICAgICAgcm9vdENsYXNzTmFtZSxcbiAgICAgIHN0eWxlLFxuICAgICAgb25DaGFuZ2VcbiAgICB9ID0gcHJvcHMsXG4gICAgcmVzdFByb3BzID0gX19yZXN0KHByb3BzLCBbXCJkZWZhdWx0VmFsdWVcIiwgXCJjaGlsZHJlblwiLCBcIm9wdGlvbnNcIiwgXCJwcmVmaXhDbHNcIiwgXCJjbGFzc05hbWVcIiwgXCJyb290Q2xhc3NOYW1lXCIsIFwic3R5bGVcIiwgXCJvbkNoYW5nZVwiXSk7XG4gIGNvbnN0IHtcbiAgICBnZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uXG4gIH0gPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpO1xuICBjb25zdCBbdmFsdWUsIHNldFZhbHVlXSA9IFJlYWN0LnVzZVN0YXRlKHJlc3RQcm9wcy52YWx1ZSB8fCBkZWZhdWx0VmFsdWUgfHwgW10pO1xuICBjb25zdCBbcmVnaXN0ZXJlZFZhbHVlcywgc2V0UmVnaXN0ZXJlZFZhbHVlc10gPSBSZWFjdC51c2VTdGF0ZShbXSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCd2YWx1ZScgaW4gcmVzdFByb3BzKSB7XG4gICAgICBzZXRWYWx1ZShyZXN0UHJvcHMudmFsdWUgfHwgW10pO1xuICAgIH1cbiAgfSwgW3Jlc3RQcm9wcy52YWx1ZV0pO1xuICBjb25zdCBtZW1vaXplZE9wdGlvbnMgPSBSZWFjdC51c2VNZW1vKCgpID0+IG9wdGlvbnMubWFwKG9wdGlvbiA9PiB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBvcHRpb24gPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsYWJlbDogb3B0aW9uLFxuICAgICAgICB2YWx1ZTogb3B0aW9uXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gb3B0aW9uO1xuICB9KSwgW29wdGlvbnNdKTtcbiAgY29uc3QgY2FuY2VsVmFsdWUgPSB2YWwgPT4ge1xuICAgIHNldFJlZ2lzdGVyZWRWYWx1ZXMocHJldlZhbHVlcyA9PiBwcmV2VmFsdWVzLmZpbHRlcih2ID0+IHYgIT09IHZhbCkpO1xuICB9O1xuICBjb25zdCByZWdpc3RlclZhbHVlID0gdmFsID0+IHtcbiAgICBzZXRSZWdpc3RlcmVkVmFsdWVzKHByZXZWYWx1ZXMgPT4gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShwcmV2VmFsdWVzKSwgW3ZhbF0pKTtcbiAgfTtcbiAgY29uc3QgdG9nZ2xlT3B0aW9uID0gb3B0aW9uID0+IHtcbiAgICBjb25zdCBvcHRpb25JbmRleCA9IHZhbHVlLmluZGV4T2Yob3B0aW9uLnZhbHVlKTtcbiAgICBjb25zdCBuZXdWYWx1ZSA9IF90b0NvbnN1bWFibGVBcnJheSh2YWx1ZSk7XG4gICAgaWYgKG9wdGlvbkluZGV4ID09PSAtMSkge1xuICAgICAgbmV3VmFsdWUucHVzaChvcHRpb24udmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdWYWx1ZS5zcGxpY2Uob3B0aW9uSW5kZXgsIDEpO1xuICAgIH1cbiAgICBpZiAoISgndmFsdWUnIGluIHJlc3RQcm9wcykpIHtcbiAgICAgIHNldFZhbHVlKG5ld1ZhbHVlKTtcbiAgICB9XG4gICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5ld1ZhbHVlLmZpbHRlcih2YWwgPT4gcmVnaXN0ZXJlZFZhbHVlcy5pbmNsdWRlcyh2YWwpKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBpbmRleEEgPSBtZW1vaXplZE9wdGlvbnMuZmluZEluZGV4KG9wdCA9PiBvcHQudmFsdWUgPT09IGEpO1xuICAgICAgY29uc3QgaW5kZXhCID0gbWVtb2l6ZWRPcHRpb25zLmZpbmRJbmRleChvcHQgPT4gb3B0LnZhbHVlID09PSBiKTtcbiAgICAgIHJldHVybiBpbmRleEEgLSBpbmRleEI7XG4gICAgfSkpO1xuICB9O1xuICBjb25zdCBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2NoZWNrYm94JywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgY29uc3QgZ3JvdXBQcmVmaXhDbHMgPSBgJHtwcmVmaXhDbHN9LWdyb3VwYDtcbiAgY29uc3Qgcm9vdENscyA9IHVzZUNTU1ZhckNscyhwcmVmaXhDbHMpO1xuICBjb25zdCBbd3JhcENTU1ZhciwgaGFzaElkLCBjc3NWYXJDbHNdID0gdXNlU3R5bGUocHJlZml4Q2xzLCByb290Q2xzKTtcbiAgY29uc3QgZG9tUHJvcHMgPSBvbWl0KHJlc3RQcm9wcywgWyd2YWx1ZScsICdkaXNhYmxlZCddKTtcbiAgY29uc3QgY2hpbGRyZW5Ob2RlID0gb3B0aW9ucy5sZW5ndGggPyBtZW1vaXplZE9wdGlvbnMubWFwKG9wdGlvbiA9PiAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hlY2tib3gsIHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBrZXk6IG9wdGlvbi52YWx1ZS50b1N0cmluZygpLFxuICAgIGRpc2FibGVkOiAnZGlzYWJsZWQnIGluIG9wdGlvbiA/IG9wdGlvbi5kaXNhYmxlZCA6IHJlc3RQcm9wcy5kaXNhYmxlZCxcbiAgICB2YWx1ZTogb3B0aW9uLnZhbHVlLFxuICAgIGNoZWNrZWQ6IHZhbHVlLmluY2x1ZGVzKG9wdGlvbi52YWx1ZSksXG4gICAgb25DaGFuZ2U6IG9wdGlvbi5vbkNoYW5nZSxcbiAgICBjbGFzc05hbWU6IGAke2dyb3VwUHJlZml4Q2xzfS1pdGVtYCxcbiAgICBzdHlsZTogb3B0aW9uLnN0eWxlLFxuICAgIHRpdGxlOiBvcHRpb24udGl0bGUsXG4gICAgaWQ6IG9wdGlvbi5pZCxcbiAgICByZXF1aXJlZDogb3B0aW9uLnJlcXVpcmVkXG4gIH0sIG9wdGlvbi5sYWJlbCkpKSA6IGNoaWxkcmVuO1xuICBjb25zdCBjb250ZXh0ID0ge1xuICAgIHRvZ2dsZU9wdGlvbixcbiAgICB2YWx1ZSxcbiAgICBkaXNhYmxlZDogcmVzdFByb3BzLmRpc2FibGVkLFxuICAgIG5hbWU6IHJlc3RQcm9wcy5uYW1lLFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzE2Mzc2XG4gICAgcmVnaXN0ZXJWYWx1ZSxcbiAgICBjYW5jZWxWYWx1ZVxuICB9O1xuICBjb25zdCBjbGFzc1N0cmluZyA9IGNsYXNzTmFtZXMoZ3JvdXBQcmVmaXhDbHMsIHtcbiAgICBbYCR7Z3JvdXBQcmVmaXhDbHN9LXJ0bGBdOiBkaXJlY3Rpb24gPT09ICdydGwnXG4gIH0sIGNsYXNzTmFtZSwgcm9vdENsYXNzTmFtZSwgY3NzVmFyQ2xzLCByb290Q2xzLCBoYXNoSWQpO1xuICByZXR1cm4gd3JhcENTU1ZhcigvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBPYmplY3QuYXNzaWduKHtcbiAgICBjbGFzc05hbWU6IGNsYXNzU3RyaW5nLFxuICAgIHN0eWxlOiBzdHlsZVxuICB9LCBkb21Qcm9wcywge1xuICAgIHJlZjogcmVmXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChHcm91cENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogY29udGV4dFxuICB9LCBjaGlsZHJlbk5vZGUpKSk7XG59KTtcbmV4cG9ydCB7IEdyb3VwQ29udGV4dCB9O1xuZXhwb3J0IGRlZmF1bHQgQ2hlY2tib3hHcm91cDsiLCAiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCBJbnRlcm5hbENoZWNrYm94IGZyb20gJy4vQ2hlY2tib3gnO1xuaW1wb3J0IEdyb3VwIGZyb20gJy4vR3JvdXAnO1xuY29uc3QgQ2hlY2tib3ggPSBJbnRlcm5hbENoZWNrYm94O1xuQ2hlY2tib3guR3JvdXAgPSBHcm91cDtcbkNoZWNrYm94Ll9fQU5UX0NIRUNLQk9YID0gdHJ1ZTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIENoZWNrYm94LmRpc3BsYXlOYW1lID0gJ0NoZWNrYm94Jztcbn1cbmV4cG9ydCBkZWZhdWx0IENoZWNrYm94OyIsICJcInVzZSBjbGllbnRcIjtcblxudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBEb3duT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0Rvd25PdXRsaW5lZFwiO1xuaW1wb3J0IFVwT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL1VwT3V0bGluZWRcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFJjSW5wdXROdW1iZXIgZnJvbSAncmMtaW5wdXQtbnVtYmVyJztcbmltcG9ydCBDb250ZXh0SXNvbGF0b3IgZnJvbSAnLi4vX3V0aWwvQ29udGV4dElzb2xhdG9yJztcbmltcG9ydCB7IGdldE1lcmdlZFN0YXR1cywgZ2V0U3RhdHVzQ2xhc3NOYW1lcyB9IGZyb20gJy4uL191dGlsL3N0YXR1c1V0aWxzJztcbmltcG9ydCB7IGRldlVzZVdhcm5pbmcgfSBmcm9tICcuLi9fdXRpbC93YXJuaW5nJztcbmltcG9ydCBDb25maWdQcm92aWRlciwgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCBEaXNhYmxlZENvbnRleHQgZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL0Rpc2FibGVkQ29udGV4dCc7XG5pbXBvcnQgdXNlQ1NTVmFyQ2xzIGZyb20gJy4uL2NvbmZpZy1wcm92aWRlci9ob29rcy91c2VDU1NWYXJDbHMnO1xuaW1wb3J0IHVzZVNpemUgZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL2hvb2tzL3VzZVNpemUnO1xuaW1wb3J0IHsgRm9ybUl0ZW1JbnB1dENvbnRleHQgfSBmcm9tICcuLi9mb3JtL2NvbnRleHQnO1xuaW1wb3J0IHVzZVZhcmlhbnQgZnJvbSAnLi4vZm9ybS9ob29rcy91c2VWYXJpYW50cyc7XG5pbXBvcnQgeyB1c2VDb21wYWN0SXRlbUNvbnRleHQgfSBmcm9tICcuLi9zcGFjZS9Db21wYWN0JztcbmltcG9ydCB1c2VTdHlsZSBmcm9tICcuL3N0eWxlJztcbmNvbnN0IElucHV0TnVtYmVyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHByb3BzLCByZWYpID0+IHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBjb25zdCB0eXBlV2FybmluZyA9IGRldlVzZVdhcm5pbmcoJ0lucHV0TnVtYmVyJyk7XG4gICAgdHlwZVdhcm5pbmcuZGVwcmVjYXRlZCghKCdib3JkZXJlZCcgaW4gcHJvcHMpLCAnYm9yZGVyZWQnLCAndmFyaWFudCcpO1xuICAgIHR5cGVXYXJuaW5nKCEocHJvcHMudHlwZSA9PT0gJ251bWJlcicgJiYgcHJvcHMuY2hhbmdlT25XaGVlbCksICd1c2FnZScsICdXaGVuIGB0eXBlPW51bWJlcmAgaXMgdXNlZCB0b2dldGhlciB3aXRoIGBjaGFuZ2VPbldoZWVsYCwgY2hhbmdlT25XaGVlbCBtYXkgbm90IHdvcmsgcHJvcGVybHkuIFBsZWFzZSBkZWxldGUgYHR5cGU9bnVtYmVyYCBpZiBpdCBpcyBub3QgbmVjZXNzYXJ5LicpO1xuICB9XG4gIGNvbnN0IHtcbiAgICBnZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uXG4gIH0gPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpO1xuICBjb25zdCBpbnB1dFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgUmVhY3QudXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsICgpID0+IGlucHV0UmVmLmN1cnJlbnQpO1xuICBjb25zdCB7XG4gICAgICBjbGFzc05hbWUsXG4gICAgICByb290Q2xhc3NOYW1lLFxuICAgICAgc2l6ZTogY3VzdG9taXplU2l6ZSxcbiAgICAgIGRpc2FibGVkOiBjdXN0b21EaXNhYmxlZCxcbiAgICAgIHByZWZpeENsczogY3VzdG9taXplUHJlZml4Q2xzLFxuICAgICAgYWRkb25CZWZvcmUsXG4gICAgICBhZGRvbkFmdGVyLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgYm9yZGVyZWQsXG4gICAgICByZWFkT25seSxcbiAgICAgIHN0YXR1czogY3VzdG9tU3RhdHVzLFxuICAgICAgY29udHJvbHMsXG4gICAgICB2YXJpYW50OiBjdXN0b21WYXJpYW50XG4gICAgfSA9IHByb3BzLFxuICAgIG90aGVycyA9IF9fcmVzdChwcm9wcywgW1wiY2xhc3NOYW1lXCIsIFwicm9vdENsYXNzTmFtZVwiLCBcInNpemVcIiwgXCJkaXNhYmxlZFwiLCBcInByZWZpeENsc1wiLCBcImFkZG9uQmVmb3JlXCIsIFwiYWRkb25BZnRlclwiLCBcInByZWZpeFwiLCBcInN1ZmZpeFwiLCBcImJvcmRlcmVkXCIsIFwicmVhZE9ubHlcIiwgXCJzdGF0dXNcIiwgXCJjb250cm9sc1wiLCBcInZhcmlhbnRcIl0pO1xuICBjb25zdCBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2lucHV0LW51bWJlcicsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIC8vIFN0eWxlXG4gIGNvbnN0IHJvb3RDbHMgPSB1c2VDU1NWYXJDbHMocHJlZml4Q2xzKTtcbiAgY29uc3QgW3dyYXBDU1NWYXIsIGhhc2hJZCwgY3NzVmFyQ2xzXSA9IHVzZVN0eWxlKHByZWZpeENscywgcm9vdENscyk7XG4gIGNvbnN0IHtcbiAgICBjb21wYWN0U2l6ZSxcbiAgICBjb21wYWN0SXRlbUNsYXNzbmFtZXNcbiAgfSA9IHVzZUNvbXBhY3RJdGVtQ29udGV4dChwcmVmaXhDbHMsIGRpcmVjdGlvbik7XG4gIGxldCB1cEljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChVcE91dGxpbmVkLCB7XG4gICAgY2xhc3NOYW1lOiBgJHtwcmVmaXhDbHN9LWhhbmRsZXItdXAtaW5uZXJgXG4gIH0pO1xuICBsZXQgZG93bkljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEb3duT3V0bGluZWQsIHtcbiAgICBjbGFzc05hbWU6IGAke3ByZWZpeENsc30taGFuZGxlci1kb3duLWlubmVyYFxuICB9KTtcbiAgY29uc3QgY29udHJvbHNUZW1wID0gdHlwZW9mIGNvbnRyb2xzID09PSAnYm9vbGVhbicgPyBjb250cm9scyA6IHVuZGVmaW5lZDtcbiAgaWYgKHR5cGVvZiBjb250cm9scyA9PT0gJ29iamVjdCcpIHtcbiAgICB1cEljb24gPSB0eXBlb2YgY29udHJvbHMudXBJY29uID09PSAndW5kZWZpbmVkJyA/IHVwSWNvbiA6ICgvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBgJHtwcmVmaXhDbHN9LWhhbmRsZXItdXAtaW5uZXJgXG4gICAgfSwgY29udHJvbHMudXBJY29uKSk7XG4gICAgZG93bkljb24gPSB0eXBlb2YgY29udHJvbHMuZG93bkljb24gPT09ICd1bmRlZmluZWQnID8gZG93bkljb24gOiAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogYCR7cHJlZml4Q2xzfS1oYW5kbGVyLWRvd24taW5uZXJgXG4gICAgfSwgY29udHJvbHMuZG93bkljb24pKTtcbiAgfVxuICBjb25zdCB7XG4gICAgaGFzRmVlZGJhY2ssXG4gICAgc3RhdHVzOiBjb250ZXh0U3RhdHVzLFxuICAgIGlzRm9ybUl0ZW1JbnB1dCxcbiAgICBmZWVkYmFja0ljb25cbiAgfSA9IFJlYWN0LnVzZUNvbnRleHQoRm9ybUl0ZW1JbnB1dENvbnRleHQpO1xuICBjb25zdCBtZXJnZWRTdGF0dXMgPSBnZXRNZXJnZWRTdGF0dXMoY29udGV4dFN0YXR1cywgY3VzdG9tU3RhdHVzKTtcbiAgY29uc3QgbWVyZ2VkU2l6ZSA9IHVzZVNpemUoY3R4ID0+IHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIChfYSA9IGN1c3RvbWl6ZVNpemUgIT09IG51bGwgJiYgY3VzdG9taXplU2l6ZSAhPT0gdm9pZCAwID8gY3VzdG9taXplU2l6ZSA6IGNvbXBhY3RTaXplKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBjdHg7XG4gIH0pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gRGlzYWJsZWQgPT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IGRpc2FibGVkID0gUmVhY3QudXNlQ29udGV4dChEaXNhYmxlZENvbnRleHQpO1xuICBjb25zdCBtZXJnZWREaXNhYmxlZCA9IGN1c3RvbURpc2FibGVkICE9PSBudWxsICYmIGN1c3RvbURpc2FibGVkICE9PSB2b2lkIDAgPyBjdXN0b21EaXNhYmxlZCA6IGRpc2FibGVkO1xuICBjb25zdCBbdmFyaWFudCwgZW5hYmxlVmFyaWFudENsc10gPSB1c2VWYXJpYW50KCdpbnB1dE51bWJlcicsIGN1c3RvbVZhcmlhbnQsIGJvcmRlcmVkKTtcbiAgY29uc3Qgc3VmZml4Tm9kZSA9IGhhc0ZlZWRiYWNrICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBmZWVkYmFja0ljb24pO1xuICBjb25zdCBpbnB1dE51bWJlckNsYXNzID0gY2xhc3NOYW1lcyh7XG4gICAgW2Ake3ByZWZpeENsc30tbGdgXTogbWVyZ2VkU2l6ZSA9PT0gJ2xhcmdlJyxcbiAgICBbYCR7cHJlZml4Q2xzfS1zbWBdOiBtZXJnZWRTaXplID09PSAnc21hbGwnLFxuICAgIFtgJHtwcmVmaXhDbHN9LXJ0bGBdOiBkaXJlY3Rpb24gPT09ICdydGwnLFxuICAgIFtgJHtwcmVmaXhDbHN9LWluLWZvcm0taXRlbWBdOiBpc0Zvcm1JdGVtSW5wdXRcbiAgfSwgaGFzaElkKTtcbiAgY29uc3Qgd3JhcHBlckNsYXNzTmFtZSA9IGAke3ByZWZpeENsc30tZ3JvdXBgO1xuICBjb25zdCBlbGVtZW50ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmNJbnB1dE51bWJlciwgT2JqZWN0LmFzc2lnbih7XG4gICAgcmVmOiBpbnB1dFJlZixcbiAgICBkaXNhYmxlZDogbWVyZ2VkRGlzYWJsZWQsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNzc1ZhckNscywgcm9vdENscywgY2xhc3NOYW1lLCByb290Q2xhc3NOYW1lLCBjb21wYWN0SXRlbUNsYXNzbmFtZXMpLFxuICAgIHVwSGFuZGxlcjogdXBJY29uLFxuICAgIGRvd25IYW5kbGVyOiBkb3duSWNvbixcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICByZWFkT25seTogcmVhZE9ubHksXG4gICAgY29udHJvbHM6IGNvbnRyb2xzVGVtcCxcbiAgICBwcmVmaXg6IHByZWZpeCxcbiAgICBzdWZmaXg6IHN1ZmZpeE5vZGUgfHwgc3VmZml4LFxuICAgIGFkZG9uQmVmb3JlOiBhZGRvbkJlZm9yZSAmJiAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29udGV4dElzb2xhdG9yLCB7XG4gICAgICBmb3JtOiB0cnVlLFxuICAgICAgc3BhY2U6IHRydWVcbiAgICB9LCBhZGRvbkJlZm9yZSkpLFxuICAgIGFkZG9uQWZ0ZXI6IGFkZG9uQWZ0ZXIgJiYgKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbnRleHRJc29sYXRvciwge1xuICAgICAgZm9ybTogdHJ1ZSxcbiAgICAgIHNwYWNlOiB0cnVlXG4gICAgfSwgYWRkb25BZnRlcikpLFxuICAgIGNsYXNzTmFtZXM6IHtcbiAgICAgIGlucHV0OiBpbnB1dE51bWJlckNsYXNzLFxuICAgICAgdmFyaWFudDogY2xhc3NOYW1lcyh7XG4gICAgICAgIFtgJHtwcmVmaXhDbHN9LSR7dmFyaWFudH1gXTogZW5hYmxlVmFyaWFudENsc1xuICAgICAgfSwgZ2V0U3RhdHVzQ2xhc3NOYW1lcyhwcmVmaXhDbHMsIG1lcmdlZFN0YXR1cywgaGFzRmVlZGJhY2spKSxcbiAgICAgIGFmZml4V3JhcHBlcjogY2xhc3NOYW1lcyh7XG4gICAgICAgIFtgJHtwcmVmaXhDbHN9LWFmZml4LXdyYXBwZXItc21gXTogbWVyZ2VkU2l6ZSA9PT0gJ3NtYWxsJyxcbiAgICAgICAgW2Ake3ByZWZpeENsc30tYWZmaXgtd3JhcHBlci1sZ2BdOiBtZXJnZWRTaXplID09PSAnbGFyZ2UnLFxuICAgICAgICBbYCR7cHJlZml4Q2xzfS1hZmZpeC13cmFwcGVyLXJ0bGBdOiBkaXJlY3Rpb24gPT09ICdydGwnLFxuICAgICAgICBbYCR7cHJlZml4Q2xzfS1hZmZpeC13cmFwcGVyLXdpdGhvdXQtY29udHJvbHNgXTogY29udHJvbHMgPT09IGZhbHNlIHx8IG1lcmdlZERpc2FibGVkXG4gICAgICB9LCBoYXNoSWQpLFxuICAgICAgd3JhcHBlcjogY2xhc3NOYW1lcyh7XG4gICAgICAgIFtgJHt3cmFwcGVyQ2xhc3NOYW1lfS1ydGxgXTogZGlyZWN0aW9uID09PSAncnRsJ1xuICAgICAgfSwgaGFzaElkKSxcbiAgICAgIGdyb3VwV3JhcHBlcjogY2xhc3NOYW1lcyh7XG4gICAgICAgIFtgJHtwcmVmaXhDbHN9LWdyb3VwLXdyYXBwZXItc21gXTogbWVyZ2VkU2l6ZSA9PT0gJ3NtYWxsJyxcbiAgICAgICAgW2Ake3ByZWZpeENsc30tZ3JvdXAtd3JhcHBlci1sZ2BdOiBtZXJnZWRTaXplID09PSAnbGFyZ2UnLFxuICAgICAgICBbYCR7cHJlZml4Q2xzfS1ncm91cC13cmFwcGVyLXJ0bGBdOiBkaXJlY3Rpb24gPT09ICdydGwnLFxuICAgICAgICBbYCR7cHJlZml4Q2xzfS1ncm91cC13cmFwcGVyLSR7dmFyaWFudH1gXTogZW5hYmxlVmFyaWFudENsc1xuICAgICAgfSwgZ2V0U3RhdHVzQ2xhc3NOYW1lcyhgJHtwcmVmaXhDbHN9LWdyb3VwLXdyYXBwZXJgLCBtZXJnZWRTdGF0dXMsIGhhc0ZlZWRiYWNrKSwgaGFzaElkKVxuICAgIH1cbiAgfSwgb3RoZXJzKSk7XG4gIHJldHVybiB3cmFwQ1NTVmFyKGVsZW1lbnQpO1xufSk7XG5jb25zdCBUeXBlZElucHV0TnVtYmVyID0gSW5wdXROdW1iZXI7XG4vKiogQHByaXZhdGUgSW50ZXJuYWwgQ29tcG9uZW50LiBEbyBub3QgdXNlIGluIHlvdXIgcHJvZHVjdGlvbi4gKi9cbmNvbnN0IFB1cmVJbnB1dE51bWJlciA9IHByb3BzID0+ICgvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb25maWdQcm92aWRlciwge1xuICB0aGVtZToge1xuICAgIGNvbXBvbmVudHM6IHtcbiAgICAgIElucHV0TnVtYmVyOiB7XG4gICAgICAgIGhhbmRsZVZpc2libGU6IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KElucHV0TnVtYmVyLCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcykpKSk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBUeXBlZElucHV0TnVtYmVyLmRpc3BsYXlOYW1lID0gJ0lucHV0TnVtYmVyJztcbn1cblR5cGVkSW5wdXROdW1iZXIuX0ludGVybmFsUGFuZWxEb05vdFVzZU9yWW91V2lsbEJlRmlyZWQgPSBQdXJlSW5wdXROdW1iZXI7XG5leHBvcnQgZGVmYXVsdCBUeXBlZElucHV0TnVtYmVyOyIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBVcE91dGxpbmVkU3ZnIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL1VwT3V0bGluZWRcIjtcbmltcG9ydCBBbnRkSWNvbiBmcm9tIFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiO1xudmFyIFVwT3V0bGluZWQgPSBmdW5jdGlvbiBVcE91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFudGRJY29uLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBVcE91dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5cbi8qKiFbdXBdKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjNhV1IwYUQwaU5UQWlJR2hsYVdkb2REMGlOVEFpSUdacGJHdzlJaU5qWVdOaFkyRWlJSFpwWlhkQ2IzZzlJalkwSURZMElEZzVOaUE0T1RZaUlHWnZZM1Z6WVdKc1pUMGlabUZzYzJVaUlIaHRiRzV6UFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eU1EQXdMM04yWnlJK1BIQmhkR2dnWkQwaVRUZzVNQzQxSURjMU5TNHpURFV6Tnk0NUlESTJPUzR5WXkweE1pNDRMVEUzTGpZdE16a3RNVGN1TmkwMU1TNDNJREJNTVRNekxqVWdOelUxTGpOQk9DQTRJREFnTURBeE5EQWdOelk0YURjMVl6VXVNU0F3SURrdU9TMHlMalVnTVRJdU9TMDJMalpNTlRFeUlETTJPUzQ0YkRJNE5DNHhJRE01TVM0Mll6TWdOQzR4SURjdU9DQTJMallnTVRJdU9TQTJMalpvTnpWak5pNDFJREFnTVRBdU15MDNMalFnTmk0MUxURXlMamQ2SWlBdlBqd3ZjM1puUGc9PSkgKi9cbnZhciBSZWZJY29uID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoVXBPdXRsaW5lZCk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBSZWZJY29uLmRpc3BsYXlOYW1lID0gJ1VwT3V0bGluZWQnO1xufVxuZXhwb3J0IGRlZmF1bHQgUmVmSWNvbjsiLCAiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgVXBPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNODkwLjUgNzU1LjNMNTM3LjkgMjY5LjJjLTEyLjgtMTcuNi0zOS0xNy42LTUxLjcgMEwxMzMuNSA3NTUuM0E4IDggMCAwMDE0MCA3NjhoNzVjNS4xIDAgOS45LTIuNSAxMi45LTYuNkw1MTIgMzY5LjhsMjg0LjEgMzkxLjZjMyA0LjEgNy44IDYuNiAxMi45IDYuNmg3NWM2LjUgMCAxMC4zLTcuNCA2LjUtMTIuN3pcIiB9IH1dIH0sIFwibmFtZVwiOiBcInVwXCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnQgZGVmYXVsdCBVcE91dGxpbmVkO1xuIiwgImV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0QmlnSW50KCkge1xuICByZXR1cm4gdHlwZW9mIEJpZ0ludCA9PT0gJ2Z1bmN0aW9uJztcbn0iLCAiaW1wb3J0IHsgc3VwcG9ydEJpZ0ludCB9IGZyb20gXCIuL3N1cHBvcnRVdGlsXCI7XG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkge1xuICByZXR1cm4gIXZhbHVlICYmIHZhbHVlICE9PSAwICYmICFOdW1iZXIuaXNOYU4odmFsdWUpIHx8ICFTdHJpbmcodmFsdWUpLnRyaW0oKTtcbn1cblxuLyoqXG4gKiBGb3JtYXQgc3RyaW5nIG51bWJlciB0byByZWFkYWJsZSBudW1iZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaW1OdW1iZXIobnVtU3RyKSB7XG4gIHZhciBzdHIgPSBudW1TdHIudHJpbSgpO1xuICB2YXIgbmVnYXRpdmUgPSBzdHIuc3RhcnRzV2l0aCgnLScpO1xuICBpZiAobmVnYXRpdmUpIHtcbiAgICBzdHIgPSBzdHIuc2xpY2UoMSk7XG4gIH1cbiAgc3RyID0gc3RyXG4gIC8vIFJlbW92ZSBkZWNpbWFsIDAuIGAxLjAwMGAgPT4gYDEuYCwgYDEuMTAwYCA9PiBgMS4xYFxuICAucmVwbGFjZSgvKFxcLlxcZCpbXjBdKTAqJC8sICckMScpXG4gIC8vIFJlbW92ZSB1c2VsZXNzIGRlY2ltYWwuIGAxLmAgPT4gYDFgXG4gIC5yZXBsYWNlKC9cXC4wKiQvLCAnJylcbiAgLy8gUmVtb3ZlIGludGVnZXIgMC4gYDAwMDFgID0+IGAxYCwgMDAwLjEnID0+IGAuMWBcbiAgLnJlcGxhY2UoL14wKy8sICcnKTtcbiAgaWYgKHN0ci5zdGFydHNXaXRoKCcuJykpIHtcbiAgICBzdHIgPSBcIjBcIi5jb25jYXQoc3RyKTtcbiAgfVxuICB2YXIgdHJpbVN0ciA9IHN0ciB8fCAnMCc7XG4gIHZhciBzcGxpdE51bWJlciA9IHRyaW1TdHIuc3BsaXQoJy4nKTtcbiAgdmFyIGludGVnZXJTdHIgPSBzcGxpdE51bWJlclswXSB8fCAnMCc7XG4gIHZhciBkZWNpbWFsU3RyID0gc3BsaXROdW1iZXJbMV0gfHwgJzAnO1xuICBpZiAoaW50ZWdlclN0ciA9PT0gJzAnICYmIGRlY2ltYWxTdHIgPT09ICcwJykge1xuICAgIG5lZ2F0aXZlID0gZmFsc2U7XG4gIH1cbiAgdmFyIG5lZ2F0aXZlU3RyID0gbmVnYXRpdmUgPyAnLScgOiAnJztcbiAgcmV0dXJuIHtcbiAgICBuZWdhdGl2ZTogbmVnYXRpdmUsXG4gICAgbmVnYXRpdmVTdHI6IG5lZ2F0aXZlU3RyLFxuICAgIHRyaW1TdHI6IHRyaW1TdHIsXG4gICAgaW50ZWdlclN0cjogaW50ZWdlclN0cixcbiAgICBkZWNpbWFsU3RyOiBkZWNpbWFsU3RyLFxuICAgIGZ1bGxTdHI6IFwiXCIuY29uY2F0KG5lZ2F0aXZlU3RyKS5jb25jYXQodHJpbVN0cilcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0UobnVtYmVyKSB7XG4gIHZhciBzdHIgPSBTdHJpbmcobnVtYmVyKTtcbiAgcmV0dXJuICFOdW1iZXIuaXNOYU4oTnVtYmVyKHN0cikpICYmIHN0ci5pbmNsdWRlcygnZScpO1xufVxuXG4vKipcbiAqIFtMZWdhY3ldIENvbnZlcnQgMWUtOSB0byAwLjAwMDAwMDAwMS5cbiAqIFRoaXMgbWF5IGxvc2Ugc29tZSBwcmVjaXNpb24gaWYgdXNlciByZWFsbHkgd2FudCAxZS05LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TnVtYmVyUHJlY2lzaW9uKG51bWJlcikge1xuICB2YXIgbnVtU3RyID0gU3RyaW5nKG51bWJlcik7XG4gIGlmIChpc0UobnVtYmVyKSkge1xuICAgIHZhciBwcmVjaXNpb24gPSBOdW1iZXIobnVtU3RyLnNsaWNlKG51bVN0ci5pbmRleE9mKCdlLScpICsgMikpO1xuICAgIHZhciBkZWNpbWFsTWF0Y2ggPSBudW1TdHIubWF0Y2goL1xcLihcXGQrKS8pO1xuICAgIGlmIChkZWNpbWFsTWF0Y2ggIT09IG51bGwgJiYgZGVjaW1hbE1hdGNoICE9PSB2b2lkIDAgJiYgZGVjaW1hbE1hdGNoWzFdKSB7XG4gICAgICBwcmVjaXNpb24gKz0gZGVjaW1hbE1hdGNoWzFdLmxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIHByZWNpc2lvbjtcbiAgfVxuICByZXR1cm4gbnVtU3RyLmluY2x1ZGVzKCcuJykgJiYgdmFsaWRhdGVOdW1iZXIobnVtU3RyKSA/IG51bVN0ci5sZW5ndGggLSBudW1TdHIuaW5kZXhPZignLicpIC0gMSA6IDA7XG59XG5cbi8qKlxuICogQ29udmVydCBudW1iZXIgKGluY2x1ZGVzIHNjaWVudGlmaWMgbm90YXRpb24pIHRvIC14eHgueXl5IGZvcm1hdFxuICovXG5leHBvcnQgZnVuY3Rpb24gbnVtMnN0cihudW1iZXIpIHtcbiAgdmFyIG51bVN0ciA9IFN0cmluZyhudW1iZXIpO1xuICBpZiAoaXNFKG51bWJlcikpIHtcbiAgICBpZiAobnVtYmVyID4gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgIHJldHVybiBTdHJpbmcoc3VwcG9ydEJpZ0ludCgpID8gQmlnSW50KG51bWJlcikudG9TdHJpbmcoKSA6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKTtcbiAgICB9XG4gICAgaWYgKG51bWJlciA8IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKHN1cHBvcnRCaWdJbnQoKSA/IEJpZ0ludChudW1iZXIpLnRvU3RyaW5nKCkgOiBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUik7XG4gICAgfVxuICAgIG51bVN0ciA9IG51bWJlci50b0ZpeGVkKGdldE51bWJlclByZWNpc2lvbihudW1TdHIpKTtcbiAgfVxuICByZXR1cm4gdHJpbU51bWJlcihudW1TdHIpLmZ1bGxTdHI7XG59XG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVOdW1iZXIobnVtKSB7XG4gIGlmICh0eXBlb2YgbnVtID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiAhTnVtYmVyLmlzTmFOKG51bSk7XG4gIH1cblxuICAvLyBFbXB0eVxuICBpZiAoIW51bSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gKFxuICAgIC8vIE5vcm1hbCB0eXBlOiAxMS4yOFxuICAgIC9eXFxzKi0/XFxkKyhcXC5cXGQrKT9cXHMqJC8udGVzdChudW0pIHx8XG4gICAgLy8gUHJlLW51bWJlcjogMS5cbiAgICAvXlxccyotP1xcZCtcXC5cXHMqJC8udGVzdChudW0pIHx8XG4gICAgLy8gUG9zdC1udW1iZXI6IC4xXG4gICAgL15cXHMqLT9cXC5cXGQrXFxzKiQvLnRlc3QobnVtKVxuICApO1xufSIsICJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgeyBpc0UsIGlzRW1wdHksIG51bTJzdHIsIHRyaW1OdW1iZXIsIHZhbGlkYXRlTnVtYmVyIH0gZnJvbSBcIi4vbnVtYmVyVXRpbFwiO1xudmFyIEJpZ0ludERlY2ltYWwgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAvKiogQmlnSW50IHdpbGwgY29udmVydCBgMDAwOWAgdG8gYDlgLiBXZSBuZWVkIHJlY29yZCB0aGUgbGVuIG9mIGRlY2ltYWwgKi9cblxuICBmdW5jdGlvbiBCaWdJbnREZWNpbWFsKHZhbHVlKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEJpZ0ludERlY2ltYWwpO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm9yaWdpblwiLCAnJyk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwibmVnYXRpdmVcIiwgdm9pZCAwKTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJpbnRlZ2VyXCIsIHZvaWQgMCk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiZGVjaW1hbFwiLCB2b2lkIDApO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImRlY2ltYWxMZW5cIiwgdm9pZCAwKTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJlbXB0eVwiLCB2b2lkIDApO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm5hblwiLCB2b2lkIDApO1xuICAgIGlmIChpc0VtcHR5KHZhbHVlKSkge1xuICAgICAgdGhpcy5lbXB0eSA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMub3JpZ2luID0gU3RyaW5nKHZhbHVlKTtcblxuICAgIC8vIEFjdCBsaWtlIE51bWJlciBjb252ZXJ0XG4gICAgaWYgKHZhbHVlID09PSAnLScgfHwgTnVtYmVyLmlzTmFOKHZhbHVlKSkge1xuICAgICAgdGhpcy5uYW4gPSB0cnVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgbWVyZ2VkVmFsdWUgPSB2YWx1ZTtcblxuICAgIC8vIFdlIG5lZWQgY29udmVydCBiYWNrIHRvIE51bWJlciBzaW5jZSBpdCByZXF1aXJlIGB0b0ZpeGVkYCB0byBoYW5kbGUgdGhpc1xuICAgIGlmIChpc0UobWVyZ2VkVmFsdWUpKSB7XG4gICAgICBtZXJnZWRWYWx1ZSA9IE51bWJlcihtZXJnZWRWYWx1ZSk7XG4gICAgfVxuICAgIG1lcmdlZFZhbHVlID0gdHlwZW9mIG1lcmdlZFZhbHVlID09PSAnc3RyaW5nJyA/IG1lcmdlZFZhbHVlIDogbnVtMnN0cihtZXJnZWRWYWx1ZSk7XG4gICAgaWYgKHZhbGlkYXRlTnVtYmVyKG1lcmdlZFZhbHVlKSkge1xuICAgICAgdmFyIHRyaW1SZXQgPSB0cmltTnVtYmVyKG1lcmdlZFZhbHVlKTtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSB0cmltUmV0Lm5lZ2F0aXZlO1xuICAgICAgdmFyIG51bWJlcnMgPSB0cmltUmV0LnRyaW1TdHIuc3BsaXQoJy4nKTtcbiAgICAgIHRoaXMuaW50ZWdlciA9IEJpZ0ludChudW1iZXJzWzBdKTtcbiAgICAgIHZhciBkZWNpbWFsU3RyID0gbnVtYmVyc1sxXSB8fCAnMCc7XG4gICAgICB0aGlzLmRlY2ltYWwgPSBCaWdJbnQoZGVjaW1hbFN0cik7XG4gICAgICB0aGlzLmRlY2ltYWxMZW4gPSBkZWNpbWFsU3RyLmxlbmd0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5uYW4gPSB0cnVlO1xuICAgIH1cbiAgfVxuICBfY3JlYXRlQ2xhc3MoQmlnSW50RGVjaW1hbCwgW3tcbiAgICBrZXk6IFwiZ2V0TWFya1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRNYXJrKCkge1xuICAgICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgPyAnLScgOiAnJztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0SW50ZWdlclN0clwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRJbnRlZ2VyU3RyKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW50ZWdlci50b1N0cmluZygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlIGdldCBkZWNpbWFsIHN0cmluZ1xuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiBcImdldERlY2ltYWxTdHJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RGVjaW1hbFN0cigpIHtcbiAgICAgIHJldHVybiB0aGlzLmRlY2ltYWwudG9TdHJpbmcoKS5wYWRTdGFydCh0aGlzLmRlY2ltYWxMZW4sICcwJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGUgQWxpZ24gQmlnSW50RGVjaW1hbCB3aXRoIHNhbWUgZGVjaW1hbCBsZW5ndGguIGUuZy4gMTIuMyArIDUgPSAxMjMwMDAwXG4gICAgICogVGhpcyBpcyB1c2VkIGZvciBhZGQgZnVuY3Rpb24gb25seS5cbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogXCJhbGlnbkRlY2ltYWxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWxpZ25EZWNpbWFsKGRlY2ltYWxMZW5ndGgpIHtcbiAgICAgIHZhciBzdHIgPSBcIlwiLmNvbmNhdCh0aGlzLmdldE1hcmsoKSkuY29uY2F0KHRoaXMuZ2V0SW50ZWdlclN0cigpKS5jb25jYXQodGhpcy5nZXREZWNpbWFsU3RyKCkucGFkRW5kKGRlY2ltYWxMZW5ndGgsICcwJykpO1xuICAgICAgcmV0dXJuIEJpZ0ludChzdHIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJuZWdhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbmVnYXRlKCkge1xuICAgICAgdmFyIGNsb25lID0gbmV3IEJpZ0ludERlY2ltYWwodGhpcy50b1N0cmluZygpKTtcbiAgICAgIGNsb25lLm5lZ2F0aXZlID0gIWNsb25lLm5lZ2F0aXZlO1xuICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjYWxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2FsKG9mZnNldCwgY2FsY3VsYXRvciwgY2FsRGVjaW1hbExlbikge1xuICAgICAgdmFyIG1heERlY2ltYWxMZW5ndGggPSBNYXRoLm1heCh0aGlzLmdldERlY2ltYWxTdHIoKS5sZW5ndGgsIG9mZnNldC5nZXREZWNpbWFsU3RyKCkubGVuZ3RoKTtcbiAgICAgIHZhciBteUFsaWduZWREZWNpbWFsID0gdGhpcy5hbGlnbkRlY2ltYWwobWF4RGVjaW1hbExlbmd0aCk7XG4gICAgICB2YXIgb2Zmc2V0QWxpZ25lZERlY2ltYWwgPSBvZmZzZXQuYWxpZ25EZWNpbWFsKG1heERlY2ltYWxMZW5ndGgpO1xuICAgICAgdmFyIHZhbHVlU3RyID0gY2FsY3VsYXRvcihteUFsaWduZWREZWNpbWFsLCBvZmZzZXRBbGlnbmVkRGVjaW1hbCkudG9TdHJpbmcoKTtcbiAgICAgIHZhciBuZXh0RGVjaW1hbExlbmd0aCA9IGNhbERlY2ltYWxMZW4obWF4RGVjaW1hbExlbmd0aCk7XG5cbiAgICAgIC8vIFdlIG5lZWQgZmlsbCBzdHJpbmcgbGVuZ3RoIGJhY2sgdG8gYG1heERlY2ltYWxMZW5ndGhgIHRvIGF2b2lkIHBhcnNlciBmYWlsZWRcbiAgICAgIHZhciBfdHJpbU51bWJlciA9IHRyaW1OdW1iZXIodmFsdWVTdHIpLFxuICAgICAgICBuZWdhdGl2ZVN0ciA9IF90cmltTnVtYmVyLm5lZ2F0aXZlU3RyLFxuICAgICAgICB0cmltU3RyID0gX3RyaW1OdW1iZXIudHJpbVN0cjtcbiAgICAgIHZhciBoeWRyYXRlVmFsdWVTdHIgPSBcIlwiLmNvbmNhdChuZWdhdGl2ZVN0cikuY29uY2F0KHRyaW1TdHIucGFkU3RhcnQobmV4dERlY2ltYWxMZW5ndGggKyAxLCAnMCcpKTtcbiAgICAgIHJldHVybiBuZXcgQmlnSW50RGVjaW1hbChcIlwiLmNvbmNhdChoeWRyYXRlVmFsdWVTdHIuc2xpY2UoMCwgLW5leHREZWNpbWFsTGVuZ3RoKSwgXCIuXCIpLmNvbmNhdChoeWRyYXRlVmFsdWVTdHIuc2xpY2UoLW5leHREZWNpbWFsTGVuZ3RoKSkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhZGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkKHZhbHVlKSB7XG4gICAgICBpZiAodGhpcy5pc0ludmFsaWRhdGUoKSkge1xuICAgICAgICByZXR1cm4gbmV3IEJpZ0ludERlY2ltYWwodmFsdWUpO1xuICAgICAgfVxuICAgICAgdmFyIG9mZnNldCA9IG5ldyBCaWdJbnREZWNpbWFsKHZhbHVlKTtcbiAgICAgIGlmIChvZmZzZXQuaXNJbnZhbGlkYXRlKCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5jYWwob2Zmc2V0LCBmdW5jdGlvbiAobnVtMSwgbnVtMikge1xuICAgICAgICByZXR1cm4gbnVtMSArIG51bTI7XG4gICAgICB9LCBmdW5jdGlvbiAobGVuKSB7XG4gICAgICAgIHJldHVybiBsZW47XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibXVsdGlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbXVsdGkodmFsdWUpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBuZXcgQmlnSW50RGVjaW1hbCh2YWx1ZSk7XG4gICAgICBpZiAodGhpcy5pc0ludmFsaWRhdGUoKSB8fCB0YXJnZXQuaXNJbnZhbGlkYXRlKCkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCaWdJbnREZWNpbWFsKE5hTik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5jYWwodGFyZ2V0LCBmdW5jdGlvbiAobnVtMSwgbnVtMikge1xuICAgICAgICByZXR1cm4gbnVtMSAqIG51bTI7XG4gICAgICB9LCBmdW5jdGlvbiAobGVuKSB7XG4gICAgICAgIHJldHVybiBsZW4gKiAyO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzRW1wdHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNFbXB0eSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmVtcHR5O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc05hTlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc05hTigpIHtcbiAgICAgIHJldHVybiB0aGlzLm5hbjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNJbnZhbGlkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzSW52YWxpZGF0ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzRW1wdHkoKSB8fCB0aGlzLmlzTmFOKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVxdWFsc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlcXVhbHModGFyZ2V0KSB7XG4gICAgICByZXR1cm4gdGhpcy50b1N0cmluZygpID09PSAodGFyZ2V0ID09PSBudWxsIHx8IHRhcmdldCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGFyZ2V0LnRvU3RyaW5nKCkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJsZXNzRXF1YWxzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxlc3NFcXVhbHModGFyZ2V0KSB7XG4gICAgICByZXR1cm4gdGhpcy5hZGQodGFyZ2V0Lm5lZ2F0ZSgpLnRvU3RyaW5nKCkpLnRvTnVtYmVyKCkgPD0gMDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidG9OdW1iZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9OdW1iZXIoKSB7XG4gICAgICBpZiAodGhpcy5pc05hTigpKSB7XG4gICAgICAgIHJldHVybiBOYU47XG4gICAgICB9XG4gICAgICByZXR1cm4gTnVtYmVyKHRoaXMudG9TdHJpbmcoKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRvU3RyaW5nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgdmFyIHNhZmUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRydWU7XG4gICAgICBpZiAoIXNhZmUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaXNJbnZhbGlkYXRlKCkpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRyaW1OdW1iZXIoXCJcIi5jb25jYXQodGhpcy5nZXRNYXJrKCkpLmNvbmNhdCh0aGlzLmdldEludGVnZXJTdHIoKSwgXCIuXCIpLmNvbmNhdCh0aGlzLmdldERlY2ltYWxTdHIoKSkpLmZ1bGxTdHI7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBCaWdJbnREZWNpbWFsO1xufSgpO1xuZXhwb3J0IHsgQmlnSW50RGVjaW1hbCBhcyBkZWZhdWx0IH07IiwgImltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCB7IGdldE51bWJlclByZWNpc2lvbiwgaXNFbXB0eSwgbnVtMnN0ciB9IGZyb20gXCIuL251bWJlclV0aWxcIjtcblxuLyoqXG4gKiBXZSBjYW4gcmVtb3ZlIHRoaXMgd2hlbiBJRSBub3Qgc3VwcG9ydCBhbnltb3JlXG4gKi9cbnZhciBOdW1iZXJEZWNpbWFsID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTnVtYmVyRGVjaW1hbCh2YWx1ZSkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBOdW1iZXJEZWNpbWFsKTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJvcmlnaW5cIiwgJycpO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm51bWJlclwiLCB2b2lkIDApO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImVtcHR5XCIsIHZvaWQgMCk7XG4gICAgaWYgKGlzRW1wdHkodmFsdWUpKSB7XG4gICAgICB0aGlzLmVtcHR5ID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vcmlnaW4gPSBTdHJpbmcodmFsdWUpO1xuICAgIHRoaXMubnVtYmVyID0gTnVtYmVyKHZhbHVlKTtcbiAgfVxuICBfY3JlYXRlQ2xhc3MoTnVtYmVyRGVjaW1hbCwgW3tcbiAgICBrZXk6IFwibmVnYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5lZ2F0ZSgpIHtcbiAgICAgIHJldHVybiBuZXcgTnVtYmVyRGVjaW1hbCgtdGhpcy50b051bWJlcigpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZCh2YWx1ZSkge1xuICAgICAgaWYgKHRoaXMuaXNJbnZhbGlkYXRlKCkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOdW1iZXJEZWNpbWFsKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHZhciB0YXJnZXQgPSBOdW1iZXIodmFsdWUpO1xuICAgICAgaWYgKE51bWJlci5pc05hTih0YXJnZXQpKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgdmFyIG51bWJlciA9IHRoaXMubnVtYmVyICsgdGFyZ2V0O1xuXG4gICAgICAvLyBbTGVnYWN5XSBCYWNrIHRvIHNhZmUgaW50ZWdlclxuICAgICAgaWYgKG51bWJlciA+IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgICAgIHJldHVybiBuZXcgTnVtYmVyRGVjaW1hbChOdW1iZXIuTUFYX1NBRkVfSU5URUdFUik7XG4gICAgICB9XG4gICAgICBpZiAobnVtYmVyIDwgTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOdW1iZXJEZWNpbWFsKE51bWJlci5NSU5fU0FGRV9JTlRFR0VSKTtcbiAgICAgIH1cbiAgICAgIHZhciBtYXhQcmVjaXNpb24gPSBNYXRoLm1heChnZXROdW1iZXJQcmVjaXNpb24odGhpcy5udW1iZXIpLCBnZXROdW1iZXJQcmVjaXNpb24odGFyZ2V0KSk7XG4gICAgICByZXR1cm4gbmV3IE51bWJlckRlY2ltYWwobnVtYmVyLnRvRml4ZWQobWF4UHJlY2lzaW9uKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm11bHRpXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG11bHRpKHZhbHVlKSB7XG4gICAgICB2YXIgdGFyZ2V0ID0gTnVtYmVyKHZhbHVlKTtcbiAgICAgIGlmICh0aGlzLmlzSW52YWxpZGF0ZSgpIHx8IE51bWJlci5pc05hTih0YXJnZXQpKSB7XG4gICAgICAgIHJldHVybiBuZXcgTnVtYmVyRGVjaW1hbChOYU4pO1xuICAgICAgfVxuICAgICAgdmFyIG51bWJlciA9IHRoaXMubnVtYmVyICogdGFyZ2V0O1xuXG4gICAgICAvLyBbTGVnYWN5XSBCYWNrIHRvIHNhZmUgaW50ZWdlclxuICAgICAgaWYgKG51bWJlciA+IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgICAgIHJldHVybiBuZXcgTnVtYmVyRGVjaW1hbChOdW1iZXIuTUFYX1NBRkVfSU5URUdFUik7XG4gICAgICB9XG4gICAgICBpZiAobnVtYmVyIDwgTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOdW1iZXJEZWNpbWFsKE51bWJlci5NSU5fU0FGRV9JTlRFR0VSKTtcbiAgICAgIH1cbiAgICAgIHZhciBtYXhQcmVjaXNpb24gPSBNYXRoLm1heChnZXROdW1iZXJQcmVjaXNpb24odGhpcy5udW1iZXIpLCBnZXROdW1iZXJQcmVjaXNpb24odGFyZ2V0KSk7XG4gICAgICByZXR1cm4gbmV3IE51bWJlckRlY2ltYWwobnVtYmVyLnRvRml4ZWQobWF4UHJlY2lzaW9uKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzRW1wdHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNFbXB0eSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmVtcHR5O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc05hTlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc05hTigpIHtcbiAgICAgIHJldHVybiBOdW1iZXIuaXNOYU4odGhpcy5udW1iZXIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc0ludmFsaWRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNJbnZhbGlkYXRlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNFbXB0eSgpIHx8IHRoaXMuaXNOYU4oKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZXF1YWxzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVxdWFscyh0YXJnZXQpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvTnVtYmVyKCkgPT09ICh0YXJnZXQgPT09IG51bGwgfHwgdGFyZ2V0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0YXJnZXQudG9OdW1iZXIoKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImxlc3NFcXVhbHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbGVzc0VxdWFscyh0YXJnZXQpIHtcbiAgICAgIHJldHVybiB0aGlzLmFkZCh0YXJnZXQubmVnYXRlKCkudG9TdHJpbmcoKSkudG9OdW1iZXIoKSA8PSAwO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0b051bWJlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b051bWJlcigpIHtcbiAgICAgIHJldHVybiB0aGlzLm51bWJlcjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidG9TdHJpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICB2YXIgc2FmZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdHJ1ZTtcbiAgICAgIGlmICghc2FmZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pc0ludmFsaWRhdGUoKSkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVtMnN0cih0aGlzLm51bWJlcik7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBOdW1iZXJEZWNpbWFsO1xufSgpO1xuZXhwb3J0IHsgTnVtYmVyRGVjaW1hbCBhcyBkZWZhdWx0IH07IiwgIi8qIGVzbGludC1kaXNhYmxlIG1heC1jbGFzc2VzLXBlci1maWxlICovXG5cbmltcG9ydCBCaWdJbnREZWNpbWFsIGZyb20gXCIuL0JpZ0ludERlY2ltYWxcIjtcbmltcG9ydCBOdW1iZXJEZWNpbWFsIGZyb20gXCIuL051bWJlckRlY2ltYWxcIjtcbmltcG9ydCB7IHRyaW1OdW1iZXIgfSBmcm9tIFwiLi9udW1iZXJVdGlsXCI7XG5pbXBvcnQgeyBzdXBwb3J0QmlnSW50IH0gZnJvbSBcIi4vc3VwcG9ydFV0aWxcIjtcblxuLy8gU3RpbGwgc3VwcG9ydCBvcmlnaW4gZXhwb3J0XG5leHBvcnQgeyBOdW1iZXJEZWNpbWFsLCBCaWdJbnREZWNpbWFsIH07XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRNaW5pRGVjaW1hbCh2YWx1ZSkge1xuICAvLyBXZSB1c2UgQmlnSW50IGhlcmUuXG4gIC8vIFdpbGwgZmFsbGJhY2sgdG8gTnVtYmVyIGlmIG5vdCBzdXBwb3J0LlxuICBpZiAoc3VwcG9ydEJpZ0ludCgpKSB7XG4gICAgcmV0dXJuIG5ldyBCaWdJbnREZWNpbWFsKHZhbHVlKTtcbiAgfVxuICByZXR1cm4gbmV3IE51bWJlckRlY2ltYWwodmFsdWUpO1xufVxuXG4vKipcbiAqIEFsaWduIHRoZSBsb2dpYyBvZiB0b0ZpeGVkIHRvIGFyb3VuZCBsaWtlIDEuNSA9PiAyLlxuICogSWYgc2V0IGBjdXRPbmx5YCwgd2lsbCBqdXN0IHJlbW92ZSB0aGUgb3ZlciBkZWNpbWFsIHBhcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0ZpeGVkKG51bVN0ciwgc2VwYXJhdG9yU3RyLCBwcmVjaXNpb24pIHtcbiAgdmFyIGN1dE9ubHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IGZhbHNlO1xuICBpZiAobnVtU3RyID09PSAnJykge1xuICAgIHJldHVybiAnJztcbiAgfVxuICB2YXIgX3RyaW1OdW1iZXIgPSB0cmltTnVtYmVyKG51bVN0ciksXG4gICAgbmVnYXRpdmVTdHIgPSBfdHJpbU51bWJlci5uZWdhdGl2ZVN0cixcbiAgICBpbnRlZ2VyU3RyID0gX3RyaW1OdW1iZXIuaW50ZWdlclN0cixcbiAgICBkZWNpbWFsU3RyID0gX3RyaW1OdW1iZXIuZGVjaW1hbFN0cjtcbiAgdmFyIHByZWNpc2lvbkRlY2ltYWxTdHIgPSBcIlwiLmNvbmNhdChzZXBhcmF0b3JTdHIpLmNvbmNhdChkZWNpbWFsU3RyKTtcbiAgdmFyIG51bWJlcldpdGhvdXREZWNpbWFsID0gXCJcIi5jb25jYXQobmVnYXRpdmVTdHIpLmNvbmNhdChpbnRlZ2VyU3RyKTtcbiAgaWYgKHByZWNpc2lvbiA+PSAwKSB7XG4gICAgLy8gV2Ugd2lsbCBnZXQgbGFzdCArIDEgbnVtYmVyIHRvIGNoZWNrIGlmIG5lZWQgYWR2YW5jZWQgbnVtYmVyXG4gICAgdmFyIGFkdmFuY2VkTnVtID0gTnVtYmVyKGRlY2ltYWxTdHJbcHJlY2lzaW9uXSk7XG4gICAgaWYgKGFkdmFuY2VkTnVtID49IDUgJiYgIWN1dE9ubHkpIHtcbiAgICAgIHZhciBhZHZhbmNlZERlY2ltYWwgPSBnZXRNaW5pRGVjaW1hbChudW1TdHIpLmFkZChcIlwiLmNvbmNhdChuZWdhdGl2ZVN0ciwgXCIwLlwiKS5jb25jYXQoJzAnLnJlcGVhdChwcmVjaXNpb24pKS5jb25jYXQoMTAgLSBhZHZhbmNlZE51bSkpO1xuICAgICAgcmV0dXJuIHRvRml4ZWQoYWR2YW5jZWREZWNpbWFsLnRvU3RyaW5nKCksIHNlcGFyYXRvclN0ciwgcHJlY2lzaW9uLCBjdXRPbmx5KTtcbiAgICB9XG4gICAgaWYgKHByZWNpc2lvbiA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bWJlcldpdGhvdXREZWNpbWFsO1xuICAgIH1cbiAgICByZXR1cm4gXCJcIi5jb25jYXQobnVtYmVyV2l0aG91dERlY2ltYWwpLmNvbmNhdChzZXBhcmF0b3JTdHIpLmNvbmNhdChkZWNpbWFsU3RyLnBhZEVuZChwcmVjaXNpb24sICcwJykuc2xpY2UoMCwgcHJlY2lzaW9uKSk7XG4gIH1cbiAgaWYgKHByZWNpc2lvbkRlY2ltYWxTdHIgPT09ICcuMCcpIHtcbiAgICByZXR1cm4gbnVtYmVyV2l0aG91dERlY2ltYWw7XG4gIH1cbiAgcmV0dXJuIFwiXCIuY29uY2F0KG51bWJlcldpdGhvdXREZWNpbWFsKS5jb25jYXQocHJlY2lzaW9uRGVjaW1hbFN0cik7XG59IiwgImltcG9ydCBnZXRNaW5pRGVjaW1hbCBmcm9tIFwiLi9NaW5pRGVjaW1hbFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vTWluaURlY2ltYWxcIjtcbmltcG9ydCB7IHRyaW1OdW1iZXIsIGdldE51bWJlclByZWNpc2lvbiwgbnVtMnN0ciwgdmFsaWRhdGVOdW1iZXIgfSBmcm9tIFwiLi9udW1iZXJVdGlsXCI7XG5leHBvcnQgeyB0cmltTnVtYmVyLCBnZXROdW1iZXJQcmVjaXNpb24sIG51bTJzdHIsIHZhbGlkYXRlTnVtYmVyIH07XG5leHBvcnQgZGVmYXVsdCBnZXRNaW5pRGVjaW1hbDsiLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcInByZWZpeENsc1wiLCBcImNsYXNzTmFtZVwiLCBcInN0eWxlXCIsIFwibWluXCIsIFwibWF4XCIsIFwic3RlcFwiLCBcImRlZmF1bHRWYWx1ZVwiLCBcInZhbHVlXCIsIFwiZGlzYWJsZWRcIiwgXCJyZWFkT25seVwiLCBcInVwSGFuZGxlclwiLCBcImRvd25IYW5kbGVyXCIsIFwia2V5Ym9hcmRcIiwgXCJjaGFuZ2VPbldoZWVsXCIsIFwiY29udHJvbHNcIiwgXCJjbGFzc05hbWVzXCIsIFwic3RyaW5nTW9kZVwiLCBcInBhcnNlclwiLCBcImZvcm1hdHRlclwiLCBcInByZWNpc2lvblwiLCBcImRlY2ltYWxTZXBhcmF0b3JcIiwgXCJvbkNoYW5nZVwiLCBcIm9uSW5wdXRcIiwgXCJvblByZXNzRW50ZXJcIiwgXCJvblN0ZXBcIiwgXCJjaGFuZ2VPbkJsdXJcIiwgXCJkb21SZWZcIl0sXG4gIF9leGNsdWRlZDIgPSBbXCJkaXNhYmxlZFwiLCBcInN0eWxlXCIsIFwicHJlZml4Q2xzXCIsIFwidmFsdWVcIiwgXCJwcmVmaXhcIiwgXCJzdWZmaXhcIiwgXCJhZGRvbkJlZm9yZVwiLCBcImFkZG9uQWZ0ZXJcIiwgXCJjbGFzc05hbWVcIiwgXCJjbGFzc05hbWVzXCJdO1xuaW1wb3J0IGdldE1pbmlEZWNpbWFsLCB7IGdldE51bWJlclByZWNpc2lvbiwgbnVtMnN0ciwgdG9GaXhlZCwgdmFsaWRhdGVOdW1iZXIgfSBmcm9tICdAcmMtY29tcG9uZW50L21pbmktZGVjaW1hbCc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IEJhc2VJbnB1dCB9IGZyb20gJ3JjLWlucHV0JztcbmltcG9ydCB7IHVzZUxheW91dFVwZGF0ZUVmZmVjdCB9IGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZUxheW91dEVmZmVjdFwiO1xuaW1wb3J0IHByb3h5T2JqZWN0IGZyb20gXCJyYy11dGlsL2VzL3Byb3h5T2JqZWN0XCI7XG5pbXBvcnQgeyBjb21wb3NlUmVmIH0gZnJvbSBcInJjLXV0aWwvZXMvcmVmXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlQ3Vyc29yIGZyb20gXCIuL2hvb2tzL3VzZUN1cnNvclwiO1xuaW1wb3J0IFN0ZXBIYW5kbGVyIGZyb20gXCIuL1N0ZXBIYW5kbGVyXCI7XG5pbXBvcnQgeyBnZXREZWN1cGxlU3RlcHMgfSBmcm9tIFwiLi91dGlscy9udW1iZXJVdGlsXCI7XG5pbXBvcnQgeyB0cmlnZ2VyRm9jdXMgfSBmcm9tIFwicmMtaW5wdXQvZXMvdXRpbHMvY29tbW9uVXRpbHNcIjtcbmltcG9ydCB1c2VGcmFtZSBmcm9tIFwiLi9ob29rcy91c2VGcmFtZVwiO1xuLyoqXG4gKiBXZSBzdXBwb3J0IGBzdHJpbmdNb2RlYCB3aGljaCBuZWVkIGhhbmRsZSBjb3JyZWN0IHR5cGUgd2hlbiB1c2VyIGNhbGwgaW4gb25DaGFuZ2VcbiAqIGZvcm1hdCBtYXggb3IgbWluIHZhbHVlXG4gKiAxLiBpZiBpc0ludmFsaWQgcmV0dXJuIG51bGxcbiAqIDIuIGlmIHByZWNpc2lvbiBpcyB1bmRlZmluZWQsIHJldHVybiBkZWNpbWFsXG4gKiAzLiBmb3JtYXQgd2l0aCBwcmVjaXNpb25cbiAqICAgIEkuIGlmIG1heCA+IDAsIHJvdW5kIGRvd24gd2l0aCBwcmVjaXNpb24uIEV4YW1wbGU6IG1heD0gMy41LCBwcmVjaXNpb249MCAgYWZ0ZXJGb3JtYXQ6IDNcbiAqICAgIElJLiBpZiBtYXggPCAwLCByb3VuZCB1cCB3aXRoIHByZWNpc2lvbi4gRXhhbXBsZTogbWF4PSAtMy41LCBwcmVjaXNpb249MCAgYWZ0ZXJGb3JtYXQ6IC00XG4gKiAgICBJSUkuIGlmIG1pbiA+IDAsIHJvdW5kIHVwIHdpdGggcHJlY2lzaW9uLiBFeGFtcGxlOiBtaW49IDMuNSwgcHJlY2lzaW9uPTAgIGFmdGVyRm9ybWF0OiA0XG4gKiAgICBJVi4gaWYgbWluIDwgMCwgcm91bmQgZG93biB3aXRoIHByZWNpc2lvbi4gRXhhbXBsZTogbWF4PSAtMy41LCBwcmVjaXNpb249MCAgYWZ0ZXJGb3JtYXQ6IC0zXG4gKi9cbnZhciBnZXREZWNpbWFsVmFsdWUgPSBmdW5jdGlvbiBnZXREZWNpbWFsVmFsdWUoc3RyaW5nTW9kZSwgZGVjaW1hbFZhbHVlKSB7XG4gIGlmIChzdHJpbmdNb2RlIHx8IGRlY2ltYWxWYWx1ZS5pc0VtcHR5KCkpIHtcbiAgICByZXR1cm4gZGVjaW1hbFZhbHVlLnRvU3RyaW5nKCk7XG4gIH1cbiAgcmV0dXJuIGRlY2ltYWxWYWx1ZS50b051bWJlcigpO1xufTtcbnZhciBnZXREZWNpbWFsSWZWYWxpZGF0ZSA9IGZ1bmN0aW9uIGdldERlY2ltYWxJZlZhbGlkYXRlKHZhbHVlKSB7XG4gIHZhciBkZWNpbWFsID0gZ2V0TWluaURlY2ltYWwodmFsdWUpO1xuICByZXR1cm4gZGVjaW1hbC5pc0ludmFsaWRhdGUoKSA/IG51bGwgOiBkZWNpbWFsO1xufTtcbnZhciBJbnRlcm5hbElucHV0TnVtYmVyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICBtaW4gPSBwcm9wcy5taW4sXG4gICAgbWF4ID0gcHJvcHMubWF4LFxuICAgIF9wcm9wcyRzdGVwID0gcHJvcHMuc3RlcCxcbiAgICBzdGVwID0gX3Byb3BzJHN0ZXAgPT09IHZvaWQgMCA/IDEgOiBfcHJvcHMkc3RlcCxcbiAgICBkZWZhdWx0VmFsdWUgPSBwcm9wcy5kZWZhdWx0VmFsdWUsXG4gICAgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICBkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkLFxuICAgIHJlYWRPbmx5ID0gcHJvcHMucmVhZE9ubHksXG4gICAgdXBIYW5kbGVyID0gcHJvcHMudXBIYW5kbGVyLFxuICAgIGRvd25IYW5kbGVyID0gcHJvcHMuZG93bkhhbmRsZXIsXG4gICAga2V5Ym9hcmQgPSBwcm9wcy5rZXlib2FyZCxcbiAgICBfcHJvcHMkY2hhbmdlT25XaGVlbCA9IHByb3BzLmNoYW5nZU9uV2hlZWwsXG4gICAgY2hhbmdlT25XaGVlbCA9IF9wcm9wcyRjaGFuZ2VPbldoZWVsID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRjaGFuZ2VPbldoZWVsLFxuICAgIF9wcm9wcyRjb250cm9scyA9IHByb3BzLmNvbnRyb2xzLFxuICAgIGNvbnRyb2xzID0gX3Byb3BzJGNvbnRyb2xzID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJGNvbnRyb2xzLFxuICAgIGNsYXNzTmFtZXMgPSBwcm9wcy5jbGFzc05hbWVzLFxuICAgIHN0cmluZ01vZGUgPSBwcm9wcy5zdHJpbmdNb2RlLFxuICAgIHBhcnNlciA9IHByb3BzLnBhcnNlcixcbiAgICBmb3JtYXR0ZXIgPSBwcm9wcy5mb3JtYXR0ZXIsXG4gICAgcHJlY2lzaW9uID0gcHJvcHMucHJlY2lzaW9uLFxuICAgIGRlY2ltYWxTZXBhcmF0b3IgPSBwcm9wcy5kZWNpbWFsU2VwYXJhdG9yLFxuICAgIG9uQ2hhbmdlID0gcHJvcHMub25DaGFuZ2UsXG4gICAgb25JbnB1dCA9IHByb3BzLm9uSW5wdXQsXG4gICAgb25QcmVzc0VudGVyID0gcHJvcHMub25QcmVzc0VudGVyLFxuICAgIG9uU3RlcCA9IHByb3BzLm9uU3RlcCxcbiAgICBfcHJvcHMkY2hhbmdlT25CbHVyID0gcHJvcHMuY2hhbmdlT25CbHVyLFxuICAgIGNoYW5nZU9uQmx1ciA9IF9wcm9wcyRjaGFuZ2VPbkJsdXIgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkY2hhbmdlT25CbHVyLFxuICAgIGRvbVJlZiA9IHByb3BzLmRvbVJlZixcbiAgICBpbnB1dFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBfZXhjbHVkZWQpO1xuICB2YXIgaW5wdXRDbGFzc05hbWUgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWlucHV0XCIpO1xuICB2YXIgaW5wdXRSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShmYWxzZSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgZm9jdXMgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldEZvY3VzID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIHVzZXJUeXBpbmdSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICB2YXIgY29tcG9zaXRpb25SZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICB2YXIgc2hpZnRLZXlSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gVmFsdWUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUmVhbCB2YWx1ZSBjb250cm9sXG4gIHZhciBfUmVhY3QkdXNlU3RhdGUzID0gUmVhY3QudXNlU3RhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGdldE1pbmlEZWNpbWFsKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDAgPyB2YWx1ZSA6IGRlZmF1bHRWYWx1ZSk7XG4gICAgfSksXG4gICAgX1JlYWN0JHVzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTMsIDIpLFxuICAgIGRlY2ltYWxWYWx1ZSA9IF9SZWFjdCR1c2VTdGF0ZTRbMF0sXG4gICAgc2V0RGVjaW1hbFZhbHVlID0gX1JlYWN0JHVzZVN0YXRlNFsxXTtcbiAgZnVuY3Rpb24gc2V0VW5jb250cm9sbGVkRGVjaW1hbFZhbHVlKG5ld0RlY2ltYWwpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgc2V0RGVjaW1hbFZhbHVlKG5ld0RlY2ltYWwpO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT0gUGFyc2VyICYgRm9ybWF0dGVyID09PT09PT09PT09PT09PT09PT09PT1cbiAgLyoqXG4gICAqIGBwcmVjaXNpb25gIGlzIHVzZWQgZm9yIGZvcm1hdHRlciAmIG9uQ2hhbmdlLlxuICAgKiBJdCB3aWxsIGF1dG8gZ2VuZXJhdGUgYnkgYHZhbHVlYCAmIGBzdGVwYC5cbiAgICogQnV0IGl0IHdpbGwgbm90IGJsb2NrIHVzZXIgdHlwaW5nLlxuICAgKlxuICAgKiBOb3RlOiBBdXRvIGdlbmVyYXRlIGBwcmVjaXNpb25gIGlzIHVzZWQgZm9yIGxlZ2FjeSBsb2dpYy5cbiAgICogV2Ugc2hvdWxkIHJlbW92ZSB0aGlzIHNpbmNlIHdlIGFscmVhZHkgc3VwcG9ydCBoaWdoIHByZWNpc2lvbiB3aXRoIEJpZ0ludC5cbiAgICpcbiAgICogQHBhcmFtIG51bWJlciAgUHJvdmlkZSB3aGljaCBudW1iZXIgc2hvdWxkIGNhbGN1bGF0ZSBwcmVjaXNpb25cbiAgICogQHBhcmFtIHVzZXJUeXBpbmcgIENoYW5nZSBieSB1c2VyIHR5cGluZ1xuICAgKi9cbiAgdmFyIGdldFByZWNpc2lvbiA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChudW1TdHIsIHVzZXJUeXBpbmcpIHtcbiAgICBpZiAodXNlclR5cGluZykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHByZWNpc2lvbiA+PSAwKSB7XG4gICAgICByZXR1cm4gcHJlY2lzaW9uO1xuICAgIH1cbiAgICByZXR1cm4gTWF0aC5tYXgoZ2V0TnVtYmVyUHJlY2lzaW9uKG51bVN0ciksIGdldE51bWJlclByZWNpc2lvbihzdGVwKSk7XG4gIH0sIFtwcmVjaXNpb24sIHN0ZXBdKTtcblxuICAvLyA+Pj4gUGFyc2VyXG4gIHZhciBtZXJnZWRQYXJzZXIgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAobnVtKSB7XG4gICAgdmFyIG51bVN0ciA9IFN0cmluZyhudW0pO1xuICAgIGlmIChwYXJzZXIpIHtcbiAgICAgIHJldHVybiBwYXJzZXIobnVtU3RyKTtcbiAgICB9XG4gICAgdmFyIHBhcnNlZFN0ciA9IG51bVN0cjtcbiAgICBpZiAoZGVjaW1hbFNlcGFyYXRvcikge1xuICAgICAgcGFyc2VkU3RyID0gcGFyc2VkU3RyLnJlcGxhY2UoZGVjaW1hbFNlcGFyYXRvciwgJy4nKTtcbiAgICB9XG5cbiAgICAvLyBbTGVnYWN5XSBXZSBzdGlsbCBzdXBwb3J0IGF1dG8gY29udmVydCBgJCAxMjMsNDU2YCB0byBgMTIzNDU2YFxuICAgIHJldHVybiBwYXJzZWRTdHIucmVwbGFjZSgvW15cXHcuLV0rL2csICcnKTtcbiAgfSwgW3BhcnNlciwgZGVjaW1hbFNlcGFyYXRvcl0pO1xuXG4gIC8vID4+PiBGb3JtYXR0ZXJcbiAgdmFyIGlucHV0VmFsdWVSZWYgPSBSZWFjdC51c2VSZWYoJycpO1xuICB2YXIgbWVyZ2VkRm9ybWF0dGVyID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKG51bWJlciwgdXNlclR5cGluZykge1xuICAgIGlmIChmb3JtYXR0ZXIpIHtcbiAgICAgIHJldHVybiBmb3JtYXR0ZXIobnVtYmVyLCB7XG4gICAgICAgIHVzZXJUeXBpbmc6IHVzZXJUeXBpbmcsXG4gICAgICAgIGlucHV0OiBTdHJpbmcoaW5wdXRWYWx1ZVJlZi5jdXJyZW50KVxuICAgICAgfSk7XG4gICAgfVxuICAgIHZhciBzdHIgPSB0eXBlb2YgbnVtYmVyID09PSAnbnVtYmVyJyA/IG51bTJzdHIobnVtYmVyKSA6IG51bWJlcjtcblxuICAgIC8vIFVzZXIgdHlwaW5nIHdpbGwgbm90IGF1dG8gZm9ybWF0IHdpdGggcHJlY2lzaW9uIGRpcmVjdGx5XG4gICAgaWYgKCF1c2VyVHlwaW5nKSB7XG4gICAgICB2YXIgbWVyZ2VkUHJlY2lzaW9uID0gZ2V0UHJlY2lzaW9uKHN0ciwgdXNlclR5cGluZyk7XG4gICAgICBpZiAodmFsaWRhdGVOdW1iZXIoc3RyKSAmJiAoZGVjaW1hbFNlcGFyYXRvciB8fCBtZXJnZWRQcmVjaXNpb24gPj0gMCkpIHtcbiAgICAgICAgLy8gU2VwYXJhdG9yXG4gICAgICAgIHZhciBzZXBhcmF0b3JTdHIgPSBkZWNpbWFsU2VwYXJhdG9yIHx8ICcuJztcbiAgICAgICAgc3RyID0gdG9GaXhlZChzdHIsIHNlcGFyYXRvclN0ciwgbWVyZ2VkUHJlY2lzaW9uKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbiAgfSwgW2Zvcm1hdHRlciwgZ2V0UHJlY2lzaW9uLCBkZWNpbWFsU2VwYXJhdG9yXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gSW5wdXRWYWx1ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvKipcbiAgICogSW5wdXQgdGV4dCB2YWx1ZSBjb250cm9sXG4gICAqXG4gICAqIFVzZXIgY2FuIG5vdCB1cGRhdGUgaW5wdXQgY29udGVudCBkaXJlY3RseS4gSXQgdXBkYXRlcyB3aXRoIGZvbGxvdyBydWxlcyBieSBwcmlvcml0eTpcbiAgICogIDEuIGNvbnRyb2xsZWQgYHZhbHVlYCBjaGFuZ2VkXG4gICAqICAgICogW1NQRUNJQUxdIFR5cGluZyBsaWtlIGAxLmAgc2hvdWxkIG5vdCBpbW1lZGlhdGVseSBjb252ZXJ0IHRvIGAxYFxuICAgKiAgMi4gVXNlciB0eXBpbmcgd2l0aCBmb3JtYXQgKG5vdCBwcmVjaXNpb24pXG4gICAqICAzLiBCbHVyIG9yIEVudGVyIHRyaWdnZXIgcmV2YWxpZGF0ZVxuICAgKi9cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTUgPSBSZWFjdC51c2VTdGF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgaW5pdFZhbHVlID0gZGVmYXVsdFZhbHVlICE9PSBudWxsICYmIGRlZmF1bHRWYWx1ZSAhPT0gdm9pZCAwID8gZGVmYXVsdFZhbHVlIDogdmFsdWU7XG4gICAgICBpZiAoZGVjaW1hbFZhbHVlLmlzSW52YWxpZGF0ZSgpICYmIFsnc3RyaW5nJywgJ251bWJlciddLmluY2x1ZGVzKF90eXBlb2YoaW5pdFZhbHVlKSkpIHtcbiAgICAgICAgcmV0dXJuIE51bWJlci5pc05hTihpbml0VmFsdWUpID8gJycgOiBpbml0VmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gbWVyZ2VkRm9ybWF0dGVyKGRlY2ltYWxWYWx1ZS50b1N0cmluZygpLCBmYWxzZSk7XG4gICAgfSksXG4gICAgX1JlYWN0JHVzZVN0YXRlNiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTUsIDIpLFxuICAgIGlucHV0VmFsdWUgPSBfUmVhY3QkdXNlU3RhdGU2WzBdLFxuICAgIHNldEludGVybmFsSW5wdXRWYWx1ZSA9IF9SZWFjdCR1c2VTdGF0ZTZbMV07XG4gIGlucHV0VmFsdWVSZWYuY3VycmVudCA9IGlucHV0VmFsdWU7XG5cbiAgLy8gU2hvdWxkIGFsd2F5cyBiZSBzdHJpbmdcbiAgZnVuY3Rpb24gc2V0SW5wdXRWYWx1ZShuZXdWYWx1ZSwgdXNlclR5cGluZykge1xuICAgIHNldEludGVybmFsSW5wdXRWYWx1ZShtZXJnZWRGb3JtYXR0ZXIoXG4gICAgLy8gSW52YWxpZGF0ZSBudW1iZXIgaXMgc29tZXRpbWUgcGFzc2VkIGJ5IGV4dGVybmFsIGNvbnRyb2wsIHdlIHNob3VsZCBsZXQgaXQgZ29cbiAgICAvLyBPdGhlcndpc2UgaXMgY29udHJvbGxlZCBieSBpbnRlcm5hbCBpbnRlcmFjdGl2ZSBsb2dpYyB3aGljaCBjaGVjayBieSB1c2VyVHlwaW5nXG4gICAgLy8gWW91IGNhbiByZWYgJ3Nob3cgbGltaXRlZCB2YWx1ZSB3aGVuIGlucHV0IGlzIG5vdCBmb2N1c2VkJyB0ZXN0IGZvciBtb3JlIGluZm8uXG4gICAgbmV3VmFsdWUuaXNJbnZhbGlkYXRlKCkgPyBuZXdWYWx1ZS50b1N0cmluZyhmYWxzZSkgOiBuZXdWYWx1ZS50b1N0cmluZyghdXNlclR5cGluZyksIHVzZXJUeXBpbmcpKTtcbiAgfVxuXG4gIC8vID4+PiBNYXggJiBNaW4gbGltaXRcbiAgdmFyIG1heERlY2ltYWwgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZ2V0RGVjaW1hbElmVmFsaWRhdGUobWF4KTtcbiAgfSwgW21heCwgcHJlY2lzaW9uXSk7XG4gIHZhciBtaW5EZWNpbWFsID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGdldERlY2ltYWxJZlZhbGlkYXRlKG1pbik7XG4gIH0sIFttaW4sIHByZWNpc2lvbl0pO1xuICB2YXIgdXBEaXNhYmxlZCA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGlmICghbWF4RGVjaW1hbCB8fCAhZGVjaW1hbFZhbHVlIHx8IGRlY2ltYWxWYWx1ZS5pc0ludmFsaWRhdGUoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gbWF4RGVjaW1hbC5sZXNzRXF1YWxzKGRlY2ltYWxWYWx1ZSk7XG4gIH0sIFttYXhEZWNpbWFsLCBkZWNpbWFsVmFsdWVdKTtcbiAgdmFyIGRvd25EaXNhYmxlZCA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGlmICghbWluRGVjaW1hbCB8fCAhZGVjaW1hbFZhbHVlIHx8IGRlY2ltYWxWYWx1ZS5pc0ludmFsaWRhdGUoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gZGVjaW1hbFZhbHVlLmxlc3NFcXVhbHMobWluRGVjaW1hbCk7XG4gIH0sIFttaW5EZWNpbWFsLCBkZWNpbWFsVmFsdWVdKTtcblxuICAvLyBDdXJzb3IgY29udHJvbGxlclxuICB2YXIgX3VzZUN1cnNvciA9IHVzZUN1cnNvcihpbnB1dFJlZi5jdXJyZW50LCBmb2N1cyksXG4gICAgX3VzZUN1cnNvcjIgPSBfc2xpY2VkVG9BcnJheShfdXNlQ3Vyc29yLCAyKSxcbiAgICByZWNvcmRDdXJzb3IgPSBfdXNlQ3Vyc29yMlswXSxcbiAgICByZXN0b3JlQ3Vyc29yID0gX3VzZUN1cnNvcjJbMV07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRGF0YSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvKipcbiAgICogRmluZCB0YXJnZXQgdmFsdWUgY2xvc2V0IHdpdGhpbiByYW5nZS5cbiAgICogZS5nLiBbMTEsIDI4XTpcbiAgICogICAgMyAgPT4gMTFcbiAgICogICAgMjMgPT4gMjNcbiAgICogICAgOTkgPT4gMjhcbiAgICovXG4gIHZhciBnZXRSYW5nZVZhbHVlID0gZnVuY3Rpb24gZ2V0UmFuZ2VWYWx1ZSh0YXJnZXQpIHtcbiAgICAvLyB0YXJnZXQgPiBtYXhcbiAgICBpZiAobWF4RGVjaW1hbCAmJiAhdGFyZ2V0Lmxlc3NFcXVhbHMobWF4RGVjaW1hbCkpIHtcbiAgICAgIHJldHVybiBtYXhEZWNpbWFsO1xuICAgIH1cblxuICAgIC8vIHRhcmdldCA8IG1pblxuICAgIGlmIChtaW5EZWNpbWFsICYmICFtaW5EZWNpbWFsLmxlc3NFcXVhbHModGFyZ2V0KSkge1xuICAgICAgcmV0dXJuIG1pbkRlY2ltYWw7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDaGVjayB2YWx1ZSBpcyBpbiBbbWluLCBtYXhdIHJhbmdlXG4gICAqL1xuICB2YXIgaXNJblJhbmdlID0gZnVuY3Rpb24gaXNJblJhbmdlKHRhcmdldCkge1xuICAgIHJldHVybiAhZ2V0UmFuZ2VWYWx1ZSh0YXJnZXQpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBUcmlnZ2VyIGBvbkNoYW5nZWAgaWYgdmFsdWUgdmFsaWRhdGVkIGFuZCBub3QgZXF1YWxzIG9mIG9yaWdpbi5cbiAgICogUmV0dXJuIHRoZSB2YWx1ZSB0aGF0IHJlLWFsaWduIGluIHJhbmdlLlxuICAgKi9cbiAgdmFyIHRyaWdnZXJWYWx1ZVVwZGF0ZSA9IGZ1bmN0aW9uIHRyaWdnZXJWYWx1ZVVwZGF0ZShuZXdWYWx1ZSwgdXNlclR5cGluZykge1xuICAgIHZhciB1cGRhdGVWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgIHZhciBpc1JhbmdlVmFsaWRhdGUgPSBpc0luUmFuZ2UodXBkYXRlVmFsdWUpIHx8IHVwZGF0ZVZhbHVlLmlzRW1wdHkoKTtcblxuICAgIC8vIFNraXAgYWxpZ24gdmFsdWUgd2hlbiB0cmlnZ2VyIHZhbHVlIGlzIGVtcHR5LlxuICAgIC8vIFdlIGp1c3QgdHJpZ2dlciBvbkNoYW5nZShudWxsKVxuICAgIC8vIFRoaXMgc2hvdWxkIG5vdCBibG9jayB1c2VyIHR5cGluZ1xuICAgIGlmICghdXBkYXRlVmFsdWUuaXNFbXB0eSgpICYmICF1c2VyVHlwaW5nKSB7XG4gICAgICAvLyBSZXZlcnQgdmFsdWUgaW4gcmFuZ2UgaWYgbmVlZGVkXG4gICAgICB1cGRhdGVWYWx1ZSA9IGdldFJhbmdlVmFsdWUodXBkYXRlVmFsdWUpIHx8IHVwZGF0ZVZhbHVlO1xuICAgICAgaXNSYW5nZVZhbGlkYXRlID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCFyZWFkT25seSAmJiAhZGlzYWJsZWQgJiYgaXNSYW5nZVZhbGlkYXRlKSB7XG4gICAgICB2YXIgbnVtU3RyID0gdXBkYXRlVmFsdWUudG9TdHJpbmcoKTtcbiAgICAgIHZhciBtZXJnZWRQcmVjaXNpb24gPSBnZXRQcmVjaXNpb24obnVtU3RyLCB1c2VyVHlwaW5nKTtcbiAgICAgIGlmIChtZXJnZWRQcmVjaXNpb24gPj0gMCkge1xuICAgICAgICB1cGRhdGVWYWx1ZSA9IGdldE1pbmlEZWNpbWFsKHRvRml4ZWQobnVtU3RyLCAnLicsIG1lcmdlZFByZWNpc2lvbikpO1xuXG4gICAgICAgIC8vIFdoZW4gdG8gZml4ZWQuIFRoZSB2YWx1ZSBtYXkgb3V0IG9mIG1pbiAmIG1heCByYW5nZS5cbiAgICAgICAgLy8gNCBpbiBbMCwgMy44XSA9PiAzLjggPT4gNCAodG9GaXhlZClcbiAgICAgICAgaWYgKCFpc0luUmFuZ2UodXBkYXRlVmFsdWUpKSB7XG4gICAgICAgICAgdXBkYXRlVmFsdWUgPSBnZXRNaW5pRGVjaW1hbCh0b0ZpeGVkKG51bVN0ciwgJy4nLCBtZXJnZWRQcmVjaXNpb24sIHRydWUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUcmlnZ2VyIGV2ZW50XG4gICAgICBpZiAoIXVwZGF0ZVZhbHVlLmVxdWFscyhkZWNpbWFsVmFsdWUpKSB7XG4gICAgICAgIHNldFVuY29udHJvbGxlZERlY2ltYWxWYWx1ZSh1cGRhdGVWYWx1ZSk7XG4gICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgfHwgb25DaGFuZ2UodXBkYXRlVmFsdWUuaXNFbXB0eSgpID8gbnVsbCA6IGdldERlY2ltYWxWYWx1ZShzdHJpbmdNb2RlLCB1cGRhdGVWYWx1ZSkpO1xuXG4gICAgICAgIC8vIFJlZm9ybWF0IGlucHV0IGlmIHZhbHVlIGlzIG5vdCBjb250cm9sbGVkXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgc2V0SW5wdXRWYWx1ZSh1cGRhdGVWYWx1ZSwgdXNlclR5cGluZyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB1cGRhdGVWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGRlY2ltYWxWYWx1ZTtcbiAgfTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBVc2VyIElucHV0ID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBvbk5leHRQcm9taXNlID0gdXNlRnJhbWUoKTtcblxuICAvLyA+Pj4gQ29sbGVjdCBpbnB1dCB2YWx1ZVxuICB2YXIgY29sbGVjdElucHV0VmFsdWUgPSBmdW5jdGlvbiBjb2xsZWN0SW5wdXRWYWx1ZShpbnB1dFN0cikge1xuICAgIHJlY29yZEN1cnNvcigpO1xuXG4gICAgLy8gVXBkYXRlIGlucHV0VmFsdWUgaW4gY2FzZSBpbnB1dCBjYW4gbm90IHBhcnNlIGFzIG51bWJlclxuICAgIC8vIFJlZnJlc2ggcmVmIHZhbHVlIGltbWVkaWF0ZWx5IHNpbmNlIGl0IG1heSB1c2VkIGJ5IGZvcm1hdHRlclxuICAgIGlucHV0VmFsdWVSZWYuY3VycmVudCA9IGlucHV0U3RyO1xuICAgIHNldEludGVybmFsSW5wdXRWYWx1ZShpbnB1dFN0cik7XG5cbiAgICAvLyBQYXJzZSBudW1iZXJcbiAgICBpZiAoIWNvbXBvc2l0aW9uUmVmLmN1cnJlbnQpIHtcbiAgICAgIHZhciBmaW5hbFZhbHVlID0gbWVyZ2VkUGFyc2VyKGlucHV0U3RyKTtcbiAgICAgIHZhciBmaW5hbERlY2ltYWwgPSBnZXRNaW5pRGVjaW1hbChmaW5hbFZhbHVlKTtcbiAgICAgIGlmICghZmluYWxEZWNpbWFsLmlzTmFOKCkpIHtcbiAgICAgICAgdHJpZ2dlclZhbHVlVXBkYXRlKGZpbmFsRGVjaW1hbCwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVHJpZ2dlciBvbklucHV0IGxhdGVyIHRvIGxldCB1c2VyIGN1c3RvbWl6ZSB2YWx1ZSBpZiB0aGV5IHdhbnQgdG8gaGFuZGxlIHNvbWV0aGluZyBhZnRlciBvbkNoYW5nZVxuICAgIG9uSW5wdXQgPT09IG51bGwgfHwgb25JbnB1dCA9PT0gdm9pZCAwIHx8IG9uSW5wdXQoaW5wdXRTdHIpO1xuXG4gICAgLy8gb3B0aW1pemUgZm9yIGNoaW5lc2UgaW5wdXQgZXhwZXJpZW5jZVxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzgxOTZcbiAgICBvbk5leHRQcm9taXNlKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBuZXh0SW5wdXRTdHIgPSBpbnB1dFN0cjtcbiAgICAgIGlmICghcGFyc2VyKSB7XG4gICAgICAgIG5leHRJbnB1dFN0ciA9IGlucHV0U3RyLnJlcGxhY2UoL1x1MzAwMi9nLCAnLicpO1xuICAgICAgfVxuICAgICAgaWYgKG5leHRJbnB1dFN0ciAhPT0gaW5wdXRTdHIpIHtcbiAgICAgICAgY29sbGVjdElucHV0VmFsdWUobmV4dElucHV0U3RyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICAvLyA+Pj4gQ29tcG9zaXRpb25cbiAgdmFyIG9uQ29tcG9zaXRpb25TdGFydCA9IGZ1bmN0aW9uIG9uQ29tcG9zaXRpb25TdGFydCgpIHtcbiAgICBjb21wb3NpdGlvblJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgfTtcbiAgdmFyIG9uQ29tcG9zaXRpb25FbmQgPSBmdW5jdGlvbiBvbkNvbXBvc2l0aW9uRW5kKCkge1xuICAgIGNvbXBvc2l0aW9uUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICBjb2xsZWN0SW5wdXRWYWx1ZShpbnB1dFJlZi5jdXJyZW50LnZhbHVlKTtcbiAgfTtcblxuICAvLyA+Pj4gSW5wdXRcbiAgdmFyIG9uSW50ZXJuYWxJbnB1dCA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxJbnB1dChlKSB7XG4gICAgY29sbGVjdElucHV0VmFsdWUoZS50YXJnZXQudmFsdWUpO1xuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFN0ZXAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG9uSW50ZXJuYWxTdGVwID0gZnVuY3Rpb24gb25JbnRlcm5hbFN0ZXAodXApIHtcbiAgICB2YXIgX2lucHV0UmVmJGN1cnJlbnQ7XG4gICAgLy8gSWdub3JlIHN0ZXAgc2luY2Ugb3V0IG9mIHJhbmdlXG4gICAgaWYgKHVwICYmIHVwRGlzYWJsZWQgfHwgIXVwICYmIGRvd25EaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENsZWFyIHR5cGluZyBzdGF0dXMgc2luY2UgaXQgbWF5IGJlIGNhdXNlZCBieSB1cCAmIGRvd24ga2V5LlxuICAgIC8vIFdlIHNob3VsZCBzeW5jIHdpdGggaW5wdXQgdmFsdWUuXG4gICAgdXNlclR5cGluZ1JlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgdmFyIHN0ZXBEZWNpbWFsID0gZ2V0TWluaURlY2ltYWwoc2hpZnRLZXlSZWYuY3VycmVudCA/IGdldERlY3VwbGVTdGVwcyhzdGVwKSA6IHN0ZXApO1xuICAgIGlmICghdXApIHtcbiAgICAgIHN0ZXBEZWNpbWFsID0gc3RlcERlY2ltYWwubmVnYXRlKCk7XG4gICAgfVxuICAgIHZhciB0YXJnZXQgPSAoZGVjaW1hbFZhbHVlIHx8IGdldE1pbmlEZWNpbWFsKDApKS5hZGQoc3RlcERlY2ltYWwudG9TdHJpbmcoKSk7XG4gICAgdmFyIHVwZGF0ZWRWYWx1ZSA9IHRyaWdnZXJWYWx1ZVVwZGF0ZSh0YXJnZXQsIGZhbHNlKTtcbiAgICBvblN0ZXAgPT09IG51bGwgfHwgb25TdGVwID09PSB2b2lkIDAgfHwgb25TdGVwKGdldERlY2ltYWxWYWx1ZShzdHJpbmdNb2RlLCB1cGRhdGVkVmFsdWUpLCB7XG4gICAgICBvZmZzZXQ6IHNoaWZ0S2V5UmVmLmN1cnJlbnQgPyBnZXREZWN1cGxlU3RlcHMoc3RlcCkgOiBzdGVwLFxuICAgICAgdHlwZTogdXAgPyAndXAnIDogJ2Rvd24nXG4gICAgfSk7XG4gICAgKF9pbnB1dFJlZiRjdXJyZW50ID0gaW5wdXRSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2lucHV0UmVmJGN1cnJlbnQgPT09IHZvaWQgMCB8fCBfaW5wdXRSZWYkY3VycmVudC5mb2N1cygpO1xuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRmx1c2ggPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLyoqXG4gICAqIEZsdXNoIGN1cnJlbnQgaW5wdXQgY29udGVudCB0byB0cmlnZ2VyIHZhbHVlIGNoYW5nZSAmIHJlLWZvcm1hdHRlciBpbnB1dCBpZiBuZWVkZWQuXG4gICAqIFRoaXMgd2lsbCBhbHdheXMgZmx1c2ggaW5wdXQgdmFsdWUgZm9yIHVwZGF0ZS5cbiAgICogSWYgaXQncyBpbnZhbGlkYXRlLCB3aWxsIGZhbGxiYWNrIHRvIGxhc3QgdmFsaWRhdGUgdmFsdWUuXG4gICAqL1xuICB2YXIgZmx1c2hJbnB1dFZhbHVlID0gZnVuY3Rpb24gZmx1c2hJbnB1dFZhbHVlKHVzZXJUeXBpbmcpIHtcbiAgICB2YXIgcGFyc2VkVmFsdWUgPSBnZXRNaW5pRGVjaW1hbChtZXJnZWRQYXJzZXIoaW5wdXRWYWx1ZSkpO1xuICAgIHZhciBmb3JtYXRWYWx1ZTtcbiAgICBpZiAoIXBhcnNlZFZhbHVlLmlzTmFOKCkpIHtcbiAgICAgIC8vIE9ubHkgdmFsaWRhdGUgdmFsdWUgb3IgZW1wdHkgdmFsdWUgY2FuIGJlIHJlLWZpbGwgdG8gaW5wdXRWYWx1ZVxuICAgICAgLy8gUmVhc3NpZ24gdGhlIGZvcm1hdFZhbHVlIHdpdGhpbiByYW5nZWQgb2YgdHJpZ2dlciBjb250cm9sXG4gICAgICBmb3JtYXRWYWx1ZSA9IHRyaWdnZXJWYWx1ZVVwZGF0ZShwYXJzZWRWYWx1ZSwgdXNlclR5cGluZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvcm1hdFZhbHVlID0gdHJpZ2dlclZhbHVlVXBkYXRlKGRlY2ltYWxWYWx1ZSwgdXNlclR5cGluZyk7XG4gICAgfVxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBSZXNldCBiYWNrIHdpdGggY29udHJvbGxlZCB2YWx1ZSBmaXJzdFxuICAgICAgc2V0SW5wdXRWYWx1ZShkZWNpbWFsVmFsdWUsIGZhbHNlKTtcbiAgICB9IGVsc2UgaWYgKCFmb3JtYXRWYWx1ZS5pc05hTigpKSB7XG4gICAgICAvLyBSZXNldCBpbnB1dCBiYWNrIHNpbmNlIG5vIHZhbGlkYXRlIHZhbHVlXG4gICAgICBzZXRJbnB1dFZhbHVlKGZvcm1hdFZhbHVlLCBmYWxzZSk7XG4gICAgfVxuICB9O1xuXG4gIC8vIFNvbHZlIHRoZSBpc3N1ZSBvZiB0aGUgZXZlbnQgdHJpZ2dlcmluZyBzZXF1ZW5jZSB3aGVuIGVudGVyaW5nIG51bWJlcnMgaW4gY2hpbmVzZSBpbnB1dCAoU2FmYXJpKVxuICB2YXIgb25CZWZvcmVJbnB1dCA9IGZ1bmN0aW9uIG9uQmVmb3JlSW5wdXQoKSB7XG4gICAgdXNlclR5cGluZ1JlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgfTtcbiAgdmFyIG9uS2V5RG93biA9IGZ1bmN0aW9uIG9uS2V5RG93bihldmVudCkge1xuICAgIHZhciBrZXkgPSBldmVudC5rZXksXG4gICAgICBzaGlmdEtleSA9IGV2ZW50LnNoaWZ0S2V5O1xuICAgIHVzZXJUeXBpbmdSZWYuY3VycmVudCA9IHRydWU7XG4gICAgc2hpZnRLZXlSZWYuY3VycmVudCA9IHNoaWZ0S2V5O1xuICAgIGlmIChrZXkgPT09ICdFbnRlcicpIHtcbiAgICAgIGlmICghY29tcG9zaXRpb25SZWYuY3VycmVudCkge1xuICAgICAgICB1c2VyVHlwaW5nUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGZsdXNoSW5wdXRWYWx1ZShmYWxzZSk7XG4gICAgICBvblByZXNzRW50ZXIgPT09IG51bGwgfHwgb25QcmVzc0VudGVyID09PSB2b2lkIDAgfHwgb25QcmVzc0VudGVyKGV2ZW50KTtcbiAgICB9XG4gICAgaWYgKGtleWJvYXJkID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIERvIHN0ZXBcbiAgICBpZiAoIWNvbXBvc2l0aW9uUmVmLmN1cnJlbnQgJiYgWydVcCcsICdBcnJvd1VwJywgJ0Rvd24nLCAnQXJyb3dEb3duJ10uaW5jbHVkZXMoa2V5KSkge1xuICAgICAgb25JbnRlcm5hbFN0ZXAoa2V5ID09PSAnVXAnIHx8IGtleSA9PT0gJ0Fycm93VXAnKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9O1xuICB2YXIgb25LZXlVcCA9IGZ1bmN0aW9uIG9uS2V5VXAoKSB7XG4gICAgdXNlclR5cGluZ1JlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgc2hpZnRLZXlSZWYuY3VycmVudCA9IGZhbHNlO1xuICB9O1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChjaGFuZ2VPbldoZWVsICYmIGZvY3VzKSB7XG4gICAgICB2YXIgb25XaGVlbCA9IGZ1bmN0aW9uIG9uV2hlZWwoZXZlbnQpIHtcbiAgICAgICAgLy8gbW92aW5nIG1vdXNlIHdoZWVsIHJpc2VzIHdoZWVsIGV2ZW50IHdpdGggZGVsdGFZIDwgMFxuICAgICAgICAvLyBzY3JvbGwgdmFsdWUgZ3Jvd3MgZnJvbSB0b3AgdG8gYm90dG9tLCBhcyBzY3JlZW4gWSBjb29yZGluYXRlXG4gICAgICAgIG9uSW50ZXJuYWxTdGVwKGV2ZW50LmRlbHRhWSA8IDApO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfTtcbiAgICAgIHZhciBpbnB1dCA9IGlucHV0UmVmLmN1cnJlbnQ7XG4gICAgICBpZiAoaW5wdXQpIHtcbiAgICAgICAgLy8gUmVhY3Qgb25XaGVlbCBpcyBwYXNzaXZlIGFuZCB3ZSBjYW4ndCBwcmV2ZW50RGVmYXVsdCgpIGluIGl0LlxuICAgICAgICAvLyBUaGF0J3Mgd2h5IHdlIHNob3VsZCBzdWJzY3JpYmUgd2l0aCBET00gbGlzdGVuZXJcbiAgICAgICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNjM2NjMwMjUvcmVhY3Qtb253aGVlbC1oYW5kbGVyLWNhbnQtcHJldmVudGRlZmF1bHQtYmVjYXVzZS1pdHMtYS1wYXNzaXZlLWV2ZW50LWxpc3RlbmV2XG4gICAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgb25XaGVlbCwge1xuICAgICAgICAgIHBhc3NpdmU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBpbnB1dC5yZW1vdmVFdmVudExpc3RlbmVyKCd3aGVlbCcsIG9uV2hlZWwpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgLy8gPj4+IEZvY3VzICYgQmx1clxuICB2YXIgb25CbHVyID0gZnVuY3Rpb24gb25CbHVyKCkge1xuICAgIGlmIChjaGFuZ2VPbkJsdXIpIHtcbiAgICAgIGZsdXNoSW5wdXRWYWx1ZShmYWxzZSk7XG4gICAgfVxuICAgIHNldEZvY3VzKGZhbHNlKTtcbiAgICB1c2VyVHlwaW5nUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgfTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBDb250cm9sbGVkID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIElucHV0IGJ5IHByZWNpc2lvbiAmIGZvcm1hdHRlclxuICB1c2VMYXlvdXRVcGRhdGVFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICghZGVjaW1hbFZhbHVlLmlzSW52YWxpZGF0ZSgpKSB7XG4gICAgICBzZXRJbnB1dFZhbHVlKGRlY2ltYWxWYWx1ZSwgZmFsc2UpO1xuICAgIH1cbiAgfSwgW3ByZWNpc2lvbiwgZm9ybWF0dGVyXSk7XG5cbiAgLy8gSW5wdXQgYnkgdmFsdWVcbiAgdXNlTGF5b3V0VXBkYXRlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbmV3VmFsdWUgPSBnZXRNaW5pRGVjaW1hbCh2YWx1ZSk7XG4gICAgc2V0RGVjaW1hbFZhbHVlKG5ld1ZhbHVlKTtcbiAgICB2YXIgY3VycmVudFBhcnNlZFZhbHVlID0gZ2V0TWluaURlY2ltYWwobWVyZ2VkUGFyc2VyKGlucHV0VmFsdWUpKTtcblxuICAgIC8vIFdoZW4gdXNlciB0eXBpbmcgZnJvbSBgMS4yYCB0byBgMS5gLCB3ZSBzaG91bGQgbm90IGNvbnZlcnQgdG8gYDFgIGltbWVkaWF0ZWx5LlxuICAgIC8vIEJ1dCBsZXQgaXQgZ28gaWYgdXNlciBzZXQgYGZvcm1hdHRlcmBcbiAgICBpZiAoIW5ld1ZhbHVlLmVxdWFscyhjdXJyZW50UGFyc2VkVmFsdWUpIHx8ICF1c2VyVHlwaW5nUmVmLmN1cnJlbnQgfHwgZm9ybWF0dGVyKSB7XG4gICAgICAvLyBVcGRhdGUgdmFsdWUgYXMgZWZmZWN0XG4gICAgICBzZXRJbnB1dFZhbHVlKG5ld1ZhbHVlLCB1c2VyVHlwaW5nUmVmLmN1cnJlbnQpO1xuICAgIH1cbiAgfSwgW3ZhbHVlXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDdXJzb3IgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB1c2VMYXlvdXRVcGRhdGVFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChmb3JtYXR0ZXIpIHtcbiAgICAgIHJlc3RvcmVDdXJzb3IoKTtcbiAgICB9XG4gIH0sIFtpbnB1dFZhbHVlXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHJlZjogZG9tUmVmLFxuICAgIGNsYXNzTmFtZTogY2xzeChwcmVmaXhDbHMsIGNsYXNzTmFtZSwgX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1mb2N1c2VkXCIpLCBmb2N1cyksIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZGlzYWJsZWRcIiksIGRpc2FibGVkKSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1yZWFkb25seVwiKSwgcmVhZE9ubHkpLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW5vdC1hLW51bWJlclwiKSwgZGVjaW1hbFZhbHVlLmlzTmFOKCkpLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW91dC1vZi1yYW5nZVwiKSwgIWRlY2ltYWxWYWx1ZS5pc0ludmFsaWRhdGUoKSAmJiAhaXNJblJhbmdlKGRlY2ltYWxWYWx1ZSkpKSxcbiAgICBzdHlsZTogc3R5bGUsXG4gICAgb25Gb2N1czogZnVuY3Rpb24gb25Gb2N1cygpIHtcbiAgICAgIHNldEZvY3VzKHRydWUpO1xuICAgIH0sXG4gICAgb25CbHVyOiBvbkJsdXIsXG4gICAgb25LZXlEb3duOiBvbktleURvd24sXG4gICAgb25LZXlVcDogb25LZXlVcCxcbiAgICBvbkNvbXBvc2l0aW9uU3RhcnQ6IG9uQ29tcG9zaXRpb25TdGFydCxcbiAgICBvbkNvbXBvc2l0aW9uRW5kOiBvbkNvbXBvc2l0aW9uRW5kLFxuICAgIG9uQmVmb3JlSW5wdXQ6IG9uQmVmb3JlSW5wdXRcbiAgfSwgY29udHJvbHMgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU3RlcEhhbmRsZXIsIHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICB1cE5vZGU6IHVwSGFuZGxlcixcbiAgICBkb3duTm9kZTogZG93bkhhbmRsZXIsXG4gICAgdXBEaXNhYmxlZDogdXBEaXNhYmxlZCxcbiAgICBkb3duRGlzYWJsZWQ6IGRvd25EaXNhYmxlZCxcbiAgICBvblN0ZXA6IG9uSW50ZXJuYWxTdGVwXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChpbnB1dENsYXNzTmFtZSwgXCItd3JhcFwiKVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImlucHV0XCIsIF9leHRlbmRzKHtcbiAgICBhdXRvQ29tcGxldGU6IFwib2ZmXCIsXG4gICAgcm9sZTogXCJzcGluYnV0dG9uXCIsXG4gICAgXCJhcmlhLXZhbHVlbWluXCI6IG1pbixcbiAgICBcImFyaWEtdmFsdWVtYXhcIjogbWF4LFxuICAgIFwiYXJpYS12YWx1ZW5vd1wiOiBkZWNpbWFsVmFsdWUuaXNJbnZhbGlkYXRlKCkgPyBudWxsIDogZGVjaW1hbFZhbHVlLnRvU3RyaW5nKCksXG4gICAgc3RlcDogc3RlcFxuICB9LCBpbnB1dFByb3BzLCB7XG4gICAgcmVmOiBjb21wb3NlUmVmKGlucHV0UmVmLCByZWYpLFxuICAgIGNsYXNzTmFtZTogaW5wdXRDbGFzc05hbWUsXG4gICAgdmFsdWU6IGlucHV0VmFsdWUsXG4gICAgb25DaGFuZ2U6IG9uSW50ZXJuYWxJbnB1dCxcbiAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgcmVhZE9ubHk6IHJlYWRPbmx5XG4gIH0pKSkpO1xufSk7XG52YXIgSW5wdXROdW1iZXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICB2YXIgZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgIF9wcm9wcyRwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgcHJlZml4Q2xzID0gX3Byb3BzJHByZWZpeENscyA9PT0gdm9pZCAwID8gJ3JjLWlucHV0LW51bWJlcicgOiBfcHJvcHMkcHJlZml4Q2xzLFxuICAgIHZhbHVlID0gcHJvcHMudmFsdWUsXG4gICAgcHJlZml4ID0gcHJvcHMucHJlZml4LFxuICAgIHN1ZmZpeCA9IHByb3BzLnN1ZmZpeCxcbiAgICBhZGRvbkJlZm9yZSA9IHByb3BzLmFkZG9uQmVmb3JlLFxuICAgIGFkZG9uQWZ0ZXIgPSBwcm9wcy5hZGRvbkFmdGVyLFxuICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBjbGFzc05hbWVzID0gcHJvcHMuY2xhc3NOYW1lcyxcbiAgICByZXN0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBfZXhjbHVkZWQyKTtcbiAgdmFyIGhvbGRlclJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIGlucHV0TnVtYmVyRG9tUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICB2YXIgaW5wdXRGb2N1c1JlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIGZvY3VzID0gZnVuY3Rpb24gZm9jdXMob3B0aW9uKSB7XG4gICAgaWYgKGlucHV0Rm9jdXNSZWYuY3VycmVudCkge1xuICAgICAgdHJpZ2dlckZvY3VzKGlucHV0Rm9jdXNSZWYuY3VycmVudCwgb3B0aW9uKTtcbiAgICB9XG4gIH07XG4gIFJlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHByb3h5T2JqZWN0KGlucHV0Rm9jdXNSZWYuY3VycmVudCwge1xuICAgICAgZm9jdXM6IGZvY3VzLFxuICAgICAgbmF0aXZlRWxlbWVudDogaG9sZGVyUmVmLmN1cnJlbnQubmF0aXZlRWxlbWVudCB8fCBpbnB1dE51bWJlckRvbVJlZi5jdXJyZW50XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQmFzZUlucHV0LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgdHJpZ2dlckZvY3VzOiBmb2N1cyxcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgIHN0eWxlOiBzdHlsZSxcbiAgICBwcmVmaXg6IHByZWZpeCxcbiAgICBzdWZmaXg6IHN1ZmZpeCxcbiAgICBhZGRvbkFmdGVyOiBhZGRvbkFmdGVyLFxuICAgIGFkZG9uQmVmb3JlOiBhZGRvbkJlZm9yZSxcbiAgICBjbGFzc05hbWVzOiBjbGFzc05hbWVzLFxuICAgIGNvbXBvbmVudHM6IHtcbiAgICAgIGFmZml4V3JhcHBlcjogJ2RpdicsXG4gICAgICBncm91cFdyYXBwZXI6ICdkaXYnLFxuICAgICAgd3JhcHBlcjogJ2RpdicsXG4gICAgICBncm91cEFkZG9uOiAnZGl2J1xuICAgIH0sXG4gICAgcmVmOiBob2xkZXJSZWZcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSW50ZXJuYWxJbnB1dE51bWJlciwgX2V4dGVuZHMoe1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICByZWY6IGlucHV0Rm9jdXNSZWYsXG4gICAgZG9tUmVmOiBpbnB1dE51bWJlckRvbVJlZixcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMgPT09IG51bGwgfHwgY2xhc3NOYW1lcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2xhc3NOYW1lcy5pbnB1dFxuICB9LCByZXN0KSkpO1xufSk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBJbnB1dE51bWJlci5kaXNwbGF5TmFtZSA9ICdJbnB1dE51bWJlcic7XG59XG5leHBvcnQgZGVmYXVsdCBJbnB1dE51bWJlcjsiLCAiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCBjbHN4IGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFJlYWN0LCB7IGNsb25lRWxlbWVudCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgaGFzQWRkb24sIGhhc1ByZWZpeFN1ZmZpeCB9IGZyb20gXCIuL3V0aWxzL2NvbW1vblV0aWxzXCI7XG52YXIgQmFzZUlucHV0ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIF9wcm9wcywgX3Byb3BzMiwgX3Byb3BzMztcbiAgdmFyIGlucHV0RWwgPSBwcm9wcy5pbnB1dEVsZW1lbnQsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgcHJlZml4ID0gcHJvcHMucHJlZml4LFxuICAgIHN1ZmZpeCA9IHByb3BzLnN1ZmZpeCxcbiAgICBhZGRvbkJlZm9yZSA9IHByb3BzLmFkZG9uQmVmb3JlLFxuICAgIGFkZG9uQWZ0ZXIgPSBwcm9wcy5hZGRvbkFmdGVyLFxuICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgIGRpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgcmVhZE9ubHkgPSBwcm9wcy5yZWFkT25seSxcbiAgICBmb2N1c2VkID0gcHJvcHMuZm9jdXNlZCxcbiAgICB0cmlnZ2VyRm9jdXMgPSBwcm9wcy50cmlnZ2VyRm9jdXMsXG4gICAgYWxsb3dDbGVhciA9IHByb3BzLmFsbG93Q2xlYXIsXG4gICAgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICBoYW5kbGVSZXNldCA9IHByb3BzLmhhbmRsZVJlc2V0LFxuICAgIGhpZGRlbiA9IHByb3BzLmhpZGRlbixcbiAgICBjbGFzc2VzID0gcHJvcHMuY2xhc3NlcyxcbiAgICBjbGFzc05hbWVzID0gcHJvcHMuY2xhc3NOYW1lcyxcbiAgICBkYXRhQXR0cnMgPSBwcm9wcy5kYXRhQXR0cnMsXG4gICAgc3R5bGVzID0gcHJvcHMuc3R5bGVzLFxuICAgIGNvbXBvbmVudHMgPSBwcm9wcy5jb21wb25lbnRzLFxuICAgIG9uQ2xlYXIgPSBwcm9wcy5vbkNsZWFyO1xuICB2YXIgaW5wdXRFbGVtZW50ID0gY2hpbGRyZW4gIT09IG51bGwgJiYgY2hpbGRyZW4gIT09IHZvaWQgMCA/IGNoaWxkcmVuIDogaW5wdXRFbDtcbiAgdmFyIEFmZml4V3JhcHBlckNvbXBvbmVudCA9IChjb21wb25lbnRzID09PSBudWxsIHx8IGNvbXBvbmVudHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbXBvbmVudHMuYWZmaXhXcmFwcGVyKSB8fCAnc3Bhbic7XG4gIHZhciBHcm91cFdyYXBwZXJDb21wb25lbnQgPSAoY29tcG9uZW50cyA9PT0gbnVsbCB8fCBjb21wb25lbnRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb21wb25lbnRzLmdyb3VwV3JhcHBlcikgfHwgJ3NwYW4nO1xuICB2YXIgV3JhcHBlckNvbXBvbmVudCA9IChjb21wb25lbnRzID09PSBudWxsIHx8IGNvbXBvbmVudHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbXBvbmVudHMud3JhcHBlcikgfHwgJ3NwYW4nO1xuICB2YXIgR3JvdXBBZGRvbkNvbXBvbmVudCA9IChjb21wb25lbnRzID09PSBudWxsIHx8IGNvbXBvbmVudHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbXBvbmVudHMuZ3JvdXBBZGRvbikgfHwgJ3NwYW4nO1xuICB2YXIgY29udGFpbmVyUmVmID0gdXNlUmVmKG51bGwpO1xuICB2YXIgb25JbnB1dENsaWNrID0gZnVuY3Rpb24gb25JbnB1dENsaWNrKGUpIHtcbiAgICB2YXIgX2NvbnRhaW5lclJlZiRjdXJyZW50O1xuICAgIGlmICgoX2NvbnRhaW5lclJlZiRjdXJyZW50ID0gY29udGFpbmVyUmVmLmN1cnJlbnQpICE9PSBudWxsICYmIF9jb250YWluZXJSZWYkY3VycmVudCAhPT0gdm9pZCAwICYmIF9jb250YWluZXJSZWYkY3VycmVudC5jb250YWlucyhlLnRhcmdldCkpIHtcbiAgICAgIHRyaWdnZXJGb2N1cyA9PT0gbnVsbCB8fCB0cmlnZ2VyRm9jdXMgPT09IHZvaWQgMCB8fCB0cmlnZ2VyRm9jdXMoKTtcbiAgICB9XG4gIH07XG4gIHZhciBoYXNBZmZpeCA9IGhhc1ByZWZpeFN1ZmZpeChwcm9wcyk7XG4gIHZhciBlbGVtZW50ID0gLyojX19QVVJFX18qL2Nsb25lRWxlbWVudChpbnB1dEVsZW1lbnQsIHtcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgY2xhc3NOYW1lOiBjbHN4KChfcHJvcHMgPSBpbnB1dEVsZW1lbnQucHJvcHMpID09PSBudWxsIHx8IF9wcm9wcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3Byb3BzLmNsYXNzTmFtZSwgIWhhc0FmZml4ICYmIChjbGFzc05hbWVzID09PSBudWxsIHx8IGNsYXNzTmFtZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNsYXNzTmFtZXMudmFyaWFudCkpIHx8IG51bGxcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IFJlZiA9PT09PT09PT09PT09PT09PT09PT09PT0gLy9cbiAgdmFyIGdyb3VwUmVmID0gdXNlUmVmKG51bGwpO1xuICBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBuYXRpdmVFbGVtZW50OiBncm91cFJlZi5jdXJyZW50IHx8IGNvbnRhaW5lclJlZi5jdXJyZW50XG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09IFByZWZpeCAmIFN1ZmZpeCA9PT09PT09PT09PT09PT09PT0gLy9cbiAgaWYgKGhhc0FmZml4KSB7XG4gICAgLy8gPT09PT09PT09PT09PT09PT09IENsZWFyIEljb24gPT09PT09PT09PT09PT09PT09IC8vXG4gICAgdmFyIGNsZWFySWNvbiA9IG51bGw7XG4gICAgaWYgKGFsbG93Q2xlYXIpIHtcbiAgICAgIHZhciBuZWVkQ2xlYXIgPSAhZGlzYWJsZWQgJiYgIXJlYWRPbmx5ICYmIHZhbHVlO1xuICAgICAgdmFyIGNsZWFySWNvbkNscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2xlYXItaWNvblwiKTtcbiAgICAgIHZhciBpY29uTm9kZSA9IF90eXBlb2YoYWxsb3dDbGVhcikgPT09ICdvYmplY3QnICYmIGFsbG93Q2xlYXIgIT09IG51bGwgJiYgYWxsb3dDbGVhciAhPT0gdm9pZCAwICYmIGFsbG93Q2xlYXIuY2xlYXJJY29uID8gYWxsb3dDbGVhci5jbGVhckljb24gOiAnXHUyNzE2JztcbiAgICAgIGNsZWFySWNvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgICAgdGFiSW5kZXg6IC0xLFxuICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKGV2ZW50KSB7XG4gICAgICAgICAgaGFuZGxlUmVzZXQgPT09IG51bGwgfHwgaGFuZGxlUmVzZXQgPT09IHZvaWQgMCB8fCBoYW5kbGVSZXNldChldmVudCk7XG4gICAgICAgICAgb25DbGVhciA9PT0gbnVsbCB8fCBvbkNsZWFyID09PSB2b2lkIDAgfHwgb25DbGVhcigpO1xuICAgICAgICB9XG4gICAgICAgIC8vIERvIG5vdCB0cmlnZ2VyIG9uQmx1ciB3aGVuIGNsZWFyIGlucHV0XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzMxMjAwXG4gICAgICAgICxcbiAgICAgICAgb25Nb3VzZURvd246IGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICAgICAgICByZXR1cm4gZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9LFxuICAgICAgICBjbGFzc05hbWU6IGNsc3goY2xlYXJJY29uQ2xzLCBfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChjbGVhckljb25DbHMsIFwiLWhpZGRlblwiKSwgIW5lZWRDbGVhciksIFwiXCIuY29uY2F0KGNsZWFySWNvbkNscywgXCItaGFzLXN1ZmZpeFwiKSwgISFzdWZmaXgpKVxuICAgICAgfSwgaWNvbk5vZGUpO1xuICAgIH1cbiAgICB2YXIgYWZmaXhXcmFwcGVyUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hZmZpeC13cmFwcGVyXCIpO1xuICAgIHZhciBhZmZpeFdyYXBwZXJDbHMgPSBjbHN4KGFmZml4V3JhcHBlclByZWZpeENscywgX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kaXNhYmxlZFwiKSwgZGlzYWJsZWQpLCBcIlwiLmNvbmNhdChhZmZpeFdyYXBwZXJQcmVmaXhDbHMsIFwiLWRpc2FibGVkXCIpLCBkaXNhYmxlZCksIFwiXCIuY29uY2F0KGFmZml4V3JhcHBlclByZWZpeENscywgXCItZm9jdXNlZFwiKSwgZm9jdXNlZCksIFwiXCIuY29uY2F0KGFmZml4V3JhcHBlclByZWZpeENscywgXCItcmVhZG9ubHlcIiksIHJlYWRPbmx5KSwgXCJcIi5jb25jYXQoYWZmaXhXcmFwcGVyUHJlZml4Q2xzLCBcIi1pbnB1dC13aXRoLWNsZWFyLWJ0blwiKSwgc3VmZml4ICYmIGFsbG93Q2xlYXIgJiYgdmFsdWUpLCBjbGFzc2VzID09PSBudWxsIHx8IGNsYXNzZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNsYXNzZXMuYWZmaXhXcmFwcGVyLCBjbGFzc05hbWVzID09PSBudWxsIHx8IGNsYXNzTmFtZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNsYXNzTmFtZXMuYWZmaXhXcmFwcGVyLCBjbGFzc05hbWVzID09PSBudWxsIHx8IGNsYXNzTmFtZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNsYXNzTmFtZXMudmFyaWFudCk7XG4gICAgdmFyIHN1ZmZpeE5vZGUgPSAoc3VmZml4IHx8IGFsbG93Q2xlYXIpICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IGNsc3goXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zdWZmaXhcIiksIGNsYXNzTmFtZXMgPT09IG51bGwgfHwgY2xhc3NOYW1lcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2xhc3NOYW1lcy5zdWZmaXgpLFxuICAgICAgc3R5bGU6IHN0eWxlcyA9PT0gbnVsbCB8fCBzdHlsZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0eWxlcy5zdWZmaXhcbiAgICB9LCBjbGVhckljb24sIHN1ZmZpeCk7XG4gICAgZWxlbWVudCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFmZml4V3JhcHBlckNvbXBvbmVudCwgX2V4dGVuZHMoe1xuICAgICAgY2xhc3NOYW1lOiBhZmZpeFdyYXBwZXJDbHMsXG4gICAgICBzdHlsZTogc3R5bGVzID09PSBudWxsIHx8IHN0eWxlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3R5bGVzLmFmZml4V3JhcHBlcixcbiAgICAgIG9uQ2xpY2s6IG9uSW5wdXRDbGlja1xuICAgIH0sIGRhdGFBdHRycyA9PT0gbnVsbCB8fCBkYXRhQXR0cnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRhdGFBdHRycy5hZmZpeFdyYXBwZXIsIHtcbiAgICAgIHJlZjogY29udGFpbmVyUmVmXG4gICAgfSksIHByZWZpeCAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBjbHN4KFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcHJlZml4XCIpLCBjbGFzc05hbWVzID09PSBudWxsIHx8IGNsYXNzTmFtZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNsYXNzTmFtZXMucHJlZml4KSxcbiAgICAgIHN0eWxlOiBzdHlsZXMgPT09IG51bGwgfHwgc3R5bGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdHlsZXMucHJlZml4XG4gICAgfSwgcHJlZml4KSwgZWxlbWVudCwgc3VmZml4Tm9kZSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT0gQWRkb24gPT09PT09PT09PT09PT09PT09IC8vXG4gIGlmIChoYXNBZGRvbihwcm9wcykpIHtcbiAgICB2YXIgd3JhcHBlckNscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZ3JvdXBcIik7XG4gICAgdmFyIGFkZG9uQ2xzID0gXCJcIi5jb25jYXQod3JhcHBlckNscywgXCItYWRkb25cIik7XG4gICAgdmFyIGdyb3VwV3JhcHBlckNscyA9IFwiXCIuY29uY2F0KHdyYXBwZXJDbHMsIFwiLXdyYXBwZXJcIik7XG4gICAgdmFyIG1lcmdlZFdyYXBwZXJDbGFzc05hbWUgPSBjbHN4KFwiXCIuY29uY2F0KHByZWZpeENscywgXCItd3JhcHBlclwiKSwgd3JhcHBlckNscywgY2xhc3NlcyA9PT0gbnVsbCB8fCBjbGFzc2VzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjbGFzc2VzLndyYXBwZXIsIGNsYXNzTmFtZXMgPT09IG51bGwgfHwgY2xhc3NOYW1lcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2xhc3NOYW1lcy53cmFwcGVyKTtcbiAgICB2YXIgbWVyZ2VkR3JvdXBDbGFzc05hbWUgPSBjbHN4KGdyb3VwV3JhcHBlckNscywgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChncm91cFdyYXBwZXJDbHMsIFwiLWRpc2FibGVkXCIpLCBkaXNhYmxlZCksIGNsYXNzZXMgPT09IG51bGwgfHwgY2xhc3NlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2xhc3Nlcy5ncm91cCwgY2xhc3NOYW1lcyA9PT0gbnVsbCB8fCBjbGFzc05hbWVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjbGFzc05hbWVzLmdyb3VwV3JhcHBlcik7XG5cbiAgICAvLyBOZWVkIGFub3RoZXIgd3JhcHBlciBmb3IgY2hhbmdpbmcgZGlzcGxheTp0YWJsZSB0byBkaXNwbGF5OmlubGluZS1ibG9ja1xuICAgIC8vIGFuZCBwdXQgc3R5bGUgcHJvcCBpbiB3cmFwcGVyXG4gICAgZWxlbWVudCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEdyb3VwV3JhcHBlckNvbXBvbmVudCwge1xuICAgICAgY2xhc3NOYW1lOiBtZXJnZWRHcm91cENsYXNzTmFtZSxcbiAgICAgIHJlZjogZ3JvdXBSZWZcbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChXcmFwcGVyQ29tcG9uZW50LCB7XG4gICAgICBjbGFzc05hbWU6IG1lcmdlZFdyYXBwZXJDbGFzc05hbWVcbiAgICB9LCBhZGRvbkJlZm9yZSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChHcm91cEFkZG9uQ29tcG9uZW50LCB7XG4gICAgICBjbGFzc05hbWU6IGFkZG9uQ2xzXG4gICAgfSwgYWRkb25CZWZvcmUpLCBlbGVtZW50LCBhZGRvbkFmdGVyICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEdyb3VwQWRkb25Db21wb25lbnQsIHtcbiAgICAgIGNsYXNzTmFtZTogYWRkb25DbHNcbiAgICB9LCBhZGRvbkFmdGVyKSkpO1xuICB9XG5cbiAgLy8gYGNsYXNzTmFtZWAgYW5kIGBzdHlsZWAgYXJlIGFsd2F5cyBvbiB0aGUgcm9vdCBlbGVtZW50XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICBjbGFzc05hbWU6IGNsc3goKF9wcm9wczIgPSBlbGVtZW50LnByb3BzKSA9PT0gbnVsbCB8fCBfcHJvcHMyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfcHJvcHMyLmNsYXNzTmFtZSwgY2xhc3NOYW1lKSB8fCBudWxsLFxuICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIChfcHJvcHMzID0gZWxlbWVudC5wcm9wcykgPT09IG51bGwgfHwgX3Byb3BzMyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3Byb3BzMy5zdHlsZSksIHN0eWxlKSxcbiAgICBoaWRkZW46IGhpZGRlblxuICB9KTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgQmFzZUlucHV0OyIsICJleHBvcnQgZnVuY3Rpb24gaGFzQWRkb24ocHJvcHMpIHtcbiAgcmV0dXJuICEhKHByb3BzLmFkZG9uQmVmb3JlIHx8IHByb3BzLmFkZG9uQWZ0ZXIpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGhhc1ByZWZpeFN1ZmZpeChwcm9wcykge1xuICByZXR1cm4gISEocHJvcHMucHJlZml4IHx8IHByb3BzLnN1ZmZpeCB8fCBwcm9wcy5hbGxvd0NsZWFyKTtcbn1cblxuLy8gVE9ETzogSXQncyBiZXR0ZXIgdG8gdXNlIGBQcm94eWAgcmVwbGFjZSB0aGUgYGVsZW1lbnQudmFsdWVgLiBCdXQgd2Ugc3RpbGwgbmVlZCBzdXBwb3J0IElFMTEuXG5mdW5jdGlvbiBjbG9uZUV2ZW50KGV2ZW50LCB0YXJnZXQsIHZhbHVlKSB7XG4gIC8vIEEgYnVnIHJlcG9ydCBmaWxlZCBvbiBXZWJLaXQncyBCdWd6aWxsYSB0cmFja2VyLCBkYXRpbmcgYmFjayB0byAyMDA5LCBzcGVjaWZpY2FsbHkgYWRkcmVzc2VzIHRoZSBpc3N1ZSBvZiBjbG9uZU5vZGUoKSBub3QgY29weWluZyBmaWxlcyBvZiA8aW5wdXQgdHlwZT1cImZpbGVcIj4gZWxlbWVudHMuXG4gIC8vIEFzIG9mIHRoZSBsYXN0IHVwZGF0ZSwgdGhpcyBidWcgd2FzIHN0aWxsIG1hcmtlZCBhcyBcIk5FVyxcIiBpbmRpY2F0aW5nIHRoYXQgaXQgbWlnaHQgbm90IGhhdmUgYmVlbiByZXNvbHZlZCB5ZXRcdTIwMEJcdTIwMEIuXG4gIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yODEyM1xuICB2YXIgY3VycmVudFRhcmdldCA9IHRhcmdldC5jbG9uZU5vZGUodHJ1ZSk7XG5cbiAgLy8gY2xpY2sgY2xlYXIgaWNvblxuICB2YXIgbmV3RXZlbnQgPSBPYmplY3QuY3JlYXRlKGV2ZW50LCB7XG4gICAgdGFyZ2V0OiB7XG4gICAgICB2YWx1ZTogY3VycmVudFRhcmdldFxuICAgIH0sXG4gICAgY3VycmVudFRhcmdldDoge1xuICAgICAgdmFsdWU6IGN1cnJlbnRUYXJnZXRcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEZpbGwgZGF0YVxuICBjdXJyZW50VGFyZ2V0LnZhbHVlID0gdmFsdWU7XG5cbiAgLy8gRmlsbCBzZWxlY3Rpb24uIFNvbWUgdHlwZSBsaWtlIGBlbWFpbGAgbm90IHN1cHBvcnQgc2VsZWN0aW9uXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzQ3ODMzXG4gIGlmICh0eXBlb2YgdGFyZ2V0LnNlbGVjdGlvblN0YXJ0ID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgdGFyZ2V0LnNlbGVjdGlvbkVuZCA9PT0gJ251bWJlcicpIHtcbiAgICBjdXJyZW50VGFyZ2V0LnNlbGVjdGlvblN0YXJ0ID0gdGFyZ2V0LnNlbGVjdGlvblN0YXJ0O1xuICAgIGN1cnJlbnRUYXJnZXQuc2VsZWN0aW9uRW5kID0gdGFyZ2V0LnNlbGVjdGlvbkVuZDtcbiAgfVxuICBjdXJyZW50VGFyZ2V0LnNldFNlbGVjdGlvblJhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgIHRhcmdldC5zZXRTZWxlY3Rpb25SYW5nZS5hcHBseSh0YXJnZXQsIGFyZ3VtZW50cyk7XG4gIH07XG4gIHJldHVybiBuZXdFdmVudDtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlT25DaGFuZ2UodGFyZ2V0LCBlLCBvbkNoYW5nZSwgdGFyZ2V0VmFsdWUpIHtcbiAgaWYgKCFvbkNoYW5nZSkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgZXZlbnQgPSBlO1xuICBpZiAoZS50eXBlID09PSAnY2xpY2snKSB7XG4gICAgLy8gQ2xvbmUgYSBuZXcgdGFyZ2V0IGZvciBldmVudC5cbiAgICAvLyBBdm9pZCB0aGUgZm9sbG93aW5nIHVzYWdlLCB0aGUgc2V0UXVlcnkgbWV0aG9kIGdldHMgdGhlIG9yaWdpbmFsIHZhbHVlLlxuICAgIC8vXG4gICAgLy8gY29uc3QgW3F1ZXJ5LCBzZXRRdWVyeV0gPSBSZWFjdC51c2VTdGF0ZSgnJyk7XG4gICAgLy8gPElucHV0XG4gICAgLy8gICBhbGxvd0NsZWFyXG4gICAgLy8gICB2YWx1ZT17cXVlcnl9XG4gICAgLy8gICBvbkNoYW5nZT17KGUpPT4ge1xuICAgIC8vICAgICBzZXRRdWVyeSgocHJldlN0YXR1cykgPT4gZS50YXJnZXQudmFsdWUpO1xuICAgIC8vICAgfX1cbiAgICAvLyAvPlxuXG4gICAgZXZlbnQgPSBjbG9uZUV2ZW50KGUsIHRhcmdldCwgJycpO1xuICAgIG9uQ2hhbmdlKGV2ZW50KTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBUcmlnZ2VyIGJ5IGNvbXBvc2l0aW9uIGV2ZW50LCB0aGlzIG1lYW5zIHdlIG5lZWQgZm9yY2UgY2hhbmdlIHRoZSBpbnB1dCB2YWx1ZVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy80NTczN1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy80NjU5OFxuICBpZiAodGFyZ2V0LnR5cGUgIT09ICdmaWxlJyAmJiB0YXJnZXRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZXZlbnQgPSBjbG9uZUV2ZW50KGUsIHRhcmdldCwgdGFyZ2V0VmFsdWUpO1xuICAgIG9uQ2hhbmdlKGV2ZW50KTtcbiAgICByZXR1cm47XG4gIH1cbiAgb25DaGFuZ2UoZXZlbnQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRyaWdnZXJGb2N1cyhlbGVtZW50LCBvcHRpb24pIHtcbiAgaWYgKCFlbGVtZW50KSByZXR1cm47XG4gIGVsZW1lbnQuZm9jdXMob3B0aW9uKTtcblxuICAvLyBTZWxlY3Rpb24gY29udGVudFxuICB2YXIgX3JlZiA9IG9wdGlvbiB8fCB7fSxcbiAgICBjdXJzb3IgPSBfcmVmLmN1cnNvcjtcbiAgaWYgKGN1cnNvcikge1xuICAgIHZhciBsZW4gPSBlbGVtZW50LnZhbHVlLmxlbmd0aDtcbiAgICBzd2l0Y2ggKGN1cnNvcikge1xuICAgICAgY2FzZSAnc3RhcnQnOlxuICAgICAgICBlbGVtZW50LnNldFNlbGVjdGlvblJhbmdlKDAsIDApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgIGVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UobGVuLCBsZW4pO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgbGVuKTtcbiAgICB9XG4gIH1cbn0iLCAiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiYXV0b0NvbXBsZXRlXCIsIFwib25DaGFuZ2VcIiwgXCJvbkZvY3VzXCIsIFwib25CbHVyXCIsIFwib25QcmVzc0VudGVyXCIsIFwib25LZXlEb3duXCIsIFwib25LZXlVcFwiLCBcInByZWZpeENsc1wiLCBcImRpc2FibGVkXCIsIFwiaHRtbFNpemVcIiwgXCJjbGFzc05hbWVcIiwgXCJtYXhMZW5ndGhcIiwgXCJzdWZmaXhcIiwgXCJzaG93Q291bnRcIiwgXCJjb3VudFwiLCBcInR5cGVcIiwgXCJjbGFzc2VzXCIsIFwiY2xhc3NOYW1lc1wiLCBcInN0eWxlc1wiLCBcIm9uQ29tcG9zaXRpb25TdGFydFwiLCBcIm9uQ29tcG9zaXRpb25FbmRcIl07XG5pbXBvcnQgY2xzeCBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB1c2VNZXJnZWRTdGF0ZSBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VNZXJnZWRTdGF0ZVwiO1xuaW1wb3J0IG9taXQgZnJvbSBcInJjLXV0aWwvZXMvb21pdFwiO1xuaW1wb3J0IFJlYWN0LCB7IGZvcndhcmRSZWYsIHVzZUVmZmVjdCwgdXNlSW1wZXJhdGl2ZUhhbmRsZSwgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBCYXNlSW5wdXQgZnJvbSBcIi4vQmFzZUlucHV0XCI7XG5pbXBvcnQgdXNlQ291bnQgZnJvbSBcIi4vaG9va3MvdXNlQ291bnRcIjtcbmltcG9ydCB7IHJlc29sdmVPbkNoYW5nZSwgdHJpZ2dlckZvY3VzIH0gZnJvbSBcIi4vdXRpbHMvY29tbW9uVXRpbHNcIjtcbnZhciBJbnB1dCA9IC8qI19fUFVSRV9fKi9mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBhdXRvQ29tcGxldGUgPSBwcm9wcy5hdXRvQ29tcGxldGUsXG4gICAgb25DaGFuZ2UgPSBwcm9wcy5vbkNoYW5nZSxcbiAgICBvbkZvY3VzID0gcHJvcHMub25Gb2N1cyxcbiAgICBvbkJsdXIgPSBwcm9wcy5vbkJsdXIsXG4gICAgb25QcmVzc0VudGVyID0gcHJvcHMub25QcmVzc0VudGVyLFxuICAgIG9uS2V5RG93biA9IHByb3BzLm9uS2V5RG93bixcbiAgICBvbktleVVwID0gcHJvcHMub25LZXlVcCxcbiAgICBfcHJvcHMkcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIHByZWZpeENscyA9IF9wcm9wcyRwcmVmaXhDbHMgPT09IHZvaWQgMCA/ICdyYy1pbnB1dCcgOiBfcHJvcHMkcHJlZml4Q2xzLFxuICAgIGRpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgaHRtbFNpemUgPSBwcm9wcy5odG1sU2l6ZSxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgbWF4TGVuZ3RoID0gcHJvcHMubWF4TGVuZ3RoLFxuICAgIHN1ZmZpeCA9IHByb3BzLnN1ZmZpeCxcbiAgICBzaG93Q291bnQgPSBwcm9wcy5zaG93Q291bnQsXG4gICAgY291bnQgPSBwcm9wcy5jb3VudCxcbiAgICBfcHJvcHMkdHlwZSA9IHByb3BzLnR5cGUsXG4gICAgdHlwZSA9IF9wcm9wcyR0eXBlID09PSB2b2lkIDAgPyAndGV4dCcgOiBfcHJvcHMkdHlwZSxcbiAgICBjbGFzc2VzID0gcHJvcHMuY2xhc3NlcyxcbiAgICBjbGFzc05hbWVzID0gcHJvcHMuY2xhc3NOYW1lcyxcbiAgICBzdHlsZXMgPSBwcm9wcy5zdHlsZXMsXG4gICAgX29uQ29tcG9zaXRpb25TdGFydCA9IHByb3BzLm9uQ29tcG9zaXRpb25TdGFydCxcbiAgICBvbkNvbXBvc2l0aW9uRW5kID0gcHJvcHMub25Db21wb3NpdGlvbkVuZCxcbiAgICByZXN0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBfZXhjbHVkZWQpO1xuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUoZmFsc2UpLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIGZvY3VzZWQgPSBfdXNlU3RhdGUyWzBdLFxuICAgIHNldEZvY3VzZWQgPSBfdXNlU3RhdGUyWzFdO1xuICB2YXIgY29tcG9zaXRpb25SZWYgPSB1c2VSZWYoZmFsc2UpO1xuICB2YXIga2V5TG9ja1JlZiA9IHVzZVJlZihmYWxzZSk7XG4gIHZhciBpbnB1dFJlZiA9IHVzZVJlZihudWxsKTtcbiAgdmFyIGhvbGRlclJlZiA9IHVzZVJlZihudWxsKTtcbiAgdmFyIGZvY3VzID0gZnVuY3Rpb24gZm9jdXMob3B0aW9uKSB7XG4gICAgaWYgKGlucHV0UmVmLmN1cnJlbnQpIHtcbiAgICAgIHRyaWdnZXJGb2N1cyhpbnB1dFJlZi5jdXJyZW50LCBvcHRpb24pO1xuICAgIH1cbiAgfTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09IFZhbHVlID09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfdXNlTWVyZ2VkU3RhdGUgPSB1c2VNZXJnZWRTdGF0ZShwcm9wcy5kZWZhdWx0VmFsdWUsIHtcbiAgICAgIHZhbHVlOiBwcm9wcy52YWx1ZVxuICAgIH0pLFxuICAgIF91c2VNZXJnZWRTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlTWVyZ2VkU3RhdGUsIDIpLFxuICAgIHZhbHVlID0gX3VzZU1lcmdlZFN0YXRlMlswXSxcbiAgICBzZXRWYWx1ZSA9IF91c2VNZXJnZWRTdGF0ZTJbMV07XG4gIHZhciBmb3JtYXRWYWx1ZSA9IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgPyAnJyA6IFN0cmluZyh2YWx1ZSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PSBTZWxlY3QgUmFuZ2UgPT09PT09PT09PT09PT09PT09PVxuICB2YXIgX3VzZVN0YXRlMyA9IHVzZVN0YXRlKG51bGwpLFxuICAgIF91c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUzLCAyKSxcbiAgICBzZWxlY3Rpb24gPSBfdXNlU3RhdGU0WzBdLFxuICAgIHNldFNlbGVjdGlvbiA9IF91c2VTdGF0ZTRbMV07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PSBDb3VudCA9PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgY291bnRDb25maWcgPSB1c2VDb3VudChjb3VudCwgc2hvd0NvdW50KTtcbiAgdmFyIG1lcmdlZE1heCA9IGNvdW50Q29uZmlnLm1heCB8fCBtYXhMZW5ndGg7XG4gIHZhciB2YWx1ZUxlbmd0aCA9IGNvdW50Q29uZmlnLnN0cmF0ZWd5KGZvcm1hdFZhbHVlKTtcbiAgdmFyIGlzT3V0T2ZSYW5nZSA9ICEhbWVyZ2VkTWF4ICYmIHZhbHVlTGVuZ3RoID4gbWVyZ2VkTWF4O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09IFJlZiA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX2hvbGRlclJlZiRjdXJyZW50O1xuICAgIHJldHVybiB7XG4gICAgICBmb2N1czogZm9jdXMsXG4gICAgICBibHVyOiBmdW5jdGlvbiBibHVyKCkge1xuICAgICAgICB2YXIgX2lucHV0UmVmJGN1cnJlbnQ7XG4gICAgICAgIChfaW5wdXRSZWYkY3VycmVudCA9IGlucHV0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9pbnB1dFJlZiRjdXJyZW50ID09PSB2b2lkIDAgfHwgX2lucHV0UmVmJGN1cnJlbnQuYmx1cigpO1xuICAgICAgfSxcbiAgICAgIHNldFNlbGVjdGlvblJhbmdlOiBmdW5jdGlvbiBzZXRTZWxlY3Rpb25SYW5nZShzdGFydCwgZW5kLCBkaXJlY3Rpb24pIHtcbiAgICAgICAgdmFyIF9pbnB1dFJlZiRjdXJyZW50MjtcbiAgICAgICAgKF9pbnB1dFJlZiRjdXJyZW50MiA9IGlucHV0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9pbnB1dFJlZiRjdXJyZW50MiA9PT0gdm9pZCAwIHx8IF9pbnB1dFJlZiRjdXJyZW50Mi5zZXRTZWxlY3Rpb25SYW5nZShzdGFydCwgZW5kLCBkaXJlY3Rpb24pO1xuICAgICAgfSxcbiAgICAgIHNlbGVjdDogZnVuY3Rpb24gc2VsZWN0KCkge1xuICAgICAgICB2YXIgX2lucHV0UmVmJGN1cnJlbnQzO1xuICAgICAgICAoX2lucHV0UmVmJGN1cnJlbnQzID0gaW5wdXRSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2lucHV0UmVmJGN1cnJlbnQzID09PSB2b2lkIDAgfHwgX2lucHV0UmVmJGN1cnJlbnQzLnNlbGVjdCgpO1xuICAgICAgfSxcbiAgICAgIGlucHV0OiBpbnB1dFJlZi5jdXJyZW50LFxuICAgICAgbmF0aXZlRWxlbWVudDogKChfaG9sZGVyUmVmJGN1cnJlbnQgPSBob2xkZXJSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2hvbGRlclJlZiRjdXJyZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfaG9sZGVyUmVmJGN1cnJlbnQubmF0aXZlRWxlbWVudCkgfHwgaW5wdXRSZWYuY3VycmVudFxuICAgIH07XG4gIH0pO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChrZXlMb2NrUmVmLmN1cnJlbnQpIHtcbiAgICAgIGtleUxvY2tSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIH1cbiAgICBzZXRGb2N1c2VkKGZ1bmN0aW9uIChwcmV2KSB7XG4gICAgICByZXR1cm4gcHJldiAmJiBkaXNhYmxlZCA/IGZhbHNlIDogcHJldjtcbiAgICB9KTtcbiAgfSwgW2Rpc2FibGVkXSk7XG4gIHZhciB0cmlnZ2VyQ2hhbmdlID0gZnVuY3Rpb24gdHJpZ2dlckNoYW5nZShlLCBjdXJyZW50VmFsdWUsIGluZm8pIHtcbiAgICB2YXIgY3V0VmFsdWUgPSBjdXJyZW50VmFsdWU7XG4gICAgaWYgKCFjb21wb3NpdGlvblJlZi5jdXJyZW50ICYmIGNvdW50Q29uZmlnLmV4Y2VlZEZvcm1hdHRlciAmJiBjb3VudENvbmZpZy5tYXggJiYgY291bnRDb25maWcuc3RyYXRlZ3koY3VycmVudFZhbHVlKSA+IGNvdW50Q29uZmlnLm1heCkge1xuICAgICAgY3V0VmFsdWUgPSBjb3VudENvbmZpZy5leGNlZWRGb3JtYXR0ZXIoY3VycmVudFZhbHVlLCB7XG4gICAgICAgIG1heDogY291bnRDb25maWcubWF4XG4gICAgICB9KTtcbiAgICAgIGlmIChjdXJyZW50VmFsdWUgIT09IGN1dFZhbHVlKSB7XG4gICAgICAgIHZhciBfaW5wdXRSZWYkY3VycmVudDQsIF9pbnB1dFJlZiRjdXJyZW50NTtcbiAgICAgICAgc2V0U2VsZWN0aW9uKFsoKF9pbnB1dFJlZiRjdXJyZW50NCA9IGlucHV0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9pbnB1dFJlZiRjdXJyZW50NCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2lucHV0UmVmJGN1cnJlbnQ0LnNlbGVjdGlvblN0YXJ0KSB8fCAwLCAoKF9pbnB1dFJlZiRjdXJyZW50NSA9IGlucHV0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9pbnB1dFJlZiRjdXJyZW50NSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2lucHV0UmVmJGN1cnJlbnQ1LnNlbGVjdGlvbkVuZCkgfHwgMF0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaW5mby5zb3VyY2UgPT09ICdjb21wb3NpdGlvbkVuZCcpIHtcbiAgICAgIC8vIEF2b2lkIHRyaWdnZXJpbmcgdHdpY2VcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzQ2NTg3XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNldFZhbHVlKGN1dFZhbHVlKTtcbiAgICBpZiAoaW5wdXRSZWYuY3VycmVudCkge1xuICAgICAgcmVzb2x2ZU9uQ2hhbmdlKGlucHV0UmVmLmN1cnJlbnQsIGUsIG9uQ2hhbmdlLCBjdXRWYWx1ZSk7XG4gICAgfVxuICB9O1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChzZWxlY3Rpb24pIHtcbiAgICAgIHZhciBfaW5wdXRSZWYkY3VycmVudDY7XG4gICAgICAoX2lucHV0UmVmJGN1cnJlbnQ2ID0gaW5wdXRSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2lucHV0UmVmJGN1cnJlbnQ2ID09PSB2b2lkIDAgfHwgX2lucHV0UmVmJGN1cnJlbnQ2LnNldFNlbGVjdGlvblJhbmdlLmFwcGx5KF9pbnB1dFJlZiRjdXJyZW50NiwgX3RvQ29uc3VtYWJsZUFycmF5KHNlbGVjdGlvbikpO1xuICAgIH1cbiAgfSwgW3NlbGVjdGlvbl0pO1xuICB2YXIgb25JbnRlcm5hbENoYW5nZSA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxDaGFuZ2UoZSkge1xuICAgIHRyaWdnZXJDaGFuZ2UoZSwgZS50YXJnZXQudmFsdWUsIHtcbiAgICAgIHNvdXJjZTogJ2NoYW5nZSdcbiAgICB9KTtcbiAgfTtcbiAgdmFyIG9uSW50ZXJuYWxDb21wb3NpdGlvbkVuZCA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxDb21wb3NpdGlvbkVuZChlKSB7XG4gICAgY29tcG9zaXRpb25SZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIHRyaWdnZXJDaGFuZ2UoZSwgZS5jdXJyZW50VGFyZ2V0LnZhbHVlLCB7XG4gICAgICBzb3VyY2U6ICdjb21wb3NpdGlvbkVuZCdcbiAgICB9KTtcbiAgICBvbkNvbXBvc2l0aW9uRW5kID09PSBudWxsIHx8IG9uQ29tcG9zaXRpb25FbmQgPT09IHZvaWQgMCB8fCBvbkNvbXBvc2l0aW9uRW5kKGUpO1xuICB9O1xuICB2YXIgaGFuZGxlS2V5RG93biA9IGZ1bmN0aW9uIGhhbmRsZUtleURvd24oZSkge1xuICAgIGlmIChvblByZXNzRW50ZXIgJiYgZS5rZXkgPT09ICdFbnRlcicgJiYgIWtleUxvY2tSZWYuY3VycmVudCkge1xuICAgICAga2V5TG9ja1JlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIG9uUHJlc3NFbnRlcihlKTtcbiAgICB9XG4gICAgb25LZXlEb3duID09PSBudWxsIHx8IG9uS2V5RG93biA9PT0gdm9pZCAwIHx8IG9uS2V5RG93bihlKTtcbiAgfTtcbiAgdmFyIGhhbmRsZUtleVVwID0gZnVuY3Rpb24gaGFuZGxlS2V5VXAoZSkge1xuICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJykge1xuICAgICAga2V5TG9ja1JlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgfVxuICAgIG9uS2V5VXAgPT09IG51bGwgfHwgb25LZXlVcCA9PT0gdm9pZCAwIHx8IG9uS2V5VXAoZSk7XG4gIH07XG4gIHZhciBoYW5kbGVGb2N1cyA9IGZ1bmN0aW9uIGhhbmRsZUZvY3VzKGUpIHtcbiAgICBzZXRGb2N1c2VkKHRydWUpO1xuICAgIG9uRm9jdXMgPT09IG51bGwgfHwgb25Gb2N1cyA9PT0gdm9pZCAwIHx8IG9uRm9jdXMoZSk7XG4gIH07XG4gIHZhciBoYW5kbGVCbHVyID0gZnVuY3Rpb24gaGFuZGxlQmx1cihlKSB7XG4gICAgaWYgKGtleUxvY2tSZWYuY3VycmVudCkge1xuICAgICAga2V5TG9ja1JlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgfVxuICAgIHNldEZvY3VzZWQoZmFsc2UpO1xuICAgIG9uQmx1ciA9PT0gbnVsbCB8fCBvbkJsdXIgPT09IHZvaWQgMCB8fCBvbkJsdXIoZSk7XG4gIH07XG4gIHZhciBoYW5kbGVSZXNldCA9IGZ1bmN0aW9uIGhhbmRsZVJlc2V0KGUpIHtcbiAgICBzZXRWYWx1ZSgnJyk7XG4gICAgZm9jdXMoKTtcbiAgICBpZiAoaW5wdXRSZWYuY3VycmVudCkge1xuICAgICAgcmVzb2x2ZU9uQ2hhbmdlKGlucHV0UmVmLmN1cnJlbnQsIGUsIG9uQ2hhbmdlKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PSBJbnB1dCA9PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgb3V0T2ZSYW5nZUNscyA9IGlzT3V0T2ZSYW5nZSAmJiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW91dC1vZi1yYW5nZVwiKTtcbiAgdmFyIGdldElucHV0RWxlbWVudCA9IGZ1bmN0aW9uIGdldElucHV0RWxlbWVudCgpIHtcbiAgICAvLyBGaXggaHR0cHM6Ly9mYi5tZS9yZWFjdC11bmtub3duLXByb3BcbiAgICB2YXIgb3RoZXJQcm9wcyA9IG9taXQocHJvcHMsIFsncHJlZml4Q2xzJywgJ29uUHJlc3NFbnRlcicsICdhZGRvbkJlZm9yZScsICdhZGRvbkFmdGVyJywgJ3ByZWZpeCcsICdzdWZmaXgnLCAnYWxsb3dDbGVhcicsXG4gICAgLy8gSW5wdXQgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQsXG4gICAgLy8gc3BlY2lmeSBlaXRoZXIgdGhlIHZhbHVlIHByb3AsIG9yIHRoZSBkZWZhdWx0VmFsdWUgcHJvcCwgYnV0IG5vdCBib3RoLlxuICAgICdkZWZhdWx0VmFsdWUnLCAnc2hvd0NvdW50JywgJ2NvdW50JywgJ2NsYXNzZXMnLCAnaHRtbFNpemUnLCAnc3R5bGVzJywgJ2NsYXNzTmFtZXMnLCAnb25DbGVhciddKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLCBfZXh0ZW5kcyh7XG4gICAgICBhdXRvQ29tcGxldGU6IGF1dG9Db21wbGV0ZVxuICAgIH0sIG90aGVyUHJvcHMsIHtcbiAgICAgIG9uQ2hhbmdlOiBvbkludGVybmFsQ2hhbmdlLFxuICAgICAgb25Gb2N1czogaGFuZGxlRm9jdXMsXG4gICAgICBvbkJsdXI6IGhhbmRsZUJsdXIsXG4gICAgICBvbktleURvd246IGhhbmRsZUtleURvd24sXG4gICAgICBvbktleVVwOiBoYW5kbGVLZXlVcCxcbiAgICAgIGNsYXNzTmFtZTogY2xzeChwcmVmaXhDbHMsIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kaXNhYmxlZFwiKSwgZGlzYWJsZWQpLCBjbGFzc05hbWVzID09PSBudWxsIHx8IGNsYXNzTmFtZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNsYXNzTmFtZXMuaW5wdXQpLFxuICAgICAgc3R5bGU6IHN0eWxlcyA9PT0gbnVsbCB8fCBzdHlsZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0eWxlcy5pbnB1dCxcbiAgICAgIHJlZjogaW5wdXRSZWYsXG4gICAgICBzaXplOiBodG1sU2l6ZSxcbiAgICAgIHR5cGU6IHR5cGUsXG4gICAgICBvbkNvbXBvc2l0aW9uU3RhcnQ6IGZ1bmN0aW9uIG9uQ29tcG9zaXRpb25TdGFydChlKSB7XG4gICAgICAgIGNvbXBvc2l0aW9uUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICBfb25Db21wb3NpdGlvblN0YXJ0ID09PSBudWxsIHx8IF9vbkNvbXBvc2l0aW9uU3RhcnQgPT09IHZvaWQgMCB8fCBfb25Db21wb3NpdGlvblN0YXJ0KGUpO1xuICAgICAgfSxcbiAgICAgIG9uQ29tcG9zaXRpb25FbmQ6IG9uSW50ZXJuYWxDb21wb3NpdGlvbkVuZFxuICAgIH0pKTtcbiAgfTtcbiAgdmFyIGdldFN1ZmZpeCA9IGZ1bmN0aW9uIGdldFN1ZmZpeCgpIHtcbiAgICAvLyBNYXggbGVuZ3RoIHZhbHVlXG4gICAgdmFyIGhhc01heExlbmd0aCA9IE51bWJlcihtZXJnZWRNYXgpID4gMDtcbiAgICBpZiAoc3VmZml4IHx8IGNvdW50Q29uZmlnLnNob3cpIHtcbiAgICAgIHZhciBkYXRhQ291bnQgPSBjb3VudENvbmZpZy5zaG93Rm9ybWF0dGVyID8gY291bnRDb25maWcuc2hvd0Zvcm1hdHRlcih7XG4gICAgICAgIHZhbHVlOiBmb3JtYXRWYWx1ZSxcbiAgICAgICAgY291bnQ6IHZhbHVlTGVuZ3RoLFxuICAgICAgICBtYXhMZW5ndGg6IG1lcmdlZE1heFxuICAgICAgfSkgOiBcIlwiLmNvbmNhdCh2YWx1ZUxlbmd0aCkuY29uY2F0KGhhc01heExlbmd0aCA/IFwiIC8gXCIuY29uY2F0KG1lcmdlZE1heCkgOiAnJyk7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIGNvdW50Q29uZmlnLnNob3cgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBjbHN4KFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2hvdy1jb3VudC1zdWZmaXhcIiksIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zaG93LWNvdW50LWhhcy1zdWZmaXhcIiksICEhc3VmZml4KSwgY2xhc3NOYW1lcyA9PT0gbnVsbCB8fCBjbGFzc05hbWVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjbGFzc05hbWVzLmNvdW50KSxcbiAgICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoe30sIHN0eWxlcyA9PT0gbnVsbCB8fCBzdHlsZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0eWxlcy5jb3VudClcbiAgICAgIH0sIGRhdGFDb3VudCksIHN1ZmZpeCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEJhc2VJbnB1dCwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBjbGFzc05hbWU6IGNsc3goY2xhc3NOYW1lLCBvdXRPZlJhbmdlQ2xzKSxcbiAgICBoYW5kbGVSZXNldDogaGFuZGxlUmVzZXQsXG4gICAgdmFsdWU6IGZvcm1hdFZhbHVlLFxuICAgIGZvY3VzZWQ6IGZvY3VzZWQsXG4gICAgdHJpZ2dlckZvY3VzOiBmb2N1cyxcbiAgICBzdWZmaXg6IGdldFN1ZmZpeCgpLFxuICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICBjbGFzc2VzOiBjbGFzc2VzLFxuICAgIGNsYXNzTmFtZXM6IGNsYXNzTmFtZXMsXG4gICAgc3R5bGVzOiBzdHlsZXMsXG4gICAgcmVmOiBob2xkZXJSZWZcbiAgfSksIGdldElucHV0RWxlbWVudCgpKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgSW5wdXQ7IiwgImltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xudmFyIF9leGNsdWRlZCA9IFtcInNob3dcIl07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG4vKipcbiAqIEN1dCBgdmFsdWVgIGJ5IHRoZSBgY291bnQubWF4YCBwcm9wLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5Db3VudFJhbmdlKHZhbHVlLCBjb3VudENvbmZpZykge1xuICBpZiAoIWNvdW50Q29uZmlnLm1heCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHZhciBjb3VudCA9IGNvdW50Q29uZmlnLnN0cmF0ZWd5KHZhbHVlKTtcbiAgcmV0dXJuIGNvdW50IDw9IGNvdW50Q29uZmlnLm1heDtcbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUNvdW50KGNvdW50LCBzaG93Q291bnQpIHtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBtZXJnZWRDb25maWcgPSB7fTtcbiAgICBpZiAoc2hvd0NvdW50KSB7XG4gICAgICBtZXJnZWRDb25maWcuc2hvdyA9IF90eXBlb2Yoc2hvd0NvdW50KSA9PT0gJ29iamVjdCcgJiYgc2hvd0NvdW50LmZvcm1hdHRlciA/IHNob3dDb3VudC5mb3JtYXR0ZXIgOiAhIXNob3dDb3VudDtcbiAgICB9XG4gICAgbWVyZ2VkQ29uZmlnID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBtZXJnZWRDb25maWcpLCBjb3VudCk7XG4gICAgdmFyIF9yZWYgPSBtZXJnZWRDb25maWcsXG4gICAgICBzaG93ID0gX3JlZi5zaG93LFxuICAgICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBfZXhjbHVkZWQpO1xuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHJlc3QpLCB7fSwge1xuICAgICAgc2hvdzogISFzaG93LFxuICAgICAgc2hvd0Zvcm1hdHRlcjogdHlwZW9mIHNob3cgPT09ICdmdW5jdGlvbicgPyBzaG93IDogdW5kZWZpbmVkLFxuICAgICAgc3RyYXRlZ3k6IHJlc3Quc3RyYXRlZ3kgfHwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5sZW5ndGg7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sIFtjb3VudCwgc2hvd0NvdW50XSk7XG59IiwgImltcG9ydCBCYXNlSW5wdXQgZnJvbSBcIi4vQmFzZUlucHV0XCI7XG5pbXBvcnQgSW5wdXQgZnJvbSBcIi4vSW5wdXRcIjtcbmV4cG9ydCB7IEJhc2VJbnB1dCB9O1xuZXhwb3J0IGRlZmF1bHQgSW5wdXQ7IiwgIi8qKlxuICogUHJveHkgb2JqZWN0IGlmIGVudmlyb25tZW50IHN1cHBvcnRlZFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwcm94eU9iamVjdChvYmosIGV4dGVuZFByb3BzKSB7XG4gIGlmICh0eXBlb2YgUHJveHkgIT09ICd1bmRlZmluZWQnICYmIG9iaikge1xuICAgIHJldHVybiBuZXcgUHJveHkob2JqLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCh0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgaWYgKGV4dGVuZFByb3BzW3Byb3BdKSB7XG4gICAgICAgICAgcmV0dXJuIGV4dGVuZFByb3BzW3Byb3BdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHJveHkgb3JpZ2luIHByb3BlcnR5XG4gICAgICAgIHZhciBvcmlnaW5Qcm9wID0gdGFyZ2V0W3Byb3BdO1xuICAgICAgICByZXR1cm4gdHlwZW9mIG9yaWdpblByb3AgPT09ICdmdW5jdGlvbicgPyBvcmlnaW5Qcm9wLmJpbmQodGFyZ2V0KSA6IG9yaWdpblByb3A7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG9iajtcbn0iLCAiaW1wb3J0IHsgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuLyoqXG4gKiBLZWVwIGlucHV0IGN1cnNvciBpbiB0aGUgY29ycmVjdCBwb3NpdGlvbiBpZiBwb3NzaWJsZS5cbiAqIElzIHRoaXMgbmVjZXNzYXJ5IHNpbmNlIHdlIGhhdmUgYGZvcm1hdHRlcmAgd2hpY2ggbWF5IG1hc3MgdGhlIGNvbnRlbnQ/XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUN1cnNvcihpbnB1dCwgZm9jdXNlZCkge1xuICB2YXIgc2VsZWN0aW9uUmVmID0gdXNlUmVmKG51bGwpO1xuICBmdW5jdGlvbiByZWNvcmRDdXJzb3IoKSB7XG4gICAgLy8gUmVjb3JkIHBvc2l0aW9uXG4gICAgdHJ5IHtcbiAgICAgIHZhciBzdGFydCA9IGlucHV0LnNlbGVjdGlvblN0YXJ0LFxuICAgICAgICBlbmQgPSBpbnB1dC5zZWxlY3Rpb25FbmQsXG4gICAgICAgIHZhbHVlID0gaW5wdXQudmFsdWU7XG4gICAgICB2YXIgYmVmb3JlVHh0ID0gdmFsdWUuc3Vic3RyaW5nKDAsIHN0YXJ0KTtcbiAgICAgIHZhciBhZnRlclR4dCA9IHZhbHVlLnN1YnN0cmluZyhlbmQpO1xuICAgICAgc2VsZWN0aW9uUmVmLmN1cnJlbnQgPSB7XG4gICAgICAgIHN0YXJ0OiBzdGFydCxcbiAgICAgICAgZW5kOiBlbmQsXG4gICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgYmVmb3JlVHh0OiBiZWZvcmVUeHQsXG4gICAgICAgIGFmdGVyVHh0OiBhZnRlclR4dFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBGaXggZXJyb3IgaW4gQ2hyb21lOlxuICAgICAgLy8gRmFpbGVkIHRvIHJlYWQgdGhlICdzZWxlY3Rpb25TdGFydCcgcHJvcGVydHkgZnJvbSAnSFRNTElucHV0RWxlbWVudCdcbiAgICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xLzIxMTc3NDg5LzMwNDA2MDVcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZSBsb2dpYzpcbiAgICogIDEuIGJhY2sgc3RyaW5nIHNhbWVcbiAgICogIDIuIHN0YXJ0IHN0cmluZyBzYW1lXG4gICAqL1xuICBmdW5jdGlvbiByZXN0b3JlQ3Vyc29yKCkge1xuICAgIGlmIChpbnB1dCAmJiBzZWxlY3Rpb25SZWYuY3VycmVudCAmJiBmb2N1c2VkKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgdmFsdWUgPSBpbnB1dC52YWx1ZTtcbiAgICAgICAgdmFyIF9zZWxlY3Rpb25SZWYkY3VycmVudCA9IHNlbGVjdGlvblJlZi5jdXJyZW50LFxuICAgICAgICAgIGJlZm9yZVR4dCA9IF9zZWxlY3Rpb25SZWYkY3VycmVudC5iZWZvcmVUeHQsXG4gICAgICAgICAgYWZ0ZXJUeHQgPSBfc2VsZWN0aW9uUmVmJGN1cnJlbnQuYWZ0ZXJUeHQsXG4gICAgICAgICAgc3RhcnQgPSBfc2VsZWN0aW9uUmVmJGN1cnJlbnQuc3RhcnQ7XG4gICAgICAgIHZhciBzdGFydFBvcyA9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoYmVmb3JlVHh0KSkge1xuICAgICAgICAgIHN0YXJ0UG9zID0gYmVmb3JlVHh0Lmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5lbmRzV2l0aChhZnRlclR4dCkpIHtcbiAgICAgICAgICBzdGFydFBvcyA9IHZhbHVlLmxlbmd0aCAtIHNlbGVjdGlvblJlZi5jdXJyZW50LmFmdGVyVHh0Lmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgYmVmb3JlTGFzdENoYXIgPSBiZWZvcmVUeHRbc3RhcnQgLSAxXTtcbiAgICAgICAgICB2YXIgbmV3SW5kZXggPSB2YWx1ZS5pbmRleE9mKGJlZm9yZUxhc3RDaGFyLCBzdGFydCAtIDEpO1xuICAgICAgICAgIGlmIChuZXdJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIHN0YXJ0UG9zID0gbmV3SW5kZXggKyAxO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZShzdGFydFBvcywgc3RhcnRQb3MpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB3YXJuaW5nKGZhbHNlLCBcIlNvbWV0aGluZyB3YXJuaW5nIG9mIGN1cnNvciByZXN0b3JlLiBQbGVhc2UgZmlyZSBpc3N1ZSBhYm91dCB0aGlzOiBcIi5jb25jYXQoZS5tZXNzYWdlKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBbcmVjb3JkQ3Vyc29yLCByZXN0b3JlQ3Vyc29yXTtcbn0iLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuLyogZXNsaW50LWRpc2FibGUgcmVhY3Qvbm8tdW5rbm93bi1wcm9wZXJ0eSAqL1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgdXNlTW9iaWxlIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZU1vYmlsZVwiO1xuaW1wb3J0IHJhZiBmcm9tIFwicmMtdXRpbC9lcy9yYWZcIjtcblxuLyoqXG4gKiBXaGVuIGNsaWNrIGFuZCBob2xkIG9uIGEgYnV0dG9uIC0gdGhlIHNwZWVkIG9mIGF1dG8gY2hhbmdpbmcgdGhlIHZhbHVlLlxuICovXG52YXIgU1RFUF9JTlRFUlZBTCA9IDIwMDtcblxuLyoqXG4gKiBXaGVuIGNsaWNrIGFuZCBob2xkIG9uIGEgYnV0dG9uIC0gdGhlIGRlbGF5IGJlZm9yZSBhdXRvIGNoYW5naW5nIHRoZSB2YWx1ZS5cbiAqL1xudmFyIFNURVBfREVMQVkgPSA2MDA7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBTdGVwSGFuZGxlcihfcmVmKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscyxcbiAgICB1cE5vZGUgPSBfcmVmLnVwTm9kZSxcbiAgICBkb3duTm9kZSA9IF9yZWYuZG93bk5vZGUsXG4gICAgdXBEaXNhYmxlZCA9IF9yZWYudXBEaXNhYmxlZCxcbiAgICBkb3duRGlzYWJsZWQgPSBfcmVmLmRvd25EaXNhYmxlZCxcbiAgICBvblN0ZXAgPSBfcmVmLm9uU3RlcDtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IFN0ZXAgPT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBzdGVwVGltZW91dFJlZiA9IFJlYWN0LnVzZVJlZigpO1xuICB2YXIgZnJhbWVJZHMgPSBSZWFjdC51c2VSZWYoW10pO1xuICB2YXIgb25TdGVwUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIG9uU3RlcFJlZi5jdXJyZW50ID0gb25TdGVwO1xuICB2YXIgb25TdG9wU3RlcCA9IGZ1bmN0aW9uIG9uU3RvcFN0ZXAoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHN0ZXBUaW1lb3V0UmVmLmN1cnJlbnQpO1xuICB9O1xuXG4gIC8vIFdlIHdpbGwgaW50ZXJ2YWwgdXBkYXRlIHN0ZXAgd2hlbiBob2xkIG1vdXNlIGRvd25cbiAgdmFyIG9uU3RlcE1vdXNlRG93biA9IGZ1bmN0aW9uIG9uU3RlcE1vdXNlRG93bihlLCB1cCkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBvblN0b3BTdGVwKCk7XG4gICAgb25TdGVwUmVmLmN1cnJlbnQodXApO1xuXG4gICAgLy8gTG9vcCBzdGVwIGZvciBpbnRlcnZhbFxuICAgIGZ1bmN0aW9uIGxvb3BTdGVwKCkge1xuICAgICAgb25TdGVwUmVmLmN1cnJlbnQodXApO1xuICAgICAgc3RlcFRpbWVvdXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQobG9vcFN0ZXAsIFNURVBfSU5URVJWQUwpO1xuICAgIH1cblxuICAgIC8vIEZpcnN0IHRpbWUgcHJlc3Mgd2lsbCB3YWl0IHNvbWUgdGltZSB0byB0cmlnZ2VyIGxvb3Agc3RlcCB1cGRhdGVcbiAgICBzdGVwVGltZW91dFJlZi5jdXJyZW50ID0gc2V0VGltZW91dChsb29wU3RlcCwgU1RFUF9ERUxBWSk7XG4gIH07XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIG9uU3RvcFN0ZXAoKTtcbiAgICAgIGZyYW1lSWRzLmN1cnJlbnQuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgcmV0dXJuIHJhZi5jYW5jZWwoaWQpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfSwgW10pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgaXNNb2JpbGUgPSB1c2VNb2JpbGUoKTtcbiAgaWYgKGlzTW9iaWxlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIGhhbmRsZXJDbGFzc05hbWUgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhhbmRsZXJcIik7XG4gIHZhciB1cENsYXNzTmFtZSA9IGNsYXNzTmFtZXMoaGFuZGxlckNsYXNzTmFtZSwgXCJcIi5jb25jYXQoaGFuZGxlckNsYXNzTmFtZSwgXCItdXBcIiksIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQoaGFuZGxlckNsYXNzTmFtZSwgXCItdXAtZGlzYWJsZWRcIiksIHVwRGlzYWJsZWQpKTtcbiAgdmFyIGRvd25DbGFzc05hbWUgPSBjbGFzc05hbWVzKGhhbmRsZXJDbGFzc05hbWUsIFwiXCIuY29uY2F0KGhhbmRsZXJDbGFzc05hbWUsIFwiLWRvd25cIiksIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQoaGFuZGxlckNsYXNzTmFtZSwgXCItZG93bi1kaXNhYmxlZFwiKSwgZG93bkRpc2FibGVkKSk7XG5cbiAgLy8gZml4OiBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy80MzA4OFxuICAvLyBJbiBTYWZhcmksIFdoZW4gd2UgZmlyZSBvbm1vdXNlZG93biBhbmQgb25tb3VzZXVwIGV2ZW50cyBpbiBxdWljayBzdWNjZXNzaW9uLCBcbiAgLy8gdGhlcmUgbWF5IGJlIGEgcHJvYmxlbSB0aGF0IHRoZSBvbm1vdXNldXAgZXZlbnRzIGFyZSBleGVjdXRlZCBmaXJzdCwgXG4gIC8vIHJlc3VsdGluZyBpbiBhIGRpc29yZGVyZWQgcHJvZ3JhbSBleGVjdXRpb24uXG4gIC8vIFNvLCB3ZSBuZWVkIHRvIHVzZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgdG8gZW5zdXJlIHRoYXQgdGhlIG9ubW91c2V1cCBldmVudCBpcyBleGVjdXRlZCBhZnRlciB0aGUgb25tb3VzZWRvd24gZXZlbnQuXG4gIHZhciBzYWZlT25TdG9wU3RlcCA9IGZ1bmN0aW9uIHNhZmVPblN0b3BTdGVwKCkge1xuICAgIHJldHVybiBmcmFtZUlkcy5jdXJyZW50LnB1c2gocmFmKG9uU3RvcFN0ZXApKTtcbiAgfTtcbiAgdmFyIHNoYXJlZEhhbmRsZXJQcm9wcyA9IHtcbiAgICB1bnNlbGVjdGFibGU6ICdvbicsXG4gICAgcm9sZTogJ2J1dHRvbicsXG4gICAgb25Nb3VzZVVwOiBzYWZlT25TdG9wU3RlcCxcbiAgICBvbk1vdXNlTGVhdmU6IHNhZmVPblN0b3BTdGVwXG4gIH07XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChoYW5kbGVyQ2xhc3NOYW1lLCBcIi13cmFwXCIpXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBfZXh0ZW5kcyh7fSwgc2hhcmVkSGFuZGxlclByb3BzLCB7XG4gICAgb25Nb3VzZURvd246IGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICAgIG9uU3RlcE1vdXNlRG93bihlLCB0cnVlKTtcbiAgICB9LFxuICAgIFwiYXJpYS1sYWJlbFwiOiBcIkluY3JlYXNlIFZhbHVlXCIsXG4gICAgXCJhcmlhLWRpc2FibGVkXCI6IHVwRGlzYWJsZWQsXG4gICAgY2xhc3NOYW1lOiB1cENsYXNzTmFtZVxuICB9KSwgdXBOb2RlIHx8IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgdW5zZWxlY3RhYmxlOiBcIm9uXCIsXG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhhbmRsZXItdXAtaW5uZXJcIilcbiAgfSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgX2V4dGVuZHMoe30sIHNoYXJlZEhhbmRsZXJQcm9wcywge1xuICAgIG9uTW91c2VEb3duOiBmdW5jdGlvbiBvbk1vdXNlRG93bihlKSB7XG4gICAgICBvblN0ZXBNb3VzZURvd24oZSwgZmFsc2UpO1xuICAgIH0sXG4gICAgXCJhcmlhLWxhYmVsXCI6IFwiRGVjcmVhc2UgVmFsdWVcIixcbiAgICBcImFyaWEtZGlzYWJsZWRcIjogZG93bkRpc2FibGVkLFxuICAgIGNsYXNzTmFtZTogZG93bkNsYXNzTmFtZVxuICB9KSwgZG93bk5vZGUgfHwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICB1bnNlbGVjdGFibGU6IFwib25cIixcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaGFuZGxlci1kb3duLWlubmVyXCIpXG4gIH0pKSk7XG59IiwgImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgaXNNb2JpbGUgZnJvbSBcIi4uL2lzTW9iaWxlXCI7XG5pbXBvcnQgdXNlTGF5b3V0RWZmZWN0IGZyb20gXCIuL3VzZUxheW91dEVmZmVjdFwiO1xuXG4vKipcbiAqIEhvb2sgdG8gZGV0ZWN0IGlmIHRoZSB1c2VyIGlzIG9uIGEgbW9iaWxlIGRldmljZVxuICogTm90aWNlIHRoYXQgdGhpcyBob29rIHdpbGwgb25seSBkZXRlY3QgdGhlIGRldmljZSB0eXBlIGluIGVmZmVjdCwgc28gaXQgd2lsbCBhbHdheXMgYmUgZmFsc2UgaW4gc2VydmVyIHNpZGVcbiAqL1xudmFyIHVzZU1vYmlsZSA9IGZ1bmN0aW9uIHVzZU1vYmlsZSgpIHtcbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKGZhbHNlKSxcbiAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICBtb2JpbGUgPSBfdXNlU3RhdGUyWzBdLFxuICAgIHNldE1vYmlsZSA9IF91c2VTdGF0ZTJbMV07XG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgc2V0TW9iaWxlKGlzTW9iaWxlKCkpO1xuICB9LCBbXSk7XG4gIHJldHVybiBtb2JpbGU7XG59O1xuZXhwb3J0IGRlZmF1bHQgdXNlTW9iaWxlOyIsICJpbXBvcnQgeyB0cmltTnVtYmVyLCBudW0yc3RyIH0gZnJvbSAnQHJjLWNvbXBvbmVudC9taW5pLWRlY2ltYWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlY3VwbGVTdGVwcyhzdGVwKSB7XG4gIHZhciBzdGVwU3RyID0gdHlwZW9mIHN0ZXAgPT09ICdudW1iZXInID8gbnVtMnN0cihzdGVwKSA6IHRyaW1OdW1iZXIoc3RlcCkuZnVsbFN0cjtcbiAgdmFyIGhhc1BvaW50ID0gc3RlcFN0ci5pbmNsdWRlcygnLicpO1xuICBpZiAoIWhhc1BvaW50KSB7XG4gICAgcmV0dXJuIHN0ZXAgKyAnMCc7XG4gIH1cbiAgcmV0dXJuIHRyaW1OdW1iZXIoc3RlcFN0ci5yZXBsYWNlKC8oXFxkKVxcLihcXGQpL2csICckMSQyLicpKS5mdWxsU3RyO1xufSIsICJpbXBvcnQgeyB1c2VSZWYsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCByYWYgZnJvbSBcInJjLXV0aWwvZXMvcmFmXCI7XG5cbi8qKlxuICogQWx3YXlzIHRyaWdnZXIgbGF0ZXN0IG9uY2Ugd2hlbiBjYWxsIG11bHRpcGxlIHRpbWVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uICgpIHtcbiAgdmFyIGlkUmVmID0gdXNlUmVmKDApO1xuICB2YXIgY2xlYW5VcCA9IGZ1bmN0aW9uIGNsZWFuVXAoKSB7XG4gICAgcmFmLmNhbmNlbChpZFJlZi5jdXJyZW50KTtcbiAgfTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gY2xlYW5VcDtcbiAgfSwgW10pO1xuICByZXR1cm4gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgY2xlYW5VcCgpO1xuICAgIGlkUmVmLmN1cnJlbnQgPSByYWYoZnVuY3Rpb24gKCkge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9KTtcbiAgfTtcbn0pOyIsICJpbXBvcnQgSW5wdXROdW1iZXIgZnJvbSBcIi4vSW5wdXROdW1iZXJcIjtcbmV4cG9ydCBkZWZhdWx0IElucHV0TnVtYmVyOyIsICJpbXBvcnQgeyBGYXN0Q29sb3IgfSBmcm9tICdAYW50LWRlc2lnbi9mYXN0LWNvbG9yJztcbmltcG9ydCB7IGluaXRDb21wb25lbnRUb2tlbiB9IGZyb20gJy4uLy4uL2lucHV0L3N0eWxlL3Rva2VuJztcbmV4cG9ydCBjb25zdCBwcmVwYXJlQ29tcG9uZW50VG9rZW4gPSB0b2tlbiA9PiB7XG4gIHZhciBfYTtcbiAgY29uc3QgaGFuZGxlVmlzaWJsZSA9IChfYSA9IHRva2VuLmhhbmRsZVZpc2libGUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICdhdXRvJztcbiAgY29uc3QgaGFuZGxlV2lkdGggPSB0b2tlbi5jb250cm9sSGVpZ2h0U00gLSB0b2tlbi5saW5lV2lkdGggKiAyO1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBpbml0Q29tcG9uZW50VG9rZW4odG9rZW4pKSwge1xuICAgIGNvbnRyb2xXaWR0aDogOTAsXG4gICAgaGFuZGxlV2lkdGgsXG4gICAgaGFuZGxlRm9udFNpemU6IHRva2VuLmZvbnRTaXplIC8gMixcbiAgICBoYW5kbGVWaXNpYmxlLFxuICAgIGhhbmRsZUFjdGl2ZUJnOiB0b2tlbi5jb2xvckZpbGxBbHRlcixcbiAgICBoYW5kbGVCZzogdG9rZW4uY29sb3JCZ0NvbnRhaW5lcixcbiAgICBmaWxsZWRIYW5kbGVCZzogbmV3IEZhc3RDb2xvcih0b2tlbi5jb2xvckZpbGxTZWNvbmRhcnkpLm9uQmFja2dyb3VuZCh0b2tlbi5jb2xvckJnQ29udGFpbmVyKS50b0hleFN0cmluZygpLFxuICAgIGhhbmRsZUhvdmVyQ29sb3I6IHRva2VuLmNvbG9yUHJpbWFyeSxcbiAgICBoYW5kbGVCb3JkZXJDb2xvcjogdG9rZW4uY29sb3JCb3JkZXIsXG4gICAgaGFuZGxlT3BhY2l0eTogaGFuZGxlVmlzaWJsZSA9PT0gdHJ1ZSA/IDEgOiAwLFxuICAgIGhhbmRsZVZpc2libGVXaWR0aDogaGFuZGxlVmlzaWJsZSA9PT0gdHJ1ZSA/IGhhbmRsZVdpZHRoIDogMFxuICB9KTtcbn07IiwgImltcG9ydCB7IHVuaXQgfSBmcm9tICdAYW50LWRlc2lnbi9jc3NpbmpzJztcbmltcG9ydCB7IGdlbkJhc2ljSW5wdXRTdHlsZSwgZ2VuSW5wdXRHcm91cFN0eWxlLCBnZW5QbGFjZWhvbGRlclN0eWxlLCBpbml0SW5wdXRUb2tlbiB9IGZyb20gJy4uLy4uL2lucHV0L3N0eWxlJztcbmltcG9ydCB7IGdlbkJvcmRlcmxlc3NTdHlsZSwgZ2VuRmlsbGVkR3JvdXBTdHlsZSwgZ2VuRmlsbGVkU3R5bGUsIGdlbk91dGxpbmVkR3JvdXBTdHlsZSwgZ2VuT3V0bGluZWRTdHlsZSwgZ2VuVW5kZXJsaW5lZFN0eWxlIH0gZnJvbSAnLi4vLi4vaW5wdXQvc3R5bGUvdmFyaWFudHMnO1xuaW1wb3J0IHsgcmVzZXRDb21wb25lbnQsIHJlc2V0SWNvbiB9IGZyb20gJy4uLy4uL3N0eWxlJztcbmltcG9ydCB7IGdlbkNvbXBhY3RJdGVtU3R5bGUgfSBmcm9tICcuLi8uLi9zdHlsZS9jb21wYWN0LWl0ZW0nO1xuaW1wb3J0IHsgZ2VuU3R5bGVIb29rcywgbWVyZ2VUb2tlbiB9IGZyb20gJy4uLy4uL3RoZW1lL2ludGVybmFsJztcbmltcG9ydCB7IHByZXBhcmVDb21wb25lbnRUb2tlbiB9IGZyb20gJy4vdG9rZW4nO1xuZXhwb3J0IGNvbnN0IGdlblJhZGl1c1N0eWxlID0gKF9yZWYsIHNpemUpID0+IHtcbiAgbGV0IHtcbiAgICBjb21wb25lbnRDbHMsXG4gICAgYm9yZGVyUmFkaXVzU00sXG4gICAgYm9yZGVyUmFkaXVzTEdcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IGJvcmRlclJhZGl1cyA9IHNpemUgPT09ICdsZycgPyBib3JkZXJSYWRpdXNMRyA6IGJvcmRlclJhZGl1c1NNO1xuICByZXR1cm4ge1xuICAgIFtgJi0ke3NpemV9YF06IHtcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWhhbmRsZXItd3JhcGBdOiB7XG4gICAgICAgIGJvcmRlclN0YXJ0RW5kUmFkaXVzOiBib3JkZXJSYWRpdXMsXG4gICAgICAgIGJvcmRlckVuZEVuZFJhZGl1czogYm9yZGVyUmFkaXVzXG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30taGFuZGxlci11cGBdOiB7XG4gICAgICAgIGJvcmRlclN0YXJ0RW5kUmFkaXVzOiBib3JkZXJSYWRpdXNcbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1oYW5kbGVyLWRvd25gXToge1xuICAgICAgICBib3JkZXJFbmRFbmRSYWRpdXM6IGJvcmRlclJhZGl1c1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG5jb25zdCBnZW5JbnB1dE51bWJlclN0eWxlcyA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENscyxcbiAgICBsaW5lV2lkdGgsXG4gICAgbGluZVR5cGUsXG4gICAgYm9yZGVyUmFkaXVzLFxuICAgIGlucHV0Rm9udFNpemVTTSxcbiAgICBpbnB1dEZvbnRTaXplTEcsXG4gICAgY29udHJvbEhlaWdodExHLFxuICAgIGNvbnRyb2xIZWlnaHRTTSxcbiAgICBjb2xvckVycm9yLFxuICAgIHBhZGRpbmdJbmxpbmVTTSxcbiAgICBwYWRkaW5nQmxvY2tTTSxcbiAgICBwYWRkaW5nQmxvY2tMRyxcbiAgICBwYWRkaW5nSW5saW5lTEcsXG4gICAgY29sb3JUZXh0RGVzY3JpcHRpb24sXG4gICAgbW90aW9uRHVyYXRpb25NaWQsXG4gICAgaGFuZGxlSG92ZXJDb2xvcixcbiAgICBoYW5kbGVPcGFjaXR5LFxuICAgIHBhZGRpbmdJbmxpbmUsXG4gICAgcGFkZGluZ0Jsb2NrLFxuICAgIGhhbmRsZUJnLFxuICAgIGhhbmRsZUFjdGl2ZUJnLFxuICAgIGNvbG9yVGV4dERpc2FibGVkLFxuICAgIGJvcmRlclJhZGl1c1NNLFxuICAgIGJvcmRlclJhZGl1c0xHLFxuICAgIGNvbnRyb2xXaWR0aCxcbiAgICBoYW5kbGVCb3JkZXJDb2xvcixcbiAgICBmaWxsZWRIYW5kbGVCZyxcbiAgICBsaW5lSGVpZ2h0TEcsXG4gICAgY2FsY1xuICB9ID0gdG9rZW47XG4gIHJldHVybiBbe1xuICAgIFtjb21wb25lbnRDbHNdOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlc2V0Q29tcG9uZW50KHRva2VuKSksIGdlbkJhc2ljSW5wdXRTdHlsZSh0b2tlbikpLCB7XG4gICAgICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJyxcbiAgICAgIHdpZHRoOiBjb250cm9sV2lkdGgsXG4gICAgICBtYXJnaW46IDAsXG4gICAgICBwYWRkaW5nOiAwLFxuICAgICAgYm9yZGVyUmFkaXVzXG4gICAgfSksIGdlbk91dGxpbmVkU3R5bGUodG9rZW4sIHtcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWhhbmRsZXItd3JhcGBdOiB7XG4gICAgICAgIGJhY2tncm91bmQ6IGhhbmRsZUJnLFxuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1oYW5kbGVyLWRvd25gXToge1xuICAgICAgICAgIGJvcmRlckJsb2NrU3RhcnQ6IGAke3VuaXQobGluZVdpZHRoKX0gJHtsaW5lVHlwZX0gJHtoYW5kbGVCb3JkZXJDb2xvcn1gXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSksIGdlbkZpbGxlZFN0eWxlKHRva2VuLCB7XG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1oYW5kbGVyLXdyYXBgXToge1xuICAgICAgICBiYWNrZ3JvdW5kOiBmaWxsZWRIYW5kbGVCZyxcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30taGFuZGxlci1kb3duYF06IHtcbiAgICAgICAgICBib3JkZXJCbG9ja1N0YXJ0OiBgJHt1bml0KGxpbmVXaWR0aCl9ICR7bGluZVR5cGV9ICR7aGFuZGxlQm9yZGVyQ29sb3J9YFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgJyY6Zm9jdXMtd2l0aGluJzoge1xuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1oYW5kbGVyLXdyYXBgXToge1xuICAgICAgICAgIGJhY2tncm91bmQ6IGhhbmRsZUJnXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSksIGdlblVuZGVybGluZWRTdHlsZSh0b2tlbiwge1xuICAgICAgW2Ake2NvbXBvbmVudENsc30taGFuZGxlci13cmFwYF06IHtcbiAgICAgICAgYmFja2dyb3VuZDogaGFuZGxlQmcsXG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LWhhbmRsZXItZG93bmBdOiB7XG4gICAgICAgICAgYm9yZGVyQmxvY2tTdGFydDogYCR7dW5pdChsaW5lV2lkdGgpfSAke2xpbmVUeXBlfSAke2hhbmRsZUJvcmRlckNvbG9yfWBcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKSwgZ2VuQm9yZGVybGVzc1N0eWxlKHRva2VuKSksIHtcbiAgICAgICcmLXJ0bCc6IHtcbiAgICAgICAgZGlyZWN0aW9uOiAncnRsJyxcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30taW5wdXRgXToge1xuICAgICAgICAgIGRpcmVjdGlvbjogJ3J0bCdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICcmLWxnJzoge1xuICAgICAgICBwYWRkaW5nOiAwLFxuICAgICAgICBmb250U2l6ZTogaW5wdXRGb250U2l6ZUxHLFxuICAgICAgICBsaW5lSGVpZ2h0OiBsaW5lSGVpZ2h0TEcsXG4gICAgICAgIGJvcmRlclJhZGl1czogYm9yZGVyUmFkaXVzTEcsXG4gICAgICAgIFtgaW5wdXQke2NvbXBvbmVudENsc30taW5wdXRgXToge1xuICAgICAgICAgIGhlaWdodDogY2FsYyhjb250cm9sSGVpZ2h0TEcpLnN1YihjYWxjKGxpbmVXaWR0aCkubXVsKDIpKS5lcXVhbCgpLFxuICAgICAgICAgIHBhZGRpbmc6IGAke3VuaXQocGFkZGluZ0Jsb2NrTEcpfSAke3VuaXQocGFkZGluZ0lubGluZUxHKX1gXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAnJi1zbSc6IHtcbiAgICAgICAgcGFkZGluZzogMCxcbiAgICAgICAgZm9udFNpemU6IGlucHV0Rm9udFNpemVTTSxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiBib3JkZXJSYWRpdXNTTSxcbiAgICAgICAgW2BpbnB1dCR7Y29tcG9uZW50Q2xzfS1pbnB1dGBdOiB7XG4gICAgICAgICAgaGVpZ2h0OiBjYWxjKGNvbnRyb2xIZWlnaHRTTSkuc3ViKGNhbGMobGluZVdpZHRoKS5tdWwoMikpLmVxdWFsKCksXG4gICAgICAgICAgcGFkZGluZzogYCR7dW5pdChwYWRkaW5nQmxvY2tTTSl9ICR7dW5pdChwYWRkaW5nSW5saW5lU00pfWBcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PSBPdXQgT2YgUmFuZ2UgPT09PT09PT09PT09PT09PT09PT09XG4gICAgICAnJi1vdXQtb2YtcmFuZ2UnOiB7XG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LWlucHV0LXdyYXBgXToge1xuICAgICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgICBjb2xvcjogY29sb3JFcnJvclxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIFN0eWxlIGZvciBpbnB1dC1ncm91cDogaW5wdXQgd2l0aCBsYWJlbCwgd2l0aCBidXR0b24gb3IgZHJvcGRvd24uLi5cbiAgICAgICcmLWdyb3VwJzogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlc2V0Q29tcG9uZW50KHRva2VuKSksIGdlbklucHV0R3JvdXBTdHlsZSh0b2tlbikpLCB7XG4gICAgICAgICcmLXdyYXBwZXInOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICAgICAgdGV4dEFsaWduOiAnc3RhcnQnLFxuICAgICAgICAgIHZlcnRpY2FsQWxpZ246ICd0b3AnLFxuICAgICAgICAgIFtgJHtjb21wb25lbnRDbHN9LWFmZml4LXdyYXBwZXJgXToge1xuICAgICAgICAgICAgd2lkdGg6ICcxMDAlJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgLy8gU2l6ZVxuICAgICAgICAgICcmLWxnJzoge1xuICAgICAgICAgICAgW2Ake2NvbXBvbmVudENsc30tZ3JvdXAtYWRkb25gXToge1xuICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IGJvcmRlclJhZGl1c0xHLFxuICAgICAgICAgICAgICBmb250U2l6ZTogdG9rZW4uZm9udFNpemVMR1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgJyYtc20nOiB7XG4gICAgICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1ncm91cC1hZGRvbmBdOiB7XG4gICAgICAgICAgICAgIGJvcmRlclJhZGl1czogYm9yZGVyUmFkaXVzU01cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIGdlbk91dGxpbmVkR3JvdXBTdHlsZSh0b2tlbikpLCBnZW5GaWxsZWRHcm91cFN0eWxlKHRva2VuKSksIHtcbiAgICAgICAgICAvLyBGaXggdGhlIGlzc3VlIG9mIHVzaW5nIGljb25zIGluIFNwYWNlIENvbXBhY3QgbW9kZVxuICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzQ1NzY0XG4gICAgICAgICAgW2AmOm5vdCgke2NvbXBvbmVudENsc30tY29tcGFjdC1maXJzdC1pdGVtKTpub3QoJHtjb21wb25lbnRDbHN9LWNvbXBhY3QtbGFzdC1pdGVtKSR7Y29tcG9uZW50Q2xzfS1jb21wYWN0LWl0ZW1gXToge1xuICAgICAgICAgICAgW2Ake2NvbXBvbmVudENsc30sICR7Y29tcG9uZW50Q2xzfS1ncm91cC1hZGRvbmBdOiB7XG4gICAgICAgICAgICAgIGJvcmRlclJhZGl1czogMFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgW2AmOm5vdCgke2NvbXBvbmVudENsc30tY29tcGFjdC1sYXN0LWl0ZW0pJHtjb21wb25lbnRDbHN9LWNvbXBhY3QtZmlyc3QtaXRlbWBdOiB7XG4gICAgICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfSwgJHtjb21wb25lbnRDbHN9LWdyb3VwLWFkZG9uYF06IHtcbiAgICAgICAgICAgICAgYm9yZGVyU3RhcnRFbmRSYWRpdXM6IDAsXG4gICAgICAgICAgICAgIGJvcmRlckVuZEVuZFJhZGl1czogMFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgW2AmOm5vdCgke2NvbXBvbmVudENsc30tY29tcGFjdC1maXJzdC1pdGVtKSR7Y29tcG9uZW50Q2xzfS1jb21wYWN0LWxhc3QtaXRlbWBdOiB7XG4gICAgICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfSwgJHtjb21wb25lbnRDbHN9LWdyb3VwLWFkZG9uYF06IHtcbiAgICAgICAgICAgICAgYm9yZGVyU3RhcnRTdGFydFJhZGl1czogMCxcbiAgICAgICAgICAgICAgYm9yZGVyRW5kU3RhcnRSYWRpdXM6IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9KSxcbiAgICAgIFtgJi1kaXNhYmxlZCAke2NvbXBvbmVudENsc30taW5wdXRgXToge1xuICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCdcbiAgICAgIH0sXG4gICAgICBbY29tcG9uZW50Q2xzXToge1xuICAgICAgICAnJi1pbnB1dCc6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlc2V0Q29tcG9uZW50KHRva2VuKSksIHtcbiAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgIHBhZGRpbmc6IGAke3VuaXQocGFkZGluZ0Jsb2NrKX0gJHt1bml0KHBhZGRpbmdJbmxpbmUpfWAsXG4gICAgICAgICAgdGV4dEFsaWduOiAnc3RhcnQnLFxuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgICBib3JkZXI6IDAsXG4gICAgICAgICAgYm9yZGVyUmFkaXVzLFxuICAgICAgICAgIG91dGxpbmU6IDAsXG4gICAgICAgICAgdHJhbnNpdGlvbjogYGFsbCAke21vdGlvbkR1cmF0aW9uTWlkfSBsaW5lYXJgLFxuICAgICAgICAgIGFwcGVhcmFuY2U6ICd0ZXh0ZmllbGQnLFxuICAgICAgICAgIGZvbnRTaXplOiAnaW5oZXJpdCdcbiAgICAgICAgfSksIGdlblBsYWNlaG9sZGVyU3R5bGUodG9rZW4uY29sb3JUZXh0UGxhY2Vob2xkZXIpKSwge1xuICAgICAgICAgICcmW3R5cGU9XCJudW1iZXJcIl06Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24sICZbdHlwZT1cIm51bWJlclwiXTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbic6IHtcbiAgICAgICAgICAgIG1hcmdpbjogMCxcbiAgICAgICAgICAgIGFwcGVhcmFuY2U6ICdub25lJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0sXG4gICAgICBbYCY6aG92ZXIgJHtjb21wb25lbnRDbHN9LWhhbmRsZXItd3JhcCwgJi1mb2N1c2VkICR7Y29tcG9uZW50Q2xzfS1oYW5kbGVyLXdyYXBgXToge1xuICAgICAgICB3aWR0aDogdG9rZW4uaGFuZGxlV2lkdGgsXG4gICAgICAgIG9wYWNpdHk6IDFcbiAgICAgIH1cbiAgICB9KVxuICB9LFxuICAvLyBIYW5kbGVyXG4gIHtcbiAgICBbY29tcG9uZW50Q2xzXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe1xuICAgICAgW2Ake2NvbXBvbmVudENsc30taGFuZGxlci13cmFwYF06IHtcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgIGluc2V0QmxvY2tTdGFydDogMCxcbiAgICAgICAgaW5zZXRJbmxpbmVFbmQ6IDAsXG4gICAgICAgIHdpZHRoOiB0b2tlbi5oYW5kbGVWaXNpYmxlV2lkdGgsXG4gICAgICAgIG9wYWNpdHk6IGhhbmRsZU9wYWNpdHksXG4gICAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgICBib3JkZXJTdGFydFN0YXJ0UmFkaXVzOiAwLFxuICAgICAgICBib3JkZXJTdGFydEVuZFJhZGl1czogYm9yZGVyUmFkaXVzLFxuICAgICAgICBib3JkZXJFbmRFbmRSYWRpdXM6IGJvcmRlclJhZGl1cyxcbiAgICAgICAgYm9yZGVyRW5kU3RhcnRSYWRpdXM6IDAsXG4gICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsXG4gICAgICAgIGFsaWduSXRlbXM6ICdzdHJldGNoJyxcbiAgICAgICAgdHJhbnNpdGlvbjogYGFsbCAke21vdGlvbkR1cmF0aW9uTWlkfWAsXG4gICAgICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICAgICAgLy8gRml4IGlucHV0IG51bWJlciBpbnNpZGUgTWVudSBtYWtlcyBpY29uIHRvbyBsYXJnZVxuICAgICAgICAvLyBXZSBhcmlzZSB0aGUgc2VsZWN0b3IgcHJpb3JpdHkgYnkgbmVzdCBzZWxlY3RvciBoZXJlXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzE0MzY3XG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LWhhbmRsZXJgXToge1xuICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsXG4gICAgICAgICAgZmxleDogJ2F1dG8nLFxuICAgICAgICAgIGhlaWdodDogJzQwJScsXG4gICAgICAgICAgW2BcbiAgICAgICAgICAgICAgJHtjb21wb25lbnRDbHN9LWhhbmRsZXItdXAtaW5uZXIsXG4gICAgICAgICAgICAgICR7Y29tcG9uZW50Q2xzfS1oYW5kbGVyLWRvd24taW5uZXJcbiAgICAgICAgICAgIGBdOiB7XG4gICAgICAgICAgICBtYXJnaW5JbmxpbmVFbmQ6IDAsXG4gICAgICAgICAgICBmb250U2l6ZTogdG9rZW4uaGFuZGxlRm9udFNpemVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1oYW5kbGVyYF06IHtcbiAgICAgICAgaGVpZ2h0OiAnNTAlJyxcbiAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgICBjb2xvcjogY29sb3JUZXh0RGVzY3JpcHRpb24sXG4gICAgICAgIGZvbnRXZWlnaHQ6ICdib2xkJyxcbiAgICAgICAgbGluZUhlaWdodDogMCxcbiAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgICAgIGJvcmRlcklubGluZVN0YXJ0OiBgJHt1bml0KGxpbmVXaWR0aCl9ICR7bGluZVR5cGV9ICR7aGFuZGxlQm9yZGVyQ29sb3J9YCxcbiAgICAgICAgdHJhbnNpdGlvbjogYGFsbCAke21vdGlvbkR1cmF0aW9uTWlkfSBsaW5lYXJgLFxuICAgICAgICAnJjphY3RpdmUnOiB7XG4gICAgICAgICAgYmFja2dyb3VuZDogaGFuZGxlQWN0aXZlQmdcbiAgICAgICAgfSxcbiAgICAgICAgLy8gSG92ZXJcbiAgICAgICAgJyY6aG92ZXInOiB7XG4gICAgICAgICAgaGVpZ2h0OiBgNjAlYCxcbiAgICAgICAgICBbYFxuICAgICAgICAgICAgICAke2NvbXBvbmVudENsc30taGFuZGxlci11cC1pbm5lcixcbiAgICAgICAgICAgICAgJHtjb21wb25lbnRDbHN9LWhhbmRsZXItZG93bi1pbm5lclxuICAgICAgICAgICAgYF06IHtcbiAgICAgICAgICAgIGNvbG9yOiBoYW5kbGVIb3ZlckNvbG9yXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAnJi11cC1pbm5lciwgJi1kb3duLWlubmVyJzogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXNldEljb24oKSksIHtcbiAgICAgICAgICBjb2xvcjogY29sb3JUZXh0RGVzY3JpcHRpb24sXG4gICAgICAgICAgdHJhbnNpdGlvbjogYGFsbCAke21vdGlvbkR1cmF0aW9uTWlkfSBsaW5lYXJgLFxuICAgICAgICAgIHVzZXJTZWxlY3Q6ICdub25lJ1xuICAgICAgICB9KVxuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWhhbmRsZXItdXBgXToge1xuICAgICAgICBib3JkZXJTdGFydEVuZFJhZGl1czogYm9yZGVyUmFkaXVzXG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30taGFuZGxlci1kb3duYF06IHtcbiAgICAgICAgYm9yZGVyRW5kRW5kUmFkaXVzOiBib3JkZXJSYWRpdXNcbiAgICAgIH1cbiAgICB9LCBnZW5SYWRpdXNTdHlsZSh0b2tlbiwgJ2xnJykpLCBnZW5SYWRpdXNTdHlsZSh0b2tlbiwgJ3NtJykpLCB7XG4gICAgICAvLyBEaXNhYmxlZFxuICAgICAgJyYtZGlzYWJsZWQsICYtcmVhZG9ubHknOiB7XG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LWhhbmRsZXItd3JhcGBdOiB7XG4gICAgICAgICAgZGlzcGxheTogJ25vbmUnXG4gICAgICAgIH0sXG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LWlucHV0YF06IHtcbiAgICAgICAgICBjb2xvcjogJ2luaGVyaXQnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbYFxuICAgICAgICAgICR7Y29tcG9uZW50Q2xzfS1oYW5kbGVyLXVwLWRpc2FibGVkLFxuICAgICAgICAgICR7Y29tcG9uZW50Q2xzfS1oYW5kbGVyLWRvd24tZGlzYWJsZWRcbiAgICAgICAgYF06IHtcbiAgICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQnXG4gICAgICB9LFxuICAgICAgW2BcbiAgICAgICAgICAke2NvbXBvbmVudENsc30taGFuZGxlci11cC1kaXNhYmxlZDpob3ZlciAmLWhhbmRsZXItdXAtaW5uZXIsXG4gICAgICAgICAgJHtjb21wb25lbnRDbHN9LWhhbmRsZXItZG93bi1kaXNhYmxlZDpob3ZlciAmLWhhbmRsZXItZG93bi1pbm5lclxuICAgICAgICBgXToge1xuICAgICAgICBjb2xvcjogY29sb3JUZXh0RGlzYWJsZWRcbiAgICAgIH1cbiAgICB9KVxuICB9XTtcbn07XG5jb25zdCBnZW5BZmZpeFdyYXBwZXJTdHlsZXMgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHMsXG4gICAgcGFkZGluZ0Jsb2NrLFxuICAgIHBhZGRpbmdJbmxpbmUsXG4gICAgaW5wdXRBZmZpeFBhZGRpbmcsXG4gICAgY29udHJvbFdpZHRoLFxuICAgIGJvcmRlclJhZGl1c0xHLFxuICAgIGJvcmRlclJhZGl1c1NNLFxuICAgIHBhZGRpbmdJbmxpbmVMRyxcbiAgICBwYWRkaW5nSW5saW5lU00sXG4gICAgcGFkZGluZ0Jsb2NrTEcsXG4gICAgcGFkZGluZ0Jsb2NrU00sXG4gICAgbW90aW9uRHVyYXRpb25NaWRcbiAgfSA9IHRva2VuO1xuICByZXR1cm4ge1xuICAgIFtgJHtjb21wb25lbnRDbHN9LWFmZml4LXdyYXBwZXJgXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHtcbiAgICAgIFtgaW5wdXQke2NvbXBvbmVudENsc30taW5wdXRgXToge1xuICAgICAgICBwYWRkaW5nOiBgJHt1bml0KHBhZGRpbmdCbG9jayl9IDBgXG4gICAgICB9XG4gICAgfSwgZ2VuQmFzaWNJbnB1dFN0eWxlKHRva2VuKSksIHtcbiAgICAgIC8vIG9yIG51bWJlciBoYW5kbGVyIHdpbGwgY292ZXIgZm9ybSBzdGF0dXNcbiAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgZGlzcGxheTogJ2lubGluZS1mbGV4JyxcbiAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgd2lkdGg6IGNvbnRyb2xXaWR0aCxcbiAgICAgIHBhZGRpbmc6IDAsXG4gICAgICBwYWRkaW5nSW5saW5lU3RhcnQ6IHBhZGRpbmdJbmxpbmUsXG4gICAgICAnJi1sZyc6IHtcbiAgICAgICAgYm9yZGVyUmFkaXVzOiBib3JkZXJSYWRpdXNMRyxcbiAgICAgICAgcGFkZGluZ0lubGluZVN0YXJ0OiBwYWRkaW5nSW5saW5lTEcsXG4gICAgICAgIFtgaW5wdXQke2NvbXBvbmVudENsc30taW5wdXRgXToge1xuICAgICAgICAgIHBhZGRpbmc6IGAke3VuaXQocGFkZGluZ0Jsb2NrTEcpfSAwYFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgJyYtc20nOiB7XG4gICAgICAgIGJvcmRlclJhZGl1czogYm9yZGVyUmFkaXVzU00sXG4gICAgICAgIHBhZGRpbmdJbmxpbmVTdGFydDogcGFkZGluZ0lubGluZVNNLFxuICAgICAgICBbYGlucHV0JHtjb21wb25lbnRDbHN9LWlucHV0YF06IHtcbiAgICAgICAgICBwYWRkaW5nOiBgJHt1bml0KHBhZGRpbmdCbG9ja1NNKX0gMGBcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtgJjpub3QoJHtjb21wb25lbnRDbHN9LWRpc2FibGVkKTpob3ZlcmBdOiB7XG4gICAgICAgIHpJbmRleDogMVxuICAgICAgfSxcbiAgICAgICcmLWZvY3VzZWQsICY6Zm9jdXMnOiB7XG4gICAgICAgIHpJbmRleDogMVxuICAgICAgfSxcbiAgICAgIFtgJi1kaXNhYmxlZCA+ICR7Y29tcG9uZW50Q2xzfS1kaXNhYmxlZGBdOiB7XG4gICAgICAgIGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCdcbiAgICAgIH0sXG4gICAgICBbYD4gZGl2JHtjb21wb25lbnRDbHN9YF06IHtcbiAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgYm9yZGVyOiAnbm9uZScsXG4gICAgICAgIG91dGxpbmU6ICdub25lJyxcbiAgICAgICAgW2AmJHtjb21wb25lbnRDbHN9LWZvY3VzZWRgXToge1xuICAgICAgICAgIGJveFNoYWRvdzogJ25vbmUgIWltcG9ydGFudCdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICcmOjpiZWZvcmUnOiB7XG4gICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgdmlzaWJpbGl0eTogJ2hpZGRlbicsXG4gICAgICAgIGNvbnRlbnQ6ICdcIlxcXFxhMFwiJ1xuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWhhbmRsZXItd3JhcGBdOiB7XG4gICAgICAgIHpJbmRleDogMlxuICAgICAgfSxcbiAgICAgIFtjb21wb25lbnRDbHNdOiB7XG4gICAgICAgIHBvc2l0aW9uOiAnc3RhdGljJyxcbiAgICAgICAgY29sb3I6ICdpbmhlcml0JyxcbiAgICAgICAgJyYtcHJlZml4LCAmLXN1ZmZpeCc6IHtcbiAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgZmxleDogJ25vbmUnLFxuICAgICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJ1xuICAgICAgICB9LFxuICAgICAgICAnJi1wcmVmaXgnOiB7XG4gICAgICAgICAgbWFyZ2luSW5saW5lRW5kOiBpbnB1dEFmZml4UGFkZGluZ1xuICAgICAgICB9LFxuICAgICAgICAnJi1zdWZmaXgnOiB7XG4gICAgICAgICAgaW5zZXRCbG9ja1N0YXJ0OiAwLFxuICAgICAgICAgIGluc2V0SW5saW5lRW5kOiAwLFxuICAgICAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgICAgIG1hcmdpbklubGluZUVuZDogcGFkZGluZ0lubGluZSxcbiAgICAgICAgICBtYXJnaW5JbmxpbmVTdGFydDogaW5wdXRBZmZpeFBhZGRpbmcsXG4gICAgICAgICAgdHJhbnNpdGlvbjogYG1hcmdpbiAke21vdGlvbkR1cmF0aW9uTWlkfWBcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtgJjpob3ZlciAke2NvbXBvbmVudENsc30taGFuZGxlci13cmFwLCAmLWZvY3VzZWQgJHtjb21wb25lbnRDbHN9LWhhbmRsZXItd3JhcGBdOiB7XG4gICAgICAgIHdpZHRoOiB0b2tlbi5oYW5kbGVXaWR0aCxcbiAgICAgICAgb3BhY2l0eTogMVxuICAgICAgfSxcbiAgICAgIFtgJjpub3QoJHtjb21wb25lbnRDbHN9LWFmZml4LXdyYXBwZXItd2l0aG91dC1jb250cm9scyk6aG92ZXIgJHtjb21wb25lbnRDbHN9LXN1ZmZpeGBdOiB7XG4gICAgICAgIG1hcmdpbklubGluZUVuZDogdG9rZW4uY2FsYyh0b2tlbi5oYW5kbGVXaWR0aCkuYWRkKHBhZGRpbmdJbmxpbmUpLmVxdWFsKClcbiAgICAgIH1cbiAgICB9KVxuICB9O1xufTtcbmV4cG9ydCBkZWZhdWx0IGdlblN0eWxlSG9va3MoJ0lucHV0TnVtYmVyJywgdG9rZW4gPT4ge1xuICBjb25zdCBpbnB1dE51bWJlclRva2VuID0gbWVyZ2VUb2tlbih0b2tlbiwgaW5pdElucHV0VG9rZW4odG9rZW4pKTtcbiAgcmV0dXJuIFtnZW5JbnB1dE51bWJlclN0eWxlcyhpbnB1dE51bWJlclRva2VuKSwgZ2VuQWZmaXhXcmFwcGVyU3R5bGVzKGlucHV0TnVtYmVyVG9rZW4pLFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyA9PSAgICAgICAgICAgICBTcGFjZSBDb21wYWN0ICAgICAgICAgICAgICAgICAgICAgICA9PVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBnZW5Db21wYWN0SXRlbVN0eWxlKGlucHV0TnVtYmVyVG9rZW4pXTtcbn0sIHByZXBhcmVDb21wb25lbnRUb2tlbiwge1xuICB1bml0bGVzczoge1xuICAgIGhhbmRsZU9wYWNpdHk6IHRydWVcbiAgfVxufSk7IiwgIlwidXNlIGNsaWVudFwiO1xuXG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IFJlYWN0LCB7IGZvcndhcmRSZWYsIHVzZUNvbnRleHQsIHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUmNJbnB1dCBmcm9tICdyYy1pbnB1dCc7XG5pbXBvcnQgeyB0cmlnZ2VyRm9jdXMgfSBmcm9tIFwicmMtaW5wdXQvZXMvdXRpbHMvY29tbW9uVXRpbHNcIjtcbmltcG9ydCB7IGNvbXBvc2VSZWYgfSBmcm9tIFwicmMtdXRpbC9lcy9yZWZcIjtcbmltcG9ydCBDb250ZXh0SXNvbGF0b3IgZnJvbSAnLi4vX3V0aWwvQ29udGV4dElzb2xhdG9yJztcbmltcG9ydCBnZXRBbGxvd0NsZWFyIGZyb20gJy4uL191dGlsL2dldEFsbG93Q2xlYXInO1xuaW1wb3J0IHsgZ2V0TWVyZ2VkU3RhdHVzLCBnZXRTdGF0dXNDbGFzc05hbWVzIH0gZnJvbSAnLi4vX3V0aWwvc3RhdHVzVXRpbHMnO1xuaW1wb3J0IHsgZGV2VXNlV2FybmluZyB9IGZyb20gJy4uL191dGlsL3dhcm5pbmcnO1xuaW1wb3J0IHsgdXNlQ29tcG9uZW50Q29uZmlnIH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL2NvbnRleHQnO1xuaW1wb3J0IERpc2FibGVkQ29udGV4dCBmcm9tICcuLi9jb25maWctcHJvdmlkZXIvRGlzYWJsZWRDb250ZXh0JztcbmltcG9ydCB1c2VDU1NWYXJDbHMgZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL2hvb2tzL3VzZUNTU1ZhckNscyc7XG5pbXBvcnQgdXNlU2l6ZSBmcm9tICcuLi9jb25maWctcHJvdmlkZXIvaG9va3MvdXNlU2l6ZSc7XG5pbXBvcnQgeyBGb3JtSXRlbUlucHV0Q29udGV4dCB9IGZyb20gJy4uL2Zvcm0vY29udGV4dCc7XG5pbXBvcnQgdXNlVmFyaWFudCBmcm9tICcuLi9mb3JtL2hvb2tzL3VzZVZhcmlhbnRzJztcbmltcG9ydCB7IHVzZUNvbXBhY3RJdGVtQ29udGV4dCB9IGZyb20gJy4uL3NwYWNlL0NvbXBhY3QnO1xuaW1wb3J0IHVzZVJlbW92ZVBhc3N3b3JkVGltZW91dCBmcm9tICcuL2hvb2tzL3VzZVJlbW92ZVBhc3N3b3JkVGltZW91dCc7XG5pbXBvcnQgdXNlU3R5bGUsIHsgdXNlU2hhcmVkU3R5bGUgfSBmcm9tICcuL3N0eWxlJztcbmltcG9ydCB7IGhhc1ByZWZpeFN1ZmZpeCB9IGZyb20gJy4vdXRpbHMnO1xuZXhwb3J0IHsgdHJpZ2dlckZvY3VzIH07XG5jb25zdCBJbnB1dCA9IC8qI19fUFVSRV9fKi9mb3J3YXJkUmVmKChwcm9wcywgcmVmKSA9PiB7XG4gIGNvbnN0IHtcbiAgICAgIHByZWZpeENsczogY3VzdG9taXplUHJlZml4Q2xzLFxuICAgICAgYm9yZGVyZWQgPSB0cnVlLFxuICAgICAgc3RhdHVzOiBjdXN0b21TdGF0dXMsXG4gICAgICBzaXplOiBjdXN0b21TaXplLFxuICAgICAgZGlzYWJsZWQ6IGN1c3RvbURpc2FibGVkLFxuICAgICAgb25CbHVyLFxuICAgICAgb25Gb2N1cyxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIGFsbG93Q2xlYXIsXG4gICAgICBhZGRvbkFmdGVyLFxuICAgICAgYWRkb25CZWZvcmUsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBzdHlsZSxcbiAgICAgIHN0eWxlcyxcbiAgICAgIHJvb3RDbGFzc05hbWUsXG4gICAgICBvbkNoYW5nZSxcbiAgICAgIGNsYXNzTmFtZXM6IGNsYXNzZXMsXG4gICAgICB2YXJpYW50OiBjdXN0b21WYXJpYW50XG4gICAgfSA9IHByb3BzLFxuICAgIHJlc3QgPSBfX3Jlc3QocHJvcHMsIFtcInByZWZpeENsc1wiLCBcImJvcmRlcmVkXCIsIFwic3RhdHVzXCIsIFwic2l6ZVwiLCBcImRpc2FibGVkXCIsIFwib25CbHVyXCIsIFwib25Gb2N1c1wiLCBcInN1ZmZpeFwiLCBcImFsbG93Q2xlYXJcIiwgXCJhZGRvbkFmdGVyXCIsIFwiYWRkb25CZWZvcmVcIiwgXCJjbGFzc05hbWVcIiwgXCJzdHlsZVwiLCBcInN0eWxlc1wiLCBcInJvb3RDbGFzc05hbWVcIiwgXCJvbkNoYW5nZVwiLCBcImNsYXNzTmFtZXNcIiwgXCJ2YXJpYW50XCJdKTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBjb25zdCB7XG4gICAgICBkZXByZWNhdGVkXG4gICAgfSA9IGRldlVzZVdhcm5pbmcoJ0lucHV0Jyk7XG4gICAgZGVwcmVjYXRlZCghKCdib3JkZXJlZCcgaW4gcHJvcHMpLCAnYm9yZGVyZWQnLCAndmFyaWFudCcpO1xuICB9XG4gIGNvbnN0IHtcbiAgICBnZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uLFxuICAgIGFsbG93Q2xlYXI6IGNvbnRleHRBbGxvd0NsZWFyLFxuICAgIGF1dG9Db21wbGV0ZTogY29udGV4dEF1dG9Db21wbGV0ZSxcbiAgICBjbGFzc05hbWU6IGNvbnRleHRDbGFzc05hbWUsXG4gICAgc3R5bGU6IGNvbnRleHRTdHlsZSxcbiAgICBjbGFzc05hbWVzOiBjb250ZXh0Q2xhc3NOYW1lcyxcbiAgICBzdHlsZXM6IGNvbnRleHRTdHlsZXNcbiAgfSA9IHVzZUNvbXBvbmVudENvbmZpZygnaW5wdXQnKTtcbiAgY29uc3QgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdpbnB1dCcsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIGNvbnN0IGlucHV0UmVmID0gdXNlUmVmKG51bGwpO1xuICAvLyBTdHlsZVxuICBjb25zdCByb290Q2xzID0gdXNlQ1NTVmFyQ2xzKHByZWZpeENscyk7XG4gIGNvbnN0IFt3cmFwU2hhcmVkQ1NTVmFyLCBoYXNoSWQsIGNzc1ZhckNsc10gPSB1c2VTaGFyZWRTdHlsZShwcmVmaXhDbHMsIHJvb3RDbGFzc05hbWUpO1xuICBjb25zdCBbd3JhcENTU1Zhcl0gPSB1c2VTdHlsZShwcmVmaXhDbHMsIHJvb3RDbHMpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gQ29tcGFjdCBJdGVtID09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCB7XG4gICAgY29tcGFjdFNpemUsXG4gICAgY29tcGFjdEl0ZW1DbGFzc25hbWVzXG4gIH0gPSB1c2VDb21wYWN0SXRlbUNvbnRleHQocHJlZml4Q2xzLCBkaXJlY3Rpb24pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gU2l6ZSA9PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3QgbWVyZ2VkU2l6ZSA9IHVzZVNpemUoY3R4ID0+IHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIChfYSA9IGN1c3RvbVNpemUgIT09IG51bGwgJiYgY3VzdG9tU2l6ZSAhPT0gdm9pZCAwID8gY3VzdG9tU2l6ZSA6IGNvbXBhY3RTaXplKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBjdHg7XG4gIH0pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gRGlzYWJsZWQgPT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IGRpc2FibGVkID0gUmVhY3QudXNlQ29udGV4dChEaXNhYmxlZENvbnRleHQpO1xuICBjb25zdCBtZXJnZWREaXNhYmxlZCA9IGN1c3RvbURpc2FibGVkICE9PSBudWxsICYmIGN1c3RvbURpc2FibGVkICE9PSB2b2lkIDAgPyBjdXN0b21EaXNhYmxlZCA6IGRpc2FibGVkO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gU3RhdHVzID09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCB7XG4gICAgc3RhdHVzOiBjb250ZXh0U3RhdHVzLFxuICAgIGhhc0ZlZWRiYWNrLFxuICAgIGZlZWRiYWNrSWNvblxuICB9ID0gdXNlQ29udGV4dChGb3JtSXRlbUlucHV0Q29udGV4dCk7XG4gIGNvbnN0IG1lcmdlZFN0YXR1cyA9IGdldE1lcmdlZFN0YXR1cyhjb250ZXh0U3RhdHVzLCBjdXN0b21TdGF0dXMpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gRm9jdXMgd2FybmluZyA9PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3QgaW5wdXRIYXNQcmVmaXhTdWZmaXggPSBoYXNQcmVmaXhTdWZmaXgocHJvcHMpIHx8ICEhaGFzRmVlZGJhY2s7XG4gIGNvbnN0IHByZXZIYXNQcmVmaXhTdWZmaXggPSB1c2VSZWYoaW5wdXRIYXNQcmVmaXhTdWZmaXgpO1xuICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1ob29rcy9ydWxlcy1vZi1ob29rcyAqL1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGNvbnN0IHdhcm5pbmcgPSBkZXZVc2VXYXJuaW5nKCdJbnB1dCcpO1xuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICB2YXIgX2E7XG4gICAgICBpZiAoaW5wdXRIYXNQcmVmaXhTdWZmaXggJiYgIXByZXZIYXNQcmVmaXhTdWZmaXguY3VycmVudCkge1xuICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09ICgoX2EgPSBpbnB1dFJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaW5wdXQpLCAndXNhZ2UnLCBgV2hlbiBJbnB1dCBpcyBmb2N1c2VkLCBkeW5hbWljIGFkZCBvciByZW1vdmUgcHJlZml4IC8gc3VmZml4IHdpbGwgbWFrZSBpdCBsb3NlIGZvY3VzIGNhdXNlZCBieSBkb20gc3RydWN0dXJlIGNoYW5nZS4gUmVhZCBtb3JlOiBodHRwczovL2FudC5kZXNpZ24vY29tcG9uZW50cy9pbnB1dC8jRkFRYCkgOiB2b2lkIDA7XG4gICAgICB9XG4gICAgICBwcmV2SGFzUHJlZml4U3VmZml4LmN1cnJlbnQgPSBpbnB1dEhhc1ByZWZpeFN1ZmZpeDtcbiAgICB9LCBbaW5wdXRIYXNQcmVmaXhTdWZmaXhdKTtcbiAgfVxuICAvKiBlc2xpbnQtZW5hYmxlICovXG4gIC8vID09PT09PT09PT09PT09PT09PT09PSBSZW1vdmUgUGFzc3dvcmQgdmFsdWUgPT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IHJlbW92ZVBhc3N3b3JkVGltZW91dCA9IHVzZVJlbW92ZVBhc3N3b3JkVGltZW91dChpbnB1dFJlZiwgdHJ1ZSk7XG4gIGNvbnN0IGhhbmRsZUJsdXIgPSBlID0+IHtcbiAgICByZW1vdmVQYXNzd29yZFRpbWVvdXQoKTtcbiAgICBvbkJsdXIgPT09IG51bGwgfHwgb25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJsdXIoZSk7XG4gIH07XG4gIGNvbnN0IGhhbmRsZUZvY3VzID0gZSA9PiB7XG4gICAgcmVtb3ZlUGFzc3dvcmRUaW1lb3V0KCk7XG4gICAgb25Gb2N1cyA9PT0gbnVsbCB8fCBvbkZvY3VzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkZvY3VzKGUpO1xuICB9O1xuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSBlID0+IHtcbiAgICByZW1vdmVQYXNzd29yZFRpbWVvdXQoKTtcbiAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UoZSk7XG4gIH07XG4gIGNvbnN0IHN1ZmZpeE5vZGUgPSAoaGFzRmVlZGJhY2sgfHwgc3VmZml4KSAmJiAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIHN1ZmZpeCwgaGFzRmVlZGJhY2sgJiYgZmVlZGJhY2tJY29uKSk7XG4gIGNvbnN0IG1lcmdlZEFsbG93Q2xlYXIgPSBnZXRBbGxvd0NsZWFyKGFsbG93Q2xlYXIgIT09IG51bGwgJiYgYWxsb3dDbGVhciAhPT0gdm9pZCAwID8gYWxsb3dDbGVhciA6IGNvbnRleHRBbGxvd0NsZWFyKTtcbiAgY29uc3QgW3ZhcmlhbnQsIGVuYWJsZVZhcmlhbnRDbHNdID0gdXNlVmFyaWFudCgnaW5wdXQnLCBjdXN0b21WYXJpYW50LCBib3JkZXJlZCk7XG4gIHJldHVybiB3cmFwU2hhcmVkQ1NTVmFyKHdyYXBDU1NWYXIoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmNJbnB1dCwgT2JqZWN0LmFzc2lnbih7XG4gICAgcmVmOiBjb21wb3NlUmVmKHJlZiwgaW5wdXRSZWYpLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGF1dG9Db21wbGV0ZTogY29udGV4dEF1dG9Db21wbGV0ZVxuICB9LCByZXN0LCB7XG4gICAgZGlzYWJsZWQ6IG1lcmdlZERpc2FibGVkLFxuICAgIG9uQmx1cjogaGFuZGxlQmx1cixcbiAgICBvbkZvY3VzOiBoYW5kbGVGb2N1cyxcbiAgICBzdHlsZTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjb250ZXh0U3R5bGUpLCBzdHlsZSksXG4gICAgc3R5bGVzOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGNvbnRleHRTdHlsZXMpLCBzdHlsZXMpLFxuICAgIHN1ZmZpeDogc3VmZml4Tm9kZSxcbiAgICBhbGxvd0NsZWFyOiBtZXJnZWRBbGxvd0NsZWFyLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIHJvb3RDbGFzc05hbWUsIGNzc1ZhckNscywgcm9vdENscywgY29tcGFjdEl0ZW1DbGFzc25hbWVzLCBjb250ZXh0Q2xhc3NOYW1lKSxcbiAgICBvbkNoYW5nZTogaGFuZGxlQ2hhbmdlLFxuICAgIGFkZG9uQmVmb3JlOiBhZGRvbkJlZm9yZSAmJiAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29udGV4dElzb2xhdG9yLCB7XG4gICAgICBmb3JtOiB0cnVlLFxuICAgICAgc3BhY2U6IHRydWVcbiAgICB9LCBhZGRvbkJlZm9yZSkpLFxuICAgIGFkZG9uQWZ0ZXI6IGFkZG9uQWZ0ZXIgJiYgKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbnRleHRJc29sYXRvciwge1xuICAgICAgZm9ybTogdHJ1ZSxcbiAgICAgIHNwYWNlOiB0cnVlXG4gICAgfSwgYWRkb25BZnRlcikpLFxuICAgIGNsYXNzTmFtZXM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjbGFzc2VzKSwgY29udGV4dENsYXNzTmFtZXMpLCB7XG4gICAgICBpbnB1dDogY2xhc3NOYW1lcyh7XG4gICAgICAgIFtgJHtwcmVmaXhDbHN9LXNtYF06IG1lcmdlZFNpemUgPT09ICdzbWFsbCcsXG4gICAgICAgIFtgJHtwcmVmaXhDbHN9LWxnYF06IG1lcmdlZFNpemUgPT09ICdsYXJnZScsXG4gICAgICAgIFtgJHtwcmVmaXhDbHN9LXJ0bGBdOiBkaXJlY3Rpb24gPT09ICdydGwnXG4gICAgICB9LCBjbGFzc2VzID09PSBudWxsIHx8IGNsYXNzZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNsYXNzZXMuaW5wdXQsIGNvbnRleHRDbGFzc05hbWVzLmlucHV0LCBoYXNoSWQpLFxuICAgICAgdmFyaWFudDogY2xhc3NOYW1lcyh7XG4gICAgICAgIFtgJHtwcmVmaXhDbHN9LSR7dmFyaWFudH1gXTogZW5hYmxlVmFyaWFudENsc1xuICAgICAgfSwgZ2V0U3RhdHVzQ2xhc3NOYW1lcyhwcmVmaXhDbHMsIG1lcmdlZFN0YXR1cykpLFxuICAgICAgYWZmaXhXcmFwcGVyOiBjbGFzc05hbWVzKHtcbiAgICAgICAgW2Ake3ByZWZpeENsc30tYWZmaXgtd3JhcHBlci1zbWBdOiBtZXJnZWRTaXplID09PSAnc21hbGwnLFxuICAgICAgICBbYCR7cHJlZml4Q2xzfS1hZmZpeC13cmFwcGVyLWxnYF06IG1lcmdlZFNpemUgPT09ICdsYXJnZScsXG4gICAgICAgIFtgJHtwcmVmaXhDbHN9LWFmZml4LXdyYXBwZXItcnRsYF06IGRpcmVjdGlvbiA9PT0gJ3J0bCdcbiAgICAgIH0sIGhhc2hJZCksXG4gICAgICB3cmFwcGVyOiBjbGFzc05hbWVzKHtcbiAgICAgICAgW2Ake3ByZWZpeENsc30tZ3JvdXAtcnRsYF06IGRpcmVjdGlvbiA9PT0gJ3J0bCdcbiAgICAgIH0sIGhhc2hJZCksXG4gICAgICBncm91cFdyYXBwZXI6IGNsYXNzTmFtZXMoe1xuICAgICAgICBbYCR7cHJlZml4Q2xzfS1ncm91cC13cmFwcGVyLXNtYF06IG1lcmdlZFNpemUgPT09ICdzbWFsbCcsXG4gICAgICAgIFtgJHtwcmVmaXhDbHN9LWdyb3VwLXdyYXBwZXItbGdgXTogbWVyZ2VkU2l6ZSA9PT0gJ2xhcmdlJyxcbiAgICAgICAgW2Ake3ByZWZpeENsc30tZ3JvdXAtd3JhcHBlci1ydGxgXTogZGlyZWN0aW9uID09PSAncnRsJyxcbiAgICAgICAgW2Ake3ByZWZpeENsc30tZ3JvdXAtd3JhcHBlci0ke3ZhcmlhbnR9YF06IGVuYWJsZVZhcmlhbnRDbHNcbiAgICAgIH0sIGdldFN0YXR1c0NsYXNzTmFtZXMoYCR7cHJlZml4Q2xzfS1ncm91cC13cmFwcGVyYCwgbWVyZ2VkU3RhdHVzLCBoYXNGZWVkYmFjayksIGhhc2hJZClcbiAgICB9KVxuICB9KSkpKTtcbn0pO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgSW5wdXQuZGlzcGxheU5hbWUgPSAnSW5wdXQnO1xufVxuZXhwb3J0IGRlZmF1bHQgSW5wdXQ7IiwgIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IENsb3NlQ2lyY2xlRmlsbGVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9DbG9zZUNpcmNsZUZpbGxlZFwiO1xuY29uc3QgZ2V0QWxsb3dDbGVhciA9IGFsbG93Q2xlYXIgPT4ge1xuICBsZXQgbWVyZ2VkQWxsb3dDbGVhcjtcbiAgaWYgKHR5cGVvZiBhbGxvd0NsZWFyID09PSAnb2JqZWN0JyAmJiAoYWxsb3dDbGVhciA9PT0gbnVsbCB8fCBhbGxvd0NsZWFyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhbGxvd0NsZWFyLmNsZWFySWNvbikpIHtcbiAgICBtZXJnZWRBbGxvd0NsZWFyID0gYWxsb3dDbGVhcjtcbiAgfSBlbHNlIGlmIChhbGxvd0NsZWFyKSB7XG4gICAgbWVyZ2VkQWxsb3dDbGVhciA9IHtcbiAgICAgIGNsZWFySWNvbjogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ2xvc2VDaXJjbGVGaWxsZWQsIG51bGwpXG4gICAgfTtcbiAgfVxuICByZXR1cm4gbWVyZ2VkQWxsb3dDbGVhcjtcbn07XG5leHBvcnQgZGVmYXVsdCBnZXRBbGxvd0NsZWFyOyIsICJpbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVJlbW92ZVBhc3N3b3JkVGltZW91dChpbnB1dFJlZiwgdHJpZ2dlck9uTW91bnQpIHtcbiAgY29uc3QgcmVtb3ZlUGFzc3dvcmRUaW1lb3V0UmVmID0gdXNlUmVmKFtdKTtcbiAgY29uc3QgcmVtb3ZlUGFzc3dvcmRUaW1lb3V0ID0gKCkgPT4ge1xuICAgIHJlbW92ZVBhc3N3b3JkVGltZW91dFJlZi5jdXJyZW50LnB1c2goc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICBpZiAoKChfYSA9IGlucHV0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5pbnB1dCkgJiYgKChfYiA9IGlucHV0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5pbnB1dC5nZXRBdHRyaWJ1dGUoJ3R5cGUnKSkgPT09ICdwYXNzd29yZCcgJiYgKChfYyA9IGlucHV0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5pbnB1dC5oYXNBdHRyaWJ1dGUoJ3ZhbHVlJykpKSB7XG4gICAgICAgIChfZCA9IGlucHV0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5pbnB1dC5yZW1vdmVBdHRyaWJ1dGUoJ3ZhbHVlJyk7XG4gICAgICB9XG4gICAgfSkpO1xuICB9O1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh0cmlnZ2VyT25Nb3VudCkge1xuICAgICAgcmVtb3ZlUGFzc3dvcmRUaW1lb3V0KCk7XG4gICAgfVxuICAgIHJldHVybiAoKSA9PiByZW1vdmVQYXNzd29yZFRpbWVvdXRSZWYuY3VycmVudC5mb3JFYWNoKHRpbWVyID0+IHtcbiAgICAgIGlmICh0aW1lcikge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9LCBbXSk7XG4gIHJldHVybiByZW1vdmVQYXNzd29yZFRpbWVvdXQ7XG59IiwgImV4cG9ydCBmdW5jdGlvbiBoYXNQcmVmaXhTdWZmaXgocHJvcHMpIHtcbiAgcmV0dXJuICEhKHByb3BzLnByZWZpeCB8fCBwcm9wcy5zdWZmaXggfHwgcHJvcHMuYWxsb3dDbGVhciB8fCBwcm9wcy5zaG93Q291bnQpO1xufSIsICJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBjbHMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgdXNlRXZlbnQgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlRXZlbnRcIjtcbmltcG9ydCB1c2VNZXJnZWRTdGF0ZSBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VNZXJnZWRTdGF0ZVwiO1xuaW1wb3J0IGlzRXF1YWwgZnJvbSBcInJjLXV0aWwvZXMvaXNFcXVhbFwiO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEhhbmRsZXMgZnJvbSBcIi4vSGFuZGxlc1wiO1xuaW1wb3J0IE1hcmtzIGZyb20gXCIuL01hcmtzXCI7XG5pbXBvcnQgU3RlcHMgZnJvbSBcIi4vU3RlcHNcIjtcbmltcG9ydCBUcmFja3MgZnJvbSBcIi4vVHJhY2tzXCI7XG5pbXBvcnQgU2xpZGVyQ29udGV4dCBmcm9tIFwiLi9jb250ZXh0XCI7XG5pbXBvcnQgdXNlRHJhZyBmcm9tIFwiLi9ob29rcy91c2VEcmFnXCI7XG5pbXBvcnQgdXNlT2Zmc2V0IGZyb20gXCIuL2hvb2tzL3VzZU9mZnNldFwiO1xuaW1wb3J0IHVzZVJhbmdlIGZyb20gXCIuL2hvb2tzL3VzZVJhbmdlXCI7XG5cbi8qKlxuICogTmV3OlxuICogLSBjbGljayBtYXJrIHRvIHVwZGF0ZSByYW5nZSB2YWx1ZVxuICogLSBoYW5kbGVSZW5kZXJcbiAqIC0gRml4IGhhbmRsZSB3aXRoIGNvdW50IG5vdCBjb3JyZWN0XG4gKiAtIEZpeCBwdXNoYWJsZSBub3Qgd29yayBpbiBzb21lIGNhc2VcbiAqIC0gTm8gbW9yZSBGaW5kRE9NTm9kZVxuICogLSBNb3ZlIGFsbCBwb3NpdGlvbiByZWxhdGVkIHN0eWxlIGludG8gaW5saW5lIHN0eWxlXG4gKiAtIEtleTogdXAgaXMgcGx1cywgZG93biBpcyBtaW51c1xuICogLSBmaXggS2V5IHdpdGggc3RlcCA9IG51bGwgbm90IGFsaWduIHdpdGggbWFya3NcbiAqIC0gQ2hhbmdlIHJhbmdlIHNob3VsZCBub3QgdHJpZ2dlciBvbkNoYW5nZVxuICogLSBrZXlib2FyZCBzdXBwb3J0IHB1c2hhYmxlXG4gKi9cblxudmFyIFNsaWRlciA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBfcHJvcHMkcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIHByZWZpeENscyA9IF9wcm9wcyRwcmVmaXhDbHMgPT09IHZvaWQgMCA/ICdyYy1zbGlkZXInIDogX3Byb3BzJHByZWZpeENscyxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICBjbGFzc05hbWVzID0gcHJvcHMuY2xhc3NOYW1lcyxcbiAgICBzdHlsZXMgPSBwcm9wcy5zdHlsZXMsXG4gICAgaWQgPSBwcm9wcy5pZCxcbiAgICBfcHJvcHMkZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICBkaXNhYmxlZCA9IF9wcm9wcyRkaXNhYmxlZCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkZGlzYWJsZWQsXG4gICAgX3Byb3BzJGtleWJvYXJkID0gcHJvcHMua2V5Ym9hcmQsXG4gICAga2V5Ym9hcmQgPSBfcHJvcHMka2V5Ym9hcmQgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMka2V5Ym9hcmQsXG4gICAgYXV0b0ZvY3VzID0gcHJvcHMuYXV0b0ZvY3VzLFxuICAgIG9uRm9jdXMgPSBwcm9wcy5vbkZvY3VzLFxuICAgIG9uQmx1ciA9IHByb3BzLm9uQmx1cixcbiAgICBfcHJvcHMkbWluID0gcHJvcHMubWluLFxuICAgIG1pbiA9IF9wcm9wcyRtaW4gPT09IHZvaWQgMCA/IDAgOiBfcHJvcHMkbWluLFxuICAgIF9wcm9wcyRtYXggPSBwcm9wcy5tYXgsXG4gICAgbWF4ID0gX3Byb3BzJG1heCA9PT0gdm9pZCAwID8gMTAwIDogX3Byb3BzJG1heCxcbiAgICBfcHJvcHMkc3RlcCA9IHByb3BzLnN0ZXAsXG4gICAgc3RlcCA9IF9wcm9wcyRzdGVwID09PSB2b2lkIDAgPyAxIDogX3Byb3BzJHN0ZXAsXG4gICAgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICBkZWZhdWx0VmFsdWUgPSBwcm9wcy5kZWZhdWx0VmFsdWUsXG4gICAgcmFuZ2UgPSBwcm9wcy5yYW5nZSxcbiAgICBjb3VudCA9IHByb3BzLmNvdW50LFxuICAgIG9uQ2hhbmdlID0gcHJvcHMub25DaGFuZ2UsXG4gICAgb25CZWZvcmVDaGFuZ2UgPSBwcm9wcy5vbkJlZm9yZUNoYW5nZSxcbiAgICBvbkFmdGVyQ2hhbmdlID0gcHJvcHMub25BZnRlckNoYW5nZSxcbiAgICBvbkNoYW5nZUNvbXBsZXRlID0gcHJvcHMub25DaGFuZ2VDb21wbGV0ZSxcbiAgICBfcHJvcHMkYWxsb3dDcm9zcyA9IHByb3BzLmFsbG93Q3Jvc3MsXG4gICAgYWxsb3dDcm9zcyA9IF9wcm9wcyRhbGxvd0Nyb3NzID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJGFsbG93Q3Jvc3MsXG4gICAgX3Byb3BzJHB1c2hhYmxlID0gcHJvcHMucHVzaGFibGUsXG4gICAgcHVzaGFibGUgPSBfcHJvcHMkcHVzaGFibGUgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJHB1c2hhYmxlLFxuICAgIHJldmVyc2UgPSBwcm9wcy5yZXZlcnNlLFxuICAgIHZlcnRpY2FsID0gcHJvcHMudmVydGljYWwsXG4gICAgX3Byb3BzJGluY2x1ZGVkID0gcHJvcHMuaW5jbHVkZWQsXG4gICAgaW5jbHVkZWQgPSBfcHJvcHMkaW5jbHVkZWQgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkaW5jbHVkZWQsXG4gICAgc3RhcnRQb2ludCA9IHByb3BzLnN0YXJ0UG9pbnQsXG4gICAgdHJhY2tTdHlsZSA9IHByb3BzLnRyYWNrU3R5bGUsXG4gICAgaGFuZGxlU3R5bGUgPSBwcm9wcy5oYW5kbGVTdHlsZSxcbiAgICByYWlsU3R5bGUgPSBwcm9wcy5yYWlsU3R5bGUsXG4gICAgZG90U3R5bGUgPSBwcm9wcy5kb3RTdHlsZSxcbiAgICBhY3RpdmVEb3RTdHlsZSA9IHByb3BzLmFjdGl2ZURvdFN0eWxlLFxuICAgIG1hcmtzID0gcHJvcHMubWFya3MsXG4gICAgZG90cyA9IHByb3BzLmRvdHMsXG4gICAgaGFuZGxlUmVuZGVyID0gcHJvcHMuaGFuZGxlUmVuZGVyLFxuICAgIGFjdGl2ZUhhbmRsZVJlbmRlciA9IHByb3BzLmFjdGl2ZUhhbmRsZVJlbmRlcixcbiAgICB0cmFjayA9IHByb3BzLnRyYWNrLFxuICAgIF9wcm9wcyR0YWJJbmRleCA9IHByb3BzLnRhYkluZGV4LFxuICAgIHRhYkluZGV4ID0gX3Byb3BzJHRhYkluZGV4ID09PSB2b2lkIDAgPyAwIDogX3Byb3BzJHRhYkluZGV4LFxuICAgIGFyaWFMYWJlbEZvckhhbmRsZSA9IHByb3BzLmFyaWFMYWJlbEZvckhhbmRsZSxcbiAgICBhcmlhTGFiZWxsZWRCeUZvckhhbmRsZSA9IHByb3BzLmFyaWFMYWJlbGxlZEJ5Rm9ySGFuZGxlLFxuICAgIGFyaWFSZXF1aXJlZCA9IHByb3BzLmFyaWFSZXF1aXJlZCxcbiAgICBhcmlhVmFsdWVUZXh0Rm9ybWF0dGVyRm9ySGFuZGxlID0gcHJvcHMuYXJpYVZhbHVlVGV4dEZvcm1hdHRlckZvckhhbmRsZTtcbiAgdmFyIGhhbmRsZXNSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHZhciBjb250YWluZXJSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHZhciBkaXJlY3Rpb24gPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodmVydGljYWwpIHtcbiAgICAgIHJldHVybiByZXZlcnNlID8gJ3R0YicgOiAnYnR0JztcbiAgICB9XG4gICAgcmV0dXJuIHJldmVyc2UgPyAncnRsJyA6ICdsdHInO1xuICB9LCBbcmV2ZXJzZSwgdmVydGljYWxdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJhbmdlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfdXNlUmFuZ2UgPSB1c2VSYW5nZShyYW5nZSksXG4gICAgX3VzZVJhbmdlMiA9IF9zbGljZWRUb0FycmF5KF91c2VSYW5nZSwgNSksXG4gICAgcmFuZ2VFbmFibGVkID0gX3VzZVJhbmdlMlswXSxcbiAgICByYW5nZUVkaXRhYmxlID0gX3VzZVJhbmdlMlsxXSxcbiAgICByYW5nZURyYWdnYWJsZVRyYWNrID0gX3VzZVJhbmdlMlsyXSxcbiAgICBtaW5Db3VudCA9IF91c2VSYW5nZTJbM10sXG4gICAgbWF4Q291bnQgPSBfdXNlUmFuZ2UyWzRdO1xuICB2YXIgbWVyZ2VkTWluID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGlzRmluaXRlKG1pbikgPyBtaW4gOiAwO1xuICB9LCBbbWluXSk7XG4gIHZhciBtZXJnZWRNYXggPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gaXNGaW5pdGUobWF4KSA/IG1heCA6IDEwMDtcbiAgfSwgW21heF0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFN0ZXAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG1lcmdlZFN0ZXAgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gc3RlcCAhPT0gbnVsbCAmJiBzdGVwIDw9IDAgPyAxIDogc3RlcDtcbiAgfSwgW3N0ZXBdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBQdXNoID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBtZXJnZWRQdXNoID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHR5cGVvZiBwdXNoYWJsZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICByZXR1cm4gcHVzaGFibGUgPyBtZXJnZWRTdGVwIDogZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBwdXNoYWJsZSA+PSAwID8gcHVzaGFibGUgOiBmYWxzZTtcbiAgfSwgW3B1c2hhYmxlLCBtZXJnZWRTdGVwXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBNYXJrcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgbWFya0xpc3QgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMobWFya3MgfHwge30pLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICB2YXIgbWFyayA9IG1hcmtzW2tleV07XG4gICAgICB2YXIgbWFya09iaiA9IHtcbiAgICAgICAgdmFsdWU6IE51bWJlcihrZXkpXG4gICAgICB9O1xuICAgICAgaWYgKG1hcmsgJiYgX3R5cGVvZihtYXJrKSA9PT0gJ29iamVjdCcgJiYgISAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQobWFyaykgJiYgKCdsYWJlbCcgaW4gbWFyayB8fCAnc3R5bGUnIGluIG1hcmspKSB7XG4gICAgICAgIG1hcmtPYmouc3R5bGUgPSBtYXJrLnN0eWxlO1xuICAgICAgICBtYXJrT2JqLmxhYmVsID0gbWFyay5sYWJlbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1hcmtPYmoubGFiZWwgPSBtYXJrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1hcmtPYmo7XG4gICAgfSkuZmlsdGVyKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICB2YXIgbGFiZWwgPSBfcmVmLmxhYmVsO1xuICAgICAgcmV0dXJuIGxhYmVsIHx8IHR5cGVvZiBsYWJlbCA9PT0gJ251bWJlcic7XG4gICAgfSkuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEudmFsdWUgLSBiLnZhbHVlO1xuICAgIH0pO1xuICB9LCBbbWFya3NdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IEZvcm1hdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfdXNlT2Zmc2V0ID0gdXNlT2Zmc2V0KG1lcmdlZE1pbiwgbWVyZ2VkTWF4LCBtZXJnZWRTdGVwLCBtYXJrTGlzdCwgYWxsb3dDcm9zcywgbWVyZ2VkUHVzaCksXG4gICAgX3VzZU9mZnNldDIgPSBfc2xpY2VkVG9BcnJheShfdXNlT2Zmc2V0LCAyKSxcbiAgICBmb3JtYXRWYWx1ZSA9IF91c2VPZmZzZXQyWzBdLFxuICAgIG9mZnNldFZhbHVlcyA9IF91c2VPZmZzZXQyWzFdO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gVmFsdWVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF91c2VNZXJnZWRTdGF0ZSA9IHVzZU1lcmdlZFN0YXRlKGRlZmF1bHRWYWx1ZSwge1xuICAgICAgdmFsdWU6IHZhbHVlXG4gICAgfSksXG4gICAgX3VzZU1lcmdlZFN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VNZXJnZWRTdGF0ZSwgMiksXG4gICAgbWVyZ2VkVmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGUyWzBdLFxuICAgIHNldFZhbHVlID0gX3VzZU1lcmdlZFN0YXRlMlsxXTtcbiAgdmFyIHJhd1ZhbHVlcyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciB2YWx1ZUxpc3QgPSBtZXJnZWRWYWx1ZSA9PT0gbnVsbCB8fCBtZXJnZWRWYWx1ZSA9PT0gdW5kZWZpbmVkID8gW10gOiBBcnJheS5pc0FycmF5KG1lcmdlZFZhbHVlKSA/IG1lcmdlZFZhbHVlIDogW21lcmdlZFZhbHVlXTtcbiAgICB2YXIgX3ZhbHVlTGlzdCA9IF9zbGljZWRUb0FycmF5KHZhbHVlTGlzdCwgMSksXG4gICAgICBfdmFsdWVMaXN0JCA9IF92YWx1ZUxpc3RbMF0sXG4gICAgICB2YWwwID0gX3ZhbHVlTGlzdCQgPT09IHZvaWQgMCA/IG1lcmdlZE1pbiA6IF92YWx1ZUxpc3QkO1xuICAgIHZhciByZXR1cm5WYWx1ZXMgPSBtZXJnZWRWYWx1ZSA9PT0gbnVsbCA/IFtdIDogW3ZhbDBdO1xuXG4gICAgLy8gRm9ybWF0IGFzIHJhbmdlXG4gICAgaWYgKHJhbmdlRW5hYmxlZCkge1xuICAgICAgcmV0dXJuVmFsdWVzID0gX3RvQ29uc3VtYWJsZUFycmF5KHZhbHVlTGlzdCk7XG5cbiAgICAgIC8vIFdoZW4gY291bnQgcHJvdmlkZWQgb3IgdmFsdWUgaXMgYHVuZGVmaW5lZGAsIHdlIGZpbGwgdmFsdWVzXG4gICAgICBpZiAoY291bnQgfHwgbWVyZ2VkVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YXIgcG9pbnRDb3VudCA9IGNvdW50ID49IDAgPyBjb3VudCArIDEgOiAyO1xuICAgICAgICByZXR1cm5WYWx1ZXMgPSByZXR1cm5WYWx1ZXMuc2xpY2UoMCwgcG9pbnRDb3VudCk7XG5cbiAgICAgICAgLy8gRmlsbCB3aXRoIGNvdW50XG4gICAgICAgIHdoaWxlIChyZXR1cm5WYWx1ZXMubGVuZ3RoIDwgcG9pbnRDb3VudCkge1xuICAgICAgICAgIHZhciBfcmV0dXJuVmFsdWVzO1xuICAgICAgICAgIHJldHVyblZhbHVlcy5wdXNoKChfcmV0dXJuVmFsdWVzID0gcmV0dXJuVmFsdWVzW3JldHVyblZhbHVlcy5sZW5ndGggLSAxXSkgIT09IG51bGwgJiYgX3JldHVyblZhbHVlcyAhPT0gdm9pZCAwID8gX3JldHVyblZhbHVlcyA6IG1lcmdlZE1pbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVyblZhbHVlcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIHJldHVybiBhIC0gYjtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFsaWduIGluIHJhbmdlXG4gICAgcmV0dXJuVmFsdWVzLmZvckVhY2goZnVuY3Rpb24gKHZhbCwgaW5kZXgpIHtcbiAgICAgIHJldHVyblZhbHVlc1tpbmRleF0gPSBmb3JtYXRWYWx1ZSh2YWwpO1xuICAgIH0pO1xuICAgIHJldHVybiByZXR1cm5WYWx1ZXM7XG4gIH0sIFttZXJnZWRWYWx1ZSwgcmFuZ2VFbmFibGVkLCBtZXJnZWRNaW4sIGNvdW50LCBmb3JtYXRWYWx1ZV0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBvbkNoYW5nZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGdldFRyaWdnZXJWYWx1ZSA9IGZ1bmN0aW9uIGdldFRyaWdnZXJWYWx1ZSh0cmlnZ2VyVmFsdWVzKSB7XG4gICAgcmV0dXJuIHJhbmdlRW5hYmxlZCA/IHRyaWdnZXJWYWx1ZXMgOiB0cmlnZ2VyVmFsdWVzWzBdO1xuICB9O1xuICB2YXIgdHJpZ2dlckNoYW5nZSA9IHVzZUV2ZW50KGZ1bmN0aW9uIChuZXh0VmFsdWVzKSB7XG4gICAgLy8gT3JkZXIgZmlyc3RcbiAgICB2YXIgY2xvbmVOZXh0VmFsdWVzID0gX3RvQ29uc3VtYWJsZUFycmF5KG5leHRWYWx1ZXMpLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBhIC0gYjtcbiAgICB9KTtcblxuICAgIC8vIFRyaWdnZXIgZXZlbnQgaWYgbmVlZGVkXG4gICAgaWYgKG9uQ2hhbmdlICYmICFpc0VxdWFsKGNsb25lTmV4dFZhbHVlcywgcmF3VmFsdWVzLCB0cnVlKSkge1xuICAgICAgb25DaGFuZ2UoZ2V0VHJpZ2dlclZhbHVlKGNsb25lTmV4dFZhbHVlcykpO1xuICAgIH1cblxuICAgIC8vIFdlIHNldCB0aGlzIGxhdGVyIHNpbmNlIGl0IHdpbGwgcmUtcmVuZGVyIGNvbXBvbmVudCBpbW1lZGlhdGVseVxuICAgIHNldFZhbHVlKGNsb25lTmV4dFZhbHVlcyk7XG4gIH0pO1xuICB2YXIgZmluaXNoQ2hhbmdlID0gdXNlRXZlbnQoZnVuY3Rpb24gKGRyYWdnaW5nRGVsZXRlKSB7XG4gICAgLy8gVHJpZ2dlciBmcm9tIGB1c2VEcmFnYCB3aWxsIHRlbGwgaWYgaXQncyBhIGRlbGV0ZSBhY3Rpb25cbiAgICBpZiAoZHJhZ2dpbmdEZWxldGUpIHtcbiAgICAgIGhhbmRsZXNSZWYuY3VycmVudC5oaWRlSGVscCgpO1xuICAgIH1cbiAgICB2YXIgZmluaXNoVmFsdWUgPSBnZXRUcmlnZ2VyVmFsdWUocmF3VmFsdWVzKTtcbiAgICBvbkFmdGVyQ2hhbmdlID09PSBudWxsIHx8IG9uQWZ0ZXJDaGFuZ2UgPT09IHZvaWQgMCB8fCBvbkFmdGVyQ2hhbmdlKGZpbmlzaFZhbHVlKTtcbiAgICB3YXJuaW5nKCFvbkFmdGVyQ2hhbmdlLCAnW3JjLXNsaWRlcl0gYG9uQWZ0ZXJDaGFuZ2VgIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgYG9uQ2hhbmdlQ29tcGxldGVgIGluc3RlYWQuJyk7XG4gICAgb25DaGFuZ2VDb21wbGV0ZSA9PT0gbnVsbCB8fCBvbkNoYW5nZUNvbXBsZXRlID09PSB2b2lkIDAgfHwgb25DaGFuZ2VDb21wbGV0ZShmaW5pc2hWYWx1ZSk7XG4gIH0pO1xuICB2YXIgb25EZWxldGUgPSBmdW5jdGlvbiBvbkRlbGV0ZShpbmRleCkge1xuICAgIGlmIChkaXNhYmxlZCB8fCAhcmFuZ2VFZGl0YWJsZSB8fCByYXdWYWx1ZXMubGVuZ3RoIDw9IG1pbkNvdW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBjbG9uZU5leHRWYWx1ZXMgPSBfdG9Db25zdW1hYmxlQXJyYXkocmF3VmFsdWVzKTtcbiAgICBjbG9uZU5leHRWYWx1ZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBvbkJlZm9yZUNoYW5nZSA9PT0gbnVsbCB8fCBvbkJlZm9yZUNoYW5nZSA9PT0gdm9pZCAwIHx8IG9uQmVmb3JlQ2hhbmdlKGdldFRyaWdnZXJWYWx1ZShjbG9uZU5leHRWYWx1ZXMpKTtcbiAgICB0cmlnZ2VyQ2hhbmdlKGNsb25lTmV4dFZhbHVlcyk7XG4gICAgdmFyIG5leHRGb2N1c0luZGV4ID0gTWF0aC5tYXgoMCwgaW5kZXggLSAxKTtcbiAgICBoYW5kbGVzUmVmLmN1cnJlbnQuaGlkZUhlbHAoKTtcbiAgICBoYW5kbGVzUmVmLmN1cnJlbnQuZm9jdXMobmV4dEZvY3VzSW5kZXgpO1xuICB9O1xuICB2YXIgX3VzZURyYWcgPSB1c2VEcmFnKGNvbnRhaW5lclJlZiwgZGlyZWN0aW9uLCByYXdWYWx1ZXMsIG1lcmdlZE1pbiwgbWVyZ2VkTWF4LCBmb3JtYXRWYWx1ZSwgdHJpZ2dlckNoYW5nZSwgZmluaXNoQ2hhbmdlLCBvZmZzZXRWYWx1ZXMsIHJhbmdlRWRpdGFibGUsIG1pbkNvdW50KSxcbiAgICBfdXNlRHJhZzIgPSBfc2xpY2VkVG9BcnJheShfdXNlRHJhZywgNSksXG4gICAgZHJhZ2dpbmdJbmRleCA9IF91c2VEcmFnMlswXSxcbiAgICBkcmFnZ2luZ1ZhbHVlID0gX3VzZURyYWcyWzFdLFxuICAgIGRyYWdnaW5nRGVsZXRlID0gX3VzZURyYWcyWzJdLFxuICAgIGNhY2hlVmFsdWVzID0gX3VzZURyYWcyWzNdLFxuICAgIG9uU3RhcnREcmFnID0gX3VzZURyYWcyWzRdO1xuXG4gIC8qKlxuICAgKiBXaGVuIGByYW5nZUVkaXRhYmxlYCB3aWxsIGluc2VydCBhIG5ldyB2YWx1ZSBpbiB0aGUgdmFsdWVzIGFycmF5LlxuICAgKiBFbHNlIGl0IHdpbGwgcmVwbGFjZSB0aGUgdmFsdWUgaW4gdGhlIHZhbHVlcyBhcnJheS5cbiAgICovXG4gIHZhciBjaGFuZ2VUb0Nsb3NlVmFsdWUgPSBmdW5jdGlvbiBjaGFuZ2VUb0Nsb3NlVmFsdWUobmV3VmFsdWUsIGUpIHtcbiAgICBpZiAoIWRpc2FibGVkKSB7XG4gICAgICAvLyBDcmVhdGUgbmV3IHZhbHVlc1xuICAgICAgdmFyIGNsb25lTmV4dFZhbHVlcyA9IF90b0NvbnN1bWFibGVBcnJheShyYXdWYWx1ZXMpO1xuICAgICAgdmFyIHZhbHVlSW5kZXggPSAwO1xuICAgICAgdmFyIHZhbHVlQmVmb3JlSW5kZXggPSAwOyAvLyBSZWNvcmQgdGhlIGluZGV4IHdoaWNoIHZhbHVlIDwgbmV3VmFsdWVcbiAgICAgIHZhciB2YWx1ZURpc3QgPSBtZXJnZWRNYXggLSBtZXJnZWRNaW47XG4gICAgICByYXdWYWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAodmFsLCBpbmRleCkge1xuICAgICAgICB2YXIgZGlzdCA9IE1hdGguYWJzKG5ld1ZhbHVlIC0gdmFsKTtcbiAgICAgICAgaWYgKGRpc3QgPD0gdmFsdWVEaXN0KSB7XG4gICAgICAgICAgdmFsdWVEaXN0ID0gZGlzdDtcbiAgICAgICAgICB2YWx1ZUluZGV4ID0gaW5kZXg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbCA8IG5ld1ZhbHVlKSB7XG4gICAgICAgICAgdmFsdWVCZWZvcmVJbmRleCA9IGluZGV4O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHZhciBmb2N1c0luZGV4ID0gdmFsdWVJbmRleDtcbiAgICAgIGlmIChyYW5nZUVkaXRhYmxlICYmIHZhbHVlRGlzdCAhPT0gMCAmJiAoIW1heENvdW50IHx8IHJhd1ZhbHVlcy5sZW5ndGggPCBtYXhDb3VudCkpIHtcbiAgICAgICAgY2xvbmVOZXh0VmFsdWVzLnNwbGljZSh2YWx1ZUJlZm9yZUluZGV4ICsgMSwgMCwgbmV3VmFsdWUpO1xuICAgICAgICBmb2N1c0luZGV4ID0gdmFsdWVCZWZvcmVJbmRleCArIDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbG9uZU5leHRWYWx1ZXNbdmFsdWVJbmRleF0gPSBuZXdWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gRmlsbCB2YWx1ZSB0byBtYXRjaCBkZWZhdWx0IDIgKG9ubHkgd2hlbiBgcmF3VmFsdWVzYCBpcyBlbXB0eSlcbiAgICAgIGlmIChyYW5nZUVuYWJsZWQgJiYgIXJhd1ZhbHVlcy5sZW5ndGggJiYgY291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjbG9uZU5leHRWYWx1ZXMucHVzaChuZXdWYWx1ZSk7XG4gICAgICB9XG4gICAgICB2YXIgbmV4dFZhbHVlID0gZ2V0VHJpZ2dlclZhbHVlKGNsb25lTmV4dFZhbHVlcyk7XG4gICAgICBvbkJlZm9yZUNoYW5nZSA9PT0gbnVsbCB8fCBvbkJlZm9yZUNoYW5nZSA9PT0gdm9pZCAwIHx8IG9uQmVmb3JlQ2hhbmdlKG5leHRWYWx1ZSk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlKGNsb25lTmV4dFZhbHVlcyk7XG4gICAgICBpZiAoZSkge1xuICAgICAgICB2YXIgX2RvY3VtZW50JGFjdGl2ZUVsZW1lLCBfZG9jdW1lbnQkYWN0aXZlRWxlbWUyO1xuICAgICAgICAoX2RvY3VtZW50JGFjdGl2ZUVsZW1lID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkgPT09IG51bGwgfHwgX2RvY3VtZW50JGFjdGl2ZUVsZW1lID09PSB2b2lkIDAgfHwgKF9kb2N1bWVudCRhY3RpdmVFbGVtZTIgPSBfZG9jdW1lbnQkYWN0aXZlRWxlbWUuYmx1cikgPT09IG51bGwgfHwgX2RvY3VtZW50JGFjdGl2ZUVsZW1lMiA9PT0gdm9pZCAwIHx8IF9kb2N1bWVudCRhY3RpdmVFbGVtZTIuY2FsbChfZG9jdW1lbnQkYWN0aXZlRWxlbWUpO1xuICAgICAgICBoYW5kbGVzUmVmLmN1cnJlbnQuZm9jdXMoZm9jdXNJbmRleCk7XG4gICAgICAgIG9uU3RhcnREcmFnKGUsIGZvY3VzSW5kZXgsIGNsb25lTmV4dFZhbHVlcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy80OTk5N1xuICAgICAgICBvbkFmdGVyQ2hhbmdlID09PSBudWxsIHx8IG9uQWZ0ZXJDaGFuZ2UgPT09IHZvaWQgMCB8fCBvbkFmdGVyQ2hhbmdlKG5leHRWYWx1ZSk7XG4gICAgICAgIHdhcm5pbmcoIW9uQWZ0ZXJDaGFuZ2UsICdbcmMtc2xpZGVyXSBgb25BZnRlckNoYW5nZWAgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBgb25DaGFuZ2VDb21wbGV0ZWAgaW5zdGVhZC4nKTtcbiAgICAgICAgb25DaGFuZ2VDb21wbGV0ZSA9PT0gbnVsbCB8fCBvbkNoYW5nZUNvbXBsZXRlID09PSB2b2lkIDAgfHwgb25DaGFuZ2VDb21wbGV0ZShuZXh0VmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IENsaWNrID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBvblNsaWRlck1vdXNlRG93biA9IGZ1bmN0aW9uIG9uU2xpZGVyTW91c2VEb3duKGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgdmFyIF9jb250YWluZXJSZWYkY3VycmVudCA9IGNvbnRhaW5lclJlZi5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgICAgd2lkdGggPSBfY29udGFpbmVyUmVmJGN1cnJlbnQud2lkdGgsXG4gICAgICBoZWlnaHQgPSBfY29udGFpbmVyUmVmJGN1cnJlbnQuaGVpZ2h0LFxuICAgICAgbGVmdCA9IF9jb250YWluZXJSZWYkY3VycmVudC5sZWZ0LFxuICAgICAgdG9wID0gX2NvbnRhaW5lclJlZiRjdXJyZW50LnRvcCxcbiAgICAgIGJvdHRvbSA9IF9jb250YWluZXJSZWYkY3VycmVudC5ib3R0b20sXG4gICAgICByaWdodCA9IF9jb250YWluZXJSZWYkY3VycmVudC5yaWdodDtcbiAgICB2YXIgY2xpZW50WCA9IGUuY2xpZW50WCxcbiAgICAgIGNsaWVudFkgPSBlLmNsaWVudFk7XG4gICAgdmFyIHBlcmNlbnQ7XG4gICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcbiAgICAgIGNhc2UgJ2J0dCc6XG4gICAgICAgIHBlcmNlbnQgPSAoYm90dG9tIC0gY2xpZW50WSkgLyBoZWlnaHQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndHRiJzpcbiAgICAgICAgcGVyY2VudCA9IChjbGllbnRZIC0gdG9wKSAvIGhlaWdodDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdydGwnOlxuICAgICAgICBwZXJjZW50ID0gKHJpZ2h0IC0gY2xpZW50WCkgLyB3aWR0aDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBwZXJjZW50ID0gKGNsaWVudFggLSBsZWZ0KSAvIHdpZHRoO1xuICAgIH1cbiAgICB2YXIgbmV4dFZhbHVlID0gbWVyZ2VkTWluICsgcGVyY2VudCAqIChtZXJnZWRNYXggLSBtZXJnZWRNaW4pO1xuICAgIGNoYW5nZVRvQ2xvc2VWYWx1ZShmb3JtYXRWYWx1ZShuZXh0VmFsdWUpLCBlKTtcbiAgfTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gS2V5Ym9hcmQgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShudWxsKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBrZXlib2FyZFZhbHVlID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXRLZXlib2FyZFZhbHVlID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIG9uSGFuZGxlT2Zmc2V0Q2hhbmdlID0gZnVuY3Rpb24gb25IYW5kbGVPZmZzZXRDaGFuZ2Uob2Zmc2V0LCB2YWx1ZUluZGV4KSB7XG4gICAgaWYgKCFkaXNhYmxlZCkge1xuICAgICAgdmFyIG5leHQgPSBvZmZzZXRWYWx1ZXMocmF3VmFsdWVzLCBvZmZzZXQsIHZhbHVlSW5kZXgpO1xuICAgICAgb25CZWZvcmVDaGFuZ2UgPT09IG51bGwgfHwgb25CZWZvcmVDaGFuZ2UgPT09IHZvaWQgMCB8fCBvbkJlZm9yZUNoYW5nZShnZXRUcmlnZ2VyVmFsdWUocmF3VmFsdWVzKSk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlKG5leHQudmFsdWVzKTtcbiAgICAgIHNldEtleWJvYXJkVmFsdWUobmV4dC52YWx1ZSk7XG4gICAgfVxuICB9O1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChrZXlib2FyZFZhbHVlICE9PSBudWxsKSB7XG4gICAgICB2YXIgdmFsdWVJbmRleCA9IHJhd1ZhbHVlcy5pbmRleE9mKGtleWJvYXJkVmFsdWUpO1xuICAgICAgaWYgKHZhbHVlSW5kZXggPj0gMCkge1xuICAgICAgICBoYW5kbGVzUmVmLmN1cnJlbnQuZm9jdXModmFsdWVJbmRleCk7XG4gICAgICB9XG4gICAgfVxuICAgIHNldEtleWJvYXJkVmFsdWUobnVsbCk7XG4gIH0sIFtrZXlib2FyZFZhbHVlXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRHJhZyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgbWVyZ2VkRHJhZ2dhYmxlVHJhY2sgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocmFuZ2VEcmFnZ2FibGVUcmFjayAmJiBtZXJnZWRTdGVwID09PSBudWxsKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICB3YXJuaW5nKGZhbHNlLCAnYGRyYWdnYWJsZVRyYWNrYCBpcyBub3Qgc3VwcG9ydGVkIHdoZW4gYHN0ZXBgIGlzIGBudWxsYC4nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHJhbmdlRHJhZ2dhYmxlVHJhY2s7XG4gIH0sIFtyYW5nZURyYWdnYWJsZVRyYWNrLCBtZXJnZWRTdGVwXSk7XG4gIHZhciBvblN0YXJ0TW92ZSA9IHVzZUV2ZW50KGZ1bmN0aW9uIChlLCB2YWx1ZUluZGV4KSB7XG4gICAgb25TdGFydERyYWcoZSwgdmFsdWVJbmRleCk7XG4gICAgb25CZWZvcmVDaGFuZ2UgPT09IG51bGwgfHwgb25CZWZvcmVDaGFuZ2UgPT09IHZvaWQgMCB8fCBvbkJlZm9yZUNoYW5nZShnZXRUcmlnZ2VyVmFsdWUocmF3VmFsdWVzKSk7XG4gIH0pO1xuXG4gIC8vIEF1dG8gZm9jdXMgZm9yIHVwZGF0ZWQgaGFuZGxlXG4gIHZhciBkcmFnZ2luZyA9IGRyYWdnaW5nSW5kZXggIT09IC0xO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICghZHJhZ2dpbmcpIHtcbiAgICAgIHZhciB2YWx1ZUluZGV4ID0gcmF3VmFsdWVzLmxhc3RJbmRleE9mKGRyYWdnaW5nVmFsdWUpO1xuICAgICAgaGFuZGxlc1JlZi5jdXJyZW50LmZvY3VzKHZhbHVlSW5kZXgpO1xuICAgIH1cbiAgfSwgW2RyYWdnaW5nXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IEluY2x1ZGVkID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgc29ydGVkQ2FjaGVWYWx1ZXMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX3RvQ29uc3VtYWJsZUFycmF5KGNhY2hlVmFsdWVzKS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gYSAtIGI7XG4gICAgfSk7XG4gIH0sIFtjYWNoZVZhbHVlc10pO1xuXG4gIC8vIFByb3ZpZGUgYSByYW5nZSB2YWx1ZXMgd2l0aCBpbmNsdWRlZCBbbWluLCBtYXhdXG4gIC8vIFVzZWQgZm9yIFRyYWNrLCBNYXJrICYgRG90XG4gIHZhciBfUmVhY3QkdXNlTWVtbyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFyYW5nZUVuYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuIFttZXJnZWRNaW4sIHNvcnRlZENhY2hlVmFsdWVzWzBdXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbc29ydGVkQ2FjaGVWYWx1ZXNbMF0sIHNvcnRlZENhY2hlVmFsdWVzW3NvcnRlZENhY2hlVmFsdWVzLmxlbmd0aCAtIDFdXTtcbiAgICB9LCBbc29ydGVkQ2FjaGVWYWx1ZXMsIHJhbmdlRW5hYmxlZCwgbWVyZ2VkTWluXSksXG4gICAgX1JlYWN0JHVzZU1lbW8yID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZU1lbW8sIDIpLFxuICAgIGluY2x1ZGVkU3RhcnQgPSBfUmVhY3QkdXNlTWVtbzJbMF0sXG4gICAgaW5jbHVkZWRFbmQgPSBfUmVhY3QkdXNlTWVtbzJbMV07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVmcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBmb2N1czogZnVuY3Rpb24gZm9jdXMoKSB7XG4gICAgICAgIGhhbmRsZXNSZWYuY3VycmVudC5mb2N1cygwKTtcbiAgICAgIH0sXG4gICAgICBibHVyOiBmdW5jdGlvbiBibHVyKCkge1xuICAgICAgICB2YXIgX2NvbnRhaW5lclJlZiRjdXJyZW50MjtcbiAgICAgICAgdmFyIF9kb2N1bWVudCA9IGRvY3VtZW50LFxuICAgICAgICAgIGFjdGl2ZUVsZW1lbnQgPSBfZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgICAgaWYgKChfY29udGFpbmVyUmVmJGN1cnJlbnQyID0gY29udGFpbmVyUmVmLmN1cnJlbnQpICE9PSBudWxsICYmIF9jb250YWluZXJSZWYkY3VycmVudDIgIT09IHZvaWQgMCAmJiBfY29udGFpbmVyUmVmJGN1cnJlbnQyLmNvbnRhaW5zKGFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgICAgYWN0aXZlRWxlbWVudCA9PT0gbnVsbCB8fCBhY3RpdmVFbGVtZW50ID09PSB2b2lkIDAgfHwgYWN0aXZlRWxlbWVudC5ibHVyKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBBdXRvIEZvY3VzID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGF1dG9Gb2N1cykge1xuICAgICAgaGFuZGxlc1JlZi5jdXJyZW50LmZvY3VzKDApO1xuICAgIH1cbiAgfSwgW10pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBDb250ZXh0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGNvbnRleHQgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWluOiBtZXJnZWRNaW4sXG4gICAgICBtYXg6IG1lcmdlZE1heCxcbiAgICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uLFxuICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgICAga2V5Ym9hcmQ6IGtleWJvYXJkLFxuICAgICAgc3RlcDogbWVyZ2VkU3RlcCxcbiAgICAgIGluY2x1ZGVkOiBpbmNsdWRlZCxcbiAgICAgIGluY2x1ZGVkU3RhcnQ6IGluY2x1ZGVkU3RhcnQsXG4gICAgICBpbmNsdWRlZEVuZDogaW5jbHVkZWRFbmQsXG4gICAgICByYW5nZTogcmFuZ2VFbmFibGVkLFxuICAgICAgdGFiSW5kZXg6IHRhYkluZGV4LFxuICAgICAgYXJpYUxhYmVsRm9ySGFuZGxlOiBhcmlhTGFiZWxGb3JIYW5kbGUsXG4gICAgICBhcmlhTGFiZWxsZWRCeUZvckhhbmRsZTogYXJpYUxhYmVsbGVkQnlGb3JIYW5kbGUsXG4gICAgICBhcmlhUmVxdWlyZWQ6IGFyaWFSZXF1aXJlZCxcbiAgICAgIGFyaWFWYWx1ZVRleHRGb3JtYXR0ZXJGb3JIYW5kbGU6IGFyaWFWYWx1ZVRleHRGb3JtYXR0ZXJGb3JIYW5kbGUsXG4gICAgICBzdHlsZXM6IHN0eWxlcyB8fCB7fSxcbiAgICAgIGNsYXNzTmFtZXM6IGNsYXNzTmFtZXMgfHwge31cbiAgICB9O1xuICB9LCBbbWVyZ2VkTWluLCBtZXJnZWRNYXgsIGRpcmVjdGlvbiwgZGlzYWJsZWQsIGtleWJvYXJkLCBtZXJnZWRTdGVwLCBpbmNsdWRlZCwgaW5jbHVkZWRTdGFydCwgaW5jbHVkZWRFbmQsIHJhbmdlRW5hYmxlZCwgdGFiSW5kZXgsIGFyaWFMYWJlbEZvckhhbmRsZSwgYXJpYUxhYmVsbGVkQnlGb3JIYW5kbGUsIGFyaWFSZXF1aXJlZCwgYXJpYVZhbHVlVGV4dEZvcm1hdHRlckZvckhhbmRsZSwgc3R5bGVzLCBjbGFzc05hbWVzXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU2xpZGVyQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBjb250ZXh0XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICByZWY6IGNvbnRhaW5lclJlZixcbiAgICBjbGFzc05hbWU6IGNscyhwcmVmaXhDbHMsIGNsYXNzTmFtZSwgX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRpc2FibGVkXCIpLCBkaXNhYmxlZCksIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdmVydGljYWxcIiksIHZlcnRpY2FsKSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ob3Jpem9udGFsXCIpLCAhdmVydGljYWwpLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXdpdGgtbWFya3NcIiksIG1hcmtMaXN0Lmxlbmd0aCkpLFxuICAgIHN0eWxlOiBzdHlsZSxcbiAgICBvbk1vdXNlRG93bjogb25TbGlkZXJNb3VzZURvd24sXG4gICAgaWQ6IGlkXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNscyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJhaWxcIiksIGNsYXNzTmFtZXMgPT09IG51bGwgfHwgY2xhc3NOYW1lcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2xhc3NOYW1lcy5yYWlsKSxcbiAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCByYWlsU3R5bGUpLCBzdHlsZXMgPT09IG51bGwgfHwgc3R5bGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdHlsZXMucmFpbClcbiAgfSksIHRyYWNrICE9PSBmYWxzZSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUcmFja3MsIHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBzdHlsZTogdHJhY2tTdHlsZSxcbiAgICB2YWx1ZXM6IHJhd1ZhbHVlcyxcbiAgICBzdGFydFBvaW50OiBzdGFydFBvaW50LFxuICAgIG9uU3RhcnRNb3ZlOiBtZXJnZWREcmFnZ2FibGVUcmFjayA/IG9uU3RhcnRNb3ZlIDogdW5kZWZpbmVkXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTdGVwcywge1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIG1hcmtzOiBtYXJrTGlzdCxcbiAgICBkb3RzOiBkb3RzLFxuICAgIHN0eWxlOiBkb3RTdHlsZSxcbiAgICBhY3RpdmVTdHlsZTogYWN0aXZlRG90U3R5bGVcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEhhbmRsZXMsIHtcbiAgICByZWY6IGhhbmRsZXNSZWYsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgc3R5bGU6IGhhbmRsZVN0eWxlLFxuICAgIHZhbHVlczogY2FjaGVWYWx1ZXMsXG4gICAgZHJhZ2dpbmdJbmRleDogZHJhZ2dpbmdJbmRleCxcbiAgICBkcmFnZ2luZ0RlbGV0ZTogZHJhZ2dpbmdEZWxldGUsXG4gICAgb25TdGFydE1vdmU6IG9uU3RhcnRNb3ZlLFxuICAgIG9uT2Zmc2V0Q2hhbmdlOiBvbkhhbmRsZU9mZnNldENoYW5nZSxcbiAgICBvbkZvY3VzOiBvbkZvY3VzLFxuICAgIG9uQmx1cjogb25CbHVyLFxuICAgIGhhbmRsZVJlbmRlcjogaGFuZGxlUmVuZGVyLFxuICAgIGFjdGl2ZUhhbmRsZVJlbmRlcjogYWN0aXZlSGFuZGxlUmVuZGVyLFxuICAgIG9uQ2hhbmdlQ29tcGxldGU6IGZpbmlzaENoYW5nZSxcbiAgICBvbkRlbGV0ZTogcmFuZ2VFZGl0YWJsZSA/IG9uRGVsZXRlIDogdW5kZWZpbmVkXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChNYXJrcywge1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIG1hcmtzOiBtYXJrTGlzdCxcbiAgICBvbkNsaWNrOiBjaGFuZ2VUb0Nsb3NlVmFsdWVcbiAgfSkpKTtcbn0pO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgU2xpZGVyLmRpc3BsYXlOYW1lID0gJ1NsaWRlcic7XG59XG5leHBvcnQgZGVmYXVsdCBTbGlkZXI7IiwgImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJwcmVmaXhDbHNcIiwgXCJzdHlsZVwiLCBcIm9uU3RhcnRNb3ZlXCIsIFwib25PZmZzZXRDaGFuZ2VcIiwgXCJ2YWx1ZXNcIiwgXCJoYW5kbGVSZW5kZXJcIiwgXCJhY3RpdmVIYW5kbGVSZW5kZXJcIiwgXCJkcmFnZ2luZ0luZGV4XCIsIFwiZHJhZ2dpbmdEZWxldGVcIiwgXCJvbkZvY3VzXCJdO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZmx1c2hTeW5jIH0gZnJvbSAncmVhY3QtZG9tJztcbmltcG9ydCB7IGdldEluZGV4IH0gZnJvbSBcIi4uL3V0aWxcIjtcbmltcG9ydCBIYW5kbGUgZnJvbSBcIi4vSGFuZGxlXCI7XG52YXIgSGFuZGxlcyA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICBvblN0YXJ0TW92ZSA9IHByb3BzLm9uU3RhcnRNb3ZlLFxuICAgIG9uT2Zmc2V0Q2hhbmdlID0gcHJvcHMub25PZmZzZXRDaGFuZ2UsXG4gICAgdmFsdWVzID0gcHJvcHMudmFsdWVzLFxuICAgIGhhbmRsZVJlbmRlciA9IHByb3BzLmhhbmRsZVJlbmRlcixcbiAgICBhY3RpdmVIYW5kbGVSZW5kZXIgPSBwcm9wcy5hY3RpdmVIYW5kbGVSZW5kZXIsXG4gICAgZHJhZ2dpbmdJbmRleCA9IHByb3BzLmRyYWdnaW5nSW5kZXgsXG4gICAgZHJhZ2dpbmdEZWxldGUgPSBwcm9wcy5kcmFnZ2luZ0RlbGV0ZSxcbiAgICBvbkZvY3VzID0gcHJvcHMub25Gb2N1cyxcbiAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIF9leGNsdWRlZCk7XG4gIHZhciBoYW5kbGVzUmVmID0gUmVhY3QudXNlUmVmKHt9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gQWN0aXZlID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIGFjdGl2ZVZpc2libGUgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldEFjdGl2ZVZpc2libGUgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlMyA9IFJlYWN0LnVzZVN0YXRlKC0xKSxcbiAgICBfUmVhY3QkdXNlU3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlMywgMiksXG4gICAgYWN0aXZlSW5kZXggPSBfUmVhY3QkdXNlU3RhdGU0WzBdLFxuICAgIHNldEFjdGl2ZUluZGV4ID0gX1JlYWN0JHVzZVN0YXRlNFsxXTtcbiAgdmFyIG9uQWN0aXZlID0gZnVuY3Rpb24gb25BY3RpdmUoaW5kZXgpIHtcbiAgICBzZXRBY3RpdmVJbmRleChpbmRleCk7XG4gICAgc2V0QWN0aXZlVmlzaWJsZSh0cnVlKTtcbiAgfTtcbiAgdmFyIG9uSGFuZGxlRm9jdXMgPSBmdW5jdGlvbiBvbkhhbmRsZUZvY3VzKGUsIGluZGV4KSB7XG4gICAgb25BY3RpdmUoaW5kZXgpO1xuICAgIG9uRm9jdXMgPT09IG51bGwgfHwgb25Gb2N1cyA9PT0gdm9pZCAwIHx8IG9uRm9jdXMoZSk7XG4gIH07XG4gIHZhciBvbkhhbmRsZU1vdXNlRW50ZXIgPSBmdW5jdGlvbiBvbkhhbmRsZU1vdXNlRW50ZXIoZSwgaW5kZXgpIHtcbiAgICBvbkFjdGl2ZShpbmRleCk7XG4gIH07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgUmVhY3QudXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZm9jdXM6IGZ1bmN0aW9uIGZvY3VzKGluZGV4KSB7XG4gICAgICAgIHZhciBfaGFuZGxlc1JlZiRjdXJyZW50JGk7XG4gICAgICAgIChfaGFuZGxlc1JlZiRjdXJyZW50JGkgPSBoYW5kbGVzUmVmLmN1cnJlbnRbaW5kZXhdKSA9PT0gbnVsbCB8fCBfaGFuZGxlc1JlZiRjdXJyZW50JGkgPT09IHZvaWQgMCB8fCBfaGFuZGxlc1JlZiRjdXJyZW50JGkuZm9jdXMoKTtcbiAgICAgIH0sXG4gICAgICBoaWRlSGVscDogZnVuY3Rpb24gaGlkZUhlbHAoKSB7XG4gICAgICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc2V0QWN0aXZlVmlzaWJsZShmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEhhbmRsZSBQcm9wc1xuICB2YXIgaGFuZGxlUHJvcHMgPSBfb2JqZWN0U3ByZWFkKHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBvblN0YXJ0TW92ZTogb25TdGFydE1vdmUsXG4gICAgb25PZmZzZXRDaGFuZ2U6IG9uT2Zmc2V0Q2hhbmdlLFxuICAgIHJlbmRlcjogaGFuZGxlUmVuZGVyLFxuICAgIG9uRm9jdXM6IG9uSGFuZGxlRm9jdXMsXG4gICAgb25Nb3VzZUVudGVyOiBvbkhhbmRsZU1vdXNlRW50ZXJcbiAgfSwgcmVzdFByb3BzKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCB2YWx1ZXMubWFwKGZ1bmN0aW9uICh2YWx1ZSwgaW5kZXgpIHtcbiAgICB2YXIgZHJhZ2dpbmcgPSBkcmFnZ2luZ0luZGV4ID09PSBpbmRleDtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSGFuZGxlLCBfZXh0ZW5kcyh7XG4gICAgICByZWY6IGZ1bmN0aW9uIHJlZihub2RlKSB7XG4gICAgICAgIGlmICghbm9kZSkge1xuICAgICAgICAgIGRlbGV0ZSBoYW5kbGVzUmVmLmN1cnJlbnRbaW5kZXhdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGhhbmRsZXNSZWYuY3VycmVudFtpbmRleF0gPSBub2RlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZHJhZ2dpbmc6IGRyYWdnaW5nLFxuICAgICAgZHJhZ2dpbmdEZWxldGU6IGRyYWdnaW5nICYmIGRyYWdnaW5nRGVsZXRlLFxuICAgICAgc3R5bGU6IGdldEluZGV4KHN0eWxlLCBpbmRleCksXG4gICAgICBrZXk6IGluZGV4LFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgdmFsdWVJbmRleDogaW5kZXhcbiAgICB9LCBoYW5kbGVQcm9wcykpO1xuICB9KSwgYWN0aXZlSGFuZGxlUmVuZGVyICYmIGFjdGl2ZVZpc2libGUgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSGFuZGxlLCBfZXh0ZW5kcyh7XG4gICAga2V5OiBcImExMXlcIlxuICB9LCBoYW5kbGVQcm9wcywge1xuICAgIHZhbHVlOiB2YWx1ZXNbYWN0aXZlSW5kZXhdLFxuICAgIHZhbHVlSW5kZXg6IG51bGwsXG4gICAgZHJhZ2dpbmc6IGRyYWdnaW5nSW5kZXggIT09IC0xLFxuICAgIGRyYWdnaW5nRGVsZXRlOiBkcmFnZ2luZ0RlbGV0ZSxcbiAgICByZW5kZXI6IGFjdGl2ZUhhbmRsZVJlbmRlcixcbiAgICBzdHlsZToge1xuICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnXG4gICAgfSxcbiAgICB0YWJJbmRleDogbnVsbCxcbiAgICBcImFyaWEtaGlkZGVuXCI6IHRydWVcbiAgfSkpKTtcbn0pO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgSGFuZGxlcy5kaXNwbGF5TmFtZSA9ICdIYW5kbGVzJztcbn1cbmV4cG9ydCBkZWZhdWx0IEhhbmRsZXM7IiwgImV4cG9ydCBmdW5jdGlvbiBnZXRPZmZzZXQodmFsdWUsIG1pbiwgbWF4KSB7XG4gIHJldHVybiAodmFsdWUgLSBtaW4pIC8gKG1heCAtIG1pbik7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0RGlyZWN0aW9uU3R5bGUoZGlyZWN0aW9uLCB2YWx1ZSwgbWluLCBtYXgpIHtcbiAgdmFyIG9mZnNldCA9IGdldE9mZnNldCh2YWx1ZSwgbWluLCBtYXgpO1xuICB2YXIgcG9zaXRpb25TdHlsZSA9IHt9O1xuICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgIGNhc2UgJ3J0bCc6XG4gICAgICBwb3NpdGlvblN0eWxlLnJpZ2h0ID0gXCJcIi5jb25jYXQob2Zmc2V0ICogMTAwLCBcIiVcIik7XG4gICAgICBwb3NpdGlvblN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVYKDUwJSknO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYnR0JzpcbiAgICAgIHBvc2l0aW9uU3R5bGUuYm90dG9tID0gXCJcIi5jb25jYXQob2Zmc2V0ICogMTAwLCBcIiVcIik7XG4gICAgICBwb3NpdGlvblN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVZKDUwJSknO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndHRiJzpcbiAgICAgIHBvc2l0aW9uU3R5bGUudG9wID0gXCJcIi5jb25jYXQob2Zmc2V0ICogMTAwLCBcIiVcIik7XG4gICAgICBwb3NpdGlvblN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVZKC01MCUpJztcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBwb3NpdGlvblN0eWxlLmxlZnQgPSBcIlwiLmNvbmNhdChvZmZzZXQgKiAxMDAsIFwiJVwiKTtcbiAgICAgIHBvc2l0aW9uU3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZVgoLTUwJSknO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIHBvc2l0aW9uU3R5bGU7XG59XG5cbi8qKiBSZXR1cm4gaW5kZXggdmFsdWUgaWYgaXMgbGlzdCBvciByZXR1cm4gdmFsdWUgZGlyZWN0bHkgKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbmRleCh2YWx1ZSwgaW5kZXgpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWVbaW5kZXhdIDogdmFsdWU7XG59IiwgImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcInByZWZpeENsc1wiLCBcInZhbHVlXCIsIFwidmFsdWVJbmRleFwiLCBcIm9uU3RhcnRNb3ZlXCIsIFwib25EZWxldGVcIiwgXCJzdHlsZVwiLCBcInJlbmRlclwiLCBcImRyYWdnaW5nXCIsIFwiZHJhZ2dpbmdEZWxldGVcIiwgXCJvbk9mZnNldENoYW5nZVwiLCBcIm9uQ2hhbmdlQ29tcGxldGVcIiwgXCJvbkZvY3VzXCIsIFwib25Nb3VzZUVudGVyXCJdO1xuaW1wb3J0IGNscyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBLZXlDb2RlIGZyb20gXCJyYy11dGlsL2VzL0tleUNvZGVcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBTbGlkZXJDb250ZXh0IGZyb20gXCIuLi9jb250ZXh0XCI7XG5pbXBvcnQgeyBnZXREaXJlY3Rpb25TdHlsZSwgZ2V0SW5kZXggfSBmcm9tIFwiLi4vdXRpbFwiO1xudmFyIEhhbmRsZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICB2YWx1ZUluZGV4ID0gcHJvcHMudmFsdWVJbmRleCxcbiAgICBvblN0YXJ0TW92ZSA9IHByb3BzLm9uU3RhcnRNb3ZlLFxuICAgIG9uRGVsZXRlID0gcHJvcHMub25EZWxldGUsXG4gICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICByZW5kZXIgPSBwcm9wcy5yZW5kZXIsXG4gICAgZHJhZ2dpbmcgPSBwcm9wcy5kcmFnZ2luZyxcbiAgICBkcmFnZ2luZ0RlbGV0ZSA9IHByb3BzLmRyYWdnaW5nRGVsZXRlLFxuICAgIG9uT2Zmc2V0Q2hhbmdlID0gcHJvcHMub25PZmZzZXRDaGFuZ2UsXG4gICAgb25DaGFuZ2VDb21wbGV0ZSA9IHByb3BzLm9uQ2hhbmdlQ29tcGxldGUsXG4gICAgb25Gb2N1cyA9IHByb3BzLm9uRm9jdXMsXG4gICAgb25Nb3VzZUVudGVyID0gcHJvcHMub25Nb3VzZUVudGVyLFxuICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgX2V4Y2x1ZGVkKTtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChTbGlkZXJDb250ZXh0KSxcbiAgICBtaW4gPSBfUmVhY3QkdXNlQ29udGV4dC5taW4sXG4gICAgbWF4ID0gX1JlYWN0JHVzZUNvbnRleHQubWF4LFxuICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbixcbiAgICBkaXNhYmxlZCA9IF9SZWFjdCR1c2VDb250ZXh0LmRpc2FibGVkLFxuICAgIGtleWJvYXJkID0gX1JlYWN0JHVzZUNvbnRleHQua2V5Ym9hcmQsXG4gICAgcmFuZ2UgPSBfUmVhY3QkdXNlQ29udGV4dC5yYW5nZSxcbiAgICB0YWJJbmRleCA9IF9SZWFjdCR1c2VDb250ZXh0LnRhYkluZGV4LFxuICAgIGFyaWFMYWJlbEZvckhhbmRsZSA9IF9SZWFjdCR1c2VDb250ZXh0LmFyaWFMYWJlbEZvckhhbmRsZSxcbiAgICBhcmlhTGFiZWxsZWRCeUZvckhhbmRsZSA9IF9SZWFjdCR1c2VDb250ZXh0LmFyaWFMYWJlbGxlZEJ5Rm9ySGFuZGxlLFxuICAgIGFyaWFSZXF1aXJlZCA9IF9SZWFjdCR1c2VDb250ZXh0LmFyaWFSZXF1aXJlZCxcbiAgICBhcmlhVmFsdWVUZXh0Rm9ybWF0dGVyRm9ySGFuZGxlID0gX1JlYWN0JHVzZUNvbnRleHQuYXJpYVZhbHVlVGV4dEZvcm1hdHRlckZvckhhbmRsZSxcbiAgICBzdHlsZXMgPSBfUmVhY3QkdXNlQ29udGV4dC5zdHlsZXMsXG4gICAgY2xhc3NOYW1lcyA9IF9SZWFjdCR1c2VDb250ZXh0LmNsYXNzTmFtZXM7XG4gIHZhciBoYW5kbGVQcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhhbmRsZVwiKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IEV2ZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBvbkludGVybmFsU3RhcnRNb3ZlID0gZnVuY3Rpb24gb25JbnRlcm5hbFN0YXJ0TW92ZShlKSB7XG4gICAgaWYgKCFkaXNhYmxlZCkge1xuICAgICAgb25TdGFydE1vdmUoZSwgdmFsdWVJbmRleCk7XG4gICAgfVxuICB9O1xuICB2YXIgb25JbnRlcm5hbEZvY3VzID0gZnVuY3Rpb24gb25JbnRlcm5hbEZvY3VzKGUpIHtcbiAgICBvbkZvY3VzID09PSBudWxsIHx8IG9uRm9jdXMgPT09IHZvaWQgMCB8fCBvbkZvY3VzKGUsIHZhbHVlSW5kZXgpO1xuICB9O1xuICB2YXIgb25JbnRlcm5hbE1vdXNlRW50ZXIgPSBmdW5jdGlvbiBvbkludGVybmFsTW91c2VFbnRlcihlKSB7XG4gICAgb25Nb3VzZUVudGVyKGUsIHZhbHVlSW5kZXgpO1xuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBLZXlib2FyZCA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG9uS2V5RG93biA9IGZ1bmN0aW9uIG9uS2V5RG93bihlKSB7XG4gICAgaWYgKCFkaXNhYmxlZCAmJiBrZXlib2FyZCkge1xuICAgICAgdmFyIG9mZnNldCA9IG51bGw7XG5cbiAgICAgIC8vIENoYW5nZSB0aGUgdmFsdWVcbiAgICAgIHN3aXRjaCAoZS53aGljaCB8fCBlLmtleUNvZGUpIHtcbiAgICAgICAgY2FzZSBLZXlDb2RlLkxFRlQ6XG4gICAgICAgICAgb2Zmc2V0ID0gZGlyZWN0aW9uID09PSAnbHRyJyB8fCBkaXJlY3Rpb24gPT09ICdidHQnID8gLTEgOiAxO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEtleUNvZGUuUklHSFQ6XG4gICAgICAgICAgb2Zmc2V0ID0gZGlyZWN0aW9uID09PSAnbHRyJyB8fCBkaXJlY3Rpb24gPT09ICdidHQnID8gMSA6IC0xO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIC8vIFVwIGlzIHBsdXNcbiAgICAgICAgY2FzZSBLZXlDb2RlLlVQOlxuICAgICAgICAgIG9mZnNldCA9IGRpcmVjdGlvbiAhPT0gJ3R0YicgPyAxIDogLTE7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgLy8gRG93biBpcyBtaW51c1xuICAgICAgICBjYXNlIEtleUNvZGUuRE9XTjpcbiAgICAgICAgICBvZmZzZXQgPSBkaXJlY3Rpb24gIT09ICd0dGInID8gLTEgOiAxO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEtleUNvZGUuSE9NRTpcbiAgICAgICAgICBvZmZzZXQgPSAnbWluJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBLZXlDb2RlLkVORDpcbiAgICAgICAgICBvZmZzZXQgPSAnbWF4JztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBLZXlDb2RlLlBBR0VfVVA6XG4gICAgICAgICAgb2Zmc2V0ID0gMjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBLZXlDb2RlLlBBR0VfRE9XTjpcbiAgICAgICAgICBvZmZzZXQgPSAtMjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBLZXlDb2RlLkJBQ0tTUEFDRTpcbiAgICAgICAgY2FzZSBLZXlDb2RlLkRFTEVURTpcbiAgICAgICAgICBvbkRlbGV0ZSh2YWx1ZUluZGV4KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChvZmZzZXQgIT09IG51bGwpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBvbk9mZnNldENoYW5nZShvZmZzZXQsIHZhbHVlSW5kZXgpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgdmFyIGhhbmRsZUtleVVwID0gZnVuY3Rpb24gaGFuZGxlS2V5VXAoZSkge1xuICAgIHN3aXRjaCAoZS53aGljaCB8fCBlLmtleUNvZGUpIHtcbiAgICAgIGNhc2UgS2V5Q29kZS5MRUZUOlxuICAgICAgY2FzZSBLZXlDb2RlLlJJR0hUOlxuICAgICAgY2FzZSBLZXlDb2RlLlVQOlxuICAgICAgY2FzZSBLZXlDb2RlLkRPV046XG4gICAgICBjYXNlIEtleUNvZGUuSE9NRTpcbiAgICAgIGNhc2UgS2V5Q29kZS5FTkQ6XG4gICAgICBjYXNlIEtleUNvZGUuUEFHRV9VUDpcbiAgICAgIGNhc2UgS2V5Q29kZS5QQUdFX0RPV046XG4gICAgICAgIG9uQ2hhbmdlQ29tcGxldGUgPT09IG51bGwgfHwgb25DaGFuZ2VDb21wbGV0ZSA9PT0gdm9pZCAwIHx8IG9uQ2hhbmdlQ29tcGxldGUoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gT2Zmc2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHBvc2l0aW9uU3R5bGUgPSBnZXREaXJlY3Rpb25TdHlsZShkaXJlY3Rpb24sIHZhbHVlLCBtaW4sIG1heCk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgZGl2UHJvcHMgPSB7fTtcbiAgaWYgKHZhbHVlSW5kZXggIT09IG51bGwpIHtcbiAgICB2YXIgX2dldEluZGV4O1xuICAgIGRpdlByb3BzID0ge1xuICAgICAgdGFiSW5kZXg6IGRpc2FibGVkID8gbnVsbCA6IGdldEluZGV4KHRhYkluZGV4LCB2YWx1ZUluZGV4KSxcbiAgICAgIHJvbGU6ICdzbGlkZXInLFxuICAgICAgJ2FyaWEtdmFsdWVtaW4nOiBtaW4sXG4gICAgICAnYXJpYS12YWx1ZW1heCc6IG1heCxcbiAgICAgICdhcmlhLXZhbHVlbm93JzogdmFsdWUsXG4gICAgICAnYXJpYS1kaXNhYmxlZCc6IGRpc2FibGVkLFxuICAgICAgJ2FyaWEtbGFiZWwnOiBnZXRJbmRleChhcmlhTGFiZWxGb3JIYW5kbGUsIHZhbHVlSW5kZXgpLFxuICAgICAgJ2FyaWEtbGFiZWxsZWRieSc6IGdldEluZGV4KGFyaWFMYWJlbGxlZEJ5Rm9ySGFuZGxlLCB2YWx1ZUluZGV4KSxcbiAgICAgICdhcmlhLXJlcXVpcmVkJzogZ2V0SW5kZXgoYXJpYVJlcXVpcmVkLCB2YWx1ZUluZGV4KSxcbiAgICAgICdhcmlhLXZhbHVldGV4dCc6IChfZ2V0SW5kZXggPSBnZXRJbmRleChhcmlhVmFsdWVUZXh0Rm9ybWF0dGVyRm9ySGFuZGxlLCB2YWx1ZUluZGV4KSkgPT09IG51bGwgfHwgX2dldEluZGV4ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZ2V0SW5kZXgodmFsdWUpLFxuICAgICAgJ2FyaWEtb3JpZW50YXRpb24nOiBkaXJlY3Rpb24gPT09ICdsdHInIHx8IGRpcmVjdGlvbiA9PT0gJ3J0bCcgPyAnaG9yaXpvbnRhbCcgOiAndmVydGljYWwnLFxuICAgICAgb25Nb3VzZURvd246IG9uSW50ZXJuYWxTdGFydE1vdmUsXG4gICAgICBvblRvdWNoU3RhcnQ6IG9uSW50ZXJuYWxTdGFydE1vdmUsXG4gICAgICBvbkZvY3VzOiBvbkludGVybmFsRm9jdXMsXG4gICAgICBvbk1vdXNlRW50ZXI6IG9uSW50ZXJuYWxNb3VzZUVudGVyLFxuICAgICAgb25LZXlEb3duOiBvbktleURvd24sXG4gICAgICBvbktleVVwOiBoYW5kbGVLZXlVcFxuICAgIH07XG4gIH1cbiAgdmFyIGhhbmRsZU5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgcmVmOiByZWYsXG4gICAgY2xhc3NOYW1lOiBjbHMoaGFuZGxlUHJlZml4Q2xzLCBfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQoaGFuZGxlUHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KHZhbHVlSW5kZXggKyAxKSwgdmFsdWVJbmRleCAhPT0gbnVsbCAmJiByYW5nZSksIFwiXCIuY29uY2F0KGhhbmRsZVByZWZpeENscywgXCItZHJhZ2dpbmdcIiksIGRyYWdnaW5nKSwgXCJcIi5jb25jYXQoaGFuZGxlUHJlZml4Q2xzLCBcIi1kcmFnZ2luZy1kZWxldGVcIiksIGRyYWdnaW5nRGVsZXRlKSwgY2xhc3NOYW1lcy5oYW5kbGUpLFxuICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcG9zaXRpb25TdHlsZSksIHN0eWxlKSwgc3R5bGVzLmhhbmRsZSlcbiAgfSwgZGl2UHJvcHMsIHJlc3RQcm9wcykpO1xuXG4gIC8vIEN1c3RvbWl6ZVxuICBpZiAocmVuZGVyKSB7XG4gICAgaGFuZGxlTm9kZSA9IHJlbmRlcihoYW5kbGVOb2RlLCB7XG4gICAgICBpbmRleDogdmFsdWVJbmRleCxcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZHJhZ2dpbmc6IGRyYWdnaW5nLFxuICAgICAgZHJhZ2dpbmdEZWxldGU6IGRyYWdnaW5nRGVsZXRlXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGhhbmRsZU5vZGU7XG59KTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIEhhbmRsZS5kaXNwbGF5TmFtZSA9ICdIYW5kbGUnO1xufVxuZXhwb3J0IGRlZmF1bHQgSGFuZGxlOyIsICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG52YXIgU2xpZGVyQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHtcbiAgbWluOiAwLFxuICBtYXg6IDAsXG4gIGRpcmVjdGlvbjogJ2x0cicsXG4gIHN0ZXA6IDEsXG4gIGluY2x1ZGVkU3RhcnQ6IDAsXG4gIGluY2x1ZGVkRW5kOiAwLFxuICB0YWJJbmRleDogMCxcbiAga2V5Ym9hcmQ6IHRydWUsXG4gIHN0eWxlczoge30sXG4gIGNsYXNzTmFtZXM6IHt9XG59KTtcbmV4cG9ydCBkZWZhdWx0IFNsaWRlckNvbnRleHQ7XG4vKiogQHByaXZhdGUgTk9UIFBST01JU0UgQVZBSUxBQkxFLiBETyBOT1QgVVNFIElOIFBST0RVQ1RJT04uICovXG5leHBvcnQgdmFyIFVuc3RhYmxlQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHt9KTsiLCAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IE1hcmsgZnJvbSBcIi4vTWFya1wiO1xudmFyIE1hcmtzID0gZnVuY3Rpb24gTWFya3MocHJvcHMpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBtYXJrcyA9IHByb3BzLm1hcmtzLFxuICAgIG9uQ2xpY2sgPSBwcm9wcy5vbkNsaWNrO1xuICB2YXIgbWFya1ByZWZpeENscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbWFya1wiKTtcblxuICAvLyBOb3QgcmVuZGVyIG1hcmsgaWYgZW1wdHlcbiAgaWYgKCFtYXJrcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogbWFya1ByZWZpeENsc1xuICB9LCBtYXJrcy5tYXAoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIgdmFsdWUgPSBfcmVmLnZhbHVlLFxuICAgICAgc3R5bGUgPSBfcmVmLnN0eWxlLFxuICAgICAgbGFiZWwgPSBfcmVmLmxhYmVsO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChNYXJrLCB7XG4gICAgICBrZXk6IHZhbHVlLFxuICAgICAgcHJlZml4Q2xzOiBtYXJrUHJlZml4Q2xzLFxuICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgb25DbGljazogb25DbGlja1xuICAgIH0sIGxhYmVsKTtcbiAgfSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IE1hcmtzOyIsICJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFNsaWRlckNvbnRleHQgZnJvbSBcIi4uL2NvbnRleHRcIjtcbmltcG9ydCB7IGdldERpcmVjdGlvblN0eWxlIH0gZnJvbSBcIi4uL3V0aWxcIjtcbnZhciBNYXJrID0gZnVuY3Rpb24gTWFyayhwcm9wcykge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICB2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgIF9vbkNsaWNrID0gcHJvcHMub25DbGljaztcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChTbGlkZXJDb250ZXh0KSxcbiAgICBtaW4gPSBfUmVhY3QkdXNlQ29udGV4dC5taW4sXG4gICAgbWF4ID0gX1JlYWN0JHVzZUNvbnRleHQubWF4LFxuICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbixcbiAgICBpbmNsdWRlZFN0YXJ0ID0gX1JlYWN0JHVzZUNvbnRleHQuaW5jbHVkZWRTdGFydCxcbiAgICBpbmNsdWRlZEVuZCA9IF9SZWFjdCR1c2VDb250ZXh0LmluY2x1ZGVkRW5kLFxuICAgIGluY2x1ZGVkID0gX1JlYWN0JHVzZUNvbnRleHQuaW5jbHVkZWQ7XG4gIHZhciB0ZXh0Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10ZXh0XCIpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gT2Zmc2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHBvc2l0aW9uU3R5bGUgPSBnZXREaXJlY3Rpb25TdHlsZShkaXJlY3Rpb24sIHZhbHVlLCBtaW4sIG1heCk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyh0ZXh0Q2xzLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHRleHRDbHMsIFwiLWFjdGl2ZVwiKSwgaW5jbHVkZWQgJiYgaW5jbHVkZWRTdGFydCA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSBpbmNsdWRlZEVuZCkpLFxuICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHBvc2l0aW9uU3R5bGUpLCBzdHlsZSksXG4gICAgb25Nb3VzZURvd246IGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfSxcbiAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgX29uQ2xpY2sodmFsdWUpO1xuICAgIH1cbiAgfSwgY2hpbGRyZW4pO1xufTtcbmV4cG9ydCBkZWZhdWx0IE1hcms7IiwgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBTbGlkZXJDb250ZXh0IGZyb20gXCIuLi9jb250ZXh0XCI7XG5pbXBvcnQgRG90IGZyb20gXCIuL0RvdFwiO1xudmFyIFN0ZXBzID0gZnVuY3Rpb24gU3RlcHMocHJvcHMpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBtYXJrcyA9IHByb3BzLm1hcmtzLFxuICAgIGRvdHMgPSBwcm9wcy5kb3RzLFxuICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgYWN0aXZlU3R5bGUgPSBwcm9wcy5hY3RpdmVTdHlsZTtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChTbGlkZXJDb250ZXh0KSxcbiAgICBtaW4gPSBfUmVhY3QkdXNlQ29udGV4dC5taW4sXG4gICAgbWF4ID0gX1JlYWN0JHVzZUNvbnRleHQubWF4LFxuICAgIHN0ZXAgPSBfUmVhY3QkdXNlQ29udGV4dC5zdGVwO1xuICB2YXIgc3RlcERvdHMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZG90U2V0ID0gbmV3IFNldCgpO1xuXG4gICAgLy8gQWRkIG1hcmtzXG4gICAgbWFya3MuZm9yRWFjaChmdW5jdGlvbiAobWFyaykge1xuICAgICAgZG90U2V0LmFkZChtYXJrLnZhbHVlKTtcbiAgICB9KTtcblxuICAgIC8vIEZpbGwgZG90c1xuICAgIGlmIChkb3RzICYmIHN0ZXAgIT09IG51bGwpIHtcbiAgICAgIHZhciBjdXJyZW50ID0gbWluO1xuICAgICAgd2hpbGUgKGN1cnJlbnQgPD0gbWF4KSB7XG4gICAgICAgIGRvdFNldC5hZGQoY3VycmVudCk7XG4gICAgICAgIGN1cnJlbnQgKz0gc3RlcDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIEFycmF5LmZyb20oZG90U2V0KTtcbiAgfSwgW21pbiwgbWF4LCBzdGVwLCBkb3RzLCBtYXJrc10pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zdGVwXCIpXG4gIH0sIHN0ZXBEb3RzLm1hcChmdW5jdGlvbiAoZG90VmFsdWUpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRG90LCB7XG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgIGtleTogZG90VmFsdWUsXG4gICAgICB2YWx1ZTogZG90VmFsdWUsXG4gICAgICBzdHlsZTogc3R5bGUsXG4gICAgICBhY3RpdmVTdHlsZTogYWN0aXZlU3R5bGVcbiAgICB9KTtcbiAgfSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFN0ZXBzOyIsICJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFNsaWRlckNvbnRleHQgZnJvbSBcIi4uL2NvbnRleHRcIjtcbmltcG9ydCB7IGdldERpcmVjdGlvblN0eWxlIH0gZnJvbSBcIi4uL3V0aWxcIjtcbnZhciBEb3QgPSBmdW5jdGlvbiBEb3QocHJvcHMpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICB2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgYWN0aXZlU3R5bGUgPSBwcm9wcy5hY3RpdmVTdHlsZTtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChTbGlkZXJDb250ZXh0KSxcbiAgICBtaW4gPSBfUmVhY3QkdXNlQ29udGV4dC5taW4sXG4gICAgbWF4ID0gX1JlYWN0JHVzZUNvbnRleHQubWF4LFxuICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbixcbiAgICBpbmNsdWRlZCA9IF9SZWFjdCR1c2VDb250ZXh0LmluY2x1ZGVkLFxuICAgIGluY2x1ZGVkU3RhcnQgPSBfUmVhY3QkdXNlQ29udGV4dC5pbmNsdWRlZFN0YXJ0LFxuICAgIGluY2x1ZGVkRW5kID0gX1JlYWN0JHVzZUNvbnRleHQuaW5jbHVkZWRFbmQ7XG4gIHZhciBkb3RDbGFzc05hbWUgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRvdFwiKTtcbiAgdmFyIGFjdGl2ZSA9IGluY2x1ZGVkICYmIGluY2x1ZGVkU3RhcnQgPD0gdmFsdWUgJiYgdmFsdWUgPD0gaW5jbHVkZWRFbmQ7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBPZmZzZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgbWVyZ2VkU3R5bGUgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGdldERpcmVjdGlvblN0eWxlKGRpcmVjdGlvbiwgdmFsdWUsIG1pbiwgbWF4KSksIHR5cGVvZiBzdHlsZSA9PT0gJ2Z1bmN0aW9uJyA/IHN0eWxlKHZhbHVlKSA6IHN0eWxlKTtcbiAgaWYgKGFjdGl2ZSkge1xuICAgIG1lcmdlZFN0eWxlID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBtZXJnZWRTdHlsZSksIHR5cGVvZiBhY3RpdmVTdHlsZSA9PT0gJ2Z1bmN0aW9uJyA/IGFjdGl2ZVN0eWxlKHZhbHVlKSA6IGFjdGl2ZVN0eWxlKTtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoZG90Q2xhc3NOYW1lLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KGRvdENsYXNzTmFtZSwgXCItYWN0aXZlXCIpLCBhY3RpdmUpKSxcbiAgICBzdHlsZTogbWVyZ2VkU3R5bGVcbiAgfSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgRG90OyIsICJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IGNscyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBTbGlkZXJDb250ZXh0IGZyb20gXCIuLi9jb250ZXh0XCI7XG5pbXBvcnQgeyBnZXRJbmRleCB9IGZyb20gXCIuLi91dGlsXCI7XG5pbXBvcnQgVHJhY2sgZnJvbSBcIi4vVHJhY2tcIjtcbnZhciBUcmFja3MgPSBmdW5jdGlvbiBUcmFja3MocHJvcHMpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgIHZhbHVlcyA9IHByb3BzLnZhbHVlcyxcbiAgICBzdGFydFBvaW50ID0gcHJvcHMuc3RhcnRQb2ludCxcbiAgICBvblN0YXJ0TW92ZSA9IHByb3BzLm9uU3RhcnRNb3ZlO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KFNsaWRlckNvbnRleHQpLFxuICAgIGluY2x1ZGVkID0gX1JlYWN0JHVzZUNvbnRleHQuaW5jbHVkZWQsXG4gICAgcmFuZ2UgPSBfUmVhY3QkdXNlQ29udGV4dC5yYW5nZSxcbiAgICBtaW4gPSBfUmVhY3QkdXNlQ29udGV4dC5taW4sXG4gICAgc3R5bGVzID0gX1JlYWN0JHVzZUNvbnRleHQuc3R5bGVzLFxuICAgIGNsYXNzTmFtZXMgPSBfUmVhY3QkdXNlQ29udGV4dC5jbGFzc05hbWVzO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBMaXN0ID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgdHJhY2tMaXN0ID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFyYW5nZSkge1xuICAgICAgLy8gbnVsbCB2YWx1ZSBkbyBub3QgaGF2ZSB0cmFja1xuICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIHN0YXJ0VmFsdWUgPSBzdGFydFBvaW50ICE9PSBudWxsICYmIHN0YXJ0UG9pbnQgIT09IHZvaWQgMCA/IHN0YXJ0UG9pbnQgOiBtaW47XG4gICAgICB2YXIgZW5kVmFsdWUgPSB2YWx1ZXNbMF07XG4gICAgICByZXR1cm4gW3tcbiAgICAgICAgc3RhcnQ6IE1hdGgubWluKHN0YXJ0VmFsdWUsIGVuZFZhbHVlKSxcbiAgICAgICAgZW5kOiBNYXRoLm1heChzdGFydFZhbHVlLCBlbmRWYWx1ZSlcbiAgICAgIH1dO1xuICAgIH1cblxuICAgIC8vIE11bHRpcGxlXG4gICAgdmFyIGxpc3QgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGggLSAxOyBpICs9IDEpIHtcbiAgICAgIGxpc3QucHVzaCh7XG4gICAgICAgIHN0YXJ0OiB2YWx1ZXNbaV0sXG4gICAgICAgIGVuZDogdmFsdWVzW2kgKyAxXVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBsaXN0O1xuICB9LCBbdmFsdWVzLCByYW5nZSwgc3RhcnRQb2ludCwgbWluXSk7XG4gIGlmICghaW5jbHVkZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgdHJhY2tzTm9kZSA9IHRyYWNrTGlzdCAhPT0gbnVsbCAmJiB0cmFja0xpc3QgIT09IHZvaWQgMCAmJiB0cmFja0xpc3QubGVuZ3RoICYmIChjbGFzc05hbWVzLnRyYWNrcyB8fCBzdHlsZXMudHJhY2tzKSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRyYWNrLCB7XG4gICAgaW5kZXg6IG51bGwsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgc3RhcnQ6IHRyYWNrTGlzdFswXS5zdGFydCxcbiAgICBlbmQ6IHRyYWNrTGlzdFt0cmFja0xpc3QubGVuZ3RoIC0gMV0uZW5kLFxuICAgIHJlcGxhY2VDbHM6IGNscyhjbGFzc05hbWVzLnRyYWNrcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10cmFja3NcIikpLFxuICAgIHN0eWxlOiBzdHlsZXMudHJhY2tzXG4gIH0pIDogbnVsbDtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCB0cmFja3NOb2RlLCB0cmFja0xpc3QubWFwKGZ1bmN0aW9uIChfcmVmLCBpbmRleCkge1xuICAgIHZhciBzdGFydCA9IF9yZWYuc3RhcnQsXG4gICAgICBlbmQgPSBfcmVmLmVuZDtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVHJhY2ssIHtcbiAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZ2V0SW5kZXgoc3R5bGUsIGluZGV4KSksIHN0eWxlcy50cmFjayksXG4gICAgICBzdGFydDogc3RhcnQsXG4gICAgICBlbmQ6IGVuZCxcbiAgICAgIGtleTogaW5kZXgsXG4gICAgICBvblN0YXJ0TW92ZTogb25TdGFydE1vdmVcbiAgICB9KTtcbiAgfSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFRyYWNrczsiLCAiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgY2xzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFNsaWRlckNvbnRleHQgZnJvbSBcIi4uL2NvbnRleHRcIjtcbmltcG9ydCB7IGdldE9mZnNldCB9IGZyb20gXCIuLi91dGlsXCI7XG52YXIgVHJhY2sgPSBmdW5jdGlvbiBUcmFjayhwcm9wcykge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgc3RhcnQgPSBwcm9wcy5zdGFydCxcbiAgICBlbmQgPSBwcm9wcy5lbmQsXG4gICAgaW5kZXggPSBwcm9wcy5pbmRleCxcbiAgICBvblN0YXJ0TW92ZSA9IHByb3BzLm9uU3RhcnRNb3ZlLFxuICAgIHJlcGxhY2VDbHMgPSBwcm9wcy5yZXBsYWNlQ2xzO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KFNsaWRlckNvbnRleHQpLFxuICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbixcbiAgICBtaW4gPSBfUmVhY3QkdXNlQ29udGV4dC5taW4sXG4gICAgbWF4ID0gX1JlYWN0JHVzZUNvbnRleHQubWF4LFxuICAgIGRpc2FibGVkID0gX1JlYWN0JHVzZUNvbnRleHQuZGlzYWJsZWQsXG4gICAgcmFuZ2UgPSBfUmVhY3QkdXNlQ29udGV4dC5yYW5nZSxcbiAgICBjbGFzc05hbWVzID0gX1JlYWN0JHVzZUNvbnRleHQuY2xhc3NOYW1lcztcbiAgdmFyIHRyYWNrUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10cmFja1wiKTtcbiAgdmFyIG9mZnNldFN0YXJ0ID0gZ2V0T2Zmc2V0KHN0YXJ0LCBtaW4sIG1heCk7XG4gIHZhciBvZmZzZXRFbmQgPSBnZXRPZmZzZXQoZW5kLCBtaW4sIG1heCk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFdmVudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgb25JbnRlcm5hbFN0YXJ0TW92ZSA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxTdGFydE1vdmUoZSkge1xuICAgIGlmICghZGlzYWJsZWQgJiYgb25TdGFydE1vdmUpIHtcbiAgICAgIG9uU3RhcnRNb3ZlKGUsIC0xKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgcG9zaXRpb25TdHlsZSA9IHt9O1xuICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgIGNhc2UgJ3J0bCc6XG4gICAgICBwb3NpdGlvblN0eWxlLnJpZ2h0ID0gXCJcIi5jb25jYXQob2Zmc2V0U3RhcnQgKiAxMDAsIFwiJVwiKTtcbiAgICAgIHBvc2l0aW9uU3R5bGUud2lkdGggPSBcIlwiLmNvbmNhdChvZmZzZXRFbmQgKiAxMDAgLSBvZmZzZXRTdGFydCAqIDEwMCwgXCIlXCIpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYnR0JzpcbiAgICAgIHBvc2l0aW9uU3R5bGUuYm90dG9tID0gXCJcIi5jb25jYXQob2Zmc2V0U3RhcnQgKiAxMDAsIFwiJVwiKTtcbiAgICAgIHBvc2l0aW9uU3R5bGUuaGVpZ2h0ID0gXCJcIi5jb25jYXQob2Zmc2V0RW5kICogMTAwIC0gb2Zmc2V0U3RhcnQgKiAxMDAsIFwiJVwiKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3R0Yic6XG4gICAgICBwb3NpdGlvblN0eWxlLnRvcCA9IFwiXCIuY29uY2F0KG9mZnNldFN0YXJ0ICogMTAwLCBcIiVcIik7XG4gICAgICBwb3NpdGlvblN0eWxlLmhlaWdodCA9IFwiXCIuY29uY2F0KG9mZnNldEVuZCAqIDEwMCAtIG9mZnNldFN0YXJ0ICogMTAwLCBcIiVcIik7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcG9zaXRpb25TdHlsZS5sZWZ0ID0gXCJcIi5jb25jYXQob2Zmc2V0U3RhcnQgKiAxMDAsIFwiJVwiKTtcbiAgICAgIHBvc2l0aW9uU3R5bGUud2lkdGggPSBcIlwiLmNvbmNhdChvZmZzZXRFbmQgKiAxMDAgLSBvZmZzZXRTdGFydCAqIDEwMCwgXCIlXCIpO1xuICB9XG4gIHZhciBjbGFzc05hbWUgPSByZXBsYWNlQ2xzIHx8IGNscyh0cmFja1ByZWZpeENscywgX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQodHJhY2tQcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQoaW5kZXggKyAxKSwgaW5kZXggIT09IG51bGwgJiYgcmFuZ2UpLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRyYWNrLWRyYWdnYWJsZVwiKSwgb25TdGFydE1vdmUpLCBjbGFzc05hbWVzLnRyYWNrKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwb3NpdGlvblN0eWxlKSwgc3R5bGUpLFxuICAgIG9uTW91c2VEb3duOiBvbkludGVybmFsU3RhcnRNb3ZlLFxuICAgIG9uVG91Y2hTdGFydDogb25JbnRlcm5hbFN0YXJ0TW92ZVxuICB9KTtcbn07XG5leHBvcnQgZGVmYXVsdCBUcmFjazsiLCAiaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZUV2ZW50IGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZUV2ZW50XCI7XG5pbXBvcnQgdXNlTGF5b3V0RWZmZWN0IGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZUxheW91dEVmZmVjdFwiO1xuaW1wb3J0IHsgVW5zdGFibGVDb250ZXh0IH0gZnJvbSBcIi4uL2NvbnRleHRcIjtcbi8qKiBEcmFnIHRvIGRlbGV0ZSBvZmZzZXQuIEl0J3MgYSB1c2VyIGV4cGVyaWVuY2UgbnVtYmVyIGZvciBkcmFnZ2luZyBvdXQgKi9cbnZhciBSRU1PVkVfRElTVCA9IDEzMDtcbmZ1bmN0aW9uIGdldFBvc2l0aW9uKGUpIHtcbiAgdmFyIG9iaiA9ICd0YXJnZXRUb3VjaGVzJyBpbiBlID8gZS50YXJnZXRUb3VjaGVzWzBdIDogZTtcbiAgcmV0dXJuIHtcbiAgICBwYWdlWDogb2JqLnBhZ2VYLFxuICAgIHBhZ2VZOiBvYmoucGFnZVlcbiAgfTtcbn1cbmZ1bmN0aW9uIHVzZURyYWcoY29udGFpbmVyUmVmLCBkaXJlY3Rpb24sIHJhd1ZhbHVlcywgbWluLCBtYXgsIGZvcm1hdFZhbHVlLCB0cmlnZ2VyQ2hhbmdlLCBmaW5pc2hDaGFuZ2UsIG9mZnNldFZhbHVlcywgZWRpdGFibGUsIG1pbkNvdW50KSB7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShudWxsKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBkcmFnZ2luZ1ZhbHVlID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXREcmFnZ2luZ1ZhbHVlID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTMgPSBSZWFjdC51c2VTdGF0ZSgtMSksXG4gICAgX1JlYWN0JHVzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTMsIDIpLFxuICAgIGRyYWdnaW5nSW5kZXggPSBfUmVhY3QkdXNlU3RhdGU0WzBdLFxuICAgIHNldERyYWdnaW5nSW5kZXggPSBfUmVhY3QkdXNlU3RhdGU0WzFdO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlNSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKSxcbiAgICBfUmVhY3QkdXNlU3RhdGU2ID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlNSwgMiksXG4gICAgZHJhZ2dpbmdEZWxldGUgPSBfUmVhY3QkdXNlU3RhdGU2WzBdLFxuICAgIHNldERyYWdnaW5nRGVsZXRlID0gX1JlYWN0JHVzZVN0YXRlNlsxXTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTcgPSBSZWFjdC51c2VTdGF0ZShyYXdWYWx1ZXMpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTggPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGU3LCAyKSxcbiAgICBjYWNoZVZhbHVlcyA9IF9SZWFjdCR1c2VTdGF0ZThbMF0sXG4gICAgc2V0Q2FjaGVWYWx1ZXMgPSBfUmVhY3QkdXNlU3RhdGU4WzFdO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlOSA9IFJlYWN0LnVzZVN0YXRlKHJhd1ZhbHVlcyksXG4gICAgX1JlYWN0JHVzZVN0YXRlMTAgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGU5LCAyKSxcbiAgICBvcmlnaW5WYWx1ZXMgPSBfUmVhY3QkdXNlU3RhdGUxMFswXSxcbiAgICBzZXRPcmlnaW5WYWx1ZXMgPSBfUmVhY3QkdXNlU3RhdGUxMFsxXTtcbiAgdmFyIG1vdXNlTW92ZUV2ZW50UmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICB2YXIgbW91c2VVcEV2ZW50UmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICB2YXIgdG91Y2hFdmVudFRhcmdldFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChVbnN0YWJsZUNvbnRleHQpLFxuICAgIG9uRHJhZ1N0YXJ0ID0gX1JlYWN0JHVzZUNvbnRleHQub25EcmFnU3RhcnQsXG4gICAgb25EcmFnQ2hhbmdlID0gX1JlYWN0JHVzZUNvbnRleHQub25EcmFnQ2hhbmdlO1xuICB1c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChkcmFnZ2luZ0luZGV4ID09PSAtMSkge1xuICAgICAgc2V0Q2FjaGVWYWx1ZXMocmF3VmFsdWVzKTtcbiAgICB9XG4gIH0sIFtyYXdWYWx1ZXMsIGRyYWdnaW5nSW5kZXhdKTtcblxuICAvLyBDbGVhbiB1cCBldmVudFxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBtb3VzZU1vdmVFdmVudFJlZi5jdXJyZW50KTtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBtb3VzZVVwRXZlbnRSZWYuY3VycmVudCk7XG4gICAgICBpZiAodG91Y2hFdmVudFRhcmdldFJlZi5jdXJyZW50KSB7XG4gICAgICAgIHRvdWNoRXZlbnRUYXJnZXRSZWYuY3VycmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBtb3VzZU1vdmVFdmVudFJlZi5jdXJyZW50KTtcbiAgICAgICAgdG91Y2hFdmVudFRhcmdldFJlZi5jdXJyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgbW91c2VVcEV2ZW50UmVmLmN1cnJlbnQpO1xuICAgICAgfVxuICAgIH07XG4gIH0sIFtdKTtcbiAgdmFyIGZsdXNoVmFsdWVzID0gZnVuY3Rpb24gZmx1c2hWYWx1ZXMobmV4dFZhbHVlcywgbmV4dFZhbHVlLCBkZWxldGVNYXJrKSB7XG4gICAgLy8gUGVyZjogT25seSB1cGRhdGUgc3RhdGUgd2hlbiB2YWx1ZSBjaGFuZ2VkXG4gICAgaWYgKG5leHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzZXREcmFnZ2luZ1ZhbHVlKG5leHRWYWx1ZSk7XG4gICAgfVxuICAgIHNldENhY2hlVmFsdWVzKG5leHRWYWx1ZXMpO1xuICAgIHZhciBjaGFuZ2VWYWx1ZXMgPSBuZXh0VmFsdWVzO1xuICAgIGlmIChkZWxldGVNYXJrKSB7XG4gICAgICBjaGFuZ2VWYWx1ZXMgPSBuZXh0VmFsdWVzLmZpbHRlcihmdW5jdGlvbiAoXywgaSkge1xuICAgICAgICByZXR1cm4gaSAhPT0gZHJhZ2dpbmdJbmRleDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0cmlnZ2VyQ2hhbmdlKGNoYW5nZVZhbHVlcyk7XG4gICAgaWYgKG9uRHJhZ0NoYW5nZSkge1xuICAgICAgb25EcmFnQ2hhbmdlKHtcbiAgICAgICAgcmF3VmFsdWVzOiBuZXh0VmFsdWVzLFxuICAgICAgICBkZWxldGVJbmRleDogZGVsZXRlTWFyayA/IGRyYWdnaW5nSW5kZXggOiAtMSxcbiAgICAgICAgZHJhZ2dpbmdJbmRleDogZHJhZ2dpbmdJbmRleCxcbiAgICAgICAgZHJhZ2dpbmdWYWx1ZTogbmV4dFZhbHVlXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIHZhciB1cGRhdGVDYWNoZVZhbHVlID0gdXNlRXZlbnQoZnVuY3Rpb24gKHZhbHVlSW5kZXgsIG9mZnNldFBlcmNlbnQsIGRlbGV0ZU1hcmspIHtcbiAgICBpZiAodmFsdWVJbmRleCA9PT0gLTEpIHtcbiAgICAgIC8vID4+Pj4gRHJhZ2dpbmcgb24gdGhlIHRyYWNrXG4gICAgICB2YXIgc3RhcnRWYWx1ZSA9IG9yaWdpblZhbHVlc1swXTtcbiAgICAgIHZhciBlbmRWYWx1ZSA9IG9yaWdpblZhbHVlc1tvcmlnaW5WYWx1ZXMubGVuZ3RoIC0gMV07XG4gICAgICB2YXIgbWF4U3RhcnRPZmZzZXQgPSBtaW4gLSBzdGFydFZhbHVlO1xuICAgICAgdmFyIG1heEVuZE9mZnNldCA9IG1heCAtIGVuZFZhbHVlO1xuXG4gICAgICAvLyBHZXQgdmFsaWQgb2Zmc2V0XG4gICAgICB2YXIgb2Zmc2V0ID0gb2Zmc2V0UGVyY2VudCAqIChtYXggLSBtaW4pO1xuICAgICAgb2Zmc2V0ID0gTWF0aC5tYXgob2Zmc2V0LCBtYXhTdGFydE9mZnNldCk7XG4gICAgICBvZmZzZXQgPSBNYXRoLm1pbihvZmZzZXQsIG1heEVuZE9mZnNldCk7XG5cbiAgICAgIC8vIFVzZSBmaXJzdCB2YWx1ZSB0byByZXZlcnQgYmFjayBvZiB2YWxpZCBvZmZzZXQgKGxpa2Ugc3RlcHMgbWFya3MpXG4gICAgICB2YXIgZm9ybWF0U3RhcnRWYWx1ZSA9IGZvcm1hdFZhbHVlKHN0YXJ0VmFsdWUgKyBvZmZzZXQpO1xuICAgICAgb2Zmc2V0ID0gZm9ybWF0U3RhcnRWYWx1ZSAtIHN0YXJ0VmFsdWU7XG4gICAgICB2YXIgY2xvbmVDYWNoZVZhbHVlcyA9IG9yaWdpblZhbHVlcy5tYXAoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICByZXR1cm4gdmFsICsgb2Zmc2V0O1xuICAgICAgfSk7XG4gICAgICBmbHVzaFZhbHVlcyhjbG9uZUNhY2hlVmFsdWVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gPj4+PiBEcmFnZ2luZyBvbiB0aGUgaGFuZGxlXG4gICAgICB2YXIgb2Zmc2V0RGlzdCA9IChtYXggLSBtaW4pICogb2Zmc2V0UGVyY2VudDtcblxuICAgICAgLy8gQWx3YXlzIHN0YXJ0IHdpdGggdGhlIHZhbHVlSW5kZXggb3JpZ2luIHZhbHVlXG4gICAgICB2YXIgY2xvbmVWYWx1ZXMgPSBfdG9Db25zdW1hYmxlQXJyYXkoY2FjaGVWYWx1ZXMpO1xuICAgICAgY2xvbmVWYWx1ZXNbdmFsdWVJbmRleF0gPSBvcmlnaW5WYWx1ZXNbdmFsdWVJbmRleF07XG4gICAgICB2YXIgbmV4dCA9IG9mZnNldFZhbHVlcyhjbG9uZVZhbHVlcywgb2Zmc2V0RGlzdCwgdmFsdWVJbmRleCwgJ2Rpc3QnKTtcbiAgICAgIGZsdXNoVmFsdWVzKG5leHQudmFsdWVzLCBuZXh0LnZhbHVlLCBkZWxldGVNYXJrKTtcbiAgICB9XG4gIH0pO1xuICB2YXIgb25TdGFydE1vdmUgPSBmdW5jdGlvbiBvblN0YXJ0TW92ZShlLCB2YWx1ZUluZGV4LCBzdGFydFZhbHVlcykge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAvLyBcdTU5ODJcdTY3OUNcdTY2MkZcdTcwQjlcdTUxRkIgdHJhY2sgXHU4OUU2XHU1M0QxXHU3Njg0XHVGRjBDXHU5NzAwXHU4OTgxXHU0RjIwXHU1MTY1XHU1M0Q4XHU1MzE2XHU1NDBFXHU3Njg0XHU1MjFEXHU1OUNCXHU1MDNDXHVGRjBDXHU4MDBDXHU0RTBEXHU4MEZEXHU3NkY0XHU2M0E1XHU3NTI4IHJhd1ZhbHVlc1xuICAgIHZhciBpbml0aWFsVmFsdWVzID0gc3RhcnRWYWx1ZXMgfHwgcmF3VmFsdWVzO1xuICAgIHZhciBvcmlnaW5WYWx1ZSA9IGluaXRpYWxWYWx1ZXNbdmFsdWVJbmRleF07XG4gICAgc2V0RHJhZ2dpbmdJbmRleCh2YWx1ZUluZGV4KTtcbiAgICBzZXREcmFnZ2luZ1ZhbHVlKG9yaWdpblZhbHVlKTtcbiAgICBzZXRPcmlnaW5WYWx1ZXMoaW5pdGlhbFZhbHVlcyk7XG4gICAgc2V0Q2FjaGVWYWx1ZXMoaW5pdGlhbFZhbHVlcyk7XG4gICAgc2V0RHJhZ2dpbmdEZWxldGUoZmFsc2UpO1xuICAgIHZhciBfZ2V0UG9zaXRpb24gPSBnZXRQb3NpdGlvbihlKSxcbiAgICAgIHN0YXJ0WCA9IF9nZXRQb3NpdGlvbi5wYWdlWCxcbiAgICAgIHN0YXJ0WSA9IF9nZXRQb3NpdGlvbi5wYWdlWTtcblxuICAgIC8vIFdlIGRlY2xhcmUgaXQgaGVyZSBzaW5jZSBjbG9zdXJlIGNhbid0IGdldCBvdXRlciBsYXRlc3QgdmFsdWVcbiAgICB2YXIgZGVsZXRlTWFyayA9IGZhbHNlO1xuXG4gICAgLy8gSW50ZXJuYWwgdHJpZ2dlciBldmVudFxuICAgIGlmIChvbkRyYWdTdGFydCkge1xuICAgICAgb25EcmFnU3RhcnQoe1xuICAgICAgICByYXdWYWx1ZXM6IGluaXRpYWxWYWx1ZXMsXG4gICAgICAgIGRyYWdnaW5nSW5kZXg6IHZhbHVlSW5kZXgsXG4gICAgICAgIGRyYWdnaW5nVmFsdWU6IG9yaWdpblZhbHVlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBNb3ZpbmdcbiAgICB2YXIgb25Nb3VzZU1vdmUgPSBmdW5jdGlvbiBvbk1vdXNlTW92ZShldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHZhciBfZ2V0UG9zaXRpb24yID0gZ2V0UG9zaXRpb24oZXZlbnQpLFxuICAgICAgICBtb3ZlWCA9IF9nZXRQb3NpdGlvbjIucGFnZVgsXG4gICAgICAgIG1vdmVZID0gX2dldFBvc2l0aW9uMi5wYWdlWTtcbiAgICAgIHZhciBvZmZzZXRYID0gbW92ZVggLSBzdGFydFg7XG4gICAgICB2YXIgb2Zmc2V0WSA9IG1vdmVZIC0gc3RhcnRZO1xuICAgICAgdmFyIF9jb250YWluZXJSZWYkY3VycmVudCA9IGNvbnRhaW5lclJlZi5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgICAgICB3aWR0aCA9IF9jb250YWluZXJSZWYkY3VycmVudC53aWR0aCxcbiAgICAgICAgaGVpZ2h0ID0gX2NvbnRhaW5lclJlZiRjdXJyZW50LmhlaWdodDtcbiAgICAgIHZhciBvZmZTZXRQZXJjZW50O1xuICAgICAgdmFyIHJlbW92ZURpc3Q7XG4gICAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgICAgICBjYXNlICdidHQnOlxuICAgICAgICAgIG9mZlNldFBlcmNlbnQgPSAtb2Zmc2V0WSAvIGhlaWdodDtcbiAgICAgICAgICByZW1vdmVEaXN0ID0gb2Zmc2V0WDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndHRiJzpcbiAgICAgICAgICBvZmZTZXRQZXJjZW50ID0gb2Zmc2V0WSAvIGhlaWdodDtcbiAgICAgICAgICByZW1vdmVEaXN0ID0gb2Zmc2V0WDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncnRsJzpcbiAgICAgICAgICBvZmZTZXRQZXJjZW50ID0gLW9mZnNldFggLyB3aWR0aDtcbiAgICAgICAgICByZW1vdmVEaXN0ID0gb2Zmc2V0WTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBvZmZTZXRQZXJjZW50ID0gb2Zmc2V0WCAvIHdpZHRoO1xuICAgICAgICAgIHJlbW92ZURpc3QgPSBvZmZzZXRZO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiBuZWVkIG1hcmsgcmVtb3ZlXG4gICAgICBkZWxldGVNYXJrID0gZWRpdGFibGUgPyBNYXRoLmFicyhyZW1vdmVEaXN0KSA+IFJFTU9WRV9ESVNUICYmIG1pbkNvdW50IDwgY2FjaGVWYWx1ZXMubGVuZ3RoIDogZmFsc2U7XG4gICAgICBzZXREcmFnZ2luZ0RlbGV0ZShkZWxldGVNYXJrKTtcbiAgICAgIHVwZGF0ZUNhY2hlVmFsdWUodmFsdWVJbmRleCwgb2ZmU2V0UGVyY2VudCwgZGVsZXRlTWFyayk7XG4gICAgfTtcblxuICAgIC8vIEVuZFxuICAgIHZhciBvbk1vdXNlVXAgPSBmdW5jdGlvbiBvbk1vdXNlVXAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Nb3VzZVVwKTtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlKTtcbiAgICAgIGlmICh0b3VjaEV2ZW50VGFyZ2V0UmVmLmN1cnJlbnQpIHtcbiAgICAgICAgdG91Y2hFdmVudFRhcmdldFJlZi5jdXJyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIG1vdXNlTW92ZUV2ZW50UmVmLmN1cnJlbnQpO1xuICAgICAgICB0b3VjaEV2ZW50VGFyZ2V0UmVmLmN1cnJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBtb3VzZVVwRXZlbnRSZWYuY3VycmVudCk7XG4gICAgICB9XG4gICAgICBtb3VzZU1vdmVFdmVudFJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgIG1vdXNlVXBFdmVudFJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgIHRvdWNoRXZlbnRUYXJnZXRSZWYuY3VycmVudCA9IG51bGw7XG4gICAgICBmaW5pc2hDaGFuZ2UoZGVsZXRlTWFyayk7XG4gICAgICBzZXREcmFnZ2luZ0luZGV4KC0xKTtcbiAgICAgIHNldERyYWdnaW5nRGVsZXRlKGZhbHNlKTtcbiAgICB9O1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlKTtcbiAgICBlLmN1cnJlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBvbk1vdXNlVXApO1xuICAgIGUuY3VycmVudFRhcmdldC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBvbk1vdXNlTW92ZSk7XG4gICAgbW91c2VNb3ZlRXZlbnRSZWYuY3VycmVudCA9IG9uTW91c2VNb3ZlO1xuICAgIG1vdXNlVXBFdmVudFJlZi5jdXJyZW50ID0gb25Nb3VzZVVwO1xuICAgIHRvdWNoRXZlbnRUYXJnZXRSZWYuY3VycmVudCA9IGUuY3VycmVudFRhcmdldDtcbiAgfTtcblxuICAvLyBPbmx5IHJldHVybiBjYWNoZSB2YWx1ZSB3aGVuIGl0IG1hcHBpbmcgd2l0aCByYXdWYWx1ZXNcbiAgdmFyIHJldHVyblZhbHVlcyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBzb3VyY2VWYWx1ZXMgPSBfdG9Db25zdW1hYmxlQXJyYXkocmF3VmFsdWVzKS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gYSAtIGI7XG4gICAgfSk7XG4gICAgdmFyIHRhcmdldFZhbHVlcyA9IF90b0NvbnN1bWFibGVBcnJheShjYWNoZVZhbHVlcykuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEgLSBiO1xuICAgIH0pO1xuICAgIHZhciBjb3VudHMgPSB7fTtcbiAgICB0YXJnZXRWYWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAodmFsKSB7XG4gICAgICBjb3VudHNbdmFsXSA9IChjb3VudHNbdmFsXSB8fCAwKSArIDE7XG4gICAgfSk7XG4gICAgc291cmNlVmFsdWVzLmZvckVhY2goZnVuY3Rpb24gKHZhbCkge1xuICAgICAgY291bnRzW3ZhbF0gPSAoY291bnRzW3ZhbF0gfHwgMCkgLSAxO1xuICAgIH0pO1xuICAgIHZhciBtYXhEaWZmQ291bnQgPSBlZGl0YWJsZSA/IDEgOiAwO1xuICAgIHZhciBkaWZmQ291bnQgPSBPYmplY3QudmFsdWVzKGNvdW50cykucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCBuZXh0KSB7XG4gICAgICByZXR1cm4gcHJldiArIE1hdGguYWJzKG5leHQpO1xuICAgIH0sIDApO1xuICAgIHJldHVybiBkaWZmQ291bnQgPD0gbWF4RGlmZkNvdW50ID8gY2FjaGVWYWx1ZXMgOiByYXdWYWx1ZXM7XG4gIH0sIFtyYXdWYWx1ZXMsIGNhY2hlVmFsdWVzLCBlZGl0YWJsZV0pO1xuICByZXR1cm4gW2RyYWdnaW5nSW5kZXgsIGRyYWdnaW5nVmFsdWUsIGRyYWdnaW5nRGVsZXRlLCByZXR1cm5WYWx1ZXMsIG9uU3RhcnRNb3ZlXTtcbn1cbmV4cG9ydCBkZWZhdWx0IHVzZURyYWc7IiwgImltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbi8qKiBGb3JtYXQgdGhlIHZhbHVlIGluIHRoZSByYW5nZSBvZiBbbWluLCBtYXhdICovXG5cbi8qKiBGb3JtYXQgdmFsdWUgYWxpZ24gd2l0aCBzdGVwICovXG5cbi8qKiBGb3JtYXQgdmFsdWUgYWxpZ24gd2l0aCBzdGVwICYgbWFya3MgKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlT2Zmc2V0KG1pbiwgbWF4LCBzdGVwLCBtYXJrTGlzdCwgYWxsb3dDcm9zcywgcHVzaGFibGUpIHtcbiAgdmFyIGZvcm1hdFJhbmdlVmFsdWUgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAodmFsKSB7XG4gICAgcmV0dXJuIE1hdGgubWF4KG1pbiwgTWF0aC5taW4obWF4LCB2YWwpKTtcbiAgfSwgW21pbiwgbWF4XSk7XG4gIHZhciBmb3JtYXRTdGVwVmFsdWUgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAodmFsKSB7XG4gICAgaWYgKHN0ZXAgIT09IG51bGwpIHtcbiAgICAgIHZhciBzdGVwVmFsdWUgPSBtaW4gKyBNYXRoLnJvdW5kKChmb3JtYXRSYW5nZVZhbHVlKHZhbCkgLSBtaW4pIC8gc3RlcCkgKiBzdGVwO1xuXG4gICAgICAvLyBDdXQgbnVtYmVyIGluIGNhc2UgdG8gYmUgbGlrZSAwLjMwMDAwMDAwMDAwMDAwMDA0XG4gICAgICB2YXIgZ2V0RGVjaW1hbCA9IGZ1bmN0aW9uIGdldERlY2ltYWwobnVtKSB7XG4gICAgICAgIHJldHVybiAoU3RyaW5nKG51bSkuc3BsaXQoJy4nKVsxXSB8fCAnJykubGVuZ3RoO1xuICAgICAgfTtcbiAgICAgIHZhciBtYXhEZWNpbWFsID0gTWF0aC5tYXgoZ2V0RGVjaW1hbChzdGVwKSwgZ2V0RGVjaW1hbChtYXgpLCBnZXREZWNpbWFsKG1pbikpO1xuICAgICAgdmFyIGZpeGVkVmFsdWUgPSBOdW1iZXIoc3RlcFZhbHVlLnRvRml4ZWQobWF4RGVjaW1hbCkpO1xuICAgICAgcmV0dXJuIG1pbiA8PSBmaXhlZFZhbHVlICYmIGZpeGVkVmFsdWUgPD0gbWF4ID8gZml4ZWRWYWx1ZSA6IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9LCBbc3RlcCwgbWluLCBtYXgsIGZvcm1hdFJhbmdlVmFsdWVdKTtcbiAgdmFyIGZvcm1hdFZhbHVlID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKHZhbCkge1xuICAgIHZhciBmb3JtYXROZXh0VmFsdWUgPSBmb3JtYXRSYW5nZVZhbHVlKHZhbCk7XG5cbiAgICAvLyBMaXN0IGFsaWduIHZhbHVlc1xuICAgIHZhciBhbGlnblZhbHVlcyA9IG1hcmtMaXN0Lm1hcChmdW5jdGlvbiAobWFyaykge1xuICAgICAgcmV0dXJuIG1hcmsudmFsdWU7XG4gICAgfSk7XG4gICAgaWYgKHN0ZXAgIT09IG51bGwpIHtcbiAgICAgIGFsaWduVmFsdWVzLnB1c2goZm9ybWF0U3RlcFZhbHVlKHZhbCkpO1xuICAgIH1cblxuICAgIC8vIG1pbiAmIG1heFxuICAgIGFsaWduVmFsdWVzLnB1c2gobWluLCBtYXgpO1xuXG4gICAgLy8gQWxpZ24gd2l0aCBtYXJrc1xuICAgIHZhciBjbG9zZVZhbHVlID0gYWxpZ25WYWx1ZXNbMF07XG4gICAgdmFyIGNsb3NlRGlzdCA9IG1heCAtIG1pbjtcbiAgICBhbGlnblZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uIChhbGlnblZhbHVlKSB7XG4gICAgICB2YXIgZGlzdCA9IE1hdGguYWJzKGZvcm1hdE5leHRWYWx1ZSAtIGFsaWduVmFsdWUpO1xuICAgICAgaWYgKGRpc3QgPD0gY2xvc2VEaXN0KSB7XG4gICAgICAgIGNsb3NlVmFsdWUgPSBhbGlnblZhbHVlO1xuICAgICAgICBjbG9zZURpc3QgPSBkaXN0O1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjbG9zZVZhbHVlO1xuICB9LCBbbWluLCBtYXgsIG1hcmtMaXN0LCBzdGVwLCBmb3JtYXRSYW5nZVZhbHVlLCBmb3JtYXRTdGVwVmFsdWVdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBPZmZzZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gU2luZ2xlIFZhbHVlXG4gIHZhciBvZmZzZXRWYWx1ZSA9IGZ1bmN0aW9uIG9mZnNldFZhbHVlKHZhbHVlcywgb2Zmc2V0LCB2YWx1ZUluZGV4KSB7XG4gICAgdmFyIG1vZGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6ICd1bml0JztcbiAgICBpZiAodHlwZW9mIG9mZnNldCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHZhciBuZXh0VmFsdWU7XG4gICAgICB2YXIgb3JpZ2luVmFsdWUgPSB2YWx1ZXNbdmFsdWVJbmRleF07XG5cbiAgICAgIC8vIE9ubHkgdXNlZCBmb3IgYGRpc3RgIG1vZGVcbiAgICAgIHZhciB0YXJnZXREaXN0VmFsdWUgPSBvcmlnaW5WYWx1ZSArIG9mZnNldDtcblxuICAgICAgLy8gQ29tcGFyZSBuZXh0IHN0ZXAgdmFsdWUgJiBtYXJrIHZhbHVlIHdoaWNoIGlzIGJlc3QgbWF0Y2hcbiAgICAgIHZhciBwb3RlbnRpYWxWYWx1ZXMgPSBbXTtcbiAgICAgIG1hcmtMaXN0LmZvckVhY2goZnVuY3Rpb24gKG1hcmspIHtcbiAgICAgICAgcG90ZW50aWFsVmFsdWVzLnB1c2gobWFyay52YWx1ZSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gTWluICYgTWF4XG4gICAgICBwb3RlbnRpYWxWYWx1ZXMucHVzaChtaW4sIG1heCk7XG5cbiAgICAgIC8vIEluIGNhc2Ugb3JpZ2luIHZhbHVlIGlzIGFsaWduIHdpdGggbWFyayBidXQgbm90IHdpdGggc3RlcFxuICAgICAgcG90ZW50aWFsVmFsdWVzLnB1c2goZm9ybWF0U3RlcFZhbHVlKG9yaWdpblZhbHVlKSk7XG5cbiAgICAgIC8vIFB1dCBvZmZzZXQgc3RlcCB2YWx1ZSBhbHNvXG4gICAgICB2YXIgc2lnbiA9IG9mZnNldCA+IDAgPyAxIDogLTE7XG4gICAgICBpZiAobW9kZSA9PT0gJ3VuaXQnKSB7XG4gICAgICAgIHBvdGVudGlhbFZhbHVlcy5wdXNoKGZvcm1hdFN0ZXBWYWx1ZShvcmlnaW5WYWx1ZSArIHNpZ24gKiBzdGVwKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwb3RlbnRpYWxWYWx1ZXMucHVzaChmb3JtYXRTdGVwVmFsdWUodGFyZ2V0RGlzdFZhbHVlKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEZpbmQgY2xvc2Ugb25lXG4gICAgICBwb3RlbnRpYWxWYWx1ZXMgPSBwb3RlbnRpYWxWYWx1ZXMuZmlsdGVyKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgcmV0dXJuIHZhbCAhPT0gbnVsbDtcbiAgICAgIH0pXG4gICAgICAvLyBSZW1vdmUgcmV2ZXJzZSB2YWx1ZVxuICAgICAgLmZpbHRlcihmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPCAwID8gdmFsIDw9IG9yaWdpblZhbHVlIDogdmFsID49IG9yaWdpblZhbHVlO1xuICAgICAgfSk7XG4gICAgICBpZiAobW9kZSA9PT0gJ3VuaXQnKSB7XG4gICAgICAgIC8vIGB1bml0YCBtb2RlIGNhbiBub3QgY29udGFpbiBpdHNlbGZcbiAgICAgICAgcG90ZW50aWFsVmFsdWVzID0gcG90ZW50aWFsVmFsdWVzLmZpbHRlcihmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbCAhPT0gb3JpZ2luVmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdmFyIGNvbXBhcmVWYWx1ZSA9IG1vZGUgPT09ICd1bml0JyA/IG9yaWdpblZhbHVlIDogdGFyZ2V0RGlzdFZhbHVlO1xuICAgICAgbmV4dFZhbHVlID0gcG90ZW50aWFsVmFsdWVzWzBdO1xuICAgICAgdmFyIHZhbHVlRGlzdCA9IE1hdGguYWJzKG5leHRWYWx1ZSAtIGNvbXBhcmVWYWx1ZSk7XG4gICAgICBwb3RlbnRpYWxWYWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAocG90ZW50aWFsVmFsdWUpIHtcbiAgICAgICAgdmFyIGRpc3QgPSBNYXRoLmFicyhwb3RlbnRpYWxWYWx1ZSAtIGNvbXBhcmVWYWx1ZSk7XG4gICAgICAgIGlmIChkaXN0IDwgdmFsdWVEaXN0KSB7XG4gICAgICAgICAgbmV4dFZhbHVlID0gcG90ZW50aWFsVmFsdWU7XG4gICAgICAgICAgdmFsdWVEaXN0ID0gZGlzdDtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIE91dCBvZiByYW5nZSB3aWxsIGJhY2sgdG8gcmFuZ2VcbiAgICAgIGlmIChuZXh0VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gb2Zmc2V0IDwgMCA/IG1pbiA6IG1heDtcbiAgICAgIH1cblxuICAgICAgLy8gYGRpc3RgIG1vZGVcbiAgICAgIGlmIChtb2RlID09PSAnZGlzdCcpIHtcbiAgICAgICAgcmV0dXJuIG5leHRWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gYHVuaXRgIG1vZGUgbWF5IG5lZWQgYW5vdGhlciByb3VuZFxuICAgICAgaWYgKE1hdGguYWJzKG9mZnNldCkgPiAxKSB7XG4gICAgICAgIHZhciBjbG9uZVZhbHVlcyA9IF90b0NvbnN1bWFibGVBcnJheSh2YWx1ZXMpO1xuICAgICAgICBjbG9uZVZhbHVlc1t2YWx1ZUluZGV4XSA9IG5leHRWYWx1ZTtcbiAgICAgICAgcmV0dXJuIG9mZnNldFZhbHVlKGNsb25lVmFsdWVzLCBvZmZzZXQgLSBzaWduLCB2YWx1ZUluZGV4LCBtb2RlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXh0VmFsdWU7XG4gICAgfSBlbHNlIGlmIChvZmZzZXQgPT09ICdtaW4nKSB7XG4gICAgICByZXR1cm4gbWluO1xuICAgIH0gZWxzZSBpZiAob2Zmc2V0ID09PSAnbWF4Jykge1xuICAgICAgcmV0dXJuIG1heDtcbiAgICB9XG4gIH07XG5cbiAgLyoqIFNhbWUgYXMgYG9mZnNldFZhbHVlYCBidXQgcmV0dXJuIGBjaGFuZ2VkYCBtYXJrIHRvIHRlbGwgdmFsdWUgY2hhbmdlZCAqL1xuICB2YXIgb2Zmc2V0Q2hhbmdlZFZhbHVlID0gZnVuY3Rpb24gb2Zmc2V0Q2hhbmdlZFZhbHVlKHZhbHVlcywgb2Zmc2V0LCB2YWx1ZUluZGV4KSB7XG4gICAgdmFyIG1vZGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6ICd1bml0JztcbiAgICB2YXIgb3JpZ2luVmFsdWUgPSB2YWx1ZXNbdmFsdWVJbmRleF07XG4gICAgdmFyIG5leHRWYWx1ZSA9IG9mZnNldFZhbHVlKHZhbHVlcywgb2Zmc2V0LCB2YWx1ZUluZGV4LCBtb2RlKTtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IG5leHRWYWx1ZSxcbiAgICAgIGNoYW5nZWQ6IG5leHRWYWx1ZSAhPT0gb3JpZ2luVmFsdWVcbiAgICB9O1xuICB9O1xuICB2YXIgbmVlZFB1c2ggPSBmdW5jdGlvbiBuZWVkUHVzaChkaXN0KSB7XG4gICAgcmV0dXJuIHB1c2hhYmxlID09PSBudWxsICYmIGRpc3QgPT09IDAgfHwgdHlwZW9mIHB1c2hhYmxlID09PSAnbnVtYmVyJyAmJiBkaXN0IDwgcHVzaGFibGU7XG4gIH07XG5cbiAgLy8gVmFsdWVzXG4gIHZhciBvZmZzZXRWYWx1ZXMgPSBmdW5jdGlvbiBvZmZzZXRWYWx1ZXModmFsdWVzLCBvZmZzZXQsIHZhbHVlSW5kZXgpIHtcbiAgICB2YXIgbW9kZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogJ3VuaXQnO1xuICAgIHZhciBuZXh0VmFsdWVzID0gdmFsdWVzLm1hcChmb3JtYXRWYWx1ZSk7XG4gICAgdmFyIG9yaWdpblZhbHVlID0gbmV4dFZhbHVlc1t2YWx1ZUluZGV4XTtcbiAgICB2YXIgbmV4dFZhbHVlID0gb2Zmc2V0VmFsdWUobmV4dFZhbHVlcywgb2Zmc2V0LCB2YWx1ZUluZGV4LCBtb2RlKTtcbiAgICBuZXh0VmFsdWVzW3ZhbHVlSW5kZXhdID0gbmV4dFZhbHVlO1xuICAgIGlmIChhbGxvd0Nyb3NzID09PSBmYWxzZSkge1xuICAgICAgLy8gPj4+Pj4gQWxsb3cgQ3Jvc3NcbiAgICAgIHZhciBwdXNoTnVtID0gcHVzaGFibGUgfHwgMDtcblxuICAgICAgLy8gPT09PT09PT09PT09IEFsbG93Q3Jvc3MgPT09PT09PT09PT09PT09XG4gICAgICBpZiAodmFsdWVJbmRleCA+IDAgJiYgbmV4dFZhbHVlc1t2YWx1ZUluZGV4IC0gMV0gIT09IG9yaWdpblZhbHVlKSB7XG4gICAgICAgIG5leHRWYWx1ZXNbdmFsdWVJbmRleF0gPSBNYXRoLm1heChuZXh0VmFsdWVzW3ZhbHVlSW5kZXhdLCBuZXh0VmFsdWVzW3ZhbHVlSW5kZXggLSAxXSArIHB1c2hOdW0pO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlSW5kZXggPCBuZXh0VmFsdWVzLmxlbmd0aCAtIDEgJiYgbmV4dFZhbHVlc1t2YWx1ZUluZGV4ICsgMV0gIT09IG9yaWdpblZhbHVlKSB7XG4gICAgICAgIG5leHRWYWx1ZXNbdmFsdWVJbmRleF0gPSBNYXRoLm1pbihuZXh0VmFsdWVzW3ZhbHVlSW5kZXhdLCBuZXh0VmFsdWVzW3ZhbHVlSW5kZXggKyAxXSAtIHB1c2hOdW0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHB1c2hhYmxlID09PSAnbnVtYmVyJyB8fCBwdXNoYWJsZSA9PT0gbnVsbCkge1xuICAgICAgLy8gPj4+Pj4gUHVzaGFibGVcbiAgICAgIC8vID09PT09PT09PT09PT09PSBQdXNoID09PT09PT09PT09PT09PT09PVxuXG4gICAgICAvLyA+Pj4+Pj4gQmFzaWMgcHVzaFxuICAgICAgLy8gRW5kIHZhbHVlc1xuICAgICAgZm9yICh2YXIgaSA9IHZhbHVlSW5kZXggKyAxOyBpIDwgbmV4dFZhbHVlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB2YXIgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIHdoaWxlIChuZWVkUHVzaChuZXh0VmFsdWVzW2ldIC0gbmV4dFZhbHVlc1tpIC0gMV0pICYmIGNoYW5nZWQpIHtcbiAgICAgICAgICB2YXIgX29mZnNldENoYW5nZWRWYWx1ZSA9IG9mZnNldENoYW5nZWRWYWx1ZShuZXh0VmFsdWVzLCAxLCBpKTtcbiAgICAgICAgICBuZXh0VmFsdWVzW2ldID0gX29mZnNldENoYW5nZWRWYWx1ZS52YWx1ZTtcbiAgICAgICAgICBjaGFuZ2VkID0gX29mZnNldENoYW5nZWRWYWx1ZS5jaGFuZ2VkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFN0YXJ0IHZhbHVlc1xuICAgICAgZm9yICh2YXIgX2kgPSB2YWx1ZUluZGV4OyBfaSA+IDA7IF9pIC09IDEpIHtcbiAgICAgICAgdmFyIF9jaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgd2hpbGUgKG5lZWRQdXNoKG5leHRWYWx1ZXNbX2ldIC0gbmV4dFZhbHVlc1tfaSAtIDFdKSAmJiBfY2hhbmdlZCkge1xuICAgICAgICAgIHZhciBfb2Zmc2V0Q2hhbmdlZFZhbHVlMiA9IG9mZnNldENoYW5nZWRWYWx1ZShuZXh0VmFsdWVzLCAtMSwgX2kgLSAxKTtcbiAgICAgICAgICBuZXh0VmFsdWVzW19pIC0gMV0gPSBfb2Zmc2V0Q2hhbmdlZFZhbHVlMi52YWx1ZTtcbiAgICAgICAgICBfY2hhbmdlZCA9IF9vZmZzZXRDaGFuZ2VkVmFsdWUyLmNoYW5nZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gPj4+Pj4gUmV2ZXJ0IGJhY2sgdG8gc2FmZSBwdXNoIHJhbmdlXG4gICAgICAvLyBFbmQgdG8gU3RhcnRcbiAgICAgIGZvciAodmFyIF9pMiA9IG5leHRWYWx1ZXMubGVuZ3RoIC0gMTsgX2kyID4gMDsgX2kyIC09IDEpIHtcbiAgICAgICAgdmFyIF9jaGFuZ2VkMiA9IHRydWU7XG4gICAgICAgIHdoaWxlIChuZWVkUHVzaChuZXh0VmFsdWVzW19pMl0gLSBuZXh0VmFsdWVzW19pMiAtIDFdKSAmJiBfY2hhbmdlZDIpIHtcbiAgICAgICAgICB2YXIgX29mZnNldENoYW5nZWRWYWx1ZTMgPSBvZmZzZXRDaGFuZ2VkVmFsdWUobmV4dFZhbHVlcywgLTEsIF9pMiAtIDEpO1xuICAgICAgICAgIG5leHRWYWx1ZXNbX2kyIC0gMV0gPSBfb2Zmc2V0Q2hhbmdlZFZhbHVlMy52YWx1ZTtcbiAgICAgICAgICBfY2hhbmdlZDIgPSBfb2Zmc2V0Q2hhbmdlZFZhbHVlMy5jaGFuZ2VkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFN0YXJ0IHRvIEVuZFxuICAgICAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgbmV4dFZhbHVlcy5sZW5ndGggLSAxOyBfaTMgKz0gMSkge1xuICAgICAgICB2YXIgX2NoYW5nZWQzID0gdHJ1ZTtcbiAgICAgICAgd2hpbGUgKG5lZWRQdXNoKG5leHRWYWx1ZXNbX2kzICsgMV0gLSBuZXh0VmFsdWVzW19pM10pICYmIF9jaGFuZ2VkMykge1xuICAgICAgICAgIHZhciBfb2Zmc2V0Q2hhbmdlZFZhbHVlNCA9IG9mZnNldENoYW5nZWRWYWx1ZShuZXh0VmFsdWVzLCAxLCBfaTMgKyAxKTtcbiAgICAgICAgICBuZXh0VmFsdWVzW19pMyArIDFdID0gX29mZnNldENoYW5nZWRWYWx1ZTQudmFsdWU7XG4gICAgICAgICAgX2NoYW5nZWQzID0gX29mZnNldENoYW5nZWRWYWx1ZTQuY2hhbmdlZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IG5leHRWYWx1ZXNbdmFsdWVJbmRleF0sXG4gICAgICB2YWx1ZXM6IG5leHRWYWx1ZXNcbiAgICB9O1xuICB9O1xuICByZXR1cm4gW2Zvcm1hdFZhbHVlLCBvZmZzZXRWYWx1ZXNdO1xufSIsICJpbXBvcnQgeyB3YXJuaW5nIH0gZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuaW1wb3J0IHsgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVJhbmdlKHJhbmdlKSB7XG4gIHJldHVybiB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocmFuZ2UgPT09IHRydWUgfHwgIXJhbmdlKSB7XG4gICAgICByZXR1cm4gWyEhcmFuZ2UsIGZhbHNlLCBmYWxzZSwgMF07XG4gICAgfVxuICAgIHZhciBlZGl0YWJsZSA9IHJhbmdlLmVkaXRhYmxlLFxuICAgICAgZHJhZ2dhYmxlVHJhY2sgPSByYW5nZS5kcmFnZ2FibGVUcmFjayxcbiAgICAgIG1pbkNvdW50ID0gcmFuZ2UubWluQ291bnQsXG4gICAgICBtYXhDb3VudCA9IHJhbmdlLm1heENvdW50O1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB3YXJuaW5nKCFlZGl0YWJsZSB8fCAhZHJhZ2dhYmxlVHJhY2ssICdgZWRpdGFibGVgIGNhbiBub3Qgd29yayB3aXRoIGBkcmFnZ2FibGVUcmFja2AuJyk7XG4gICAgfVxuICAgIHJldHVybiBbdHJ1ZSwgZWRpdGFibGUsICFlZGl0YWJsZSAmJiBkcmFnZ2FibGVUcmFjaywgbWluQ291bnQgfHwgMCwgbWF4Q291bnRdO1xuICB9LCBbcmFuZ2VdKTtcbn0iLCAiaW1wb3J0IFNsaWRlciBmcm9tIFwiLi9TbGlkZXJcIjtcbmV4cG9ydCB7IFVuc3RhYmxlQ29udGV4dCB9IGZyb20gXCIuL2NvbnRleHRcIjtcbmV4cG9ydCBkZWZhdWx0IFNsaWRlcjsiLCAiXCJ1c2UgY2xpZW50XCI7XG5cbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUmNTbGlkZXIgZnJvbSAncmMtc2xpZGVyJztcbmltcG9ydCByYWYgZnJvbSBcInJjLXV0aWwvZXMvcmFmXCI7XG5pbXBvcnQgeyBkZXZVc2VXYXJuaW5nIH0gZnJvbSAnLi4vX3V0aWwvd2FybmluZyc7XG5pbXBvcnQgRGlzYWJsZWRDb250ZXh0IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlci9EaXNhYmxlZENvbnRleHQnO1xuaW1wb3J0IFNsaWRlckludGVybmFsQ29udGV4dCBmcm9tICcuL0NvbnRleHQnO1xuaW1wb3J0IFNsaWRlclRvb2x0aXAgZnJvbSAnLi9TbGlkZXJUb29sdGlwJztcbmltcG9ydCB1c2VTdHlsZSBmcm9tICcuL3N0eWxlJztcbmltcG9ydCB1c2VSYWZMb2NrIGZyb20gJy4vdXNlUmFmTG9jayc7XG5pbXBvcnQgeyB1c2VDb21wb25lbnRDb25maWcgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXIvY29udGV4dCc7XG5mdW5jdGlvbiBnZXRUaXBGb3JtYXR0ZXIodGlwRm9ybWF0dGVyLCBsZWdhY3lUaXBGb3JtYXR0ZXIpIHtcbiAgaWYgKHRpcEZvcm1hdHRlciB8fCB0aXBGb3JtYXR0ZXIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdGlwRm9ybWF0dGVyO1xuICB9XG4gIGlmIChsZWdhY3lUaXBGb3JtYXR0ZXIgfHwgbGVnYWN5VGlwRm9ybWF0dGVyID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGxlZ2FjeVRpcEZvcm1hdHRlcjtcbiAgfVxuICByZXR1cm4gdmFsID0+IHR5cGVvZiB2YWwgPT09ICdudW1iZXInID8gdmFsLnRvU3RyaW5nKCkgOiAnJztcbn1cbmNvbnN0IFNsaWRlciA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgcmVmKSA9PiB7XG4gIGNvbnN0IHtcbiAgICAgIHByZWZpeENsczogY3VzdG9taXplUHJlZml4Q2xzLFxuICAgICAgcmFuZ2UsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICByb290Q2xhc3NOYW1lLFxuICAgICAgc3R5bGUsXG4gICAgICBkaXNhYmxlZCxcbiAgICAgIC8vIERlcHJlY2F0ZWQgUHJvcHNcbiAgICAgIHRvb2x0aXBQcmVmaXhDbHM6IGxlZ2FjeVRvb2x0aXBQcmVmaXhDbHMsXG4gICAgICB0aXBGb3JtYXR0ZXI6IGxlZ2FjeVRpcEZvcm1hdHRlcixcbiAgICAgIHRvb2x0aXBWaXNpYmxlOiBsZWdhY3lUb29sdGlwVmlzaWJsZSxcbiAgICAgIGdldFRvb2x0aXBQb3B1cENvbnRhaW5lcjogbGVnYWN5R2V0VG9vbHRpcFBvcHVwQ29udGFpbmVyLFxuICAgICAgdG9vbHRpcFBsYWNlbWVudDogbGVnYWN5VG9vbHRpcFBsYWNlbWVudCxcbiAgICAgIHRvb2x0aXAgPSB7fSxcbiAgICAgIG9uQ2hhbmdlQ29tcGxldGUsXG4gICAgICBjbGFzc05hbWVzOiBzbGlkZXJDbGFzc05hbWVzLFxuICAgICAgc3R5bGVzXG4gICAgfSA9IHByb3BzLFxuICAgIHJlc3RQcm9wcyA9IF9fcmVzdChwcm9wcywgW1wicHJlZml4Q2xzXCIsIFwicmFuZ2VcIiwgXCJjbGFzc05hbWVcIiwgXCJyb290Q2xhc3NOYW1lXCIsIFwic3R5bGVcIiwgXCJkaXNhYmxlZFwiLCBcInRvb2x0aXBQcmVmaXhDbHNcIiwgXCJ0aXBGb3JtYXR0ZXJcIiwgXCJ0b29sdGlwVmlzaWJsZVwiLCBcImdldFRvb2x0aXBQb3B1cENvbnRhaW5lclwiLCBcInRvb2x0aXBQbGFjZW1lbnRcIiwgXCJ0b29sdGlwXCIsIFwib25DaGFuZ2VDb21wbGV0ZVwiLCBcImNsYXNzTmFtZXNcIiwgXCJzdHlsZXNcIl0pO1xuICBjb25zdCB7XG4gICAgdmVydGljYWxcbiAgfSA9IHByb3BzO1xuICBjb25zdCB7XG4gICAgZ2V0UHJlZml4Q2xzLFxuICAgIGRpcmVjdGlvbjogY29udGV4dERpcmVjdGlvbixcbiAgICBjbGFzc05hbWU6IGNvbnRleHRDbGFzc05hbWUsXG4gICAgc3R5bGU6IGNvbnRleHRTdHlsZSxcbiAgICBjbGFzc05hbWVzOiBjb250ZXh0Q2xhc3NOYW1lcyxcbiAgICBzdHlsZXM6IGNvbnRleHRTdHlsZXMsXG4gICAgZ2V0UG9wdXBDb250YWluZXJcbiAgfSA9IHVzZUNvbXBvbmVudENvbmZpZygnc2xpZGVyJyk7XG4gIGNvbnN0IGNvbnRleHREaXNhYmxlZCA9IFJlYWN0LnVzZUNvbnRleHQoRGlzYWJsZWRDb250ZXh0KTtcbiAgY29uc3QgbWVyZ2VkRGlzYWJsZWQgPSBkaXNhYmxlZCAhPT0gbnVsbCAmJiBkaXNhYmxlZCAhPT0gdm9pZCAwID8gZGlzYWJsZWQgOiBjb250ZXh0RGlzYWJsZWQ7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IENvbnRleHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IHtcbiAgICBoYW5kbGVSZW5kZXI6IGNvbnRleHRIYW5kbGVSZW5kZXIsXG4gICAgZGlyZWN0aW9uOiBpbnRlcm5hbENvbnRleHREaXJlY3Rpb25cbiAgfSA9IFJlYWN0LnVzZUNvbnRleHQoU2xpZGVySW50ZXJuYWxDb250ZXh0KTtcbiAgY29uc3QgbWVyZ2VkRGlyZWN0aW9uID0gaW50ZXJuYWxDb250ZXh0RGlyZWN0aW9uIHx8IGNvbnRleHREaXJlY3Rpb247XG4gIGNvbnN0IGlzUlRMID0gbWVyZ2VkRGlyZWN0aW9uID09PSAncnRsJztcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBPcGVuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3QgW2hvdmVyT3Blbiwgc2V0SG92ZXJPcGVuXSA9IHVzZVJhZkxvY2soKTtcbiAgY29uc3QgW2ZvY3VzT3Blbiwgc2V0Rm9jdXNPcGVuXSA9IHVzZVJhZkxvY2soKTtcbiAgY29uc3QgdG9vbHRpcFByb3BzID0gT2JqZWN0LmFzc2lnbih7fSwgdG9vbHRpcCk7XG4gIGNvbnN0IHtcbiAgICBvcGVuOiB0b29sdGlwT3BlbixcbiAgICBwbGFjZW1lbnQ6IHRvb2x0aXBQbGFjZW1lbnQsXG4gICAgZ2V0UG9wdXBDb250YWluZXI6IGdldFRvb2x0aXBQb3B1cENvbnRhaW5lcixcbiAgICBwcmVmaXhDbHM6IGN1c3RvbWl6ZVRvb2x0aXBQcmVmaXhDbHMsXG4gICAgZm9ybWF0dGVyOiB0aXBGb3JtYXR0ZXJcbiAgfSA9IHRvb2x0aXBQcm9wcztcbiAgY29uc3QgbG9ja09wZW4gPSB0b29sdGlwT3BlbiAhPT0gbnVsbCAmJiB0b29sdGlwT3BlbiAhPT0gdm9pZCAwID8gdG9vbHRpcE9wZW4gOiBsZWdhY3lUb29sdGlwVmlzaWJsZTtcbiAgY29uc3QgYWN0aXZlT3BlbiA9IChob3Zlck9wZW4gfHwgZm9jdXNPcGVuKSAmJiBsb2NrT3BlbiAhPT0gZmFsc2U7XG4gIGNvbnN0IG1lcmdlZFRpcEZvcm1hdHRlciA9IGdldFRpcEZvcm1hdHRlcih0aXBGb3JtYXR0ZXIsIGxlZ2FjeVRpcEZvcm1hdHRlcik7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IENoYW5nZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3QgW2RyYWdnaW5nLCBzZXREcmFnZ2luZ10gPSB1c2VSYWZMb2NrKCk7XG4gIGNvbnN0IG9uSW50ZXJuYWxDaGFuZ2VDb21wbGV0ZSA9IG5leHRWYWx1ZXMgPT4ge1xuICAgIG9uQ2hhbmdlQ29tcGxldGUgPT09IG51bGwgfHwgb25DaGFuZ2VDb21wbGV0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2VDb21wbGV0ZShuZXh0VmFsdWVzKTtcbiAgICBzZXREcmFnZ2luZyhmYWxzZSk7XG4gIH07XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUGxhY2VtZW50ID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3QgZ2V0VG9vbHRpcFBsYWNlbWVudCA9IChwbGFjZW1lbnQsIHZlcnQpID0+IHtcbiAgICBpZiAocGxhY2VtZW50KSB7XG4gICAgICByZXR1cm4gcGxhY2VtZW50O1xuICAgIH1cbiAgICBpZiAoIXZlcnQpIHtcbiAgICAgIHJldHVybiAndG9wJztcbiAgICB9XG4gICAgcmV0dXJuIGlzUlRMID8gJ2xlZnQnIDogJ3JpZ2h0JztcbiAgfTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFN0eWxlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3QgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdzbGlkZXInLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICBjb25zdCBbd3JhcENTU1ZhciwgaGFzaElkLCBjc3NWYXJDbHNdID0gdXNlU3R5bGUocHJlZml4Q2xzKTtcbiAgY29uc3Qgcm9vdENsYXNzTmFtZXMgPSBjbGFzc05hbWVzKGNsYXNzTmFtZSwgY29udGV4dENsYXNzTmFtZSwgY29udGV4dENsYXNzTmFtZXMucm9vdCwgc2xpZGVyQ2xhc3NOYW1lcyA9PT0gbnVsbCB8fCBzbGlkZXJDbGFzc05hbWVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzbGlkZXJDbGFzc05hbWVzLnJvb3QsIHJvb3RDbGFzc05hbWUsIHtcbiAgICBbYCR7cHJlZml4Q2xzfS1ydGxgXTogaXNSVEwsXG4gICAgW2Ake3ByZWZpeENsc30tbG9ja2BdOiBkcmFnZ2luZ1xuICB9LCBoYXNoSWQsIGNzc1ZhckNscyk7XG4gIC8vIG1ha2UgcmV2ZXJzZSBkZWZhdWx0IG9uIHJ0bCBkaXJlY3Rpb25cbiAgaWYgKGlzUlRMICYmICFyZXN0UHJvcHMudmVydGljYWwpIHtcbiAgICByZXN0UHJvcHMucmV2ZXJzZSA9ICFyZXN0UHJvcHMucmV2ZXJzZTtcbiAgfVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBXYXJuaW5nID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBXYXJuaW5nIGZvciBkZXByZWNhdGVkIHVzYWdlXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgY29uc3Qgd2FybmluZyA9IGRldlVzZVdhcm5pbmcoJ1NsaWRlcicpO1xuICAgIFtbJ3Rvb2x0aXBQcmVmaXhDbHMnLCAncHJlZml4Q2xzJ10sIFsnZ2V0VG9vbHRpcFBvcHVwQ29udGFpbmVyJywgJ2dldFBvcHVwQ29udGFpbmVyJ10sIFsndGlwRm9ybWF0dGVyJywgJ2Zvcm1hdHRlciddLCBbJ3Rvb2x0aXBQbGFjZW1lbnQnLCAncGxhY2VtZW50J10sIFsndG9vbHRpcFZpc2libGUnLCAnb3BlbiddXS5mb3JFYWNoKF9yZWYgPT4ge1xuICAgICAgbGV0IFtkZXByZWNhdGVkTmFtZSwgbmV3TmFtZV0gPSBfcmVmO1xuICAgICAgd2FybmluZy5kZXByZWNhdGVkKCEoZGVwcmVjYXRlZE5hbWUgaW4gcHJvcHMpLCBkZXByZWNhdGVkTmFtZSwgYHRvb2x0aXAuJHtuZXdOYW1lfWApO1xuICAgIH0pO1xuICB9XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBIYW5kbGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgb25Nb3VzZVVwID0gKCkgPT4ge1xuICAgICAgLy8gRGVsYXkgZm9yIDEgZnJhbWUgdG8gbWFrZSB0aGUgY2xpY2sgdG8gZW5hYmxlIGhpZGUgdG9vbHRpcFxuICAgICAgLy8gZXZlbiB3aGVuIHRoZSBoYW5kbGUgaXMgZm9jdXNlZFxuICAgICAgcmFmKCgpID0+IHtcbiAgICAgICAgc2V0Rm9jdXNPcGVuKGZhbHNlKTtcbiAgICAgIH0sIDEpO1xuICAgIH07XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgY29uc3QgdXNlQWN0aXZlVG9vbHRpcEhhbmRsZSA9IHJhbmdlICYmICFsb2NrT3BlbjtcbiAgY29uc3QgaGFuZGxlUmVuZGVyID0gY29udGV4dEhhbmRsZVJlbmRlciB8fCAoKG5vZGUsIGluZm8pID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBpbmRleFxuICAgIH0gPSBpbmZvO1xuICAgIGNvbnN0IG5vZGVQcm9wcyA9IG5vZGUucHJvcHM7XG4gICAgZnVuY3Rpb24gcHJveHlFdmVudChldmVudE5hbWUsIGV2ZW50LCB0cmlnZ2VyUmVzdFByb3BzRXZlbnQpIHtcbiAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgIGlmICh0cmlnZ2VyUmVzdFByb3BzRXZlbnQpIHtcbiAgICAgICAgKF9iID0gKF9hID0gcmVzdFByb3BzKVtldmVudE5hbWVdKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChfYSwgZXZlbnQpO1xuICAgICAgfVxuICAgICAgKF9kID0gKF9jID0gbm9kZVByb3BzKVtldmVudE5hbWVdKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QuY2FsbChfYywgZXZlbnQpO1xuICAgIH1cbiAgICBjb25zdCBwYXNzZWRQcm9wcyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgbm9kZVByb3BzKSwge1xuICAgICAgb25Nb3VzZUVudGVyOiBlID0+IHtcbiAgICAgICAgc2V0SG92ZXJPcGVuKHRydWUpO1xuICAgICAgICBwcm94eUV2ZW50KCdvbk1vdXNlRW50ZXInLCBlKTtcbiAgICAgIH0sXG4gICAgICBvbk1vdXNlTGVhdmU6IGUgPT4ge1xuICAgICAgICBzZXRIb3Zlck9wZW4oZmFsc2UpO1xuICAgICAgICBwcm94eUV2ZW50KCdvbk1vdXNlTGVhdmUnLCBlKTtcbiAgICAgIH0sXG4gICAgICBvbk1vdXNlRG93bjogZSA9PiB7XG4gICAgICAgIHNldEZvY3VzT3Blbih0cnVlKTtcbiAgICAgICAgc2V0RHJhZ2dpbmcodHJ1ZSk7XG4gICAgICAgIHByb3h5RXZlbnQoJ29uTW91c2VEb3duJywgZSk7XG4gICAgICB9LFxuICAgICAgb25Gb2N1czogZSA9PiB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgc2V0Rm9jdXNPcGVuKHRydWUpO1xuICAgICAgICAoX2EgPSByZXN0UHJvcHMub25Gb2N1cykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwocmVzdFByb3BzLCBlKTtcbiAgICAgICAgcHJveHlFdmVudCgnb25Gb2N1cycsIGUsIHRydWUpO1xuICAgICAgfSxcbiAgICAgIG9uQmx1cjogZSA9PiB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgc2V0Rm9jdXNPcGVuKGZhbHNlKTtcbiAgICAgICAgKF9hID0gcmVzdFByb3BzLm9uQmx1cikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwocmVzdFByb3BzLCBlKTtcbiAgICAgICAgcHJveHlFdmVudCgnb25CbHVyJywgZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgY2xvbmVOb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChub2RlLCBwYXNzZWRQcm9wcyk7XG4gICAgY29uc3Qgb3BlbiA9ICghIWxvY2tPcGVuIHx8IGFjdGl2ZU9wZW4pICYmIG1lcmdlZFRpcEZvcm1hdHRlciAhPT0gbnVsbDtcbiAgICAvLyBXcmFwIG9uIGhhbmRsZSB3aXRoIFRvb2x0aXAgd2hlbiBpcyBzaW5nbGUgbW9kZSBvciBtdWx0aXBsZSB3aXRoIGFsbCBzaG93IHRvb2x0aXBcbiAgICBpZiAoIXVzZUFjdGl2ZVRvb2x0aXBIYW5kbGUpIHtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTbGlkZXJUb29sdGlwLCBPYmplY3QuYXNzaWduKHt9LCB0b29sdGlwUHJvcHMsIHtcbiAgICAgICAgcHJlZml4Q2xzOiBnZXRQcmVmaXhDbHMoJ3Rvb2x0aXAnLCBjdXN0b21pemVUb29sdGlwUHJlZml4Q2xzICE9PSBudWxsICYmIGN1c3RvbWl6ZVRvb2x0aXBQcmVmaXhDbHMgIT09IHZvaWQgMCA/IGN1c3RvbWl6ZVRvb2x0aXBQcmVmaXhDbHMgOiBsZWdhY3lUb29sdGlwUHJlZml4Q2xzKSxcbiAgICAgICAgdGl0bGU6IG1lcmdlZFRpcEZvcm1hdHRlciA/IG1lcmdlZFRpcEZvcm1hdHRlcihpbmZvLnZhbHVlKSA6ICcnLFxuICAgICAgICBvcGVuOiBvcGVuLFxuICAgICAgICBwbGFjZW1lbnQ6IGdldFRvb2x0aXBQbGFjZW1lbnQodG9vbHRpcFBsYWNlbWVudCAhPT0gbnVsbCAmJiB0b29sdGlwUGxhY2VtZW50ICE9PSB2b2lkIDAgPyB0b29sdGlwUGxhY2VtZW50IDogbGVnYWN5VG9vbHRpcFBsYWNlbWVudCwgdmVydGljYWwpLFxuICAgICAgICBrZXk6IGluZGV4LFxuICAgICAgICBjbGFzc05hbWVzOiB7XG4gICAgICAgICAgcm9vdDogYCR7cHJlZml4Q2xzfS10b29sdGlwYFxuICAgICAgICB9LFxuICAgICAgICBnZXRQb3B1cENvbnRhaW5lcjogZ2V0VG9vbHRpcFBvcHVwQ29udGFpbmVyIHx8IGxlZ2FjeUdldFRvb2x0aXBQb3B1cENvbnRhaW5lciB8fCBnZXRQb3B1cENvbnRhaW5lclxuICAgICAgfSksIGNsb25lTm9kZSk7XG4gICAgfVxuICAgIHJldHVybiBjbG9uZU5vZGU7XG4gIH0pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBBY3RpdmUgSGFuZGxlID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBhY3RpdmVIYW5kbGVSZW5kZXIgPSB1c2VBY3RpdmVUb29sdGlwSGFuZGxlID8gKGhhbmRsZSwgaW5mbykgPT4ge1xuICAgIGNvbnN0IGNsb25lTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoaGFuZGxlLCB7XG4gICAgICBzdHlsZTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBoYW5kbGUucHJvcHMuc3R5bGUpLCB7XG4gICAgICAgIHZpc2liaWxpdHk6ICdoaWRkZW4nXG4gICAgICB9KVxuICAgIH0pO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTbGlkZXJUb29sdGlwLCBPYmplY3QuYXNzaWduKHt9LCB0b29sdGlwUHJvcHMsIHtcbiAgICAgIHByZWZpeENsczogZ2V0UHJlZml4Q2xzKCd0b29sdGlwJywgY3VzdG9taXplVG9vbHRpcFByZWZpeENscyAhPT0gbnVsbCAmJiBjdXN0b21pemVUb29sdGlwUHJlZml4Q2xzICE9PSB2b2lkIDAgPyBjdXN0b21pemVUb29sdGlwUHJlZml4Q2xzIDogbGVnYWN5VG9vbHRpcFByZWZpeENscyksXG4gICAgICB0aXRsZTogbWVyZ2VkVGlwRm9ybWF0dGVyID8gbWVyZ2VkVGlwRm9ybWF0dGVyKGluZm8udmFsdWUpIDogJycsXG4gICAgICBvcGVuOiBtZXJnZWRUaXBGb3JtYXR0ZXIgIT09IG51bGwgJiYgYWN0aXZlT3BlbixcbiAgICAgIHBsYWNlbWVudDogZ2V0VG9vbHRpcFBsYWNlbWVudCh0b29sdGlwUGxhY2VtZW50ICE9PSBudWxsICYmIHRvb2x0aXBQbGFjZW1lbnQgIT09IHZvaWQgMCA/IHRvb2x0aXBQbGFjZW1lbnQgOiBsZWdhY3lUb29sdGlwUGxhY2VtZW50LCB2ZXJ0aWNhbCksXG4gICAgICBrZXk6IFwidG9vbHRpcFwiLFxuICAgICAgY2xhc3NOYW1lczoge1xuICAgICAgICByb290OiBgJHtwcmVmaXhDbHN9LXRvb2x0aXBgXG4gICAgICB9LFxuICAgICAgZ2V0UG9wdXBDb250YWluZXI6IGdldFRvb2x0aXBQb3B1cENvbnRhaW5lciB8fCBsZWdhY3lHZXRUb29sdGlwUG9wdXBDb250YWluZXIgfHwgZ2V0UG9wdXBDb250YWluZXIsXG4gICAgICBkcmFnZ2luZ0RlbGV0ZTogaW5mby5kcmFnZ2luZ0RlbGV0ZVxuICAgIH0pLCBjbG9uZU5vZGUpO1xuICB9IDogdW5kZWZpbmVkO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCByb290U3R5bGUgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjb250ZXh0U3R5bGVzLnJvb3QpLCBjb250ZXh0U3R5bGUpLCBzdHlsZXMgPT09IG51bGwgfHwgc3R5bGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdHlsZXMucm9vdCksIHN0eWxlKTtcbiAgY29uc3QgbWVyZ2VkVHJhY2tzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjb250ZXh0U3R5bGVzLnRyYWNrcyksIHN0eWxlcyA9PT0gbnVsbCB8fCBzdHlsZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0eWxlcy50cmFja3MpO1xuICBjb25zdCBtZXJnZWRUcmFja3NDbGFzc05hbWVzID0gY2xhc3NOYW1lcyhjb250ZXh0Q2xhc3NOYW1lcy50cmFja3MsIHNsaWRlckNsYXNzTmFtZXMgPT09IG51bGwgfHwgc2xpZGVyQ2xhc3NOYW1lcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2xpZGVyQ2xhc3NOYW1lcy50cmFja3MpO1xuICByZXR1cm4gd3JhcENTU1ZhcihcbiAgLyojX19QVVJFX18qL1xuICAvLyBAdHMtaWdub3JlXG4gIFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmNTbGlkZXIsIE9iamVjdC5hc3NpZ24oe30sIHJlc3RQcm9wcywge1xuICAgIGNsYXNzTmFtZXM6IE9iamVjdC5hc3NpZ24oe1xuICAgICAgaGFuZGxlOiBjbGFzc05hbWVzKGNvbnRleHRDbGFzc05hbWVzLmhhbmRsZSwgc2xpZGVyQ2xhc3NOYW1lcyA9PT0gbnVsbCB8fCBzbGlkZXJDbGFzc05hbWVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzbGlkZXJDbGFzc05hbWVzLmhhbmRsZSksXG4gICAgICByYWlsOiBjbGFzc05hbWVzKGNvbnRleHRDbGFzc05hbWVzLnJhaWwsIHNsaWRlckNsYXNzTmFtZXMgPT09IG51bGwgfHwgc2xpZGVyQ2xhc3NOYW1lcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2xpZGVyQ2xhc3NOYW1lcy5yYWlsKSxcbiAgICAgIHRyYWNrOiBjbGFzc05hbWVzKGNvbnRleHRDbGFzc05hbWVzLnRyYWNrLCBzbGlkZXJDbGFzc05hbWVzID09PSBudWxsIHx8IHNsaWRlckNsYXNzTmFtZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNsaWRlckNsYXNzTmFtZXMudHJhY2spXG4gICAgfSwgbWVyZ2VkVHJhY2tzQ2xhc3NOYW1lcyA/IHtcbiAgICAgIHRyYWNrczogbWVyZ2VkVHJhY2tzQ2xhc3NOYW1lc1xuICAgIH0gOiB7fSksXG4gICAgc3R5bGVzOiBPYmplY3QuYXNzaWduKHtcbiAgICAgIGhhbmRsZTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjb250ZXh0U3R5bGVzLmhhbmRsZSksIHN0eWxlcyA9PT0gbnVsbCB8fCBzdHlsZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0eWxlcy5oYW5kbGUpLFxuICAgICAgcmFpbDogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjb250ZXh0U3R5bGVzLnJhaWwpLCBzdHlsZXMgPT09IG51bGwgfHwgc3R5bGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdHlsZXMucmFpbCksXG4gICAgICB0cmFjazogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjb250ZXh0U3R5bGVzLnRyYWNrKSwgc3R5bGVzID09PSBudWxsIHx8IHN0eWxlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3R5bGVzLnRyYWNrKVxuICAgIH0sIE9iamVjdC5rZXlzKG1lcmdlZFRyYWNrcykubGVuZ3RoID8ge1xuICAgICAgdHJhY2tzOiBtZXJnZWRUcmFja3NcbiAgICB9IDoge30pLFxuICAgIHN0ZXA6IHJlc3RQcm9wcy5zdGVwLFxuICAgIHJhbmdlOiByYW5nZSxcbiAgICBjbGFzc05hbWU6IHJvb3RDbGFzc05hbWVzLFxuICAgIHN0eWxlOiByb290U3R5bGUsXG4gICAgZGlzYWJsZWQ6IG1lcmdlZERpc2FibGVkLFxuICAgIHJlZjogcmVmLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGhhbmRsZVJlbmRlcjogaGFuZGxlUmVuZGVyLFxuICAgIGFjdGl2ZUhhbmRsZVJlbmRlcjogYWN0aXZlSGFuZGxlUmVuZGVyLFxuICAgIG9uQ2hhbmdlQ29tcGxldGU6IG9uSW50ZXJuYWxDaGFuZ2VDb21wbGV0ZVxuICB9KSkpO1xufSk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBTbGlkZXIuZGlzcGxheU5hbWUgPSAnU2xpZGVyJztcbn1cbmV4cG9ydCBkZWZhdWx0IFNsaWRlcjsiLCAiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ3JlYWN0Jztcbi8qKiBAcHJpdmF0ZSBJbnRlcm5hbCBjb250ZXh0LiBEbyBub3QgdXNlIGluIHlvdXIgcHJvZHVjdGlvbi4gKi9cbmNvbnN0IFNsaWRlckludGVybmFsQ29udGV4dCA9IC8qI19fUFVSRV9fKi9jcmVhdGVDb250ZXh0KHt9KTtcbmV4cG9ydCBkZWZhdWx0IFNsaWRlckludGVybmFsQ29udGV4dDsiLCAiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCByYWYgZnJvbSBcInJjLXV0aWwvZXMvcmFmXCI7XG5pbXBvcnQgeyBjb21wb3NlUmVmIH0gZnJvbSBcInJjLXV0aWwvZXMvcmVmXCI7XG5pbXBvcnQgVG9vbHRpcCBmcm9tICcuLi90b29sdGlwJztcbmNvbnN0IFNsaWRlclRvb2x0aXAgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIHJlZikgPT4ge1xuICBjb25zdCB7XG4gICAgb3BlbixcbiAgICBkcmFnZ2luZ0RlbGV0ZVxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IGlubmVyUmVmID0gdXNlUmVmKG51bGwpO1xuICBjb25zdCBtZXJnZWRPcGVuID0gb3BlbiAmJiAhZHJhZ2dpbmdEZWxldGU7XG4gIGNvbnN0IHJhZlJlZiA9IHVzZVJlZihudWxsKTtcbiAgZnVuY3Rpb24gY2FuY2VsS2VlcEFsaWduKCkge1xuICAgIHJhZi5jYW5jZWwocmFmUmVmLmN1cnJlbnQpO1xuICAgIHJhZlJlZi5jdXJyZW50ID0gbnVsbDtcbiAgfVxuICBmdW5jdGlvbiBrZWVwQWxpZ24oKSB7XG4gICAgcmFmUmVmLmN1cnJlbnQgPSByYWYoKCkgPT4ge1xuICAgICAgdmFyIF9hO1xuICAgICAgKF9hID0gaW5uZXJSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmZvcmNlQWxpZ24oKTtcbiAgICAgIHJhZlJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICB9KTtcbiAgfVxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChtZXJnZWRPcGVuKSB7XG4gICAgICBrZWVwQWxpZ24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FuY2VsS2VlcEFsaWduKCk7XG4gICAgfVxuICAgIHJldHVybiBjYW5jZWxLZWVwQWxpZ247XG4gIH0sIFttZXJnZWRPcGVuLCBwcm9wcy50aXRsZV0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7XG4gICAgcmVmOiBjb21wb3NlUmVmKGlubmVyUmVmLCByZWYpXG4gIH0sIHByb3BzLCB7XG4gICAgb3BlbjogbWVyZ2VkT3BlblxuICB9KSk7XG59KTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFNsaWRlclRvb2x0aXAuZGlzcGxheU5hbWUgPSAnU2xpZGVyVG9vbHRpcCc7XG59XG5leHBvcnQgZGVmYXVsdCBTbGlkZXJUb29sdGlwOyIsICJpbXBvcnQgeyB1bml0IH0gZnJvbSAnQGFudC1kZXNpZ24vY3NzaW5qcyc7XG5pbXBvcnQgeyBGYXN0Q29sb3IgfSBmcm9tICdAYW50LWRlc2lnbi9mYXN0LWNvbG9yJztcbmltcG9ydCB7IHJlc2V0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc3R5bGUnO1xuaW1wb3J0IHsgZ2VuU3R5bGVIb29rcywgbWVyZ2VUb2tlbiB9IGZyb20gJy4uLy4uL3RoZW1lL2ludGVybmFsJztcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQmFzZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5jb25zdCBnZW5CYXNlU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHMsXG4gICAgYW50Q2xzLFxuICAgIGNvbnRyb2xTaXplLFxuICAgIGRvdFNpemUsXG4gICAgbWFyZ2luRnVsbCxcbiAgICBtYXJnaW5QYXJ0LFxuICAgIGNvbG9yRmlsbENvbnRlbnRIb3ZlcixcbiAgICBoYW5kbGVDb2xvckRpc2FibGVkLFxuICAgIGNhbGMsXG4gICAgaGFuZGxlU2l6ZSxcbiAgICBoYW5kbGVTaXplSG92ZXIsXG4gICAgaGFuZGxlQWN0aXZlQ29sb3IsXG4gICAgaGFuZGxlQWN0aXZlT3V0bGluZUNvbG9yLFxuICAgIGhhbmRsZUxpbmVXaWR0aCxcbiAgICBoYW5kbGVMaW5lV2lkdGhIb3ZlcixcbiAgICBtb3Rpb25EdXJhdGlvbk1pZFxuICB9ID0gdG9rZW47XG4gIHJldHVybiB7XG4gICAgW2NvbXBvbmVudENsc106IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVzZXRDb21wb25lbnQodG9rZW4pKSwge1xuICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICBoZWlnaHQ6IGNvbnRyb2xTaXplLFxuICAgICAgbWFyZ2luOiBgJHt1bml0KG1hcmdpblBhcnQpfSAke3VuaXQobWFyZ2luRnVsbCl9YCxcbiAgICAgIHBhZGRpbmc6IDAsXG4gICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgIHRvdWNoQWN0aW9uOiAnbm9uZScsXG4gICAgICAnJi12ZXJ0aWNhbCc6IHtcbiAgICAgICAgbWFyZ2luOiBgJHt1bml0KG1hcmdpbkZ1bGwpfSAke3VuaXQobWFyZ2luUGFydCl9YFxuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LXJhaWxgXToge1xuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0b2tlbi5yYWlsQmcsXG4gICAgICAgIGJvcmRlclJhZGl1czogdG9rZW4uYm9yZGVyUmFkaXVzWFMsXG4gICAgICAgIHRyYW5zaXRpb246IGBiYWNrZ3JvdW5kLWNvbG9yICR7bW90aW9uRHVyYXRpb25NaWR9YFxuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LXRyYWNrLCR7Y29tcG9uZW50Q2xzfS10cmFja3NgXToge1xuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgdHJhbnNpdGlvbjogYGJhY2tncm91bmQtY29sb3IgJHttb3Rpb25EdXJhdGlvbk1pZH1gXG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tdHJhY2tgXToge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRva2VuLnRyYWNrQmcsXG4gICAgICAgIGJvcmRlclJhZGl1czogdG9rZW4uYm9yZGVyUmFkaXVzWFNcbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS10cmFjay1kcmFnZ2FibGVgXToge1xuICAgICAgICBib3hTaXppbmc6ICdjb250ZW50LWJveCcsXG4gICAgICAgIGJhY2tncm91bmRDbGlwOiAnY29udGVudC1ib3gnLFxuICAgICAgICBib3JkZXI6ICdzb2xpZCByZ2JhKDAsMCwwLDApJ1xuICAgICAgfSxcbiAgICAgICcmOmhvdmVyJzoge1xuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1yYWlsYF06IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRva2VuLnJhaWxIb3ZlckJnXG4gICAgICAgIH0sXG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LXRyYWNrYF06IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRva2VuLnRyYWNrSG92ZXJCZ1xuICAgICAgICB9LFxuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1kb3RgXToge1xuICAgICAgICAgIGJvcmRlckNvbG9yOiBjb2xvckZpbGxDb250ZW50SG92ZXJcbiAgICAgICAgfSxcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30taGFuZGxlOjphZnRlcmBdOiB7XG4gICAgICAgICAgYm94U2hhZG93OiBgMCAwIDAgJHt1bml0KGhhbmRsZUxpbmVXaWR0aCl9ICR7dG9rZW4uY29sb3JQcmltYXJ5Qm9yZGVySG92ZXJ9YFxuICAgICAgICB9LFxuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1kb3QtYWN0aXZlYF06IHtcbiAgICAgICAgICBib3JkZXJDb2xvcjogdG9rZW4uZG90QWN0aXZlQm9yZGVyQ29sb3JcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWhhbmRsZWBdOiB7XG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICB3aWR0aDogaGFuZGxlU2l6ZSxcbiAgICAgICAgaGVpZ2h0OiBoYW5kbGVTaXplLFxuICAgICAgICBvdXRsaW5lOiAnbm9uZScsXG4gICAgICAgIHVzZXJTZWxlY3Q6ICdub25lJyxcbiAgICAgICAgLy8gRHJhZ2dpbmcgc3RhdHVzXG4gICAgICAgICcmLWRyYWdnaW5nLWRlbGV0ZSc6IHtcbiAgICAgICAgICBvcGFjaXR5OiAwXG4gICAgICAgIH0sXG4gICAgICAgIC8vIFx1NjI2OVx1NTkyN1x1OTAwOVx1NTMzQVxuICAgICAgICAnJjo6YmVmb3JlJzoge1xuICAgICAgICAgIGNvbnRlbnQ6ICdcIlwiJyxcbiAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICBpbnNldElubGluZVN0YXJ0OiBjYWxjKGhhbmRsZUxpbmVXaWR0aCkubXVsKC0xKS5lcXVhbCgpLFxuICAgICAgICAgIGluc2V0QmxvY2tTdGFydDogY2FsYyhoYW5kbGVMaW5lV2lkdGgpLm11bCgtMSkuZXF1YWwoKSxcbiAgICAgICAgICB3aWR0aDogY2FsYyhoYW5kbGVTaXplKS5hZGQoY2FsYyhoYW5kbGVMaW5lV2lkdGgpLm11bCgyKSkuZXF1YWwoKSxcbiAgICAgICAgICBoZWlnaHQ6IGNhbGMoaGFuZGxlU2l6ZSkuYWRkKGNhbGMoaGFuZGxlTGluZVdpZHRoKS5tdWwoMikpLmVxdWFsKCksXG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndHJhbnNwYXJlbnQnXG4gICAgICAgIH0sXG4gICAgICAgICcmOjphZnRlcic6IHtcbiAgICAgICAgICBjb250ZW50OiAnXCJcIicsXG4gICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgaW5zZXRCbG9ja1N0YXJ0OiAwLFxuICAgICAgICAgIGluc2V0SW5saW5lU3RhcnQ6IDAsXG4gICAgICAgICAgd2lkdGg6IGhhbmRsZVNpemUsXG4gICAgICAgICAgaGVpZ2h0OiBoYW5kbGVTaXplLFxuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdG9rZW4uY29sb3JCZ0VsZXZhdGVkLFxuICAgICAgICAgIGJveFNoYWRvdzogYDAgMCAwICR7dW5pdChoYW5kbGVMaW5lV2lkdGgpfSAke3Rva2VuLmhhbmRsZUNvbG9yfWAsXG4gICAgICAgICAgb3V0bGluZTogYDBweCBzb2xpZCB0cmFuc3BhcmVudGAsXG4gICAgICAgICAgYm9yZGVyUmFkaXVzOiAnNTAlJyxcbiAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgICAgICB0cmFuc2l0aW9uOiBgXG4gICAgICAgICAgICBpbnNldC1pbmxpbmUtc3RhcnQgJHttb3Rpb25EdXJhdGlvbk1pZH0sXG4gICAgICAgICAgICBpbnNldC1ibG9jay1zdGFydCAke21vdGlvbkR1cmF0aW9uTWlkfSxcbiAgICAgICAgICAgIHdpZHRoICR7bW90aW9uRHVyYXRpb25NaWR9LFxuICAgICAgICAgICAgaGVpZ2h0ICR7bW90aW9uRHVyYXRpb25NaWR9LFxuICAgICAgICAgICAgYm94LXNoYWRvdyAke21vdGlvbkR1cmF0aW9uTWlkfSxcbiAgICAgICAgICAgIG91dGxpbmUgJHttb3Rpb25EdXJhdGlvbk1pZH1cbiAgICAgICAgICBgXG4gICAgICAgIH0sXG4gICAgICAgICcmOmhvdmVyLCAmOmFjdGl2ZSwgJjpmb2N1cyc6IHtcbiAgICAgICAgICAnJjo6YmVmb3JlJzoge1xuICAgICAgICAgICAgaW5zZXRJbmxpbmVTdGFydDogY2FsYyhoYW5kbGVTaXplSG92ZXIpLnN1YihoYW5kbGVTaXplKS5kaXYoMikuYWRkKGhhbmRsZUxpbmVXaWR0aEhvdmVyKS5tdWwoLTEpLmVxdWFsKCksXG4gICAgICAgICAgICBpbnNldEJsb2NrU3RhcnQ6IGNhbGMoaGFuZGxlU2l6ZUhvdmVyKS5zdWIoaGFuZGxlU2l6ZSkuZGl2KDIpLmFkZChoYW5kbGVMaW5lV2lkdGhIb3ZlcikubXVsKC0xKS5lcXVhbCgpLFxuICAgICAgICAgICAgd2lkdGg6IGNhbGMoaGFuZGxlU2l6ZUhvdmVyKS5hZGQoY2FsYyhoYW5kbGVMaW5lV2lkdGhIb3ZlcikubXVsKDIpKS5lcXVhbCgpLFxuICAgICAgICAgICAgaGVpZ2h0OiBjYWxjKGhhbmRsZVNpemVIb3ZlcikuYWRkKGNhbGMoaGFuZGxlTGluZVdpZHRoSG92ZXIpLm11bCgyKSkuZXF1YWwoKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgJyY6OmFmdGVyJzoge1xuICAgICAgICAgICAgYm94U2hhZG93OiBgMCAwIDAgJHt1bml0KGhhbmRsZUxpbmVXaWR0aEhvdmVyKX0gJHtoYW5kbGVBY3RpdmVDb2xvcn1gLFxuICAgICAgICAgICAgb3V0bGluZTogYDZweCBzb2xpZCAke2hhbmRsZUFjdGl2ZU91dGxpbmVDb2xvcn1gLFxuICAgICAgICAgICAgd2lkdGg6IGhhbmRsZVNpemVIb3ZlcixcbiAgICAgICAgICAgIGhlaWdodDogaGFuZGxlU2l6ZUhvdmVyLFxuICAgICAgICAgICAgaW5zZXRJbmxpbmVTdGFydDogdG9rZW4uY2FsYyhoYW5kbGVTaXplKS5zdWIoaGFuZGxlU2l6ZUhvdmVyKS5kaXYoMikuZXF1YWwoKSxcbiAgICAgICAgICAgIGluc2V0QmxvY2tTdGFydDogdG9rZW4uY2FsYyhoYW5kbGVTaXplKS5zdWIoaGFuZGxlU2l6ZUhvdmVyKS5kaXYoMikuZXF1YWwoKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtgJi1sb2NrICR7Y29tcG9uZW50Q2xzfS1oYW5kbGVgXToge1xuICAgICAgICAnJjo6YmVmb3JlLCAmOjphZnRlcic6IHtcbiAgICAgICAgICB0cmFuc2l0aW9uOiAnbm9uZSdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LW1hcmtgXToge1xuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgZm9udFNpemU6IHRva2VuLmZvbnRTaXplXG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tbWFyay10ZXh0YF06IHtcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JUZXh0RGVzY3JpcHRpb24sXG4gICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAgIHdvcmRCcmVhazogJ2tlZXAtYWxsJyxcbiAgICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgICAgIHVzZXJTZWxlY3Q6ICdub25lJyxcbiAgICAgICAgJyYtYWN0aXZlJzoge1xuICAgICAgICAgIGNvbG9yOiB0b2tlbi5jb2xvclRleHRcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LXN0ZXBgXToge1xuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgYmFja2dyb3VuZDogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnXG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tZG90YF06IHtcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgIHdpZHRoOiBkb3RTaXplLFxuICAgICAgICBoZWlnaHQ6IGRvdFNpemUsXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogdG9rZW4uY29sb3JCZ0VsZXZhdGVkLFxuICAgICAgICBib3JkZXI6IGAke3VuaXQoaGFuZGxlTGluZVdpZHRoKX0gc29saWQgJHt0b2tlbi5kb3RCb3JkZXJDb2xvcn1gLFxuICAgICAgICBib3JkZXJSYWRpdXM6ICc1MCUnLFxuICAgICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgICAgdHJhbnNpdGlvbjogYGJvcmRlci1jb2xvciAke3Rva2VuLm1vdGlvbkR1cmF0aW9uU2xvd31gLFxuICAgICAgICBwb2ludGVyRXZlbnRzOiAnYXV0bycsXG4gICAgICAgICcmLWFjdGl2ZSc6IHtcbiAgICAgICAgICBib3JkZXJDb2xvcjogdG9rZW4uZG90QWN0aXZlQm9yZGVyQ29sb3JcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtgJiR7Y29tcG9uZW50Q2xzfS1kaXNhYmxlZGBdOiB7XG4gICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkJyxcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30tcmFpbGBdOiB7XG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBgJHt0b2tlbi5yYWlsQmd9ICFpbXBvcnRhbnRgXG4gICAgICAgIH0sXG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LXRyYWNrYF06IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGAke3Rva2VuLnRyYWNrQmdEaXNhYmxlZH0gIWltcG9ydGFudGBcbiAgICAgICAgfSxcbiAgICAgICAgW2BcbiAgICAgICAgICAke2NvbXBvbmVudENsc30tZG90XG4gICAgICAgIGBdOiB7XG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0b2tlbi5jb2xvckJnRWxldmF0ZWQsXG4gICAgICAgICAgYm9yZGVyQ29sb3I6IHRva2VuLnRyYWNrQmdEaXNhYmxlZCxcbiAgICAgICAgICBib3hTaGFkb3c6ICdub25lJyxcbiAgICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCdcbiAgICAgICAgfSxcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30taGFuZGxlOjphZnRlcmBdOiB7XG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0b2tlbi5jb2xvckJnRWxldmF0ZWQsXG4gICAgICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQnLFxuICAgICAgICAgIHdpZHRoOiBoYW5kbGVTaXplLFxuICAgICAgICAgIGhlaWdodDogaGFuZGxlU2l6ZSxcbiAgICAgICAgICBib3hTaGFkb3c6IGAwIDAgMCAke3VuaXQoaGFuZGxlTGluZVdpZHRoKX0gJHtoYW5kbGVDb2xvckRpc2FibGVkfWAsXG4gICAgICAgICAgaW5zZXRJbmxpbmVTdGFydDogMCxcbiAgICAgICAgICBpbnNldEJsb2NrU3RhcnQ6IDBcbiAgICAgICAgfSxcbiAgICAgICAgW2BcbiAgICAgICAgICAke2NvbXBvbmVudENsc30tbWFyay10ZXh0LFxuICAgICAgICAgICR7Y29tcG9uZW50Q2xzfS1kb3RcbiAgICAgICAgYF06IHtcbiAgICAgICAgICBjdXJzb3I6IGBub3QtYWxsb3dlZCAhaW1wb3J0YW50YFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2AmLXRvb2x0aXAgJHthbnRDbHN9LXRvb2x0aXAtaW5uZXJgXToge1xuICAgICAgICBtaW5XaWR0aDogJ3Vuc2V0J1xuICAgICAgfVxuICAgIH0pXG4gIH07XG59O1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBIb3Jpem9udGFsID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmNvbnN0IGdlbkRpcmVjdGlvblN0eWxlID0gKHRva2VuLCBob3Jpem9udGFsKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHMsXG4gICAgcmFpbFNpemUsXG4gICAgaGFuZGxlU2l6ZSxcbiAgICBkb3RTaXplLFxuICAgIG1hcmdpbkZ1bGwsXG4gICAgY2FsY1xuICB9ID0gdG9rZW47XG4gIGNvbnN0IHJhaWxQYWRkaW5nID0gaG9yaXpvbnRhbCA/ICdwYWRkaW5nQmxvY2snIDogJ3BhZGRpbmdJbmxpbmUnO1xuICBjb25zdCBmdWxsID0gaG9yaXpvbnRhbCA/ICd3aWR0aCcgOiAnaGVpZ2h0JztcbiAgY29uc3QgcGFydCA9IGhvcml6b250YWwgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG4gIGNvbnN0IGhhbmRsZVBvcyA9IGhvcml6b250YWwgPyAnaW5zZXRCbG9ja1N0YXJ0JyA6ICdpbnNldElubGluZVN0YXJ0JztcbiAgY29uc3QgbWFya0luc2V0ID0gaG9yaXpvbnRhbCA/ICd0b3AnIDogJ2luc2V0SW5saW5lU3RhcnQnO1xuICBjb25zdCBoYW5kbGVQb3NTaXplID0gY2FsYyhyYWlsU2l6ZSkubXVsKDMpLnN1YihoYW5kbGVTaXplKS5kaXYoMikuZXF1YWwoKTtcbiAgY29uc3QgZHJhZ2dhYmxlQm9yZGVyU2l6ZSA9IGNhbGMoaGFuZGxlU2l6ZSkuc3ViKHJhaWxTaXplKS5kaXYoMikuZXF1YWwoKTtcbiAgY29uc3QgZHJhZ2dhYmxlQm9yZGVyID0gaG9yaXpvbnRhbCA/IHtcbiAgICBib3JkZXJXaWR0aDogYCR7dW5pdChkcmFnZ2FibGVCb3JkZXJTaXplKX0gMGAsXG4gICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlWSgke3VuaXQoY2FsYyhkcmFnZ2FibGVCb3JkZXJTaXplKS5tdWwoLTEpLmVxdWFsKCkpfSlgXG4gIH0gOiB7XG4gICAgYm9yZGVyV2lkdGg6IGAwICR7dW5pdChkcmFnZ2FibGVCb3JkZXJTaXplKX1gLFxuICAgIHRyYW5zZm9ybTogYHRyYW5zbGF0ZVgoJHt1bml0KHRva2VuLmNhbGMoZHJhZ2dhYmxlQm9yZGVyU2l6ZSkubXVsKC0xKS5lcXVhbCgpKX0pYFxuICB9O1xuICByZXR1cm4ge1xuICAgIFtyYWlsUGFkZGluZ106IHJhaWxTaXplLFxuICAgIFtwYXJ0XTogY2FsYyhyYWlsU2l6ZSkubXVsKDMpLmVxdWFsKCksXG4gICAgW2Ake2NvbXBvbmVudENsc30tcmFpbGBdOiB7XG4gICAgICBbZnVsbF06ICcxMDAlJyxcbiAgICAgIFtwYXJ0XTogcmFpbFNpemVcbiAgICB9LFxuICAgIFtgJHtjb21wb25lbnRDbHN9LXRyYWNrLCR7Y29tcG9uZW50Q2xzfS10cmFja3NgXToge1xuICAgICAgW3BhcnRdOiByYWlsU2l6ZVxuICAgIH0sXG4gICAgW2Ake2NvbXBvbmVudENsc30tdHJhY2stZHJhZ2dhYmxlYF06IE9iamVjdC5hc3NpZ24oe30sIGRyYWdnYWJsZUJvcmRlciksXG4gICAgW2Ake2NvbXBvbmVudENsc30taGFuZGxlYF06IHtcbiAgICAgIFtoYW5kbGVQb3NdOiBoYW5kbGVQb3NTaXplXG4gICAgfSxcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS1tYXJrYF06IHtcbiAgICAgIC8vIFJlc2V0IGFsbFxuICAgICAgaW5zZXRJbmxpbmVTdGFydDogMCxcbiAgICAgIHRvcDogMCxcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzQzNzMxXG4gICAgICBbbWFya0luc2V0XTogY2FsYyhyYWlsU2l6ZSkubXVsKDMpLmFkZChob3Jpem9udGFsID8gMCA6IG1hcmdpbkZ1bGwpLmVxdWFsKCksXG4gICAgICBbZnVsbF06ICcxMDAlJ1xuICAgIH0sXG4gICAgW2Ake2NvbXBvbmVudENsc30tc3RlcGBdOiB7XG4gICAgICAvLyBSZXNldCBhbGxcbiAgICAgIGluc2V0SW5saW5lU3RhcnQ6IDAsXG4gICAgICB0b3A6IDAsXG4gICAgICBbbWFya0luc2V0XTogcmFpbFNpemUsXG4gICAgICBbZnVsbF06ICcxMDAlJyxcbiAgICAgIFtwYXJ0XTogcmFpbFNpemVcbiAgICB9LFxuICAgIFtgJHtjb21wb25lbnRDbHN9LWRvdGBdOiB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIFtoYW5kbGVQb3NdOiBjYWxjKHJhaWxTaXplKS5zdWIoZG90U2l6ZSkuZGl2KDIpLmVxdWFsKClcbiAgICB9XG4gIH07XG59O1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBIb3Jpem9udGFsID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmNvbnN0IGdlbkhvcml6b250YWxTdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENscyxcbiAgICBtYXJnaW5QYXJ0V2l0aE1hcmtcbiAgfSA9IHRva2VuO1xuICByZXR1cm4ge1xuICAgIFtgJHtjb21wb25lbnRDbHN9LWhvcml6b250YWxgXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBnZW5EaXJlY3Rpb25TdHlsZSh0b2tlbiwgdHJ1ZSkpLCB7XG4gICAgICBbYCYke2NvbXBvbmVudENsc30td2l0aC1tYXJrc2BdOiB7XG4gICAgICAgIG1hcmdpbkJvdHRvbTogbWFyZ2luUGFydFdpdGhNYXJrXG4gICAgICB9XG4gICAgfSlcbiAgfTtcbn07XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBWZXJ0aWNhbCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuY29uc3QgZ2VuVmVydGljYWxTdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENsc1xuICB9ID0gdG9rZW47XG4gIHJldHVybiB7XG4gICAgW2Ake2NvbXBvbmVudENsc30tdmVydGljYWxgXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBnZW5EaXJlY3Rpb25TdHlsZSh0b2tlbiwgZmFsc2UpKSwge1xuICAgICAgaGVpZ2h0OiAnMTAwJSdcbiAgICB9KVxuICB9O1xufTtcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFeHBvcnQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgY29uc3QgcHJlcGFyZUNvbXBvbmVudFRva2VuID0gdG9rZW4gPT4ge1xuICAvLyBIYW5kbGUgbGluZSB3aWR0aCBpcyBhbHdheXMgd2lkdGgtZXIgMXB4XG4gIGNvbnN0IGluY3JlYXNlSGFuZGxlV2lkdGggPSAxO1xuICBjb25zdCBjb250cm9sU2l6ZSA9IHRva2VuLmNvbnRyb2xIZWlnaHRMRyAvIDQ7XG4gIGNvbnN0IGNvbnRyb2xTaXplSG92ZXIgPSB0b2tlbi5jb250cm9sSGVpZ2h0U00gLyAyO1xuICBjb25zdCBoYW5kbGVMaW5lV2lkdGggPSB0b2tlbi5saW5lV2lkdGggKyBpbmNyZWFzZUhhbmRsZVdpZHRoO1xuICBjb25zdCBoYW5kbGVMaW5lV2lkdGhIb3ZlciA9IHRva2VuLmxpbmVXaWR0aCArIGluY3JlYXNlSGFuZGxlV2lkdGggKiAxLjU7XG4gIGNvbnN0IGhhbmRsZUFjdGl2ZUNvbG9yID0gdG9rZW4uY29sb3JQcmltYXJ5O1xuICBjb25zdCBoYW5kbGVBY3RpdmVPdXRsaW5lQ29sb3IgPSBuZXcgRmFzdENvbG9yKGhhbmRsZUFjdGl2ZUNvbG9yKS5zZXRBKDAuMikudG9SZ2JTdHJpbmcoKTtcbiAgcmV0dXJuIHtcbiAgICBjb250cm9sU2l6ZSxcbiAgICByYWlsU2l6ZTogNCxcbiAgICBoYW5kbGVTaXplOiBjb250cm9sU2l6ZSxcbiAgICBoYW5kbGVTaXplSG92ZXI6IGNvbnRyb2xTaXplSG92ZXIsXG4gICAgZG90U2l6ZTogOCxcbiAgICBoYW5kbGVMaW5lV2lkdGgsXG4gICAgaGFuZGxlTGluZVdpZHRoSG92ZXIsXG4gICAgcmFpbEJnOiB0b2tlbi5jb2xvckZpbGxUZXJ0aWFyeSxcbiAgICByYWlsSG92ZXJCZzogdG9rZW4uY29sb3JGaWxsU2Vjb25kYXJ5LFxuICAgIHRyYWNrQmc6IHRva2VuLmNvbG9yUHJpbWFyeUJvcmRlcixcbiAgICB0cmFja0hvdmVyQmc6IHRva2VuLmNvbG9yUHJpbWFyeUJvcmRlckhvdmVyLFxuICAgIGhhbmRsZUNvbG9yOiB0b2tlbi5jb2xvclByaW1hcnlCb3JkZXIsXG4gICAgaGFuZGxlQWN0aXZlQ29sb3IsXG4gICAgaGFuZGxlQWN0aXZlT3V0bGluZUNvbG9yLFxuICAgIGhhbmRsZUNvbG9yRGlzYWJsZWQ6IG5ldyBGYXN0Q29sb3IodG9rZW4uY29sb3JUZXh0RGlzYWJsZWQpLm9uQmFja2dyb3VuZCh0b2tlbi5jb2xvckJnQ29udGFpbmVyKS50b0hleFN0cmluZygpLFxuICAgIGRvdEJvcmRlckNvbG9yOiB0b2tlbi5jb2xvckJvcmRlclNlY29uZGFyeSxcbiAgICBkb3RBY3RpdmVCb3JkZXJDb2xvcjogdG9rZW4uY29sb3JQcmltYXJ5Qm9yZGVyLFxuICAgIHRyYWNrQmdEaXNhYmxlZDogdG9rZW4uY29sb3JCZ0NvbnRhaW5lckRpc2FibGVkXG4gIH07XG59O1xuZXhwb3J0IGRlZmF1bHQgZ2VuU3R5bGVIb29rcygnU2xpZGVyJywgdG9rZW4gPT4ge1xuICBjb25zdCBzbGlkZXJUb2tlbiA9IG1lcmdlVG9rZW4odG9rZW4sIHtcbiAgICBtYXJnaW5QYXJ0OiB0b2tlbi5jYWxjKHRva2VuLmNvbnRyb2xIZWlnaHQpLnN1Yih0b2tlbi5jb250cm9sU2l6ZSkuZGl2KDIpLmVxdWFsKCksXG4gICAgbWFyZ2luRnVsbDogdG9rZW4uY2FsYyh0b2tlbi5jb250cm9sU2l6ZSkuZGl2KDIpLmVxdWFsKCksXG4gICAgbWFyZ2luUGFydFdpdGhNYXJrOiB0b2tlbi5jYWxjKHRva2VuLmNvbnRyb2xIZWlnaHRMRykuc3ViKHRva2VuLmNvbnRyb2xTaXplKS5lcXVhbCgpXG4gIH0pO1xuICByZXR1cm4gW2dlbkJhc2VTdHlsZShzbGlkZXJUb2tlbiksIGdlbkhvcml6b250YWxTdHlsZShzbGlkZXJUb2tlbiksIGdlblZlcnRpY2FsU3R5bGUoc2xpZGVyVG9rZW4pXTtcbn0sIHByZXBhcmVDb21wb25lbnRUb2tlbik7IiwgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCByYWYgZnJvbSBcInJjLXV0aWwvZXMvcmFmXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VSYWZMb2NrKCkge1xuICBjb25zdCBbc3RhdGUsIHNldFN0YXRlXSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgcmFmUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgIHJhZi5jYW5jZWwocmFmUmVmLmN1cnJlbnQpO1xuICB9O1xuICBjb25zdCBzZXREZWxheVN0YXRlID0gbmV4dFN0YXRlID0+IHtcbiAgICBjbGVhbnVwKCk7XG4gICAgaWYgKG5leHRTdGF0ZSkge1xuICAgICAgc2V0U3RhdGUobmV4dFN0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmFmUmVmLmN1cnJlbnQgPSByYWYoKCkgPT4ge1xuICAgICAgICBzZXRTdGF0ZShuZXh0U3RhdGUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4gY2xlYW51cCwgW10pO1xuICByZXR1cm4gW3N0YXRlLCBzZXREZWxheVN0YXRlXTtcbn0iLCAiZXhwb3J0IGZ1bmN0aW9uIGlzUHJlc2V0U2l6ZShzaXplKSB7XG4gIHJldHVybiBbJ3NtYWxsJywgJ21pZGRsZScsICdsYXJnZSddLmluY2x1ZGVzKHNpemUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRHYXBOdW1iZXIoc2l6ZSkge1xuICBpZiAoIXNpemUpIHtcbiAgICAvLyBUaGUgY2FzZSBvZiBzaXplID0gMCBpcyBkZWxpYmVyYXRlbHkgZXhjbHVkZWQgaGVyZSwgYmVjYXVzZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgZ2FwIGF0dHJpYnV0ZSBpbiBDU1MgaXMgMCwgc28gaWYgdGhlIHVzZXIgcGFzc2VzIDAgaW4sIHdlIGNhbiBkaXJlY3RseSBpZ25vcmUgaXQuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0eXBlb2Ygc2l6ZSA9PT0gJ251bWJlcicgJiYgIU51bWJlci5pc05hTihzaXplKTtcbn0iLCAiXCJ1c2UgY2xpZW50XCI7XG5cbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgb21pdCBmcm9tIFwicmMtdXRpbC9lcy9vbWl0XCI7XG5pbXBvcnQgeyBpc1ByZXNldFNpemUgfSBmcm9tICcuLi9fdXRpbC9nYXBTaXplJztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHVzZVN0eWxlIGZyb20gJy4vc3R5bGUnO1xuaW1wb3J0IGNyZWF0ZUZsZXhDbGFzc05hbWVzIGZyb20gJy4vdXRpbHMnO1xuY29uc3QgRmxleCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgcmVmKSA9PiB7XG4gIGNvbnN0IHtcbiAgICAgIHByZWZpeENsczogY3VzdG9taXplUHJlZml4Q2xzLFxuICAgICAgcm9vdENsYXNzTmFtZSxcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIHN0eWxlLFxuICAgICAgZmxleCxcbiAgICAgIGdhcCxcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgdmVydGljYWwgPSBmYWxzZSxcbiAgICAgIGNvbXBvbmVudDogQ29tcG9uZW50ID0gJ2RpdidcbiAgICB9ID0gcHJvcHMsXG4gICAgb3RoZXJzUHJvcHMgPSBfX3Jlc3QocHJvcHMsIFtcInByZWZpeENsc1wiLCBcInJvb3RDbGFzc05hbWVcIiwgXCJjbGFzc05hbWVcIiwgXCJzdHlsZVwiLCBcImZsZXhcIiwgXCJnYXBcIiwgXCJjaGlsZHJlblwiLCBcInZlcnRpY2FsXCIsIFwiY29tcG9uZW50XCJdKTtcbiAgY29uc3Qge1xuICAgIGZsZXg6IGN0eEZsZXgsXG4gICAgZGlyZWN0aW9uOiBjdHhEaXJlY3Rpb24sXG4gICAgZ2V0UHJlZml4Q2xzXG4gIH0gPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpO1xuICBjb25zdCBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2ZsZXgnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICBjb25zdCBbd3JhcENTU1ZhciwgaGFzaElkLCBjc3NWYXJDbHNdID0gdXNlU3R5bGUocHJlZml4Q2xzKTtcbiAgY29uc3QgbWVyZ2VkVmVydGljYWwgPSB2ZXJ0aWNhbCAhPT0gbnVsbCAmJiB2ZXJ0aWNhbCAhPT0gdm9pZCAwID8gdmVydGljYWwgOiBjdHhGbGV4ID09PSBudWxsIHx8IGN0eEZsZXggPT09IHZvaWQgMCA/IHZvaWQgMCA6IGN0eEZsZXgudmVydGljYWw7XG4gIGNvbnN0IG1lcmdlZENscyA9IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCByb290Q2xhc3NOYW1lLCBjdHhGbGV4ID09PSBudWxsIHx8IGN0eEZsZXggPT09IHZvaWQgMCA/IHZvaWQgMCA6IGN0eEZsZXguY2xhc3NOYW1lLCBwcmVmaXhDbHMsIGhhc2hJZCwgY3NzVmFyQ2xzLCBjcmVhdGVGbGV4Q2xhc3NOYW1lcyhwcmVmaXhDbHMsIHByb3BzKSwge1xuICAgIFtgJHtwcmVmaXhDbHN9LXJ0bGBdOiBjdHhEaXJlY3Rpb24gPT09ICdydGwnLFxuICAgIFtgJHtwcmVmaXhDbHN9LWdhcC0ke2dhcH1gXTogaXNQcmVzZXRTaXplKGdhcCksXG4gICAgW2Ake3ByZWZpeENsc30tdmVydGljYWxgXTogbWVyZ2VkVmVydGljYWxcbiAgfSk7XG4gIGNvbnN0IG1lcmdlZFN0eWxlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjdHhGbGV4ID09PSBudWxsIHx8IGN0eEZsZXggPT09IHZvaWQgMCA/IHZvaWQgMCA6IGN0eEZsZXguc3R5bGUpLCBzdHlsZSk7XG4gIGlmIChmbGV4KSB7XG4gICAgbWVyZ2VkU3R5bGUuZmxleCA9IGZsZXg7XG4gIH1cbiAgaWYgKGdhcCAmJiAhaXNQcmVzZXRTaXplKGdhcCkpIHtcbiAgICBtZXJnZWRTdHlsZS5nYXAgPSBnYXA7XG4gIH1cbiAgcmV0dXJuIHdyYXBDU1NWYXIoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCBPYmplY3QuYXNzaWduKHtcbiAgICByZWY6IHJlZixcbiAgICBjbGFzc05hbWU6IG1lcmdlZENscyxcbiAgICBzdHlsZTogbWVyZ2VkU3R5bGVcbiAgfSwgb21pdChvdGhlcnNQcm9wcywgWydqdXN0aWZ5JywgJ3dyYXAnLCAnYWxpZ24nXSkpLCBjaGlsZHJlbikpO1xufSk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBGbGV4LmRpc3BsYXlOYW1lID0gJ0ZsZXgnO1xufVxuZXhwb3J0IGRlZmF1bHQgRmxleDsiLCAiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5leHBvcnQgY29uc3QgZmxleFdyYXBWYWx1ZXMgPSBbJ3dyYXAnLCAnbm93cmFwJywgJ3dyYXAtcmV2ZXJzZSddO1xuZXhwb3J0IGNvbnN0IGp1c3RpZnlDb250ZW50VmFsdWVzID0gWydmbGV4LXN0YXJ0JywgJ2ZsZXgtZW5kJywgJ3N0YXJ0JywgJ2VuZCcsICdjZW50ZXInLCAnc3BhY2UtYmV0d2VlbicsICdzcGFjZS1hcm91bmQnLCAnc3BhY2UtZXZlbmx5JywgJ3N0cmV0Y2gnLCAnbm9ybWFsJywgJ2xlZnQnLCAncmlnaHQnXTtcbmV4cG9ydCBjb25zdCBhbGlnbkl0ZW1zVmFsdWVzID0gWydjZW50ZXInLCAnc3RhcnQnLCAnZW5kJywgJ2ZsZXgtc3RhcnQnLCAnZmxleC1lbmQnLCAnc2VsZi1zdGFydCcsICdzZWxmLWVuZCcsICdiYXNlbGluZScsICdub3JtYWwnLCAnc3RyZXRjaCddO1xuY29uc3QgZ2VuQ2xzV3JhcCA9IChwcmVmaXhDbHMsIHByb3BzKSA9PiB7XG4gIGNvbnN0IHdyYXAgPSBwcm9wcy53cmFwID09PSB0cnVlID8gJ3dyYXAnIDogcHJvcHMud3JhcDtcbiAgcmV0dXJuIHtcbiAgICBbYCR7cHJlZml4Q2xzfS13cmFwLSR7d3JhcH1gXTogd3JhcCAmJiBmbGV4V3JhcFZhbHVlcy5pbmNsdWRlcyh3cmFwKVxuICB9O1xufTtcbmNvbnN0IGdlbkNsc0FsaWduID0gKHByZWZpeENscywgcHJvcHMpID0+IHtcbiAgY29uc3QgYWxpZ25DbHMgPSB7fTtcbiAgYWxpZ25JdGVtc1ZhbHVlcy5mb3JFYWNoKGNzc0tleSA9PiB7XG4gICAgYWxpZ25DbHNbYCR7cHJlZml4Q2xzfS1hbGlnbi0ke2Nzc0tleX1gXSA9IHByb3BzLmFsaWduID09PSBjc3NLZXk7XG4gIH0pO1xuICBhbGlnbkNsc1tgJHtwcmVmaXhDbHN9LWFsaWduLXN0cmV0Y2hgXSA9ICFwcm9wcy5hbGlnbiAmJiAhIXByb3BzLnZlcnRpY2FsO1xuICByZXR1cm4gYWxpZ25DbHM7XG59O1xuY29uc3QgZ2VuQ2xzSnVzdGlmeSA9IChwcmVmaXhDbHMsIHByb3BzKSA9PiB7XG4gIGNvbnN0IGp1c3RpZnlDbHMgPSB7fTtcbiAganVzdGlmeUNvbnRlbnRWYWx1ZXMuZm9yRWFjaChjc3NLZXkgPT4ge1xuICAgIGp1c3RpZnlDbHNbYCR7cHJlZml4Q2xzfS1qdXN0aWZ5LSR7Y3NzS2V5fWBdID0gcHJvcHMuanVzdGlmeSA9PT0gY3NzS2V5O1xuICB9KTtcbiAgcmV0dXJuIGp1c3RpZnlDbHM7XG59O1xuZnVuY3Rpb24gY3JlYXRlRmxleENsYXNzTmFtZXMocHJlZml4Q2xzLCBwcm9wcykge1xuICByZXR1cm4gY2xhc3NOYW1lcyhPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZ2VuQ2xzV3JhcChwcmVmaXhDbHMsIHByb3BzKSksIGdlbkNsc0FsaWduKHByZWZpeENscywgcHJvcHMpKSwgZ2VuQ2xzSnVzdGlmeShwcmVmaXhDbHMsIHByb3BzKSkpO1xufVxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlRmxleENsYXNzTmFtZXM7IiwgImltcG9ydCB7IGdlblN0eWxlSG9va3MsIG1lcmdlVG9rZW4gfSBmcm9tICcuLi8uLi90aGVtZS9pbnRlcm5hbCc7XG5pbXBvcnQgeyBhbGlnbkl0ZW1zVmFsdWVzLCBmbGV4V3JhcFZhbHVlcywganVzdGlmeUNvbnRlbnRWYWx1ZXMgfSBmcm9tICcuLi91dGlscyc7XG5jb25zdCBnZW5GbGV4U3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHNcbiAgfSA9IHRva2VuO1xuICByZXR1cm4ge1xuICAgIFtjb21wb25lbnRDbHNdOiB7XG4gICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICBtYXJnaW46IDAsXG4gICAgICBwYWRkaW5nOiAwLFxuICAgICAgJyYtdmVydGljYWwnOiB7XG4gICAgICAgIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nXG4gICAgICB9LFxuICAgICAgJyYtcnRsJzoge1xuICAgICAgICBkaXJlY3Rpb246ICdydGwnXG4gICAgICB9LFxuICAgICAgJyY6ZW1wdHknOiB7XG4gICAgICAgIGRpc3BsYXk6ICdub25lJ1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG5jb25zdCBnZW5GbGV4R2FwU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHNcbiAgfSA9IHRva2VuO1xuICByZXR1cm4ge1xuICAgIFtjb21wb25lbnRDbHNdOiB7XG4gICAgICAnJi1nYXAtc21hbGwnOiB7XG4gICAgICAgIGdhcDogdG9rZW4uZmxleEdhcFNNXG4gICAgICB9LFxuICAgICAgJyYtZ2FwLW1pZGRsZSc6IHtcbiAgICAgICAgZ2FwOiB0b2tlbi5mbGV4R2FwXG4gICAgICB9LFxuICAgICAgJyYtZ2FwLWxhcmdlJzoge1xuICAgICAgICBnYXA6IHRva2VuLmZsZXhHYXBMR1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG5jb25zdCBnZW5GbGV4V3JhcFN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzXG4gIH0gPSB0b2tlbjtcbiAgY29uc3Qgd3JhcFN0eWxlID0ge307XG4gIGZsZXhXcmFwVmFsdWVzLmZvckVhY2godmFsdWUgPT4ge1xuICAgIHdyYXBTdHlsZVtgJHtjb21wb25lbnRDbHN9LXdyYXAtJHt2YWx1ZX1gXSA9IHtcbiAgICAgIGZsZXhXcmFwOiB2YWx1ZVxuICAgIH07XG4gIH0pO1xuICByZXR1cm4gd3JhcFN0eWxlO1xufTtcbmNvbnN0IGdlbkFsaWduSXRlbXNTdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENsc1xuICB9ID0gdG9rZW47XG4gIGNvbnN0IGFsaWduU3R5bGUgPSB7fTtcbiAgYWxpZ25JdGVtc1ZhbHVlcy5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICBhbGlnblN0eWxlW2Ake2NvbXBvbmVudENsc30tYWxpZ24tJHt2YWx1ZX1gXSA9IHtcbiAgICAgIGFsaWduSXRlbXM6IHZhbHVlXG4gICAgfTtcbiAgfSk7XG4gIHJldHVybiBhbGlnblN0eWxlO1xufTtcbmNvbnN0IGdlbkp1c3RpZnlDb250ZW50U3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHNcbiAgfSA9IHRva2VuO1xuICBjb25zdCBqdXN0aWZ5U3R5bGUgPSB7fTtcbiAganVzdGlmeUNvbnRlbnRWYWx1ZXMuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAganVzdGlmeVN0eWxlW2Ake2NvbXBvbmVudENsc30tanVzdGlmeS0ke3ZhbHVlfWBdID0ge1xuICAgICAganVzdGlmeUNvbnRlbnQ6IHZhbHVlXG4gICAgfTtcbiAgfSk7XG4gIHJldHVybiBqdXN0aWZ5U3R5bGU7XG59O1xuZXhwb3J0IGNvbnN0IHByZXBhcmVDb21wb25lbnRUb2tlbiA9ICgpID0+ICh7fSk7XG5leHBvcnQgZGVmYXVsdCBnZW5TdHlsZUhvb2tzKCdGbGV4JywgdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgcGFkZGluZ1hTLFxuICAgIHBhZGRpbmcsXG4gICAgcGFkZGluZ0xHXG4gIH0gPSB0b2tlbjtcbiAgY29uc3QgZmxleFRva2VuID0gbWVyZ2VUb2tlbih0b2tlbiwge1xuICAgIGZsZXhHYXBTTTogcGFkZGluZ1hTLFxuICAgIGZsZXhHYXA6IHBhZGRpbmcsXG4gICAgZmxleEdhcExHOiBwYWRkaW5nTEdcbiAgfSk7XG4gIHJldHVybiBbZ2VuRmxleFN0eWxlKGZsZXhUb2tlbiksIGdlbkZsZXhHYXBTdHlsZShmbGV4VG9rZW4pLCBnZW5GbGV4V3JhcFN0eWxlKGZsZXhUb2tlbiksIGdlbkFsaWduSXRlbXNTdHlsZShmbGV4VG9rZW4pLCBnZW5KdXN0aWZ5Q29udGVudFN0eWxlKGZsZXhUb2tlbildO1xufSwgcHJlcGFyZUNvbXBvbmVudFRva2VuLCB7XG4gIC8vIEZsZXggY29tcG9uZW50IGRvbid0IGFwcGx5IGV4dHJhIGZvbnQgc3R5bGVcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvNDY0MDNcbiAgcmVzZXRTdHlsZTogZmFsc2Vcbn0pOyIsICJcInVzZSBjbGllbnRcIjtcblxudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBFeWVPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvRXllT3V0bGluZWRcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFJjSW1hZ2UgZnJvbSAncmMtaW1hZ2UnO1xuaW1wb3J0IHsgdXNlWkluZGV4IH0gZnJvbSAnLi4vX3V0aWwvaG9va3MvdXNlWkluZGV4JztcbmltcG9ydCB7IGdldFRyYW5zaXRpb25OYW1lIH0gZnJvbSAnLi4vX3V0aWwvbW90aW9uJztcbmltcG9ydCB7IHVzZUNvbXBvbmVudENvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlci9jb250ZXh0JztcbmltcG9ydCB1c2VDU1NWYXJDbHMgZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL2hvb2tzL3VzZUNTU1ZhckNscyc7XG5pbXBvcnQgeyB1c2VMb2NhbGUgfSBmcm9tICcuLi9sb2NhbGUnO1xuaW1wb3J0IFByZXZpZXdHcm91cCwgeyBpY29ucyB9IGZyb20gJy4vUHJldmlld0dyb3VwJztcbmltcG9ydCB1c2VTdHlsZSBmcm9tICcuL3N0eWxlJztcbmNvbnN0IEltYWdlID0gcHJvcHMgPT4ge1xuICBjb25zdCB7XG4gICAgICBwcmVmaXhDbHM6IGN1c3RvbWl6ZVByZWZpeENscyxcbiAgICAgIHByZXZpZXcsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICByb290Q2xhc3NOYW1lLFxuICAgICAgc3R5bGVcbiAgICB9ID0gcHJvcHMsXG4gICAgb3RoZXJQcm9wcyA9IF9fcmVzdChwcm9wcywgW1wicHJlZml4Q2xzXCIsIFwicHJldmlld1wiLCBcImNsYXNzTmFtZVwiLCBcInJvb3RDbGFzc05hbWVcIiwgXCJzdHlsZVwiXSk7XG4gIGNvbnN0IHtcbiAgICBnZXRQcmVmaXhDbHMsXG4gICAgZ2V0UG9wdXBDb250YWluZXI6IGdldENvbnRleHRQb3B1cENvbnRhaW5lcixcbiAgICBjbGFzc05hbWU6IGNvbnRleHRDbGFzc05hbWUsXG4gICAgc3R5bGU6IGNvbnRleHRTdHlsZSxcbiAgICBwcmV2aWV3OiBjb250ZXh0UHJldmlld1xuICB9ID0gdXNlQ29tcG9uZW50Q29uZmlnKCdpbWFnZScpO1xuICBjb25zdCBbaW1hZ2VMb2NhbGVdID0gdXNlTG9jYWxlKCdJbWFnZScpO1xuICBjb25zdCBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2ltYWdlJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgY29uc3Qgcm9vdFByZWZpeENscyA9IGdldFByZWZpeENscygpO1xuICAvLyBTdHlsZVxuICBjb25zdCByb290Q2xzID0gdXNlQ1NTVmFyQ2xzKHByZWZpeENscyk7XG4gIGNvbnN0IFt3cmFwQ1NTVmFyLCBoYXNoSWQsIGNzc1ZhckNsc10gPSB1c2VTdHlsZShwcmVmaXhDbHMsIHJvb3RDbHMpO1xuICBjb25zdCBtZXJnZWRSb290Q2xhc3NOYW1lID0gY2xhc3NOYW1lcyhyb290Q2xhc3NOYW1lLCBoYXNoSWQsIGNzc1ZhckNscywgcm9vdENscyk7XG4gIGNvbnN0IG1lcmdlZENsYXNzTmFtZSA9IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBoYXNoSWQsIGNvbnRleHRDbGFzc05hbWUpO1xuICBjb25zdCBbekluZGV4XSA9IHVzZVpJbmRleCgnSW1hZ2VQcmV2aWV3JywgdHlwZW9mIHByZXZpZXcgPT09ICdvYmplY3QnID8gcHJldmlldy56SW5kZXggOiB1bmRlZmluZWQpO1xuICBjb25zdCBtZXJnZWRQcmV2aWV3ID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKHByZXZpZXcgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gcHJldmlldztcbiAgICB9XG4gICAgY29uc3QgX3ByZXZpZXcgPSB0eXBlb2YgcHJldmlldyA9PT0gJ29iamVjdCcgPyBwcmV2aWV3IDoge307XG4gICAgY29uc3Qge1xuICAgICAgICBnZXRDb250YWluZXIsXG4gICAgICAgIGNsb3NlSWNvbixcbiAgICAgICAgcm9vdENsYXNzTmFtZVxuICAgICAgfSA9IF9wcmV2aWV3LFxuICAgICAgcmVzdFByZXZpZXdQcm9wcyA9IF9fcmVzdChfcHJldmlldywgW1wiZ2V0Q29udGFpbmVyXCIsIFwiY2xvc2VJY29uXCIsIFwicm9vdENsYXNzTmFtZVwiXSk7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7XG4gICAgICBtYXNrOiAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IGAke3ByZWZpeENsc30tbWFzay1pbmZvYFxuICAgICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRXllT3V0bGluZWQsIG51bGwpLCBpbWFnZUxvY2FsZSA9PT0gbnVsbCB8fCBpbWFnZUxvY2FsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogaW1hZ2VMb2NhbGUucHJldmlldykpLFxuICAgICAgaWNvbnNcbiAgICB9LCByZXN0UHJldmlld1Byb3BzKSwge1xuICAgICAgcm9vdENsYXNzTmFtZTogY2xhc3NOYW1lcyhtZXJnZWRSb290Q2xhc3NOYW1lLCByb290Q2xhc3NOYW1lKSxcbiAgICAgIGdldENvbnRhaW5lcjogZ2V0Q29udGFpbmVyICE9PSBudWxsICYmIGdldENvbnRhaW5lciAhPT0gdm9pZCAwID8gZ2V0Q29udGFpbmVyIDogZ2V0Q29udGV4dFBvcHVwQ29udGFpbmVyLFxuICAgICAgdHJhbnNpdGlvbk5hbWU6IGdldFRyYW5zaXRpb25OYW1lKHJvb3RQcmVmaXhDbHMsICd6b29tJywgX3ByZXZpZXcudHJhbnNpdGlvbk5hbWUpLFxuICAgICAgbWFza1RyYW5zaXRpb25OYW1lOiBnZXRUcmFuc2l0aW9uTmFtZShyb290UHJlZml4Q2xzLCAnZmFkZScsIF9wcmV2aWV3Lm1hc2tUcmFuc2l0aW9uTmFtZSksXG4gICAgICB6SW5kZXgsXG4gICAgICBjbG9zZUljb246IGNsb3NlSWNvbiAhPT0gbnVsbCAmJiBjbG9zZUljb24gIT09IHZvaWQgMCA/IGNsb3NlSWNvbiA6IGNvbnRleHRQcmV2aWV3ID09PSBudWxsIHx8IGNvbnRleHRQcmV2aWV3ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb250ZXh0UHJldmlldy5jbG9zZUljb25cbiAgICB9KTtcbiAgfSwgW3ByZXZpZXcsIGltYWdlTG9jYWxlLCBjb250ZXh0UHJldmlldyA9PT0gbnVsbCB8fCBjb250ZXh0UHJldmlldyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29udGV4dFByZXZpZXcuY2xvc2VJY29uXSk7XG4gIGNvbnN0IG1lcmdlZFN0eWxlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjb250ZXh0U3R5bGUpLCBzdHlsZSk7XG4gIHJldHVybiB3cmFwQ1NTVmFyKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJjSW1hZ2UsIE9iamVjdC5hc3NpZ24oe1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIHByZXZpZXc6IG1lcmdlZFByZXZpZXcsXG4gICAgcm9vdENsYXNzTmFtZTogbWVyZ2VkUm9vdENsYXNzTmFtZSxcbiAgICBjbGFzc05hbWU6IG1lcmdlZENsYXNzTmFtZSxcbiAgICBzdHlsZTogbWVyZ2VkU3R5bGVcbiAgfSwgb3RoZXJQcm9wcykpKTtcbn07XG5JbWFnZS5QcmV2aWV3R3JvdXAgPSBQcmV2aWV3R3JvdXA7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBJbWFnZS5kaXNwbGF5TmFtZSA9ICdJbWFnZSc7XG59XG5leHBvcnQgZGVmYXVsdCBJbWFnZTsiLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRXllT3V0bGluZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vRXllT3V0bGluZWRcIjtcbmltcG9ydCBBbnRkSWNvbiBmcm9tIFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiO1xudmFyIEV5ZU91dGxpbmVkID0gZnVuY3Rpb24gRXllT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IEV5ZU91dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5cbi8qKiFbZXllXShkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUIzYVdSMGFEMGlOVEFpSUdobGFXZG9kRDBpTlRBaUlHWnBiR3c5SWlOallXTmhZMkVpSUhacFpYZENiM2c5SWpZMElEWTBJRGc1TmlBNE9UWWlJR1p2WTNWellXSnNaVDBpWm1Gc2MyVWlJSGh0Ykc1elBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5SStQSEJoZEdnZ1pEMGlUVGswTWk0eUlEUTROaTR5UXpnME55NDBJREk0Tmk0MUlEY3dOQzR4SURFNE5pQTFNVElnTVRnMll5MHhPVEl1TWlBd0xUTXpOUzQwSURFd01DNDFMVFF6TUM0eUlETXdNQzR6WVRZd0xqTWdOakF1TXlBd0lEQXdNQ0ExTVM0MVF6RTNOaTQySURjek55NDFJRE14T1M0NUlEZ3pPQ0ExTVRJZ09ETTRZekU1TWk0eUlEQWdNek0xTGpRdE1UQXdMalVnTkRNd0xqSXRNekF3TGpNZ055NDNMVEUyTGpJZ055NDNMVE0xSURBdE5URXVOWHBOTlRFeUlEYzJObU10TVRZeExqTWdNQzB5TnprdU5DMDRNUzQ0TFRNMk1pNDNMVEkxTkVNeU16SXVOaUF6TXprdU9DQXpOVEF1TnlBeU5UZ2dOVEV5SURJMU9HTXhOakV1TXlBd0lESTNPUzQwSURneExqZ2dNell5TGpjZ01qVTBRemM1TVM0MUlEWTROQzR5SURZM015NDBJRGMyTmlBMU1USWdOelkyZW0wdE5DMDBNekJqTFRrM0xqSWdNQzB4TnpZZ056Z3VPQzB4TnpZZ01UYzJjemM0TGpnZ01UYzJJREUzTmlBeE56WWdNVGMyTFRjNExqZ2dNVGMyTFRFM05pMDNPQzQ0TFRFM05pMHhOell0TVRjMmVtMHdJREk0T0dNdE5qRXVPU0F3TFRFeE1pMDFNQzR4TFRFeE1pMHhNVEp6TlRBdU1TMHhNVElnTVRFeUxURXhNaUF4TVRJZ05UQXVNU0F4TVRJZ01URXlMVFV3TGpFZ01URXlMVEV4TWlBeE1USjZJaUF2UGp3dmMzWm5QZz09KSAqL1xudmFyIFJlZkljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihFeWVPdXRsaW5lZCk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBSZWZJY29uLmRpc3BsYXlOYW1lID0gJ0V5ZU91dGxpbmVkJztcbn1cbmV4cG9ydCBkZWZhdWx0IFJlZkljb247IiwgIi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxudmFyIEV5ZU91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk05NDIuMiA0ODYuMkM4NDcuNCAyODYuNSA3MDQuMSAxODYgNTEyIDE4NmMtMTkyLjIgMC0zMzUuNCAxMDAuNS00MzAuMiAzMDAuM2E2MC4zIDYwLjMgMCAwMDAgNTEuNUMxNzYuNiA3MzcuNSAzMTkuOSA4MzggNTEyIDgzOGMxOTIuMiAwIDMzNS40LTEwMC41IDQzMC4yLTMwMC4zIDcuNy0xNi4yIDcuNy0zNSAwLTUxLjV6TTUxMiA3NjZjLTE2MS4zIDAtMjc5LjQtODEuOC0zNjIuNy0yNTRDMjMyLjYgMzM5LjggMzUwLjcgMjU4IDUxMiAyNThjMTYxLjMgMCAyNzkuNCA4MS44IDM2Mi43IDI1NEM3OTEuNSA2ODQuMiA2NzMuNCA3NjYgNTEyIDc2NnptLTQtNDMwYy05Ny4yIDAtMTc2IDc4LjgtMTc2IDE3NnM3OC44IDE3NiAxNzYgMTc2IDE3Ni03OC44IDE3Ni0xNzYtNzguOC0xNzYtMTc2LTE3NnptMCAyODhjLTYxLjkgMC0xMTItNTAuMS0xMTItMTEyczUwLjEtMTEyIDExMi0xMTIgMTEyIDUwLjEgMTEyIDExMi01MC4xIDExMi0xMTIgMTEyelwiIH0gfV0gfSwgXCJuYW1lXCI6IFwiZXllXCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnQgZGVmYXVsdCBFeWVPdXRsaW5lZDtcbiIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcInNyY1wiLCBcImFsdFwiLCBcIm9uUHJldmlld0Nsb3NlXCIsIFwicHJlZml4Q2xzXCIsIFwicHJldmlld1ByZWZpeENsc1wiLCBcInBsYWNlaG9sZGVyXCIsIFwiZmFsbGJhY2tcIiwgXCJ3aWR0aFwiLCBcImhlaWdodFwiLCBcInN0eWxlXCIsIFwicHJldmlld1wiLCBcImNsYXNzTmFtZVwiLCBcIm9uQ2xpY2tcIiwgXCJvbkVycm9yXCIsIFwid3JhcHBlckNsYXNzTmFtZVwiLCBcIndyYXBwZXJTdHlsZVwiLCBcInJvb3RDbGFzc05hbWVcIl0sXG4gIF9leGNsdWRlZDIgPSBbXCJzcmNcIiwgXCJ2aXNpYmxlXCIsIFwib25WaXNpYmxlQ2hhbmdlXCIsIFwiZ2V0Q29udGFpbmVyXCIsIFwibWFza1wiLCBcIm1hc2tDbGFzc05hbWVcIiwgXCJtb3ZhYmxlXCIsIFwiaWNvbnNcIiwgXCJzY2FsZVN0ZXBcIiwgXCJtaW5TY2FsZVwiLCBcIm1heFNjYWxlXCIsIFwiaW1hZ2VSZW5kZXJcIiwgXCJ0b29sYmFyUmVuZGVyXCJdO1xuaW1wb3J0IGNuIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgZ2V0T2Zmc2V0IH0gZnJvbSBcInJjLXV0aWwvZXMvRG9tL2Nzc1wiO1xuaW1wb3J0IHVzZU1lcmdlZFN0YXRlIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZU1lcmdlZFN0YXRlXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDb250ZXh0LCB1c2VNZW1vLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcmV2aWV3IGZyb20gXCIuL1ByZXZpZXdcIjtcbmltcG9ydCBQcmV2aWV3R3JvdXAgZnJvbSBcIi4vUHJldmlld0dyb3VwXCI7XG5pbXBvcnQgeyBDT01NT05fUFJPUFMgfSBmcm9tIFwiLi9jb21tb25cIjtcbmltcG9ydCB7IFByZXZpZXdHcm91cENvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0XCI7XG5pbXBvcnQgdXNlUmVnaXN0ZXJJbWFnZSBmcm9tIFwiLi9ob29rcy91c2VSZWdpc3RlckltYWdlXCI7XG5pbXBvcnQgdXNlU3RhdHVzIGZyb20gXCIuL2hvb2tzL3VzZVN0YXR1c1wiO1xudmFyIEltYWdlSW50ZXJuYWwgPSBmdW5jdGlvbiBJbWFnZUludGVybmFsKHByb3BzKSB7XG4gIHZhciBpbWdTcmMgPSBwcm9wcy5zcmMsXG4gICAgYWx0ID0gcHJvcHMuYWx0LFxuICAgIG9uSW5pdGlhbFByZXZpZXdDbG9zZSA9IHByb3BzLm9uUHJldmlld0Nsb3NlLFxuICAgIF9wcm9wcyRwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgcHJlZml4Q2xzID0gX3Byb3BzJHByZWZpeENscyA9PT0gdm9pZCAwID8gJ3JjLWltYWdlJyA6IF9wcm9wcyRwcmVmaXhDbHMsXG4gICAgX3Byb3BzJHByZXZpZXdQcmVmaXhDID0gcHJvcHMucHJldmlld1ByZWZpeENscyxcbiAgICBwcmV2aWV3UHJlZml4Q2xzID0gX3Byb3BzJHByZXZpZXdQcmVmaXhDID09PSB2b2lkIDAgPyBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXByZXZpZXdcIikgOiBfcHJvcHMkcHJldmlld1ByZWZpeEMsXG4gICAgcGxhY2Vob2xkZXIgPSBwcm9wcy5wbGFjZWhvbGRlcixcbiAgICBmYWxsYmFjayA9IHByb3BzLmZhbGxiYWNrLFxuICAgIHdpZHRoID0gcHJvcHMud2lkdGgsXG4gICAgaGVpZ2h0ID0gcHJvcHMuaGVpZ2h0LFxuICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgX3Byb3BzJHByZXZpZXcgPSBwcm9wcy5wcmV2aWV3LFxuICAgIHByZXZpZXcgPSBfcHJvcHMkcHJldmlldyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyRwcmV2aWV3LFxuICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBvbkNsaWNrID0gcHJvcHMub25DbGljayxcbiAgICBvbkVycm9yID0gcHJvcHMub25FcnJvcixcbiAgICB3cmFwcGVyQ2xhc3NOYW1lID0gcHJvcHMud3JhcHBlckNsYXNzTmFtZSxcbiAgICB3cmFwcGVyU3R5bGUgPSBwcm9wcy53cmFwcGVyU3R5bGUsXG4gICAgcm9vdENsYXNzTmFtZSA9IHByb3BzLnJvb3RDbGFzc05hbWUsXG4gICAgb3RoZXJQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgX2V4Y2x1ZGVkKTtcbiAgdmFyIGlzQ3VzdG9tUGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlciAmJiBwbGFjZWhvbGRlciAhPT0gdHJ1ZTtcbiAgdmFyIF9yZWYgPSBfdHlwZW9mKHByZXZpZXcpID09PSAnb2JqZWN0JyA/IHByZXZpZXcgOiB7fSxcbiAgICBwcmV2aWV3U3JjID0gX3JlZi5zcmMsXG4gICAgX3JlZiR2aXNpYmxlID0gX3JlZi52aXNpYmxlLFxuICAgIHByZXZpZXdWaXNpYmxlID0gX3JlZiR2aXNpYmxlID09PSB2b2lkIDAgPyB1bmRlZmluZWQgOiBfcmVmJHZpc2libGUsXG4gICAgX3JlZiRvblZpc2libGVDaGFuZ2UgPSBfcmVmLm9uVmlzaWJsZUNoYW5nZSxcbiAgICBvblByZXZpZXdWaXNpYmxlQ2hhbmdlID0gX3JlZiRvblZpc2libGVDaGFuZ2UgPT09IHZvaWQgMCA/IG9uSW5pdGlhbFByZXZpZXdDbG9zZSA6IF9yZWYkb25WaXNpYmxlQ2hhbmdlLFxuICAgIF9yZWYkZ2V0Q29udGFpbmVyID0gX3JlZi5nZXRDb250YWluZXIsXG4gICAgZ2V0UHJldmlld0NvbnRhaW5lciA9IF9yZWYkZ2V0Q29udGFpbmVyID09PSB2b2lkIDAgPyB1bmRlZmluZWQgOiBfcmVmJGdldENvbnRhaW5lcixcbiAgICBwcmV2aWV3TWFzayA9IF9yZWYubWFzayxcbiAgICBtYXNrQ2xhc3NOYW1lID0gX3JlZi5tYXNrQ2xhc3NOYW1lLFxuICAgIG1vdmFibGUgPSBfcmVmLm1vdmFibGUsXG4gICAgaWNvbnMgPSBfcmVmLmljb25zLFxuICAgIHNjYWxlU3RlcCA9IF9yZWYuc2NhbGVTdGVwLFxuICAgIG1pblNjYWxlID0gX3JlZi5taW5TY2FsZSxcbiAgICBtYXhTY2FsZSA9IF9yZWYubWF4U2NhbGUsXG4gICAgaW1hZ2VSZW5kZXIgPSBfcmVmLmltYWdlUmVuZGVyLFxuICAgIHRvb2xiYXJSZW5kZXIgPSBfcmVmLnRvb2xiYXJSZW5kZXIsXG4gICAgZGlhbG9nUHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZiwgX2V4Y2x1ZGVkMik7XG4gIHZhciBzcmMgPSBwcmV2aWV3U3JjICE9PSBudWxsICYmIHByZXZpZXdTcmMgIT09IHZvaWQgMCA/IHByZXZpZXdTcmMgOiBpbWdTcmM7XG4gIHZhciBfdXNlTWVyZ2VkU3RhdGUgPSB1c2VNZXJnZWRTdGF0ZSghIXByZXZpZXdWaXNpYmxlLCB7XG4gICAgICB2YWx1ZTogcHJldmlld1Zpc2libGUsXG4gICAgICBvbkNoYW5nZTogb25QcmV2aWV3VmlzaWJsZUNoYW5nZVxuICAgIH0pLFxuICAgIF91c2VNZXJnZWRTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlTWVyZ2VkU3RhdGUsIDIpLFxuICAgIGlzU2hvd1ByZXZpZXcgPSBfdXNlTWVyZ2VkU3RhdGUyWzBdLFxuICAgIHNldFNob3dQcmV2aWV3ID0gX3VzZU1lcmdlZFN0YXRlMlsxXTtcbiAgdmFyIF91c2VTdGF0dXMgPSB1c2VTdGF0dXMoe1xuICAgICAgc3JjOiBpbWdTcmMsXG4gICAgICBpc0N1c3RvbVBsYWNlaG9sZGVyOiBpc0N1c3RvbVBsYWNlaG9sZGVyLFxuICAgICAgZmFsbGJhY2s6IGZhbGxiYWNrXG4gICAgfSksXG4gICAgX3VzZVN0YXR1czIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdHVzLCAzKSxcbiAgICBnZXRJbWdSZWYgPSBfdXNlU3RhdHVzMlswXSxcbiAgICBzcmNBbmRPbmxvYWQgPSBfdXNlU3RhdHVzMlsxXSxcbiAgICBzdGF0dXMgPSBfdXNlU3RhdHVzMlsyXTtcbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKG51bGwpLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIG1vdXNlUG9zaXRpb24gPSBfdXNlU3RhdGUyWzBdLFxuICAgIHNldE1vdXNlUG9zaXRpb24gPSBfdXNlU3RhdGUyWzFdO1xuICB2YXIgZ3JvdXBDb250ZXh0ID0gdXNlQ29udGV4dChQcmV2aWV3R3JvdXBDb250ZXh0KTtcbiAgdmFyIGNhblByZXZpZXcgPSAhIXByZXZpZXc7XG4gIHZhciBvblByZXZpZXdDbG9zZSA9IGZ1bmN0aW9uIG9uUHJldmlld0Nsb3NlKCkge1xuICAgIHNldFNob3dQcmV2aWV3KGZhbHNlKTtcbiAgICBzZXRNb3VzZVBvc2l0aW9uKG51bGwpO1xuICB9O1xuICB2YXIgd3JhcHBlckNsYXNzID0gY24ocHJlZml4Q2xzLCB3cmFwcGVyQ2xhc3NOYW1lLCByb290Q2xhc3NOYW1lLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZXJyb3JcIiksIHN0YXR1cyA9PT0gJ2Vycm9yJykpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gSW1hZ2VQcm9wcyA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBpbWdDb21tb25Qcm9wcyA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBvYmogPSB7fTtcbiAgICBDT01NT05fUFJPUFMuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgaWYgKHByb3BzW3Byb3BdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb2JqW3Byb3BdID0gcHJvcHNbcHJvcF07XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG9iajtcbiAgfSwgQ09NTU9OX1BST1BTLm1hcChmdW5jdGlvbiAocHJvcCkge1xuICAgIHJldHVybiBwcm9wc1twcm9wXTtcbiAgfSkpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IFJlZ2lzdGVyID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciByZWdpc3RlckRhdGEgPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBpbWdDb21tb25Qcm9wcyksIHt9LCB7XG4gICAgICBzcmM6IHNyY1xuICAgIH0pO1xuICB9LCBbc3JjLCBpbWdDb21tb25Qcm9wc10pO1xuICB2YXIgaW1hZ2VJZCA9IHVzZVJlZ2lzdGVySW1hZ2UoY2FuUHJldmlldywgcmVnaXN0ZXJEYXRhKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBQcmV2aWV3ID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgb25QcmV2aWV3ID0gZnVuY3Rpb24gb25QcmV2aWV3KGUpIHtcbiAgICB2YXIgX2dldE9mZnNldCA9IGdldE9mZnNldChlLnRhcmdldCksXG4gICAgICBsZWZ0ID0gX2dldE9mZnNldC5sZWZ0LFxuICAgICAgdG9wID0gX2dldE9mZnNldC50b3A7XG4gICAgaWYgKGdyb3VwQ29udGV4dCkge1xuICAgICAgZ3JvdXBDb250ZXh0Lm9uUHJldmlldyhpbWFnZUlkLCBzcmMsIGxlZnQsIHRvcCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldE1vdXNlUG9zaXRpb24oe1xuICAgICAgICB4OiBsZWZ0LFxuICAgICAgICB5OiB0b3BcbiAgICAgIH0pO1xuICAgICAgc2V0U2hvd1ByZXZpZXcodHJ1ZSk7XG4gICAgfVxuICAgIG9uQ2xpY2sgPT09IG51bGwgfHwgb25DbGljayA9PT0gdm9pZCAwIHx8IG9uQ2xpY2soZSk7XG4gIH07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7fSwgb3RoZXJQcm9wcywge1xuICAgIGNsYXNzTmFtZTogd3JhcHBlckNsYXNzLFxuICAgIG9uQ2xpY2s6IGNhblByZXZpZXcgPyBvblByZXZpZXcgOiBvbkNsaWNrLFxuICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKHtcbiAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgIGhlaWdodDogaGVpZ2h0XG4gICAgfSwgd3JhcHBlclN0eWxlKVxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIiwgX2V4dGVuZHMoe30sIGltZ0NvbW1vblByb3BzLCB7XG4gICAgY2xhc3NOYW1lOiBjbihcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWltZ1wiKSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWltZy1wbGFjZWhvbGRlclwiKSwgcGxhY2Vob2xkZXIgPT09IHRydWUpLCBjbGFzc05hbWUpLFxuICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKHtcbiAgICAgIGhlaWdodDogaGVpZ2h0XG4gICAgfSwgc3R5bGUpLFxuICAgIHJlZjogZ2V0SW1nUmVmXG4gIH0sIHNyY0FuZE9ubG9hZCwge1xuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICBvbkVycm9yOiBvbkVycm9yXG4gIH0pKSwgc3RhdHVzID09PSAnbG9hZGluZycgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCIsXG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXBsYWNlaG9sZGVyXCIpXG4gIH0sIHBsYWNlaG9sZGVyKSwgcHJldmlld01hc2sgJiYgY2FuUHJldmlldyAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbihcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW1hc2tcIiksIG1hc2tDbGFzc05hbWUpLFxuICAgIHN0eWxlOiB7XG4gICAgICBkaXNwbGF5OiAoc3R5bGUgPT09IG51bGwgfHwgc3R5bGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0eWxlLmRpc3BsYXkpID09PSAnbm9uZScgPyAnbm9uZScgOiB1bmRlZmluZWRcbiAgICB9XG4gIH0sIHByZXZpZXdNYXNrKSksICFncm91cENvbnRleHQgJiYgY2FuUHJldmlldyAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQcmV2aWV3LCBfZXh0ZW5kcyh7XG4gICAgXCJhcmlhLWhpZGRlblwiOiAhaXNTaG93UHJldmlldyxcbiAgICB2aXNpYmxlOiBpc1Nob3dQcmV2aWV3LFxuICAgIHByZWZpeENsczogcHJldmlld1ByZWZpeENscyxcbiAgICBvbkNsb3NlOiBvblByZXZpZXdDbG9zZSxcbiAgICBtb3VzZVBvc2l0aW9uOiBtb3VzZVBvc2l0aW9uLFxuICAgIHNyYzogc3JjLFxuICAgIGFsdDogYWx0LFxuICAgIGltYWdlSW5mbzoge1xuICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgaGVpZ2h0OiBoZWlnaHRcbiAgICB9LFxuICAgIGZhbGxiYWNrOiBmYWxsYmFjayxcbiAgICBnZXRDb250YWluZXI6IGdldFByZXZpZXdDb250YWluZXIsXG4gICAgaWNvbnM6IGljb25zLFxuICAgIG1vdmFibGU6IG1vdmFibGUsXG4gICAgc2NhbGVTdGVwOiBzY2FsZVN0ZXAsXG4gICAgbWluU2NhbGU6IG1pblNjYWxlLFxuICAgIG1heFNjYWxlOiBtYXhTY2FsZSxcbiAgICByb290Q2xhc3NOYW1lOiByb290Q2xhc3NOYW1lLFxuICAgIGltYWdlUmVuZGVyOiBpbWFnZVJlbmRlcixcbiAgICBpbWdDb21tb25Qcm9wczogaW1nQ29tbW9uUHJvcHMsXG4gICAgdG9vbGJhclJlbmRlcjogdG9vbGJhclJlbmRlclxuICB9LCBkaWFsb2dQcm9wcykpKTtcbn07XG5JbWFnZUludGVybmFsLlByZXZpZXdHcm91cCA9IFByZXZpZXdHcm91cDtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIEltYWdlSW50ZXJuYWwuZGlzcGxheU5hbWUgPSAnSW1hZ2UnO1xufVxuZXhwb3J0IGRlZmF1bHQgSW1hZ2VJbnRlcm5hbDsiLCAiLyogZXNsaW50LWRpc2FibGUgbm8tbmVzdGVkLXRlcm5hcnkgKi9cbnZhciBQSVhFTF9QQVRURVJOID0gL21hcmdpbnxwYWRkaW5nfHdpZHRofGhlaWdodHxtYXh8bWlufG9mZnNldC87XG52YXIgcmVtb3ZlUGl4ZWwgPSB7XG4gIGxlZnQ6IHRydWUsXG4gIHRvcDogdHJ1ZVxufTtcbnZhciBmbG9hdE1hcCA9IHtcbiAgY3NzRmxvYXQ6IDEsXG4gIHN0eWxlRmxvYXQ6IDEsXG4gIGZsb2F0OiAxXG59O1xuZnVuY3Rpb24gZ2V0Q29tcHV0ZWRTdHlsZShub2RlKSB7XG4gIHJldHVybiBub2RlLm5vZGVUeXBlID09PSAxID8gbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUobm9kZSwgbnVsbCkgOiB7fTtcbn1cbmZ1bmN0aW9uIGdldFN0eWxlVmFsdWUobm9kZSwgdHlwZSwgdmFsdWUpIHtcbiAgdHlwZSA9IHR5cGUudG9Mb3dlckNhc2UoKTtcbiAgaWYgKHZhbHVlID09PSAnYXV0bycpIHtcbiAgICBpZiAodHlwZSA9PT0gJ2hlaWdodCcpIHtcbiAgICAgIHJldHVybiBub2RlLm9mZnNldEhlaWdodDtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09ICd3aWR0aCcpIHtcbiAgICAgIHJldHVybiBub2RlLm9mZnNldFdpZHRoO1xuICAgIH1cbiAgfVxuICBpZiAoISh0eXBlIGluIHJlbW92ZVBpeGVsKSkge1xuICAgIHJlbW92ZVBpeGVsW3R5cGVdID0gUElYRUxfUEFUVEVSTi50ZXN0KHR5cGUpO1xuICB9XG4gIHJldHVybiByZW1vdmVQaXhlbFt0eXBlXSA/IHBhcnNlRmxvYXQodmFsdWUpIHx8IDAgOiB2YWx1ZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXQobm9kZSwgbmFtZSkge1xuICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTtcbiAgbmFtZSA9IGZsb2F0TWFwW25hbWVdID8gJ2Nzc0Zsb2F0JyBpbiBub2RlLnN0eWxlID8gJ2Nzc0Zsb2F0JyA6ICdzdHlsZUZsb2F0JyA6IG5hbWU7XG4gIHJldHVybiBsZW5ndGggPT09IDEgPyBzdHlsZSA6IGdldFN0eWxlVmFsdWUobm9kZSwgbmFtZSwgc3R5bGVbbmFtZV0gfHwgbm9kZS5zdHlsZVtuYW1lXSk7XG59XG5leHBvcnQgZnVuY3Rpb24gc2V0KG5vZGUsIG5hbWUsIHZhbHVlKSB7XG4gIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICBuYW1lID0gZmxvYXRNYXBbbmFtZV0gPyAnY3NzRmxvYXQnIGluIG5vZGUuc3R5bGUgPyAnY3NzRmxvYXQnIDogJ3N0eWxlRmxvYXQnIDogbmFtZTtcbiAgaWYgKGxlbmd0aCA9PT0gMykge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIFBJWEVMX1BBVFRFUk4udGVzdChuYW1lKSkge1xuICAgICAgdmFsdWUgPSBcIlwiLmNvbmNhdCh2YWx1ZSwgXCJweFwiKTtcbiAgICB9XG4gICAgbm9kZS5zdHlsZVtuYW1lXSA9IHZhbHVlOyAvLyBOdW1iZXJcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgZm9yICh2YXIgeCBpbiBuYW1lKSB7XG4gICAgaWYgKG5hbWUuaGFzT3duUHJvcGVydHkoeCkpIHtcbiAgICAgIHNldChub2RlLCB4LCBuYW1lW3hdKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGdldENvbXB1dGVkU3R5bGUobm9kZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0T3V0ZXJXaWR0aChlbCkge1xuICBpZiAoZWwgPT09IGRvY3VtZW50LmJvZHkpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO1xuICB9XG4gIHJldHVybiBlbC5vZmZzZXRXaWR0aDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRPdXRlckhlaWdodChlbCkge1xuICBpZiAoZWwgPT09IGRvY3VtZW50LmJvZHkpIHtcbiAgICByZXR1cm4gd2luZG93LmlubmVySGVpZ2h0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gIH1cbiAgcmV0dXJuIGVsLm9mZnNldEhlaWdodDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXREb2NTaXplKCkge1xuICB2YXIgd2lkdGggPSBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsV2lkdGgsIGRvY3VtZW50LmJvZHkuc2Nyb2xsV2lkdGgpO1xuICB2YXIgaGVpZ2h0ID0gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCwgZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQpO1xuICByZXR1cm4ge1xuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodFxuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldENsaWVudFNpemUoKSB7XG4gIHZhciB3aWR0aCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDtcbiAgdmFyIGhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICByZXR1cm4ge1xuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodFxuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjcm9sbCgpIHtcbiAgcmV0dXJuIHtcbiAgICBzY3JvbGxMZWZ0OiBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCwgZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0KSxcbiAgICBzY3JvbGxUb3A6IE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AsIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wKVxuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldE9mZnNldChub2RlKSB7XG4gIHZhciBib3ggPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB2YXIgZG9jRWxlbSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblxuICAvLyA8IGllOCBcdTRFMERcdTY1MkZcdTYzMDEgd2luLnBhZ2VYT2Zmc2V0LCBcdTUyMTlcdTRGN0ZcdTc1MjggZG9jRWxlbS5zY3JvbGxMZWZ0XG4gIHJldHVybiB7XG4gICAgbGVmdDogYm94LmxlZnQgKyAod2luZG93LnBhZ2VYT2Zmc2V0IHx8IGRvY0VsZW0uc2Nyb2xsTGVmdCkgLSAoZG9jRWxlbS5jbGllbnRMZWZ0IHx8IGRvY3VtZW50LmJvZHkuY2xpZW50TGVmdCB8fCAwKSxcbiAgICB0b3A6IGJveC50b3AgKyAod2luZG93LnBhZ2VZT2Zmc2V0IHx8IGRvY0VsZW0uc2Nyb2xsVG9wKSAtIChkb2NFbGVtLmNsaWVudFRvcCB8fCBkb2N1bWVudC5ib2R5LmNsaWVudFRvcCB8fCAwKVxuICB9O1xufSIsICJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcImZhbGxiYWNrXCIsIFwic3JjXCIsIFwiaW1nUmVmXCJdLFxuICBfZXhjbHVkZWQyID0gW1wicHJlZml4Q2xzXCIsIFwic3JjXCIsIFwiYWx0XCIsIFwiaW1hZ2VJbmZvXCIsIFwiZmFsbGJhY2tcIiwgXCJtb3ZhYmxlXCIsIFwib25DbG9zZVwiLCBcInZpc2libGVcIiwgXCJpY29uc1wiLCBcInJvb3RDbGFzc05hbWVcIiwgXCJjbG9zZUljb25cIiwgXCJnZXRDb250YWluZXJcIiwgXCJjdXJyZW50XCIsIFwiY291bnRcIiwgXCJjb3VudFJlbmRlclwiLCBcInNjYWxlU3RlcFwiLCBcIm1pblNjYWxlXCIsIFwibWF4U2NhbGVcIiwgXCJ0cmFuc2l0aW9uTmFtZVwiLCBcIm1hc2tUcmFuc2l0aW9uTmFtZVwiLCBcImltYWdlUmVuZGVyXCIsIFwiaW1nQ29tbW9uUHJvcHNcIiwgXCJ0b29sYmFyUmVuZGVyXCIsIFwib25UcmFuc2Zvcm1cIiwgXCJvbkNoYW5nZVwiXTtcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IERpYWxvZyBmcm9tICdyYy1kaWFsb2cnO1xuaW1wb3J0IGFkZEV2ZW50TGlzdGVuZXIgZnJvbSBcInJjLXV0aWwvZXMvRG9tL2FkZEV2ZW50TGlzdGVuZXJcIjtcbmltcG9ydCBLZXlDb2RlIGZyb20gXCJyYy11dGlsL2VzL0tleUNvZGVcIjtcbmltcG9ydCBSZWFjdCwgeyB1c2VDb250ZXh0LCB1c2VFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgT3BlcmF0aW9ucyBmcm9tIFwiLi9PcGVyYXRpb25zXCI7XG5pbXBvcnQgeyBQcmV2aWV3R3JvdXBDb250ZXh0IH0gZnJvbSBcIi4vY29udGV4dFwiO1xuaW1wb3J0IHVzZUltYWdlVHJhbnNmb3JtIGZyb20gXCIuL2hvb2tzL3VzZUltYWdlVHJhbnNmb3JtXCI7XG5pbXBvcnQgdXNlTW91c2VFdmVudCBmcm9tIFwiLi9ob29rcy91c2VNb3VzZUV2ZW50XCI7XG5pbXBvcnQgdXNlU3RhdHVzIGZyb20gXCIuL2hvb2tzL3VzZVN0YXR1c1wiO1xuaW1wb3J0IHVzZVRvdWNoRXZlbnQgZnJvbSBcIi4vaG9va3MvdXNlVG91Y2hFdmVudFwiO1xuaW1wb3J0IHsgQkFTRV9TQ0FMRV9SQVRJTyB9IGZyb20gXCIuL3ByZXZpZXdDb25maWdcIjtcbnZhciBQcmV2aWV3SW1hZ2UgPSBmdW5jdGlvbiBQcmV2aWV3SW1hZ2UoX3JlZikge1xuICB2YXIgZmFsbGJhY2sgPSBfcmVmLmZhbGxiYWNrLFxuICAgIHNyYyA9IF9yZWYuc3JjLFxuICAgIGltZ1JlZiA9IF9yZWYuaW1nUmVmLFxuICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYsIF9leGNsdWRlZCk7XG4gIHZhciBfdXNlU3RhdHVzID0gdXNlU3RhdHVzKHtcbiAgICAgIHNyYzogc3JjLFxuICAgICAgZmFsbGJhY2s6IGZhbGxiYWNrXG4gICAgfSksXG4gICAgX3VzZVN0YXR1czIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdHVzLCAyKSxcbiAgICBnZXRJbWdSZWYgPSBfdXNlU3RhdHVzMlswXSxcbiAgICBzcmNBbmRPbmxvYWQgPSBfdXNlU3RhdHVzMlsxXTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiaW1nXCIsIF9leHRlbmRzKHtcbiAgICByZWY6IGZ1bmN0aW9uIHJlZihfcmVmMikge1xuICAgICAgaW1nUmVmLmN1cnJlbnQgPSBfcmVmMjtcbiAgICAgIGdldEltZ1JlZihfcmVmMik7XG4gICAgfVxuICB9LCBwcm9wcywgc3JjQW5kT25sb2FkKSk7XG59O1xudmFyIFByZXZpZXcgPSBmdW5jdGlvbiBQcmV2aWV3KHByb3BzKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgc3JjID0gcHJvcHMuc3JjLFxuICAgIGFsdCA9IHByb3BzLmFsdCxcbiAgICBpbWFnZUluZm8gPSBwcm9wcy5pbWFnZUluZm8sXG4gICAgZmFsbGJhY2sgPSBwcm9wcy5mYWxsYmFjayxcbiAgICBfcHJvcHMkbW92YWJsZSA9IHByb3BzLm1vdmFibGUsXG4gICAgbW92YWJsZSA9IF9wcm9wcyRtb3ZhYmxlID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJG1vdmFibGUsXG4gICAgb25DbG9zZSA9IHByb3BzLm9uQ2xvc2UsXG4gICAgdmlzaWJsZSA9IHByb3BzLnZpc2libGUsXG4gICAgX3Byb3BzJGljb25zID0gcHJvcHMuaWNvbnMsXG4gICAgaWNvbnMgPSBfcHJvcHMkaWNvbnMgPT09IHZvaWQgMCA/IHt9IDogX3Byb3BzJGljb25zLFxuICAgIHJvb3RDbGFzc05hbWUgPSBwcm9wcy5yb290Q2xhc3NOYW1lLFxuICAgIGNsb3NlSWNvbiA9IHByb3BzLmNsb3NlSWNvbixcbiAgICBnZXRDb250YWluZXIgPSBwcm9wcy5nZXRDb250YWluZXIsXG4gICAgX3Byb3BzJGN1cnJlbnQgPSBwcm9wcy5jdXJyZW50LFxuICAgIGN1cnJlbnQgPSBfcHJvcHMkY3VycmVudCA9PT0gdm9pZCAwID8gMCA6IF9wcm9wcyRjdXJyZW50LFxuICAgIF9wcm9wcyRjb3VudCA9IHByb3BzLmNvdW50LFxuICAgIGNvdW50ID0gX3Byb3BzJGNvdW50ID09PSB2b2lkIDAgPyAxIDogX3Byb3BzJGNvdW50LFxuICAgIGNvdW50UmVuZGVyID0gcHJvcHMuY291bnRSZW5kZXIsXG4gICAgX3Byb3BzJHNjYWxlU3RlcCA9IHByb3BzLnNjYWxlU3RlcCxcbiAgICBzY2FsZVN0ZXAgPSBfcHJvcHMkc2NhbGVTdGVwID09PSB2b2lkIDAgPyAwLjUgOiBfcHJvcHMkc2NhbGVTdGVwLFxuICAgIF9wcm9wcyRtaW5TY2FsZSA9IHByb3BzLm1pblNjYWxlLFxuICAgIG1pblNjYWxlID0gX3Byb3BzJG1pblNjYWxlID09PSB2b2lkIDAgPyAxIDogX3Byb3BzJG1pblNjYWxlLFxuICAgIF9wcm9wcyRtYXhTY2FsZSA9IHByb3BzLm1heFNjYWxlLFxuICAgIG1heFNjYWxlID0gX3Byb3BzJG1heFNjYWxlID09PSB2b2lkIDAgPyA1MCA6IF9wcm9wcyRtYXhTY2FsZSxcbiAgICBfcHJvcHMkdHJhbnNpdGlvbk5hbWUgPSBwcm9wcy50cmFuc2l0aW9uTmFtZSxcbiAgICB0cmFuc2l0aW9uTmFtZSA9IF9wcm9wcyR0cmFuc2l0aW9uTmFtZSA9PT0gdm9pZCAwID8gJ3pvb20nIDogX3Byb3BzJHRyYW5zaXRpb25OYW1lLFxuICAgIF9wcm9wcyRtYXNrVHJhbnNpdGlvbiA9IHByb3BzLm1hc2tUcmFuc2l0aW9uTmFtZSxcbiAgICBtYXNrVHJhbnNpdGlvbk5hbWUgPSBfcHJvcHMkbWFza1RyYW5zaXRpb24gPT09IHZvaWQgMCA/ICdmYWRlJyA6IF9wcm9wcyRtYXNrVHJhbnNpdGlvbixcbiAgICBpbWFnZVJlbmRlciA9IHByb3BzLmltYWdlUmVuZGVyLFxuICAgIGltZ0NvbW1vblByb3BzID0gcHJvcHMuaW1nQ29tbW9uUHJvcHMsXG4gICAgdG9vbGJhclJlbmRlciA9IHByb3BzLnRvb2xiYXJSZW5kZXIsXG4gICAgb25UcmFuc2Zvcm0gPSBwcm9wcy5vblRyYW5zZm9ybSxcbiAgICBvbkNoYW5nZSA9IHByb3BzLm9uQ2hhbmdlLFxuICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgX2V4Y2x1ZGVkMik7XG4gIHZhciBpbWdSZWYgPSB1c2VSZWYoKTtcbiAgdmFyIGdyb3VwQ29udGV4dCA9IHVzZUNvbnRleHQoUHJldmlld0dyb3VwQ29udGV4dCk7XG4gIHZhciBzaG93TGVmdE9yUmlnaHRTd2l0Y2hlcyA9IGdyb3VwQ29udGV4dCAmJiBjb3VudCA+IDE7XG4gIHZhciBzaG93T3BlcmF0aW9uc1Byb2dyZXNzID0gZ3JvdXBDb250ZXh0ICYmIGNvdW50ID49IDE7XG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZSh0cnVlKSxcbiAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICBlbmFibGVUcmFuc2l0aW9uID0gX3VzZVN0YXRlMlswXSxcbiAgICBzZXRFbmFibGVUcmFuc2l0aW9uID0gX3VzZVN0YXRlMlsxXTtcbiAgdmFyIF91c2VJbWFnZVRyYW5zZm9ybSA9IHVzZUltYWdlVHJhbnNmb3JtKGltZ1JlZiwgbWluU2NhbGUsIG1heFNjYWxlLCBvblRyYW5zZm9ybSksXG4gICAgdHJhbnNmb3JtID0gX3VzZUltYWdlVHJhbnNmb3JtLnRyYW5zZm9ybSxcbiAgICByZXNldFRyYW5zZm9ybSA9IF91c2VJbWFnZVRyYW5zZm9ybS5yZXNldFRyYW5zZm9ybSxcbiAgICB1cGRhdGVUcmFuc2Zvcm0gPSBfdXNlSW1hZ2VUcmFuc2Zvcm0udXBkYXRlVHJhbnNmb3JtLFxuICAgIGRpc3BhdGNoWm9vbUNoYW5nZSA9IF91c2VJbWFnZVRyYW5zZm9ybS5kaXNwYXRjaFpvb21DaGFuZ2U7XG4gIHZhciBfdXNlTW91c2VFdmVudCA9IHVzZU1vdXNlRXZlbnQoaW1nUmVmLCBtb3ZhYmxlLCB2aXNpYmxlLCBzY2FsZVN0ZXAsIHRyYW5zZm9ybSwgdXBkYXRlVHJhbnNmb3JtLCBkaXNwYXRjaFpvb21DaGFuZ2UpLFxuICAgIGlzTW92aW5nID0gX3VzZU1vdXNlRXZlbnQuaXNNb3ZpbmcsXG4gICAgb25Nb3VzZURvd24gPSBfdXNlTW91c2VFdmVudC5vbk1vdXNlRG93bixcbiAgICBvbldoZWVsID0gX3VzZU1vdXNlRXZlbnQub25XaGVlbDtcbiAgdmFyIF91c2VUb3VjaEV2ZW50ID0gdXNlVG91Y2hFdmVudChpbWdSZWYsIG1vdmFibGUsIHZpc2libGUsIG1pblNjYWxlLCB0cmFuc2Zvcm0sIHVwZGF0ZVRyYW5zZm9ybSwgZGlzcGF0Y2hab29tQ2hhbmdlKSxcbiAgICBpc1RvdWNoaW5nID0gX3VzZVRvdWNoRXZlbnQuaXNUb3VjaGluZyxcbiAgICBvblRvdWNoU3RhcnQgPSBfdXNlVG91Y2hFdmVudC5vblRvdWNoU3RhcnQsXG4gICAgb25Ub3VjaE1vdmUgPSBfdXNlVG91Y2hFdmVudC5vblRvdWNoTW92ZSxcbiAgICBvblRvdWNoRW5kID0gX3VzZVRvdWNoRXZlbnQub25Ub3VjaEVuZDtcbiAgdmFyIHJvdGF0ZSA9IHRyYW5zZm9ybS5yb3RhdGUsXG4gICAgc2NhbGUgPSB0cmFuc2Zvcm0uc2NhbGU7XG4gIHZhciB3cmFwQ2xhc3NOYW1lID0gY2xhc3NuYW1lcyhfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbW92aW5nXCIpLCBpc01vdmluZykpO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICghZW5hYmxlVHJhbnNpdGlvbikge1xuICAgICAgc2V0RW5hYmxlVHJhbnNpdGlvbih0cnVlKTtcbiAgICB9XG4gIH0sIFtlbmFibGVUcmFuc2l0aW9uXSk7XG4gIHZhciBvbkFmdGVyQ2xvc2UgPSBmdW5jdGlvbiBvbkFmdGVyQ2xvc2UoKSB7XG4gICAgcmVzZXRUcmFuc2Zvcm0oJ2Nsb3NlJyk7XG4gIH07XG4gIHZhciBvblpvb21JbiA9IGZ1bmN0aW9uIG9uWm9vbUluKCkge1xuICAgIGRpc3BhdGNoWm9vbUNoYW5nZShCQVNFX1NDQUxFX1JBVElPICsgc2NhbGVTdGVwLCAnem9vbUluJyk7XG4gIH07XG4gIHZhciBvblpvb21PdXQgPSBmdW5jdGlvbiBvblpvb21PdXQoKSB7XG4gICAgZGlzcGF0Y2hab29tQ2hhbmdlKEJBU0VfU0NBTEVfUkFUSU8gLyAoQkFTRV9TQ0FMRV9SQVRJTyArIHNjYWxlU3RlcCksICd6b29tT3V0Jyk7XG4gIH07XG4gIHZhciBvblJvdGF0ZVJpZ2h0ID0gZnVuY3Rpb24gb25Sb3RhdGVSaWdodCgpIHtcbiAgICB1cGRhdGVUcmFuc2Zvcm0oe1xuICAgICAgcm90YXRlOiByb3RhdGUgKyA5MFxuICAgIH0sICdyb3RhdGVSaWdodCcpO1xuICB9O1xuICB2YXIgb25Sb3RhdGVMZWZ0ID0gZnVuY3Rpb24gb25Sb3RhdGVMZWZ0KCkge1xuICAgIHVwZGF0ZVRyYW5zZm9ybSh7XG4gICAgICByb3RhdGU6IHJvdGF0ZSAtIDkwXG4gICAgfSwgJ3JvdGF0ZUxlZnQnKTtcbiAgfTtcbiAgdmFyIG9uRmxpcFggPSBmdW5jdGlvbiBvbkZsaXBYKCkge1xuICAgIHVwZGF0ZVRyYW5zZm9ybSh7XG4gICAgICBmbGlwWDogIXRyYW5zZm9ybS5mbGlwWFxuICAgIH0sICdmbGlwWCcpO1xuICB9O1xuICB2YXIgb25GbGlwWSA9IGZ1bmN0aW9uIG9uRmxpcFkoKSB7XG4gICAgdXBkYXRlVHJhbnNmb3JtKHtcbiAgICAgIGZsaXBZOiAhdHJhbnNmb3JtLmZsaXBZXG4gICAgfSwgJ2ZsaXBZJyk7XG4gIH07XG4gIHZhciBvblJlc2V0ID0gZnVuY3Rpb24gb25SZXNldCgpIHtcbiAgICByZXNldFRyYW5zZm9ybSgncmVzZXQnKTtcbiAgfTtcbiAgdmFyIG9uQWN0aXZlID0gZnVuY3Rpb24gb25BY3RpdmUob2Zmc2V0KSB7XG4gICAgdmFyIHBvc2l0aW9uID0gY3VycmVudCArIG9mZnNldDtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIocG9zaXRpb24pIHx8IHBvc2l0aW9uIDwgMCB8fCBwb3NpdGlvbiA+IGNvdW50IC0gMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZXRFbmFibGVUcmFuc2l0aW9uKGZhbHNlKTtcbiAgICByZXNldFRyYW5zZm9ybShvZmZzZXQgPCAwID8gJ3ByZXYnIDogJ25leHQnKTtcbiAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwIHx8IG9uQ2hhbmdlKHBvc2l0aW9uLCBjdXJyZW50KTtcbiAgfTtcbiAgdmFyIG9uS2V5RG93biA9IGZ1bmN0aW9uIG9uS2V5RG93bihldmVudCkge1xuICAgIGlmICghdmlzaWJsZSB8fCAhc2hvd0xlZnRPclJpZ2h0U3dpdGNoZXMpIHJldHVybjtcbiAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gS2V5Q29kZS5MRUZUKSB7XG4gICAgICBvbkFjdGl2ZSgtMSk7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXlDb2RlID09PSBLZXlDb2RlLlJJR0hUKSB7XG4gICAgICBvbkFjdGl2ZSgxKTtcbiAgICB9XG4gIH07XG4gIHZhciBvbkRvdWJsZUNsaWNrID0gZnVuY3Rpb24gb25Eb3VibGVDbGljayhldmVudCkge1xuICAgIGlmICh2aXNpYmxlKSB7XG4gICAgICBpZiAoc2NhbGUgIT09IDEpIHtcbiAgICAgICAgdXBkYXRlVHJhbnNmb3JtKHtcbiAgICAgICAgICB4OiAwLFxuICAgICAgICAgIHk6IDAsXG4gICAgICAgICAgc2NhbGU6IDFcbiAgICAgICAgfSwgJ2RvdWJsZUNsaWNrJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkaXNwYXRjaFpvb21DaGFuZ2UoQkFTRV9TQ0FMRV9SQVRJTyArIHNjYWxlU3RlcCwgJ2RvdWJsZUNsaWNrJywgZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBvbktleURvd25MaXN0ZW5lciA9IGFkZEV2ZW50TGlzdGVuZXIod2luZG93LCAna2V5ZG93bicsIG9uS2V5RG93biwgZmFsc2UpO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBvbktleURvd25MaXN0ZW5lci5yZW1vdmUoKTtcbiAgICB9O1xuICB9LCBbdmlzaWJsZSwgc2hvd0xlZnRPclJpZ2h0U3dpdGNoZXMsIGN1cnJlbnRdKTtcbiAgdmFyIGltZ05vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQcmV2aWV3SW1hZ2UsIF9leHRlbmRzKHt9LCBpbWdDb21tb25Qcm9wcywge1xuICAgIHdpZHRoOiBwcm9wcy53aWR0aCxcbiAgICBoZWlnaHQ6IHByb3BzLmhlaWdodCxcbiAgICBpbWdSZWY6IGltZ1JlZixcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW1nXCIpLFxuICAgIGFsdDogYWx0LFxuICAgIHN0eWxlOiB7XG4gICAgICB0cmFuc2Zvcm06IFwidHJhbnNsYXRlM2QoXCIuY29uY2F0KHRyYW5zZm9ybS54LCBcInB4LCBcIikuY29uY2F0KHRyYW5zZm9ybS55LCBcInB4LCAwKSBzY2FsZTNkKFwiKS5jb25jYXQodHJhbnNmb3JtLmZsaXBYID8gJy0nIDogJycpLmNvbmNhdChzY2FsZSwgXCIsIFwiKS5jb25jYXQodHJhbnNmb3JtLmZsaXBZID8gJy0nIDogJycpLmNvbmNhdChzY2FsZSwgXCIsIDEpIHJvdGF0ZShcIikuY29uY2F0KHJvdGF0ZSwgXCJkZWcpXCIpLFxuICAgICAgdHJhbnNpdGlvbkR1cmF0aW9uOiAoIWVuYWJsZVRyYW5zaXRpb24gfHwgaXNUb3VjaGluZykgJiYgJzBzJ1xuICAgIH0sXG4gICAgZmFsbGJhY2s6IGZhbGxiYWNrLFxuICAgIHNyYzogc3JjLFxuICAgIG9uV2hlZWw6IG9uV2hlZWwsXG4gICAgb25Nb3VzZURvd246IG9uTW91c2VEb3duLFxuICAgIG9uRG91YmxlQ2xpY2s6IG9uRG91YmxlQ2xpY2ssXG4gICAgb25Ub3VjaFN0YXJ0OiBvblRvdWNoU3RhcnQsXG4gICAgb25Ub3VjaE1vdmU6IG9uVG91Y2hNb3ZlLFxuICAgIG9uVG91Y2hFbmQ6IG9uVG91Y2hFbmQsXG4gICAgb25Ub3VjaENhbmNlbDogb25Ub3VjaEVuZFxuICB9KSk7XG4gIHZhciBpbWFnZSA9IF9vYmplY3RTcHJlYWQoe1xuICAgIHVybDogc3JjLFxuICAgIGFsdDogYWx0XG4gIH0sIGltYWdlSW5mbyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRGlhbG9nLCBfZXh0ZW5kcyh7XG4gICAgdHJhbnNpdGlvbk5hbWU6IHRyYW5zaXRpb25OYW1lLFxuICAgIG1hc2tUcmFuc2l0aW9uTmFtZTogbWFza1RyYW5zaXRpb25OYW1lLFxuICAgIGNsb3NhYmxlOiBmYWxzZSxcbiAgICBrZXlib2FyZDogdHJ1ZSxcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBvbkNsb3NlOiBvbkNsb3NlLFxuICAgIHZpc2libGU6IHZpc2libGUsXG4gICAgY2xhc3NOYW1lczoge1xuICAgICAgd3JhcHBlcjogd3JhcENsYXNzTmFtZVxuICAgIH0sXG4gICAgcm9vdENsYXNzTmFtZTogcm9vdENsYXNzTmFtZSxcbiAgICBnZXRDb250YWluZXI6IGdldENvbnRhaW5lclxuICB9LCByZXN0UHJvcHMsIHtcbiAgICBhZnRlckNsb3NlOiBvbkFmdGVyQ2xvc2VcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW1nLXdyYXBwZXJcIilcbiAgfSwgaW1hZ2VSZW5kZXIgPyBpbWFnZVJlbmRlcihpbWdOb2RlLCBfb2JqZWN0U3ByZWFkKHtcbiAgICB0cmFuc2Zvcm06IHRyYW5zZm9ybSxcbiAgICBpbWFnZTogaW1hZ2VcbiAgfSwgZ3JvdXBDb250ZXh0ID8ge1xuICAgIGN1cnJlbnQ6IGN1cnJlbnRcbiAgfSA6IHt9KSkgOiBpbWdOb2RlKSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE9wZXJhdGlvbnMsIHtcbiAgICB2aXNpYmxlOiB2aXNpYmxlLFxuICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtLFxuICAgIG1hc2tUcmFuc2l0aW9uTmFtZTogbWFza1RyYW5zaXRpb25OYW1lLFxuICAgIGNsb3NlSWNvbjogY2xvc2VJY29uLFxuICAgIGdldENvbnRhaW5lcjogZ2V0Q29udGFpbmVyLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIHJvb3RDbGFzc05hbWU6IHJvb3RDbGFzc05hbWUsXG4gICAgaWNvbnM6IGljb25zLFxuICAgIGNvdW50UmVuZGVyOiBjb3VudFJlbmRlcixcbiAgICBzaG93U3dpdGNoOiBzaG93TGVmdE9yUmlnaHRTd2l0Y2hlcyxcbiAgICBzaG93UHJvZ3Jlc3M6IHNob3dPcGVyYXRpb25zUHJvZ3Jlc3MsXG4gICAgY3VycmVudDogY3VycmVudCxcbiAgICBjb3VudDogY291bnQsXG4gICAgc2NhbGU6IHNjYWxlLFxuICAgIG1pblNjYWxlOiBtaW5TY2FsZSxcbiAgICBtYXhTY2FsZTogbWF4U2NhbGUsXG4gICAgdG9vbGJhclJlbmRlcjogdG9vbGJhclJlbmRlcixcbiAgICBvbkFjdGl2ZTogb25BY3RpdmUsXG4gICAgb25ab29tSW46IG9uWm9vbUluLFxuICAgIG9uWm9vbU91dDogb25ab29tT3V0LFxuICAgIG9uUm90YXRlUmlnaHQ6IG9uUm90YXRlUmlnaHQsXG4gICAgb25Sb3RhdGVMZWZ0OiBvblJvdGF0ZUxlZnQsXG4gICAgb25GbGlwWDogb25GbGlwWCxcbiAgICBvbkZsaXBZOiBvbkZsaXBZLFxuICAgIG9uQ2xvc2U6IG9uQ2xvc2UsXG4gICAgb25SZXNldDogb25SZXNldCxcbiAgICB6SW5kZXg6IHJlc3RQcm9wcy56SW5kZXggIT09IHVuZGVmaW5lZCA/IHJlc3RQcm9wcy56SW5kZXggKyAxIDogdW5kZWZpbmVkLFxuICAgIGltYWdlOiBpbWFnZVxuICB9KSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgUHJldmlldzsiLCAiaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyV3JhcCh0YXJnZXQsIGV2ZW50VHlwZSwgY2IsIG9wdGlvbikge1xuICAvKiBlc2xpbnQgY2FtZWxjYXNlOiAyICovXG4gIHZhciBjYWxsYmFjayA9IFJlYWN0RE9NLnVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzID8gZnVuY3Rpb24gcnVuKGUpIHtcbiAgICBSZWFjdERPTS51bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyhjYiwgZSk7XG4gIH0gOiBjYjtcbiAgaWYgKHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCAmJiB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgY2FsbGJhY2ssIG9wdGlvbik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgICAgIGlmICh0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgJiYgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBjYWxsYmFjaywgb3B0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59IiwgImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IFBvcnRhbCBmcm9tICdAcmMtY29tcG9uZW50L3BvcnRhbCc7XG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBDU1NNb3Rpb24gZnJvbSAncmMtbW90aW9uJztcbmltcG9ydCBLZXlDb2RlIGZyb20gXCJyYy11dGlsL2VzL0tleUNvZGVcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBQcmV2aWV3R3JvdXBDb250ZXh0IH0gZnJvbSBcIi4vY29udGV4dFwiO1xudmFyIE9wZXJhdGlvbnMgPSBmdW5jdGlvbiBPcGVyYXRpb25zKHByb3BzKSB7XG4gIHZhciB2aXNpYmxlID0gcHJvcHMudmlzaWJsZSxcbiAgICBtYXNrVHJhbnNpdGlvbk5hbWUgPSBwcm9wcy5tYXNrVHJhbnNpdGlvbk5hbWUsXG4gICAgZ2V0Q29udGFpbmVyID0gcHJvcHMuZ2V0Q29udGFpbmVyLFxuICAgIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICByb290Q2xhc3NOYW1lID0gcHJvcHMucm9vdENsYXNzTmFtZSxcbiAgICBpY29ucyA9IHByb3BzLmljb25zLFxuICAgIGNvdW50UmVuZGVyID0gcHJvcHMuY291bnRSZW5kZXIsXG4gICAgc2hvd1N3aXRjaCA9IHByb3BzLnNob3dTd2l0Y2gsXG4gICAgc2hvd1Byb2dyZXNzID0gcHJvcHMuc2hvd1Byb2dyZXNzLFxuICAgIGN1cnJlbnQgPSBwcm9wcy5jdXJyZW50LFxuICAgIHRyYW5zZm9ybSA9IHByb3BzLnRyYW5zZm9ybSxcbiAgICBjb3VudCA9IHByb3BzLmNvdW50LFxuICAgIHNjYWxlID0gcHJvcHMuc2NhbGUsXG4gICAgbWluU2NhbGUgPSBwcm9wcy5taW5TY2FsZSxcbiAgICBtYXhTY2FsZSA9IHByb3BzLm1heFNjYWxlLFxuICAgIGNsb3NlSWNvbiA9IHByb3BzLmNsb3NlSWNvbixcbiAgICBvbkFjdGl2ZSA9IHByb3BzLm9uQWN0aXZlLFxuICAgIG9uQ2xvc2UgPSBwcm9wcy5vbkNsb3NlLFxuICAgIG9uWm9vbUluID0gcHJvcHMub25ab29tSW4sXG4gICAgb25ab29tT3V0ID0gcHJvcHMub25ab29tT3V0LFxuICAgIG9uUm90YXRlUmlnaHQgPSBwcm9wcy5vblJvdGF0ZVJpZ2h0LFxuICAgIG9uUm90YXRlTGVmdCA9IHByb3BzLm9uUm90YXRlTGVmdCxcbiAgICBvbkZsaXBYID0gcHJvcHMub25GbGlwWCxcbiAgICBvbkZsaXBZID0gcHJvcHMub25GbGlwWSxcbiAgICBvblJlc2V0ID0gcHJvcHMub25SZXNldCxcbiAgICB0b29sYmFyUmVuZGVyID0gcHJvcHMudG9vbGJhclJlbmRlcixcbiAgICB6SW5kZXggPSBwcm9wcy56SW5kZXgsXG4gICAgaW1hZ2UgPSBwcm9wcy5pbWFnZTtcbiAgdmFyIGdyb3VwQ29udGV4dCA9IHVzZUNvbnRleHQoUHJldmlld0dyb3VwQ29udGV4dCk7XG4gIHZhciByb3RhdGVMZWZ0ID0gaWNvbnMucm90YXRlTGVmdCxcbiAgICByb3RhdGVSaWdodCA9IGljb25zLnJvdGF0ZVJpZ2h0LFxuICAgIHpvb21JbiA9IGljb25zLnpvb21JbixcbiAgICB6b29tT3V0ID0gaWNvbnMuem9vbU91dCxcbiAgICBjbG9zZSA9IGljb25zLmNsb3NlLFxuICAgIGxlZnQgPSBpY29ucy5sZWZ0LFxuICAgIHJpZ2h0ID0gaWNvbnMucmlnaHQsXG4gICAgZmxpcFggPSBpY29ucy5mbGlwWCxcbiAgICBmbGlwWSA9IGljb25zLmZsaXBZO1xuICB2YXIgdG9vbENsYXNzTmFtZSA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItb3BlcmF0aW9ucy1vcGVyYXRpb25cIik7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG9uS2V5RG93biA9IGZ1bmN0aW9uIG9uS2V5RG93bihlKSB7XG4gICAgICBpZiAoZS5rZXlDb2RlID09PSBLZXlDb2RlLkVTQykge1xuICAgICAgICBvbkNsb3NlKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAodmlzaWJsZSkge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvbktleURvd24pO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvbktleURvd24pO1xuICAgIH07XG4gIH0sIFt2aXNpYmxlXSk7XG4gIHZhciBoYW5kbGVBY3RpdmUgPSBmdW5jdGlvbiBoYW5kbGVBY3RpdmUoZSwgb2Zmc2V0KSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgb25BY3RpdmUob2Zmc2V0KTtcbiAgfTtcbiAgdmFyIHJlbmRlck9wZXJhdGlvbiA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgdmFyIHR5cGUgPSBfcmVmLnR5cGUsXG4gICAgICBkaXNhYmxlZCA9IF9yZWYuZGlzYWJsZWQsXG4gICAgICBvbkNsaWNrID0gX3JlZi5vbkNsaWNrLFxuICAgICAgaWNvbiA9IF9yZWYuaWNvbjtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAga2V5OiB0eXBlLFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc25hbWVzKHRvb2xDbGFzc05hbWUsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItb3BlcmF0aW9ucy1vcGVyYXRpb24tXCIpLmNvbmNhdCh0eXBlKSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW9wZXJhdGlvbnMtb3BlcmF0aW9uLWRpc2FibGVkXCIpLCAhIWRpc2FibGVkKSksXG4gICAgICBvbkNsaWNrOiBvbkNsaWNrXG4gICAgfSwgaWNvbik7XG4gIH0sIFt0b29sQ2xhc3NOYW1lLCBwcmVmaXhDbHNdKTtcbiAgdmFyIHN3aXRjaFByZXZOb2RlID0gc2hvd1N3aXRjaCA/IHJlbmRlck9wZXJhdGlvbih7XG4gICAgaWNvbjogbGVmdCxcbiAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKGUpIHtcbiAgICAgIHJldHVybiBoYW5kbGVBY3RpdmUoZSwgLTEpO1xuICAgIH0sXG4gICAgdHlwZTogJ3ByZXYnLFxuICAgIGRpc2FibGVkOiBjdXJyZW50ID09PSAwXG4gIH0pIDogdW5kZWZpbmVkO1xuICB2YXIgc3dpdGNoTmV4dE5vZGUgPSBzaG93U3dpdGNoID8gcmVuZGVyT3BlcmF0aW9uKHtcbiAgICBpY29uOiByaWdodCxcbiAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKGUpIHtcbiAgICAgIHJldHVybiBoYW5kbGVBY3RpdmUoZSwgMSk7XG4gICAgfSxcbiAgICB0eXBlOiAnbmV4dCcsXG4gICAgZGlzYWJsZWQ6IGN1cnJlbnQgPT09IGNvdW50IC0gMVxuICB9KSA6IHVuZGVmaW5lZDtcbiAgdmFyIGZsaXBZTm9kZSA9IHJlbmRlck9wZXJhdGlvbih7XG4gICAgaWNvbjogZmxpcFksXG4gICAgb25DbGljazogb25GbGlwWSxcbiAgICB0eXBlOiAnZmxpcFknXG4gIH0pO1xuICB2YXIgZmxpcFhOb2RlID0gcmVuZGVyT3BlcmF0aW9uKHtcbiAgICBpY29uOiBmbGlwWCxcbiAgICBvbkNsaWNrOiBvbkZsaXBYLFxuICAgIHR5cGU6ICdmbGlwWCdcbiAgfSk7XG4gIHZhciByb3RhdGVMZWZ0Tm9kZSA9IHJlbmRlck9wZXJhdGlvbih7XG4gICAgaWNvbjogcm90YXRlTGVmdCxcbiAgICBvbkNsaWNrOiBvblJvdGF0ZUxlZnQsXG4gICAgdHlwZTogJ3JvdGF0ZUxlZnQnXG4gIH0pO1xuICB2YXIgcm90YXRlUmlnaHROb2RlID0gcmVuZGVyT3BlcmF0aW9uKHtcbiAgICBpY29uOiByb3RhdGVSaWdodCxcbiAgICBvbkNsaWNrOiBvblJvdGF0ZVJpZ2h0LFxuICAgIHR5cGU6ICdyb3RhdGVSaWdodCdcbiAgfSk7XG4gIHZhciB6b29tT3V0Tm9kZSA9IHJlbmRlck9wZXJhdGlvbih7XG4gICAgaWNvbjogem9vbU91dCxcbiAgICBvbkNsaWNrOiBvblpvb21PdXQsXG4gICAgdHlwZTogJ3pvb21PdXQnLFxuICAgIGRpc2FibGVkOiBzY2FsZSA8PSBtaW5TY2FsZVxuICB9KTtcbiAgdmFyIHpvb21Jbk5vZGUgPSByZW5kZXJPcGVyYXRpb24oe1xuICAgIGljb246IHpvb21JbixcbiAgICBvbkNsaWNrOiBvblpvb21JbixcbiAgICB0eXBlOiAnem9vbUluJyxcbiAgICBkaXNhYmxlZDogc2NhbGUgPT09IG1heFNjYWxlXG4gIH0pO1xuICB2YXIgdG9vbGJhck5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW9wZXJhdGlvbnNcIilcbiAgfSwgZmxpcFlOb2RlLCBmbGlwWE5vZGUsIHJvdGF0ZUxlZnROb2RlLCByb3RhdGVSaWdodE5vZGUsIHpvb21PdXROb2RlLCB6b29tSW5Ob2RlKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENTU01vdGlvbiwge1xuICAgIHZpc2libGU6IHZpc2libGUsXG4gICAgbW90aW9uTmFtZTogbWFza1RyYW5zaXRpb25OYW1lXG4gIH0sIGZ1bmN0aW9uIChfcmVmMikge1xuICAgIHZhciBjbGFzc05hbWUgPSBfcmVmMi5jbGFzc05hbWUsXG4gICAgICBzdHlsZSA9IF9yZWYyLnN0eWxlO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQb3J0YWwsIHtcbiAgICAgIG9wZW46IHRydWUsXG4gICAgICBnZXRDb250YWluZXI6IGdldENvbnRhaW5lciAhPT0gbnVsbCAmJiBnZXRDb250YWluZXIgIT09IHZvaWQgMCA/IGdldENvbnRhaW5lciA6IGRvY3VtZW50LmJvZHlcbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzbmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1vcGVyYXRpb25zLXdyYXBwZXJcIiksIGNsYXNzTmFtZSwgcm9vdENsYXNzTmFtZSksXG4gICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICAgIHpJbmRleDogekluZGV4XG4gICAgICB9KVxuICAgIH0sIGNsb3NlSWNvbiA9PT0gbnVsbCA/IG51bGwgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2xvc2VcIiksXG4gICAgICBvbkNsaWNrOiBvbkNsb3NlXG4gICAgfSwgY2xvc2VJY29uIHx8IGNsb3NlKSwgc2hvd1N3aXRjaCAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc25hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3dpdGNoLWxlZnRcIiksIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zd2l0Y2gtbGVmdC1kaXNhYmxlZFwiKSwgY3VycmVudCA9PT0gMCkpLFxuICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljayhlKSB7XG4gICAgICAgIHJldHVybiBoYW5kbGVBY3RpdmUoZSwgLTEpO1xuICAgICAgfVxuICAgIH0sIGxlZnQpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzbmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zd2l0Y2gtcmlnaHRcIiksIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zd2l0Y2gtcmlnaHQtZGlzYWJsZWRcIiksIGN1cnJlbnQgPT09IGNvdW50IC0gMSkpLFxuICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljayhlKSB7XG4gICAgICAgIHJldHVybiBoYW5kbGVBY3RpdmUoZSwgMSk7XG4gICAgICB9XG4gICAgfSwgcmlnaHQpKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWZvb3RlclwiKVxuICAgIH0sIHNob3dQcm9ncmVzcyAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcHJvZ3Jlc3NcIilcbiAgICB9LCBjb3VudFJlbmRlciA/IGNvdW50UmVuZGVyKGN1cnJlbnQgKyAxLCBjb3VudCkgOiBcIlwiLmNvbmNhdChjdXJyZW50ICsgMSwgXCIgLyBcIikuY29uY2F0KGNvdW50KSksIHRvb2xiYXJSZW5kZXIgPyB0b29sYmFyUmVuZGVyKHRvb2xiYXJOb2RlLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe1xuICAgICAgaWNvbnM6IHtcbiAgICAgICAgcHJldkljb246IHN3aXRjaFByZXZOb2RlLFxuICAgICAgICBuZXh0SWNvbjogc3dpdGNoTmV4dE5vZGUsXG4gICAgICAgIGZsaXBZSWNvbjogZmxpcFlOb2RlLFxuICAgICAgICBmbGlwWEljb246IGZsaXBYTm9kZSxcbiAgICAgICAgcm90YXRlTGVmdEljb246IHJvdGF0ZUxlZnROb2RlLFxuICAgICAgICByb3RhdGVSaWdodEljb246IHJvdGF0ZVJpZ2h0Tm9kZSxcbiAgICAgICAgem9vbU91dEljb246IHpvb21PdXROb2RlLFxuICAgICAgICB6b29tSW5JY29uOiB6b29tSW5Ob2RlXG4gICAgICB9LFxuICAgICAgYWN0aW9uczoge1xuICAgICAgICBvbkFjdGl2ZTogb25BY3RpdmUsXG4gICAgICAgIG9uRmxpcFk6IG9uRmxpcFksXG4gICAgICAgIG9uRmxpcFg6IG9uRmxpcFgsXG4gICAgICAgIG9uUm90YXRlTGVmdDogb25Sb3RhdGVMZWZ0LFxuICAgICAgICBvblJvdGF0ZVJpZ2h0OiBvblJvdGF0ZVJpZ2h0LFxuICAgICAgICBvblpvb21PdXQ6IG9uWm9vbU91dCxcbiAgICAgICAgb25ab29tSW46IG9uWm9vbUluLFxuICAgICAgICBvblJlc2V0OiBvblJlc2V0LFxuICAgICAgICBvbkNsb3NlOiBvbkNsb3NlXG4gICAgICB9LFxuICAgICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm1cbiAgICB9LCBncm91cENvbnRleHQgPyB7XG4gICAgICBjdXJyZW50OiBjdXJyZW50LFxuICAgICAgdG90YWw6IGNvdW50XG4gICAgfSA6IHt9KSwge30sIHtcbiAgICAgIGltYWdlOiBpbWFnZVxuICAgIH0pKSA6IHRvb2xiYXJOb2RlKSkpO1xuICB9KTtcbn07XG5leHBvcnQgZGVmYXVsdCBPcGVyYXRpb25zOyIsICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5leHBvcnQgdmFyIFByZXZpZXdHcm91cENvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTsiLCAiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IHsgZ2V0Q2xpZW50U2l6ZSB9IGZyb20gXCJyYy11dGlsL2VzL0RvbS9jc3NcIjtcbmltcG9ydCBpc0VxdWFsIGZyb20gXCJyYy11dGlsL2VzL2lzRXF1YWxcIjtcbmltcG9ydCByYWYgZnJvbSBcInJjLXV0aWwvZXMvcmFmXCI7XG5pbXBvcnQgeyB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xudmFyIGluaXRpYWxUcmFuc2Zvcm0gPSB7XG4gIHg6IDAsXG4gIHk6IDAsXG4gIHJvdGF0ZTogMCxcbiAgc2NhbGU6IDEsXG4gIGZsaXBYOiBmYWxzZSxcbiAgZmxpcFk6IGZhbHNlXG59O1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlSW1hZ2VUcmFuc2Zvcm0oaW1nUmVmLCBtaW5TY2FsZSwgbWF4U2NhbGUsIG9uVHJhbnNmb3JtKSB7XG4gIHZhciBmcmFtZSA9IHVzZVJlZihudWxsKTtcbiAgdmFyIHF1ZXVlID0gdXNlUmVmKFtdKTtcbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKGluaXRpYWxUcmFuc2Zvcm0pLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIHRyYW5zZm9ybSA9IF91c2VTdGF0ZTJbMF0sXG4gICAgc2V0VHJhbnNmb3JtID0gX3VzZVN0YXRlMlsxXTtcbiAgdmFyIHJlc2V0VHJhbnNmb3JtID0gZnVuY3Rpb24gcmVzZXRUcmFuc2Zvcm0oYWN0aW9uKSB7XG4gICAgc2V0VHJhbnNmb3JtKGluaXRpYWxUcmFuc2Zvcm0pO1xuICAgIGlmICghaXNFcXVhbChpbml0aWFsVHJhbnNmb3JtLCB0cmFuc2Zvcm0pKSB7XG4gICAgICBvblRyYW5zZm9ybSA9PT0gbnVsbCB8fCBvblRyYW5zZm9ybSA9PT0gdm9pZCAwIHx8IG9uVHJhbnNmb3JtKHtcbiAgICAgICAgdHJhbnNmb3JtOiBpbml0aWFsVHJhbnNmb3JtLFxuICAgICAgICBhY3Rpb246IGFjdGlvblxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKiBEaXJlY3QgdXBkYXRlIHRyYW5zZm9ybSAqL1xuICB2YXIgdXBkYXRlVHJhbnNmb3JtID0gZnVuY3Rpb24gdXBkYXRlVHJhbnNmb3JtKG5ld1RyYW5zZm9ybSwgYWN0aW9uKSB7XG4gICAgaWYgKGZyYW1lLmN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIHF1ZXVlLmN1cnJlbnQgPSBbXTtcbiAgICAgIGZyYW1lLmN1cnJlbnQgPSByYWYoZnVuY3Rpb24gKCkge1xuICAgICAgICBzZXRUcmFuc2Zvcm0oZnVuY3Rpb24gKHByZVN0YXRlKSB7XG4gICAgICAgICAgdmFyIG1lbW9TdGF0ZSA9IHByZVN0YXRlO1xuICAgICAgICAgIHF1ZXVlLmN1cnJlbnQuZm9yRWFjaChmdW5jdGlvbiAocXVldWVTdGF0ZSkge1xuICAgICAgICAgICAgbWVtb1N0YXRlID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBtZW1vU3RhdGUpLCBxdWV1ZVN0YXRlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBmcmFtZS5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgICBvblRyYW5zZm9ybSA9PT0gbnVsbCB8fCBvblRyYW5zZm9ybSA9PT0gdm9pZCAwIHx8IG9uVHJhbnNmb3JtKHtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogbWVtb1N0YXRlLFxuICAgICAgICAgICAgYWN0aW9uOiBhY3Rpb25cbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gbWVtb1N0YXRlO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBxdWV1ZS5jdXJyZW50LnB1c2goX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB0cmFuc2Zvcm0pLCBuZXdUcmFuc2Zvcm0pKTtcbiAgfTtcblxuICAvKiogU2NhbGUgYWNjb3JkaW5nIHRvIHRoZSBwb3NpdGlvbiBvZiBjZW50ZXJYIGFuZCBjZW50ZXJZICovXG4gIHZhciBkaXNwYXRjaFpvb21DaGFuZ2UgPSBmdW5jdGlvbiBkaXNwYXRjaFpvb21DaGFuZ2UocmF0aW8sIGFjdGlvbiwgY2VudGVyWCwgY2VudGVyWSwgaXNUb3VjaCkge1xuICAgIHZhciBfaW1nUmVmJGN1cnJlbnQgPSBpbWdSZWYuY3VycmVudCxcbiAgICAgIHdpZHRoID0gX2ltZ1JlZiRjdXJyZW50LndpZHRoLFxuICAgICAgaGVpZ2h0ID0gX2ltZ1JlZiRjdXJyZW50LmhlaWdodCxcbiAgICAgIG9mZnNldFdpZHRoID0gX2ltZ1JlZiRjdXJyZW50Lm9mZnNldFdpZHRoLFxuICAgICAgb2Zmc2V0SGVpZ2h0ID0gX2ltZ1JlZiRjdXJyZW50Lm9mZnNldEhlaWdodCxcbiAgICAgIG9mZnNldExlZnQgPSBfaW1nUmVmJGN1cnJlbnQub2Zmc2V0TGVmdCxcbiAgICAgIG9mZnNldFRvcCA9IF9pbWdSZWYkY3VycmVudC5vZmZzZXRUb3A7XG4gICAgdmFyIG5ld1JhdGlvID0gcmF0aW87XG4gICAgdmFyIG5ld1NjYWxlID0gdHJhbnNmb3JtLnNjYWxlICogcmF0aW87XG4gICAgaWYgKG5ld1NjYWxlID4gbWF4U2NhbGUpIHtcbiAgICAgIG5ld1NjYWxlID0gbWF4U2NhbGU7XG4gICAgICBuZXdSYXRpbyA9IG1heFNjYWxlIC8gdHJhbnNmb3JtLnNjYWxlO1xuICAgIH0gZWxzZSBpZiAobmV3U2NhbGUgPCBtaW5TY2FsZSkge1xuICAgICAgLy8gRm9yIG1vYmlsZSBpbnRlcmFjdGlvbnMsIGFsbG93IHNjYWxpbmcgZG93biB0byB0aGUgbWluaW11bSBzY2FsZS5cbiAgICAgIG5ld1NjYWxlID0gaXNUb3VjaCA/IG5ld1NjYWxlIDogbWluU2NhbGU7XG4gICAgICBuZXdSYXRpbyA9IG5ld1NjYWxlIC8gdHJhbnNmb3JtLnNjYWxlO1xuICAgIH1cblxuICAgIC8qKiBEZWZhdWx0IGNlbnRlciBwb2ludCBzY2FsaW5nICovXG4gICAgdmFyIG1lcmdlZENlbnRlclggPSBjZW50ZXJYICE9PSBudWxsICYmIGNlbnRlclggIT09IHZvaWQgMCA/IGNlbnRlclggOiBpbm5lcldpZHRoIC8gMjtcbiAgICB2YXIgbWVyZ2VkQ2VudGVyWSA9IGNlbnRlclkgIT09IG51bGwgJiYgY2VudGVyWSAhPT0gdm9pZCAwID8gY2VudGVyWSA6IGlubmVySGVpZ2h0IC8gMjtcbiAgICB2YXIgZGlmZlJhdGlvID0gbmV3UmF0aW8gLSAxO1xuICAgIC8qKiBEZXZpYXRpb24gY2FsY3VsYXRlZCBmcm9tIGltYWdlIHNpemUgKi9cbiAgICB2YXIgZGlmZkltZ1ggPSBkaWZmUmF0aW8gKiB3aWR0aCAqIDAuNTtcbiAgICB2YXIgZGlmZkltZ1kgPSBkaWZmUmF0aW8gKiBoZWlnaHQgKiAwLjU7XG4gICAgLyoqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGNsaWNrIHBvc2l0aW9uIGFuZCB0aGUgZWRnZSBvZiB0aGUgZG9jdW1lbnQgKi9cbiAgICB2YXIgZGlmZk9mZnNldExlZnQgPSBkaWZmUmF0aW8gKiAobWVyZ2VkQ2VudGVyWCAtIHRyYW5zZm9ybS54IC0gb2Zmc2V0TGVmdCk7XG4gICAgdmFyIGRpZmZPZmZzZXRUb3AgPSBkaWZmUmF0aW8gKiAobWVyZ2VkQ2VudGVyWSAtIHRyYW5zZm9ybS55IC0gb2Zmc2V0VG9wKTtcbiAgICAvKiogRmluYWwgcG9zaXRpb25pbmcgKi9cbiAgICB2YXIgbmV3WCA9IHRyYW5zZm9ybS54IC0gKGRpZmZPZmZzZXRMZWZ0IC0gZGlmZkltZ1gpO1xuICAgIHZhciBuZXdZID0gdHJhbnNmb3JtLnkgLSAoZGlmZk9mZnNldFRvcCAtIGRpZmZJbWdZKTtcblxuICAgIC8qKlxuICAgICAqIFdoZW4gem9vbWluZyB0aGUgaW1hZ2VcbiAgICAgKiBXaGVuIHRoZSBpbWFnZSBzaXplIGlzIHNtYWxsZXIgdGhhbiB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgd2luZG93LCB0aGUgcG9zaXRpb24gaXMgaW5pdGlhbGl6ZWRcbiAgICAgKi9cbiAgICBpZiAocmF0aW8gPCAxICYmIG5ld1NjYWxlID09PSAxKSB7XG4gICAgICB2YXIgbWVyZ2VkV2lkdGggPSBvZmZzZXRXaWR0aCAqIG5ld1NjYWxlO1xuICAgICAgdmFyIG1lcmdlZEhlaWdodCA9IG9mZnNldEhlaWdodCAqIG5ld1NjYWxlO1xuICAgICAgdmFyIF9nZXRDbGllbnRTaXplID0gZ2V0Q2xpZW50U2l6ZSgpLFxuICAgICAgICBjbGllbnRXaWR0aCA9IF9nZXRDbGllbnRTaXplLndpZHRoLFxuICAgICAgICBjbGllbnRIZWlnaHQgPSBfZ2V0Q2xpZW50U2l6ZS5oZWlnaHQ7XG4gICAgICBpZiAobWVyZ2VkV2lkdGggPD0gY2xpZW50V2lkdGggJiYgbWVyZ2VkSGVpZ2h0IDw9IGNsaWVudEhlaWdodCkge1xuICAgICAgICBuZXdYID0gMDtcbiAgICAgICAgbmV3WSA9IDA7XG4gICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZVRyYW5zZm9ybSh7XG4gICAgICB4OiBuZXdYLFxuICAgICAgeTogbmV3WSxcbiAgICAgIHNjYWxlOiBuZXdTY2FsZVxuICAgIH0sIGFjdGlvbik7XG4gIH07XG4gIHJldHVybiB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm0sXG4gICAgcmVzZXRUcmFuc2Zvcm06IHJlc2V0VHJhbnNmb3JtLFxuICAgIHVwZGF0ZVRyYW5zZm9ybTogdXBkYXRlVHJhbnNmb3JtLFxuICAgIGRpc3BhdGNoWm9vbUNoYW5nZTogZGlzcGF0Y2hab29tQ2hhbmdlXG4gIH07XG59IiwgImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBhZGRFdmVudExpc3RlbmVyIGZyb20gXCJyYy11dGlsL2VzL0RvbS9hZGRFdmVudExpc3RlbmVyXCI7XG5pbXBvcnQgeyB3YXJuaW5nIH0gZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGdldEZpeFNjYWxlRWxlVHJhbnNQb3NpdGlvbiBmcm9tIFwiLi4vZ2V0Rml4U2NhbGVFbGVUcmFuc1Bvc2l0aW9uXCI7XG5pbXBvcnQgeyBCQVNFX1NDQUxFX1JBVElPLCBXSEVFTF9NQVhfU0NBTEVfUkFUSU8gfSBmcm9tIFwiLi4vcHJldmlld0NvbmZpZ1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlTW91c2VFdmVudChpbWdSZWYsIG1vdmFibGUsIHZpc2libGUsIHNjYWxlU3RlcCwgdHJhbnNmb3JtLCB1cGRhdGVUcmFuc2Zvcm0sIGRpc3BhdGNoWm9vbUNoYW5nZSkge1xuICB2YXIgcm90YXRlID0gdHJhbnNmb3JtLnJvdGF0ZSxcbiAgICBzY2FsZSA9IHRyYW5zZm9ybS5zY2FsZSxcbiAgICB4ID0gdHJhbnNmb3JtLngsXG4gICAgeSA9IHRyYW5zZm9ybS55O1xuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUoZmFsc2UpLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIGlzTW92aW5nID0gX3VzZVN0YXRlMlswXSxcbiAgICBzZXRNb3ZpbmcgPSBfdXNlU3RhdGUyWzFdO1xuICB2YXIgc3RhcnRQb3NpdGlvbkluZm8gPSB1c2VSZWYoe1xuICAgIGRpZmZYOiAwLFxuICAgIGRpZmZZOiAwLFxuICAgIHRyYW5zZm9ybVg6IDAsXG4gICAgdHJhbnNmb3JtWTogMFxuICB9KTtcbiAgdmFyIG9uTW91c2VEb3duID0gZnVuY3Rpb24gb25Nb3VzZURvd24oZXZlbnQpIHtcbiAgICAvLyBPbmx5IGFsbG93IG1haW4gYnV0dG9uXG4gICAgaWYgKCFtb3ZhYmxlIHx8IGV2ZW50LmJ1dHRvbiAhPT0gMCkgcmV0dXJuO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgc3RhcnRQb3NpdGlvbkluZm8uY3VycmVudCA9IHtcbiAgICAgIGRpZmZYOiBldmVudC5wYWdlWCAtIHgsXG4gICAgICBkaWZmWTogZXZlbnQucGFnZVkgLSB5LFxuICAgICAgdHJhbnNmb3JtWDogeCxcbiAgICAgIHRyYW5zZm9ybVk6IHlcbiAgICB9O1xuICAgIHNldE1vdmluZyh0cnVlKTtcbiAgfTtcbiAgdmFyIG9uTW91c2VNb3ZlID0gZnVuY3Rpb24gb25Nb3VzZU1vdmUoZXZlbnQpIHtcbiAgICBpZiAodmlzaWJsZSAmJiBpc01vdmluZykge1xuICAgICAgdXBkYXRlVHJhbnNmb3JtKHtcbiAgICAgICAgeDogZXZlbnQucGFnZVggLSBzdGFydFBvc2l0aW9uSW5mby5jdXJyZW50LmRpZmZYLFxuICAgICAgICB5OiBldmVudC5wYWdlWSAtIHN0YXJ0UG9zaXRpb25JbmZvLmN1cnJlbnQuZGlmZllcbiAgICAgIH0sICdtb3ZlJyk7XG4gICAgfVxuICB9O1xuICB2YXIgb25Nb3VzZVVwID0gZnVuY3Rpb24gb25Nb3VzZVVwKCkge1xuICAgIGlmICh2aXNpYmxlICYmIGlzTW92aW5nKSB7XG4gICAgICBzZXRNb3ZpbmcoZmFsc2UpO1xuXG4gICAgICAvKiogTm8gbmVlZCB0byByZXN0b3JlIHRoZSBwb3NpdGlvbiB3aGVuIHRoZSBwaWN0dXJlIGlzIG5vdCBtb3ZlZCwgU28gYXMgbm90IHRvIGludGVyZmVyZSB3aXRoIHRoZSBjbGljayAqL1xuICAgICAgdmFyIF9zdGFydFBvc2l0aW9uSW5mbyRjdSA9IHN0YXJ0UG9zaXRpb25JbmZvLmN1cnJlbnQsXG4gICAgICAgIHRyYW5zZm9ybVggPSBfc3RhcnRQb3NpdGlvbkluZm8kY3UudHJhbnNmb3JtWCxcbiAgICAgICAgdHJhbnNmb3JtWSA9IF9zdGFydFBvc2l0aW9uSW5mbyRjdS50cmFuc2Zvcm1ZO1xuICAgICAgdmFyIGhhc0NoYW5nZWRQb3NpdGlvbiA9IHggIT09IHRyYW5zZm9ybVggJiYgeSAhPT0gdHJhbnNmb3JtWTtcbiAgICAgIGlmICghaGFzQ2hhbmdlZFBvc2l0aW9uKSByZXR1cm47XG4gICAgICB2YXIgd2lkdGggPSBpbWdSZWYuY3VycmVudC5vZmZzZXRXaWR0aCAqIHNjYWxlO1xuICAgICAgdmFyIGhlaWdodCA9IGltZ1JlZi5jdXJyZW50Lm9mZnNldEhlaWdodCAqIHNjYWxlO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1zaGFkb3dcbiAgICAgIHZhciBfaW1nUmVmJGN1cnJlbnQkZ2V0Qm8gPSBpbWdSZWYuY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgbGVmdCA9IF9pbWdSZWYkY3VycmVudCRnZXRCby5sZWZ0LFxuICAgICAgICB0b3AgPSBfaW1nUmVmJGN1cnJlbnQkZ2V0Qm8udG9wO1xuICAgICAgdmFyIGlzUm90YXRlID0gcm90YXRlICUgMTgwICE9PSAwO1xuICAgICAgdmFyIGZpeFN0YXRlID0gZ2V0Rml4U2NhbGVFbGVUcmFuc1Bvc2l0aW9uKGlzUm90YXRlID8gaGVpZ2h0IDogd2lkdGgsIGlzUm90YXRlID8gd2lkdGggOiBoZWlnaHQsIGxlZnQsIHRvcCk7XG4gICAgICBpZiAoZml4U3RhdGUpIHtcbiAgICAgICAgdXBkYXRlVHJhbnNmb3JtKF9vYmplY3RTcHJlYWQoe30sIGZpeFN0YXRlKSwgJ2RyYWdSZWJvdW5kJyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICB2YXIgb25XaGVlbCA9IGZ1bmN0aW9uIG9uV2hlZWwoZXZlbnQpIHtcbiAgICBpZiAoIXZpc2libGUgfHwgZXZlbnQuZGVsdGFZID09IDApIHJldHVybjtcbiAgICAvLyBTY2FsZSByYXRpbyBkZXBlbmRzIG9uIHRoZSBkZWx0YVkgc2l6ZVxuICAgIHZhciBzY2FsZVJhdGlvID0gTWF0aC5hYnMoZXZlbnQuZGVsdGFZIC8gMTAwKTtcbiAgICAvLyBMaW1pdCB0aGUgbWF4aW11bSBzY2FsZSByYXRpb1xuICAgIHZhciBtZXJnZWRTY2FsZVJhdGlvID0gTWF0aC5taW4oc2NhbGVSYXRpbywgV0hFRUxfTUFYX1NDQUxFX1JBVElPKTtcbiAgICAvLyBTY2FsZSB0aGUgcmF0aW8gZWFjaCB0aW1lXG4gICAgdmFyIHJhdGlvID0gQkFTRV9TQ0FMRV9SQVRJTyArIG1lcmdlZFNjYWxlUmF0aW8gKiBzY2FsZVN0ZXA7XG4gICAgaWYgKGV2ZW50LmRlbHRhWSA+IDApIHtcbiAgICAgIHJhdGlvID0gQkFTRV9TQ0FMRV9SQVRJTyAvIHJhdGlvO1xuICAgIH1cbiAgICBkaXNwYXRjaFpvb21DaGFuZ2UocmF0aW8sICd3aGVlbCcsIGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpO1xuICB9O1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBvblRvcE1vdXNlVXBMaXN0ZW5lcjtcbiAgICB2YXIgb25Ub3BNb3VzZU1vdmVMaXN0ZW5lcjtcbiAgICB2YXIgb25Nb3VzZVVwTGlzdGVuZXI7XG4gICAgdmFyIG9uTW91c2VNb3ZlTGlzdGVuZXI7XG4gICAgaWYgKG1vdmFibGUpIHtcbiAgICAgIG9uTW91c2VVcExpc3RlbmVyID0gYWRkRXZlbnRMaXN0ZW5lcih3aW5kb3csICdtb3VzZXVwJywgb25Nb3VzZVVwLCBmYWxzZSk7XG4gICAgICBvbk1vdXNlTW92ZUxpc3RlbmVyID0gYWRkRXZlbnRMaXN0ZW5lcih3aW5kb3csICdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSwgZmFsc2UpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gUmVzb2x2ZSBpZiBpbiBpZnJhbWUgbG9zdCBldmVudFxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICBpZiAod2luZG93LnRvcCAhPT0gd2luZG93LnNlbGYpIHtcbiAgICAgICAgICBvblRvcE1vdXNlVXBMaXN0ZW5lciA9IGFkZEV2ZW50TGlzdGVuZXIod2luZG93LnRvcCwgJ21vdXNldXAnLCBvbk1vdXNlVXAsIGZhbHNlKTtcbiAgICAgICAgICBvblRvcE1vdXNlTW92ZUxpc3RlbmVyID0gYWRkRXZlbnRMaXN0ZW5lcih3aW5kb3cudG9wLCAnbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgd2FybmluZyhmYWxzZSwgXCJbcmMtaW1hZ2VdIFwiLmNvbmNhdChlcnJvcikpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9vbk1vdXNlVXBMaXN0ZW5lciwgX29uTW91c2VNb3ZlTGlzdGVuZXIsIF9vblRvcE1vdXNlVXBMaXN0ZW5lciwgX29uVG9wTW91c2VNb3ZlTGlzdGVuO1xuICAgICAgKF9vbk1vdXNlVXBMaXN0ZW5lciA9IG9uTW91c2VVcExpc3RlbmVyKSA9PT0gbnVsbCB8fCBfb25Nb3VzZVVwTGlzdGVuZXIgPT09IHZvaWQgMCB8fCBfb25Nb3VzZVVwTGlzdGVuZXIucmVtb3ZlKCk7XG4gICAgICAoX29uTW91c2VNb3ZlTGlzdGVuZXIgPSBvbk1vdXNlTW92ZUxpc3RlbmVyKSA9PT0gbnVsbCB8fCBfb25Nb3VzZU1vdmVMaXN0ZW5lciA9PT0gdm9pZCAwIHx8IF9vbk1vdXNlTW92ZUxpc3RlbmVyLnJlbW92ZSgpO1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIChfb25Ub3BNb3VzZVVwTGlzdGVuZXIgPSBvblRvcE1vdXNlVXBMaXN0ZW5lcikgPT09IG51bGwgfHwgX29uVG9wTW91c2VVcExpc3RlbmVyID09PSB2b2lkIDAgfHwgX29uVG9wTW91c2VVcExpc3RlbmVyLnJlbW92ZSgpO1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIChfb25Ub3BNb3VzZU1vdmVMaXN0ZW4gPSBvblRvcE1vdXNlTW92ZUxpc3RlbmVyKSA9PT0gbnVsbCB8fCBfb25Ub3BNb3VzZU1vdmVMaXN0ZW4gPT09IHZvaWQgMCB8fCBfb25Ub3BNb3VzZU1vdmVMaXN0ZW4ucmVtb3ZlKCk7XG4gICAgfTtcbiAgfSwgW3Zpc2libGUsIGlzTW92aW5nLCB4LCB5LCByb3RhdGUsIG1vdmFibGVdKTtcbiAgcmV0dXJuIHtcbiAgICBpc01vdmluZzogaXNNb3ZpbmcsXG4gICAgb25Nb3VzZURvd246IG9uTW91c2VEb3duLFxuICAgIG9uTW91c2VNb3ZlOiBvbk1vdXNlTW92ZSxcbiAgICBvbk1vdXNlVXA6IG9uTW91c2VVcCxcbiAgICBvbldoZWVsOiBvbldoZWVsXG4gIH07XG59IiwgImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IHsgZ2V0Q2xpZW50U2l6ZSB9IGZyb20gXCJyYy11dGlsL2VzL0RvbS9jc3NcIjtcbmZ1bmN0aW9uIGZpeFBvaW50KGtleSwgc3RhcnQsIHdpZHRoLCBjbGllbnRXaWR0aCkge1xuICB2YXIgc3RhcnRBZGRXaWR0aCA9IHN0YXJ0ICsgd2lkdGg7XG4gIHZhciBvZmZzZXRTdGFydCA9ICh3aWR0aCAtIGNsaWVudFdpZHRoKSAvIDI7XG4gIGlmICh3aWR0aCA+IGNsaWVudFdpZHRoKSB7XG4gICAgaWYgKHN0YXJ0ID4gMCkge1xuICAgICAgcmV0dXJuIF9kZWZpbmVQcm9wZXJ0eSh7fSwga2V5LCBvZmZzZXRTdGFydCk7XG4gICAgfVxuICAgIGlmIChzdGFydCA8IDAgJiYgc3RhcnRBZGRXaWR0aCA8IGNsaWVudFdpZHRoKSB7XG4gICAgICByZXR1cm4gX2RlZmluZVByb3BlcnR5KHt9LCBrZXksIC1vZmZzZXRTdGFydCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydEFkZFdpZHRoID4gY2xpZW50V2lkdGgpIHtcbiAgICByZXR1cm4gX2RlZmluZVByb3BlcnR5KHt9LCBrZXksIHN0YXJ0IDwgMCA/IG9mZnNldFN0YXJ0IDogLW9mZnNldFN0YXJ0KTtcbiAgfVxuICByZXR1cm4ge307XG59XG5cbi8qKlxuICogRml4IHBvc2l0b24geCx5IHBvaW50IHdoZW5cbiAqXG4gKiBFbGUgd2lkdGggJiYgaGVpZ2h0IDwgY2xpZW50XG4gKiAtIEJhY2sgb3JpZ2luXG4gKlxuICogLSBFbGUgd2lkdGggfCBoZWlnaHQgPiBjbGllbnRXaWR0aCB8IGNsaWVudEhlaWdodFxuICogLSBsZWZ0IHwgdG9wID4gMCAtPiBCYWNrIDBcbiAqIC0gbGVmdCB8IHRvcCArIHdpZHRoIHwgaGVpZ2h0IDwgY2xpZW50V2lkdGggfCBjbGllbnRIZWlnaHQgLT4gQmFjayBsZWZ0IHwgdG9wICsgd2lkdGggfCBoZWlnaHQgPT09IGNsaWVudFdpZHRoIHwgY2xpZW50SGVpZ2h0XG4gKlxuICogUmVnYXJkbGVzcyBvZiBvdGhlclxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRGaXhTY2FsZUVsZVRyYW5zUG9zaXRpb24od2lkdGgsIGhlaWdodCwgbGVmdCwgdG9wKSB7XG4gIHZhciBfZ2V0Q2xpZW50U2l6ZSA9IGdldENsaWVudFNpemUoKSxcbiAgICBjbGllbnRXaWR0aCA9IF9nZXRDbGllbnRTaXplLndpZHRoLFxuICAgIGNsaWVudEhlaWdodCA9IF9nZXRDbGllbnRTaXplLmhlaWdodDtcbiAgdmFyIGZpeFBvcyA9IG51bGw7XG4gIGlmICh3aWR0aCA8PSBjbGllbnRXaWR0aCAmJiBoZWlnaHQgPD0gY2xpZW50SGVpZ2h0KSB7XG4gICAgZml4UG9zID0ge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDBcbiAgICB9O1xuICB9IGVsc2UgaWYgKHdpZHRoID4gY2xpZW50V2lkdGggfHwgaGVpZ2h0ID4gY2xpZW50SGVpZ2h0KSB7XG4gICAgZml4UG9zID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBmaXhQb2ludCgneCcsIGxlZnQsIHdpZHRoLCBjbGllbnRXaWR0aCkpLCBmaXhQb2ludCgneScsIHRvcCwgaGVpZ2h0LCBjbGllbnRIZWlnaHQpKTtcbiAgfVxuICByZXR1cm4gZml4UG9zO1xufSIsICIvKiogU2NhbGUgdGhlIHJhdGlvIGJhc2UgKi9cbmV4cG9ydCB2YXIgQkFTRV9TQ0FMRV9SQVRJTyA9IDE7XG4vKiogVGhlIG1heGltdW0gem9vbSByYXRpbyB3aGVuIHRoZSBtb3VzZSB6b29tcyBpbiwgYWRqdXN0YWJsZSAqL1xuZXhwb3J0IHZhciBXSEVFTF9NQVhfU0NBTEVfUkFUSU8gPSAxOyIsICJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGlzSW1hZ2VWYWxpZCB9IGZyb20gXCIuLi91dGlsXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VTdGF0dXMoX3JlZikge1xuICB2YXIgc3JjID0gX3JlZi5zcmMsXG4gICAgaXNDdXN0b21QbGFjZWhvbGRlciA9IF9yZWYuaXNDdXN0b21QbGFjZWhvbGRlcixcbiAgICBmYWxsYmFjayA9IF9yZWYuZmFsbGJhY2s7XG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZShpc0N1c3RvbVBsYWNlaG9sZGVyID8gJ2xvYWRpbmcnIDogJ25vcm1hbCcpLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIHN0YXR1cyA9IF91c2VTdGF0ZTJbMF0sXG4gICAgc2V0U3RhdHVzID0gX3VzZVN0YXRlMlsxXTtcbiAgdmFyIGlzTG9hZGVkID0gdXNlUmVmKGZhbHNlKTtcbiAgdmFyIGlzRXJyb3IgPSBzdGF0dXMgPT09ICdlcnJvcic7XG5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LWNvbXBvbmVudC9pbWFnZS9wdWxsLzE4N1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBpc0N1cnJlbnRTcmMgPSB0cnVlO1xuICAgIGlzSW1hZ2VWYWxpZChzcmMpLnRoZW4oZnVuY3Rpb24gKGlzVmFsaWQpIHtcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzQ0OTQ4XG4gICAgICAvLyBJZiBzcmMgY2hhbmdlcywgdGhlIHByZXZpb3VzIHNldFN0YXR1cyBzaG91bGQgbm90IGJlIHRyaWdnZXJlZFxuICAgICAgaWYgKCFpc1ZhbGlkICYmIGlzQ3VycmVudFNyYykge1xuICAgICAgICBzZXRTdGF0dXMoJ2Vycm9yJyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlzQ3VycmVudFNyYyA9IGZhbHNlO1xuICAgIH07XG4gIH0sIFtzcmNdKTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoaXNDdXN0b21QbGFjZWhvbGRlciAmJiAhaXNMb2FkZWQuY3VycmVudCkge1xuICAgICAgc2V0U3RhdHVzKCdsb2FkaW5nJyk7XG4gICAgfSBlbHNlIGlmIChpc0Vycm9yKSB7XG4gICAgICBzZXRTdGF0dXMoJ25vcm1hbCcpO1xuICAgIH1cbiAgfSwgW3NyY10pO1xuICB2YXIgb25Mb2FkID0gZnVuY3Rpb24gb25Mb2FkKCkge1xuICAgIHNldFN0YXR1cygnbm9ybWFsJyk7XG4gIH07XG4gIHZhciBnZXRJbWdSZWYgPSBmdW5jdGlvbiBnZXRJbWdSZWYoaW1nKSB7XG4gICAgaXNMb2FkZWQuY3VycmVudCA9IGZhbHNlO1xuICAgIGlmIChzdGF0dXMgPT09ICdsb2FkaW5nJyAmJiBpbWcgIT09IG51bGwgJiYgaW1nICE9PSB2b2lkIDAgJiYgaW1nLmNvbXBsZXRlICYmIChpbWcubmF0dXJhbFdpZHRoIHx8IGltZy5uYXR1cmFsSGVpZ2h0KSkge1xuICAgICAgaXNMb2FkZWQuY3VycmVudCA9IHRydWU7XG4gICAgICBvbkxvYWQoKTtcbiAgICB9XG4gIH07XG4gIHZhciBzcmNBbmRPbmxvYWQgPSBpc0Vycm9yICYmIGZhbGxiYWNrID8ge1xuICAgIHNyYzogZmFsbGJhY2tcbiAgfSA6IHtcbiAgICBvbkxvYWQ6IG9uTG9hZCxcbiAgICBzcmM6IHNyY1xuICB9O1xuICByZXR1cm4gW2dldEltZ1JlZiwgc3JjQW5kT25sb2FkLCBzdGF0dXNdO1xufSIsICJleHBvcnQgZnVuY3Rpb24gaXNJbWFnZVZhbGlkKHNyYykge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICBpZiAoIXNyYykge1xuICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcbiAgICBpbWcub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiByZXNvbHZlKGZhbHNlKTtcbiAgICB9O1xuICAgIGltZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZSh0cnVlKTtcbiAgICB9O1xuICAgIGltZy5zcmMgPSBzcmM7XG4gIH0pO1xufSIsICJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgYWRkRXZlbnRMaXN0ZW5lciBmcm9tIFwicmMtdXRpbC9lcy9Eb20vYWRkRXZlbnRMaXN0ZW5lclwiO1xuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGdldEZpeFNjYWxlRWxlVHJhbnNQb3NpdGlvbiBmcm9tIFwiLi4vZ2V0Rml4U2NhbGVFbGVUcmFuc1Bvc2l0aW9uXCI7XG5mdW5jdGlvbiBnZXREaXN0YW5jZShhLCBiKSB7XG4gIHZhciB4ID0gYS54IC0gYi54O1xuICB2YXIgeSA9IGEueSAtIGIueTtcbiAgcmV0dXJuIE1hdGguaHlwb3QoeCwgeSk7XG59XG5mdW5jdGlvbiBnZXRDZW50ZXIob2xkUG9pbnQxLCBvbGRQb2ludDIsIG5ld1BvaW50MSwgbmV3UG9pbnQyKSB7XG4gIC8vIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgZWFjaCBwb2ludCBoYXMgbW92ZWRcbiAgdmFyIGRpc3RhbmNlMSA9IGdldERpc3RhbmNlKG9sZFBvaW50MSwgbmV3UG9pbnQxKTtcbiAgdmFyIGRpc3RhbmNlMiA9IGdldERpc3RhbmNlKG9sZFBvaW50MiwgbmV3UG9pbnQyKTtcblxuICAvLyBJZiBib3RoIGRpc3RhbmNlcyBhcmUgMCwgcmV0dXJuIHRoZSBvcmlnaW5hbCBwb2ludHNcbiAgaWYgKGRpc3RhbmNlMSA9PT0gMCAmJiBkaXN0YW5jZTIgPT09IDApIHtcbiAgICByZXR1cm4gW29sZFBvaW50MS54LCBvbGRQb2ludDEueV07XG4gIH1cblxuICAvLyBDYWxjdWxhdGUgdGhlIHJhdGlvIG9mIHRoZSBkaXN0YW5jZXNcbiAgdmFyIHJhdGlvID0gZGlzdGFuY2UxIC8gKGRpc3RhbmNlMSArIGRpc3RhbmNlMik7XG5cbiAgLy8gQ2FsY3VsYXRlIHRoZSBuZXcgY2VudGVyIHBvaW50IGJhc2VkIG9uIHRoZSByYXRpb1xuICB2YXIgeCA9IG9sZFBvaW50MS54ICsgcmF0aW8gKiAob2xkUG9pbnQyLnggLSBvbGRQb2ludDEueCk7XG4gIHZhciB5ID0gb2xkUG9pbnQxLnkgKyByYXRpbyAqIChvbGRQb2ludDIueSAtIG9sZFBvaW50MS55KTtcbiAgcmV0dXJuIFt4LCB5XTtcbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVRvdWNoRXZlbnQoaW1nUmVmLCBtb3ZhYmxlLCB2aXNpYmxlLCBtaW5TY2FsZSwgdHJhbnNmb3JtLCB1cGRhdGVUcmFuc2Zvcm0sIGRpc3BhdGNoWm9vbUNoYW5nZSkge1xuICB2YXIgcm90YXRlID0gdHJhbnNmb3JtLnJvdGF0ZSxcbiAgICBzY2FsZSA9IHRyYW5zZm9ybS5zY2FsZSxcbiAgICB4ID0gdHJhbnNmb3JtLngsXG4gICAgeSA9IHRyYW5zZm9ybS55O1xuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUoZmFsc2UpLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIGlzVG91Y2hpbmcgPSBfdXNlU3RhdGUyWzBdLFxuICAgIHNldElzVG91Y2hpbmcgPSBfdXNlU3RhdGUyWzFdO1xuICB2YXIgdG91Y2hQb2ludEluZm8gPSB1c2VSZWYoe1xuICAgIHBvaW50MToge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDBcbiAgICB9LFxuICAgIHBvaW50Mjoge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDBcbiAgICB9LFxuICAgIGV2ZW50VHlwZTogJ25vbmUnXG4gIH0pO1xuICB2YXIgdXBkYXRlVG91Y2hQb2ludEluZm8gPSBmdW5jdGlvbiB1cGRhdGVUb3VjaFBvaW50SW5mbyh2YWx1ZXMpIHtcbiAgICB0b3VjaFBvaW50SW5mby5jdXJyZW50ID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB0b3VjaFBvaW50SW5mby5jdXJyZW50KSwgdmFsdWVzKTtcbiAgfTtcbiAgdmFyIG9uVG91Y2hTdGFydCA9IGZ1bmN0aW9uIG9uVG91Y2hTdGFydChldmVudCkge1xuICAgIGlmICghbW92YWJsZSkgcmV0dXJuO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHNldElzVG91Y2hpbmcodHJ1ZSk7XG4gICAgdmFyIF9ldmVudCR0b3VjaGVzID0gZXZlbnQudG91Y2hlcyxcbiAgICAgIHRvdWNoZXMgPSBfZXZlbnQkdG91Y2hlcyA9PT0gdm9pZCAwID8gW10gOiBfZXZlbnQkdG91Y2hlcztcbiAgICBpZiAodG91Y2hlcy5sZW5ndGggPiAxKSB7XG4gICAgICAvLyB0b3VjaCB6b29tXG4gICAgICB1cGRhdGVUb3VjaFBvaW50SW5mbyh7XG4gICAgICAgIHBvaW50MToge1xuICAgICAgICAgIHg6IHRvdWNoZXNbMF0uY2xpZW50WCxcbiAgICAgICAgICB5OiB0b3VjaGVzWzBdLmNsaWVudFlcbiAgICAgICAgfSxcbiAgICAgICAgcG9pbnQyOiB7XG4gICAgICAgICAgeDogdG91Y2hlc1sxXS5jbGllbnRYLFxuICAgICAgICAgIHk6IHRvdWNoZXNbMV0uY2xpZW50WVxuICAgICAgICB9LFxuICAgICAgICBldmVudFR5cGU6ICd0b3VjaFpvb20nXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdG91Y2ggbW92ZVxuICAgICAgdXBkYXRlVG91Y2hQb2ludEluZm8oe1xuICAgICAgICBwb2ludDE6IHtcbiAgICAgICAgICB4OiB0b3VjaGVzWzBdLmNsaWVudFggLSB4LFxuICAgICAgICAgIHk6IHRvdWNoZXNbMF0uY2xpZW50WSAtIHlcbiAgICAgICAgfSxcbiAgICAgICAgZXZlbnRUeXBlOiAnbW92ZSdcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgdmFyIG9uVG91Y2hNb3ZlID0gZnVuY3Rpb24gb25Ub3VjaE1vdmUoZXZlbnQpIHtcbiAgICB2YXIgX2V2ZW50JHRvdWNoZXMyID0gZXZlbnQudG91Y2hlcyxcbiAgICAgIHRvdWNoZXMgPSBfZXZlbnQkdG91Y2hlczIgPT09IHZvaWQgMCA/IFtdIDogX2V2ZW50JHRvdWNoZXMyO1xuICAgIHZhciBfdG91Y2hQb2ludEluZm8kY3VycmUgPSB0b3VjaFBvaW50SW5mby5jdXJyZW50LFxuICAgICAgcG9pbnQxID0gX3RvdWNoUG9pbnRJbmZvJGN1cnJlLnBvaW50MSxcbiAgICAgIHBvaW50MiA9IF90b3VjaFBvaW50SW5mbyRjdXJyZS5wb2ludDIsXG4gICAgICBldmVudFR5cGUgPSBfdG91Y2hQb2ludEluZm8kY3VycmUuZXZlbnRUeXBlO1xuICAgIGlmICh0b3VjaGVzLmxlbmd0aCA+IDEgJiYgZXZlbnRUeXBlID09PSAndG91Y2hab29tJykge1xuICAgICAgLy8gdG91Y2ggem9vbVxuICAgICAgdmFyIG5ld1BvaW50MSA9IHtcbiAgICAgICAgeDogdG91Y2hlc1swXS5jbGllbnRYLFxuICAgICAgICB5OiB0b3VjaGVzWzBdLmNsaWVudFlcbiAgICAgIH07XG4gICAgICB2YXIgbmV3UG9pbnQyID0ge1xuICAgICAgICB4OiB0b3VjaGVzWzFdLmNsaWVudFgsXG4gICAgICAgIHk6IHRvdWNoZXNbMV0uY2xpZW50WVxuICAgICAgfTtcbiAgICAgIHZhciBfZ2V0Q2VudGVyID0gZ2V0Q2VudGVyKHBvaW50MSwgcG9pbnQyLCBuZXdQb2ludDEsIG5ld1BvaW50MiksXG4gICAgICAgIF9nZXRDZW50ZXIyID0gX3NsaWNlZFRvQXJyYXkoX2dldENlbnRlciwgMiksXG4gICAgICAgIGNlbnRlclggPSBfZ2V0Q2VudGVyMlswXSxcbiAgICAgICAgY2VudGVyWSA9IF9nZXRDZW50ZXIyWzFdO1xuICAgICAgdmFyIHJhdGlvID0gZ2V0RGlzdGFuY2UobmV3UG9pbnQxLCBuZXdQb2ludDIpIC8gZ2V0RGlzdGFuY2UocG9pbnQxLCBwb2ludDIpO1xuICAgICAgZGlzcGF0Y2hab29tQ2hhbmdlKHJhdGlvLCAndG91Y2hab29tJywgY2VudGVyWCwgY2VudGVyWSwgdHJ1ZSk7XG4gICAgICB1cGRhdGVUb3VjaFBvaW50SW5mbyh7XG4gICAgICAgIHBvaW50MTogbmV3UG9pbnQxLFxuICAgICAgICBwb2ludDI6IG5ld1BvaW50MixcbiAgICAgICAgZXZlbnRUeXBlOiAndG91Y2hab29tJ1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09ICdtb3ZlJykge1xuICAgICAgLy8gdG91Y2ggbW92ZVxuICAgICAgdXBkYXRlVHJhbnNmb3JtKHtcbiAgICAgICAgeDogdG91Y2hlc1swXS5jbGllbnRYIC0gcG9pbnQxLngsXG4gICAgICAgIHk6IHRvdWNoZXNbMF0uY2xpZW50WSAtIHBvaW50MS55XG4gICAgICB9LCAnbW92ZScpO1xuICAgICAgdXBkYXRlVG91Y2hQb2ludEluZm8oe1xuICAgICAgICBldmVudFR5cGU6ICdtb3ZlJ1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICB2YXIgb25Ub3VjaEVuZCA9IGZ1bmN0aW9uIG9uVG91Y2hFbmQoKSB7XG4gICAgaWYgKCF2aXNpYmxlKSByZXR1cm47XG4gICAgaWYgKGlzVG91Y2hpbmcpIHtcbiAgICAgIHNldElzVG91Y2hpbmcoZmFsc2UpO1xuICAgIH1cbiAgICB1cGRhdGVUb3VjaFBvaW50SW5mbyh7XG4gICAgICBldmVudFR5cGU6ICdub25lJ1xuICAgIH0pO1xuICAgIGlmIChtaW5TY2FsZSA+IHNjYWxlKSB7XG4gICAgICAvKiogV2hlbiB0aGUgc2NhbGluZyByYXRpbyBpcyBsZXNzIHRoYW4gdGhlIG1pbmltdW0gc2NhbGluZyByYXRpbywgcmVzZXQgdGhlIHNjYWxpbmcgcmF0aW8gKi9cbiAgICAgIHJldHVybiB1cGRhdGVUcmFuc2Zvcm0oe1xuICAgICAgICB4OiAwLFxuICAgICAgICB5OiAwLFxuICAgICAgICBzY2FsZTogbWluU2NhbGVcbiAgICAgIH0sICd0b3VjaFpvb20nKTtcbiAgICB9XG4gICAgdmFyIHdpZHRoID0gaW1nUmVmLmN1cnJlbnQub2Zmc2V0V2lkdGggKiBzY2FsZTtcbiAgICB2YXIgaGVpZ2h0ID0gaW1nUmVmLmN1cnJlbnQub2Zmc2V0SGVpZ2h0ICogc2NhbGU7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1zaGFkb3dcbiAgICB2YXIgX2ltZ1JlZiRjdXJyZW50JGdldEJvID0gaW1nUmVmLmN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICBsZWZ0ID0gX2ltZ1JlZiRjdXJyZW50JGdldEJvLmxlZnQsXG4gICAgICB0b3AgPSBfaW1nUmVmJGN1cnJlbnQkZ2V0Qm8udG9wO1xuICAgIHZhciBpc1JvdGF0ZSA9IHJvdGF0ZSAlIDE4MCAhPT0gMDtcbiAgICB2YXIgZml4U3RhdGUgPSBnZXRGaXhTY2FsZUVsZVRyYW5zUG9zaXRpb24oaXNSb3RhdGUgPyBoZWlnaHQgOiB3aWR0aCwgaXNSb3RhdGUgPyB3aWR0aCA6IGhlaWdodCwgbGVmdCwgdG9wKTtcbiAgICBpZiAoZml4U3RhdGUpIHtcbiAgICAgIHVwZGF0ZVRyYW5zZm9ybShfb2JqZWN0U3ByZWFkKHt9LCBmaXhTdGF0ZSksICdkcmFnUmVib3VuZCcpO1xuICAgIH1cbiAgfTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgb25Ub3VjaE1vdmVMaXN0ZW5lcjtcbiAgICBpZiAodmlzaWJsZSAmJiBtb3ZhYmxlKSB7XG4gICAgICBvblRvdWNoTW92ZUxpc3RlbmVyID0gYWRkRXZlbnRMaXN0ZW5lcih3aW5kb3csICd0b3VjaG1vdmUnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfSwge1xuICAgICAgICBwYXNzaXZlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX29uVG91Y2hNb3ZlTGlzdGVuZXI7XG4gICAgICAoX29uVG91Y2hNb3ZlTGlzdGVuZXIgPSBvblRvdWNoTW92ZUxpc3RlbmVyKSA9PT0gbnVsbCB8fCBfb25Ub3VjaE1vdmVMaXN0ZW5lciA9PT0gdm9pZCAwIHx8IF9vblRvdWNoTW92ZUxpc3RlbmVyLnJlbW92ZSgpO1xuICAgIH07XG4gIH0sIFt2aXNpYmxlLCBtb3ZhYmxlXSk7XG4gIHJldHVybiB7XG4gICAgaXNUb3VjaGluZzogaXNUb3VjaGluZyxcbiAgICBvblRvdWNoU3RhcnQ6IG9uVG91Y2hTdGFydCxcbiAgICBvblRvdWNoTW92ZTogb25Ub3VjaE1vdmUsXG4gICAgb25Ub3VjaEVuZDogb25Ub3VjaEVuZFxuICB9O1xufSIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJ2aXNpYmxlXCIsIFwib25WaXNpYmxlQ2hhbmdlXCIsIFwiZ2V0Q29udGFpbmVyXCIsIFwiY3VycmVudFwiLCBcIm1vdmFibGVcIiwgXCJtaW5TY2FsZVwiLCBcIm1heFNjYWxlXCIsIFwiY291bnRSZW5kZXJcIiwgXCJjbG9zZUljb25cIiwgXCJvbkNoYW5nZVwiLCBcIm9uVHJhbnNmb3JtXCIsIFwidG9vbGJhclJlbmRlclwiLCBcImltYWdlUmVuZGVyXCJdLFxuICBfZXhjbHVkZWQyID0gW1wic3JjXCJdO1xuaW1wb3J0IHVzZU1lcmdlZFN0YXRlIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZU1lcmdlZFN0YXRlXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcmV2aWV3IGZyb20gXCIuL1ByZXZpZXdcIjtcbmltcG9ydCB7IFByZXZpZXdHcm91cENvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0XCI7XG5pbXBvcnQgdXNlUHJldmlld0l0ZW1zIGZyb20gXCIuL2hvb2tzL3VzZVByZXZpZXdJdGVtc1wiO1xudmFyIEdyb3VwID0gZnVuY3Rpb24gR3JvdXAoX3JlZikge1xuICB2YXIgX21lcmdlZEl0ZW1zJGN1cnJlbnQ7XG4gIHZhciBfcmVmJHByZXZpZXdQcmVmaXhDbHMgPSBfcmVmLnByZXZpZXdQcmVmaXhDbHMsXG4gICAgcHJldmlld1ByZWZpeENscyA9IF9yZWYkcHJldmlld1ByZWZpeENscyA9PT0gdm9pZCAwID8gJ3JjLWltYWdlLXByZXZpZXcnIDogX3JlZiRwcmV2aWV3UHJlZml4Q2xzLFxuICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICBfcmVmJGljb25zID0gX3JlZi5pY29ucyxcbiAgICBpY29ucyA9IF9yZWYkaWNvbnMgPT09IHZvaWQgMCA/IHt9IDogX3JlZiRpY29ucyxcbiAgICBpdGVtcyA9IF9yZWYuaXRlbXMsXG4gICAgcHJldmlldyA9IF9yZWYucHJldmlldyxcbiAgICBmYWxsYmFjayA9IF9yZWYuZmFsbGJhY2s7XG4gIHZhciBfcmVmMiA9IF90eXBlb2YocHJldmlldykgPT09ICdvYmplY3QnID8gcHJldmlldyA6IHt9LFxuICAgIHByZXZpZXdWaXNpYmxlID0gX3JlZjIudmlzaWJsZSxcbiAgICBvblZpc2libGVDaGFuZ2UgPSBfcmVmMi5vblZpc2libGVDaGFuZ2UsXG4gICAgZ2V0Q29udGFpbmVyID0gX3JlZjIuZ2V0Q29udGFpbmVyLFxuICAgIGN1cnJlbnRJbmRleCA9IF9yZWYyLmN1cnJlbnQsXG4gICAgbW92YWJsZSA9IF9yZWYyLm1vdmFibGUsXG4gICAgbWluU2NhbGUgPSBfcmVmMi5taW5TY2FsZSxcbiAgICBtYXhTY2FsZSA9IF9yZWYyLm1heFNjYWxlLFxuICAgIGNvdW50UmVuZGVyID0gX3JlZjIuY291bnRSZW5kZXIsXG4gICAgY2xvc2VJY29uID0gX3JlZjIuY2xvc2VJY29uLFxuICAgIG9uQ2hhbmdlID0gX3JlZjIub25DaGFuZ2UsXG4gICAgb25UcmFuc2Zvcm0gPSBfcmVmMi5vblRyYW5zZm9ybSxcbiAgICB0b29sYmFyUmVuZGVyID0gX3JlZjIudG9vbGJhclJlbmRlcixcbiAgICBpbWFnZVJlbmRlciA9IF9yZWYyLmltYWdlUmVuZGVyLFxuICAgIGRpYWxvZ1Byb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYyLCBfZXhjbHVkZWQpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IEl0ZW1zID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX3VzZVByZXZpZXdJdGVtcyA9IHVzZVByZXZpZXdJdGVtcyhpdGVtcyksXG4gICAgX3VzZVByZXZpZXdJdGVtczIgPSBfc2xpY2VkVG9BcnJheShfdXNlUHJldmlld0l0ZW1zLCAzKSxcbiAgICBtZXJnZWRJdGVtcyA9IF91c2VQcmV2aWV3SXRlbXMyWzBdLFxuICAgIHJlZ2lzdGVyID0gX3VzZVByZXZpZXdJdGVtczJbMV0sXG4gICAgZnJvbUl0ZW1zID0gX3VzZVByZXZpZXdJdGVtczJbMl07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBQcmV2aWV3ID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vID4+PiBJbmRleFxuICB2YXIgX3VzZU1lcmdlZFN0YXRlID0gdXNlTWVyZ2VkU3RhdGUoMCwge1xuICAgICAgdmFsdWU6IGN1cnJlbnRJbmRleFxuICAgIH0pLFxuICAgIF91c2VNZXJnZWRTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlTWVyZ2VkU3RhdGUsIDIpLFxuICAgIGN1cnJlbnQgPSBfdXNlTWVyZ2VkU3RhdGUyWzBdLFxuICAgIHNldEN1cnJlbnQgPSBfdXNlTWVyZ2VkU3RhdGUyWzFdO1xuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUoZmFsc2UpLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIGtlZXBPcGVuSW5kZXggPSBfdXNlU3RhdGUyWzBdLFxuICAgIHNldEtlZXBPcGVuSW5kZXggPSBfdXNlU3RhdGUyWzFdO1xuXG4gIC8vID4+PiBJbWFnZVxuICB2YXIgX3JlZjMgPSAoKF9tZXJnZWRJdGVtcyRjdXJyZW50ID0gbWVyZ2VkSXRlbXNbY3VycmVudF0pID09PSBudWxsIHx8IF9tZXJnZWRJdGVtcyRjdXJyZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfbWVyZ2VkSXRlbXMkY3VycmVudC5kYXRhKSB8fCB7fSxcbiAgICBzcmMgPSBfcmVmMy5zcmMsXG4gICAgaW1nQ29tbW9uUHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZjMsIF9leGNsdWRlZDIpO1xuICAvLyA+Pj4gVmlzaWJsZVxuICB2YXIgX3VzZU1lcmdlZFN0YXRlMyA9IHVzZU1lcmdlZFN0YXRlKCEhcHJldmlld1Zpc2libGUsIHtcbiAgICAgIHZhbHVlOiBwcmV2aWV3VmlzaWJsZSxcbiAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbiBvbkNoYW5nZSh2YWwsIHByZXZWYWwpIHtcbiAgICAgICAgb25WaXNpYmxlQ2hhbmdlID09PSBudWxsIHx8IG9uVmlzaWJsZUNoYW5nZSA9PT0gdm9pZCAwIHx8IG9uVmlzaWJsZUNoYW5nZSh2YWwsIHByZXZWYWwsIGN1cnJlbnQpO1xuICAgICAgfVxuICAgIH0pLFxuICAgIF91c2VNZXJnZWRTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfdXNlTWVyZ2VkU3RhdGUzLCAyKSxcbiAgICBpc1Nob3dQcmV2aWV3ID0gX3VzZU1lcmdlZFN0YXRlNFswXSxcbiAgICBzZXRTaG93UHJldmlldyA9IF91c2VNZXJnZWRTdGF0ZTRbMV07XG5cbiAgLy8gPj4+IFBvc2l0aW9uXG4gIHZhciBfdXNlU3RhdGUzID0gdXNlU3RhdGUobnVsbCksXG4gICAgX3VzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZTMsIDIpLFxuICAgIG1vdXNlUG9zaXRpb24gPSBfdXNlU3RhdGU0WzBdLFxuICAgIHNldE1vdXNlUG9zaXRpb24gPSBfdXNlU3RhdGU0WzFdO1xuICB2YXIgb25QcmV2aWV3RnJvbUltYWdlID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGlkLCBpbWFnZVNyYywgbW91c2VYLCBtb3VzZVkpIHtcbiAgICB2YXIgaW5kZXggPSBmcm9tSXRlbXMgPyBtZXJnZWRJdGVtcy5maW5kSW5kZXgoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBpdGVtLmRhdGEuc3JjID09PSBpbWFnZVNyYztcbiAgICB9KSA6IG1lcmdlZEl0ZW1zLmZpbmRJbmRleChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIGl0ZW0uaWQgPT09IGlkO1xuICAgIH0pO1xuICAgIHNldEN1cnJlbnQoaW5kZXggPCAwID8gMCA6IGluZGV4KTtcbiAgICBzZXRTaG93UHJldmlldyh0cnVlKTtcbiAgICBzZXRNb3VzZVBvc2l0aW9uKHtcbiAgICAgIHg6IG1vdXNlWCxcbiAgICAgIHk6IG1vdXNlWVxuICAgIH0pO1xuICAgIHNldEtlZXBPcGVuSW5kZXgodHJ1ZSk7XG4gIH0sIFttZXJnZWRJdGVtcywgZnJvbUl0ZW1zXSk7XG5cbiAgLy8gUmVzZXQgY3VycmVudCB3aGVuIHJlb3BlblxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChpc1Nob3dQcmV2aWV3KSB7XG4gICAgICBpZiAoIWtlZXBPcGVuSW5kZXgpIHtcbiAgICAgICAgc2V0Q3VycmVudCgwKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc2V0S2VlcE9wZW5JbmRleChmYWxzZSk7XG4gICAgfVxuICB9LCBbaXNTaG93UHJldmlld10pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IEV2ZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgb25JbnRlcm5hbENoYW5nZSA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxDaGFuZ2UobmV4dCwgcHJldikge1xuICAgIHNldEN1cnJlbnQobmV4dCk7XG4gICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCB8fCBvbkNoYW5nZShuZXh0LCBwcmV2KTtcbiAgfTtcbiAgdmFyIG9uUHJldmlld0Nsb3NlID0gZnVuY3Rpb24gb25QcmV2aWV3Q2xvc2UoKSB7XG4gICAgc2V0U2hvd1ByZXZpZXcoZmFsc2UpO1xuICAgIHNldE1vdXNlUG9zaXRpb24obnVsbCk7XG4gIH07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBDb250ZXh0ID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBwcmV2aWV3R3JvdXBDb250ZXh0ID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlZ2lzdGVyOiByZWdpc3RlcixcbiAgICAgIG9uUHJldmlldzogb25QcmV2aWV3RnJvbUltYWdlXG4gICAgfTtcbiAgfSwgW3JlZ2lzdGVyLCBvblByZXZpZXdGcm9tSW1hZ2VdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFByZXZpZXdHcm91cENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogcHJldmlld0dyb3VwQ29udGV4dFxuICB9LCBjaGlsZHJlbiwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUHJldmlldywgX2V4dGVuZHMoe1xuICAgIFwiYXJpYS1oaWRkZW5cIjogIWlzU2hvd1ByZXZpZXcsXG4gICAgbW92YWJsZTogbW92YWJsZSxcbiAgICB2aXNpYmxlOiBpc1Nob3dQcmV2aWV3LFxuICAgIHByZWZpeENsczogcHJldmlld1ByZWZpeENscyxcbiAgICBjbG9zZUljb246IGNsb3NlSWNvbixcbiAgICBvbkNsb3NlOiBvblByZXZpZXdDbG9zZSxcbiAgICBtb3VzZVBvc2l0aW9uOiBtb3VzZVBvc2l0aW9uLFxuICAgIGltZ0NvbW1vblByb3BzOiBpbWdDb21tb25Qcm9wcyxcbiAgICBzcmM6IHNyYyxcbiAgICBmYWxsYmFjazogZmFsbGJhY2ssXG4gICAgaWNvbnM6IGljb25zLFxuICAgIG1pblNjYWxlOiBtaW5TY2FsZSxcbiAgICBtYXhTY2FsZTogbWF4U2NhbGUsXG4gICAgZ2V0Q29udGFpbmVyOiBnZXRDb250YWluZXIsXG4gICAgY3VycmVudDogY3VycmVudCxcbiAgICBjb3VudDogbWVyZ2VkSXRlbXMubGVuZ3RoLFxuICAgIGNvdW50UmVuZGVyOiBjb3VudFJlbmRlcixcbiAgICBvblRyYW5zZm9ybTogb25UcmFuc2Zvcm0sXG4gICAgdG9vbGJhclJlbmRlcjogdG9vbGJhclJlbmRlcixcbiAgICBpbWFnZVJlbmRlcjogaW1hZ2VSZW5kZXIsXG4gICAgb25DaGFuZ2U6IG9uSW50ZXJuYWxDaGFuZ2VcbiAgfSwgZGlhbG9nUHJvcHMpKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgR3JvdXA7IiwgImltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ09NTU9OX1BST1BTIH0gZnJvbSBcIi4uL2NvbW1vblwiO1xuLyoqXG4gKiBNZXJnZSBwcm9wcyBwcm92aWRlZCBgaXRlbXNgIG9yIGNvbnRleHQgY29sbGVjdGVkIGltYWdlc1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VQcmV2aWV3SXRlbXMoaXRlbXMpIHtcbiAgLy8gQ29udGV4dCBjb2xsZWN0aW9uIGltYWdlIGRhdGFcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKHt9KSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBpbWFnZXMgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldEltYWdlcyA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciByZWdpc3RlckltYWdlID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGlkLCBkYXRhKSB7XG4gICAgc2V0SW1hZ2VzKGZ1bmN0aW9uIChpbWdzKSB7XG4gICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBpbWdzKSwge30sIF9kZWZpbmVQcm9wZXJ0eSh7fSwgaWQsIGRhdGEpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgc2V0SW1hZ2VzKGZ1bmN0aW9uIChpbWdzKSB7XG4gICAgICAgIHZhciBjbG9uZUltZ3MgPSBfb2JqZWN0U3ByZWFkKHt9LCBpbWdzKTtcbiAgICAgICAgZGVsZXRlIGNsb25lSW1nc1tpZF07XG4gICAgICAgIHJldHVybiBjbG9uZUltZ3M7XG4gICAgICB9KTtcbiAgICB9O1xuICB9LCBbXSk7XG5cbiAgLy8gaXRlbXNcbiAgdmFyIG1lcmdlZEl0ZW1zID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgLy8gdXNlIGBpdGVtc2AgZmlyc3RcbiAgICBpZiAoaXRlbXMpIHtcbiAgICAgIHJldHVybiBpdGVtcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgIHNyYzogaXRlbVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRhdGEgPSB7fTtcbiAgICAgICAgT2JqZWN0LmtleXMoaXRlbSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgaWYgKFsnc3JjJ10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShDT01NT05fUFJPUFMpKS5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgICBkYXRhW2tleV0gPSBpdGVtW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiBkYXRhXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyB1c2UgcmVnaXN0ZXJlZCBpbWFnZXMgc2Vjb25kbHlcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoaW1hZ2VzKS5yZWR1Y2UoZnVuY3Rpb24gKHRvdGFsLCBpZCkge1xuICAgICAgdmFyIF9pbWFnZXMkaWQgPSBpbWFnZXNbaWRdLFxuICAgICAgICBjYW5QcmV2aWV3ID0gX2ltYWdlcyRpZC5jYW5QcmV2aWV3LFxuICAgICAgICBkYXRhID0gX2ltYWdlcyRpZC5kYXRhO1xuICAgICAgaWYgKGNhblByZXZpZXcpIHtcbiAgICAgICAgdG90YWwucHVzaCh7XG4gICAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgICBpZDogaWRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdG90YWw7XG4gICAgfSwgW10pO1xuICB9LCBbaXRlbXMsIGltYWdlc10pO1xuICByZXR1cm4gW21lcmdlZEl0ZW1zLCByZWdpc3RlckltYWdlLCAhIWl0ZW1zXTtcbn0iLCAiZXhwb3J0IHZhciBDT01NT05fUFJPUFMgPSBbJ2Nyb3NzT3JpZ2luJywgJ2RlY29kaW5nJywgJ2RyYWdnYWJsZScsICdsb2FkaW5nJywgJ3JlZmVycmVyUG9saWN5JywgJ3NpemVzJywgJ3NyY1NldCcsICd1c2VNYXAnLCAnYWx0J107IiwgImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgUHJldmlld0dyb3VwQ29udGV4dCB9IGZyb20gXCIuLi9jb250ZXh0XCI7XG52YXIgdWlkID0gMDtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVJlZ2lzdGVySW1hZ2UoY2FuUHJldmlldywgZGF0YSkge1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgdWlkICs9IDE7XG4gICAgICByZXR1cm4gU3RyaW5nKHVpZCk7XG4gICAgfSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMSksXG4gICAgaWQgPSBfUmVhY3QkdXNlU3RhdGUyWzBdO1xuICB2YXIgZ3JvdXBDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChQcmV2aWV3R3JvdXBDb250ZXh0KTtcbiAgdmFyIHJlZ2lzdGVyRGF0YSA9IHtcbiAgICBkYXRhOiBkYXRhLFxuICAgIGNhblByZXZpZXc6IGNhblByZXZpZXdcbiAgfTtcblxuICAvLyBLZWVwIG9yZGVyIHN0YXJ0XG4gIC8vIFJlc29sdmUgaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMjg4ODFcbiAgLy8gT25seSBuZWVkIHVuUmVnaXN0ZXIgd2hlbiBjb21wb25lbnQgdW5Nb3VudFxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChncm91cENvbnRleHQpIHtcbiAgICAgIHJldHVybiBncm91cENvbnRleHQucmVnaXN0ZXIoaWQsIHJlZ2lzdGVyRGF0YSk7XG4gICAgfVxuICB9LCBbXSk7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGdyb3VwQ29udGV4dCkge1xuICAgICAgZ3JvdXBDb250ZXh0LnJlZ2lzdGVyKGlkLCByZWdpc3RlckRhdGEpO1xuICAgIH1cbiAgfSwgW2NhblByZXZpZXcsIGRhdGFdKTtcbiAgcmV0dXJuIGlkO1xufSIsICJpbXBvcnQgSW1hZ2UgZnJvbSBcIi4vSW1hZ2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0ltYWdlXCI7XG5leHBvcnQgZGVmYXVsdCBJbWFnZTsiLCAiXCJ1c2UgY2xpZW50XCI7XG5cbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQ2xvc2VPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvQ2xvc2VPdXRsaW5lZFwiO1xuaW1wb3J0IExlZnRPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvTGVmdE91dGxpbmVkXCI7XG5pbXBvcnQgUmlnaHRPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvUmlnaHRPdXRsaW5lZFwiO1xuaW1wb3J0IFJvdGF0ZUxlZnRPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvUm90YXRlTGVmdE91dGxpbmVkXCI7XG5pbXBvcnQgUm90YXRlUmlnaHRPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvUm90YXRlUmlnaHRPdXRsaW5lZFwiO1xuaW1wb3J0IFN3YXBPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvU3dhcE91dGxpbmVkXCI7XG5pbXBvcnQgWm9vbUluT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL1pvb21Jbk91dGxpbmVkXCI7XG5pbXBvcnQgWm9vbU91dE91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9ab29tT3V0T3V0bGluZWRcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFJjSW1hZ2UgZnJvbSAncmMtaW1hZ2UnO1xuaW1wb3J0IHsgdXNlWkluZGV4IH0gZnJvbSAnLi4vX3V0aWwvaG9va3MvdXNlWkluZGV4JztcbmltcG9ydCB7IGdldFRyYW5zaXRpb25OYW1lIH0gZnJvbSAnLi4vX3V0aWwvbW90aW9uJztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHVzZUNTU1ZhckNscyBmcm9tICcuLi9jb25maWctcHJvdmlkZXIvaG9va3MvdXNlQ1NTVmFyQ2xzJztcbmltcG9ydCB1c2VTdHlsZSBmcm9tICcuL3N0eWxlJztcbmV4cG9ydCBjb25zdCBpY29ucyA9IHtcbiAgcm90YXRlTGVmdDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUm90YXRlTGVmdE91dGxpbmVkLCBudWxsKSxcbiAgcm90YXRlUmlnaHQ6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJvdGF0ZVJpZ2h0T3V0bGluZWQsIG51bGwpLFxuICB6b29tSW46IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFpvb21Jbk91dGxpbmVkLCBudWxsKSxcbiAgem9vbU91dDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoWm9vbU91dE91dGxpbmVkLCBudWxsKSxcbiAgY2xvc2U6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENsb3NlT3V0bGluZWQsIG51bGwpLFxuICBsZWZ0OiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMZWZ0T3V0bGluZWQsIG51bGwpLFxuICByaWdodDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmlnaHRPdXRsaW5lZCwgbnVsbCksXG4gIGZsaXBYOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTd2FwT3V0bGluZWQsIG51bGwpLFxuICBmbGlwWTogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU3dhcE91dGxpbmVkLCB7XG4gICAgcm90YXRlOiA5MFxuICB9KVxufTtcbmNvbnN0IEludGVybmFsUHJldmlld0dyb3VwID0gX2EgPT4ge1xuICB2YXIge1xuICAgICAgcHJldmlld1ByZWZpeENsczogY3VzdG9taXplUHJlZml4Q2xzLFxuICAgICAgcHJldmlld1xuICAgIH0gPSBfYSxcbiAgICBvdGhlclByb3BzID0gX19yZXN0KF9hLCBbXCJwcmV2aWV3UHJlZml4Q2xzXCIsIFwicHJldmlld1wiXSk7XG4gIGNvbnN0IHtcbiAgICBnZXRQcmVmaXhDbHNcbiAgfSA9IFJlYWN0LnVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCk7XG4gIGNvbnN0IHByZWZpeENscyA9IGdldFByZWZpeENscygnaW1hZ2UnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICBjb25zdCBwcmV2aWV3UHJlZml4Q2xzID0gYCR7cHJlZml4Q2xzfS1wcmV2aWV3YDtcbiAgY29uc3Qgcm9vdFByZWZpeENscyA9IGdldFByZWZpeENscygpO1xuICBjb25zdCByb290Q2xzID0gdXNlQ1NTVmFyQ2xzKHByZWZpeENscyk7XG4gIGNvbnN0IFt3cmFwQ1NTVmFyLCBoYXNoSWQsIGNzc1ZhckNsc10gPSB1c2VTdHlsZShwcmVmaXhDbHMsIHJvb3RDbHMpO1xuICBjb25zdCBbekluZGV4XSA9IHVzZVpJbmRleCgnSW1hZ2VQcmV2aWV3JywgdHlwZW9mIHByZXZpZXcgPT09ICdvYmplY3QnID8gcHJldmlldy56SW5kZXggOiB1bmRlZmluZWQpO1xuICBjb25zdCBtZXJnZWRQcmV2aWV3ID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgdmFyIF9hO1xuICAgIGlmIChwcmV2aWV3ID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHByZXZpZXc7XG4gICAgfVxuICAgIGNvbnN0IF9wcmV2aWV3ID0gdHlwZW9mIHByZXZpZXcgPT09ICdvYmplY3QnID8gcHJldmlldyA6IHt9O1xuICAgIGNvbnN0IG1lcmdlZFJvb3RDbGFzc05hbWUgPSBjbGFzc05hbWVzKGhhc2hJZCwgY3NzVmFyQ2xzLCByb290Q2xzLCAoX2EgPSBfcHJldmlldy5yb290Q2xhc3NOYW1lKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAnJyk7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgX3ByZXZpZXcpLCB7XG4gICAgICB0cmFuc2l0aW9uTmFtZTogZ2V0VHJhbnNpdGlvbk5hbWUocm9vdFByZWZpeENscywgJ3pvb20nLCBfcHJldmlldy50cmFuc2l0aW9uTmFtZSksXG4gICAgICBtYXNrVHJhbnNpdGlvbk5hbWU6IGdldFRyYW5zaXRpb25OYW1lKHJvb3RQcmVmaXhDbHMsICdmYWRlJywgX3ByZXZpZXcubWFza1RyYW5zaXRpb25OYW1lKSxcbiAgICAgIHJvb3RDbGFzc05hbWU6IG1lcmdlZFJvb3RDbGFzc05hbWUsXG4gICAgICB6SW5kZXhcbiAgICB9KTtcbiAgfSwgW3ByZXZpZXddKTtcbiAgcmV0dXJuIHdyYXBDU1NWYXIoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmNJbWFnZS5QcmV2aWV3R3JvdXAsIE9iamVjdC5hc3NpZ24oe1xuICAgIHByZXZpZXc6IG1lcmdlZFByZXZpZXcsXG4gICAgcHJldmlld1ByZWZpeENsczogcHJldmlld1ByZWZpeENscyxcbiAgICBpY29uczogaWNvbnNcbiAgfSwgb3RoZXJQcm9wcykpKTtcbn07XG5leHBvcnQgZGVmYXVsdCBJbnRlcm5hbFByZXZpZXdHcm91cDsiLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUm90YXRlTGVmdE91dGxpbmVkU3ZnIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL1JvdGF0ZUxlZnRPdXRsaW5lZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gXCIuLi9jb21wb25lbnRzL0FudGRJY29uXCI7XG52YXIgUm90YXRlTGVmdE91dGxpbmVkID0gZnVuY3Rpb24gUm90YXRlTGVmdE91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFudGRJY29uLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBSb3RhdGVMZWZ0T3V0bGluZWRTdmdcbiAgfSkpO1xufTtcblxuLyoqIVtyb3RhdGUtbGVmdF0oZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTlRBaUlHaGxhV2RvZEQwaU5UQWlJR1pwYkd3OUlpTmpZV05oWTJFaUlIWnBaWGRDYjNnOUlqWTBJRFkwSURnNU5pQTRPVFlpSUdadlkzVnpZV0pzWlQwaVptRnNjMlVpSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUkrUEdSbFpuTStQSE4wZVd4bElDOCtQQzlrWldaelBqeHdZWFJvSUdROUlrMDJOeklnTkRFNFNERTBOR010TVRjdU55QXdMVE15SURFMExqTXRNeklnTXpKMk5ERTBZekFnTVRjdU55QXhOQzR6SURNeUlETXlJRE15YURVeU9HTXhOeTQzSURBZ016SXRNVFF1TXlBek1pMHpNbFkwTlRCak1DMHhOeTQzTFRFMExqTXRNekl0TXpJdE16SjZiUzAwTkNBME1ESklNVGc0VmpRNU5HZzBOREIyTXpJMmVpSWdMejQ4Y0dGMGFDQmtQU0pOT0RFNUxqTWdNekk0TGpWakxUYzRMamd0TVRBd0xqY3RNVGsyTFRFMU15NDJMVE14TkM0MkxURTFOQzR5YkMwdU1pMDJOR013TFRZdU5TMDNMall0TVRBdU1TMHhNaTQyTFRZdU1Xd3RNVEk0SURFd01XTXROQ0F6TGpFdE15NDVJRGt1TVNBd0lERXlMak5NTkRreUlETXhPQzQyWXpVdU1TQTBJREV5TGpjdU5DQXhNaTQyTFRZdU1YWXROak11T1dNeE1pNDVMakVnTWpVdU9TNDVJRE00TGpnZ01pNDFJRFF5TGpFZ05TNHlJRGd5TGpFZ01UZ3VNaUF4TVRrZ016Z3VOeUF6T0M0eElESXhMaklnTnpFdU1pQTBPUzQzSURrNExqUWdPRFF1TXlBeU55NHhJRE0wTGpjZ05EWXVOeUEzTXk0M0lEVTRMakVnTVRFMUxqaGhNekkxTGprMUlETXlOUzQ1TlNBd0lEQXhOaTQxSURFME1DNDVhRGMwTGpsak1UUXVPQzB4TURNdU5pMHhNUzR6TFRJeE15MDRNUzB6TURJdU0zb2lJQzgrUEM5emRtYyspICovXG52YXIgUmVmSWNvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKFJvdGF0ZUxlZnRPdXRsaW5lZCk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBSZWZJY29uLmRpc3BsYXlOYW1lID0gJ1JvdGF0ZUxlZnRPdXRsaW5lZCc7XG59XG5leHBvcnQgZGVmYXVsdCBSZWZJY29uOyIsICIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBSb3RhdGVMZWZ0T3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwiZGVmc1wiLCBcImF0dHJzXCI6IHt9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwic3R5bGVcIiwgXCJhdHRyc1wiOiB7fSB9XSB9LCB7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTY3MiA0MThIMTQ0Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnY0MTRjMCAxNy43IDE0LjMgMzIgMzIgMzJoNTI4YzE3LjcgMCAzMi0xNC4zIDMyLTMyVjQ1MGMwLTE3LjctMTQuMy0zMi0zMi0zMnptLTQ0IDQwMkgxODhWNDk0aDQ0MHYzMjZ6XCIgfSB9LCB7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTgxOS4zIDMyOC41Yy03OC44LTEwMC43LTE5Ni0xNTMuNi0zMTQuNi0xNTQuMmwtLjItNjRjMC02LjUtNy42LTEwLjEtMTIuNi02LjFsLTEyOCAxMDFjLTQgMy4xLTMuOSA5LjEgMCAxMi4zTDQ5MiAzMTguNmM1LjEgNCAxMi43LjQgMTIuNi02LjF2LTYzLjljMTIuOS4xIDI1LjkuOSAzOC44IDIuNSA0Mi4xIDUuMiA4Mi4xIDE4LjIgMTE5IDM4LjcgMzguMSAyMS4yIDcxLjIgNDkuNyA5OC40IDg0LjMgMjcuMSAzNC43IDQ2LjcgNzMuNyA1OC4xIDExNS44YTMyNS45NSAzMjUuOTUgMCAwMTYuNSAxNDAuOWg3NC45YzE0LjgtMTAzLjYtMTEuMy0yMTMtODEtMzAyLjN6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJyb3RhdGUtbGVmdFwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgUm90YXRlTGVmdE91dGxpbmVkO1xuIiwgImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJvdGF0ZVJpZ2h0T3V0bGluZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vUm90YXRlUmlnaHRPdXRsaW5lZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gXCIuLi9jb21wb25lbnRzL0FudGRJY29uXCI7XG52YXIgUm90YXRlUmlnaHRPdXRsaW5lZCA9IGZ1bmN0aW9uIFJvdGF0ZVJpZ2h0T3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IFJvdGF0ZVJpZ2h0T3V0bGluZWRTdmdcbiAgfSkpO1xufTtcblxuLyoqIVtyb3RhdGUtcmlnaHRdKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjNhV1IwYUQwaU5UQWlJR2hsYVdkb2REMGlOVEFpSUdacGJHdzlJaU5qWVdOaFkyRWlJSFpwWlhkQ2IzZzlJalkwSURZMElEZzVOaUE0T1RZaUlHWnZZM1Z6WVdKc1pUMGlabUZzYzJVaUlIaHRiRzV6UFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eU1EQXdMM04yWnlJK1BHUmxabk0rUEhOMGVXeGxJQzgrUEM5a1pXWnpQanh3WVhSb0lHUTlJazAwT0RBdU5TQXlOVEV1TW1NeE15MHhMallnTWpVdU9TMHlMalFnTXpndU9DMHlMalYyTmpNdU9XTXdJRFl1TlNBM0xqVWdNVEF1TVNBeE1pNDJJRFl1TVV3Mk5qQWdNakUzTGpaak5DMHpMaklnTkMwNUxqSWdNQzB4TWk0emJDMHhNamd0TVRBeFl5MDFMakV0TkMweE1pNDJMUzQwTFRFeUxqWWdOaTR4YkMwdU1pQTJOR010TVRFNExqWXVOUzB5TXpVdU9DQTFNeTQwTFRNeE5DNDJJREUxTkM0eVFUTTVPUzQzTlNBek9Ua3VOelVnTUNBd01ERXlNeTQxSURZek1XZzNOQzQ1WXkwdU9TMDFMak10TVM0M0xURXdMamN0TWk0MExURTJMakV0TlM0eExUUXlMakV0TWk0eExUZzBMakVnT0M0NUxURXlOQzQ0SURFeExqUXROREl1TWlBek1TMDRNUzR4SURVNExqRXRNVEUxTGpnZ01qY3VNaTB6TkM0M0lEWXdMak10TmpNdU1pQTVPQzQwTFRnMExqTWdNemN0TWpBdU5pQTNOaTQ1TFRNekxqWWdNVEU1TGpFdE16Z3VPSG9pSUM4K1BIQmhkR2dnWkQwaVRUZzRNQ0EwTVRoSU16VXlZeTB4Tnk0M0lEQXRNeklnTVRRdU15MHpNaUF6TW5ZME1UUmpNQ0F4Tnk0M0lERTBMak1nTXpJZ016SWdNekpvTlRJNFl6RTNMamNnTUNBek1pMHhOQzR6SURNeUxUTXlWalExTUdNd0xURTNMamN0TVRRdU15MHpNaTB6TWkwek1ucHRMVFEwSURRd01rZ3pPVFpXTkRrMGFEUTBNSFl6TWpaNklpQXZQand2YzNablBnPT0pICovXG52YXIgUmVmSWNvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKFJvdGF0ZVJpZ2h0T3V0bGluZWQpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgUmVmSWNvbi5kaXNwbGF5TmFtZSA9ICdSb3RhdGVSaWdodE91dGxpbmVkJztcbn1cbmV4cG9ydCBkZWZhdWx0IFJlZkljb247IiwgIi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxudmFyIFJvdGF0ZVJpZ2h0T3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwiZGVmc1wiLCBcImF0dHJzXCI6IHt9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwic3R5bGVcIiwgXCJhdHRyc1wiOiB7fSB9XSB9LCB7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTQ4MC41IDI1MS4yYzEzLTEuNiAyNS45LTIuNCAzOC44LTIuNXY2My45YzAgNi41IDcuNSAxMC4xIDEyLjYgNi4xTDY2MCAyMTcuNmM0LTMuMiA0LTkuMiAwLTEyLjNsLTEyOC0xMDFjLTUuMS00LTEyLjYtLjQtMTIuNiA2LjFsLS4yIDY0Yy0xMTguNi41LTIzNS44IDUzLjQtMzE0LjYgMTU0LjJBMzk5Ljc1IDM5OS43NSAwIDAwMTIzLjUgNjMxaDc0LjljLS45LTUuMy0xLjctMTAuNy0yLjQtMTYuMS01LjEtNDIuMS0yLjEtODQuMSA4LjktMTI0LjggMTEuNC00Mi4yIDMxLTgxLjEgNTguMS0xMTUuOCAyNy4yLTM0LjcgNjAuMy02My4yIDk4LjQtODQuMyAzNy0yMC42IDc2LjktMzMuNiAxMTkuMS0zOC44elwiIH0gfSwgeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk04ODAgNDE4SDM1MmMtMTcuNyAwLTMyIDE0LjMtMzIgMzJ2NDE0YzAgMTcuNyAxNC4zIDMyIDMyIDMyaDUyOGMxNy43IDAgMzItMTQuMyAzMi0zMlY0NTBjMC0xNy43LTE0LjMtMzItMzItMzJ6bS00NCA0MDJIMzk2VjQ5NGg0NDB2MzI2elwiIH0gfV0gfSwgXCJuYW1lXCI6IFwicm90YXRlLXJpZ2h0XCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnQgZGVmYXVsdCBSb3RhdGVSaWdodE91dGxpbmVkO1xuIiwgImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFN3YXBPdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9Td2FwT3V0bGluZWRcIjtcbmltcG9ydCBBbnRkSWNvbiBmcm9tIFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiO1xudmFyIFN3YXBPdXRsaW5lZCA9IGZ1bmN0aW9uIFN3YXBPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbnRkSWNvbiwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogU3dhcE91dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5cbi8qKiFbc3dhcF0oZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTlRBaUlHaGxhV2RvZEQwaU5UQWlJR1pwYkd3OUlpTmpZV05oWTJFaUlIWnBaWGRDYjNnOUlqWTBJRFkwSURnNU5pQTRPVFlpSUdadlkzVnpZV0pzWlQwaVptRnNjMlVpSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUkrUEhCaGRHZ2daRDBpVFRnME55NDVJRFU1TWtneE5USmpMVFF1TkNBd0xUZ2dNeTQyTFRnZ09IWTJNR013SURRdU5DQXpMallnT0NBNElEaG9OakExTGpKTU5qRXlMamtnT0RVeFl5MDBMakVnTlM0eUxTNDBJREV6SURZdU15QXhNMmczTWk0MVl6UXVPU0F3SURrdU5TMHlMaklnTVRJdU5pMDJMakZzTVRZNExqZ3RNakUwTGpGak1UWXVOUzB5TVNBeExqWXROVEV1T0MweU5TNHlMVFV4TGpoNlRUZzNNaUF6TlRaSU1qWTJMamhzTVRRMExqTXRNVGd6WXpRdU1TMDFMakl1TkMweE15MDJMak10TVROb0xUY3lMalZqTFRRdU9TQXdMVGt1TlNBeUxqSXRNVEl1TmlBMkxqRk1NVFV3TGprZ016Z3dMakpqTFRFMkxqVWdNakV0TVM0MklEVXhMamdnTWpVdU1TQTFNUzQ0YURZNU5tTTBMalFnTUNBNExUTXVOaUE0TFRoMkxUWXdZekF0TkM0MExUTXVOaTA0TFRndE9Ib2lJQzgrUEM5emRtYyspICovXG52YXIgUmVmSWNvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKFN3YXBPdXRsaW5lZCk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBSZWZJY29uLmRpc3BsYXlOYW1lID0gJ1N3YXBPdXRsaW5lZCc7XG59XG5leHBvcnQgZGVmYXVsdCBSZWZJY29uOyIsICIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBTd2FwT3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTg0Ny45IDU5MkgxNTJjLTQuNCAwLTggMy42LTggOHY2MGMwIDQuNCAzLjYgOCA4IDhoNjA1LjJMNjEyLjkgODUxYy00LjEgNS4yLS40IDEzIDYuMyAxM2g3Mi41YzQuOSAwIDkuNS0yLjIgMTIuNi02LjFsMTY4LjgtMjE0LjFjMTYuNS0yMSAxLjYtNTEuOC0yNS4yLTUxLjh6TTg3MiAzNTZIMjY2LjhsMTQ0LjMtMTgzYzQuMS01LjIuNC0xMy02LjMtMTNoLTcyLjVjLTQuOSAwLTkuNSAyLjItMTIuNiA2LjFMMTUwLjkgMzgwLjJjLTE2LjUgMjEtMS42IDUxLjggMjUuMSA1MS44aDY5NmM0LjQgMCA4LTMuNiA4LTh2LTYwYzAtNC40LTMuNi04LTgtOHpcIiB9IH1dIH0sIFwibmFtZVwiOiBcInN3YXBcIiwgXCJ0aGVtZVwiOiBcIm91dGxpbmVkXCIgfTtcbmV4cG9ydCBkZWZhdWx0IFN3YXBPdXRsaW5lZDtcbiIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBab29tSW5PdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9ab29tSW5PdXRsaW5lZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gXCIuLi9jb21wb25lbnRzL0FudGRJY29uXCI7XG52YXIgWm9vbUluT3V0bGluZWQgPSBmdW5jdGlvbiBab29tSW5PdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbnRkSWNvbiwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogWm9vbUluT3V0bGluZWRTdmdcbiAgfSkpO1xufTtcblxuLyoqIVt6b29tLWluXShkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUIzYVdSMGFEMGlOVEFpSUdobGFXZG9kRDBpTlRBaUlHWnBiR3c5SWlOallXTmhZMkVpSUhacFpYZENiM2c5SWpZMElEWTBJRGc1TmlBNE9UWWlJR1p2WTNWellXSnNaVDBpWm1Gc2MyVWlJSGh0Ykc1elBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5SStQSEJoZEdnZ1pEMGlUVFl6TnlBME5ETklOVEU1VmpNd09XTXdMVFF1TkMwekxqWXRPQzA0TFRob0xUWXdZeTAwTGpRZ01DMDRJRE11TmkwNElEaDJNVE0wU0RNeU5XTXROQzQwSURBdE9DQXpMall0T0NBNGRqWXdZekFnTkM0MElETXVOaUE0SURnZ09HZ3hNVGgyTVRNMFl6QWdOQzQwSURNdU5pQTRJRGdnT0dnMk1HTTBMalFnTUNBNExUTXVOaUE0TFRoV05URTVhREV4T0dNMExqUWdNQ0E0TFRNdU5pQTRMVGgyTFRZd1l6QXROQzQwTFRNdU5pMDRMVGd0T0hwdE1qZzBJRFF5TkV3M056VWdOekl4WXpFeU1pNHhMVEUwT0M0NUlERXhNeTQyTFRNMk9TNDFMVEkyTFRVd09TMHhORGd0TVRRNExqRXRNemc0TGpRdE1UUTRMakV0TlRNM0lEQXRNVFE0TGpFZ01UUTRMall0TVRRNExqRWdNemc1SURBZ05UTTNJREV6T1M0MUlERXpPUzQySURNMk1DNHhJREUwT0M0eElEVXdPU0F5Tm13eE5EWWdNVFEyWXpNdU1pQXlMamdnT0M0eklESXVPQ0F4TVNBd2JEUXpMVFF6WXpJdU9DMHlMamNnTWk0NExUY3VPQ0F3TFRFeGVrMDJPVFlnTmprMll5MHhNVGd1T0NBeE1UZ3VOeTB6TVRFdU1pQXhNVGd1TnkwME16QWdNQzB4TVRndU55MHhNVGd1T0MweE1UZ3VOeTB6TVRFdU1pQXdMVFF6TUNBeE1UZ3VPQzB4TVRndU55QXpNVEV1TWkweE1UZ3VOeUEwTXpBZ01DQXhNVGd1TnlBeE1UZ3VPQ0F4TVRndU55QXpNVEV1TWlBd0lEUXpNSG9pSUM4K1BDOXpkbWMrKSAqL1xudmFyIFJlZkljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihab29tSW5PdXRsaW5lZCk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBSZWZJY29uLmRpc3BsYXlOYW1lID0gJ1pvb21Jbk91dGxpbmVkJztcbn1cbmV4cG9ydCBkZWZhdWx0IFJlZkljb247IiwgIi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxudmFyIFpvb21Jbk91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk02MzcgNDQzSDUxOVYzMDljMC00LjQtMy42LTgtOC04aC02MGMtNC40IDAtOCAzLjYtOCA4djEzNEgzMjVjLTQuNCAwLTggMy42LTggOHY2MGMwIDQuNCAzLjYgOCA4IDhoMTE4djEzNGMwIDQuNCAzLjYgOCA4IDhoNjBjNC40IDAgOC0zLjYgOC04VjUxOWgxMThjNC40IDAgOC0zLjYgOC04di02MGMwLTQuNC0zLjYtOC04LTh6bTI4NCA0MjRMNzc1IDcyMWMxMjIuMS0xNDguOSAxMTMuNi0zNjkuNS0yNi01MDktMTQ4LTE0OC4xLTM4OC40LTE0OC4xLTUzNyAwLTE0OC4xIDE0OC42LTE0OC4xIDM4OSAwIDUzNyAxMzkuNSAxMzkuNiAzNjAuMSAxNDguMSA1MDkgMjZsMTQ2IDE0NmMzLjIgMi44IDguMyAyLjggMTEgMGw0My00M2MyLjgtMi43IDIuOC03LjggMC0xMXpNNjk2IDY5NmMtMTE4LjggMTE4LjctMzExLjIgMTE4LjctNDMwIDAtMTE4LjctMTE4LjgtMTE4LjctMzExLjIgMC00MzAgMTE4LjgtMTE4LjcgMzExLjItMTE4LjcgNDMwIDAgMTE4LjcgMTE4LjggMTE4LjcgMzExLjIgMCA0MzB6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJ6b29tLWluXCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnQgZGVmYXVsdCBab29tSW5PdXRsaW5lZDtcbiIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBab29tT3V0T3V0bGluZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vWm9vbU91dE91dGxpbmVkXCI7XG5pbXBvcnQgQW50ZEljb24gZnJvbSBcIi4uL2NvbXBvbmVudHMvQW50ZEljb25cIjtcbnZhciBab29tT3V0T3V0bGluZWQgPSBmdW5jdGlvbiBab29tT3V0T3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IFpvb21PdXRPdXRsaW5lZFN2Z1xuICB9KSk7XG59O1xuXG4vKiohW3pvb20tb3V0XShkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUIzYVdSMGFEMGlOVEFpSUdobGFXZG9kRDBpTlRBaUlHWnBiR3c5SWlOallXTmhZMkVpSUhacFpYZENiM2c5SWpZMElEWTBJRGc1TmlBNE9UWWlJR1p2WTNWellXSnNaVDBpWm1Gc2MyVWlJSGh0Ykc1elBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5SStQSEJoZEdnZ1pEMGlUVFl6TnlBME5ETklNekkxWXkwMExqUWdNQzA0SURNdU5pMDRJRGgyTmpCak1DQTBMalFnTXk0MklEZ2dPQ0E0YURNeE1tTTBMalFnTUNBNExUTXVOaUE0TFRoMkxUWXdZekF0TkM0MExUTXVOaTA0TFRndE9IcHRNamcwSURReU5FdzNOelVnTnpJeFl6RXlNaTR4TFRFME9DNDVJREV4TXk0MkxUTTJPUzQxTFRJMkxUVXdPUzB4TkRndE1UUTRMakV0TXpnNExqUXRNVFE0TGpFdE5UTTNJREF0TVRRNExqRWdNVFE0TGpZdE1UUTRMakVnTXpnNUlEQWdOVE0zSURFek9TNDFJREV6T1M0MklETTJNQzR4SURFME9DNHhJRFV3T1NBeU5td3hORFlnTVRRMll6TXVNaUF5TGpnZ09DNHpJREl1T0NBeE1TQXdiRFF6TFRRell6SXVPQzB5TGpjZ01pNDRMVGN1T0NBd0xURXhlazAyT1RZZ05qazJZeTB4TVRndU9DQXhNVGd1Tnkwek1URXVNaUF4TVRndU55MDBNekFnTUMweE1UZ3VOeTB4TVRndU9DMHhNVGd1Tnkwek1URXVNaUF3TFRRek1DQXhNVGd1T0MweE1UZ3VOeUF6TVRFdU1pMHhNVGd1TnlBME16QWdNQ0F4TVRndU55QXhNVGd1T0NBeE1UZ3VOeUF6TVRFdU1pQXdJRFF6TUhvaUlDOCtQQzl6ZG1jKykgKi9cbnZhciBSZWZJY29uID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoWm9vbU91dE91dGxpbmVkKTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFJlZkljb24uZGlzcGxheU5hbWUgPSAnWm9vbU91dE91dGxpbmVkJztcbn1cbmV4cG9ydCBkZWZhdWx0IFJlZkljb247IiwgIi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxudmFyIFpvb21PdXRPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNjM3IDQ0M0gzMjVjLTQuNCAwLTggMy42LTggOHY2MGMwIDQuNCAzLjYgOCA4IDhoMzEyYzQuNCAwIDgtMy42IDgtOHYtNjBjMC00LjQtMy42LTgtOC04em0yODQgNDI0TDc3NSA3MjFjMTIyLjEtMTQ4LjkgMTEzLjYtMzY5LjUtMjYtNTA5LTE0OC0xNDguMS0zODguNC0xNDguMS01MzcgMC0xNDguMSAxNDguNi0xNDguMSAzODkgMCA1MzcgMTM5LjUgMTM5LjYgMzYwLjEgMTQ4LjEgNTA5IDI2bDE0NiAxNDZjMy4yIDIuOCA4LjMgMi44IDExIDBsNDMtNDNjMi44LTIuNyAyLjgtNy44IDAtMTF6TTY5NiA2OTZjLTExOC44IDExOC43LTMxMS4yIDExOC43LTQzMCAwLTExOC43LTExOC44LTExOC43LTMxMS4yIDAtNDMwIDExOC44LTExOC43IDMxMS4yLTExOC43IDQzMCAwIDExOC43IDExOC44IDExOC43IDMxMS4yIDAgNDMwelwiIH0gfV0gfSwgXCJuYW1lXCI6IFwiem9vbS1vdXRcIiwgXCJ0aGVtZVwiOiBcIm91dGxpbmVkXCIgfTtcbmV4cG9ydCBkZWZhdWx0IFpvb21PdXRPdXRsaW5lZDtcbiIsICJpbXBvcnQgeyB1bml0IH0gZnJvbSAnQGFudC1kZXNpZ24vY3NzaW5qcyc7XG5pbXBvcnQgeyBGYXN0Q29sb3IgfSBmcm9tICdAYW50LWRlc2lnbi9mYXN0LWNvbG9yJztcbmltcG9ydCB7IGdlbk1vZGFsTWFza1N0eWxlIH0gZnJvbSAnLi4vLi4vbW9kYWwvc3R5bGUnO1xuaW1wb3J0IHsgdGV4dEVsbGlwc2lzIH0gZnJvbSAnLi4vLi4vc3R5bGUnO1xuaW1wb3J0IHsgaW5pdEZhZGVNb3Rpb24sIGluaXRab29tTW90aW9uIH0gZnJvbSAnLi4vLi4vc3R5bGUvbW90aW9uJztcbmltcG9ydCB7IGdlblN0eWxlSG9va3MsIG1lcmdlVG9rZW4gfSBmcm9tICcuLi8uLi90aGVtZS9pbnRlcm5hbCc7XG5leHBvcnQgY29uc3QgZ2VuQm94U3R5bGUgPSBwb3NpdGlvbiA9PiAoe1xuICBwb3NpdGlvbjogcG9zaXRpb24gfHwgJ2Fic29sdXRlJyxcbiAgaW5zZXQ6IDBcbn0pO1xuZXhwb3J0IGNvbnN0IGdlbkltYWdlTWFza1N0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgaWNvbkNscyxcbiAgICBtb3Rpb25EdXJhdGlvblNsb3csXG4gICAgcGFkZGluZ1hYUyxcbiAgICBtYXJnaW5YWFMsXG4gICAgcHJlZml4Q2xzLFxuICAgIGNvbG9yVGV4dExpZ2h0U29saWRcbiAgfSA9IHRva2VuO1xuICByZXR1cm4ge1xuICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgIGluc2V0OiAwLFxuICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsXG4gICAgY29sb3I6IGNvbG9yVGV4dExpZ2h0U29saWQsXG4gICAgYmFja2dyb3VuZDogbmV3IEZhc3RDb2xvcignIzAwMCcpLnNldEEoMC41KS50b1JnYlN0cmluZygpLFxuICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgIG9wYWNpdHk6IDAsXG4gICAgdHJhbnNpdGlvbjogYG9wYWNpdHkgJHttb3Rpb25EdXJhdGlvblNsb3d9YCxcbiAgICBbYC4ke3ByZWZpeENsc30tbWFzay1pbmZvYF06IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGV4dEVsbGlwc2lzKSwge1xuICAgICAgcGFkZGluZzogYDAgJHt1bml0KHBhZGRpbmdYWFMpfWAsXG4gICAgICBbaWNvbkNsc106IHtcbiAgICAgICAgbWFyZ2luSW5saW5lRW5kOiBtYXJnaW5YWFMsXG4gICAgICAgIHN2Zzoge1xuICAgICAgICAgIHZlcnRpY2FsQWxpZ246ICdiYXNlbGluZSdcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH07XG59O1xuZXhwb3J0IGNvbnN0IGdlblByZXZpZXdPcGVyYXRpb25zU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBwcmV2aWV3Q2xzLFxuICAgIG1vZGFsTWFza0JnLFxuICAgIHBhZGRpbmdTTSxcbiAgICBtYXJnaW5YTCxcbiAgICBtYXJnaW4sXG4gICAgcGFkZGluZ0xHLFxuICAgIHByZXZpZXdPcGVyYXRpb25Db2xvckRpc2FibGVkLFxuICAgIHByZXZpZXdPcGVyYXRpb25Ib3ZlckNvbG9yLFxuICAgIG1vdGlvbkR1cmF0aW9uU2xvdyxcbiAgICBpY29uQ2xzLFxuICAgIGNvbG9yVGV4dExpZ2h0U29saWRcbiAgfSA9IHRva2VuO1xuICBjb25zdCBvcGVyYXRpb25CZyA9IG5ldyBGYXN0Q29sb3IobW9kYWxNYXNrQmcpLnNldEEoMC4xKTtcbiAgY29uc3Qgb3BlcmF0aW9uQmdIb3ZlciA9IG9wZXJhdGlvbkJnLmNsb25lKCkuc2V0QSgwLjIpO1xuICByZXR1cm4ge1xuICAgIFtgJHtwcmV2aWV3Q2xzfS1mb290ZXJgXToge1xuICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICBib3R0b206IG1hcmdpblhMLFxuICAgICAgbGVmdDoge1xuICAgICAgICBfc2tpcF9jaGVja186IHRydWUsXG4gICAgICAgIHZhbHVlOiAnNTAlJ1xuICAgICAgfSxcbiAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLFxuICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICBjb2xvcjogdG9rZW4ucHJldmlld09wZXJhdGlvbkNvbG9yLFxuICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgtNTAlKSdcbiAgICB9LFxuICAgIFtgJHtwcmV2aWV3Q2xzfS1wcm9ncmVzc2BdOiB7XG4gICAgICBtYXJnaW5Cb3R0b206IG1hcmdpblxuICAgIH0sXG4gICAgW2Ake3ByZXZpZXdDbHN9LWNsb3NlYF06IHtcbiAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgdG9wOiBtYXJnaW5YTCxcbiAgICAgIHJpZ2h0OiB7XG4gICAgICAgIF9za2lwX2NoZWNrXzogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IG1hcmdpblhMXG4gICAgICB9LFxuICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgY29sb3I6IGNvbG9yVGV4dExpZ2h0U29saWQsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IG9wZXJhdGlvbkJnLnRvUmdiU3RyaW5nKCksXG4gICAgICBib3JkZXJSYWRpdXM6ICc1MCUnLFxuICAgICAgcGFkZGluZzogcGFkZGluZ1NNLFxuICAgICAgb3V0bGluZTogMCxcbiAgICAgIGJvcmRlcjogMCxcbiAgICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgICAgdHJhbnNpdGlvbjogYGFsbCAke21vdGlvbkR1cmF0aW9uU2xvd31gLFxuICAgICAgJyY6aG92ZXInOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogb3BlcmF0aW9uQmdIb3Zlci50b1JnYlN0cmluZygpXG4gICAgICB9LFxuICAgICAgW2AmID4gJHtpY29uQ2xzfWBdOiB7XG4gICAgICAgIGZvbnRTaXplOiB0b2tlbi5wcmV2aWV3T3BlcmF0aW9uU2l6ZVxuICAgICAgfVxuICAgIH0sXG4gICAgW2Ake3ByZXZpZXdDbHN9LW9wZXJhdGlvbnNgXToge1xuICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICBwYWRkaW5nOiBgMCAke3VuaXQocGFkZGluZ0xHKX1gLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiBvcGVyYXRpb25CZy50b1JnYlN0cmluZygpLFxuICAgICAgYm9yZGVyUmFkaXVzOiAxMDAsXG4gICAgICAnJi1vcGVyYXRpb24nOiB7XG4gICAgICAgIG1hcmdpbklubGluZVN0YXJ0OiBwYWRkaW5nU00sXG4gICAgICAgIHBhZGRpbmc6IHBhZGRpbmdTTSxcbiAgICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgICAgIHRyYW5zaXRpb246IGBhbGwgJHttb3Rpb25EdXJhdGlvblNsb3d9YCxcbiAgICAgICAgdXNlclNlbGVjdDogJ25vbmUnLFxuICAgICAgICBbYCY6bm90KCR7cHJldmlld0Nsc30tb3BlcmF0aW9ucy1vcGVyYXRpb24tZGlzYWJsZWQpOmhvdmVyID4gJHtpY29uQ2xzfWBdOiB7XG4gICAgICAgICAgY29sb3I6IHByZXZpZXdPcGVyYXRpb25Ib3ZlckNvbG9yXG4gICAgICAgIH0sXG4gICAgICAgICcmLWRpc2FibGVkJzoge1xuICAgICAgICAgIGNvbG9yOiBwcmV2aWV3T3BlcmF0aW9uQ29sb3JEaXNhYmxlZCxcbiAgICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCdcbiAgICAgICAgfSxcbiAgICAgICAgJyY6Zmlyc3Qtb2YtdHlwZSc6IHtcbiAgICAgICAgICBtYXJnaW5JbmxpbmVTdGFydDogMFxuICAgICAgICB9LFxuICAgICAgICBbYCYgPiAke2ljb25DbHN9YF06IHtcbiAgICAgICAgICBmb250U2l6ZTogdG9rZW4ucHJldmlld09wZXJhdGlvblNpemVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG5leHBvcnQgY29uc3QgZ2VuUHJldmlld1N3aXRjaFN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgbW9kYWxNYXNrQmcsXG4gICAgaWNvbkNscyxcbiAgICBwcmV2aWV3T3BlcmF0aW9uQ29sb3JEaXNhYmxlZCxcbiAgICBwcmV2aWV3Q2xzLFxuICAgIHpJbmRleFBvcHVwLFxuICAgIG1vdGlvbkR1cmF0aW9uU2xvd1xuICB9ID0gdG9rZW47XG4gIGNvbnN0IG9wZXJhdGlvbkJnID0gbmV3IEZhc3RDb2xvcihtb2RhbE1hc2tCZykuc2V0QSgwLjEpO1xuICBjb25zdCBvcGVyYXRpb25CZ0hvdmVyID0gb3BlcmF0aW9uQmcuY2xvbmUoKS5zZXRBKDAuMik7XG4gIHJldHVybiB7XG4gICAgW2Ake3ByZXZpZXdDbHN9LXN3aXRjaC1sZWZ0LCAke3ByZXZpZXdDbHN9LXN3aXRjaC1yaWdodGBdOiB7XG4gICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgIGluc2V0QmxvY2tTdGFydDogJzUwJScsXG4gICAgICB6SW5kZXg6IHRva2VuLmNhbGMoekluZGV4UG9wdXApLmFkZCgxKS5lcXVhbCgpLFxuICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsXG4gICAgICB3aWR0aDogdG9rZW4uaW1hZ2VQcmV2aWV3U3dpdGNoU2l6ZSxcbiAgICAgIGhlaWdodDogdG9rZW4uaW1hZ2VQcmV2aWV3U3dpdGNoU2l6ZSxcbiAgICAgIG1hcmdpblRvcDogdG9rZW4uY2FsYyh0b2tlbi5pbWFnZVByZXZpZXdTd2l0Y2hTaXplKS5tdWwoLTEpLmRpdigyKS5lcXVhbCgpLFxuICAgICAgY29sb3I6IHRva2VuLnByZXZpZXdPcGVyYXRpb25Db2xvcixcbiAgICAgIGJhY2tncm91bmQ6IG9wZXJhdGlvbkJnLnRvUmdiU3RyaW5nKCksXG4gICAgICBib3JkZXJSYWRpdXM6ICc1MCUnLFxuICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlWSgtNTAlKWAsXG4gICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgIHRyYW5zaXRpb246IGBhbGwgJHttb3Rpb25EdXJhdGlvblNsb3d9YCxcbiAgICAgIHVzZXJTZWxlY3Q6ICdub25lJyxcbiAgICAgICcmOmhvdmVyJzoge1xuICAgICAgICBiYWNrZ3JvdW5kOiBvcGVyYXRpb25CZ0hvdmVyLnRvUmdiU3RyaW5nKClcbiAgICAgIH0sXG4gICAgICAnJi1kaXNhYmxlZCc6IHtcbiAgICAgICAgJyYsICY6aG92ZXInOiB7XG4gICAgICAgICAgY29sb3I6IHByZXZpZXdPcGVyYXRpb25Db2xvckRpc2FibGVkLFxuICAgICAgICAgIGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQnLFxuICAgICAgICAgIFtgPiAke2ljb25DbHN9YF06IHtcbiAgICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkJ1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtgPiAke2ljb25DbHN9YF06IHtcbiAgICAgICAgZm9udFNpemU6IHRva2VuLnByZXZpZXdPcGVyYXRpb25TaXplXG4gICAgICB9XG4gICAgfSxcbiAgICBbYCR7cHJldmlld0Nsc30tc3dpdGNoLWxlZnRgXToge1xuICAgICAgaW5zZXRJbmxpbmVTdGFydDogdG9rZW4ubWFyZ2luU01cbiAgICB9LFxuICAgIFtgJHtwcmV2aWV3Q2xzfS1zd2l0Y2gtcmlnaHRgXToge1xuICAgICAgaW5zZXRJbmxpbmVFbmQ6IHRva2VuLm1hcmdpblNNXG4gICAgfVxuICB9O1xufTtcbmV4cG9ydCBjb25zdCBnZW5JbWFnZVByZXZpZXdTdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIG1vdGlvbkVhc2VPdXQsXG4gICAgcHJldmlld0NscyxcbiAgICBtb3Rpb25EdXJhdGlvblNsb3csXG4gICAgY29tcG9uZW50Q2xzXG4gIH0gPSB0b2tlbjtcbiAgcmV0dXJuIFt7XG4gICAgW2Ake2NvbXBvbmVudENsc30tcHJldmlldy1yb290YF06IHtcbiAgICAgIFtwcmV2aWV3Q2xzXToge1xuICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnXG4gICAgICB9LFxuICAgICAgW2Ake3ByZXZpZXdDbHN9LWJvZHlgXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBnZW5Cb3hTdHlsZSgpKSwge1xuICAgICAgICBvdmVyZmxvdzogJ2hpZGRlbidcbiAgICAgIH0pLFxuICAgICAgW2Ake3ByZXZpZXdDbHN9LWltZ2BdOiB7XG4gICAgICAgIG1heFdpZHRoOiAnMTAwJScsXG4gICAgICAgIG1heEhlaWdodDogJzcwJScsXG4gICAgICAgIHZlcnRpY2FsQWxpZ246ICdtaWRkbGUnLFxuICAgICAgICB0cmFuc2Zvcm06ICdzY2FsZTNkKDEsIDEsIDEpJyxcbiAgICAgICAgY3Vyc29yOiAnZ3JhYicsXG4gICAgICAgIHRyYW5zaXRpb246IGB0cmFuc2Zvcm0gJHttb3Rpb25EdXJhdGlvblNsb3d9ICR7bW90aW9uRWFzZU91dH0gMHNgLFxuICAgICAgICB1c2VyU2VsZWN0OiAnbm9uZScsXG4gICAgICAgICcmLXdyYXBwZXInOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGdlbkJveFN0eWxlKCkpLCB7XG4gICAgICAgICAgdHJhbnNpdGlvbjogYHRyYW5zZm9ybSAke21vdGlvbkR1cmF0aW9uU2xvd30gJHttb3Rpb25FYXNlT3V0fSAwc2AsXG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMzk5MTNcbiAgICAgICAgICAvLyBUYWlsd2luZENTUyB3aWxsIHJlc2V0IGltZyBkZWZhdWx0IHN0eWxlLlxuICAgICAgICAgIC8vIExldCdzIHNldCBiYWNrLlxuICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsXG4gICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAgJyYgPiAqJzoge1xuICAgICAgICAgICAgcG9pbnRlckV2ZW50czogJ2F1dG8nXG4gICAgICAgICAgfSxcbiAgICAgICAgICAnJjo6YmVmb3JlJzoge1xuICAgICAgICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICAgICAgICB3aWR0aDogMSxcbiAgICAgICAgICAgIGhlaWdodDogJzUwJScsXG4gICAgICAgICAgICBtYXJnaW5JbmxpbmVFbmQ6IC0xLFxuICAgICAgICAgICAgY29udGVudDogJ1wiXCInXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSxcbiAgICAgIFtgJHtwcmV2aWV3Q2xzfS1tb3ZpbmdgXToge1xuICAgICAgICBbYCR7cHJldmlld0Nsc30tcHJldmlldy1pbWdgXToge1xuICAgICAgICAgIGN1cnNvcjogJ2dyYWJiaW5nJyxcbiAgICAgICAgICAnJi13cmFwcGVyJzoge1xuICAgICAgICAgICAgdHJhbnNpdGlvbkR1cmF0aW9uOiAnMHMnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuICAvLyBPdmVycmlkZVxuICB7XG4gICAgW2Ake2NvbXBvbmVudENsc30tcHJldmlldy1yb290YF06IHtcbiAgICAgIFtgJHtwcmV2aWV3Q2xzfS13cmFwYF06IHtcbiAgICAgICAgekluZGV4OiB0b2tlbi56SW5kZXhQb3B1cFxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgLy8gUHJldmlldyBvcGVyYXRpb25zICYgc3dpdGNoXG4gIHtcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS1wcmV2aWV3LW9wZXJhdGlvbnMtd3JhcHBlcmBdOiB7XG4gICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgIHpJbmRleDogdG9rZW4uY2FsYyh0b2tlbi56SW5kZXhQb3B1cCkuYWRkKDEpLmVxdWFsKClcbiAgICB9LFxuICAgICcmJzogW2dlblByZXZpZXdPcGVyYXRpb25zU3R5bGUodG9rZW4pLCBnZW5QcmV2aWV3U3dpdGNoU3R5bGUodG9rZW4pXVxuICB9XTtcbn07XG5jb25zdCBnZW5JbWFnZVN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzXG4gIH0gPSB0b2tlbjtcbiAgcmV0dXJuIHtcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gaW1hZ2UgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgW2NvbXBvbmVudENsc106IHtcbiAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1pbWdgXToge1xuICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICBoZWlnaHQ6ICdhdXRvJyxcbiAgICAgICAgdmVydGljYWxBbGlnbjogJ21pZGRsZSdcbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1pbWctcGxhY2Vob2xkZXJgXToge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRva2VuLmNvbG9yQmdDb250YWluZXJEaXNhYmxlZCxcbiAgICAgICAgYmFja2dyb3VuZEltYWdlOiBcInVybCgnZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTVRZaUlHaGxhV2RvZEQwaU1UWWlJSFpwWlhkQ2IzZzlJakFnTUNBeE5pQXhOaUlnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JajQ4Y0dGMGFDQmtQU0pOTVRRdU5TQXlMalZvTFRFelFTNDFMalVnTUNBd0lEQWdNU0F6ZGpFd1lTNDFMalVnTUNBd0lEQWdMalV1TldneE0yRXVOUzQxSURBZ01DQXdJQzQxTFM0MVZqTmhMalV1TlNBd0lEQWdNQzB1TlMwdU5YcE5OUzR5T0RFZ05DNDNOV0V4SURFZ01DQXdJREVnTUNBeUlERWdNU0F3SURBZ01TQXdMVEo2YlRndU1ETWdOaTQ0TTJFdU1USTNMakV5TnlBd0lEQWdNUzB1TURneExqQXpTREl1TnpZNVlTNHhNalV1TVRJMUlEQWdNQ0F4TFM0d09UWXRMakl3TjJ3eUxqWTJNUzB6TGpFMU5tRXVNVEkyTGpFeU5pQXdJREFnTVNBdU1UYzNMUzR3TVRac0xqQXhOaTR3TVRaTU55NHdPQ0F4TUM0d09Xd3lMalEzTFRJdU9UTmhMakV5Tmk0eE1qWWdNQ0F3SURFZ0xqRTNOeTB1TURFMmJDNHdNVFV1TURFMklETXVOVGc0SURRdU1qUTBZUzR4TWpjdU1USTNJREFnTUNBeExTNHdNaTR4TnpWNklpQm1hV3hzUFNJak9FTTRRemhESWlCbWFXeHNMWEoxYkdVOUltNXZibnBsY204aUx6NDhMM04yWno0PScpXCIsXG4gICAgICAgIGJhY2tncm91bmRSZXBlYXQ6ICduby1yZXBlYXQnLFxuICAgICAgICBiYWNrZ3JvdW5kUG9zaXRpb246ICdjZW50ZXIgY2VudGVyJyxcbiAgICAgICAgYmFja2dyb3VuZFNpemU6ICczMCUnXG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tbWFza2BdOiBPYmplY3QuYXNzaWduKHt9LCBnZW5JbWFnZU1hc2tTdHlsZSh0b2tlbikpLFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tbWFzazpob3ZlcmBdOiB7XG4gICAgICAgIG9wYWNpdHk6IDFcbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1wbGFjZWhvbGRlcmBdOiBPYmplY3QuYXNzaWduKHt9LCBnZW5Cb3hTdHlsZSgpKVxuICAgIH1cbiAgfTtcbn07XG5jb25zdCBnZW5QcmV2aWV3TW90aW9uID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgcHJldmlld0Nsc1xuICB9ID0gdG9rZW47XG4gIHJldHVybiB7XG4gICAgW2Ake3ByZXZpZXdDbHN9LXJvb3RgXTogaW5pdFpvb21Nb3Rpb24odG9rZW4sICd6b29tJyksXG4gICAgJyYnOiBpbml0RmFkZU1vdGlvbih0b2tlbiwgdHJ1ZSlcbiAgfTtcbn07XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRXhwb3J0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuZXhwb3J0IGNvbnN0IHByZXBhcmVDb21wb25lbnRUb2tlbiA9IHRva2VuID0+ICh7XG4gIHpJbmRleFBvcHVwOiB0b2tlbi56SW5kZXhQb3B1cEJhc2UgKyA4MCxcbiAgcHJldmlld09wZXJhdGlvbkNvbG9yOiBuZXcgRmFzdENvbG9yKHRva2VuLmNvbG9yVGV4dExpZ2h0U29saWQpLnNldEEoMC42NSkudG9SZ2JTdHJpbmcoKSxcbiAgcHJldmlld09wZXJhdGlvbkhvdmVyQ29sb3I6IG5ldyBGYXN0Q29sb3IodG9rZW4uY29sb3JUZXh0TGlnaHRTb2xpZCkuc2V0QSgwLjg1KS50b1JnYlN0cmluZygpLFxuICBwcmV2aWV3T3BlcmF0aW9uQ29sb3JEaXNhYmxlZDogbmV3IEZhc3RDb2xvcih0b2tlbi5jb2xvclRleHRMaWdodFNvbGlkKS5zZXRBKDAuMjUpLnRvUmdiU3RyaW5nKCksXG4gIHByZXZpZXdPcGVyYXRpb25TaXplOiB0b2tlbi5mb250U2l6ZUljb24gKiAxLjUgLy8gRklYTUU6IGZvbnRTaXplSWNvbkxHXG59KTtcbmV4cG9ydCBkZWZhdWx0IGdlblN0eWxlSG9va3MoJ0ltYWdlJywgdG9rZW4gPT4ge1xuICBjb25zdCBwcmV2aWV3Q2xzID0gYCR7dG9rZW4uY29tcG9uZW50Q2xzfS1wcmV2aWV3YDtcbiAgY29uc3QgaW1hZ2VUb2tlbiA9IG1lcmdlVG9rZW4odG9rZW4sIHtcbiAgICBwcmV2aWV3Q2xzLFxuICAgIG1vZGFsTWFza0JnOiBuZXcgRmFzdENvbG9yKCcjMDAwJykuc2V0QSgwLjQ1KS50b1JnYlN0cmluZygpLFxuICAgIC8vIEZJWE1FOiBTaGFyZWQgVG9rZW5cbiAgICBpbWFnZVByZXZpZXdTd2l0Y2hTaXplOiB0b2tlbi5jb250cm9sSGVpZ2h0TEdcbiAgfSk7XG4gIHJldHVybiBbZ2VuSW1hZ2VTdHlsZShpbWFnZVRva2VuKSwgZ2VuSW1hZ2VQcmV2aWV3U3R5bGUoaW1hZ2VUb2tlbiksIGdlbk1vZGFsTWFza1N0eWxlKG1lcmdlVG9rZW4oaW1hZ2VUb2tlbiwge1xuICAgIGNvbXBvbmVudENsczogcHJldmlld0Nsc1xuICB9KSksIGdlblByZXZpZXdNb3Rpb24oaW1hZ2VUb2tlbildO1xufSwgcHJlcGFyZUNvbXBvbmVudFRva2VuKTsiLCAiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRleHQsIHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IGRldlVzZVdhcm5pbmcgfSBmcm9tICcuLi9fdXRpbC93YXJuaW5nJztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHsgRm9ybUl0ZW1JbnB1dENvbnRleHQgfSBmcm9tICcuLi9mb3JtL2NvbnRleHQnO1xuaW1wb3J0IHVzZVN0eWxlIGZyb20gJy4vc3R5bGUnO1xuLyoqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2UgYFNwYWNlLkNvbXBhY3RgICovXG5jb25zdCBHcm91cCA9IHByb3BzID0+IHtcbiAgY29uc3Qge1xuICAgIGdldFByZWZpeENscyxcbiAgICBkaXJlY3Rpb25cbiAgfSA9IHVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCk7XG4gIGNvbnN0IHtcbiAgICBwcmVmaXhDbHM6IGN1c3RvbWl6ZVByZWZpeENscyxcbiAgICBjbGFzc05hbWVcbiAgfSA9IHByb3BzO1xuICBjb25zdCBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2lucHV0LWdyb3VwJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgY29uc3QgaW5wdXRQcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2lucHV0Jyk7XG4gIGNvbnN0IFt3cmFwQ1NTVmFyLCBoYXNoSWQsIGNzc1ZhckNsc10gPSB1c2VTdHlsZShpbnB1dFByZWZpeENscyk7XG4gIGNvbnN0IGNscyA9IGNsYXNzTmFtZXMocHJlZml4Q2xzLCBjc3NWYXJDbHMsIHtcbiAgICBbYCR7cHJlZml4Q2xzfS1sZ2BdOiBwcm9wcy5zaXplID09PSAnbGFyZ2UnLFxuICAgIFtgJHtwcmVmaXhDbHN9LXNtYF06IHByb3BzLnNpemUgPT09ICdzbWFsbCcsXG4gICAgW2Ake3ByZWZpeENsc30tY29tcGFjdGBdOiBwcm9wcy5jb21wYWN0LFxuICAgIFtgJHtwcmVmaXhDbHN9LXJ0bGBdOiBkaXJlY3Rpb24gPT09ICdydGwnXG4gIH0sIGhhc2hJZCwgY2xhc3NOYW1lKTtcbiAgY29uc3QgZm9ybUl0ZW1Db250ZXh0ID0gdXNlQ29udGV4dChGb3JtSXRlbUlucHV0Q29udGV4dCk7XG4gIGNvbnN0IGdyb3VwRm9ybUl0ZW1Db250ZXh0ID0gdXNlTWVtbygoKSA9PiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGZvcm1JdGVtQ29udGV4dCksIHtcbiAgICBpc0Zvcm1JdGVtSW5wdXQ6IGZhbHNlXG4gIH0pLCBbZm9ybUl0ZW1Db250ZXh0XSk7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgY29uc3Qgd2FybmluZyA9IGRldlVzZVdhcm5pbmcoJ0lucHV0Lkdyb3VwJyk7XG4gICAgd2FybmluZy5kZXByZWNhdGVkKGZhbHNlLCAnSW5wdXQuR3JvdXAnLCAnU3BhY2UuQ29tcGFjdCcpO1xuICB9XG4gIHJldHVybiB3cmFwQ1NTVmFyKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbHMsXG4gICAgc3R5bGU6IHByb3BzLnN0eWxlLFxuICAgIG9uTW91c2VFbnRlcjogcHJvcHMub25Nb3VzZUVudGVyLFxuICAgIG9uTW91c2VMZWF2ZTogcHJvcHMub25Nb3VzZUxlYXZlLFxuICAgIG9uRm9jdXM6IHByb3BzLm9uRm9jdXMsXG4gICAgb25CbHVyOiBwcm9wcy5vbkJsdXJcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRm9ybUl0ZW1JbnB1dENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogZ3JvdXBGb3JtSXRlbUNvbnRleHRcbiAgfSwgcHJvcHMuY2hpbGRyZW4pKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgR3JvdXA7IiwgIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHVzZUV2ZW50IGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZUV2ZW50XCI7XG5pbXBvcnQgcGlja0F0dHJzIGZyb20gXCJyYy11dGlsL2VzL3BpY2tBdHRyc1wiO1xuaW1wb3J0IHsgZ2V0TWVyZ2VkU3RhdHVzIH0gZnJvbSAnLi4vLi4vX3V0aWwvc3RhdHVzVXRpbHMnO1xuaW1wb3J0IHsgZGV2VXNlV2FybmluZyB9IGZyb20gJy4uLy4uL191dGlsL3dhcm5pbmcnO1xuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uLy4uL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgdXNlU2l6ZSBmcm9tICcuLi8uLi9jb25maWctcHJvdmlkZXIvaG9va3MvdXNlU2l6ZSc7XG5pbXBvcnQgeyBGb3JtSXRlbUlucHV0Q29udGV4dCB9IGZyb20gJy4uLy4uL2Zvcm0vY29udGV4dCc7XG5pbXBvcnQgdXNlU3R5bGUgZnJvbSAnLi4vc3R5bGUvb3RwJztcbmltcG9ydCBPVFBJbnB1dCBmcm9tICcuL09UUElucHV0JztcbmZ1bmN0aW9uIHN0clRvQXJyKHN0cikge1xuICByZXR1cm4gKHN0ciB8fCAnJykuc3BsaXQoJycpO1xufVxuY29uc3QgU2VwYXJhdG9yID0gcHJvcHMgPT4ge1xuICBjb25zdCB7XG4gICAgaW5kZXgsXG4gICAgcHJlZml4Q2xzLFxuICAgIHNlcGFyYXRvclxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IHNlcGFyYXRvck5vZGUgPSB0eXBlb2Ygc2VwYXJhdG9yID09PSAnZnVuY3Rpb24nID8gc2VwYXJhdG9yKGluZGV4KSA6IHNlcGFyYXRvcjtcbiAgaWYgKCFzZXBhcmF0b3JOb2RlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBgJHtwcmVmaXhDbHN9LXNlcGFyYXRvcmBcbiAgfSwgc2VwYXJhdG9yTm9kZSk7XG59O1xuY29uc3QgT1RQID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHByb3BzLCByZWYpID0+IHtcbiAgY29uc3Qge1xuICAgICAgcHJlZml4Q2xzOiBjdXN0b21pemVQcmVmaXhDbHMsXG4gICAgICBsZW5ndGggPSA2LFxuICAgICAgc2l6ZTogY3VzdG9tU2l6ZSxcbiAgICAgIGRlZmF1bHRWYWx1ZSxcbiAgICAgIHZhbHVlLFxuICAgICAgb25DaGFuZ2UsXG4gICAgICBmb3JtYXR0ZXIsXG4gICAgICBzZXBhcmF0b3IsXG4gICAgICB2YXJpYW50LFxuICAgICAgZGlzYWJsZWQsXG4gICAgICBzdGF0dXM6IGN1c3RvbVN0YXR1cyxcbiAgICAgIGF1dG9Gb2N1cyxcbiAgICAgIG1hc2ssXG4gICAgICB0eXBlLFxuICAgICAgb25JbnB1dCxcbiAgICAgIGlucHV0TW9kZVxuICAgIH0gPSBwcm9wcyxcbiAgICByZXN0UHJvcHMgPSBfX3Jlc3QocHJvcHMsIFtcInByZWZpeENsc1wiLCBcImxlbmd0aFwiLCBcInNpemVcIiwgXCJkZWZhdWx0VmFsdWVcIiwgXCJ2YWx1ZVwiLCBcIm9uQ2hhbmdlXCIsIFwiZm9ybWF0dGVyXCIsIFwic2VwYXJhdG9yXCIsIFwidmFyaWFudFwiLCBcImRpc2FibGVkXCIsIFwic3RhdHVzXCIsIFwiYXV0b0ZvY3VzXCIsIFwibWFza1wiLCBcInR5cGVcIiwgXCJvbklucHV0XCIsIFwiaW5wdXRNb2RlXCJdKTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBjb25zdCB3YXJuaW5nID0gZGV2VXNlV2FybmluZygnSW5wdXQuT1RQJyk7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyghKHR5cGVvZiBtYXNrID09PSAnc3RyaW5nJyAmJiBtYXNrLmxlbmd0aCA+IDEpLCAndXNhZ2UnLCAnYG1hc2tgIHByb3Agc2hvdWxkIGJlIGEgc2luZ2xlIGNoYXJhY3Rlci4nKSA6IHZvaWQgMDtcbiAgfVxuICBjb25zdCB7XG4gICAgZ2V0UHJlZml4Q2xzLFxuICAgIGRpcmVjdGlvblxuICB9ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KTtcbiAgY29uc3QgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdvdHAnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICBjb25zdCBkb21BdHRycyA9IHBpY2tBdHRycyhyZXN0UHJvcHMsIHtcbiAgICBhcmlhOiB0cnVlLFxuICAgIGRhdGE6IHRydWUsXG4gICAgYXR0cjogdHJ1ZVxuICB9KTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBSb290ID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gU3R5bGVcbiAgY29uc3QgW3dyYXBDU1NWYXIsIGhhc2hJZCwgY3NzVmFyQ2xzXSA9IHVzZVN0eWxlKHByZWZpeENscyk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gU2l6ZSA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IG1lcmdlZFNpemUgPSB1c2VTaXplKGN0eCA9PiBjdXN0b21TaXplICE9PSBudWxsICYmIGN1c3RvbVNpemUgIT09IHZvaWQgMCA/IGN1c3RvbVNpemUgOiBjdHgpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gU3RhdHVzID09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBmb3JtQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoRm9ybUl0ZW1JbnB1dENvbnRleHQpO1xuICBjb25zdCBtZXJnZWRTdGF0dXMgPSBnZXRNZXJnZWRTdGF0dXMoZm9ybUNvbnRleHQuc3RhdHVzLCBjdXN0b21TdGF0dXMpO1xuICBjb25zdCBwcm94eUZvcm1Db250ZXh0ID0gUmVhY3QudXNlTWVtbygoKSA9PiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGZvcm1Db250ZXh0KSwge1xuICAgIHN0YXR1czogbWVyZ2VkU3RhdHVzLFxuICAgIGhhc0ZlZWRiYWNrOiBmYWxzZSxcbiAgICBmZWVkYmFja0ljb246IG51bGxcbiAgfSksIFtmb3JtQ29udGV4dCwgbWVyZ2VkU3RhdHVzXSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gUmVmcyA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IGNvbnRhaW5lclJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3QgcmVmcyA9IFJlYWN0LnVzZVJlZih7fSk7XG4gIFJlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiAoe1xuICAgIGZvY3VzOiAoKSA9PiB7XG4gICAgICB2YXIgX2E7XG4gICAgICAoX2EgPSByZWZzLmN1cnJlbnRbMF0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5mb2N1cygpO1xuICAgIH0sXG4gICAgYmx1cjogKCkgPT4ge1xuICAgICAgdmFyIF9hO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAoX2EgPSByZWZzLmN1cnJlbnRbaV0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ibHVyKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBuYXRpdmVFbGVtZW50OiBjb250YWluZXJSZWYuY3VycmVudFxuICB9KSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09IEZvcm1hdHRlciA9PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IGludGVybmFsRm9ybWF0dGVyID0gdHh0ID0+IGZvcm1hdHRlciA/IGZvcm1hdHRlcih0eHQpIDogdHh0O1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gVmFsdWVzID09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBbdmFsdWVDZWxscywgc2V0VmFsdWVDZWxsc10gPSBSZWFjdC51c2VTdGF0ZSgoKSA9PiBzdHJUb0FycihpbnRlcm5hbEZvcm1hdHRlcihkZWZhdWx0VmFsdWUgfHwgJycpKSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNldFZhbHVlQ2VsbHMoc3RyVG9BcnIodmFsdWUpKTtcbiAgICB9XG4gIH0sIFt2YWx1ZV0pO1xuICBjb25zdCB0cmlnZ2VyVmFsdWVDZWxsc0NoYW5nZSA9IHVzZUV2ZW50KG5leHRWYWx1ZUNlbGxzID0+IHtcbiAgICBzZXRWYWx1ZUNlbGxzKG5leHRWYWx1ZUNlbGxzKTtcbiAgICBpZiAob25JbnB1dCkge1xuICAgICAgb25JbnB1dChuZXh0VmFsdWVDZWxscyk7XG4gICAgfVxuICAgIC8vIFRyaWdnZXIgaWYgYWxsIGNlbGxzIGFyZSBmaWxsZWRcbiAgICBpZiAob25DaGFuZ2UgJiYgbmV4dFZhbHVlQ2VsbHMubGVuZ3RoID09PSBsZW5ndGggJiYgbmV4dFZhbHVlQ2VsbHMuZXZlcnkoYyA9PiBjKSAmJiBuZXh0VmFsdWVDZWxscy5zb21lKChjLCBpbmRleCkgPT4gdmFsdWVDZWxsc1tpbmRleF0gIT09IGMpKSB7XG4gICAgICBvbkNoYW5nZShuZXh0VmFsdWVDZWxscy5qb2luKCcnKSk7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgcGF0Y2hWYWx1ZSA9IHVzZUV2ZW50KChpbmRleCwgdHh0KSA9PiB7XG4gICAgbGV0IG5leHRDZWxscyA9IF90b0NvbnN1bWFibGVBcnJheSh2YWx1ZUNlbGxzKTtcbiAgICAvLyBGaWxsIGNlbGxzIHRpbGwgaW5kZXhcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGV4OyBpICs9IDEpIHtcbiAgICAgIGlmICghbmV4dENlbGxzW2ldKSB7XG4gICAgICAgIG5leHRDZWxsc1tpXSA9ICcnO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHh0Lmxlbmd0aCA8PSAxKSB7XG4gICAgICBuZXh0Q2VsbHNbaW5kZXhdID0gdHh0O1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0Q2VsbHMgPSBuZXh0Q2VsbHMuc2xpY2UoMCwgaW5kZXgpLmNvbmNhdChzdHJUb0Fycih0eHQpKTtcbiAgICB9XG4gICAgbmV4dENlbGxzID0gbmV4dENlbGxzLnNsaWNlKDAsIGxlbmd0aCk7XG4gICAgLy8gQ2xlYW4gdGhlIGxhc3QgZW1wdHkgY2VsbFxuICAgIGZvciAobGV0IGkgPSBuZXh0Q2VsbHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICAgIGlmIChuZXh0Q2VsbHNbaV0pIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBuZXh0Q2VsbHMucG9wKCk7XG4gICAgfVxuICAgIC8vIEZvcm1hdCBpZiBuZWVkZWRcbiAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IGludGVybmFsRm9ybWF0dGVyKG5leHRDZWxscy5tYXAoYyA9PiBjIHx8ICcgJykuam9pbignJykpO1xuICAgIG5leHRDZWxscyA9IHN0clRvQXJyKGZvcm1hdHRlZFZhbHVlKS5tYXAoKGMsIGkpID0+IHtcbiAgICAgIGlmIChjID09PSAnICcgJiYgIW5leHRDZWxsc1tpXSkge1xuICAgICAgICByZXR1cm4gbmV4dENlbGxzW2ldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGM7XG4gICAgfSk7XG4gICAgcmV0dXJuIG5leHRDZWxscztcbiAgfSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBDaGFuZ2UgPT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IG9uSW5wdXRDaGFuZ2UgPSAoaW5kZXgsIHR4dCkgPT4ge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBuZXh0Q2VsbHMgPSBwYXRjaFZhbHVlKGluZGV4LCB0eHQpO1xuICAgIGNvbnN0IG5leHRJbmRleCA9IE1hdGgubWluKGluZGV4ICsgdHh0Lmxlbmd0aCwgbGVuZ3RoIC0gMSk7XG4gICAgaWYgKG5leHRJbmRleCAhPT0gaW5kZXggJiYgbmV4dENlbGxzW2luZGV4XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAoX2EgPSByZWZzLmN1cnJlbnRbbmV4dEluZGV4XSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmZvY3VzKCk7XG4gICAgfVxuICAgIHRyaWdnZXJWYWx1ZUNlbGxzQ2hhbmdlKG5leHRDZWxscyk7XG4gIH07XG4gIGNvbnN0IG9uSW5wdXRBY3RpdmVDaGFuZ2UgPSBuZXh0SW5kZXggPT4ge1xuICAgIHZhciBfYTtcbiAgICAoX2EgPSByZWZzLmN1cnJlbnRbbmV4dEluZGV4XSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmZvY3VzKCk7XG4gIH07XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IGlucHV0U2hhcmVkUHJvcHMgPSB7XG4gICAgdmFyaWFudCxcbiAgICBkaXNhYmxlZCxcbiAgICBzdGF0dXM6IG1lcmdlZFN0YXR1cyxcbiAgICBtYXNrLFxuICAgIHR5cGUsXG4gICAgaW5wdXRNb2RlXG4gIH07XG4gIHJldHVybiB3cmFwQ1NTVmFyKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIE9iamVjdC5hc3NpZ24oe30sIGRvbUF0dHJzLCB7XG4gICAgcmVmOiBjb250YWluZXJSZWYsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKHByZWZpeENscywge1xuICAgICAgW2Ake3ByZWZpeENsc30tc21gXTogbWVyZ2VkU2l6ZSA9PT0gJ3NtYWxsJyxcbiAgICAgIFtgJHtwcmVmaXhDbHN9LWxnYF06IG1lcmdlZFNpemUgPT09ICdsYXJnZScsXG4gICAgICBbYCR7cHJlZml4Q2xzfS1ydGxgXTogZGlyZWN0aW9uID09PSAncnRsJ1xuICAgIH0sIGNzc1ZhckNscywgaGFzaElkKVxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRm9ybUl0ZW1JbnB1dENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogcHJveHlGb3JtQ29udGV4dFxuICB9LCBBcnJheS5mcm9tKHtcbiAgICBsZW5ndGhcbiAgfSkubWFwKChfLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGtleSA9IGBvdHAtJHtpbmRleH1gO1xuICAgIGNvbnN0IHNpbmdsZVZhbHVlID0gdmFsdWVDZWxsc1tpbmRleF0gfHwgJyc7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCB7XG4gICAgICBrZXk6IGtleVxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE9UUElucHV0LCBPYmplY3QuYXNzaWduKHtcbiAgICAgIHJlZjogaW5wdXRFbGUgPT4ge1xuICAgICAgICByZWZzLmN1cnJlbnRbaW5kZXhdID0gaW5wdXRFbGU7XG4gICAgICB9LFxuICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgc2l6ZTogbWVyZ2VkU2l6ZSxcbiAgICAgIGh0bWxTaXplOiAxLFxuICAgICAgY2xhc3NOYW1lOiBgJHtwcmVmaXhDbHN9LWlucHV0YCxcbiAgICAgIG9uQ2hhbmdlOiBvbklucHV0Q2hhbmdlLFxuICAgICAgdmFsdWU6IHNpbmdsZVZhbHVlLFxuICAgICAgb25BY3RpdmVDaGFuZ2U6IG9uSW5wdXRBY3RpdmVDaGFuZ2UsXG4gICAgICBhdXRvRm9jdXM6IGluZGV4ID09PSAwICYmIGF1dG9Gb2N1c1xuICAgIH0sIGlucHV0U2hhcmVkUHJvcHMpKSwgaW5kZXggPCBsZW5ndGggLSAxICYmICgvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTZXBhcmF0b3IsIHtcbiAgICAgIHNlcGFyYXRvcjogc2VwYXJhdG9yLFxuICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHNcbiAgICB9KSkpO1xuICB9KSkpKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgT1RQOyIsICJpbXBvcnQgeyBnZW5TdHlsZUhvb2tzLCBtZXJnZVRva2VuIH0gZnJvbSAnLi4vLi4vdGhlbWUvaW50ZXJuYWwnO1xuaW1wb3J0IHsgaW5pdENvbXBvbmVudFRva2VuLCBpbml0SW5wdXRUb2tlbiB9IGZyb20gJy4vdG9rZW4nO1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBPVFAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmNvbnN0IGdlbk9UUFN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzLFxuICAgIHBhZGRpbmdYU1xuICB9ID0gdG9rZW47XG4gIHJldHVybiB7XG4gICAgW2NvbXBvbmVudENsc106IHtcbiAgICAgIGRpc3BsYXk6ICdpbmxpbmUtZmxleCcsXG4gICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgIGZsZXhXcmFwOiAnbm93cmFwJyxcbiAgICAgIGNvbHVtbkdhcDogcGFkZGluZ1hTLFxuICAgICAgJyYtcnRsJzoge1xuICAgICAgICBkaXJlY3Rpb246ICdydGwnXG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30taW5wdXRgXToge1xuICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgICBwYWRkaW5nSW5saW5lOiB0b2tlbi5wYWRkaW5nWFhTXG4gICAgICB9LFxuICAgICAgLy8gPT09PT09PT09PT09PT09PT0gU2l6ZSA9PT09PT09PT09PT09PT09PVxuICAgICAgW2AmJHtjb21wb25lbnRDbHN9LXNtICR7Y29tcG9uZW50Q2xzfS1pbnB1dGBdOiB7XG4gICAgICAgIHBhZGRpbmdJbmxpbmU6IHRva2VuLmNhbGModG9rZW4ucGFkZGluZ1hYUykuZGl2KDIpLmVxdWFsKClcbiAgICAgIH0sXG4gICAgICBbYCYke2NvbXBvbmVudENsc30tbGcgJHtjb21wb25lbnRDbHN9LWlucHV0YF06IHtcbiAgICAgICAgcGFkZGluZ0lubGluZTogdG9rZW4ucGFkZGluZ1hTXG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFeHBvcnQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgZGVmYXVsdCBnZW5TdHlsZUhvb2tzKFsnSW5wdXQnLCAnT1RQJ10sIHRva2VuID0+IHtcbiAgY29uc3QgaW5wdXRUb2tlbiA9IG1lcmdlVG9rZW4odG9rZW4sIGluaXRJbnB1dFRva2VuKHRva2VuKSk7XG4gIHJldHVybiBbZ2VuT1RQU3R5bGUoaW5wdXRUb2tlbildO1xufSwgaW5pdENvbXBvbmVudFRva2VuKTsiLCAiXCJ1c2UgY2xpZW50XCI7XG5cbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgcmFmIGZyb20gXCJyYy11dGlsL2VzL3JhZlwiO1xuaW1wb3J0IElucHV0IGZyb20gJy4uL0lucHV0JztcbmNvbnN0IE9UUElucHV0ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHByb3BzLCByZWYpID0+IHtcbiAgY29uc3Qge1xuICAgICAgdmFsdWUsXG4gICAgICBvbkNoYW5nZSxcbiAgICAgIG9uQWN0aXZlQ2hhbmdlLFxuICAgICAgaW5kZXgsXG4gICAgICBtYXNrXG4gICAgfSA9IHByb3BzLFxuICAgIHJlc3RQcm9wcyA9IF9fcmVzdChwcm9wcywgW1widmFsdWVcIiwgXCJvbkNoYW5nZVwiLCBcIm9uQWN0aXZlQ2hhbmdlXCIsIFwiaW5kZXhcIiwgXCJtYXNrXCJdKTtcbiAgY29uc3QgaW50ZXJuYWxWYWx1ZSA9IHZhbHVlICYmIHR5cGVvZiBtYXNrID09PSAnc3RyaW5nJyA/IG1hc2sgOiB2YWx1ZTtcbiAgY29uc3Qgb25JbnRlcm5hbENoYW5nZSA9IGUgPT4ge1xuICAgIG9uQ2hhbmdlKGluZGV4LCBlLnRhcmdldC52YWx1ZSk7XG4gIH07XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IFJlZiA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3QgaW5wdXRSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIFJlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiBpbnB1dFJlZi5jdXJyZW50KTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBGb2N1cyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBzeW5jU2VsZWN0aW9uID0gKCkgPT4ge1xuICAgIHJhZigoKSA9PiB7XG4gICAgICB2YXIgX2E7XG4gICAgICBjb25zdCBpbnB1dEVsZSA9IChfYSA9IGlucHV0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5pbnB1dDtcbiAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBpbnB1dEVsZSAmJiBpbnB1dEVsZSkge1xuICAgICAgICBpbnB1dEVsZS5zZWxlY3QoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IEtleWJvYXJkID09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBvbkludGVybmFsS2V5RG93biA9IGV2ZW50ID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBrZXksXG4gICAgICBjdHJsS2V5LFxuICAgICAgbWV0YUtleVxuICAgIH0gPSBldmVudDtcbiAgICBpZiAoa2V5ID09PSAnQXJyb3dMZWZ0Jykge1xuICAgICAgb25BY3RpdmVDaGFuZ2UoaW5kZXggLSAxKTtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ0Fycm93UmlnaHQnKSB7XG4gICAgICBvbkFjdGl2ZUNoYW5nZShpbmRleCArIDEpO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSAneicgJiYgKGN0cmxLZXkgfHwgbWV0YUtleSkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIHN5bmNTZWxlY3Rpb24oKTtcbiAgfTtcbiAgY29uc3Qgb25JbnRlcm5hbEtleVVwID0gZSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSAnQmFja3NwYWNlJyAmJiAhdmFsdWUpIHtcbiAgICAgIG9uQWN0aXZlQ2hhbmdlKGluZGV4IC0gMSk7XG4gICAgfVxuICAgIHN5bmNTZWxlY3Rpb24oKTtcbiAgfTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSW5wdXQsIE9iamVjdC5hc3NpZ24oe1xuICAgIHR5cGU6IG1hc2sgPT09IHRydWUgPyAncGFzc3dvcmQnIDogJ3RleHQnXG4gIH0sIHJlc3RQcm9wcywge1xuICAgIHJlZjogaW5wdXRSZWYsXG4gICAgdmFsdWU6IGludGVybmFsVmFsdWUsXG4gICAgb25JbnB1dDogb25JbnRlcm5hbENoYW5nZSxcbiAgICBvbkZvY3VzOiBzeW5jU2VsZWN0aW9uLFxuICAgIG9uS2V5RG93bjogb25JbnRlcm5hbEtleURvd24sXG4gICAgb25LZXlVcDogb25JbnRlcm5hbEtleVVwLFxuICAgIG9uTW91c2VEb3duOiBzeW5jU2VsZWN0aW9uLFxuICAgIG9uTW91c2VVcDogc3luY1NlbGVjdGlvblxuICB9KSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IE9UUElucHV0OyIsICJcInVzZSBjbGllbnRcIjtcblxudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRXllSW52aXNpYmxlT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0V5ZUludmlzaWJsZU91dGxpbmVkXCI7XG5pbXBvcnQgRXllT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0V5ZU91dGxpbmVkXCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBvbWl0IGZyb20gXCJyYy11dGlsL2VzL29taXRcIjtcbmltcG9ydCB7IGNvbXBvc2VSZWYgfSBmcm9tIFwicmMtdXRpbC9lcy9yZWZcIjtcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IERpc2FibGVkQ29udGV4dCBmcm9tICcuLi9jb25maWctcHJvdmlkZXIvRGlzYWJsZWRDb250ZXh0JztcbmltcG9ydCB1c2VSZW1vdmVQYXNzd29yZFRpbWVvdXQgZnJvbSAnLi9ob29rcy91c2VSZW1vdmVQYXNzd29yZFRpbWVvdXQnO1xuaW1wb3J0IElucHV0IGZyb20gJy4vSW5wdXQnO1xuY29uc3QgZGVmYXVsdEljb25SZW5kZXIgPSB2aXNpYmxlID0+IHZpc2libGUgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFeWVPdXRsaW5lZCwgbnVsbCkgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFeWVJbnZpc2libGVPdXRsaW5lZCwgbnVsbCk7XG5jb25zdCBhY3Rpb25NYXAgPSB7XG4gIGNsaWNrOiAnb25DbGljaycsXG4gIGhvdmVyOiAnb25Nb3VzZU92ZXInXG59O1xuY29uc3QgUGFzc3dvcmQgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIHJlZikgPT4ge1xuICBjb25zdCB7XG4gICAgZGlzYWJsZWQ6IGN1c3RvbURpc2FibGVkLFxuICAgIGFjdGlvbiA9ICdjbGljaycsXG4gICAgdmlzaWJpbGl0eVRvZ2dsZSA9IHRydWUsXG4gICAgaWNvblJlbmRlciA9IGRlZmF1bHRJY29uUmVuZGVyXG4gIH0gPSBwcm9wcztcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09IERpc2FibGVkID09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBkaXNhYmxlZCA9IFJlYWN0LnVzZUNvbnRleHQoRGlzYWJsZWRDb250ZXh0KTtcbiAgY29uc3QgbWVyZ2VkRGlzYWJsZWQgPSBjdXN0b21EaXNhYmxlZCAhPT0gbnVsbCAmJiBjdXN0b21EaXNhYmxlZCAhPT0gdm9pZCAwID8gY3VzdG9tRGlzYWJsZWQgOiBkaXNhYmxlZDtcbiAgY29uc3QgdmlzaWJpbGl0eUNvbnRyb2xsZWQgPSB0eXBlb2YgdmlzaWJpbGl0eVRvZ2dsZSA9PT0gJ29iamVjdCcgJiYgdmlzaWJpbGl0eVRvZ2dsZS52aXNpYmxlICE9PSB1bmRlZmluZWQ7XG4gIGNvbnN0IFt2aXNpYmxlLCBzZXRWaXNpYmxlXSA9IHVzZVN0YXRlKCgpID0+IHZpc2liaWxpdHlDb250cm9sbGVkID8gdmlzaWJpbGl0eVRvZ2dsZS52aXNpYmxlIDogZmFsc2UpO1xuICBjb25zdCBpbnB1dFJlZiA9IHVzZVJlZihudWxsKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAodmlzaWJpbGl0eUNvbnRyb2xsZWQpIHtcbiAgICAgIHNldFZpc2libGUodmlzaWJpbGl0eVRvZ2dsZS52aXNpYmxlKTtcbiAgICB9XG4gIH0sIFt2aXNpYmlsaXR5Q29udHJvbGxlZCwgdmlzaWJpbGl0eVRvZ2dsZV0pO1xuICAvLyBSZW1vdmUgUGFzc3dvcmQgdmFsdWVcbiAgY29uc3QgcmVtb3ZlUGFzc3dvcmRUaW1lb3V0ID0gdXNlUmVtb3ZlUGFzc3dvcmRUaW1lb3V0KGlucHV0UmVmKTtcbiAgY29uc3Qgb25WaXNpYmxlQ2hhbmdlID0gKCkgPT4ge1xuICAgIHZhciBfYTtcbiAgICBpZiAobWVyZ2VkRGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHZpc2libGUpIHtcbiAgICAgIHJlbW92ZVBhc3N3b3JkVGltZW91dCgpO1xuICAgIH1cbiAgICBjb25zdCBuZXh0VmlzaWJsZSA9ICF2aXNpYmxlO1xuICAgIHNldFZpc2libGUobmV4dFZpc2libGUpO1xuICAgIGlmICh0eXBlb2YgdmlzaWJpbGl0eVRvZ2dsZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIChfYSA9IHZpc2liaWxpdHlUb2dnbGUub25WaXNpYmxlQ2hhbmdlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbCh2aXNpYmlsaXR5VG9nZ2xlLCBuZXh0VmlzaWJsZSk7XG4gICAgfVxuICB9O1xuICBjb25zdCBnZXRJY29uID0gcHJlZml4Q2xzID0+IHtcbiAgICBjb25zdCBpY29uVHJpZ2dlciA9IGFjdGlvbk1hcFthY3Rpb25dIHx8ICcnO1xuICAgIGNvbnN0IGljb24gPSBpY29uUmVuZGVyKHZpc2libGUpO1xuICAgIGNvbnN0IGljb25Qcm9wcyA9IHtcbiAgICAgIFtpY29uVHJpZ2dlcl06IG9uVmlzaWJsZUNoYW5nZSxcbiAgICAgIGNsYXNzTmFtZTogYCR7cHJlZml4Q2xzfS1pY29uYCxcbiAgICAgIGtleTogJ3Bhc3N3b3JkSWNvbicsXG4gICAgICBvbk1vdXNlRG93bjogZSA9PiB7XG4gICAgICAgIC8vIFByZXZlbnQgZm9jdXNlZCBzdGF0ZSBsb3N0XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzE1MTczXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH0sXG4gICAgICBvbk1vdXNlVXA6IGUgPT4ge1xuICAgICAgICAvLyBQcmV2ZW50IGNhcmV0IHBvc2l0aW9uIGNoYW5nZVxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8yMzUyNFxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudCgvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoaWNvbikgPyBpY29uIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIGljb24pLCBpY29uUHJvcHMpO1xuICB9O1xuICBjb25zdCB7XG4gICAgICBjbGFzc05hbWUsXG4gICAgICBwcmVmaXhDbHM6IGN1c3RvbWl6ZVByZWZpeENscyxcbiAgICAgIGlucHV0UHJlZml4Q2xzOiBjdXN0b21pemVJbnB1dFByZWZpeENscyxcbiAgICAgIHNpemVcbiAgICB9ID0gcHJvcHMsXG4gICAgcmVzdFByb3BzID0gX19yZXN0KHByb3BzLCBbXCJjbGFzc05hbWVcIiwgXCJwcmVmaXhDbHNcIiwgXCJpbnB1dFByZWZpeENsc1wiLCBcInNpemVcIl0pO1xuICBjb25zdCB7XG4gICAgZ2V0UHJlZml4Q2xzXG4gIH0gPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpO1xuICBjb25zdCBpbnB1dFByZWZpeENscyA9IGdldFByZWZpeENscygnaW5wdXQnLCBjdXN0b21pemVJbnB1dFByZWZpeENscyk7XG4gIGNvbnN0IHByZWZpeENscyA9IGdldFByZWZpeENscygnaW5wdXQtcGFzc3dvcmQnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICBjb25zdCBzdWZmaXhJY29uID0gdmlzaWJpbGl0eVRvZ2dsZSAmJiBnZXRJY29uKHByZWZpeENscyk7XG4gIGNvbnN0IGlucHV0Q2xhc3NOYW1lID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIGNsYXNzTmFtZSwge1xuICAgIFtgJHtwcmVmaXhDbHN9LSR7c2l6ZX1gXTogISFzaXplXG4gIH0pO1xuICBjb25zdCBvbWl0dGVkUHJvcHMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9taXQocmVzdFByb3BzLCBbJ3N1ZmZpeCcsICdpY29uUmVuZGVyJywgJ3Zpc2liaWxpdHlUb2dnbGUnXSkpLCB7XG4gICAgdHlwZTogdmlzaWJsZSA/ICd0ZXh0JyA6ICdwYXNzd29yZCcsXG4gICAgY2xhc3NOYW1lOiBpbnB1dENsYXNzTmFtZSxcbiAgICBwcmVmaXhDbHM6IGlucHV0UHJlZml4Q2xzLFxuICAgIHN1ZmZpeDogc3VmZml4SWNvblxuICB9KTtcbiAgaWYgKHNpemUpIHtcbiAgICBvbWl0dGVkUHJvcHMuc2l6ZSA9IHNpemU7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KElucHV0LCBPYmplY3QuYXNzaWduKHtcbiAgICByZWY6IGNvbXBvc2VSZWYocmVmLCBpbnB1dFJlZilcbiAgfSwgb21pdHRlZFByb3BzKSk7XG59KTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFBhc3N3b3JkLmRpc3BsYXlOYW1lID0gJ0lucHV0LlBhc3N3b3JkJztcbn1cbmV4cG9ydCBkZWZhdWx0IFBhc3N3b3JkOyIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBFeWVJbnZpc2libGVPdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9FeWVJbnZpc2libGVPdXRsaW5lZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gXCIuLi9jb21wb25lbnRzL0FudGRJY29uXCI7XG52YXIgRXllSW52aXNpYmxlT3V0bGluZWQgPSBmdW5jdGlvbiBFeWVJbnZpc2libGVPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbnRkSWNvbiwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogRXllSW52aXNpYmxlT3V0bGluZWRTdmdcbiAgfSkpO1xufTtcblxuLyoqIVtleWUtaW52aXNpYmxlXShkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUIzYVdSMGFEMGlOVEFpSUdobGFXZG9kRDBpTlRBaUlHWnBiR3c5SWlOallXTmhZMkVpSUhacFpYZENiM2c5SWpZMElEWTBJRGc1TmlBNE9UWWlJR1p2WTNWellXSnNaVDBpWm1Gc2MyVWlJSGh0Ykc1elBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5SStQSEJoZEdnZ1pEMGlUVGswTWk0eUlEUTROaTR5VVRnNE9TNDBOeUF6TnpVdU1URWdPREUyTGpjZ016QTFiQzAxTUM0NE9DQTFNQzQ0T0VNNE1EY3VNekVnTXprMUxqVXpJRGcwTXk0ME5TQTBORGN1TkNBNE56UXVOeUExTVRJZ056a3hMalVnTmpnMExqSWdOamN6TGpRZ056WTJJRFV4TWlBM05qWnhMVGN5TGpZM0lEQXRNVE16TGpnM0xUSXlMak00VERNeU15QTNPVGd1TnpWUk5EQTRJRGd6T0NBMU1USWdPRE00Y1RJNE9DNHpJREFnTkRNd0xqSXRNekF3TGpOaE5qQXVNamtnTmpBdU1qa2dNQ0F3TURBdE5URXVOWHB0TFRZekxqVTNMVE15TUM0Mk5FdzRNellnTVRJeUxqZzRZVGdnT0NBd0lEQXdMVEV4TGpNeUlEQk1OekUxTGpNeElESXpNaTR5VVRZeU5DNDROaUF4T0RZZ05URXlJREU0Tm5FdE1qZzRMak1nTUMwME16QXVNaUF6TURBdU0yRTJNQzR6SURZd0xqTWdNQ0F3TURBZ05URXVOWEUxTmk0Mk9TQXhNVGt1TkNBeE16WXVOU0F4T1RFdU5ERk1NVEV5TGpRNElEZ3pOV0U0SURnZ01DQXdNREFnTVRFdU16Rk1NVFUxTGpFM0lEZzRPV0U0SURnZ01DQXdNREV4TGpNeElEQnNOekV5TGpFMUxUY3hNaTR4TW1FNElEZ2dNQ0F3TURBdE1URXVNeko2VFRFME9TNHpJRFV4TWtNeU16SXVOaUF6TXprdU9DQXpOVEF1TnlBeU5UZ2dOVEV5SURJMU9HTTFOQzQxTkNBd0lERXdOQzR4TXlBNUxqTTJJREUwT1M0eE1pQXlPQzR6T1d3dE56QXVNeUEzTUM0ellURTNOaUF4TnpZZ01DQXdNQzB5TXpndU1UTWdNak00TGpFemJDMDRNeTQwTWlBNE15NDBNa015TWpNdU1TQTJNemN1TkRrZ01UZ3pMak1nTlRneUxqSTRJREUwT1M0eklEVXhNbnB0TWpRMkxqY2dNR0V4TVRJdU1URWdNVEV5TGpFeElEQWdNREV4TkRZdU1pMHhNRFl1TmpsTU5EQXhMak14SURVME5pNHlRVEV4TWlBeE1USWdNQ0F3TVRNNU5pQTFNVEo2SWlBdlBqeHdZWFJvSUdROUlrMDFNRGdnTmpJMFl5MHpMalEySURBdE5pNDROeTB1TVRZdE1UQXVNalV0TGpRM2JDMDFNaTQ0TWlBMU1pNDRNbUV4TnpZdU1Ea2dNVGMyTGpBNUlEQWdNREF5TWpjdU5ESXRNakkzTGpReWJDMDFNaTQ0TWlBMU1pNDRNbU11TXpFZ015NHpPQzQwTnlBMkxqYzVMalEzSURFd0xqSTFZVEV4TVM0NU5DQXhNVEV1T1RRZ01DQXdNUzB4TVRJZ01URXllaUlnTHo0OEwzTjJaejQ9KSAqL1xudmFyIFJlZkljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihFeWVJbnZpc2libGVPdXRsaW5lZCk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBSZWZJY29uLmRpc3BsYXlOYW1lID0gJ0V5ZUludmlzaWJsZU91dGxpbmVkJztcbn1cbmV4cG9ydCBkZWZhdWx0IFJlZkljb247IiwgIi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxudmFyIEV5ZUludmlzaWJsZU91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk05NDIuMiA0ODYuMlE4ODkuNDcgMzc1LjExIDgxNi43IDMwNWwtNTAuODggNTAuODhDODA3LjMxIDM5NS41MyA4NDMuNDUgNDQ3LjQgODc0LjcgNTEyIDc5MS41IDY4NC4yIDY3My40IDc2NiA1MTIgNzY2cS03Mi42NyAwLTEzMy44Ny0yMi4zOEwzMjMgNzk4Ljc1UTQwOCA4MzggNTEyIDgzOHEyODguMyAwIDQzMC4yLTMwMC4zYTYwLjI5IDYwLjI5IDAgMDAwLTUxLjV6bS02My41Ny0zMjAuNjRMODM2IDEyMi44OGE4IDggMCAwMC0xMS4zMiAwTDcxNS4zMSAyMzIuMlE2MjQuODYgMTg2IDUxMiAxODZxLTI4OC4zIDAtNDMwLjIgMzAwLjNhNjAuMyA2MC4zIDAgMDAwIDUxLjVxNTYuNjkgMTE5LjQgMTM2LjUgMTkxLjQxTDExMi40OCA4MzVhOCA4IDAgMDAwIDExLjMxTDE1NS4xNyA4ODlhOCA4IDAgMDAxMS4zMSAwbDcxMi4xNS03MTIuMTJhOCA4IDAgMDAwLTExLjMyek0xNDkuMyA1MTJDMjMyLjYgMzM5LjggMzUwLjcgMjU4IDUxMiAyNThjNTQuNTQgMCAxMDQuMTMgOS4zNiAxNDkuMTIgMjguMzlsLTcwLjMgNzAuM2ExNzYgMTc2IDAgMDAtMjM4LjEzIDIzOC4xM2wtODMuNDIgODMuNDJDMjIzLjEgNjM3LjQ5IDE4My4zIDU4Mi4yOCAxNDkuMyA1MTJ6bTI0Ni43IDBhMTEyLjExIDExMi4xMSAwIDAxMTQ2LjItMTA2LjY5TDQwMS4zMSA1NDYuMkExMTIgMTEyIDAgMDEzOTYgNTEyelwiIH0gfSwgeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk01MDggNjI0Yy0zLjQ2IDAtNi44Ny0uMTYtMTAuMjUtLjQ3bC01Mi44MiA1Mi44MmExNzYuMDkgMTc2LjA5IDAgMDAyMjcuNDItMjI3LjQybC01Mi44MiA1Mi44MmMuMzEgMy4zOC40NyA2Ljc5LjQ3IDEwLjI1YTExMS45NCAxMTEuOTQgMCAwMS0xMTIgMTEyelwiIH0gfV0gfSwgXCJuYW1lXCI6IFwiZXllLWludmlzaWJsZVwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgRXllSW52aXNpYmxlT3V0bGluZWQ7XG4iLCAiXCJ1c2UgY2xpZW50XCI7XG5cbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgU2VhcmNoT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL1NlYXJjaE91dGxpbmVkXCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IGNvbXBvc2VSZWYgfSBmcm9tIFwicmMtdXRpbC9lcy9yZWZcIjtcbmltcG9ydCB7IGNsb25lRWxlbWVudCB9IGZyb20gJy4uL191dGlsL3JlYWN0Tm9kZSc7XG5pbXBvcnQgQnV0dG9uIGZyb20gJy4uL2J1dHRvbic7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCB1c2VTaXplIGZyb20gJy4uL2NvbmZpZy1wcm92aWRlci9ob29rcy91c2VTaXplJztcbmltcG9ydCB7IHVzZUNvbXBhY3RJdGVtQ29udGV4dCB9IGZyb20gJy4uL3NwYWNlL0NvbXBhY3QnO1xuaW1wb3J0IElucHV0IGZyb20gJy4vSW5wdXQnO1xuY29uc3QgU2VhcmNoID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHByb3BzLCByZWYpID0+IHtcbiAgY29uc3Qge1xuICAgICAgcHJlZml4Q2xzOiBjdXN0b21pemVQcmVmaXhDbHMsXG4gICAgICBpbnB1dFByZWZpeENsczogY3VzdG9taXplSW5wdXRQcmVmaXhDbHMsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBzaXplOiBjdXN0b21pemVTaXplLFxuICAgICAgc3VmZml4LFxuICAgICAgZW50ZXJCdXR0b24gPSBmYWxzZSxcbiAgICAgIGFkZG9uQWZ0ZXIsXG4gICAgICBsb2FkaW5nLFxuICAgICAgZGlzYWJsZWQsXG4gICAgICBvblNlYXJjaDogY3VzdG9tT25TZWFyY2gsXG4gICAgICBvbkNoYW5nZTogY3VzdG9tT25DaGFuZ2UsXG4gICAgICBvbkNvbXBvc2l0aW9uU3RhcnQsXG4gICAgICBvbkNvbXBvc2l0aW9uRW5kXG4gICAgfSA9IHByb3BzLFxuICAgIHJlc3RQcm9wcyA9IF9fcmVzdChwcm9wcywgW1wicHJlZml4Q2xzXCIsIFwiaW5wdXRQcmVmaXhDbHNcIiwgXCJjbGFzc05hbWVcIiwgXCJzaXplXCIsIFwic3VmZml4XCIsIFwiZW50ZXJCdXR0b25cIiwgXCJhZGRvbkFmdGVyXCIsIFwibG9hZGluZ1wiLCBcImRpc2FibGVkXCIsIFwib25TZWFyY2hcIiwgXCJvbkNoYW5nZVwiLCBcIm9uQ29tcG9zaXRpb25TdGFydFwiLCBcIm9uQ29tcG9zaXRpb25FbmRcIl0pO1xuICBjb25zdCB7XG4gICAgZ2V0UHJlZml4Q2xzLFxuICAgIGRpcmVjdGlvblxuICB9ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KTtcbiAgY29uc3QgY29tcG9zZWRSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICBjb25zdCBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2lucHV0LXNlYXJjaCcsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIGNvbnN0IGlucHV0UHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdpbnB1dCcsIGN1c3RvbWl6ZUlucHV0UHJlZml4Q2xzKTtcbiAgY29uc3Qge1xuICAgIGNvbXBhY3RTaXplXG4gIH0gPSB1c2VDb21wYWN0SXRlbUNvbnRleHQocHJlZml4Q2xzLCBkaXJlY3Rpb24pO1xuICBjb25zdCBzaXplID0gdXNlU2l6ZShjdHggPT4ge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4gKF9hID0gY3VzdG9taXplU2l6ZSAhPT0gbnVsbCAmJiBjdXN0b21pemVTaXplICE9PSB2b2lkIDAgPyBjdXN0b21pemVTaXplIDogY29tcGFjdFNpemUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGN0eDtcbiAgfSk7XG4gIGNvbnN0IGlucHV0UmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBjb25zdCBvbkNoYW5nZSA9IGUgPT4ge1xuICAgIGlmICgoZSA9PT0gbnVsbCB8fCBlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlLnRhcmdldCkgJiYgZS50eXBlID09PSAnY2xpY2snICYmIGN1c3RvbU9uU2VhcmNoKSB7XG4gICAgICBjdXN0b21PblNlYXJjaChlLnRhcmdldC52YWx1ZSwgZSwge1xuICAgICAgICBzb3VyY2U6ICdjbGVhcidcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjdXN0b21PbkNoYW5nZSA9PT0gbnVsbCB8fCBjdXN0b21PbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogY3VzdG9tT25DaGFuZ2UoZSk7XG4gIH07XG4gIGNvbnN0IG9uTW91c2VEb3duID0gZSA9PiB7XG4gICAgdmFyIF9hO1xuICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSAoKF9hID0gaW5wdXRSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmlucHV0KSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfTtcbiAgY29uc3Qgb25TZWFyY2ggPSBlID0+IHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIGlmIChjdXN0b21PblNlYXJjaCkge1xuICAgICAgY3VzdG9tT25TZWFyY2goKF9iID0gKF9hID0gaW5wdXRSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmlucHV0KSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IudmFsdWUsIGUsIHtcbiAgICAgICAgc291cmNlOiAnaW5wdXQnXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IG9uUHJlc3NFbnRlciA9IGUgPT4ge1xuICAgIGlmIChjb21wb3NlZFJlZi5jdXJyZW50IHx8IGxvYWRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgb25TZWFyY2goZSk7XG4gIH07XG4gIGNvbnN0IHNlYXJjaEljb24gPSB0eXBlb2YgZW50ZXJCdXR0b24gPT09ICdib29sZWFuJyA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNlYXJjaE91dGxpbmVkLCBudWxsKSA6IG51bGw7XG4gIGNvbnN0IGJ0bkNsYXNzTmFtZSA9IGAke3ByZWZpeENsc30tYnV0dG9uYDtcbiAgbGV0IGJ1dHRvbjtcbiAgY29uc3QgZW50ZXJCdXR0b25Bc0VsZW1lbnQgPSBlbnRlckJ1dHRvbiB8fCB7fTtcbiAgY29uc3QgaXNBbnRkQnV0dG9uID0gZW50ZXJCdXR0b25Bc0VsZW1lbnQudHlwZSAmJiBlbnRlckJ1dHRvbkFzRWxlbWVudC50eXBlLl9fQU5UX0JVVFRPTiA9PT0gdHJ1ZTtcbiAgaWYgKGlzQW50ZEJ1dHRvbiB8fCBlbnRlckJ1dHRvbkFzRWxlbWVudC50eXBlID09PSAnYnV0dG9uJykge1xuICAgIGJ1dHRvbiA9IGNsb25lRWxlbWVudChlbnRlckJ1dHRvbkFzRWxlbWVudCwgT2JqZWN0LmFzc2lnbih7XG4gICAgICBvbk1vdXNlRG93bixcbiAgICAgIG9uQ2xpY2s6IGUgPT4ge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICAoX2IgPSAoX2EgPSBlbnRlckJ1dHRvbkFzRWxlbWVudCA9PT0gbnVsbCB8fCBlbnRlckJ1dHRvbkFzRWxlbWVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZW50ZXJCdXR0b25Bc0VsZW1lbnQucHJvcHMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5vbkNsaWNrKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChfYSwgZSk7XG4gICAgICAgIG9uU2VhcmNoKGUpO1xuICAgICAgfSxcbiAgICAgIGtleTogJ2VudGVyQnV0dG9uJ1xuICAgIH0sIGlzQW50ZEJ1dHRvbiA/IHtcbiAgICAgIGNsYXNzTmFtZTogYnRuQ2xhc3NOYW1lLFxuICAgICAgc2l6ZVxuICAgIH0gOiB7fSkpO1xuICB9IGVsc2Uge1xuICAgIGJ1dHRvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEJ1dHRvbiwge1xuICAgICAgY2xhc3NOYW1lOiBidG5DbGFzc05hbWUsXG4gICAgICB0eXBlOiBlbnRlckJ1dHRvbiA/ICdwcmltYXJ5JyA6IHVuZGVmaW5lZCxcbiAgICAgIHNpemU6IHNpemUsXG4gICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICBrZXk6IFwiZW50ZXJCdXR0b25cIixcbiAgICAgIG9uTW91c2VEb3duOiBvbk1vdXNlRG93bixcbiAgICAgIG9uQ2xpY2s6IG9uU2VhcmNoLFxuICAgICAgbG9hZGluZzogbG9hZGluZyxcbiAgICAgIGljb246IHNlYXJjaEljb25cbiAgICB9LCBlbnRlckJ1dHRvbik7XG4gIH1cbiAgaWYgKGFkZG9uQWZ0ZXIpIHtcbiAgICBidXR0b24gPSBbYnV0dG9uLCBjbG9uZUVsZW1lbnQoYWRkb25BZnRlciwge1xuICAgICAga2V5OiAnYWRkb25BZnRlcidcbiAgICB9KV07XG4gIH1cbiAgY29uc3QgY2xzID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIHtcbiAgICBbYCR7cHJlZml4Q2xzfS1ydGxgXTogZGlyZWN0aW9uID09PSAncnRsJyxcbiAgICBbYCR7cHJlZml4Q2xzfS0ke3NpemV9YF06ICEhc2l6ZSxcbiAgICBbYCR7cHJlZml4Q2xzfS13aXRoLWJ1dHRvbmBdOiAhIWVudGVyQnV0dG9uXG4gIH0sIGNsYXNzTmFtZSk7XG4gIGNvbnN0IG5ld1Byb3BzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXN0UHJvcHMpLCB7XG4gICAgY2xhc3NOYW1lOiBjbHMsXG4gICAgcHJlZml4Q2xzOiBpbnB1dFByZWZpeENscyxcbiAgICB0eXBlOiAnc2VhcmNoJ1xuICB9KTtcbiAgY29uc3QgaGFuZGxlT25Db21wb3NpdGlvblN0YXJ0ID0gZSA9PiB7XG4gICAgY29tcG9zZWRSZWYuY3VycmVudCA9IHRydWU7XG4gICAgb25Db21wb3NpdGlvblN0YXJ0ID09PSBudWxsIHx8IG9uQ29tcG9zaXRpb25TdGFydCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25Db21wb3NpdGlvblN0YXJ0KGUpO1xuICB9O1xuICBjb25zdCBoYW5kbGVPbkNvbXBvc2l0aW9uRW5kID0gZSA9PiB7XG4gICAgY29tcG9zZWRSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIG9uQ29tcG9zaXRpb25FbmQgPT09IG51bGwgfHwgb25Db21wb3NpdGlvbkVuZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25Db21wb3NpdGlvbkVuZChlKTtcbiAgfTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KElucHV0LCBPYmplY3QuYXNzaWduKHtcbiAgICByZWY6IGNvbXBvc2VSZWYoaW5wdXRSZWYsIHJlZiksXG4gICAgb25QcmVzc0VudGVyOiBvblByZXNzRW50ZXJcbiAgfSwgbmV3UHJvcHMsIHtcbiAgICBzaXplOiBzaXplLFxuICAgIG9uQ29tcG9zaXRpb25TdGFydDogaGFuZGxlT25Db21wb3NpdGlvblN0YXJ0LFxuICAgIG9uQ29tcG9zaXRpb25FbmQ6IGhhbmRsZU9uQ29tcG9zaXRpb25FbmQsXG4gICAgYWRkb25BZnRlcjogYnV0dG9uLFxuICAgIHN1ZmZpeDogc3VmZml4LFxuICAgIG9uQ2hhbmdlOiBvbkNoYW5nZSxcbiAgICBkaXNhYmxlZDogZGlzYWJsZWRcbiAgfSkpO1xufSk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBTZWFyY2guZGlzcGxheU5hbWUgPSAnU2VhcmNoJztcbn1cbmV4cG9ydCBkZWZhdWx0IFNlYXJjaDsiLCAiXCJ1c2UgY2xpZW50XCI7XG5cbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBmb3J3YXJkUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUmNUZXh0QXJlYSBmcm9tICdyYy10ZXh0YXJlYSc7XG5pbXBvcnQgZ2V0QWxsb3dDbGVhciBmcm9tICcuLi9fdXRpbC9nZXRBbGxvd0NsZWFyJztcbmltcG9ydCB7IGdldE1lcmdlZFN0YXR1cywgZ2V0U3RhdHVzQ2xhc3NOYW1lcyB9IGZyb20gJy4uL191dGlsL3N0YXR1c1V0aWxzJztcbmltcG9ydCB7IGRldlVzZVdhcm5pbmcgfSBmcm9tICcuLi9fdXRpbC93YXJuaW5nJztcbmltcG9ydCB7IHVzZUNvbXBvbmVudENvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlci9jb250ZXh0JztcbmltcG9ydCBEaXNhYmxlZENvbnRleHQgZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL0Rpc2FibGVkQ29udGV4dCc7XG5pbXBvcnQgdXNlQ1NTVmFyQ2xzIGZyb20gJy4uL2NvbmZpZy1wcm92aWRlci9ob29rcy91c2VDU1NWYXJDbHMnO1xuaW1wb3J0IHVzZVNpemUgZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL2hvb2tzL3VzZVNpemUnO1xuaW1wb3J0IHsgRm9ybUl0ZW1JbnB1dENvbnRleHQgfSBmcm9tICcuLi9mb3JtL2NvbnRleHQnO1xuaW1wb3J0IHVzZVZhcmlhbnQgZnJvbSAnLi4vZm9ybS9ob29rcy91c2VWYXJpYW50cyc7XG5pbXBvcnQgeyB1c2VDb21wYWN0SXRlbUNvbnRleHQgfSBmcm9tICcuLi9zcGFjZS9Db21wYWN0JztcbmltcG9ydCB7IHRyaWdnZXJGb2N1cyB9IGZyb20gJy4vSW5wdXQnO1xuaW1wb3J0IHsgdXNlU2hhcmVkU3R5bGUgfSBmcm9tICcuL3N0eWxlJztcbmltcG9ydCB1c2VTdHlsZSBmcm9tICcuL3N0eWxlL3RleHRhcmVhJztcbmNvbnN0IFRleHRBcmVhID0gLyojX19QVVJFX18qL2ZvcndhcmRSZWYoKHByb3BzLCByZWYpID0+IHtcbiAgdmFyIF9hO1xuICBjb25zdCB7XG4gICAgICBwcmVmaXhDbHM6IGN1c3RvbWl6ZVByZWZpeENscyxcbiAgICAgIGJvcmRlcmVkID0gdHJ1ZSxcbiAgICAgIHNpemU6IGN1c3RvbWl6ZVNpemUsXG4gICAgICBkaXNhYmxlZDogY3VzdG9tRGlzYWJsZWQsXG4gICAgICBzdGF0dXM6IGN1c3RvbVN0YXR1cyxcbiAgICAgIGFsbG93Q2xlYXIsXG4gICAgICBjbGFzc05hbWVzOiBjbGFzc2VzLFxuICAgICAgcm9vdENsYXNzTmFtZSxcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIHN0eWxlLFxuICAgICAgc3R5bGVzLFxuICAgICAgdmFyaWFudDogY3VzdG9tVmFyaWFudCxcbiAgICAgIHNob3dDb3VudCxcbiAgICAgIG9uTW91c2VEb3duLFxuICAgICAgb25SZXNpemVcbiAgICB9ID0gcHJvcHMsXG4gICAgcmVzdCA9IF9fcmVzdChwcm9wcywgW1wicHJlZml4Q2xzXCIsIFwiYm9yZGVyZWRcIiwgXCJzaXplXCIsIFwiZGlzYWJsZWRcIiwgXCJzdGF0dXNcIiwgXCJhbGxvd0NsZWFyXCIsIFwiY2xhc3NOYW1lc1wiLCBcInJvb3RDbGFzc05hbWVcIiwgXCJjbGFzc05hbWVcIiwgXCJzdHlsZVwiLCBcInN0eWxlc1wiLCBcInZhcmlhbnRcIiwgXCJzaG93Q291bnRcIiwgXCJvbk1vdXNlRG93blwiLCBcIm9uUmVzaXplXCJdKTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBjb25zdCB7XG4gICAgICBkZXByZWNhdGVkXG4gICAgfSA9IGRldlVzZVdhcm5pbmcoJ1RleHRBcmVhJyk7XG4gICAgZGVwcmVjYXRlZCghKCdib3JkZXJlZCcgaW4gcHJvcHMpLCAnYm9yZGVyZWQnLCAndmFyaWFudCcpO1xuICB9XG4gIGNvbnN0IHtcbiAgICBnZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uLFxuICAgIGFsbG93Q2xlYXI6IGNvbnRleHRBbGxvd0NsZWFyLFxuICAgIGF1dG9Db21wbGV0ZTogY29udGV4dEF1dG9Db21wbGV0ZSxcbiAgICBjbGFzc05hbWU6IGNvbnRleHRDbGFzc05hbWUsXG4gICAgc3R5bGU6IGNvbnRleHRTdHlsZSxcbiAgICBjbGFzc05hbWVzOiBjb250ZXh0Q2xhc3NOYW1lcyxcbiAgICBzdHlsZXM6IGNvbnRleHRTdHlsZXNcbiAgfSA9IHVzZUNvbXBvbmVudENvbmZpZygndGV4dEFyZWEnKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PSBEaXNhYmxlZCA9PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IGRpc2FibGVkID0gUmVhY3QudXNlQ29udGV4dChEaXNhYmxlZENvbnRleHQpO1xuICBjb25zdCBtZXJnZWREaXNhYmxlZCA9IGN1c3RvbURpc2FibGVkICE9PSBudWxsICYmIGN1c3RvbURpc2FibGVkICE9PSB2b2lkIDAgPyBjdXN0b21EaXNhYmxlZCA6IGRpc2FibGVkO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PSBTdGF0dXMgPT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3Qge1xuICAgIHN0YXR1czogY29udGV4dFN0YXR1cyxcbiAgICBoYXNGZWVkYmFjayxcbiAgICBmZWVkYmFja0ljb25cbiAgfSA9IFJlYWN0LnVzZUNvbnRleHQoRm9ybUl0ZW1JbnB1dENvbnRleHQpO1xuICBjb25zdCBtZXJnZWRTdGF0dXMgPSBnZXRNZXJnZWRTdGF0dXMoY29udGV4dFN0YXR1cywgY3VzdG9tU3RhdHVzKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09IFJlZiA9PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IGlubmVyUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgKCkgPT4ge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzaXphYmxlVGV4dEFyZWE6IChfYSA9IGlubmVyUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5yZXNpemFibGVUZXh0QXJlYSxcbiAgICAgIGZvY3VzOiBvcHRpb24gPT4ge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICB0cmlnZ2VyRm9jdXMoKF9iID0gKF9hID0gaW5uZXJSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnJlc2l6YWJsZVRleHRBcmVhKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IudGV4dEFyZWEsIG9wdGlvbik7XG4gICAgICB9LFxuICAgICAgYmx1cjogKCkgPT4ge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiAoX2EgPSBpbm5lclJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYmx1cigpO1xuICAgICAgfVxuICAgIH07XG4gIH0pO1xuICBjb25zdCBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2lucHV0JywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gU3R5bGUgPT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IHJvb3RDbHMgPSB1c2VDU1NWYXJDbHMocHJlZml4Q2xzKTtcbiAgY29uc3QgW3dyYXBTaGFyZWRDU1NWYXIsIGhhc2hJZCwgY3NzVmFyQ2xzXSA9IHVzZVNoYXJlZFN0eWxlKHByZWZpeENscywgcm9vdENsYXNzTmFtZSk7XG4gIGNvbnN0IFt3cmFwQ1NTVmFyXSA9IHVzZVN0eWxlKHByZWZpeENscywgcm9vdENscyk7XG4gIC8vID09PT09PT09PT09PT09PT09IENvbXBhY3QgSXRlbSA9PT09PT09PT09PT09PT09PVxuICBjb25zdCB7XG4gICAgY29tcGFjdFNpemUsXG4gICAgY29tcGFjdEl0ZW1DbGFzc25hbWVzXG4gIH0gPSB1c2VDb21wYWN0SXRlbUNvbnRleHQocHJlZml4Q2xzLCBkaXJlY3Rpb24pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gU2l6ZSA9PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3QgbWVyZ2VkU2l6ZSA9IHVzZVNpemUoY3R4ID0+IHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIChfYSA9IGN1c3RvbWl6ZVNpemUgIT09IG51bGwgJiYgY3VzdG9taXplU2l6ZSAhPT0gdm9pZCAwID8gY3VzdG9taXplU2l6ZSA6IGNvbXBhY3RTaXplKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBjdHg7XG4gIH0pO1xuICBjb25zdCBbdmFyaWFudCwgZW5hYmxlVmFyaWFudENsc10gPSB1c2VWYXJpYW50KCd0ZXh0QXJlYScsIGN1c3RvbVZhcmlhbnQsIGJvcmRlcmVkKTtcbiAgY29uc3QgbWVyZ2VkQWxsb3dDbGVhciA9IGdldEFsbG93Q2xlYXIoYWxsb3dDbGVhciAhPT0gbnVsbCAmJiBhbGxvd0NsZWFyICE9PSB2b2lkIDAgPyBhbGxvd0NsZWFyIDogY29udGV4dEFsbG93Q2xlYXIpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PSBSZXNpemUgPT09PT09PT09PT09PT09PT09PT1cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvNTE1OTRcbiAgY29uc3QgW2lzTW91c2VEb3duLCBzZXRJc01vdXNlRG93bl0gPSBSZWFjdC51c2VTdGF0ZShmYWxzZSk7XG4gIC8vIFdoZW4gaGFzIHdyYXBwZXIsIHJlc2l6ZSB3aWxsIG1ha2UgYXMgZGlydHkgZm9yIGByZXNpemU6IGJvdGhgIHN0eWxlXG4gIGNvbnN0IFtyZXNpemVEaXJ0eSwgc2V0UmVzaXplRGlydHldID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBvbkludGVybmFsTW91c2VEb3duID0gZSA9PiB7XG4gICAgc2V0SXNNb3VzZURvd24odHJ1ZSk7XG4gICAgb25Nb3VzZURvd24gPT09IG51bGwgfHwgb25Nb3VzZURvd24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uTW91c2VEb3duKGUpO1xuICAgIGNvbnN0IG9uTW91c2VVcCA9ICgpID0+IHtcbiAgICAgIHNldElzTW91c2VEb3duKGZhbHNlKTtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgIH07XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XG4gIH07XG4gIGNvbnN0IG9uSW50ZXJuYWxSZXNpemUgPSBzaXplID0+IHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIG9uUmVzaXplID09PSBudWxsIHx8IG9uUmVzaXplID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvblJlc2l6ZShzaXplKTtcbiAgICAvLyBDaGFuZ2UgdG8gZGlydHkgc2luY2UgdGhpcyBtYXliZSBmcm9tIHRoZSBgcmVzaXplOiBib3RoYCBzdHlsZVxuICAgIGlmIChpc01vdXNlRG93biAmJiB0eXBlb2YgZ2V0Q29tcHV0ZWRTdHlsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc3QgZWxlID0gKF9iID0gKF9hID0gaW5uZXJSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm5hdGl2ZUVsZW1lbnQpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpO1xuICAgICAgaWYgKGVsZSAmJiBnZXRDb21wdXRlZFN0eWxlKGVsZSkucmVzaXplID09PSAnYm90aCcpIHtcbiAgICAgICAgc2V0UmVzaXplRGlydHkodHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICAvLyA9PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT1cbiAgcmV0dXJuIHdyYXBTaGFyZWRDU1NWYXIod3JhcENTU1ZhcigvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSY1RleHRBcmVhLCBPYmplY3QuYXNzaWduKHtcbiAgICBhdXRvQ29tcGxldGU6IGNvbnRleHRBdXRvQ29tcGxldGVcbiAgfSwgcmVzdCwge1xuICAgIHN0eWxlOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGNvbnRleHRTdHlsZSksIHN0eWxlKSxcbiAgICBzdHlsZXM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY29udGV4dFN0eWxlcyksIHN0eWxlcyksXG4gICAgZGlzYWJsZWQ6IG1lcmdlZERpc2FibGVkLFxuICAgIGFsbG93Q2xlYXI6IG1lcmdlZEFsbG93Q2xlYXIsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNzc1ZhckNscywgcm9vdENscywgY2xhc3NOYW1lLCByb290Q2xhc3NOYW1lLCBjb21wYWN0SXRlbUNsYXNzbmFtZXMsIGNvbnRleHRDbGFzc05hbWUsXG4gICAgLy8gT25seSBmb3Igd3JhcHBlclxuICAgIHJlc2l6ZURpcnR5ICYmIGAke3ByZWZpeENsc30tdGV4dGFyZWEtYWZmaXgtd3JhcHBlci1yZXNpemUtZGlydHlgKSxcbiAgICBjbGFzc05hbWVzOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY2xhc3NlcyksIGNvbnRleHRDbGFzc05hbWVzKSwge1xuICAgICAgdGV4dGFyZWE6IGNsYXNzTmFtZXMoe1xuICAgICAgICBbYCR7cHJlZml4Q2xzfS1zbWBdOiBtZXJnZWRTaXplID09PSAnc21hbGwnLFxuICAgICAgICBbYCR7cHJlZml4Q2xzfS1sZ2BdOiBtZXJnZWRTaXplID09PSAnbGFyZ2UnXG4gICAgICB9LCBoYXNoSWQsIGNsYXNzZXMgPT09IG51bGwgfHwgY2xhc3NlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2xhc3Nlcy50ZXh0YXJlYSwgY29udGV4dENsYXNzTmFtZXMudGV4dGFyZWEsIGlzTW91c2VEb3duICYmIGAke3ByZWZpeENsc30tbW91c2UtYWN0aXZlYCksXG4gICAgICB2YXJpYW50OiBjbGFzc05hbWVzKHtcbiAgICAgICAgW2Ake3ByZWZpeENsc30tJHt2YXJpYW50fWBdOiBlbmFibGVWYXJpYW50Q2xzXG4gICAgICB9LCBnZXRTdGF0dXNDbGFzc05hbWVzKHByZWZpeENscywgbWVyZ2VkU3RhdHVzKSksXG4gICAgICBhZmZpeFdyYXBwZXI6IGNsYXNzTmFtZXMoYCR7cHJlZml4Q2xzfS10ZXh0YXJlYS1hZmZpeC13cmFwcGVyYCwge1xuICAgICAgICBbYCR7cHJlZml4Q2xzfS1hZmZpeC13cmFwcGVyLXJ0bGBdOiBkaXJlY3Rpb24gPT09ICdydGwnLFxuICAgICAgICBbYCR7cHJlZml4Q2xzfS1hZmZpeC13cmFwcGVyLXNtYF06IG1lcmdlZFNpemUgPT09ICdzbWFsbCcsXG4gICAgICAgIFtgJHtwcmVmaXhDbHN9LWFmZml4LXdyYXBwZXItbGdgXTogbWVyZ2VkU2l6ZSA9PT0gJ2xhcmdlJyxcbiAgICAgICAgW2Ake3ByZWZpeENsc30tdGV4dGFyZWEtc2hvdy1jb3VudGBdOiBzaG93Q291bnQgfHwgKChfYSA9IHByb3BzLmNvdW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Euc2hvdylcbiAgICAgIH0sIGhhc2hJZClcbiAgICB9KSxcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBzdWZmaXg6IGhhc0ZlZWRiYWNrICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IGAke3ByZWZpeENsc30tdGV4dGFyZWEtc3VmZml4YFxuICAgIH0sIGZlZWRiYWNrSWNvbiksXG4gICAgc2hvd0NvdW50OiBzaG93Q291bnQsXG4gICAgcmVmOiBpbm5lclJlZixcbiAgICBvblJlc2l6ZTogb25JbnRlcm5hbFJlc2l6ZSxcbiAgICBvbk1vdXNlRG93bjogb25JbnRlcm5hbE1vdXNlRG93blxuICB9KSkpKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgVGV4dEFyZWE7IiwgImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcImRlZmF1bHRWYWx1ZVwiLCBcInZhbHVlXCIsIFwib25Gb2N1c1wiLCBcIm9uQmx1clwiLCBcIm9uQ2hhbmdlXCIsIFwiYWxsb3dDbGVhclwiLCBcIm1heExlbmd0aFwiLCBcIm9uQ29tcG9zaXRpb25TdGFydFwiLCBcIm9uQ29tcG9zaXRpb25FbmRcIiwgXCJzdWZmaXhcIiwgXCJwcmVmaXhDbHNcIiwgXCJzaG93Q291bnRcIiwgXCJjb3VudFwiLCBcImNsYXNzTmFtZVwiLCBcInN0eWxlXCIsIFwiZGlzYWJsZWRcIiwgXCJoaWRkZW5cIiwgXCJjbGFzc05hbWVzXCIsIFwic3R5bGVzXCIsIFwib25SZXNpemVcIiwgXCJvbkNsZWFyXCIsIFwib25QcmVzc0VudGVyXCIsIFwicmVhZE9ubHlcIiwgXCJhdXRvU2l6ZVwiLCBcIm9uS2V5RG93blwiXTtcbmltcG9ydCBjbHN4IGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgQmFzZUlucHV0IH0gZnJvbSAncmMtaW5wdXQnO1xuaW1wb3J0IHVzZUNvdW50IGZyb20gXCJyYy1pbnB1dC9lcy9ob29rcy91c2VDb3VudFwiO1xuaW1wb3J0IHsgcmVzb2x2ZU9uQ2hhbmdlIH0gZnJvbSBcInJjLWlucHV0L2VzL3V0aWxzL2NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdXNlTWVyZ2VkU3RhdGUgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlTWVyZ2VkU3RhdGVcIjtcbmltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBSZXNpemFibGVUZXh0QXJlYSBmcm9tIFwiLi9SZXNpemFibGVUZXh0QXJlYVwiO1xudmFyIFRleHRBcmVhID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKF9yZWYsIHJlZikge1xuICB2YXIgX2NvdW50Q29uZmlnJG1heDtcbiAgdmFyIGRlZmF1bHRWYWx1ZSA9IF9yZWYuZGVmYXVsdFZhbHVlLFxuICAgIGN1c3RvbVZhbHVlID0gX3JlZi52YWx1ZSxcbiAgICBvbkZvY3VzID0gX3JlZi5vbkZvY3VzLFxuICAgIG9uQmx1ciA9IF9yZWYub25CbHVyLFxuICAgIG9uQ2hhbmdlID0gX3JlZi5vbkNoYW5nZSxcbiAgICBhbGxvd0NsZWFyID0gX3JlZi5hbGxvd0NsZWFyLFxuICAgIG1heExlbmd0aCA9IF9yZWYubWF4TGVuZ3RoLFxuICAgIG9uQ29tcG9zaXRpb25TdGFydCA9IF9yZWYub25Db21wb3NpdGlvblN0YXJ0LFxuICAgIG9uQ29tcG9zaXRpb25FbmQgPSBfcmVmLm9uQ29tcG9zaXRpb25FbmQsXG4gICAgc3VmZml4ID0gX3JlZi5zdWZmaXgsXG4gICAgX3JlZiRwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscyxcbiAgICBwcmVmaXhDbHMgPSBfcmVmJHByZWZpeENscyA9PT0gdm9pZCAwID8gJ3JjLXRleHRhcmVhJyA6IF9yZWYkcHJlZml4Q2xzLFxuICAgIHNob3dDb3VudCA9IF9yZWYuc2hvd0NvdW50LFxuICAgIGNvdW50ID0gX3JlZi5jb3VudCxcbiAgICBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICBzdHlsZSA9IF9yZWYuc3R5bGUsXG4gICAgZGlzYWJsZWQgPSBfcmVmLmRpc2FibGVkLFxuICAgIGhpZGRlbiA9IF9yZWYuaGlkZGVuLFxuICAgIGNsYXNzTmFtZXMgPSBfcmVmLmNsYXNzTmFtZXMsXG4gICAgc3R5bGVzID0gX3JlZi5zdHlsZXMsXG4gICAgb25SZXNpemUgPSBfcmVmLm9uUmVzaXplLFxuICAgIG9uQ2xlYXIgPSBfcmVmLm9uQ2xlYXIsXG4gICAgb25QcmVzc0VudGVyID0gX3JlZi5vblByZXNzRW50ZXIsXG4gICAgcmVhZE9ubHkgPSBfcmVmLnJlYWRPbmx5LFxuICAgIGF1dG9TaXplID0gX3JlZi5hdXRvU2l6ZSxcbiAgICBvbktleURvd24gPSBfcmVmLm9uS2V5RG93bixcbiAgICByZXN0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYsIF9leGNsdWRlZCk7XG4gIHZhciBfdXNlTWVyZ2VkU3RhdGUgPSB1c2VNZXJnZWRTdGF0ZShkZWZhdWx0VmFsdWUsIHtcbiAgICAgIHZhbHVlOiBjdXN0b21WYWx1ZSxcbiAgICAgIGRlZmF1bHRWYWx1ZTogZGVmYXVsdFZhbHVlXG4gICAgfSksXG4gICAgX3VzZU1lcmdlZFN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VNZXJnZWRTdGF0ZSwgMiksXG4gICAgdmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGUyWzBdLFxuICAgIHNldFZhbHVlID0gX3VzZU1lcmdlZFN0YXRlMlsxXTtcbiAgdmFyIGZvcm1hdFZhbHVlID0gdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCA/ICcnIDogU3RyaW5nKHZhbHVlKTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBmb2N1c2VkID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXRGb2N1c2VkID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIGNvbXBvc2l0aW9uUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTMgPSBSZWFjdC51c2VTdGF0ZShudWxsKSxcbiAgICBfUmVhY3QkdXNlU3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlMywgMiksXG4gICAgdGV4dGFyZWFSZXNpemVkID0gX1JlYWN0JHVzZVN0YXRlNFswXSxcbiAgICBzZXRUZXh0YXJlYVJlc2l6ZWQgPSBfUmVhY3QkdXNlU3RhdGU0WzFdO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVmID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBob2xkZXJSZWYgPSB1c2VSZWYobnVsbCk7XG4gIHZhciByZXNpemFibGVUZXh0QXJlYVJlZiA9IHVzZVJlZihudWxsKTtcbiAgdmFyIGdldFRleHRBcmVhID0gZnVuY3Rpb24gZ2V0VGV4dEFyZWEoKSB7XG4gICAgdmFyIF9yZXNpemFibGVUZXh0QXJlYVJlZjtcbiAgICByZXR1cm4gKF9yZXNpemFibGVUZXh0QXJlYVJlZiA9IHJlc2l6YWJsZVRleHRBcmVhUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9yZXNpemFibGVUZXh0QXJlYVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3Jlc2l6YWJsZVRleHRBcmVhUmVmLnRleHRBcmVhO1xuICB9O1xuICB2YXIgZm9jdXMgPSBmdW5jdGlvbiBmb2N1cygpIHtcbiAgICBnZXRUZXh0QXJlYSgpLmZvY3VzKCk7XG4gIH07XG4gIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9ob2xkZXJSZWYkY3VycmVudDtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzaXphYmxlVGV4dEFyZWE6IHJlc2l6YWJsZVRleHRBcmVhUmVmLmN1cnJlbnQsXG4gICAgICBmb2N1czogZm9jdXMsXG4gICAgICBibHVyOiBmdW5jdGlvbiBibHVyKCkge1xuICAgICAgICBnZXRUZXh0QXJlYSgpLmJsdXIoKTtcbiAgICAgIH0sXG4gICAgICBuYXRpdmVFbGVtZW50OiAoKF9ob2xkZXJSZWYkY3VycmVudCA9IGhvbGRlclJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfaG9sZGVyUmVmJGN1cnJlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9ob2xkZXJSZWYkY3VycmVudC5uYXRpdmVFbGVtZW50KSB8fCBnZXRUZXh0QXJlYSgpXG4gICAgfTtcbiAgfSk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgc2V0Rm9jdXNlZChmdW5jdGlvbiAocHJldikge1xuICAgICAgcmV0dXJuICFkaXNhYmxlZCAmJiBwcmV2O1xuICAgIH0pO1xuICB9LCBbZGlzYWJsZWRdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gU2VsZWN0IFJhbmdlID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX1JlYWN0JHVzZVN0YXRlNSA9IFJlYWN0LnVzZVN0YXRlKG51bGwpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTYgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGU1LCAyKSxcbiAgICBzZWxlY3Rpb24gPSBfUmVhY3QkdXNlU3RhdGU2WzBdLFxuICAgIHNldFNlbGVjdGlvbiA9IF9SZWFjdCR1c2VTdGF0ZTZbMV07XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHNlbGVjdGlvbikge1xuICAgICAgdmFyIF9nZXRUZXh0QXJlYTtcbiAgICAgIChfZ2V0VGV4dEFyZWEgPSBnZXRUZXh0QXJlYSgpKS5zZXRTZWxlY3Rpb25SYW5nZS5hcHBseShfZ2V0VGV4dEFyZWEsIF90b0NvbnN1bWFibGVBcnJheShzZWxlY3Rpb24pKTtcbiAgICB9XG4gIH0sIFtzZWxlY3Rpb25dKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQ291bnQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgY291bnRDb25maWcgPSB1c2VDb3VudChjb3VudCwgc2hvd0NvdW50KTtcbiAgdmFyIG1lcmdlZE1heCA9IChfY291bnRDb25maWckbWF4ID0gY291bnRDb25maWcubWF4KSAhPT0gbnVsbCAmJiBfY291bnRDb25maWckbWF4ICE9PSB2b2lkIDAgPyBfY291bnRDb25maWckbWF4IDogbWF4TGVuZ3RoO1xuXG4gIC8vIE1heCBsZW5ndGggdmFsdWVcbiAgdmFyIGhhc01heExlbmd0aCA9IE51bWJlcihtZXJnZWRNYXgpID4gMDtcbiAgdmFyIHZhbHVlTGVuZ3RoID0gY291bnRDb25maWcuc3RyYXRlZ3koZm9ybWF0VmFsdWUpO1xuICB2YXIgaXNPdXRPZlJhbmdlID0gISFtZXJnZWRNYXggJiYgdmFsdWVMZW5ndGggPiBtZXJnZWRNYXg7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IENoYW5nZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHRyaWdnZXJDaGFuZ2UgPSBmdW5jdGlvbiB0cmlnZ2VyQ2hhbmdlKGUsIGN1cnJlbnRWYWx1ZSkge1xuICAgIHZhciBjdXRWYWx1ZSA9IGN1cnJlbnRWYWx1ZTtcbiAgICBpZiAoIWNvbXBvc2l0aW9uUmVmLmN1cnJlbnQgJiYgY291bnRDb25maWcuZXhjZWVkRm9ybWF0dGVyICYmIGNvdW50Q29uZmlnLm1heCAmJiBjb3VudENvbmZpZy5zdHJhdGVneShjdXJyZW50VmFsdWUpID4gY291bnRDb25maWcubWF4KSB7XG4gICAgICBjdXRWYWx1ZSA9IGNvdW50Q29uZmlnLmV4Y2VlZEZvcm1hdHRlcihjdXJyZW50VmFsdWUsIHtcbiAgICAgICAgbWF4OiBjb3VudENvbmZpZy5tYXhcbiAgICAgIH0pO1xuICAgICAgaWYgKGN1cnJlbnRWYWx1ZSAhPT0gY3V0VmFsdWUpIHtcbiAgICAgICAgc2V0U2VsZWN0aW9uKFtnZXRUZXh0QXJlYSgpLnNlbGVjdGlvblN0YXJ0IHx8IDAsIGdldFRleHRBcmVhKCkuc2VsZWN0aW9uRW5kIHx8IDBdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc2V0VmFsdWUoY3V0VmFsdWUpO1xuICAgIHJlc29sdmVPbkNoYW5nZShlLmN1cnJlbnRUYXJnZXQsIGUsIG9uQ2hhbmdlLCBjdXRWYWx1ZSk7XG4gIH07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IFZhbHVlIFVwZGF0ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG9uSW50ZXJuYWxDb21wb3NpdGlvblN0YXJ0ID0gZnVuY3Rpb24gb25JbnRlcm5hbENvbXBvc2l0aW9uU3RhcnQoZSkge1xuICAgIGNvbXBvc2l0aW9uUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgIG9uQ29tcG9zaXRpb25TdGFydCA9PT0gbnVsbCB8fCBvbkNvbXBvc2l0aW9uU3RhcnQgPT09IHZvaWQgMCB8fCBvbkNvbXBvc2l0aW9uU3RhcnQoZSk7XG4gIH07XG4gIHZhciBvbkludGVybmFsQ29tcG9zaXRpb25FbmQgPSBmdW5jdGlvbiBvbkludGVybmFsQ29tcG9zaXRpb25FbmQoZSkge1xuICAgIGNvbXBvc2l0aW9uUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB0cmlnZ2VyQ2hhbmdlKGUsIGUuY3VycmVudFRhcmdldC52YWx1ZSk7XG4gICAgb25Db21wb3NpdGlvbkVuZCA9PT0gbnVsbCB8fCBvbkNvbXBvc2l0aW9uRW5kID09PSB2b2lkIDAgfHwgb25Db21wb3NpdGlvbkVuZChlKTtcbiAgfTtcbiAgdmFyIG9uSW50ZXJuYWxDaGFuZ2UgPSBmdW5jdGlvbiBvbkludGVybmFsQ2hhbmdlKGUpIHtcbiAgICB0cmlnZ2VyQ2hhbmdlKGUsIGUudGFyZ2V0LnZhbHVlKTtcbiAgfTtcbiAgdmFyIGhhbmRsZUtleURvd24gPSBmdW5jdGlvbiBoYW5kbGVLZXlEb3duKGUpIHtcbiAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicgJiYgb25QcmVzc0VudGVyKSB7XG4gICAgICBvblByZXNzRW50ZXIoZSk7XG4gICAgfVxuICAgIG9uS2V5RG93biA9PT0gbnVsbCB8fCBvbktleURvd24gPT09IHZvaWQgMCB8fCBvbktleURvd24oZSk7XG4gIH07XG4gIHZhciBoYW5kbGVGb2N1cyA9IGZ1bmN0aW9uIGhhbmRsZUZvY3VzKGUpIHtcbiAgICBzZXRGb2N1c2VkKHRydWUpO1xuICAgIG9uRm9jdXMgPT09IG51bGwgfHwgb25Gb2N1cyA9PT0gdm9pZCAwIHx8IG9uRm9jdXMoZSk7XG4gIH07XG4gIHZhciBoYW5kbGVCbHVyID0gZnVuY3Rpb24gaGFuZGxlQmx1cihlKSB7XG4gICAgc2V0Rm9jdXNlZChmYWxzZSk7XG4gICAgb25CbHVyID09PSBudWxsIHx8IG9uQmx1ciA9PT0gdm9pZCAwIHx8IG9uQmx1cihlKTtcbiAgfTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVzZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgaGFuZGxlUmVzZXQgPSBmdW5jdGlvbiBoYW5kbGVSZXNldChlKSB7XG4gICAgc2V0VmFsdWUoJycpO1xuICAgIGZvY3VzKCk7XG4gICAgcmVzb2x2ZU9uQ2hhbmdlKGdldFRleHRBcmVhKCksIGUsIG9uQ2hhbmdlKTtcbiAgfTtcbiAgdmFyIHN1ZmZpeE5vZGUgPSBzdWZmaXg7XG4gIHZhciBkYXRhQ291bnQ7XG4gIGlmIChjb3VudENvbmZpZy5zaG93KSB7XG4gICAgaWYgKGNvdW50Q29uZmlnLnNob3dGb3JtYXR0ZXIpIHtcbiAgICAgIGRhdGFDb3VudCA9IGNvdW50Q29uZmlnLnNob3dGb3JtYXR0ZXIoe1xuICAgICAgICB2YWx1ZTogZm9ybWF0VmFsdWUsXG4gICAgICAgIGNvdW50OiB2YWx1ZUxlbmd0aCxcbiAgICAgICAgbWF4TGVuZ3RoOiBtZXJnZWRNYXhcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhQ291bnQgPSBcIlwiLmNvbmNhdCh2YWx1ZUxlbmd0aCkuY29uY2F0KGhhc01heExlbmd0aCA/IFwiIC8gXCIuY29uY2F0KG1lcmdlZE1heCkgOiAnJyk7XG4gICAgfVxuICAgIHN1ZmZpeE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgc3VmZml4Tm9kZSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xzeChcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRhdGEtY291bnRcIiksIGNsYXNzTmFtZXMgPT09IG51bGwgfHwgY2xhc3NOYW1lcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2xhc3NOYW1lcy5jb3VudCksXG4gICAgICBzdHlsZTogc3R5bGVzID09PSBudWxsIHx8IHN0eWxlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3R5bGVzLmNvdW50XG4gICAgfSwgZGF0YUNvdW50KSk7XG4gIH1cbiAgdmFyIGhhbmRsZVJlc2l6ZSA9IGZ1bmN0aW9uIGhhbmRsZVJlc2l6ZShzaXplKSB7XG4gICAgdmFyIF9nZXRUZXh0QXJlYTI7XG4gICAgb25SZXNpemUgPT09IG51bGwgfHwgb25SZXNpemUgPT09IHZvaWQgMCB8fCBvblJlc2l6ZShzaXplKTtcbiAgICBpZiAoKF9nZXRUZXh0QXJlYTIgPSBnZXRUZXh0QXJlYSgpKSAhPT0gbnVsbCAmJiBfZ2V0VGV4dEFyZWEyICE9PSB2b2lkIDAgJiYgX2dldFRleHRBcmVhMi5zdHlsZS5oZWlnaHQpIHtcbiAgICAgIHNldFRleHRhcmVhUmVzaXplZCh0cnVlKTtcbiAgICB9XG4gIH07XG4gIHZhciBpc1B1cmVUZXh0QXJlYSA9ICFhdXRvU2l6ZSAmJiAhc2hvd0NvdW50ICYmICFhbGxvd0NsZWFyO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQmFzZUlucHV0LCB7XG4gICAgcmVmOiBob2xkZXJSZWYsXG4gICAgdmFsdWU6IGZvcm1hdFZhbHVlLFxuICAgIGFsbG93Q2xlYXI6IGFsbG93Q2xlYXIsXG4gICAgaGFuZGxlUmVzZXQ6IGhhbmRsZVJlc2V0LFxuICAgIHN1ZmZpeDogc3VmZml4Tm9kZSxcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBjbGFzc05hbWVzOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGNsYXNzTmFtZXMpLCB7fSwge1xuICAgICAgYWZmaXhXcmFwcGVyOiBjbHN4KGNsYXNzTmFtZXMgPT09IG51bGwgfHwgY2xhc3NOYW1lcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2xhc3NOYW1lcy5hZmZpeFdyYXBwZXIsIF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2hvdy1jb3VudFwiKSwgc2hvd0NvdW50KSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10ZXh0YXJlYS1hbGxvdy1jbGVhclwiKSwgYWxsb3dDbGVhcikpXG4gICAgfSksXG4gICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgIGZvY3VzZWQ6IGZvY3VzZWQsXG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzTmFtZSwgaXNPdXRPZlJhbmdlICYmIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItb3V0LW9mLXJhbmdlXCIpKSxcbiAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHRleHRhcmVhUmVzaXplZCAmJiAhaXNQdXJlVGV4dEFyZWEgPyB7XG4gICAgICBoZWlnaHQ6ICdhdXRvJ1xuICAgIH0gOiB7fSksXG4gICAgZGF0YUF0dHJzOiB7XG4gICAgICBhZmZpeFdyYXBwZXI6IHtcbiAgICAgICAgJ2RhdGEtY291bnQnOiB0eXBlb2YgZGF0YUNvdW50ID09PSAnc3RyaW5nJyA/IGRhdGFDb3VudCA6IHVuZGVmaW5lZFxuICAgICAgfVxuICAgIH0sXG4gICAgaGlkZGVuOiBoaWRkZW4sXG4gICAgcmVhZE9ubHk6IHJlYWRPbmx5LFxuICAgIG9uQ2xlYXI6IG9uQ2xlYXJcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVzaXphYmxlVGV4dEFyZWEsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgYXV0b1NpemU6IGF1dG9TaXplLFxuICAgIG1heExlbmd0aDogbWF4TGVuZ3RoLFxuICAgIG9uS2V5RG93bjogaGFuZGxlS2V5RG93bixcbiAgICBvbkNoYW5nZTogb25JbnRlcm5hbENoYW5nZSxcbiAgICBvbkZvY3VzOiBoYW5kbGVGb2N1cyxcbiAgICBvbkJsdXI6IGhhbmRsZUJsdXIsXG4gICAgb25Db21wb3NpdGlvblN0YXJ0OiBvbkludGVybmFsQ29tcG9zaXRpb25TdGFydCxcbiAgICBvbkNvbXBvc2l0aW9uRW5kOiBvbkludGVybmFsQ29tcG9zaXRpb25FbmQsXG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzTmFtZXMgPT09IG51bGwgfHwgY2xhc3NOYW1lcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2xhc3NOYW1lcy50ZXh0YXJlYSksXG4gICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3R5bGVzID09PSBudWxsIHx8IHN0eWxlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3R5bGVzLnRleHRhcmVhKSwge30sIHtcbiAgICAgIHJlc2l6ZTogc3R5bGUgPT09IG51bGwgfHwgc3R5bGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0eWxlLnJlc2l6ZVxuICAgIH0pLFxuICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBvblJlc2l6ZTogaGFuZGxlUmVzaXplLFxuICAgIHJlZjogcmVzaXphYmxlVGV4dEFyZWFSZWYsXG4gICAgcmVhZE9ubHk6IHJlYWRPbmx5XG4gIH0pKSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IFRleHRBcmVhOyIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcInByZWZpeENsc1wiLCBcImRlZmF1bHRWYWx1ZVwiLCBcInZhbHVlXCIsIFwiYXV0b1NpemVcIiwgXCJvblJlc2l6ZVwiLCBcImNsYXNzTmFtZVwiLCBcInN0eWxlXCIsIFwiZGlzYWJsZWRcIiwgXCJvbkNoYW5nZVwiLCBcIm9uSW50ZXJuYWxBdXRvU2l6ZVwiXTtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFJlc2l6ZU9ic2VydmVyIGZyb20gJ3JjLXJlc2l6ZS1vYnNlcnZlcic7XG5pbXBvcnQgdXNlTGF5b3V0RWZmZWN0IGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZUxheW91dEVmZmVjdFwiO1xuaW1wb3J0IHVzZU1lcmdlZFN0YXRlIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZU1lcmdlZFN0YXRlXCI7XG5pbXBvcnQgcmFmIGZyb20gXCJyYy11dGlsL2VzL3JhZlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNhbGN1bGF0ZUF1dG9TaXplU3R5bGUgZnJvbSBcIi4vY2FsY3VsYXRlTm9kZUhlaWdodFwiO1xudmFyIFJFU0laRV9TVEFSVCA9IDA7XG52YXIgUkVTSVpFX01FQVNVUklORyA9IDE7XG52YXIgUkVTSVpFX1NUQUJMRSA9IDI7XG52YXIgUmVzaXphYmxlVGV4dEFyZWEgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICB2YXIgX3JlZiA9IHByb3BzLFxuICAgIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgIGRlZmF1bHRWYWx1ZSA9IF9yZWYuZGVmYXVsdFZhbHVlLFxuICAgIHZhbHVlID0gX3JlZi52YWx1ZSxcbiAgICBhdXRvU2l6ZSA9IF9yZWYuYXV0b1NpemUsXG4gICAgb25SZXNpemUgPSBfcmVmLm9uUmVzaXplLFxuICAgIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLFxuICAgIHN0eWxlID0gX3JlZi5zdHlsZSxcbiAgICBkaXNhYmxlZCA9IF9yZWYuZGlzYWJsZWQsXG4gICAgb25DaGFuZ2UgPSBfcmVmLm9uQ2hhbmdlLFxuICAgIG9uSW50ZXJuYWxBdXRvU2l6ZSA9IF9yZWYub25JbnRlcm5hbEF1dG9TaXplLFxuICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBfZXhjbHVkZWQpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gVmFsdWUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF91c2VNZXJnZWRTdGF0ZSA9IHVzZU1lcmdlZFN0YXRlKGRlZmF1bHRWYWx1ZSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgcG9zdFN0YXRlOiBmdW5jdGlvbiBwb3N0U3RhdGUodmFsKSB7XG4gICAgICAgIHJldHVybiB2YWwgIT09IG51bGwgJiYgdmFsICE9PSB2b2lkIDAgPyB2YWwgOiAnJztcbiAgICAgIH1cbiAgICB9KSxcbiAgICBfdXNlTWVyZ2VkU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZU1lcmdlZFN0YXRlLCAyKSxcbiAgICBtZXJnZWRWYWx1ZSA9IF91c2VNZXJnZWRTdGF0ZTJbMF0sXG4gICAgc2V0TWVyZ2VkVmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGUyWzFdO1xuICB2YXIgb25JbnRlcm5hbENoYW5nZSA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxDaGFuZ2UoZXZlbnQpIHtcbiAgICBzZXRNZXJnZWRWYWx1ZShldmVudC50YXJnZXQudmFsdWUpO1xuICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgfHwgb25DaGFuZ2UoZXZlbnQpO1xuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlZiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHRleHRhcmVhUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIFJlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRleHRBcmVhOiB0ZXh0YXJlYVJlZi5jdXJyZW50XG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEF1dG9TaXplID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX1JlYWN0JHVzZU1lbW8gPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChhdXRvU2l6ZSAmJiBfdHlwZW9mKGF1dG9TaXplKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIFthdXRvU2l6ZS5taW5Sb3dzLCBhdXRvU2l6ZS5tYXhSb3dzXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9LCBbYXV0b1NpemVdKSxcbiAgICBfUmVhY3QkdXNlTWVtbzIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlTWVtbywgMiksXG4gICAgbWluUm93cyA9IF9SZWFjdCR1c2VNZW1vMlswXSxcbiAgICBtYXhSb3dzID0gX1JlYWN0JHVzZU1lbW8yWzFdO1xuICB2YXIgbmVlZEF1dG9TaXplID0gISFhdXRvU2l6ZTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNjcm9sbCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzIxODcwXG4gIHZhciBmaXhGaXJlZm94QXV0b1Njcm9sbCA9IGZ1bmN0aW9uIGZpeEZpcmVmb3hBdXRvU2Nyb2xsKCkge1xuICAgIHRyeSB7XG4gICAgICAvLyBGRiBoYXMgYnVnIHdpdGgganVtcCBvZiBzY3JvbGwgdG8gdG9wLiBXZSBmb3JjZSBiYWNrIGhlcmUuXG4gICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gdGV4dGFyZWFSZWYuY3VycmVudCkge1xuICAgICAgICB2YXIgX3RleHRhcmVhUmVmJGN1cnJlbnQgPSB0ZXh0YXJlYVJlZi5jdXJyZW50LFxuICAgICAgICAgIHNlbGVjdGlvblN0YXJ0ID0gX3RleHRhcmVhUmVmJGN1cnJlbnQuc2VsZWN0aW9uU3RhcnQsXG4gICAgICAgICAgc2VsZWN0aW9uRW5kID0gX3RleHRhcmVhUmVmJGN1cnJlbnQuc2VsZWN0aW9uRW5kLFxuICAgICAgICAgIHNjcm9sbFRvcCA9IF90ZXh0YXJlYVJlZiRjdXJyZW50LnNjcm9sbFRvcDtcblxuICAgICAgICAvLyBGaXggU2FmYXJpIGJ1ZyB3aGljaCBub3Qgcm9sbGJhY2sgd2hlbiBicmVhayBsaW5lXG4gICAgICAgIC8vIFRoaXMgbWFrZXMgQ2hpbmVzZSBJTUUgY2FuJ3QgaW5wdXQuIERvIG5vdCBmaXggdGhpc1xuICAgICAgICAvLyBjb25zdCB7IHZhbHVlOiB0bXBWYWx1ZSB9ID0gdGV4dGFyZWFSZWYuY3VycmVudDtcbiAgICAgICAgLy8gdGV4dGFyZWFSZWYuY3VycmVudC52YWx1ZSA9ICcnO1xuICAgICAgICAvLyB0ZXh0YXJlYVJlZi5jdXJyZW50LnZhbHVlID0gdG1wVmFsdWU7XG5cbiAgICAgICAgdGV4dGFyZWFSZWYuY3VycmVudC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKTtcbiAgICAgICAgdGV4dGFyZWFSZWYuY3VycmVudC5zY3JvbGxUb3AgPSBzY3JvbGxUb3A7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gRml4IGVycm9yIGluIENocm9tZTpcbiAgICAgIC8vIEZhaWxlZCB0byByZWFkIHRoZSAnc2VsZWN0aW9uU3RhcnQnIHByb3BlcnR5IGZyb20gJ0hUTUxJbnB1dEVsZW1lbnQnXG4gICAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcS8yMTE3NzQ4OS8zMDQwNjA1XG4gICAgfVxuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVzaXplID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKFJFU0laRV9TVEFCTEUpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIHJlc2l6ZVN0YXRlID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXRSZXNpemVTdGF0ZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUzID0gUmVhY3QudXNlU3RhdGUoKSxcbiAgICBfUmVhY3QkdXNlU3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlMywgMiksXG4gICAgYXV0b1NpemVTdHlsZSA9IF9SZWFjdCR1c2VTdGF0ZTRbMF0sXG4gICAgc2V0QXV0b1NpemVTdHlsZSA9IF9SZWFjdCR1c2VTdGF0ZTRbMV07XG4gIHZhciBzdGFydFJlc2l6ZSA9IGZ1bmN0aW9uIHN0YXJ0UmVzaXplKCkge1xuICAgIHNldFJlc2l6ZVN0YXRlKFJFU0laRV9TVEFSVCk7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAndGVzdCcpIHtcbiAgICAgIG9uSW50ZXJuYWxBdXRvU2l6ZSA9PT0gbnVsbCB8fCBvbkludGVybmFsQXV0b1NpemUgPT09IHZvaWQgMCB8fCBvbkludGVybmFsQXV0b1NpemUoKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gQ2hhbmdlIHRvIHRyaWdnZXIgcmVzaXplIG1lYXN1cmVcbiAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAobmVlZEF1dG9TaXplKSB7XG4gICAgICBzdGFydFJlc2l6ZSgpO1xuICAgIH1cbiAgfSwgW3ZhbHVlLCBtaW5Sb3dzLCBtYXhSb3dzLCBuZWVkQXV0b1NpemVdKTtcbiAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocmVzaXplU3RhdGUgPT09IFJFU0laRV9TVEFSVCkge1xuICAgICAgc2V0UmVzaXplU3RhdGUoUkVTSVpFX01FQVNVUklORyk7XG4gICAgfSBlbHNlIGlmIChyZXNpemVTdGF0ZSA9PT0gUkVTSVpFX01FQVNVUklORykge1xuICAgICAgdmFyIHRleHRhcmVhU3R5bGVzID0gY2FsY3VsYXRlQXV0b1NpemVTdHlsZSh0ZXh0YXJlYVJlZi5jdXJyZW50LCBmYWxzZSwgbWluUm93cywgbWF4Um93cyk7XG5cbiAgICAgIC8vIFNhZmFyaSBoYXMgYnVnIHRoYXQgdGV4dCB3aWxsIGtlZXAgYnJlYWsgbGluZSBvbiB0ZXh0IGN1dCB3aGVuIGl0J3MgcHJldiBpcyBicmVhayBsaW5lLlxuICAgICAgLy8gWm9tYmllSjogVGhpcyBub3Qgb2Z0ZW4gaGFwcGVuLiBTbyB3ZSBqdXN0IHNraXAgaXQuXG4gICAgICAvLyBjb25zdCB7IHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQsIHNjcm9sbFRvcCB9ID0gdGV4dGFyZWFSZWYuY3VycmVudDtcbiAgICAgIC8vIGNvbnN0IHsgdmFsdWU6IHRtcFZhbHVlIH0gPSB0ZXh0YXJlYVJlZi5jdXJyZW50O1xuICAgICAgLy8gdGV4dGFyZWFSZWYuY3VycmVudC52YWx1ZSA9ICcnO1xuICAgICAgLy8gdGV4dGFyZWFSZWYuY3VycmVudC52YWx1ZSA9IHRtcFZhbHVlO1xuXG4gICAgICAvLyBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gdGV4dGFyZWFSZWYuY3VycmVudCkge1xuICAgICAgLy8gICB0ZXh0YXJlYVJlZi5jdXJyZW50LnNjcm9sbFRvcCA9IHNjcm9sbFRvcDtcbiAgICAgIC8vICAgdGV4dGFyZWFSZWYuY3VycmVudC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKTtcbiAgICAgIC8vIH1cblxuICAgICAgc2V0UmVzaXplU3RhdGUoUkVTSVpFX1NUQUJMRSk7XG4gICAgICBzZXRBdXRvU2l6ZVN0eWxlKHRleHRhcmVhU3R5bGVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZml4RmlyZWZveEF1dG9TY3JvbGwoKTtcbiAgICB9XG4gIH0sIFtyZXNpemVTdGF0ZV0pO1xuXG4gIC8vIFdlIGxvY2sgcmVzaXplIHRyaWdnZXIgYnkgcmFmIHRvIGF2b2lkIFNhZmFyaSB3YXJuaW5nXG4gIHZhciByZXNpemVSYWZSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgdmFyIGNsZWFuUmFmID0gZnVuY3Rpb24gY2xlYW5SYWYoKSB7XG4gICAgcmFmLmNhbmNlbChyZXNpemVSYWZSZWYuY3VycmVudCk7XG4gIH07XG4gIHZhciBvbkludGVybmFsUmVzaXplID0gZnVuY3Rpb24gb25JbnRlcm5hbFJlc2l6ZShzaXplKSB7XG4gICAgaWYgKHJlc2l6ZVN0YXRlID09PSBSRVNJWkVfU1RBQkxFKSB7XG4gICAgICBvblJlc2l6ZSA9PT0gbnVsbCB8fCBvblJlc2l6ZSA9PT0gdm9pZCAwIHx8IG9uUmVzaXplKHNpemUpO1xuICAgICAgaWYgKGF1dG9TaXplKSB7XG4gICAgICAgIGNsZWFuUmFmKCk7XG4gICAgICAgIHJlc2l6ZVJhZlJlZi5jdXJyZW50ID0gcmFmKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBzdGFydFJlc2l6ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGNsZWFuUmFmO1xuICB9LCBbXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgbWVyZ2VkQXV0b1NpemVTdHlsZSA9IG5lZWRBdXRvU2l6ZSA/IGF1dG9TaXplU3R5bGUgOiBudWxsO1xuICB2YXIgbWVyZ2VkU3R5bGUgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN0eWxlKSwgbWVyZ2VkQXV0b1NpemVTdHlsZSk7XG4gIGlmIChyZXNpemVTdGF0ZSA9PT0gUkVTSVpFX1NUQVJUIHx8IHJlc2l6ZVN0YXRlID09PSBSRVNJWkVfTUVBU1VSSU5HKSB7XG4gICAgbWVyZ2VkU3R5bGUub3ZlcmZsb3dZID0gJ2hpZGRlbic7XG4gICAgbWVyZ2VkU3R5bGUub3ZlcmZsb3dYID0gJ2hpZGRlbic7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlc2l6ZU9ic2VydmVyLCB7XG4gICAgb25SZXNpemU6IG9uSW50ZXJuYWxSZXNpemUsXG4gICAgZGlzYWJsZWQ6ICEoYXV0b1NpemUgfHwgb25SZXNpemUpXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIiwgX2V4dGVuZHMoe30sIHJlc3RQcm9wcywge1xuICAgIHJlZjogdGV4dGFyZWFSZWYsXG4gICAgc3R5bGU6IG1lcmdlZFN0eWxlLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhwcmVmaXhDbHMsIGNsYXNzTmFtZSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRpc2FibGVkXCIpLCBkaXNhYmxlZCkpLFxuICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICB2YWx1ZTogbWVyZ2VkVmFsdWUsXG4gICAgb25DaGFuZ2U6IG9uSW50ZXJuYWxDaGFuZ2VcbiAgfSkpKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgUmVzaXphYmxlVGV4dEFyZWE7IiwgIi8vIFRoYW5rcyB0byBodHRwczovL2dpdGh1Yi5jb20vYW5kcmV5cG9wcC9yZWFjdC10ZXh0YXJlYS1hdXRvc2l6ZS9cblxuLyoqXG4gKiBjYWxjdWxhdGVOb2RlSGVpZ2h0KHVpVGV4dE5vZGUsIHVzZUNhY2hlID0gZmFsc2UpXG4gKi9cblxudmFyIEhJRERFTl9URVhUQVJFQV9TVFlMRSA9IFwiXFxuICBtaW4taGVpZ2h0OjAgIWltcG9ydGFudDtcXG4gIG1heC1oZWlnaHQ6bm9uZSAhaW1wb3J0YW50O1xcbiAgaGVpZ2h0OjAgIWltcG9ydGFudDtcXG4gIHZpc2liaWxpdHk6aGlkZGVuICFpbXBvcnRhbnQ7XFxuICBvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudDtcXG4gIHBvc2l0aW9uOmFic29sdXRlICFpbXBvcnRhbnQ7XFxuICB6LWluZGV4Oi0xMDAwICFpbXBvcnRhbnQ7XFxuICB0b3A6MCAhaW1wb3J0YW50O1xcbiAgcmlnaHQ6MCAhaW1wb3J0YW50O1xcbiAgcG9pbnRlci1ldmVudHM6IG5vbmUgIWltcG9ydGFudDtcXG5cIjtcbnZhciBTSVpJTkdfU1RZTEUgPSBbJ2xldHRlci1zcGFjaW5nJywgJ2xpbmUtaGVpZ2h0JywgJ3BhZGRpbmctdG9wJywgJ3BhZGRpbmctYm90dG9tJywgJ2ZvbnQtZmFtaWx5JywgJ2ZvbnQtd2VpZ2h0JywgJ2ZvbnQtc2l6ZScsICdmb250LXZhcmlhbnQnLCAndGV4dC1yZW5kZXJpbmcnLCAndGV4dC10cmFuc2Zvcm0nLCAnd2lkdGgnLCAndGV4dC1pbmRlbnQnLCAncGFkZGluZy1sZWZ0JywgJ3BhZGRpbmctcmlnaHQnLCAnYm9yZGVyLXdpZHRoJywgJ2JveC1zaXppbmcnLCAnd29yZC1icmVhaycsICd3aGl0ZS1zcGFjZSddO1xudmFyIGNvbXB1dGVkU3R5bGVDYWNoZSA9IHt9O1xudmFyIGhpZGRlblRleHRhcmVhO1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZU5vZGVTdHlsaW5nKG5vZGUpIHtcbiAgdmFyIHVzZUNhY2hlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcbiAgdmFyIG5vZGVSZWYgPSBub2RlLmdldEF0dHJpYnV0ZSgnaWQnKSB8fCBub2RlLmdldEF0dHJpYnV0ZSgnZGF0YS1yZWFjdGlkJykgfHwgbm9kZS5nZXRBdHRyaWJ1dGUoJ25hbWUnKTtcbiAgaWYgKHVzZUNhY2hlICYmIGNvbXB1dGVkU3R5bGVDYWNoZVtub2RlUmVmXSkge1xuICAgIHJldHVybiBjb21wdXRlZFN0eWxlQ2FjaGVbbm9kZVJlZl07XG4gIH1cbiAgdmFyIHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUobm9kZSk7XG4gIHZhciBib3hTaXppbmcgPSBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdib3gtc2l6aW5nJykgfHwgc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnLW1vei1ib3gtc2l6aW5nJykgfHwgc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnLXdlYmtpdC1ib3gtc2l6aW5nJyk7XG4gIHZhciBwYWRkaW5nU2l6ZSA9IHBhcnNlRmxvYXQoc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgncGFkZGluZy1ib3R0b20nKSkgKyBwYXJzZUZsb2F0KHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3BhZGRpbmctdG9wJykpO1xuICB2YXIgYm9yZGVyU2l6ZSA9IHBhcnNlRmxvYXQoc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnYm9yZGVyLWJvdHRvbS13aWR0aCcpKSArIHBhcnNlRmxvYXQoc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnYm9yZGVyLXRvcC13aWR0aCcpKTtcbiAgdmFyIHNpemluZ1N0eWxlID0gU0laSU5HX1NUWUxFLm1hcChmdW5jdGlvbiAobmFtZSkge1xuICAgIHJldHVybiBcIlwiLmNvbmNhdChuYW1lLCBcIjpcIikuY29uY2F0KHN0eWxlLmdldFByb3BlcnR5VmFsdWUobmFtZSkpO1xuICB9KS5qb2luKCc7Jyk7XG4gIHZhciBub2RlSW5mbyA9IHtcbiAgICBzaXppbmdTdHlsZTogc2l6aW5nU3R5bGUsXG4gICAgcGFkZGluZ1NpemU6IHBhZGRpbmdTaXplLFxuICAgIGJvcmRlclNpemU6IGJvcmRlclNpemUsXG4gICAgYm94U2l6aW5nOiBib3hTaXppbmdcbiAgfTtcbiAgaWYgKHVzZUNhY2hlICYmIG5vZGVSZWYpIHtcbiAgICBjb21wdXRlZFN0eWxlQ2FjaGVbbm9kZVJlZl0gPSBub2RlSW5mbztcbiAgfVxuICByZXR1cm4gbm9kZUluZm87XG59XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjYWxjdWxhdGVBdXRvU2l6ZVN0eWxlKHVpVGV4dE5vZGUpIHtcbiAgdmFyIHVzZUNhY2hlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcbiAgdmFyIG1pblJvd3MgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IG51bGw7XG4gIHZhciBtYXhSb3dzID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBudWxsO1xuICBpZiAoIWhpZGRlblRleHRhcmVhKSB7XG4gICAgaGlkZGVuVGV4dGFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpO1xuICAgIGhpZGRlblRleHRhcmVhLnNldEF0dHJpYnV0ZSgndGFiLWluZGV4JywgJy0xJyk7XG4gICAgaGlkZGVuVGV4dGFyZWEuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7XG4gICAgLy8gZml4OiBBIGZvcm0gZmllbGQgZWxlbWVudCBzaG91bGQgaGF2ZSBhbiBpZCBvciBuYW1lIGF0dHJpYnV0ZVxuICAgIC8vIEEgZm9ybSBmaWVsZCBlbGVtZW50IGhhcyBuZWl0aGVyIGFuIGlkIG5vciBhIG5hbWUgYXR0cmlidXRlLiBUaGlzIG1pZ2h0IHByZXZlbnQgdGhlIGJyb3dzZXIgZnJvbSBjb3JyZWN0bHkgYXV0b2ZpbGxpbmcgdGhlIGZvcm0uXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L3RleHRhcmVhXG4gICAgaGlkZGVuVGV4dGFyZWEuc2V0QXR0cmlidXRlKCduYW1lJywgJ2hpZGRlblRleHRhcmVhJyk7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChoaWRkZW5UZXh0YXJlYSk7XG4gIH1cblxuICAvLyBGaXggd3JhcD1cIm9mZlwiIGlzc3VlXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzY1NzdcbiAgaWYgKHVpVGV4dE5vZGUuZ2V0QXR0cmlidXRlKCd3cmFwJykpIHtcbiAgICBoaWRkZW5UZXh0YXJlYS5zZXRBdHRyaWJ1dGUoJ3dyYXAnLCB1aVRleHROb2RlLmdldEF0dHJpYnV0ZSgnd3JhcCcpKTtcbiAgfSBlbHNlIHtcbiAgICBoaWRkZW5UZXh0YXJlYS5yZW1vdmVBdHRyaWJ1dGUoJ3dyYXAnKTtcbiAgfVxuXG4gIC8vIENvcHkgYWxsIENTUyBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBhbiBpbXBhY3Qgb24gdGhlIGhlaWdodCBvZiB0aGUgY29udGVudCBpblxuICAvLyB0aGUgdGV4dGJveFxuICB2YXIgX2NhbGN1bGF0ZU5vZGVTdHlsaW5nID0gY2FsY3VsYXRlTm9kZVN0eWxpbmcodWlUZXh0Tm9kZSwgdXNlQ2FjaGUpLFxuICAgIHBhZGRpbmdTaXplID0gX2NhbGN1bGF0ZU5vZGVTdHlsaW5nLnBhZGRpbmdTaXplLFxuICAgIGJvcmRlclNpemUgPSBfY2FsY3VsYXRlTm9kZVN0eWxpbmcuYm9yZGVyU2l6ZSxcbiAgICBib3hTaXppbmcgPSBfY2FsY3VsYXRlTm9kZVN0eWxpbmcuYm94U2l6aW5nLFxuICAgIHNpemluZ1N0eWxlID0gX2NhbGN1bGF0ZU5vZGVTdHlsaW5nLnNpemluZ1N0eWxlO1xuXG4gIC8vIE5lZWQgdG8gaGF2ZSB0aGUgb3ZlcmZsb3cgYXR0cmlidXRlIHRvIGhpZGUgdGhlIHNjcm9sbGJhciBvdGhlcndpc2VcbiAgLy8gdGV4dC1saW5lcyB3aWxsIG5vdCBjYWxjdWxhdGVkIHByb3Blcmx5IGFzIHRoZSBzaGFkb3cgd2lsbCB0ZWNobmljYWxseSBiZVxuICAvLyBuYXJyb3dlciBmb3IgY29udGVudFxuICBoaWRkZW5UZXh0YXJlYS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgXCJcIi5jb25jYXQoc2l6aW5nU3R5bGUsIFwiO1wiKS5jb25jYXQoSElEREVOX1RFWFRBUkVBX1NUWUxFKSk7XG4gIGhpZGRlblRleHRhcmVhLnZhbHVlID0gdWlUZXh0Tm9kZS52YWx1ZSB8fCB1aVRleHROb2RlLnBsYWNlaG9sZGVyIHx8ICcnO1xuICB2YXIgbWluSGVpZ2h0ID0gdW5kZWZpbmVkO1xuICB2YXIgbWF4SGVpZ2h0ID0gdW5kZWZpbmVkO1xuICB2YXIgb3ZlcmZsb3dZO1xuICB2YXIgaGVpZ2h0ID0gaGlkZGVuVGV4dGFyZWEuc2Nyb2xsSGVpZ2h0O1xuICBpZiAoYm94U2l6aW5nID09PSAnYm9yZGVyLWJveCcpIHtcbiAgICAvLyBib3JkZXItYm94OiBhZGQgYm9yZGVyLCBzaW5jZSBoZWlnaHQgPSBjb250ZW50ICsgcGFkZGluZyArIGJvcmRlclxuICAgIGhlaWdodCArPSBib3JkZXJTaXplO1xuICB9IGVsc2UgaWYgKGJveFNpemluZyA9PT0gJ2NvbnRlbnQtYm94Jykge1xuICAgIC8vIHJlbW92ZSBwYWRkaW5nLCBzaW5jZSBoZWlnaHQgPSBjb250ZW50XG4gICAgaGVpZ2h0IC09IHBhZGRpbmdTaXplO1xuICB9XG4gIGlmIChtaW5Sb3dzICE9PSBudWxsIHx8IG1heFJvd3MgIT09IG51bGwpIHtcbiAgICAvLyBtZWFzdXJlIGhlaWdodCBvZiBhIHRleHRhcmVhIHdpdGggYSBzaW5nbGUgcm93XG4gICAgaGlkZGVuVGV4dGFyZWEudmFsdWUgPSAnICc7XG4gICAgdmFyIHNpbmdsZVJvd0hlaWdodCA9IGhpZGRlblRleHRhcmVhLnNjcm9sbEhlaWdodCAtIHBhZGRpbmdTaXplO1xuICAgIGlmIChtaW5Sb3dzICE9PSBudWxsKSB7XG4gICAgICBtaW5IZWlnaHQgPSBzaW5nbGVSb3dIZWlnaHQgKiBtaW5Sb3dzO1xuICAgICAgaWYgKGJveFNpemluZyA9PT0gJ2JvcmRlci1ib3gnKSB7XG4gICAgICAgIG1pbkhlaWdodCA9IG1pbkhlaWdodCArIHBhZGRpbmdTaXplICsgYm9yZGVyU2l6ZTtcbiAgICAgIH1cbiAgICAgIGhlaWdodCA9IE1hdGgubWF4KG1pbkhlaWdodCwgaGVpZ2h0KTtcbiAgICB9XG4gICAgaWYgKG1heFJvd3MgIT09IG51bGwpIHtcbiAgICAgIG1heEhlaWdodCA9IHNpbmdsZVJvd0hlaWdodCAqIG1heFJvd3M7XG4gICAgICBpZiAoYm94U2l6aW5nID09PSAnYm9yZGVyLWJveCcpIHtcbiAgICAgICAgbWF4SGVpZ2h0ID0gbWF4SGVpZ2h0ICsgcGFkZGluZ1NpemUgKyBib3JkZXJTaXplO1xuICAgICAgfVxuICAgICAgb3ZlcmZsb3dZID0gaGVpZ2h0ID4gbWF4SGVpZ2h0ID8gJycgOiAnaGlkZGVuJztcbiAgICAgIGhlaWdodCA9IE1hdGgubWluKG1heEhlaWdodCwgaGVpZ2h0KTtcbiAgICB9XG4gIH1cbiAgdmFyIHN0eWxlID0ge1xuICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIG92ZXJmbG93WTogb3ZlcmZsb3dZLFxuICAgIHJlc2l6ZTogJ25vbmUnXG4gIH07XG4gIGlmIChtaW5IZWlnaHQpIHtcbiAgICBzdHlsZS5taW5IZWlnaHQgPSBtaW5IZWlnaHQ7XG4gIH1cbiAgaWYgKG1heEhlaWdodCkge1xuICAgIHN0eWxlLm1heEhlaWdodCA9IG1heEhlaWdodDtcbiAgfVxuICByZXR1cm4gc3R5bGU7XG59IiwgImltcG9ydCBUZXh0QXJlYSBmcm9tIFwiLi9UZXh0QXJlYVwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBSZXNpemFibGVUZXh0QXJlYSB9IGZyb20gXCIuL1Jlc2l6YWJsZVRleHRBcmVhXCI7XG5leHBvcnQgZGVmYXVsdCBUZXh0QXJlYTsiLCAiaW1wb3J0IHsgZ2VuU3R5bGVIb29rcywgbWVyZ2VUb2tlbiB9IGZyb20gJy4uLy4uL3RoZW1lL2ludGVybmFsJztcbmltcG9ydCB7IGluaXRDb21wb25lbnRUb2tlbiwgaW5pdElucHV0VG9rZW4gfSBmcm9tICcuL3Rva2VuJztcbmV4cG9ydCB7IGluaXRDb21wb25lbnRUb2tlbiwgaW5pdElucHV0VG9rZW4gfTtcbmNvbnN0IGdlblRleHRBcmVhU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHMsXG4gICAgcGFkZGluZ0xHXG4gIH0gPSB0b2tlbjtcbiAgY29uc3QgdGV4dGFyZWFQcmVmaXhDbHMgPSBgJHtjb21wb25lbnRDbHN9LXRleHRhcmVhYDtcbiAgcmV0dXJuIHtcbiAgICAvLyBSYXcgVGV4dGFyZWFcbiAgICBbYHRleHRhcmVhJHtjb21wb25lbnRDbHN9YF06IHtcbiAgICAgIG1heFdpZHRoOiAnMTAwJScsXG4gICAgICAvLyBwcmV2ZW50IHRleHRhcmVhIHJlc2l6ZSBmcm9tIGNvbWluZyBvdXQgb2YgaXRzIGNvbnRhaW5lclxuICAgICAgaGVpZ2h0OiAnYXV0bycsXG4gICAgICBtaW5IZWlnaHQ6IHRva2VuLmNvbnRyb2xIZWlnaHQsXG4gICAgICBsaW5lSGVpZ2h0OiB0b2tlbi5saW5lSGVpZ2h0LFxuICAgICAgdmVydGljYWxBbGlnbjogJ2JvdHRvbScsXG4gICAgICB0cmFuc2l0aW9uOiBgYWxsICR7dG9rZW4ubW90aW9uRHVyYXRpb25TbG93fWAsXG4gICAgICByZXNpemU6ICd2ZXJ0aWNhbCcsXG4gICAgICBbYCYke2NvbXBvbmVudENsc30tbW91c2UtYWN0aXZlYF06IHtcbiAgICAgICAgdHJhbnNpdGlvbjogYGFsbCAke3Rva2VuLm1vdGlvbkR1cmF0aW9uU2xvd30sIGhlaWdodCAwcywgd2lkdGggMHNgXG4gICAgICB9XG4gICAgfSxcbiAgICAvLyBXcmFwcGVyIGZvciByZXNpemVcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS10ZXh0YXJlYS1hZmZpeC13cmFwcGVyLXJlc2l6ZS1kaXJ0eWBdOiB7XG4gICAgICB3aWR0aDogJ2F1dG8nXG4gICAgfSxcbiAgICBbdGV4dGFyZWFQcmVmaXhDbHNdOiB7XG4gICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICcmLXNob3ctY291bnQnOiB7XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzMzMDQ5XG4gICAgICAgIFtgPiAke2NvbXBvbmVudENsc31gXToge1xuICAgICAgICAgIGhlaWdodDogJzEwMCUnXG4gICAgICAgIH0sXG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LWRhdGEtY291bnRgXToge1xuICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgIGJvdHRvbTogdG9rZW4uY2FsYyh0b2tlbi5mb250U2l6ZSkubXVsKHRva2VuLmxpbmVIZWlnaHQpLm11bCgtMSkuZXF1YWwoKSxcbiAgICAgICAgICBpbnNldElubGluZUVuZDogMCxcbiAgICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JUZXh0RGVzY3JpcHRpb24sXG4gICAgICAgICAgd2hpdGVTcGFjZTogJ25vd3JhcCcsXG4gICAgICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbYFxuICAgICAgICAmLWFsbG93LWNsZWFyID4gJHtjb21wb25lbnRDbHN9LFxuICAgICAgICAmLWFmZml4LXdyYXBwZXIke3RleHRhcmVhUHJlZml4Q2xzfS1oYXMtZmVlZGJhY2sgJHtjb21wb25lbnRDbHN9XG4gICAgICBgXToge1xuICAgICAgICBwYWRkaW5nSW5saW5lRW5kOiBwYWRkaW5nTEdcbiAgICAgIH0sXG4gICAgICBbYCYtYWZmaXgtd3JhcHBlciR7Y29tcG9uZW50Q2xzfS1hZmZpeC13cmFwcGVyYF06IHtcbiAgICAgICAgcGFkZGluZzogMCxcbiAgICAgICAgW2A+IHRleHRhcmVhJHtjb21wb25lbnRDbHN9YF06IHtcbiAgICAgICAgICBmb250U2l6ZTogJ2luaGVyaXQnLFxuICAgICAgICAgIGJvcmRlcjogJ25vbmUnLFxuICAgICAgICAgIG91dGxpbmU6ICdub25lJyxcbiAgICAgICAgICBiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICAgIG1pbkhlaWdodDogdG9rZW4uY2FsYyh0b2tlbi5jb250cm9sSGVpZ2h0KS5zdWIodG9rZW4uY2FsYyh0b2tlbi5saW5lV2lkdGgpLm11bCgyKSkuZXF1YWwoKSxcbiAgICAgICAgICAnJjpmb2N1cyc6IHtcbiAgICAgICAgICAgIGJveFNoYWRvdzogJ25vbmUgIWltcG9ydGFudCdcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LXN1ZmZpeGBdOiB7XG4gICAgICAgICAgbWFyZ2luOiAwLFxuICAgICAgICAgICc+ICo6bm90KDpsYXN0LWNoaWxkKSc6IHtcbiAgICAgICAgICAgIG1hcmdpbklubGluZTogMFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLy8gQ2xlYXIgSWNvblxuICAgICAgICAgIFtgJHtjb21wb25lbnRDbHN9LWNsZWFyLWljb25gXToge1xuICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICBpbnNldElubGluZUVuZDogdG9rZW4ucGFkZGluZ0lubGluZSxcbiAgICAgICAgICAgIGluc2V0QmxvY2tTdGFydDogdG9rZW4ucGFkZGluZ1hTXG4gICAgICAgICAgfSxcbiAgICAgICAgICAvLyBGZWVkYmFjayBJY29uXG4gICAgICAgICAgW2Ake3RleHRhcmVhUHJlZml4Q2xzfS1zdWZmaXhgXToge1xuICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgICBpbnNldElubGluZUVuZDogdG9rZW4ucGFkZGluZ0lubGluZSxcbiAgICAgICAgICAgIGJvdHRvbTogMCxcbiAgICAgICAgICAgIHpJbmRleDogMSxcbiAgICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtZmxleCcsXG4gICAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICAgIG1hcmdpbjogJ2F1dG8nLFxuICAgICAgICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2AmLWFmZml4LXdyYXBwZXIke2NvbXBvbmVudENsc30tYWZmaXgtd3JhcHBlci1zbWBdOiB7XG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LXN1ZmZpeGBdOiB7XG4gICAgICAgICAgW2Ake2NvbXBvbmVudENsc30tY2xlYXItaWNvbmBdOiB7XG4gICAgICAgICAgICBpbnNldElubGluZUVuZDogdG9rZW4ucGFkZGluZ0lubGluZVNNXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFeHBvcnQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgZGVmYXVsdCBnZW5TdHlsZUhvb2tzKFsnSW5wdXQnLCAnVGV4dEFyZWEnXSwgdG9rZW4gPT4ge1xuICBjb25zdCBpbnB1dFRva2VuID0gbWVyZ2VUb2tlbih0b2tlbiwgaW5pdElucHV0VG9rZW4odG9rZW4pKTtcbiAgcmV0dXJuIFtnZW5UZXh0QXJlYVN0eWxlKGlucHV0VG9rZW4pXTtcbn0sIGluaXRDb21wb25lbnRUb2tlbiwge1xuICByZXNldEZvbnQ6IGZhbHNlXG59KTsiLCAiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCBHcm91cCBmcm9tICcuL0dyb3VwJztcbmltcG9ydCBJbnRlcm5hbElucHV0IGZyb20gJy4vSW5wdXQnO1xuaW1wb3J0IE9UUCBmcm9tICcuL09UUCc7XG5pbXBvcnQgUGFzc3dvcmQgZnJvbSAnLi9QYXNzd29yZCc7XG5pbXBvcnQgU2VhcmNoIGZyb20gJy4vU2VhcmNoJztcbmltcG9ydCBUZXh0QXJlYSBmcm9tICcuL1RleHRBcmVhJztcbmNvbnN0IElucHV0ID0gSW50ZXJuYWxJbnB1dDtcbklucHV0Lkdyb3VwID0gR3JvdXA7XG5JbnB1dC5TZWFyY2ggPSBTZWFyY2g7XG5JbnB1dC5UZXh0QXJlYSA9IFRleHRBcmVhO1xuSW5wdXQuUGFzc3dvcmQgPSBQYXNzd29yZDtcbklucHV0Lk9UUCA9IE9UUDtcbmV4cG9ydCBkZWZhdWx0IElucHV0OyIsICJcInVzZSBjbGllbnRcIjtcblxudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEZhc3RDb2xvciB9IGZyb20gJ0BhbnQtZGVzaWduL2Zhc3QtY29sb3InO1xuaW1wb3J0IENoZWNrQ2lyY2xlRmlsbGVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9DaGVja0NpcmNsZUZpbGxlZFwiO1xuaW1wb3J0IENoZWNrT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0NoZWNrT3V0bGluZWRcIjtcbmltcG9ydCBDbG9zZUNpcmNsZUZpbGxlZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvQ2xvc2VDaXJjbGVGaWxsZWRcIjtcbmltcG9ydCBDbG9zZU91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9DbG9zZU91dGxpbmVkXCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBvbWl0IGZyb20gXCJyYy11dGlsL2VzL29taXRcIjtcbmltcG9ydCB7IGRldlVzZVdhcm5pbmcgfSBmcm9tICcuLi9fdXRpbC93YXJuaW5nJztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IENpcmNsZSBmcm9tICcuL0NpcmNsZSc7XG5pbXBvcnQgTGluZSBmcm9tICcuL0xpbmUnO1xuaW1wb3J0IFN0ZXBzIGZyb20gJy4vU3RlcHMnO1xuaW1wb3J0IHVzZVN0eWxlIGZyb20gJy4vc3R5bGUnO1xuaW1wb3J0IHsgZ2V0U2l6ZSwgZ2V0U3VjY2Vzc1BlcmNlbnQsIHZhbGlkUHJvZ3Jlc3MgfSBmcm9tICcuL3V0aWxzJztcbmV4cG9ydCBjb25zdCBQcm9ncmVzc1R5cGVzID0gWydsaW5lJywgJ2NpcmNsZScsICdkYXNoYm9hcmQnXTtcbmNvbnN0IFByb2dyZXNzU3RhdHVzZXMgPSBbJ25vcm1hbCcsICdleGNlcHRpb24nLCAnYWN0aXZlJywgJ3N1Y2Nlc3MnXTtcbmNvbnN0IFByb2dyZXNzID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHByb3BzLCByZWYpID0+IHtcbiAgY29uc3Qge1xuICAgICAgcHJlZml4Q2xzOiBjdXN0b21pemVQcmVmaXhDbHMsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICByb290Q2xhc3NOYW1lLFxuICAgICAgc3RlcHMsXG4gICAgICBzdHJva2VDb2xvcixcbiAgICAgIHBlcmNlbnQgPSAwLFxuICAgICAgc2l6ZSA9ICdkZWZhdWx0JyxcbiAgICAgIHNob3dJbmZvID0gdHJ1ZSxcbiAgICAgIHR5cGUgPSAnbGluZScsXG4gICAgICBzdGF0dXMsXG4gICAgICBmb3JtYXQsXG4gICAgICBzdHlsZSxcbiAgICAgIHBlcmNlbnRQb3NpdGlvbiA9IHt9XG4gICAgfSA9IHByb3BzLFxuICAgIHJlc3RQcm9wcyA9IF9fcmVzdChwcm9wcywgW1wicHJlZml4Q2xzXCIsIFwiY2xhc3NOYW1lXCIsIFwicm9vdENsYXNzTmFtZVwiLCBcInN0ZXBzXCIsIFwic3Ryb2tlQ29sb3JcIiwgXCJwZXJjZW50XCIsIFwic2l6ZVwiLCBcInNob3dJbmZvXCIsIFwidHlwZVwiLCBcInN0YXR1c1wiLCBcImZvcm1hdFwiLCBcInN0eWxlXCIsIFwicGVyY2VudFBvc2l0aW9uXCJdKTtcbiAgY29uc3Qge1xuICAgIGFsaWduOiBpbmZvQWxpZ24gPSAnZW5kJyxcbiAgICB0eXBlOiBpbmZvUG9zaXRpb24gPSAnb3V0ZXInXG4gIH0gPSBwZXJjZW50UG9zaXRpb247XG4gIGNvbnN0IHN0cm9rZUNvbG9yTm90QXJyYXkgPSBBcnJheS5pc0FycmF5KHN0cm9rZUNvbG9yKSA/IHN0cm9rZUNvbG9yWzBdIDogc3Ryb2tlQ29sb3I7XG4gIGNvbnN0IHN0cm9rZUNvbG9yTm90R3JhZGllbnQgPSB0eXBlb2Ygc3Ryb2tlQ29sb3IgPT09ICdzdHJpbmcnIHx8IEFycmF5LmlzQXJyYXkoc3Ryb2tlQ29sb3IpID8gc3Ryb2tlQ29sb3IgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHN0cm9rZUNvbG9ySXNCcmlnaHQgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoc3Ryb2tlQ29sb3JOb3RBcnJheSkge1xuICAgICAgY29uc3QgY29sb3IgPSB0eXBlb2Ygc3Ryb2tlQ29sb3JOb3RBcnJheSA9PT0gJ3N0cmluZycgPyBzdHJva2VDb2xvck5vdEFycmF5IDogT2JqZWN0LnZhbHVlcyhzdHJva2VDb2xvck5vdEFycmF5KVswXTtcbiAgICAgIHJldHVybiBuZXcgRmFzdENvbG9yKGNvbG9yKS5pc0xpZ2h0KCk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSwgW3N0cm9rZUNvbG9yXSk7XG4gIGNvbnN0IHBlcmNlbnROdW1iZXIgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIGNvbnN0IHN1Y2Nlc3NQZXJjZW50ID0gZ2V0U3VjY2Vzc1BlcmNlbnQocHJvcHMpO1xuICAgIHJldHVybiBwYXJzZUludChzdWNjZXNzUGVyY2VudCAhPT0gdW5kZWZpbmVkID8gKF9hID0gc3VjY2Vzc1BlcmNlbnQgIT09IG51bGwgJiYgc3VjY2Vzc1BlcmNlbnQgIT09IHZvaWQgMCA/IHN1Y2Nlc3NQZXJjZW50IDogMCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRvU3RyaW5nKCkgOiAoX2IgPSBwZXJjZW50ICE9PSBudWxsICYmIHBlcmNlbnQgIT09IHZvaWQgMCA/IHBlcmNlbnQgOiAwKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IudG9TdHJpbmcoKSwgMTApO1xuICB9LCBbcGVyY2VudCwgcHJvcHMuc3VjY2VzcywgcHJvcHMuc3VjY2Vzc1BlcmNlbnRdKTtcbiAgY29uc3QgcHJvZ3Jlc3NTdGF0dXMgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoIVByb2dyZXNzU3RhdHVzZXMuaW5jbHVkZXMoc3RhdHVzKSAmJiBwZXJjZW50TnVtYmVyID49IDEwMCkge1xuICAgICAgcmV0dXJuICdzdWNjZXNzJztcbiAgICB9XG4gICAgcmV0dXJuIHN0YXR1cyB8fCAnbm9ybWFsJztcbiAgfSwgW3N0YXR1cywgcGVyY2VudE51bWJlcl0pO1xuICBjb25zdCB7XG4gICAgZ2V0UHJlZml4Q2xzLFxuICAgIGRpcmVjdGlvbixcbiAgICBwcm9ncmVzczogcHJvZ3Jlc3NTdHlsZVxuICB9ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KTtcbiAgY29uc3QgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdwcm9ncmVzcycsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIGNvbnN0IFt3cmFwQ1NTVmFyLCBoYXNoSWQsIGNzc1ZhckNsc10gPSB1c2VTdHlsZShwcmVmaXhDbHMpO1xuICBjb25zdCBpc0xpbmVUeXBlID0gdHlwZSA9PT0gJ2xpbmUnO1xuICBjb25zdCBpc1B1cmVMaW5lVHlwZSA9IGlzTGluZVR5cGUgJiYgIXN0ZXBzO1xuICBjb25zdCBwcm9ncmVzc0luZm8gPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoIXNob3dJbmZvKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgc3VjY2Vzc1BlcmNlbnQgPSBnZXRTdWNjZXNzUGVyY2VudChwcm9wcyk7XG4gICAgbGV0IHRleHQ7XG4gICAgY29uc3QgdGV4dEZvcm1hdHRlciA9IGZvcm1hdCB8fCAobnVtYmVyID0+IGAke251bWJlcn0lYCk7XG4gICAgY29uc3QgaXNCcmlnaHRJbm5lckNvbG9yID0gaXNMaW5lVHlwZSAmJiBzdHJva2VDb2xvcklzQnJpZ2h0ICYmIGluZm9Qb3NpdGlvbiA9PT0gJ2lubmVyJztcbiAgICBpZiAoaW5mb1Bvc2l0aW9uID09PSAnaW5uZXInIHx8IGZvcm1hdCB8fCBwcm9ncmVzc1N0YXR1cyAhPT0gJ2V4Y2VwdGlvbicgJiYgcHJvZ3Jlc3NTdGF0dXMgIT09ICdzdWNjZXNzJykge1xuICAgICAgdGV4dCA9IHRleHRGb3JtYXR0ZXIodmFsaWRQcm9ncmVzcyhwZXJjZW50KSwgdmFsaWRQcm9ncmVzcyhzdWNjZXNzUGVyY2VudCkpO1xuICAgIH0gZWxzZSBpZiAocHJvZ3Jlc3NTdGF0dXMgPT09ICdleGNlcHRpb24nKSB7XG4gICAgICB0ZXh0ID0gaXNMaW5lVHlwZSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENsb3NlQ2lyY2xlRmlsbGVkLCBudWxsKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENsb3NlT3V0bGluZWQsIG51bGwpO1xuICAgIH0gZWxzZSBpZiAocHJvZ3Jlc3NTdGF0dXMgPT09ICdzdWNjZXNzJykge1xuICAgICAgdGV4dCA9IGlzTGluZVR5cGUgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDaGVja0NpcmNsZUZpbGxlZCwgbnVsbCkgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDaGVja091dGxpbmVkLCBudWxsKTtcbiAgICB9XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoYCR7cHJlZml4Q2xzfS10ZXh0YCwge1xuICAgICAgICBbYCR7cHJlZml4Q2xzfS10ZXh0LWJyaWdodGBdOiBpc0JyaWdodElubmVyQ29sb3IsXG4gICAgICAgIFtgJHtwcmVmaXhDbHN9LXRleHQtJHtpbmZvQWxpZ259YF06IGlzUHVyZUxpbmVUeXBlLFxuICAgICAgICBbYCR7cHJlZml4Q2xzfS10ZXh0LSR7aW5mb1Bvc2l0aW9ufWBdOiBpc1B1cmVMaW5lVHlwZVxuICAgICAgfSksXG4gICAgICB0aXRsZTogdHlwZW9mIHRleHQgPT09ICdzdHJpbmcnID8gdGV4dCA6IHVuZGVmaW5lZFxuICAgIH0sIHRleHQpO1xuICB9LCBbc2hvd0luZm8sIHBlcmNlbnQsIHBlcmNlbnROdW1iZXIsIHByb2dyZXNzU3RhdHVzLCB0eXBlLCBwcmVmaXhDbHMsIGZvcm1hdF0pO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGNvbnN0IHdhcm5pbmcgPSBkZXZVc2VXYXJuaW5nKCdQcm9ncmVzcycpO1xuICAgIHdhcm5pbmcuZGVwcmVjYXRlZCghKCdzdWNjZXNzUGVyY2VudCcgaW4gcHJvcHMpLCAnc3VjY2Vzc1BlcmNlbnQnLCAnc3VjY2Vzcy5wZXJjZW50Jyk7XG4gICAgd2FybmluZy5kZXByZWNhdGVkKCEoJ3dpZHRoJyBpbiBwcm9wcyksICd3aWR0aCcsICdzaXplJyk7XG4gICAgaWYgKHR5cGUgPT09ICdjaXJjbGUnIHx8IHR5cGUgPT09ICdkYXNoYm9hcmQnKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzaXplKSkge1xuICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKGZhbHNlLCAndXNhZ2UnLCAnVHlwZSBcImNpcmNsZVwiIGFuZCBcImRhc2hib2FyZFwiIGRvIG5vdCBhY2NlcHQgYXJyYXkgYXMgYHNpemVgLCBwbGVhc2UgdXNlIG51bWJlciBvciBwcmVzZXQgc2l6ZSBpbnN0ZWFkLicpIDogdm9pZCAwO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc2l6ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhmYWxzZSwgJ3VzYWdlJywgJ1R5cGUgXCJjaXJjbGVcIiBhbmQgXCJkYXNoYm9hcmRcIiBkbyBub3QgYWNjZXB0IG9iamVjdCBhcyBgc2l6ZWAsIHBsZWFzZSB1c2UgbnVtYmVyIG9yIHByZXNldCBzaXplIGluc3RlYWQuJykgOiB2b2lkIDA7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwcm9wcy5zdWNjZXNzICYmICdwcm9ncmVzcycgaW4gcHJvcHMuc3VjY2Vzcykge1xuICAgICAgd2FybmluZy5kZXByZWNhdGVkKGZhbHNlLCAnc3VjY2Vzcy5wcm9ncmVzcycsICdzdWNjZXNzLnBlcmNlbnQnKTtcbiAgICB9XG4gIH1cbiAgbGV0IHByb2dyZXNzO1xuICAvLyBSZW5kZXIgcHJvZ3Jlc3Mgc2hhcGVcbiAgaWYgKHR5cGUgPT09ICdsaW5lJykge1xuICAgIHByb2dyZXNzID0gc3RlcHMgPyAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU3RlcHMsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICBzdHJva2VDb2xvcjogc3Ryb2tlQ29sb3JOb3RHcmFkaWVudCxcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgc3RlcHM6IHR5cGVvZiBzdGVwcyA9PT0gJ29iamVjdCcgPyBzdGVwcy5jb3VudCA6IHN0ZXBzXG4gICAgfSksIHByb2dyZXNzSW5mbykpIDogKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExpbmUsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICBzdHJva2VDb2xvcjogc3Ryb2tlQ29sb3JOb3RBcnJheSxcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgZGlyZWN0aW9uOiBkaXJlY3Rpb24sXG4gICAgICBwZXJjZW50UG9zaXRpb246IHtcbiAgICAgICAgYWxpZ246IGluZm9BbGlnbixcbiAgICAgICAgdHlwZTogaW5mb1Bvc2l0aW9uXG4gICAgICB9XG4gICAgfSksIHByb2dyZXNzSW5mbykpO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdjaXJjbGUnIHx8IHR5cGUgPT09ICdkYXNoYm9hcmQnKSB7XG4gICAgcHJvZ3Jlc3MgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDaXJjbGUsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICBzdHJva2VDb2xvcjogc3Ryb2tlQ29sb3JOb3RBcnJheSxcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgcHJvZ3Jlc3NTdGF0dXM6IHByb2dyZXNzU3RhdHVzXG4gICAgfSksIHByb2dyZXNzSW5mbyk7XG4gIH1cbiAgY29uc3QgY2xhc3NTdHJpbmcgPSBjbGFzc05hbWVzKHByZWZpeENscywgYCR7cHJlZml4Q2xzfS1zdGF0dXMtJHtwcm9ncmVzc1N0YXR1c31gLCB7XG4gICAgW2Ake3ByZWZpeENsc30tJHt0eXBlID09PSAnZGFzaGJvYXJkJyAmJiAnY2lyY2xlJyB8fCB0eXBlfWBdOiB0eXBlICE9PSAnbGluZScsXG4gICAgW2Ake3ByZWZpeENsc30taW5saW5lLWNpcmNsZWBdOiB0eXBlID09PSAnY2lyY2xlJyAmJiBnZXRTaXplKHNpemUsICdjaXJjbGUnKVswXSA8PSAyMCxcbiAgICBbYCR7cHJlZml4Q2xzfS1saW5lYF06IGlzUHVyZUxpbmVUeXBlLFxuICAgIFtgJHtwcmVmaXhDbHN9LWxpbmUtYWxpZ24tJHtpbmZvQWxpZ259YF06IGlzUHVyZUxpbmVUeXBlLFxuICAgIFtgJHtwcmVmaXhDbHN9LWxpbmUtcG9zaXRpb24tJHtpbmZvUG9zaXRpb259YF06IGlzUHVyZUxpbmVUeXBlLFxuICAgIFtgJHtwcmVmaXhDbHN9LXN0ZXBzYF06IHN0ZXBzLFxuICAgIFtgJHtwcmVmaXhDbHN9LXNob3ctaW5mb2BdOiBzaG93SW5mbyxcbiAgICBbYCR7cHJlZml4Q2xzfS0ke3NpemV9YF06IHR5cGVvZiBzaXplID09PSAnc3RyaW5nJyxcbiAgICBbYCR7cHJlZml4Q2xzfS1ydGxgXTogZGlyZWN0aW9uID09PSAncnRsJ1xuICB9LCBwcm9ncmVzc1N0eWxlID09PSBudWxsIHx8IHByb2dyZXNzU3R5bGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHByb2dyZXNzU3R5bGUuY2xhc3NOYW1lLCBjbGFzc05hbWUsIHJvb3RDbGFzc05hbWUsIGhhc2hJZCwgY3NzVmFyQ2xzKTtcbiAgcmV0dXJuIHdyYXBDU1NWYXIoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgT2JqZWN0LmFzc2lnbih7XG4gICAgcmVmOiByZWYsXG4gICAgc3R5bGU6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJvZ3Jlc3NTdHlsZSA9PT0gbnVsbCB8fCBwcm9ncmVzc1N0eWxlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwcm9ncmVzc1N0eWxlLnN0eWxlKSwgc3R5bGUpLFxuICAgIGNsYXNzTmFtZTogY2xhc3NTdHJpbmcsXG4gICAgcm9sZTogXCJwcm9ncmVzc2JhclwiLFxuICAgIFwiYXJpYS12YWx1ZW5vd1wiOiBwZXJjZW50TnVtYmVyLFxuICAgIFwiYXJpYS12YWx1ZW1pblwiOiAwLFxuICAgIFwiYXJpYS12YWx1ZW1heFwiOiAxMDBcbiAgfSwgb21pdChyZXN0UHJvcHMsIFsndHJhaWxDb2xvcicsICdzdHJva2VXaWR0aCcsICd3aWR0aCcsICdnYXBEZWdyZWUnLCAnZ2FwUG9zaXRpb24nLCAnc3Ryb2tlTGluZWNhcCcsICdzdWNjZXNzJywgJ3N1Y2Nlc3NQZXJjZW50J10pKSwgcHJvZ3Jlc3MpKTtcbn0pO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgUHJvZ3Jlc3MuZGlzcGxheU5hbWUgPSAnUHJvZ3Jlc3MnO1xufVxuZXhwb3J0IGRlZmF1bHQgUHJvZ3Jlc3M7IiwgIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IENpcmNsZSBhcyBSQ0NpcmNsZSB9IGZyb20gJ3JjLXByb2dyZXNzJztcbmltcG9ydCBUb29sdGlwIGZyb20gJy4uL3Rvb2x0aXAnO1xuaW1wb3J0IHsgZ2V0UGVyY2VudGFnZSwgZ2V0U2l6ZSwgZ2V0U3Ryb2tlQ29sb3IgfSBmcm9tICcuL3V0aWxzJztcbmNvbnN0IENJUkNMRV9NSU5fU1RST0tFX1dJRFRIID0gMztcbmNvbnN0IGdldE1pblBlcmNlbnQgPSB3aWR0aCA9PiBDSVJDTEVfTUlOX1NUUk9LRV9XSURUSCAvIHdpZHRoICogMTAwO1xuY29uc3QgQ2lyY2xlID0gcHJvcHMgPT4ge1xuICBjb25zdCB7XG4gICAgcHJlZml4Q2xzLFxuICAgIHRyYWlsQ29sb3IgPSBudWxsLFxuICAgIHN0cm9rZUxpbmVjYXAgPSAncm91bmQnLFxuICAgIGdhcFBvc2l0aW9uLFxuICAgIGdhcERlZ3JlZSxcbiAgICB3aWR0aDogb3JpZ2luV2lkdGggPSAxMjAsXG4gICAgdHlwZSxcbiAgICBjaGlsZHJlbixcbiAgICBzdWNjZXNzLFxuICAgIHNpemUgPSBvcmlnaW5XaWR0aCxcbiAgICBzdGVwc1xuICB9ID0gcHJvcHM7XG4gIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IGdldFNpemUoc2l6ZSwgJ2NpcmNsZScpO1xuICBsZXQge1xuICAgIHN0cm9rZVdpZHRoXG4gIH0gPSBwcm9wcztcbiAgaWYgKHN0cm9rZVdpZHRoID09PSB1bmRlZmluZWQpIHtcbiAgICBzdHJva2VXaWR0aCA9IE1hdGgubWF4KGdldE1pblBlcmNlbnQod2lkdGgpLCA2KTtcbiAgfVxuICBjb25zdCBjaXJjbGVTdHlsZSA9IHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgZm9udFNpemU6IHdpZHRoICogMC4xNSArIDZcbiAgfTtcbiAgY29uc3QgcmVhbEdhcERlZ3JlZSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIC8vIFN1cHBvcnQgZ2FwRGVnID0gMCB3aGVuIHR5cGUgPSAnZGFzaGJvYXJkJ1xuICAgIGlmIChnYXBEZWdyZWUgfHwgZ2FwRGVncmVlID09PSAwKSB7XG4gICAgICByZXR1cm4gZ2FwRGVncmVlO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ2Rhc2hib2FyZCcpIHtcbiAgICAgIHJldHVybiA3NTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSwgW2dhcERlZ3JlZSwgdHlwZV0pO1xuICBjb25zdCBwZXJjZW50QXJyYXkgPSBnZXRQZXJjZW50YWdlKHByb3BzKTtcbiAgY29uc3QgZ2FwUG9zID0gZ2FwUG9zaXRpb24gfHwgdHlwZSA9PT0gJ2Rhc2hib2FyZCcgJiYgJ2JvdHRvbScgfHwgdW5kZWZpbmVkO1xuICAvLyB1c2luZyBjbGFzc05hbWUgdG8gc3R5bGUgc3Ryb2tlIGNvbG9yXG4gIGNvbnN0IGlzR3JhZGllbnQgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocHJvcHMuc3Ryb2tlQ29sb3IpID09PSAnW29iamVjdCBPYmplY3RdJztcbiAgY29uc3Qgc3Ryb2tlQ29sb3IgPSBnZXRTdHJva2VDb2xvcih7XG4gICAgc3VjY2VzcyxcbiAgICBzdHJva2VDb2xvcjogcHJvcHMuc3Ryb2tlQ29sb3JcbiAgfSk7XG4gIGNvbnN0IHdyYXBwZXJDbGFzc05hbWUgPSBjbGFzc05hbWVzKGAke3ByZWZpeENsc30taW5uZXJgLCB7XG4gICAgW2Ake3ByZWZpeENsc30tY2lyY2xlLWdyYWRpZW50YF06IGlzR3JhZGllbnRcbiAgfSk7XG4gIGNvbnN0IGNpcmNsZUNvbnRlbnQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSQ0NpcmNsZSwge1xuICAgIHN0ZXBzOiBzdGVwcyxcbiAgICBwZXJjZW50OiBzdGVwcyA/IHBlcmNlbnRBcnJheVsxXSA6IHBlcmNlbnRBcnJheSxcbiAgICBzdHJva2VXaWR0aDogc3Ryb2tlV2lkdGgsXG4gICAgdHJhaWxXaWR0aDogc3Ryb2tlV2lkdGgsXG4gICAgc3Ryb2tlQ29sb3I6IHN0ZXBzID8gc3Ryb2tlQ29sb3JbMV0gOiBzdHJva2VDb2xvcixcbiAgICBzdHJva2VMaW5lY2FwOiBzdHJva2VMaW5lY2FwLFxuICAgIHRyYWlsQ29sb3I6IHRyYWlsQ29sb3IsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgZ2FwRGVncmVlOiByZWFsR2FwRGVncmVlLFxuICAgIGdhcFBvc2l0aW9uOiBnYXBQb3NcbiAgfSk7XG4gIGNvbnN0IHNtYWxsQ2lyY2xlID0gd2lkdGggPD0gMjA7XG4gIGNvbnN0IG5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiB3cmFwcGVyQ2xhc3NOYW1lLFxuICAgIHN0eWxlOiBjaXJjbGVTdHlsZVxuICB9LCBjaXJjbGVDb250ZW50LCAhc21hbGxDaXJjbGUgJiYgY2hpbGRyZW4pO1xuICBpZiAoc21hbGxDaXJjbGUpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcCwge1xuICAgICAgdGl0bGU6IGNoaWxkcmVuXG4gICAgfSwgbm9kZSk7XG4gIH1cbiAgcmV0dXJuIG5vZGU7XG59O1xuZXhwb3J0IGRlZmF1bHQgQ2lyY2xlOyIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcImNsYXNzTmFtZVwiLCBcInBlcmNlbnRcIiwgXCJwcmVmaXhDbHNcIiwgXCJzdHJva2VDb2xvclwiLCBcInN0cm9rZUxpbmVjYXBcIiwgXCJzdHJva2VXaWR0aFwiLCBcInN0eWxlXCIsIFwidHJhaWxDb2xvclwiLCBcInRyYWlsV2lkdGhcIiwgXCJ0cmFuc2l0aW9uXCJdO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyB1c2VUcmFuc2l0aW9uRHVyYXRpb24sIGRlZmF1bHRQcm9wcyB9IGZyb20gXCIuL2NvbW1vblwiO1xudmFyIExpbmUgPSBmdW5jdGlvbiBMaW5lKHByb3BzKSB7XG4gIHZhciBfZGVmYXVsdFByb3BzJHByb3BzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBkZWZhdWx0UHJvcHMpLCBwcm9wcyksXG4gICAgY2xhc3NOYW1lID0gX2RlZmF1bHRQcm9wcyRwcm9wcy5jbGFzc05hbWUsXG4gICAgcGVyY2VudCA9IF9kZWZhdWx0UHJvcHMkcHJvcHMucGVyY2VudCxcbiAgICBwcmVmaXhDbHMgPSBfZGVmYXVsdFByb3BzJHByb3BzLnByZWZpeENscyxcbiAgICBzdHJva2VDb2xvciA9IF9kZWZhdWx0UHJvcHMkcHJvcHMuc3Ryb2tlQ29sb3IsXG4gICAgc3Ryb2tlTGluZWNhcCA9IF9kZWZhdWx0UHJvcHMkcHJvcHMuc3Ryb2tlTGluZWNhcCxcbiAgICBzdHJva2VXaWR0aCA9IF9kZWZhdWx0UHJvcHMkcHJvcHMuc3Ryb2tlV2lkdGgsXG4gICAgc3R5bGUgPSBfZGVmYXVsdFByb3BzJHByb3BzLnN0eWxlLFxuICAgIHRyYWlsQ29sb3IgPSBfZGVmYXVsdFByb3BzJHByb3BzLnRyYWlsQ29sb3IsXG4gICAgdHJhaWxXaWR0aCA9IF9kZWZhdWx0UHJvcHMkcHJvcHMudHJhaWxXaWR0aCxcbiAgICB0cmFuc2l0aW9uID0gX2RlZmF1bHRQcm9wcyRwcm9wcy50cmFuc2l0aW9uLFxuICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfZGVmYXVsdFByb3BzJHByb3BzLCBfZXhjbHVkZWQpO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICBkZWxldGUgcmVzdFByb3BzLmdhcFBvc2l0aW9uO1xuICB2YXIgcGVyY2VudExpc3QgPSBBcnJheS5pc0FycmF5KHBlcmNlbnQpID8gcGVyY2VudCA6IFtwZXJjZW50XTtcbiAgdmFyIHN0cm9rZUNvbG9yTGlzdCA9IEFycmF5LmlzQXJyYXkoc3Ryb2tlQ29sb3IpID8gc3Ryb2tlQ29sb3IgOiBbc3Ryb2tlQ29sb3JdO1xuICB2YXIgcGF0aHMgPSB1c2VUcmFuc2l0aW9uRHVyYXRpb24oKTtcbiAgdmFyIGNlbnRlciA9IHN0cm9rZVdpZHRoIC8gMjtcbiAgdmFyIHJpZ2h0ID0gMTAwIC0gc3Ryb2tlV2lkdGggLyAyO1xuICB2YXIgcGF0aFN0cmluZyA9IFwiTSBcIi5jb25jYXQoc3Ryb2tlTGluZWNhcCA9PT0gJ3JvdW5kJyA/IGNlbnRlciA6IDAsIFwiLFwiKS5jb25jYXQoY2VudGVyLCBcIlxcbiAgICAgICAgIEwgXCIpLmNvbmNhdChzdHJva2VMaW5lY2FwID09PSAncm91bmQnID8gcmlnaHQgOiAxMDAsIFwiLFwiKS5jb25jYXQoY2VudGVyKTtcbiAgdmFyIHZpZXdCb3hTdHJpbmcgPSBcIjAgMCAxMDAgXCIuY29uY2F0KHN0cm9rZVdpZHRoKTtcbiAgdmFyIHN0YWNrUHRnID0gMDtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1saW5lXCIpLCBjbGFzc05hbWUpLFxuICAgIHZpZXdCb3g6IHZpZXdCb3hTdHJpbmcsXG4gICAgcHJlc2VydmVBc3BlY3RSYXRpbzogXCJub25lXCIsXG4gICAgc3R5bGU6IHN0eWxlXG4gIH0sIHJlc3RQcm9wcyksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxpbmUtdHJhaWxcIiksXG4gICAgZDogcGF0aFN0cmluZyxcbiAgICBzdHJva2VMaW5lY2FwOiBzdHJva2VMaW5lY2FwLFxuICAgIHN0cm9rZTogdHJhaWxDb2xvcixcbiAgICBzdHJva2VXaWR0aDogdHJhaWxXaWR0aCB8fCBzdHJva2VXaWR0aCxcbiAgICBmaWxsT3BhY2l0eTogXCIwXCJcbiAgfSksIHBlcmNlbnRMaXN0Lm1hcChmdW5jdGlvbiAocHRnLCBpbmRleCkge1xuICAgIHZhciBkYXNoUGVyY2VudCA9IDE7XG4gICAgc3dpdGNoIChzdHJva2VMaW5lY2FwKSB7XG4gICAgICBjYXNlICdyb3VuZCc6XG4gICAgICAgIGRhc2hQZXJjZW50ID0gMSAtIHN0cm9rZVdpZHRoIC8gMTAwO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3NxdWFyZSc6XG4gICAgICAgIGRhc2hQZXJjZW50ID0gMSAtIHN0cm9rZVdpZHRoIC8gMiAvIDEwMDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBkYXNoUGVyY2VudCA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB2YXIgcGF0aFN0eWxlID0ge1xuICAgICAgc3Ryb2tlRGFzaGFycmF5OiBcIlwiLmNvbmNhdChwdGcgKiBkYXNoUGVyY2VudCwgXCJweCwgMTAwcHhcIiksXG4gICAgICBzdHJva2VEYXNob2Zmc2V0OiBcIi1cIi5jb25jYXQoc3RhY2tQdGcsIFwicHhcIiksXG4gICAgICB0cmFuc2l0aW9uOiB0cmFuc2l0aW9uIHx8ICdzdHJva2UtZGFzaG9mZnNldCAwLjNzIGVhc2UgMHMsIHN0cm9rZS1kYXNoYXJyYXkgLjNzIGVhc2UgMHMsIHN0cm9rZSAwLjNzIGxpbmVhcidcbiAgICB9O1xuICAgIHZhciBjb2xvciA9IHN0cm9rZUNvbG9yTGlzdFtpbmRleF0gfHwgc3Ryb2tlQ29sb3JMaXN0W3N0cm9rZUNvbG9yTGlzdC5sZW5ndGggLSAxXTtcbiAgICBzdGFja1B0ZyArPSBwdGc7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgICBrZXk6IGluZGV4LFxuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxpbmUtcGF0aFwiKSxcbiAgICAgIGQ6IHBhdGhTdHJpbmcsXG4gICAgICBzdHJva2VMaW5lY2FwOiBzdHJva2VMaW5lY2FwLFxuICAgICAgc3Ryb2tlOiBjb2xvcixcbiAgICAgIHN0cm9rZVdpZHRoOiBzdHJva2VXaWR0aCxcbiAgICAgIGZpbGxPcGFjaXR5OiBcIjBcIixcbiAgICAgIHJlZjogZnVuY3Rpb24gcmVmKGVsZW0pIHtcbiAgICAgICAgLy8gaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlZnMtYW5kLXRoZS1kb20uaHRtbCNjYWxsYmFjay1yZWZzXG4gICAgICAgIC8vIFJlYWN0IHdpbGwgY2FsbCB0aGUgcmVmIGNhbGxiYWNrIHdpdGggdGhlIERPTSBlbGVtZW50IHdoZW4gdGhlIGNvbXBvbmVudCBtb3VudHMsXG4gICAgICAgIC8vIGFuZCBjYWxsIGl0IHdpdGggYG51bGxgIHdoZW4gaXQgdW5tb3VudHMuXG4gICAgICAgIC8vIFJlZnMgYXJlIGd1YXJhbnRlZWQgdG8gYmUgdXAtdG8tZGF0ZSBiZWZvcmUgY29tcG9uZW50RGlkTW91bnQgb3IgY29tcG9uZW50RGlkVXBkYXRlIGZpcmVzLlxuXG4gICAgICAgIHBhdGhzW2luZGV4XSA9IGVsZW07XG4gICAgICB9LFxuICAgICAgc3R5bGU6IHBhdGhTdHlsZVxuICAgIH0pO1xuICB9KSk7XG59O1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgTGluZS5kaXNwbGF5TmFtZSA9ICdMaW5lJztcbn1cbmV4cG9ydCBkZWZhdWx0IExpbmU7IiwgImltcG9ydCB7IHVzZVJlZiwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuZXhwb3J0IHZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIHBlcmNlbnQ6IDAsXG4gIHByZWZpeENsczogJ3JjLXByb2dyZXNzJyxcbiAgc3Ryb2tlQ29sb3I6ICcjMmRiN2Y1JyxcbiAgc3Ryb2tlTGluZWNhcDogJ3JvdW5kJyxcbiAgc3Ryb2tlV2lkdGg6IDEsXG4gIHRyYWlsQ29sb3I6ICcjRDlEOUQ5JyxcbiAgdHJhaWxXaWR0aDogMSxcbiAgZ2FwUG9zaXRpb246ICdib3R0b20nXG59O1xuZXhwb3J0IHZhciB1c2VUcmFuc2l0aW9uRHVyYXRpb24gPSBmdW5jdGlvbiB1c2VUcmFuc2l0aW9uRHVyYXRpb24oKSB7XG4gIHZhciBwYXRoc1JlZiA9IHVzZVJlZihbXSk7XG4gIHZhciBwcmV2VGltZVN0YW1wID0gdXNlUmVmKG51bGwpO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBub3cgPSBEYXRlLm5vdygpO1xuICAgIHZhciB1cGRhdGVkID0gZmFsc2U7XG4gICAgcGF0aHNSZWYuY3VycmVudC5mb3JFYWNoKGZ1bmN0aW9uIChwYXRoKSB7XG4gICAgICBpZiAoIXBhdGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdXBkYXRlZCA9IHRydWU7XG4gICAgICB2YXIgcGF0aFN0eWxlID0gcGF0aC5zdHlsZTtcbiAgICAgIHBhdGhTdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSAnLjNzLCAuM3MsIC4zcywgLjA2cyc7XG4gICAgICBpZiAocHJldlRpbWVTdGFtcC5jdXJyZW50ICYmIG5vdyAtIHByZXZUaW1lU3RhbXAuY3VycmVudCA8IDEwMCkge1xuICAgICAgICBwYXRoU3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uID0gJzBzLCAwcyc7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgIHByZXZUaW1lU3RhbXAuY3VycmVudCA9IERhdGUubm93KCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHBhdGhzUmVmLmN1cnJlbnQ7XG59OyIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcImlkXCIsIFwicHJlZml4Q2xzXCIsIFwic3RlcHNcIiwgXCJzdHJva2VXaWR0aFwiLCBcInRyYWlsV2lkdGhcIiwgXCJnYXBEZWdyZWVcIiwgXCJnYXBQb3NpdGlvblwiLCBcInRyYWlsQ29sb3JcIiwgXCJzdHJva2VMaW5lY2FwXCIsIFwic3R5bGVcIiwgXCJjbGFzc05hbWVcIiwgXCJzdHJva2VDb2xvclwiLCBcInBlcmNlbnRcIl07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IGRlZmF1bHRQcm9wcywgdXNlVHJhbnNpdGlvbkR1cmF0aW9uIH0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHVzZUlkIGZyb20gXCIuLi9ob29rcy91c2VJZFwiO1xuaW1wb3J0IFB0Z0NpcmNsZSBmcm9tIFwiLi9QdGdDaXJjbGVcIjtcbmltcG9ydCB7IFZJRVdfQk9YX1NJWkUsIGdldENpcmNsZVN0eWxlIH0gZnJvbSBcIi4vdXRpbFwiO1xuZnVuY3Rpb24gdG9BcnJheSh2YWx1ZSkge1xuICB2YXIgbWVyZ2VkVmFsdWUgPSB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdm9pZCAwID8gdmFsdWUgOiBbXTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkobWVyZ2VkVmFsdWUpID8gbWVyZ2VkVmFsdWUgOiBbbWVyZ2VkVmFsdWVdO1xufVxudmFyIENpcmNsZSA9IGZ1bmN0aW9uIENpcmNsZShwcm9wcykge1xuICB2YXIgX2RlZmF1bHRQcm9wcyRwcm9wcyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZGVmYXVsdFByb3BzKSwgcHJvcHMpLFxuICAgIGlkID0gX2RlZmF1bHRQcm9wcyRwcm9wcy5pZCxcbiAgICBwcmVmaXhDbHMgPSBfZGVmYXVsdFByb3BzJHByb3BzLnByZWZpeENscyxcbiAgICBzdGVwcyA9IF9kZWZhdWx0UHJvcHMkcHJvcHMuc3RlcHMsXG4gICAgc3Ryb2tlV2lkdGggPSBfZGVmYXVsdFByb3BzJHByb3BzLnN0cm9rZVdpZHRoLFxuICAgIHRyYWlsV2lkdGggPSBfZGVmYXVsdFByb3BzJHByb3BzLnRyYWlsV2lkdGgsXG4gICAgX2RlZmF1bHRQcm9wcyRwcm9wcyRnID0gX2RlZmF1bHRQcm9wcyRwcm9wcy5nYXBEZWdyZWUsXG4gICAgZ2FwRGVncmVlID0gX2RlZmF1bHRQcm9wcyRwcm9wcyRnID09PSB2b2lkIDAgPyAwIDogX2RlZmF1bHRQcm9wcyRwcm9wcyRnLFxuICAgIGdhcFBvc2l0aW9uID0gX2RlZmF1bHRQcm9wcyRwcm9wcy5nYXBQb3NpdGlvbixcbiAgICB0cmFpbENvbG9yID0gX2RlZmF1bHRQcm9wcyRwcm9wcy50cmFpbENvbG9yLFxuICAgIHN0cm9rZUxpbmVjYXAgPSBfZGVmYXVsdFByb3BzJHByb3BzLnN0cm9rZUxpbmVjYXAsXG4gICAgc3R5bGUgPSBfZGVmYXVsdFByb3BzJHByb3BzLnN0eWxlLFxuICAgIGNsYXNzTmFtZSA9IF9kZWZhdWx0UHJvcHMkcHJvcHMuY2xhc3NOYW1lLFxuICAgIHN0cm9rZUNvbG9yID0gX2RlZmF1bHRQcm9wcyRwcm9wcy5zdHJva2VDb2xvcixcbiAgICBwZXJjZW50ID0gX2RlZmF1bHRQcm9wcyRwcm9wcy5wZXJjZW50LFxuICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfZGVmYXVsdFByb3BzJHByb3BzLCBfZXhjbHVkZWQpO1xuICB2YXIgaGFsZlNpemUgPSBWSUVXX0JPWF9TSVpFIC8gMjtcbiAgdmFyIG1lcmdlZElkID0gdXNlSWQoaWQpO1xuICB2YXIgZ3JhZGllbnRJZCA9IFwiXCIuY29uY2F0KG1lcmdlZElkLCBcIi1ncmFkaWVudFwiKTtcbiAgdmFyIHJhZGl1cyA9IGhhbGZTaXplIC0gc3Ryb2tlV2lkdGggLyAyO1xuICB2YXIgcGVyaW1ldGVyID0gTWF0aC5QSSAqIDIgKiByYWRpdXM7XG4gIHZhciByb3RhdGVEZWcgPSBnYXBEZWdyZWUgPiAwID8gOTAgKyBnYXBEZWdyZWUgLyAyIDogLTkwO1xuICB2YXIgcGVyaW1ldGVyV2l0aG91dEdhcCA9IHBlcmltZXRlciAqICgoMzYwIC0gZ2FwRGVncmVlKSAvIDM2MCk7XG4gIHZhciBfcmVmID0gX3R5cGVvZihzdGVwcykgPT09ICdvYmplY3QnID8gc3RlcHMgOiB7XG4gICAgICBjb3VudDogc3RlcHMsXG4gICAgICBnYXA6IDJcbiAgICB9LFxuICAgIHN0ZXBDb3VudCA9IF9yZWYuY291bnQsXG4gICAgc3RlcEdhcCA9IF9yZWYuZ2FwO1xuICB2YXIgcGVyY2VudExpc3QgPSB0b0FycmF5KHBlcmNlbnQpO1xuICB2YXIgc3Ryb2tlQ29sb3JMaXN0ID0gdG9BcnJheShzdHJva2VDb2xvcik7XG4gIHZhciBncmFkaWVudCA9IHN0cm9rZUNvbG9yTGlzdC5maW5kKGZ1bmN0aW9uIChjb2xvcikge1xuICAgIHJldHVybiBjb2xvciAmJiBfdHlwZW9mKGNvbG9yKSA9PT0gJ29iamVjdCc7XG4gIH0pO1xuICB2YXIgaXNDb25pY0dyYWRpZW50ID0gZ3JhZGllbnQgJiYgX3R5cGVvZihncmFkaWVudCkgPT09ICdvYmplY3QnO1xuICB2YXIgbWVyZ2VkU3Ryb2tlTGluZWNhcCA9IGlzQ29uaWNHcmFkaWVudCA/ICdidXR0JyA6IHN0cm9rZUxpbmVjYXA7XG4gIHZhciBjaXJjbGVTdHlsZSA9IGdldENpcmNsZVN0eWxlKHBlcmltZXRlciwgcGVyaW1ldGVyV2l0aG91dEdhcCwgMCwgMTAwLCByb3RhdGVEZWcsIGdhcERlZ3JlZSwgZ2FwUG9zaXRpb24sIHRyYWlsQ29sb3IsIG1lcmdlZFN0cm9rZUxpbmVjYXAsIHN0cm9rZVdpZHRoKTtcbiAgdmFyIHBhdGhzID0gdXNlVHJhbnNpdGlvbkR1cmF0aW9uKCk7XG4gIHZhciBnZXRTdG9rZUxpc3QgPSBmdW5jdGlvbiBnZXRTdG9rZUxpc3QoKSB7XG4gICAgdmFyIHN0YWNrUHRnID0gMDtcbiAgICByZXR1cm4gcGVyY2VudExpc3QubWFwKGZ1bmN0aW9uIChwdGcsIGluZGV4KSB7XG4gICAgICB2YXIgY29sb3IgPSBzdHJva2VDb2xvckxpc3RbaW5kZXhdIHx8IHN0cm9rZUNvbG9yTGlzdFtzdHJva2VDb2xvckxpc3QubGVuZ3RoIC0gMV07XG4gICAgICB2YXIgY2lyY2xlU3R5bGVGb3JTdGFjayA9IGdldENpcmNsZVN0eWxlKHBlcmltZXRlciwgcGVyaW1ldGVyV2l0aG91dEdhcCwgc3RhY2tQdGcsIHB0Zywgcm90YXRlRGVnLCBnYXBEZWdyZWUsIGdhcFBvc2l0aW9uLCBjb2xvciwgbWVyZ2VkU3Ryb2tlTGluZWNhcCwgc3Ryb2tlV2lkdGgpO1xuICAgICAgc3RhY2tQdGcgKz0gcHRnO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFB0Z0NpcmNsZSwge1xuICAgICAgICBrZXk6IGluZGV4LFxuICAgICAgICBjb2xvcjogY29sb3IsXG4gICAgICAgIHB0ZzogcHRnLFxuICAgICAgICByYWRpdXM6IHJhZGl1cyxcbiAgICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICAgIGdyYWRpZW50SWQ6IGdyYWRpZW50SWQsXG4gICAgICAgIHN0eWxlOiBjaXJjbGVTdHlsZUZvclN0YWNrLFxuICAgICAgICBzdHJva2VMaW5lY2FwOiBtZXJnZWRTdHJva2VMaW5lY2FwLFxuICAgICAgICBzdHJva2VXaWR0aDogc3Ryb2tlV2lkdGgsXG4gICAgICAgIGdhcERlZ3JlZTogZ2FwRGVncmVlLFxuICAgICAgICByZWY6IGZ1bmN0aW9uIHJlZihlbGVtKSB7XG4gICAgICAgICAgLy8gaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlZnMtYW5kLXRoZS1kb20uaHRtbCNjYWxsYmFjay1yZWZzXG4gICAgICAgICAgLy8gUmVhY3Qgd2lsbCBjYWxsIHRoZSByZWYgY2FsbGJhY2sgd2l0aCB0aGUgRE9NIGVsZW1lbnQgd2hlbiB0aGUgY29tcG9uZW50IG1vdW50cyxcbiAgICAgICAgICAvLyBhbmQgY2FsbCBpdCB3aXRoIGBudWxsYCB3aGVuIGl0IHVubW91bnRzLlxuICAgICAgICAgIC8vIFJlZnMgYXJlIGd1YXJhbnRlZWQgdG8gYmUgdXAtdG8tZGF0ZSBiZWZvcmUgY29tcG9uZW50RGlkTW91bnQgb3IgY29tcG9uZW50RGlkVXBkYXRlIGZpcmVzLlxuXG4gICAgICAgICAgcGF0aHNbaW5kZXhdID0gZWxlbTtcbiAgICAgICAgfSxcbiAgICAgICAgc2l6ZTogVklFV19CT1hfU0laRVxuICAgICAgfSk7XG4gICAgfSkucmV2ZXJzZSgpO1xuICB9O1xuICB2YXIgZ2V0U3RlcFN0b2tlTGlzdCA9IGZ1bmN0aW9uIGdldFN0ZXBTdG9rZUxpc3QoKSB7XG4gICAgLy8gb25seSBzaG93IHRoZSBmaXJzdCBwZXJjZW50IHdoZW4gcGFzcyBzdGVwc1xuICAgIHZhciBjdXJyZW50ID0gTWF0aC5yb3VuZChzdGVwQ291bnQgKiAocGVyY2VudExpc3RbMF0gLyAxMDApKTtcbiAgICB2YXIgc3RlcFB0ZyA9IDEwMCAvIHN0ZXBDb3VudDtcbiAgICB2YXIgc3RhY2tQdGcgPSAwO1xuICAgIHJldHVybiBuZXcgQXJyYXkoc3RlcENvdW50KS5maWxsKG51bGwpLm1hcChmdW5jdGlvbiAoXywgaW5kZXgpIHtcbiAgICAgIHZhciBjb2xvciA9IGluZGV4IDw9IGN1cnJlbnQgLSAxID8gc3Ryb2tlQ29sb3JMaXN0WzBdIDogdHJhaWxDb2xvcjtcbiAgICAgIHZhciBzdHJva2UgPSBjb2xvciAmJiBfdHlwZW9mKGNvbG9yKSA9PT0gJ29iamVjdCcgPyBcInVybCgjXCIuY29uY2F0KGdyYWRpZW50SWQsIFwiKVwiKSA6IHVuZGVmaW5lZDtcbiAgICAgIHZhciBjaXJjbGVTdHlsZUZvclN0YWNrID0gZ2V0Q2lyY2xlU3R5bGUocGVyaW1ldGVyLCBwZXJpbWV0ZXJXaXRob3V0R2FwLCBzdGFja1B0Zywgc3RlcFB0Zywgcm90YXRlRGVnLCBnYXBEZWdyZWUsIGdhcFBvc2l0aW9uLCBjb2xvciwgJ2J1dHQnLCBzdHJva2VXaWR0aCwgc3RlcEdhcCk7XG4gICAgICBzdGFja1B0ZyArPSAocGVyaW1ldGVyV2l0aG91dEdhcCAtIGNpcmNsZVN0eWxlRm9yU3RhY2suc3Ryb2tlRGFzaG9mZnNldCArIHN0ZXBHYXApICogMTAwIC8gcGVyaW1ldGVyV2l0aG91dEdhcDtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImNpcmNsZVwiLCB7XG4gICAgICAgIGtleTogaW5kZXgsXG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jaXJjbGUtcGF0aFwiKSxcbiAgICAgICAgcjogcmFkaXVzLFxuICAgICAgICBjeDogaGFsZlNpemUsXG4gICAgICAgIGN5OiBoYWxmU2l6ZSxcbiAgICAgICAgc3Ryb2tlOiBzdHJva2UsXG4gICAgICAgIHN0cm9rZVdpZHRoOiBzdHJva2VXaWR0aCxcbiAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgc3R5bGU6IGNpcmNsZVN0eWxlRm9yU3RhY2ssXG4gICAgICAgIHJlZjogZnVuY3Rpb24gcmVmKGVsZW0pIHtcbiAgICAgICAgICBwYXRoc1tpbmRleF0gPSBlbGVtO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jaXJjbGVcIiksIGNsYXNzTmFtZSksXG4gICAgdmlld0JveDogXCIwIDAgXCIuY29uY2F0KFZJRVdfQk9YX1NJWkUsIFwiIFwiKS5jb25jYXQoVklFV19CT1hfU0laRSksXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIGlkOiBpZCxcbiAgICByb2xlOiBcInByZXNlbnRhdGlvblwiXG4gIH0sIHJlc3RQcm9wcyksICFzdGVwQ291bnQgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJjaXJjbGVcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jaXJjbGUtdHJhaWxcIiksXG4gICAgcjogcmFkaXVzLFxuICAgIGN4OiBoYWxmU2l6ZSxcbiAgICBjeTogaGFsZlNpemUsXG4gICAgc3Ryb2tlOiB0cmFpbENvbG9yLFxuICAgIHN0cm9rZUxpbmVjYXA6IG1lcmdlZFN0cm9rZUxpbmVjYXAsXG4gICAgc3Ryb2tlV2lkdGg6IHRyYWlsV2lkdGggfHwgc3Ryb2tlV2lkdGgsXG4gICAgc3R5bGU6IGNpcmNsZVN0eWxlXG4gIH0pLCBzdGVwQ291bnQgPyBnZXRTdGVwU3Rva2VMaXN0KCkgOiBnZXRTdG9rZUxpc3QoKSk7XG59O1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgQ2lyY2xlLmRpc3BsYXlOYW1lID0gJ0NpcmNsZSc7XG59XG5leHBvcnQgZGVmYXVsdCBDaXJjbGU7IiwgImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNhblVzZURvbSBmcm9tIFwicmMtdXRpbC9lcy9Eb20vY2FuVXNlRG9tXCI7XG52YXIgdXVpZCA9IDA7XG5cbi8qKiBJcyBjbGllbnQgc2lkZSBhbmQgbm90IGpzZG9tICovXG5leHBvcnQgdmFyIGlzQnJvd3NlckNsaWVudCA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAndGVzdCcgJiYgY2FuVXNlRG9tKCk7XG5cbi8qKiBHZXQgdW5pcXVlIGlkIGZvciBhY2Nlc3NpYmlsaXR5IHVzYWdlICovXG5mdW5jdGlvbiBnZXRVVUlEKCkge1xuICB2YXIgcmV0SWQ7XG5cbiAgLy8gVGVzdCBuZXZlciByZWFjaFxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKGlzQnJvd3NlckNsaWVudCkge1xuICAgIHJldElkID0gdXVpZDtcbiAgICB1dWlkICs9IDE7XG4gIH0gZWxzZSB7XG4gICAgcmV0SWQgPSAnVEVTVF9PUl9TU1InO1xuICB9XG4gIHJldHVybiByZXRJZDtcbn1cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAoaWQpIHtcbiAgLy8gSW5uZXIgaWQgZm9yIGFjY2Vzc2liaWxpdHkgdXNhZ2UuIE9ubHkgd29yayBpbiBjbGllbnQgc2lkZVxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBpbm5lcklkID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXRJbm5lcklkID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBzZXRJbm5lcklkKFwicmNfcHJvZ3Jlc3NfXCIuY29uY2F0KGdldFVVSUQoKSkpO1xuICB9LCBbXSk7XG4gIHJldHVybiBpZCB8fCBpbm5lcklkO1xufSk7IiwgImltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbnZhciBCbG9jayA9IGZ1bmN0aW9uIEJsb2NrKF9yZWYpIHtcbiAgdmFyIGJnID0gX3JlZi5iZyxcbiAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW47XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgc3R5bGU6IHtcbiAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgIGJhY2tncm91bmQ6IGJnXG4gICAgfVxuICB9LCBjaGlsZHJlbik7XG59O1xuZnVuY3Rpb24gZ2V0UHRnQ29sb3JzKGNvbG9yLCBzY2FsZSkge1xuICByZXR1cm4gT2JqZWN0LmtleXMoY29sb3IpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIHBhcnNlZEtleSA9IHBhcnNlRmxvYXQoa2V5KTtcbiAgICB2YXIgcHRnS2V5ID0gXCJcIi5jb25jYXQoTWF0aC5mbG9vcihwYXJzZWRLZXkgKiBzY2FsZSksIFwiJVwiKTtcbiAgICByZXR1cm4gXCJcIi5jb25jYXQoY29sb3Jba2V5XSwgXCIgXCIpLmNvbmNhdChwdGdLZXkpO1xuICB9KTtcbn1cbnZhciBQdGdDaXJjbGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIGNvbG9yID0gcHJvcHMuY29sb3IsXG4gICAgZ3JhZGllbnRJZCA9IHByb3BzLmdyYWRpZW50SWQsXG4gICAgcmFkaXVzID0gcHJvcHMucmFkaXVzLFxuICAgIGNpcmNsZVN0eWxlRm9yU3RhY2sgPSBwcm9wcy5zdHlsZSxcbiAgICBwdGcgPSBwcm9wcy5wdGcsXG4gICAgc3Ryb2tlTGluZWNhcCA9IHByb3BzLnN0cm9rZUxpbmVjYXAsXG4gICAgc3Ryb2tlV2lkdGggPSBwcm9wcy5zdHJva2VXaWR0aCxcbiAgICBzaXplID0gcHJvcHMuc2l6ZSxcbiAgICBnYXBEZWdyZWUgPSBwcm9wcy5nYXBEZWdyZWU7XG4gIHZhciBpc0dyYWRpZW50ID0gY29sb3IgJiYgX3R5cGVvZihjb2xvcikgPT09ICdvYmplY3QnO1xuICB2YXIgc3Ryb2tlID0gaXNHcmFkaWVudCA/IFwiI0ZGRlwiIDogdW5kZWZpbmVkO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IENpcmNsZSA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgaGFsZlNpemUgPSBzaXplIC8gMjtcbiAgdmFyIGNpcmNsZU5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImNpcmNsZVwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNpcmNsZS1wYXRoXCIpLFxuICAgIHI6IHJhZGl1cyxcbiAgICBjeDogaGFsZlNpemUsXG4gICAgY3k6IGhhbGZTaXplLFxuICAgIHN0cm9rZTogc3Ryb2tlLFxuICAgIHN0cm9rZUxpbmVjYXA6IHN0cm9rZUxpbmVjYXAsXG4gICAgc3Ryb2tlV2lkdGg6IHN0cm9rZVdpZHRoLFxuICAgIG9wYWNpdHk6IHB0ZyA9PT0gMCA/IDAgOiAxLFxuICAgIHN0eWxlOiBjaXJjbGVTdHlsZUZvclN0YWNrLFxuICAgIHJlZjogcmVmXG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBpZiAoIWlzR3JhZGllbnQpIHtcbiAgICByZXR1cm4gY2lyY2xlTm9kZTtcbiAgfVxuICB2YXIgbWFza0lkID0gXCJcIi5jb25jYXQoZ3JhZGllbnRJZCwgXCItY29uaWNcIik7XG4gIHZhciBmcm9tRGVnID0gZ2FwRGVncmVlID8gXCJcIi5jb25jYXQoMTgwICsgZ2FwRGVncmVlIC8gMiwgXCJkZWdcIikgOiAnMGRlZyc7XG4gIHZhciBjb25pY0NvbG9ycyA9IGdldFB0Z0NvbG9ycyhjb2xvciwgKDM2MCAtIGdhcERlZ3JlZSkgLyAzNjApO1xuICB2YXIgbGluZWFyQ29sb3JzID0gZ2V0UHRnQ29sb3JzKGNvbG9yLCAxKTtcbiAgdmFyIGNvbmljQ29sb3JCZyA9IFwiY29uaWMtZ3JhZGllbnQoZnJvbSBcIi5jb25jYXQoZnJvbURlZywgXCIsIFwiKS5jb25jYXQoY29uaWNDb2xvcnMuam9pbignLCAnKSwgXCIpXCIpO1xuICB2YXIgbGluZWFyQ29sb3JCZyA9IFwibGluZWFyLWdyYWRpZW50KHRvIFwiLmNvbmNhdChnYXBEZWdyZWUgPyAnYm90dG9tJyA6ICd0b3AnLCBcIiwgXCIpLmNvbmNhdChsaW5lYXJDb2xvcnMuam9pbignLCAnKSwgXCIpXCIpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwibWFza1wiLCB7XG4gICAgaWQ6IG1hc2tJZFxuICB9LCBjaXJjbGVOb2RlKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJmb3JlaWduT2JqZWN0XCIsIHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgd2lkdGg6IHNpemUsXG4gICAgaGVpZ2h0OiBzaXplLFxuICAgIG1hc2s6IFwidXJsKCNcIi5jb25jYXQobWFza0lkLCBcIilcIilcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQmxvY2ssIHtcbiAgICBiZzogbGluZWFyQ29sb3JCZ1xuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChCbG9jaywge1xuICAgIGJnOiBjb25pY0NvbG9yQmdcbiAgfSkpKSk7XG59KTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFB0Z0NpcmNsZS5kaXNwbGF5TmFtZSA9ICdQdGdDaXJjbGUnO1xufVxuZXhwb3J0IGRlZmF1bHQgUHRnQ2lyY2xlOyIsICJleHBvcnQgdmFyIFZJRVdfQk9YX1NJWkUgPSAxMDA7XG5leHBvcnQgdmFyIGdldENpcmNsZVN0eWxlID0gZnVuY3Rpb24gZ2V0Q2lyY2xlU3R5bGUocGVyaW1ldGVyLCBwZXJpbWV0ZXJXaXRob3V0R2FwLCBvZmZzZXQsIHBlcmNlbnQsIHJvdGF0ZURlZywgZ2FwRGVncmVlLCBnYXBQb3NpdGlvbiwgc3Ryb2tlQ29sb3IsIHN0cm9rZUxpbmVjYXAsIHN0cm9rZVdpZHRoKSB7XG4gIHZhciBzdGVwU3BhY2UgPSBhcmd1bWVudHMubGVuZ3RoID4gMTAgJiYgYXJndW1lbnRzWzEwXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzEwXSA6IDA7XG4gIHZhciBvZmZzZXREZWcgPSBvZmZzZXQgLyAxMDAgKiAzNjAgKiAoKDM2MCAtIGdhcERlZ3JlZSkgLyAzNjApO1xuICB2YXIgcG9zaXRpb25EZWcgPSBnYXBEZWdyZWUgPT09IDAgPyAwIDoge1xuICAgIGJvdHRvbTogMCxcbiAgICB0b3A6IDE4MCxcbiAgICBsZWZ0OiA5MCxcbiAgICByaWdodDogLTkwXG4gIH1bZ2FwUG9zaXRpb25dO1xuICB2YXIgc3Ryb2tlRGFzaG9mZnNldCA9ICgxMDAgLSBwZXJjZW50KSAvIDEwMCAqIHBlcmltZXRlcldpdGhvdXRHYXA7XG4gIC8vIEZpeCBwZXJjZW50IGFjY3VyYWN5IHdoZW4gc3Ryb2tlTGluZWNhcCBpcyByb3VuZFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8zNTAwOVxuICBpZiAoc3Ryb2tlTGluZWNhcCA9PT0gJ3JvdW5kJyAmJiBwZXJjZW50ICE9PSAxMDApIHtcbiAgICBzdHJva2VEYXNob2Zmc2V0ICs9IHN0cm9rZVdpZHRoIC8gMjtcbiAgICAvLyB3aGVuIHBlcmNlbnQgaXMgc21hbGwgZW5vdWdoICg8PSAxJSksIGtlZXAgc21hbGxlc3QgdmFsdWUgdG8gYXZvaWQgaXQncyBkaXNhcHBlYXJhbmNlXG4gICAgaWYgKHN0cm9rZURhc2hvZmZzZXQgPj0gcGVyaW1ldGVyV2l0aG91dEdhcCkge1xuICAgICAgc3Ryb2tlRGFzaG9mZnNldCA9IHBlcmltZXRlcldpdGhvdXRHYXAgLSAwLjAxO1xuICAgIH1cbiAgfVxuICB2YXIgaGFsZlNpemUgPSBWSUVXX0JPWF9TSVpFIC8gMjtcbiAgcmV0dXJuIHtcbiAgICBzdHJva2U6IHR5cGVvZiBzdHJva2VDb2xvciA9PT0gJ3N0cmluZycgPyBzdHJva2VDb2xvciA6IHVuZGVmaW5lZCxcbiAgICBzdHJva2VEYXNoYXJyYXk6IFwiXCIuY29uY2F0KHBlcmltZXRlcldpdGhvdXRHYXAsIFwicHggXCIpLmNvbmNhdChwZXJpbWV0ZXIpLFxuICAgIHN0cm9rZURhc2hvZmZzZXQ6IHN0cm9rZURhc2hvZmZzZXQgKyBzdGVwU3BhY2UsXG4gICAgdHJhbnNmb3JtOiBcInJvdGF0ZShcIi5jb25jYXQocm90YXRlRGVnICsgb2Zmc2V0RGVnICsgcG9zaXRpb25EZWcsIFwiZGVnKVwiKSxcbiAgICB0cmFuc2Zvcm1PcmlnaW46IFwiXCIuY29uY2F0KGhhbGZTaXplLCBcInB4IFwiKS5jb25jYXQoaGFsZlNpemUsIFwicHhcIiksXG4gICAgdHJhbnNpdGlvbjogJ3N0cm9rZS1kYXNob2Zmc2V0IC4zcyBlYXNlIDBzLCBzdHJva2UtZGFzaGFycmF5IC4zcyBlYXNlIDBzLCBzdHJva2UgLjNzLCBzdHJva2Utd2lkdGggLjA2cyBlYXNlIC4zcywgb3BhY2l0eSAuM3MgZWFzZSAwcycsXG4gICAgZmlsbE9wYWNpdHk6IDBcbiAgfTtcbn07IiwgImltcG9ydCB7IHByZXNldFByaW1hcnlDb2xvcnMgfSBmcm9tICdAYW50LWRlc2lnbi9jb2xvcnMnO1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkUHJvZ3Jlc3MocHJvZ3Jlc3MpIHtcbiAgaWYgKCFwcm9ncmVzcyB8fCBwcm9ncmVzcyA8IDApIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBpZiAocHJvZ3Jlc3MgPiAxMDApIHtcbiAgICByZXR1cm4gMTAwO1xuICB9XG4gIHJldHVybiBwcm9ncmVzcztcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdWNjZXNzUGVyY2VudChfcmVmKSB7XG4gIGxldCB7XG4gICAgc3VjY2VzcyxcbiAgICBzdWNjZXNzUGVyY2VudFxuICB9ID0gX3JlZjtcbiAgbGV0IHBlcmNlbnQgPSBzdWNjZXNzUGVyY2VudDtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgcGVyY2VudGAgaW5zdGVhZCAqL1xuICBpZiAoc3VjY2VzcyAmJiAncHJvZ3Jlc3MnIGluIHN1Y2Nlc3MpIHtcbiAgICBwZXJjZW50ID0gc3VjY2Vzcy5wcm9ncmVzcztcbiAgfVxuICBpZiAoc3VjY2VzcyAmJiAncGVyY2VudCcgaW4gc3VjY2Vzcykge1xuICAgIHBlcmNlbnQgPSBzdWNjZXNzLnBlcmNlbnQ7XG4gIH1cbiAgcmV0dXJuIHBlcmNlbnQ7XG59XG5leHBvcnQgY29uc3QgZ2V0UGVyY2VudGFnZSA9IF9yZWYyID0+IHtcbiAgbGV0IHtcbiAgICBwZXJjZW50LFxuICAgIHN1Y2Nlc3MsXG4gICAgc3VjY2Vzc1BlcmNlbnRcbiAgfSA9IF9yZWYyO1xuICBjb25zdCByZWFsU3VjY2Vzc1BlcmNlbnQgPSB2YWxpZFByb2dyZXNzKGdldFN1Y2Nlc3NQZXJjZW50KHtcbiAgICBzdWNjZXNzLFxuICAgIHN1Y2Nlc3NQZXJjZW50XG4gIH0pKTtcbiAgcmV0dXJuIFtyZWFsU3VjY2Vzc1BlcmNlbnQsIHZhbGlkUHJvZ3Jlc3ModmFsaWRQcm9ncmVzcyhwZXJjZW50KSAtIHJlYWxTdWNjZXNzUGVyY2VudCldO1xufTtcbmV4cG9ydCBjb25zdCBnZXRTdHJva2VDb2xvciA9IF9yZWYzID0+IHtcbiAgbGV0IHtcbiAgICBzdWNjZXNzID0ge30sXG4gICAgc3Ryb2tlQ29sb3JcbiAgfSA9IF9yZWYzO1xuICBjb25zdCB7XG4gICAgc3Ryb2tlQ29sb3I6IHN1Y2Nlc3NDb2xvclxuICB9ID0gc3VjY2VzcztcbiAgcmV0dXJuIFtzdWNjZXNzQ29sb3IgfHwgcHJlc2V0UHJpbWFyeUNvbG9ycy5ncmVlbiwgc3Ryb2tlQ29sb3IgfHwgbnVsbF07XG59O1xuZXhwb3J0IGNvbnN0IGdldFNpemUgPSAoc2l6ZSwgdHlwZSwgZXh0cmEpID0+IHtcbiAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICBsZXQgd2lkdGggPSAtMTtcbiAgbGV0IGhlaWdodCA9IC0xO1xuICBpZiAodHlwZSA9PT0gJ3N0ZXAnKSB7XG4gICAgY29uc3Qgc3RlcHMgPSBleHRyYS5zdGVwcztcbiAgICBjb25zdCBzdHJva2VXaWR0aCA9IGV4dHJhLnN0cm9rZVdpZHRoO1xuICAgIGlmICh0eXBlb2Ygc2l6ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHNpemUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB3aWR0aCA9IHNpemUgPT09ICdzbWFsbCcgPyAyIDogMTQ7XG4gICAgICBoZWlnaHQgPSBzdHJva2VXaWR0aCAhPT0gbnVsbCAmJiBzdHJva2VXaWR0aCAhPT0gdm9pZCAwID8gc3Ryb2tlV2lkdGggOiA4O1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHNpemUgPT09ICdudW1iZXInKSB7XG4gICAgICBbd2lkdGgsIGhlaWdodF0gPSBbc2l6ZSwgc2l6ZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIFt3aWR0aCA9IDE0LCBoZWlnaHQgPSA4XSA9IEFycmF5LmlzQXJyYXkoc2l6ZSkgPyBzaXplIDogW3NpemUud2lkdGgsIHNpemUuaGVpZ2h0XTtcbiAgICB9XG4gICAgd2lkdGggKj0gc3RlcHM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2xpbmUnKSB7XG4gICAgY29uc3Qgc3Ryb2tlV2lkdGggPSBleHRyYSA9PT0gbnVsbCB8fCBleHRyYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXh0cmEuc3Ryb2tlV2lkdGg7XG4gICAgaWYgKHR5cGVvZiBzaXplID09PSAnc3RyaW5nJyB8fCB0eXBlb2Ygc2l6ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGhlaWdodCA9IHN0cm9rZVdpZHRoIHx8IChzaXplID09PSAnc21hbGwnID8gNiA6IDgpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHNpemUgPT09ICdudW1iZXInKSB7XG4gICAgICBbd2lkdGgsIGhlaWdodF0gPSBbc2l6ZSwgc2l6ZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIFt3aWR0aCA9IC0xLCBoZWlnaHQgPSA4XSA9IEFycmF5LmlzQXJyYXkoc2l6ZSkgPyBzaXplIDogW3NpemUud2lkdGgsIHNpemUuaGVpZ2h0XTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2NpcmNsZScgfHwgdHlwZSA9PT0gJ2Rhc2hib2FyZCcpIHtcbiAgICBpZiAodHlwZW9mIHNpemUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBzaXplID09PSAndW5kZWZpbmVkJykge1xuICAgICAgW3dpZHRoLCBoZWlnaHRdID0gc2l6ZSA9PT0gJ3NtYWxsJyA/IFs2MCwgNjBdIDogWzEyMCwgMTIwXTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBzaXplID09PSAnbnVtYmVyJykge1xuICAgICAgW3dpZHRoLCBoZWlnaHRdID0gW3NpemUsIHNpemVdO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShzaXplKSkge1xuICAgICAgd2lkdGggPSAoX2IgPSAoX2EgPSBzaXplWzBdKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBzaXplWzFdKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAxMjA7XG4gICAgICBoZWlnaHQgPSAoX2QgPSAoX2MgPSBzaXplWzBdKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBzaXplWzFdKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAxMjA7XG4gICAgfVxuICB9XG4gIHJldHVybiBbd2lkdGgsIGhlaWdodF07XG59OyIsICJcInVzZSBjbGllbnRcIjtcblxudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHByZXNldFByaW1hcnlDb2xvcnMgfSBmcm9tICdAYW50LWRlc2lnbi9jb2xvcnMnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyBkZXZVc2VXYXJuaW5nIH0gZnJvbSAnLi4vX3V0aWwvd2FybmluZyc7XG5pbXBvcnQgeyBMaW5lU3Ryb2tlQ29sb3JWYXIsIFBlcmNlbnQgfSBmcm9tICcuL3N0eWxlJztcbmltcG9ydCB7IGdldFNpemUsIGdldFN1Y2Nlc3NQZXJjZW50LCB2YWxpZFByb2dyZXNzIH0gZnJvbSAnLi91dGlscyc7XG4vKipcbiAqIEBleGFtcGxlXG4gKiAgIHtcbiAqICAgICBcIjAlXCI6IFwiI2FmYzE2M1wiLFxuICogICAgIFwiNzUlXCI6IFwiIzAwOTkwMFwiLFxuICogICAgIFwiNTAlXCI6IFwiZ3JlZW5cIiwgLy8gPT09PT4gJyNhZmMxNjMgMCUsICM2NkZGMDAgMjUlLCAjMDBDQzAwIDUwJSwgIzAwOTkwMCA3NSUsICNmZmZmZmYgMTAwJSdcbiAqICAgICBcIjI1JVwiOiBcIiM2NkZGMDBcIixcbiAqICAgICBcIjEwMCVcIjogXCIjZmZmZmZmXCJcbiAqICAgfVxuICovXG5leHBvcnQgY29uc3Qgc29ydEdyYWRpZW50ID0gZ3JhZGllbnRzID0+IHtcbiAgbGV0IHRlbXBBcnIgPSBbXTtcbiAgT2JqZWN0LmtleXMoZ3JhZGllbnRzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgY29uc3QgZm9ybWF0dGVkS2V5ID0gcGFyc2VGbG9hdChrZXkucmVwbGFjZSgvJS9nLCAnJykpO1xuICAgIGlmICghTnVtYmVyLmlzTmFOKGZvcm1hdHRlZEtleSkpIHtcbiAgICAgIHRlbXBBcnIucHVzaCh7XG4gICAgICAgIGtleTogZm9ybWF0dGVkS2V5LFxuICAgICAgICB2YWx1ZTogZ3JhZGllbnRzW2tleV1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIHRlbXBBcnIgPSB0ZW1wQXJyLnNvcnQoKGEsIGIpID0+IGEua2V5IC0gYi5rZXkpO1xuICByZXR1cm4gdGVtcEFyci5tYXAoX3JlZiA9PiB7XG4gICAgbGV0IHtcbiAgICAgIGtleSxcbiAgICAgIHZhbHVlXG4gICAgfSA9IF9yZWY7XG4gICAgcmV0dXJuIGAke3ZhbHVlfSAke2tleX0lYDtcbiAgfSkuam9pbignLCAnKTtcbn07XG4vKipcbiAqIFRoZW4gdGhpcyBtYW4gY2FtZSB0byByZWFsaXplIHRoZSB0cnV0aDogQmVzaWRlcyBzaXggcGVuY2UsIHRoZXJlIGlzIHRoZSBtb29uLiBCZXNpZGVzIGJyZWFkIGFuZFxuICogYnV0dGVyLCB0aGVyZSBpcyB0aGUgYnVnLiBBbmQuLi4gQmVzaWRlcyB3b21lbiwgdGhlcmUgaXMgdGhlIGNvZGUuXG4gKlxuICogQGV4YW1wbGVcbiAqICAge1xuICogICAgIFwiMCVcIjogXCIjYWZjMTYzXCIsXG4gKiAgICAgXCIyNSVcIjogXCIjNjZGRjAwXCIsXG4gKiAgICAgXCI1MCVcIjogXCIjMDBDQzAwXCIsIC8vID09PT0+ICBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsICNhZmMxNjMgMCUsICM2NkZGMDAgMjUlLFxuICogICAgIFwiNzUlXCI6IFwiIzAwOTkwMFwiLCAvLyAgICAgICAgIzAwQ0MwMCA1MCUsICMwMDk5MDAgNzUlLCAjZmZmZmZmIDEwMCUpXG4gKiAgICAgXCIxMDAlXCI6IFwiI2ZmZmZmZlwiXG4gKiAgIH1cbiAqL1xuZXhwb3J0IGNvbnN0IGhhbmRsZUdyYWRpZW50ID0gKHN0cm9rZUNvbG9yLCBkaXJlY3Rpb25Db25maWcpID0+IHtcbiAgY29uc3Qge1xuICAgICAgZnJvbSA9IHByZXNldFByaW1hcnlDb2xvcnMuYmx1ZSxcbiAgICAgIHRvID0gcHJlc2V0UHJpbWFyeUNvbG9ycy5ibHVlLFxuICAgICAgZGlyZWN0aW9uID0gZGlyZWN0aW9uQ29uZmlnID09PSAncnRsJyA/ICd0byBsZWZ0JyA6ICd0byByaWdodCdcbiAgICB9ID0gc3Ryb2tlQ29sb3IsXG4gICAgcmVzdCA9IF9fcmVzdChzdHJva2VDb2xvciwgW1wiZnJvbVwiLCBcInRvXCIsIFwiZGlyZWN0aW9uXCJdKTtcbiAgaWYgKE9iamVjdC5rZXlzKHJlc3QpLmxlbmd0aCAhPT0gMCkge1xuICAgIGNvbnN0IHNvcnRlZEdyYWRpZW50cyA9IHNvcnRHcmFkaWVudChyZXN0KTtcbiAgICBjb25zdCBiYWNrZ3JvdW5kID0gYGxpbmVhci1ncmFkaWVudCgke2RpcmVjdGlvbn0sICR7c29ydGVkR3JhZGllbnRzfSlgO1xuICAgIHJldHVybiB7XG4gICAgICBiYWNrZ3JvdW5kLFxuICAgICAgW0xpbmVTdHJva2VDb2xvclZhcl06IGJhY2tncm91bmRcbiAgICB9O1xuICB9XG4gIGNvbnN0IGJhY2tncm91bmQgPSBgbGluZWFyLWdyYWRpZW50KCR7ZGlyZWN0aW9ufSwgJHtmcm9tfSwgJHt0b30pYDtcbiAgcmV0dXJuIHtcbiAgICBiYWNrZ3JvdW5kLFxuICAgIFtMaW5lU3Ryb2tlQ29sb3JWYXJdOiBiYWNrZ3JvdW5kXG4gIH07XG59O1xuY29uc3QgTGluZSA9IHByb3BzID0+IHtcbiAgY29uc3Qge1xuICAgIHByZWZpeENscyxcbiAgICBkaXJlY3Rpb246IGRpcmVjdGlvbkNvbmZpZyxcbiAgICBwZXJjZW50LFxuICAgIHNpemUsXG4gICAgc3Ryb2tlV2lkdGgsXG4gICAgc3Ryb2tlQ29sb3IsXG4gICAgc3Ryb2tlTGluZWNhcCA9ICdyb3VuZCcsXG4gICAgY2hpbGRyZW4sXG4gICAgdHJhaWxDb2xvciA9IG51bGwsXG4gICAgcGVyY2VudFBvc2l0aW9uLFxuICAgIHN1Y2Nlc3NcbiAgfSA9IHByb3BzO1xuICBjb25zdCB7XG4gICAgYWxpZ246IGluZm9BbGlnbixcbiAgICB0eXBlOiBpbmZvUG9zaXRpb25cbiAgfSA9IHBlcmNlbnRQb3NpdGlvbjtcbiAgY29uc3QgYmFja2dyb3VuZFByb3BzID0gc3Ryb2tlQ29sb3IgJiYgdHlwZW9mIHN0cm9rZUNvbG9yICE9PSAnc3RyaW5nJyA/IGhhbmRsZUdyYWRpZW50KHN0cm9rZUNvbG9yLCBkaXJlY3Rpb25Db25maWcpIDoge1xuICAgIFtMaW5lU3Ryb2tlQ29sb3JWYXJdOiBzdHJva2VDb2xvcixcbiAgICBiYWNrZ3JvdW5kOiBzdHJva2VDb2xvclxuICB9O1xuICBjb25zdCBib3JkZXJSYWRpdXMgPSBzdHJva2VMaW5lY2FwID09PSAnc3F1YXJlJyB8fCBzdHJva2VMaW5lY2FwID09PSAnYnV0dCcgPyAwIDogdW5kZWZpbmVkO1xuICBjb25zdCBtZXJnZWRTaXplID0gc2l6ZSAhPT0gbnVsbCAmJiBzaXplICE9PSB2b2lkIDAgPyBzaXplIDogWy0xLCBzdHJva2VXaWR0aCB8fCAoc2l6ZSA9PT0gJ3NtYWxsJyA/IDYgOiA4KV07XG4gIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IGdldFNpemUobWVyZ2VkU2l6ZSwgJ2xpbmUnLCB7XG4gICAgc3Ryb2tlV2lkdGhcbiAgfSk7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgY29uc3Qgd2FybmluZyA9IGRldlVzZVdhcm5pbmcoJ1Byb2dyZXNzJyk7XG4gICAgd2FybmluZy5kZXByZWNhdGVkKCEoJ3N0cm9rZVdpZHRoJyBpbiBwcm9wcyksICdzdHJva2VXaWR0aCcsICdzaXplJyk7XG4gIH1cbiAgY29uc3QgdHJhaWxTdHlsZSA9IHtcbiAgICBiYWNrZ3JvdW5kQ29sb3I6IHRyYWlsQ29sb3IgfHwgdW5kZWZpbmVkLFxuICAgIGJvcmRlclJhZGl1c1xuICB9O1xuICBjb25zdCBwZXJjZW50U3R5bGUgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe1xuICAgIHdpZHRoOiBgJHt2YWxpZFByb2dyZXNzKHBlcmNlbnQpfSVgLFxuICAgIGhlaWdodCxcbiAgICBib3JkZXJSYWRpdXNcbiAgfSwgYmFja2dyb3VuZFByb3BzKSwge1xuICAgIFtQZXJjZW50XTogdmFsaWRQcm9ncmVzcyhwZXJjZW50KSAvIDEwMFxuICB9KTtcbiAgY29uc3Qgc3VjY2Vzc1BlcmNlbnQgPSBnZXRTdWNjZXNzUGVyY2VudChwcm9wcyk7XG4gIGNvbnN0IHN1Y2Nlc3NQZXJjZW50U3R5bGUgPSB7XG4gICAgd2lkdGg6IGAke3ZhbGlkUHJvZ3Jlc3Moc3VjY2Vzc1BlcmNlbnQpfSVgLFxuICAgIGhlaWdodCxcbiAgICBib3JkZXJSYWRpdXMsXG4gICAgYmFja2dyb3VuZENvbG9yOiBzdWNjZXNzID09PSBudWxsIHx8IHN1Y2Nlc3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN1Y2Nlc3Muc3Ryb2tlQ29sb3JcbiAgfTtcbiAgY29uc3Qgb3V0ZXJTdHlsZSA9IHtcbiAgICB3aWR0aDogd2lkdGggPCAwID8gJzEwMCUnIDogd2lkdGhcbiAgfTtcbiAgY29uc3QgbGluZUlubmVyID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogYCR7cHJlZml4Q2xzfS1pbm5lcmAsXG4gICAgc3R5bGU6IHRyYWlsU3R5bGVcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhgJHtwcmVmaXhDbHN9LWJnYCwgYCR7cHJlZml4Q2xzfS1iZy0ke2luZm9Qb3NpdGlvbn1gKSxcbiAgICBzdHlsZTogcGVyY2VudFN0eWxlXG4gIH0sIGluZm9Qb3NpdGlvbiA9PT0gJ2lubmVyJyAmJiBjaGlsZHJlbiksIHN1Y2Nlc3NQZXJjZW50ICE9PSB1bmRlZmluZWQgJiYgKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGAke3ByZWZpeENsc30tc3VjY2Vzcy1iZ2AsXG4gICAgc3R5bGU6IHN1Y2Nlc3NQZXJjZW50U3R5bGVcbiAgfSkpKTtcbiAgY29uc3QgaXNPdXRlclN0YXJ0ID0gaW5mb1Bvc2l0aW9uID09PSAnb3V0ZXInICYmIGluZm9BbGlnbiA9PT0gJ3N0YXJ0JztcbiAgY29uc3QgaXNPdXRlckVuZCA9IGluZm9Qb3NpdGlvbiA9PT0gJ291dGVyJyAmJiBpbmZvQWxpZ24gPT09ICdlbmQnO1xuICByZXR1cm4gaW5mb1Bvc2l0aW9uID09PSAnb3V0ZXInICYmIGluZm9BbGlnbiA9PT0gJ2NlbnRlcicgPyAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogYCR7cHJlZml4Q2xzfS1sYXlvdXQtYm90dG9tYFxuICB9LCBsaW5lSW5uZXIsIGNoaWxkcmVuKSkgOiAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogYCR7cHJlZml4Q2xzfS1vdXRlcmAsXG4gICAgc3R5bGU6IG91dGVyU3R5bGVcbiAgfSwgaXNPdXRlclN0YXJ0ICYmIGNoaWxkcmVuLCBsaW5lSW5uZXIsIGlzT3V0ZXJFbmQgJiYgY2hpbGRyZW4pKTtcbn07XG5leHBvcnQgZGVmYXVsdCBMaW5lOyIsICJpbXBvcnQgeyBLZXlmcmFtZXMsIHVuaXQgfSBmcm9tICdAYW50LWRlc2lnbi9jc3NpbmpzJztcbmltcG9ydCB7IHJlc2V0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc3R5bGUnO1xuaW1wb3J0IHsgZ2VuU3R5bGVIb29rcywgbWVyZ2VUb2tlbiB9IGZyb20gJy4uLy4uL3RoZW1lL2ludGVybmFsJztcbmV4cG9ydCBjb25zdCBMaW5lU3Ryb2tlQ29sb3JWYXIgPSAnLS1wcm9ncmVzcy1saW5lLXN0cm9rZS1jb2xvcic7XG5leHBvcnQgY29uc3QgUGVyY2VudCA9ICctLXByb2dyZXNzLXBlcmNlbnQnO1xuY29uc3QgZ2VuQW50UHJvZ3Jlc3NBY3RpdmUgPSBpc1J0bCA9PiB7XG4gIGNvbnN0IGRpcmVjdGlvbiA9IGlzUnRsID8gJzEwMCUnIDogJy0xMDAlJztcbiAgcmV0dXJuIG5ldyBLZXlmcmFtZXMoYGFudFByb2dyZXNzJHtpc1J0bCA/ICdSVEwnIDogJ0xUUid9QWN0aXZlYCwge1xuICAgICcwJSc6IHtcbiAgICAgIHRyYW5zZm9ybTogYHRyYW5zbGF0ZVgoJHtkaXJlY3Rpb259KSBzY2FsZVgoMClgLFxuICAgICAgb3BhY2l0eTogMC4xXG4gICAgfSxcbiAgICAnMjAlJzoge1xuICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlWCgke2RpcmVjdGlvbn0pIHNjYWxlWCgwKWAsXG4gICAgICBvcGFjaXR5OiAwLjVcbiAgICB9LFxuICAgIHRvOiB7XG4gICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDApIHNjYWxlWCgxKScsXG4gICAgICBvcGFjaXR5OiAwXG4gICAgfVxuICB9KTtcbn07XG5jb25zdCBnZW5CYXNlU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHM6IHByb2dyZXNzQ2xzLFxuICAgIGljb25DbHM6IGljb25QcmVmaXhDbHNcbiAgfSA9IHRva2VuO1xuICByZXR1cm4ge1xuICAgIFtwcm9ncmVzc0Nsc106IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVzZXRDb21wb25lbnQodG9rZW4pKSwge1xuICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICAnJi1ydGwnOiB7XG4gICAgICAgIGRpcmVjdGlvbjogJ3J0bCdcbiAgICAgIH0sXG4gICAgICAnJi1saW5lJzoge1xuICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgZm9udFNpemU6IHRva2VuLmZvbnRTaXplXG4gICAgICB9LFxuICAgICAgW2Ake3Byb2dyZXNzQ2xzfS1vdXRlcmBdOiB7XG4gICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtZmxleCcsXG4gICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICB3aWR0aDogJzEwMCUnXG4gICAgICB9LFxuICAgICAgW2Ake3Byb2dyZXNzQ2xzfS1pbm5lcmBdOiB7XG4gICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJyxcbiAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgZmxleDogMSxcbiAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgICB2ZXJ0aWNhbEFsaWduOiAnbWlkZGxlJyxcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0b2tlbi5yZW1haW5pbmdDb2xvcixcbiAgICAgICAgYm9yZGVyUmFkaXVzOiB0b2tlbi5saW5lQm9yZGVyUmFkaXVzXG4gICAgICB9LFxuICAgICAgW2Ake3Byb2dyZXNzQ2xzfS1pbm5lcjpub3QoJHtwcm9ncmVzc0Nsc30tY2lyY2xlLWdyYWRpZW50KWBdOiB7XG4gICAgICAgIFtgJHtwcm9ncmVzc0Nsc30tY2lyY2xlLXBhdGhgXToge1xuICAgICAgICAgIHN0cm9rZTogdG9rZW4uZGVmYXVsdENvbG9yXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbYCR7cHJvZ3Jlc3NDbHN9LXN1Y2Nlc3MtYmcsICR7cHJvZ3Jlc3NDbHN9LWJnYF06IHtcbiAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICAgIGJhY2tncm91bmQ6IHRva2VuLmRlZmF1bHRDb2xvcixcbiAgICAgICAgYm9yZGVyUmFkaXVzOiB0b2tlbi5saW5lQm9yZGVyUmFkaXVzLFxuICAgICAgICB0cmFuc2l0aW9uOiBgYWxsICR7dG9rZW4ubW90aW9uRHVyYXRpb25TbG93fSAke3Rva2VuLm1vdGlvbkVhc2VJbk91dENpcmN9YFxuICAgICAgfSxcbiAgICAgIFtgJHtwcm9ncmVzc0Nsc30tbGF5b3V0LWJvdHRvbWBdOiB7XG4gICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsXG4gICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsXG4gICAgICAgIFtgJHtwcm9ncmVzc0Nsc30tdGV4dGBdOiB7XG4gICAgICAgICAgd2lkdGg6ICdtYXgtY29udGVudCcsXG4gICAgICAgICAgbWFyZ2luSW5saW5lU3RhcnQ6IDAsXG4gICAgICAgICAgbWFyZ2luVG9wOiB0b2tlbi5tYXJnaW5YWFNcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtgJHtwcm9ncmVzc0Nsc30tYmdgXToge1xuICAgICAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgICAgICcmOjphZnRlcic6IHtcbiAgICAgICAgICBjb250ZW50OiAnXCJcIicsXG4gICAgICAgICAgYmFja2dyb3VuZDoge1xuICAgICAgICAgICAgX211bHRpX3ZhbHVlXzogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBbJ2luaGVyaXQnLCBgdmFyKCR7TGluZVN0cm9rZUNvbG9yVmFyfSlgXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgICAgd2lkdGg6IGBjYWxjKDEgLyB2YXIoJHtQZXJjZW50fSkgKiAxMDAlKWAsXG4gICAgICAgICAgZGlzcGxheTogJ2Jsb2NrJ1xuICAgICAgICB9LFxuICAgICAgICBbYCYke3Byb2dyZXNzQ2xzfS1iZy1pbm5lcmBdOiB7XG4gICAgICAgICAgbWluV2lkdGg6ICdtYXgtY29udGVudCcsXG4gICAgICAgICAgJyY6OmFmdGVyJzoge1xuICAgICAgICAgICAgY29udGVudDogJ25vbmUnXG4gICAgICAgICAgfSxcbiAgICAgICAgICBbYCR7cHJvZ3Jlc3NDbHN9LXRleHQtaW5uZXJgXToge1xuICAgICAgICAgICAgY29sb3I6IHRva2VuLmNvbG9yV2hpdGUsXG4gICAgICAgICAgICBbYCYke3Byb2dyZXNzQ2xzfS10ZXh0LWJyaWdodGBdOiB7XG4gICAgICAgICAgICAgIGNvbG9yOiAncmdiYSgwLCAwLCAwLCAwLjQ1KSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbYCR7cHJvZ3Jlc3NDbHN9LXN1Y2Nlc3MtYmdgXToge1xuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgaW5zZXRCbG9ja1N0YXJ0OiAwLFxuICAgICAgICBpbnNldElubGluZVN0YXJ0OiAwLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRva2VuLmNvbG9yU3VjY2Vzc1xuICAgICAgfSxcbiAgICAgIFtgJHtwcm9ncmVzc0Nsc30tdGV4dGBdOiB7XG4gICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgICBtYXJnaW5JbmxpbmVTdGFydDogdG9rZW4ubWFyZ2luWFMsXG4gICAgICAgIGNvbG9yOiB0b2tlbi5jb2xvclRleHQsXG4gICAgICAgIGxpbmVIZWlnaHQ6IDEsXG4gICAgICAgIHdpZHRoOiAnMmVtJyxcbiAgICAgICAgd2hpdGVTcGFjZTogJ25vd3JhcCcsXG4gICAgICAgIHRleHRBbGlnbjogJ3N0YXJ0JyxcbiAgICAgICAgdmVydGljYWxBbGlnbjogJ21pZGRsZScsXG4gICAgICAgIHdvcmRCcmVhazogJ25vcm1hbCcsXG4gICAgICAgIFtpY29uUHJlZml4Q2xzXToge1xuICAgICAgICAgIGZvbnRTaXplOiB0b2tlbi5mb250U2l6ZVxuICAgICAgICB9LFxuICAgICAgICBbYCYke3Byb2dyZXNzQ2xzfS10ZXh0LW91dGVyYF06IHtcbiAgICAgICAgICB3aWR0aDogJ21heC1jb250ZW50J1xuICAgICAgICB9LFxuICAgICAgICBbYCYke3Byb2dyZXNzQ2xzfS10ZXh0LW91dGVyJHtwcm9ncmVzc0Nsc30tdGV4dC1zdGFydGBdOiB7XG4gICAgICAgICAgd2lkdGg6ICdtYXgtY29udGVudCcsXG4gICAgICAgICAgbWFyZ2luSW5saW5lU3RhcnQ6IDAsXG4gICAgICAgICAgbWFyZ2luSW5saW5lRW5kOiB0b2tlbi5tYXJnaW5YU1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2Ake3Byb2dyZXNzQ2xzfS10ZXh0LWlubmVyYF06IHtcbiAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsXG4gICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAgbWFyZ2luSW5saW5lU3RhcnQ6IDAsXG4gICAgICAgIHBhZGRpbmc6IGAwICR7dW5pdCh0b2tlbi5wYWRkaW5nWFhTKX1gLFxuICAgICAgICBbYCYke3Byb2dyZXNzQ2xzfS10ZXh0LXN0YXJ0YF06IHtcbiAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJ3N0YXJ0J1xuICAgICAgICB9LFxuICAgICAgICBbYCYke3Byb2dyZXNzQ2xzfS10ZXh0LWVuZGBdOiB7XG4gICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdlbmQnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbYCYke3Byb2dyZXNzQ2xzfS1zdGF0dXMtYWN0aXZlYF06IHtcbiAgICAgICAgW2Ake3Byb2dyZXNzQ2xzfS1iZzo6YmVmb3JlYF06IHtcbiAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICBpbnNldDogMCxcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRva2VuLmNvbG9yQmdDb250YWluZXIsXG4gICAgICAgICAgYm9yZGVyUmFkaXVzOiB0b2tlbi5saW5lQm9yZGVyUmFkaXVzLFxuICAgICAgICAgIG9wYWNpdHk6IDAsXG4gICAgICAgICAgYW5pbWF0aW9uTmFtZTogZ2VuQW50UHJvZ3Jlc3NBY3RpdmUoKSxcbiAgICAgICAgICBhbmltYXRpb25EdXJhdGlvbjogdG9rZW4ucHJvZ3Jlc3NBY3RpdmVNb3Rpb25EdXJhdGlvbixcbiAgICAgICAgICBhbmltYXRpb25UaW1pbmdGdW5jdGlvbjogdG9rZW4ubW90aW9uRWFzZU91dFF1aW50LFxuICAgICAgICAgIGFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiAnaW5maW5pdGUnLFxuICAgICAgICAgIGNvbnRlbnQ6ICdcIlwiJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2AmJHtwcm9ncmVzc0Nsc30tcnRsJHtwcm9ncmVzc0Nsc30tc3RhdHVzLWFjdGl2ZWBdOiB7XG4gICAgICAgIFtgJHtwcm9ncmVzc0Nsc30tYmc6OmJlZm9yZWBdOiB7XG4gICAgICAgICAgYW5pbWF0aW9uTmFtZTogZ2VuQW50UHJvZ3Jlc3NBY3RpdmUodHJ1ZSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtgJiR7cHJvZ3Jlc3NDbHN9LXN0YXR1cy1leGNlcHRpb25gXToge1xuICAgICAgICBbYCR7cHJvZ3Jlc3NDbHN9LWJnYF06IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRva2VuLmNvbG9yRXJyb3JcbiAgICAgICAgfSxcbiAgICAgICAgW2Ake3Byb2dyZXNzQ2xzfS10ZXh0YF06IHtcbiAgICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JFcnJvclxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2AmJHtwcm9ncmVzc0Nsc30tc3RhdHVzLWV4Y2VwdGlvbiAke3Byb2dyZXNzQ2xzfS1pbm5lcjpub3QoJHtwcm9ncmVzc0Nsc30tY2lyY2xlLWdyYWRpZW50KWBdOiB7XG4gICAgICAgIFtgJHtwcm9ncmVzc0Nsc30tY2lyY2xlLXBhdGhgXToge1xuICAgICAgICAgIHN0cm9rZTogdG9rZW4uY29sb3JFcnJvclxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2AmJHtwcm9ncmVzc0Nsc30tc3RhdHVzLXN1Y2Nlc3NgXToge1xuICAgICAgICBbYCR7cHJvZ3Jlc3NDbHN9LWJnYF06IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRva2VuLmNvbG9yU3VjY2Vzc1xuICAgICAgICB9LFxuICAgICAgICBbYCR7cHJvZ3Jlc3NDbHN9LXRleHRgXToge1xuICAgICAgICAgIGNvbG9yOiB0b2tlbi5jb2xvclN1Y2Nlc3NcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtgJiR7cHJvZ3Jlc3NDbHN9LXN0YXR1cy1zdWNjZXNzICR7cHJvZ3Jlc3NDbHN9LWlubmVyOm5vdCgke3Byb2dyZXNzQ2xzfS1jaXJjbGUtZ3JhZGllbnQpYF06IHtcbiAgICAgICAgW2Ake3Byb2dyZXNzQ2xzfS1jaXJjbGUtcGF0aGBdOiB7XG4gICAgICAgICAgc3Ryb2tlOiB0b2tlbi5jb2xvclN1Y2Nlc3NcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH07XG59O1xuY29uc3QgZ2VuQ2lyY2xlU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHM6IHByb2dyZXNzQ2xzLFxuICAgIGljb25DbHM6IGljb25QcmVmaXhDbHNcbiAgfSA9IHRva2VuO1xuICByZXR1cm4ge1xuICAgIFtwcm9ncmVzc0Nsc106IHtcbiAgICAgIFtgJHtwcm9ncmVzc0Nsc30tY2lyY2xlLXRyYWlsYF06IHtcbiAgICAgICAgc3Ryb2tlOiB0b2tlbi5yZW1haW5pbmdDb2xvclxuICAgICAgfSxcbiAgICAgIFtgJiR7cHJvZ3Jlc3NDbHN9LWNpcmNsZSAke3Byb2dyZXNzQ2xzfS1pbm5lcmBdOiB7XG4gICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgICBsaW5lSGVpZ2h0OiAxLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd0cmFuc3BhcmVudCdcbiAgICAgIH0sXG4gICAgICBbYCYke3Byb2dyZXNzQ2xzfS1jaXJjbGUgJHtwcm9ncmVzc0Nsc30tdGV4dGBdOiB7XG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICBpbnNldEJsb2NrU3RhcnQ6ICc1MCUnLFxuICAgICAgICBpbnNldElubGluZVN0YXJ0OiAwLFxuICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICBtYXJnaW46IDAsXG4gICAgICAgIHBhZGRpbmc6IDAsXG4gICAgICAgIGNvbG9yOiB0b2tlbi5jaXJjbGVUZXh0Q29sb3IsXG4gICAgICAgIGZvbnRTaXplOiB0b2tlbi5jaXJjbGVUZXh0Rm9udFNpemUsXG4gICAgICAgIGxpbmVIZWlnaHQ6IDEsXG4gICAgICAgIHdoaXRlU3BhY2U6ICdub3JtYWwnLFxuICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKC01MCUpJyxcbiAgICAgICAgW2ljb25QcmVmaXhDbHNdOiB7XG4gICAgICAgICAgZm9udFNpemU6IHRva2VuLmNpcmNsZUljb25Gb250U2l6ZVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2Ake3Byb2dyZXNzQ2xzfS1jaXJjbGUmLXN0YXR1cy1leGNlcHRpb25gXToge1xuICAgICAgICBbYCR7cHJvZ3Jlc3NDbHN9LXRleHRgXToge1xuICAgICAgICAgIGNvbG9yOiB0b2tlbi5jb2xvckVycm9yXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbYCR7cHJvZ3Jlc3NDbHN9LWNpcmNsZSYtc3RhdHVzLXN1Y2Nlc3NgXToge1xuICAgICAgICBbYCR7cHJvZ3Jlc3NDbHN9LXRleHRgXToge1xuICAgICAgICAgIGNvbG9yOiB0b2tlbi5jb2xvclN1Y2Nlc3NcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW2Ake3Byb2dyZXNzQ2xzfS1pbmxpbmUtY2lyY2xlYF06IHtcbiAgICAgIGxpbmVIZWlnaHQ6IDEsXG4gICAgICBbYCR7cHJvZ3Jlc3NDbHN9LWlubmVyYF06IHtcbiAgICAgICAgdmVydGljYWxBbGlnbjogJ2JvdHRvbSdcbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xuY29uc3QgZ2VuU3RlcFN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzOiBwcm9ncmVzc0Nsc1xuICB9ID0gdG9rZW47XG4gIHJldHVybiB7XG4gICAgW3Byb2dyZXNzQ2xzXToge1xuICAgICAgW2Ake3Byb2dyZXNzQ2xzfS1zdGVwc2BdOiB7XG4gICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgICAnJi1vdXRlcic6IHtcbiAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgZmxleERpcmVjdGlvbjogJ3JvdycsXG4gICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcidcbiAgICAgICAgfSxcbiAgICAgICAgJyYtaXRlbSc6IHtcbiAgICAgICAgICBmbGV4U2hyaW5rOiAwLFxuICAgICAgICAgIG1pbldpZHRoOiB0b2tlbi5wcm9ncmVzc1N0ZXBNaW5XaWR0aCxcbiAgICAgICAgICBtYXJnaW5JbmxpbmVFbmQ6IHRva2VuLnByb2dyZXNzU3RlcE1hcmdpbklubGluZUVuZCxcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRva2VuLnJlbWFpbmluZ0NvbG9yLFxuICAgICAgICAgIHRyYW5zaXRpb246IGBhbGwgJHt0b2tlbi5tb3Rpb25EdXJhdGlvblNsb3d9YCxcbiAgICAgICAgICAnJi1hY3RpdmUnOiB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRva2VuLmRlZmF1bHRDb2xvclxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG5jb25zdCBnZW5TbWFsbExpbmUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHM6IHByb2dyZXNzQ2xzLFxuICAgIGljb25DbHM6IGljb25QcmVmaXhDbHNcbiAgfSA9IHRva2VuO1xuICByZXR1cm4ge1xuICAgIFtwcm9ncmVzc0Nsc106IHtcbiAgICAgIFtgJHtwcm9ncmVzc0Nsc30tc21hbGwmLWxpbmUsICR7cHJvZ3Jlc3NDbHN9LXNtYWxsJi1saW5lICR7cHJvZ3Jlc3NDbHN9LXRleHQgJHtpY29uUHJlZml4Q2xzfWBdOiB7XG4gICAgICAgIGZvbnRTaXplOiB0b2tlbi5mb250U2l6ZVNNXG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbmV4cG9ydCBjb25zdCBwcmVwYXJlQ29tcG9uZW50VG9rZW4gPSB0b2tlbiA9PiAoe1xuICBjaXJjbGVUZXh0Q29sb3I6IHRva2VuLmNvbG9yVGV4dCxcbiAgZGVmYXVsdENvbG9yOiB0b2tlbi5jb2xvckluZm8sXG4gIHJlbWFpbmluZ0NvbG9yOiB0b2tlbi5jb2xvckZpbGxTZWNvbmRhcnksXG4gIGxpbmVCb3JkZXJSYWRpdXM6IDEwMCxcbiAgLy8gbWFnaWMgZm9yIGNhcHN1bGUgc2hhcGUsIHNob3VsZCBiZSBhIHZlcnkgbGFyZ2UgbnVtYmVyXG4gIGNpcmNsZVRleHRGb250U2l6ZTogJzFlbScsXG4gIGNpcmNsZUljb25Gb250U2l6ZTogYCR7dG9rZW4uZm9udFNpemUgLyB0b2tlbi5mb250U2l6ZVNNfWVtYFxufSk7XG5leHBvcnQgZGVmYXVsdCBnZW5TdHlsZUhvb2tzKCdQcm9ncmVzcycsIHRva2VuID0+IHtcbiAgY29uc3QgcHJvZ3Jlc3NTdGVwTWFyZ2luSW5saW5lRW5kID0gdG9rZW4uY2FsYyh0b2tlbi5tYXJnaW5YWFMpLmRpdigyKS5lcXVhbCgpO1xuICBjb25zdCBwcm9ncmVzc1Rva2VuID0gbWVyZ2VUb2tlbih0b2tlbiwge1xuICAgIHByb2dyZXNzU3RlcE1hcmdpbklubGluZUVuZCxcbiAgICBwcm9ncmVzc1N0ZXBNaW5XaWR0aDogcHJvZ3Jlc3NTdGVwTWFyZ2luSW5saW5lRW5kLFxuICAgIHByb2dyZXNzQWN0aXZlTW90aW9uRHVyYXRpb246ICcyLjRzJ1xuICB9KTtcbiAgcmV0dXJuIFtnZW5CYXNlU3R5bGUocHJvZ3Jlc3NUb2tlbiksIGdlbkNpcmNsZVN0eWxlKHByb2dyZXNzVG9rZW4pLCBnZW5TdGVwU3R5bGUocHJvZ3Jlc3NUb2tlbiksIGdlblNtYWxsTGluZShwcm9ncmVzc1Rva2VuKV07XG59LCBwcmVwYXJlQ29tcG9uZW50VG9rZW4pOyIsICJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyBnZXRTaXplIH0gZnJvbSAnLi91dGlscyc7XG5jb25zdCBTdGVwcyA9IHByb3BzID0+IHtcbiAgY29uc3Qge1xuICAgIHNpemUsXG4gICAgc3RlcHMsXG4gICAgcm91bmRpbmc6IGN1c3RvbVJvdW5kaW5nID0gTWF0aC5yb3VuZCxcbiAgICBwZXJjZW50ID0gMCxcbiAgICBzdHJva2VXaWR0aCA9IDgsXG4gICAgc3Ryb2tlQ29sb3IsXG4gICAgdHJhaWxDb2xvciA9IG51bGwsXG4gICAgcHJlZml4Q2xzLFxuICAgIGNoaWxkcmVuXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgY3VycmVudCA9IGN1c3RvbVJvdW5kaW5nKHN0ZXBzICogKHBlcmNlbnQgLyAxMDApKTtcbiAgY29uc3Qgc3RlcFdpZHRoID0gc2l6ZSA9PT0gJ3NtYWxsJyA/IDIgOiAxNDtcbiAgY29uc3QgbWVyZ2VkU2l6ZSA9IHNpemUgIT09IG51bGwgJiYgc2l6ZSAhPT0gdm9pZCAwID8gc2l6ZSA6IFtzdGVwV2lkdGgsIHN0cm9rZVdpZHRoXTtcbiAgY29uc3QgW3dpZHRoLCBoZWlnaHRdID0gZ2V0U2l6ZShtZXJnZWRTaXplLCAnc3RlcCcsIHtcbiAgICBzdGVwcyxcbiAgICBzdHJva2VXaWR0aFxuICB9KTtcbiAgY29uc3QgdW5pdFdpZHRoID0gd2lkdGggLyBzdGVwcztcbiAgY29uc3Qgc3R5bGVkU3RlcHMgPSBBcnJheS5mcm9tKHtcbiAgICBsZW5ndGg6IHN0ZXBzXG4gIH0pO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ZXBzOyBpKyspIHtcbiAgICBjb25zdCBjb2xvciA9IEFycmF5LmlzQXJyYXkoc3Ryb2tlQ29sb3IpID8gc3Ryb2tlQ29sb3JbaV0gOiBzdHJva2VDb2xvcjtcbiAgICBzdHlsZWRTdGVwc1tpXSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGtleTogaSxcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhgJHtwcmVmaXhDbHN9LXN0ZXBzLWl0ZW1gLCB7XG4gICAgICAgIFtgJHtwcmVmaXhDbHN9LXN0ZXBzLWl0ZW0tYWN0aXZlYF06IGkgPD0gY3VycmVudCAtIDFcbiAgICAgIH0pLFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBpIDw9IGN1cnJlbnQgLSAxID8gY29sb3IgOiB0cmFpbENvbG9yLFxuICAgICAgICB3aWR0aDogdW5pdFdpZHRoLFxuICAgICAgICBoZWlnaHRcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogYCR7cHJlZml4Q2xzfS1zdGVwcy1vdXRlcmBcbiAgfSwgc3R5bGVkU3RlcHMsIGNoaWxkcmVuKTtcbn07XG5leHBvcnQgZGVmYXVsdCBTdGVwczsiLCAiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCBQcm9ncmVzcyBmcm9tICcuL3Byb2dyZXNzJztcbmV4cG9ydCBkZWZhdWx0IFByb2dyZXNzOyIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBEZWxldGVPdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9EZWxldGVPdXRsaW5lZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gXCIuLi9jb21wb25lbnRzL0FudGRJY29uXCI7XG52YXIgRGVsZXRlT3V0bGluZWQgPSBmdW5jdGlvbiBEZWxldGVPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbnRkSWNvbiwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogRGVsZXRlT3V0bGluZWRTdmdcbiAgfSkpO1xufTtcblxuLyoqIVtkZWxldGVdKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjNhV1IwYUQwaU5UQWlJR2hsYVdkb2REMGlOVEFpSUdacGJHdzlJaU5qWVdOaFkyRWlJSFpwWlhkQ2IzZzlJalkwSURZMElEZzVOaUE0T1RZaUlHWnZZM1Z6WVdKc1pUMGlabUZzYzJVaUlIaHRiRzV6UFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eU1EQXdMM04yWnlJK1BIQmhkR2dnWkQwaVRUTTJNQ0F4T0RSb0xUaGpOQzQwSURBZ09DMHpMallnT0MwNGRqaG9NekEwZGkwNFl6QWdOQzQwSURNdU5pQTRJRGdnT0dndE9IWTNNbWczTW5ZdE9EQmpNQzB6TlM0ekxUSTRMamN0TmpRdE5qUXROalJJTXpVeVl5MHpOUzR6SURBdE5qUWdNamd1TnkwMk5DQTJOSFk0TUdnM01uWXROeko2YlRVd05DQTNNa2d4TmpCakxURTNMamNnTUMwek1pQXhOQzR6TFRNeUlETXlkak15WXpBZ05DNDBJRE11TmlBNElEZ2dPR2cyTUM0MGJESTBMamNnTlRJell6RXVOaUF6TkM0eElESTVMamdnTmpFZ05qTXVPU0EyTVdnME5UUmpNelF1TWlBd0lEWXlMak10TWpZdU9DQTJNeTQ1TFRZeGJESTBMamN0TlRJelNEZzRPR00wTGpRZ01DQTRMVE11TmlBNExUaDJMVE15WXpBdE1UY3VOeTB4TkM0ekxUTXlMVE15TFRNeWVrMDNNekV1TXlBNE5EQklNamt5TGpkc0xUSTBMakl0TlRFeWFEUTROMnd0TWpRdU1pQTFNVEo2SWlBdlBqd3ZjM1puUGc9PSkgKi9cbnZhciBSZWZJY29uID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoRGVsZXRlT3V0bGluZWQpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgUmVmSWNvbi5kaXNwbGF5TmFtZSA9ICdEZWxldGVPdXRsaW5lZCc7XG59XG5leHBvcnQgZGVmYXVsdCBSZWZJY29uOyIsICIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBEZWxldGVPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNMzYwIDE4NGgtOGM0LjQgMCA4LTMuNiA4LTh2OGgzMDR2LThjMCA0LjQgMy42IDggOCA4aC04djcyaDcydi04MGMwLTM1LjMtMjguNy02NC02NC02NEgzNTJjLTM1LjMgMC02NCAyOC43LTY0IDY0djgwaDcydi03MnptNTA0IDcySDE2MGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJ2MzJjMCA0LjQgMy42IDggOCA4aDYwLjRsMjQuNyA1MjNjMS42IDM0LjEgMjkuOCA2MSA2My45IDYxaDQ1NGMzNC4yIDAgNjIuMy0yNi44IDYzLjktNjFsMjQuNy01MjNIODg4YzQuNCAwIDgtMy42IDgtOHYtMzJjMC0xNy43LTE0LjMtMzItMzItMzJ6TTczMS4zIDg0MEgyOTIuN2wtMjQuMi01MTJoNDg3bC0yNC4yIDUxMnpcIiB9IH1dIH0sIFwibmFtZVwiOiBcImRlbGV0ZVwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgRGVsZXRlT3V0bGluZWQ7XG4iLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRG93bmxvYWRPdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9Eb3dubG9hZE91dGxpbmVkXCI7XG5pbXBvcnQgQW50ZEljb24gZnJvbSBcIi4uL2NvbXBvbmVudHMvQW50ZEljb25cIjtcbnZhciBEb3dubG9hZE91dGxpbmVkID0gZnVuY3Rpb24gRG93bmxvYWRPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbnRkSWNvbiwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogRG93bmxvYWRPdXRsaW5lZFN2Z1xuICB9KSk7XG59O1xuXG4vKiohW2Rvd25sb2FkXShkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUIzYVdSMGFEMGlOVEFpSUdobGFXZG9kRDBpTlRBaUlHWnBiR3c5SWlOallXTmhZMkVpSUhacFpYZENiM2c5SWpZMElEWTBJRGc1TmlBNE9UWWlJR1p2WTNWellXSnNaVDBpWm1Gc2MyVWlJSGh0Ykc1elBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5SStQSEJoZEdnZ1pEMGlUVFV3TlM0M0lEWTJNV0U0SURnZ01DQXdNREV5TGpZZ01Hd3hNVEl0TVRReExqZGpOQzR4TFRVdU1pNDBMVEV5TGprdE5pNHpMVEV5TGpsb0xUYzBMakZXTVRZNFl6QXROQzQwTFRNdU5pMDRMVGd0T0dndE5qQmpMVFF1TkNBd0xUZ2dNeTQyTFRnZ09IWXpNemd1TTBnME1EQmpMVFl1TnlBd0xURXdMalFnTnk0M0xUWXVNeUF4TWk0NWJERXhNaUF4TkRFdU9IcE5PRGM0SURZeU5tZ3ROakJqTFRRdU5DQXdMVGdnTXk0MkxUZ2dPSFl4TlRSSU1qRTBWall6TkdNd0xUUXVOQzB6TGpZdE9DMDRMVGhvTFRZd1l5MDBMalFnTUMwNElETXVOaTA0SURoMk1UazRZekFnTVRjdU55QXhOQzR6SURNeUlETXlJRE15YURZNE5HTXhOeTQzSURBZ016SXRNVFF1TXlBek1pMHpNbFkyTXpSak1DMDBMalF0TXk0MkxUZ3RPQzA0ZWlJZ0x6NDhMM04yWno0PSkgKi9cbnZhciBSZWZJY29uID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoRG93bmxvYWRPdXRsaW5lZCk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBSZWZJY29uLmRpc3BsYXlOYW1lID0gJ0Rvd25sb2FkT3V0bGluZWQnO1xufVxuZXhwb3J0IGRlZmF1bHQgUmVmSWNvbjsiLCAiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgRG93bmxvYWRPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNTA1LjcgNjYxYTggOCAwIDAwMTIuNiAwbDExMi0xNDEuN2M0LjEtNS4yLjQtMTIuOS02LjMtMTIuOWgtNzQuMVYxNjhjMC00LjQtMy42LTgtOC04aC02MGMtNC40IDAtOCAzLjYtOCA4djMzOC4zSDQwMGMtNi43IDAtMTAuNCA3LjctNi4zIDEyLjlsMTEyIDE0MS44ek04NzggNjI2aC02MGMtNC40IDAtOCAzLjYtOCA4djE1NEgyMTRWNjM0YzAtNC40LTMuNi04LTgtOGgtNjBjLTQuNCAwLTggMy42LTggOHYxOThjMCAxNy43IDE0LjMgMzIgMzIgMzJoNjg0YzE3LjcgMCAzMi0xNC4zIDMyLTMyVjYzNGMwLTQuNC0zLjYtOC04LTh6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJkb3dubG9hZFwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgRG93bmxvYWRPdXRsaW5lZDtcbiIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBGaWxlVHdvVG9uZVN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9GaWxlVHdvVG9uZVwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gXCIuLi9jb21wb25lbnRzL0FudGRJY29uXCI7XG52YXIgRmlsZVR3b1RvbmUgPSBmdW5jdGlvbiBGaWxlVHdvVG9uZShwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbnRkSWNvbiwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogRmlsZVR3b1RvbmVTdmdcbiAgfSkpO1xufTtcblxuLyoqIVtmaWxlXShkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUIzYVdSMGFEMGlOVEFpSUdobGFXZG9kRDBpTlRBaUlHWnBiR3c5SWlOallXTmhZMkVpSUhacFpYZENiM2c5SWpZMElEWTBJRGc1TmlBNE9UWWlJR1p2WTNWellXSnNaVDBpWm1Gc2MyVWlJSGh0Ykc1elBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5SStQSEJoZEdnZ1pEMGlUVFV6TkNBek5USldNVE0yU0RJek1uWTNOVEpvTlRZd1ZqTTVORWcxTnpaaE5ESWdORElnTUNBd01TMDBNaTAwTW5vaUlHWnBiR3c5SWlObE5tWTBabVlpSUM4K1BIQmhkR2dnWkQwaVRUZzFOQzQySURJNE9DNDJURFl6T1M0MElEY3pMalJqTFRZdE5pMHhOQzR4TFRrdU5DMHlNaTQyTFRrdU5FZ3hPVEpqTFRFM0xqY2dNQzB6TWlBeE5DNHpMVE15SURNeWRqZ3pNbU13SURFM0xqY2dNVFF1TXlBek1pQXpNaUF6TW1nMk5EQmpNVGN1TnlBd0lETXlMVEUwTGpNZ016SXRNekpXTXpFeExqTmpNQzA0TGpVdE15NDBMVEUyTGpjdE9TNDBMVEl5TGpkNlRUWXdNaUF4TXpjdU9FdzNPVEF1TWlBek1qWklOakF5VmpFek55NDRlazAzT1RJZ09EZzRTREl6TWxZeE16Wm9NekF5ZGpJeE5tRTBNaUEwTWlBd0lEQXdORElnTkRKb01qRTJkalE1TkhvaUlHWnBiR3c5SWlNeE5qYzNabVlpSUM4K1BDOXpkbWMrKSAqL1xudmFyIFJlZkljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihGaWxlVHdvVG9uZSk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBSZWZJY29uLmRpc3BsYXlOYW1lID0gJ0ZpbGVUd29Ub25lJztcbn1cbmV4cG9ydCBkZWZhdWx0IFJlZkljb247IiwgIi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxudmFyIEZpbGVUd29Ub25lID0geyBcImljb25cIjogZnVuY3Rpb24gcmVuZGVyKHByaW1hcnlDb2xvciwgc2Vjb25kYXJ5Q29sb3IpIHsgcmV0dXJuIHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNTM0IDM1MlYxMzZIMjMydjc1Mmg1NjBWMzk0SDU3NmE0MiA0MiAwIDAxLTQyLTQyelwiLCBcImZpbGxcIjogc2Vjb25kYXJ5Q29sb3IgfSB9LCB7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTg1NC42IDI4OC42TDYzOS40IDczLjRjLTYtNi0xNC4xLTkuNC0yMi42LTkuNEgxOTJjLTE3LjcgMC0zMiAxNC4zLTMyIDMydjgzMmMwIDE3LjcgMTQuMyAzMiAzMiAzMmg2NDBjMTcuNyAwIDMyLTE0LjMgMzItMzJWMzExLjNjMC04LjUtMy40LTE2LjctOS40LTIyLjd6TTYwMiAxMzcuOEw3OTAuMiAzMjZINjAyVjEzNy44ek03OTIgODg4SDIzMlYxMzZoMzAydjIxNmE0MiA0MiAwIDAwNDIgNDJoMjE2djQ5NHpcIiwgXCJmaWxsXCI6IHByaW1hcnlDb2xvciB9IH1dIH07IH0sIFwibmFtZVwiOiBcImZpbGVcIiwgXCJ0aGVtZVwiOiBcInR3b3RvbmVcIiB9O1xuZXhwb3J0IGRlZmF1bHQgRmlsZVR3b1RvbmU7XG4iLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUGFwZXJDbGlwT3V0bGluZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vUGFwZXJDbGlwT3V0bGluZWRcIjtcbmltcG9ydCBBbnRkSWNvbiBmcm9tIFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiO1xudmFyIFBhcGVyQ2xpcE91dGxpbmVkID0gZnVuY3Rpb24gUGFwZXJDbGlwT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IFBhcGVyQ2xpcE91dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5cbi8qKiFbcGFwZXItY2xpcF0oZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTlRBaUlHaGxhV2RvZEQwaU5UQWlJR1pwYkd3OUlpTmpZV05oWTJFaUlIWnBaWGRDYjNnOUlqWTBJRFkwSURnNU5pQTRPVFlpSUdadlkzVnpZV0pzWlQwaVptRnNjMlVpSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUkrUEhCaGRHZ2daRDBpVFRjM09TNHpJREU1Tmk0Mll5MDVOQzR5TFRrMExqSXRNalEzTGpZdE9UUXVNaTB6TkRFdU55QXdiQzB5TmpFZ01qWXdMamhqTFRFdU55QXhMamN0TWk0MklEUXRNaTQySURZdU5ITXVPU0EwTGpjZ01pNDJJRFl1Tkd3ek5pNDVJRE0yTGpsaE9TQTVJREFnTURBeE1pNDNJREJzTWpZeExUSTJNQzQ0WXpNeUxqUXRNekl1TkNBM05TNDFMVFV3TGpJZ01USXhMak10TlRBdU1uTTRPQzQ1SURFM0xqZ2dNVEl4TGpJZ05UQXVNbU16TWk0MElETXlMalFnTlRBdU1pQTNOUzQxSURVd0xqSWdNVEl4TGpJZ01DQTBOUzQ0TFRFM0xqZ2dPRGd1T0MwMU1DNHlJREV5TVM0eWJDMHlOallnTWpZMUxqa3RORE11TVNBME15NHhZeTAwTUM0eklEUXdMak10TVRBMUxqZ2dOREF1TXkweE5EWXVNU0F3TFRFNUxqVXRNVGt1TlMwek1DNHlMVFExTGpRdE16QXVNaTAzTTNNeE1DNDNMVFV6TGpVZ016QXVNaTAzTTJ3eU5qTXVPUzB5TmpNdU9HTTJMamN0Tmk0MklERTFMalV0TVRBdU15QXlOQzQ1TFRFd0xqTm9MakZqT1M0MElEQWdNVGd1TVNBekxqY2dNalF1TnlBeE1DNHpJRFl1TnlBMkxqY2dNVEF1TXlBeE5TNDFJREV3TGpNZ01qUXVPU0F3SURrdU15MHpMamNnTVRndU1TMHhNQzR6SURJMExqZE1NemN5TGpRZ05qVXpZeTB4TGpjZ01TNDNMVEl1TmlBMExUSXVOaUEyTGpSekxqa2dOQzQzSURJdU5pQTJMalJzTXpZdU9TQXpOaTQ1WVRrZ09TQXdJREF3TVRJdU55QXdiREl4TlM0MkxUSXhOUzQyWXpFNUxqa3RNVGt1T1NBek1DNDRMVFEyTGpNZ016QXVPQzAzTkM0MGN5MHhNUzAxTkM0MkxUTXdMamd0TnpRdU5HTXROREV1TVMwME1TNHhMVEV3Tnk0NUxUUXhMVEUwT1NBd1REUTJNeUF6TmpRZ01qSTBMamdnTmpBeUxqRkJNVGN5TGpJeUlERTNNaTR5TWlBd0lEQXdNVGMwSURjeU5DNDRZekFnTkRZdU15QXhPQzR4SURnNUxqZ2dOVEF1T0NBeE1qSXVOU0F6TXk0NUlETXpMamdnTnpndU15QTFNQzQzSURFeU1pNDNJRFV3TGpjZ05EUXVOQ0F3SURnNExqZ3RNVFl1T1NBeE1qSXVOaTAxTUM0M2JETXdPUzR5TFRNd09VTTRNalF1T0NBME9USXVOeUE0TlRBZ05ETXlJRGcxTUNBek5qY3VOV011TVMwMk5DNDJMVEkxTGpFdE1USTFMak10TnpBdU55MHhOekF1T1hvaUlDOCtQQzl6ZG1jKykgKi9cbnZhciBSZWZJY29uID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoUGFwZXJDbGlwT3V0bGluZWQpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgUmVmSWNvbi5kaXNwbGF5TmFtZSA9ICdQYXBlckNsaXBPdXRsaW5lZCc7XG59XG5leHBvcnQgZGVmYXVsdCBSZWZJY29uOyIsICIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBQYXBlckNsaXBPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNzc5LjMgMTk2LjZjLTk0LjItOTQuMi0yNDcuNi05NC4yLTM0MS43IDBsLTI2MSAyNjAuOGMtMS43IDEuNy0yLjYgNC0yLjYgNi40cy45IDQuNyAyLjYgNi40bDM2LjkgMzYuOWE5IDkgMCAwMDEyLjcgMGwyNjEtMjYwLjhjMzIuNC0zMi40IDc1LjUtNTAuMiAxMjEuMy01MC4yczg4LjkgMTcuOCAxMjEuMiA1MC4yYzMyLjQgMzIuNCA1MC4yIDc1LjUgNTAuMiAxMjEuMiAwIDQ1LjgtMTcuOCA4OC44LTUwLjIgMTIxLjJsLTI2NiAyNjUuOS00My4xIDQzLjFjLTQwLjMgNDAuMy0xMDUuOCA0MC4zLTE0Ni4xIDAtMTkuNS0xOS41LTMwLjItNDUuNC0zMC4yLTczczEwLjctNTMuNSAzMC4yLTczbDI2My45LTI2My44YzYuNy02LjYgMTUuNS0xMC4zIDI0LjktMTAuM2guMWM5LjQgMCAxOC4xIDMuNyAyNC43IDEwLjMgNi43IDYuNyAxMC4zIDE1LjUgMTAuMyAyNC45IDAgOS4zLTMuNyAxOC4xLTEwLjMgMjQuN0wzNzIuNCA2NTNjLTEuNyAxLjctMi42IDQtMi42IDYuNHMuOSA0LjcgMi42IDYuNGwzNi45IDM2LjlhOSA5IDAgMDAxMi43IDBsMjE1LjYtMjE1LjZjMTkuOS0xOS45IDMwLjgtNDYuMyAzMC44LTc0LjRzLTExLTU0LjYtMzAuOC03NC40Yy00MS4xLTQxLjEtMTA3LjktNDEtMTQ5IDBMNDYzIDM2NCAyMjQuOCA2MDIuMUExNzIuMjIgMTcyLjIyIDAgMDAxNzQgNzI0LjhjMCA0Ni4zIDE4LjEgODkuOCA1MC44IDEyMi41IDMzLjkgMzMuOCA3OC4zIDUwLjcgMTIyLjcgNTAuNyA0NC40IDAgODguOC0xNi45IDEyMi42LTUwLjdsMzA5LjItMzA5QzgyNC44IDQ5Mi43IDg1MCA0MzIgODUwIDM2Ny41Yy4xLTY0LjYtMjUuMS0xMjUuMy03MC43LTE3MC45elwiIH0gfV0gfSwgXCJuYW1lXCI6IFwicGFwZXItY2xpcFwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgUGFwZXJDbGlwT3V0bGluZWQ7XG4iLCAiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUGljdHVyZVR3b1RvbmVTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vUGljdHVyZVR3b1RvbmVcIjtcbmltcG9ydCBBbnRkSWNvbiBmcm9tIFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiO1xudmFyIFBpY3R1cmVUd29Ub25lID0gZnVuY3Rpb24gUGljdHVyZVR3b1RvbmUocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IFBpY3R1cmVUd29Ub25lU3ZnXG4gIH0pKTtcbn07XG5cbi8qKiFbcGljdHVyZV0oZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTlRBaUlHaGxhV2RvZEQwaU5UQWlJR1pwYkd3OUlpTmpZV05oWTJFaUlIWnBaWGRDYjNnOUlqWTBJRFkwSURnNU5pQTRPVFlpSUdadlkzVnpZV0pzWlQwaVptRnNjMlVpSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUkrUEhCaGRHZ2daRDBpVFRreU9DQXhOakJJT1RaakxURTNMamNnTUMwek1pQXhOQzR6TFRNeUlETXlkalkwTUdNd0lERTNMamNnTVRRdU15QXpNaUF6TWlBek1tZzRNekpqTVRjdU55QXdJRE15TFRFMExqTWdNekl0TXpKV01Ua3lZekF0TVRjdU55MHhOQzR6TFRNeUxUTXlMVE15ZW0wdE5EQWdOak15U0RFek5uWXRNemt1T1d3eE16Z3VOUzB4TmpRdU15QXhOVEF1TVNBeE56aE1OalU0TGpFZ05EZzVJRGc0T0NBM05qRXVObFkzT1RKNmJUQXRNVEk1TGpoTU5qWTBMaklnTXprMkxqaGpMVE11TWkwekxqZ3RPUzB6TGpndE1USXVNaUF3VERReU5DNDJJRFkyTmk0MGJDMHhORFF0TVRjd0xqZGpMVE11TWkwekxqZ3RPUzB6TGpndE1USXVNaUF3VERFek5pQTJOVEl1TjFZeU16Sm9OelV5ZGpRek1DNHllaUlnWm1sc2JEMGlJekUyTnpkbVppSWdMejQ4Y0dGMGFDQmtQU0pOTkRJMExqWWdOelkxTGpoc0xURTFNQzR4TFRFM09Fd3hNellnTnpVeUxqRldOemt5YURjMU1uWXRNekF1TkV3Mk5UZ3VNU0EwT0RsNklpQm1hV3hzUFNJalpUWm1OR1ptSWlBdlBqeHdZWFJvSUdROUlrMHhNellnTmpVeUxqZHNNVE15TGpRdE1UVTNZek11TWkwekxqZ2dPUzB6TGpnZ01USXVNaUF3YkRFME5DQXhOekF1TjB3Mk5USWdNemsyTGpoak15NHlMVE11T0NBNUxUTXVPQ0F4TWk0eUlEQk1PRGc0SURZMk1pNHlWakl6TWtneE16WjJOREl3TGpkNlRUTXdOQ0F5T0RCaE9EZ2dPRGdnTUNBeE1UQWdNVGMySURnNElEZzRJREFnTURFd0xURTNObm9pSUdacGJHdzlJaU5sTm1ZMFptWWlJQzgrUEhCaGRHZ2daRDBpVFRJM05pQXpOamhoTWpnZ01qZ2dNQ0F4TURVMklEQWdNamdnTWpnZ01DQXhNQzAxTmlBd2VpSWdabWxzYkQwaUkyVTJaalJtWmlJZ0x6NDhjR0YwYUNCa1BTSk5NekEwSURRMU5tRTRPQ0E0T0NBd0lERXdNQzB4TnpZZ09EZ2dPRGdnTUNBd01EQWdNVGMyZW0wd0xURXhObU14TlM0MUlEQWdNamdnTVRJdU5TQXlPQ0F5T0hNdE1USXVOU0F5T0MweU9DQXlPQzB5T0MweE1pNDFMVEk0TFRJNElERXlMalV0TWpnZ01qZ3RNamg2SWlCbWFXeHNQU0lqTVRZM04yWm1JaUF2UGp3dmMzWm5QZz09KSAqL1xudmFyIFJlZkljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihQaWN0dXJlVHdvVG9uZSk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBSZWZJY29uLmRpc3BsYXlOYW1lID0gJ1BpY3R1cmVUd29Ub25lJztcbn1cbmV4cG9ydCBkZWZhdWx0IFJlZkljb247IiwgIi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxudmFyIFBpY3R1cmVUd29Ub25lID0geyBcImljb25cIjogZnVuY3Rpb24gcmVuZGVyKHByaW1hcnlDb2xvciwgc2Vjb25kYXJ5Q29sb3IpIHsgcmV0dXJuIHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNOTI4IDE2MEg5NmMtMTcuNyAwLTMyIDE0LjMtMzIgMzJ2NjQwYzAgMTcuNyAxNC4zIDMyIDMyIDMyaDgzMmMxNy43IDAgMzItMTQuMyAzMi0zMlYxOTJjMC0xNy43LTE0LjMtMzItMzItMzJ6bS00MCA2MzJIMTM2di0zOS45bDEzOC41LTE2NC4zIDE1MC4xIDE3OEw2NTguMSA0ODkgODg4IDc2MS42Vjc5MnptMC0xMjkuOEw2NjQuMiAzOTYuOGMtMy4yLTMuOC05LTMuOC0xMi4yIDBMNDI0LjYgNjY2LjRsLTE0NC0xNzAuN2MtMy4yLTMuOC05LTMuOC0xMi4yIDBMMTM2IDY1Mi43VjIzMmg3NTJ2NDMwLjJ6XCIsIFwiZmlsbFwiOiBwcmltYXJ5Q29sb3IgfSB9LCB7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTQyNC42IDc2NS44bC0xNTAuMS0xNzhMMTM2IDc1Mi4xVjc5Mmg3NTJ2LTMwLjRMNjU4LjEgNDg5elwiLCBcImZpbGxcIjogc2Vjb25kYXJ5Q29sb3IgfSB9LCB7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTEzNiA2NTIuN2wxMzIuNC0xNTdjMy4yLTMuOCA5LTMuOCAxMi4yIDBsMTQ0IDE3MC43TDY1MiAzOTYuOGMzLjItMy44IDktMy44IDEyLjIgMEw4ODggNjYyLjJWMjMySDEzNnY0MjAuN3pNMzA0IDI4MGE4OCA4OCAwIDExMCAxNzYgODggODggMCAwMTAtMTc2elwiLCBcImZpbGxcIjogc2Vjb25kYXJ5Q29sb3IgfSB9LCB7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTI3NiAzNjhhMjggMjggMCAxMDU2IDAgMjggMjggMCAxMC01NiAwelwiLCBcImZpbGxcIjogc2Vjb25kYXJ5Q29sb3IgfSB9LCB7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTMwNCA0NTZhODggODggMCAxMDAtMTc2IDg4IDg4IDAgMDAwIDE3NnptMC0xMTZjMTUuNSAwIDI4IDEyLjUgMjggMjhzLTEyLjUgMjgtMjggMjgtMjgtMTIuNS0yOC0yOCAxMi41LTI4IDI4LTI4elwiLCBcImZpbGxcIjogcHJpbWFyeUNvbG9yIH0gfV0gfTsgfSwgXCJuYW1lXCI6IFwicGljdHVyZVwiLCBcInRoZW1lXCI6IFwidHdvdG9uZVwiIH07XG5leHBvcnQgZGVmYXVsdCBQaWN0dXJlVHdvVG9uZTtcbiIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBVcGxvYWRPdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9VcGxvYWRPdXRsaW5lZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gXCIuLi9jb21wb25lbnRzL0FudGRJY29uXCI7XG52YXIgVXBsb2FkT3V0bGluZWQgPSBmdW5jdGlvbiBVcGxvYWRPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbnRkSWNvbiwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogVXBsb2FkT3V0bGluZWRTdmdcbiAgfSkpO1xufTtcblxuLyoqIVt1cGxvYWRdKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjNhV1IwYUQwaU5UQWlJR2hsYVdkb2REMGlOVEFpSUdacGJHdzlJaU5qWVdOaFkyRWlJSFpwWlhkQ2IzZzlJalkwSURZMElEZzVOaUE0T1RZaUlHWnZZM1Z6WVdKc1pUMGlabUZzYzJVaUlIaHRiRzV6UFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eU1EQXdMM04yWnlJK1BIQmhkR2dnWkQwaVRUUXdNQ0F6TVRjdU4yZzNNeTQ1VmpZMU5tTXdJRFF1TkNBekxqWWdPQ0E0SURob05qQmpOQzQwSURBZ09DMHpMallnT0MwNFZqTXhOeTQzU0RZeU5HTTJMamNnTUNBeE1DNDBMVGN1TnlBMkxqTXRNVEl1T1V3MU1UZ3VNeUF4TmpOaE9DQTRJREFnTURBdE1USXVOaUF3YkMweE1USWdNVFF4TGpkakxUUXVNU0ExTGpNdExqUWdNVE1nTmk0eklERXplazA0TnpnZ05qSTJhQzAyTUdNdE5DNDBJREF0T0NBekxqWXRPQ0E0ZGpFMU5FZ3lNVFJXTmpNMFl6QXROQzQwTFRNdU5pMDRMVGd0T0dndE5qQmpMVFF1TkNBd0xUZ2dNeTQyTFRnZ09IWXhPVGhqTUNBeE55NDNJREUwTGpNZ016SWdNeklnTXpKb05qZzBZekUzTGpjZ01DQXpNaTB4TkM0eklETXlMVE15VmpZek5HTXdMVFF1TkMwekxqWXRPQzA0TFRoNklpQXZQand2YzNablBnPT0pICovXG52YXIgUmVmSWNvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKFVwbG9hZE91dGxpbmVkKTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFJlZkljb24uZGlzcGxheU5hbWUgPSAnVXBsb2FkT3V0bGluZWQnO1xufVxuZXhwb3J0IGRlZmF1bHQgUmVmSWNvbjsiLCAiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgVXBsb2FkT3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTQwMCAzMTcuN2g3My45VjY1NmMwIDQuNCAzLjYgOCA4IDhoNjBjNC40IDAgOC0zLjYgOC04VjMxNy43SDYyNGM2LjcgMCAxMC40LTcuNyA2LjMtMTIuOUw1MTguMyAxNjNhOCA4IDAgMDAtMTIuNiAwbC0xMTIgMTQxLjdjLTQuMSA1LjMtLjQgMTMgNi4zIDEzek04NzggNjI2aC02MGMtNC40IDAtOCAzLjYtOCA4djE1NEgyMTRWNjM0YzAtNC40LTMuNi04LTgtOGgtNjBjLTQuNCAwLTggMy42LTggOHYxOThjMCAxNy43IDE0LjMgMzIgMzIgMzJoNjg0YzE3LjcgMCAzMi0xNC4zIDMyLTMyVjYzNGMwLTQuNC0zLjYtOC04LTh6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJ1cGxvYWRcIiwgXCJ0aGVtZVwiOiBcIm91dGxpbmVkXCIgfTtcbmV4cG9ydCBkZWZhdWx0IFVwbG9hZE91dGxpbmVkO1xuIiwgIlwidXNlIGNsaWVudFwiO1xuXG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFVwbG9hZCBmcm9tICcuL1VwbG9hZCc7XG5jb25zdCBEcmFnZ2VyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKF9hLCByZWYpID0+IHtcbiAgdmFyIHtcbiAgICAgIHN0eWxlLFxuICAgICAgaGVpZ2h0LFxuICAgICAgaGFzQ29udHJvbEluc2lkZSA9IGZhbHNlXG4gICAgfSA9IF9hLFxuICAgIHJlc3RQcm9wcyA9IF9fcmVzdChfYSwgW1wic3R5bGVcIiwgXCJoZWlnaHRcIiwgXCJoYXNDb250cm9sSW5zaWRlXCJdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFVwbG9hZCwgT2JqZWN0LmFzc2lnbih7XG4gICAgcmVmOiByZWYsXG4gICAgaGFzQ29udHJvbEluc2lkZTogaGFzQ29udHJvbEluc2lkZVxuICB9LCByZXN0UHJvcHMsIHtcbiAgICB0eXBlOiBcImRyYWdcIixcbiAgICBzdHlsZTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdHlsZSksIHtcbiAgICAgIGhlaWdodFxuICAgIH0pXG4gIH0pKTtcbn0pO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgRHJhZ2dlci5kaXNwbGF5TmFtZSA9ICdEcmFnZ2VyJztcbn1cbmV4cG9ydCBkZWZhdWx0IERyYWdnZXI7IiwgIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xudmFyIF9fYXdhaXRlciA9IHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7XG4gICAgICByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTtcbiAgICB9XG4gICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICB9KTtcbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBmbHVzaFN5bmMgfSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUmNVcGxvYWQgZnJvbSAncmMtdXBsb2FkJztcbmltcG9ydCB1c2VNZXJnZWRTdGF0ZSBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VNZXJnZWRTdGF0ZVwiO1xuaW1wb3J0IHsgZGV2VXNlV2FybmluZyB9IGZyb20gJy4uL191dGlsL3dhcm5pbmcnO1xuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgRGlzYWJsZWRDb250ZXh0IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlci9EaXNhYmxlZENvbnRleHQnO1xuaW1wb3J0IHsgdXNlTG9jYWxlIH0gZnJvbSAnLi4vbG9jYWxlJztcbmltcG9ydCBkZWZhdWx0TG9jYWxlIGZyb20gJy4uL2xvY2FsZS9lbl9VUyc7XG5pbXBvcnQgdXNlU3R5bGUgZnJvbSAnLi9zdHlsZSc7XG5pbXBvcnQgVXBsb2FkTGlzdCBmcm9tICcuL1VwbG9hZExpc3QnO1xuaW1wb3J0IHsgZmlsZTJPYmosIGdldEZpbGVJdGVtLCByZW1vdmVGaWxlSXRlbSwgdXBkYXRlRmlsZUxpc3QgfSBmcm9tICcuL3V0aWxzJztcbmV4cG9ydCBjb25zdCBMSVNUX0lHTk9SRSA9IGBfX0xJU1RfSUdOT1JFXyR7RGF0ZS5ub3coKX1fX2A7XG5jb25zdCBJbnRlcm5hbFVwbG9hZCA9IChwcm9wcywgcmVmKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBmaWxlTGlzdCxcbiAgICBkZWZhdWx0RmlsZUxpc3QsXG4gICAgb25SZW1vdmUsXG4gICAgc2hvd1VwbG9hZExpc3QgPSB0cnVlLFxuICAgIGxpc3RUeXBlID0gJ3RleHQnLFxuICAgIG9uUHJldmlldyxcbiAgICBvbkRvd25sb2FkLFxuICAgIG9uQ2hhbmdlLFxuICAgIG9uRHJvcCxcbiAgICBwcmV2aWV3RmlsZSxcbiAgICBkaXNhYmxlZDogY3VzdG9tRGlzYWJsZWQsXG4gICAgbG9jYWxlOiBwcm9wTG9jYWxlLFxuICAgIGljb25SZW5kZXIsXG4gICAgaXNJbWFnZVVybCxcbiAgICBwcm9ncmVzcyxcbiAgICBwcmVmaXhDbHM6IGN1c3RvbWl6ZVByZWZpeENscyxcbiAgICBjbGFzc05hbWUsXG4gICAgdHlwZSA9ICdzZWxlY3QnLFxuICAgIGNoaWxkcmVuLFxuICAgIHN0eWxlLFxuICAgIGl0ZW1SZW5kZXIsXG4gICAgbWF4Q291bnQsXG4gICAgZGF0YSA9IHt9LFxuICAgIG11bHRpcGxlID0gZmFsc2UsXG4gICAgaGFzQ29udHJvbEluc2lkZSA9IHRydWUsXG4gICAgYWN0aW9uID0gJycsXG4gICAgYWNjZXB0ID0gJycsXG4gICAgc3VwcG9ydFNlcnZlclJlbmRlciA9IHRydWUsXG4gICAgcm9vdENsYXNzTmFtZVxuICB9ID0gcHJvcHM7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PSBEaXNhYmxlZCA9PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3QgZGlzYWJsZWQgPSBSZWFjdC51c2VDb250ZXh0KERpc2FibGVkQ29udGV4dCk7XG4gIGNvbnN0IG1lcmdlZERpc2FibGVkID0gY3VzdG9tRGlzYWJsZWQgIT09IG51bGwgJiYgY3VzdG9tRGlzYWJsZWQgIT09IHZvaWQgMCA/IGN1c3RvbURpc2FibGVkIDogZGlzYWJsZWQ7XG4gIGNvbnN0IFttZXJnZWRGaWxlTGlzdCwgc2V0TWVyZ2VkRmlsZUxpc3RdID0gdXNlTWVyZ2VkU3RhdGUoZGVmYXVsdEZpbGVMaXN0IHx8IFtdLCB7XG4gICAgdmFsdWU6IGZpbGVMaXN0LFxuICAgIHBvc3RTdGF0ZTogbGlzdCA9PiBsaXN0ICE9PSBudWxsICYmIGxpc3QgIT09IHZvaWQgMCA/IGxpc3QgOiBbXVxuICB9KTtcbiAgY29uc3QgW2RyYWdTdGF0ZSwgc2V0RHJhZ1N0YXRlXSA9IFJlYWN0LnVzZVN0YXRlKCdkcm9wJyk7XG4gIGNvbnN0IHVwbG9hZCA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3Qgd3JhcFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBjb25zdCB3YXJuaW5nID0gZGV2VXNlV2FybmluZygnVXBsb2FkJyk7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZygnZmlsZUxpc3QnIGluIHByb3BzIHx8ICEoJ3ZhbHVlJyBpbiBwcm9wcyksICd1c2FnZScsICdgdmFsdWVgIGlzIG5vdCBhIHZhbGlkIHByb3AsIGRvIHlvdSBtZWFuIGBmaWxlTGlzdGA/JykgOiB2b2lkIDA7XG4gICAgd2FybmluZy5kZXByZWNhdGVkKCEoJ3RyYW5zZm9ybUZpbGUnIGluIHByb3BzKSwgJ3RyYW5zZm9ybUZpbGUnLCAnYmVmb3JlVXBsb2FkJyk7XG4gIH1cbiAgLy8gQ29udHJvbCBtb2RlIHdpbGwgYXV0byBmaWxsIGZpbGUgdWlkIGlmIG5vdCBwcm92aWRlZFxuICBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgIChmaWxlTGlzdCB8fCBbXSkuZm9yRWFjaCgoZmlsZSwgaW5kZXgpID0+IHtcbiAgICAgIGlmICghZmlsZS51aWQgJiYgIU9iamVjdC5pc0Zyb3plbihmaWxlKSkge1xuICAgICAgICBmaWxlLnVpZCA9IGBfX0FVVE9fXyR7dGltZXN0YW1wfV8ke2luZGV4fV9fYDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSwgW2ZpbGVMaXN0XSk7XG4gIGNvbnN0IG9uSW50ZXJuYWxDaGFuZ2UgPSAoZmlsZSwgY2hhbmdlZEZpbGVMaXN0LCBldmVudCkgPT4ge1xuICAgIGxldCBjbG9uZUxpc3QgPSBfdG9Db25zdW1hYmxlQXJyYXkoY2hhbmdlZEZpbGVMaXN0KTtcbiAgICBsZXQgZXhjZWVkTWF4Q291bnQgPSBmYWxzZTtcbiAgICAvLyBDdXQgdG8gbWF0Y2ggY291bnRcbiAgICBpZiAobWF4Q291bnQgPT09IDEpIHtcbiAgICAgIGNsb25lTGlzdCA9IGNsb25lTGlzdC5zbGljZSgtMSk7XG4gICAgfSBlbHNlIGlmIChtYXhDb3VudCkge1xuICAgICAgZXhjZWVkTWF4Q291bnQgPSBjbG9uZUxpc3QubGVuZ3RoID4gbWF4Q291bnQ7XG4gICAgICBjbG9uZUxpc3QgPSBjbG9uZUxpc3Quc2xpY2UoMCwgbWF4Q291bnQpO1xuICAgIH1cbiAgICAvLyBQcmV2ZW50IFJlYWN0MTggYXV0byBiYXRjaCBzaW5jZSBpbnB1dFt1cGxvYWRdIHRyaWdnZXIgcHJvY2VzcyBhdCBzYW1lIHRpbWVcbiAgICAvLyB3aGljaCBtYWtlcyBmaWxlTGlzdCBjbG9zdXJlIHByb2JsZW1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtZG9tL25vLWZsdXNoLXN5bmNcbiAgICBmbHVzaFN5bmMoKCkgPT4ge1xuICAgICAgc2V0TWVyZ2VkRmlsZUxpc3QoY2xvbmVMaXN0KTtcbiAgICB9KTtcbiAgICBjb25zdCBjaGFuZ2VJbmZvID0ge1xuICAgICAgZmlsZTogZmlsZSxcbiAgICAgIGZpbGVMaXN0OiBjbG9uZUxpc3RcbiAgICB9O1xuICAgIGlmIChldmVudCkge1xuICAgICAgY2hhbmdlSW5mby5ldmVudCA9IGV2ZW50O1xuICAgIH1cbiAgICBpZiAoIWV4Y2VlZE1heENvdW50IHx8IGZpbGUuc3RhdHVzID09PSAncmVtb3ZlZCcgfHxcbiAgICAvLyBXZSBzaG91bGQgaWdub3JlIGV2ZW50IGlmIGN1cnJlbnQgZmlsZSBpcyBleGNlZWQgYG1heENvdW50YFxuICAgIGNsb25lTGlzdC5zb21lKGYgPT4gZi51aWQgPT09IGZpbGUudWlkKSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWRvbS9uby1mbHVzaC1zeW5jXG4gICAgICBmbHVzaFN5bmMoKCkgPT4ge1xuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UoY2hhbmdlSW5mbyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IG1lcmdlZEJlZm9yZVVwbG9hZCA9IChmaWxlLCBmaWxlTGlzdEFyZ3MpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGJlZm9yZVVwbG9hZCxcbiAgICAgIHRyYW5zZm9ybUZpbGVcbiAgICB9ID0gcHJvcHM7XG4gICAgbGV0IHBhcnNlZEZpbGUgPSBmaWxlO1xuICAgIGlmIChiZWZvcmVVcGxvYWQpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIGJlZm9yZVVwbG9hZChmaWxlLCBmaWxlTGlzdEFyZ3MpO1xuICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgLy8gSGFjayBmb3IgTElTVF9JR05PUkUsIHdlIGFkZCBhZGRpdGlvbmFsIGluZm8gdG8gcmVtb3ZlIGZyb20gdGhlIGxpc3RcbiAgICAgIGRlbGV0ZSBmaWxlW0xJU1RfSUdOT1JFXTtcbiAgICAgIGlmIChyZXN1bHQgPT09IExJU1RfSUdOT1JFKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmaWxlLCBMSVNUX0lHTk9SRSwge1xuICAgICAgICAgIHZhbHVlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnICYmIHJlc3VsdCkge1xuICAgICAgICBwYXJzZWRGaWxlID0gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHJhbnNmb3JtRmlsZSkge1xuICAgICAgcGFyc2VkRmlsZSA9IHlpZWxkIHRyYW5zZm9ybUZpbGUocGFyc2VkRmlsZSk7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZWRGaWxlO1xuICB9KTtcbiAgY29uc3Qgb25CYXRjaFN0YXJ0ID0gYmF0Y2hGaWxlSW5mb0xpc3QgPT4ge1xuICAgIC8vIFNraXAgZmlsZSB3aGljaCBtYXJrZWQgYXMgYExJU1RfSUdOT1JFYCwgdGhlc2UgZmlsZSB3aWxsIG5vdCBhZGQgdG8gZmlsZSBsaXN0XG4gICAgY29uc3QgZmlsdGVyZWRGaWxlSW5mb0xpc3QgPSBiYXRjaEZpbGVJbmZvTGlzdC5maWx0ZXIoaW5mbyA9PiAhaW5mby5maWxlW0xJU1RfSUdOT1JFXSk7XG4gICAgLy8gTm90aGluZyB0byBkbyBzaW5jZSBubyBmaWxlIG5lZWQgdXBsb2FkXG4gICAgaWYgKCFmaWx0ZXJlZEZpbGVJbmZvTGlzdC5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb2JqZWN0RmlsZUxpc3QgPSBmaWx0ZXJlZEZpbGVJbmZvTGlzdC5tYXAoaW5mbyA9PiBmaWxlMk9iaihpbmZvLmZpbGUpKTtcbiAgICAvLyBDb25jYXQgbmV3IGZpbGVzIHdpdGggcHJldiBmaWxlc1xuICAgIGxldCBuZXdGaWxlTGlzdCA9IF90b0NvbnN1bWFibGVBcnJheShtZXJnZWRGaWxlTGlzdCk7XG4gICAgb2JqZWN0RmlsZUxpc3QuZm9yRWFjaChmaWxlT2JqID0+IHtcbiAgICAgIC8vIFJlcGxhY2UgZmlsZSBpZiBleGlzdFxuICAgICAgbmV3RmlsZUxpc3QgPSB1cGRhdGVGaWxlTGlzdChmaWxlT2JqLCBuZXdGaWxlTGlzdCk7XG4gICAgfSk7XG4gICAgb2JqZWN0RmlsZUxpc3QuZm9yRWFjaCgoZmlsZU9iaiwgaW5kZXgpID0+IHtcbiAgICAgIC8vIFJlcGVhdCB0cmlnZ2VyIGBvbkNoYW5nZWAgZXZlbnQgZm9yIGNvbXBhdGlibGVcbiAgICAgIGxldCB0cmlnZ2VyRmlsZU9iaiA9IGZpbGVPYmo7XG4gICAgICBpZiAoIWZpbHRlcmVkRmlsZUluZm9MaXN0W2luZGV4XS5wYXJzZWRGaWxlKSB7XG4gICAgICAgIC8vIGBiZWZvcmVVcGxvYWRgIHJldHVybiBmYWxzZVxuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgb3JpZ2luRmlsZU9ialxuICAgICAgICB9ID0gZmlsZU9iajtcbiAgICAgICAgbGV0IGNsb25lO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNsb25lID0gbmV3IEZpbGUoW29yaWdpbkZpbGVPYmpdLCBvcmlnaW5GaWxlT2JqLm5hbWUsIHtcbiAgICAgICAgICAgIHR5cGU6IG9yaWdpbkZpbGVPYmoudHlwZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChfYSkge1xuICAgICAgICAgIGNsb25lID0gbmV3IEJsb2IoW29yaWdpbkZpbGVPYmpdLCB7XG4gICAgICAgICAgICB0eXBlOiBvcmlnaW5GaWxlT2JqLnR5cGVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjbG9uZS5uYW1lID0gb3JpZ2luRmlsZU9iai5uYW1lO1xuICAgICAgICAgIGNsb25lLmxhc3RNb2RpZmllZERhdGUgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgIGNsb25lLmxhc3RNb2RpZmllZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNsb25lLnVpZCA9IGZpbGVPYmoudWlkO1xuICAgICAgICB0cmlnZ2VyRmlsZU9iaiA9IGNsb25lO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSW5qZWN0IGB1cGxvYWRpbmdgIHN0YXR1c1xuICAgICAgICBmaWxlT2JqLnN0YXR1cyA9ICd1cGxvYWRpbmcnO1xuICAgICAgfVxuICAgICAgb25JbnRlcm5hbENoYW5nZSh0cmlnZ2VyRmlsZU9iaiwgbmV3RmlsZUxpc3QpO1xuICAgIH0pO1xuICB9O1xuICBjb25zdCBvblN1Y2Nlc3MgPSAocmVzcG9uc2UsIGZpbGUsIHhocikgPT4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAodHlwZW9mIHJlc3BvbnNlID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS9ub1BhcmFtZXRlckFzc2lnbjogd2UgbmVlZCB0byBtb2RpZnkgcmVzcG9uc2VcbiAgICAgICAgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHJlc3BvbnNlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChfYSkge1xuICAgICAgLyogZG8gbm90aGluZyAqL1xuICAgIH1cbiAgICAvLyByZW1vdmVkXG4gICAgaWYgKCFnZXRGaWxlSXRlbShmaWxlLCBtZXJnZWRGaWxlTGlzdCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0SXRlbSA9IGZpbGUyT2JqKGZpbGUpO1xuICAgIHRhcmdldEl0ZW0uc3RhdHVzID0gJ2RvbmUnO1xuICAgIHRhcmdldEl0ZW0ucGVyY2VudCA9IDEwMDtcbiAgICB0YXJnZXRJdGVtLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgdGFyZ2V0SXRlbS54aHIgPSB4aHI7XG4gICAgY29uc3QgbmV4dEZpbGVMaXN0ID0gdXBkYXRlRmlsZUxpc3QodGFyZ2V0SXRlbSwgbWVyZ2VkRmlsZUxpc3QpO1xuICAgIG9uSW50ZXJuYWxDaGFuZ2UodGFyZ2V0SXRlbSwgbmV4dEZpbGVMaXN0KTtcbiAgfTtcbiAgY29uc3Qgb25Qcm9ncmVzcyA9IChlLCBmaWxlKSA9PiB7XG4gICAgLy8gcmVtb3ZlZFxuICAgIGlmICghZ2V0RmlsZUl0ZW0oZmlsZSwgbWVyZ2VkRmlsZUxpc3QpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldEl0ZW0gPSBmaWxlMk9iaihmaWxlKTtcbiAgICB0YXJnZXRJdGVtLnN0YXR1cyA9ICd1cGxvYWRpbmcnO1xuICAgIHRhcmdldEl0ZW0ucGVyY2VudCA9IGUucGVyY2VudDtcbiAgICBjb25zdCBuZXh0RmlsZUxpc3QgPSB1cGRhdGVGaWxlTGlzdCh0YXJnZXRJdGVtLCBtZXJnZWRGaWxlTGlzdCk7XG4gICAgb25JbnRlcm5hbENoYW5nZSh0YXJnZXRJdGVtLCBuZXh0RmlsZUxpc3QsIGUpO1xuICB9O1xuICBjb25zdCBvbkVycm9yID0gKGVycm9yLCByZXNwb25zZSwgZmlsZSkgPT4ge1xuICAgIC8vIHJlbW92ZWRcbiAgICBpZiAoIWdldEZpbGVJdGVtKGZpbGUsIG1lcmdlZEZpbGVMaXN0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXRJdGVtID0gZmlsZTJPYmooZmlsZSk7XG4gICAgdGFyZ2V0SXRlbS5lcnJvciA9IGVycm9yO1xuICAgIHRhcmdldEl0ZW0ucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICB0YXJnZXRJdGVtLnN0YXR1cyA9ICdlcnJvcic7XG4gICAgY29uc3QgbmV4dEZpbGVMaXN0ID0gdXBkYXRlRmlsZUxpc3QodGFyZ2V0SXRlbSwgbWVyZ2VkRmlsZUxpc3QpO1xuICAgIG9uSW50ZXJuYWxDaGFuZ2UodGFyZ2V0SXRlbSwgbmV4dEZpbGVMaXN0KTtcbiAgfTtcbiAgY29uc3QgaGFuZGxlUmVtb3ZlID0gZmlsZSA9PiB7XG4gICAgbGV0IGN1cnJlbnRGaWxlO1xuICAgIFByb21pc2UucmVzb2x2ZSh0eXBlb2Ygb25SZW1vdmUgPT09ICdmdW5jdGlvbicgPyBvblJlbW92ZShmaWxlKSA6IG9uUmVtb3ZlKS50aGVuKHJldCA9PiB7XG4gICAgICB2YXIgX2E7XG4gICAgICAvLyBQcmV2ZW50IHJlbW92aW5nIGZpbGVcbiAgICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlbW92ZWRGaWxlTGlzdCA9IHJlbW92ZUZpbGVJdGVtKGZpbGUsIG1lcmdlZEZpbGVMaXN0KTtcbiAgICAgIGlmIChyZW1vdmVkRmlsZUxpc3QpIHtcbiAgICAgICAgY3VycmVudEZpbGUgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGZpbGUpLCB7XG4gICAgICAgICAgc3RhdHVzOiAncmVtb3ZlZCdcbiAgICAgICAgfSk7XG4gICAgICAgIG1lcmdlZEZpbGVMaXN0ID09PSBudWxsIHx8IG1lcmdlZEZpbGVMaXN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtZXJnZWRGaWxlTGlzdC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgIGNvbnN0IG1hdGNoS2V5ID0gY3VycmVudEZpbGUudWlkICE9PSB1bmRlZmluZWQgPyAndWlkJyA6ICduYW1lJztcbiAgICAgICAgICBpZiAoaXRlbVttYXRjaEtleV0gPT09IGN1cnJlbnRGaWxlW21hdGNoS2V5XSAmJiAhT2JqZWN0LmlzRnJvemVuKGl0ZW0pKSB7XG4gICAgICAgICAgICBpdGVtLnN0YXR1cyA9ICdyZW1vdmVkJztcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAoX2EgPSB1cGxvYWQuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFib3J0KGN1cnJlbnRGaWxlKTtcbiAgICAgICAgb25JbnRlcm5hbENoYW5nZShjdXJyZW50RmlsZSwgcmVtb3ZlZEZpbGVMaXN0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgY29uc3Qgb25GaWxlRHJvcCA9IGUgPT4ge1xuICAgIHNldERyYWdTdGF0ZShlLnR5cGUpO1xuICAgIGlmIChlLnR5cGUgPT09ICdkcm9wJykge1xuICAgICAgb25Ecm9wID09PSBudWxsIHx8IG9uRHJvcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25Ecm9wKGUpO1xuICAgIH1cbiAgfTtcbiAgLy8gVGVzdCBuZWVkc1xuICBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgKCkgPT4gKHtcbiAgICBvbkJhdGNoU3RhcnQsXG4gICAgb25TdWNjZXNzLFxuICAgIG9uUHJvZ3Jlc3MsXG4gICAgb25FcnJvcixcbiAgICBmaWxlTGlzdDogbWVyZ2VkRmlsZUxpc3QsXG4gICAgdXBsb2FkOiB1cGxvYWQuY3VycmVudCxcbiAgICBuYXRpdmVFbGVtZW50OiB3cmFwUmVmLmN1cnJlbnRcbiAgfSkpO1xuICBjb25zdCB7XG4gICAgZ2V0UHJlZml4Q2xzLFxuICAgIGRpcmVjdGlvbixcbiAgICB1cGxvYWQ6IGN0eFVwbG9hZFxuICB9ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KTtcbiAgY29uc3QgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCd1cGxvYWQnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICBjb25zdCByY1VwbG9hZFByb3BzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHtcbiAgICBvbkJhdGNoU3RhcnQsXG4gICAgb25FcnJvcixcbiAgICBvblByb2dyZXNzLFxuICAgIG9uU3VjY2Vzc1xuICB9LCBwcm9wcyksIHtcbiAgICBkYXRhLFxuICAgIG11bHRpcGxlLFxuICAgIGFjdGlvbixcbiAgICBhY2NlcHQsXG4gICAgc3VwcG9ydFNlcnZlclJlbmRlcixcbiAgICBwcmVmaXhDbHMsXG4gICAgZGlzYWJsZWQ6IG1lcmdlZERpc2FibGVkLFxuICAgIGJlZm9yZVVwbG9hZDogbWVyZ2VkQmVmb3JlVXBsb2FkLFxuICAgIG9uQ2hhbmdlOiB1bmRlZmluZWQsXG4gICAgaGFzQ29udHJvbEluc2lkZVxuICB9KTtcbiAgZGVsZXRlIHJjVXBsb2FkUHJvcHMuY2xhc3NOYW1lO1xuICBkZWxldGUgcmNVcGxvYWRQcm9wcy5zdHlsZTtcbiAgLy8gUmVtb3ZlIGlkIHRvIGF2b2lkIG9wZW4gYnkgbGFiZWwgd2hlbiB0cmlnZ2VyIGlzIGhpZGRlblxuICAvLyAhY2hpbGRyZW46IGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzE0Mjk4XG4gIC8vIGRpc2FibGVkOiBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8xNjQ3OFxuICAvLyAgICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMjQxOTdcbiAgaWYgKCFjaGlsZHJlbiB8fCBtZXJnZWREaXNhYmxlZCkge1xuICAgIGRlbGV0ZSByY1VwbG9hZFByb3BzLmlkO1xuICB9XG4gIGNvbnN0IHdyYXBwZXJDbHMgPSBgJHtwcmVmaXhDbHN9LXdyYXBwZXJgO1xuICBjb25zdCBbd3JhcENTU1ZhciwgaGFzaElkLCBjc3NWYXJDbHNdID0gdXNlU3R5bGUocHJlZml4Q2xzLCB3cmFwcGVyQ2xzKTtcbiAgY29uc3QgW2NvbnRleHRMb2NhbGVdID0gdXNlTG9jYWxlKCdVcGxvYWQnLCBkZWZhdWx0TG9jYWxlLlVwbG9hZCk7XG4gIGNvbnN0IHtcbiAgICBzaG93UmVtb3ZlSWNvbixcbiAgICBzaG93UHJldmlld0ljb24sXG4gICAgc2hvd0Rvd25sb2FkSWNvbixcbiAgICByZW1vdmVJY29uLFxuICAgIHByZXZpZXdJY29uLFxuICAgIGRvd25sb2FkSWNvbixcbiAgICBleHRyYVxuICB9ID0gdHlwZW9mIHNob3dVcGxvYWRMaXN0ID09PSAnYm9vbGVhbicgPyB7fSA6IHNob3dVcGxvYWRMaXN0O1xuICAvLyB1c2Ugc2hvd1JlbW92ZUljb24gaWYgaXQgaXMgc3BlY2lmaWVkIGV4cGxpY2l0bHlcbiAgY29uc3QgcmVhbFNob3dSZW1vdmVJY29uID0gdHlwZW9mIHNob3dSZW1vdmVJY29uID09PSAndW5kZWZpbmVkJyA/ICFtZXJnZWREaXNhYmxlZCA6IHNob3dSZW1vdmVJY29uO1xuICBjb25zdCByZW5kZXJVcGxvYWRMaXN0ID0gKGJ1dHRvbiwgYnV0dG9uVmlzaWJsZSkgPT4ge1xuICAgIGlmICghc2hvd1VwbG9hZExpc3QpIHtcbiAgICAgIHJldHVybiBidXR0b247XG4gICAgfVxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChVcGxvYWRMaXN0LCB7XG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgIGxpc3RUeXBlOiBsaXN0VHlwZSxcbiAgICAgIGl0ZW1zOiBtZXJnZWRGaWxlTGlzdCxcbiAgICAgIHByZXZpZXdGaWxlOiBwcmV2aWV3RmlsZSxcbiAgICAgIG9uUHJldmlldzogb25QcmV2aWV3LFxuICAgICAgb25Eb3dubG9hZDogb25Eb3dubG9hZCxcbiAgICAgIG9uUmVtb3ZlOiBoYW5kbGVSZW1vdmUsXG4gICAgICBzaG93UmVtb3ZlSWNvbjogcmVhbFNob3dSZW1vdmVJY29uLFxuICAgICAgc2hvd1ByZXZpZXdJY29uOiBzaG93UHJldmlld0ljb24sXG4gICAgICBzaG93RG93bmxvYWRJY29uOiBzaG93RG93bmxvYWRJY29uLFxuICAgICAgcmVtb3ZlSWNvbjogcmVtb3ZlSWNvbixcbiAgICAgIHByZXZpZXdJY29uOiBwcmV2aWV3SWNvbixcbiAgICAgIGRvd25sb2FkSWNvbjogZG93bmxvYWRJY29uLFxuICAgICAgaWNvblJlbmRlcjogaWNvblJlbmRlcixcbiAgICAgIGV4dHJhOiBleHRyYSxcbiAgICAgIGxvY2FsZTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjb250ZXh0TG9jYWxlKSwgcHJvcExvY2FsZSksXG4gICAgICBpc0ltYWdlVXJsOiBpc0ltYWdlVXJsLFxuICAgICAgcHJvZ3Jlc3M6IHByb2dyZXNzLFxuICAgICAgYXBwZW5kQWN0aW9uOiBidXR0b24sXG4gICAgICBhcHBlbmRBY3Rpb25WaXNpYmxlOiBidXR0b25WaXNpYmxlLFxuICAgICAgaXRlbVJlbmRlcjogaXRlbVJlbmRlcixcbiAgICAgIGRpc2FibGVkOiBtZXJnZWREaXNhYmxlZFxuICAgIH0pO1xuICB9O1xuICBjb25zdCBtZXJnZWRDbHMgPSBjbGFzc05hbWVzKHdyYXBwZXJDbHMsIGNsYXNzTmFtZSwgcm9vdENsYXNzTmFtZSwgaGFzaElkLCBjc3NWYXJDbHMsIGN0eFVwbG9hZCA9PT0gbnVsbCB8fCBjdHhVcGxvYWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGN0eFVwbG9hZC5jbGFzc05hbWUsIHtcbiAgICBbYCR7cHJlZml4Q2xzfS1ydGxgXTogZGlyZWN0aW9uID09PSAncnRsJyxcbiAgICBbYCR7cHJlZml4Q2xzfS1waWN0dXJlLWNhcmQtd3JhcHBlcmBdOiBsaXN0VHlwZSA9PT0gJ3BpY3R1cmUtY2FyZCcsXG4gICAgW2Ake3ByZWZpeENsc30tcGljdHVyZS1jaXJjbGUtd3JhcHBlcmBdOiBsaXN0VHlwZSA9PT0gJ3BpY3R1cmUtY2lyY2xlJ1xuICB9KTtcbiAgY29uc3QgbWVyZ2VkU3R5bGUgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGN0eFVwbG9hZCA9PT0gbnVsbCB8fCBjdHhVcGxvYWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGN0eFVwbG9hZC5zdHlsZSksIHN0eWxlKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgaWYgKHR5cGUgPT09ICdkcmFnJykge1xuICAgIGNvbnN0IGRyYWdDbHMgPSBjbGFzc05hbWVzKGhhc2hJZCwgcHJlZml4Q2xzLCBgJHtwcmVmaXhDbHN9LWRyYWdgLCB7XG4gICAgICBbYCR7cHJlZml4Q2xzfS1kcmFnLXVwbG9hZGluZ2BdOiBtZXJnZWRGaWxlTGlzdC5zb21lKGZpbGUgPT4gZmlsZS5zdGF0dXMgPT09ICd1cGxvYWRpbmcnKSxcbiAgICAgIFtgJHtwcmVmaXhDbHN9LWRyYWctaG92ZXJgXTogZHJhZ1N0YXRlID09PSAnZHJhZ292ZXInLFxuICAgICAgW2Ake3ByZWZpeENsc30tZGlzYWJsZWRgXTogbWVyZ2VkRGlzYWJsZWQsXG4gICAgICBbYCR7cHJlZml4Q2xzfS1ydGxgXTogZGlyZWN0aW9uID09PSAncnRsJ1xuICAgIH0pO1xuICAgIHJldHVybiB3cmFwQ1NTVmFyKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IG1lcmdlZENscyxcbiAgICAgIHJlZjogd3JhcFJlZlxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogZHJhZ0NscyxcbiAgICAgIHN0eWxlOiBtZXJnZWRTdHlsZSxcbiAgICAgIG9uRHJvcDogb25GaWxlRHJvcCxcbiAgICAgIG9uRHJhZ092ZXI6IG9uRmlsZURyb3AsXG4gICAgICBvbkRyYWdMZWF2ZTogb25GaWxlRHJvcFxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJjVXBsb2FkLCBPYmplY3QuYXNzaWduKHt9LCByY1VwbG9hZFByb3BzLCB7XG4gICAgICByZWY6IHVwbG9hZCxcbiAgICAgIGNsYXNzTmFtZTogYCR7cHJlZml4Q2xzfS1idG5gXG4gICAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogYCR7cHJlZml4Q2xzfS1kcmFnLWNvbnRhaW5lcmBcbiAgICB9LCBjaGlsZHJlbikpKSwgcmVuZGVyVXBsb2FkTGlzdCgpKSk7XG4gIH1cbiAgY29uc3QgdXBsb2FkQnRuQ2xzID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIGAke3ByZWZpeENsc30tc2VsZWN0YCwge1xuICAgIFtgJHtwcmVmaXhDbHN9LWRpc2FibGVkYF06IG1lcmdlZERpc2FibGVkLFxuICAgIFtgJHtwcmVmaXhDbHN9LWhpZGRlbmBdOiAhY2hpbGRyZW5cbiAgfSk7XG4gIGNvbnN0IHVwbG9hZEJ1dHRvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IHVwbG9hZEJ0bkNsc1xuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSY1VwbG9hZCwgT2JqZWN0LmFzc2lnbih7fSwgcmNVcGxvYWRQcm9wcywge1xuICAgIHJlZjogdXBsb2FkXG4gIH0pKSk7XG4gIGlmIChsaXN0VHlwZSA9PT0gJ3BpY3R1cmUtY2FyZCcgfHwgbGlzdFR5cGUgPT09ICdwaWN0dXJlLWNpcmNsZScpIHtcbiAgICByZXR1cm4gd3JhcENTU1ZhcigvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBtZXJnZWRDbHMsXG4gICAgICByZWY6IHdyYXBSZWZcbiAgICB9LCByZW5kZXJVcGxvYWRMaXN0KHVwbG9hZEJ1dHRvbiwgISFjaGlsZHJlbikpKTtcbiAgfVxuICByZXR1cm4gd3JhcENTU1ZhcigvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogbWVyZ2VkQ2xzLFxuICAgIHJlZjogd3JhcFJlZlxuICB9LCB1cGxvYWRCdXR0b24sIHJlbmRlclVwbG9hZExpc3QoKSkpO1xufTtcbmNvbnN0IFVwbG9hZCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKEludGVybmFsVXBsb2FkKTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFVwbG9hZC5kaXNwbGF5TmFtZSA9ICdVcGxvYWQnO1xufVxuZXhwb3J0IGRlZmF1bHQgVXBsb2FkOyIsICJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2Fzc2VydFRoaXNJbml0aWFsaXplZFwiO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNcIjtcbmltcG9ydCBfY3JlYXRlU3VwZXIgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZVN1cGVyXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuLyogZXNsaW50IHJlYWN0L3Byb3AtdHlwZXM6MCAqL1xuaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBBamF4VXBsb2FkIGZyb20gXCIuL0FqYXhVcGxvYWRlclwiO1xuZnVuY3Rpb24gZW1wdHkoKSB7fVxudmFyIFVwbG9hZCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoVXBsb2FkLCBfQ29tcG9uZW50KTtcbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihVcGxvYWQpO1xuICBmdW5jdGlvbiBVcGxvYWQoKSB7XG4gICAgdmFyIF90aGlzO1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBVcGxvYWQpO1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbC5hcHBseShfc3VwZXIsIFt0aGlzXS5jb25jYXQoYXJncykpO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJ1cGxvYWRlclwiLCB2b2lkIDApO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJzYXZlVXBsb2FkZXJcIiwgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIF90aGlzLnVwbG9hZGVyID0gbm9kZTtcbiAgICB9KTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgX2NyZWF0ZUNsYXNzKFVwbG9hZCwgW3tcbiAgICBrZXk6IFwiYWJvcnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWJvcnQoZmlsZSkge1xuICAgICAgdGhpcy51cGxvYWRlci5hYm9ydChmaWxlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBamF4VXBsb2FkLCBfZXh0ZW5kcyh7fSwgdGhpcy5wcm9wcywge1xuICAgICAgICByZWY6IHRoaXMuc2F2ZVVwbG9hZGVyXG4gICAgICB9KSk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBVcGxvYWQ7XG59KENvbXBvbmVudCk7XG5fZGVmaW5lUHJvcGVydHkoVXBsb2FkLCBcImRlZmF1bHRQcm9wc1wiLCB7XG4gIGNvbXBvbmVudDogJ3NwYW4nLFxuICBwcmVmaXhDbHM6ICdyYy11cGxvYWQnLFxuICBkYXRhOiB7fSxcbiAgaGVhZGVyczoge30sXG4gIG5hbWU6ICdmaWxlJyxcbiAgbXVsdGlwYXJ0OiBmYWxzZSxcbiAgb25TdGFydDogZW1wdHksXG4gIG9uRXJyb3I6IGVtcHR5LFxuICBvblN1Y2Nlc3M6IGVtcHR5LFxuICBtdWx0aXBsZTogZmFsc2UsXG4gIGJlZm9yZVVwbG9hZDogbnVsbCxcbiAgY3VzdG9tUmVxdWVzdDogbnVsbCxcbiAgd2l0aENyZWRlbnRpYWxzOiBmYWxzZSxcbiAgb3BlbkZpbGVEaWFsb2dPbkNsaWNrOiB0cnVlLFxuICBoYXNDb250cm9sSW5zaWRlOiBmYWxzZVxufSk7XG5leHBvcnQgZGVmYXVsdCBVcGxvYWQ7IiwgImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX3JlZ2VuZXJhdG9yUnVudGltZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vcmVnZW5lcmF0b3JSdW50aW1lXCI7XG5pbXBvcnQgX2FzeW5jVG9HZW5lcmF0b3IgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2FzeW5jVG9HZW5lcmF0b3JcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3NlcnRUaGlzSW5pdGlhbGl6ZWRcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzXCI7XG5pbXBvcnQgX2NyZWF0ZVN1cGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVTdXBlclwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJjb21wb25lbnRcIiwgXCJwcmVmaXhDbHNcIiwgXCJjbGFzc05hbWVcIiwgXCJjbGFzc05hbWVzXCIsIFwiZGlzYWJsZWRcIiwgXCJpZFwiLCBcIm5hbWVcIiwgXCJzdHlsZVwiLCBcInN0eWxlc1wiLCBcIm11bHRpcGxlXCIsIFwiYWNjZXB0XCIsIFwiY2FwdHVyZVwiLCBcImNoaWxkcmVuXCIsIFwiZGlyZWN0b3J5XCIsIFwib3BlbkZpbGVEaWFsb2dPbkNsaWNrXCIsIFwib25Nb3VzZUVudGVyXCIsIFwib25Nb3VzZUxlYXZlXCIsIFwiaGFzQ29udHJvbEluc2lkZVwiXTtcbi8qIGVzbGludCByZWFjdC9uby1pcy1tb3VudGVkOjAscmVhY3Qvc29ydC1jb21wOjAscmVhY3QvcHJvcC10eXBlczowICovXG5pbXBvcnQgY2xzeCBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBwaWNrQXR0cnMgZnJvbSBcInJjLXV0aWwvZXMvcGlja0F0dHJzXCI7XG5pbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGF0dHJBY2NlcHQgZnJvbSBcIi4vYXR0ci1hY2NlcHRcIjtcbmltcG9ydCBkZWZhdWx0UmVxdWVzdCBmcm9tIFwiLi9yZXF1ZXN0XCI7XG5pbXBvcnQgdHJhdmVyc2VGaWxlVHJlZSBmcm9tIFwiLi90cmF2ZXJzZUZpbGVUcmVlXCI7XG5pbXBvcnQgZ2V0VWlkIGZyb20gXCIuL3VpZFwiO1xudmFyIEFqYXhVcGxvYWRlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoQWpheFVwbG9hZGVyLCBfQ29tcG9uZW50KTtcbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihBamF4VXBsb2FkZXIpO1xuICBmdW5jdGlvbiBBamF4VXBsb2FkZXIoKSB7XG4gICAgdmFyIF90aGlzO1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBamF4VXBsb2FkZXIpO1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbC5hcHBseShfc3VwZXIsIFt0aGlzXS5jb25jYXQoYXJncykpO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJzdGF0ZVwiLCB7XG4gICAgICB1aWQ6IGdldFVpZCgpXG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInJlcXNcIiwge30pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJmaWxlSW5wdXRcIiwgdm9pZCAwKTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiX2lzTW91bnRlZFwiLCB2b2lkIDApO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvbkNoYW5nZVwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMsXG4gICAgICAgIGFjY2VwdCA9IF90aGlzJHByb3BzLmFjY2VwdCxcbiAgICAgICAgZGlyZWN0b3J5ID0gX3RoaXMkcHJvcHMuZGlyZWN0b3J5O1xuICAgICAgdmFyIGZpbGVzID0gZS50YXJnZXQuZmlsZXM7XG4gICAgICB2YXIgYWNjZXB0ZWRGaWxlcyA9IF90b0NvbnN1bWFibGVBcnJheShmaWxlcykuZmlsdGVyKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgIHJldHVybiAhZGlyZWN0b3J5IHx8IGF0dHJBY2NlcHQoZmlsZSwgYWNjZXB0KTtcbiAgICAgIH0pO1xuICAgICAgX3RoaXMudXBsb2FkRmlsZXMoYWNjZXB0ZWRGaWxlcyk7XG4gICAgICBfdGhpcy5yZXNldCgpO1xuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvbkNsaWNrXCIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgdmFyIGVsID0gX3RoaXMuZmlsZUlucHV0O1xuICAgICAgaWYgKCFlbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgdmFyIG9uQ2xpY2sgPSBfdGhpcy5wcm9wcy5vbkNsaWNrO1xuICAgICAgaWYgKHRhcmdldCAmJiB0YXJnZXQudGFnTmFtZSA9PT0gJ0JVVFRPTicpIHtcbiAgICAgICAgdmFyIHBhcmVudCA9IGVsLnBhcmVudE5vZGU7XG4gICAgICAgIHBhcmVudC5mb2N1cygpO1xuICAgICAgICB0YXJnZXQuYmx1cigpO1xuICAgICAgfVxuICAgICAgZWwuY2xpY2soKTtcbiAgICAgIGlmIChvbkNsaWNrKSB7XG4gICAgICAgIG9uQ2xpY2soZXZlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvbktleURvd25cIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgICBfdGhpcy5vbkNsaWNrKGUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvbkZpbGVEcm9wXCIsIC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3JlZiA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZSgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZShlKSB7XG4gICAgICAgIHZhciBtdWx0aXBsZSwgZmlsZXMsIF9maWxlcztcbiAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgbXVsdGlwbGUgPSBfdGhpcy5wcm9wcy5tdWx0aXBsZTtcbiAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICBpZiAoIShlLnR5cGUgPT09ICdkcmFnb3ZlcicpKSB7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdChcInJldHVyblwiKTtcbiAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgaWYgKCFfdGhpcy5wcm9wcy5kaXJlY3RvcnkpIHtcbiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDc7XG4gICAgICAgICAgICAgIHJldHVybiB0cmF2ZXJzZUZpbGVUcmVlKEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUuZGF0YVRyYW5zZmVyLml0ZW1zKSwgZnVuY3Rpb24gKF9maWxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF0dHJBY2NlcHQoX2ZpbGUsIF90aGlzLnByb3BzLmFjY2VwdCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICBmaWxlcyA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgICAgIF90aGlzLnVwbG9hZEZpbGVzKGZpbGVzKTtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE0O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgIF9maWxlcyA9IF90b0NvbnN1bWFibGVBcnJheShlLmRhdGFUcmFuc2Zlci5maWxlcykuZmlsdGVyKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF0dHJBY2NlcHQoZmlsZSwgX3RoaXMucHJvcHMuYWNjZXB0KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGlmIChtdWx0aXBsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBfZmlsZXMgPSBfZmlsZXMuc2xpY2UoMCwgMSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgX3RoaXMudXBsb2FkRmlsZXMoX2ZpbGVzKTtcbiAgICAgICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBfY2FsbGVlKTtcbiAgICAgIH0pKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoX3gpIHtcbiAgICAgICAgcmV0dXJuIF9yZWYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgfSgpKTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwidXBsb2FkRmlsZXNcIiwgZnVuY3Rpb24gKGZpbGVzKSB7XG4gICAgICB2YXIgb3JpZ2luRmlsZXMgPSBfdG9Db25zdW1hYmxlQXJyYXkoZmlsZXMpO1xuICAgICAgdmFyIHBvc3RGaWxlcyA9IG9yaWdpbkZpbGVzLm1hcChmdW5jdGlvbiAoZmlsZSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgZmlsZS51aWQgPSBnZXRVaWQoKTtcbiAgICAgICAgcmV0dXJuIF90aGlzLnByb2Nlc3NGaWxlKGZpbGUsIG9yaWdpbkZpbGVzKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBCYXRjaCB1cGxvYWQgZmlsZXNcbiAgICAgIFByb21pc2UuYWxsKHBvc3RGaWxlcykudGhlbihmdW5jdGlvbiAoZmlsZUxpc3QpIHtcbiAgICAgICAgdmFyIG9uQmF0Y2hTdGFydCA9IF90aGlzLnByb3BzLm9uQmF0Y2hTdGFydDtcbiAgICAgICAgb25CYXRjaFN0YXJ0ID09PSBudWxsIHx8IG9uQmF0Y2hTdGFydCA9PT0gdm9pZCAwIHx8IG9uQmF0Y2hTdGFydChmaWxlTGlzdC5tYXAoZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgICAgICAgdmFyIG9yaWdpbiA9IF9yZWYyLm9yaWdpbixcbiAgICAgICAgICAgIHBhcnNlZEZpbGUgPSBfcmVmMi5wYXJzZWRGaWxlO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmaWxlOiBvcmlnaW4sXG4gICAgICAgICAgICBwYXJzZWRGaWxlOiBwYXJzZWRGaWxlXG4gICAgICAgICAgfTtcbiAgICAgICAgfSkpO1xuICAgICAgICBmaWxlTGlzdC5maWx0ZXIoZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgICAgICByZXR1cm4gZmlsZS5wYXJzZWRGaWxlICE9PSBudWxsO1xuICAgICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgICAgX3RoaXMucG9zdChmaWxlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICAvKipcbiAgICAgKiBQcm9jZXNzIGZpbGUgYmVmb3JlIHVwbG9hZC4gV2hlbiBhbGwgdGhlIGZpbGUgaXMgcmVhZHksIHdlIHN0YXJ0IHVwbG9hZC5cbiAgICAgKi9cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwicHJvY2Vzc0ZpbGVcIiwgLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfcmVmMyA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZSgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIoZmlsZSwgZmlsZUxpc3QpIHtcbiAgICAgICAgdmFyIGJlZm9yZVVwbG9hZCwgdHJhbnNmb3JtZWRGaWxlLCBhY3Rpb24sIG1lcmdlZEFjdGlvbiwgZGF0YSwgbWVyZ2VkRGF0YSwgcGFyc2VkRGF0YSwgcGFyc2VkRmlsZSwgbWVyZ2VkUGFyc2VkRmlsZTtcbiAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHtcbiAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIGJlZm9yZVVwbG9hZCA9IF90aGlzLnByb3BzLmJlZm9yZVVwbG9hZDtcbiAgICAgICAgICAgICAgdHJhbnNmb3JtZWRGaWxlID0gZmlsZTtcbiAgICAgICAgICAgICAgaWYgKCFiZWZvcmVVcGxvYWQpIHtcbiAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDE0O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIF9jb250ZXh0Mi5wcmV2ID0gMztcbiAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA2O1xuICAgICAgICAgICAgICByZXR1cm4gYmVmb3JlVXBsb2FkKGZpbGUsIGZpbGVMaXN0KTtcbiAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgdHJhbnNmb3JtZWRGaWxlID0gX2NvbnRleHQyLnNlbnQ7XG4gICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICBfY29udGV4dDIucHJldiA9IDk7XG4gICAgICAgICAgICAgIF9jb250ZXh0Mi50MCA9IF9jb250ZXh0MltcImNhdGNoXCJdKDMpO1xuICAgICAgICAgICAgICAvLyBSZWplY3Rpb24gd2lsbCBhbHNvIHRyYWRlIGFzIGZhbHNlXG4gICAgICAgICAgICAgIHRyYW5zZm9ybWVkRmlsZSA9IGZhbHNlO1xuICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgaWYgKCEodHJhbnNmb3JtZWRGaWxlID09PSBmYWxzZSkpIHtcbiAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDE0O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KFwicmV0dXJuXCIsIHtcbiAgICAgICAgICAgICAgICBvcmlnaW46IGZpbGUsXG4gICAgICAgICAgICAgICAgcGFyc2VkRmlsZTogbnVsbCxcbiAgICAgICAgICAgICAgICBhY3Rpb246IG51bGwsXG4gICAgICAgICAgICAgICAgZGF0YTogbnVsbFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgICAgIC8vIEdldCBsYXRlc3QgYWN0aW9uXG4gICAgICAgICAgICAgIGFjdGlvbiA9IF90aGlzLnByb3BzLmFjdGlvbjtcbiAgICAgICAgICAgICAgaWYgKCEodHlwZW9mIGFjdGlvbiA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDIxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTg7XG4gICAgICAgICAgICAgIHJldHVybiBhY3Rpb24oZmlsZSk7XG4gICAgICAgICAgICBjYXNlIDE4OlxuICAgICAgICAgICAgICBtZXJnZWRBY3Rpb24gPSBfY29udGV4dDIuc2VudDtcbiAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyMjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDIxOlxuICAgICAgICAgICAgICBtZXJnZWRBY3Rpb24gPSBhY3Rpb247XG4gICAgICAgICAgICBjYXNlIDIyOlxuICAgICAgICAgICAgICAvLyBHZXQgbGF0ZXN0IGRhdGFcbiAgICAgICAgICAgICAgZGF0YSA9IF90aGlzLnByb3BzLmRhdGE7XG4gICAgICAgICAgICAgIGlmICghKHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyNjtcbiAgICAgICAgICAgICAgcmV0dXJuIGRhdGEoZmlsZSk7XG4gICAgICAgICAgICBjYXNlIDI2OlxuICAgICAgICAgICAgICBtZXJnZWREYXRhID0gX2NvbnRleHQyLnNlbnQ7XG4gICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMzA7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAyOTpcbiAgICAgICAgICAgICAgbWVyZ2VkRGF0YSA9IGRhdGE7XG4gICAgICAgICAgICBjYXNlIDMwOlxuICAgICAgICAgICAgICBwYXJzZWREYXRhID1cbiAgICAgICAgICAgICAgLy8gc3RyaW5nIHR5cGUgaXMgZnJvbSBsZWdhY3kgYHRyYW5zZm9ybUZpbGVgLlxuICAgICAgICAgICAgICAvLyBOb3Qgc3VyZSBpZiB0aGlzIHdpbGwgd29yayBzaW5jZSBubyByZWxhdGVkIHRlc3QgY2FzZSB3b3JrcyB3aXRoIGl0XG4gICAgICAgICAgICAgIChfdHlwZW9mKHRyYW5zZm9ybWVkRmlsZSkgPT09ICdvYmplY3QnIHx8IHR5cGVvZiB0cmFuc2Zvcm1lZEZpbGUgPT09ICdzdHJpbmcnKSAmJiB0cmFuc2Zvcm1lZEZpbGUgPyB0cmFuc2Zvcm1lZEZpbGUgOiBmaWxlO1xuICAgICAgICAgICAgICBpZiAocGFyc2VkRGF0YSBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgICAgICAgICAgICBwYXJzZWRGaWxlID0gcGFyc2VkRGF0YTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwYXJzZWRGaWxlID0gbmV3IEZpbGUoW3BhcnNlZERhdGFdLCBmaWxlLm5hbWUsIHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IGZpbGUudHlwZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG1lcmdlZFBhcnNlZEZpbGUgPSBwYXJzZWRGaWxlO1xuICAgICAgICAgICAgICBtZXJnZWRQYXJzZWRGaWxlLnVpZCA9IGZpbGUudWlkO1xuICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdChcInJldHVyblwiLCB7XG4gICAgICAgICAgICAgICAgb3JpZ2luOiBmaWxlLFxuICAgICAgICAgICAgICAgIGRhdGE6IG1lcmdlZERhdGEsXG4gICAgICAgICAgICAgICAgcGFyc2VkRmlsZTogbWVyZ2VkUGFyc2VkRmlsZSxcbiAgICAgICAgICAgICAgICBhY3Rpb246IG1lcmdlZEFjdGlvblxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNhc2UgMzU6XG4gICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuc3RvcCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgX2NhbGxlZTIsIG51bGwsIFtbMywgOV1dKTtcbiAgICAgIH0pKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoX3gyLCBfeDMpIHtcbiAgICAgICAgcmV0dXJuIF9yZWYzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgIH0oKSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInNhdmVGaWxlSW5wdXRcIiwgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIF90aGlzLmZpbGVJbnB1dCA9IG5vZGU7XG4gICAgfSk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIF9jcmVhdGVDbGFzcyhBamF4VXBsb2FkZXIsIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdGhpcy5faXNNb3VudGVkID0gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50V2lsbFVubW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICB0aGlzLl9pc01vdW50ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuYWJvcnQoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicG9zdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwb3N0KF9yZWY0KSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcbiAgICAgIHZhciBkYXRhID0gX3JlZjQuZGF0YSxcbiAgICAgICAgb3JpZ2luID0gX3JlZjQub3JpZ2luLFxuICAgICAgICBhY3Rpb24gPSBfcmVmNC5hY3Rpb24sXG4gICAgICAgIHBhcnNlZEZpbGUgPSBfcmVmNC5wYXJzZWRGaWxlO1xuICAgICAgaWYgKCF0aGlzLl9pc01vdW50ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIF90aGlzJHByb3BzMiA9IHRoaXMucHJvcHMsXG4gICAgICAgIG9uU3RhcnQgPSBfdGhpcyRwcm9wczIub25TdGFydCxcbiAgICAgICAgY3VzdG9tUmVxdWVzdCA9IF90aGlzJHByb3BzMi5jdXN0b21SZXF1ZXN0LFxuICAgICAgICBuYW1lID0gX3RoaXMkcHJvcHMyLm5hbWUsXG4gICAgICAgIGhlYWRlcnMgPSBfdGhpcyRwcm9wczIuaGVhZGVycyxcbiAgICAgICAgd2l0aENyZWRlbnRpYWxzID0gX3RoaXMkcHJvcHMyLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgbWV0aG9kID0gX3RoaXMkcHJvcHMyLm1ldGhvZDtcbiAgICAgIHZhciB1aWQgPSBvcmlnaW4udWlkO1xuICAgICAgdmFyIHJlcXVlc3QgPSBjdXN0b21SZXF1ZXN0IHx8IGRlZmF1bHRSZXF1ZXN0O1xuICAgICAgdmFyIHJlcXVlc3RPcHRpb24gPSB7XG4gICAgICAgIGFjdGlvbjogYWN0aW9uLFxuICAgICAgICBmaWxlbmFtZTogbmFtZSxcbiAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgZmlsZTogcGFyc2VkRmlsZSxcbiAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB3aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgIG1ldGhvZDogbWV0aG9kIHx8ICdwb3N0JyxcbiAgICAgICAgb25Qcm9ncmVzczogZnVuY3Rpb24gb25Qcm9ncmVzcyhlKSB7XG4gICAgICAgICAgdmFyIG9uUHJvZ3Jlc3MgPSBfdGhpczIucHJvcHMub25Qcm9ncmVzcztcbiAgICAgICAgICBvblByb2dyZXNzID09PSBudWxsIHx8IG9uUHJvZ3Jlc3MgPT09IHZvaWQgMCB8fCBvblByb2dyZXNzKGUsIHBhcnNlZEZpbGUpO1xuICAgICAgICB9LFxuICAgICAgICBvblN1Y2Nlc3M6IGZ1bmN0aW9uIG9uU3VjY2VzcyhyZXQsIHhocikge1xuICAgICAgICAgIHZhciBvblN1Y2Nlc3MgPSBfdGhpczIucHJvcHMub25TdWNjZXNzO1xuICAgICAgICAgIG9uU3VjY2VzcyA9PT0gbnVsbCB8fCBvblN1Y2Nlc3MgPT09IHZvaWQgMCB8fCBvblN1Y2Nlc3MocmV0LCBwYXJzZWRGaWxlLCB4aHIpO1xuICAgICAgICAgIGRlbGV0ZSBfdGhpczIucmVxc1t1aWRdO1xuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiBmdW5jdGlvbiBvbkVycm9yKGVyciwgcmV0KSB7XG4gICAgICAgICAgdmFyIG9uRXJyb3IgPSBfdGhpczIucHJvcHMub25FcnJvcjtcbiAgICAgICAgICBvbkVycm9yID09PSBudWxsIHx8IG9uRXJyb3IgPT09IHZvaWQgMCB8fCBvbkVycm9yKGVyciwgcmV0LCBwYXJzZWRGaWxlKTtcbiAgICAgICAgICBkZWxldGUgX3RoaXMyLnJlcXNbdWlkXTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIG9uU3RhcnQob3JpZ2luKTtcbiAgICAgIHRoaXMucmVxc1t1aWRdID0gcmVxdWVzdChyZXF1ZXN0T3B0aW9uKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVzZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgdWlkOiBnZXRVaWQoKVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFib3J0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFib3J0KGZpbGUpIHtcbiAgICAgIHZhciByZXFzID0gdGhpcy5yZXFzO1xuICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgdmFyIHVpZCA9IGZpbGUudWlkID8gZmlsZS51aWQgOiBmaWxlO1xuICAgICAgICBpZiAocmVxc1t1aWRdICYmIHJlcXNbdWlkXS5hYm9ydCkge1xuICAgICAgICAgIHJlcXNbdWlkXS5hYm9ydCgpO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSByZXFzW3VpZF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBPYmplY3Qua2V5cyhyZXFzKS5mb3JFYWNoKGZ1bmN0aW9uICh1aWQpIHtcbiAgICAgICAgICBpZiAocmVxc1t1aWRdICYmIHJlcXNbdWlkXS5hYm9ydCkge1xuICAgICAgICAgICAgcmVxc1t1aWRdLmFib3J0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlbGV0ZSByZXFzW3VpZF07XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzMyA9IHRoaXMucHJvcHMsXG4gICAgICAgIFRhZyA9IF90aGlzJHByb3BzMy5jb21wb25lbnQsXG4gICAgICAgIHByZWZpeENscyA9IF90aGlzJHByb3BzMy5wcmVmaXhDbHMsXG4gICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzMy5jbGFzc05hbWUsXG4gICAgICAgIF90aGlzJHByb3BzMyRjbGFzc05hbSA9IF90aGlzJHByb3BzMy5jbGFzc05hbWVzLFxuICAgICAgICBjbGFzc05hbWVzID0gX3RoaXMkcHJvcHMzJGNsYXNzTmFtID09PSB2b2lkIDAgPyB7fSA6IF90aGlzJHByb3BzMyRjbGFzc05hbSxcbiAgICAgICAgZGlzYWJsZWQgPSBfdGhpcyRwcm9wczMuZGlzYWJsZWQsXG4gICAgICAgIGlkID0gX3RoaXMkcHJvcHMzLmlkLFxuICAgICAgICBuYW1lID0gX3RoaXMkcHJvcHMzLm5hbWUsXG4gICAgICAgIHN0eWxlID0gX3RoaXMkcHJvcHMzLnN0eWxlLFxuICAgICAgICBfdGhpcyRwcm9wczMkc3R5bGVzID0gX3RoaXMkcHJvcHMzLnN0eWxlcyxcbiAgICAgICAgc3R5bGVzID0gX3RoaXMkcHJvcHMzJHN0eWxlcyA9PT0gdm9pZCAwID8ge30gOiBfdGhpcyRwcm9wczMkc3R5bGVzLFxuICAgICAgICBtdWx0aXBsZSA9IF90aGlzJHByb3BzMy5tdWx0aXBsZSxcbiAgICAgICAgYWNjZXB0ID0gX3RoaXMkcHJvcHMzLmFjY2VwdCxcbiAgICAgICAgY2FwdHVyZSA9IF90aGlzJHByb3BzMy5jYXB0dXJlLFxuICAgICAgICBjaGlsZHJlbiA9IF90aGlzJHByb3BzMy5jaGlsZHJlbixcbiAgICAgICAgZGlyZWN0b3J5ID0gX3RoaXMkcHJvcHMzLmRpcmVjdG9yeSxcbiAgICAgICAgb3BlbkZpbGVEaWFsb2dPbkNsaWNrID0gX3RoaXMkcHJvcHMzLm9wZW5GaWxlRGlhbG9nT25DbGljayxcbiAgICAgICAgb25Nb3VzZUVudGVyID0gX3RoaXMkcHJvcHMzLm9uTW91c2VFbnRlcixcbiAgICAgICAgb25Nb3VzZUxlYXZlID0gX3RoaXMkcHJvcHMzLm9uTW91c2VMZWF2ZSxcbiAgICAgICAgaGFzQ29udHJvbEluc2lkZSA9IF90aGlzJHByb3BzMy5oYXNDb250cm9sSW5zaWRlLFxuICAgICAgICBvdGhlclByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF90aGlzJHByb3BzMywgX2V4Y2x1ZGVkKTtcbiAgICAgIHZhciBjbHMgPSBjbHN4KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KHt9LCBwcmVmaXhDbHMsIHRydWUpLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRpc2FibGVkXCIpLCBkaXNhYmxlZCksIGNsYXNzTmFtZSwgY2xhc3NOYW1lKSk7XG4gICAgICAvLyBiZWNhdXNlIGlucHV0IGRvbid0IGhhdmUgZGlyZWN0b3J5L3dlYmtpdGRpcmVjdG9yeSB0eXBlIGRlY2xhcmF0aW9uXG4gICAgICB2YXIgZGlyUHJvcHMgPSBkaXJlY3RvcnkgPyB7XG4gICAgICAgIGRpcmVjdG9yeTogJ2RpcmVjdG9yeScsXG4gICAgICAgIHdlYmtpdGRpcmVjdG9yeTogJ3dlYmtpdGRpcmVjdG9yeSdcbiAgICAgIH0gOiB7fTtcbiAgICAgIHZhciBldmVudHMgPSBkaXNhYmxlZCA/IHt9IDoge1xuICAgICAgICBvbkNsaWNrOiBvcGVuRmlsZURpYWxvZ09uQ2xpY2sgPyB0aGlzLm9uQ2xpY2sgOiBmdW5jdGlvbiAoKSB7fSxcbiAgICAgICAgb25LZXlEb3duOiBvcGVuRmlsZURpYWxvZ09uQ2xpY2sgPyB0aGlzLm9uS2V5RG93biA6IGZ1bmN0aW9uICgpIHt9LFxuICAgICAgICBvbk1vdXNlRW50ZXI6IG9uTW91c2VFbnRlcixcbiAgICAgICAgb25Nb3VzZUxlYXZlOiBvbk1vdXNlTGVhdmUsXG4gICAgICAgIG9uRHJvcDogdGhpcy5vbkZpbGVEcm9wLFxuICAgICAgICBvbkRyYWdPdmVyOiB0aGlzLm9uRmlsZURyb3AsXG4gICAgICAgIHRhYkluZGV4OiBoYXNDb250cm9sSW5zaWRlID8gdW5kZWZpbmVkIDogJzAnXG4gICAgICB9O1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRhZywgX2V4dGVuZHMoe30sIGV2ZW50cywge1xuICAgICAgICBjbGFzc05hbWU6IGNscyxcbiAgICAgICAgcm9sZTogaGFzQ29udHJvbEluc2lkZSA/IHVuZGVmaW5lZCA6ICdidXR0b24nLFxuICAgICAgICBzdHlsZTogc3R5bGVcbiAgICAgIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImlucHV0XCIsIF9leHRlbmRzKHt9LCBwaWNrQXR0cnMob3RoZXJQcm9wcywge1xuICAgICAgICBhcmlhOiB0cnVlLFxuICAgICAgICBkYXRhOiB0cnVlXG4gICAgICB9KSwge1xuICAgICAgICBpZDogaWRcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzUwNjQzLFxuICAgICAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vcmVhY3QtY29tcG9uZW50L3VwbG9hZC9wdWxsLzU3NSNpc3N1ZWNvbW1lbnQtMjMyMDY0NjU1MlxuICAgICAgICAgKi8sXG4gICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICAgICAgdHlwZTogXCJmaWxlXCIsXG4gICAgICAgIHJlZjogdGhpcy5zYXZlRmlsZUlucHV0LFxuICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKGUpIHtcbiAgICAgICAgICByZXR1cm4gZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfSAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8xOTk0OFxuICAgICAgICAsXG4gICAgICAgIGtleTogdGhpcy5zdGF0ZS51aWQsXG4gICAgICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKHtcbiAgICAgICAgICBkaXNwbGF5OiAnbm9uZSdcbiAgICAgICAgfSwgc3R5bGVzLmlucHV0KSxcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzLmlucHV0LFxuICAgICAgICBhY2NlcHQ6IGFjY2VwdFxuICAgICAgfSwgZGlyUHJvcHMsIHtcbiAgICAgICAgbXVsdGlwbGU6IG11bHRpcGxlLFxuICAgICAgICBvbkNoYW5nZTogdGhpcy5vbkNoYW5nZVxuICAgICAgfSwgY2FwdHVyZSAhPSBudWxsID8ge1xuICAgICAgICBjYXB0dXJlOiBjYXB0dXJlXG4gICAgICB9IDoge30pKSwgY2hpbGRyZW4pO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gQWpheFVwbG9hZGVyO1xufShDb21wb25lbnQpO1xuZXhwb3J0IGRlZmF1bHQgQWpheFVwbG9hZGVyOyIsICJpbXBvcnQgd2FybmluZyBmcm9tIFwicmMtdXRpbC9lcy93YXJuaW5nXCI7XG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gKGZpbGUsIGFjY2VwdGVkRmlsZXMpIHtcbiAgaWYgKGZpbGUgJiYgYWNjZXB0ZWRGaWxlcykge1xuICAgIHZhciBhY2NlcHRlZEZpbGVzQXJyYXkgPSBBcnJheS5pc0FycmF5KGFjY2VwdGVkRmlsZXMpID8gYWNjZXB0ZWRGaWxlcyA6IGFjY2VwdGVkRmlsZXMuc3BsaXQoJywnKTtcbiAgICB2YXIgZmlsZU5hbWUgPSBmaWxlLm5hbWUgfHwgJyc7XG4gICAgdmFyIG1pbWVUeXBlID0gZmlsZS50eXBlIHx8ICcnO1xuICAgIHZhciBiYXNlTWltZVR5cGUgPSBtaW1lVHlwZS5yZXBsYWNlKC9cXC8uKiQvLCAnJyk7XG4gICAgcmV0dXJuIGFjY2VwdGVkRmlsZXNBcnJheS5zb21lKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICB2YXIgdmFsaWRUeXBlID0gdHlwZS50cmltKCk7XG4gICAgICAvLyBUaGlzIGlzIHNvbWV0aGluZyBsaWtlICovKiwqICBhbGxvdyBhbGwgZmlsZXNcbiAgICAgIGlmICgvXlxcKihcXC9cXCopPyQvLnRlc3QodHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGxpa2UgLmpwZywgLnBuZ1xuICAgICAgaWYgKHZhbGlkVHlwZS5jaGFyQXQoMCkgPT09ICcuJykge1xuICAgICAgICB2YXIgbG93ZXJGaWxlTmFtZSA9IGZpbGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHZhciBsb3dlclR5cGUgPSB2YWxpZFR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgdmFyIGFmZml4TGlzdCA9IFtsb3dlclR5cGVdO1xuICAgICAgICBpZiAobG93ZXJUeXBlID09PSAnLmpwZycgfHwgbG93ZXJUeXBlID09PSAnLmpwZWcnKSB7XG4gICAgICAgICAgYWZmaXhMaXN0ID0gWycuanBnJywgJy5qcGVnJ107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFmZml4TGlzdC5zb21lKGZ1bmN0aW9uIChhZmZpeCkge1xuICAgICAgICAgIHJldHVybiBsb3dlckZpbGVOYW1lLmVuZHNXaXRoKGFmZml4KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoaXMgaXMgc29tZXRoaW5nIGxpa2UgYSBpbWFnZS8qIG1pbWUgdHlwZVxuICAgICAgaWYgKC9cXC9cXCokLy50ZXN0KHZhbGlkVHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VNaW1lVHlwZSA9PT0gdmFsaWRUeXBlLnJlcGxhY2UoL1xcLy4qJC8sICcnKTtcbiAgICAgIH1cblxuICAgICAgLy8gRnVsbCBtYXRjaFxuICAgICAgaWYgKG1pbWVUeXBlID09PSB2YWxpZFR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEludmFsaWRhdGUgdHlwZSBzaG91bGQgc2tpcFxuICAgICAgaWYgKC9eXFx3KyQvLnRlc3QodmFsaWRUeXBlKSkge1xuICAgICAgICB3YXJuaW5nKGZhbHNlLCBcIlVwbG9hZCB0YWtlcyBhbiBpbnZhbGlkYXRlICdhY2NlcHQnIHR5cGUgJ1wiLmNvbmNhdCh2YWxpZFR5cGUsIFwiJy5Ta2lwIGZvciBjaGVjay5cIikpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn0pOyIsICJmdW5jdGlvbiBnZXRFcnJvcihvcHRpb24sIHhocikge1xuICB2YXIgbXNnID0gXCJjYW5ub3QgXCIuY29uY2F0KG9wdGlvbi5tZXRob2QsIFwiIFwiKS5jb25jYXQob3B0aW9uLmFjdGlvbiwgXCIgXCIpLmNvbmNhdCh4aHIuc3RhdHVzLCBcIidcIik7XG4gIHZhciBlcnIgPSBuZXcgRXJyb3IobXNnKTtcbiAgZXJyLnN0YXR1cyA9IHhoci5zdGF0dXM7XG4gIGVyci5tZXRob2QgPSBvcHRpb24ubWV0aG9kO1xuICBlcnIudXJsID0gb3B0aW9uLmFjdGlvbjtcbiAgcmV0dXJuIGVycjtcbn1cbmZ1bmN0aW9uIGdldEJvZHkoeGhyKSB7XG4gIHZhciB0ZXh0ID0geGhyLnJlc3BvbnNlVGV4dCB8fCB4aHIucmVzcG9uc2U7XG4gIGlmICghdGV4dCkge1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UodGV4dCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gdGV4dDtcbiAgfVxufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXBsb2FkKG9wdGlvbikge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICBpZiAob3B0aW9uLm9uUHJvZ3Jlc3MgJiYgeGhyLnVwbG9hZCkge1xuICAgIHhoci51cGxvYWQub25wcm9ncmVzcyA9IGZ1bmN0aW9uIHByb2dyZXNzKGUpIHtcbiAgICAgIGlmIChlLnRvdGFsID4gMCkge1xuICAgICAgICBlLnBlcmNlbnQgPSBlLmxvYWRlZCAvIGUudG90YWwgKiAxMDA7XG4gICAgICB9XG4gICAgICBvcHRpb24ub25Qcm9ncmVzcyhlKTtcbiAgICB9O1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIHZhciBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICBpZiAob3B0aW9uLmRhdGEpIHtcbiAgICBPYmplY3Qua2V5cyhvcHRpb24uZGF0YSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICB2YXIgdmFsdWUgPSBvcHRpb24uZGF0YVtrZXldO1xuICAgICAgLy8gc3VwcG9ydCBrZXktdmFsdWUgYXJyYXkgZGF0YVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAvLyB7IGxpc3Q6IFsgMTEsIDIyIF0gfVxuICAgICAgICAgIC8vIGZvcm1EYXRhLmFwcGVuZCgnbGlzdFtdJywgMTEpO1xuICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChcIlwiLmNvbmNhdChrZXksIFwiW11cIiksIGl0ZW0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgdmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIGlmIChvcHRpb24uZmlsZSBpbnN0YW5jZW9mIEJsb2IpIHtcbiAgICBmb3JtRGF0YS5hcHBlbmQob3B0aW9uLmZpbGVuYW1lLCBvcHRpb24uZmlsZSwgb3B0aW9uLmZpbGUubmFtZSk7XG4gIH0gZWxzZSB7XG4gICAgZm9ybURhdGEuYXBwZW5kKG9wdGlvbi5maWxlbmFtZSwgb3B0aW9uLmZpbGUpO1xuICB9XG4gIHhoci5vbmVycm9yID0gZnVuY3Rpb24gZXJyb3IoZSkge1xuICAgIG9wdGlvbi5vbkVycm9yKGUpO1xuICB9O1xuICB4aHIub25sb2FkID0gZnVuY3Rpb24gb25sb2FkKCkge1xuICAgIC8vIGFsbG93IHN1Y2Nlc3Mgd2hlbiAyeHggc3RhdHVzXG4gICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1jb21wb25lbnQvdXBsb2FkL2lzc3Vlcy8zNFxuICAgIGlmICh4aHIuc3RhdHVzIDwgMjAwIHx8IHhoci5zdGF0dXMgPj0gMzAwKSB7XG4gICAgICByZXR1cm4gb3B0aW9uLm9uRXJyb3IoZ2V0RXJyb3Iob3B0aW9uLCB4aHIpLCBnZXRCb2R5KHhocikpO1xuICAgIH1cbiAgICByZXR1cm4gb3B0aW9uLm9uU3VjY2VzcyhnZXRCb2R5KHhociksIHhocik7XG4gIH07XG4gIHhoci5vcGVuKG9wdGlvbi5tZXRob2QsIG9wdGlvbi5hY3Rpb24sIHRydWUpO1xuXG4gIC8vIEhhcyB0byBiZSBhZnRlciBgLm9wZW4oKWAuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW55by9kcm9wem9uZS9pc3N1ZXMvMTc5XG4gIGlmIChvcHRpb24ud2l0aENyZWRlbnRpYWxzICYmICd3aXRoQ3JlZGVudGlhbHMnIGluIHhocikge1xuICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0cnVlO1xuICB9XG4gIHZhciBoZWFkZXJzID0gb3B0aW9uLmhlYWRlcnMgfHwge307XG5cbiAgLy8gd2hlbiBzZXQgaGVhZGVyc1snWC1SZXF1ZXN0ZWQtV2l0aCddID0gbnVsbCAsIGNhbiBjbG9zZSBkZWZhdWx0IFhIUiBoZWFkZXJcbiAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1jb21wb25lbnQvdXBsb2FkL2lzc3Vlcy8zM1xuICBpZiAoaGVhZGVyc1snWC1SZXF1ZXN0ZWQtV2l0aCddICE9PSBudWxsKSB7XG4gICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ1gtUmVxdWVzdGVkLVdpdGgnLCAnWE1MSHR0cFJlcXVlc3QnKTtcbiAgfVxuICBPYmplY3Qua2V5cyhoZWFkZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChoKSB7XG4gICAgaWYgKGhlYWRlcnNbaF0gIT09IG51bGwpIHtcbiAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGgsIGhlYWRlcnNbaF0pO1xuICAgIH1cbiAgfSk7XG4gIHhoci5zZW5kKGZvcm1EYXRhKTtcbiAgcmV0dXJuIHtcbiAgICBhYm9ydDogZnVuY3Rpb24gYWJvcnQoKSB7XG4gICAgICB4aHIuYWJvcnQoKTtcbiAgICB9XG4gIH07XG59IiwgImltcG9ydCBfcmVnZW5lcmF0b3JSdW50aW1lIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9yZWdlbmVyYXRvclJ1bnRpbWVcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX2FzeW5jVG9HZW5lcmF0b3IgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2FzeW5jVG9HZW5lcmF0b3JcIjtcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzUwMDgwXG52YXIgdHJhdmVyc2VGaWxlVHJlZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lKCkubWFyayhmdW5jdGlvbiBfY2FsbGVlNChmaWxlcywgaXNBY2NlcHRlZCkge1xuICAgIHZhciBmbGF0dGVuRmlsZUxpc3QsIHByb2dyZXNzRmlsZUxpc3QsIHJlYWREaXJlY3RvcnksIF9yZWFkRGlyZWN0b3J5LCByZWFkRmlsZSwgX3JlYWRGaWxlLCBfdHJhdmVyc2VGaWxlVHJlZSwgd2lwSW5kZXg7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWU0JChfY29udGV4dDQpIHtcbiAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0NC5wcmV2ID0gX2NvbnRleHQ0Lm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIF9yZWFkRmlsZSA9IGZ1bmN0aW9uIF9yZWFkRmlsZTMoKSB7XG4gICAgICAgICAgICBfcmVhZEZpbGUgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUzKGl0ZW0pIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUzJChfY29udGV4dDMpIHtcbiAgICAgICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDMucHJldiA9IF9jb250ZXh0My5uZXh0KSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuYWJydXB0KFwicmV0dXJuXCIsIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNsb3ZlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaXRlbS5maWxlKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNBY2NlcHRlZChmaWxlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8xNjQyNlxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5mdWxsUGF0aCAmJiAhZmlsZS53ZWJraXRSZWxhdGl2ZVBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhmaWxlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWJraXRSZWxhdGl2ZVBhdGg6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLndlYmtpdFJlbGF0aXZlUGF0aCA9IGl0ZW0uZnVsbFBhdGgucmVwbGFjZSgvXlxcLy8sICcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhmaWxlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWJraXRSZWxhdGl2ZVBhdGg6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzbG92ZShmaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2xvdmUobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5zdG9wKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9LCBfY2FsbGVlMyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICByZXR1cm4gX3JlYWRGaWxlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICByZWFkRmlsZSA9IGZ1bmN0aW9uIF9yZWFkRmlsZTIoX3g0KSB7XG4gICAgICAgICAgICByZXR1cm4gX3JlYWRGaWxlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBfcmVhZERpcmVjdG9yeSA9IGZ1bmN0aW9uIF9yZWFkRGlyZWN0b3J5MygpIHtcbiAgICAgICAgICAgIF9yZWFkRGlyZWN0b3J5ID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lKCkubWFyayhmdW5jdGlvbiBfY2FsbGVlMihkaXJlY3RvcnkpIHtcbiAgICAgICAgICAgICAgdmFyIGRpclJlYWRlciwgZW50cmllcywgcmVzdWx0cywgbiwgaTtcbiAgICAgICAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHtcbiAgICAgICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGRpclJlYWRlciA9IGRpcmVjdG9yeS5jcmVhdGVSZWFkZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgZW50cmllcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDEyO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gNTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZGlyUmVhZGVyLnJlYWRFbnRyaWVzKHJlc29sdmUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKFtdKTtcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBfY29udGV4dDIuc2VudDtcbiAgICAgICAgICAgICAgICAgICAgbiA9IHJlc3VsdHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBpZiAobikge1xuICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gOTtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdChcImJyZWFrXCIsIDEyKTtcbiAgICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgIGVudHJpZXMucHVzaChyZXN1bHRzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoXCJyZXR1cm5cIiwgZW50cmllcyk7XG4gICAgICAgICAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0sIF9jYWxsZWUyKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHJldHVybiBfcmVhZERpcmVjdG9yeS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgcmVhZERpcmVjdG9yeSA9IGZ1bmN0aW9uIF9yZWFkRGlyZWN0b3J5MihfeDMpIHtcbiAgICAgICAgICAgIHJldHVybiBfcmVhZERpcmVjdG9yeS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgZmxhdHRlbkZpbGVMaXN0ID0gW107XG4gICAgICAgICAgcHJvZ3Jlc3NGaWxlTGlzdCA9IFtdO1xuICAgICAgICAgIGZpbGVzLmZvckVhY2goZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9ncmVzc0ZpbGVMaXN0LnB1c2goZmlsZS53ZWJraXRHZXRBc0VudHJ5KCkpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICAgICAgICAgIF90cmF2ZXJzZUZpbGVUcmVlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfcmVmMiA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZSgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZShpdGVtLCBwYXRoKSB7XG4gICAgICAgICAgICAgIHZhciBfZmlsZSwgZW50cmllcztcbiAgICAgICAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIpO1xuICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgICAgICAgICAgaXRlbS5wYXRoID0gcGF0aCB8fCAnJztcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtLmlzRmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMDtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNjtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRGaWxlKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICBfZmlsZSA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfZmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgIGZsYXR0ZW5GaWxlTGlzdC5wdXNoKF9maWxlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtLmlzRGlyZWN0b3J5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE1O1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWREaXJlY3RvcnkoaXRlbSk7XG4gICAgICAgICAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgICAgICAgICBlbnRyaWVzID0gX2NvbnRleHQuc2VudDtcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NGaWxlTGlzdC5wdXNoLmFwcGx5KHByb2dyZXNzRmlsZUxpc3QsIF90b0NvbnN1bWFibGVBcnJheShlbnRyaWVzKSk7XG4gICAgICAgICAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSwgX2NhbGxlZSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gX3RyYXZlcnNlRmlsZVRyZWUoX3g1LCBfeDYpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF9yZWYyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0oKTtcbiAgICAgICAgICB3aXBJbmRleCA9IDA7XG4gICAgICAgIGNhc2UgOTpcbiAgICAgICAgICBpZiAoISh3aXBJbmRleCA8IHByb2dyZXNzRmlsZUxpc3QubGVuZ3RoKSkge1xuICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSAxNTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDEyO1xuICAgICAgICAgIHJldHVybiBfdHJhdmVyc2VGaWxlVHJlZShwcm9ncmVzc0ZpbGVMaXN0W3dpcEluZGV4XSk7XG4gICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgd2lwSW5kZXgrKztcbiAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5hYnJ1cHQoXCJyZXR1cm5cIiwgZmxhdHRlbkZpbGVMaXN0KTtcbiAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dDQuc3RvcCgpO1xuICAgICAgfVxuICAgIH0sIF9jYWxsZWU0KTtcbiAgfSkpO1xuICByZXR1cm4gZnVuY3Rpb24gdHJhdmVyc2VGaWxlVHJlZShfeCwgX3gyKSB7XG4gICAgcmV0dXJuIF9yZWYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTtcbmV4cG9ydCBkZWZhdWx0IHRyYXZlcnNlRmlsZVRyZWU7IiwgInZhciBub3cgPSArbmV3IERhdGUoKTtcbnZhciBpbmRleCA9IDA7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1aWQoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wbHVzcGx1c1xuICByZXR1cm4gXCJyYy11cGxvYWQtXCIuY29uY2F0KG5vdywgXCItXCIpLmNvbmNhdCgrK2luZGV4KTtcbn0iLCAiaW1wb3J0IFVwbG9hZCBmcm9tIFwiLi9VcGxvYWRcIjtcbmV4cG9ydCBkZWZhdWx0IFVwbG9hZDsiLCAiaW1wb3J0IHsgdW5pdCB9IGZyb20gJ0BhbnQtZGVzaWduL2Nzc2luanMnO1xuY29uc3QgZ2VuRHJhZ2dlclN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzLFxuICAgIGljb25DbHNcbiAgfSA9IHRva2VuO1xuICByZXR1cm4ge1xuICAgIFtgJHtjb21wb25lbnRDbHN9LXdyYXBwZXJgXToge1xuICAgICAgW2Ake2NvbXBvbmVudENsc30tZHJhZ2BdOiB7XG4gICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgYmFja2dyb3VuZDogdG9rZW4uY29sb3JGaWxsQWx0ZXIsXG4gICAgICAgIGJvcmRlcjogYCR7dW5pdCh0b2tlbi5saW5lV2lkdGgpfSBkYXNoZWQgJHt0b2tlbi5jb2xvckJvcmRlcn1gLFxuICAgICAgICBib3JkZXJSYWRpdXM6IHRva2VuLmJvcmRlclJhZGl1c0xHLFxuICAgICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgICAgdHJhbnNpdGlvbjogYGJvcmRlci1jb2xvciAke3Rva2VuLm1vdGlvbkR1cmF0aW9uU2xvd31gLFxuICAgICAgICBbY29tcG9uZW50Q2xzXToge1xuICAgICAgICAgIHBhZGRpbmc6IHRva2VuLnBhZGRpbmdcbiAgICAgICAgfSxcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30tYnRuYF06IHtcbiAgICAgICAgICBkaXNwbGF5OiAndGFibGUnLFxuICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgICAgb3V0bGluZTogJ25vbmUnLFxuICAgICAgICAgIGJvcmRlclJhZGl1czogdG9rZW4uYm9yZGVyUmFkaXVzTEcsXG4gICAgICAgICAgJyY6Zm9jdXMtdmlzaWJsZSc6IHtcbiAgICAgICAgICAgIG91dGxpbmU6IGAke3VuaXQodG9rZW4ubGluZVdpZHRoRm9jdXMpfSBzb2xpZCAke3Rva2VuLmNvbG9yUHJpbWFyeUJvcmRlcn1gXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1kcmFnLWNvbnRhaW5lcmBdOiB7XG4gICAgICAgICAgZGlzcGxheTogJ3RhYmxlLWNlbGwnLFxuICAgICAgICAgIHZlcnRpY2FsQWxpZ246ICdtaWRkbGUnXG4gICAgICAgIH0sXG4gICAgICAgIFtgXG4gICAgICAgICAgJjpub3QoJHtjb21wb25lbnRDbHN9LWRpc2FibGVkKTpob3ZlcixcbiAgICAgICAgICAmLWhvdmVyOm5vdCgke2NvbXBvbmVudENsc30tZGlzYWJsZWQpXG4gICAgICAgIGBdOiB7XG4gICAgICAgICAgYm9yZGVyQ29sb3I6IHRva2VuLmNvbG9yUHJpbWFyeUhvdmVyXG4gICAgICAgIH0sXG4gICAgICAgIFtgcCR7Y29tcG9uZW50Q2xzfS1kcmFnLWljb25gXToge1xuICAgICAgICAgIG1hcmdpbkJvdHRvbTogdG9rZW4ubWFyZ2luLFxuICAgICAgICAgIFtpY29uQ2xzXToge1xuICAgICAgICAgICAgY29sb3I6IHRva2VuLmNvbG9yUHJpbWFyeSxcbiAgICAgICAgICAgIGZvbnRTaXplOiB0b2tlbi51cGxvYWRUaHVtYm5haWxTaXplXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbYHAke2NvbXBvbmVudENsc30tdGV4dGBdOiB7XG4gICAgICAgICAgbWFyZ2luOiBgMCAwICR7dW5pdCh0b2tlbi5tYXJnaW5YWFMpfWAsXG4gICAgICAgICAgY29sb3I6IHRva2VuLmNvbG9yVGV4dEhlYWRpbmcsXG4gICAgICAgICAgZm9udFNpemU6IHRva2VuLmZvbnRTaXplTEdcbiAgICAgICAgfSxcbiAgICAgICAgW2BwJHtjb21wb25lbnRDbHN9LWhpbnRgXToge1xuICAgICAgICAgIGNvbG9yOiB0b2tlbi5jb2xvclRleHREZXNjcmlwdGlvbixcbiAgICAgICAgICBmb250U2l6ZTogdG9rZW4uZm9udFNpemVcbiAgICAgICAgfSxcbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09IERpc2FibGVkID09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICBbYCYke2NvbXBvbmVudENsc30tZGlzYWJsZWRgXToge1xuICAgICAgICAgIFtgcCR7Y29tcG9uZW50Q2xzfS1kcmFnLWljb24gJHtpY29uQ2xzfSxcbiAgICAgICAgICAgIHAke2NvbXBvbmVudENsc30tdGV4dCxcbiAgICAgICAgICAgIHAke2NvbXBvbmVudENsc30taGludFxuICAgICAgICAgIGBdOiB7XG4gICAgICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JUZXh0RGlzYWJsZWRcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xuZXhwb3J0IGRlZmF1bHQgZ2VuRHJhZ2dlclN0eWxlOyIsICJpbXBvcnQgeyB1bml0IH0gZnJvbSAnQGFudC1kZXNpZ24vY3NzaW5qcyc7XG5pbXBvcnQgeyBjbGVhckZpeCwgdGV4dEVsbGlwc2lzIH0gZnJvbSAnLi4vLi4vc3R5bGUnO1xuY29uc3QgZ2VuTGlzdFN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzLFxuICAgIGljb25DbHMsXG4gICAgZm9udFNpemUsXG4gICAgbGluZUhlaWdodCxcbiAgICBjYWxjXG4gIH0gPSB0b2tlbjtcbiAgY29uc3QgaXRlbUNscyA9IGAke2NvbXBvbmVudENsc30tbGlzdC1pdGVtYDtcbiAgY29uc3QgYWN0aW9uc0NscyA9IGAke2l0ZW1DbHN9LWFjdGlvbnNgO1xuICBjb25zdCBhY3Rpb25DbHMgPSBgJHtpdGVtQ2xzfS1hY3Rpb25gO1xuICByZXR1cm4ge1xuICAgIFtgJHtjb21wb25lbnRDbHN9LXdyYXBwZXJgXToge1xuICAgICAgW2Ake2NvbXBvbmVudENsc30tbGlzdGBdOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGNsZWFyRml4KCkpLCB7XG4gICAgICAgIGxpbmVIZWlnaHQ6IHRva2VuLmxpbmVIZWlnaHQsXG4gICAgICAgIFtpdGVtQ2xzXToge1xuICAgICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgICAgIGhlaWdodDogY2FsYyh0b2tlbi5saW5lSGVpZ2h0KS5tdWwoZm9udFNpemUpLmVxdWFsKCksXG4gICAgICAgICAgbWFyZ2luVG9wOiB0b2tlbi5tYXJnaW5YUyxcbiAgICAgICAgICBmb250U2l6ZSxcbiAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAgdHJhbnNpdGlvbjogYGJhY2tncm91bmQtY29sb3IgJHt0b2tlbi5tb3Rpb25EdXJhdGlvblNsb3d9YCxcbiAgICAgICAgICBib3JkZXJSYWRpdXM6IHRva2VuLmJvcmRlclJhZGl1c1NNLFxuICAgICAgICAgICcmOmhvdmVyJzoge1xuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0b2tlbi5jb250cm9sSXRlbUJnSG92ZXJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFtgJHtpdGVtQ2xzfS1uYW1lYF06IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGV4dEVsbGlwc2lzKSwge1xuICAgICAgICAgICAgcGFkZGluZzogYDAgJHt1bml0KHRva2VuLnBhZGRpbmdYUyl9YCxcbiAgICAgICAgICAgIGxpbmVIZWlnaHQsXG4gICAgICAgICAgICBmbGV4OiAnYXV0bycsXG4gICAgICAgICAgICB0cmFuc2l0aW9uOiBgYWxsICR7dG9rZW4ubW90aW9uRHVyYXRpb25TbG93fWBcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBbYWN0aW9uc0Nsc106IHtcbiAgICAgICAgICAgIHdoaXRlU3BhY2U6ICdub3dyYXAnLFxuICAgICAgICAgICAgW2FjdGlvbkNsc106IHtcbiAgICAgICAgICAgICAgb3BhY2l0eTogMFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtpY29uQ2xzXToge1xuICAgICAgICAgICAgICBjb2xvcjogdG9rZW4uYWN0aW9uc0NvbG9yLFxuICAgICAgICAgICAgICB0cmFuc2l0aW9uOiBgYWxsICR7dG9rZW4ubW90aW9uRHVyYXRpb25TbG93fWBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbYFxuICAgICAgICAgICAgICAke2FjdGlvbkNsc306Zm9jdXMtdmlzaWJsZSxcbiAgICAgICAgICAgICAgJi5waWN0dXJlICR7YWN0aW9uQ2xzfVxuICAgICAgICAgICAgYF06IHtcbiAgICAgICAgICAgICAgb3BhY2l0eTogMVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgW2Ake2NvbXBvbmVudENsc30taWNvbiAke2ljb25DbHN9YF06IHtcbiAgICAgICAgICAgIGNvbG9yOiB0b2tlbi5jb2xvclRleHREZXNjcmlwdGlvbixcbiAgICAgICAgICAgIGZvbnRTaXplXG4gICAgICAgICAgfSxcbiAgICAgICAgICBbYCR7aXRlbUNsc30tcHJvZ3Jlc3NgXToge1xuICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICBib3R0b206IHRva2VuLmNhbGModG9rZW4udXBsb2FkUHJvZ3Jlc3NPZmZzZXQpLm11bCgtMSkuZXF1YWwoKSxcbiAgICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgICBwYWRkaW5nSW5saW5lU3RhcnQ6IGNhbGMoZm9udFNpemUpLmFkZCh0b2tlbi5wYWRkaW5nWFMpLmVxdWFsKCksXG4gICAgICAgICAgICBmb250U2l6ZSxcbiAgICAgICAgICAgIGxpbmVIZWlnaHQ6IDAsXG4gICAgICAgICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gICAgICAgICAgICAnPiBkaXYnOiB7XG4gICAgICAgICAgICAgIG1hcmdpbjogMFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgW2Ake2l0ZW1DbHN9OmhvdmVyICR7YWN0aW9uQ2xzfWBdOiB7XG4gICAgICAgICAgb3BhY2l0eTogMVxuICAgICAgICB9LFxuICAgICAgICBbYCR7aXRlbUNsc30tZXJyb3JgXToge1xuICAgICAgICAgIGNvbG9yOiB0b2tlbi5jb2xvckVycm9yLFxuICAgICAgICAgIFtgJHtpdGVtQ2xzfS1uYW1lLCAke2NvbXBvbmVudENsc30taWNvbiAke2ljb25DbHN9YF06IHtcbiAgICAgICAgICAgIGNvbG9yOiB0b2tlbi5jb2xvckVycm9yXG4gICAgICAgICAgfSxcbiAgICAgICAgICBbYWN0aW9uc0Nsc106IHtcbiAgICAgICAgICAgIFtgJHtpY29uQ2xzfSwgJHtpY29uQ2xzfTpob3ZlcmBdOiB7XG4gICAgICAgICAgICAgIGNvbG9yOiB0b2tlbi5jb2xvckVycm9yXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW2FjdGlvbkNsc106IHtcbiAgICAgICAgICAgICAgb3BhY2l0eTogMVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30tbGlzdC1pdGVtLWNvbnRhaW5lcmBdOiB7XG4gICAgICAgICAgdHJhbnNpdGlvbjogYG9wYWNpdHkgJHt0b2tlbi5tb3Rpb25EdXJhdGlvblNsb3d9LCBoZWlnaHQgJHt0b2tlbi5tb3Rpb25EdXJhdGlvblNsb3d9YCxcbiAgICAgICAgICAvLyBGb3Igc21vb3RoIHJlbW92aW5nIGFuaW1hdGlvblxuICAgICAgICAgICcmOjpiZWZvcmUnOiB7XG4gICAgICAgICAgICBkaXNwbGF5OiAndGFibGUnLFxuICAgICAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICAgICAgICBjb250ZW50OiAnXCJcIidcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9O1xufTtcbmV4cG9ydCBkZWZhdWx0IGdlbkxpc3RTdHlsZTsiLCAiaW1wb3J0IHsgS2V5ZnJhbWVzIH0gZnJvbSAnQGFudC1kZXNpZ24vY3NzaW5qcyc7XG5pbXBvcnQgeyBpbml0RmFkZU1vdGlvbiB9IGZyb20gJy4uLy4uL3N0eWxlL21vdGlvbic7XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gTW90aW9uID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuY29uc3QgZ2VuTW90aW9uU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHNcbiAgfSA9IHRva2VuO1xuICBjb25zdCB1cGxvYWRBbmltYXRlSW5saW5lSW4gPSBuZXcgS2V5ZnJhbWVzKCd1cGxvYWRBbmltYXRlSW5saW5lSW4nLCB7XG4gICAgZnJvbToge1xuICAgICAgd2lkdGg6IDAsXG4gICAgICBoZWlnaHQ6IDAsXG4gICAgICBwYWRkaW5nOiAwLFxuICAgICAgb3BhY2l0eTogMCxcbiAgICAgIG1hcmdpbjogdG9rZW4uY2FsYyh0b2tlbi5tYXJnaW5YUykuZGl2KC0yKS5lcXVhbCgpXG4gICAgfVxuICB9KTtcbiAgY29uc3QgdXBsb2FkQW5pbWF0ZUlubGluZU91dCA9IG5ldyBLZXlmcmFtZXMoJ3VwbG9hZEFuaW1hdGVJbmxpbmVPdXQnLCB7XG4gICAgdG86IHtcbiAgICAgIHdpZHRoOiAwLFxuICAgICAgaGVpZ2h0OiAwLFxuICAgICAgcGFkZGluZzogMCxcbiAgICAgIG9wYWNpdHk6IDAsXG4gICAgICBtYXJnaW46IHRva2VuLmNhbGModG9rZW4ubWFyZ2luWFMpLmRpdigtMikuZXF1YWwoKVxuICAgIH1cbiAgfSk7XG4gIGNvbnN0IGlubGluZUNscyA9IGAke2NvbXBvbmVudENsc30tYW5pbWF0ZS1pbmxpbmVgO1xuICByZXR1cm4gW3tcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS13cmFwcGVyYF06IHtcbiAgICAgIFtgJHtpbmxpbmVDbHN9LWFwcGVhciwgJHtpbmxpbmVDbHN9LWVudGVyLCAke2lubGluZUNsc30tbGVhdmVgXToge1xuICAgICAgICBhbmltYXRpb25EdXJhdGlvbjogdG9rZW4ubW90aW9uRHVyYXRpb25TbG93LFxuICAgICAgICBhbmltYXRpb25UaW1pbmdGdW5jdGlvbjogdG9rZW4ubW90aW9uRWFzZUluT3V0Q2lyYyxcbiAgICAgICAgYW5pbWF0aW9uRmlsbE1vZGU6ICdmb3J3YXJkcydcbiAgICAgIH0sXG4gICAgICBbYCR7aW5saW5lQ2xzfS1hcHBlYXIsICR7aW5saW5lQ2xzfS1lbnRlcmBdOiB7XG4gICAgICAgIGFuaW1hdGlvbk5hbWU6IHVwbG9hZEFuaW1hdGVJbmxpbmVJblxuICAgICAgfSxcbiAgICAgIFtgJHtpbmxpbmVDbHN9LWxlYXZlYF06IHtcbiAgICAgICAgYW5pbWF0aW9uTmFtZTogdXBsb2FkQW5pbWF0ZUlubGluZU91dFxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIFtgJHtjb21wb25lbnRDbHN9LXdyYXBwZXJgXTogaW5pdEZhZGVNb3Rpb24odG9rZW4pXG4gIH0sIHVwbG9hZEFuaW1hdGVJbmxpbmVJbiwgdXBsb2FkQW5pbWF0ZUlubGluZU91dF07XG59O1xuZXhwb3J0IGRlZmF1bHQgZ2VuTW90aW9uU3R5bGU7IiwgImltcG9ydCB7IGJsdWUgfSBmcm9tICdAYW50LWRlc2lnbi9jb2xvcnMnO1xuaW1wb3J0IHsgdW5pdCB9IGZyb20gJ0BhbnQtZGVzaWduL2Nzc2luanMnO1xuaW1wb3J0IHsgY2xlYXJGaXgsIHRleHRFbGxpcHNpcyB9IGZyb20gJy4uLy4uL3N0eWxlJztcbmNvbnN0IGdlblBpY3R1cmVTdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENscyxcbiAgICBpY29uQ2xzLFxuICAgIHVwbG9hZFRodW1ibmFpbFNpemUsXG4gICAgdXBsb2FkUHJvZ3Jlc3NPZmZzZXQsXG4gICAgY2FsY1xuICB9ID0gdG9rZW47XG4gIGNvbnN0IGxpc3RDbHMgPSBgJHtjb21wb25lbnRDbHN9LWxpc3RgO1xuICBjb25zdCBpdGVtQ2xzID0gYCR7bGlzdENsc30taXRlbWA7XG4gIHJldHVybiB7XG4gICAgW2Ake2NvbXBvbmVudENsc30td3JhcHBlcmBdOiB7XG4gICAgICAvLyAke2xpc3RDbHN9IFx1NTg5RVx1NTJBMFx1NEYxOFx1NTE0OFx1N0VBN1xuICAgICAgW2BcbiAgICAgICAgJHtsaXN0Q2xzfSR7bGlzdENsc30tcGljdHVyZSxcbiAgICAgICAgJHtsaXN0Q2xzfSR7bGlzdENsc30tcGljdHVyZS1jYXJkLFxuICAgICAgICAke2xpc3RDbHN9JHtsaXN0Q2xzfS1waWN0dXJlLWNpcmNsZVxuICAgICAgYF06IHtcbiAgICAgICAgW2l0ZW1DbHNdOiB7XG4gICAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICAgICAgaGVpZ2h0OiBjYWxjKHVwbG9hZFRodW1ibmFpbFNpemUpLmFkZChjYWxjKHRva2VuLmxpbmVXaWR0aCkubXVsKDIpKS5hZGQoY2FsYyh0b2tlbi5wYWRkaW5nWFMpLm11bCgyKSkuZXF1YWwoKSxcbiAgICAgICAgICBwYWRkaW5nOiB0b2tlbi5wYWRkaW5nWFMsXG4gICAgICAgICAgYm9yZGVyOiBgJHt1bml0KHRva2VuLmxpbmVXaWR0aCl9ICR7dG9rZW4ubGluZVR5cGV9ICR7dG9rZW4uY29sb3JCb3JkZXJ9YCxcbiAgICAgICAgICBib3JkZXJSYWRpdXM6IHRva2VuLmJvcmRlclJhZGl1c0xHLFxuICAgICAgICAgICcmOmhvdmVyJzoge1xuICAgICAgICAgICAgYmFja2dyb3VuZDogJ3RyYW5zcGFyZW50J1xuICAgICAgICAgIH0sXG4gICAgICAgICAgW2Ake2l0ZW1DbHN9LXRodW1ibmFpbGBdOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRleHRFbGxpcHNpcyksIHtcbiAgICAgICAgICAgIHdpZHRoOiB1cGxvYWRUaHVtYm5haWxTaXplLFxuICAgICAgICAgICAgaGVpZ2h0OiB1cGxvYWRUaHVtYm5haWxTaXplLFxuICAgICAgICAgICAgbGluZUhlaWdodDogdW5pdChjYWxjKHVwbG9hZFRodW1ibmFpbFNpemUpLmFkZCh0b2tlbi5wYWRkaW5nU00pLmVxdWFsKCkpLFxuICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICAgIGZsZXg6ICdub25lJyxcbiAgICAgICAgICAgIFtpY29uQ2xzXToge1xuICAgICAgICAgICAgICBmb250U2l6ZTogdG9rZW4uZm9udFNpemVIZWFkaW5nMixcbiAgICAgICAgICAgICAgY29sb3I6IHRva2VuLmNvbG9yUHJpbWFyeVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGltZzoge1xuICAgICAgICAgICAgICBkaXNwbGF5OiAnYmxvY2snLFxuICAgICAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSksXG4gICAgICAgICAgW2Ake2l0ZW1DbHN9LXByb2dyZXNzYF06IHtcbiAgICAgICAgICAgIGJvdHRvbTogdXBsb2FkUHJvZ3Jlc3NPZmZzZXQsXG4gICAgICAgICAgICB3aWR0aDogYGNhbGMoMTAwJSAtICR7dW5pdChjYWxjKHRva2VuLnBhZGRpbmdTTSkubXVsKDIpLmVxdWFsKCkpfSlgLFxuICAgICAgICAgICAgbWFyZ2luVG9wOiAwLFxuICAgICAgICAgICAgcGFkZGluZ0lubGluZVN0YXJ0OiBjYWxjKHVwbG9hZFRodW1ibmFpbFNpemUpLmFkZCh0b2tlbi5wYWRkaW5nWFMpLmVxdWFsKClcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtgJHtpdGVtQ2xzfS1lcnJvcmBdOiB7XG4gICAgICAgICAgYm9yZGVyQ29sb3I6IHRva2VuLmNvbG9yRXJyb3IsXG4gICAgICAgICAgLy8gQWRqdXN0IHRoZSBjb2xvciBvZiB0aGUgZXJyb3IgaWNvbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vcHVsbC8yNDE2MFxuICAgICAgICAgIFtgJHtpdGVtQ2xzfS10aHVtYm5haWwgJHtpY29uQ2xzfWBdOiB7XG4gICAgICAgICAgICBbYHN2ZyBwYXRoW2ZpbGw9JyR7Ymx1ZVswXX0nXWBdOiB7XG4gICAgICAgICAgICAgIGZpbGw6IHRva2VuLmNvbG9yRXJyb3JCZ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtgc3ZnIHBhdGhbZmlsbD0nJHtibHVlLnByaW1hcnl9J11gXToge1xuICAgICAgICAgICAgICBmaWxsOiB0b2tlbi5jb2xvckVycm9yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbYCR7aXRlbUNsc30tdXBsb2FkaW5nYF06IHtcbiAgICAgICAgICBib3JkZXJTdHlsZTogJ2Rhc2hlZCcsXG4gICAgICAgICAgW2Ake2l0ZW1DbHN9LW5hbWVgXToge1xuICAgICAgICAgICAgbWFyZ2luQm90dG9tOiB1cGxvYWRQcm9ncmVzc09mZnNldFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtgJHtsaXN0Q2xzfSR7bGlzdENsc30tcGljdHVyZS1jaXJjbGUgJHtpdGVtQ2xzfWBdOiB7XG4gICAgICAgIFtgJiwgJjo6YmVmb3JlLCAke2l0ZW1DbHN9LXRodW1ibmFpbGBdOiB7XG4gICAgICAgICAgYm9yZGVyUmFkaXVzOiAnNTAlJ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbmNvbnN0IGdlblBpY3R1cmVDYXJkU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHMsXG4gICAgaWNvbkNscyxcbiAgICBmb250U2l6ZUxHLFxuICAgIGNvbG9yVGV4dExpZ2h0U29saWQsXG4gICAgY2FsY1xuICB9ID0gdG9rZW47XG4gIGNvbnN0IGxpc3RDbHMgPSBgJHtjb21wb25lbnRDbHN9LWxpc3RgO1xuICBjb25zdCBpdGVtQ2xzID0gYCR7bGlzdENsc30taXRlbWA7XG4gIGNvbnN0IHVwbG9hZFBpY3R1cmVDYXJkU2l6ZSA9IHRva2VuLnVwbG9hZFBpY0NhcmRTaXplO1xuICByZXR1cm4ge1xuICAgIFtgXG4gICAgICAke2NvbXBvbmVudENsc30td3JhcHBlciR7Y29tcG9uZW50Q2xzfS1waWN0dXJlLWNhcmQtd3JhcHBlcixcbiAgICAgICR7Y29tcG9uZW50Q2xzfS13cmFwcGVyJHtjb21wb25lbnRDbHN9LXBpY3R1cmUtY2lyY2xlLXdyYXBwZXJcbiAgICBgXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjbGVhckZpeCgpKSwge1xuICAgICAgZGlzcGxheTogJ2Jsb2NrJyxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9JHtjb21wb25lbnRDbHN9LXNlbGVjdGBdOiB7XG4gICAgICAgIHdpZHRoOiB1cGxvYWRQaWN0dXJlQ2FyZFNpemUsXG4gICAgICAgIGhlaWdodDogdXBsb2FkUGljdHVyZUNhcmRTaXplLFxuICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgICB2ZXJ0aWNhbEFsaWduOiAndG9wJyxcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0b2tlbi5jb2xvckZpbGxBbHRlcixcbiAgICAgICAgYm9yZGVyOiBgJHt1bml0KHRva2VuLmxpbmVXaWR0aCl9IGRhc2hlZCAke3Rva2VuLmNvbG9yQm9yZGVyfWAsXG4gICAgICAgIGJvcmRlclJhZGl1czogdG9rZW4uYm9yZGVyUmFkaXVzTEcsXG4gICAgICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgICAgICB0cmFuc2l0aW9uOiBgYm9yZGVyLWNvbG9yICR7dG9rZW4ubW90aW9uRHVyYXRpb25TbG93fWAsXG4gICAgICAgIFtgPiAke2NvbXBvbmVudENsc31gXToge1xuICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsXG4gICAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJ1xuICAgICAgICB9LFxuICAgICAgICBbYCY6bm90KCR7Y29tcG9uZW50Q2xzfS1kaXNhYmxlZCk6aG92ZXJgXToge1xuICAgICAgICAgIGJvcmRlckNvbG9yOiB0b2tlbi5jb2xvclByaW1hcnlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIGxpc3RcbiAgICAgIFtgJHtsaXN0Q2xzfSR7bGlzdENsc30tcGljdHVyZS1jYXJkLCAke2xpc3RDbHN9JHtsaXN0Q2xzfS1waWN0dXJlLWNpcmNsZWBdOiB7XG4gICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgZmxleFdyYXA6ICd3cmFwJyxcbiAgICAgICAgJ0BzdXBwb3J0cyBub3QgKGdhcDogMXB4KSc6IHtcbiAgICAgICAgICAnJiA+IConOiB7XG4gICAgICAgICAgICBtYXJnaW5CbG9ja0VuZDogdG9rZW4ubWFyZ2luWFMsXG4gICAgICAgICAgICBtYXJnaW5JbmxpbmVFbmQ6IHRva2VuLm1hcmdpblhTXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAnQHN1cHBvcnRzIChnYXA6IDFweCknOiB7XG4gICAgICAgICAgZ2FwOiB0b2tlbi5tYXJnaW5YU1xuICAgICAgICB9LFxuICAgICAgICBbYCR7bGlzdENsc30taXRlbS1jb250YWluZXJgXToge1xuICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgICAgIHdpZHRoOiB1cGxvYWRQaWN0dXJlQ2FyZFNpemUsXG4gICAgICAgICAgaGVpZ2h0OiB1cGxvYWRQaWN0dXJlQ2FyZFNpemUsXG4gICAgICAgICAgdmVydGljYWxBbGlnbjogJ3RvcCdcbiAgICAgICAgfSxcbiAgICAgICAgJyY6OmFmdGVyJzoge1xuICAgICAgICAgIGRpc3BsYXk6ICdub25lJ1xuICAgICAgICB9LFxuICAgICAgICAnJjo6YmVmb3JlJzoge1xuICAgICAgICAgIGRpc3BsYXk6ICdub25lJ1xuICAgICAgICB9LFxuICAgICAgICBbaXRlbUNsc106IHtcbiAgICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAgICBtYXJnaW46IDAsXG4gICAgICAgICAgJyY6OmJlZm9yZSc6IHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgekluZGV4OiAxLFxuICAgICAgICAgICAgd2lkdGg6IGBjYWxjKDEwMCUgLSAke3VuaXQoY2FsYyh0b2tlbi5wYWRkaW5nWFMpLm11bCgyKS5lcXVhbCgpKX0pYCxcbiAgICAgICAgICAgIGhlaWdodDogYGNhbGMoMTAwJSAtICR7dW5pdChjYWxjKHRva2VuLnBhZGRpbmdYUykubXVsKDIpLmVxdWFsKCkpfSlgLFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0b2tlbi5jb2xvckJnTWFzayxcbiAgICAgICAgICAgIG9wYWNpdHk6IDAsXG4gICAgICAgICAgICB0cmFuc2l0aW9uOiBgYWxsICR7dG9rZW4ubW90aW9uRHVyYXRpb25TbG93fWAsXG4gICAgICAgICAgICBjb250ZW50OiAnXCIgXCInXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbYCR7aXRlbUNsc306aG92ZXJgXToge1xuICAgICAgICAgIFtgJjo6YmVmb3JlLCAke2l0ZW1DbHN9LWFjdGlvbnNgXToge1xuICAgICAgICAgICAgb3BhY2l0eTogMVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgW2Ake2l0ZW1DbHN9LWFjdGlvbnNgXToge1xuICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgIGluc2V0SW5saW5lU3RhcnQ6IDAsXG4gICAgICAgICAgekluZGV4OiAxMCxcbiAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgIHdoaXRlU3BhY2U6ICdub3dyYXAnLFxuICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAgICAgb3BhY2l0eTogMCxcbiAgICAgICAgICB0cmFuc2l0aW9uOiBgYWxsICR7dG9rZW4ubW90aW9uRHVyYXRpb25TbG93fWAsXG4gICAgICAgICAgW2BcbiAgICAgICAgICAgICR7aWNvbkNsc30tZXllLFxuICAgICAgICAgICAgJHtpY29uQ2xzfS1kb3dubG9hZCxcbiAgICAgICAgICAgICR7aWNvbkNsc30tZGVsZXRlXG4gICAgICAgICAgYF06IHtcbiAgICAgICAgICAgIHpJbmRleDogMTAsXG4gICAgICAgICAgICB3aWR0aDogZm9udFNpemVMRyxcbiAgICAgICAgICAgIG1hcmdpbjogYDAgJHt1bml0KHRva2VuLm1hcmdpblhYUyl9YCxcbiAgICAgICAgICAgIGZvbnRTaXplOiBmb250U2l6ZUxHLFxuICAgICAgICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgICAgICAgICB0cmFuc2l0aW9uOiBgYWxsICR7dG9rZW4ubW90aW9uRHVyYXRpb25TbG93fWAsXG4gICAgICAgICAgICBjb2xvcjogY29sb3JUZXh0TGlnaHRTb2xpZCxcbiAgICAgICAgICAgICcmOmhvdmVyJzoge1xuICAgICAgICAgICAgICBjb2xvcjogY29sb3JUZXh0TGlnaHRTb2xpZFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN2Zzoge1xuICAgICAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiAnYmFzZWxpbmUnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbYCR7aXRlbUNsc30tdGh1bWJuYWlsLCAke2l0ZW1DbHN9LXRodW1ibmFpbCBpbWdgXToge1xuICAgICAgICAgIHBvc2l0aW9uOiAnc3RhdGljJyxcbiAgICAgICAgICBkaXNwbGF5OiAnYmxvY2snLFxuICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgICAgb2JqZWN0Rml0OiAnY29udGFpbidcbiAgICAgICAgfSxcbiAgICAgICAgW2Ake2l0ZW1DbHN9LW5hbWVgXToge1xuICAgICAgICAgIGRpc3BsYXk6ICdub25lJyxcbiAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInXG4gICAgICAgIH0sXG4gICAgICAgIFtgJHtpdGVtQ2xzfS1maWxlICsgJHtpdGVtQ2xzfS1uYW1lYF06IHtcbiAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICBib3R0b206IHRva2VuLm1hcmdpbixcbiAgICAgICAgICBkaXNwbGF5OiAnYmxvY2snLFxuICAgICAgICAgIHdpZHRoOiBgY2FsYygxMDAlIC0gJHt1bml0KGNhbGModG9rZW4ucGFkZGluZ1hTKS5tdWwoMikuZXF1YWwoKSl9KWBcbiAgICAgICAgfSxcbiAgICAgICAgW2Ake2l0ZW1DbHN9LXVwbG9hZGluZ2BdOiB7XG4gICAgICAgICAgW2AmJHtpdGVtQ2xzfWBdOiB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRva2VuLmNvbG9yRmlsbEFsdGVyXG4gICAgICAgICAgfSxcbiAgICAgICAgICBbYCY6OmJlZm9yZSwgJHtpY29uQ2xzfS1leWUsICR7aWNvbkNsc30tZG93bmxvYWQsICR7aWNvbkNsc30tZGVsZXRlYF06IHtcbiAgICAgICAgICAgIGRpc3BsYXk6ICdub25lJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgW2Ake2l0ZW1DbHN9LXByb2dyZXNzYF06IHtcbiAgICAgICAgICBib3R0b206IHRva2VuLm1hcmdpblhMLFxuICAgICAgICAgIHdpZHRoOiBgY2FsYygxMDAlIC0gJHt1bml0KGNhbGModG9rZW4ucGFkZGluZ1hTKS5tdWwoMikuZXF1YWwoKSl9KWAsXG4gICAgICAgICAgcGFkZGluZ0lubGluZVN0YXJ0OiAwXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSxcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS13cmFwcGVyJHtjb21wb25lbnRDbHN9LXBpY3R1cmUtY2lyY2xlLXdyYXBwZXJgXToge1xuICAgICAgW2Ake2NvbXBvbmVudENsc30ke2NvbXBvbmVudENsc30tc2VsZWN0YF06IHtcbiAgICAgICAgYm9yZGVyUmFkaXVzOiAnNTAlJ1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG5leHBvcnQgeyBnZW5QaWN0dXJlU3R5bGUsIGdlblBpY3R1cmVDYXJkU3R5bGUgfTsiLCAiLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IE1vdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmNvbnN0IGdlblJ0bFN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzXG4gIH0gPSB0b2tlbjtcbiAgcmV0dXJuIHtcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS1ydGxgXToge1xuICAgICAgZGlyZWN0aW9uOiAncnRsJ1xuICAgIH1cbiAgfTtcbn07XG5leHBvcnQgZGVmYXVsdCBnZW5SdGxTdHlsZTsiLCAiaW1wb3J0IHsgcmVzZXRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9zdHlsZSc7XG5pbXBvcnQgeyBnZW5Db2xsYXBzZU1vdGlvbiB9IGZyb20gJy4uLy4uL3N0eWxlL21vdGlvbic7XG5pbXBvcnQgeyBnZW5TdHlsZUhvb2tzLCBtZXJnZVRva2VuIH0gZnJvbSAnLi4vLi4vdGhlbWUvaW50ZXJuYWwnO1xuaW1wb3J0IGdlbkRyYWdnZXJTdHlsZSBmcm9tICcuL2RyYWdnZXInO1xuaW1wb3J0IGdlbkxpc3RTdHlsZSBmcm9tICcuL2xpc3QnO1xuaW1wb3J0IGdlbk1vdGlvblN0eWxlIGZyb20gJy4vbW90aW9uJztcbmltcG9ydCB7IGdlblBpY3R1cmVDYXJkU3R5bGUsIGdlblBpY3R1cmVTdHlsZSB9IGZyb20gJy4vcGljdHVyZSc7XG5pbXBvcnQgZ2VuUnRsU3R5bGUgZnJvbSAnLi9ydGwnO1xuY29uc3QgZ2VuQmFzZVN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzLFxuICAgIGNvbG9yVGV4dERpc2FibGVkXG4gIH0gPSB0b2tlbjtcbiAgcmV0dXJuIHtcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS13cmFwcGVyYF06IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVzZXRDb21wb25lbnQodG9rZW4pKSwge1xuICAgICAgW2NvbXBvbmVudENsc106IHtcbiAgICAgICAgb3V0bGluZTogMCxcbiAgICAgICAgXCJpbnB1dFt0eXBlPSdmaWxlJ11cIjoge1xuICAgICAgICAgIGN1cnNvcjogJ3BvaW50ZXInXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1zZWxlY3RgXToge1xuICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJ1xuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWhpZGRlbmBdOiB7XG4gICAgICAgIGRpc3BsYXk6ICdub25lJ1xuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWRpc2FibGVkYF06IHtcbiAgICAgICAgY29sb3I6IGNvbG9yVGV4dERpc2FibGVkLFxuICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCdcbiAgICAgIH1cbiAgICB9KVxuICB9O1xufTtcbmV4cG9ydCBjb25zdCBwcmVwYXJlQ29tcG9uZW50VG9rZW4gPSB0b2tlbiA9PiAoe1xuICBhY3Rpb25zQ29sb3I6IHRva2VuLmNvbG9yVGV4dERlc2NyaXB0aW9uXG59KTtcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFeHBvcnQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgZGVmYXVsdCBnZW5TdHlsZUhvb2tzKCdVcGxvYWQnLCB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBmb250U2l6ZUhlYWRpbmczLFxuICAgIGZvbnRIZWlnaHQsXG4gICAgbGluZVdpZHRoLFxuICAgIGNvbnRyb2xIZWlnaHRMRyxcbiAgICBjYWxjXG4gIH0gPSB0b2tlbjtcbiAgY29uc3QgdXBsb2FkVG9rZW4gPSBtZXJnZVRva2VuKHRva2VuLCB7XG4gICAgdXBsb2FkVGh1bWJuYWlsU2l6ZTogY2FsYyhmb250U2l6ZUhlYWRpbmczKS5tdWwoMikuZXF1YWwoKSxcbiAgICB1cGxvYWRQcm9ncmVzc09mZnNldDogY2FsYyhjYWxjKGZvbnRIZWlnaHQpLmRpdigyKSkuYWRkKGxpbmVXaWR0aCkuZXF1YWwoKSxcbiAgICB1cGxvYWRQaWNDYXJkU2l6ZTogY2FsYyhjb250cm9sSGVpZ2h0TEcpLm11bCgyLjU1KS5lcXVhbCgpXG4gIH0pO1xuICByZXR1cm4gW2dlbkJhc2VTdHlsZSh1cGxvYWRUb2tlbiksIGdlbkRyYWdnZXJTdHlsZSh1cGxvYWRUb2tlbiksIGdlblBpY3R1cmVTdHlsZSh1cGxvYWRUb2tlbiksIGdlblBpY3R1cmVDYXJkU3R5bGUodXBsb2FkVG9rZW4pLCBnZW5MaXN0U3R5bGUodXBsb2FkVG9rZW4pLCBnZW5Nb3Rpb25TdHlsZSh1cGxvYWRUb2tlbiksIGdlblJ0bFN0eWxlKHVwbG9hZFRva2VuKSwgZ2VuQ29sbGFwc2VNb3Rpb24odXBsb2FkVG9rZW4pXTtcbn0sIHByZXBhcmVDb21wb25lbnRUb2tlbik7IiwgIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEZpbGVUd29Ub25lIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9GaWxlVHdvVG9uZVwiO1xuaW1wb3J0IExvYWRpbmdPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvTG9hZGluZ091dGxpbmVkXCI7XG5pbXBvcnQgUGFwZXJDbGlwT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL1BhcGVyQ2xpcE91dGxpbmVkXCI7XG5pbXBvcnQgUGljdHVyZVR3b1RvbmUgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL1BpY3R1cmVUd29Ub25lXCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBDU1NNb3Rpb24sIHsgQ1NTTW90aW9uTGlzdCB9IGZyb20gJ3JjLW1vdGlvbic7XG5pbXBvcnQgb21pdCBmcm9tIFwicmMtdXRpbC9lcy9vbWl0XCI7XG5pbXBvcnQgdXNlRm9yY2VVcGRhdGUgZnJvbSAnLi4vLi4vX3V0aWwvaG9va3MvdXNlRm9yY2VVcGRhdGUnO1xuaW1wb3J0IGluaXRDb2xsYXBzZU1vdGlvbiBmcm9tICcuLi8uLi9fdXRpbC9tb3Rpb24nO1xuaW1wb3J0IHsgY2xvbmVFbGVtZW50IH0gZnJvbSAnLi4vLi4vX3V0aWwvcmVhY3ROb2RlJztcbmltcG9ydCBCdXR0b24gZnJvbSAnLi4vLi4vYnV0dG9uJztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi8uLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHsgaXNJbWFnZVVybCwgcHJldmlld0ltYWdlIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IExpc3RJdGVtIGZyb20gJy4vTGlzdEl0ZW0nO1xuY29uc3QgSW50ZXJuYWxVcGxvYWRMaXN0ID0gKHByb3BzLCByZWYpID0+IHtcbiAgY29uc3Qge1xuICAgIGxpc3RUeXBlID0gJ3RleHQnLFxuICAgIHByZXZpZXdGaWxlID0gcHJldmlld0ltYWdlLFxuICAgIG9uUHJldmlldyxcbiAgICBvbkRvd25sb2FkLFxuICAgIG9uUmVtb3ZlLFxuICAgIGxvY2FsZSxcbiAgICBpY29uUmVuZGVyLFxuICAgIGlzSW1hZ2VVcmw6IGlzSW1nVXJsID0gaXNJbWFnZVVybCxcbiAgICBwcmVmaXhDbHM6IGN1c3RvbWl6ZVByZWZpeENscyxcbiAgICBpdGVtcyA9IFtdLFxuICAgIHNob3dQcmV2aWV3SWNvbiA9IHRydWUsXG4gICAgc2hvd1JlbW92ZUljb24gPSB0cnVlLFxuICAgIHNob3dEb3dubG9hZEljb24gPSBmYWxzZSxcbiAgICByZW1vdmVJY29uLFxuICAgIHByZXZpZXdJY29uLFxuICAgIGRvd25sb2FkSWNvbixcbiAgICBleHRyYSxcbiAgICBwcm9ncmVzcyA9IHtcbiAgICAgIHNpemU6IFstMSwgMl0sXG4gICAgICBzaG93SW5mbzogZmFsc2VcbiAgICB9LFxuICAgIGFwcGVuZEFjdGlvbixcbiAgICBhcHBlbmRBY3Rpb25WaXNpYmxlID0gdHJ1ZSxcbiAgICBpdGVtUmVuZGVyLFxuICAgIGRpc2FibGVkXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgZm9yY2VVcGRhdGUgPSB1c2VGb3JjZVVwZGF0ZSgpO1xuICBjb25zdCBbbW90aW9uQXBwZWFyLCBzZXRNb3Rpb25BcHBlYXJdID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBpc1BpY3R1cmVDYXJkT3JDaXJsZSA9IFsncGljdHVyZS1jYXJkJywgJ3BpY3R1cmUtY2lyY2xlJ10uaW5jbHVkZXMobGlzdFR5cGUpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFZmZlY3QgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWxpc3RUeXBlLnN0YXJ0c1dpdGgoJ3BpY3R1cmUnKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAoaXRlbXMgfHwgW10pLmZvckVhY2goZmlsZSA9PiB7XG4gICAgICBpZiAoIShmaWxlLm9yaWdpbkZpbGVPYmogaW5zdGFuY2VvZiBGaWxlIHx8IGZpbGUub3JpZ2luRmlsZU9iaiBpbnN0YW5jZW9mIEJsb2IpIHx8IGZpbGUudGh1bWJVcmwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmaWxlLnRodW1iVXJsID0gJyc7XG4gICAgICBwcmV2aWV3RmlsZSA9PT0gbnVsbCB8fCBwcmV2aWV3RmlsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHJldmlld0ZpbGUoZmlsZS5vcmlnaW5GaWxlT2JqKS50aGVuKHByZXZpZXdEYXRhVXJsID0+IHtcbiAgICAgICAgLy8gTmVlZCBhcHBlbmQgJycgdG8gYXZvaWQgZGVhZCBsb29wXG4gICAgICAgIGZpbGUudGh1bWJVcmwgPSBwcmV2aWV3RGF0YVVybCB8fCAnJztcbiAgICAgICAgZm9yY2VVcGRhdGUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9LCBbbGlzdFR5cGUsIGl0ZW1zLCBwcmV2aWV3RmlsZV0pO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIHNldE1vdGlvbkFwcGVhcih0cnVlKTtcbiAgfSwgW10pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFdmVudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3Qgb25JbnRlcm5hbFByZXZpZXcgPSAoZmlsZSwgZSkgPT4ge1xuICAgIGlmICghb25QcmV2aWV3KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGUgPT09IG51bGwgfHwgZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHJldHVybiBvblByZXZpZXcoZmlsZSk7XG4gIH07XG4gIGNvbnN0IG9uSW50ZXJuYWxEb3dubG9hZCA9IGZpbGUgPT4ge1xuICAgIGlmICh0eXBlb2Ygb25Eb3dubG9hZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb25Eb3dubG9hZChmaWxlKTtcbiAgICB9IGVsc2UgaWYgKGZpbGUudXJsKSB7XG4gICAgICB3aW5kb3cub3BlbihmaWxlLnVybCk7XG4gICAgfVxuICB9O1xuICBjb25zdCBvbkludGVybmFsQ2xvc2UgPSBmaWxlID0+IHtcbiAgICBvblJlbW92ZSA9PT0gbnVsbCB8fCBvblJlbW92ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25SZW1vdmUoZmlsZSk7XG4gIH07XG4gIGNvbnN0IGludGVybmFsSWNvblJlbmRlciA9IGZpbGUgPT4ge1xuICAgIGlmIChpY29uUmVuZGVyKSB7XG4gICAgICByZXR1cm4gaWNvblJlbmRlcihmaWxlLCBsaXN0VHlwZSk7XG4gICAgfVxuICAgIGNvbnN0IGlzTG9hZGluZyA9IGZpbGUuc3RhdHVzID09PSAndXBsb2FkaW5nJztcbiAgICBpZiAobGlzdFR5cGUuc3RhcnRzV2l0aCgncGljdHVyZScpKSB7XG4gICAgICBjb25zdCBsb2FkaW5nSWNvbiA9IGxpc3RUeXBlID09PSAncGljdHVyZScgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMb2FkaW5nT3V0bGluZWQsIG51bGwpIDogbG9jYWxlLnVwbG9hZGluZztcbiAgICAgIGNvbnN0IGZpbGVJY29uID0gKGlzSW1nVXJsID09PSBudWxsIHx8IGlzSW1nVXJsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBpc0ltZ1VybChmaWxlKSkgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQaWN0dXJlVHdvVG9uZSwgbnVsbCkgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGaWxlVHdvVG9uZSwgbnVsbCk7XG4gICAgICByZXR1cm4gaXNMb2FkaW5nID8gbG9hZGluZ0ljb24gOiBmaWxlSWNvbjtcbiAgICB9XG4gICAgcmV0dXJuIGlzTG9hZGluZyA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExvYWRpbmdPdXRsaW5lZCwgbnVsbCkgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQYXBlckNsaXBPdXRsaW5lZCwgbnVsbCk7XG4gIH07XG4gIGNvbnN0IGFjdGlvbkljb25SZW5kZXIgPSAoY3VzdG9tSWNvbiwgY2FsbGJhY2ssIHByZWZpeENscywgdGl0bGUsIGFjY2VwdFVwbG9hZERpc2FibGVkKSA9PiB7XG4gICAgY29uc3QgYnRuUHJvcHMgPSB7XG4gICAgICB0eXBlOiAndGV4dCcsXG4gICAgICBzaXplOiAnc21hbGwnLFxuICAgICAgdGl0bGUsXG4gICAgICBvbkNsaWNrOiBlID0+IHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgaWYgKC8qI19fUFVSRV9fKi9SZWFjdC5pc1ZhbGlkRWxlbWVudChjdXN0b21JY29uKSkge1xuICAgICAgICAgIChfYiA9IChfYSA9IGN1c3RvbUljb24ucHJvcHMpLm9uQ2xpY2spID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hLCBlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGNsYXNzTmFtZTogYCR7cHJlZml4Q2xzfS1saXN0LWl0ZW0tYWN0aW9uYFxuICAgIH07XG4gICAgaWYgKGFjY2VwdFVwbG9hZERpc2FibGVkKSB7XG4gICAgICBidG5Qcm9wcy5kaXNhYmxlZCA9IGRpc2FibGVkO1xuICAgIH1cbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KGN1c3RvbUljb24pID8gKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7fSwgYnRuUHJvcHMsIHtcbiAgICAgIGljb246IGNsb25lRWxlbWVudChjdXN0b21JY29uLCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGN1c3RvbUljb24ucHJvcHMpLCB7XG4gICAgICAgIG9uQ2xpY2s6ICgpID0+IHt9XG4gICAgICB9KSlcbiAgICB9KSkpIDogKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7fSwgYnRuUHJvcHMpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgY3VzdG9tSWNvbikpKTtcbiAgfTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlZiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFRlc3QgbmVlZHNcbiAgUmVhY3QudXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsICgpID0+ICh7XG4gICAgaGFuZGxlUHJldmlldzogb25JbnRlcm5hbFByZXZpZXcsXG4gICAgaGFuZGxlRG93bmxvYWQ6IG9uSW50ZXJuYWxEb3dubG9hZFxuICB9KSk7XG4gIGNvbnN0IHtcbiAgICBnZXRQcmVmaXhDbHNcbiAgfSA9IFJlYWN0LnVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ3VwbG9hZCcsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIGNvbnN0IHJvb3RQcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoKTtcbiAgY29uc3QgbGlzdENsYXNzTmFtZXMgPSBjbGFzc05hbWVzKGAke3ByZWZpeENsc30tbGlzdGAsIGAke3ByZWZpeENsc30tbGlzdC0ke2xpc3RUeXBlfWApO1xuICBjb25zdCBsaXN0SXRlbU1vdGlvbiA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gb21pdChpbml0Q29sbGFwc2VNb3Rpb24ocm9vdFByZWZpeENscyksIFsnb25BcHBlYXJFbmQnLCAnb25FbnRlckVuZCcsICdvbkxlYXZlRW5kJ10pLCBbcm9vdFByZWZpeENsc10pO1xuICBjb25zdCBtb3Rpb25Db25maWcgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGlzUGljdHVyZUNhcmRPckNpcmxlID8ge30gOiBsaXN0SXRlbU1vdGlvbiksIHtcbiAgICBtb3Rpb25EZWFkbGluZTogMjAwMCxcbiAgICBtb3Rpb25OYW1lOiBgJHtwcmVmaXhDbHN9LSR7aXNQaWN0dXJlQ2FyZE9yQ2lybGUgPyAnYW5pbWF0ZS1pbmxpbmUnIDogJ2FuaW1hdGUnfWAsXG4gICAga2V5czogX3RvQ29uc3VtYWJsZUFycmF5KGl0ZW1zLm1hcChmaWxlID0+ICh7XG4gICAgICBrZXk6IGZpbGUudWlkLFxuICAgICAgZmlsZVxuICAgIH0pKSksXG4gICAgbW90aW9uQXBwZWFyXG4gIH0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogbGlzdENsYXNzTmFtZXNcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ1NTTW90aW9uTGlzdCwgT2JqZWN0LmFzc2lnbih7fSwgbW90aW9uQ29uZmlnLCB7XG4gICAgY29tcG9uZW50OiBmYWxzZVxuICB9KSwgX3JlZiA9PiB7XG4gICAgbGV0IHtcbiAgICAgIGtleSxcbiAgICAgIGZpbGUsXG4gICAgICBjbGFzc05hbWU6IG1vdGlvbkNsYXNzTmFtZSxcbiAgICAgIHN0eWxlOiBtb3Rpb25TdHlsZVxuICAgIH0gPSBfcmVmO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMaXN0SXRlbSwge1xuICAgICAga2V5OiBrZXksXG4gICAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgY2xhc3NOYW1lOiBtb3Rpb25DbGFzc05hbWUsXG4gICAgICBzdHlsZTogbW90aW9uU3R5bGUsXG4gICAgICBmaWxlOiBmaWxlLFxuICAgICAgaXRlbXM6IGl0ZW1zLFxuICAgICAgcHJvZ3Jlc3M6IHByb2dyZXNzLFxuICAgICAgbGlzdFR5cGU6IGxpc3RUeXBlLFxuICAgICAgaXNJbWdVcmw6IGlzSW1nVXJsLFxuICAgICAgc2hvd1ByZXZpZXdJY29uOiBzaG93UHJldmlld0ljb24sXG4gICAgICBzaG93UmVtb3ZlSWNvbjogc2hvd1JlbW92ZUljb24sXG4gICAgICBzaG93RG93bmxvYWRJY29uOiBzaG93RG93bmxvYWRJY29uLFxuICAgICAgcmVtb3ZlSWNvbjogcmVtb3ZlSWNvbixcbiAgICAgIHByZXZpZXdJY29uOiBwcmV2aWV3SWNvbixcbiAgICAgIGRvd25sb2FkSWNvbjogZG93bmxvYWRJY29uLFxuICAgICAgZXh0cmE6IGV4dHJhLFxuICAgICAgaWNvblJlbmRlcjogaW50ZXJuYWxJY29uUmVuZGVyLFxuICAgICAgYWN0aW9uSWNvblJlbmRlcjogYWN0aW9uSWNvblJlbmRlcixcbiAgICAgIGl0ZW1SZW5kZXI6IGl0ZW1SZW5kZXIsXG4gICAgICBvblByZXZpZXc6IG9uSW50ZXJuYWxQcmV2aWV3LFxuICAgICAgb25Eb3dubG9hZDogb25JbnRlcm5hbERvd25sb2FkLFxuICAgICAgb25DbG9zZTogb25JbnRlcm5hbENsb3NlXG4gICAgfSk7XG4gIH0pLCBhcHBlbmRBY3Rpb24gJiYgKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENTU01vdGlvbiwgT2JqZWN0LmFzc2lnbih7fSwgbW90aW9uQ29uZmlnLCB7XG4gICAgdmlzaWJsZTogYXBwZW5kQWN0aW9uVmlzaWJsZSxcbiAgICBmb3JjZVJlbmRlcjogdHJ1ZVxuICB9KSwgX3JlZjIgPT4ge1xuICAgIGxldCB7XG4gICAgICBjbGFzc05hbWU6IG1vdGlvbkNsYXNzTmFtZSxcbiAgICAgIHN0eWxlOiBtb3Rpb25TdHlsZVxuICAgIH0gPSBfcmVmMjtcbiAgICByZXR1cm4gY2xvbmVFbGVtZW50KGFwcGVuZEFjdGlvbiwgb3JpUHJvcHMgPT4gKHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhvcmlQcm9wcy5jbGFzc05hbWUsIG1vdGlvbkNsYXNzTmFtZSksXG4gICAgICBzdHlsZTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG1vdGlvblN0eWxlKSwge1xuICAgICAgICAvLyBwcmV2ZW50IHRoZSBlbGVtZW50IGhhcyBob3ZlciBjc3MgcHNldWRvLWNsYXNzIHRoYXQgbWF5IGNhdXNlIGFuaW1hdGlvbiB0byBlbmQgcHJlbWF0dXJlbHkuXG4gICAgICAgIHBvaW50ZXJFdmVudHM6IG1vdGlvbkNsYXNzTmFtZSA/ICdub25lJyA6IHVuZGVmaW5lZFxuICAgICAgfSksIG9yaVByb3BzLnN0eWxlKVxuICAgIH0pKTtcbiAgfSkpKTtcbn07XG5jb25zdCBVcGxvYWRMaXN0ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoSW50ZXJuYWxVcGxvYWRMaXN0KTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFVwbG9hZExpc3QuZGlzcGxheU5hbWUgPSAnVXBsb2FkTGlzdCc7XG59XG5leHBvcnQgZGVmYXVsdCBVcGxvYWRMaXN0OyIsICJpbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGUyT2JqKGZpbGUpIHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZmlsZSksIHtcbiAgICBsYXN0TW9kaWZpZWQ6IGZpbGUubGFzdE1vZGlmaWVkLFxuICAgIGxhc3RNb2RpZmllZERhdGU6IGZpbGUubGFzdE1vZGlmaWVkRGF0ZSxcbiAgICBuYW1lOiBmaWxlLm5hbWUsXG4gICAgc2l6ZTogZmlsZS5zaXplLFxuICAgIHR5cGU6IGZpbGUudHlwZSxcbiAgICB1aWQ6IGZpbGUudWlkLFxuICAgIHBlcmNlbnQ6IDAsXG4gICAgb3JpZ2luRmlsZU9iajogZmlsZVxuICB9KTtcbn1cbi8qKiBVcGxvYWQgZmlsZUxpc3QuIFJlcGxhY2UgZmlsZSBpZiBleGlzdCBvciBqdXN0IHB1c2ggaW50byBpdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVGaWxlTGlzdChmaWxlLCBmaWxlTGlzdCkge1xuICBjb25zdCBuZXh0RmlsZUxpc3QgPSBfdG9Db25zdW1hYmxlQXJyYXkoZmlsZUxpc3QpO1xuICBjb25zdCBmaWxlSW5kZXggPSBuZXh0RmlsZUxpc3QuZmluZEluZGV4KF9yZWYgPT4ge1xuICAgIGxldCB7XG4gICAgICB1aWRcbiAgICB9ID0gX3JlZjtcbiAgICByZXR1cm4gdWlkID09PSBmaWxlLnVpZDtcbiAgfSk7XG4gIGlmIChmaWxlSW5kZXggPT09IC0xKSB7XG4gICAgbmV4dEZpbGVMaXN0LnB1c2goZmlsZSk7XG4gIH0gZWxzZSB7XG4gICAgbmV4dEZpbGVMaXN0W2ZpbGVJbmRleF0gPSBmaWxlO1xuICB9XG4gIHJldHVybiBuZXh0RmlsZUxpc3Q7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlsZUl0ZW0oZmlsZSwgZmlsZUxpc3QpIHtcbiAgY29uc3QgbWF0Y2hLZXkgPSBmaWxlLnVpZCAhPT0gdW5kZWZpbmVkID8gJ3VpZCcgOiAnbmFtZSc7XG4gIHJldHVybiBmaWxlTGlzdC5maWx0ZXIoaXRlbSA9PiBpdGVtW21hdGNoS2V5XSA9PT0gZmlsZVttYXRjaEtleV0pWzBdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUZpbGVJdGVtKGZpbGUsIGZpbGVMaXN0KSB7XG4gIGNvbnN0IG1hdGNoS2V5ID0gZmlsZS51aWQgIT09IHVuZGVmaW5lZCA/ICd1aWQnIDogJ25hbWUnO1xuICBjb25zdCByZW1vdmVkID0gZmlsZUxpc3QuZmlsdGVyKGl0ZW0gPT4gaXRlbVttYXRjaEtleV0gIT09IGZpbGVbbWF0Y2hLZXldKTtcbiAgaWYgKHJlbW92ZWQubGVuZ3RoID09PSBmaWxlTGlzdC5sZW5ndGgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gcmVtb3ZlZDtcbn1cbi8vID09PT09PT09PT09PT09PT09PT09IERlZmF1bHQgSW1hZ2UgUHJldmlldyA9PT09PT09PT09PT09PT09PT09PVxuY29uc3QgZXh0bmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgbGV0IHVybCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJyc7XG4gIGNvbnN0IHRlbXAgPSB1cmwuc3BsaXQoJy8nKTtcbiAgY29uc3QgZmlsZW5hbWUgPSB0ZW1wW3RlbXAubGVuZ3RoIC0gMV07XG4gIGNvbnN0IGZpbGVuYW1lV2l0aG91dFN1ZmZpeCA9IGZpbGVuYW1lLnNwbGl0KC8jfFxcPy8pWzBdO1xuICByZXR1cm4gKC9cXC5bXi4vXFxcXF0qJC8uZXhlYyhmaWxlbmFtZVdpdGhvdXRTdWZmaXgpIHx8IFsnJ10pWzBdO1xufTtcbmNvbnN0IGlzSW1hZ2VGaWxlVHlwZSA9IHR5cGUgPT4gdHlwZS5pbmRleE9mKCdpbWFnZS8nKSA9PT0gMDtcbmV4cG9ydCBjb25zdCBpc0ltYWdlVXJsID0gZmlsZSA9PiB7XG4gIGlmIChmaWxlLnR5cGUgJiYgIWZpbGUudGh1bWJVcmwpIHtcbiAgICByZXR1cm4gaXNJbWFnZUZpbGVUeXBlKGZpbGUudHlwZSk7XG4gIH1cbiAgY29uc3QgdXJsID0gZmlsZS50aHVtYlVybCB8fCBmaWxlLnVybCB8fCAnJztcbiAgY29uc3QgZXh0ZW5zaW9uID0gZXh0bmFtZSh1cmwpO1xuICBpZiAoL15kYXRhOmltYWdlXFwvLy50ZXN0KHVybCkgfHwgLyh3ZWJwfHN2Z3xwbmd8Z2lmfGpwZ3xqcGVnfGpmaWZ8Ym1wfGRwZ3xpY298aGVpY3xoZWlmKSQvaS50ZXN0KGV4dGVuc2lvbikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoL15kYXRhOi8udGVzdCh1cmwpKSB7XG4gICAgLy8gb3RoZXIgZmlsZSB0eXBlcyBvZiBiYXNlNjRcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGV4dGVuc2lvbikge1xuICAgIC8vIG90aGVyIGZpbGUgdHlwZXMgd2hpY2ggaGF2ZSBleHRlbnNpb25cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xuY29uc3QgTUVBU1VSRV9TSVpFID0gMjAwO1xuZXhwb3J0IGZ1bmN0aW9uIHByZXZpZXdJbWFnZShmaWxlKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICBpZiAoIWZpbGUudHlwZSB8fCAhaXNJbWFnZUZpbGVUeXBlKGZpbGUudHlwZSkpIHtcbiAgICAgIHJlc29sdmUoJycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjYW52YXMud2lkdGggPSBNRUFTVVJFX1NJWkU7XG4gICAgY2FudmFzLmhlaWdodCA9IE1FQVNVUkVfU0laRTtcbiAgICBjYW52YXMuc3R5bGUuY3NzVGV4dCA9IGBwb3NpdGlvbjogZml4ZWQ7IGxlZnQ6IDA7IHRvcDogMDsgd2lkdGg6ICR7TUVBU1VSRV9TSVpFfXB4OyBoZWlnaHQ6ICR7TUVBU1VSRV9TSVpFfXB4OyB6LWluZGV4OiA5OTk5OyBkaXNwbGF5OiBub25lO2A7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjYW52YXMpO1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xuICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHdpZHRoLFxuICAgICAgICBoZWlnaHRcbiAgICAgIH0gPSBpbWc7XG4gICAgICBsZXQgZHJhd1dpZHRoID0gTUVBU1VSRV9TSVpFO1xuICAgICAgbGV0IGRyYXdIZWlnaHQgPSBNRUFTVVJFX1NJWkU7XG4gICAgICBsZXQgb2Zmc2V0WCA9IDA7XG4gICAgICBsZXQgb2Zmc2V0WSA9IDA7XG4gICAgICBpZiAod2lkdGggPiBoZWlnaHQpIHtcbiAgICAgICAgZHJhd0hlaWdodCA9IGhlaWdodCAqIChNRUFTVVJFX1NJWkUgLyB3aWR0aCk7XG4gICAgICAgIG9mZnNldFkgPSAtKGRyYXdIZWlnaHQgLSBkcmF3V2lkdGgpIC8gMjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRyYXdXaWR0aCA9IHdpZHRoICogKE1FQVNVUkVfU0laRSAvIGhlaWdodCk7XG4gICAgICAgIG9mZnNldFggPSAtKGRyYXdXaWR0aCAtIGRyYXdIZWlnaHQpIC8gMjtcbiAgICAgIH1cbiAgICAgIGN0eC5kcmF3SW1hZ2UoaW1nLCBvZmZzZXRYLCBvZmZzZXRZLCBkcmF3V2lkdGgsIGRyYXdIZWlnaHQpO1xuICAgICAgY29uc3QgZGF0YVVSTCA9IGNhbnZhcy50b0RhdGFVUkwoKTtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoY2FudmFzKTtcbiAgICAgIHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKGltZy5zcmMpO1xuICAgICAgcmVzb2x2ZShkYXRhVVJMKTtcbiAgICB9O1xuICAgIGltZy5jcm9zc09yaWdpbiA9ICdhbm9ueW1vdXMnO1xuICAgIGlmIChmaWxlLnR5cGUuc3RhcnRzV2l0aCgnaW1hZ2Uvc3ZnK3htbCcpKSB7XG4gICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgaWYgKHJlYWRlci5yZXN1bHQgJiYgdHlwZW9mIHJlYWRlci5yZXN1bHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgaW1nLnNyYyA9IHJlYWRlci5yZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcbiAgICB9IGVsc2UgaWYgKGZpbGUudHlwZS5zdGFydHNXaXRoKCdpbWFnZS9naWYnKSkge1xuICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgIGlmIChyZWFkZXIucmVzdWx0KSB7XG4gICAgICAgICAgcmVzb2x2ZShyZWFkZXIucmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbWcuc3JjID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoZmlsZSk7XG4gICAgfVxuICB9KTtcbn0iLCAiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBEZWxldGVPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvRGVsZXRlT3V0bGluZWRcIjtcbmltcG9ydCBEb3dubG9hZE91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9Eb3dubG9hZE91dGxpbmVkXCI7XG5pbXBvcnQgRXllT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0V5ZU91dGxpbmVkXCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBDU1NNb3Rpb24gZnJvbSAncmMtbW90aW9uJztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi8uLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IFByb2dyZXNzIGZyb20gJy4uLy4uL3Byb2dyZXNzJztcbmltcG9ydCBUb29sdGlwIGZyb20gJy4uLy4uL3Rvb2x0aXAnO1xuY29uc3QgTGlzdEl0ZW0gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoX3JlZiwgcmVmKSA9PiB7XG4gIGxldCB7XG4gICAgcHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZSxcbiAgICBzdHlsZSxcbiAgICBsb2NhbGUsXG4gICAgbGlzdFR5cGUsXG4gICAgZmlsZSxcbiAgICBpdGVtcyxcbiAgICBwcm9ncmVzczogcHJvZ3Jlc3NQcm9wcyxcbiAgICBpY29uUmVuZGVyLFxuICAgIGFjdGlvbkljb25SZW5kZXIsXG4gICAgaXRlbVJlbmRlcixcbiAgICBpc0ltZ1VybCxcbiAgICBzaG93UHJldmlld0ljb24sXG4gICAgc2hvd1JlbW92ZUljb24sXG4gICAgc2hvd0Rvd25sb2FkSWNvbixcbiAgICBwcmV2aWV3SWNvbjogY3VzdG9tUHJldmlld0ljb24sXG4gICAgcmVtb3ZlSWNvbjogY3VzdG9tUmVtb3ZlSWNvbixcbiAgICBkb3dubG9hZEljb246IGN1c3RvbURvd25sb2FkSWNvbixcbiAgICBleHRyYTogY3VzdG9tRXh0cmEsXG4gICAgb25QcmV2aWV3LFxuICAgIG9uRG93bmxvYWQsXG4gICAgb25DbG9zZVxuICB9ID0gX3JlZjtcbiAgdmFyIF9hLCBfYjtcbiAgLy8gU3RhdHVzOiB3aGljaCB3aWxsIGlnbm9yZSBgcmVtb3ZlZGAgc3RhdHVzXG4gIGNvbnN0IHtcbiAgICBzdGF0dXNcbiAgfSA9IGZpbGU7XG4gIGNvbnN0IFttZXJnZWRTdGF0dXMsIHNldE1lcmdlZFN0YXR1c10gPSBSZWFjdC51c2VTdGF0ZShzdGF0dXMpO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChzdGF0dXMgIT09ICdyZW1vdmVkJykge1xuICAgICAgc2V0TWVyZ2VkU3RhdHVzKHN0YXR1cyk7XG4gICAgfVxuICB9LCBbc3RhdHVzXSk7XG4gIC8vIERlbGF5IHRvIHNob3cgdGhlIHByb2dyZXNzIGJhclxuICBjb25zdCBbc2hvd1Byb2dyZXNzLCBzZXRTaG93UHJvZ3Jlc3NdID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBzZXRTaG93UHJvZ3Jlc3ModHJ1ZSk7XG4gICAgfSwgMzAwKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIGNvbnN0IGljb25Ob2RlID0gaWNvblJlbmRlcihmaWxlKTtcbiAgbGV0IGljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBgJHtwcmVmaXhDbHN9LWljb25gXG4gIH0sIGljb25Ob2RlKTtcbiAgaWYgKGxpc3RUeXBlID09PSAncGljdHVyZScgfHwgbGlzdFR5cGUgPT09ICdwaWN0dXJlLWNhcmQnIHx8IGxpc3RUeXBlID09PSAncGljdHVyZS1jaXJjbGUnKSB7XG4gICAgaWYgKG1lcmdlZFN0YXR1cyA9PT0gJ3VwbG9hZGluZycgfHwgIWZpbGUudGh1bWJVcmwgJiYgIWZpbGUudXJsKSB7XG4gICAgICBjb25zdCB1cGxvYWRpbmdDbGFzc05hbWUgPSBjbGFzc05hbWVzKGAke3ByZWZpeENsc30tbGlzdC1pdGVtLXRodW1ibmFpbGAsIHtcbiAgICAgICAgW2Ake3ByZWZpeENsc30tbGlzdC1pdGVtLWZpbGVgXTogbWVyZ2VkU3RhdHVzICE9PSAndXBsb2FkaW5nJ1xuICAgICAgfSk7XG4gICAgICBpY29uID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IHVwbG9hZGluZ0NsYXNzTmFtZVxuICAgICAgfSwgaWNvbk5vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0aHVtYm5haWwgPSAoaXNJbWdVcmwgPT09IG51bGwgfHwgaXNJbWdVcmwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGlzSW1nVXJsKGZpbGUpKSA/ICgvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImltZ1wiLCB7XG4gICAgICAgIHNyYzogZmlsZS50aHVtYlVybCB8fCBmaWxlLnVybCxcbiAgICAgICAgYWx0OiBmaWxlLm5hbWUsXG4gICAgICAgIGNsYXNzTmFtZTogYCR7cHJlZml4Q2xzfS1saXN0LWl0ZW0taW1hZ2VgLFxuICAgICAgICBjcm9zc09yaWdpbjogZmlsZS5jcm9zc09yaWdpblxuICAgICAgfSkpIDogaWNvbk5vZGU7XG4gICAgICBjb25zdCBhQ2xhc3NOYW1lID0gY2xhc3NOYW1lcyhgJHtwcmVmaXhDbHN9LWxpc3QtaXRlbS10aHVtYm5haWxgLCB7XG4gICAgICAgIFtgJHtwcmVmaXhDbHN9LWxpc3QtaXRlbS1maWxlYF06IGlzSW1nVXJsICYmICFpc0ltZ1VybChmaWxlKVxuICAgICAgfSk7XG4gICAgICBpY29uID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJhXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBhQ2xhc3NOYW1lLFxuICAgICAgICBvbkNsaWNrOiBlID0+IG9uUHJldmlldyhmaWxlLCBlKSxcbiAgICAgICAgaHJlZjogZmlsZS51cmwgfHwgZmlsZS50aHVtYlVybCxcbiAgICAgICAgdGFyZ2V0OiBcIl9ibGFua1wiLFxuICAgICAgICByZWw6IFwibm9vcGVuZXIgbm9yZWZlcnJlclwiXG4gICAgICB9LCB0aHVtYm5haWwpO1xuICAgIH1cbiAgfVxuICBjb25zdCBsaXN0SXRlbUNsYXNzTmFtZSA9IGNsYXNzTmFtZXMoYCR7cHJlZml4Q2xzfS1saXN0LWl0ZW1gLCBgJHtwcmVmaXhDbHN9LWxpc3QtaXRlbS0ke21lcmdlZFN0YXR1c31gKTtcbiAgY29uc3QgbGlua1Byb3BzID0gdHlwZW9mIGZpbGUubGlua1Byb3BzID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UoZmlsZS5saW5rUHJvcHMpIDogZmlsZS5saW5rUHJvcHM7XG4gIGNvbnN0IHJlbW92ZUljb24gPSAodHlwZW9mIHNob3dSZW1vdmVJY29uID09PSAnZnVuY3Rpb24nID8gc2hvd1JlbW92ZUljb24oZmlsZSkgOiBzaG93UmVtb3ZlSWNvbikgPyBhY3Rpb25JY29uUmVuZGVyKCh0eXBlb2YgY3VzdG9tUmVtb3ZlSWNvbiA9PT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbVJlbW92ZUljb24oZmlsZSkgOiBjdXN0b21SZW1vdmVJY29uKSB8fCAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRGVsZXRlT3V0bGluZWQsIG51bGwpKSwgKCkgPT4gb25DbG9zZShmaWxlKSwgcHJlZml4Q2xzLCBsb2NhbGUucmVtb3ZlRmlsZSxcbiAgLy8gYWNjZXB0VXBsb2FkRGlzYWJsZWQgaXMgdHJ1ZSwgb25seSByZW1vdmUgaWNvbiB3aWxsIGZvbGxvdyBVcGxvYWQgZGlzYWJsZWQgcHJvcFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy80NjE3MVxuICB0cnVlKSA6IG51bGw7XG4gIGNvbnN0IGRvd25sb2FkSWNvbiA9ICh0eXBlb2Ygc2hvd0Rvd25sb2FkSWNvbiA9PT0gJ2Z1bmN0aW9uJyA/IHNob3dEb3dubG9hZEljb24oZmlsZSkgOiBzaG93RG93bmxvYWRJY29uKSAmJiBtZXJnZWRTdGF0dXMgPT09ICdkb25lJyA/IGFjdGlvbkljb25SZW5kZXIoKHR5cGVvZiBjdXN0b21Eb3dubG9hZEljb24gPT09ICdmdW5jdGlvbicgPyBjdXN0b21Eb3dubG9hZEljb24oZmlsZSkgOiBjdXN0b21Eb3dubG9hZEljb24pIHx8IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERvd25sb2FkT3V0bGluZWQsIG51bGwpLCAoKSA9PiBvbkRvd25sb2FkKGZpbGUpLCBwcmVmaXhDbHMsIGxvY2FsZS5kb3dubG9hZEZpbGUpIDogbnVsbDtcbiAgY29uc3QgZG93bmxvYWRPckRlbGV0ZSA9IGxpc3RUeXBlICE9PSAncGljdHVyZS1jYXJkJyAmJiBsaXN0VHlwZSAhPT0gJ3BpY3R1cmUtY2lyY2xlJyAmJiAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBrZXk6IFwiZG93bmxvYWQtZGVsZXRlXCIsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGAke3ByZWZpeENsc30tbGlzdC1pdGVtLWFjdGlvbnNgLCB7XG4gICAgICBwaWN0dXJlOiBsaXN0VHlwZSA9PT0gJ3BpY3R1cmUnXG4gICAgfSlcbiAgfSwgZG93bmxvYWRJY29uLCByZW1vdmVJY29uKSk7XG4gIGNvbnN0IGV4dHJhQ29udGVudCA9IHR5cGVvZiBjdXN0b21FeHRyYSA9PT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbUV4dHJhKGZpbGUpIDogY3VzdG9tRXh0cmE7XG4gIGNvbnN0IGV4dHJhID0gZXh0cmFDb250ZW50ICYmICgvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogYCR7cHJlZml4Q2xzfS1saXN0LWl0ZW0tZXh0cmFgXG4gIH0sIGV4dHJhQ29udGVudCkpO1xuICBjb25zdCBsaXN0SXRlbU5hbWVDbGFzcyA9IGNsYXNzTmFtZXMoYCR7cHJlZml4Q2xzfS1saXN0LWl0ZW0tbmFtZWApO1xuICBjb25zdCBmaWxlTmFtZSA9IGZpbGUudXJsID8gKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiYVwiLCBPYmplY3QuYXNzaWduKHtcbiAgICBrZXk6IFwidmlld1wiLFxuICAgIHRhcmdldDogXCJfYmxhbmtcIixcbiAgICByZWw6IFwibm9vcGVuZXIgbm9yZWZlcnJlclwiLFxuICAgIGNsYXNzTmFtZTogbGlzdEl0ZW1OYW1lQ2xhc3MsXG4gICAgdGl0bGU6IGZpbGUubmFtZVxuICB9LCBsaW5rUHJvcHMsIHtcbiAgICBocmVmOiBmaWxlLnVybCxcbiAgICBvbkNsaWNrOiBlID0+IG9uUHJldmlldyhmaWxlLCBlKVxuICB9KSwgZmlsZS5uYW1lLCBleHRyYSkpIDogKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAga2V5OiBcInZpZXdcIixcbiAgICBjbGFzc05hbWU6IGxpc3RJdGVtTmFtZUNsYXNzLFxuICAgIG9uQ2xpY2s6IGUgPT4gb25QcmV2aWV3KGZpbGUsIGUpLFxuICAgIHRpdGxlOiBmaWxlLm5hbWVcbiAgfSwgZmlsZS5uYW1lLCBleHRyYSkpO1xuICBjb25zdCBwcmV2aWV3SWNvbiA9ICh0eXBlb2Ygc2hvd1ByZXZpZXdJY29uID09PSAnZnVuY3Rpb24nID8gc2hvd1ByZXZpZXdJY29uKGZpbGUpIDogc2hvd1ByZXZpZXdJY29uKSAmJiAoZmlsZS51cmwgfHwgZmlsZS50aHVtYlVybCkgPyAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJhXCIsIHtcbiAgICBocmVmOiBmaWxlLnVybCB8fCBmaWxlLnRodW1iVXJsLFxuICAgIHRhcmdldDogXCJfYmxhbmtcIixcbiAgICByZWw6IFwibm9vcGVuZXIgbm9yZWZlcnJlclwiLFxuICAgIG9uQ2xpY2s6IGUgPT4gb25QcmV2aWV3KGZpbGUsIGUpLFxuICAgIHRpdGxlOiBsb2NhbGUucHJldmlld0ZpbGVcbiAgfSwgdHlwZW9mIGN1c3RvbVByZXZpZXdJY29uID09PSAnZnVuY3Rpb24nID8gY3VzdG9tUHJldmlld0ljb24oZmlsZSkgOiBjdXN0b21QcmV2aWV3SWNvbiB8fCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFeWVPdXRsaW5lZCwgbnVsbCkpKSA6IG51bGw7XG4gIGNvbnN0IHBpY3R1cmVDYXJkQWN0aW9ucyA9IChsaXN0VHlwZSA9PT0gJ3BpY3R1cmUtY2FyZCcgfHwgbGlzdFR5cGUgPT09ICdwaWN0dXJlLWNpcmNsZScpICYmIG1lcmdlZFN0YXR1cyAhPT0gJ3VwbG9hZGluZycgJiYgKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBgJHtwcmVmaXhDbHN9LWxpc3QtaXRlbS1hY3Rpb25zYFxuICB9LCBwcmV2aWV3SWNvbiwgbWVyZ2VkU3RhdHVzID09PSAnZG9uZScgJiYgZG93bmxvYWRJY29uLCByZW1vdmVJY29uKSk7XG4gIGNvbnN0IHtcbiAgICBnZXRQcmVmaXhDbHNcbiAgfSA9IFJlYWN0LnVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCk7XG4gIGNvbnN0IHJvb3RQcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoKTtcbiAgY29uc3QgZG9tID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogbGlzdEl0ZW1DbGFzc05hbWVcbiAgfSwgaWNvbiwgZmlsZU5hbWUsIGRvd25sb2FkT3JEZWxldGUsIHBpY3R1cmVDYXJkQWN0aW9ucywgc2hvd1Byb2dyZXNzICYmICgvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDU1NNb3Rpb24sIHtcbiAgICBtb3Rpb25OYW1lOiBgJHtyb290UHJlZml4Q2xzfS1mYWRlYCxcbiAgICB2aXNpYmxlOiBtZXJnZWRTdGF0dXMgPT09ICd1cGxvYWRpbmcnLFxuICAgIG1vdGlvbkRlYWRsaW5lOiAyMDAwXG4gIH0sIF9yZWYyID0+IHtcbiAgICBsZXQge1xuICAgICAgY2xhc3NOYW1lOiBtb3Rpb25DbGFzc05hbWVcbiAgICB9ID0gX3JlZjI7XG4gICAgLy8gc2hvdyBsb2FkaW5nIGljb24gaWYgdXBsb2FkIHByb2dyZXNzIGxpc3RlbmVyIGlzIGRpc2FibGVkXG4gICAgY29uc3QgbG9hZGluZ1Byb2dyZXNzID0gJ3BlcmNlbnQnIGluIGZpbGUgPyAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUHJvZ3Jlc3MsIE9iamVjdC5hc3NpZ24oe30sIHByb2dyZXNzUHJvcHMsIHtcbiAgICAgIHR5cGU6IFwibGluZVwiLFxuICAgICAgcGVyY2VudDogZmlsZS5wZXJjZW50LFxuICAgICAgXCJhcmlhLWxhYmVsXCI6IGZpbGVbJ2FyaWEtbGFiZWwnXSxcbiAgICAgIFwiYXJpYS1sYWJlbGxlZGJ5XCI6IGZpbGVbJ2FyaWEtbGFiZWxsZWRieSddXG4gICAgfSkpKSA6IG51bGw7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhgJHtwcmVmaXhDbHN9LWxpc3QtaXRlbS1wcm9ncmVzc2AsIG1vdGlvbkNsYXNzTmFtZSlcbiAgICB9LCBsb2FkaW5nUHJvZ3Jlc3MpO1xuICB9KSkpO1xuICBjb25zdCBtZXNzYWdlID0gZmlsZS5yZXNwb25zZSAmJiB0eXBlb2YgZmlsZS5yZXNwb25zZSA9PT0gJ3N0cmluZycgPyBmaWxlLnJlc3BvbnNlIDogKChfYSA9IGZpbGUuZXJyb3IpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zdGF0dXNUZXh0KSB8fCAoKF9iID0gZmlsZS5lcnJvcikgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLm1lc3NhZ2UpIHx8IGxvY2FsZS51cGxvYWRFcnJvcjtcbiAgY29uc3QgaXRlbSA9IG1lcmdlZFN0YXR1cyA9PT0gJ2Vycm9yJyA/ICgvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwLCB7XG4gICAgdGl0bGU6IG1lc3NhZ2UsXG4gICAgZ2V0UG9wdXBDb250YWluZXI6IG5vZGUgPT4gbm9kZS5wYXJlbnROb2RlXG4gIH0sIGRvbSkpIDogZG9tO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhgJHtwcmVmaXhDbHN9LWxpc3QtaXRlbS1jb250YWluZXJgLCBjbGFzc05hbWUpLFxuICAgIHN0eWxlOiBzdHlsZSxcbiAgICByZWY6IHJlZlxuICB9LCBpdGVtUmVuZGVyID8gaXRlbVJlbmRlcihpdGVtLCBmaWxlLCBpdGVtcywge1xuICAgIGRvd25sb2FkOiBvbkRvd25sb2FkLmJpbmQobnVsbCwgZmlsZSksXG4gICAgcHJldmlldzogb25QcmV2aWV3LmJpbmQobnVsbCwgZmlsZSksXG4gICAgcmVtb3ZlOiBvbkNsb3NlLmJpbmQobnVsbCwgZmlsZSlcbiAgfSkgOiBpdGVtKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgTGlzdEl0ZW07IiwgIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgRHJhZ2dlciBmcm9tICcuL0RyYWdnZXInO1xuaW1wb3J0IEludGVybmFsVXBsb2FkLCB7IExJU1RfSUdOT1JFIH0gZnJvbSAnLi9VcGxvYWQnO1xuY29uc3QgVXBsb2FkID0gSW50ZXJuYWxVcGxvYWQ7XG5VcGxvYWQuRHJhZ2dlciA9IERyYWdnZXI7XG5VcGxvYWQuTElTVF9JR05PUkUgPSBMSVNUX0lHTk9SRTtcbmV4cG9ydCBkZWZhdWx0IFVwbG9hZDsiLCAiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgV29ya2Zsb3dFZGl0IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9zcmMvY29tbW9uL1dvcmtmbG93RWRpdFwiXG5pbXBvcnQgeyBzZXRXaWRnZXRWYWx1ZSB9IGZyb20gXCIuLi8uLi9ncmFwaC10by1mb3JtLm1qc1wiO1xuaW1wb3J0IHsgTnVtYmVyV2lkZ2V0IH0gZnJvbSBcIi4vd2lkZ2V0cy9udW1iZXJcIjtcbmltcG9ydCB7IENvbWJvV2lkZ2V0IH0gZnJvbSBcIi4vd2lkZ2V0cy9jb21ib1wiO1xuaW1wb3J0IHsgVG9nZ2xlV2lkZ2V0IH0gZnJvbSBcIi4vd2lkZ2V0cy90b2dnbGVcIjtcbmltcG9ydCB7IFN0cmluZ1dpZGdldCB9IGZyb20gXCIuL3dpZGdldHMvc3RyaW5nXCI7XG5pbXBvcnQgaTE4biBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbW1vbi9pMThuLm10c1wiO1xuaW1wb3J0IHsgQ29uZmlnUHJvdmlkZXIsIElucHV0IH0gZnJvbSBcImFudGRcIjtcbmltcG9ydCB7IEVkaXRhYmxlVGl0bGUgfSBmcm9tIFwiLi93aWRnZXRzL0VkaXRhYmxlVGl0bGVcIjtcbmltcG9ydCB7IENvbWZ5U29ja2V0IH0gZnJvbSBcIi4uLy4uL3NvY2tldC9Db21meVNvY2tldC5tdHNcIjtcbmltcG9ydCB7IEltYWdlV2lkZ2V0IH0gZnJvbSBcIi4vd2lkZ2V0cy9pbWFnZV9tYXNrX3BhdGhcIjtcbmltcG9ydCB7IFdpZGdldFRhYmxlU3RydWN0dXJlLCBXaWRnZXRUYWJsZVN0cnVjdHVyZU5vZGUsIFdpZGdldFRhYmxlVmFsdWUgfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vc3JjL3R5cGVzL3NkcHBwXCI7XG5pbXBvcnQgeyBwYWdlU3RvcmUgfSBmcm9tIFwicGhvdG9zaG9wTW9kZWxzLm1qc1wiO1xuZGVjbGFyZSBjb25zdCBhcHA6IGFueTtcbmNvbnN0IGFwaSA9ICh3aW5kb3cgYXMgYW55KS5jb21meUFQSS5hcGkuYXBpO1xuZXhwb3J0IGNsYXNzIFdvcmtmbG93RWRpdFdyYXAgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8e1xufSwge1xuICAgIHdpZGdldFRhYmxlU3RydWN0dXJlOiBXaWRnZXRUYWJsZVN0cnVjdHVyZSxcbiAgICB3aWRnZXRUYWJsZVZhbHVlOiBXaWRnZXRUYWJsZVZhbHVlLFxuICAgIHdpZGdldFRhYmxlRXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICAgIGNvbWZ5U3RhdHVzOiB7XG4gICAgICAgIHNpZDogc3RyaW5nLFxuICAgICAgICBzc2lkOiBzdHJpbmcsXG4gICAgICAgIHByb2dyZXNzOiBudW1iZXIsXG4gICAgICAgIHF1ZXVlU2l6ZTogbnVtYmVyLFxuICAgICAgICBsYXN0RXJyb3I6IHN0cmluZyxcbiAgICAgICAgZXhlY3V0aW5nTm9kZVRpdGxlOiBzdHJpbmcsXG4gICAgfSxcbn0+IHtcbiAgICBzdGF0ZSA9IHtcbiAgICAgICAgY29tZnlTdGF0dXM6IHtcbiAgICAgICAgICAgIHNpZDogJycsXG4gICAgICAgICAgICBzc2lkOiAnJyxcbiAgICAgICAgICAgIHByb2dyZXNzOiAwLFxuICAgICAgICAgICAgcXVldWVTaXplOiAwLFxuICAgICAgICAgICAgbGFzdEVycm9yOiAnJyxcbiAgICAgICAgICAgIGV4ZWN1dGluZ05vZGVUaXRsZTogJycsXG4gICAgICAgIH0sXG4gICAgICAgIHdpZGdldFRhYmxlU3RydWN0dXJlOiBwYWdlU3RvcmUuZGF0YS53aWRnZXRUYWJsZVN0cnVjdHVyZSxcbiAgICAgICAgd2lkZ2V0VGFibGVWYWx1ZTogcGFnZVN0b3JlLmRhdGEud2lkZ2V0VGFibGVWYWx1ZSxcbiAgICAgICAgd2lkZ2V0VGFibGVFcnJvcnM6IHBhZ2VTdG9yZS5kYXRhLndpZGdldFRhYmxlRXJyb3JzLFxuICAgIH1cblxuICAgIHByaXZhdGUgZXZlbnRMaXN0ZW5lcnM6IHsgZXZlbnQ6IHN0cmluZzsgaGFuZGxlcjogKGU6IGFueSkgPT4gdm9pZCB9W10gPSBbXTtcbiAgICBwcml2YXRlIHVuc3Vic2NyaWJlczogKCgpID0+IHZvaWQpW10gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpXG5cbiAgICAgICAgY29uc3QgYWRkTGlzdGVuZXIgPSAoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogKGU6IGFueSkgPT4gdm9pZCkgPT4ge1xuICAgICAgICAgICAgYXBpLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIpO1xuICAgICAgICAgICAgdGhpcy5ldmVudExpc3RlbmVycy5wdXNoKHsgZXZlbnQsIGhhbmRsZXIgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgYWRkTGlzdGVuZXIoXCJwcm9ncmVzc1wiLCAoeyBkZXRhaWwgfTogeyBkZXRhaWw6IHsgdmFsdWU6IG51bWJlciwgbWF4OiBudW1iZXIgfSB9KSA9PiB7XG4gICAgICAgICAgICBpZiAoIWRldGFpbCB8fCBpc05hTihkZXRhaWwudmFsdWUgLyBkZXRhaWwubWF4KSkgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgcHJvZ3Jlc3MgPSBNYXRoLnJvdW5kKChkZXRhaWwudmFsdWUgLyBkZXRhaWwubWF4KSAqIDEwMCk7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBjb21meVN0YXR1czoge1xuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLnN0YXRlLmNvbWZ5U3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzczogcHJvZ3Jlc3NcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYWRkTGlzdGVuZXIoXCJzdGF0dXNcIiwgKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFlLmRldGFpbD8uZXhlY19pbmZvKSByZXR1cm47XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBjb21meVN0YXR1czoge1xuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLnN0YXRlLmNvbWZ5U3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICBxdWV1ZVNpemU6IGUuZGV0YWlsLmV4ZWNfaW5mby5xdWV1ZV9yZW1haW5pbmdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYWRkTGlzdGVuZXIoXCJleGVjdXRpb25fZXJyb3JcIiwgKHsgZGV0YWlsIH06IHsgZGV0YWlsOiB7IGV4Y2VwdGlvbl9tZXNzYWdlOiBzdHJpbmcgfSB9KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBjb21meVN0YXR1czoge1xuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLnN0YXRlLmNvbWZ5U3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICBsYXN0RXJyb3I6IGRldGFpbC5leGNlcHRpb25fbWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW5nTm9kZVRpdGxlOiAnJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBhZGRMaXN0ZW5lcihcImV4ZWN1dGlvbl9zdGFydFwiLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBjb21meVN0YXR1czoge1xuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLnN0YXRlLmNvbWZ5U3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICBsYXN0RXJyb3I6ICcnLFxuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzczogMCxcbiAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW5nTm9kZVRpdGxlOiAnJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBhZGRMaXN0ZW5lcihcImV4ZWN1dGluZ1wiLCAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBleGVjdXRpbmdOb2RlSUQgPSBlLmRldGFpbFxuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IGFwcC5ncmFwaC5ub2Rlcy5maW5kKChuOiBhbnkpID0+IG4uaWQgPT0gZXhlY3V0aW5nTm9kZUlEKVxuICAgICAgICAgICAgaWYgKG5vZGUpXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIGNvbWZ5U3RhdHVzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi50aGlzLnN0YXRlLmNvbWZ5U3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW5nTm9kZVRpdGxlOiBub2RlLnRpdGxlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcblxuICAgICAgICBhZGRMaXN0ZW5lcihcImV4ZWN1dGlvbl9zdWNjZXNzXCIsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIGNvbWZ5U3RhdHVzOiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUuY29tZnlTdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzOiAwLFxuICAgICAgICAgICAgICAgICAgICBleGVjdXRpbmdOb2RlVGl0bGU6ICcnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGFkZExpc3RlbmVyKFwiZXhlY3V0aW9uX2ludGVycnVwdGVkXCIsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIGNvbWZ5U3RhdHVzOiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUuY29tZnlTdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzOiAwLFxuICAgICAgICAgICAgICAgICAgICBleGVjdXRpbmdOb2RlVGl0bGU6ICcnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHN0cnVjdHVyZUNhbGxiYWNrID0gKHd0U3RydWN0dXJlOiBXaWRnZXRUYWJsZVN0cnVjdHVyZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgd2lkZ2V0VGFibGVTdHJ1Y3R1cmU6IHd0U3RydWN0dXJlXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIHBhZ2VTdG9yZS5zdWJzY3JpYmUoJy93aWRnZXRUYWJsZVN0cnVjdHVyZScsIHN0cnVjdHVyZUNhbGxiYWNrKVxuICAgICAgICBjb25zdCB2YWx1ZUNhbGxiYWNrID0gKHd0VmFsdWU6IFdpZGdldFRhYmxlVmFsdWUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIHdpZGdldFRhYmxlVmFsdWU6IHd0VmFsdWVcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgcGFnZVN0b3JlLnN1YnNjcmliZSgnL3dpZGdldFRhYmxlVmFsdWUnLCB2YWx1ZUNhbGxiYWNrKVxuICAgICAgICBjb25zdCBlcnJvcnNDYWxsYmFjayA9ICh3dEVycm9yczogUmVjb3JkPHN0cmluZywgc3RyaW5nPikgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgd2lkZ2V0VGFibGVFcnJvcnM6IHd0RXJyb3JzXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIHBhZ2VTdG9yZS5zdWJzY3JpYmUoJy93aWRnZXRUYWJsZUVycm9ycycsIGVycm9yc0NhbGxiYWNrKVxuICAgICAgICB0aGlzLnVuc3Vic2NyaWJlcy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgIHBhZ2VTdG9yZS51bnN1YnNjcmliZShzdHJ1Y3R1cmVDYWxsYmFjaylcbiAgICAgICAgICAgIHBhZ2VTdG9yZS51bnN1YnNjcmliZSh2YWx1ZUNhbGxiYWNrKVxuICAgICAgICAgICAgcGFnZVN0b3JlLnVuc3Vic2NyaWJlKGVycm9yc0NhbGxiYWNrKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLmZvckVhY2goKHsgZXZlbnQsIGhhbmRsZXIgfSkgPT4ge1xuICAgICAgICAgICAgYXBpLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZXMuZm9yRWFjaCgodW5zdWJzY3JpYmUpID0+IHVuc3Vic2NyaWJlKCkpXG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCBlZGl0UHJvcHMgPSB7XG4gICAgICAgICAgICB3aWRnZXRUYWJsZVN0cnVjdHVyZTogdGhpcy5zdGF0ZS53aWRnZXRUYWJsZVN0cnVjdHVyZSxcbiAgICAgICAgICAgIHdpZGdldFRhYmxlVmFsdWU6IHRoaXMuc3RhdGUud2lkZ2V0VGFibGVWYWx1ZSxcbiAgICAgICAgICAgIHdpZGdldFRhYmxlRXJyb3JzOiB0aGlzLnN0YXRlLndpZGdldFRhYmxlRXJyb3JzLFxuICAgICAgICAgICAgLy8gY29tZnlTdGF0dXM6IHtcbiAgICAgICAgICAgIC8vICAgICBzaWQ6IHRoaXMuc3RhdGUuY29tZnlTdGF0dXMuc2lkLFxuICAgICAgICAgICAgLy8gICAgIHNzaWQ6IHRoaXMuc3RhdGUuY29tZnlTdGF0dXMuc3NpZCxcbiAgICAgICAgICAgIC8vICAgICBwcm9ncmVzczogdGhpcy5zdGF0ZS5jb21meVN0YXR1cy5wcm9ncmVzcyxcbiAgICAgICAgICAgIC8vICAgICBxdWV1ZVNpemU6IHRoaXMuc3RhdGUuY29tZnlTdGF0dXMucXVldWVTaXplLFxuICAgICAgICAgICAgLy8gICAgIGxhc3RFcnJvcjogdGhpcy5zdGF0ZS5jb21meVN0YXR1cy5sYXN0RXJyb3IsXG4gICAgICAgICAgICAvLyAgICAgZXhlY3V0aW5nTm9kZVRpdGxlOiB0aGlzLnN0YXRlLmNvbWZ5U3RhdHVzLmV4ZWN1dGluZ05vZGVUaXRsZSxcbiAgICAgICAgICAgIC8vIH0sXG4gICAgICAgICAgICBvbldpZGdldENoYW5nZTogYXN5bmMgKG5vZGVpZDogbnVtYmVyLCB3aWRnZXRJbmRleDogbnVtYmVyLCB2YWx1ZTogYW55LCBmaWVsZEluZm86IFdpZGdldFRhYmxlU3RydWN0dXJlTm9kZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBhcHAuZ3JhcGgubm9kZXMuZmluZCgobjogYW55KSA9PiBuLmlkID09IG5vZGVpZCk7XG4gICAgICAgICAgICAgICAgaWYgKCFub2RlKSByZXR1cm47XG4gICAgICAgICAgICAgICAgc2V0V2lkZ2V0VmFsdWUobm9kZSwgd2lkZ2V0SW5kZXgsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAvLyB9LFxuICAgICAgICAgICAgICAgIC8vIG9uUnVuOiBhc3luYyAoc2l6ZTogbnVtYmVyID0gMSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkrKylcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGFwcC5xdWV1ZVByb21wdCgpO1xuICAgICAgICAgICAgICAgIC8vIH0sXG4gICAgICAgICAgICAgICAgLy8gb25TYXZlOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbnN0IHdvcmtmbG93TWFuYWdlciA9IGFwcC53b3JrZmxvd01hbmFnZXIgfHwgYXBwLmV4dGVuc2lvbk1hbmFnZXIud29ya2Zsb3dcbiAgICAgICAgICAgICAgICAvLyAgICAgY29uc3Qgd29ya2Zsb3cgPSB3b3JrZmxvd01hbmFnZXIuYWN0aXZlV29ya2Zsb3dcbiAgICAgICAgICAgICAgICAvLyAgICAgd29ya2Zsb3cuY2hhbmdlVHJhY2tlci5jaGVja1N0YXRlKClcbiAgICAgICAgICAgICAgICAvLyAgICAgYXdhaXQgd29ya2Zsb3dNYW5hZ2VyLnNhdmVXb3JrZmxvdyh3b3JrZmxvdyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25XaWRnZXRSZW5kZXI6IChjb250ZXh0OiB7XG4gICAgICAgICAgICAgICAga2VlcFJlbmRlcjogYm9vbGVhbjtcbiAgICAgICAgICAgICAgICByZXN1bHQ6IGFueVtdO1xuICAgICAgICAgICAgfSwgZmllbGRJbmZvOiBXaWRnZXRUYWJsZVN0cnVjdHVyZU5vZGUsIHdpZGdldDogV2lkZ2V0VGFibGVTdHJ1Y3R1cmVOb2RlWyd3aWRnZXRzJ11bMF0sIHdpZGdldEluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAod2lkZ2V0Lm91dHB1dFR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1pbiA9IHdpZGdldC5vcHRpb25zPy5taW4gPz8gMDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF4ID0gd2lkZ2V0Lm9wdGlvbnM/Lm1heCA/PyAxMDA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXAgPSB3aWRnZXQub3B0aW9ucz8uc3RlcCA/PyAxO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQucmVzdWx0LnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICA8TnVtYmVyV2lkZ2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlXZWlnaHQ9e3dpZGdldC51aVdlaWdodCB8fCAxMn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9e3dpZGdldEluZGV4fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0TWluPXttaW59XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRNYXg9e21heH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0ZXA9e3N0ZXB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT17d2lkZ2V0Lm5hbWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3BhcnNlRmxvYXQodGhpcy5zdGF0ZS53aWRnZXRUYWJsZVZhbHVlW2ZpZWxkSW5mby5pZF1bd2lkZ2V0SW5kZXhdKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXsodikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0UHJvcHMub25XaWRnZXRDaGFuZ2UoZmllbGRJbmZvLmlkLCB3aWRnZXRJbmRleCwgdiwgZmllbGRJbmZvKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhT3B0aW9ucz17dGhpcy5zdGF0ZS53aWRnZXRUYWJsZVN0cnVjdHVyZS5leHRyYU9wdGlvbnN9XG4gICAgICAgICAgICAgICAgICAgICAgICAvPilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdpZGdldC5vdXRwdXRUeXBlID09PSAnY29tYm8nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQucmVzdWx0LnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICA8Q29tYm9XaWRnZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aVdlaWdodD17d2lkZ2V0LnVpV2VpZ2h0IHx8IDEyfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT17d2lkZ2V0SW5kZXh9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz17d2lkZ2V0Lm9wdGlvbnM/LnZhbHVlcyB8fCBbXX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPXt3aWRnZXQubmFtZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblNlbGVjdFVwZGF0ZT17KHYpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdFByb3BzLm9uV2lkZ2V0Q2hhbmdlKGZpZWxkSW5mby5pZCwgd2lkZ2V0SW5kZXgsIHYsIGZpZWxkSW5mbyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5zdGF0ZS53aWRnZXRUYWJsZVZhbHVlW2ZpZWxkSW5mby5pZF1bd2lkZ2V0SW5kZXhdfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhT3B0aW9ucz17dGhpcy5zdGF0ZS53aWRnZXRUYWJsZVN0cnVjdHVyZS5leHRyYU9wdGlvbnN9XG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aWRnZXQub3V0cHV0VHlwZSA9PT0gJ3RvZ2dsZScpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5yZXN1bHQucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxUb2dnbGVXaWRnZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aVdlaWdodD17d2lkZ2V0LnVpV2VpZ2h0IHx8IDEyfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT17d2lkZ2V0SW5kZXh9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT17d2lkZ2V0Lm5hbWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUud2lkZ2V0VGFibGVWYWx1ZVtmaWVsZEluZm8uaWRdW3dpZGdldEluZGV4XX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXsodikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0UHJvcHMub25XaWRnZXRDaGFuZ2UoZmllbGRJbmZvLmlkLCB3aWRnZXRJbmRleCwgdiwgZmllbGRJbmZvKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhT3B0aW9ucz17dGhpcy5zdGF0ZS53aWRnZXRUYWJsZVN0cnVjdHVyZS5leHRyYU9wdGlvbnN9XG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdpZGdldC5vdXRwdXRUeXBlID09PSAnc3RyaW5nJyB8fCB3aWRnZXQub3V0cHV0VHlwZSA9PT0gJ2N1c3RvbXRleHQnIHx8IHdpZGdldC5vdXRwdXRUeXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5yZXN1bHQucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxTdHJpbmdXaWRnZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aVdlaWdodD17d2lkZ2V0LnVpV2VpZ2h0IHx8IDEyfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT17d2lkZ2V0SW5kZXh9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUud2lkZ2V0VGFibGVWYWx1ZVtmaWVsZEluZm8uaWRdW3dpZGdldEluZGV4XX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXsodikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0UHJvcHMub25XaWRnZXRDaGFuZ2UoZmllbGRJbmZvLmlkLCB3aWRnZXRJbmRleCwgdiwgZmllbGRJbmZvKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhT3B0aW9ucz17dGhpcy5zdGF0ZS53aWRnZXRUYWJsZVN0cnVjdHVyZS5leHRyYU9wdGlvbnN9XG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aWRnZXQub3V0cHV0VHlwZSA9PT0gJ1BTX0xBWUVSJyB8fCB3aWRnZXQub3V0cHV0VHlwZSA9PT0gJ1BTX0RPQ1VNRU5UJykge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnJlc3VsdC5wdXNoKDxwPntpMThuKCdvbmx5IHN1cHBvcnRlZCBpbiBQaG90b3Nob3AnKX08L3A+KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2lkZ2V0Lm91dHB1dFR5cGUgPT0gJ0lNQUdFX1BBVEgnIHx8IHdpZGdldC5vdXRwdXRUeXBlID09ICdNQVNLX1BBVEgnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQucmVzdWx0LnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICA8SW1hZ2VXaWRnZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aVdlaWdodD17d2lkZ2V0LnVpV2VpZ2h0IHx8IDEyfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLndpZGdldFRhYmxlVmFsdWVbZmllbGRJbmZvLmlkXVt3aWRnZXRJbmRleF19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz17d2lkZ2V0Lm9wdGlvbnM/LnZhbHVlcyB8fCBbXX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9e3dpZGdldEluZGV4fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9e2FzeW5jICh2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRQcm9wcy5vbldpZGdldENoYW5nZShmaWVsZEluZm8uaWQsIHdpZGdldEluZGV4LCB2LCBmaWVsZEluZm8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFPcHRpb25zPXt0aGlzLnN0YXRlLndpZGdldFRhYmxlU3RydWN0dXJlLmV4dHJhT3B0aW9uc31cbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uVGl0bGVSZW5kZXI6ICh0aXRsZTogc3RyaW5nLCBmaWVsZEluZm86IFdpZGdldFRhYmxlU3RydWN0dXJlTm9kZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiA8RWRpdGFibGVUaXRsZVxuICAgICAgICAgICAgICAgICAgICB0aXRsZT17dGl0bGV9XG4gICAgICAgICAgICAgICAgICAgIG9uVGl0bGVDaGFuZ2U9eyhuZXdUaXRsZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgQ29tZnlTb2NrZXQuaW5zdGFuY2Uuc2V0Tm9kZVRpdGxlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlX2lkOiBmaWVsZEluZm8uaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IG5ld1RpdGxlXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIC8+O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9udFNpemUgPSAxMlxuICAgICAgICByZXR1cm4gPENvbmZpZ1Byb3ZpZGVyIHRoZW1lPXt7XG4gICAgICAgICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgICAgICAgICAgSW5wdXQ6IHtcbiAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxuICAgICAgICAgICAgICAgICAgICBjb2xvckJnQ29udGFpbmVyOiAndmFyKC0tcC1mb3JtLWZpZWxkLWJhY2tncm91bmQpJyxcbiAgICAgICAgICAgICAgICAgICAgY29sb3JUZXh0OiAndmFyKC0tcC1mb3JtLWZpZWxkLWNvbG9yKScsXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yQm9yZGVyOiAndmFyKC0tcC1mb3JtLWZpZWxkLWJvcmRlci1jb2xvciknXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBTZWxlY3Q6IHtcbiAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxuICAgICAgICAgICAgICAgICAgICBjb2xvckJnQ29udGFpbmVyOiAndmFyKC0tcC1mb3JtLWZpZWxkLWJhY2tncm91bmQpJyxcbiAgICAgICAgICAgICAgICAgICAgY29sb3JUZXh0OiAndmFyKC0tcC1mb3JtLWZpZWxkLWNvbG9yKScsXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yQm9yZGVyOiAndmFyKC0tcC1mb3JtLWZpZWxkLWJvcmRlci1jb2xvciknLFxuICAgICAgICAgICAgICAgICAgICBjb2xvckJnRWxldmF0ZWQ6ICd2YXIoLS1wLWZvcm0tZmllbGQtYmFja2dyb3VuZCknLFxuICAgICAgICAgICAgICAgICAgICBjb2xvclRleHREZXNjcmlwdGlvbjogJ3ZhcigtLXAtZm9ybS1maWVsZC1jb2xvciknLFxuICAgICAgICAgICAgICAgICAgICBjb250cm9sSXRlbUJnQWN0aXZlOiAndmFyKC0tcC1mb3JtLWZpZWxkLWJhY2tncm91bmQpJyxcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbEl0ZW1CZ0hvdmVyOiAndmFyKC0tcC1mb3JtLWZpZWxkLWJvcmRlci1jb2xvciknXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBDaGVja2JveDoge1xuICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yVGV4dDogJ3ZhcigtLXAtZm9ybS1maWVsZC1jb2xvciknLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgUmFkaW86IHtcbiAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgU2xpZGVyOiB7XG4gICAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiBmb250U2l6ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFN3aXRjaDoge1xuICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yQmdDb250YWluZXI6ICd2YXIoLS1wLWZvcm0tZmllbGQtYmFja2dyb3VuZCknLFxuICAgICAgICAgICAgICAgICAgICBjb2xvclRleHQ6ICd2YXIoLS1wLWZvcm0tZmllbGQtY29sb3IpJ1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgSW5wdXROdW1iZXI6IHtcbiAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxuICAgICAgICAgICAgICAgICAgICBjb2xvckJnQ29udGFpbmVyOiAndmFyKC0tcC1mb3JtLWZpZWxkLWJhY2tncm91bmQpJyxcbiAgICAgICAgICAgICAgICAgICAgY29sb3JUZXh0OiAndmFyKC0tcC1mb3JtLWZpZWxkLWNvbG9yKScsXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yQm9yZGVyOiAndmFyKC0tcC1mb3JtLWZpZWxkLWJvcmRlci1jb2xvciknXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9fT5cbiAgICAgICAgICAgIDxXb3JrZmxvd0VkaXQgey4uLmVkaXRQcm9wc30gLz5cbiAgICAgICAgPC9Db25maWdQcm92aWRlcj5cbiAgICB9XG59XG4iLCAiaW1wb3J0IFJlYWN0LCB7IFJlYWN0Tm9kZSwgdXNlTWVtbyB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IGkxOG4gZnJvbSBcIi4vaTE4bi5tanNcIjtcblxuaW1wb3J0IHR5cGUgeyBXaWRnZXRUYWJsZVN0cnVjdHVyZSwgV2lkZ2V0VGFibGVTdHJ1Y3R1cmVOb2RlLCBXaWRnZXRUYWJsZVZhbHVlIH0gZnJvbSBcIi4uL3R5cGVzL3NkcHBwL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBjb21wdXRlVUlXZWlnaHRDU1MsIHVzZVRyYWNlVXBkYXRlIH0gZnJvbSBcIi4vdHN4L3V0aWwuanNcIjtcblxuaW50ZXJmYWNlIFdvcmtmbG93RWRpdFByb3BzIHtcbiAgICB3aWRnZXRUYWJsZVN0cnVjdHVyZTogV2lkZ2V0VGFibGVTdHJ1Y3R1cmU7XG4gICAgd2lkZ2V0VGFibGVWYWx1ZTogV2lkZ2V0VGFibGVWYWx1ZTtcbiAgICB3aWRnZXRUYWJsZUVycm9yczogUmVjb3JkPG51bWJlciwgc3RyaW5nPjtcblxuICAgIG9uV2lkZ2V0UmVuZGVyPzogKGNvbnRleHQ6IHtcbiAgICAgICAga2VlcFJlbmRlcjogYm9vbGVhbjtcbiAgICAgICAgcmVzdWx0OiBhbnlbXTtcbiAgICB9LCBmaWVsZEluZm86IFdpZGdldFRhYmxlU3RydWN0dXJlTm9kZSwgd2lkZ2V0OiBXaWRnZXRUYWJsZVN0cnVjdHVyZU5vZGVbJ3dpZGdldHMnXVswXSwgd2lkZ2V0SW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbjtcbiAgICBvblRpdGxlUmVuZGVyPzogKHRpdGxlOiBzdHJpbmcsIGZpZWxkSW5mbzogV2lkZ2V0VGFibGVTdHJ1Y3R1cmVOb2RlKSA9PiBSZWFjdE5vZGU7XG5cbiAgICBvbldpZGdldENoYW5nZTogKG5vZGVJRDogbnVtYmVyLCB3aWRnZXRJbmRleDogbnVtYmVyLCB2YWx1ZTogYW55LCBvcmlnaW5Ob2RlRGF0YTogV2lkZ2V0VGFibGVTdHJ1Y3R1cmVOb2RlKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBXb3JrZmxvd0VkaXQoe1xuICAgIHdpZGdldFRhYmxlU3RydWN0dXJlLFxuICAgIHdpZGdldFRhYmxlVmFsdWUsXG4gICAgd2lkZ2V0VGFibGVFcnJvcnMsXG4gICAgb25XaWRnZXRSZW5kZXIsXG4gICAgb25XaWRnZXRDaGFuZ2UsXG4gICAgb25UaXRsZVJlbmRlclxufTogV29ya2Zsb3dFZGl0UHJvcHMpIHtcbiAgICBjb25zdCBhbGxSZW5kZXJlZEZpZWxkcyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgICByZXR1cm4gd2lkZ2V0VGFibGVTdHJ1Y3R1cmUubm9kZUluZGV4ZXMubWFwKG5vZGVJRCA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZEluZm8gPSB3aWRnZXRUYWJsZVN0cnVjdHVyZS5ub2Rlc1tub2RlSURdXG4gICAgICAgICAgICBjb25zdCByZWR1Y2VXaWRnZXRSZW5kZXIgPSAoY29udGV4dDoge1xuICAgICAgICAgICAgICAgIGtlZXBSZW5kZXI6IGJvb2xlYW47XG4gICAgICAgICAgICAgICAgcmVzdWx0OiBhbnlbXTtcbiAgICAgICAgICAgIH0sIHdpZGdldDogV2lkZ2V0VGFibGVTdHJ1Y3R1cmVOb2RlWyd3aWRnZXRzJ11bMF0sIHdpZGdldEluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbnRleHQua2VlcFJlbmRlcikgcmV0dXJuIGNvbnRleHQ7XG5cbiAgICAgICAgICAgICAgICBpZiAod2lkZ2V0Lm91dHB1dFR5cGUgPT09ICdlcnJvcicpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5yZXN1bHQucHVzaCg8c3BhbiBjbGFzc05hbWU9XCJsaXN0LWVycm9yLWxhYmVsXCI+e3dpZGdldFRhYmxlVmFsdWVbZmllbGRJbmZvLmlkXVt3aWRnZXRJbmRleF19PC9zcGFuPilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9uV2lkZ2V0UmVuZGVyPy4oY29udGV4dCwgZmllbGRJbmZvLCB3aWRnZXQsIHdpZGdldEluZGV4KSkge1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gT2JqZWN0LnZhbHVlcyh3aWRnZXRUYWJsZVN0cnVjdHVyZS5ncm91cHMpLmZpbmQoZ3JvdXAgPT4gZ3JvdXAubm9kZUlEcy5pbmNsdWRlcyhmaWVsZEluZm8uaWQpKVxuICAgICAgICAgICAgY29uc3QgZ3JvdXBDb2xvciA9IGdyb3VwPy5jb2xvciB8fCAncmdiYSgxMjcsIDEyNywgMTI3LCAuNCknXG5cbiAgICAgICAgICAgIGNvbnN0IHVzZVNob3J0VGl0bGUgPSBmaWVsZEluZm8udWlXZWlnaHRTdW0gPD0gOCAmJiBmaWVsZEluZm8ud2lkZ2V0cy5sZW5ndGggPT0gMSAmJiAoXG4gICAgICAgICAgICAgICAgZmllbGRJbmZvLndpZGdldHNbMF0ub3V0cHV0VHlwZSAhPT0gJ251bWJlcicgfHxcbiAgICAgICAgICAgICAgICAhd2lkZ2V0VGFibGVTdHJ1Y3R1cmUuZXh0cmFPcHRpb25zPy51c2VTbGlkZXJGb3JOdW1iZXJXaWRnZXRcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3b3JrZmxvdy1lZGl0LWZpZWxkXCIga2V5PXtmaWVsZEluZm8uaWR9PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIndvcmtmbG93LWVkaXQtZmllbGQtdGl0bGVcIiB0aXRsZT17ZmllbGRJbmZvLnRpdGxlfSBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uY29tcHV0ZVVJV2VpZ2h0Q1NTKHVzZVNob3J0VGl0bGUgPyA0IDogMTIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6IGdyb3VwQ29sb3JcbiAgICAgICAgICAgICAgICAgICAgfX0+XG4gICAgICAgICAgICAgICAgICAgICAgICB7b25UaXRsZVJlbmRlciA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25UaXRsZVJlbmRlcihmaWVsZEluZm8udGl0bGUsIGZpZWxkSW5mbykgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPntmaWVsZEluZm8udGl0bGV9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJbmZvLndpZGdldHMucmVkdWNlKHJlZHVjZVdpZGdldFJlbmRlciwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBSZW5kZXI6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiBbXSBhcyBhbnlbXVxuICAgICAgICAgICAgICAgICAgICAgICAgfSkucmVzdWx0Lm1hcCgoaXRlbTogUmVhY3ROb2RlLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxXaWRnZXRSZW5kZXJFcnJvckJvdW5kYXJ5IGtleT17aW5kZXh9PntpdGVtfTwvV2lkZ2V0UmVuZGVyRXJyb3JCb3VuZGFyeT5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2lkZ2V0VGFibGVFcnJvcnNbZmllbGRJbmZvLmlkXSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibGlzdC1lcnJvci1sYWJlbFwiPnt3aWRnZXRUYWJsZUVycm9yc1tmaWVsZEluZm8uaWRdfTwvc3Bhbj4gOiAnJ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApXG4gICAgICAgIH0pXG4gICAgfSwgW3dpZGdldFRhYmxlU3RydWN0dXJlLCB3aWRnZXRUYWJsZVZhbHVlLCB3aWRnZXRUYWJsZUVycm9ycywgb25XaWRnZXRSZW5kZXIsIG9uV2lkZ2V0Q2hhbmdlLCBvblRpdGxlUmVuZGVyXSlcblxuICAgIGNvbnN0IG5vZGVFcnJvcnNOb3RJbldpZGdldFRhYmxlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh3aWRnZXRUYWJsZUVycm9ycykuZmlsdGVyKChrZXk6IGFueSkgPT4gIXdpZGdldFRhYmxlU3RydWN0dXJlLm5vZGVzW3BhcnNlSW50KGtleSldKTtcbiAgICB9LCBbd2lkZ2V0VGFibGVFcnJvcnMsIHdpZGdldFRhYmxlU3RydWN0dXJlXSk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8PlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5vZGVFcnJvcnNOb3RJbldpZGdldFRhYmxlLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgICBub2RlRXJyb3JzTm90SW5XaWRnZXRUYWJsZS5tYXAoKGtleTogYW55KSA9PiAoXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGtleT17a2V5fSBjbGFzc05hbWU9XCJsaXN0LWVycm9yLWxhYmVsXCI+e3dpZGdldFRhYmxlRXJyb3JzW2tleV19PC9zcGFuPlxuICAgICAgICAgICAgICAgICkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgIU9iamVjdC5rZXlzKHdpZGdldFRhYmxlU3RydWN0dXJlLm5vZGVzKS5sZW5ndGggP1xuICAgICAgICAgICAgICAgICAgICAoPHNwYW4gY2xhc3NOYW1lPVwibGlzdC1lcnJvci1sYWJlbFwiPntpMThuKCdubyBzdWl0YWJsZSBub2RlIHRvIGNvbnRyb2wgaW4gdGhpcyB3b3JrZmxvdycpfTwvc3Bhbj4pIDogJydcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwid29ya2Zsb3ctZWRpdC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBhbGxSZW5kZXJlZEZpZWxkc1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8Lz5cbiAgICApO1xufVxuXG5cbmNsYXNzIFdpZGdldFJlbmRlckVycm9yQm91bmRhcnkgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8e1xuICAgIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGU7XG59LCB7XG4gICAgaGFzRXJyb3I6IGJvb2xlYW47XG4gICAgZXJyb3I6IEVycm9yIHwgbnVsbDtcbn0+IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wczoge1xuICAgICAgICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlO1xuICAgIH0pIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICB0aGlzLnN0YXRlID0geyBoYXNFcnJvcjogZmFsc2UsIGVycm9yOiBudWxsIH07XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkQ2F0Y2goZXJyb3I6IEVycm9yLCBlcnJvckluZm86IFJlYWN0LkVycm9ySW5mbykge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgaGFzRXJyb3I6IHRydWUsIGVycm9yIH0pO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuaGFzRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiA8c3BhbiBjbGFzc05hbWU9XCJsaXN0LWVycm9yLWxhYmVsXCI+e3RoaXMuc3RhdGUuZXJyb3I/LnN0YWNrIHx8IHRoaXMuc3RhdGUuZXJyb3I/Lm1lc3NhZ2UgfHwgdGhpcy5zdGF0ZS5lcnJvcj8udG9TdHJpbmcoKX08L3NwYW4+XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47XG4gICAgfVxufVxuXG4iLCAiaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VSZWYgfSBmcm9tIFwicmVhY3RcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVVSVdlaWdodENTUyh1aVdlaWdodDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdWlXZWlnaHQgPSB1aVdlaWdodCB8fCAxMjtcbiAgICByZXR1cm4geyBcbiAgICAgICAgZmxleDogYCR7dWlXZWlnaHR9IDAgY2FsYygke3VpV2VpZ2h0IC8gMTIgKiAxMDB9JSAtIDEwcHgpYCxcbiAgICAgICAgbWF4V2lkdGg6IGAxMDAlYFxuICAgIH1cbn1cblxuXG4vLyBcdTZERkJcdTUyQTBcdThGRDlcdTRFMkFcdTgxRUFcdTVCOUFcdTRFNDkgaG9vayBcdTY3NjVcdThEREZcdThFMkFcdTRGOURcdThENTZcdTk4NzlcdTUzRDhcdTUzMTZcbmV4cG9ydCBmdW5jdGlvbiB1c2VUcmFjZVVwZGF0ZShuYW1lOiBzdHJpbmcsIHByb3BzOiBhbnkpIHtcbiAgICBjb25zdCBwcmV2ID0gdXNlUmVmKHByb3BzKTtcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBjb25zdCBjaGFuZ2VkUHJvcHMgPSBPYmplY3QuZW50cmllcyhwcm9wcykucmVkdWNlKChwczogYW55LCBbaywgdl0pID0+IHtcbiAgICAgICAgICAgIGlmIChwcmV2LmN1cnJlbnRba10gIT09IHYpIHtcbiAgICAgICAgICAgICAgICBwc1trXSA9IFtwcmV2LmN1cnJlbnRba10sIHZdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBzO1xuICAgICAgICB9LCB7fSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoY2hhbmdlZFByb3BzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgJHtuYW1lfSBDaGFuZ2VkIHByb3BzOmAsIGNoYW5nZWRQcm9wcyk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHByZXYuY3VycmVudCA9IHByb3BzO1xuICAgIH0pO1xufSIsICJpbXBvcnQgUmVhY3QsIHsgdXNlQ2FsbGJhY2ssIHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBGbGV4LCBJbnB1dE51bWJlciwgU2xpZGVyLCBTcGFjZSwgVHlwb2dyYXBoeSB9IGZyb20gJ2FudGQnO1xuaW1wb3J0IHsgdXNlVUlXZWlnaHRDU1MgfSBmcm9tICcuL2hvb2tzLm10cyc7XG5pbXBvcnQgeyBCYXNlV2lkZ2V0UHJvcHMgfSBmcm9tICcuL19iYXNlJztcblxuaW50ZXJmYWNlIE51bWJlcldpZGdldFByb3BzIGV4dGVuZHMgQmFzZVdpZGdldFByb3BzIHtcbiAgICBpbnB1dE1pbjogbnVtYmVyO1xuICAgIGlucHV0TWF4OiBudW1iZXI7XG4gICAgaW5wdXRTdGVwOiBudW1iZXI7XG4gICAgdmFsdWU/OiBudW1iZXI7XG4gICAgbmFtZT86IHN0cmluZztcbiAgICBvblZhbHVlQ2hhbmdlOiAodmFsdWU6IG51bWJlcikgPT4gdm9pZDtcbiAgICBleHRyYU9wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG5leHBvcnQgY29uc3QgTnVtYmVyV2lkZ2V0OiBSZWFjdC5GQzxOdW1iZXJXaWRnZXRQcm9wcz4gPSAoe1xuICAgIGlucHV0TWluLFxuICAgIGlucHV0TWF4LFxuICAgIGlucHV0U3RlcCxcbiAgICBuYW1lLFxuICAgIHZhbHVlID0gMCxcbiAgICB1aVdlaWdodCA9IDEsXG4gICAgZXh0cmFPcHRpb25zLFxuICAgIG9uVmFsdWVDaGFuZ2Vcbn0pID0+IHtcbiAgICBjb25zdCB1aVdlaWdodENTUyA9IHVzZVVJV2VpZ2h0Q1NTKHVpV2VpZ2h0IHx8IDEyKTtcbiAgICBjb25zdCBbbG9jYWxWYWx1ZSwgc2V0TG9jYWxWYWx1ZV0gPSB1c2VTdGF0ZTxudW1iZXI+KCt2YWx1ZS50b0ZpeGVkKDMpKTtcblxuICAgIC8vIFVwZGF0ZSBsb2NhbCBzdGF0ZSB3aGVuIHByb3BzIHZhbHVlIGNoYW5nZXNcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBzZXRMb2NhbFZhbHVlKCt2YWx1ZS50b0ZpeGVkKDMpKTtcbiAgICB9LCBbdmFsdWVdKTtcblxuICAgIGNvbnN0IGhhbmRsZVZhbHVlQ2hhbmdlID0gdXNlQ2FsbGJhY2soKG5ld1ZhbHVlOiBudW1iZXIgfCBudWxsKSA9PiB7XG4gICAgICAgIGlmIChuZXdWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gXHU0RkREXHU3NTU5M1x1NEY0RFx1NUMwRlx1NjU3MFxuICAgICAgICAgICAgY29uc3Qgcm91bmRlZFZhbHVlID0gK25ld1ZhbHVlLnRvRml4ZWQoMyk7XG4gICAgICAgICAgICBzZXRMb2NhbFZhbHVlKHJvdW5kZWRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9LCBbXSk7XG5cbiAgICBjb25zdCBoYW5kbGVCbHVyID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgICAvLyBPbmx5IGNhbGwgb25WYWx1ZUNoYW5nZSB3aGVuIGlucHV0IGxvc2VzIGZvY3VzXG4gICAgICAgIG9uVmFsdWVDaGFuZ2UobG9jYWxWYWx1ZSk7XG4gICAgfSwgW2xvY2FsVmFsdWUsIG9uVmFsdWVDaGFuZ2VdKTtcblxuICAgIC8vIFx1NjhDMFx1NjdFNVx1NkI2NVx1OTU3Rlx1ODMwM1x1NTZGNFx1NjYyRlx1NTQyNlx1OEZDN1x1NTkyN1xuICAgIGNvbnN0IGlzU3RlcFJhbmdlVG9vQmlnID0gKChpbnB1dE1heCAtIGlucHV0TWluKSAvIGlucHV0U3RlcCkgPiAxMDAwO1xuXG4gICAgaWYgKCFpc1N0ZXBSYW5nZVRvb0JpZyAmJiB1aVdlaWdodCA+PSAxICYmIGV4dHJhT3B0aW9ucz8udXNlU2xpZGVyRm9yTnVtYmVyV2lkZ2V0KSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8RmxleFxuICAgICAgICAgICAgICAgIHN0eWxlPXt7IHdpZHRoOiAnMTAwJScsIC4uLnVpV2VpZ2h0Q1NTIH19XG4gICAgICAgICAgICAgICAgYWxpZ249J2NlbnRlcidcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8U2xpZGVyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7IGZsZXg6IDEgfX1cbiAgICAgICAgICAgICAgICAgICAgbWluPXtpbnB1dE1pbn1cbiAgICAgICAgICAgICAgICAgICAgbWF4PXtpbnB1dE1heH1cbiAgICAgICAgICAgICAgICAgICAgc3RlcD17aW5wdXRTdGVwfVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17bG9jYWxWYWx1ZX1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZVZhbHVlQ2hhbmdlfVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZUNvbXBsZXRlPXtoYW5kbGVCbHVyfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPElucHV0TnVtYmVyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7IHdpZHRoOiA4MCB9fVxuICAgICAgICAgICAgICAgICAgICBtaW49e2lucHV0TWlufVxuICAgICAgICAgICAgICAgICAgICBtYXg9e2lucHV0TWF4fVxuICAgICAgICAgICAgICAgICAgICBzdGVwPXtpbnB1dFN0ZXB9IFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17bG9jYWxWYWx1ZX1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZVZhbHVlQ2hhbmdlfVxuICAgICAgICAgICAgICAgICAgICBvbkJsdXI9e2hhbmRsZUJsdXJ9XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xzPXtmYWxzZX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9GbGV4PlxuICAgICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICAgIDxGbGV4XG4gICAgICAgICAgICBzdHlsZT17eyB3aWR0aDogJzEwMCUnLCAuLi51aVdlaWdodENTUyB9fVxuICAgICAgICAgICAgYWxpZ249J2NlbnRlcidcbiAgICAgICAgPlxuICAgICAgICAgICAge25hbWUgJiYgPHNwYW4gc3R5bGU9e3sgZmxleDogMSB9fT57bmFtZX08L3NwYW4+fVxuICAgICAgICAgICAgPElucHV0TnVtYmVyXG4gICAgICAgICAgICAgICAgc3R5bGU9e3sgd2lkdGg6ICcxMDAlJywgZmxleDogMiB9fVxuICAgICAgICAgICAgICAgIG1pbj17aW5wdXRNaW59XG4gICAgICAgICAgICAgICAgbWF4PXtpbnB1dE1heH1cbiAgICAgICAgICAgICAgICBzdGVwPXtpbnB1dFN0ZXB9XG4gICAgICAgICAgICAgICAgdmFsdWU9e2xvY2FsVmFsdWV9XG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZVZhbHVlQ2hhbmdlfVxuICAgICAgICAgICAgICAgIG9uQmx1cj17aGFuZGxlQmx1cn1cbiAgICAgICAgICAgICAgICBjb250cm9scz17ZmFsc2V9XG4gICAgICAgICAgICAvPlxuICAgICAgICA8L0ZsZXg+XG4gICAgKTtcbn07XG4iLCAiaW1wb3J0IHsgdXNlTWVtbyB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgY29tcHV0ZVVJV2VpZ2h0Q1NTIH0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jb21tb24vdHN4L3V0aWxcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVVJV2VpZ2h0Q1NTKHVpV2VpZ2h0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gdXNlTWVtbygoKSA9PiBjb21wdXRlVUlXZWlnaHRDU1ModWlXZWlnaHQpLCBbdWlXZWlnaHRdKTtcbn0iLCAiaW1wb3J0IHsgRmxleCwgU2VsZWN0LCBUeXBvZ3JhcGh5IH0gZnJvbSAnYW50ZCc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGkxOG4gZnJvbSAnLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2NvbW1vbi9pMThuLm10cyc7XG5pbXBvcnQgeyB1c2VVSVdlaWdodENTUyB9IGZyb20gJy4vaG9va3MubXRzJztcbmltcG9ydCB7IEJhc2VXaWRnZXRQcm9wcyB9IGZyb20gJy4vX2Jhc2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIERyb3Bkb3duV2lkZ2V0UHJvcHMgZXh0ZW5kcyBCYXNlV2lkZ2V0UHJvcHMge1xuICAgIG9uU2VsZWN0VXBkYXRlOiAoaWRlbnRpZnk6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4gdm9pZDtcbiAgICBvcHRpb25zOiBzdHJpbmdbXTtcbiAgICB2YWx1ZTogc3RyaW5nO1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgZXh0cmFPcHRpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pjtcbn1cblxuZXhwb3J0IGNvbnN0IENvbWJvV2lkZ2V0OiBSZWFjdC5GQzxEcm9wZG93bldpZGdldFByb3BzPiA9ICh7XG4gICAgb25TZWxlY3RVcGRhdGUsXG4gICAgb3B0aW9ucyxcbiAgICB2YWx1ZSxcbiAgICBuYW1lLFxuICAgIHVpV2VpZ2h0XG59KSA9PiB7XG4gICAgLy8gXHU1OTA0XHU3NDA2XHU5MDA5XHU2MkU5XHU1M0Q4XHU1MzE2XG4gICAgY29uc3QgaGFuZGxlU2VsZWN0ID0gKHNlbGVjdGVkVmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEluZGV4ID0gb3B0aW9ucy5pbmRleE9mKHNlbGVjdGVkVmFsdWUpO1xuICAgICAgICBvblNlbGVjdFVwZGF0ZShzZWxlY3RlZFZhbHVlLCBzZWxlY3RlZEluZGV4KTtcbiAgICB9O1xuICAgIGNvbnN0IHVpV2VpZ2h0Q1NTID0gdXNlVUlXZWlnaHRDU1ModWlXZWlnaHQgfHwgMTIpO1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPEZsZXhcbiAgICAgICAgICAgIHN0eWxlPXt7IHdpZHRoOiAnMTAwJScsIC4uLnVpV2VpZ2h0Q1NTIH19XG4gICAgICAgICAgICBhbGlnbj0nY2VudGVyJ1xuICAgICAgICA+XG4gICAgICAgICAgICB7bmFtZSAmJiA8c3BhbiBzdHlsZT17eyBmbGV4OiAxIH19PntuYW1lfTwvc3Bhbj59XG4gICAgICAgICAgICA8U2VsZWN0XG4gICAgICAgICAgICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgICAgICAgICAgIG9wdGlvbnM9e29wdGlvbnMubWFwKG9wdGlvbiA9PiAoeyB2YWx1ZTogb3B0aW9uLCBsYWJlbDogb3B0aW9uIH0pKX1cbiAgICAgICAgICAgICAgICBzdHlsZT17eyBmbGV4OiAyLCBtaW5XaWR0aDogJzEwMCUnIH19XG4gICAgICAgICAgICAgICAgb25TZWxlY3Q9e2hhbmRsZVNlbGVjdH1cbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17aTE4bihcInNlbGVjdC4uLlwiKX1cbiAgICAgICAgICAgICAgICBzaG93U2VhcmNoXG4gICAgICAgICAgICAgICAgZmlsdGVyT3B0aW9uPXsoaW5wdXQsIG9wdGlvbikgPT5cbiAgICAgICAgICAgICAgICAgICAgKG9wdGlvbj8ubGFiZWwgPz8gJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoaW5wdXQudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAvPlxuICAgICAgICA8L0ZsZXg+XG4gICAgKTtcbn07XG5cblxuIiwgImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDaGVja2JveCB9IGZyb20gJ2FudGQnO1xuaW1wb3J0IHR5cGUgeyBDaGVja2JveFByb3BzIH0gZnJvbSAnYW50ZCc7XG5pbXBvcnQgeyB1c2VVSVdlaWdodENTUyB9IGZyb20gJy4vaG9va3MubXRzJztcbmltcG9ydCB7IEJhc2VXaWRnZXRQcm9wcyB9IGZyb20gJy4vX2Jhc2UnO1xuXG5pbnRlcmZhY2UgVG9nZ2xlUHJvcHMgZXh0ZW5kcyBCYXNlV2lkZ2V0UHJvcHMge1xuICAgIHZhbHVlPzogYW55O1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgb25WYWx1ZUNoYW5nZTogKHZhbHVlOiBib29sZWFuKSA9PiB2b2lkO1xuICAgIGV4dHJhT3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT47XG59XG5cbmV4cG9ydCBjb25zdCBUb2dnbGVXaWRnZXQ6IFJlYWN0LkZDPFRvZ2dsZVByb3BzPiA9ICh7XG4gICAgdmFsdWUsXG4gICAgbmFtZSxcbiAgICBvblZhbHVlQ2hhbmdlLFxuICAgIHVpV2VpZ2h0XG59KSA9PiB7XG4gICAgY29uc3QgaGFuZGxlQ2hhbmdlOiBDaGVja2JveFByb3BzWydvbkNoYW5nZSddID0gKGUpID0+IHtcbiAgICAgICAgb25WYWx1ZUNoYW5nZShlLnRhcmdldC5jaGVja2VkKTtcbiAgICB9O1xuXG4gICAgY29uc3QgdWlXZWlnaHRDU1MgPSB1c2VVSVdlaWdodENTUyh1aVdlaWdodCB8fCAxMik7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8Q2hlY2tib3hcbiAgICAgICAgICAgIGNoZWNrZWQ9eyEhdmFsdWV9XG4gICAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlfVxuICAgICAgICAgICAgc3R5bGU9e3sgLi4udWlXZWlnaHRDU1MgfX1cbiAgICAgICAgPlxuICAgICAgICAgICAge25hbWUgfHwgJyd9XG4gICAgICAgIDwvQ2hlY2tib3g+XG4gICAgKTtcbn07XG4iLCAiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IElucHV0IH0gZnJvbSAnYW50ZCc7XG5pbXBvcnQgdHlwZSB7IFRleHRBcmVhUHJvcHMgfSBmcm9tICdhbnRkL2VzL2lucHV0JztcbmltcG9ydCB7IHVzZVVJV2VpZ2h0Q1NTIH0gZnJvbSAnLi9ob29rcy5tdHMnO1xuaW1wb3J0IHsgQmFzZVdpZGdldFByb3BzIH0gZnJvbSAnLi9fYmFzZSc7XG5cbmNvbnN0IHsgVGV4dEFyZWEgfSA9IElucHV0O1xuXG5pbnRlcmZhY2UgU3RyaW5nV2lkZ2V0UHJvcHMgZXh0ZW5kcyBCYXNlV2lkZ2V0UHJvcHMge1xuICAgIHZhbHVlPzogc3RyaW5nO1xuICAgIG9uVmFsdWVDaGFuZ2U6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkO1xuICAgIGV4dHJhT3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT47XG59XG5cbmV4cG9ydCBjb25zdCBTdHJpbmdXaWRnZXQ6IFJlYWN0LkZDPFN0cmluZ1dpZGdldFByb3BzPiA9ICh7XG4gICAgdmFsdWUgPSAnJyxcbiAgICBvblZhbHVlQ2hhbmdlLFxuICAgIHVpV2VpZ2h0XG59KSA9PiB7XG4gICAgY29uc3QgdWlXZWlnaHRDU1MgPSB1c2VVSVdlaWdodENTUyh1aVdlaWdodCB8fCAxMik7XG5cbiAgICBjb25zdCBoYW5kbGVDaGFuZ2U6IFRleHRBcmVhUHJvcHNbJ29uQ2hhbmdlJ10gPSAoZSkgPT4ge1xuICAgICAgICBvblZhbHVlQ2hhbmdlKGUudGFyZ2V0LnZhbHVlKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3NOYW1lPVwid2lkZ2V0LWNvbnRhaW5lclwiXG4gICAgICAgICAgICBzdHlsZT17dWlXZWlnaHRDU1N9XG4gICAgICAgID5cbiAgICAgICAgICAgIDxUZXh0QXJlYVxuICAgICAgICAgICAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgICAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlfVxuICAgICAgICAgICAgICAgIGF1dG9TaXplPXt7IG1pblJvd3M6IDEgfX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICk7XG59O1xuIiwgImltcG9ydCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IElucHV0LCBUb29sdGlwIH0gZnJvbSBcImFudGRcIjtcbmltcG9ydCBpMThuIGZyb20gXCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvY29tbW9uL2kxOG4ubXRzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRWRpdGFibGVUaXRsZVByb3BzIHtcbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIG9uVGl0bGVDaGFuZ2U/OiAobmV3VGl0bGU6IHN0cmluZykgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEVkaXRhYmxlVGl0bGUoeyB0aXRsZSwgb25UaXRsZUNoYW5nZSB9OiBFZGl0YWJsZVRpdGxlUHJvcHMpIHtcbiAgICBjb25zdCBbZWRpdGluZywgc2V0RWRpdGluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gICAgY29uc3QgW2VkaXRlZFRpdGxlLCBzZXRFZGl0ZWRUaXRsZV0gPSB1c2VTdGF0ZSh0aXRsZSk7XG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBzZXRFZGl0ZWRUaXRsZSh0aXRsZSk7XG4gICAgfSwgW3RpdGxlXSk7XG5cbiAgICBjb25zdCBoYW5kbGVDbGljayA9ICgpID0+IHtcbiAgICAgICAgc2V0RWRpdGluZyh0cnVlKTtcbiAgICB9O1xuICAgIFxuICAgIGNvbnN0IGhhbmRsZUJsdXIgPSAoKSA9PiB7XG4gICAgICAgIHNldEVkaXRpbmcoZmFsc2UpO1xuICAgICAgICBpZiAoZWRpdGVkVGl0bGUgIT09IHRpdGxlICYmIG9uVGl0bGVDaGFuZ2UpIHtcbiAgICAgICAgICAgIG9uVGl0bGVDaGFuZ2UoZWRpdGVkVGl0bGUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBcbiAgICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoZTogUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICAgICAgc2V0RWRpdGVkVGl0bGUoZS50YXJnZXQudmFsdWUpO1xuICAgIH07XG4gICAgXG4gICAgY29uc3QgaGFuZGxlS2V5RG93biA9IChlOiBSZWFjdC5LZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgICAgICAgc2V0RWRpdGluZyhmYWxzZSk7XG4gICAgICAgICAgICBpZiAoZWRpdGVkVGl0bGUgIT09IHRpdGxlICYmIG9uVGl0bGVDaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICBvblRpdGxlQ2hhbmdlKGVkaXRlZFRpdGxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgICAgIHNldEVkaXRpbmcoZmFsc2UpO1xuICAgICAgICAgICAgc2V0RWRpdGVkVGl0bGUodGl0bGUpOyAvLyBSZXNldCB0byBvcmlnaW5hbCB0aXRsZVxuICAgICAgICB9XG4gICAgfTtcbiAgICBcbiAgICByZXR1cm4gZWRpdGluZyA/IChcbiAgICAgICAgPElucHV0XG4gICAgICAgICAgICBhdXRvRm9jdXNcbiAgICAgICAgICAgIHZhbHVlPXtlZGl0ZWRUaXRsZX1cbiAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICAgICAgICBvbkJsdXI9e2hhbmRsZUJsdXJ9XG4gICAgICAgICAgICBvbktleURvd249e2hhbmRsZUtleURvd259XG4gICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgY2xhc3NOYW1lPVwid29ya2Zsb3ctZWRpdC1maWVsZC10aXRsZS1pbnB1dFwiXG4gICAgICAgIC8+XG4gICAgKSA6IChcbiAgICAgICAgPFRvb2x0aXAgdGl0bGU9e2kxOG4oJ2NsaWNrIHRvIGVkaXQnKX0+XG4gICAgICAgICAgICA8c3BhbiBcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVDbGlja31cbiAgICAgICAgICAgICAgICBzdHlsZT17eyBjdXJzb3I6ICdwb2ludGVyJyB9fVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHtlZGl0ZWRUaXRsZX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9Ub29sdGlwPlxuICAgICk7XG59OyIsICJpbXBvcnQgeyBCYXNlV2lkZ2V0UHJvcHMgfSBmcm9tICcuL19iYXNlJztcbmltcG9ydCB7IFNlbGVjdCwgVXBsb2FkLCBJbWFnZSwgRmxleCB9IGZyb20gJ2FudGQnO1xuaW1wb3J0IHsgVXBsb2FkT3V0bGluZWQgfSBmcm9tICdAYW50LWRlc2lnbi9pY29ucyc7XG5pbXBvcnQgaTE4biBmcm9tICcuLi8uLi8uLi8uLi8uLi8uLi9zcmMvY29tbW9uL2kxOG4ubXRzJztcblxuaW50ZXJmYWNlIEltYWdlV2lkZ2V0UHJvcHMgZXh0ZW5kcyBCYXNlV2lkZ2V0UHJvcHMge1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gICAgb3B0aW9uczogc3RyaW5nW107XG4gICAgb25WYWx1ZUNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHZvaWQ7XG4gICAgZXh0cmFPcHRpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pjtcbn1cblxuZXhwb3J0IGNvbnN0IEltYWdlV2lkZ2V0ID0gKHsgdmFsdWUsIG9uVmFsdWVDaGFuZ2UsIG9wdGlvbnMgfTogSW1hZ2VXaWRnZXRQcm9wcykgPT4ge1xuICAgIGNvbnN0IGhhbmRsZVVwbG9hZCA9IChpbmZvOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGluZm8uZmlsZS5zdGF0dXMgPT09ICdkb25lJykge1xuICAgICAgICAgICAgY29uc3QgdXBsb2FkZWRQYXRoID0gaW5mby5maWxlLnJlc3BvbnNlLm5hbWU7IC8vIFx1NTA0N1x1OEJCRVx1NjcwRFx1NTJBMVx1NTY2OFx1OEZENFx1NTZERVx1NzY4NFx1OERFRlx1NUY4NFx1NTcyOHJlc3BvbnNlLnBhdGhcdTRFMkRcbiAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U/Lih1cGxvYWRlZFBhdGgpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiAoXG4gICAgICAgIDxGbGV4IGdhcD17NX0gYWxpZ249J3N0cmV0Y2gnIHZlcnRpY2FsPlxuICAgICAgICAgICAgPEZsZXggZ2FwPXs1fT5cbiAgICAgICAgICAgICAgICA8U2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7IGZsZXg6IDEgfX1cbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KG5ld1ZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPy4obmV3VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zPXtvcHRpb25zLm1hcChmaWxlID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogZmlsZS5zcGxpdCgnLycpLnBvcCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZpbGVcbiAgICAgICAgICAgICAgICAgICAgfSkpfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPFVwbG9hZFxuICAgICAgICAgICAgICAgICAgICBhY3Rpb249XCIuL2FwaS91cGxvYWQvaW1hZ2VcIlxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlVXBsb2FkfVxuICAgICAgICAgICAgICAgICAgICBzaG93VXBsb2FkTGlzdD17ZmFsc2V9XG4gICAgICAgICAgICAgICAgICAgIGRhdGE9eyhmaWxlKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2U6IGZpbGUgIC8vIFx1NUMwNlx1NjU4N1x1NEVGNlx1NUI1N1x1NkJCNVx1NTQwRFx1OEJCRVx1N0Y2RVx1NEUzQSAnaW1hZ2UnXG4gICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiYW50LWJ0blwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFVwbG9hZE91dGxpbmVkIC8+IHtpMThuKCd1cGxvYWQnKX1cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9VcGxvYWQ+XG4gICAgICAgICAgICA8L0ZsZXg+XG4gICAgICAgICAgICB7dmFsdWUgJiYgKFxuICAgICAgICAgICAgICAgIDxJbWFnZVxuICAgICAgICAgICAgICAgICAgICBzcmM9e2AuL2FwaS92aWV3P2ZpbGVuYW1lPSR7dmFsdWV9JnR5cGU9aW5wdXQmc3ViZm9sZGVyPSZyYW5kPWAgKyBNYXRoLnJhbmRvbSgpfVxuICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNwZWN0UmF0aW86ICcxLzEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0Rml0OiAnY29udGFpbidcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgPC9GbGV4PlxuICAgICk7XG59OyIsICJpbXBvcnQgeyBXb3JrZmxvd0VkaXRXcmFwIH0gZnJvbSBcIi4vV29ya2Zsb3dFZGl0V2ViXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIENvbWZ5U2lkZWJhcih7XG4gICAgb25NYXhpbWl6ZSxcbiAgICBvblBob3Rvc2hvcCxcbn06IHtcbiAgICBvbk1heGltaXplOiAoKSA9PiB2b2lkLFxuICAgIG9uUGhvdG9zaG9wOiAoKSA9PiB2b2lkXG59KSB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzZHBwcC1zaWRlLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzZHBwcC1zaWRlLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPVwic2RwcHAtcGhvdG9zaG9wLWljb25cIiBvbkNsaWNrPXtvblBob3Rvc2hvcH0+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJwaSBwaS13aW5kb3ctbWF4aW1pemVcIiBvbkNsaWNrPXtvbk1heGltaXplfT48L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPFdvcmtmbG93RWRpdFdyYXAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgKVxufSIsICJpbXBvcnQgeyBhcGksIGFwcCB9IGZyb20gXCIuL2NvbWZ5LWdsb2JhbHMubXRzXCI7XG5pbXBvcnQgeyBwYWdlU3RvcmUgfSBmcm9tIFwiLi4vcGhvdG9zaG9wTW9kZWxzLm10c1wiO1xuaW1wb3J0IHsgbWFrZVdpZGdldFRhYmxlU3RydWN0dXJlLCBnZXRXaWRnZXRUYWJsZVZhbHVlIH0gZnJvbSBcIi4vZ3JhcGgtdG8tZm9ybS5tdHNcIjtcbmltcG9ydCB7IFdpZGdldFRhYmxlU3RydWN0dXJlIH0gZnJvbSBcIi4uLy4uLy4uL3NyYy90eXBlcy9zZHBwcFwiO1xuXG5cbmFwaS5hZGRFdmVudExpc3RlbmVyKFwiZ3JhcGhDaGFuZ2VkXCIsIChldmVudDogeyBkZXRhaWw6IGFueSB9KSA9PiB7XG4gICAgY29uc3Qgd29ya2Zsb3dNYW5hZ2VyID0gYXBwLndvcmtmbG93TWFuYWdlciB8fCBhcHAuZXh0ZW5zaW9uTWFuYWdlci53b3JrZmxvd1xuICAgIGNvbnN0IGFjdGl2ZVdvcmtmbG93ID0gd29ya2Zsb3dNYW5hZ2VyLmFjdGl2ZVdvcmtmbG93O1xuICAgIGlmIChldmVudC5kZXRhaWwuaWQgIT09IGFjdGl2ZVdvcmtmbG93LmFjdGl2ZVN0YXRlLmlkKSByZXR1cm5cbiAgICBjb25zdCBvcmlnaW5hbFdUU3RydWN0dXJlID0gcGFnZVN0b3JlLmRhdGEud2lkZ2V0VGFibGVTdHJ1Y3R1cmU7XG4gICAgY29uc3QgbmV3V1RTdHJ1Y3R1cmUgPSBtYWtlV2lkZ2V0VGFibGVTdHJ1Y3R1cmUoYXBwLmdyYXBoLCBhY3RpdmVXb3JrZmxvdyk7XG4gICAgaWYgKGlzU3RydWN0dXJlRGlmZihuZXdXVFN0cnVjdHVyZSwgb3JpZ2luYWxXVFN0cnVjdHVyZSkpIHtcbiAgICAgICAgcGFnZVN0b3JlLnNldFdpZGdldFRhYmxlU3RydWN0dXJlKG5ld1dUU3RydWN0dXJlKTtcbiAgICB9XG4gICAgcGFnZVN0b3JlLnNldFdpZGdldFRhYmxlVmFsdWUoZ2V0V2lkZ2V0VGFibGVWYWx1ZShhcHAuZ3JhcGgpKTtcbn0pXG5hcGkuYWRkRXZlbnRMaXN0ZW5lcihcImV4ZWN1dGVkXCIsICgpID0+IHtcbiAgICBwYWdlU3RvcmUuc2V0V2lkZ2V0VGFibGVWYWx1ZShnZXRXaWRnZXRUYWJsZVZhbHVlKGFwcC5ncmFwaCkpO1xufSlcblxuXG5sZXQgbGFzdEFjdGl2ZVdvcmtmbG93SUQ6IG51bWJlciA9IDA7XG5sZXQgbGFzdEFjdGl2ZVBlcnNpc3RlZDogYm9vbGVhbiA9IHRydWU7XG5sZXQgbGFzdEFjdGl2ZVdvcmtmbG93UGF0aDogc3RyaW5nID0gJyc7XG5cbmZ1bmN0aW9uIGNoZWNrR3JhcGhVcGRhdGUoKSB7XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGNoZWNrR3JhcGhVcGRhdGUpXG4gICAgY29uc3Qgd29ya2Zsb3dNYW5hZ2VyID0gYXBwLndvcmtmbG93TWFuYWdlciB8fCBhcHAuZXh0ZW5zaW9uTWFuYWdlci53b3JrZmxvd1xuICAgIGNvbnN0IGFjdGl2ZVdvcmtmbG93ID0gd29ya2Zsb3dNYW5hZ2VyLmFjdGl2ZVdvcmtmbG93O1xuICAgIGNvbnN0IGN1cnJlbnRXb3JrZmxvd0lEID0gYWN0aXZlV29ya2Zsb3c/LmlkIHx8IDBcbiAgICBjb25zdCBjdXJyZW50V29ya2Zsb3dQYXRoID0gYWN0aXZlV29ya2Zsb3c/LnBhdGggfHwgJydcbiAgICBjb25zdCBjdXJyZW50UGVyc2lzdGVkID0gYWN0aXZlV29ya2Zsb3c/LmlzUGVyc2lzdGVkIHx8IHRydWVcbiAgICBpZiAoXG4gICAgICAgIGN1cnJlbnRXb3JrZmxvd0lEID09PSBsYXN0QWN0aXZlV29ya2Zsb3dJRCAmJlxuICAgICAgICBjdXJyZW50V29ya2Zsb3dQYXRoID09PSBsYXN0QWN0aXZlV29ya2Zsb3dQYXRoICYmXG4gICAgICAgIGN1cnJlbnRQZXJzaXN0ZWQgPT09IGxhc3RBY3RpdmVQZXJzaXN0ZWRcbiAgICApIHJldHVybjtcbiAgICBsYXN0QWN0aXZlV29ya2Zsb3dJRCA9IGN1cnJlbnRXb3JrZmxvd0lEO1xuICAgIGxhc3RBY3RpdmVXb3JrZmxvd1BhdGggPSBjdXJyZW50V29ya2Zsb3dQYXRoO1xuICAgIGxhc3RBY3RpdmVQZXJzaXN0ZWQgPSBjdXJyZW50UGVyc2lzdGVkO1xuXG4gICAgY29uc3Qgd3RTdHJ1Y3R1cmUgPSBtYWtlV2lkZ2V0VGFibGVTdHJ1Y3R1cmUoYXBwLmdyYXBoLCBhY3RpdmVXb3JrZmxvdyk7XG4gICAgY29uc3Qgd3RWYWx1ZSA9IGdldFdpZGdldFRhYmxlVmFsdWUoYXBwLmdyYXBoKTtcbiAgICBwYWdlU3RvcmUuc2V0V2lkZ2V0VGFibGVTdHJ1Y3R1cmUod3RTdHJ1Y3R1cmUpO1xuICAgIHBhZ2VTdG9yZS5zZXRXaWRnZXRUYWJsZVZhbHVlKHd0VmFsdWUpO1xuICAgIC8vIHJndGhyZWUgbWF5IGhhdmUgc29tZSBkZWxheVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAoYWN0aXZlV29ya2Zsb3cgIT09ICB3b3JrZmxvd01hbmFnZXIuYWN0aXZlV29ya2Zsb3cpIHJldHVyblxuICAgICAgICBjb25zdCBuZXdXVFN0cnVjdHVyZSA9IG1ha2VXaWRnZXRUYWJsZVN0cnVjdHVyZShhcHAuZ3JhcGgsIGFjdGl2ZVdvcmtmbG93KTtcbiAgICAgICAgY29uc3QgbmV3V1RWYWx1ZSA9IGdldFdpZGdldFRhYmxlVmFsdWUoYXBwLmdyYXBoKTtcbiAgICAgICAgaWYgKGlzU3RydWN0dXJlRGlmZihuZXdXVFN0cnVjdHVyZSwgd3RTdHJ1Y3R1cmUpKSB7XG4gICAgICAgICAgICBwYWdlU3RvcmUuc2V0V2lkZ2V0VGFibGVTdHJ1Y3R1cmUobmV3V1RTdHJ1Y3R1cmUpO1xuICAgICAgICB9XG4gICAgICAgIHBhZ2VTdG9yZS5zZXRXaWRnZXRUYWJsZVZhbHVlKG5ld1dUVmFsdWUpO1xuICAgIH0sIDgwMClcbn1cbnJlcXVlc3RBbmltYXRpb25GcmFtZShjaGVja0dyYXBoVXBkYXRlKVxuXG5cbmZ1bmN0aW9uIGlzU3RydWN0dXJlRGlmZihzdHJ1Y3R1cmUxOiBXaWRnZXRUYWJsZVN0cnVjdHVyZSwgc3RydWN0dXJlMjogV2lkZ2V0VGFibGVTdHJ1Y3R1cmUpIHtcbiAgICBpZiAoc3RydWN0dXJlMS5ub2RlSW5kZXhlcy5sZW5ndGggIT09IHN0cnVjdHVyZTIubm9kZUluZGV4ZXMubGVuZ3RoKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoSlNPTi5zdHJpbmdpZnkoc3RydWN0dXJlMS5ub2RlSW5kZXhlcykgIT09IEpTT04uc3RyaW5naWZ5KHN0cnVjdHVyZTIubm9kZUluZGV4ZXMpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoSlNPTi5zdHJpbmdpZnkoc3RydWN0dXJlMS5ncm91cHMpICE9PSBKU09OLnN0cmluZ2lmeShzdHJ1Y3R1cmUyLmdyb3VwcykpIHJldHVybiB0cnVlO1xuICAgIGlmIChKU09OLnN0cmluZ2lmeShzdHJ1Y3R1cmUxLm5vZGVzKSAhPT0gSlNPTi5zdHJpbmdpZnkoc3RydWN0dXJlMi5ub2RlcykpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbn0iLCAiaW1wb3J0ICdzZHBwcC10ZXN0L2NvbWZ5JztcbmltcG9ydCB7IFNwZWljaWFsSURNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2NvbW1vbi9waG90b3Nob3Avc3BlY2lhbExheWVyLm1qcyc7XG5pbXBvcnQgeyB3cmFwTm9kZSB9IGZyb20gJy4vbGl0ZWdyYXBoL25vZGUtd3JhcHBlci5tanMnO1xuaW1wb3J0IHsgQ29tZnlTb2NrZXQgfSBmcm9tICcuL3NvY2tldC9Db21meVNvY2tldC5tanMnO1xuaW1wb3J0IHsgcGFnZVN0b3JlLCB3YWl0TW9kZWxJbml0ZWQgfSBmcm9tICcuLi9waG90b3Nob3BNb2RlbHMubXRzJztcbmltcG9ydCBpbml0UG9wdXAgZnJvbSAnLi9wb3B1cC9zZHBwcFBvcHVwLm1qcyc7XG5pbXBvcnQgUHJldmlld1NlbmRlciBmcm9tICcuL1ByZXZpZXdTZW5kZXIubWpzJztcbmltcG9ydCB7IHNkcHBwWCB9IGZyb20gJy4uLy4uLy4uL3NyYy9jb21tb24vc2RwcHBYLm1qcyc7XG5pbXBvcnQgJy4vd2lkZ2V0dGFibGUtZW50cnkubWpzJ1xuaW1wb3J0IHsgc2ltcGxpZnlXb3JrZmxvd1BhdGggfSBmcm9tICcuLi8uLi8uLi9zcmMvY29tbW9uL3N0cmluZy11dGlsLm10cyc7XG5kZWNsYXJlIGNvbnN0IGdyYXBoOiBhbnk7XG5cbmFzeW5jIGZ1bmN0aW9uIF9pbml0KGFwcDogYW55LCBhcGk6IGFueSwgJGVsOiBhbnkpIHtcblx0YXBpLmFkZEV2ZW50TGlzdGVuZXIoXCJwcm9ncmVzc1wiLCAoeyBkZXRhaWwgfTogeyBkZXRhaWw6IHsgdmFsdWU6IG51bWJlciwgbWF4OiBudW1iZXIgfSB9KSA9PiB7XG5cdFx0aWYgKCFkZXRhaWwgfHwgaXNOYU4oZGV0YWlsLnZhbHVlIC8gZGV0YWlsLm1heCkpIHJldHVybjtcblx0XHRjb25zdCBwcm9ncmVzcyA9IE1hdGgucm91bmQoKGRldGFpbC52YWx1ZSAvIGRldGFpbC5tYXgpICogMTAwKTtcblx0XHRwYWdlU3RvcmUuc2V0UHJvZ3Jlc3MocHJvZ3Jlc3MpO1xuXHR9KTtcblx0YXBpLmFkZEV2ZW50TGlzdGVuZXIoXCJzdGF0dXNcIiwgKGU6IGFueSkgPT4ge1xuXHRcdGlmICghZS5kZXRhaWw/LmV4ZWNfaW5mbykgcmV0dXJuO1xuXHRcdHBhZ2VTdG9yZS5zZXRRdWV1ZVNpemUoZS5kZXRhaWwuZXhlY19pbmZvLnF1ZXVlX3JlbWFpbmluZyk7XG5cdH0pO1xuXHRhcGkuYWRkRXZlbnRMaXN0ZW5lcihcImV4ZWN1dGlvbl9lcnJvclwiLCAoeyBkZXRhaWwgfTogeyBkZXRhaWw6IHsgbm9kZV9pZDogbnVtYmVyLCBleGNlcHRpb25fbWVzc2FnZTogc3RyaW5nIH0gfSkgPT4ge1xuXHRcdHBhZ2VTdG9yZS5zZXRFeGVjdXRpbmdOb2RlVGl0bGUoJycpO1xuXHRcdHBhZ2VTdG9yZS5zZXRMYXN0RXJyb3IoZGV0YWlsLmV4Y2VwdGlvbl9tZXNzYWdlKTtcblx0XHRpZiAoZGV0YWlsLm5vZGVfaWQpIHtcblx0XHRcdHBhZ2VTdG9yZS5zZXRXaWRnZXRUYWJsZUVycm9ycyh7XG5cdFx0XHRcdFtkZXRhaWwubm9kZV9pZF06IGRldGFpbC5leGNlcHRpb25fbWVzc2FnZVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9KTtcblx0bGV0IGNhcHR1cmVOZXh0UHJvbXB0QnlTSUQ6IHN0cmluZ1tdID0gW11cblx0YXBpLmFkZEV2ZW50TGlzdGVuZXIoXCJleGVjdXRpb25fc3RhcnRcIiwgKHsgZGV0YWlsIH06IHsgZGV0YWlsOiB7IHByb21wdF9pZDogc3RyaW5nIH0gfSkgPT4ge1xuXHRcdHBhZ2VTdG9yZS5zZXRMYXN0RXJyb3IoJycpO1xuXHRcdHBhZ2VTdG9yZS5zZXRQcm9ncmVzcygwKTtcblx0XHRwYWdlU3RvcmUuc2V0V2lkZ2V0VGFibGVFcnJvcnMoe30pO1xuXHRcdHBhZ2VTdG9yZS5zZXRFeGVjdXRpbmdOb2RlVGl0bGUoJycpO1xuXHRcdGlmIChjYXB0dXJlTmV4dFByb21wdEJ5U0lELmxlbmd0aCkge1xuXHRcdFx0Y29uc3QgYnlTSUQgPSBjYXB0dXJlTmV4dFByb21wdEJ5U0lELnNoaWZ0KCk7XG5cdFx0XHRieVNJRCAmJiBwcm9tcHRzRnJvbVNEUFBQQmFja2VuZC5zZXQoZGV0YWlsLnByb21wdF9pZCwgYnlTSUQpO1xuXHRcdH1cblx0fSk7XG5cdGFwaS5hZGRFdmVudExpc3RlbmVyKFwiZXhlY3V0aW5nXCIsIChlOiBhbnkpID0+IHtcblx0XHRjb25zdCBleGVjdXRpbmdOb2RlSUQgPSBlLmRldGFpbFxuXHRcdGNvbnN0IG5vZGUgPSBncmFwaC5ub2Rlcy5maW5kKChuOiBhbnkpID0+IG4uaWQgPT0gZXhlY3V0aW5nTm9kZUlEKVxuXHRcdGlmIChub2RlKVxuXHRcdFx0cGFnZVN0b3JlLnNldEV4ZWN1dGluZ05vZGVUaXRsZShub2RlLnRpdGxlKTtcblx0fSlcblx0YXBpLmFkZEV2ZW50TGlzdGVuZXIoXCJleGVjdXRpb25fc3VjY2Vzc1wiLCAoZXY6IGFueSkgPT4ge1xuXHRcdHBhZ2VTdG9yZS5zZXRQcm9ncmVzcygwKTtcblx0XHRwYWdlU3RvcmUuc2V0RXhlY3V0aW5nTm9kZVRpdGxlKCcnKTtcblx0XHRpZiAoUHJldmlld1NlbmRlci5nZXQoZXYuZGV0YWlsLnByb21wdF9pZCkpIHtcblx0XHRcdFByZXZpZXdTZW5kZXIuZGVsZXRlKGV2LmRldGFpbC5wcm9tcHRfaWQpO1xuXHRcdH1cblx0fSk7XG5cdGFwaS5hZGRFdmVudExpc3RlbmVyKFwiZXhlY3V0aW9uX2ludGVycnVwdGVkXCIsICgpID0+IHtcblx0XHRwYWdlU3RvcmUuc2V0UHJvZ3Jlc3MoMCk7XG5cdFx0cGFnZVN0b3JlLnNldEV4ZWN1dGluZ05vZGVUaXRsZSgnJyk7XG5cdH0pO1xuXHRjb25zdCBwcm9tcHRzRnJvbVNEUFBQQmFja2VuZCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cdGFwaS5hZGRFdmVudExpc3RlbmVyKFwiZXhlY3V0ZWRcIiwgKGV2OiBhbnkpID0+IHtcblx0XHRpZiAoZXYuZGV0YWlsLm91dHB1dCAmJiBBcnJheS5pc0FycmF5KGV2LmRldGFpbC5vdXRwdXQuaW1hZ2VzKSAmJiBldi5kZXRhaWwub3V0cHV0LmltYWdlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRsZXQgZnJvbVNJRCA9IG51bGw7XG5cdFx0XHRpZiAoUHJldmlld1NlbmRlci5nZXQoZXYuZGV0YWlsLnByb21wdF9pZCkpIHtcblx0XHRcdFx0ZnJvbVNJRCA9IFByZXZpZXdTZW5kZXIuZ2V0KGV2LmRldGFpbC5wcm9tcHRfaWQpO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBjb25zaWRlciBpZiBpdCBuZWNjZXNhcnlcblx0XHRcdFx0ZnJvbVNJRCA9IGxvY2F0aW9uLnNlYXJjaC5tYXRjaCgvd2Vidmlld19mcm9tc2lkPShbXiZdKykvKT8uWzFdIHx8ICcnO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCFmcm9tU0lEKSByZXR1cm47XG5cdFx0XHRpZiAoXG5cdFx0XHRcdCFhcHAuZ3JhcGgubm9kZXNcblx0XHRcdFx0XHQuZmlsdGVyKChub2RlOiBhbnkpID0+IG5vZGUudHlwZSA9PSAnU2VuZCBJbWFnZXMgVG8gUGhvdG9zaG9wJylcblx0XHRcdFx0XHQuZmlsdGVyKChub2RlOiBhbnkpID0+IHsgcmV0dXJuIG5vZGUubW9kZSA9PSAwIH0pXG5cdFx0XHRcdFx0Lmxlbmd0aFxuXHRcdFx0KSB7XG5cdFx0XHRcdHNvY2tldD8uc2VuZEltYWdlKGZyb21TSUQsIHtcblx0XHRcdFx0XHRkb2N1bWVudF9pZGVudGlmeTogU3BlaWNpYWxJRE1hbmFnZXIuZ2V0U3BlY2lhbERvY3VtZW50Rm9yUHJldmlldygpLFxuXHRcdFx0XHRcdGxheWVyX2lkZW50aWZpZXM6IGV2LmRldGFpbC5vdXRwdXQuaW1hZ2VzLm1hcCgoKSA9PiBTcGVpY2lhbElETWFuYWdlci5nZXRTcGVjaWFsTGF5ZXJGb3JTZW5kKClbMF0pLFxuXHRcdFx0XHRcdGJvdW5kYXJpZXM6IGV2LmRldGFpbC5vdXRwdXQuaW1hZ2VzLm1hcCgoKSA9PiAnJyksXG5cdFx0XHRcdFx0aW1hZ2VfdXJsczogZXYuZGV0YWlsLm91dHB1dC5pbWFnZXMubWFwKChpbWFnZTogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gbG9jYXRpb24ub3JpZ2luICsgJy9hcGkvdmlldz90eXBlPScgKyBpbWFnZS50eXBlICsgJyZmaWxlbmFtZT0nICsgaW1hZ2UuZmlsZW5hbWVcblx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRuZXdfbGF5ZXJfbmFtZTogc2ltcGxpZnlXb3JrZmxvd1BhdGgocGFnZVN0b3JlLmRhdGEud2lkZ2V0VGFibGVTdHJ1Y3R1cmUud2lkZ2V0VGFibGVQYXRoKVxuXHRcdFx0XHR9KVxuXHRcdFx0fVxuXHRcdH1cblx0fSlcblxuXHRpbml0UG9wdXAoYXBwKTtcblxuXHR2YXIgc29ja2V0ID0gbmV3IENvbWZ5U29ja2V0KCk7XG5cdHNvY2tldC5jb25uZWN0KCk7XG5cblx0Y29uc3QgaWQgPSBcIkNvbWZ5LlNELVBQUFwiXG5cblx0YXBwLnJlZ2lzdGVyRXh0ZW5zaW9uKHtcblx0XHRuYW1lOiBpZCxcblx0XHRhc3luYyBzZXR1cCgpIHtcblx0XHR9LFxuXHRcdGFzeW5jIGJlZm9yZVJlZ2lzdGVyTm9kZURlZihub2RlVHlwZTogYW55LCBub2RlRGF0YTogYW55LCBhcHA6IGFueSkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0d3JhcE5vZGUobm9kZVR5cGUsIG5vZGVEYXRhKTtcblx0XHRcdH0gY2F0Y2ggKGU6IGFueSkge1xuXHRcdFx0XHRpbml0RXJyb3JzLnB1c2goZS5zdGFjayB8fCBlLm1lc3NhZ2UgfHwgZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcbn1cblxubGV0IGluaXRFcnJvcnM6IHN0cmluZ1tdID0gW107XG47IChhc3luYyBmdW5jdGlvbiAoKSB7XG5cdC8vIEB0cy1pZ25vcmVcblx0aWYgKHR5cGVvZiBncmFkaW9BcHAgIT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcblxuXHR0cnkge1xuXHRcdGNvbnN0IGFwcCA9ICh3aW5kb3cgYXMgYW55KS5jb21meUFQST8uYXBwPy5hcHA7XG5cdFx0Y29uc3QgJGVsID0gKHdpbmRvdyBhcyBhbnkpLmNvbWZ5QVBJPy51aT8uJGVsO1xuXHRcdGNvbnN0IGFwaSA9ICh3aW5kb3cgYXMgYW55KS5jb21meUFQST8uYXBpPy5hcGk7XG5cdFx0aWYgKCFhcHAgfHwgIWFwaSB8fCAhJGVsKSB0aHJvdyBuZXcgRXJyb3IoJ2NvbWZ5QVBJIGlzIG5vdCBpbml0aWFsaXplZCwgbWF5YmUgY29tZnlVSSBpcyB0b28gb2xkJyk7XG5cdFx0YXdhaXQgd2FpdE1vZGVsSW5pdGVkKCk7XG5cdFx0YXdhaXQgX2luaXQoYXBwLCBhcGksICRlbCk7XG5cblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0aW1wb3J0KCcuL3NkcHBwLWN1c3RvbS5qcycpLnRoZW4oKG1vZHVsZSkgPT4ge1xuXHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0bW9kdWxlLmRlZmF1bHQoc2RwcHBYKVxuXHRcdH0pXG5cblx0fSBjYXRjaCAoZTogYW55KSB7XG5cdFx0aW5pdEVycm9ycy5wdXNoKGUuc3RhY2sgfHwgZS5tZXNzYWdlIHx8IGUpO1xuXHR9XG5cblx0YXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMjAwMCkpO1xuXHRpZiAoaW5pdEVycm9ycy5sZW5ndGgpIHtcblx0XHRjb25zb2xlLmVycm9yKGluaXRFcnJvcnNbMF0pO1xuXHRcdGFsZXJ0KCdzZC1wcHAgaW5pdCBmYWlsZWQ6IFxcbicgKyBpbml0RXJyb3JzLmpvaW4oJ1xcbicpKTtcblx0fVxufSkoKTsgIFxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxVQUFBQSxZQUFnQixPQUFPQyxhQUFXLGNBQWNBLFdBQ3BDLE9BQU8sU0FBUyxjQUFjLE9BQzlCLE9BQU8sV0FBVyxjQUFjLFNBQVMsQ0FBQTtBQ0NyRCxlQUFTQyxxQkFBbUI7QUFDeEIsY0FBTSxJQUFJ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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzVOVixVQUFJLGlCQUFpQkUsYUFBa0I7QUFDdkMsVUFBSUMsYUFBV0MsYUFBZ0I7QUFFL0IsVUFBQSxnQkFBaUI7QUFHakJELGlCQUFTLGVBQWUsY0FBYztBQUV0QyxlQUFTLGNBQWMsTUFBTTtBQUMzQixZQUFJLEVBQUUsZ0JBQWdCLGVBQWdC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USxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFdBQVUsVUFBUyxXQUFVLFVBQVMsV0FBVSxVQUFTLFdBQVUsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsUUFBTyxRQUFPLFFBQU8sUUFBTyxRQUFPLEtBQUksVUFBUyxLQUFJLE9BQU0sS0FBSSxPQUFNLGFBQVksTUFBSyxLQUFJLE9BQU0sS0FBSSxPQUFNLEtBQUksVUFBUyxVQUFTLFVBQVMsVUFBUyxXQUFVLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxRQUFPLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsU0FBUSxLQUFJLFNBQVEsUUFBTyxTQUFRLFVBQVMsU0FBUSxLQUFJLE9BQU0sUUFBTyxRQUFPLFVBQVMsU0FBUSxVQUFTLE9BQU0sUUFBTyxPQUFNLFVBQVMsUUFBTyxVQUFTLFNBQVEsUUFBTyxTQUFRLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxTQUFRLFFBQU8sT0FBTSxRQUFPLFFBQU8sUUFBTyxPQUFNLFVBQVMsVUFBUyxVQUFTLE1BQUssVUFBUyxNQUFLLFVBQVMsT0FBTSxVQUFTLFNBQVEsVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxnQkFBZSxVQUFTLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsY0FBYSxVQUFTLFlBQVcsVUFBUyxPQUFNLFVBQVMsY0FBYSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFFBQU8sVUFBUyxPQUFNLFVBQVMsU0FBUSxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxXQUFVLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFFBQU8sVUFBUyxRQUFPLGdCQUFlLFNBQVEsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxPQUFNLFVBQVMsTUFBSyxVQUFTLFNBQVEsVUFBUyxNQUFLLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxRQUFPLFVBQVMsVUFBUyxVQUFTLE9BQU0sS0FBSSxRQUFPLFFBQU8sTUFBSyxRQUFPLE9BQU0sUUFBTyxTQUFRLEtBQUksTUFBSyxVQUFTLE9BQU0sV0FBVSxRQUFPLEtBQUksVUFBUyxVQUFTLE1BQUssV0FBVSxPQUFNLFVBQVMsU0FBUSxLQUFJLE1BQUssVUFBUyxPQUFNLFdBQVUsUUFBTyxRQUFPLE9BQU0sS0FBSSxRQUFPLFFBQU8sVUFBUyxVQUFTLFNBQVEsVUFBUyxNQUFLLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsT0FBTSxnQkFBZSxRQUFPLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxPQUFNLFVBQVMsUUFBTyxVQUFTLE9BQU0sVUFBUyxRQUFPLFVBQVMsT0FBTSxVQUFTLE1BQUssVUFBUyxPQUFNLGdCQUFlLFFBQU8sVUFBUyxPQUFNLGdCQUFlLFFBQU8sVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFVBQVMsVUFBUyxXQUFVLFVBQVMsU0FBUSxVQUFTLFlBQVcsVUFBUyxZQUFXLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLE9BQU0sVUFBUyxRQUFPLGdCQUFlLFNBQVEsVUFBUyxRQUFPLGdCQUFlLFFBQU8sVUFBUyxNQUFLLGdCQUFlLE9BQU0sVUFBUyxPQUFNLFVBQVMsTUFBSyxVQUFTLFFBQU8sZ0JBQWUsU0FBUSxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsTUFBSyxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsUUFBTyxnQkFBZSxTQUFRLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxhQUFZLGdCQUFlLFFBQU8sVUFBUyxRQUFPLGdCQUFlLFNBQVEsVUFBUyxTQUFRLGdCQUFlLFVBQVMsVUFBUyxTQUFRLGdCQUFlLFNBQVEsVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxRQUFPLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxVQUFTLGdCQUFlLFdBQVUsVUFBUyxNQUFLLFVBQVMsT0FBTSxnQkFBZSxRQUFPLFVBQVMsTUFBSyxVQUFTLE9BQU0sZ0JBQWUsUUFBTyxVQUFTLE1BQUssZ0JBQWUsT0FBTSxVQUFTLE1BQUssZ0JBQWUsT0FBTSxnQkFBZSxRQUFPLFVBQVMsT0FBTSxVQUFTLE9BQU0sZ0JBQWUsUUFBTyxVQUFTLE1BQUssZ0JBQWUsUUFBTyxnQkFBZSxPQUFNLFVBQVMsTUFBSyxnQkFBZSxRQUFPLGdCQUFlLE9BQU0sVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLE1BQUssVUFBUyxRQUFPLFVBQVMsTUFBSyxVQUFTLFFBQU8sVUFBUyxNQUFLLFVBQVMsT0FBTSxVQUFTLE1BQUssVUFBUyxPQUFNLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxTQUFRLGdCQUFlLG9CQUFtQixVQUFTLE9BQU0sVUFBUyxRQUFPLGdCQUFlLFNBQVEsVUFBUyxPQUFNLFVBQVMsUUFBTyxnQkFBZSxTQUFRLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxRQUFPLFVBQVMsU0FBUSxnQkFBZSxVQUFTLFVBQVMsU0FBUSxnQkFBZSxVQUFTLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsU0FBUSxnQkFBZSxtQkFBa0IsVUFBUyxTQUFRLGdCQUFlLHFCQUFvQixVQUFTLFVBQVMsVUFBUyxXQUFVLFVBQVMsVUFBUyxVQUFTLFdBQVUsVUFBUyxTQUFRLGdCQUFlLFVBQVMsVUFBUyxTQUFRLGdCQUFlLFVBQVMsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsVUFBUyxnQkFBZSxXQUFVLFVBQVMsU0FBUSxVQUFTLFVBQVMsZ0JBQWUsV0FBVSxVQUFTLFVBQVMsVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxXQUFVLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxPQUFNLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLE1BQUssZ0JBQWUsT0FBTSxVQUFTLE1BQUssZ0JBQWUsT0FBTSxnQkFBZSxRQUFPLFVBQVMsT0FBTSxVQUFTLE9BQU0sZ0JBQWUsUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxXQUFVLGdCQUFlLFlBQVcsVUFBUyxXQUFVLFVBQVMsV0FBVSxVQUFTLFNBQVEsZ0JBQWUsVUFBUyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsT0FBTSxVQUFTLFdBQVUsVUFBUyxXQUFVLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsUUFBTyxVQUFTLFlBQVcsVUFBUyxZQUFXLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsWUFBVyxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFdBQVUsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsWUFBVyxVQUFTLG1CQUFrQixVQUFTLG9CQUFtQixVQUFTLGFBQVksVUFBUyxjQUFhLFVBQVMsWUFBVyxVQUFTLFlBQVcsVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLE9BQU0sVUFBUyxRQUFPLFVBQVMsd0JBQXVCLFVBQVMsUUFBTyxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFT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UUFBTyxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsWUFBVyxVQUFTLFlBQVcsVUFBUyxTQUFRLFVBQVMsWUFBVyxVQUFTLFlBQVcsVUFBUyxXQUFVLFVBQVMsWUFBVyxVQUFTLFdBQVUsVUFBUyxZQUFXLFVBQVMsV0FBVSxVQUFTLFlBQVcsVUFBUyxXQUFVLFVBQVMsVUFBUyxVQUFTLFdBQVUsVUFBUyxXQUFVLFVBQVMsVUFBUyxVQUFTLFdBQVUsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsWUFBVyxVQUFTLFVBQVMsVUFBUyxXQUFVLFVBQVMsV0FBVSxVQUFTLFlBQVcsVUFBUyxVQUFTLFVBQVMsUUFBTyxVQUFTLFdBQVUsVUFBUyxZQUFXLFVBQVMsV0FBVSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFlBQVcsVUFBUyxZQUFXLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFdBQVUsVUFBUyxPQUFNLFVBQVMsTUFBSyxVQUFTLFVBQVMsVUFBUyxRQUFPLFVBQVMsV0FBVSxVQUFTLFlBQVcsVUFBUyxRQUFPLFVBQVMsT0FBTSxVQUFTLFFBQU8sVUFBUyxPQUFNLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsV0FBVSxnQkFBZSxZQUFXLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxPQUFNLGdCQUFlLFFBQU8sVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsV0FBVSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsV0FBVSxVQUFTLFdBQVUsVUFBUyxPQUFNLGdCQUFlLFFBQU8sVUFBUyxPQUFNLGdCQUFlLFFBQU8sVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFdBQVUsVUFBUyxXQUFVLFVBQVMsWUFBVyxVQUFTLFlBQVcsVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLE1BQUssVUFBUyxNQUFLLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFlBQVcsZ0JBQWUscUJBQW9CLFVBQVMsa0JBQWlCLGdCQUFlLDJCQUEwQixVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsUUFBTyxnQkFBZSxTQUFRLFVBQVMsUUFBTyxnQkFBZSxTQUFRLFVBQVMsU0FBUSxVQUFTLE9BQU0sZ0JBQWUsUUFBTyxVQUFTLE9BQU0sZ0JBQWUsUUFBTyxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsTUFBSyxVQUFTLE1BQUssVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFdBQVUsVUFBUyxXQUFVLFVBQVMsV0FBVSxVQUFTLFdBQVUsVUFBUyxXQUFVLFVBQVMsV0FBVSxVQUFTLFFBQU8sZ0JBQWUsU0FBUSxVQUFTLFFBQU8sZ0JBQWUsU0FBUSxVQUFTLFVBQVMsVUFBUyxVQUFTLGdCQUFlLFVBQVMsVUFBUyxTQUFRLGdCQUFlLFVBQVMsVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxXQUFVLFVBQVMsV0FBVSxVQUFTLFNBQVEsVUFBUyxXQUFVLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLE9BQU0sVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsU0FBUSxnQkFBZSxVQUFTLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRLFFBQU8sVUFBUyxRQUFPLFFBQU8sS0FBSSxVQUFTLFFBQU8sU0FBUSxRQUFPLE9BQU0sVUFBUyxRQUFPLFFBQU8sUUFBTyxRQUFPLFFBQU8sVUFBUyxVQUFTLFFBQU8sVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxRQUFPLFFBQU8sVUFBUyxVQUFTLFVBQVMsVUFBUyxRQUFPLFFBQU8sUUFBTyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLGFBQWUsUUFBTyxhQUFlLFFBQU8sYUFBZSxPQUFNLGFBQWUsUUFBTyxhQUFlLE9BQU0sYUFBZSxRQUFPLFFBQU8sUUFBTyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxRQUFPLFNBQVEsUUFBTyxTQUFRLFFBQU8sU0FBUSxRQUFPLFNBQVEsUUFBTyxRQUFPLFFBQU8sUUFBTyxRQUFPLFVBQVMsUUFBTyxVQUFTLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxRQUFPLFNBQVEsUUFBTyxTQUFRLGFBQWUsUUFBTyxhQUFlLFFBQU8sYUFBZSxPQUFNLGFBQWUsUUFBTyxVQUFTLFFBQU8sYUFBZSxPQUFNLGFBQWUsT0FBTSxhQUFlLFFBQU8sYUFBZSxRQUFPLFVBQVMsT0FBTSxhQUFlLFFBQU8sVUFBUyxRQUFPLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsUUFBTyxVQUFTLFFBQU8sUUFBTyxVQUFTLFFBQU8sVUFBUyxVQUFTLFVBQVMsYUFBZSxPQUFNLFVBQVMsTUFBSyxhQUFlLFFBQU8sYUFBZSxRQUFPLGFBQWUsUUFBTyxhQUFlLE9BQU0sVUFBUyxNQUFLLGFBQWUsUUFBTyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsUUFBTyxPQUFNLFFBQU8sT0FBTSxVQUFTLE1BQUssVUFBUyxRQUFPLGFBQWUsT0FBTSxhQUFlLFFBQU8sVUFBUyxRQUFPLGFBQWUsT0FBTSxhQUFlLFFBQU8sUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sU0FBUSxRQUFPLFNBQVEsVUFBUyxVQUFTLFVBQVMsVUFBUyxRQUFPLFFBQU8sUUFBTyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLGFBQWUsT0FBTSxhQUFlLFFBQU8sYUFBZSxRQUFPLGFBQWUsT0FBTSxhQUFlLFFBQU8sVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsU0FBUSxNQUFLLFNBQVEsVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLFFBQU8sYUFBZSxRQUFPLGFBQWUsT0FBTSxhQUFlLFFBQU8sYUFBZSxRQUFPLGFBQWUsT0FBTSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxVQUFTLGFBQWUsT0FBTSxVQUFTLFdBQVUsYUFBZSxRQUFPLGFBQWUsUUFBTyxVQUFTLFFBQU8sVUFBUyxPQUFNLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLFVBQVMsVUFBUyxVQUFTLGFBQWUsUUFBTyxhQUFlLE9BQU0sYUFBZSxRQUFPLFVBQVMsTUFBSyxhQUFlLFFBQU8sVUFBUyxRQUFPLFVBQVMsTUFBSyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxTQUFRLFFBQU8sU0FBUSxRQUFPLFFBQU8sUUFBTyxRQUFPLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxhQUFlLFFBQU8sYUFBZSxRQUFPLGFBQWUsT0FBTSxhQUFlLFFBQU8sYUFBZSxPQUFNLGFBQWUsUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxhQUFlLFFBQU8sYUFBZSxRQUFPLGFBQWUsT0FBTSxhQUFlLFFBQU8sYUFBZSxRQUFPLGFBQWUsT0FBTSxVQUFTLFVBQVMsVUFBUyxVQUFTLGFBQWUsT0FBTSxhQUFlLFFBQU8sVUFBUyxPQUFNLGFBQWUsUUFBTyxVQUFTLFFBQU8sYUFBZSxPQUFNLGFBQWUsUUFBTyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsYUFBZSxPQUFNLGFBQWUsUUFBTyxhQUFlLFFBQU8sYUFBZSxPQUFNLGFBQWUsUUFBTyxVQUFTLFFBQU8sYUFBZSxPQUFNLGFBQWUsUUFBTyxhQUFlLFFBQU8sVUFBUyxRQUFPLGFBQWUsUUFBTyxhQUFlLE9BQU0sVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxPQUFNLFVBQVMsT0FBTSxhQUFlLFFBQU8sYUFBZSxPQUFNLFVBQVMsUUFBTyxhQUFlLFFBQU8sYUFBZSxPQUFNLGFBQWUsUUFBTyxRQUFPLFFBQU8sUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sU0FBUSxRQUFPLFNBQVEsUUFBTyxRQUFPLFFBQU8sUUFBTyxVQUFTLFVBQVMsVUFBUyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsYUFBZSxPQUFNLGFBQWUsUUFBTyxhQUFlLFFBQU8sVUFBUyxRQUFPLGFBQWUsT0FBTSxhQUFlLFFBQU8sYUFBZSxRQUFPLGFBQWUsT0FBTSxhQUFlLFFBQU8sYUFBZSxRQUFPLGFBQWUsT0FBTSxVQUFTLFFBQU8sVUFBUyxVQUFTLGFBQWUsT0FBTSxhQUFlLFFBQU8sYUFBZSxRQUFPLFVBQVMsUUFBTyxVQUFTLE1BQUssVUFBUyxRQUFPLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLGFBQWUsUUFBTyxhQUFlLFFBQU8sYUFBZSxPQUFNLGFBQWUsUUFBTyxhQUFlLE9BQU0sYUFBZSxRQUFPLFVBQVMsTUFBSyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFFBQU8sU0FBUSxhQUFlLE9BQU0sYUFBZSxRQUFPLGFBQWUsUUFBTyxhQUFlLFFBQU8sYUFBZSxPQUFNLGFBQWUsUUFBTyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFVBQVMsYUFBZSxRQUFPLGFBQWUsUUFBTyxhQUFlLE9BQU0sYUFBZSxRQUFPLGFBQWUsT0FBTSxhQUFlLFFBQU8sUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsUUFBTyxTQUFRLFFBQU8sU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFFBQU8sUUFBTyxRQUFPLFFBQU8sVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxhQUFlLE9BQU0sYUFBZSxRQUFPLGFBQWUsUUFBTyxhQUFlLE9BQU0sYUFBZSxRQUFPLGFBQWUsUUFBTyxhQUFlLFFBQU8sYUFBZSxRQUFPLGFBQWUsT0FBTSxhQUFlLFFBQU8sYUFBZSxRQUFPLGFBQWUsT0FBTSxVQUFTLFNBQVEsVUFBUyxTQUFRLGFBQWUsT0FBTSxhQUFlLFFBQU8sYUFBZSxRQUFPLGFBQWUsUUFBTyxhQUFlLE9BQU0sYUFBZSxRQUFPLGFBQWUsT0FBTSxhQUFlLFFBQU8sYUFBZSxRQUFPLGFBQWUsUUFBTyxhQUFlLE9BQU0sYUFBZSxRQUFPLFFBQU8sVUFBUyxRQUFPLFVBQVMsVUFBUyxTQUFRLFVBQVMsU0FBUSxRQUFPLFFBQU8sVUFBUyxRQUFPLGFBQWUsUUFBTyxhQUFlLE9BQU0sYUFBZSxRQUFPLFVBQVMsT0FBTSxVQUFTLFFBQU8sYUFBZSxRQUFPLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsU0FBUSxRQUFPLFNBQVEsUUFBTyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxXQUFVLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLE1BQUssUUFBTyxTQUFRLFVBQVMsTUFBSyxVQUFTLE1BQUssVUFBUyxNQUFLLFVBQVMsTUFBSyxVQUFTLE1BQUssVUFBUyxXQUFVLFVBQVMsV0FBVSxVQUFTLE1BQUssVUFBUyxPQUFNLFVBQVMsTUFBSyxVQUFTLE9BQU0sVUFBUyxRQUFPLFVBQVMsT0FBTSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsUUFBTyxVQUFTLFdBQVUsVUFBUyxRQUFPLFVBQVMsT0FBTSxVQUFTLFFBQU8sVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLFNBQVEsVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRO0FBRWhuMEIsY0FBSSxjQUFjO0FBQ2xCLGNBQUksWUFBWTtZQUNmLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBTTtZQUNOLEtBQUs7Ozs7O1lBS0wsS0FBSzs7Ozs7WUFLTCxLQUFLO1VBQ1A7QUFFQyxjQUFJLHFCQUFxQjtBQUN6QixjQUFJLDJCQUEyQjtBQUMvQixjQUFJLGNBQWM7QUFDbEIsY0FBSSxZQUFZLEVBQUMsVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFVBQVMsVUFBUyxVQUFTLE1BQUssVUFBUyxPQUFNLFVBQVMsT0FBTSxnQkFBZSxTQUFRLFFBQU8sU0FBUSxRQUFPLFNBQVEsUUFBTyxPQUFNLFVBQVMsT0FBTSxVQUFTLFNBQVEsUUFBTyxTQUFRLFFBQU8sTUFBSyxVQUFTLE9BQU0sYUFBZSxPQUFNLGFBQWUsVUFBUyxRQUFPLFVBQVMsUUFBTyxXQUFVLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsT0FBTSxLQUFJLE9BQU0sS0FBSSxPQUFNLFVBQVMsT0FBTSxVQUFTLFVBQVMsVUFBUyxRQUFPLFVBQVMsWUFBVyxVQUFTLFFBQU8sVUFBUyxPQUFNLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsWUFBVyxVQUFTLFlBQVcsVUFBUyxZQUFXLFVBQVMsWUFBVyxVQUFTLFlBQVcsVUFBUyxZQUFXLFVBQVMsWUFBVyxVQUFTLFlBQVcsVUFBUyxTQUFRLFVBQVMsV0FBVSxVQUFTLFlBQVcsVUFBUyxVQUFTLFVBQVMsU0FBUSxRQUFPLFdBQVUsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFFBQU8sYUFBZSxRQUFPLGFBQWUsTUFBSyxVQUFTLFVBQVMsVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLFFBQU8sVUFBUyxRQUFPLEtBQUssaUJBQWdCLFVBQVMsVUFBUyxVQUFTLFlBQVcsVUFBUyxTQUFRLFFBQU8sU0FBUSxRQUFPLFFBQU8sYUFBZSxRQUFPLGFBQWUsVUFBUyxVQUFTLE9BQU0sS0FBSSxTQUFRLFVBQVMsV0FBVSxVQUFTLFVBQVMsUUFBTyxVQUFTLFFBQU8sUUFBTyxRQUFPLFFBQU8sUUFBTyxZQUFXLFVBQVMsU0FBUSxVQUFTLFlBQVcsVUFBUyxlQUFjLFVBQVMsYUFBWSxVQUFTLFdBQVUsVUFBUyxhQUFZLFVBQVMsYUFBWSxVQUFTLFFBQU8sVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxZQUFXLFVBQVMsUUFBTyxVQUFTLFlBQVcsVUFBUyxTQUFRLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFdBQVUsVUFBUyxXQUFVLFVBQVMsV0FBVSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsY0FBYSxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFdBQVUsVUFBUyxPQUFNLGFBQWUsT0FBTSxhQUFlLFVBQVMsVUFBUyxXQUFVLFVBQVMsVUFBUyxVQUFTLFdBQVUsVUFBUyxZQUFXLFVBQVMsYUFBWSxVQUFTLFlBQVcsVUFBUyxXQUFVLFVBQVMsbUJBQWtCLFVBQVMsaUJBQWdCLFVBQVMsWUFBVyxVQUFTLFVBQVMsVUFBUyxZQUFXLFVBQVMsVUFBUyxVQUFTLGdCQUFlLFVBQVMsZUFBYyxVQUFTLGlCQUFnQixVQUFTLHFCQUFvQixVQUFTLHFCQUFvQixVQUFTLHNCQUFxQixVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsT0FBTSxXQUFVLFdBQVUsZ0JBQWUsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLGFBQWUsUUFBTyxhQUFlLE9BQU0sVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxZQUFXLFVBQVMsV0FBVSxVQUFTLFlBQVcsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsVUFBUyxRQUFPLFFBQU8sYUFBZSxRQUFPLFVBQVMsU0FBUSxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsUUFBTyxNQUFLLFNBQVEsVUFBUyxZQUFXLFVBQVMsUUFBTyxVQUFTLFVBQVMsVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxVQUFTLFVBQVMsWUFBVyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLHdCQUF1QixVQUFTLFFBQU8sZ0JBQWUsU0FBUSxVQUFTLFNBQVEsVUFBUyxXQUFVLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxRQUFPLFVBQVMsUUFBTyxTQUFRLFVBQVMsU0FBUSxVQUFTLFdBQVUsVUFBUyxTQUFRLFVBQVMsV0FBVSxVQUFTLFFBQU8s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QUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsUUFBTyxhQUFlLFFBQU8sYUFBZSxRQUFPLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxRQUFPLFVBQVMsV0FBVSxVQUFTLFdBQVUsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFdBQVUsVUFBUyxTQUFRLFVBQVMsY0FBYSxVQUFTLGVBQWMsVUFBUyxTQUFRLFVBQVMsVUFBUyxLQUFJLGNBQWEsVUFBUyxVQUFTLFVBQVMsZUFBYyxVQUFTLFNBQVEsVUFBUyxXQUFVLFVBQVMsWUFBVyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLE9BQU0sUUFBTyxPQUFNLFFBQU8sUUFBTyxRQUFPLFFBQU8sUUFBTyxRQUFPLFVBQVMsUUFBTyxLQUFJLFNBQVEsVUFBUyxVQUFTLFVBQVMsZUFBYyxVQUFTLGdCQUFlLFVBQVMsZ0JBQWUsVUFBUyxpQkFBZ0IsVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxPQUFNLGFBQWUsT0FBTSxhQUFlLFNBQVEsVUFBUyxxQkFBb0IsVUFBUyx5QkFBd0IsVUFBUyxTQUFRLE1BQUssUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLFFBQU8sYUFBZSxRQUFPLGFBQWUsVUFBUyxVQUFTLFVBQVMsVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLGNBQWEsVUFBUyxZQUFXLFVBQVMsVUFBUyxRQUFPLFVBQVMsVUFBUyxVQUFTLFFBQU8sVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFFBQU8sVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxRQUFPLGFBQWUsUUFBTyxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsT0FBTSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLE1BQUssVUFBUyxNQUFLLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsUUFBTyxVQUFTLFlBQVcsVUFBUyxPQUFNLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxXQUFVLFVBQVMsWUFBVyxVQUFTLFFBQU8sZ0JBQWUsVUFBUyxVQUFTLE9BQU0sYUFBZSxPQUFNLGFBQWUsTUFBSyxVQUFTLE1BQUssVUFBUyxPQUFNLFVBQVMsU0FBUSxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsTUFBSyxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLFFBQU8sVUFBUyxZQUFXLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxRQUFPLGFBQWUsUUFBTyxhQUFlLFNBQVEsS0FBSSxnQkFBZSxVQUFTLG9CQUFtQixVQUFTLG9CQUFtQixVQUFTLGtCQUFpQixVQUFTLGVBQWMsVUFBUyxxQkFBb0IsVUFBUyxnQkFBZSxVQUFTLFFBQU8sVUFBUyxRQUFPLGFBQWUsUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsTUFBSyxLQUFJLE1BQUssVUFBUyxNQUFLLEtBQUksUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFdBQVUsVUFBUyxhQUFZLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxhQUFZLFVBQVMsY0FBYSxVQUFTLFdBQVUsVUFBUyxVQUFTLFVBQVMsYUFBWSxnQkFBZSxRQUFPLGdCQUFlLFNBQVEsVUFBUyxVQUFTLFVBQVMsUUFBTyxRQUFPLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsV0FBVSxVQUFTLFNBQVEsVUFBUyxPQUFNLEtBQUksUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLGFBQVksVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLE9BQU0sYUFBZSxPQUFNLFVBQVMsZ0JBQWUsVUFBUyxZQUFXLFVBQVMsWUFBVyxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsaUJBQWdCLFVBQVMsa0JBQWlCLFVBQVMsUUFBTyxhQUFlLFFBQU8sVUFBUyxVQUFTLFVBQVMsa0JBQWlCLFVBQVMsUUFBTyxhQUFlLFFBQU8sVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxnQkFBZSxVQUFTLGFBQVksVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsUUFBTyxVQUFTLFFBQU8sTUFBSyxVQUFTLFNBQVEsUUFBTyxTQUFRLFFBQU8sT0FBTSxVQUFTLE9BQU0sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxTQUFRLFFBQU8sT0FBTSxVQUFTLE9BQU0sYUFBZSxPQUFNLFVBQVMsVUFBUyxRQUFPLFVBQVMsUUFBTyxNQUFLLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsTUFBSyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLGNBQWEsVUFBUyxZQUFXLFVBQVMsWUFBVyxVQUFTLFNBQVEsVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFdBQVUsVUFBUyxNQUFLLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxZQUFXLFVBQVMsVUFBUyxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsVUFBUyxVQUFTLFlBQVcsVUFBUyxZQUFXLFVBQVMsWUFBVyxVQUFTLGdCQUFlLFVBQVMsWUFBVyxVQUFTLFdBQVUsVUFBUyxrQkFBaUIsVUFBUyxrQkFBaUIsVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsUUFBTyxhQUFlLFFBQU8sYUFBZSxRQUFPLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxVQUFTLFFBQU8sUUFBTyxhQUFlLFFBQU8sVUFBUyxRQUFPLFVBQVMsV0FBVSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxNQUFLLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFFBQU8sUUFBTyxRQUFPLFFBQU8sU0FBUSxVQUFTLFNBQVEsVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLE9BQU0sYUFBZSxPQUFNLGFBQWUsU0FBUSxVQUFTLFFBQU8sYUFBZSxRQUFPLGFBQWUsUUFBTyxhQUFlLFFBQU8sYUFBZSxVQUFTLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLE9BQU0sYUFBZSxPQUFNLGFBQWUsVUFBUyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLGFBQWUsUUFBTyxhQUFlLFFBQU8sYUFBZSxRQUFPLGFBQWUsU0FBUSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsWUFBVyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxPQUFNLFVBQVMsY0FBYSxVQUFTLFNBQVEsUUFBTyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsV0FBVSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxXQUFVLFVBQVMsVUFBUyxVQUFTLE9BQU0sVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFFBQU8sVUFBUyxTQUFRLGdCQUFlLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFVBQVMsS0FBSSxVQUFTLEtBQUksU0FBUSxVQUFTLFdBQVUsVUFBUyxXQUFVLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxRQUFPLEtBQUksT0FBTSxVQUFTLE9BQU0sVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxXQUFVLFVBQVMsWUFBVyxVQUFTLFFBQU8sVUFBUyxNQUFLLFVBQVMsTUFBSyxVQUFTLG9CQUFtQixVQUFTLGFBQVksVUFBUyxhQUFZLFVBQVMsYUFBWSxVQUFTLGdCQUFlLFVBQVMsdUJBQXNCLFVBQVMsaUJBQWdCLFVBQVMsZUFBYyxVQUFTLHFCQUFvQixVQUFTLHFCQUFvQixVQUFTLGtCQUFpQixVQUFTLHFCQUFvQixVQUFTLGFBQVksVUFBUyxtQkFBa0IsVUFBUyxpQkFBZ0IsVUFBUyxrQkFBaUIsVUFBUyxrQkFBaUIsVUFBUyxrQkFBaUIsVUFBUyxrQkFBaUIsVUFBUyxtQkFBa0IsVUFBUyxxQkFBb0IsVUFBUyx1QkFBc0IsVUFBUyxtQkFBa0IsVUFBUyxXQUFVLFVBQVMsZ0JBQWUsVUFBUyxpQkFBZ0IsVUFBUyxrQkFBaUIsVUFBUyxnQkFBZSxVQUFTLG1CQUFrQixVQUFTLHFCQUFvQixVQUFTLG9CQUFtQixVQUFTLG1CQUFrQixVQUFTLGdCQUFlLFVBQVMsbUJBQWtCLFVBQVMsY0FBYSxVQUFTLGlCQUFnQixVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLFFBQU8sVUFBUyxZQUFXLFVBQVMsT0FBTSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsV0FBVSxVQUFTLFlBQVcsVUFBUyxRQUFPLGdCQUFlLFVBQVMsVUFBUyxjQUFhLFVBQVMsV0FBVSxVQUFTLGFBQVksVUFBUyxjQUFhLFVBQVMsb0JBQW1CLFVBQVMsaUJBQWdCLFVBQVMsZUFBYyxVQUFTLFdBQVUsVUFBUyxZQUFXLFVBQVMsV0FBVSxVQUFTLGtCQUFpQixVQUFTLGFBQVksVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLE9BQU0sYUFBZSxPQUFNLGFBQWUsTUFBSyxVQUFTLE9BQU0sVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsTUFBSyxVQUFTLE1BQUssVUFBUyxTQUFRLFVBQVMsWUFBVyxVQUFTLGNBQWEsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLGNBQWEsVUFBUyxRQUFPLFVBQVMsWUFBVyxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsaUJBQWdCLFVBQVMsaUJBQWdCLFVBQVMsaUJBQWdCLFVBQVMsc0JBQXFCLFVBQVMsc0JBQXFCLFVBQVMsc0JBQXFCLFVBQVMsY0FBYSxVQUFTLGtCQUFpQixVQUFTLGtCQUFpQixVQUFTLGtCQUFpQixVQUFTLGlCQUFnQixVQUFTLGtCQUFpQixVQUFTLFNBQVEsVUFBUyxRQUFPLGFBQWUsUUFBTyxhQUFlLFVBQVMsVUFBUyxXQUFVLFVBQVMsVUFBUyxVQUFTLFVBQVMsS0FBSSxrQkFBaUIsVUFBUyxtQkFBa0IsVUFBUyxPQUFNLFVBQVMsV0FBVSxVQUFTLFFBQU8sVUFBUyxRQUFPLEtBQUksVUFBUyxVQUFTLFNBQVEsVUFBUyxZQUFXLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxPQUFNLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxRQUFPLGFBQWUsUUFBTyxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsUUFBTyxLQUFJLFNBQVEsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxNQUFLLEtBQUksTUFBSyxVQUFTLE1BQUssS0FBSSxRQUFPLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxXQUFVLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFlBQVcsVUFBUyxXQUFVLFVBQVMsYUFBWSxnQkFBZSxRQUFPLGdCQUFlLFFBQU8sUUFBTyxRQUFPLFVBQVMsUUFBTyxVQUFTLFdBQVUsVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLFVBQVMsVUFBUyxjQUFhLFVBQVMsY0FBYSxVQUFTLFlBQVcsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxpQkFBZ0IsVUFBUyxlQUFjLFVBQVMsYUFBWSxVQUFTLE9BQU0sYUFBZSxPQUFNLGFBQWUsT0FBTSxVQUFTLFNBQVEsUUFBTyxPQUFNLFVBQVMsVUFBUyxLQUFJLFVBQVMsVUFBUyxVQUFTLFFBQU8sU0FBUSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsV0FBVSxVQUFTLGFBQVksVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsUUFBTyxhQUFlLFFBQU8sYUFBZSxNQUFLLFVBQVMsUUFBTyxhQUFlLFFBQU8sVUFBUyxVQUFTLFVBQVMsTUFBSyxVQUFTLE1BQUssVUFBUyxZQUFXLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFFBQU8sZ0JBQWUsT0FBTSxVQUFTLFFBQU8sZ0JBQWUsU0FBUSxnQkFBZSxTQUFRLFVBQVMsV0FBVSxVQUFTLFNBQVEsVUFBUyxXQUFVLFVBQVMsWUFBVyxVQUFTLFFBQU8sUUFBTyxTQUFRLGdCQUFlLFVBQVMsZ0JBQWUsUUFBTyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsWUFBVyxnQkFBZSxRQUFPLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxTQUFRLFVBQVMsTUFBSyxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFdBQVUsVUFBUyxTQUFRLGdCQUFlLHVCQUFzQixVQUFTLHNCQUFxQixVQUFTLHFCQUFvQixVQUFTLHlCQUF3QixVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsU0FBUSxnQkFBZSx3QkFBdUIsVUFBUyxrQkFBaUIsVUFBUyxXQUFVLE1BQUssVUFBUyxVQUFTLFdBQVUsVUFBUyxPQUFNLGFBQWUsT0FBTSxhQUFlLE9BQU0sVUFBUyxPQUFNLGdCQUFlLFFBQU8sVUFBUyxTQUFRLGdCQUFlLGFBQVksZ0JBQWUsUUFBTyxnQkFBZSxPQUFNLGdCQUFlLFNBQVEsVUFBUyxPQUFNLFVBQVMsT0FBTSxnQkFBZSxRQUFPLFVBQVMsUUFBTyxnQkFBZSxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxNQUFLLFVBQVMsT0FBTSxVQUFTLFFBQU8sVUFBUyxPQUFNLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFFBQU8sVUFBUyxPQUFNLFVBQVMsT0FBTSxnQkFBZSxjQUFhLFVBQVMsY0FBYSxVQUFTLG1CQUFrQixVQUFTLG1CQUFrQixVQUFTLFFBQU8sVUFBUyxTQUFRLGdCQUFlLGFBQVksZ0JBQWUsUUFBTyxnQkFBZSxTQUFRLFVBQVMsT0FBTSxnQkFBZSxTQUFRLFVBQVMsT0FBTSxVQUFTLE9BQU0sZ0JBQWUsU0FBUSxVQUFTLFVBQVMsVUFBUyxRQUFPLGdCQUFlLFFBQU8sVUFBUyxXQUFVLFVBQVMsb0JBQW1CLFFBQU8sUUFBTyxhQUFlLFFBQU8sVUFBUyxPQUFNLFFBQU8sT0FBTSxVQUFTLGdCQUFlLFVBQVMsYUFBWSxVQUFTLHdCQUF1QixVQUFTLGNBQWEsVUFBUyxZQUFXLFVBQVMsaUJBQWdCLGdCQUFlLGFBQVksVUFBUyxjQUFhLFVBQVMsbUJBQWtCLFVBQVMsdUJBQXNCLGdCQUFlLHFCQUFvQixnQkFBZSxrQkFBaUIsVUFBUyx3QkFBdUIsZ0JBQWUsbUJBQWtCLFVBQVMsbUJBQWtCLGdCQUFlLGdCQUFlLGdCQUFlLFNBQVEsVUFBUyxZQUFXLGdCQUFlLFVBQVMsZ0JBQWUsV0FBVSxVQUFTLFdBQVUsVUFBUyxXQUFVLFVBQVMsbUJBQWtCLFVBQVMsc0JBQXFCLGdCQUFlLHdCQUF1QixVQUFTLFdBQVUsVUFBUyxnQkFBZSxVQUFTLGtCQUFpQixVQUFTLGVBQWMsZ0JBQWUscUJBQW9CLGdCQUFlLGdCQUFlLFVBQVMsMkJBQTBCLGdCQUFlLHFCQUFvQixnQkFBZSxTQUFRLFVBQVMsV0FBVSxVQUFTLFdBQVUsVUFBUyxXQUFVLFVBQVMsZUFBYyxVQUFTLG9CQUFtQixnQkFBZSx5QkFBd0IsVUFBUyxxQkFBb0IsVUFBUyxvQkFBbUIsVUFBUyx1QkFBc0IsZ0JBQWUseUJBQXdCLFVBQVMsbUJBQWtCLGdCQUFlLHdCQUF1QixVQUFTLHFCQUFvQixnQkFBZSwwQkFBeUIsVUFBUyxhQUFZLGdCQUFlLGtCQUFpQixVQUFTLGVBQWMsVUFBUyxvQkFBbUIsZ0JBQWUseUJBQXdCLFVBQVMsb0JBQW1CLGdCQUFlLGVBQWMsZ0JBQWUsb0JBQW1CLFVBQVMsWUFBVyxVQUFTLGlCQUFnQixVQUFTLHFCQUFvQixVQUFTLGlCQUFnQixVQUFTLGtCQUFpQixVQUFTLFFBQU8sVUFBUyxhQUFZLFVBQVMsVUFBUyxnQkFBZSxTQUFRLGdCQUFlLFdBQVUsVUFBUyxPQUFNLFVBQVMsVUFBUyxVQUFTLFFBQU8sZ0JBQWUsU0FBUSxVQUFTLFdBQVUsZ0JBQWUsU0FBUSxVQUFTLFNBQVEsVUFBUyxVQUFTLGdCQUFlLFVBQVMsZ0JBQWUsZUFBYyxVQUFTLGVBQWMsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLE9BQU0sVUFBUyxVQUFTLFVBQVMsUUFBTyxnQkFBZSxRQUFPLGFBQWUsUUFBTyxhQUFlLGFBQVksVUFBUyxrQkFBaUIsVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFdBQVUsVUFBUyxXQUFVLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRLGdCQUFlLFdBQVUsZ0JBQWUsYUFBWSxVQUFTLGNBQWEsZ0JBQWUsU0FBUSxVQUFTLFdBQVUsZ0JBQWUsUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRLGdCQUFlLFdBQVUsZ0JBQWUsYUFBWSxVQUFTLGNBQWEsZ0JBQWUsUUFBTyxVQUFTLFVBQVMsUUFBTyxVQUFTLFFBQU8sUUFBTyxVQUFTLGlCQUFnQixVQUFTLG1CQUFrQixVQUFTLGtCQUFpQixVQUFTLG9CQUFtQixVQUFTLE1BQUssVUFBUyxNQUFLLFVBQVMsT0FBTSxLQUFJLFVBQVMsVUFBUyxTQUFRLFVBQVMsUUFBTyxnQkFBZSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsUUFBTyxnQkFBZSxRQUFPLFdBQVUsVUFBUyxVQUFTLFdBQVUsVUFBUyxVQUFTLFVBQVMsUUFBTyxnQkFBZSxRQUFPLFdBQVUsV0FBVSxnQkFBZSxVQUFTLFVBQVMsV0FBVSxnQkFBZSxTQUFRLGdCQUFlLFVBQVMsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFdBQVUsVUFBUyxVQUFTLFVBQVMsVUFBUyxRQUFPLFVBQVMsUUFBTyxRQUFPLFVBQVMsUUFBTyxVQUFTLFNBQVEsUUFBTyxTQUFRLFFBQU8sT0FBTSxVQUFTLE9BQU0sVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxPQUFNLGFBQWUsT0FBTSxhQUFlLFFBQU8sVUFBUyxVQUFTLFFBQU8sVUFBUyxRQUFPLE9BQU0sVUFBUyxTQUFRLFVBQVMsT0FBTSxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFdBQVUsVUFBUyxTQUFRLFVBQVMsT0FBTSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxXQUFVLFVBQVMsV0FBVSxVQUFTLFFBQU8sVUFBUyxVQUFTLFVBQVMsUUFBTyxhQUFlLFFBQU8sYUFBZSxRQUFPLFVBQVMsd0JBQXVCLFVBQVMsa0JBQWlCLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxNQUFLLFVBQVMsTUFBSyxVQUFTLFNBQVEsVUFBUyxPQUFNLFVBQVMsU0FBUSxVQUFTLFdBQVUsVUFBUyxRQUFPLFFBQU8sUUFBTyxRQUFPLFVBQVMsVUFBUyxRQUFPLFVBQVMsV0FBVSxVQUFTLE9BQU0sVUFBUyxNQUFLLFVBQVMsUUFBTyxVQUFTLFFBQU8sYUFBZSxVQUFTLFFBQU8sVUFBUyxRQUFPLFFBQU8sVUFBUyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsVUFBUyxVQUFTLFVBQVMsWUFBVyxVQUFTLFFBQU8sUUFBTyxRQUFPLFFBQU8sU0FBUSxVQUFTLFdBQVUsVUFBUyxhQUFZLFVBQVMsZUFBYyxVQUFTLG1CQUFrQixVQUFTLE9BQU0sVUFBUyxRQUFPLFFBQU8sWUFBVyxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLFlBQVcsVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLFVBQVMsS0FBSSxVQUFTLEtBQUksVUFBUyxVQUFTLFFBQU8sVUFBUyxXQUFVLFVBQVMsT0FBTSxhQUFlLE9BQU0sYUFBZSxPQUFNLFVBQVMsT0FBTSxVQUFTLFFBQU8sVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLE1BQUssVUFBUyxNQUFLLFVBQVMsYUFBWSxVQUFTLE9BQU0sVUFBUyxVQUFTLFVBQVMsV0FBVSxVQUFTLFVBQVMsVUFBUyxRQUFPLEtBQUksWUFBVyxVQUFTLFNBQVEsVUFBUyxXQUFVLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsYUFBWSxRQUFPLFVBQVMsUUFBTyxXQUFVLFVBQVMsV0FBVSxVQUFTLE1BQUssUUFBTyxpQkFBZ0IsVUFBUyxZQUFXLFVBQVMsUUFBTyxhQUFlLFFBQU8sVUFBUyxTQUFRLFFBQU8sTUFBSyxVQUFTLE1BQUssVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsUUFBTyxVQUFTLGNBQWEsVUFBUyxlQUFjLFVBQVMsWUFBVyxVQUFTLGlCQUFnQixVQUFTLHNCQUFxQixVQUFTLGlCQUFnQixVQUFTLFVBQVMsVUFBUyxlQUFjLFVBQVMsWUFBVyxVQUFTLFlBQVcsVUFBUyxXQUFVLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFFBQU8sVUFBUyxVQUFTLFVBQVMsUUFBTyxVQUFTLFdBQVUsVUFBUyxZQUFXLFVBQVMsWUFBVyxVQUFTLFlBQVcsVUFBUyxRQUFPLFVBQVMsY0FBYSxVQUFTLGdCQUFlLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsUUFBTyxhQUFlLFFBQU8sYUFBZSxPQUFNLFVBQVMsT0FBTSxVQUFTLFVBQVMsVUFBUyxPQUFNLGFBQWUsT0FBTSxhQUFlLFFBQU8sVUFBUyxRQUFPLGFBQWUsUUFBTyxVQUFTLFVBQVMsVUFBUyxRQUFPLGFBQWUsUUFBTyxhQUFlLGVBQWMsVUFBUyxXQUFVLFVBQVMsU0FBUSxLQUFJLFdBQVUsVUFBUyxRQUFPLEtBQUksUUFBTyxLQUFJLFNBQVEsVUFBUyxRQUFPLGdCQUFlLFVBQVMsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFlBQVcsVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFNBQVEsUUFBTyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFdBQVUsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFdBQVUsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxhQUFZLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFVBQVMsS0FBSSxVQUFTLEtBQUksU0FBUSxVQUFTLFdBQVUsVUFBUyxXQUFVLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxRQUFPLEtBQUksT0FBTSxVQUFTLE9BQU0sVUFBUyxRQUFPLFVBQVMsV0FBVSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsUUFBTyxVQUFTLE1BQUssVUFBUyxRQUFPLFVBQVMsV0FBVSxVQUFTLFlBQVcsVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLE9BQU0sUUFBTyxPQUFNLFFBQU8sa0JBQWlCLFVBQVMsc0JBQXFCLFVBQVMsd0JBQXVCLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxPQUFNLGFBQWUsT0FBTSxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLFFBQU8sVUFBUyxxQkFBb0IsVUFBUyxjQUFhLFVBQVMsY0FBYSxVQUFTLGNBQWEsVUFBUyxpQkFBZ0IsVUFBUyx1QkFBc0IsVUFBUyxrQkFBaUIsVUFBUyxnQkFBZSxVQUFTLHNCQUFxQixVQUFTLHNCQUFxQixVQUFTLG1CQUFrQixVQUFTLHNCQUFxQixVQUFTLGNBQWEsVUFBUyxvQkFBbUIsVUFBUyxrQkFBaUIsVUFBUyxtQkFBa0IsVUFBUyxxQkFBb0IsVUFBUyxvQkFBbUIsVUFBUyxtQkFBa0IsVUFBUyxZQUFXLFVBQVMsaUJBQWdCLFVBQVMsa0JBQWlCLFVBQVMsbUJBQWtCLFVBQVMsaUJBQWdCLFVBQVMsb0JBQW1CLFVBQVMsc0JBQXFCLFVBQVMscUJBQW9CLFVBQVMsb0JBQW1CLFVBQVMsaUJBQWdCLFVBQVMsb0JBQW1CLFVBQVMsZUFBYyxVQUFTLGtCQUFpQixVQUFTLFFBQU8sVUFBUyxnQkFBZSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsT0FBTSxVQUFTLFVBQVMsVUFBUyxjQUFhLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxRQUFPLGFBQWUsUUFBTyxVQUFTLFVBQVMsVUFBUyxXQUFVLFVBQVMsZ0JBQWUsVUFBUyxRQUFPLEtBQUksVUFBUyxVQUFTLFlBQVcsVUFBUyxTQUFRLFVBQVMsZUFBYyxVQUFTLFVBQVMsVUFBUyxRQUFPLGFBQWUsUUFBTyxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsUUFBTyxLQUFJLFNBQVEsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxZQUFXLFVBQVMsZUFBYyxVQUFTLFdBQVUsVUFBUyxNQUFLLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsTUFBSyxVQUFTLE1BQUssVUFBUyxRQUFPLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFFBQU8sVUFBUyxVQUFTLFVBQVMsWUFBVyxVQUFTLFNBQVEsVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFdBQVUsVUFBUyxRQUFPLFFBQU8sUUFBTyxLQUFJLFVBQVMsVUFBUyxZQUFXLFVBQVMsU0FBUSxVQUFTLFFBQU8sVUFBUyxPQUFNLGFBQWUsT0FBTSxhQUFlLFVBQVMsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLGtCQUFpQixVQUFTLGtCQUFpQixVQUFTLFlBQVcsVUFBUyxpQkFBZ0IsVUFBUyxtQkFBa0IsVUFBUyxnQkFBZSxVQUFTLE9BQU0sUUFBTyxTQUFRLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsT0FBTSxVQUFTLFVBQVMsVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsV0FBVSxVQUFTLFdBQVUsVUFBUyxTQUFRLFVBQVMsZUFBYyxVQUFTLGlCQUFnQixVQUFTLFVBQVMsVUFBUyxZQUFXLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxPQUFNLFVBQVMsUUFBTyxVQUFTLFNBQVEsZ0JBQWUsVUFBUyxVQUFTLFVBQVMsVUFBUyxPQUFNLEtBQUksUUFBTyxVQUFTLFVBQVMsVUFBUyxRQUFPLGFBQWUsUUFBTyxhQUFlLFVBQVMsVUFBUyxhQUFZLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxVQUFTLGdCQUFlLFNBQVEsVUFBUyxVQUFTLGdCQUFlLFFBQU8sVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFlBQVcsVUFBUyxjQUFhLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxZQUFXLFVBQVMsY0FBYSxVQUFTLE9BQU0sVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLHNCQUFxQixVQUFTLGdCQUFlLFVBQVMscUJBQW9CLFVBQVMsa0JBQWlCLFVBQVMsdUJBQXNCLFVBQVMsZUFBYyxVQUFTLFVBQVMsVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFFBQU8sYUFBZSxRQUFPLGFBQWUsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsbUJBQWtCLFVBQVMsZUFBYyxVQUFTLFNBQVEsUUFBTyxPQUFNLFVBQVMsT0FBTSxVQUFTLFVBQVMsVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFdBQVUsVUFBUyxXQUFVLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxXQUFVLFVBQVMsV0FBVSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsWUFBVyxVQUFTLGFBQVksVUFBUyxlQUFjLFVBQVMsYUFBWSxVQUFTLGNBQWEsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxRQUFPLFVBQVMsY0FBYSxVQUFTLGVBQWMsVUFBUyxZQUFXLFVBQVMsaUJBQWdCLFVBQVMsc0JBQXFCLFVBQVMsaUJBQWdCLFVBQVMsVUFBUyxVQUFTLGVBQWMsVUFBUyxZQUFXLFVBQVMsWUFBVyxVQUFTLFdBQVUsVUFBUyxZQUFXLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxRQUFPLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxRQUFPLFFBQU8sUUFBTyxRQUFPLFFBQU8sUUFBTyxVQUFTLFVBQVMsV0FBVSxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsV0FBVSxVQUFTLFlBQVcsVUFBUyxpQkFBZ0IsVUFBUyxXQUFVLFVBQVMsV0FBVSxVQUFTLFdBQVUsVUFBUyxXQUFVLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxXQUFVLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxZQUFXLFVBQVMsYUFBWSxVQUFTLGFBQVksVUFBUyxjQUFhLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsV0FBVSxVQUFTLFVBQVMsVUFBUyxTQUFRLFFBQU8sT0FBTSxLQUFLLFVBQVMsVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLFFBQU8sVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxRQUFPLFVBQVMsVUFBUyxVQUFTLE9BQU0sYUFBZSxPQUFNLGFBQWUsVUFBUyxVQUFTLGFBQVksVUFBUyxhQUFZLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxZQUFXLFVBQVMsVUFBUyxVQUFTLGVBQWMsVUFBUyxZQUFXLFVBQVMsY0FBYSxnQkFBZSxVQUFTLFVBQVMsYUFBWSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsU0FBUSxRQUFPLFNBQVEsUUFBTyxTQUFRLFVBQVMsU0FBUSxVQUFTLGNBQWEsVUFBUyxrQkFBaUIsVUFBUyxjQUFhLFVBQVMsU0FBUSxRQUFPLFVBQVMsVUFBUyxZQUFXLFVBQVMsVUFBUyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsT0FBTSxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsUUFBTyxhQUFlLFFBQU8sYUFBZSxXQUFVLFVBQVMsUUFBTyxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFlBQVcsVUFBUyxnQkFBZSxVQUFTLGdCQUFlLFVBQVMsa0JBQWlCLFVBQVMsYUFBWSxVQUFTLGlCQUFnQixVQUFTLG1CQUFrQixVQUFTLFVBQVMsVUFBUyxRQUFPLFVBQVMsWUFBVyxVQUFTLGFBQVksVUFBUyxXQUFVLFVBQVMsU0FBUSxVQUFTLFdBQVUsVUFBUyxZQUFXLFVBQVMsUUFBTyxhQUFlLFFBQU8sYUFBZSxRQUFPLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsb0JBQW1CLFVBQVMscUJBQW9CLFVBQVMsVUFBUyxRQUFPLFVBQVMsUUFBTyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxZQUFXLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFNBQVEsUUFBTyxTQUFRLFFBQU8sT0FBTSxVQUFTLE9BQU0sVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLE9BQU0sYUFBZSxPQUFNLGFBQWUsVUFBUyxRQUFPLFVBQVMsUUFBTyxRQUFPLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFlBQVcsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsT0FBTSxRQUFPLFlBQVcsS0FBSSxjQUFhLFVBQVMsZ0JBQWUsVUFBUyxvQkFBbUIsVUFBUyxTQUFRLFVBQVMsYUFBWSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsUUFBTyxhQUFlLFFBQU8sYUFBZSxXQUFVLFVBQVMsV0FBVSxVQUFTLFdBQVUsVUFBUyxjQUFhLFVBQVMsb0JBQW1CLFVBQVMsZUFBYyxVQUFTLGVBQWMsVUFBUyxlQUFjLFVBQVMsaUJBQWdCLFVBQVMsaUJBQWdCLFVBQVMsa0JBQWlCLFVBQVMsU0FBUSxVQUFTLGtCQUFpQixVQUFTLG1CQUFrQixVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFdBQVUsVUFBUyxXQUFVLFVBQVMsU0FBUSxVQUFTLGNBQWEsVUFBUyxjQUFhLFVBQVMsVUFBUyxVQUFTLFlBQVcsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsUUFBTyxhQUFlLFFBQU8sYUFBZSxTQUFRLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxRQUFPLFFBQU8sUUFBTyxRQUFPLFdBQVUsVUFBUyxVQUFTLFVBQVMsY0FBYSxVQUFTLFlBQVcsVUFBUyxjQUFhLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxhQUFZLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxVQUFTLFVBQVMsWUFBVyxVQUFTLGdCQUFlLGdCQUFlLGlCQUFnQixnQkFBZSxnQkFBZSxnQkFBZSxpQkFBZ0IsZ0JBQWUsWUFBVyxVQUFTLG1CQUFrQixVQUFTLG9CQUFtQixVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsU0FBUSxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsU0FBUSxVQUFTLFVBQVMsVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLFVBQVMsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFVBQVMsS0FBSSxVQUFTLFVBQVMsUUFBTyxLQUFJLFFBQU8sVUFBUyxlQUFjLFVBQVMsZ0JBQWUsS0FBSSxxQkFBb0IsVUFBUyxpQkFBZ0IsVUFBUyxpQkFBZ0IsVUFBUyxPQUFNLGFBQWUsT0FBTSxhQUFlLFNBQVEsVUFBUyxTQUFRLGdCQUFlLFNBQVEsZ0JBQWUsUUFBTyxhQUFlLFFBQU8sYUFBZSxTQUFRLFVBQVMsU0FBUSxVQUFTLFFBQU8sYUFBZSxRQUFPLGFBQWUsVUFBUyxnQkFBZSxVQUFTLGdCQUFlLFVBQVMsZ0JBQWUsVUFBUyxnQkFBZSxVQUFTLFVBQVMsV0FBVSxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxPQUFNLGFBQWUsT0FBTSxhQUFlLFFBQU8sYUFBZSxRQUFPLGFBQWUsTUFBSyxVQUFTLE1BQUssVUFBUyxVQUFTLFVBQVMsUUFBTyxhQUFlLFFBQU8sYUFBZSxRQUFPLFVBQVMsU0FBUSxVQUFTLFFBQU8sVUFBUyxTQUFRLFVBQVMsT0FBTSxhQUFlLE9BQU0sYUFBZSxTQUFRLFVBQVMsU0FBUSxVQUFTLE1BQUssVUFBUyxNQUFLLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxRQUFPLGFBQWUsUUFBTyxhQUFlLFVBQVMsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFNBQVEsVUFBUyxRQUFPLGFBQWUsUUFBTyxhQUFlLFVBQVMsVUFBUyxVQUFTLFVBQVMsU0FBUSxVQUFTLFFBQU8sVUFBUyxVQUFTLFVBQVMsVUFBUyxRQUFPLFVBQVMsUUFBTyxRQUFPLFVBQVMsUUFBTyxVQUFTLFNBQVEsVUFBUyxTQUFRLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxPQUFNLFFBQU8sT0FBTSxhQUFlLE9BQU0sYUFBZSxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sYUFBZSxRQUFPLGFBQWUsUUFBTyxhQUFlLFFBQU8sYUFBZSxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sUUFBTyxRQUFPLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLFVBQVMsVUFBUyxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxVQUFTLFVBQVMsa0JBQWlCLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxPQUFNLGFBQWUsT0FBTSxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsV0FBVSxVQUFTLFFBQU8sYUFBZSxRQUFPLFVBQVMsUUFBTyxhQUFlLFFBQU8sYUFBZSxPQUFNLFVBQVMsUUFBTyxTQUFRO0FBQ3A5dUMsY0FBSSxrQkFBa0IsRUFBQyxVQUFTLFFBQU8sVUFBUyxRQUFPLFNBQVEsUUFBTyxTQUFRLFFBQU8sU0FBUSxRQUFPLFNBQVEsUUFBTyxTQUFRLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxPQUFNLEtBQUksT0FBTSxLQUFJLFNBQVEsUUFBTyxTQUFRLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxRQUFPLFFBQU8sUUFBTyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFNBQVEsUUFBTyxRQUFPLFFBQU8sUUFBTyxRQUFPLFFBQU8sUUFBTyxVQUFTLFFBQU8sT0FBTSxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFNBQVEsUUFBTyxTQUFRLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxPQUFNLFFBQU8sT0FBTSxRQUFPLFFBQU8sUUFBTyxRQUFPLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sTUFBSyxLQUFJLE1BQUssS0FBSSxVQUFTLFFBQU8sVUFBUyxRQUFPLFNBQVEsUUFBTyxTQUFRLFFBQU8sU0FBUSxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFFBQU8sUUFBTyxRQUFPLFFBQU8sU0FBUSxRQUFPLE1BQUssS0FBSSxNQUFLLEtBQUksUUFBTyxRQUFPLFNBQVEsUUFBTyxVQUFTLFFBQU8sUUFBTyxRQUFPLE9BQU0sUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sU0FBUSxRQUFPLFNBQVEsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFFBQU8sUUFBTyxRQUFPLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFFBQU8sUUFBTyxRQUFPLFFBQU8sUUFBTyxRQUFPLFVBQVMsUUFBTyxTQUFRLFFBQU8sUUFBTyxLQUFJLFFBQU8sS0FBSSxTQUFRLFFBQU8sT0FBTSxRQUFPLE9BQU0sUUFBTyxRQUFPLFFBQU8sT0FBTSxRQUFPLFFBQU8sUUFBTyxRQUFPLFFBQU8sUUFBTyxRQUFPLFNBQVEsUUFBTyxTQUFRLFFBQU8sU0FBUSxRQUFPLFNBQVEsUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLFNBQVEsUUFBTyxTQUFRLFFBQU8sVUFBUyxRQUFPLFVBQVMsUUFBTyxPQUFNLFFBQU8sUUFBTyxRQUFPLFFBQU8sUUFBTyxVQUFTLFFBQU8sVUFBUyxRQUFPLE9BQU0sUUFBTyxRQUFPLE9BQU07QUFDbGlELGNBQUksbUJBQW1CLEVBQUMsS0FBSSxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFTLE9BQU0sVUFBUyxPQUFNLFVBQVMsT0FBTSxVQUFT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LFFBQVE7QUFBQSxVQUNSLFFBQVE7QUFBQSxVQUNSLE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxVQUNOLFVBQVU7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULFdBQVc7QUFBQSxVQUNYLGNBQWM7QUFBQSxVQUNkLE1BQU07QUFBQSxVQUNOLElBQUk7QUFBQSxVQUNKLFlBQVk7QUFBQSxVQUNaLGFBQWE7QUFBQSxVQUNiLFdBQVc7QUFBQSxVQUNYLFdBQVc7QUFBQSxVQUNYLFdBQVc7QUFBQSxVQUNYLElBQUk7QUFBQSxVQUNKLFFBQVE7QUFBQSxVQUNSLFVBQVU7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULFdBQVc7QUFBQSxVQUNYLFVBQVU7QUFBQSxVQUNWLFdBQVc7QUFBQSxVQUNYLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxVQUNOLE9BQU87QUFBQSxVQUNQLE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxVQUNOLEtBQUs7QUFBQSxVQUNMLFVBQVU7QUFBQSxVQUNWLGFBQWE7QUFBQSxVQUNiLGNBQWM7QUFBQSxVQUNkLEtBQUs7QUFBQSxVQUNMLFdBQVc7QUFBQSxVQUNYLE9BQU87QUFBQSxVQUNQLFlBQVk7QUFBQSxVQUNaLFFBQVE7QUFBQSxVQUNSLEtBQUs7QUFBQSxVQUNMLFdBQVc7QUFBQSxVQUNYLFVBQVU7QUFBQSxVQUNWLE9BQU87QUFBQSxVQUNQLE1BQU07QUFBQSxVQUNOLFVBQVU7QUFBQSxVQUNWLE9BQU87QUFBQSxVQUNQLFlBQVk7QUFBQSxVQUNaLE1BQU07QUFBQSxVQUNOLFNBQVM7QUFBQSxVQUNULFNBQVM7QUFBQSxVQUNULGFBQWE7QUFBQSxVQUNiLGFBQWE7QUFBQSxVQUNiLFFBQVE7QUFBQSxVQUNSLFNBQVM7QUFBQSxVQUNULFNBQVM7QUFBQSxVQUNULFlBQVk7QUFBQSxVQUNaLFVBQVU7QUFBQSxVQUNWLGdCQUFnQjtBQUFBLFVBQ2hCLEtBQUs7QUFBQSxVQUNMLFVBQVU7QUFBQSxVQUNWLFVBQVU7QUFBQSxVQUNWLE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxVQUNOLFNBQVM7QUFBQSxVQUNULFNBQVM7QUFBQSxVQUNULE9BQU87QUFBQSxVQUNQLFFBQVE7QUFBQSxVQUNSLFdBQVc7QUFBQSxVQUNYLFVBQVU7QUFBQSxVQUNWLFVBQVU7QUFBQSxVQUNWLE9BQU87QUFBQSxVQUNQLE1BQU07QUFBQSxVQUNOLE9BQU87QUFBQSxVQUNQLE1BQU07QUFBQSxVQUNOLFlBQVk7QUFBQSxVQUNaLEtBQUs7QUFBQSxVQUNMLFFBQVE7QUFBQSxVQUNSLFNBQVM7QUFBQSxVQUNULFFBQVE7QUFBQSxVQUNSLE9BQU87QUFBQSxVQUNQLE1BQU07QUFBQSxVQUNOLE9BQU87QUFBQSxVQUNQLFNBQVM7QUFBQSxVQUNULFVBQVU7QUFBQSxVQUNWLFFBQVE7QUFBQSxVQUNSLE9BQU87QUFBQSxVQUNQLE1BQU07QUFBQSxVQUNOLFFBQVE7QUFBQSxVQUNSLE9BQU87QUFBQSxVQUNQLE9BQU87QUFBQSxVQUNQLE9BQU87QUFBQSxVQUNQLE1BQU07QUFBQTtBQUFBLFVBRU4sT0FBTztBQUFBLFVBQ1AsY0FBYztBQUFBLFVBQ2QsaUJBQWlCO0FBQUEsVUFDakIsWUFBWTtBQUFBLFVBQ1osVUFBVTtBQUFBLFVBQ1YsbUJBQW1CO0FBQUEsVUFDbkIsc0JBQXNCO0FBQUEsVUFDdEIsY0FBYztBQUFBLFVBQ2QsWUFBWTtBQUFBLFVBQ1osV0FBVztBQUFBLFVBQ1gsWUFBWTtBQUFBLFVBQ1osZUFBZTtBQUFBLFVBQ2YsUUFBUTtBQUFBLFVBQ1IsZUFBZTtBQUFBLFVBQ2YsZUFBZTtBQUFBLFVBQ2YsYUFBYTtBQUFBLFVBQ2IsU0FBUztBQUFBLFVBQ1QsZUFBZTtBQUFBLFVBQ2YsZUFBZTtBQUFBLFVBQ2Ysa0JBQWtCO0FBQUEsVUFDbEIsYUFBYTtBQUFBLFVBQ2IsTUFBTTtBQUFBLFVBQ04sT0FBTztBQUFBLFVBQ1AsTUFBTTtBQUFBLFVBQ04sSUFBSTtBQUFBLFVBQ0osVUFBVTtBQUFBLFVBQ1YsV0FBVztBQUFBLFVBQ1gsY0FBYztBQUFBLFVBQ2QsTUFBTTtBQUFBLFVBQ04sVUFBVTtBQUFBLFVBQ1YsYUFBYTtBQUFBLFVBQ2IsZUFBZTtBQUFBLFVBQ2YsVUFBVTtBQUFBLFVBQ1YsYUFBYTtBQUFBLFVBQ2IsT0FBTztBQUFBLFVBQ1Asb0JBQW9CO0FBQUEsVUFDcEIsdUJBQXVCO0FBQUEsVUFDdkIsMkJBQTJCO0FBQUEsVUFDM0IsK0JBQStCO0FBQUEsVUFDL0IsY0FBYztBQUFBLFVBQ2QsaUJBQWlCO0FBQUEsVUFDakIsZ0JBQWdCO0FBQUEsVUFDaEIsbUJBQW1CO0FBQUEsVUFDbkIsbUJBQW1CO0FBQUEsVUFDbkIsa0JBQWtCO0FBQUEsVUFDbEIsUUFBUTtBQUFBLFVBQ1IsSUFBSTtBQUFBLFVBQ0osSUFBSTtBQUFBLFVBQ0osR0FBRztBQUFBLFVBQ0gsVUFBVTtBQUFBLFVBQ1YsWUFBWTtBQUFBLFVBQ1osU0FBUztBQUFBLFVBQ1QsaUJBQWlCO0FBQUEsVUFDakIsV0FBVztBQUFBLFVBQ1gsU0FBUztBQUFBLFVBQ1QsU0FBUztBQUFBLFVBQ1Qsa0JBQWtCO0FBQUEsVUFDbEIscUJBQXFCO0FBQUEsVUFDckIsS0FBSztBQUFBLFVBQ0wsSUFBSTtBQUFBLFVBQ0osSUFBSTtBQUFBLFVBQ0osVUFBVTtBQUFBLFVBQ1YsV0FBVztBQUFBLFVBQ1gsa0JBQWtCO0FBQUEsVUFDbEIscUJBQXFCO0FBQUEsVUFDckIsS0FBSztBQUFBLFVBQ0wsVUFBVTtBQUFBLFVBQ1YsMkJBQTJCO0FBQUEsVUFDM0IsTUFBTTtBQUFBLFVBQ04sYUFBYTtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsVUFBVTtBQUFBLFVBQ1YsYUFBYTtBQUFBLFVBQ2IsUUFBUTtBQUFBLFVBQ1IsV0FBVztBQUFBLFVBQ1gsYUFBYTtBQUFBLFVBQ2IsY0FBYztBQUFBLFVBQ2QsaUJBQWlCO0FBQUEsVUFDakIsWUFBWTtBQUFBLFVBQ1osZUFBZTtBQUFBLFVBQ2YsV0FBVztBQUFBLFVBQ1gsWUFBWTtBQUFBLFVBQ1osZUFBZTtBQUFBLFVBQ2YsVUFBVTtBQUFBLFVBQ1YsYUFBYTtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsb0JBQW9CO0FBQUEsVUFDcEIsYUFBYTtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsV0FBVztBQUFBLFVBQ1gsY0FBYztBQUFBLFVBQ2QsYUFBYTtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsWUFBWTtBQUFBLFVBQ1osZUFBZTtBQUFBLFVBQ2YsUUFBUTtBQUFBLFVBQ1IsTUFBTTtBQUFBLFVBQ04sSUFBSTtBQUFBLFVBQ0osSUFBSTtBQUFBLFVBQ0osSUFBSTtBQUFBLFVBQ0osSUFBSTtBQUFBLFVBQ0osV0FBVztBQUFBLFVBQ1gsY0FBYztBQUFBLFVBQ2QsNEJBQTRCO0FBQUEsVUFDNUIsZ0NBQWdDO0FBQUEsVUFDaEMsMEJBQTBCO0FBQUEsVUFDMUIsOEJBQThCO0FBQUEsVUFDOUIsVUFBVTtBQUFBLFVBQ1YsbUJBQW1CO0FBQUEsVUFDbkIsZUFBZTtBQUFBLFVBQ2YsU0FBUztBQUFBLFVBQ1QsV0FBVztBQUFBLFVBQ1gsZUFBZTtBQUFBLFVBQ2YsY0FBYztBQUFBLFVBQ2Qsa0JBQWtCO0FBQUEsVUFDbEIsYUFBYTtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsbUJBQW1CO0FBQUEsVUFDbkIsS0FBSztBQUFBLFVBQ0wsSUFBSTtBQUFBLFVBQ0osUUFBUTtBQUFBLFVBQ1IsV0FBVztBQUFBLFVBQ1gsSUFBSTtBQUFBLFVBQ0osSUFBSTtBQUFBLFVBQ0osSUFBSTtBQUFBLFVBQ0osSUFBSTtBQUFBLFVBQ0osR0FBRztBQUFBLFVBQ0gsY0FBYztBQUFBLFVBQ2Qsa0JBQWtCO0FBQUEsVUFDbEIsU0FBUztBQUFBLFVBQ1QsV0FBVztBQUFBLFVBQ1gsWUFBWTtBQUFBLFVBQ1osVUFBVTtBQUFBLFVBQ1YsY0FBYztBQUFBLFVBQ2QsZUFBZTtBQUFBLFVBQ2Ysa0JBQWtCO0FBQUEsVUFDbEIsZUFBZTtBQUFBLFVBQ2Ysa0JBQWtCO0FBQUEsVUFDbEIsbUJBQW1CO0FBQUEsVUFDbkIsT0FBTztBQUFBLFVBQ1AsV0FBVztBQUFBLFVBQ1gsY0FBYztBQUFBLFVBQ2QsY0FBYztBQUFBLFVBQ2QsV0FBVztBQUFBLFVBQ1gsY0FBYztBQUFBLFVBQ2QsYUFBYTtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsYUFBYTtBQUFBLFVBQ2IsYUFBYTtBQUFBLFVBQ2IsTUFBTTtBQUFBLFVBQ04sa0JBQWtCO0FBQUEsVUFDbEIsV0FBVztBQUFBLFVBQ1gsY0FBYztBQUFBLFVBQ2QsTUFBTTtBQUFBLFVBQ04sWUFBWTtBQUFBLFVBQ1osUUFBUTtBQUFBLFVBQ1IsU0FBUztBQUFBLFVBQ1QsVUFBVTtBQUFBLFVBQ1YsT0FBTztBQUFBLFVBQ1AsUUFBUTtBQUFBLFVBQ1IsYUFBYTtBQUFBLFVBQ2IsUUFBUTtBQUFBLFVBQ1IsVUFBVTtBQUFBLFVBQ1Ysa0JBQWtCO0FBQUEsVUFDbEIscUJBQXFCO0FBQUEsVUFDckIsbUJBQW1CO0FBQUEsVUFDbkIsc0JBQXNCO0FBQUEsVUFDdEIsWUFBWTtBQUFBLFVBQ1osZUFBZTtBQUFBLFVBQ2YsU0FBUztBQUFBLFVBQ1QsWUFBWTtBQUFBLFVBQ1osWUFBWTtBQUFBLFVBQ1oscUJBQXFCO0FBQUEsVUFDckIsa0JBQWtCO0FBQUEsVUFDbEIsY0FBYztBQUFBLFVBQ2QsZUFBZTtBQUFBLFVBQ2Ysa0JBQWtCO0FBQUEsVUFDbEIsUUFBUTtBQUFBLFVBQ1IsV0FBVztBQUFBLFVBQ1gsV0FBVztBQUFBLFVBQ1gsV0FBVztBQUFBLFVBQ1gsUUFBUTtBQUFBLFVBQ1IsZUFBZTtBQUFBLFVBQ2YscUJBQXFCO0FBQUEsVUFDckIsZ0JBQWdCO0FBQUEsVUFDaEIsVUFBVTtBQUFBLFVBQ1YsR0FBRztBQUFBLFVBQ0gsUUFBUTtBQUFBLFVBQ1IsTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFVBQ04saUJBQWlCO0FBQUEsVUFDakIsb0JBQW9CO0FBQUEsVUFDcEIsYUFBYTtBQUFBLFVBQ2IsV0FBVztBQUFBLFVBQ1gsb0JBQW9CO0FBQUEsVUFDcEIsa0JBQWtCO0FBQUEsVUFDbEIsVUFBVTtBQUFBLFVBQ1YsU0FBUztBQUFBLFVBQ1QsUUFBUTtBQUFBLFVBQ1IsU0FBUztBQUFBLFVBQ1QsUUFBUTtBQUFBLFVBQ1IsSUFBSTtBQUFBLFVBQ0osSUFBSTtBQUFBLFVBQ0osT0FBTztBQUFBLFVBQ1AsVUFBVTtBQUFBLFVBQ1YsTUFBTTtBQUFBLFVBQ04sZ0JBQWdCO0FBQUEsVUFDaEIsbUJBQW1CO0FBQUEsVUFDbkIsT0FBTztBQUFBLFVBQ1AsU0FBUztBQUFBLFVBQ1Qsa0JBQWtCO0FBQUEsVUFDbEIsa0JBQWtCO0FBQUEsVUFDbEIsT0FBTztBQUFBLFVBQ1AsY0FBYztBQUFBLFVBQ2QsYUFBYTtBQUFBLFVBQ2IsY0FBYztBQUFBLFVBQ2QsT0FBTztBQUFBLFVBQ1AsT0FBTztBQUFBLFVBQ1AsYUFBYTtBQUFBLFVBQ2IsV0FBVztBQUFBLFVBQ1gsY0FBYztBQUFBLFVBQ2QsYUFBYTtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsdUJBQXVCO0FBQUEsVUFDdkIsMEJBQTBCO0FBQUEsVUFDMUIsd0JBQXdCO0FBQUEsVUFDeEIsMkJBQTJCO0FBQUEsVUFDM0IsUUFBUTtBQUFBLFVBQ1IsUUFBUTtBQUFBLFVBQ1IsaUJBQWlCO0FBQUEsVUFDakIsb0JBQW9CO0FBQUEsVUFDcEIsa0JBQWtCO0FBQUEsVUFDbEIscUJBQXFCO0FBQUEsVUFDckIsZUFBZTtBQUFBLFVBQ2Ysa0JBQWtCO0FBQUEsVUFDbEIsZ0JBQWdCO0FBQUEsVUFDaEIsbUJBQW1CO0FBQUEsVUFDbkIsa0JBQWtCO0FBQUEsVUFDbEIscUJBQXFCO0FBQUEsVUFDckIsYUFBYTtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsZUFBZTtBQUFBLFVBQ2Ysa0JBQWtCO0FBQUEsVUFDbEIsZ0NBQWdDO0FBQUEsVUFDaEMsMEJBQTBCO0FBQUEsVUFDMUIsY0FBYztBQUFBLFVBQ2QsZ0JBQWdCO0FBQUEsVUFDaEIsYUFBYTtBQUFBLFVBQ2IsU0FBUztBQUFBLFVBQ1QsU0FBUztBQUFBLFVBQ1QsWUFBWTtBQUFBLFVBQ1osZUFBZTtBQUFBLFVBQ2YsZ0JBQWdCO0FBQUEsVUFDaEIsbUJBQW1CO0FBQUEsVUFDbkIsWUFBWTtBQUFBLFVBQ1osZUFBZTtBQUFBLFVBQ2Ysa0JBQWtCO0FBQUEsVUFDbEIsSUFBSTtBQUFBLFVBQ0osV0FBVztBQUFBLFVBQ1gsUUFBUTtBQUFBLFVBQ1IsSUFBSTtBQUFBLFVBQ0osSUFBSTtBQUFBLFVBQ0osbUJBQW1CO0FBQUEsVUFDbkIsc0JBQXNCO0FBQUEsVUFDdEIsb0JBQW9CO0FBQUEsVUFDcEIsdUJBQXVCO0FBQUEsVUFDdkIsU0FBUztBQUFBLFVBQ1QsYUFBYTtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsY0FBYztBQUFBLFVBQ2QsaUJBQWlCO0FBQUEsVUFDakIsWUFBWTtBQUFBLFVBQ1osZ0JBQWdCO0FBQUEsVUFDaEIsY0FBYztBQUFBLFVBQ2QsYUFBYTtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsUUFBUTtBQUFBLFVBQ1IsY0FBYztBQUFBLFVBQ2QsaUJBQWlCO0FBQUEsVUFDakIsU0FBUztBQUFBLFVBQ1QsVUFBVTtBQUFBLFVBQ1YsY0FBYztBQUFBLFVBQ2QsYUFBYTtBQUFBLFVBQ2IsaUJBQWlCO0FBQUEsVUFDakIsYUFBYTtBQUFBLFVBQ2IsaUJBQWlCO0FBQUEsVUFDakIsVUFBVTtBQUFBLFVBQ1YsYUFBYTtBQUFBLFVBQ2IsY0FBYztBQUFBLFVBQ2QsaUJBQWlCO0FBQUEsVUFDakIsU0FBUztBQUFBLFVBQ1QsWUFBWTtBQUFBLFVBQ1osWUFBWTtBQUFBLFVBQ1osZUFBZTtBQUFBLFVBQ2Ysa0JBQWtCO0FBQUEsVUFDbEIsT0FBTztBQUFBLFVBQ1AsUUFBUTtBQUFBLFVBQ1IsYUFBYTtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsYUFBYTtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsSUFBSTtBQUFBLFVBQ0osSUFBSTtBQUFBLFVBQ0osR0FBRztBQUFBLFVBQ0gsa0JBQWtCO0FBQUEsVUFDbEIsU0FBUztBQUFBLFVBQ1QsWUFBWTtBQUFBLFVBQ1osY0FBYztBQUFBLFVBQ2QsaUJBQWlCO0FBQUEsVUFDakIsY0FBYztBQUFBLFVBQ2QsaUJBQWlC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QUVKO0FBQUE7QUFFQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJLHNCQUFzQixVQUFVLFNBQVMsV0FBVyxNQUFNLFdBQVc7QUFFekUsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBRUEsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBTUEsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBSUEsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQ0EsWUFBSTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBR0EsWUFBSTtBQUFBO0FBQUE7QUFBQSxVQUVKLFNBQVMsV0FBYTtBQUFBO0FBQ3RCLFlBQUksZUFBZSxZQUFZLFNBQVMsZ0JBQWdCLGVBQWUsTUFBTSxZQUFZO0FBQ3pGLFlBQUksYUFBYSxTQUFTLFdBQVcsTUFBTTtBQUUzQyxZQUFJLGNBQWMsVUFBVTtBQUk1QixZQUFJLGFB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LFlBQUksYUFBYTtBQUNqQixZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFBQSxVQUVKO0FBQUE7QUFDQSxZQUFJO0FBQUE7QUFB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QUFBQTtBQUFBLEVBS04sSUFBSTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLSixPQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtQLE1BQU07QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS04sY0FBYztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWQsUUFBUTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLUixRQUFRO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtSLE1BQU07QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlOLEtBQUs7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlMLEtBQUs7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlMLE9BQU87QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlQLE1BQU07QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlOLE1BQU07QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlOLEtBQUs7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlMLE9BQU87QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlQLE9BQU87QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlQLE1BQU07QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlOLGVBQWU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS2YsR0FBRztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUgsR0FBRztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUgsR0FBRztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUgsR0FBRztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUgsR0FBRztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUgsR0FBRztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUgsR0FBRztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUgsR0FBRztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUgsR0FBRztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUgsR0FBRztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUgsR0FBRztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUgsR0FBRztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUgsR0FBRztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUgsR0FBRztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUgsR0FBRztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUgsR0FBRztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUgsR0FBRztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUgsR0FBRztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUgsR0FBRztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUgsR0FBRztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUgsR0FBRztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUgsR0FBRztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUgsR0FBRztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUgsR0FBRztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUgsR0FBRztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUgsR0FBRztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUgsTUFBTTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTixlQUFlO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJZixjQUFjO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJZCxVQUFVO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJVixTQUFTO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJVCxTQUFTO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJVCxXQUFXO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJWCxVQUFVO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJVixVQUFVO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJVixTQUFTO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJVCxXQUFXO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJWCxXQUFXO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJWCxVQUFVO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJVixjQUFjO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJZCxVQUFVO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJVixXQUFXO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJWCxZQUFZO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJWixjQUFjO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJZCxJQUFJO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJSixJQUFJO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJSixJQUFJO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJSixJQUFJO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJSixJQUFJO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJSixJQUFJO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJSixJQUFJO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJSixJQUFJO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJSixJQUFJO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJSixLQUFLO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJTCxLQUFLO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJTCxLQUFLO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJTCxTQUFTO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJVCxXQUFXO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtYLE1BQU07QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS04sUUFBUTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLUixPQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtQLFFBQVE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS1IsT0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLUCxZQUFZO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtaLGNBQWM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS2QscUJBQXFCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtyQixXQUFXO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtYLHNCQUFzQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLdEIsU0FBUztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVQsYUFBYTtBQUFB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QUFBLElBQ1YsUUFBUSxDQUFDLEdBQUcsQ0FBQztBQUFBLElBQ2I7QUFBQSxFQUNGO0FBQUEsRUFDQSxLQUFLO0FBQUEsSUFDSCxRQUFRLENBQUMsTUFBTSxJQUFJO0FBQUEsSUFDbkIsVUFBVTtBQUFBLElBQ1YsUUFBUSxDQUFDLEdBQUcsRUFBRTtBQUFBLElBQ2Q7QUFBQSxFQUNGO0FBQUEsRUFDQSxRQUFRO0FBQUEsSUFDTixRQUFRLENBQUMsTUFBTSxJQUFJO0FBQUEsSUFDbkIsVUFBVTtBQUFBLElBQ1YsUUFBUSxDQUFDLEdBQUcsQ0FBQztBQUFBLElBQ2I7QUFBQSxFQUNGO0FBQUEsRUFDQSxTQUFTO0FBQUEsSUFDUCxRQUFRLENBQUMsTUFBTSxJQUFJO0FBQUEsSUFDbkIsVUFBVTtBQUFBLElBQ1YsUUFBUSxDQUFDLEdBQUcsRUFBRTtBQUFBLElBQ2Q7QUFBQSxFQUNGO0FBQUEsRUFDQSxTQUFTO0FBQUEsSUFDUCxRQUFRLENBQUMsTUFBTSxJQUFJO0FBQUEsSUFDbkIsVUFBVTtBQUFBLElBQ1YsUUFBUSxDQUFDLElBQUksQ0FBQztBQUFBLElBQ2Q7QUFBQSxFQUNGO0FBQUEsRUFDQSxVQUFVO0FBQUEsSUFDUixRQUFRLENBQUMsTUFBTSxJQUFJO0FBQUEsSUFDbkIsVUFBVTtBQUFBLElBQ1YsUUFBUSxDQUFDLEdBQUcsRUFBRTtBQUFBLElBQ2Q7QUFBQSxFQUNGO0FBQUEsRUFDQSxVQUFVO0FBQUEsSUFDUixRQUFRLENBQUMsTUFBTSxJQUFJO0FBQUEsSUFDbkIsVUFBVTtBQUFBLElBQ1YsUUFBUSxDQUFDLEdBQUcsQ0FBQztBQUFBLElBQ2I7QUFBQSxFQUNGO0FBQUEsRUFDQSxhQUFhO0FBQUEsSUFDWCxRQUFRLENBQUMsTUFBTSxJQUFJO0FBQUEsSUFDbkIsVUFBVTtBQUFBLElBQ1YsUUFBUSxDQUFDLEdBQUcsQ0FBQztBQUFBLElBQ2I7QUFBQSxFQUNGO0FBQUEsRUFDQSxhQUFhO0FBQUEsSUFDWCxRQUFRLENBQUMsTUFBTSxJQUFJO0FBQUEsSUFDbkIsVUFBVTtBQUFBLElBQ1YsUUFB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Q0Q7QUFBQSxFQUNELENBQUM7QUFDRjtBQUVBLElBQUksYUFBdUIsQ0FBQztDQUN6QixpQkFBa0I7QUFFcEIsTUFBSSxPQUFPLGFBQWEsWUFBYTtBQUVyQyxNQUFJO0FBQ0gsVUFBTUssT0FBTyxPQUFlLFVBQVUsS0FBSztBQUMzQyxVQUFNQyxPQUFPLE9BQWUsVUFBVSxJQUFJO0FBQzFDLFVBQU1DLE9BQU8sT0FBZSxVQUFVLEtBQUs7QUFDM0MsUUFBSSxDQUFDRixRQUFPLENBQUNFLFFBQU8sQ0FBQ0QsS0FBSyxPQUFNLElBQUksTUFBTSx1REFBdUQ7QUFDakcsVUFBTSxnQkFBZ0I7QUFDdEIsVUFBTSxNQUFNRCxNQUFLRSxNQUFLRCxJQUFHO0FBR3pCLFdBQU8sbUJBQW1CLEVBQUUsS0FBSyxDQUFDRSxZQUFXO0FBRTVDLE1BQUFBLFFBQU8sUUFBUSxNQUFNO0FBQUEsSUFDdEIsQ0FBQztBQUFBLEVBRUYsU0FBUyxHQUFRO0FBQ2hCLGVBQVcsS0FBSyxFQUFFLFNBQVMsRUFBRSxXQUFXLENBQUM7QUFBQSxFQUMxQztBQUVBLFFBQU0sSUFBSSxRQUFRLENBQUMsWUFBWSxXQUFXLFNBQVMsR0FBSSxDQUFDO0FBQ3hELE1BQUksV0FBVyxRQUFRO0FBQ3RCLFlBQVEsTUFBTSxXQUFXLENBQUMsQ0FBQztBQUMzQixVQUFNLDJCQUEyQixXQUFXLEtBQUssSUFBSSxDQUFDO0FBQUEsRUFDdkQ7QUFDRCxHQUFHOyIsCiAgIm5hbWVzIjogWyJnbG9iYWwkMSIsICJnbG9iYWwiLCAiZGVmYXVsdFNldFRpbW91dCIsICJkZWZhdWx0Q2xlYXJUaW1lb3V0IiwgImNhY2hlZFNldFRpbWVvdXQiLCAiY2FjaGVkQ2xlYXJUaW1lb3V0IiwgInJ1blRpbWVvdXQiLCAiZSIsICJydW5DbGVhclRpbWVvdXQiLCAicXVldWUiLCAiZHJhaW5pbmciLCAiY3VycmVudFF1ZXVlIiwgInF1ZXVlSW5kZXgiLCAiY2xlYW5VcE5leHRUaWNrIiwgImRyYWluUXVldWUiLCAidGltZW91dCIsICJuZXh0VGljayIsICJJdGVtIiwgImFycmF5IiwgInRpdGxlIiwgInBsYXRmb3JtIiwgImJyb3dzZXIiLCAiZW52IiwgImFyZ3YiLCAidmVyc2lvbiIsICJ2ZXJzaW9ucyIsICJyZWxlYXNlIiwgImNvbmZpZyIsICJub29wIiwgIm9uIiwgImFkZExpc3RlbmVyIiwgIm9uY2UiLCAib2ZmIiwgInJlbW92ZUxpc3RlbmVyIiwgInJlbW92ZUFsbExpc3RlbmVycyIsICJlbWl0IiwgImJpbmRpbmciLCAibmFtZSIsICJjd2QiLCAiY2hkaXIiLCAidW1hc2siLCAicGVyZm9ybWFuY2UiLCAicGVyZm9ybWFuY2VOb3ciLCAiaHJ0aW1lIiwgInN0YXJ0VGltZSIsICJ1cHRpbWUiLCAicHJvY2VzcyIsICJyZXF1aXJlJCQwIiwgImluaGVyaXRzIiwgInJlcXVpcmUkJDEiLCAicHJvY2Vzcy5uZXh0VGljayIsICJwYXJzZVF1ZXJ5IiwgImhpZ2hsaWdodFRhZ3MiLCAic3RyaW5nIiwgImV4cG9ydHMiLCAiZGlmZiIsICJzZWxmIiwgImRvbmUiLCAidmFsdWUiLCAiam9pbiIsICJjaGFycyIsICJjaGFyYWN0ZXIiLCAiX2Jhc2UiLCAiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsICJfcGFyYW1zIiwgImxpbmUiLCAianNvbiIsICJfbGluZSIsICJfdHlwZW9mIiwgIm9iaiIsICJ2IiwgInBhcnNlIiwgImxpc3QiLCAiaW5kZXgiLCAiYXBwbHlQYXRjaCIsICJfcGFyc2UiLCAib3BlcmF0aW9uIiwgIm9mZnNldCIsICJodW5rIiwgInRvUG9zIiwgImoiLCAiY29udGVudCIsICJkZWxpbWl0ZXIiLCAiZXJyIiwgIl90b0NvbnN1bWFibGVBcnJheSIsICJfYXJyYXlXaXRob3V0SG9sZXMiLCAiX2l0ZXJhYmxlVG9BcnJheSIsICJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCAiX25vbkl0ZXJhYmxlU3ByZWFkIiwgIl9hcnJheUxpa2VUb0FycmF5IiwgIl9sb29wIiwgImkiLCAicHJldiIsICJtZXJnZV8xIiwgIm1lcmdlIiwgInJlcXVpcmUkJDIiLCAiYmFzZSIsICJ0ZXN0IiwgInN3YXAiLCAibWF0Y2giLCAib3duS2V5cyIsICJvYmplY3QiLCAia2V5cyIsICJfZGVmaW5lUHJvcGVydHkiLCAic3RydWN0dXJlZFBhdGNoIiwgInMiLCAiZ2V0IiwgIl9hcnJheSIsICJfY3JlYXRlIiwgInJlcXVpcmUkJDMiLCAicmVxdWlyZSQkNCIsICJyZXF1aXJlJCQ1IiwgInJlcXVpcmUkJDYiLCAicmVxdWlyZSQkNyIsICJyZXF1aXJlJCQ4IiwgInJlcXVpcmUkJDkiLCAicmVxdWlyZSQkMTAiLCAicmVxdWlyZSQkMTEiLCAicmVxdWlyZSQkMTIiLCAicmVxdWlyZSQkMTMiLCAicmVxdWlyZSQkMTQiLCAibSIsICJoIiwgImQiLCAidyIsICJ5IiwgIm1zIiwgInR5cGUiLCAiZm10TG9uZyIsICJmbXRTaG9ydCIsICJwbHVyYWwiLCAibG9va3VwIiwgInBhcnRzIiwgInRvU3RyaW5nIiwgIkJ1ZmZlciIsICJsZW5ndGgiLCAiZnJvbSIsICJhbGxvYyIsICJieXRlTGVuZ3RoIiwgImNvbXBhcmUiLCAiaW5zcGVjdCIsICJyZWFkIiwgImluY2x1ZGVzIiwgImluZGV4T2YiLCAid3JpdGUiLCAiYmFzZTY0LmZyb21CeXRlQXJyYXkiLCAic2xpY2UiLCAiaWVlZTc1NC5yZWFkIiwgIm1pbiIsICJpZWVlNzU0LndyaXRlIiwgImJhc2U2NC50b0J5dGVBcnJheSIsICJtb2R1bGUiLCAiaGFzT3duUHJvcGVydHkiLCAiY29udGFpbnMiLCAia2V5IiwgImVuY29kZSIsICJkZWNvZGUiLCAiaHRtbCIsICJuZXh0IiwgImhlIiwgInRoaXMiLCAiTU9DSEFfSURfUFJPUF9OQU1FIiwgInJlIiwgImNhbm9uaWNhbFR5cGUiLCAiQnVmZmVyLmlzQnVmZmVyIiwgImNoYXIiLCAiY2Fub25pY2FsaXplIiwgInJhbmdlIiwgImlzQnJvd3NlciIsICJwcm9jZXNzLmJyb3dzZXIiLCAiUGVuZGluZyIsICJkZWJ1ZyIsICJmb3JtYXQiLCAicmVnZXhwIiwgImNvbW1vbiIsICJ3YXJuZWQiLCAiY29uc3RhbnRzIiwgInBhdHRlcm4iLCAicmVwb3J0ZXIiLCAidWkiLCAiY3JlYXRlVW5zdXBwb3J0ZWRFcnJvciIsICJjcmVhdGVNaXNzaW5nQXJndW1lbnRFcnJvciIsICJjcmVhdGVJbnZhbGlkQXJndW1lbnRUeXBlRXJyb3IiLCAiY3JlYXRlSW52YWxpZEV4Y2VwdGlvbkVycm9yIiwgImNyZWF0ZUZhdGFsRXJyb3IiLCAiY3JlYXRlTXVsdGlwbGVEb25lRXJyb3IiLCAicnVubmFibGUiLCAiY3JlYXRlRm9yYmlkZGVuRXhjbHVzaXZpdHlFcnJvciIsICJtb2NoYSIsICJjcmVhdGVUaW1lb3V0RXJyb3IiLCAiaXNNb2NoYUVycm9yIiwgImVycm9ycyIsICJFdmVudEVtaXR0ZXIiLCAidXRpbHMiLCAiRGF0ZSIsICJzZXRUaW1lb3V0IiwgImNsZWFyVGltZW91dCIsICJSdW5uYWJsZSIsICJnbG9iYWxzIiwgImZuIiwgInNlcmlhbGl6ZSIsICJIb29rIiwgImlzU3RyaW5nIiwgIm1pbGxpc2Vjb25kcyIsICJTdWl0ZSIsICJzdWl0ZSIsICJDb250ZXh0IiwgImhvb2siLCAic3RyaW5naWZ5IiwgImlnbm9yZSIsICJlcnJTdWl0ZSIsICJwcmVwYXJlIiwgInJlc29sdmUiLCAib2siLCAiRVZFTlRfVEVTVF9QQVNTIiwgIkVWRU5UX1RFU1RfRkFJTCIsICJydW5uZXIiLCAicGFkIiwgInN0ciIsICJFVkVOVF9SVU5fQkVHSU4iLCAiRVZFTlRfVEVTVF9QRU5ESU5HIiwgIkVWRU5UX1JVTl9FTkQiLCAiRG90IiwgIkVWRU5UX1NVSVRFX0JFR0lOIiwgIkVWRU5UX1RFU1RfRU5EIiwgInBlbmRpbmciLCAiY2FjaGUiLCAidXJsIiwgIkxpc3QiLCAiU1RBVEVfRkFJTEVEIiwgInRhZyIsICJsZXZlbCIsICJidWYiLCAiUHJvZ3Jlc3MiLCAiVGVzdCIsICJjb250ZXh0IiwgImNyZWF0ZSIsICJFVkVOVF9GSUxFX1BSRV9SRVFVSVJFIiwgImJkZE1vZHVsZSIsICJiZGQiLCAidGRkTW9kdWxlIiwgInRkZCIsICJxdW5pdE1vZHVsZSIsICJxdW5pdCIsICJleHBvcnRzTW9kdWxlIiwgImNyZWF0ZVN0YXRzQ29sbGVjdG9yIiwgImNyZWF0ZUludmFsaWRSZXBvcnRlckVycm9yIiwgImNyZWF0ZUludmFsaWRJbnRlcmZhY2VFcnJvciIsICJjcmVhdGVNb2NoYUluc3RhbmNlQWxyZWFkeURpc3Bvc2VkRXJyb3IiLCAiY3JlYXRlTW9jaGFJbnN0YW5jZUFscmVhZHlSdW5uaW5nRXJyb3IiLCAiTW9jaGEiLCAicmVxdWlyZSQkMTUiLCAicmVxdWlyZSIsICJyZXF1aXJlJCQxNiIsICJkb2N1bWVudCIsICJtb2R1bGUiLCAiUkVBQ1RfRlJBR01FTlRfVFlQRSIsICJmb3JtYXQiLCAiUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSIsICJhc3NpZ24iLCAiQ29tcG9uZW50IiwgInZhbHVlIiwgInR5cGUiLCAiaGFzT3duUHJvcGVydHkiLCAic2VsZiIsICJjcmVhdGVFbGVtZW50IiwgImRlZmF1bHRQcm9wcyIsICJjbG9uZUVsZW1lbnQiLCAiaXNWYWxpZEVsZW1lbnQiLCAib2JqZWN0IiwgIlNFUEFSQVRPUiIsICJtYXRjaCIsICJpbmRleCIsICJhcnJheSIsICJ0b0FycmF5IiwgImNyZWF0ZUNvbnRleHQiLCAibW9kdWxlT2JqZWN0IiwgImVycm9yIiwgImZvcndhcmRSZWYiLCAicmVuZGVyIiwgIm1lbW8iLCAiY29tcGFyZSIsICJ1c2VDb250ZXh0IiwgIkNvbnRleHQiLCAidXNlU3RhdGUiLCAidXNlUmVkdWNlciIsICJ1c2VSZWYiLCAidXNlRWZmZWN0IiwgInVzZUluc2VydGlvbkVmZmVjdCIsICJ1c2VMYXlvdXRFZmZlY3QiLCAidXNlQ2FsbGJhY2siLCAidXNlTWVtbyIsICJ1c2VJbXBlcmF0aXZlSGFuZGxlIiwgInVzZUlkIiwgImxvY2F0aW9uIiwgIm5vZGUiLCAia2V5cyIsICJyZXR1cm5WYWx1ZSIsICJDaGlsZHJlbiIsICJtb2R1bGUiLCAibm9kZSIsICJpbmRleCIsICJwZWVrIiwgImNvbXBhcmUiLCAibGVuZ3RoIiwgImluaXRpYWxUaW1lIiwgInN0YXJ0VGltZSIsICJtb2R1bGUiLCAiUmVhY3QiLCAiZm9ybWF0IiwgIlJlYWN0RGVidWdDdXJyZW50RnJhbWUiLCAiRnJhZ21lbnQiLCAiRm9yd2FyZFJlZiIsICJoYXNPd25Qcm9wZXJ0eSIsICJ2YWx1ZSIsICJ0eXBlIiwgInByZWZpeCIsICJzYW5pdGl6ZVVSTCIsICJ0b2tlbiIsICJ1cmwiLCAibm9kZSIsICJSRUFDVF9GUkFHTUVOVF9UWVBFIiwgImFzc2lnbiIsICJtYXRjaCIsICJDb21wb25lbnQiLCAid29ya0luUHJvZ3Jlc3MiLCAidG9TdHJpbmciLCAiZ2V0IiwgInNldCIsICJpc0h5ZHJhdGluZyIsICJvcHRpb25zIiwgImlzRW1wdHkiLCAic3RyaW5nIiwgImNoYXJhY3RlciIsICJkZWxpbWl0ZXIiLCAic3R5bGUiLCAicmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcyIsICJwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzIiwgImVycm9yIiwgImNhbGxDYWxsYmFjayIsICJjdXJyZW50IiwgIm5vdyIsICJyb290IiwgImluZGV4IiwgInJlbmRlckxhbmVzIiwgInF1ZXVlZEV2ZW50IiwgIm5vcm1hbGl6ZSIsICJjaGFycyIsICJmcm9tIiwgIm9mZnNldCIsICJsZW5ndGgiLCAibmV4dCIsICJyYW5nZSIsICJtYWtlUHJlZml4TWFwIiwgInByZWZpeGVzIiwgInZlbmRvclByZWZpeGVzIiwgInByZWZpeGVkRXZlbnROYW1lcyIsICJnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSIsICJub29wIiwgImNyZWF0ZUVsZW1lbnQiLCAiYXR0cmlidXRlcyIsICJsb2NhdGlvbiIsICJoYXMiLCAibnVtYmVyIiwgImFycmF5IiwgInVwZGF0ZUZyYWdtZW50IiwgImNoaWxkIiwgInJlY29uY2lsZUNoaWxkRmliZXJzIiwgInZlcnNpb24iLCAiZGVmYXVsdFByb3BzIiwgImVycm9yJDEiLCAicmVuZGVyIiwgImNvbXBhcmUiLCAic3VidHJlZVJlbmRlckxhbmVzIiwgImhhc0NvbnRleHRDaGFuZ2VkIiwgImNvbW1pdFRpbWUiLCAiZmx1c2hTeW5jIiwgInNob3VsZEZpcmVBZnRlckFjdGl2ZUluc3RhbmNlQmx1ciIsICJ0eXBlcyIsICJoeWRyYXRlIiwgImNyZWF0ZVBvcnRhbCIsICJrZXlzIiwgImN1cnJlbnRIb29rIiwgIlJlYWN0Q3VycmVudERpc3BhdGNoZXIiLCAiY3JlYXRlUm9vdCIsICJmaW5kRE9NTm9kZSIsICJ1bm1vdW50Q29tcG9uZW50QXROb2RlIiwgInByb3RvY29sIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiY2xhc3NOYW1lcyIsICJ2YWx1ZSIsICJSRUFDVF9GUkFHTUVOVF9UWVBFIiwgInR5cGUiLCAib2JqZWN0IiwgIkVsZW1lbnQiLCAiRm9yd2FyZFJlZiIsICJGcmFnbWVudCIsICJQb3J0YWwiLCAiaXNGcmFnbWVudCIsICJpc01lbW8iLCAibW9kdWxlIiwgIlJlYWN0IiwgIlJFQUNUX0ZSQUdNRU5UX1RZUEUiLCAiZm9ybWF0IiwgIlJlYWN0RGVidWdDdXJyZW50RnJhbWUiLCAidHlwZSIsICJhc3NpZ24iLCAibWF0Y2giLCAiQ29tcG9uZW50IiwgImhhc093blByb3BlcnR5IiwgImxvY2F0aW9uIiwgInZhbHVlIiwgInNlbGYiLCAiZGVmYXVsdFByb3BzIiwgImlzVmFsaWRFbGVtZW50IiwgIm9iamVjdCIsICJub2RlIiwgImtleXMiLCAianN4IiwgImpzeHMiLCAibW9kdWxlIiwgImQiLCAiYiIsICJrZXlzIiwgInZhbHVlIiwgIlBhdGNoRXJyb3IiLCAiaW5kZXgiLCAiZG9jdW1lbnQiLCAiaW5kZXgiLCAia2V5cyIsICJsZW5ndGgiLCAiTWlycm9yIiwgIk9ic2VydmVySW5mbyIsICJ2ZXJzaW9uIiwgInZlcnNpb24iLCAidmVyc2lvbiIsICJ1aWQiLCAidmVyc2lvbiIsICJhcHAiLCAidmVyc2lvbiIsICJtYXRjaCIsICJudW1iZXIiLCAiZG9jdW1lbnQiLCAibGF5ZXIiLCAidmFsdWUiLCAiYXBwIiwgIm5vZGUiLCAicmVzdWx0IiwgInJlc29sdmUiLCAidHlwZSIsICJ1cmwiLCAidXJsIiwgInBheWxvYWQiLCAidHlwZSIsICJ3aXRoTmF0aXZlQXJyYXlCdWZmZXIiLCAidHlwZSIsICJsZW5ndGgiLCAiaXNCaW5hcnkiLCAib24iLCAibGVuZ3RoIiwgImRlY29kZSIsICJfYSIsICJ2YWx1ZSIsICJkZWNvZGUiLCAidHlwZSIsICJjbGVhbnVwIiwgInByb3RvY29sIiwgInByb3RvY29sIiwgIndpdGhOYXRpdmVBcnJheUJ1ZmZlciIsICJpc1ZpZXciLCAid2l0aE5hdGl2ZUJsb2IiLCAicHJvdG9jb2wiLCAiUGFja2V0VHlwZSIsICJ2YWx1ZSIsICJuZXh0IiwgInR5cGUiLCAiUkVTRVJWRURfRVZFTlRTIiwgIlNvY2tldCIsICJzZWxmIiwgInNlbGYiLCAiU29ja2V0IiwgInNvY2tldCIsICJsb29rdXAiLCAiU29ja2V0IiwgIlNvY2tldCIsICJ1cmwiLCAibG9va3VwIiwgIm1peGluIiwgInVybCIsICJhcHAiLCAibm9kZSIsICJub2RlIiwgInZhbHVlIiwgImFwcCIsICJncmFwaCIsICJjb252ZXJ0ZWQiLCAicGF0dGVybiIsICJ1cmwiLCAiYXBwIiwgInZhbHVlIiwgIm5vZGUiLCAibm9kZSIsICJzZWxmIiwgInZhbHVlIiwgImRvY3VtZW50IiwgInR5cGUiLCAiaW5kZXgiLCAibm9kZSIsICJub2RlIiwgIm5vZGUiLCAiaW5kZXgiLCAibm9kZSIsICJpbmRleCIsICJub2RlIiwgIm5vZGUiLCAiaW5kZXgiLCAibm9kZSIsICJpbmRleCIsICJpbXBvcnRfcmVhY3QiLCAiaW1wb3J0X3JlYWN0IiwgImltcG9ydF9yZWFjdCIsICJSZWFjdCIsICJvIiwgIm9iamVjdCIsICJ0b0FycmF5IiwgIlJlYWN0IiwgInByZU1lc3NhZ2UiLCAibWV0aG9kIiwgInIiLCAiaW1wb3J0X3JlYWN0IiwgIm5vZGUiLCAiUmVhY3QiLCAiUmVhY3RET00iLCAiaW1wb3J0X3JlYWN0IiwgIlJlYWN0IiwgImdldFZhbHVlIiwgImZpbGxSZWYiLCAibm9kZSIsICJjb21wb3NlUmVmIiwgInVzZUNvbXBvc2VSZWYiLCAicHJldiIsICJuZXh0IiwgInN1cHBvcnRSZWYiLCAidHlwZSIsICJnZXROb2RlUmVmIiwgIm5vZGUiLCAiUmVhY3QiLCAiUmVhY3QiLCAib25SZXNpemUiLCAiZ2V0SW5kZXgiLCAiaW5kZXgiLCAidmFsdWUiLCAiUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyIiwgIm9ic2VydmVycyIsICJwb3NpdGlvbiIsICJSZXNpemVPYnNlcnZhdGlvbiIsICJSZXNpemVPYnNlcnZlckVudHJ5IiwgIlJlc2l6ZU9ic2VydmVyU1BJIiwgIlJlc2l6ZU9ic2VydmVyIiwgIm1ldGhvZCIsICJvYnNlcnZlIiwgInVub2JzZXJ2ZSIsICJ0IiwgImUiLCAidCIsICJ0IiwgIl9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QiLCAiUmVhY3QiLCAiRG9tV3JhcHBlciIsICJyZW5kZXIiLCAiZ2V0RG9tIiwgIm9uUmVzaXplIiwgIm9ic2VydmUiLCAidW5vYnNlcnZlIiwgIlJlc2l6ZU9ic2VydmVyIiwgInRvQXJyYXkiLCAiaW5kZXgiLCAicmFmIiwgImNhZiIsICJ3cmFwcGVyUmFmIiwgIlJlYWN0IiwgInIiLCAibm9kZSIsICJub2RlIiwgImltcG9ydF9yZWFjdCIsICJrZXlzIiwgIlJlYWN0IiwgImtleXMiLCAiRW50aXR5IiwgImdldCIsICJzdHlsZSIsICJUaGVtZUNhY2hlIiwgImNhY2hlIiwgImRlcml2YXRpdmUiLCAiZ2V0IiwgInNldCIsICJ2YWx1ZSIsICJpbmRleCIsICJUaGVtZSIsICJ0b2tlbiIsICJkZXJpdmF0aXZlIiwgInRva2VuIiwgInZhbHVlIiwgInN0eWxlIiwgIl9vYmplY3RTcHJlYWQyIiwgInRva2VuMkNTU1ZhciIsICJ0b2tlbiIsICJzZXJpYWxpemVDU1NWYXIiLCAidmFsdWUiLCAidHJhbnNmb3JtVG9rZW4iLCAiUmVhY3QiLCAiUmVhY3QiLCAidXNlTGF5b3V0RWZmZWN0IiwgInVzZUxheW91dFVwZGF0ZUVmZmVjdCIsICJSZWFjdCIsICJ1c2VJbnNlcnRpb25FZmZlY3RQb2x5ZmlsbCIsICJSZWFjdCIsICJmdWxsQ2xvbmUiLCAidXNlSW5zZXJ0aW9uRWZmZWN0IiwgInVzZUNsZWFudXBSZWdpc3RlciIsICJyZWdpc3RlciIsICJ1c2VSdW4iLCAicmVnaXN0ZXIiLCAiYnVpbGRDYWNoZSIsICJjYWNoZSIsICJzdHlsZSIsICJnZXRDb21wdXRlZFRva2VuIiwgImZvcm1hdCIsICJmb3JtYXRUb2tlbiIsICJjYWNoZSIsICJ0b2tlbiIsICJleHRyYWN0IiwgImltcG9ydF9yZWFjdCIsICJSZWFjdCIsICJ2YWx1ZSIsICJ2YWx1ZSIsICJwYXR0ZXJuIiwgInBvc2l0aW9uIiwgImluZGV4IiwgImFycmF5IiwgInZhbHVlIiwgInR5cGUiLCAibGVuZ3RoIiwgInR5cGUiLCAidmFsdWUiLCAidHlwZSIsICJpbmRleCIsICJ0eXBlIiwgInZhbHVlIiwgInBhcnNlIiwgImluZGV4IiwgIm9mZnNldCIsICJsZW5ndGgiLCAiY2hhcmFjdGVyIiwgInR5cGUiLCAiY2hhcmFjdGVycyIsICJpbmRleCIsICJsaW50ZXIiLCAidmFsdWUiLCAibGludGVyIiwgInZhbHVlIiwgInZhbHVlIiwgImtleXMiLCAicGFyc2VTdHlsZSIsICJzdHlsZSIsICJwcmV2IiwgImFwcGVuZFN0eWxlIiwgImxpbnRlciIsICJtYXRjaCIsICJ0b2tlbiIsICJjYWNoZSIsICJub2RlIiwgImV4dHJhY3QiLCAidXNlQ1NTVmFyUmVnaXN0ZXIiLCAidW5pdGxlc3MiLCAiaWdub3JlIiwgInRva2VuIiwgImNhY2hlIiwgInN0eWxlIiwgImV4dHJhY3QiLCAiZXh0cmFjdCIsICJLZXlmcmFtZSIsICJzdHlsZSIsICJpbXBvcnRfcmVhY3QiLCAidmFsdWUiLCAiaXNPYmplY3QiLCAiUmVhY3QiLCAid2FybmluZyIsICJ0eXBlIiwgIndhcm5pbmdfZGVmYXVsdCIsICJpbXBvcnRfcmVhY3QiLCAiUmVhY3QiLCAibG9jYWxlIiwgImxvY2FsZSIsICJlbl9VU19kZWZhdWx0IiwgImxvY2FsZSIsICJlbl9VU19kZWZhdWx0IiwgImxvY2FsZSIsICJlbl9VU19kZWZhdWx0IiwgImVuX1VTX2RlZmF1bHQiLCAiZW5fVVNfZGVmYXVsdCIsICJlbl9VU19kZWZhdWx0IiwgImxvY2FsZSIsICJpbXBvcnRfcmVhY3QiLCAiUmVhY3QiLCAibG9jYWxlIiwgImVuX1VTX2RlZmF1bHQiLCAibG9jYWxlIiwgIndhcm5pbmciLCAiaW1wb3J0X3JlYWN0IiwgIm1hdGNoIiwgImluZGV4IiwgInZhbHVlIiwgIm1hdGNoUHJlZml4IiwgImhleCIsICJpbmRleDIiLCAidmFsdWUiLCAiZ2VuZXJhdGUiLCAiaW5kZXgiLCAiYyIsICJnZW5lcmF0ZUNvbG9yUGFsZXR0ZXMiLCAiZ2VuZXJhdGVOZXV0cmFsQ29sb3JQYWxldHRlcyIsICJ0b2tlbiIsICJ0b2tlbiIsICJpbmRleCIsICJ0b2tlbiIsICJnZW5lcmF0ZSIsICJ0b2tlbiIsICJnZW5lcmF0ZSIsICJwcmV2IiwgIlJlYWN0IiwgIlJlYWN0IiwgImdsb2JhbFByZWZpeENscyIsICJ0eXBlIiwgImdlbmVyYXRlIiwgImluZGV4IiwgInN0eWxlIiwgIndhcm5pbmdfZGVmYXVsdCIsICJSZWFjdCIsICJpbXBvcnRfcmVhY3QiLCAiUmVhY3QiLCAiaW1wb3J0X3JlYWN0IiwgIkFic3RyYWN0Q2FsY3VsYXRvciIsICJjYWxjdWxhdG9yX2RlZmF1bHQiLCAiQ0FMQ19VTklUIiwgInJlZ2V4cCIsICJ1bml0IiwgInZhbHVlIiwgIkNTU0NhbGN1bGF0b3IiLCAiY2FsY3VsYXRvcl9kZWZhdWx0IiwgIk51bUNhbGN1bGF0b3IiLCAiY2FsY3VsYXRvcl9kZWZhdWx0IiwgImdlbkNhbGMiLCAidHlwZSIsICJDU1NDYWxjdWxhdG9yIiwgImNhbGNfZGVmYXVsdCIsICJnZXRDb21wVmFyUHJlZml4IiwgIlJlYWN0IiwgIlJlYWN0IiwgInZhbHVlIiwgInZhbHVlIiwgInByZXYiLCAidG9rZW4iLCAibWVyZ2UiLCAia2V5cyIsICJnZXQiLCAibm9vcCIsICJzdGF0aXN0aWNUb2tlbiIsICJ0b2tlbiIsICJ0b2tlbktleXMiLCAiZ2V0IiwgImZsdXNoIiwgInRva2VuIiwgIm1lcmdlIiwgInR5cGUiLCAidmFsdWUiLCAiaW1wb3J0X3JlYWN0IiwgIkFycmF5S2V5TWFwIiwgInNldCIsICJrZXlzIiwgInZhbHVlIiwgImdldCIsICJjYWNoZSIsICJub3ciLCAiUmVhY3QiLCAidXNlRGVmYXVsdENTUCIsICJ1c2VUb2tlbiIsICJnZW5TdHlsZUhvb2tzIiwgImdlbkNvbXBvbmVudFN0eWxlSG9vayIsICJpZ25vcmUiLCAiQ1NTVmFyUmVnaXN0ZXIiLCAidXNlQ1NTVmFyIiwgIm5vZGUiLCAiUmVhY3QiLCAidG9rZW4iLCAidHlwZSIsICJjYWxjX2RlZmF1bHQiLCAibWVyZ2UiLCAiZ2VuU3ViU3R5bGVDb21wb25lbnQiLCAiU3R5bGVkQ29tcG9uZW50IiwgImltcG9ydF9yZWFjdCIsICJ2ZXJzaW9uX2RlZmF1bHQiLCAidmVyc2lvbl9kZWZhdWx0IiwgImdldEFscGhhQ29sb3IiLCAidG9rZW4iLCAiX19yZXN0IiwgImdldENvbXB1dGVkVG9rZW4iLCAidmFsdWUiLCAiUmVhY3QiLCAidmVyc2lvbl9kZWZhdWx0IiwgInRva2VuIiwgImltcG9ydF9yZWFjdCIsICJ0b2tlbiIsICJvZmZzZXQiLCAidG9rZW4iLCAidG9rZW4iLCAicHJldiIsICJ0b2tlbiIsICJSZWFjdCIsICJmdWxsQ2xvbmUiLCAid2FybmluZyIsICJfYSIsICJfYiIsICJwcmV2IiwgIm5leHQiLCAiaW5kZXgiLCAiUmVhY3QiLCAiUmVhY3QiLCAiaW1wb3J0X3JlYWN0IiwgIlJlYWN0IiwgIlJlYWN0IiwgIkRvbVdyYXBwZXIiLCAicmVuZGVyIiwgIlJlYWN0IiwgImdldFZhbHVlIiwgIlJlYWN0IiwgImltcG9ydF9yZWFjdCIsICJSZWFjdCIsICJpbXBvcnRfcmVhY3QiLCAidHlwZSIsICJtYXRjaCIsICJpbXBvcnRfcmVhY3QiLCAiUmVhY3QiLCAiUmVhY3QiLCAiaW5kZXgiLCAic3R5bGUiLCAiZ2V0RXZlbnRIYW5kbGVycyIsICJub2RlIiwgImNsYXNzTmFtZXMiLCAiUmVhY3QiLCAia2V5cyIsICJub2RlIiwgIl9leGNsdWRlZCIsICJfZXhjbHVkZWQyIiwgIkNTU01vdGlvbkxpc3QiLCAicmVuZGVyIiwgIkNvbXBvbmVudCIsICJpbmRleCIsICJrZXlzIiwgImVzX2RlZmF1bHQiLCAidG9rZW4iLCAiUmVhY3QiLCAid2FybmluZyIsICJfX3Jlc3QiLCAid2FybmluZ19kZWZhdWx0IiwgImFsZXJ0IiwgImxvY2FsZSIsICJzdGF0aXN0aWMiLCAiZW1wdHkiLCAidXBsb2FkIiwgImVuX1VTX2RlZmF1bHQiLCAidG9rZW4iLCAiX19yZXN0IiwgIndhcm5pbmdfZGVmYXVsdCIsICJSZWFjdCIsICJSZWFjdCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJSZWFjdCIsICJpbXBvcnRfcmVhY3QiLCAibWF0Y2giLCAid2FybmluZyIsICJnZW5lcmF0ZSIsICJub2RlIiwgIlJlYWN0IiwgImluZGV4IiwgInVzZUluc2VydFN0eWxlcyIsICJfZXhjbHVkZWQiLCAiSWNvbkJhc2UiLCAic3R5bGUiLCAid2FybmluZyIsICJnZW5lcmF0ZSIsICJfZXhjbHVkZWQiLCAiY2xhc3NOYW1lcyIsICJDaGVja0NpcmNsZUZpbGxlZCIsICJDaGVja0NpcmNsZUZpbGxlZF9kZWZhdWx0IiwgIlJlYWN0IiwgIkNsb3NlQ2lyY2xlRmlsbGVkIiwgIlJlZkljb24iLCAiQ2xvc2VDaXJjbGVGaWxsZWRfZGVmYXVsdCIsICJSZWFjdCIsICJDbG9zZU91dGxpbmVkIiwgIlJlZkljb24iLCAiQ2xvc2VPdXRsaW5lZF9kZWZhdWx0IiwgImltcG9ydF9yZWFjdCIsICJpc0ZyYWdtZW50IiwgIlJlYWN0IiwgImNsb25lRWxlbWVudCIsICJSZWFjdCIsICJMb2FkaW5nT3V0bGluZWQiLCAiUmVmSWNvbiIsICJMb2FkaW5nT3V0bGluZWRfZGVmYXVsdCIsICJpbXBvcnRfcmVhY3QiLCAiaW1wb3J0X3JlYWN0IiwgIlJlYWN0IiwgInR5cGUiLCAidG9rZW4iLCAiUmVhY3QiLCAid2FybmluZyIsICJSZWFjdCIsICJSZWFjdERPTSIsICJfcmVnZW5lcmF0b3JSdW50aW1lIiwgInQiLCAiZSIsICJyIiwgImRlZmluZSIsICJuIiwgImkiLCAiYSIsICJjIiwgIkNvbnRleHQiLCAibyIsICJ1IiwgImgiLCAidmFsdWUiLCAicCIsICJuZXh0IiwgIm4iLCAiUmVhY3RET00iLCAiZnVsbENsb25lIiwgInZlcnNpb24iLCAibm9kZSIsICJub2RlIiwgIm5vZGUiLCAiUmVhY3RET00iLCAid2FybmluZ19kZWZhdWx0IiwgIm5vZGUiLCAiZ2V0VHJhbnNpdGlvbk5hbWUiLCAiaW1wb3J0X3JlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgImltcG9ydF9yZWFjdCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJ0b2tlbiIsICJSZWFjdCIsICJSZWFjdCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJub2RlIiwgInZhbHVlIiwgInJlc2l6ZU9ic2VydmVyIiwgImVzX2RlZmF1bHQiLCAiY2xhc3NOYW1lcyIsICJyZWFjdFJlbmRlciIsICJ0b2tlbiIsICJub2RlIiwgImNsYXNzTmFtZXMiLCAiUmVhY3QiLCAibm9kZSIsICJjbG9uZUVsZW1lbnQiLCAiaW1wb3J0X3JlYWN0IiwgIlJlYWN0IiwgIlJlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgImNsYXNzTmFtZXMiLCAiUmVhY3QiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiX19yZXN0IiwgIndhcm5pbmciLCAiY2xhc3NOYW1lcyIsICJpbXBvcnRfcmVhY3QiLCAidHlwZSIsICJjbG9uZUVsZW1lbnQiLCAiUmVhY3QiLCAiaXNGcmFnbWVudCIsICJpbXBvcnRfcmVhY3QiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiaW1wb3J0X3JlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgInN0eWxlIiwgImNsYXNzTmFtZXMiLCAiUmVhY3QiLCAic3R5bGUiLCAiY2xhc3NOYW1lcyIsICJSZWFjdCIsICJMb2FkaW5nT3V0bGluZWRfZGVmYXVsdCIsICJub2RlIiwgImVzX2RlZmF1bHQiLCAidG9rZW4iLCAiaW1wb3J0X3JlYWN0IiwgIl9leGNsdWRlZCIsICJfZXhjbHVkZWQyIiwgImdldFJvdW5kTnVtYmVyIiwgInZhbHVlIiwgImNvbnZlcnRIc2IySHN2IiwgIkNvbG9yIiwgImdlbmVyYXRlQ29sb3IiLCAiY2FsY3VsYXRlQ29sb3IiLCAib2Zmc2V0IiwgInR5cGUiLCAiY2FsY09mZnNldCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJpbXBvcnRfcmVhY3QiLCAiQ29sb3JCbG9jayIsICJzdHlsZSIsICJSZWFjdCIsICJjbGFzc05hbWVzIiwgImltcG9ydF9yZWFjdCIsICJpbXBvcnRfcmVhY3QiLCAidXBkYXRlT2Zmc2V0IiwgImNhbGNPZmZzZXQiLCAib25EcmFnTW92ZSIsICJvbkRyYWdTdG9wIiwgIm9uRHJhZ1N0YXJ0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgImltcG9ydF9yZWFjdCIsICJIYW5kbGVyIiwgIlJlYWN0IiwgImNsYXNzTmFtZXMiLCAiaW1wb3J0X3JlYWN0IiwgIlBhbGV0dGUiLCAic3R5bGUiLCAiUmVhY3QiLCAiaW1wb3J0X3JlYWN0IiwgIlJlYWN0IiwgIlBpY2tlciIsICJvZmZzZXQiLCAiUmVhY3QiLCAiaW1wb3J0X3JlYWN0IiwgInVzZUNvbG9yU3RhdGUiLCAidmFsdWUiLCAiUmVhY3QiLCAiaW1wb3J0X3JlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgImltcG9ydF9yZWFjdCIsICJHcmFkaWVudCIsICJ0eXBlIiwgIlJlYWN0IiwgIlNsaWRlciIsICJ0eXBlIiwgImdldFZhbHVlIiwgIm9mZnNldCIsICJSZWFjdCIsICJjbGFzc05hbWVzIiwgInZhbHVlIiwgInN0eWxlIiwgIlNsaWRlciIsICJoYW5kbGVDaGFuZ2UiLCAidHlwZSIsICJnZXRIdWVDb2xvciIsICJnZXRBbHBoYUNvbG9yIiwgIm9uSHVlQ2hhbmdlIiwgIm9uQWxwaGFDaGFuZ2UiLCAib25IdWVDaGFuZ2VDb21wbGV0ZSIsICJvbkFscGhhQ2hhbmdlQ29tcGxldGUiLCAiY2xhc3NOYW1lcyIsICJSZWFjdCIsICJ2YWx1ZSIsICJBZ2dyZWdhdGlvbkNvbG9yIiwgImltcG9ydF9yZWFjdCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJSZWFjdCIsICJSaWdodE91dGxpbmVkIiwgIlJlZkljb24iLCAiUmlnaHRPdXRsaW5lZF9kZWZhdWx0IiwgInRva2VuIiwgInRva2VuIiwgInRva2VuIiwgInRva2VuIiwgInRva2VuIiwgInZhbHVlIiwgInRva2VuIiwgIm1lcmdlIiwgInByZXYiLCAidG9rZW4iLCAicHJldiIsICJnZW5MaW5rU3R5bGUiLCAibWVyZ2UiLCAic3R5bGVfZGVmYXVsdCIsICJ0b2tlbiIsICJ0b2tlbiIsICJ0b2tlbiIsICJfX3Jlc3QiLCAiUmVhY3QiLCAidHlwZSIsICJzdHlsZV9kZWZhdWx0IiwgIl9hIiwgIndhcm5pbmciLCAiX2IiLCAiY2xhc3NOYW1lcyIsICJidXR0b25fZGVmYXVsdCIsICJSZWFjdCIsICJpbXBvcnRfcmVhY3RfZG9tIiwgIlJlYWN0IiwgIkNvbnRleHRfZGVmYXVsdCIsICJSZWFjdCIsICJyZW5kZXIiLCAiQ29udGV4dF9kZWZhdWx0IiwgImFwcGVuZCIsICJjbGVhbnVwIiwgIlJlYWN0IiwgInV1aWQiLCAiZ2V0UG9ydGFsQ29udGFpbmVyIiwgImdldENvbnRhaW5lciIsICJDb250ZXh0X2RlZmF1bHQiLCAiZXNfZGVmYXVsdCIsICJSZWFjdCIsICJSZWFjdCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJSZWFjdCIsICJmdWxsQ2xvbmUiLCAidXVpZCIsICJ1c2VJZCIsICJ1dWlkIiwgIlJlYWN0IiwgImltcG9ydF9yZWFjdCIsICJtZXRob2QiLCAiUmVhY3QiLCAiaW1wb3J0X3JlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgImltcG9ydF9jbGFzc25hbWVzIiwgImltcG9ydF9yZWFjdCIsICJSZWFjdCIsICJSZWFjdCIsICJzdHlsZSIsICJuZXh0IiwgImNsYXNzTmFtZXMiLCAic3R5bGUiLCAiZXNfZGVmYXVsdCIsICJjbGFzc05hbWVzIiwgIlJlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgIk1hc2siLCAic3R5bGUiLCAiZXNfZGVmYXVsdCIsICJjbGFzc05hbWVzIiwgIkRpYWxvZyIsICJvbkNvbnRlbnRNb3VzZURvd24iLCAib25Db250ZW50TW91c2VVcCIsICJvbldyYXBwZXJDbGljayIsICJjbGFzc05hbWVzIiwgIkRpYWxvZ1dyYXAiLCAiZ2V0Q29udGFpbmVyIiwgImVzX2RlZmF1bHQiLCAiZXNfZGVmYXVsdCIsICJpbXBvcnRfcmVhY3QiLCAiUmVhY3QiLCAiUmVhY3QiLCAiUmVhY3QiLCAiUmVhY3QiLCAid2FybmluZ0Z1bmMiLCAiQ29udGV4dCIsICJSZWFjdCIsICJ0b0FycmF5IiwgInZhbHVlIiwgIl93cmFwTmF0aXZlU3VwZXIiLCAidCIsICJ3YXJuaW5nIiwgInR5cGUiLCAidmFsdWUiLCAiaW5kZXgiLCAibmV4dCIsICJBc3luY1ZhbGlkYXRpb25FcnJvciIsICJnZXRWYWx1ZSIsICJ2YWx1ZSIsICJlbnVtZXJhYmxlIiwgInZhbHVlIiwgInBhdHRlcm4iLCAidmFsdWUiLCAicmFuZ2UiLCAidmFsdWUiLCAicmVxdWlyZWQiLCAidmFsdWUiLCAidHlwZSIsICJiIiwgImlwIiwgInByb3RvY29sIiwgInBhdHRlcm4iLCAidmFsdWUiLCAicmVnZXhwIiwgInVybCIsICJ0eXBlIiwgIndoaXRlc3BhY2UiLCAidmFsdWUiLCAiYW55IiwgInZhbHVlIiwgInZhbGlkYXRlIiwgImFycmF5IiwgInZhbHVlIiwgInZhbGlkYXRlIiwgImJvb2xlYW4iLCAidmFsdWUiLCAidmFsaWRhdGUiLCAiZGF0ZSIsICJ2YWx1ZSIsICJ2YWxpZGF0ZSIsICJFTlVNIiwgImVudW1lcmFibGUiLCAidmFsdWUiLCAidmFsaWRhdGUiLCAiZW51bV9kZWZhdWx0IiwgImZsb2F0Rm4iLCAidmFsdWUiLCAidmFsaWRhdGUiLCAiaW50ZWdlciIsICJ2YWx1ZSIsICJ2YWxpZGF0ZSIsICJtZXRob2QiLCAidmFsdWUiLCAidmFsaWRhdGUiLCAibnVtYmVyIiwgInZhbHVlIiwgInZhbGlkYXRlIiwgIm9iamVjdCIsICJ2YWx1ZSIsICJ2YWxpZGF0ZSIsICJwYXR0ZXJuIiwgInZhbHVlIiwgInZhbGlkYXRlIiwgInBhdHRlcm5fZGVmYXVsdCIsICJyZWdleHAiLCAidmFsdWUiLCAidmFsaWRhdGUiLCAicmVxdWlyZWQiLCAidmFsdWUiLCAidHlwZSIsICJyZXF1aXJlZF9kZWZhdWx0IiwgInN0cmluZyIsICJ2YWx1ZSIsICJ2YWxpZGF0ZSIsICJ0eXBlIiwgInZhbHVlIiwgInZhbGlkYXRlIiwgInR5cGVfZGVmYXVsdCIsICJlbnVtX2RlZmF1bHQiLCAicGF0dGVybl9kZWZhdWx0IiwgInR5cGVfZGVmYXVsdCIsICJyZXF1aXJlZF9kZWZhdWx0IiwgIlNjaGVtYSIsICJkZWZpbmUiLCAibWVzc2FnZXMiLCAidmFsaWRhdGUiLCAia2V5cyIsICJ2YWx1ZSIsICJ0eXBlIiwgInZhbGlkYXRvciIsICJ3YXJuaW5nIiwgImVzX2RlZmF1bHQiLCAiUmVhY3QiLCAidHlwZVRlbXBsYXRlIiwgImVzX2RlZmF1bHQiLCAidmFsdWUiLCAidmFsaWRhdG9yIiwgIm1lc3NhZ2VzIiwgImluZGV4IiwgInByZXYiLCAid3JhcHBlZENhbGxiYWNrIiwgInRvQXJyYXkiLCAidmFsdWUiLCAia2V5cyIsICJhcnJheSIsICJsZW5ndGgiLCAiX2V4Y2x1ZGVkIiwgInByZXYiLCAibmV4dCIsICJGaWVsZCIsICJwcmVzZXJ2ZSIsICJ0b0FycmF5IiwgIm5vcm1hbGl6ZSIsICJnZXRJbnRlcm5hbEhvb2tzIiwgInZhbHVlIiwgInJlbmRlciIsICJSZWFjdCIsICJnZXRLZXkiLCAic2hvdWxkVXBkYXRlIiwgInZhbHVlIiwgImdldE5ld1ZhbHVlIiwgImluZGV4IiwgIm1vdmUiLCAiZnJvbSIsICJSZWFjdCIsICJpbmRleCIsICJTUExJVCIsICJOYW1lTWFwIiwgInNldCIsICJ2YWx1ZSIsICJnZXQiLCAibmV4dCIsICJ0eXBlIiwgInVuaXQiLCAiX2V4Y2x1ZGVkIiwgIkZvcm1TdG9yZSIsICJwcmVzZXJ2ZSIsICJjYWNoZSIsICJpbmRleCIsICJpc0ZpZWxkVG91Y2hlZCIsICJpc05hbWVQYXRoTGlzdFRvdWNoZWQiLCAidmFsdWUiLCAicmVzZXRXaXRoRmllbGRzIiwgImZpbGxDaGlsZHJlbiIsICJmb3JjZVJlUmVuZGVyIiwgIlJlYWN0IiwgIlJlYWN0IiwgIkZvcm1Qcm92aWRlciIsICJ0cmlnZ2VyRm9ybUNoYW5nZSIsICJ0cmlnZ2VyRm9ybUZpbmlzaCIsICJyZWdpc3RlckZvcm0iLCAidW5yZWdpc3RlckZvcm0iLCAiX2V4Y2x1ZGVkIiwgIkZvcm0iLCAicHJlc2VydmUiLCAiQ29tcG9uZW50IiwgImltcG9ydF9yZWFjdCIsICJzdHJpbmdpZnkiLCAidmFsdWUiLCAiZ2V0SW50ZXJuYWxIb29rcyIsICJnZXRXYXRjaFZhbHVlIiwgIlJlYWN0IiwgInRva2VuIiwgIm1lcmdlIiwgInBvc2l0aW9uIiwgInRva2VuIiwgInByZXBhcmVUb2tlbiIsICJtZXJnZSIsICJwcmVwYXJlQ29tcG9uZW50VG9rZW4iLCAic3R5bGVfZGVmYXVsdCIsICJSZWFjdCIsICJDb21wb25lbnQiLCAiZGVmYXVsdFByZWZpeENscyIsICJQdXJlUGFuZWwiLCAic3R5bGUiLCAicmVzaXplT2JzZXJ2ZXIiLCAiUmVhY3QiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiUmVhY3QiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiUmVhY3QiLCAiUmVhY3QiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiVHJhbnNCdG4iLCAiY2xhc3NOYW1lcyIsICJjbHMiLCAiaW1wb3J0X3JlYWN0IiwgInVzZUFsbG93Q2xlYXIiLCAiUmVhY3QiLCAiUmVhY3QiLCAiUmVhY3QiLCAiY2FuY2VsTGF0ZXN0IiwgImRlbGF5U2V0Qm9vbCIsICJ2YWx1ZSIsICJSZWFjdCIsICJSZWFjdCIsICJSZWFjdCIsICJpbXBvcnRfcmVhY3QiLCAiUmVhY3QiLCAiaW1wb3J0X3JlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgIlJlYWN0IiwgImltcG9ydF9yZWFjdCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJSZWFjdCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJfZXhjbHVkZWQiLCAiaXRlbUtleSIsICJzdHlsZSIsICJDb21wb25lbnQiLCAiY2xhc3NOYW1lcyIsICJvblJlc2l6ZSIsICJSZWFjdCIsICJpbXBvcnRfcmVhY3RfZG9tIiwgIm5vdGlmeUVmZmVjdFVwZGF0ZSIsICJSZWFjdCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJpbXBvcnRfcmVhY3QiLCAiUmVhY3QiLCAiX2V4Y2x1ZGVkIiwgIl9leGNsdWRlZDIiLCAiX2V4Y2x1ZGVkMyIsICJJbnRlcm5hbFJhd0l0ZW0iLCAiQ29tcG9uZW50IiwgImNsYXNzTmFtZXMiLCAiX2V4Y2x1ZGVkIiwgIml0ZW1LZXkiLCAic3R5bGUiLCAiQ29tcG9uZW50IiwgImdldEtleSIsICJpbmRleCIsICJjbGFzc05hbWVzIiwgImVzX2RlZmF1bHQiLCAiUmVhY3QiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiSW5wdXQiLCAidmFsdWUiLCAic3R5bGUiLCAiY2xhc3NOYW1lcyIsICJSZWFjdCIsICJ0b0FycmF5IiwgInZhbHVlIiwgImhhc1ZhbHVlIiwgImdldFRpdGxlIiwgInVzZUxheW91dEVmZmVjdCIsICJ2YWx1ZSIsICJvblByZXZlbnRNb3VzZURvd24iLCAiU2VsZWN0U2VsZWN0b3IiLCAidXNlTGF5b3V0RWZmZWN0IiwgImRlZmF1bHRSZW5kZXJTZWxlY3RvciIsICJnZXRUaXRsZSIsICJjbGFzc05hbWVzIiwgImN1c3RvbWl6ZVJlbmRlclNlbGVjdG9yIiwgIm9uTW91c2VEb3duIiwgInJlbmRlckl0ZW0iLCAib25DbG9zZSIsICJyZW5kZXJSZXN0IiwgImVzX2RlZmF1bHQiLCAiUmVhY3QiLCAiU2luZ2xlU2VsZWN0b3IiLCAiZ2V0VGl0bGUiLCAiU2VsZWN0b3IiLCAib25JbnRlcm5hbElucHV0S2V5RG93biIsICJvbkludGVybmFsSW5wdXRNb3VzZURvd24iLCAidHJpZ2dlck9uU2VhcmNoIiwgInZhbHVlIiwgIm9uSW5wdXRDb21wb3NpdGlvblN0YXJ0IiwgIm9uSW5wdXRDb21wb3NpdGlvbkVuZCIsICJvbklucHV0Q2hhbmdlIiwgIm9uSW5wdXRQYXN0ZSIsICJvbkNsaWNrIiwgIm9uTW91c2VEb3duIiwgImltcG9ydF9jbGFzc25hbWVzIiwgIlJlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgIlJlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgIlJlYWN0IiwgImNsYXNzTmFtZXMiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiUmVhY3QiLCAiTWFzayIsICJlc19kZWZhdWx0IiwgImNsYXNzTmFtZXMiLCAiUmVhY3QiLCAibmV4dCIsICJzdHlsZSIsICJQb3J0YWwiLCAiTWFzayIsICJlc19kZWZhdWx0IiwgImNscyIsICJjbGFzc05hbWVzIiwgIlJlYWN0IiwgIm5vZGUiLCAiUmVhY3QiLCAiY29udGV4dF9kZWZhdWx0IiwgIlJlYWN0IiwgInRvQXJyYXkiLCAiUmVhY3QiLCAicGxhY2VtZW50cyIsICJvZmZzZXQiLCAiaW5kZXgiLCAicmVzZXRGbGlwQ2FjaGUiLCAiZ2V0SW50ZXJzZWN0aW9uVmlzaWJsZUFyZWEiLCAic3luY05leHRQb3B1cFBvc2l0aW9uIiwgInRhcmdldE9mZnNldCIsICJzdXBwb3J0QWRqdXN0IiwgInRyaWdnZXJBbGlnbiIsICJyZXNldFJlYWR5IiwgInVzZVdhdGNoIiwgIm5vdGlmeVNjcm9sbCIsICJSZWFjdCIsICJvblBvaW50ZXJEb3duIiwgIm9uVHJpZ2dlckNsb3NlIiwgIl9leGNsdWRlZCIsICJlc19kZWZhdWx0IiwgImNvbnRleHRfZGVmYXVsdCIsICJpZCIsICJub2RlIiwgImNsZWFyRGVsYXkiLCAidHJpZ2dlck9wZW4iLCAic2V0TW91c2VQb3NCeUV2ZW50IiwgIm9uU2Nyb2xsIiwgInVzZVdhdGNoIiwgImNsYXNzTmFtZXMiLCAic3luY1RhcmdldFNpemUiLCAib25UYXJnZXRSZXNpemUiLCAib25WaXNpYmxlQ2hhbmdlZCIsICJvblByZXBhcmUiLCAib25Qb3B1cE1vdXNlRW50ZXIiLCAib25Qb3B1cE1vdXNlTGVhdmUiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiUmVhY3QiLCAiX2V4Y2x1ZGVkIiwgImdldEJ1aWx0SW5QbGFjZW1lbnRzIiwgIlNlbGVjdFRyaWdnZXIiLCAiZW1wdHkiLCAibWVyZ2VkQnVpbHRpblBsYWNlbWVudHMiLCAiZXNfZGVmYXVsdCIsICJjbGFzc05hbWVzIiwgImluZGV4IiwgInZhbHVlIiwgImdldCIsICJnZXRTZXBhcmF0ZWRDb250ZW50IiwgIm1hdGNoIiwgInNlcGFyYXRlIiwgInRva2VuIiwgImxpc3QiLCAiUmVhY3QiLCAiUmVhY3QiLCAidmFsdWUiLCAiX2V4Y2x1ZGVkIiwgImlzTXVsdGlwbGUiLCAiT3B0aW9uTGlzdCIsICJvbkludGVybmFsU2VhcmNoIiwgIm9uSW50ZXJuYWxTZWFyY2hTdWJtaXQiLCAib25JbnRlcm5hbEtleURvd24iLCAib25JbnRlcm5hbEtleVVwIiwgIm9uU2VsZWN0b3JSZW1vdmUiLCAib25JbnB1dEJsdXIiLCAib25Db250YWluZXJGb2N1cyIsICJvbkNvbnRhaW5lckJsdXIiLCAib25JbnRlcm5hbE1vdXNlRG93biIsICJpbmRleCIsICJvblRyaWdnZXJWaXNpYmxlQ2hhbmdlIiwgImNsYXNzTmFtZXMiLCAib25DbGVhck1vdXNlRG93biIsICJub2RlIiwgIk9wdEdyb3VwIiwgIk9wdGlvbiIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJSZWFjdCIsICJpbXBvcnRfcmVhY3QiLCAiaW1wb3J0X3JlYWN0X2RvbSIsICJSZWFjdCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJvblJlc2l6ZSIsICJjbGFzc05hbWVzIiwgIlJlYWN0IiwgIlJlYWN0IiwgIkl0ZW0iLCAibm9kZSIsICJnZXRLZXkiLCAiaW5kZXgiLCAibm9kZSIsICJJdGVtIiwgIlJlYWN0IiwgImdldEtleSIsICJnZXRLZXkiLCAiaW1wb3J0X3JlYWN0IiwgImltcG9ydF9yZWFjdCIsICJSZWFjdCIsICJnZXRLZXkiLCAiZ2V0U2l6ZSIsICJSZWFjdCIsICJpbXBvcnRfcmVhY3QiLCAiQ2FjaGVNYXAiLCAic2V0IiwgInZhbHVlIiwgImdldCIsICJ2YWx1ZSIsICJnZXRLZXkiLCAiZG9Db2xsZWN0IiwgImltcG9ydF9yZWFjdCIsICJvblRvdWNoTW92ZSIsICJvZmZzZXQiLCAib25Ub3VjaEVuZCIsICJvblRvdWNoU3RhcnQiLCAiY2xlYW5VcEV2ZW50cyIsICJSZWFjdCIsICJvZmZzZXQiLCAic3RvcFNjcm9sbCIsICJjb250aW51ZVNjcm9sbCIsICJvbk1vdXNlRG93biIsICJvbk1vdXNlVXAiLCAib25Nb3VzZU1vdmUiLCAiUmVhY3QiLCAiZ2V0S2V5IiwgImluZGV4IiwgIm9mZnNldCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJSZWFjdCIsICJzdHlsZSIsICJkZWxheUhpZGRlbiIsICJvbkNvbnRhaW5lck1vdXNlRG93biIsICJvblRodW1iTW91c2VEb3duIiwgIm9uU2Nyb2xsYmFyVG91Y2hTdGFydCIsICJvbk1vdXNlTW92ZSIsICJvZmZzZXQiLCAib25Nb3VzZVVwIiwgImNsYXNzTmFtZXMiLCAiX2V4Y2x1ZGVkIiwgInN0eWxlIiwgIml0ZW1LZXkiLCAiQ29tcG9uZW50IiwgImdldEtleSIsICJjbGFzc05hbWVzIiwgIm9uU2Nyb2xsYmFyU3RhcnRNb3ZlIiwgIm9uU2Nyb2xsYmFyU3RvcE1vdmUiLCAidmFsdWUiLCAib25Ib2xkZXJSZXNpemUiLCAiZ2V0VmlydHVhbFNjcm9sbEluZm8iLCAia2VlcEluSG9yaXpvbnRhbFJhbmdlIiwgIm9mZnNldCIsICJkZWxheUhpZGVTY3JvbGxCYXIiLCAiZ2V0U2l6ZSIsICJMaXN0IiwgIkxpc3RfZGVmYXVsdCIsICJlc19kZWZhdWx0IiwgIkxpc3RfZGVmYXVsdCIsICJSZWFjdCIsICJpbXBvcnRfcmVhY3QiLCAiX2V4Y2x1ZGVkIiwgImlzVGl0bGVUeXBlIiwgIk9wdGlvbkxpc3QiLCAiZmxhdHRlbk9wdGlvbnMiLCAicHJldiIsICJuZXh0IiwgIm9uTGlzdE1vdXNlRG93biIsICJzY3JvbGxJbnRvVmlldyIsICJ2YWx1ZSIsICJnZXRFbmFibGVkQWN0aXZlSW5kZXgiLCAiaW5kZXgiLCAib2Zmc2V0IiwgInNldEFjdGl2ZSIsICJvblNlbGVjdFZhbHVlIiwgImdldExhYmVsIiwgInJlbmRlckl0ZW0iLCAiZXNfZGVmYXVsdCIsICJjbGFzc05hbWVzIiwgInN0eWxlIiwgIlJlYWN0IiwgIlJlYWN0IiwgInRvQXJyYXkiLCAiUmVhY3QiLCAidXVpZCIsICJpc0Jyb3dzZXJDbGllbnQiLCAidXNlSWQiLCAiUmVhY3QiLCAiUmVhY3QiLCAiX2V4Y2x1ZGVkIiwgIl9leGNsdWRlZDIiLCAibm9kZSIsICJ2YWx1ZSIsICJ0b0FycmF5IiwgImluZGV4IiwgInVzZU9wdGlvbnMiLCAic2V0TGFiZWxPcHRpb25zIiwgImRpZyIsICJSZWFjdCIsICJSZWFjdCIsICJ2YWx1ZSIsICJ0b0FycmF5IiwgIm5vZGUiLCAidHlwZSIsICJyZWN1cnNpdmVPcHRpb25zIiwgIl9leGNsdWRlZCIsICJ2YWx1ZSIsICJ1c2VJZCIsICJ0b0FycmF5IiwgImhhc1ZhbHVlIiwgImV4aXN0T3B0aW9ucyIsICJzb3J0ZXIiLCAidHJpZ2dlckNoYW5nZSIsICJpbmRleCIsICJ0cmlnZ2VyU2VsZWN0IiwgInR5cGUiLCAiZ2V0U2VsZWN0RW50IiwgIm9uRGlzcGxheVZhbHVlc0NoYW5nZSIsICJvbkludGVybmFsU2VhcmNoIiwgIm9uSW50ZXJuYWxTZWFyY2hTcGxpdCIsICJlc19kZWZhdWx0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgImNsYXNzTmFtZXMiLCAiaW1wb3J0X3JlYWN0IiwgIlJlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgIlJlYWN0IiwgIkVtcHR5IiwgInRva2VuIiwgImxvY2FsZSIsICJSZWFjdCIsICJpbXBvcnRfcmVhY3QiLCAidG9rZW4iLCAibG9jYWxlIiwgInRva2VuIiwgInN0eWxlX2RlZmF1bHQiLCAibWVyZ2UiLCAiX19yZXN0IiwgIkVtcHR5IiwgInN0eWxlIiwgInN0eWxlX2RlZmF1bHQiLCAibG9jYWxlIiwgIndhcm5pbmciLCAiY2xhc3NOYW1lcyIsICJlbXB0eV9kZWZhdWx0IiwgIlJlYWN0IiwgImVtcHR5X2RlZmF1bHQiLCAiUmVhY3QiLCAiZ2V0QnVpbHRJblBsYWNlbWVudHMiLCAidG9rZW4iLCAidG9rZW4iLCAibWVyZ2UiLCAiZ2VuU2l6ZVN0eWxlIiwgInRva2VuIiwgImdlblNpbmdsZVN0eWxlIiwgIm1lcmdlIiwgInByZXBhcmVDb21wb25lbnRUb2tlbiIsICJ0b2tlbiIsICJ0b2tlbiIsICJ0b2tlbiIsICJnZW5TaW5nbGVTdHlsZSIsICJzdHlsZV9kZWZhdWx0IiwgIm1lcmdlIiwgInByZXBhcmVDb21wb25lbnRUb2tlbiIsICJSZWFjdCIsICJSZWFjdCIsICJDaGVja091dGxpbmVkIiwgIlJlZkljb24iLCAiQ2hlY2tPdXRsaW5lZF9kZWZhdWx0IiwgIlJlYWN0IiwgIkRvd25PdXRsaW5lZCIsICJSZWZJY29uIiwgIkRvd25PdXRsaW5lZF9kZWZhdWx0IiwgIlJlYWN0IiwgIlNlYXJjaE91dGxpbmVkIiwgIlJlZkljb24iLCAiU2VhcmNoT3V0bGluZWRfZGVmYXVsdCIsICJ3YXJuaW5nIiwgIkNsb3NlQ2lyY2xlRmlsbGVkX2RlZmF1bHQiLCAiTG9hZGluZ091dGxpbmVkX2RlZmF1bHQiLCAiU2VhcmNoT3V0bGluZWRfZGVmYXVsdCIsICJEb3duT3V0bGluZWRfZGVmYXVsdCIsICJDaGVja091dGxpbmVkX2RlZmF1bHQiLCAiQ2xvc2VPdXRsaW5lZF9kZWZhdWx0IiwgIl9fcmVzdCIsICJzdHlsZSIsICJ0b2tlbiIsICJzdHlsZV9kZWZhdWx0IiwgImlzTXVsdGlwbGUiLCAiY2xhc3NOYW1lcyIsICJfYSIsICJ3YXJuaW5nIiwgImVzX2RlZmF1bHQiLCAiZ2V0VHJhbnNpdGlvbk5hbWUiLCAiU2VsZWN0IiwgIlJlYWN0IiwgIlJlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgImltcG9ydF9jbGFzc25hbWVzIiwgIlJlYWN0IiwgIlBvcHVwIiwgInN0eWxlIiwgImNsYXNzTmFtZXMiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiUmVhY3QiLCAiaW1wb3J0X3JlYWN0IiwgIl9leGNsdWRlZCIsICJUb29sdGlwIiwgImdldFBvcHVwRWxlbWVudCIsICJQb3B1cCIsICJnZXRDaGlsZHJlbiIsICJlc19kZWZhdWx0IiwgImNsYXNzTmFtZXMiLCAiZXNfZGVmYXVsdCIsICJ0b2tlbiIsICJ0b2tlbiIsICJvZmZzZXQiLCAiUmVhY3QiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAidG9rZW4iLCAicHJlcGFyZUNvbXBvbmVudFRva2VuIiwgIm1lcmdlIiwgInN0eWxlX2RlZmF1bHQiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiY2xhc3NOYW1lcyIsICJQdXJlUGFuZWwiLCAic3R5bGVfZGVmYXVsdCIsICJjbHMiLCAiY2xhc3NOYW1lcyIsICJQb3B1cCIsICJQdXJlUGFuZWxfZGVmYXVsdCIsICJfX3Jlc3QiLCAidG9rZW4iLCAid2FybmluZyIsICJfYSIsICJfYiIsICJpc0ZyYWdtZW50IiwgImNsYXNzTmFtZXMiLCAic3R5bGVfZGVmYXVsdCIsICJlc19kZWZhdWx0IiwgImdldFRyYW5zaXRpb25OYW1lIiwgImNsb25lRWxlbWVudCIsICJUb29sdGlwIiwgIlB1cmVQYW5lbF9kZWZhdWx0IiwgIlJlYWN0IiwgIkxlZnRPdXRsaW5lZCIsICJSZWZJY29uIiwgIkxlZnRPdXRsaW5lZF9kZWZhdWx0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgIlJlYWN0IiwgImltcG9ydF9yZWFjdCIsICJfZXhjbHVkZWQiLCAic3R5bGUiLCAidHlwZSIsICJjbGFzc05hbWVzIiwgImhhbmRsZUNoYW5nZSIsICJlc19kZWZhdWx0IiwgImltcG9ydF9yZWFjdCIsICJSZWFjdCIsICJ0b2tlbiIsICJtZXJnZSIsICJ0b2tlbiIsICJnZW5EaXNhYmxlZFN0eWxlIiwgIm1lcmdlIiwgImdlbkJhc2VPdXRsaW5lZFN0eWxlIiwgImdlbk91dGxpbmVkU3RhdHVzU3R5bGUiLCAiZ2VuT3V0bGluZWRTdHlsZSIsICJnZW5Cb3JkZXJsZXNzU3R5bGUiLCAiZ2VuQmFzZUZpbGxlZFN0eWxlIiwgImdlbkZpbGxlZFN0YXR1c1N0eWxlIiwgImdlbkZpbGxlZFN0eWxlIiwgImdlbkJhc2VVbmRlcmxpbmVkU3R5bGUiLCAiZ2VuVW5kZXJsaW5lZFN0YXR1c1N0eWxlIiwgImdlblVuZGVybGluZWRTdHlsZSIsICJ0b2tlbiIsICJnZW5PdXRsaW5lZFN0eWxlIiwgImdlbkZpbGxlZFN0eWxlIiwgImdlbkJvcmRlcmxlc3NTdHlsZSIsICJnZW5VbmRlcmxpbmVkU3R5bGUiLCAiZ2VuR3JvdXBTdHlsZSIsICJtZXJnZSIsICJzdHlsZV9kZWZhdWx0IiwgInRva2VuIiwgImdldFN0eWxlIiwgIm1lcmdlIiwgInN0eWxlX2RlZmF1bHQiLCAiUmVhY3QiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiaW1wb3J0X3JlYWN0IiwgIlJlYWN0IiwgIl9fcmVzdCIsICJzdHlsZSIsICJ3YXJuaW5nIiwgIl9hIiwgInN0eWxlX2RlZmF1bHQiLCAiY2xhc3NOYW1lcyIsICJlc19kZWZhdWx0IiwgIkNoZWNrYm94IiwgIlJlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgIl9fcmVzdCIsICJzdHlsZSIsICJ2YWx1ZSIsICJzdHlsZV9kZWZhdWx0IiwgImNsYXNzTmFtZXMiLCAiQ2hlY2tib3giLCAiUmVhY3QiLCAiUmVhY3QiLCAiVXBPdXRsaW5lZCIsICJSZWZJY29uIiwgIlVwT3V0bGluZWRfZGVmYXVsdCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJ2YWx1ZSIsICJudW1iZXIiLCAiQmlnSW50RGVjaW1hbCIsICJ2YWx1ZSIsICJnZXRNYXJrIiwgIm9mZnNldCIsICJpc0VtcHR5IiwgImlzTmFOIiwgInRvU3RyaW5nIiwgIk51bWJlckRlY2ltYWwiLCAidmFsdWUiLCAibnVtYmVyIiwgImlzRW1wdHkiLCAiaXNOYU4iLCAidG9TdHJpbmciLCAidmFsdWUiLCAiZXNfZGVmYXVsdCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJpbXBvcnRfcmVhY3QiLCAidmFsdWUiLCAiUmVhY3QiLCAic3R5bGUiLCAidHJpZ2dlckZvY3VzIiwgInZhbHVlIiwgImNsYXNzTmFtZXMiLCAib25JbnB1dENsaWNrIiwgImNsc3giLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiaW1wb3J0X3JlYWN0IiwgIlJlYWN0IiwgIl9leGNsdWRlZCIsICJfZXhjbHVkZWQiLCAidmFsdWUiLCAiX2V4Y2x1ZGVkIiwgIklucHV0IiwgInR5cGUiLCAiY2xhc3NOYW1lcyIsICJmb2N1cyIsICJ2YWx1ZSIsICJwcmV2IiwgInRyaWdnZXJDaGFuZ2UiLCAib25JbnRlcm5hbENoYW5nZSIsICJvbkludGVybmFsQ29tcG9zaXRpb25FbmQiLCAiaGFuZGxlS2V5RG93biIsICJoYW5kbGVLZXlVcCIsICJoYW5kbGVGb2N1cyIsICJoYW5kbGVCbHVyIiwgImhhbmRsZVJlc2V0IiwgImdldElucHV0RWxlbWVudCIsICJSZWFjdCIsICJjbHN4IiwgImdldFN1ZmZpeCIsICJJbnB1dF9kZWZhdWx0IiwgImVzX2RlZmF1bHQiLCAiSW5wdXRfZGVmYXVsdCIsICJnZXQiLCAiUmVhY3QiLCAiaW1wb3J0X3JlYWN0IiwgInZhbHVlIiwgIlJlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgImltcG9ydF9yZWFjdCIsICJ1c2VNb2JpbGUiLCAib25TdG9wU3RlcCIsICJvblN0ZXBNb3VzZURvd24iLCAiY2xhc3NOYW1lcyIsICJzYWZlT25TdG9wU3RlcCIsICJpbXBvcnRfcmVhY3QiLCAiY2xlYW5VcCIsICJfZXhjbHVkZWQiLCAiX2V4Y2x1ZGVkMiIsICJnZXREZWNpbWFsVmFsdWUiLCAiZ2V0RGVjaW1hbElmVmFsaWRhdGUiLCAidmFsdWUiLCAiZXNfZGVmYXVsdCIsICJzdHlsZSIsICJjbGFzc05hbWVzIiwgIm51bWJlciIsICJnZXRSYW5nZVZhbHVlIiwgImlzSW5SYW5nZSIsICJ0cmlnZ2VyVmFsdWVVcGRhdGUiLCAiY29sbGVjdElucHV0VmFsdWUiLCAib25Db21wb3NpdGlvblN0YXJ0IiwgIm9uQ29tcG9zaXRpb25FbmQiLCAib25JbnRlcm5hbElucHV0IiwgIm9uSW50ZXJuYWxTdGVwIiwgImZsdXNoSW5wdXRWYWx1ZSIsICJvbkJlZm9yZUlucHV0IiwgIm9uS2V5RG93biIsICJvbktleVVwIiwgIm9uV2hlZWwiLCAib25CbHVyIiwgImNsc3giLCAiZm9jdXMiLCAiZXNfZGVmYXVsdCIsICJwcmVwYXJlQ29tcG9uZW50VG9rZW4iLCAidG9rZW4iLCAidG9rZW4iLCAiZ2VuT3V0bGluZWRTdHlsZSIsICJnZW5GaWxsZWRTdHlsZSIsICJnZW5VbmRlcmxpbmVkU3R5bGUiLCAiZ2VuQm9yZGVybGVzc1N0eWxlIiwgInN0eWxlX2RlZmF1bHQiLCAibWVyZ2UiLCAicHJlcGFyZUNvbXBvbmVudFRva2VuIiwgIl9fcmVzdCIsICJJbnB1dE51bWJlciIsICJzdHlsZV9kZWZhdWx0IiwgIlVwT3V0bGluZWRfZGVmYXVsdCIsICJEb3duT3V0bGluZWRfZGVmYXVsdCIsICJjbGFzc05hbWVzIiwgImVzX2RlZmF1bHQiLCAiaW1wb3J0X3JlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgImltcG9ydF9yZWFjdCIsICJSZWFjdCIsICJDbG9zZUNpcmNsZUZpbGxlZF9kZWZhdWx0IiwgImltcG9ydF9yZWFjdCIsICJoYXNQcmVmaXhTdWZmaXgiLCAiX19yZXN0IiwgIklucHV0IiwgInN0eWxlIiwgIl9fcmVzdCIsICJzdHlsZV9kZWZhdWx0IiwgIlJlYWN0IiwgImhhc1ByZWZpeFN1ZmZpeCIsICJ3YXJuaW5nIiwgImVzX2RlZmF1bHQiLCAiY2xhc3NOYW1lcyIsICJJbnB1dF9kZWZhdWx0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgIlJlYWN0IiwgIlJlYWN0IiwgImltcG9ydF9yZWFjdF9kb20iLCAidmFsdWUiLCAib2Zmc2V0IiwgImluZGV4IiwgImltcG9ydF9jbGFzc25hbWVzIiwgIlJlYWN0IiwgIlJlYWN0IiwgImNvbnRleHRfZGVmYXVsdCIsICJfZXhjbHVkZWQiLCAidmFsdWUiLCAic3R5bGUiLCAicmVuZGVyIiwgImNvbnRleHRfZGVmYXVsdCIsICJyYW5nZSIsICJjbGFzc05hbWVzIiwgIm9uSW50ZXJuYWxTdGFydE1vdmUiLCAib25JbnRlcm5hbEZvY3VzIiwgIm9uSW50ZXJuYWxNb3VzZUVudGVyIiwgIm9uS2V5RG93biIsICJvZmZzZXQiLCAiaGFuZGxlS2V5VXAiLCAiY2xzIiwgIl9leGNsdWRlZCIsICJzdHlsZSIsICJvbkFjdGl2ZSIsICJpbmRleCIsICJvbkhhbmRsZUZvY3VzIiwgIm9uSGFuZGxlTW91c2VFbnRlciIsICJ2YWx1ZSIsICJyZWYiLCAibm9kZSIsICJSZWFjdCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJSZWFjdCIsICJNYXJrIiwgInN0eWxlIiwgInZhbHVlIiwgImNvbnRleHRfZGVmYXVsdCIsICJjbGFzc05hbWVzIiwgIk1hcmtzIiwgInZhbHVlIiwgInN0eWxlIiwgIlJlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgIlJlYWN0IiwgIkRvdCIsICJ2YWx1ZSIsICJzdHlsZSIsICJjb250ZXh0X2RlZmF1bHQiLCAiY2xhc3NOYW1lcyIsICJTdGVwcyIsICJzdHlsZSIsICJjb250ZXh0X2RlZmF1bHQiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiUmVhY3QiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiUmVhY3QiLCAiVHJhY2siLCAic3R5bGUiLCAiaW5kZXgiLCAiY29udGV4dF9kZWZhdWx0IiwgInJhbmdlIiwgImNsYXNzTmFtZXMiLCAib25JbnRlcm5hbFN0YXJ0TW92ZSIsICJjbHMiLCAiVHJhY2tzIiwgInN0eWxlIiwgImNvbnRleHRfZGVmYXVsdCIsICJyYW5nZSIsICJjbGFzc05hbWVzIiwgImNscyIsICJpbmRleCIsICJSZWFjdCIsICJnZXRQb3NpdGlvbiIsICJmbHVzaFZhbHVlcyIsICJvZmZzZXQiLCAibmV4dCIsICJvblN0YXJ0TW92ZSIsICJvbk1vdXNlTW92ZSIsICJvbk1vdXNlVXAiLCAicHJldiIsICJSZWFjdCIsICJnZXREZWNpbWFsIiwgIm9mZnNldFZhbHVlIiwgIm9mZnNldCIsICJvZmZzZXRDaGFuZ2VkVmFsdWUiLCAibmVlZFB1c2giLCAib2Zmc2V0VmFsdWVzIiwgImltcG9ydF9yZWFjdCIsICJyYW5nZSIsICJTbGlkZXIiLCAic3R5bGUiLCAiY2xhc3NOYW1lcyIsICJ2YWx1ZSIsICJyYW5nZSIsICJpbmRleCIsICJnZXRUcmlnZ2VyVmFsdWUiLCAiZHJhZ2dpbmdEZWxldGUiLCAib25EZWxldGUiLCAiY2hhbmdlVG9DbG9zZVZhbHVlIiwgIm9uU2xpZGVyTW91c2VEb3duIiwgIm9uSGFuZGxlT2Zmc2V0Q2hhbmdlIiwgIm9mZnNldCIsICJuZXh0IiwgImNvbnRleHRfZGVmYXVsdCIsICJjbHMiLCAiU2xpZGVyX2RlZmF1bHQiLCAiZXNfZGVmYXVsdCIsICJTbGlkZXJfZGVmYXVsdCIsICJpbXBvcnRfcmVhY3QiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiaW1wb3J0X3JlYWN0IiwgIkNvbnRleHRfZGVmYXVsdCIsICJSZWFjdCIsICJpbXBvcnRfcmVhY3QiLCAiZ2VuQmFzZVN0eWxlIiwgInRva2VuIiwgInByZXBhcmVDb21wb25lbnRUb2tlbiIsICJzdHlsZV9kZWZhdWx0IiwgIm1lcmdlIiwgIlJlYWN0IiwgImNsZWFudXAiLCAiX19yZXN0IiwgIlNsaWRlciIsICJSZWFjdCIsICJyYW5nZSIsICJzdHlsZSIsICJDb250ZXh0X2RlZmF1bHQiLCAic3R5bGVfZGVmYXVsdCIsICJjbGFzc05hbWVzIiwgIndhcm5pbmciLCAibm9kZSIsICJpbmRleCIsICJlc19kZWZhdWx0IiwgImltcG9ydF9yZWFjdCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJjbGFzc05hbWVzIiwgInRva2VuIiwgInZhbHVlIiwgInByZXBhcmVDb21wb25lbnRUb2tlbiIsICJzdHlsZV9kZWZhdWx0IiwgIm1lcmdlIiwgIl9fcmVzdCIsICJSZWFjdCIsICJzdHlsZSIsICJDb21wb25lbnQiLCAic3R5bGVfZGVmYXVsdCIsICJjbGFzc05hbWVzIiwgIlJlYWN0IiwgIlJlYWN0IiwgIkV5ZU91dGxpbmVkIiwgIlJlZkljb24iLCAiRXllT3V0bGluZWRfZGVmYXVsdCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJnZXRPZmZzZXQiLCAibm9kZSIsICJib3giLCAiUmVhY3QiLCAiaW1wb3J0X3JlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgImltcG9ydF9yZWFjdF9kb20iLCAiUmVhY3RET00iLCAiaW1wb3J0X3JlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgIlJlYWN0IiwgImltcG9ydF9yZWFjdCIsICJSZWFjdCIsICJPcGVyYXRpb25zIiwgImdldENvbnRhaW5lciIsICJpY29ucyIsICJ6b29tSW4iLCAiem9vbU91dCIsICJvbktleURvd24iLCAiaGFuZGxlQWN0aXZlIiwgIm9mZnNldCIsICJ0eXBlIiwgImNsYXNzbmFtZXMiLCAiZXNfZGVmYXVsdCIsICJzdHlsZSIsICJpbXBvcnRfcmVhY3QiLCAicmVzZXRUcmFuc2Zvcm0iLCAidXBkYXRlVHJhbnNmb3JtIiwgImRpc3BhdGNoWm9vbUNoYW5nZSIsICJpbXBvcnRfcmVhY3QiLCAib25Nb3VzZURvd24iLCAib25Nb3VzZU1vdmUiLCAib25Nb3VzZVVwIiwgIm9uV2hlZWwiLCAiaW1wb3J0X3JlYWN0IiwgInVzZVN0YXR1cyIsICJvbkxvYWQiLCAiZ2V0SW1nUmVmIiwgImltcG9ydF9yZWFjdCIsICJ1cGRhdGVUb3VjaFBvaW50SW5mbyIsICJvblRvdWNoU3RhcnQiLCAib25Ub3VjaE1vdmUiLCAib25Ub3VjaEVuZCIsICJfZXhjbHVkZWQiLCAiX2V4Y2x1ZGVkMiIsICJQcmV2aWV3SW1hZ2UiLCAidXNlU3RhdHVzIiwgIlJlYWN0IiwgIlByZXZpZXciLCAiaWNvbnMiLCAiZ2V0Q29udGFpbmVyIiwgImNsYXNzbmFtZXMiLCAib25BZnRlckNsb3NlIiwgIm9uWm9vbUluIiwgIm9uWm9vbU91dCIsICJvblJvdGF0ZVJpZ2h0IiwgIm9uUm90YXRlTGVmdCIsICJvbkZsaXBYIiwgIm9uRmxpcFkiLCAib25SZXNldCIsICJvbkFjdGl2ZSIsICJvZmZzZXQiLCAicG9zaXRpb24iLCAib25LZXlEb3duIiwgIm9uRG91YmxlQ2xpY2siLCAiZXNfZGVmYXVsdCIsICJSZWFjdCIsICJpbXBvcnRfcmVhY3QiLCAiUmVhY3QiLCAiX2V4Y2x1ZGVkIiwgIl9leGNsdWRlZDIiLCAiR3JvdXAiLCAiaWNvbnMiLCAiZ2V0Q29udGFpbmVyIiwgInJlZ2lzdGVyIiwgIm9uQ2hhbmdlIiwgImluZGV4IiwgIm9uSW50ZXJuYWxDaGFuZ2UiLCAibmV4dCIsICJwcmV2IiwgIm9uUHJldmlld0Nsb3NlIiwgIlJlYWN0IiwgIl9leGNsdWRlZCIsICJfZXhjbHVkZWQyIiwgIkltYWdlSW50ZXJuYWwiLCAic3R5bGUiLCAiaWNvbnMiLCAidXNlU3RhdHVzIiwgIm9uUHJldmlld0Nsb3NlIiwgImNuIiwgIm9uUHJldmlldyIsICJnZXRPZmZzZXQiLCAiZXNfZGVmYXVsdCIsICJSZWFjdCIsICJSZWFjdCIsICJSb3RhdGVMZWZ0T3V0bGluZWQiLCAiUmVmSWNvbiIsICJSb3RhdGVMZWZ0T3V0bGluZWRfZGVmYXVsdCIsICJSZWFjdCIsICJSb3RhdGVSaWdodE91dGxpbmVkIiwgIlJlZkljb24iLCAiUm90YXRlUmlnaHRPdXRsaW5lZF9kZWZhdWx0IiwgIlJlYWN0IiwgIlN3YXBPdXRsaW5lZCIsICJSZWZJY29uIiwgIlN3YXBPdXRsaW5lZF9kZWZhdWx0IiwgIlJlYWN0IiwgIlpvb21Jbk91dGxpbmVkIiwgIlJlZkljb24iLCAiWm9vbUluT3V0bGluZWRfZGVmYXVsdCIsICJSZWFjdCIsICJab29tT3V0T3V0bGluZWQiLCAiUmVmSWNvbiIsICJab29tT3V0T3V0bGluZWRfZGVmYXVsdCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJwb3NpdGlvbiIsICJ0b2tlbiIsICJwcmVwYXJlQ29tcG9uZW50VG9rZW4iLCAic3R5bGVfZGVmYXVsdCIsICJtZXJnZSIsICJfX3Jlc3QiLCAiUm90YXRlTGVmdE91dGxpbmVkX2RlZmF1bHQiLCAiUm90YXRlUmlnaHRPdXRsaW5lZF9kZWZhdWx0IiwgIlpvb21Jbk91dGxpbmVkX2RlZmF1bHQiLCAiWm9vbU91dE91dGxpbmVkX2RlZmF1bHQiLCAiQ2xvc2VPdXRsaW5lZF9kZWZhdWx0IiwgIkxlZnRPdXRsaW5lZF9kZWZhdWx0IiwgIlJpZ2h0T3V0bGluZWRfZGVmYXVsdCIsICJTd2FwT3V0bGluZWRfZGVmYXVsdCIsICJzdHlsZV9kZWZhdWx0IiwgIl9hIiwgImNsYXNzTmFtZXMiLCAiZ2V0VHJhbnNpdGlvbk5hbWUiLCAiZXNfZGVmYXVsdCIsICJQcmV2aWV3R3JvdXBfZGVmYXVsdCIsICJfX3Jlc3QiLCAiSW1hZ2UiLCAic3R5bGUiLCAic3R5bGVfZGVmYXVsdCIsICJjbGFzc05hbWVzIiwgImdldENvbnRhaW5lciIsICJyb290Q2xhc3NOYW1lIiwgIkV5ZU91dGxpbmVkX2RlZmF1bHQiLCAiZ2V0VHJhbnNpdGlvbk5hbWUiLCAiZXNfZGVmYXVsdCIsICJQcmV2aWV3R3JvdXBfZGVmYXVsdCIsICJSZWFjdCIsICJpbXBvcnRfcmVhY3QiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiR3JvdXAiLCAic3R5bGVfZGVmYXVsdCIsICJjbHMiLCAiY2xhc3NOYW1lcyIsICJ3YXJuaW5nIiwgIkdyb3VwX2RlZmF1bHQiLCAiUmVhY3QiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAidG9rZW4iLCAibWVyZ2UiLCAiUmVhY3QiLCAiX19yZXN0IiwgInZhbHVlIiwgImluZGV4IiwgIklucHV0X2RlZmF1bHQiLCAiX19yZXN0IiwgImluZGV4IiwgImxlbmd0aCIsICJ2YWx1ZSIsICJ0eXBlIiwgIndhcm5pbmciLCAiY2xhc3NOYW1lcyIsICJSZWFjdCIsICJpbXBvcnRfcmVhY3QiLCAiUmVhY3QiLCAiRXllSW52aXNpYmxlT3V0bGluZWQiLCAiUmVmSWNvbiIsICJFeWVJbnZpc2libGVPdXRsaW5lZF9kZWZhdWx0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgIl9fcmVzdCIsICJFeWVPdXRsaW5lZF9kZWZhdWx0IiwgIkV5ZUludmlzaWJsZU91dGxpbmVkX2RlZmF1bHQiLCAicHJlZml4Q2xzIiwgImNsYXNzTmFtZXMiLCAiSW5wdXRfZGVmYXVsdCIsICJSZWFjdCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJfX3Jlc3QiLCAiU2VhcmNoT3V0bGluZWRfZGVmYXVsdCIsICJjbG9uZUVsZW1lbnQiLCAiYnV0dG9uX2RlZmF1bHQiLCAiY2xzIiwgImNsYXNzTmFtZXMiLCAiSW5wdXRfZGVmYXVsdCIsICJSZWFjdCIsICJpbXBvcnRfcmVhY3QiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiaW1wb3J0X3JlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgIlJlYWN0IiwgIm5vZGUiLCAic3R5bGUiLCAiX2V4Y2x1ZGVkIiwgInZhbHVlIiwgIm9uUmVzaXplIiwgInN0eWxlIiwgIm9uSW50ZXJuYWxDaGFuZ2UiLCAiZml4RmlyZWZveEF1dG9TY3JvbGwiLCAic3RhcnRSZXNpemUiLCAiY2xlYW5SYWYiLCAib25JbnRlcm5hbFJlc2l6ZSIsICJjbGFzc05hbWVzIiwgIl9leGNsdWRlZCIsICJSZWFjdCIsICJzdHlsZSIsICJjbGFzc05hbWVzIiwgIm9uUmVzaXplIiwgInZhbHVlIiwgImdldFRleHRBcmVhIiwgImZvY3VzIiwgInByZXYiLCAidHJpZ2dlckNoYW5nZSIsICJvbkludGVybmFsQ29tcG9zaXRpb25TdGFydCIsICJvbkludGVybmFsQ29tcG9zaXRpb25FbmQiLCAib25JbnRlcm5hbENoYW5nZSIsICJoYW5kbGVLZXlEb3duIiwgImhhbmRsZUZvY3VzIiwgImhhbmRsZUJsdXIiLCAiaGFuZGxlUmVzZXQiLCAiY2xzeCIsICJoYW5kbGVSZXNpemUiLCAiZXNfZGVmYXVsdCIsICJ0b2tlbiIsICJtZXJnZSIsICJfX3Jlc3QiLCAiVGV4dEFyZWEiLCAic3R5bGUiLCAib25SZXNpemUiLCAiX2EiLCAiZXNfZGVmYXVsdCIsICJjbGFzc05hbWVzIiwgIlRleHRBcmVhX2RlZmF1bHQiLCAiSW5wdXQiLCAiSW5wdXRfZGVmYXVsdCIsICJHcm91cF9kZWZhdWx0IiwgIlRleHRBcmVhX2RlZmF1bHQiLCAiUmVhY3QiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiUmVhY3QiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiUmVhY3QiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiaW1wb3J0X3JlYWN0IiwgInVzZVRyYW5zaXRpb25EdXJhdGlvbiIsICJub3ciLCAiX2V4Y2x1ZGVkIiwgIkxpbmUiLCAic3R5bGUiLCAiY2xhc3NOYW1lcyIsICJpbmRleCIsICJSZWFjdCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJSZWFjdCIsICJ1dWlkIiwgImlzQnJvd3NlckNsaWVudCIsICJnZXRVVUlEIiwgInVzZUlkX2RlZmF1bHQiLCAiUmVhY3QiLCAiQmxvY2siLCAiZ2V0Q2lyY2xlU3R5bGUiLCAib2Zmc2V0IiwgIl9leGNsdWRlZCIsICJ0b0FycmF5IiwgInZhbHVlIiwgIkNpcmNsZSIsICJzdHlsZSIsICJ1c2VJZF9kZWZhdWx0IiwgImdldFN0b2tlTGlzdCIsICJpbmRleCIsICJnZXRTdGVwU3Rva2VMaXN0IiwgImNsYXNzTmFtZXMiLCAidHlwZSIsICJDaXJjbGUiLCAidHlwZSIsICJjbGFzc05hbWVzIiwgIm5vZGUiLCAiQ2lyY2xlX2RlZmF1bHQiLCAiUmVhY3QiLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiZ2VuQmFzZVN0eWxlIiwgInRva2VuIiwgInByZXBhcmVDb21wb25lbnRUb2tlbiIsICJzdHlsZV9kZWZhdWx0IiwgIm1lcmdlIiwgIl9fcmVzdCIsICJ2YWx1ZSIsICJmcm9tIiwgImJhY2tncm91bmQiLCAiTGluZSIsICJ3YXJuaW5nIiwgImNsYXNzTmFtZXMiLCAiTGluZV9kZWZhdWx0IiwgIlJlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgIlN0ZXBzIiwgImNsYXNzTmFtZXMiLCAiU3RlcHNfZGVmYXVsdCIsICJfX3Jlc3QiLCAidHlwZSIsICJmb3JtYXQiLCAic3R5bGUiLCAiX19yZXN0IiwgInN0eWxlX2RlZmF1bHQiLCAibnVtYmVyIiwgIkNsb3NlQ2lyY2xlRmlsbGVkX2RlZmF1bHQiLCAiQ2xvc2VPdXRsaW5lZF9kZWZhdWx0IiwgIkNoZWNrQ2lyY2xlRmlsbGVkX2RlZmF1bHQiLCAiQ2hlY2tPdXRsaW5lZF9kZWZhdWx0IiwgImNsYXNzTmFtZXMiLCAid2FybmluZyIsICJTdGVwc19kZWZhdWx0IiwgIkxpbmVfZGVmYXVsdCIsICJDaXJjbGVfZGVmYXVsdCIsICJwcm9ncmVzc19kZWZhdWx0IiwgIlJlYWN0IiwgIkRlbGV0ZU91dGxpbmVkIiwgIlJlZkljb24iLCAiRGVsZXRlT3V0bGluZWRfZGVmYXVsdCIsICJSZWFjdCIsICJEb3dubG9hZE91dGxpbmVkIiwgIlJlZkljb24iLCAiRG93bmxvYWRPdXRsaW5lZF9kZWZhdWx0IiwgIlJlYWN0IiwgInJlbmRlciIsICJGaWxlVHdvVG9uZSIsICJSZWZJY29uIiwgIkZpbGVUd29Ub25lX2RlZmF1bHQiLCAiUmVhY3QiLCAiUGFwZXJDbGlwT3V0bGluZWQiLCAiUmVmSWNvbiIsICJQYXBlckNsaXBPdXRsaW5lZF9kZWZhdWx0IiwgIlJlYWN0IiwgInJlbmRlciIsICJQaWN0dXJlVHdvVG9uZSIsICJSZWZJY29uIiwgIlBpY3R1cmVUd29Ub25lX2RlZmF1bHQiLCAiUmVhY3QiLCAiVXBsb2FkT3V0bGluZWQiLCAiUmVmSWNvbiIsICJVcGxvYWRPdXRsaW5lZF9kZWZhdWx0IiwgIlJlYWN0IiwgIlJlYWN0IiwgImltcG9ydF9yZWFjdF9kb20iLCAiaW1wb3J0X2NsYXNzbmFtZXMiLCAiaW1wb3J0X3JlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgImltcG9ydF9yZWFjdCIsICJ0eXBlIiwgInZhbHVlIiwgIl90cmF2ZXJzZUZpbGVUcmVlIiwgInRyYXZlcnNlRmlsZVRyZWUiLCAiaW5kZXgiLCAidWlkIiwgIl9leGNsdWRlZCIsICJBamF4VXBsb2FkZXIiLCAidWlkIiwgIm5vZGUiLCAibWV0aG9kIiwgIm9uUHJvZ3Jlc3MiLCAib25TdWNjZXNzIiwgIm9uRXJyb3IiLCAicmVuZGVyIiwgImNsYXNzTmFtZXMiLCAic3R5bGUiLCAiY2xzIiwgImNsc3giLCAiUmVhY3QiLCAiZW1wdHkiLCAiVXBsb2FkIiwgIm5vZGUiLCAicmVuZGVyIiwgIlJlYWN0IiwgImVzX2RlZmF1bHQiLCAidG9rZW4iLCAidG9rZW4iLCAidG9rZW4iLCAibW90aW9uX2RlZmF1bHQiLCAidG9rZW4iLCAidG9rZW4iLCAiZ2VuQmFzZVN0eWxlIiwgInRva2VuIiwgInByZXBhcmVDb21wb25lbnRUb2tlbiIsICJzdHlsZV9kZWZhdWx0IiwgIm1lcmdlIiwgIm1vdGlvbl9kZWZhdWx0IiwgIlJlYWN0IiwgImltcG9ydF9jbGFzc25hbWVzIiwgInVpZCIsICJ1cmwiLCAidHlwZSIsICJSZWFjdCIsICJpbXBvcnRfY2xhc3NuYW1lcyIsICJzdHlsZSIsICJsb2NhbGUiLCAiY2xhc3NOYW1lcyIsICJEZWxldGVPdXRsaW5lZF9kZWZhdWx0IiwgIkRvd25sb2FkT3V0bGluZWRfZGVmYXVsdCIsICJFeWVPdXRsaW5lZF9kZWZhdWx0IiwgImVzX2RlZmF1bHQiLCAicHJvZ3Jlc3NfZGVmYXVsdCIsICJub2RlIiwgImxvY2FsZSIsICJMb2FkaW5nT3V0bGluZWRfZGVmYXVsdCIsICJQaWN0dXJlVHdvVG9uZV9kZWZhdWx0IiwgIkZpbGVUd29Ub25lX2RlZmF1bHQiLCAiUGFwZXJDbGlwT3V0bGluZWRfZGVmYXVsdCIsICJwcmVmaXhDbHMiLCAiYnV0dG9uX2RlZmF1bHQiLCAiY2xvbmVFbGVtZW50IiwgImNsYXNzTmFtZXMiLCAiZXNfZGVmYXVsdCIsICJ2YWx1ZSIsICJpc0ltYWdlVXJsIiwgInR5cGUiLCAic3R5bGUiLCAidXBsb2FkIiwgIndhcm5pbmciLCAiaW5kZXgiLCAic3R5bGVfZGVmYXVsdCIsICJlbl9VU19kZWZhdWx0IiwgImNsYXNzTmFtZXMiLCAiZXNfZGVmYXVsdCIsICJVcGxvYWQiLCAiVXBsb2FkX2RlZmF1bHQiLCAiX19yZXN0IiwgInN0eWxlIiwgIlVwbG9hZF9kZWZhdWx0IiwgIlVwbG9hZCIsICJVcGxvYWRfZGVmYXVsdCIsICJpbXBvcnRfcmVhY3QiLCAiaW1wb3J0X3JlYWN0IiwgImltcG9ydF9yZWFjdCIsICJpbXBvcnRfanN4X3J1bnRpbWUiLCAiZ3JvdXAiLCAiaW5kZXgiLCAiUmVhY3QiLCAiaW1wb3J0X3JlYWN0IiwgImltcG9ydF9yZWFjdCIsICJpbXBvcnRfanN4X3J1bnRpbWUiLCAidmFsdWUiLCAiaW1wb3J0X2pzeF9ydW50aW1lIiwgInZhbHVlIiwgImltcG9ydF9qc3hfcnVudGltZSIsICJ2YWx1ZSIsICJpbXBvcnRfanN4X3J1bnRpbWUiLCAiVGV4dEFyZWEiLCAidmFsdWUiLCAiaW1wb3J0X3JlYWN0IiwgImltcG9ydF9qc3hfcnVudGltZSIsICJpbXBvcnRfanN4X3J1bnRpbWUiLCAidmFsdWUiLCAiVXBsb2FkT3V0bGluZWRfZGVmYXVsdCIsICJpbXBvcnRfanN4X3J1bnRpbWUiLCAiYXBpIiwgIlJlYWN0IiwgIm5vZGUiLCAidmFsdWUiLCAiaW1wb3J0X2pzeF9ydW50aW1lIiwgIkNsb3NlT3V0bGluZWRfZGVmYXVsdCIsICJpbXBvcnRfanN4X3J1bnRpbWUiLCAiYXBwIiwgImFwcCIsICJhcHAiLCAiYXBpIiwgIiRlbCIsICJwcm9tcHRzRnJvbVNEUFBQQmFja2VuZCIsICJub2RlIiwgImFwcCIsICIkZWwiLCAiYXBpIiwgIm1vZHVsZSJdCn0K diff --git a/package.json b/package.json index 3d2d094..d89041d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sdppp", - "version": "1.8.1", + "version": "1.8.2", "type": "module", "scripts": { "watch": "nodemon -w typescripts -e mjs,js,jsx,mts,ts,tsx,json,css,html -x node typescripts/src/build/index.build.ts", diff --git a/plugins/photoshop/dist/index.js b/plugins/photoshop/dist/index.js index df5fa93..40f6d3c 100644 --- a/plugins/photoshop/dist/index.js +++ b/plugins/photoshop/dist/index.js @@ -885,6 +885,7 @@ } }, [connectState]); return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_jsx_runtime19.Fragment, { children: [ + /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(SDPPPInternalBridge_exports.Promote, {}), /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "connect-box", children: [ !editorMode ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "status-bar " + connectState, children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "status-icon", title: lastConnectErrorMessage?.toString() || i18n(connectState), children: "\u2B24" }) }) : /* @__PURE__ */ (0, import_jsx_runtime19.jsx)( "sp-action-button", @@ -898,7 +899,7 @@ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(AddressBar, {}) ] }), lastConnectErrorMessage ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("sp-label", { class: "error-label", children: isValidI18nKey(lastConnectErrorMessage) ? i18n(lastConnectErrorMessage) : lastConnectErrorMessage }) }) : "", - /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(SDPPPInternalBridge_exports.Promote, {}), + /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(SDPPPInternalBridge_exports.Auths, {}), /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("sp-divider", { size: "small" }), connectState === "connected" && /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "panel-body", children: [ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "editor-card", style: editorCardShowingIndex === 0 ? {} : { display: "none" }, children: /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "comfy-list-wrap", children: [ @@ -938,35 +939,5 @@ globalThis.sdppp.renderPhotoshopPlugin = (rootElement) => { (0, import_client.createRoot)(rootElement).render(/* @__PURE__ */ (0, import_jsx_runtime21.jsx)(Main, {})); }; - var logs = []; - var warningLogs = []; - var errorLogs = []; - globalThis.sdppp.getLogs = () => { - return { - logs, - warningLogs, - errorLogs - }; - }; - globalThis.sdppp.enableLogCapture = () => { - console.log = /* @__PURE__ */ function(log) { - return function(...args) { - log(...args); - logs.push(args); - }; - }(console.log); - console.warn = /* @__PURE__ */ function(log) { - return function(...args) { - log(...args); - warningLogs.push(args); - }; - }(console.warn); - console.error = /* @__PURE__ */ function(log) { - return function(...args) { - log(...args); - errorLogs.push(args); - }; - }(console.error); - }; })(); //# sourceMappingURL=index.js.map diff --git a/plugins/photoshop/dist/index.js.map b/plugins/photoshop/dist/index.js.map index f5eda06..2cd5080 100644 --- a/plugins/photoshop/dist/index.js.map +++ b/plugins/photoshop/dist/index.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["external-global-plugin:SDPPPInternal", "external-global-plugin:react", "external-global-plugin:react/jsx-runtime", "external-global-plugin:react-dom/client", "../../../typescripts/modules/photoshop/src/tsx/SDPPPInternalBridge.tsx", "../../../typescripts/src/common/en.mts", "../../../typescripts/src/common/zh-cn.mts", "../../../typescripts/src/common/i18n.mts", "../../../typescripts/modules/photoshop/src/tsx/ActionButton.tsx", "../../../typescripts/modules/photoshop/src/tsx/icons/AgentIcon.tsx", "../../../typescripts/modules/photoshop/src/tsx/icons/LivePaintingIcon.tsx", "../../../typescripts/modules/photoshop/src/tsx/icons/PlayIcon.tsx", "../../../typescripts/modules/photoshop/src/tsx/WebPageListItem.tsx", "../../../typescripts/modules/photoshop/src/tsx/WebPageList.tsx", "../../../typescripts/modules/photoshop/src/tsx/icons/EditIcon.tsx", "../../../typescripts/modules/photoshop/src/tsx/icons/FolderIcon.tsx", "../../../typescripts/modules/photoshop/src/tsx/WorkflowListItem.tsx", "../../../typescripts/modules/photoshop/src/tsx/WorkflowList.tsx", "../../../typescripts/modules/photoshop/src/tsx/Content.tsx", "../../../typescripts/modules/photoshop/src/tsx/WorkflowEditWrap.tsx", "../../../typescripts/modules/photoshop/src/tsx/icons/RefreshIcon.tsx", "../../../typescripts/modules/photoshop/src/tsx/icons/SaveIcon.tsx", "../../../typescripts/modules/photoshop/src/tsx/icons/PlayMultiIcon.tsx", "../../../typescripts/modules/photoshop/src/tsx/icons/WebEditIcon.tsx", "../../../typescripts/modules/photoshop/src/tsx/icons/CrossIcon.tsx", "../../../typescripts/modules/photoshop/src/tsx/icons/StopIcon.tsx", "../../../typescripts/modules/photoshop/src/tsx/icons/CancelIcon.tsx", "../../../typescripts/modules/photoshop/src/tsx/Main.tsx", "../../../typescripts/modules/photoshop/src/entry.tsx"], - "sourcesContent": ["module.exports = window.SDPPPInternal", "module.exports = window.React", "module.exports = window.ReactJSXRuntime", "module.exports = window.ReactDOMClient", "export * from \"SDPPPInternal\";", "export default {\n 'SDPPP Get Document': 'SDPPP Get Document',\n 'SDPPP Get Layer By ID': 'SDPPP Get Layer',\n 'SDPPP Get Linked Layers': 'SDPPP Get Linked Layers',\n 'SDPPP Get Layers In Group': 'SDPPP Get Layers In Group',\n 'SDPPP Get Text From Layer': 'SDPPP Get Text From Layer',\n 'SDPPP Parse Layer Info': 'SDPPP Parse Layer Info',\n 'SDPPP Get Selection': 'SDPPP Get Selection', \n 'SDPPP Get Image From Photoshop': 'SDPPP Get Image From Photoshop',\n 'SDPPP Send Images To Photoshop': 'SDPPP Send Images To Photoshop',\n 'SDPPP Settings': 'SDPPP Settings/Misc',\n}", "export default {\n // speicial document/ layer\n '### Active Document ###': '### \u5F53\u524D\u6587\u6863 ###',\n '### The Canvas ###': '### \u6574\u4E2A\u753B\u5E03 ###',\n '### New Layer ###': '### \u65B0\u56FE\u5C42 ###',\n '### Selected Layer ###': '### \u6240\u9009\u56FE\u5C42 ###',\n '### Keep Size or Fit Canvas ###': '### \u4FDD\u6301\u5C3A\u5BF8\u6216\u9002\u5E94\u753B\u5E03 ###',\n '_SDPPP_PSD_': '_SDPPP_PSD_',\n\n // A1111 UI\n 'Save and run immediately': '\u4FDD\u5B58\u5E76\u7ACB\u5373\u6267\u884C',\n 'Close': '\u5173\u95ED',\n 'Select a {0}': `\u9009\u62E9\u4E00\u4E2A {0}`,\n\n // comfyui dialog\n 'How to use .ccx file': '\u5982\u4F55\u4F7F\u7528 .ccx \u6587\u4EF6',\n '1. If you have installed Adobe Creative Cloud': '1. \u5982\u679C\u4F60\u5DF2\u7ECF\u5B89\u88C5\u4E86 Adobe Creative Cloud', \n 'Just double click the .ccx file, it will install the plugin automatically': '\u53CC\u51FB .ccx \u6587\u4EF6\uFF0C\u5B83\u4F1A\u81EA\u52A8\u5B89\u88C5',\n \"2. If you don't have Adobe Creative Cloud\": '2. \u5982\u679C\u4F60\u6CA1\u6709 Adobe Creative Cloud',\n 'Rename .ccx to .zip and extract it into ': '\u5C06 .ccx \u91CD\u547D\u540D\u4E3A .zip \u5E76\u89E3\u538B\u5230',\n 'or': '\u6216',\n 'Photoshop directory': 'Photoshop \u5B89\u88C5\u76EE\u5F55',\n\n // comfyui error\n 'Cannot connect multiple different document widgets with same value': '\u4E0D\u80FD\u8FDE\u63A5\u591A\u4E2A\u5177\u6709\u76F8\u540C\u503C\u7684\u6587\u6863\u5C0F\u90E8\u4EF6',\n 'You can only have one SDPPP Settings node in a workflow': '\u4E00\u4E2A\u5DE5\u4F5C\u6D41\u4E2D\u53EA\u80FD\u6709\u4E00\u4E2A SDPPP Settings \u8282\u70B9',\n 'convert widget {0} failed:': '\u63A7\u4EF6{0}\u8F6C\u6362\u5931\u8D25\uFF1A',\n 'hidden webview load failed: {0}, please select a browser page to continue': '\u5185\u7F6E webview \u52A0\u8F7D\u5931\u8D25: {0}\uFF0C\u8BF7\u9009\u62E9\u4E00\u4E2A\u6D4F\u89C8\u5668\u9875\u9762\u7EE7\u7EED',\n \n // comfy node title\n 'SDPPP Get Document': 'SDPPP\u83B7\u53D6\u6587\u6863(GetDocument)',\n 'SDPPP Get Layer By ID': 'SDPPP\u83B7\u53D6\u56FE\u5C42(GetLayer)',\n 'SDPPP Get Linked Layers': 'SDPPP\u83B7\u53D6\u94FE\u63A5\u56FE\u5C42(GetLinkedLayers)',\n 'SDPPP Get Layers In Group': 'SDPPP\u83B7\u53D6\u7EC4\u4E2D\u56FE\u5C42(GetLayersInGroup)',\n 'SDPPP Get Text From Layer': 'SDPPP\u83B7\u53D6\u56FE\u5C42\u6587\u672C(GetTextFromLayer)',\n 'SDPPP Parse Layer Info': 'SDPPP\u89E3\u6790\u56FE\u5C42\u4FE1\u606F(ParseLayerInfo)',\n 'SDPPP Get Selection': 'SDPPP\u83B7\u53D6\u9009\u533A(GetSelection)', \n 'SDPPP Get Image From Photoshop': 'SDPPP\u4ECEPS\u83B7\u53D6\u56FE\u50CF(GetImageFromPhotoshop)',\n 'SDPPP Send Images To Photoshop': 'SDPPP\u53D1\u9001\u56FE\u50CF\u5230PS(SendImagesToPhotoshop)',\n 'SDPPP Send Text To Layer': 'SDPPP\u53D1\u9001\u6587\u672C\u5230\u56FE\u5C42(SendTextToLayer)',\n 'SDPPP Run Photoshop Action': 'SDPPP\u8FD0\u884CPS Action(RunPhotoshopAction)',\n\n// comfy widget/input\n 'download PS plugin (.ccx)': '\u4E0B\u8F7D Photoshop \u63D2\u4EF6 (.ccx)',\n 'current ComfyUI pageid: {0}': '\u5F53\u524D ComfyUI \u9875\u9762ID: {0}',\n 'current A1111 pageid: {0}': '\u5F53\u524D A1111 \u9875\u9762ID: {0}',\n 'document linked': '\u6587\u6863\u53C2\u6570\u5DF2\u94FE\u63A5',\n 'layer linked': '\u56FE\u5C42\u53C2\u6570\u5DF2\u94FE\u63A5',\n 'bound linked': '\u8303\u56F4\u53C2\u6570\u5DF2\u94FE\u63A5',\n 'document': '\u6587\u6863', \n 'Document': '\u6587\u6863', \n 'DOCUMENT': '\u6587\u6863', \n 'document_name': '\u6587\u6863\u540D\u5B57id',\n 'layer_nameid': '\u56FE\u5C42\u540D\u5B57id',\n 'layer_name': '\u56FE\u5C42\u540D\u5B57',\n 'layer_info': '\u56FE\u5C42\u4FE1\u606F',\n 'bound_top': '\u8303\u56F4\u4E0A\u8FB9\u8DDD',\n 'bound_left': '\u8303\u56F4\u5DE6\u8FB9\u8DDD',\n 'bound_width': '\u8303\u56F4\u5BBD\u5EA6',\n 'bound_height': '\u8303\u56F4\u9AD8\u5EA6',\n 'center_x': '\u4E2D\u5FC3\u70B9x',\n 'center_y': '\u4E2D\u5FC3\u70B9y',\n 'opacity': '\u900F\u660E\u5EA6',\n 'layer': '\u56FE\u5C42',\n 'layer_or_group': '\u56FE\u5C42(\u6216\u7EC4)',\n 'Layer_or_group': '\u56FE\u5C42(\u6216\u7EC4)',\n 'bound': '\u8303\u56F4',\n 'bounds': '\u8303\u56F4',\n 'bounds [optional]': '\u8303\u56F4[\u53EF\u9009]',\n 'boundary': '\u8303\u56F4',\n 'Boundary': '\u8303\u56F4',\n 'canvas_boundary': '\u753B\u5E03\u8303\u56F4',\n 'canvas_bound': '\u753B\u5E03\u8303\u56F4',\n 'layer_boundary': '\u56FE\u5C42\u8303\u56F4',\n 'layer_bound': '\u56FE\u5C42\u8303\u56F4',\n \"Photoshop Disconnected!\" : \"Photoshop \u672A\u8FDE\u63A5\uFF01\",\n 'rgb_out': 'RGB\u8F93\u51FA',\n 'alpha_out': 'Alpha\u8F93\u51FA',\n 'images': '\u56FE\u50CF',\n 'text': '\u6587\u672C',\n 'ID_mode': '\u7CBE\u786EID\u6A21\u5F0F',\n 'name_mode': '\u540D\u5B57\u5339\u914D\u6A21\u5F0F',\n 'select': '\u9009\u62E9',\n 'document boundary': '\u6587\u6863\u8303\u56F4',\n 'layer boundary': '\u56FE\u5C42\u8303\u56F4',\n 'selection boundary': '\u9009\u4E2D\u8303\u56F4',\n 'save .psd to this workflow': '\u4FDD\u5B58.psd\u5230\u8FD9\u4E2A\u5DE5\u4F5C\u6D41',\n 'extract saved .psd to Photoshop': '\u63D0\u53D6\u4FDD\u5B58\u7684.psd\u5230Photoshop',\n 'sample .psd': '\u793A\u4F8B.psd',\n 'mask': '\u906E\u7F69',\n 'name': '\u540D\u79F0',\n 'quality': '\u56FE\u50CF\u8D28\u91CF',\n \n // photoshop UI\n 'timeout': '\u8D85\u65F6',\n '--multi-user activated, Not Login!': '--multi-user\u5DF2\u6FC0\u6D3B\uFF0C\u4F46\u672A\u767B\u5F55\uFF01',\n 'Logout': '\u767B\u51FA',\n 'User: ': '\u7528\u6237: ',\n 'connect': '\u8FDE\u63A5',\n 'connected': '\u5DF2\u8FDE\u63A5',\n 'disconnect': '\u65AD\u5F00',\n 'disconnected': '\u5DF2\u65AD\u5F00\u8FDE\u63A5',\n 'reconnecting...': '\u91CD\u8FDE\u4E2D...', \n 'connecting': '\u8FDE\u63A5\u4E2D', \n 'webpages': '\u7F51\u9875\u5217\u8868',\n 'workflows': '\u5DE5\u4F5C\u6D41',\n 'workflow': '\u5DE5\u4F5C\u6D41',\n 'auto run page [{0}] after change..': '\u66F4\u6539\u540E\u81EA\u52A8\u8FD0\u884C\u9875\u9762 {0}..',\n 'auto run workflow [{0}] after change..': '\u66F4\u6539\u540E\u81EA\u52A8\u8FD0\u884C\u5DE5\u4F5C\u6D41 {0}..',\n 'auto run workflow after change..': '\u66F4\u6539\u540E\u81EA\u52A8\u8FD0\u884C\u5DE5\u4F5C\u6D41..',\n 'selection_only': '\u4EC5\u9009\u533A',\n 'Queue:': '\u961F\u5217:',\n 'Set As:': '\u8BBE\u7F6E\u4E3A:',\n 'Error {0}... please contact me via Discord/Github': '\u51FA\u73B0\u9519\u8BEF {0}...\uFF0C\u8BF7\u901A\u8FC7 QQ/Github \u8054\u7CFB\u6211',\n 'Webview initialize failed. Please report to me via Discord/Github with your ComfyURL, Operate System': 'Webview \u521D\u59CB\u5316\u5931\u8D25\uFF0C\u8BF7\u901A\u8FC7 QQ/Github \u8054\u7CFB\u6211\u5E76\u9644\u4E0A\u4F60\u7684Comfy\u5730\u5740\u3001\u64CD\u4F5C\u7CFB\u7EDF',\n 'Workflow List of ComfyUI with --multi-user is only available for sponsors': '\u5E26\"--multi-user\"\u7684ComfyUI\u4EC5\u5BF9\u8D5E\u52A9\u8005\u5F00\u653E',\n 'Workflow Agent is loading...': '\u8FD0\u884C\u8F7D\u4F53\u5C1A\u5728\u52A0\u8F7D...',\n '(Page ID: {0})Queue: {1}': '(\u9875\u9762ID: {0}) \u961F\u5217\u957F\u5EA6 {1}',\n 'no suitable node to control in this workflow': '\u8FD9\u4E2A\u5DE5\u4F5C\u6D41\u4E2D\u6CA1\u6709\u80FD\u63A7\u5236\u7684\u8282\u70B9',\n \"Save\": \"\u4FDD\u5B58\",\n \"Edit\": \"\u7F16\u8F91\",\n \"Edit in ComfyUI\": \"\u5728 ComfyUI \u4E2D\u7F16\u8F91\",\n \"using browser page [{0}] for workflow running\": '\u6B63\u63A5\u7BA1\u7F51\u9875 [{0}] \u8FD0\u884C\u5DE5\u4F5C\u6D41',\n 'workflow running by hidden webview': '\u5DE5\u4F5C\u6D41\u5728\u9690\u85CF\u7684webview\u4E2D\u8FD0\u884C',\n 'Lock Image': '\u9501\u5B9A\u56FE\u50CF',\n 'Unlock Image': '\u89E3\u9501\u56FE\u50CF',\n 'search...': '\u641C\u7D22...',\n 'disabled when running in browser page': '\u63A5\u7BA1\u7F51\u9875\u65F6\u4E0D\u53EF\u7528',\n 'only supported in Photoshop': '\u4EC5\u5728 Photoshop \u4E2D\u652F\u6301',\n 'Login': '\u767B\u5F55',\n 'Invitation Code': '\u9080\u8BF7\u7801',\n 'Username': '\u7528\u6237\u540D',\n 'Password': '\u5BC6\u7801',\n 'Please input invitation code': '\u8BF7\u8F93\u5165\u9080\u8BF7\u7801',\n 'Please input username': '\u8BF7\u8F93\u5165\u7528\u6237\u540D',\n 'Please input password': '\u8BF7\u8F93\u5165\u5BC6\u7801',\n\n // photoshop connect error\n '502: Maybe the server is not running': '502: \u670D\u52A1\u5668\u53EF\u80FD\u672A\u8FD0\u884C',\n '404: Maybe SDPPP is not installed or failed to run in ComfyUI': '404: \u53EF\u80FD\u5728ComfyUI\u4E2DSDPPP\u672A\u5B89\u88C5\u6216\u8FD0\u884C\u5931\u8D25',\n '{0}. reconnecting...': '{0}. \u91CD\u8FDE\u4E2D...',\n 'disconnected to {0} failed {1}': `\u65AD\u5F00\u8FDE\u63A5 {0} \u9519\u8BEF {1}`,\n 'version mismatch, please reinstall PS plugin': '\u7248\u672C\u4E0D\u5339\u914D\uFF0C\u8BF7\u91CD\u65B0\u5B89\u88C5 PS \u63D2\u4EF6',\n 'instance type not recognized': '\u672A\u8BC6\u522B\u7684\u8F6F\u4EF6\u7C7B\u578B',\n 'Error: {0}': '\u9519\u8BEF: {0}',\n 'Verification Error': '\u9A8C\u8BC1\u9519\u8BEF',\n\n // photoshop event error\n 'document {0} not found': '\u627E\u4E0D\u5230\u6587\u6863: {0}',\n 'only layer kind \"TEXT\" is supported, invalid layer: {0}': '\u4E0D\u652F\u6301\u975E\u6587\u672C\u56FE\u5C42: {0}',\n 'create layer failed': '\u521B\u5EFA\u56FE\u5C42\u5931\u8D25',\n 'layer not found {0}': '\u627E\u4E0D\u5230\u56FE\u5C42: {0}',\n 'no linked layer for {0}': '\u6CA1\u6709\u94FE\u63A5\u56FE\u5C42: {0}',\n 'layer {0} is not a group': '\u56FE\u5C42 {0} \u4E0D\u662F\u4E00\u4E2A\u7EC4',\n 'no layer in group {0}': '\u7EC4 {0} \u4E2D\u6CA1\u6709\u56FE\u5C42',\n 'layer not found: {0}': '\u627E\u4E0D\u5230\u56FE\u5C42: {0}',\n 'No upload_name': '\u4E0A\u4F20\u63A5\u53E3\u8FD4\u56DE\u4E86\u5931\u8D25',\n 'get pixel of {0} failed': '\u83B7\u53D6\u50CF\u7D20\u5931\u8D25: {0}',\n 'merge group failed': '\u5408\u5E76\u7EC4\u5931\u8D25',\n 'invalid name: {0}': '\u975E\u6CD5\u7684\u540D\u79F0: {0}',\n 'get_layer_info: layer_identify required': 'get_layer_info: \u9700\u8981 layer_identify',\n 'invalid action: {0}': '\u65E0\u6548\u7684\u64CD\u4F5C: {0}',\n 'create document failed': '\u521B\u5EFA\u6587\u6863\u5931\u8D25',\n 'create document for preview': '\u521B\u5EFA\u9884\u89C8\u6587\u6863',\n 'resize document for preview': '\u8C03\u6574\u9884\u89C8\u6587\u6863\u5C3A\u5BF8',\n 'no first related layer in {0}': '\u7EC4 {0} \u4E2D\u6CA1\u6709\u7B2C\u4E00\u4E2A\u76F8\u5173\u56FE\u5C42',\n \"imageDataError: data length is not multiple of width * height\": \"\u56FE\u50CF\u6570\u636E\u6709\u8BEF: \u6570\u636E\u957F\u5EA6\u4E0D\u662F\u5BBD\u5EA6 * \u9AD8\u5EA6\u7684\u500D\u6570\",\n \"imageDataError: originComponents must be 1 or 3\": \"\u56FE\u50CF\u6570\u636E\u6709\u8BEF: originComponents \u5FC5\u987B\u662F 1 \u6216 3\",\n 'unexpected connection lost, please try to reconnect': '\u610F\u5916\u65AD\u5F00\u8FDE\u63A5\uFF0C\u8BF7\u5C1D\u8BD5\u91CD\u65B0\u8FDE\u63A5',\n \"Workflow list is empty, please save a workflow by Comfy's lastest UI\": '\u5DE5\u4F5C\u6D41\u5217\u8868\u4E3A\u7A7A\uFF0C\u8BF7\u5728Comfy\u7684\u65B0\u7248UI\u4E2D\u4FDD\u5B58\u4E00\u4E2A\u5DE5\u4F5C\u6D41',\n 'No opened ComfyUI pages': '\u6CA1\u6709\u5DF2\u6253\u5F00\u7684ComfyUI\u9875\u9762',\n 'comfyAPI is not initialized, maybe comfyUI is too old': '\u65E0\u6CD5\u83B7\u53D6 ComfyAPI\uFF0C\u53EF\u80FD ComfyUI \u7248\u672C\u592A\u65E7',\n 'unsupported channel counts: {0}': '\u4E0D\u652F\u6301\u7684\u901A\u9053\u6570: {0}',\n 'Timeout, Maybe the URL is wrong': '\u8D85\u65F6\uFF0C\u53EF\u80FD comfy\u5730\u5740 \u586B\u5199\u9519\u8BEF',\n 'Workflow list loading failed: {0}': '\u5DE5\u4F5C\u6D41\u5217\u8868\u52A0\u8F7D\u5931\u8D25: {0}',\n 'Please register a user in ComfyUI': '\u8BF7\u5728 ComfyUI \u4E2D\u6CE8\u518C\u4E00\u4E2A\u7528\u6237',\n 'GetSelection need Photoshop version 25+': 'GetSelection \u9700\u8981 Photoshop 25+ \u7248\u672C',\n 'Action {0} not found': 'Action {0} \u672A\u627E\u5230',\n 'Action set {0} not found': 'ActionSet {0} \u672A\u627E\u5230',\n\n // photoshop modal state\n 'create document for sent images': '\u7ED9\u53D1\u9001\u7684\u56FE\u7247\u521B\u5EFA\u6587\u6863',\n 'show sent images': '\u663E\u793A\u53D1\u9001\u7684\u56FE\u7247',\n 'fallback show sent images': '\u53D6\u6D88\u663E\u793A\u53D1\u9001\u7684\u56FE\u7247',\n \"get content of layer {0}\": \"\u83B7\u53D6\u56FE\u5C42 {0} \u7684\u5185\u5BB9\",\n 'fallback get content of layer {0}': '\u53D6\u6D88\u83B7\u53D6\u56FE\u5C42 {0} \u7684\u5185\u5BB9',\n 'get layer info': '\u83B7\u53D6\u56FE\u5C42\u4FE1\u606F',\n 'sdppp extract PSD': 'sdppp \u5BFC\u5165 PSD',\n 'sdppp get PSD': 'sdppp \u83B7\u53D6 PSD', \n 'set text to layer': '\u8BBE\u7F6E\u56FE\u5C42\u7684\u6587\u672C',\n 'run Photoshop Action': 'sdppp \u8FD0\u884C Photoshop Action',\n 'select layer': 'sdppp \u9009\u4E2D\u56FE\u5C42',\n \n // photoshop dialog/widget\n '{0} wants to extract a PSD file to Photoshop, are you sure?': '{0} \u60F3\u8981\u91CA\u653E\u4E00\u4E2A.psd\u6587\u4EF6\u5230Photoshop\uFF0C\u786E\u5B9A\u5417\uFF1F',\n 'should sdppp refuse extracting PSD to Photoshop in this session anymore?': '\u662F\u5426\u8981\u8BA9 sdppp \u62D2\u7EDD\u672C\u6B21PS\u4F1A\u8BDD\u518D\u6B21\u63A5\u53D7.psd\u91CA\u653E\u8BF7\u6C42\uFF1F',\n 'Wide Mode': '\u5BBD\u5C4F\u6A21\u5F0F',\n 'Quick Set': '\u5FEB\u901F\u8BBE\u7F6E',\n 'Selected Layer': '\u9009\u4E2D\u56FE\u5C42',\n 'Selected Layer (invert)': '\u9009\u4E2D\u56FE\u5C42(\u53CD\u5411)',\n 'Canvas': '\u753B\u5E03',\n 'Selection': '\u9009\u533A',\n 'Manual': '\u624B\u52A8\u6A21\u5F0F',\n 'Auto': '\u81EA\u52A8\u6A21\u5F0F',\n\n // about\n 'This plugin is based on sd-ppp': '\u672C\u63D2\u4EF6\u57FA\u4E8Esd-ppp\u5F00\u53D1',\n 'And follows its open source license:': '\u5E76\u9075\u5FAA\u5176\u5F00\u6E90\u534F\u8BAE\uFF1A',\n \"Cloud\": \"\u4E91\u7AEF\u63A8\u8350\",\n \"Sponsors\": \"\u8D5E\u52A9\",\n \"waiting...\": '\u865A\u4F4D\u4EE5\u5F85',\n 'Links': '\u53CB\u60C5\u94FE\u63A5',\n 'Community': '\u793E\u533A',\n 'LICENSE:': '\u8BB8\u53EF\u8BC1\uFF1A',\n 'Official Site': '\u5B98\u65B9\u7F51\u7AD9',\n\n // comfy popup\n \"upload\": \"\u4E0A\u4F20\",\n \"Simplify Workflow\": \"\u7B80\u5316\u5DE5\u4F5C\u6D41\",\n \"Photoshop\": \"Photoshop\",\n \"Photoshop plugin settings\": \"Photoshop \u63D2\u4EF6\u8BBE\u7F6E\",\n \"Photoshop plugin\": \"Photoshop \u63D2\u4EF6\",\n \"SDPPP Settings/Misc\": \"SDPPP \u8BBE\u7F6E/\u6742\u9879\",\n \"Sample .PSD for this workflow:\": \"\u793A\u4F8B.PSD\",\n \"Download Example .PSD\": \"\u4E0B\u8F7D\u793A\u4F8B.PSD\",\n \"Maximum Image Size (px):\": \"\u6700\u5927\u56FE\u50CF\u5C3A\u5BF8(px)\",\n \"Download\": \"\u4E0B\u8F7D\",\n \"Upload\": \"\u4E0A\u4F20\",\n \"Reset\": \"\u91CD\u7F6E\",\n 'Refresh': '\u5237\u65B0',\n 'Comfy URL (You can copy it to connect ComfyUI in the plugin):': 'Comfy\u5730\u5740(\u4F60\u53EF\u4EE5\u590D\u5236\u5B83\u5230\u63D2\u4EF6\u4E2D\u8FDE\u63A5ComfyUI):',\n 'use slider for number widget:': '\u6570\u5B57\u63A7\u4EF6\u4F7F\u7528\u6ED1\u5757',\n 'Photoshop is not connected': 'Photoshop \u672A\u8FDE\u63A5',\n 'select...': '\u8BF7\u9009\u62E9',\n 'click to edit': '\u70B9\u51FB\u7F16\u8F91',\n\n // comfy call error\n 'ComfyManager not found, cannot reboot': 'Comfy Manager\u672A\u5B89\u88C5\uFF0C\u65E0\u6CD5\u91CD\u542F',\n 'Failed to reboot ComfyUI': '\u91CD\u542FComfyUI\u5931\u8D25',\n}\n", "import en from './en.mjs';\nimport zhcn from './zh-cn.mjs';\n//@ts-ignore\nconst require_ = typeof require != 'undefined' ? require : undefined\n\nlet locale = 'en'\nif (typeof navigator !== 'undefined' && navigator.language) {\n locale = navigator.language == \"zh-CN\" ? 'zhcn' : 'en'\n} else if (require_) {\n locale = require_('uxp').host.uiLocale.startsWith(\"zh\") ? 'zhcn' : 'en';\n}\n\nexport type I18nKey = keyof typeof zhcn;\n\nexport default function i18n(key: keyof typeof zhcn, ...args: any[]) {\n const formatStr: string = locale == 'zhcn' ? zhcn[key] : (key in en ? (en as any)[key] : key);\n if (!formatStr) throw new Error(`i18n key not found: ${key}`);\n\n return formatStr.replace(/{(\\d+)}/g, function (match, number) {\n return typeof args[number] != 'undefined' ? args[number] : match\n });\n}\n\nexport function isValidI18nKey(key: string) {\n return key in zhcn;\n}\n\nexport function isI18nOf(key: keyof typeof zhcn, str: string) {\n return key == str || zhcn[key] == str;\n}\n\nexport function getI18nLocale() {\n return locale;\n}\n", "import React from \"react\";\n\nexport default class ActionButton extends React.Component<{\n onClick?: (...args: any[]) => any\n highlight?: boolean\n children?: React.ReactNode\n}> {\n render() {\n return (\n
\n {this.props.children}\n
\n )\n }\n}\n", "import React from \"react\";\n\nexport default class AgentIcon extends React.Component<{\n size?: number,\n onClick?: (...args: any[]) => any\n}> {\n render() {\n const size = this.props.size || 1\n return (\n
\n \n \n \n
\n )\n }\n}", "import React from \"react\";\n\nexport default class LivePaintingIcon extends React.Component<{\n size?: number,\n onClick?: (...args: any[]) => any\n}> {\n render() {\n const size = this.props.size || 1\n return (\n
\n \n \n \n \n
\n )\n }\n}", "import React from \"react\";\n\nexport default class PlayIcon extends React.Component<{\n size?: number\n}> {\n render() {\n const size = this.props.size || 1\n return (\n
\n \n \n \n
\n )\n }\n}\n", "import React from \"react\";\nimport ActionButton from \"./ActionButton\";\nimport AgentIcon from \"./icons/AgentIcon\";\nimport LivePaintingIcon from \"./icons/LivePaintingIcon\";\nimport PlayIcon from \"./icons/PlayIcon\";\nimport { useSDPPPContext, useSDPPPComfyCaller, SDPPPWebpageInstance } from \"./SDPPPInternalBridge\";\n\ninterface WebPageListItemProps {\n pageInstance: SDPPPWebpageInstance\n}\n\nconst WebPageListItem: React.FC = ({\n pageInstance\n}) => {\n const {\n autoRunning,\n setAutoRunning,\n workflowAgentSID,\n setWorkflowAgentSID,\n } = useSDPPPContext();\n const { runPage } = useSDPPPComfyCaller();\n\n const isWorkflowAgent = workflowAgentSID == pageInstance.sid;\n const isAutoRunning = autoRunning?.value == pageInstance.sid;\n\n return (\n
  • \n {\n setWorkflowAgentSID(isWorkflowAgent ? '' : pageInstance.sid)\n }}>\n
    [{pageInstance.ssid}] {pageInstance.lastError ? pageInstance.lastError?.replace('sdppp PS side error:', '') : pageInstance.title}
    \n
    \n
    \n
    \n {\n setWorkflowAgentSID(isWorkflowAgent ? '' : pageInstance.sid)\n }} />\n
    \n {\n setAutoRunning(isAutoRunning ? null : { type: 'page', value: pageInstance.sid })\n }}>\n \n \n { runPage(pageInstance.sid) }}>\n \n \n
    \n
  • \n );\n}\n\nexport default WebPageListItem;\n", "import React from \"react\";\nimport i18n from \"../../../../src/common/i18n.mjs\";\nimport WebPageListItem from \"./WebPageListItem\";\nimport { useSDPPPContext, useSDPPPWebpageList } from \"./SDPPPInternalBridge\";\n\nconst WebPageList: React.FC = () => {\n const {\n autoRunning\n } = useSDPPPContext();\n\n const { pageInstances } = useSDPPPWebpageList();\n\n return (\n <>\n
    \n

    {i18n('webpages')}

    \n
    \n {\n !pageInstances.length && {i18n(\"No opened ComfyUI pages\")}\n }\n \n {autoRunning?.type == 'page' ? {\n i18n(`auto run page [{0}] after change..`, pageInstances.find(item => item.sid == autoRunning?.value)?.title)\n } : ''}\n \n );\n};\n\nexport default WebPageList;\n", "import React from \"react\";\n\nexport default class EditIcon extends React.Component<{\n size?: number,\n onClick?: (...args: any[]) => any\n}> {\n render() {\n const size = this.props.size || 1\n return (\n
    \n \n \n \n
    \n )\n }\n}\n", "import React from \"react\";\n\nexport default class FolderIcon extends React.Component<{\n size?: number\n}> {\n render() {\n const size = this.props.size || 1\n return (\n
    \n \n \n \n
    \n )\n }\n}\n", "import React from \"react\";\nimport ActionButton from \"./ActionButton.js\";\nimport EditIcon from \"./icons/EditIcon.js\";\nimport FolderIcon from \"./icons/FolderIcon.js\";\nimport LivePaintingIcon from \"./icons/LivePaintingIcon.js\";\nimport PlayIcon from \"./icons/PlayIcon.js\";\nimport { useSDPPPContext, useSDPPPComfyCaller } from \"./SDPPPInternalBridge.js\";\n\ninterface WorkflowListItemProps {\n path: string\n isDir: boolean\n isChecked: boolean\n workflow?: {\n path: string\n error: string\n }\n\n onRun: (path: string) => Promise,\n dirname?: string,\n onDirectorySet?: (path: string) => void,\n setEditorMode: (editorMode: boolean) => void\n}\n\nconst WorkflowListItem: React.FC = ({\n path,\n isDir,\n isChecked,\n workflow,\n onRun,\n dirname,\n onDirectorySet,\n setEditorMode\n}) => {\n const {\n setAutoRunning,\n workflowAgentSID\n } = useSDPPPContext();\n const {\n openWorkflow\n } = useSDPPPComfyCaller();\n\n if (isDir) {\n return (\n
  • \n {\n if (path == '../') {\n const directoryWithoutSuffix = dirname || ''\n const lastSlashIndex = directoryWithoutSuffix.lastIndexOf('/')\n if (lastSlashIndex == -1) {\n onDirectorySet?.('')\n } else {\n onDirectorySet?.(directoryWithoutSuffix.slice(0, lastSlashIndex))\n }\n } else {\n onDirectorySet?.(path)\n }\n }}>\n \n
    {path}
    \n
    \n
  • \n );\n }\n\n if (!workflow) return null;\n\n return (\n
  • \n {\n setEditorMode(true)\n openWorkflow(workflowAgentSID, workflow.path)\n }}>\n
    \n {workflow.error ? workflow.error.replace('sdppp PS side error:', '') : workflow.path}\n
    \n
    \n
    \n
    \n {\n setEditorMode(true)\n openWorkflow(workflowAgentSID, workflow.path)\n }} />\n
    \n {\n if (!isChecked) {\n setAutoRunning({ type: 'workflow', value: path })\n } else {\n setAutoRunning(null)\n }\n }}>\n \n \n { onRun(workflow.path) }}>\n \n \n
    \n
  • \n );\n}\n\nexport default WorkflowListItem;\n", "import React from \"react\";\nimport i18n from \"../../../../src/common/i18n.mjs\";\nimport WorkflowListItem from \"./WorkflowListItem.js\";\nimport {\n useSDPPPComfyCaller, useAgentState,\n useSDPPPContext, useSDPPPWorkflowList\n} from \"./SDPPPInternalBridge.js\";\n\ninterface WorkflowListProps {\n setEditorMode: (editorMode: boolean) => void\n}\n\nconst WorkflowList: React.FC = ({ setEditorMode }) => {\n const {\n autoRunning,\n webviewAgentSID,\n workflowAgentSID,\n } = useSDPPPContext();\n\n const {\n runWorkflow,\n } = useSDPPPComfyCaller();\n\n const {\n workflows,\n workflowsError,\n currentViewingDirectory,\n setCurrentViewingDirectory,\n showingList\n } = useSDPPPWorkflowList();\n\n const {\n ssid,\n lastError,\n progress,\n executingNodeTitle,\n queueSize,\n } = useAgentState(workflowAgentSID);\n\n let statusText = '';\n let queueText = ' ';\n let hasLastError = false;\n if (workflowAgentSID) {\n if (lastError) {\n statusText += i18n('Error: {0}', lastError);\n hasLastError = true;\n } else if (progress) {\n statusText += `(${progress}% - ${executingNodeTitle}...)`;\n } else if (workflowAgentSID) {\n if (workflowAgentSID == webviewAgentSID) {\n statusText += i18n('workflow running by hidden webview');\n } else {\n statusText += i18n('using browser page [{0}] for workflow running', ssid);\n }\n }\n queueText += `(${i18n('Queue:')} ${queueSize})`;\n }\n\n let listReplacer = null;\n if (workflowsError)\n listReplacer = {workflowsError}\n\n return (\n <>\n
    \n

    {i18n('workflows')}{queueText}

    \n {statusText}\n
    \n {listReplacer ||\n
      \n {\n currentViewingDirectory ?\n { }}\n dirname={currentViewingDirectory.slice(0, -1)}\n onDirectorySet={(dirname) => {\n setCurrentViewingDirectory(dirname)\n }}\n />\n : ''\n }\n {\n showingList.map((item: { path: string, isDir: boolean }) => {\n const path = item.path;\n const workflow = workflows[path]\n const checked = autoRunning?.value == path;\n if (item.isDir) {\n return (\n {\n await runWorkflow(path);\n }}\n dirname={currentViewingDirectory.slice(0, -1)}\n onDirectorySet={(dirname) => {\n setCurrentViewingDirectory(dirname)\n }}\n />\n )\n }\n return (\n {\n await runWorkflow(path);\n }}\n />\n )\n })\n }\n
    \n }\n {autoRunning?.type == 'workflow' ? {i18n(`auto run workflow [{0}] after change..`, workflows[autoRunning?.value]?.path)} : ''}\n \n );\n};\n\nexport default WorkflowList;", "import { useSDPPPContext, Promote } from \"./SDPPPInternalBridge.js\";\nimport i18n, { isValidI18nKey } from \"../../../../src/common/i18n.mjs\";\nimport WebPageList from \"./WebPageList.js\";\nimport WorkflowList from \"./WorkflowList.js\";\nimport { useEffect, useState } from \"react\";\nimport { WorkflowEditWrap } from \"./WorkflowEditWrap.js\";\nimport type { AddressBarType, WorkflowEditPhotoshopType } from \"./SDPPPInternalBridge.js\";\n\nexport function Content({\n connectState,\n AddressBar,\n WorkflowEditPhotoshop,\n}: {\n connectState: 'connected' | 'disconnected' | 'connecting',\n AddressBar: AddressBarType,\n WorkflowEditPhotoshop: WorkflowEditPhotoshopType,\n}) {\n const [editorMode, setEditorMode] = useState(false);\n const [initAfter8s, setInitAfter8s] = useState(false);\n useEffect(() => {\n if (connectState === 'connected') {\n const timeout = setTimeout(() => {\n setInitAfter8s(true);\n }, 8000);\n return () => clearTimeout(timeout);\n } else {\n setInitAfter8s(false);\n }\n }, [connectState]);\n\n const {\n workflowAgentSID,\n webviewAgentSID,\n lastConnectErrorMessage,\n\n } = useSDPPPContext();\n\n const editorCardShowingIndex = editorMode ? 1 : 0;\n\n const [prevIsNotWebview, setPrevIsNotWebview] = useState(false);\n\n // when disconnect and the agent is not webview, set editor mode to false\n useEffect(() => {\n if (workflowAgentSID) {\n setPrevIsNotWebview(workflowAgentSID != webviewAgentSID);\n } else {\n if (prevIsNotWebview) {\n setEditorMode(false);\n }\n }\n }, [workflowAgentSID]);\n useEffect(() => {\n if (connectState === 'disconnected') {\n setEditorMode(false);\n }\n }, [connectState]);\n return (\n <>\n
    \n {\n !editorMode ?\n
    \n
    \u2B24
    \n
    \n :\n {\n setEditorMode(false);\n }}\n >\u2190\n }\n \n
    \n {\n lastConnectErrorMessage ? (\n
    \n \n {isValidI18nKey(lastConnectErrorMessage) ? i18n(lastConnectErrorMessage as any) : lastConnectErrorMessage}\n \n
    \n ) : ''\n }\n\n \n\n \n\n {\n connectState === \"connected\" &&\n
    \n
    \n
    \n {initAfter8s && !webviewAgentSID && {i18n('hidden webview load failed: {0}, please select a browser page to continue', i18n('timeout'))}}\n \n \n
    \n
    \n
    \n {editorMode && workflowAgentSID && }\n
    \n
    \n }\n \n );\n}\n\n\n", "import { useCallback, useMemo } from \"react\"\nimport i18n from \"../../../../src/common/i18n.mjs\"\nimport LivePaintingIcon from \"./icons/LivePaintingIcon\"\nimport PlayIcon from \"./icons/PlayIcon\"\nimport {\n useSDPPPComfyCaller,\n useSDPPPContext,\n useAgentState,\n} from \"./SDPPPInternalBridge\"\nimport RefreshIcon from \"./icons/RefreshIcon\"\nimport SaveIcon from \"./icons/SaveIcon\"\nimport PlayMultiIcon from \"./icons/PlayMultiIcon\"\nimport WebEditIcon from \"./icons/WebEditIcon\"\nimport CrossIcon from \"./icons/CrossIcon\"\nimport StopIcon from \"./icons/StopIcon\"\nimport CancelIcon from \"./icons/CancelIcon\"\nimport { action } from \"photoshop\";\n\n// \u72B6\u6001\u663E\u793A\u7EC4\u4EF6\nconst WorkflowStatus = () => {\n const { workflowAgentSID, autoRunning } = useSDPPPContext();\n const { lastError, progress, executingNodeTitle } = useAgentState(workflowAgentSID);\n\n return (\n
    \n {autoRunning ? {i18n('auto run workflow after change..')} : ''}\n {lastError ? {lastError} : ''}\n {executingNodeTitle ? <>\n {`${progress}% ${executingNodeTitle}...`}\n \n : ''}\n
    \n );\n};\n\n// \u4FDD\u5B58\u548C\u5237\u65B0\u6309\u94AE\u7EC4\nconst SaveButton = () => {\n const { workflowAgentSID } = useSDPPPContext();\n const { saveWorkflow, reopenWorkflow } = useSDPPPComfyCaller();\n\n const onSave = useCallback(async () => {\n await saveWorkflow(workflowAgentSID);\n }, [saveWorkflow, workflowAgentSID]);\n\n return (\n \n \n \n );\n};\nconst ClearButton = () => {\n const { workflowAgentSID } = useSDPPPContext();\n const { clearQueue } = useSDPPPComfyCaller();\n const onClear = useCallback(() => {\n clearQueue();\n }, [clearQueue]);\n\n return \n \n \n}\n\nconst RebootButton = () => {\n const { workflowAgentSID } = useSDPPPContext();\n const { reboot } = useSDPPPComfyCaller();\n const onReboot = useCallback(() => {\n reboot();\n }, [reboot]);\n\n return \u91CD\u542F\n}\n\nconst StopButton = () => {\n const { workflowAgentSID } = useSDPPPContext();\n const { interrupt } = useSDPPPComfyCaller();\n const onInterrupt = useCallback(() => {\n interrupt();\n }, [interrupt]);\n\n return \n \n \n}\nconst StopAndCancelButton = () => {\n const { interrupt } = useSDPPPComfyCaller();\n const { clearQueue } = useSDPPPComfyCaller();\n const onClearAndInterrupt = useCallback(async () => {\n await clearQueue();\n await interrupt();\n }, [clearQueue, interrupt]);\n\n return \n \n \n}\n\nconst RefreshButton = () => {\n const { workflowAgentSID } = useSDPPPContext();\n const { reopenWorkflow } = useSDPPPComfyCaller();\n const onReopen = useCallback(() => {\n reopenWorkflow(workflowAgentSID);\n }, [reopenWorkflow, workflowAgentSID]);\n\n return \n \n \n}\n\nconst PlayMultiButtons = () => {\n const { workflowAgentSID, autoRunning } = useSDPPPContext();\n const { runPage } = useSDPPPComfyCaller();\n\n return <>\n {!autoRunning ? { runPage(workflowAgentSID, 10) }}>\n \n : ''}\n {!autoRunning ? { runPage(workflowAgentSID, 3) }}>\n \n : ''}\n \n}\n\n// \u81EA\u52A8\u8FD0\u884C\u6309\u94AE\nconst AutoRunButtons = () => {\n const { workflowAgentSID, autoRunning, setAutoRunning } = useSDPPPContext();\n\n return (\n {\n if (autoRunning?.value == workflowAgentSID) {\n setAutoRunning(null);\n } else {\n setAutoRunning({\n type: 'page',\n value: workflowAgentSID\n });\n }\n }}>\n \n \n );\n};\n\n// \u7F16\u8F91\u6309\u94AE\nconst EditButton = () => {\n const { workflowAgentSID, webviewAgentSID, toggleWebviewDialog } = useSDPPPContext();\n const usingWebview = workflowAgentSID == webviewAgentSID;\n\n return (\n { toggleWebviewDialog() }}\n title={!usingWebview ? i18n('disabled when running in browser page') : i18n('Edit in ComfyUI')}\n >\n \n \n );\n};\n\n// \u8FD0\u884C\u6309\u94AE\nconst RunButton = () => {\n const { workflowAgentSID } = useSDPPPContext();\n const { runPage } = useSDPPPComfyCaller();\n\n return (\n { \n runPage(workflowAgentSID);\n }}>\n \n \n );\n};\nconst RunMultiButtons = () => {\n const { workflowAgentSID } = useSDPPPContext();\n const { runPage } = useSDPPPComfyCaller();\n\n return (\n <>\n
    { runPage(workflowAgentSID, 2) }}>x2
    \n
    { runPage(workflowAgentSID, 5) }}>x5
    \n
    { runPage(workflowAgentSID, 9) }}>x9
    \n \n )\n}\n\n// const TestButtons = () => {\n// const { interrupt, clearQueue, reboot } = useSDPPPComfyCaller();\n\n// return (\n// { reboot() }}>\n// \n// \n// )\n// }\n\nexport function WorkflowEditWrap({\n WorkflowEditPhotoshop\n}: {\n WorkflowEditPhotoshop: any,\n}) {\n const { workflowAgentSID } = useSDPPPContext();\n const { ssid, queueSize } = useAgentState(workflowAgentSID);\n\n return useMemo(() => {\n return (\n
    \n
    \n {i18n('(Page ID: {0})Queue: {1}', ssid, queueSize)}\n
    \n
    \n
    \n
    \n \n \n
    \n
    \n \n \n {/* */}\n
    \n
    \n
    \n \n {/* */}\n \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n \n \n
    \n );\n }, [ssid, queueSize]);\n}\n", "import React from \"react\";\n\nexport default class RefreshIcon extends React.Component<{\n size?: number,\n onClick?: (...args: any[]) => any\n}> {\n render() {\n const size = this.props.size || 1\n return (\n
    \n \n \n \n
    \n )\n }\n}\n", "import React from \"react\";\n\nexport default class SaveIcon extends React.Component {\n render() {\n return (\n
    \n \n \n \n \n
    \n )\n }\n}\n", "import React from \"react\";\n\nexport default class PlayMultiIcon extends React.Component<{ count: number }> {\n render() {\n return (\n
    \n \n \n \n {this.props.count}\n
    \n )\n }\n}\n", "import React from \"react\";\n\nexport default class WebEditIcon extends React.Component {\n render() {\n return (\n
    \n \n \n\n \n \n
    \n )\n }\n}\n", "import React from \"react\";\n\nexport default class CrossIcon extends React.Component<{\n size?: number,\n hollowStyle?: boolean\n}> {\n render() {\n return (\n
    \n \n \n \n \n
    \n )\n }\n}", "import React from \"react\";\n\nexport default class StopIcon extends React.Component<{\n size?: number,\n hollowStyle?: boolean\n}> {\n render() {\n return (\n
    \n \n
    \n )\n }\n}\n", "import React from \"react\";\n\nexport default class CancelIcon extends React.Component<{\n size?: number,\n}> {\n render() {\n return (\n
    \n \n {/* Single diagonal line from bottom-left to top-right */}\n \n \n {/* Circle outline */}\n \n \n
    \n )\n }\n}", "import { Content } from \"./Content.js\";\nimport { SDPPP, SDPPPProvider } from \"./SDPPPInternalBridge.js\";\n\nexport default function Main() {\n return (\n \n
    \n {\n return (\n \n )\n }}\n />\n
    \n
    \n )\n}", "import Main from \"./tsx/Main.js\";\nimport { createRoot } from \"react-dom/client\";\n\ndeclare const globalThis: any;\nglobalThis.sdppp = globalThis.sdppp || {};\nglobalThis.sdppp.renderPhotoshopPlugin = (rootElement: HTMLElement) => {\n createRoot(rootElement).render(
    );\n}\n\nconst logs: any[] = [];\nconst warningLogs: any[] = [];\nconst errorLogs: any[] = [];\nglobalThis.sdppp.getLogs = () => {\n return {\n logs,\n warningLogs,\n errorLogs\n }\n}\nglobalThis.sdppp.enableLogCapture = () => {\n console.log = (function(log) {\n return function(...args: any[]) {\n log(...args);\n logs.push(args);\n }\n })(console.log);\n\n console.warn = (function(log) {\n return function(...args: any[]) {\n log(...args);\n warningLogs.push(args);\n }\n })(console.warn);\n\n console.error = (function(log) {\n return function(...args: any[]) {\n log(...args);\n errorLogs.push(args);\n }\n })(console.error);\n}"], - "mappings": "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", + "sourcesContent": ["module.exports = window.SDPPPInternal", "module.exports = window.React", "module.exports = window.ReactJSXRuntime", "module.exports = window.ReactDOMClient", "export * from \"SDPPPInternal\";", "export default {\n 'SDPPP Get Document': 'SDPPP Get Document',\n 'SDPPP Get Layer By ID': 'SDPPP Get Layer',\n 'SDPPP Get Linked Layers': 'SDPPP Get Linked Layers',\n 'SDPPP Get Layers In Group': 'SDPPP Get Layers In Group',\n 'SDPPP Get Text From Layer': 'SDPPP Get Text From Layer',\n 'SDPPP Parse Layer Info': 'SDPPP Parse Layer Info',\n 'SDPPP Get Selection': 'SDPPP Get Selection', \n 'SDPPP Get Image From Photoshop': 'SDPPP Get Image From Photoshop',\n 'SDPPP Send Images To Photoshop': 'SDPPP Send Images To Photoshop',\n 'SDPPP Settings': 'SDPPP Settings/Misc',\n}", "export default {\n // speicial document/ layer\n '### Active Document ###': '### \u5F53\u524D\u6587\u6863 ###',\n '### The Canvas ###': '### \u6574\u4E2A\u753B\u5E03 ###',\n '### New Layer ###': '### \u65B0\u56FE\u5C42 ###',\n '### Selected Layer ###': '### \u6240\u9009\u56FE\u5C42 ###',\n '### Keep Size or Fit Canvas ###': '### \u4FDD\u6301\u5C3A\u5BF8\u6216\u9002\u5E94\u753B\u5E03 ###',\n '_SDPPP_PSD_': '_SDPPP_PSD_',\n\n // A1111 UI\n 'Save and run immediately': '\u4FDD\u5B58\u5E76\u7ACB\u5373\u6267\u884C',\n 'Close': '\u5173\u95ED',\n 'Select a {0}': `\u9009\u62E9\u4E00\u4E2A {0}`,\n\n // comfyui dialog\n 'How to use .ccx file': '\u5982\u4F55\u4F7F\u7528 .ccx \u6587\u4EF6',\n '1. If you have installed Adobe Creative Cloud': '1. \u5982\u679C\u4F60\u5DF2\u7ECF\u5B89\u88C5\u4E86 Adobe Creative Cloud', \n 'Just double click the .ccx file, it will install the plugin automatically': '\u53CC\u51FB .ccx \u6587\u4EF6\uFF0C\u5B83\u4F1A\u81EA\u52A8\u5B89\u88C5',\n \"2. If you don't have Adobe Creative Cloud\": '2. \u5982\u679C\u4F60\u6CA1\u6709 Adobe Creative Cloud',\n 'Rename .ccx to .zip and extract it into ': '\u5C06 .ccx \u91CD\u547D\u540D\u4E3A .zip \u5E76\u89E3\u538B\u5230',\n 'or': '\u6216',\n 'Photoshop directory': 'Photoshop \u5B89\u88C5\u76EE\u5F55',\n\n // comfyui error\n 'Cannot connect multiple different document widgets with same value': '\u4E0D\u80FD\u8FDE\u63A5\u591A\u4E2A\u5177\u6709\u76F8\u540C\u503C\u7684\u6587\u6863\u5C0F\u90E8\u4EF6',\n 'You can only have one SDPPP Settings node in a workflow': '\u4E00\u4E2A\u5DE5\u4F5C\u6D41\u4E2D\u53EA\u80FD\u6709\u4E00\u4E2A SDPPP Settings \u8282\u70B9',\n 'convert widget {0} failed:': '\u63A7\u4EF6{0}\u8F6C\u6362\u5931\u8D25\uFF1A',\n 'hidden webview load failed: {0}, please select a browser page to continue': '\u5185\u7F6E webview \u52A0\u8F7D\u5931\u8D25: {0}\uFF0C\u8BF7\u9009\u62E9\u4E00\u4E2A\u6D4F\u89C8\u5668\u9875\u9762\u7EE7\u7EED',\n \n // comfy node title\n 'SDPPP Get Document': 'SDPPP\u83B7\u53D6\u6587\u6863(GetDocument)',\n 'SDPPP Get Layer By ID': 'SDPPP\u83B7\u53D6\u56FE\u5C42(GetLayer)',\n 'SDPPP Get Linked Layers': 'SDPPP\u83B7\u53D6\u94FE\u63A5\u56FE\u5C42(GetLinkedLayers)',\n 'SDPPP Get Layers In Group': 'SDPPP\u83B7\u53D6\u7EC4\u4E2D\u56FE\u5C42(GetLayersInGroup)',\n 'SDPPP Get Text From Layer': 'SDPPP\u83B7\u53D6\u56FE\u5C42\u6587\u672C(GetTextFromLayer)',\n 'SDPPP Parse Layer Info': 'SDPPP\u89E3\u6790\u56FE\u5C42\u4FE1\u606F(ParseLayerInfo)',\n 'SDPPP Get Selection': 'SDPPP\u83B7\u53D6\u9009\u533A(GetSelection)', \n 'SDPPP Get Image From Photoshop': 'SDPPP\u4ECEPS\u83B7\u53D6\u56FE\u50CF(GetImageFromPhotoshop)',\n 'SDPPP Send Images To Photoshop': 'SDPPP\u53D1\u9001\u56FE\u50CF\u5230PS(SendImagesToPhotoshop)',\n 'SDPPP Send Text To Layer': 'SDPPP\u53D1\u9001\u6587\u672C\u5230\u56FE\u5C42(SendTextToLayer)',\n 'SDPPP Run Photoshop Action': 'SDPPP\u8FD0\u884CPS Action(RunPhotoshopAction)',\n\n// comfy widget/input\n 'download PS plugin (.ccx)': '\u4E0B\u8F7D Photoshop \u63D2\u4EF6 (.ccx)',\n 'current ComfyUI pageid: {0}': '\u5F53\u524D ComfyUI \u9875\u9762ID: {0}',\n 'current A1111 pageid: {0}': '\u5F53\u524D A1111 \u9875\u9762ID: {0}',\n 'document linked': '\u6587\u6863\u53C2\u6570\u5DF2\u94FE\u63A5',\n 'layer linked': '\u56FE\u5C42\u53C2\u6570\u5DF2\u94FE\u63A5',\n 'bound linked': '\u8303\u56F4\u53C2\u6570\u5DF2\u94FE\u63A5',\n 'document': '\u6587\u6863', \n 'Document': '\u6587\u6863', \n 'DOCUMENT': '\u6587\u6863', \n 'document_name': '\u6587\u6863\u540D\u5B57id',\n 'layer_nameid': '\u56FE\u5C42\u540D\u5B57id',\n 'layer_name': '\u56FE\u5C42\u540D\u5B57',\n 'layer_info': '\u56FE\u5C42\u4FE1\u606F',\n 'bound_top': '\u8303\u56F4\u4E0A\u8FB9\u8DDD',\n 'bound_left': '\u8303\u56F4\u5DE6\u8FB9\u8DDD',\n 'bound_width': '\u8303\u56F4\u5BBD\u5EA6',\n 'bound_height': '\u8303\u56F4\u9AD8\u5EA6',\n 'center_x': '\u4E2D\u5FC3\u70B9x',\n 'center_y': '\u4E2D\u5FC3\u70B9y',\n 'opacity': '\u900F\u660E\u5EA6',\n 'layer': '\u56FE\u5C42',\n 'layer_or_group': '\u56FE\u5C42(\u6216\u7EC4)',\n 'Layer_or_group': '\u56FE\u5C42(\u6216\u7EC4)',\n 'bound': '\u8303\u56F4',\n 'bounds': '\u8303\u56F4',\n 'bounds [optional]': '\u8303\u56F4[\u53EF\u9009]',\n 'boundary': '\u8303\u56F4',\n 'Boundary': '\u8303\u56F4',\n 'canvas_boundary': '\u753B\u5E03\u8303\u56F4',\n 'canvas_bound': '\u753B\u5E03\u8303\u56F4',\n 'layer_boundary': '\u56FE\u5C42\u8303\u56F4',\n 'layer_bound': '\u56FE\u5C42\u8303\u56F4',\n \"Photoshop Disconnected!\" : \"Photoshop \u672A\u8FDE\u63A5\uFF01\",\n 'rgb_out': 'RGB\u8F93\u51FA',\n 'alpha_out': 'Alpha\u8F93\u51FA',\n 'images': '\u56FE\u50CF',\n 'text': '\u6587\u672C',\n 'ID_mode': '\u7CBE\u786EID\u6A21\u5F0F',\n 'name_mode': '\u540D\u5B57\u5339\u914D\u6A21\u5F0F',\n 'select': '\u9009\u62E9',\n 'document boundary': '\u6587\u6863\u8303\u56F4',\n 'layer boundary': '\u56FE\u5C42\u8303\u56F4',\n 'selection boundary': '\u9009\u4E2D\u8303\u56F4',\n 'save .psd to this workflow': '\u4FDD\u5B58.psd\u5230\u8FD9\u4E2A\u5DE5\u4F5C\u6D41',\n 'extract saved .psd to Photoshop': '\u63D0\u53D6\u4FDD\u5B58\u7684.psd\u5230Photoshop',\n 'sample .psd': '\u793A\u4F8B.psd',\n 'mask': '\u906E\u7F69',\n 'name': '\u540D\u79F0',\n 'quality': '\u56FE\u50CF\u8D28\u91CF',\n \n // photoshop UI\n 'timeout': '\u8D85\u65F6',\n '--multi-user activated, Not Login!': '--multi-user\u5DF2\u6FC0\u6D3B\uFF0C\u4F46\u672A\u767B\u5F55\uFF01',\n 'Logout': '\u767B\u51FA',\n 'User: ': '\u7528\u6237: ',\n 'connect': '\u8FDE\u63A5',\n 'connected': '\u5DF2\u8FDE\u63A5',\n 'disconnect': '\u65AD\u5F00',\n 'disconnected': '\u5DF2\u65AD\u5F00\u8FDE\u63A5',\n 'reconnecting...': '\u91CD\u8FDE\u4E2D...', \n 'connecting': '\u8FDE\u63A5\u4E2D', \n 'webpages': '\u7F51\u9875\u5217\u8868',\n 'workflows': '\u5DE5\u4F5C\u6D41',\n 'workflow': '\u5DE5\u4F5C\u6D41',\n 'auto run page [{0}] after change..': '\u66F4\u6539\u540E\u81EA\u52A8\u8FD0\u884C\u9875\u9762 {0}..',\n 'auto run workflow [{0}] after change..': '\u66F4\u6539\u540E\u81EA\u52A8\u8FD0\u884C\u5DE5\u4F5C\u6D41 {0}..',\n 'auto run workflow after change..': '\u66F4\u6539\u540E\u81EA\u52A8\u8FD0\u884C\u5DE5\u4F5C\u6D41..',\n 'selection_only': '\u4EC5\u9009\u533A',\n 'Queue:': '\u961F\u5217:',\n 'Set As:': '\u8BBE\u7F6E\u4E3A:',\n 'Error {0}... please contact me via Discord/Github': '\u51FA\u73B0\u9519\u8BEF {0}...\uFF0C\u8BF7\u901A\u8FC7 QQ/Github \u8054\u7CFB\u6211',\n 'Webview initialize failed. Please report to me via Discord/Github with your ComfyURL, Operate System': 'Webview \u521D\u59CB\u5316\u5931\u8D25\uFF0C\u8BF7\u901A\u8FC7 QQ/Github \u8054\u7CFB\u6211\u5E76\u9644\u4E0A\u4F60\u7684Comfy\u5730\u5740\u3001\u64CD\u4F5C\u7CFB\u7EDF',\n 'Workflow List of ComfyUI with --multi-user is only available for sponsors': '\u5E26\"--multi-user\"\u7684ComfyUI\u4EC5\u5BF9\u8D5E\u52A9\u8005\u5F00\u653E',\n 'Workflow Agent is loading...': '\u8FD0\u884C\u8F7D\u4F53\u5C1A\u5728\u52A0\u8F7D...',\n '(Page ID: {0})Queue: {1}': '(\u9875\u9762ID: {0}) \u961F\u5217\u957F\u5EA6 {1}',\n 'no suitable node to control in this workflow': '\u8FD9\u4E2A\u5DE5\u4F5C\u6D41\u4E2D\u6CA1\u6709\u80FD\u63A7\u5236\u7684\u8282\u70B9',\n \"Save\": \"\u4FDD\u5B58\",\n \"Edit\": \"\u7F16\u8F91\",\n \"Edit in ComfyUI\": \"\u5728 ComfyUI \u4E2D\u7F16\u8F91\",\n \"using browser page [{0}] for workflow running\": '\u6B63\u63A5\u7BA1\u7F51\u9875 [{0}] \u8FD0\u884C\u5DE5\u4F5C\u6D41',\n 'workflow running by hidden webview': '\u5DE5\u4F5C\u6D41\u5728\u9690\u85CF\u7684webview\u4E2D\u8FD0\u884C',\n 'Lock Image': '\u9501\u5B9A\u56FE\u50CF',\n 'Unlock Image': '\u89E3\u9501\u56FE\u50CF',\n 'search...': '\u641C\u7D22...',\n 'disabled when running in browser page': '\u63A5\u7BA1\u7F51\u9875\u65F6\u4E0D\u53EF\u7528',\n 'only supported in Photoshop': '\u4EC5\u5728 Photoshop \u4E2D\u652F\u6301',\n 'Login': '\u767B\u5F55',\n 'Invitation Code': '\u9080\u8BF7\u7801',\n 'Username': '\u7528\u6237\u540D',\n 'Password': '\u5BC6\u7801',\n 'Please input invitation code': '\u8BF7\u8F93\u5165\u9080\u8BF7\u7801',\n 'Please input username': '\u8BF7\u8F93\u5165\u7528\u6237\u540D',\n 'Please input password': '\u8BF7\u8F93\u5165\u5BC6\u7801',\n\n // photoshop connect error\n '502: Maybe the server is not running': '502: \u670D\u52A1\u5668\u53EF\u80FD\u672A\u8FD0\u884C',\n '404: Maybe SDPPP is not installed or failed to run in ComfyUI': '404: \u53EF\u80FD\u5728ComfyUI\u4E2DSDPPP\u672A\u5B89\u88C5\u6216\u8FD0\u884C\u5931\u8D25',\n '{0}. reconnecting...': '{0}. \u91CD\u8FDE\u4E2D...',\n 'disconnected to {0} failed {1}': `\u65AD\u5F00\u8FDE\u63A5 {0} \u9519\u8BEF {1}`,\n 'version mismatch, please reinstall PS plugin': '\u7248\u672C\u4E0D\u5339\u914D\uFF0C\u8BF7\u91CD\u65B0\u5B89\u88C5 PS \u63D2\u4EF6',\n 'instance type not recognized': '\u672A\u8BC6\u522B\u7684\u8F6F\u4EF6\u7C7B\u578B',\n 'Error: {0}': '\u9519\u8BEF: {0}',\n 'Verification Error': '\u9A8C\u8BC1\u9519\u8BEF',\n\n // photoshop event error\n 'document {0} not found': '\u627E\u4E0D\u5230\u6587\u6863: {0}',\n 'only layer kind \"TEXT\" is supported, invalid layer: {0}': '\u4E0D\u652F\u6301\u975E\u6587\u672C\u56FE\u5C42: {0}',\n 'create layer failed': '\u521B\u5EFA\u56FE\u5C42\u5931\u8D25',\n 'layer not found {0}': '\u627E\u4E0D\u5230\u56FE\u5C42: {0}',\n 'no linked layer for {0}': '\u6CA1\u6709\u94FE\u63A5\u56FE\u5C42: {0}',\n 'layer {0} is not a group': '\u56FE\u5C42 {0} \u4E0D\u662F\u4E00\u4E2A\u7EC4',\n 'no layer in group {0}': '\u7EC4 {0} \u4E2D\u6CA1\u6709\u56FE\u5C42',\n 'layer not found: {0}': '\u627E\u4E0D\u5230\u56FE\u5C42: {0}',\n 'No upload_name': '\u4E0A\u4F20\u63A5\u53E3\u8FD4\u56DE\u4E86\u5931\u8D25',\n 'get pixel of {0} failed': '\u83B7\u53D6\u50CF\u7D20\u5931\u8D25: {0}',\n 'merge group failed': '\u5408\u5E76\u7EC4\u5931\u8D25',\n 'invalid name: {0}': '\u975E\u6CD5\u7684\u540D\u79F0: {0}',\n 'get_layer_info: layer_identify required': 'get_layer_info: \u9700\u8981 layer_identify',\n 'invalid action: {0}': '\u65E0\u6548\u7684\u64CD\u4F5C: {0}',\n 'create document failed': '\u521B\u5EFA\u6587\u6863\u5931\u8D25',\n 'create document for preview': '\u521B\u5EFA\u9884\u89C8\u6587\u6863',\n 'resize document for preview': '\u8C03\u6574\u9884\u89C8\u6587\u6863\u5C3A\u5BF8',\n 'no first related layer in {0}': '\u7EC4 {0} \u4E2D\u6CA1\u6709\u7B2C\u4E00\u4E2A\u76F8\u5173\u56FE\u5C42',\n \"imageDataError: data length is not multiple of width * height\": \"\u56FE\u50CF\u6570\u636E\u6709\u8BEF: \u6570\u636E\u957F\u5EA6\u4E0D\u662F\u5BBD\u5EA6 * \u9AD8\u5EA6\u7684\u500D\u6570\",\n \"imageDataError: originComponents must be 1 or 3\": \"\u56FE\u50CF\u6570\u636E\u6709\u8BEF: originComponents \u5FC5\u987B\u662F 1 \u6216 3\",\n 'unexpected connection lost, please try to reconnect': '\u610F\u5916\u65AD\u5F00\u8FDE\u63A5\uFF0C\u8BF7\u5C1D\u8BD5\u91CD\u65B0\u8FDE\u63A5',\n \"Workflow list is empty, please save a workflow by Comfy's lastest UI\": '\u5DE5\u4F5C\u6D41\u5217\u8868\u4E3A\u7A7A\uFF0C\u8BF7\u5728Comfy\u7684\u65B0\u7248UI\u4E2D\u4FDD\u5B58\u4E00\u4E2A\u5DE5\u4F5C\u6D41',\n 'No opened ComfyUI pages': '\u6CA1\u6709\u5DF2\u6253\u5F00\u7684ComfyUI\u9875\u9762',\n 'comfyAPI is not initialized, maybe comfyUI is too old': '\u65E0\u6CD5\u83B7\u53D6 ComfyAPI\uFF0C\u53EF\u80FD ComfyUI \u7248\u672C\u592A\u65E7',\n 'unsupported channel counts: {0}': '\u4E0D\u652F\u6301\u7684\u901A\u9053\u6570: {0}',\n 'Timeout, Maybe the URL is wrong': '\u8D85\u65F6\uFF0C\u53EF\u80FD comfy\u5730\u5740 \u586B\u5199\u9519\u8BEF',\n 'Workflow list loading failed: {0}': '\u5DE5\u4F5C\u6D41\u5217\u8868\u52A0\u8F7D\u5931\u8D25: {0}',\n 'Please register a user in ComfyUI': '\u8BF7\u5728 ComfyUI \u4E2D\u6CE8\u518C\u4E00\u4E2A\u7528\u6237',\n 'GetSelection need Photoshop version 25+': 'GetSelection \u9700\u8981 Photoshop 25+ \u7248\u672C',\n 'Action {0} not found': 'Action {0} \u672A\u627E\u5230',\n 'Action set {0} not found': 'ActionSet {0} \u672A\u627E\u5230',\n\n // photoshop modal state\n 'create document for sent images': '\u7ED9\u53D1\u9001\u7684\u56FE\u7247\u521B\u5EFA\u6587\u6863',\n 'show sent images': '\u663E\u793A\u53D1\u9001\u7684\u56FE\u7247',\n 'fallback show sent images': '\u53D6\u6D88\u663E\u793A\u53D1\u9001\u7684\u56FE\u7247',\n \"get content of layer {0}\": \"\u83B7\u53D6\u56FE\u5C42 {0} \u7684\u5185\u5BB9\",\n 'fallback get content of layer {0}': '\u53D6\u6D88\u83B7\u53D6\u56FE\u5C42 {0} \u7684\u5185\u5BB9',\n 'get layer info': '\u83B7\u53D6\u56FE\u5C42\u4FE1\u606F',\n 'sdppp extract PSD': 'sdppp \u5BFC\u5165 PSD',\n 'sdppp get PSD': 'sdppp \u83B7\u53D6 PSD', \n 'set text to layer': '\u8BBE\u7F6E\u56FE\u5C42\u7684\u6587\u672C',\n 'run Photoshop Action': 'sdppp \u8FD0\u884C Photoshop Action',\n 'select layer': 'sdppp \u9009\u4E2D\u56FE\u5C42',\n \n // photoshop dialog/widget\n '{0} wants to extract a PSD file to Photoshop, are you sure?': '{0} \u60F3\u8981\u91CA\u653E\u4E00\u4E2A.psd\u6587\u4EF6\u5230Photoshop\uFF0C\u786E\u5B9A\u5417\uFF1F',\n 'should sdppp refuse extracting PSD to Photoshop in this session anymore?': '\u662F\u5426\u8981\u8BA9 sdppp \u62D2\u7EDD\u672C\u6B21PS\u4F1A\u8BDD\u518D\u6B21\u63A5\u53D7.psd\u91CA\u653E\u8BF7\u6C42\uFF1F',\n 'Wide Mode': '\u5BBD\u5C4F\u6A21\u5F0F',\n 'Quick Set': '\u5FEB\u901F\u8BBE\u7F6E',\n 'Selected Layer': '\u9009\u4E2D\u56FE\u5C42',\n 'Selected Layer (invert)': '\u9009\u4E2D\u56FE\u5C42(\u53CD\u5411)',\n 'Canvas': '\u753B\u5E03',\n 'Selection': '\u9009\u533A',\n 'Manual': '\u624B\u52A8\u6A21\u5F0F',\n 'Auto': '\u81EA\u52A8\u6A21\u5F0F',\n\n // about\n 'This plugin is based on sd-ppp': '\u672C\u63D2\u4EF6\u57FA\u4E8Esd-ppp\u5F00\u53D1',\n 'And follows its open source license:': '\u5E76\u9075\u5FAA\u5176\u5F00\u6E90\u534F\u8BAE\uFF1A',\n \"Cloud\": \"\u4E91\u7AEF\u63A8\u8350\",\n \"Sponsors\": \"\u8D5E\u52A9\",\n \"waiting...\": '\u865A\u4F4D\u4EE5\u5F85',\n 'Links': '\u53CB\u60C5\u94FE\u63A5',\n 'Community': '\u793E\u533A',\n 'LICENSE:': '\u8BB8\u53EF\u8BC1\uFF1A',\n 'Official Site': '\u5B98\u65B9\u7F51\u7AD9',\n\n // comfy popup\n \"upload\": \"\u4E0A\u4F20\",\n \"Simplify Workflow\": \"\u7B80\u5316\u5DE5\u4F5C\u6D41\",\n \"Photoshop\": \"Photoshop\",\n \"Photoshop plugin settings\": \"Photoshop \u63D2\u4EF6\u8BBE\u7F6E\",\n \"Photoshop plugin\": \"Photoshop \u63D2\u4EF6\",\n \"SDPPP Settings/Misc\": \"SDPPP \u8BBE\u7F6E/\u6742\u9879\",\n \"Sample .PSD for this workflow:\": \"\u793A\u4F8B.PSD\",\n \"Download Example .PSD\": \"\u4E0B\u8F7D\u793A\u4F8B.PSD\",\n \"Maximum Image Size (px):\": \"\u6700\u5927\u56FE\u50CF\u5C3A\u5BF8(px)\",\n \"Download\": \"\u4E0B\u8F7D\",\n \"Upload\": \"\u4E0A\u4F20\",\n \"Reset\": \"\u91CD\u7F6E\",\n 'Refresh': '\u5237\u65B0',\n 'Comfy URL (You can copy it to connect ComfyUI in the plugin):': 'Comfy\u5730\u5740(\u4F60\u53EF\u4EE5\u590D\u5236\u5B83\u5230\u63D2\u4EF6\u4E2D\u8FDE\u63A5ComfyUI):',\n 'use slider for number widget:': '\u6570\u5B57\u63A7\u4EF6\u4F7F\u7528\u6ED1\u5757',\n 'Photoshop is not connected': 'Photoshop \u672A\u8FDE\u63A5',\n 'select...': '\u8BF7\u9009\u62E9',\n 'click to edit': '\u70B9\u51FB\u7F16\u8F91',\n\n // comfy call error\n 'ComfyManager not found, cannot reboot': 'Comfy Manager\u672A\u5B89\u88C5\uFF0C\u65E0\u6CD5\u91CD\u542F',\n 'Failed to reboot ComfyUI': '\u91CD\u542FComfyUI\u5931\u8D25',\n}\n", "import en from './en.mjs';\nimport zhcn from './zh-cn.mjs';\n//@ts-ignore\nconst require_ = typeof require != 'undefined' ? require : undefined\n\nlet locale = 'en'\nif (typeof navigator !== 'undefined' && navigator.language) {\n locale = navigator.language == \"zh-CN\" ? 'zhcn' : 'en'\n} else if (require_) {\n locale = require_('uxp').host.uiLocale.startsWith(\"zh\") ? 'zhcn' : 'en';\n}\n\nexport type I18nKey = keyof typeof zhcn;\n\nexport default function i18n(key: keyof typeof zhcn, ...args: any[]) {\n const formatStr: string = locale == 'zhcn' ? zhcn[key] : (key in en ? (en as any)[key] : key);\n if (!formatStr) throw new Error(`i18n key not found: ${key}`);\n\n return formatStr.replace(/{(\\d+)}/g, function (match, number) {\n return typeof args[number] != 'undefined' ? args[number] : match\n });\n}\n\nexport function isValidI18nKey(key: string) {\n return key in zhcn;\n}\n\nexport function isI18nOf(key: keyof typeof zhcn, str: string) {\n return key == str || zhcn[key] == str;\n}\n\nexport function getI18nLocale() {\n return locale;\n}\n", "import React from \"react\";\n\nexport default class ActionButton extends React.Component<{\n onClick?: (...args: any[]) => any\n highlight?: boolean\n children?: React.ReactNode\n}> {\n render() {\n return (\n
    \n {this.props.children}\n
    \n )\n }\n}\n", "import React from \"react\";\n\nexport default class AgentIcon extends React.Component<{\n size?: number,\n onClick?: (...args: any[]) => any\n}> {\n render() {\n const size = this.props.size || 1\n return (\n
    \n \n \n \n
    \n )\n }\n}", "import React from \"react\";\n\nexport default class LivePaintingIcon extends React.Component<{\n size?: number,\n onClick?: (...args: any[]) => any\n}> {\n render() {\n const size = this.props.size || 1\n return (\n
    \n \n \n \n \n
    \n )\n }\n}", "import React from \"react\";\n\nexport default class PlayIcon extends React.Component<{\n size?: number\n}> {\n render() {\n const size = this.props.size || 1\n return (\n
    \n \n \n \n
    \n )\n }\n}\n", "import React from \"react\";\nimport ActionButton from \"./ActionButton\";\nimport AgentIcon from \"./icons/AgentIcon\";\nimport LivePaintingIcon from \"./icons/LivePaintingIcon\";\nimport PlayIcon from \"./icons/PlayIcon\";\nimport { useSDPPPContext, useSDPPPComfyCaller, SDPPPWebpageInstance } from \"./SDPPPInternalBridge\";\n\ninterface WebPageListItemProps {\n pageInstance: SDPPPWebpageInstance\n}\n\nconst WebPageListItem: React.FC = ({\n pageInstance\n}) => {\n const {\n autoRunning,\n setAutoRunning,\n workflowAgentSID,\n setWorkflowAgentSID,\n } = useSDPPPContext();\n const { runPage } = useSDPPPComfyCaller();\n\n const isWorkflowAgent = workflowAgentSID == pageInstance.sid;\n const isAutoRunning = autoRunning?.value == pageInstance.sid;\n\n return (\n
  • \n {\n setWorkflowAgentSID(isWorkflowAgent ? '' : pageInstance.sid)\n }}>\n
    [{pageInstance.ssid}] {pageInstance.lastError ? pageInstance.lastError?.replace('sdppp PS side error:', '') : pageInstance.title}
    \n
    \n
    \n
    \n {\n setWorkflowAgentSID(isWorkflowAgent ? '' : pageInstance.sid)\n }} />\n
    \n {\n setAutoRunning(isAutoRunning ? null : { type: 'page', value: pageInstance.sid })\n }}>\n \n \n { runPage(pageInstance.sid) }}>\n \n \n
    \n
  • \n );\n}\n\nexport default WebPageListItem;\n", "import React from \"react\";\nimport i18n from \"../../../../src/common/i18n.mjs\";\nimport WebPageListItem from \"./WebPageListItem\";\nimport { useSDPPPContext, useSDPPPWebpageList } from \"./SDPPPInternalBridge\";\n\nconst WebPageList: React.FC = () => {\n const {\n autoRunning\n } = useSDPPPContext();\n\n const { pageInstances } = useSDPPPWebpageList();\n\n return (\n <>\n
    \n

    {i18n('webpages')}

    \n
    \n {\n !pageInstances.length && {i18n(\"No opened ComfyUI pages\")}\n }\n
      \n {\n pageInstances.map((item) => {\n return (\n \n )\n })\n }\n
    \n {autoRunning?.type == 'page' ? {\n i18n(`auto run page [{0}] after change..`, pageInstances.find(item => item.sid == autoRunning?.value)?.title)\n } : ''}\n \n );\n};\n\nexport default WebPageList;\n", "import React from \"react\";\n\nexport default class EditIcon extends React.Component<{\n size?: number,\n onClick?: (...args: any[]) => any\n}> {\n render() {\n const size = this.props.size || 1\n return (\n
    \n \n \n \n
    \n )\n }\n}\n", "import React from \"react\";\n\nexport default class FolderIcon extends React.Component<{\n size?: number\n}> {\n render() {\n const size = this.props.size || 1\n return (\n
    \n \n \n \n
    \n )\n }\n}\n", "import React from \"react\";\nimport ActionButton from \"./ActionButton.js\";\nimport EditIcon from \"./icons/EditIcon.js\";\nimport FolderIcon from \"./icons/FolderIcon.js\";\nimport LivePaintingIcon from \"./icons/LivePaintingIcon.js\";\nimport PlayIcon from \"./icons/PlayIcon.js\";\nimport { useSDPPPContext, useSDPPPComfyCaller } from \"./SDPPPInternalBridge.js\";\n\ninterface WorkflowListItemProps {\n path: string\n isDir: boolean\n isChecked: boolean\n workflow?: {\n path: string\n error: string\n }\n\n onRun: (path: string) => Promise,\n dirname?: string,\n onDirectorySet?: (path: string) => void,\n setEditorMode: (editorMode: boolean) => void\n}\n\nconst WorkflowListItem: React.FC = ({\n path,\n isDir,\n isChecked,\n workflow,\n onRun,\n dirname,\n onDirectorySet,\n setEditorMode\n}) => {\n const {\n setAutoRunning,\n workflowAgentSID\n } = useSDPPPContext();\n const {\n openWorkflow\n } = useSDPPPComfyCaller();\n\n if (isDir) {\n return (\n
  • \n {\n if (path == '../') {\n const directoryWithoutSuffix = dirname || ''\n const lastSlashIndex = directoryWithoutSuffix.lastIndexOf('/')\n if (lastSlashIndex == -1) {\n onDirectorySet?.('')\n } else {\n onDirectorySet?.(directoryWithoutSuffix.slice(0, lastSlashIndex))\n }\n } else {\n onDirectorySet?.(path)\n }\n }}>\n \n
    {path}
    \n
    \n
  • \n );\n }\n\n if (!workflow) return null;\n\n return (\n
  • \n {\n setEditorMode(true)\n openWorkflow(workflowAgentSID, workflow.path)\n }}>\n
    \n {workflow.error ? workflow.error.replace('sdppp PS side error:', '') : workflow.path}\n
    \n
    \n
    \n
    \n {\n setEditorMode(true)\n openWorkflow(workflowAgentSID, workflow.path)\n }} />\n
    \n {\n if (!isChecked) {\n setAutoRunning({ type: 'workflow', value: path })\n } else {\n setAutoRunning(null)\n }\n }}>\n \n \n { onRun(workflow.path) }}>\n \n \n
    \n
  • \n );\n}\n\nexport default WorkflowListItem;\n", "import React from \"react\";\nimport i18n from \"../../../../src/common/i18n.mjs\";\nimport WorkflowListItem from \"./WorkflowListItem.js\";\nimport {\n useSDPPPComfyCaller, useAgentState,\n useSDPPPContext, useSDPPPWorkflowList\n} from \"./SDPPPInternalBridge.js\";\n\ninterface WorkflowListProps {\n setEditorMode: (editorMode: boolean) => void\n}\n\nconst WorkflowList: React.FC = ({ setEditorMode }) => {\n const {\n autoRunning,\n webviewAgentSID,\n workflowAgentSID,\n } = useSDPPPContext();\n\n const {\n runWorkflow,\n } = useSDPPPComfyCaller();\n\n const {\n workflows,\n workflowsError,\n currentViewingDirectory,\n setCurrentViewingDirectory,\n showingList\n } = useSDPPPWorkflowList();\n\n const {\n ssid,\n lastError,\n progress,\n executingNodeTitle,\n queueSize,\n } = useAgentState(workflowAgentSID);\n\n let statusText = '';\n let queueText = ' ';\n let hasLastError = false;\n if (workflowAgentSID) {\n if (lastError) {\n statusText += i18n('Error: {0}', lastError);\n hasLastError = true;\n } else if (progress) {\n statusText += `(${progress}% - ${executingNodeTitle}...)`;\n } else if (workflowAgentSID) {\n if (workflowAgentSID == webviewAgentSID) {\n statusText += i18n('workflow running by hidden webview');\n } else {\n statusText += i18n('using browser page [{0}] for workflow running', ssid);\n }\n }\n queueText += `(${i18n('Queue:')} ${queueSize})`;\n }\n\n let listReplacer = null;\n if (workflowsError)\n listReplacer = {workflowsError}\n\n return (\n <>\n
    \n

    {i18n('workflows')}{queueText}

    \n {statusText}\n
    \n {listReplacer ||\n
      \n {\n currentViewingDirectory ?\n { }}\n dirname={currentViewingDirectory.slice(0, -1)}\n onDirectorySet={(dirname) => {\n setCurrentViewingDirectory(dirname)\n }}\n />\n : ''\n }\n {\n showingList.map((item: { path: string, isDir: boolean }) => {\n const path = item.path;\n const workflow = workflows[path]\n const checked = autoRunning?.value == path;\n if (item.isDir) {\n return (\n {\n await runWorkflow(path);\n }}\n dirname={currentViewingDirectory.slice(0, -1)}\n onDirectorySet={(dirname) => {\n setCurrentViewingDirectory(dirname)\n }}\n />\n )\n }\n return (\n {\n await runWorkflow(path);\n }}\n />\n )\n })\n }\n
    \n }\n {autoRunning?.type == 'workflow' ? {i18n(`auto run workflow [{0}] after change..`, workflows[autoRunning?.value]?.path)} : ''}\n \n );\n};\n\nexport default WorkflowList;", "import { useSDPPPContext, Promote, Auths } from \"./SDPPPInternalBridge.js\";\nimport i18n, { isValidI18nKey } from \"../../../../src/common/i18n.mjs\";\nimport WebPageList from \"./WebPageList.js\";\nimport WorkflowList from \"./WorkflowList.js\";\nimport { useEffect, useState } from \"react\";\nimport { WorkflowEditWrap } from \"./WorkflowEditWrap.js\";\nimport type { AddressBarType, WorkflowEditPhotoshopType } from \"./SDPPPInternalBridge.js\";\n\nexport function Content({\n connectState,\n AddressBar,\n WorkflowEditPhotoshop,\n}: {\n connectState: 'connected' | 'disconnected' | 'connecting',\n AddressBar: AddressBarType,\n WorkflowEditPhotoshop: WorkflowEditPhotoshopType,\n}) {\n const [editorMode, setEditorMode] = useState(false);\n const [initAfter8s, setInitAfter8s] = useState(false);\n useEffect(() => {\n if (connectState === 'connected') {\n const timeout = setTimeout(() => {\n setInitAfter8s(true);\n }, 8000);\n return () => clearTimeout(timeout);\n } else {\n setInitAfter8s(false);\n }\n }, [connectState]);\n\n const {\n workflowAgentSID,\n webviewAgentSID,\n lastConnectErrorMessage,\n\n } = useSDPPPContext();\n\n const editorCardShowingIndex = editorMode ? 1 : 0;\n\n const [prevIsNotWebview, setPrevIsNotWebview] = useState(false);\n\n // when disconnect and the agent is not webview, set editor mode to false\n useEffect(() => {\n if (workflowAgentSID) {\n setPrevIsNotWebview(workflowAgentSID != webviewAgentSID);\n } else {\n if (prevIsNotWebview) {\n setEditorMode(false);\n }\n }\n }, [workflowAgentSID]);\n useEffect(() => {\n if (connectState === 'disconnected') {\n setEditorMode(false);\n }\n }, [connectState]);\n return (\n <>\n \n
    \n {\n !editorMode ?\n
    \n
    \u2B24
    \n
    \n :\n {\n setEditorMode(false);\n }}\n >\u2190\n }\n \n
    \n {\n lastConnectErrorMessage ? (\n
    \n \n {isValidI18nKey(lastConnectErrorMessage) ? i18n(lastConnectErrorMessage as any) : lastConnectErrorMessage}\n \n
    \n ) : ''\n }\n\n \n\n \n\n {\n connectState === \"connected\" &&\n
    \n
    \n
    \n {initAfter8s && !webviewAgentSID && {i18n('hidden webview load failed: {0}, please select a browser page to continue', i18n('timeout'))}}\n \n \n
    \n
    \n
    \n {editorMode && workflowAgentSID && }\n
    \n
    \n }\n \n );\n}\n\n\n", "import { useCallback, useMemo } from \"react\"\nimport i18n from \"../../../../src/common/i18n.mjs\"\nimport LivePaintingIcon from \"./icons/LivePaintingIcon\"\nimport PlayIcon from \"./icons/PlayIcon\"\nimport {\n useSDPPPComfyCaller,\n useSDPPPContext,\n useAgentState,\n} from \"./SDPPPInternalBridge\"\nimport RefreshIcon from \"./icons/RefreshIcon\"\nimport SaveIcon from \"./icons/SaveIcon\"\nimport PlayMultiIcon from \"./icons/PlayMultiIcon\"\nimport WebEditIcon from \"./icons/WebEditIcon\"\nimport CrossIcon from \"./icons/CrossIcon\"\nimport StopIcon from \"./icons/StopIcon\"\nimport CancelIcon from \"./icons/CancelIcon\"\nimport { action } from \"photoshop\";\n\n// \u72B6\u6001\u663E\u793A\u7EC4\u4EF6\nconst WorkflowStatus = () => {\n const { workflowAgentSID, autoRunning } = useSDPPPContext();\n const { lastError, progress, executingNodeTitle } = useAgentState(workflowAgentSID);\n\n return (\n
    \n {autoRunning ? {i18n('auto run workflow after change..')} : ''}\n {lastError ? {lastError} : ''}\n {executingNodeTitle ? <>\n {`${progress}% ${executingNodeTitle}...`}\n \n : ''}\n
    \n );\n};\n\n// \u4FDD\u5B58\u548C\u5237\u65B0\u6309\u94AE\u7EC4\nconst SaveButton = () => {\n const { workflowAgentSID } = useSDPPPContext();\n const { saveWorkflow, reopenWorkflow } = useSDPPPComfyCaller();\n\n const onSave = useCallback(async () => {\n await saveWorkflow(workflowAgentSID);\n }, [saveWorkflow, workflowAgentSID]);\n\n return (\n \n \n \n );\n};\nconst ClearButton = () => {\n const { workflowAgentSID } = useSDPPPContext();\n const { clearQueue } = useSDPPPComfyCaller();\n const onClear = useCallback(() => {\n clearQueue();\n }, [clearQueue]);\n\n return \n \n \n}\n\nconst RebootButton = () => {\n const { workflowAgentSID } = useSDPPPContext();\n const { reboot } = useSDPPPComfyCaller();\n const onReboot = useCallback(() => {\n reboot();\n }, [reboot]);\n\n return \u91CD\u542F\n}\n\nconst StopButton = () => {\n const { workflowAgentSID } = useSDPPPContext();\n const { interrupt } = useSDPPPComfyCaller();\n const onInterrupt = useCallback(() => {\n interrupt();\n }, [interrupt]);\n\n return \n \n \n}\nconst StopAndCancelButton = () => {\n const { interrupt } = useSDPPPComfyCaller();\n const { clearQueue } = useSDPPPComfyCaller();\n const onClearAndInterrupt = useCallback(async () => {\n await clearQueue();\n await interrupt();\n }, [clearQueue, interrupt]);\n\n return \n \n \n}\n\nconst RefreshButton = () => {\n const { workflowAgentSID } = useSDPPPContext();\n const { reopenWorkflow } = useSDPPPComfyCaller();\n const onReopen = useCallback(() => {\n reopenWorkflow(workflowAgentSID);\n }, [reopenWorkflow, workflowAgentSID]);\n\n return \n \n \n}\n\nconst PlayMultiButtons = () => {\n const { workflowAgentSID, autoRunning } = useSDPPPContext();\n const { runPage } = useSDPPPComfyCaller();\n\n return <>\n {!autoRunning ? { runPage(workflowAgentSID, 10) }}>\n \n : ''}\n {!autoRunning ? { runPage(workflowAgentSID, 3) }}>\n \n : ''}\n \n}\n\n// \u81EA\u52A8\u8FD0\u884C\u6309\u94AE\nconst AutoRunButtons = () => {\n const { workflowAgentSID, autoRunning, setAutoRunning } = useSDPPPContext();\n\n return (\n {\n if (autoRunning?.value == workflowAgentSID) {\n setAutoRunning(null);\n } else {\n setAutoRunning({\n type: 'page',\n value: workflowAgentSID\n });\n }\n }}>\n \n \n );\n};\n\n// \u7F16\u8F91\u6309\u94AE\nconst EditButton = () => {\n const { workflowAgentSID, webviewAgentSID, toggleWebviewDialog } = useSDPPPContext();\n const usingWebview = workflowAgentSID == webviewAgentSID;\n\n return (\n { toggleWebviewDialog() }}\n title={!usingWebview ? i18n('disabled when running in browser page') : i18n('Edit in ComfyUI')}\n >\n \n \n );\n};\n\n// \u8FD0\u884C\u6309\u94AE\nconst RunButton = () => {\n const { workflowAgentSID } = useSDPPPContext();\n const { runPage } = useSDPPPComfyCaller();\n\n return (\n { \n runPage(workflowAgentSID);\n }}>\n \n \n );\n};\nconst RunMultiButtons = () => {\n const { workflowAgentSID } = useSDPPPContext();\n const { runPage } = useSDPPPComfyCaller();\n\n return (\n <>\n
    { runPage(workflowAgentSID, 2) }}>x2
    \n
    { runPage(workflowAgentSID, 5) }}>x5
    \n
    { runPage(workflowAgentSID, 9) }}>x9
    \n \n )\n}\n\n// const TestButtons = () => {\n// const { interrupt, clearQueue, reboot } = useSDPPPComfyCaller();\n\n// return (\n// { reboot() }}>\n// \n// \n// )\n// }\n\nexport function WorkflowEditWrap({\n WorkflowEditPhotoshop\n}: {\n WorkflowEditPhotoshop: any,\n}) {\n const { workflowAgentSID } = useSDPPPContext();\n const { ssid, queueSize } = useAgentState(workflowAgentSID);\n\n return useMemo(() => {\n return (\n
    \n
    \n {i18n('(Page ID: {0})Queue: {1}', ssid, queueSize)}\n
    \n
    \n
    \n
    \n \n \n
    \n
    \n \n \n {/* */}\n
    \n
    \n
    \n \n {/* */}\n \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n \n \n
    \n );\n }, [ssid, queueSize]);\n}\n", "import React from \"react\";\n\nexport default class RefreshIcon extends React.Component<{\n size?: number,\n onClick?: (...args: any[]) => any\n}> {\n render() {\n const size = this.props.size || 1\n return (\n
    \n \n \n \n
    \n )\n }\n}\n", "import React from \"react\";\n\nexport default class SaveIcon extends React.Component {\n render() {\n return (\n
    \n \n \n \n \n
    \n )\n }\n}\n", "import React from \"react\";\n\nexport default class PlayMultiIcon extends React.Component<{ count: number }> {\n render() {\n return (\n
    \n \n \n \n {this.props.count}\n
    \n )\n }\n}\n", "import React from \"react\";\n\nexport default class WebEditIcon extends React.Component {\n render() {\n return (\n
    \n \n \n\n \n \n
    \n )\n }\n}\n", "import React from \"react\";\n\nexport default class CrossIcon extends React.Component<{\n size?: number,\n hollowStyle?: boolean\n}> {\n render() {\n return (\n
    \n \n \n \n \n
    \n )\n }\n}", "import React from \"react\";\n\nexport default class StopIcon extends React.Component<{\n size?: number,\n hollowStyle?: boolean\n}> {\n render() {\n return (\n
    \n \n
    \n )\n }\n}\n", "import React from \"react\";\n\nexport default class CancelIcon extends React.Component<{\n size?: number,\n}> {\n render() {\n return (\n
    \n \n {/* Single diagonal line from bottom-left to top-right */}\n \n \n {/* Circle outline */}\n \n \n
    \n )\n }\n}", "import { Content } from \"./Content.js\";\nimport { SDPPP, SDPPPProvider } from \"./SDPPPInternalBridge.js\";\n\nexport default function Main() {\n return (\n \n
    \n {\n return (\n \n )\n }}\n />\n
    \n
    \n )\n}", "import Main from \"./tsx/Main.js\";\nimport { createRoot } from \"react-dom/client\";\n\ndeclare const globalThis: any;\nglobalThis.sdppp = globalThis.sdppp || {};\nglobalThis.sdppp.renderPhotoshopPlugin = (rootElement: HTMLElement) => {\n createRoot(rootElement).render(
    );\n}\n"], + "mappings": "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", "names": ["React", "import_react", "import_jsx_runtime", "React", "import_react", "import_jsx_runtime", "React", "import_react", "import_jsx_runtime", "React", "import_jsx_runtime", "import_jsx_runtime", "import_react", "import_jsx_runtime", "React", "import_react", "import_jsx_runtime", "React", "import_jsx_runtime", "import_jsx_runtime", "path", "import_react", "import_react", "import_react", "import_jsx_runtime", "React", "import_react", "import_jsx_runtime", "React", "import_react", "import_jsx_runtime", "React", "import_react", "import_jsx_runtime", "React", "import_react", "import_jsx_runtime", "React", "import_react", "import_jsx_runtime", "React", "import_react", "import_jsx_runtime", "React", "import_jsx_runtime", "import_jsx_runtime", "import_jsx_runtime", "import_jsx_runtime"] } diff --git a/plugins/photoshop/dist/photoshop-internal.js b/plugins/photoshop/dist/photoshop-internal.js index 9d0d7bc..77fe3ae 100644 --- a/plugins/photoshop/dist/photoshop-internal.js +++ b/plugins/photoshop/dist/photoshop-internal.js @@ -640,6 +640,472 @@ } }); + // node_modules/ms/index.js + var require_ms = __commonJS({ + "node_modules/ms/index.js"(exports, module) { + "use strict"; + var s = 1e3; + var m = s * 60; + var h = m * 60; + var d = h * 24; + var w = d * 7; + var y = d * 365.25; + module.exports = function(val, options) { + options = options || {}; + var type3 = typeof val; + if (type3 === "string" && val.length > 0) { + return parse(val); + } else if (type3 === "number" && isFinite(val)) { + return options.long ? fmtLong(val) : fmtShort(val); + } + throw new Error( + "val is not a non-empty string or a valid number. val=" + JSON.stringify(val) + ); + }; + function parse(str) { + str = String(str); + if (str.length > 100) { + return; + } + var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec( + str + ); + if (!match) { + return; + } + var n = parseFloat(match[1]); + var type3 = (match[2] || "ms").toLowerCase(); + switch (type3) { + case "years": + case "year": + case "yrs": + case "yr": + case "y": + return n * y; + case "weeks": + case "week": + case "w": + return n * w; + case "days": + case "day": + case "d": + return n * d; + case "hours": + case "hour": + case "hrs": + case "hr": + case "h": + return n * h; + case "minutes": + case "minute": + case "mins": + case "min": + case "m": + return n * m; + case "seconds": + case "second": + case "secs": + case "sec": + case "s": + return n * s; + case "milliseconds": + case "millisecond": + case "msecs": + case "msec": + case "ms": + return n; + default: + return void 0; + } + } + function fmtShort(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d) { + return Math.round(ms / d) + "d"; + } + if (msAbs >= h) { + return Math.round(ms / h) + "h"; + } + if (msAbs >= m) { + return Math.round(ms / m) + "m"; + } + if (msAbs >= s) { + return Math.round(ms / s) + "s"; + } + return ms + "ms"; + } + function fmtLong(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d) { + return plural(ms, msAbs, d, "day"); + } + if (msAbs >= h) { + return plural(ms, msAbs, h, "hour"); + } + if (msAbs >= m) { + return plural(ms, msAbs, m, "minute"); + } + if (msAbs >= s) { + return plural(ms, msAbs, s, "second"); + } + return ms + " ms"; + } + function plural(ms, msAbs, n, name) { + var isPlural = msAbs >= n * 1.5; + return Math.round(ms / n) + " " + name + (isPlural ? "s" : ""); + } + } + }); + + // node_modules/debug/src/common.js + var require_common = __commonJS({ + "node_modules/debug/src/common.js"(exports, module) { + "use strict"; + function setup(env) { + createDebug.debug = createDebug; + createDebug.default = createDebug; + createDebug.coerce = coerce; + createDebug.disable = disable; + createDebug.enable = enable; + createDebug.enabled = enabled; + createDebug.humanize = require_ms(); + createDebug.destroy = destroy; + Object.keys(env).forEach((key) => { + createDebug[key] = env[key]; + }); + createDebug.names = []; + createDebug.skips = []; + createDebug.formatters = {}; + function selectColor(namespace) { + let hash = 0; + for (let i = 0; i < namespace.length; i++) { + hash = (hash << 5) - hash + namespace.charCodeAt(i); + hash |= 0; + } + return createDebug.colors[Math.abs(hash) % createDebug.colors.length]; + } + createDebug.selectColor = selectColor; + function createDebug(namespace) { + let prevTime; + let enableOverride = null; + let namespacesCache; + let enabledCache; + function debug3(...args) { + if (!debug3.enabled) { + return; + } + const self2 = debug3; + const curr = Number(/* @__PURE__ */ new Date()); + const ms = curr - (prevTime || curr); + self2.diff = ms; + self2.prev = prevTime; + self2.curr = curr; + prevTime = curr; + args[0] = createDebug.coerce(args[0]); + if (typeof args[0] !== "string") { + args.unshift("%O"); + } + let index = 0; + args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => { + if (match === "%%") { + return "%"; + } + index++; + const formatter = createDebug.formatters[format]; + if (typeof formatter === "function") { + const val = args[index]; + match = formatter.call(self2, val); + args.splice(index, 1); + index--; + } + return match; + }); + createDebug.formatArgs.call(self2, args); + const logFn = self2.log || createDebug.log; + logFn.apply(self2, args); + } + debug3.namespace = namespace; + debug3.useColors = createDebug.useColors(); + debug3.color = createDebug.selectColor(namespace); + debug3.extend = extend; + debug3.destroy = createDebug.destroy; + Object.defineProperty(debug3, "enabled", { + enumerable: true, + configurable: false, + get: () => { + if (enableOverride !== null) { + return enableOverride; + } + if (namespacesCache !== createDebug.namespaces) { + namespacesCache = createDebug.namespaces; + enabledCache = createDebug.enabled(namespace); + } + return enabledCache; + }, + set: (v) => { + enableOverride = v; + } + }); + if (typeof createDebug.init === "function") { + createDebug.init(debug3); + } + return debug3; + } + function extend(namespace, delimiter) { + const newDebug = createDebug(this.namespace + (typeof delimiter === "undefined" ? ":" : delimiter) + namespace); + newDebug.log = this.log; + return newDebug; + } + function enable(namespaces) { + createDebug.save(namespaces); + createDebug.namespaces = namespaces; + createDebug.names = []; + createDebug.skips = []; + const split = (typeof namespaces === "string" ? namespaces : "").trim().replace(" ", ",").split(",").filter(Boolean); + for (const ns of split) { + if (ns[0] === "-") { + createDebug.skips.push(ns.slice(1)); + } else { + createDebug.names.push(ns); + } + } + } + function matchesTemplate(search, template) { + let searchIndex = 0; + let templateIndex = 0; + let starIndex = -1; + let matchIndex = 0; + while (searchIndex < search.length) { + if (templateIndex < template.length && (template[templateIndex] === search[searchIndex] || template[templateIndex] === "*")) { + if (template[templateIndex] === "*") { + starIndex = templateIndex; + matchIndex = searchIndex; + templateIndex++; + } else { + searchIndex++; + templateIndex++; + } + } else if (starIndex !== -1) { + templateIndex = starIndex + 1; + matchIndex++; + searchIndex = matchIndex; + } else { + return false; + } + } + while (templateIndex < template.length && template[templateIndex] === "*") { + templateIndex++; + } + return templateIndex === template.length; + } + function disable() { + const namespaces = [ + ...createDebug.names, + ...createDebug.skips.map((namespace) => "-" + namespace) + ].join(","); + createDebug.enable(""); + return namespaces; + } + function enabled(name) { + for (const skip of createDebug.skips) { + if (matchesTemplate(name, skip)) { + return false; + } + } + for (const ns of createDebug.names) { + if (matchesTemplate(name, ns)) { + return true; + } + } + return false; + } + function coerce(val) { + if (val instanceof Error) { + return val.stack || val.message; + } + return val; + } + function destroy() { + console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."); + } + createDebug.enable(createDebug.load()); + return createDebug; + } + module.exports = setup; + } + }); + + // node_modules/debug/src/browser.js + var require_browser = __commonJS({ + "node_modules/debug/src/browser.js"(exports, module) { + "use strict"; + exports.formatArgs = formatArgs; + exports.save = save; + exports.load = load; + exports.useColors = useColors; + exports.storage = localstorage(); + exports.destroy = /* @__PURE__ */ (() => { + let warned = false; + return () => { + if (!warned) { + warned = true; + console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."); + } + }; + })(); + exports.colors = [ + "#0000CC", + "#0000FF", + "#0033CC", + "#0033FF", + "#0066CC", + "#0066FF", + "#0099CC", + "#0099FF", + "#00CC00", + "#00CC33", + "#00CC66", + "#00CC99", + "#00CCCC", + "#00CCFF", + "#3300CC", + "#3300FF", + "#3333CC", + "#3333FF", + "#3366CC", + "#3366FF", + "#3399CC", + "#3399FF", + "#33CC00", + "#33CC33", + "#33CC66", + "#33CC99", + "#33CCCC", + "#33CCFF", + "#6600CC", + "#6600FF", + "#6633CC", + "#6633FF", + "#66CC00", + "#66CC33", + "#9900CC", + "#9900FF", + "#9933CC", + "#9933FF", + "#99CC00", + "#99CC33", + "#CC0000", + "#CC0033", + "#CC0066", + "#CC0099", + "#CC00CC", + "#CC00FF", + "#CC3300", + "#CC3333", + "#CC3366", + "#CC3399", + "#CC33CC", + "#CC33FF", + "#CC6600", + "#CC6633", + "#CC9900", + "#CC9933", + "#CCCC00", + "#CCCC33", + "#FF0000", + "#FF0033", + "#FF0066", + "#FF0099", + "#FF00CC", + "#FF00FF", + "#FF3300", + "#FF3333", + "#FF3366", + "#FF3399", + "#FF33CC", + "#FF33FF", + "#FF6600", + "#FF6633", + "#FF9900", + "#FF9933", + "#FFCC00", + "#FFCC33" + ]; + function useColors() { + if (typeof window !== "undefined" && window.process && (window.process.type === "renderer" || window.process.__nwjs)) { + return true; + } + if (typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) { + return false; + } + let m; + return typeof document !== "undefined" && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance || // Is firebug? http://stackoverflow.com/a/398120/376773 + typeof window !== "undefined" && window.console && (window.console.firebug || window.console.exception && window.console.table) || // Is firefox >= v31? + // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages + typeof navigator !== "undefined" && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)) && parseInt(m[1], 10) >= 31 || // Double check webkit in userAgent just in case we are in a worker + typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/); + } + function formatArgs(args) { + args[0] = (this.useColors ? "%c" : "") + this.namespace + (this.useColors ? " %c" : " ") + args[0] + (this.useColors ? "%c " : " ") + "+" + module.exports.humanize(this.diff); + if (!this.useColors) { + return; + } + const c = "color: " + this.color; + args.splice(1, 0, c, "color: inherit"); + let index = 0; + let lastC = 0; + args[0].replace(/%[a-zA-Z%]/g, (match) => { + if (match === "%%") { + return; + } + index++; + if (match === "%c") { + lastC = index; + } + }); + args.splice(lastC, 0, c); + } + exports.log = console.debug || console.log || (() => { + }); + function save(namespaces) { + try { + if (namespaces) { + exports.storage.setItem("debug", namespaces); + } else { + exports.storage.removeItem("debug"); + } + } catch (error) { + } + } + function load() { + let r; + try { + r = exports.storage.getItem("debug"); + } catch (error) { + } + if (!r && typeof process !== "undefined" && "env" in process) { + r = process.env.DEBUG; + } + return r; + } + function localstorage() { + try { + return localStorage; + } catch (error) { + } + } + module.exports = require_common()(exports); + var { formatters } = module.exports; + formatters.j = function(v) { + try { + return JSON.stringify(v); + } catch (error) { + return "[UnexpectedJSONParseError]: " + error.message; + } + }; + } + }); + // node_modules/chai/chai.js function isErrorInstance(obj) { return obj instanceof Error || Object.prototype.toString.call(obj) === "[object Error]"; @@ -8317,7 +8783,7 @@ ].join(":"); return [d2.getDate(), months[d2.getMonth()], time].join(" "); } - function log() { + function log2() { console.log("%s - %s", timestamp(), format$1.apply(null, arguments)); } function _extend(origin, add) { @@ -8335,7 +8801,7 @@ var _polyfillNode_util = { inherits: inherits$3, _extend, - log, + log: log2, isBuffer: isBuffer$1, isPrimitive: isPrimitive2, isFunction, @@ -8377,7 +8843,7 @@ isFunction, isPrimitive: isPrimitive2, isBuffer: isBuffer$1, - log, + log: log2, inherits: inherits$3, _extend, "default": _polyfillNode_util @@ -14024,11 +14490,11 @@ let enableOverride = null; let namespacesCache; let enabledCache; - function debug2(...args) { - if (!debug2.enabled) { + function debug4(...args) { + if (!debug4.enabled) { return; } - const self2 = debug2; + const self2 = debug4; const curr = Number(/* @__PURE__ */ new Date()); const ms2 = curr - (prevTime || curr); self2.diff = ms2; @@ -14058,12 +14524,12 @@ const logFn = self2.log || createDebug.log; logFn.apply(self2, args); } - debug2.namespace = namespace; - debug2.useColors = createDebug.useColors(); - debug2.color = createDebug.selectColor(namespace); - debug2.extend = extend; - debug2.destroy = createDebug.destroy; - Object.defineProperty(debug2, "enabled", { + debug4.namespace = namespace; + debug4.useColors = createDebug.useColors(); + debug4.color = createDebug.selectColor(namespace); + debug4.extend = extend; + debug4.destroy = createDebug.destroy; + Object.defineProperty(debug4, "enabled", { enumerable: true, configurable: false, get: () => { @@ -14081,9 +14547,9 @@ } }); if (typeof createDebug.init === "function") { - createDebug.init(debug2); + createDebug.init(debug4); } - return debug2; + return debug4; } function extend(namespace, delimiter2) { const newDebug = createDebug(this.namespace + (typeof delimiter2 === "undefined" ? ":" : delimiter2) + namespace); @@ -14949,7 +15415,7 @@ inherits: inherits2, isString: isString2 } = utils$3; - const debug2 = browser.exports("mocha:suite"); + const debug4 = browser.exports("mocha:suite"); const milliseconds2 = ms$1; const errors2 = errors$2; const { MOCHA_ID_PROP_NAME: MOCHA_ID_PROP_NAME2 } = utilsConstants; @@ -15011,7 +15477,7 @@ }; Suite2.prototype.clone = function() { var suite2 = new Suite2(this.title); - debug2("clone"); + debug4("clone"); suite2.ctx = this.ctx; suite2.root = this.root; suite2.timeout(this.timeout()); @@ -15030,7 +15496,7 @@ var INT_MAX = Math.pow(2, 31) - 1; var range = [0, INT_MAX]; ms2 = clamp(ms2, range); - debug2("timeout %d", ms2); + debug4("timeout %d", ms2); this._timeout = parseInt(ms2, 10); return this; }; @@ -15038,7 +15504,7 @@ if (!arguments.length) { return this._retries; } - debug2("retries %d", n); + debug4("retries %d", n); this._retries = parseInt(n, 10) || 0; return this; }; @@ -15049,7 +15515,7 @@ if (typeof ms2 === "string") { ms2 = milliseconds2(ms2); } - debug2("slow %d", ms2); + debug4("slow %d", ms2); this._slow = ms2; return this; }; @@ -15057,7 +15523,7 @@ if (!arguments.length) { return this._bail; } - debug2("bail %s", bail); + debug4("bail %s", bail); this._bail = bail; return this; }; @@ -15329,7 +15795,7 @@ var EventEmitter = require$$0.EventEmitter; var Pending = pending; var utils$1 = utils$3; - var debug = browser.exports("mocha:runner"); + var debug3 = browser.exports("mocha:runner"); var Runnable$1 = runnable; var Suite$2 = suite.exports; var HOOK_TYPE_BEFORE_EACH = Suite$2.constants.HOOK_TYPE_BEFORE_EACH; @@ -15361,39 +15827,7 @@ ]; var constants$1 = utils$1.defineConstants( /** - * {@link Runner}-related constants. Used by reporters. Each event emits the corresponding object, unless otherwise indicated. - * @example - * const Mocha = require('mocha'); - * const Base = Mocha.reporters.Base; - * const { - * EVENT_HOOK_BEGIN, - * EVENT_TEST_PASS, - * EVENT_TEST_FAIL, - * EVENT_TEST_END - * } = Mocha.Runner.constants - * - * function MyReporter(runner, options) { - * Base.call(this, runner, options); - * - * runner.on(EVENT_HOOK_BEGIN, function(hook) { - * console.log('hook called: ', hook.title); - * }); - * - * runner.on(EVENT_TEST_PASS, function(test) { - * console.log('pass: %s', test.fullTitle()); - * }); - * - * runner.on(EVENT_TEST_FAIL, function(test, err) { - * console.log('fail: %s -- error: %s', test.fullTitle(), err.message); - * }); - * - * runner.on(EVENT_TEST_END, function() { - * console.log('end: %d/%d', runner.stats.passes, runner.stats.tests); - * }); - * } - * - * module.exports = MyReporter; - * + * {@link Runner}-related constants. * @public * @memberof Runner * @readonly @@ -15443,13 +15877,7 @@ */ EVENT_TEST_END: "test end", /** - * Emitted when {@link Test} execution fails. Includes an `err` object of type `Error`. - * @example - * runner.on(EVENT_TEST_FAIL, function(test, err) { - * console.log('fail: %s -- error: %s', test.fullTitle(), err.message); - * }); - * - * + * Emitted when {@link Test} execution fails */ EVENT_TEST_FAIL: "fail", /** @@ -15519,13 +15947,13 @@ this.uncaught = this._uncaught.bind(this); this.unhandled = (reason, promise) => { if (isMochaError(reason)) { - debug( + debug3( "trapped unhandled rejection coming out of Mocha; forwarding to uncaught handler:", reason ); this.uncaught(reason); } else { - debug( + debug3( "trapped unhandled rejection from (probably) user code; re-emitting on process" ); this._removeEventListener( @@ -15544,13 +15972,13 @@ } Runner.immediately = commonjsGlobal.setImmediate || nextTick$1; Runner.prototype._addEventListener = function(target, eventName, listener) { - debug( + debug3( "_addEventListener(): adding for event %s; %d current listeners", eventName, target.listenerCount(eventName) ); if (this._eventListeners.has(target) && this._eventListeners.get(target).has(eventName) && this._eventListeners.get(target).get(eventName).has(listener)) { - debug( + debug3( "warning: tried to attach duplicate event listener for %s", eventName ); @@ -15578,7 +16006,7 @@ this._eventListeners.delete(target); } } else { - debug("trying to remove listener for untracked object %s", target); + debug3("trying to remove listener for untracked object %s", target); } }; Runner.prototype.dispose = function() { @@ -15593,7 +16021,7 @@ this._eventListeners.clear(); }; Runner.prototype.grep = function(re, invert) { - debug("grep(): setting to %s", re); + debug3("grep(): setting to %s", re); this._grep = re; this._invert = invert; this.total = this.grepTotal(this.suite); @@ -15627,7 +16055,7 @@ if (!arguments.length) { return this._globals; } - debug("globals(): setting to %O", arr); + debug3("globals(): setting to %O", arr); this._globals = this._globals.concat(arr); return this; }; @@ -15667,7 +16095,7 @@ ); } ++this.failures; - debug("total number of failures: %d", this.failures); + debug3("total number of failures: %d", this.failures); test3.state = STATE_FAILED; if (!isError(err)) { err = thrown2Error(err); @@ -15948,9 +16376,9 @@ var i = 0; var self2 = this; var total = this.grepTotal(suite2); - debug("runSuite(): running %s", suite2.fullTitle()); + debug3("runSuite(): running %s", suite2.fullTitle()); if (!total || self2.failures && suite2._bail) { - debug("runSuite(): bailing"); + debug3("runSuite(): bailing"); return fn(); } this.emit(constants$1.EVENT_SUITE_BEGIN, this.suite = suite2); @@ -16001,21 +16429,21 @@ ); } if (err instanceof Pending) { - debug("uncaught(): caught a Pending"); + debug3("uncaught(): caught a Pending"); return; } if (this.allowUncaught && !utils$1.isBrowser()) { - debug("uncaught(): bubbling exception due to --allow-uncaught"); + debug3("uncaught(): bubbling exception due to --allow-uncaught"); throw err; } if (this.state === constants$1.STATE_STOPPED) { - debug("uncaught(): throwing after run has completed!"); + debug3("uncaught(): throwing after run has completed!"); throw err; } if (err) { - debug("uncaught(): got truthy exception %O", err); + debug3("uncaught(): got truthy exception %O", err); } else { - debug("uncaught(): undefined/falsy exception"); + debug3("uncaught(): undefined/falsy exception"); err = createInvalidExceptionError( "Caught falsy/undefined exception which would otherwise be uncaught. No stack trace found; try a debugger", err @@ -16023,19 +16451,19 @@ } if (!isError(err)) { err = thrown2Error(err); - debug('uncaught(): converted "error" %o to Error', err); + debug3('uncaught(): converted "error" %o to Error', err); } err.uncaught = true; var runnable2 = this.currentRunnable; if (!runnable2) { runnable2 = new Runnable$1("Uncaught error outside test suite"); - debug("uncaught(): no current Runnable; created a phony one"); + debug3("uncaught(): no current Runnable; created a phony one"); runnable2.parent = this.suite; if (this.state === constants$1.STATE_RUNNING) { - debug("uncaught(): failing gracefully"); + debug3("uncaught(): failing gracefully"); this.fail(runnable2, err); } else { - debug("uncaught(): test run has not yet started; unrecoverable"); + debug3("uncaught(): test run has not yet started; unrecoverable"); this.emit(constants$1.EVENT_RUN_BEGIN); this.fail(runnable2, err); this.emit(constants$1.EVENT_RUN_END); @@ -16044,49 +16472,49 @@ } runnable2.clearTimeout(); if (runnable2.isFailed()) { - debug("uncaught(): Runnable has already failed"); + debug3("uncaught(): Runnable has already failed"); return; } else if (runnable2.isPending()) { - debug("uncaught(): pending Runnable wound up failing!"); + debug3("uncaught(): pending Runnable wound up failing!"); this.fail(runnable2, err, true); return; } if (runnable2.isPassed()) { - debug("uncaught(): Runnable has already passed; bailing gracefully"); + debug3("uncaught(): Runnable has already passed; bailing gracefully"); this.fail(runnable2, err); this.abort(); } else { - debug("uncaught(): forcing Runnable to complete with Error"); + debug3("uncaught(): forcing Runnable to complete with Error"); return runnable2.callback(err); } }; Runner.prototype.run = function(fn, opts = {}) { var rootSuite = this.suite; var options = opts.options || {}; - debug("run(): got options: %O", options); + debug3("run(): got options: %O", options); fn = fn || function() { }; const end = () => { if (!this.total && this._opts.failZero) this.failures = 1; - debug("run(): root suite completed; emitting %s", constants$1.EVENT_RUN_END); + debug3("run(): root suite completed; emitting %s", constants$1.EVENT_RUN_END); this.emit(constants$1.EVENT_RUN_END); }; const begin = () => { - debug("run(): emitting %s", constants$1.EVENT_RUN_BEGIN); + debug3("run(): emitting %s", constants$1.EVENT_RUN_BEGIN); this.emit(constants$1.EVENT_RUN_BEGIN); - debug("run(): emitted %s", constants$1.EVENT_RUN_BEGIN); + debug3("run(): emitted %s", constants$1.EVENT_RUN_BEGIN); this.runSuite(rootSuite, end); }; const prepare = () => { - debug("run(): starting"); + debug3("run(): starting"); if (rootSuite.hasOnly()) { rootSuite.filterOnly(); - debug("run(): filtered exclusive Runnables"); + debug3("run(): filtered exclusive Runnables"); } this.state = constants$1.STATE_RUNNING; if (this._opts.delay) { this.emit(constants$1.EVENT_DELAY_END); - debug('run(): "delay" ended'); + debug3('run(): "delay" ended'); } return begin(); }; @@ -16097,7 +16525,7 @@ } this.on(constants$1.EVENT_RUN_END, function() { this.state = constants$1.STATE_STOPPED; - debug("run(): emitted %s", constants$1.EVENT_RUN_END); + debug3("run(): emitted %s", constants$1.EVENT_RUN_END); fn(this.failures); }); this._removeEventListener(process2, "uncaughtException", this.uncaught); @@ -16107,7 +16535,7 @@ if (this._opts.delay) { this.emit(constants$1.EVENT_DELAY_BEGIN, rootSuite); rootSuite.once(EVENT_ROOT_SUITE_RUN, prepare); - debug("run(): waiting for green light due to --delay"); + debug3("run(): waiting for green light due to --delay"); } else { Runner.immediately(prepare); } @@ -16122,7 +16550,7 @@ }); }; Runner.prototype.abort = function() { - debug("abort(): aborting"); + debug3("abort(): aborting"); this._abort = true; return this; }; @@ -17411,7 +17839,7 @@ ) ); tests.forEach(function(t) { - self2.test(t, options); + self2.test(t); }); self2.write(""); }); @@ -17435,12 +17863,12 @@ Base.consoleLog(line2); } }; - XUnit.prototype.test = function(test3, options) { + XUnit.prototype.test = function(test3) { Base.useColors = false; var attrs = { classname: test3.parent.fullTitle(), name: test3.title, - file: testFilePath(test3.file, options), + file: test3.file, time: test3.duration / 1e3 || 0 }; if (test3.state === STATE_FAILED2) { @@ -17480,12 +17908,6 @@ } return tag2; } - function testFilePath(filepath, options) { - if (options && options.reporterOptions && options.reporterOptions.showRelativePaths) { - return path.relative(process2.cwd(), filepath); - } - return filepath; - } XUnit.description = "XUnit-compatible XML output"; })(xunit); var markdown = { exports: {} }; @@ -18253,7 +18675,7 @@ return this; }; var name = "mocha"; - var version = "11.2.2"; + var version = "11.1.0"; var homepage = "https://mochajs.org/"; var notifyLogo = "https://ibin.co/4QuRuGjXvl36.png"; var require$$17 = { @@ -18279,7 +18701,7 @@ createUnsupportedError: createUnsupportedError2 } = errors$2; const { EVENT_FILE_PRE_REQUIRE: EVENT_FILE_PRE_REQUIRE2, EVENT_FILE_POST_REQUIRE, EVENT_FILE_REQUIRE } = Suite2.constants; - var debug2 = browser.exports("mocha:mocha"); + var debug4 = browser.exports("mocha:mocha"); exports2 = module2.exports = Mocha2; var mochaStates = utils2.defineConstants({ /** @@ -18418,7 +18840,7 @@ this.isWorker = Boolean(options.isWorker); this.globalSetup(options.globalSetup).globalTeardown(options.globalTeardown).enableGlobalSetup(options.enableGlobalSetup).enableGlobalTeardown(options.enableGlobalTeardown); if (options.parallel && (typeof options.jobs === "undefined" || options.jobs > 1)) { - debug2("attempting to enable parallel mode"); + debug4("attempting to enable parallel mode"); this.parallelMode(true); } } @@ -18766,37 +19188,37 @@ }; Mocha2.prototype.lazyLoadFiles = function lazyLoadFiles(enable) { this._lazyLoadFiles = enable === true; - debug2("set lazy load to %s", enable); + debug4("set lazy load to %s", enable); return this; }; Mocha2.prototype.globalSetup = function globalSetup(setupFns = []) { setupFns = utils2.castArray(setupFns); this.options.globalSetup = setupFns; - debug2("configured %d global setup functions", setupFns.length); + debug4("configured %d global setup functions", setupFns.length); return this; }; Mocha2.prototype.globalTeardown = function globalTeardown(teardownFns = []) { teardownFns = utils2.castArray(teardownFns); this.options.globalTeardown = teardownFns; - debug2("configured %d global teardown functions", teardownFns.length); + debug4("configured %d global teardown functions", teardownFns.length); return this; }; Mocha2.prototype.runGlobalSetup = async function runGlobalSetup(context2 = {}) { const { globalSetup } = this.options; if (globalSetup && globalSetup.length) { - debug2("run(): global setup starting"); + debug4("run(): global setup starting"); await this._runGlobalFixtures(globalSetup, context2); - debug2("run(): global setup complete"); + debug4("run(): global setup complete"); } return context2; }; Mocha2.prototype.runGlobalTeardown = async function runGlobalTeardown(context2 = {}) { const { globalTeardown } = this.options; if (globalTeardown && globalTeardown.length) { - debug2("run(): global teardown starting"); + debug4("run(): global teardown starting"); await this._runGlobalFixtures(globalTeardown, context2); } - debug2("run(): global teardown complete"); + debug4("run(): global teardown complete"); return context2; }; Mocha2.prototype._runGlobalFixtures = async function _runGlobalFixtures(fixtureFns = [], context2 = {}) { @@ -19003,6 +19425,7 @@ // typescripts/modules/photoshop-internal/src/entry.mts var entry_exports2 = {}; __export(entry_exports2, { + Auths: () => Auths, Promote: () => Promote, SDPPP: () => SDPPP, SDPPPProvider: () => SDPPPProvider, @@ -20265,9 +20688,26 @@ requestAnimationFrame(checkCurrentDocument); setInterval(() => fetchDocuments(), 5e3); + // typescripts/modules/photoshop-internal/src/log.ts + init_sdpppX(); + var import_debug = __toESM(require_browser(), 1); + var logs = []; + sdpppX.getLogs = () => { + return logs; + }; + localStorage.setItem("debug", "sdppp:*"); + import_debug.debug.log = (...args) => { + logs.push(args.join(" ")); + }; + // typescripts/modules/photoshop-internal/test/entry.mts var import_photoshop12 = __require("photoshop"); init_sdpppX(); + var originalLog = sdpppX.log; + sdpppX.log = (...args) => { + originalLog(...args); + console.log(...args); + }; globalThis.sdppp_debugPhotoshopStore = photoshopStore; globalThis.sdppp_debugPhotoshopPageStoreMap = photoshopPageStoreMap; globalThis.sdppp_app = import_photoshop12.app; @@ -20964,27 +21404,10 @@ _layer.selected = false; }); layer.selected = true; - }, { - commandName: i18n("select layer"), - document: import_photoshop17.app.activeDocument - }); - await runNextModalState(async () => { - await import_photoshop17.action.batchPlay([ - { - "_obj": "select", - "_target": [{ - "_name": layer.name, - "_ref": "layer" - }], - "layerID": [layer.id], - "makeVisible": false - } - ], { - synchronousExecution: true - }); await actionForPlay.play(); }, { commandName: i18n("run Photoshop Action"), + dontRecoverSelection: true, document: import_photoshop17.app.activeDocument }); return { @@ -21001,6 +21424,7 @@ init_modalStateWrapper(); init_util(); init_sdpppX(); + init_identify(); async function getPreviewDocumentOrCreate(width, height) { const document2 = import_photoshop18.app.documents.find((document3) => document3.name == SpeicialIDManager.getSpecialDocumentForPreview()); if (document2) { @@ -21124,9 +21548,10 @@ ); })); const newLayers = []; + let finalLayerOrGroups = []; await runNextModalState(async (restorer) => { let targetLayerOrGroup = null; - const layerOrGroups = await Promise.all( + finalLayerOrGroups = await Promise.all( jimps.map(async (imageId, index) => { const layerIdentify = layerIdentifies.length == 1 ? layerIdentifies[0] : layerIdentifies[index]; if (!SpeicialIDManager.is_SPECIAL_LAYER_NEW_LAYER(layerIdentify)) { @@ -21163,7 +21588,7 @@ }); } await Promise.all( - layerOrGroups.map(async (layer, index) => { + finalLayerOrGroups.map(async (layer, index) => { await import_photoshop18.imaging.putPixels({ documentID: document2.id, layerID: layer.id, @@ -21173,13 +21598,21 @@ }); }) ); - notifyLayerChange(layerOrGroups.map((layer) => layer.id)); + notifyLayerChange(finalLayerOrGroups.map((layer) => layer.id)); notifyCanvasChange(); }, { commandName: i18n("show sent images"), document: document2 }); - return {}; + const documentStore = usePhotoshopDocumentStore.getState(); + return { + layers: finalLayerOrGroups.map((layer) => { + return { + identify: makeLayerIdentify(layer.id, layer.name), + dirtyID: documentStore.layerDirtyIDs.get(layer.id) || 0 + }; + }) + }; } // typescripts/modules/photoshop-internal/src/logics/socket/events/send_text_to_layer.mts @@ -21534,7 +21967,9 @@ }; // typescripts/modules/photoshop-internal/src/contexts/sdppp-internal.tsx + var import_debug2 = __toESM(require_browser(), 1); var import_jsx_runtime2 = __toESM(require_jsx_runtime(), 1); + var log = (0, import_debug2.debug)("sdppp:internal"); var DEFAULT_BACKEND_URL = "http://127.0.0.1:8188"; var SDPPPInternalContext = (0, import_react3.createContext)(null); function SDPPPInternalContextProvider({ children }) { @@ -21561,7 +21996,9 @@ if (connectState === "connected") { setLastErrorMessage(""); setSrc(`${backendURL}`); - photoshopStore.setIsLocal(!!(backendURL.includes("localhost") || backendURL.match(/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/))); + const isLocal = !!(backendURL.includes("localhost") || backendURL.match(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/)); + log("setBackendURL:", backendURL, "src:", isLocal); + photoshopStore.setIsLocal(true); } else { setSrc(""); setWorkflowAgentSID(""); @@ -23970,7 +24407,7 @@ function SDPPPExternalProvider({ children }) { const webviewContext = useSDPPPWebview(); const internalContext = useSDPPPInternalContext(); - const { logout } = useSDPPPLoginContext(); + const { logout, isLogin } = useSDPPPLoginContext(); if (sdpppX.registerTestCase) { globalThis.sdppp_debugPhotoshopInternalContext = internalContext; globalThis.sdppp_debugPhotoshopWebviewContext = webviewContext; @@ -24001,6 +24438,7 @@ }, [setShouldTriggerLivePainting]); return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SDPPPExternalContext.Provider, { value: { logout, + isLogin, connectOrDisconnect: doConnectOrDisconnect, lastConnectErrorMessage: lastErrorMessage, setAutoRunning, @@ -24336,7 +24774,7 @@ GITEE: "https://gitee.com/zombieyang/sd-ppp/raw/main/sponsors.json", GITHUB: "https://raw.githubusercontent.com/zombieyang/sd-ppp/refs/heads/main/sponsors.json" }; - var TIMEOUT_MS = 15e3; + var TIMEOUT_MS = 5e3; function getDataFromLocalStorage() { try { const storedData = localStorage.getItem(STORAGE_KEY); @@ -24432,6 +24870,7 @@ } var sponsorDataPromise = null; function useSponsor() { + const [isLoading, setIsLoading] = import_react13.default.useState(true); if (!sponsorDataPromise) { const cachedData = getDataFromLocalStorage(); sponsorDataPromise = new Promise((resolve) => { @@ -24441,6 +24880,7 @@ resolved = true; saveDataToLocalStorage(data2); resolve(data2); + setIsLoading(false); } }); fetchSponsorData(DATA_SOURCES.GITHUB).then((data2) => { @@ -24448,6 +24888,7 @@ resolved = true; saveDataToLocalStorage(data2); resolve(data2); + setIsLoading(false); } }); setTimeout(() => { @@ -24455,9 +24896,11 @@ resolved = true; if (cachedData && validateSponsorData(cachedData)) { resolve(cachedData); + setIsLoading(false); } else { console.warn("Using default data as fallback"); resolve(DEFAULT_DATA); + setIsLoading(false); } } }, TIMEOUT_MS); @@ -24478,56 +24921,20 @@ }); } }, []); - return { data }; + let [retIsLoading, setRetIsLoading] = (0, import_react13.useState)(true); + (0, import_react13.useEffect)(() => { + if (retIsLoading && !isLoading) { + setRetIsLoading(isLoading); + } + }, [isLoading]); + return { data, isLoading: retIsLoading }; } // typescripts/modules/photoshop-internal/src/tsx/About.tsx var import_jsx_runtime7 = __toESM(require_jsx_runtime(), 1); - var aboutComponentShowTimeSum = 0; - var lastStartTime = 0; function About() { - const persistentDivRef = (0, import_react14.useRef)(null); const { loginStyle } = useSDPPPLoginContext(); const { data: sponsorData } = useSponsor(); - (0, import_react14.useEffect)(() => { - let detectedMinHeight = Infinity; - let detectedMinWidth = Infinity; - let ended = false; - if (persistentDivRef.current) { - let start2 = function(event) { - if (!lastStartTime) { - lastStartTime = Date.now(); - } - }; - var start = start2; - const webview = document.createElement("webview"); - webview.addEventListener("loadstart", start2); - webview.addEventListener("loadstop", start2); - webview.addEventListener("loaderror", start2); - webview.setAttribute("src", "./_.html"); - webview.style.width = "1px"; - webview.style.height = "1px"; - persistentDivRef.current.appendChild(webview); - } - function minHeightWidthDetection() { - const boundingRect = persistentDivRef.current?.parentElement?.parentElement?.getBoundingClientRect(); - if (boundingRect?.height && boundingRect?.width) { - detectedMinHeight = Math.min(detectedMinHeight, boundingRect.height); - detectedMinWidth = Math.min(detectedMinWidth, boundingRect.width); - } - if (!ended) { - requestAnimationFrame(minHeightWidthDetection); - } - } - requestAnimationFrame(minHeightWidthDetection); - return () => { - ended = true; - if (lastStartTime) { - aboutComponentShowTimeSum += Date.now() - lastStartTime; - lastStartTime = 0; - } - }; - }, [persistentDivRef]); const community = (0, import_react14.useMemo)( () => sponsorData.community[getI18nLocale() == "zhcn" ? "zhcn" : "en"], [sponsorData] @@ -24555,17 +24962,7 @@ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "about-card-sections about-card-title", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("h6", { children: i18n("And follows its open source license:") }) }), /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "about-card-sections about-card-title", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("a", { href: "https://github.com/zombieyang/sd-ppp/blob/main/LICENSE", children: "LICENSE: BSD3-Clause" }) }) ] }), - /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "about-card-sections about-card-links", children: [ - community.map((item) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("a", { href: item.url, children: item.name }, item.name)), - /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: { - width: 1, - height: 1, - position: "absolute", - right: 0, - bottom: 0, - opacity: 0.1 - }, ref: persistentDivRef, className: "persistent-div" }) - ] }), + /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "about-card-sections about-card-links", children: community.map((item) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("a", { href: item.url, children: item.name }, item.name)) }), /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("sp-divider", {}), sponsorData.site && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("h1", { children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("a", { href: sponsorData.site[getI18nLocale() == "zhcn" ? "zhcn" : "en"].url, children: sponsorData.site[getI18nLocale() == "zhcn" ? "zhcn" : "en"].name }) }) ] }); @@ -25805,7 +26202,7 @@ ] }); } - // typescripts/modules/photoshop-internal/src/tsx/Promote.tsx + // typescripts/modules/photoshop-internal/src/tsx/Auths.tsx var import_react28 = __toESM(require_react(), 1); // typescripts/modules/photoshop-internal/src/tsx/ComfyMultiUserLogin.tsx @@ -25855,50 +26252,72 @@ }, children: i18n("--multi-user activated, Not Login!") }) }); } - // typescripts/modules/photoshop-internal/src/tsx/Promote.tsx - var import_uxp5 = __require("uxp"); - init_i18n(); + // typescripts/modules/photoshop-internal/src/tsx/Auths.tsx var import_jsx_runtime24 = __toESM(require_jsx_runtime(), 1); - function Promote() { + function Auths() { const { state: photoshopStoreData } = useStore2(photoshopStore, ["/uname", "/comfyUser"]); const internalContext = useSDPPPInternalContext(); const { toggleWebviewDialog } = useSDPPPWebview(); const onRequestLogin = (0, import_react28.useCallback)(() => { toggleWebviewDialog(); }, [toggleWebviewDialog]); - return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "promote-bar", children: [ - /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(CloudPromote, {}), - /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "identifier-bar", children: [ - /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "identifier-bar-left", children: /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("sp-label", { children: [ - "(Photoshop ID: ", - photoshopStoreData?.uname, - ")" - ] }) }), - internalContext.comfyMultiUser && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(ComfyMultiUserLogin, { onRequestLogin }) - ] }) - ] }); + return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "auths-bar", children: /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "identifier-bar", children: [ + /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "identifier-bar-left", children: /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("sp-label", { children: [ + "(Photoshop ID: ", + photoshopStoreData?.uname, + ")" + ] }) }), + internalContext.comfyMultiUser && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(ComfyMultiUserLogin, { onRequestLogin }) + ] }) }); } - function CloudPromote() { - const { data: sponsorData } = useSponsor(); + + // typescripts/modules/photoshop-internal/src/tsx/Promote.tsx + init_i18n(); + var import_react29 = __toESM(require_react(), 1); + var import_react30 = __toESM(require_react(), 1); + var import_uxp5 = __require("uxp"); + var import_jsx_runtime25 = __toESM(require_jsx_runtime(), 1); + function Promote() { + const color = document.getElementById("color_computer")?.style.color || "#777"; + const { data: sponsorData, isLoading } = useSponsor(); + const webviewRef = (0, import_react29.useRef)(null); + const [loadedError, setLoadedError] = (0, import_react29.useState)(false); + const [inited, setInited] = (0, import_react29.useState)(false); + (0, import_react30.useEffect)(() => { + if (!webviewRef.current) return; + if (isLoading) return; + if (inited) return; + setInited(true); + webviewRef.current.addEventListener("loadstop", (event) => { + event.target.postMessage({ + action: "init", + payload: { + color, + cloud + } + }); + }); + webviewRef.current.addEventListener("loaderror", (event) => { + setLoadedError(true); + }); + webviewRef.current.addEventListener("message", (event) => { + const message = event.message; + if (!message) return; + const data = JSON.parse(message); + if (data.action === "open") { + import_uxp5.shell.openExternal(data.payload.url); + } + }); + }, [webviewRef, isLoading]); + if (isLoading || loadedError) { + return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { style: { height: "8px" } }); + } + const src = "./promote.html?color=" + color; const cloud = sponsorData.cloud[getI18nLocale() == "zhcn" ? "zhcn" : "en"]; - if (!cloud || cloud.length == 0) return null; - return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "cloud-promote-bar", children: [ - /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: "cloud-promote-bar-left", children: i18n("Cloud") }), - /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: "cloud-promote-bar-right", children: cloud.map((item) => /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)( - "span", - { - style: { borderColor: item.color }, - onClick: () => { - import_uxp5.shell.openExternal(item.url); - }, - children: [ - /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("img", { src: item.icon }), - item.name - ] - }, - item.name - )) }) - ] }); + if (!cloud.length) { + return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { style: { height: "8px" } }); + } + return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("webview", { ref: webviewRef, className: "promote-webview", style: { width: "100%", height: "24px" }, src }); } // typescripts/modules/photoshop-internal/src/global.mts diff --git a/plugins/photoshop/manifest.json b/plugins/photoshop/manifest.json index 9476263..b1f2ba5 100644 --- a/plugins/photoshop/manifest.json +++ b/plugins/photoshop/manifest.json @@ -1,7 +1,7 @@ { "id": "sd-ppp", "name": "SD-PPP", - "version": "1.8.1", + "version": "1.8.2", "main": "index.html", "manifestVersion": 5, "host": { @@ -38,7 +38,7 @@ "type": "panel", "id": "sdppp-connect", "label": { - "default": "SD-PPP 1.8.1" + "default": "SD-PPP 1.8.2" }, "minimumSize": { "width": 300, diff --git a/pyproject.toml b/pyproject.toml index 8b726b1..3e833d6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "sd-ppp" description = "getting/sending picture from/to Photoshop with a simple connection. Make Photoshop become the workspace of your ComfyUI." -version = "1.8.1" +version = "1.8.2" license = { file = "LICENSE" } [project.urls] diff --git a/static/sd-ppp_PS.ccx b/static/sd-ppp_PS.ccx index 2a2ef26..9efc162 100644 Binary files a/static/sd-ppp_PS.ccx and b/static/sd-ppp_PS.ccx differ